diff --git a/.bazelproject b/.bazelproject
index e3a7a9c..8a726eb 100644
--- a/.bazelproject
+++ b/.bazelproject
@@ -4,6 +4,7 @@
 
 directories:
   .
+  -bin
   -eclipse-out
   -contrib
   -gerrit-package-plugins
diff --git a/.gitignore b/.gitignore
index 3f8388f..319b3cf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,4 @@
 # Keep following lines sorted according to `LC_COLLATE=C sort`
-*.asc
 *.eml
 *.iml
 *.pyc
@@ -22,7 +21,6 @@
 /.settings/org.maven.ide.eclipse.prefs
 /bazel-*
 /bin/
-/buck-out
 /eclipse-out
 /extras
 /gerrit-package-plugins
@@ -32,4 +30,5 @@
 /plugins/cookbook-plugin/
 /test_site
 /tools/format
+/.vscode
 /.ijwb
diff --git a/.gitmodules b/.gitmodules
index ec8afee..8d75bcc 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +1,8 @@
+[submodule "plugins/codemirror-editor"]
+	path = plugins/codemirror-editor
+	url = ../plugins/codemirror-editor
+	branch = .
+
 [submodule "plugins/commit-message-length-validator"]
 	path = plugins/commit-message-length-validator
 	url = ../plugins/commit-message-length-validator
diff --git a/.mailmap b/.mailmap
index 42b713c..b5c119c 100644
--- a/.mailmap
+++ b/.mailmap
@@ -6,12 +6,15 @@
 Alex Ryazantsev <alex.ryazantsev@gmail.com>                                                 alex.ryazantsev <alex.ryazantsev@gmail.com>
 Andrew Bonventre <andybons@chromium.org>                                                    <andybons@google.com>
 Becky Siegel <beckysiegel@google.com>                                                       beckysiegel <beckysiegel@google.com>
+Ben Rohlfs <brohlfs@google.com>                                                             brohlfs <brohlfs@google.com>
 Brad Larson <bklarson@gmail.com>                                                            <brad.larson@garmin.com>
 Bruce Zu <bruce.zu.run10@gmail.com>                                                         <bruce.zu@sonyericsson.com>
 Bruce Zu <bruce.zu.run10@gmail.com>                                                         <bruce.zu@sonymobile.com>
 Carlos Eduardo Baldacin <carloseduardo.baldacin@sonyericsson.com>                           carloseduardo.baldacin <carloseduardo.baldacin@sonyericsson.com>
+Changcheng Xiao <xchangcheng@google.com>                                                    xchangcheng
 Dariusz Luksza <dluksza@collab.net>                                                         <dariusz@luksza.org>
 Darrien Glasser <darrien@arista.com>                                                        darrien <darrien@arista.com>
+Dave Borowitz <dborowitz@google.com>                                                        <dborowitz@google.com>
 David Ostrovsky <david@ostrovsky.org>                                                       <d.ostrovsky@gmx.de>
 David Ostrovsky <david@ostrovsky.org>                                                       <david.ostrovsky@gmail.com>
 David Pursehouse <dpursehouse@collab.net>                                                   <david.pursehouse@sonymobile.com>
@@ -36,6 +39,7 @@
 Joel Dodge <dodgejoel@gmail.com>                                                            dodgejoel <dodgejoel@gmail.com>
 Johan Björk <jbjoerk@gmail.com>                                                             Johan Bjork <phb@spotify.com>
 JT Olds <hello@jtolds.com>                                                                  <jtolds@gmail.com>
+Kasper Nilsson <kaspern@google.com>                                                         <kaspern@google.com>
 Lawrence Dubé <ldube@audiokinetic.com>                                                      <ldube@audiokinetic.com>
 Lei Sun <lei.sun01@sap.com>                                                                 LeiSun <lei.sun01@sap.com>
 Lincoln Oliveira Campos Do Nascimento <lincoln.oliveiracamposdonascimento@sonyericsson.com> lincoln <lincoln.oliveiracamposdonascimento@sonyericsson.com>
@@ -45,6 +49,7 @@
 Mark Derricutt <mark.derricutt@smxemail.com>                                                <mark@talios.com>
 Martin Fick <mfick@codeaurora.org>                                                          <mogulguy10@gmail.com>
 Martin Fick <mfick@codeaurora.org>                                                          <mogulguy@yahoo.com>
+Maxime Guerreiro <maximeg@google.com>                                                       <maximeg@google.com>
 Michael Zhou <moz@google.com>                                                               <zhoumotongxue008@gmail.com>
 Mônica Dionísio <monica.dionisio@sonyericsson.com>                                          monica.dionisio <monica.dionisio@sonyericsson.com>
 Nasser Grainawi <nasser@grainawi.org>                                                       <nasser@codeaurora.org>
diff --git a/0001-Replace-native-http-git-_archive-with-Skylark-rules.patch b/0001-Replace-native-http-git-_archive-with-Skylark-rules.patch
deleted file mode 100644
index 3ccf5cd..0000000
--- a/0001-Replace-native-http-git-_archive-with-Skylark-rules.patch
+++ /dev/null
@@ -1,133 +0,0 @@
-Date: Wed, 30 May 2018 21:22:18 +0200
-Subject: [PATCH] Replace native {http,git}_archive with Skylark rules
-
-See [1] for more details.
-
-Test Plan:
-
-* Apply this CL on Bazel master: [2] and build bazel
-* Run with this custom built bazel version:
-
-  $ bazel test //javatests/...
-  $ bazel test //closure/...
-
-[1] https://groups.google.com/d/topic/bazel-discuss/dO2MHQLwJF0/discussion
-[2] https://bazel-review.googlesource.com/#/c/bazel/+/55932/
----
- closure/repositories.bzl | 23 ++++++++++++-----------
- 1 file changed, 12 insertions(+), 11 deletions(-)
-
-diff --git a/closure/repositories.bzl b/closure/repositories.bzl
-index 9b84a72..2816fb6 100644
---- closure/repositories.bzl
-+++ closure/repositories.bzl
-@@ -14,6 +14,7 @@
- 
- """External dependencies for Closure Rules."""
- 
-+load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive", "http_file")
- load("//closure/private:java_import_external.bzl", "java_import_external")
- load("//closure/private:platform_http_file.bzl", "platform_http_file")
- load("//closure:filegroup_external.bzl", "filegroup_external")
-@@ -405,7 +406,7 @@ def com_google_common_html_types():
-   )
- 
- def com_google_common_html_types_html_proto():
--  native.http_file(
-+  http_file(
-       name = "com_google_common_html_types_html_proto",
-       sha256 = "6ece202f11574e37d0c31d9cf2e9e11a0dbc9218766d50d211059ebd495b49c3",
-       urls = [
-@@ -633,7 +634,7 @@ def com_google_javascript_closure_compiler():
- 
- def com_google_javascript_closure_library():
-   # After updating: bazel run //closure/library:regenerate -- "$PWD"
--  native.new_http_archive(
-+  http_archive(
-       name = "com_google_javascript_closure_library",
-       urls = [
-           "https://mirror.bazel.build/github.com/google/closure-library/archive/v20180405.tar.gz",
-@@ -658,7 +659,7 @@ def com_google_jsinterop_annotations():
- 
- def com_google_protobuf():
-   # Note: Protobuf 3.6.0+ is going to use C++11
--  native.http_archive(
-+  http_archive(
-       name = "com_google_protobuf",
-       strip_prefix = "protobuf-3.5.1",
-       sha256 = "826425182ee43990731217b917c5c3ea7190cfda141af4869e6d4ad9085a740f",
-@@ -669,7 +670,7 @@ def com_google_protobuf():
-   )
- 
- def com_google_protobuf_js():
--  native.new_http_archive(
-+  http_archive(
-       name = "com_google_protobuf_js",
-       urls = [
-           "https://mirror.bazel.build/github.com/google/protobuf/archive/v3.5.1.tar.gz",
-@@ -722,7 +723,7 @@ def com_google_template_soy():
-   )
- 
- def com_google_template_soy_jssrc():
--  native.new_http_archive(
-+  http_archive(
-       name = "com_google_template_soy_jssrc",
-       sha256 = "c76ab4cb6e46a7c76336640b3c40d6897b420209a6c0905cdcd32533dda8126a",
-       urls = [
-@@ -757,7 +758,7 @@ def com_squareup_javapoet():
-   )
- 
- def fonts_noto_hinted_deb():
--  native.http_file(
-+  http_file(
-       name = "fonts_noto_hinted_deb",
-       urls = [
-           "https://mirror.bazel.build/http.us.debian.org/debian/pool/main/f/fonts-noto/fonts-noto-hinted_20161116-1_all.deb",
-@@ -767,7 +768,7 @@ def fonts_noto_hinted_deb():
-   )
- 
- def fonts_noto_mono_deb():
--  native.http_file(
-+  http_file(
-       name = "fonts_noto_mono_deb",
-       urls = [
-           "https://mirror.bazel.build/http.us.debian.org/debian/pool/main/f/fonts-noto/fonts-noto-mono_20161116-1_all.deb",
-@@ -801,7 +802,7 @@ def javax_inject():
-   )
- 
- def libexpat_amd64_deb():
--  native.http_file(
-+  http_file(
-       name = "libexpat_amd64_deb",
-       urls = [
-           "https://mirror.bazel.build/http.us.debian.org/debian/pool/main/e/expat/libexpat1_2.1.0-6+deb8u3_amd64.deb",
-@@ -811,7 +812,7 @@ def libexpat_amd64_deb():
-   )
- 
- def libfontconfig_amd64_deb():
--  native.http_file(
-+  http_file(
-       name = "libfontconfig_amd64_deb",
-       urls = [
-           "https://mirror.bazel.build/http.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1_2.11.0-6.3+deb8u1_amd64.deb",
-@@ -821,7 +822,7 @@ def libfontconfig_amd64_deb():
-   )
- 
- def libfreetype_amd64_deb():
--  native.http_file(
-+  http_file(
-       name = "libfreetype_amd64_deb",
-       urls = [
-           "https://mirror.bazel.build/http.us.debian.org/debian/pool/main/f/freetype/libfreetype6_2.5.2-3+deb8u1_amd64.deb",
-@@ -831,7 +832,7 @@ def libfreetype_amd64_deb():
-   )
- 
- def libpng_amd64_deb():
--  native.http_file(
-+  http_file(
-       name = "libpng_amd64_deb",
-       urls = [
-           "https://mirror.bazel.build/http.us.debian.org/debian/pool/main/libp/libpng/libpng12-0_1.2.50-2+deb8u2_amd64.deb",
--- 
-2.16.3
-
diff --git a/BUILD b/BUILD
index fee80fc..cedc077 100644
--- a/BUILD
+++ b/BUILD
@@ -1,6 +1,54 @@
+load(
+    "@bazel_tools//tools/jdk:default_java_toolchain.bzl",
+    "default_java_toolchain",
+)
 load("//tools/bzl:genrule2.bzl", "genrule2")
 load("//tools/bzl:pkg_war.bzl", "pkg_war")
 
+config_setting(
+    name = "java9",
+    values = {
+        "java_toolchain": "@bazel_tools//tools/jdk:toolchain_java9",
+    },
+)
+
+config_setting(
+    name = "java10",
+    values = {
+        "java_toolchain": ":toolchain_vanilla",
+    },
+)
+
+# TODO(davido): Switch to consuming it from @bazel_tool//tools/jdk:absolute_javabase
+# when new Bazel version is released with this change included:
+# https://github.com/bazelbuild/bazel/issues/6012
+# https://github.com/bazelbuild/bazel/commit/0173bdbf7bdd1874379d4dd3eb70d5321e0f1816
+# As the interim use a hack that works around it by putting the variable reference
+# behind a select
+config_setting(
+    name = "use_absolute_javabase",
+    values = {"define": "USE_ABSOLUTE_JAVABASE=true"},
+)
+
+java_runtime(
+    name = "absolute_javabase",
+    java_home = select({
+        "//conditions:default": "",
+        ":use_absolute_javabase": "$(ABSOLUTE_JAVABASE)",
+    }),
+    visibility = ["//visibility:public"],
+)
+
+# TODO(davido): Switch to consuming it from @bazel_tool//tools/jdk:toolchain_vanilla
+# when my change is included in released Bazel version:
+# https://github.com/bazelbuild/bazel/commit/0bef68e054eccecd690e5d9f46db8a0c4b2d887a
+default_java_toolchain(
+    name = "toolchain_vanilla",
+    forcibly_disable_header_compilation = True,
+    javabuilder = ["@bazel_tools//tools/jdk:VanillaJavaBuilder_deploy.jar"],
+    jvm_opts = [],
+)
+
 package(default_visibility = ["//visibility:public"])
 
 genrule(
@@ -18,7 +66,10 @@
     cmd = "cp $< $@",
 )
 
-pkg_war(name = "gerrit")
+pkg_war(
+    name = "gerrit",
+    ui = "polygerrit",
+)
 
 pkg_war(
     name = "headless",
@@ -43,15 +94,15 @@
 )
 
 API_DEPS = [
-    "//gerrit-acceptance-framework:acceptance-framework_deploy.jar",
-    "//gerrit-acceptance-framework:liblib-src.jar",
-    "//gerrit-acceptance-framework:acceptance-framework-javadoc",
-    "//gerrit-extension-api:extension-api_deploy.jar",
-    "//gerrit-extension-api:libapi-src.jar",
-    "//gerrit-extension-api:extension-api-javadoc",
-    "//gerrit-plugin-api:plugin-api_deploy.jar",
-    "//gerrit-plugin-api:plugin-api-sources_deploy.jar",
-    "//gerrit-plugin-api:plugin-api-javadoc",
+    "//java/com/google/gerrit/acceptance:framework_deploy.jar",
+    "//java/com/google/gerrit/acceptance:libframework-lib-src.jar",
+    "//java/com/google/gerrit/acceptance:framework-javadoc",
+    "//java/com/google/gerrit/extensions:extension-api_deploy.jar",
+    "//java/com/google/gerrit/extensions:libapi-src.jar",
+    "//java/com/google/gerrit/extensions:extension-api-javadoc",
+    "//plugins:plugin-api_deploy.jar",
+    "//plugins:plugin-api-sources_deploy.jar",
+    "//plugins:plugin-api-javadoc",
     "//gerrit-plugin-gwtui:gwtui-api_deploy.jar",
     "//gerrit-plugin-gwtui:gwtui-api-source_deploy.jar",
     "//gerrit-plugin-gwtui:gwtui-api-javadoc",
@@ -59,7 +110,7 @@
 
 genrule2(
     name = "api",
-    testonly = 1,
+    testonly = True,
     srcs = API_DEPS,
     outs = ["api.zip"],
     cmd = " && ".join([
diff --git a/Documentation/BUILD b/Documentation/BUILD
index edb7e2e..79b9e51 100644
--- a/Documentation/BUILD
+++ b/Documentation/BUILD
@@ -17,14 +17,14 @@
 
 genrule(
     name = "prettify_min_css",
-    srcs = ["//gerrit-prettify:src/main/resources/com/google/gerrit/prettify/client/prettify.css"],
+    srcs = ["//resources/com/google/gerrit/prettify:client/prettify.css"],
     outs = ["prettify.min.css"],
     cmd = "cp $< $@",
 )
 
 genrule(
     name = "prettify_min_js",
-    srcs = ["//gerrit-prettify:src/main/resources/com/google/gerrit/prettify/client/prettify.js"],
+    srcs = ["//resources/com/google/gerrit/prettify:client/prettify.js"],
     outs = ["prettify.min.js"],
     cmd = "cp $< $@",
 )
@@ -44,9 +44,9 @@
     name = "licenses",
     opts = ["--asciidoctor"],
     targets = [
-        "//gerrit-pgm:pgm",
         "//gerrit-gwtui:ui_module",
         "//polygerrit-ui/app:polygerrit_ui",
+        "//java/com/google/gerrit/pgm",
     ],
 )
 
@@ -66,13 +66,13 @@
     name = "index",
     srcs = SRCS,
     outs = ["index.jar"],
-    cmd = "$(location //lib/asciidoctor:doc_indexer) " +
+    cmd = "$(location //java/com/google/gerrit/asciidoctor:doc_indexer) " +
           "-o $(OUTS) " +
           "--prefix \"%s/\" " % DOC_DIR +
           "--in-ext \".txt\" " +
           "--out-ext \".html\" " +
           "$(SRCS)",
-    tools = ["//lib/asciidoctor:doc_indexer"],
+    tools = ["//java/com/google/gerrit/asciidoctor:doc_indexer"],
 )
 
 # For the same srcs, we can have multiple genasciidoc_zip rules, but only one
diff --git a/Documentation/access-control.txt b/Documentation/access-control.txt
index 67a4c13..370a891 100644
--- a/Documentation/access-control.txt
+++ b/Documentation/access-control.txt
@@ -1310,7 +1310,8 @@
 
 Allow to link:cmd-set-account.html[modify accounts over the ssh prompt].
 This capability allows the granted group members to modify any user account
-setting.
+setting. In addition this capability is required to view secondary emails
+of other accounts.
 
 [[capability_priority]]
 === Priority
@@ -1352,7 +1353,14 @@
 any of their groups is used.
 
 This limit applies not only to the link:cmd-query.html[`gerrit query`]
-command, but also to the web UI results pagination size.
+command, but also to the web UI results pagination size in the new
+PolyGerrit UI and, limited to the full project list, in the old GWT UI.
+
+
+[[capability_readAs]]
+=== Read As
+
+Allow users to impersonate any user to see which refs they can read.
 
 
 [[capability_runAs]]
@@ -1390,6 +1398,13 @@
 link:cmd-stream-events.html[stream Gerrit events via ssh].
 
 
+[[capability_viewAccess]]
+=== View Access
+
+Allow checking access rights for arbitrary (user, project) pairs,
+using the link:rest-api-projects.html#check-access[check.access]
+endpoint
+
 [[capability_viewAllAccounts]]
 === View All Accounts
 
@@ -1397,6 +1412,10 @@
 of link:config-gerrit.html#accounts.visibility[accounts.visibility]
 setting.
 
+This capability allows to view all accounts but not all account data.
+E.g. secondary emails of all accounts can only be viewed with the
+link:#capability_modifyAccount[Modify Account] capability.
+
 
 [[capability_viewCaches]]
 === View Caches
@@ -1428,6 +1447,183 @@
 link:cmd-show-queue.html[look at the Gerrit task queue via ssh].
 
 
+[[reference]]
+== Permission evaluation reference
+
+Permission evaluation is expressed in the following concepts:
+
+* PermisssionRule: a single combination of {ALLOW, DENY, BLOCK} and
+group, and optionally a vote range and an 'exclusive' bit.
+
+* Permission: groups PermissionRule by permission name. All
+PermissionRules for same access type (eg. "read", "push") are grouped
+into a Permission implicitly. The exclusive bit lives here.
+
+* AccessSection: ties a list of Permissions to a single ref pattern.
+Each AccessSection comes from a single project.
+
+
+
+Here is how these play out in a link:config-project-config.html[project.config] file:
+
+----
+  # An AccessSection
+  [access "refs/heads/stable/*"]
+     exclusiveGroupPermissions = create
+
+     # Each of the following lines corresponds to a PermissionRule
+     # The next two PermissionRule together form the "read" Permission
+     read = group Administrators
+     read = group Registered Users
+
+     # A Permission with a block and block-override
+     create = block group Registered Users
+     create = group Project Owners
+
+     # A Permission and PermissionRule for a label
+     label-Code-Review = -2..+2 group Project Owners
+----
+
+=== Ref permissions
+
+Access to refs can be blocked, allowed or denied.
+
+==== BLOCK
+
+For blocking access, all rules marked BLOCK are tested, and if one
+such rule matches, the user is denied access.
+
+The rules are ordered by inheritance, starting from All-Projects down.
+Within a project, more specific ref patterns come first. The downward
+ordering lets administrators enforce access rules across all projects
+in a site.
+
+BLOCK rules can have exceptions defined on the same project (eg. BLOCK
+anonymous users, ie. everyone, but make an exception for Admin users),
+either by:
+
+1. adding ALLOW PermissionRules in the same Permission. This implies
+they apply to the same ref pattern.
+
+2. adding an ALLOW Permission in the same project with a more specific
+ref pattern, but marked "exclusive". This allows them to apply to
+different ref patterns.
+
+Such additions not only bypass BLOCK rules, but they will also grant
+permissions when they are processed in the ALLOW/DENY processing, as
+described in the next subsection.
+
+==== ALLOW
+
+For allowing access, all ALLOW/DENY rules that might apply to a ref
+are tested until one granting access is found, or until either an
+"exclusive" rule ends the search, or all rules have been tested.
+
+The rules are ordered from specific ref patterns to general patterns,
+and for equally specific patterns, from originating project up to
+All-Projects.
+
+This ordering lets project owners apply permissions specific to their
+project, overwriting the site defaults specified in All-Projects.
+
+==== DENY
+
+DENY is processed together with ALLOW.
+
+As said, during ALLOW/DENY processing, rules are tried out one by one.
+For each (permission, ref-pattern, group) only a single rule
+ALLOW/DENY rule is picked. If that first rule is a DENY rule, any
+following ALLOW rules for the same (permission, ref-pattern, group)
+will be ignored, canceling out their effect.
+
+DENY is confusing because it only works on a specific (ref-pattern,
+group) pair. The parent project can undo the effect of a DENY rule by
+introducing an extra rule which features a more general ref pattern or
+a different group.
+
+==== DENY/ALLOW example
+
+Consider the ref "refs/a" and the following configuration:
+----
+
+child-project: project.config
+    [access "refs/a"]
+      read = deny group A
+
+All-Projects: project.config
+    [access "refs/a"]
+      read = group A      # ALLOW
+    [access "refs/*"]
+      read = group B      # ALLOW
+----
+
+When determining access, first "read = DENY group A" on "refs/a" is
+encountered. The following rule to consider is "ALLOW read group A" on
+"refs/a". The latter rule applies to the same (permission,
+ref-pattern, group) tuple, so it it is ignored.
+
+The DENY rule does not affect the last rule for "refs/*", since that
+has a different ref pattern and a different group. If group B is a
+superset of group A, the last rule will still grant group A access to
+"refs/a".
+
+
+==== Double use of exclusive
+
+An 'exclusive' permission is evaluated both during BLOCK processing
+and during ALLOW/DENY: when looking BLOCK, 'exclusive' stops the
+search downward, while the same permission in the ALLOW/DENY
+processing will stop looking upward for further rule matches
+
+==== Force permission
+
+The 'force' setting may be set on ALLOW and BLOCK rules. In the case
+of ALLOW, the 'force' option makes the permission stronger (allowing
+both forced and unforced actions). For BLOCK, the 'force' option makes
+it weaker (the BLOCK with 'force' only blocks forced actions).
+
+
+=== Labels
+
+Labels use the same mechanism, with the following observations:
+
+* The 'force' setting has no effect on label ranges.
+
+* BLOCK specifies the values that a group cannot vote, eg.
++
+----
+  label-Code-Review = block -2..+2 group Anonymous Users
+----
++
+prevents all users from voting -2 or +2.
+
+* DENY works for votes too, with the same caveats
+
+* The blocked vote range is the union of the all the blocked vote
+ranges across projects, so in
++
+----
+All-Projects: project.config
+     label-Code-Review = block -2..+1 group A
+
+Child-Project: project-config
+     label-Code-Review = block -1..+2 group A
+----
++
+members of group A cannot vote at all in the Child-Project.
+
+
+* The allowed vote range is the union of vote ranges allowed by all of
+the ALLOW rules. For example, in
++
+----
+     label-Code-Review = -2..+1 group A
+     label-Code-Review = -1..+2 group B
+----
++
+a user that is both in A and B can vote -2..2.
+
+
 GERRIT
 ------
 Part of link:index.html[Gerrit Code Review]
diff --git a/Documentation/cmd-close-connection.txt b/Documentation/cmd-close-connection.txt
index 973441e..c161541 100644
--- a/Documentation/cmd-close-connection.txt
+++ b/Documentation/cmd-close-connection.txt
@@ -1,7 +1,7 @@
 = gerrit close-connection
 
 == NAME
-gerrit close-connection - Close the specified SSH connection
+gerrit close-connection - Close the specified SSH connection.
 
 == SYNOPSIS
 [verse]
diff --git a/Documentation/cmd-create-account.txt b/Documentation/cmd-create-account.txt
index 62bd0aa..617191f 100644
--- a/Documentation/cmd-create-account.txt
+++ b/Documentation/cmd-create-account.txt
@@ -69,7 +69,7 @@
 the 'Non-Interactive Users' group.
 
 ----
-	$ cat ~/.ssh/id_watcher.pub | ssh -p 29418 review.example.com gerrit create-account --group "'Non-Interactive Users'" --ssh-key - watcher
+$ cat ~/.ssh/id_watcher.pub | ssh -p 29418 review.example.com gerrit create-account --group "'Non-Interactive Users'" --ssh-key - watcher
 ----
 
 GERRIT
diff --git a/Documentation/cmd-create-branch.txt b/Documentation/cmd-create-branch.txt
index 336af56d..2060917 100644
--- a/Documentation/cmd-create-branch.txt
+++ b/Documentation/cmd-create-branch.txt
@@ -1,7 +1,7 @@
 = gerrit create-branch
 
 == NAME
-gerrit create-branch - Create a new branch
+gerrit create-branch - Create a new branch.
 
 == SYNOPSIS
 [verse]
@@ -40,7 +40,7 @@
 the project 'myproject'.
 
 ----
-    $ ssh -p 29418 review.example.com gerrit create-branch myproject newbranch master
+$ ssh -p 29418 review.example.com gerrit create-branch myproject newbranch master
 ----
 
 GERRIT
diff --git a/Documentation/cmd-create-group.txt b/Documentation/cmd-create-group.txt
index 7f1f463..2ba611c 100644
--- a/Documentation/cmd-create-group.txt
+++ b/Documentation/cmd-create-group.txt
@@ -68,14 +68,14 @@
 `developer1` and `developer2`.  The group should be owned by itself:
 
 ----
-	$ ssh -p 29418 user@review.example.com gerrit create-group --member developer1 --member developer2 gerritdev
+$ ssh -p 29418 user@review.example.com gerrit create-group --member developer1 --member developer2 gerritdev
 ----
 
 Create a new account group called `Foo` owned by the `Foo-admin` group.
 Put `developer1` as the initial member and include group description:
 
 ----
-	$ ssh -p 29418 user@review.example.com gerrit create-group --owner Foo-admin --member developer1 --description "'Foo description'" Foo
+$ ssh -p 29418 user@review.example.com gerrit create-group --owner Foo-admin --member developer1 --description "'Foo description'" Foo
 ----
 
 Note that it is necessary to quote the description twice.  The local
diff --git a/Documentation/cmd-create-project.txt b/Documentation/cmd-create-project.txt
index e8c3857..026d7b1 100644
--- a/Documentation/cmd-create-project.txt
+++ b/Documentation/cmd-create-project.txt
@@ -1,7 +1,7 @@
 = gerrit create-project
 
 == NAME
-gerrit create-project - Create a new hosted project
+gerrit create-project - Create a new hosted project.
 
 == SYNOPSIS
 [verse]
@@ -61,15 +61,17 @@
 --owner::
 -o::
 	Identifier of the group(s) which will initially own this repository.
++
+--
+This can be:
 
-        This can be:
-
-        * the UUID of the group
-        * the legacy numeric ID of the group
-        * the name of the group if it is unique
-
-	The specified group(s) must already be defined within Gerrit.
-	Several groups can be specified on the command line.
+* the UUID of the group
+* the legacy numeric ID of the group
+* the name of the group if it is unique
+--
++
+The specified group(s) must already be defined within Gerrit.
+Several groups can be specified on the command line.
 +
 Defaults to what is specified by `repository.*.ownerGroup`
 in gerrit.config.
@@ -180,13 +182,13 @@
 Create a new project called `tools/gerrit`:
 
 ----
-	$ ssh -p 29418 review.example.com gerrit create-project tools/gerrit.git
+$ ssh -p 29418 review.example.com gerrit create-project tools/gerrit.git
 ----
 
 Create a new project with a description:
 
 ----
-	$ ssh -p 29418 review.example.com gerrit create-project tool.git --description "'Tools used by build system'"
+$ ssh -p 29418 review.example.com gerrit create-project tool.git --description "'Tools used by build system'"
 ----
 
 Note that it is necessary to quote the description twice.  The local
@@ -199,7 +201,7 @@
 perform remote repository creation by a Bourne shell script:
 
 ----
-  mkdir -p '/base/project.git' && cd '/base/project.git' && git init --bare && git update-ref HEAD refs/heads/master
+mkdir -p '/base/project.git' && cd '/base/project.git' && git init --bare && git update-ref HEAD refs/heads/master
 ----
 
 For this to work successfully the remote system must be able to run
diff --git a/Documentation/cmd-flush-caches.txt b/Documentation/cmd-flush-caches.txt
index 9ba4808..55d9083 100644
--- a/Documentation/cmd-flush-caches.txt
+++ b/Documentation/cmd-flush-caches.txt
@@ -1,7 +1,7 @@
 = gerrit flush-caches
 
 == NAME
-gerrit flush-caches - Flush some/all server caches from memory
+gerrit flush-caches - Flush some/all server caches from memory.
 
 == SYNOPSIS
 [verse]
@@ -58,40 +58,40 @@
 List caches available for flushing:
 
 ----
-	$ ssh -p 29418 review.example.com gerrit flush-caches --list
-	accounts
-	diff
-	groups
-	ldap_groups
-	openid
-	projects
-	sshkeys
-	web_sessions
+$ ssh -p 29418 review.example.com gerrit flush-caches --list
+accounts
+diff
+groups
+ldap_groups
+openid
+projects
+sshkeys
+web_sessions
 ----
 
 Flush all caches known to the server, forcing them to recompute:
 
 ----
-	$ ssh -p 29418 review.example.com gerrit flush-caches --all
+$ ssh -p 29418 review.example.com gerrit flush-caches --all
 ----
 
 or
 
 ----
-	$ ssh -p 29418 review.example.com gerrit flush-caches
+$ ssh -p 29418 review.example.com gerrit flush-caches
 ----
 
 Flush only the "sshkeys" cache, after manually editing an SSH key
 for a user:
 
 ----
-	$ ssh -p 29418 review.example.com gerrit flush-caches --cache sshkeys
+$ ssh -p 29418 review.example.com gerrit flush-caches --cache sshkeys
 ----
 
 Flush "web_sessions", forcing all users to sign-in again:
 
 ----
-	$ ssh -p 29418 review.example.com gerrit flush-caches --cache web_sessions
+$ ssh -p 29418 review.example.com gerrit flush-caches --cache web_sessions
 ----
 
 == SEE ALSO
diff --git a/Documentation/cmd-gc.txt b/Documentation/cmd-gc.txt
index 1d1cc00..390dce1 100644
--- a/Documentation/cmd-gc.txt
+++ b/Documentation/cmd-gc.txt
@@ -1,7 +1,7 @@
 = gerrit gc
 
 == NAME
-gerrit gc - Run the Git garbage collection
+gerrit gc - Run the Git garbage collection.
 
 == SYNOPSIS
 [verse]
@@ -54,19 +54,19 @@
 Run the Git garbage collection for the projects 'myProject' and
 'yourProject':
 ----
-	$ ssh -p 29418 review.example.com gerrit gc myProject yourProject
-	collecting garbage for "myProject":
-	...
-	done.
+$ ssh -p 29418 review.example.com gerrit gc myProject yourProject
+collecting garbage for "myProject":
+...
+done.
 
-	collecting garbage for "yourProject":
-	...
-	done.
+collecting garbage for "yourProject":
+...
+done.
 ----
 
 Run the Git garbage collection for all projects:
 ----
-	$ ssh -p 29418 review.example.com gerrit gc --all
+$ ssh -p 29418 review.example.com gerrit gc --all
 ----
 
 GERRIT
diff --git a/Documentation/cmd-gsql.txt b/Documentation/cmd-gsql.txt
index d2eb783..7f2aaf7 100644
--- a/Documentation/cmd-gsql.txt
+++ b/Documentation/cmd-gsql.txt
@@ -1,7 +1,7 @@
 = gerrit gsql
 
 == NAME
-gerrit gsql - Administrative interface to active database
+gerrit gsql - Administrative interface to active database.
 
 == SYNOPSIS
 [verse]
@@ -42,18 +42,18 @@
 To manually correct a user's SSH user name:
 
 ----
-	$ ssh -p 29418 review.example.com gerrit gsql
-	Welcome to Gerrit Code Review v2.0.25
-	(PostgreSQL 8.3.8)
+$ ssh -p 29418 review.example.com gerrit gsql
+Welcome to Gerrit Code Review v2.0.25
+(PostgreSQL 8.3.8)
 
-	Type '\h' for help.  Type '\r' to clear the buffer.
+Type '\h' for help.  Type '\r' to clear the buffer.
 
-	gerrit> update accounts set ssh_user_name = 'alice' where account_id=1;
-	UPDATE 1; 1 ms
-	gerrit> \q
-	Bye
+gerrit> update accounts set ssh_user_name = 'alice' where account_id=1;
+UPDATE 1; 1 ms
+gerrit> \q
+Bye
 
-	$ ssh -p 29418 review.example.com gerrit flush-caches --cache sshkeys --cache accounts
+$ ssh -p 29418 review.example.com gerrit flush-caches --cache sshkeys --cache accounts
 ----
 
 GERRIT
diff --git a/Documentation/cmd-hook-commit-msg.txt b/Documentation/cmd-hook-commit-msg.txt
index ffdd5da..49d5c17 100644
--- a/Documentation/cmd-hook-commit-msg.txt
+++ b/Documentation/cmd-hook-commit-msg.txt
@@ -20,24 +20,24 @@
 for a project, the hook will modify a commit message such as:
 
 ----
-  Improve foo widget by attaching a bar.
+Improve foo widget by attaching a bar.
 
-  We want a bar, because it improves the foo by providing more
-  wizbangery to the dowhatimeanery.
+We want a bar, because it improves the foo by providing more
+wizbangery to the dowhatimeanery.
 
-  Signed-off-by: A. U. Thor <author@example.com>
+Signed-off-by: A. U. Thor <author@example.com>
 ----
 
 by inserting a new `Change-Id: ` line in the footer:
 
 ----
-  Improve foo widget by attaching a bar.
+Improve foo widget by attaching a bar.
 
-  We want a bar, because it improves the foo by providing more
-  wizbangery to the dowhatimeanery.
+We want a bar, because it improves the foo by providing more
+wizbangery to the dowhatimeanery.
 
-  Change-Id: Ic8aaa0728a43936cd4c6e1ed590e01ba8f0fbf5b
-  Signed-off-by: A. U. Thor <author@example.com>
+Change-Id: Ic8aaa0728a43936cd4c6e1ed590e01ba8f0fbf5b
+Signed-off-by: A. U. Thor <author@example.com>
 ----
 
 The hook implementation is reasonably intelligent at inserting the
@@ -57,31 +57,29 @@
 
 == OBTAINING
 
-
 To obtain the `commit-msg` script use `scp`, `wget` or `curl` to download
 it to your local system from your Gerrit server.
 
 You can use either of the below commands:
 
 ----
-  $ scp -p -P 29418 <your username>@<your Gerrit review server>:hooks/commit-msg <local path to your git>/.git/hooks/
+$ scp -p -P 29418 <your username>@<your Gerrit review server>:hooks/commit-msg <local path to your git>/.git/hooks/
 
-  $ curl -Lo <local path to your git>/.git/hooks/commit-msg <your Gerrit http URL>/tools/hooks/commit-msg
+$ curl -Lo <local path to your git>/.git/hooks/commit-msg <your Gerrit http URL>/tools/hooks/commit-msg
 ----
 
 A specific example of this might look something like this:
 
-.Example
 ----
-  $ scp -p -P 29418 john.doe@review.example.com:hooks/commit-msg ~/duhproject/.git/hooks/
+$ scp -p -P 29418 john.doe@review.example.com:hooks/commit-msg ~/duhproject/.git/hooks/
 
-  $ curl -Lo ~/duhproject/.git/hooks/commit-msg http://review.example.com/tools/hooks/commit-msg
+$ curl -Lo ~/duhproject/.git/hooks/commit-msg http://review.example.com/tools/hooks/commit-msg
 ----
 
 Make sure the hook file is executable:
 
 ----
-  $ chmod u+x ~/duhproject/.git/hooks/commit-msg
+$ chmod u+x ~/duhproject/.git/hooks/commit-msg
 ----
 
 == SEE ALSO
diff --git a/Documentation/cmd-index-activate.txt b/Documentation/cmd-index-activate.txt
index 4428d12..0bbf308 100644
--- a/Documentation/cmd-index-activate.txt
+++ b/Documentation/cmd-index-activate.txt
@@ -1,7 +1,7 @@
 = gerrit index activate
 
 == NAME
-gerrit index activate - Activate the latest index version available
+gerrit index activate - Activate the latest index version available.
 
 == SYNOPSIS
 [verse]
@@ -37,7 +37,7 @@
 Activate the latest change index:
 
 ----
-  $ ssh -p 29418 review.example.com gerrit index activate changes
+$ ssh -p 29418 review.example.com gerrit index activate changes
 ----
 
 GERRIT
diff --git a/Documentation/cmd-index-changes-in-project.txt b/Documentation/cmd-index-changes-in-project.txt
new file mode 100644
index 0000000..b2282fc
--- /dev/null
+++ b/Documentation/cmd-index-changes-in-project.txt
@@ -0,0 +1,37 @@
+= gerrit index changes in project
+
+== NAME
+gerrit index changes in project - Index all the changes in one or more projects.
+
+== SYNOPSIS
+[verse]
+--
+_ssh_ -p <port> <host> _gerrit index changes-in-project_ <PROJECT> [<PROJECT> ...]
+--
+
+== DESCRIPTION
+Index all the changes in one or more projects.
+
+== ACCESS
+Caller must have the 'Maintain Server' capability.
+
+== SCRIPTING
+This command is intended to be used in scripts.
+
+== OPTIONS
+<PROJECT>::
+    Required; name of the project to be indexed.
+
+== EXAMPLES
+Index all changes in projects MyProject and NiceProject.
+
+----
+$ ssh -p 29418 user@review.example.com gerrit index changes-in-project MyProject NiceProject
+----
+
+GERRIT
+------
+Part of link:index.html[Gerrit Code Review]
+
+SEARCHBOX
+---------
diff --git a/Documentation/cmd-index-changes.txt b/Documentation/cmd-index-changes.txt
index d38c51a..0ee7aab 100644
--- a/Documentation/cmd-index-changes.txt
+++ b/Documentation/cmd-index-changes.txt
@@ -30,7 +30,7 @@
 Index changes with legacy ID numbers 1 and 2.
 
 ----
-    $ ssh -p 29418 user@review.example.com gerrit index changes 1 2
+$ ssh -p 29418 user@review.example.com gerrit index changes 1 2
 ----
 
 GERRIT
diff --git a/Documentation/cmd-index-project.txt b/Documentation/cmd-index-project.txt
deleted file mode 100644
index 2196a26..0000000
--- a/Documentation/cmd-index-project.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-= gerrit index project
-
-== NAME
-gerrit index project - Index all the changes in one or more projects.
-
-== SYNOPSIS
-[verse]
---
-_ssh_ -p <port> <host> _gerrit index project_ <PROJECT> [<PROJECT> ...]
---
-
-== DESCRIPTION
-Index all the changes in one or more projects.
-
-== ACCESS
-Caller must have the 'Maintain Server' capability.
-
-== SCRIPTING
-This command is intended to be used in scripts.
-
-== OPTIONS
-<PROJECT>::
-    Required; name of the project to be indexed.
-
-== EXAMPLES
-Index all changes in projects MyProject and NiceProject.
-
-----
-    $ ssh -p 29418 user@review.example.com gerrit index project MyProject NiceProject
-----
-
-GERRIT
-------
-Part of link:index.html[Gerrit Code Review]
-
-SEARCHBOX
----------
diff --git a/Documentation/cmd-index-start.txt b/Documentation/cmd-index-start.txt
index 9264999..d1a02b3 100644
--- a/Documentation/cmd-index-start.txt
+++ b/Documentation/cmd-index-start.txt
@@ -1,7 +1,7 @@
 = gerrit index start
 
 == NAME
-gerrit index start - Start the online indexer
+gerrit index start - Start the online indexer.
 
 == SYNOPSIS
 [verse]
@@ -35,6 +35,7 @@
     * changes
     * accounts
     * groups
+    * projects
 
 --force::
   Force an online re-index.
@@ -43,7 +44,7 @@
 Start the online indexer for the 'changes' index:
 
 ----
-  $ ssh -p 29418 review.example.com gerrit index start changes
+$ ssh -p 29418 review.example.com gerrit index start changes
 ----
 
 GERRIT
diff --git a/Documentation/cmd-index.txt b/Documentation/cmd-index.txt
index 2880ec7..25099fa 100644
--- a/Documentation/cmd-index.txt
+++ b/Documentation/cmd-index.txt
@@ -8,11 +8,11 @@
 To download a client command or hook, use scp or an http client:
 
 ----
-  $ scp -p -P 29418 john.doe@review.example.com:bin/gerrit-cherry-pick ~/bin/
-  $ scp -p -P 29418 john.doe@review.example.com:hooks/commit-msg .git/hooks/
+$ scp -p -P 29418 john.doe@review.example.com:bin/gerrit-cherry-pick ~/bin/
+$ scp -p -P 29418 john.doe@review.example.com:hooks/commit-msg .git/hooks/
 
-  $ curl -Lo ~/bin/gerrit-cherry-pick http://review.example.com/tools/bin/gerrit-cherry-pick
-  $ curl -Lo .git/hooks/commit-msg http://review.example.com/tools/hooks/commit-msg
+$ curl -Lo ~/bin/gerrit-cherry-pick http://review.example.com/tools/bin/gerrit-cherry-pick
+$ curl -Lo .git/hooks/commit-msg http://review.example.com/tools/hooks/commit-msg
 ----
 
 For more details on how to determine the correct SSH port number,
@@ -32,7 +32,7 @@
 server.
 
 link:cmd-hook-commit-msg.html[commit-msg]::
-	Automatically generate `Change-Id: ` tags in commit messages.
+	Automatically generate `Change-Id:` tags in commit messages.
 
 
 == Server
@@ -88,6 +88,9 @@
 link:cmd-set-project.html[gerrit set-project]::
 	Change a project's settings.
 
+link:cmd-set-project-parent.html[gerrit set-project-parent]::
+	Change the project permissions are inherited from.
+
 link:cmd-set-reviewers.html[gerrit set-reviewers]::
 	Add or remove reviewers on a change.
 
@@ -139,7 +142,7 @@
 link:cmd-index-changes.html[gerrit index changes]::
 	Index one or more changes.
 
-link:cmd-index-project.html[gerrit index project]::
+link:cmd-index-changes-in-project.html[gerrit index changes-in-project]::
 	Index all the changes in one or more projects.
 
 link:cmd-logging-ls-level.html[gerrit logging ls-level]::
@@ -172,15 +175,15 @@
 link:cmd-plugin-remove.html[gerrit plugin rm]::
 	Alias for 'gerrit plugin remove'.
 
+link:cmd-reload-config.html[gerrit reload-config]::
+	Apply an updated gerrit.config.
+
 link:cmd-set-account.html[gerrit set-account]::
 	Change an account's settings.
 
 link:cmd-set-members.html[gerrit set-members]::
 	Set group members.
 
-link:cmd-set-project-parent.html[gerrit set-project-parent]::
-	Change the project permissions are inherited from.
-
 link:cmd-show-caches.html[gerrit show-caches]::
 	Display current cache statistics.
 
@@ -205,6 +208,36 @@
 link:cmd-suexec.html[suexec]::
 	Execute a command as any registered user account.
 
+[[trace]]
+=== Trace
+
+For executing SSH commands tracing can be enabled by setting the
+`--trace` and `--trace-id <trace-id>` options. It is recommended to use
+the ID of the issue that is being investigated as trace ID.
+
+----
+  $ ssh -p 29418 review.example.com gerrit create-project --trace --trace-id issue/123 foo/bar
+----
+
+It is also possible to omit the trace ID and get a unique trace ID
+generated.
+
+----
+  $ ssh -p 29418 review.example.com gerrit create-project --trace foo/bar
+----
+
+Enabling tracing results in additional logs with debug information that
+are written to the `error_log`. All logs that correspond to the traced
+request are associated with the trace ID. The trace ID is printed to
+the stderr command output:
+
+----
+  TRACE_ID: 1534174322774-7edf2a7b
+----
+
+Given the trace ID an administrator can find the corresponding logs and
+investigate issues more easily.
+
 GERRIT
 ------
 Part of link:index.html[Gerrit Code Review]
diff --git a/Documentation/cmd-kill.txt b/Documentation/cmd-kill.txt
index ac8e802..db5093d 100644
--- a/Documentation/cmd-kill.txt
+++ b/Documentation/cmd-kill.txt
@@ -1,7 +1,7 @@
 = kill
 
 == NAME
-kill - Cancel or abort a background task
+kill - Cancel or abort a background task.
 
 == SYNOPSIS
 [verse]
diff --git a/Documentation/cmd-logging-ls-level.txt b/Documentation/cmd-logging-ls-level.txt
index ee015bb..fb1fb33 100644
--- a/Documentation/cmd-logging-ls-level.txt
+++ b/Documentation/cmd-logging-ls-level.txt
@@ -1,9 +1,9 @@
 = gerrit logging ls-level
 
 == NAME
-gerrit logging ls-level - view the logging level
+gerrit logging ls-level - view the logging level.
 
-gerrit logging ls - view the logging level
+gerrit logging ls - view the logging level.
 
 == SYNOPSIS
 [verse]
@@ -27,13 +27,12 @@
 
 View the logging level of the loggers in the package com.google:
 ----
-    $ssh -p 29418 review.example.com gerrit logging ls-level \
-     com.google.
+$ssh -p 29418 review.example.com gerrit logging ls-level com.google.
 ----
 
 View the logging level of every logger
 ----
-    $ssh -p 29418 review.example.com gerrit logging ls-level
+$ssh -p 29418 review.example.com gerrit logging ls-level
 ----
 
 GERRIT
diff --git a/Documentation/cmd-logging-set-level.txt b/Documentation/cmd-logging-set-level.txt
index 5baa968..d7fc69e 100644
--- a/Documentation/cmd-logging-set-level.txt
+++ b/Documentation/cmd-logging-set-level.txt
@@ -1,9 +1,9 @@
 = gerrit logging set-level
 
 == NAME
-gerrit logging set-level - set the logging level
+gerrit logging set-level - set the logging level.
 
-gerrit logging set - set the logging level
+gerrit logging set - set the logging level.
 
 == SYNOPSIS
 [verse]
@@ -34,14 +34,12 @@
 
 Change the logging level of the loggers in the package com.google to DEBUG.
 ----
-    $ssh -p 29418 review.example.com gerrit logging set-level \
-     debug com.google.
+$ssh -p 29418 review.example.com gerrit logging set-level debug com.google.
 ----
 
 Reset the logging level of every logger to what they were at deployment time.
 ----
-    $ssh -p 29418 review.example.com gerrit logging set-level \
-     reset
+$ssh -p 29418 review.example.com gerrit logging set-level reset
 ----
 
 GERRIT
diff --git a/Documentation/cmd-ls-groups.txt b/Documentation/cmd-ls-groups.txt
index 6d4bdc5..8a4845c 100644
--- a/Documentation/cmd-ls-groups.txt
+++ b/Documentation/cmd-ls-groups.txt
@@ -1,7 +1,7 @@
 = gerrit ls-groups
 
 == NAME
-gerrit ls-groups - List groups visible to caller
+gerrit ls-groups - List groups visible to caller.
 
 == SYNOPSIS
 [verse]
@@ -88,53 +88,53 @@
 
 List visible groups:
 ----
-	$ ssh -p 29418 review.example.com gerrit ls-groups
-	Administrators
-	Anonymous Users
-	MyProject_Committers
-	Project Owners
-	Registered Users
+$ ssh -p 29418 review.example.com gerrit ls-groups
+Administrators
+Anonymous Users
+MyProject_Committers
+Project Owners
+Registered Users
 ----
 
 List all groups for which any permission is set for the project
 "MyProject":
 ----
-	$ ssh -p 29418 review.example.com gerrit ls-groups --project MyProject
-	MyProject_Committers
-	Project Owners
-	Registered Users
+$ ssh -p 29418 review.example.com gerrit ls-groups --project MyProject
+MyProject_Committers
+Project Owners
+Registered Users
 ----
 
 List all groups which are owned by the calling user:
 ----
-	$ ssh -p 29418 review.example.com gerrit ls-groups --owned
-	MyProject_Committers
-	MyProject_Verifiers
+$ ssh -p 29418 review.example.com gerrit ls-groups --owned
+MyProject_Committers
+MyProject_Verifiers
 ----
 
 Check if the calling user owns the group `MyProject_Committers`. If
 `MyProject_Committers` is returned the calling user owns this group.
 If the result is empty, the calling user doesn't own the group.
 ----
-	$ ssh -p 29418 review.example.com gerrit ls-groups --owned -q MyProject_Committers
-	MyProject_Committers
+$ ssh -p 29418 review.example.com gerrit ls-groups --owned -q MyProject_Committers
+MyProject_Committers
 ----
 
 Extract the UUID of the 'Administrators' group:
 
 ----
-	$ ssh -p 29418 review.example.com gerrit ls-groups -v | awk '-F\t' '$1 == "Administrators" {print $2}'
-	ad463411db3eec4e1efb0d73f55183c1db2fd82a
+$ ssh -p 29418 review.example.com gerrit ls-groups -v | awk '-F\t' '$1 == "Administrators" {print $2}'
+ad463411db3eec4e1efb0d73f55183c1db2fd82a
 ----
 
 Extract and expand the multi-line description of the 'Administrators'
 group:
 
 ----
-	$ printf "$(ssh -p 29418 review.example.com gerrit ls-groups -v | awk '-F\t' '$1 == "Administrators" {print $3}')\n"
-	This is a
-	multi-line
-	description.
+$ printf "$(ssh -p 29418 review.example.com gerrit ls-groups -v | awk '-F\t' '$1 == "Administrators" {print $3}')\n"
+This is a
+multi-line
+description.
 ----
 
 GERRIT
diff --git a/Documentation/cmd-ls-members.txt b/Documentation/cmd-ls-members.txt
index 273451b..8f8857c 100644
--- a/Documentation/cmd-ls-members.txt
+++ b/Documentation/cmd-ls-members.txt
@@ -1,7 +1,7 @@
 = gerrit ls-members
 
 == NAME
-gerrit ls-members - Show members of a given group
+gerrit ls-members - Show members of a given group.
 
 == SYNOPSIS
 [verse]
@@ -40,17 +40,17 @@
 
 List members of the Administrators group:
 ----
-	$ ssh -p 29418 review.example.com gerrit ls-members Administrators
-	id      username  full name    email
-	100000  jim     Jim Bob somebody@example.com
-	100001  johnny  John Smith      n/a
-	100002  mrnoname        n/a     someoneelse@example.com
+$ ssh -p 29418 review.example.com gerrit ls-members Administrators
+id      username  full name    email
+100000  jim     Jim Bob somebody@example.com
+100001  johnny  John Smith      n/a
+100002  mrnoname        n/a     someoneelse@example.com
 ----
 
 List members of a non-existent group:
 ----
-	$ ssh -p 29418 review.example.com gerrit ls-members BadlySpelledGroup
-	Group not found or not visible
+$ ssh -p 29418 review.example.com gerrit ls-members BadlySpelledGroup
+Group not found or not visible
 ----
 
 GERRIT
diff --git a/Documentation/cmd-ls-projects.txt b/Documentation/cmd-ls-projects.txt
index c5d73ca..fb35dc2 100644
--- a/Documentation/cmd-ls-projects.txt
+++ b/Documentation/cmd-ls-projects.txt
@@ -1,7 +1,7 @@
 = gerrit ls-projects
 
 == NAME
-gerrit ls-projects - List projects visible to caller
+gerrit ls-projects - List projects visible to caller.
 
 == SYNOPSIS
 [verse]
@@ -119,28 +119,28 @@
 
 List visible projects:
 ----
-	$ ssh -p 29418 review.example.com gerrit ls-projects
-	platform/manifest
-	tools/gerrit
-	tools/gwtorm
+$ ssh -p 29418 review.example.com gerrit ls-projects
+platform/manifest
+tools/gerrit
+tools/gwtorm
 
-	$ curl http://review.example.com/projects/
-	platform/manifest
-	tools/gerrit
-	tools/gwtorm
+$ curl http://review.example.com/projects/
+platform/manifest
+tools/gerrit
+tools/gwtorm
 
-	$ curl http://review.example.com/projects/tools/
-	tools/gerrit
-	tools/gwtorm
+$ curl http://review.example.com/projects/tools/
+tools/gerrit
+tools/gwtorm
 ----
 
 Clone any project visible to the user:
 ----
-	for p in `ssh -p 29418 review.example.com gerrit ls-projects`
-	do
-	  mkdir -p `dirname "$p"`
-	  git clone --bare "ssh://review.example.com:29418/$p.git" "$p.git"
-	done
+for p in `ssh -p 29418 review.example.com gerrit ls-projects`
+do
+  mkdir -p `dirname "$p"`
+  git clone --bare "ssh://review.example.com:29418/$p.git" "$p.git"
+done
 ----
 
 == SEE ALSO
diff --git a/Documentation/cmd-ls-user-refs.txt b/Documentation/cmd-ls-user-refs.txt
index 1a87fc9..cba7d1b 100644
--- a/Documentation/cmd-ls-user-refs.txt
+++ b/Documentation/cmd-ls-user-refs.txt
@@ -1,7 +1,7 @@
 = gerrit ls-user-refs
 
 == NAME
-gerrit ls-user-refs - List refs visible to a specific user
+gerrit ls-user-refs - List refs visible to a specific user.
 
 == SYNOPSIS
 [verse]
@@ -42,7 +42,7 @@
 
 List visible refs for the user "mr.developer" in project "gerrit"
 ----
-	$ ssh -p 29418 review.example.com gerrit ls-user-refs -p gerrit -u mr.developer
+$ ssh -p 29418 review.example.com gerrit ls-user-refs -p gerrit -u mr.developer
 ----
 
 GERRIT
diff --git a/Documentation/cmd-plugin-enable.txt b/Documentation/cmd-plugin-enable.txt
index 9b52736..955267e 100644
--- a/Documentation/cmd-plugin-enable.txt
+++ b/Documentation/cmd-plugin-enable.txt
@@ -32,7 +32,7 @@
 Enable a plugin:
 
 ----
-	ssh -p 29418 localhost gerrit plugin enable my-plugin
+ssh -p 29418 localhost gerrit plugin enable my-plugin
 ----
 
 GERRIT
diff --git a/Documentation/cmd-plugin-install.txt b/Documentation/cmd-plugin-install.txt
index 5443613..ef68b40 100644
--- a/Documentation/cmd-plugin-install.txt
+++ b/Documentation/cmd-plugin-install.txt
@@ -46,29 +46,25 @@
 Install a plugin from an absolute file path on the server's host:
 
 ----
-	ssh -p 29418 localhost gerrit plugin install -n name.jar \
-	  $(pwd)/my-plugin.jar
+ssh -p 29418 localhost gerrit plugin install -n name.jar $(pwd)/my-plugin.jar
 ----
 
 Install a WebUI plugin from an absolute file path on the server's host:
 
 ----
-  ssh -p 29418 localhost gerrit plugin install -n name.js \
-    $(pwd)/my-webui-plugin.js
+ssh -p 29418 localhost gerrit plugin install -n name.js $(pwd)/my-webui-plugin.js
 ----
 
 Install a plugin from an HTTP site:
 
 ----
-	ssh -p 29418 localhost gerrit plugin install -n name.jar \
-	  http://build-server/output/our-plugin
+ssh -p 29418 localhost gerrit plugin install -n name.jar http://build-server/output/our-plugin
 ----
 
 Install a plugin from piped input:
 
 ----
-	ssh -p 29418 localhost gerrit plugin install -n name.jar \
-	  - <target/name-0.1.jar
+ssh -p 29418 localhost gerrit plugin install -n name.jar - <target/name-0.1.jar
 ----
 
 GERRIT
diff --git a/Documentation/cmd-plugin-reload.txt b/Documentation/cmd-plugin-reload.txt
index ad1e5e7..5cfb6cc 100644
--- a/Documentation/cmd-plugin-reload.txt
+++ b/Documentation/cmd-plugin-reload.txt
@@ -36,7 +36,7 @@
 Reload a plugin:
 
 ----
-	ssh -p 29418 localhost gerrit plugin reload my-plugin
+ssh -p 29418 localhost gerrit plugin reload my-plugin
 ----
 
 GERRIT
diff --git a/Documentation/cmd-plugin-remove.txt b/Documentation/cmd-plugin-remove.txt
index 805c7b4..f5fe56b 100644
--- a/Documentation/cmd-plugin-remove.txt
+++ b/Documentation/cmd-plugin-remove.txt
@@ -33,7 +33,7 @@
 Disable a plugin:
 
 ----
-	ssh -p 29418 localhost gerrit plugin remove my-plugin
+ssh -p 29418 localhost gerrit plugin remove my-plugin
 ----
 
 GERRIT
diff --git a/Documentation/cmd-query.txt b/Documentation/cmd-query.txt
index 90e5cdd..79723c5 100644
--- a/Documentation/cmd-query.txt
+++ b/Documentation/cmd-query.txt
@@ -117,18 +117,18 @@
 
 Find the 2 most recent open changes in the tools/gerrit project:
 ----
-  $ ssh -p 29418 review.example.com gerrit query --format=JSON status:open project:tools/gerrit limit:2
-  {"project":"tools/gerrit", ...}
-  {"project":"tools/gerrit", ...}
-  {"type":"stats","rowCount":2,"runningTimeMilliseconds:15}
+$ ssh -p 29418 review.example.com gerrit query --format=JSON status:open project:tools/gerrit limit:2
+{"project":"tools/gerrit", ...}
+{"project":"tools/gerrit", ...}
+{"type":"stats","rowCount":2,"runningTimeMilliseconds:15}
 ----
 
 Skip number of changes:
 ----
-  $ ssh -p 29418 review.example.com gerrit query --format=JSON --start 42 status:open project:tools/gerrit limit:2
-  {"project":"tools/gerrit", ...}
-  {"project":"tools/gerrit", ...}
-  {"type":"stats","rowCount":1,"runningTimeMilliseconds:15}
+$ ssh -p 29418 review.example.com gerrit query --format=JSON --start 42 status:open project:tools/gerrit limit:2
+{"project":"tools/gerrit", ...}
+{"project":"tools/gerrit", ...}
+{"type":"stats","rowCount":1,"runningTimeMilliseconds:15}
 ----
 
 
diff --git a/Documentation/cmd-receive-pack.txt b/Documentation/cmd-receive-pack.txt
index b62b9a9..9c6d9fa 100644
--- a/Documentation/cmd-receive-pack.txt
+++ b/Documentation/cmd-receive-pack.txt
@@ -1,7 +1,7 @@
 = git-receive-pack
 
 == NAME
-git-receive-pack - Receive what is pushed into the repository
+git-receive-pack - Receive what is pushed into the repository.
 
 == SYNOPSIS
 [verse]
@@ -43,36 +43,36 @@
 
 Send a review for a change on the master branch to charlie@example.com:
 ----
-	git push ssh://review.example.com:29418/project HEAD:refs/for/master%r=charlie@example.com
+git push ssh://review.example.com:29418/project HEAD:refs/for/master%r=charlie@example.com
 ----
 
 Send reviews, but tagging them with the topic name 'bug42':
 ----
-	git push ssh://review.example.com:29418/project HEAD:refs/for/master%r=charlie@example.com,topic=bug42
+git push ssh://review.example.com:29418/project HEAD:refs/for/master%r=charlie@example.com,topic=bug42
 ----
 
 Also CC two other parties:
 ----
-	git push ssh://review.example.com:29418/project HEAD:refs/for/master%r=charlie@example.com,cc=alice@example.com,cc=bob@example.com
+git push ssh://review.example.com:29418/project HEAD:refs/for/master%r=charlie@example.com,cc=alice@example.com,cc=bob@example.com
 ----
 
 Configure a push macro to perform the last action:
 ----
-	git config remote.charlie.url ssh://review.example.com:29418/project
-	git config remote.charlie.push HEAD:refs/for/master%r=charlie@example.com,cc=alice@example.com,cc=bob@example.com
+git config remote.charlie.url ssh://review.example.com:29418/project
+git config remote.charlie.push HEAD:refs/for/master%r=charlie@example.com,cc=alice@example.com,cc=bob@example.com
 ----
 
 afterwards `.git/config` contains the following:
 ----
 [remote "charlie"]
-  url = ssh://review.example.com:29418/project
-  push = HEAD:refs/for/master%r=charlie@example.com,cc=alice@example.com,cc=bob@example.com
+ url = ssh://review.example.com:29418/project
+ push = HEAD:refs/for/master%r=charlie@example.com,cc=alice@example.com,cc=bob@example.com
 ----
 
 and now sending a new change for review to charlie, CC'ing both
 alice and bob is much easier:
 ----
-	git push charlie
+git push charlie
 ----
 
 == SEE ALSO
diff --git a/Documentation/cmd-reload-config.txt b/Documentation/cmd-reload-config.txt
new file mode 100644
index 0000000..6d652f5
--- /dev/null
+++ b/Documentation/cmd-reload-config.txt
@@ -0,0 +1,44 @@
+= plugin reload
+
+== NAME
+reload-config - Reloads the gerrit.config.
+
+== SYNOPSIS
+[verse]
+--
+_ssh_ -p <port> <host> _gerrit reload-config_
+  <NAME> ...
+--
+
+== DESCRIPTION
+Reloads the gerrit.config configuration.
+
+Not all configuration values can be picked up by this command. Which config
+sections and values that are supported is documented here:
+link:config-gerrit.html[Configuration]
+
+_The output shows only modified config values that are picked up by Gerrit
+and applied._
+
+If a config entry is added or removed from gerrit.config, but still brings
+no effect due to a matching default value, no output for this entry is shown.
+
+== ACCESS
+* Caller must be a member of the privileged 'Administrators' group.
+
+== SCRIPTING
+This command is intended to be used in scripts.
+
+== EXAMPLES
+Reload the gerrit configuration:
+
+----
+ssh -p 29418 localhost gerrit reload-config
+----
+
+GERRIT
+------
+Part of link:index.html[Gerrit Code Review]
+
+SEARCHBOX
+---------
diff --git a/Documentation/cmd-rename-group.txt b/Documentation/cmd-rename-group.txt
index a48014c..c946e88 100644
--- a/Documentation/cmd-rename-group.txt
+++ b/Documentation/cmd-rename-group.txt
@@ -32,7 +32,7 @@
 Rename the group "MyGroup" to "MyCommitters".
 
 ----
-	$ ssh -p 29418 user@review.example.com gerrit rename-group MyGroup MyCommitters
+$ ssh -p 29418 user@review.example.com gerrit rename-group MyGroup MyCommitters
 ----
 
 GERRIT
diff --git a/Documentation/cmd-review.txt b/Documentation/cmd-review.txt
index 605fc1f..6fe24815 100644
--- a/Documentation/cmd-review.txt
+++ b/Documentation/cmd-review.txt
@@ -1,7 +1,7 @@
 = gerrit review
 
 == NAME
-gerrit review - Apply reviews to one or more patch sets
+gerrit review - Apply reviews to one or more patch sets.
 
 == SYNOPSIS
 [verse]
@@ -144,40 +144,40 @@
 
 Approve the change with commit c0ff33 as "Verified +1"
 ----
-	$ ssh -p 29418 review.example.com gerrit review --verified +1 c0ff33
+$ ssh -p 29418 review.example.com gerrit review --verified +1 c0ff33
 ----
 
 Approve the change with change number 8242 and patch set 2 as "Code-Review +2"
 ----
-	$ ssh -p 29418 review.example.com gerrit review --code-review +2 8242,2
+$ ssh -p 29418 review.example.com gerrit review --code-review +2 8242,2
 ----
 
 Vote on the project specific label "mylabel":
 ----
-	$ ssh -p 29418 review.example.com gerrit review --label mylabel=+1 8242,2
+$ ssh -p 29418 review.example.com gerrit review --label mylabel=+1 8242,2
 ----
 
 Append the message "Build Successful". Notice two levels of quoting is
 required, one for the local shell, and another for the argument parser
 inside the Gerrit server:
 ----
-	$ ssh -p 29418 review.example.com gerrit review -m '"Build Successful"' 8242,2
+$ ssh -p 29418 review.example.com gerrit review -m '"Build Successful"' 8242,2
 ----
 
 Mark the unmerged commits both "Verified +1" and "Code-Review +2" and
 submit them for merging:
 ----
-  $ ssh -p 29418 review.example.com gerrit review \
-    --verified +1 \
-    --code-review +2 \
-    --submit \
-    --project this/project \
-    $(git rev-list origin/master..HEAD)
+$ ssh -p 29418 review.example.com gerrit review \
+  --verified +1 \
+  --code-review +2 \
+  --submit \
+  --project this/project \
+  $(git rev-list origin/master..HEAD)
 ----
 
 Abandon an active change:
 ----
-  $ ssh -p 29418 review.example.com gerrit review --abandon 8242,2
+$ ssh -p 29418 review.example.com gerrit review --abandon 8242,2
 ----
 
 == SEE ALSO
diff --git a/Documentation/cmd-set-account.txt b/Documentation/cmd-set-account.txt
index 276306e..6808e017 100644
--- a/Documentation/cmd-set-account.txt
+++ b/Documentation/cmd-set-account.txt
@@ -110,7 +110,7 @@
 Add an email and SSH key to `watcher`'s account:
 
 ----
-    $ cat ~/.ssh/id_watcher.pub | ssh -p 29418 review.example.com gerrit set-account --add-ssh-key - --add-email mail@example.com watcher
+$ cat ~/.ssh/id_watcher.pub | ssh -p 29418 review.example.com gerrit set-account --add-ssh-key - --add-email mail@example.com watcher
 ----
 
 GERRIT
diff --git a/Documentation/cmd-set-head.txt b/Documentation/cmd-set-head.txt
index f444173..83bdf20 100644
--- a/Documentation/cmd-set-head.txt
+++ b/Documentation/cmd-set-head.txt
@@ -35,7 +35,7 @@
 Change HEAD of project `example` to `stable-2.11` branch:
 
 ----
-    $ ssh -p 29418 review.example.com gerrit set-head example --new-head stable-2.11
+$ ssh -p 29418 review.example.com gerrit set-head example --new-head stable-2.11
 ----
 
 GERRIT
diff --git a/Documentation/cmd-set-members.txt b/Documentation/cmd-set-members.txt
index 5fb2bb9..141cb33 100644
--- a/Documentation/cmd-set-members.txt
+++ b/Documentation/cmd-set-members.txt
@@ -1,7 +1,7 @@
 = gerrit set-members
 
 == NAME
-gerrit set-members - Set group members
+gerrit set-members - Set group members.
 
 == SYNOPSIS
 [verse]
@@ -59,16 +59,16 @@
 Add alice and bob, but remove eve from the groups my-committers and
 my-verifiers.
 ----
-	$ ssh -p 29418 review.example.com gerrit set-members \
-	  -a alice@example.com -a bob@example.com \
-	  -r eve@example.com my-committers my-verifiers
+$ ssh -p 29418 review.example.com gerrit set-members \
+  -a alice@example.com -a bob@example.com \
+  -r eve@example.com my-committers my-verifiers
 ----
 
 Include the group my-friends into the group my-committers, but
 exclude the included group my-testers from the group my-committers.
 ----
-	$ ssh -p 29418 review.example.com gerrit set-members \
-	  -i my-friends -e my-testers my-committers
+$ ssh -p 29418 review.example.com gerrit set-members \
+  -i my-friends -e my-testers my-committers
 ----
 
 GERRIT
diff --git a/Documentation/cmd-set-project-parent.txt b/Documentation/cmd-set-project-parent.txt
index 6e2328c..801f15a 100644
--- a/Documentation/cmd-set-project-parent.txt
+++ b/Documentation/cmd-set-project-parent.txt
@@ -20,7 +20,11 @@
 the project to inherit through another one.
 
 == ACCESS
-Caller must be a member of the privileged 'Administrators' group.
+Caller must be a member of the privileged 'Administrators' group
+or, if
+link:config-gerrit.html#receive.allowProjectOwnersToChangeParent[receive.allowProjectOwnersToChangeParent]
+is enabled, be a project owner of the projects that is getting their
+parent updated.
 
 == SCRIPTING
 This command is intended to be used in scripts.
@@ -47,14 +51,14 @@
 Configure `kernel/omap` to inherit permissions from `kernel/common`:
 
 ----
-	$ ssh -p 29418 review.example.com gerrit set-project-parent --parent kernel/common kernel/omap
+$ ssh -p 29418 review.example.com gerrit set-project-parent --parent kernel/common kernel/omap
 ----
 
 Reparent all children of `myParent` to `myOtherParent`:
 
 ----
-	$ ssh -p 29418 review.example.com gerrit set-project-parent \
-	  --children-of myParent --parent myOtherParent
+$ ssh -p 29418 review.example.com gerrit set-project-parent \
+  --children-of myParent --parent myOtherParent
 ----
 
 == SEE ALSO
diff --git a/Documentation/cmd-set-project.txt b/Documentation/cmd-set-project.txt
index 7282e28..45b31ff 100644
--- a/Documentation/cmd-set-project.txt
+++ b/Documentation/cmd-set-project.txt
@@ -105,8 +105,8 @@
 and use 'merge if necessary' as merge strategy:
 
 ----
-    $ ssh -p 29418 review.example.com gerrit set-project example --submit-type MERGE_IF_NECESSARY\
-    --change-id true --content-merge false --project-state HIDDEN
+$ ssh -p 29418 review.example.com gerrit set-project example --submit-type MERGE_IF_NECESSARY \
+  --change-id true --content-merge false --project-state HIDDEN
 ----
 
 GERRIT
diff --git a/Documentation/cmd-set-reviewers.txt b/Documentation/cmd-set-reviewers.txt
index eb4335b..5e367c6 100644
--- a/Documentation/cmd-set-reviewers.txt
+++ b/Documentation/cmd-set-reviewers.txt
@@ -1,7 +1,7 @@
 = gerrit set-reviewers
 
 == NAME
-gerrit set-reviewers - Add or remove reviewers to a change
+gerrit set-reviewers - Add or remove reviewers to a change.
 
 == SYNOPSIS
 [verse]
@@ -56,32 +56,32 @@
 
 Add reviewers alice and bob, but remove eve from change Iac6b2ac2.
 ----
-	$ ssh -p 29418 review.example.com gerrit set-reviewers \
-	  -a alice@example.com -a bob@example.com \
-	  -r eve@example.com \
-	  Iac6b2ac2
+$ ssh -p 29418 review.example.com gerrit set-reviewers \
+  -a alice@example.com -a bob@example.com \
+  -r eve@example.com \
+  Iac6b2ac2
 ----
 
 Add reviewer elvis to old-style change id 1935 specifying that the change is in project "graceland"
 ----
-	$ ssh -p 29418 review.example.com gerrit set-reviewers \
-	  --project graceland \
-	  -a elvis@example.com \
-	  1935
+$ ssh -p 29418 review.example.com gerrit set-reviewers \
+  --project graceland \
+  -a elvis@example.com \
+  1935
 ----
 
 Add all project owners as reviewers to change Iac6b2ac2.
 ----
-	$ ssh -p 29418 review.example.com gerrit set-reviewers \
-	  -a "'Project Owners'" \
-	  Iac6b2ac2
+$ ssh -p 29418 review.example.com gerrit set-reviewers \
+  -a "'Project Owners'" \
+  Iac6b2ac2
 ----
 
 Add all project owners as reviewers to commit 13dff08acca571b22542ebd2e31acf4572ea0b86.
 ----
-	$ ssh -p 29418 review.example.com gerrit set-reviewers \
-	  -a "'Project Owners'" \
-	  13dff08acca571b22542ebd2e31acf4572ea0b86
+$ ssh -p 29418 review.example.com gerrit set-reviewers \
+  -a "'Project Owners'" \
+  13dff08acca571b22542ebd2e31acf4572ea0b86
 ----
 
 GERRIT
diff --git a/Documentation/cmd-show-caches.txt b/Documentation/cmd-show-caches.txt
index 6a1f554..050118b 100644
--- a/Documentation/cmd-show-caches.txt
+++ b/Documentation/cmd-show-caches.txt
@@ -1,7 +1,7 @@
 = gerrit show-caches
 
 == NAME
-gerrit show-caches - Display current cache statistics
+gerrit show-caches - Display current cache statistics.
 
 == SYNOPSIS
 [verse]
@@ -51,43 +51,42 @@
 == EXAMPLES
 
 ----
-  $ ssh -p 29418 review.example.com gerrit show-caches
-  Gerrit Code Review        2.9                       now   11:14:13   CEST
-                                                   uptime    6 days 20 hrs
-    Name                          |Entries              |  AvgGet |Hit Ratio|
-                                  |   Mem   Disk   Space|         |Mem  Disk|
-  --------------------------------+---------------------+---------+---------+
-    accounts                      |  4096               |   3.4ms | 99%     |
-    adv_bases                     |                     |         |         |
-    changes                       |                     |  27.1ms |  0%     |
-    groups                        |  5646               |  11.8ms | 97%     |
-    groups_bymember               |                     |         |         |
-    groups_byname                 |                     |         |         |
-    groups_bysubgroup             |   230               |   2.4ms | 62%     |
-    groups_byuuid                 |  5612               |  29.2ms | 99%     |
-    groups_external               |     1               |   1.5s  | 98%     |
-    groups_subgroups              |  5714               |  19.7ms | 99%     |
-    ldap_group_existence          |                     |         |         |
-    ldap_groups                   |   650               | 680.5ms | 99%     |
-    ldap_groups_byinclude         |  1024               |         | 83%     |
-    ldap_usernames                |   390               |   3.8ms | 81%     |
-    permission_sort               | 16384               |         | 99%     |
-    plugin_resources              |                     |         |         |
-    project_list                  |     1               |   3.8s  | 99%     |
-    projects                      |  6477               |   2.9ms | 99%     |
-    sshkeys                       |  2048               |  12.5ms | 99%     |
-  D diff                          |  1299  62033 132.36m|  22.0ms | 85%  99%|
-  D diff_intraline                | 12777 218651 128.45m| 171.1ms | 31%  96%|
-  D git_tags                      |     3      6  11.85k|         |  0% 100%|
-  D web_sessions                  |  1024 151714  59.10m|         | 99%  57%|
+$ ssh -p 29418 review.example.com gerrit show-caches
+Gerrit Code Review        2.9                       now   11:14:13   CEST
+                                                 uptime    6 days 20 hrs
+  Name                          |Entries              |  AvgGet |Hit Ratio|
+                                |   Mem   Disk   Space|         |Mem  Disk|
+--------------------------------+---------------------+---------+---------+
+  accounts                      |  4096               |   3.4ms | 99%     |
+  adv_bases                     |                     |         |         |
+  changes                       |                     |  27.1ms |  0%     |
+  groups                        |  5646               |  11.8ms | 97%     |
+  groups_bymember               |                     |         |         |
+  groups_byname                 |                     |         |         |
+  groups_bysubgroup             |   230               |   2.4ms | 62%     |
+  groups_byuuid                 |  5612               |  29.2ms | 99%     |
+  groups_external               |     1               |   1.5s  | 98%     |
+  ldap_group_existence          |                     |         |         |
+  ldap_groups                   |   650               | 680.5ms | 99%     |
+  ldap_groups_byinclude         |  1024               |         | 83%     |
+  ldap_usernames                |   390               |   3.8ms | 81%     |
+  permission_sort               | 16384               |         | 99%     |
+  plugin_resources              |                     |         |         |
+  project_list                  |     1               |   3.8s  | 99%     |
+  projects                      |  6477               |   2.9ms | 99%     |
+  sshkeys                       |  2048               |  12.5ms | 99%     |
+D diff                          |  1299  62033 132.36m|  22.0ms | 85%  99%|
+D diff_intraline                | 12777 218651 128.45m| 171.1ms | 31%  96%|
+D git_tags                      |     3      6  11.85k|         |  0% 100%|
+D web_sessions                  |  1024 151714  59.10m|         | 99%  57%|
 
-  SSH:    385  users, oldest session started    6 days 20 hrs ago
-  Tasks:   10  total =    6 running +      0 ready +    4 sleeping
-  Mem:  14.94g total =   3.04g used +  11.89g free +  10.00m buffers
-        28.44g max
-           107 open files
+SSH:    385  users, oldest session started    6 days 20 hrs ago
+Tasks:   10  total =    6 running +      0 ready +    4 sleeping
+Mem:  14.94g total =   3.04g used +  11.89g free +  10.00m buffers
+      28.44g max
+         107 open files
 
-  Threads: 4 CPUs available, 371 threads
+Threads: 4 CPUs available, 371 threads
 ----
 
 == SEE ALSO
diff --git a/Documentation/cmd-show-connections.txt b/Documentation/cmd-show-connections.txt
index 2f70e3c..c5274e1 100644
--- a/Documentation/cmd-show-connections.txt
+++ b/Documentation/cmd-show-connections.txt
@@ -1,7 +1,7 @@
 = gerrit show-connections
 
 == NAME
-gerrit show-connections - Display active client SSH connections
+gerrit show-connections - Display active client SSH connections.
 
 == SYNOPSIS
 [verse]
@@ -65,20 +65,20 @@
 
 With reverse DNS lookup (default):
 ----
-	$ ssh -p 29418 review.example.com gerrit show-connections
-	Session     Start     Idle   User            Remote Host
-	--------------------------------------------------------------
-	3abf31e6 20:09:02 00:00:00  jdoe            jdoe-desktop.example.com
-	--
+$ ssh -p 29418 review.example.com gerrit show-connections
+Session     Start     Idle   User            Remote Host
+--------------------------------------------------------------
+3abf31e6 20:09:02 00:00:00  jdoe            jdoe-desktop.example.com
+--
 ----
 
 Without reverse DNS lookup:
 ----
-	$ ssh -p 29418 review.example.com gerrit show-connections -n
-	Session     Start     Idle   User            Remote Host
-	--------------------------------------------------------------
-	3abf31e6 20:09:02 00:00:00  a/1001240       10.0.0.1
-	--
+$ ssh -p 29418 review.example.com gerrit show-connections -n
+Session     Start     Idle   User            Remote Host
+--------------------------------------------------------------
+3abf31e6 20:09:02 00:00:00  a/1001240       10.0.0.1
+--
 ----
 
 GERRIT
diff --git a/Documentation/cmd-show-queue.txt b/Documentation/cmd-show-queue.txt
index 141f7e2..005ffe0 100644
--- a/Documentation/cmd-show-queue.txt
+++ b/Documentation/cmd-show-queue.txt
@@ -1,7 +1,8 @@
 = gerrit show-queue
 
 == NAME
-gerrit show-queue - Display the background work queues, including replication and indexing
+gerrit show-queue - Display the background work queues, including replication
+and indexing.
 
 == SYNOPSIS
 [verse]
@@ -75,13 +76,13 @@
 and `dst2`:
 
 ----
-	$ ssh -p 29418 review.example.com gerrit show-queue
-	Task     State                 Command
-	------------------------------------------------------------------------------
-	7aae09b2 14:31:15.435          mirror dst1:/home/git/tools/gerrit.git
-	9ad09d27 14:31:25.434          mirror dst2:/var/cache/tools/gerrit.git
-	------------------------------------------------------------------------------
-	  2 tasks
+$ ssh -p 29418 review.example.com gerrit show-queue
+Task     State                 Command
+------------------------------------------------------------------------------
+7aae09b2 14:31:15.435          mirror dst1:/home/git/tools/gerrit.git
+9ad09d27 14:31:25.434          mirror dst2:/var/cache/tools/gerrit.git
+------------------------------------------------------------------------------
+2 tasks
 ----
 
 GERRIT
diff --git a/Documentation/cmd-stream-events.txt b/Documentation/cmd-stream-events.txt
index 557c777..8f24a47 100644
--- a/Documentation/cmd-stream-events.txt
+++ b/Documentation/cmd-stream-events.txt
@@ -1,6 +1,6 @@
 = gerrit stream-events
 == NAME
-gerrit stream-events - Monitor events occurring in real time
+gerrit stream-events - Monitor events occurring in real time.
 
 == SYNOPSIS
 [verse]
@@ -37,16 +37,16 @@
 == EXAMPLES
 
 ----
-  $ ssh -p 29418 review.example.com gerrit stream-events
-  {"type":"comment-added",change:{"project":"tools/gerrit", ...}, ...}
-  {"type":"comment-added",change:{"project":"tools/gerrit", ...}, ...}
+$ ssh -p 29418 review.example.com gerrit stream-events
+{"type":"comment-added",change:{"project":"tools/gerrit", ...}, ...}
+{"type":"comment-added",change:{"project":"tools/gerrit", ...}, ...}
 ----
 
 Only subscribe to specific event types:
 
 ----
-  $ ssh -p 29418 review.example.com gerrit stream-events \
-      -s patchset-created -s ref-replicated
+$ ssh -p 29418 review.example.com gerrit stream-events \
+   -s patchset-created -s ref-replicated
 ----
 
 == SCHEMA
diff --git a/Documentation/cmd-suexec.txt b/Documentation/cmd-suexec.txt
index 16338ba..9808edc 100644
--- a/Documentation/cmd-suexec.txt
+++ b/Documentation/cmd-suexec.txt
@@ -1,7 +1,7 @@
 = suexec
 
 == NAME
-suexec - Execute a command as any registered user account
+suexec - Execute a command as any registered user account.
 
 == SYNOPSIS
 [verse]
@@ -49,13 +49,13 @@
 
 Approve the change with commit c0ff33 as "Verified +1" as user bob@example.com
 ----
-  $ sudo -u gerrit ssh -p 29418 \
-    -i site_path/etc/ssh_host_rsa_key \
-    "Gerrit Code Review@localhost" \
-    suexec \
-    --as bob@example.com \
-    -- \
-    gerrit approve --verified +1 c0ff33
+$ sudo -u gerrit ssh -p 29418 \
+  -i site_path/etc/ssh_host_rsa_key \
+  "Gerrit Code Review@localhost" \
+  suexec \
+  --as bob@example.com \
+  -- \
+  gerrit approve --verified +1 c0ff33
 ----
 
 GERRIT
diff --git a/Documentation/cmd-test-submit-rule.txt b/Documentation/cmd-test-submit-rule.txt
index b8c4380..33cf2ea 100644
--- a/Documentation/cmd-test-submit-rule.txt
+++ b/Documentation/cmd-test-submit-rule.txt
@@ -29,29 +29,29 @@
 
 Test submit_rule from stdin and return the results as JSON.
 ----
- cat rules.pl | ssh -p 29418 review.example.com gerrit test-submit rule -s I78f2c6673db24e4e92ed32f604c960dc952437d9
- [
-   {
-     "status": "NOT_READY",
-     "reject": {
-       "Any-Label-Name": {}
-     }
-   }
- ]
+cat rules.pl | ssh -p 29418 review.example.com gerrit test-submit rule -s I78f2c6673db24e4e92ed32f604c960dc952437d9
+[
+  {
+    "status": "NOT_READY",
+    "reject": {
+      "Any-Label-Name": {}
+    }
+  }
+]
 ----
 
 Test the active submit_rule from the refs/meta/config branch, ignoring filters in the project parents.
 ----
- $ ssh -p 29418 review.example.com gerrit test-submit rule I78f2c6673db24e4e92ed32f604c960dc952437d9 --no-filters
- [
-   {
-     "status": "NOT_READY",
-     "need": {
-       "Code-Review": {}
-       "Verified": {}
-     }
-   }
- ]
+$ ssh -p 29418 review.example.com gerrit test-submit rule I78f2c6673db24e4e92ed32f604c960dc952437d9 --no-filters
+[
+  {
+    "status": "NOT_READY",
+    "need": {
+      "Code-Review": {}
+      "Verified": {}
+    }
+  }
+]
 ----
 
 == SCRIPTING
diff --git a/Documentation/cmd-test-submit-type.txt b/Documentation/cmd-test-submit-type.txt
index 508684f..48e5e75 100644
--- a/Documentation/cmd-test-submit-type.txt
+++ b/Documentation/cmd-test-submit-type.txt
@@ -29,14 +29,14 @@
 
 Test submit_type from stdin and return the submit type.
 ----
- cat rules.pl | ssh -p 29418 review.example.com gerrit test-submit type -s I78f2c6673db24e4e92ed32f604c960dc952437d9
- "MERGE_IF_NECESSARY"
+cat rules.pl | ssh -p 29418 review.example.com gerrit test-submit type -s I78f2c6673db24e4e92ed32f604c960dc952437d9
+"MERGE_IF_NECESSARY"
 ----
 
 Test the active submit_type from the refs/meta/config branch, ignoring filters in the project parents.
 ----
- $ ssh -p 29418 review.example.com gerrit test-submit type I78f2c6673db24e4e92ed32f604c960dc952437d9 --no-filters
- "MERGE_IF_NECESSARY"
+$ ssh -p 29418 review.example.com gerrit test-submit type I78f2c6673db24e4e92ed32f604c960dc952437d9 --no-filters
+"MERGE_IF_NECESSARY"
 ----
 
 == SCRIPTING
diff --git a/Documentation/cmd-version.txt b/Documentation/cmd-version.txt
index 85b0491..cdfc779 100644
--- a/Documentation/cmd-version.txt
+++ b/Documentation/cmd-version.txt
@@ -1,7 +1,7 @@
 = gerrit version
 
 == NAME
-gerrit version - Show the version of the currently executing Gerrit server
+gerrit version - Show the version of the currently executing Gerrit server.
 
 == SYNOPSIS
 [verse]
@@ -34,8 +34,8 @@
 == EXAMPLES
 
 ----
-	$ ssh -p 29418 review.example.com gerrit version
-	gerrit version 2.4.2
+$ ssh -p 29418 review.example.com gerrit version
+gerrit version 2.4.2
 ----
 
 GERRIT
diff --git a/Documentation/concept-changes.txt b/Documentation/concept-changes.txt
index f24d515..1d275b4 100644
--- a/Documentation/concept-changes.txt
+++ b/Documentation/concept-changes.txt
@@ -169,7 +169,7 @@
 
 Gerrit uses a Change-Id to identify which patch sets belong to the same review.
 For example, you make a change to a project. A reviewer supplies some feedback,
-which you address in a second commit. By assigning the same Change-Id to both
+which you address in an amended commit. By assigning the same Change-Id to both
 commits, Gerrit can attach those commits to the same change.
 
 Change-Ids are appended to the end of a commit message, and resemble the
diff --git a/Documentation/config-accounts.txt b/Documentation/config-accounts.txt
index 35e6800..13e663e 100644
--- a/Documentation/config-accounts.txt
+++ b/Documentation/config-accounts.txt
@@ -202,9 +202,8 @@
 If the value for a preference is the same as the default value for this
 preference, it can be omitted in the `preferences.config` file.
 
-Defaults for general and diff preferences that apply for all accounts
-can be configured in the `refs/users/default` branch in the `All-Users`
-repository.
+Defaults for preferences that apply for all accounts can be configured
+in the `refs/users/default` branch in the `All-Users` repository.
 
 [[project-watches]]
 === Project Watches
@@ -297,6 +296,11 @@
 an external ID is used only once (e.g. an external ID can never be
 assigned to multiple accounts at a point in time).
 
+[IMPORTANT]
+If the external ID key is changed manually you must adapt the note key
+to the new SHA1. Otherwise the external ID becomes inconsistent and is
+ignored by Gerrit.
+
 The note content is a Git config file:
 
 ----
diff --git a/Documentation/config-auto-site-initialization.txt b/Documentation/config-auto-site-initialization.txt
index acd03c9..1be0af9 100644
--- a/Documentation/config-auto-site-initialization.txt
+++ b/Documentation/config-auto-site-initialization.txt
@@ -27,15 +27,14 @@
 run for that site. The database connectivity, in that case, is defined
 in the `etc/gerrit.config`.
 
-If `gerrit.site_path` is not defined then Gerrit will try to find the
-`gerrit.init_path` system property. If defined this property will be
-used to determine the site path. The database connectivity, also for
-this case, is defined by the `jdbc/ReviewDb` JNDI property.
+`gerrit.site_path` system property must be defined to run the init for
+that site.
 
 [WARNING]
 Defining the `jdbc/ReviewDb` JNDI property for an H2 database under the
-path defined by either `gerrit.site_path` or `gerrit.init_path` will
-cause an incomplete auto initialization and Gerrit will fail to start.
+path defined by `gerrit.site_path` will cause an incomplete auto
+initialization and Gerrit will fail to start.
+
 Opening a connection to such a database will create a subfolder under the
 site path folder (in order to create the H2 database) and Gerrit will
 no longer consider that site path to be new and, because of that,
diff --git a/Documentation/config-gerrit.txt b/Documentation/config-gerrit.txt
index f161635..7a458f9 100644
--- a/Documentation/config-gerrit.txt
+++ b/Documentation/config-gerrit.txt
@@ -7,8 +7,9 @@
 
 [NOTE]
 The contents of the `etc/gerrit.config` file are cached at startup
-by Gerrit.  If you modify any properties in this file, Gerrit needs
-to be restarted before it will use the new values.
+by Gerrit. For most properties, if they are modified in this file, Gerrit
+needs to be restarted before it will use the new values. Some properties
+support being link:#reloadConfig[`reloaded`]' without restart.
 
 Sample `etc/gerrit.config`:
 ----
@@ -19,6 +20,14 @@
   directory = /var/cache/gerrit
 ----
 
+[[reloadConfig]]
+=== Reload `etc/gerrit.config`
+Some properties support being reloaded without restart when a `reload config`
+command is issued through link:cmd-reload-config.html[`SSH`] or the
+link:rest-api-config.html#reload-config[`REST API`]. If a property supports
+this it is specified in the documentation for the property below.
+
+
 [[accountPatchReviewDb]]
 === Section accountPatchReviewDb
 
@@ -127,6 +136,8 @@
 This setting only applies for adding reviewers in the Gerrit Web UI,
 but is ignored when adding reviewers with the
 link:cmd-set-reviewers.html[set-reviewers] command.
++
+This value supports link:#reloadConfig[configuration reloads].
 
 [[addreviewer.maxAllowed]]addreviewer.maxAllowed::
 +
@@ -137,6 +148,8 @@
 be added at once by adding a group as reviewer.
 +
 Default is 20.
++
+This value supports link:#reloadConfig[configuration reloads].
 
 [[addReviewer.baseWeight]]addReviewer.baseWeight::
 +
@@ -603,7 +616,10 @@
 existing accounts this username is already in lower case. It is not
 possible to convert the usernames of the existing accounts to lower
 case because this would break the access to existing per-user
-branches.
+branches and Gerrit provides no tool to do such a conversion.
++
+Setting this parameter to `true` will prevent all users from login that
+have a non-lower-case username.
 +
 This parameter only affects git over http and git over SSH traffic.
 +
@@ -648,6 +664,13 @@
 +
 By default, false.
 
+[[auth.skipFullRefEvaluationIfAllRefsAreVisible]]auth.skipFullRefEvaluationIfAllRefsAreVisible::
++
+Whether to skip the full ref visibility checks as a performance shortcut when all refs are
+visible to a user. Full ref filtering would filter out things like pending edits.
++
+By default, true.
+
 [[cache]]
 === Section cache
 
@@ -740,12 +763,26 @@
 * `"diff"`: default is `10m` (10 MiB of memory)
 * `"diff_intraline"`: default is `10m` (10 MiB of memory)
 * `"diff_summary"`: default is `10m` (10 MiB of memory)
+* `"external_ids_map"`: default is `2` and should not be changed
+* `"groups"`: default is unlimited
+* `"groups_byname"`: default is unlimited
+* `"groups_byuuid"`: default is unlimited
 * `"plugin_resources"`: default is 2m (2 MiB of memory)
 
 +
 If set to 0 the cache is disabled. Entries are removed immediately
 after being stored by the cache. This is primarily useful for testing.
 
+[[cache.name.expireFromMemoryAfterAccess]]cache.<name>.expireFromMemoryAfterAccess::
++
+Time after last access to automatically expire entries from an in-memory
+cache. If 0 or not specified, entries are never expired in this manner.
+Values may use unit suffixes as in link:#cache.name.maxAge[maxAge].
++
+This option only applies to in-memory caches; persistent cache values are
+not expired in this manner, and are only pruned via
+link:#cache.name.diskLimit[diskLimit].
+
 [[cache.name.diskLimit]]cache.<name>.diskLimit::
 +
 Total size in bytes of the keys and values stored on disk. Caches that
@@ -757,10 +794,12 @@
 +
 Default is 128 MiB per cache, except:
 +
+* `"change_notes"`: disk storage is disabled by default
 * `"diff_summary"`: default is `1g` (1 GiB of disk space)
+* `"external_ids_map"`: disk storage is disabled by default
 
 +
-If 0, disk storage for the cache is disabled.
+If 0 or negative, disk storage for the cache is disabled.
 
 ==== [[cache_names]]Standard Caches
 
@@ -827,6 +866,18 @@
 This should significantly speed up change reindexing, especially
 full offline reindexing.
 
+cache `"external_ids_map"`::
++
+A singleton cache whose sole entry is a map of the parsed representation
+of link:config-accounts.html#external-ids[all current external IDs]. The
+cache may temporarily contain 2 entries, but the second one is promptly
+expired.
++
+It is not recommended to change the in-memory attributes of this cache
+away from the defaults. The cache may be persisted by setting
+`diskLimit`, which is only recommended if cold start performance is
+problematic.
+
 cache `"git_tags"`::
 +
 If branch or reference level READ access controls are used, this
@@ -841,9 +892,40 @@
 
 cache `"groups"`::
 +
-Caches the basic group information from the `account_groups` table,
+Caches the basic group information of internal groups by group ID,
 including the group owner, name, and description.
 +
+For this cache it is important to configure a size that is larger than
+the number of internal Gerrit groups, otherwise general Gerrit
+performance may be poor. This is why by default this cache is
+unlimited.
++
+External group membership obtained from LDAP is cached under
+`"ldap_groups"`.
+
+cache `"groups_byname"`::
++
+Caches the basic group information of internal groups by group name,
+including the group owner, name, and description.
++
+For this cache it is important to configure a size that is larger than
+the number of internal Gerrit groups, otherwise general Gerrit
+performance may be poor. This is why by default this cache is
+unlimited.
++
+External group membership obtained from LDAP is cached under
+`"ldap_groups"`.
+
+cache `"groups_byuuid"`::
++
+Caches the basic group information of internal groups by group UUID,
+including the group owner, name, and description.
++
+For this cache it is important to configure a size that is larger than
+the number of internal Gerrit groups, otherwise general Gerrit
+performance may be poor. This is why by default this cache is
+unlimited.
++
 External group membership obtained from LDAP is cached under
 `"ldap_groups"`.
 
@@ -858,11 +940,6 @@
 Caches the parent groups of a subgroup.  If direct updates are made
 to the `account_group_includes` table, this cache should be flushed.
 
-cache `"groups_subgroups"`::
-+
-Caches subgroups.  If direct updates are made to the
-`account_group_includes` table, this cache should be flushed.
-
 cache `"ldap_groups"`::
 +
 Caches the LDAP groups that a user belongs to, if LDAP has been
@@ -900,6 +977,11 @@
 cache should be flushed.  Newly inserted projects do not require
 a cache flush, as they will be read upon first reference.
 
+cache `"prolog_rules"`::
++
+Caches parsed `rules.pl` contents for each project. This cache uses the same
+size as the `projects` cache, and cannot be configured independently.
+
 cache `"sshkeys"`::
 +
 Caches unpacked versions of user SSH keys, so the internal SSH daemon
@@ -1093,10 +1175,23 @@
 
 [[change.allowBlame]]change.allowBlame::
 +
-Allow blame on side by side diff. If set to false, blame cannot be used.
+Allow blame on side by side diff in the GWT UI. If set to false, blame cannot be
+used.
 +
 Default is true.
 
+[[change.api.allowedIdentifier]]change.api.allowedIdentifier::
++
+Change identifier(s) that are allowed on the API. See
+link:rest-api-changes.html#change-id[Change Id] for more information.
++
+Possible values are `ALL`, `TRIPLET`, `NUMERIC_ID`, `I_HASH`, and
+`COMMIT_HASH` or any combination of those as a string list.
+`PROJECT_NUMERIC_ID` is always allowed and doesn't need to be listed
+explicitly.
++
+Default is `ALL`.
+
 [[change.allowDrafts]]change.allowDrafts::
 +
 Legacy support for drafts workflow. If set to true, pushing a new change
@@ -1271,39 +1366,16 @@
 
 [[changeCleanup.startTime]]changeCleanup.startTime::
 +
-Start time to define the first execution of the change cleanups.
-If the configured `'changeCleanup.interval'` is shorter than
-`'changeCleanup.startTime - now'` the start time will be preponed by
-the maximum integral multiple of `'changeCleanup.interval'` so that the
-start time is still in the future.
-+
-----
-<day of week> <hours>:<minutes>
-or
-<hours>:<minutes>
-
-<day of week> : Mon, Tue, Wed, Thu, Fri, Sat, Sun
-<hours>       : 00-23
-<minutes>     : 0-59
-----
-
+The link:#schedule-configuration-startTime[start time] for running
+change cleanups.
 
 [[changeCleanup.interval]]changeCleanup.interval::
 +
-Interval for periodic repetition of triggering the change cleanups.
-The interval must be larger than zero. The following suffixes are supported
-to define the time unit for the interval:
-+
-* `s, sec, second, seconds`
-* `m, min, minute, minutes`
-* `h, hr, hour, hours`
-* `d, day, days`
-* `w, week, weeks` (`1 week` is treated as `7 days`)
-* `mon, month, months` (`1 month` is treated as `30 days`)
-* `y, year, years` (`1 year` is treated as `365 days`)
+The link:#schedule-configuration-interval[interval] for running
+change cleanups.
 
-link:#schedule-examples[Schedule examples] can be found in the
-link:#gc[gc] section.
+link:#schedule-configuration-examples[Schedule examples] can be found
+in the link:#schedule-configuration[Schedule Configuration] section.
 
 [[commentlink]]
 === Section commentlink
@@ -1321,6 +1393,10 @@
 configuration 'tracker' uses raw HTML to more precisely control
 how the replacement is displayed to the user.
 
+commentlinks supports link:#reloadConfig[configuration reloads]. Though a
+link:cmd-flush-caches.html[flush-caches] of "projects" is needed for the
+commentlinks to be immediately available in the UI.
+
 ----
 [commentlink "changeid"]
   match = (I[0-9a-f]{8,40})
@@ -1357,10 +1433,13 @@
 example, to match the string `bug` in a case insensitive way the match
 pattern `[bB][uU][gG]` needs to be used.
 +
-The regular expression pattern is applied to the HTML form of the message
-in question, which means it needs to assume the data has been escaped.
-So `"` needs to be matched as `&amp;quot;`, `<` as `&amp;lt;`, and `'` as
-`&amp;#39;`.
+Between the GWT UI and PolyGerrit, the commentlink.name.match regular
+expressions are applied differently. Whereas in the GWT UI the
+expressions are applied to the formatted and escaped HTML result, the
+PolyGerrit UI applies them only to the raw, unformatted and unescaped
+text form. PolyGerrit does not support regex matching against HTML.
+Comment link patterns that are written in this style should be updated
+to match text formats.
 +
 A common pattern to match is `bug\\s+(\\d+)`.
 
@@ -1970,59 +2049,16 @@
 
 [[gc.startTime]]gc.startTime::
 +
-Start time to define the first execution of the git garbage collection.
-If the configured `'gc.interval'` is shorter than `'gc.startTime - now'`
-the start time will be preponed by the maximum integral multiple of
-`'gc.interval'` so that the start time is still in the future.
-+
-----
-<day of week> <hours>:<minutes>
-or
-<hours>:<minutes>
-
-<day of week> : Mon, Tue, Wed, Thu, Fri, Sat, Sun
-<hours>       : 00-23
-<minutes>     : 0-59
-----
-
+The link:#schedule-configuration-startTime[start time] for running the
+git garbage collection.
 
 [[gc.interval]]gc.interval::
 +
-Interval for periodic repetition of triggering the git garbage collection.
-The interval must be larger than zero. The following suffixes are supported
-to define the time unit for the interval:
-+
-* `s, sec, second, seconds`
-* `m, min, minute, minutes`
-* `h, hr, hour, hours`
-* `d, day, days`
-* `w, week, weeks` (`1 week` is treated as `7 days`)
-* `mon, month, months` (`1 month` is treated as `30 days`)
-* `y, year, years` (`1 year` is treated as `365 days`)
+The link:#schedule-configuration-interval[interval] for running the
+git garbage collection.
 
-[[schedule-examples]]
-Examples::
-+
-----
-gc.startTime = Fri 10:30
-gc.interval  = 2 day
-----
-+
-Assuming the server is started on Mon 7:00 -> `'startTime - now = 4 days 3:30 hours'`.
-This is larger than the interval hence prepone the start time
-by the maximum integral multiple of the interval so that start
-time is still in the future, i.e. prepone by 4 days. This yields
-a start time of Mon 10:30, next executions are Wed 10:30, Fri 10:30
-etc.
-+
-----
-gc.startTime = 6:00
-gc.interval = 1 day
-----
-+
-Assuming the server is started on Mon 7:00 this yields the first run on next Tuesday
-at 6:00 and a repetition interval of 1 day.
-
+link:#schedule-configuration-examples[Schedule examples] can be found
+in the link:#schedule-configuration[Schedule Configuration] section.
 
 [[gerrit]]
 === Section gerrit
@@ -2138,6 +2174,39 @@
   installModule = com.example.abc.OurSpecialSauceModule
 ----
 
+[[gerrit.listProjectsFromIndex]]gerrit.listProjectsFromIndex::
++
+Enable rendering of project list from the secondary index instead
+of purely relying on the in-memory cache.
++
+By default false.
++
+[NOTE]
+The in-memory cache (set to false) rendering provides an **unlimited list** as a result
+of the list project API, causing the full list of projects to be
+returned as a result of the link:rest-api-projects.html[/projects/] REST API
+or the link:cmd-ls-projects.html[gerrit ls-projects] SSH command.
+When the rendering from the secondary index (set to true),
+the **list is limited** by the global capability
+link:access-control.html#capability_queryLimit[queryLimit]
+which is defaulted to 500 entries.
+
+[[gerrit.primaryWeblinkName]]gerrit.primaryWeblinkName::
++
+Name of the link:dev-plugins.html#links-to-external-tools[Weblink] that should
+be chosen in cases where only one Weblink can be used in the UI, for example in
+inline links.
++
+By default unset, meaning that the UI is responsible for trying to identify
+a weblink to be used in these cases, most likely weblinks that links to code
+browsers with known integrations with Gerrit (like Gitiles and Gitweb).
++
+Example:
+----
+[gerrit]
+  primaryWeblinkName = gitiles
+----
+
 [[gerrit.reportBugUrl]]gerrit.reportBugUrl::
 +
 URL to direct users to when they need to report a bug.
@@ -2180,19 +2249,19 @@
 +
 Path prefix for PolyGerrit's static resources if using a CDN.
 
-[[gerrit.ui]]gerrit.ui::
+[[gerrit.faviconPath]]gerrit.faviconPath::
 +
-Default UI when the user does not request a different preference via argument
-or cookie.
+Path for PolyGerrit's favicon after link:#gerrit.canonicalWebUrl[default URL],
+including icon name and extension (.ico should be used).
+
+
+[[gerrit.instanceName]]gerrit.instanceName::
 +
-* `GWT` for the old-style Google Web Toolkit-based interface.
-* `POLYGERRIT` for the new Polymer-based HTML5 Web interface.
+Short identifier for this Gerrit instance.
+A good name should be short but precise enough so that users can identify the instance among others.
 +
-A sanity check during startup is performed that the value of
-gerrit.ui is an enabled UI.
-+
-Defaults to GWT (if GWT is enabled) or POLYGERRIT (if POLYGERRIT is
-enabled and GWT is disabled)
+Defaults to the full hostname of the Gerrit server.
+
 
 [[gerrit.serverId]]gerrit.serverId::
 +
@@ -2747,16 +2816,16 @@
 it to 0 disables the dedicated thread pool and indexing will be done in the same
 thread as the operation.
 +
-If not set or set to a negative value, defaults to 1 plus half of the number of
-logical CPUs as returned by the JVM.
+If not set or set to a zero, defaults to the number of logical CPUs as returned
+by the JVM. If set to a negative value, defaults to a direct executor.
 
 [[index.batchThreads]]index.batchThreads::
 +
 Number of threads to use for indexing in background operations, such as
 online schema upgrades.
 +
-If not set or set to a negative value, defaults to the number of logical
-CPUs as returned by the JVM.
+If not set or set to a zero, defaults to the number of logical CPUs as returned
+by the JVM. If set to a negative value, defaults to a direct executor.
 
 [[index.onlineUpgrade]]index.onlineUpgrade::
 +
@@ -2828,6 +2897,62 @@
 +
 Defaults to false.
 
+[[index.scheduledIndexer]]
+==== Subsection index.scheduledIndexer
+
+This section configures periodic indexing. Periodic indexing is
+intended to run only on slaves and only updates the group index.
+Replication to slaves happens on Git level so that Gerrit is not aware
+of incoming replication events. But slaves need an updated group index
+to resolve memberships of users for ACL validation. To keep the group
+index in slaves up-to-date the Gerrit slave periodically scans the
+group refs in the All-Users repository to reindex groups if they are
+stale.
+
+The scheduled reindexer is not able to detect group deletions that
+happened while the slave was offline, but since group deletions are not
+supported this should never happen. If nevertheless groups refs were
+deleted while a slave was offline a full offline link:pgm-reindex.html[
+reindex] must be performed.
+
+This section is only used if Gerrit runs in slave mode, otherwise it is
+ignored.
+
+[[index.scheduledIndexer.runOnStartup]]index.scheduledIndexer.runOnStartup::
++
+Whether the scheduled indexer should run once immediately on startup.
+If set to `true` the slave startup is blocked until all stale groups
+were reindexed. Enabling this allows to prevent that slaves that were
+offline for a longer period of time run with outdated group information
+until the first scheduled indexing is done.
++
+Defaults to `true`.
+
+[[index.scheduledIndexer.enabled]]index.scheduledIndexer.enabled::
++
+Whether the scheduled indexer is enabled. If the scheduled indexer is
+disabled you must implement other means to keep the group index for the
+slave up-to-date (e.g. by using ElasticSearch for the indexes).
++
+Defaults to `true`.
+
+[[index.scheduledIndexer.startTime]]index.scheduledIndexer.startTime::
++
+The link:#schedule-configuration-startTime[start time] for running
+the scheduled indexer.
++
+Defaults to `00:00`.
+
+[[index.scheduledIndexer.interval]]index.scheduledIndexer.interval::
++
+The link:#schedule-configuration-interval[interval] for running
+the scheduled indexer.
++
+Defaults to `5m`.
+
+link:#schedule-configuration-examples[Schedule examples] can be found
+in the link:#schedule-configuration[Schedule Configuration] section.
+
 ==== Lucene configuration
 
 Open and closed changes are indexed in separate indexes named
@@ -3025,11 +3150,17 @@
 ensure the end user's plaintext password is transmitted only over
 an encrypted connection.
 
+[[ldap.startTls]]ldap.startTls::
++
+If true, Gerrit will perform StartTLS extended operation.
++
+By default, false, StartTLS will not be enabled.
+
 [[ldap.sslVerify]]ldap.sslVerify::
 +
-If false and ldap.server is an `ldaps://` style URL, Gerrit
-will not verify the server certificate when it connects to
-perform a query.
+If false and ldap.server is an `ldaps://` style URL or `ldap.startTls`
+is true, Gerrit will not verify the server certificate when it connects
+to perform a query.
 +
 By default, true, requiring the certificate to be verified.
 
@@ -3387,6 +3518,19 @@
 +
 Defaults to true.
 
+[[log.compress]]log.compress::
++
+If set to true, log files are compressed at server startup and then daily at 11pm
+(in the server's local time zone).
++
+Defaults to true.
+
+[[log.rotate]]log.rotate::
++
+If set to true, log files are rotated daily at midnight (GMT).
++
+Defaults to true.
+
 [[mimetype]]
 === Section mimetype
 
@@ -3435,25 +3579,6 @@
 +
 By default, 1.
 
-[[noteDb.retryMaxWait]]noteDb.retryMaxWait::
-+
-Maximum time to wait between attempts to retry update operations when one
-attempt fails due to contention (aka lock failure) on the underlying ref
-storage. Operations are retried with exponential backoff, plus some random
-jitter, until the interval reaches this limit. After that, retries continue to
-occur after a fixed timeout (plus jitter), up to
-link:#noteDb.retryTimeout[`noteDb.retryTimeout`].
-+
-Defaults to 5 seconds; unit suffixes are supported, and assumes milliseconds if
-not specified.
-
-[[noteDb.retryTimeout]]noteDb.retryTimeout::
-+
-Total timeout for retrying update operations when one attempt fails due to
-contention (aka lock failure) on the underlying ref storage.
-+
-Defaults to 20 seconds; unit suffixes are supported, and assumes milliseconds if
-not specified.
 
 [[oauth]]
 === Section oauth
@@ -3550,6 +3675,17 @@
 If no groups are added, any user will be allowed to execute
 'receive-pack' on the server.
 
+[[receive.allowPushToRefsChanges]]receive.allowPushToRefsChanges::
++
+If true, it is possible to push directly to a change using `refs/changes/`.
+The possibility to push to `refs/changes/` is deprecated and it might be
+removed in future releases.
+See link:user-upload.html#manual_replacement_mapping[Manual Replacement Mapping].
++
+False means pushing to `refs/changes/` is prohibited.
++
+Defaults to false.
+
 [[receive.certNonceSeed]]receive.certNonceSeed::
 +
 If set to a non-empty value and server-side signed push validation is
@@ -3599,6 +3735,20 @@
 +
 Default is true.
 
+[[receive.allowProjectOwnersToChangeParent]]receive.allowProjectOwnersToChangeParent::
++
+If true, Gerrit will allow project owners to change the parent of a project.
++
+By default only Gerrit administrators are allowed to change the parent
+of a project. By allowing project owners to change parents, it may
+allow the owner to circumvent certain enforced rules (like important
+BLOCK rules).
++
+Default is false.
++
+This value supports configuration reloads:
+link:cmd-reload-config.html[reload-config]
+
 [[receive.checkReferencedObjectsAreReachable]]receive.checkReferencedObjectsAreReachable::
 +
 If set to true, Gerrit will validate that all referenced objects that
@@ -3719,7 +3869,6 @@
 If no keys are specified, web-of-trust checks are disabled. This is the
 default behavior.
 
-
 [[repository]]
 === Section repository
 
@@ -3765,15 +3914,19 @@
 [[repository.name.defaultSubmitType]]repository.<name>.defaultSubmitType::
 +
 The default submit type for newly created projects. Supported values
-are `MERGE_IF_NECESSARY`, `FAST_FORWARD_ONLY`, `REBASE_IF_NECESSARY`,
+are `INHERIT`, `MERGE_IF_NECESSARY`, `FAST_FORWARD_ONLY`, `REBASE_IF_NECESSARY`,
 `REBASE_ALWAYS`, `MERGE_ALWAYS` and `CHERRY_PICK`.
 +
 For more details see link:project-configuration.html#submit_type[Submit Types].
 +
+Default is link:project-configuration.html#submit_type_inherit[`INHERIT`].
++
 This submit type is only applied at project creation time if a submit type is
 omitted from the link:rest-api-projects.html#project-input[ProjectInput]. If the
-submit type is unset in the project config at runtime, it defaults to
-link:project-configuration.html#merge_if_necessary[`MERGE_IF_NECESSARY`].
+submit type is unset in the project config at runtime, for backwards
+compatibility purposes, it defaults to
+link:project-configuration.html#merge_if_necessary[`MERGE_IF_NECESSARY`] rather
+than `INHERIT`.
 
 [[repository.name.ownerGroup]]repository.<name>.ownerGroup::
 +
@@ -3781,6 +3934,40 @@
 groups are allowed.  Each on its own line.  Groups which don't exist
 in the database are ignored.
 
+[[retry]]
+=== Section retry
+
+[[retry.maxWait]]retry.maxWait::
++
+Maximum time to wait between attempts to retry an operations when one attempt
+fails (e.g. on NoteDb updates due to contention, aka lock failure, on the
+underlying ref storage). Operations are retried with exponential backoff, plus
+some random jitter, until the interval reaches this limit. After that, retries
+continue to occur after a fixed timeout (plus jitter), up to
+link:#retry.timeout[`retry.timeout`].
++
+Defaults to 5 seconds; unit suffixes are supported, and assumes milliseconds if
+not specified.
+
+[[retry.timeout]]retry.timeout::
++
+Total timeout for retrying operations when one attempt fails.
++
+It is possible to overwrite this default timeout based on operation types by
+setting link:#retry.operationType.timeout[`retry.<operationType>.timeout`].
++
+Defaults to 20 seconds; unit suffixes are supported, and assumes milliseconds if
+not specified.
+
+[[retry.operationType.timeout]]retry.<operationType>.timeout::
++
+Total timeout for retrying operations of type `<operationType>` when one
+attempt fails. `<operationType>` can be `ACCOUNT_UPDATE`, `CHANGE_UPDATE`,
+`GROUP_UPDATE` and `INDEX_QUERY`.
++
+Defaults to link:#retry.timeout[`retry.timeout`]; unit suffixes are supported,
+and assumes milliseconds if not specified.
+
 [[rules]]
 === Section rules
 
@@ -3849,6 +4036,15 @@
 +
 Default is 1.
 
+[[execution.fanOutThreadPoolSize]]execution.fanOutThreadPoolSize::
++
+Maximum size of thread pool to on which a serving thread can fan-out
+work to parallelize it.
++
+When set to 0, a direct executor will be used.
++
+By default, 25 which means that formatting happens in the caller thread.
+
 [[receiveemail]]
 === Section receiveemail
 
@@ -4116,6 +4312,17 @@
 +
 Defaults to an empty list, meaning no additional TLDs are allowed.
 
+
+[[sendemail.addInstanceNameInSubject]]sendemail.addInstanceNameInSubject::
++
+When set to true, Gerrit will add its short name to the email subject, allowing recipients to quickly identify
+what Gerrit instance the email came from.
++
+The short name can be customized via the gerrit.instanceName option.
++
+Defaults to false.
+
+
 [[site]]
 === Section site
 
@@ -4463,6 +4670,8 @@
 programmatic configuration.
 +
 By default, `true`.
++
+This value supports link:#reloadConfig[configuration reloads].
 
 [[sshd.rekeyBytesLimit]]sshd.rekeyBytesLimit::
 +
@@ -4490,6 +4699,8 @@
 The maximum numbers of reviewers suggested.
 +
 By default 10.
++
+This value supports link:#reloadConfig[configuration reloads].
 
 [[suggest.from]]suggest.from::
 +
@@ -4504,7 +4715,7 @@
 
 [[theme.backgroundColor]]theme.backgroundColor::
 +
-Background color for the page, and major data tables like the all
+_(GWT UI only)_ Background color for the page, and major data tables like the all
 open changes table or the account dashboard. The value must be a
 valid HTML hex color code, or standard color name.
 +
@@ -4512,7 +4723,7 @@
 
 [[theme.topMenuColor]]theme.topMenuColor::
 +
-This is the color of the main menu bar at the top of the page.
+_(GWT UI only)_ This is the color of the main menu bar at the top of the page.
 The value must be a valid HTML hex color code, or standard color
 name.
 +
@@ -4520,53 +4731,52 @@
 
 [[theme.textColor]]theme.textColor::
 +
-Text color for the page, and major data tables like the all
-open changes table or the account dashboard. The value must be a
-valid HTML hex color code, or standard color name.
+_(GWT UI only)_ Text color for the page, and major data tables like the all open
+changes table or the account dashboard. The value must be a valid HTML hex color
+code, or standard color name.
 +
 By default dark grey, `353535`.
 
 [[theme.trimColor]]theme.trimColor::
 +
-Primary color used as a background color behind text.  This is
-the color of the main menu bar at the top, of table headers,
-and of major UI areas that we want to offset from other portions
-of the page.  The value must be a valid HTML hex color code, or
-standard color name.
+_(GWT UI only)_ Primary color used as a background color behind text.  This is
+the color of the main menu bar at the top, of table headers, and of major UI
+areas that we want to offset from other portions of the page.  The value must be
+a valid HTML hex color code, or standard color name.
 +
 By default a light grey, `EEEEEE`.
 
 [[theme.selectionColor]]theme.selectionColor::
 +
-Background color used within a trimColor area to denote the currently
-selected tab, or the background color used in a table to denote the
-currently selected row.  The value must be a valid HTML hex color
-code, or standard color name.
+_(GWT UI only)_ Background color used within a trimColor area to denote the
+currently selected tab, or the background color used in a table to denote the
+currently selected row.  The value must be a valid HTML hex color code, or
+standard color name.
 +
 By default a pale blue, `D8EDF9`.
 
 [[theme.changeTableOutdatedColor]]theme.changeTableOutdatedColor::
 +
-Background color used for patch outdated messages.  The value must be
-a valid HTML hex color code, or standard color name.
+_(GWT UI only)_ Background color used for patch outdated messages.  The value
+must be a valid HTML hex color code, or standard color name.
 +
 By default a shade of red, `F08080`.
 
 [[theme.tableOddRowColor]]theme.tableOddRowColor::
 +
-Background color for tables such as lists of open reviews for odd
-rows.  This is so you can have a different color for odd and even
-rows of the table.  The value must be a valid HTML hex color code,
-or standard color name.
+_(GWT UI only)_ Background color for tables such as lists of open reviews for
+odd rows.  This is so you can have a different color for odd and even rows of
+the table.  The value must be a valid HTML hex color code, or standard color
+name.
 +
 By default transparent.
 
 [[theme.tableEvenRowColor]]theme.tableEvenRowColor::
 +
-Background color for tables such as lists of open reviews for even
-rows.  This is so you can have a different color for odd and even
-rows of the table.  The value must be a valid HTML hex color code,
-or standard color name.
+_(GWT UI only)_ Background color for tables such as lists of open reviews for
+even rows.  This is so you can have a different color for odd and even rows of
+the table.  The value must be a valid HTML hex color code, or standard color
+name.
 +
 By default transparent.
 
@@ -4676,9 +4886,8 @@
 [[upload]]
 === Section upload
 
-Sets the group of users allowed to execute 'upload-pack' on the
-server, 'upload-pack' is what runs on the server during a user's
-fetch, clone or repo sync command.
+Options to control the behavior of `upload-pack` on the server side,
+which handles a user's fetch, clone, or repo sync command.
 
 ----
 [upload]
@@ -4688,8 +4897,8 @@
 
 [[upload.allowGroup]]upload.allowGroup::
 +
-Name of the groups of users that are allowed to execute 'upload-pack'
-on the server. One or more groups can be set.
+Name of the groups of users that are allowed to execute 'upload-pack'.
+One or more groups can be set.
 +
 If no groups are added, any user will be allowed to execute
 'upload-pack' on the server.
@@ -4703,34 +4912,16 @@
 
 [[accountDeactivation.startTime]]accountDeactivation.startTime::
 +
-Start time to define the first execution of account deactivations.
-If the configured `'accountDeactivation.interval'` is shorter than `'accountDeactivation.startTime - now'`
-the start time will be preponed by the maximum integral multiple of
-`'accountDeactivation.interval'` so that the start time is still in the future.
-+
-----
-<day of week> <hours>:<minutes>
-or
-<hours>:<minutes>
-
-<day of week> : Mon, Tue, Wed, Thu, Fri, Sat, Sun
-<hours>       : 00-23
-<minutes>     : 0-59
-----
+The link:#schedule-configuration-startTime[start time] for running
+account deactivations.
 
 [[accountDeactivation.interval]]accountDeactivation.interval::
 +
-Interval for periodic repetition of triggering account deactivation sweeps.
-The interval must be larger than zero. The following suffixes are supported
-to define the time unit for the interval:
-+
-* `s, sec, second, seconds`
-* `m, min, minute, minutes`
-* `h, hr, hour, hours`
-* `d, day, days`
-* `w, week, weeks` (`1 week` is treated as `7 days`)
-* `mon, month, months` (`1 month` is treated as `30 days`)
-* `y, year, years` (`1 year` is treated as `365 days`)
+The link:#schedule-configuration-interval[interval] for running
+account deactivations.
+
+link:#schedule-configuration-examples[Schedule examples] can be found
+in the link:#schedule-configuration[Schedule Configuration] section.
 
 [[urlAlias]]
 === Section urlAlias
@@ -4836,7 +5027,90 @@
 Username that is displayed in the Gerrit Web UI and in e-mail
 notifications if the full name of the user is not set.
 +
-By default "Anonymous Coward" is used.
+By default "Name of user not set" is used.
+
+[[schedule-configuration]]
+=== Schedule Configuration
+
+Schedule configurations are used for running periodic background jobs.
+
+A schedule configuration consists of two parameters:
+
+[[schedule-configuration-interval]]
+* `interval`:
+Interval for running the periodic background job. The interval must be
+larger than zero. The following suffixes are supported to define the
+time unit for the interval:
+** `s`, `sec`, `second`, `seconds`
+** `m`, `min`, `minute`, `minutes`
+** `h`, `hr`, `hour`, `hours`
+** `d`, `day`, `days`
+** `w`, `week`, `weeks` (`1 week` is treated as `7 days`)
+** `mon`, `month`, `months` (`1 month` is treated as `30 days`)
+** `y`, `year`, `years` (`1 year` is treated as `365 days`)
+
+[[schedule-configuration-startTime]]
+* `startTime`:
+The start time defines the first execution of the periodic background
+job. If the configured `interval` is shorter than `startTime - now` the
+start time will be preponed by the maximum integral multiple of
+`interval` so that the start time is still in the future. `startTime`
+must have one of the following formats:
+
+** `<day of week> <hours>:<minutes>`
+** `<hours>:<minutes>`
+
++
+The placeholders can have the following values:
+
+*** `<day of week>`:
+`Mon`, `Tue`, `Wed`, `Thu`, `Fri`, `Sat`, `Sun`
+*** `<hours>`:
+`00`-`23`
+*** `<minutes>`:
+`00`-`59`
+
++
+The time zone cannot be specified but is always the system default
+time zone.
+
+The section (and optionally the subsection) in which the `interval` and
+`startTime` keys must be set depends on the background job for which a
+schedule should be configured. E.g. for the change cleanup job the keys
+must be set in the link:#changeCleanup[changeCleanup] section:
+
+----
+  [changeCleanup]
+    startTime = Fri 10:30
+    interval  = 2 days
+----
+
+[[schedule-configuration-examples]]
+Examples for a schedule configuration:
+
+* Example 1:
++
+----
+  startTime = Fri 10:30
+  interval  = 2 days
+----
++
+Assuming that the server is started on `Mon 07:00` then
+`startTime - now` is `4 days 3:30 hours`. This is larger than the
+interval hence the start time is preponed by the maximum integral
+multiple of the interval so that start time is still in the future,
+i.e. preponed by 4 days. This yields a start time of `Mon 10:30`, next
+executions are `Wed 10:30`, `Fri 10:30`. etc.
+
+* Example 2:
++
+----
+  startTime = 06:00
+  interval = 1 day
+----
++
+Assuming that the server is started on `Mon 07:00` then this yields the
+first run on Tuesday at 06:00 and a repetition interval of 1 day.
 
 [[secure.config]]
 == File `etc/secure.config`
@@ -4878,16 +5152,6 @@
 The format is one Base-64 encoded public key per line.
 
 
-== Database system_config
-
-Several columns in the `system_config` table within the metadata
-database may be set to control how Gerrit behaves.
-
-[NOTE]
-The contents of the `system_config` table are cached at startup
-by Gerrit.  If you modify any columns in this table, Gerrit needs
-to be restarted before it will use the new values.
-
 == Configuring the Polygerrit UI
 
 Please see link:dev-polygerrit.html[UI] on configuring the Polygerrit UI.
diff --git a/Documentation/config-groups.txt b/Documentation/config-groups.txt
new file mode 100644
index 0000000..4db4cb3
--- /dev/null
+++ b/Documentation/config-groups.txt
@@ -0,0 +1,109 @@
+
+= Gerrit Code Review - Groups
+
+== Overview
+
+In Gerrit, we assign permissions to groups of accounts. These groups
+can be provided by an external system such as LDAP, but Gerrit also
+has a group system built-in ("internal groups")
+
+Starting from 2.16, these internal groups are fully stored in
+link:note-db.html[NoteDb].
+
+A group is characterized by the following information:
+
+* list of members (accounts)
+* list of subgroups
+* properties
+  - visibleToAll
+  - group owner
+
+Groups are keyed by the following unique identifiers:
+
+* GroupID, the former database key (a sequential number)
+
+* UUID, an opaque identifier. Internal groups use a 40 byte hex string
+as UUID
+
+* Name: Gerrit enforces that group names are unique
+
+== Storage format
+
+Group data is stored in the
+link:config-accounts.html#all-users[`All-Users` repository]. For each
+group, there is a ref, stored as a sharded UUID, e.g.
+
+----
+  refs/groups/ef/deafbeefdeafbeefdeafbeefdeafbeefdeafbeef
+----
+
+The ref points to commits holding files. The files are
+
+* `members`, holding numeric account IDs of members, one per line
+* `subgroups`, holding group UUIDs of subgroups, one per line
+* `group.config`, holding further configuration.
+
+The `group.config` file follows the following format
+
+----
+[group]
+  name = <name of the group>
+  id = 42
+  visibleToAll = false
+  description = <description of the group>
+  groupOwnerUuid = <UUID of the owner group>
+----
+
+Gerrit updates the ref for a group based on REST API calls, and the
+commit log effectively forms an audit log which shows how group
+membership evolved over time.
+
+To ensure uniqueness of the name, a separate ref
+`refs/meta/group-names` contains a notemap, ie. a map represented as a
+branch with a flat list of files.
+
+The format of this map is as follows:
+
+* keys are the normal SHA1 of the group name
+* values are blobs that look like
++
+----
+[group]
+  name = <name of the group>
+  uuid = <hex UUID identifier of the group>
+----
+
+To ensure uniqueness of the sequential ID, the ID for each new group
+is taken from the sequence counter under `refs/sequences/groups`,
+which works analogously to the ones for accounts and changes.
+
+== Visibility
+
+Group ownership together with `visibleToAll` determines visibility of
+the groups in the REST API.
+
+Fetching a group ref is permitted to the group's owners that also have
+READ permissions on the ref. For users that are not owners, the
+permissions on the ref are ignored. In addition, anyone with the
+link:access-control.html#capability_accessDatabase[Access Database]
+capability can read all group refs. The `refs/meta/group-names` ref is
+visible only to users with the
+link:access-control.html#capability_accessDatabase[Access Database]
+capability.
+
+== Pushing to group refs
+
+Validation on push for changes to the group ref is not implemented, so
+pushes are rejected. Pushes that bypass Gerrit should be avoided since
+the names, IDs and UUIDs must be internally consistent between all the
+branches involved. In addition, group references should not be created
+or deleted manually either. If you attempt any of these actions
+anyway, don't forget to link:rest-api-groups.html#index-group[Index
+Group] reindex the affected groups manually.
+
+== Replication
+
+In a replicated setting (eg. backups and or master/slave
+configurations), all refs in the `All-Users` project must be copied
+onto all replicas, including `refs/groups/*`, `refs/meta/group-names`
+and `refs/sequences/groups`.
diff --git a/Documentation/config-labels.txt b/Documentation/config-labels.txt
index 47396ef..ff43520 100644
--- a/Documentation/config-labels.txt
+++ b/Documentation/config-labels.txt
@@ -95,7 +95,7 @@
   [label "Verified"]
       function = MaxWithBlock
       value = -1 Fails
-      value =  0 No score
+      value = 0 No score
       value = +1 Verified
       copyAllScoresIfNoCodeChange = true
 ----
@@ -219,9 +219,9 @@
 
 * `AnyWithBlock`
 +
-The lowest possible negative value, if present, blocks a submit, Any
-other value enables a submit. To permit blocking submits, ensure
-that a negative value is defined.
+The label is not mandatory but the lowest possible negative value,
+if present, blocks a submit. To permit blocking submits, ensure that a
+negative value is defined.
 
 * `MaxNoBlock`
 +
@@ -238,7 +238,9 @@
 The `PatchSetLock` function provides a locking mechanism for patch
 sets.  This function's values are not considered when determining
 whether a change is submittable. When set, no new patchsets can be
-created and rebase and abandon are blocked.
+created and rebase and abandon are blocked. This is useful to prevent
+updates to a change while (potentially expensive) CI
+validation is running.
 +
 This function is designed to allow overlapping locks, so several lock
 accounts could lock the same change.
@@ -368,6 +370,18 @@
 ignored if the label doesn't apply for that branch.
 Additionally, the `branch` modifier has no effect when the submit rule
 is customized in the rules.pl of the project or inherited from parent projects.
+Branch can be a ref pattern similar to what is documented
+link:access-control.html#reference[here], but must not contain `${username}` or
+`${shardeduserid}`.
+
+[[label_ignoreSelfApproval]]
+=== `label.Label-Name.ignoreSelfApproval`
+
+If true, the label may be voted on by the uploader of the latest patch set,
+but their approval does not make a change submittable. Instead, a
+non-uploader who has the right to vote has to approve the change.
+
+Defaults to false.
 
 [[label_example]]
 === Example
@@ -379,7 +393,7 @@
   [label "Copyright-Check"]
       function = MaxWithBlock
       value = -1 Do not have copyright
-      value =  0 No score
+      value = 0 No score
       value = +1 Copyright clear
 ----
 
@@ -401,7 +415,7 @@
       value = -3 Ohh, hell no!
       value = -2 Hmm, I'm not a fan
       value = -1 I'm not sure I like this
-      value =  0 No score
+      value = 0 No score
       value = +1 I like, but need another to like it as well
       value = +2 Hmm, this is pretty nice
       value = +3 Ohh, hell yes!
diff --git a/Documentation/config-mail.txt b/Documentation/config-mail.txt
index 9eb31bf..ef6a488 100644
--- a/Documentation/config-mail.txt
+++ b/Documentation/config-mail.txt
@@ -7,8 +7,9 @@
 them and easily modify them to tweak their contents.
 
 *Compatibility Note:* previously, Velocity Template Language (VTL) was used as
-the template language for Gerrit emails. VTL has now been deprecated in favor of
-Soy, but Velocity templates that modify text emails remain supported for now.
+the template language for Gerrit emails. Support for VTL has now been removed
+in favor of Soy, and Velocity templates that modify text emails are no longer
+supported.
 
 == Template Locations and Extensions
 
@@ -203,6 +204,11 @@
 +
 The subject limited to 72 characters, with an ellipsis if it exceeds that.
 
+$change.shortOriginalSubject::
++
+The original subject limited to 72 characters, with an ellipsis if it exceeds
+that.
+
 $change.ownerEmail::
 +
 The email address of the owner of the change.
@@ -219,6 +225,14 @@
 +
 The project name with the path abbreviated.
 
+$instanceAndProjectName::
++
+The Gerrit instance name, followed by the short project name
+
+$addInstanceNameInSubject::
++
+Whether the instance name should be included in the email subject.
+
 $sshHost::
 +
 SSH hostname for the Gerrit instance.
@@ -231,6 +245,14 @@
 +
 The refname of the patch set.
 
+$patchSetInfo.authorName::
++
+The name of the author of the patch set.
+
+$patchSetInfo.authorEmail::
++
+The email address of the author of the patch set.
+
 GERRIT
 ------
 Part of link:index.html[Gerrit Code Review]
diff --git a/Documentation/config-plugins.txt b/Documentation/config-plugins.txt
index 0a7f5a9..190d003 100644
--- a/Documentation/config-plugins.txt
+++ b/Documentation/config-plugins.txt
@@ -39,6 +39,14 @@
 The core plugins are developed and maintained by the Gerrit maintainers
 and the Gerrit community.
 
+[[codemirror-editor]]
+=== codemirror-editor
+
+CodeMirror plugin for polygerrit.
+
+link:https://gerrit-review.googlesource.com/admin/repos/plugins/codemirror-editor[
+Project] |
+
 [[commit-message-length-validator]]
 === commit-message-length-validator
 
@@ -454,6 +462,14 @@
 link:https://gerrit-review.googlesource.com/admin/repos/plugins/metrics-reporter-jmx[
 Project].
 
+[[metrics-reporter-prometheus]]
+=== metrics-reporter-prometheus
+
+This plugin exposes Gerrit metrics for consumption by Prometheus.
+
+link:https://gerrit-review.googlesource.com/admin/repos/plugins/metrics-reporter-prometheus[
+Project].
+
 [[motd]]
 === motd
 
diff --git a/Documentation/config-project-config.txt b/Documentation/config-project-config.txt
index 016c846..4456484 100644
--- a/Documentation/config-project-config.txt
+++ b/Documentation/config-project-config.txt
@@ -127,7 +127,11 @@
 +
 Controls whether or not the Change-Id must be included in the commit message
 in the last paragraph. Default is `INHERIT`, which means that this property
-is inherited from the parent project.
+is inherited from the parent project. The global default for new hosts
+is `true`
++
+This option is deprecated and future releases will behave as if this
+is always `true`.
 
 [[receive.maxObjectSizeLimit]]receive.maxObjectSizeLimit::
 +
@@ -256,6 +260,11 @@
 This option only takes effect in submit strategies which already modify the commit, i.e.
 Cherry Pick, Rebase Always, and (perhaps) Rebase If Necessary.
 
+- 'rejectEmptyCommit': Defines whether empty commits should be rejected when a change is merged.
+Changes might not seem empty at first but when attempting to merge, rebasing can lead to an empty
+commit. If this option is set to 'true' the merge would fail. An empty commit is still allowed as
+the initial commit on a branch.
+
 Merge strategy
 
 
diff --git a/Documentation/config-validation.txt b/Documentation/config-validation.txt
index c54717b..24932a8 100644
--- a/Documentation/config-validation.txt
+++ b/Documentation/config-validation.txt
@@ -114,6 +114,14 @@
 Plugins implementing the `OutgoingEmailValidationListener` interface can perform
 filtering of outgoing e-mails just before they are sent.
 
+[[account-activation-validation]]
+== Account activation validation
+
+
+Plugins implementing the `AccountActivationValidationListener` interface can
+perform validation when an account is activated or deactivated via the Gerrit
+REST API or the Java extension API.
+
 
 GERRIT
 ------
diff --git a/Documentation/database-setup.txt b/Documentation/database-setup.txt
index 2153751..de4fb20 100644
--- a/Documentation/database-setup.txt
+++ b/Documentation/database-setup.txt
@@ -12,7 +12,7 @@
 Using the embedded H2 database is the easiest way to get a Gerrit
 site up and running, making it ideal for proof of concepts or small team
 servers.  On the flip side, H2 is not the recommended option for large
-corporate installations. This is because there is no easy way to interact
+corporate installations when using ReviewDb. This is because there is no easy way to interact
 with the database while Gerrit is offline, it's not easy to backup the data,
 and it's not possible to set up H2 in a load balanced/hotswap configuration.
 
diff --git a/Documentation/dev-bazel.txt b/Documentation/dev-bazel.txt
index 2e7cb23..0ecc820 100644
--- a/Documentation/dev-bazel.txt
+++ b/Documentation/dev-bazel.txt
@@ -1,21 +1,71 @@
 = Gerrit Code Review - Building with Bazel
 
 [[installation]]
-== Installation
+== Prerequisites
 
-You need to use Python (2 or 3), Java 8, and Node.js for building gerrit.
+To build Gerrit from source, you need:
 
-You can install Bazel from the bazel.io:
-https://www.bazel.io/versions/master/docs/install.html
+* A Linux or macOS system (Windows is not supported at this time)
+* A JDK for Java 8|9|10
+* Python 2 or 3
+* Node.js
+* link:https://www.bazel.io/versions/master/docs/install.html[Bazel]
+* Maven
+* zip, unzip
+* gcc
 
+[[Java 10 support]]
+Java 10 is supported through vanilla java toolchain
+link:https://docs.bazel.build/versions/master/toolchains.html[Bazel option].
+To build Gerrit with Java 10, specify vanilla java toolchain and provide
+path to Java 10 home:
+
+```
+  $ bazel build --host_javabase=:absolute_javabase \
+    --define=ABSOLUTE_JAVABASE=<path-to-java-10> \
+    --define=USE_ABSOLUTE_JAVABASE=true \
+    --host_java_toolchain=//:toolchain_vanilla \
+    --java_toolchain=//:toolchain_vanilla \
+    :release
+```
+
+Note that the following options must be added to `container.javaOptions`
+in `$gerrit_site/etc/gerrit.config` to run Gerrit with Java 10:
+
+```
+[container]
+  javaOptions = --add-modules java.activation
+  javaOptions = --add-opens=jdk.management/com.sun.management.internal=ALL-UNNAMED
+```
+
+[[Java 9 support]]
+Java 9 is supported through alternative java toolchain
+link:https://docs.bazel.build/versions/master/toolchains.html[Bazel option].
+The Java 9 support is backwards compatible. Java 8 is still the default.
+To build Gerrit with Java 9, specify JDK 9 java toolchain:
+
+```
+  $ bazel build \
+      --host_java_toolchain=@bazel_tools//tools/jdk:toolchain_java9 \
+      --java_toolchain=@bazel_tools//tools/jdk:toolchain_java9 \
+      :release
+```
+
+Note that the following option must be added to `container.javaOptions`
+in `$gerrit_site/etc/gerrit.config` to run Gerrit with Java 9:
+
+```
+[container]
+  javaOptions = --add-modules java.activation \
+      --add-opens=jdk.management/com.sun.management.internal=ALL-UNNAMED
+```
 
 [[build]]
 == Building on the Command Line
 
 === Gerrit Development WAR File
 
-To build the Gerrit web application that includes the GWT UI and the
-PolyGerrit UI:
+To build the Gerrit web application that includes the PolyGerrit UI:
 
 ----
   bazel build gerrit
@@ -49,7 +99,8 @@
 
 === Headless Mode
 
-To build Gerrit in headless mode, i.e. without the GWT Web UI:
+To build Gerrit in headless mode, i.e. without the PolyGerrit and GWT
+Web UI:
 
 ----
   bazel build headless
@@ -198,13 +249,13 @@
 Debug test example:
 
 ----
-  bazel test --test_output=streamed --test_filter=com.google.gerrit.acceptance.api.change.ChangeIT.getAmbiguous //gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change:api_change
+  bazel test --test_output=streamed --test_filter=com.google.gerrit.acceptance.api.change.ChangeIT.getAmbiguous //javatests/com/google/gerrit/acceptance/api/change:api_change
 ----
 
 To run a specific test group, e.g. the rest-account test group:
 
 ----
-  bazel test //gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account:rest_account
+  bazel test //javatests/com/google/gerrit/acceptance/rest/account:rest_account
 ----
 
 To run the tests against NoteDb backend with write
@@ -395,6 +446,92 @@
 details. Users should watch the cache sizes and clean them manually if
 necessary.
 
+[[npm-binary]]
+== NPM Binaries
+
+Parts of the PolyGerrit build require running NPM-based JavaScript programs as
+"binaries". We don't attempt to resolve and download NPM dependencies at build
+time, but instead use pre-built bundles of the NPM binary along with all its
+dependencies. Some packages on
+link:https://docs.npmjs.com/misc/registry[registry.npmjs.org] come with their
+dependencies bundled, but this is the exception rather than the rule. More
+commonly, to add a new binary to this list, you will need to bundle the binary
+yourself.
+
+[NOTE]
+We can only use binaries that meet certain licensing requirements, and that do
+not include any native code.
+
+Start by checking that the license and file types of the bundle are acceptable:
+[source,bash]
+----
+  gerrit_repo=/path/to/gerrit
+  package=some-npm-package
+  version=1.2.3
+
+  npm install -g license-checker && \
+  rm -rf /tmp/$package-$version && mkdir -p /tmp/$package-$version && \
+  cd /tmp/$package-$version && \
+  npm install $package@$version && \
+  license-checker | grep licenses: | sort -u
+----
+
+This will output a list of the different licenses used by the package and all
+its transitive dependencies. We can only legally distribute a bundle via our
+storage bucket if the licenses allow us to do so. As long as all of the listed
+license are allowed by
+link:https://opensource.google.com/docs/thirdparty/licenses/[Google's
+standards]. Any `by_exception_only`, commercial, prohibited, or unlisted
+licenses are not allowed; otherwise, it is ok to distribute the source. If in
+doubt, contact a maintainer who is a Googler.
+
+Next, check the file types:
+[source,bash]
+----
+  cd /tmp/$package-$version
+  find . -type f | xargs file | grep -v 'ASCII\|UTF-8\|empty$'
+----
+
+If you see anything that looks like a native library or binary, then we can't
+use the bundle.
+
+If everything looks good, create the bundle, and note the SHA-1:
+[source,bash]
+----
+  $gerrit_repo/tools/js/npm_pack.py $package $version && \
+  sha1sum $package-$version.tgz
+----
+
+This creates a file named `$package-$version.tgz` in your working directory.
+
+Any project maintainer can upload this file to the
+link:https://console.cloud.google.com/storage/browser/gerrit-maven/npm-packages[storage
+bucket].
+
+Finally, add the new binary to the build process:
+----
+  # WORKSPACE
+  npm_binary(
+      name = "some-npm-package",
+      repository = GERRIT,
+  )
+
+  # lib/js/npm.bzl
+  NPM_VERSIONS = {
+    ...
+    "some-npm-package": "1.2.3",
+  }
+
+  NPM_SHA1S = {
+    ...
+    "some-npm-package": "<sha1>",
+  }
+----
+
+To use the binary from the Bazel build, you need to use the `run_npm_binary.py`
+wrapper script. For an example, see the use of `crisper` in `tools/bzl/js.bzl`.
+
+
 GERRIT
 ------
 Part of link:index.html[Gerrit Code Review]
diff --git a/Documentation/dev-contributing.txt b/Documentation/dev-contributing.txt
index e6d54d8..e3ab7ce 100644
--- a/Documentation/dev-contributing.txt
+++ b/Documentation/dev-contributing.txt
@@ -368,6 +368,36 @@
 that they are vetted long enough before they go into a release and we can be sure
 that the update doesn't introduce a regression.
 
+[[deprecating-features]]
+=== Deprecating features
+
+Gerrit should be as stable as possible and we aim to add only features that last.
+However, sometimes we are required to deprecate and remove features to be able
+to move forward with the project and keep the code-base clean. The following process
+should serve as a guideline on how to deprecate functionality in Gerrit. Its purpose
+is that we have a structured process for deprecation that users, administrators and
+developers can agree and rely on.
+
+General process:
+* Make sure that the feature (e.g. a field on the API) is not needed anymore or blocks
+  further development or improvement. If in doubt, consult the mailing list.
+* If you can provide a schema migration that moves users to a comparable feature, do
+  so and stop here.
+* Mark the feature as deprecated in the documentation and release notes.
+* If possible, mark the feature deprecated in any user-visible interface. For example,
+  if you are deprecating a Git push option, add a message to the Git response if
+  the user provided the option informing them about deprecation.
+* Annotate the code with `@Deprecated` and `@RemoveAfter(x.xx)` if applicable.
+  Alternatively, use `// DEPRECATED, remove after x.xx` (where x.xx is the version
+  number that has to be branched off before removing the feature)
+* Gate the feature behind a config that is off by default (forcing admins to turn
+  the deprecated feature on explicitly).
+* After the next release was branched off, remove any code that backed the feature.
+
+You can optionally consult the mailing list to ask if there are users of the feature you
+wish to deprecate. If there are no major users, you can remove the feature without
+following this process and without the grace period of one release.
+
 GERRIT
 ------
 Part of link:index.html[Gerrit Code Review]
diff --git a/Documentation/dev-eclipse.txt b/Documentation/dev-eclipse.txt
index 6205858..c335a2d 100644
--- a/Documentation/dev-eclipse.txt
+++ b/Documentation/dev-eclipse.txt
@@ -3,7 +3,7 @@
 This document is about configuring Gerrit Code Review into an
 Eclipse workspace for development and debugging with GWT.
 
-Java 6 or later SDK is also required to run GWT's compiler and
+Java 8 or later SDK is also required to run GWT's compiler and
 runtime debugging environment.
 
 
@@ -49,6 +49,19 @@
 link:dev-build-plugins.html#_bundle_custom_plugin_in_release_war[bundling in release.war]
 and run `tools/eclipse/project.py`.
 
+[[Newer Java versions]]
+
+Java 9 and later are supported, but some adjustments must be done, because
+Java 8 is still the default:
+
+* Add JRE, e.g.: directory: /usr/lib64/jvm/java-9-openjdk, name: java-9-openjdk-9
+* Change execution environemnt for gerrit project to: JavaSE-9 (java-9-openjdk-9)
+* Check that compiler compliance level in gerrit project is set to: 9
+* Add this parameter to VM argument for gerrit_daemin launcher:
+----
+  --add-modules java.activation \
+  --add-opens=jdk.management/com.sun.management.internal=ALL-UNNAMED
+----
 
 [[Formatting]]
 == Code Formatter Settings
diff --git a/Documentation/dev-plugins.txt b/Documentation/dev-plugins.txt
index 534f0a8..53b03b1 100644
--- a/Documentation/dev-plugins.txt
+++ b/Documentation/dev-plugins.txt
@@ -109,6 +109,24 @@
   Gerrit-HttpModule: tld.example.project.HttpModuleClassName
 ----
 
+=== Batch runtime
+
+Gerrit can be run as a server, serving HTTP or SSH requests, or as an
+offline program. Plugins can contribute Guice modules to this batch
+runtime by binding `Gerrit-BatchModule` to one of their classes.
+The Guice injector is bound to less classes, and some Gerrit features
+will be absent - on purpose.
+
+This feature was originally introduced to support plugins during an
+offline reindexing task.
+
+----
+  Gerrit-BatchModule: tld.example.project.CoreModuleClassName
+----
+
+In this runtime, only the module designated by `Gerrit-BatchModule` is
+enabled, not `Gerrit-SysModule`.
+
 [[plugin_name]]
 === Plugin Name
 
@@ -410,6 +428,10 @@
 +
 Update of the group secondary index
 
+* `com.google.gerrit.server.extensions.events.ProjectIndexedListener`:
++
+Update of the project secondary index
+
 * `com.google.gerrit.httpd.WebLoginListener`:
 +
 User login or logout interactively on the Web user interface.
@@ -482,6 +504,15 @@
 submitted by Rebase Always and Cherry Pick submit strategies as well as
 change being queried with COMMIT_FOOTERS option.
 
+[[merge-super-set-computation]]
+== Merge Super Set Computation
+
+The algorithm to compute the merge super set to detect changes that
+should be submitted together can be customized by implementing
+`com.google.gerrit.server.git.MergeSuperSetComputation`.
+MergeSuperSetComputation is a DynamicItem, so Gerrit may only have one
+implementation.
+
 [[receive-pack]]
 == Receive Pack Initializers
 
@@ -752,7 +783,7 @@
 [source, java]
 ----
 public class SshModule extends AbstractModule {
-  private static final Logger log = LoggerFactory.getLogger(SshModule.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   @Override
   protected void configure() {
@@ -765,7 +796,7 @@
   public static class BanOptions implements DynamicOptions.DynamicBean {
     @Option(name = "--log", aliases = { "-l" }, usage = "Say Hello in the Log")
     private void parse(String arg) {
-      log.error("Say Hello in the Log " + arg);
+      logger.atSevere().log("Say Hello in the Log %s", arg);
     }
   }
 ----
@@ -777,10 +808,12 @@
 implementing the ChangeAttributeFactory interface and registering it to the
 ChangeQueryProcessor.ChangeAttributeFactory class in the plugin module's
 'configure()' method. The new attribute(s) will be output under a "plugin"
-attribute in the change query output.
+attribute in the change query output. This can be further controlled with an
+option registered in the Http and Ssh modules' 'configure*()' methods.
 
 The example below shows a plugin that adds two attributes ('exampleName' and
-'changeValue'), to the change query output.
+'changeValue'), to the change query output, when the query command is provided
+the --myplugin-name--all option.
 
 [source, java]
 ----
@@ -793,7 +826,31 @@
   }
 }
 
+public class MyQueryOptions implements DynamicBean {
+  @Option(name = "--all", usage = "Include plugin output")
+  public boolean all = false;
+}
+
+public static class HttpModule extends HttpPluginModule {
+  @Override
+  protected void configureServlets() {
+    bind(DynamicBean.class)
+        .annotatedWith(Exports.named(QueryChanges.class))
+        .to(MyQueryOptions.class);
+  }
+}
+
+public static class SshModule extends PluginCommandModule {
+  @Override
+  protected void configureCommands() {
+    bind(DynamicBean.class)
+        .annotatedWith(Exports.named(Query.class))
+        .to(MyQueryOptions.class);
+  }
+}
+
 public class AttributeFactory implements ChangeAttributeFactory {
+  protected MyQueryOptions options;
 
   public class PluginAttribute extends PluginDefinedInfo {
     public String exampleName;
@@ -807,7 +864,13 @@
 
   @Override
   public PluginDefinedInfo create(ChangeData c, ChangeQueryProcessor qp, String plugin) {
-    return new PluginAttribute(c);
+    if (options == null) {
+      options = (MyQueryOptions) qp.getDynamicBean(plugin);
+    }
+    if (options.all) {
+      return new PluginAttribute(c);
+    }
+    return null;
   }
 }
 ----
@@ -815,7 +878,7 @@
 Example
 ----
 
-ssh -p 29418 localhost gerrit query "change:1" --format json
+ssh -p 29418 localhost gerrit query --myplugin-name--all "change:1" --format json
 
 Output:
 
@@ -2236,7 +2299,7 @@
 link:rest-api-accounts.html#create-account[account creation] REST API and
 inject additional external identifiers for an account that represents a user
 in some external user store. For that, an implementation of the extension
-point `com.google.gerrit.server.api.accounts.AccountExternalIdCreator`
+point `com.google.gerrit.server.account.AccountExternalIdCreator`
 must be registered.
 
 [source,java]
@@ -2292,6 +2355,16 @@
 `com.google.gerrit.server.git.ChangeReportFormatter` interface, a plugin
 may change the formatting of the report.
 
+[[url-formatting]]
+== URL Formatting
+
+URLs to various parts of Gerrit are usually formed by adding suffixes to
+the canonical web URL.
+
+By implementing the
+`com.google.gerrit.server.config.UrlFormatter` interface, a plugin may
+change the format of the URL.
+
 [[links-to-external-tools]]
 == Links To External Tools
 
@@ -2503,7 +2576,7 @@
 attribute.
 
 Documentation may be written in the Markdown flavor
-link:https://github.com/sirthias/pegdown[pegdown]
+link:https://github.com/vsch/flexmark-java[flexmark-java]
 if the file name ends with `.md`. Gerrit will automatically convert
 Markdown to HTML if accessed with extension `.html`.
 
@@ -2703,10 +2776,10 @@
 [source, java]
 ----
 import com.google.gerrit.extensions.annotations.ExtensionPoint;
-import com.google.gerrit.server.mail.receive.MailMessage;
+import com.google.gerrit.mail.MailMessage;
 
 public class MyPlugin implements MailFilter {
-  boolean shouldProcessMessage(MailMessage message) {
+  public boolean shouldProcessMessage(MailMessage message) {
     // Implement your filter logic here
     return true;
   }
@@ -2728,10 +2801,128 @@
   @Override
   public String intercept(String in) {
     return pluginName + " mycommand";
+----
+
+
+[[pre-submit-evaluator]]
+== Pre-submit Validation Plugins
+
+Gerrit provides an extension point that enables plugins to prevent a change
+from being submitted.
+
+[IMPORTANT]
+This extension point **must NOT** be used for long or slow operations, like
+calling external programs or content, running unit tests...
+Slow operations will hurt the whole Gerrit instance.
+
+This can be used to implement custom rules that changes have to match to become
+submittable. A more concrete example: the Prolog rules engine can be
+implemented using this.
+
+Gerrit calls the plugins once per change and caches the results. Although it is
+possible to predict when this interface will be triggered, this should not be
+considered as a feature. Plugins should only rely on the internal state of the
+ChangeData, not on external values like date and time, remote content or
+randomness.
+
+Plugins are expected to support rules inheritance themselves, providing ways
+to configure it and handling the logic behind it.
+Please note that no inheritance is sometimes better than badly handled
+inheritance: mis-communication and strange behaviors caused by inheritance
+may and will confuse the users. Each plugins is responsible for handling the
+project hierarchy and taking wise actions. Gerrit does not enforce it.
+
+Once Gerrit has gathered every plugins' SubmitRecords, it stores them.
+
+Plugins accept or reject a given change using `SubmitRecord.Status`.
+If a change is ready to be submitted, `OK`. If it is not ready and requires
+modifications, `NOT_READY`. Other statuses are available for particular cases.
+A change can be submitted if all the plugins accept the change.
+
+Plugins may also decide not to vote on a given change by returning an empty
+Collection (ie: the plugin is not enabled for this repository), or to vote
+several times (ie: one SubmitRecord per project in the hierarchy).
+The results are handled as if multiple plugins voted for the change.
+
+If a plugin decides not to vote, it's name will not be displayed in the UI and
+it will not be recoded in the database.
+
+.Gerrit's Pre-submit handling with three plugins
+[width="50%",cols="^m,^m,^m,^m",frame="topbot",options="header"]
+|=======================================================
+|  Plugin A  |  Plugin B  |  Plugin C  | Final decision
+|     OK     |     OK     |     OK     | OK
+|     OK     |     OK     |     /      | OK
+|     OK     |     OK     | RULE_ERROR | NOT_READY
+|     OK     | NOT_READY  |     OK     | NOT_READY
+|  NOT_READY |     OK     |     OK     | NOT_READY
+|=======================================================
+
+
+This makes composing plugins really easy.
+
+- If a plugin places a veto on a change, it can't be submitted.
+- If a plugin isn't enabled for a project (or isn't needed for this change),
+  it returns an empty collection.
+- If all the plugins answer `OK`, the change can be submitted.
+
+
+A more rare case, but worth documenting: if there are no installed plugins,
+the labels will be compared to the rules defined in the project's config,
+and the permission system will be used to allow or deny a submit request.
+
+Some rules are defined internally to provide a common base ground (and sanity):
+changes that are marked as WIP or that are closed (abandoned, merged) can't be merged.
+
+
+[source, java]
+----
+import java.util.Collection;
+import com.google.gerrit.common.data.SubmitRecord;
+import com.google.gerrit.common.data.SubmitRecord.Status;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.rules.SubmitRule;
+
+public class MyPluginRules implements SubmitRule {
+  public Collection<SubmitRecord> evaluate(ChangeData changeData) {
+    // Implement your submitability logic here
+
+    // Assuming we want to prevent this change from being submitted:
+    SubmitRecord record;
+    record.status = Status.NOT_READY;
+    return record;
   }
 }
 ----
 
+Don't forget to register your class!
+
+[source, java]
+----
+import com.google.gerrit.extensions.annotations.Exports;
+import com.google.inject.AbstractModule;
+
+public class MyPluginModule extends AbstractModule {
+  @Override
+  protected void configure() {
+    bind(SubmitRule.class).annotatedWith(Exports.named("myPlugin")).to(MyPluginRules.class);
+  }
+}
+----
+
+Plugin authors should also consider binding their SubmitRule using a `Gerrit-BatchModule`.
+See link:dev-plugins.html[Batch runtime] for more informations.
+
+
+The SubmitRule extension point allows you to write complex rules, but writing
+small self-contained rules should be preferred: doing so allows end users to
+compose several rules to form more complex submit checks.
+
+The `SubmitRequirement` class allows rules to communicate what the user needs
+to change in order to be compliant. These requirements should be kept once they
+are met, but marked as `OK`. If the requirements were not displayed, reviewers
+would need to use their precious time to manually check that they were met.
+
 
 == SEE ALSO
 
diff --git a/Documentation/dev-polygerrit.txt b/Documentation/dev-polygerrit.txt
index 7898ae9..5621d32 100644
--- a/Documentation/dev-polygerrit.txt
+++ b/Documentation/dev-polygerrit.txt
@@ -1,18 +1,15 @@
 = PolyGerrit - GUI
 
-[IMPORTANT]
-PolyGerrit is still a beta feature...
-
-Missing features in PolyGerrit:
-
-- Inline Edit
-
-- And many more features missing.
-
 == Configuring
 
 By default both GWT and PolyGerrit UI are available to users.
 
+To make PolyGerrit the default UI but keep GWT as a secondary UI:
+----
+[gerrit]
+        ui = POLYGERRIT
+----
+
 To disable GWT but not PolyGerrit:
 ----
 [gerrit]
diff --git a/Documentation/dev-readme.txt b/Documentation/dev-readme.txt
index 5c24731..92d080b 100644
--- a/Documentation/dev-readme.txt
+++ b/Documentation/dev-readme.txt
@@ -1,16 +1,14 @@
-= Gerrit Code Review - Developer Setup
+= Gerrit Code Review: Developer Setup
 
-Google Bazel is needed to compile the code, and an SQL database to
-house the review metadata.  H2 is recommended for development
-databases, as it requires no external server process.
-
+To build a developer instance, you'll need link:https://bazel.build/[Bazel] to
+compile the code.
 
 == Getting the Source
 
 Create a new client workspace:
 
 ----
-  git clone --recursive https://gerrit.googlesource.com/gerrit
+  git clone --recurse-submodules https://gerrit.googlesource.com/gerrit
   cd gerrit
 ----
 
@@ -21,59 +19,39 @@
 [[compile_project]]
 == Compiling
 
-Please refer to <<dev-bazel#,Building with Bazel>>.
-
-== Switching between branches
-
-When switching between branches with `git checkout`, be aware that
-submodule revisions are not altered.  This may result in the wrong
-plugin revisions being present, unneeded plugins being present, or
-expected plugins being missing.
-
-After switching branches, make sure the submodules are at the correct
-revisions for the new branch with the commands:
-
-----
-  git submodule update
-  git clean -fdx
-----
-
-CAUTION: If you decide to store your Eclipse/IntelliJ project files in the
-Gerrit source directories, executing `git clean -fdx` will remove them and hence
-screw up your project.
-
+For details, see <<dev-bazel#,Building with Bazel>>.
 
 == Configuring Eclipse
 
-To use the Eclipse IDE for development, please see
+To use the Eclipse IDE for development, see
 link:dev-eclipse.html[Eclipse Setup].
 
-For details on how to configure the Eclipse workspace with Bazel,
-refer to: link:dev-bazel.html#eclipse[Eclipse integration with Bazel].
-
+To configure the Eclipse workspace with Bazel, see
+link:dev-bazel.html#eclipse[Eclipse integration with Bazel].
 
 == Configuring IntelliJ IDEA
 
-Please refer to <<dev-intellij#,IntelliJ Setup>> for detailed
-instructions.
+See <<dev-intellij#,IntelliJ Setup>> for details.
 
-== Mac OS X
+== MacOS
 
-On Mac OS X ensure "Java For Mac OS X 10.5 Update 4" (or later) has
-been installed, and that `JAVA_HOME` is set to the
+On MacOS, ensure that "Java for MacOS X 10.5 Update 4" (or higher) is installed
+and that `JAVA_HOME` is set to the
 link:install.html#Requirements[required Java version].
 
 Java installations can typically be found in
 "/System/Library/Frameworks/JavaVM.framework/Versions".
 
-You can check the installed Java version by running `java -version` in
-the terminal.
+To check the installed version of Java, open a terminal window and run:
+
+`java -version`
 
 [[init]]
 == Site Initialization
 
-After compiling <<compile_project,(above)>>, run Gerrit's 'init' command to
-create a testing site for development use:
+After you compile the project <<compile_project,(above)>>, run the Gerrit
+`init`
+command to create a test site:
 
 ----
   $(bazel info output_base)/external/local_jdk/bin/java \
@@ -81,24 +59,26 @@
 ----
 
 [[special_bazel_java_version]]
-NOTE: You must use the same Java version that Bazel used for the build.
-This Java version is available at
-`$(bazel info output_base)/external/local_jdk/bin/java`.
+NOTE: You must use the same Java version that Bazel used for the build, which
+is available at `$(bazel info output_base)/external/local_jdk/bin/java`.
 
-During initialization, make two changes to the default settings:
+During initialization, change two settings from the defaults:
 
-* Change the listen addresses from '*' to 'localhost' to prevent outside
-  connections from contacting the development instance; and
-* Change the auth type from 'OPENID' to 'DEVELOPMENT_BECOME_ANY_ACCOUNT' to
-  allow yourself to create and act as arbitrary test accounts on your
-  development instance.
+*  To ensure the development instance is not externally accessible, change the
+listen addresses from '*' to 'localhost'.
+*  To allow yourself to create and act as arbitrary test accounts on your
+development instance, change the auth type from 'OPENID' to 'DEVELOPMENT_BECOME_ANY_ACCOUNT'.
 
-Continue through init until it completes. The daemon will automatically start in
-the background and a web browser will launch to the start page. From here you
-can sign in as the account created during init, register additional accounts,
-create projects, and more.
+After initializing the test site, Gerrit starts serving in the background. A
+web browser displays the Start page.
 
-When you want to shut down the daemon, simply run:
+On the Start page, you can:
+
+.  Log in as the account you created during the initialization process.
+.  Register additional accounts.
+.  Create projects.
+
+To shut down the daemon, run:
 
 ----
   ../gerrit_testsite/bin/gerrit.sh stop
@@ -108,9 +88,11 @@
 [[localdev]]
 == Working with the Local Server
 
-If you need to create additional accounts on your development instance, click
-'become' in the upper right corner, select 'Switch User', and then register
-a new account.
+To create more accounts on your development instance:
+
+.  Click 'become' in the upper right corner.
+.  Select 'Switch User'.
+.  Register a new account.
 
 Use the `ssh` protocol to clone from and push to the local server. For
 example, to clone a repository that you've created through the admin
@@ -120,34 +102,31 @@
 git clone ssh://username@localhost:29418/projectname
 ----
 
-Then you'll be able to create changes the same way users do, with
+To create changes as users of Gerrit would, run:
 
 ----
 git push origin HEAD:refs/for/master
 ----
 
-
-
 == Testing
 
-
 [[tests]]
-=== Running the Acceptance Tests
+=== Running the acceptance tests
 
-Gerrit has a set of integration tests that test the Gerrit daemon via
-REST, SSH and the git protocol.
+Gerrit contains acceptance tests that validate the Gerrit daemon via REST, SSH,
+and the Git protocol.
 
 A new review site is created for each test and the Gerrit daemon is
-started on that site. When the test has finished the Gerrit daemon is
-shutdown.
+then started on that site. When the test is completed, the Gerrit daemon is
+shut down.
 
-For instructions on running the integration tests with Bazel,
-please refer to:  <<dev-bazel#tests,Running Unit Tests with Bazel>>.
+For instructions on running the acceptance tests with Bazel,
+see <<dev-bazel#tests,Running Unit Tests with Bazel>>.
 
 [[run_daemon]]
 === Running the Daemon
 
-The daemon can be directly launched from the build area, without
+The daemon can be launched directly from the build area, without
 copying to the test site:
 
 ----
@@ -156,133 +135,101 @@
      --console-log
 ----
 
-NOTE: Please refer to <<special_bazel_java_version,this explanation>>
-for details why using `java -jar` isn't sufficient.
+NOTE: To learn why using `java -jar` isn't sufficient, see
+<<special_bazel_java_version,this explanation>>.
 
-If you want to debug the Gerrit server of this test site, you can open a debug
-port (for example port 5005) by inserting
+To debug the Gerrit server of this test site:
+
+.  Open a debug port (such as port 5005). To do so, insert the following code
+immediately after `-jar` in the previous command. To learn how to attach
+IntelliJ, see <<dev-intellij#remote-debug,Debugging a remote Gerrit server>>.
 
 ----
 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
 ----
 
-directly after `-jar` of the previous command. Please refer to
-<<dev-intellij#remote-debug,Debugging a remote Gerrit server>> for instructions
-of how to attach IntelliJ.
-
 === Running the Daemon with Gerrit Inspector
 
 link:dev-inspector.html[Gerrit Inspector] is an interactive scriptable
-environment to inspect and modify internal state of the system.
+environment you can use to inspect and modify the internal state of the system.
 
-This environment is available on the system console after
-the system starts. Leaving the Inspector will shutdown the Gerrit
-instance.
+Gerrit Inspector appears on the system console whenever the system starts.
+Leaving the Inspector shuts down the Gerrit instance.
 
-The environment allows interactive work as well as running of
-Python scripts for troubleshooting.
+To troubleshoot, the Inspector enables interactive work as well as running of
+Python scripts.
 
-Gerrit Inspect can be started by adding '-s' option to the
-command used to launch the daemon:
+To start the Inspector, add the '-s' option to the daemon start command:
 
 ----
   $(bazel info output_base)/external/local_jdk/bin/java \
      -jar bazel-bin/gerrit.war daemon -d ../gerrit_testsite -s
 ----
 
-NOTE: Please refer to <<special_bazel_java_version,this explanation>>
-for details why using `java -jar` isn't sufficient.
+NOTE: To learn why using `java -jar` isn't sufficient, see
+<<special_bazel_java_version,this explanation>>.
 
-Gerrit Inspector examines Java libraries first, then loads
-its initialization scripts and then starts a command line
-prompt on the console:
+Inspector examines Java libraries, loads the initialization scripts, and
+starts a command line prompt on the console:
 
 ----
   Welcome to the Gerrit Inspector
   Enter help() to see the above again, EOF to quit and stop Gerrit
   Jython 2.5.2 (Release_2_5_2:7206, Mar 2 2011, 23:12:06)
-  [OpenJDK 64-Bit Server VM (Sun Microsystems Inc.)] on java1.6.0 running for Gerrit 2.3-rc0-163-g01967ef
+  [OpenJDK 64-Bit Server VM (Sun Microsystems Inc.)] on java1.6.0 running for
+  Gerrit 2.3-rc0-163-g01967ef
   >>>
 ----
 
-With the Inspector enabled Gerrit can be used normally and all
-interfaces (HTTP, SSH etc.) are available.
+When the Inspector is enabled, you can use Gerrit as usual and all
+interfaces (including HTTP and SSH) are available.
 
-Care must be taken not to modify internal state of the system
-when using the Inspector.
+CAUTION: When using the Inspector, be careful not to modify the internal state
+of the system.
 
-=== Querying the Database
+=== Querying the database
 
-The embedded H2 database can be queried and updated from the
-command line.  If the daemon is not currently running:
+The embedded H2 database can be queried and updated from the command line. If
+the daemon is not running, run:
 
 ----
   $(bazel info output_base)/external/local_jdk/bin/java \
      -jar bazel-bin/gerrit.war gsql -d ../gerrit_testsite -s
 ----
 
-NOTE: Please refer to <<special_bazel_java_version,this explanation>>
-for details why using `java -jar` isn't sufficient.
+NOTE: To learn why using `java -jar` isn't sufficient, see
+<<special_bazel_java_version,this explanation>>.
 
-Or, if it is running and the database is in use, connect over SSH
-using an administrator user account:
+Alternatively, if the daemon is running and the database is in use, use an
+administrator user account to connect over SSH:
 
 ----
   ssh -p 29418 user@localhost gerrit gsql
 ----
 
 
-[[debug-javascript]]
-=== Debugging JavaScript
+== Switching between branches
 
-When debugging browser specific issues add `?dbg=1` to the URL so the
-resulting JavaScript more closely matches the Java sources.  The debug
-pages use the GWT pretty format, where function and variable names
-match the Java sources.
+When using `git checkout` without `--recurse-submodules` to switch between
+branches, submodule revisions are not altered, which can result in:
+
+*  Incorrect or unneeded plugin revisions.
+*  Missing plugins.
+
+After you switch branches, ensure that you have the correct versions of
+the submodules.
+
+CAUTION: If you store Eclipse or IntelliJ project files in the Gerrit source
+directories, do *_not_* run `git clean -fdx`. Doing so may remove untracked files and damage your project. For more information, see
+link:https://git-scm.com/docs/git-clean[git-clean].
+
+Run the following:
 
 ----
-  http://localhost:8080/?dbg=1
+  git submodule update
+  git clean -ffd
 ----
 
-
-== Client-Server RPC
-
-The client-server RPC implementation is gwtjsonrpc, not the stock RPC
-system that comes with GWT.  This buys us automatic XSRF protection.
-It also makes all of the messages readable and writable by any JSON
-implementation, facilitating "mashups" and 3rd party clients.
-
-The programming API is virtually identical, except service interfaces
-extend RemoteJsonService instead of RemoteService.
-
-
-== Why GWT?
-
-We like it.  Plus we can write Java code once and run it both in
-the browser and on the server side.
-
-
-== External Links
-
-Google Web Toolkit:
-
-* http://www.gwtproject.org/download.html[Download]
-
-Apache SSHD:
-
-* http://mina.apache.org/sshd/[SSHD]
-
-H2:
-
-* http://www.h2database.com/[H2]
-* http://www.h2database.com/html/grammar.html[SQL Reference]
-
-PostgreSQL:
-
-* http://www.postgresql.org/download/[Download]
-* http://www.postgresql.org/docs/[Documentation]
-
-
 GERRIT
 ------
 Part of link:index.html[Gerrit Code Review]
diff --git a/Documentation/dev-release-subproject.txt b/Documentation/dev-release-subproject.txt
index fcafea5..4886849 100644
--- a/Documentation/dev-release-subproject.txt
+++ b/Documentation/dev-release-subproject.txt
@@ -32,7 +32,7 @@
 ----
 
 * Change the `id`, `bin_sha1`, and `src_sha1` values in the `maven_jar`
-for the subproject in `/lib/BUCK` to the `SNAPSHOT` version.
+for the subproject in `/WORKSPACE` to the `SNAPSHOT` version.
 +
 When Gerrit gets released, a release of the subproject has to be done
 and Gerrit has to reference the released subproject version.
diff --git a/Documentation/dev-release.txt b/Documentation/dev-release.txt
index 4101349..cda7a49 100644
--- a/Documentation/dev-release.txt
+++ b/Documentation/dev-release.txt
@@ -73,47 +73,32 @@
 
 == Create the Actual Release
 
-To create a Gerrit release the following steps have to be done:
-
-. link:#build-gerrit[Build the Gerrit Release]
-. link:#publish-gerrit[Publish the Gerrit Release]
-.. link:#publish-to-maven-central[Publish the Gerrit artifacts to Maven Central]
-.. link:#publish-to-google-storage[Publish the Gerrit WAR to Google Storage]
-.. link:#push-stable[Push the Stable Branch]
-.. link:#push-tag[Push the Release Tag]
-.. link:#upload-documentation[Upload the Documentation]
-.. link:#finalize-release-notes[Finalize Release Notes]
-.. link:#update-issues[Update the Issues]
-.. link:#announce[Announce on Mailing List]
-. link:#increase-version[Increase Gerrit Version for Current Development]
-. link:#merge-stable[Merge `stable` into `master`]
-
-
 [[update-versions]]
 === Update Versions and Create Release Tag
 
 Before doing the release build, the `GERRIT_VERSION` in the `version.bzl`
-file must be updated, e.g. change it from `2.5-SNAPSHOT` to `2.5`.
+file must be updated, e.g. change it from `$version-SNAPSHOT` to `$version`.
 
-In addition the version must be updated in a number of pom.xml files.
+In addition the version must be updated in a number of `*_pom.xml` files.
 
 To do this run the `./tools/version.py` script and provide the new
 version as parameter, e.g.:
 
 ----
-  ./tools/version.py 2.5
+  version=2.15
+  ./tools/version.py $version
 ----
 
 Commit the changes and create a signed release tag on the new commit:
 
 ----
-  git tag -s -m "v2.5" v2.5
+  git tag -s -m "v$version" "v$version"
 ----
 
 Tag the plugins:
 
 ----
-  git submodule foreach git tag -s -m "v2.5" v2.5
+  git submodule foreach git tag -s -m "v$version" "v$version"
 ----
 
 [[build-gerrit]]
@@ -126,8 +111,12 @@
   ./tools/maven/api.sh install
 ----
 
-* Sanity check WAR
-* Test the new Gerrit version
+* Verify the WAR version:
++
+----
+  java -jar ~/dl/gerrit-$version.war --version
+----
+* Try upgrading a test site and launching the daemon
 
 * Verify plugin versions
 +
@@ -148,7 +137,7 @@
 configuration] for deploying to Maven Central
 
 * Make sure that the version is updated in the `version.bzl` file and in
-the `pom.xml` files as described in the link:#update-versions[Update
+the `*_pom.xml` files as described in the link:#update-versions[Update
 Versions and Create Release Tag] section.
 
 * Push the WAR to Maven Central:
@@ -203,7 +192,7 @@
 +
 Use this URL for further testing of the artifacts in this repository,
 e.g. to try building a plugin against the plugin API in this repository
-update the version in the `pom.xml` and configure the repository:
+update the version in the `*_pom.xml` and configure the repository:
 +
 ----
   <repositories>
@@ -257,11 +246,11 @@
 [[push-stable]]
 ==== Push the Stable Branch
 
-* Create the stable branch `stable-2.5` in the `gerrit` project via the
+* Create the stable branch `stable-$version` in the `gerrit` project via the
 link:https://gerrit-review.googlesource.com/admin/repos/gerrit,branches[
 Gerrit Web UI] or by push.
 
-* Push the commits done on `stable-2.5` to `refs/for/stable-2.5` and
+* Push the commits done on `stable-$version` to `refs/for/stable-$version` and
 get them merged
 
 
@@ -271,13 +260,13 @@
 Push the new Release Tag:
 
 ----
-  git push gerrit-review tag v2.5
+  git push gerrit-review tag v$version
 ----
 
 Push the new Release Tag on the plugins:
 
 ----
-  git submodule foreach git push gerrit-review tag v2.5
+  git submodule foreach git push gerrit-review tag v$version
 ----
 
 
@@ -314,11 +303,11 @@
 Update the issues by hand. There is no script for this.
 
 Our current process is an issue should be updated to say `Status =
-Submitted, FixedIn-2.5` once the change is submitted, but before the
+Submitted, FixedIn-$version` once the change is submitted, but before the
 release.
 
 After the release is actually made, you can search in Google Code for
-`Status=Submitted FixedIn=2.5` and then batch update these changes
+`Status=Submitted FixedIn=$version` and then batch update these changes
 to say `Status=Released`. Make sure the pulldown says `All Issues`
 because `Status=Submitted` is considered a closed issue.
 
@@ -327,15 +316,15 @@
 ==== Announce on Mailing List
 
 Send an email to the mailing list to announce the release. The content of the
-announcement email is generated with the `release-announcement.py` which
-automatically includes all the necessary links, hash values, and wraps the
-text in a PGP signature.
+announcement email is generated with the `release-announcement.py` script from
+the gerrit-release-tools repository, which automatically includes all the
+necessary links, hash values, and wraps the text in a PGP signature.
 
 For details refer to the documentation in the script's header, and/or the
 help text:
 
 ----
- ./tools/release-announcement.py --help
+ ~/gerrit-release-tools/release-announcement.py --help
 ----
 
 [[increase-version]]
@@ -376,6 +365,17 @@
 must reference the new version. Upload a change to bazlets repository with
 api version upgrade.
 
+[[clean-up-on-master]]
+=== Clean up on master
+
+Once you are done with the release, check if there are any code changes in the
+master branch that were gated on the next release. Mostly, these are
+feature-deprecations that we were holding off on to have a stable release where
+the feature is still contained, but marked as deprecated.
+
+See link:dev-contributing.html#deprecating-features[Deprecating features] for
+details.
+
 GERRIT
 ------
 Part of link:index.html[Gerrit Code Review]
diff --git a/Documentation/error-messages.txt b/Documentation/error-messages.txt
index ca8dc75..37eb1f6 100644
--- a/Documentation/error-messages.txt
+++ b/Documentation/error-messages.txt
@@ -34,6 +34,7 @@
 * link:error-same-change-id-in-multiple-changes.html[same Change-Id in multiple changes]
 * link:error-too-many-commits.html[too many commits]
 * link:error-upload-denied.html[Upload denied for project \'...']
+* link:error-push-refschanges-not-allowed.html[upload to refs/changes not allowed]
 * link:error-not-allowed-to-upload-merges.html[you are not allowed to upload merges]
 
 
diff --git a/Documentation/error-push-refschanges-not-allowed.txt b/Documentation/error-push-refschanges-not-allowed.txt
new file mode 100644
index 0000000..2bbdc3e
--- /dev/null
+++ b/Documentation/error-push-refschanges-not-allowed.txt
@@ -0,0 +1,13 @@
+= upload to refs/changes not allowed
+
+Pushing to `refs/changes/` is deprecated and is not allowed on this Gerrit server.
+See the documentation for link:user-upload.html#push_create[creating changes] for
+alternate ways to push to existing changes.
+
+
+GERRIT
+------
+Part of link:error-messages.html[Gerrit Error Messages]
+
+SEARCHBOX
+---------
diff --git a/Documentation/images/inline-edit-add-file-page.png b/Documentation/images/inline-edit-add-file-page.png
new file mode 100644
index 0000000..1a761b4
--- /dev/null
+++ b/Documentation/images/inline-edit-add-file-page.png
Binary files differ
diff --git a/Documentation/images/inline-edit-create-change-form.png b/Documentation/images/inline-edit-create-change-form.png
new file mode 100644
index 0000000..7a93460
--- /dev/null
+++ b/Documentation/images/inline-edit-create-change-form.png
Binary files differ
diff --git a/Documentation/images/inline-edit-create-change.png b/Documentation/images/inline-edit-create-change.png
new file mode 100644
index 0000000..1df0421
--- /dev/null
+++ b/Documentation/images/inline-edit-create-change.png
Binary files differ
diff --git a/Documentation/images/inline-edit-delete-file.png b/Documentation/images/inline-edit-delete-file.png
new file mode 100644
index 0000000..1634e0f
--- /dev/null
+++ b/Documentation/images/inline-edit-delete-file.png
Binary files differ
diff --git a/Documentation/images/inline-edit-diff-screen.png b/Documentation/images/inline-edit-diff-screen.png
new file mode 100644
index 0000000..228484a
--- /dev/null
+++ b/Documentation/images/inline-edit-diff-screen.png
Binary files differ
diff --git a/Documentation/images/inline-edit-home-page.png b/Documentation/images/inline-edit-home-page.png
new file mode 100644
index 0000000..a1b8eb4
--- /dev/null
+++ b/Documentation/images/inline-edit-home-page.png
Binary files differ
diff --git a/Documentation/images/inline-edit-new-change-page.png b/Documentation/images/inline-edit-new-change-page.png
new file mode 100644
index 0000000..8a33dd6
--- /dev/null
+++ b/Documentation/images/inline-edit-new-change-page.png
Binary files differ
diff --git a/Documentation/images/inline-edit-open-file.png b/Documentation/images/inline-edit-open-file.png
new file mode 100644
index 0000000..a5422f5
--- /dev/null
+++ b/Documentation/images/inline-edit-open-file.png
Binary files differ
diff --git a/Documentation/images/inline-edit-prefill-files.png b/Documentation/images/inline-edit-prefill-files.png
new file mode 100644
index 0000000..0b2b766
--- /dev/null
+++ b/Documentation/images/inline-edit-prefill-files.png
Binary files differ
diff --git a/Documentation/images/inline-edit-review-message.png b/Documentation/images/inline-edit-review-message.png
new file mode 100644
index 0000000..bd76fad
--- /dev/null
+++ b/Documentation/images/inline-edit-review-message.png
Binary files differ
diff --git a/Documentation/images/inline-edit-start-review-button.png b/Documentation/images/inline-edit-start-review-button.png
new file mode 100644
index 0000000..df6350b
--- /dev/null
+++ b/Documentation/images/inline-edit-start-review-button.png
Binary files differ
diff --git a/Documentation/index.txt b/Documentation/index.txt
index 24c538f..6011158 100644
--- a/Documentation/index.txt
+++ b/Documentation/index.txt
@@ -5,6 +5,7 @@
 . link:linux-quickstart.html[Quickstart for Installing Gerrit on Linux]
 
 == About Gerrit
+. link:intro-rockstar.html[Why Code Review?]
 . link:intro-quick.html[Product Overview]
 . link:intro-how-gerrit-works.html[How Gerrit Works]
 . link:intro-gerrit-walkthrough.html[Basic Gerrit Walkthrough]
@@ -66,8 +67,10 @@
 . link:config-reverseproxy.html[Reverse Proxy]
 . link:config-auto-site-initialization.html[Automatic Site Initialization on Startup]
 . link:pgm-index.html[Server Side Administrative Tools]
+. link:user-request-tracing.html[Request Tracing]
 . link:note-db.html[NoteDb]
-. link:config-accounts.html[Accounts]
+. link:config-accounts.html[Accounts on NoteDb]
+. link:config-groups.html[Groups on NoteDb]
 
 == Developer
 . Getting Started
diff --git a/Documentation/install-j2ee.txt b/Documentation/install-j2ee.txt
index f7252e0..91d73cc 100644
--- a/Documentation/install-j2ee.txt
+++ b/Documentation/install-j2ee.txt
@@ -105,9 +105,8 @@
 ----
 
 [TIP]
-Under Jetty, restarting the web application (e.g. after modifying
-`system_config`) is as simple as touching the context config file:
-`'$JETTY_HOME'/contexts/gerrit.xml`
+Under Jetty, restarting the web application is as simple as
+touching the context config file: `'$JETTY_HOME'/contexts/gerrit.xml`
 
 [[tomcat]]
 == Tomcat 7.x
diff --git a/Documentation/install.txt b/Documentation/install.txt
index 91391bb..dbca368 100644
--- a/Documentation/install.txt
+++ b/Documentation/install.txt
@@ -1,19 +1,21 @@
 = Gerrit Code Review - Standalone Daemon Installation Guide
 
-[[requirements]]
-== Requirements
-To run the Gerrit service, the following requirements must be met on
-the host:
+[[prerequisites]]
+== Prerequisites
+
+To run the Gerrit service, the following requirement must be met on the host:
 
 * JRE, version 1.8 http://www.oracle.com/technetwork/java/javase/downloads/index.html[Download]
 +
 Gerrit is not yet compatible with Java 9 or newer at this time.
 
-You'll also need an SQL database to house the review metadata. You have the
-choice of either using the embedded H2 or to host your own MySQL or PostgreSQL.
+By default, Gerrit uses link:note-db.html[NoteDB] as the storage backend. (If
+desired, you can _optionally_ use an external database such as MySQL or
+PostgreSQL.)
 
 [[cryptography]]
 == Configure Java for Strong Cryptography
+
 Support for extra strength cryptographic ciphers: _AES128CTR_, _AES256CTR_,
 _ARCFOUR256_, and _ARCFOUR128_ can be enabled by downloading the _Java
 Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files_
diff --git a/Documentation/intro-gerrit-walkthrough.txt b/Documentation/intro-gerrit-walkthrough.txt
index ea8c06a..1fba1dc 100644
--- a/Documentation/intro-gerrit-walkthrough.txt
+++ b/Documentation/intro-gerrit-walkthrough.txt
@@ -181,7 +181,7 @@
 
 Later in the day, Max decides to check on his change and notices Hannah's
 feedback. He opens up the source file and incorporates her feedback. Because
-Max's change includes a change-id, all he has to is follow the typical git
+Max's change includes a change-id, all he has to do is follow the typical git
 workflow for updating a commit:
 
 * Check out the commit
diff --git a/Documentation/intro-how-gerrit-works.txt b/Documentation/intro-how-gerrit-works.txt
index f903849..5f5deed 100644
--- a/Documentation/intro-how-gerrit-works.txt
+++ b/Documentation/intro-how-gerrit-works.txt
@@ -1,32 +1,32 @@
 = How Gerrit Works
 
-To understand how Gerrit fits into and enhances the developer workflow, consider
-a typical project. This project has a central source repository, which serves as
-the authoritative copy of the project's contents.
+To learn how Gerrit fits into and complements the developer workflow, consider
+a typical project. The following project contains a central source repository
+(_Authoritative Repository_) that serves as the authoritative version of the
+project's contents.
 
 .Central Source Repository
 image::images/intro-quick-central-repo.png[Authoritative Source Repository]
 
-Gerrit takes the place of this central repository and adds an additional
-concept: a _store of pending changes_.
+When implemented, Gerrit becomes the central source repository and introduces
+an additional concept: a store of _Pending Changes_.
 
-.Gerrit in place of Central Repository
-image::images/intro-quick-central-gerrit.png[Gerrit in place of Central Repository]
+.Gerrit as the Central Repository
+image::images/intro-quick-central-gerrit.png[Gerrit as the Central Repository]
 
-With Gerrit, when a developer makes a change, it is sent to this store of
-pending changes, where other developers can review, discuss and approve the
-change. After enough reviewers grant their approval, the change becomes an
-official part of the codebase.
+When Gerrit is configured as the central source repository, all code changes
+are sent to Pending Changes for others to review and discuss. When enough
+reviewers have approved a code change, you can submit the change to the code
+base.
 
-In addition to this store of pending changes, Gerrit captures notes
-and comments about each change. These features allow developers to review
-changes at their convenience, or when conversations about a change can't
-happen face to face. They also help to create a record of the conversation
-around a given change, which can provide a history of when a change was made and
-why.
+In addition to the store of Pending Changes, Gerrit captures notes and comments
+made about each change. This enables you to review changes at your convenience
+or when a conversation about a change can't happen in person. In addition,
+notes and comments provide a history of each change (what was changed and why and
+who reviewed the change).
 
-Like any repository hosting solution, Gerrit has a powerful
-link:access-control.html[access control model]. This model allows you to
+Like any repository hosting product, Gerrit provides a powerful
+link:access-control.html[access control model], which enables you to
 fine-tune access to your repository.
 
 GERRIT
diff --git a/Documentation/intro-project-owner.txt b/Documentation/intro-project-owner.txt
index 8a3529e..a5895c5 100644
--- a/Documentation/intro-project-owner.txt
+++ b/Documentation/intro-project-owner.txt
@@ -88,7 +88,7 @@
 Normally when a new project is created in Gerrit it already has some
 access rights which are inherited from the parent projects.
 Projects in Gerrit are organized hierarchically as a tree with the
-`All-Projects' project as root from which all projects inherit. Each
+`All-Projects` project as root from which all projects inherit. Each
 project can have only a single parent project, multi-inheritance is
 not supported.
 
@@ -227,12 +227,12 @@
 The different options are described in the
 link:project-configuration.html#project_options[Project Options] section.
 
-To see the options of your project
+To see the options of your project:
 
-- go to the Gerrit Web UI
-- click on the `Projects` > `List` menu entry
-- find your project in the project list and click on it
-- click on the `General` menu entry
+. Go to the Gerrit Web UI.
+. Click on the `Projects` > `List` menu entry.
+. Find your project in the project list and click it.
+. Click the `General` menu entry.
 
 [[submit-type]]
 === Submit Type
@@ -764,11 +764,11 @@
 
 Gerrit core does not support the renaming of projects.
 
-As workaround you may
+As workaround you can perform the following steps:
 
-. link:#project-creation[create a new project] with the new name
-. link:#import-history[import the history of the old project]
-. link:#project-deletion[delete the old project]
+. link:#project-creation[Create a new project] with the new name.
+. link:#import-history[Import the history of the old project].
+. link:#project-deletion[Delete the old project].
 
 Please note that a drawback of this workaround is that the whole review
 history (changes, review comments) is lost.
diff --git a/Documentation/intro-quick.txt b/Documentation/intro-quick.txt
index e6b1e43..11d5052 100644
--- a/Documentation/intro-quick.txt
+++ b/Documentation/intro-quick.txt
@@ -1,31 +1,47 @@
-= Gerrit Product Overview
+= Gerrit Code Review Product Overview
 
-Gerrit is a web-based code review tool built on top of the
-https://git-scm.com/[Git version control system]. This introduction provides
-an overview of Gerrit and describes how Gerrit integrates into a typical
-development workflow. It also provides a brief tutorial that shows how to manage
-a change using Gerrit.
+Gerrit Code Review is a web-based code review tool built on
+https://git-scm.com/[Git version control].
 
-== What is Gerrit?
+== What is Gerrit Code Review?
 
-Gerrit makes code review easy by providing a lightweight framework for reviewing
-commits before they are accepted by the codebase. Gerrit works equally well for
-projects where approving changes is restricted to selected users, as is typical
-for Open Source software development, as well as projects where all contributors
-are trusted.
+Gerrit provides a framework you and your teams can use to review code before it
+becomes part of the code base. Gerrit works equally well in open source projects
+that limit the number of users who can approve changes (typical in open source
+software development) and in projects in which all contributors are trusted.
 
-== Learn About Gerrit
+== What is Code Review?
 
-If you're new to Gerrit and want to know more about how it can improve your
-developer workflow, see the following topics:
+Code reviews can identify mistakes before they're found by customers. In a world
+of continuous integration, code must be tested before it's submitted to the
+master branch to become part of the code base. Tests confirm that a product
+works (and continues to work) as intended by the developers.
+
+When code is reviewed, developers:
+
+. Work carefully and consistently
+. Learn best practices and new techniques from other developers
+. Implement consistency and quality across the code base
+
+Code reviews typically turn up issues related to:
+
+. Design: Is code well-designed and suited to the code base?
+. Functionality: Does code perform as intended and in a way that is good for users?
+. Complexity: Can other developers understand and use the code?
+. Naming: Does the code contain clear names for elements such as variables, classes, and methods?
+. Comments: Are comments specific and complete?
+
+== Learn Gerrit Code Review
+
+If you're new to Gerrit and want to learn how Gerrit can improve your workflow,
+see:
 
 . link:intro-how-gerrit-works.html[How Gerrit Works]
 . link:intro-gerrit-walkthrough.html[Basic Gerrit Walkthrough]
 
 == Getting Started
 
-This documentation contains several guides to help you learn about the Gerrit
-features most relevant to you:
+To learn more, see:
 
 . link:intro-user.html[User Guide]
 . link:intro-project-owner.html[Project Owner Guide]
diff --git a/Documentation/intro-rockstar.txt b/Documentation/intro-rockstar.txt
new file mode 100644
index 0000000..b60a91f
--- /dev/null
+++ b/Documentation/intro-rockstar.txt
@@ -0,0 +1,129 @@
+= Use Gerrit to Be a Rockstar Programmer
+
+== Overview
+
+The term _rockstar_ is often used to describe those talented programmers who
+seem to work faster and better than everyone else, much like a composer who
+seems to effortlessly churn out fantastic music. However, just as the
+spontaneity of masterful music is a fantasy, so is the development of
+exceptional code.
+
+The process of composing and then recording music is painstaking — the artist
+records portions of a composition over and over, changing each take until one
+song is completed by combining those many takes into a cohesive whole. The end
+result is the recording of the best performance of the best version of the
+song.
+
+Consider Queen’s six-minute long Bohemian Rhapsody, which took three weeks to
+record. Some segments were overdubbed 180 times!
+
+Software engineering is much the same. Changes that seem logical and
+straightforward in retrospect actually required many revisions and many hours
+of work before they were ready to be merged into a code base. A single
+conceptual code change (_fix bug 123_) often requires numerous iterations
+before it can be finalized. Programmers typically:
+
+* Fix compilation errors
+* Factor out a method, to avoid duplicate code
+* Use a better algorithm, to make it faster
+* Handle error conditions, to make it more robust
+* Add tests, to prevent a bug from regressing
+* Adapt tests, to reflect changed behavior
+* Polish code, to make it easier to read
+* Improve the commit message, to explain why a change was made
+
+In fact, first drafts of code changes are best kept out of project history. Not
+just because rockstar programmers want to hide sloppy first attempts at making
+something work. It's more that keeping intermediate states hampers effective
+use of version control. Git works best when one commit corresponds to one
+functional change, as is required for:
+
+* git revert
+
+* git cherry-pick
+
+* link:https://www.kernel.org/pub/software/scm/git/docs/git-bisect-lk2009.html[git bisect]
+
+
+[[amending]]
+== Amending commits
+
+Git provides a mechanism to continually update a commit until it’s perfect: use
+`git commit --amend` to remake (re-record) a code change. After you update a
+commit in this way, your branch then points to the new commit. However, the
+older (imperfect) revision is not lost. It can be found via the `git reflog`.
+
+
+[[review]]
+== Code review
+
+At least two well-known open source projects insist on these practices:
+
+* link:http://git-scm.com/[Git]
+* link:http://www.kernel.org/category/about.html/[Linux Kernel]
+
+However, contributors to these projects don’t refine and polish their changes
+in private until they’re perfect. Instead, polishing code is part of a review
+process — the contributor offers their change to the project for other
+developers to evaluate and critique. This process is called _code review_ and
+results in numerous benefits:
+
+* Code reviews mean that every change effectively has shared authorship
+
+* Developers share knowledge in two directions: Reviewers learn from the patch
+author how the new code they will have to maintain works, and the patch
+author learns from reviewers about best practices used in the project.
+
+* Code review encourages more people to read the code contained in a given
+change. As a result, there are more opportunities to find bugs and suggest
+improvements.
+
+* The more people who read the code, the more bugs can be identified. Since
+code review occurs before code is submitted, bugs are squashed during the
+earliest stage of the software development lifecycle.
+
+* The review process provides a mechanism to enforce team and company policies.
+For example, _all tests shall pass on all platforms_ or _at least two people
+shall sign off on code in production_.
+
+Many successful software companies, including Google, use code review as a
+standard, integral stage in the software development process.
+
+
+[[web]]
+== Web-based code review
+
+To review work, the Git and Linux Kernel projects send patches via email.
+
+Code Review (Gerrit) adds a modern web interface to this workflow. Rather than
+send patches and comments via email, Gerrit users push commits to Gerrit where
+diffs are displayed on a web page. Reviewers can post comments directly on the
+diff. If a change must be reworked, users can push a new, amended revision of
+the same change. Reviewers can then check if the new revision addresses the
+original concerns. If not, the process is repeated.
+
+
+[[magic]]
+== Gerrit’s magic
+
+When you push a change to Gerrit, how does Gerrit detect that the commit amends
+a previous change? Gerrit can’t use the SHA-1, since that value changes when
+`git commit --amend` is called. Fortunately, upon amending a commit, the commit
+message is retained by default.
+
+This is where Gerrit's solution lies: Gerrit identifies a conceptual change
+with a footer in the commit message. Each commit message footer contains a
+Change-Id message hook, which uniquely identifies a change across all its
+drafts. For example:
+
+  `Change-Id: I9e29f5469142cc7fce9e90b0b09f5d2186ff0990`
+
+Thus, if the Change-Id remains the same as commits are amended, Gerrit detects
+that each new version refers to the same conceptual change. The Gerrit web
+interface groups versions so that reviewers can see how your change evolves
+during the code review.
+
+To Gerrit, the identifier can be random.
+
+Gerrit provides a client-side link:cmd-hook-commit-msg.html[message hook] to
+automatically add to commit messages when necessary.
diff --git a/Documentation/intro-user.txt b/Documentation/intro-user.txt
index 857e04c..2a877ec 100644
--- a/Documentation/intro-user.txt
+++ b/Documentation/intro-user.txt
@@ -19,7 +19,7 @@
 [[tools]]
 == Tools
 
-Gerrit speaks the git protocol. This means in order to work with Gerrit
+Gerrit uses the git protocol. This means in order to work with Gerrit
 you do *not* need to install any Gerrit client, but having a regular
 git client, such as the link:http://git-scm.com/[git command line] or
 link:http://eclipse.org/egit/[EGit] in Eclipse, is sufficient.
@@ -184,9 +184,7 @@
 accidentally creating a new change instead of uploading a new patch
 set. Any push without Change-Id then fails with
 link:error-missing-changeid.html[missing Change-Id in commit message
-footer]. New patch sets can always be uploaded to a specific change
-(even without any Change-Id) by pushing to the change ref, e.g.
-`refs/changes/74/67374`.
+footer].
 
 Amending and rebasing a commit preserves the Change-Id so that the new
 commit automatically becomes a new patch set of the existing change,
@@ -562,8 +560,10 @@
 [[private-changes]]
 == Private Changes
 
-Private changes are changes that are only visible to their owners and
-reviewers. Private changes are useful in a number of cases:
+Private changes are changes that are only visible to their owners, reviewers
+and users with the link:access-control.html#category_view_private_changes[
+View Private Changes] global capability. Private changes are useful in a number
+of cases:
 
 * You want a set of collaborators to review the change before formal review
   starts. By creating a Private change and adding only a selected few as
@@ -818,7 +818,7 @@
 and `Edit Config` buttons on the project screen, and the `Follow-Up`
 button on the change screen).
 
-- [[publish-comments-on-push]]`Publish Draft Comments When a Change Is Updated by Push`:
+- [[publish-comments-on-push]]`Publish comments on push`:
 +
 Whether to publish any outstanding draft comments by default when pushing
 updates to open changes. This preference just sets the default; the behavior can
diff --git a/Documentation/js-api.txt b/Documentation/js-api.txt
index 8a19720..96b5107 100644
--- a/Documentation/js-api.txt
+++ b/Documentation/js-api.txt
@@ -167,14 +167,19 @@
 * `showchange`: Invoked when a change is made visible. A
   link:rest-api-changes.html#change-info[ChangeInfo] and
   link:rest-api-changes.html#revision-info[RevisionInfo]
-  are passed as arguments.
+  are passed as arguments. PolyGerrit provides a third parameter which
+  is an object with a `mergeable` boolean.
 
 * `submitchange`: Invoked when the submit button is clicked
   on a change. A link:rest-api-changes.html#change-info[ChangeInfo]
   and link:rest-api-changes.html#revision-info[RevisionInfo] are
   passed as arguments. Similar to a form submit validation, the
   function must return true to allow the operation to continue, or
-  false to prevent it.
+  false to prevent it. The function may be called multiple times, for
+  example, if submitting a change shows a confirmation dialog, this
+  event may be called to validate that the check whether dialog can be
+  shown, and called again when the submit is confirmed to check whether
+  the actual submission action can proceed.
 
 * `comment`: Invoked when a DOM element that represents a comment is
   created. This DOM element is passed as argument. This DOM element
diff --git a/Documentation/json.txt b/Documentation/json.txt
index 533affe..dc82ad1 100644
--- a/Documentation/json.txt
+++ b/Documentation/json.txt
@@ -29,6 +29,8 @@
 commitMessage:: The full commit message for the change's current patch
 set.
 
+hashtags:: List of hashtags associated with this change.
+
 createdOn:: Time in seconds since the UNIX epoch when this change
 was created.
 
@@ -179,6 +181,23 @@
 labels:: This describes the state of each code review
 <<label,label attribute>>, unless the status is RULE_ERROR.
 
+requirements:: Each <<requirement>> describes what needs to be changed
+in order for the change to be submittable.
+
+
+[[requirement]]
+== requirement
+Information about a requirement in order to submit a change.
+
+fallbackText:: A human readable description of the requirement.
+
+type:: Alphanumerical (plus hyphens or underscores) string to identify what the requirement is and
+why it was triggered. Can be seen as a class: requirements sharing the same type were created for a
+similar reason, and the data structure will follow one set of rules.
+
+data:: (Optional) Additional key-value data linked to this requirement. This is used in templates to
+render rich status messages.
+
 [[label]]
 == label
 Information about a code review label for a change.
diff --git a/Documentation/linux-quickstart.txt b/Documentation/linux-quickstart.txt
index ee7fb16..bfebc6a 100644
--- a/Documentation/linux-quickstart.txt
+++ b/Documentation/linux-quickstart.txt
@@ -1,66 +1,64 @@
 = Quickstart for Installing Gerrit on Linux
 
-This quickstart shows you how to install Gerrit on a Linux machine.
+This content explains how to install a basic instance of Gerrit on a Linux
+machine.
 
 [NOTE]
 ====
-The installation steps provided in this quickstart are for
-demonstration purposes only. They are not intended for use in a production
-environment.
+This quickstart is provided for demonstration purposes only. The Gerrit instance
+they install must not be used in a production environment.
 
-For a more detailed installation guide, see
+Instead, to install a Gerrit production environment, see
 link:install.html[Standalone Daemon Installation Guide].
 ====
 
-== Before you begin
+== Before you start
 
-To complete this quickstart, you need:
+Be sure you have:
 
-. A Unix-based server such as any of the Linux flavors or BSD.
-. Java SE Runtime Environment version 1.8
-+
-Gerrit is not compatible with Java 9 or newer yet.
+. A Unix-based server, including any Linux flavor, MacOS, or Berkeley Software
+    Distribution (BSD).
+. Java SE Runtime Environment version 1.8. Gerrit is not compatible with Java
+    9 or newer yet.
 
 == Download Gerrit
 
 From the Linux machine on which you want to install Gerrit:
 
 . Open a terminal window.
-. Download the Gerrit archive. See
-link:https://gerrit-releases.storage.googleapis.com/index.html[Gerrit Code
-Review - Releases] for a list of available archives.
+. Download the desired Gerrit archive.
 
-The steps in this quickstart used Gerrrit 2.14.2, which you can download using
-a command such as:
+To view previous archives, see
+link:https://gerrit-releases.storage.googleapis.com/index.html[Gerrit Code Review: Releases]. The steps below install Gerrit 2.15.1:
 
 ....
-wget https://www.gerritcodereview.com/download/gerrit-2.14.2.war
+wget https://www.gerritcodereview.com/download/gerrit-2.15.1.war
 ....
 
-NOTE: If you want to build and install Gerrit from the source files, see
-link:dev-readme.html[Developer Setup].
+NOTE: To build and install Gerrit from the source files, see
+link:dev-readme.html[Gerrit Code Review: Developer Setup].
 
 == Install and initialize Gerrit
 
-From the command line, type the following:
+From the command line, enter:
 
 ....
 java -jar gerrit*.war init --batch --dev -d ~/gerrit_testsite
 ....
 
-The preceding command uses two parameters:
+This command takes two parameters:
 
-* `--batch`. This parameter assigns default values to a variety of Gerrit
-  configuration options. To learn more about these configuration options, see
-  link:config-gerrit.html[Configuration].
-* `--dev`. This parameter configures the server to use the authentication
-  option, `DEVELOPMENT_BECOME_ANY_ACCOUNT`. This authentication type makes it
-  easy for you to switch between different users to explore how Gerrit works.
-  To learn more about setting up Gerrit for development, see
-  link:dev-readme.html[Developer Setup].
+* `--batch` assigns default values to several Gerrit configuration
+    options. To learn more about these options, see
+    link:config-gerrit.html[Configuration].
+* `--dev` configures the Gerrit server to use the authentication
+  option, `DEVELOPMENT_BECOME_ANY_ACCOUNT`, which enables you to
+  switch between different users to explore how Gerrit works. To learn more
+  about setting up Gerrit for development, see
+  link:dev-readme.html[Gerrit Code Review: Developer Setup].
 
-This command displays a number of messages in the terminal window. The following
-is an example of these messages:
+While this command executes, status messages are displayed in the terminal
+window. For example:
 
 ....
 Generating SSH host key ... rsa(simple)... done
@@ -69,14 +67,15 @@
 Starting Gerrit Code Review: OK
 ....
 
-The last message you should see is `Starting Gerrit Code Review: OK`. This
-message informs you that the Gerrit service is now running.
+The last message confirms that the Gerrit service is running:
+
+`Starting Gerrit Code Review: OK`.
 
 == Update the listen URL
 
-Another recommended task is to change the URL that Gerrit listens to from `*`
-to `localhost`. This change helps prevent outside connections from contacting
-the instance.
+To prevent outside connections from contacting your new Gerrit instance
+(strongly recommended), change the URL on which Gerrit listens from `*` to
+`localhost`. For example:
 
 ....
 git config --file ~/gerrit_testsite/etc/gerrit.config httpd.listenUrl 'http://localhost:8080'
@@ -85,7 +84,7 @@
 == Restart the Gerrit service
 
 You must restart the Gerrit service for your authentication type and listen URL
-changes to take effect.
+changes to take effect:
 
 ....
 ~/gerrit_testsite/bin/gerrit.sh restart
@@ -93,8 +92,7 @@
 
 == Viewing Gerrit
 
-At this point, you have a basic installation of Gerrit. You can view this
-installation by opening a browser and entering the following URL:
+To view your new basic installation of Gerrit, go to:
 
 ....
 http://localhost:8080
@@ -102,10 +100,10 @@
 
 == Next steps
 
-Through this quickstart, you now have a simple version of Gerrit running on your
-Linux machine. You can use this installation to explore the UI and become
-familiar with some of Gerrit's features. For a more detailed installation guide,
-see link:install.html[Standalone Daemon Installation Guide].
+Now that you have a simple version of Gerrit running, use the installation to
+explore the user interface and learn about Gerrit. For more detailed
+installation instructions, see
+link:[Standalone Daemon Installation Guide](install.html).
 
 GERRIT
 ------
diff --git a/Documentation/metrics.txt b/Documentation/metrics.txt
index 5239730..37d6d01 100644
--- a/Documentation/metrics.txt
+++ b/Documentation/metrics.txt
@@ -13,6 +13,22 @@
 * `build/label`: Version of Gerrit server software.
 * `events`: Triggered events.
 
+=== Actions
+
+* `action/retry_attempt_counts`: Distribution of number of attempts made
+by RetryHelper to execute an action (1 == single attempt, no retry)
+* `action/retry_timeout_count`: Number of action executions of RetryHelper
+that ultimately timed out
+
+=== Pushes
+
+* `receivecommits/changes`: histogram of number of changes processed
+in a single upload, split up by update type (new change created,
+existing changed updated, change autoclosed).
+* `receivecommits/latency`: latency per change for processing a push,
+split up by update type (create+replace, and autoclose)
+* `receivecommits/timeout`: number of timeouts during push processing.
+
 === Process
 
 * `proc/birth_timestamp`: Time at which the Gerrit process started.
@@ -43,10 +59,18 @@
 * `http/server/error_count`: Rate of REST API error responses.
 * `http/server/success_count`: Rate of REST API success responses.
 * `http/server/rest_api/count`: Rate of REST API calls by view.
+* `http/server/rest_api/change_id_type`: Rate of REST API calls by change ID type.
 * `http/server/rest_api/error_count`: Rate of REST API calls by view.
 * `http/server/rest_api/server_latency`: REST API call latency by view.
 * `http/server/rest_api/response_bytes`: Size of REST API response on network
 (may be gzip compressed) by view.
+* `http/server/rest_api/change_json/to_change_info_latency`: Latency for
+toChangeInfo invocations in ChangeJson.
+* `http/server/rest_api/change_json/to_change_infos_latency`: Latency for
+toChangeInfos invocations in ChangeJson.
+* `http/server/rest_api/change_json/format_query_results_latency`: Latency for
+formatQueryResults invocations in ChangeJson.
+* `http/server/rest_api/ui_actions/latency`: Latency for RestView#getDescription calls.
 
 === Query
 
@@ -109,10 +133,6 @@
 
 * `batch_update/execute_change_ops`: BatchUpdate change update latency,
 excluding reindexing
-* `batch_update/retry_attempt_counts`: Distribution of number of attempts made
-by RetryHelper (1 == single attempt, no retry)
-* `batch_update/retry_timeout_count`: Number of executions of RetryHelper that
-ultimately timed out
 
 === NoteDb
 
@@ -127,6 +147,16 @@
 * `notedb/read_all_external_ids_latency`: Latency for reading all
 external ID's from NoteDb.
 
+=== Permissions
+
+* `permissions/project_state/computation_latency`: Latency to compute current access
+sections on a project by traversing it's parents.
+* `permissions/permission_collection/filter_latency`: Latency to filter access sections
+by user and ref.
+* `permissions/ref_filter/full_filter_count`: Rate of full ref filter operations
+* `permissions/ref_filter/skip_filter_count`: Rate of ref filter operations where
+we skip full evaluation because the user can read all refs
+
 === Reviewer Suggestion
 
 * `reviewer_suggestion/query_accounts`: Latency for querying accounts for
@@ -142,6 +172,11 @@
 
 * `sequence/next_id_latency`: Latency of requesting IDs from repo sequences.
 
+=== Plugin
+
+* `plugin/latency`: Latency for plugin invocation.
+* `plugin/error_count`: Number of plugin errors.
+
 === Replication Plugin
 
 * `plugins/replication/replication_latency`: Time spent pushing to remote
diff --git a/Documentation/note-db.txt b/Documentation/note-db.txt
index aa0103a..fd2bef37 100644
--- a/Documentation/note-db.txt
+++ b/Documentation/note-db.txt
@@ -31,7 +31,10 @@
 - Storing link:config-accounts.html[account data] is fully implemented in the
   2.15 release. Account data is migrated automatically during the upgrade
   process by running `gerrit.war init`.
-- Account and change metadata on the servers behind `googlesource.com` is fully
+- Storing link:config-groups.html[group metadata] is fully implemented
+  for the 2.16 release. Group data is migrated automatically during
+  the upgrade process by running `gerrit.war init`
+- Account, group and change metadata on the servers behind `googlesource.com` is fully
   migrated to NoteDb. In other words, if you use
   link:https://gerrit-review.googlesource.com/[gerrit-review], you're already
   using NoteDb.
@@ -44,8 +47,6 @@
 
 == Future Work ("Gerrit 3.0")
 
-- Storing group data is a work in progress. Like account data, it will be
-  migrated automatically.
 - NoteDb will be the only database format supported by Gerrit 3.0. The offline
   change data migration tool will be included in Gerrit 3.0, but online
   migration will only be available in the 2.x line.
@@ -118,7 +119,7 @@
 *Disadvantages*
 
 * May require substantial downtime; takes about twice as long as an
-  link:#pgm-reindex[offline reindex]. (In fact, one of the migration steps is a
+  link:pgm-reindex.html[offline reindex]. (In fact, one of the migration steps is a
   full reindex, so it can't possibly take less time.)
 
 [[trial-migration]]
@@ -142,7 +143,7 @@
 
 * Help test early releases of the migration tool for bugs with lower risk.
 * Try out new NoteDb-only features like
-  link:rest-api-changes.txt#get-hashtags[hashtags] without running the full
+  link:rest-api-changes.html#get-hashtags[hashtags] without running the full
   migration.
 
 To continue with the full migration after running the trial migration, use
diff --git a/Documentation/pg-plugin-admin-api.txt b/Documentation/pg-plugin-admin-api.txt
new file mode 100644
index 0000000..1c724d0
--- /dev/null
+++ b/Documentation/pg-plugin-admin-api.txt
@@ -0,0 +1,17 @@
+= Gerrit Code Review - Admin customization API
+
+This API is provided by link:pg-plugin-dev.html#plugin-admin[plugin.admin()]
+and provides customization of the admin menu.
+
+== addMenuLink
+`adminApi.addMenuLink(text, url, opt_external)`
+
+Add a new link to the end of the admin navigation menu.
+
+.Params
+- *text* String text to appear in the link.
+- *url* String of the destination URL for the link.
+
+When adding an external link, the URL provided should be a full URL. Otherwise,
+a non-external link should be relative beginning with a slash. For example, to
+create a link to open changes, use the value `/q/status:open`.
\ No newline at end of file
diff --git a/Documentation/pg-plugin-change-metadata-api.txt b/Documentation/pg-plugin-change-metadata-api.txt
new file mode 100644
index 0000000..8348da8
--- /dev/null
+++ b/Documentation/pg-plugin-change-metadata-api.txt
@@ -0,0 +1,16 @@
+= Gerrit Code Review - Change metadata plugin API
+
+This API is provided by
+link:pg-plugin-dev.html#change-metadata[plugin.changeMetadata()] and provides
+interface for customization and data updates of change metadata.
+
+== onLabelsChanged
+`changeMetadataApi.onLabelsChanged(callback)`
+
+.Params
+- *callback* function that's executed when labels changed on the server.
+Callback receives labels with scores applied to the change, map of the label
+names to link:rest-api-changes.html#label-info[LabelInfo] entries
+
+.Returns
+- `GrChangeMetadataApi` for chaining.
diff --git a/Documentation/pg-plugin-dev.txt b/Documentation/pg-plugin-dev.txt
index 0064794..c7aa57c 100644
--- a/Documentation/pg-plugin-dev.txt
+++ b/Documentation/pg-plugin-dev.txt
@@ -24,7 +24,7 @@
   located in `gerrit-site/plugins` folder, where `pluginname` is an alphanumeric
   plugin name.
 
-Note: Code examples target modern brosers (Chrome, Firefox, Safari, Edge)
+Note: Code examples target modern browsers (Chrome, Firefox, Safari, Edge).
 
 Here's a recommended starter `myplugin.html`:
 
@@ -45,7 +45,7 @@
 
 Basically, the DOM is the API surface. Low-level API provides methods for
 decorating, replacing, and styling DOM elements exposed through a set of
-endpoints.
+link:pg-plugin-endpoints.html[endpoints].
 
 PolyGerrit provides a simple way for accessing the DOM via DOM hooks API. A DOM
 hook is a custom element that is instantiated for the plugin endpoint. In the
@@ -73,8 +73,6 @@
 For each endpoint, PolyGerrit provides a list of DOM properties (such as
 attributes and events) that are supported in the long-term.
 
-NOTE: TODO: Insert link to the full endpoints API.
-
 ``` js
 Gerrit.install(plugin => {
   const domHook = plugin.hook('reply-text');
@@ -137,22 +135,28 @@
 [[high-level-api-concepts]]
 == High-level DOM API concepts
 
-High leve API is based on low-level DOM API and is essentially a standartized
+High level API is based on low-level DOM API and is essentially a standardized
 way for doing common tasks. It's less flexible, but will be a bit more stable.
 
-Common way to access high-leve API is through `plugin` instance passed into
-setup callback parameter of `Gerrit.install()`, also sometimes referred as
-`self`.
+The common way to access high-level API is through `plugin` instance passed
+into setup callback parameter of `Gerrit.install()`, also sometimes referred to
+as `self`.
 
 [[low-level-api]]
 == Low-level DOM API
 
-Low-level DOM API methods are the base of all UI customization.
+The low-level DOM API methods are the base of all UI customization.
 
 === attributeHelper
 `plugin.attributeHelper(element)`
 
-Note: TODO
+Alternative for
+link:https://www.polymer-project.org/1.0/docs/devguide/data-binding[Polymer data
+binding] for plugins that don't use Polymer. Can be used to bind element
+attribute changes to callbacks.
+
+See `samples/bind-parameters.html` for examples on both Polymer data bindings
+and `attibuteHelper` usage.
 
 === eventHelper
 `plugin.eventHelper(element)`
@@ -162,11 +166,15 @@
 === hook
 `plugin.hook(endpointName, opt_options)`
 
+See list of supported link:pg-plugin-endpoints.html[endpoints].
+
 Note: TODO
 
 === registerCustomComponent
 `plugin.registerCustomComponent(endpointName, opt_moduleName, opt_options)`
 
+See list of supported link:pg-plugin-endpoints.html[endpoints].
+
 Note: TODO
 
 === registerStyleModule
@@ -180,6 +188,15 @@
 Plugin instance provides access to number of more specific APIs and methods
 to be used by plugin authors.
 
+=== admin
+`plugin.admin()`
+
+.Params:
+- none
+
+.Returns:
+- Instance of link:pg-plugin-admin-api.html[GrAdminApi].
+
 === changeReply
 `plugin.changeReply()`
 
@@ -215,6 +232,53 @@
 
 Note: TODO
 
+=== panel
+`plugin.panel(extensionpoint, callback)`
+
+Deprecated. Use `plugin.registerCustomComponent()` instead.
+
+``` js
+Gerrit.install(function(self) {
+  self.panel('CHANGE_SCREEN_BELOW_COMMIT_INFO_BLOCK', function(context) {
+    context.body.innerHTML =
+      'Sample link: <a href="http://some.com/foo">Foo</a>';
+    context.show();
+  });
+});
+```
+
+Here's the recommended approach that uses Polymer for generating custom elements:
+
+``` html
+<dom-module id="some-plugin">
+  <script>
+    Gerrit.install(plugin => {
+      plugin.registerCustomComponent(
+        'change-view-integration', 'some-ci-module');
+    });
+  </script>
+</dom-module>
+
+<dom-module id="some-ci-module">
+  <template>
+    Sample link: <a href="http://some.com/foo">Foo</a>
+  </template>
+  <script>
+    Polymer({is: 'some-ci-module'});
+  </script>
+</dom-module>
+```
+
+Here's a minimal example that uses low-level DOM Hooks API for the same purpose:
+
+``` js
+Gerrit.install(plugin => {
+  plugin.hook('change-view-integration', el => {
+    el.innerHTML = 'Sample link: <a href="http://some.com/foo">Foo</a>';
+  });
+});
+```
+
 === popup
 `plugin.popup(moduleName)`
 
@@ -225,21 +289,78 @@
 
 Note: TODO
 
-[plugin-project]
-=== project
-`plugin.project()`
+[[plugin-rest-api]]
+=== restApi
+`plugin.restApi(opt_prefix)`
+
+.Params:
+- (optional) URL prefix, for easy switching into plugin URL space,
+  e.g. `changes/1/revisions/1/cookbook~say-hello`
+
+.Returns:
+- Instance of link:pg-plugin-rest-api.html[GrPluginRestApi].
+
+[[plugin-repo]]
+=== repo
+`plugin.repo()`
 
 .Params:
 - none
 
 .Returns:
-- Instance of link:pg-plugin-project-api.html[GrProjectApi].
+- Instance of link:pg-plugin-repo-api.html[GrRepoApi].
 
 === put
 `plugin.put(url, payload, opt_callback)`
 
 Note: TODO
 
+=== screen
+`plugin.screen(screenName, opt_moduleName)`
+
+.Params:
+- `*string* screenName` URL path fragment of the screen, e.g.
+`/x/pluginname/*screenname*`
+- `*string* opt_moduleName` (Optional) Web component to be instantiated for this
+screen.
+
+.Returns:
+- Instance of GrDomHook.
+
+=== screenUrl
+`plugin.url(opt_screenName)`
+
+.Params:
+- `*string* screenName` (optional) URL path fragment of the screen, e.g.
+`/x/pluginname/*screenname*`
+
+.Returns:
+- Absolute URL for the screen, e.g. `http://localhost/base/x/pluginname/screenname`
+
+[[plugin-settings]]
+=== settings
+`plugin.settings()`
+
+.Params:
+- none
+
+.Returns:
+- Instance of link:pg-plugin-settings-api.html[GrSettingsApi].
+
+=== settingsScreen
+`plugin.settingsScreen(path, menu, callback)`
+
+Deprecated. Use link:#plugin-settings[`plugin.settings()`] instead.
+
+=== changeMetadata
+`plugin.changeMetadata()`
+
+.Params:
+- none
+
+.Returns:
+- Instance of link:pg-plugin-change-metadata-api.html[GrChangeMetadataApi].
+
 === theme
 `plugin.theme()`
 
@@ -249,3 +370,90 @@
 `plugin.url(opt_path)`
 
 Note: TODO
+
+[[deprecated-api]]
+== Deprecated APIs
+
+Some of the deprecated APIs have limited implementation in PolyGerrit to serve
+as a "stepping stone" to allow gradual migration.
+
+=== install
+`plugin.deprecated.install()`
+
+.Params:
+- none
+
+Replaces plugin APIs with a deprecated version. This allows use of deprecated
+APIs without changing JS code. For example, `onAction` is not available by
+default, and after `plugin.deprecated.install()` it's accessible via
+`self.onAction()`.
+
+=== onAction
+`plugin.deprecated.onAction(type, view_name, callback)`
+
+.Params:
+- `*string* type` Action type.
+- `*string* view_name` REST API action.
+- `*function(actionContext)* callback` Callback invoked on action button click.
+
+Adds a button to the UI with a click callback. Exact button location depends on
+parameters. Callback is triggered with an instance of
+link:#deprecated-action-context[action context].
+
+Support is limited:
+
+- type is either `change` or `revision`.
+
+See link:js-api.html#self_onAction[self.onAction] for more info.
+
+=== panel
+`plugin.deprecated.panel(extensionpoint, callback)`
+
+.Params:
+- `*string* extensionpoint`
+- `*function(screenContext)* callback`
+
+Adds a UI DOM element and triggers a callback with context to allow direct DOM
+access.
+
+Support is limited:
+
+- extensionpoint is one of the following:
+ * CHANGE_SCREEN_BELOW_COMMIT_INFO_BLOCK
+ * CHANGE_SCREEN_BELOW_CHANGE_INFO_BLOCK
+
+See link:js-api.html#self_panel[self.panel] for more info.
+
+=== settingsScreen
+`plugin.deprecated.settingsScreent(path, menu, callback)`
+
+.Params:
+- `*string* path` URL path fragment of the screen for direct link.
+- `*string* menu` Menu item title.
+- `*function(settingsScreenContext)* callback`
+
+Adds a settings menu item and a section in the settings screen that is provided
+to plugin for setup.
+
+See link:js-api.html#self_settingsScreen[self.settingsScreen] for more info.
+
+[[deprecated-action-context]]
+=== Action Context (deprecated)
+Instance of Action Context is passed to `onAction()` callback.
+
+Support is limited:
+
+- `popup()`
+- `hide()`
+- `refresh()`
+- `textfield()`
+- `br()`
+- `msg()`
+- `div()`
+- `button()`
+- `checkbox()`
+- `label()`
+- `prependLabel()`
+- `call()`
+
+See link:js-api.html#ActionContext[Action Context] for more info.
diff --git a/Documentation/pg-plugin-endpoints.txt b/Documentation/pg-plugin-endpoints.txt
new file mode 100644
index 0000000..ad613a5
--- /dev/null
+++ b/Documentation/pg-plugin-endpoints.txt
@@ -0,0 +1,143 @@
+= Gerrit Code Review - PolyGerrit Plugin Styling
+
+Plugins should be html-based and imported following PolyGerrit's
+link:pg-plugin-dev.html#loading[dev guide].
+
+Sample code for testing endpoints:
+
+``` js
+Gerrit.install(plugin => {
+  // Change endpoint below
+  const endpoint = 'change-metadata-item';
+  plugin.hook(endpoint).onAttached(element => {
+    console.log(endpoint, element);
+    const el = element.appendChild(document.createElement('div'));
+    el.textContent = 'Ah, there it is. Lovely.';
+    el.style = 'background: pink; line-height: 4em; text-align: center;';
+  });
+});
+```
+
+== Default parameters
+All endpoints receive the following parameters, set as attributes to custom
+components that are instantiated at the endpoint:
+
+* `plugin`
++
+the current plugin instance, the one that is used by `Gerrit.install()`.
+
+* `content`
++
+decorated DOM Element, is only set for registrations that decorate existing
+components.
+
+== Plugin endpoints
+
+The following endpoints are available to plugins.
+
+=== change-view-integration
+The `change-view-integration` extension point is located between `Files` and
+`Messages` section on the change view page, and it may take full page's
+width. Primary purpose is to enable plugins to display custom CI-related
+information (build status, etc).
+
+* `change`
++
+current change displayed, an instance of
+link:rest-api-changes.html#change-info[ChangeInfo]
+
+* `revision`
++
+current revision displayed, an instance of
+link:rest-api-changes.html#revision-info[RevisionInfo]
+
+=== change-metadata-item
+The `change-metadata-item` extension point is located on the bottom of the
+change view left panel, under the `Label Status` and `Links` sections. Its width
+is equal to the left panel's, and its primary purpose is to allow plugins to add
+sections of metadata to the left panel.
+
+In addition to default parameters, the following are available:
+
+* `change`
++
+current change displayed, an instance of
+link:rest-api-changes.html#change-info[ChangeInfo]
+
+* `revision`
++
+current revision displayed, an instance of
+link:rest-api-changes.html#revision-info[RevisionInfo]
+
+* `labels`
++
+labels with scores applied to the change, map of the label names to
+link:rest-api-changes.html#label-info[LabelInfo] entries
+
+=== robot-comment-controls
+The `robot-comment-controls` extension point is located inside each comment
+rendered on the diff page, and is only visible when the comment is a robot
+comment, specifically if the comment has a `robot_id` property.
+
+In addition to default parameters, the following are available:
+
+* `comment`
++
+current comment displayed, an instance of
+link:rest-api-changes.html#comment-info[CommentInfo]
+
+=== repo-command
+This endpoint is situated among the repository commands.
+
+In addition to default parameters, the following are available:
+
+* `repoName`
++
+String name of the repository currently being configured.
+
+* `config`
++
+The object representing the repo config.
+
+=== repo-config
+The `repo-config` extension point is located at the bottom of the repository
+configuration settings screen.
+
+In addition to default parameters, the following are available:
+
+* `repoName`
++
+String name of the repository currently being configured.
+
+=== settings-menu-item
+This endpoint is situated at the end of the navigation menu in the settings
+screen.
+
+=== settings-screen
+This endpoint is situated at the end of the body of the settings screen.
+
+=== reply-text
+This endpoint wraps the textarea in the reply dialog.
+
+=== reply-label-scores
+This endpoint decorator wraps the voting buttons in the reply dialog.
+
+=== header-title
+This endpoint wraps the title-text in the application header.
+
+=== confirm-submit-change
+This endpoint is inside the confirm submit dialog. By default it displays a
+generic confirmation message regarding submission of the change. Plugins may add
+content to this message or replace it entirely.
+
+In addition to default parameters, the following are available:
+
+* `change`
++
+The change beinng potentially submitted, an instance of
+link:rest-api-changes.html#change-info[ChangeInfo]
+
+* `action`
++
+The submit action, including the title and label, an instance of
+link:rest-api-changes.html#action-info[ActionInfo]
diff --git a/Documentation/pg-plugin-migration.txt b/Documentation/pg-plugin-migration.txt
index cb3340a..3ddceed 100644
--- a/Documentation/pg-plugin-migration.txt
+++ b/Documentation/pg-plugin-migration.txt
@@ -149,3 +149,4 @@
 Once deprecated APIs are migrated, `sampleplugin.js` will only contain
 duplicated code that's required for GWT UI to work. As soon as GWT support is removed from Gerrit
 that file can be simply deleted, along with the script tag loading it.
+
diff --git a/Documentation/pg-plugin-project-api.txt b/Documentation/pg-plugin-project-api.txt
deleted file mode 100644
index 897430c..0000000
--- a/Documentation/pg-plugin-project-api.txt
+++ /dev/null
@@ -1,36 +0,0 @@
-= Gerrit Code Review - Project admin customization API
-
-This API is provided by link:pg-plugin-dev.html#plugin-project[plugin.project()]
-and provides customization to admin page.
-
-== createCommand
-`projectApi.createCommand(title, checkVisibleCallback)`
-
-Create a project command in the admin panel.
-
-.Params
-- *title* String title.
-- *checkVisibleCallback* function to configure command visibility.
-
-.Returns
-- GrProjectApi for chainging.
-
-`checkVisibleCallback(projectName, projectConfig)`
-
-.Params
-- *projectName* String project name.
-- *projectConfig* Object REST API response for project config.
-
-.Returns
-- `false` to hide the command for the specific project.
-
-== onTap
-`projectApi.onTap(tapCalback)`
-
-Add a command tap callback.
-
-.Params
-- *tapCallback* function that's excuted on command tap.
-
-.Returns
-- Nothing
diff --git a/Documentation/pg-plugin-repo-api.txt b/Documentation/pg-plugin-repo-api.txt
new file mode 100644
index 0000000..1272ea6
--- /dev/null
+++ b/Documentation/pg-plugin-repo-api.txt
@@ -0,0 +1,36 @@
+= Gerrit Code Review - Repo admin customization API
+
+This API is provided by link:pg-plugin-dev.html#plugin-repo[plugin.repo()]
+and provides customization to admin page.
+
+== createCommand
+`repoApi.createCommand(title, checkVisibleCallback)`
+
+Create a repo command in the admin panel.
+
+.Params
+- *title* String title.
+- *checkVisibleCallback* function to configure command visibility.
+
+.Returns
+- GrRepoApi for chaining.
+
+`checkVisibleCallback(repoName, repoConfig)`
+
+.Params
+- *repoName* String project name.
+- *repoConfig* Object REST API response for repo config.
+
+.Returns
+- `false` to hide the command for the specific project.
+
+== onTap
+`repoApi.onTap(tapCalback)`
+
+Add a command tap callback.
+
+.Params
+- *tapCallback* function that's excuted on command tap.
+
+.Returns
+- Nothing
diff --git a/Documentation/pg-plugin-rest-api.txt b/Documentation/pg-plugin-rest-api.txt
new file mode 100644
index 0000000..70487ef
--- /dev/null
+++ b/Documentation/pg-plugin-rest-api.txt
@@ -0,0 +1,104 @@
+= Gerrit Code Review - Repo admin customization API
+
+This API is provided by link:pg-plugin-dev.html#plugin-rest-api[plugin.restApi()]
+and provides interface for Gerrit REST API.
+
+== getLoggedIn
+`repoApi.getLoggedIn()`
+
+Get user logged in status.
+
+.Params
+- None
+
+.Returns
+- Promise<boolean>
+
+== getVersion
+`repoApi.getVersion()`
+
+Get server version.
+
+.Params
+- None
+
+.Returns
+- Promise<string>
+
+== get
+`repoApi.get(url)`
+
+Issues a GET REST API call to the URL, returns Promise that is resolved to
+parsed response on success. Returned Promise is rejected on network error.
+
+.Params
+- *url* String URL without base path or plugin prefix.
+
+.Returns
+- Promise<Object> Parsed response.
+
+== post
+`repoApi.post(url, opt_payload)`
+
+Issues a POST REST API call to the URL, returns Promise that is resolved to
+parsed response on success. Returned Promise is rejected on network error.
+
+.Params
+- *url* String URL without base path or plugin prefix.
+- *opt_payload* (optional) Object Payload to be sent with the request.
+
+.Returns
+- Promise<Object> Parsed response.
+
+== put
+`repoApi.put(url, opt_payload)`
+
+Issues a PUT REST API call to the URL, returns Promise that is resolved to
+parsed response on success. Returned Promise is rejected on network error.
+
+.Params
+- *url* String URL without base path or plugin prefix.
+- *opt_payload* (optional) Object Payload to be sent with the request.
+
+.Returns
+- Promise<Object> Parsed response.
+
+== delete
+`repoApi.delete(url)`
+
+Issues a DELETE REST API call to the URL, returns Promise that is resolved to
+parsed response on HTTP 204, and rejected otherwise.
+
+.Params
+- *url* String URL without base path or plugin prefix.
+
+.Returns
+- Promise<Response> Fetch API's Response object.
+
+== send
+`repoApi.send(method, url, opt_payload)`
+
+Send payload and parse the response, if request succeeds. Returned Promise is
+rejected with detailed message or HTTP error code on network error.
+
+.Params
+- *method* String HTTP method.
+- *url* String URL without base path or plugin prefix.
+- *opt_payload* (optional) Object Respected for POST and PUT only.
+
+.Returns
+- Promise<Object> Parsed response.
+
+== fetch
+`repoApi.fetch(method, url, opt_payload)`
+
+Send payload and return native Response. This method is for low-level access, to
+implement custom error handling and parsing.
+
+.Params
+- *method* String HTTP method.
+- *url* String URL without base path or plugin prefix.
+- *opt_payload* (optional) Object Respected for POST and PUT only.
+
+.Returns
+- Promise<Response> Fetch API's Response object.
diff --git a/Documentation/pg-plugin-settings-api.txt b/Documentation/pg-plugin-settings-api.txt
new file mode 100644
index 0000000..985809d
--- /dev/null
+++ b/Documentation/pg-plugin-settings-api.txt
@@ -0,0 +1,40 @@
+= Gerrit Code Review - Settings admin customization API
+
+This API is provided by link:pg-plugin-dev.html#plugin-settings[plugin.settings()]
+and provides customization to settings page.
+
+== title
+`settingsApi.title(title)`
+
+.Params
+- `*string* title` Menu item and settings section title
+
+.Returns
+- `GrSettingsApi` for chaining.
+
+== token
+`settingsApi.token(token)`
+
+.Params
+- `*string* token` URL path fragment of the screen for direct link, e.g.
+`settings/#x/some-plugin/*token*`
+
+.Returns
+- `GrSettingsApi` for chaining.
+
+== module
+`settingsApi.module(token)`
+
+.Params
+- `*string* module` Custom element name for instantiating in the settings plugin
+area.
+
+.Returns
+- `GrSettingsApi` for chaining.
+
+== build
+
+.Params
+- none
+
+Apply all other configuration parameters and create required UI elements.
diff --git a/Documentation/pg-plugin-styling.txt b/Documentation/pg-plugin-styling.txt
index 58b6d7a..301da51 100644
--- a/Documentation/pg-plugin-styling.txt
+++ b/Documentation/pg-plugin-styling.txt
@@ -10,16 +10,16 @@
 link:https://tabatkins.github.io/specs/css-apply-rule/[using @apply] to its
 direct contents.
 
-NOTE: Only items (ie CSS properties and mixin targets) documented here are
+NOTE: Only items (i.e. CSS properties and mixin targets) documented here are
 guaranteed to work in the long term, since they are covered by integration
 tests. + When there is a need to add new property or endpoint, please
 link:https://bugs.chromium.org/p/gerrit/issues/entry?template=PolyGerrit%20Issue[file
-a bug] stating your usecase to track and maintain for future releases.
+a bug] stating your use case to track and maintain for future releases.
 
-Plugin should be html-based and imported following PolyGerrit's
+Plugins should be html-based and imported following PolyGerrit's
 link:pg-plugin-dev.html#loading[dev guide].
 
-Plugin should provide Style Module, for example:
+Plugins should provide Style Module, for example:
 
 ``` html
   <dom-module id="some-style">
@@ -33,7 +33,7 @@
   </dom-module>
 ```
 
-Plugin should register style module with a styling endpoint using
+Plugins should register style module with a styling endpoint using
 `Plugin.prototype.registerStyleModule(endpointName, styleModuleName)`, for
 example:
 
@@ -45,7 +45,7 @@
 
 == Available styling endpoints
 === change-metadata
-Following custom css mixins are recognized:
+Following custom CSS mixins are recognized:
 
 * `--change-metadata-assignee`
 +
diff --git a/Documentation/pgm-LocalUsernamesToLowerCase.txt b/Documentation/pgm-LocalUsernamesToLowerCase.txt
index 03aaabf..4b50961 100644
--- a/Documentation/pgm-LocalUsernamesToLowerCase.txt
+++ b/Documentation/pgm-LocalUsernamesToLowerCase.txt
@@ -14,7 +14,11 @@
 == DESCRIPTION
 Converts the local username for every account to lower case. The
 local username is the username that is used to login into the Gerrit
-Web UI.
+Web UI. The local username is stored a external ID with scheme
+`gerrit`.
+
+[IMPORTANT]
+This program does not modify usernames in the `username` scheme.
 
 This task is only intended to be run if the configuration parameter
 link:config-gerrit.html#ldap.localUsernameToLowerCase[ldap.localUsernameToLowerCase]
diff --git a/Documentation/project-configuration.txt b/Documentation/project-configuration.txt
index 4a81bcb4..f76b5e4 100644
--- a/Documentation/project-configuration.txt
+++ b/Documentation/project-configuration.txt
@@ -57,6 +57,15 @@
 its dependencies are also submitted, with exceptions documented below.
 The following submit types are supported:
 
+[[submit_type_inherit]]
+* Inherit
++
+This is the default for new projects, unless overridden by a global
+link:config-gerrit.html#repository.name.defaultSubmitType[`defaultSubmitType` option].
++
+Inherit the submit type from the parent project. In `All-Projects`, this
+is equivalent to link:#merge_if_necessary[Merge If Necessary].
+
 [[fast_forward_only]]
 * Fast Forward Only
 +
@@ -70,9 +79,6 @@
 [[merge_if_necessary]]
 * Merge If Necessary
 +
-This is the default for new projects, unless overridden by a global
-link:config-gerrit.html#repository.name.defaultSubmitType[`defaultSubmitType` option].
-+
 If the change being submitted is a strict superset of the destination
 branch, then the branch is fast-forwarded to the change.  If not,
 then a merge commit is automatically created.  This is identical
diff --git a/Documentation/prolog-change-facts.txt b/Documentation/prolog-change-facts.txt
index 01a1878..2fb13e9 100644
--- a/Documentation/prolog-change-facts.txt
+++ b/Documentation/prolog-change-facts.txt
@@ -33,10 +33,10 @@
     |ID, full name and the email of the commit author.  The full name and the
     email are string atoms
 
-|`commit_committer/1` |`commit_committer()`
+|`commit_committer/1` |`commit_committer(user(100000)).`
     |Committer of the commit as `user(ID)` term. ID is the numeric account ID
 
-|`commit_committer/3` |`commit_committer()`
+|`commit_committer/3` |`commit_committer(user(100000), 'John Doe', 'john.doe@example.com').`
     |ID, full name and the email of the commit committer. The full name and the
     email are string atoms
 
@@ -51,13 +51,6 @@
 |`commit_stats/3`   |`commit_stats(5,20,50).`
     |Number of files modified, number of insertions and the number of deletions.
 
-.4+|`current_user/1`  |`current_user(user(1000000)).`
-    .4+|Current user as one of the four given possibilities
-
-                      |`current_user(user(anonymous)).`
-                      |`current_user(user(peer_daemon)).`
-                      |`current_user(user(replication)).`
-
 |`pure_revert/1`     |`pure_revert(1).`
     |link:rest-api-changes.html#get-pure-revert[Pure revert] as integer atom (1 if
         the change is a pure revert, 0 otherwise)
diff --git a/Documentation/prolog-cookbook.txt b/Documentation/prolog-cookbook.txt
index ad4530e..19ed98a 100644
--- a/Documentation/prolog-cookbook.txt
+++ b/Documentation/prolog-cookbook.txt
@@ -517,8 +517,9 @@
     Author = label('Author-is-John-Doe', need(_)).
 
 submit_rule(submit(Author)) :-
-    gerrit:commit_author(A, _, 'john.doe@example.com'),
-    Author = label('Author-is-John-Doe', ok(A)).
+    gerrit:commit_author(_, _, 'john.doe@example.com'),
+    gerrit:uploader(U),
+    Author = label('Author-is-John-Doe', ok(U)).
 ----
 
 or by user id (assuming it is `1000000`):
@@ -544,9 +545,9 @@
     Author = label('Author-is-John-Doe', need(_)).
 
 submit_rule(submit(Author)) :-
-    A = user(1000000),
-    gerrit:commit_author(A, 'John Doe', 'john.doe@example.com'),
-    Author = label('Author-is-John-Doe', ok(A)).
+    gerrit:commit_author(_, 'John Doe', 'john.doe@example.com'),
+    gerrit:uploader(U),
+    Author = label('Author-is-John-Doe', ok(U)).
 ----
 
 === Example 7: Make change submittable if commit message starts with "Fix "
@@ -572,8 +573,8 @@
 
 submit_rule(submit(Fix)) :-
     gerrit:commit_message(M), name(M, L), starts_with(L, "Fix "),
-    gerrit:commit_author(A),
-    Fix = label('Commit-Message-starts-with-Fix', ok(A)).
+    gerrit:uploader(U),
+    Fix = label('Commit-Message-starts-with-Fix', ok(U)).
 
 starts_with(L, []).
 starts_with([H|T1], [H|T2]) :- starts_with(T1, T2).
@@ -598,8 +599,8 @@
 
 submit_rule(submit(Fix)) :-
     gerrit:commit_message_matches('^Fix '),
-    gerrit:commit_author(A),
-    Fix = label('Commit-Message-starts-with-Fix', ok(A)).
+    gerrit:uploader(U),
+    Fix = label('Commit-Message-starts-with-Fix', ok(U)).
 ----
 
 The previous example could also be written so that it first checks if the commit
@@ -611,8 +612,8 @@
 ----
 submit_rule(submit(Fix)) :-
     gerrit:commit_message_matches('^Fix '),
-    gerrit:commit_author(A),
-    Fix = label('Commit-Message-starts-with-Fix', ok(A)),
+    gerrit:uploader(U),
+    Fix = label('Commit-Message-starts-with-Fix', ok(U)),
     !.
 
 % Message does not start with 'Fix ' so Fix is needed to submit
@@ -795,7 +796,7 @@
 
 === Example 10: Combine examples 8 and 9
 In this example we want to both remove the verified and have the four eyes
-principle.  This means we want a combination of examples 7 and 8.
+principle.  This means we want a combination of examples 8 and 9.
 
 `rules.pl`
 [source,prolog]
@@ -979,30 +980,7 @@
 add_apprentice_master(S, S).
 ----
 
-=== Example 15: Only allow Author to submit change
-This example adds a new needed category `Only-Author-Can-Submit` for any user
-that is not the author of the patch. This effectively blocks all users except
-the author from submitting the change. This could result in an impossible
-situation if the author does not have permissions for submitting the change.
-
-`rules.pl`
-[source,prolog]
-----
-submit_rule(S) :-
-    gerrit:default_submit(In),
-    In =.. [submit | Ls],
-    only_allow_author_to_submit(Ls, R),
-    S =.. [submit | R].
-
-only_allow_author_to_submit(S, S) :-
-    gerrit:commit_author(Id),
-    gerrit:current_user(Id),
-    !.
-
-only_allow_author_to_submit(S1, [label('Only-Author-Can-Submit', need(_)) | S1]).
-----
-
-=== Example 16: Make change submittable if all comments have been resolved
+=== Example 15: Make change submittable if all comments have been resolved
 In this example we will use the `unresolved_comments_count` fact about a
 change. Our goal is to block the submission of any change with some
 unresolved comments. Basically, it can be achieved by the following rules:
@@ -1013,8 +991,8 @@
 submit_rule(submit(R)) :-
     gerrit:unresolved_comments_count(0),
     !,
-    gerrit:commit_author(A),
-    R = label('All-Comments-Resolved', ok(A)).
+    gerrit:uploader(U),
+    R = label('All-Comments-Resolved', ok(U)).
 
 submit_rule(submit(R)) :-
     gerrit:unresolved_comments_count(U),
@@ -1033,8 +1011,8 @@
     base(CR, V),
     gerrit:unresolved_comments_count(0),
     !,
-    gerrit:commit_author(A),
-    R = label('All-Comments-Resolved', ok(A)).
+    gerrit:uploader(U),
+    R = label('All-Comments-Resolved', ok(U)).
 
 submit_rule(submit(CR, V, R)) :-
     base(CR, V),
@@ -1052,7 +1030,7 @@
 indicate to the user that all the comments have to be resolved for the
 change to become submittable.
 
-=== Example 17: Make change submittable if it is a pure revert
+=== Example 16: Make change submittable if it is a pure revert
 In this example we will use the `pure_revert` fact about a
 change. Our goal is to block the submission of any change that is not a
 pure revert. Basically, it can be achieved by the following rules:
@@ -1063,8 +1041,8 @@
 submit_rule(submit(R)) :-
     gerrit:pure_revert(1),
     !,
-    gerrit:commit_author(A),
-    R = label('Is-Pure-Revert', ok(A)).
+    gerrit:uploader(U),
+    R = label('Is-Pure-Revert', ok(U)).
 
 submit_rule(submit(R)) :-
     gerrit:pure_revert(U),
@@ -1083,8 +1061,8 @@
     base(CR, V),
     gerrit:pure_revert(1),
     !,
-    gerrit:commit_author(A),
-    R = label('Is-Pure-Revert', ok(A)).
+    gerrit:uploader(U),
+    R = label('Is-Pure-Revert', ok(U)).
 
 submit_rule(submit(CR, V, R)) :-
     base(CR, V),
diff --git a/Documentation/replace_macros.py b/Documentation/replace_macros.py
index c76d133..309a135 100755
--- a/Documentation/replace_macros.py
+++ b/Documentation/replace_macros.py
@@ -89,7 +89,7 @@
 </button>
 <script type="text/javascript">
 var f = function() {
-  window.location = '../#/Documentation/' +
+  window.location = '../#/Documentation/q/' +
     encodeURIComponent(document.getElementById("docSearch").value);
 }
 document.getElementById("searchBox").onclick = f;
@@ -183,7 +183,8 @@
           element.insertBefore(a, element.firstChild);
 
           // remove the link icon when the mouse is moved away,
-          // but keep it shown if the mouse is over the element, the link or the icon
+          // but keep it shown if the mouse is over the element, the link or
+          // the icon
           hide = function(evt) {
             if (document.elementFromPoint(evt.clientX, evt.clientY) != element
                 && document.elementFromPoint(evt.clientX, evt.clientY) != a
@@ -229,54 +230,54 @@
 options, _ = opts.parse_args()
 
 try:
-  try:
-    out_file = open(options.out, 'w', errors='ignore')
-    src_file = open(options.src, 'r', errors='ignore')
-  except TypeError:
-    out_file = open(options.out, 'w')
-    src_file = open(options.src, 'r')
-  last_line = ''
-  ignore_next_line = False
-  last_title = ''
-  for line in src_file:
-    if PAT_GERRIT.match(last_line):
-      # Case of "GERRIT\n------" at the footer
-      out_file.write(GERRIT_UPLINK)
-      last_line = ''
-    elif PAT_SEARCHBOX.match(last_line):
-      # Case of 'SEARCHBOX\n---------'
-      if options.searchbox:
-        out_file.write(SEARCH_BOX)
-      last_line = ''
-    elif PAT_INCLUDE.match(line):
-      # Case of 'include::<filename>'
-      match = PAT_INCLUDE.match(line)
-      out_file.write(last_line)
-      last_line = match.group(1) + options.suffix + match.group(2) + '\n'
-    elif PAT_STARS.match(line):
-      if PAT_TITLE.match(last_line):
-        # Case of the title in '.<title>\n****\nget::<url>\n****'
-        match = PAT_TITLE.match(last_line)
-        last_title = GET_TITLE % match.group(1)
-      else:
-        out_file.write(last_line)
-        last_title = ''
-    elif PAT_GET.match(line):
-      # Case of '****\nget::<url>\n****' in rest api
-      url = PAT_GET.match(line).group(1)
-      out_file.write(GET_MACRO.format(url) % last_title)
-      ignore_next_line = True
-    elif ignore_next_line:
-      # Handle the trailing '****' of the 'get::' case
-      last_line = ''
-      ignore_next_line = False
-    else:
-      out_file.write(last_line)
-      last_line = line
-  out_file.write(last_line)
-  out_file.write(LINK_SCRIPT)
-  out_file.close()
+    try:
+        out_file = open(options.out, 'w', errors='ignore')
+        src_file = open(options.src, 'r', errors='ignore')
+    except TypeError:
+        out_file = open(options.out, 'w')
+        src_file = open(options.src, 'r')
+    last_line = ''
+    ignore_next_line = False
+    last_title = ''
+    for line in src_file:
+        if PAT_GERRIT.match(last_line):
+            # Case of "GERRIT\n------" at the footer
+            out_file.write(GERRIT_UPLINK)
+            last_line = ''
+        elif PAT_SEARCHBOX.match(last_line):
+            # Case of 'SEARCHBOX\n---------'
+            if options.searchbox:
+                out_file.write(SEARCH_BOX)
+            last_line = ''
+        elif PAT_INCLUDE.match(line):
+            # Case of 'include::<filename>'
+            match = PAT_INCLUDE.match(line)
+            out_file.write(last_line)
+            last_line = match.group(1) + options.suffix + match.group(2) + '\n'
+        elif PAT_STARS.match(line):
+            if PAT_TITLE.match(last_line):
+                # Case of the title in '.<title>\n****\nget::<url>\n****'
+                match = PAT_TITLE.match(last_line)
+                last_title = GET_TITLE % match.group(1)
+            else:
+                out_file.write(last_line)
+                last_title = ''
+        elif PAT_GET.match(line):
+            # Case of '****\nget::<url>\n****' in rest api
+            url = PAT_GET.match(line).group(1)
+            out_file.write(GET_MACRO.format(url) % last_title)
+            ignore_next_line = True
+        elif ignore_next_line:
+            # Handle the trailing '****' of the 'get::' case
+            last_line = ''
+            ignore_next_line = False
+        else:
+            out_file.write(last_line)
+            last_line = line
+    out_file.write(last_line)
+    out_file.write(LINK_SCRIPT)
+    out_file.close()
 except IOError as err:
-  sys.stderr.write(
-      "error while expanding %s to %s: %s" % (options.src, options.out, err))
-  exit(1)
+    sys.stderr.write(
+        "error while expanding %s to %s: %s" % (options.src, options.out, err))
+    exit(1)
diff --git a/Documentation/rest-api-access.txt b/Documentation/rest-api-access.txt
index 6f49a7d..c2a7d21 100644
--- a/Documentation/rest-api-access.txt
+++ b/Documentation/rest-api-access.txt
@@ -406,10 +406,14 @@
 |`config_visible`     |not set if `false`|
 Whether the calling user can see the `refs/meta/config` branch of the
 project.
-|`groups`            |A map of group UUID to
-link:rest-api-groups.html#group-info[GroupInfo] objects, describing
-the group UUIDs used in the `local` map. Groups that are not visible
-are omitted from the `groups` map.
+|`groups`            ||A map of group UUID to
+link:rest-api-groups.html#group-info[GroupInfo] objects, with names and
+URLs for the group UUIDs used in the `local` map.
+This will include names for groups that might
+be invisible to the caller.
+|`configWebLinks`    ||
+A list of URLs that display the history of the configuration file
+governing this project's access rights.
 |==================================
 
 
diff --git a/Documentation/rest-api-accounts.txt b/Documentation/rest-api-accounts.txt
index dc45ff5..de5f278 100644
--- a/Documentation/rest-api-accounts.txt
+++ b/Documentation/rest-api-accounts.txt
@@ -63,7 +63,9 @@
 
 [[all-emails]]
 --
-* `ALL_EMAILS`: Includes all registered emails.
+* `ALL_EMAILS`: Includes all registered emails. Requires the caller
+to have the link:access-control.html#capability_modifyAccount[Modify
+Account] global capability.
 --
 
 [[suggest-account]]
@@ -79,6 +81,10 @@
   GET /accounts/?suggest&q=John HTTP/1.0
 ----
 
+Secondary emails are only included if the calling user has the
+link:access-control.html#capability_modifyAccount[Modify Account]
+capability.
+
 .Response
 ----
   HTTP/1.1 200 OK
@@ -1764,6 +1770,152 @@
   HTTP/1.1 204 No Content
 ----
 
+[[list-contributor-agreements]]
+=== List Contributor Agreements
+--
+'GET /accounts/link:#account-id[\{account-id\}]/agreements'
+--
+
+Gets a list of the user's signed contributor agreements.
+
+.Request
+----
+  GET /a/accounts/self/agreements HTTP/1.0
+----
+
+As response the user's signed agreements are returned as a list
+of link:#contributor-agreement-info[ContributorAgreementInfo] entities.
+
+.Response
+----
+  HTTP/1.1 200 OK
+  Content-Disposition: attachment
+  Content-Type: application/json; charset=UTF-8
+
+  )]}'
+  [
+    {
+      "name": "Individual",
+      "description": "If you are going to be contributing code on your own, this is the one you want. You can sign this one online.",
+      "url": "static/cla_individual.html"
+    }
+  ]
+----
+
+[delete-draft-comments]
+=== Delete Draft Comments
+--
+'POST /accounts/link:#account-id[\{account-id\}]/drafts:delete'
+--
+
+Deletes some or all of a user's draft comments. The set of comments to delete is
+specified as a link:#delete-draft-comments-input[DeleteDraftCommentsInput]
+entity. An empty input entity deletes all comments.
+
+Only drafts belonging to the caller may be deleted.
+
+.Request
+----
+  POST /accounts/self/drafts.delete HTTP/1.0
+  Content-Type: application/json; charset=UTF-8
+
+  {
+    "query": "is:abandoned"
+  }
+----
+
+As a response, a list of
+link:#deleted-draft-comment-info[DeletedDraftCommentInfo] entities is returned.
+
+.Response
+----
+  HTTP/1.1 200 OK
+  Content-Disposition: attachment
+  Content-Type: application/json; charset=UTF-8
+
+   )]}'
+   [
+     {
+       "change": {
+         "id": "myProject~master~I8473b95934b5732ac55d26311a706c9c2bde9940",
+         "project": "myProject",
+         "branch": "master",
+         "change_id": "I8473b95934b5732ac55d26311a706c9c2bde9940",
+         "subject": "Implementing Feature X",
+         "status": "ABANDONED",
+         "created": "2013-02-01 09:59:32.126000000",
+         "updated": "2013-02-21 11:16:36.775000000",
+         "insertions": 34,
+         "deletions": 101,
+         "_number": 3965,
+         "owner": {
+           "name": "John Doe"
+         }
+       },
+       "deleted": [
+         {
+           "id": "TvcXrmjM",
+           "path": "gerrit-server/src/main/java/com/google/gerrit/server/project/RefControl.java",
+           "line": 23,
+           "message": "[nit] trailing whitespace",
+           "updated": "2013-02-26 15:40:43.986000000"
+         }
+       ]
+     }
+   ]
+----
+
+[[sign-contributor-agreement]]
+=== Sign Contributor Agreement
+--
+'PUT /accounts/link:#account-id[\{account-id\}]/agreements'
+--
+
+Signs a contributor agreement.
+
+The contributor agreement must be provided in the request body as
+a link:#contributor-agreement-input[ContributorAgreementInput].
+
+.Request
+----
+  PUT /accounts/self/agreements HTTP/1.0
+  Content-Type: application/json; charset=UTF-8
+
+  {
+    "name": "Individual"
+  }
+----
+
+As response the contributor agreement name is returned.
+
+.Response
+----
+  HTTP/1.1 200 OK
+  Content-Disposition: attachment
+  Content-Type: application/json; charset=UTF-8
+
+  )]}'
+  "Individual"
+----
+
+[[index-account]]
+=== Index Account
+--
+'POST /accounts/link:#account-id[\{account-id\}]/index'
+--
+
+Adds or updates the account in the secondary index.
+
+.Request
+----
+  POST /accounts/1000096/index HTTP/1.0
+----
+
+.Response
+----
+  HTTP/1.1 204 No Content
+----
+
 [[default-star-endpoints]]
 == Default Star Endpoints
 
@@ -1980,89 +2132,6 @@
   ]
 ----
 
-[[list-contributor-agreements]]
-=== List Contributor Agreements
---
-'GET /accounts/link:#account-id[\{account-id\}]/agreements'
---
-
-Gets a list of the user's signed contributor agreements.
-
-.Request
-----
-  GET /a/accounts/self/agreements HTTP/1.0
-----
-
-As response the user's signed agreements are returned as a list
-of link:#contributor-agreement-info[ContributorAgreementInfo] entities.
-
-.Response
-----
-  HTTP/1.1 200 OK
-  Content-Disposition: attachment
-  Content-Type: application/json; charset=UTF-8
-
-  )]}'
-  [
-    {
-      "name": "Individual",
-      "description": "If you are going to be contributing code on your own, this is the one you want. You can sign this one online.",
-      "url": "static/cla_individual.html"
-    }
-  ]
-----
-
-[[sign-contributor-agreement]]
-=== Sign Contributor Agreement
---
-'PUT /accounts/link:#account-id[\{account-id\}]/agreements'
---
-
-Signs a contributor agreement.
-
-The contributor agreement must be provided in the request body as
-a link:#contributor-agreement-input[ContributorAgreementInput].
-
-.Request
-----
-  PUT /accounts/self/agreements HTTP/1.0
-  Content-Type: application/json; charset=UTF-8
-
-  {
-    "name": "Individual"
-  }
-----
-
-As response the contributor agreement name is returned.
-
-.Response
-----
-  HTTP/1.1 200 OK
-  Content-Disposition: attachment
-  Content-Type: application/json; charset=UTF-8
-
-  )]}'
-  "Individual"
-----
-
-[[index-account]]
-=== Index Account
---
-'POST /accounts/link:#account-id[\{account-id\}]/index'
---
-
-Adds or updates the account in the secondary index.
-
-.Request
-----
-  POST /accounts/1000096/index HTTP/1.0
-----
-
-.Response
-----
-  HTTP/1.1 204 No Content
-----
-
 [[ids]]
 == IDs
 
@@ -2164,7 +2233,10 @@
 |`secondary_emails`|optional|
 A list of the secondary email addresses of the user. +
 Only set for account queries when the link:#all-emails[ALL_EMAILS]
-option is set.
+option or the link:#suggest-account[suggest] parameter is set. +
+Secondary emails are only included if the calling user has the
+link:access-control.html#capability_modifyAccount[Modify Account], and
+hence is allowed to see secondary emails of other users.
 |`username`        |optional|The username of the user. +
 Only set if detailed account information is requested. +
 See option link:rest-api-changes.html#detailed-accounts[
@@ -2304,6 +2376,37 @@
 |`name`                     |The name of the agreement.
 |=================================
 
+[[delete-draft-comments-input]]
+=== DeleteDraftCommentsInput
+The `DeleteDraftCommentsInput` entity contains information specifying a set of
+draft comments that should be deleted.
+
+[options="header",cols="1,^1,5"]
+|=================================
+|Field Name                 ||Description
+|`query`                    |optional|
+A link:user-search.html[change query] limiting results to changes matching this
+query; `has:draft` is implied and not necessary to list explicitly. If not set,
+matches all changes with drafts.
+|=================================
+
+[[deleted-draft-comment-info]]
+=== DeletedDraftCommentInfo
+The `DeletedDraftCommentInfo` entity contains information about draft comments
+that were deleted.
+
+[options="header",cols="1,6"]
+|=================================
+|Field Name                 |Description
+|`change`                   |
+link:rest-api-changes.html#change-info[ChangeInfo] entity describing the change
+on which one or more comments was deleted. Populated with only the
+link:rest-api-changes.html#skip_mergeable[SKIP_MERGEABLE] option.
+|`deleted`                  |
+List of link:rest-api-changes.html#comment-info[CommentInfo] entities for each
+comment that was deleted.
+|=================================
+
 [[diff-preferences-info]]
 === DiffPreferencesInfo
 The `DiffPreferencesInfo` entity contains information about the diff
diff --git a/Documentation/rest-api-changes.txt b/Documentation/rest-api-changes.txt
index ec2500d..bfc3979 100644
--- a/Documentation/rest-api-changes.txt
+++ b/Documentation/rest-api-changes.txt
@@ -16,6 +16,9 @@
 The change input link:#change-input[ChangeInput] entity must be provided in the
 request body.
 
+To create a change the calling user must be allowed to
+link:access-control.html#category_push_review[upload to code review].
+
 .Request
 ----
   POST /changes/ HTTP/1.0
@@ -301,6 +304,13 @@
     link:user-search.html#reviewedby[reviewedby:self].
 --
 
+[[skip_mergeable]]
+--
+* `SKIP_MERGEABLE`: skip the `mergeable` field in
+link:#change-info[ChangeInfo]. For fast moving projects, this field must
+be recomputed often, which is slow for projects with big trees.
+--
+
 [[submittable]]
 --
 * `SUBMITTABLE`: include the `submittable` field in link:#change-info[ChangeInfo],
@@ -879,7 +889,8 @@
 Sets the topic of a change.
 
 The new topic must be provided in the request body inside a
-link:#topic-input[TopicInput] entity.
+link:#topic-input[TopicInput] entity. Any leading or trailing whitespace
+in the topic name will be removed.
 
 .Request
 ----
@@ -913,10 +924,6 @@
 
 Deletes the topic of a change.
 
-Please note that some proxies prohibit request bodies for DELETE
-requests. In this case, if you want to specify a commit message, use
-link:#set-topic[PUT] to delete the topic.
-
 .Request
 ----
   DELETE /changes/myProject~master~I8473b95934b5732ac55d26311a706c9c2bde9940/topic HTTP/1.0
@@ -1571,8 +1578,7 @@
 The listed changes use the same format as in
 link:#list-changes[Query Changes] with the
 link:#labels[`LABELS`], link:#detailed-labels[`DETAILED_LABELS`],
-link:#current-revision[`CURRENT_REVISION`],
-link:#current-commit[`CURRENT_COMMIT`], and
+link:#current-revision[`CURRENT_REVISION`],and
 link:#submittable[`SUBMITTABLE`] options set.
 
 Standard link:#query-options[formatting options] can be specified
@@ -1682,28 +1688,6 @@
           },
           "ref": "refs/changes/79/1779/1",
           "fetch": {},
-          "commit": {
-            "parents": [
-              {
-                "commit": "2d3176497a2747faed075f163707e57d9f961a1c",
-                "subject": "Merge changes from topic \u0027submodule-subscription-tests-and-fixes-3\u0027"
-              }
-            ],
-            "author": {
-              "name": "Stefan Beller",
-              "email": "sbeller@google.com",
-              "date": "2015-04-29 21:36:52.000000000",
-              "tz": -420
-            },
-            "committer": {
-              "name": "Stefan Beller",
-              "email": "sbeller@google.com",
-              "date": "2015-05-01 00:11:16.000000000",
-              "tz": -420
-            },
-            "subject": "ChangeMergeQueue: Rewrite such that it works on set of changes",
-            "message": "ChangeMergeQueue: Rewrite such that it works on set of changes\n\nChangeMergeQueue used to work on branches rather than sets of changes.\nThis change is a first step to merge sets of changes (e.g. grouped by a\ntopic and `changes.submitWholeTopic` enabled) in an atomic fashion.\nThis change doesn\u0027t aim to implement these changes, but only as a step\ntowards it.\n\nMergeOp keeps its functionality and behavior as is. A new class\nMergeOpMapper is introduced which will map the set of changes to\nthe set of branches. Additionally the MergeOpMapper is also\nresponsible for the threading done right now, which was part of\nthe ChangeMergeQueue before.\n\nChange-Id: I1ffe09a505e25f15ce1521bcfb222e51e62c2a14\n"
-          }
         }
       }
     },
@@ -1801,28 +1785,6 @@
           },
           "ref": "refs/changes/80/1780/1",
           "fetch": {},
-          "commit": {
-            "parents": [
-              {
-                "commit": "9adb9f4c7b40eeee0646e235de818d09164d7379",
-                "subject": "ChangeMergeQueue: Rewrite such that it works on set of changes"
-              }
-            ],
-            "author": {
-              "name": "Stefan Beller",
-              "email": "sbeller@google.com",
-              "date": "2015-04-25 00:11:59.000000000",
-              "tz": -420
-            },
-            "committer": {
-              "name": "Stefan Beller",
-              "email": "sbeller@google.com",
-              "date": "2015-05-01 00:11:16.000000000",
-              "tz": -420
-            },
-            "subject": "AbstractSubmoduleSubscription: Split up createSubscription",
-            "message": "AbstractSubmoduleSubscription: Split up createSubscription\n\nLater we want to have subscriptions to more submodules, so we need to\nfind a way to add more submodule entries into the file. By splitting up\nthe createSubscription() method, that is very easy by using the\naddSubmoduleSubscription method multiple times.\n\nChange-Id: I7fe807e63792b3d26776fd1422e5e790a5697e22\n"
-          }
         }
       }
     }
@@ -2270,17 +2232,9 @@
 Marks the change to be non-private. Note users can only unmark own private
 changes.
 
-A message can be specified in the request body inside a
-link:#private-input[PrivateInput] entity.
-
 .Request
 ----
   DELETE /changes/myProject~master~I8473b95934b5732ac55d26311a706c9c2bde9940/private HTTP/1.0
-  Content-Type: application/json; charset=UTF-8
-
-  {
-    "message": "This is a security fix that must not be public."
-  }
 ----
 
 .Response
@@ -2290,9 +2244,11 @@
 
 If the change was already not private, the response is "`409 Conflict`".
 
-Please note that some proxies prohibit request bodies for DELETE
-requests. In this case, if you want to set a message options, use a
-POST request:
+A message can be specified in the request body inside a
+link:#private-input[PrivateInput] entity. Historically, this method allowed
+a body in the DELETE, but that behavior is
+link:https://www.gerritcodereview.com/releases/2.16.md[deprecated].
+In this case, use a POST request instead:
 
 .Request
 ----
@@ -2442,6 +2398,146 @@
   ]
 ----
 
+[[list-change-messages]]
+=== List Change Messages
+--
+'GET /changes/link:#change-id[\{change-id\}]/messages'
+--
+
+Lists all the messages of a change including link:#detailed-accounts[detailed account information].
+
+.Request
+----
+  GET /changes/myProject~master~I8473b95934b5732ac55d26311a706c9c2bde9940/messages
+----
+
+As response a list of link:#change-message-info[ChangeMessageInfo] entities is returned.
+
+.Response
+----
+  HTTP/1.1 200 OK
+  Content-Disposition: attachment
+  Content-Type: application/json; charset=UTF-8
+
+  )]}'
+  [
+    {
+      "id": "YH-egE",
+      "author": {
+      "_account_id": 1000096,
+      "name": "John Doe",
+      "email": "john.doe@example.com",
+      "username": "jdoe"
+      },
+      "date": "2013-03-23 21:34:02.419000000",
+      "message": "Patch Set 1:\n\nThis is the first message.",
+      "_revision_number": 1
+    },
+    {
+      "id": "WEEdhU",
+      "author": {
+      "_account_id": 1000097,
+      "name": "Jane Roe",
+      "email": "jane.roe@example.com",
+      "username": "jroe"
+      },
+      "date": "2013-03-23 21:36:52.332000000",
+      "message": "Patch Set 1:\n\nThis is the second message.\n\nWith a line break.",
+      "_revision_number": 1
+    }
+  ]
+----
+
+[[get-change-message]]
+=== Get Change Message
+
+Retrieves a change message including link:#detailed-accounts[detailed account information].
+
+--
+'GET /changes/link:#change-id[\{change-id\}]/message/link:#change-message-id[\{change-message-id\}]'
+--
+
+As response a link:#change-message-info[ChangeMessageInfo] entity is returned.
+
+.Response
+----
+  HTTP/1.1 200 OK
+  Content-Disposition: attachment
+  Content-Type: application/json; charset=UTF-8
+
+  )]}'
+  {
+    "id": "aaee04dcb46bafc8be24d8aa70b3b1beb7df5780",
+    "author": {
+      "_account_id": 1000096,
+      "name": "John Doe",
+      "email": "john.doe@example.com",
+      "username": "jdoe"
+     },
+     "date": "2013-03-23 21:34:02.419000000",
+     "message": "a change message",
+     "_revision_number": 1
+  }
+----
+
+[[delete-change-message]]
+=== Delete Change Message
+--
+'DELETE /changes/link:#change-id[\{change-id\}]/message/link:#change-message-id[\{change-message-id\}]' +
+'POST /changes/link:#change-id[\{change-id\}]//message/link:#change-message-id[\{change-message-id\}]/delete'
+--
+
+Deletes a change message by replacing the change message with a new message,
+which contains the name of the user who deleted the change message and the
+reason why it was deleted. The reason can be provided in the request body as a
+link:#delete-change-message-input[DeleteChangeMessageInput] entity.
+
+Note that only users with the
+link:access-control.html#capability_administrateServer[Administrate Server]
+global capability are permitted to delete a change message.
+
+To delete a change message, send a DELETE request:
+
+.Request
+----
+  DELETE /changes/myProject~master~I8473b95934b5732ac55d26311a706c9c2bde9940/message/aaee04dcb46bafc8be24d8aa70b3b1beb7df5780 HTTP/1.0
+----
+
+To provide a reason for the deletion, use a POST request:
+
+.Request
+----
+  POST /changes/myProject~master~I8473b95934b5732ac55d26311a706c9c2bde9940/message/aaee04dcb46bafc8be24d8aa70b3b1beb7df5780/delete HTTP/1.0
+  Content-Type: application/json; charset=UTF-8
+
+  {
+    "reason": "spam"
+  }
+----
+
+As response a link:#change-message-info[ChangeMessageInfo] entity is returned that
+describes the updated change message.
+
+.Response
+----
+  HTTP/1.1 200 OK
+  Content-Disposition: attachment
+  Content-Type: application/json; charset=UTF-8
+
+  )]}'
+  {
+    "id": "aaee04dcb46bafc8be24d8aa70b3b1beb7df5780",
+    "author": {
+      "_account_id": 1000096,
+      "name": "John Doe",
+      "email": "john.doe@example.com",
+      "username": "jdoe"
+     },
+     "date": "2013-03-23 21:34:02.419000000",
+     "message": "Change message removed by: Administrator\nReason: spam",
+     "_revision_number": 1
+  }
+----
 
 [[edit-endpoints]]
 == Change Edit Endpoints
@@ -3087,18 +3183,17 @@
 
 Deletes a reviewer from a change.
 
-Options can be provided in the request body as a
-link:#delete-reviewer-input[DeleteReviewerInput] entity.
-
 .Request
 ----
   DELETE /changes/myProject~master~I8473b95934b5732ac55d26311a706c9c2bde9940/reviewers/John%20Doe HTTP/1.0
   POST /changes/myProject~master~I8473b95934b5732ac55d26311a706c9c2bde9940/reviewers/John%20Doe/delete HTTP/1.0
 ----
 
-Please note that some proxies prohibit request bodies for DELETE
-requests. In this case, if you want to specify options, use a POST
-request:
+Options can be provided in the request body as a
+link:#delete-reviewer-input[DeleteReviewerInput] entity.
+Historically, this method allowed a body in the DELETE, but that behavior is
+link:https://www.gerritcodereview.com/releases/2.16.md[deprecated].
+In this case, use a POST request instead:
 
 .Request
 ----
@@ -3168,18 +3263,17 @@
 Deletes a single vote from a change. Note, that even when the last vote of
 a reviewer is removed the reviewer itself is still listed on the change.
 
-Options can be provided in the request body as a
-link:#delete-vote-input[DeleteVoteInput] entity.
-
 .Request
 ----
   DELETE /changes/myProject~master~I8473b95934b5732ac55d26311a706c9c2bde9940/reviewers/John%20Doe/votes/Code-Review HTTP/1.0
   POST /changes/myProject~master~I8473b95934b5732ac55d26311a706c9c2bde9940/reviewers/John%20Doe/votes/Code-Review/delete HTTP/1.0
 ----
 
-Please note that some proxies prohibit request bodies for DELETE
-requests. In this case, if you want to specify options, use a POST
-request:
+Options can be provided in the request body as a
+link:#delete-vote-input[DeleteVoteInput] entity.
+Historically, this method allowed a body in the DELETE, but that behavior is
+link:https://www.gerritcodereview.com/releases/2.16.md[deprecated].
+In this case, use a POST request instead:
 
 .Request
 ----
@@ -4542,17 +4636,17 @@
 Deletes a published comment of a revision. Instead of deleting the
 whole comment, this endpoint just replaces the comment's message
 with a new message, which contains the name of the user who deletes
-the comment and the reason why it's deleted. The reason can be
-provided in the request body as a
-link:#delete-comment-input[DeleteCommentInput] entity.
+the comment and the reason why it's deleted.
 
 Note that only users with the
 link:access-control.html#capability_administrateServer[Administrate Server]
 global capability are permitted to delete a comment.
 
-Please note that some proxies prohibit request bodies for DELETE
-requests. In this case, if you want to specify options, use a
-POST request:
+Deletion reason can be provided in the request body as a
+link:#delete-comment-input[DeleteCommentInput] entity.
+Historically, this method allowed a body in the DELETE, but that behavior is
+link:https://www.gerritcodereview.com/releases/2.16.md[deprecated].
+In this case, use a POST request instead:
 
 .Request
 ----
@@ -5210,6 +5304,9 @@
 
 Cherry picks a revision to a destination branch.
 
+To cherry pick a commit with no change-id associated with it, see
+link:rest-api-projects.html#cherry-pick-commit[CherryPickCommit].
+
 The commit message and destination branch must be provided in the request body inside a
 link:#cherrypick-input[CherryPickInput] entity.  If the commit message
 does not specify a Change-Id, a new one is picked for the destination change.
@@ -5225,8 +5322,8 @@
   }
 ----
 
-As response a link:#change-info[ChangeInfo] entity is returned that
-describes the resulting cherry picked change.
+As response a link:#cherry-pick-change-info[CherryPickChangeInfo]
+entity is returned that describes the resulting cherry-pick change.
 
 .Response
 ----
@@ -5351,18 +5448,17 @@
 Note, that even when the last vote of a reviewer is removed the reviewer itself
 is still listed on the change.
 
-Options can be provided in the request body as a
-link:#delete-vote-input[DeleteVoteInput] entity.
-
 .Request
 ----
   DELETE /changes/myProject~master~I8473b95934b5732ac55d26311a706c9c2bde9940/revisions/674ac754f91e64a0efb8087e59a176484bd534d1/reviewers/John%20Doe/votes/Code-Review HTTP/1.0
   POST /changes/myProject~master~I8473b95934b5732ac55d26311a706c9c2bde9940/revisions/674ac754f91e64a0efb8087e59a176484bd534d1/reviewers/John%20Doe/votes/Code-Review/delete HTTP/1.0
 ----
 
-Please note that some proxies prohibit request bodies for DELETE
-requests. In this case, if you want to specify options, use a POST
-request:
+Options can be provided in the request body as a
+link:#delete-vote-input[DeleteVoteInput] entity.
+Historically, this method allowed a body in the DELETE, but that behavior is
+link:https://www.gerritcodereview.com/releases/2.16.md[deprecated].
+In this case, use a POST request instead:
 
 .Request
 ----
@@ -5392,8 +5488,8 @@
 Identifier that uniquely identifies one change. It contains the URL-encoded
 project name as well as the change number: "'$$<project>~<numericId>$$'"
 
-Gerrit still supports the following deprecated identifiers. These will be
-removed in a future release:
+Depending on the server's configuration, Gerrit can still support the following
+deprecated identifiers. These will be removed in a future release:
 
 * an ID of the change in the format "'$$<project>~<branch>~<Change-Id>$$'",
   where for the branch the `refs/heads/` prefix can be omitted
@@ -5402,6 +5498,14 @@
   ("I8473b95934b5732ac55d26311a706c9c2bde9940")
 * a numeric change ID ("4247")
 
+If you need more time to migrate off of old change IDs, please see
+link:config-gerrit.html#change.api.allowedIdentifier[change.api.allowedIdentifier]
+for more information on how to enable the use of deprecated identifiers.
+
+[[change-message-id]]
+=== \{change-message-id\}
+ID of a change message returned in a link:#change-message-info[ChangeMessageInfo].
+
 [[comment-id]]
 === \{comment-id\}
 UUID of a published comment.
@@ -5660,7 +5764,8 @@
 Not set for merged changes.
 |`mergeable`          |optional|
 Whether the change is mergeable. +
-Not set for merged changes, or if the change has not yet been tested.
+Not set for merged changes, if the change has not yet been tested, or
+if the link:#skip_mergeable[skip_mergeable] option is set.
 |`submittable`        |optional|
 Whether the change has been approved by the project submit rules. +
 Only set if link:#submittable[requested].
@@ -5678,6 +5783,9 @@
 Actions the caller might be able to perform on this revision. The
 information is a map of view name to link:#action-info[ActionInfo]
 entities.
+|`requirements`             |optional|
+List of the link:rest-api-changes.html#requirement[requirements] to be met before this change
+can be submitted.
 |`labels`             |optional|
 The labels of the change as a map that maps the label names to
 link:#label-info[LabelInfo] entries. +
@@ -5768,7 +5876,11 @@
 Whether the new change should be set to work in progress.
 |`base_change`        |optional|
 A link:#change-id[\{change-id\}] that identifies the base change for a create
-change operation.
+change operation. Mutually exclusive with `base_commit`.
+|`base_commit`        |optional|
+A 40-digit hex SHA-1 of the commit which will be the parent commit of the newly
+created change. If set, it must be a merged commit on the destination branch.
+Mutually exclusive with `base_change`.
 |`new_branch`         |optional, default to `false`|
 Allow creating a new branch when set to `true`.
 |`merge`              |optional|
@@ -5813,6 +5925,23 @@
 Which patchset (if any) generated this message.
 |==================================
 
+[[cherry-pick-change-info]]
+=== CherryPickChangeInfo
+The `CherryPickChangeInfo` entity contains information about a
+cherry-pick change.
+
+`CherryPickChangeInfo` has the same fields as link:#change-info[
+ChangeInfo]. In addition `CherryPickChangeInfo` has the following
+fields:
+
+[options="header",cols="1,^1,5"]
+|======================================
+|Field Name               ||Description
+|`contains_git_conflicts` |optional, not set if `false`|
+Whether any file in the change contains Git conflict markers.
+|======================================
+
+
 [[cherrypick-input]]
 === CherryPickInput
 The `CherryPickInput` entity contains information for cherry-picking a change to a new branch.
@@ -5820,7 +5949,7 @@
 [options="header",cols="1,^1,5"]
 |===========================
 |Field Name         ||Description
-|`message`          ||Commit message for the cherry-picked change
+|`message`          ||Commit message for the cherry-pick change
 |`destination`      ||Destination branch
 |`base`             |optional|
 40-hex digit SHA-1 of the commit which will be the parent commit of the newly created change.
@@ -5836,7 +5965,16 @@
 Additional information about whom to notify about the update as a map
 of recipient type to link:#notify-info[NotifyInfo] entity.
 |`keep_reviewers`   |optional, defaults to false|
-If true, carries reviewers and ccs over from original change to newly created one.
+If `true`, carries reviewers and ccs over from original change to newly created one.
+|`allow_conflicts`  |optional, defaults to false|
+If `true`, the cherry-pick uses content merge and succeeds also if
+there are conflicts. If there are conflicts the file contents of the
+created change contain git conflict markers to indicate the conflicts.
+Callers can find out if there were conflicts by checking the
+`contains_git_conflicts` field in the link:#cherry-pick-change-info[
+CherryPickChangeInfo] that is returned by the cherry-pick REST
+endpoints. If there are conflicts the cherry-pick change is marked as
+work-in-progress.
 |===========================
 
 [[comment-info]]
@@ -5939,13 +6077,22 @@
 === CommentRange
 The `CommentRange` entity describes the range of an inline comment.
 
+The comment range is a range from the start position, specified by `start_line`
+and `start_character`, to the end position, specified by `end_line` and
+`end_character`. The start position is *inclusive* and the end position is
+*exclusive*.
+
+So, a range over part of a line will have `start_line` equal to
+`end_line`; however a range with `end_line` set to 5 and `end_character` equal
+to 0 will not include any characters on line 5,
+
 [options="header",cols="1,^1,5"]
 |===========================
-|Field Name    ||Description
-|`start_line`        ||The start line number of the range. (1-based, inclusive)
-|`start_character`   ||The character position in the start line. (0-based, inclusive)
-|`end_line`          ||The end line number of the range. (1-based, exclusive)
-|`end_character`     ||The character position in the end line. (0-based, exclusive)
+|Field Name          ||Description
+|`start_line`        ||The start line number of the range. (1-based)
+|`start_character`   ||The character position in the start line. (0-based)
+|`end_line`          ||The end line number of the range. (1-based)
+|`end_character`     ||The character position in the end line. (0-based)
 |===========================
 
 [[commit-info]]
@@ -5994,6 +6141,20 @@
 of recipient type to link:#notify-info[NotifyInfo] entity.
 |=============================
 
+[[delete-change-message-input]]
+=== DeleteChangeMessageInput
+The `DeleteChangeMessageInput` entity contains the options for deleting a change message.
+
+[options="header",cols="1,^1,5"]
+|=============================
+|Field Name               ||Description
+|`reason`                 |optional|
+The reason why the change message should be deleted. +
+If set, the change message will be replaced with
+"Change message removed by: `name`\nReason: `reason`",
+or just "Change message removed by: `name`." if not set.
+|=============================
+
 [[delete-comment-input]]
 === DeleteCommentInput
 The `DeleteCommentInput` entity contains the option for deleting a comment.
@@ -6227,10 +6388,14 @@
 Only set if the file was renamed or copied.
 |`lines_inserted`|optional|
 Number of inserted lines. +
-Not set for binary files or if no lines were inserted.
+Not set for binary files or if no lines were inserted. +
+An empty last line is not included in the count and hence this number can
+differ by one from details provided in <<#diff-info,DiffInfo>>.
 |`lines_deleted` |optional|
 Number of deleted lines. +
-Not set for binary files or if no lines were deleted.
+Not set for binary files or if no lines were deleted. +
+An empty last line is not included in the count and hence this number can
+differ by one from details provided in <<#diff-info,DiffInfo>>.
 |`size_delta`    ||
 Number of bytes by which the file size increased/decreased.
 |`size`          ||
@@ -6459,7 +6624,10 @@
 set's subject
 |`inheritParent`      |optional, default to `false`|
 Use the current patch set's first parent as the merge tip when set to `true`.
-Otherwise, use the current branch tip of the destination branch.
+|`base_change`        |optional|
+A link:#change-id[\{change-id\}] that identifies a change. When `inheritParent`
+is `false`, the merge tip will be the current patch set of the `base_change` if
+it's set. Otherwise, the current branch tip of the destination branch will be used.
 |`merge`              ||
 The detail of the source commit for merge as a link:#merge-input[MergeInput]
 entity.
@@ -6629,6 +6797,32 @@
 oldest. Empty if there are no related changes.
 |===========================
 
+
+[[requirement]]
+=== Requirement
+The `Requirement` entity contains information about a requirement relative to a change.
+
+type:: Alphanumerical (plus hyphens or underscores) string to identify what the requirement is and
+why it was triggered. Can be seen as a class: requirements sharing the same type were created for a
+similar reason, and the data structure will follow one set of rules.
+
+data:: (Optional) Additional key-value data linked to this requirement. This is used in templates to
+render rich status messages.
+
+[options="header",cols="1,^1,5"]
+|===========================
+|Field Name      | |Description
+|`status`        | | Status of the requirement. Can be either `OK`, `NOT_READY` or `RULE_ERROR`.
+|`fallbackText`  | | A human readable reason
+|`type`          | |
+Alphanumerical (plus hyphens or underscores) string to identify what the requirement is and why it
+was triggered. Can be seen as a class: requirements sharing the same type were created for a similar
+reason, and the data structure will follow one set of rules.
+|`data`          |optional|
+Holds custom key-value strings, used in templates to render richer status messages
+|===========================
+
+
 [[restore-input]]
 === RestoreInput
 The `RestoreInput` entity contains information for restoring a change.
@@ -6646,12 +6840,20 @@
 The `RevertInput` entity contains information for reverting a change.
 
 [options="header",cols="1,^1,5"]
-|===========================
-|Field Name    ||Description
-|`message`     |optional|
+|=============================
+|Field Name      ||Description
+|`message`       |optional|
 Message to be added as review comment to the change when reverting the
 change.
-|===========================
+|`notify`        |optional|
+Notify handling that defines to whom email notifications should be sent
+for reverting the change. +
+Allowed values are `NONE`, `OWNER`, `OWNER_REVIEWERS` and `ALL`. +
+If not set, the default is `ALL`.
+|`notify_details`|optional|
+Additional information about whom to notify about the revert as a map
+of recipient type to link:#notify-info[NotifyInfo] entity.
+|=============================
 
 [[review-info]]
 === ReviewInfo
@@ -6713,12 +6915,11 @@
 Draft handling that defines how draft comments are handled that are
 already in the database but that were not also described in this
 input. +
-Allowed values are `DELETE`, `PUBLISH`, `PUBLISH_ALL_REVISIONS` and
-`KEEP`. All values except `PUBLISH_ALL_REVISIONS` operate only on drafts
-for a single revision. +
+Allowed values are `PUBLISH`, `PUBLISH_ALL_REVISIONS` and `KEEP`. All values
+except `PUBLISH_ALL_REVISIONS` operate only on drafts for a single revision. +
 Only `KEEP` is allowed when used in conjunction with `on_behalf_of`. +
-If not set, the default is `DELETE`, unless `on_behalf_of` is set, in
-which case the default is `KEEP` and any other value is disallowed.
+If not set, the default is `KEEP`. If `on_behalf_of` is set, then no other value
+besides `KEEP` is allowed.
 |`notify`                 |optional|
 Notify handling that defines to whom email notifications should be sent
 after the review is stored. +
@@ -6831,7 +7032,7 @@
 |Field Name    ||Description
 |`kind`        ||The change kind. Valid values are `REWORK`, `TRIVIAL_REBASE`,
 `MERGE_FIRST_PARENT_UPDATE`, `NO_CODE_CHANGE`, and `NO_CHANGE`.
-|`_number`     ||The patch set number.
+|`_number`     ||The patch set number, or `edit` if the patch set is an edit.
 |`created`     ||
 The link:rest-api.html#timestamp[timestamp] of when the patch set was
 created.
diff --git a/Documentation/rest-api-config.txt b/Documentation/rest-api-config.txt
index 148bb2d..3ec989e 100644
--- a/Documentation/rest-api-config.txt
+++ b/Documentation/rest-api-config.txt
@@ -136,7 +136,7 @@
       "from": 0
     },
     "user": {
-      "anonymous_coward_name": "Anonymous Coward"
+      "anonymous_coward_name": "Name of user not set"
     }
   }
 ----
@@ -194,6 +194,51 @@
 ----
 
 
+[[reload-config]]
+=== Reload Config
+--
+'POST /config/server/reload'
+--
+
+Reloads the gerrit.config configuration.
+
+Not all configuration value can be picked up by this command. Which config
+sections and values that are supported is documented here:
+link:config-gerrit.html[Configuration]
+
+_The output shows only modified config values that are picked up by Gerrit
+and applied._
+
+If a config entry is added or removed from gerrit.config, but still brings
+no effect due to a matching default value, no output for this entry is shown.
+
+.Request
+----
+  POST /config/server/reload HTTP/1.0
+----
+
+As result a link:#config-update-info[ConfigUpdateInfo] entity is returned that
+contains information about how the updated config entries were handled.
+
+.Response
+----
+  HTTP/1.1 200 OK
+  Content-Type: application/json; charset=UTF-8
+
+  )]}'
+  {
+    "rejected": [],
+    "applied": [
+      {
+        "config_key": "addreviewer.maxAllowed",
+        "old_value": "20",
+        "new_value": "15"
+      }
+    ]
+  }
+----
+
+
 [[confirm-email]]
 === Confirm Email
 --
@@ -363,16 +408,6 @@
       "entries": {},
       "hit_ratio": {}
     },
-    groups_subgroups": {
-      "type": "MEM",
-      "entries": {
-        "mem": 4
-      },
-      "average_get": "697.8us",
-      "hit_ratio": {
-        "mem": 82
-      }
-    },
     "permission_sort": {
       "type": "MEM",
       "entries": {
@@ -411,6 +446,16 @@
         "mem": 99
       }
     },
+    "prolog_rules": {
+      "type": "MEM",
+      "entries": {
+        "mem": 35
+      },
+      "average_get": "103.0ms",
+      "hit_ratio": {
+        "mem": 99
+      }
+    },
     "quota-repo_size": {
       "type": "DISK",
       "entries": {
@@ -477,11 +522,11 @@
     "groups_bysubgroup",
     "groups_byuuid",
     "groups_external",
-    "groups_subgroups",
     "permission_sort",
     "plugin_resources",
     "project_list",
     "projects",
+    "prolog_rules",
     "quota-repo_size",
     "sshkeys",
     "web_sessions"
@@ -1234,6 +1279,103 @@
   }
 ----
 
+[[get-edit-preferences]]
+=== Get Default Edit Preferences
+
+--
+'GET /config/server/preferences.edit'
+--
+
+Returns the default edit preferences for the server.
+
+.Request
+----
+  GET /a/config/server/preferences.edit HTTP/1.0
+----
+
+As response a link:rest-api-accounts.html#edit-preferences-info[
+EditPreferencesInfo] is returned.
+
+.Response
+----
+  HTTP/1.1 200 OK
+  Content-Type: application/json; charset=UTF-8
+
+  )]}'
+  {
+    "tab_size": 8,
+    "line_length": 100,
+    "indent_unit": 2,
+    "cursor_blink_rate": 0,
+    "show_tabs": true,
+    "syntax_highlighting": true,
+    "match_brackets": true,
+    "auto_close_brackets": true,
+    "theme": "DEFAULT",
+    "key_map_type": "DEFAULT"
+  }
+----
+
+[[set-edit-preferences]]
+=== Set Default Edit Preferences
+
+--
+'PUT /config/server/preferences.edit'
+--
+
+Sets the default edit preferences for the server.
+
+The new edit preferences must be provided in the request body as a
+link:rest-api-accounts.html#edit-preferences-input[
+EditPreferencesInput] entity.
+
+To be allowed to set default edit preferences, a user must be a member
+of a group that is granted the
+link:access-control.html#capability_administrateServer[
+Administrate Server] capability.
+
+.Request
+----
+  PUT /a/config/server/preferences.edit HTTP/1.0
+  Content-Type: application/json; charset=UTF-8
+
+  {
+    "tab_size": 8,
+    "line_length": 80,
+    "indent_unit": 2,
+    "cursor_blink_rate": 0,
+    "show_tabs": true,
+    "syntax_highlighting": true,
+    "match_brackets": true,
+    "auto_close_brackets": true,
+    "theme": "DEFAULT",
+    "key_map_type": "DEFAULT"
+  }
+----
+
+As response a link:rest-api-accounts.html#edit-preferences-info[
+EditPreferencesInfo] is returned.
+
+.Response
+----
+  HTTP/1.1 200 OK
+  Content-Type: application/json; charset=UTF-8
+
+  )]}'
+  {
+    "tab_size": 8,
+    "line_length": 80,
+    "indent_unit": 2,
+    "cursor_blink_rate": 0,
+    "show_tabs": true,
+    "syntax_highlighting": true,
+    "match_brackets": true,
+    "auto_close_brackets": true,
+    "theme": "DEFAULT",
+    "key_map_type": "DEFAULT"
+  }
+----
+
 
 [[ids]]
 == IDs
@@ -1416,14 +1558,52 @@
 [[check-account-external-ids-input]]
 === CheckAccountExternalIdsInput
 The `CheckAccountExternalIdsInput` entity contains input for the
-account external IDs consistency check.
+account external ID consistency check.
 
 Currently this entity contains no fields.
 
 [[check-account-external-ids-result-info]]
 === CheckAccountExternalIdsResultInfo
 The `CheckAccountExternalIdsResultInfo` entity contains the result of
-running the account external IDs consistency check.
+running the account external ID consistency check.
+
+[options="header",cols="1,6"]
+|======================
+|Field Name|Description
+|`problems`|A list of link:#consistency-problem-info[
+ConsistencyProblemInfo] entities.
+|======================
+
+[[check-accounts-input]]
+=== CheckAccountsInput
+The `CheckAccountsInput` entity contains input for the account consistency
+check.
+
+Currently this entity contains no fields.
+
+[[check-accounts-result-info]]
+=== CheckAccountsResultInfo
+The `CheckAccountsResultInfo` entity contains the result of running the
+account consistency check.
+
+[options="header",cols="1,6"]
+|======================
+|Field Name|Description
+|`problems`|A list of link:#consistency-problem-info[
+ConsistencyProblemInfo] entities.
+|======================
+
+[[check-groups-input]]
+=== CheckGroupsInput
+The `CheckGroupsInput` entity contains input for the group consistency
+check.
+
+Currently this entity contains no fields.
+
+[[check-groups-result-info]]
+=== CheckGroupsResultInfo
+The `CheckGroupsResultInfo` entity contains the result of running the
+group consistency check.
 
 [options="header",cols="1,6"]
 |======================
@@ -1447,6 +1627,9 @@
 The result of running the account external ID consistency check as a
 link:#check-account-external-ids-result-info[
 CheckAccountExternalIdsResultInfo] entity.
+|`check_groups_result`              |optional|
+The result of running the group consistency check as a
+link:#check-groups-result-info[CheckGroupsResultInfo] entity.
 |================================================
 
 [[consistency-check-input]]
@@ -1464,6 +1647,9 @@
 Input for the account external ID consistency check as
 link:#check-account-external-ids-input[CheckAccountExternalIdsInput]
 entity.
+|`check_groups`              |optional|
+Input for the group consistency check as link:#check-groups-input[
+CheckGroupsInput] entity.
 |=========================================
 
 [[consistency-problem-info]]
@@ -1479,6 +1665,39 @@
 |`message` |Message describing the consistency problem.
 |======================
 
+[[config-update-info]]
+=== ConfigUpdateInfo
+The entity describes the result of a reload of gerrit.config.
+
+If a changed config value is missing from the `applied` and the `rejected`
+lists there are no guarantees to whether they have or have not taken effect.
+
+[options="header",cols="1,6"]
+|======================
+|Field Name|Description
+|`applied` |A list of link:#config-update-entry-info[ConfigUpdateEntryInfos]
+describing the applied configuration changes. +
+Every config value change representation present in this list is guaranteed to
+have taken effect.
+|`rejected` |A list of link:#config-update-entry-info[ConfigUpdateEntryInfos]
+describing the rejected configuration changes.  +
+Every config value change representation present in this list is guaranteed not
+to have taken effect.
+|======================
+
+[[config-update-entry-info]]
+=== ConfigUpdateEntryInfo
+The entity describes an updated config value.
+
+[options="header",cols="1,6"]
+|======================
+|Field Name|Description
+|`config_key` |The config key that contains the value.
+|`old_value`  |The old config value. +
+Missing if value was not previously configured.
+|`new_value`  |The new config value, picked up after reload.
+|======================
+
 [[download-info]]
 === DownloadInfo
 The `DownloadInfo` entity contains information about supported download
diff --git a/Documentation/rest-api-groups.txt b/Documentation/rest-api-groups.txt
index d5d7256..00fd81f 100644
--- a/Documentation/rest-api-groups.txt
+++ b/Documentation/rest-api-groups.txt
@@ -124,6 +124,40 @@
 * `MEMBERS`: include list of direct group members.
 --
 
+==== Find groups that are owned by another group
+
+By setting `ownedBy` and specifying the link:#group-id[\{group-id\}] of another
+group, it is possible to find all the groups for which the owning group is the
+given group.
+
+.Request
+----
+  GET /groups/?ownedBy=7ca042f4d5847936fcb90ca91057673157fd06fc HTTP/1.0
+----
+
+.Response
+----
+  HTTP/1.1 200 OK
+  Content-Disposition: attachment
+  Content-Type: application/json; charset=UTF-8
+
+  )]}'
+  {
+    "MyProject-Committers": {
+      "id": "9999c971bb4ab872aab759d8c49833ee6b9ff320",
+      "url": "#/admin/groups/uuid-9999c971bb4ab872aab759d8c49833ee6b9ff320",
+      "options": {
+        "visible_to_all": true
+      },
+      "description":"contains all committers for MyProject",
+      "group_id": 551,
+      "owner": "MyProject-Owners",
+      "owner_id": "7ca042f4d5847936fcb90ca91057673157fd06fc",
+      "created_on": "2013-02-01 09:59:32.126000000"
+    }
+  }
+----
+
 ==== Check if a group is owned by the calling user
 By setting the option `owned` and specifying a group to inspect with
 the option `group`/`g`, it is possible to find out if this group is
@@ -563,6 +597,9 @@
 
 The new group name must be provided in the request body.
 
+This endpoint is only allowed for Gerrit internal groups; attempting to call on a
+non-internal group will return 405 Method Not Allowed.
+
 .Request
 ----
   PUT /groups/MyProject-Committers/name HTTP/1.0
@@ -596,6 +633,9 @@
 
 Retrieves the description of a group.
 
+This endpoint is only allowed for Gerrit internal groups; attempting to call on a
+non-internal group will return 405 Method Not Allowed.
+
 .Request
 ----
   GET /groups/9999c971bb4ab872aab759d8c49833ee6b9ff320/description HTTP/1.0
@@ -623,6 +663,9 @@
 
 The new group description must be provided in the request body.
 
+This endpoint is only allowed for Gerrit internal groups; attempting to call on a
+non-internal group will return 405 Method Not Allowed.
+
 .Request
 ----
   PUT /groups/9999c971bb4ab872aab759d8c49833ee6b9ff320/description HTTP/1.0
@@ -704,6 +747,9 @@
 The new group options must be provided in the request body as a
 link:#group-options-input[GroupOptionsInput] entity.
 
+This endpoint is only allowed for Gerrit internal groups; attempting to call on a
+non-internal group will return 405 Method Not Allowed.
+
 .Request
 ----
   PUT /groups/9999c971bb4ab872aab759d8c49833ee6b9ff320/options HTTP/1.0
@@ -737,6 +783,9 @@
 
 Retrieves the owner group of a Gerrit internal group.
 
+This endpoint is only allowed for Gerrit internal groups; attempting to call on a
+non-internal group will return 405 Method Not Allowed.
+
 .Request
 ----
   GET /groups/9999c971bb4ab872aab759d8c49833ee6b9ff320/owner HTTP/1.0
@@ -779,6 +828,9 @@
 The new owner can be specified by name, by group UUID or by the legacy
 numeric group ID.
 
+This endpoint is only allowed for Gerrit internal groups; attempting to call on a
+non-internal group will return 405 Method Not Allowed.
+
 .Request
 ----
   PUT /groups/9999c971bb4ab872aab759d8c49833ee6b9ff320/owner HTTP/1.0
@@ -821,6 +873,9 @@
 
 Gets the audit log of a Gerrit internal group.
 
+This endpoint is only allowed for Gerrit internal groups; attempting to call on a
+non-internal group will return 405 Method Not Allowed.
+
 .Request
 ----
   GET /groups/9999c971bb4ab872aab759d8c49833ee6b9ff320/log.audit HTTP/1.0
@@ -931,6 +986,9 @@
 AccountInfo] entries is returned. The entries in the list are sorted by
 full name, preferred email and id.
 
+This endpoint is only allowed for Gerrit internal groups; attempting to call on a
+non-internal group will return 405 Method Not Allowed.
+
 .Request
 ----
   GET /groups/834ec36dd5e0ed21a2ff5d7e2255da082d63bbd7/members/ HTTP/1.0
@@ -1043,6 +1101,9 @@
 
 Adds a user as member to a Gerrit internal group.
 
+This endpoint is only allowed for Gerrit internal groups; attempting to call on a
+non-internal group will return 405 Method Not Allowed.
+
 .Request
 ----
   PUT /groups/MyProject-Committers/members/John%20Doe HTTP/1.0
@@ -1137,6 +1198,9 @@
 
 Removes a user from a Gerrit internal group.
 
+This endpoint is only allowed for Gerrit internal groups; attempting to call on a
+non-internal group will return 405 Method Not Allowed.
+
 .Request
 ----
   DELETE /groups/MyProject-Committers/members/John%20Doe HTTP/1.0
@@ -1190,6 +1254,9 @@
 As result a list of link:#group-info[GroupInfo] entries is returned.
 The entries in the list are sorted by group name and UUID.
 
+This endpoint is only allowed for Gerrit internal groups; attempting to call on a
+non-internal group will return 405 Method Not Allowed.
+
 .Request
 ----
   GET /groups/834ec36dd5e0ed21a2ff5d7e2255da082d63bbd7/groups/ HTTP/1.0
@@ -1262,6 +1329,9 @@
 Adds an internal or external group as subgroup to a Gerrit internal group.
 External groups must be specified using the UUID.
 
+This endpoint is only allowed for Gerrit internal groups; attempting to call on a
+non-internal group will return 405 Method Not Allowed.
+
 .Request
 ----
   PUT /groups/MyProject-Committers/groups/MyGroup HTTP/1.0
@@ -1371,6 +1441,9 @@
 
 Removes a subgroup from a Gerrit internal group.
 
+This endpoint is only allowed for Gerrit internal groups; attempting to call on a
+non-internal group will return 405 Method Not Allowed.
+
 .Request
 ----
   DELETE /groups/MyProject-Committers/groups/MyGroup HTTP/1.0
@@ -1445,7 +1518,9 @@
 `REMOVE_USER` the member is returned as detailed
 link:rest-api-accounts.html#account-info[AccountInfo] entity, if `type`
 is `ADD_GROUP` or `REMOVE_GROUP` the member is returned as
-link:#group-info[GroupInfo] entity.
+link:#group-info[GroupInfo] entity. Note that the `name` in
+link:#group-info[GroupInfo] will not be set if the member group is not
+available.
 |`type`    |
 The event type, can be: `ADD_USER`, `REMOVE_USER`, `ADD_GROUP` or
 `REMOVE_GROUP`.
diff --git a/Documentation/rest-api-projects.txt b/Documentation/rest-api-projects.txt
index 27d933f..fbcca51 100644
--- a/Documentation/rest-api-projects.txt
+++ b/Documentation/rest-api-projects.txt
@@ -325,7 +325,8 @@
 ----
 
 All::
-Get all projects, including those whose state is "HIDDEN".
+Get all projects, including those whose state is "HIDDEN". May not be used
+together with the `state` option.
 +
 .Request
 ----
@@ -351,6 +352,89 @@
   }
 ----
 
+State(s)::
+Get all projects with the given state. May not be used together with the
+`all` option.
++
+.Request
+----
+GET /projects/?state=HIDDEN HTTP/1.0
+----
++
+.Response
+----
+  HTTP/1.1 200 OK
+  Content-Disposition: attachment
+  Content-Type: application/json; charset=UTF-8
+
+  )]}'
+  {
+    "some-other-project": {
+      "id": "some-other-project",
+      "state": "HIDDEN"
+    }
+  }
+----
+
+[[query-projects]]
+=== Query Projects
+--
+'GET /projects/?query=<query>'
+--
+
+Queries projects visible to the caller. The
+link:user-search-projects.html#_search_operators[query string] must be
+provided by the `query` parameter. The `start` and `limit` parameters
+can be used to skip/limit results.
+
+As result a list of link:#project-info[ProjectInfo] entities is returned.
+
+.Request
+----
+  GET /projects/?query=name:test HTTP/1.0
+----
+
+.Response
+----
+  HTTP/1.1 200 OK
+  Content-Disposition: attachment
+  Content-Type: application/json; charset=UTF-8
+
+  )]}'
+  {
+    "test": {
+      "id": "test",
+      "description": "\u003chtml\u003e is escaped"
+    }
+  }
+----
+
+[[project-query-limit]]
+==== Project Limit
+The `/projects/?query=<query>` URL also accepts a limit integer in the
+`limit` parameter. This limits the results to `limit` projects.
+
+Query the first 25 projects in project list.
+----
+  GET /projects/?query=<query>&limit=25 HTTP/1.0
+----
+
+The `/projects/` URL also accepts a start integer in the `start`
+parameter. The results will skip `start` groups from project list.
+
+Query 25 projects starting from index 50.
+----
+  GET /groups/?query=<query>&limit=25&start=50 HTTP/1.0
+----
+
+[[project-query-options]]
+==== Project Options
+Additional fields can be obtained by adding `o` parameters. Each option
+requires more lookups and slows down the query response time to the
+client so they are generally disabled by default. The supported fields
+are described in the context of the link:#project-options[List Projects]
+REST endpoint.
+
 [[get-project]]
 === Get Project
 --
@@ -410,7 +494,7 @@
 
   {
     "description": "This is a demo project.",
-    "submit_type": "CHERRY_PICK",
+    "submit_type": "INHERIT",
     "owners": [
       "MyProject-Owners"
     ]
@@ -513,14 +597,6 @@
 
 Deletes the description of a project.
 
-The request body does not need to include a
-link:#project-description-input[ProjectDescriptionInput] entity if no
-commit message is specified.
-
-Please note that some proxies prohibit request bodies for DELETE
-requests. In this case, if you want to specify a commit message, use
-link:#set-project-description[PUT] to delete the description.
-
 .Request
 ----
   DELETE /projects/plugins%2Freplication/description HTTP/1.0
@@ -531,6 +607,27 @@
   HTTP/1.1 204 No Content
 ----
 
+A commit message can be provided in the request body as a
+link:#project-description-input[ProjectDescriptionInput] entity.
+Historically, this method allowed a body in the DELETE, but that behavior is
+link:https://www.gerritcodereview.com/releases/2.16.md[deprecated].
+In this case, use link:#set-project-description[PUT] instead.
+
+.Request
+----
+  PUT /projects/plugins%2Freplication/description HTTP/1.0
+  Content-Type: application/json; charset=UTF-8
+
+  {
+    "commit_message": "Update the project description"
+  }
+----
+
+.Response
+----
+  HTTP/1.1 204 No Content
+----
+
 [[get-project-parent]]
 === Get Project Parent
 --
@@ -737,7 +834,12 @@
       "configured_value": "15m",
       "inherited_value": "20m"
     },
-    "submit_type": "MERGE_IF_NECESSARY",
+    "submit_type": "INHERIT",
+    "default_submit_type": {
+      "value": "MERGE_IF_NECESSARY",
+      "configured_value": "INHERIT",
+      "inherited_value": "MERGE_IF_NECESSARY"
+    },
     "state": "ACTIVE",
     "commentlinks": {},
     "plugin_config": {
@@ -849,6 +951,11 @@
       "inherited_value": "20m"
     },
     "submit_type": "REBASE_IF_NECESSARY",
+    "default_submit_type": {
+      "value": "REBASE_IF_NECESSARY",
+      "configured_value": "INHERIT",
+      "inherited_value": "REBASE_IF_NECESSARY"
+    },
     "state": "ACTIVE",
     "commentlinks": {}
   }
@@ -1213,31 +1320,16 @@
 [[check-access]]
 === Check Access
 --
-'POST /projects/MyProject/check.access'
+'GET /projects/MyProject/check.access?account=1000098&ref=refs%2Fheads%2Fsecret%2Fbla'
 --
 
-Runs access checks for other users. This requires the
-link:access-control.html#capability_administrateServer[Administrate Server]
-global capability.
-
-Input for the access checks that should be run must be provided in
-the request body inside a
-link:#access-check-input[AccessCheckInput] entity.
-
-.Request
-----
-  POST /projects/MyProject/check.access HTTP/1.0
-  Content-Type: application/json; charset=UTF-8
-
-  {
-    "account": "Kristen.Burns@gerritcodereview.com",
-    "ref": "refs/heads/secret/bla"
-  }
-----
+This command runs access checks for other users. This requires the
+link:access-control.html#capability_viewAccess[View Access] global
+capability.
 
 The result is a link:#access-check-info[AccessCheckInfo] entity
-detailing the read access of the given user for the given project (or
-project-ref combination).
+detailing the access of the given user for the given project,
+project-ref, or project-permission-ref combination.
 
 .Response
 ----
@@ -1251,7 +1343,65 @@
   }
 ----
 
+[[check-access-options]]
+==== Check Access Options
+
+Account(account)::
+The account for which to check access. Mandatory.
+
+Permission(perm)::
+The ref permission for which to check access. If not specified, read
+access to at least branch is checked.
+
+Ref(ref)::
+The branch for which to check access. This must be given if `perm` is specified.
+
+[[check-access-post]]
+=== Check Access (POST)
+
+This endpoint can also be accessed as a POST request (deprecated). In
+this case, the input for the access checks must be provided in the
+request body inside a link:#access-check-input[AccessCheckInput]
+entity.
+
+.Request
+----
+  POST /projects/MyProject/check.access HTTP/1.0
+  Content-Type: application/json; charset=UTF-8
+
+  {
+    "account": "Kristen.Burns@gerritcodereview.com",
+    "ref": "refs/heads/secret/bla"
+  }
+----
+
 [[index]]
+=== Index project
+
+Adds or updates the current project (and children, if specified) in the secondary index.
+The indexing task is executed asynchronously in background and this command returns
+immediately if `async` is specified in the input.
+
+As an input, a link:#index-project-input[IndexProjectInput] entity can be provided.
+
+.Request
+----
+  POST /projects/MyProject/index HTTP/1.0
+  Content-Type: application/json; charset=UTF-8
+
+  {
+    "index_children": "true"
+    "async": "true"
+  }
+----
+
+.Response
+----
+  HTTP/1.1 202 Accepted
+  Content-Disposition: attachment
+----
+
+[[index.changes]]
 === Index all changes in a project
 
 Adds or updates all the changes belonging to a project in the secondary index.
@@ -1260,13 +1410,102 @@
 
 .Request
 ----
-  POST /projects/MyProject/index HTTP/1.0
+  POST /projects/MyProject/index.changes HTTP/1.0
 ----
 
 .Response
 ----
-HTTP/1.1 202 Accepted
-Content-Disposition: attachment
+  HTTP/1.1 202 Accepted
+  Content-Disposition: attachment
+----
+
+[[check]]
+=== Check project consistency
+
+Performs consistency checks on the project.
+
+Which consistency checks should be performed is controlled by the
+link:#check-project-input[CheckProjectInput] entity in the request
+body.
+
+The following consistency checks are supported:
+
+[[auto-closeable-changes-check]]
+--
+* AutoCloseableChangesCheck: Searches for open changes that can be
+  auto-closed because a patch set of the change is already contained in
+  the destination branch or because the destination branch contains a
+  commit with the same Change-Id. Normally Gerrit auto-closes such
+  changes when the corresponding commits are pushed directly to the
+  repository. However if a branch is updated behind Gerrit's back or if
+  auto-closing changes fails (and the push is still successful) change
+  states can get inconsistent (changes that are already part of the
+  destination branch are still open). This consistency check is
+  intended to detect and repair this situation.
+--
+
+To fix any problems that can be fixed automatically set the `fix` field
+in the inputs for the consistency checks  to `true`.
+
+This REST endpoint requires the
+link:access-control.html#capability_administrateServer[Administrate Server]
+global capability.
+
+.Request
+----
+  POST /projects/MyProject/check HTTP/1.0
+  Content-Type: application/json; charset=UTF-8
+
+  {
+    "auto_closeable_changes_check": {
+      "fix": true,
+      "branch": "refs/heads/master",
+      "max_commits": 100
+    }
+  }
+----
+
+As response a link:#check-project-result-info[CheckProjectResultInfo]
+entity is returned that results for the consistency checks.
+
+.Response
+----
+  HTTP/1.1 200 OK
+  Content-Disposition: attachment
+  Content-Type: application/json; charset=UTF-8
+
+  )]}'
+  {
+    "auto_closeable_changes_check_result": {
+      "auto_closeable_changes": {
+        "refs/heads/master": [
+          {
+            "id": "myProject~master~I8473b95934b5732ac55d26311a706c9c2bde9940",
+            "project": "myProject",
+            "branch": "master",
+            "change_id": "I8473b95934b5732ac55d26311a706c9c2bde9940",
+            "subject": "Implementing Feature X",
+            "status": "NEW",
+            "created": "2013-02-01 09:59:32.126000000",
+            "updated": "2013-02-21 11:16:36.775000000",
+            "insertions": 34,
+            "deletions": 101,
+            "_number": 3965,
+            "owner": {
+              "name": "John Doe"
+            },
+            "problems": [
+              {
+                "message": "Patch set 1 (2f15e416237ed9b561199f24184f5f5d2708c584) is merged into destination ref refs/heads/master (2f15e416237ed9b561199f24184f5f5d2708c584), but change status is NEW",
+                "status": "FIXED",
+                "outcome": "Marked change as merged"
+              }
+            ]
+          }
+        ]
+      }
+    }
+  }
 ----
 
 [[branch-endpoints]]
@@ -2337,6 +2576,8 @@
 
 Cherry-picks a commit of a project to a destination branch.
 
+To cherry pick a change revision, see link:rest-api-changes.html#cherry-pick[CherryPick].
+
 The destination branch must be provided in the request body inside a
 link:rest-api-changes.html#cherrypick-input[CherryPickInput] entity.
 If the commit message is not set, the commit message of the source
@@ -2353,8 +2594,9 @@
   }
 ----
 
-As response a link:rest-api-changes.html#change-info[ChangeInfo] entity is returned that
-describes the resulting cherry-picked change.
+As response a link:rest-api-changes.html#cherry-pick-change-info[
+CherryPickChangeInfo] entity is returned that describes the resulting
+cherry-picked change.
 
 .Response
 ----
@@ -2382,6 +2624,51 @@
   }
 ----
 
+[[list-files]]
+=== List Files
+--
+'GET /projects/link:#project-name[\{project-name\}]/commits/link:#commit-id[\{commit-id\}]/files/'
+--
+
+Lists the files that were modified, added or deleted in a commit.
+
+.Request
+----
+  GET /projects/work%2Fmy-project/commits/a8a477efffbbf3b44169bb9a1d3a334cbbd9aa96/files/ HTTP/1.0
+----
+
+As result a map is returned that maps the link:rest-api-changes.html#file-id[file path] to a
+link:rest-api-changes.html#file-info[FileInfo] entry. The entries in the map are
+sorted by file path.
+
+.Response
+----
+  HTTP/1.1 200 OK
+  Content-Disposition: attachment
+  Content-Type: application/json; charset=UTF-8
+
+  )]}'
+  {
+    "/COMMIT_MSG": {
+      "status": "A",
+      "lines_inserted": 7,
+      "size_delta": 551,
+      "size": 551
+    },
+    "gerrit-server/src/main/java/com/google/gerrit/server/project/RefControl.java": {
+      "lines_inserted": 5,
+      "lines_deleted": 3,
+      "size_delta": 98,
+      "size": 23348
+    }
+  }
+----
+
+The integer-valued request parameter `parent` changes the response to return a
+list of the files which are different in this commit compared to the given
+parent commit. This is useful for supporting review of merge commits. The value
+is the 1-based index of the parent's position in the commit object.
+
 [[dashboard-endpoints]]
 == Dashboard Endpoints
 
@@ -2643,7 +2930,7 @@
 |=========================================
 |Field Name                  ||Description
 |`status`                    ||The HTTP status code for the access.
-200 means success, 403 means denied and 404 means the project does not exist.
+200 means success and 403 means denied.
 |`message`                   |optional|A clarifying message if `status` is not 200.
 |=========================================
 
@@ -2656,9 +2943,58 @@
 |=========================================
 |Field Name                  ||Description
 |`account`                   ||The account for which to check access
-|`ref`                       |optional|The refname for which to check access
+|`ref`                       |optional|The refname for which to check
+access
+|`permission`                |optional|The ref permission for which to
+check. This defaults to `read`. If given, it `ref` must be given too.
 |=========================================
 
+[[auto_closeable_changes_check_input]]
+=== AutoCloseableChangesCheckInput
+The `AutoCloseableChangesCheckInput` entity contains options for running
+the link:#auto-closeable-changes-check[AutoCloseableChangesCheck].
+
+[options="header",cols="1,^2,4"]
+|=============================
+|Field Name      ||Description
+|`fix`           |optional|
+Whether auto-closeable changes should be closed automatically.
+|`branch`        ||
+The branch for which the link:#auto-closeable-changes-check[
+AutoCloseableChangesCheck] should be performed. The 'refs/heads/'
+prefix for the branch name can be omitted.
+|`skip_commits`  |optional|
+Number of commits that should be skipped when walking the commits of
+the branch.
+|`max_commits`   |optional|
+Maximum number of commits to walk. If not specified this defaults to
+10,000 commits. 10,000 is also the maximum that can be set.
+Auto-closing changes is an expensive operation and the more commits
+are walked the slower it gets. This is why you should avoid walking too
+many commits.
+|=============================
+
+[[auto_closeable_changes_check_result]]
+=== AutoCloseableChangesCheckResult
+The `AutoCloseableChangesCheckResult` entity contains the results of
+running the link:#auto-closeable-changes-check[AutoCloseableChangesCheck]
+on a project.
+
+[options="header",cols="1,6"]
+|====================================
+|Field Name              |Description
+|`auto_closeable_changes`|
+Changes that can be auto-closed as list of
+link:rest-api-changes.html#change-info[ChangeInfo] entities. For each
+returned link:rest-api-changes.html#change-info[ChangeInfo] entity the
+`problems` field is populated that includes details about the detected
+issues. If `fix` in the link:#auto_closeable_changes_check_input[
+AutoCloseableChangesCheckInput] was set to `true`, `status` and
+`outcome` in link:rest-api-changes.html#problem-info[ProblemInfo] are
+populated. If the status says `FIXED` Gerrit was able to auto-close the
+change now.
+|====================================
+
 [[ban-input]]
 === BanInput
 The `BanInput` entity contains information for banning commits in a
@@ -2716,6 +3052,55 @@
 If not set, `HEAD` will be used as base revision.
 |=======================
 
+[[check-project-input]]
+=== CheckProjectInput
+The `CheckProjectInput` entity contains information about which
+consistency checks should be run on a project.
+
+[options="header",cols="1,^2,4"]
+|===========================================
+|Field Name                    ||Description
+|`auto_closeable_changes_check`|optional|
+Parameters for the link:#auto-closeable-changes-check[
+AutoCloseableChangesCheck] as
+link:rest-api-changes.html#auto_closeable_changes_check_input[
+AutoCloseableChangesCheckInput] entity.
+|===========================================
+
+[[check-project-result-info]]
+=== CheckProjectResultInfo
+The `CheckProjectResultInfo` entity contains results for consistency
+checks that have been run on a project.
+
+[options="header",cols="1,^2,4"]
+|==================================================
+|Field Name                           ||Description
+|`auto_closeable_changes_check_result`|optional|
+Results for the link:#auto-closeable-changes-check[
+AutoCloseableChangesCheck] as
+link:rest-api-changes.html#auto_closeable_changes_check_result[
+AutoCloseableChangesCheckResult] entity.
+|==================================================
+
+[[commentlink-info]]
+=== CommentLinkInfo
+The `CommentLinkInfo` entity describes a
+link:config-gerrit.html#commentlink[commentlink].
+
+[options="header",cols="1,^2,4"]
+|==================================================
+|Field Name |        |Description
+|`match`    |        |A JavaScript regular expression to match
+positions to be replaced with a hyperlink, as documented in
+link#config-gerrit.html#commentlink.name.match[commentlink.name.match].
+|`link`     |        |The URL to direct the user to whenever the
+regular expression is matched, as documented in
+link#config-gerrit.html#commentlink.name.link[commentlink.name.link].
+|`enabled`  |optional|Whether the commentlink is enabled, as documented
+in link#config-gerrit.html#commentlink.name.enabled[
+commentlink.name.enabled]. If not set the commentlink is enabled.
+|==================================================
+
 [[config-info]]
 === ConfigInfo
 The `ConfigInfo` entity contains information about the effective project
@@ -2747,7 +3132,8 @@
 link:#inherited-boolean-info[InheritedBooleanInfo] that tells whether a
 valid link:user-changeid.html[Change-Id] footer in any commit uploaded
 for review is required. This does not apply to commits pushed directly
-to a branch or tag.
+to a branch or tag. This property is deprecated and will be removed in
+a future release.
 |`enable_signed_push`|optional, not set if signed push is disabled|
 link:#inherited-boolean-info[InheritedBooleanInfo] that tells whether
 signed push validation is enabled on the project.
@@ -2767,10 +3153,12 @@
 The link:config-gerrit.html#receive.maxObjectSizeLimit[max object size
 limit] of this project as a link:#max-object-size-limit-info[
 MaxObjectSizeLimitInfo] entity.
-|`submit_type`                ||
-The default submit type of the project, can be `MERGE_IF_NECESSARY`,
-`FAST_FORWARD_ONLY`, `REBASE_IF_NECESSARY`, `REBASE_ALWAYS`, `MERGE_ALWAYS` or
-`CHERRY_PICK`.
+|`default_submit_type`     ||
+link:#submit-type-info[SubmitTypeInfo] that describes the default submit type of
+the project, when not overridden at the change level.
+|`submit_type`               ||
+Deprecated; equivalent to link:#submit-type-info[`value`] in
+`default_submit_type`.
 |`match_author_to_committer_date` |optional|
 link:#inherited-boolean-info[InheritedBooleanInfo] that indicates whether
 a change's author date will be changed to match its submitter date upon submit.
@@ -2779,10 +3167,8 @@
 Not set if the project state is `ACTIVE`.
 |`commentlinks`              ||
 Map with the comment link configurations of the project. The name of
-the comment link configuration is mapped to the comment link
-configuration, which has the same format as the
-link:config-gerrit.html#_a_id_commentlink_a_section_commentlink[
-commentlink section] of `gerrit.config`.
+the comment link configuration is mapped to a link:#commentlink-info[
+CommentlinkInfo] entity.
 |`theme`                                   |optional|
 The theme that is configured for the project as a link:#theme-info[
 ThemeInfo] entity.
@@ -2793,6 +3179,9 @@
 |`actions`                                 |optional|
 Actions the caller might be able to perform on this project. The
 information is a map of view names to
+|`reject_empty_commit`                     |optional|
+link:#inherited-boolean-info[InheritedBooleanInfo] that tells whether
+empty commits should be rejected when a change is merged.
 link:rest-api-changes.html#action-info[ActionInfo] entities.
 |=======================================================
 
@@ -2834,6 +3223,8 @@
 directly to a branch or tag. +
 Can be `TRUE`, `FALSE` or `INHERIT`. +
 If not set, this setting is not updated.
+This property is deprecated and will be removed in
+a future release.
 |`reject_implicit_merges`                  |optional|
 Whether a check for implicit merges will be performed when changes
 are pushed for review. +
@@ -2857,6 +3248,10 @@
 |`plugin_config_values`                    |optional|
 Plugin configuration values as map which maps the plugin name to a map
 of parameter names to values.
+|`reject_empty_commit`                     |optional|
+Whether empty commits should be rejected when a change is merged.
+Can be `TRUE`, `FALSE` or `INHERIT`. +
+If not set, this setting is not updated.
 |======================================================
 
 [[config-parameter-info]]
@@ -3015,6 +3410,19 @@
 omitted.
 |============================
 
+[[index-project-input]]
+=== IndexProjectInput
+The `IndexProjectInput` contains parameters for indexing a project.
+
+[options="header",cols="1,^2,4"]
+|================================
+|Field Name         ||Description
+|`index_children`   ||
+If children should be indexed recursively.
+|`async`            ||
+If projects should be indexed asynchronously.
+|================================
+
 [[inherited-boolean-info]]
 === InheritedBooleanInfo
 A boolean value that can also be inherited.
@@ -3185,6 +3593,8 @@
 |`require_change_id`                           |`INHERIT` if not set|
 Whether the usage of Change-Ids is required for the project (`TRUE`,
 `FALSE`, `INHERIT`).
+This property is deprecated and will be removed in
+a future release.
 |`enable_signed_push`                           |`INHERIT` if not set|
 Whether signed push validation is enabled on the project  (`TRUE`,
 `FALSE`, `INHERIT`).
@@ -3197,6 +3607,9 @@
 |`plugin_config_values`      |optional|
 Plugin configuration values as map which maps the plugin name to a map
 of parameter names to values.
+|`reject_empty_commit`       |optional|
+Whether empty commits should be rejected when a change is merged
+(`TRUE`, `FALSE`, `INHERIT`).
 |=========================================
 
 [[project-parent-input]]
@@ -3245,6 +3658,27 @@
 |`size_of_packed_objects`  |Size of packed objects in bytes.
 |======================================
 
+[[submit-type-info]]
+=== SubmitTypeInfo
+Information about the link:project-configuration.html#submit_type[default submit
+type of a project], taking into account project inheritance.
+
+Valid values for each field are `MERGE_IF_NECESSARY`, `FAST_FORWARD_ONLY`,
+`REBASE_IF_NECESSARY`, `REBASE_ALWAYS`, `MERGE_ALWAYS` or `CHERRY_PICK`, plus
+`INHERIT` where applicable.
+
+[options="header",cols="1,6"]
+|===============================
+|Field Name         |Description
+|`value`            |
+The effective submit type value. Never `INHERIT`.
+|`configured_value` |
+The configured value, can be one of the submit types, or `INHERIT` to inherit
+from the parent project.
+|`inherited_value`  |
+The effective value that would be inherited from the parent. Never `INHERIT`.
+|===============================
+
 [[tag-info]]
 === TagInfo
 The `TagInfo` entity contains information about a tag.
@@ -3261,6 +3695,11 @@
 the signature.
 |`tagger`|Only set for annotated tags, if present in the tag.|The tagger as a
 link:rest-api-changes.html#git-person-info[GitPersonInfo] entity.
+|`created`|optional|The link:rest-api.html#timestamp[timestamp] of when the tag
+was created. For annotated and signed tags, this is the timestamp of the tag object
+and is the same as the `date` field in the `tagger`. For lightweight tags, it is
+the commit timestamp of the commit to which the tag points, when the object is a
+commit. It is not set when the object is any other type.
 |`can_delete`|not set if `false`|
 Whether the calling user can delete this tag.
 |`web_links` |optional|
diff --git a/Documentation/rest-api.txt b/Documentation/rest-api.txt
index 0957d32..8f6a47b 100644
--- a/Documentation/rest-api.txt
+++ b/Documentation/rest-api.txt
@@ -191,6 +191,53 @@
 "`422 Unprocessable Entity`" is returned if the ID of a resource that is
 specified in the request body cannot be resolved.
 
+[[tracing]]
+=== Request Tracing
+For each REST endpoint tracing can be enabled by setting the
+`trace=<trace-id>` request parameter. It is recommended to use the ID
+of the issue that is being investigated as trace ID.
+
+.Example Request
+----
+  GET /changes/myProject~master~I8473b95934b5732ac55d26311a706c9c2bde9940/suggest_reviewers?trace=issue/123&q=J
+----
+
+It is also possible to omit the trace ID and get a unique trace ID
+generated.
+
+.Example Request
+----
+  GET /changes/myProject~master~I8473b95934b5732ac55d26311a706c9c2bde9940/suggest_reviewers?trace&q=J
+----
+
+Alternatively request tracing can also be enabled by setting the
+`X-Gerrit-Trace` header:
+
+.Example Request
+----
+  GET /changes/myProject~master~I8473b95934b5732ac55d26311a706c9c2bde9940/suggest_reviewers?q=J
+  X-Gerrit-Trace: issue/123
+----
+
+Enabling tracing results in additional logs with debug information that
+are written to the `error_log`. All logs that correspond to the traced
+request are associated with the trace ID. The trace ID is returned with
+the REST response in the `X-Gerrit-Trace` header.
+
+.Example Response
+----
+HTTP/1.1 200 OK
+  Content-Disposition: attachment
+  Content-Type: application/json; charset=UTF-8
+  X-Gerrit-Trace: 1533885943749-8257c498
+
+  )]}'
+  ... <json> ...
+----
+
+Given the trace ID an administrator can find the corresponding logs and
+investigate issues more easily.
+
 GERRIT
 ------
 Part of link:index.html[Gerrit Code Review]
diff --git a/Documentation/user-inline-edit.txt b/Documentation/user-inline-edit.txt
index bce8183..f64c449 100644
--- a/Documentation/user-inline-edit.txt
+++ b/Documentation/user-inline-edit.txt
@@ -1,191 +1,236 @@
-= Inline Edit
+= Creating and Editing Changes in the Gerrit Web Interface
 
-This page explains the workflow for creating and amending changes in the
-browser.
+== Overview
+
+The following content explains how to use the Gerrit web interface to create
+and edit changes. Use the web interface to make minor changes to files. When
+you create a change in the Gerrit user interface, you don't clone a Gerrit
+repository or use the CLI to issue Git commands — you perform your work
+directly in the Gerrit web interface.
+
+To learn more, see the link:intro-user.html[Gerrit User's Guide].
 
 
 [[create-change]]
-== Creating a New Change
+== Creating a Change
 
-A new change can be created directly in the browser, meaning it is not necessary
-to clone the whole repository to make trivial changes.
+To create a change in the Gerrit web interface:
 
-The new change is created as a public
-link:user-upload.html#wip[work-in-progress change].
+. From the link:http://gerrit-review.googlesource.com[Gerrit Code Review]
+  dashboard, select Browse > Repositories.
 
-There are two different ways to create a new change:
+. Under Repository Name, click the name of the repository you want to work
+  on. For example, Public-Projects. To find a specific repository, enter all
+  or part of its name next to Filter:
++
+image::images/inline-edit-home-page.png[width=600]
 
-By clicking on the 'Create Change' button in the project screen:
+. In the left navigation panel for the repository you selected, click
+  Commands:
++
+image::images/inline-edit-create-change.png[width=350]
 
-[[create-change-from-project-info-screen]]
+. Under Repository Commands, click Create Change.
 
-image::images/inline-edit-create-change-project-screen.png[width=800, link="images/inline-edit-create-change-project-screen.png"]
+. In the Create Change window, enter the following information:
 
-The user can select the branch on which the new change should be created:
+   *  Select branch for new change: Specify the destination branch of the
+      change.
 
-image::images/inline-edit-create-change-project-screen-dialog.png[width=800, link="images/inline-edit-create-change-project-screen-dialog.png"]
+   *  Provide base commit SHA1 for change: Leave this field blank.
 
-By clicking the 'Follow-Up' button on the change screen, to create a new change
-based on the selected change.
++
+IMPORTANT: Git uses a unique SHA1 value to identify each and every commit (in
+other words, each Git commit generates a new SHA1 hash). This value differs
+from a Gerrit Change-Id, which is used by Gerrit to uniquely identify a
+change. The Gerrit Change-Id remains static throughout the life of a Gerrit
+change.
 
-[[create-change-from-change-screen]]
+   -  Description: Briefly describe the change. Be sure to use the
+      link:dev-contributing.html#commit-message[Commit Message] format.
+      The first line becomes the subject of the change and is included in
+      the Commit Message. Because the message also appears on its own in
+      dashboards and in the results of `git log --pretty=oneline output`,
+      make the message informative and brief.
 
-image::images/inline-edit-create-follow-up-change.png[width=800, link="images/inline-edit-create-follow-up-change.png"]
+   -  Private change: Select this option to designate this change as private.
+      Only you (and any reviewers you add) can see your private changes.
+
+. On the Create Change window, click Create. Gerrit creates a public Work
+  In Progress (WIP) change. Until the change is sent for review, it remains a
+  WIP and appears in _your_ dashboard only. In addition, all email
+  notifications are turned off.
+
+. Add the files you want to be reviewed.
+
+
+[[add-files]]
+== Adding a File to a Change
+
+Files can only be added to changes that have not been merged into the code
+base.
+
+To add a file to the change:
+
+. In the top left corner of the change, click Edit.
+. Next to Files, click Open:
+
++
+image::images/inline-edit-open-file.png[width=600]
+
+. In the Open File window, do one of the following:
+
+* To add an existing file:
+
+ ** Enter all or part of the file name in the text box. Gerrit automatically
+    populates a list of possible matching files:
++
+image::images/inline-edit-prefill-files.png[width=500]
++
+ ** Select the file you want to add to the change.
+ ** Click Open.
++
+_or,_
+
+*  To create a new file, enter the name of the new file you want to add to the
+change and then click Open.
+
 
 [[editing-change]]
-== Editing Changes
+== Modifying a Change
 
-To switch to edit mode, press the 'Edit' button at the top of the file list:
+To work on a file you've added to a change:
 
-[[switch-to-edit-mode]]
-image::images/inline-edit-enter-edit-mode-from-file-list.png[width=800, link="images/inline-edit-enter-edit-mode-from-file-list.png"]
+. On the change page, click the file name. When you add a new file to a
+  change, a blank page is displayed. When you add an existing file to a
+  change, the entire file is displayed.
 
-While in edit mode, it is possible to add new files to the change by clicking
-the 'Add...' button at the top of the file list.
+. Update the file and then click Save. You _must_ click Save to add the
+  file to the change.
 
-File changes can be reverted or files can be removed from the change or
-deleted files can be restored, by clicking the icons to the left of the file
-name.
+. To close the text editor and display the change page, click Close.
++
+When you save your work and close the file, the file is added to the change
+and the file name is listed in the Files section. The letter displayed to the
+left of the file name denotes the action performed on the file. In this case,
+one file was modified:
 
-To switch from edit mode back to review mode, click the 'Done Editing' button.
+-  M: Modified
+-  A: Added
+-  D: Deleted
++
+image::images/inline-edit-add-file-page.png[width=650]
 
-image::images/inline-edit-file-list-in-edit-mode.png[width=800, link="images/inline-edit-file-list-in-edit-mode.png"]
+. When you're done editing and adding files, click Stop Editing.
 
-[[open-full-screen-editor]]
-While in edit mode, clicking on a file name in the file list opens a full
-screen editor for that file.
+. Click Publish Edit. When you publish an edit, you promote it to a regular
+  patch set. The special ref that represents the change is deleted when the
+  change is published.
 
-To save edits, click the 'Save' button or press `CTRL-S`.  To return to the
-change screen, click the 'Close' button.
+Not happy with your edits? Click Delete Edit.
 
-Note that when editing the commit message, trailing blank lines will be stripped.
 
-image::images/inline-edit-full-screen-editor.png[width=800, link="images/inline-edit-full-screen-editor.png"]
+[[submit-change]]
+== Starting the Review
 
-If there are unsaved edits when the 'Close' button is pressed, a dialog will
-pop up asking to confirm the edits.
+When you start a review, Gerrit removes the WIP designation and submits
+the change to code review. The change appears in other Gerrit dashboards and
+reviewers are notified when the change is updated.
 
-image::images/inline-edit-confirm-unsaved-edits.png[width=800, link="images/inline-edit-confirm-unsaved-edits.png"]
+To start a review:
 
-To discard the unsaved edits and return to the change screen, click the 'OK'
-button. To continue editing, click 'Cancel'.
+. Open the change and then click Start Review:
++
+image::images/inline-edit-start-review-button.png[width=400]
 
-[[switch-to-edit-mode-from-side-by-side]]
+. In the change notification form:
 
-While in review mode, it is possible to switch directly to edit mode and into an
-editor for a file under review by clicking on the edit icon in the patch set list
-on the side-by-side diff view.
+ ** Add the names of the reviewers and anyone else you want to copy.
+ ** Describe the change.
+ ** Click Start Review:
++
+image::images/inline-edit-review-message.png[width=550]
 
-image::images/inline-edit-enter-edit-mode-from-diff.png[width=800, link="images/inline-edit-enter-edit-mode-from-diff.png"]
+The change is now displayed in other Gerrit dashboards and reviewers are
+notified that the change is available for code review.
 
-[[reviewing-changes-made-in-change-edit]]
-== Reviewing Change Edits
 
-Change edits are reviewed in the same way as regular patch sets, using the
-side-by-side diff screen. Change edits are shown as 'edit' in the patch list
-on the diff screen:
+[[review-edits]]
+== Reviewing Changes
 
-image::images/inline-edit-edit-in-diff-screen-patch-list.png[width=800, link="images/inline-edit-edit-in-diff-screen-patch-list.png"]
+Use the side-by-side diff screen.
 
-and on the change screen:
+image::images/inline-edit-diff-screen.png[width=800]
 
-image::images/inline-edit-edit-in-patch-list.png[width=800, link="images/inline-edit-edit-in-patch-list.png"]
+It's possible that subsequent patch sets may exist. For example, this sequence
+means that the change was created on top of patch set 9 while a regular
+patchset was uploaded later:
 
-Note that patch sets may exist that were created after the change edit was created.
+1 2 3 4 5 6 7 8 9 edit 10
 
-For example this sequence:
 
-`1 2 3 4 5 6 7 8 9 edit 10`
+[[search-for-changes]]
+== Searching for Changes with Pending Edits
 
-means that the change edit was created on top of patch set number 9 and a regular
-patch set was uploaded later.
+To find changes with pending edits:
+
+*  From the Gerrit dashboard, select Your > Changes. All your changes are
+listed, according to Work in progress, Outgoing reviews, Incoming reviews,
+CCed on, and Recently closed.
+
+For more information about Search operators, see
+link:user-search.html[Searching Changes]. For example, to find only
+those changes that contain edits, see link:user-search.html#has[has:edit].
+
 
 [[change-edit-actions]]
-== Change Edit Actions
+== Modifying Changes
 
-Change edits can be deleted, published and rebased, and a patch set that
-represents a change edit can be downloaded like a regular patch set.
-
-[[delete-change-edit]]
-
-There is a special ref for a change edit. When the change edit is deleted, this
-ref is deleted as well. To delete a change edit click on the "Delete Edit"
-button.
-
-[[publish-change-edit]]
-
-When a change edit is based on the current patch set, it can be published. By
-publishing a change edit it is promoted to a regular patch set. The special ref
-that represents the change edit is deleted on publish. To publish a change edit
-click on the "Publish Edit" button. This button is only shown when the change
-edit is based on the current patch set. Otherwise the change edit must first be
-rebased onto the current patch set.
 
 [[rebase-change-edit]]
+=== Rebasing a Change Edit
 
-Only change edits that are based on the current patch set can be published. If
-in the meantime a new patch set was uploaded, the change edit must be rebased on
-top of the current patch set before it can be published. Rebasing a change
-edit is done by clicking on the "Rebase Edit" button. If the rebase results in
-conflicts, these conflicts cannot be resolved in the browser. In this case the
-change edit must be downloaded (see below) and the conflicts must be resolved in
-the local environment. The commit that contains the conflict resolution can then
-be uploaded by setting `edit` as option on the target ref:
+Only when a change is based on the current patch set can the change be
+published. In the meantime, if a new patch set has been uploaded, the change
+must be rebased on top of the current patch set before the change can be
+published.
 
-----
-  $ git push host HEAD:refs/for/master%edit
-----
+To rebase a change:
+
+-  Open the change and then click Rebase Edit.
+
+If the rebase generates conflicts, the conflicts can't be resolved in the web
+interface. Instead, the change must be downloaded (see below) and the conflicts
+resolved in the local environment.
+
+When the conflicts are resolved in the local environment, the commit that
+contains the conflict resolution can be uploaded by setting `edit` as an
+option on the target ref. For example:
+
+....
+$ git push host HEAD:refs/for/master%edit
+....
+
 
 [[download-change-edit-patch]]
+=== Downloading a Patch
 
-Like regular patch sets, change edits can be downloaded by the download
-commands (e.g. provided by the `download-commands` plugin). To download a
-change edit, select the desired scheme from the "Download" dropdown and copy the
-command to your terminal. Note: only change edit owners and users that were
-granted the link:access-control.html#capability_accessDatabase[accessDatabase]
-global capability are able to access change edit refs.
+As with regular patch sets, you can download changes. For example, as provided
+by the `download-commands` plugin. Only the owners of a change and those
+users granted the
+link:access-control.html#capability_accessDatabase[accessDatabase] global
+capability can access change refs.
 
-[[search-for-change-edits]]
+To download a change:
 
-To search change edits from the UI the link:user-search.html#has[has:edit]
-predicate can be used.
+. Open the change, click the More icon, and then select Download patch.
+. Copy the desired scheme from the Download drop-down.
+. Paste the command into a terminal window.
 
-Alternatively change edits can be accessed through "My => Edits" dashboard.
-
-[[not-implemented-features]]
-== Not Implemented Features
-
-* Support default configuration options for inline editor that an
-administrator has set in `refs/users/default:preferences.config` file.
-
-* Allow to rename files that are already contained in the change (from the file table).
-The same rename file dialog can be used with preselected and disabled original file
-name.
-
-* Changed files in change edit should be marked as changed in file table in edit mode.
-One option is to use dirty icon or "*" char in front of changed files, another option
-is to use different hyperlink color for changed files (red?), to avoid adding yet another
-column to the file table
-
-* Add navigation icons in header area of edit screen. When dozen files need to be changed
-in context of change edit, this is not the best workflow to open one file in edit screen,
-change it, save it, close edit screen and select next file from the file table to edit.
-"<-" | "->" icons in header of edit screen could be used to navigate to the next file to
-change from the file table. This would behave like the navigation icons in side by side
-with the following logic on click:
-
-** "save-when-file-was-changed" or
-** "close-when-no-changes"
-
-* Implement conflict resolution during rebase of change edit using inline edit
-feature by creating new edit on top of current patch set with auto merge content
-
-* Similarly, reuse inline edit feature for conflict resolution during rebase of regular
-patch sets
+image::images/inline-edit-actions-download.png[width=600]
 
 GERRIT
-------
+
 Part of link:index.html[Gerrit Code Review]
 
 SEARCHBOX
----------
diff --git a/Documentation/user-notify.txt b/Documentation/user-notify.txt
index 4b928f3..3c922ed 100644
--- a/Documentation/user-notify.txt
+++ b/Documentation/user-notify.txt
@@ -244,6 +244,17 @@
 been posted in that notification using "Yes" or "No", for
 example `Gerrit-HasLabels: No`.
 
+[[Gerrit-Comment-In-Reply-To]]Gerrit-Comment-In-Reply-To::
+
+In comment emails, a comment-in-reply-to footer is present for each
+account who has a comment that is replied-to in that set of comments.
+For example, to apply a filter to Gerrit messages in which your own diff
+comments are responded to, you might search for the following:
+
+----
+  Gerrit-Comment-In-Reply-To: User Name <user@example.com>
+----
+
 GERRIT
 ------
 Part of link:index.html[Gerrit Code Review]
diff --git a/Documentation/user-request-tracing.txt b/Documentation/user-request-tracing.txt
new file mode 100644
index 0000000..8430e97
--- /dev/null
+++ b/Documentation/user-request-tracing.txt
@@ -0,0 +1,72 @@
+= Request Tracing
+
+Gerrit supports on-demand tracing of single requests that results in
+additional logs with debug information that are written to the
+`error_log`. The logs that correspond to a traced request are
+associated with a unique trace ID. This trace ID is returned with the
+response and can be used by an administrator to find the matching log
+entries.
+
+How tracing is enabled and how the trace ID is returned depends on the
+request type:
+
+* REST API: For REST calls tracing can be enabled by setting the
+  `trace` request parameter or the `X-Gerrit-Trace` header, the trace
+  ID is returned as `X-Gerrit-Trace` header. More information about
+  this can be found in the link:rest-api.html#tracing[Request Tracing]
+  section of the link:rest-api.html[REST API documentation].
+* SSH API: For SSH calls tracing can be enabled by setting the
+  `--trace` option. More information about this can be found in
+  the link:cmd-index.html#trace[Trace] section of the
+  link:cmd-index.html[SSH command documentation].
+* Git: For Git pushes tracing can be enabled by setting the
+  `trace` push option, the trace ID is returned in the command output.
+  More information about this can be found in
+  the link:user-upload.html#trace[Trace] section of the
+  link:user-upload.html[upload documentation]. Tracing for Git requests
+  other than Git push is not supported.
+
+When request tracing is enabled it is possible to provide an ID that
+should be used as trace ID. If a trace ID is not provided a trace ID is
+automatically generated. The trace ID must be provided to the support
+team so that they can find the trace.
+
+When doing traces it is recommended to specify the ID of the issue
+that is being investigated as trace ID so that the traces of the issue
+can be found more easily. When the issue ID is used as trace ID there
+is no need to find the generated trace ID and report it in the issue.
+
+Since tracing consumes additional server resources tracing should only
+be enabled for single requests if there is a concrete need for
+debugging. In particular bots should never enable tracing for all their
+requests by default.
+
+== Find log entries for a trace ID
+
+If tracing is enabled all log messages that correspond to the traced
+request have a `TRACE_ID` tag set, e.g.:
+
+----
+[2018-08-13 15:28:08,913] [HTTP-76] TRACE com.google.gerrit.httpd.restapi.RestApiServlet : Received REST request: GET /a/accounts/self (parameters: [trace]) [CONTEXT forced=true TRACE_ID="1534166888910-3985dfba" ]
+[2018-08-13 15:28:08,914] [HTTP-76] TRACE com.google.gerrit.httpd.restapi.RestApiServlet : Calling user: admin [CONTEXT forced=true TRACE_ID="1534166888910-3985dfba" ]
+[2018-08-13 15:28:08,942] [HTTP-76] TRACE com.google.gerrit.httpd.restapi.RestApiServlet : REST call succeeded: 200 [CONTEXT forced=true TRACE_ID="1534166888910-3985dfba" ]
+----
+
+By doing a grep with the trace ID over the error log the log entries
+that correspond to the request can be found.
+
+== Which information is captured in a trace?
+
+* request details
+** REST API: request URL, request parameter names, calling user,
+   response code, response body on errors
+** SSH API: parameter names
+** Git API: push options, magic branch parameter names
+* cache misses, cache evictions
+* reads from NoteDb, writes to NoteDb
+* reads of meta data files, writes of meta data files
+* index queries (with parameters and matches)
+* reindex events
+* permission checks (e.g. which rule is responsible for a deny)
+* timer metrics
+* all other logs
diff --git a/Documentation/user-review-ui.txt b/Documentation/user-review-ui.txt
index 99ce645..de17c00 100644
--- a/Documentation/user-review-ui.txt
+++ b/Documentation/user-review-ui.txt
@@ -307,7 +307,7 @@
 The type of a file modification is indicated by the character in front
 of the file name:
 
-- 'no character' (Modified):
+- `M` or 'no character' (Modified):
 +
 The file existed before this change and is modified.
 
@@ -327,6 +327,13 @@
 +
 The file is new and is copied from an existing file.
 
+- `U` (Unchanged):
++
+The file is unchanged and has the same content. Unchanged files only
+appear in the file list if 2 patch sets are compared and the file has
+comments on at least one of the sides. Otherwise unchanged files are
+filtered out.
+
 image::images/user-review-ui-change-screen-file-list-modification-type.png[width=800, link="images/user-review-ui-change-screen-file-list-modification-type.png"]
 
 [[rename-or-copy]]
diff --git a/Documentation/user-search-projects.txt b/Documentation/user-search-projects.txt
new file mode 100644
index 0000000..8ebbf3e
--- /dev/null
+++ b/Documentation/user-search-projects.txt
@@ -0,0 +1,58 @@
+= Gerrit Code Review - Searching Projects
+
+[[search-operators]]
+== Search Operators
+
+Operators act as restrictions on the search. As more operators
+are added to the same query string, they further restrict the
+returned results.
+
+[[name]]
+name:'NAME'::
++
+Matches projects that have exactly the name 'NAME'.
+
+[[parent]]
+parent:'PARENT'::
++
+Matches projects that have 'PARENT' as parent project.
+
+[[inname]]
+inname:'NAME'::
++
+Matches projects that a name part that starts with 'NAME' (case
+insensitive).
+
+[[description]]
+description:'DESCRIPTION'::
++
+Matches projects whose description contains 'DESCRIPTION', using a
+full-text search.
+
+[[state]]
+state:'STATE'::
++
+Matches project's state. Can be either 'active' or 'read-only'.
+
+== Magical Operators
+
+[[is-visible]]
+is:visible::
++
+Magical internal flag to prove the current user has access to read
+the projects and all the refs. This flag is always added to any query.
+
+[[limit]]
+limit:'CNT'::
++
+Limit the returned results to no more than 'CNT' records. This is
+automatically set to the page size configured in the current user's
+preferences. Including it in a web query may lead to unpredictable
+results with regards to pagination.
+
+GERRIT
+------
+Part of link:index.html[Gerrit Code Review]
+
+SEARCHBOX
+---------
diff --git a/Documentation/user-search.txt b/Documentation/user-search.txt
index 21875b2..48d331b 100644
--- a/Documentation/user-search.txt
+++ b/Documentation/user-search.txt
@@ -110,9 +110,7 @@
 [[ownerin]]
 ownerin:'GROUP'::
 +
-Changes originally submitted by a user in 'GROUP'. When no other index
-predicate is explicitly added in the query, defaults to only include
-changes in status 'OPEN'.
+Changes originally submitted by a user in 'GROUP'.
 
 [[query]]
 query:'NAME'::
@@ -141,9 +139,7 @@
 [[reviewerin]]
 reviewerin:'GROUP'::
 +
-Changes that have been, or need to be, reviewed by a user in 'GROUP'. When
-no other index predicate is explicitly added in the query, defaults to only
-include changes in status 'OPEN'.
+Changes that have been, or need to be, reviewed by a user in 'GROUP'.
 
 [[commit]]
 commit:'SHA1'::
@@ -169,6 +165,25 @@
 Changes occurring in 'PROJECT' or in one of the child projects of
 'PROJECT'.
 
+[[repository]]
+repository:'REPOSITORY', repo:'REPOSITORY'::
++
+Changes occurring in 'REPOSITORY'. If 'REPOSITORY' starts with `^` it
+matches repository names by regular expression.  The
+link:http://www.brics.dk/automaton/[dk.brics.automaton
+library] is used for evaluation of such patterns.
+
+[[repositories]]
+repositories:'PREFIX', repos:'PREFIX'::
++
+Changes occurring in repositories starting with 'PREFIX'.
+
+[[parentrepository]]
+parentrepository:'REPOSITORY', parentrepo:'REPOSITORY'::
++
+Changes occurring in 'REPOSITORY' or in one of the child repositories of
+'REPOSITORY'.
+
 [[branch]]
 branch:'BRANCH'::
 +
diff --git a/Documentation/user-upload.txt b/Documentation/user-upload.txt
index 1e76df5..751e886 100644
--- a/Documentation/user-upload.txt
+++ b/Documentation/user-upload.txt
@@ -421,6 +421,36 @@
   $ git push exp
 ----
 
+[[trace]]
+==== Trace
+
+When pushing to Gerrit tracing can be enabled by setting the
+`trace=<trace-id>` push option. It is recommended to use the ID of the
+issue that is being investigated as trace ID.
+
+----
+  git push -o trace=issue/123 ssh://john.doe@git.example.com:29418/kernel/common HEAD:refs/for/master
+----
+
+It is also possible to omit the trace ID and get a unique trace ID
+generated.
+
+.Example Request
+----
+  git push -o trace ssh://john.doe@git.example.com:29418/kernel/common HEAD:refs/for/master
+----
+
+Enabling tracing results in additional logs with debug information that
+are written to the `error_log`. All logs that correspond to the traced
+request are associated with the trace ID. This trace ID is returned in
+the command output:
+
+----
+  remote: TRACE_ID: 1534174322774-7edf2a7b
+----
+
+Given the trace ID an administrator can find the corresponding logs and
+investigate issues more easily.
 
 [[push_replace]]
 === Replace Changes
@@ -452,6 +482,11 @@
 during normal uploads.
 
 See above for the preferred technique of replacing changes.
+
+Pushing directly to `refs/changes/` is deprecated. If you see the error
+message 'upload to refs/changes not allowed', it means that pushing directly
+to `refs/changes` is disabled on the Gerrit server and the below section does
+not apply to you.
 --
 
 To add an additional patch set to a change, replacing it with an
diff --git a/README.md b/README.md
index 1ca01d5..a9582b0 100644
--- a/README.md
+++ b/README.md
@@ -40,7 +40,7 @@
 ## Getting in contact
 
 The IRC channel on freenode is #gerrit. An archive is available at:
-[echelog.com](http://echelog.com/logs/browse/gerrit).
+[echelog.com](https://echelog.com/logs/browse/gerrit).
 
 The Developer Mailing list is [repo-discuss on Google Groups](https://groups.google.com/forum/#!forum/repo-discuss).
 
@@ -52,13 +52,13 @@
 
 Install [Bazel](https://bazel.build/versions/master/docs/install.html) and run the following:
 
-        git clone --recursive https://gerrit.googlesource.com/gerrit
+        git clone --recurse-submodules https://gerrit.googlesource.com/gerrit
         cd gerrit && bazel build release
 
 ## Install binary packages (Deb/Rpm)
 
 The instruction how to configure GerritForge/BinTray repositories is
-[here](http://gitenterprise.me/2015/02/27/gerrit-2-10-rpm-and-debian-packages-available)
+[here](https://gitenterprise.me/2015/02/27/gerrit-2-10-rpm-and-debian-packages-available/)
 
 On Debian/Ubuntu run:
 
diff --git a/ReleaseNotes/.gitignore b/ReleaseNotes/.gitignore
deleted file mode 100644
index 8a3da24..0000000
--- a/ReleaseNotes/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.html
-/.published
diff --git a/ReleaseNotes/BUILD b/ReleaseNotes/BUILD
deleted file mode 100644
index 9083a45..0000000
--- a/ReleaseNotes/BUILD
+++ /dev/null
@@ -1,23 +0,0 @@
-load("//tools/bzl:asciidoc.bzl", "genasciidoc", "genasciidoc_zip", "release_notes_attributes")
-
-SRCS = glob(["*.txt"])
-
-genasciidoc(
-    name = "ReleaseNotes",
-    srcs = SRCS,
-    attributes = release_notes_attributes(),
-    backend = "html5",
-    resources = False,
-    searchbox = False,
-    visibility = ["//visibility:public"],
-)
-
-genasciidoc_zip(
-    name = "html",
-    srcs = SRCS,
-    attributes = release_notes_attributes(),
-    backend = "html5",
-    resources = False,
-    searchbox = False,
-    visibility = ["//visibility:public"],
-)
diff --git a/ReleaseNotes/ReleaseNotes-2.0.10.txt b/ReleaseNotes/ReleaseNotes-2.0.10.txt
deleted file mode 100644
index 33078d9..0000000
--- a/ReleaseNotes/ReleaseNotes-2.0.10.txt
+++ /dev/null
@@ -1,62 +0,0 @@
-= Release notes for Gerrit 2.0.10
-
-Gerrit 2.0.10 is now available in the usual location:
-
-link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]
-
-
-== New Features
-
-* GERRIT-129  Make the browser window title reflect the current scre...
-+
-Useful usability enhancement when you have multiple tabs open.
-
-* GERRIT-132  Allow binary files to be downloaded from changes for l...
-+
-Useful if you need to view say a Microsoft Word document or a PDF.
-
-* GERRIT-130  Allow publishing comments on non-current patch sets
-+
-Now comments can still be published, even if the change owner has uploaded a replacement while you were creating drafts.
-
-* GERRIT-138  Show the author name in change submitted email notific...
-+
-Minor enhancement to the way submitted emails are formatted.
-
-== Bug Fixes
-
-* GERRIT-91   Delay updating the UI until a Screen instance is fully...
-+
-This is a huge UI improvement.  Gerrit now waits to display until the data is ready and the UI is updated.  Thus you won't see it show stale data, and then suddenly update to
-whatever you actually clicked on.
-
-* GERRIT-134  Allow users to preview how Gerrit will format an inlin...
-+
-Also a huge usability improvement.
-
-* Update SSHD to 1.0-r766258_M5
-+
-This version of MINA SSHD correctly supports SSH ControlMaster, a trick to reuse SSH connections, supported by repo.  See [http://jira.source.android.com/jira/browse/REPO-11 REPO-11].
-
-* GERRIT-122  Fix too wide SSH Keys table by clipping the server hos...
-* GERRIT-131  Fix comment editors on the last line of a file
-* GERRIT-135  Enable Save button after paste in a comment editor
-* GERRIT-137  Error out if a user forgets to squash when replacing a...
-
-== Other Changes
-* Start 2.0.10 development
-* Add missing super.onSign{In,Out} calls to ChangeScreen
-* Remove the now pointless sign in callback support
-* Change our site icon to be more git-like
-* Ensure blank space between subject line and body of co...
-* Create a debug mode only method of logging in to Gerrit
-* Refactor UI construction to be more consistent across ...
-* Do not permit GWT buttons to wrap text
-* Fix the sign in dialog to prevent line wrapping "Link ...
-* Change Patch.ChangeType.ADD to be past tense
-* Improve initial page load by embedding user account da...
-* Automatically expand inline comment editors for larger...
-* Merge change 9533
-* Upgrade MINA SSHD to SVN 761333 and mina-core to 2.0.0...
-* Use gwtexpui 1.0.4 final
-* gerrit 2.0.10
\ No newline at end of file
diff --git a/ReleaseNotes/ReleaseNotes-2.0.11.txt b/ReleaseNotes/ReleaseNotes-2.0.11.txt
deleted file mode 100644
index 5bd6ca0..0000000
--- a/ReleaseNotes/ReleaseNotes-2.0.11.txt
+++ /dev/null
@@ -1,122 +0,0 @@
-= Release notes for Gerrit 2.0.11
-
-Gerrit 2.0.11 is now available in the usual location:
-
-link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]
-
-*WARNING: This version contains a schema change.*
-
-Apply the schema upgrade:
-----
-  java -jar gerrit.war --cat sql/upgrade009_010.sql | psql reviewdb
-----
-
-== Important Notes
-
-=== Cache directory
-
-Gerrit now prefers having a temporary directory to store a disk-based content cache.  This cache used to be in the PostgreSQL database, and was the primary reason for the rather large size of the Gerrit schema.  In 2.0.11 the cache has been moved to the local filesystem, and now has automatic expiration management to prevent it from growing too large.  As this is only a cache, making backups of this directory is not required.
-
-It is suggested (but not required) that you enable this cache:
-----
-  mkdir $site_path/disk_cache
-  chown gerrituser $site_path/disk_cache
-  chmod 700 $site_path/disk_cache           ; # just to be paranoid
-----
-The directory can also be placed elsewhere in the local filesystem, see `cache.directory` in the `gerrit.config` file.
-
-link:http://gerrit.googlecode.com/svn/documentation/2.0/config-gerrit.html[http://gerrit.googlecode.com/svn/documentation/2.0/config-gerrit.html]
-
-=== Protocol change
-
-The protocol between the browser based JavaScript and the server has changed.  After installing 2.0.11 users need to load the site page again to ensure they are running 2.0.11 or later.  Users can verify they have the new version by checking the version number in the footer in the lower right.  Users who don't load the new version (e.g. are using a stale tab from a week ago) will see errors when trying to view patches.
-
-== New Features
-
-* GERRIT-8    Add 'Whole File' as a context preference in the user s...
-* GERRIT-9    Honor user's "Default Context" preference
-* GERRIT-14   Split patch view RPCs into two halves
-* GERRIT-61   Database error in side by side view
-* GERRIT-156  Rewrite the side-by-side and unified diff viewers
-+
-The side by side and unified patch viewers have been completely rewritten.  Gerrit now honors the user's Default Context setting (from My > Settings) in both the side by side and the unified patch view.  A new "Whole File" setting is also available, showing the complete file.
-
-* GERRIT-154  Add the branch name to the beginning of the subject li...
-* Sending mail when merge failed due to path conflict, m...
-+
-Some improvements have been made with regards to the emails sent by Gerrit.
-
-* Configure the JGit WindowCache from $site_path/gerrit....
-* Document the new gerrit.config file
-+
-Gerrit now supports a Git-style "$site_path/gerrit.config" configuration file.  Currently this supports configuration of the various memory caches, including control over JGit's pack file cache.  See the updated documentation section for more details:
-link:http://gerrit.googlecode.com/svn/documentation/2.0/config-gerrit.html[http://gerrit.googlecode.com/svn/documentation/2.0/config-gerrit.html]
-
-* Add "gerrit show-caches" to view cache statistics
-+
-There is a new administrative command over SSH called "gerrit show-caches" which displays current cache statistics for the various caches within the Gerrit memory space.
-
-* Expand local part emails when creating new changes
-+
-Simple DWIMery: users can now do `repo upload --reviewer=who` to have the reviewer email automatically expand according to the email_format column in system_config, e.g. by expanding `who` to `who@example.com`.
-
-== Bug Fixes
-
-* GERRIT-81   Can't repack a repository while Gerrit is running
-+
-Running "git repack", "git gc" or "git fetch" in a repository owned by Gerrit is now safe while Gerrit is running.
-
-* GERRIT-165  Don't create new user accounts as full name = "null nu...
-+
-New users coming from Google Accounts OpenID provider where given a full name of "null null" rather than "Anonymous Coward".
-
-* Honor account.preferred_email when checking co...
-+
-Service users created by manually inserting into the accounts table didn't permit using their preferred_email in commits or tags; administrators had to also insert a dummy record into the account_external_ids table.  The dummy account_external_ids record is no longer necessary.
-
-== Other Changes
-* Start 2.0.11 development
-* Include the 'Google Format' style we selected in our p...
-* Upgrade JGit to v0.4.0-310-g3da8761
-* Include JGit sources when building GWT code
-* Cleanup classpath and use source JARs to build JavaScr...
-* Remove the ImportGerrit1 command line utility
-* Remove EncryptContactInfo helper program
-* Add custom serialization for jgit.diff.Edit
-* Add Ehcache 1.6.0-beta5 to our dependency list
-* Start/stop Ehcache when GerritServer starts/stops
-* Cache OpenID discovery results inside of Ehcache
-* Cache JGit FileHeader and EditList inside of Ehcache
-* Store FileHeader and EditList in Ehache during patch s...
-* Remove the now dead patch_contents table from the data...
-* Fix "null null" user names during schema upgrade from ...
-* Work around asciidoc 8.2.2 not including our APLv2 lic...
-* Remove unused logger from SshServlet
-* Reuse is administrator test in admin SSH commands
-* Use common PrintWriter construction in command impleme...
-* Refactor gerrit flush-caches to just flush everything ...
-* GERRIT-166  Move the SSH key cache into Ehcache
-* Change the diff cache serialization of JGit ObjectId i...
-* Fix git_base_path documentation in config-gerrit
-* Clarify the default max_session_age in config-gerrit
-* Enhance the site_path entry in config-gerrit
-* Clarify the caching of static assets under $site_path/...
-* Minor grammar fixes in the Google Analytics documentat...
-* Document that replication honors StrictHostKeyChecking
-* Document how ~/.ssh/known_hosts is used during replica...
-* Document how ssh-agent cannot be used for replication
-* Fix git_base_path references in project-setup
-* Cleanup project setup documentation
-* Expand the config-contact documentation to describe th...
-* Clarify the gitweb integration documentation
-* Minor corrections in install documentation
-* Reformat the config-gerrit page to free up section hea...
-* Enable table of contents in documentation files
-* Add the source code version number to documentation
-* More reformatting of the config-gerrit page
-* Cleanup formatting references for file system path var...
-* Cleanup the documentation index
-* Kill the feature roadmap in the documentation
-* Only use the disk cache directory if we can write to it
-* Change the title of the installation guide
-* Note in the developer install guides that you need to ...
\ No newline at end of file
diff --git a/ReleaseNotes/ReleaseNotes-2.0.12.txt b/ReleaseNotes/ReleaseNotes-2.0.12.txt
deleted file mode 100644
index 0e1df04..0000000
--- a/ReleaseNotes/ReleaseNotes-2.0.12.txt
+++ /dev/null
@@ -1,133 +0,0 @@
-= Release notes for Gerrit 2.0.12
-
-Gerrit 2.0.12 is now available in the usual location:
-
-link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]
-
-*WARNING: This version contains a schema change.*
-
-Apply the schema upgrade:
-----
-  java -jar gerrit.war --cat sql/upgrade010_011.sql | psql reviewdb
-----
-
-== Important Notes
-
-=== Java 6 Required
-
-Gerrit now requires running within a Java 6 (or later) JVM.
-
-=== Protocol change
-
-The protocol between the browser based JavaScript and the server has changed.  After installing 2.0.12 users need to load the site page again to ensure they are running 2.0.12 or later.  Users can verify they have the new version by checking the version number in the footer in the lower right.  Users who don't load the new version (e.g. are using a stale tab from a week ago) will see errors when trying to view patches.
-
-== New Features
-* Honor --reviewer=not.preferred.email during upload
-* Also scan by preferred email for --reviewers and --cc ...
-+
-Better DWIMery for matching reviewers by name, email address, or just local name (e.g. "jdoe") if using HTTP authentication with email_format.
-
-* Add support for MySQL database
-+
-Now MySQL can be used as a backend data store.
-
-* Switch all current SSH commands to use args4j
-* Allow targeted cache flushes to only specific caches
-+
-SSH commands, especially administrative ones like "gerrit show-caches", "gerrit flush-caches", or "gerrit show-connections" now accept options like "-h"/"--help" to view command line options, and use a more typical option parsing semantics.
-
-* GERRIT-164  Bind our SSH daemon with SO_REUSEADDR
-* Honor sshd.tcpKeepAlive for TCP keep alive controls
-* Enable SSH daemon cipher and MAC configuration
-+
-The SSH daemon now binds with SO_REUSEADDR, making warm-restarts of the daemon easier, especially if the site is busy.  Additionally, gerrit.config gained some new options to further control the behavior of the internal SSHD.
-
-* Add admin command 'gerrit show-connections'
-+
-The new "gerrit show-connections" command reports who is connected, from what host, and what command(s) they are running on that SSH session.
-
-* Replace the top menu bar with a tab panel and links
-* GERRIT-27   Add a search box to quickly locate changes by change n...
-+
-The top menu bar area has been redesigned, and a search box has been added on the right, below the username and Settings links.  Currently the search box only accepts change numbers, but in the future we hope to support additional types of query strings.
-
-* Allow users to disable clippy the flash movie if they ...
-+
-A new per-account setting permits users to disable the clippy Flash movie that supports copying text to the clipboard.  In every context where this movie appears clicking on the text converts it to a text box, allowing a fast "click Ctrl-C" interaction to place the text on the clipboard.  Personally I've found that loading 3 Flash movies on a change page really slowed down the UI rendering, so I wanted to disable the Flash movies.
-
-* Allow users to control the number of results per page
-+
-A new per-account setting allows users to control how many rows appear per page in the All screens, like All Open Changes, etc.
-
-* Rewrite the keyboard event handlers to use new GlobalK...
-* GERRIT-136  Implement n/p keys to jump to next/previous diff chunk...
-* Add keyboard bindings n/p for all change lists to pagi...
-* Put the "Use '?' for keyboard help" ahead of the versi...
-* GERRIT-136  Use 'f' in a patch to browse the list of files in the ...
-* Add global jump navigation keys for the main menu
-+
-Keyboard bindings have been completely overhauled in this release, and should now work on every browser.  Press '?' in any context to see the available actions.  Please note that this help is context sensitive, so you will only see keys that make sense in the current context.  Actions in a user dashboard screen differ from actions in a patch (for example), but where possible the same key is used when the logical meaning is unchanged.
-
-== Bug Fixes
-* Ignore "SshException: Already closed" errors
-+
-Hides some non-errors from the log file.
-
-* GERRIT-86   Stop generating raw #target anchor tags
-+
-Should be a minor improvement for MSIE 6 users.
-
-== Other Changes
-* Start 2.0.12 development
-* Report what version we want on a schema version mismat...
-* Remove unused imports in SshServlet
-* Fix vararg warnings in GerritSshDaemon
-* Update Ehcache to 1.6.0-beta5
-* Update SSHD to 1.0-r773859
-* Start targeting Java 1.6
-* Switch Maven GWT plugin to org.codehaus.mojo:gwt-maven...
-* GERRIT-75   Upgrade to GWT 1.6.4
-* GERRIT-75   Switch to GWT 1.6's new HostedMode debugging utility
-* Allow become any account to use GET parameters
-* Switch to gwtexpui's new CSS linker module
-* Load the GWT theme before any other stylesheets
-* Switch from our own LazyTabChild to GWT 1.6's LazyPanel
-* GERRIT-75   Convert all GWT 1.5 listener uses to GWT 1.6 handlers
-* Stop bundling the PostgreSQL driver
-* Upgrade JGit to 0.4.0-372-gbd3c3db
-* Add args4j 2.0.12 as a dependency
-* Describe MySQL and H2 setup in jetty_gerrit.xml templa...
-* Actually deregister a command when it exits
-* Put the link to the review inside the body instead of ...
-* Fix change permalinks after breaking them during GWT 1...
-* Delete dead CSS bundle code
-* Always use NpTextBox or NpTextArea to prevent GlobalKe...
-* Detect cases where system_config has too many rows
-* Remove unnecessary warning suppressions
-* Remove dead code, these aren't used anymore
-* Fix warnings about potential serialization problems
-* Fix warning about debug code in OpenIdServiceImpl
-* Blur menu item hyperlinks on activation
-* Fix LinkMenuItem blur on older browsers
-* Remove dead LoginService, SignInResult classes
-* Remove pointless GWT.isClient calls in Gerrit module
-* Refactor how user preferences are applied to the UI
-* Move the watched project list to its own tab in settin...
-* Refactor account preferences model
-* Sort the RSA host key before the DSA host key
-* Clarify what the "known hosts entry" is
-* Cleanup the name of the search focus key registration
-* Change sign out handler to use GWT's HandlerManager su...
-* Fix all onLoad, onUnload methods to be protected acces...
-* Honor GWT 1.6's handleAsClick logic in DirectScreenLink
-* Switch all hyperlinks to be InlineHyperlink
-* Fix unused import in PatchScreen
-* Make n/p only honor comments on file adds/deletes
-* Switch to gwtjsonrpc's new Handler based status update...
-* Move the comment editor actions into their own keyboar...
-* Ensure the row pointer is visible before moving it
-* Automatically reposition/resize file browser if window...
-* Minor cleanup to Gerrit module bootstrap code path
-* Make escape in the search box abort the search
-* Switch to tagged gwtexpui, gwtjsonrpc, gwtorm
-* gerrit 2.0.12
\ No newline at end of file
diff --git a/ReleaseNotes/ReleaseNotes-2.0.13.txt b/ReleaseNotes/ReleaseNotes-2.0.13.txt
deleted file mode 100644
index 7589568..0000000
--- a/ReleaseNotes/ReleaseNotes-2.0.13.txt
+++ /dev/null
@@ -1,167 +0,0 @@
-= Release notes for Gerrit 2.0.13, 2.0.13.1
-
-Gerrit 2.0.13.1 is now available in the usual location:
-
-link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]
-
-*WARNING: This version contains a major configuration change.*
-
-The schema upgrade needs to run in multiple parts.  Apply the first half:
-----
-  java -jar gerrit.war --cat sql/upgrade011_012_part1.sql | psql reviewdb
-----
-
-Now convert the system_config table to `$site_path/gerrit.config`.
-----
-  java -jar gerrit.war ConvertSystemConfig
-----
-or, do this conversion by hand.  See below for the mapping.
-
-After verifying `$site_path/gerrit.config` is correct for your installation, drop the old columns from the system_config table.  *This causes configuration data loss.*
-----
-  java -jar gerrit.war --cat sql/upgrade011_012_part2.sql | psql reviewdb
-----
-
-== Configuration Mapping
-|| *system_config*                || *$site_path/gerrit.config*     ||
-|| max_session_age                || auth.maxSessionAge             ||
-|| canonical_url                  || gerrit.canonicalWebUrl         ||
-|| gitweb_url                     || gitweb.url                     ||
-|| git_base_path                  || gerrit.basePath                ||
-|| gerrit_git_name                || user.name                      ||
-|| gerrit_git_email               || user.email                     ||
-|| login_type                     || auth.type                      ||
-|| login_http_header              || auth.httpHeader                ||
-|| email_format                   || auth.emailFormat               ||
-|| allow_google_account_upgrade   || auth.allowGoogleAccountUpgrade ||
-|| use_contributor_agreements     || auth.contributorAgreements     ||
-|| sshd_port                      || sshd.listenAddress             ||
-|| use_repo_download              || repo.showDownloadCommand       ||
-|| git_daemon_url                 || gerrit.canonicalGitUrl         ||
-|| contact_store_url              || contactstore.url               ||
-|| contact_store_appsec           || contactstore.appsec            ||
-
-See also [http://gerrit.googlecode.com/svn/documentation/2.0/config-gerrit.html Gerrit2 Configuration].
-
-== New Features
-* GERRIT-180  Rewrite outgoing email to be more user friendly
-+
-A whole slew of feature improvements on outgoing email formatting was closed by this one (massive) rewrite of the outgoing email implementation.
-
-* GERRIT-187  Make n/p jump to last/first line if no more hunks are ...
-+
-When in a patch view (side by side or unified) new key bindings n/p jump to the previous or next hunk, which is very useful if you have context set to Whole File.
-
-* GERRIT-59   Add Next/Previous/Up links to the PatchScreen
-+
-Patch views now contain links to the next and previous file in the patch set, as well as back up to the change.  This has been a very long standing UI glitch that is finally resolved.
-
-* Add "gerrit show-queue" to display the work queue
-* GERRIT-110  Add admin command "gerrit replicate" to force resync a...
-* Document all server side command line tools
-+
-There are new admin commands available over SSH, and all commands are now documented online.  See [http://gerrit.googlecode.com/svn/documentation/2.0/cmd-index.html Command Line Tools].  The new `gerrit replicate` is very useful when a slave goes offline for a bit, and returns later.
-
-* Add remote.`<`name`>`.replicationdelay to control delay
-* GERRIT-110  Automatically replicate all projects at startup
-* GERRIT-110  Allow replication to match only some hosts
-* GERRIT-200  Schedule replication by remote, not by project
-+
-Replication has been made more robust by allowing the administrator to control the delay, as to isolate replication scheduling into different pools.  This is very useful when replicating to multiple sites, e.g. to a warm-spare in the same data center, and to a far away slave in another country.  Gerrit also now forces a full replication on startup, to ensure all slaves are consistent.
-
-* Move sshd_port to gerrit.config as sshd.listenaddress
-+
-The internal SSHD can now be bound to any IP address/port combinations, which can be useful if the system has multiple virtual IP addresses on a single network interface.
-
-* Switch from Java Mail to Apache Commons NET basic SMTP...
-* Block rcpt to addresses not on a whitelist
-+
-The new `sendemail` section of `$site_path/gerrit.config` now controls the configuration of the outgoing SMTP server, rather than relying upon a JNDI resource.  See [http://gerrit.googlecode.com/svn/documentation/2.0/config-gerrit.html configuration] section sendemail for more details.
-
-== Bug Fixes
-* Fix file browser in patch that is taller than the wind...
-* GERRIT-184  Make 'f' toggle the file browser popup closed
-* GERRIT-188  Fix key bindings in patch when changing the old or new...
-* GERRIT-211  Remove spurious whitespace from blank lines in diff vi...
-* GERRIT-196  Fix CSS styling on the history table
-* GERRIT-193  Automatically switch from empty side-by-side to unifie...
-+
-Misc. bug fixes on the patch view screens that I identified after the 2.0.12 release.
-
-* GERRIT-182  Don't NPE when the remote peer address isn't yet known
-* GERRIT-192  Fix NPE in MergeOp when submit to new branch fails due...
-* GERRIT-207  Fix StackOverflowError during cherry-pick submit
-+
-Misc. internal bugs, primarily caused by stupid programming mistakes.
-
-* Invalid sshkeys cache entries when the sshUserName cha...
-+
-If a user tried to connect with the wrong user name, then tried to change their SSH User Name through the web UI (by selecting a different preferred email address), the negative cache entry created during their first connection attempt was stuck in the cache and future connections were still rejected.  Gerrit now flushes both the old and the new user name cache entries when the user name changes.
-
-* GERRIT-210  Allow MINA SSHD to log about host key creation
-* Make SSH host key loading more consistent over time
-+
-It has been pointed out several times that its unclear why Gerrit keeps changing its host key with each startup; this is due to a failure to write the generated host key to disk.  We now log about it, and make it less likely that other sorts of configuration modifications would cause an unexpected host key change.
-
-* Always run SSH replication in BatchMode
-* Special case NoRemoteRepository during replication
-* Simplify error logged for invalid URLs in replication....
-* Special case UnknownHostKey during replication
-* Allow replication.config to drive the thread pool larg...
-* Fix treatment of symbolic refs in PushOp
-+
-A bunch of bug fixes related to error handling during replication.  Errors are now logged in a more clear fashion, which should help administrators to debug replication problems.
-
-* Restore Ctrl-Backspace in comment editor
-* Use server name for ssh_info instead of local address
-* Use server name for advertised SSH host keys
-* Don't reverse resolve CNAMEs when advertising our SSHD
-+
-Bug fixes identified after release of 2.0.13, rolled into 2.0.13.1.
-
-== Other Changes
-* Start 2.0.13 development
-* Use gwtexpui 1.1.1-SNAPSHOT
-* Document the Patch.PatchType and Patch.ChangeType enum
-* Document the Change.Status enum
-* Remove useless boolean return value from ChangeMail he...
-* Remove pointless null assignment from PatchScreen
-* Move ChangeMail into its own server side package
-* Fix patch set replacement emails to correctly retain r...
-* Document ReviewDb.nextChangeMessageId
-* Document some of the core database entity graph
-* Rewrite the replication documentation
-* Add an anchor for Other Servlet Containers
-* Fix minor formatting style nit in PushQueue
-* Extract the PushOp logic from PushQueue
-* Refactor PushQueue.scheduleUpdate to be smaller methods
-* Refactor WorkQueue to support task inspection
-* Reload the submit queue on startup with a 15 second de...
-* Move the per-command ReviewDb handle up to AbstractCom...
-* Don't attempt to replicate the magic "-- All Projects ...
-* Document that remote.<name>.uploadpack is also support...
-* Correct the defaults for remote uploadpack, receivepack
-* Use a HashSet for the active tasks, rather than a List
-* Use gwtorm 1.1.1-SNAPSHOT
-* Remove references in documentation to My>Settings
-* Mention 'git receive-pack' --cc/--reviewer args
-* Fix NPE in "gerrit replicate --all"
-* Put a link back to the index in every page footer
-* Document the other standard caches
-* Delete now unnecessary ImportProjectSubmitTypes
-* Don't start background queues during command line tools
-* Create GerritConfig after parsing gerrit.config file
-* Create a utility to export system_config to gerrit.con...
-* Move contact store configuration to gerrit.config
-* Move gerrit_git_email,gerrit_git_name to gerrit.config
-* Move authentication fields from system_config to gerri...
-* Move gitwebUrl to gerrit.config
-* Move use_repo_download to gerrit.config
-* Move canonical_url, git_daemon_url to gerrit.config
-* Move git_base_path to gerrit.config
-* Document where the nextval_project_id function is for ...
-* Use gwtorm, gwtexpui 1.1.1 final versions
-* Add sendemail.enable to disable email output
-* Use mvn -offline mode when running ./to_hosted.sh
-* Disable AES192CBC and AES256CBC if unlimited cryptogra...
-* gerrit 2.0.13
\ No newline at end of file
diff --git a/ReleaseNotes/ReleaseNotes-2.0.14.txt b/ReleaseNotes/ReleaseNotes-2.0.14.txt
deleted file mode 100644
index 128036d..0000000
--- a/ReleaseNotes/ReleaseNotes-2.0.14.txt
+++ /dev/null
@@ -1,112 +0,0 @@
-= Release notes for Gerrit 2.0.14, 2.0.14.1
-
-Gerrit 2.0.14.1 is now available in the usual location:
-
-link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]
-
-*WARNING: This version contains a schema change* (since 2.0.13)
-
-Apply the database specific schema script:
-----
-  java -jar gerrit.war --cat sql/upgrade012_013_postgres.sql | psql reviewdb
-  java -jar gerrit.war --cat sql/upgrade012_013_mysql.sql | mysql reviewdb
-----
-
-== New Features
-* GERRIT-177  Display branch name next to project in change list
-+
-Now its easier to see from your Mine>Changes what branch each change goes to.  For some users this may help prioritize reviews.
-
-* GERRIT-27   Add commit SHA-1 search to search panel
-+
-The search box in the top right now accepts full or abbreviated commit SHA-1s, in addition to change numbers.  This is a more user friendly way to locate a change, instead of hacking the URL with the legacy /r/commitsha1 reference.
-
-* Add "Ignore whitespace" to patch views
-+
-You can now ask for a difference ignoring leading/trailing whitespace, which may be useful in a review when a block of code is moved underneath an if, or moved out of an if.
-
-* Added a checkbox to switch between contextual/full fil...
-+
-You can now switch a side-by-side view to full context without going to Settings and returning back.
-
-* GERRIT-115  Automatically close changes when a commit is pushed in...
-* GERRIT-54   Close change if a replacement patch set is already sub...
-+
-These pair of changes basically mean that if you download and merge a commit locally, then push that directly into a branch (assuming you have been granted Push access), the change closes automatically.  Likewise, if a replacement patch set is uploaded to a change, but is already merged to a branch, the change closes automatically.  These close some loopholes where the branches and the changes weren't necessarily always in sync.
-
-* Add a micro scp daemon to our SSHD
-* Create gerrit-cherry-pick for client usage
-+
-Gerrit now runs a micro scp daemon as part of its SSHD, and that scp provides a read-only access of some utility functions for client computers.
-gerrit-cherry-pick is a small Bourne shell script end-users can scp onto their local system, then use to download and cherry-pick changes from Gerrit by change number.
-More tools are likely to be developed in the future.
-
-* Audit group member addition and removals
-* Add automaticMembership flag to account groups
-* GERRIT-17   Enable groups to manage contributor agreements
-+
-Group membership changes are now audited in the account_group_members_audit table, but the information is not currently published in the web UI.  This is a start in the direction of keeping track of "who had access to do what when".  In addition, if you use contributor agreements (like review.source.android.com does), CLA acknowledgement can now be done through group membership, rather than a per-user basis.
-
-* GERRIT-174  Record the submitter in the reflog during merge
-+
-This is really for the server admin, the Git reflogs are now more likely to contain actual user information in them, rather than generic "gerrit2@localhost" identities.  This may help if you are mining "WTF happened to this branch" data from Git directly.
-
-== Bug Fixes
-* GERRIT-213  Fix n/p on a file with only one edit
-* GERRIT-66   Always show comments in patch views, even if no edit e...
-* Correctly handle comments after last hunk of patch
-+
-Bug fixes for patch views (e.g. side by side and unified).  Always showing comments is a really nice plus, it helps during a review to ensure that reviewer comments were addressed, even if there was no edit made in that region of the file.
-
-* Don't allow commits to replace in wrong project
-+
-It was possible to upload a replacement commit in project Foo to a change created in project Bar, putting the Bar change into a corrupt and not-viewable state.  This is now correctly error-checked.
-
-* Update SSHD to 1.0-r784137
-* GERRIT-199  Update JGit to 0.4.0-388-gd3d9379
-* Update JGit to 0.4.0-398-ge866578
-+
-JGit suffered from some performance problems when the client was very far ahead of the server, e.g. fetching an Android msm kernel (which is based on an older Linux kernel) into a recent bleeding edge kernel repository took hours.  It now takes seconds.  SSHD was bumped to pick up MINA 2.0.0-M6 which fixes some minor bugs, and is likely to be the final 2.0.0 release version.
-
-* Fix double click on patch set SHA-1 to select only SHA...
-* GERRIT-190  Provide feedback when a reviewer is invalid
-* GERRIT-191  Show email address matched by completion rather than p...
-+
-Minor cosmetic improvements.
-
-* Fix multiple recipient To/CC headers in emails
-+
-Fixed run-on addresses when more than one user was listed in To/CC headers.
-
-== Other Changes
-* Start 2.0.14 development (again)
-* Small doc updates.
-* Merge change 10282
-* documentation: Use git config --file path
-* Skip the ssh:// download URL if the SSHD is unknown
-* Refactor submitter to PersonIdent mapping in MergeOp
-* Refactor MergeOp.getSubmitter to return the ChangeAppr...
-* Remove invalid usage of List.subList(int,int)
-* Convert command line programs to use args4j
-* Don't permit overlapping Edit instances in patch scrip...
-* Merge change 10347
-* Update executablewar to 1.2
-* Pass the PatchScriptSettings back as part of the Patch...
-* Move PatchScriptSettings to .data package
-* Use ValueChangedHandler for CheckBox update events in ...
-* Display post-image lines in side-by-side view when ign...
-* Use binary search when pulling lines from SparseFileCo...
-* Fix compile error in PatchFile
-* Don't try to auto-close changes on branch delete
-* Document the new gerrit-cherry-pick command
-* gerrit 2.0.14
-+
-
-* Start 2.0.15 development
-* GERRIT-221  Ensure RevCommit's body buffer is available when needed
-* Fix stack trace capture in Receive error path
-* Fix --reviewer during replace patch set
-* Document git receive-pack with Gerrit options
-* Add toString debugging aids to SparseFileContent
-* GERRIT-220  Fix bad diff display near empty comment caused edits
-* gerrit 2.0.14.1
\ No newline at end of file
diff --git a/ReleaseNotes/ReleaseNotes-2.0.15.txt b/ReleaseNotes/ReleaseNotes-2.0.15.txt
deleted file mode 100644
index a8d60a4..0000000
--- a/ReleaseNotes/ReleaseNotes-2.0.15.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-= Release notes for Gerrit 2.0.15
-
-Gerrit 2.0.15 is now available in the usual location:
-
-link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]
-
-== Schema Change
-
-None.  For a change.  :-)
-
-== New Features
-* Allow other ignore whitespace settings beyond IGNORE_S...
-+
-Now you can ignore whitespace inside the middle of a line, in addition to on the ends.
-
-== Bug Fixes
-* Update SSHD to include SSHD-28 (deadlock on close) bug...
-+
-Fixes a major stability problem with the internal SSHD.  Without this patch the daemon can become unresponsive, requiring a complete JVM restart to recover the daemon.  The symptom is connections appear to work sporadically... some connections are fine while others freeze during setup, or during data transfer.
-
-* Fix line-wrapped To/CC email headers
-+
-Long To/CC headers with multiple recipients sometimes ran together, making Reply-to-all in the user's email client not address them correctly.  This was a bug in the header formatting code, it wasn't RFC 2822 compliant.
-
-* GERRIT-227  Fix server error when remaining hunks are comments
-* Fix binary search in SparseFileContent
-+
-Stupid bugs in the patch viewing code.  Random server errors and/or client UI crashes.
-
-== Other Changes
-* Restart 2.0.15 development
-* Update JGit to 0.4.0-411-g8076bdb
-* Remove dead isGerrit method from AbstractGitCommand
-* Update JSch to 0.1.41
-* gerrit 2.0.15
\ No newline at end of file
diff --git a/ReleaseNotes/ReleaseNotes-2.0.16.txt b/ReleaseNotes/ReleaseNotes-2.0.16.txt
deleted file mode 100644
index 4f5a5ba..0000000
--- a/ReleaseNotes/ReleaseNotes-2.0.16.txt
+++ /dev/null
@@ -1,80 +0,0 @@
-= Release notes for Gerrit 2.0.16
-
-Gerrit 2.0.16 is now available in the usual location:
-
-link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]
-
-== Schema Change
-
-*WARNING: This version contains a schema change* (since 2.0.14)
-
-Apply the database specific schema script:
-----
-  java -jar gerrit.war --cat sql/upgrade013_014_postgres.sql | psql reviewdb
-  java -jar gerrit.war --cat sql/upgrade013_014_mysql.sql | mysql reviewdb
-----
-
-== New Features
-* Search for changes created or reviewed by a user
-+
-The search box in the upper right corner now accepts "owner:email" and "reviewer:email", in addition to change numbers and commit SHA-1s.  Using owner: and reviewer: is not the most efficient query plan, as potentially the entire database is scanned.  We hope to improve on that as we move to a pure git based backend.
-
-* Make History panel settings in a diff screen sticky
-+
-When comparing different patch sets, e.g. patch set 3 against patch set 2, the settings are now sticky across files in the same change, reducing the number of clicks required to re-review an existing change.
-
-* GERRIT-113  Permit projects to require Signed-off-by lines to crea...
-+
-GERRIT-113 requested that project owners be able to enforce having a Signed-off-by line in the footer of a commit message.  Forks of the Linux kernel require this line in order to contribute back upstream.  If enabled in the project settings screen there must be a SOB line for the author, the committer, and the uploader of a change (though typically committer == uploader).
-
-* Use Tested-by: instead of Verified-by: during cherry-p...
-+
-The Verified-by footer line created during a cherry-picked submit is now called Tested-by.  This better matches with the upstream Linux kernel's conventions of what the role means.  Since the kernel is more widespread than Gerrit Code Review, I'm sticking with the kernel's conventions.
-
-* Extract reviewer suggestions from commit messages
-+
-If a commit message contains Reviewed-by, Tested-by or CC footer lines and those email addresses are registered in Gerrit, those users will receive notification of the new change.  This is an alternate method to supplying reviewer address on the command line.
-
-* Drop the unnecessary host page servlet name from URLs
-+
-The "/Gerrit" suffix is no longer necessary in the URL.  Gerrit now favors just "/" as its path location.  This drops one redirection during initial page loading, slightly improving page loading performance, and making all URLs 6 characters shorter.  :-)
-
-== Bug Fixes
-* Don't create reflogs for patch set refs
-+
-Previously Gerrit created pointless 1 record reflogs for each change ref under refs/changes/.  These waste an inode on the local filesystem and provide no metadata value, as the same information is also stored in the metadata database.  These reflogs are no longer created.
-
-* Fix "Error out if a user forgets to squash when replac...
-+
-Users were still able to find a way to make a change depend upon itself, which makes the change unsubmittable.  Often this was done by creating a merge commit, then committing on top of that, and uploading it as a replacement.  Gerrit failed to notice this condition because it only considered direct ancestors, now it also looks for indirect ancestors.
-
-* Fix syntax error in MySQL URL in jetty_gerrit.xml
-+
-Someone noticed that the MySQL URL was invalid XML, its fixed now.
-
-* Catch OpenID errors caused by clock skew and present t...
-+
-OpenID errors caused by clock skew (or other factors) now present as an error in the client user interface, and in the server log file, making it more obvious when an OpenID failure occurs.  New administrators trying to setup Gerrit installations have often run into problems here, due to bad error reporting.
-
-* GERRIT-232  Support HTTP connections tunneled through SSH
-+
-If the hostname is "localhost" or "127.0.0.1", such as might happen when a user tries to proxy through an SSH tunnel, we honor the hostname anyway if OpenID is not being used.
-
-== Other Changes
-* Start 2.0.16 development
-* Update JGit to 0.4.9-18-g393ad45
-* Name replication threads by their remote name
-* Exclude JGit's JSch version during build
-* Update ehcache to 1.6.0 release
-* Update JGit to 0.5.0
-* Update openid4java to 0.9.5 release
-* Remove --offline mode from to_hosted.sh
-* Save all project settings in one RPC
-* Don't tag Reviewed-by, Tested-by if already Signed-off...
-* Don't append duplicate Reviewed-on Gerrit URLs during ...
-* Don't append duplicate Verified-by or Tested-by lines
-* Use the List<FooterLine> to determine if a paragraph b...
-* Try harder to pretty-print an exception name in error ...
-* Fix minor whitespace issues in ErrorDialog
-* Document how to contribute to Gerrit Code Review
-* gerrit 2.0.16
\ No newline at end of file
diff --git a/ReleaseNotes/ReleaseNotes-2.0.17.txt b/ReleaseNotes/ReleaseNotes-2.0.17.txt
deleted file mode 100644
index 8a24b22..0000000
--- a/ReleaseNotes/ReleaseNotes-2.0.17.txt
+++ /dev/null
@@ -1,103 +0,0 @@
-= Release notes for Gerrit 2.0.17
-
-Gerrit 2.0.17 is now available in the usual location:
-
-link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]
-
-== Schema Change
-
-*WARNING: This version contains a schema change* (since 2.0.16)
-
-Apply the database specific schema script:
-----
-  java -jar gerrit.war --cat sql/upgrade014_015_part1_postgres.sql | psql reviewdb
-  java -jar gerrit.war --cat sql/upgrade014_015_part1_mysql.sql | mysql reviewdb
-----
-
-After the upgrade is successful, apply the final script to drop dead columns:
-----
-  java -jar gerrit.war --cat sql/upgrade014_015_part2.sql | psql reviewdb
-  java -jar gerrit.war --cat sql/upgrade014_015_part2.sql | mysql reviewdb
-----
-
-== New Features
-* Add '[' and ']' shortcuts to PatchScreen.
-+
-The keys '[' and ']' can be used to navigate to previous and next file in a patch set.
-
-* GERRIT-241  Always show History panel in PatchScreen
-+
-The History panel in a patch screen is now always shown, even if there is only one patch set for this file.  This permits viewing the number of comments more easily when navigating through files with ']'.
-
-* Add 'Reply' button to comments on diff screen
-+
-There is now a 'Reply' button on the last comment, making it easier to create a new comment to reply to a prior comment on the same line.  However, Gerrit still does not quote the prior comment when you reply to it.
-
-* GERRIT-228  Apply syntax highlighting when showing file content
-+
-Files are now syntax highlighted.  The following languages are supported, keyed from common file extensions:  C (and friends), Java, Python, Bash, SQL, HTML, XML, CSS, JavaScript, and Makefiles.
-
-* GERRIT-139  Allow mimetype.NAME.safe to enable viewing files
-+
-The new configuration option mimetype.NAME.safe can be set to enable unzipped download of a file, for example a Microsoft Word document.  See http://gerrit.googlecode.com/svn/documentation/2.0/config-gerrit.html for examples.
-
-* GERRIT-179  Display images inline for compare if mimetype.image/*....
-+
-If mimetype.image/TYPE.safe is true images can be viewed inline in order to more easily visually compare them when an image is modified.  Primarily useful for viewing icons in an icon library.
-
-* File review status tracking.
-+
-Per-user green check marks now appear when you view a file.  This makes it easier to keep track of which patch set you last looked at, and within a patch set, which files you have looked at, and which ones you have not.
-
-* GERRIT-247  Allow multiple groups to own a project
-+
-The owner of a project was moved from the General tab to the Access Rights tab, under a new category called Owner.  This permits multiple groups to be designated the Owner of the project (simply grant Owner status to each group).
-
-== Bug Fixes
-* Permit author Signed-off-by to be optional
-+
-If a project requires Signed-off-by tags to appear the author tag is now optional, only the committer/uploader must provide a Signed-off-by tag.
-
-* GERRIT-197  Move 'f' and 'u' navigation to PatchScreen
-+
-The 'f' and 'u' keystrokes in a patch screen were disabled when there were no differences to view.  This was fixed, they are now always available.
-
-* Remove annoying 'no differences' error dialog
-* GERRIT-248  Fix server crash when showing no difference
-+
-The "No Differences" error dialog has been removed.  Instead the "No Differences" message is displayed in the patch screen.  This makes navigation through a pair of patch sets easier with ']' (no dialog stopping to interrupt you when you encounter a file that has not changed and has no comments).
-
-* GERRIT-244  Always enable Save button on comment editors
-+
-Some WebKit based browsers (Apple Safari, Google Chrome) didn't always enable the Save button when selecting a word and deleting it from a comment editor.  This is a bug in the browser, it doesn't send an event to the Gerrit UI.  As a workaround the Save button is now just always enabled.
-
-* GERRIT-206  Permit showing changes to gitlinks (aka submodule poin...
-+
-You can now view a change made to a gitlink (aka a submodule path).
-
-* GERRIT-171  Don't crash the submit queue when a change is a criss-...
-+
-Instead of crashing on a criss-cross merge case, Gerrit unsubmits the change and attaches a message, like it does when it encounters a path conflict.
-
-== Other Changes
-* Start 2.0.17 development
-* Move '[' and ']' key bindings to Navigation category
-* Use gwtexpui 1.1.2-SNAPSHOT to fix navigation keys
-* A few Javadocs and toString() methods for Patch and Pa...
-* Merge change 10646
-* Include the mime-util library to guess file MIME types
-* Merge change 10667
-* Added missing access method for accountPatchReviews
-* Fix bad upgrade014_015 ALTER TABLE command
-* GERRIT-245  Update PatchBrowserPopup when reviewed status is modif...
-* Remove DiffCacheContent.isNoDifference
-* Fix upgrade014_015 part1 scripts WHERE clause
-* Don't allow users to amend commits made by Gerrit Code...
-* Fix bad formatting in UnifiedDiffTable appendImgTag
-* GERRIT-228  Add google-code-prettify 21-May-2009 version
-* GERRIT-228  Load Google prettify JavaScript into client
-* Fix formatting errors in PatchScreen
-* Remove unused imports
-* GERRIT-250  Fix syntax highlighting of multi-line comments
-* Use gwtexpui 1.1.2
-* gerrit 2.0.17
\ No newline at end of file
diff --git a/ReleaseNotes/ReleaseNotes-2.0.18.txt b/ReleaseNotes/ReleaseNotes-2.0.18.txt
deleted file mode 100644
index 1028185..0000000
--- a/ReleaseNotes/ReleaseNotes-2.0.18.txt
+++ /dev/null
@@ -1,310 +0,0 @@
-= Release notes for Gerrit 2.0.18
-
-Gerrit 2.0.18 is now available in the usual location:
-
-link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]
-
-== Important Notices
-
-Please ensure you read the following important notices about this release; .18 is a much larger release than usual.
-
-* OpenID Configuration
-+
-If you use OpenID authentication, the `trusted_external_ids`
-table has moved from the database to the local gerrit.config
-file.  Please ensure you copy any critical patterns to the
-`auth.trustedOpenID` setting in gerrit.config before upgrading
-your server.  Failure to set a pattern will allow Gerrit
-to trust any OpenID provider.  Refer to `auth.trustedOpenID` in
-[http://gerrit.googlecode.com/svn/documentation/2.0/config-gerrit.html Configuration] for more details.
-
-* Caches
-+
-The groups that a user is a member of is no longer stored in the
-`groups` cache; it is now part of the `accounts` cache.  If you
-use a cron script to update the `account_groups` database table
-based upon an external data source (such as LDAP), you will need
-to adjust your script to flush the `accounts` cache.
-The `diff` cache is no longer written to disk by default.
-To enable the disk store again, administrators must explicitly
-set `cache.directory` in the gerrit.config file prior to starting
-Gerrit.
-
-* SSH Usernames
-+
-SSH usernames are no longer automatically assigned to the
-local part of the user's email address.  With 2.0.18, usernames
-must also be unique within the database.  These changes were
-implemented to resolve a minor potential security issue with
-the SSH authentication system.  More details can be found in the
-[http://android.git.kernel.org/?p=tools/gerrit.git;a=commit;h=080b40f7bbe00ac5fc6f2b10a861b63ce63e8add commit message].
-
-== Schema Change
-
-*WARNING: This version contains a schema change* (since 2.0.17)
-
-Important notes about this schema change:
-
-* The schema change may be difficult to undo once applied.
-+
-Downgrading could be very difficult once the upgrade has been started.
-Going back to 2.0.17 may not be possible.
-
-* Do not run the schema change while the server is running.
-+
-This upgrade changes the primary keys of several tables, an operation
-which shouldn't occur while end-users are able to make modifications to
-the database.  I _strongly_ suggest a full shutdown, schema upgrade,
-then startup approach for this release.
-Apply the database specific schema script:
-----
-  java -jar gerrit.war --cat sql/upgrade015_016_part1_postgres.sql | psql reviewdb
-  java -jar gerrit.war --cat sql/upgrade015_016_part1_mysql.sql    | mysql reviewdb
-----
-
-After the upgrade is successful, apply the final script to drop dead tables:
-----
-  java -jar gerrit.war --cat sql/upgrade015_016_part2.sql | psql reviewdb
-  java -jar gerrit.war --cat sql/upgrade015_016_part2.sql | mysql reviewdb
-----
-
-== New Bugs
-* Memory leaks during warm restarts
-
-2.0.18 includes [http://code.google.com/p/google-guice/ Google Guice], which leaves a finalizer thread dangling when the Gerrit web application is halted by the servlet container.  As this thread does not terminate, the web context stays loaded in memory indefinitely, creating a memory leak.  Cold restarting the container in order to restart Gerrit is highly recommended.
-
-
-== New Features
-* GERRIT-104  Allow end-users to select their own SSH username
-+
-End users may now select their own SSH username through the web interface.  The username must be unique within a Gerrit server installation.  During upgrades from 2.0.17 duplicate users are resolved by giving the username to the user who most recently logged in under it; other users will need to login through the web interface and select a unique username.  This change was necessary to fix a very minor security bug (see above).
-
-* Display supported commands when subcommand is not prov...
-+
-Running `ssh -p 29418 gerrit.example.com gerrit` now lists the complete set of subcommands recognized by the gerrit top level command.  This (slightly) improves discoverability of the remote command execution facilities.
-
-* Add a Register link in the menu bar when not signed in
-+
-The Register link in the top right shows up on OpenID based sites when the user is not yet signed in.  This should help discoverability of signing into a Gerrit server to establish your account identity.
-
-* Combine all initial page data into a single object
-* Avoid XSRF initialization requests by using one token ...
-+
-An initial XSRF token is now sent as part of the initial HTTP request, and used for all subsequent RPCs from that browser.  This reduces the initial page load time by cutting out a few round trips that previously were used to bootstrap that XSRF token.
-
-* Redirect /Gerrit#foo to /#foo on the client side
-+
-Gerrit now favors "/#mine" rather than "/Gerrit#mine" for URLs.  Older style URLs will be redirected to the newer style automatically, for the foreseeable future.
-
-* Sort permissions in project access tab
-* Get branches directly from Git rather than database
-* Style tab panel headers like our menu bar header
-* Narrow tables that don't have to be 100% width
-* Cleanup display of external ids in the user settings
-+
-A few minor UI nits in the Settings and Admin panels.  The new UI is a bit more consistent with the theme, and formats data in a bit more sane way.  Nothing earth shattering.
-
-* Make disk cache completely optional
-+
-As noted above in the section about cache changes, the disk cache is now completely optional.
-
-== Bug Fixes
-* GERRIT-5    Remove PatchSetInfo from database and get it always fr...
-+
-A very, very old bug.  We no longer mirror the commit data into the SQL database, but instead pull it directly from Git when needed.  Removing duplicated data simplifies the data store model, something that is important as we shift from an SQL database to a Git backed database.
-
-* GERRIT-220  Fix infinite loop in PatchScriptBuilder
-+
-Under somewhat rare conditions web request threads locked up in an infinite loop while obtaining the data necessary to show a side-by-side or unified patch view to a browser.  The loop doesn't allocate any memory, or perform any database requests, but it still ties up a database connection and a servlet container request processing thread indefinitely.  We found the bug internally at Google when our Gerrit server load average spiked to 32... and we had no more connections in our database connection pool, which was also sized at a max of 32 handles.
-
-* Fix Reviewed-On lines to only include the server URL o...
-+
-The Reviewed-On lines in cherry-picked commits were duplicating the server URL.
-
-* Set outgoing email header Content-Transfer-Encoding: 8...
-+
-Emails are sent in UTF-8, which may have the high bit set.  Thus the transfer encoding must always be set as 8bit, to prevent gateways from potentially discarding the high bits and corrupting the UTF-8 message payload.
-
-* Ensure OpenID related responses aren't cached by proxi...
-+
-Some OpenID related login responses may have sent HTTP headers which were confusing to proxies, potentially allowing a proxy to cache something it should not have cached.  The headers were clarified to better denote no caching is permitted.
-
-* Move ChangeApproval to be a child of PatchSet
-+
-The database schema changed, adding `patch_set_id` to the approval object, and renaming the approval table to `patch_set_approvals`.  If you have external code writing to this table, uh, sorry, its broken with this release, you'll have to update that code first.  :-\
-
-== Other Changes
-
-This release is really massive because the internal code moved from some really ugly static data variables to doing almost everything through Guice injection.  Nothing user visible, but code cleanup that needed to occur before we started making additional changes to the system.
-
-* Start 2.0.18 development
-* Remove bad import of HostPageServlet
-* Upgrade GWT to 1.7.0
-* Update gwt-maven-plugin to 1.1 release
-* Remove dead gwt-maven repository
-* Stop including gwt-dev JARs in project classpath
-* Remove ConvertSystemConfig utility
-* Update SSHD to 1.0-r798139
-* Update JGit to 0.5.0-57-g4c5eb17
-* Replace our RepositoryCache with JGit's RepositoryCache
-* Make missing project descriptions an empty file
-* Remove unused imports.
-* Move all service implementations into server side code
-* Move RpcConstants out of Common class
-* Move the CurrentAccountImpl accessor to Gerrit onModul...
-* Move workflow function access to CategoryFunction class
-* Move ChangeDetail.load to strictly server side code
-* Move the workflow package to be strictly server side
-* Add Guice 2.0 to our dependencies
-* Switch web.xml to Guice based injection
-* Use Guice injection to pass GerritServer to HttpServle...
-* Use Guice to inject GerritServer into RPC backends
-* Move calls to Common.getSchemaFactory to GerritServer....
-* Create the EncyptedContactStore during servlet startup
-* Move OpenID implementation setup to Guice
-* Remove more Common.getSchemaFactory invocations to dir...
-* Pass GerritServer down through SSH command factory
-* Pass GerritServer instance down through the push queue
-* Use Guice to setup the FileTypeRegistery singleton
-* Delete unnecessary GerritCacheControlFilter
-* Remove pointless Srv subclasses of GerritJsonServlet
-* Refactor FileTypeRegsitery to be an interface
-* Let Guice inject the ContactStore implementation
-* Remove dependency on gwtexpui, gwtjsonrpc and gwtorm p...
-* Use Guice to bring up the SSH daemon and its configura...
-* Remove unnecessary GerritServer field in Receive comma...
-* Move PushQueue and ReplicationQueue to singletons mana...
-* Get rid of the GerritServer static singleton
-* Provide SchemFactory ReviewDb by Guice and not Gerrit...
-* Get the SystemConfig from Guice rather than GerritServ...
-* Merge change 10823
-* Inject the site path configuration setting directly
-* Use FileBasedConfig Config rather than RepositoryConfig
-* Correct copyright dates in SitePath support to be 2009
-* Load gerrit.config through Guice injection
-* Refactor outgoing email to be constructed by Guice
-* Move contact store configuration off GerritServer
-* Configure Eclipse projects to cleanup trailing whitesp...
-* Move PatchSetPublishDetail.load() to server side and i...
-* Hide GerritServer.getGerritConfig and use Guice outsid...
-* Use Guice to create the per-request GerritCall object
-* RegisterNewEmailSender is managed by Guice through Ass...
-* AddReviewerSender class is managed by Guice through As...
-* Merge change 10856
-* Merge change 10858
-* FilebasedConfig requires File pointing at config file ...
-* CreateChangeSender class is managed by Guice through A...
-* AbandonedSender is managed by Guice now.
-* Move RegisterNewEmailSender to servlet module
-* Move authentication bits out of GerritServer
-* Update Ehcache to 1.6.1
-* Move Ehcache construction out of GerritServer to Guice
-* CommentSender is managed by Guice now.
-* MergedSender class is managed by Guice now.
-* MergeFailSender is managed by Guice now.
-* Make ReplacePatchSetSender managed by Guice.
-* Refactor MergeOp to use assisted injection
-* Inject the canonicalweburl rather than using GerritSer...
-* Use JGit's cached hostname when URL can't give us the ...
-* Remove use of PatchSetInfoAccess interface in PatchDet...
-* Merge change 10839
-* Use member injection for OutgoingEmail related depende...
-* Fix CanonicalWebUrl when it is null
-* Inject the Provider GerritCall rather than looking it...
-* Use assisted injection to create the PushOp instances
-* Use PatchSetInfoFactory in OutgoingEmail class.
-* Simplify the setup of assisted injection factories
-* Inject the WorkQueue via Guice
-* Fix ProvisionException catch blocks in GerritServletCo...
-* Move system configuration related code to the server.c...
-* Move servlets related to UI RPCs into the server.rpc p...
-* Reduce CreateSchema dependencies to avoid cache
-* Start injectors in production mode
-* Isolate SSHD module from web module
-* Use ServletContext injection to load files from context
-* Refactor SSH commands into their own package
-* Support Guice request and session scopes in SSHD
-* Cleanup CommandFactory to be session aware
-* Refactor CurrentUser to always be request scoped
-* Cleanup names of SSH daemon related classes
-* Refactor command handling to support subcommands in Gu...
-* Refactor command thread creation logic into BaseCommand
-* Move command line parsing to BaseCommand
-* Avoid duplicate singletons
-* Don't inject fields in providers
-* Run Gerrit servlet container in PRODUCTION mode
-* Make database error reporting more predictable from th...
-* Fix duplicate definition of ReviewDb injection
-* Cleanup unused imports in client code
-* Remove unnecessary references to HttpServletRequest
-* Get HttpServletRequest via injection rather than JsonS...
-* Get the remote peer address via the @RemotePeer annota...
-* Move HTTP related classes to an HTTP specific package
-* Drop ServletName in favor a unique annotation object
-* Move all URL lookup to the CanonicalUrlProvider
-* Only load the OpenID servlets if we are using OpenID a...
-* Make the magic "Become" mode for development a normal ...
-* Present new users with a registion welcome screen
-* Fix SSH daemon in web mode to actually have commands
-* Explicitly bind RemoteJsonService implementations to t...
-* Use Anchor for become rather than location assignment
-* Move the become any account form to a real HTML file
-* Document the DEVELOPMENT_BECOME_ANY_ACCOUNT auth.type ...
-* Fix upgrade014_015_part1_mysql syntax errors
-* Merge change 10972
-* Inject most server references to GerritConfig
-* Cleanup CacheManagerProvider's construction of the con...
-* Make DiffCacheEntryFactory package private
-* Cache account ids by email address key in Ehcache
-* Rename ReviewDbProvider to ReviewDbDatabaseProvider
-* Perform per-request cleanup actions at the end of a re...
-* Refactor ChangeDetailService to use injected database ...
-* Move ChangeDetailService code to its own package
-* Refactor ChangeManageService to use the new Handler st...
-* Refactor SSH commands to use request scoped database h...
-* Fix docs in BaseCommand
-* Mark all of BaseServiceImplementation deprecated
-* Refactor SSH command permission checks to use CurrentU...
-* Move ProjectCache to server side and rewrite entire pe...
-* Make existing BaseServiceImplementation use per-reques...
-* Use Project.NameKey in admin panels rather than Projec...
-* Change project to use Project.NameKey as the primary k...
-* Fix sshdAddress in GerritConfig object sent to clients
-* Rename ProjectCache.invalidate to evict
-* Rename ChangeDetailModule to ChangeModule
-* Move account related RPCs to the account package
-* Move patch RPC stuff to the rpc.patch package
-* Remove unnecessary injected dependencies from CatServl...
-* Document why we abuse the GerritCall in HostPageServlet
-* Create a dummy account if the user account no longer e...
-* Construct the AgreementInfo only from server code
-* Merge change 11021
-* Convert GroupCache to be injected by Guice and stored ...
-* Remove Common.getAccountId and use Guice injection only
-* Remove Common.getSchemaFactory
-* Remove Common.getAccountCache
-* Consolidate account lookups to the AccountResolver
-* Rename GerritServerModule to GerritGlobalModule
-* Rename SshDaemonModule to SshModule
-* Update documentation on the named caches
-* Move trusted_external_ids to auth.trustedOpenID
-* Paper bag fix OutgoingEmail initialization
-* Paper bag fix submit action
-* Fix server error 'Array index out of range' on some pa...
-* Merge branch 'maint'
-* Move ChangeApproval to be a child of PatchSet
-* Make #register alone go to the registration form
-* Enable register new email after saving contact informa...
-* Bind ApprovalTypes without using GerritConfig
-* Remove Common class entirely
-* Catch missing BouncyCastle PGP during contact store cr...
-* Correct Owner project_rights min_values during upgrade
-* Unset use_contributor_agreements if agreements are dis...
-* Sort permissions in project access tab
-* Get branches directly from Git rather than database
-* Style tab panel headers like our menu bar header
-* Narrow tables that don't have to be 100% width
-* Cleanup display of external ids in the user settings
-* Preserve negative approvals when replacing patch sets
-* Use gwtjsonrpc 1.1.1
-* gerrit 2.0.18
diff --git a/ReleaseNotes/ReleaseNotes-2.0.19.txt b/ReleaseNotes/ReleaseNotes-2.0.19.txt
deleted file mode 100644
index c9d9c56..0000000
--- a/ReleaseNotes/ReleaseNotes-2.0.19.txt
+++ /dev/null
@@ -1,372 +0,0 @@
-= Release notes for Gerrit 2.0.19, 2.0.19.1, 2.0.19.2
-
-Gerrit 2.0.19.2 is now available in the usual location:
-
-link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]
-
-== Important Notices
-
-* Prior User Sessions
-+
-The cookie used to identify a signed-in user has been changed.  All users
-will be automatically signed-out during this upgrade, and will need to
-sign-in again after the upgrade is complete.
-Users who try to use a web session from before the upgrade may receive the
-obtuse error message "Invalid xsrfKey in request".  Prior web clients are
-misinterpreting the error from the server.  Users need to sign-out and
-sign-in again to pick up a new session.
-This change was necessary to close GERRIT-83, see below.
-
-* Preserving Sessions Across Restarts
-+
-Administrators who wish to preserve user sessions across server restarts must
-set [http://gerrit.googlecode.com/svn/documentation/2.0/config-gerrit.html#cache.directory cache.directory] in gerrit.config.  This allows Gerrit to flush the set
-of active sessions to disk during shutdown, and load them back during startup.
-
-== Schema Change
-
-*WARNING: This version contains a schema change* (since 2.0.18)
-
-Important notes about this schema change:
-
-* Do not run the schema change while the server is running.
-+
-This upgrade adds a new required column to the changes table, something
-which cannot be done while users are creating records. Like .18, I _strongly_
-suggest a full shutdown, schema upgrade, then startup approach.
-Apply the database specific schema script:
-----
-  java -jar gerrit.war --cat sql/upgrade016_017_postgres.sql | psql reviewdb
-  java -jar gerrit.war --cat sql/upgrade016_017_mysql.sql    | mysql reviewdb
-----
-
-
-== New Features
-* New ssh create-project command
-+
-Thanks to Ulrik Sjölin we now have `gerrit create-project`
-available over SSH, to construct a new repository and database
-record for a project.  Documentation has also been updated to
-reflect that the command is now available.
-
-* Be more liberal in accepting Signed-off-by lines
-+
-The "Require Signed-off-by line" feature in a project is now
-more liberal.  Gerrit now requires that the commit be signed off
-by either the author or the committer.  This was relaxed because
-kernel developers often cherry-pick in patches signed off by
-the author and by Linus Torvalds, but not by the committer who
-did the backport cherry-pick.
-
-* Allow cache.name.diskLimit = 0 to disable on disk cache
-+
-Setting cache.name.diskLimit to 0 will disable the disk for
-that cache, even though cache.directory was set.  This allows
-sites to set cache.diff.diskLimit to 0 to avoid caching the diff
-records on disk, but still allow caching web_sessions to disk,
-so that live sessions are maintained across server restarts.
-This is a change in behavior, the prior meaning of diskLimit =
-0 was "unlimited", which is not very sane given how Ehcache
-manages the on disk cache files.
-
-* Allow human-readable units in config.name.maxage
-+
-Timeouts for any cache.name.maxAge may now be specified in human
-readable units, such as "12 days" or "3 hours".  The server will
-automatically convert them to minutes during parsing.  If no
-unit is specified, minutes are assumed, to retain compatibility
-with prior releases.
-
-* Add native LDAP support to Gerrit
-+
-Gerrit now has native LDAP support.  Setting auth.type to
-HTTP_LDAP and then configuring the handful of ldap properties
-in gerrit.config will allow Gerrit to load group membership
-directly from the organization's LDAP server.  This replaces
-the need for the sync-groups script posted in the wiki.  See:
-link:http://gerrit.googlecode.com/svn/documentation/2.0/config-gerrit.html#ldap[http://gerrit.googlecode.com/svn/documentation/2.0/config-gerrit.html#ldap]
-If you use the sync-groups script from the wiki page, you would
-also need to delete the group members after upgrading, to remove
-unnecessary records in your database:
-{{{
-DELETE FROM account_group_members
-WHERE group_id IN (
-SELECT group_id FROM account_groups
-WHERE automatic_membership = 'Y');
-}}}
-
-* Don't allow users to edit their name if it comes from LDAP
-+
-User information loaded from LDAP, such as full name or SSH
-username, cannot be modified by the end-user.  This allows the
-Gerrit site administrator to require that users conform to the
-standard information published by the organization's directory
-service.  Updates in LDAP are automatically reflected in Gerrit
-the next time the user signs-in.
-
-* Remembers anchor during HTTP logins
-+
-When using an HTTP SSO product, clicking on a Gerrit link received
-out-of-band (e.g. by email or IM) often required clicking the
-link twice.  On the first click Gerrit redirect you to the
-organization's single-sign-on authentication system, which upon
-success redirected to your dashboard.  The actual target of the
-link was often lost, so a second click was required.
-With .19 and later, if the administrator changes the frontend web
-server to perform authentication only for the /login/ subdirectory
-of Gerrit, this can be avoided.  For example with Apache:
-----
-     <Location "/login/">
-       AuthType Basic
-       AuthName "Gerrit Code Review"
-       Require valid-user
-       ...
-     </Location>
-----
-   During a request for an arbitrary URL, such as '/#change,42',
-   Gerrit realizes the user is not logged in.  Instead of sending an
-   immediate redirect for authentication, Gerrit sends JavaScript
-   to save the target token (the part after the '#' in the URL)
-   by redirecting the user to '/login/change,42'.  This enters
-   the secured area, and performs the authentication.  When the
-   authenticated user returns to '/login/change,42' Gerrit sends
-   a redirect back to the original URL, '/#change,42'.
-
-
-* Create check_schema_version during schema creation
-+
-Schema upgrades for PostgreSQL now validate that the current
-schema version matches the expected schema version at the start
-of the upgrade script.  If the schema does not match, the script
-aborts, although it will spew many errors.
-
-* Reject disconnected ancestries when creating changes
-+
-Uploading commits to a project now requires that the new commits
-share a common ancestry with the existing commits of that project.
-This catches and prevents problems caused by a user making a typo
-in the project name, and inadvertently selecting the wrong project.
-
-* Change-Id tags in commit messages to associate commits
-+
-Gerrit now looks for 'Change-Id: I....' in the footer area of a
-commit message and uses this to identify a change record within
-the project.
-If the listed Change-Id has not been seen before, a new change
-record is created.  If the Change-Id is already known, Gerrit
-updates the change with the new commit.  This simplifies updating
-multiple changes at once, such as might happen when rebasing an
-entire series of commits that are still being reviewed.
-A commit-msg hook can be installed to automatically generate
-these Change-Id lines during initial commit:
-{{{
-scp -P 29418 review.example.com:hooks/commit-msg .git/hooks/
-}}}
-Using this hook ensures that the Change-Id is predicatable once
-the commit is uploaded for review.
-For more details, please see the docs:
-link:http://gerrit.googlecode.com/svn/documentation/2.0/user-changeid.html[http://gerrit.googlecode.com/svn/documentation/2.0/user-changeid.html]
-
-== Bug Fixes
-* Fix yet another ArrayIndexOutOfBounds during side-by-s...
-+
-We found yet another bug with the side-by-side view failing
-under certain conditions.  I think this is the last bug.
-
-* Apply URL decoding to parameter of /cat/
-* Fix old image when shown inline in unified diff
-+
-Images weren't displaying correctly, even though
-mimetype.image/png.safe was true in gerrit.config.
-Turned out to be a problem with the parameter decoding of the
-/cat/ servlet, as well as the link being generated wrong.
-
-* Fix high memory usage seen in `gerrit show-caches`
-+
-In Gerrit 2.0.18 JGit had a bug where the repository wasn't being
-reused in memory.  This meant that we were constantly reloading
-the repository data in from disk, so the server was always maxed
-out at core.packedGitLimit and core.packedGitOpenFiles, as no
-data was being reused from the cache.  Fixed in this release.
-
-* Fix display of timeouts in `gerrit show-caches`
-+
-Timeouts were not always shown correctly, sometimes 12 hours
-was showing up as 2.5 days, which is completely wrong.  Fixed.
-
-* GERRIT-261  Fix reply button when comment is on the last line
-+
-The "Reply" button didn't work if the comment was on the last
-line of the file, the browser caught an array index out of
-bounds exception as we walked off the end of the table looking
-for where to insert the new editor box.
-
-* GERRIT-83   Make sign-out really invalidate the user's session
-+
-The sign-out link now does more than delete the cookie from the
-user's browser, it also removes the token from the server side.
-By removing it from the server, we prevent replay attacks where
-an attacker has observed the user's cookie and then later tries
-to issue their own requests with the user's cookie.  Note that
-this sort of attack is difficult if SSL is used, as the attacker
-would have a much more difficult time of sniffing the user's
-cookie while it was still live.
-
-* Evict account record after changing SSH username
-+
-Changing the SSH username on the web immediately affected the
-SSH daemon, but the web still showed the old username.  This
-was due to the change operation not flushing the cache that
-the web code was displaying from.  Fixed.
-
-* Really don't allow commits to replace in wrong project
-+
-It was possible for users to upload replacement commits to the
-wrong project, e.g. uploading a replacement commit to project
-B while picking a change number from project A.  Fixed.
-
-== =Fixes in 2.0.19.1=
-
-* Fix NPE during direct push to branch closing a change
-+
-Closing changes by pushing their commits directly into the branch didn't
-always work as expected, due to some data not being initialized correctly.
-
-* Ignore harmless "Pipe closed" in scp command
-+
-scp command on the server side threw exceptions when a client aborted the
-data transfer.  We typically don't care to log such cases.
-
-* Refactor user lookup during permission checking
-* GERRIT-264  Fix membership in Registered Users group
-+
-Users were not a member of "Registered Users", this was a rather serious
-bug in the code as it meant many users lost their access rights.
-
-* GERRIT-265  Correctly catch "Invalid xsrfKey in request" error as ...
-+
-Above I mentioned we should handle this error as "Not Signed In", only
-the pattern match wasn't quite right.  Fixed.
-
-* GERRIT-263  Fix --re=bob to match bob@example.com when using HTTP_LDAP
-+
-HTTP_LDAP broke using local usernames to match an account.  Fixed.
-
-== =Fixes in 2.0.19.2=
-* Don't line wrap project or group names in admin panels
-+
-Line wrapping group names like "All Users" when the description column
-has a very long name in it is ugly.
-
-* GERRIT-267  Don't add users to a change review if they cannot access
-+
-If a user cannot access a change, let the owner know when they try to
-add the user as a reviewer, or CC them on it.
-
-* commit-msg: Do not insert Change-Id if the message is ...
-+
-The commit-msg hook didn't allow users to abort accidental git commit
-invocations, as it still modified the file, making git commit think
-that the end-user wanted to make a commit.  Anyone who has a copy of
-the hook should upgrade to the new hook, if possible.
-
-* Support recursive queries against LDAP directories
-* Fix parsing of LDAP search scope properties
-+
-As reported on repo-discuss, recursive search is sometimes necessary,
-and is now the default.
-
-== Removed Features
-
-* Remove support for /user/email style URLs
-+
-I decided to remove this URL, its a pain to support and not
-discoverable.  Its unlikely anyone is really using it, but if
-they are, they could try using "#q,owner:email,n,z" instead.
-
-== Other Changes
-
-* Start 2.0.19 development
-* Document the Failure and UnloggedFailure classes in Ba...
-* Merge change 11109
-* Document gerrit receive-pack is alias for git receive-...
-* Define a simple query language for Gerrit
-* Create new projects on remote systems with mkdir -p
-* Set the GIT_DIR/description file during gerrit create-...
-* Remove unnecessary toLowerCase calls in AdminCreatePro...
-* Remove unnecessary exception from AdminCreateProject
-* Remove unused import from AccountExternalId
-* Abstract out account creation and simplify sign-on for...
-* Implement server side sign-out handling
-* Cleanup private keys in system_config table
-* Remove dead max_session_age field from system_config
-* Report 'Invalid xsrfKey' as 'Not Signed In'
-* Update gerrit flush-caches documentation about web_ses...
-* Update documentation on cache "web_sessions" configura...
-* Add getSchemeRest to AccountExternalId
-* Cleanup ContactStore and WebModule injection
-* Catch Bouncy Castle Crypto not installed when loading ...
-* Declare caches in Guice rather than hardcoded in Cache...
-* Remove old commented out cache configuration code
-* Don't NPE in SSH keys panel when SSHD is bound to loca...
-* Don't send users to #register,register,mine
-* Document the new LDAP support
-* Cleanup section anchors to be more useful
-* Put anchors on every configuration variable section
-* Add missing AOSP copyright header to WebSession
-* Fix short header lines in gerrit-config.txt
-* Update documentation about system_config private key f...
-* Fetch groups from LDAP during user authentication
-* Actually honor cache.ldap_groups.maxage
-* Add enum parsing support to ConfigUtil
-* Rename LoginType to AuthType
-* Support loading the sshUserName from LDAP
-* Change ldap.accountDisplayName to ldap.accountFullName
-* Fix parsing set-to-nothing options in ldap section
-* Report more friendly errors from gwtjsonrpc
-* Ensure dialog box displays correctly on network failure
-* Document how setting LDAP properties disables web UI
-* Ensure the commit body is parsed before getting the co...
-* Cleanup more section anchors
-* Make documentation table of contents anchors human rea...
-* Remove notes about HTML 5 offline support
-* Fix typo in LegacyGerritServlet javadoc
-* Use subList in server side change query code
-* Remove unsupported /all_unclaimed
-* Rewrite UrlRewriteFilter in terms of Guice bindings
-* Create a commit-msg hook to generate Change-Id tags
-* Add change_key to changes table in database
-* Allow searching for changes by Change-Id strings
-* Display the change key, aka Change-ID in the informati...
-* Display abbreviated change ids in change lists
-* Change javax.security AccountNotFoundException to NoSu...
-* Automatically update existing changes during refs/for/...
-* Automatically close changes when pushing into a branch...
-* Document the new commit-msg hook supplied by Gerrit
-* Correct title of "Command Line Tools" documentation pa...
-* Correct URL example used in Google Analytics Integrati...
-* Correct comment about customizing categories and caches
-* Fix formatting of remote.name.timeout section in docum...
-* Add anchors for remote settings in replication.config ...
-* Widen the search panel now that Change-Ids are 41 char...
-* Revert "Ensure dialog box displays correctly on networ...
-* Allow searches for Change-Ids starting with lowercase ...
-* Fix line wrapped formatting in ChangeListServiceImpl
-* Move Change.Key abbreviation to Change.Key class
-* Format change ids in listing tables with a fixed with ...
-* Cleanup documentation of the commit-msg hook
-* Cleanup the command line tool index page
-* Correct stale documentation section about SSH authenti...
-* Correct access control documentation about project own...
-* Quote the current directory when running asciidoc
-* Move the Default Workflow link into the top of the Use...
-* Correct formatting of usage in gerrit-cherry-pick docu...
-* Document how Gerrit uses Change-Id lines
-* Add Change-Id lines during cherry-pick if not already ...
-* Fix "no common ancestry" bug
-* Fix commit-msg hook to handle first lines like "foo: f...
-* Add a link to Gerrit's project to the top of gerrit-ch...
-* Add full ASLv2 copyright notice to commit-msg hook
-* Embed Gerrit's version number into shell scripts copie...
-* Don't drop max_session_age column in transaction durin...
-* gerrit 2.0.19
\ No newline at end of file
diff --git a/ReleaseNotes/ReleaseNotes-2.0.2.txt b/ReleaseNotes/ReleaseNotes-2.0.2.txt
deleted file mode 100644
index eb8546c..0000000
--- a/ReleaseNotes/ReleaseNotes-2.0.2.txt
+++ /dev/null
@@ -1,67 +0,0 @@
-= Release notes for Gerrit 2.0.2
-
-Gerrit 2.0.2 is now available for download:
-
-link:https://www.gerritcodereview.com/[https://www.gerritcodereview.com/]
-
-== Important Notes
-
-Starting with this version, Gerrit is now packaged as a single WAR file.
-Just download and drop into your webapps directory for easier deployment.
-The WAR file itself is also executable via "java -jar gerrit.war", so tools
-like CreateSchema are easier to invoke ("java -jar gerrit.war
-CreateSchema").
-
-The following optional 3rd party JARs are not included in the WAR:
-
-* Bouncy Castle Crypto API
-* H2 JDBC Driver
-* c3p0 pooled DataSource
-+
-Existing Gerrit administrators either need to change the SSH host key used
-by their servers, or download the Bouncy Castle Crypto API.  The OpenSSH key
-file format can only be read if Bouncy Castle is available, so you need to
-install that library to continue using an existing host key.  If you are
-using Jetty, you can download the library (
-http://www.bouncycastle.org/java.html) to $JETTY_HOME/lib/plus, then restart
-Jetty.
-If you use H2 as your database, you will need to download the JDBC driver
-and insert it into your container's CLASSPATH.  But I think all known
-instances are on PostgreSQL, so this is probably not a concern to anyone.
-
-== New Features
-
-* Trailing whitespace is highlighted in diff views
-* SSHD upgraded with "faster connection" patch discussed on list
-* Git reflogs now contain the Gerrit account information of who did the push
-* Insanely long change subjects are now clipped at 80 characters
-
-== All Changes
-
-* Switch back to -SNAPSHOT builds
-* Overhaul our build system to only create a WAR file
-* Rename top level directory devutil to gerrit1_import
-* Move appjar contents up one level to normalize our struc...
-* Refactor the project admin screen into tabs
-* Move "Publish Comments" before "Submit Patch Set"
-* Fix to_jetty.sh to account for the WAR not having a scri...
-* Don't close SSH command streams as MINA SSHD does it for...
-* Avoid NPE if sign-in goes bad and is missing a token
-* Describe how to make /ssh_info unprotected for repo
-* Improve documentation links to Apache SSHD
-* Fix Documentation Makefile to correctly handle new files
-* Insert some line breaks to make Documentation/install.tx...
-* Don't require Bouncy Castle Crypto
-* Don't require c3p0 or H2 drivers
-* Show the account id in the user settings screen
-* Fix log4j.properties to not run in DEBUG
-* Don't log DEBUG data out of c3p0's SqlUtils class
-* Fix to_jetty so it doesn't unpack c3p0 from our WAR
-* Cleanup c3p0 connection pools if used
-* Yank the mobile specific OpenID login panel
-* GERRIT-23  Highlight common whitespace errors such as whitespace on...
-* Fix tabs in Gerrit.css to be 2 spaces
-* Record the account identity in all reflogs
-* Don't allow the project name in change tables to wrap
-* Clip all change subject lines at 80 columns in change ta...
-* gerrit 2.0.2
\ No newline at end of file
diff --git a/ReleaseNotes/ReleaseNotes-2.0.20.txt b/ReleaseNotes/ReleaseNotes-2.0.20.txt
deleted file mode 100644
index 4f15bb0..0000000
--- a/ReleaseNotes/ReleaseNotes-2.0.20.txt
+++ /dev/null
@@ -1,82 +0,0 @@
-= Release notes for Gerrit 2.0.20
-
-Gerrit 2.0.20 is now available in the usual location:
-
-link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]
-
-== Schema Change
-
-A prior bug (GERRIT-262) permitted some invalid data to enter into some databases.  Administrators should consider running the following update statement as part of their upgrade to .20 to make any comments which were created with this bug visible:
-----
-  UPDATE patch_comments SET line_nbr = 1 WHERE line_nbr < 1;
-----
-Unfortunately the correct position of the comment has been lost, and the statement above will simply position them on the first line of the file.  Fortunately the lost comments were only on the wrong side of an insertion or deletion, and are generally rare.  (On my servers only 0.33% of the comments were created like this.)
-
-== New Features
-* New ssh command approve
-+
-Patch sets can now be approved remotely via SSH.  For more
-details on this new feature please see the user documentation:
-link:http://gerrit.googlecode.com/svn/documentation/2.0/cmd-approve.html[http://gerrit.googlecode.com/svn/documentation/2.0/cmd-approve.html]
-
-* Support changing Google Account identity strings
-+
-For various reasons, including but not being limited to server
-host name changes, the Google Accounts OpenID provider service
-may change the identity string it returns to users.  By setting
-auth.allowGoogleAccountUpgrade = true in the configuration file
-administrators may permit automatically updating an existing
-account with a new identity by matching on the email address.
-
-== Bug Fixes
-* GERRIT-262  Disallow creating comments on line 0
-+
-Users were able to create comments in dead regions of a file.
-That is, if a region was deleted, and thus the left hand side
-showed red deletion of lines, and the right hand side showed a
-grey background of nothing, users were able to place a comment on
-the right hand side in the nothing area.  Since this line did not
-actually exist, the comment was positioned on line 0 of the file.
-Because line 0 does not exist (lines are numbered 1..n), these
-comments become hidden and could not be seen, but showed up in
-the "X comments" counter seen on the Patch History or in the
-listing of files in a patch set.
-The UI and RPC layer was fixed to prevent comments on line 0,
-but existing comments need to be manually moved to a real line.
-See above for the suggested SQL UPDATE command.
-
-* Make ID column same font size as rest of table
-+
-The font size of the ID column was too small, it is now the
-same size as the other columns in the table.
-
-* Fix ALTER INDEX in upgrade015_016_part1_mysql
-* GERRIT-269  Fix bad change_key creation in upgrade016_017_mysql
-+
-MySQL schema upgrade scripts had a few bugs, fixed.
-
-== Other Changes
-* Restart 2.0.20
-* Update MINA SSHD to 0.2.0 release
-* Update args4j to snapshot built from current CVS
-* Cleanup newCmdLineParser method in BaseCommand
-* Remove unnecessary throws IOException in ApproveCommand
-* Cleanup formatting in ApproveCommand
-* Cleanup assumption of Branch.NameKey parent is Project...
-* Fix deprecated constructor warning in PatchSetIdHandler
-* Don't log command line caused failures in flush-caches
-* Use Guice to create custom arg4j OptionHandler instanc...
-* gerrit approve: Allow --code-review=+2
-* gerrit approve: Cleanup invalid patch set error handli...
-* gerrit approve: Cleanup error reporting for missing ob...
-* Parse project names through custom args4j OptionHandler
-* git receive-pack: Use args4j to parse --reviewer and -...
-* Move args4j handlers to their own package
-* gerrit approve: Cleanup option parsing to reduce unnec...
-* gerrit approve: accept commit SHA-1s for approval too
-* gerrit approve: Allow approving multiple commits at on...
-* gerrit approve: Add user documentation
-* Remove unused imports from PatchSetDetailServiceImpl
-* Only enable auth.allowGoogleAccountUpgrade when auth.t...
-* Rename loginType to authType
-* gerrit 2.0.20
\ No newline at end of file
diff --git a/ReleaseNotes/ReleaseNotes-2.0.21.txt b/ReleaseNotes/ReleaseNotes-2.0.21.txt
deleted file mode 100644
index 5de84ff..0000000
--- a/ReleaseNotes/ReleaseNotes-2.0.21.txt
+++ /dev/null
@@ -1,337 +0,0 @@
-= Release notes for Gerrit 2.0.21
-
-Gerrit 2.0.21 is now available in the usual location:
-
-link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]
-
-
-== Schema Change
-
-*WARNING: This version contains a schema change* (since 2.0.19)
-
-* The schema change may be difficult to undo once applied.
-+
-Downgrading could be very difficult once the upgrade has been
-started.  Going back to 2.0.20 may not be possible.
-
-* Do not run the schema change while the server is running.
-+
-This upgrade changes the primary key of a table, an operation
-which shouldn't occur while end-users are able to make
-modifications to the database.  I _strongly_ suggest a full
-shutdown, schema upgrade, then startup approach for this release.
-
-* There may be some duplicate keys
-+
-This upgrade removes a column from the primary key of a table,
-which may result in duplicates being found.  You can search
-for these duplicates before updating:
-{{{
-SELECT account_id,external_id FROM account_external_ids e
-WHERE e.external_id IN (SELECT external_id
-FROM account_external_ids
-GROUP BY external_id
-HAVING COUNT(*) > 1);
-}}}
-Resolving duplicates is left up to the administrator, in
-general though you will probably want to remove one of the
-duplicate records.  E.g. in one case I had 3 users with the
-same mailing list email address registered.  I just deleted
-those and sent private email asking the users to use their
-personal/work address instead of a mailing list.
-Apply the database specific schema script:
-----
-  java -jar gerrit.war --cat sql/upgrade017_018_postgres.sql | psql reviewdb
-  java -jar gerrit.war --cat sql/upgrade017_018_mysql.sql    | mysql reviewdb
-----
-
-
-== Important Notices
-
-* Prior User Sessions
-+
-The cookie used to identify a signed-in user has been changed.
-Again.  All users will be automatically signed-out during
-this upgrade, and will need to sign-in again after the upgrade
-is complete.  The new schema has more room for extensions, so
-this might be the last time we will need to invalidate sessions.
-
-* Harmless error on first startup
-+
-Starting 2.0.21 on an instance which previously had the diff
-cache stored on disk will result in the following non-fatal error
-in the server logs during the first launch of .21 on that system:
-----
-2009-09-02 18:50:07,446::INFO : com.google.gerrit.server.cache.CachePool  - Enabling disk cache /home/gerrit2/android_codereview/disk_cache
-Sep 2, 2009 6:50:07 PM net.sf.ehcache.store.DiskStore readIndex
-SEVERE: Class loading problem reading index. Creating new index. Initial cause was com.google.gerrit.server.patch.DiffCacheKey
-java.lang.ClassNotFoundException: com.google.gerrit.server.patch.DiffCacheKey
-    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
-    at java.security.AccessController.doPrivileged(Native Method)
-    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
-...
-----
-    This error can be safely ignored.  It is caused by a change
-    in the diff cache's on disk schema, invalidating all existing
-    cache entries.
-
-* Significantly larger "diff" cache
-+
-The diff cache schema change noted above changed the element
-stored in the cache from per-file to per-patchset.  That is,
-a patch set which modifies 500 files will now occupy only 1
-element in the diff cache, rather than 500 distinct elements.
-Accordingly, the default `cache.diff.memoryLimit` setting has
-been reduced to 128.
-
-* Removed configuration settings
-+
-The following configuration settings are no longer honored:
-`cache.maxAge`, `cache.memoryLimit`, `cache.diskLimit`, and
-`cache.diskBuffer`.  These settings may now only be set on a
-per-cache basis (e.g. `cache.diff.maxAge`).
-
-* Connection pool recommendation: Apache Commons DBCP
-+
-All of the servers I run now use Apache Commons DBCP instead
-of c3p0 for their connection pools, and the setup guide and
-sample jetty_gerrit.xml reference DBCP now.
-We've run into problems with c3p0 under high loads, or when
-the connection pool is completely exhausted.  DBCP seems to
-fail more gracefully, and seems to give us less trouble.
-Changing pool implementations is not required, c3p0 is still
-a supported provider.  I just want to make it clear that I no
-longer recommend it in production.
-
-== New Features
-
-* GERRIT-189  Show approval status in account dashboards
-+
-Account dashboards now show a summary of the approval status on
-each change.  Unreviewed changes are now highlighted to bring
-the reviewer's attention to them.  Tooltips when hovering over
-a cell will bring up slightly more detailed information.
-
-* GERRIT-276  Allow users to see what groups they are members of
-+
-Under Settings > Groups a user can now view what groups Gerrit
-has placed them into.  This may help administrators to debug
-a user's access problems, as they can ask the user to verify
-Gerrit is seeing what they expect.
-
-* GERRIT-276  Show simple properties of an LDAP group
-+
-If auth.type is HTTP_LDAP, groups which are marked as automatic
-membership now show non-repeating LDAP attributes below their
-description under Admin > Groups.  This display should help an
-administrator to verify that Gerrit has mapped an LDAP group
-correctly.
-
-* Move Patch entity out of database and store in cache
-+
-The `patches` database table has been deleted, Gerrit now makes
-the list of affected files on the fly and stores it within the
-diff cache.  This change is part of a long-running series to
-remove redundant information from the database before we switch
-to a pure Git backed data storage system.
-
-* Only copy blocking negative votes to replacement patch
-+
-Previously Gerrit copied any negative vote in any approval
-category whenever a replacement patch set was uploaded to
-a change.  Now Gerrit only copies "Code Review -2".
-This change should make it easier for reviewers (and scripts
-scanning `patch_set_approvals`) to identify updated changes
-which might require a new review.
-Adminstrators who have created their own categories and want to
-copy the blocking negative vote should set `copy_min_score = 'Y'`
-in the corresponding approval_categories records.
-
-* show-caches: Make output more concise
-+
-Instead of showing ~12 lines of output per cache, each cache is
-displayed as one line of a table.
-
-* Handle multiple accountBase and groupBase
-+
-ldap.accountBase and ldap.groupBase may now be specified multiple
-times in gerrit.config, to search more than one subtree within
-the directory.
-
-* Summarize collapsed comments
-+
-Collapsed comments (both inline on a file and on the change
-itself) now show a short summary of the comment message, making
-it faster to locate the relevant comment to expand for more
-detailed reading.
-
-* Edit inline drafts on Publish Comments screen
-+
-Inline comment drafts may now be directly edited on the Publish
-Comments screen, which can be useful for fixing up a minor typo
-prior to publication.
-
-* Less toggly thingies on change screen
-+
-The change description and the approvals are no longer nested
-inside of a foldy block.  Most users never collapse these, but
-instead just scroll the page to locate the information they are
-looking for.
-
-* Restore Enter/o to toggle collapse state of comments
-+
-Enter and 'o' now expand or collapse an inline comment on the
-the current row of a file.
-
-* Display abbreviated hexy Change-Id in screen titles
-* Use hexy Change-Id in emails sent from Gerrit
-+
-Change-Id abbreviations are now used through more of the UI,
-including emails sent by Gerrit and window/page titles.  This
-change breaks email threading for any existing review emails.
-That is comments on a change created before the upgrade will
-not appear under the original change notification thread.
-
-* Add sendemail.from to control setting From header
-+
-Gerrit no longer forges the From header in notification emails.
-To enable the prior forging behavior, set `sendemail.from`
-to `USER` in gerrit.config.  For more details see
-link:http://gerrit.googlecode.com/svn/documentation/2.0/config-gerrit.html#sendemail.from[sendemail.from]
-
-== Bug Fixes
-
-* Fix ReviewDb to actually be per-request scoped
-+
-When we switched to Guice a misconfiguration allowed Guice to
-give out multiple database connections per web or SSH request.
-This could exhaust the connection pool faster than expected.
-
-* Send no-cache headers during HTTP login
-+
-An oversight in the HTTP login code path may have allowed a proxy
-server between the user's browser and the Gerrit server to cache
-a user's session cookie.  Fixed by sending the correct no-cache
-headers, disallowing any caching of the authentication response.
-
-* Fix project owner permissions
-+
-Folks reported on repo-discuss that a project owner also had to
-have READ permission to use the Branches tab of their project.
-This was a regression introduced when we refactored some of the
-code when adding Guice to the project.  Fixed.
-
-* GERRIT-277  Fix hyperlinks in messages
-+
-Hyperlinks in commit messages such as "<http://foo>" were
-including the trailing > in the URL, making the link broken.
-The trailing > is now properly not included in the URL.
-
-* GERRIT-266  Fix web session cookie refresh time
-+
-In 2.0.19 we introduced web sessions stored in Ehcache, but the
-logic was causing sessions to expire roughly half-way through the
-`cache.web_sessions.maxAge` time.  At the default setting, active
-sessions were expiring after 6 hours.  The cache management has
-been refactored to make this a lot less likely.
-
-* Cleanup not signed in error to be more user friendly
-+
-The error message which comes up when your session is expired
-is now much more useful.  From the dialog you can restart your
-session by clicking the "Sign-In" button, and return to the
-screen you are currently on.
-
-* Fix commit-msg hook to work with commit -v option
-+
-The commit-msg hook was buggy and did not handle `git commit -v`
-correctly.  It also did some bad insertions, placing the magic
-`Change-Id: I...` line at the wrong position in the commit
-message.  The updated hook resolves most of these problems,
-but must be recopied to individual Git repositories by end-users.
-
-* Identify PGP configuration errors during startup
-+
-If the encrypted contact store is enabled, the required encryption
-algorithms are checked at startup to ensure they are enabled
-in the underlying JVM.  This is necessary in case the JVM is
-updated and the administrator forgot to install the unlimited
-strength policy file in the new runtime directory.  Recently
-review.source.android.com was bitten by just such an upgrade.
-
-* GERRIT-278  Fix missing reply comments on old patch set
-+
-Some comments were not visible because they were replies made
-to a comment on say patch set 1 while looking at the difference
-between patch set 1 and patch set 2 of a change.  Fixed.
-
-* Make external_id primary key of account_external_ids
-+
-The database schema incorrectly allowed two user accounts to have
-the same email address, or to have the same OpenID auth token.
-Fixed by asserting a unique constraint on the column.
-
-== Other Changes
-* Start 2.0.21 development
-* Support cleaning up a Commons DBCP connection pool
-* Clarify which Factory we are importing in ApproveComma...
-* Avoid loading Patch object in /cat/ servlet
-* Remove unnecessary reference of patch key in save draft
-* GERRIT-266  Tweak cache defaults to be more reasonable
-* Merge change I131e6c4c
-* Bring back the "No Differences" message when files are...
-* Pick up gwtorm 1.1.2-SNAPSHOT
-* Refactor GroupListScreen's inner table for reuse
-* Do not normalize approval scores on closed changes in ...
-* Don't obtain 0 approvals or submit approvals in dashbo...
-* Update JGit to 0.5.0-93-g5b89a2c
-* Add tests for Change-Id generating commit-msg hook
-* Add test for commit-msg with commit -v
-* Fix formatting error in ApprovalCategory
-* Fix typo in change table column header "Last Update"
-* Fix reference to the All Projects broken when we remov...
-* Use category abbreviations in the dashboard approval c...
-* Format approvals columns in change tables with minimal...
-* Shrink the Last Updated column in dashboards and chang...
-* Highlight changes which need to be reviewed by this us...
-* Fix typo in ChangeTable comment
-* Reduce the window used for "Mon dd" vs. "Mon dd yyyy" ...
-* Don't assume "Anonymous Users" and "Registered Users" ...
-* Log encrypted contact store failures
-* Identify PGP configuration errors during startup
-* Take the change description block out of the disclosure...
-* Move the approval table out of a disclosure panel
-* Explicitly show what value is needed to submit
-* Modernize the display of comments on a change
-* Modernize the display of inline comments on a file
-* Fix "Publish Comments" when there are no inline drafts
-* Merge change 11666
-* Fix display of "Gerrit Code Review" authored comments
-* Fix source code formatting error in FormatUtil
-* Remove unnecessary fake author on inline comments
-* Auto expand all drafts on publish comments screen
-* Remove unused local variable in PublishCommentsScreen
-* Remove unused import from PublishCommentsScreen
-* Use gwtorm, gwtexpui release versions
-* Add javadoc for Change.getKey
-* Updated documentation for eclipse development.
-* Merge change 11698
-* Merge change 11699
-* Merge change 11700
-* Merge change 11703
-* Merge change 11705
-* Moved creation of GerritPersonIdent to a separate provi...
-* Remove unused dependency on GerritServer.
-* Renamed GerritServert to GitRepositoryManager and moved...
-* Remove declaration of OrmException that is never thrown.
-* Increase margin space between buttons of comment editors
-* Simplify GerritCallback error handling
-* Correct comment documenting SignInDialog
-* Remove unused CSS class gerrit-ErrorDialog-ErrorMessage
-* Clarify become any account servlet errors
-* Fix anchor in sshd.reuseAddress documentation
-* Extract parametrized string formatting out of LdapQuery
-* Make cache APIs interfaces for mocking
-* Add easymock 2.5.1 to our test dependencies
-* Add sendemail.from to control setting From header
-* gerrit 2.0.21
\ No newline at end of file
diff --git a/ReleaseNotes/ReleaseNotes-2.0.22.txt b/ReleaseNotes/ReleaseNotes-2.0.22.txt
deleted file mode 100644
index 5e2f8b5..0000000
--- a/ReleaseNotes/ReleaseNotes-2.0.22.txt
+++ /dev/null
@@ -1,155 +0,0 @@
-= Release notes for Gerrit 2.0.22
-
-Gerrit 2.0.22 is now available in the usual location:
-
-link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]
-
-== Schema Change
-
-There is no schema change in this release.
-
-* Restriction on SSH Username
-+
-There is a new restriction placed on the SSH Username field
-within an account.  Users who are using invalid names should
-be asked to change their name to something more suitable.
-Administrators can identify these users with the following query:
-----
-     -- PostgreSQL
-     SELECT account_id,preferred_email,ssh_user_name
-     FROM accounts
-     WHERE NOT (ssh_user_name ~ '[a-zA-Z][a-zA-Z0-9._-]*[a-zA-Z0-9]$');
-
-     -- MySQL
-     SELECT account_id,preferred_email,ssh_user_name
-     FROM accounts
-     WHERE NOT (ssh_user_name REGEXP '[a-zA-Z][a-zA-Z0-9._-]*[a-zA-Z0-9]$');
-----
-   Administrators can force these users to select a new name by
-   setting ssh_user_name to NULL; the user will not be able to
-   login over SSH until they return and select a new name.
-
-
-== New Features
-* GERRIT-280  create-project: Add --branch and cleanup arguments
-+
-The --branch option to create-project can be used to setup the
-default initial branch to be a name other than 'master'.
-Argument parsing also changed slightly, especially around the
-boolean options and submit type.  Please recheck the documentation
-and/or the output of --help.
-
-* GERRIT-216  Add slave mode to ssh daemon
-+
-The standalone SSH daemon can now be run in a read-only
-mode.  This allows use Gerrit's access control database for
-access decisions when serving a read-only copy of the project
-repositories.  Placing a read-only slave local to a remote office
-may reduce sync times for those closer to the slave server.
-
-* Enable multi-line comment highlighting for Scala code
-+
-Scala source code now highlights more like Java source code does,
-especially for multiline `/** ... */` style comments.
-
-* GERRIT-271  Enable forcing ldap.accountSshUserName to lowercase
-+
-The following properties may now be configured from LDAP using
-more complex expressions: accountFullName, accountEmailAddress,
-accountSshUserName.  Property expressions permit forcing
-to a lowercase string, or performing string concatenation.
-These features may help some environments to better integrate
-with their local LDAP server.
-
-* Support username/password authentication by LDAP
-+
-A new auth.type of LDAP was added to support Gerrit prompting
-the end-user for their username and password, and then doing a
-simple bind against the LDAP server to authenticate the user.
-This can simplify installation in environments which lack a
-web based single-sign-on solution, but which already have a
-centralized LDAP directory for user management.
-
-* Inform submitter of merge failure by dialog box
-+
-When a change submit fails, a dialog box is now displayed showing
-the merge failure message.  This saves the user from needing to
-scroll down to the end of the change page to determine if their
-submit was successful, or not.
-
-* Better submit error messages
-+
-Missing dependency submit errors are now much more descriptive
-of the problem, helping the user to troubleshoot the issue on
-their own.  Merge errors from projects using the cherry-pick
-and fast-forward submit types are also more descriptive of the
-real cause.  Unfortunately path conflict errors are not any more
-descriptive, but path conflict is now only reported when there
-is actually a path conflict.
-
-* issue 285   Include pull command line in email notifications
-+
-Sample git pull lines are now included in email notifications.
-
-== Bug Fixes
-* create-project: Document needing to double quote descr...
-+
-The --description flag to create-project require two levels
-of quoting if the new description string contains whitespace.
-The documentation has been updated to reflect that, and shows some
-examples .  Unfortunately this is not easily fixed in software,
-due to the way the SSH client passes the command line to the
-remote server.
-
-* GERRIT-281  daemon: Remove unnecessary requirement of HttpServletR...
-+
-The standalone SSH daemon now starts correctly, without needing
-to put the Java servlet API into the CLASSPATH.
-
-* Enforce Account.sshUserName to match expression
-* Restrict typeable characters in SSH username
-* Disallow ., `_` and - in end of SSH Username
-+
-SSH usernames were permitted to contain any character, including
-oddball characters like '\0' and '/'.  We really want them to
-be a restricted subset which won't cause errors when we try to
-map SSH usernames as file names in a Git repository as we try
-to move away from an SQL database.
-
-* GERRIT-282  Fix reply to comment on left side
-+
-Clicking 'Reply' to a comment on the left hand side sometimes
-generated a server error due to a subtle bug in how the reply
-was being setup.  Fixed.
-
-* issue 282   Fix NullPointerException if ldap.password is missing
-+
-The server NPE'd when trying to open an LDAP connection if
-ldap.username was set, but ldap.password was missing.  We now
-assume an unset ldap.password is the same as an empty password.
-
-* issue 284   Make cursor pointer when hovering over OpenID links
-+
-The cursor was wrong in the OpenID sign-in dialog.  Fixed.
-
-* Use abbreviated Change-Id in merge messages
-+
-Merge commits created by Gerrit were still using the older style
-integer change number; changed to use the abbreviated Change-Id.
-
-== Other Changes
-* Start 2.0.22 development
-* Configure Maven to build with UTF-8 encoding
-* Document minimum build requirement for Mac OS X
-* Merge change 10296
-* Remove trailing whitespace.
-* Update issue tracking link in documentation
-* Merge branch 'doc-update'
-* Move client.openid to auth.openid
-* Fix minor errors in install documentation.
-* Merge change 11961
-* Cleanup merge op to better handle cherry-pick, error c...
-* GERRIT-67   Wait for dependencies to submit before claiming merge ...
-* Move abandonChange to ChangeManageService
-* Remove trailing whitespace in install.txt
-* Gerrit 2.0.22
diff --git a/ReleaseNotes/ReleaseNotes-2.0.23.txt b/ReleaseNotes/ReleaseNotes-2.0.23.txt
deleted file mode 100644
index a3f28a7..0000000
--- a/ReleaseNotes/ReleaseNotes-2.0.23.txt
+++ /dev/null
@@ -1,44 +0,0 @@
-= Release notes for Gerrit 2.0.23
-
-Gerrit 2.0.23 is now available in the usual location:
-
-link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]
-
-== Schema Change
-
-There is no schema change in this release.
-
-
-== New Features
-
-* Adding support to list merged and abandoned changes
-+
-The project link in a change now lists all changes merged in that
-project, or abandoned in that project, based upon the state of the
-change the link is displayed in.  So open changes link to all open
-changes in the same project while merged changes link to all merged
-changes in the same project.  These links are bookmarkable.
-
-== Bug Fixes
-
-* Fix new change email to always have SSH pull URL
-* Move git pull URL to bottom of email notifications
-+
-The new change emails were missing the SSH pull URL, fixed.  Also
-the SSH pull URL is now further away from the web URL, to make it
-less likely one is clicked by accident in an email client.
-
-* issue 286    Fix Not Signed In errors when multiple tabs are open
-+
-Users with multiple tabs open were getting session errors due to
-the tabs not agreeing about the session state.  Fixed.
-
-* Fix MySQL CREATE USER example in install documentation
-
-== Other Changes
-* Start 2.0.23 development
-* Move Jetty 6.x resources into a jetty6 directory
-* Move the Jetty 6.x start script to our extra directory
-* Add scripts for Jetty 7.x and make that the default i...
-* Merge change I574b992d
-* Gerrit 2.0.23
\ No newline at end of file
diff --git a/ReleaseNotes/ReleaseNotes-2.0.24.txt b/ReleaseNotes/ReleaseNotes-2.0.24.txt
deleted file mode 100644
index 7da1693..0000000
--- a/ReleaseNotes/ReleaseNotes-2.0.24.txt
+++ /dev/null
@@ -1,191 +0,0 @@
-= Release notes for Gerrit 2.0.24, 2.0.24.1, 2.0.24.2
-
-Gerrit 2.0.24 is now available in the usual location:
-
-link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]
-
-
-== Schema Change
-
-*WARNING: This version contains a schema change* (since 2.0.21)
-
-Apply the database specific schema script:
-----
-  java -jar gerrit.war --cat sql/upgrade018_019_postgres.sql | psql reviewdb
-  java -jar gerrit.war --cat sql/upgrade018_019_mysql.sql    | mysql reviewdb
-----
-
-
-== LDAP Change
-
-LDAP groups are now bound via their full distinguished name, and not
-by their common name.  Sites using LDAP groups will need to have the
-site administrator visit every LDAP backed group through the web UI
-(Admin > Groups), search for, and select the underlying LDAP group
-from the directory server.
-
-This change was made to remove some of the guesswork when it comes
-to setting up an LDAP enabled group, as well as to permit creating
-new LDAP enabled groups completely from the web UI.  It also removes
-an ambiguous case when different parts of the same directory space
-create identically named groups.
-
-
-== New Features
-* Check if the user has permission to upload changes
-+
-The new READ +2 permission is required to upload a change to a
-project, while READ +1 permits read but denies uploading a change.
-The schema upgrade script automatically converts READ +1 to +2.
-
-* Use LDAP DN to match LDAP group to Gerrit group
-* issue 297    Allow admins to search for and bind to LDAP groups
-+
-As noted above, LDAP groups now use the full DN to match to their
-Gerrit database counterpart, rather than just the common name.
-Administrators may now create Gerrit groups and attach them to
-any LDAP group, by performing a query on the LDAP directory for
-matching groups and selecting a result.
-
-* issue 301    Try to prevent forgotten `git add` during replace
-+
-Users are now stopped from performing a replace of a patch set if
-they have not made a meaningful change (modify a file, or modify
-the commit message).  If only the commit message was modified,
-a warning is printed, but the replace still occurs.
-
-* issue 126    Link to our issue tracker in the page footer
-+
-The footer now includes a link to the Gerrit project's issue
-tracker, so end-users can more easily report bugs or feature
-requests back to the developers.
-
-* issue 300    Support SMTP over SSL/TLS
-+
-Encrypted SMTP is now supported natively within Gerrit, see
-link:http://gerrit.googlecode.com/svn/documentation/2.0/config-gerrit.html#sendemail.smtpEncryption[sendemail.smtpEncryption]
-
-== Bug Fixes
-* issue 290    Fix invalid drop index in upgrade017_018_mysql
-+
-Minor syntax error in SQL script.
-
-* Fixed ActiveDirectory LDAP group support. Allows recu...
-* issue 307    Set proper LDAP defaults for Active Directory
-+
-ActiveDirectory is now better supported out of the box.  Defaults
-for the LDAP configuration settings are automatically guessed at
-startup based upon the type of server configured in ldap.server.
-Recursive groups (group which is a member of a group) is also
-now supported when using an ActiveDirectory server.  Other LDAP
-servers (e.g. OpenLDAP) probably don't support this.
-
-* "250-AUTH " will be returned if 'AUTH' response does ...
-* Fix: Authentication fail when authTypes is empty
-* Fix a typo that broke the gerrit build
-+
-Outgoing SMTP sometimes failed to authenticate against a
-SMTP server due to slightly incorrect handling of the AUTH
-advertisement.
-
-* Correct scp commands in documentation to include -p
-+
-Our documentation of how to copy the commit-msg hook down via
-scp did not include the -p option, which is necessary to make
-the client preserve the executable flag on the hook script.
-
-* issue 291    Suggest latin1 charset for MySQL databases
-+
-Documentation was updated to encourage using latin1 for MySQL
-as MySQL fails with key too long errors during schema creation
-when the database is using the UTF-8 character set.
-
-* issue 294    Fix OpenID self registration dialog
-+
-OpenID 'Register' hyperlink was broken due to the dialog having
-no content added to it before display.  This bug was fixed by
-using the proper OpenID login dialog.
-
-* issue 309    Clear message on publish comments screen after submit...
-+
-The publish comments button preserved your last comment, making
-it easy for a user to accidentally publish the same message on
-the same change twice.  The message is now cleared after it has
-been successfully sent.
-
-* issue 299    Remove the branches table from the database
-* Display current branch SHA-1 in Branches tab
-* issue 299    Display not-yet-born HEAD branch in Branches tab
-+
-The not-yet-born branch in an empty project is now shown in the
-Branches tab.  (This is based on the value of the HEAD symbolic
-reference within the project's Git repository.)
-The branches table was removed from the database.  We now fully
-rely upon the Git repository to determine which branches exist
-and thus permit changes to be uploaded to.
-
-* issue 296    Make help more friendly over SSH
-+
-`ssh -p 29418 localhost help` is now more user friendly.
-
-* Don't request registration if the account exists
-* issue 38     Fix OpenID delegate authentication
-+
-OpenID authentication was sometimes asking providers for
-registation data when we already had it on hand, fixed.
-OpenID delegate identities were being stored rather than claimed
-identities when the claimed identity is just a delegate to the
-delegate provider.  We now store both in the account.
-
-== Fixes in 2.0.24.1
-* Fix unused import in OpenIdServiceImpl
-* dev-readme: Fix formatting of initdb command
-+
-Minor documentation/code fixes with no impact on execution.
-
-* Fix LDAP account lookup when user not in group
-+
-Fixes a NullPointerException when a user is not in any group
-and the underlying LDAP server is ActiveDirectory.
-
-* issue 315    Correct sendemail.smtppass
-+
-Fixes sendemail configuration to use the documented smtppass
-variable and not the undocumented smtpuserpass variable.
-
-== Fixes in 2.0.24.2
-* Fix CreateSchema to create Administrators group
-* Fix CreateSchema to set type of Registered Users group
-* Default AccountGroup instances to type INTERNAL
-* Document the various AccountGroup.Type states better
-+
-CreateSchema was broken in 2.0.24 and 2.0.24.1 due to the default
-groups being misconfigured during insertion.  Fixed.
-
-* Grant anonymous uses READ +1, registered users READ +...
-+
-Default permissions were a bit confusing, there is no point in an
-anonymous user having READ +2.
-
-* Use the H2 database for unit tests
-* Unit test for SystemConfigProvider and CreateSchema
-+
-Added unit tests to validate CreateSchema works properly, so we
-don't have a repeat of breakage here.
-
-== Other Changes
-* Start 2.0.24 development
-* Merge change Ie16b8ca2
-* Switch to the new org.eclipse.jgit package
-* Allow default of $JETTY_HOME in to_jetty.sh
-* LdapRealm: Remove unused throws declaration
-* LdapRealm: Fix missing type parameter warnings
-* Remove dead exists method from AccountManager
-* Document ldap.groupPattern
-* AuthSMTPClient: Fix formatting errors
-* style fixup: remote trailing whitespace from our sour...
-* show-caches: Correct example output in documentation
-* Move server programs section under User Guide
-* Revert "Remove dead exists method from AccountManager"
-* Ensure prior commit body is parsed before comparing m...
-* Gerrit 2.0.24
\ No newline at end of file
diff --git a/ReleaseNotes/ReleaseNotes-2.0.3.txt b/ReleaseNotes/ReleaseNotes-2.0.3.txt
deleted file mode 100644
index d319b35..0000000
--- a/ReleaseNotes/ReleaseNotes-2.0.3.txt
+++ /dev/null
@@ -1,64 +0,0 @@
-= Release notes for Gerrit 2.0.3
-
-Gerrit 2.0.3 is now available in the usual location:
-
-link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]
-
-I would like to express a big thank you to Brad Larson for diving into
-Gerrit and coming up with the implementation for  "Add reviewer to an
-existing change".  This has been an open issue in the bug tracker for a
-while, and its finally closed thanks to his work.
-
-== New Features
-
-* GERRIT-37  Add additional reviewers to an existing change
-* Display old and new image line numbers in unified diff
-* Make 'c', 'r' in a patch view open a new comment editor
-* Allow up/down arrow keys to scroll the page in patch view
-* Use a Java applet to help users load public SSH keys
-
-== Bug Fixes
-
-* GERRIT-72  Make review comments standout more from the surrounding text
-* GERRIT-7   Restart the merge queue when Gerrit starts up
-* Fix message threading for comment replies
-* Fix unified diff view to support creating a comment
-* Fix line numbers for new post-image comments in unified diff
-* Don't store SSH keys we know to be invalid
-* Bust out of an iframe if Gerrit is embedded in one
-+
-The last item is a security fix.  It prevents Gerrit from being loaded
-inside of an iframe, which is a potential security flaw if some evil outer
-page used CSS tricks to show only a portion of a particular part of the
-Gerrit UI.  Such a display might be able to convince a user they are
-clicking on one thing, while doing something else entirely.
-
-== Other Changes
-
-* Restore -SNAPSHOT suffix after 2.0.2
-* Add a document describing Gerrit's high level design
-* Rename the gerrit artifact to be gerrit-$version.war
-* Ensure our SSHD always disables compression
-* Make the magic refs/heads/ constant available in GWT
-* Move Account to PersonIdent code to ChangeUtil for reuse
-* GERRIT-20  Add a Branches tab to the project admin screen
-* Add a link to our project homepage in the documentation
-* Add documentation on all of the software licenses
-* Add a link to the Android Open Source Project workflow a...
-* Fix a minor language typo in project setup documentation
-* Abstract the account name hint into AddMemberBox
-* Fix vertical-align: center to be middle
-* Fixed some minor documentation typos
-* Actually return failure to clients if new change creatio...
-* Log any failures while creating patch set refs
-* Update approvals table when adding reviewer.
-* Include "a=commit" in direct gitweb commit links
-* Add a loading message, link to the project, before the U...
-* Fix detach assertion error caused by loading messing bei...
-* Allow callers of AddMemberBox to control the button text
-* Cleanup the ApprovalTable formatting for adding a review...
-* Display the text "invalid key" instead of a red X icon i...
-* Add a clear button to make it easier to replace the key
-* Make Gerrit.getVersion public for other code to use
-* Allow embedded applets to be cached indefinitely by prox...
-* gerrit 2.0.3
\ No newline at end of file
diff --git a/ReleaseNotes/ReleaseNotes-2.0.4.txt b/ReleaseNotes/ReleaseNotes-2.0.4.txt
deleted file mode 100644
index 0b10756..0000000
--- a/ReleaseNotes/ReleaseNotes-2.0.4.txt
+++ /dev/null
@@ -1,48 +0,0 @@
-= Release notes for Gerrit 2.0.4
-
-Gerrit 2.0.4 is now available in the usual location:
-
-link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]
-
-*WARNING: This version contains a schema change.*
-
-Simple version of the schema upgrade:
-
-  java -jar gerrit.war --cat sql/upgrade004_005_part1.sql | psql reviewdb
-
-If you aren't collecting the contact information fields on individual
-user accounts (the accounts columns contact_address, contact_country,
-contact_phone_nbr, contact_fax_nbr) then you can safely apply both the
-part1 and part2 upgrades without further thought.
-
-  java -jar gerrit.war --cat sql/upgrade004_005_part2.sql | psql reviewdb
-
-After this upgrade, the contact fields under My > Settings > Contact
-Information will be hidden.
-
-A much longer upgrade process is explained in the documentation if you
-need to store the contact data.
-
-* http://gerrit.googlecode.com/svn/documentation/2.0/config-contact.html
-* http://gerrit.googlecode.com/svn/documentation/2.0/config-contact.html#upgrade_203
-+
-This horribly painful change was necessary to better protect
-individual user's privacy by strongly encrypting their contact
-information, and storing it "off site".
-
-== Other Changes
-* Change to 2.0.3-SNAPSHOT
-* Correct grammar in the patch conflict messages
-* Document how to create branches through SSH and web
-* Add how/why we call Gerrit Gerrit to the background sect...
-* Don't bother logging IO errors caused by disappearing cl...
-* Remove old entries from our feature roadmap
-* Add a link to our issue tracker to the feature roadmap
-* Add documentation on the access control lists and rights
-* Escape single quotes when escaping text for HTML inclusi...
-* Document that install was tested with Jetty 6.1.14 and l...
-* Add a note about CA Siteminder long headers and Jetty
-* Make sure the WorkQueue terminates when running command ...
-* Move all contact information out of database to encrypte...
-* Peg the versions of JGit and MINA SSHD to something known
-* gerrit 2.0.4
\ No newline at end of file
diff --git a/ReleaseNotes/ReleaseNotes-2.0.5.txt b/ReleaseNotes/ReleaseNotes-2.0.5.txt
deleted file mode 100644
index 8006e12..0000000
--- a/ReleaseNotes/ReleaseNotes-2.0.5.txt
+++ /dev/null
@@ -1,69 +0,0 @@
-= Release notes for Gerrit 2.0.5
-
-Gerrit 2.0.5 is now available in the usual location:
-
-link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]
-
-WARNING: This version contains a schema change.
-
-Schema upgrade:
-
- java -jar gerrit.war --cat sql/upgrade005_006.sql | psql reviewdb
-
-If you use an OpenID authentication provider, you may want to review the new trusted providers functionality added by this release.  See the OpenID section in the SSO documentation for more details:
-
-link:http://gerrit.googlecode.com/svn/documentation/2.0/config-sso.html[http://gerrit.googlecode.com/svn/documentation/2.0/config-sso.html]
-
-== New Features
-
-* GERRIT-62  Work around IE6's inability to set innerHTML on a tbody ...
-* GERRIT-62  Upgrade to gwtjsonrpc 1.0.2 for ie6 support
-+
-These add (crude) support for Microsoft Internet Explorer 6 and 7.
-
-* Allow users to delete OpenID identities no longer used
-* Show the trust status of a user's identities
-* Allow effective permissions only for trusted OpenID prov...
-+
-These features allow a site to lock down access to only a trusted OpenID provider.  review.source.android.com uses this to give out approval access only to users who have registered with the site's trusted OpenID provider, Google Accounts.
-
-* Add clippy.swf to support copying download commands to t...
-* Display the clippy button for the permalink of a change
-* Allow clicking on a copyable text to switch label to inp...
-+
-These features make it easier to copy patch download commands.
-
-== Bug Fixes
-
-* GERRIT-79  Error out with more useful message on "push :refs/change...
-* Invalidate all SSH keys when otherwise flushing all cach...
-
-== Other Changes
-
-* Set version 2.0.4-SNAPSHOT
-* Correct note in developer setup about building SSHD
-* Change the order of links in developer setup
-* Document how to enable SSL with Jetty and Apache2
-* Ignore errors when current row no longer exists in a tab...
-* Show the Web Identities panel when on HTTP authentication
-* Relabel the "Web Identities" tab as just "Identities
-* Use an &nbsp; when showing an empty cell in the identity...
-* Simplify the Gerrit install from source procedure to avoi...
-* Support -DgwtStyle=DETAILED to support browser debugging
-* Don't link to JIRA in our docs, link to our issues page
-* Use &nbsp; in the identities table email column when emp...
-* Fix GWT Mac OS X launcher to include all sources
-* Catch any unexpected exceptions while closing a replicat...
-* Fix indentation in UserAgent.gwt.xml
-* Only load the flash clippy button if flash plugin is ava...
-* Fix border in the info block on the settings page
-* Reuse code that was moved to gwtexpui
-* Rename our CSS to encourage caching
-* Add gwtexpui to our license list
-* Fix account settings screen by correcting row offset
-* Replace DomUtil with SafeHtmlBuilder
-* Mention the OpenID provider restriction feature in our d...
-* Mention the contact information encryption in our design...
-* Switch to gwtexpui's iframe busting code
-* Use gwtexpui 1.0
-* gerrit 2.0.5
\ No newline at end of file
diff --git a/ReleaseNotes/ReleaseNotes-2.0.6.txt b/ReleaseNotes/ReleaseNotes-2.0.6.txt
deleted file mode 100644
index 1e28da8..0000000
--- a/ReleaseNotes/ReleaseNotes-2.0.6.txt
+++ /dev/null
@@ -1,36 +0,0 @@
-= Release notes for Gerrit 2.0.6
-
-Gerrit 2.0.6 is now available in the usual location:
-
-link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]
-
-== New Features
-
-* GERRIT-41  Add support for abandoning a dead change
-+
-Everyone cheer for Brad Larson for providing this!
-
-* Bold substrings which match query when showing completi...
-
-== Bug Fixes
-
-* GERRIT-43  Work around Safari 3.2.1 OpenID login problems
-* GERRIT-43  Suggest boosting the headerBufferSize when deploying un...
-* GERRIT-94  Only show the progress meter if we haven't reset the ta...
-* GERRIT-94  Defer showing the patch set table until it is fully bui...
-* GERRIT-76  Upgrade to JGit 0.4.0-209-g9c26a41
-* Ensure branches modified through web UI replicate
-
-== Other Changes
-
-* Start 2.0.6 development
-* Generate the id for the iframe used during OpenID login
-* Fix formatting after method rename caused longer lines
-* Change copyright messages in file headers to AOSP
-* Add missing copyright notice headers to Java sources
-* Support running the SSH daemon from the command line
-* Ignore GerritServer.properties at the top level
-* Fix gerrit_macos.launch to make Eclipse happy
-* Merge
-* Merge
-* Gerrit 2.0.6
\ No newline at end of file
diff --git a/ReleaseNotes/ReleaseNotes-2.0.7.txt b/ReleaseNotes/ReleaseNotes-2.0.7.txt
deleted file mode 100644
index d1bc38f..0000000
--- a/ReleaseNotes/ReleaseNotes-2.0.7.txt
+++ /dev/null
@@ -1,48 +0,0 @@
-= Release notes for Gerrit 2.0.7
-
-Gerrit 2.0.7 is now available in the usual location:
-
-link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]
-
-Of note is the WAR file doubled in size.  This is due to the switch to openid4java for the OpenID relying party implementation, as it is more compliant to the OpenID 2.0 draft standard than the prior relying party, dyuproject.
-
-Installation of openid4java may require installing Xalan/Xerces from the WAR into your application container's secure classes directory or something equally obtuse.  Under stock Jetty it still works fine to just drop the WAR in.  If you aren't using Jetty and are using OpenID authentication, be warned, the upgrade may be a bit harder than just dropping the WAR in due to Xalan/Xerces issues.
-
-Gerrit is still Apache 2/MIT/BSD licensed, despite the switch of a dependency.
-
-== New Features
-
-* GERRIT-103  Display our server host keys for the client to copy an...
-+
-For the paranoid user, they can check the key fingerprint, or even copy the complete host key line for ~/.ssh/known_hosts, directly from Settings > SSH Keys.
-
-== Bug Fixes
-
-* GERRIT-98   Require that a change be open in order to abandon it
-* GERRIT-101  Switch OpenID relying party to openid4java
-* GERRIT-102  Never place an OpenID provider into an iframe
-+
-These are fixes suggested by the OpenID team at Google, or by the security team at Google.
-
-* Use a TOPO sort when processing commits in the merge q...
-* Upgrade JGit to 0.4.0-236-gcb63365
-+
-The upgrade of JGit should resolves issues relating to not being able to upload a merge commit change for review when merging in an upstream change that is already available under another tracking branch.  Multiple groups have reported this problem late last week.
-
-* Fix a NullPointerException in OpenIdServiceImpl on res...
-
-== Other Changes
-* Start 2.0.7 development
-* Upgrade JGit to 0.4.0-212-g9057f1b
-* Make the sign in dialog a bit taller to avoid clipping...
-* Define our own version of a URL encoding helper
-* Refactor the openid_identifier field name to be a cons...
-* GERRIT-102  Simplify the OpenID login code now that the iframe is ...
-* Sort request parameters during OpenID response handling
-* Shorten our OpenID return_to URL by removing unnecessa...
-* Honor the "Remember Me" checkbox when it comes to cook...
-* Remove the now dead SetCookie.html page
-* Don't ask for registration information on existing acc...
-* Disable spell checking on the SSH key add text area
-* Hide the SSH key add field if we already have keys reg...
-* gerrit 2.0.7
\ No newline at end of file
diff --git a/ReleaseNotes/ReleaseNotes-2.0.8.txt b/ReleaseNotes/ReleaseNotes-2.0.8.txt
deleted file mode 100644
index 89e7fdd..0000000
--- a/ReleaseNotes/ReleaseNotes-2.0.8.txt
+++ /dev/null
@@ -1,45 +0,0 @@
-= Release notes for Gerrit 2.0.8
-
-Gerrit 2.0.8 is now available in the usual location:
-
-link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]
-
-*WARNING: This version contains a schema change.*
-
-Schema upgrade:
-
-  java -jar gerrit.war --cat sql/upgrade006_007.sql | psql reviewdb
-
-This version has some major bug fixes for JGit.  I strongly encourage people to upgrade, we had a number of JGit bugs identified last week, all of them should be fixed in this release.
-
-
-== New Features
-* Allow users to subscribe to submitted change events
-+
-Someone asked me on an IRC channel to have Gerrit send emails when changes are actually merged into a project.  This is what triggered the schema change; there is a new checkbox on the Watched Projects list under Settings to subscribe to these email notifications.
-
-* BCC any user who has starred a change when sending rela...
-+
-A nice idea.  If the user starred the change, keep them informed on all emails related to that change, even if they aren't otherwise watching that project.
-
-* GERRIT-33  Quote the line a comment applies to when sending commen...
-+
-A long standing "bug"/feature request.  I had a small chunk of time I didn't know what else to do with on Friday... it was too small for most items on the open list, so this got done instead.
-
-* Record the remote host name in the reflogs
-* Record the starting revision expression used when makin...
-+
-The reflogs now contain the remote user's IP address when Gerrit makes edits, resulting in slightly more detail than was there before.
-
-== Bug Fixes
-* Make sure only valid ObjectIds can be passed into git d...
-* GERRIT-92  Upgrade JGit to 0.4.0-262-g3c268c8
-+
-The JGit bug fixes are rather major.  I would strongly encourage upgrading.
-
-== Other Changes
-* Start 2.0.8 development
-* Upgrade MINA SSHD to SVN trunk 755651
-* Fix a minor whitespace error in ChangeMail
-* Refactor patch parsing support to be usable outside of ...
-* Gerrit 2.0.8
\ No newline at end of file
diff --git a/ReleaseNotes/ReleaseNotes-2.0.9.txt b/ReleaseNotes/ReleaseNotes-2.0.9.txt
deleted file mode 100644
index 1f683cf..0000000
--- a/ReleaseNotes/ReleaseNotes-2.0.9.txt
+++ /dev/null
@@ -1,63 +0,0 @@
-= Release notes for Gerrit 2.0.9
-
-Gerrit 2.0.9 is now available in the usual location:
-
-link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]
-
-*WARNING: This version contains schema changes.*
-
-Schema upgrades:
-----
-  java -jar gerrit.war --cat sql/upgrade007_008.sql | psql reviewdb
-  java -jar gerrit.war --cat sql/upgrade008_009.sql | psql reviewdb
-----
-
-If one or more of your projects are using the undocumented `gerrit.fastforwardonly` configuration option, you should import that setting into the database:
-----
-  java -DGerritServer=GerritServer.properties -jar gerrit.war ImportProjectSubmitTypes
-----
-
-The SQL statement to insert a new project into the database has been changed.  Please see [http://gerrit.googlecode.com/svn/documentation/2.0/project-setup.html Project Setup] for the modified statement.
-
-== New Features
-* GERRIT-69   Make the merge commit message more detailed when mergi...
-* Show the user's starred/not-starred icon in the change...
-* Modify Push Annotated Tag to require signed tags, or r...
-* GERRIT-77   Record who submitted a change in the change message
-+
-
-* Support different project level merge policies
-* GERRIT-111  Support cherry-picking changes instead of merging them
-+
-These last two changes move the hidden gerrit.fastforwardonly feature to the database and the user interface, so project owners can make use of it (or not).  Please see the new 'Change Submit Action' section in the user documentation:
-link:http://gerrit.googlecode.com/svn/documentation/2.0/project-setup.html[http://gerrit.googlecode.com/svn/documentation/2.0/project-setup.html]
-
-== Bug Fixes
-* Work around focus bugs in WebKit based browsers
-* Include our license list in the WAR file
-* Whack any prior submit approvals by myself when replac...
-* GERRIT-35   Handle unwrapped commit message more gracefully
-* GERRIT-85   ie6: Correct rendering of commit messages
-* GERRIT-89   ie6: Fix date line wrapping in messages
-
-== Other Changes
-* Start 2.0.9 development
-* Always show the commit SHA-1 next to the patch set hea...
-* Silence more non-critical log messages from openid4java
-* Fix default READ access on new database initialization
-* Don't permit project rights to be created backwards
-* Don't permit project rights to be created backwards (p...
-* Select better defaults for min/max access rights when ...
-* Show the + or - numeric level when adding a new ACL en...
-* Fix odd formatting errors in MergeOp.java
-* Fix tab formatting in pom.xml
-* Require the submitter approval to be > 0 to claim it i...
-* Fix the copyright header in pom.xml to be AOSP
-* Add some missing copyright headers
-* Remove Gerrit 1.x to 2.x import tools
-* Upgrade JGit to 0.4.0-272-g7322ea2
-* Upgrade gwtexpui to 1.0.2
-* Attach submitter identity to change messages about suc...
-* Automatically generate unique names for our CSS code
-* Cache `*`.nocache.js and don't cache the host page
-* gerrit 2.0.9
\ No newline at end of file
diff --git a/ReleaseNotes/ReleaseNotes-2.1.1.txt b/ReleaseNotes/ReleaseNotes-2.1.1.txt
deleted file mode 100644
index 38b6caf..0000000
--- a/ReleaseNotes/ReleaseNotes-2.1.1.txt
+++ /dev/null
@@ -1,205 +0,0 @@
-= Release notes for Gerrit 2.1.1, 2.1.1.1
-
-Gerrit 2.1.1.1 is now available in the usual location:
-
-link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]
-
-== Schema Change
-
-*WARNING* This release contains a schema change.  To upgrade:
-----
-  java -jar gerrit.war init -d site_path
-----
-
-== Patch 2.1.1.1
-
-* Update MINA SSHD to SVN 897374
-+
-A deadlock was recently discovered in the SSHD, causing an
-IoProcessor thread to freeze and stop servicing clients.  This
-manifests itself as spotty SSH service; sometimes a connection
-works, sometimes it hangs and never executes the command.  Fixed.
-
-* issue 376    Fix deletion of comments on publish comments screen
-+
-Discarding a comment from the publish comments screen caused
-a ConcurrentModificationException.  Fixed.
-
-== New Features
-
-* issue 322    Update to GWT 2.0.0
-+
-JavaScript code generation is now based upon GWT 2.0, which
-is the latest stable release available.  One benefit of this
-is the initial JavaScript download is smaller, by omitting
-less-frequently used sections of the UI like the admin screens
-or user preferences.
-
-* Support creating new users in `DEVELOPMENT_BECOME_ANY_`...
-+
-Developers can now create new users (to facilitate testing
-scenarios) through the /become URL, rather than manually
-inserting account records or switching over to OpenID/LDAP.
-
-* issue 371    Make gitweb url links customizable, add support for c...
-+
-The linkage to gitweb is now more configurable, and we also
-support linking to cgit, a popular C based alternative to the
-Perl based gitweb.cgi.
-
-* Log SSH activity to $site_path/logs/sshd_log
-+
-SSH authentication failures and commands are now logged, including
-execution times, so administrators can monitor server activity.
-The log file is local to the server running the daemon process,
-and came about to help replace the lastUsedOn columns which were
-dropped from the database (see below).
-
-* Drop the lastUsedOn from AccountSshKeys, AccountExternalIds
-* Implement automatic schema upgrading
-+
-The lastUsedOn column is no longer updated in the database,
-and was actually removed by a schema upgrade in this release.
-
-* issue 162    Record submitters as the author of a merge commit
-+
-Merge commits created by Gerrit during change submission now
-use the submitter's identity as the author identity, and generic
-Gerrit user identity as the committer identity.
-
-* issue 162    Summarize single change merges with short description
-+
-The short description of a merge commit including exactly
-one change into the branch now includes that change's short
-description, making the log easier to read.
-
-* Reload GerritSiteHeader, GerritSiteFooter, GerritSite...
-+
-The site header/footer files are reloaded on the fly if they are
-modified, allowing the administrator to abuse the header for a
-"message of the day" feature, if desired.
-
-* Reduce the size (and cost) of the host page
-* Use server side permutation selection
-* Allow ?s=0 to disable server side permutation
-+
-The host page was compacted slightly, and the CPU time used on
-the server to send it to a client was reduced by reusing as much
-work as possible between sessions.
-Additionally, the host page now selects the correct JavaScript
-based on the User-Agent HTTP header, removing one HTTP round
-trip during initial page load, and saving ~5 KiB of transfer.
-
-* Make hyperlinks update URL when screen is visible
-+
-The address bar now only updates when the corresponding content
-is actually visible.  This matches the behavior used within
-other AJAX applications like Gmail.
-
-* Use a glass pane behind our dialogs, make most modal
-+
-Error dialogs are now more noticeable, and less easily dismissed
-by an accidental click.  This is especially useful when there
-is a merge error during submit.
-
-== Bug Fixes
-
-* issue 359    Allow updates of commits where only the parent changes
-+
-Commit replacements were sometimes rejected when the only thing
-that changed as the parent pointer, e.g. rebasing a change because
-the parent's commit message was modified to correct a typo.
-We now allow these replacements, with a warning to the console.
-
-* gsql: Fix \d table missing first column
-+
-The gsql tool skipped the first column of any table, e.g. when
-showing "\d accounts" the registered_on column wasn't displayed.
-
-* Default to the en locale
-* Limit permutations to only the en locale
-+
-The WAR file shrank because we deleted a large chunk of JavaScript
-which was never used.  GWT created this code in case the browser
-didn't get forced into the 'en' locale, but we always force it to
-use the 'en' locale because the top of our HTML page demands it.
-
-* issue 364    Fix SchemaCreatorTest to work when localized errors a...
-+
-This test failed when the JVM's default locale wasn't en_US, as it
-was testing a translated string against an English expected value.
-
-* issue 365    Skip CommitMsgHookTest on Win32
-+
-This test failed on Windows platforms, where there is no shell
-or perl available from a native Win32 application like the JVM.
-For now, we skip the test.
-
-* issue 369    Add missing repositories to build search path
-+
-The out-of-the-box build of Gerrit's own source code didn't work,
-due to missing Maven repository URLs in our pom.xml.  I never
-noticed the failure because my local repository already had the
-required JARs present.
-
-* Fix MSIE 8 compatibility
-+
-Releases between 2.0.18 and 2.1.1 have not supported MSIE 8,
-due to a broken GWT upgrade.  Fixed.
-
-* Ensure gitweb.cgi pipes are closed
-+
-Exceptions may have allowed our internal gitweb CGI invocations
-to leak file descriptors, as pipes to the external CGI were not
-always closed.  Fixed.
-
-== Other
-* Switch to ClientBundle
-* Update to gwtexpui-1.2.0-SNAPSHOT
-* Merge branch 'master' into gwt-2.0
-* Use gwt-maven's -Dgwt.style rather than our own
-* Don't build the "Story of Your Compile" report by def...
-* Drop the com.google.gerrit.httpd.auth.become system p...
-* Move all of our CSS rules into our CssResource
-* Start splitting our code to reduce initial download
-* Defer our large JavaScript parsing until later
-* Move prettify to be loaded as part of our patch split...
-* issue 363    Update Google Code Prettify to 3-Dec-2009
-* Start next release development
-* Merge branch 'gwt-2.0'
-* documentation: Remove Eclipse user library
-* Fix disclosure panel CSS
-* Simplify pretty printer loading
-* Fix formatting of whitespace errors
-* Correct URL to apache license in CSS headers
-* Restore the CSS linker for GWT's stylesheet
-* documentation: Correct calculation of QPS
-* Consolidate windows platform tests to a single class
-* documentation: Correct other calculations of QPS
-* issue 370    Revert "Defer our large JavaScript parsing until late...
-* Merge change If238e2bd
-* Remove unnecessary /login/`*` URLs when auth.type = LDAP
-* Stop using AccountExternalId lastUsedOn for most rece...
-* Revert "Remove unnecessary /login/* URLs when auth.ty...
-* Document why LoginRedirectServlet is required
-* Cleanup Maven build by pushing component dependencies...
-* Cleanup Maven build by using common plugin management
-* Fix package-before-copyright in GerritLauncher
-* Fix unified patch view
-* Fix background of RPC loading status message
-* Use @def for common CSS definitions
-* Correct comment panel border styles
-* Improve keyapplet referencing
-* Remove the duplicate Version class
-* Be specific about the Maven plugin groupId
-* Fix automatic formatting in SshPanel
-* Remove unnecessary compile scope tags
-* Disable unnecessary class operations
-* Use the full name 'Gerrit Code Review' in sign-in dia...
-* init: Defer all prune executions until upgrade cycle ...
-* Fix automatic formatting in LdapRealm
-* Update gwtorm, gwtjsonrpc, gwtexpui
-* Push Command.destroy down through DispatchCommand red...
-* Quote usernames in the sshd_log if necessary
-* Document why ReplicationUser doesn't use registered g...
-* Configure the gwtorm KeyUtil.Encoder during module lo...
\ No newline at end of file
diff --git a/ReleaseNotes/ReleaseNotes-2.1.10.txt b/ReleaseNotes/ReleaseNotes-2.1.10.txt
deleted file mode 100644
index 5c5bcc6..0000000
--- a/ReleaseNotes/ReleaseNotes-2.1.10.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-= Release notes for Gerrit 2.1.10
-
-There are no schema changes from link:ReleaseNotes-2.1.9.html[2.1.9].
-
-link:https://www.gerritcodereview.com/download/gerrit-2.1.10.war[https://www.gerritcodereview.com/download/gerrit-2.1.10.war]
-
-== Bug Fixes
-* Fix clone for modern Git clients
-+
-The security fix in 2.1.9 broke clone for recent Git clients,
-throwing an ArrayIndexOutOfBoundsException. Fixed.
diff --git a/ReleaseNotes/ReleaseNotes-2.1.2.1.txt b/ReleaseNotes/ReleaseNotes-2.1.2.1.txt
deleted file mode 100644
index b181fee..0000000
--- a/ReleaseNotes/ReleaseNotes-2.1.2.1.txt
+++ /dev/null
@@ -1,45 +0,0 @@
-= Release notes for Gerrit 2.1.2.1
-
-Gerrit 2.1.2.1 is now available in the usual location:
-
-link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]
-
-== Bug Fixes
-
-* Include smart http:// URLs in gitweb
-+
-The managed gitweb configuration file didn't know about our smart
-http URLs, so it didn't advertise them for projects to clone by.
-Fixed.
-
-* issue 493 documentation: Document the internal gitweb
-* issue 496 documentation: Explain etc/gitweb_config.perl
-+
-The documentation on configuring gitweb didn't talk about our own
-managed support, where we can write the gitweb configuration file
-based on our own settings, and run the CGI directly from within
-our servlet container.  Its an older feature that we have had for
-a while now.  Fixed.
-
-* issue 494 Look for gitweb in /usr/share/gitweb
-* issue 495 Fix gitweb CGI when in subdirectory
-+
-The CGI didn't always load its supporting assets like CSS and icon
-from the right URLs.  Fixed.
-
-* Move generated gitweb_config.perl to hidden tmp directory
-+
-The generated gitweb configuration file was written to /tmp,
-which might cause it to be deleted every 7 days on some Linux
-distributions.  Moved to our private application temporary directory,
-which is usually under $HOME/.gerritcodereview/tmp.
-
-* Update documentation regarding tag deletion
-+
-The documentation incorrectly described tag deletion.  Fixed.
-
-* Allow schema upgrades to display messages
-+
-On MySQL servers, schema upgrades from older versions failed if the
-administrator didn't create the nextval functions for administrative
-purposes.  Fixed by making this a warning and not a hard-stop.
diff --git a/ReleaseNotes/ReleaseNotes-2.1.2.2.txt b/ReleaseNotes/ReleaseNotes-2.1.2.2.txt
deleted file mode 100644
index 305e3e1..0000000
--- a/ReleaseNotes/ReleaseNotes-2.1.2.2.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-= Release notes for Gerrit 2.1.2.2
-
-Gerrit 2.1.2.2 is now available in the usual location:
-
-link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]
-
-== Bug Fixes
-
-* Add ',' to be encoded in email headers.
-+
-Email headers which used UTF-8 character set encoding did not
-properly escape a comma.  Fixed.
-
-* issue 513 Log OpenID SSL failures
-+
-If OpenID authentication fails, such as due to the JRE not having
-access to any of the root certificates and therefore being unable
-to open an https connection, the problem is now logged to the
-server's error_log.
diff --git a/ReleaseNotes/ReleaseNotes-2.1.2.3.txt b/ReleaseNotes/ReleaseNotes-2.1.2.3.txt
deleted file mode 100644
index f81092c..0000000
--- a/ReleaseNotes/ReleaseNotes-2.1.2.3.txt
+++ /dev/null
@@ -1,80 +0,0 @@
-= Release notes for Gerrit 2.1.2.3
-
-Gerrit 2.1.2.3 is now available in the usual location:
-
-link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]
-
-== Bug Fixes
-
-* issue 528 gsql: Fix escaping of quotes in JSON
-+
-JSON output was not properly escaped, due to a bug in the underlying
-Gson library.  Fixed by upgrading.
-
-* issue 531 commit-msg: Fix jumbling of URL at end of message
-+
-URLs at the end of a commit message sometimes caused the Change-Id
-to be inserted above the URL, rather than below it.  Fixed, but
-users will need to recopy the hook to their local repositories.
-
-* issue 538 create-project: Don't destroy description of repository
-+
-If the repository `foo` existed without the standard `.git` suffix,
-executing `gerrit create-project -n foo` trashed the description
-file that existed in `foo`, while also creating a useless sibling
-directory called `foo.git`.  Fixed by detecting the existing `foo`
-during create-project and refusing to continue.
-
-* issue 521 Use OpenID PAPE extension to force reauthentication
-+
-The new configuration parameter auth.maxOpenIdSessionAge is now
-sent as part of OpenID authentication requests, encouraging the
-provider to verify the user's password.
-
-* issue 507 Enter on auto-complete causes application error
-+
-Pressing enter while the auto-complete box was open inside of
-the project watch panel or the project rights panel caused an
-application error.  Fixed.
-
-* Advertise our relying party XRDS document
-+
-The OpenID 2.0 specification requests relying parties to document
-themselves, so the provider can verify the request is authentic
-for this domain.  Document Gerrit's requests in the standard XRDS
-format, and advertise it properly.  This hides warnings during the
-Yahoo! provider's login process.
-
-* Don't allow OWN to be inherited from All Projects
-+
-The project Owner permission was accidentally inherited from the
-magical All Projects in certain cases.  This was not meant to happen,
-ownership cannot be inherited down.  Fortunately we didn't permit
-the Owner permission to be added to All Projects, so this was not
-likely to have occurred in real installations.
-
-* Traverse all LDAP groups that a user is member of
-* Expand LDAP groups only if accountMemberField set
-+
-Fixes traversal of groups on an Active Directory server, ensuring
-that the user's grandparent groups are available to Gerrit as part
-of their user session.
-
-* Serve gitweb.js when serving gitweb.cgi
-+
-Recent versions of gitweb have a JavaScript asset which provides
-additional features.  Make sure that is served to browsers, in
-addition to the CSS and logo image.
-
-* Allow gitweb assets to be cached by browser
-+
-Browsers were always loading the gitweb assets on each request,
-as no caching data was made available to them.  Now assets are
-cached for up to 5 minutes, and 304 Not Modified replies can be
-sent when the assets haven't changed.
-
-* Define a toString for PatchListKey to improve errors
-+
-Minor bug fix to improve the level of detail that is available when
-the server is unable to difference two patch sets on demand for a
-user request.
diff --git a/ReleaseNotes/ReleaseNotes-2.1.2.4.txt b/ReleaseNotes/ReleaseNotes-2.1.2.4.txt
deleted file mode 100644
index 45fcb40..0000000
--- a/ReleaseNotes/ReleaseNotes-2.1.2.4.txt
+++ /dev/null
@@ -1,55 +0,0 @@
-= Release notes for Gerrit 2.1.2.4
-
-Gerrit 2.1.2.4 is now available in the usual location:
-
-link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]
-
-== New Features
-
-* Add 'checkout' download command to patch sets
-+
-The Download area of a patch set now offers a command line to fetch
-and checkout the patch set on a detached HEAD.  This is more suitable
-for building and testing the change locally.
-
-== Bug Fixes
-
-* issue 545 Fallback to ISO-8859-1 if charset isn't supported
-+
-Some input files are misrecognized by the jchardet library that is
-used to automatically guess a character set.  A guessed charset
-might not even be supported by the local JRE.  In such cases the
-ISO-8859-1 character set is used as a fallback, so the file content
-is still visible.
-
-* issue 553 Bugs sometimes added as change reviewers
-+
-Bug references were sometimes added as an 'Anonymous Coward' change
-reviewer when the line used to mention the bug in the commit message
-was the same length as 'Signed-off-by'.  Fixed.
-
-* Update JGit to 0.7.1.46-gdd63f5c to fix empty tree bug
-+
-Repositories which contained an empty tree object (very uncommon, its
-technically a bug to produce a repository like this) wouldn't clone
-properly from the embedded Gerrit SSH or HTTP daemon.  Fixed upstream
-in JGit 0.7.0, but we never picked up the bug fix release.
-
-* Allow LDAP to unset the user name
-+
-If the user name is configured to be set only by the LDAP directory,
-and an account has a user name, but the name is no longer present
-in the directory, Gerrit crashed during sign-in while trying to
-clear out the user name.  Fixed.
-
-=== Documentation Corrections
-
-* documentation: Elaborate on branch level Owner
-+
-Documentation didn't describe that the Owner permission within a
-project can be used to delegate control over a branch namespace to
-another group.
-
-* documentation: Document Read Access +2 aka Upload Access
-+
-The documentation didn't describe what Read +2 means.
diff --git a/ReleaseNotes/ReleaseNotes-2.1.2.5.txt b/ReleaseNotes/ReleaseNotes-2.1.2.5.txt
deleted file mode 100644
index eece1e7..0000000
--- a/ReleaseNotes/ReleaseNotes-2.1.2.5.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-= Release notes for Gerrit 2.1.2.5
-
-Gerrit 2.1.2.5 is now available in the usual location:
-
-link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]
-
-== Bug Fixes
-
-* issue 390 Resolve objects going missing
-+
-Clients disconnecting from the SSH server sometimes caused an
-interrupt to be delivered to their corresponding server work thread.
-That interrupt delivered at the wrong time caused a file to be
-closed unexpectedly, resulting in JGit marking the file as invalid
-and thereby losing access to its contents.  Fixed by serializing
-access to the file.
-
-* ps: Fix implementation to alias to gerrit show-queue
-+
-The SSH command `ps` was meant to be an alias for `gerrit show-queue`
-but due to a copy-and-paste error was actually an alias for a
-different command.  Fixed.
diff --git a/ReleaseNotes/ReleaseNotes-2.1.2.txt b/ReleaseNotes/ReleaseNotes-2.1.2.txt
deleted file mode 100644
index 8e7cd5c..0000000
--- a/ReleaseNotes/ReleaseNotes-2.1.2.txt
+++ /dev/null
@@ -1,708 +0,0 @@
-= Release notes for Gerrit 2.1.2
-
-Gerrit 2.1.2 is now available in the usual location:
-
-link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]
-
-== Schema Change
-
-*WARNING* This release contains multiple schema changes.  To upgrade:
-----
-  java -jar gerrit.war init -d site_path
-----
-
-
-== Breakages
-
-* issue 421 Force validation of the author and committer lines
-+
-The author line must now match the authenticated user when uploading a
-change, and both author and committer must match when pushing directly
-into a branch with the Push Branch permission.  This is a new
-restriction that did not exist in prior versions and was necessary to
-close a hole that permitted users to completely forge commits if they
-had Push Branch +1 granted.
-+
-Project owners may grant the new Forge Identity permission to permit a
-user group to forge the author and/or committer lines in commit
-objects they are pushing for review, or directly into a branch.  To
-match prior behavior grant Forge Identity +1 where Read +2 (Upload)
-exists, and Forge Identity +2 where Push Branch >= +1 exists.
-
-
-== New Features
-
-=== UI - Diff Viewer
-
-* issue 169 Highlight line-level (aka word) differences in files
-+
-Differences within a replaced line are now highlighted with a
-brighter red or green background color.  Some heuristics are
-applied to identify and highlight reindented blocks in popular
-C/C++/Java/C#-like and Python-like languages.  The highlighting
-algorithm is still simple and could benefit from more fine-tuning,
-as its largely driven by a simple Myers O(ND) character difference
-over the replaced lines.
-+
-The configuration variable cache.diff.intraline can be used to
-disable this feature site-wide, if it causes problems.
-
-* Improve side-by-side viewer look-and-feel
-+
-The look-and-feel of the side-by-side viewer (and also of the unified
-viewer) has been significantly improved in this release.  Coloring of
-regions is more consistently applied, reducing reader distraction.
-Comment boxes use a cleaner display, and take up less space per line.
-
-* Adjustable patch display settings
-+
-Users can now set the tab size or number of columns when displaying a
-patch.  Toggles are also available to enable or disable syntax
-coloring, intraline differences, whitespace errors, and visible tabs.
-
-* issue 416 Add download links to side-by-side viewer
-+
-The side-by-side viewer now offers links to download the complete file
-of either the left or right side.  To protect the users from malicious
-cross-site scripting attacks, the download links force the content to
-be wrapped inside of a ZIP archive with a randomized file name.
-Server administrators may use the mimetype.safe configuration setting
-to avoid this wrapping if they trust users to only upload safe file
-content.
-
-* Improve performance of 'Show Full Files'
-+
-The 'Show Full File' checkbox in the file viewers no longer requires
-an RPC if the file is sufficiently small enough and syntax coloring
-was enabled.  The browser can update the UI using the cached data it
-already has on hand.
-
-* Show old file paths on renamed/copied files
-+
-If a file was renamed or copied, the side-by-side viewer now shows the
-old file path in the column header instead of the generic header text
-'Old Version'.
-
-* Improved character set detection
-+
-Gerrit now uses the Mozilla character set detection algorithm when
-trying to determine what charset was used to write a text file.
-For UTF-8 or ISO-8859-1/ASCII users, there should be no difference
-over prior releases.  With this change, the server can now also
-automatically recognize source files encoded in:
-
-a. Chinese (ISO-2022-CN, BIG5, EUC-TW, GB18030, HZ-GB-23121)
-b. Cyrillic (ISO-8859-5, KOI8-R, WINDOWS-1251, MACCYRILLIC, IBM866, IBM855)
-c. Greek (ISO-8859-7, WINDOWS-1253)
-d. Hebrew (ISO-8859-8, WINDOWS-1255)
-e. Japanese (ISO-2022-JP, SHIFT_JIS, EUC-JP)
-f. Korean (ISO-2022-KR, EUC-KR)
-g. Unicode (UTF-8, UTF-16BE / UTF-16LE, UTF-32BE / UTF-32LE / X-ISO-10646-UCS-4-34121 / X-ISO-10646-UCS-4-21431)
-h. WINDOWS-1252
-
-* issue 405 Add canned per-line comment reply of 'Done'
-* issue 380 Use N/P to jump to next/previous comments
-* Use RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK for tabs
-* Use a tooltip to explain whitespace errors
-
-=== UI - Other
-
-* issue 408 Show summary of code review, verified on all open changes
-+
-The open changes views now show the status summary columns, just like
-a user dashboard shows.  This requires an extra RPC per page display,
-but can save user time when trying to identify which reviews should be
-examined.
-
-* Only enable 'Delete' button when there are selections
-+
-In Settings panels the delete button is enabled only if at least one
-row has been selected to be removed.
-
-* SSH commands stop option parsing on \--
-+
-Like most POSIX commands, `\--` now signifies the end of options for
-any command accessible over SSH.
-
-* Include formatted HTML documentation in WAR
-+
-Official release WARs now contain the formatted HTML documentation,
-and a 'Documentation' menu will display in the main UI (alongside
-'All', 'My', 'Admin') to help users access the local copy rather
-than jumping to the remote Google Code project site.
-
-* Enhanced patch set download commands
-+
-Download commands for patch sets are now offered as a tabbed panel,
-allowing the user to select between 'repo download', 'git pull',
-or 'git fetch ... && git cherry-pick' or 'git fetch ... && git
-format-patch' styles, as well as to select the transport protocol
-used, including anonymous Git or HTTP, or authenticated SSH or HTTP.
-The current selections are remembered for signed-in users, permitting
-end-users to quickly reuse their preferred method of grabbing a
-patch set.
-
-* Theme the web UI with different skin colors
-+
-Site administrators can now theme the UI with local site colors
-by setting theme variables in gerrit.config.
-
-=== Permissions
-
-* issue 60 Change permissions to be branch based
-+
-Almost all permissions are now per-branch within each project.  This
-includes Code Review, Verified, Submit, Push Branch, and even Owner.
-Permissions can be set on a specific branch, or on a wildcard that
-matches all branches that start with that prefix.  Read permission is
-still handled at the project level, but future versions should support
-per-branch read access as well.
-
-* MaxNoBlock category for advisory review levels
-+
-The new MaxNoBlock category function can be used in a custom approval
-category for reviews that are performed by automated lint tools.
-See link:http://gerrit.googlecode.com/svn/documentation/2.1.2/access-control.html#function_MaxNoBlock[access control]
-for more details on this function.
-
-=== Remote Access
-
-* Enable smart HTTP under /p/ URLs
-+
-Git 1.6.6 and later support a more efficient HTTP protocol for both
-fetch/clone and push, by relying upon Git specific server side logic.
-Gerrit Code Review now includes the necessary server side support when
-accessing repositories using URLs of the form
-`http://review.example.com/p/'$projectname'.git`.
-Authentication over smart HTTP URLs is performed using standard HTTP
-digest authentication, with the username matching the SSH username,
-but the password coming from a field that is generated by Gerrit and
-accessible to the user on their Settings > SSH Keys tab.
-Smart HTTP requests enter the same resource queue as SSH requests,
-using the embedded Jetty server to suspend the request and later
-resume it when processing resources are available.  This ensures HTTP
-repository requests don't overtax the server when made concurrently
-with SSH requests.
-
-* issue 392 Make hooks/commit-msg available over HTTP
-+
-The scp filesystem holding client side tools and hooks is now
-available over `http://review.example.com/tools/'$name'`.  User
-documentation is updated with example URLs.
-
-* issue 470 Allow /r/I... URLs
-+
-Change-Ids can now be searched for by accessing the URL
-`http://example.com/r/'Ichangeid'`, similar to how commits
-can be searched by `http://example.com/r/'commitsha1'`.
-
-* gerrit-sshd: Allow double quoted strings
-+
-SSH command arguments may now be quoted with double quotes, in
-addition to single quotes.  This can make it easier to intermix
-quoting styles with the shell that is calling the SSH client .
-
-=== Server Administration
-
-* issue 383 Add event hook support
-+
-Site administrator managed hook scripts can now be invoked at various
-points in processing.  Currently these scripts are informational only
-and cannot influence the outcome of an event.  For more details see
-link:http://gerrit.googlecode.com/svn/documentation/2.1.2/config-hooks.html[hooks].
-
-* Add stream-events command
-+
-The new 'gerrit stream-events' command can be used over SSH by an
-end-user to watch a live stream of any visible patch set creation,
-comments and change submissions.  For more details see
-link:http://gerrit.googlecode.com/svn/documentation/2.1.2/cmd-stream-events.html[gerrit stream-events].
-
-* Log HTTP activity to $site_path/logs/httpd_log
-+
-When httpd.listenUrl is http:// or https://, requests are
-logged into `'$site_path'/logs/httpd_log`.  This mirrors the
-behavior of the SSH daemon, which also logs requests into the
-same directory.  For proxy URLs HTTP requests aren't logged,
-since the front-end server is expected to be performing the
-logging.  Logging can be forced on, or forced off by setting
-link:http://gerrit.googlecode.com/svn/documentation/2.1.2/config-gerrit.html#httpd.requestLog[httpd.requestLog].
-
-* Allow the daemon's host key to authenticate to itself
-+
-The SSH daemon's host key can now be used to authenticate as the
-magic user `Gerrit Code Review`.  This user identity is blessed as
-even more powerful than a user in the Administrators group, as using
-it requires access to the private half of the host key.  For example:
-+
-----
-  ssh -p 29418 -i site_path/etc/ssh_host_rsa_key 'Gerrit Code Review'@localhost gerrit flush-caches --all
-----
-
-* Allow $site_path/etc/peer_keys to authenticate peer daemons
-+
-Additional public keys for the magical 'Gerrit Code Review' user may
-be specified in an OpenSSH authorized_keys style file and are
-functionally equivalent to authenticating with the daemon's host key.
-The keys are primarily intended to be other daemons, most likely
-slaves, that share the same set of repositories and database.
-
-* Allow suexec to run any command as any user
-+
-The new SSH based suexec command can only be invoked by the magic user
-`Gerrit Code Review` and permits executing any other command as any
-other registered user account.  This forms the foundation of allowing
-a slave daemon process to transparently proxy any write request from a
-client forward to the current master.
-+
-The transparent proxy support is not yet implemented in the slave.
-
-* Support automation of gsql by JSON, -c option
-+
-The gsql command now supports JSON as an output format, making
-software driven queries over SSH easier.  The -c option accepts
-one query, executes it, and returns.
-
-=== Other
-
-* Warn when a commit message isn't wrapped
-+
-During receive Gerrit warns the user if their commit messages appears
-to be incorrectly formatted, by having lines that aren't hard-wrapped
-or that has an extremely long subject line.
-
-* During merge use existing author identity values
-+
-When Gerrit creates a merge commit in order to submit a change, the
-author information of the merge commit is taken from the submitter.
-If all of the commits being submitted were written by the submitter,
-the authorship of the merge commit is copied from one of those commits
-rather than from the user's preferred account information.
-
-
-== Bug Fixes
-
-=== UI
-
-* Change "Publish Comments" to "Review"
-+
-The term "Publish Comments" was used on two different buttons that
-performed two different actions.  The first usage was to open the
-screen which shows the scoring buttons, provides the cover letter
-editor, and shows the in-line comments for final review before
-publication.  The button that opens that review screen has been
-renamed "Review".  The second usage of the button was to actually send
-out the notification emails, and expose the comments to others.  This
-button is still called "Publish Comments".
-
-* issue 448 Disable syntax highlighting on unified views
-+
-Syntax highlighting in the unified patch view isn't useful if it hides
-the added and removed lines red/green text color.  Disable it entirely
-so the add/remove coloring shows up instead.
-
-* Disable 'Syntax Highlighting' and 'Show Full File' on big files
-+
-If the file is really big (over 9000 lines), 'Show Full File' is
-actually disabled on the server side, to prevent the client from
-being overrun with data.  The UI now reflects this by disabling
-the checkbox for the user, and adds a tooltip to indicate why its
-greyed out.
-
-* Don't try to syntax highlight plain text
-+
-Plain text files can't benefit from syntax highlighting, its actually
-more confusing than it is useful.  Skip highlighting on them.
-
-* issue 251 Fix bad syntax highlighting
-+
-Prior versions performed syntax highlighting on a per-line basis,
-resulting in confusing or bogus results in multi-line contexts like
-C/Java's "/\* ... \*/" style comment.  Fixed by performing
-highlighting on the entire file contents, even if only some lines are
-displayed to meet the user's context setting.
-
-* Ensure vertical tabs are visible
-+
-Vertical tab markers are red, which means they can be hidden against a
-whitespace error, or deleted region marker.  Tabs are now shown as
-black against these cases.
-
-* Handle bare CR in the middle of a line
-+
-If a CR ("\r") appears in the middle of a line rather than nestled
-against an LF as a CRLF pair, its now displayed as a whitespace
-error, and the line isn't broken at the CR.  This fixes an issue
-where a mostly CRLF file with a single malformed line ending caused
-the side-by-side display to render incorrectly (or not at all).
-
-* issue 438 Skip gitlink modes as we can't get a content difference
-+
-The special gitlink mode inside of a tree points to a commit in the
-submodule project.  We can't show the content of it inside of the
-supermodule.
-
-* issue 456 Support enter to submit on most forms
-+
-Enter key on a lot of forms did not activate the reasonable default
-action, e.g. add a reviewer to an existing review.  Fixed.
-
-* issue 347 Improve handling of files renamed between patch sets
-+
-Comment counts in the "history" section of a file viewer were not
-displayed when the file was renamed between two different patch sets
-of the same change.  Fixed.
-
-* Fix the style of the Reviewed column header
-+
-The reviewed column header wasn't displaying with the same style as
-its siblings.  Fixed.
-
-* Fix duplicate "Needed By" pointers between changes
-+
-If a change's current patch set was used as the parent for multiple
-patch sets of another change, that dependent change showed up more
-than once in the "Needed By" list.  Fixed.
-
-* Expand group names to be 255 characters
-* Update URL for GitHub's SSH key guide
-* issue 314 Hide group type choice if LDAP is not enabled
-
-=== Email
-
-* Send missing dependencies to owners if they are the only reviewer
-+
-If the owner of the change is the only reviewer and the change can't
-be submitted due to a missing dependency, Gerrit failed to send out an
-email notification.  Fixed.
-
-* issue 387 Use quoted printable strings in outgoing email
-+
-Names or subjects with non-ASCII characters were not quoted properly
-in the email notification headers.  Fixed.
-
-* issue 475 Include the name/email in email body if not in envelope
-+
-When the email address from line is a generic server identity,
-there is no way to know who wrote a comment or voted on a change.
-An additional from line is now injected at the start of the email
-body to indicate the actual user.
-
-=== Remote Access
-
-* issue 385 Delete session cookie when session is expired
-+
-If the session expires and the user clicks "Close" in the session
-expired popup dialog box, delete the cookie so the user can continue
-to use the website as an anonymous user.
-
-* Dequote saved OpenID URLs
-+
-Certain OpenID URLs were getting double quotes thrown around them
-after being saved in the last identity cookie on the client.  The
-quotes were loading back into the dialog on a subsequent sign-in
-attempt, resulting in an error as double quotes aren't valid in an
-HTTP URL.  Fixed by dropping the quotes if present.
-
-* Fix NoShell to flush the error before exiting
-+
-Sometimes users missed the standard error message that indicated no
-shell was available, due to a thread race condition not always
-flushing the outgoing buffer.  Fixed.
-
-* issue 488 Allow gerrit approve to post comments on closed changes
-+
-The 'gerrit approve' command previously refused to work on a closed
-change, but the web UI permitted comments to be added anyway.
-Fixed by allowing the command line tool to also post comments to
-closed changes.
-
-* issue 466 Reject pushing to invalid reference names
-+
-Gerrit allowed the invalid `HEAD:/refs/for/master` push refspec
-to actually create the branch `refs/heads/refs/for/master`, which
-confused any other client trying to push.  Fixed.
-
-* issue 485 Trim the username before requesting authentication
-+
-LDAP usernames no longer are permitted to start with or end with
-whitespace, removing a common source of typos that lead to users
-being automatically assigned more than one Gerrit user account.
-
-=== Server Administration
-
-* daemon: Really allow httpd.listenUrl to end with /
-+
-If httpd.listenUrl ended with / the configuration got botched during
-init and the site didn't work as expected.  Fixed by correctly
-handling an optional trailing / in this variable.
-
-* issue 478 Catch daemon startup failures in error_log
-+
-Startup errors often went to /dev/null, leaving the admin wondering
-why the server didn't launch as expected.  Fixed.
-
-* issue 483 Ensure uncaught exceptions are logged
-+
-Some exceptions were reaching the top of the stack frame without
-being caught and logged, causing the JRE to print the exception to
-stderr and then terminate the thread.  Since stderr was redirected
-to /dev/null by gerrit.sh, we usually lost these messages.  Exception
-handlers are now installed to trap and log any uncaught errors.
-
-* issue 451 gerrit.sh: Wait until the daemon is serving requests
-+
-The gerrit.sh script now waits until the daemon is actually running
-and able to serve requests before returning to the caller with a
-successful exit status code.  This makes it easier to then start up
-dependent tasks that need the server to be ready before they can run.
-
-* gerrit.sh: Don't use let, dash doesn't support it
-+
-/bin/sh on Debian/Ubuntu systems is dash, not bash.  The dash
-shell does not support the let command.
-
-* gerrit.sh: Correct JAVA_HOME behavior
-+
-JAVA_HOME now can be overridden by container.javaHome, as the
-documentation states.
-
-* init: Only suggest downloading BouncyCastle on new installs
-+
-Upgrades of an existing installation which has not installed the
-BouncyCastle library shouldn't be encouraged to download and install
-the library again.  The administrator has already chosen not to use
-it, we shouldn't nag them about it.
-
-* issue 389 Catch bad commentlink patterns and report them
-+
-A bad commentlink.match pattern could cause the change screen to
-simply not load, with no errors in the server log, and nothing
-immediately visible on the client.  Most bad patterns are now caught
-during server startup and are reported in the server error_log.
-Certain failures are caught on the client side, and sent to the server
-error log over RPC.  Bad patterns are simply skipped when logged.
-
-* issue 419 MySQL: Fix account\_group\_members\_audit removed\_on
-+
-MySQL has a "feature" which prevented the removed_on column from being
-NULL when we meant for it to be NULL.  Fixed by using the MySQL
-suggested work around, which is non-standard SQL.
-
-* issue 424 WAR truncated during init
-+
-init sometimes truncated the WAR file to 0 bytes if it was running
-from the destination WAR.  Fixed by using JGit's LockFile class which
-writes to a temporary file and does an atomic rename to finish.
-
-* issue 423 Bind to LDAP using only the end-user identity
-+
-Microsoft Active Directory doesn't support anonymous binds, and some
-installations might not be able to create a generic role account for
-Gerrit Code Review.  The new auth.type LDAP_BIND permits Gerrit to
-authenticate using only the end-user's credentials, avoiding the need
-for an anonymous or role account bind.
-
-* issue 423 Defer LDAP server type discovery until first authentication
-+
-Microsoft Active Directory wasn't being detected, because the
-anonymous bind during server startup failed.  Instead the server
-type is detected during the first user authentication, where we
-have a valid directory context to query over.
-
-* issue 486 Reload UI if code split fails to download
-+
-If the server gets upgraded and the user hasn't reloaded their
-browser tab since the upgrade, opening a new section of the UI
-sometimes failed.  Fixed by executing an implicit reload in these
-cases, reducing the number of times a user sees a failure.
-
-=== Development
-
-* issue 427 Adjust SocketUtilTest to be more likely to pass
-+
-Some DNS environments, especially those based on OpenDNS, were failing
-this test case during a build because the upstream resolver was
-returning back a bogus record for an invalid domain name.  The test
-was adjusted to use a name that is less likely to be resolved by a
-broken upstream resolver.
-
-* Fix /become?user_name=... under GWT debugger
-+
-The /become URL now accepts ?user_name=who to authenticate, making
-it easier to setup a launch configuration to debug a particular
-user account in development.
-
-* Show localhost based SSH URLs
-+
-SSH URLs using localhost as the hostname are now visible in the
-web UI, making it easier to copy and paste SSH URLs when debugging
-fetching of changes.
-
-* issue 490 Try Titlecase class name first when launching programs
-+
-Launching daemon or init from the classes directory on a case
-insensitive filesystem like Mac OS X HFS+ or Windows NTFS failed.
-Fixed.
-
-* Misc. license issues
-+
-The CDDL javax.servlet package was replaced by an Apache License 2.0
-implementation from the Apache Foundation.  The unnecessary OpenXRI
-package, which was never even included in the distribution, was
-removed from the license file.
-
-
-== Schema Changes in Detail
-
-* Remove Project.Id and use only Project.NameKey
-+
-The project_id column was dropped from the projects table, and all
-associated subtables, and only the name is now used to link records
-in the database.  This simplifies the schema for eventual changes
-onto less-traditional storage systems.
-
-* Move sshUserName from Account to AccountExternalId
-+
-The ssh\_user\_name column in accounts was moved to an additional row
-in account\_external\_ids, using external\_id prefix `username:`.
-This removes the non-primary key unique index from the table, making
-it easier to move to less traditional storage systems.
-
-* Replace all transactions with single row updates
-+
-Schema update operations have been reworked to not require multi-row
-transaction support in the database.  This makes it easier to port
-onto a distributed storage system where multi-row atomic updates
-aren't possible, or to run on MySQL MyISAM tables.
-
-
-== Other Changes
-* Update gwtorm to 1.1.4-SNAPSHOT
-* Add unique column ids to every column
-* Remove unused byName @SecondaryKey from ApprovalCategory
-* Remove @SecondaryKey from AccountGroup
-* documentation: Remove mention of mysql_nextval.sql script
-* Drop MySQL function nextval_project_id
-* documentation: Remove project_id from manual insert
-* Update JGit to 0.5.1.106-g10a3391
-* Split the core receive logic out of the SSH code
-* Move toProject into PageLinks for reuse
-* Correct SSH Username to be just Username
-* Don't display the magic username identity on the identities tab
-* Show Status column header on the SSH key table
-* Queue smart HTTP requests alongside SSH requests
-* Add a password field to the account identities
-* Authenticate /p/ HTTP and SSH access by password
-* Advertise the smart HTTP URLs to references
-* Refactor the SSH session state
-* Fixing Eclipse settings file
-* Add --commit to comment-added as there was previously no way to kno...
-* Fix imports inside of PatchScreen.java
-* Fix crash while loading project Access tab
-* Replace our own @Nullable with javax.annotation.Nullable.
-* Correctly hide delete button on inherited permissions
-* Allow per-branch OWN +1 to delegate branch ownership
-* Block inheritance by default on per-branch permissions.
-* Simplify FunctionState as discussed previously
-* Restore delete right checkboxes in wild card project
-* issue 393 Require branch deletion permission for pushes over HTTP
-* issue 399 Update JGit to 0.5.1.140-g660fd39
-* Add standard eclipse generated files to .gitignore
-* Don't reformat the source if the files are identical
-* Fix schema 27 upgrade for H2
-* Update JGit to 0.5.1.141-g3eee606
-* Manage database connections directly in PatchScriptFactory
-* issue 425 Update user documentation to explain branch access control
-* Update to gwtjsonrpc 1.2.2-SNAPSHOT
-* Allow refs/* pattern on new reference rights
-* Trim reference name from user when adding access right
-* Execute Git commands with AccessPath.GIT
-* Update to GWT 2.0.1
-* Update to Ehcache 1.7.2
-* Update to mime-util 2.1.3
-* Update to H2 1.2.128
-* issue 442 Fix IncorrectObjectTypeException on initial commit
-* Compute allowed approval categories separately.
-* Move new change display to PostReceiveHook
-* Drop unused formatLanguage property from patch table
-* issue 447 documentation: Improve Apache mod_proxy configuration
-* issue 445 Fix whitespace errors with word diff enabled
-* issue 439 Move syntax highlighting back to client
-* Remove Mozilla Rhino from our build
-* Add missing step to add gwtui_dbg configuration
-* Remove useless imports from Schema_28
-* Fix upgrading H2 from schema 20 to current
-* Move release notes into the repository
-* issue 454 documentation: Improve bugzilla link example to include #
-* Drop unused err PrintWriter in Receive
-* documentation: Describe how to do case insensitive commentlink
-* Add patch releases to release notes
-* Update to gwtorm 1.1.4, gwtjsonrpc 1.2.2, gwtexpui 1.2.1
-* Update to GWT 2.0.2
-* documentation: Remove stupid ReleaseNotes build rules
-* documentation: Use a per-version directory
-* Draft 2.1.2 release notes
-* documentation: Fix version number to only consider x.y.z format
-* Drop XRI related support from our notices list
-* documentation: Correct sorting error in notices
-* documentation: Add JSR 305 and AOP Alliance to licenses
-* documentation: Correct links to the MPL 1.1 license
-* Replace CDDL javax.servlet with APLv2 implementation
-* documentation: Document database.pool* variables
-* Update 2.1.2 release notes to mention juniversalchardet
-* Fix whitespace ignore feature
-* Fix database connection leak in git-receive-pack
-* Delay marking a file reviewed until its displaying
-* Simplify patch display to a single RPC
-* Fix missing right side border of history, dependency tables
-* Cleanup useless leftmost/rightmost CSS classes
-* Don't RPC to load the full file if we already have it
-* Add Forge Identity +3 to permit pushing filtered history
-* Fix source code formatting in RefControl
-* Fix combined diffs on merge commits
-* Fix SparseFileContent for delete-only patches
-* Simplify some CSS rules for side-by-side viewer
-* Color entire replace block same background shade
-* Cleanup CSS for side-by-side view when there are character differen...
-* documentation: Fix typo on the word database
-* Always use class wdc on replace line common sections
-* Fix side-by-side table header CSS glitch
-* Fix file line padding in side-by-side viewer
-* Improve the way inline comments are shown
-* Fix side by side view column headers to use normal font
-* Tweak the intraline difference heuristics
-* Refactor and add to streaming events schema
-* Documentation schema for stream-events command
-* Fix source code formatting errors in MergeOp
-* Cleanup display of branches panel when gitweb isn't configured
-* Fix "Show Tabs" checkbox
-* Update 2.1.2 release notes
-* Reorganize 2.1.2 release notes into categories
-* Hide syntax highlighting checkbox in unified view
-* Change default tab width to 8
-* Ensure drafts redisplay when refreshing the page
-* Fix tab marker RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
-* issue 473 Don't aggressively coalesce across lines
-* Fix intraline difference off-by-one when LF is added
-* Mark add or delete regions with darker colors
-* Invalidate the diff cache
-* Fix build breakage due to missing constants
-* Fix editable username when authType is LDAP or HTTP_LDAP
-* issue 481 Fix enter with completion in add reviewer box
-* Make intraline differences easier to debug
-* Avoid "es" replaced by "es = Address"
-* Cleanup line insertions joined against indentation change
-* Change become to use user_name field
-* Stop leaking patch controls CSS to other widgets
-* Fix coloring of tab markers in syntax highlighting
-* Fix toggling syntax highlighting on partial file
-* Permit use of syntax highlighting in unified view
-* Use hunk background colors on unified views with syntax highlighting
-* Fix source code formatting in ApproveCommand.java
-* issue 483 Log the type of a non-task after it executes
-* Update to GWT 2.0.3
-* issue 489 Drop host name resolution failure test
-* issue 483 Remove reliance on afterExecute from WorkQueue
-
-71b04c00b174b056ed2579683e2c1546d156b75a
diff --git a/ReleaseNotes/ReleaseNotes-2.1.3.txt b/ReleaseNotes/ReleaseNotes-2.1.3.txt
deleted file mode 100644
index 6226b93..0000000
--- a/ReleaseNotes/ReleaseNotes-2.1.3.txt
+++ /dev/null
@@ -1,299 +0,0 @@
-= Release notes for Gerrit 2.1.3
-
-Gerrit 2.1.3 is now available in the usual location:
-
-link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]
-
-== Schema Change
-
-*WARNING* This release contains multiple schema changes.  To upgrade:
-----
-  java -jar gerrit.war init -d site_path
-----
-
-
-== New Features
-
-=== Web UI
-
-* issue 289 Remove reviewers (or self) from a change
-+
-Project and change owners can now remove any reviewer from a change
-by clicking an "X" next to their name in the approval table.
-Individual users can also remove themselves from any change.
-This feature permits users to stop getting notified about a change
-they no longer have an interest in, but had commented on previously.
-
-* issue 124 Index changes by external issue tracking id numbers
-+
-Changes can be searched for by an external issue tracking system's
-id numbers.  Site administrators can configure trackingid sections in
-gerrit.config to parse and extract issue tracking links from a commit
-message's footer, and have them indexed by Gerrit.  Users can search
-for relevant changes using the search operator `tr:` or `bug:`,
-for example `tr:432181` or `bug:JIRA-42`.  Administrators can index
-existing change records using the ScanTrackingIds program.
-
-* List branches/tags containing a merged change
-+
-Merged change pages now display a new expandable section, 'Included
-In', listing all branches and tags that contain the change.
-
-* issue 391 Reduce clicks need to approve and submit
-+
-Users who have Submit +1 permission for a change can now click
-'Publish Comments and Submit' on the publish comments screen,
-combining the 'Publish Comments' and 'Submit Patch Set n' actions
-into a single click.
-
-* Simplify setup of non-range access such as Submit
-+
-If an access control doesn't really make sense as a range of values,
-Gerrit now displays only one box to select the maximum permitted
-value from, rather than two boxes to set the min/max.
-
-* Make Admin > Projects UI accessible to all users
-+
-All projects that are visible to the current user are now listed
-in the Admin > Projects page, as are the project's Branches and
-Access tabs.  Editing is obviously disabled, unless the user has
-owner level access to the project, or one of its branches.
-
-=== Access Controls
-
-* Branch-level read access is now supported
-+
-Project owners/administrators can now use the access tab to
-control which groups can read certain branches, enabling hidden
-branches within a more widely visible project.  Additionally,
-replication.config honors these settings through the authGroup
-variable, allowing a server administrator to limit which branches
-are replicated to certain mirrors.
-
-* issue 273 Inherit project permissions from more than just All Projects
-+
-Projects can now be organized into an inheritance hierarchy, allowing
-administrators to cluster common access rules for different groups
-of projects.  The create-project command learned a new \--parent
-option to set the hierarchy immediately.
-
-* auth.allowedOpenID can limit which providers can be used
-+
-Administrators can now set auth.allowedOpenID in gerrit.config
-to restrict which OpenID provider(s) a user can use to register
-for an account.  This may be useful to restrict login to only the
-organization's local provider, or a single trusted 3rd party.
-
-* Branch-level access control is now inherited by default
-+
-Previously branch level access controls were exclusive, locking out
-all other groups that may have been inherited from All Projects,
-or through a wildcard like 'refs/heads/*'.  Branch access is now
-inherited by default, but the old exclusive behavior can be obtained
-by prefixing the reference with '-'.
-
-=== SSH Commands
-
-* create-account: Permit creation of batch user accounts over SSH
-* issue 269 Enable create-project for non-Administrators
-
-* ls-projects: New -b option displays the sha1 of each branch
-* ls-projects: New -t option shows the project hierarchy
-
-* gerrit show-queue is now accessible to all users
-+
-Results are filtered to display only queue entries that are operating
-on projects the user is permitted to see.  Replication URLs are
-masked for non-admin users, and instead display the remote name
-from the replication.config file.
-
-* issue 310 review \--submit: Submit a change over SSH
-+
-Changes can now be submitted over SSH by using the new \--submit
-command line flag to gerrit review.
-
-* gerrit approve deprecated
-+
-To support the new \--submit flag, gerrit approve has been renamed
-to gerrit review, better matching the web UI name for the concept.
-The old `gerrit approve` name will be kept around as an alias to
-provide time to migrate hooks/scripts/etc.
-
-=== Hooks / Stream Events
-
-* \--change-url parameter passed to hooks
-+
-The change URL was supplied in the stream-events feed, but was
-not passed into hooks, making it difficult for a hook to send a
-notification email with a link back to Gerrit.  Fixed by adding
-the parameter.
-
-* Patch set uploader passed to hooks
-+
-The identity of the user who uploaded a patch set was added as both
-a parameter to patchset-created hook, and to the patch set entity
-sent through stream-events.
-
-* issue 506 stream-events: Include the ref in patch sets
-+
-The reference (e.g. 'refs/changes/12/812/2') to download a patch
-set is now included in the stream-events record, making it possible
-for a monitor to easily pull down a patch set and compile it.
-
-=== Contrib
-
-* Example hook to auto-re-approve a trivial rebase
-
-=== Misc.
-
-* transfer.timeout: Support configurable timeouts for dead clients
-+
-Sometimes `repo sync` can leave dead connections open to Gerrit Code
-Review, resulting in worker threads that are tied up indefinitely,
-waiting for client IO that will never occur.  Administrators may set
-transfer.timeout to place an upper bound on how long the server will
-wait for the client before aborting the connection and releasing
-the worker thread back into the pool.
-
-* container.slave: Automatically enable --slave
-+
-Adminstrators can now add `container.slave = true` to their slave's
-gerrit.config file, avoiding the need to make sure they always
-pass the --slave flag on the command line when starting their
-slave server.
-
-* Add separate task queue for non-interactive users
-+
-Users who are a member of the special 'Non Interactive Users' group
-can now have all of their SSH commands scheduled onto a different
-thread pool than everyone else.  If enabled, this feature can help
-ensure quick response time for normal users when the system is
-heavily loaded by batch tasks.
-
-* Explain a remote rejection of a non-fast-forward
-+
-If the remote peer rejected a non-fast-forward replication, make
-it clear that it was the remote that rejected the push, and not
-Gerrit Code Review's client logic.  The error is often caused by
-the remote repository having receive.denyNonFastForwards being set
-to true in $GIT_DIR/config.  Gerrit's error log message now hints
-at checking this setting on the remote repository.
-
-* Internal dependencies updated
-+
-Updated JGit to 0.8.4, Jetty to 7.0.2.v20100331, H2 database to
-1.2.134, Apache Commons Codec to 1.4, Apache Commons Net to 2.1,
-Apache Commons DBCP to 1.4.
-
-
-== Bug Fixes
-
-=== Web UI
-
-* issue 396 Prevent 'no-score' approvals from being recorded
-+
-Change messages no longer say 'No score; no score' when the user
-has not selected a particular approval setting.
-
-* issue 396 Summarize the number of inline comments
-+
-A change message is now always recorded at the top level of a change
-anytime inline comments are published, even if no score change
-took place, and no cover letter was supplied by the user. The
-auto-generated message is a one line summary indicating how many
-inline comments were published at that time.  This makes it easier
-to see what has occurred on the change.
-
-* issue 461 Space out Review and Submit Patch Set buttons
-+
-The risk of clicking 'Submit Patch Set n' when the user meant to
-click 'Review' has been reduced by spacing the buttons further apart.
-
-* issue 587 Fix user site header/footer preference
-+
-The user preference to hide the site header/footer wasn't always
-being applied.  Fixed.
-
-* issue 575 Require branches to always start from commits
-+
-Branches could be created starting from annotated tags, resulting
-in crashes when a change gets submitted to the branch.  Fixed by
-ensuring branches always start from commits.
-
-* issue 574 Add Cancel button to Register New Email dialog
-+
-Users couldn't (easily) get out of the dialog popped up by the
-'Register New Email...' button.  A cancel button was added to
-close the dialog.
-
-=== Server Programs
-
-* init: Import non-standardly named Git repositories
-+
-When scanning for projects, any directory that is a valid Git
-repository is now imported, even if its name does not end with
-the standard '.git' suffix.
-
-* issue 460 gerrit.sh: Request at least 1024 file descriptors
-+
-In the default configuration, Gerrit Code Review started with a
-hard limit of 256 file descriptors, which is too small for any site.
-This caused a number of failures, and a number of bugs were filed.
-The default has been raised to 1024.
-
-* issue 578 Improve schema version update by avoiding early pruning
-+
-Previously init kept trying to remove unused tables or columns
-during each schema upgrade step.  These removes are now deferred
-until the last step.
-
-* review: Actually log an internal server error's root cause
-+
-Internal server failures (such as database connectivity errors)
-were not properly logged by `gerrit approve` (now gerrit review).
-Fixed by logging the root cause of the failure.
-
-=== Configuration
-
-* Display error when HTTP authentication isn't configured
-+
-Error reporting for a failed login attempt when auth.type is HTTP
-and the HTTP server isn't supplying the expected header is now more
-explicit about describing the problem.  This helps new site setups,
-but doesn't have any impact on an existing site.
-
-* Fix javax.naming.PartialResultException: Unprocessed Continuation
-+
-LDAP directory trees that require following a referral in order
-to lookup a name usually failed with the above Java exception
-during sign-in.  Administrators can enable following by adding
-`ldap.referral = follow` to their gerrit.config file.
-
-=== Documentation
-
-* documentation: Clarified the ownership of '\-- All Projects \--'
-+
-The magic project All Projects isn't allowed to have ownership
-delegated, and the documentation wasn't clear why.  Fixed by
-explaining the rationale in more detail.
-
-* issue 533 Fix JAR versions in other container installation
-+
-The installation process for putting Gerrit Code Review under a
-3rd party servlet container was out of date, as some JARs had
-the wrong versions listed.  Fixed.
-
-* suexec: Document the suexec command
-+
-The suexec command introduced in 2.1.2 was never documented.  Fixed.
-
-* Corrected Eclipse documentation on importing Maven projects
-+
-The Maven plugin changed some of its user interface, resulting in
-our step-by-step documentation being out of date.  Fixed to match
-the current stable version of the Maven plugin.
-
-
-== Version
-
-e8fd49f5f7481e2f916cb0d8cfbada79309562b4
diff --git a/ReleaseNotes/ReleaseNotes-2.1.4.txt b/ReleaseNotes/ReleaseNotes-2.1.4.txt
deleted file mode 100644
index 72eec55..0000000
--- a/ReleaseNotes/ReleaseNotes-2.1.4.txt
+++ /dev/null
@@ -1,212 +0,0 @@
-= Release notes for Gerrit 2.1.4
-
-Gerrit 2.1.4 is now available in the usual location:
-
-link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]
-
-== Schema Change
-
-*WARNING* This release contains multiple schema changes.  To upgrade:
-----
-  java -jar gerrit.war init -d site_path
-----
-
-== New Features
-
-=== Change Management
-
-* issue 504 Implement full query operators
-+
-The search box now implements a wide range of operators and boolean
-expressions, permitting complex queries such as `is:open CodeReview>=1
-(has:draft OR is:starred)` to locate open changes that have been code
-reviewed, but still have unpublished drafts or were starred by the
-current user.  The full range of supported operators is documented
-in the user guide.
-
-* Change lists now use query operators
-+
-All current change lists have been reimplemented using query
-operators, so selecting 'All open changes' actually performs the query
-'is:open'.  This is to help end-users learn the different operators
-that are supported, and simplifies the internal implementation
-considerably by removing redundant code.
-
-* issue 51 Tag changes with topic branches
-+
-Changes can be tagged with a topic name during upload.  To add the tag
-'query' when pushing to branch 'master', use `git push URL
-HEAD:refs/for/master/query`.  To add a topic name with `repo upload`
-use the `-t` command line flag.  Topic names are displayed next to the
-branch name in the web UI, and can be searched for with the `topic:`
-query operator.
-
-* Filter the list of open changes by watched projects
-+
-The query operator `is:watched` matches changes matching the user's
-watched project list, and a new menu item was added under the My menu
-to select open changes matching these watched projects.
-
-=== Web UI
-
-* issue 579 Remember diff formatting preferences
-+
-Formatting options at the top of a side-by-side or unified diff page
-are now remembered by saving the current preferences into the user's
-account whenever 'Update' is clicked.
-
-* issue 680 Show commit message on the per-file review pages
-
-* issue 498 Improved keyboard navigation
-+
-More keyboard bindings have been added, reducing the need to switch to
-the mouse while navigating through a change and performing a review.
-
-* issue 395 Open new window/new tab for all files in a change
-+
-New buttons permit opening all modified files of a change into
-new windows or tabs.
-
-* issue 440 Add copy to clipboard button for change-id
-+
-The Change-Id field in the upper left side of a change now support to
-copy "Change-Id: I...." onto the clipboard, making it easier to paste
-into a commit message.
-
-* issue 559 Allow copying user public ssh key to clipboard
-
-* issue 509 Make branch columns link to changes on that branch
-
-=== Email Notifications
-
-* issue 311 No longer CC a user by default
-+
-The user who causes a notification to be sent is no longer CC'd on the
-email when it is sent.  This reduces the number of messages sent to a
-user, but can be re-enabled through a checkbox in the Settings >
-Preferences panel.
-
-* issue 535 Enable watching of all projects
-+
-Adding the magic `\-- All Projects \--` to the watched project list
-permits the user to be notified of any change occurring in any
-project.  Project specific entries override the notification settings
-for all projects.
-
-* issue 492 Allow watching specific branches or any other search query
-+
-In addition to watching a project, users can register a query string
-to match specific changes, reducing notifications to be a smaller
-subset of the changes that occur in a project.
-
-* issue 70 Allow file:^regex to match affected files
-+
-The file:^path operator can be used in a watch filter to receive
-notifications only when files matching the regular expression are
-modified by the change.
-
-* issue 623 Include Gerrit-Owner, Gerrit-Reviewer in email footers
-+
-New fields in the email footer provide additional detail, enabling
-better filtering and classification of messages.
-
-=== Access Control
-
-* Support regular expressions for ref access rules
-+
-References in an access rule can now be specified by regular
-expression by prefixing the reference name with ^.
-
-* issue 577 Support $\{username\} in access rules
-+
-Adding `$\{username\}` into a reference causes the current username to
-be inserted at that position.  When combined with the Push Branch
-permission this creates a per-user branch namespace feature, giving
-each user their own "sandbox" to push changes to.
-
-* issue 313 ssh gerrit create-group
-+
-Groups can now be created over SSH by administrators using the
-`gerrit create-group` command.
-
-=== Authentication
-
-* Remove password authentication over SSH
-+
-Adding password authentication over SSH turned out to be a major
-mistake.  Users primarily use SSH public keys, and the password
-prompt just got in the way or confused them.  Password support has
-been removed from the SSH server.
-
-* Username cannot be changed once assigned
-+
-Once a username has been selected for a user account, it
-cannot be modified by the user.
-
-* issue 555 Make LDAP sessions persistent for the session age
-+
-Web sessions are now persistent for the cache.web_sessions.maxAge
-setting, rather than expiring when the browser closes.  (Previously
-sessions expired when the browser exited.)
-
-=== Misc.
-
-* Add topic, lastUpdated, sortKey to ChangeAttribute
-+
-Additional change fields are now exported as part of the
-stream-events output.
-
-* issue 504 gerrit query SSH command
-+
-Queries to lookup change information can be executed over SSH through
-the `gerrit query` command, with results output in either human
-readable text or machine readable JSON.  Change queries can also be
-run over HTTP with the `/query?q=<query>&format=JSON` URL.  Both
-interfaces are intended for automated tools.
-
-* Remove git diff-tree dependency
-+
-Gerrit no longer requires `git` in the PATH; differences are now
-constructed in pure Java code.  Remote repository initialization over
-SSH still requires `git` on the remote host's PATH.
-
-* Internal dependencies updated
-+
-Updated JGit to 0.8.4.89-ge2f5716, log4j to 1.2.16, GWT to 2.0.4,
-sfl4j to 1.6.1, easymock to 3.0, JUnit to 4.8.1.
-
-== Bug Fixes
-
-=== Web UI
-
-* issue 352 Confirm branch deletion in web UI
-+
-Deleting a branch now presents a confirmation dialog to give the user
-a second chance to abort the destructive operation.
-
-* Fix some JavaScript errors under Chrome
-+
-The GWT compiler started to define symbols in the same namespace as
-the prettify syntax highlighting library.  We moved the prettify
-library into its own iframe so it has a different JavaScript namespace
-in the browser.
-
-* Close button on OpenId register / sign-in dialog
-+
-There was no obvious way to leave the sign-in dialog. Fixed.
-
-* Links in OpenId sign-in dialog not focusable
-+
-Keyboard navigation to standard links like 'Google Accounts'
-wasn't supported.  Fixed.
-
-=== Misc.
-
-* issue 614 Fix 503 error when Jetty cancels a request
-+
-A bug was introduced in 2.1.3 that caused a server 503 error
-when a fetch/pull/clone or push request timed out.  Fixed.
-
-== Version
-
-ae59d1bf232bba16d4d03ca924884234c68be0f2
diff --git a/ReleaseNotes/ReleaseNotes-2.1.5.txt b/ReleaseNotes/ReleaseNotes-2.1.5.txt
deleted file mode 100644
index 88288e2..0000000
--- a/ReleaseNotes/ReleaseNotes-2.1.5.txt
+++ /dev/null
@@ -1,162 +0,0 @@
-= Release notes for Gerrit 2.1.5
-
-Gerrit 2.1.5 is now available:
-
-link:https://www.gerritcodereview.com/download/gerrit-2.1.5.war[https://www.gerritcodereview.com/download/gerrit-2.1.5.war]
-
-This is primarily a bug fix release to 2.1.4, but some additional
-new features were included so its named 2.1.5 rather than 2.1.4.1.
-
-== Upgrade Instructions
-
-If upgrading from version 2.1.4, simply replace the WAR file in
-`'site_path'/bin/gerrit.war` and restart Gerrit.
-
-If upgrading from version 2.1.3 or earlier, stop Gerrit, use
-`java -jar gerrit.war init -d 'site_path'` to upgrade the schema,
-and restart Gerrit.
-
-== New Features
-
-=== Web UI
-* issue 361 Enable commenting on commit messages
-+
-The commit message of a change can now be commented on inline, and
-even compared between patch sets, just like any other file contents.
-The message is presented as a magical file called 'Commit Message',
-in the first row of every change.
-
-* issue 312 Implement 'Restore Change' to undo 'Abandon Change'
-+
-Any user who can abandon a change (the change owner, project owner,
-or any site administrator) can now restore the change from Abandoned
-status back to Review in Progress.
-
-* issue 583 Enable/disable download protocols
-+
-The new download section in `gerrit.config` controls how the patch
-set download links are presented in the web UI.  Administrators
-can use this section to enable `repo download`, `git://`, or to
-disable `http://` style URLs.  This section replaces the older
-repo.showDownloadCommand.
-
-* issue 499 Display the size of a patch (lines added/removed)
-+
-A 'diffstat' is shown for each file, summarizing the size of the
-change on that file in terms of number of lines added or deleted.
-
-=== Email Notifications
-* issue 452 Include a quick summary of the size of a change in email
-+
-After the file listing, a summary totaling the number of files
-changed, lines added, and lines removed is displayed.  This may
-help reviewers to get a quick estimation on the time required for
-them to review the change.
-
-== Bug Fixes
-
-=== Web UI
-* issue 639 Fix keyboard shortcuts under Chrome/Safari
-+
-Keyboard shortcuts didn't work properly on modern WebKit browsers
-like Chrome and Safari.  We kept trying to blame this on the browser,
-but it was Gerrit Code Review at fault.  The UI was using the wrong
-listener type to receive keyboard events in comment editors.  Fixed.
-
-* Make 'u' go up to the last change listing
-+
-Previously the 'u' key on a change page was hardcoded to take
-the user to their own dashboard.  However, if they arrived at the
-change through a query such as `is:starred status:open`, this was
-quite annoying, as the query had to be started over again to move
-to the next matching change.  Now the 'u' key goes back to the
-query results.
-
-* issue 671 Honor user's syntax coloring preference in unified view
-+
-The user's syntax coloring preference was always ignored in the
-unified view, even though the side-by-side view honored it.  Fixed.
-
-* issue 651 Display stars in dependency tables
-+
-The 'Depends On' and 'Needed By' tables on a change page did not
-show the current user's star settings, even though the star icon
-is present and will toggle the user's starred flag for that change.
-Fixed.
-
-=== Access Control
-* issue 672 Fix branch owner adding exclusive ACL
-+
-Branch owners could not add exclusive ACLs within their branch
-namespace.  This was caused by the server trying to match the leading
-`-` entered by the branch administrator against patterns that did
-not contain `-`, and therefore always failed.  Fixed by removing
-the magical `-` from the proposed new specification before testing
-the access rights.
-
-* '@' in ref specs shouldn't be magical.
-+
-The dk.brics.automaton package that is used to handle regular
-expressions on branch access patterns supports '@' to mean
-"any string".  We don't want that behavior.  Fixed by disabling
-the optional features of dk.brics.automaton, thereby making '@'
-mean a literal '@' sign as expected.
-
-* issue 668 Fix inherited Read Access +2 not inheriting
-+
-Upload access (aka Read +2) did not inherit properly from the parent
-project (e.g. '\-- All Projects \--') if there was any branch level
-Read access control within the local project.  This was a coding
-bug which failed to consider the project inheritance if any branch
-(not just the one being uploaded to) denied upload access.
-
-=== Misc.
-* issue 641 Don't pass null arguments to hooks
-+
-Some hooks crashed inside of the server during invocation because the
-`gerrit.canonicalWebUrl` variable wasn't configured, and the hook
-was started out of an SSH or background thread context, so the URL
-couldn't be assumed from the current request.  The bug was worked
-around by not passing the `\--change-url` flag in these cases.
-Administrators whose hooks always need the flag should configure
-`gerrit.canonicalWebUrl`.
-
-* issue 652 Fix NPE during merge failure on new branch
-+
-Submitting a change with a missing dependency to a new branch
-resulted in a NullPointerException in the server, because the server
-tried to create the branch anyway, even though there was no commit
-ready because one or more dependencies were missing.  Fixed.
-
-* Fix NPE while matching `file:^` pattern on deleted files
-+
-Sending email notifications crashed with NullPointerException if the
-change contained a deleted file and one or more users had a project
-watch on that project using a `file:^` pattern in their filter.
-Fixed.
-
-* issue 658 Allow to use refspec shortcuts for push replication
-+
-A push refspec of `refs/heads/\*` in replication.config is now
-supported as a shorthand notation for `refs/heads/\*:refs/heads/\*`.
-
-* issue 676 Fix clearing of topic during replace
-+
-The topic was cleared if a replacement patch set was uploaded without
-the topic name.  The topic is now left as-is during replacement
-if no new topic was supplied.  If a new topic is supplied, it is
-changed to match the new topic given.
-
-* Allow ; and & to separate parameters in gitweb
-+
-gitweb.cgi accepts either ';' or '&' between parameters, but
-Gerrit Code Review was only accepting the ';' syntax.  Fixed
-to support both.
-
-=== Documentation
-* Fixed example for gerrit create-account.
-* gerrit.sh: Correct /etc/default path in error message
-
-== Version
-
-2765ff9e5f821100e9ca671f4d502b5c938457a5
diff --git a/ReleaseNotes/ReleaseNotes-2.1.6.1.txt b/ReleaseNotes/ReleaseNotes-2.1.6.1.txt
deleted file mode 100644
index 4626c7b..0000000
--- a/ReleaseNotes/ReleaseNotes-2.1.6.1.txt
+++ /dev/null
@@ -1,59 +0,0 @@
-= Release notes for Gerrit 2.1.6.1
-
-Gerrit 2.1.6.1 is now available:
-
-link:https://www.gerritcodereview.com/download/gerrit-2.1.6.1.war[https://www.gerritcodereview.com/download/gerrit-2.1.6.1.war]
-
-== Schema Change
-
-If upgrading from 2.1.6, there are no schema changes.  Replace the
-WAR and restart the daemon.
-
-If upgrading from 2.1.5 or earlier, there are schema changes.
-To upgrade:
-----
-  java -jar gerrit.war init -d site_path
-----
-
-== New Features
-* Display the originator of each access rule
-+
-The project access panel now shows which project each rule inherits
-from.  This can be informative when the inheritance chain is more
-than 1 project deep (for example C inherits from B, which inherits
-from A, which inherits from \-- All Projects \--).
-
-* Improved user->gerrit push speed
-+
-Pushing changes for review (or directly to a branch) should be
-quicker now, especially if the project contains many changes.
-
-* Allow Owner permission to inherit
-+
-The project Owner permission can now be inherited from any parent
-project, provided that the parent project is not the root level
-\-- All Projects \--.
-
-== Bug Fixes
-* Fix disabled intraline difference checkbox
-+
-Intraline difference couldn't be enabled once it was disabled by
-a user in their user preferences.  Fixed.
-
-* Fix push over HTTP
-+
-Users couldn't push to Gerrit over http://, due to a bug in the
-way user authentication was handled for the request.  Fixed.
-
-* issue 751 Update displayed owner group after group rename
-+
-The group owner field didn't update when a group was self-owned,
-and the self-owned group was renamed.  This left the owner name
-at the old name, leaving the user to wonder if the group owner was
-also reassigned by another user.  Fixed.
-
-* init: Fix string out of bounds when importing projects
-+
-Project importing died when the top level directory contained a
-".git" directory (usually by accident by the site administrator).
-Fixed.
diff --git a/ReleaseNotes/ReleaseNotes-2.1.6.txt b/ReleaseNotes/ReleaseNotes-2.1.6.txt
deleted file mode 100644
index 83689e7..0000000
--- a/ReleaseNotes/ReleaseNotes-2.1.6.txt
+++ /dev/null
@@ -1,307 +0,0 @@
-= Release notes for Gerrit 2.1.6
-
-Gerrit 2.1.6 is now available:
-
-link:https://www.gerritcodereview.com/download/gerrit-2.1.6.war[https://www.gerritcodereview.com/download/gerrit-2.1.6.war]
-
-== Schema Change
-
-*WARNING* This release contains multiple schema changes.  To upgrade:
-----
-  java -jar gerrit.war init -d site_path
-----
-
-
-== New Features
-
-=== Web UI
-* issue 312 Abandoned changes can now be restored.
-* issue 698 Make date and time fields customizable
-* issue 556 Preference to display patch sets in reverse order
-* issue 584 Allow deleted and/or uncommented files to be skipped
-
-* Use HistogramDiff for content differences
-+
-HistogramDiff is an adaptation of Bram Cohen's Patience Difference
-algorithm, and was recently included in the upstream JGit project.
-Patience Difference tends to produce more readable differences for
-source code files, and JGit's HistogramDiff implementation tends to
-run several times faster than the prior Myers O(ND) algorithm.
-
-* Automatic merge file content during submit
-+
-Project owners can now enable file-level content merge during submit,
-allowing Gerrit to automatically resolve many path conflict cases.
-This is built upon experimental merge code inherited from JGit,
-and is therefore still experimental in Gerrit.
-
-=== Change Query
-* issue 688 Match branch, topic, project, ref by regular expressions
-+
-Similar to other features in Gerrit Code Review, starting any of these
-expressions with \^ will now treat the argument as a regular
-expression instead of an exact string match.
-
-* Search changes by commit messages with `message:` operator.
-
-* issue 729 query: Add a \--all-approvals option to queries
-+
-The new flag includes approval information for all patch sets in the
-resulting query output.
-
-Notifications
-~~~~~~~~~~~~
-* Customize email notification templates
-+
-Email notifications are now driven by the Velocity template engine,
-and may be modified by the site administrator by editing a template
-file under `'$site_path'/etc/mail`.
-
-* issue 311 Clarify email texts/subject
-+
-The default email notification formatting was changed to make the
-subject lines and message bodies more consistent, and easier to
-understand.
-
-* issue 204 Add project list popup under Settings > Watched Projects
-+
-The project list panel makes it easier for users to browse all
-projects they have at least READ +1 access to, and add them to their
-watched project set so notifications can be configured.
-
-* stream-event support for all ref-update events
-+
-Whenever a ref is updated via either a direct push to a branch or a
-Gerrit change submission, Gerrit will now send a new "ref-updated"
-event to the event stream.
-
-=== User Management
-* SSO via client SSL certificates
-+
-A new auth.type of CLIENT_SSL_CERT_LDAP supports authenticating users
-using client SSL certificates.  This feature requires using the
-embedded Jetty web server with SSL enabled, and an LDAP directory to
-lookup individual account information.
-
-* issue 503 Inactive accounts may be disabled.
-+
-Administrators can manually update the accounts table, setting
-inactive = `Y` to mark user accounts inactive.  Inactive accounts
-cannot sign-in, cannot be added as a reviewer, and cannot be added
-to a group.
-
-* Improve the no-interactive-shell error message over SSH
-+
-Instead of giving a short 'no shell available' error, Gerrit Code
-Review now prints a banner letting the user know they have
-authenticated successfully, interactive shells are disabled, and how
-to clone a hosted project:
-+
-----
-$ ssh -p 29418 review.example.com
-
-  ****    Welcome to Gerrit Code Review    ****
-
-  Hi A. U. Thor, you have successfully connected over SSH.
-
-  Unfortunately, interactive shells are disabled.
-  To clone a hosted Git repository, use:
-
-  git clone ssh://author@review.example.com:29418/REPOSITORY_NAME.git
-
-Connection to review.example.com closed.
-----
-
-* Configure SSHD maxAuthTries, loginGraceTime, maxConnectionsPerUser
-+
-The internal SSH daemon now supports additional configuration
-settings to reduce the risk of abuse.
-
-=== Administration
-* issue 558 Allow Access rights to be edited by clicking on them.
-
-* New 'Project Owner' system group to define default rights
-+
-The new system group 'Project Owners' can be used in access
-rights to mean any user that is a member of any group that
-has the 'Owner' access category granted within that project.
-This system group is primarily useful in higher level projects
-such as '\-- All Projects \--' to define standard access rights
-for all project owners.
-
-* issue 557 Allow rejection of changes without Change-Id line.
-+
-Project owners can set a flag to require all commits to include
-the Gerrit specific 'Change-Id: I...' line during initial upload,
-reducing the risk of confusion when amends need to occur to
-incorporate reviewer feedback.
-
-* issue 613 create-project: Add --permissions-only option
-+
-The new flag skips creating the associated Git repository, making the
-new project suitable for use as a parent to inherit permissions from.
-
-* create-project: Optionally create empty initial commit
-+
-The `repo` tool used by Android doesn't like to clone an empty Git
-repository, making it difficult to setup a review for the initial file
-contents.  create-project can now optionally create an empty initial
-commit, permitting repo to sync the empty project.
-
-* Block off commands on a server for certain user groups.
-+
-The upload.allowGroup and receive.allowGroup settings in gerrit.config
-can be used to restrict which users can perform git clone/fetch or git
-push on this server.  This can be useful if clone/fetch should be
-limited to only site administrators, while normal users are supposed
-to use to less expensive mirror servers.
-
-* issue 685 Define gerrit.replicateOnStartup to control replication
-+
-The automatic replicate every project action that occurs during server
-startup can now be disabled by setting replicateOnStartup = false.
-This is primarily useful for sites with extremely large numbers of
-projects and replication targets, but runs the risk of having a target
-be out of date relative to the master server.
-
-* New non-blocking function category "NoBlock"
-+
-Site defined approval categories may now use the function "NoBlock"
-to permit scoring without blocking submission.  This is mostly
-useful for automated tools to provide optional feedback on a change.
-
-* Ability to reject commits from entering repository
-+
-The Git-note style branch `refs/meta/reject-commits` can be created
-by the project owner or site administrator to define a list of
-commits that must not be pushed into the repository.  This can be
-useful after performing a project-wide filter-branch operation to
-prevent the older (pre-filter-branch) history from being reintroduced
-into the repository.
-
-== Bug Fixes
-
-=== Web UI
-* issue 498 Enable Keyboard navigation after change submit
-* issue 691 Make ']' on last file go up to change
-* issue 741 Make ENTER work for 'Create Group'
-* issue 622 Denote a symbolic link in side-by-side viewer
-* issue 612 Display empty branch list when project has no repository
-* issue 672 Fix deleting exclusive branch level rights
-* issue 645 Display 'No difference' between unchanged patchsets
-* Display groups as links to group information
-* Remove ctrl-d keybinding to discard comment, honor browser default
-* Do not auto enable save buttons, wait for changes to be made
-* Disable 'Create Group' button if group name not entered
-* Show commit message in PatchScreen if old patch sets are compared
-* Fixed a number of focus and shortcut bugs in Firefox, Chrome
-
-* issue 487 Work around buggy MyersDiff by killing threads
-+
-MyersDiff sometimes locked up in an infinite loop when computing
-the intraline difference information for a file.  These threads
-are now killed after an administrator specified timeout
-(cache.diff_intraline.timeout, default is 5 seconds).  If the
-timeout is reached the file content is displayed without intraline
-differences.  This offers reduced functionality to the end-user, but
-prevents the "path of death" which usually took down a Gerrit server.
-
-* Hide access rights not visible to user
-+
-Users were able to view access rights for branches they didn't
-actually have READ +1 permission on.  This may have leaked
-information about branches and/or groups to users that shouldn't
-know about code names contained within either string.  Users that
-are not project owners may now only view access rights for branches
-they have at least READ +1 permission on.
-
-=== Change Query
-* issue 689 Fix age:4days to parse correctly
-* Make branch: operator slightly less ambiguous
-
-=== Push Support
-* issue 695 Permit changing only the author of a commit
-+
-Correcting only the author of a change failed to upload the new patch
-set onto the existing change, as neither the message nor the files
-were modified.  Fixed.
-
-* issue 576 Allow Push Branch +3 to force replace a tag
-+
-Previously it was not possible to replace a tag object, even if
-`git push \--force` was used.  Fixed.
-
-* issue 690 Refuse to run receive-pack if refs/for/branch exists
-+
-If a server repository was corrupted by an administrator manually
-creating a reference within the magical refs/for/ namespace, Gerrit
-became confused when changes were uploaded for review.  If this case
-occurs push now aborts very early, with a clear error message
-indicating the problem.  To recover an administrator must clear the
-refs/for/ namespace manually.
-
-* Allow receive-pack without Read +2 but with Push Head +1
-+
-Users who had direct branch push permission but lacked the ability to
-create changes for review were unable to push to a project.  Fixed.
-This (finally) makes Gerrit a replacement for Gitosis or Gitolite.
-
-=== Replication
-* issue 683 Don't assume authGroup = "Registered Users" in replication
-+
-Previously a misconfigured authGroup in replication.config may have
-caused the server to assume "Registered Users" instead of the group(s)
-admin actually wanted.  This may have caused the replication to see
-(or not see) the correct set of projects.
-
-* issue 482 Upon replication fail, automatically retry later
-+
-If replication fails (for example due to temporary network
-connectivity problems), other pending replication events to the
-same server are deferred and retried later until successful.
-
-* Replicate all refs received from push
-+
-Replication now replicates all references, not just those that
-appear under `refs/heads`, `refs/tags`, or `refs/changes`.  This
-fix may be relevant if the server supports user-private sandboxes
-such as `refs/dev/'$\{username\}'/*`.
-
-* issue 658 Allow refspec shortcuts (push = master) for replication
-
-=== User Management
-* Ensure proper escaping of LDAP group names
-+
-Some special characters may appear in LDAP group names, these must be
-escape when looking up the group information from JNDI, otherwise the
-lookup fails.  Fixed by applying the necessary escape sequences.
-
-* Let login fail if user name cannot be set
-+
-If the user name for a new account is supposed to import from LDAP
-but cannot because it is already in use by another user on this
-server, the new account won't be created.
-
-=== Administration
-* gerrit.sh: actually verify running processes
-+
-Previously `gerrit.sh check` claimed a server was running if the
-pid file was present, even if the process itself was dead.  It now
-checks `ps` for the process before claiming it is running.
-
-* Don't allow exclusive branch rights to block Owner inheritance
-+
-Exclusive branch level rights prevented the a higher level branch
-owner from managing the branch rights, unless they had an additional
-access right for the exclusive rights.  Now Owner inheritance cannot
-be blocked, ensuring that the higher level owner can manage their
-entire namespace.
-
-* Allow overriding permissions from parent project
-+
-Permissions in the parent project could not be overridden in the
-child project.  Permissions can now be overidden if the category,
-group name and reference name all match.
-
-== Version
-ef16a1816f293d00c33de9f90470021e2468a709
diff --git a/ReleaseNotes/ReleaseNotes-2.1.7.2.txt b/ReleaseNotes/ReleaseNotes-2.1.7.2.txt
deleted file mode 100644
index 9c9e6e1..0000000
--- a/ReleaseNotes/ReleaseNotes-2.1.7.2.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-= Release notes for Gerrit 2.1.7.2
-
-Gerrit 2.1.7.2 is now available:
-
-link:https://www.gerritcodereview.com/download/gerrit-2.1.7.2.war[https://www.gerritcodereview.com/download/gerrit-2.1.7.2.war]
-
-== Bug Fixes
-* issue 997 Resolve Project Owners when checking access rights
-+
-Members of the 'Project Owners' magical group did not always have
-their project owner privileges when Gerrit Code Review was looking
-for "access to any ref" at the project level. This was caused by
-not expanding the 'Project Owner's group to the actual ownership
-list. Fixed.
-
-* issue 999 Do not reset Patch History selection on navigation
-+
-Navigating to the next/previous file lost the setting of the
-"Old Version" made under the "Patch History" expandable control
-on a specific file view. This was accidentally broken when the
-"Old Version History" control was added to the change page. Fixed.
-
-* Fix API breakage on ChangeDetailService
-+
-Version 2.1.7 broke the Gerrit Code Review plugin for Mylyn Reviews
-due to an accidental signature change of one of the remote JSON
-APIs. The ChangeDetailService.patchSetDetail() method is back to the
-old signature and a new patchSetDetail2() method has been added to
-handle the newer calling convention used in some contexts of the
-web UI.
diff --git a/ReleaseNotes/ReleaseNotes-2.1.7.txt b/ReleaseNotes/ReleaseNotes-2.1.7.txt
deleted file mode 100644
index ad440b5..0000000
--- a/ReleaseNotes/ReleaseNotes-2.1.7.txt
+++ /dev/null
@@ -1,378 +0,0 @@
-= Release notes for Gerrit 2.1.7
-
-Gerrit 2.1.7 is now available:
-
-link:https://www.gerritcodereview.com/download/gerrit-2.1.7.war[https://www.gerritcodereview.com/download/gerrit-2.1.7.war]
-
-== Schema Change
-*WARNING* This release contains multiple schema changes.  To upgrade:
-----
-  java -jar gerrit.war init -d site_path
-----
-
-To export prior review information into `refs/notes/review` branches
-within each Git repository:
-----
-  java -jar gerrit.war ExportReviewNotes -d site_path
-----
-
-== Memory Usage Increase
-*WARNING* The JGit delta base cache, whose size is controlled by
-`core.deltaBaseCacheLimit`, has changed in this release from being a
-JVM-wide singleton to per-thread. This alters the memory usage, going
-from 10M for the entire JVM to 10M per concurrent operation. The
-change improves performance on big repositories, but may need a larger
-`container.heapLimit` if the number of concurrent operations is high.
-
-== New Features
-
-=== Change Data
-* issue 64 Create Git notes for submitted changes
-+
-Git notes are automatically added to the `refs/notes/review`.
-
-=== Query
-* Search project names by substring
-+
-Entering a word with no operator (for example `gerrit`) will be
-expanded to all projects whose names contain the string 'gerrit'.
-
-* issue 722 ownerin and reviewerin search predicates
-+
-New search predicates `ownerin:'GROUP'` and `reviewerin:'GROUP'`
-search for changes whose owner or that has a reviewer in (or not
-in if prefixed with `-`) the specified group.
-
-=== Web UI
-* Add reviewer/verifier name beside check/plus/minus
-+
-Change lists (such as from a search result, or in a user's dashboard)
-can now optionally display the name of the reviewer or verifier who
-gave the score being shown in the summary column. This is an optional
-per-user preference that can be enabled in the Settings screen.
-
-* Add a "revert change"-button to a submitted patchset
-+
-Clicking "Revert Change" creates a new change with the inverse of
-the submitted patch set ready for review and submission. This makes
-it easy to undo a build-breaking change right from the web UI.
-
-* issue 194 Diff patch sets
-+
-Change pages now offer a selection box, "Old Version History",
-to compare patch sets against one another and view only the files
-that differ between two patch sets. This new feature can speed up
-re-reviewing a change.
-
-* issue 913 Support different color palette when not signed in
-+
-Site administrators can configure a different theme in gerrit.config for
-the signed-in and signed-out states, making it more obvious to site users
-they are currently signed-in (or not).
-
-* Add parent info to each change screen Patch Set
-+
-This mirrors the data shown in the 'Commit Message' file, making
-it easy to identify the parent(s) of the commit without opening
-up the Commit Message or gitweb.
-
-* Remove the SSH key loading applet
-+
-The Java based SSH key loading applet is no longer included as part of
-the Gerrit Code Review interface. Users need to copy and paste their
-SSH public key files by hand.
-
-
-=== SSH Commands
-* issue 674 Add abandon/restore to `gerrit review`
-* Add `gerrit version` command
-
-=== Change Upload
-* Display a more verbose "you are not author/committer" message
-
-=== Documentation
-* Detailed error message explanations
-+
-Most common error messages are now described in detail in the
-documentation under 'User Guide', 'Error Messages'.  Each error is
-explained, along with possible courses of action for an end-user to
-resolve the issue.
-
-* issue 905 Document reverse proxy using Nginx
-* Updated system scaling data in 'System Design'
-
-=== Outgoing Mail
-* Optionally add Importance and Expiry-Days headers
-+
-New gerrit.config variable `sendemail.importance` can be set to `high`
-or `low` to classify outgoing mail, and `sendemail.expiryDays` can be
-set to suggest clients should automatically expire or expunge messages
-this many days after being sent.
-
-* Add support for SMTP AUTH LOGIN
-
-=== Administration
-* Group option to make group visible to all users
-+
-A new group option permits the group to be visible to all users,
-rather than just its members. Some sites may find this useful for
-a project owners group, to help users contact the relevant folks.
-
-* Group option to only email change authors on updates
-+
-A new group option causes all users who are a member of that group to
-only send email notifications to change authors, excluding reviewers
-and watchers. This can be useful for automated build and testing users
-to reduce the amount of email sent to reviewers.
-
-* Hide non-visible groups from suggestion service
-+
-Groups that are not visible to a user are not shown as suggestions in
-contexts where a group name completion is supported.  The previously
-mentioned 'make group visible to all users' flag can be used on a
-per-group basis to expose groups to everyone.
-
-* Use suggest.accounts to control user completion suggestions
-+
-The new `suggest.accounts` configuration variable in gerrit.config
-can control how suggestions for users are offered.
-
-* Permit groups to be members of other groups
-+
-Groups can now be a member of another group, users are automatically
-a member of the transitive closure of their group membership.
-
-* READ +3 permission required to upload merges
-+
-The new READ +3 permission is required to upload merge commits. Users
-with only READ +2 permission may upload new changes, but not merges.
-The schema upgrade will automatically convert any current READ +2
-access lines to be READ +3 to maintain prior behavior.
-
-* "Show Inherited Rights" checkbox in Project Access
-+
-This checkbox enables showing or hiding the lines that are inherited
-from the parent project. This makes it easier to find the rules that
-are unique to the project being viewed.
-
-* Allow single letter usernames
-+
-Username requirements are relaxed to permit single letter usernames.
-
-* Fine-grained control over authentication cookie
-+
-Site administrators can now set `auth.cookieSecure` to request
-browsers only send the cookie over https:// connections, preventing
-eavesdropping.
-+
-Site administrators can now set `auth.cookiePath` to override the
-path used for the authentication cookie, which may be necessary if
-a reverse proxy maps requests to the managed gitweb.
-
-=== Replication
-* Add adminUrl to replication for repository creation
-+
-Replication remotes can be configured with `remote.name.adminUrl` to
-indicate an SSH path for repository creation that is different from
-the normal push URL in `remote.name.url`. The adminUrl can be used by
-Gerrit to create a new repository when the normal URL is a non-SSH
-URL, such as git:// or http://.
-
-* Support HTTP authentication for replication
-+
-Replication can now be performed over an authenticated smart HTTP
-transport, in addition to anonymous Git and authenticated SSH.
-
-=== Misc.
-* Alternative URL for Gerrit's managed Gitweb
-+
-The internal gitweb served from `/gitweb` can now appear to be from a
-different URL by using a reverse proxy that does URL rewriting.
-
-* Internal dependencies updated
-+
-Updated H2 Database to 1.2.147, PostgreSQL JDBC Client to 9.0-801,
-openid4java to 0.9.6, ANTLR to 3.2, GWT to 2.1.1, JSch to 0.1.44, Gson
-to 1.6, Apache Commons Net to 2.2, Apache Commons Pool to 1.5.5, JGit
-to 0.12.1.53-g5ec4977, MINA SSHD to 0.5.1-r1095809.
-
-== Bug Fixes
-
-=== Web UI
-* issue 853 Incorrect side-by-side display of modified lines
-+
-A bug in JGit lead to the side-by-side view displaying wrong and
-confusing output of modified lines. This bug also caused some
-automatic merges to be carried out incorrectly, usually resulting in
-compile failures. Fixed.
-
-* Disallow negative/zero columns in difference views
-+
-Previously a negative or zero value in the number of columns field
-would break the user's account and prevent them from viewing any file
-differences through the web UI. Values less than 1 are now rejected,
-and existing broken accounts will work again by resetting to a sane
-column count.
-
-* Fix branches table displaying symbolic references (e.g. HEAD).
-+
-In the project's "Branches" tab symbolic references like HEAD always
-displayed the wrong target name. Fixed to display the target name of
-the reference.
-
-* Disallow deletion of HEAD and targets of symbolic refs
-+
-Deleting the target of a symbolic reference causes the symbolic to
-become dangling, and it becomes useless.
-
-* Prevent creating 'refs/for/branch' in web UI.
-
-* issue 804 Display proper error message on invalid group
-+
-Attempting to browse a group that does not exist or that is not
-visible to the current user now displays a proper error message,
-instead of a scary generic "Application Error, Server Error".
-
-* issue 822 Up To Change link activates last browsed patch set
-* issue 846 Disable buttons during RPCs
-* issue 915 Always display button text in black
-* issue 946 Make sure that ENTER works in all text fields
-* issue 963 Go back to change screen if 'Publish and Submit' fails
-* Enable "Sign Out" when auth.type = CLIENT_SSL_CERT_LDAP.
-* Fix handling of "Session Expired" with SSL certificates.
-* Fix compatibility with recent releases of Gitweb.
-* Fix "review" link in Gitweb integration.
-* Always display button text in black
-* Always disable content merge option if user can't change project
-
-=== commit-msg Hook
-* issue 922 Fix commit-msg hook to run on Solaris
-
-=== Outgoing Mail
-* issue 780 E-mail about failed merge should not use Anonymous Coward
-+
-Some email was sent as Anonymous Coward, even when the user had a
-configured name and email address. Fixed.
-
-* Fix calculation of project owners
-+
-When sending out new changes for review, Gerrit automatically
-tries to address the project owners on the To line of the outgoing
-message. This sometimes included the owner of a branch. Fixed.
-
-* Do not email reviewers adding themselves as reviewers
-* Fix comma/space separation in email templates
-
-=== Pushing Changes
-* Avoid huge pushes during refs/for/BRANCH push
-+
-With Gerrit 2.1.6, clients started to push possibly hundreds of
-megabytes for what should be a tiny patch set changing 1 line of 1
-file. This large push was caused by the server advancing ahead of the
-client (e.g. due to another change being submitted) and the client not
-having fetched the new version. Fixed by adding some recent history to
-the advertisement so that clients don't have to upload the entire
-project for a small change.
-
-* issue 414 Reject pushing multiple commits with same Change-Id
-+
-If multiple new commits are uploaded to a refs/for/ branch and
-they have the same Change-Id, the push is now rejected.  Within
-a project, the Change-Id should be unique and users should either
-squash the commits, or modify them to use unique Change-Ids.
-
-* issue 635 Match Change-Id by project and branch combination
-* issue 635 Auto close changes by Change-Id on same branch only
-+
-Changes are automatically closed during direct push to branch only if
-the Change-Id line matches and the branch name matches. Previously
-changes were closed automatically if only the Change-Id matched,
-making it difficult to cherry-pick changes across branches.
-
-* issue 947 Disallow to push to non-connected target
-+
-If a repository stores disconnected history graphs on different
-branches, changes may only be pushed to the correct branch.
-
-* Always do Change-Id checks on receiving commits
-+
-Ensure Change-Ids aren't incorrectly used, even if the project does
-not require them to be present.  Previously some validity checks were
-only performed if the project required Change-Id lines.
-
-* Make Change-Id requirement applicable only to reviews
-+
-Change-Ids are not required when directly pushing to a branch. This
-permits projects that normally require Change-Ids to still perform
-direct branch pushes for updates received from an upstream project
-that does not use Change-Ids.
-
-* Reject invalid Change-Id lines
-+
-Severely malformed Change-Id lines were previously accepted by the
-server. These are now rejected.
-
-* Fix error message returned on push to closed change
-+
-If a commit with a Change-Id was pushed, and the corresponding change
-was already closed, the server incorrectly errored out with "No new
-changes". Now it reports the change is closed and does not accept a
-new patch set.
-
-* Fix error message for rejecting a change of another project
-+
-Instead of saying 'change not found' when pushing to a commit to
-a refs/changes/NNNN reference that belongs in another project, the
-error now indicates the change belongs to another project.
-
-* Better help message when commit message is malformed
-+
-If the commit message is badly formatted Gerrit displays an error
-message to the client. This message has been extended to offer
-suggestions on how to correct the commit message.
-
-* Log warning on 'change state corrupt' error
-+
-If a change state corrupt error is reported to a client, there was
-no mention if it on the server error log. Now it is reported so the
-site administrator also knows about it.
-
-=== SSH Commands
-* issue 755 Send new patchset event after its available
-* issue 814 Evict initial members of group created by SSH
-* issue 879 Fix replication of initial empty commit in new project
-* Disallow setting a project as parent for itself
-* Automatically create user account(s) as necessary
-* Move SSH command creation off NioProcessor threads
-
-=== Administration
-* Enable git reflog for all newly created projects
-+
-Previously branch updates were not being recorded in the native Git
-reflogs ($GIT_DIR/logs/refs/heads) due to a misconfiguration on new
-projects created by gerrit create-project. Fixed.
-
-* Fix IllegalArgumentException caused by non-ASCII user names
-+
-An invalid username is now always reported in UTF-8.
-
-* PostgreSQL: conditional installation of PL/pgSQL.
-+
-Conditional installation is needed to install Gerrit on PostgreSQL 9.
-
-* issue 961 Fix NPE on Gerrit startup if mail.from is invalid
-* issue 966 Enable git:// download URLs if canonicalGitUrl set
-* Stop logging 'keepalive@jcraft.com' errors in error_log
-* gerrit.sh: Fix issues on SuSE Linux
-* gerrit.sh: Fix issues on Solaris
-* gerrit.sh: Support spaces in JAVA_HOME
-
-=== Documentation
-* issue 800 documentation: Show example of review -m
-* issue 896 Clarify that $\{name\} is required for replication.
-* Fix spelling mistake in 'Searching Changes' documentation
-* Fix spelling mistake in user-upload documentation
-* Document cache diff_intraline
-* Document change set dependencies and cherry-pick
-* Include user in scp commands to copy commit hook
-* Adjust documentation to build with current AsciiDoc version
diff --git a/ReleaseNotes/ReleaseNotes-2.1.8.txt b/ReleaseNotes/ReleaseNotes-2.1.8.txt
deleted file mode 100644
index e1ed11c..0000000
--- a/ReleaseNotes/ReleaseNotes-2.1.8.txt
+++ /dev/null
@@ -1,54 +0,0 @@
-= Release notes for Gerrit 2.1.8
-
-Gerrit 2.1.8 is now available:
-
-link:https://www.gerritcodereview.com/download/gerrit-2.1.8.war[https://www.gerritcodereview.com/download/gerrit-2.1.8.war]
-
-== New Features
-* Add cache for tag advertisements
-+
-When READ level access controls are used on references/branches, this
-cache provides a massive performance boost. On some repositories,
-no-op Git client requests can go from 7.910s to 0.550s.  Since all
-of the time reduction is server CPU, this is a major performance
-improvement for busy servers.
-
-* Substantially speed up pushing changes for review
-+
-Pushing changes to big projects was very slow, for similar issues
-as the READ level access controls. Push checks have been improved,
-reducing the amount of server CPU required to validate a push for
-review is connected to the branch its intended for.
-
-* Avoid costly findMergedInto during push to refs/for/*
-+
-Checking to see if a new commit uploaded for review has already been
-merged into a branch turns out to be expensive, and not very useful.
-Since the commit is brand new to the server, it cannot possibly ever
-have been merged. Skip the merge check to get a major performance
-improvement on upload to big projects.
-
-* Allow serving static files in subdirectories
-+
-The /static/ subdirectory can now serve static files contained within
-subdirectories. This change also patches the code to perform better
-checks to ensure the requested URL is actually in the subdirectory.
-These additional checks are only relevant on Windows servers, where
-MS-DOS compatibility may have permitted access to special device
-files in any directory, rather than just the "\\.\" device namespace.
-
-== Bug Fixes
-* issue 518 Fix MySQL counter resets
-+
-MySQL databases lost their change_id, account_id counters after
-server restarts, causing duplicate key insertion errors. Fixed.
-
-* issue 1019 Normalize OpenID URLs with http:// prefix
-+
-OpenID standards require sites to add "http://" to an OpenID
-identifier if the user did not enter it themselves.
-
-* Ignore PartialResultException from LDAP.
-+
-Instead of crashing with an exception, partial results are ignored
-when configured to be ignored.
diff --git a/ReleaseNotes/ReleaseNotes-2.1.9.txt b/ReleaseNotes/ReleaseNotes-2.1.9.txt
deleted file mode 100644
index 63bcb20..0000000
--- a/ReleaseNotes/ReleaseNotes-2.1.9.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-= Release notes for Gerrit 2.1.9
-
-There are no schema changes from link:ReleaseNotes-2.1.8.html[2.1.8].
-
-link:https://www.gerritcodereview.com/download/gerrit-2.1.9.war[https://www.gerritcodereview.com/download/gerrit-2.1.9.war]
-
-== Bug Fixes
-* Patch JGit security hole
-+
-The security hole may permit a modified Git client to gain access
-to hidden or deleted branches if the user has read permission on
-at least one branch in the repository. Access requires knowing a
-SHA-1 to request, which may be discovered out-of-band from an issue
-tracker or gitweb instance.
diff --git a/ReleaseNotes/ReleaseNotes-2.1.txt b/ReleaseNotes/ReleaseNotes-2.1.txt
deleted file mode 100644
index 28cc90d..0000000
--- a/ReleaseNotes/ReleaseNotes-2.1.txt
+++ /dev/null
@@ -1,371 +0,0 @@
-= Release notes for Gerrit 2.1
-
-Gerrit 2.1 is now available in the usual location:
-
-link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]
-
-
-== New site_path Layout
-
-The layout of the `$site_path` directory has been changed in 2.1.
-Configuration files are now stored within the `etc/` subdirectory
-and will be automatically moved there by the init subcommand.
-
-== Upgrading From 2.0.x
-
-  If the server is running a version older than 2.0.24, upgrade the
-  database schema to the current schema version of 19.  Download
-  'schema-upgrades003_019.zip' from the download area and run the
-  scripts by hand as listed in README until the server is caught up.
-
-Run init to convert the layout of $site_path:
-----
-  java -jar gerrit.war init -d $site_path
-----
-
-If there is a GerritServer.properties file handy, ensure it is in the
-current working directory or inside of $site_path when running init.
-If present, init will reuse this information rather than prompting
-for it.  If the file is not found, init will prompt for database
-connection information.
-
-While moving the server's configuration files into the new
-etc/ subdirectory, init will also move secret settings such as
-sendemail.smtpPass and ldap.password out of gerrit.config into a
-read-protected secure.config file.
-
-== New Daemon Mode
-
-Gerrit 2.1 and later embeds the Jetty servlet container, and
-runs it automatically as part of `java -jar gerrit.war daemon`.
-This is the preferred method of running Gerrit Code Review, and is
-how sites like review.source.android.com are operating.
-
-To simplify management on UNIX systems an rc.d style startup script
-is created in `$site_path/bin/gerrit.sh`.  This script can be used
-to start and stop the background daemon process.  When started
-from this script the daemon calls itself `GerritCodeReview` in ps,
-but may still show up in top as `java`.
-
-Configuration of the daemon is handled by gerrit.config.  For more
-information see the 2.1 documentation.
-
-link:http://gerrit.googlecode.com/svn/documentation/2.1/index.html[http://gerrit.googlecode.com/svn/documentation/2.1/index.html]
-
-
-== New Features
-
-* issue 19     Link to issue tracker systems from commits
-+
-Hyperlinks from commit messages and any inline comments to
-bug tracking systems can be enabled by configuring one or
-more commentlink regular expressions in gerrit.config.
-
-* Git replication security
-+
-Git replication can now be controlled on the sending side by
-configuring one or more authGroups for a remote and granting
-READ +1 access to only certain projects.
-
-* Better repo upload/git push throughput
-+
-MINA SSHD was misconfiguring the host's TCP/IP stack, this
-limited throughput of git push to under 16 KiB/s.  Fixed.
-Its such a huge improvement that its an important feature,
-rather than a bug fix.  :-)
-
-* issue 320    Queue SSH commands and ensure consistent throughput
-+
-SSH commands are entered into a queue and executed in FIFO order
-as processor capacity becomes available.  The queue enables
-the server to work on a finite number of commands at once and
-ensures running commands complete in a timely fashion, no matter
-how many concurrent connections are being established.
-The queue allows sites to maintain consistent throughput without
-thrashing, even as the number of requests increase beyond server
-capacity.  The change was made in anticipation of `repo sync`
-learning how to fetch all projects at once, inducing a load of
-over 200 concurrent commands per user/Android checkout.
-Server administrative commands such as kill or gsql (below) bypass
-the queue and are allowed to execute as soon as they are received.
-
-* kill: Support killing any queued task
-+
-A new administrative kill command was introduced to terminate
-any queued or running tasks.  Unlike UNIX kill, a killed task
-will continue until its next safe interruption point, which is
-usually at the next network read or write.
-
-* issue 327    gsql: query tool on command line and SSH
-+
-Gerrit supports an interactive SQL query tool for administrators.
-The query tool is available over SSH as `gerrit gsql`, or locally
-as `java -jar gerrit.war gsql`.  The query tool is primarily
-useful with H2 databases, where the database is only accessible
-to the running Java process.
-
-* issue 202    Self contained daemon mode
-* issue 328    daemon: Automatically log into $site_path/logs
-* daemon: Automatically compress our log files
-+
-As noted above, Jetty 7.0.1.v20091125 is now bundled, making new
-site installation easier.  Logs from daemon mode are written
-out to the site's logs/ subdirectory.  Logs are rotated and
-compressed daily.
-
-* issue 330    init: Create a command to setup a new site
-* issue 343    init: Create database indexes during schema creation
-* Remove CreateSchema command
-+
-The init command can be used to initialize a new site, or
-as noted above, to upgrade an existing site to the current
-software version.  Since init now does the work of CreateSchema,
-and everything else that used to be listed out as individual
-steps in the installation guide, CreateSchema was deleted.
-
-* issue 325    Allow secure.config to overlay gerrit.config
-* Configure database from gerrit.config
-+
-Database connectivity is now configured out of gerrit.config
-and secure.config, rather than GerritServer.properties.
-
-* Bundle PostgreSQL, H2, DBCP, MySQL, Bouncy Castle
-+
-JDBC drivers for PostgreSQL, H2, and the Apache Commons DBCP
-connection pool implementation are now bundled, reducing the
-number of external dependencies that must be obtained before
-getting a working installation.
-The MySQL driver is automatically downloaded and verified by
-init if required, as is the Bouncy Castle Crypto provider.
-These JARs are not packaged in the standard distribution due to
-export and/or license restrictions.
-
-* issue 183    Support invoking gitweb from within Gerrit
-+
-The standard gitweb.cgi can now be automatically configured and
-executed through Gerrit's servlet container, making it easier to
-publish a repository for browsing on the web.
-Project level access controls are honored when browsing through
-this gitweb interface.
-
-* issue 105    Support OpenID when behind an HTTP proxy
-* issue 323    Use JGit's http_proxy based initialization
-+
-HTTP proxies are now supported for OpenID authentication, as
-well as for init's optional external library download.
-
-* Add a Register link when using LDAP authentication
-+
-When auth.type is LDAP the Register link in the top right corner
-can point to an administrator defined URL.  This external URL
-might be as simple as a 'mailto:...' link, to help the user
-request a new LDAP account from the directory administrators.
-
-* Switch remote JSON services to use JSON-RPC 2.0
-+
-The JSON-RPC interface now speaks the JSON-RPC 2.0 draft
-specification, in addition to the prior JSON-RPC 1.1
-specification previously used.
-
-* issue 336    Update MINA SSHD to SVN 891122
-* issue 324    Update JGit to 0.5.1.51-g96b2e76
-* Update JUnit to 3.8.2
-* Update args4j to 2.0.16
-* Update slf4j-log4j12 to 1.5.8
-* Update Ehcache to 1.7.1
-* Update commons-pool to 1.5.4
-* Update H2 to 1.2.125
-* Update to gwtjsonrpc 1.2.0, gwtexpui 1.1.4
-+
-Most dependencies were updated to their current stable versions.
-
-== Bug Fixes
-
-* issue 259    Improve search hint to include owner:email
-+
-The hint text in the search box in the upper right corner has
-been improved to suggest owner:email and reviewer:email, as
-these tags were not discoverable.
-
-* issue 335    daemon: Refuse to launch unless gerrit.config exists
-+
-Gerrit now refuses to launch until the site path has been
-properly initialized with init.  This is true both in daemon
-mode and also when deployed inside of any servlet container.
-
-* issue 152    Allow adding users who are missing a preferred email
-+
-The user suggestion boxes now permit adding a user that has not
-yet selected a preferred email address on their contact panel.
-
-* issue 319    Automatically set preferred email to first configured
-+
-If a user has no email addresses, the first address they register
-through the next OpenID login, LDAP login, or 'Register New Email'
-feature will be automatically set as the preferred email address
-for their account.
-
-* issue 356    Fix committer identity on cherry-pick
-+
-The committer identity created when cherry-picking a change was
-formatted incorrectly, it used the internal account identity.
-Fixed to use the submitter's preferred email address only.
-
-* issue 345    Make "call11" readable in file content
-+
-The prior font made the string "call11" (c-a-ell-ell-one-one)
-impossible to read because the ell and one looked the same.
-Fixed by changing to different fonts for the fixed width file
-content display.
-
-* Automatically make first user account administrator
-+
-To simplify installation, the first user to login to a brand
-new site is added to the 'Administrators' group.  This avoids
-the need to update the database manually via SQL and restart
-the daemon to have it be picked up.
-
-* Always trim Change-Id lines to handle whitespace
-+
-Some users were adding trailing whitespace on a Change-Id line
-by accident, causing Gerrit to not always honor it when uploading
-a replacement patch.  Fixed.
-
-* Fix duplicate branches in the branches panel
-+
-The Branches tab under a project displayed the HEAD branch twice,
-but every other branch once.  Fixed.
-
-* Enforce all HTTP requests through SSL
-+
-JSON-RPC requests are now required to be over SSL if the site
-prefers to use SSL for communication.
-Prior to 2.1 the JSON-RPC requests from the web UI were performed
-over https:// if the web UI loaded over https://, but JSON-RPC
-requests from other tools (e.g. a command line script) were
-still allowed over plain text HTTP.
-
-* Work around NPE when patch list fails to compute
-+
-Rather than return NullPointerException to the browser return
-a "not found" error, as the source of the null pointer is the
-underlying diff operation returned no results.
-
-* Fix stuck "Loading Gerrit Code Review ..."
-+
-Many users have noticed that after about a week of server uptime
-Gerrit no longer loads in their browser, until the server is
-restarted.  This was usually caused by Jetty unpacking the WAR
-file contents to /tmp, and the system having a cron task that
-deleted files more than a week old from /tmp.
-Under the daemon command the WAR file contents are unpacked into
-`$HOME/.gerritcodereview/tmp`, which should be isolated from
-the host system's /tmp cleaner.
-
-== Other=
-
-* Pick up gwtexpui 1.1.4-SNAPSHOT
-* Merge change Ia64286d3
-* Merge branch 'maint-2.0.24.1'
-* Merge change Ic6f00304
-* Merge branch 'maint-2.0.24.2'
-* Add H2 database as a test dependency
-* Update Ehcache to 1.7.0
-* Fix formatting
-* Rewrite our build as modular maven components
-* Forbid use of anonymous servlets on any container
-* Use listeners to manage server startup/shutdown
-* Load additional JARs from $site_path/lib
-* Fix PostgreSQL/H2 access under gwtdebug sessions
-* Fix Become link in hosted mode debugging sessions
-* Fix ssh:// URLs on change pages
-* daemon: Update help for --slave option
-* daemon: Remove -DGerritServer from documentation
-* Launcher: Clarify the purpose of the daemon command
-* daemon: Fix --site-path documentation
-* Remove unused imports from pgm.DataSourceProvider
-* launcher: Don't print stack trace with reflection frames
-* Move H2 database down into $site_path/db
-* Remove dead code identified by Eclipse 3.5.1
-* Add missing default serialVersionUID
-* pgm_daemon: Remove unnecessary -DGerritServer flag
-* Move configuration files under $site_path/etc
-* Update documentation to point to etc subdirectory
-* Display the full stack trace if requested
-* init: Don't delete site path on database creation fail
-* Simplify errors reported by command line database fail
-* init: Correct defaults for httpd.listenUrl in --batch
-* issue 341    gsql: Fix \d on H2
-* gsql: Improve formatting of column types and indexes
-* pgm: Move non commands into a util package
-* issue 342    gsql: Reduce connections used to only 1
-* WorkQueue: Drop the word "-thread" from thread names
-* documentation: Correct links in dev-design
-* Fix port number in ssh pull lines in emails
-* Update MINA SSHD to 0.3.0
-* Update Jetty to 7.0.1.v20091125
-* launcher: Refactor how we return the status code
-* cat, ls: move inside our main program package
-* Default temporary directory to $HOME/.gerritcodereview
-* Clean up stale empty temporary directories
-* daemon: Unpack the WAR contents to a local directory
-* daemon: Run correctly under Eclipse debugger
-* Create a rc.d style start/stop script for our daemon
-* Remove unused ADMIN_PEOPLE link
-* Ignore unsupported ulimit -x errors
-* Use more portable printf instead of echo -n
-* Support starting as current user without start-stop-daemon
-* Make startup output universally the same
-* Get the canonical path to our temporary directory
-* init: Start daemon and open web browser when done
-* documentation: Clean up references to 'Gerrit2'
-* Cleanup the reflog identity generation
-* Update to gwtjsonrpc 1.2.0-SNAPSHOT
-* init: Configure gerrit.canonicalWebUrl if reverse proxy
-* tools/version.sh: Quick hack to edit our Maven version
-* Call the next version 2.1
-* documentation: Rewrite installation guide
-* Fix gerrit.sh to run properly on SuSE systems
-* documentation: Fix formatting of remote.name.authGroup
-* Fix missing @Override warning in IoUtil
-* Don't enable replication if replication.config is empty
-* Give H2 a canonical file path
-* init: Add --no-auto-start to prevent starting the daemon
-* init: Support updating an existing site configuration
-* init: Open browser to gerrit.canonicalWebUrl
-* daemon: Allow httpd.listenUrl to end with /
-* issue 358    init: Don't abort on empty directory
-* init: Initialize system_config.site_path
-* Remove dead class MessagePanel
-* issue 331    documentation: Update developer docs
-* documentation: Link to apache2 reverse proxy setup
-* init: Fix LDAP prompts to store to ldap section
-* init: Store httpd.sslKeyPasword in secure.config
-* init: Fix a minor source code formatting error
-* commentlink: Support raw HTML replacements
-* documentation: Cleanup formatting in gerrit-config
-* Delete legacy schema upgrade scripts
-* Remove legacy tools/to_jetty.sh
-* Remove standalone Jetty 6.x support scripts
-* Move all resource files into src/main/resources
-* init: Move optional library download configuration
-* init: Refactor init to be small parts created
-* Test SitePaths class
-* Test SocketUtil class
-* Test init's Libraries class
-* Test init's upgrade from 2.0.x layout to 2.1 layout
-* pgm_daemon launch: Run ../test_site like docs suggest...
-* tools/version.sh: Don't mangle the git describe output
-* Use SitePaths to locate the logs directory
-* Resolve out any symlinks before starting logging
-* Mark compressed log files read-only
-* tools/release.sh: Simplify our release build process
-* Teach Main to check the Java runtime version
-* documentation: Mention Google Code Prettify in licens...
-* Refactor GitRepositoryManager to be an interface
-* issue 346    Fix duplicate branches showing in the Branches tab
-* Completely remove GerritServer.properties
-* Clean up the DWIMery for database.* configuration set...
-* Never compress a pid file under $site_path/logs
-* Fix reading the $site_path/etc/ssh_host_key in serial...
-* gerrit 2.1
\ No newline at end of file
diff --git a/ReleaseNotes/ReleaseNotes-2.10.1.txt b/ReleaseNotes/ReleaseNotes-2.10.1.txt
deleted file mode 100644
index 72d26d1..0000000
--- a/ReleaseNotes/ReleaseNotes-2.10.1.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-= Release notes for Gerrit 2.10.1
-
-There are no schema changes from link:ReleaseNotes-2.10.html[2.10].
-
-Download:
-link:https://www.gerritcodereview.com/download/gerrit-2.10.1.war[
-https://www.gerritcodereview.com/download/gerrit-2.10.1.war]
-
-== Bug Fixes
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2260[Issue 2260]:
-LDAP horrendous login time due to recursive lookup.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3210[Issue 3210]:
-Null Pointer Exception for query command with --comments switch.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3211[Issue 3211]:
-Intermittent Null Pointer Exception when showing process queue.
-
-== LDAP
-
-* Several performance improvements when using LDAP, both in the number of LDAP
-requests and in the amount of data transferred.
-
-* Sites using LDAP for authentication but otherwise rely on local Gerrit groups
-should set the new `ldap.fetchMemberOfEagerly` option to `false`.
-
-== OAuth
-
-* Expose extension point for generic OAuth providers.
-
-== OpenID
-
-* Add support for Launchpad on the login form.
-
-* Remove pre-configured Google OpenID 2.0 provider from the login form, that is
-going to be shut down on 20, April 2015.
diff --git a/ReleaseNotes/ReleaseNotes-2.10.2.txt b/ReleaseNotes/ReleaseNotes-2.10.2.txt
deleted file mode 100644
index 49be04e..0000000
--- a/ReleaseNotes/ReleaseNotes-2.10.2.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-= Release notes for Gerrit 2.10.2
-
-There are no schema changes from link:ReleaseNotes-2.10.1.html[2.10.1].
-
-Download:
-link:https://www.gerritcodereview.com/download/gerrit-2.10.2.war[
-https://www.gerritcodereview.com/download/gerrit-2.10.2.war]
-
-== Bug Fixes
-
-* Work around MyersDiff infinite loop in PatchListLoader. If the MyersDiff diff
-doesn't finish within 5 seconds, interrupt it and fall back to a different diff
-algorithm. From the user perspective, the only difference when the infinite
-loop is detected is that the files in the commit will not be compared in-depth,
-which will result in bigger edit regions.
-
-== Secondary Index
-
-* Online reindexing: log the number of done/failed changes in the error_log.
-Administrators can use the logged information to decide whether to activate the
-new index version or not.
-
-== Gitweb
-
-* Do not return `Forbidden` when clicking on Gitweb breadcrumb. Now when the
-user clicks on the parent folder, redirect to Gerrit projects list screen with
-the parent folder path as the filter.
diff --git a/ReleaseNotes/ReleaseNotes-2.10.3.1.txt b/ReleaseNotes/ReleaseNotes-2.10.3.1.txt
deleted file mode 100644
index 7777bd8..0000000
--- a/ReleaseNotes/ReleaseNotes-2.10.3.1.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-= Release notes for Gerrit 2.10.3.1
-
-There are no schema changes from link:ReleaseNotes-2.10.3.html[2.10.3].
-
-Download:
-link:https://www.gerritcodereview.com/download/gerrit-2.10.3.1.war[
-https://www.gerritcodereview.com/download/gerrit-2.10.3.1.war]
-
-The 2.10.3 release packaged wrong version of the core plugins due to a bug
-in our buck build scripts. This version fixes this issue.
diff --git a/ReleaseNotes/ReleaseNotes-2.10.3.txt b/ReleaseNotes/ReleaseNotes-2.10.3.txt
deleted file mode 100644
index 1dd96e7..0000000
--- a/ReleaseNotes/ReleaseNotes-2.10.3.txt
+++ /dev/null
@@ -1,111 +0,0 @@
-= Release notes for Gerrit 2.10.3
-
-Download:
-link:https://www.gerritcodereview.com/download/gerrit-2.10.3.war[
-https://www.gerritcodereview.com/download/gerrit-2.10.3.war]
-
-== Important Notes
-
-*WARNING:* There are no schema changes from
-link:ReleaseNotes-2.10.2.html[2.10.2], but Bouncycastle was upgraded to 1.51.
-It is therefore important to upgrade the site with the `init` program, rather
-than only copying the .war file over the existing one.
-
-*WARNING:* When upgrading from version 2.8.4 or older with a site that uses
-Bouncy Castle Crypto, new versions of the libraries will be downloaded. The old
-libraries should be manually removed from site's `lib` folder to prevent the
-startup failure described in
-link:https://code.google.com/p/gerrit/issues/detail?id=3084[Issue 3084].
-
-It is recommended to run the `init` program in interactive mode. Warnings will
-be suppressed in batch mode.
-
-----
-  java -jar gerrit.war init -d site_path
-----
-
-== New Features
-
-* Support hybrid OpenID and OAuth2 authentication
-+
-OpenID auth scheme is aware of optional OAuth2 plugin-based authentication.
-This feature is considered to be experimental and hasn't reached full feature set yet.
-Particularly, linking of user identities across protocol boundaries and even from
-one OAuth2 identity to another OAuth2 identity wasn't implemented yet.
-
-=== Configuration
-
-* Allow to configure
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10.3/config-gerrit.html#sshd.rekeyBytesLimit[
-SSHD rekey parameters].
-
-== SSH
-
-* Update SSHD to 0.14.0.
-+
-This fixes link:https://issues.apache.org/jira/browse/SSHD-348[SSHD-348] which
-was causing ssh threads allocated to stream-events clients to get stuck.
-+
-Also update SSHD Mina to 2.0.8 and Bouncycastle to 1.51.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2797[Issue 2797]:
-Add support for ECDSA based public key authentication.
-
-== Bug Fixes
-
-* Prevent wrong content type for CSS files.
-+
-The mime-util library contains two content type mappings for .css files:
-`application/x-pointplus` and `text/css`.  Unfortunately, using the wrong one
-will result in most browsers discarding the file as a CSS file.  Ensure we only
-use the correct type for CSS files.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3289[Issue 3289]:
-Prevent NullPointerException in Gitweb servlet.
-
-=== Replication plugin
-
-* Set connection timeout to 120 seconds for SSH remote operations.
-+
-The creation of a missing Git, before starting replication, is a blocking
-operation. By setting a timeout, we ensure the operation does not get stuck
-forever, essentially blocking all future remote git creation operations.
-
-=== OAuth extension point
-
-* Respect servlet context path in URL for login token
-+
-On sites with non empty context path, first redirect was broken and ended up
-with 404 Not found.
-
-* Invalidate OAuth session after web_sessions cache expiration
-+
-After web session cache expiration there is no way to re-sign-in into Gerrit.
-
-=== Daemon
-
-* Print proper names for tasks in output of `show-queue` command.
-+
-Some tasks were not displayed with the proper name.
-
-=== Web UI
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=3044[Issue 3044]:
-Remove stripping `#` in login redirect.
-
-=== SSH
-
-* Prevent double authentication for the same public key.
-
-
-== Performance
-
-* Improved performance when creating a new branch on a repository with a large
-number of changes.
-
-
-== Upgrades
-
-* Update Bouncycastle to 1.51.
-
-* Update SSHD to 0.14.0.
diff --git a/ReleaseNotes/ReleaseNotes-2.10.4.txt b/ReleaseNotes/ReleaseNotes-2.10.4.txt
deleted file mode 100644
index c69a946..0000000
--- a/ReleaseNotes/ReleaseNotes-2.10.4.txt
+++ /dev/null
@@ -1,44 +0,0 @@
-= Release notes for Gerrit 2.10.4
-
-There are no schema changes from link:ReleaseNotes-2.10.3.1.html[2.10.3.1].
-
-Download:
-link:https://www.gerritcodereview.com/download/gerrit-2.10.4.war[
-https://www.gerritcodereview.com/download/gerrit-2.10.4.war]
-
-== New Features
-
-* Support identity linking in hybrid OpenID and OAuth2 authentication.
-+
-Linking of user identities across protocol boundaries and from one OAuth2
-identity to another OAuth2 identity is supported.
-
-* Support identity linking in OAuth2 extension point.
-+
-Linking of user identities from one OAuth2 identity to another OAuth2
-identity is supported.
-
-== Bug Fixes
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3300[Issue 3300]:
-Fix >10x performance degradation for Git push and replication operations.
-+
-A link:https://bugs.eclipse.org/bugs/show_bug.cgi?id=465509[regression in jgit]
-caused a performance degradation.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3312[Issue 3312]:
-Flush padding on patches downloaded as base64.
-+
-The padding was not flushed, which caused the downloaded patch to not be
-valid base64.
-
-=== OAuth extension point
-
-* Check for session validity during logout.
-+
-When user was trying to log out, after Gerrit restart, the session was
-invalidated and IllegalStateException was recorded in the error_log.
-
-== Updates
-
-* Update jgit to 4.0.0.201505050340-m2.
diff --git a/ReleaseNotes/ReleaseNotes-2.10.5.txt b/ReleaseNotes/ReleaseNotes-2.10.5.txt
deleted file mode 100644
index a221b58..0000000
--- a/ReleaseNotes/ReleaseNotes-2.10.5.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-= Release notes for Gerrit 2.10.5
-
-There are no schema changes from link:ReleaseNotes-2.10.4.html[2.10.4].
-
-Download:
-link:https://gerrit-releases.storage.googleapis.com/gerrit-2.10.5.war[
-https://gerrit-releases.storage.googleapis.com/gerrit-2.10.5.war]
-
-== Bug Fixes
-
-* Update JGit to include a memory leak fix as discussed
-link:https://groups.google.com/forum/#!topic/repo-discuss/RRQT_xCqz4o[here]
-
-* Attempt to fix the "Cannot read project" issue in Gerrit, as discussed
-link:https://groups.google.com/forum/\#!topic/repo-discuss/ZeGWPyyJlrM[here]
-and
-link:https://groups.google.com/forum/#!topic/repo-discuss/CYYoHfDxCfA[here]
-
-* Fixed a regression caused by the defaultValue feature which broke the ability
-to remove labels in subprojects
-
-== Updates
-
-* Update JGit to v4.0.0.201506090130-r
diff --git a/ReleaseNotes/ReleaseNotes-2.10.6.txt b/ReleaseNotes/ReleaseNotes-2.10.6.txt
deleted file mode 100644
index 7c12d11..0000000
--- a/ReleaseNotes/ReleaseNotes-2.10.6.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-= Release notes for Gerrit 2.10.6
-
-There are no schema changes from link:ReleaseNotes-2.10.5.html[2.10.5].
-
-Download:
-link:https://gerrit-releases.storage.googleapis.com/gerrit-2.10.6.war[
-https://gerrit-releases.storage.googleapis.com/gerrit-2.10.6.war]
-
-== Bug Fixes
-
-* Fix generation of licenses in documentation.
-
diff --git a/ReleaseNotes/ReleaseNotes-2.10.7.txt b/ReleaseNotes/ReleaseNotes-2.10.7.txt
deleted file mode 100644
index f369999..0000000
--- a/ReleaseNotes/ReleaseNotes-2.10.7.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-= Release notes for Gerrit 2.10.7
-
-There are no schema changes from link:ReleaseNotes-2.10.6.html[2.10.6].
-
-Download:
-link:https://gerrit-releases.storage.googleapis.com/gerrit-2.10.7.war[
-https://gerrit-releases.storage.googleapis.com/gerrit-2.10.7.war]
-
-== Bug Fixes
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3361[Issue 3361]:
-Synchronize Myers diff and Histogram diff invocations to prevent pack file
-corruption.
-+
-See also the link:https://bugs.eclipse.org/bugs/show_bug.cgi?id=467467[
-bug report on JGit].
-
diff --git a/ReleaseNotes/ReleaseNotes-2.10.8.txt b/ReleaseNotes/ReleaseNotes-2.10.8.txt
deleted file mode 100644
index e7de0e1..0000000
--- a/ReleaseNotes/ReleaseNotes-2.10.8.txt
+++ /dev/null
@@ -1,39 +0,0 @@
-Release notes for Gerrit 2.10.8
-===============================
-
-There are no schema changes from link:ReleaseNotes-2.10.7.html[2.10.7].
-
-Download:
-link:https://gerrit-releases.storage.googleapis.com/gerrit-2.10.8.war[
-https://gerrit-releases.storage.googleapis.com/gerrit-2.10.8.war]
-
-Bug Fixes
----------
-
-* link:https://bugs.chromium.org/p/gerrit/issues/detail?id=10262[Issue 10262]: Fix validation of wants in git-upload-pack for protocol v0 stateless transports.
-+
-See the following section for details.
-
-* Upgrade JGit to 4.5.5.201812240535-r.
-+
-This upgrade includes several major versions since 4.0.0 used in Gerrit version 2.10.7.
-Important fixes are summarized below. Please refer to the corresponding JGit release notes for full details.
-
-** link:https://projects.eclipse.org/projects/technology.jgit/releases/4.5.5[JGit 4.5.5]: link:https://bugs.chromium.org/p/gerrit/issues/detail?id=10262[Issue 10262]: Fix validation of wants in git-upload-pack for protocol v0 stateless transports.
-+
-AdvertiseRefsHook was not called for git-upload-pack in protocol v0 stateless transports, meaning that wants were not validated and a user could fetch anything that is pointed to by any ref (using fetch-by-sha1), as long as they could guess the object name.
-
-** link:https://projects.eclipse.org/projects/technology.jgit/releases/4.5.4[JGit 4.5.4]: Fix LockFile semantics when running on NFS.
-+
-Honor trustFolderStats also when reading packed-refs.
-
-** link:https://projects.eclipse.org/projects/technology.jgit/releases/4.5.3[JGit 4.5.3]: Fix exception handling for opening bitmap index files.
-
-** link:https://projects.eclipse.org/projects/technology.jgit/releases/4.5.2[JGit 4.5.2]: Fix pack marked as corrupted even if it isn’t.
-
-** link:https://projects.eclipse.org/projects/technology.jgit/releases/4.5.1[JGit 4.5.1]: Don’t remove Pack when FileNotFoundException is transient.
-
-** link:https://projects.eclipse.org/projects/technology.jgit/releases/4.1.0[JGit 4.1.0]: Handle stale NFS file handles on packed-refs file.
-+
-Use java.io.File instead of NIO to check existence of loose objects in ObjectDirectory to speed up inserting of loose objects.
-Reduce memory consumption when creating bitmaps during writing pack files.
\ No newline at end of file
diff --git a/ReleaseNotes/ReleaseNotes-2.10.txt b/ReleaseNotes/ReleaseNotes-2.10.txt
deleted file mode 100644
index 4f068cc..0000000
--- a/ReleaseNotes/ReleaseNotes-2.10.txt
+++ /dev/null
@@ -1,679 +0,0 @@
-= Release notes for Gerrit 2.10
-
-
-Gerrit 2.10 is now available:
-
-link:https://www.gerritcodereview.com/download/gerrit-2.10.war[
-https://www.gerritcodereview.com/download/gerrit-2.10.war]
-
-Gerrit 2.10 includes the bug fixes done with
-link:ReleaseNotes-2.9.1.html[Gerrit 2.9.1],
-link:ReleaseNotes-2.9.2.html[Gerrit 2.9.2],
-link:ReleaseNotes-2.9.3.html[Gerrit 2.9.3] and
-link:ReleaseNotes-2.9.4.html[Gerrit 2.9.4].
-These bug fixes are *not* listed in these release notes.
-
-== Important Notes
-
-
-*WARNING:* This release contains schema changes.  To upgrade:
-----
-  java -jar gerrit.war init -d site_path
-----
-
-*WARNING:* When upgrading from an existing site that was initialized with Gerrit
-version 2.6 to version 2.9.1, the primary key column order will be updated for
-some tables. It is therefore important to upgrade the site with the `init` program,
-rather than only copying the .war file over the existing one.
-
-It is recommended to run the `init` program in interactive mode. Warnings will
-be suppressed in batch mode.
-
-*WARNING:* Upgrading to 2.10.x requires the server be first upgraded to 2.8
-(or 2.9) and then to 2.10.x. If you are upgrading from 2.8.x or
-later, you may ignore this warning and upgrade directly to 2.10.x.
-
-*WARNING:* The `auth.allowGoogleAccountUpgrade` setting is no longer supported.
-
-*WARNING:* When upgrading from version 2.8.4 or older with a site that uses
-Bouncy Castle Crypto, new versions of the libraries will be downloaded. The old
-libraries should be manually removed from site's `lib` folder to prevent the
-startup failure described in
-link:https://code.google.com/p/gerrit/issues/detail?id=3084[Issue 3084].
-
-
-== Release Highlights
-
-
-* Support for externally loaded plugins.
-+
-Plugins can be implemented in Scala or Groovy using the
-link:https://gerrit-review.googlesource.com/\#/admin/projects/plugins/scripting/groovy-provider[
-Groovy provider] and
-link:https://gerrit-review.googlesource.com/#/admin/projects/plugins/scripting/scala-provider[
-Scala provider] plugins.
-
-* Customizable 'My' menu.
-+
-Users can customize the contents of the 'My' menu in the top menu.  Administrators
-can configure the default contents of the menu.
-
-
-== New Features
-
-
-=== Web UI
-
-
-==== Global
-
-* Add 'All-Users' project to store meta data for all users.
-
-* Administrators can customize the default contents of the 'My' menu.
-
-* Add 'My' > 'Groups' menu entry that shows the list of own groups.
-
-* Allow UiActions to perform redirects without JavaScript.
-
-
-==== Change Screen
-
-
-* Display avatar for author, committer, and change owner.
-
-* Remove message box when editing topic of change.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2573[Issue 2573]:
-Add option to quickly add current user as reviewer of a change.
-+
-An 'Add Me' button is displayed next to the 'Add' button when searching for
-reviewers to add to a change. This allows users to quickly add themselves as a
-reviewer on the change without having to type their name in the search
-box.
-
-* Link project name to dashboard.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2667[Issue 2667]:
-Allow to customize Submit button label and tooltip.
-
-
-==== Side-by-Side Diff Screen
-
-* Allow the user to select the syntax highlighter.
-
-* Add `Shift-a` keybinding to show/hide left side.
-
-* Allow to toggle empty pane for added and deleted files.
-
-* Add syntax highlighting of the commit message.
-
-
-==== Change List / Dashboards
-
-* Remove age operator when drilling down from a dashboard to a query.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2646[Issue 2646]:
-Add option to show Change-ID in the change table.
-
-* Make the own user dashboard available under '/dashboard/self'.
-
-* Add 'R' key binding to refresh custom dashboards.
-+
-Account dashboards, search results and the change screen refresh their content
-when 'R' is pressed.  The same binding is added for custom dashboards.
-
-
-==== Project Screens
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2751[Issue 2751]:
-Add support for filtering by regex in project list screen.
-
-* Disable content merge option if project's merge strategy is fast forward only.
-
-* Add branch actions to 'Projects > Branches' view.
-
-==== User Preferences
-
-
-* Users can customize the contents of the 'My' menu from the preferences
-screen.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2628[Issue 2628]:
-Replace 'Display name in review category' preference with a list of options.
-+
-Including new options 'Show Abbreviated Name' to display abbreviated reviewer
-names and 'Show Username' to show usernames in the change list.
-
-
-=== Secondary Index / Search
-
-
-* Allow to search projects by prefix.
-
-* Add search fields for number of changed lines.
-
-* Add suggestions for 'is:pending' and 'status:pending'.
-
-* Add 'pending' as alias for 'open'.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2545[Issue 2545]:
-Support `topic:""` to find changes with no topic.
-
-* Search more fields in the default search query.
-+
-If a search is given with only a text, search over a variety of fields
-rather than just the project name.
-
-
-=== ssh
-
-
-* Expose SSHD backend in
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/cmd-show-connections.html[
-`show connections`] SSH command.
-
-* Add support for JCE (Java Cryptography Extension) ciphers.
-
-=== REST API
-
-
-==== General
-
-
-* Remove `kind` attribute from REST containers.
-
-* Support `AcceptsPost` on non top-level REST collections.
-
-* Accept `HEAD` in RestApiServlet.
-
-==== Accounts
-
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/rest-api-accounts.html#get-user-preferences[
-Get user preferences].
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/rest-api-accounts.html#set-user-preferences[
-Set user preferences].
-
-==== Changes
-
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2338[Issue 2338]:
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/rest-api-changes.html#create-change[
-Create change].
-
-* Add `other-branches` option on
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/rest-api-changes.html#get-mergeable[
-Get mergeable] endpoint.
-+
-If the `other-branches` option is specified, the mergeability will also be
-checked for all other branches.
-
-==== Config
-
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/rest-api-config.html#list-tasks[
-List tasks].
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/rest-api-config.html#get-task[
-Get task].
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/rest-api-config.html#delete-task[
-Delete task].
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/rest-api-config.html#list-caches[
-List caches].
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/rest-api-config.html#flush-cache[
-Flush cache].
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/rest-api-config.html#flush-several-caches[
-Flush several caches].
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/rest-api-config.html#flush-all-caches[
-Flush all caches].
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/rest-api-config.html#get-summary[
-Get server summary].
-
-==== Projects
-
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/rest-api-projects.html#ban-commit[
-Ban commits].
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/rest-api-projects.html#get-content[
-Get the content of a file from a certain commit].
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2604[Issue 2604]:
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/rest-api-projects.html#get-commit[
-Get an arbitrary commit from a project].
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/rest-api-projects.html#get-reflog[
-Get the reflog of a branch].
-
-* Add option 'S' to
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/rest-api-projects.html#list-projects[
-list projects endpoint] to support query offset.
-
-
-=== Daemon
-
-
-* Add change subject to output of change URL on push.
-
-* Indicate trivial rebase and commit message update on push.
-
-* Add support for
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/user-upload.html#review_labels[
-adding review labels on changes] during git push.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2634[Issue 2634]:
-Add change kind to PatchSetCreatedEvent.
-
-
-=== Configuration
-
-* Use
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/config-gerrit.html#core.useRecursiveMerge[
-recursive merge] by default.
-
-* Allow to configure the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/config-gerrit.html#download.archive[
-available download archive formats].
-
-* Add support for
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/database-setup.html#createdb_maxdb[
-SAP MaxDB].
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2041[Issue 2041]:
-Allow
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/config-labels.html#label_defaultValue[
-configuration of a default value for a label].
-
-* Allow projects to
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/config-project-config.html#mimetype-section[
-configure MIME types for files].
-
-* Allow to configure
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/config-gerrit.html#gc[
-periodic garbage collection of all projects].
-
-* Remove `auth.allowGoogleAccountUpgrade` setting.
-+
-It's been more than 5 years since Gerrit ran on Google AppEngine.  It is assumed
-that everyone has upgraded their installations to a modern 2.x based server, and
-will not need to have this upgrade path enabled.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2618[Issue 2618]:
-Remove `label.Label-Name.abbreviation` setting.
-+
-The setting was no longer used, so it has been removed.
-
-* New `httpd.registerMBeans` setting.
-+
-The
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/config-gerrit.html#httpd.registerMBeans[
-`httpd.registerMBeans` setting] allows to enable (or disable) registration of
-Jetty MBeans for Java JMX.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2600[Issue 2600]:
-Add documentation of how to
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/install-j2ee.html#tomcat[
-configure Tomcat] to allow embedded slashes.
-
-
-=== Misc
-
-* Don't allow empty user name and passwords in InternalAuthBackend.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2596[Issue 2596]:
-Add change-owner parameter to gerrit hooks.
-
-
-=== Plugins
-
-* Support for externally loaded plugins.
-+
-Plugins can be implemented in Scala or Groovy using the
-link:https://gerrit-review.googlesource.com/\#/admin/projects/plugins/scripting/groovy-provider[
-Groovy provider] and
-link:https://gerrit-review.googlesource.com/#/admin/projects/plugins/scripting/scala-provider[
-Scala provider] plugins.
-
-* Allow plugins to replace the WebSession implementation.
-+
-Plugins can replace the existing implementation with the statement:
-`DynamicItem.bind(binder(), WebSession.class).to(...);`
-in a module designated as a `<Gerrit-HttpModule>` in the manifest.
-+
-Just the Cache implementation used for web sessions can be changed
-by binding to a subclass of the now abstract `CacheBasedWebSession`
-which supplies the Cache in the superclass constructor.
-+
-This is a step towards solving web session issues with multi-master.
-+
-The link:https://gerrit-review.googlesource.com/#/admin/projects/plugins/websession-flatfile[
-websession-flatfile plugin] replaces the built-in Gerrit WebSession implementation
-with one that uses a flat file based cache.
-
-* Allow http and ssh plugins to replace the Gerrit-provided DynamicItem.
-
-* New extension point to listen to usage data published events.
-+
-Plugins implementing the `UsageDataPublishedListener` can listen to
-events published about usage data.
-
-* New extension point to link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/dev-plugins.html#pre-upload-hook[
-register JGit PreUploadHook].
-+
-Plugins may register PreUploadHook instances in order to get
-notified when JGit is about to upload a pack. This may be useful
-for those plugins which would like to monitor usage in Git
-repositories.
-
-* New link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/config-validation.html#pre-upload-validation[
-pre-upload validation extension point].
-+
-Plugins implementing the `UploadValidationListener` interface can
-perform additional validation checks before any upload operations
-(clone, fetch, pull). The validation is executed right before Gerrit
-begins to send a pack back to the git client.
-
-* New link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/dev-plugins.html#links-to-external-tools[
-external tool links extension points].
-+
-Plugins can now contribute project links that will be displayed on the project
-list screen in the 'Repository Browser' column, and revision links that will be
-shown on the change screen.
-
-* Allow creation of persistent caches after server is started.
-+
-This enables plugins to create own persistent caches when they are
-installed.
-
-* Make gerrit's HttpServletRequest and HttpServletResponse visible to http
-plugins.
-
-* New extensions in the Java Plugin API:
-
-** Query changes
-** Create/get/list projects
-** Get/set review status
-** Create change
-** Get account
-** Star/unstar changes
-** Check if revision needs rebase
-
-== Bug Fixes
-
-=== General
-
-* Use fixed rate instead of fixed delay for log file compression.
-+
-Log file compression was scheduled using a fixed delay. This caused the start
-times to drift over time. Use a fixed rate instead so that the compression
-reoccurs at the same time every day.
-
-* Don't email project watchers on new draft changes.
-+
-If a draft change is created by pushing to `refs/drafts/master`, only the reviewers
-explicitly named on the command line (which may be empty) should be notified of
-the change. Users watching the project should not be notified, as the change has
-not yet been published.
-
-* Fix resource exhaustion due to unclosed LDAP connection.
-+
-When `auth.type` is set to `LDAP` (not `LDAP_BIND`), two LDAP connections are
-made, but one was not being closed. This eventually caused resource exhaustion
-and LDAP authentications failed.
-
-=== Access Permissions
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2995[Issue 2995]:
-Fix faulty behaviour in `BLOCK` permission.
-+
-`BLOCK` can be overruled with `ALLOW` on the same project, however there was a
-bug when a child of the above project duplicates the `ALLOW` permission. In this
-case the `BLOCK` would always win for the child, even though the `BLOCK` was
-overruled in the parent.
-
-=== Web UI
-
-==== General
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2595[Issue 2595]:
-Make gitweb redirect to login.
-+
-Gitweb redirects to the login page if the user isn't currently logged.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2631[Issue 2631]:
-Re-arrange info at footer of Gerrit web UI pages.
-+
-Move the Gerrit info link so that there are no links close to the next page link.
-
-* Only create All-Projects ACL once.
-+
-If `refs/meta/config` already existed it was overwritten with default configuration
-if a site administrator ran `java -war gerrit.war init -d /some/existing/site --batch`.
-
-
-==== Change Screen
-
-* Don't linkify trailing dot or comma in messages.
-+
-As linkifying trailing dots and trailing commas does more harm than
-good, we only treat dots and commas as being part of urls, if they are
-neither followed by whitespace nor occur at the end of a string.
-
-* Re-enable the 'Cherry Pick' button after canceling the dialog.
-+
-If the dialog was canceled, the button remained disabled and could not be
-used again.
-
-* Improve message when removing a reviewer.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=527[Issue 527]:
-Preserve line breaks in inline and review comments.
-
-* Always show 'No Score' as label help for zero votings.
-
-* Only reset the edited commit message text on cancel.
-
-* Only include message on quick approve if reply is open.
-
-* List reviewers with dummy approvals on closed changes.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2890[Issue 2890]:
-Enable scrollbars for "Edit Commit Message" TextArea.
-
-* Use current time instead of submitter time for cherry-picked commits.
-+
-Cherry picking with the submitter time could cause massive clock skew
-in the Git commit graph if the server was shutdown before the submit could
-finish, and restarted hours later.
-
-* Fix exception when clicking on a binary file without being signed in.
-
-
-==== Side-By-Side Diff
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2970[Issue 2970]:
-Fix misalignment of side A and side B for long insertion/deletion blocks.
-
-* Give B side full width when A side is hidden.
-
-* Fix scroll alignment when showing hidden A side.
-
-* Bind Shift-N to search-prev in vim mode.
-
-* Allow text selection in diff header.
-
-* Display diff header on mode changes and renames.
-
-* Document Shift-{Left,Right} in `?` help popup.
-
-* Show `[` and `]` shortcut keys in nav arrow tooltips.
-
-* Disable "Render = Slow" mode on files over 4000 lines.
-
-* Keep keyboard bindings alive after click in padding.
-
-* Jump to the first change on either side.
-
-* Expand margin between paragraphs in comments.
-
-* Include content on identical files with mode change.
-
-
-==== User Settings
-
-* Avoid loading all SSH keys when adding a new one.
-
-
-=== Secondary Index / Search
-
-
-* Omit corrupt changes from search results.
-
-* Allow illegal label names from default search predicate.
-
-=== REST
-
-==== General
-
-* Fix REST API responses for 3xx and 4xx classes.
-
-==== Changes
-
-* Fix inconsistent behaviour in the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/rest-api-changes.html#add-reviewer[
-add reviewer endpoint]
-+
-When adding a single reviewer to a change, it was possible to use the endpoint
-to add a user who had no visibility to the change or whose account was invalid.
-
-
-==== Changes
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2583[Issue 2583]:
-Reject inline comments on files that do not exist in the patch set.
-
-* Allow forcing mergeability check on
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/rest-api-changes.html#get-mergeable[
-Get mergeable].
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2622[Issue 2622]:
-Respect patch set visibility for messages.
-+
-Messages retrieval didn't check for patch set visbility and thus messages for
-draft patch sets were returned back to the client.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2782[Issue 2782]:
-Add missing documentation of the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/rest-api-changes.html#get-related-changes[
-Get Related Changes] endpoint.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2723[Issue 2723]:
-Clarify the response info in the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/rest-api-changes.html#get-change-detail[
-Get Change Detail] endpoint.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2693[Issue 2693]:
-Clarify the response info in the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/rest-api-changes.html#list-comments[
-List Comments] endpoint.
-
-=== SSH
-
-
-* Prevent double authentication for the same public key.
-+
-This is a workaround for link:https://issues.apache.org/jira/browse/SSHD-300[
-SSHD-300].
-
-* Let `kill` SSH command only kill tasks that are visible to the caller.
-
-* Require 'Administrate Server' capability to see server summary output from
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.10/cmd-show-caches.html[
-`show-caches`] command.
-
-* Include all command arguments in SSH log entry.
-+
-The SSH log only included the first argument. This prevented the repository name
-from being logged when `git receive-pack` was executed instead of `git-receive-pack`.
-
-
-=== Daemon
-
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2284[Issue 2284]:
-More detailed error message when failing to upload new change.
-+
-When the uploaded change cannot be created on the underlying Git repository, a
-more descriptive error message is displayed on both client and server side. This
-allows to troubleshoot internal errors (e.g. JGit lock failures or other causes)
-and help out in the resolution.
-
-* Enforce HTTP password checking on gitBasicAuth.
-
-* Fix missing commit messages on submodule direct pushes.
-+
-The commit message in superproject was missing on submodule's
-directly pushed changes.
-
-
-=== Plugins
-
-==== General
-
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2895[Issue 2895]:
-Fix reload of plugins that use DynamicItem.
-
-* Invoke `StartPluginListener` and `ReloadPluginListener` only after start/reload
-is fully done.
-
-* Set `Last-Modified` on cached Documentation resources.
-
-* Return HTTP 304 for not modified SmallResources.
-
-* Fix ChangeListener auto-registered implementations.
-
-==== Replication
-
-
-* Move replication logs into a separate file.
-
-* Promote replication scheduled logs to info.
-
-* Show replication ID in the log and in show-queue command.
-
-
-== Upgrades
-
-
-* Update Guava to 17.0
-
-* Update Guice to 4.0-beta5
-
-* Update GWT to 2.6.1
-
-* Update httpclient to 4.3.4
-
-* Update httpcore to 4.3.2
-
-* Update Jcraft SSH to 0.1.51
-
-* Update Jetty to 9.2
-
-* Update JGit to 3.6.2.201501210735-r
-
-* Update log4j to 1.2.17
-
-* Update Servlet API to 8.0.5
-
-* Update slf4j to 1.7.7
-
-* Update Velocity to 1.7
-
diff --git a/ReleaseNotes/ReleaseNotes-2.11.1.txt b/ReleaseNotes/ReleaseNotes-2.11.1.txt
deleted file mode 100644
index 3583421..0000000
--- a/ReleaseNotes/ReleaseNotes-2.11.1.txt
+++ /dev/null
@@ -1,181 +0,0 @@
-= Release notes for Gerrit 2.11.1
-
-Gerrit 2.11.1 is now available:
-
-link:https://www.gerritcodereview.com/download/gerrit-2.11.1.war[
-https://www.gerritcodereview.com/download/gerrit-2.11.1.war]
-
-Gerrit 2.11.1 includes the bug fixes done with
-link:ReleaseNotes-2.10.4.html[Gerrit 2.10.4] and
-link:ReleaseNotes-2.10.5.html[Gerrit 2.10.5]. These bug fixes are *not* listed
-in these release notes.
-
-There are no schema changes from link:ReleaseNotes-2.11.html[2.11].
-
-
-== New Features
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=321[Issue 321]:
-Use in-memory Lucene index for a better reviewer suggestion.
-+
-Instead of a linear full text search through a list of accounts, use an
-in-memory Lucene index. The index is periodically refreshed. The refresh period
-is configurable via the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11.1/config-gerrit.html#suggest.fullTextSearchRefresh[
-suggest.fullTextSearchRefresh] parameter.
-
-
-== Bug Fixes
-
-=== Performance
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=3363[Issue 3363]:
-Fix performance degrade in background mergeability checks.
-+
-When neither `index.batchThreads` nor `changeMerge.threadPoolSize` was defined,
-the background mergeability check fell back to using an interactive executor.
-+
-This led to a severe performance degradation during git push operations because
-the `ref-update` listener was reindexing all open changes on the target branch
-interactively. The degradation increased linearly with number of open changes on
-the target branch.
-+
-Now, instead of indexing interactively, it falls back to a batch thread pool
-with the number of available logical CPUs.
-
-* Reduce unnecessary database access when querying changes.
-+
-Searching for changes was retrieving more information than necessary from the
-database. This has been optimized to reduce database access and make better use
-of the secondary index.
-
-* Remove unnecessary REST API call when opening the 'Patch Sets' drop down.
-+
-The change edit information was being loaded twice.
-
-=== Index
-
-* Fix `PatchLineCommentsUtil.draftByChangeAuthor`.
-+
-There is not a native index for this, and the ReviewDb case was not properly
-filtering a result by change.
-
-* Don't show stack trace when failing to build BloomFilter during reindex.
-
-=== Permissions
-
-* Require 'View Plugins' capability to list plugins through SSH.
-+
-The 'View Plugins' capability was required to list plugins through the REST API,
-but not through SSH.
-
-* Fix project creation with plugin config if user is not project owner.
-+
-On project creation it is possible to specify plugin configuration values that
-should be stored in the `project.config` file. This failed if the calling user
-was not becoming owner of the created project, because only project owners can
-edit the `project.config` file.
-
-
-=== Change Screen / Diff / Inline Edit
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=3191[Issue 3191]:
-Always show 'Not Current' as state when looking at old patch set.
-+
-For merged changes it was confusing for users to see the status as 'Merged' when
-they look at an old patch set.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=3337[Issue 3337]:
-Reenable 'Revert' button when revert is cancelled.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=3378[Issue 3378]:
-Improve the cursor style in side-by-side diff and inline editor.
-+
-The cursor style is changed from an underscore to a solid vertical bar.
-+
-In the side-by-side diff, the cursor is placed on the first column of the diff,
-rather than at the end.
-
-=== Web Container
-
-* Fix `gc_log` when running in a web container.
-+
-All logs supposed to be in the `gc_log` file were ending up in the main log
-instead when deploying Gerrit in a web container.
-
-* Fix binding of SecureStore modules.
-+
-The SecureStore modules were not correctly added when Gerrit was deployed in a
-web container with the site path configured using the `gerrit.site_path`
-property.
-
-=== Plugins
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=3310[Issue 3310]:
-Fix disabling plugins when Gerrit is running on Windows.
-+
-When running Gerrit on Windows it was not possible to disable a plugin due to an
-error renaming the plugin's JAR file.
-
-* Replication
-
-** Fix creation of missing repositories.
-+
-Missing projects were not being created on the destination.
-
-** Emit replication status events after initial full sync.
-+
-When `replicateOnStartup` is enabled, the plugin was not emitting the status
-events after the initial sync.
-
-=== Miscellaneous
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=3328[Issue 3328]:
-Allow to push a tag that points to a non-commit object.
-+
-When pushing a tag that points to a non-commit object, like
-link:https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/tag/?id=v2.6.11[
-`v2.6.11` on linux-stable] which points to a tree, or
-link:https://git.eclipse.org/c/jgit/jgit.git/tag/?id=spearce-gpg-pub[
-`spearce-gpg-pub` on jgit] which points to a blob, Gerrit rejected the push with
-the error message 'missing object(s)'.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=3323[Issue 3323]:
-Fix internal server error when cloning from a slave while hiding some refs.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=3342[Issue 3342]:
-Log `IOException` on failure to update project configuration.
-+
-Without logging these exceptions it's hard to guess why the update of the
-project configuration is failing.
-
-* Remove temporary GitWeb config on Gerrit exit.
-+
-A temporary directory was being created but not removed.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2791[Issue 2791]:
-Fix email validation for new TLDs such as `.systems`.
-
-* Assume change kind is 'rework' if `LargeObjectException` occurs.
-
-=== Documentation
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=3325[Issue 3325]:
-Add missing `--newrev` parameter to the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11.1/config-hooks.html#_change_merged[
-change-merged hook documentation].
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=3346[Issue 3346]:
-Fix typo in the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11.1/config-reverseproxy.html[
-Apache 2 configuration documentation].
-
-* Fix incorrect documentatation of
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11.1/config-gerrit.html#auth.registerUrl[
-auth types].
-
-== Updates
-
-* Update CodeMirror to 5.0.
-
-* Update commons-validator to 1.4.1.
diff --git a/ReleaseNotes/ReleaseNotes-2.11.10.txt b/ReleaseNotes/ReleaseNotes-2.11.10.txt
deleted file mode 100644
index a352aac..0000000
--- a/ReleaseNotes/ReleaseNotes-2.11.10.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-= Release notes for Gerrit 2.11.10
-
-Gerrit 2.11.10 is now available:
-
-link:https://gerrit-releases.storage.googleapis.com/gerrit-2.11.10.war[
-https://gerrit-releases.storage.googleapis.com/gerrit-2.11.10.war]
-
-There are no schema changes from link:ReleaseNotes-2.11.9.html[2.11.9].
-
-== Bug Fixes
-
-* Fix synchronization of Myers diff and Histogram diff invocations.
-+
-The fix for
-link:https://code.google.com/p/gerrit/issues/detail?id=3361[Issue 3361]
-that was included in Gerrit versions 2.10.7 and 2.11.4 introduced a
-regression that prevented more than one file header diff from being
-computed at the same time across the entire server.
-
-* Fix `sshd.idleTimeout` setting being ignored.
-+
-The `sshd.idleTimeout` setting was not being correctly set on the SSHD
-backend, causing idle sessions to not time out.
-
-* Add the correct license for AsciiDoctor.
-+
-AsciiDoctor is licensed under the MIT License, not Apache2 as previously
-documented.
diff --git a/ReleaseNotes/ReleaseNotes-2.11.2.txt b/ReleaseNotes/ReleaseNotes-2.11.2.txt
deleted file mode 100644
index 98e66b0..0000000
--- a/ReleaseNotes/ReleaseNotes-2.11.2.txt
+++ /dev/null
@@ -1,99 +0,0 @@
-= Release notes for Gerrit 2.11.2
-
-Gerrit 2.11.2 is now available:
-
-link:https://gerrit-releases.storage.googleapis.com/gerrit-2.11.2.war[
-https://gerrit-releases.storage.googleapis.com/gerrit-2.11.2.war]
-
-Gerrit 2.11.2 includes the bug fixes done with
-link:ReleaseNotes-2.10.6.html[Gerrit 2.10.6]. These bug fixes are *not* listed
-in these release notes.
-
-There are no schema changes from link:ReleaseNotes-2.11.1.html[2.11.1].
-
-== New Features
-
-New SSH commands:
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11.2/cmd-index-start.html[
-`index start`]
-+
-Allows to restart the online indexer without restarting the Gerrit server.
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11.2/cmd-index-activate.html[
-`index activate`]
-+
-Allows to activate the latest index version even if the indexing encountered
-problems.
-
-
-== Bug Fixes
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2761[Issue 2761]:
-Fix incorrect file list when comparing patchsets.
-+
-When comparing a patchset with another one, the added and deleted files were not
-displayed properly.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3460[Issue 3460]:
-Fix regression in the search box auto-suggestions.
-+
-A change introduced in version 2.11 caused the auto-suggestions to not work
-any more.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3355[Issue 3355]:
-Fix corruption of database when deleting draft change ref fails.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3426[Issue 3426]:
-Fix regression in the `%base` option.
-+
-A change introduced in version 2.11 caused the `%base` option to not work
-any more, meaning it was not possible to push a commit, which is already merged
-into a branch, for review to another branch of the same project.
-
-* link:https://bugs.eclipse.org/bugs/show_bug.cgi?id=468024[JGit bug 468024]:
-Fix data loss if a pack is pushed to a JGit based server and gc runs
-concurrently on the same repository.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3371[Issue 3371]:
-Fix wrong date/time for commits in `refs/meta/config` branch.
-+
-When the `refs/meta/config` branch was modified using the PutConfig REST endpoint
-(e.g. when changing the project configuration in the web UI) the commit date/time
-was wrong. Instead of the actual date/time the date/time of the last Gerrit server
-start was used.
-
-* Fix NullPointerException in the 'related changes' REST API endpoint.
-
-* Make sure `/a` is not in the project name for git-over-http requests.
-+
-The `/a` prefix is used to trigger authentication but was not removed from the
-request. Therefore, it was included in the project name and hence the project
-wasn't found when performing, for example `git fetch http://server/a/project`.
-
-* Fix disabling of git ssh commands.
-+
-The ssh commands were available even when ssh commands were disabled.
-
-* Fix native string handling in Plugin API.
-+
-The results of REST API calls were incorrectly being converted from NativeString
-to String when called from Javascript.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3440[Issue 3440]:
-Include prettify source files in the documentation.
-+
-The prettify source files were being loaded from `cdnjs.cloudflare.com`, which
-may cause trouble if the Gerrit instance is behind a firewall on a machine not
-allowed to access the Internet at large.
-+
-Now those files are bundled with the documentation.
-
-* Print proper name for project indexer tasks in `show-queue` command.
-
-* Print proper name for reindex after update tasks in `show-queue` command.
-
-== Updates
-
-* Update JGit to 4.0.1.201506240215-r.
-
diff --git a/ReleaseNotes/ReleaseNotes-2.11.3.txt b/ReleaseNotes/ReleaseNotes-2.11.3.txt
deleted file mode 100644
index f705d1e..0000000
--- a/ReleaseNotes/ReleaseNotes-2.11.3.txt
+++ /dev/null
@@ -1,90 +0,0 @@
-= Release notes for Gerrit 2.11.3
-
-Gerrit 2.11.3 is now available:
-
-link:https://gerrit-releases.storage.googleapis.com/gerrit-2.11.3.war[
-https://gerrit-releases.storage.googleapis.com/gerrit-2.11.3.war]
-
-There are no schema changes from link:ReleaseNotes-2.11.2.html[2.11.2].
-
-
-== Bug Fixes
-
-* Do not suggest inactive accounts.
-+
-When, for example, adding accounts to a group, the drop down list would also
-suggest inactive accounts.
-+
-Inactive accounts are now excluded from the suggestion.
-
-* Fix performance of side-by-side diff screen for huge files.
-+
-The `Render=Slow` preference was not being disabled for huge files, resulting
-in poor performance on most browsers.
-
-* Prefer JavaScript clipboard API if available.
-+
-Modern versions of Chrome support a draft clipboard API from JavaScript that
-allows copying without use of a Flash widget. If the API appears to be available
-in the browser, it is now used instead of the Flash widget.
-
-* Fix markdown rendering for the Gitiles plugin.
-+
-The Gitiles project uses the grappa library which causes a class collision with
-parboiled which was used by Gerrit. This resulted in markdown files not being
-rendered by the Gitiles plugin.
-
-* Fix submodule subscription for nested projects.
-+
-If the project name was 'a/b', and a project named 'b' also existed, the
-subscription would be incorrectly set on project 'b'.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3478[Issue 3478]:
-Show correct status line for draft patch sets.
-+
-If a new patch set was uploaded as draft to an existing published change,
-the status line did not reflect the draft status of the now current patch
-set.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3477[Issue 3477]:
-Fix client error when current patch set is not visible to user.
-+
-If the latest patch set of a change was a draft that was not visible to the
-logged in user, clicking on the side by side diff link caused a javascript error
-on the client.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3468[Issue 3468]:
-Include URL to change in "change closed" error message.
-+
-Instead of only the change number, the error message now includes the URL to
-the change.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3366[Issue 3366]:
-Call `NewProjectCreatedListeners` after project creation is complete.
-+
-The listeners were being called before all project details had been created
-and recorded.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3505[Issue 3505]:
-Add "Uploaded patch set 1" message for changes created via the UI.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3504[Issue 3504]:
-Prevent users from publishing change edits if they have not signed the CLA.
-+
-It was possible for users who had not signed the Contribution License Agreement
-(CLA) to publish change edits on projects that require a CLA.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2209[Issue 2209]:
-Honor username provided by container.
-
-* Stop logging unknown group membership for null UUID.
-Null UUIDs are now skipped rather than spamming the log.
-+
-UUIDs which have no registered backends are still logged. These may be errors
-caused by plugins not loading that an admin should pay attention to and try to
-resolve.
-
-== Updates
-
-* Update Guice to 4.0.
-* Replace parboiled 1.1.7 with grappa 1.0.4.
diff --git a/ReleaseNotes/ReleaseNotes-2.11.4.txt b/ReleaseNotes/ReleaseNotes-2.11.4.txt
deleted file mode 100644
index cfa8576..0000000
--- a/ReleaseNotes/ReleaseNotes-2.11.4.txt
+++ /dev/null
@@ -1,143 +0,0 @@
-= Release notes for Gerrit 2.11.4
-
-Gerrit 2.11.4 is now available:
-
-link:https://gerrit-releases.storage.googleapis.com/gerrit-2.11.4.war[
-https://gerrit-releases.storage.googleapis.com/gerrit-2.11.4.war]
-
-Gerrit 2.11.4 includes the bug fixes done with
-link:ReleaseNotes-2.10.7.html[Gerrit 2.10.7]. These bug fixes are *not* listed
-in these release notes.
-
-There are no schema changes from link:ReleaseNotes-2.11.3.html[2.11.3].
-
-
-== Bug Fixes
-
-* Fix NullPointerException in `ls-project` command with `--has-acl-for` option.
-+
-Using the `--has-acl-for` option for external groups (e.g. LDAP groups) was
-causing a NullPointerException.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3328[Issue 3328]:
-Allow to push a tag that points to a non-commit object.
-+
-When pushing a tag that points to a non-commit object, like
-link:https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/tag/?id=v2.6.11[
-`v2.6.11` on linux-stable] which points to a tree, or
-link:https://git.eclipse.org/c/jgit/jgit.git/tag/?id=spearce-gpg-pub[
-`spearce-gpg-pub` on jgit] which points to a blob, Gerrit rejected the push with
-the error message 'missing object(s)'.
-+
-Note: This was previously fixed in Gerrit version 2.11.1, but was inadvertently
-reverted in 2.11.2 and 2.11.3.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2817[Issue 2817]:
-Insert `Change-Id` footer into access right changes.
-+
-When modifications of access rights were saved for review, the change
-did not have a `Change-Id` footer in the commit message.
-
-* Fix duplicated log lines after reloading a plugin.
-+
-If a plugin was reloaded, logs emitted from the plugin were duplicated.
-
-* Remove `--recheck-mergeable` option from `reindex` command documentation.
-+
-The `--recheck-mergeable` option was removed in Gerrit version 2.11.
-
-* Use the correct validation policy for commits created by Gerrit.
-+
-Commits created by Gerrit were being validated in the same way as commits
-received from users.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3557[Issue 3557]:
-Disallow invalid reference patterns in project configuration.
-+
-When editing a project configuration by using the UI or by submitting a change
-to `refs/meta/config`, it was possible to add a permission to an invalid
-reference pattern. This caused the project to be unavailable and the `ls-projects`
-command to fail whenever this project was encountered.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3574[Issue 3574]:
-Fix review labels with `AnyWithBlock` function.
-+
-The review labels with `AnyWithBlock` with 0 and +1 values blocked submit when
-reviewers were added.
-
-* Fix ref in tag list for signed/annotated tags.
-+
-The tag name from the header was used, rather than the ref name. In some cases
-this resulted in the wrong tag ref being listed.
-
-* Prevent user from bypassing `ref-update` hook through gerrit-created commits.
-+
-If the user used the cherry-pick ability in the UI or via the REST API, they
-could put a commit on a branch that bypassed the requirements of the `ref-update`
-hook (such as that certain branches require QA-tickets to be referenced in the
-commit message).
-
-* Allow `InternalUsers` to see drafts.
-+
-According to the documentation, `InternalUsers` should have full read access.
-This was not true, since `InternalUsers` could not see drafts.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2683[Issue 2683]:
-Fix non-ASCII password authentication failure under tomcat (LDAP).
-+
-The authentication with LDAP failed when the password contained non-ASCII
-characters such as ä, ö, Ä, and Ö.
-
-* Do not double decode the login URL token.
-+
-The login URL token used to redirect from the login servlet to the target page
-is already decoded and should not be decoded again.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3020[Issue 3020]:
-Include approvals specified on push in change message.
-+
-When using the `%l` option to apply a review label on uploaded changes or
-patch sets, the applied label was not mentioned in the change message.
-
-* Fire the `comment-added` hook for approvals specified on push.
-+
-When using the `%l` option to apply a review label on uploaded changes or
-patch sets, the `comment-added` hook was not being fired.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3602[Issue 3602]:
-Use uploader for approvals specified on push, not the committer.
-+
-When using the `%l` option to apply a review label on uploaded changes or
-patch sets, the review label was in some cases applied as the committer rather
-than the uploader.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3531[Issue 3531]:
-Fix internal server error on unified diff screen for anonymous users.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2414[Issue 2414]:
-Improve detection of requiring sign-in.
-+
-Some queries, such as the `has:*` operators, require the user to be signed in.
-+
-Also, when handling a REST API failure, detect 'Invalid authentication' responses
-as also requiring a new session.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3052[Issue 3052]:
-Fix 'Conflicts With' list for merge commits.
-+
-The 'Conflicts List' was not being populated correctly if the change being viewed
-was a merge commit, or if the change being viewed conflicted with an open merge
-commit.
-
-== Plugin Bugfixes
-
-* singleusergroup: Allow to add a user to a project's ACL using `user/username`.
-+
-A user could not be added to a project's ACL unless the user already had READ
-permission in the project's ACL.
-
-* replication: Add waiting time and number of retries to replication log.
-+
-Only the replication execution time was printed in the 'replication completed'
-log statement. The waiting time and retry count is added, to help debug
-replication delays.
diff --git a/ReleaseNotes/ReleaseNotes-2.11.5.txt b/ReleaseNotes/ReleaseNotes-2.11.5.txt
deleted file mode 100644
index 6957827..0000000
--- a/ReleaseNotes/ReleaseNotes-2.11.5.txt
+++ /dev/null
@@ -1,102 +0,0 @@
-= Release notes for Gerrit 2.11.5
-
-Gerrit 2.11.5 is now available:
-
-link:https://gerrit-releases.storage.googleapis.com/gerrit-2.11.5.war[
-https://gerrit-releases.storage.googleapis.com/gerrit-2.11.5.war]
-
-There are no schema changes from link:ReleaseNotes-2.11.4.html[2.11.4].
-
-
-== Important Notes
-
-*WARNING:* This release uses a forked version of buck.
-
-Buck was forked to cherry-pick an upstream fix for building on Mac OSX
-El Capitan.
-
-To build this release from source, the Google repository must be added to
-the remotes in the buck checkout:
-
-----
- $ git remote add google https://gerrit.googlesource.com/buck
-----
-
-
-== Bug Fixes
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3442[Issue 3442]:
-Handle commit validation errors when creating/editing changes via REST.
-+
-When an exception was thrown by a commit validator during creation of
-a new change, or during publish of an inline edit, this resulted in an
-internal server error message which did not include the actual reason
-for the error.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3616[Issue 3616]:
-Strip trailing blank lines from commit messages when modified in the inline
-editor.
-+
-Blank lines were not trimmed from the end of commit messages, which caused
-problems when the commit was merged and then cherry-picked with the `-x`
-option (from the command line).
-
-* Tweak JS clipboard API integration to work on Firefox.
-+
-The JS 'copy' functionality was working on Chrome, but not on Firefox.
-
-* Use image instead of unicode character for copy button.
-+
-Some browsers were unable to render the unicode character.
-
-* Include server config module in init step.
-+
-This allows SecureStore to be used during plugins' init step.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3659[Issue 3659]:
-Show inline comments in change screen history when inline edit is active.
-+
-It was not possible to see the inline comments in the history on the
-change screen when in edit mode.
-
-* Improve rendering of `stream-events` tasks in the `show-queue` output.
-+
-Entries for `stream-events` are now rendered as 'Stream Events (username)'.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3655[Issue 3655]:
-Fix incorrect owner group matching behavior.
-+
-When the given group did not match any group, the group was matched
-on a group whose name starts with the argument, instead of throwing an
-error to notify the user.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3664[Issue 3664]:
-Fix double slash on URL when switching account.
-+
-One too many slashes on the URL caused redirection back to the root
-page instead of the intended location.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3666[Issue 3666]:
-Fix server error when commit validator is invoked on initial commit.
-+
-If a commit was uploaded for review as the first commit in a repository
-that was created with no initial empty commit, invoking a commit validator
-on the new commit would cause an internal error.
-
-* Replication plugin.
-
-** Parse replication delay and retry times as time units.
-+
-The replication delay and retry values were interpreted as seconds and
-minutes respectively, but were being parsed as integers.
-+
-This is inconsistent with how time units are handled in other Gerrit
-configuration settings, and can cause confusion when the user configures
-them using the time unit syntax such as '15s' and it causes the plugin
-to fail with 'invalid value'.
-+
-The delay and retry now are parsed as time units. The value can be given
-in any recognized time unit, and the defaults remain the same as before;
-15 seconds and 1 minute respectively.
-
-** Remove documentation of obsolete `remote.NAME.timeout` setting.
diff --git a/ReleaseNotes/ReleaseNotes-2.11.6.txt b/ReleaseNotes/ReleaseNotes-2.11.6.txt
deleted file mode 100644
index 977ea14..0000000
--- a/ReleaseNotes/ReleaseNotes-2.11.6.txt
+++ /dev/null
@@ -1,123 +0,0 @@
-= Release notes for Gerrit 2.11.6
-
-Gerrit 2.11.6 is now available:
-
-link:https://gerrit-releases.storage.googleapis.com/gerrit-2.11.6.war[
-https://gerrit-releases.storage.googleapis.com/gerrit-2.11.6.war]
-
-There are no schema changes from link:ReleaseNotes-2.11.5.html[2.11.5].
-
-== Bug Fixes
-
-=== General
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3742[Issue 3742]:
-Use merge strategy for mergeability testing on 'Rebase if Necessary' strategy.
-+
-When pushing several interdependent commits to a project with the
-'Rebase if Necessary' strategy, all the commits except the first one were
-marked as 'Cannot merge'.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3762[Issue 3762]:
-Fix server error when querying changes with the `query` ssh command.
-
-* Fix server error when listing annotated/signed tag that has no tagger info.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3698[Issue 3698]:
-Fix creation of the administrator user on databases with pre-allocated
-auto-increment column values.
-+
-When using a database configuration where auto-increment column values are
-pre-allocated, it was possible that the 'Administrators' group was created
-with an ID other than `1`. In this case, the created admin user was not added
-to the correct group, and did not have the correct admin permissions.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3018[Issue 3018]:
-Fix query for changes using a label with a group operator.
-+
-The `group` operator was being ignored when searching for changes with labels
-because the search index does not contain group information.
-
-* Fix online reindexing of changes that don't already exist in the index.
-+
-Changes are now always reloaded from the database during online reindex.
-
-* Fix reviewer suggestion for accounts containing upper case letters.
-+
-When an email for an account contained upper-case letter(s), this account
-couldn't be added as a reviewer by selecting it from the suggested list of
-accounts.
-
-=== Authentication
-
-* Fix handling of lowercase HTTP username.
-+
-When `auth.userNameToLowerCase` is set to true the HTTP-provided username
-should be converted to lowercase as it is done on all the other authentication
-mechanisms.
-
-* Don't create new account when claimed OAuth identity is unknown.
-+
-The Claimed Identity feature was enabled to support old Google OpenID accounts,
-that cannot be activated anymore. In some corner cases, when for example the URL
-is not from the production Gerrit site, for example on a staging instance, the
-OpenID identity may deviate from the original one. In case of mismatch, the lookup
-of the user for the claimed identity would fail, causing a new account to be
-created.
-
-=== UI
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3714[Issue 3714]:
-Improve visibility of comments on dark themes.
-
-* Fix highlighting of search results and trailing whitespaces in intraline
-diff chunks.
-
-=== Plugins
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3768[Issue 3768]:
-Fix usage of `EqualsFilePredicate` in plugins.
-
-* Suggest to upgrade installed plugins per default during site initialization
-to new Gerrit version.
-+
-The default was 'No' which resulted in some sites not upgrading core
-plugins and running the wrong versions.
-
-* Fix reading of plugin documentation.
-+
-Under some circumstances it was possible to fail with an IO error.
-
-* Replication
-
-** Recursively include parent groups of groups specified in `authGroup`.
-+
-An `authGroup` could be included in other groups and should be granted the
-same permission as its parents.
-
-** Put back erroneously removed documentation of `remote.NAME.timeout`.
-
-** Add logging of cancelled replication events.
-
-* API
-
-** Allow to use `CurrentSchemaVersion`.
-
-** Allow to use `InternalChangeQuery.query()`.
-
-** Allow to use `JdbcUtil.port()`.
-
-** Allow to use GWTORM `Key` classes.
-
-== Documentation Updates
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=412[Issue 412]:
-Update documentation of `commentlink.match` regular expression to clarify
-that the expression is applied to the rendered HTML.
-
-* Remove warning about unstable change edit REST API endpoints.
-+
-These endpoints should be considered stable since version 2.11.
-
-* Document that `ldap.groupBase` and `ldap.accountBase` are repeatable.
-
diff --git a/ReleaseNotes/ReleaseNotes-2.11.7.txt b/ReleaseNotes/ReleaseNotes-2.11.7.txt
deleted file mode 100644
index 6742279..0000000
--- a/ReleaseNotes/ReleaseNotes-2.11.7.txt
+++ /dev/null
@@ -1,42 +0,0 @@
-= Release notes for Gerrit 2.11.7
-
-Gerrit 2.11.7 is now available:
-
-link:https://gerrit-releases.storage.googleapis.com/gerrit-2.11.7.war[
-https://gerrit-releases.storage.googleapis.com/gerrit-2.11.7.war]
-
-There are no schema changes from link:ReleaseNotes-2.11.6.html[2.11.6].
-
-== Bug Fixes
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3882[Issue 3882]:
-Fix 'No user on email thread' exception when label with group parameter is
-used in watched projects predicate.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3877[Issue 3877]:
-Include files in output when using `gerrit query` with combination of
-search operators.
-+
-A regression introduced in version 2.11.6 caused files to be omitted
-in the output.
-
-* Include comments in output when using `gerrit query` with the
-`--current-patch-set` option.
-+
-Comments were added at the change level but were not added at the
-patch set level.
-
-* Honor the `sendemail.allowrcpt` setting when adding new email address.
-+
-When adding a new email address via the UI or REST API, it was possible for
-the user to add an address that does not belong to a domain allowed by the
-`sendemail.allowrcpt` configuration. However, when sending the verification
-email, the recipient address was (correctly) dropped, and the email had no
-recipients. This resulted in an error from the SMTP server and an 'Internal
-server error' message to the user.
-
-* Remove unnecessary log messages.
-+
-The messages 'Assuming empty group membership' and 'Skipping delivery of
-email' do not add any value and were filling up the error log.
-
diff --git a/ReleaseNotes/ReleaseNotes-2.11.8.txt b/ReleaseNotes/ReleaseNotes-2.11.8.txt
deleted file mode 100644
index 0aa8dfc..0000000
--- a/ReleaseNotes/ReleaseNotes-2.11.8.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-= Release notes for Gerrit 2.11.8
-
-Gerrit 2.11.8 is now available:
-
-link:https://gerrit-releases.storage.googleapis.com/gerrit-2.11.8.war[
-https://gerrit-releases.storage.googleapis.com/gerrit-2.11.8.war]
-
-There are no schema changes from link:ReleaseNotes-2.11.7.html[2.11.7].
-
-== Bug Fixes
-
-* Upgrade Apache commons-collections to version 3.2.2.
-+
-Includes a fix for a link:https://issues.apache.org/jira/browse/COLLECTIONS-580[
-remote code execution exploit].
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1207[Issue 1207]:
-Fix keyboard shortcuts for non-US keyboards on side-by-side diff screen.
-+
-The forward/backward navigation keys `[` and `]` only worked on keyboards where
-these characters could be typed without using any modifier key (like CTRL, ALT,
-etc.).
-+
-Note that the problem still exists on the unified diff screen.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3919[Issue 3919]:
-Explicitly set parent project to 'All-Projects' when a project is created
-without giving the parent.
-
-* Don't add message twice on abandon or restore via ssh review command.
-+
-When abandoning or reviewing a change via the ssh `review` command, and
-providing a message with the `--message` option, the message was added to
-the change twice.
-
-* Clear the input box after cancelling add reviewer action.
-+
-When the action was cancelled, the content of the input box was still
-there when opening it again.
-
-* Fix internal server error when aborting ssh command.
diff --git a/ReleaseNotes/ReleaseNotes-2.11.9.txt b/ReleaseNotes/ReleaseNotes-2.11.9.txt
deleted file mode 100644
index 52ee3fe..0000000
--- a/ReleaseNotes/ReleaseNotes-2.11.9.txt
+++ /dev/null
@@ -1,49 +0,0 @@
-= Release notes for Gerrit 2.11.9
-
-Gerrit 2.11.9 is now available:
-
-link:https://gerrit-releases.storage.googleapis.com/gerrit-2.11.9.war[
-https://gerrit-releases.storage.googleapis.com/gerrit-2.11.9.war]
-
-There are no schema changes from link:ReleaseNotes-2.11.8.html[2.11.8].
-
-== Bug Fixes
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=4070[Issue 4070]:
-Don't return current patch set in queries if the current patch set is not
-visible.
-+
-When querying changes with the `gerrit query` ssh command, and passing the
-`--current-patch-set` option, the current patch set was included even when
-it is not visible to the caller (for example when the patch set is a draft,
-and the caller cannot see drafts).
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3970[Issue 3970]:
-Fix keyboard shortcuts for special processing of CTRL and META.
-+
-The processing of CTRL and META was incorrectly removed in Gerrit version
-2.11.8, resulting in shortcuts like 'STRG+T' being interpreted as 'T'.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=4056[Issue 4056]:
-Fix download URLs for BouncyCastle libraries.
-+
-The location of the libraries was moved, so the download URLs are updated
-accordingly.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=4055[Issue 4055]:
-Fix subject for 'Updated Changes' lines on push.
-+
-When a change was updated it showed the subject from the previous patch set
-instead of the subject from the new current patch set.
-
-* Fix incorrect loading of access sections in `project.config` files.
-
-* Fix internal server error when `auth.userNameToLowerCase` is enabled
-and the auth backend does not provide the username.
-
-* Fix error reindexing changes when a change no longer exists.
-
-* Fix internal server error when loading submit rules.
-
-* Fix internal server error when parsing tracking footers from commit
-messages.
diff --git a/ReleaseNotes/ReleaseNotes-2.11.txt b/ReleaseNotes/ReleaseNotes-2.11.txt
deleted file mode 100644
index 1ca6825..0000000
--- a/ReleaseNotes/ReleaseNotes-2.11.txt
+++ /dev/null
@@ -1,837 +0,0 @@
-= Release notes for Gerrit 2.11
-
-
-Gerrit 2.11 is now available:
-
-link:https://www.gerritcodereview.com/download/gerrit-2.11.war[
-https://www.gerritcodereview.com/download/gerrit-2.11.war]
-
-Gerrit 2.11 includes the bug fixes done with
-link:ReleaseNotes-2.10.1.html[Gerrit 2.10.1],
-link:ReleaseNotes-2.10.2.html[Gerrit 2.10.2] and
-link:ReleaseNotes-2.10.3.html[Gerrit 2.10.3].
-These bug fixes are *not* listed in these release notes.
-
-
-== Important Notes
-
-
-*WARNING:* This release contains schema changes.  To upgrade:
-----
-  java -jar gerrit.war init -d site_path
-----
-
-Gerrit 2.11 requires a secondary index, which can be created offline
-by running the `reindex` program:
-
-----
-  java -jar gerrit.war reindex -d site_path
-----
-
-If the site that is upgraded already has a secondary index, the
-secondary index can be upgraded online. This is important for large
-sites since running the `reindex` program can take a long time and
-contributes significantly to the downtime that is required for the
-upgrade.
-
-Gerrit 2.11 supports online reindexing only from the index version `11`
-which is the index version of Gerrit 2.10. This means if you come from
-an older release it makes sense to first upgrade to 2.10 and then do
-the upgrade to 2.11 so that you can profit from online reindexing.
-
-In case you are upgrading from 2.10 it is *important* to check *before*
-the upgrade to 2.11 that the index version of your Gerrit 2.10 site is
-`11`. You can check the index version in
-`$site_path/index/gerrit_index.config`. Your Gerrit 2.10 site may run
-with an older index version (e.g. if online reindexing to index version
-`11` is still running or if online reindexing to version `11` has
-failed). In this case you first need to successfully migrate your index
-version of your Gerrit 2.10 site to `11` and only then start with the
-2.11 upgrade. If you start the 2.11 upgrade when the schema version of
-your Gerrit 2.10 site is older than `11`, online reindexing is no longer
-possible and you need to reindex offline by using the `reindex` program.
-
-*WARNING:* Upgrading to 2.11.x requires the server be first upgraded to 2.8 (or
-2.9) and then to 2.11.x. If you are upgrading from 2.8.x or later, you may ignore
-this warning and upgrade directly to 2.11.x.
-
-*WARNING:* When upgrading from version 2.8.4 or older with a site that uses
-Bouncy Castle Crypto, new versions of the libraries will be downloaded. The old
-libraries should be manually removed from site's `lib` folder to prevent the
-startup failure described in
-link:https://code.google.com/p/gerrit/issues/detail?id=3084[Issue 3084].
-
-*WARNING:* The 'Generate HTTP Password' capability has been
-link:#remove-generate-http-password-capability[removed].
-
-*WARNING:* Google will
-link:https://developers.google.com/+/api/auth-migration[shut down their OpenID
-service on 20th April 2015]. Administrators of sites whose users are registered
-with Google OpenID accounts should encourage the users to
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/config-sso.html#_multiple_identities[
-add an alternative identity to their account] before this date. Users who do
-not add an alternative identity before this date will need to create a new
-account and ask the site administrator to
-link:https://code.google.com/p/gerrit/wiki/SqlMergeUserAccounts[merge it].
-
-*WARNING:* The
-link:https://gerrit-review.googlesource.com/Documentation/2.10/rest-api-changes.html#message[
-Edit Commit Message] REST API endpoint is removed
-
-*WARNING:* The deprecated '/query' URL is removed and will now return `Not Found`.
-
-== Release Highlights
-
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=505[Issue 505]:
-Changes can be created and edited directly in the browser. See the
-link:#inline-editing[Inline editing] section for more details.
-
-* Many improvements in the new change screen.
-
-* The old change screen is removed.
-
-
-== New Features
-
-
-=== Web UI
-
-[[inline-editing]]
-==== Inline Editing
-
-Refer to the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/user-inline-edit.html[
-inline editing user guide] for detailed instructions.
-
-* New changes can be created directly in the browser via a 'Create Change'
-button on the project info screen.
-
-* New follow-up changes can be created via a 'Follow-Up' button on the change
-screen.
-
-* File content can be edited in a full screen CodeMirror editor with support for
-themes and syntax highlighting.
-
-* The CodeMirror screen can be configured in the same way as the side-by-side
-diff screen.
-
-* The file table in the change screen supports seamless navigation to the
-CodeMirror editor.
-
-* Edit mode can be started from the side-by-side diff screen with seamless
-navigation to the CodeMirror editor.
-
-* The commit message must now be changed in the context of a change edit. The
-'Edit Message' button is removed from the change screen.
-
-* Files can be added, deleted, restored and modified directly in browser.
-
-==== Change Screen
-
-* Remove the 'Edit Message' button from the change screen.
-+
-The commit message is now edited using the inline edit feature.
-
-* Add support for changing parent revision with the 'Rebase' button.
-+
-Using the 'Rebase' button it is now possible to rebase a change onto a
-different change (on the same destination branch), rather than only onto the
-head of the destination branch or the latest patch set of the predecessor change.
-
-* Show the parent commit's subject as a tooltip.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2541[Issue 2541],
-link:http://code.google.com/p/gerrit/issues/detail?id=2974[Issue 2974]:
-Allow the 'Reply' button's
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/config-gerrit.html#change.replyLabel[
-label and tooltip] to be configured.
-
-* Improve file sorting for C and C++ files.
-+
-Header files are now listed before implementation files.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=3148[Issue 3148]:
-Allow display of colored size bars to be enabled or disabled per user.
-+
-The 'Show Change Sizes As Colored Bars In Changes Table' setting is renamed to
-'Show Change Sizes As Colored Bars' and is now used to also control how the
-change size is shown per file in the file table.
-+
-When enabled (which is the default), the change size per file is shown as a sum
-of lines added/removed, and also representated by a colored bar showing the
-proportion of added/removed lines.
-+
-When disabled, the colored bar is not shown and the change size per file is shown
-in the same way as it used to be in the old change screen.
-
-* Show changes across all projects and branches in the `Same Topic` tab.
-
-
-==== Side-By-Side Diff
-
-* New button to switch between side-by-side diff and unified diff.
-
-* New preference setting to toggle auto-hiding of the diff table header.
-+
-The setting determines whether or not the diff table header with the patch set
-selection should be automatically hidden when scrolling down more than half of
-a page.
-
-* Highlight search results on scrollbar.
-+
-Search results in vim mode are highlighted in the scrollbar with gold
-colored annotations.
-
-* Set line length to 72 characters for commit messages.
-
-* Add syntax highlighting for several new modes:
-
-** link:https://code.google.com/p/gerrit/issues/detail?id=2848[Issue 2848]: CSharp
-** Dart
-** Dockerfile
-** GLSL shader
-** Go
-** Objective C
-** RELAX NG
-** link:http://code.google.com/p/gerrit/issues/detail?id=2779[Issue 2779]: reStructured text
-** Soy
-
-
-==== Projects Screen
-
-* Add pagination and filtering on the branch list page.
-
-* Add an 'Edit Config' button on the project info page.
-+
-The button creates a new change on the `refs/meta/config` branch and opens the
-`project.config` file in the inline editor.
-+
-This allows project owners to easily edit the `project.config` file from the
-browser, which is useful since it is possible that not all configuration options
-are available in the UI.
-
-=== REST
-
-==== Accounts
-
-* Add new link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/rest-api-accounts.html#suggest-account[
-Suggest Account endpoint].
-
-==== Changes
-
-* The link:https://gerrit-review.googlesource.com/Documentation/2.10/rest-api-changes.html#message[
-Edit Commit Message] endpoint is removed in favor of the new
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/rest-api-changes.html#put-change-edit-message[
-Change commit message in Change Edit] and
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/rest-api-changes.html#publish-edit[
-Publish Change Edit] endpoints.
-
-* Add new
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/rest-api-changes.html#check-change[
-Check Change endpoint].
-+
-In the past, Gerrit bugs, lack of transactions, and unreliable NoSQL backends
-have at various times produced a bewildering variety of corrupt states.
-+
-This endpoint can be used to detect, explain, and repair some of these possible
-states of a change.
-
-* Add new
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/rest-api-changes.html#get-revision-actions[
-Get Revision Actions endpoint].
-
-* Add
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/rest-api-changes.html#change-actions[
-`CHANGE_ACTIONS`] option on the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/rest-api-changes.html#get-change-detail[
-Get Change Detail] endpoint.
-
-
-==== Change Edits
-
-Several new endpoints are added to support the inline edit feature.
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/rest-api-changes.html#get-edit-detail[
-Get Edit Detail].
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/rest-api-changes.html#put-edit-file[
-Change file content in Change Edit].
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/rest-api-changes.html#post-edit[
-Restore file content in Change Edit].
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/rest-api-changes.html#put-change-edit-message[
-Change commit message in Change Edit].
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/rest-api-changes.html#delete-edit-file[
-Delete file in Change Edit].
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/rest-api-changes.html#get-edit-file[
-Retrieve file content from Change Edit].
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/rest-api-changes.html#get-edit-message[
-Retrieve commit message from Change Edit or current patch set of the change].
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/rest-api-changes.html#publish-edit[
-Publish Change Edit].
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/rest-api-changes.html#rebase-edit[
-Rebase Change Edit].
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/rest-api-changes.html#delete-edit[
-Delete Change Edit].
-
-
-==== Projects
-
-* Add new
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/rest-api-projects.html#delete-branches[
-Delete Branches] endpoint.
-
-* Add filtering and pagination options on the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/rest-api-projects.html#list-branches[
-List Branches] endpoint.
-
-* Add new
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/rest-api-projects.html#list-tags[
-List Tags] endpoint.
-
-* Add new
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/rest-api-projects.html#get-tag[
-Get Tag] endpoint.
-
-
-=== Configuration
-
-* Add support for
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/config-gerrit.html#auth.httpExternalIdHeader[
-HTTP external ID header].
-+
-This can be used when authenticating with a federated identity token from
-an external system, e.g. GitHub's OAuth 2.0 authentication.
-
-* Add
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/config-labels.html#label_copyAllScoresIfNoChange[
-`copyAllScoresIfNoChange`] setting for labels.
-+
-Allows to copy scores forward when a new patch set is uploaded that has the same
-parent tree, code delta, and commit message as the previous patch set.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2786[Issue 2786]:
-Allow non-administrators to modify user accounts.
-+
-A new global capability,
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/access-control.html#capability_modifyAccount[
-'Modify Account'], which allows the granted group members to modify user account
-settings via the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/cmd-set-account.html[
-`set-account` SSH command].
-+
-Modification of users' SSH keys is still restricted to administrators.
-
-* Add support for
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/config-gerrit.html#ldap.useConnectionPooling[
-LDAP connection pooling].
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=699[Issue 699]: Allow to
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/config-gerrit.html#receive.maxBatchChanges[
-limit max number of changes pushed in a batch].
-+
-Can be overridden by members of groups that are granted the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/access-control.html#capability_batchChangesLimit[
-Batch Changes Limit] capability.
-
-* Allow to
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/config-gerrit.html#gerrit.disableReverseDnsLookup[
-disable reverse DNS lookup].
-+
-This option can be set to improve push time from hosts without a reverse DNS
-entry.
-
-* Allow to
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/config-gerrit.html#cache.projects.loadOnStartup[
-load the project cache at server startup].
-
-* Allow members of groups granted the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/access-control.html#capability_accessDatabase[
-AccessDatabase capability] to view metadata refs.
-
-* Allow to
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/config-gerrit.html#http.addUserAsRequestAttribute[
-add the user to the http request attributes].
-
-* Allow to
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/config-gerrit.html#suggest.fullTextSearch[
-enable full text search in memory for review suggestions].
-+
-The maximum number of reviewers evaluated can be limited with
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/config-gerrit.html#suggest.fullTextSearchMaxMatches[
-suggest.fullTextSearchMaxMatches].
-
-* Allow to provide an alternative
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/config-gerrit.html#gerrit.secureStoreClass[
-secure store implementation].
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1195[Issue 1195]:
-Allow projects to be configured to create a new change for every uploaded commit that is not in the target branch.
-
-* Allow to configure
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/config-gerrit.html#container.daemonOpt[
-options to pass to the daemon].
-
-=== Daemon
-
-* Allow to enable the http daemon when running in slave mode.
-+
-The `--enable-httpd` option can be used in conjunction with the `--slave` option
-to allow clients to fetch from the slave over the http protocol.
-+
-HTTP Authentication may also be used when running in slave mode.
-
-* Include the submitter's name in the change message when a change is submitted.
-
-* Add a message to changes created via cherry pick.
-+
-When a change is cherry-picked to another branch using the cherry-pick action,
-the message 'Patch Set <number>: Cherry Picked from branch <name>.' is added as
-a change message on the created change.
-
-* Don't send 'new patch set' notification emails for trivial rebases.
-
-
-=== SSH
-
-* Add new commands
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/cmd-logging-ls-level.html[
-`logging ls-level`] and
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/cmd-logging-set-level.html[
-`logging set-level`] to show and set the logging level at runtime.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=602[Issue 602]:
-Add `--json` option to the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/cmd-review.html[
-`review` SSH command].
-+
-Review input can be given to the `review` command in JSON format corresponding
-to the REST API's
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/rest-api-changes.html#review-input[
-ReviewInput] entity.
-
-*  link:https://code.google.com/p/gerrit/issues/detail?id=2824[Issue 2824]:
-Add `--rebase` option to the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/cmd-review.html[
-`review` SSH command].
-
-* Add `--clear-http-password` option to the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/cmd-set-account.html[
-`set-account` SSH command].
-
-* Add `--preferred-email` option to the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/cmd-set-account.html[
-`set-account` SSH command].
-
-=== Email
-
-* Add `$change.originalSubject` field for email templates.
-+
-GMail threads messages together by subject and ignores the list headers included
-by Gerrit.
-+
-Site administrators that run servers whose end-user base is mostly on GMail can
-modify the site's `ChangeSubject.vm` template to use `$change.originalSubject` to
-improve threading for GMail inboxes.
-+
-The `originalSubject` field is automatically taken from the existing subject
-field during first use.
-
-
-=== Plugins
-
-==== General
-
-* Plugins can listen to account group membership changes.
-+
-The audit log service allows to register listeners to group member added and
-group member deleted events. A default listener logs these events to the database
-as before, but additional listeners may now be registered for these events using
-the `GroupMemberAuditListener` interface.
-
-* Plugins can validate ref operations.
-+
-Plugins implementing the `RefOperationValidationListener` interface can
-perform additional validation checks against ref creation/deletion operations
-before they are applied to the git repository.
-
-* Plugins can provide project-aware top menu extensions
-+
-Plugins can provide sub-menu items within the 'Projects' context. The
-'$\{projectName\}' placeholder is replaced by the project name.
-
-* Auto register static/init.js as JavaScript plugin.
-+
-When a plugin does not expose Guice Modules explicitly, auto discover and
-register static/init.js as WebUi extension if found by the plugin content
-scanner.
-
-* Plugins can validate outgoing emails.
-+
-Plugins implementing `OutgoingEmailValidationListener` interface can filter
-and modify outgoing emails before they are sent.
-
-* Plugins that provide initialization steps may now use functionality
-from InitUtil in core Gerrit.
-
-* Plugins can post change reviews with historic timestamps.
-+
-This allows, for example, to write a plugin that can import a project including
-review information from another Gerrit server.
-
-* New extensions in the Java Plugin API:
-
-** Set/Put topic.
-** Get mergeable status.
-** link:https://code.google.com/p/gerrit/issues/detail?id=461[Issue 461]:
-Get current user.
-** Get file content.
-** Get file diff.
-** Get comments and drafts.
-** Get change edit.
-
-==== Replication
-
-* Projects can be specified with wildcard in the `start` command.
-
-
-== Bug Fixes
-
-=== Daemon
-
-* Change 'Merge topic' to 'Merge changes from topic'.
-+
-When multiple changes from a topic are submitted resulting in a merge commit,
-the title of the merge commit is now 'Merge changes from topic' instead of
-'Merge topic'.
-
-* Fix visibility checks for `refs/meta/config`.
-+
-Under some conditions it was possible for the `refs/meta/config` branch to be
-erroneously considered not visible to the user.
-
-* Sort list of updated changes in output from push.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2940[Issue 2940]:
-Improve warning messages when `Change-Id` is missing in the commit message.
-
-** Add a hint to amend the commit after installing the commit-msg hook.
-** Don't show 'Suggestion for commit message' when `Change-Id` is missing.
-
-* Allow to publish draft patch sets even when `allowDrafts` is false.
-+
-If a user uploaded a change while `allowDrafts` was enabled, and then it was
-disabled by the administrator, the uploaded change could not be published and
-was stuck in the draft state.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=3249[Issue 3249]:
-Fix server error when checking mergeability of a change.
-
-* Workaround Guice bug "getPathInfo not decoded".
-+
-Due to link:https://github.com/google/guice/issues/745[Guice issue 745], cloning
-of a repository with a space in its name was impossible.
-
-
-=== Secondary Index / Search
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2822[Issue 2822]:
-Improve Lucene analysis of words linked with underscore or dot.
-+
-Instead of treating words linked with underscore or dot as one word, Lucene now
-treats them as separate words.
-
-* Fix support for `change~branch~id` in query syntax.
-
-
-=== Configuration
-
-[[remove-generate-http-password-capability]]
-* Remove the 'Generate HTTP Password' capability.
-+
-The 'Generate HTTP Password' capability has been removed to close a security
-vulnerability.  Now only administrators are allowed to generate and delete other
-users' http passwords via the REST or SSH interface.
-+
-It is encouraged to clean up your `project.config` settings after upgrading.
-
-* Fix support for multiple `footer` tokens in tracking ID config.
-+
-Contrary to
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/config-gerrit.html#trackingid[
-the documentation], if more than one `footer` token was specified in the
-`trackingid` section, only the first was used.
-
-* Treat empty
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/config-gerrit.html#hooks[
-`hooks.*`] values as missing, rather than trying to execute the hooks
-directory.
-
-* Fix `changed-merged` hook configuration.
-+
-Contrary to the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/config-gerrit.html#hooks[
-documentation], the changed-merged hook configuration value was being
-read from `hooks.changeMerged`. Fix to use `hooks.changeMergedHook` as
-documented.
-
-=== Web UI
-
-==== Change List
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=3304[Issue 3304]:
-Always show a tooltip on the label column entries.
-
-==== Change Screen
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=3147[Issue 3147]:
-Allow to disable muting of common path prefixes in the file list.
-+
-In the file table, parts of the file path that are common to the file previously
-listed are muted. The purpose of this is to make it easier to see files that all
-belong under the same path, but some users find it annoying.
-+
-This feature can now be enabled or disabled, per user, with the 'Mute Common
-Path Prefixes In File List' setting.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=3130[Issue 3130]:
-Remove special handling of 'LGTM' in review comments
-+
-Typing 'LGTM' in the review cover message no longer automatically selects the
-highest available Code-Review score.
-
-* Show a confirmation dialog before deleting a draft change or patch set.
-+
-Previously there was no confirmation and a draft change or revision patch
-set would be lost if the button was accidentally clicked.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2533[Issue 2533]:
-Improve the layout and color scheme of buttons.
-+
-Several improvements have been made:
-+
-** Move 'Publish' and 'Delete Change/Revision' buttons into header.
-+
-If a change/revision is a draft the natural next step is to publish (or delete)
-it, hence these buttons should be displayed in a more prominent place.
-
-** Highlight the 'Publish' button in blue.
-+
-If a change is a draft the natural next step is to publish it, hence
-the 'Publish' button should be highlighted similar to the quick
-approve button.
-
-** Fix the border color of buttons on the reply popup.
-+
-The buttons are blue but had white borders, which was inconsistent with the
-buttons on the change screen.
-
-** Remove red color for 'Abandon' and 'Restore' buttons.
-+
-There is nothing dangerous about these operations that justifies
-highlighting the buttons in red color. When the buttons are clicked
-there is a popup where the user must confirm the operation, so it can
-still be canceled.
-
-** Hide quick approve button for draft changes.
-+
-A draft change cannot be submitted, hence quick approving it is not that
-important. Hiding the quick approve button on draft changes makes space in the
-header for displaying more important actions such as 'Publish'.
-
-* Differentiate between conflicts and already merged errors in cherry-pick
-+
-When a cherry-pick operation failed with 'Cherry pick failed' error, there was no
-way to know the reason for the failure: merge conflict or the commit is already
-on the target branch.  These failures are now differentiated and an appropriate
-error is reported.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2837[Issue 2837]:
-Improve display of long user names for collapsed comments in history.
-+
-If there were several users with long user names with the same prefix, e.g.
-'AutomaticGerritVoterLinux' and 'AutomaticGerritVoterWindows', they would both
-be shown as 'AutomaticGerritVo...' and users had to expand the comment to see
-the full user name.
-+
-The ellipsis is now inserted in the middle of the user name so that the start
-and end of the user name are always visible, e.g. 'AutomaticG...VoterLinux' and
-'AutomaticG...terWindows'.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2992[Issue 2992]:
-Fix display of review comments for Chrome on Android.
-+
-Chrome for Android has Font Boosting, which caused the review comments to
-be displayed too large.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2909[Issue 2909]:
-Make change owner votes removable.
-+
-If a change owner voted on a change, it was not possible for anyone other
-than the owner to remove the vote.
-
-* Preserve topic when cherry-picking.
-+
-When a change is cherry-picked, the topic from the source change is preserved
-on the newly created change.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=3007[Issue 3007]:
-Make the selected tab persistent.
-+
-If a change from the 'Same Topic' tab was clicked, the selected tab would reset
-to the default tab ('Related Changes').
-
-* Left-align column titles in the file list.
-
-* Increase right margin of download box to make space for scrollbar.
-+
-Under some circumstances the browser's scrollbar would be shown over the
-copy-to-clipboard icons in the download dropdown.
-
-* Display +1 score's text next to the checkbox for simple boolean labels.
-+
-In the reply box, the text of the label score is displayed on the right hand
-side when a score is selected, but this was missing for simple boolean labels.
-
-* Don't show missing accounts as reviewer suggestions.
-
-* Show the email address that matched the search in reviewer suggestions.
-+
-When matching accounts by email address against an external account, results
-now show the email address that matched, not the preferred email address.
-
-* Fix accidental reviewer selection on slow networks.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=3120[Issue 3120]:
-Align parent weblinks with parent commits in the commit box.
-
-
-==== Side-By-Side Diff
-
-* Return to normal mode after editing a draft comment.
-+
-Previously it would remain in visual mode.
-
-* Fix C++ header and source syntax highlighting
-+
-cpp and hpp files were sometimes rendered with C mode and not the extended C++
-mode.  This prevented keywords like `class` from being colored by the
-highlighter.
-
-
-==== Project Screen
-
-* Fix alignment of checkboxes on project access screen.
-+
-The 'Exclusive' checkbox was not aligned with the other checkboxes.
-
-=== REST API
-
-==== Changes
-
-* Remove the administrator restriction on the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/rest-api-changes.html#index-change[
-index change] endpoint.
-+
-The endpoint can now be used by any user who has visibility of the change.
-
-* Only include account ID in responses unless `DETAILED_ACCOUNTS` option is set.
-+
-The behavior was inconsistent with the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/rest-api-accounts.html#account-info[
-documentation]. In the default case it was including only the account name,
-rather than only the account ID.
-
-* Include revision's ref in responses.
-+
-The ref of a revision was only returned as part of the fetch info, which is only
-available if the download commands are installed.
-
-* Correctly set the limit to the default when no limit is given in the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/rest-api-changes.html#suggest-reviewers[
-suggest reviewers] endpoint.
-
-* Return correct response from 'delete draft' endpoints.
-+
-When the `change.allowDrafts` setting is False, it is not allowed to delete
-draft changes or patch sets.
-+
-In this case the response `405 Method Not Allowed` is now returned, instead of
-`409 Conflict`.
-
-
-==== Projects
-
-* Make it mandatory to specify at least one of the `--prefix`, `--match` or `--regex`
-options in the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.11/rest-api-projects.html#list-projects[
-list projects] endpoint.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2706[Issue 2706]:
-Do not delete branches concurrently.
-+
-Deleting multiple branches from the UI was resulting in a server error when
-branches were in the packed-refs.
-
-* Add retry logic for lock failure when deleting a branch.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=3153[Issue 3153]:
-Fix handling of project names ending with `.git`.
-+
-The projects REST API documentation states that the `.git` suffix will be
-stripped off the input project name, if present.
-+
-This was working for the 'Create Project' endpoint, but not for any of the
-others.
-
-
-=== Plugins
-
-==== Replication
-
-* Create missing repositories on the remote when replicating with the git
-protocol.
-
-* Make `createMissingRepositories = false` take effect on `project-created` event.
-+
-Previously `createMissingRepositories = false` would prevent the replication
-plugin from trying to create a new project when a `ref-updated` event was fired,
-but when a `project-created` event was fired the replication plugin would try to
-create a project on the remote.
-
-
-== Upgrades
-
-* Update Antlr to 3.5.2.
-
-* Update ASM to 5.0.3.
-
-* Update CodeMirror to 4.10.0-6-gd0a2dda.
-
-* Update Guava to 18.0.
-
-* Update Guice to 4.0-beta5.
-
-* Update GWT to 2.7.
-
-* Update gwtjsonrpc to 1.7-2-g272ca32.
-
-* Update gwtorm to 1.14-14-gf54f1f1.
-
-* Update Jetty to 9.2.9.v20150224.
-
-* Update JGit to 3.7.0.201502260915-r.58-g65c379e.
-
-* Update Lucene to 4.10.2.
-
-* Update Parboiled to 1.1.7.
-
-* Update Pegdown to 1.4.2.
diff --git a/ReleaseNotes/ReleaseNotes-2.12.1.txt b/ReleaseNotes/ReleaseNotes-2.12.1.txt
deleted file mode 100644
index 8f94810..0000000
--- a/ReleaseNotes/ReleaseNotes-2.12.1.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-= Release notes for Gerrit 2.12.1
-
-Release notes have been moved to the project homepage:
-link:https://www.gerritcodereview.com/releases/2.12.md#2.12.1[
-Release notes for Gerrit 2.12.1].
diff --git a/ReleaseNotes/ReleaseNotes-2.12.2.txt b/ReleaseNotes/ReleaseNotes-2.12.2.txt
deleted file mode 100644
index 35682ed..0000000
--- a/ReleaseNotes/ReleaseNotes-2.12.2.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-= Release notes for Gerrit 2.12.2
-
-Release notes have been moved to the project homepage:
-link:https://www.gerritcodereview.com/releases/2.12.md#2.12.2[
-Release notes for Gerrit 2.12.2].
diff --git a/ReleaseNotes/ReleaseNotes-2.12.3.txt b/ReleaseNotes/ReleaseNotes-2.12.3.txt
deleted file mode 100644
index 06b18da..0000000
--- a/ReleaseNotes/ReleaseNotes-2.12.3.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-= Release notes for Gerrit 2.12.3
-
-Release notes have been moved to the project homepage:
-link:https://www.gerritcodereview.com/releases/2.12.md#2.12.3[
-Release notes for Gerrit 2.12.3].
diff --git a/ReleaseNotes/ReleaseNotes-2.12.4.txt b/ReleaseNotes/ReleaseNotes-2.12.4.txt
deleted file mode 100644
index 8321efa..0000000
--- a/ReleaseNotes/ReleaseNotes-2.12.4.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-= Release notes for Gerrit 2.12.4
-
-Release notes have been moved to the project homepage:
-link:https://www.gerritcodereview.com/releases/2.12.md#2.12.4[
-Release notes for Gerrit 2.12.4].
diff --git a/ReleaseNotes/ReleaseNotes-2.12.5.txt b/ReleaseNotes/ReleaseNotes-2.12.5.txt
deleted file mode 100644
index 4199fe0..0000000
--- a/ReleaseNotes/ReleaseNotes-2.12.5.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-= Release notes for Gerrit 2.12.5
-
-Release notes have been moved to the project homepage:
-link:https://www.gerritcodereview.com/releases/2.12.md#2.12.5[
-Release notes for Gerrit 2.12.5].
diff --git a/ReleaseNotes/ReleaseNotes-2.12.txt b/ReleaseNotes/ReleaseNotes-2.12.txt
deleted file mode 100644
index 3eae5e4..0000000
--- a/ReleaseNotes/ReleaseNotes-2.12.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-= Release notes for Gerrit 2.12
-
-Release notes have been moved to the project homepage:
-link:https://www.gerritcodereview.com/releases/2.12.md[
-Release notes for Gerrit 2.12].
diff --git a/ReleaseNotes/ReleaseNotes-2.13.1.txt b/ReleaseNotes/ReleaseNotes-2.13.1.txt
deleted file mode 100644
index 7b27ad3..0000000
--- a/ReleaseNotes/ReleaseNotes-2.13.1.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-= Release notes for Gerrit 2.13.1
-
-Release notes have been moved to the project homepage:
-link:https://www.gerritcodereview.com/releases/2.13.md#2.13.1[
-Release notes for Gerrit 2.13.1].
diff --git a/ReleaseNotes/ReleaseNotes-2.13.2.txt b/ReleaseNotes/ReleaseNotes-2.13.2.txt
deleted file mode 100644
index 72bd218..0000000
--- a/ReleaseNotes/ReleaseNotes-2.13.2.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-= Release notes for Gerrit 2.13.2
-
-Release notes have been moved to the project homepage:
-link:https://www.gerritcodereview.com/releases/2.13.md#2.13.2[
-Release notes for Gerrit 2.13.2].
diff --git a/ReleaseNotes/ReleaseNotes-2.13.txt b/ReleaseNotes/ReleaseNotes-2.13.txt
deleted file mode 100644
index b3e125d..0000000
--- a/ReleaseNotes/ReleaseNotes-2.13.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-= Release notes for Gerrit 2.13
-
-Release notes have been moved to the project homepage:
-link:https://www.gerritcodereview.com/releases/2.13.md[
-Release notes for Gerrit 2.13].
diff --git a/ReleaseNotes/ReleaseNotes-2.2.0.txt b/ReleaseNotes/ReleaseNotes-2.2.0.txt
deleted file mode 100644
index 5cc54f9..0000000
--- a/ReleaseNotes/ReleaseNotes-2.2.0.txt
+++ /dev/null
@@ -1,59 +0,0 @@
-= Release notes for Gerrit 2.2.0
-
-Gerrit 2.2.0 is now available:
-
-link:https://www.gerritcodereview.com/download/gerrit-2.2.0.war[https://www.gerritcodereview.com/download/gerrit-2.2.0.war]
-
-== Schema Change
-*WARNING:* Upgrading to 2.2.0 requires the server be first upgraded
-to 2.1.7, and then to 2.2.0.
-
-*WARNING:* This release contains schema changes.  To upgrade:
-----
-  java -jar gerrit.war init -d site_path
-----
-
-*WARNING:* The "projects" and "ref_rights" tables are no longer
-stored in the SQL database. The tables have been moved to Git
-storage, inside of the `refs/meta/config` branch of each managed
-Git repository. The init based upgrade tool will automatically
-export the current table contents and create the Git data.
-
-== New Features
-
-=== Project Administration
-* issue 436 List projects by scanning the managed Git directory
-+
-Instead of generating the list of projects from SQL database, the
-project list is obtained by recursively scanning the Git directory.
-Adding new projects is now simply a matter of creating the Git
-repository under the directory and flushing the "projects" cache
-to force the server to rescan the directory. Administrators may
-also continue to use `gerrit create-project`.
-
-* Move "projects" table into Git
-+
-The projects table columns are now stored in the `project.config`
-file of the `refs/meta/config` branch of each managed Git repository.
-
-* Move "ref_rights" table into Git
-+
-The "ref_rights" table is now stored in the "access" sections of
-the `project.config` file on the `refs/meta/config` branch of each
-managed Git repository. This brings version control auditing to the
-access data of each project.
-
-* New project Access screen to edit access controls
-+
-The Access panel of the project administration has been rewritten
-with a new UI that reflects the new Git based storage format.
-
-== Bug Fixes
-
-=== Project Administration
-* Avoid unnecessary updates to $GIT_DIR/description
-+
-Gerrit always tried to rewrite the gitweb "description" file when the
-project was modified. This lead to unnecessary changes in the local
-filesystem, leading to more data to rsync to backups than necessary.
-Fixed to only update the file if the content changes.
diff --git a/ReleaseNotes/ReleaseNotes-2.2.1.txt b/ReleaseNotes/ReleaseNotes-2.2.1.txt
deleted file mode 100644
index 26aa8db..0000000
--- a/ReleaseNotes/ReleaseNotes-2.2.1.txt
+++ /dev/null
@@ -1,75 +0,0 @@
-= Release notes for Gerrit 2.2.1
-
-Gerrit 2.2.1 is now available:
-
-link:https://www.gerritcodereview.com/download/gerrit-2.2.1.war[https://www.gerritcodereview.com/download/gerrit-2.2.1.war]
-
-== Schema Change
-*WARNING:* This release contains schema changes.  To upgrade:
-----
-  java -jar gerrit.war init -d site_path
-----
-
-*WARNING:* Upgrading to 2.2.x requires the server be first upgraded
-to 2.1.7, and then to 2.2.x.
-
-== New Features
-* Add 'Expand All Comments' checkbox in PatchScreen
-+
-Allows users to save a user preference that automatically expands
-any inline comment boxes when a page displays.
-
-* Multiple branches in ls-project
-+
-The -b option may be supplied multiple times to ls-project, each
-usage adds a new column of output per project line listing the
-current value of that branch.
-
-== Bug Fixes
-* issue 994 Rename "-- All Projects --" to "All-Projects"
-+
-The name "-- All Projects --.git" is difficult to work with on
-the UNIX command line, due to tools assuming the name is actually
-part of a long option. The project has been renamed to remove these
-leading hyphens, and remove spaces, making it more friendly to work
-with on the command line.
-
-* issue 997 Resolve Project Owners when checking access rights
-+
-Members of the 'Project Owners' magical group did not always have
-their project owner privileges when Gerrit Code Review was looking
-for "access to any ref" at the project level. This was caused by
-not expanding the 'Project Owner's group to the actual ownership
-list. Fixed.
-
-* issue 999 Do not reset Patch History selection on navigation
-+
-Navigating to the next/previous file lost the setting of the
-"Old Version" made under the "Patch History" expandable control
-on a specific file view. This was accidentally broken when the
-"Old Version History" control was added to the change page. Fixed.
-
-* issue 1001 Fix search by codereview status
-+
-Searching for labels (or any approval scores) was broken due to an
-incorrect usage of the Java "equals()" method. Fixed.
-
-* issue 1000 Fix administration of projects with no access controls
-+
-Projects that had no access sections could not have additional
-sections added to them, due to a bug in the web UI. Fixed.
-
-* Fix API breakage on ChangeDetailService
-+
-Version 2.1.7 broke the Gerrit Code Review plugin for Mylyn Reviews
-due to an accidental signature change of one of the remote JSON
-APIs. The ChangeDetailService.patchSetDetail() method is back to the
-old signature and a new patchSetDetail2() method has been added to
-handle the newer calling convention used in some contexts of the
-web UI.
-
-* Add error messages for abandon and restore when in bad state
-+
-Instead of crashing with internal NullPointerExceptions, report
-a better error message to clients when a change is being moved
-between states.
diff --git a/ReleaseNotes/ReleaseNotes-2.2.2.1.txt b/ReleaseNotes/ReleaseNotes-2.2.2.1.txt
deleted file mode 100644
index 37f5a76..0000000
--- a/ReleaseNotes/ReleaseNotes-2.2.2.1.txt
+++ /dev/null
@@ -1,50 +0,0 @@
-= Release notes for Gerrit 2.2.2.1
-
-Gerrit 2.2.2.1 is now available:
-
-link:https://www.gerritcodereview.com/download/gerrit-2.2.2.1.war[https://www.gerritcodereview.com/download/gerrit-2.2.2.1.war]
-
-
-There are no schema changes from 2.2.2.  However, if upgrading from
-anything but 2.2.2, follow the upgrade procedure in the 2.2.2
-link:ReleaseNotes-2.2.2.html[ReleaseNotes].
-
-
-== Bug Fixes
-* issue 1139 Fix change state in patch set approval if reviewer is added to
-closed change
-+
-For the dummy patch set approval that is created when a reviewer is
-added the cached change state is always open, which is incorrect if a
-reviewer is added to a closed change. As a result the closed change will
-appear in the reviewers dashboard in the 'Review Requests' section and will
-stay there forever.  Ensure the correct change state is cached in the dummy
-patch set approval when it is created.
-
-* issue 1171 Fix ownerin and reviewerin searches
-+
-Update the ownerin and reviewerin searches to use AccountGroup.UUID as
-required by commit e662fb3d4d7d0ad05791b8d2143ac5ce58117335.
-
-* issue 871 Display hash of the cherry-pick merge in comment
-+
-After merging a change via cherry-pick, we add the commit's
-hash to the comment. This was accidentally removed in
-commit 14246de3c0f81c06bba8d4530e6bf00e918c11b0
-
-
-== Documentation
-* Update top level SUBMITTING_PATCHES
-+
-This document is out of date, the URLs are from last August.
-Direct readers to the new server.
-
-* Add contributing guideline document
-
-* Documentation: update version references for 2.2.2
-+
-Correct wording and instructions to be sure they match what would
-be observed with the indicated version of gerrit.
-Expand instructions when needed to ensure all commands could be
-executed and were successful.
-Indent commands and output based on a run of the instructions
diff --git a/ReleaseNotes/ReleaseNotes-2.2.2.2.txt b/ReleaseNotes/ReleaseNotes-2.2.2.2.txt
deleted file mode 100644
index f50c4e7..0000000
--- a/ReleaseNotes/ReleaseNotes-2.2.2.2.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-= Release notes for Gerrit 2.2.2.2
-
-Gerrit 2.2.2.2 is now available:
-
-link:https://www.gerritcodereview.com/download/gerrit-2.2.2.2.war[https://www.gerritcodereview.com/download/gerrit-2.2.2.2.war]
-
-There are no schema changes from 2.2.2, or 2.2.2.1.
-
-However, if upgrading from anything earlier, follow the upgrade
-procedure in the 2.2.2 link:ReleaseNotes-2.2.2.html[ReleaseNotes].
-
-== Security Fixes
-* Some access control sections may be ignored
-+
-Gerrit sometimes ignored an access control section in a project
-if the exact same section name appeared in All-Projects. The bug
-required an unrelated project to have access.inheritFrom set to
-All-Projects and be accessed before the project that has the same
-section name as All-Projects. This is an unlikely scenario for
-most servers, as Gerrit does not normally set inheritFrom equal to
-All-Projects. The usual behavior is to not supply this property in
-project.config, and permit the implicit inheritance to take place.
diff --git a/ReleaseNotes/ReleaseNotes-2.2.2.txt b/ReleaseNotes/ReleaseNotes-2.2.2.txt
deleted file mode 100644
index 276714c..0000000
--- a/ReleaseNotes/ReleaseNotes-2.2.2.txt
+++ /dev/null
@@ -1,645 +0,0 @@
-= Release notes for Gerrit 2.2.2
-
-Gerrit 2.2.2 is now available:
-
-link:https://www.gerritcodereview.com/download/gerrit-2.2.2.war[https://www.gerritcodereview.com/download/gerrit-2.2.2.war]
-
-== Schema Change
-*WARNING:* This release contains schema changes.  To upgrade:
-----
-  java -jar gerrit.war init -d site_path
-----
-
-*WARNING:* Upgrading to 2.2.x requires the server be first upgraded
-to 2.1.7 (or a later 2.1.x version), and then to 2.2.x.
-
-== New Features
-
-=== Prolog
-* issue 971 Use Prolog Cafe for ChangeControl.canSubmit()
-
-*  Add per-project prolog submit rule files
-+
-When loading the prolog environment, now checks refs/meta/config
-branch for a file called rules.pl. If it exists, consult the
-file. Expects a predicate called submit_rule. If no file is found,
-uses the default_submit predicate in common_rules.pl.
-
-*  Add inheritance of prolog rules
-+
-Projects now inherit the prolog rules defined in their parent
-project. Submit results from the child project are filtered by the
-parent project using the filter predicate defined in the parent's
-rules.pl. The results of the filtering are then passed up to the
-parent's parent and filtered, repeating this process up to the top
-level All-Projects.
-
-* Load precompiled prolog rules from jar file
-+
-Looks in (site)/cache/rules for a jar file called:
-  rules-(sha1 of rules.pl).jar
-Loads the precompiled prolog rules and uses them instead of
-consulting rules.pl. If the jar does not exist, consults rules.pl.
-If rules.pl does not exist, uses the default submit rules.
-
-* Cmd line tool rulec to compile jar from prolog
-+
-Rulec takes rules.pl from the refs/meta/config branch and creates a
-jar file named rules-(sha1 of rules.pl).jar in (sitepath)/cache/rules.
-Generates temporary prolog, java src, and class files which are
-deleted afterwards.
-
-* prolog-shell: Simple command line Prolog interpreter
-+
-Define a small interactive interpreter that users or site
-administrators can play around with by downloading the Gerrit WAR
-file and executing: java -jar gerrit.war prolog-shell
-
-==== Prolog Predicates
-*  Add Prolog Predicates to check commit messages and edits
-+
-commit_message returns the commit message as a symbol.
-+
-commit_message_matches takes in a regex pattern and checks it against
-the commit message.
-+
-commit_edits takes in a regex pattern for filenames and a regex
-pattern for edits. For all files in a commit that match the filename
-regex.  Returns true if the edits in any of those files match the
-edit regex.
-
-* Add Prolog  Predicates to expose commit filelist
-+
-commit_delta/1,3,4 each takes a regular expression and matches it to
-the path of all the files in the latest patchset of a commit.
-If applicable (changes where the file is renamed or copied), the
-regex is also checked against the old path.
-+
-commit_delta/1 returns true if any files match the regex
-+
-commit_delta/3 returns the changetype and path, if the changetype is
-renamed, it also returns the old path. If the changetype is rename,
-it returns a delete for oldpath and an add for newpath. If the
-changetype is copy, an add is returned along with newpath.
-+
-commit_delta/4 returns the changetype, new path, and old path
- (if applicable).
-
-* Add Prolog predicates that expose the branch, owner,
-project, and  topic of a change, the author and committer of the most
-recent patchset in the change, and who is the current user.
-
-* For user-related predicates, if the user is not a gerrit user, will
-return user(anonymous) or similar. Author and committer predicates
-for commits return user(id), name, and email.
-
-* Make max_with_block/4 public
-+
-This is the current rule generally applied to a label function. Make
-it exportable for now until we can come back and clean up the legacy
-approval data code.
-
-=== Web
-
-* Support in Firefox delete key in NpIntTextBox
-+
-Pressing the delete key while being in a NpIntTextBox (e.g. in the
-text box for the Tab Width or Columns preference when comparing a
-file) now works in Firefox.
-
-* Make sure special keys work in text fields
-+
-There is a bug in gwt 2.1.0 that prevents pressing special keys like
-Enter, Backspace etc. from being properly recognized and so they have no effect.
-
-==== ChangeScreen
-* issue 855 Indicate outdated dependencies on the ChangeScreen
-+
-If a change dependency is no longer the latest patchSet for that
-change, mark it OUTDATED in the dependencies table and make
-its row red, and add a warning message to the dependencies
-header, also keep the dependencies disclosure panel open
-even when an outdated dependent change is merged.
-Additionally make the link for dependencies link to the
-exact patchSet of the dependent change.
-
-* issue 881 Allow adding groups as reviewer
-+
-On the ChangeScreen it is now possible to add a group as reviewer for
-a change. When a group is added as reviewer the group is resolved and
-all its members are added as reviewers to the change.
-
-* Update approvals in web UI to adapt to rules.pl submit_rule
-+
-The UI now shows whatever the results of the submit_rule are, which
-permits the submit_rule to make an ApprovalCategory optional, or to
-make a new label required.
-
-==== Diff Screen
-* Add top level menus for a new PatchScreen header
-+
-Modify the PatchScreen so that the header contents is selectable
-using top level menus. Allow the header to display the commit
-message, the preferences, the Patch Sets, or the File List.
-
-* Add SideBySide and Unified links to Differences top level menus
-+
-These new menu entries allow a user to switch view types easily
-without returning to the ChangeScreen.  Also, they double as a
-way to hide the header on the PatchScreen (when clicking on the
-currently displayed type).
-
-* Add user pref to retain PatchScreen Header when changing files
-
-* Flip the orientation of PatchHistory Table
-
-* Remove the 'Change SHA1:' from the PatchScreen title
-
-* Remove scrollbar from Commit Message
-
-* Allow comment editing with single click on line numbers
-+
-Make it easier to comment (and now possible on android devices which
-zoom on double click) on a patch by simply clicking on the line number.
-
-* Add a "Save" button to the PatchScriptSettingsPanel
-+
-The "Update" button now only updates the display.  Additionally,
-for logged in users, a "Save" button now behaves the way that
-"Update" used to behave for logged in users.
-
-* issue 665 Display merge changes as differences from automatic result
-+
-Instead of displaying nothing for a two-parent merge commit, compute
-the automatic merge result and display the difference between the
-automatic result that Git would create, and the actual result that
-was uploaded by the author/committer of the merge.
-
-==== Groups
-* Add menu to AccountGroupScreen
-+
-This change introduces a menu in the AccountGroupScreen and
-different screens for subsets of the functionality (similar as it's
-done for the ProjectScreen).  Links from other screens to the
-AccountGroupScreen are resolved depending on the group type.
-
-* Display groupUUID on AccountGroupInfoScreen
-+
-To assign a privilege to a new group by editing the
-'project.config' file, the new group needs to be added to the
-'groups' file in the 'refs/meta/config' branch which requires
-the UUID of the group to be known.
-
-==== Project Access
-* Automatically add new rule when adding new permission
-+
-If a new permission was added to a block, immediately create the new
-group entry box and focus it, so the user can assign the permission.
-
-* Only show Exclusive checkbox on reference sections
-+
-In the access editor, hide the Exclusive checkbox on the
-Global Capabilities section since it has no inheritance and
-the exclusive bit isn't supported.
-
-* Disable editing after successful save of Access screen
-+
-When the access has been successfully modified for a project,
-switch back to the "read-only" view where the widgets are all
-disabled and the Edit button is enabled.
-
-==== Project Branches
-* Display refs/meta/config branch on ProjectBranchesScreen
-+
-The new refs/meta/config branch was not shown in the ProjectBranchesScreen.
-Since refs/meta/config is not just any branch, but has a special
-meaning to Gerrit it is now displayed at the top below HEAD.
-
-* Highlight HEAD and refs/meta/config
-+
-Since HEAD and refs/meta/config do not represent ordinary branches,
-highlight their rows with a special style in the ProjectBranchesScreen.
-
-==== URLs
-* Modernize URLs to be shorter and consistent
-+
-Instead of http://site/#change,1234 we now use a slightly more
-common looking   http://site/#/c/1234  URL to link to a change.
-+
-Files within a patch set are now denoted below the change, as in
-http://site/#/c/1234/1/src/module/foo.c
-+
-Also fix the dynamic redirects of http://site/1234
-and http://site/r/deadbeef to jump directly to the corresponding
-change if there is exactly one possible URL.
-+
-Entities that have multiple views suffix the URL with ",view-name"
-to indicate which view the user wants to see.
-
-* issue 1018 Accept ~ in linkify() URLs
-
-=== SSH
-* Added a set-reviewers ssh command
-
-* Support removing more than one reviewer at once
-+
-This way we can batch delete reviewers from a change.
-
-* issue 881 Support adding groups as reviewer by SSH command
-+
-With the set-reviewers SSH command it is now possible to also add
-groups as reviewer for a change.
-
-* Fail review command for changing labels when change is closed
-+
-If a reviewer attempts to change a review label (approval) after a
-change is closed using the ssh review command, cause it to fail the
-command and output a message.
-
-* ls-projects: Fix display of All-Projects under --tree
-+
-Everything should be nested below All-Projects, since that is actually
-the root level.
-
-* ls-projects: Add --type to filter by project type
-+
-ls-projects now supports --type code|permissions|all.  The default is
-code which now skips permissions only projects, restoring the output
-to what appears from Gerrit 2.1.7 and earlier.
-
-* show-caches: Improve memory reporting
-+
-Change the way memory is reported to show the actual values,
-and the equation that determines how these are put together
-to form the current usage.  Include some additional data including
-server version, current time, process uptime, active SSH
-connections, and tasks in the task queue. The --show-jvm option
-will report additional data about the JVM, and tell the caller
-where it is running.
-
-==== Queries
-* Output patchset creation date for 'query' command.
-
-* issue 1053 Support comments option in query command
-+
-Query SSH command will show all comments if option --comments is
-used. If --comments is used together with --patch-sets all inline
-comments are included in the output.
-
-=== Config
-* Move batch user priority to a capability
-+
-Instead of using a magical group, use a special capability to
-denote users that should get the batch priority behavior.
-
-* issue 742 Make administrator, create-project a global capability
-+
-This gets rid of the special entries in system_config and
-gerrit.config related to who the Administrators group is,
-or which groups are permitted to create new projects on
-this server.
-
-* issue 48 & 742  Add fine-grained capabilities for administrative actions
-+
-The Global Capabilities section in All-Projects can now be used to
-grant subcommands that are available over SSH and were previously
-restricted to only Administrators.
-
-* Disallow project names ending in "/"
-
-* issue 934 query: Enable configurable result limit
-+
-Allow site administrators to configure the query limit for user to be
-above the default hard-coded value of 500 by adding a global
-[capability] block to All-Projects project.config file with group(s)
-that should have different limits.
-
-* Introduced a new PermissionRule.Action: BLOCK.
-+
-Besides already existing ALLOW and DENY actions this change
-introduces the BLOCK action in order to enable blocking some
-permission rules globally.
-
-* issue 813 Use remote.name.replicatePermissions to hide permissions
-+
-Administrators can now disable replication of permissions-only
-projects and the per-project refs/meta/config in replication.config
-by setting the replicatePermissions field to false.
-
-* Add a Restored.vm template and use it.
-+
-The restore action has been erroneously using the Abandoned.vm
-template.  Create a template and sender for the restorecommand.
-
-* sshd.advertisedAddress: specify the displayed SSH host/port
-+
-This allows aliases which redirect to gerrit's ssh port (say
-from port 22) to be setup and advertised to users.
-
-=== Dev
-* Updated eclipse settings for 3.7 and m2e 1.0
-
-* Fix build in m2eclipse 1.0
-+
-Ignore the antrun and the build-helper-maven-plugin tasks in m2eclipse.
-
-* Make Gerrit with gwt 2.3.0 run in gwtdebug mode
-
-* Fix a number of build warnings that have crept in
-
-* Accept email address automatically
-+
-Enable Gerrit to accept email address automatically in
-"DEVELOPMENT_BECOME_ANY_ACCOUNT" mode without a confirmation email.
-
-* Added clickable user names at the BecomeAnyAccountLoginServlet.
-+
-The first 5 (by accountId) user names are displayed as clickable
-links. Clicking a user name logs in as this user, speeding up
-switching between different users when using the
-DEVELOPMENT_BECOME_ANY_ACCOUNT authentication type.
-
-=== Miscellaneous
-* Permit adding reviewers to closed changes
-+
-Permit adding a reviewer to closed changes to support post-submit
-discussion threads.
-
-* issue 805 Don't check for multiple change-ids when pushing directly
-to refs/heads.
-
-* Avoid costly findMergedInto during push to refs/for/*
-+
-No longer close a change when a commit is pushed to res/for/* and the
-Change-Id in the commit message footer matches another commit on an
-existing branch or tag.
-
-* Allow serving static files in subdirectories
-
-* issue 1019 Normalize OpenID URLs with http:// prefix
-+
-No longer violate OpenID 1.1 and 2.0, both of which require
-OpenIDs to be normalized (http:// added).
-
-* Allow container-based authentication for git over http
-+
-Gerrit was insisting on DIGEST authentication when doing git over
-http. A new boolean configuration parameter auth.trustContainerAuth
-allows gerrit to be configured to trust the container to do the
-authentication.
-
-* issue 848 Add rpc method for GerritConfig
-+
-Exposes what types of reviews are possible via json rpc, so that the
-Eclipse Reviews plugin currently can parse the javascript from a
-gerrit page load.
-
-
-== Performance
-* Bumped Brics version to 1.11.8
-+
-This Brics version fixes a performance issue in some larger Gerrit systems.
-
-* Add permission_sort cache to remember sort orderings
-+
-Cache the order AccessSections should be sorted in, making any future
-sorting for the same reference name and same set of section patterns
-cheaper.
-
-* Refactor how permissions are matched by ProjectControl, RefControl
-+
-More aggressively cache many of the auth objects at a cost of memory,
-but this should be an improvement in response times.
-
-* Substantially speed up pushing changes for review
-+
-Pushing a new change for review checks if the change is related to
-the branch it's destined for. It used to do this in a way that
-required a topo-sort of the rev history, and now uses JGit's
-merge-base functionality.
-
-* Add cache for tag advertisements
-+
-To make the general case more efficient, introduce a cache called "git_tags".
-+
-On a trivial usage of the Linux kernel repository, the average
-running time of the VisibleRefFilter when caches were hot was
-7195.68 ms.  With this commit, it is a mere 5.07 milliseconds
-on a hot cache.  A reduction of 99% of the running time.
-
-* Don't set lastCheckTime in ProjectState
-+
-The lastCheckTime/generation fields are actually a counter that
-is incremented using a background thread. The values don't match
-the system clock, and thus reading System.currentTimeMillis()
-during the construction of ProjectState is a waste of resources.
-
-
-== Upgrades
-* Upgrade to GWT 2.3.0
-* Upgrade to Gson to 1.7.1
-* Upgrade to gwtjsonrpc 1.2.4
-* Upgrade to gwtexpui 1.2.5
-* Upgrade to Jsch 0.1.44-1
-* Upgrade to Brics 1.11.8
-
-
-== Bug Fixes
-* Fix: Issue where Gerrit could not linkify certain URLs
-
-* issue 1015 Fix handling of regex ref patterns in Access panel
-+
-regex patterns such as "\^refs/heads/[A-Z]{2,}\-[0-9]\+.\*" were being
-prefixed with "refs/heads/", resulting in invalid reference patterns
-like "refs/heads/^refs/heads/[A-Z]{2,}-[0-9]+.*".
-
-* issue 1002 Check for and disallow pushing of invalid refs/meta/config
-+
-If the project.config or groups files are somehow invalid on
-the refs/meta/config branch, or would be made invalid due to
-a bad code review being submitted to this branch, reject the
-user's attempt to push.
-
-* issue 1002 Fix NPE in PermissionRuleEditor when group lacks UUID
-+
-If a group does not have an entry in the "groups" table within
-the refs/meta/config branch render the group name as a span,
-without the link instead of crashing the UI.
-
-* issue 972 Filter access section rules to only visible groups
-+
-Users who are not the owner of an access section can now only
-see group names and rules for groups which they are a member of,
-are visible to all users, or that they own.
-
-* Correctly handle missing refs/meta/config branch
-+
-If the refs/meta/config branch did not exist, getRevision() no longer
-throws an NPE when trying to access the ProjectDetail.
-
-* Allow loading Project Access when there is no refs/meta/config
-+
-Enable loading the access screen with a null revision field,
-and on save of any edits require the branch to be new.
-
-* create-project: Fix creation vs. replication order
-+
-Create the project on remote mirrors before creating either the
-refs/meta/config or the initial empty branch. This way those can be
-replicated to the remote mirrors once they have been created locally.
-
-* create-project: Bring back --permissions-only flag
-+
-If a project is permissions only, assign HEAD to point to
-refs/meta/config. This way the gitweb view of the project
-shows the permissions history by default, and clients that
-clone the project are able to get a detached HEAD pointing
-to the current permission state, rather than an empty
-repository.
-
-* create-project: Fix error reporting when repository exists
-+
-If a repository already exists, tell the user it already is
-available, without disclosing the server side path from gerrit.basePath.
-
-* Do not log timeout errors on upload and receive connections
-
-* Only automatically create accounts for LDAP systems
-+
-If the account management is LDAP, try to automatically create
-accounts by looking up the data in LDAP. Otherwise fail and reject an
-invalid account reference that was supplied on the command line via
-SSH.
-
-* Add missing RevWalk.reset() after checking merge base
-+
-This fixes an exception from RevWalk when trying to push a new
-commit for review.
-
-* issue 1069 Do not send an email on reviews when there is no message.
-+
-No longer send an email when reviewing a change via ssh, and
-the change message is blank (when no change message is actually
-added to the review).
-
-* Ignore PartialResultException from LDAP.
-+
-This exception occurs when the server isn't following referrals for
-you, and thus the result contains a referral. That happens when
-you're using Active Directory. You almost certainly don't really want
-to follow referrals in AD *anyways*, so just ignore these exceptions,
-so we can still use the actual data.
-
-* issue 518 Fix MySQL counter resets
-+
-gwtorm 1.1.5 was patched to leave in the dummy row that incremented
-the counter, ensuring the server will use MAX() + 1 instead of 1 on
-the next increment after restart.
-
-* Don't delete account_id row on MySQL
-+
-If the table is an InnoDB table deleting the row after allocation may
-cause the sequence to reset when the server restarts, giving out
-duplicate account_ids later.
-
-
-== Documentation
-
-=== New Documents
-* First Cut of Gerrit Walkthrough Introduction documentation.
-+
-Add a new document intended to be a complement for the existing
-reference documentation to allow potential users to easily get a
-feel for how Gerrit is used, where it fits and whether it will
-work for them.
-
-* Introducing a quick and dirty setup tutorial
-+
-The new document covers quick installation, new project and first
-upload.  It contains lots of quoted output, with a demo style to it.
-
-=== Access Control
-* Code review
-
-* Conversion table between 2.1 and 2.2
-+
-Add a table to ease conversion from 2.1.x. The table tries to address
-the old permissions one by one except for the push tag permission which
-in effect needed two permissions to work properly. This should
-be familiar to the administrator used to the 2.1.x permission model
-however.
-
-* Reformatted text
-
-* Verify
-+
-Updated some text in the Per project-section and edited the verified
-section to reflect the current label.
-
-* Capabilities
-+
-Adds general information about global capabilities, how the server
-ownership is administered.
-
-* Added non-interactive users
-+
-This change adds the non-interactive user group.
-It also adds that groups can be members of other groups.
-The groups are now sorted in alphabetical order.
-
-* Reordering categories
-+
-Access categories are now sorted to match drop down box in UI
-
-=== Other Documentation
-* Added additional information on the install instructions.
-+
-The installation instructions presumes much prior knowledge,
-make some of that knowledge less implicit.
-
-* Provides a template to the download example.
-+
-Clarifies that the example host must be replaced with proper
-hostname.
-
-* Provided an example on how to abandon a change from
-the command line
-
-* update links from kernel.org to code.google.com
-
-
-* Rename '-- All Projects --' in documentation to 'All-Projects'
-
-* Explain 'Automatically resolve conflicts'
-
-* Update documentation for testing SSH connection
-+
-The command output that is shown in the example and the description
-how to set the ssh username were outdated.
-
-* Remove unneeded escape characters from the documentation
-+
-The old version of asciidoc required certain characters to be escaped
-with a backslash and when the upgrade to the new version was done all
-those backslashes that were used for escaping became visible.
-
-* Clean up pgm-index
-+
-Break out the utilities into their own section, and correct
-some of the item descriptions.
-
-* Update manual project creation instructions
-
-* Update project configuration documentation
-+
-Remove the textual reference to obsolete SQL insert statement to
-create new projects.
-
-* Clean up command line documentation, examples
-+
-The formatting was pretty wrong after upgrading to a newer version
-of AsciiDoc, so fix up most of the formatting, correct some order
-of commands in the index, and make create-project conform to the
-same format used by create-account and create-group.
-
-* Correct syntax of SQL statement for inserting approval category
diff --git a/ReleaseNotes/ReleaseNotes-2.3.1.txt b/ReleaseNotes/ReleaseNotes-2.3.1.txt
deleted file mode 100644
index 627fba5..0000000
--- a/ReleaseNotes/ReleaseNotes-2.3.1.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-= Release notes for Gerrit 2.3.1
-
-Gerrit 2.3.1 is now available:
-
-link:https://www.gerritcodereview.com/download/gerrit-2.3.1.war[https://www.gerritcodereview.com/download/gerrit-2.3.1.war]
-
-There are no schema changes from 2.3.
-
-However, if upgrading from anything earlier, follow the upgrade
-procedure in the 2.3 link:ReleaseNotes-2.3.html[ReleaseNotes].
-
-== Security Fixes
-* Some access control sections may be ignored
-+
-Gerrit sometimes ignored an access control section in a project
-if the exact same section name appeared in All-Projects. The bug
-required an unrelated project to have access.inheritFrom set to
-All-Projects and be accessed before the project that has the same
-section name as All-Projects. This is an unlikely scenario for
-most servers, as Gerrit does not normally set inheritFrom equal to
-All-Projects. The usual behavior is to not supply this property in
-project.config, and permit the implicit inheritance to take place.
diff --git a/ReleaseNotes/ReleaseNotes-2.3.txt b/ReleaseNotes/ReleaseNotes-2.3.txt
deleted file mode 100644
index 7a29d0e..0000000
--- a/ReleaseNotes/ReleaseNotes-2.3.txt
+++ /dev/null
@@ -1,462 +0,0 @@
-= Release notes for Gerrit 2.3
-
-Gerrit 2.3 is now available:
-
-link:https://www.gerritcodereview.com/download/gerrit-2.3.war[https://www.gerritcodereview.com/download/gerrit-2.3.war]
-
-== Schema Change
-*WARNING:* This release contains schema changes.  To upgrade:
-----
-  java -jar gerrit.war init -d site_path
-----
-
-*WARNING:* Upgrading to 2.3.x requires the server be first upgraded
-to 2.1.7 (or a later 2.1.x version), and then to 2.3.x.
-
-If you are upgrading from 2.2.x.x, you may ignore this warning and
-upgrade directly to 2.3.x.
-
-
-== New Features
-=== Drafts
-* New draft statuses and magic branches
-+
-Adds draft status to Change. DRAFT status in change occurs before NEW
-and will be for a change that is not meant for review (yet).
-Also adds magic branches refs/drafts/ and refs/publish/ that
-will handle whether or not a patchset is a draft or goes straight to
-review. refs/for/ should be deprecated in favor of explicitly marking
-a patchset as a draft or directly to review.
-
-* Draft patchset and change visibility in UI
-+
-If a patchset is a draft, adds a (DRAFT) label next to the revision
-(or gitweb link if it exists). If a change is a draft, adds a (DRAFT)
-next to the subject and changes the status appropriately.
-
-* Publish draft patchsets in UI and SSH
-+
-Adds Publish button to draft patchsets in UI and an option to
-publish draft patchsets in the review ssh command. Publishing a draft
-patchset makes it visible. Publishing a draft patchset in a draft
-change irreversibly upgrades the change status to NEW.
-
-* Delete draft changes and patchsets
-+
-Adds ability to delete draft changes and patchsets that are not meant
-or fit for code review. Deleting a draft patchset also deletes the
-corresponding ref from the repository and decrements the next patch
-set number for the change if necessary. Deleting a draft change
-deletes all of its (draft) patchsets.
-
-* Add pushing drafts to refs/drafts/
-+
-Pushing to refs/drafts/ will now push a draft patchset. If this is the
-first patch set, change created will be in draft status. Pushing a
-draft patchset to a draft change keeps it in draft status. Pushing
-a non-draft patchset (with refs/publish/ or refs/for/, they do the
-same thing) to a draft change turns it into a non-draft change.
-Draft patchsets cannot be submitted.
-
-* When pushing changes as drafts, output [DRAFT] next to the change link
-
-
-=== Web
-* issue 203 Create project through web interface
-+
-Add a new panel in the Admin->Projects Screen.  It
-enables the users that are allowed to create projects
-via command-line to create them also via web interface.
-
-* Suggest parent for 'create-project' in the UI.
-+
-Add a list of parent suggestions for 'create project'
-in the UI, so the user can select a parent for the new
-project from a list of projects that are already parents to
-other projects.
-
-* issue 981 Fix diffs skipping one line
-+
-Don't show '... skipping 1 common line ...'.  The text to show this
-takes up just as much space as showing the line which was skipped.
-
-* issue 18 Support expanding lines of context in diff
-+
-Allow lines of context which were skipped in the side-by-side diff
-view to be expanded.  This makes it easier to get more code context
-when needed but not show huge amounts of unneeded data.
-
-* Move checkbox to mark file as reviewed into title bar
-
-* Redirect the user to the reverted change (when reverting).
-
-* On group rename update the group name in the page title
-
-* In ProjectAccessScreen add link to history of project.config in gitweb
-
-* Removed superfluous 'comment' for patch history table.
-
-* Make OpenID login images transparent
-
-* Disable SSH Keys in the web UI if SSHD is disabled
-
-
-=== SSH
-* Adds --description (-d) option to ls-projects
-+
-Allows listing of projects together with their respective
-description.
-
-* ls-projects: new option to list all accessible projects
-+
-Add a new option '--all' to the 'ls-projects' SSH command to display
-all projects that are accessible by the calling user account. Besides
-the projects that the calling user account has been granted 'READ'
-access to, this includes all projects that are owned by the calling
-user account (even if for these projects the 'READ' access right is
-not assigned to the calling user account).
-
-* Suggest parent for 'create-project' in the SSH command
-+
-Add an option '--suggest-parents' which will print out
-a list of projects that are already parents to another
-projects, thus it can help user to find a suitable
-parent for the new project.
-
-* Support reparenting all children of a parent project
-+
-This change adds a new option to the 'set-project-parent' command that
-allows reparenting all child projects of one parent project to another
-parent project.
-
-* set-parent-project: evict child projects from project cache
-
-* Add ssh command to list groups.
-
-* ls-groups: add option to list groups for a project
-+
-Add an option to the ls-groups SSH command that allows to list only
-those groups for which any permission is assigned to a project.
-
-* ls-groups: Add option to only list groups that are visible to all
-
-* ls-groups: Support listing groups by group type
-
-* ls-groups: Support listing of groups for a user
-
-* Add new SSH command to rename groups
-
-* Support for --file option for ssh queries.
-+
-Allows user to list files and attributes (ADDED,
-MODIFIED, DELETED, RENAMED, COPIED) when querying for
-patch sets.
-
-* Output full commit message in query results
-
-* Option for SSHD review-cmd to always publish the message.
-+
-"--force-message" option for the SSHD review command,
-which allows Gerrit to publish the "--message", even if the
-labels could not be applied due to change being closed.
-
-
-=== Config
-* issue 349 Apply states for projects (active, readonly and hidden)
-+
-Active state indicates the project is regular and is the default value.
-+
-Read Only means that users can see the project if read permission is
-granted, but all modification operations are disabled.
-+
-Hidden means the project is not visible for those who are not owners
-
-* Enable case insensitive login to Gerrit WebUI for LDAP authentication
-+
-Gerrit treats user names as case sensitive, while some LDAP servers
-don't. On first login to Gerrit the user enters his user name and
-Gerrit queries LDAP for it. Since LDAP is case-insensitive with regards
-to  the username, the LDAP authentication succeeds regardless in
-which case the user typed in his user name. The username is stored in
-Gerrit exactly as entered by the user. For further logins the user
-always has to use the same case. If the user specifies his user name in
-a different case Gerrit tries to create a new account which fails with
-"Cannot assign user name ... to account ...; name already in use.".
-This error occurs because the LDAP query resolves to the same LDAP
-user and storing the username for SSH (which is by default always
-lower case) fails because such an entry exists already for the first
-account that the user created.
-+
-This change introduces a new configuration parameter that converts the
-user name always to lower case before doing the LDAP authentication.
-By this the login to the Gerrit WebUI gets case insensitive. If this
-configuration parameter is set, the user names for all existing
-accounts have to be converted to lower case. This change includes a
-server program to do this conversion.
-
-* Enable case insensitive authentication for git operations
-+
-A new configuration parameter is introduced that converts the username
-that is received to authenticate a git operation to lower case for
-looking up the user account in Gerrit.
-+
-By setting this parameter a case insensitive authentication for the
-git operations can be achieved, if it is ensured that the usernames in
-Gerrit (scheme 'username') are stored in lower case (e.g. if the
-parameter 'ldap.accountSshUserName' is set to
-'${sAMAccountName.toLowerCase}').
-
-* Support replication to local folder
-
-* Read timeout parameter for LDAP connections: ldap.readTimeout
-+
-This helps prevent a very slow LDAP server from blocking
-all SSH command creation threads.
-
-* Introduce a git maxObjectSizeLimit in the [receive] config
-+
-This limits the size of uploaded files
-
-* Make 'Anonymous Coward' configurable
-
-* Add property to configure path separator in URLs for a gitweb service
-
-* Customize link-name pointing to gitweb-service.
-+
-Previously the link to the external gitweb-type
-pages said "(gitweb)" regardless if using cgit
-or a custom service.
-
-* Support gitweb.type=disabled
-
-* rules.enable: Support disabling per project prolog rules in gerrit.config
-
-* Allow site administrators to define Git-over-HTTP mirror URL
-
-* Allow sshd.listenAddress = off to disable the daemon
-
-* daemon: Allow httpd without sshd
-
-* Allow disabling certain features of HostPageServlet
-+
-These features are: user agent detection and automatic refresh
-logic associated with the site header, footer and CSS.
-
-
-=== Dev
-* Fix 'No source code is available for type org.eclipse.jgit.lib.Constants'
-
-* Fix miscellaneous compiler warnings
-
-* Add entries to .gitignore for m2e settings/preference files
-
-* Package source JARs for antlr, httpd, server
-
-* pom.xml: change gerrit-war's dependency on gerrit-main to runtime
-+
-This only seems to matter to IntelliJ, since the Main class is
-provided to the war via an overlay in gerrit-war/pom.xml
-
-* Fixed the full name of the MAVEN2_CLASSPATH_CONTAINER
-+
-Fixes java.lang.NoClassDefFoundError: com/google/gwt/dev/DevMode
-
-
-=== Miscellaneous
-* Allow superprojects to subscribe to submodules updates
-+
-The feature introduced in this release allows superprojects to
-subscribe to submodules updates.
-+
-When a commit is merged to a project, the commit content is scanned
-to identify if it registers submodules (if the commit contains new
-gitlinks and .gitmodules file with required info) and if so, a new
-submodule subscription is registered.
-+
-When a new commit of a registered submodule is merged, gerrit
-automatically updates the subscribers to the submodule with new
-commit having the updated gitlinks.
-+
-The most notable benefit of the feature is to not require
-to push/merge commits of super projects (subscribers) with gitlinks
-whenever a project being a submodule is updated. It is only
-required to push commits with gitlinks when they are created
-(and in this case it is also required to push .gitmodules file).
-
-* Allow Realm to participate when linking an account identity
-+
-When linking a new user identity to an existing account, permit the
-Realm to observe the new incoming identity and the current account,
-and to alter the request. This enables a Realm to observe when a
-user verifies a new email address link.
-
-* issue 871 Show latest patchset with cherry-picked merge
-+
-When a change is published via the cherry-pick merge strategy,
-show the final commit as a patchset in the change history.
-This now makes it possible to search for the cherry-picked SHA1.
-
-* issue 871 Display hash of the cherry-pick merge in comment
-
-* Added more verbose messages when changes are being rejected
-
-* Display proper error message when LDAP is unavailable
-
-* Clarify error msg when user's not allowed to '--force push'.
-
-* ContainerAuthFilter: fail with FORBIDDEN if username not set
-
-* Resolve 'Project Owners' group if it is included into another group
-
-* Hide SSH URL in email footers if SSH is disabled
-
-* Sort the jar files from the war before adding to classpath.
-
-* Apply user preferences when loading site
-
-* Ensure HttpLog can always get the user identity
-
-* Prevent comments spam for abandoned commit
-+
-If some change was abandoned but later submitted (e.g. by
-cherry-picking it to a another branch) then pushing a new branch
-that contains this change no longer adds a new comment.
-
-* Make Address, EmailHeader visible to other EmailSenders
-
-* Use transactions to handle comments when possible
-
-* Try to use transactions when creating changes
-
-* gerrit.sh: disown doesn't accept pid as a argument, fix script
-
-* gerrit.sh: detach gerrit properly so it won't keep bad ssh sessions open.
-
-* Cache list of all groups in the group cache
-
-* issue 1161 Evict project in user cache on save of project meta data
-
-* Ensure that the site paths are resolved to their canonical form (for Windows)
-
-* Connect Velocity to slf4j
-
-* Expose project permissionOnly status via JSON-RPC
-
-* Make HEAD of All-Projects point to refs/meta/config
-
-* issue 1158 Added support for European style dates
-
-* Make macros in email templates local to the template
-
-* Support http://server/project for Git access
-
-* Use _ instead of $ for implementation-detail Prolog predicates
-
-* Update the Sign In anchor with current URL
-+
-Always update the href of the Sign In anchor in the menu bar with
-the current page URL after /login/, making the redirect process
-bring users back to the current view after sign in.
-
-* Improve validation of email registration tokens
-
-
-== Upgrades
-* Upgrade to gwtorm 1.2
-
-* Upgrade to JGit 1.1.0.201109151100-r.119-gb4495d1
-+
-This is needed because of this change:
-https://gerrit-review.googlesource.com/#/c/30450/
-
-* Support Velocity 1.5 (as well as previous 1.6.4)
-
-
-== Bug Fixes
-* Avoid NPE when group is missing
-
-* Do not fail with NPE if context path of request is null
-
-* Fix NPE in set-project-parent command if parent is not specified
-
-* Only send mail to author and committer if they are registered to prevent an NPE
-
-* Avoid potential NPE when querying the queue.
-
-* Allow loading Project Access when there is no refs/meta/config
-
-* Fix calculation of project name if repo is not existing
-+
-If a project inherits from a non existing parent, prevent a
-StringIndexOutOfBoundsException.
-
-* Fix: Suppress "Error on refs/cache-automerge" warnings.
-
-* Don't allow registering for cleanup after cleanup runs
-+
-This prevents leaking a database connection.
-
-* issue 807 Fix: Tags are not replicated properly
-
-* Prevent smtp rejected users from rejecting emails for all users
-
-* Fix token saving redirect in container auth
-+
-Update the jump page that redirects users from /#TOKEN to
-/login/TOKEN.  This forces using the container based
-authentication.  Also correct "/login//" to be just "/login/".
-
-* Use custom error messages for Git-over-HTTP
-+
-Ensure clients see messages related to contributor agreement not
-being activated even if they push over HTTP.
-
-* Avoid double key event for GroupReferenceBox
-
-* Fix git push authentication over HTTP
-
-* Fix http://login/ redirect bug
-
-* Fix missing targets in /login/ URLs
-
-* set-project-parent: if update of 1 project fails continue with others
-
-* Verify the case of the project name before opening git repository
-
-* Update top level SUBMITTING_PATCHES URLs
-
-
-== Documentation
-* Some updates to the design docs
-
-* cmd-index: Fix link to documentation of rename-group command
-
-* Update documentation for testing SSH connection
-
-* Bypass review updated with 2.2.x permissions
-
-* Add documentation for 'peer_keys'
-
-* Improve 'Push Merge Commit' access right documentation
-
-* Access control: Capabilities documented
-** Administrate Server
-** Create Account
-** Create Group
-** Create Project
-** Flush Caches
-** Kill Task
-** Priority
-** Query Limit
-** Start Replication
-** View caches
-** View connections
-** View queue
-
-* Access control: Example roles documented
-** Contributor
-** Developer
-** CI System
-** Integrator
-** Project owner
-** Administrator
diff --git a/ReleaseNotes/ReleaseNotes-2.4.1.txt b/ReleaseNotes/ReleaseNotes-2.4.1.txt
deleted file mode 100644
index f3c4765..0000000
--- a/ReleaseNotes/ReleaseNotes-2.4.1.txt
+++ /dev/null
@@ -1,53 +0,0 @@
-= Release notes for Gerrit 2.4.1
-
-Gerrit 2.4.1 is now available:
-
-link:https://www.gerritcodereview.com/download/gerrit-2.4.1.war[https://www.gerritcodereview.com/download/gerrit-2.4.1.war]
-
-
-There are no schema changes from 2.4.  However, if upgrading from
-anything but 2.4, follow the upgrade procedure in the 2.4
-link:ReleaseNotes-2.4.html[ReleaseNotes].
-
-
-== Bug Fixes
-* Catch all exceptions when async emailing
-+
-This fixes email notification issues reported
-link:https://groups.google.com/group/repo-discuss/browse_thread/thread/dd157ebc55b962ef/652822d6fbe61e71[here].
-
-* Fixed cleanup of propagated SshScopes
-+
-This improves error reporting in case of email notification errors.
-
-* issue 1394 Fix lookup of the 'Commit Message' file in patch set
-+
-There is an assumption that the commit message is always first in the list of
-files of a patch set. However, there was another place in Gerrit code, which
-did binary search through the list of the files, without taking this assumption
-into account. In case when a patch set contained a file which lexicographically
-sorted before '/COMMIT_MSG' (like '.gitignore' for example) it could have
-happened that the commit message was not found and, as a side effect, it wasn't
-possible to review it.
-
-* issue 1162 Fix deadlock on destroy of CommandFactoryProvider
-
-* Honor the sendmail.smtpUser from gerrit.config on upgrade
-+
-If sendmail.smtpUser was not present in the gerrit.config then don't set it in
-site upgrade.
-
-* issue 1420 Forge committer bypassed
-+
-It was possible to forge committer even without having permission for that.
-This was a regression from 2.3.
-
-* Make sure the "Object too large..." error message is printed when an object
-larger than receive.maxObjectSizeLimit is rejected by Gerrit
-
-* Display proper error if file diff fails because content is too large
-
-* Get around a log4j bug that causes AsyncAppender-Dispatcher thread to die and
-block other threads
-** Make async logging buffer size configurable
-** Make logging events discardable, prevent NPE in AsyncAppender-Dispatcher thread
diff --git a/ReleaseNotes/ReleaseNotes-2.4.2.txt b/ReleaseNotes/ReleaseNotes-2.4.2.txt
deleted file mode 100644
index d5c2a11..0000000
--- a/ReleaseNotes/ReleaseNotes-2.4.2.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-= Release notes for Gerrit 2.4.2
-
-Gerrit 2.4.2 is now available:
-
-link:https://www.gerritcodereview.com/download/gerrit-2.4.2.war[https://www.gerritcodereview.com/download/gerrit-2.4.2.war]
-
-There are no schema changes from 2.4, or 2.4.1.
-
-However, if upgrading from anything earlier, follow the upgrade
-procedure in the 2.4 link:ReleaseNotes-2.4.html[ReleaseNotes].
-
-== Security Fixes
-* Some access control sections may be ignored
-+
-Gerrit sometimes ignored an access control section in a project
-if the exact same section name appeared in All-Projects. The bug
-required an unrelated project to have access.inheritFrom set to
-All-Projects and be accessed before the project that has the same
-section name as All-Projects. This is an unlikely scenario for
-most servers, as Gerrit does not normally set inheritFrom equal to
-All-Projects. The usual behavior is to not supply this property in
-project.config, and permit the implicit inheritance to take place.
diff --git a/ReleaseNotes/ReleaseNotes-2.4.3.txt b/ReleaseNotes/ReleaseNotes-2.4.3.txt
deleted file mode 100644
index ece0bda..0000000
--- a/ReleaseNotes/ReleaseNotes-2.4.3.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-= Release notes for Gerrit 2.4.3
-
-There are no schema changes from link:ReleaseNotes-2.4.2.html[2.4.2].
-
-link:https://www.gerritcodereview.com/download/gerrit-2.4.3.war[https://www.gerritcodereview.com/download/gerrit-2.4.3.war]
-
-== Bug Fixes
-* Patch JGit security hole
-+
-The security hole may permit a modified Git client to gain access
-to hidden or deleted branches if the user has read permission on
-at least one branch in the repository. Access requires knowing a
-SHA-1 to request, which may be discovered out-of-band from an issue
-tracker or gitweb instance.
diff --git a/ReleaseNotes/ReleaseNotes-2.4.4.txt b/ReleaseNotes/ReleaseNotes-2.4.4.txt
deleted file mode 100644
index f9ea6b5..0000000
--- a/ReleaseNotes/ReleaseNotes-2.4.4.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-= Release notes for Gerrit 2.4.4
-
-There are no schema changes from link:ReleaseNotes-2.4.4.html[2.4.4].
-
-link:https://www.gerritcodereview.com/download/gerrit-2.4.4.war[https://www.gerritcodereview.com/download/gerrit-2.4.4.war]
-
-== Bug Fixes
-* Fix clone for modern Git clients
-+
-The security fix in 2.4.3 broke clone for recent Git clients,
-throwing an ArrayIndexOutOfBoundsException. Fixed.
diff --git a/ReleaseNotes/ReleaseNotes-2.4.txt b/ReleaseNotes/ReleaseNotes-2.4.txt
deleted file mode 100644
index 1db4ba3..0000000
--- a/ReleaseNotes/ReleaseNotes-2.4.txt
+++ /dev/null
@@ -1,241 +0,0 @@
-= Release notes for Gerrit 2.4
-
-Gerrit 2.4 is now available:
-
-link:https://www.gerritcodereview.com/download/gerrit-2.4.war[https://www.gerritcodereview.com/download/gerrit-2.4.war]
-
-== Schema Change
-*WARNING:* This release contains schema changes.  To upgrade:
-----
-  java -jar gerrit.war init -d site_path
-----
-
-*WARNING:* Upgrading to 2.4.x requires the server be first upgraded to 2.1.7 (or
-a later 2.1.x version), and then to 2.4.x.  If you are upgrading from 2.2.x.x or
-newer, you may ignore this warning and upgrade directly to 2.4.x.
-
-== New Features
-
-=== Security
-
-* Restrict visibility to arbitrary user dashboards
-+
-Administrators have some expectation when using the 'suggest.accounts'
-visibility restriction feature that users cannot get the names or
-email addresses for arbitrary accounts. In fact, because account IDs
-are sequential, it would be easy for an adversary to get personal
-information of all users on the server by requesting every user's
-dashboard.
-+
-This includes changing the meaning of the 'suggest.accounts' config
-option to be a boolean indicating whether account suggestion should
-happen at all, which is now orthogonal to the account visibility
-restriction policy. We still recognize the old values for
-'suggest.accounts', with the slight behavior change that
-'suggest.accounts=OFF' now means that users cannot access the dashboards
-of any other users. Administrators who do not want this behavior can
-update their configuration.
-
-* Indicate that 'not found' may actually be a permission issue
-
-=== Web
-
-* Add user preference to mark files reviewed automatically or manually
-+
-Add a checkbox to the preferences header on the diff
-screen which allows a user to specify whether they
-want manual-reviewing enabled or disabled.  Previously,
-every file was auto marked reviewed when a user first
-displayed it.  The new manual mode prevents this auto
-marking and only marks a file reviewed when the user
-explicitly clicks on the reviewed checkbox.
-
-* Use 'Auto Merge' for merge commit's base comparison
-+
-When reviewing a merge commit, the old wording in the version history dropdown
-of 'Base' doesn't really match Gerrit's behavior.  Updating this to use
-'Auto Merge' as suggested by Shawn Pearce on IRC.
-
-* issue 1035 Add rebase button to the change screen
-+
-This change adds a rebase button along with the rest of
-the action buttons in the change page. When pressing the
-button, the most recent patch set will be rebased onto
-the tip of the destination branch or the latest patchset
-of the change we depend upon. A new patch set containing
-the rebased commit will be produced and added to the
-change.
-+
-Rebasing of a change in web UI is restricted to change owner, submitter or
-those with the (new) 'rebase' permission.
-
-* Add a new permission 'rebase' to permit rebasing changes in the web UI
-
-* Make a user's dashboard visible if any of the changes are visible to the
-current user.
-
-* Change 'Loading ...' to say 'Working ...' as, often, there is more going on
-than just loading a response.
-
-=== Performance
-
-* Asynchronously send email so it does not block the UI
-* Optimize queries for open/merged changes by project + branch
-
-=== Git
-
-* Implement a multi-sub-task progress monitor for ReceiveCommits
-
-* Close corresponding change when pushing to 'refs/heads/*'
-+
-Gerrit would not close the open changes with matching change-ids,
-when the user pushes commits directly to 'refs/heads/*'.
-+
-This issue could be triggered for two reasons:
-
-. It is triggered when Gerrit detects no changes between the
-pushed commits and the current patchset on the open changes. This
-patch make sure that the matching open change is always closed when
-pushing to 'refs/heads/*', even if no visible changes is detected.
-
-. The same commit exists on another branch than the destination
-branch. This could trick gerrit into just "re-closing" the wrong
-change.
-
-* Run ReceiveCommits in a shared thread pool
-+
-Since the work to ReceiveCommits may take a long, potentially unbounded
-amount of time, we would like to have it run in the background so it
-can be monitored for timeouts and cancelled, and have stalls reported
-to the user from the main thread.
-
-=== Search
-
-* Add the '--dependencies' option to the 'query' command.
-+
-This option includes information about patch sets which depend on, or are
-needed by, each patch set.
-
-* Branch Operator: Support full branch names
-+
-The search operator for branches required the provided value to be the
-short branch name that is shown in the web interface (without the
-'refs/heads/' prefix). Change the branch operator so that it also
-supports full branch names as value.
-+
-It is intuitive that searching with 'branch:master' and searching with
-'branch:refs/for/master' deliver the same result. So far
-'branch:refs/for/master' was the same as searching with
-'refs:refs/heads/refs/heads/master' which is unexpected for most users.
-
-* Add comment inclusion via '&comments=true' over HTTP
-+
-With this change, we can fetch the comments on a patchset by sending a
-request to 'https://site/query?comments=true'
-
-=== Access Rights
-
-* Added the 'emailReviewers' as a global capability.
-+
-This replaces the 'emailOnlyAuthors' flag of account groups.
-
-=== Dev
-
-* issue 1272 Add scripts to create release notes from git log
-+
-These script generates a list of commits from git log between two given commits
-and outputs the asciidoc format containing list of commits subject and body.
-
-* Update URL for m2eclipse
-+
-The project is now under the Eclipse Foundation umbrella.
-
-* Add missing ignore for m2e prefs in gerrit-ehcache
-
-* Add '--issues' and '--issue_numbers' options to the 'gitlog2asciidoc.py'
-
-=== Miscellaneous
-
-* Remove perl from 'commit-msg' hook
-+
-Removing perl from the commit-msg hook reduces the dependencies
-gerrit imposes on its users.
-
-* updating contrib 'trivial_rebase.py' for 2.2.2.1
-
-== Upgrades
-
-* Updated to Guice 3.0.
-* Updated to gwtorm 1.4.
-* Update JGit to 1.3.0.201202151440-r.75-gff13648
-* Update to gwtjsonrpc 1.3
-+
-The change also shrinks the built WAR from 38M to 23M
-by excluding the now unnecessary GWT server code.
-
-== Bug Fixes
-
-* issue 904 Users who starred a change should receive all the emails about a change.
-
-* Fix: 'Diff All Side-by-Side' and 'Diff All Unified' buttons
-+
-When pressing the 'Diff All Side-by-Side' or
-'Diff All Unified' button on the change screen, the
-opened browser windows/tabs shows diffs using "Base"
-as old version and the latest one as active patch set,
-regardless what has been set using the
-"Old Version History:" drop down menu and what is
-currently active patch set.
-+
-Gerrit doesn't remember the base patch set in the URL,
-making it impossible to copy-and-paste the URL to
-co-workers to show them the same diff a user is
-looking at.
-+
-This change fixes this behavior to make sure that
-the opened new browser windows shows diffs using the
-correct old patch set and active patch set.
-
-* Fix NPEs looking up groups by UUID in GroupCache
-
-* Fix default 'receive.timeout'
-+
-This should be in milliseconds, not seconds. Set the default to be
-2 minutes in milliseconds and update the documentation to reflect
-that milliseconds are the default unit of time used here.
-
-* Fix 'development_become_any_account' redirects
-* issue 1299 Allow configuration of optional pattern for gitweb file history link
-* Use servlet context path during logout
-
-* issue 1353 Fix case check for project name so that symlinks work again
-* Fix merging of access sections
-* Fix inconsistent behavior when replicating refs/meta/config
-* Fix duplicated results on status:open project:P branch:B
-
-== Documentation
-
-=== Access Rights
-* Capabilities introduced
-* Kill and priority capabilities
-* Administrate server capability
-* Create account capability
-* Create group and project capability
-* Flush caches capability
-* Capability replication and view caches
-* Capability view conn. & queue
-* Example roles introduced
-* Developer example role
-* CI system example role
-* Integrator example role
-* Project owner example role
-* Administrator example role
-
-=== Miscellaneous
-* User upload documentation: Replace changes
-* Add visible-to-all flag in the documentation for cmd-create-group
-* Add a contributing guideline for annotations
-* Add missing header for suggest.accounts documentation
-* Fix anchors for description of gitweb config parameters
-* Add missing section name to config-gerrit documentation
-* Fix documentation of ls-projects
diff --git a/ReleaseNotes/ReleaseNotes-2.5.1.txt b/ReleaseNotes/ReleaseNotes-2.5.1.txt
deleted file mode 100644
index c2982df..0000000
--- a/ReleaseNotes/ReleaseNotes-2.5.1.txt
+++ /dev/null
@@ -1,92 +0,0 @@
-= Release notes for Gerrit 2.5.1
-
-Gerrit 2.5.1 is now available:
-
-link:https://www.gerritcodereview.com/download/gerrit-full-2.5.1.war[https://www.gerritcodereview.com/download/gerrit-full-2.5.1.war]
-
-There are no schema changes from 2.5, or 2.5.1.
-
-However, if upgrading from a version older than 2.5, follow the upgrade
-procedure in the 2.5 link:ReleaseNotes-2.5.html[Release Notes].
-
-== Security Fixes
-* Correctly identify Git-over-HTTP operations
-+
-Git operations over HTTP should be classified as using AccessPath.GIT
-and not WEB_UI. This ensures RefControl will correctly test for Create,
-Push or Delete access on a reference instead of Owner.
-+
-E.g. without this fix project owners are able to force push commits
-via HTTP that are already in the history of the target branch, even
-without having any Push access right assigned.
-
-* Make sure only Gerrit admins can change the parent of a project
-+
-Only Gerrit administrators should be able to change the parent of a
-project because by changing the parent project access rights and BLOCK
-rules which are configured on a parent project can be avoided.
-+
-The `set-project-parent` SSH command already verifies that the caller
-is a Gerrit administrator, however project owners can change the parent
-project by modifying the `project.config` file and pushing to the
-`refs/meta/config` branch.
-+
-This fix ensures that changes to the `project.config` file that change
-the parent project can only be pushed/submitted by Gerrit
-administrators.
-+
-In addition it is now no longer possible to
-+
-** set a non-existing project as parent (as this would make the project
-  be orphaned)
-** set a parent project for the `All-Projects` root project (the root
-  project by definition has no parent)
-by pushing changes of the `project.config` file to `refs/meta/config`.
-
-== Bug Fixes
-* Fix RequestCleanup bug with Git over HTTP
-+
-Decide if a continuation is going to be used early, before the filter
-that will attempt to cleanup a RequestCleanup. If so don't allow
-entering the RequestCleanup part of the system until the request is
-actually going to be processed.
-+
-This fixes the IllegalStateException `Request has already been cleaned
-up` that occurred when running on Jetty and pushing over HTTP for URLs
-where the path starts with `/p/`.
-
-* Match all git fetch/clone/push commands to the command executor
-+
-Route not just `/p/` but any Git access to the same thread pool as the
-SSH server is using, allowing all requests to compete fairly for
-resources.
-
-* Fix auto closing of changes on direct push
-+
-When a commit is directly pushed into a repository (bypassing code
-review) and this commit has a Change-Id in its commit message then the
-corresponding change is automatically closed if it is open.
-
-* Allow assigning `Push` for `refs/meta/config` on `All-Projects`
-+
-The `refs/meta/config` branch of the `All-Projects project` should only
-be modified by Gerrit administrators because being able to do
-modifications on this branch means that the user could assign himself
-administrator permissions.
-+
-In addition to being administrator we already require that the
-administrator has the `Push` access right for `refs/meta/config` in
-order to be able to modify it (just as with all other branches
-administrators do not have edit permissions by default).
-+
-The problem was that assigning the `Push` access right for
-`refs/meta/config` on the `All-Projects` project was not allowed.
-+
-Having the `Push` access right for `refs/meta/config` on the
-`All-Projects` project without being administrator already has no
-effect.
-+
-Prohibiting to assign the Push access right for `refs/meta/config` on
-the `All-Project` project was anyway pointless since it was e.g.
-possible to assign the `Push` access right on `refs/meta/*`.
-
diff --git a/ReleaseNotes/ReleaseNotes-2.5.2.txt b/ReleaseNotes/ReleaseNotes-2.5.2.txt
deleted file mode 100644
index 9bedeac..0000000
--- a/ReleaseNotes/ReleaseNotes-2.5.2.txt
+++ /dev/null
@@ -1,136 +0,0 @@
-= Release notes for Gerrit 2.5.2
-
-Gerrit 2.5.2 is now available:
-
-link:https://www.gerritcodereview.com/download/gerrit-full-2.5.2.war[https://www.gerritcodereview.com/download/gerrit-full-2.5.2.war]
-
-There are no schema changes from 2.5, or 2.5.1.
-
-However, if upgrading from any earlier version, follow the upgrade
-procedure in the 2.5 link:ReleaseNotes-2.5.html[Release Notes].
-
-== Bug Fixes
-* Improve performance of ReceiveCommits for repos with many refs
-+
-When validating the received commits all existing refs were added as
-uninteresting to the RevWalk. This resulted in bad performance when a
-repository had many refs (>100000). Putting existing 'refs/changes/'
-or 'refs/tags/' into the RevWalk is now avoided, which improves the
-performance.
-
-* Improve Push performance by discarding 'cache-automerge/*' refs
-  early in VisibleRefFilter
-+
-For a typical large Git repository, with many refs and lots of cached
-merges, the push time goes down significantly.
-
-* Don't display all files from a merge-commit when auto-merge fails
-+
-For merge commits Gerrit shows the difference to the automatic merge
-result. The creation of the auto-merge result may fail, e.g. when the
-merge commit has multiple merge bases (because JGit doesn't support
-this case yet). In this case Gerrit was showing all files from the
-merge commit. This caused several issues:
-+
---
-** the file list was too large for projects with a large number of
-   files
-** Gerrit would send too many false notification emails to users
-   watching changes under certain paths
-** both client and server needed a lot of resources in order to handle
-   such a large list of files
---
-+
-Now the file list for a merge commit will be empty when the creation
-of the auto-merge result fails.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=1726[issue 1726]:
-  Create ref for new patch set on direct push
-+
-If a change is in review and a new commit that has the Change-Id of
-this change in its commit message is pushed directly, then a new patch
-set for this commit is created and the change gets automatically
-closed. The problem was that no change ref for this new patch set was
-created and as result the change ref that was shown for the new patch
-set in the WebUI, and which was contained in the patchset-created
-event, was invalid.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=1767[issue 1767]:
-  Remove wrong error message when pushing a new ref fails
-+
-If pushing a new ref was rejected because the user was not allowed to
-create it the error message always told the user that he's missing the
-'Create Reference' access right. This message was incorrect in some
-cases. Users that have the 'Create Reference' access right assigned
-are e.g. not allowed to create the ref if:
-+
---
-** they are pushing an annotated tag without having the
-   'Push Annotated Tag' access right
-** they are pushing a signed tag without having the 'Push Signed Tag'
-   access right
-** the project state is set to 'Read Only'
---
-+
-Now the error message just says 'Prohibited by Gerrit'. This generic
-error message is better than a more concrete error message which is
-wrong in same cases because a wrong message is misleading and
-confuses the user.
-+
-In addition the description of the 'Prohibited by Gerrit' error in the
-documentation has been updated to explain some additional cases in
-which the 'Prohibited by Gerrit' error occurs.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=1444[issue 1444]:
-  Remove 'Mailing-List' header from sent emails
-+
-The non-standard 'Mailing-List' header that is included in the emails
-sent by Gerrit isn't allowed by the Amazon Simple Email Service and is
-now removed.
-
-* Improve SMTP client error messages
-+
-The wording of the error messages in the SMTP client was changed to
-make it more clear at exactly what stage in the SMTP transaction the
-server returned an error. Also the server's response text is now
-always included.
-+
-In addition it is now ensured that already rejected recipients are
-included in the error message when the server rejects the DATA
-command. Without this there is no way of debugging rejected
-recipients if all recipients are rejected since that typically
-results in a DATA command rejection. Because some SMTP servers (e.g.
-Postfix with the default configuration) delay rejection of HELO/EHLO
-and MAIL FROM commands to the RCPT TO stage, this can happen not only
-for bad recipients.
-
-* Allow time unit variables to be '0'
-+
-link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/config-gerrit.html[
-Gerrit Configuration parameters] that expect a numerical time unit as
-value can now be set to '0'.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=1076[issue 1076]:
-  Fix CLA hyperlink on account registration page
-+
-The New Contributor Agreement hyperlink on the Account Registration page
-was malformed.
-
-* Fix broken link to repo command reference
-+
-The link to the repo command reference in the 'repo upload' section of
-the 'Uploading Changes' documentation was broken.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=1569[issue 1569]:
-Fix unexpected behavior in the commit-msg hook caused by `GREP_OPTIONS`
-+
-If `GREP_OPTIONS` was set, it caused unexpected behavior in the
-commit-msg hook.  For example if it included a setting like
-`--exclude=".git/*"` it caused a new `Change-Id` line to be appended
-to the commit message on every amend.
-+
-`GREP_OPTIONS` is now unset at the beginning of the commit-msg script
-to prevent such problems from occurring.
-+
-The `GREP_OPTIONS` setting in the user's environment is unaffected
-by this change.
diff --git a/ReleaseNotes/ReleaseNotes-2.5.3.txt b/ReleaseNotes/ReleaseNotes-2.5.3.txt
deleted file mode 100644
index 6448f1c..0000000
--- a/ReleaseNotes/ReleaseNotes-2.5.3.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-= Release notes for Gerrit 2.5.3
-
-Gerrit 2.5.3 is now available:
-
-link:https://www.gerritcodereview.com/download/gerrit-2.5.3.war[https://www.gerritcodereview.com/download/gerrit-2.5.3.war]
-
-There are no schema changes from any of the 2.5.x versions.
-
-However, if upgrading from a version older than 2.5, follow the upgrade
-procedure in the 2.5 link:ReleaseNotes-2.5.html[Release Notes].
-
-== Security Fixes
-* Patch vulnerabilities in OpenID client library
-+
-Installations using OpenID for authentication were vulnerable to a
-number of attacks over the network.  The openid4java client library
-was identified as the entry point.  In this release Gerrit updated to
-the latest 0.9.8 release, which patches the known attack vectors.
-
-No other changes since 2.5.2.
diff --git a/ReleaseNotes/ReleaseNotes-2.5.4.txt b/ReleaseNotes/ReleaseNotes-2.5.4.txt
deleted file mode 100644
index 6ea93bb..0000000
--- a/ReleaseNotes/ReleaseNotes-2.5.4.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-= Release notes for Gerrit 2.5.4
-
-Gerrit 2.5.4 is now available:
-
-link:https://www.gerritcodereview.com/download/gerrit-2.5.4.war[https://www.gerritcodereview.com/download/gerrit-2.5.4.war]
-
-There are no schema changes from any of the 2.5.x versions.
-
-However, if upgrading from a version older than 2.5, follow the upgrade
-procedure in the 2.5 link:ReleaseNotes-2.5.html[Release Notes].
-
-== Bug Fixes
-* Require preferred email to be verified
-+
-Some users were able to select a preferred email address that was
-not previously verified. This may have allowed the server to send
-notifications to an invalid destination, resulting in higher than
-usual bounce rates.
-
-No other changes since 2.5.3.
diff --git a/ReleaseNotes/ReleaseNotes-2.5.5.txt b/ReleaseNotes/ReleaseNotes-2.5.5.txt
deleted file mode 100644
index 27dd2b6..0000000
--- a/ReleaseNotes/ReleaseNotes-2.5.5.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-= Release notes for Gerrit 2.5.5
-
-There are no schema changes from link:ReleaseNotes-2.5.4.html[2.5.4].
-
-link:https://www.gerritcodereview.com/download/gerrit-2.5.5.war[https://www.gerritcodereview.com/download/gerrit-2.5.5.war]
-
-== Bug Fixes
-* Patch JGit security hole
-+
-The security hole may permit a modified Git client to gain access
-to hidden or deleted branches if the user has read permission on
-at least one branch in the repository. Access requires knowing a
-SHA-1 to request, which may be discovered out-of-band from an issue
-tracker or gitweb instance.
diff --git a/ReleaseNotes/ReleaseNotes-2.5.6.txt b/ReleaseNotes/ReleaseNotes-2.5.6.txt
deleted file mode 100644
index 393eb93..0000000
--- a/ReleaseNotes/ReleaseNotes-2.5.6.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-= Release notes for Gerrit 2.5.6
-
-There are no schema changes from link:ReleaseNotes-2.5.6.html[2.5.6].
-
-link:https://www.gerritcodereview.com/download/gerrit-2.5.6.war[https://www.gerritcodereview.com/download/gerrit-2.5.6.war]
-
-== Bug Fixes
-* Fix clone for modern Git clients
-+
-The security fix in 2.5.4 broke clone for recent Git clients,
-throwing an ArrayIndexOutOfBoundsException. Fixed.
diff --git a/ReleaseNotes/ReleaseNotes-2.5.txt b/ReleaseNotes/ReleaseNotes-2.5.txt
deleted file mode 100644
index 6bcb87a..0000000
--- a/ReleaseNotes/ReleaseNotes-2.5.txt
+++ /dev/null
@@ -1,1912 +0,0 @@
-= Release notes for Gerrit 2.5
-
-Gerrit 2.5 is now available:
-
-link:https://www.gerritcodereview.com/download/gerrit-full-2.5.war[https://www.gerritcodereview.com/download/gerrit-full-2.5.war]
-
-Gerrit 2.5 includes the bug fixes done with
-link:ReleaseNotes-2.4.1.html[Gerrit 2.4.1] and
-link:ReleaseNotes-2.4.2.html[Gerrit 2.4.2]. These bug fixes are *not*
-listed in these release notes.
-
-== Schema Change
-*WARNING:* This release contains schema changes.  To upgrade:
-----
-  java -jar gerrit.war init -d site_path
-----
-
-*WARNING:* Upgrading to 2.5.x requires the server be first upgraded to 2.1.7 (or
-a later 2.1.x version), and then to 2.5.x.  If you are upgrading from 2.2.x.x or
-newer, you may ignore this warning and upgrade directly to 2.5.x.
-
-=== Warning on upgrade to schema version 68
-
-The migration to schema version 68, may result in a warning, which can
-be ignored when running init in the interactive mode.
-
-E.g. this warning may look like this:
-
-----
-Upgrading database schema from version 67 to 68 ...
-warning: Cannot create index for submodule subscriptions
-Duplicate key name 'submodule_subscriptions_access_bySubscription'
-Ignore warning and proceed with schema upgrade [y/N]?
-----
-
-This migration is creating an index for the
-link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/user-submodules.html[submodule feature] in
-Gerrit. When the submodule feature was introduced the index was only
-created when a new site was initialized, but not when Gerrit was
-upgraded. This migration tries to create the index, but it will only
-succeed if the index does not exist yet. If the index exists already,
-the creation of the index will fail. There was no database independent
-way to detect this case and this is why this migration leaves it to the
-user to decide if a failure should be ignored or not. If from the error
-message you can see that the migration failed because the index exists
-already (as in the example above), you can safely ignore this warning.
-
-== Upgrade Warnings
-
-[[replication]]
-=== Replication
-
-Gerrit 2.5 no longer includes replication support out of the box.
-Servers that reply upon `replication.config` to copy Git repository
-data to other locations must also install the replication plugin.
-
-=== Cache Configuration
-
-Disk caches are now backed by individual H2 databases, rather than
-Ehcache's own private format. Administrators are encouraged to clear
-the `'$site_path'/cache` directory before starting the new server.
-
-The `cache.NAME.diskLimit` configuration variable is now expressed in
-bytes of disk used. This is a change from previous versions of Gerrit,
-which expressed the limit as the number of entries rather than bytes.
-Bytes of disk is a more accurate way to size what is held. Admins that
-set this variable must update their configurations, as the old values
-are too small. For example a setting of `diskLimit = 65535` will only
-store 64 KiB worth of data on disk and can no longer hold 65,000 patch
-sets. It is recommended to delete the diskLimit variable (if set) and
-rely on the built-in default of `128m`.
-
-The `cache.diff.memoryLimit` and `cache.diff_intraline.memoryLimit`
-configuration variables are now expressed in bytes of memory used,
-rather than number of entries in the cache. This is a change from
-previous versions of Gerrit and gives administrators more control over
-how memory is partitioned within a server. Admins that set this variable
-must update their configurations, as the old values are too small.
-For example a setting of `memoryLimit = 1024` now means only 1 KiB of
-data (which may not even hold 1 patch set), not 1024 patch sets.  It
-is recommended to set these to `10m` for 10 MiB of memory, and
-increase as necessary.
-
-The `cache.NAME.maxAge` variable now means the maximum amount of time
-that can elapse between reads of the source data into the cache, no
-matter how often it is being accessed. In prior versions it meant how
-long an item could be held without being requested by a client before
-it was discarded. The new meaning of elapsed time before consulting
-the source data is more useful, as it enables a strict bound on how
-stale the cached data can be. This is especially useful for slave
-servers account and permission data, or the `ldap_groups` cache, where
-updates are often made to the source without telling Gerrit to reload
-the cache.
-
-== New Features
-
-=== Plugins
-
-The Gerrit server functionality can be extended by installing plugins.
-Depending on how tightly the extension code is coupled with the Gerrit
-server code, there is a distinction between
-link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/dev-plugins.html#plugin[plugins] and
-link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/dev-plugins.html#extension[extensions].
-
-* link:#replication[Move replication logic to replication plugin]
-+
-This splits all of the replication code out of the core server
-and moves it into a standard plugin.
-
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/dev-plugins.html[Documentation about
-  plugin development] including instructions for:
-** link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/dev-plugins.html#getting-started[how to get
-   started with plugin development]
-** link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/dev-plugins.html#deployment[plugin
-   deployment/installation]
-
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/dev-plugins.html#API[API for plugins and
-  extensions]
-
-* Support for link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/dev-plugins.html#ssh[SSH command
-  plugins]
-+
-Allows plugin developers to declare additional SSH commands.
-
-* Enable link:#ssh-alias[aliases for SSH commands]
-+
-Site administrators can alias SSH commands from a plugin into the
-`gerrit` namespace.
-+
-The aliases are configured statically at server startup, but are
-resolved dynamically at invocation time to the currently loaded
-version of the plugin. If the plugin is not loaded, or does not
-define the command, "not found" is returned to the user.
-
-* Support for link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/dev-plugins.html#http[HTTP
-  plugins]
-+
-Plugins may contribute to the /plugins/NAME/ URL space.
-
-* Automatic registration of plugin bindings
-+
-If a plugin has no modules declared in the manifest, automatically
-generate the modules for the plugin based on the class files that
-appear in the plugin and the `@Export` annotations that appear on
-these concrete classes.
-+
-For any non-abstract command that extends SshCommand, plugins may
-declare the command with `@Export("name")` to
-link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/dev-plugins.html#ssh[bind the implementation
-as that SSH command].
-+
-Likewise link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/dev-plugins.html#http[HTTP servlets
-can also be bound to URLs].
-
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/dev-plugins.html#data-directory[Support a data
-  directory for plugins on demand]
-
-* Support serving static/ and Documentation/ from plugins
-+
-The static/ and Documentation/ resource directories of a plugin can be
-served over HTTP for any loaded and running plugin, even if it has no
-other HTTP handlers. This permits a plugin to supply icons or other
-graphics for the web UI, or documentation content to help users learn
-how to use the plugin.
-
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/dev-plugins.html#documentation[Auto-formatting
-  of plugin HTTP pages from Markdown files]
-+
-If Gerrit detects that a requested plugin resource does not exist, but
-instead a file with a `.md` extension does exist, Gerrit opens the
-`.md` file and reformats it as html.
-
-* Support of link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/dev-plugins.html#macros[macros in
-  Markdown plugin documentation]
-
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/dev-plugins.html#auto-index[Automatic
-  generation of an index for the plugin documentation]
-
-* Support for audit plugins
-+
-Plugins can implement an `AuditListener` to be informed about auditable
-actions:
-+
-----
-  @Listener
-  public class MyAuditTrail extends AuditListener
-----
-+
-The plugin must define a plugin module that binds the implementation of
-the audit listener in the `configure()` method:
-+
-----
-  DynamicSet.bind(binder(), AuditListener.class).to(MyAuditTrail.class);
-----
-
-* Web UI for plugins
-+
-Administrators can see the list of installed plugins in the WebUI
-under `Admin` > `Plugins`. For each plugin the plugin status is shown
-and it is possible to navigate to the plugin documentation.
-
-* Servlet to list plugins
-+
-Administrators can retrieve plugin information from a REST interface
-by loading `<server-url>/a/plugins/`.
-
-* Support SSH commands to
-** link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/cmd-plugin-ls.html[list the installed
-   plugins]
-** link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/cmd-plugin-install.html[install plugins]
-** link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/cmd-plugin-enable.html[enable plugins]
-** link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/cmd-plugin-remove.html[disable plugins]
-** link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/cmd-plugin-reload.html[reload plugins]
-
-* Support installation of core plugin on site initialization
-
-* Automatically load/unload/reload plugins
-+
-The PluginScanner thread runs every 1 minute by default and loads any
-newly created plugins, unloads any deleted plugins, and reloads any
-plugins that have been modified.
-+
-The check frequency can be configured by setting
-link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/config-gerrit.html#plugins.checkFrequency[
-plugins.checkFrequency] in the Gerrit config file. By configuration
-the scanner can also be disabled.
-
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/dev-plugins.html#classpath[Loading of plugins
-  in own ClassLoader]
-
-* Plugin cleanup in the background
-+
-When a plugin is stopped, schedule a Plugin Cleaner task to run
-1 minute later to try and clean out the garbage and release the
-JAR from `$site_path/tmp`.
-
-* Export `LifecycleListener` as extension point
-+
-Extensions may need to know when they are starting or stopping.
-Export the interface that they can use to learn this information.
-
-* Support injection of `ServerInformation` into extensions and plugins
-+
-Plugins can take this value by injection and learn the current
-server state during their own LifecycleListener. This enables a
-plugin to determine if it is loading as part of server startup, or
-because it was dynamically installed or reloaded by an administrator.
-
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/dev-plugins.html#getting-started[Maven
-  archetype for creating gerrit plugin projects]
-
-* Enables the use of session management in Jetty
-+
-This enables plugins to make use of servlet sessions.
-
-=== REST API
-Gerrit now supports a REST like API available over HTTP. The API is
-suitable for automated tools to build upon, as well as supporting some
-ad-hoc scripting use cases.
-
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/rest-api.html[Documentation of the REST API]
-
-* Support REST endpoints to
-** link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/rest-api-changes.html[query changes]
-** link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/rest-api-projects.html[list projects]
-** link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/rest-api-projects.html#suggest-projects[suggest
-   projects]
-** link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/rest-api-accounts.html#list-account-capabilities[query
-   the global capabilities of the calling user]
-
-* Support link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/rest-api.html#authentication[anonymous
-  and authenticated access] to the REST endpoints
-
-* Support link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/rest-api.html#output[JSON output
-  format] for the REST endpoints
-
-The new REST API is used from the Gerrit WebUI.
-
-Some of the methods from the old internal JSON-RPC interface were
-completely replaced by the new REST API and got deleted:
-
-* `ProjectAdminService.visibleProjects(AsyncCallback<ProjectList>)`
-* `ProjectAdminService.suggestParentCandidates(AsyncCallback<List<Project>>)`
-* `ChangeListService.myStarredChangeIds(AsyncCallback<Set<Change.Id>>)`
-* `ChangeListService.allQueryNext(String, String, int, AsyncCallback<SingleListChangeInfo>)`
-* `ChangeListService.allQueryPrev(String, String, int, AsyncCallback<SingleListChangeInfo>)`
-* `ChangeListService.forAccount(Account.Id, AsyncCallback<AccountDashboardInfo>)`
-
-[[query-deprecation]]
-In addition the `/query` API has been deprecated. By default it is
-still available but server administrators may disable it by setting
-the link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/config-gerrit.html#site.enableDeprecatedQuery[
-`site.enableDeprecatedQuery`] parameter in the Gerrit config file. This
-allows to enforce tools to move to the new API.
-
-=== Web
-
-==== Change Screen
-
-* Display commit message in a box
-+
-The commit message on the change screen is now placed in a box with a
-title and emphasis on the commit summary. The star icon and the
-permalink are displayed in the box header. The header from the change
-screen is removed as it only held duplicate information.
-
-* Open the dependency section automatically when the change is needed
-  by an open change
-
-* Only show a change as needed by if its current patch set depends on
-  the change
-
-* Show only changes of the same project in the 'Depends On' section
-+
-If two projects share the same history it can happen that the same
-commit is pushed for both projects, resulting in two changes. If now
-a successor commit is pushed for one of the projects, the resulting
-successor change was wrongly listing both changes in the 'Depends On'
-section. Now only the predecessor change of the own project is listed.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=1383[issue 1383]:
-  Display the approval table on the PublishCommentsScreen.
-+
-So far the approval table that shows the reviewers and their current
-votes was only shown on the ChangeScreen. Now it is also shown on the
-PublishCommentScreen. This allows the reviewer to see all existing
-votes and reviewers when doing their own voting and publishing of
-comments. Seeing the existing votes helps the reviewer in
-understanding which votes are still required before the change can be
-submitted.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=1380[issue 1380]:
-  Display time next to change comments
-+
-When a comment was posted yesterday, or any time older than 1 day but
-less than 1 year ago, display the time too. Display "May 2 17:37" rather
-than just "May 2".
-
-* Only show "Can Merge" when the change is new or draft
-
-* Allow auto suggesting reviewers to draft changes
-+
-Auto completing users for draft changes did't work as the other
-users didn't have access to the drafts. The visibility check for
-the reviewer suggestion is now skipped.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=1294[issue 1294]:
-  Shorten subject of parent commit for displaying in the UI
-+
-If the parent commit has a very long subject (> 80 characters) shorten
-the subject for displaying it in the Gerrit web UI on the change screen.
-This avoids that the 'Parent(s)' cell for the patch set becomes very
-wide.
-
-* If subject is shortened for displaying in the UI indicate this by '...'
-+
-If a commit has a very long subject line (> 80 characters) it is
-shortened when it is displayed in the Gerrit Web UI. Indicate to the
-user that the subject was shortened by appending '...' to the shortened
-subject.
-+
-Also the subject is now cropped after a whitespace if possible.
-
-* Insert Change-Id for revert commits
-+
-The 'Revert Change' action on a merged change allows to create a new
-change that reverts the merged change. The commit message of the revert
-commit now contains a Change-Id.
-+
-It is convenient if a Change-Id is automatically created and inserted
-into the commit message of the revert commit since it makes rebasing of
-the revert commit easier.
-
-* Use more gentle shade of red to highlight outdated dependencies
-
-==== Patch Screens
-
-* New patch screen header
-+
-A new patch screen header was added that is displayed above both the
-side-by-side and unified views. The new header contains actual links to
-the available patchsets and shows which patchset is being currently
-displayed.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=1192[issue 1192]:
-  Add download links to the unified diff view
-
-* Improvement of the side-by-side viewer table
-+
-The line number column for the right side was moved to be on the far
-right of the table, so that the layout now looks like this:
-+
-----
-  1 |  foo       |       bar   | 1
-  2 |  hello     |       hello | 2
-----
-+
-This looks nicer when reading a lot of code, as the line numbers are
-less relevant than the code itself which is now in the center of the
-UI.
-+
-Line numbers are still links to create comment editors, but they
-use a light shade of gray and skip the underline decoration, making
-them less visually distracting.
-+
-Skip lines now use a paler shade of blue and also hide the fact they
-contain anchors, until you hover over them and the anchor shows up.
-+
-The expand before and after are changed to be arrows showing in
-which direction the lines will appear above or below the skip
-line.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=626[issue 626]:
-  Option to display line endings
-+
-There is a new user preference that allows to display Windows EOL/Cr-Lf.
-'\r' is shown in a dotted-line box (similar to how '\r' is displayed in
-GitWeb).
-
-* Streamlined review workflow
-+
-A link was added next to the "Reviewed" checkbox that marks the current
-patch as reviewed and goes to the next unreviewed patch.
-
-* Add key commands to mark a patch as reviewed
-+
-Add key commands
-+
-. to toggle the reviewed flag for a patch ('m')
-+
-and
-+
-. to mark the patch as reviewed and navigate to the next unreviewed
-patch ('M').
-
-* Use download icons instead of the `Download` text links
-
-==== User Dashboard
-* Support for link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/user-custom-dashboards.html[custom
-  dashboards]
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=1407[issue 1407]:
-  Improve highlighting of unreviewed changes in the user's dashboard
-+
-A change will be highlighted as unreviewed if
-+
-. the user is reviewer of the change but hasn't published any change
-  message for the current patch set
-. the user has published a change message for the current patch set,
-  but afterwards the change owner has published a change message on
-  the change
-
-* Sort outgoing reviews in the user dashboard by created date
-
-* Sort incoming reviews in the user dashboard by updated date
-+
-Sorting the incoming reviews by last updated date, descending, places
-the most recently updated reviews at the top of the list for a user,
-and the oldest stale at the bottom. This may help users to identify
-items to take immediate action on, as they appear closer to the top.
-
-==== Access Rights Screen
-
-* Display error if modifying access rights for a ref is forbidden
-+
-If a user is owner of at least one ref he is able to edit the access
-rights on a project. If he adds access rights for other refs, these
-access rights were silently ignored on save. Instead of this now an
-error message is displayed to inform the user that he doesn't have
-permissions to do the update for these refs.
-+
-In case of such an error the project access screen stays in the edit
-mode so that the unsaved modifications are not lost. The user may now
-propose the changes to the access rights through code review.
-
-* Allow to propose changes to access rights through code review
-+
-Users that are able to upload changes for code review for the
-`refs/meta/config` branch can now propose changes to the project access
-rights through code review directly from the ProjectAccessScreen.
-+
-When editing the project access rights there is a new button
-'Save for Review' which will create a new change for the access
-rights modifications. Project owners are automatically added as
-reviewer to this change. If a project owner agrees to the access rights
-modifications he can simply approve and submit the change.
-
-* Show all access rights in WebUI if user can read `refs/meta/config`
-+
-Users who can read the `refs/meta/config` branch, can see all access
-rights by fetching this branch and looking at the `project.config`
-file. Now they can see the same information in the web UI.
-
-* Allow extra group suggestions for project owners
-+
-When suggesting groups to a user, only groups that are visible to the
-user are suggested. These are those group that the user is member of.
-For project owners now also groups to which they are not a member are
-suggested when editing the access rights of the project.
-
-==== Other
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=1592[issue 1592]:
-  Ask user to login if change is not found
-+
-Accessing a change URL was failing with 'Application Error - The page
-you requested was not found, or you do not have permission to view this
-page' if the user was not signed in and the change was not visible to
-`Anonymous Users`. Instead Gerrit now asks the user to login and
-afterwards shows the change to the user if it exists and is visible.
-If the change doesn't exist or is not visible, the user will still get
-the NotFoundScreen after sign in.
-
-* Link to owner query from user names
-+
-Instead of linking from a user name to the user's dashboards, link to
-a search for changes owned by that user.
-
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/config-gerrit.html#gerrit.reportBugUrl[Allow
-  configuring the `Report Bug` URL]
-+
-Let site administrators direct users to their own ticket queue, as for
-many servers most of the reported bugs are small internal problems like
-asking for a repository to be created or updating group memberships.
-
-* On project creation allow choosing the parent project from a popup
-+
-In the create project UI a user can now browse all projects and select
-one as parent for the new project.
-
-* Check for open changes on branch deletion
-+
-Check for open changes when deleting a branch in the Gerrit WebUI.
-Delete a branch only if there are no open changes for this branch.
-This makes users aware of open changes when deleting a branch.
-
-* Enable ProjectBranchesScreen for the `All-Projects` project
-+
-This allows to see the branches of the `All-Projects` project in the
-web UI.
-
-* Show for each project in the project list a link to the repository
-  browser (e.g. GitWeb).
-
-* Move the project listing menu items to a new top-level item
-+
-Finding the project listing was very opaque to end users. Nobody
-expected to look under `Admin` and furthermore, anonymous users were
-unable to find that link at all.
-+
-Introduced a new top-level `Projects` menu that has `List` in it to
-take you to the project listing.
-+
-In addition the `Create new project` link from the top of that listing
-was moved to this new menu.
-
-* Move the Groups and Plugins menu items to the top level
-+
-The top-level Admin menu is removed as it is now unnecessary after the
-Projects, Groups and Plugins menu items were moved to the top-level.
-
-* Move form for group creation to own screen
-+
-Move the form for the group creation from the GroupListScreen to an
-own new CreateGroupScreen and add a link to this screen at the
-beginning of the GroupListScreen. The link to the CreateGroupScreen is
-only visible if the user has the permission to create new groups.
-
-* Drop the `Owners` column from the group list screen
-+
-The `Owners` column on the group list screen has been dropped in order
-to link:#performance-issue-on-showing-group-list[speed up the loading
-of the group list screen].
-
-* Drop the `Group Type` column from the group list screen
-+
-Since link:#migrate-ldap-groups[the LDAP group type was removed] there
-is no need to display the group type on the group list screen anymore.
-There are only 3 `SYSTEM` groups using well known names, and everything
-else has the type `INTERNAL`.
-
-* When adding a user to a group create an account for the user if needed
-+
-Trying to add a user to a group that doesn't have an account fails with
-'... is not a registered user.'. Now adding a user to a group does not
-immediately fail if there is no account for the user, but it tries to
-authenticate the user and if the authentication is successful a user
-account is automatically created, so that the user can be added to the
-group. This only works if LDAP is used as user backend.
-+
-This allows to add users to groups that did not log in into Gerrit
-before.
-
-* Differentiate between draft changes and draft comments
-+
-Show the draft changes of the user when he clicks on `My` > `Drafts`.
-The user's draft comments are now available under `My` >
-`Draft Comments`.
-
-* Show NotFoundScreen if a user that can't create projects tries to
-  access the ProjectCreationScreen
-
-* Add Edit, Reload next to non-editable Full Name field
-+
-If the user database is actually an external system users might need go
-to another server to edit their account data, and then re-import their
-account data by going through a login cycle. This is highly similar to
-LDAP where the directory provides account data and its refreshed every
-time the user visits the `/login/` URL handler.
-+
-The URL for the external system can be configured for the
-link:#custom-extension[`CUSTOM_EXTENSION`] auth type.
-
-=== Access Rights
-
-* Restrict rebasing of a change in the web UI to the change owner and
-  the submitter
-
-* Add a new link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/access-control.html#category_rebase[
-  access right to permit rebasing changes in the web UI]
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=930[issue 930]:
-  Add new link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/access-control.html#category_abandon[
-  access right for abandoning changes]
-
-* Check if user can upload in order to restore
-+
-Restoring a change is similar to uploading a new change. If a branch
-gets closed by removing the access rights to upload new changes it
-shouldn't be possible to restore changes for this branch.
-
-[[hide-config]]
-* Make read access to `refs/meta/config` by default exclusive to
-  project owners
-+
-When initializing a new site a set of default access rights is
-configured on the `All-Projects` project. These default access rights
-include read access on `refs/*` for `Anonymous Users` and read access
-on `refs/meta/config` for `Project Owners`. Since the read access on
-`refs/meta/config` for `Project Owners` was not exclusive,
-`Anonymous users` were able to access the `refs/meta/config` branch
-which by default should only be accessible by the project owners.
-
-=== Search
-* Offer suggestions for the search operators in the search panel
-+
-There are many search operators and it's difficult to remember all of
-them. Now the search operators are suggested as the user types the
-query.
-
-* Support alias `self` in queries
-+
-Writing an expression like "owner:self status:open" will now identify
-changes that the caller owns and are still open. This `self` alias
-is valid in contexts where a user is expected as an argument to a
-query operator.
-
-* Add parent(s) revision information to output of query command
-
-* Add owner username to output of query command
-
-* `/query` API has been link:#query-deprecation[deprecated]
-
-=== SSH
-* link:http://code.google.com/p/gerrit/issues/detail?id=1095[issue 1095]
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/cmd-set-account.html[SSH command to manage
-  accounts]
-
-* On link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/cmd-create-account.html[account creation] a
-  password for HTTP can be specified.
-
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/cmd-set-project.html[SSH command to manage
-  project settings]
-
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/cmd-test-submit-rule.html[SSH command to test
-  submit rules]
-+
-The command creates a fresh Prolog environment and loads a Prolog
-script from stdin. `can_submit` is then queried and the results are
-returned to the user.
-
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/cmd-ban-commit.html[SSH command to ban
-  commits]
-
-[[ssh-alias]]
-* Enable aliases for SSH commands
-+
-Site administrators can define aliases for SSH commands in the
-link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/config-gerrit.html#ssh-alias[`ssh-alias` section]
-of the Gerrit configuration.
-
-* Add submit records to the output of the
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/cmd-query.html[query] SSH command:
-+
-Add a command line option to the `query` SSH command to include submit
-records in the output.
-+
-This facilitates the querying of information relating to the submit
-status from the command line and by API clients, including information
-such as whether the change can be submitted as-is, and whether the
-submission criteria for each review label has been met.
-
-* Support JSON output format for the
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/cmd-ls-projects.html[ls-projects] SSH command
-
-* Support creation of multiple branches in
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/cmd-create-project.html[create-project] SSH
-  command
-+
-In case if a project has some kind of waterfall automerging
-a->b->c it is convenient to create all these branches at the
-project creation time.
-+
-e.g. '.. gerrit create-project -b master -b foo -b bar ...'
-
-* Add verbose output option to
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/cmd-ls-groups.html[ls-groups] command
-+
-The verbose mode enabled by the new option makes the ls-groups
-command output a tab-separated table containing all available
-information about each group (though not its members).
-
-=== Documentation
-
-==== Commands
-
-* document for the link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/cmd-create-group.html[`create-group`]
-  command that for unknown users an account is automatically created if
-  the LDAP authentication succeeds
-
-* Update documentation and help text for the
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/cmd-review.html[`review`] SSH command
-+
-The review command can be applied to multiple changes, but the
-help text was written in singular tense.
-+
-Add a paragraph in the documentation explaining that the
-`--force-message` option will not be effective if the `review` command
-fails because the user is not permitted to change the label.
-
-* Clarify that `init --batch` doesn't drop old database objects
-
-* Update the list of unsupported slave commands
-
-* Fix link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/cmd-stream-events.html[`stream-events`]
-  documentation
-+
-Some attributes contained in the events were not described, for a few
-others the name was given in a wrong case.
-
-* Fix and complete synopsis of commands
-
-==== Access Control
-
-* Clarify the ref format for
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/access-control.html#category_push_merge[`Push
-  Merge Commit`]
-+
-Elaborate on the required format of the ref used for `Push Merge Commit`
-access right entries to avoid user confusion when granting access to
-`refs/heads/*` still doesn't allow them to push any merge commits.
-
-* Document the
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/access-control.html#capability_emailReviewers[
-  `emailReviewers`] capability
-
-==== Error
-* Improve documentation of link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/error-change-closed.html[
-  `change closed` error]
-+
-The `change closed` error can also occur when trying to submit a
-review label with the SSH review command onto a change that has
-been closed (submitted and merged, or abandoned) or onto a patchset
-that has been replaced by a newer patchset.
-
-* Correct documentation of `invalid author` and `invalid committer`
-  errors
-+
-The error messages `you are not committer ...` and `you are not
-author ...` were replaced with `invalid author` and `invalid
-committer`.
-
-* Describe that the `prohibited by Gerrit` error is returned if pushing
-  a tag fails because the tagger is somebody else and the `Forge
-  Committer` access right is not assigned.
-
-==== Dev
-
-* Update push URL in link:../SUBMITTING_PATCHES[SUBMITTING_PATCHES]
-+
-Pushes are now accepted at the same address as clone/fetch/pull.
-
-* Update link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/dev-contributing.html[contributor
-  document]
-+
-We now prefer to use Guava (previously known as Google Collections).
-
-* Fixed broken link to source code
-+
-Updated the documentation source code links to point to:
-http://code.google.com/p/gerrit/source/checkout
-
-* State link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/dev-eclipse.html#known-problems[known issues]
-  when debugging Gerrit with Eclipse
-
-* Improved the section on
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/dev-eclipse.html#hosted-mode[hosted mode
-  debugging]
-+
-The existing section on hosted mode debugging left out a couple of
-steps, and the requirement to use `DEVELOPMENT_BECOME_ANY_ACCOUNT`
-instead of `OpenID` was not mentioned anywhere.
-
-* Add a link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/dev-release.html[release preparation
-  document]
-+
-Document what it takes to make a Gerrit stable or stable-fix release,
-and how to release Gerrit subprojects.
-
-==== Other
-* Add link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/prolog-cookbook.html[Cookbook for Prolog
-  submit rules]
-+
-A new document providing a step by step introduction into implementing
-specific submit policies using Prolog based submit rules was added.
-
-* Describe link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/refs-notes-review.html[
-  `refs/notes/review` and its contents]
-
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/config-mail.html[Document `RebasedPatchSet.vm`
-  and `Reverted.vm` mail templates]
-
-* Specify output file for curl commands in documentation
-+
-For downloading the `commit-msg` hook and the `gerrit-cherry-pick`
-script users can either use scp or curl. Specify the output file for
-each curl command so that the result is equal to the matching scp
-command.
-
-* Document that user must be in repository root to install `commit-msg`
-  hook
-
-* Add some clarifications to the
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/install-quick.html[quick installation guide]
-
-* Add missing documentation about
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/config-gerrit.html#hooks[hook configuration]
-+
-Add documentation of hook config for `change-restored`, `ref-updated`
-and `cla-signed` hooks.
-
-* Document that the commit message hook file should be executable
-
-* Mention that also MySQL supports replication, not just Postgres
-
-* Make sorting of release notes consistent so that the release notes
-  for the newest release is always on top
-
-* Various corrections
-+
-Correct typos, spelling mistakes, and grammatical errors.
-
-=== Dev
-* Add link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/dev-release.html#plugin-api[script for
-  releasing plugin API jars]
-
-* Pushes are now accepted at the same address as clone/fetch/pull
-+
-To submit patches commits can be pushed to
-https://gerrit.googlesource.com/gerrit
-
-* Add `-Pchrome`, `-Pwebkit`, `-Pfirefox` aliases for building
-+
-This makes it easier to build for the browser you want to
-test on, rather than remembering what its GWT name is.
-
-* Disable assertions for KeyCommandSet when running in gwtdebug mode
-+
-The assertions in the KeyCommandSet class cause exceptions when a
-KeyCommand is registered several times.
-
-* Add the run profiles to the favorites menu
-
-* Add Intellij IDEA files to ignore list
-
-* Move local Maven repository to Google Cloud Storage
-
-* Make sure asciidoc uses unix line endings in generated HTML.
-+
-Use an explicit asciidoc attribute to make sure the produced HTML will
-always contain unix line endings.  This will help in producing build
-results that are better comparable by size.
-
-* Remove timestamp from all `org.eclipse.core.resources.prefs` files
-+
-Eclipse overwrites these files when we import projects using m2e.
-Eclipse 3 writes a timestamp at the top of these files making the Git
-working tree dirty.  Eclipse 4 (Juno) still overwrites these files but
-doesn't write the timestamp.  This should help to keep the working tree
-clean.  However, since the timestamp is currently present in these
-files, Eclipse 4 would still make them dirty by overwriting and
-effectively removing the timestamp.
-+
-This change removes the timestamp from these files. This helps those
-using Eclipse 4 and doesn't make it worse for those still using Eclipse
-3.
-
-* Add Maven profile to skip build of plugin modules
-+
-Building the plugin modules ('Plugin API' and 'Plugin Archetype') may
-take a significant amount of time (since many jars are downloaded).
-During development it is not needed to build the plugin modules. A new
-Maven profile was added that skips the build of the plugin modules,
-so that developers have a faster turnaround. This profile is called
-`no-plugins` and it's active by default. To include the plugin modules
-into the build activate the `all` profile:
-+
-----
-  mvn clean package -P all
-----
-+
-The script to make release builds has been adapted to activate the
-`all` profile so that the plugin modules are always built for release
-builds.
-
-=== Mail
-
-* Add unified diff to newchange mail template
-+
-Add `$email.UnifiedDiff` as new macro to the `NewChange.vm` mail
-template. This macro is expanded to a unified diff of the patch.
-
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/config-gerrit.html#sendemail.includeDiff[
-  sendemail.includeDiff]: Enable `$email.UnifiedDiff` in `NewChange.vm`
-+
-Instead of making site administrators hack the email template, allow
-admins to enable the diff feature by setting a configuration variable
-in `gerrit.config`.
-
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/config-gerrit.html#sendemail.maximumDiffSize[
-  sendemail.maximumDiffSize]: Limit the size of diffs sent by email
-+
-If a unified diff included in an email will exceed the limit configured
-by the system administrator, only the affected file paths are listed in
-the email instead. This gives interested parties some context on the
-size and scope of the change, without killing their inbox.
-
-* Catch all exceptions when emailing change update
-
-* Allow unique from address generation
-+
-Allow the from email address to be a ParameterizedString that handles
-the `${userHash}` variable. The value of the variable is the md5 hash
-of the user name. This allows unique generation of email addresses, so
-GMAIL threads names of users in conversations correctly. For example,
-the from pattern for gerrit-review defined in the Gerrit configuration
-looks like this:
-+
-----
-  [sendemail]
-    from = ${user} <noreply-gerritcodereview+${userHash}@google.com>
-----
-
-* Show new change URLs in the body of the new change email
-+
-Some email clients hide the signature section of an email
-automatically.  If there are no reviewers listed on a new change,
-such as when a change is pushed over HTTP and a notification is
-automatically sent out to any subscribed watchers, the URL was
-hidden inside of the signature and not readily available.
-+
-Show the URL right away in the body.
-
-=== Miscellaneous
-* Back in-memory caches with Guava, disk caches with H2
-+
-Instead of using Ehcache for in-memory caches, use Guava. The Guava
-cache code has been more completely tested by Google in high load
-production environments, and it tends to have fewer bugs. It enables
-caches to be built at any time, rather than only at server startup.
-+
-By creating a Guava cache as soon as it is declared, rather than
-during the LifecycleListener.start() for the CachePool, we can promise
-any downstream consumer of the cache that the cache is ready to
-execute requests the moment it is supplied by Guice. This fixes a
-startup ordering problem in the GroupCache and the ProjectCache, where
-code wants to use one of these caches during startup to resolve a
-group or project by name.
-+
-Tracking the Guava backend caches with a DynamicMap makes it possible
-for plugins to define their own in-memory caches using CacheModule's
-cache() function to declare the cache. It allows the core server to
-make the cache available to administrators over SSH with the gerrit
-show-caches and gerrit `flush-caches` commands.
-+
-Persistent caches store in a private H2 database per cache, with a
-simple one-table schema that stores each entry in a table row as a
-pair of serialized objects (key and value). Database reads are gated
-by a BloomFilter, to reduce the number of calls made to H2 during
-cache misses. In theory less than 3% of cache misses will reach H2 and
-find nothing. Stores happen on a background thread quickly after the
-put is made to the cache, reducing the risk that a diff or web_session
-record is lost during an ungraceful shutdown.
-+
-Cache databases are capped around 128M worth of stored data by running
-a prune cycle each day at 1 AM local server time. Records are removed
-from the database by ordering on the last access time, where last
-accessed is the last time the record was moved from disk to memory.
-
-* Add OpenID SSO support.
-+
-Setting `OPENID_SSO` for
-link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/config-gerrit.html#auth.type[`auth.type`] in the
-`gerrit.config` will allow the admin to specify an SSO entry point URL
-so that users clicking on "Sign In" are sent directly to that URL.
-
-* Git over HTTP BasicAuth against Gerrit basic auth.
-+
-Allows the configuration of native Gerrit username/password
-authentication scheme used for Git over HTTP BasicAuth, as alternative
-of the default DigestAuth scheme against the random generated password
-on Gerrit DB.
-+
-Example setting for link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/config-gerrit.html#auth.type[
-`auth.type`] and link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/config-gerrit.html#auth.gitBasicAuth[
-`auth.gitBasicAuth`]:
-+
-----
-  [auth]
-    type = LDAP
-    gitBasicAuth = true
-----
-+
-With this configuration Git over HTTP protocol will be authenticated
-using `HTTP-BasicAuth` and credentials checked on LDAP.
-
-* Abstract group systems into GroupBackend interface
-+
-Group backends are supposed to use unique prefixes to isolate the
-namespaces. E.g. the group backend for LDAP is using `ldap/` as prefix
-for the group names.
-+
-This means that to refer to an LDAP group in the WebUI the group name
-needs to be prefixed with the `ldap/` string. E.g. if there is a group
-in LDAP which is called "Developers", Gerrit will suggest this group
-when the user types `ldap/De`.
-+
-WARNING: External groups are not anymore allowed to be members of
-internal groups.
-
-[[migrate-ldap-groups]]
-* Migrate existing internal LDAP groups
-+
-Previously, LDAP groups were mirrored in the AccountGroup table and
-given an Id and UUID the same as internal groups. Update these groups
-to be backed by only a GroupReference, with a special "ldap:" UUID
-prefix. Migrate all existing references to the UUID in ownerGroupUUID
-and any `project.config`.
-+
-This made the LDAP group type obsolete and it was removed.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=548[issue 548]:
-  Make commands to download patch sets
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/config-gerrit.html#download.command[configurable]
-+
-For patch sets on the ChangeScreen different commands for downloading
-the patch sets are offered. For some installations not all commands are
-needed. Allow Gerrit administrators to configure which download
-commands should be offered.
-
-* Add more link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/config-gerrit.html#theme[theme color
-  options]
-+
-** Add a theme option to change outdated background color
-** Add odd/even row background color for tables such as list of open
-reviews.  This makes them more visible without clicking on them.
-
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/user-notify.html[Add `notify` section in
-  `project.config`]
-+
-The notify section allows project owners to include emails to users
-directly from `project.config`. This removes the need to create fake
-user accounts to always BCC a group mailing list.
-
-* Include the contributor agreements in the `project.config` and
-  migrate contributor agreements to `All-Projects`
-+
-Update the parsing of `project.config` to support the contributor
-agreements.
-+
-Add a new schema to move the ContributorAgreement, AccountAgreement,
-and AccountGroupAgreement information into the `All-Projects`
-`project.config`.
-
-* Add `sameGroupVisibility` to `All-Projects` `project.config`
-+
-The `sameGroupVisiblity` is needed to restrict the visibility of
-accounts when `accountVisibility` is `SAME_GROUP`. Namely, this is a
-way to make sure the `autoVerify` group in a `contributor-agreements`
-section is never suggested.
-
-* Add change topic in hook arguments
-+
-It was not possible for hook scripts to include topic-specific
-behavior because the topic name was not included in the arguments.
-
-* Add `--is-draft` argument on `patchset-created` hook
-+
-The `--is-draft` argument will be passed with either `true` if
-the patchset is a draft, or `false` otherwise.
-+
-This can be used by hooks that need to behave differently if the
-change is a draft.
-
-* Log sign in failures on info level
-+
-If for a user signing in into the Gerrit web UI fails, this can have
-many reasons, e.g. username is wrong, password is wrong, user is marked
-as inactive, user is locked in the user backend etc. In all cases the
-user just gets a generic error message 'Incorrect username or
-password.'. Gerrit administrators had trouble to find the exact reason
-for the sign in problem because the corresponding AccountException was
-not logged.
-
-* Do not log 'Object too large' as error with full stacktrace
-+
-If a user pushes an object which is larger than the configured
-`receive.maxObjectSizeLimit` parameter, the push is rejected with an
-'Object too large' error. In addition an error log entry with the full
-stacktrace was written into the error log.
-+
-This is not really a server error, but just a user doing something that
-is not allowed, and thus it should not be logged as error. For a Gerrit
-administrator it might still be interesting how often the limit is hit.
-This is why it makes sense to still log this on info level.
-+
-For the user pushing a too large object we now do not print the
-'fatal: Unpack error, check server log' message anymore, but only the
-'Object too large' error message.
-
-* Add better explanations to rejection messages
-+
-Provide information to the user why a certain push was rejected.
-
-* Automatic schema upgrade on Gerrit startup
-+
-In case when Gerrit administrator(s) don't have a direct access to the
-file system where the review site is located it gets difficult to
-perform a schema upgrade (run the init program). For such cases it is
-convenient if Gerrit performs schema upgrade automatically on its
-startup.
-+
-Since this is a potentially dangerous operation, by default it will not
-be performed. The configuration parameter
-link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/config-gerrit.html#site.upgradeSchemaOnStartup[
-site.upgradeSchemaOnStartup] is used to switch on automatic schema
-upgrade.
-
-* Shorten column names that are longer than 30 characters
-+
-Some databases can't deal with column names that are longer than 30
-characters. Examples are MaxDB and
-link:http://groups.google.com/group/repo-discuss/browse_thread/thread/ecb713d42c04ae8a/cc963525d8247a17?lnk=gst#cc963525d8247a17[Oracle].
-+
-Gerrit had two column names in the `accounts` table that exceeded the
-30 characters: `displayPatchSetsInReverseOrder`,
-`displayPersonNameInReviewCategory`
-+
-These 2 columns were renamed so that their names fit within the 30
-character range.
-
-* Increase the maximum length for tracking ID's to 32 characters
-+
-So far tracking ID's had a maximum length of only 20 characters.
-
-* Set `GERRIT_SITE` in Gerrit hooks as environment variable
-+
-Allows development of hooks parameterized on Gerrit location. This can
-be useful to allow hooks to load the Gerrit configuration when needed
-(from `$GERRIT_SITE`) or even store their additional config files under
-`$GERRIT_SITE/etc` and retrieve them at startup.
-
-* Add an exponentially rolling garbage collection script
-+
-`git-exproll.sh` is a git garbage collection script aimed specifically
-at reducing excessive garbage collection and particularly large
-packfile churn for Gerrit installations.
-+
-Excessive garbage collection on "dormant" repos is wasteful of both CPU
-and disk IO.  Large packfile churn can lead to heavy RAM and FS usage
-on Gerrit servers when the Gerrit process continues to hold open the
-old delete packfiles.  This situation is most detrimental when jgit is
-configured with large caching parameters.  Aside from these downsides,
-running git gc often can be very beneficial to performance on servers.
-This script attempts to implement a git gc policy which avoids the
-downsides mentioned above so that git gc can be comfortably run very
-regularly.
-+
-`git-exproll.sh` uses keep files to manage which files will get
-repacked.  It also uses timestamps on the repos to detect dormant repos
-to avoid repacking them at all.  The primary packfile objective is to
-keep around a series of packfiles with sizes spaced out exponentially
-from each other, and to roll smaller packfiles into larger ones once
-the smaller ones have grown.  This strategy attempts to balance disk
-space usage with avoiding rewriting large packfiles most of the time.
-+
-The exponential packing objective above does not save a large amount of
-time or CPU, but it does prevent the packfile churn.  Depending on repo
-usage, however the dormant repo detection and avoidance can result in a
-very large time savings.
-
-* Automatically flush persistent H2 cache if the existing cache entries
-  are incompatible with the cache entry class and thus can't be
-  deserialized
-
-* Unpack JARs for running servers in `$site_path/tmp`
-+
-Instead of unpacking a running server into `~/.gerritcodereview/tmp`
-only use that location for commands like init where there is no active
-site. From gerrit.sh always use `$site_path/tmp` for the JARs to
-isolate servers that run on the same host under the same UNIX user
-account.
-
-[[custom-extension]]
-* Allow for the `CUSTOM_EXTENSION` `auth.type` to configure URLs for
-  editing the user name and obtaining an HTTP password
-+
-Allow `CUSTOM_EXTENSION` auth type to supply by `auth.editFullNameUrl`
-a URL in the web UI that links users to the other account system,
-where they can edit their name, and then use another reload URL to
-cycle through the `/login/` step and refresh the data cached by Gerrit.
-+
-Allow `CUSTOM_EXTENSION` auth type to supply by `auth.httpPasswordUrl`
-a URL in the web UI that allows users to obtain an HTTP password.
-+
-Like the rest of the `CUSTOM_EXTENSION` stuff, this is hack that will
-eventually go away when there is proper support for authentication
-plugins.
-
-=== Performance
-[[performance-issue-on-showing-group-list]]
-* Fix performance issues on showing the list of groups in the Gerrit
-  WebUI
-+
-Loading `Admin` > `Groups` on large servers was very slow. The entire
-group membership database was downloaded to the browser when showing
-just the list of groups.
-+
-Now the amount of data that needs to be downloaded to the browser is
-reduced by using the more lightweight `AccountGroup` type instead of
-the `GroupDetail` type when showing the groups in a list format. As a
-consequence the `Owners` column that showed the name of the owner group
-had been dropped.
-
-* Add LDAP-cache to minimize number of queries when unnesting groups
-+
-A new cache named "ldap_groups_byinclude" is introduced to help lessen
-the number of queries needed to resolve nested LDAP-groups.
-
-* Add index for accessing change messages by patch set
-+
-This improves the performance of loading the dashboards.
-
-* Add a fast path to avoid checking every commit on push
-+
-If a user can forge author, committer and gerrit server identity, and
-can upload merges, don't bother checking the commit history of what is
-being uploaded. This can save time on servers that are trying to accept
-a large project import using the push permission.
-
-* Improve performance of `ReceiveCommits` by reducing `RevWalk` load
-+
-JGit RevWalk does not perform well when a large number of objects are
-added to the start set by `markStart` or `markUninteresting`. Avoid
-putting existing `refs/changes/` or `refs/tags/` into the `RevWalk` and
-instead use only the `refs/heads` namespace and the name of the branch
-used in the `refs/for/` push line.
-+
-Catch existing changes by looking for their exact commit SHA-1, rather
-than complete ancestry. This should have roughly the same outcome for
-anyone pushing a new commit on top of an existing open change, but
-with lower computational cost at the server.
-
-* Lookup changes in parallel during `ReceiveCommits`
-+
-If the database has high query latency, the loop that locates existing
-changes on the destination branch given Change-Id can be slow. Start
-all of the queries as commits are discovered, but don't block on
-results until all queries were started.
-+
-If the database can build the `ResultSet` in the background, this may
-hide some of the query latency by allowing the queries to overlap when
-more than one lookup must be performed for a push.
-
-* Perform change update on multiple threads
-+
-When multiple changes need to be created or updated for a single push
-operation they are now inserted into the database by parallel threads,
-up to the maximum allowed thread count. The current thread is used
-when the thread pool is already fully in use, falling back to the
-prior behavior where each concurrent push operation can do its own
-concurrent database update. The thread pool exists to reduce latency
-so long as there are sufficient threads available.
-+
-This helps push times on databases that are high latency, such as
-database servers that are running on a different machine from the
-Gerrit server itself, e.g. gerrit.googlesource.com.
-+
-The new thread pool is
-link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/config-gerrit.html#receive.changeUpdateThreads[
-disabled by default], limiting the overhead to servers that have good
-latency with their database, such as using in-process H2 database, or
-a MySQL or PostgreSQL on the same host.
-
-* Use `BatchRefUpdate` to execute reference changes
-+
-Some storage backends for JGit are able to update multiple references
-in a single pass efficiently. Take advantage of this by pushing
-any normal reference updates (such as direct push or branch create)
-into a single `BatchRefUpdate` object.
-
-* Assume labels are correct in ListChanges
-+
-To reduce end-user latency when displaying changes in a search result
-or user dashboard, assume the labels are accurate in the database at
-display time and don't recompute the access privileges of a reviewer.
-
-* Notify the cache that the git_tags was modified
-+
-The tag cache was updated in-place, which prevented the H2 based
-storage from writing out the updated tag information. This meant
-servers almost never had the right data stored on disk and had to
-recompute it at startup.
-+
-Anytime the value is now modified in place, put it back into the
-cache so it can be saved for use on the next startup.
-
-* Special case hiding `refs/meta/config` from Git clients
-+
-VisibleRefFilter requires a lot of server CPU to accurately provide
-the correct listing to clients when they cannot read `refs/*`.
-+
-Since the default configuration is now to link:#hide-config[
-hide `refs/meta/config`], use a special case in VisibleRefFilter that
-permits showing every reference except `refs/meta/config` if a user can
-read every other reference in the repository.
-
-* Avoid second remote call to lookup approvals when loading change
-  results
-+
-By using the new link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/rest-api-changes.html[`/changes/`]
-REST endpoint the web UI client now obtains the label information
-during the query and avoids a second round trip to lookup the current
-approvals for each displayed change. For most users this should improve
-the way the page renders. The verified and code review columns will be
-populated before the table is made visible, preventing the layout from
-"jumping" the way the old UI did when the 2nd RPC finally finished and
-supplied the label data.
-
-* Load patch set approvals in parallel
-+
-ResultSet is a future-like interface, the database system is free to
-execute each result set asynchronously in the background if it
-supports that. gwtorm's default SQL backend always runs queries
-immediately and then returns a ListResultSet, so for most installs this
-has no real impact in ordering.
-+
-For the system that runs gerrit-review, each query has a high cost in
-network latency, the system treats ResultSet as a future promise to
-supply the matching rows. Getting all of the necessary ResultSets up
-front allows the database to send all requests to the backend as early
-as possible, allowing the network latency to overlap.
-
-== Upgrades
-* Update Gson to 2.1
-* Update GWT to 2.4.0
-* Update JGit to 2.0.0.201206130900-r.23-gb3dbf19
-
-* Use gwtexpui 1.2.6
-+
-** Hide superfluous status text from clippy flash widget
-** Fix disappearance of text in CopyableLabel when clicking on it
-
-* Update Guava to 12.0.1
-+
-This fixes a performance problem with LoadingCache where the cache's
-inner table did not dynamically resize to handle a larger number
-of cached items, causing O(N) lookup performance for most objects.
-
-== Bug Fixes
-
-=== Security
-* Ensure that only administrators can change the global capabilities
-+
-Only Gerrit server administrators (members of the groups that have
-the `administrateServer` capability) should be able to edit the
-global capabilities because being able to edit the global capabilities
-means being able to assign the `administrateServer` capability.
-+
-Because of this on the `All-Projects` project it is disallowed to assign
-+
-. the `owner` access rights on `refs/*`
-+
-Project owners (members of groups to which the `owner` access right
-is assigned) are able to edit the access control list of the projects
-they own. Hence being owner of the `All-Projects` project would allow
-to edit the global capabilities and assign the `administrateServer`
-capability without being Gerrit administrator.
-+
-In earlier Gerrit versions (2.1.x) it was already implemented like
-this but the corresponding checks got lost.
-+
-. the 'push' access right on `refs/meta/config`
-+
-Being able to push configuration changes to the `All-Projects` project
-allows to edit the global capabilities and hence a user with this
-access right could assign the `administrateServer` capability without
-being Gerrit administrator.
-+
-From the Gerrit WebUI (ProjectAccessScreen) it is not possible anymore
-to assign on the `All-Projects` project the `owner` access right on
-`refs/*` and the `push` access right on `refs/meta/config`.
-+
-In addition it is ensured that an `owner` access right that is assigned
-for `refs/*` on the `All-Projects` project has no effect and that only
-Gerrit administrators with the `push` access right can push
-configuration changes to the `All-Projects` project.
-+
-It is still possible to assign both access rights (`owner` on `refs/*`
-and `push` on `refs/meta/config`) on the `All-Projects` project by directly
-editing its `project.config` file and pushing to `refs/meta/config`.
-To fix this it would be needed to reject assigning these access rights
-on the `All-Projects` project as invalid configuration, however doing this
-would mean to break existing configurations of the `All-Projects` project
-that assign these access rights. At the moment there is no migration
-framework in place that would allow to migrate `project.config` files.
-Hence this check is currently not done and these access rights in this
-case have simply no effect.
-
-=== Web
-
-* Do not show "Session cookie not available" on sign in
-+
-When LDAP is used for authentication, clicking on the 'Sign In' link
-opens a user/password dialog. In this dialog the "Session cookie not
-available." message was always shown as warning. This warning was
-pretty useless since the user was about to sign in because he had no
-current session.
-+
-This problem was discussed on the
-link:https://groups.google.com/forum/#!topic/repo-discuss/j-t77m8-7I0/discussion[
-Gerrit mailing list].
-
-* Reject restoring a change if its destination branch does not exist
-  anymore
-
-* Reject submitting a change if its destination branch does not exist
-  anymore
-+
-If a branch got deleted and there was an open change for this branch,
-it was still possible to submit this open change. As result the
-destination branch was implicitly recreated, even if the user
-submitting the change had no privileges to create branches.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=1352[issue 1352]:
-  Don't display "Download" link for `/COMMIT_MSG`
-+
-The commit message file is special, it doesn't actually exist and
-cannot be downloaded. Don't offer the download link in the side by
-side viewer.
-
-* Dependencies were lost in the ChangeScreen's "Needed By" table
-+
-Older patchsets are now iterated for descendants, so that the dependency
-chain does not break on new upstream patchsets.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=1442[issue 1442]:
-  Only show draft change dependency if current user is owner or reviewer
-+
-In the change screen, the dependencies panel was showing draft changes
-in the "Depends On" and "Needed By" lists for all users, and when there
-was no user logged in.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=1558[issue 1558]:
-  Create a draft patch set when a draft patch set is rebased
-+
-Rebasing a draft patch set created a non-draft patch set. It was
-unexpected that rebasing a draft patch set published the modifications
-done in the draft patch set.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=1176[issue 1176]:
-  Fix disappearance of download command in Firefox
-+
-Clicking on the download command for a patch set in Firefox made the
-download command disappear.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=1587[issue 1587]:
-  Fix disappearance of action buttons when selecting the last patch set
-  as `Old Version History`
-
-* Fix updating patch list when `Old Version History` is changed
-+
-If a collapsed patch set panel was expanded and re-closed it's patch
-list wasn't updated anymore when the selection for `Old Version History`
-was changed.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=1523[issue 1523]:
-  Update diff base to match old version history
-+
-When changing the diff base in the `Old Version History` on the change
-screen and then entering the Side-By-Side view for a file, clicking on
-the back button in the browser (reentering the change screen) was
-causing the files to be wrongly compared with `Base` again.
-
-* Don't NPE if current patch set is not available
-+
-Broken changes may have the current patch set field incorrectly
-specified, causing currentPatchSet to be unable to locate the
-correct data and return it. When this happens don't NPE, just
-claim the change is not reviewed.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1555[issue 1555]:
-  Fix displaying of file diff if draft patch has been deleted
-+
-Displaying any file diff for a patch set failed if the change had any
-gaps in its patch set history. Patch sets can be missing, if they
-have been drafts and were deleted.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=856[issue 856]:
-  Fix displaying of comments on deleted files
-+
-Published and draft comments that are posted on deleted files were not
-loaded and displayed.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=735[issue 735]:
-  Fix `ArrayIndexOutOfBoundsException` on navigation to next/previous
-  patch
-+
-An `ArrayIndexOutOfBoundsException` could occur when navigating from
-one patch to the next/previous patch if the next/previous patch was a
-newly added binary file. The exception occurred if the user was not
-signed in or if the user was signed in and had `Syntax Coloring` in the
-preferences enabled.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=816[issue 816]:
-  Fix wrong file indention in Side-by-Sie diff viewer on right side
-
-* Only set reviewed attribute on open changes
-+
-If a change is merged or abandoned, do not consider the reviewed
-property for the calling user, so that the change is not highlighted
-as unreviewed on the user's dashboard.
-
-* Change PatchTable pointer when loading patch
-+
-This patch fixes an issue with the "file list" table displayed by
-clicking on the "Files" sub-menu when viewing a diff.
-+
-Originally when navigating between patch screens the highlighted row
-(pointer) of the file list table would not change when not directly
-interacting with the table e.g. by clicking on the previous or next
-file link.
-+
-This patch updates the file list table whenever a new patch screen is loaded
-so that the pointer corresponds to the current patch being displayed.
-
-* Don't hyperlink non-internal groups
-+
-When an external group (such as LDAP) is used in a permission rule,
-don't attempt to link to the group in the internal account system UI.
-The group won't load successfully. Instead just display the name and
-put the UUID into a tooltip to show the full DN.
-
-* Fix: Popup jumps back to original position when resizing screen
-+
-On 'Watched Projects' screen, the 'Browse' button displays a popup
-window. If the user moves it and then resizes the screen, it won't snap
-back to the original position.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=1457[issue 1457]:
-  Prevent groups from being renamed to empty string
-
-* Fixed AccountGroupInfoScreen search callback
-+
-If the search returned no results, the search button would not be
-enabled and the status panel was not shown. Fixed the panel and button
-to always be enabled.
-
-* Fix NullPointerException on `/p/`
-+
-Requesting just `/p/` caused a NullPointerException as the redirection
-logic had no project name to form a URL from. Detect requests for `/p/`
-and redirect to 'Admin' > 'Projects' to show the projects the caller
-has access to.
-
-=== Mail
-
-* Fix: Rebase did not mail all reviewers
-
-* Fix email showing in AccountLink instead of names
-+
-Prefer the full name for the display text of the link.
-
-* Fix signature delimiter for e-mail messages
-+
-Make sure the signature delimiter is "-- " (two dashes and a space).
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=1397[issue 1397]:
-  Don't wait for banner message from SMTP server after STARTTLS
-  negotiation
-+
-According to RFC 2847 section 5.2, SMTP server won't send the banner
-message again after STARTTLS negotiation. The original code will hang
-until SMTP server kicks it off due to timeout and can't send email with
-STARTTLS enabled, aka. `sendemail.smtpEncryption = tls`.
-
-* Extract all mail templates during site init
-+
-The example mail templates `RebasedPatchSet.vm`, `Restored.vm` and
-`Reverted.vm` were not extracted during the initialization of a new
-site.
-
-=== SSH
-* Fix reject message if bypassing code review is not allowed
-+
-If a user is not allowed to bypass code review, but tries to push a
-commit directly, Gerrit rejected this push with the error message
-"can not update the reference as a fast forward". This message was
-confusing to the user since the push only failed due to missing
-access rights. Go back to the old message that says "prohibited
-by Gerrit".
-
-* Fix reject message if pushing tag is rejected because tagger is
-  somebody else
-+
-Pushing a tag that has somebody else as tagger requires the `Forge
-Committer` access right. If this access right was missing Gerrit
-was rejecting the push with "can not create new references". This error
-message was misleading because the user may have thought that the
-`Create Reference` access right was missing which was actually assigned.
-+
-The same reject message was also returned on push of an annotated tag
-if the `Push Annotated Tag` access right was missing. Also in this case
-the error message was not ideal.
-+
-Go back to the old more generic message which says `prohibited by
-Gerrit`.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=1437[issue 1437]:
-  Send event to stream when draft change is published
-+
-When a change is uploaded as a draft, a `patchset-created` event is
-sent to the event stream, but since drafts are private to the owner,
-the event is not publicly visible.  When the draft is later published,
-no publicly visible event was sent. As result of this external tools
-that rely on the event stream to detect new changes didn't receive
-events for any changes that were first uploaded as draft.
-+
-There is now a new event, `draft-published`, which is sent to the
-event stream when a draft change is published.  The content of this
-event is the same as `patchset-created`.
-
-* Fix: Wrong ps/rev in `change-merged` stream-event
-+
-When using cherry-pick as merge strategy, the wrong ref was set in the
-`change-merged` stream-event.
-+
-The issue stems from Gerrit would not acknowledge the resulting new
-pachset (the actual cherry-pick).
-
-* Fix NullPointerException in `query` SSH command
-+
-Running the `query` SSH command with the options `--comments` and
-`--format=JSON` failed with a NullPointerException if a change had a
-message without author. Change messages have no author if they were
-created by Gerrit. For such messages now the Gerrit Server identity is
-returned as author.
-
-* Fix the `export-review-notes` command's Guice bindings
-+
-The `export-review-notes` command was broken because of the CachePool
-class being bound twice. The startup of the command failed because of
-that.
-
-* Fix sorting of SSH help text
-+
-Commands were displaying in random order, sort commands before output.
-
-* `replicate` command: Do not log errors for wrong user input
-+
-If the user provided an invalid combination of command options or an
-non existing project name this was logged in the `error.log` but
-printing the error out to the user is sufficient.
-
-=== Authentication
-
-* Fix NPE in LdapRealm caused by non-LDAP users
-+
-Servers that are connected to LDAP but have non-LDAP user accounts
-created by `gerrit create-account` (e.g. batch role accounts for
-build systems) were crashing with a NullPointerException when the
-LdapRealm tried to discover which LDAP groups the non-LDAP user
-was a member of in the directory.
-
-* Fix domain field of HTTP digest authentication
-+
-Per RFC 2617 the domain field is optional. If it is not present,
-the digest token is valid on any URL on the server. When set it
-must be a path prefix describing the URLs that the password would
-be valid against.
-+
-When a canonical URL is known, supply that as the only domain that
-is valid. When the URL is missing (e.g. because the provider is
-still broken) rely on the context path of the application instead.
-
-=== Replication
-
-* Fix inconsistent behavior when replicating `refs/meta/config`
-+
-In `replication.config`, if `authGroup` is set to be used together with
-`mirror = true`, refs blocked through the `authGroup` are deleted from
-the slave/mirror. The same correctly applies if the `authGroup` is used
-to block `refs/meta/config`.
-+
-However, if `replicatePermission` was set to `false`, Gerrit was
-refusing to clean up `refs/meta/config` on the slave/mirror.
-
-* Fix bug with member assignment order in PushReplication.
-+
-The groupCache was being used before it was set in the class. Fix the
-ordering of the assignment.
-
-=== Approval Categories
-
-* Make `NoBlock` and `NoOp` approval category functions work
-+
-The approval category functions `NoBlock` and `NoOp` have not worked
-since the integration of Prolog.
-+
-`MAY` was introduced as a new submit record status to complement `OK`,
-`REJECT`, `NEED`, and `IMPOSSIBLE`. This allows the expression of
-approval categories (labels) that are optional, i.e. could either be
-set or unset without ever influencing whether the change could be
-submitted. Previously there was no way to express this property in
-the submit record.
-+
-This enables the `NoBlock` and `NoOp` approval category functions to
-work as they now emit may() terms from the Prolog rules. Previously
-they returned ok() terms lacking a nested user term, leading to
-exceptions in code that expected a user context if the label was `OK`.
-
-* Fix category block status without negative score
-+
-Categories without blocking or approval scores will result in the
-blocking/approved image appearing in the category column after changes
-are merged should the score by the reviewer match the minimum or
-maximum value respectively.
-+
-A check to ignore "No Score" values of 0 was added.
-
-* Don't remove dashes from approval category name
-+
-If an approval category name contained a dash, it was removed by
-Gerrit. On the other side a space in an approval category name is
-converted to a dash. This was confusing for writing Prolog submit
-rules. If, for example, one defined a new category named `X-Y`, then in
-the Prolog code the proper name for that category would have been `XY`
-which was unintuitive.
-
-* Fix NPE in `PRED__load_commit_labels_1`
-+
-If a change query uses reviewer information and loads the approvals
-map, but there are no approvals for a given patch set available, the
-collection came out null, which cannot be iterated. Make it always be
-an empty list.
-
-=== Other
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=1554[issue 1554]:
-  Fix cloning of new projects from slave servers
-+
-If a new project is created in Gerrit the replication creates the
-repository for this new project directly in the filesystem of the slave
-server. The slave server was not discovering this new repository and as
-result any attempt to clone the corresponding project from the slave
-server failed.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=1548[issue 1548]:
-  Create a ref for the patch set that is created when a change is
-  cherry-picked and trigger the replication for it:
-+
-If Cherry Pick is chosen as submit type, on submit a new commit is
-created by the cherry-pick. For this commit a new patch set is created
-which is added to the change. Using any of the download commands to
-fetch this new patch set failed with 'Couldn't find remote ref' because
-no ref for the new patch set was created.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=1626[issue 1626]:
-  Fix NullPointerException on cherry-pick if `changeMerge.test` is enabled
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=1491[issue 1491]:
-  Fix nested submodule updates
-
-* Set link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/config-gerrit.html#transfer.timeout[transfer
-  timeout] for pushes through HTTP
-+
-The transfer timeout was only set when pushing via SSH.
-
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.5/config-gerrit.html#receive.maxObjectSizeLimit[
-  Limit maximum Git object size] when pushing through HTTP
-+
-The limit for the maximum object size was only set when pushing via SSH.
-
-* Fix units of `httpd.maxwait`
-+
-The default unit here is minutes, but Jetty wants to get milliseconds
-from the maxWait field. Convert the minutes returned by getTimeUnit to
-be milliseconds, matching what Jetty expects.
-+
-This should resolve a large number of 503 errors for Git over HTTP.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=1493[issue 1493]:
-  Fix wrong "change ... closed" message on direct push
-+
-Pushing a commit directly into the central repository with bypassing
-code review wrongly resulted in a "change ... closed" message if the
-commit was already pushed for review and if a Change-Id was included in
-the commit message. Despite of the error message the push succeeded and
-the corresponding change got closed. Now the message is not printed
-anymore.
-
-* Fix NPE that can hide guice CreationException on site init
-+
-Note that the `--show-stack-trace` option is needed to print the stack
-trace when a program stops with a Die exception.
-
-* Do not automatically add author/committer as reviewer to drafts
-
-* Do not automatically add reviewers from footer lines to drafts
-
-* Fix NullPointerException in MergeOp
-+
-The body of the commit object may have been discarded earlier to
-save memory, so ensure it exists before asking for the author.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=1396[issue 1396]:
-  Initialize the submodule commit message buffer
-
-* Fix file name matching in `commit_delta` to perform substring
-  matching
-+
-The `commit_delta` predicate was matching the entire file name against
-the given regular expression while other predicates (`commit_edits`,
-`commit_message_matches`) performed substring matching. It was
-inconsistent that for `commit_delta` it was needed to write something
-like:
-+
-----
-  commit_delta('.*\.java')
-----
-+
-to match all `*.java` files, while for `commit_edits` it was:
-+
-----
-  commit_edits('\.java$', '...')
-----
-+
-to match the same set of (Java) files.
-
-* Create index for submodule subscriptions on site upgrade
-
-* Fix URL to Jetty XML DTDs so they can be properly validated
-
-* Fix resource leak when `changeMerge.test` is `true`
-
-* Fix possible synchronization issue in TaskThunk
-
-* Fix possible NPEs in `ReplaceRequest.cmd` usage in `ReceiveCommits`
-+
-The `cmd` field is populated by `validate(boolean)`. If this method
-fails, results on some `ReplaceRequests` may not be set. Guard the
-attempt to access the field with a null check.
-
-* Match no labels if current patch set is not available
-+
-If the current patch set cannot be loaded from `ChangeData`, assume no
-label information. This works around an NullPointerException inside of
-`ChangeControl` where the `PatchSet` is otherwise required.
-
-* Create new patch set references before database records
-+
-Ensure the commit used by a new change or replacement patch set
-always exists in the Git repository by writing the reference first
-as part of the overall `BatchRefUpdate`, then inserting the database
-records if all of the references stored successfully.
-
-* Fix rebase patch set and revert change to update Git first
-+
-Update the Git reference before writing to the database. This way the
-repository cannot be corrupted if the server goes down between the two
-actions.
-
-* Make sure we use only one type of NoteMerger for review notes creation
-
-* Fix generation of owner group in GroupDetail
-+
-Set the GroupDetail.ownerGroup to the AccountGroup.ownerGroupUUID
-instead of the groupUUID.
-
-* Ensure that ObjectOutputStream in H2CacheImpl is closed
-
-* Ensure that RevWalk in SubmoduleOp is released
diff --git a/ReleaseNotes/ReleaseNotes-2.6.1.txt b/ReleaseNotes/ReleaseNotes-2.6.1.txt
deleted file mode 100644
index 94de483..0000000
--- a/ReleaseNotes/ReleaseNotes-2.6.1.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-= Release notes for Gerrit 2.6.1
-
-There are no schema changes from link:ReleaseNotes-2.6.html[2.6].
-
-link:https://www.gerritcodereview.com/download/gerrit-2.6.1.war[https://www.gerritcodereview.com/download/gerrit-2.6.1.war]
-
-== Bug Fixes
-* Patch JGit security hole
-+
-The security hole may permit a modified Git client to gain access
-to hidden or deleted branches if the user has read permission on
-at least one branch in the repository. Access requires knowing a
-SHA-1 to request, which may be discovered out-of-band from an issue
-tracker or gitweb instance.
diff --git a/ReleaseNotes/ReleaseNotes-2.6.txt b/ReleaseNotes/ReleaseNotes-2.6.txt
deleted file mode 100644
index 26b0b0e..0000000
--- a/ReleaseNotes/ReleaseNotes-2.6.txt
+++ /dev/null
@@ -1,1738 +0,0 @@
-= Release notes for Gerrit 2.6
-
-Gerrit 2.6 is now available:
-
-link:https://www.gerritcodereview.com/download/gerrit-2.6.war[https://www.gerritcodereview.com/download/gerrit-2.6.war]
-
-Gerrit 2.6 includes the bug fixes done with
-link:ReleaseNotes-2.5.1.html[Gerrit 2.5.1],
-link:ReleaseNotes-2.5.2.html[Gerrit 2.5.2],
-link:ReleaseNotes-2.5.3.html[Gerrit 2.5.3], and
-link:ReleaseNotes-2.5.4.html[Gerrit 2.5.4]. These bug fixes are *not*
-listed in these release notes.
-
-== Schema Change
-*WARNING:* This release contains schema changes.  To upgrade:
-----
-  java -jar gerrit.war init -d site_path
-----
-
-*WARNING:* Upgrading to 2.6.x requires the server be first upgraded to 2.1.7 (or
-a later 2.1.x version), and then to 2.6.x.  If you are upgrading from 2.2.x.x or
-newer, you may ignore this warning and upgrade directly to 2.6.x.
-
-== Reverse Proxy Configuration Changes
-
-If you are running a reverse proxy in front of Gerrit (e.g. Apache or Nginx),
-make sure to check your configuration, especially if you are encountering
-'Page Not Found' errors when opening the change screen.
-See the link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/config-reverseproxy.html[
-Reverse Proxy Configuration] for details.
-
-Gerrit now requires passed URLs to be unchanged by the proxy.
-
-== Release Highlights
-* 42x improvement on `git clone` and `git fetch`
-+
-Running link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/cmd-gc.html[
-gerrit gc] allows JGit to optimize a repository to serve clone and fetch
-faster than C Git can, with massively lower server CPU required. Typically
-Gerrit 2.6 can completely transfer a project to a client faster than C Git
-can finish "Counting" the objects.
-
-* Completely customizable workflow
-+
-Individual projects can add (or remove) score categories through
-link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/config-labels.html[
-labels] and link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/prolog-cookbook.html[
-Prolog rules].
-
-== New Features
-
-=== Web UI
-
-==== Global
-
-* New Login Screens
-+
-New form based HTML screens for login allow browsers to offer the
-choice to save the login data locally in the user's password store.
-
-* Rename "Groups" top-level menu to "People"
-
-* Move "Draft Comments" link next to "Drafts" link
-
-* Highlight the active menu item
-
-* Move user info, settings, and logout to popup dialog
-
-* Show a small version of the avatar image next to the user's name.
-
-* Show avatar image in user info popup dialog
-
-* Always show 'Working ...' message
-+
-The 'Working ...' message is relatively positioned from the top of
-the browser, so that the message is always visible, even if the user
-has scrolled down the page.
-
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/config-gerrit.html#suggest.from[
-  suggest.from] configures a minimum number of characters before
-  matches for reviewers, accounts, groups or projects are offered.
-
-* Make the default font size "small".
-
-* Mark all CSS classes as external so users can rely on them.
-
-* Add a link to the REST API documentation in the top menu.
-
-==== Search
-* Suggest projects, groups and users in search panel
-+
-Suggest projects, groups and users in the search panel as parameter for
-those search operators that expect a project, group or user.
-
-* In search panel suggest 'self' as value for operators that expect a user
-
-* Quote values suggested for search operators only if needed
-+
-The values that are suggested for the search operators in the search
-panel are now only quoted if they contain a whitespace.
-
-==== Change Screens
-
-* A change's commit message can be edited from the change screen.
-
-* A change's topic can be added, removed or changed from the
-  change screen.
-
-* An "Add Comment" button is added to change screen
-
-* The reviewer matrix on a change displays gray boxes where permissions
-  do not allow voting in that category.
-+
-The coloring enables authors to quickly identify if another reviewer
-is necessary to continue the change.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=353[Issue 353] &
-  link:https://code.google.com/p/gerrit/issues/detail?id=1123[Issue 1123]:
-  New link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/project-setup.html#rebase_if_necessary[
-  Rebase If Necessary] submit type
-+
-This is similar to cherry pick, but honors change dependency
-information.
-
-* The rebase button is hidden when the patch set is current.
-
-* Improved review message when a change is rebased in the UI
-+
-When a change is rebased in the UI by pressing the rebase button, a
-comment is added onto the review. Instead of only saying 'Rebased' the
-message is now more verbose, e.g. 'Patch Set 1 was rebased'.
-
-* The submit type that is used for submitting a change is shown on the
-  change screen in the info block.
-+
-This is useful because the submit type of a change can now be
-link:#submit-type-from-prolog[controlled by Prolog].
-
-* Replace the All Diff buttons on the change screen with links
-+
-The action buttons to open the diff for all files in own tabs consumed
-too much space due to the long label texts.
-
-* The patch set review screen can include radio buttons for custom
-  labels if enabled by
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/prolog-cookbook.html#_how_to_write_submit_rules[submit rules].
-
-* Voting on draft changes is now possible.
-
-* Recommend rebase on Path Conflict.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1685[Issue 1685]:
-  After 'Up to change' expand the patch set that was just reviewed
-+
-After clicking on the 'Up to change' link on a patch screen, the patch
-set that was just reviewed is automatically expanded on the change
-screen.
-
-* Allow direct change URLs to end with '/'.
-
-* Slightly increase commit message text size from 8px to 9px.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1381[Issue 1381]:
-  Remove the ID column from change tables
-+
-Users don't really need the ID column present. For most changes the
-subject is descriptive and unique enough to identify the correct
-change.
-
-* Do not wrap project/branch/owner fields in change table.
-+
-This makes it easier to use Gerrit on narrow screens.
-
-* Rename "Old Version History" to "Reference Version".
-
-==== Patch Screens
-
-* Support for file comments
-+
-It is now possible to comment on a whole file in a patch.
-
-* Have the reviewed panel also at the bottom of the patch screen
-+
-Reviewers normally review patches top down, finishing the review when
-they reach the bottom of the patch. To use the streamlined review
-workflow they now don't need to scroll back to the top to find the
-reviewed checkbox and link.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1494[Issue 1494]:
-  Use mono-font for displaying the file contents
-+
-This avoids alignment errors when syntax highlighting is enabled.
-
-* Distinguish between error and timeout in intraline diff error message.
-
-* Enable expanding skipped lines even if 'Syntax Coloring' is off.
-
-==== Project Screens
-
-* Support filtering of projects in the project list screen
-+
-Filter matches are highlighted by bold printing.
-+
-The filter is reflected by the `filter` URL parameter.
-
-* Support filtering of projects in ProjectListPopup
-+
-Filter matches are highlighted by bold printing.
-
-* Display a query icon for each project in the project list screen that
-  links to the default query/dashboard of that project.
-
-* Replace projects side menus with top menus
-+
-The top menus are submenus to the Project Menu and they appear only
-when a project has been selected.
-
-* Remember the last Project Screen used
-+
-Remember the last project screen used every time a project screen is
-loaded. Go to the remembered screen when selecting a new project from
-the project list instead of always going to the project info screen.
-
-* Remember the last project viewed
-+
-Remember the last project viewed when navigating away from a project
-screen.  If there is a remembered project, then the extra project links
-are not hidden.
-
-* Add clone panel to the project general screen
-
-* New screen for listing and accessing the project dashboards.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1677[Issue 1677]:
-  Place the 'Browse' button to select a watched project next to input field
-
-* Ask user to login if project is not found
-+
-Accessing a project URL was failing with 'Not Found - The page you
-requested was not found, or you do not have permission to view this
-page' if the user was not signed in and the project was not visible to
-'Anonymous Users'. Instead Gerrit now asks the user to login and
-afterwards shows the project to the user if it exists and is visible.
-If the project doesn't exist or is not visible, the user will still get
-the Not Found screen after sign in.
-
-* Improve error handling on branch creation
-+
-Improve the error messages that are displayed in the WebUI if the
-creation of a branch fails due to invalid user input.
-
-==== Group Screens
-
-* Support filtering of groups in the group list screen
-+
-Filter matches are highlighted by bold printing.
-+
-The filter is reflected by the `filter` URL parameter.
-
-* Remove group type from group info screen
-+
-The information about the group type was not much helpful. All groups
-that can be seen in Gerrit are of type 'INTERNAL', except a few
-well-known system groups which are of type 'SYSTEM'. The system groups
-are so well-known that there is no need to display the type for them.
-
-==== Dashboard Screens
-
-* Link dashboard title to a URL version of itself
-+
-When using a stable project dashboard URL, the URL obfuscates the
-content of the dashboard which can make it hard to debug a dashboard or
-copy and modify it. In the special case of stable dashboards, make the
-title a link to an unstable URL version of the dashboard with the URL
-reflecting the actual dashboard contents the way a custom dashboard
-does.
-
-* Increase time span for "Recently Closed" section in user dashboard to 4 weeks.
-
-==== Account Screens
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1740[Issue 1740]:
-  Display description how to generate SSH Key in SshPanel
-+
-Display a description of how to generate an SSH Key in an expandable
-section in the SshPanel instead of linking to the GitHub SSH tutorial.
-The GitHub SSH tutorial was partially not relevant and confused users.
-
-* Make the text for "Register" customizable
-
-==== Plugin Screens
-
-* Show status for enabled plugins in the WebUI as 'Enabled'
-+
-Earlier no status was shown for enabled plugins, which was confusing to
-some users.
-
-=== REST API
-
-* A big chunk of the Gerrit functionality is now available via the
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/rest-api.html[REST API].
-+
-The REST API is *NOT* complete yet and some functionality is still missing.
-+
-To find out which functionality is available, check the REST endpoint documentation for
-link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/rest-api-projects.html[projects],
-link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/rest-api-changes.html[changes],
-link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/rest-api-groups.html[groups] and
-link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/rest-api-accounts.html[accounts].
-
-* Support setting `HEAD` of a project
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/rest-api-projects.html#set-head[via REST].
-
-* Audit support for REST API.
-+
-Allow generating Audit events related to REST API execution. The
-structure of the AuditEvent has been extended to support the new
-name-multivalue pairs used in the REST API.
-+
-This is breaking compatibility with the 2.5 API as it changes the
-params data type, this is needed anyway as the previous list of
-Objects was not providing all the necessary information of
-"what relates to what" in terms of parameters info.
-+
-Existing support for SSH and JSON-RPC events have been adapted in
-order to fit into the new name-multivalue syntax: this allow a
-generic audit plug-in to capture all parameters regardless of where
-they have been generated.
-
-* Remove support for deprecated `--format` option when listing changes
-+
-Querying changes via REST is now always producing JSON output.
-
-* Introduce `id` property on REST entities
-+
-The `/changes/` entities now use `id` to include a triplet of the
-project, branch and change-id string to uniquely identify that change
-on the server. This moves the old `id` field to be named `change_id`,
-which is a breaking change.
-
-* Accept common forms of malformed JSON
-+
-Some clients may send JSON-ish instead of JSON. Be nice to those
-clients and accept various useful forms of incorrect syntax:
-+
-** End of line comments starting with `//` or `#` and ending with a
-   newline character.
-** C-style comments starting with `/*` and ending with `*/`
-   Such comments may not be nested.
-** Names that are unquoted or single quoted.
-** Strings that are unquoted or single quoted.
-** Array elements separated by `;` instead of `,`.
-** Unnecessary array separators. These are interpreted as if null was
-   the omitted value.
-** Names and values separated by `=` or `=>` instead of `:`.
-** Name/value pairs separated by `;` instead of `,`.
-
-* Be more liberal about parsing JSON responses
-+
-If the response begins with the JSON magic string, remove it before
-parsing. If a response is missing this leading string, parse the
-response as-is.
-
-* Accept simple form encoded data for REST APIs
-+
-Simple cases like `/review` or `/abandon` can now accept standard form
-values for basic properties, making it simple for tools to directly
-post data:
-+
-----
-  curl -n --digest \
-  --data 'message=Does not compile.' \
-  --data labels.Verified=-1 \
-  http://localhost:8080/a/changes/3/revisions/1/review
-----
-+
-Form field names are JSON field names in the top level object.  If dot
-appears in the name the part to the left is taken as the JSON field
-name and the part to the right as the key for a Map. This nicely fits
-with the labels structure used by `/review`, but doesn't support the
-much more complex inline comment case. Clients that need to use more
-complex fields must use JSON formatting for the request body.
-
-* Allow administrators to see other user capabilities
-+
-Expand `/accounts/{id}/capabilities` to permit an administrator
-to inspect another user's effective capabilities.
-
-* Declare kind in JSON API results
-+
-This is recommended to hint to clients what the entity type is when
-processing the JSON payload.
-
-* Format h/help output as plain text not JSON
-+
-The output produced when the client requested the h or help property
-from a JSON API is always produced from constant compiled into the
-server. Assume this safe to return to the client as text/plain content
-and avoid wrapping it into an HTML escaped JSON string.
-
-* Use string for JSON encoded plain text replies
-+
-Instead of wrapping the value into an object, just return the
-string by itself. This better matches what happens with the plain
-text return format.
-
-* Wrap possible HTML plain text in JSON on GET
-+
-If the HTML appears like MSIE might guess it is HTML (such as if it
-contains `<`) encode the response as a JSON object instead of as a
-simple plain text string. This won't show up very often for clients,
-and protects MSIE users stuck on ancient versions (pre MSIE 8).
-
-* Ask MSIE to never sniff content types on REST API responses
-+
-Newer versions of MSIE can disable the content sniffing feature if the
-server asks it to by setting an extension header. It is annoying, but
-necessary, that a server needs to say "No really, I _am_ telling you
-the right Content-Type, trust it."
-+
-This feature was added in MSIE 8 Beta 2 so it doesn't protect users
-running MSIE 6 or 7, but those are ancient and users should upgrade.
-+
-Enable this on the REST API responses because we sometimes send back
-text/plain results that are really just plain text. Existing JSON
-responses are protected from accidental sniffing and treatment as
-HTML thanks to Gson encoding HTML control characters using Unicode
-character escapes within JSON strings.
-
-=== Project Dashboards
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/user-dashboards.html#project-dashboards[
-  Support for storing custom dashboards for projects]
-+
-Custom dashboards can now be stored in the projects
-`refs/meta/dashboards/*` branches.
-+
-The project dashboards are shown in a new project screen and can be
-link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/rest-api-projects.html#dashboard-endpoints[
-accessed via REST].
-
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/user-dashboards.html#project-default-dashboard[
-  Allow defining a default dashboard for projects]
-
-* Support inheritance for project dashboards.
-+
-In dashboards queries the `${project}` token can be used as placeholder
-for the project name. This token will be replaced with the project to
-which a dashboard is being applied.
-
-* On the project list screen a query icon is displayed for each project
-  that links to the default dashboard of that project.
-
-* Support a `foreach` parameter for custom dashboards.
-+
-The `foreach` parameter which will get appended to all the queries in
-the dashboard.
-
-=== Access Controls
-* Allow to overrule `BLOCK` permissions on the same project
-+
-It was impossible to block a permission for a group and allow the same
-permission for a sub-group of that group as the `BLOCK` permission
-always won over any `ALLOW` permission. For example, it was impossible
-to block the "Forge Committer" permission for all users and then allow
-it only for a couple of privileged users.
-+
-An `ALLOW` permission has now  priority over a `BLOCK` permission when
-they are defined in the same access section of a project. To achieve the
-above mentioned policy the following could be defined:
-+
-  [access "refs/heads/*"]
-    forgeCommitter = block group Anonymous Users
-    forgeCommitter = group Privileged Users
-+
-Across projects the `BLOCK` permission still wins over any `ALLOW`
-permission. This way one cannot override an inherited `BLOCK`
-permission in a subproject.
-+
-Overruling of `BLOCK` permissions with `ALLOW` permissions also works
-for labels i.e. permission ranges. If a dedicated 'Verifiers' group
-need to be the only group who can vote in the 'Verified' label and it
-must be ensured that even project owners cannot change this policy,
-then the following can be defined in a common parent project:
-+
-  [access "refs/heads/*"]
-    label-Verified = block -1..+1 group Anonymous Users
-    label-Verified = -1..+1 group Verifiers
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1516[issue 1516]:
-  Show global capabilities to all users that can read `refs/meta/config`
-+
-Users can now propose changes to the global capabilities for review
-from the WebUI.
-
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/access-control.html#category_remove_reviewer[
-  Remove Reviewer] is a new permission.
-
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/access-control.html#category_push_signed[
-  Pushing a signed tag] is a new permission.
-
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/access-control.html#category_edit_topic_name[
-  Editing the topic name] is a new permission.
-
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/access-control.html#capability_accessDatabase[
-  Raw database access] with the `gsql` command is a new global capability.
-+
-Previously site administrators had this capability by default.  Now it has
-to be explicitly assigned, even for site administrators.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1585[Issue 1585]:
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/access-control.html#category_view_drafts[
-  Viewing other users' draft changes] is a new permission.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1675[Issue 1675]:
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/access-control.html#category_delete_drafts[Deleting] and
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/access-control.html#category_publish_drafts[publishing]
-  other users' draft changes is a new permission.
-
-* Grant most permissions when creating `All-Projects`
-+
-Make Gerrit more like a Git server out-of-the box by granting both
-Administrators and Project Owners permissions to review changes, submit
-them, create branches, create tags, and push directly to branches.
-
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/config-gerrit.html#ldap.groupName[
-  LDAP group names] are configurable, `cn` is still the default.
-
-* Kerberos authentication to LDAP servers is now supported.
-
-* Basic project properties are now inherited by default from parent
-  projects: Use Content Merge, Require Contributor Agreement, Require
-  Change Id, Require Signed Off By.
-
-* Allow assigning `Push` for `refs/meta/config` on `All-Projects`
-+
-The `refs/meta/config` branch of the `All-Projects` project should only
-be modified by Gerrit administrators because being able to do
-modifications on this branch means that the user could assign himself
-administrator permissions.
-+
-In addition to being administrator Gerrit requires that the
-administrator has the `Push` access right for `refs/meta/config` in
-order to be able to modify it (just as with all other branches
-administrators do not have edit permissions by default).
-+
-The problem was that assigning the `Push` access right for
-`refs/meta/config` on the `All-Projects` project was not allowed.
-+
-Having the `Push` access right for `refs/meta/config` on the
-`All-Projects` project without being administrator has no effect.
-
-=== Hooks
-* Change topic is passed to hooks as `--topic NAME`.
-* link:https://code.google.com/p/gerrit/issues/detail?id=1200[Issue 1200]:
-New `reviewer-added` hook and stream event when a reviewer is added.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1237[Issue 1237]:
-New `merge-failed` hook and stream event when a change cannot be submitted due to failed merge.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=925[Issue 925]:
-New `ref-update` hook run before a push is accepted by Gerrit.
-
-* Add `--is-draft` parameter to `comment-added` hook
-
-=== Git
-* Add options to `refs/for/` magic branch syntax
-+
-Git doesn't want to modify the network protocol to support passing
-data from the git push client to the server. Work around this by
-embedding option data into a new style of reference specification:
-+
-----
-  refs/for/master%r=alice,cc=bob,cc=charlie,topic=options
-----
-+
-is now parsed by the server as:
-+
---
-** set topic to "options"
-** CC charlie and bob
-** add reviewer alice
-** for branch refs/heads/master
---
-+
-If `%` is used the extra information after the branch name is
-parsed as options with args4j. Each option is delimited by `,`.
-+
-Selecting publish vs. draft should be done with the options `draft` or
-`publish`, appearing anywhere in the refspec after the `%` marker:
-+
-----
-  refs/for/master%draft
-  refs/for/master%draft,r=alice
-  refs/for/master%r=alice,draft
-  refs/for/master%r=alice,publish
-----
-
-* Enable content merge by default
-+
-Most teams seem to expect Gerrit to manage simple merges within a
-source code file. Enable this out-of-the-box.
-
-* Added a link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/config-gerrit.html#core.useRecursiveMerge[
-  server-level option] to use JGit's new, experimental recursive merger.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1608[Issue 1608]:
-Commits pushed without a Change-Id now warn with instructions on how
-to download and install the commit-msg hook.
-
-* Add `oldObjectId` and `newObjectId` to the `GitReferenceUpdatedListener.Update`
-
-=== SSH
-* New SSH command to http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/cmd-gc.html[
-  run Git garbage collection]
-+
-All GC runs are logged in a GC log file.
-
-* Descriptions are added to ssh commands.
-+
-If `gerrit` is called without arguments, it will now show a list of available
-commands with their descriptions.
-
-* `create-account --http-password` enables setting/resetting the
-  HTTP password of role accounts, for Git or REST API access.
-
-* http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/cmd-ls-user-refs.html[
-  ls-user-refs] lists which refs are visible for a given user.
-
-* `ls-projects --has-acl-for` lists projects that mention a group
-  in an ACL, identifying where rights are granted.
-
-* `review` command supports project-specific labels
-
-* `test-submit-rule` was renamed to `test-submit rule`:
-+
-`rule` is now a subcommand of the `test-submit` command.
-
-* http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/cmd-test-submit-type.html[
-  test-submit type] tests the Prolog submit type with a chosen change.
-
-=== Query
-* Allow `{}` to be used for quoting in query expressions
-+
-This makes it a little easier to query for group names that contain
-a space over SSH:
-+
-  ssh srv gerrit query " 'status:open NOT reviewerin:{Developer Group}' "
-
-* The query summary block includes `resumeSortKey`.
-
-* Query results include author and change size information when certain
-  options are specified.
-
-* When a file is renamed the old file name is included in the Patch
-  attribute
-
-=== Plugins
-* Plugins can contribute Prolog facts/predicates from Java.
-* Plugins can prompt for parameters during `init` with `InitStep`.
-* Plugins can now contribute JavaScript to the web UI. UI plugins can
-  also be written and compiled with GWT.
-* New Maven archetypes for JavaScript and GWT plugins.
-* Plugins can contribute validation steps to received commits.
-* Commit message length checks are moved to the `commit-message-length-validator`
-  plugin which is included as a core plugin in the Gerrit distribution and
-  can be installed during site initialization.
-* Creation of code review notes is moved to the `reviewnotes` plugin
-  which is included as a core plugin in the Gerrit distribution and can
-  be installed during site initialization.
-* A plugin extension point for avatar images was added.
-* Allow HTTP plugins to change `static` or `docs` prefixes
-+
-An HTTP plugin may want more control over its URL space, but still
-delegate to the plugin servlet's magic handling for static files and
-documentation. Add JAR attributes to configure these prefixes.
-
-=== Prolog
-[[submit-type-from-prolog]]
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/prolog-cookbook.html#HowToWriteSubmitType[
-  Support controlling the submit type for changes from Prolog]
-+
-Similarly like the `submit_rule` there is now a `submit_type` predicate
-which returns the allowed submit type for a change. When the
-`submit_type` predicate is not provided in the `rules.pl` then the
-project default submit type is used for all changes of that project.
-+
-Filtering the results of the `submit_type` is also supported in the
-same way like filtering the results of the `submit_rule`. Using a
-`submit_type_filter` predicate one can enforce a particular submit type
-from a parent project.
-
-* Plugins can contribute Prolog facts/predicates from Java.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=288[Issue 288]:
-  Expose basic commit statistics for the Prolog rule engine
-+
-A new method `gerrit:commit_stats(-Files,-Insertions, -Deletions)` was
-added.
-
-* A new `max_with_block` predicate was added for more convenient usage
-
-=== Email
-* Notify project watchers if draft change is published
-* Notify users mentioned in commit footer on draft publish
-* Add new notify type that allows watching of new patch sets
-* link:https://code.google.com/p/gerrit/issues/detail?id=1686[Issue 1686]:
-  Add new notify type that allows watching abandoning of changes
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/user-notify.html[
-  Notifications configured in `project.config`] can now be addressed
-  using any of To, CC, or BCC headers.
-* link:https://code.google.com/p/gerrit/issues/detail?id=1531[Issue 1531]:
-Email footers now include `Gerrit-HasComments: {Yes|No}`.
-* `#if($email.hasInlineComments())` can be used in templates to test
-  if there are comments to be included in this email.
-* Notification emails are sent to included groups.
-* Comment notification emails are sent to project watchers.
-* "Change Merged" emails include the diff output when `sendemail.includeDiff` is enabled.
-* When link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/rest-api-changes.html#set-review[
-  posting a review via REST] the caller can control email delivery
-+
-This may help automated systems to be less noisy. Tools can now choose
-which review updates should send email, and which categories of users
-on a change should get that email.
-
-=== Labels
-* Approval categories stored in the database have been replaced with labels
-  configured in `project.config`. Existing categories are migrated to
-  `project.config` in `All-Projects` as part of the schema upgrade; no user
-  action is required.
-* Labels are no longer global;
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/config-labels.html[
-  projects may define their own labels], with inheritance.
-* Don't create `Verify` category by default
-+
-Most project teams seem confused with the out-of-the-box experience
-needing to vote on both `Code-Review` and `Verified` categories in
-order to submit a change. Simplify the out-of-the-box workflow to only
-have `Code-Review`. When a team installs the Hudson/Jenkins integration
-or their own build system they can now trivially add the `Verified`
-category by pasting 5 lines into `project.config`.
-
-=== Dev
-
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/dev-readme.html#debug-javascript[
-  Support loading debug JavaScript]
-
-* Gerrit acceptance tests
-+
-An infrastructure for testing the Gerrit daemon via REST and/or SSH
-protocols has been added. Gerrit daemon is run in the headless mode and
-in the same JVM where the tests run. Besides using REST/SSH, the tests
-can also access Gerrit server internals to prepare the test environment
-and to perform assertions.
-+
-A new review site is created for each test and the Gerrit daemon is
-started on that site. When the test has finished the Gerrit daemon is
-shutdown.
-
-* Lightweight LDAP server for debugging
-
-* Add asciidoc checks in the documentation makefile
-+
-Exit with error if the asciidoc executable is not available or has
-version lower than 8.6.3.
-+
-The release script is aborted if asciidoc is missing.
-
-* Added sublime project files to `.gitignore`
-
-* Exclude all `pom.xml` files that are archetype resources in `version.sh`
-
-* Source files generated by Prolog are now correctly included in the Eclipse
-project.
-
-* Core plugins are now included as git submodules.
-
-* `mvn package` now generates the documentation by default.
-+
-The documentation will always be generated unless `-Dgerrit.documentation.skip`
-is given on the command line.
-
-* `mvn verify` now runs acceptance tests by default.
-+
-The `acceptance` profile is no longer used.  Acceptance tests will always
-be run unless `-Dgerrit.acceptance-tests.skip=True` is given on the command line.
-
-* Vertically align the "Choose:" header on the Become Any Account page.
-* "Become Any Account" can be used for accounts whose full name is an empty string.
-
-
-=== Performance
-* Bitmap Optimizations
-+
-On running the http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/cmd-gc.html[
-garbage collection] JGit creates bitmap data that is saved to an
-auxiliary file. The bitmap optimizations improve the clone and fetch
-performance. git-core will ignore the bitmap data.
-
-* Improve suggest user performance when adding a reviewer.
-+
-Do not check the visibility of the change for each suggested account if
-the ref is visible by all registered users.
-+
-On a system with about 2-3000 users, where most of the projects are
-visible by every registered user, this improves the performance of the
-suggesting reviewer by a factor of 1000 at least.
-
-* Cache RefControl.isVisible()
-+
-For Git repositories with many changes the time for calculating visible
-refs is reduced by 30-50%.
-
-* Allow admins to disable magic ref check on upload
-+
-Some sites manage to run their repositories in a way that prevents
-users from ever being able to create `refs/for`, `refs/drafts` or
-`refs/publish` names in a repository. Allow admins on those servers
-to disable this (somewhat) expensive check before every upload.
-
-* Permit ProjectCacheClock to be completely disabled
-+
-Some admins may just want to require all updates to projects to be
-made through the web interface, and avoid the small expense of a
-background thread ticking off changes.
-
-* Batch read Change objects during query
-
-* Default `core.streamFileThreshold` to a larger value
-+
-If this value is not configured by the server administrator
-performance on larger text files suffers considerably and
-Gerrit may grind to a halt and be unable to answer users.
-+
-Default to either 25% of the available JVM heap or ~2048m.
-
-* Improve performance of ReceiveCommits for repositories with many refs
-+
-Avoid adding `refs/changes/` and `refs/tags/` to RevWalk's as
-uninteresting since JGit RevWalk doesn't perform well when a large
-number of objects is marked as uninteresting.
-
-* PatchSet.isRef()-optimizations.
-+
-PatchSet.isRef() is used extensively when preparing for a ref
-advertisement and the regular expression used by isRefs() was notably
-costly in these circumstances, especially since it could not be
-pre-compiled.
-+
-The regular expression is removed and the check is now directly
-implemented. As result the performance of `git ls-remote` could be
-increased by up to 15%.
-
-* New config option `receive.checkReferencedObjectsAreReachable`
-+
-If set to true, Gerrit will validate that all referenced objects that
-are not included in the received pack are reachable by the user.
-+
-Carrying out this check on Git repositories with many refs and commits
-can be a very CPU-heavy operation. For non public Gerrit servers it may
-make sense to disable this check, which is now possible.
-
-* Cache config value in LdapAuthBackend
-
-* Perform a single /accounts/self/capabilities on page load
-+
-This joins up 3 requests into a single call, which should speed up
-initial page load for most users.
-
-* Only gzip compress responses that are smaller compressed
-
-* Caching of changes
-+
-During Ref Advertisements (via VisibleRefFilter), all changes need to
-be fetched from the database to allow Gerrit to figure out which change
-refs are visible and should be advertised to the user. To reduce
-database traffic a cache for changes was introduced. This cache is
-disabled by default since it can mess up multi-server setups.
-
-=== Misc
-* Add config parameter to make new groups by default visible to all
-+
-Add a new http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/config-gerrit.html#groups.newGroupsVisibleToAll[
-Gerrit configuration parameter] that controls whether newly
-created groups should be by default visible to all registered users.
-
-* Support for OpenID domain filtering
-+
-Added the ability to only allow email addresses under specific domains
-to be used for OpenID login.
-+
-The allowed domains can be configured by setting
-http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/config-gerrit.html#auth.openIdDomain[
-auth.openIdDomain] in the Gerrit configuration.
-
-* Always configure
-  http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/config-gerrit.html#gerrit.canonicalWebUrl[
-  gerrit.canonicalWebUrl] on init
-+
-Gerrit has been requiring this field for several versions now, but init
-did not configure it. Ensure there is a value set so the server is not
-confused at runtime.
-
-* Add submodule subscriptions fetching by projects
-+
-While submodule subscriptions can be fetched by branch, some plugins
-(e.g.: delete-project) would rather need to access all submodule
-subscriptions of a project (regardless of the branch). Instead of
-iterating over all branches of a project, and fetching the
-subscription for each branch separately, we allow fetching of
-subscriptions directly by projects.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1805[Issue 1805]:
-  Make client SSL certificates that contain an email address work
-+
-Authentication with CLIENT_SSL_CERT_LDAP didn't work if the certificate
-contained email address.
-
-* Guess LDAP type of Active Directory LDS as ActiveDirectory
-+
-If Gerrit connects to an AD LDS [1] server it will guess its type as
-RCF_2307 instead of ActiveDirectory. The reason is that an AD LDS
-doesn't support the "1.2.840.113556.1.4.800" capability.  However,
-AD LDS behaves like ActiveDirectory and Gerrit also needs to guess
-its type as ActiveDirectory to make the default query patterns work
-properly.
-+
-Extend the LDAP server type guessing by checking for presence of the
-"1.2.840.113556.1.4.1851" capability which indicates that this LDAP
-server runs ActiveDirectory as AD LDS [2].
-+
-Also remove the check for the presence of the "defaultNamingContext"
-attribute as we don't use it anywhere and, by default, this attribute is
-not set on an AD LDS [3]
-+
-[1] http://msdn.microsoft.com/en-us/library/aa705886(VS.85).aspx +
-[2] http://msdn.microsoft.com/en-us/library/cc223364.aspx +
-[3] http://technet.microsoft.com/en-us/library/cc816929(v=ws.10).aspx
-
-* Allow group descriptions to supply email and URL
-+
-Some backends have external management interfaces that are not
-embedded into Gerrit Code Review. Allow those backends to supply
-a URL to the web management interface for a group, so a user can
-manage their membership, view current members, or do whatever other
-features the group system might support.
-+
-Some backends also have an email address associated with every
-group. Sending email to that address will distribute the message to
-the group's members. Permit backends to supply an optional email
-address, and use this in the project level notification system if
-a group is selected as the target for a message.
-
-* Allow group backends to guess on relevant UUIDs
-+
-Expose all cheaply known group UUIDs from the ProjectCache,
-enumerating groups used by access controls. This allows a backend
-that has a large number of groups to filter its getKnownGroups()
-output to only groups that may be relevant for this Gerrit server.
-+
-The best use case to consider is an LDAP server at a large
-organization. A typical user may belong to 50 LDAP groups, but only
-3 are relevant to this Gerrit server. Taking the intersection of
-the two groups limits the output Gerrit displays to users, or uses
-when considering same group visibility.
-
-* Add more forbidden characters for project names
-+
-`?`, `%`, `*`, `:`, `<`, `>`, `|`, `$`, `\r` are now forbidden in
-project names.
-
-* Make `gerrit.sh` LSB compliant
-+
-** Add LSB headers
-** Add 'status' as synonym for 'check'
-** Fix exit status codes according to http://refspecs.linux-foundation.org/LSB_3.2.0/LSB-Core-generic/LSB-Core-generic/iniscrptact.html
-
-* Option to start headless Gerrit daemon
-+
-Add `--headless` option to the Daemon which will start Gerrit daemon
-without the Web UI front end (headless mode).
-+
-This may be useful for running Gerrit server with an alternative (rest
-based) UI or when starting Gerrit server for the purpose of automated
-REST/SSH based testing.
-+
-Currently this option is only supported via the `--headless` option of
-the daemon program. We would need to introduce a config option in order
-to support this feature for deployed war mode.
-
-* Show path to gerrit.war in command for upgrade schema
-
-=== Upgrades
-* link:https://code.google.com/p/gerrit/issues/detail?id=1619[Issue 1619]:
-Embedded Jetty is now 8.1.7.v20120910.
-
-* ASM bytecode library is now 4.0.
-* JGit is now 2.3.1.201302201838-r.208-g75e1bdb.
-* asciidoc 8.6.3 is now required to build the documentation.
-* link:https://code.google.com/p/gerrit/issues/detail?id=1155[Issue 1155]:
-prettify is now r225
-
-* The used GWT version is now 2.5.0
-+
-Fixes some issues with IE9 and IE10.
-
-== Bug Fixes
-
-=== Web UI
-* link:https://code.google.com/p/gerrit/issues/detail?id=1662[Issue 1662]:
-  Don't show error on ACL modification if empty permissions are added
-+
-This error message was incorrectly displayed if a permission without
-rules was added, although the save was actually successful.
-
-* Don't show error on ACL modification if a section is added more than once
-+
-This error message was incorrectly displayed if multiple sections for
-the same ref were added, although the save was actually successful.
-
-* Links to CGit were broken when `remove-suffix` was enabled.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=926[Issue 926]:
-Internet Explorer versions 9 and 10 are supported.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1664[Issue 1664]:
-  Reverting a change did not preserve the change's topic
-
-* Fix: User could get around restrictions by reverting a commit
-+
-The Gerrit server may enforce several restrictions on the commit
-message (change-id required, signed-off-by, etc). A user was able to
-get around these restrictions by reverting a commit using the UI.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1518[Issue 1518]:
-  Reset 'Old Version History' if dependent change is opened
-+
-Following the navigation link in the dependencies table on the
-change screen, the user can directly navigate to dependent changes.
-The value for 'Old Version History' of the current change was
-incorrectly applied to the new change. If the value was invalid for
-the new change the 'Old Version History' field became blank.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1736[Issue 1736]:
-  Clear 'Old Version History' ListBox before populating it
-+
-The ListBox was not always cleared and as result the same entries were
-sometimes added multiple times e.g. after rebasing a change in the
-WebUI.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1673[Issue 1673]:
-  Fix disappearance of patch headers when compared patches are identical
-+
-When two patches were compared that were identical 'No Differences' is
-displayed to the user. In this case the patch headers disappeared and
-as result the user couldn't change the patch selection anymore.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1759[Issue 1759]:
-  Fix ArrayIndexOutOfBoundsException on intraline diff
-+
-In some cases displaying the intraline diff failed with an exception like
-this:
-+
-----
-java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 10
-  at com.google.gerrit.prettify.common.SparseFileContent.mapIndexToLine(SparseFileContent.java:149)
-  at com.google.gerrit.prettify.common.PrettyFormatter.format(PrettyFormatter.java:188)
-  at com.google.gerrit.client.patches.AbstractPatchContentTable.getSparseHtmlFileB(AbstractPatchContentTable.java:287)
-  at com.google.gerrit.client.patches.SideBySideTable.render(SideBySideTable.java:113)
-  at com.google.gerrit.client.patches.AbstractPatchContentTable.display(AbstractPatchContentTable.java:238)
-  at com.google.gerrit.client.patches.PatchScreen.onResult(PatchScreen.java:444)
-...
-----
-+
-This happened when the old line was:
-+
-----
-  foo-old<LF>
-----
-+
-and the new line was:
-+
-----
-  foo-new<CRLF>
-----
-
-* Prevent leading and trailing spaces on user's Full Name
-+
-Strip off the leading and trailing spaces from the Full Name that the
-user enters on the Contact Information form.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1480[Issue 1480]:
-  Show proper error message if registering email address fails
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=816[Issue 816]:
-  Due to issues with the diff_intraline cache the file indention in the
-  Side-By-Side diff was sometimes wrong.
-
-* Make rebase failed and merge failed messages consistent
-
-* Select 'Projects' menu on loading of a project screen
-+
-If in the top level menu 'All' is selected and the user navigates to
-a change and then from the change to the project by clicking on the
-project link in the ChangeInfoBlock, the project screen is loaded but
-the 'Projects' menu was not selected.
-
-* Fix display issues for inline comments and inline comment editors
-+
-** Sometimes a second comment editor was shown instead of using the
-   existing comment editor.
-** Fix duplicated border line between comments.
-** Sometimes the parts of the border were missing when a comment was
-   expanded.
-** Fix displaying the blue line that marks the current line when there
-   are several published comments.
-** Sometimes on discard of a comment some frames of the comment editor
-   stayed and some border lines of neighbor comments disappeared.
-
-* In diff view don't let arrow column accept clicks.
-
-* Fix display of commit message
-+
-If there are no HTML tags in the text, just break on lines.
-
-* Upon selection in AddMemberBox, focus the box's text field
-+
-In the change screen, after clicking on an element of the 'Add
-Reviewer' suggestion list, users expect to be able to add the reviewer
-by hitting enter. This did not work in Firefox.
-
-* Fix enter key detection in project creation screen
-+
-The enter key detection was not working in all browsers (e.g. Firefox).
-
-* Display a tooltip for all tiny icons and ensure that the cursor is
-  shown as pointer when hovering over them.
-
-* Clean query string when switching pages
-+
-If we load a page without a query string, such as Projects->List,
-My->Changes, or Settings, it might be confusing to show the old query
-string from the previous page. The query string is now cleared out
-when switching pages, leaving the help text visible.
-
-* Fix highlighting in search suggestions
-+
-The provided suggestions should highlight the part that the user has
-already typed as bold text. This only worked for the first operator.
-For suggestions of any further operator no highlighting was done.
-
-* Fix style of hint text in search box on initial page load
-+
-The hint text should be a light gray on the white background,
-but was coming up black on initial page load due to a style setup
-ordering issue between the SearchPanel and the HintTextBox.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1661[Issue 1661]:
-  Update links to Change-Id and Signed-off-by documentation on project info
-  screen
-
-* Use href="javascript;" for All {Side-by-Side,Unified} links
-+
-These links shouldn't have an anchor location. There is nothing for
-the browser to remember or visit if it were opened in a new tab for
-example.
-
-* Improve message for unsatisfiable dependencies
-+
-If a change cannot be merged due to unsatisfiable dependencies a
-comment is added to the change that lists the missing commits and says
-that a rebase is necessary.
-+
-For each missing commit the comment said "Depends on patch set X
-of ..., however the current patch set is Y."
-+
-If multiple commits are missing it may be that for some commits the
-dependency is not outdated (X == Y). In this case the message was
-confusing.
-+
-", however the current patch set is Y." is now skipped if Y == X.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1843[Issue 1843]:
-  Enable the "Create Project" and "Create Group" buttons when pasting the name
-  into the text box.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1370[Issue 1370]:
-  Fix PatchScreen leak when moving between files.
-
-* Prevent account's full name from being set to empty string.  Set it to
-  null instead.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1682[Issue 1682]:
-Correctly handle paths with URL-escaped characters
-+
-URL-unescape the path portion of a change history token to correctly
-handle paths with URL-escapable characters, i.e. '+', ' ', etc.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1915[Issue 1915]:
-Don't show non-visible drafts in the diff screens.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1801[Issue 1801]:
-Correctly keep patch set ordering after a new patch set is added via
-the Web UI.
-
-=== REST API
-* Fix returning of 'Email Reviewers' capability via REST
-+
-The `/accounts/self/capabilities/` didn't return the 'Email Reviewers'
-capability when it was not explicitly assigned, although by default
-everyone has the 'Email Reviewers' capability.
-+
-If 'Email Reviewers' capability was allowed or denied,
-`/accounts/self/capabilities/` returned the 'Email Reviewers'
-capability always as true, which was wrong for the DENY case.
-
-* Provide a more descriptive error message for unauthenticated REST
-  API access
-
-=== Git
-* The wildcard `.` is now permitted in reference regex rules.
-
-* Checking if a change is mergeable no longer writes to the repository.
-
-* Submitted but unmerged changes are periodically retried. This is
-  necessary for a multi-master configuration where the second master
-  may need to retry a change not yet merged by the first. Please note
-  we still do not believe this is sufficient to enable multi-master.
-
-* Retry merge after LOCK_FAILURE when updating branch
-+
-If the project requires fast-forwards, the merge cannot succeed once
-a lock failure occurs, but in other cases, it is safe to retry the
-merge immediately.
-
-* Do not automatically add reviewers from footer lines to draft patch sets
-+
-Gerrit already avoids adding reviewers from footer lines when a new
-draft change is created. Now the same is done for draft patch sets.
-
-* Add users mentioned in commit footer as reviewers on draft publish
-
-* Hide any existing magic branches during push
-+
-If there is a magic branch visible during push, just hide it from the
-client. Administrators can clear these by accessing the repository
-directly.
-
-* Prevent from deleting `refs/changes/`
-+
-Everything under `refs/changes/` should be protected by Gerrit, users
-shouldn't be able to delete a particular patch set or a whole change
-from the review process.
-
-* Update description file in Git
-+
-When writing the description to `project.config`, it is also necessary
-to write it to the description file in the repository so the same text
-is visible in CGit or GitWeb.
-
-* Write valid reflog for `HEAD` when creating the `All-Projects`
-  project
-+
-When the `All-Projects` project is created during the schema
-initialization, `HEAD` is set to point to the `refs/meta/config`
-branch. When `HEAD` is updated an entry into the reflog is written.
-This ref log entry should contain the ID of the initial commit as
-target, but instead the target was the zero ID.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1702[Issue 1702]:
-  Fix: 'internal server error' when pushing the same commit twice
-+
-On the second push of the same commit to `refs/for/<branch name>`, Gerrit
-returns 'no new changes'.
-+
-However if the user pushed to 'refs/changes/<change id>', Gerrit returned
-'internal server error'.
-
-* Match all git fetch/clone/push commands to the command executor
-+
-Route not just `/p/` but any Git access to the same thread pool as the
-SSH server is using, allowing all requests to compete fairly for
-resources.
-
-* Fix auto closing of changes on direct push
-+
-When a commit was directly pushed into a repository (bypassing code
-review) and this commit had a Change-Id in its commit message then the
-corresponding change was not automatically closed if it was open.
-
-* Set change state to NEW if merge fails due to non-existing dest branch
-+
-If a submitted change failed to merge because the destination branch
-didn't exist anymore, it stayed in state 'Submitted, Merge Pending'.
-This meant Gerrit was re-attempting to merge this change (e.g. on
-startup), but this didn't make sense. Either the branch did still not
-exist (then there was no need to try merging it) or a new branch with
-the old name was created (then it was questionable if the change should
-still be merged into this branch). This is why it's better to set the
-change back to the 'Review in Progress' state and update it with a
-message saying that it couldn't be merged because the destination
-branch doesn't exist anymore.
-+
-In addition Gerrit was writing an error into the error log if a change
-couldn't be merged because the destination branch was missing.
-That was not really a server error and is not logged anymore.
-
-* Fix NPE when pushing a patch with an invalid author with
-  `Forge Author` permissions
-
-* Fix duplicated GitReferenceUpdated event on project creation.
-+
-Creating a new Gerrit project was firing the GitReferenceUpdated event
-for the `refs/meta/config` branch two times.
-
-* Fix error log message in ReceiveCommits
-+
-When the creation of one or more references failed ReceiveCommits failed
-with 'internal server error' and wrote the following error log:
-"Only X of Y new change refs created in xxx; aborting"
-The printed value for Y could be wrong since it didn't include the
-replaceCount. As a result, a confusing message like
-"Only 0 of 0 new change refs created in xxx; aborting"
-could appear in the error log.
-
-=== SSH
-* `review --restore` allows a review score to be added on the restored change.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1721[Issue 1721]:
-  `review --message` only adds the message once.
-
-* `ls-groups` prints "N/A" if the group's name is not set.
-
-* `set-project-parent --children-of`: Fix getting parent for level 1 projects
-+
-For direct child projects of the `All-Projects` project the name of the
-parent project was incorrectly retrieved if the parent name was not
-explicitly stored as `All-Projects` in the project.config file.
-
-* Fix NPE when abandoning change with invalid author
-+
-If the author of a change isn't known to Gerrit (pushed with
-`Forge Author` permissions), trying to abandon that change over SSH
-failed with an NPE.
-
-* Fix setting account's full name via ssh.
-
-=== Query
-* link:https://code.google.com/p/gerrit/issues/detail?id=1729[Issue 1729]:
-  Fix query by 'label:Verified=0'
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1772[Issue 1772]:
-  Set `_more_changes` if result is limited due to configured query limit
-
-* Fix query cost for "status:merged commit:c0ffee"
-
-=== Plugins
-* Skip disabled plugins on rescan
-+
-In a background thread Gerrit periodically scans for new or changed
-plugins. On every such a rescan disabled plugins were loaded and a new
-copy of their jar files was stored in the review site's tmp folder.
-
-* Fix cleanup of plugins from tmp folder on graceful Gerrit shutdown
-+
-Loaded plugin jars are copied to the review site's tmp folder to support
-hot updates of the plugin jars in the plugins folder. On Gerrit shutdown
-these copies of the jar files should be cleaned up. For this purpose a
-CleanupHandle is created, but the CleanupHandle wasn't enqueued in the
-cleanupQueue which is why cleanup on Gerrit shutdown didn't happen.
-
-* Reattempt deletion of plugin jars from tmp folder on JVM termination
-+
-Loaded plugin jars are copied to the review site's tmp folder to support
-hot updates of the plugin jars in the plugins folder. On Gerrit shutdown
-these copies of the jar files should be cleaned up. For this purpose a
-CleanupHandle is created. The deletion of the tmp file in the
-CleanupHandle can fail although the jar file was closed. In this case
-reattempt the deletion on termination of the virtual machine. This
-normally succeeds.
-
-* Fix unloading of plugins
-+
-When two plugins, say pluginA, and pluginB had been loaded, and pluginA
-was removed from $sitePath/plugins, pluginA got stopped, and a cleaning
-run was ordered. But this cleaning run cleaned both plugins and both
-plugins had their jars removed. This left pluginB visible to Gerrit
-although it's backing jar was gone. Upon calling not yet initialized
-parts of pluginB (e.g.: viewing not yet viewed Documentation pages of
-pluginB), exceptions as following were thrown:
-+
-----
-  java.lang.IllegalStateException: zip file closed
-          at java.util.zip.ZipFile.ensureOpen(ZipFile.java:420)
-          at java.util.zip.ZipFile.getEntry(ZipFile.java:165)
-----
-
-* Fix double bound exception when loading extensions
-+
-ServerInformation class was already bound, therefore it shouldn't be
-bound a second time for Gerrit extensions.
-
-* Do not call onModuleLoad() second time
-+
-onModuleLoad() method is automatically called by GWT framework. Calling
-it once again in PluginGenerator caused double plugin initialization.
-
-* Require `Administrate Server` capability to GET /plugins/
-+
-Listing plugins requires being an administrator. This was missed in the
-REST API.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1827[Issue 1827]:
-  Allow InternalUser (aka plugins) to see any internal group, and run
-  plugin startup and shutdown as PluginUser.
-
-=== Email
-* Merge failure emails are only sent once per day.
-* Unused macros are removed from the mail templates.
-* Unnecessary ellipses are no longer applied to email subjects.
-* The empty diff output from an "octopus merge" is now explained in change notification emails.
-* link:https://code.google.com/p/gerrit/issues/detail?id=1480[Issue 1480]:
-Proper error message is shown when registering an email address fails.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1692[Issue 1692]:
-Review comments are sorted before being added to notification emails.
-
-* Fix watching of 'All Comments' on `All-Projects`
-+
-If a user is watching 'All Comments' on `All-Projects` this should
-apply to all projects.
-
-=== Misc
-* Provide more descriptive message for NoSuchProjectException
-
-* On internal error due to receive timeout include the value of
-  `receive.timeout` into the log message
-
-* Silence INFO/DEBUG output from apache.http
-+
-This spammed the log when using OpenID, for each and every login.
-
-* Remove `mysql_nextval` script
-+
-This function does not work on binary logging enabled servers,
-as MySQL is unable to execute the function on slaves without
-causing possible corruption. Drop the function since it was only
-created to help administrators, and is unsafe.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1312[Issue 1312]:
-  Fix relative URL detection in submodules
-+
-Relative submodules do not start with `/`. Instead they start with
-`../`.  Fix the Submodule Subscriptions engine to recognize relative
-submodules.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1622[Issue 1622]:
-  Fix NPE in LDAP Helper class if username is null
-
-* Fix commit-msg hook failure with spaces in path
-+
-If the project absolute path had any whitespace, the commit
-hook failed to complete because a script variable was not
-enclosed in double quotes.
-
-* Drop the trailing ".git" suffix of the name of new project
-
-* Prevent possible NPE when running `change-merged` hook
-+
-It's possible that the submitter is null. Add a check for this
-before invoking the `change-merged` hook with it.
-
-* Keep change open if its commit is pushed to another branch.
-
-* Fire GitReferenceUpdated event when BanCommit updates the
-  `refs/meta/reject-commits` branch.
-
-* Fix GitWeb Caching
-+
-GitWeb Caching was not working when its cgi file was executed from
-outside. The same approach will also work with vanilla GitWeb.
-
-* Fix infinite loops when walking project hierarchy
-
-* Fix resource leak in MarkdownFormatter
-
-* Query all external groups for internal group memberships
-+
-When asking for the known groups a user belongs to they may belong
-to an internal group by way of membership in a non-internal group,
-such as LDAP. Cache in memory the complete list of any non-internal
-group UUIDs used as members of an internal group. These must get
-checked for membership before completing the known group data from
-the internal backend.
-
-* Handle sorting groups with no name to avoid NPE
-
-* `gerrit.sh`
-** Don't suggest site init if schema version is newer than expected
-** Improve error messages in schema check
-** Suggest changing `gerrit.config` when JDK not found
-** Explicitly set a shell
-** Determine `GERRIT_SITE` from current working directory.
-** Fix `gerrit.sh restart` for relative paths
-** Fix site path computation if '.' occurs in path
-** Whitespace fixes
-
-* Display the reason of an Init injection failure.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1821[Issue 1821]:
-  Warn if `cache.web_sessions.maxAge` is to small
-+
-Setting `maxAge` to a small value can result in the browser endlessly
-redirecting trying to setup a new valid session. Warn administrators
-that the value is set smaller than 5 minutes.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1821[Issue 1821]:
-  Support `cache.web_sessions.maxAge` < 1 minute
-
-* Use SECONDS as default time unit for `cache.web_sessions.maxAge`
-+
-DefaultCacheFactory already uses SECONDS as default time unit for
-`cache.*.maxAge`.
-+
-Update the described default time unit for `cache.*.maxAge` in the
-documentation.
-+
-Administrators may need to update their configuration to for the new
-default time unit.
-
-* Add pylint configuration for contributed Python scripts
-
-* Various fixes and improvements of the `contrib/trivial_rebase.py`
-  script
-+
-** Adapt options to Gerrit 2.6
-** Use change-url flag for ChangeId
-** Prevent exception for empty commit
-** Fix pylint errors
-** Call `gerrit review` instead of `gerrit approve`
-** Make the private key argument optional
-** Support alternative ssh executable, for example `plink`
-** Support custom review labels
-** Correctly handle empty patch ID
-+
-If only one of the patch IDs is empty, it should not be considered
-a trivial rebase.
-
-** Use plain python instead of python2.6
-+
-Windows installation only has python.exe
-
-* Correct MIME type of `favicon.ico` reference
-+
-This is not a GIF, it is an "MS Windows icon resource".
-Some browsers may skip the image if the type is wrong.
-
-* Use `<link rel="shortcut icon">` for `favicon.ico` reference
-+
-IE looks for a two-word "shortcut icon" relationship.  Other browsers
-interpret this as two relationships, one of which is "icon", so they
-can handle this syntax as well.
-+
-See:
-+
-** http://msdn.microsoft.com/en-us/library/ms537656(VS.85).aspx
-** http://jeffcode.blogspot.com/2007/12/why-doesnt-favicon-for-my-site-appear.html
-
-* Remove `servlet-api` from `WAR/lib`
-+
-It is wrong to include the servlet API in a WAR's `WEB-INF/lib`
-directory. This confuses some servlet containers who refuse to
-load the Gerrit WAR. Instead package the Jetty runtime and the
-servlet API in a new `WEB-INF/pgm-lib` directory.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1822[Issue 1822]:
-  Verify session matches container authentication header
-+
-If the user alters their identity in the container invalidate
-the Gerrit user session and force a new one to begin.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1743[Issue 1743]:
-  Move RPC auth token from `Authorization` header to `X-Gerrit-Auth`
-+
-Servers that run with auth.type = HTTP or HTTP_LDAP are unable to
-use the web UI because the Authorization code supplied by the UI
-overrides the browser's native `Authorization` header and causes the
-request to be blocked at the HTTP reverse proxy, before Gerrit even
-sees the request.
-+
-Instead insert a unique token into `X-Gerrit-Auth`, leaving the HTTP
-standard `Authorization` header unspecified and available for use in
-HTTP reverse proxies.
-
-== Documentation
-
-The link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/index.html[
-documentation index] is restructured to make it easier to use for different kinds of
-users.
-
-=== User Documentation
-* Split link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/rest-api.html[
-  REST API documentation] and have one page per top level resource
-
-* Add executable examples for GET requests to
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/rest-api.html[
-  REST API documentation]
-+
-Add examples for GET requests to the REST API documentation on which
-the user can click to fire the requests. This allows users to
-immediately try out the requests and play around with them.
-
-* Document the link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/access-control.html#block[
-  BLOCK access rule].
-
-* Added documentation of
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/user-upload.html#http[
-  how to authenticate uploads over HTTP].
-
-* Added documentation of the
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/config-gerrit.html#auth.editFullNameUrl[auth.editFullNameUrl] and
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/config-gerrit.html#auth.httpPasswordUrl[auth.httpPasswordUrl]
-  configuration parameters.
-
-* Add link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/prolog-cookbook.html[
-  submit_rule examples] from Gerrit User Summit 2012.
-
-* Improved the push tag examples in the access control documentation.
-
-* Improved documentation of error messages related to commit message footer content.
-
-* Added documentation of the
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/error-commit-already-exists.html[
-  commit already exists] error message.
-
-* Added missing documentation of the ssh
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/cmd-version.html[
-  version] command.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1369[Issue 1369]:
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/config-gitweb.html[
-  Gitweb Instruction Updates]
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1594[Issue 1594]:
-  Document execute permission for commit-msg in
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/user-changeid.html#creation[
-  Change-Id docs]
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1602[Issue 1602]:
-Corrected references to `refs/changes` in the access control documentation.
-
-* Update documentation of
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/config-gerrit.html#trackingid.name.match[
-  maximal length for tracking ids]
-
-* Added missing documentation of
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/json.html[JSON attributes].
-
-* Rename `custom-dashboards.html` to
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/user-dashboards.html[user-dashboards.html]
-+
-This document no longer deals exclusively with custom dashboards, it now describes project level dashboards also.
-
-* Separate the
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/config-login-register.html[
-  initial user setup instructions] to a shared file
-
-* Separate the
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/database-setup.html[
-  database setup instructions] to a shared file
-
-* Improve the link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/database-setup.html[
-  instructions for PgSQL setup]
-
-* Fix the order of steps in the
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/install-j2ee.html[
-  J2EE Installation document]
-+
-It is better to first define the JNDI data source in the application
-server and then deploy Gerrit than opposite. This should avoid errors
-like "No DataSource" on the first deployment.
-
-* Clarify documentation of
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/config-gerrit.html#ldap.groupName[
-  LDAP group name setting]
-
-* Improve the documentation of
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/user-submodule.html[
-  git submodule subscription handling]
-
-* Clarify the documentation of change cache setup.
-
-* Improve the explanation of path conflicts in the
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/project-setup.html[
-  project setup documentation].
-
-* Add explanations of special/magic refs in the
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/access-control.html#references[
-  access control documentation].
-
-* Clarify how to set Global Capabilities.
-* Correct documentation of the `create-account` ssh command.
-* Add documentation of the `database.connectionPool` setting.
-* Adapt documentation to having 'Projects' as top level menu
-* Added missing documentation of mail templates.
-* Added documentation of contributor agreements.
-* Fix `init.d` symbolic link commands.
-* Remove obsolete diskbuffer setting from example config file.
-* Various minor grammatical and formatting corrections.
-* Fix external links in 2.0.21 and 2.0.24 release notes
-* Manual pages can be optionally created/installed for core gerrit ssh commands.
-
-=== Developer And Maintainer Documentation
-* Updated the link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/dev-eclipse.html#maven[
-  Maven plugin installation instructions] for Eclipse 3.7 (Indigo).
-
-* Document link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/dev-contributing.html#commit-message[
-  usage of the past tense in commit messages]
-
-* Add link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/dev-contributing.html[
-  instructions] on how to configure git for pushing to Gerrit's Gerrit
-
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/dev-contributing.html#process[
-  Stable branches process documentation]
-
-* Improved the
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/dev-release.html[
-  release documentation].
-
-* Document that plans for
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/dev-release.html#stable[
-  stable-fix releases] should be announced
-
-* Document process for
-  link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.6/dev-release.html#security[
-  security-fix releases]
-
-* The release notes are now made when a release is created by running the `tools/release.sh` script.
-
diff --git a/ReleaseNotes/ReleaseNotes-2.7.txt b/ReleaseNotes/ReleaseNotes-2.7.txt
deleted file mode 100644
index 0870cbf..0000000
--- a/ReleaseNotes/ReleaseNotes-2.7.txt
+++ /dev/null
@@ -1,313 +0,0 @@
-= Release notes for Gerrit 2.7
-
-
-Gerrit 2.7 is now available:
-
-link:https://www.gerritcodereview.com/download/gerrit-2.7.war[
-https://www.gerritcodereview.com/download/gerrit-2.7.war]
-
-Gerrit 2.7 includes the bug fixes done with link:ReleaseNotes-2.6.1.html[Gerrit 2.6.1].
-These bug fixes are *not* listed in these release notes.
-
-== Schema Change
-
-
-*WARNING:* This release contains schema changes.  To upgrade:
-----
-  java -jar gerrit.war init -d site_path
-----
-
-*WARNING:* Upgrading to 2.7.x requires the server be first upgraded to 2.1.7 (or
-a later 2.1.x version), and then to 2.7.x.  If you are upgrading from 2.2.x.x or
-newer, you may ignore this warning and upgrade directly to 2.7.x.
-
-
-
-== Gerrit Trigger Plugin in Jenkins
-
-
-*WARNING:* Upgrading to 2.7 may cause the Gerrit Trigger Plugin in Jenkins to
-stop working.  Please see the "New 'Stream Events' global capability" section
-below.
-
-
-== Release Highlights
-
-
-* New `copyMaxScore` setting for labels.
-* Comment links configurable per project.
-* Themes configurable per project.
-* Better support for binary files and images in diff screens.
-* User avatars in more places.
-* Several new REST APIs.
-
-
-== New Features
-
-
-=== General
-
-* New `copyMaxScore` setting for labels.
-+
-Labels can be link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.7/config-labels.html#label_copyMaxScore[
-configured] to copy approvals forward to the next patch set.
-
-* Comment links can be link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.7/config-gerrit.html#commentlink[
-defined per project in the project configuration].
-
-* Gerrit administrators can define project-specific themes.
-+
-Themes can be link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.7/config-themes.html[
-configured site-wide or per project].
-
-* New '/a/tools' URL.
-+
-This allows users to download the `commit-msg` hook via the command line if the
-Gerrit server requires authentication globally.
-
-* New 'Stream Events' global capability.
-+
-The link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.7/access-control.html#capability_streamEvents[
-Stream Events capability] controls access to the `stream-events` ssh command.
-+
-Only administrators and users having this capability are allowed to use `stream-events`.
-+
-If you are using the Gerrit Trigger Plugin in Jenkins, you must make sure that the
-'Non-Interactive Users' group, or whichever group the Jenkins user belongs to, is
-given the 'Stream Events' capability.
-
-* Allow opening new changes on existing commits.
-+
-The `%base` argument can be used with `refs/for/` to identify a specific revision the server should
-start to look for new commits at. Any commits in the range `$base..$tip` will be opened as a new
-change, even if the commit already has another change on a different branch.
-
-* New setting `gitweb.linkDrafts` to control if gitweb links are shown on drafts.
-+
-By default, Gerrit will show links to gitweb on all patch sets.  If the
-link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.7/config-gerrit.html#gitweb.linkDrafts[
-gitweb.linkDrafts setting] is set to 'false', links will not be shown on
-draft patch sets.
-
-* Allow changes to be automatically submitted on push.
-+
-Teams that want to use Gerrit's submit strategies to handle contention on busy
-branches can use `%submit` to create a change and have it
-link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.7/user-upload.html#auto_merge[
-immediately submitted], if the caller has Submit permission on `refs/for/<ref>`.
-
-* Allow administrators to see all groups.
-
-
-=== Web UI
-
-
-==== Global
-
-* User avatars are displayed in more places in the Web UI.
-
-* 'Diffy' is used as avatar for the Gerrit server itself.
-
-* A popup with user profile information is shown when hovering the
-mouse over avatar images.
-
-
-==== Change Screens
-
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=667[Issue 667]:
-Highlight patch sets that have drafts.
-+
-Patch sets having unpublished draft comments are highlighted with an icon.
-
-* Option to show relative times in change tables.
-+
-A new preference setting allows the user to decide if absolute or relative dates
-should be shown in change tables.
-
-* Option to set default visibility of change comments.
-+
-A new preference setting allows the user to set the default visibility of
-change comments.
-
-
-==== Diff Screens
-
-* Show images in side-by-side and unified diffs.
-
-* Show diffed images above/below each other in unified diffs.
-
-* Harmonize unified diff's styling of images with that of text.
-
-
-=== REST API
-
-
-Several new link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.7/rest-api.html[
-REST API endpoints] are added.
-
-==== Accounts
-
-
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.7/rest-api-accounts.html#get-diff-preferences[
-Get account diff preferences]
-
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.7/rest-api-accounts.html#set-diff-preferences[
-Set account diff preferences]
-
-
-==== Changes
-
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1820[Issue 1820]:
-link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.7/rest-api-changes.html#list-comments[
-List comments]
-
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.7/rest-api-changes.html#get-comment[
-Get comment]
-
-
-
-==== Projects
-
-
-* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.7/rest-api-projects.html#get-config[
-Get project configuration]
-
-
-=== ssh
-
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1088[Issue 1088]:
-Support link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.7/config-gerrit.html#sshd.kerberosKeytab[
-Kerberos authentication for ssh interaction].
-
-
-== Bug Fixes
-
-=== General
-
-* Postpone check for first account until adding an account.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1848[Issue 1848]:
-Mark `ALREADY_MERGED` changes as merged in the database.
-+
-If a change was marked `ALREADY_MERGED`, likely due to a bug in
-merge code, it does not end up in the list of changes to be submitted
-and never gets marked as merged despite the branch head already
-having advanced.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=600[Issue 600]:
-Fix change stuck in SUBMITTED state but actually merged.
-+
-When submitting a commit that has a tag, it could not be merged.
-
-* Fix null-pointer exception when dashboard title is not specified.
-+
-If the title is not specified, the path of the dashboard config file
-is used as title.
-
-* Allow label values to be configured with no text.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1966[Issue 1966]:
-Fix Gerrit plugins under Tomcat by avoiding Guice static filter.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2054[Issue 2054]:
-Expand capabilities of `ldap.groupMemberPattern`.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2098[Issue 2098]:
-Fix re-enabling of disabled plugins.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2128[Issue 2128]:
-Fix null-pointer exception when deleting draft patch set when previous
-draft was already deleted.
-
-
-=== Web UI
-
-
-* Properly handle double-click on external group in GroupTable.
-+
-Double-clicking on an external group opens the group's URL (if it
-is provided).
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1848[Issue 1848]:
-Don't discard inline comments when escape key is pressed.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1863[Issue 1863]:
-Drop Arial Unicode MS font and request only sans-serif.
-+
-Arial Unicode MS does not have a bold version. Selecting this font prevents
-correct display of bold text on Mac OS X. Simplify the selector to sans-serif
-and allow the browser to use the user's preferred font in this family.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1872[Issue 1872]:
-Fix tab expansion in diff screens when syntax coloring is on.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1904[Issue 1904]:
-Fix diff screens for files with CRLF line endings.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2056[Issue 2056]:
-Display custom NoOp label score for open changes.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2093[Issue 2093]:
-Fix incorrect title of "repo download" link on change screen.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2127[Issue 2127]:
-Remove hard-coded documentation links from the admin page.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2010[Issue 2010]:
-Fix null-pointer exception when searching for changes with the query
-`owner:self`.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2039[Issue 2039]:
-Fix browser null-pointer exception when ChangeCache is incomplete.
-
-
-=== REST API
-
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1819[Issue 1819]:
-Include change-level messages to the payload returned from
-the link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.7/rest-api-changes#get-change-detail[
-Get Change Detail REST API endpoint].
-
-* Correct URL encoding in 'GroupInfo'.
-
-
-=== Email
-
-* Log failure to access reviewer list for notification emails.
-
-* Log when appropriate if email delivery is skipped.
-
-
-=== ssh
-
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2016[Issue 2016]:
-Flush caches after adding or deleting ssh keys via the `set-account` ssh command.
-
-=== Tools
-
-
-* The release build now builds for all browser configurations.
-
-
-== Upgrades
-
-* `gwtexpui` is now built in the gerrit tree rather than linking a separate module.
-
-
-
-== Documentation
-
-
-* Update the access control documentation to clarify how to set
-link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.7/access-control.html#global_capabilities[
-global capabilities].
-
-* Clarify the
-link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.7/config-gerrit.html#cache_names[
-change cache configuration].
-
diff --git a/ReleaseNotes/ReleaseNotes-2.8.1.txt b/ReleaseNotes/ReleaseNotes-2.8.1.txt
deleted file mode 100644
index 5e32cf5..0000000
--- a/ReleaseNotes/ReleaseNotes-2.8.1.txt
+++ /dev/null
@@ -1,45 +0,0 @@
-= Release notes for Gerrit 2.8.1
-
-There are no schema changes from link:ReleaseNotes-2.8.html[2.8].
-
-link:https://www.gerritcodereview.com/download/gerrit-2.8.1.war[https://www.gerritcodereview.com/download/gerrit-2.8.1.war]
-
-== Bug Fixes
-* link:https://code.google.com/p/gerrit/issues/detail?id=2073[Issue 2073]:
-Changes that depend on outdated patch sets were missing in the related changes list.
-+
-After rebasing the first change the other changes disappeared from the related changes list.
-
-* Don't list the same change twice in related changes.
-
-* Fix plugin API packaging.
-+
-Parts from JGit's signed library were included in the plugin API. As a consequence unit
-tests were failing to execute against it.
-
-* Fix IllegalArgumentException in task queue comparator.
-+
-This could happen if you have a long queue and the state of a task (DONE, CANCELLED,
-RUNNING, READY, SLEEPING, OTHER) changes while the sorting is ongoing.
-
-* Delegate to the filters for init and destroy phases in AllRequestFilter.
-+
-This fixes a bug that prevented javamelody from working properly.
-
-* Fix ArrayOutOfBoundsException on initial commits.
-+
-This happened if a new patch set was given for an initial commit in a repository.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2320[Issue 2320],
-link:https://code.google.com/p/gerrit/issues/detail?id=2360[Issue 2360]:
-Enable syntax highlighting for CXX, HXX, Python, Go, Scala, BUCK and .gitmodules.
-
-* Preserve SNAPSHOT suffix in Maven artifact names.
-+
-The SNAPSHOT suffix was being removed, which prevented Buck from
-downloading the Gitblit plugin's custom artifacts from the Gerritforge
-repository.
-
-* Always show repo download command if repo download scheme is enabled.
-
-* Minor fixes in the documentation.
diff --git a/ReleaseNotes/ReleaseNotes-2.8.2.txt b/ReleaseNotes/ReleaseNotes-2.8.2.txt
deleted file mode 100644
index 99cb437..0000000
--- a/ReleaseNotes/ReleaseNotes-2.8.2.txt
+++ /dev/null
@@ -1,311 +0,0 @@
-= Release notes for Gerrit 2.8.2
-
-There are no schema changes from link:ReleaseNotes-2.8.1.html[2.8.1].
-
-Download:
-link:https://www.gerritcodereview.com/download/gerrit-2.8.2.war[
-https://www.gerritcodereview.com/download/gerrit-2.8.2.war]
-
-
-== Lucene Index
-
-* Support committing Lucene writes within a fixed interval.
-+
-The `ramBufferSize` and `maxBufferedDocs` options control how often the
-writer is flushed, but this does not fsync files on disk and thus
-might not be permanent, particularly in a machine under heavy load.
-+
-As a result, commits to the index may not be completed, and updates may
-be lost if the server goes down.
-+
-A new option `commitWithin` is added, to control how frequently the
-indexes are committed.
-
-
-== General
-
-* Only add "cherry picked from" when cherry picking a merged change.
-+
-The "(cherry picked from commit ...)" line was being added in the commit
-message when cherry picking from closed changes, which included those that were
-abandoned.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2513[Issue 2513]:
-Improve the "This patchset was cherry picked" message.
-+
-When cherry-picking a change, the message "This patchset was cherry picked to
-change: <Change-Id>" was added as a message on the change.  This was not very
-useful as the Change-Id is the same on the newly created change.
-+
-The message is changed to "This patchset was cherry picked to branch <branch
-name> as commit <SHA1>".
-
-* Fix PUSH permission check for draft changes.
-+
-It was not possible to block pushes to the `refs/drafts` namespace.
-
-* Don't allow project owners to create branches if create is blocked.
-+
-Project owners were able to create branches through the WebUI, REST and SSH
-even when the 'create reference' permission was actually blocked for them.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2397[Issue 2397]:
-Remove quotes and trailing period from "topic edited" messages.
-+
-The quotes and trailing period were causing linkification to fail for topics
-that were set to a URL.
-
-* Check if user can read HEAD commit when resolving detached HEAD.
-+
-If HEAD was detached the `GetHead` REST endpoint refused to resolve HEAD
-when the user was not a project owner.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2392[Issue 2392]:
-Keep `status:closed` limit below MySQL Connector/J's hard limit.
-+
-Since MySQL Connector/J 5.1.21 does not allow limits above 50M rows
-and aborts them with 'setMaxRows() out of range', we cannot use `MAX_VALUE`
-as limit for plain `status:closed` queries.
-
-* Fix IllegalArgumentException when running query with `limit:0` on secondary
-index.
-+
-Running a query with `limit:0` when the secondary index is enabled was causing
-an internal server error.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2331[Issue 2331]:
-Make sure `change-merged` event contains correct patch set number.
-+
-When a change is submitted with the cherry-pick strategy, or when the
-change is rebased with the "rebase if necessary" strategy, a new patch
-set is created.  The newly created patch set was not being set in the
-`change-merged` event.
-
-* Guard against `diff.mnemonicprefix` in `commit-msg` hook.
-+
-When `diff.mnemonicprefix` was enabled in the git config, committing
-changes with `git commit -v` caused the diff to be included in the
-generated commit message.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2453[Issue 2453]:
-Fix submit rule evaluation for non blocking labels.
-+
-Putting a negative score on a label configured as `NoBlock` was causing
-the submit button to be disabled.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2441[Issue 2441]:
-Allow to create branch with new commits.
-+
-Branches could not be created with a new commit which is not on other branches
-already.
-
-* Fix incompatibility between "Rebase if Necessary" and "copy scores".
-+
-When a project was set up with "Rebase if Necessary", one of its labels had
-`copyAllScoresOnTrivialRebase` or `copyMaxScore`, and a change that actually
-needed a trivial rebase was submitted, Gerrit first rebased the change, and in
-the process copied the approval for the label.  It then copied all the
-approvals, including the one already copied, which resulted in a constraint
-violation on the database.
-
-* Add `Implementation-Vendor` default manifest entry for plugins.
-+
-In buck, the `java_binary` rule merges manifest entries from dependent JARs
-unless the input JAR possesses these entries itself.  This was causing some
-plugins to display the wrong vendor information if they had dependency on
-another JAR file that provided a `Implementation-Vendor` value.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2498[Issue 2498]:
-Handle null commits when updating submodules.
-+
-In some edge cases it was possible that a null commit would exist, and this
-caused a crash when updating submodules.
-
-* Update and insert comments/approvals in a single step.
-+
-When a review includes both new label scores and updates to existing label
-scores, use `upsert` to record them all at the same time, rather than in
-separate `update` and `insert` operations.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2374[Issue 2374]:
-Prevent duplicate commits in same project when uploading to `refs/changes/n`.
-+
-Under certain circumstances, when pushing to `refs/changes/n`, the same
-commit could be pushed onto multiple changes even if the changes were on the
-same branch.
-
-* Remove dependency on joda time library in gerrit launcher.
-+
-The joda time library was being unnecessarily packaged in the root of
-the gerrit.war file.
-
-== Change Screen / Diff Screen
-
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2398[Issue 2398]:
-Enable syntax highlighting for Groovy, Clojure, Lisp, Ruby and Perl.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2416[Issue 2416]:
-Fix copy functionality in Firefox and Safari.
-+
-Ctrl-C/Cmd-C was activating the 'insert comment' feature, and preventing the
-browser from copying the selected text to the clipboard.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2428[Issue 2428]:
-Fix truncation of long lines in side-by-side diff.
-+
-Lines whose length exceeded the width of the window were being truncated
-and only shown fully after zooming out/in on the browser.
-
-* Fix handling of the enter key when editing the topic.
-+
-The enter key was causing the file diff view to open, instead of confirming
-the topic edit.
-
-* Fix wrong button being passed to the 'revert' action.
-+
-The action was using the cherry-pick button instead of the revert button.
-
-* Improve the error message shown when cherry picking a change fails.
-+
-The error message "Could not create merge commit during cherry pick" was
-confusing for users, and is replaced with simply "Cherry pick failed".
-
-* Add newline on commit messages created by cherry picking a change in the UI
-or via the REST API.
-+
-If a commit was cherry-picked from the UI or via the REST API, the
-trailing newline on the end of the commit message was lost.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2405[Issue 2405]:
-Update change to invalidate cache after deletion of draft revision.
-+
-When a non-current draft patch set was deleted no update of the change
-was made, causing the change screen to not work properly because it
-relied on cached data.
-
-* Extend change screen's horizontal bars to full width.
-+
-This allows the title of the change message to have some padding within
-the bar.
-
-* Fix tab alignment to be correct width in side-by-side diff.
-+
-This fixes the tab width to be the user's preference, rather than
-1 + user's preference when show tabs is enabled.
-
-* Fill the browser width in side-by-side diff.
-+
-Filling the browser available space with each side of the diff at
-50% size allows the user to more easily view long lines if they
-have a wide display, and better fit on more narrow displays by
-splitting the available width at 50%.
-
-* Fire `comment-added` stream event even when mail notification is not sent.
-+
-Unchecking the "and send email" option on the change screen prevented the
-`comment-added` event from being sent to the event stream.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2493[Issue 2493]:
-Set uploader to current user in `patchset-created` event upon rebasing
-a change in the UI.
-+
-When a change was rebased from the change screen, the `uploader` field
-of the `patchset-created` event was incorrectly set to the original
-change uploader, rather than the user that performed the rebase.
-
-* Display a warning instead of an error when the intraline diff times out.
-+
-Displaying an error was confusing for users and administrators.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2514[Issue 2514]:
-Display an error message when commentlink regex is invalid.
-+
-If a commentlink was configured with an invalid regular expression, for example
-an expression that is valid in Java but not in JavaScript, the change screen
-failed to load.
-+
-Now, an error message will be displayed in the UI.
-
-== ssh
-
-
-* Support for nio2 backend is removed.
-+
-The nio2 backend is link:https://issues.apache.org/jira/browse/SSHD-252[
-broken in MINA SSHD].  Support is removed until the next release of MINA
-SSHD in which it is fixed.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2424[Issue 2424]:
-Add descriptions on commands that are disabled in slave mode.
-+
-Commands that are disabled on a server running in slave mode were being listed
-with an empty description.
-
-* Remove obsolete commands from slave mode commands list.
-+
-The `approve` and `replicate` commands, which no longer exist, were still being
-listed in the available commands shown when running the ssh `gerrit` command
-without any arguments on a server running in slave mode.
-
-* Remove 'including replication' from the `show-queue` command description.
-+
-The `replication` command is provided by the replication plugin, so it is no
-longer relevant to mention this in the description of a core command.
-
-* Fix aliasing of SSH commands.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2515[Issue 2515]:
-Fix internal server error when updating an existing label with `gerrit review`.
-
-== Replication Plugin
-
-
-* Never replicate automerge-cache commits.
-+
-Commits in the `automerge-cache` namespace are used on the master to
-improve performance of the diff UI.  They are not needed on remote
-mirrors and it is wasteful to replicate them.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2420[Issue 2420]:
-Fix failure to create missing remote repository via git:// protocol.
-+
-When replicating to a mirror over the anonymous git:// protocol and the
-repository did not exist on the remote (i.e. if the remote was offline
-when the repository was originally created), the replication failed with
-a "remote repository error", rather than the expected "no repository".
-
-* Improve info logging related to repository creation and deletion, and
-differentiate between local and remote repository errors.
-
-* Update documentation to clarify replication of refs/meta/config when
-refspec is 'all refs'.
-
-== Upgrades
-
-
-* JGit is upgraded to 3.2.0.201312181205-r
-
-== Documentation
-
-
-* Add missing documentation of the secondary index configuration.
-+
-Document that open and closed changes are indexed in separate indexes,
-and for Lucene indexes the RAM buffer size and maximum buffered documents
-can be configured.
-
-* Correct the Gerrit download link.
-+
-The link on the documentation index was pointing to the Google Code page,
-which has not been used for some time.
-
-* Correct the description of the `revisions` field in the REST API's
-`ChangeInfo` entity.
-
-* Add a link from the plugin documentation to the validation listeners API
-documentation.
-
-* Remove double border around code snippets.
-
-* Add border around tables.
diff --git a/ReleaseNotes/ReleaseNotes-2.8.3.txt b/ReleaseNotes/ReleaseNotes-2.8.3.txt
deleted file mode 100644
index f94dce0..0000000
--- a/ReleaseNotes/ReleaseNotes-2.8.3.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-= Release notes for Gerrit 2.8.3
-
-There are no schema changes from link:ReleaseNotes-2.8.2.html[2.8.2].
-
-Download:
-link:https://www.gerritcodereview.com/download/gerrit-2.8.3.war[
-https://www.gerritcodereview.com/download/gerrit-2.8.3.war]
-
-
-== Bug Fixes
-
-* Fix for merging multiple changes with "Cherry Pick", "Merge Always" and
-"Merge If Necessary" strategies.
-+
-If 2 or more changes were pending submit to the same project and branch,
-it was possible for them to all be marked as status "merged" but only some of
-them to actually land into the branch.
-
-
-== Documentation
-
-* Minor fixes in the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8.3/dev-buck.html[
-buck build documentation].
-
-* Clarification of the `commitWithin` setting in the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8.3/config-gerrit.html#__a_id_index_a_section_index[
-Lucene index configuration].
-+
-Configuring the Lucene index to commit after every write can cause
-poor performance of the reindex program.
-
diff --git a/ReleaseNotes/ReleaseNotes-2.8.4.txt b/ReleaseNotes/ReleaseNotes-2.8.4.txt
deleted file mode 100644
index 8aac71c..0000000
--- a/ReleaseNotes/ReleaseNotes-2.8.4.txt
+++ /dev/null
@@ -1,166 +0,0 @@
-= Release notes for Gerrit 2.8.4
-
-There are no schema changes from link:ReleaseNotes-2.8.3.html[2.8.3].
-
-Download:
-link:https://www.gerritcodereview.com/download/gerrit-2.8.4.war[
-https://www.gerritcodereview.com/download/gerrit-2.8.4.war]
-
-
-== Bug Fixes
-
-
-=== Secondary Index
-
-
-* Disable `commitWithin` when running Reindex.
-+
-If `commitWithin` was set to a low value, it caused poor performance
-when running the Reindex program on sites with a large amount of changes.
-+
-The `commitWithin` setting is now disabled from within Reindex by overriding
-the configuration with '-1'. Index updates are auto-flushed but not
-auto-committed, which is the least safe but the most efficient for reindexing
-the entire site.
-
-* Fix memory leak in Lucene index.
-+
-`SubIndex.NrtFuture` objects were being added as listeners of `searchManager`
-and never released.
-
-=== Change Screen
-
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2456[Issue 2456]:
-Respect the comment visibility preference in the new change screen.
-+
-The "Expand All" and "Collapse All" settings now work like they did on
-the old change screen.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2538[Issue 2538]:
-Don't show the "Patch File" download for merge commits.
-+
-The patch file download does not work for commits with more than one
-parent (i.e. merges) and results in an error being displayed. Now the
-link is not shown for merge commits; a solution for merge patches will
-be investigated for future releases.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2526[Issue 2526]:
-Hide the `refs/heads/` prefix in branch suggestion list for cherry-picks.
-+
-Regular branches like `refs/heads/stable/` will now be displayed as
-just `stable` in the suggestion list when cherry-picking a change in the
-Web UI.
-
-* Disable the "Save" button after it is pressed when editing the commit
-message.
-+
-The "Save" button was not being disabled, and could be pressed multiple
-times while the message was being saved, resulting in multiple new patch
-sets being created.
-
-* Fix syntax highlighting for shell files in new side-by-side diff.
-
-* Fix inconsistent behavior of diff view when viewing binary files.
-+
-In the new change screen, if the user clicked on a binary file in
-the file list, the unified view was used. Then when navigating to
-a previous or next file that is not binary, the diff view stayed in
-the old unified setting.
-
-* Make the skip bar more user friendly in side-by-side diff.
-+
-The whole "skipped xxx common lines" text is now a link, rather
-than just the number.
-
-* Show previous and next file shortcut keys in new side-by-side
-navigation arrow tooltips.
-+
-In the top right corner of a file the navigation cluster has a
-tooltip on the up arrow but did not show the tooltip on the left
-or right arrows.
-
-=== Plugins
-
-
-* Fix ChangeListener auto-registered implementations.
-+
-Add missing `@ExtensionPoint` in `ChangeListener` so implementors can
-use `@Listen` to register.
-
-* Escape dollar sign in plugin manifest entries.
-+
-Plugins could be built, but not loaded, if they had any manifest entries
-that contained a dollar sign.
-
-=== Misc
-
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2564[Issue 2564],
-link:https://code.google.com/p/gerrit/issues/detail?id=2571[Issue 2571]:
-Emit ref-updated event when editing project access via Web UI.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2557[Issue 2557]:
-By default don't allow admins to create new branches by push.
-+
-When pushing changes it is easy to make a typo in the refspec and in this case
-new branches should not be created. If administrators want to create branches
-by push they should explicitly assign themselves the needed access rights.
-
-* Do not refresh project list if filter did not change.
-+
-The project list was being refreshed on every key event even if the
-filter did not change, e.g. moving the cursor inside the text entry was
-causing the list to update unnecessarily.
-
-* Fix mail thread getting stuck when waiting for response from SMTP server.
-+
-It is now possible to configure the default thread pool size, the size of
-the thread pool for sending emails, and the SMTP server connection timeout.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2215[Issue 2215]:
-Paginate the project list screen.
-+
-The project list screen was taking a long time to render over a large
-amount of projects (1,000+) and with even larger number of projects
-(3,000+), it could make the browser unresponsive.
-+
-The project list screen now uses pagination to resolve this issue. The
-number of projects displayed is determined by the 'Maximum Page Size'
-user preference.
-+
-Option 'S' is added to the projects REST API to support query offset.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2599[Issue 2599]:
-Always auto confirm adding reviewers in `set-reviewers` SSH command.
-+
-If a group contains more than 'addreviewer.maxWithoutConfirmation'
-members, adding it as reviewer to a change requires a confirmation. A
-user should only be asked for the confirmation when reviewers are
-added from the Web UI but not when the `set-reviewers` SSH command is
-used.
-
-* Set uploader to current user in `patchset-created` event upon cherry-picking.
-+
-When using the Web UI (both old and new change screens) to cherry-pick a
-change to a branch that already has this change (e.g. cherry-picking
-on the same branch to get rid of dependencies), the corresponding
-`patchset-created` event had its `patchSet.uploader` set to the change's
-owner instead of the current user. It is now set to the current user,
-so stream-events consumers can properly detect who uploaded the
-rebased patch set.
-
-=== Documentation
-
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1273[Issue 1273]:
-Update the MySQL documentation concerning character sets.
-+
-The setup documentation is updated to mention that there is no need to use
-latin1 encoding if you are using an engine other than MyISAM.
-
-* Use consistent grammatical tense in ssh command descriptions.
-
-* Add more detail about `refs/drafts` in
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8.4/access-control.html[
-access control documentation].
diff --git a/ReleaseNotes/ReleaseNotes-2.8.5.txt b/ReleaseNotes/ReleaseNotes-2.8.5.txt
deleted file mode 100644
index ae30530..0000000
--- a/ReleaseNotes/ReleaseNotes-2.8.5.txt
+++ /dev/null
@@ -1,116 +0,0 @@
-= Release notes for Gerrit 2.8.5
-
-Download:
-link:https://www.gerritcodereview.com/download/gerrit-2.8.5.war[
-https://www.gerritcodereview.com/download/gerrit-2.8.5.war]
-
-== Schema Changes and Upgrades
-
-
-* There are no schema changes from link:ReleaseNotes-2.8.4.html[2.8.4].
-
-* SSHD is updated to version 0.11.0.
-+
-See the 'ssh' section of 'Bug Fixes' below for details.
-
-* Bouncycastle is updated to version 1.49.
-+
-*WARNING:* Gerrit is not shipped with Bouncycastle included. To get the
-updated library files, the site must be updated:
-+
-----
-  java -jar gerrit.war init -d site_path
-----
-
-== Bug Fixes
-
-
-=== Secondary Index
-
-
-* Fix deadlocks on index shutdown.
-
-
-=== Change Screen
-
-
-* Only permit current patch set to edit the commit message.
-+
-Do not allow users to replace a more recent patch set with an older
-patch set when there is a race between the web UI and the command
-line git client.
-
-* Prevent draft changes from being abandoned.
-+
-When a draft change was abandoned it was published to all
-users by setting the status to ABANDONED.  Restoring the change
-effectively published the change, as the status was set to NEW.
-
-* Don't show the submit button for draft patch sets.
-+
-The button was enabled for all open changes, but if the patch set
-was a draft, pressing it resulted in an error.
-
-* Only reset the commit message text on cancel.
-+
-Allow the user to begin editing the commit message, dismiss the
-box by clicking outside of it (e.g. to copy part of a file name
-from the Files table), and then re-open the current draft text
-without resetting the box.
-+
-Only reset the box when the user explicitly clicks Cancel.
-
-* Fix failure to load side-by-side diff due to "ISE EditIterator out of bounds"
-error.
-
-=== ssh
-
-* Upgrade SSHD to version 0.11.0.
-+
-Fixes link:https://code.google.com/p/gerrit/issues/detail?id=2406[Issue 2406]:
-"git clone" hangs after 100% resolving deltas with git over SSH.
-+
-Fixes a number of other issues including a
-link:https://issues.apache.org/jira/browse/SSHD-307[null pointer exception]
-that could cause ssh commands to hang.
-
-* Upgrade bouncycastle to version 1.49.
-+
-Required by the SSHD upgrade.
-
-* Re-enable nio2 backend.
-+
-The nio2 backend was disabled in Gerrit version 2.8.4 because of a
-link:https://issues.apache.org/jira/browse/SSHD-252[bug in SSHD].  That bug
-was fixed in SSHD version 0.10.0, so now we can re-enable nio2.
-
-=== Misc
-
-
-* Keep old timestamps during data migration.
-+
-Migrating the change database through schema 77, which was introduced in
-Gerrit 2.6, was causing patch set approval timestamps to be changed.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2607[Issue 2607]:
-Fix incorrect "commit already exists (in the project)" error.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2569[Issue 2569]:
-Enable automatic close changes on `refs/meta/config`.
-+
-Changes pushed for review on `refs/meta/config` and then force pushed
-into the repository were not being automatically closed.
-
-* Do not refresh group list if filter did not change.
-+
-The group list was being refreshed on every key event even if the
-filter did not change, e.g. moving the cursor inside the text entry was
-causing the list to update unnecessarily.
-
-* Paginate the group list screen.
-+
-The group list screen now uses pagination. The number of groups displayed is
-determined by the 'Maximum Page Size' user preference.
-+
-Option 'S' is added to the groups REST API to support query offset.
-
diff --git a/ReleaseNotes/ReleaseNotes-2.8.6.1.txt b/ReleaseNotes/ReleaseNotes-2.8.6.1.txt
deleted file mode 100644
index 81e7297..0000000
--- a/ReleaseNotes/ReleaseNotes-2.8.6.1.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-= Release notes for Gerrit 2.8.6.1
-
-There are no schema changes from link:ReleaseNotes-2.8.6.html[2.8.6].
-
-Download:
-link:https://www.gerritcodereview.com/download/gerrit-2.8.6.1.war[
-https://www.gerritcodereview.com/download/gerrit-2.8.6.1.war]
-
-== Bug Fixes
-
-* The fix in 2.8.6 for the merge queue race condition caused a regression
-in database transaction handling.
-
-* The fix in 2.8.6 for the LIMIT clause caused a regression in Oracle
-database support.
-
-
-== Updates
-
-* gwtorm is updated to 1.7.3
diff --git a/ReleaseNotes/ReleaseNotes-2.8.6.txt b/ReleaseNotes/ReleaseNotes-2.8.6.txt
deleted file mode 100644
index a810ad0..0000000
--- a/ReleaseNotes/ReleaseNotes-2.8.6.txt
+++ /dev/null
@@ -1,44 +0,0 @@
-= Release notes for Gerrit 2.8.6
-
-There are no schema changes from link:ReleaseNotes-2.8.5.html[2.8.5].
-
-Download:
-link:https://www.gerritcodereview.com/download/gerrit-2.8.6.war[
-https://www.gerritcodereview.com/download/gerrit-2.8.6.war]
-
-*Warning*: Support for MySQL's MyISAM storage engine is discontinued.
-Only transactional storage engines are supported.
-
-== Bug Fixes
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2034[Issue 2034],
-link:https://code.google.com/p/gerrit/issues/detail?id=2383[Issue 2383],
-link:https://code.google.com/p/gerrit/issues/detail?id=2702[Issue 2702]:
-Fix race condition in change merge queue when using Cherry-Pick submit
-strategy.
-+
-There was a race in the merge queue between changes submitted via
-the UI, and merges scheduled by the background merge queue reload.
-+
-This resulted in multiple submit actions being scheduled, leading
-to corrupt changes.
-+
-Execute cherry-pick submit DML operations in a database transaction
-boundaries. In combination with implemented transaction management
-for Jdbc dialects it solves the problem recovering from collisions
-between interactive actions and background jobs.
-
-* In gwtorm the LIMIT clause was only honored when followed by a
-constant integer.
-+
-When followed by a placeholder "?" it wasn't included in the generated database
-query. This caused poor performance when moving to the next change page for very
-big projects.
-
-* Fix sporadic SSHD handshake failures
-(link:https://issues.apache.org/jira/browse/SSHD-330[SSHD-330]).
-
-== Updates
-
-* gwtorm is updated to 1.7.1
-* sshd is updated to 0.11.1-atlassian-1
diff --git a/ReleaseNotes/ReleaseNotes-2.8.txt b/ReleaseNotes/ReleaseNotes-2.8.txt
deleted file mode 100644
index 472f0dc..0000000
--- a/ReleaseNotes/ReleaseNotes-2.8.txt
+++ /dev/null
@@ -1,808 +0,0 @@
-= Release notes for Gerrit 2.8
-
-
-Gerrit 2.8 is now available:
-
-link:https://www.gerritcodereview.com/download/gerrit-2.8.war[
-https://www.gerritcodereview.com/download/gerrit-2.8.war]
-
-
-== Schema Change
-
-
-*WARNING:* This release contains schema changes.  To upgrade:
-----
-  java -jar gerrit.war init -d site_path
-----
-
-*WARNING:* Upgrading to 2.8.x requires the server be first upgraded to 2.1.7 (or
-a later 2.1.x version), and then to 2.8.x.  If you are upgrading from 2.2.x.x or
-later, you may ignore this warning and upgrade directly to 2.8.x.
-
-*WARNING:* The replication plugin now automatically creates missing repositories
-on the destination if during the replication of a ref the target repository is
-found to be missing. This is a change in behavior of the replication plugin. To go
-back to the old behavior, set the parameter `remote.NAME.createMissingRepositories`
-in the `replication.config` file to `false`.
-
-*WARNING:* The deprecated `approve` alias for the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/cmd-review.html[
-review] SSH command has been removed. This is important for all users
-of the Jenkins link:https://wiki.jenkins-ci.org/display/JENKINS/Gerrit+Trigger[
-Gerrit Trigger Plugin] since this plugin by default uses the `approve`
-command to vote and comment on changes in Gerrit. If you use the Gerrit
-Trigger Plugin, go to its global configuration in Jenkins and adapt the
-Gerrit commands to use the `review` command instead of the `approve`
-command.
-
-*WARNING:* The new change screen only displays download commands if the
-`download-commands` core plugin or any other plugin providing download
-commands is installed. The `download-commands` plugin provides the
-standard download schemes and commands. It is packaged together with
-Gerrit and can be installed during the
-link:https://gerrit-review.googlesource.com/Documentation/pgm-init.html[
-site initialization].
-
-
-== Release Highlights
-
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/intro-change-screen.html[
-New change screen] with completely redesigned UI and fully using the REST API.
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/config-gerrit.html#__a_id_index_a_section_index[
-Secondary indexing with Lucene and Solr].
-
-* Lots of new link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api.html[
-REST API endpoints].
-
-* New
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/dev-plugins.html#ui_extension[
-UI extension] and
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/js-api.html[
-JavaScript API] for plugins.
-
-* New build system using Facebook's link:http://facebook.github.io/buck/[Buck].
-
-* New core plugin: Download Commands.
-
-
-== New Features
-
-=== Build
-
-* Gerrit is now built with
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/dev-buck.html[
-Buck].
-
-* Documentation is now built with Buck and link:http://asciidoctor.org[Asciidoctor].
-
-
-=== Indexing and Search
-
-Gerrit can be configured to use a
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/config-gerrit.html#__a_id_index_a_section_index[
-secondary index] with Lucene or Solr.
-
-Existing search operations use the secondary index, when enabled, to increase
-performance and reduce resource usage.
-
-The following additional search operations are possible when secondary indexing
-is enabled:
-
-* New
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/user-search.html#comment[
-`comment` search operator].
-
-* The link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/user-search.html#file[
-`file` operator] can be used to find changes on the specified file.
-
-* Regular expressions are allowed in `file` searches.
-
-
-*WARNING:* After enabling the secondary index, the index must be built using the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/pgm-reindex.html[
-reindex program] before restarting the Gerrit server.
-
-
-=== Configuration
-
-* Project owners can define `receive.maxObjectSizeLimit` in the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/config-gerrit.html#receive.maxObjectSizeLimit[
-project configuration] to further reduce the global setting.
-
-* Site administrators can define a
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/config-mail.html#_footer_vm[
-footer template] that will be appended to the end of all outgoing emails after
-the 'ChangeFooter' and 'CommentFooter'.
-
-* New `topic-changed` hook and stream event is fired when a change's topic is
-edited from the Web UI or via a REST API.
-
-* New options `--list-plugins` and `--install-plugins` on the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/pgm-init.html[
-site initialization command].
-
-* New `auth.httpDisplaynameHeader` and `auth.httpEmailHeader` in the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/config-gerrit.html#__a_id_auth_a_section_auth[
-authentication configuration].
-+
-When using HTTP-based authentication, the SSO can be delegated to check not only
-the user credentials but also to fetch the full user-profile.
-+
-With the config properties `auth.httpDisplaynameHeader` and `auth.httpEmailHeader`
-it is possible to configure the name of the headers used for propagating this extra
-information and enforce them on the user profile during login and beyond.
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/config-gerrit.html#__a_id_httpd_a_section_httpd[
-Customizable registration page for HTTP authentication].
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/config-gerrit.html#__a_id_httpd_a_section_httpd[
-Configurable external `robots.txt` file].
-
-* Support for
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/database-setup.html#createdb_oracle[
-Oracle database].
-
-* New bash completion script for autocompletion of parameters to the gerrit.sh wrapper.
-
-* The site can be
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/config-auto-site-initialization.html[
-auto-initialized on server startup].
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/config-gerrit.html#httpd.filterClass[
-Configurable filtering of HTTP traffic through Gerrit's HTTP protocol].
-
-* Labels can be
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/config-labels.html#httpd.label_copyAllScoresIfNoCodeChange[
-configured to copy scores forward to new patch sets if there is no code change].
-
-* Labels can be
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/config-labels.html#httpd.label_copyAllScoresOnTrivialRebase[
-configured to copy scores forward to new patch sets for trivial rebases].
-
-=== Web UI
-
-
-==== Global
-
-* The change status is shown in a separate column on dashboards and search results.
-
-==== Change Screens
-
-
-* New change screen with completely redesigned UI, using the REST API.
-+
-Site administrators can
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/config-gerrit.html#gerrit.changeScreen[
-configure which change screen is shown by default].
-+
-Users can choose which one to use in their personal preferences, either using
-the site default or explicitly choosing the old one or new one.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=141[Issue 141]:
-In the new change screen, comments can be added on a range of lines.
-
-* New button to cherry-pick the change to another branch.
-
-* When issuing a rebase via the Web UI, the committer is now the logged in
-  user, rather than "Gerrit Code Review".
-+
-If the user has more than one email address, the preferred email address will
-be used.
-
-* Default user's full name to git committer name if user has not configured a
-full name in their profile.
-
-* Include comment author attributes in comment panels.
-+
-Comment author's email address and name are included as attributes in comment
-panels.  This makes it easier to filter out CI-based comments using user
-scripts.
-
-* Copy reviewed flag to new patch sets for identical files.
-+
-If a user has already seen and reviewed a file, the 'reviewed' flag is forwarded
-on to the next patch set when the content of the file in the next patch set is
-identical to the reviewed file.
-
-* "Uploaded Patch Set 1" change message is added on changes when they
-are uploaded.
-
-
-=== REST API
-
-* Several new link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api.html[
-REST API endpoints] are added.
-
-* REST views can determine how long their response should be cached.
-
-* REST views can handle 'HTTP 422 Unprocessable Entity' responses.
-
-==== Access Rights
-
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-access.html#list-access[
-List access rights for project(s)]
-
-==== Accounts
-
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-accounts.html#create-account[
-Create account]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-accounts.html#get-account-name[
-Get account full name]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-accounts.html#set-account-name[
-Set account full name]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-accounts.html#delete-account-name[
-Delete account full name]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-accounts.html#list-account-emails[
-List account email addresses]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-accounts.html#get-account-email[
-Get account email address]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-accounts.html#set-preferred-email[
-Set account preferred email address]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-accounts.html#create-account-email[
-Create account email]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-accounts.html#delete-account-email[
-Delete account email]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-accounts.html#get-active[
-Get account state]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-accounts.html#set-active[
-Set account state to active]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-accounts.html#delete-active[
-Set account state to inactive]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-accounts.html#get-http-password[
-Get account HTTP password]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-accounts.html#set-http-password[
-Set or generate account HTTP password]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-accounts.html#delete-http-password[
-Delete account HTTP password]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-accounts.html#list-ssh-keys[
-List account SSH keys]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-accounts.html#get-ssh-key[
-Get account SSH key]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-accounts.html#add-ssh-key[
-Add account SSH key]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-accounts.html#delete-ssh-key[
-Delete account SSH key]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-accounts.html#get-username[
-Get account username]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-accounts.html#get-starred-changes[
-Get starred changes]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-accounts.html#star-change[
-Star change]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-accounts.html#unstar-change[
-Unstar change]
-
-==== Changes
-
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-changes.html#rebase-change[
-Rebase change]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-changes.html#cherry-pick[
-Cherry-pick revision]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-changes.html#get-content[
-Get content of a file in a revision]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-changes.html#get-patch[
-Get revision as a formatted patch]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-changes.html#get-diff[
-Get diff of a file in a revision]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-changes.html#get-commit[
-Get parsed commit of a revision]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-changes.html#publish-draft-change[
-Publish draft change]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-changes.html#delete-draft-change[
-Delete draft change]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-changes.html#suggest-reviewers[
-Suggest reviewers]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-changes.html#get-included-in[
-Get included in]
-
-
-==== Config
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-config.html#get-capabilities[
-Get capabilities]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-config.html#get-version[
-Get version] (of the Gerrit server)
-
-
-==== Projects
-
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-projects.html#list-branches[
-List branches]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-projects.html#get-branch[
-Get branch]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-projects.html#create-branch[
-Create branch]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-projects.html#delete-branch[
-Delete branch]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-projects.html#list-child-projects[
-List child projects]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-projects.html#get-child-project[
-Get child project]
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/rest-api-projects.html#set-config[
-Set configuration]
-
-
-=== Capabilities
-
-
-New global capabilities are added.
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/access_control.html#capability_generateHttpPassword[
-Generate Http Password] allows non-administrator users to generate HTTP
-passwords for users other than themselves.
-+
-This capability would typically be assigned to a non-interactive group
-to be able to generate HTTP passwords for users from a tool or web service
-that uses the Gerrit REST API.
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/access_control.html#capability_runAs[
-Run As] allows users to impersonate other users by setting the `X-Gerrit-RunAs`
-HTTP header on REST API calls.
-+
-Site administrators do not inherit this capability;  it must be granted
-explicitly.
-
-
-=== Emails
-
-* The `RebasedPatchSet` template is removed.  Email notifications for rebased
-changes are now sent with the `ReplacePatchSet` template.
-
-* Comment notification emails now include context of comments that are replied
-to, and links to the file(s) in which comments are made.
-
-
-=== Plugins
-
-
-==== Global
-
-
-* Plugins may now contribute buttons to various parts of the UI using the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/dev-plugins.html#ui_extension[
-UI extension] and
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/js-api.html[
-JavaScript API].
-
-* Plugins may now provide an 'About' section on their documentation index page.
-
-* Plugins may now provide separate sections for REST API and servlet
-documentation on their index page.
-
-* Plugins may now provide
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/config-validation.html#pre-merge-validation[
-pre-merge validation steps].
-
-* Plugins may now provide
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/dev-plugins.html#capabilities[
-Global capabilities].
-
-* Plugins may now
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/dev-plugins.html#plugin_name[
-define their own name] and get the name injected at runtime.
-
-* The "hello world" plugin is replaced with the "cookbook plugin" which has more
-examples of the plugin API's usage.
-
-* Plugins may now trigger and listen to a "project deleted"
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/dev-plugins.html#events[
-event].
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2101[Issue 2101]:
-Plugins implementing LifecycleListener can use auto registration.
-
-* Plugins may bind REST endpoints with empty view names.
-
-* Plugins may now provide
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/dev-plugins.html#top-menu-extensions[
-entries in Gerrit's top menu].
-
-* Plugins may now
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/dev-plugins.html#stream-events[
-send events to the events stream].
-
-* Plugins may now bind multiple SSH commands to the same implementation class.
-
-* Plugins may now provide
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/dev-plugins.html#download-commands[
-download schemes and download commands].
-+
-Commonly used download schemes and commands are moved out of core
-Gerrit and are now implemented by a new core plugin, `download-commands`.
-
-
-
-==== Commit Message Length Checker
-
-
-* Commits whose subject or body length exceeds the limit can be rejected.
-
-==== Replication
-
-* Automatically create missing repositories on the destination.
-+
-If during the replication of a ref the target repository is found to be missing,
-the repository is automatically created.
-+
-This is a change in behavior of the replication plugin. To go back to the old
-behavior, set the parameter `remote.NAME.createMissingRepositories` in the
-`replication.config` file to `false`.
-
-* Support for replication of project deletions.
-+
-The replication plugin can now be configured to listen to project deletion events
-and to replicate the project deletions. By default project deletions are *not*
-replicated.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=1880[Issue 1880]:
-Make `{name}` placeholder optional when replicating a single project.
-+
-The `{$name}` placeholder is optional when replicating a single project,
-allowing a single project to be replicated under a different name.
-
-* Project names can be matched with wildcard or regex patterns in `replication.config`.
-
-* The `replication start` command does not exit until replication is finished
-when the `--wait` option is used.
-
-* The `replication start` command displays a summary of the replication status.
-
-* Retry counts are added to replication task names, so they can be seen in the
-output of the `show-queue` command.
-
-* The `remoteNameStyle` option can be set to `basenameOnly` to replicate projects
-using only the basename on the target server.
-
-* The `startReplication` global capability is now provided by the plugin.
-
-* Pushes to each destination URI are serialized.
-+
-Scheduling a retry to avoid collision with an in-flight push is differentiated
-from a retry due to a transport error.  In the case of collision avoidance, the
-job is rescheduled according to the replication delay, rather than the retry
-delay.
-
-
-=== ssh
-
-
-* The `commit-msg` hook installation command is now
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/config-gerrit.html#gerrit.installCommitMsgHookCommand[
-configurable].
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/cmd-ls-members.html[
-New `ls-members` command].
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/cmd-set-members.html[
-New `set-members` command].
-+
-New command to manipulate group membership. Members can be added or removed
-and groups can be included or excluded in one specific group or number of groups.
-
-* The full commit message is now included in the data sent by the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/cmd-stream-events.html[
-`stream-events` command].
-
-* The link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/cmd-show-queue.html[
-`show-queue` command] now shows the time that a task was added to the queue.
-
-* The deprecated `approve` alias of the `review` command is removed.
-
-* The 'CHANGEID,PATCHSET' format for specifying a patch set in the `review` command
-is no longer considered to be a 'legacy' feature that will be removed in future.
-
-=== Daemon
-
-
-* Add `--init` option to Daemon to initialize site on daemon start.
-+
-The `--init` option will also upgrade an already existing site and is processed in
-non-interactive (batch) mode.
-
-
-== Bug Fixes
-
-
-=== General
-
-
-* Use the parent change on the same branch for rebases.
-+
-Since there can be multiple changes with the same commit on different branches,
-use the parent change on the same branch during rebase.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=600[Issue 600]:
-Fix change stuck in SUBMITTED state but actually merged.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1699[Issue 1699]:
-Fix handling of projects with trailing ".git" suffix.
-
-* Limit retrying of submitted changes to 12 hours.
-
-* Don't allow project owners to delete branches if force push is blocked.
-
-* Allow usernames to begin with digit.
-
-* Verify access to source ref during add branch operation.
-+
-Previously Gerrit didn't check access to source ref during add branch
-operation. Because of that users could create a branch from any known
-commit SHA1, even when they didn't have access to that commit.
-
-* Fix Gerrit API sources JAR contents.
-+
-The gerrit-extension-api-X.Y-all-sources.jar did not actually contain any
-sources.
-
-* Generate javadoc for Gerrit Extension and Plugin APIs.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2244[Issue 2244]:
-Update patch status before skipping duplicate emails.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1640[Issue 1640]:
-Catch missing LDAP accounts in group membership.
-
-* Use `rev-parse` to find gitdir when generating commit-msg hook hint.
-
-* Performance Fix: Minimize number of advertisedHaves.
-+
-By filtering the refs before the objectIds are added to advertisedHaves,
-lots of time can be saved when pushing to complex Gits.
-
-
-=== Configuration
-
-
-* Do not persist default project state in `project.config`.
-
-* Honor the `gerrit.canonicalWebUrl` setting when opening the browser after init.
-
-* Fix 'query disabled' error when Query Limit is set.
-
-* Honor the `gerrit.createChangeId` setting from the git config in the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/cmd-hook-commit-msg.html[
-`commit-msg` hook].
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2045[Issue 2045]:
-Define user scope when parsing server config.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1990[Issue 1990]:
-Support optional Certificate Revocation List (CRL) with `CLIENT_SSL_CERT_LDAP`.
-
-* Do not override error and gc logging configuration provided by the
-`-Dlog4j.configuration` parameter.
-
-* Fix JdbcSQLException when numbers are read from cache.
-
-=== Web UI
-
-
-==== Global
-
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1574[Issue 1574]:
-Correctly highlight matches of text in escaped HTML entities in suggestion results.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1996[Issue 1996]:
-The "Keyboard Shortcuts" help popup can be closed by pressing the Escape key.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2013[Issue 2013]:
-Correctly populate the list of watched changes when watching more than one project.
-
-* Display "Working..." when header is hidden.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2125[Issue 2125]:
-Correctly shows '-1' instead of '1' for label score.
-+
-If a user voted '-1', and then another user voted '+1' for a label, the
-label was shown as a red '1' in the change list instead of red '-1'.
-
-==== Change Screens
-
-
-* Default review comment visibility is changed to expand all recent.
-+
-By default all comments within the last week are expanded, rather than
-only the most recent.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1814[Issue 1814]:
-Sort labels alphabetically by name in the approval table.
-
-* Don't add "This patchset was cherry picked to ..." for the same change.
-+
-If a patchset is cherry-picked to the same destination branch and
-ends up on the same change, it does not make sense to add the "This
-patchset was cherry picked to change ..." message.
-+
-In this case, it makes more sense for the message to say "Uploaded
-patch set N" instead.
-
-* Make links appear with consistent colors.
-
-* Prevent duplicate permitted_labels from being shown in labels list.
-
-==== Diff Screens
-
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1233[Issue 1233]:
-Prevent expansion when whole file isn't loaded.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2122[Issue 2122]:
-Show review comments for unchanged files.
-+
-When comparing patch sets and some comment was put in one side,
-that comment was not shown if there was no code changed between
-the two patch sets
-
-==== Project Screens
-
-
-* Only enable the delete branch button when branches are selected.
-
-* Disable the delete branch button while branch deletion requests are
-still being processed.
-
-==== User Profile Screens
-
-
-* The preferred email address field is shown as empty if the user has no
-preferred email address.
-
-
-=== REST API
-
-
-* Support raw input also in POST requests.
-
-* Show granted date for labels/all when using `/changes/`.
-
-* Return all revisions when `o=ALL_REVISIONS` is set on `/changes/`.
-
-=== ssh
-
-
-* The `--force-message` option is removed from the
-The link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/cmd-review.html[
-`review` command].
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=1908[Issue 1908]:
-Provide more informative error messages when rejecting updates.
-
-* Remove the limit in the query of patch sets by revision.
-
-* Add `isDraft` in the `patchSet` attribute of `stream-events` data.
-+
-This allows consumers of the event stream to determine whether or not
-the event is related to a draft patch set.
-
-* Normalize the case of review labels submitted via the
-The link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/cmd-review.html[
-`review` command].
-
-* The `@CommandMetaData(descr)` annotation is deprecated in favor of `@CommandMetaData(description)`.
-
-* Improve the error message when rejecting upload for review to a read-only project.
-
-
-=== Plugins
-
-==== Global
-
-* Better error message when a Javascript plugin cannot be loaded.
-
-* Plugin documentation links are opened in a new tab.
-
-* The GitReferenceUpdatedListener.Event API is simplified.
-+
-The Event exposed the getUpdates method which implied that one Event
-could contain updates of more than one reference. However, this feature
-was never used.
-+
-The API is simplified in the sense that one Event now corresponds to
-one ref update only.
-
-* Make plugin servlet's context path authorization aware.
-
-
-==== Review Notes
-
-* Do not try to create review notes for ref deletion events.
-
-* Fix committing the notes from the export command.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2087[Issue 2087]:
-Fix note creation when the same commit exists in another Git repository.
-
-* Improve the export command performance.
-
-* Create review note also when newObjectId already present in another branch.
-
-* Correct documentation of the export command.
-
-=== Emails
-
-* Email notifications are sent for new changes created via actions in the
-Web UI such as cherry-picking or reverting a change.
-
-
-=== Tools
-
-
-* git-exproll.sh: return non-zero on errors
-
-
-== Documentation
-
-
-* The link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/index.html[
-documentation index page] is rewritten in a hierarchical structure.
-
-* Documentation of
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.8/config-project-config.txt[
-project configuration] is added.
-
-* Various spelling mistakes are corrected in the documentation and previous
-release notes.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2144[Issue 2144]:
-Documentation of the query operator is fixed.
-
-
-== Upgrades
-
-* Update JGit to 3.1.0.201310021548-r
-* Update gwtorm to 1.7
-* Update guice to 4.0-beta
-* Update guava to 15.0
-* Update H2 to 1.3.173
-* Update bouncycastle to 1.44
-* Update Apache Mina to 2.0.7
-* link:https://code.google.com/p/gerrit/issues/detail?id=2232[Issue 2232]:
-Update Apache SSHD to 0.9.0.201311081
-* asciidoctor 0.1.4 is now required to build the documentation
-* jsr305 library was removed
-* link:https://code.google.com/p/gerrit/issues/detail?id=2232[Issue 2232]:
-Update Jsch to 1.5.0
diff --git a/ReleaseNotes/ReleaseNotes-2.9.1.txt b/ReleaseNotes/ReleaseNotes-2.9.1.txt
deleted file mode 100644
index b584193..0000000
--- a/ReleaseNotes/ReleaseNotes-2.9.1.txt
+++ /dev/null
@@ -1,109 +0,0 @@
-= Release notes for Gerrit 2.9.1
-
-There are no schema changes from link:ReleaseNotes-2.9.html[2.9].
-
-Download:
-link:https://www.gerritcodereview.com/download/gerrit-2.9.1.war[
-https://www.gerritcodereview.com/download/gerrit-2.9.1.war]
-
-*WARNING:* When upgrading from version 2.8.4 or older with a site that uses
-Bouncy Castle Crypto, new versions of the libraries will be downloaded. The old
-libraries should be manually removed from site's `lib` folder to prevent the
-startup failure described in
-link:https://code.google.com/p/gerrit/issues/detail?id=3084[Issue 3084].
-
-== Bug Fixes
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2801[Issue 2801]:
-Set default for review SSH command to `notify=ALL`.
-+
-In 2.9 the default was incorrectly set to `notify=NONE`, which prevented
-mail notifications from being sent for review comments that were added by
-build jobs based on the Gerrit Trigger plugin.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2879[Issue 2879]:
-Remove fixed limit of results returned by secondary index query.
-+
-The limit was hard-coded to 1000 results, which overrode the value set in
-the global query limit capability.
-
-* Don't require secondary index when running server in daemon mode.
-+
-The server failed to start if a secondary index was not present when starting
-the daemon in slave mode.
-+
-Now the daemon can be started in slave mode without requiring the index
-to be present.
-+
-The reindex program and the ssh query command are no longer available on
-a server that is running in slave mode.
-
-* Add full names for options on list groups REST API.
-
-* Add full names for options on list projects REST API.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2878[Issue 2878]:
-Make `-S` an alias of `--start` in changes query REST API.
-
-* Run change hooks and ref-updated events after indexing is done.
-+
-The change hooks and ref-updated events were run parallel to the change
-(re)indexing. This meant that the event-stream sent events to the clients
-before the change indexing was finished.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2877[Issue 2877]:
-Fix NullPointerException when ReviewInput's message is empty.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2500[Issue 2500],
-link:https://code.google.com/p/gerrit/issues/detail?id=1748[Issue 1748]:
-Fix replication of tags.
-
-* Fix NullPointerException in `/projects/{name}/children?recursive` when a
-project has a parent project that is does not exist.
-
-* Fix NullPointerException when submitting review with inline comments via REST.
-
-* Improve error logging in MergeabilityChecker.
-
-* Gracefully skip mergeability checking on broken changes.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2861[Issue 2861]:
-Replace "line" with "end_line" when range is given in inline comment.
-+
-Also update the documentation with an example of a range comment.
-
-* Fix mutual exclusivity of --delete and --submit review command options.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2848[Issue 2848]:
-Add support for CSharp syntax highlighting.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2831[Issue 2831]:
-Add missing call to ref-updated hook for submodule updates.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2773[Issue 2773]
-Fix stale dates in committer field.
-
-* Prevent NullPointerException when trying to add an account that doesn't
-exist as a reviewer.
-
-* Fix potential NullPointerException in cherry-pick submit strategy.
-
-* Add `--start` option to skip changes in ssh `query` command.
-
-* Fix loading of javascript plugins when using non-root Gerrit URLs.
-+
-When Gerrit is not on the root URL path the javascript plugins failed to
-load because of the exact matching required on the request URL.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2279[Issue 2279]:
-Display parents for all changes, not only merge commits.
-+
-In the new change screen the parent commit is now also shown for regular
-commits, as well as merge commits. This makes it consistent with the old
-change screen.
-
-* Fix handling of permissions for user-specific refs.
-+
-Push permission granted on a ref using the `${username}` placeholder, for
-example `refs/heads/users/${username}/*`, was not honored if this was the
-only ref on which the user had push permission.
diff --git a/ReleaseNotes/ReleaseNotes-2.9.2.txt b/ReleaseNotes/ReleaseNotes-2.9.2.txt
deleted file mode 100644
index ec5b77e..0000000
--- a/ReleaseNotes/ReleaseNotes-2.9.2.txt
+++ /dev/null
@@ -1,152 +0,0 @@
-= Release notes for Gerrit 2.9.2
-
-Download:
-link:https://www.gerritcodereview.com/download/gerrit-2.9.2.war[
-https://www.gerritcodereview.com/download/gerrit-2.9.2.war]
-
-== Important Notes
-
-*WARNING:* There are no schema changes from
-link:ReleaseNotes-2.9.1.html[2.9.1], but when upgrading from an existing site
-that was initialized with Gerrit version 2.6 or later the primary key column
-order will be updated for some tables. It is therefore important to upgrade the
-site with the `init` program, rather than only copying the .war file over the
-existing one.
-
-It is recommended to run the `init` program in interactive mode. Warnings will
-be suppressed in batch mode.
-
-----
-  java -jar gerrit.war init -d site_path
-----
-
-*WARNING:* When upgrading from version 2.8.4 or older with a site that uses
-Bouncy Castle Crypto, new versions of the libraries will be downloaded. The old
-libraries should be manually removed from site's `lib` folder to prevent the
-startup failure described in
-link:https://code.google.com/p/gerrit/issues/detail?id=3084[Issue 3084].
-
-== Bug Fixes
-
-=== ssh
-
-* Update SSHD to 0.13.0.
-+
-This fixes link:https://issues.apache.org/jira/browse/SSHD-348[SSHD-348] which
-was causing ssh threads allocated to stream-events clients to get stuck.
-+
-Also update SSHD Mina to 2.0.8 and Bouncycastle to 1.51.
-
-=== Database
-
-* Update gwtorm to 1.14.
-+
-The primary key column order for compound keys was wrong for some Gerrit
-database tables. This caused poor performance for those SQL queries which rely
-on using a prefix of the primary key column sequence in their WHERE conditions.
-+
-This version of gwtorm fixes the issue for new sites. For existing sites that
-were initialized with Gerrit version 2.6 or later, the primary key column
-order will be fixed during initialization when upgrading to 2.9.2.
-
-=== Secondary Index
-
-* Fix "400 cannot create query for index" error in "Conflicts With" list.
-+
-The new
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9.2/config-gerrit.html#index.defaultMaxClauseCount[
-index.defaultMaxClauseCount] setting allows to increase the BooleanQuery limit
-for the Lucene index.
-+
-Raising the limit avoids failing a query with `BooleanQuery.TooManyClauses`,
-preventing users from seeing a "400 cannot create query for index" error
-in the "Conflicts With" section of the change screen.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2996[Issue 2996]:
-Delete a change from the index if it is not in the database.
-+
-If for some reason the secondary index is out of date, i.e. a change was deleted
-from the database but wasn't deleted from the secondary index, it was impossible
-to re-index (remove) that change.
-+
-Automatically remove the change from the secondary index if it doesn't exist in
-the database. If a user clicks on search result from a stale change, they will
-get a 404 page and the change will be removed from the index.
-
-=== Change Screen
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2964[Issue 2964]:
-Fix comment box font colors of dark CodeMirror themes.
-+
-When using a dark-colored theme, for example "Twilight", the comments were
-shown in a light color on a light background making them unreadable.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2918[Issue 2918]:
-Fix placement of margin column in side-by-side diff.
-+
-The margin was placed approximately 10% too far to the right.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2970[Issue 2970]:
-Fix display of accented characters in side-by-side diff.
-+
-On some browsers, accented characters were not displayed correctly
-because the line was not high enough.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2960[Issue 2960]:
-Show filename in side-by-side diff screen.
-+
-In the old side-by-side diff screen, the name of the file being diffed was shown
-in the window title. This feature was missed in the new side-by-side diff screen.
-
-* Remove 'send email' checkbox from reply box on change screen.
-
-=== Plugins
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=543[Issue 543]
-Replication plugin: Prevent creating repos on extra servers.
-+
-If using a group to replicate only certain repositories, it was possible
-to be in a state where the authGroup is used on some servers but not
-others.  If this happened, Gerrit would create the repository on all
-servers, even if the authGroup would prevent replicating code to it.
-By ensuring the authGroup can see the project first, the repository is
-not created if it's not needed.
-
-=== Security
-
-* Do not throw away bytes from the CNSPRG when generating HTTP passwords.
-+
-The implementation generated LEN bytes of cryptography-safe random data and
-applied base64 encoding on top of that. The base64 transformation, however,
-inflated the size of the data by 33%, and this meant that only 9 bytes of
-randomness were actually used.
-
-* Increase the size of HTTP passwords.
-+
-The length of generated HTTP passwords is increased from 12 to 42 characters.
-
-* Consider rule action while constructing local owners list
-+
-Previously rule action was not considered during computation of the local
-owners list. This meant that members of a group that was given OWNER permission
-with BLOCK or DENY action were considered as project owners.
-
-
-=== Miscellaneous Fixes
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2911[Issue 2911]:
-Fix Null Pointer Exception after a MergeValidationListener throws
-MergeValidationException.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2989[Issue 2989]:
-Fix incorrect submodule subscriptions.
-+
-The gitlinks update failed after deleting a branch in a super project which had
-other branches subscribed to the same submodule branch.
-
-* Fix infinite loop when checking group membership.
-
-* Fix quoted-printable encoding of e-mail addresses.
-+
-The "(Code Review)" part of the e-mail sender name was truncated when the
-author's name was not pure ASCII.
diff --git a/ReleaseNotes/ReleaseNotes-2.9.3.txt b/ReleaseNotes/ReleaseNotes-2.9.3.txt
deleted file mode 100644
index 1b732cb..0000000
--- a/ReleaseNotes/ReleaseNotes-2.9.3.txt
+++ /dev/null
@@ -1,54 +0,0 @@
-= Release notes for Gerrit 2.9.3
-
-Download:
-link:https://www.gerritcodereview.com/download/gerrit-2.9.3.war[
-https://www.gerritcodereview.com/download/gerrit-2.9.3.war]
-
-== Important Notes
-
-*WARNING:* There are no schema changes from
-link:ReleaseNotes-2.9.2.html[2.9.2], but when upgrading from an existing site
-that was initialized with Gerrit version 2.6 to version 2.9.1 the primary key
-column order will be updated for some tables. It is therefore important to
-upgrade the site with the `init` program, rather than only copying the .war file
-over the existing one.
-
-It is recommended to run the `init` program in interactive mode. Warnings will
-be suppressed in batch mode.
-
-----
-  java -jar gerrit.war init -d site_path
-----
-
-*WARNING:* When upgrading from version 2.8.4 or older with a site that uses
-Bouncy Castle Crypto, new versions of the libraries will be downloaded. The old
-libraries should be manually removed from site's `lib` folder to prevent the
-startup failure described in
-link:https://code.google.com/p/gerrit/issues/detail?id=3084[Issue 3084].
-
-== Bug Fixes
-
-*Downgrade SSHD to 0.9.0-4-g5967cfd*
-
-In Gerrit version 2.9.2 SSHD was upgraded to 0.13.0 which included a fix for
-link:https://issues.apache.org/jira/browse/SSHD-348[SSHD-348 (SSH thread pool
-exhaustion)].
-
-It turned out that SSHD 0.13.0 still suffers from this issue, which causes
-problems for users of the stream-events in Gerrit 2.9.2.
-
-SSHD 0.9.0 is known to be free from this particular issue, but we cannot
-downgrade to that version because it includes some other known issues:
-
-* link:https://issues.apache.org/jira/browse/SSHD-254[SSHD-254 ('authenticated
-with partial success' error)]
-* link:https://issues.apache.org/jira/browse/SSHD-330[SSHD-330 (sporadic
-handshake failures)].
-
-SSHD version 0.9.0-4-g5967cfd is based on 0.9.0 and includes fixes for SSHD-254
-and SSHD-330.
-
-Due to the downgrade of SSHD, the following libraries are also downgraded:
-
-* Bouncycastle from 1.51 to 1.49
-* Mina Core from 2.0.8 to 2.0.7
diff --git a/ReleaseNotes/ReleaseNotes-2.9.4.txt b/ReleaseNotes/ReleaseNotes-2.9.4.txt
deleted file mode 100644
index e2ad6ac..0000000
--- a/ReleaseNotes/ReleaseNotes-2.9.4.txt
+++ /dev/null
@@ -1,36 +0,0 @@
-= Release notes for Gerrit 2.9.4
-
-Download:
-link:https://www.gerritcodereview.com/download/gerrit-2.9.4.war[
-https://www.gerritcodereview.com/download/gerrit-2.9.4.war]
-
-== Important Notes
-
-*WARNING:* There are no schema changes from
-link:ReleaseNotes-2.9.3.html[2.9.3], but when upgrading from an existing site
-that was initialized with Gerrit version 2.6 to version 2.9.1 the primary key
-column order will be updated for some tables. It is therefore important to
-upgrade the site with the `init` program, rather than only copying the .war file
-over the existing one.
-
-It is recommended to run the `init` program in interactive mode. Warnings will
-be suppressed in batch mode.
-
-----
-  java -jar gerrit.war init -d site_path
-----
-
-*WARNING:* When upgrading from version 2.8.4 or older with a site that uses
-Bouncy Castle Crypto, new versions of the libraries will be downloaded. The old
-libraries should be manually removed from site's `lib` folder to prevent the
-startup failure described in
-link:https://code.google.com/p/gerrit/issues/detail?id=3084[Issue 3084].
-
-== Bug Fixes
-
-* Update JGit to 3.4.2.201412180340-r
-+
-This JGit version mitigates
-link:http://article.gmane.org/gmane.linux.kernel/1853266[CVE-2014-9390]. See the
-link:https://projects.eclipse.org/projects/technology.jgit/releases/3.4.2[JGit release notes]
-for further details.
diff --git a/ReleaseNotes/ReleaseNotes-2.9.5.txt b/ReleaseNotes/ReleaseNotes-2.9.5.txt
deleted file mode 100644
index 18c469c..0000000
--- a/ReleaseNotes/ReleaseNotes-2.9.5.txt
+++ /dev/null
@@ -1,67 +0,0 @@
-Release notes for Gerrit 2.9.5
-==============================
-
-Download:
-link:https://gerrit-releases.storage.googleapis.com/gerrit-2.9.5.war[
-https://gerrit-releases.storage.googleapis.com/gerrit-2.9.5.war]
-
-Important Notes
----------------
-
-*WARNING:* There are no schema changes from
-link:ReleaseNotes-2.9.4.html[2.9.4], but when upgrading from an existing site
-that was initialized with Gerrit version 2.6 to version 2.9.1 the primary key
-column order will be updated for some tables. It is therefore important to
-upgrade the site with the `init` program, rather than only copying the .war file
-over the existing one.
-
-It is recommended to run the `init` program in interactive mode. Warnings will
-be suppressed in batch mode.
-
-----
-  java -jar gerrit.war init -d site_path
-----
-
-Bug Fixes
----------
-
-* link:https://bugs.chromium.org/p/gerrit/issues/detail?id=10262[Issue 10262]: Fix validation of wants in git-upload-pack for protocol v0 stateless transports.
-+
-See the following section for details.
-
-* Upgrade JGit to 4.5.5.201812240535-r.
-+
-This upgrade includes several major versions since 3.4.2 used in Gerrit version 2.9.4. Important fixes are summarized below. Please refer to the corresponding JGit release notes for full details.
-
-** link:https://projects.eclipse.org/projects/technology.jgit/releases/4.5.5[JGit 4.5.5]: link:https://bugs.chromium.org/p/gerrit/issues/detail?id=10262[Issue 10262]: Fix validation of wants in git-upload-pack for protocol v0 stateless transports.
-+
-AdvertiseRefsHook was not called for git-upload-pack in protocol v0 stateless transports, meaning that wants were not validated and a user could fetch anything that is pointed to by any ref (using fetch-by-sha1), as long as they could guess the object name.
-
-** link:https://projects.eclipse.org/projects/technology.jgit/releases/4.5.4[JGit 4.5.4]: Fix LockFile semantics when running on NFS.
-+
-Honor trustFolderStats also when reading packed-refs.
-
-** link:https://projects.eclipse.org/projects/technology.jgit/releases/4.5.3[JGit 4.5.3]: Fix exception handling for opening bitmap index files.
-
-** link:https://projects.eclipse.org/projects/technology.jgit/releases/4.5.2[JGit 4.5.2]: Fix pack marked as corrupted even if it isn’t.
-
-** link:https://projects.eclipse.org/projects/technology.jgit/releases/4.5.1[JGit 4.5.1]: Don’t remove Pack when FileNotFoundException is transient.
-
-** link:https://projects.eclipse.org/projects/technology.jgit/releases/4.1.0[JGit 4.1.0]: Handle stale NFS file handles on packed-refs file.
-+
-Use java.io.File instead of NIO to check existence of loose objects in ObjectDirectory to speed up inserting of loose objects.
-Reduce memory consumption when creating bitmaps during writing pack files.
-
-** link:https://projects.eclipse.org/projects/technology.jgit/releases/3.7.1[JGit 3.7.1]: Fix massive performance problem in Gerrit caused by ObjectWalk.markUninteresting marking the root tree as uninteresting.
-
-** link:https://projects.eclipse.org/projects/technology.jgit/releases/3.7.0[JGit 3.7.0]: Provide more details in exceptions thrown when packfile is invalid.
-
-** link:https://projects.eclipse.org/projects/technology.jgit/releases/3.6.2[JGit 3.6.2]: link:[Issue 3094]: Don’t remove pack from pack list for problems which could be transient.
-+
-Log reason for ignoring pack when IOException occurred.
-
-** link:https://projects.eclipse.org/projects/technology.jgit/releases/3.5.3[JGit 3.5.3]: Fix for vulnerability CVE-2014-9390.
-
-* Fix resource exhaustion due to unclosed LDAP connection.
-+
-When auth.type is set to LDAP (not LDAP_BIND), two LDAP connections are made, but one was not being closed. This eventually caused resource exhaustion and LDAP authentications failed.
diff --git a/ReleaseNotes/ReleaseNotes-2.9.txt b/ReleaseNotes/ReleaseNotes-2.9.txt
deleted file mode 100644
index c026914..0000000
--- a/ReleaseNotes/ReleaseNotes-2.9.txt
+++ /dev/null
@@ -1,725 +0,0 @@
-= Release notes for Gerrit 2.9
-
-
-Gerrit 2.9 is now available:
-
-link:https://www.gerritcodereview.com/download/gerrit-2.9.war[
-https://www.gerritcodereview.com/download/gerrit-2.9.war]
-
-*WARNING:* Support for Java 1.6 has been discontinued.
-As of Gerrit 2.9, Java 1.7 is required.
-
-Gerrit 2.9 includes the bug fixes done with
-link:ReleaseNotes-2.8.1.html[Gerrit 2.8.1],
-link:ReleaseNotes-2.8.2.html[Gerrit 2.8.2],
-link:ReleaseNotes-2.8.3.html[Gerrit 2.8.3],
-link:ReleaseNotes-2.8.4.html[Gerrit 2.8.4],
-link:ReleaseNotes-2.8.5.html[Gerrit 2.8.5],
-link:ReleaseNotes-2.8.6.html[Gerrit 2.8.6] and
-link:ReleaseNotes-2.8.6.1.html[Gerrit 2.8.6.1].
-These bug fixes are *not* listed in these release notes.
-
-== Important Notes
-
-
-*WARNING:* This release contains schema changes.  To upgrade:
-----
-  java -jar gerrit.war init -d site_path
-  java -jar gerrit.war reindex --recheck-mergeable -d site_path
-----
-
-*WARNING:* Upgrading to 2.9.x requires the server be first upgraded to 2.1.7 (or
-a later 2.1.x version), and then to 2.9.x.  If you are upgrading from 2.2.x.x or
-later, you may ignore this warning and upgrade directly to 2.9.x.
-
-*WARNING:* When upgrading from version 2.8.4 or older with a site that uses
-Bouncy Castle Crypto, new versions of the libraries will be downloaded. The old
-libraries should be manually removed from site's `lib` folder to prevent the
-startup failure described in
-link:https://code.google.com/p/gerrit/issues/detail?id=3084[Issue 3084].
-
-
-*WARNING:* Support for query via the SQL index is removed. The usage of
-a secondary index is now mandatory.
-
-*WARNING:* The `sortkey` and `sortkey_prev` options on the query changes
-REST endpoint are link:#sortkey-deprecation[deprecated].
-
-*WARNING:* The new change screen only displays download commands if the
-`download-commands` core plugin or any other plugin providing download
-commands is installed. The `download-commands` plugin provides the
-standard download schemes and commands. It is packaged together with
-Gerrit and can be installed, or upgraded, during the
-link:https://gerrit-review.googlesource.com/Documentation/pgm-init.html[
-site initialization]:
-
-.Installing the plugin for the first time
-- Batch init:
-+
-By default the batch init does *not* install any core plugin. To
-install the `download-commands` plugin during batch init, specify the
-'--install-plugin download-commands' option:
-+
-----
-  $ java -jar gerrit-2.9.war init -d site --batch --install-plugin download-commands
-----
-
-- Interactive init:
-+
-There is a question whether the `download-commands` plugin should be
-installed. To install the plugin the question must be answered with `y`:
-+
-----
-  Install plugin download-commands version v2.9 [y/N]? y
-----
-
-.Upgrading the plugin
-Pay attention that the `download-commands` plugin from Gerrit 2.8 is
-*not* compatible with Gerrit 2.9 and must be upgraded:
-
-- Batch init:
-+
-With the batch init it is *not* possible to upgrade core plugins.
-
-- Interactive init:
-+
-The interactive init asks whether the plugin should be upgraded:
-+
-----
-  Install plugin download-commands version v2.9 [y/N]? y
-  version v2.8.6.1 is already installed, overwrite it [y/N]? y
-----
-
-- Manual upgrade:
-+
-The plugin can be upgraded manually by copying the new plugin jar into
-the site's `plugins` folder.
-
-
-== Release Highlights
-
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2065[Issue 2065]:
-The new change screen is now the default change screen.
-+
-The
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/user-review-ui.html[
-documentation of the new review UI] describes the new screens in detail
-and highlights the important functionality with screenshots.
-+
-Users that are accessing the new change screen for the first time are
-informed about the new change screen by a welcome popup. The welcome
-popup links to the review UI documentation and allows users to go back
-to the old change screen.
-
-
-== New Features
-
-
-=== Web UI
-
-
-==== Global
-
-* Project links by default link to the project dashboard.
-
-
-==== New Change Screen
-
-
-* The new change screen is now the default change screen.
-
-* The layout was changed so that the focus is now on the commit
-message, the change ID and the change status.
-
-* Draft comments are displayed in the reply box.
-+
-There are links to navigate to the inline comments which can be used if
-a comment needs to be edited.
-
-* New inline comments from other users, that were published after the
-current user last reviewed this change, are highlighted in bold.
-
-* New summary comments from other users, that were published after the
-current user last reviewed this change, are automatically expanded in
-the change history.
-+
-The support for the old comment visibility strategy is discontinued.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=93[Issue 93]:
-Inline comments are shown in the change history.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=592[Issue 592]:
-A reply icon is shown on each change message.
-
-* Quoting is possible when replying to a comment.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2313[Issue 2313]:
-Show whether a related change is merged or old.
-
-* New link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/user-review-ui.html#related-changes[
-Related Changes] tabs:
-** `Cherry-Picks`
-** `Same Topic`
-** `Conflicts With`
-
-* The title of the `Patch Sets` drop-down panel shows the number of the
-currently viewed patch set and the total number of patch sets, in the
-form: "current patch set/number of patch sets".
-
-* The currently viewed patch set is displayed in the `Patch Sets` title.
-
-* Keyboard shortcuts to navigate to next/previous patch set.
-
-* Support `[`, `/` and `]` keys to navigate between files in a cycle.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2078[Issue 2078]:
-Show a tooltip on reviewers indicating on which labels they can vote.
-
-* The `Submit` button is enabled even if the change is not mergeable.
-+
-This allows to do the conflict resolution for a change series in a
-single merge commit and submit the changes in reverse order.
-
-* New `Open All` button in files header.
-
-* If a merge commit is viewed this is highlighted by an icon. In this
-case the parent commits are also shown.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2191[Issue 2191]:
-New copy-to-clipboard button for commit ID.
-
-
-==== New Side-by-Side Diff Screen
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=348[Issue 348]:
-The lines of a patch file are linkable.
-+
-These links can be used to directly link to certain inline comments.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2395[Issue 2395]:
-The line length preference is used to draw a margin line at that many
-columns of text.
-+
-This allows a user to configure their preferred width (e.g. 80 columns
-or 100 columns) and see the margin, making it easier to identify lines
-that run over that width.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2530[Issue 2530]:
-All diff preferences are honored.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=148[Issue 148]:
-The full file path is shown.
-
-
-==== Change List / Dashboards
-
-* The `Status` column shows `Merge Conflict` for changes that are not
-mergeable.
-
-* A new `Size` column shows the change size as a colored bar.
-** The user preference `Show Change Sizes As Colored Bars In Changes Table`
-can be disabled to get the size information displayed as text.
-** The number of changed lines by which a change is considered as a
-large change can be
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/config-gerrit.html#change.largeChange[
-configured].
-
-* Support to drill down into dashboard section.
-+
-Clicking on the section title executes the query of this section
-without the `limit` operator.
-
-
-==== Project Screens
-
-* The general project screen provides a copyable clone command that
-automatically installs the `commit-msg` hook.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=562[Issue 562]:
-Project owners can change `HEAD` from the project branches screen.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=1298[Issue 1298]:
-Administrators can change the parent project from the project access
-screen; other users can save changes to the parent project for review
-and get the change approved by an administrator.
-
-* The project list displays icons for projects that are read only or
-hidden.
-
-* The Git garbage collection can be triggered from the general project
-screen if the user has the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/access-control.html#capability_runGC[
-Run Garbage Collection] global capability.
-
-
-==== User Preferences
-
-* Users can choose the UK date format to render dates and timestamps in
-the UI.
-
-
-=== Secondary Index
-
-* Support for query via the SQL index is removed. The usage of
-a secondary index is now mandatory.
-
-* New `--recheck-mergeable` option on the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/pgm-reindex.html[
-reindex] program.
-
-=== ssh
-
-* New `--notify` option on the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/cmd-review.html[
-review] command allowing to control when email notifications should be
-sent.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=1752[Issue 1752]:
-New `--branch` option on the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/cmd-review.html[
-review] command.
-
-* New `--all-reviewers` option on the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/cmd-query.html[
-query] command allowing query results to include information about all
-reviewers added on the change.
-
-* New link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/cmd-apropos.html[
-apropos] command to search the Gerrit documentation.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=1156[Issue 1156]:
-New link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/cmd-create-branch.html[
-create-branch] command.
-
-=== REST API
-
-
-==== Changes
-
-
-[[sortkey-deprecation]]
-* Results returned by the
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/rest-api-changes.html#list-changes[
-query changes] endpoint are now paginated using offsets instead of sortkeys.
-+
-The `sortkey` and `sortkey_prev` parameters on the endpoint are deprecated.  The
-results are now paginated using the `--limit` (`-n`) option to limit the number
-of results, and the `-S` option to set the start point.
-+
-Queries with sortkeys are still supported against old index versions, to enable
-online reindexing while clients have an older JS version.
-
-==== Projects
-
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/rest-api-projects.html#get-content[
-Get content of a file from HEAD of a branch].
-
-==== Documentation
-
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/rest-api-documentation.html#search-documentation.html[
-Search documentation].
-
-=== Access Rights
-
-
-* New link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/access-control.html#capability_viewAllAccounts[
-global capability for viewing all accounts].
-
-* New link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/access-control.html#capability_viewPlugins[
-global capability for viewing the list of installed plugins].
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=1993[Issue 1993]:
-New `Change Owner` group that allows to assign label permissions to the change owner.
-
-* Support link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/access-control.html#category_submit_on_behalf_of[
-on behalf of for submit].
-
-* Allow service users to access REST API if `auth.gitBasicAuth = true`.
-+
-If link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/config-gerrit.html#auth.gitBasicAuth[
-auth.gitBasicAuth] is set to `true` in the `gerrit.config` file all
-HTTP traffic is authenticated using standard `BasicAuth` and the
-credentials are validated using the same auth method as configured for
-the Gerrit Web UI. E.g. for LDAP this means that users must use their
-LDAP password for Git over HTTP and for accessing the REST API.
-+
-Service users are technical users that were created by the
-`create-account` SSH command. These users only exist in Gerrit and
-hence they do not have any LDAP password. This is why service users
-were not able to make use of the REST API if `auth.gitBasicAuth` was
-set to `true`.
-+
-Now if `auth.gitBasicAuth` is set to `true` users that exist only in
-Gerrit but not in LDAP are authenticated with their HTTP password from
-the Gerrit database.
-
-=== Search
-
-* New link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/user-search.html#mergeable[
-is:mergeable] search operator.
-+
-Finds changes that have no merge conflicts and can be merged into the
-destination branch.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2163[Issue 2163]:
-New link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/user-search.html#parentproject[
-parentproject] search operator.
-+
-Finds changes in the specified project or in one of its child projects.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2162[Issue 2162]:
-New link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/user-search.html#conflicts[
-conflicts] search operator.
-+
-Finds changes that conflict with the specified change.
-
-* New operators for absolute last-updated-on search.
-** link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/user-search.html#before_until[
-before / until]
-** link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/user-search.html#after_since[
-after / since]
-
-* Support exact match on file parts in
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/user-search.html#file[
-file] operator.
-
-* Query shortcuts
-** `o` = `owner`
-** `r` = `reviewer`
-** `p` = `project`
-** `f` = `file`
-
-=== Daemon
-
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/dev-inspector.html[
-Gerrit Inspector]: interactive Jython shell.
-+
-New `-s` option is added to the Daemon to start an interactive Jython shell for inspection and
-troubleshooting of live data of the Gerrit instance.
-
-=== Documentation
-
-
-* The documentation is now
-https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/rest-api-documentation.html#search-documentation.html[
-searchable]:
-+
-On each documentation page there is search box in the right top corner
-that allows to search in the documentation.
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/user-review-ui.html[
-Documentation of the new review UI].
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/intro-project-owner.html[
-New Project Owner Guide].
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/index.html[
-Newly structured documentation index].
-
-
-=== Configuration
-
-* New init step for installing the `Verified` label.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2257[Issue 2257]:
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/config-gerrit.html#repository.name.defaultSubmitType[
-Default submit type] for newly created projects can be configured.
-
-* `sshd_log` and `httpd_log` can use log4j configuration.
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/config-gerrit.html#change.allowDrafts[
-Draft workflow can be disabled].
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/config-project-config.html#receive.checkReceivedObjects[
-Project configuration for checking of received objects].
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2318[Issue 2318]:
-Allow the text of the "Report Bug" link to be configured.
-
-
-=== Misc
-
-* The removal of reviewers and their votes is recorded as a change
-message.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2229[Issue 2229]:
-The change URL is returned on push if the change is updated.
-
-* The topic is included into merge commit messages if all merged
-changes have the same topic.
-
-* Stable CSS class names.
-
-
-=== Plugins
-
-
-* Plugin API to invoke the REST API.
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/dev-plugins.html#screen[
-Plugins can add entire screens to Gerrit].
-
-* Plugins can have a
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/dev-plugins.html#settings-screen[
-settings screen] which is linked from plugin list screen.
-
-* Support to edit
-link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/dev-plugins.html#simple-project-specific-configuration[
-project plugin configuration parameters] in the UI.
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/config-gerrit.html#plugins.allowRemoteAdmin[
-Remote plugin administration is by default disabled].
-
-
-==== Extension Points
-
-
-* Extension point to provide a "Message Of The Day".
-
-* Validation for
-** link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/config-validation.html#new-project-validation[
-project creation].
-** link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/config-validation.html#new-group-validation[
-group creation].
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/dev-plugins.html#init_step[
-Init steps can do initialization after the site is created].
-** The `All-Projects` `project.config` can be read and edited
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/dev-plugins.html#receive-pack[
-Initialization of ReceivePack].
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/dev-plugins.html#post-receive-hook[
-Registration of PostReceiveHooks].
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/dev-plugins.html#root-level-commands[
-Registration of root level commands].
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/dev-plugins.html#multiple-commands[
-Multiple SSH commands can be bound to the same class].
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/config-gerrit.html#database.dataSourceInterceptorClass[
-DataSource Interception].
-
-
-==== JavaScript Plugins
-
-
-* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/js-api.html#self_on[
-JavaScript Callbacks]
-** Gerrit.on(\'history\', f)
-** Gerrit.on(\'submitchange\', f)
-** Gerrit.on(\'showchange\', f)
-
-* `change_plugins` element on the new change screen that allows to
-insert arbitrary HTML fragments from plugins.
-
-
-== Bug Fixes
-
-
-=== Access Rights
-
-
-* Fix possibility to overcome BLOCK permissions.
-
-
-=== Web UI
-
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2652[Issue 2652]:
-Copy label approvals when cherry-picking change to same branch.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2662[Issue 2662]:
-Limit file list in new change screen to files that were touched in new
-patch set.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2308[Issue 2308]:
-Show related changes in new change screen for merged changes if there
-are open descendants.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2635[Issue 2635]:
-Fix copying of download commands by 'Cmd-C' in Safari.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2178[Issue 2178]:
-Fix background of reply box on new change screen getting transparent.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2362[Issue 2362]:
-Show quick approve button only for current patch set.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2405[Issue 2405]:
-Update `Patch Sets` drop-down panel when draft patch set is deleted.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2397[Issue 2397]:
-Fix linkifying of topics that are set to a URL.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2151[Issue 2151]:
-Fix overflowing of long lines in commit message block.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2401[Issue 2401]:
-Fix truncated long lines in new side-by-side diff screen.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2225[Issue 2225]:
-Display larger icons for Prev / Next and Up to Change links on new
-side-by-side diff screen.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2340[Issue 2340]:
-Fix selection in new side-by-side diff screen.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2409[Issue 2409]:
-Show in new side-by-side diff screen updates of submodule links.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2481[Issue 2481]:
-After showing a binary file in the unified diff screen switch back to
-the side-by-side diff screen when the user navigates to the
-next/previous file.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2417[Issue 2417]:
-Respect base diff revision for files REST call.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2654[Issue 2654]:
-Require the user to confirm setting the username.
-+
-Once the username has been set, it cannot be edited. This can cause
-problems for users who accidentally set the wrong username. A
-confirmation dialog now warns the user that setting the username is
-permanent and the username is only set when the user confirms.
-
-* link:https://code.google.com/p/gerrit/issues/detail?id=2635[Issue 2635]:
-Fix copying from copyable label in Safari.
-
-
-=== Secondary Index
-
-* Fix Online Reindexing.
-
-* Fix for full-text search with Lucene.
-+
-The full-text search was using a fuzzy query which used the edit
-distance to find terms in the index close to the provided search term.
-This produced bizarre results for queries like "message:1234".
-+
-Instead, use Lucene's QueryBuilder with an analyzer to convert a
-full-text search word/phrase into a phrase query.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2281[Issue 2281]:
-Reindex change after updating commit message.
-
-
-=== REST
-
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2568[Issue 2568]:
-Update description file during `PUT /projects/{name}/config`.
-
-
-=== SSH
-
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2516[Issue 2516]:
-Fix parsing of label name on `review` command.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2440[Issue 2440]:
-Clarify for review command when `--verified` can be used.
-
-
-=== Plugins
-
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2551[Issue 2551]:
-Handle absolute URLs in the top level menu.
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2391[Issue 2391]:
-Respect servlet context path in URL for top menu items.
-
-
-=== Other
-
-
-* link:http://code.google.com/p/gerrit/issues/detail?id=2382[Issue 2382]:
-Clean left over data migration after removal of TrackingIds table.
-
-
-== Upgrades
-
-* Update JGit to 3.4.0.201405051725-m7
-+
-This upgrade fixes the MissingObjectExceptions in Gerrit that are
-described in link:http://code.google.com/p/gerrit/issues/detail?id=2025[
-issue 2025].
-
-* Update gwtjsonrpc to 1.5
-* Update gwtorm to 1.13
-* Update guava to 16.0
-
-* Update H2 to 1.3.174
-+
-This version includes a fix for an LOB deadlock between reading and
-updating LOB columns. This could lead to a deadlock between web and SSH
-clients as described in
-link:http://code.google.com/p/gerrit/issues/detail?id=2365[issue 2365].
-
-* Update Jetty to 9.1.0.v20131115
-* Update Servlet API to 3.1
-* Update Lucene to 4.6.0
-* Update GWT to 2.6.0
-
-
-== Plugins
-
-=== Replication
-
-* Default push refSpec is changed to `refs/*:refs/*` (non-forced push).
-+
-The default push refSpec for the replication plugin has changed from `forced`
-to `non-forced` push (was `+refs/*:refs/*` and now is `refs/*:refs/*`). This change
-should not impact typical replication topologies where the slaves are read-only
-and can be pushed by their masters only. If you wanted explicitly to overwrite
-all changes on the slaves, you need to add a `push=+refs/*:refs/*` configuration
-entry for each replication target.
-
-* Support replication of HEAD updates.
-
-* Stream events for ref replication.
-
-* Replications failed due to "failed to lock" errors are retried.
-
-* Configuration changes can be detected and replication is
-automatically restarted.
-
-=== Issue Tracker System plugins
-
-*WARNING:* The `hooks-*` plugins (`plugins/hooks-bugzilla`,
-`plugins/hooks-jira` and `plugins/hooks-rtc`) are deprecated with
-Gerrit 2.9.
-
-There are new plugins for the integration with Bugzilla, Jira and IBM
-Rational Team Concert:
-
-* link:https://gerrit-review.googlesource.com/#/admin/projects/plugins/its-bugzilla[plugins/its-bugzilla]
-* link:https://gerrit-review.googlesource.com/#/admin/projects/plugins/its-jira[plugins/its-jira]
-* link:https://gerrit-review.googlesource.com/#/admin/projects/plugins/its-rtc[plugins/its-rtc]
-
-The new issue tracker system plugins have a common base which is
-link:https://gerrit-review.googlesource.com/#/admin/projects/plugins/its-base[plugins/its-base].
-
-The configuration of the new plugins is slightly different than the
-configuration of the old plugins because they use different section
-names in the Gerrit configuration. For easy migration the new plugins
-have an init step that allows to take over the configuration from the
-old plugins during the Gerrit initialization phase.
-
-New Features:
-
-* The issue tracker integration can be enabled/disabled per project.
-* Parent projects can enforce the issue tracker integration for their
-  child projects.
-* It can be configured for which branches of a project the issue
-  tracker integration is enabled.
-* Whether the issue tracker integration is enabled/disabled for a
-  project can be changed from the ProjectInfoScreen in the Gerrit
-  WebUI.
diff --git a/ReleaseNotes/index.txt b/ReleaseNotes/index.txt
deleted file mode 100644
index 79d0827..0000000
--- a/ReleaseNotes/index.txt
+++ /dev/null
@@ -1,161 +0,0 @@
-= Gerrit Code Review - Release Notes
-
-[[s2_13]]
-== Version 2.13.x
-* link:https://www.gerritcodereview.com/releases/2.13.md#2.13.2[2.13.2]
-* link:https://www.gerritcodereview.com/releases/2.13.md#2.13.1[2.13.1]
-* link:https://www.gerritcodereview.com/releases/2.13.md[2.13]
-
-[[s2_12]]
-== Version 2.12.x
-* link:https://www.gerritcodereview.com/releases/2.12.md#2.12.5[2.12.5]
-* link:https://www.gerritcodereview.com/releases/2.12.md#2.12.4[2.12.4]
-* link:https://www.gerritcodereview.com/releases/2.12.md#2.12.3[2.12.3]
-* link:https://www.gerritcodereview.com/releases/2.12.md#2.12.2[2.12.2]
-* link:https://www.gerritcodereview.com/releases/2.12.md#2.12.1[2.12.1]
-* link:https://www.gerritcodereview.com/releases/2.12.md[2.12]
-
-[[s2_11]]
-== Version 2.11.x
-* link:ReleaseNotes-2.11.10.html[2.11.10]
-* link:ReleaseNotes-2.11.9.html[2.11.9]
-* link:ReleaseNotes-2.11.8.html[2.11.8]
-* link:ReleaseNotes-2.11.7.html[2.11.7]
-* link:ReleaseNotes-2.11.6.html[2.11.6]
-* link:ReleaseNotes-2.11.5.html[2.11.5]
-* link:ReleaseNotes-2.11.4.html[2.11.4]
-* link:ReleaseNotes-2.11.3.html[2.11.3]
-* link:ReleaseNotes-2.11.2.html[2.11.2]
-* link:ReleaseNotes-2.11.1.html[2.11.1]
-* link:ReleaseNotes-2.11.html[2.11]
-
-[[s2_10]]
-== Version 2.10.x
-* link:ReleaseNotes-2.10.8.html[2.10.8]
-* link:ReleaseNotes-2.10.7.html[2.10.7]
-* link:ReleaseNotes-2.10.6.html[2.10.6]
-* link:ReleaseNotes-2.10.5.html[2.10.5]
-* link:ReleaseNotes-2.10.4.html[2.10.4]
-* link:ReleaseNotes-2.10.3.1.html[2.10.3.1]
-* link:ReleaseNotes-2.10.3.html[2.10.3]
-* link:ReleaseNotes-2.10.2.html[2.10.2]
-* link:ReleaseNotes-2.10.1.html[2.10.1]
-* link:ReleaseNotes-2.10.html[2.10]
-
-[[s2_9]]
-== Version 2.9.x
-* link:ReleaseNotes-2.9.5.html[2.9.5]
-* link:ReleaseNotes-2.9.4.html[2.9.4]
-* link:ReleaseNotes-2.9.3.html[2.9.3]
-* link:ReleaseNotes-2.9.2.html[2.9.2]
-* link:ReleaseNotes-2.9.1.html[2.9.1]
-* link:ReleaseNotes-2.9.html[2.9]
-
-[[s2_8]]
-== Version 2.8.x
-* link:ReleaseNotes-2.8.6.1.html[2.8.6.1]
-* link:ReleaseNotes-2.8.6.html[2.8.6]
-* link:ReleaseNotes-2.8.5.html[2.8.5]
-* link:ReleaseNotes-2.8.4.html[2.8.4]
-* link:ReleaseNotes-2.8.3.html[2.8.3]
-* link:ReleaseNotes-2.8.2.html[2.8.2]
-* link:ReleaseNotes-2.8.1.html[2.8.1]
-* link:ReleaseNotes-2.8.html[2.8]
-
-[[s2_7]]
-== Version 2.7.x
-* link:ReleaseNotes-2.7.html[2.7]
-
-[[s2_6]]
-== Version 2.6.x
-* link:ReleaseNotes-2.6.1.html[2.6.1]
-* link:ReleaseNotes-2.6.html[2.6]
-
-[[s2_5]]
-== Version 2.5.x
-* link:ReleaseNotes-2.5.6.html[2.5.6]
-* link:ReleaseNotes-2.5.5.html[2.5.5]
-* link:ReleaseNotes-2.5.4.html[2.5.4]
-* link:ReleaseNotes-2.5.3.html[2.5.3]
-* link:ReleaseNotes-2.5.2.html[2.5.2]
-* link:ReleaseNotes-2.5.1.html[2.5.1]
-* link:ReleaseNotes-2.5.html[2.5]
-
-[[s2_4]]
-== Version 2.4.x
-* link:ReleaseNotes-2.4.4.html[2.4.4]
-* link:ReleaseNotes-2.4.3.html[2.4.3]
-* link:ReleaseNotes-2.4.2.html[2.4.2]
-* link:ReleaseNotes-2.4.1.html[2.4.1]
-* link:ReleaseNotes-2.4.html[2.4]
-
-[[s2_3]]
-== Version 2.3.x
-* link:ReleaseNotes-2.3.1.html[2.3.1]
-* link:ReleaseNotes-2.3.html[2.3]
-
-[[s2_2]]
-== Version 2.2.x
-* link:ReleaseNotes-2.2.2.2.html[2.2.2.2]
-* link:ReleaseNotes-2.2.2.1.html[2.2.2.1]
-* link:ReleaseNotes-2.2.2.html[2.2.2]
-* link:ReleaseNotes-2.2.1.html[2.2.1]
-* link:ReleaseNotes-2.2.0.html[2.2.0]
-
-[[s2_1]]
-== Version 2.1.x
-* link:ReleaseNotes-2.1.10.html[2.1.10]
-* link:ReleaseNotes-2.1.9.html[2.1.9]
-* link:ReleaseNotes-2.1.8.html[2.1.8]
-* link:ReleaseNotes-2.1.7.2.html[2.1.7.2]
-* link:ReleaseNotes-2.1.7.html[2.1.7]
-* link:ReleaseNotes-2.1.6.1.html[2.1.6.1]
-* link:ReleaseNotes-2.1.6.html[2.1.6]
-* link:ReleaseNotes-2.1.5.html[2.1.5]
-* link:ReleaseNotes-2.1.4.html[2.1.4]
-* link:ReleaseNotes-2.1.3.html[2.1.3]
-* link:ReleaseNotes-2.1.2.5.html[2.1.2.5]
-* link:ReleaseNotes-2.1.2.4.html[2.1.2.4]
-* link:ReleaseNotes-2.1.2.3.html[2.1.2.3]
-* link:ReleaseNotes-2.1.2.2.html[2.1.2.2]
-* link:ReleaseNotes-2.1.2.1.html[2.1.2.1]
-* link:ReleaseNotes-2.1.2.html[2.1.2]
-* link:ReleaseNotes-2.1.1.html[2.1.1.1]
-* link:ReleaseNotes-2.1.1.html[2.1.1]
-* link:ReleaseNotes-2.1.html[2.1]
-
-[[s2_0]]
-== Version 2.0.x
-* link:ReleaseNotes-2.0.24.html[2.0.24.2]
-* link:ReleaseNotes-2.0.24.html[2.0.24.1]
-* link:ReleaseNotes-2.0.24.html[2.0.24]
-* link:ReleaseNotes-2.0.23.html[2.0.23]
-* link:ReleaseNotes-2.0.22.html[2.0.22]
-* link:ReleaseNotes-2.0.21.html[2.0.21]
-* link:ReleaseNotes-2.0.20.html[2.0.20]
-* link:ReleaseNotes-2.0.19.html[2.0.19.2]
-* link:ReleaseNotes-2.0.19.html[2.0.19.1]
-* link:ReleaseNotes-2.0.19.html[2.0.19]
-* link:ReleaseNotes-2.0.18.html[2.0.18]
-* link:ReleaseNotes-2.0.17.html[2.0.17]
-* link:ReleaseNotes-2.0.16.html[2.0.16]
-* link:ReleaseNotes-2.0.15.html[2.0.15]
-* link:ReleaseNotes-2.0.14.html[2.0.14.1]
-* link:ReleaseNotes-2.0.14.html[2.0.14]
-* link:ReleaseNotes-2.0.13.html[2.0.13.1]
-* link:ReleaseNotes-2.0.13.html[2.0.13]
-* link:ReleaseNotes-2.0.12.html[2.0.12]
-* link:ReleaseNotes-2.0.11.html[2.0.11]
-* link:ReleaseNotes-2.0.10.html[2.0.10]
-* link:ReleaseNotes-2.0.9.html[2.0.9]
-* link:ReleaseNotes-2.0.8.html[2.0.8]
-* link:ReleaseNotes-2.0.7.html[2.0.7]
-* link:ReleaseNotes-2.0.6.html[2.0.6]
-* link:ReleaseNotes-2.0.5.html[2.0.5]
-* link:ReleaseNotes-2.0.4.html[2.0.4]
-* link:ReleaseNotes-2.0.3.html[2.0.3]
-* link:ReleaseNotes-2.0.2.html[2.0.2]
-
-GERRIT
-------
-Part of link:https://www.gerritcodereview.com/[Gerrit Code Review]
diff --git a/SUBMITTING_PATCHES b/SUBMITTING_PATCHES
index 553ab34..5a82fd9 100644
--- a/SUBMITTING_PATCHES
+++ b/SUBMITTING_PATCHES
@@ -3,6 +3,7 @@
  - Make small logical changes.
  - Provide a meaningful commit message.
  - Make sure all code is under the Apache License, 2.0.
+ - Make sure all commit messages have a Change-Id.
  - Publish your changes for review:
 
    git push https://gerrit.googlesource.com/gerrit HEAD:refs/for/master
@@ -67,6 +68,13 @@
 
   https://gerrit-review.googlesource.com/#/settings/http-password
 
+Ensure you have installed the commit-msg hook that automatically
+generates and inserts a Change-Id line during "git commit".  This can
+be done from the root directory of the local Git repository:
+
+   curl -Lo .git/hooks/commit-msg https://gerrit-review.googlesource.com/tools/hooks/commit-msg
+   chmod +x .git/hooks/commit-msg
+
 Push your patches over HTTPS to the review server, possibly through
 a remembered remote to make this easier in the future:
 
diff --git a/WORKSPACE b/WORKSPACE
index eb8a13c..47ead15d 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -1,5 +1,6 @@
 workspace(name = "gerrit")
 
+load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")
 load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive", "http_file")
 load("//tools/bzl:maven_jar.bzl", "GERRIT", "MAVEN_LOCAL", "maven_jar")
 load("//lib/codemirror:cm.bzl", "CM_VERSION", "DIFF_MATCH_PATCH_VERSION")
@@ -25,8 +26,8 @@
 http_file(
     name = "polymer_closure",
     downloaded_file_path = "polymer_closure.js",
-    sha256 = "5a589bdba674e1fec7188e9251c8624ebf2d4d969beb6635f9148f420d1e08b1",
-    urls = ["https://raw.githubusercontent.com/google/closure-compiler/775609aad61e14aef289ebec4bfc09ad88877f9e/contrib/externs/polymer-1.0.js"],
+    sha256 = "4d63a36dcca040475bd6deb815b9a600bd686e1413ac1ebd4b04516edd675020",
+    urls = ["https://raw.githubusercontent.com/google/closure-compiler/35d2b3340ff23a69441f10fa3bc820691c2942f2/contrib/externs/polymer-1.0.js"],
 )
 
 load("@bazel_skylib//lib:versions.bzl", "versions")
@@ -36,12 +37,50 @@
 load("@io_bazel_rules_closure//closure:defs.bzl", "closure_repositories")
 
 # Prevent redundant loading of dependencies.
+# TODO(davido): Omit re-fetching ancient args4j version when these PRs are merged:
+# https://github.com/bazelbuild/rules_closure/pull/262
+# https://github.com/google/closure-templates/pull/155
 closure_repositories(
     omit_aopalliance = True,
-    omit_args4j = True,
     omit_javax_inject = True,
 )
 
+# Golang support for PolyGerrit local dev server.
+http_archive(
+    name = "io_bazel_rules_go",
+    sha256 = "6776d68ebb897625dead17ae510eac3d5f6342367327875210df44dbe2aeeb19",
+    url = "https://github.com/bazelbuild/rules_go/releases/download/0.17.1/rules_go-0.17.1.tar.gz",
+)
+
+load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies")
+
+go_rules_dependencies()
+
+go_register_toolchains()
+
+http_archive(
+    name = "bazel_gazelle",
+    sha256 = "3c681998538231a2d24d0c07ed5a7658cb72bfb5fd4bf9911157c0e9ac6a2687",
+    urls = ["https://github.com/bazelbuild/bazel-gazelle/releases/download/0.17.0/bazel-gazelle-0.17.0.tar.gz"],
+)
+
+load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies", "go_repository")
+
+gazelle_dependencies()
+
+# Dependencies for PolyGerrit local dev server.
+go_repository(
+    name = "com_github_robfig_soy",
+    commit = "82face14ebc0883b4ca9c901b5aaf3738b9f6a24",
+    importpath = "github.com/robfig/soy",
+)
+
+go_repository(
+    name = "com_github_howeyc_fsnotify",
+    commit = "441bbc86b167f3c1f4786afae9931403b99fdacf",
+    importpath = "github.com/howeyc/fsnotify",
+)
+
 ANTLR_VERS = "3.5.2"
 
 maven_jar(
@@ -69,24 +108,24 @@
     sha1 = "83cd2cd674a217ade95a4bb83a8a14f351f48bd0",
 )
 
-GUICE_VERS = "4.2.0"
+GUICE_VERS = "4.2.1"
 
 maven_jar(
     name = "guice-library",
     artifact = "com.google.inject:guice:" + GUICE_VERS,
-    sha1 = "25e1f4c1d528a1cffabcca0d432f634f3132f6c8",
+    sha1 = "f77dfd89318fe3ff293bafceaa75fbf66e4e4b10",
 )
 
 maven_jar(
     name = "guice-assistedinject",
     artifact = "com.google.inject.extensions:guice-assistedinject:" + GUICE_VERS,
-    sha1 = "e7270305960ad7db56f7e30cb9df6be9ff1cfb45",
+    sha1 = "d327e4aee7c96f08cd657c17da231a1f4a8999ac",
 )
 
 maven_jar(
     name = "guice-servlet",
     artifact = "com.google.inject.extensions:guice-servlet:" + GUICE_VERS,
-    sha1 = "f57581625c36c148f088d9f52a568d5bdf12c61d",
+    sha1 = "3927e462f923b0c672fdb045c5645bca4beab5c0",
 )
 
 maven_jar(
@@ -103,8 +142,8 @@
 
 maven_jar(
     name = "servlet-api-3_1",
-    artifact = "org.apache.tomcat:tomcat-servlet-api:8.0.24",
-    sha1 = "5d9e2e895e3111622720157d0aa540066d5fce3a",
+    artifact = "org.apache.tomcat:tomcat-servlet-api:8.5.23",
+    sha1 = "021a212688ec94fe77aff74ab34cc74f6f940e60",
 )
 
 GWT_VERS = "2.8.2"
@@ -173,6 +212,26 @@
     sha1 = "94ad16d728b374d65bd897625f3fbb3da223a2b6",
 )
 
+FLOGGER_VERS = "0.3.1"
+
+maven_jar(
+    name = "flogger",
+    artifact = "com.google.flogger:flogger:" + FLOGGER_VERS,
+    sha1 = "585030fe1ec709760cbef997a459729fb965df0e",
+)
+
+maven_jar(
+    name = "flogger-log4j-backend",
+    artifact = "com.google.flogger:flogger-log4j-backend:" + FLOGGER_VERS,
+    sha1 = "d5085e3996bddc4b105d53b886190cc9a8811a9e",
+)
+
+maven_jar(
+    name = "flogger-system-backend",
+    artifact = "com.google.flogger:flogger-system-backend:" + FLOGGER_VERS,
+    sha1 = "287b569d76abcd82f9de87fe41829fbc7ebd8ac9",
+)
+
 maven_jar(
     name = "gwtjsonrpc",
     artifact = "com.google.gerrit:gwtjsonrpc:1.11",
@@ -182,8 +241,8 @@
 
 maven_jar(
     name = "gson",
-    artifact = "com.google.code.gson:gson:2.8.0",
-    sha1 = "c4ba5371a29ac9b2ad6129b1d39ea38750043eff",
+    artifact = "com.google.code.gson:gson:2.8.5",
+    sha1 = "f645ed69d595b24d4cf8b3fbb64cc505bede8829",
 )
 
 maven_jar(
@@ -195,20 +254,8 @@
 
 maven_jar(
     name = "protobuf",
-    artifact = "com.google.protobuf:protobuf-java:3.0.0-beta-2",
-    sha1 = "de80fe047052445869b96f6def6baca7182c95af",
-)
-
-maven_jar(
-    name = "joda-time",
-    artifact = "joda-time:joda-time:2.9.9",
-    sha1 = "f7b520c458572890807d143670c9b24f4de90897",
-)
-
-maven_jar(
-    name = "joda-convert",
-    artifact = "org.joda:joda-convert:1.8.1",
-    sha1 = "675642ac208e0b741bc9118dcbcae44c271b992a",
+    artifact = "com.google.protobuf:protobuf-java:3.6.1",
+    sha1 = "0d06d46ecfd92ec6d0f3b423b4cd81cb38d8b924",
 )
 
 load("//lib:guava.bzl", "GUAVA_BIN_SHA1", "GUAVA_VERSION")
@@ -226,12 +273,6 @@
 )
 
 maven_jar(
-    name = "velocity",
-    artifact = "org.apache.velocity:velocity:1.7",
-    sha1 = "2ceb567b8f3f21118ecdec129fe1271dbc09aa7a",
-)
-
-maven_jar(
     name = "jsch",
     artifact = "com.jcraft:jsch:0.1.54",
     sha1 = "da3584329a263616e277e15462b387addd1b208d",
@@ -252,12 +293,6 @@
 )
 
 maven_jar(
-    name = "log-nop",
-    artifact = "org.slf4j:slf4j-nop:" + SLF4J_VERS,
-    sha1 = "6cca9a3b999ff28b7a35ca762b3197cd7e4c2ad1",
-)
-
-maven_jar(
     name = "log-ext",
     artifact = "org.slf4j:slf4j-ext:" + SLF4J_VERS,
     sha1 = "09a8f58c784c37525d2624062414358acf296717",
@@ -294,9 +329,9 @@
 )
 
 maven_jar(
-    name = "args4j",
-    artifact = "args4j:args4j:2.0.26",
-    sha1 = "01ebb18ebb3b379a74207d5af4ea7c8338ebd78b",
+    name = "args4j-intern",
+    artifact = "args4j:args4j:2.33",
+    sha1 = "bd87a75374a6d6523de82fef51fc3cfe9baf9fc9",
 )
 
 maven_jar(
@@ -305,16 +340,11 @@
     sha1 = "4b95f4897fa13f2cd904aee711aeafc0c5295cd8",
 )
 
-maven_jar(
-    name = "commons-collections",
-    artifact = "commons-collections:commons-collections:3.2.2",
-    sha1 = "8ad72fe39fa8c91eaaf12aadb21e0c3661fe26d5",
-)
-
+# When upgrading commons-compress, also upgrade tukaani-xz
 maven_jar(
     name = "commons-compress",
-    artifact = "org.apache.commons:commons-compress:1.13",
-    sha1 = "15c5e9584200122924e50203ae210b57616b75ee",
+    artifact = "org.apache.commons:commons-compress:1.15",
+    sha1 = "b686cd04abaef1ea7bc5e143c080563668eec17e",
 )
 
 maven_jar(
@@ -324,11 +354,19 @@
 )
 
 maven_jar(
+    name = "commons-lang3",
+    artifact = "org.apache.commons:commons-lang3:3.6",
+    sha1 = "9d28a6b23650e8a7e9063c04588ace6cf7012c17",
+)
+
+maven_jar(
     name = "commons-dbcp",
     artifact = "commons-dbcp:commons-dbcp:1.4",
     sha1 = "30be73c965cc990b153a100aaaaafcf239f82d39",
 )
 
+# Transitive dependency of commons-dbcp, do not update without
+# also updating commons-dbcp
 maven_jar(
     name = "commons-pool",
     artifact = "commons-pool:commons-pool:1.5.5",
@@ -337,14 +375,8 @@
 
 maven_jar(
     name = "commons-net",
-    artifact = "commons-net:commons-net:3.5",
-    sha1 = "342fc284019f590e1308056990fdb24a08f06318",
-)
-
-maven_jar(
-    name = "commons-oro",
-    artifact = "oro:oro:2.0.8",
-    sha1 = "5592374f834645c4ae250f4c9fbb314c9369d698",
+    artifact = "commons-net:commons-net:3.6",
+    sha1 = "b71de00508dcb078d2b24b5fa7e538636de9b3da",
 )
 
 maven_jar(
@@ -355,56 +387,197 @@
 
 maven_jar(
     name = "automaton",
-    artifact = "dk.brics.automaton:automaton:1.11-8",
-    sha1 = "6ebfa65eb431ff4b715a23be7a750cbc4cc96d0f",
+    artifact = "dk.brics:automaton:1.12-1",
+    sha1 = "959a0c62f9a5c2309e0ad0b0589c74d69e101241",
+)
+
+FLEXMARK_VERS = "0.34.18"
+
+maven_jar(
+    name = "flexmark",
+    artifact = "com.vladsch.flexmark:flexmark:" + FLEXMARK_VERS,
+    sha1 = "65cc1489ef8902023140900a3a7fcce89fba678d",
 )
 
 maven_jar(
-    name = "pegdown",
-    artifact = "org.pegdown:pegdown:1.6.0",
-    sha1 = "231ae49d913467deb2027d0b8a0b68b231deef4f",
+    name = "flexmark-ext-abbreviation",
+    artifact = "com.vladsch.flexmark:flexmark-ext-abbreviation:" + FLEXMARK_VERS,
+    sha1 = "a0384932801e51f16499358dec69a730739aca3f",
 )
 
 maven_jar(
-    name = "grappa",
-    artifact = "com.github.parboiled1:grappa:1.0.4",
-    sha1 = "ad4b44b9c305dad7aa1e680d4b5c8eec9c4fd6f5",
+    name = "flexmark-ext-anchorlink",
+    artifact = "com.vladsch.flexmark:flexmark-ext-anchorlink:" + FLEXMARK_VERS,
+    sha1 = "6df2e23b5c94a5e46b1956a29179eb783f84ea2f",
 )
 
 maven_jar(
-    name = "jitescript",
-    artifact = "me.qmx.jitescript:jitescript:0.4.0",
-    sha1 = "2e35862b0435c1b027a21f3d6eecbe50e6e08d54",
+    name = "flexmark-ext-autolink",
+    artifact = "com.vladsch.flexmark:flexmark-ext-autolink:" + FLEXMARK_VERS,
+    sha1 = "069f8ff15e5b435cc96b23f31798ce64a7a3f6d3",
 )
 
-GREENMAIL_VERS = "1.5.3"
+maven_jar(
+    name = "flexmark-ext-definition",
+    artifact = "com.vladsch.flexmark:flexmark-ext-definition:" + FLEXMARK_VERS,
+    sha1 = "ff177d8970810c05549171e3ce189e2c68b906c0",
+)
+
+maven_jar(
+    name = "flexmark-ext-emoji",
+    artifact = "com.vladsch.flexmark:flexmark-ext-emoji:" + FLEXMARK_VERS,
+    sha1 = "410bf7d8e5b8bc2c4a8cff644d1b2bc7b271a41e",
+)
+
+maven_jar(
+    name = "flexmark-ext-escaped-character",
+    artifact = "com.vladsch.flexmark:flexmark-ext-escaped-character:" + FLEXMARK_VERS,
+    sha1 = "6f4fb89311b54284a6175341d4a5e280f13b2179",
+)
+
+maven_jar(
+    name = "flexmark-ext-footnotes",
+    artifact = "com.vladsch.flexmark:flexmark-ext-footnotes:" + FLEXMARK_VERS,
+    sha1 = "35efe7d9aea97b6f36e09c65f748863d14e1cfe4",
+)
+
+maven_jar(
+    name = "flexmark-ext-gfm-issues",
+    artifact = "com.vladsch.flexmark:flexmark-ext-gfm-issues:" + FLEXMARK_VERS,
+    sha1 = "ec1d660102f6a1d0fbe5e57c13b7ff8bae6cff72",
+)
+
+maven_jar(
+    name = "flexmark-ext-gfm-strikethrough",
+    artifact = "com.vladsch.flexmark:flexmark-ext-gfm-strikethrough:" + FLEXMARK_VERS,
+    sha1 = "6060442b742c9b6d4d83d7dd4f0fe477c4686dd2",
+)
+
+maven_jar(
+    name = "flexmark-ext-gfm-tables",
+    artifact = "com.vladsch.flexmark:flexmark-ext-gfm-tables:" + FLEXMARK_VERS,
+    sha1 = "2fe597849e46e02e0c1ea1d472848f74ff261282",
+)
+
+maven_jar(
+    name = "flexmark-ext-gfm-tasklist",
+    artifact = "com.vladsch.flexmark:flexmark-ext-gfm-tasklist:" + FLEXMARK_VERS,
+    sha1 = "b3af19ce4efdc980a066c1bf0f5a6cf8c24c487a",
+)
+
+maven_jar(
+    name = "flexmark-ext-gfm-users",
+    artifact = "com.vladsch.flexmark:flexmark-ext-gfm-users:" + FLEXMARK_VERS,
+    sha1 = "7456c5f7272c195ee953a02ebab4f58374fb23ee",
+)
+
+maven_jar(
+    name = "flexmark-ext-ins",
+    artifact = "com.vladsch.flexmark:flexmark-ext-ins:" + FLEXMARK_VERS,
+    sha1 = "13fe1a95a8f3be30b574451cfe8d3d5936fa3e94",
+)
+
+maven_jar(
+    name = "flexmark-ext-jekyll-front-matter",
+    artifact = "com.vladsch.flexmark:flexmark-ext-jekyll-front-matter:" + FLEXMARK_VERS,
+    sha1 = "e146e2bf3a740d6ef06a33a516c4d1f6d3761109",
+)
+
+maven_jar(
+    name = "flexmark-ext-superscript",
+    artifact = "com.vladsch.flexmark:flexmark-ext-superscript:" + FLEXMARK_VERS,
+    sha1 = "02541211e8e4a6c89ce0a68b07b656d8a19ac282",
+)
+
+maven_jar(
+    name = "flexmark-ext-tables",
+    artifact = "com.vladsch.flexmark:flexmark-ext-tables:" + FLEXMARK_VERS,
+    sha1 = "775d9587de71fd50573f32eee98ab039b4dcc219",
+)
+
+maven_jar(
+    name = "flexmark-ext-toc",
+    artifact = "com.vladsch.flexmark:flexmark-ext-toc:" + FLEXMARK_VERS,
+    sha1 = "85b75fe1ebe24c92b9d137bcbc51d232845b6077",
+)
+
+maven_jar(
+    name = "flexmark-ext-typographic",
+    artifact = "com.vladsch.flexmark:flexmark-ext-typographic:" + FLEXMARK_VERS,
+    sha1 = "c1bf0539de37d83aa05954b442f929e204cd89db",
+)
+
+maven_jar(
+    name = "flexmark-ext-wikilink",
+    artifact = "com.vladsch.flexmark:flexmark-ext-wikilink:" + FLEXMARK_VERS,
+    sha1 = "400b23b9a4e0c008af0d779f909ee357628be39d",
+)
+
+maven_jar(
+    name = "flexmark-ext-yaml-front-matter",
+    artifact = "com.vladsch.flexmark:flexmark-ext-yaml-front-matter:" + FLEXMARK_VERS,
+    sha1 = "491f815285a8e16db1e906f3789a94a8a9836fa6",
+)
+
+maven_jar(
+    name = "flexmark-formatter",
+    artifact = "com.vladsch.flexmark:flexmark-formatter:" + FLEXMARK_VERS,
+    sha1 = "d46308006800d243727100ca0f17e6837070fd48",
+)
+
+maven_jar(
+    name = "flexmark-html-parser",
+    artifact = "com.vladsch.flexmark:flexmark-html-parser:" + FLEXMARK_VERS,
+    sha1 = "fece2e646d11b6a77fc611b4bd3eb1fb8a635c87",
+)
+
+maven_jar(
+    name = "flexmark-profile-pegdown",
+    artifact = "com.vladsch.flexmark:flexmark-profile-pegdown:" + FLEXMARK_VERS,
+    sha1 = "297f723bb51286eaa7029558fac87d819643d577",
+)
+
+maven_jar(
+    name = "flexmark-util",
+    artifact = "com.vladsch.flexmark:flexmark-util:" + FLEXMARK_VERS,
+    sha1 = "31e2e1fbe8273d7c913506eafeb06b1a7badb062",
+)
+
+# Transitive dependency of flexmark
+maven_jar(
+    name = "autolink",
+    artifact = "org.nibor.autolink:autolink:0.7.0",
+    sha1 = "649f9f13422cf50c926febe6035662ae25dc89b2",
+)
+
+GREENMAIL_VERS = "1.5.5"
 
 maven_jar(
     name = "greenmail",
     artifact = "com.icegreen:greenmail:" + GREENMAIL_VERS,
-    sha1 = "afabf8178312f7f220f74f1558e457bf54fa4253",
+    sha1 = "9ea96384ad2cb8118c22f493b529eb72c212691c",
 )
 
-MAIL_VERS = "1.5.6"
+MAIL_VERS = "1.6.0"
 
 maven_jar(
     name = "mail",
     artifact = "com.sun.mail:javax.mail:" + MAIL_VERS,
-    sha1 = "ab5daef2f881c42c8e280cbe918ec4d7fdfd7efe",
+    sha1 = "a055c648842c4954c1f7db7254f45d9ad565e278",
 )
 
-MIME4J_VERS = "0.8.0"
+MIME4J_VERS = "0.8.1"
 
 maven_jar(
     name = "mime4j-core",
     artifact = "org.apache.james:apache-mime4j-core:" + MIME4J_VERS,
-    sha1 = "d54f45fca44a2f210569656b4ca3574b42911c95",
+    sha1 = "c62dfe18a3b827a2c626ade0ffba44562ddf3f61",
 )
 
 maven_jar(
     name = "mime4j-dom",
     artifact = "org.apache.james:apache-mime4j-dom:" + MIME4J_VERS,
-    sha1 = "6720c93d14225c3e12c4a69768a0370c80e376a3",
+    sha1 = "f2d653c617004193f3350330d907f77b60c88c56",
 )
 
 maven_jar(
@@ -413,36 +586,36 @@
     sha1 = "5e3bda828a80c7a21dfbe2308d1755759c2fd7b4",
 )
 
-OW2_VERS = "5.1"
+OW2_VERS = "6.2.1"
 
 maven_jar(
     name = "ow2-asm",
     artifact = "org.ow2.asm:asm:" + OW2_VERS,
-    sha1 = "5ef31c4fe953b1fd00b8a88fa1d6820e8785bb45",
+    sha1 = "c01b6798f81b0fc2c5faa70cbe468c275d4b50c7",
 )
 
 maven_jar(
     name = "ow2-asm-analysis",
     artifact = "org.ow2.asm:asm-analysis:" + OW2_VERS,
-    sha1 = "6d1bf8989fc7901f868bee3863c44f21aa63d110",
+    sha1 = "e8b876c5ccf226cae2f44ed2c436ad3407d0ec1d",
 )
 
 maven_jar(
     name = "ow2-asm-commons",
     artifact = "org.ow2.asm:asm-commons:" + OW2_VERS,
-    sha1 = "25d8a575034dd9cfcb375a39b5334f0ba9c8474e",
+    sha1 = "eaf31376d741a3e2017248a4c759209fe25c77d3",
 )
 
 maven_jar(
     name = "ow2-asm-tree",
     artifact = "org.ow2.asm:asm-tree:" + OW2_VERS,
-    sha1 = "87b38c12a0ea645791ead9d3e74ae5268d1d6c34",
+    sha1 = "332b022092ecec53cdb6272dc436884b2d940615",
 )
 
 maven_jar(
     name = "ow2-asm-util",
     artifact = "org.ow2.asm:asm-util:" + OW2_VERS,
-    sha1 = "b60e33a6bd0d71831e0c249816d01e6c1dd90a47",
+    sha1 = "400d664d7c92a659d988c00cb65150d1b30cf339",
 )
 
 AUTO_VALUE_VERSION = "1.6.2"
@@ -459,42 +632,43 @@
     sha1 = "ed193d86e0af90cc2342aedbe73c5d86b03fa09b",
 )
 
+# Transitive dependency of commons-compress
 maven_jar(
     name = "tukaani-xz",
-    artifact = "org.tukaani:xz:1.4",
-    sha1 = "18a9a2ce6abf32ea1b5fd31dae5210ad93f4e5e3",
+    artifact = "org.tukaani:xz:1.6",
+    sha1 = "05b6f921f1810bdf90e25471968f741f87168b64",
 )
 
-LUCENE_VERS = "5.5.5"
+LUCENE_VERS = "6.6.5"
 
 maven_jar(
     name = "lucene-core",
     artifact = "org.apache.lucene:lucene-core:" + LUCENE_VERS,
-    sha1 = "c34bcd9274859dc07cfed2a935aaca90c4f4b861",
+    sha1 = "2983f80b1037e098209657b0ca9176827892d0c0",
 )
 
 maven_jar(
     name = "lucene-analyzers-common",
     artifact = "org.apache.lucene:lucene-analyzers-common:" + LUCENE_VERS,
-    sha1 = "e6b3f5d1b33ed24da7eef0a72f8062bd4652700c",
+    sha1 = "6094f91071d90570b7f5f8ce481d5de7d2d2e9d5",
 )
 
 maven_jar(
     name = "backward-codecs",
     artifact = "org.apache.lucene:lucene-backward-codecs:" + LUCENE_VERS,
-    sha1 = "d1dee5c7676a313758adb30d7b0bd4c69a4cd214",
+    sha1 = "460a19e8d1aa7d31e9614cf528a6cb508c9e823d",
 )
 
 maven_jar(
     name = "lucene-misc",
     artifact = "org.apache.lucene:lucene-misc:" + LUCENE_VERS,
-    sha1 = "bc0eb46ba0377594cac7b0cdaab35562d7877521",
+    sha1 = "ce3a1b7b6a92b9af30791356a4bd46d1cea6cc1e",
 )
 
 maven_jar(
     name = "lucene-queryparser",
     artifact = "org.apache.lucene:lucene-queryparser:" + LUCENE_VERS,
-    sha1 = "6c965eb5838a2ba58b0de0fd860a420dcda11937",
+    sha1 = "2db9ca0086a4b8e0b9bc9f08a9b420303168e37c",
 )
 
 maven_jar(
@@ -554,17 +728,17 @@
 
 maven_jar(
     name = "blame-cache",
-    artifact = "com/google/gitiles:blame-cache:0.2-5",
+    artifact = "com/google/gitiles:blame-cache:0.2-7",
     attach_source = False,
     repository = GERRIT,
-    sha1 = "50861b114350c598579ba66f99285e692e3c8d45",
+    sha1 = "8170f33b8b1db6f55e41d7069fa050a4d102a62b",
 )
 
 # Keep this version of Soy synchronized with the version used in Gitiles.
 maven_jar(
     name = "soy",
-    artifact = "com.google.template:soy:2017-04-23",
-    sha1 = "52f32a5a3801ab97e0909373ef7f73a3460d0802",
+    artifact = "com.google.template:soy:2018-03-14",
+    sha1 = "76a1322705ba5a6d6329ee26e7387417725ce4b3",
 )
 
 maven_jar(
@@ -606,13 +780,10 @@
     sha1 = "d0c46320fbc07be3a24eb13a56cee4e3d38e0c75",
 )
 
-# TODO(davido): Remove exlusion of file system provider, when this issue is fixed:
-# https://issues.apache.org/jira/browse/SSHD-736
 maven_jar(
     name = "sshd",
-    artifact = "org.apache.sshd:sshd-core:1.6.0",
-    exclude = ["META-INF/services/java.nio.file.spi.FileSystemProvider"],
-    sha1 = "548e2da643e88cda9d313efb2564a74f9943e491",
+    artifact = "org.apache.sshd:sshd-core:2.0.0",
+    sha1 = "f4275079a2463cfd2bf1548a80e1683288a8e86b",
 )
 
 maven_jar(
@@ -623,8 +794,14 @@
 
 maven_jar(
     name = "mina-core",
-    artifact = "org.apache.mina:mina-core:2.0.16",
-    sha1 = "f720f17643eaa7b0fec07c1d7f6272972c02bba4",
+    artifact = "org.apache.mina:mina-core:2.0.17",
+    sha1 = "7e10ec974760436d931f3e58be507d1957bcc8db",
+)
+
+maven_jar(
+    name = "sshd-mina",
+    artifact = "org.apache.sshd:sshd-mina:2.0.0",
+    sha1 = "50f2669312494f6c1996d8bd0d266c1fca7be6f6",
 )
 
 maven_jar(
@@ -680,8 +857,8 @@
 
 maven_jar(
     name = "junit",
-    artifact = "junit:junit:4.11",
-    sha1 = "4e031bb61df09069aeb2bffb4019e7a5034a4ee0",
+    artifact = "junit:junit:4.12",
+    sha1 = "2973d150c0dc1fefe998f834810d68f278ea58ec",
 )
 
 maven_jar(
@@ -690,18 +867,36 @@
     sha1 = "42a25dc3219429f0e5d060061f71acb49bf010a0",
 )
 
-TRUTH_VERS = "0.35"
+TRUTH_VERS = "0.42"
 
 maven_jar(
     name = "truth",
     artifact = "com.google.truth:truth:" + TRUTH_VERS,
-    sha1 = "c08a7fde45e058323bcfa3f510d4fe1e2b028f37",
+    sha1 = "b5768f644b114e6cf5c3962c2ebcb072f788dcbb",
 )
 
 maven_jar(
     name = "truth-java8-extension",
     artifact = "com.google.truth.extensions:truth-java8-extension:" + TRUTH_VERS,
-    sha1 = "5457fdf91b1e954b070ad7f2db9bea5505da4bca",
+    sha1 = "4d01dfa5b3780632a3d109e14e101f01d10cce2c",
+)
+
+maven_jar(
+    name = "truth-liteproto-extension",
+    artifact = "com.google.truth.extensions:truth-liteproto-extension:" + TRUTH_VERS,
+    sha1 = "c231e6735aa6c133c7e411ae1c1c90b124900a8b",
+)
+
+maven_jar(
+    name = "truth-proto-extension",
+    artifact = "com.google.truth.extensions:truth-proto-extension:" + TRUTH_VERS,
+    sha1 = "c41d22e8b4a61b4171e57c44a2959ebee0091a14",
+)
+
+maven_jar(
+    name = "diffutils",
+    artifact = "com.googlecode.java-diff-utils:diffutils:1.3.0",
+    sha1 = "7e060dd5b19431e6d198e91ff670644372f60fbd",
 )
 
 # When bumping the easymock version number, make sure to also move powermock to a compatible version
@@ -713,8 +908,8 @@
 
 maven_jar(
     name = "cglib-3_2",
-    artifact = "cglib:cglib-nodep:3.2.0",
-    sha1 = "cf1ca207c15b04ace918270b6cb3f5601160cdfd",
+    artifact = "cglib:cglib-nodep:3.2.6",
+    sha1 = "92bf48723d277d6efd1150b2f7e9e1e92cb56caf",
 )
 
 maven_jar(
@@ -763,8 +958,8 @@
 
 maven_jar(
     name = "javassist",
-    artifact = "org.javassist:javassist:3.20.0-GA",
-    sha1 = "a9cbcdfb7e9f86fbc74d3afae65f2248bfbf82a0",
+    artifact = "org.javassist:javassist:3.22.0-GA",
+    sha1 = "3e83394258ae2089be7219b971ec21a8288528ad",
 )
 
 maven_jar(
@@ -774,66 +969,66 @@
     sha1 = "75070c744a8e52a7d17b8b476468580309d5cd09",
 )
 
-JETTY_VERS = "9.3.24.v20180605"
+JETTY_VERS = "9.4.14.v20181114"
 
 maven_jar(
     name = "jetty-servlet",
     artifact = "org.eclipse.jetty:jetty-servlet:" + JETTY_VERS,
-    sha1 = "db09c8e226c07c46dc3d84626fc97955ec6bf8bf",
+    sha1 = "96f501462af425190ff7b63e387692c1aa3af2c8",
 )
 
 maven_jar(
     name = "jetty-security",
     artifact = "org.eclipse.jetty:jetty-security:" + JETTY_VERS,
-    sha1 = "dfc4e2169f3dd91954804e7fdff9c4f67c63f385",
+    sha1 = "6cbeb2fe9b3cc4f88a7ea040b8a0c4f703cd72ce",
 )
 
 maven_jar(
     name = "jetty-servlets",
     artifact = "org.eclipse.jetty:jetty-servlets:" + JETTY_VERS,
-    sha1 = "189db52691aacab9e13546429583765d143faf81",
+    sha1 = "38cfc07b53e5d285bb2fca78bb2531565ed9c9e5",
 )
 
 maven_jar(
     name = "jetty-server",
     artifact = "org.eclipse.jetty:jetty-server:" + JETTY_VERS,
-    sha1 = "0e629740cf0a08b353ec07c35eeab8fd06590041",
+    sha1 = "b36a3d52d78a1df6406f6fa236a6eeff48cbfef6",
 )
 
 maven_jar(
     name = "jetty-jmx",
     artifact = "org.eclipse.jetty:jetty-jmx:" + JETTY_VERS,
-    sha1 = "aaeda444192a42389d2ac17a786329a1b6f4cf68",
+    sha1 = "3e02463d2bff175a3231cd3dc26363eaf76a3b17",
 )
 
 maven_jar(
     name = "jetty-continuation",
     artifact = "org.eclipse.jetty:jetty-continuation:" + JETTY_VERS,
-    sha1 = "44d7b4a9aef498abef268f3aade92daa459050f6",
+    sha1 = "ac4981a61bcaf4e2538de6270300a870224a16b8",
 )
 
 maven_jar(
     name = "jetty-http",
     artifact = "org.eclipse.jetty:jetty-http:" + JETTY_VERS,
-    sha1 = "f3d614a7c82b5ee028df78bdb3cdadb6c3be89bc",
+    sha1 = "6d0c8ac42e9894ae7b5032438eb4579c2a47f4fe",
 )
 
 maven_jar(
     name = "jetty-io",
     artifact = "org.eclipse.jetty:jetty-io:" + JETTY_VERS,
-    sha1 = "f12a02ab2cb79eb9c3fa01daf28a58e8ea7cbea9",
+    sha1 = "a8c6a705ddb9f83a75777d89b0be59fcef3f7637",
 )
 
 maven_jar(
     name = "jetty-util",
     artifact = "org.eclipse.jetty:jetty-util:" + JETTY_VERS,
-    sha1 = "f74fb3f999e658a2ddea397155e20da5b9126b5d",
+    sha1 = "5bb3d7a38f7ea54138336591d89dd5867b806c02",
 )
 
 maven_jar(
     name = "openid-consumer",
-    artifact = "org.openid4java:openid4java:0.9.8",
-    sha1 = "de4f1b33d3b0f0b2ab1d32834ec1190b39db4160",
+    artifact = "org.openid4java:openid4java:1.0.0",
+    sha1 = "541091bb49f2c0d583544c5bb1e6df7612d31e3e",
 )
 
 maven_jar(
@@ -856,15 +1051,15 @@
 )
 
 maven_jar(
-    name = "codemirror-minified",
+    name = "codemirror-minified-gwt",
     artifact = "org.webjars.npm:codemirror-minified:" + CM_VERSION,
-    sha1 = "f84c178b11a188f416b4380bfb2b24f126453d28",
+    sha1 = "36558ea3b8e30782e1e09c0e7bd781e09614f139",
 )
 
 maven_jar(
-    name = "codemirror-original",
+    name = "codemirror-original-gwt",
     artifact = "org.webjars.npm:codemirror:" + CM_VERSION,
-    sha1 = "5a1f6c10d5aef0b9d2ce513dcc1e2657e4af730d",
+    sha1 = "f1f8fbbc3e2d224fdccc43d2f4180658a92320f9",
 )
 
 maven_jar(
@@ -942,12 +1137,16 @@
 
 load("//tools/bzl:js.bzl", "bower_archive", "npm_binary")
 
+# NPM binaries bundled along with their dependencies.
+#
+# For full instructions on adding new binaries to the build, see
+# http://gerrit-review.googlesource.com/Documentation/dev-bazel.html#npm-binary
 npm_binary(
     name = "bower",
 )
 
 npm_binary(
-    name = "vulcanize",
+    name = "polymer-bundler",
     repository = GERRIT,
 )
 
@@ -1009,8 +1208,8 @@
 bower_archive(
     name = "paper-button",
     package = "polymerelements/paper-button",
-    sha1 = "41a8fec68d93dad223ad2076d68515334b2c8d7b",
-    version = "1.0.11",
+    sha1 = "3b01774f58a8085d3c903fc5a32944b26ab7be72",
+    version = "2.0.0",
 )
 
 bower_archive(
@@ -1021,6 +1220,13 @@
 )
 
 bower_archive(
+    name = "paper-tabs",
+    package = "polymerelements/paper-tabs",
+    sha1 = "b6dd2fbd7ee887534334057a29eb545b940fc5cf",
+    version = "2.0.0",
+)
+
+bower_archive(
     name = "iron-icon",
     package = "polymerelements/iron-icon",
     sha1 = "7da49a0d33cd56017740e0dbcf41d2b71532023f",
@@ -1063,17 +1269,24 @@
 )
 
 bower_archive(
+    name = "paper-toggle-button",
+    package = "polymerelements/paper-toggle-button",
+    sha1 = "4a2edbdb52c4531d39fe091f12de650bccda270f",
+    version = "1.2.0",
+)
+
+bower_archive(
     name = "polymer",
     package = "polymer/polymer",
-    sha1 = "62ce80a5079c1b97f6c5c6ebf6b350e741b18b9c",
-    version = "1.11.0",
+    sha1 = "158443ab05ade5e2cdc24ebc01f1deef9aebac1b",
+    version = "1.11.3",
 )
 
 bower_archive(
     name = "polymer-resin",
     package = "polymer/polymer-resin",
-    sha1 = "93ac118f2b9209cfbfd6dc8022d9492743d17f24",
-    version = "1.2.7",
+    sha1 = "5cb65081d461e710252a1ba1e671fe4c290356ef",
+    version = "1.2.8",
 )
 
 bower_archive(
@@ -1083,6 +1296,20 @@
     version = "1.0.0",
 )
 
+bower_archive(
+    name = "resemblejs",
+    package = "rsmbl/Resemble.js",
+    sha1 = "49d5f022417c389b630d6f7ee667aa9540075c42",
+    version = "2.10.1",
+)
+
+bower_archive(
+    name = "codemirror-minified",
+    package = "Dominator008/codemirror-minified",
+    sha1 = "1524e19087d8223edfe4a5b1ccf04c1e3707235d",
+    version = "5.37.0",
+)
+
 # bower test stuff
 
 bower_archive(
@@ -1101,9 +1328,9 @@
 
 bower_archive(
     name = "web-component-tester",
-    package = "web-component-tester",
-    sha1 = "4e778f8b7d784ba2a069d83d0cd146125c5c4fcb",
-    version = "5.0.1",
+    package = "polymer/web-component-tester",
+    sha1 = "62739cb633fccfddc5eeed98e9e3f69cd0388b5b",
+    version = "6.5.0",
 )
 
 # Bower component transitive dependencies.
diff --git a/antlr3/BUILD b/antlr3/BUILD
new file mode 100644
index 0000000..fc96715
--- /dev/null
+++ b/antlr3/BUILD
@@ -0,0 +1,31 @@
+load("//tools/bzl:genrule2.bzl", "genrule2")
+
+genrule2(
+    name = "query",
+    srcs = ["com/google/gerrit/index/query/Query.g"],
+    outs = ["query_antlr.srcjar"],
+    cmd = " && ".join([
+        "$(location //lib/antlr:antlr-tool) -o $$TMP $<",
+        "cd $$TMP",
+        "find . -exec touch -t 198001010000 '{}' ';'",
+        "zip -q $$ROOT/$@ $$(find . -type f)",
+    ]),
+    tools = [
+        "//lib/antlr:antlr-tool",
+    ],
+    visibility = ["//visibility:public"],
+)
+
+java_library(
+    name = "query_parser",
+    srcs = [":query"],
+    visibility = [
+        "//java/com/google/gerrit/index:__pkg__",
+        "//javatests/com/google/gerrit/index:__pkg__",
+        "//plugins:__pkg__",
+    ],
+    deps = [
+        "//java/com/google/gerrit/index:query_exception",
+        "//lib/antlr:java-runtime",
+    ],
+)
diff --git a/gerrit-index/src/main/antlr3/com/google/gerrit/index/query/Query.g b/antlr3/com/google/gerrit/index/query/Query.g
similarity index 100%
rename from gerrit-index/src/main/antlr3/com/google/gerrit/index/query/Query.g
rename to antlr3/com/google/gerrit/index/query/Query.g
diff --git a/contrib/abandon_stale.py b/contrib/abandon_stale.py
index 99022aa..2e01131 100755
--- a/contrib/abandon_stale.py
+++ b/contrib/abandon_stale.py
@@ -71,6 +71,9 @@
                       action='store_true',
                       help='enable dry-run mode: show stale changes but do '
                            'not abandon them')
+    parser.add_option('-t', '--test', dest='testmode', action='store_true',
+                      help='test mode: query changes with the `test-abandon` '
+                           'topic and ignore age option')
     parser.add_option('-a', '--age', dest='age',
                       metavar='AGE',
                       default="6months",
@@ -100,6 +103,9 @@
                       default=None,
                       action='store',
                       help='only abandon changes owned by the given user')
+    parser.add_option('--exclude-wip', dest='exclude_wip',
+                      action='store_true',
+                      help='Exclude changes that are Work-in-Progress')
     parser.add_option('-v', '--verbose', dest='verbose',
                       action='store_true',
                       help='enable verbose (debug) logging')
@@ -114,13 +120,16 @@
         logging.error("Gerrit URL is required")
         return 1
 
-    pattern = re.compile(r"^([\d]+)(month[s]?|year[s]?|week[s]?)")
-    match = pattern.match(options.age)
-    if not match:
-        logging.error("Invalid age: %s", options.age)
-        return 1
-    message = "Abandoning after %s %s or more of inactivity." % \
-        (match.group(1), match.group(2))
+    if options.testmode:
+        message = "Abandoning in test mode"
+    else:
+        pattern = re.compile(r"^([\d]+)(month[s]?|year[s]?|week[s]?)")
+        match = pattern.match(options.age)
+        if not match:
+            logging.error("Invalid age: %s", options.age)
+            return 1
+        message = "Abandoning after %s %s or more of inactivity." % \
+            (match.group(1), match.group(2))
 
     if options.digest_auth:
         auth_type = HTTPDigestAuthFromNetrc
@@ -139,7 +148,12 @@
         stale_changes = []
         offset = 0
         step = 500
-        query_terms = ["status:new", "age:%s" % options.age]
+        if options.testmode:
+            query_terms = ["status:new", "owner:self", "topic:test-abandon"]
+        else:
+            query_terms = ["status:new", "age:%s" % options.age]
+        if options.exclude_wip:
+            query_terms += ["-is:wip"]
         if options.branches:
             query_terms += ["branch:%s" % b for b in options.branches]
         elif options.exclude_branches:
@@ -148,7 +162,7 @@
             query_terms += ["project:%s" % p for p in options.projects]
         elif options.exclude_projects:
             query_terms = ["-project:%s" % p for p in options.exclude_projects]
-        if options.owner:
+        if options.owner and not options.testmode:
             query_terms += ["owner:%s" % options.owner]
         query = "%20".join(query_terms)
         while True:
@@ -177,21 +191,27 @@
         abandon_message += "\n\n" + options.message
     for change in stale_changes:
         number = change["_number"]
-        try:
-            owner = change["owner"]["name"]
-        except:
-            owner = "Unknown"
+        project = ""
+        if len(options.projects) != 1:
+            project = "%s: " % change["project"]
+        owner = ""
+        if options.verbose:
+            try:
+                o = change["owner"]["name"]
+            except KeyError:
+                o = "Unknown"
+            owner = " (%s)" % o
         subject = change["subject"]
         if len(subject) > 70:
             subject = subject[:65] + " [...]"
         change_id = change["id"]
-        logging.info("%s (%s): %s", number, owner, subject)
+        logging.info("%s%s: %s%s", number, owner, project, subject)
         if options.dry_run:
             continue
 
         try:
             gerrit.post("/changes/" + change_id + "/abandon",
-                        json={"message" : "%s" % abandon_message})
+                        json={"message": "%s" % abandon_message})
             abandoned += 1
         except Exception as e:
             errors += 1
@@ -200,5 +220,6 @@
     if not options.dry_run:
         logging.info("Abandoned %d changes. %d errors.", abandoned, errors)
 
+
 if __name__ == "__main__":
     sys.exit(_main())
diff --git a/contrib/check-valid-commit.py b/contrib/check-valid-commit.py
index d26fa58..763ae3e 100755
--- a/contrib/check-valid-commit.py
+++ b/contrib/check-valid-commit.py
@@ -10,13 +10,16 @@
 SSH_USER = 'bot'
 SSH_HOST = 'localhost'
 SSH_PORT = 29418
-SSH_COMMAND = 'ssh %s@%s -p %d gerrit approve ' % (SSH_USER, SSH_HOST, SSH_PORT)
+SSH_COMMAND = 'ssh %s@%s -p %d gerrit approve ' % (SSH_USER,
+                                                   SSH_HOST,
+                                                   SSH_PORT)
 FAILURE_SCORE = '--code-review=-2'
 FAILURE_MESSAGE = 'This commit message does not match the standard.' \
         + '  Please correct the commit message and upload a replacement patch.'
 PASS_SCORE = '--code-review=0'
 PASS_MESSAGE = ''
 
+
 def main():
     change = None
     project = None
@@ -25,8 +28,9 @@
     patchset = None
 
     try:
-        opts, _args = getopt.getopt(sys.argv[1:], '', \
-            ['change=', 'project=', 'branch=', 'commit=', 'patchset='])
+        opts, _args = getopt.getopt(sys.argv[1:], '',
+                                    ['change=', 'project=', 'branch=',
+                                     'commit=', 'patchset='])
     except getopt.GetoptError as err:
         print('Error: %s' % (err))
         usage()
@@ -48,8 +52,7 @@
             usage()
             sys.exit(-1)
 
-    if change == None or project == None or branch == None \
-        or commit == None or patchset == None:
+    if any(p is None for p in [change, project, branch, commit, patchset]):
         usage()
         sys.exit(-1)
 
@@ -57,16 +60,16 @@
     status, output = subprocess.getstatusoutput(command)
 
     if status != 0:
-        print('Error running \'%s\'. status: %s, output:\n\n%s' % \
-            (command, status, output))
+        print('Error running \'%s\'. status: %s, output:\n\n%s' %
+              (command, status, output))
         sys.exit(-1)
 
     commitMessage = output[(output.find('\n\n')+2):]
     commitLines = commitMessage.split('\n')
 
     if len(commitLines) > 1 and len(commitLines[1]) != 0:
-        fail(commit, 'Invalid commit summary.  The summary must be ' \
-            + 'one line followed by a blank line.')
+        fail(commit, 'Invalid commit summary.  The summary must be '
+             + 'one line followed by a blank line.')
 
     i = 0
     for line in commitLines:
@@ -76,23 +79,27 @@
 
     passes(commit)
 
+
 def usage():
     print('Usage:\n')
-    print(sys.argv[0] + ' --change <change id> --project <project name> ' \
-        + '--branch <branch> --commit <sha1> --patchset <patchset id>')
+    print(sys.argv[0] + ' --change <change id> --project <project name> '
+          + '--branch <branch> --commit <sha1> --patchset <patchset id>')
 
-def fail( commit, message ):
+
+def fail(commit, message):
     command = SSH_COMMAND + FAILURE_SCORE + ' -m \\\"' \
-        + _shell_escape( FAILURE_MESSAGE + '\n\n' + message) \
+        + _shell_escape(FAILURE_MESSAGE + '\n\n' + message) \
         + '\\\" ' + commit
     subprocess.getstatusoutput(command)
     sys.exit(1)
 
-def passes( commit ):
+
+def passes(commit):
     command = SSH_COMMAND + PASS_SCORE + ' -m \\\"' \
         + _shell_escape(PASS_MESSAGE) + ' \\\" ' + commit
     subprocess.getstatusoutput(command)
 
+
 def _shell_escape(x):
     s = ''
     for c in x:
@@ -102,6 +109,6 @@
             s = s + c
     return s
 
+
 if __name__ == '__main__':
     main()
-
diff --git a/contrib/git-push-review b/contrib/git-push-review
index 87eaa4c..b995fc2 100755
--- a/contrib/git-push-review
+++ b/contrib/git-push-review
@@ -50,6 +50,10 @@
                  help='reviewer names or aliases, or #hashtags')
   p.add_argument('-t', '--topic', default='', metavar='TOPIC',
                  help='topic for new changes')
+  p.add_argument('-e', '--edit', action='store_true',
+                 help='upload as change edit')
+  p.add_argument('-w', '--wip', action='store_true', help='upload as WIP')
+  p.add_argument('-y', '--ready', action='store_true', help='set ready')
   p.add_argument('--dry-run', action='store_true',
                  help='dry run, print git command and exit')
   args = p.parse_args()
@@ -77,7 +81,22 @@
   opts['t'].extend(t[1:] for t in args.args if is_hashtag(t))
   if args.topic:
     opts['topic'].append(args.topic)
-  opts_str = ','.join('%s=%s' % (k, v) for k in opts for v in opts[k])
+  if args.edit:
+    opts['edit'].append(True)
+  if args.wip:
+    opts['wip'].append(True)
+  if args.ready:
+    opts['ready'].append(True)
+
+  opts_strs = []
+  for k in opts:
+    for v in opts[k]:
+      if v == True:
+        opts_strs.append(k)
+      elif v != False:
+        opts_strs.append('%s=%s' % (k, v))
+
+  opts_str = ','.join(opts_strs)
   if opts_str:
     opts_str = '%' + opts_str
 
diff --git a/contrib/gitiles b/contrib/gitiles
new file mode 100755
index 0000000..3e603b9
--- /dev/null
+++ b/contrib/gitiles
@@ -0,0 +1,84 @@
+#!/bin/bash
+#
+# 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.
+
+usage() {
+  me=`basename "$0"`
+  echo >&2 "Usage: $me [open] [-b branch] [path]"
+  exit 1
+}
+
+cmd_open() {
+  case "$(uname)" in
+    Darwin)
+      echo "open"
+      ;;
+    Linux)
+      echo "xdg-open"
+      ;;
+
+    *)
+      echo >&2 "Don't know how to open URLs on $(uname)"
+      exit 1
+  esac
+}
+
+URL=$(git config --get gitiles.url)
+
+if test -z "$URL" ; then
+  echo >&2 "gitiles.url must be set in .git/config"
+  exit 1
+fi
+
+while test $# -gt 0 ; do
+  case "$1" in
+  open)
+    CMD=$(cmd_open)
+    shift
+    ;;
+  -b|--branch)
+    shift
+    B=$1
+    shift
+    ;;
+  -h|--help)
+    usage
+    ;;
+
+  *)
+    P=$1
+    shift
+  esac
+done
+
+if test -z "$CMD" ; then
+  CMD=echo
+fi
+
+if test -z "$B" ; then
+  B=$(git rev-parse HEAD)
+fi
+
+URL="$URL/+/$B"
+
+if test -z "$P" ; then
+  P=$(git rev-parse --show-prefix)
+elif test ${P:0:2} = "./" ; then
+  P=$(git rev-parse --show-prefix)${P:2}
+fi
+
+URL="$URL/$P"
+
+$CMD $URL
diff --git a/contrib/populate-fixture-data.py b/contrib/populate-fixture-data.py
old mode 100644
new mode 100755
index 0e3dffe..22e0c1b
--- a/contrib/populate-fixture-data.py
+++ b/contrib/populate-fixture-data.py
@@ -17,34 +17,25 @@
 This script will populate an empty standard Gerrit instance with some
 data for local testing.
 
-This script requires 'requests'. If you do not have this module, run
-'pip3 install requests' to install it.
-
 TODO(hiesel): Make real git commits instead of empty changes
 TODO(hiesel): Add comments
 """
 
+from __future__ import print_function
 import atexit
 import json
+import optparse
 import os
 import random
 import shutil
 import subprocess
 import tempfile
-
 import requests
 import requests.auth
 
 DEFAULT_TMP_PATH = "/tmp"
 TMP_PATH = ""
-BASE_URL = "http://localhost:8080/a/"
-ACCESS_URL = BASE_URL + "access/"
-ACCOUNTS_URL = BASE_URL + "accounts/"
-CHANGES_URL = BASE_URL + "changes/"
-CONFIG_URL = BASE_URL + "config/"
-GROUPS_URL = BASE_URL + "groups/"
-PLUGINS_URL = BASE_URL + "plugins/"
-PROJECTS_URL = BASE_URL + "projects/"
+BASE_URL = "http://localhost:%d/a/"
 
 ADMIN_BASIC_AUTH = requests.auth.HTTPBasicAuth("admin", "secret")
 
@@ -56,245 +47,265 @@
 
 # Random names from US Census Data
 FIRST_NAMES = [
-  "Casey", "Yesenia", "Shirley", "Tara", "Wanda", "Sheryl", "Jaime", "Elaine",
-  "Charlotte", "Carly", "Bonnie", "Kirsten", "Kathryn", "Carla", "Katrina",
-  "Melody", "Suzanne", "Sandy", "Joann", "Kristie", "Sally", "Emma", "Susan",
-  "Amanda", "Alyssa", "Patty", "Angie", "Dominique", "Cynthia", "Jennifer",
-  "Theresa", "Desiree", "Kaylee", "Maureen", "Jeanne", "Kellie", "Valerie",
-  "Nina", "Judy", "Diamond", "Anita", "Rebekah", "Stefanie", "Kendra", "Erin",
-  "Tammie", "Tracey", "Bridget", "Krystal", "Jasmin", "Sonia", "Meghan",
-  "Rebecca", "Jeanette", "Meredith", "Beverly", "Natasha", "Chloe", "Selena",
-  "Teresa", "Sheena", "Cassandra", "Rhonda", "Tami", "Jodi", "Shelly", "Angela",
-  "Kimberly", "Terry", "Joanna", "Isabella", "Lindsey", "Loretta", "Dana",
-  "Veronica", "Carolyn", "Laura", "Karen", "Dawn", "Alejandra", "Cassie",
-  "Lorraine", "Yolanda", "Kerry", "Stephanie", "Caitlin", "Melanie", "Kerri",
-  "Doris", "Sandra", "Beth", "Carol", "Vicki", "Shelia", "Bethany", "Rachael",
-  "Donna", "Alexandra", "Barbara", "Ana", "Jillian", "Ann", "Rachel", "Lauren",
-  "Hayley", "Misty", "Brianna", "Tanya", "Danielle", "Courtney", "Jacqueline",
-  "Becky", "Christy", "Alisha", "Phyllis", "Faith", "Jocelyn", "Nancy",
-  "Gloria", "Kristen", "Evelyn", "Julie", "Julia", "Kara", "Chelsey", "Cassidy",
-  "Jean", "Chelsea", "Jenny", "Diana", "Haley", "Kristine", "Kristina", "Erika",
-  "Jenna", "Alison", "Deanna", "Abigail", "Melissa", "Sierra", "Linda",
-  "Monica", "Tasha", "Traci", "Yvonne", "Tracy", "Marie", "Maria", "Michaela",
-  "Stacie", "April", "Morgan", "Cathy", "Darlene", "Cristina", "Emily"
-  "Ian", "Russell", "Phillip", "Jay", "Barry", "Brad", "Frederick", "Fernando",
-  "Timothy", "Ricardo", "Bernard", "Daniel", "Ruben", "Alexis", "Kyle", "Malik",
-  "Norman", "Kent", "Melvin", "Stephen", "Daryl", "Kurt", "Greg", "Alex",
-  "Mario", "Riley", "Marvin", "Dan", "Steven", "Roberto", "Lucas", "Leroy",
-  "Preston", "Drew", "Fred", "Casey", "Wesley", "Elijah", "Reginald", "Joel",
-  "Christopher", "Jacob", "Luis", "Philip", "Mark", "Rickey", "Todd", "Scott",
-  "Terrence", "Jim", "Stanley", "Bobby", "Thomas", "Gabriel", "Tracy", "Marcus",
-  "Peter", "Michael", "Calvin", "Herbert", "Darryl", "Billy", "Ross", "Dustin",
-  "Jaime", "Adam", "Henry", "Xavier", "Dominic", "Lonnie", "Danny", "Victor",
-  "Glen", "Perry", "Jackson", "Grant", "Gerald", "Garrett", "Alejandro",
-  "Eddie", "Alan", "Ronnie", "Mathew", "Dave", "Wayne", "Joe", "Craig",
-  "Terry", "Chris", "Randall", "Parker", "Francis", "Keith", "Neil", "Caleb",
-  "Jon", "Earl", "Taylor", "Bryce", "Brady", "Max", "Sergio", "Leon", "Gene",
-  "Darin", "Bill", "Edgar", "Antonio", "Dalton", "Arthur", "Austin", "Cristian",
-  "Kevin", "Omar", "Kelly", "Aaron", "Ethan", "Tom", "Isaac", "Maurice",
-  "Gilbert", "Hunter", "Willie", "Harry", "Dale", "Darius", "Jerome", "Jason",
-  "Harold", "Kerry", "Clarence", "Gregg", "Shane", "Eduardo", "Micheal",
-  "Howard", "Vernon", "Rodney", "Anthony", "Levi", "Larry", "Franklin", "Jimmy",
-  "Jonathon", "Carl",
+    "Casey", "Yesenia", "Shirley", "Tara", "Wanda", "Sheryl", "Jaime",
+    "Elaine", "Charlotte", "Carly", "Bonnie", "Kirsten", "Kathryn", "Carla",
+    "Katrina", "Melody", "Suzanne", "Sandy", "Joann", "Kristie", "Sally",
+    "Emma", "Susan", "Amanda", "Alyssa", "Patty", "Angie", "Dominique",
+    "Cynthia", "Jennifer", "Theresa", "Desiree", "Kaylee", "Maureen",
+    "Jeanne", "Kellie", "Valerie", "Nina", "Judy", "Diamond", "Anita",
+    "Rebekah", "Stefanie", "Kendra", "Erin", "Tammie", "Tracey", "Bridget",
+    "Krystal", "Jasmin", "Sonia", "Meghan", "Rebecca", "Jeanette", "Meredith",
+    "Beverly", "Natasha", "Chloe", "Selena", "Teresa", "Sheena", "Cassandra",
+    "Rhonda", "Tami", "Jodi", "Shelly", "Angela", "Kimberly", "Terry",
+    "Joanna", "Isabella", "Lindsey", "Loretta", "Dana", "Veronica", "Carolyn",
+    "Laura", "Karen", "Dawn", "Alejandra", "Cassie", "Lorraine", "Yolanda",
+    "Kerry", "Stephanie", "Caitlin", "Melanie", "Kerri", "Doris", "Sandra",
+    "Beth", "Carol", "Vicki", "Shelia", "Bethany", "Rachael", "Donna",
+    "Alexandra", "Barbara", "Ana", "Jillian", "Ann", "Rachel", "Lauren",
+    "Hayley", "Misty", "Brianna", "Tanya", "Danielle", "Courtney",
+    "Jacqueline", "Becky", "Christy", "Alisha", "Phyllis", "Faith", "Jocelyn",
+    "Nancy", "Gloria", "Kristen", "Evelyn", "Julie", "Julia", "Kara",
+    "Chelsey", "Cassidy", "Jean", "Chelsea", "Jenny", "Diana", "Haley",
+    "Kristine", "Kristina", "Erika", "Jenna", "Alison", "Deanna", "Abigail",
+    "Melissa", "Sierra", "Linda", "Monica", "Tasha", "Traci", "Yvonne",
+    "Tracy", "Marie", "Maria", "Michaela", "Stacie", "April", "Morgan",
+    "Cathy", "Darlene", "Cristina", "Emily" "Ian", "Russell", "Phillip", "Jay",
+    "Barry", "Brad", "Frederick", "Fernando", "Timothy", "Ricardo", "Bernard",
+    "Daniel", "Ruben", "Alexis", "Kyle", "Malik", "Norman", "Kent", "Melvin",
+    "Stephen", "Daryl", "Kurt", "Greg", "Alex", "Mario", "Riley", "Marvin",
+    "Dan", "Steven", "Roberto", "Lucas", "Leroy", "Preston", "Drew", "Fred",
+    "Casey", "Wesley", "Elijah", "Reginald", "Joel", "Christopher", "Jacob",
+    "Luis", "Philip", "Mark", "Rickey", "Todd", "Scott", "Terrence", "Jim",
+    "Stanley", "Bobby", "Thomas", "Gabriel", "Tracy", "Marcus", "Peter",
+    "Michael", "Calvin", "Herbert", "Darryl", "Billy", "Ross", "Dustin",
+    "Jaime", "Adam", "Henry", "Xavier", "Dominic", "Lonnie", "Danny", "Victor",
+    "Glen", "Perry", "Jackson", "Grant", "Gerald", "Garrett", "Alejandro",
+    "Eddie", "Alan", "Ronnie", "Mathew", "Dave", "Wayne", "Joe", "Craig",
+    "Terry", "Chris", "Randall", "Parker", "Francis", "Keith", "Neil", "Caleb",
+    "Jon", "Earl", "Taylor", "Bryce", "Brady", "Max", "Sergio", "Leon", "Gene",
+    "Darin", "Bill", "Edgar", "Antonio", "Dalton", "Arthur", "Austin",
+    "Cristian", "Kevin", "Omar", "Kelly", "Aaron", "Ethan", "Tom", "Isaac",
+    "Maurice", "Gilbert", "Hunter", "Willie", "Harry", "Dale", "Darius",
+    "Jerome", "Jason", "Harold", "Kerry", "Clarence", "Gregg", "Shane",
+    "Eduardo", "Micheal", "Howard", "Vernon", "Rodney", "Anthony", "Levi",
+    "Larry", "Franklin", "Jimmy", "Jonathon", "Carl",
 ]
 
 LAST_NAMES = [
-  "Savage", "Hendrix", "Moon", "Larsen", "Rocha", "Burgess", "Bailey", "Farley",
-  "Moses", "Schmidt", "Brown", "Hoover", "Klein", "Jennings", "Braun", "Rangel",
-  "Casey", "Dougherty", "Hancock", "Wolf", "Henry", "Thomas", "Bentley",
-  "Barnett", "Kline", "Pitts", "Rojas", "Sosa", "Paul", "Hess", "Chase",
-  "Mckay", "Bender", "Colins", "Montoya", "Townsend", "Potts", "Ayala", "Avery",
-  "Sherman", "Tapia", "Hamilton", "Ferguson", "Huang", "Hooper", "Zamora",
-  "Logan", "Lloyd", "Quinn", "Monroe", "Brock", "Ibarra", "Fowler", "Weiss",
-  "Montgomery", "Diaz", "Dixon", "Olson", "Robertson", "Arias", "Benjamin",
-  "Abbott", "Stein", "Schroeder", "Beck", "Velasquez", "Barber", "Nichols",
-  "Ortiz", "Burns", "Moody", "Stokes", "Wilcox", "Rush", "Michael", "Kidd",
-  "Rowland", "Mclean", "Saunders", "Chung", "Newton", "Potter", "Hickman",
-  "Ray", "Larson", "Figueroa", "Duncan", "Sparks", "Rose", "Hodge", "Huynh",
-  "Joseph", "Morales", "Beasley", "Mora", "Fry", "Ross", "Novak", "Hahn",
-  "Wise", "Knight", "Frederick", "Heath", "Pollard", "Vega", "Mcclain",
-  "Buckley", "Conrad", "Cantrell", "Bond", "Mejia", "Wang", "Lewis", "Johns",
-  "Mcknight", "Callahan", "Reynolds", "Norris", "Burnett", "Carey", "Jacobson",
-  "Oneill", "Oconnor", "Leonard", "Mckenzie", "Hale", "Delgado", "Spence",
-  "Brandt", "Obrien", "Bowman", "James", "Avila", "Roberts", "Barker", "Cohen",
-  "Bradley", "Prince", "Warren", "Summers", "Little", "Caldwell", "Garrett",
-  "Hughes", "Norton", "Burke", "Holden", "Merritt", "Lee", "Frank", "Wiley",
-  "Ho", "Weber", "Keith", "Winters", "Gray", "Watts", "Brady", "Aguilar",
-  "Nicholson", "David", "Pace", "Cervantes", "Davis", "Baxter", "Sanchez",
-  "Singleton", "Taylor", "Strickland", "Glenn", "Valentine", "Roy", "Cameron",
-  "Beard", "Norman", "Fritz", "Anthony", "Koch", "Parrish", "Herman", "Hines",
-  "Sutton", "Gallegos", "Stephenson", "Lozano", "Franklin", "Howe", "Bauer",
-  "Love", "Ali", "Ellison", "Lester", "Guzman", "Jarvis", "Espinoza",
-  "Fletcher", "Burton", "Woodard", "Peterson", "Barajas", "Richard", "Bryan",
-  "Goodman", "Cline", "Rowe", "Faulkner", "Crawford", "Mueller", "Patterson",
-  "Hull", "Walton", "Wu", "Flores", "York", "Dickson", "Barnes", "Fisher",
-  "Strong", "Juarez", "Fitzgerald", "Schmitt", "Blevins", "Villa", "Sullivan",
-  "Velazquez", "Horton", "Meadows", "Riley", "Barrera", "Neal", "Mendez",
-  "Mcdonald", "Floyd", "Lynch", "Mcdowell", "Benson", "Hebert", "Livingston",
-  "Davies", "Richardson", "Vincent", "Davenport", "Osborn", "Mckee", "Marshall",
-  "Ferrell", "Martinez", "Melton", "Mercer", "Yoder", "Jacobs", "Mcdaniel",
-  "Mcmillan", "Peters", "Atkinson", "Wood", "Briggs", "Valencia", "Chandler",
-  "Rios", "Hunter", "Bean", "Hicks", "Hays", "Lucero", "Malone", "Waller",
-  "Banks", "Myers", "Mitchell", "Grimes", "Houston", "Hampton", "Trujillo",
-  "Perkins", "Moran", "Welch", "Contreras", "Montes", "Ayers", "Hayden",
-  "Daniel", "Weeks", "Porter", "Gill", "Mullen", "Nolan", "Dorsey", "Crane",
-  "Estes", "Lam", "Wells", "Cisneros", "Giles", "Watson", "Vang", "Scott",
-  "Knox", "Hanna", "Fields",
+    "Savage", "Hendrix", "Moon", "Larsen", "Rocha", "Burgess", "Bailey",
+    "Farley", "Moses", "Schmidt", "Brown", "Hoover", "Klein", "Jennings",
+    "Braun", "Rangel", "Casey", "Dougherty", "Hancock", "Wolf", "Henry",
+    "Thomas", "Bentley", "Barnett", "Kline", "Pitts", "Rojas", "Sosa", "Paul",
+    "Hess", "Chase", "Mckay", "Bender", "Colins", "Montoya", "Townsend",
+    "Potts", "Ayala", "Avery", "Sherman", "Tapia", "Hamilton", "Ferguson",
+    "Huang", "Hooper", "Zamora", "Logan", "Lloyd", "Quinn", "Monroe", "Brock",
+    "Ibarra", "Fowler", "Weiss", "Montgomery", "Diaz", "Dixon", "Olson",
+    "Robertson", "Arias", "Benjamin", "Abbott", "Stein", "Schroeder", "Beck",
+    "Velasquez", "Barber", "Nichols", "Ortiz", "Burns", "Moody", "Stokes",
+    "Wilcox", "Rush", "Michael", "Kidd", "Rowland", "Mclean", "Saunders",
+    "Chung", "Newton", "Potter", "Hickman", "Ray", "Larson", "Figueroa",
+    "Duncan", "Sparks", "Rose", "Hodge", "Huynh", "Joseph", "Morales",
+    "Beasley", "Mora", "Fry", "Ross", "Novak", "Hahn", "Wise", "Knight",
+    "Frederick", "Heath", "Pollard", "Vega", "Mcclain", "Buckley", "Conrad",
+    "Cantrell", "Bond", "Mejia", "Wang", "Lewis", "Johns", "Mcknight",
+    "Callahan", "Reynolds", "Norris", "Burnett", "Carey", "Jacobson", "Oneill",
+    "Oconnor", "Leonard", "Mckenzie", "Hale", "Delgado", "Spence", "Brandt",
+    "Obrien", "Bowman", "James", "Avila", "Roberts", "Barker", "Cohen",
+    "Bradley", "Prince", "Warren", "Summers", "Little", "Caldwell", "Garrett",
+    "Hughes", "Norton", "Burke", "Holden", "Merritt", "Lee", "Frank", "Wiley",
+    "Ho", "Weber", "Keith", "Winters", "Gray", "Watts", "Brady", "Aguilar",
+    "Nicholson", "David", "Pace", "Cervantes", "Davis", "Baxter", "Sanchez",
+    "Singleton", "Taylor", "Strickland", "Glenn", "Valentine", "Roy",
+    "Cameron", "Beard", "Norman", "Fritz", "Anthony", "Koch", "Parrish",
+    "Herman", "Hines", "Sutton", "Gallegos", "Stephenson", "Lozano",
+    "Franklin", "Howe", "Bauer", "Love", "Ali", "Ellison", "Lester", "Guzman",
+    "Jarvis", "Espinoza", "Fletcher", "Burton", "Woodard", "Peterson",
+    "Barajas", "Richard", "Bryan", "Goodman", "Cline", "Rowe", "Faulkner",
+    "Crawford", "Mueller", "Patterson", "Hull", "Walton", "Wu", "Flores",
+    "York", "Dickson", "Barnes", "Fisher", "Strong", "Juarez", "Fitzgerald",
+    "Schmitt", "Blevins", "Villa", "Sullivan", "Velazquez", "Horton",
+    "Meadows", "Riley", "Barrera", "Neal", "Mendez", "Mcdonald", "Floyd",
+    "Lynch", "Mcdowell", "Benson", "Hebert", "Livingston", "Davies",
+    "Richardson", "Vincent", "Davenport", "Osborn", "Mckee", "Marshall",
+    "Ferrell", "Martinez", "Melton", "Mercer", "Yoder", "Jacobs", "Mcdaniel",
+    "Mcmillan", "Peters", "Atkinson", "Wood", "Briggs", "Valencia", "Chandler",
+    "Rios", "Hunter", "Bean", "Hicks", "Hays", "Lucero", "Malone", "Waller",
+    "Banks", "Myers", "Mitchell", "Grimes", "Houston", "Hampton", "Trujillo",
+    "Perkins", "Moran", "Welch", "Contreras", "Montes", "Ayers", "Hayden",
+    "Daniel", "Weeks", "Porter", "Gill", "Mullen", "Nolan", "Dorsey", "Crane",
+    "Estes", "Lam", "Wells", "Cisneros", "Giles", "Watson", "Vang", "Scott",
+    "Knox", "Hanna", "Fields",
 ]
 
 
 def clean(json_string):
-  # Strip JSON XSS Tag
-  json_string = json_string.strip()
-  if json_string.startswith(")]}'"):
-    return json_string[5:]
-  return json_string
+    # Strip JSON XSS Tag
+    json_string = json_string.strip()
+    if json_string.startswith(")]}'"):
+        return json_string[5:]
+    return json_string
 
 
 def basic_auth(user):
-  return requests.auth.HTTPBasicAuth(user["username"], user["http_password"])
+    return requests.auth.HTTPBasicAuth(user["username"], user["http_password"])
 
 
 def fetch_admin_group():
-  global GROUP_ADMIN
-  # Get admin group
-  r = json.loads(clean(requests.get(GROUPS_URL + "?suggest=ad&p=All-Projects",
-                                    headers=HEADERS,
-                                    auth=ADMIN_BASIC_AUTH).text))
-  admin_group_name = r.keys()[0]
-  GROUP_ADMIN = r[admin_group_name]
-  GROUP_ADMIN["name"] = admin_group_name
+    global GROUP_ADMIN
+    # Get admin group
+    r = json.loads(clean(requests.get(
+        BASE_URL + "groups/?suggest=ad&p=All-Projects",
+        headers=HEADERS,
+        auth=ADMIN_BASIC_AUTH).text))
+    admin_group_name = r.keys()[0]
+    GROUP_ADMIN = r[admin_group_name]
+    GROUP_ADMIN["name"] = admin_group_name
 
 
 def generate_random_text():
-  return " ".join([random.choice("lorem ipsum "
-                                 "doleret delendam "
-                                 "\n esse".split(" ")) for _ in xrange(1, 100)])
+    return " ".join([random.choice("lorem ipsum "
+                                   "doleret delendam "
+                                   "\n esse".split(" ")) for _ in range(1,
+                                                                        100)])
 
 
 def set_up():
-  global TMP_PATH
-  TMP_PATH = tempfile.mkdtemp()
-  atexit.register(clean_up)
-  os.makedirs(TMP_PATH + "/ssh")
-  os.makedirs(TMP_PATH + "/repos")
-  fetch_admin_group()
+    global TMP_PATH
+    TMP_PATH = tempfile.mkdtemp()
+    atexit.register(clean_up)
+    os.makedirs(TMP_PATH + "/ssh")
+    os.makedirs(TMP_PATH + "/repos")
+    fetch_admin_group()
 
 
 def get_random_users(num_users):
-  users = random.sample([(f, l) for f in FIRST_NAMES for l in LAST_NAMES],
-                        num_users)
-  names = []
-  for u in users:
-    names.append({"firstname": u[0],
-                  "lastname": u[1],
-                  "name": u[0] + " " + u[1],
-                  "username": u[0] + u[1],
-                  "email": u[0] + "." + u[1] + "@gerritcodereview.com",
-                  "http_password": "secret",
-                  "groups": []})
-  return names
+    users = random.sample([(f, l) for f in FIRST_NAMES for l in LAST_NAMES],
+                          num_users)
+    names = []
+    for u in users:
+        names.append({"firstname": u[0],
+                      "lastname": u[1],
+                      "name": u[0] + " " + u[1],
+                      "username": u[0] + u[1],
+                      "email": u[0] + "." + u[1] + "@gerritcodereview.com",
+                      "http_password": "secret",
+                      "groups": []})
+    return names
 
 
 def generate_ssh_keys(gerrit_users):
-  for user in gerrit_users:
-    key_file = TMP_PATH + "/ssh/" + user["username"] + ".key"
-    subprocess.check_output(["ssh-keygen", "-f", key_file, "-N", ""])
-    with open(key_file + ".pub", "r") as f:
-      user["ssh_key"] = f.read()
+    for user in gerrit_users:
+        key_file = TMP_PATH + "/ssh/" + user["username"] + ".key"
+        subprocess.check_output(["ssh-keygen", "-f", key_file, "-N", ""])
+        with open(key_file + ".pub", "r") as f:
+            user["ssh_key"] = f.read()
 
 
 def create_gerrit_groups():
-  groups = [
-    {"name": "iOS-Maintainers", "description": "iOS Maintainers",
-     "visible_to_all": True, "owner": GROUP_ADMIN["name"],
-     "owner_id": GROUP_ADMIN["id"]},
-    {"name": "Android-Maintainers", "description": "Android Maintainers",
-     "visible_to_all": True, "owner": GROUP_ADMIN["name"],
-     "owner_id": GROUP_ADMIN["id"]},
-    {"name": "Backend-Maintainers", "description": "Backend Maintainers",
-     "visible_to_all": True, "owner": GROUP_ADMIN["name"],
-     "owner_id": GROUP_ADMIN["id"]},
-    {"name": "Script-Maintainers", "description": "Script Maintainers",
-     "visible_to_all": True, "owner": GROUP_ADMIN["name"],
-     "owner_id": GROUP_ADMIN["id"]},
-    {"name": "Security-Team", "description": "Sec Team",
-     "visible_to_all": False, "owner": GROUP_ADMIN["name"],
-     "owner_id": GROUP_ADMIN["id"]}]
-  for g in groups:
-    requests.put(GROUPS_URL + g["name"],
-                 json.dumps(g),
-                 headers=HEADERS,
-                 auth=ADMIN_BASIC_AUTH)
-  return [g["name"] for g in groups]
+    groups = [
+        {"name": "iOS-Maintainers", "description": "iOS Maintainers",
+         "visible_to_all": True, "owner": GROUP_ADMIN["name"],
+         "owner_id": GROUP_ADMIN["id"]},
+        {"name": "Android-Maintainers", "description": "Android Maintainers",
+         "visible_to_all": True, "owner": GROUP_ADMIN["name"],
+         "owner_id": GROUP_ADMIN["id"]},
+        {"name": "Backend-Maintainers", "description": "Backend Maintainers",
+         "visible_to_all": True, "owner": GROUP_ADMIN["name"],
+         "owner_id": GROUP_ADMIN["id"]},
+        {"name": "Script-Maintainers", "description": "Script Maintainers",
+         "visible_to_all": True, "owner": GROUP_ADMIN["name"],
+         "owner_id": GROUP_ADMIN["id"]},
+        {"name": "Security-Team", "description": "Sec Team",
+         "visible_to_all": False, "owner": GROUP_ADMIN["name"],
+         "owner_id": GROUP_ADMIN["id"]}]
+    for g in groups:
+        requests.put(BASE_URL + "groups/" + g["name"],
+                     json.dumps(g),
+                     headers=HEADERS,
+                     auth=ADMIN_BASIC_AUTH)
+    return [g["name"] for g in groups]
 
 
 def create_gerrit_projects(owner_groups):
-  projects = [
-    {"id": "android", "name": "Android", "parent": "All-Projects",
-     "branches": ["master"], "description": "Our android app.",
-     "owners": [owner_groups[0]], "create_empty_commit": True},
-    {"id": "ios", "name": "iOS", "parent": "All-Projects",
-     "branches": ["master"], "description": "Our ios app.",
-     "owners": [owner_groups[1]], "create_empty_commit": True},
-    {"id": "backend", "name": "Backend", "parent": "All-Projects",
-     "branches": ["master"], "description": "Our awesome backend.",
-     "owners": [owner_groups[2]], "create_empty_commit": True},
-    {"id": "scripts", "name": "Scripts", "parent": "All-Projects",
-     "branches": ["master"], "description": "some small scripts.",
-     "owners": [owner_groups[3]], "create_empty_commit": True}]
-  for p in projects:
-    requests.put(PROJECTS_URL + p["name"],
-                 json.dumps(p),
-                 headers=HEADERS,
-                 auth=ADMIN_BASIC_AUTH)
-  return [p["name"] for p in projects]
+    projects = [
+        {"id": "android", "name": "Android", "parent": "All-Projects",
+         "branches": ["master"], "description": "Our android app.",
+         "owners": [owner_groups[0]], "create_empty_commit": True},
+        {"id": "ios", "name": "iOS", "parent": "All-Projects",
+         "branches": ["master"], "description": "Our ios app.",
+         "owners": [owner_groups[1]], "create_empty_commit": True},
+        {"id": "backend", "name": "Backend", "parent": "All-Projects",
+         "branches": ["master"], "description": "Our awesome backend.",
+         "owners": [owner_groups[2]], "create_empty_commit": True},
+        {"id": "scripts", "name": "Scripts", "parent": "All-Projects",
+         "branches": ["master"], "description": "some small scripts.",
+         "owners": [owner_groups[3]], "create_empty_commit": True}]
+    for p in projects:
+        requests.put(BASE_URL + "projects/" + p["name"],
+                     json.dumps(p),
+                     headers=HEADERS,
+                     auth=ADMIN_BASIC_AUTH)
+    return [p["name"] for p in projects]
 
 
 def create_gerrit_users(gerrit_users):
-  for user in gerrit_users:
-    requests.put(ACCOUNTS_URL + user["username"],
-                 json.dumps(user),
-                 headers=HEADERS,
-                 auth=ADMIN_BASIC_AUTH)
+    for user in gerrit_users:
+        requests.put(BASE_URL + "accounts/" + user["username"],
+                     json.dumps(user),
+                     headers=HEADERS,
+                     auth=ADMIN_BASIC_AUTH)
 
 
 def create_change(user, project_name):
-  random_commit_message = generate_random_text()
-  change = {
-    "project": project_name,
-    "subject": random_commit_message.split("\n")[0],
-    "branch": "master",
-    "status": "NEW",
-  }
-  requests.post(CHANGES_URL,
-                json.dumps(change),
-                headers=HEADERS,
-                auth=basic_auth(user))
+    random_commit_message = generate_random_text()
+    change = {
+        "project": project_name,
+        "subject": random_commit_message.split("\n")[0],
+        "branch": "master",
+        "status": "NEW",
+    }
+    requests.post(BASE_URL + "changes/",
+                  json.dumps(change),
+                  headers=HEADERS,
+                  auth=basic_auth(user))
 
 
 def clean_up():
-  shutil.rmtree(TMP_PATH)
+    shutil.rmtree(TMP_PATH)
 
 
 def main():
-  set_up()
-  gerrit_users = get_random_users(100)
+    p = optparse.OptionParser()
+    p.add_option("-u", "--user_count", action="store",
+                 default=100,
+                 type='int',
+                 help="number of users to generate")
+    p.add_option("-p", "--port", action="store",
+                 default=8080,
+                 type='int',
+                 help="port of server")
+    (options, _) = p.parse_args()
+    global BASE_URL
+    BASE_URL = BASE_URL % options.port
+    print(BASE_URL)
 
-  group_names = create_gerrit_groups()
-  for idx, u in enumerate(gerrit_users):
-    u["groups"].append(group_names[idx % len(group_names)])
-    if idx % 5 == 0:
-      # Also add to security group
-      u["groups"].append(group_names[4])
+    set_up()
+    gerrit_users = get_random_users(options.user_count)
 
-  generate_ssh_keys(gerrit_users)
-  create_gerrit_users(gerrit_users)
+    group_names = create_gerrit_groups()
+    for idx, u in enumerate(gerrit_users):
+        u["groups"].append(group_names[idx % len(group_names)])
+        if idx % 5 == 0:
+            # Also add to security group
+            u["groups"].append(group_names[4])
 
-  project_names = create_gerrit_projects(group_names)
+    generate_ssh_keys(gerrit_users)
+    create_gerrit_users(gerrit_users)
 
-  for idx, u in enumerate(gerrit_users):
-    for _ in xrange(random.randint(1, 5)):
-      create_change(u, project_names[4 * idx / len(gerrit_users)])
+    project_names = create_gerrit_projects(group_names)
+
+    for idx, u in enumerate(gerrit_users):
+        for _ in xrange(random.randint(1, 5)):
+            create_change(u, project_names[4 * idx / len(gerrit_users)])
 
 main()
diff --git a/gerrit-acceptance-framework/BUILD b/gerrit-acceptance-framework/BUILD
deleted file mode 100644
index 667c37b..0000000
--- a/gerrit-acceptance-framework/BUILD
+++ /dev/null
@@ -1,96 +0,0 @@
-load("//tools/bzl:java.bzl", "java_library2")
-load("//tools/bzl:javadoc.bzl", "java_doc")
-load("//tools/bzl:junit.bzl", "junit_tests")
-
-TEST_SRCS = ["src/test/java/com/google/gerrit/acceptance/MergeableFileBasedConfigTest.java"]
-
-SRCS = glob(
-    ["src/test/java/com/google/gerrit/acceptance/*.java"],
-    exclude = TEST_SRCS,
-)
-
-PROVIDED = [
-    "//gerrit-common:annotations",
-    "//gerrit-common:server",
-    "//gerrit-extension-api:api",
-    "//gerrit-httpd:httpd",
-    "//gerrit-index:index",
-    "//gerrit-lucene:lucene",
-    "//gerrit-pgm:init",
-    "//gerrit-reviewdb:server",
-    "//gerrit-server:metrics",
-    "//gerrit-server:receive",
-    "//gerrit-server:server",
-    "//lib:gson",
-    "//lib:jsch",
-    "//lib/jgit/org.eclipse.jgit:jgit",
-    "//lib/mina:sshd",
-    "//lib:servlet-api-3_1",
-]
-
-java_binary(
-    name = "acceptance-framework",
-    testonly = 1,
-    main_class = "Dummy",
-    visibility = ["//visibility:public"],
-    runtime_deps = [":lib"],
-)
-
-java_library2(
-    name = "lib",
-    testonly = 1,
-    srcs = SRCS,
-    exported_deps = [
-        "//gerrit-gpg:gpg",
-        "//gerrit-index:query_exception",
-        "//gerrit-launcher:launcher",
-        "//gerrit-openid:openid",
-        "//gerrit-pgm:daemon",
-        "//gerrit-pgm:http-jetty",
-        "//gerrit-pgm:util-nodep",
-        "//gerrit-server:prolog-common",
-        "//gerrit-server:testutil",
-        "//lib:jimfs",
-        "//lib:truth",
-        "//lib:truth-java8-extension",
-        "//lib/auto:auto-value",
-        "//lib/auto:auto-value-annotations",
-        "//lib/httpcomponents:fluent-hc",
-        "//lib/httpcomponents:httpclient",
-        "//lib/httpcomponents:httpcore",
-        "//lib/jetty:servlet",
-        "//lib/jgit/org.eclipse.jgit.junit:junit",
-        "//lib/log:impl-log4j",
-        "//lib/log:log4j",
-    ],
-    visibility = ["//visibility:public"],
-    deps = PROVIDED + [
-        # We want these deps to be exported_deps
-        "//lib/greenmail:greenmail",
-        "//lib:gwtorm",
-        "//lib/guice:guice",
-        "//lib/guice:guice-assistedinject",
-        "//lib/guice:guice-servlet",
-        "//lib/mail:mail",
-    ],
-)
-
-java_doc(
-    name = "acceptance-framework-javadoc",
-    testonly = 1,
-    libs = [":lib"],
-    pkgs = ["com.google.gerrit.acceptance"],
-    title = "Gerrit Acceptance Test Framework Documentation",
-    visibility = ["//visibility:public"],
-)
-
-junit_tests(
-    name = "acceptance_framework_tests",
-    srcs = TEST_SRCS,
-    deps = [
-        ":lib",
-        "//lib:guava",
-        "//lib:truth",
-        "//lib/jgit/org.eclipse.jgit:jgit",
-    ],
-)
diff --git a/gerrit-acceptance-framework/pom.xml b/gerrit-acceptance-framework/pom.xml
deleted file mode 100644
index 82f767b..0000000
--- a/gerrit-acceptance-framework/pom.xml
+++ /dev/null
@@ -1,83 +0,0 @@
-<project>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>com.google.gerrit</groupId>
-  <artifactId>gerrit-acceptance-framework</artifactId>
-  <version>2.15.12-SNAPSHOT</version>
-  <packaging>jar</packaging>
-  <name>Gerrit Code Review - Acceptance Test Framework</name>
-  <description>Framework for Gerrit's acceptance tests</description>
-  <url>https://www.gerritcodereview.com/</url>
-
-  <licenses>
-    <license>
-      <name>The Apache Software License, Version 2.0</name>
-      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
-      <distribution>repo</distribution>
-    </license>
-  </licenses>
-
-  <scm>
-    <url>https://gerrit.googlesource.com/gerrit</url>
-    <connection>https://gerrit.googlesource.com/gerrit</connection>
-  </scm>
-
-  <developers>
-    <developer>
-      <name>Alice Kober-Sotzek</name>
-    </developer>
-    <developer>
-      <name>Ben Rohlfs</name>
-    </developer>
-    <developer>
-      <name>Dave Borowitz</name>
-    </developer>
-    <developer>
-      <name>David Ostrovsky</name>
-    </developer>
-    <developer>
-      <name>David Pursehouse</name>
-    </developer>
-    <developer>
-      <name>Edwin Kempin</name>
-    </developer>
-    <developer>
-      <name>Han-Wen Nienhuys</name>
-    </developer>
-    <developer>
-      <name>Hugo Arès</name>
-    </developer>
-    <developer>
-      <name>Luca Milanesio</name>
-    </developer>
-    <developer>
-      <name>Marco Miller</name>
-    </developer>
-    <developer>
-      <name>Martin Fick</name>
-    </developer>
-    <developer>
-      <name>Ole Rehmsen</name>
-    </developer>
-    <developer>
-      <name>Patrick Hiesel</name>
-    </developer>
-    <developer>
-      <name>Saša Živkov</name>
-    </developer>
-  </developers>
-
-  <mailingLists>
-    <mailingList>
-      <name>Repo and Gerrit Discussion</name>
-      <post>repo-discuss@googlegroups.com</post>
-      <subscribe>https://groups.google.com/forum/#!forum/repo-discuss</subscribe>
-      <unsubscribe>https://groups.google.com/forum/#!forum/repo-discuss</unsubscribe>
-      <archive>https://groups.google.com/forum/#!forum/repo-discuss</archive>
-    </mailingList>
-  </mailingLists>
-
-  <issueManagement>
-    <url>https://bugs.chromium.org/p/gerrit/issues/list</url>
-    <system>Gerrit Issue Tracker</system>
-  </issueManagement>
-</project>
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java
deleted file mode 100644
index 477ff1e..0000000
--- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java
+++ /dev/null
@@ -1,1451 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.acceptance;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.TruthJUnit.assume;
-import static com.google.gerrit.acceptance.GitUtil.initSsh;
-import static com.google.gerrit.extensions.api.changes.SubmittedTogetherOption.NON_VISIBLE_CHANGES;
-import static com.google.gerrit.reviewdb.client.Patch.COMMIT_MSG;
-import static com.google.gerrit.reviewdb.client.Patch.MERGE_LIST;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-import static com.google.gerrit.server.project.Util.category;
-import static com.google.gerrit.server.project.Util.value;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.stream.Collectors.toList;
-import static org.eclipse.jgit.lib.Constants.HEAD;
-import static org.eclipse.jgit.lib.Constants.R_TAGS;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterables;
-import com.google.common.jimfs.Jimfs;
-import com.google.common.primitives.Chars;
-import com.google.gerrit.acceptance.AcceptanceTestRequestScope.Context;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.data.AccessSection;
-import com.google.gerrit.common.data.ContributorAgreement;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.common.data.LabelFunction;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.LabelValue;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.common.data.PermissionRule;
-import com.google.gerrit.extensions.api.GerritApi;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.api.changes.RevisionApi;
-import com.google.gerrit.extensions.api.changes.SubmittedTogetherInfo;
-import com.google.gerrit.extensions.api.groups.GroupApi;
-import com.google.gerrit.extensions.api.groups.GroupInput;
-import com.google.gerrit.extensions.api.projects.BranchApi;
-import com.google.gerrit.extensions.api.projects.BranchInput;
-import com.google.gerrit.extensions.api.projects.ProjectInput;
-import com.google.gerrit.extensions.client.InheritableBoolean;
-import com.google.gerrit.extensions.client.ListChangesOption;
-import com.google.gerrit.extensions.client.ProjectWatchInfo;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.extensions.common.ActionInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.ChangeType;
-import com.google.gerrit.extensions.common.DiffInfo;
-import com.google.gerrit.extensions.common.EditInfo;
-import com.google.gerrit.extensions.restapi.BinaryResult;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.AnonymousUser;
-import com.google.gerrit.server.ChangeFinder;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.OutputFormat;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.Accounts;
-import com.google.gerrit.server.account.GroupCache;
-import com.google.gerrit.server.change.Abandon;
-import com.google.gerrit.server.change.ChangeResource;
-import com.google.gerrit.server.change.FileContentUtil;
-import com.google.gerrit.server.change.RevisionResource;
-import com.google.gerrit.server.change.Revisions;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.config.CanonicalWebUrl;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.PluginConfigFactory;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.group.Groups;
-import com.google.gerrit.server.group.InternalGroup;
-import com.google.gerrit.server.group.SystemGroupBackend;
-import com.google.gerrit.server.index.change.ChangeIndex;
-import com.google.gerrit.server.index.change.ChangeIndexCollection;
-import com.google.gerrit.server.index.change.ChangeIndexer;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.mail.send.EmailHeader;
-import com.google.gerrit.server.notedb.ChangeNoteUtil;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.MutableNotesMigration;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.Util;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.InternalChangeQuery;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.testutil.ConfigSuite;
-import com.google.gerrit.testutil.FakeAuditService;
-import com.google.gerrit.testutil.FakeEmailSender;
-import com.google.gerrit.testutil.FakeEmailSender.Message;
-import com.google.gerrit.testutil.NoteDbMode;
-import com.google.gerrit.testutil.SshMode;
-import com.google.gerrit.testutil.TempFileUtil;
-import com.google.gson.Gson;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Inject;
-import com.google.inject.Module;
-import com.google.inject.Provider;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.nio.file.DirectoryStream;
-import java.nio.file.FileSystem;
-import java.nio.file.FileSystems;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.regex.Pattern;
-import org.eclipse.jgit.api.Git;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.NullProgressMonitor;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevTree;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.FetchResult;
-import org.eclipse.jgit.transport.RefSpec;
-import org.eclipse.jgit.transport.Transport;
-import org.eclipse.jgit.transport.TransportBundleStream;
-import org.eclipse.jgit.transport.URIish;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.rules.ExpectedException;
-import org.junit.rules.TestRule;
-import org.junit.runner.Description;
-import org.junit.runner.RunWith;
-import org.junit.runners.model.Statement;
-
-@RunWith(ConfigSuite.class)
-public abstract class AbstractDaemonTest {
-  private static GerritServer commonServer;
-  private static Description firstTest;
-
-  @ConfigSuite.Parameter public Config baseConfig;
-  @ConfigSuite.Name private String configName;
-
-  @Rule public ExpectedException exception = ExpectedException.none();
-
-  @Rule
-  public TestRule testRunner =
-      new TestRule() {
-        @Override
-        public Statement apply(Statement base, Description description) {
-          return new Statement() {
-            @Override
-            public void evaluate() throws Throwable {
-              if (firstTest == null) {
-                firstTest = description;
-              }
-              beforeTest(description);
-              try {
-                base.evaluate();
-              } finally {
-                afterTest();
-              }
-            }
-          };
-        }
-      };
-
-  @Inject @CanonicalWebUrl protected Provider<String> canonicalWebUrl;
-  @Inject @GerritPersonIdent protected Provider<PersonIdent> serverIdent;
-  @Inject @GerritServerConfig protected Config cfg;
-  @Inject protected AcceptanceTestRequestScope atrScope;
-  @Inject protected AccountCache accountCache;
-  @Inject protected AccountCreator accountCreator;
-  @Inject protected Accounts accounts;
-  @Inject protected AllProjectsName allProjects;
-  @Inject protected BatchUpdate.Factory batchUpdateFactory;
-  @Inject protected ChangeData.Factory changeDataFactory;
-  @Inject protected ChangeFinder changeFinder;
-  @Inject protected ChangeIndexer indexer;
-  @Inject protected ChangeNoteUtil changeNoteUtil;
-  @Inject protected ChangeResource.Factory changeResourceFactory;
-  @Inject protected FakeEmailSender sender;
-  @Inject protected FakeAuditService auditService;
-  @Inject protected GerritApi gApi;
-  @Inject protected GitRepositoryManager repoManager;
-  @Inject protected GroupCache groupCache;
-  @Inject protected IdentifiedUser.GenericFactory identifiedUserFactory;
-  @Inject protected MetaDataUpdate.Server metaDataUpdateFactory;
-  @Inject protected PatchSetUtil psUtil;
-  @Inject protected ProjectCache projectCache;
-  @Inject protected Provider<InternalChangeQuery> queryProvider;
-  @Inject protected PushOneCommit.Factory pushFactory;
-  @Inject protected PluginConfigFactory pluginConfig;
-  @Inject protected Revisions revisions;
-  @Inject protected SystemGroupBackend systemGroupBackend;
-  @Inject protected MutableNotesMigration notesMigration;
-  @Inject protected ChangeNotes.Factory notesFactory;
-  @Inject protected Abandon changeAbandoner;
-
-  protected EventRecorder eventRecorder;
-  protected GerritServer server;
-  protected Project.NameKey project;
-  protected RestSession adminRestSession;
-  protected RestSession userRestSession;
-  protected ReviewDb db;
-  protected SshSession adminSshSession;
-  protected SshSession userSshSession;
-  protected TestAccount admin;
-  protected TestAccount user;
-  protected TestRepository<InMemoryRepository> testRepo;
-  protected String resourcePrefix;
-  protected Description description;
-  protected boolean testRequiresSsh;
-  protected Module testSysModule;
-
-  @Inject private ChangeIndexCollection changeIndexes;
-  @Inject private EventRecorder.Factory eventRecorderFactory;
-  @Inject private InProcessProtocol inProcessProtocol;
-  @Inject private Provider<AnonymousUser> anonymousUser;
-  @Inject private SchemaFactory<ReviewDb> reviewDbProvider;
-  @Inject private Groups groups;
-
-  private List<Repository> toClose;
-
-  @Before
-  public void clearSender() {
-    sender.clear();
-  }
-
-  @Before
-  public void startEventRecorder() {
-    eventRecorder = eventRecorderFactory.create(admin);
-  }
-
-  @Before
-  public void assumeSshIfRequired() {
-    if (testRequiresSsh) {
-      // If the test uses ssh, we use assume() to make sure ssh is enabled on
-      // the test suite. JUnit will skip tests annotated with @UseSsh if we
-      // disable them using the command line flag.
-      assume().that(SshMode.useSsh()).isTrue();
-    }
-  }
-
-  @After
-  public void closeEventRecorder() {
-    eventRecorder.close();
-  }
-
-  @AfterClass
-  public static void stopCommonServer() throws Exception {
-    if (commonServer != null) {
-      try {
-        commonServer.close();
-      } catch (Throwable t) {
-        throw new AssertionError(
-            "Error stopping common server in "
-                + (firstTest != null ? firstTest.getTestClass().getName() : "unknown test class"),
-            t);
-      } finally {
-        commonServer = null;
-      }
-    }
-    TempFileUtil.cleanup();
-  }
-
-  protected static Config submitWholeTopicEnabledConfig() {
-    Config cfg = new Config();
-    cfg.setBoolean("change", null, "submitWholeTopic", true);
-    return cfg;
-  }
-
-  protected boolean isSubmitWholeTopicEnabled() {
-    return cfg.getBoolean("change", null, "submitWholeTopic", false);
-  }
-
-  protected boolean isContributorAgreementsEnabled() {
-    return cfg.getBoolean("auth", null, "contributorAgreements", false);
-  }
-
-  protected void beforeTest(Description description) throws Exception {
-    this.description = description;
-    GerritServer.Description classDesc =
-        GerritServer.Description.forTestClass(description, configName);
-    GerritServer.Description methodDesc =
-        GerritServer.Description.forTestMethod(description, configName);
-
-    baseConfig.setInt("receive", null, "changeUpdateThreads", 4);
-    if (classDesc.equals(methodDesc) && !classDesc.sandboxed() && !methodDesc.sandboxed()) {
-      if (commonServer == null) {
-        commonServer = GerritServer.initAndStart(classDesc, baseConfig, testSysModule);
-      }
-      server = commonServer;
-    } else {
-      server = GerritServer.initAndStart(methodDesc, baseConfig, testSysModule);
-    }
-
-    server.getTestInjector().injectMembers(this);
-    Transport.register(inProcessProtocol);
-    toClose = Collections.synchronizedList(new ArrayList<Repository>());
-
-    db = reviewDbProvider.open();
-
-    // All groups which were added during the server start (e.g. in SchemaCreator) aren't contained
-    // in the instance of the group index which is available here and in tests. There are two
-    // reasons:
-    // 1) No group index is available in SchemaCreator when using an in-memory database. (This could
-    // be fixed by using the IndexManagerOnInit in InMemoryDatabase similar as BaseInit uses it.)
-    // 2) During the on-init part of the server start, we use another instance of the index than
-    // later on. As test indexes are non-permanent, closing an instance and opening another one
-    // removes all indexed data.
-    // As a workaround, we simply reindex all available groups here.
-    Iterable<AccountGroup> allGroups = groups.getAll(db)::iterator;
-    for (AccountGroup group : allGroups) {
-      groupCache.evict(group.getGroupUUID(), group.getId(), group.getNameKey());
-    }
-
-    admin = accountCreator.admin();
-    user = accountCreator.user();
-
-    // Evict cached user state in case tests modify it.
-    accountCache.evict(admin.getId());
-    accountCache.evict(user.getId());
-
-    adminRestSession = new RestSession(server, admin);
-    userRestSession = new RestSession(server, user);
-
-    testRequiresSsh = classDesc.useSshAnnotation() || methodDesc.useSshAnnotation();
-    if (testRequiresSsh
-        && SshMode.useSsh()
-        && (adminSshSession == null || userSshSession == null)) {
-      // Create Ssh sessions
-      initSsh(admin);
-      Context ctx = newRequestContext(user);
-      atrScope.set(ctx);
-      userSshSession = ctx.getSession();
-      userSshSession.open();
-      ctx = newRequestContext(admin);
-      atrScope.set(ctx);
-      adminSshSession = ctx.getSession();
-      adminSshSession.open();
-    }
-
-    resourcePrefix =
-        UNSAFE_PROJECT_NAME
-            .matcher(description.getClassName() + "_" + description.getMethodName() + "_")
-            .replaceAll("");
-
-    Context ctx = newRequestContext(admin);
-    atrScope.set(ctx);
-    project = createProject(projectInput(description));
-    testRepo = cloneProject(project, getCloneAsAccount(description));
-  }
-
-  private TestAccount getCloneAsAccount(Description description) {
-    TestProjectInput ann = description.getAnnotation(TestProjectInput.class);
-    return accountCreator.get(ann != null ? ann.cloneAs() : "admin");
-  }
-
-  private ProjectInput projectInput(Description description) {
-    ProjectInput in = new ProjectInput();
-    TestProjectInput ann = description.getAnnotation(TestProjectInput.class);
-    in.name = name("project");
-    if (ann != null) {
-      in.parent = Strings.emptyToNull(ann.parent());
-      in.description = Strings.emptyToNull(ann.description());
-      in.createEmptyCommit = ann.createEmptyCommit();
-      in.submitType = ann.submitType();
-      in.useContentMerge = ann.useContributorAgreements();
-      in.useSignedOffBy = ann.useSignedOffBy();
-      in.useContentMerge = ann.useContentMerge();
-      in.enableSignedPush = ann.enableSignedPush();
-      in.requireSignedPush = ann.requireSignedPush();
-    } else {
-      // Defaults should match TestProjectConfig, omitting nullable values.
-      in.createEmptyCommit = true;
-    }
-    updateProjectInput(in);
-    return in;
-  }
-
-  private static final Pattern UNSAFE_PROJECT_NAME = Pattern.compile("[^a-zA-Z0-9._/-]+");
-
-  protected Git git() {
-    return testRepo.git();
-  }
-
-  protected InMemoryRepository repo() {
-    return testRepo.getRepository();
-  }
-
-  /**
-   * Return a resource name scoped to this test method.
-   *
-   * <p>Test methods in a single class by default share a running server. For any resource name you
-   * require to be unique to a test method, wrap it in a call to this method.
-   *
-   * @param name resource name (group, project, topic, etc.)
-   * @return name prefixed by a string unique to this test method.
-   */
-  protected String name(String name) {
-    return resourcePrefix + name;
-  }
-
-  protected Project.NameKey createProject(String nameSuffix) throws RestApiException {
-    return createProject(nameSuffix, null);
-  }
-
-  protected Project.NameKey createProject(String nameSuffix, Project.NameKey parent)
-      throws RestApiException {
-    // Default for createEmptyCommit should match TestProjectConfig.
-    return createProject(nameSuffix, parent, true, null);
-  }
-
-  protected Project.NameKey createProject(
-      String nameSuffix, Project.NameKey parent, boolean createEmptyCommit)
-      throws RestApiException {
-    // Default for createEmptyCommit should match TestProjectConfig.
-    return createProject(nameSuffix, parent, createEmptyCommit, null);
-  }
-
-  protected Project.NameKey createProject(
-      String nameSuffix, Project.NameKey parent, SubmitType submitType) throws RestApiException {
-    // Default for createEmptyCommit should match TestProjectConfig.
-    return createProject(nameSuffix, parent, true, submitType);
-  }
-
-  protected Project.NameKey createProject(
-      String nameSuffix, Project.NameKey parent, boolean createEmptyCommit, SubmitType submitType)
-      throws RestApiException {
-    ProjectInput in = new ProjectInput();
-    in.name = name(nameSuffix);
-    in.parent = parent != null ? parent.get() : null;
-    in.submitType = submitType;
-    in.createEmptyCommit = createEmptyCommit;
-    return createProject(in);
-  }
-
-  private Project.NameKey createProject(ProjectInput in) throws RestApiException {
-    gApi.projects().create(in);
-    return new Project.NameKey(in.name);
-  }
-
-  /**
-   * Modify a project input before creating the initial test project.
-   *
-   * @param in input; may be modified in place.
-   */
-  protected void updateProjectInput(ProjectInput in) {
-    // Default implementation does nothing.
-  }
-
-  protected TestRepository<InMemoryRepository> cloneProject(Project.NameKey p) throws Exception {
-    return cloneProject(p, admin);
-  }
-
-  protected TestRepository<InMemoryRepository> cloneProject(
-      Project.NameKey p, TestAccount testAccount) throws Exception {
-    return GitUtil.cloneProject(p, registerRepoConnection(p, testAccount));
-  }
-
-  /**
-   * Register a repository connection over the test protocol.
-   *
-   * @return a URI string that can be used to connect to this repository for both fetch and push.
-   */
-  protected String registerRepoConnection(Project.NameKey p, TestAccount testAccount)
-      throws Exception {
-    InProcessProtocol.Context ctx =
-        new InProcessProtocol.Context(
-            reviewDbProvider, identifiedUserFactory, testAccount.getId(), p);
-    Repository repo = repoManager.openRepository(p);
-    toClose.add(repo);
-    return inProcessProtocol.register(ctx, repo).toString();
-  }
-
-  protected void afterTest() throws Exception {
-    Transport.unregister(inProcessProtocol);
-    for (Repository repo : toClose) {
-      repo.close();
-    }
-    db.close();
-    if (adminSshSession != null) {
-      adminSshSession.close();
-    }
-    if (userSshSession != null) {
-      userSshSession.close();
-    }
-    if (server != commonServer) {
-      server.close();
-      server = null;
-    }
-    NoteDbMode.resetFromEnv(notesMigration);
-  }
-
-  protected TestRepository<?>.CommitBuilder commitBuilder() throws Exception {
-    return testRepo.branch("HEAD").commit().insertChangeId();
-  }
-
-  protected TestRepository<?>.CommitBuilder amendBuilder() throws Exception {
-    ObjectId head = repo().exactRef("HEAD").getObjectId();
-    TestRepository<?>.CommitBuilder b = testRepo.amendRef("HEAD");
-    Optional<String> id = GitUtil.getChangeId(testRepo, head);
-    // TestRepository behaves like "git commit --amend -m foo", which does not
-    // preserve an existing Change-Id. Tests probably want this.
-    if (id.isPresent()) {
-      b.insertChangeId(id.get().substring(1));
-    } else {
-      b.insertChangeId();
-    }
-    return b;
-  }
-
-  protected PushOneCommit.Result createChange() throws Exception {
-    return createChange("refs/for/master");
-  }
-
-  protected PushOneCommit.Result createChange(String ref) throws Exception {
-    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
-    PushOneCommit.Result result = push.to(ref);
-    result.assertOkStatus();
-    return result;
-  }
-
-  protected PushOneCommit.Result createMergeCommitChange(String ref) throws Exception {
-    return createMergeCommitChange(ref, "foo");
-  }
-
-  protected PushOneCommit.Result createMergeCommitChange(String ref, String file) throws Exception {
-    ObjectId initial = repo().exactRef(HEAD).getLeaf().getObjectId();
-
-    PushOneCommit.Result p1 =
-        pushFactory
-            .create(
-                db,
-                admin.getIdent(),
-                testRepo,
-                "parent 1",
-                ImmutableMap.of(file, "foo-1", "bar", "bar-1"))
-            .to(ref);
-
-    // reset HEAD in order to create a sibling of the first change
-    testRepo.reset(initial);
-
-    PushOneCommit.Result p2 =
-        pushFactory
-            .create(
-                db,
-                admin.getIdent(),
-                testRepo,
-                "parent 2",
-                ImmutableMap.of(file, "foo-2", "bar", "bar-2"))
-            .to(ref);
-
-    PushOneCommit m =
-        pushFactory.create(
-            db,
-            admin.getIdent(),
-            testRepo,
-            "merge",
-            ImmutableMap.of(file, "foo-1", "bar", "bar-2"));
-    m.setParents(ImmutableList.of(p1.getCommit(), p2.getCommit()));
-    PushOneCommit.Result result = m.to(ref);
-    result.assertOkStatus();
-    return result;
-  }
-
-  protected PushOneCommit.Result createCommitAndPush(
-      TestRepository<InMemoryRepository> repo,
-      String ref,
-      String commitMsg,
-      String fileName,
-      String content)
-      throws Exception {
-    PushOneCommit.Result result =
-        pushFactory.create(db, admin.getIdent(), repo, commitMsg, fileName, content).to(ref);
-    result.assertOkStatus();
-    return result;
-  }
-
-  protected PushOneCommit.Result createChangeWithTopic() throws Exception {
-    return createChangeWithTopic(testRepo, "topic", "message", "a.txt", "content\n");
-  }
-
-  protected PushOneCommit.Result createChangeWithTopic(
-      TestRepository<InMemoryRepository> repo,
-      String topic,
-      String commitMsg,
-      String fileName,
-      String content)
-      throws Exception {
-    assertThat(topic).isNotEmpty();
-    return createCommitAndPush(
-        repo, "refs/for/master/" + name(topic), commitMsg, fileName, content);
-  }
-
-  protected PushOneCommit.Result createWorkInProgressChange() throws Exception {
-    return pushTo("refs/for/master%wip");
-  }
-
-  protected PushOneCommit.Result createChange(String subject, String fileName, String content)
-      throws Exception {
-    PushOneCommit push =
-        pushFactory.create(db, admin.getIdent(), testRepo, subject, fileName, content);
-    return push.to("refs/for/master");
-  }
-
-  protected PushOneCommit.Result createChange(
-      String subject, String fileName, String content, String topic) throws Exception {
-    PushOneCommit push =
-        pushFactory.create(db, admin.getIdent(), testRepo, subject, fileName, content);
-    return push.to("refs/for/master/" + name(topic));
-  }
-
-  protected PushOneCommit.Result createChange(
-      TestRepository<?> repo,
-      String branch,
-      String subject,
-      String fileName,
-      String content,
-      String topic)
-      throws Exception {
-    PushOneCommit push = pushFactory.create(db, admin.getIdent(), repo, subject, fileName, content);
-    return push.to("refs/for/" + branch + "/" + name(topic));
-  }
-
-  protected BranchApi createBranch(Branch.NameKey branch) throws Exception {
-    return gApi.projects()
-        .name(branch.getParentKey().get())
-        .branch(branch.get())
-        .create(new BranchInput());
-  }
-
-  protected BranchApi createBranchWithRevision(Branch.NameKey branch, String revision)
-      throws Exception {
-    BranchInput in = new BranchInput();
-    in.revision = revision;
-    return gApi.projects().name(branch.getParentKey().get()).branch(branch.get()).create(in);
-  }
-
-  private static final List<Character> RANDOM =
-      Chars.asList(new char[] {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'});
-
-  protected PushOneCommit.Result amendChange(String changeId) throws Exception {
-    return amendChange(changeId, "refs/for/master");
-  }
-
-  protected PushOneCommit.Result amendChange(String changeId, String ref) throws Exception {
-    return amendChange(changeId, ref, admin, testRepo);
-  }
-
-  protected PushOneCommit.Result amendChange(
-      String changeId, String ref, TestAccount testAccount, TestRepository<?> repo)
-      throws Exception {
-    Collections.shuffle(RANDOM);
-    return amendChange(
-        changeId,
-        ref,
-        testAccount,
-        repo,
-        PushOneCommit.SUBJECT,
-        PushOneCommit.FILE_NAME,
-        new String(Chars.toArray(RANDOM)));
-  }
-
-  protected PushOneCommit.Result amendChange(
-      String changeId, String subject, String fileName, String content) throws Exception {
-    return amendChange(changeId, "refs/for/master", admin, testRepo, subject, fileName, content);
-  }
-
-  protected PushOneCommit.Result amendChange(
-      String changeId,
-      String ref,
-      TestAccount testAccount,
-      TestRepository<?> repo,
-      String subject,
-      String fileName,
-      String content)
-      throws Exception {
-    PushOneCommit push =
-        pushFactory.create(db, testAccount.getIdent(), repo, subject, fileName, content, changeId);
-    return push.to(ref);
-  }
-
-  protected void merge(PushOneCommit.Result r) throws Exception {
-    revision(r).review(ReviewInput.approve());
-    revision(r).submit();
-  }
-
-  protected ChangeInfo info(String id) throws RestApiException {
-    return gApi.changes().id(id).info();
-  }
-
-  protected ChangeInfo get(String id) throws RestApiException {
-    return gApi.changes().id(id).get();
-  }
-
-  protected Optional<EditInfo> getEdit(String id) throws RestApiException {
-    return gApi.changes().id(id).edit().get();
-  }
-
-  protected ChangeInfo get(String id, ListChangesOption... options) throws RestApiException {
-    return gApi.changes().id(id).get(options);
-  }
-
-  protected List<ChangeInfo> query(String q) throws RestApiException {
-    return gApi.changes().query(q).get();
-  }
-
-  private Context newRequestContext(TestAccount account) {
-    return atrScope.newContext(
-        reviewDbProvider,
-        new SshSession(server, account),
-        identifiedUserFactory.create(account.getId()));
-  }
-
-  /**
-   * Enforce a new request context for the current API user.
-   *
-   * <p>This recreates the IdentifiedUser, hence everything which is cached in the IdentifiedUser is
-   * reloaded (e.g. the email addresses of the user).
-   */
-  protected Context resetCurrentApiUser() {
-    return atrScope.set(newRequestContext(atrScope.get().getSession().getAccount()));
-  }
-
-  protected Context setApiUser(TestAccount account) {
-    return atrScope.set(newRequestContext(account));
-  }
-
-  protected Context setApiUserAnonymous() {
-    return atrScope.set(atrScope.newContext(reviewDbProvider, null, anonymousUser.get()));
-  }
-
-  protected Context disableDb() {
-    notesMigration.setFailOnLoadForTest(true);
-    return atrScope.disableDb();
-  }
-
-  protected void enableDb(Context preDisableContext) {
-    notesMigration.setFailOnLoadForTest(false);
-    atrScope.set(preDisableContext);
-  }
-
-  protected void disableChangeIndexWrites() {
-    for (ChangeIndex i : changeIndexes.getWriteIndexes()) {
-      if (!(i instanceof ReadOnlyChangeIndex)) {
-        changeIndexes.addWriteIndex(new ReadOnlyChangeIndex(i));
-      }
-    }
-  }
-
-  protected void enableChangeIndexWrites() {
-    for (ChangeIndex i : changeIndexes.getWriteIndexes()) {
-      if (i instanceof ReadOnlyChangeIndex) {
-        changeIndexes.addWriteIndex(((ReadOnlyChangeIndex) i).unwrap());
-      }
-    }
-  }
-
-  protected static Gson newGson() {
-    return OutputFormat.JSON_COMPACT.newGson();
-  }
-
-  protected RevisionApi revision(PushOneCommit.Result r) throws Exception {
-    return gApi.changes().id(r.getChangeId()).current();
-  }
-
-  protected void allow(String ref, String permission, AccountGroup.UUID id) throws Exception {
-    allow(project, ref, permission, id);
-  }
-
-  protected void allow(Project.NameKey p, String ref, String permission, AccountGroup.UUID id)
-      throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(p).getConfig();
-    Util.allow(cfg, permission, id, ref);
-    saveProjectConfig(p, cfg);
-  }
-
-  protected void allowGlobalCapabilities(AccountGroup.UUID id, String... capabilityNames)
-      throws Exception {
-    allowGlobalCapabilities(id, Arrays.asList(capabilityNames));
-  }
-
-  protected void allowGlobalCapabilities(AccountGroup.UUID id, Iterable<String> capabilityNames)
-      throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(allProjects).getConfig();
-    for (String capabilityName : capabilityNames) {
-      Util.allow(cfg, capabilityName, id);
-    }
-    saveProjectConfig(allProjects, cfg);
-  }
-
-  protected void removeGlobalCapabilities(AccountGroup.UUID id, String... capabilityNames)
-      throws Exception {
-    removeGlobalCapabilities(id, Arrays.asList(capabilityNames));
-  }
-
-  protected void removeGlobalCapabilities(AccountGroup.UUID id, Iterable<String> capabilityNames)
-      throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(allProjects).getConfig();
-    for (String capabilityName : capabilityNames) {
-      Util.remove(cfg, capabilityName, id);
-    }
-    saveProjectConfig(allProjects, cfg);
-  }
-
-  protected void setUseContributorAgreements(InheritableBoolean value) throws Exception {
-    try (MetaDataUpdate md = metaDataUpdateFactory.create(project)) {
-      ProjectConfig config = ProjectConfig.read(md);
-      config.getProject().setUseContributorAgreements(value);
-      config.commit(md);
-      projectCache.evict(config.getProject());
-    }
-  }
-
-  protected void setUseSignedOffBy(InheritableBoolean value) throws Exception {
-    try (MetaDataUpdate md = metaDataUpdateFactory.create(project)) {
-      ProjectConfig config = ProjectConfig.read(md);
-      config.getProject().setUseSignedOffBy(value);
-      config.commit(md);
-      projectCache.evict(config.getProject());
-    }
-  }
-
-  protected void setRequireChangeId(InheritableBoolean value) throws Exception {
-    try (MetaDataUpdate md = metaDataUpdateFactory.create(project)) {
-      ProjectConfig config = ProjectConfig.read(md);
-      config.getProject().setRequireChangeID(value);
-      config.commit(md);
-      projectCache.evict(config.getProject());
-    }
-  }
-
-  protected void deny(String ref, String permission, AccountGroup.UUID id) throws Exception {
-    deny(project, ref, permission, id);
-  }
-
-  protected void deny(Project.NameKey p, String ref, String permission, AccountGroup.UUID id)
-      throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(p).getConfig();
-    Util.deny(cfg, permission, id, ref);
-    saveProjectConfig(p, cfg);
-  }
-
-  protected PermissionRule block(String ref, String permission, AccountGroup.UUID id)
-      throws Exception {
-    return block(project, ref, permission, id);
-  }
-
-  protected PermissionRule block(
-      Project.NameKey project, String ref, String permission, AccountGroup.UUID id)
-      throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    PermissionRule rule = Util.block(cfg, permission, id, ref);
-    saveProjectConfig(project, cfg);
-    return rule;
-  }
-
-  protected void blockLabel(
-      String label, int min, int max, AccountGroup.UUID id, String ref, Project.NameKey project)
-      throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    Util.block(cfg, Permission.LABEL + label, min, max, id, ref);
-    saveProjectConfig(project, cfg);
-  }
-
-  protected void saveProjectConfig(Project.NameKey p, ProjectConfig cfg) throws Exception {
-    try (MetaDataUpdate md = metaDataUpdateFactory.create(p)) {
-      md.setAuthor(identifiedUserFactory.create(admin.getId()));
-      cfg.commit(md);
-    }
-    projectCache.evict(cfg.getProject());
-  }
-
-  protected void saveProjectConfig(ProjectConfig cfg) throws Exception {
-    saveProjectConfig(project, cfg);
-  }
-
-  protected void grant(Project.NameKey project, String ref, String permission)
-      throws RepositoryNotFoundException, IOException, ConfigInvalidException {
-    grant(project, ref, permission, false);
-  }
-
-  protected void grant(Project.NameKey project, String ref, String permission, boolean force)
-      throws RepositoryNotFoundException, IOException, ConfigInvalidException {
-    InternalGroup adminGroup =
-        groupCache.get(new AccountGroup.NameKey("Administrators")).orElse(null);
-    grant(project, ref, permission, force, adminGroup.getGroupUUID());
-  }
-
-  protected void grant(
-      Project.NameKey project,
-      String ref,
-      String permission,
-      boolean force,
-      AccountGroup.UUID groupUUID)
-      throws RepositoryNotFoundException, IOException, ConfigInvalidException {
-    try (MetaDataUpdate md = metaDataUpdateFactory.create(project)) {
-      md.setMessage(String.format("Grant %s on %s", permission, ref));
-      ProjectConfig config = ProjectConfig.read(md);
-      AccessSection s = config.getAccessSection(ref, true);
-      Permission p = s.getPermission(permission, true);
-      PermissionRule rule = Util.newRule(config, groupUUID);
-      rule.setForce(force);
-      p.add(rule);
-      config.commit(md);
-      projectCache.evict(config.getProject());
-    }
-  }
-
-  protected void grantLabel(
-      String label,
-      int min,
-      int max,
-      Project.NameKey project,
-      String ref,
-      boolean force,
-      AccountGroup.UUID groupUUID,
-      boolean exclusive)
-      throws RepositoryNotFoundException, IOException, ConfigInvalidException {
-    String permission = Permission.LABEL + label;
-    try (MetaDataUpdate md = metaDataUpdateFactory.create(project)) {
-      md.setMessage(String.format("Grant %s on %s", permission, ref));
-      ProjectConfig config = ProjectConfig.read(md);
-      AccessSection s = config.getAccessSection(ref, true);
-      Permission p = s.getPermission(permission, true);
-      p.setExclusiveGroup(exclusive);
-      PermissionRule rule = Util.newRule(config, groupUUID);
-      rule.setForce(force);
-      rule.setMin(min);
-      rule.setMax(max);
-      p.add(rule);
-      config.commit(md);
-      projectCache.evict(config.getProject());
-    }
-  }
-
-  protected void removePermission(Project.NameKey project, String ref, String permission)
-      throws IOException, ConfigInvalidException {
-    try (MetaDataUpdate md = metaDataUpdateFactory.create(project)) {
-      md.setMessage(String.format("Remove %s on %s", permission, ref));
-      ProjectConfig config = ProjectConfig.read(md);
-      AccessSection s = config.getAccessSection(ref, true);
-      Permission p = s.getPermission(permission, true);
-      p.getRules().clear();
-      config.commit(md);
-      projectCache.evict(config.getProject());
-    }
-  }
-
-  protected void blockRead(String ref) throws Exception {
-    block(ref, Permission.READ, REGISTERED_USERS);
-  }
-
-  protected void blockForgeCommitter(Project.NameKey project, String ref) throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    Util.block(cfg, Permission.FORGE_COMMITTER, REGISTERED_USERS, ref);
-    saveProjectConfig(project, cfg);
-  }
-
-  protected PushOneCommit.Result pushTo(String ref) throws Exception {
-    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
-    return push.to(ref);
-  }
-
-  protected void approve(String id) throws Exception {
-    gApi.changes().id(id).revision("current").review(ReviewInput.approve());
-  }
-
-  protected void recommend(String id) throws Exception {
-    gApi.changes().id(id).revision("current").review(ReviewInput.recommend());
-  }
-
-  protected Map<String, ActionInfo> getActions(String id) throws Exception {
-    return gApi.changes().id(id).revision(1).actions();
-  }
-
-  protected String getETag(String id) throws Exception {
-    return gApi.changes().id(id).current().etag();
-  }
-
-  private static Iterable<String> changeIds(Iterable<ChangeInfo> changes) {
-    return Iterables.transform(changes, i -> i.changeId);
-  }
-
-  protected void assertSubmittedTogether(String chId, String... expected) throws Exception {
-    List<ChangeInfo> actual = gApi.changes().id(chId).submittedTogether();
-    SubmittedTogetherInfo info =
-        gApi.changes().id(chId).submittedTogether(EnumSet.of(NON_VISIBLE_CHANGES));
-
-    assertThat(info.nonVisibleChanges).isEqualTo(0);
-    assertThat(actual).hasSize(expected.length);
-    assertThat(changeIds(actual)).containsExactly((Object[]) expected).inOrder();
-    assertThat(changeIds(info.changes)).containsExactly((Object[]) expected).inOrder();
-  }
-
-  protected PatchSet getPatchSet(PatchSet.Id psId) throws OrmException {
-    return changeDataFactory.create(db, project, psId.getParentKey()).patchSet(psId);
-  }
-
-  protected IdentifiedUser user(TestAccount testAccount) {
-    return identifiedUserFactory.create(testAccount.getId());
-  }
-
-  protected RevisionResource parseCurrentRevisionResource(String changeId) throws Exception {
-    ChangeResource cr = parseChangeResource(changeId);
-    int psId = cr.getChange().currentPatchSetId().get();
-    return revisions.parse(cr, IdString.fromDecoded(Integer.toString(psId)));
-  }
-
-  protected RevisionResource parseRevisionResource(String changeId, int n) throws Exception {
-    return revisions.parse(
-        parseChangeResource(changeId), IdString.fromDecoded(Integer.toString(n)));
-  }
-
-  protected RevisionResource parseRevisionResource(PushOneCommit.Result r) throws Exception {
-    PatchSet.Id psId = r.getPatchSetId();
-    return parseRevisionResource(psId.getParentKey().toString(), psId.get());
-  }
-
-  protected ChangeResource parseChangeResource(String changeId) throws Exception {
-    List<ChangeNotes> notes = changeFinder.find(changeId);
-    assertThat(notes).hasSize(1);
-    return changeResourceFactory.create(notes.get(0), atrScope.get().getUser());
-  }
-
-  protected String createGroup(String name) throws Exception {
-    return createGroup(name, "Administrators");
-  }
-
-  protected String createGroupWithRealName(String name) throws Exception {
-    GroupInput in = new GroupInput();
-    in.name = name;
-    in.ownerId = "Administrators";
-    gApi.groups().create(in);
-    return name;
-  }
-
-  protected String createGroup(String name, String owner) throws Exception {
-    name = name(name);
-    GroupInput in = new GroupInput();
-    in.name = name;
-    in.ownerId = owner;
-    gApi.groups().create(in);
-    return name;
-  }
-
-  protected String createAccount(String name, String group) throws Exception {
-    name = name(name);
-    accountCreator.create(name, group);
-    return name;
-  }
-
-  protected RevCommit getHead(Repository repo, String name) throws Exception {
-    try (RevWalk rw = new RevWalk(repo)) {
-      Ref r = repo.exactRef(name);
-      return r != null ? rw.parseCommit(r.getObjectId()) : null;
-    }
-  }
-
-  protected RevCommit getHead(Repository repo) throws Exception {
-    return getHead(repo, "HEAD");
-  }
-
-  protected RevCommit getRemoteHead(Project.NameKey project, String branch) throws Exception {
-    try (Repository repo = repoManager.openRepository(project)) {
-      return getHead(repo, branch.startsWith(Constants.R_REFS) ? branch : "refs/heads/" + branch);
-    }
-  }
-
-  protected RevCommit getRemoteHead(String project, String branch) throws Exception {
-    return getRemoteHead(new Project.NameKey(project), branch);
-  }
-
-  protected RevCommit getRemoteHead() throws Exception {
-    return getRemoteHead(project, "master");
-  }
-
-  protected void grantTagPermissions() throws Exception {
-    grant(project, R_TAGS + "*", Permission.CREATE);
-    grant(project, R_TAGS + "", Permission.DELETE);
-    grant(project, R_TAGS + "*", Permission.CREATE_TAG);
-    grant(project, R_TAGS + "*", Permission.CREATE_SIGNED_TAG);
-  }
-
-  protected void assertMailReplyTo(Message message, String email) throws Exception {
-    assertThat(message.headers()).containsKey("Reply-To");
-    EmailHeader.String replyTo = (EmailHeader.String) message.headers().get("Reply-To");
-    assertThat(replyTo.getString()).contains(email);
-  }
-
-  protected ContributorAgreement configureContributorAgreement(boolean autoVerify)
-      throws Exception {
-    ContributorAgreement ca;
-    if (autoVerify) {
-      String g = createGroup("cla-test-group");
-      GroupApi groupApi = gApi.groups().id(g);
-      groupApi.description("CLA test group");
-      InternalGroup caGroup =
-          groupCache.get(new AccountGroup.UUID(groupApi.detail().id)).orElse(null);
-      GroupReference groupRef = new GroupReference(caGroup.getGroupUUID(), caGroup.getName());
-      PermissionRule rule = new PermissionRule(groupRef);
-      rule.setAction(PermissionRule.Action.ALLOW);
-      ca = new ContributorAgreement("cla-test");
-      ca.setAutoVerify(groupRef);
-      ca.setAccepted(ImmutableList.of(rule));
-    } else {
-      ca = new ContributorAgreement("cla-test-no-auto-verify");
-    }
-    ca.setDescription("description");
-    ca.setAgreementUrl("agreement-url");
-
-    ProjectConfig cfg = projectCache.checkedGet(allProjects).getConfig();
-    cfg.replace(ca);
-    saveProjectConfig(allProjects, cfg);
-    return ca;
-  }
-
-  protected BinaryResult submitPreview(String changeId) throws Exception {
-    return gApi.changes().id(changeId).current().submitPreview();
-  }
-
-  protected BinaryResult submitPreview(String changeId, String format) throws Exception {
-    return gApi.changes().id(changeId).current().submitPreview(format);
-  }
-
-  protected Map<Branch.NameKey, ObjectId> fetchFromSubmitPreview(String changeId) throws Exception {
-    try (BinaryResult result = submitPreview(changeId)) {
-      return fetchFromBundles(result);
-    }
-  }
-
-  /**
-   * Fetches each bundle into a newly cloned repository, then it applies the bundle, and returns the
-   * resulting tree id.
-   *
-   * <p>Omits NoteDb meta refs.
-   */
-  protected Map<Branch.NameKey, ObjectId> fetchFromBundles(BinaryResult bundles) throws Exception {
-    assertThat(bundles.getContentType()).isEqualTo("application/x-zip");
-
-    FileSystem fs = Jimfs.newFileSystem();
-    Path previewPath = fs.getPath("preview.zip");
-    try (OutputStream out = Files.newOutputStream(previewPath)) {
-      bundles.writeTo(out);
-    }
-    Map<Branch.NameKey, ObjectId> ret = new HashMap<>();
-    try (FileSystem zipFs = FileSystems.newFileSystem(previewPath, null);
-        DirectoryStream<Path> dirStream =
-            Files.newDirectoryStream(Iterables.getOnlyElement(zipFs.getRootDirectories()))) {
-      for (Path p : dirStream) {
-        if (!Files.isRegularFile(p)) {
-          continue;
-        }
-        String bundleName = p.getFileName().toString();
-        int len = bundleName.length();
-        assertThat(bundleName).endsWith(".git");
-        String repoName = bundleName.substring(0, len - 4);
-        Project.NameKey proj = new Project.NameKey(repoName);
-        TestRepository<?> localRepo = cloneProject(proj);
-
-        try (InputStream bundleStream = Files.newInputStream(p);
-            TransportBundleStream tbs =
-                new TransportBundleStream(
-                    localRepo.getRepository(), new URIish(bundleName), bundleStream)) {
-          FetchResult fr =
-              tbs.fetch(
-                  NullProgressMonitor.INSTANCE,
-                  Arrays.asList(new RefSpec("refs/*:refs/preview/*")));
-          for (Ref r : fr.getAdvertisedRefs()) {
-            String refName = r.getName();
-            if (RefNames.isNoteDbMetaRef(refName)) {
-              continue;
-            }
-            RevCommit c = localRepo.getRevWalk().parseCommit(r.getObjectId());
-            ret.put(new Branch.NameKey(proj, refName), c.getTree().copy());
-          }
-        }
-      }
-    }
-    assertThat(ret).isNotEmpty();
-    return ret;
-  }
-
-  /** Assert that the given branches have the given tree ids. */
-  protected void assertTrees(Project.NameKey proj, Map<Branch.NameKey, ObjectId> trees)
-      throws Exception {
-    TestRepository<?> localRepo = cloneProject(proj);
-    GitUtil.fetch(localRepo, "refs/*:refs/*");
-    Map<String, Ref> refs = localRepo.getRepository().getAllRefs();
-    Map<Branch.NameKey, RevTree> refValues = new HashMap<>();
-
-    for (Branch.NameKey b : trees.keySet()) {
-      if (!b.getParentKey().equals(proj)) {
-        continue;
-      }
-
-      Ref r = refs.get(b.get());
-      assertThat(r).isNotNull();
-      RevWalk rw = localRepo.getRevWalk();
-      RevCommit c = rw.parseCommit(r.getObjectId());
-      refValues.put(b, c.getTree());
-
-      assertThat(trees.get(b)).isEqualTo(refValues.get(b));
-    }
-    assertThat(refValues.keySet()).containsAnyIn(trees.keySet());
-  }
-
-  protected void assertDiffForNewFile(
-      DiffInfo diff, RevCommit commit, String path, String expectedContentSideB) throws Exception {
-    List<String> expectedLines = new ArrayList<>();
-    for (String line : expectedContentSideB.split("\n")) {
-      expectedLines.add(line);
-    }
-
-    assertThat(diff.binary).isNull();
-    assertThat(diff.changeType).isEqualTo(ChangeType.ADDED);
-    assertThat(diff.diffHeader).isNotNull();
-    assertThat(diff.intralineStatus).isNull();
-    assertThat(diff.webLinks).isNull();
-
-    assertThat(diff.metaA).isNull();
-    assertThat(diff.metaB).isNotNull();
-    assertThat(diff.metaB.commitId).isEqualTo(commit.name());
-
-    String expectedContentType = "text/plain";
-    if (COMMIT_MSG.equals(path)) {
-      expectedContentType = FileContentUtil.TEXT_X_GERRIT_COMMIT_MESSAGE;
-    } else if (MERGE_LIST.equals(path)) {
-      expectedContentType = FileContentUtil.TEXT_X_GERRIT_MERGE_LIST;
-    }
-    assertThat(diff.metaB.contentType).isEqualTo(expectedContentType);
-
-    assertThat(diff.metaB.lines).isEqualTo(expectedLines.size());
-    assertThat(diff.metaB.name).isEqualTo(path);
-    assertThat(diff.metaB.webLinks).isNull();
-
-    assertThat(diff.content).hasSize(1);
-    DiffInfo.ContentEntry contentEntry = diff.content.get(0);
-    assertThat(contentEntry.b).containsExactlyElementsIn(expectedLines).inOrder();
-    assertThat(contentEntry.a).isNull();
-    assertThat(contentEntry.ab).isNull();
-    assertThat(contentEntry.common).isNull();
-    assertThat(contentEntry.editA).isNull();
-    assertThat(contentEntry.editB).isNull();
-    assertThat(contentEntry.skip).isNull();
-  }
-
-  protected TestRepository<?> createProjectWithPush(
-      String name, @Nullable Project.NameKey parent, SubmitType submitType) throws Exception {
-    Project.NameKey project = createProject(name, parent, true, submitType);
-    grant(project, "refs/heads/*", Permission.PUSH);
-    grant(project, "refs/for/refs/heads/*", Permission.SUBMIT);
-    return cloneProject(project);
-  }
-
-  protected void assertPermitted(ChangeInfo info, String label, Integer... expected) {
-    assertThat(info.permittedLabels).isNotNull();
-    Collection<String> strs = info.permittedLabels.get(label);
-    if (expected.length == 0) {
-      assertThat(strs).isNull();
-    } else {
-      assertThat(strs.stream().map(s -> Integer.valueOf(s.trim())).collect(toList()))
-          .containsExactlyElementsIn(Arrays.asList(expected));
-    }
-  }
-
-  protected void assertNotifyTo(TestAccount expected) {
-    assertNotifyTo(expected.emailAddress);
-  }
-
-  protected void assertNotifyTo(Address expected) {
-    assertThat(sender.getMessages()).hasSize(1);
-    Message m = sender.getMessages().get(0);
-    assertThat(m.rcpt()).containsExactly(expected);
-    assertThat(((EmailHeader.AddressList) m.headers().get("To")).getAddressList())
-        .containsExactly(expected);
-    assertThat(m.headers().get("CC").isEmpty()).isTrue();
-  }
-
-  protected void assertNotifyCc(TestAccount expected) {
-    assertNotifyCc(expected.emailAddress);
-  }
-
-  protected void assertNotifyCc(Address expected) {
-    assertThat(sender.getMessages()).hasSize(1);
-    Message m = sender.getMessages().get(0);
-    assertThat(m.rcpt()).containsExactly(expected);
-    assertThat(m.headers().get("To").isEmpty()).isTrue();
-    assertThat(((EmailHeader.AddressList) m.headers().get("CC")).getAddressList())
-        .containsExactly(expected);
-  }
-
-  protected void assertNotifyBcc(TestAccount expected) {
-    assertThat(sender.getMessages()).hasSize(1);
-    Message m = sender.getMessages().get(0);
-    assertThat(m.rcpt()).containsExactly(expected.emailAddress);
-    assertThat(m.headers().get("To").isEmpty()).isTrue();
-    assertThat(m.headers().get("CC").isEmpty()).isTrue();
-  }
-
-  protected interface ProjectWatchInfoConfiguration {
-    void configure(ProjectWatchInfo pwi);
-  }
-
-  protected void watch(String project, ProjectWatchInfoConfiguration config)
-      throws RestApiException {
-    ProjectWatchInfo pwi = new ProjectWatchInfo();
-    pwi.project = project;
-    config.configure(pwi);
-    gApi.accounts().self().setWatchedProjects(ImmutableList.of(pwi));
-  }
-
-  protected void watch(PushOneCommit.Result r, ProjectWatchInfoConfiguration config)
-      throws OrmException, RestApiException {
-    watch(r.getChange().project().get(), config);
-  }
-
-  protected void watch(String project, String filter) throws RestApiException {
-    watch(
-        project,
-        pwi -> {
-          pwi.filter = filter;
-          pwi.notifyAbandonedChanges = true;
-          pwi.notifyNewChanges = true;
-          pwi.notifyAllComments = true;
-        });
-  }
-
-  protected void watch(String project) throws RestApiException {
-    watch(project, (String) null);
-  }
-
-  protected void assertContent(PushOneCommit.Result pushResult, String path, String expectedContent)
-      throws Exception {
-    BinaryResult bin =
-        gApi.changes()
-            .id(pushResult.getChangeId())
-            .revision(pushResult.getCommit().name())
-            .file(path)
-            .content();
-    ByteArrayOutputStream os = new ByteArrayOutputStream();
-    bin.writeTo(os);
-    String res = new String(os.toByteArray(), UTF_8);
-    assertThat(res).isEqualTo(expectedContent);
-  }
-
-  protected RevCommit createNewCommitWithoutChangeId(String branch, String file, String content)
-      throws Exception {
-    try (Repository repo = repoManager.openRepository(project);
-        RevWalk walk = new RevWalk(repo)) {
-      Ref ref = repo.exactRef(branch);
-      RevCommit tip = null;
-      if (ref != null) {
-        tip = walk.parseCommit(ref.getObjectId());
-      }
-      TestRepository<?> testSrcRepo = new TestRepository<>(repo);
-      TestRepository<?>.BranchBuilder builder = testSrcRepo.branch(branch);
-      RevCommit revCommit =
-          tip == null
-              ? builder.commit().message("commit 1").add(file, content).create()
-              : builder.commit().parent(tip).message("commit 1").add(file, content).create();
-      assertThat(GitUtil.getChangeId(testSrcRepo, revCommit).isPresent()).isFalse();
-      return revCommit;
-    }
-  }
-
-  protected RevCommit parseCurrentRevision(RevWalk rw, PushOneCommit.Result r) throws Exception {
-    return parseCurrentRevision(rw, r.getChangeId());
-  }
-
-  protected RevCommit parseCurrentRevision(RevWalk rw, String changeId) throws Exception {
-    return rw.parseCommit(
-        ObjectId.fromString(get(changeId, ListChangesOption.CURRENT_REVISION).currentRevision));
-  }
-
-  protected void enableCreateNewChangeForAllNotInTarget() throws Exception {
-    ProjectConfig config = projectCache.checkedGet(project).getConfig();
-    config.getProject().setCreateNewChangeForAllNotInTarget(InheritableBoolean.TRUE);
-    saveProjectConfig(project, config);
-  }
-
-  protected void configLabel(String label, LabelFunction func) throws Exception {
-    configLabel(label, func, ImmutableList.of());
-  }
-
-  protected void configLabel(String label, LabelFunction func, List<String> refPatterns)
-      throws Exception {
-    configLabel(
-        project,
-        label,
-        func,
-        refPatterns,
-        value(1, "Passes"),
-        value(0, "No score"),
-        value(-1, "Failed"));
-  }
-
-  private void configLabel(
-      Project.NameKey project,
-      String label,
-      LabelFunction func,
-      List<String> refPatterns,
-      LabelValue... value)
-      throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    LabelType labelType = category(label, value);
-    labelType.setFunction(func);
-    labelType.setRefPatterns(refPatterns);
-    cfg.getLabelSections().put(labelType.getName(), labelType);
-    saveProjectConfig(project, cfg);
-  }
-}
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AbstractNotificationTest.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AbstractNotificationTest.java
deleted file mode 100644
index 8aa7766..0000000
--- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AbstractNotificationTest.java
+++ /dev/null
@@ -1,526 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.acceptance;
-
-import static com.google.common.truth.Truth.assertAbout;
-import static com.google.gerrit.extensions.api.changes.RecipientType.BCC;
-import static com.google.gerrit.extensions.api.changes.RecipientType.CC;
-import static com.google.gerrit.extensions.api.changes.RecipientType.TO;
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.base.Joiner;
-import com.google.common.collect.ImmutableList;
-import com.google.common.truth.FailureStrategy;
-import com.google.common.truth.Subject;
-import com.google.common.truth.SubjectFactory;
-import com.google.common.truth.Truth;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.api.changes.RecipientType;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.api.changes.ReviewResult;
-import com.google.gerrit.extensions.api.projects.ConfigInput;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo.EmailStrategy;
-import com.google.gerrit.extensions.client.InheritableBoolean;
-import com.google.gerrit.extensions.client.ReviewerState;
-import com.google.gerrit.server.account.WatchConfig.NotifyType;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.mail.send.EmailHeader;
-import com.google.gerrit.server.mail.send.EmailHeader.AddressList;
-import com.google.gerrit.testutil.FakeEmailSender;
-import com.google.gerrit.testutil.FakeEmailSender.Message;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.function.Function;
-import org.eclipse.jgit.junit.TestRepository;
-import org.junit.After;
-import org.junit.Before;
-
-public abstract class AbstractNotificationTest extends AbstractDaemonTest {
-  @Before
-  public void enableReviewerByEmail() throws Exception {
-    setApiUser(admin);
-    ConfigInput conf = new ConfigInput();
-    conf.enableReviewerByEmail = InheritableBoolean.TRUE;
-    gApi.projects().name(project.get()).config(conf);
-  }
-
-  private static final SubjectFactory<FakeEmailSenderSubject, FakeEmailSender>
-      FAKE_EMAIL_SENDER_SUBJECT_FACTORY =
-          new SubjectFactory<FakeEmailSenderSubject, FakeEmailSender>() {
-            @Override
-            public FakeEmailSenderSubject getSubject(
-                FailureStrategy failureStrategy, FakeEmailSender target) {
-              return new FakeEmailSenderSubject(failureStrategy, target);
-            }
-          };
-
-  protected static FakeEmailSenderSubject assertThat(FakeEmailSender sender) {
-    return assertAbout(FAKE_EMAIL_SENDER_SUBJECT_FACTORY).that(sender);
-  }
-
-  protected void setEmailStrategy(TestAccount account, EmailStrategy strategy) throws Exception {
-    setEmailStrategy(account, strategy, true);
-  }
-
-  protected void setEmailStrategy(TestAccount account, EmailStrategy strategy, boolean record)
-      throws Exception {
-    if (record) {
-      accountsModifyingEmailStrategy.add(account);
-    }
-    setApiUser(account);
-    GeneralPreferencesInfo prefs = gApi.accounts().self().getPreferences();
-    prefs.emailStrategy = strategy;
-    gApi.accounts().self().setPreferences(prefs);
-  }
-
-  protected static class FakeEmailSenderSubject
-      extends Subject<FakeEmailSenderSubject, FakeEmailSender> {
-    private Message message;
-    private StagedUsers users;
-    private Map<RecipientType, List<String>> recipients = new HashMap<>();
-    private Set<String> accountedFor = new HashSet<>();
-
-    FakeEmailSenderSubject(FailureStrategy failureStrategy, FakeEmailSender target) {
-      super(failureStrategy, target);
-    }
-
-    public FakeEmailSenderSubject notSent() {
-      if (actual().peekMessage() != null) {
-        fail("a message wasn't sent");
-      }
-      return this;
-    }
-
-    public FakeEmailSenderSubject sent(String messageType, StagedUsers users) {
-      message = actual().nextMessage();
-      if (message == null) {
-        fail("a message was sent");
-      }
-      recipients = new HashMap<>();
-      recipients.put(TO, parseAddresses(message, "To"));
-      recipients.put(CC, parseAddresses(message, "CC"));
-      recipients.put(
-          BCC,
-          message.rcpt().stream()
-              .map(Address::getEmail)
-              .filter(e -> !recipients.get(TO).contains(e) && !recipients.get(CC).contains(e))
-              .collect(toList()));
-      this.users = users;
-      if (!message.headers().containsKey("X-Gerrit-MessageType")) {
-        fail("a message was sent with X-Gerrit-MessageType header");
-      }
-      EmailHeader header = message.headers().get("X-Gerrit-MessageType");
-      if (!header.equals(new EmailHeader.String(messageType))) {
-        fail("message of type " + messageType + " was sent; X-Gerrit-MessageType is " + header);
-      }
-
-      // Return a named subject that displays a human-readable table of
-      // recipients.
-      return named(recipientMapToString(recipients, e -> users.emailToName(e)));
-    }
-
-    private static String recipientMapToString(
-        Map<RecipientType, List<String>> recipients, Function<String, String> emailToName) {
-      StringBuilder buf = new StringBuilder();
-      buf.append('[');
-      for (RecipientType type : ImmutableList.of(TO, CC, BCC)) {
-        buf.append('\n');
-        buf.append(type);
-        buf.append(':');
-        String delim = " ";
-        for (String r : recipients.get(type)) {
-          buf.append(delim);
-          buf.append(emailToName.apply(r));
-          delim = ", ";
-        }
-      }
-      buf.append("\n]");
-      return buf.toString();
-    }
-
-    List<String> parseAddresses(Message msg, String headerName) {
-      EmailHeader header = msg.headers().get(headerName);
-      if (header == null) {
-        return ImmutableList.of();
-      }
-      Truth.assertThat(header).isInstanceOf(AddressList.class);
-      AddressList addrList = (AddressList) header;
-      return addrList.getAddressList().stream().map(Address::getEmail).collect(toList());
-    }
-
-    public FakeEmailSenderSubject to(String... emails) {
-      return rcpt(users.supportReviewersByEmail ? TO : null, emails);
-    }
-
-    public FakeEmailSenderSubject cc(String... emails) {
-      return rcpt(users.supportReviewersByEmail ? CC : null, emails);
-    }
-
-    public FakeEmailSenderSubject bcc(String... emails) {
-      return rcpt(users.supportReviewersByEmail ? BCC : null, emails);
-    }
-
-    private FakeEmailSenderSubject rcpt(@Nullable RecipientType type, String[] emails) {
-      for (String email : emails) {
-        rcpt(type, email);
-      }
-      return this;
-    }
-
-    private void rcpt(@Nullable RecipientType type, String email) {
-      rcpt(TO, email, TO.equals(type));
-      rcpt(CC, email, CC.equals(type));
-      rcpt(BCC, email, BCC.equals(type));
-    }
-
-    private void rcpt(@Nullable RecipientType type, String email, boolean expected) {
-      if (recipients.get(type).contains(email) != expected) {
-        fail(
-            expected ? "notifies" : "doesn't notify",
-            "]\n" + type + ": " + users.emailToName(email) + "\n]");
-      }
-      if (expected) {
-        accountedFor.add(email);
-      }
-    }
-
-    public FakeEmailSenderSubject noOneElse() {
-      for (Map.Entry<NotifyType, TestAccount> watchEntry : users.watchers.entrySet()) {
-        if (!accountedFor.contains(watchEntry.getValue().email)) {
-          notTo(watchEntry.getKey());
-        }
-      }
-
-      Map<RecipientType, List<String>> unaccountedFor = new HashMap<>();
-      boolean ok = true;
-      for (Map.Entry<RecipientType, List<String>> entry : recipients.entrySet()) {
-        unaccountedFor.put(entry.getKey(), new ArrayList<>());
-        for (String address : entry.getValue()) {
-          if (!accountedFor.contains(address)) {
-            unaccountedFor.get(entry.getKey()).add(address);
-            ok = false;
-          }
-        }
-      }
-      if (!ok) {
-        fail(
-            "was fully tested, missing assertions for: "
-                + recipientMapToString(unaccountedFor, e -> users.emailToName(e)));
-      }
-      return this;
-    }
-
-    public FakeEmailSenderSubject notTo(String... emails) {
-      return rcpt(null, emails);
-    }
-
-    public FakeEmailSenderSubject to(TestAccount... accounts) {
-      return rcpt(TO, accounts);
-    }
-
-    public FakeEmailSenderSubject cc(TestAccount... accounts) {
-      return rcpt(CC, accounts);
-    }
-
-    public FakeEmailSenderSubject bcc(TestAccount... accounts) {
-      return rcpt(BCC, accounts);
-    }
-
-    public FakeEmailSenderSubject notTo(TestAccount... accounts) {
-      return rcpt(null, accounts);
-    }
-
-    private FakeEmailSenderSubject rcpt(@Nullable RecipientType type, TestAccount[] accounts) {
-      for (TestAccount account : accounts) {
-        rcpt(type, account);
-      }
-      return this;
-    }
-
-    private void rcpt(@Nullable RecipientType type, TestAccount account) {
-      rcpt(type, account.email);
-    }
-
-    public FakeEmailSenderSubject to(NotifyType... watches) {
-      return rcpt(TO, watches);
-    }
-
-    public FakeEmailSenderSubject cc(NotifyType... watches) {
-      return rcpt(CC, watches);
-    }
-
-    public FakeEmailSenderSubject bcc(NotifyType... watches) {
-      return rcpt(BCC, watches);
-    }
-
-    public FakeEmailSenderSubject notTo(NotifyType... watches) {
-      return rcpt(null, watches);
-    }
-
-    private FakeEmailSenderSubject rcpt(@Nullable RecipientType type, NotifyType[] watches) {
-      for (NotifyType watch : watches) {
-        rcpt(type, watch);
-      }
-      return this;
-    }
-
-    private void rcpt(@Nullable RecipientType type, NotifyType watch) {
-      if (!users.watchers.containsKey(watch)) {
-        fail("configured to watch", watch);
-      }
-      rcpt(type, users.watchers.get(watch));
-    }
-  }
-
-  private static final Map<String, StagedUsers> stagedUsers = new HashMap<>();
-
-  // TestAccount doesn't implement hashCode/equals, so this set is according
-  // to object identity. That's fine for our purposes.
-  private Set<TestAccount> accountsModifyingEmailStrategy = new HashSet<>();
-
-  @After
-  public void resetEmailStrategies() throws Exception {
-    for (TestAccount account : accountsModifyingEmailStrategy) {
-      setEmailStrategy(account, EmailStrategy.ENABLED, false);
-    }
-    accountsModifyingEmailStrategy.clear();
-  }
-
-  protected class StagedUsers {
-    public final TestAccount owner;
-    public final TestAccount author;
-    public final TestAccount uploader;
-    public final TestAccount reviewer;
-    public final TestAccount ccer;
-    public final TestAccount starrer;
-    public final TestAccount assignee;
-    public final TestAccount watchingProjectOwner;
-    public final String reviewerByEmail = "reviewerByEmail@example.com";
-    public final String ccerByEmail = "ccByEmail@example.com";
-    private final Map<NotifyType, TestAccount> watchers = new HashMap<>();
-    private final Map<String, TestAccount> accountsByEmail = new HashMap<>();
-    boolean supportReviewersByEmail;
-
-    private String usersCacheKey() {
-      return description.getClassName();
-    }
-
-    private TestAccount evictAndCopy(TestAccount account) throws IOException {
-      accountCache.evict(account.id);
-      return account;
-    }
-
-    public StagedUsers() throws Exception {
-      synchronized (stagedUsers) {
-        if (stagedUsers.containsKey(usersCacheKey())) {
-          StagedUsers existing = stagedUsers.get(usersCacheKey());
-          owner = evictAndCopy(existing.owner);
-          author = evictAndCopy(existing.author);
-          uploader = evictAndCopy(existing.uploader);
-          reviewer = evictAndCopy(existing.reviewer);
-          ccer = evictAndCopy(existing.ccer);
-          starrer = evictAndCopy(existing.starrer);
-          assignee = evictAndCopy(existing.assignee);
-          watchingProjectOwner = evictAndCopy(existing.watchingProjectOwner);
-          watchers.putAll(existing.watchers);
-          return;
-        }
-
-        owner = testAccount("owner");
-        reviewer = testAccount("reviewer");
-        author = testAccount("author");
-        uploader = testAccount("uploader");
-        ccer = testAccount("ccer");
-        starrer = testAccount("starrer");
-        assignee = testAccount("assignee");
-
-        watchingProjectOwner = testAccount("watchingProjectOwner", "Administrators");
-        setApiUser(watchingProjectOwner);
-        watch(allProjects.get(), pwi -> pwi.notifyNewChanges = true);
-
-        for (NotifyType watch : NotifyType.values()) {
-          if (watch == NotifyType.ALL) {
-            continue;
-          }
-          TestAccount watcher = testAccount(watch.toString());
-          setApiUser(watcher);
-          watch(
-              allProjects.get(),
-              pwi -> {
-                pwi.notifyAllComments = watch.equals(NotifyType.ALL_COMMENTS);
-                pwi.notifyAbandonedChanges = watch.equals(NotifyType.ABANDONED_CHANGES);
-                pwi.notifyNewChanges = watch.equals(NotifyType.NEW_CHANGES);
-                pwi.notifyNewPatchSets = watch.equals(NotifyType.NEW_PATCHSETS);
-                pwi.notifySubmittedChanges = watch.equals(NotifyType.SUBMITTED_CHANGES);
-              });
-          watchers.put(watch, watcher);
-        }
-
-        stagedUsers.put(usersCacheKey(), this);
-      }
-    }
-
-    private String email(String username) {
-      // Email validator rejects usernames longer than 64 bytes.
-      if (username.length() > 64) {
-        username = username.substring(username.length() - 64);
-        if (username.startsWith(".")) {
-          username = username.substring(1);
-        }
-      }
-      return username + "@example.com";
-    }
-
-    public TestAccount testAccount(String name) throws Exception {
-      String username = name(name);
-      TestAccount account = accountCreator.create(username, email(username), name);
-      accountsByEmail.put(account.email, account);
-      return account;
-    }
-
-    public TestAccount testAccount(String name, String groupName) throws Exception {
-      String username = name(name);
-      TestAccount account = accountCreator.create(username, email(username), name, groupName);
-      accountsByEmail.put(account.email, account);
-      return account;
-    }
-
-    String emailToName(String email) {
-      if (accountsByEmail.containsKey(email)) {
-        return accountsByEmail.get(email).fullName;
-      }
-      return email;
-    }
-
-    protected void addReviewers(PushOneCommit.Result r) throws Exception {
-      ReviewInput in =
-          ReviewInput.noScore()
-              .reviewer(reviewer.email)
-              .reviewer(reviewerByEmail)
-              .reviewer(ccer.email, ReviewerState.CC, false)
-              .reviewer(ccerByEmail, ReviewerState.CC, false);
-      ReviewResult result = gApi.changes().id(r.getChangeId()).revision("current").review(in);
-      supportReviewersByEmail = true;
-      if (result.reviewers.values().stream().anyMatch(v -> v.error != null)) {
-        supportReviewersByEmail = false;
-        in =
-            ReviewInput.noScore()
-                .reviewer(reviewer.email)
-                .reviewer(ccer.email, ReviewerState.CC, false);
-        result = gApi.changes().id(r.getChangeId()).revision("current").review(in);
-      }
-      Truth.assertThat(result.reviewers.values().stream().allMatch(v -> v.error == null)).isTrue();
-    }
-  }
-
-  protected interface PushOptionGenerator {
-    List<String> pushOptions(StagedUsers users);
-  }
-
-  protected class StagedPreChange extends StagedUsers {
-    public final TestRepository<?> repo;
-    protected final PushOneCommit.Result result;
-    public final String changeId;
-
-    StagedPreChange(String ref) throws Exception {
-      this(ref, null);
-    }
-
-    StagedPreChange(String ref, @Nullable PushOptionGenerator pushOptionGenerator)
-        throws Exception {
-      super();
-      List<String> pushOptions = null;
-      if (pushOptionGenerator != null) {
-        pushOptions = pushOptionGenerator.pushOptions(this);
-      }
-      if (pushOptions != null) {
-        ref = ref + '%' + Joiner.on(',').join(pushOptions);
-      }
-      setApiUser(owner);
-      repo = cloneProject(project, owner);
-      PushOneCommit push = pushFactory.create(db, owner.getIdent(), repo);
-      result = push.to(ref);
-      result.assertOkStatus();
-      changeId = result.getChangeId();
-    }
-  }
-
-  protected StagedPreChange stagePreChange(String ref) throws Exception {
-    return new StagedPreChange(ref);
-  }
-
-  protected StagedPreChange stagePreChange(
-      String ref, @Nullable PushOptionGenerator pushOptionGenerator) throws Exception {
-    return new StagedPreChange(ref, pushOptionGenerator);
-  }
-
-  protected class StagedChange extends StagedPreChange {
-    StagedChange(String ref) throws Exception {
-      super(ref);
-
-      setApiUser(starrer);
-      gApi.accounts().self().starChange(result.getChangeId());
-
-      setApiUser(owner);
-      addReviewers(result);
-      sender.clear();
-    }
-  }
-
-  protected StagedChange stageReviewableChange() throws Exception {
-    return new StagedChange("refs/for/master");
-  }
-
-  protected StagedChange stageWipChange() throws Exception {
-    return new StagedChange("refs/for/master%wip");
-  }
-
-  protected StagedChange stageReviewableWipChange() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    setApiUser(sc.owner);
-    gApi.changes().id(sc.changeId).setWorkInProgress();
-    return sc;
-  }
-
-  protected StagedChange stageAbandonedReviewableChange() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    setApiUser(sc.owner);
-    gApi.changes().id(sc.changeId).abandon();
-    sender.clear();
-    return sc;
-  }
-
-  protected StagedChange stageAbandonedReviewableWipChange() throws Exception {
-    StagedChange sc = stageReviewableWipChange();
-    setApiUser(sc.owner);
-    gApi.changes().id(sc.changeId).abandon();
-    sender.clear();
-    return sc;
-  }
-
-  protected StagedChange stageAbandonedWipChange() throws Exception {
-    StagedChange sc = stageWipChange();
-    setApiUser(sc.owner);
-    gApi.changes().id(sc.changeId).abandon();
-    sender.clear();
-    return sc;
-  }
-}
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AcceptanceTestRequestScope.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AcceptanceTestRequestScope.java
deleted file mode 100644
index 987cb97..0000000
--- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AcceptanceTestRequestScope.java
+++ /dev/null
@@ -1,213 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.acceptance;
-
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.RequestCleanup;
-import com.google.gerrit.server.config.RequestScopedReviewDbProvider;
-import com.google.gerrit.server.util.RequestContext;
-import com.google.gerrit.server.util.ThreadLocalRequestContext;
-import com.google.gerrit.server.util.ThreadLocalRequestScopePropagator;
-import com.google.gerrit.testutil.DisabledReviewDb;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Inject;
-import com.google.inject.Key;
-import com.google.inject.OutOfScopeException;
-import com.google.inject.Provider;
-import com.google.inject.Scope;
-import com.google.inject.util.Providers;
-import java.util.HashMap;
-import java.util.Map;
-
-/** Guice scopes for state during an Acceptance Test connection. */
-public class AcceptanceTestRequestScope {
-  private static final Key<RequestCleanup> RC_KEY = Key.get(RequestCleanup.class);
-
-  private static final Key<RequestScopedReviewDbProvider> DB_KEY =
-      Key.get(RequestScopedReviewDbProvider.class);
-
-  public static class Context implements RequestContext {
-    private final RequestCleanup cleanup = new RequestCleanup();
-    private final Map<Key<?>, Object> map = new HashMap<>();
-    private final SchemaFactory<ReviewDb> schemaFactory;
-    private final SshSession session;
-    private final CurrentUser user;
-
-    final long created;
-    volatile long started;
-    volatile long finished;
-
-    private Context(SchemaFactory<ReviewDb> sf, SshSession s, CurrentUser u, long at) {
-      schemaFactory = sf;
-      session = s;
-      user = u;
-      created = started = finished = at;
-      map.put(RC_KEY, cleanup);
-      map.put(DB_KEY, new RequestScopedReviewDbProvider(schemaFactory, Providers.of(cleanup)));
-    }
-
-    private Context(Context p, SshSession s, CurrentUser c) {
-      this(p.schemaFactory, s, c, p.created);
-      started = p.started;
-      finished = p.finished;
-    }
-
-    SshSession getSession() {
-      return session;
-    }
-
-    @Override
-    public CurrentUser getUser() {
-      if (user == null) {
-        throw new IllegalStateException("user == null, forgot to set it?");
-      }
-      return user;
-    }
-
-    @Override
-    public Provider<ReviewDb> getReviewDbProvider() {
-      return (RequestScopedReviewDbProvider) map.get(DB_KEY);
-    }
-
-    synchronized <T> T get(Key<T> key, Provider<T> creator) {
-      @SuppressWarnings("unchecked")
-      T t = (T) map.get(key);
-      if (t == null) {
-        t = creator.get();
-        map.put(key, t);
-      }
-      return t;
-    }
-  }
-
-  static class ContextProvider implements Provider<Context> {
-    @Override
-    public Context get() {
-      return requireContext();
-    }
-  }
-
-  static class SshSessionProvider implements Provider<SshSession> {
-    @Override
-    public SshSession get() {
-      return requireContext().getSession();
-    }
-  }
-
-  static class Propagator extends ThreadLocalRequestScopePropagator<Context> {
-    private final AcceptanceTestRequestScope atrScope;
-
-    @Inject
-    Propagator(
-        AcceptanceTestRequestScope atrScope,
-        ThreadLocalRequestContext local,
-        Provider<RequestScopedReviewDbProvider> dbProviderProvider) {
-      super(REQUEST, current, local, dbProviderProvider);
-      this.atrScope = atrScope;
-    }
-
-    @Override
-    protected Context continuingContext(Context ctx) {
-      // The cleanup is not chained, since the RequestScopePropagator executors
-      // the Context's cleanup when finished executing.
-      return atrScope.newContinuingContext(ctx);
-    }
-  }
-
-  private static final ThreadLocal<Context> current = new ThreadLocal<>();
-
-  private static Context requireContext() {
-    final Context ctx = current.get();
-    if (ctx == null) {
-      throw new OutOfScopeException("Not in command/request");
-    }
-    return ctx;
-  }
-
-  private final ThreadLocalRequestContext local;
-
-  @Inject
-  AcceptanceTestRequestScope(ThreadLocalRequestContext local) {
-    this.local = local;
-  }
-
-  public Context newContext(SchemaFactory<ReviewDb> sf, SshSession s, CurrentUser user) {
-    return new Context(sf, s, user, TimeUtil.nowMs());
-  }
-
-  private Context newContinuingContext(Context ctx) {
-    return new Context(ctx, ctx.getSession(), ctx.getUser());
-  }
-
-  public Context set(Context ctx) {
-    Context old = current.get();
-    current.set(ctx);
-    local.setContext(ctx);
-    return old;
-  }
-
-  public Context get() {
-    return current.get();
-  }
-
-  public Context disableDb() {
-    Context old = current.get();
-    SchemaFactory<ReviewDb> sf =
-        new SchemaFactory<ReviewDb>() {
-          @Override
-          public ReviewDb open() {
-            return new DisabledReviewDb();
-          }
-        };
-    Context ctx = new Context(sf, old.session, old.user, old.created);
-
-    current.set(ctx);
-    local.setContext(ctx);
-    return old;
-  }
-
-  public Context reopenDb() {
-    // Setting a new context with the same fields is enough to get the ReviewDb
-    // provider to reopen the database.
-    Context old = current.get();
-    return set(new Context(old.schemaFactory, old.session, old.user, old.created));
-  }
-
-  /** Returns exactly one instance per command executed. */
-  static final Scope REQUEST =
-      new Scope() {
-        @Override
-        public <T> Provider<T> scope(Key<T> key, Provider<T> creator) {
-          return new Provider<T>() {
-            @Override
-            public T get() {
-              return requireContext().get(key, creator);
-            }
-
-            @Override
-            public String toString() {
-              return String.format("%s[%s]", creator, REQUEST);
-            }
-          };
-        }
-
-        @Override
-        public String toString() {
-          return "Acceptance Test Scope.REQUEST";
-        }
-      };
-}
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AccountCreator.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AccountCreator.java
deleted file mode 100644
index a8f7767..0000000
--- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AccountCreator.java
+++ /dev/null
@@ -1,191 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.acceptance;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static java.nio.charset.StandardCharsets.US_ASCII;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.Sequences;
-import com.google.gerrit.server.account.AccountsUpdate;
-import com.google.gerrit.server.account.GroupCache;
-import com.google.gerrit.server.account.VersionedAuthorizedKeys;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.account.externalids.ExternalIdsUpdate;
-import com.google.gerrit.server.group.GroupsUpdate;
-import com.google.gerrit.server.group.InternalGroup;
-import com.google.gerrit.server.group.ServerInitiated;
-import com.google.gerrit.server.ssh.SshKeyCache;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import com.jcraft.jsch.JSch;
-import com.jcraft.jsch.JSchException;
-import com.jcraft.jsch.KeyPair;
-import java.io.ByteArrayOutputStream;
-import java.io.UnsupportedEncodingException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-
-@Singleton
-public class AccountCreator {
-  private final Map<String, TestAccount> accounts;
-
-  private final SchemaFactory<ReviewDb> reviewDbProvider;
-  private final Sequences sequences;
-  private final AccountsUpdate.Server accountsUpdate;
-  private final VersionedAuthorizedKeys.Accessor authorizedKeys;
-  private final GroupCache groupCache;
-  private final Provider<GroupsUpdate> groupsUpdateProvider;
-  private final SshKeyCache sshKeyCache;
-  private final ExternalIdsUpdate.Server externalIdsUpdate;
-  private final boolean sshEnabled;
-
-  @Inject
-  AccountCreator(
-      SchemaFactory<ReviewDb> schema,
-      Sequences sequences,
-      AccountsUpdate.Server accountsUpdate,
-      VersionedAuthorizedKeys.Accessor authorizedKeys,
-      GroupCache groupCache,
-      @ServerInitiated Provider<GroupsUpdate> groupsUpdateProvider,
-      SshKeyCache sshKeyCache,
-      ExternalIdsUpdate.Server externalIdsUpdate,
-      @SshEnabled boolean sshEnabled) {
-    accounts = new HashMap<>();
-    reviewDbProvider = schema;
-    this.sequences = sequences;
-    this.accountsUpdate = accountsUpdate;
-    this.authorizedKeys = authorizedKeys;
-    this.groupCache = groupCache;
-    this.groupsUpdateProvider = groupsUpdateProvider;
-    this.sshKeyCache = sshKeyCache;
-    this.externalIdsUpdate = externalIdsUpdate;
-    this.sshEnabled = sshEnabled;
-  }
-
-  public synchronized TestAccount create(
-      @Nullable String username,
-      @Nullable String email,
-      @Nullable String fullName,
-      String... groupNames)
-      throws Exception {
-
-    TestAccount account = accounts.get(username);
-    if (account != null) {
-      return account;
-    }
-    try (ReviewDb db = reviewDbProvider.open()) {
-      Account.Id id = new Account.Id(sequences.nextAccountId());
-
-      List<ExternalId> extIds = new ArrayList<>(2);
-      String httpPass = null;
-      if (username != null) {
-        httpPass = "http-pass";
-        extIds.add(ExternalId.createUsername(username, id, httpPass));
-      }
-
-      if (email != null) {
-        extIds.add(ExternalId.createEmail(id, email));
-      }
-      externalIdsUpdate.create().insert(extIds);
-
-      accountsUpdate
-          .create()
-          .insert(
-              id,
-              a -> {
-                a.setFullName(fullName);
-                a.setPreferredEmail(email);
-              });
-
-      if (groupNames != null) {
-        for (String n : groupNames) {
-          AccountGroup.NameKey k = new AccountGroup.NameKey(n);
-          Optional<InternalGroup> group = groupCache.get(k);
-          if (!group.isPresent()) {
-            throw new NoSuchGroupException(n);
-          }
-          groupsUpdateProvider.get().addGroupMember(db, group.get().getGroupUUID(), id);
-        }
-      }
-
-      KeyPair sshKey = null;
-      if (sshEnabled && username != null) {
-        sshKey = genSshKey();
-        authorizedKeys.addKey(id, publicKey(sshKey, email));
-        sshKeyCache.evict(username);
-      }
-
-      account = new TestAccount(id, username, email, fullName, sshKey, httpPass);
-      if (username != null) {
-        accounts.put(username, account);
-      }
-      return account;
-    }
-  }
-
-  public TestAccount create(@Nullable String username, String group) throws Exception {
-    return create(username, null, username, group);
-  }
-
-  public TestAccount create() throws Exception {
-    return create(null);
-  }
-
-  public TestAccount create(@Nullable String username) throws Exception {
-    return create(username, null, username, (String[]) null);
-  }
-
-  public TestAccount admin() throws Exception {
-    return create("admin", "admin@example.com", "Administrator", "Administrators");
-  }
-
-  public TestAccount admin2() throws Exception {
-    return create("admin2", "admin2@example.com", "Administrator2", "Administrators");
-  }
-
-  public TestAccount user() throws Exception {
-    return create("user", "user@example.com", "User");
-  }
-
-  public TestAccount user2() throws Exception {
-    return create("user2", "user2@example.com", "User2");
-  }
-
-  public TestAccount get(String username) {
-    return checkNotNull(accounts.get(username), "No TestAccount created for %s", username);
-  }
-
-  public static KeyPair genSshKey() throws JSchException {
-    JSch jsch = new JSch();
-    return KeyPair.genKeyPair(jsch, KeyPair.RSA);
-  }
-
-  public static String publicKey(KeyPair sshKey, String comment)
-      throws UnsupportedEncodingException {
-    ByteArrayOutputStream out = new ByteArrayOutputStream();
-    sshKey.writePublicKey(out, comment);
-    return out.toString(US_ASCII.name()).trim();
-  }
-}
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/EventRecorder.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/EventRecorder.java
deleted file mode 100644
index e9e8794..0000000
--- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/EventRecorder.java
+++ /dev/null
@@ -1,232 +0,0 @@
-// 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.
-
-package com.google.gerrit.acceptance;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.LinkedListMultimap;
-import com.google.common.collect.ListMultimap;
-import com.google.gerrit.common.UserScopedEventListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.registration.RegistrationHandle;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.data.RefUpdateAttribute;
-import com.google.gerrit.server.events.ChangeDeletedEvent;
-import com.google.gerrit.server.events.ChangeMergedEvent;
-import com.google.gerrit.server.events.Event;
-import com.google.gerrit.server.events.RefEvent;
-import com.google.gerrit.server.events.RefUpdatedEvent;
-import com.google.gerrit.server.events.ReviewerDeletedEvent;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.revwalk.RevCommit;
-
-public class EventRecorder {
-  private final RegistrationHandle eventListenerRegistration;
-  private final ListMultimap<String, RefEvent> recordedEvents;
-
-  @Singleton
-  public static class Factory {
-    private final DynamicSet<UserScopedEventListener> eventListeners;
-    private final IdentifiedUser.GenericFactory userFactory;
-
-    @Inject
-    Factory(
-        DynamicSet<UserScopedEventListener> eventListeners,
-        IdentifiedUser.GenericFactory userFactory) {
-      this.eventListeners = eventListeners;
-      this.userFactory = userFactory;
-    }
-
-    public EventRecorder create(TestAccount user) {
-      return new EventRecorder(eventListeners, userFactory.create(user.id));
-    }
-  }
-
-  public EventRecorder(DynamicSet<UserScopedEventListener> eventListeners, IdentifiedUser user) {
-    recordedEvents = LinkedListMultimap.create();
-
-    eventListenerRegistration =
-        eventListeners.add(
-            new UserScopedEventListener() {
-              @Override
-              public void onEvent(Event e) {
-                if (e instanceof ReviewerDeletedEvent) {
-                  recordedEvents.put(ReviewerDeletedEvent.TYPE, (ReviewerDeletedEvent) e);
-                } else if (e instanceof ChangeDeletedEvent) {
-                  recordedEvents.put(ChangeDeletedEvent.TYPE, (ChangeDeletedEvent) e);
-                } else if (e instanceof RefEvent) {
-                  RefEvent event = (RefEvent) e;
-                  String key =
-                      refEventKey(
-                          event.getType(), event.getProjectNameKey().get(), event.getRefName());
-                  recordedEvents.put(key, event);
-                }
-              }
-
-              @Override
-              public CurrentUser getUser() {
-                return user;
-              }
-            });
-  }
-
-  private static String refEventKey(String type, String project, String ref) {
-    return String.format("%s-%s-%s", type, project, ref);
-  }
-
-  private ImmutableList<RefUpdatedEvent> getRefUpdatedEvents(
-      String project, String refName, int expectedSize) {
-    String key = refEventKey(RefUpdatedEvent.TYPE, project, refName);
-    if (expectedSize == 0) {
-      assertThat(recordedEvents).doesNotContainKey(key);
-      return ImmutableList.of();
-    }
-
-    assertThat(recordedEvents).containsKey(key);
-    ImmutableList<RefUpdatedEvent> events =
-        FluentIterable.from(recordedEvents.get(key))
-            .transform(RefUpdatedEvent.class::cast)
-            .toList();
-    assertThat(events).hasSize(expectedSize);
-    return events;
-  }
-
-  private ImmutableList<ChangeMergedEvent> getChangeMergedEvents(
-      String project, String branch, int expectedSize) {
-    String key = refEventKey(ChangeMergedEvent.TYPE, project, branch);
-    if (expectedSize == 0) {
-      assertThat(recordedEvents).doesNotContainKey(key);
-      return ImmutableList.of();
-    }
-
-    assertThat(recordedEvents).containsKey(key);
-    ImmutableList<ChangeMergedEvent> events =
-        FluentIterable.from(recordedEvents.get(key))
-            .transform(ChangeMergedEvent.class::cast)
-            .toList();
-    assertThat(events).hasSize(expectedSize);
-    return events;
-  }
-
-  private ImmutableList<ReviewerDeletedEvent> getReviewerDeletedEvents(int expectedSize) {
-    String key = ReviewerDeletedEvent.TYPE;
-    if (expectedSize == 0) {
-      assertThat(recordedEvents).doesNotContainKey(key);
-      return ImmutableList.of();
-    }
-    assertThat(recordedEvents).containsKey(key);
-    ImmutableList<ReviewerDeletedEvent> events =
-        FluentIterable.from(recordedEvents.get(key))
-            .transform(ReviewerDeletedEvent.class::cast)
-            .toList();
-    assertThat(events).hasSize(expectedSize);
-    return events;
-  }
-
-  private ImmutableList<ChangeDeletedEvent> getChangeDeletedEvents(int expectedSize) {
-    String key = ChangeDeletedEvent.TYPE;
-    if (expectedSize == 0) {
-      assertThat(recordedEvents).doesNotContainKey(key);
-      return ImmutableList.of();
-    }
-    assertThat(recordedEvents).containsKey(key);
-    ImmutableList<ChangeDeletedEvent> events =
-        FluentIterable.from(recordedEvents.get(key))
-            .transform(ChangeDeletedEvent.class::cast)
-            .toList();
-    assertThat(events).hasSize(expectedSize);
-    return events;
-  }
-
-  public void assertNoRefUpdatedEvents(String project, String branch) throws Exception {
-    getRefUpdatedEvents(project, branch, 0);
-  }
-
-  public void assertRefUpdatedEvents(String project, String branch, String... expected)
-      throws Exception {
-    ImmutableList<RefUpdatedEvent> events =
-        getRefUpdatedEvents(project, branch, expected.length / 2);
-    int i = 0;
-    for (RefUpdatedEvent event : events) {
-      RefUpdateAttribute actual = event.refUpdate.get();
-      String oldRev = expected[i] == null ? ObjectId.zeroId().name() : expected[i];
-      String newRev = expected[i + 1] == null ? ObjectId.zeroId().name() : expected[i + 1];
-      assertThat(actual.oldRev).isEqualTo(oldRev);
-      assertThat(actual.newRev).isEqualTo(newRev);
-      i += 2;
-    }
-  }
-
-  public void assertRefUpdatedEvents(String project, String branch, RevCommit... expected)
-      throws Exception {
-    ImmutableList<RefUpdatedEvent> events =
-        getRefUpdatedEvents(project, branch, expected.length / 2);
-    int i = 0;
-    for (RefUpdatedEvent event : events) {
-      RefUpdateAttribute actual = event.refUpdate.get();
-      String oldRev = expected[i] == null ? ObjectId.zeroId().name() : expected[i].name();
-      String newRev = expected[i + 1] == null ? ObjectId.zeroId().name() : expected[i + 1].name();
-      assertThat(actual.oldRev).isEqualTo(oldRev);
-      assertThat(actual.newRev).isEqualTo(newRev);
-      i += 2;
-    }
-  }
-
-  public void assertChangeMergedEvents(String project, String branch, String... expected)
-      throws Exception {
-    ImmutableList<ChangeMergedEvent> events =
-        getChangeMergedEvents(project, branch, expected.length / 2);
-    int i = 0;
-    for (ChangeMergedEvent event : events) {
-      String id = event.change.get().id;
-      assertThat(id).isEqualTo(expected[i]);
-      assertThat(event.newRev).isEqualTo(expected[i + 1]);
-      i += 2;
-    }
-  }
-
-  public void assertReviewerDeletedEvents(String... expected) {
-    ImmutableList<ReviewerDeletedEvent> events = getReviewerDeletedEvents(expected.length / 2);
-    int i = 0;
-    for (ReviewerDeletedEvent event : events) {
-      String id = event.change.get().id;
-      assertThat(id).isEqualTo(expected[i]);
-      String reviewer = event.reviewer.get().email;
-      assertThat(reviewer).isEqualTo(expected[i + 1]);
-      i += 2;
-    }
-  }
-
-  public void assertChangeDeletedEvents(String... expected) {
-    ImmutableList<ChangeDeletedEvent> events = getChangeDeletedEvents(expected.length / 2);
-    int i = 0;
-    for (ChangeDeletedEvent event : events) {
-      String id = event.change.get().id;
-      assertThat(id).isEqualTo(expected[i]);
-      String reviewer = event.deleter.get().email;
-      assertThat(reviewer).isEqualTo(expected[i + 1]);
-      i += 2;
-    }
-  }
-
-  public void close() {
-    eventListenerRegistration.remove();
-  }
-}
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/GerritServer.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/GerritServer.java
deleted file mode 100644
index eafffca..0000000
--- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/GerritServer.java
+++ /dev/null
@@ -1,515 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.acceptance;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.config.FactoryModule;
-import com.google.gerrit.lucene.LuceneIndexModule;
-import com.google.gerrit.pgm.Daemon;
-import com.google.gerrit.pgm.Init;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.git.receive.AsyncReceiveCommits;
-import com.google.gerrit.server.ssh.NoSshModule;
-import com.google.gerrit.server.util.ManualRequestContext;
-import com.google.gerrit.server.util.OneOffRequestContext;
-import com.google.gerrit.server.util.SocketUtil;
-import com.google.gerrit.server.util.SystemLog;
-import com.google.gerrit.testutil.FakeEmailSender;
-import com.google.gerrit.testutil.NoteDbChecker;
-import com.google.gerrit.testutil.NoteDbMode;
-import com.google.gerrit.testutil.SshMode;
-import com.google.gerrit.testutil.TempFileUtil;
-import com.google.inject.Injector;
-import com.google.inject.Key;
-import com.google.inject.Module;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Field;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.URI;
-import java.nio.file.Path;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-import java.util.concurrent.BrokenBarrierException;
-import java.util.concurrent.CyclicBarrier;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Stream;
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.RepositoryCache;
-import org.eclipse.jgit.util.FS;
-
-public class GerritServer implements AutoCloseable {
-  public static class StartupException extends Exception {
-    private static final long serialVersionUID = 1L;
-
-    StartupException(String msg, Throwable cause) {
-      super(msg, cause);
-    }
-  }
-
-  @AutoValue
-  public abstract static class Description {
-    public static Description forTestClass(
-        org.junit.runner.Description testDesc, String configName) {
-      return new AutoValue_GerritServer_Description(
-          testDesc,
-          configName,
-          !has(UseLocalDisk.class, testDesc.getTestClass()) && !forceLocalDisk(),
-          !has(NoHttpd.class, testDesc.getTestClass()),
-          has(Sandboxed.class, testDesc.getTestClass()),
-          has(UseSsh.class, testDesc.getTestClass()),
-          null, // @GerritConfig is only valid on methods.
-          null, // @GerritConfigs is only valid on methods.
-          null, // @GlobalPluginConfig is only valid on methods.
-          null); // @GlobalPluginConfigs is only valid on methods.
-    }
-
-    public static Description forTestMethod(
-        org.junit.runner.Description testDesc, String configName) {
-      return new AutoValue_GerritServer_Description(
-          testDesc,
-          configName,
-          (testDesc.getAnnotation(UseLocalDisk.class) == null
-                  && !has(UseLocalDisk.class, testDesc.getTestClass()))
-              && !forceLocalDisk(),
-          testDesc.getAnnotation(NoHttpd.class) == null
-              && !has(NoHttpd.class, testDesc.getTestClass()),
-          testDesc.getAnnotation(Sandboxed.class) != null
-              || has(Sandboxed.class, testDesc.getTestClass()),
-          testDesc.getAnnotation(UseSsh.class) != null
-              || has(UseSsh.class, testDesc.getTestClass()),
-          testDesc.getAnnotation(GerritConfig.class),
-          testDesc.getAnnotation(GerritConfigs.class),
-          testDesc.getAnnotation(GlobalPluginConfig.class),
-          testDesc.getAnnotation(GlobalPluginConfigs.class));
-    }
-
-    private static boolean has(Class<? extends Annotation> annotation, Class<?> clazz) {
-      for (; clazz != null; clazz = clazz.getSuperclass()) {
-        if (clazz.getAnnotation(annotation) != null) {
-          return true;
-        }
-      }
-      return false;
-    }
-
-    abstract org.junit.runner.Description testDescription();
-
-    @Nullable
-    abstract String configName();
-
-    abstract boolean memory();
-
-    abstract boolean httpd();
-
-    abstract boolean sandboxed();
-
-    abstract boolean useSshAnnotation();
-
-    boolean useSsh() {
-      return useSshAnnotation() && SshMode.useSsh();
-    }
-
-    @Nullable
-    abstract GerritConfig config();
-
-    @Nullable
-    abstract GerritConfigs configs();
-
-    @Nullable
-    abstract GlobalPluginConfig pluginConfig();
-
-    @Nullable
-    abstract GlobalPluginConfigs pluginConfigs();
-
-    private void checkValidAnnotations() {
-      if (configs() != null && config() != null) {
-        throw new IllegalStateException("Use either @GerritConfigs or @GerritConfig not both");
-      }
-      if (pluginConfigs() != null && pluginConfig() != null) {
-        throw new IllegalStateException(
-            "Use either @GlobalPluginConfig or @GlobalPluginConfigs not both");
-      }
-      if ((pluginConfigs() != null || pluginConfig() != null) && memory()) {
-        throw new IllegalStateException("Must use @UseLocalDisk with @GlobalPluginConfig(s)");
-      }
-    }
-
-    private Config buildConfig(Config baseConfig) {
-      if (configs() != null) {
-        return ConfigAnnotationParser.parse(baseConfig, configs());
-      } else if (config() != null) {
-        return ConfigAnnotationParser.parse(baseConfig, config());
-      } else {
-        return baseConfig;
-      }
-    }
-
-    private Map<String, Config> buildPluginConfigs() {
-      if (pluginConfigs() != null) {
-        return ConfigAnnotationParser.parse(pluginConfigs());
-      } else if (pluginConfig() != null) {
-        return ConfigAnnotationParser.parse(pluginConfig());
-      }
-      return new HashMap<>();
-    }
-  }
-
-  private static boolean forceLocalDisk() {
-    String value = Strings.nullToEmpty(System.getenv("GERRIT_FORCE_LOCAL_DISK"));
-    if (value.isEmpty()) {
-      value = Strings.nullToEmpty(System.getProperty("gerrit.forceLocalDisk"));
-    }
-    switch (value.trim().toLowerCase(Locale.US)) {
-      case "1":
-      case "yes":
-      case "true":
-        return true;
-      default:
-        return false;
-    }
-  }
-
-  /**
-   * Initializes on-disk site but does not start server.
-   *
-   * @param desc server description
-   * @param baseConfig default config values; merged with config from {@code desc} and then written
-   *     into {@code site/etc/gerrit.config}.
-   * @param site temp directory where site will live.
-   * @throws Exception
-   */
-  public static void init(Description desc, Config baseConfig, Path site) throws Exception {
-    checkArgument(!desc.memory(), "can't initialize site path for in-memory test: %s", desc);
-    Config cfg = desc.buildConfig(baseConfig);
-    Map<String, Config> pluginConfigs = desc.buildPluginConfigs();
-
-    MergeableFileBasedConfig gerritConfig =
-        new MergeableFileBasedConfig(
-            site.resolve("etc").resolve("gerrit.config").toFile(), FS.DETECTED);
-    gerritConfig.load();
-    gerritConfig.merge(cfg);
-    mergeTestConfig(gerritConfig);
-    gerritConfig.save();
-
-    Init init = new Init();
-    int rc =
-        init.main(
-            new String[] {
-              "-d", site.toString(), "--batch", "--no-auto-start", "--skip-plugins",
-            });
-    if (rc != 0) {
-      throw new RuntimeException("Couldn't initialize site");
-    }
-
-    for (String pluginName : pluginConfigs.keySet()) {
-      MergeableFileBasedConfig pluginCfg =
-          new MergeableFileBasedConfig(
-              site.resolve("etc").resolve(pluginName + ".config").toFile(), FS.DETECTED);
-      pluginCfg.load();
-      pluginCfg.merge(pluginConfigs.get(pluginName));
-      pluginCfg.save();
-    }
-  }
-
-  /**
-   * Initializes new Gerrit site and returns started server.
-   *
-   * <p>A new temporary directory for the site will be created with {@link TempFileUtil}, even in
-   * the server is otherwise configured in-memory. Closing the server stops the daemon but does not
-   * delete the temporary directory. Callers may either get the directory with {@link
-   * #getSitePath()} and delete it manually, or call {@link TempFileUtil#cleanup()}.
-   *
-   * @param desc server description.
-   * @param baseConfig default config values; merged with config from {@code desc}.
-   * @return started server.
-   * @throws Exception
-   */
-  public static GerritServer initAndStart(
-      Description desc, Config baseConfig, @Nullable Module testSysModule) throws Exception {
-    Path site = TempFileUtil.createTempDirectory().toPath();
-    try {
-      if (!desc.memory()) {
-        init(desc, baseConfig, site);
-      }
-      return start(desc, baseConfig, site, testSysModule);
-    } catch (Exception e) {
-      TempFileUtil.recursivelyDelete(site.toFile());
-      throw e;
-    }
-  }
-
-  /**
-   * Starts Gerrit server from existing on-disk site.
-   *
-   * @param desc server description.
-   * @param baseConfig default config values; merged with config from {@code desc}.
-   * @param site existing temporary directory for site. Required, but may be empty, for in-memory
-   *     servers. For on-disk servers, assumes that {@link #init} was previously called to
-   *     initialize this directory. Can be retrieved from the returned instance via {@link
-   *     #getSitePath()}.
-   * @param testSysModule optional additional module to add to the system injector.
-   * @param additionalArgs additional command-line arguments for the daemon program; only allowed if
-   *     the test is not in-memory.
-   * @return started server.
-   * @throws Exception
-   */
-  public static GerritServer start(
-      Description desc,
-      Config baseConfig,
-      Path site,
-      @Nullable Module testSysModule,
-      String... additionalArgs)
-      throws Exception {
-    checkArgument(site != null, "site is required (even for in-memory server");
-    desc.checkValidAnnotations();
-    Logger.getLogger("com.google.gerrit").setLevel(Level.DEBUG);
-    CyclicBarrier serverStarted = new CyclicBarrier(2);
-    Daemon daemon =
-        new Daemon(
-            () -> {
-              try {
-                serverStarted.await();
-              } catch (InterruptedException | BrokenBarrierException e) {
-                throw new RuntimeException(e);
-              }
-            },
-            site);
-    daemon.setEmailModuleForTesting(new FakeEmailSender.Module());
-    daemon.setAdditionalSysModuleForTesting(testSysModule);
-    daemon.setEnableSshd(desc.useSsh());
-
-    if (desc.memory()) {
-      checkArgument(additionalArgs.length == 0, "cannot pass args to in-memory server");
-      return startInMemory(desc, site, baseConfig, daemon);
-    }
-    return startOnDisk(desc, site, daemon, serverStarted, additionalArgs);
-  }
-
-  private static GerritServer startInMemory(
-      Description desc, Path site, Config baseConfig, Daemon daemon) throws Exception {
-    Config cfg = desc.buildConfig(baseConfig);
-    mergeTestConfig(cfg);
-    // Set the log4j configuration to an invalid one to prevent system logs
-    // from getting configured and creating log files.
-    System.setProperty(SystemLog.LOG4J_CONFIGURATION, "invalidConfiguration");
-    cfg.setBoolean("httpd", null, "requestLog", false);
-    cfg.setBoolean("sshd", null, "requestLog", false);
-    cfg.setBoolean("index", "lucene", "testInmemory", true);
-    cfg.setBoolean("index", null, "onlineUpgrade", false);
-    cfg.setString("gitweb", null, "cgi", "");
-    daemon.setEnableHttpd(desc.httpd());
-    daemon.setLuceneModule(LuceneIndexModule.singleVersionAllLatest(0));
-    daemon.setDatabaseForTesting(
-        ImmutableList.<Module>of(new InMemoryTestingDatabaseModule(cfg, site)));
-    daemon.start();
-    return new GerritServer(desc, null, createTestInjector(daemon), daemon, null);
-  }
-
-  private static GerritServer startOnDisk(
-      Description desc,
-      Path site,
-      Daemon daemon,
-      CyclicBarrier serverStarted,
-      String[] additionalArgs)
-      throws Exception {
-    checkNotNull(site);
-    ExecutorService daemonService = Executors.newSingleThreadExecutor();
-    String[] args =
-        Stream.concat(
-                Stream.of(
-                    "-d", site.toString(), "--headless", "--console-log", "--show-stack-trace"),
-                Arrays.stream(additionalArgs))
-            .toArray(String[]::new);
-    @SuppressWarnings("unused")
-    Future<?> possiblyIgnoredError =
-        daemonService.submit(
-            () -> {
-              int rc = daemon.main(args);
-              if (rc != 0) {
-                System.err.println("Failed to start Gerrit daemon");
-                serverStarted.reset();
-              }
-              return null;
-            });
-    try {
-      serverStarted.await();
-    } catch (BrokenBarrierException e) {
-      daemon.stop();
-      throw new StartupException("Failed to start Gerrit daemon; see log", e);
-    }
-    System.out.println("Gerrit Server Started");
-
-    return new GerritServer(desc, site, createTestInjector(daemon), daemon, daemonService);
-  }
-
-  private static void mergeTestConfig(Config cfg) {
-    String forceEphemeralPort = String.format("%s:0", getLocalHost().getHostName());
-    String url = "http://" + forceEphemeralPort + "/";
-    cfg.setString("gerrit", null, "canonicalWebUrl", url);
-    cfg.setString("httpd", null, "listenUrl", url);
-    cfg.setString("sshd", null, "listenAddress", forceEphemeralPort);
-    cfg.setBoolean("sshd", null, "testUseInsecureRandom", true);
-    cfg.unset("cache", null, "directory");
-    cfg.setString("gerrit", null, "basePath", "git");
-    cfg.setBoolean("sendemail", null, "enable", true);
-    cfg.setInt("sendemail", null, "threadPoolSize", 0);
-    cfg.setInt("cache", "projects", "checkFrequency", 0);
-    cfg.setInt("plugins", null, "checkFrequency", 0);
-
-    cfg.setInt("sshd", null, "threads", 1);
-    cfg.setInt("sshd", null, "commandStartThreads", 1);
-    cfg.setInt("receive", null, "threadPoolSize", 1);
-    cfg.setInt("index", null, "threads", 1);
-    cfg.setBoolean("index", null, "reindexAfterRefUpdate", false);
-
-    NoteDbMode.newNotesMigrationFromEnv().setConfigValues(cfg);
-  }
-
-  private static Injector createTestInjector(Daemon daemon) throws Exception {
-    Injector sysInjector = get(daemon, "sysInjector");
-    Module module =
-        new FactoryModule() {
-          @Override
-          protected void configure() {
-            bindConstant().annotatedWith(SshEnabled.class).to(daemon.getEnableSshd());
-            bind(AccountCreator.class);
-            factory(PushOneCommit.Factory.class);
-            install(InProcessProtocol.module());
-            install(new NoSshModule());
-            install(new AsyncReceiveCommits.Module());
-          }
-        };
-    return sysInjector.createChildInjector(module);
-  }
-
-  @SuppressWarnings("unchecked")
-  private static <T> T get(Object obj, String field)
-      throws SecurityException, NoSuchFieldException, IllegalArgumentException,
-          IllegalAccessException {
-    Field f = obj.getClass().getDeclaredField(field);
-    f.setAccessible(true);
-    return (T) f.get(obj);
-  }
-
-  private static InetAddress getLocalHost() {
-    return InetAddress.getLoopbackAddress();
-  }
-
-  private final Description desc;
-  private final Path sitePath;
-
-  private Daemon daemon;
-  private ExecutorService daemonService;
-  private Injector testInjector;
-  private String url;
-  private InetSocketAddress sshdAddress;
-  private InetSocketAddress httpAddress;
-
-  private GerritServer(
-      Description desc,
-      @Nullable Path sitePath,
-      Injector testInjector,
-      Daemon daemon,
-      @Nullable ExecutorService daemonService) {
-    this.desc = checkNotNull(desc);
-    this.sitePath = sitePath;
-    this.testInjector = checkNotNull(testInjector);
-    this.daemon = checkNotNull(daemon);
-    this.daemonService = daemonService;
-
-    Config cfg = testInjector.getInstance(Key.get(Config.class, GerritServerConfig.class));
-    url = cfg.getString("gerrit", null, "canonicalWebUrl");
-    URI uri = URI.create(url);
-
-    sshdAddress = SocketUtil.resolve(cfg.getString("sshd", null, "listenAddress"), 0);
-    httpAddress = new InetSocketAddress(uri.getHost(), uri.getPort());
-  }
-
-  String getUrl() {
-    return url;
-  }
-
-  InetSocketAddress getSshdAddress() {
-    return sshdAddress;
-  }
-
-  InetSocketAddress getHttpAddress() {
-    return httpAddress;
-  }
-
-  public Injector getTestInjector() {
-    return testInjector;
-  }
-
-  Description getDescription() {
-    return desc;
-  }
-
-  @Override
-  public void close() throws Exception {
-    try {
-      checkNoteDbState();
-    } finally {
-      daemon.getLifecycleManager().stop();
-      if (daemonService != null) {
-        System.out.println("Gerrit Server Shutdown");
-        daemonService.shutdownNow();
-        daemonService.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
-      }
-      RepositoryCache.clear();
-    }
-  }
-
-  public Path getSitePath() {
-    return sitePath;
-  }
-
-  private void checkNoteDbState() throws Exception {
-    NoteDbMode mode = NoteDbMode.get();
-    if (mode != NoteDbMode.CHECK && mode != NoteDbMode.PRIMARY) {
-      return;
-    }
-    NoteDbChecker checker = testInjector.getInstance(NoteDbChecker.class);
-    OneOffRequestContext oneOffRequestContext =
-        testInjector.getInstance(OneOffRequestContext.class);
-    try (ManualRequestContext ctx = oneOffRequestContext.open()) {
-      if (mode == NoteDbMode.CHECK) {
-        checker.rebuildAndCheckAllChanges();
-      } else if (mode == NoteDbMode.PRIMARY) {
-        checker.assertNoReviewDbChanges(desc.testDescription());
-      }
-    }
-  }
-
-  @Override
-  public String toString() {
-    return MoreObjects.toStringHelper(this).addValue(desc).toString();
-  }
-}
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/GitUtil.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/GitUtil.java
deleted file mode 100644
index c9a474f..0000000
--- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/GitUtil.java
+++ /dev/null
@@ -1,238 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.acceptance;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.primitives.Ints;
-import com.google.gerrit.common.FooterConstants;
-import com.google.gerrit.reviewdb.client.Project;
-import com.jcraft.jsch.JSch;
-import com.jcraft.jsch.JSchException;
-import com.jcraft.jsch.Session;
-import java.io.IOException;
-import java.util.List;
-import java.util.Optional;
-import java.util.Properties;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-import org.eclipse.jgit.api.FetchCommand;
-import org.eclipse.jgit.api.PushCommand;
-import org.eclipse.jgit.api.TagCommand;
-import org.eclipse.jgit.api.errors.GitAPIException;
-import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
-import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.transport.FetchResult;
-import org.eclipse.jgit.transport.JschConfigSessionFactory;
-import org.eclipse.jgit.transport.OpenSshConfig.Host;
-import org.eclipse.jgit.transport.PushResult;
-import org.eclipse.jgit.transport.RefSpec;
-import org.eclipse.jgit.transport.RemoteRefUpdate;
-import org.eclipse.jgit.transport.SshSessionFactory;
-import org.eclipse.jgit.util.FS;
-
-public class GitUtil {
-  private static final AtomicInteger testRepoCount = new AtomicInteger();
-  private static final int TEST_REPO_WINDOW_DAYS = 2;
-
-  public static void initSsh(TestAccount a) {
-    final Properties config = new Properties();
-    config.put("StrictHostKeyChecking", "no");
-    JSch.setConfig(config);
-
-    // register a JschConfigSessionFactory that adds the private key as identity
-    // to the JSch instance of JGit so that SSH communication via JGit can
-    // succeed
-    SshSessionFactory.setInstance(
-        new JschConfigSessionFactory() {
-          @Override
-          protected void configure(Host hc, Session session) {
-            try {
-              final JSch jsch = getJSch(hc, FS.DETECTED);
-              jsch.addIdentity("KeyPair", a.privateKey(), a.sshKey.getPublicKeyBlob(), null);
-            } catch (JSchException e) {
-              throw new RuntimeException(e);
-            }
-          }
-        });
-  }
-
-  /**
-   * Create a new {@link TestRepository} with a distinct commit clock.
-   *
-   * <p>It is very easy for tests to create commits with identical subjects and trees; if such
-   * commits also have identical authors/committers, then the computed Change-Id is identical as
-   * well. Tests may generally assume that Change-Ids are unique, so to ensure this, we provision
-   * TestRepository instances with non-overlapping commit clock times.
-   *
-   * <p>Space test repos 1 day apart, which allows for about 86k ticks per repo before overlapping,
-   * and about 8k instances per process before hitting JGit's year 2038 limit.
-   *
-   * @param repo repository to wrap.
-   * @return wrapped test repository with distinct commit time space.
-   */
-  public static <R extends Repository> TestRepository<R> newTestRepository(R repo)
-      throws IOException {
-    TestRepository<R> tr = new TestRepository<>(repo);
-    tr.tick(
-        Ints.checkedCast(
-            TimeUnit.SECONDS.convert(
-                testRepoCount.getAndIncrement() * TEST_REPO_WINDOW_DAYS, TimeUnit.DAYS)));
-    return tr;
-  }
-
-  public static TestRepository<InMemoryRepository> cloneProject(Project.NameKey project, String uri)
-      throws Exception {
-    DfsRepositoryDescription desc = new DfsRepositoryDescription("clone of " + project.get());
-
-    FS fs = FS.detect();
-
-    // Avoid leaking user state into our tests.
-    fs.setUserHome(null);
-
-    InMemoryRepository dest =
-        new InMemoryRepository.Builder()
-            .setRepositoryDescription(desc)
-            // SshTransport depends on a real FS to read ~/.ssh/config, but
-            // InMemoryRepository by default uses a null FS.
-            // TODO(dborowitz): Remove when we no longer depend on SSH.
-            .setFS(fs)
-            .build();
-    Config cfg = dest.getConfig();
-    cfg.setString("remote", "origin", "url", uri);
-    cfg.setString("remote", "origin", "fetch", "+refs/heads/*:refs/remotes/origin/*");
-    TestRepository<InMemoryRepository> testRepo = newTestRepository(dest);
-    FetchResult result = testRepo.git().fetch().setRemote("origin").call();
-    String originMaster = "refs/remotes/origin/master";
-    if (result.getTrackingRefUpdate(originMaster) != null) {
-      testRepo.reset(originMaster);
-    }
-    return testRepo;
-  }
-
-  public static TestRepository<InMemoryRepository> cloneProject(
-      Project.NameKey project, SshSession sshSession) throws Exception {
-    return cloneProject(project, sshSession.getUrl() + "/" + project.get());
-  }
-
-  public static Ref createAnnotatedTag(TestRepository<?> testRepo, String name, PersonIdent tagger)
-      throws GitAPIException {
-    TagCommand cmd =
-        testRepo.git().tag().setName(name).setAnnotated(true).setMessage(name).setTagger(tagger);
-    return cmd.call();
-  }
-
-  public static Ref updateAnnotatedTag(TestRepository<?> testRepo, String name, PersonIdent tagger)
-      throws GitAPIException {
-    TagCommand tc = testRepo.git().tag().setName(name);
-    return tc.setAnnotated(true).setMessage(name).setTagger(tagger).setForceUpdate(true).call();
-  }
-
-  public static void fetch(TestRepository<?> testRepo, String spec) throws GitAPIException {
-    FetchCommand fetch = testRepo.git().fetch();
-    fetch.setRefSpecs(new RefSpec(spec));
-    fetch.call();
-  }
-
-  public static PushResult pushHead(TestRepository<?> testRepo, String ref) throws GitAPIException {
-    return pushHead(testRepo, ref, false);
-  }
-
-  public static PushResult pushHead(TestRepository<?> testRepo, String ref, boolean pushTags)
-      throws GitAPIException {
-    return pushHead(testRepo, ref, pushTags, false);
-  }
-
-  public static PushResult pushHead(
-      TestRepository<?> testRepo, String ref, boolean pushTags, boolean force)
-      throws GitAPIException {
-    return pushOne(testRepo, "HEAD", ref, pushTags, force, null);
-  }
-
-  public static PushResult pushHead(
-      TestRepository<?> testRepo,
-      String ref,
-      boolean pushTags,
-      boolean force,
-      List<String> pushOptions)
-      throws GitAPIException {
-    return pushOne(testRepo, "HEAD", ref, pushTags, force, pushOptions);
-  }
-
-  public static PushResult deleteRef(TestRepository<?> testRepo, String ref)
-      throws GitAPIException {
-    return pushOne(testRepo, "", ref, false, true, null);
-  }
-
-  public static PushResult pushOne(
-      TestRepository<?> testRepo,
-      String source,
-      String target,
-      boolean pushTags,
-      boolean force,
-      List<String> pushOptions)
-      throws GitAPIException {
-    PushCommand pushCmd = testRepo.git().push();
-    pushCmd.setForce(force);
-    pushCmd.setPushOptions(pushOptions);
-    pushCmd.setRefSpecs(new RefSpec(source + ":" + target));
-    if (pushTags) {
-      pushCmd.setPushTags();
-    }
-    Iterable<PushResult> r = pushCmd.call();
-    return Iterables.getOnlyElement(r);
-  }
-
-  public static void assertPushOk(PushResult result, String ref) {
-    RemoteRefUpdate rru = result.getRemoteUpdate(ref);
-    assertThat(rru.getStatus()).named(rru.toString()).isEqualTo(RemoteRefUpdate.Status.OK);
-  }
-
-  public static void assertPushRejected(PushResult result, String ref, String expectedMessage) {
-    RemoteRefUpdate rru = result.getRemoteUpdate(ref);
-    assertThat(rru.getStatus())
-        .named(rru.toString())
-        .isEqualTo(RemoteRefUpdate.Status.REJECTED_OTHER_REASON);
-    assertThat(rru.getMessage()).isEqualTo(expectedMessage);
-  }
-
-  public static PushResult pushTag(TestRepository<?> testRepo, String tag) throws GitAPIException {
-    return pushTag(testRepo, tag, false);
-  }
-
-  public static PushResult pushTag(TestRepository<?> testRepo, String tag, boolean force)
-      throws GitAPIException {
-    PushCommand pushCmd = testRepo.git().push();
-    pushCmd.setForce(force);
-    pushCmd.setRefSpecs(new RefSpec("refs/tags/" + tag + ":refs/tags/" + tag));
-    Iterable<PushResult> r = pushCmd.call();
-    return Iterables.getOnlyElement(r);
-  }
-
-  public static Optional<String> getChangeId(TestRepository<?> tr, ObjectId id) throws IOException {
-    RevCommit c = tr.getRevWalk().parseCommit(id);
-    tr.getRevWalk().parseBody(c);
-    return Lists.reverse(c.getFooterLines(FooterConstants.CHANGE_ID)).stream().findFirst();
-  }
-}
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/HttpResponse.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/HttpResponse.java
deleted file mode 100644
index 6c03793..0000000
--- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/HttpResponse.java
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.acceptance;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.base.Preconditions;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.nio.ByteBuffer;
-import org.apache.http.Header;
-import org.eclipse.jgit.util.IO;
-import org.eclipse.jgit.util.RawParseUtils;
-
-public class HttpResponse {
-
-  protected org.apache.http.HttpResponse response;
-  protected Reader reader;
-
-  HttpResponse(org.apache.http.HttpResponse response) {
-    this.response = response;
-  }
-
-  public Reader getReader() throws IllegalStateException, IOException {
-    if (reader == null && response.getEntity() != null) {
-      reader = new InputStreamReader(response.getEntity().getContent(), UTF_8);
-    }
-    return reader;
-  }
-
-  public void consume() throws IllegalStateException, IOException {
-    Reader reader = getReader();
-    if (reader != null) {
-      while (reader.read() != -1) {}
-    }
-  }
-
-  public int getStatusCode() {
-    return response.getStatusLine().getStatusCode();
-  }
-
-  public String getContentType() {
-    return getHeader("X-FYI-Content-Type");
-  }
-
-  public String getHeader(String name) {
-    Header hdr = response.getFirstHeader(name);
-    return hdr != null ? hdr.getValue() : null;
-  }
-
-  public boolean hasContent() {
-    Preconditions.checkNotNull(response, "Response is not initialized.");
-    return response.getEntity() != null;
-  }
-
-  public String getEntityContent() throws IOException {
-    Preconditions.checkNotNull(response, "Response is not initialized.");
-    Preconditions.checkNotNull(response.getEntity(), "Response.Entity is not initialized.");
-    ByteBuffer buf = IO.readWholeStream(response.getEntity().getContent(), 1024);
-    return RawParseUtils.decode(buf.array(), buf.arrayOffset(), buf.limit()).trim();
-  }
-}
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/InMemoryTestingDatabaseModule.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/InMemoryTestingDatabaseModule.java
deleted file mode 100644
index 0f30fa2..0000000
--- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/InMemoryTestingDatabaseModule.java
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.acceptance;
-
-import static com.google.inject.Scopes.SINGLETON;
-
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.gerrit.lifecycle.LifecycleModule;
-import com.google.gerrit.metrics.DisabledMetricMaker;
-import com.google.gerrit.metrics.MetricMaker;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.SitePath;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.config.TrackingFooters;
-import com.google.gerrit.server.config.TrackingFootersProvider;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.notedb.ChangeBundleReader;
-import com.google.gerrit.server.notedb.GwtormChangeBundleReader;
-import com.google.gerrit.server.notedb.NotesMigration;
-import com.google.gerrit.server.schema.DataSourceType;
-import com.google.gerrit.server.schema.NotesMigrationSchemaFactory;
-import com.google.gerrit.server.schema.ReviewDbFactory;
-import com.google.gerrit.server.schema.SchemaModule;
-import com.google.gerrit.server.schema.SchemaVersion;
-import com.google.gerrit.testutil.InMemoryDatabase;
-import com.google.gerrit.testutil.InMemoryH2Type;
-import com.google.gerrit.testutil.InMemoryRepositoryManager;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.OrmRuntimeException;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Inject;
-import com.google.inject.Key;
-import com.google.inject.Provides;
-import com.google.inject.ProvisionException;
-import com.google.inject.Singleton;
-import com.google.inject.TypeLiteral;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import org.apache.sshd.common.keyprovider.KeyPairProvider;
-import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider;
-import org.eclipse.jgit.lib.Config;
-
-class InMemoryTestingDatabaseModule extends LifecycleModule {
-  private final Config cfg;
-  private final Path sitePath;
-
-  InMemoryTestingDatabaseModule(Config cfg, Path sitePath) {
-    this.cfg = cfg;
-    this.sitePath = sitePath;
-    makeSiteDirs(sitePath);
-  }
-
-  @Override
-  protected void configure() {
-    bind(Config.class).annotatedWith(GerritServerConfig.class).toInstance(cfg);
-
-    // TODO(dborowitz): Use jimfs.
-    bind(Path.class).annotatedWith(SitePath.class).toInstance(sitePath);
-
-    bind(GitRepositoryManager.class).to(InMemoryRepositoryManager.class);
-    bind(InMemoryRepositoryManager.class).in(SINGLETON);
-
-    bind(MetricMaker.class).to(DisabledMetricMaker.class);
-    bind(DataSourceType.class).to(InMemoryH2Type.class);
-
-    install(new NotesMigration.Module());
-    TypeLiteral<SchemaFactory<ReviewDb>> schemaFactory =
-        new TypeLiteral<SchemaFactory<ReviewDb>>() {};
-    bind(schemaFactory).to(NotesMigrationSchemaFactory.class);
-    bind(Key.get(schemaFactory, ReviewDbFactory.class)).to(InMemoryDatabase.class);
-    bind(InMemoryDatabase.class).in(SINGLETON);
-    bind(ChangeBundleReader.class).to(GwtormChangeBundleReader.class);
-
-    listener().to(CreateDatabase.class);
-
-    bind(SitePaths.class);
-    bind(TrackingFooters.class).toProvider(TrackingFootersProvider.class).in(SINGLETON);
-
-    install(new SchemaModule());
-    bind(SchemaVersion.class).to(SchemaVersion.C);
-  }
-
-  @Provides
-  @Singleton
-  KeyPairProvider createHostKey() {
-    return getHostKeys();
-  }
-
-  private static SimpleGeneratorHostKeyProvider keys;
-
-  private static synchronized KeyPairProvider getHostKeys() {
-    if (keys == null) {
-      keys = new SimpleGeneratorHostKeyProvider();
-      keys.setAlgorithm("RSA");
-      keys.loadKeys();
-    }
-    return keys;
-  }
-
-  static class CreateDatabase implements LifecycleListener {
-    private final InMemoryDatabase mem;
-
-    @Inject
-    CreateDatabase(InMemoryDatabase mem) {
-      this.mem = mem;
-    }
-
-    @Override
-    public void start() {
-      try {
-        mem.create();
-      } catch (OrmException e) {
-        throw new OrmRuntimeException(e);
-      }
-    }
-
-    @Override
-    public void stop() {
-      mem.drop();
-    }
-  }
-
-  private static void makeSiteDirs(Path p) {
-    try {
-      Files.createDirectories(p.resolve("etc"));
-    } catch (IOException e) {
-      ProvisionException pe = new ProvisionException(e.getMessage());
-      pe.initCause(e);
-      throw pe;
-    }
-  }
-}
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/InProcessProtocol.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/InProcessProtocol.java
deleted file mode 100644
index e2e29c9..0000000
--- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/InProcessProtocol.java
+++ /dev/null
@@ -1,365 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.acceptance;
-
-import com.google.common.collect.ImmutableSetMultimap;
-import com.google.common.collect.Lists;
-import com.google.gerrit.acceptance.InProcessProtocol.Context;
-import com.google.gerrit.common.data.Capable;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.AccessPath;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.RemotePeer;
-import com.google.gerrit.server.RequestCleanup;
-import com.google.gerrit.server.config.GerritRequestModule;
-import com.google.gerrit.server.config.RequestScopedReviewDbProvider;
-import com.google.gerrit.server.git.ReceivePackInitializer;
-import com.google.gerrit.server.git.TransferConfig;
-import com.google.gerrit.server.git.UploadPackInitializer;
-import com.google.gerrit.server.git.VisibleRefFilter;
-import com.google.gerrit.server.git.receive.AsyncReceiveCommits;
-import com.google.gerrit.server.git.validators.UploadValidators;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.ProjectPermission;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.util.RequestContext;
-import com.google.gerrit.server.util.RequestScopePropagator;
-import com.google.gerrit.server.util.ThreadLocalRequestContext;
-import com.google.gerrit.server.util.ThreadLocalRequestScopePropagator;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.AbstractModule;
-import com.google.inject.Inject;
-import com.google.inject.Key;
-import com.google.inject.Module;
-import com.google.inject.OutOfScopeException;
-import com.google.inject.Provider;
-import com.google.inject.Provides;
-import com.google.inject.Scope;
-import com.google.inject.servlet.RequestScoped;
-import com.google.inject.util.Providers;
-import java.io.IOException;
-import java.net.SocketAddress;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.transport.PostReceiveHook;
-import org.eclipse.jgit.transport.PostReceiveHookChain;
-import org.eclipse.jgit.transport.PreUploadHook;
-import org.eclipse.jgit.transport.PreUploadHookChain;
-import org.eclipse.jgit.transport.ReceivePack;
-import org.eclipse.jgit.transport.TestProtocol;
-import org.eclipse.jgit.transport.UploadPack;
-import org.eclipse.jgit.transport.resolver.ReceivePackFactory;
-import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException;
-import org.eclipse.jgit.transport.resolver.UploadPackFactory;
-
-class InProcessProtocol extends TestProtocol<Context> {
-  static Module module() {
-    return new AbstractModule() {
-      @Override
-      public void configure() {
-        install(new GerritRequestModule());
-        bind(RequestScopePropagator.class).to(Propagator.class);
-        bindScope(RequestScoped.class, InProcessProtocol.REQUEST);
-      }
-
-      @Provides
-      @RemotePeer
-      SocketAddress getSocketAddress() {
-        // TODO(dborowitz): Could potentially fake this with thread ID or
-        // something.
-        throw new OutOfScopeException("No remote peer in acceptance tests");
-      }
-    };
-  }
-
-  private static final Scope REQUEST =
-      new Scope() {
-        @Override
-        public <T> Provider<T> scope(Key<T> key, Provider<T> creator) {
-          return new Provider<T>() {
-            @Override
-            public T get() {
-              Context ctx = current.get();
-              if (ctx == null) {
-                throw new OutOfScopeException("Not in TestProtocol scope");
-              }
-              return ctx.get(key, creator);
-            }
-
-            @Override
-            public String toString() {
-              return String.format("%s[%s]", creator, REQUEST);
-            }
-          };
-        }
-
-        @Override
-        public String toString() {
-          return "InProcessProtocol.REQUEST";
-        }
-      };
-
-  private static class Propagator extends ThreadLocalRequestScopePropagator<Context> {
-    @Inject
-    Propagator(
-        ThreadLocalRequestContext local,
-        Provider<RequestScopedReviewDbProvider> dbProviderProvider) {
-      super(REQUEST, current, local, dbProviderProvider);
-    }
-
-    @Override
-    protected Context continuingContext(Context ctx) {
-      return ctx.newContinuingContext();
-    }
-  }
-
-  private static final ThreadLocal<Context> current = new ThreadLocal<>();
-
-  // TODO(dborowitz): Merge this with AcceptanceTestRequestScope.
-  /**
-   * Multi-purpose session/context object.
-   *
-   * <p>Confusingly, Gerrit has two ideas of what a "context" object is: one for Guice {@link
-   * RequestScoped}, and one for its own simplified version of request scoping using {@link
-   * ThreadLocalRequestContext}. This class provides both, in essence just delegating the {@code
-   * ThreadLocalRequestContext} scoping to the Guice scoping mechanism.
-   *
-   * <p>It is also used as the session type for {@code UploadPackFactory} and {@code
-   * ReceivePackFactory}, since, after all, it encapsulates all the information about a single
-   * request.
-   */
-  static class Context implements RequestContext {
-    private static final Key<RequestScopedReviewDbProvider> DB_KEY =
-        Key.get(RequestScopedReviewDbProvider.class);
-    private static final Key<RequestCleanup> RC_KEY = Key.get(RequestCleanup.class);
-    private static final Key<CurrentUser> USER_KEY = Key.get(CurrentUser.class);
-
-    private final SchemaFactory<ReviewDb> schemaFactory;
-    private final IdentifiedUser.GenericFactory userFactory;
-    private final Account.Id accountId;
-    private final Project.NameKey project;
-    private final RequestCleanup cleanup;
-    private final Map<Key<?>, Object> map;
-
-    Context(
-        SchemaFactory<ReviewDb> schemaFactory,
-        IdentifiedUser.GenericFactory userFactory,
-        Account.Id accountId,
-        Project.NameKey project) {
-      this.schemaFactory = schemaFactory;
-      this.userFactory = userFactory;
-      this.accountId = accountId;
-      this.project = project;
-      map = new HashMap<>();
-      cleanup = new RequestCleanup();
-      map.put(DB_KEY, new RequestScopedReviewDbProvider(schemaFactory, Providers.of(cleanup)));
-      map.put(RC_KEY, cleanup);
-
-      IdentifiedUser user = userFactory.create(accountId);
-      user.setAccessPath(AccessPath.GIT);
-      map.put(USER_KEY, user);
-    }
-
-    private Context newContinuingContext() {
-      return new Context(schemaFactory, userFactory, accountId, project);
-    }
-
-    @Override
-    public CurrentUser getUser() {
-      return get(USER_KEY, null);
-    }
-
-    @Override
-    public Provider<ReviewDb> getReviewDbProvider() {
-      return get(DB_KEY, null);
-    }
-
-    private synchronized <T> T get(Key<T> key, Provider<T> creator) {
-      @SuppressWarnings("unchecked")
-      T t = (T) map.get(key);
-      if (t == null) {
-        t = creator.get();
-        map.put(key, t);
-      }
-      return t;
-    }
-  }
-
-  private static class Upload implements UploadPackFactory<Context> {
-    private final Provider<CurrentUser> userProvider;
-    private final VisibleRefFilter.Factory refFilterFactory;
-    private final TransferConfig transferConfig;
-    private final DynamicSet<UploadPackInitializer> uploadPackInitializers;
-    private final DynamicSet<PreUploadHook> preUploadHooks;
-    private final UploadValidators.Factory uploadValidatorsFactory;
-    private final ThreadLocalRequestContext threadContext;
-    private final ProjectCache projectCache;
-    private final PermissionBackend permissionBackend;
-
-    @Inject
-    Upload(
-        Provider<CurrentUser> userProvider,
-        VisibleRefFilter.Factory refFilterFactory,
-        TransferConfig transferConfig,
-        DynamicSet<UploadPackInitializer> uploadPackInitializers,
-        DynamicSet<PreUploadHook> preUploadHooks,
-        UploadValidators.Factory uploadValidatorsFactory,
-        ThreadLocalRequestContext threadContext,
-        ProjectCache projectCache,
-        PermissionBackend permissionBackend) {
-      this.userProvider = userProvider;
-      this.refFilterFactory = refFilterFactory;
-      this.transferConfig = transferConfig;
-      this.uploadPackInitializers = uploadPackInitializers;
-      this.preUploadHooks = preUploadHooks;
-      this.uploadValidatorsFactory = uploadValidatorsFactory;
-      this.threadContext = threadContext;
-      this.projectCache = projectCache;
-      this.permissionBackend = permissionBackend;
-    }
-
-    @Override
-    public UploadPack create(Context req, Repository repo) throws ServiceNotAuthorizedException {
-      // Set the request context, but don't bother unsetting, since we don't
-      // have an easy way to run code when this instance is done being used.
-      // Each operation is run in its own thread, so we don't need to recover
-      // its original context anyway.
-      threadContext.setContext(req);
-      current.set(req);
-
-      try {
-        permissionBackend
-            .user(userProvider)
-            .project(req.project)
-            .check(ProjectPermission.RUN_UPLOAD_PACK);
-      } catch (AuthException e) {
-        throw new ServiceNotAuthorizedException();
-      } catch (PermissionBackendException e) {
-        throw new RuntimeException(e);
-      }
-
-      ProjectState projectState;
-      try {
-        projectState = projectCache.checkedGet(req.project);
-      } catch (IOException e) {
-        throw new RuntimeException(e);
-      }
-      if (projectState == null) {
-        throw new RuntimeException("can't load project state for " + req.project.get());
-      }
-      UploadPack up = new UploadPack(repo);
-      up.setPackConfig(transferConfig.getPackConfig());
-      up.setTimeout(transferConfig.getTimeout());
-      up.setAdvertiseRefsHook(refFilterFactory.create(projectState, repo));
-      List<PreUploadHook> hooks = Lists.newArrayList(preUploadHooks);
-      hooks.add(uploadValidatorsFactory.create(projectState.getProject(), repo, "localhost-test"));
-      up.setPreUploadHook(PreUploadHookChain.newChain(hooks));
-      for (UploadPackInitializer initializer : uploadPackInitializers) {
-        initializer.init(req.project, up);
-      }
-      return up;
-    }
-  }
-
-  private static class Receive implements ReceivePackFactory<Context> {
-    private final Provider<CurrentUser> userProvider;
-    private final ProjectControl.GenericFactory projectControlFactory;
-    private final AsyncReceiveCommits.Factory factory;
-    private final TransferConfig config;
-    private final DynamicSet<ReceivePackInitializer> receivePackInitializers;
-    private final DynamicSet<PostReceiveHook> postReceiveHooks;
-    private final ThreadLocalRequestContext threadContext;
-    private final PermissionBackend permissionBackend;
-
-    @Inject
-    Receive(
-        Provider<CurrentUser> userProvider,
-        ProjectControl.GenericFactory projectControlFactory,
-        AsyncReceiveCommits.Factory factory,
-        TransferConfig config,
-        DynamicSet<ReceivePackInitializer> receivePackInitializers,
-        DynamicSet<PostReceiveHook> postReceiveHooks,
-        ThreadLocalRequestContext threadContext,
-        PermissionBackend permissionBackend) {
-      this.userProvider = userProvider;
-      this.projectControlFactory = projectControlFactory;
-      this.factory = factory;
-      this.config = config;
-      this.receivePackInitializers = receivePackInitializers;
-      this.postReceiveHooks = postReceiveHooks;
-      this.threadContext = threadContext;
-      this.permissionBackend = permissionBackend;
-    }
-
-    @Override
-    public ReceivePack create(Context req, Repository db) throws ServiceNotAuthorizedException {
-      // Set the request context, but don't bother unsetting, since we don't
-      // have an easy way to run code when this instance is done being used.
-      // Each operation is run in its own thread, so we don't need to recover
-      // its original context anyway.
-      threadContext.setContext(req);
-      current.set(req);
-      try {
-        permissionBackend
-            .user(userProvider)
-            .project(req.project)
-            .check(ProjectPermission.RUN_RECEIVE_PACK);
-      } catch (AuthException e) {
-        throw new ServiceNotAuthorizedException();
-      } catch (PermissionBackendException e) {
-        throw new RuntimeException(e);
-      }
-      try {
-        ProjectControl ctl = projectControlFactory.controlFor(req.project, userProvider.get());
-        AsyncReceiveCommits arc = factory.create(ctl, db, null, ImmutableSetMultimap.of());
-        ReceivePack rp = arc.getReceivePack();
-
-        Capable r = arc.canUpload();
-        if (r != Capable.OK) {
-          throw new ServiceNotAuthorizedException();
-        }
-
-        rp.setRefLogIdent(ctl.getUser().asIdentifiedUser().newRefLogIdent());
-        rp.setTimeout(config.getTimeout());
-        rp.setMaxObjectSizeLimit(config.getMaxObjectSizeLimit());
-
-        for (ReceivePackInitializer initializer : receivePackInitializers) {
-          initializer.init(ctl.getProject().getNameKey(), rp);
-        }
-
-        rp.setPostReceiveHook(PostReceiveHookChain.newChain(Lists.newArrayList(postReceiveHooks)));
-        return rp;
-      } catch (NoSuchProjectException | IOException e) {
-        throw new RuntimeException(e);
-      }
-    }
-  }
-
-  @Inject
-  InProcessProtocol(Upload uploadPackFactory, Receive receivePackFactory) {
-    super(uploadPackFactory, receivePackFactory);
-  }
-}
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/LightweightPluginDaemonTest.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/LightweightPluginDaemonTest.java
deleted file mode 100644
index 62cc8ce..0000000
--- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/LightweightPluginDaemonTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-// 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.
-
-package com.google.gerrit.acceptance;
-
-import com.google.gerrit.server.PluginUser;
-import com.google.gerrit.server.plugins.PluginGuiceEnvironment;
-import com.google.gerrit.server.plugins.TestServerPlugin;
-import com.google.inject.Inject;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.rules.TemporaryFolder;
-
-public class LightweightPluginDaemonTest extends AbstractDaemonTest {
-  @Inject private PluginGuiceEnvironment env;
-
-  @Inject private PluginUser.Factory pluginUserFactory;
-
-  @Rule public TemporaryFolder tempDataDir = new TemporaryFolder();
-
-  protected TestServerPlugin plugin;
-
-  @Before
-  public void setUp() throws Exception {
-    TestPlugin testPlugin = getTestPlugin(getClass());
-    String name = testPlugin.name();
-    plugin =
-        new TestServerPlugin(
-            name,
-            canonicalWebUrl.get() + "plugins/" + name,
-            pluginUserFactory.create(name),
-            getClass().getClassLoader(),
-            testPlugin.sysModule(),
-            testPlugin.httpModule(),
-            testPlugin.sshModule(),
-            tempDataDir.getRoot().toPath());
-
-    plugin.start(env);
-    env.onStartPlugin(plugin);
-  }
-
-  @After
-  public void tearDown() {
-    if (plugin != null) {
-      // plugin will be null if the plugin test requires ssh, but the command
-      // line flag says we are running tests without ssh as the assume()
-      // statement in AbstractDaemonTest will prevent the execution of setUp()
-      // in this class
-      plugin.stop(env);
-      env.onStopPlugin(plugin);
-    }
-  }
-
-  private static TestPlugin getTestPlugin(Class<?> clazz) {
-    for (; clazz != null; clazz = clazz.getSuperclass()) {
-      if (clazz.getAnnotation(TestPlugin.class) != null) {
-        return clazz.getAnnotation(TestPlugin.class);
-      }
-    }
-    throw new IllegalStateException("TestPlugin annotation missing");
-  }
-}
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/PushOneCommit.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/PushOneCommit.java
deleted file mode 100644
index 57d39c0..0000000
--- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/PushOneCommit.java
+++ /dev/null
@@ -1,511 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.acceptance;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.GitUtil.pushHead;
-import static java.util.stream.Collectors.toList;
-import static org.junit.Assert.assertEquals;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Sets;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.NotesMigration;
-import com.google.gerrit.server.notedb.ReviewerStateInternal;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.InternalChangeQuery;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import com.google.inject.assistedinject.AssistedInject;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.stream.Stream;
-import org.eclipse.jgit.api.TagCommand;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.transport.PushResult;
-import org.eclipse.jgit.transport.RemoteRefUpdate;
-import org.eclipse.jgit.transport.RemoteRefUpdate.Status;
-
-public class PushOneCommit {
-  public static final String SUBJECT = "test commit";
-  public static final String FILE_NAME = "a.txt";
-  public static final String FILE_CONTENT = "some content";
-  public static final String PATCH_FILE_ONLY =
-      "diff --git a/a.txt b/a.txt\n"
-          + "new file mode 100644\n"
-          + "index 0000000..f0eec86\n"
-          + "--- /dev/null\n"
-          + "+++ b/a.txt\n"
-          + "@@ -0,0 +1 @@\n"
-          + "+some content\n"
-          + "\\ No newline at end of file\n";
-  public static final String PATCH =
-      "From %s Mon Sep 17 00:00:00 2001\n"
-          + "From: Administrator <admin@example.com>\n"
-          + "Date: %s\n"
-          + "Subject: [PATCH] test commit\n"
-          + "\n"
-          + "Change-Id: %s\n"
-          + "---\n"
-          + "\n"
-          + PATCH_FILE_ONLY;
-
-  public interface Factory {
-    PushOneCommit create(ReviewDb db, PersonIdent i, TestRepository<?> testRepo);
-
-    PushOneCommit create(
-        ReviewDb db,
-        PersonIdent i,
-        TestRepository<?> testRepo,
-        @Assisted("changeId") String changeId);
-
-    PushOneCommit create(
-        ReviewDb db,
-        PersonIdent i,
-        TestRepository<?> testRepo,
-        @Assisted("subject") String subject,
-        @Assisted("fileName") String fileName,
-        @Assisted("content") String content);
-
-    PushOneCommit create(
-        ReviewDb db,
-        PersonIdent i,
-        TestRepository<?> testRepo,
-        @Assisted String subject,
-        @Assisted Map<String, String> files);
-
-    PushOneCommit create(
-        ReviewDb db,
-        PersonIdent i,
-        TestRepository<?> testRepo,
-        @Assisted("subject") String subject,
-        @Assisted("fileName") String fileName,
-        @Assisted("content") String content,
-        @Assisted("changeId") String changeId);
-  }
-
-  public static class Tag {
-    public String name;
-
-    public Tag(String name) {
-      this.name = name;
-    }
-  }
-
-  public static class AnnotatedTag extends Tag {
-    public String message;
-    public PersonIdent tagger;
-
-    public AnnotatedTag(String name, String message, PersonIdent tagger) {
-      super(name);
-      this.message = message;
-      this.tagger = tagger;
-    }
-  }
-
-  private static final AtomicInteger CHANGE_ID_COUNTER = new AtomicInteger();
-
-  private static String nextChangeId() {
-    // Tests use a variety of mechanisms for setting temporary timestamps, so we can't guarantee
-    // that the PersonIdent (or any other field used by the Change-Id generator) for any two test
-    // methods in the same acceptance test class are going to be different. But tests generally
-    // assume that Change-Ids are unique unless otherwise specified. So, don't even bother trying to
-    // reuse JGit's Change-Id generator, just do the simplest possible thing and convert a counter
-    // to hex.
-    return String.format("%040x", CHANGE_ID_COUNTER.incrementAndGet());
-  }
-
-  private final ChangeNotes.Factory notesFactory;
-  private final ApprovalsUtil approvalsUtil;
-  private final Provider<InternalChangeQuery> queryProvider;
-  private final NotesMigration notesMigration;
-  private final ReviewDb db;
-  private final TestRepository<?> testRepo;
-
-  private final String subject;
-  private final Map<String, String> files;
-  private String changeId;
-  private Tag tag;
-  private boolean force;
-  private List<String> pushOptions;
-
-  private final TestRepository<?>.CommitBuilder commitBuilder;
-
-  @AssistedInject
-  PushOneCommit(
-      ChangeNotes.Factory notesFactory,
-      ApprovalsUtil approvalsUtil,
-      Provider<InternalChangeQuery> queryProvider,
-      NotesMigration notesMigration,
-      @Assisted ReviewDb db,
-      @Assisted PersonIdent i,
-      @Assisted TestRepository<?> testRepo)
-      throws Exception {
-    this(
-        notesFactory,
-        approvalsUtil,
-        queryProvider,
-        notesMigration,
-        db,
-        i,
-        testRepo,
-        SUBJECT,
-        FILE_NAME,
-        FILE_CONTENT);
-  }
-
-  @AssistedInject
-  PushOneCommit(
-      ChangeNotes.Factory notesFactory,
-      ApprovalsUtil approvalsUtil,
-      Provider<InternalChangeQuery> queryProvider,
-      NotesMigration notesMigration,
-      @Assisted ReviewDb db,
-      @Assisted PersonIdent i,
-      @Assisted TestRepository<?> testRepo,
-      @Assisted("changeId") String changeId)
-      throws Exception {
-    this(
-        notesFactory,
-        approvalsUtil,
-        queryProvider,
-        notesMigration,
-        db,
-        i,
-        testRepo,
-        SUBJECT,
-        FILE_NAME,
-        FILE_CONTENT,
-        changeId);
-  }
-
-  @AssistedInject
-  PushOneCommit(
-      ChangeNotes.Factory notesFactory,
-      ApprovalsUtil approvalsUtil,
-      Provider<InternalChangeQuery> queryProvider,
-      NotesMigration notesMigration,
-      @Assisted ReviewDb db,
-      @Assisted PersonIdent i,
-      @Assisted TestRepository<?> testRepo,
-      @Assisted("subject") String subject,
-      @Assisted("fileName") String fileName,
-      @Assisted("content") String content)
-      throws Exception {
-    this(
-        notesFactory,
-        approvalsUtil,
-        queryProvider,
-        notesMigration,
-        db,
-        i,
-        testRepo,
-        subject,
-        fileName,
-        content,
-        null);
-  }
-
-  @AssistedInject
-  PushOneCommit(
-      ChangeNotes.Factory notesFactory,
-      ApprovalsUtil approvalsUtil,
-      Provider<InternalChangeQuery> queryProvider,
-      NotesMigration notesMigration,
-      @Assisted ReviewDb db,
-      @Assisted PersonIdent i,
-      @Assisted TestRepository<?> testRepo,
-      @Assisted String subject,
-      @Assisted Map<String, String> files)
-      throws Exception {
-    this(
-        notesFactory,
-        approvalsUtil,
-        queryProvider,
-        notesMigration,
-        db,
-        i,
-        testRepo,
-        subject,
-        files,
-        null);
-  }
-
-  @AssistedInject
-  PushOneCommit(
-      ChangeNotes.Factory notesFactory,
-      ApprovalsUtil approvalsUtil,
-      Provider<InternalChangeQuery> queryProvider,
-      NotesMigration notesMigration,
-      @Assisted ReviewDb db,
-      @Assisted PersonIdent i,
-      @Assisted TestRepository<?> testRepo,
-      @Assisted("subject") String subject,
-      @Assisted("fileName") String fileName,
-      @Assisted("content") String content,
-      @Nullable @Assisted("changeId") String changeId)
-      throws Exception {
-    this(
-        notesFactory,
-        approvalsUtil,
-        queryProvider,
-        notesMigration,
-        db,
-        i,
-        testRepo,
-        subject,
-        ImmutableMap.of(fileName, content),
-        changeId);
-  }
-
-  private PushOneCommit(
-      ChangeNotes.Factory notesFactory,
-      ApprovalsUtil approvalsUtil,
-      Provider<InternalChangeQuery> queryProvider,
-      NotesMigration notesMigration,
-      ReviewDb db,
-      PersonIdent i,
-      TestRepository<?> testRepo,
-      String subject,
-      Map<String, String> files,
-      String changeId)
-      throws Exception {
-    this.db = db;
-    this.testRepo = testRepo;
-    this.notesFactory = notesFactory;
-    this.approvalsUtil = approvalsUtil;
-    this.queryProvider = queryProvider;
-    this.notesMigration = notesMigration;
-    this.subject = subject;
-    this.files = files;
-    this.changeId = changeId;
-    if (changeId != null) {
-      commitBuilder = testRepo.amendRef("HEAD").insertChangeId(changeId.substring(1));
-    } else {
-      commitBuilder = testRepo.branch("HEAD").commit().insertChangeId(nextChangeId());
-    }
-    commitBuilder.message(subject).author(i).committer(new PersonIdent(i, testRepo.getDate()));
-  }
-
-  public void setParents(List<RevCommit> parents) throws Exception {
-    commitBuilder.noParents();
-    for (RevCommit p : parents) {
-      commitBuilder.parent(p);
-    }
-  }
-
-  public void setParent(RevCommit parent) throws Exception {
-    commitBuilder.noParents();
-    commitBuilder.parent(parent);
-  }
-
-  public Result to(String ref) throws Exception {
-    for (Map.Entry<String, String> e : files.entrySet()) {
-      commitBuilder.add(e.getKey(), e.getValue());
-    }
-    return execute(ref);
-  }
-
-  public Result rm(String ref) throws Exception {
-    for (String fileName : files.keySet()) {
-      commitBuilder.rm(fileName);
-    }
-    return execute(ref);
-  }
-
-  public Result execute(String ref) throws Exception {
-    RevCommit c = commitBuilder.create();
-    if (changeId == null) {
-      changeId = GitUtil.getChangeId(testRepo, c).get();
-    }
-    if (tag != null) {
-      TagCommand tagCommand = testRepo.git().tag().setName(tag.name);
-      if (tag instanceof AnnotatedTag) {
-        AnnotatedTag annotatedTag = (AnnotatedTag) tag;
-        tagCommand
-            .setAnnotated(true)
-            .setMessage(annotatedTag.message)
-            .setTagger(annotatedTag.tagger);
-      } else {
-        tagCommand.setAnnotated(false);
-      }
-      tagCommand.call();
-    }
-    return new Result(ref, pushHead(testRepo, ref, tag != null, force, pushOptions), c, subject);
-  }
-
-  public void setTag(Tag tag) {
-    this.tag = tag;
-  }
-
-  public void setForce(boolean force) {
-    this.force = force;
-  }
-
-  public List<String> getPushOptions() {
-    return pushOptions;
-  }
-
-  public void setPushOptions(List<String> pushOptions) {
-    this.pushOptions = pushOptions;
-  }
-
-  public void noParents() {
-    commitBuilder.noParents();
-  }
-
-  public class Result {
-    private final String ref;
-    private final PushResult result;
-    private final RevCommit commit;
-    private final String resSubj;
-
-    private Result(String ref, PushResult resSubj, RevCommit commit, String subject) {
-      this.ref = ref;
-      this.result = resSubj;
-      this.commit = commit;
-      this.resSubj = subject;
-    }
-
-    public ChangeData getChange() throws OrmException {
-      return Iterables.getOnlyElement(queryProvider.get().byKeyPrefix(changeId));
-    }
-
-    public PatchSet getPatchSet() throws OrmException {
-      return getChange().currentPatchSet();
-    }
-
-    public PatchSet.Id getPatchSetId() throws OrmException {
-      return getChange().change().currentPatchSetId();
-    }
-
-    public String getChangeId() {
-      return changeId;
-    }
-
-    public RevCommit getCommit() {
-      return commit;
-    }
-
-    public void assertPushOptions(List<String> pushOptions) {
-      assertEquals(pushOptions, getPushOptions());
-    }
-
-    public void assertChange(
-        Change.Status expectedStatus, String expectedTopic, TestAccount... expectedReviewers)
-        throws OrmException {
-      assertChange(
-          expectedStatus, expectedTopic, Arrays.asList(expectedReviewers), ImmutableList.of());
-    }
-
-    public void assertChange(
-        Change.Status expectedStatus,
-        String expectedTopic,
-        List<TestAccount> expectedReviewers,
-        List<TestAccount> expectedCcs)
-        throws OrmException {
-      Change c = getChange().change();
-      assertThat(c.getSubject()).isEqualTo(resSubj);
-      assertThat(c.getStatus()).isEqualTo(expectedStatus);
-      assertThat(Strings.emptyToNull(c.getTopic())).isEqualTo(expectedTopic);
-      if (notesMigration.readChanges()) {
-        assertReviewers(c, ReviewerStateInternal.REVIEWER, expectedReviewers);
-        assertReviewers(c, ReviewerStateInternal.CC, expectedCcs);
-      } else {
-        assertReviewers(
-            c,
-            ReviewerStateInternal.REVIEWER,
-            Stream.concat(expectedReviewers.stream(), expectedCcs.stream()).collect(toList()));
-      }
-    }
-
-    private void assertReviewers(
-        Change c, ReviewerStateInternal state, List<TestAccount> expectedReviewers)
-        throws OrmException {
-      Iterable<Account.Id> actualIds =
-          approvalsUtil.getReviewers(db, notesFactory.createChecked(db, c)).byState(state);
-      assertThat(actualIds)
-          .containsExactlyElementsIn(Sets.newHashSet(TestAccount.ids(expectedReviewers)));
-    }
-
-    public void assertOkStatus() {
-      assertStatus(Status.OK, null);
-    }
-
-    public void assertErrorStatus(String expectedMessage) {
-      assertStatus(Status.REJECTED_OTHER_REASON, expectedMessage);
-    }
-
-    public void assertErrorStatus() {
-      RemoteRefUpdate refUpdate = result.getRemoteUpdate(ref);
-      assertThat(refUpdate).isNotNull();
-      assertThat(refUpdate.getStatus())
-          .named(message(refUpdate))
-          .isEqualTo(Status.REJECTED_OTHER_REASON);
-    }
-
-    private void assertStatus(Status expectedStatus, String expectedMessage) {
-      RemoteRefUpdate refUpdate = result.getRemoteUpdate(ref);
-      assertThat(refUpdate).isNotNull();
-      assertThat(refUpdate.getStatus()).named(message(refUpdate)).isEqualTo(expectedStatus);
-      if (expectedMessage == null) {
-        assertThat(refUpdate.getMessage()).isNull();
-      } else {
-        assertThat(refUpdate.getMessage()).contains(expectedMessage);
-      }
-    }
-
-    public void assertMessage(String expectedMessage) {
-      RemoteRefUpdate refUpdate = result.getRemoteUpdate(ref);
-      assertThat(refUpdate).isNotNull();
-      assertThat(message(refUpdate).toLowerCase()).contains(expectedMessage.toLowerCase());
-    }
-
-    public void assertNotMessage(String message) {
-      RemoteRefUpdate refUpdate = result.getRemoteUpdate(ref);
-      assertThat(message(refUpdate).toLowerCase()).doesNotContain(message.toLowerCase());
-    }
-
-    public String getMessage() {
-      RemoteRefUpdate refUpdate = result.getRemoteUpdate(ref);
-      assertThat(refUpdate).isNotNull();
-      return message(refUpdate);
-    }
-
-    private String message(RemoteRefUpdate refUpdate) {
-      StringBuilder b = new StringBuilder();
-      if (refUpdate.getMessage() != null) {
-        b.append(refUpdate.getMessage());
-        b.append("\n");
-      }
-      b.append(result.getMessages());
-      return b.toString();
-    }
-  }
-}
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/RestSession.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/RestSession.java
deleted file mode 100644
index 1a3c029..0000000
--- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/RestSession.java
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.acceptance;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.base.Preconditions;
-import com.google.common.net.HttpHeaders;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.restapi.RawInput;
-import com.google.gerrit.server.OutputFormat;
-import java.io.IOException;
-import org.apache.http.Header;
-import org.apache.http.client.fluent.Request;
-import org.apache.http.entity.BufferedHttpEntity;
-import org.apache.http.entity.InputStreamEntity;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.message.BasicHeader;
-
-public class RestSession extends HttpSession {
-
-  public RestSession(GerritServer server, @Nullable TestAccount account) {
-    super(server, account);
-  }
-
-  public RestResponse get(String endPoint) throws IOException {
-    return getWithHeader(endPoint, null);
-  }
-
-  public RestResponse getJsonAccept(String endPoint) throws IOException {
-    return getWithHeader(endPoint, new BasicHeader(HttpHeaders.ACCEPT, "application/json"));
-  }
-
-  public RestResponse getWithHeader(String endPoint, Header header) throws IOException {
-    Request get = Request.Get(getUrl(endPoint));
-    if (header != null) {
-      get.addHeader(header);
-    }
-    return execute(get);
-  }
-
-  public RestResponse head(String endPoint) throws IOException {
-    return execute(Request.Head(getUrl(endPoint)));
-  }
-
-  public RestResponse put(String endPoint) throws IOException {
-    return put(endPoint, null);
-  }
-
-  public RestResponse put(String endPoint, Object content) throws IOException {
-    return putWithHeader(endPoint, null, content);
-  }
-
-  public RestResponse putWithHeader(String endPoint, Header header) throws IOException {
-    return putWithHeader(endPoint, header, null);
-  }
-
-  public RestResponse putWithHeader(String endPoint, Header header, Object content)
-      throws IOException {
-    Request put = Request.Put(getUrl(endPoint));
-    if (header != null) {
-      put.addHeader(header);
-    }
-    if (content != null) {
-      put.addHeader(new BasicHeader("Content-Type", "application/json"));
-      put.body(new StringEntity(OutputFormat.JSON_COMPACT.newGson().toJson(content), UTF_8));
-    }
-    return execute(put);
-  }
-
-  public RestResponse putRaw(String endPoint, RawInput stream) throws IOException {
-    Preconditions.checkNotNull(stream);
-    Request put = Request.Put(getUrl(endPoint));
-    put.addHeader(new BasicHeader("Content-Type", stream.getContentType()));
-    put.body(
-        new BufferedHttpEntity(
-            new InputStreamEntity(stream.getInputStream(), stream.getContentLength())));
-    return execute(put);
-  }
-
-  public RestResponse post(String endPoint) throws IOException {
-    return post(endPoint, null);
-  }
-
-  public RestResponse post(String endPoint, Object content) throws IOException {
-    return postWithHeader(endPoint, null, content);
-  }
-
-  public RestResponse postWithHeader(String endPoint, Header header, Object content)
-      throws IOException {
-    Request post = Request.Post(getUrl(endPoint));
-    if (header != null) {
-      post.addHeader(header);
-    }
-    if (content != null) {
-      post.addHeader(new BasicHeader("Content-Type", "application/json"));
-      post.body(new StringEntity(OutputFormat.JSON_COMPACT.newGson().toJson(content), UTF_8));
-    }
-    return execute(post);
-  }
-
-  public RestResponse delete(String endPoint) throws IOException {
-    return execute(Request.Delete(getUrl(endPoint)));
-  }
-
-  private String getUrl(String endPoint) {
-    return url + (account != null ? "/a" : "") + endPoint;
-  }
-}
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/SshSession.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/SshSession.java
deleted file mode 100644
index b7bfff7..0000000
--- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/SshSession.java
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.acceptance;
-
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth.assertWithMessage;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.jcraft.jsch.ChannelExec;
-import com.jcraft.jsch.JSch;
-import com.jcraft.jsch.JSchException;
-import com.jcraft.jsch.Session;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.InetSocketAddress;
-import java.util.Scanner;
-
-public class SshSession {
-  private final InetSocketAddress addr;
-  private final TestAccount account;
-  private Session session;
-  private String error;
-
-  public SshSession(GerritServer server, TestAccount account) {
-    this.addr = server.getSshdAddress();
-    this.account = account;
-  }
-
-  public void open() throws JSchException {
-    getSession();
-  }
-
-  @SuppressWarnings("resource")
-  public String exec(String command, InputStream opt) throws JSchException, IOException {
-    ChannelExec channel = (ChannelExec) getSession().openChannel("exec");
-    try {
-      channel.setCommand(command);
-      channel.setInputStream(opt);
-      InputStream in = channel.getInputStream();
-      InputStream err = channel.getErrStream();
-      channel.connect();
-
-      Scanner s = new Scanner(err, UTF_8.name()).useDelimiter("\\A");
-      error = s.hasNext() ? s.next() : null;
-
-      s = new Scanner(in, UTF_8.name()).useDelimiter("\\A");
-      return s.hasNext() ? s.next() : "";
-    } finally {
-      channel.disconnect();
-    }
-  }
-
-  public InputStream exec2(String command, InputStream opt) throws JSchException, IOException {
-    ChannelExec channel = (ChannelExec) getSession().openChannel("exec");
-    channel.setCommand(command);
-    channel.setInputStream(opt);
-    InputStream in = channel.getInputStream();
-    channel.connect();
-    return in;
-  }
-
-  public String exec(String command) throws JSchException, IOException {
-    return exec(command, null);
-  }
-
-  private boolean hasError() {
-    return error != null;
-  }
-
-  public String getError() {
-    return error;
-  }
-
-  public void assertSuccess() {
-    assertWithMessage(getError()).that(hasError()).isFalse();
-  }
-
-  public void assertFailure() {
-    assertThat(hasError()).isTrue();
-  }
-
-  public void assertFailure(String error) {
-    assertThat(hasError()).isTrue();
-    assertThat(getError()).contains(error);
-  }
-
-  public void close() {
-    if (session != null) {
-      session.disconnect();
-      session = null;
-    }
-  }
-
-  private Session getSession() throws JSchException {
-    if (session == null) {
-      JSch jsch = new JSch();
-      jsch.addIdentity("KeyPair", account.privateKey(), account.sshKey.getPublicKeyBlob(), null);
-      session =
-          jsch.getSession(account.username, addr.getAddress().getHostAddress(), addr.getPort());
-      session.setConfig("StrictHostKeyChecking", "no");
-      session.connect();
-    }
-    return session;
-  }
-
-  public String getUrl() {
-    checkState(session != null, "session must be opened");
-    StringBuilder b = new StringBuilder();
-    b.append("ssh://");
-    b.append(session.getUserName());
-    b.append("@");
-    b.append(session.getHost());
-    b.append(":");
-    b.append(session.getPort());
-    return b.toString();
-  }
-
-  public TestAccount getAccount() {
-    return account;
-  }
-}
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/StandaloneSiteTest.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/StandaloneSiteTest.java
deleted file mode 100644
index a218f73..0000000
--- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/StandaloneSiteTest.java
+++ /dev/null
@@ -1,229 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.acceptance;
-
-import static com.google.common.truth.Truth.assertThat;
-import static java.util.stream.Collectors.joining;
-import static org.junit.Assert.fail;
-
-import com.google.common.collect.Streams;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.api.GerritApi;
-import com.google.gerrit.extensions.api.groups.GroupInput;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.launcher.GerritLauncher;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.util.ManualRequestContext;
-import com.google.gerrit.server.util.OneOffRequestContext;
-import com.google.gerrit.server.util.RequestContext;
-import com.google.gerrit.testutil.ConfigSuite;
-import com.google.inject.Injector;
-import com.google.inject.Module;
-import com.google.inject.Provider;
-import java.io.File;
-import java.util.Arrays;
-import java.util.Collections;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.storage.file.FileBasedConfig;
-import org.eclipse.jgit.util.FS;
-import org.eclipse.jgit.util.SystemReader;
-import org.junit.Rule;
-import org.junit.rules.RuleChain;
-import org.junit.rules.TemporaryFolder;
-import org.junit.rules.TestRule;
-import org.junit.runner.Description;
-import org.junit.runner.RunWith;
-import org.junit.runners.model.Statement;
-
-@RunWith(ConfigSuite.class)
-@UseLocalDisk
-public abstract class StandaloneSiteTest {
-  protected class ServerContext implements RequestContext, AutoCloseable {
-    private final GerritServer server;
-    private final ManualRequestContext ctx;
-
-    private ServerContext(GerritServer server) throws Exception {
-      this.server = server;
-      Injector i = server.getTestInjector();
-      if (adminId == null) {
-        adminId = i.getInstance(AccountCreator.class).admin().getId();
-      }
-      ctx = i.getInstance(OneOffRequestContext.class).openAs(adminId);
-      GerritApi gApi = i.getInstance(GerritApi.class);
-
-      try {
-        // ServerContext ctor is called multiple times but the group can be only created once
-        gApi.groups().id("Group");
-      } catch (ResourceNotFoundException e) {
-        GroupInput in = new GroupInput();
-        in.members = Collections.singletonList("admin");
-        in.name = "Group";
-        gApi.groups().create(in);
-      }
-    }
-
-    @Override
-    public CurrentUser getUser() {
-      return ctx.getUser();
-    }
-
-    @Override
-    public Provider<ReviewDb> getReviewDbProvider() {
-      return ctx.getReviewDbProvider();
-    }
-
-    public Injector getInjector() {
-      return server.getTestInjector();
-    }
-
-    @Override
-    public void close() throws Exception {
-      try {
-        ctx.close();
-      } finally {
-        server.close();
-      }
-    }
-  }
-
-  @ConfigSuite.Parameter public Config baseConfig;
-  @ConfigSuite.Name private String configName;
-
-  private final TemporaryFolder tempSiteDir = new TemporaryFolder();
-
-  private final TestRule testRunner =
-      new TestRule() {
-        @Override
-        public Statement apply(Statement base, Description description) {
-          return new Statement() {
-            @Override
-            public void evaluate() throws Throwable {
-              try {
-                beforeTest(description);
-                base.evaluate();
-              } finally {
-                afterTest();
-              }
-            }
-          };
-        }
-      };
-
-  @Rule public RuleChain ruleChain = RuleChain.outerRule(tempSiteDir).around(testRunner);
-
-  protected SitePaths sitePaths;
-  protected Account.Id adminId;
-
-  private GerritServer.Description serverDesc;
-  private SystemReader oldSystemReader;
-
-  private void beforeTest(Description description) throws Exception {
-    // SystemReader must be overridden before creating any repos, since they read the user/system
-    // configs at initialization time, and are then stored in the RepositoryCache forever.
-    oldSystemReader = setFakeSystemReader(tempSiteDir.getRoot());
-
-    serverDesc = GerritServer.Description.forTestMethod(description, configName);
-    sitePaths = new SitePaths(tempSiteDir.getRoot().toPath());
-    GerritServer.init(serverDesc, baseConfig, sitePaths.site_path);
-  }
-
-  private static SystemReader setFakeSystemReader(File tempDir) {
-    SystemReader oldSystemReader = SystemReader.getInstance();
-    SystemReader.setInstance(
-        new SystemReader() {
-          @Override
-          public String getHostname() {
-            return oldSystemReader.getHostname();
-          }
-
-          @Override
-          public String getenv(String variable) {
-            return oldSystemReader.getenv(variable);
-          }
-
-          @Override
-          public String getProperty(String key) {
-            return oldSystemReader.getProperty(key);
-          }
-
-          @Override
-          public FileBasedConfig openUserConfig(Config parent, FS fs) {
-            return new FileBasedConfig(parent, new File(tempDir, "user.config"), FS.detect());
-          }
-
-          @Override
-          public FileBasedConfig openSystemConfig(Config parent, FS fs) {
-            return new FileBasedConfig(parent, new File(tempDir, "system.config"), FS.detect());
-          }
-
-          @Override
-          public long getCurrentTime() {
-            return oldSystemReader.getCurrentTime();
-          }
-
-          @Override
-          public int getTimezone(long when) {
-            return oldSystemReader.getTimezone(when);
-          }
-        });
-    return oldSystemReader;
-  }
-
-  private void afterTest() throws Exception {
-    SystemReader.setInstance(oldSystemReader);
-    oldSystemReader = null;
-  }
-
-  protected ServerContext startServer() throws Exception {
-    return startServer(null);
-  }
-
-  protected ServerContext startServer(@Nullable Module testSysModule, String... additionalArgs)
-      throws Exception {
-    return new ServerContext(startImpl(testSysModule, additionalArgs));
-  }
-
-  protected void assertServerStartupFails() throws Exception {
-    try (GerritServer server = startImpl(null)) {
-      fail("expected server startup to fail");
-    } catch (GerritServer.StartupException e) {
-      // Expected.
-    }
-  }
-
-  private GerritServer startImpl(@Nullable Module testSysModule, String... additionalArgs)
-      throws Exception {
-    return GerritServer.start(
-        serverDesc, baseConfig, sitePaths.site_path, testSysModule, additionalArgs);
-  }
-
-  protected static void runGerrit(String... args) throws Exception {
-    // Use invokeProgram with the current classloader, rather than mainImpl, which would create a
-    // new classloader. This is necessary so that static state, particularly the SystemReader, is
-    // shared with the test method.
-    assertThat(GerritLauncher.invokeProgram(StandaloneSiteTest.class.getClassLoader(), args))
-        .named("gerrit.war " + Arrays.stream(args).collect(joining(" ")))
-        .isEqualTo(0);
-  }
-
-  @SafeVarargs
-  protected static void runGerrit(Iterable<String>... multiArgs) throws Exception {
-    runGerrit(
-        Arrays.stream(multiArgs).flatMap(args -> Streams.stream(args)).toArray(String[]::new));
-  }
-}
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/TestAccount.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/TestAccount.java
deleted file mode 100644
index 7acb135..0000000
--- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/TestAccount.java
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.acceptance;
-
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.net.InetAddresses;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.mail.Address;
-import com.jcraft.jsch.KeyPair;
-import java.io.ByteArrayOutputStream;
-import java.net.InetSocketAddress;
-import java.util.Arrays;
-import java.util.List;
-import org.apache.http.client.utils.URIBuilder;
-import org.eclipse.jgit.lib.PersonIdent;
-
-public class TestAccount {
-  public static List<Account.Id> ids(List<TestAccount> accounts) {
-    return accounts.stream().map(a -> a.id).collect(toList());
-  }
-
-  public static List<String> names(List<TestAccount> accounts) {
-    return accounts.stream().map(a -> a.fullName).collect(toList());
-  }
-
-  public static List<String> names(TestAccount... accounts) {
-    return names(Arrays.asList(accounts));
-  }
-
-  public final Account.Id id;
-  public final String username;
-  public final String email;
-  public final Address emailAddress;
-  public final String fullName;
-  public final KeyPair sshKey;
-  public final String httpPassword;
-  public String status;
-
-  TestAccount(
-      Account.Id id,
-      String username,
-      String email,
-      String fullName,
-      KeyPair sshKey,
-      String httpPassword) {
-    this.id = id;
-    this.username = username;
-    this.email = email;
-    this.emailAddress = new Address(fullName, email);
-    this.fullName = fullName;
-    this.sshKey = sshKey;
-    this.httpPassword = httpPassword;
-  }
-
-  public byte[] privateKey() {
-    ByteArrayOutputStream out = new ByteArrayOutputStream();
-    sshKey.writePrivateKey(out);
-    return out.toByteArray();
-  }
-
-  public PersonIdent getIdent() {
-    return new PersonIdent(fullName, email);
-  }
-
-  public String getHttpUrl(GerritServer server) {
-    InetSocketAddress addr = server.getHttpAddress();
-    return new URIBuilder()
-        .setScheme("http")
-        .setUserInfo(username, httpPassword)
-        .setHost(InetAddresses.toUriString(addr.getAddress()))
-        .setPort(addr.getPort())
-        .toString();
-  }
-
-  public Account.Id getId() {
-    return id;
-  }
-}
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/TestProjectInput.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/TestProjectInput.java
deleted file mode 100644
index 86f3c03..0000000
--- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/TestProjectInput.java
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.acceptance;
-
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-import com.google.gerrit.extensions.client.InheritableBoolean;
-import com.google.gerrit.extensions.client.SubmitType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-@Target({METHOD})
-@Retention(RUNTIME)
-public @interface TestProjectInput {
-  // Fields from ProjectInput for creating the project.
-
-  String parent() default "";
-
-  boolean createEmptyCommit() default true;
-
-  String description() default "";
-
-  // These may be null in a ProjectInput, but annotations do not allow null
-  // default values. Thus these defaults should match ProjectConfig.
-  SubmitType submitType() default SubmitType.MERGE_IF_NECESSARY;
-
-  InheritableBoolean useContributorAgreements() default InheritableBoolean.INHERIT;
-
-  InheritableBoolean useSignedOffBy() default InheritableBoolean.INHERIT;
-
-  InheritableBoolean useContentMerge() default InheritableBoolean.INHERIT;
-
-  InheritableBoolean requireChangeId() default InheritableBoolean.INHERIT;
-
-  InheritableBoolean enableSignedPush() default InheritableBoolean.INHERIT;
-
-  InheritableBoolean requireSignedPush() default InheritableBoolean.INHERIT;
-
-  // Fields specific to acceptance test behavior.
-
-  /** Username to use for initial clone, passed to {@link AccountCreator}. */
-  String cloneAs() default "admin";
-}
diff --git a/gerrit-acceptance-tests/BUILD b/gerrit-acceptance-tests/BUILD
deleted file mode 100644
index ebc7c9b..0000000
--- a/gerrit-acceptance-tests/BUILD
+++ /dev/null
@@ -1,48 +0,0 @@
-RESOURCES = glob(["src/test/resources/**/*"])
-
-java_library(
-    name = "lib",
-    testonly = 1,
-    srcs = ["src/test/java/com/google/gerrit/acceptance/Dummy.java"],
-    resources = RESOURCES,
-    visibility = ["//visibility:public"],
-    exports = [
-        "//gerrit-acceptance-framework:lib",
-        "//gerrit-common:annotations",
-        "//gerrit-common:server",
-        "//gerrit-extension-api:api",
-        "//gerrit-gpg:testutil",
-        "//gerrit-httpd:httpd",
-        "//gerrit-launcher:launcher",
-        "//gerrit-lucene:lucene",
-        "//gerrit-pgm:init",
-        "//gerrit-pgm:pgm",
-        "//gerrit-pgm:util",
-        "//gerrit-reviewdb:server",
-        "//gerrit-server:metrics",
-        "//gerrit-server:prolog-common",
-        "//gerrit-server:receive",
-        "//gerrit-server:server",
-        "//gerrit-server:testutil",
-        "//gerrit-sshd:sshd",
-        "//gerrit-test-util:test_util",
-        "//lib:args4j",
-        "//lib:gson",
-        "//lib:guava-retrying",
-        "//lib:gwtjsonrpc",
-        "//lib:gwtorm",
-        "//lib:h2",
-        "//lib:jimfs",
-        "//lib:jsch",
-        "//lib:servlet-api-3_1-without-neverlink",
-        "//lib/bouncycastle:bcpg",
-        "//lib/bouncycastle:bcprov",
-        "//lib/commons:compress",
-        "//lib/guice",
-        "//lib/guice:guice-assistedinject",
-        "//lib/guice:guice-servlet",
-        "//lib/jgit/org.eclipse.jgit:jgit",
-        "//lib/log:api",
-        "//lib/mina:sshd",
-    ],
-)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/Dummy.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/Dummy.java
deleted file mode 100644
index fb4783b..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/Dummy.java
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.acceptance;
-
-public class Dummy {}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/annotation/BUILD b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/annotation/BUILD
deleted file mode 100644
index d16b64a..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/annotation/BUILD
+++ /dev/null
@@ -1,7 +0,0 @@
-load("//gerrit-acceptance-tests:tests.bzl", "acceptance_tests")
-
-acceptance_tests(
-    srcs = glob(["*.java"]),
-    group = "annotation",
-    labels = ["annotation"],
-)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/AccountIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/AccountIT.java
deleted file mode 100644
index e66257e..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/AccountIT.java
+++ /dev/null
@@ -1,2106 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.acceptance.api.accounts;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth.assertWithMessage;
-import static com.google.gerrit.acceptance.GitUtil.deleteRef;
-import static com.google.gerrit.acceptance.GitUtil.fetch;
-import static com.google.gerrit.gpg.PublicKeyStore.REFS_GPG_KEYS;
-import static com.google.gerrit.gpg.PublicKeyStore.keyToString;
-import static com.google.gerrit.gpg.testutil.TestKeys.allValidKeys;
-import static com.google.gerrit.gpg.testutil.TestKeys.validKeyWithExpiration;
-import static com.google.gerrit.gpg.testutil.TestKeys.validKeyWithSecondUserId;
-import static com.google.gerrit.gpg.testutil.TestKeys.validKeyWithoutExpiration;
-import static com.google.gerrit.server.StarredChangesUtil.DEFAULT_LABEL;
-import static com.google.gerrit.server.StarredChangesUtil.IGNORE_LABEL;
-import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_GPGKEY;
-import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.stream.Collectors.toList;
-import static java.util.stream.Collectors.toSet;
-import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
-import static org.junit.Assert.fail;
-
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ImmutableSetMultimap;
-import com.google.common.collect.Iterables;
-import com.google.common.io.BaseEncoding;
-import com.google.common.util.concurrent.AtomicLongMap;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.AccountCreator;
-import com.google.gerrit.acceptance.GerritConfig;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.acceptance.Sandboxed;
-import com.google.gerrit.acceptance.TestAccount;
-import com.google.gerrit.acceptance.UseSsh;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.accounts.AccountInput;
-import com.google.gerrit.extensions.api.accounts.EmailInput;
-import com.google.gerrit.extensions.api.changes.AddReviewerInput;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.api.changes.StarsInput;
-import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo;
-import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo.ConsistencyProblemInfo;
-import com.google.gerrit.extensions.api.config.ConsistencyCheckInput;
-import com.google.gerrit.extensions.api.config.ConsistencyCheckInput.CheckAccountsInput;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.GpgKeyInfo;
-import com.google.gerrit.extensions.common.SshKeyInfo;
-import com.google.gerrit.extensions.events.AccountIndexedListener;
-import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.registration.RegistrationHandle;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.gpg.Fingerprint;
-import com.google.gerrit.gpg.PublicKeyStore;
-import com.google.gerrit.gpg.testutil.TestKey;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.Sequences;
-import com.google.gerrit.server.account.AccountConfig;
-import com.google.gerrit.server.account.AccountManager;
-import com.google.gerrit.server.account.AccountsUpdate;
-import com.google.gerrit.server.account.AuthRequest;
-import com.google.gerrit.server.account.AuthResult;
-import com.google.gerrit.server.account.Emails;
-import com.google.gerrit.server.account.WatchConfig;
-import com.google.gerrit.server.account.WatchConfig.NotifyType;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.account.externalids.ExternalIds;
-import com.google.gerrit.server.account.externalids.ExternalIdsUpdate;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.group.InternalGroup;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.notedb.rebuild.ChangeRebuilderImpl;
-import com.google.gerrit.server.project.RefPattern;
-import com.google.gerrit.server.query.account.InternalAccountQuery;
-import com.google.gerrit.server.util.MagicBranch;
-import com.google.gerrit.testutil.ConfigSuite;
-import com.google.gerrit.testutil.FakeEmailSender.Message;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicBoolean;
-import org.bouncycastle.bcpg.ArmoredOutputStream;
-import org.bouncycastle.openpgp.PGPPublicKey;
-import org.bouncycastle.openpgp.PGPPublicKeyRing;
-import org.eclipse.jgit.api.errors.TransportException;
-import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.PushCertificateIdent;
-import org.eclipse.jgit.transport.PushResult;
-import org.eclipse.jgit.transport.RemoteRefUpdate;
-import org.eclipse.jgit.treewalk.TreeWalk;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-public class AccountIT extends AbstractDaemonTest {
-  @ConfigSuite.Default
-  public static Config enableSignedPushConfig() {
-    Config cfg = new Config();
-    cfg.setBoolean("receive", null, "enableSignedPush", true);
-    return cfg;
-  }
-
-  @Inject private Provider<PublicKeyStore> publicKeyStoreProvider;
-
-  @Inject private AllUsersName allUsers;
-
-  @Inject private AccountsUpdate.Server accountsUpdate;
-
-  @Inject private ExternalIds externalIds;
-
-  @Inject private ExternalIdsUpdate.User externalIdsUpdateFactory;
-
-  @Inject private DynamicSet<AccountIndexedListener> accountIndexedListeners;
-
-  @Inject private DynamicSet<GitReferenceUpdatedListener> refUpdateListeners;
-
-  @Inject private Sequences seq;
-
-  @Inject private Provider<InternalAccountQuery> accountQueryProvider;
-
-  @Inject protected Emails emails;
-
-  @Inject private AccountManager accountManager;
-
-  private AccountIndexedCounter accountIndexedCounter;
-  private RegistrationHandle accountIndexEventCounterHandle;
-  private RefUpdateCounter refUpdateCounter;
-  private RegistrationHandle refUpdateCounterHandle;
-  private ExternalIdsUpdate externalIdsUpdate;
-  private List<ExternalId> savedExternalIds;
-
-  @Before
-  public void addAccountIndexEventCounter() {
-    accountIndexedCounter = new AccountIndexedCounter();
-    accountIndexEventCounterHandle = accountIndexedListeners.add(accountIndexedCounter);
-  }
-
-  @After
-  public void removeAccountIndexEventCounter() {
-    if (accountIndexEventCounterHandle != null) {
-      accountIndexEventCounterHandle.remove();
-    }
-  }
-
-  @Before
-  public void addRefUpdateCounter() {
-    refUpdateCounter = new RefUpdateCounter();
-    refUpdateCounterHandle = refUpdateListeners.add(refUpdateCounter);
-  }
-
-  @After
-  public void removeRefUpdateCounter() {
-    if (refUpdateCounterHandle != null) {
-      refUpdateCounterHandle.remove();
-    }
-  }
-
-  @Before
-  public void saveExternalIds() throws Exception {
-    externalIdsUpdate = externalIdsUpdateFactory.create();
-
-    savedExternalIds = new ArrayList<>();
-    savedExternalIds.addAll(externalIds.byAccount(admin.id));
-    savedExternalIds.addAll(externalIds.byAccount(user.id));
-  }
-
-  @After
-  public void restoreExternalIds() throws Exception {
-    if (savedExternalIds != null) {
-      // savedExternalIds is null when we don't run SSH tests and the assume in
-      // @Before in AbstractDaemonTest prevents this class' @Before method from
-      // being executed.
-      externalIdsUpdate.delete(externalIds.byAccount(admin.id));
-      externalIdsUpdate.delete(externalIds.byAccount(user.id));
-      externalIdsUpdate.insert(savedExternalIds);
-    }
-  }
-
-  @After
-  public void clearPublicKeyStore() throws Exception {
-    try (Repository repo = repoManager.openRepository(allUsers)) {
-      Ref ref = repo.exactRef(REFS_GPG_KEYS);
-      if (ref != null) {
-        RefUpdate ru = repo.updateRef(REFS_GPG_KEYS);
-        ru.setForceUpdate(true);
-        assertThat(ru.delete()).isEqualTo(RefUpdate.Result.FORCED);
-      }
-    }
-  }
-
-  @After
-  public void deleteGpgKeys() throws Exception {
-    String ref = REFS_GPG_KEYS;
-    try (Repository repo = repoManager.openRepository(allUsers)) {
-      if (repo.getRefDatabase().exactRef(ref) != null) {
-        RefUpdate ru = repo.updateRef(ref);
-        ru.setForceUpdate(true);
-        assertWithMessage("Failed to delete " + ref)
-            .that(ru.delete())
-            .isEqualTo(RefUpdate.Result.FORCED);
-      }
-    }
-  }
-
-  @Test
-  public void create() throws Exception {
-    Account.Id accountId = create(2); // account creation + external ID creation
-    refUpdateCounter.assertRefUpdateFor(
-        RefUpdateCounter.projectRef(allUsers, RefNames.refsUsers(accountId)),
-        RefUpdateCounter.projectRef(allUsers, RefNames.REFS_EXTERNAL_IDS),
-        RefUpdateCounter.projectRef(allUsers, RefNames.REFS_SEQUENCES + Sequences.NAME_ACCOUNTS));
-  }
-
-  @Test
-  @UseSsh
-  public void createWithSshKeys() throws Exception {
-    Account.Id accountId = create(3); // account creation + external ID creation + adding SSH keys
-    refUpdateCounter.assertRefUpdateFor(
-        ImmutableMap.of(
-            RefUpdateCounter.projectRef(allUsers, RefNames.refsUsers(accountId)),
-            2,
-            RefUpdateCounter.projectRef(allUsers, RefNames.REFS_EXTERNAL_IDS),
-            1,
-            RefUpdateCounter.projectRef(
-                allUsers, RefNames.REFS_SEQUENCES + Sequences.NAME_ACCOUNTS),
-            1));
-  }
-
-  private Account.Id create(int expectedAccountReindexCalls) throws Exception {
-    String name = "foo";
-    TestAccount foo = accountCreator.create(name);
-    AccountInfo info = gApi.accounts().id(foo.id.get()).get();
-    assertThat(info.username).isEqualTo(name);
-    assertThat(info.name).isEqualTo(name);
-    accountIndexedCounter.assertReindexOf(foo, expectedAccountReindexCalls);
-    assertUserBranch(foo.getId(), name, null);
-    return foo.getId();
-  }
-
-  @Test
-  public void createAnonymousCoward() throws Exception {
-    TestAccount anonymousCoward = accountCreator.create();
-    accountIndexedCounter.assertReindexOf(anonymousCoward);
-    assertUserBranchWithoutAccountConfig(anonymousCoward.getId());
-  }
-
-  @Test
-  public void updateNonExistingAccount() throws Exception {
-    Account.Id nonExistingAccountId = new Account.Id(999999);
-    AtomicBoolean consumerCalled = new AtomicBoolean();
-    Account account =
-        accountsUpdate.create().update(nonExistingAccountId, a -> consumerCalled.set(true));
-    assertThat(account).isNull();
-    assertThat(consumerCalled.get()).isFalse();
-  }
-
-  @Test
-  public void updateAccountWithoutAccountConfigNoteDb() throws Exception {
-    TestAccount anonymousCoward = accountCreator.create();
-    assertUserBranchWithoutAccountConfig(anonymousCoward.getId());
-
-    String status = "OOO";
-    Account account =
-        accountsUpdate.create().update(anonymousCoward.getId(), a -> a.setStatus(status));
-    assertThat(account).isNotNull();
-    assertThat(account.getFullName()).isNull();
-    assertThat(account.getStatus()).isEqualTo(status);
-    assertUserBranch(anonymousCoward.getId(), null, status);
-  }
-
-  private void assertUserBranchWithoutAccountConfig(Account.Id accountId) throws Exception {
-    assertUserBranch(accountId, null, null);
-  }
-
-  private void assertUserBranch(
-      Account.Id accountId, @Nullable String name, @Nullable String status) throws Exception {
-    try (Repository repo = repoManager.openRepository(allUsers);
-        RevWalk rw = new RevWalk(repo);
-        ObjectReader or = repo.newObjectReader()) {
-      Ref ref = repo.exactRef(RefNames.refsUsers(accountId));
-      assertThat(ref).isNotNull();
-      RevCommit c = rw.parseCommit(ref.getObjectId());
-      long timestampDiffMs =
-          Math.abs(
-              c.getCommitTime() * 1000L
-                  - accountCache.get(accountId).getAccount().getRegisteredOn().getTime());
-      assertThat(timestampDiffMs).isAtMost(ChangeRebuilderImpl.MAX_WINDOW_MS);
-
-      // Check the 'account.config' file.
-      try (TreeWalk tw = TreeWalk.forPath(or, AccountConfig.ACCOUNT_CONFIG, c.getTree())) {
-        if (name != null || status != null) {
-          assertThat(tw).isNotNull();
-          Config cfg = new Config();
-          cfg.fromText(new String(or.open(tw.getObjectId(0), OBJ_BLOB).getBytes(), UTF_8));
-          assertThat(cfg.getString(AccountConfig.ACCOUNT, null, AccountConfig.KEY_FULL_NAME))
-              .isEqualTo(name);
-          assertThat(cfg.getString(AccountConfig.ACCOUNT, null, AccountConfig.KEY_STATUS))
-              .isEqualTo(status);
-        } else {
-          // No account properties were set, hence an 'account.config' file was not created.
-          assertThat(tw).isNull();
-        }
-      }
-    }
-  }
-
-  @Test
-  public void get() throws Exception {
-    AccountInfo info = gApi.accounts().id("admin").get();
-    assertThat(info.name).isEqualTo("Administrator");
-    assertThat(info.email).isEqualTo("admin@example.com");
-    assertThat(info.username).isEqualTo("admin");
-    accountIndexedCounter.assertNoReindex();
-  }
-
-  @Test
-  public void getByIntId() throws Exception {
-    AccountInfo info = gApi.accounts().id("admin").get();
-    AccountInfo infoByIntId = gApi.accounts().id(info._accountId).get();
-    assertThat(info.name).isEqualTo(infoByIntId.name);
-    accountIndexedCounter.assertNoReindex();
-  }
-
-  @Test
-  public void self() throws Exception {
-    AccountInfo info = gApi.accounts().self().get();
-    assertUser(info, admin);
-
-    info = gApi.accounts().id("self").get();
-    assertUser(info, admin);
-    accountIndexedCounter.assertNoReindex();
-  }
-
-  @Test
-  public void active() throws Exception {
-    assertThat(gApi.accounts().id("user").getActive()).isTrue();
-    gApi.accounts().id("user").setActive(false);
-    assertThat(gApi.accounts().id("user").getActive()).isFalse();
-    accountIndexedCounter.assertReindexOf(user);
-
-    gApi.accounts().id("user").setActive(true);
-    assertThat(gApi.accounts().id("user").getActive()).isTrue();
-    accountIndexedCounter.assertReindexOf(user);
-  }
-
-  @Test
-  public void deactivateSelf() throws Exception {
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("cannot deactivate own account");
-    gApi.accounts().self().setActive(false);
-  }
-
-  @Test
-  public void deactivateNotActive() throws Exception {
-    assertThat(gApi.accounts().id("user").getActive()).isTrue();
-    gApi.accounts().id("user").setActive(false);
-    assertThat(gApi.accounts().id("user").getActive()).isFalse();
-    try {
-      gApi.accounts().id("user").setActive(false);
-      fail("Expected exception");
-    } catch (ResourceConflictException e) {
-      assertThat(e.getMessage()).isEqualTo("account not active");
-    }
-    gApi.accounts().id("user").setActive(true);
-  }
-
-  @Test
-  public void starUnstarChange() throws Exception {
-    PushOneCommit.Result r = createChange();
-    String triplet = project.get() + "~master~" + r.getChangeId();
-    refUpdateCounter.clear();
-
-    gApi.accounts().self().starChange(triplet);
-    ChangeInfo change = info(triplet);
-    assertThat(change.starred).isTrue();
-    assertThat(change.stars).contains(DEFAULT_LABEL);
-    refUpdateCounter.assertRefUpdateFor(
-        RefUpdateCounter.projectRef(
-            allUsers, RefNames.refsStarredChanges(new Change.Id(change._number), admin.id)));
-
-    gApi.accounts().self().unstarChange(triplet);
-    change = info(triplet);
-    assertThat(change.starred).isNull();
-    assertThat(change.stars).isNull();
-    refUpdateCounter.assertRefUpdateFor(
-        RefUpdateCounter.projectRef(
-            allUsers, RefNames.refsStarredChanges(new Change.Id(change._number), admin.id)));
-
-    accountIndexedCounter.assertNoReindex();
-  }
-
-  @Test
-  public void starUnstarChangeWithLabels() throws Exception {
-    PushOneCommit.Result r = createChange();
-    String triplet = project.get() + "~master~" + r.getChangeId();
-    refUpdateCounter.clear();
-
-    assertThat(gApi.accounts().self().getStars(triplet)).isEmpty();
-    assertThat(gApi.accounts().self().getStarredChanges()).isEmpty();
-
-    gApi.accounts()
-        .self()
-        .setStars(triplet, new StarsInput(ImmutableSet.of(DEFAULT_LABEL, "red", "blue")));
-    ChangeInfo change = info(triplet);
-    assertThat(change.starred).isTrue();
-    assertThat(change.stars).containsExactly("blue", "red", DEFAULT_LABEL).inOrder();
-    assertThat(gApi.accounts().self().getStars(triplet))
-        .containsExactly("blue", "red", DEFAULT_LABEL)
-        .inOrder();
-    List<ChangeInfo> starredChanges = gApi.accounts().self().getStarredChanges();
-    assertThat(starredChanges).hasSize(1);
-    ChangeInfo starredChange = starredChanges.get(0);
-    assertThat(starredChange._number).isEqualTo(r.getChange().getId().get());
-    assertThat(starredChange.starred).isTrue();
-    assertThat(starredChange.stars).containsExactly("blue", "red", DEFAULT_LABEL).inOrder();
-    refUpdateCounter.assertRefUpdateFor(
-        RefUpdateCounter.projectRef(
-            allUsers, RefNames.refsStarredChanges(new Change.Id(change._number), admin.id)));
-
-    gApi.accounts()
-        .self()
-        .setStars(
-            triplet,
-            new StarsInput(ImmutableSet.of("yellow"), ImmutableSet.of(DEFAULT_LABEL, "blue")));
-    change = info(triplet);
-    assertThat(change.starred).isNull();
-    assertThat(change.stars).containsExactly("red", "yellow").inOrder();
-    assertThat(gApi.accounts().self().getStars(triplet)).containsExactly("red", "yellow").inOrder();
-    starredChanges = gApi.accounts().self().getStarredChanges();
-    assertThat(starredChanges).hasSize(1);
-    starredChange = starredChanges.get(0);
-    assertThat(starredChange._number).isEqualTo(r.getChange().getId().get());
-    assertThat(starredChange.starred).isNull();
-    assertThat(starredChange.stars).containsExactly("red", "yellow").inOrder();
-    refUpdateCounter.assertRefUpdateFor(
-        RefUpdateCounter.projectRef(
-            allUsers, RefNames.refsStarredChanges(new Change.Id(change._number), admin.id)));
-
-    accountIndexedCounter.assertNoReindex();
-
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    exception.expectMessage("not allowed to get stars of another account");
-    gApi.accounts().id(Integer.toString((admin.id.get()))).getStars(triplet);
-  }
-
-  @Test
-  public void starWithInvalidLabels() throws Exception {
-    PushOneCommit.Result r = createChange();
-    String triplet = project.get() + "~master~" + r.getChangeId();
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("invalid labels: another invalid label, invalid label");
-    gApi.accounts()
-        .self()
-        .setStars(
-            triplet,
-            new StarsInput(
-                ImmutableSet.of(DEFAULT_LABEL, "invalid label", "blue", "another invalid label")));
-  }
-
-  @Test
-  public void deleteStarLabelsFromChangeWithoutStarLabels() throws Exception {
-    PushOneCommit.Result r = createChange();
-    String triplet = project.get() + "~master~" + r.getChangeId();
-    assertThat(gApi.accounts().self().getStars(triplet)).isEmpty();
-
-    gApi.accounts().self().setStars(triplet, new StarsInput());
-
-    assertThat(gApi.accounts().self().getStars(triplet)).isEmpty();
-  }
-
-  @Test
-  public void starWithDefaultAndIgnoreLabel() throws Exception {
-    PushOneCommit.Result r = createChange();
-    String triplet = project.get() + "~master~" + r.getChangeId();
-    exception.expect(BadRequestException.class);
-    exception.expectMessage(
-        "The labels "
-            + DEFAULT_LABEL
-            + " and "
-            + IGNORE_LABEL
-            + " are mutually exclusive."
-            + " Only one of them can be set.");
-    gApi.accounts()
-        .self()
-        .setStars(triplet, new StarsInput(ImmutableSet.of(DEFAULT_LABEL, "blue", IGNORE_LABEL)));
-  }
-
-  @Test
-  public void ignoreChangeBySetStars() throws Exception {
-    TestAccount user2 = accountCreator.user2();
-    accountIndexedCounter.clear();
-
-    PushOneCommit.Result r = createChange();
-
-    AddReviewerInput in = new AddReviewerInput();
-    in.reviewer = user.email;
-    gApi.changes().id(r.getChangeId()).addReviewer(in);
-
-    in = new AddReviewerInput();
-    in.reviewer = user2.email;
-    gApi.changes().id(r.getChangeId()).addReviewer(in);
-
-    setApiUser(user);
-    gApi.accounts().self().setStars(r.getChangeId(), new StarsInput(ImmutableSet.of(IGNORE_LABEL)));
-
-    sender.clear();
-    setApiUser(admin);
-    gApi.changes().id(r.getChangeId()).abandon();
-    List<Message> messages = sender.getMessages();
-    assertThat(messages).hasSize(1);
-    assertThat(messages.get(0).rcpt()).containsExactly(user2.emailAddress);
-    accountIndexedCounter.assertNoReindex();
-  }
-
-  @Test
-  public void addReviewerToIgnoredChange() throws Exception {
-    PushOneCommit.Result r = createChange();
-
-    setApiUser(user);
-    gApi.accounts().self().setStars(r.getChangeId(), new StarsInput(ImmutableSet.of(IGNORE_LABEL)));
-
-    sender.clear();
-    setApiUser(admin);
-
-    AddReviewerInput in = new AddReviewerInput();
-    in.reviewer = user.email;
-    gApi.changes().id(r.getChangeId()).addReviewer(in);
-    List<Message> messages = sender.getMessages();
-    assertThat(messages).hasSize(1);
-    Message message = messages.get(0);
-    assertThat(message.rcpt()).containsExactly(user.emailAddress);
-    assertMailReplyTo(message, admin.email);
-    accountIndexedCounter.assertNoReindex();
-  }
-
-  @Test
-  public void suggestAccounts() throws Exception {
-    String adminUsername = "admin";
-    List<AccountInfo> result = gApi.accounts().suggestAccounts().withQuery(adminUsername).get();
-    assertThat(result).hasSize(1);
-    assertThat(result.get(0).username).isEqualTo(adminUsername);
-
-    List<AccountInfo> resultShortcutApi = gApi.accounts().suggestAccounts(adminUsername).get();
-    assertThat(resultShortcutApi).hasSize(result.size());
-
-    List<AccountInfo> emptyResult = gApi.accounts().suggestAccounts("unknown").get();
-    assertThat(emptyResult).isEmpty();
-    accountIndexedCounter.assertNoReindex();
-  }
-
-  @Test
-  public void addEmail() throws Exception {
-    List<String> emails = ImmutableList.of("new.email@example.com", "new.email@example.systems");
-    Set<String> currentEmails = getEmails();
-    for (String email : emails) {
-      assertThat(currentEmails).doesNotContain(email);
-      EmailInput input = newEmailInput(email);
-      gApi.accounts().self().addEmail(input);
-      accountIndexedCounter.assertReindexOf(admin);
-    }
-
-    resetCurrentApiUser();
-    assertThat(getEmails()).containsAllIn(emails);
-  }
-
-  @Test
-  public void addInvalidEmail() throws Exception {
-    List<String> emails =
-        ImmutableList.of(
-            // Missing domain part
-            "new.email",
-
-            // Missing domain part
-            "new.email@",
-
-            // Missing user part
-            "@example.com",
-
-            // Non-supported TLD  (see tlds-alpha-by-domain.txt)
-            "new.email@example.africa");
-    for (String email : emails) {
-      EmailInput input = newEmailInput(email);
-      try {
-        gApi.accounts().self().addEmail(input);
-        fail("Expected BadRequestException for invalid email address: " + email);
-      } catch (BadRequestException e) {
-        assertThat(e).hasMessageThat().isEqualTo("invalid email address");
-      }
-    }
-    accountIndexedCounter.assertNoReindex();
-  }
-
-  @Test
-  public void cannotAddNonConfirmedEmailWithoutModifyAccountPermission() throws Exception {
-    TestAccount account = accountCreator.create(name("user"));
-    EmailInput input = newEmailInput("test@test.com");
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    gApi.accounts().id(account.username).addEmail(input);
-  }
-
-  @Test
-  public void cannotAddEmailAddressUsedByAnotherAccount() throws Exception {
-    String email = "new.email@example.com";
-    EmailInput input = newEmailInput(email);
-    gApi.accounts().self().addEmail(input);
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("Identity 'mailto:" + email + "' in use by another account");
-    gApi.accounts().id(user.username).addEmail(input);
-  }
-
-  @Test
-  @GerritConfig(
-      name = "auth.registerEmailPrivateKey",
-      value = "HsOc6l+2lhS9G7sE/RsnS7Z6GJjdRDX14co=")
-  public void addEmailSendsConfirmationEmail() throws Exception {
-    String email = "new.email@example.com";
-    EmailInput input = newEmailInput(email, false);
-    gApi.accounts().self().addEmail(input);
-
-    assertThat(sender.getMessages()).hasSize(1);
-    Message m = sender.getMessages().get(0);
-    assertThat(m.rcpt()).containsExactly(new Address(email));
-  }
-
-  @Test
-  public void deleteEmail() throws Exception {
-    String email = "foo.bar@example.com";
-    EmailInput input = newEmailInput(email);
-    gApi.accounts().self().addEmail(input);
-
-    resetCurrentApiUser();
-    assertThat(getEmails()).contains(email);
-
-    accountIndexedCounter.clear();
-    gApi.accounts().self().deleteEmail(input.email);
-    accountIndexedCounter.assertReindexOf(admin);
-
-    resetCurrentApiUser();
-    assertThat(getEmails()).doesNotContain(email);
-  }
-
-  @Test
-  public void deleteEmailFromCustomExternalIdSchemes() throws Exception {
-    String email = "foo.bar@example.com";
-    String extId1 = "foo:bar";
-    String extId2 = "foo:baz";
-    List<ExternalId> extIds =
-        ImmutableList.of(
-            ExternalId.createWithEmail(ExternalId.Key.parse(extId1), admin.id, email),
-            ExternalId.createWithEmail(ExternalId.Key.parse(extId2), admin.id, email));
-    externalIdsUpdateFactory.create().insert(extIds);
-    accountIndexedCounter.assertReindexOf(admin);
-    assertThat(
-            gApi.accounts().self().getExternalIds().stream().map(e -> e.identity).collect(toSet()))
-        .containsAllOf(extId1, extId2);
-
-    resetCurrentApiUser();
-    assertThat(getEmails()).contains(email);
-
-    gApi.accounts().self().deleteEmail(email);
-    accountIndexedCounter.assertReindexOf(admin);
-
-    resetCurrentApiUser();
-    assertThat(getEmails()).doesNotContain(email);
-    assertThat(
-            gApi.accounts().self().getExternalIds().stream().map(e -> e.identity).collect(toSet()))
-        .containsNoneOf(extId1, extId2);
-  }
-
-  @Test
-  public void deleteEmailOfOtherUser() throws Exception {
-    String email = "foo.bar@example.com";
-    EmailInput input = new EmailInput();
-    input.email = email;
-    input.noConfirmation = true;
-    gApi.accounts().id(user.id.get()).addEmail(input);
-    accountIndexedCounter.assertReindexOf(user);
-
-    setApiUser(user);
-    assertThat(getEmails()).contains(email);
-
-    // admin can delete email of user
-    setApiUser(admin);
-    gApi.accounts().id(user.id.get()).deleteEmail(email);
-    accountIndexedCounter.assertReindexOf(user);
-
-    setApiUser(user);
-    assertThat(getEmails()).doesNotContain(email);
-
-    // user cannot delete email of admin
-    exception.expect(AuthException.class);
-    exception.expectMessage("modify account not permitted");
-    gApi.accounts().id(admin.id.get()).deleteEmail(admin.email);
-  }
-
-  @Test
-  public void lookUpByEmail() throws Exception {
-    // exact match with scheme "mailto:"
-    assertEmail(emails.getAccountFor(admin.email), admin);
-
-    // exact match with other scheme
-    String email = "foo.bar@example.com";
-    externalIdsUpdateFactory
-        .create()
-        .insert(ExternalId.createWithEmail(ExternalId.Key.parse("foo:bar"), admin.id, email));
-    assertEmail(emails.getAccountFor(email), admin);
-
-    // wrong case doesn't match
-    assertThat(emails.getAccountFor(admin.email.toUpperCase(Locale.US))).isEmpty();
-
-    // prefix doesn't match
-    assertThat(emails.getAccountFor(admin.email.substring(0, admin.email.indexOf('@')))).isEmpty();
-
-    // non-existing doesn't match
-    assertThat(emails.getAccountFor("non-existing@example.com")).isEmpty();
-
-    // lookup several accounts by email at once
-    ImmutableSetMultimap<String, Account.Id> byEmails =
-        emails.getAccountsFor(admin.email, user.email);
-    assertEmail(byEmails.get(admin.email), admin);
-    assertEmail(byEmails.get(user.email), user);
-  }
-
-  @Test
-  public void lookUpByPreferredEmail() throws Exception {
-    // create an inconsistent account that has a preferred email without external ID
-    String prefix = "foo.preferred";
-    String prefEmail = prefix + "@example.com";
-    TestAccount foo = accountCreator.create(name("foo"));
-    accountsUpdate.create().update(foo.id, a -> a.setPreferredEmail(prefEmail));
-
-    // verify that the account is still found when using the preferred email to lookup the account
-    ImmutableSet<Account.Id> accountsByPrefEmail = emails.getAccountFor(prefEmail);
-    assertThat(accountsByPrefEmail).hasSize(1);
-    assertThat(Iterables.getOnlyElement(accountsByPrefEmail)).isEqualTo(foo.id);
-
-    // look up by email prefix doesn't find the account
-    accountsByPrefEmail = emails.getAccountFor(prefix);
-    assertThat(accountsByPrefEmail).isEmpty();
-
-    // look up by other case doesn't find the account
-    accountsByPrefEmail = emails.getAccountFor(prefEmail.toUpperCase(Locale.US));
-    assertThat(accountsByPrefEmail).isEmpty();
-  }
-
-  @Test
-  public void putStatus() throws Exception {
-    List<String> statuses = ImmutableList.of("OOO", "Busy");
-    AccountInfo info;
-    for (String status : statuses) {
-      gApi.accounts().self().setStatus(status);
-      admin.status = status;
-      info = gApi.accounts().self().get();
-      assertUser(info, admin);
-      accountIndexedCounter.assertReindexOf(admin);
-    }
-  }
-
-  @Test
-  public void setName() throws Exception {
-    gApi.accounts().self().setName("Admin McAdminface");
-    assertThat(gApi.accounts().self().get().name).isEqualTo("Admin McAdminface");
-  }
-
-  @Test
-  public void adminCanSetNameOfOtherUser() throws Exception {
-    gApi.accounts().id(user.username).setName("User McUserface");
-    assertThat(gApi.accounts().id(user.username).get().name).isEqualTo("User McUserface");
-  }
-
-  @Test
-  public void userCannotSetNameOfOtherUser() throws Exception {
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    gApi.accounts().id(admin.username).setName("Admin McAdminface");
-  }
-
-  @Test
-  @Sandboxed
-  public void userCanSetNameOfOtherUserWithModifyAccountPermission() throws Exception {
-    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.MODIFY_ACCOUNT);
-    gApi.accounts().id(admin.username).setName("Admin McAdminface");
-    assertThat(gApi.accounts().id(admin.username).get().name).isEqualTo("Admin McAdminface");
-  }
-
-  @Test
-  @Sandboxed
-  public void fetchUserBranch() throws Exception {
-    setApiUser(user);
-
-    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers, user);
-    String userRefName = RefNames.refsUsers(user.id);
-
-    // remove default READ permissions
-    ProjectConfig cfg = projectCache.checkedGet(allUsers).getConfig();
-    cfg.getAccessSection(RefNames.REFS_USERS + "${" + RefPattern.USERID_SHARDED + "}", true)
-        .remove(new Permission(Permission.READ));
-    saveProjectConfig(allUsers, cfg);
-
-    // deny READ permission that is inherited from All-Projects
-    deny(allUsers, RefNames.REFS + "*", Permission.READ, ANONYMOUS_USERS);
-
-    // fetching user branch without READ permission fails
-    try {
-      fetch(allUsersRepo, userRefName + ":userRef");
-      Assert.fail("user branch is visible although no READ permission is granted");
-    } catch (TransportException e) {
-      // expected because no READ granted on user branch
-    }
-
-    // allow each user to read its own user branch
-    grant(
-        allUsers,
-        RefNames.REFS_USERS + "${" + RefPattern.USERID_SHARDED + "}",
-        Permission.READ,
-        false,
-        REGISTERED_USERS);
-
-    // fetch user branch using refs/users/YY/XXXXXXX
-    fetch(allUsersRepo, userRefName + ":userRef");
-    Ref userRef = allUsersRepo.getRepository().exactRef("userRef");
-    assertThat(userRef).isNotNull();
-
-    // fetch user branch using refs/users/self
-    fetch(allUsersRepo, RefNames.REFS_USERS_SELF + ":userSelfRef");
-    Ref userSelfRef = allUsersRepo.getRepository().getRefDatabase().exactRef("userSelfRef");
-    assertThat(userSelfRef).isNotNull();
-    assertThat(userSelfRef.getObjectId()).isEqualTo(userRef.getObjectId());
-
-    accountIndexedCounter.assertNoReindex();
-
-    // fetching user branch of another user fails
-    String otherUserRefName = RefNames.refsUsers(admin.id);
-    exception.expect(TransportException.class);
-    exception.expectMessage("Remote does not have " + otherUserRefName + " available for fetch.");
-    fetch(allUsersRepo, otherUserRefName + ":otherUserRef");
-  }
-
-  @Test
-  public void pushToUserBranch() throws Exception {
-    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
-    fetch(allUsersRepo, RefNames.refsUsers(admin.id) + ":userRef");
-    allUsersRepo.reset("userRef");
-    PushOneCommit push = pushFactory.create(db, admin.getIdent(), allUsersRepo);
-    push.to(RefNames.refsUsers(admin.id)).assertOkStatus();
-    accountIndexedCounter.assertReindexOf(admin);
-
-    push = pushFactory.create(db, admin.getIdent(), allUsersRepo);
-    push.to(RefNames.REFS_USERS_SELF).assertOkStatus();
-    accountIndexedCounter.assertReindexOf(admin);
-  }
-
-  @Test
-  public void pushToUserBranchForReview() throws Exception {
-    String userRefName = RefNames.refsUsers(admin.id);
-    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
-    fetch(allUsersRepo, userRefName + ":userRef");
-    allUsersRepo.reset("userRef");
-    PushOneCommit push = pushFactory.create(db, admin.getIdent(), allUsersRepo);
-    PushOneCommit.Result r = push.to(MagicBranch.NEW_CHANGE + userRefName);
-    r.assertOkStatus();
-    accountIndexedCounter.assertNoReindex();
-    assertThat(r.getChange().change().getDest().get()).isEqualTo(userRefName);
-    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve());
-    gApi.changes().id(r.getChangeId()).current().submit();
-    accountIndexedCounter.assertReindexOf(admin);
-
-    push = pushFactory.create(db, admin.getIdent(), allUsersRepo);
-    r = push.to(MagicBranch.NEW_CHANGE + RefNames.REFS_USERS_SELF);
-    r.assertOkStatus();
-    accountIndexedCounter.assertNoReindex();
-    assertThat(r.getChange().change().getDest().get()).isEqualTo(userRefName);
-    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve());
-    gApi.changes().id(r.getChangeId()).current().submit();
-    accountIndexedCounter.assertReindexOf(admin);
-  }
-
-  @Test
-  public void pushAccountConfigToUserBranchForReviewAndSubmit() throws Exception {
-    String userRef = RefNames.refsUsers(admin.id);
-    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
-    fetch(allUsersRepo, userRef + ":userRef");
-    allUsersRepo.reset("userRef");
-
-    Config ac = getAccountConfig(allUsersRepo);
-    ac.setString(AccountConfig.ACCOUNT, null, AccountConfig.KEY_STATUS, "out-of-office");
-
-    PushOneCommit.Result r =
-        pushFactory
-            .create(
-                db,
-                admin.getIdent(),
-                allUsersRepo,
-                "Update account config",
-                AccountConfig.ACCOUNT_CONFIG,
-                ac.toText())
-            .to(MagicBranch.NEW_CHANGE + userRef);
-    r.assertOkStatus();
-    accountIndexedCounter.assertNoReindex();
-    assertThat(r.getChange().change().getDest().get()).isEqualTo(userRef);
-
-    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve());
-    gApi.changes().id(r.getChangeId()).current().submit();
-    accountIndexedCounter.assertReindexOf(admin);
-
-    AccountInfo info = gApi.accounts().self().get();
-    assertThat(info.email).isEqualTo(admin.email);
-    assertThat(info.name).isEqualTo(admin.fullName);
-    assertThat(info.status).isEqualTo("out-of-office");
-  }
-
-  @Test
-  public void pushAccountConfigWithPrefEmailThatDoesNotExistAsExtIdToUserBranchForReviewAndSubmit()
-      throws Exception {
-    TestAccount foo = accountCreator.create(name("foo"), name("foo") + "@example.com", "Foo");
-    String userRef = RefNames.refsUsers(foo.id);
-    accountIndexedCounter.clear();
-
-    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers, foo);
-    fetch(allUsersRepo, userRef + ":userRef");
-    allUsersRepo.reset("userRef");
-
-    String email = "some.email@example.com";
-    Config ac = getAccountConfig(allUsersRepo);
-    ac.setString(AccountConfig.ACCOUNT, null, AccountConfig.KEY_PREFERRED_EMAIL, email);
-
-    PushOneCommit.Result r =
-        pushFactory
-            .create(
-                db,
-                foo.getIdent(),
-                allUsersRepo,
-                "Update account config",
-                AccountConfig.ACCOUNT_CONFIG,
-                ac.toText())
-            .to(MagicBranch.NEW_CHANGE + userRef);
-    r.assertOkStatus();
-    accountIndexedCounter.assertNoReindex();
-    assertThat(r.getChange().change().getDest().get()).isEqualTo(userRef);
-
-    setApiUser(foo);
-    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve());
-    gApi.changes().id(r.getChangeId()).current().submit();
-
-    accountIndexedCounter.assertReindexOf(foo);
-
-    AccountInfo info = gApi.accounts().self().get();
-    assertThat(info.email).isEqualTo(email);
-    assertThat(info.name).isEqualTo(foo.fullName);
-  }
-
-  @Test
-  public void pushAccountConfigToUserBranchForReviewIsRejectedOnSubmitIfConfigIsInvalid()
-      throws Exception {
-    String userRef = RefNames.refsUsers(admin.id);
-    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
-    fetch(allUsersRepo, userRef + ":userRef");
-    allUsersRepo.reset("userRef");
-
-    PushOneCommit.Result r =
-        pushFactory
-            .create(
-                db,
-                admin.getIdent(),
-                allUsersRepo,
-                "Update account config",
-                AccountConfig.ACCOUNT_CONFIG,
-                "invalid config")
-            .to(MagicBranch.NEW_CHANGE + userRef);
-    r.assertOkStatus();
-    accountIndexedCounter.assertNoReindex();
-    assertThat(r.getChange().change().getDest().get()).isEqualTo(userRef);
-
-    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve());
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage(
-        String.format(
-            "invalid account configuration: commit '%s' has an invalid '%s' file for account '%s':"
-                + " Invalid config file %s in commit %s",
-            r.getCommit().name(),
-            AccountConfig.ACCOUNT_CONFIG,
-            admin.id,
-            AccountConfig.ACCOUNT_CONFIG,
-            r.getCommit().name()));
-    gApi.changes().id(r.getChangeId()).current().submit();
-  }
-
-  @Test
-  public void pushAccountConfigToUserBranchForReviewIsRejectedOnSubmitIfPreferredEmailIsInvalid()
-      throws Exception {
-    String userRef = RefNames.refsUsers(admin.id);
-    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
-    fetch(allUsersRepo, userRef + ":userRef");
-    allUsersRepo.reset("userRef");
-
-    String noEmail = "no.email";
-    Config ac = getAccountConfig(allUsersRepo);
-    ac.setString(AccountConfig.ACCOUNT, null, AccountConfig.KEY_PREFERRED_EMAIL, noEmail);
-
-    PushOneCommit.Result r =
-        pushFactory
-            .create(
-                db,
-                admin.getIdent(),
-                allUsersRepo,
-                "Update account config",
-                AccountConfig.ACCOUNT_CONFIG,
-                ac.toText())
-            .to(MagicBranch.NEW_CHANGE + userRef);
-    r.assertOkStatus();
-    accountIndexedCounter.assertNoReindex();
-    assertThat(r.getChange().change().getDest().get()).isEqualTo(userRef);
-
-    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve());
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage(
-        String.format(
-            "invalid account configuration: invalid preferred email '%s' for account '%s'",
-            noEmail, admin.id));
-    gApi.changes().id(r.getChangeId()).current().submit();
-  }
-
-  @Test
-  public void pushAccountConfigToUserBranchForReviewIsRejectedOnSubmitIfOwnAccountIsDeactivated()
-      throws Exception {
-    String userRef = RefNames.refsUsers(admin.id);
-    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
-    fetch(allUsersRepo, userRef + ":userRef");
-    allUsersRepo.reset("userRef");
-
-    Config ac = getAccountConfig(allUsersRepo);
-    ac.setBoolean(AccountConfig.ACCOUNT, null, AccountConfig.KEY_ACTIVE, false);
-
-    PushOneCommit.Result r =
-        pushFactory
-            .create(
-                db,
-                admin.getIdent(),
-                allUsersRepo,
-                "Update account config",
-                AccountConfig.ACCOUNT_CONFIG,
-                ac.toText())
-            .to(MagicBranch.NEW_CHANGE + userRef);
-    r.assertOkStatus();
-    accountIndexedCounter.assertNoReindex();
-    assertThat(r.getChange().change().getDest().get()).isEqualTo(userRef);
-
-    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve());
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("invalid account configuration: cannot deactivate own account");
-    gApi.changes().id(r.getChangeId()).current().submit();
-  }
-
-  @Test
-  @Sandboxed
-  public void pushAccountConfigToUserBranchForReviewDeactivateOtherAccount() throws Exception {
-    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
-
-    TestAccount foo = accountCreator.create(name("foo"));
-    assertThat(gApi.accounts().id(foo.id.get()).getActive()).isTrue();
-    String userRef = RefNames.refsUsers(foo.id);
-    accountIndexedCounter.clear();
-
-    InternalGroup adminGroup =
-        groupCache.get(new AccountGroup.NameKey("Administrators")).orElse(null);
-    grant(allUsers, userRef, Permission.PUSH, false, adminGroup.getGroupUUID());
-    grantLabel("Code-Review", -2, 2, allUsers, userRef, false, adminGroup.getGroupUUID(), false);
-    grant(allUsers, userRef, Permission.SUBMIT, false, adminGroup.getGroupUUID());
-
-    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
-    fetch(allUsersRepo, userRef + ":userRef");
-    allUsersRepo.reset("userRef");
-
-    Config ac = getAccountConfig(allUsersRepo);
-    ac.setBoolean(AccountConfig.ACCOUNT, null, AccountConfig.KEY_ACTIVE, false);
-
-    PushOneCommit.Result r =
-        pushFactory
-            .create(
-                db,
-                admin.getIdent(),
-                allUsersRepo,
-                "Update account config",
-                AccountConfig.ACCOUNT_CONFIG,
-                ac.toText())
-            .to(MagicBranch.NEW_CHANGE + userRef);
-    r.assertOkStatus();
-    accountIndexedCounter.assertNoReindex();
-    assertThat(r.getChange().change().getDest().get()).isEqualTo(userRef);
-
-    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve());
-    gApi.changes().id(r.getChangeId()).current().submit();
-    accountIndexedCounter.assertReindexOf(foo);
-
-    assertThat(gApi.accounts().id(foo.id.get()).getActive()).isFalse();
-  }
-
-  @Test
-  public void pushWatchConfigToUserBranch() throws Exception {
-    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
-    fetch(allUsersRepo, RefNames.refsUsers(admin.id) + ":userRef");
-    allUsersRepo.reset("userRef");
-
-    Config wc = new Config();
-    wc.setString(
-        WatchConfig.PROJECT,
-        project.get(),
-        WatchConfig.KEY_NOTIFY,
-        WatchConfig.NotifyValue.create(null, EnumSet.of(NotifyType.ALL_COMMENTS)).toString());
-    PushOneCommit push =
-        pushFactory.create(
-            db,
-            admin.getIdent(),
-            allUsersRepo,
-            "Add project watch",
-            WatchConfig.WATCH_CONFIG,
-            wc.toText());
-    push.to(RefNames.REFS_USERS_SELF).assertOkStatus();
-    accountIndexedCounter.assertReindexOf(admin);
-
-    String invalidNotifyValue = "]invalid[";
-    wc.setString(WatchConfig.PROJECT, project.get(), WatchConfig.KEY_NOTIFY, invalidNotifyValue);
-    push =
-        pushFactory.create(
-            db,
-            admin.getIdent(),
-            allUsersRepo,
-            "Add invalid project watch",
-            WatchConfig.WATCH_CONFIG,
-            wc.toText());
-    PushOneCommit.Result r = push.to(RefNames.REFS_USERS_SELF);
-    r.assertErrorStatus("invalid watch configuration");
-    r.assertMessage(
-        String.format(
-            "%s: Invalid project watch of account %d for project %s: %s",
-            WatchConfig.WATCH_CONFIG, admin.getId().get(), project.get(), invalidNotifyValue));
-  }
-
-  @Test
-  public void pushAccountConfigToUserBranch() throws Exception {
-    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
-    fetch(allUsersRepo, RefNames.refsUsers(admin.id) + ":userRef");
-    allUsersRepo.reset("userRef");
-
-    Config ac = getAccountConfig(allUsersRepo);
-    ac.setString(AccountConfig.ACCOUNT, null, AccountConfig.KEY_STATUS, "out-of-office");
-
-    pushFactory
-        .create(
-            db,
-            admin.getIdent(),
-            allUsersRepo,
-            "Update account config",
-            AccountConfig.ACCOUNT_CONFIG,
-            ac.toText())
-        .to(RefNames.REFS_USERS_SELF)
-        .assertOkStatus();
-    accountIndexedCounter.assertReindexOf(admin);
-
-    AccountInfo info = gApi.accounts().self().get();
-    assertThat(info.email).isEqualTo(admin.email);
-    assertThat(info.name).isEqualTo(admin.fullName);
-    assertThat(info.status).isEqualTo("out-of-office");
-  }
-
-  @Test
-  public void pushAccountConfigToUserBranchIsRejectedIfConfigIsInvalid() throws Exception {
-    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
-    fetch(allUsersRepo, RefNames.refsUsers(admin.id) + ":userRef");
-    allUsersRepo.reset("userRef");
-
-    PushOneCommit.Result r =
-        pushFactory
-            .create(
-                db,
-                admin.getIdent(),
-                allUsersRepo,
-                "Update account config",
-                AccountConfig.ACCOUNT_CONFIG,
-                "invalid config")
-            .to(RefNames.REFS_USERS_SELF);
-    r.assertErrorStatus("invalid account configuration");
-    r.assertMessage(
-        String.format(
-            "commit '%s' has an invalid '%s' file for account '%s':"
-                + " Invalid config file %s in commit %s",
-            r.getCommit().name(),
-            AccountConfig.ACCOUNT_CONFIG,
-            admin.id,
-            AccountConfig.ACCOUNT_CONFIG,
-            r.getCommit().name()));
-    accountIndexedCounter.assertNoReindex();
-  }
-
-  @Test
-  public void pushAccountConfigToUserBranchIsRejectedIfPreferredEmailIsInvalid() throws Exception {
-    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
-    fetch(allUsersRepo, RefNames.refsUsers(admin.id) + ":userRef");
-    allUsersRepo.reset("userRef");
-
-    String noEmail = "no.email";
-    Config ac = getAccountConfig(allUsersRepo);
-    ac.setString(AccountConfig.ACCOUNT, null, AccountConfig.KEY_PREFERRED_EMAIL, noEmail);
-
-    PushOneCommit.Result r =
-        pushFactory
-            .create(
-                db,
-                admin.getIdent(),
-                allUsersRepo,
-                "Update account config",
-                AccountConfig.ACCOUNT_CONFIG,
-                ac.toText())
-            .to(RefNames.REFS_USERS_SELF);
-    r.assertErrorStatus("invalid account configuration");
-    r.assertMessage(
-        String.format("invalid preferred email '%s' for account '%s'", noEmail, admin.id));
-    accountIndexedCounter.assertNoReindex();
-  }
-
-  @Test
-  public void pushAccountConfigToUserBranchInvalidPreferredEmailButNotChanged() throws Exception {
-    TestAccount foo = accountCreator.create(name("foo"), name("foo") + "@example.com", "Foo");
-    String userRef = RefNames.refsUsers(foo.id);
-
-    String noEmail = "no.email";
-    accountsUpdate.create().update(foo.id, a -> a.setPreferredEmail(noEmail));
-    accountIndexedCounter.clear();
-
-    grant(allUsers, userRef, Permission.PUSH, false, REGISTERED_USERS);
-    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers, foo);
-    fetch(allUsersRepo, userRef + ":userRef");
-    allUsersRepo.reset("userRef");
-
-    String status = "in vacation";
-    Config ac = getAccountConfig(allUsersRepo);
-    ac.setString(AccountConfig.ACCOUNT, null, AccountConfig.KEY_STATUS, status);
-
-    pushFactory
-        .create(
-            db,
-            foo.getIdent(),
-            allUsersRepo,
-            "Update account config",
-            AccountConfig.ACCOUNT_CONFIG,
-            ac.toText())
-        .to(userRef)
-        .assertOkStatus();
-    accountIndexedCounter.assertReindexOf(foo);
-
-    AccountInfo info = gApi.accounts().id(foo.id.get()).get();
-    assertThat(info.email).isEqualTo(noEmail);
-    assertThat(info.name).isEqualTo(foo.fullName);
-    assertThat(info.status).isEqualTo(status);
-  }
-
-  @Test
-  public void pushAccountConfigToUserBranchIfPreferredEmailDoesNotExistAsExtId() throws Exception {
-    TestAccount foo = accountCreator.create(name("foo"), name("foo") + "@example.com", "Foo");
-    String userRef = RefNames.refsUsers(foo.id);
-    accountIndexedCounter.clear();
-
-    InternalGroup adminGroup =
-        groupCache.get(new AccountGroup.NameKey("Administrators")).orElse(null);
-    grant(allUsers, userRef, Permission.PUSH, false, adminGroup.getGroupUUID());
-
-    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers, foo);
-    fetch(allUsersRepo, userRef + ":userRef");
-    allUsersRepo.reset("userRef");
-
-    String email = "some.email@example.com";
-    Config ac = getAccountConfig(allUsersRepo);
-    ac.setString(AccountConfig.ACCOUNT, null, AccountConfig.KEY_PREFERRED_EMAIL, email);
-
-    pushFactory
-        .create(
-            db,
-            foo.getIdent(),
-            allUsersRepo,
-            "Update account config",
-            AccountConfig.ACCOUNT_CONFIG,
-            ac.toText())
-        .to(userRef)
-        .assertOkStatus();
-    accountIndexedCounter.assertReindexOf(foo);
-
-    AccountInfo info = gApi.accounts().id(foo.id.get()).get();
-    assertThat(info.email).isEqualTo(email);
-    assertThat(info.name).isEqualTo(foo.fullName);
-  }
-
-  @Test
-  public void pushAccountConfigToUserBranchIsRejectedIfOwnAccountIsDeactivated() throws Exception {
-    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
-    fetch(allUsersRepo, RefNames.refsUsers(admin.id) + ":userRef");
-    allUsersRepo.reset("userRef");
-
-    Config ac = getAccountConfig(allUsersRepo);
-    ac.setBoolean(AccountConfig.ACCOUNT, null, AccountConfig.KEY_ACTIVE, false);
-
-    PushOneCommit.Result r =
-        pushFactory
-            .create(
-                db,
-                admin.getIdent(),
-                allUsersRepo,
-                "Update account config",
-                AccountConfig.ACCOUNT_CONFIG,
-                ac.toText())
-            .to(RefNames.REFS_USERS_SELF);
-    r.assertErrorStatus("invalid account configuration");
-    r.assertMessage("cannot deactivate own account");
-    accountIndexedCounter.assertNoReindex();
-  }
-
-  @Test
-  @Sandboxed
-  public void pushAccountConfigToUserBranchDeactivateOtherAccount() throws Exception {
-    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
-
-    TestAccount foo = accountCreator.create(name("foo"));
-    assertThat(gApi.accounts().id(foo.id.get()).getActive()).isTrue();
-    String userRef = RefNames.refsUsers(foo.id);
-    accountIndexedCounter.clear();
-
-    InternalGroup adminGroup =
-        groupCache.get(new AccountGroup.NameKey("Administrators")).orElse(null);
-    grant(allUsers, userRef, Permission.PUSH, false, adminGroup.getGroupUUID());
-
-    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
-    fetch(allUsersRepo, userRef + ":userRef");
-    allUsersRepo.reset("userRef");
-
-    Config ac = getAccountConfig(allUsersRepo);
-    ac.setBoolean(AccountConfig.ACCOUNT, null, AccountConfig.KEY_ACTIVE, false);
-
-    pushFactory
-        .create(
-            db,
-            admin.getIdent(),
-            allUsersRepo,
-            "Update account config",
-            AccountConfig.ACCOUNT_CONFIG,
-            ac.toText())
-        .to(userRef)
-        .assertOkStatus();
-    accountIndexedCounter.assertReindexOf(foo);
-
-    assertThat(gApi.accounts().id(foo.id.get()).getActive()).isFalse();
-  }
-
-  @Test
-  @Sandboxed
-  public void cannotCreateUserBranch() throws Exception {
-    grant(allUsers, RefNames.REFS_USERS + "*", Permission.CREATE);
-    grant(allUsers, RefNames.REFS_USERS + "*", Permission.PUSH);
-
-    String userRef = RefNames.refsUsers(new Account.Id(seq.nextAccountId()));
-    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
-    PushOneCommit.Result r = pushFactory.create(db, admin.getIdent(), allUsersRepo).to(userRef);
-    r.assertErrorStatus();
-    assertThat(r.getMessage()).contains("Not allowed to create user branch.");
-
-    try (Repository repo = repoManager.openRepository(allUsers)) {
-      assertThat(repo.exactRef(userRef)).isNull();
-    }
-  }
-
-  @Test
-  @Sandboxed
-  public void createUserBranchWithAccessDatabaseCapability() throws Exception {
-    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
-    grant(allUsers, RefNames.REFS_USERS + "*", Permission.CREATE);
-    grant(allUsers, RefNames.REFS_USERS + "*", Permission.PUSH);
-
-    String userRef = RefNames.refsUsers(new Account.Id(seq.nextAccountId()));
-    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
-    pushFactory.create(db, admin.getIdent(), allUsersRepo).to(userRef).assertOkStatus();
-
-    try (Repository repo = repoManager.openRepository(allUsers)) {
-      assertThat(repo.exactRef(userRef)).isNotNull();
-    }
-  }
-
-  @Test
-  @Sandboxed
-  public void cannotCreateNonUserBranchUnderRefsUsersWithAccessDatabaseCapability()
-      throws Exception {
-    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
-    grant(allUsers, RefNames.REFS_USERS + "*", Permission.CREATE);
-    grant(allUsers, RefNames.REFS_USERS + "*", Permission.PUSH);
-
-    String userRef = RefNames.REFS_USERS + "foo";
-    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
-    PushOneCommit.Result r = pushFactory.create(db, admin.getIdent(), allUsersRepo).to(userRef);
-    r.assertErrorStatus();
-    assertThat(r.getMessage()).contains("Not allowed to create non-user branch under refs/users/.");
-
-    try (Repository repo = repoManager.openRepository(allUsers)) {
-      assertThat(repo.exactRef(userRef)).isNull();
-    }
-  }
-
-  @Test
-  @Sandboxed
-  public void createDefaultUserBranch() throws Exception {
-    try (Repository repo = repoManager.openRepository(allUsers)) {
-      assertThat(repo.exactRef(RefNames.REFS_USERS_DEFAULT)).isNull();
-    }
-
-    grant(allUsers, RefNames.REFS_USERS_DEFAULT, Permission.CREATE);
-    grant(allUsers, RefNames.REFS_USERS_DEFAULT, Permission.PUSH);
-
-    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
-    pushFactory
-        .create(db, admin.getIdent(), allUsersRepo)
-        .to(RefNames.REFS_USERS_DEFAULT)
-        .assertOkStatus();
-
-    try (Repository repo = repoManager.openRepository(allUsers)) {
-      assertThat(repo.exactRef(RefNames.REFS_USERS_DEFAULT)).isNotNull();
-    }
-  }
-
-  @Test
-  @Sandboxed
-  public void cannotDeleteUserBranch() throws Exception {
-    grant(
-        allUsers,
-        RefNames.REFS_USERS + "${" + RefPattern.USERID_SHARDED + "}",
-        Permission.DELETE,
-        true,
-        REGISTERED_USERS);
-
-    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
-    String userRef = RefNames.refsUsers(admin.id);
-    PushResult r = deleteRef(allUsersRepo, userRef);
-    RemoteRefUpdate refUpdate = r.getRemoteUpdate(userRef);
-    assertThat(refUpdate.getStatus()).isEqualTo(RemoteRefUpdate.Status.REJECTED_OTHER_REASON);
-    assertThat(refUpdate.getMessage()).contains("Not allowed to delete user branch.");
-
-    try (Repository repo = repoManager.openRepository(allUsers)) {
-      assertThat(repo.exactRef(userRef)).isNotNull();
-    }
-  }
-
-  @Test
-  @Sandboxed
-  public void deleteUserBranchWithAccessDatabaseCapability() throws Exception {
-    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
-    grant(
-        allUsers,
-        RefNames.REFS_USERS + "${" + RefPattern.USERID_SHARDED + "}",
-        Permission.DELETE,
-        true,
-        REGISTERED_USERS);
-
-    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
-    String userRef = RefNames.refsUsers(admin.id);
-    PushResult r = deleteRef(allUsersRepo, userRef);
-    RemoteRefUpdate refUpdate = r.getRemoteUpdate(userRef);
-    assertThat(refUpdate.getStatus()).isEqualTo(RemoteRefUpdate.Status.OK);
-
-    try (Repository repo = repoManager.openRepository(allUsers)) {
-      assertThat(repo.exactRef(userRef)).isNull();
-    }
-
-    assertThat(accountCache.getOrNull(admin.id)).isNull();
-    assertThat(accountQueryProvider.get().byDefault(admin.id.toString())).isEmpty();
-  }
-
-  @Test
-  public void addGpgKey() throws Exception {
-    TestKey key = validKeyWithoutExpiration();
-    String id = key.getKeyIdString();
-    addExternalIdEmail(admin, "test1@example.com");
-
-    assertKeyMapContains(key, addGpgKey(key.getPublicKeyArmored()));
-    assertKeys(key);
-
-    setApiUser(user);
-    exception.expect(ResourceNotFoundException.class);
-    exception.expectMessage(id);
-    gApi.accounts().self().gpgKey(id).get();
-  }
-
-  @Test
-  public void reAddExistingGpgKey() throws Exception {
-    addExternalIdEmail(admin, "test5@example.com");
-    TestKey key = validKeyWithSecondUserId();
-    String id = key.getKeyIdString();
-    PGPPublicKey pk = key.getPublicKey();
-
-    GpgKeyInfo info = addGpgKey(armor(pk)).get(id);
-    assertThat(info.userIds).hasSize(2);
-    assertIteratorSize(2, getOnlyKeyFromStore(key).getUserIDs());
-
-    pk = PGPPublicKey.removeCertification(pk, "foo:myId");
-    info = addGpgKey(armor(pk)).get(id);
-    assertThat(info.userIds).hasSize(1);
-    assertIteratorSize(1, getOnlyKeyFromStore(key).getUserIDs());
-  }
-
-  @Test
-  public void addOtherUsersGpgKey_Conflict() throws Exception {
-    // Both users have a matching external ID for this key.
-    addExternalIdEmail(admin, "test5@example.com");
-    externalIdsUpdate.insert(ExternalId.create("foo", "myId", user.getId()));
-    accountIndexedCounter.assertReindexOf(user);
-
-    TestKey key = validKeyWithSecondUserId();
-    addGpgKey(key.getPublicKeyArmored());
-    setApiUser(user);
-
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("GPG key already associated with another account");
-    addGpgKey(key.getPublicKeyArmored());
-  }
-
-  @Test
-  public void listGpgKeys() throws Exception {
-    List<TestKey> keys = allValidKeys();
-    List<String> toAdd = new ArrayList<>(keys.size());
-    for (TestKey key : keys) {
-      addExternalIdEmail(admin, PushCertificateIdent.parse(key.getFirstUserId()).getEmailAddress());
-      toAdd.add(key.getPublicKeyArmored());
-    }
-    gApi.accounts().self().putGpgKeys(toAdd, ImmutableList.<String>of());
-    assertKeys(keys);
-    accountIndexedCounter.assertReindexOf(admin);
-  }
-
-  @Test
-  public void deleteGpgKey() throws Exception {
-    TestKey key = validKeyWithoutExpiration();
-    String id = key.getKeyIdString();
-    addExternalIdEmail(admin, "test1@example.com");
-    addGpgKey(key.getPublicKeyArmored());
-    assertKeys(key);
-
-    gApi.accounts().self().gpgKey(id).delete();
-    accountIndexedCounter.assertReindexOf(admin);
-    assertKeys();
-
-    exception.expect(ResourceNotFoundException.class);
-    exception.expectMessage(id);
-    gApi.accounts().self().gpgKey(id).get();
-  }
-
-  @Test
-  public void addAndRemoveGpgKeys() throws Exception {
-    for (TestKey key : allValidKeys()) {
-      addExternalIdEmail(admin, PushCertificateIdent.parse(key.getFirstUserId()).getEmailAddress());
-    }
-    TestKey key1 = validKeyWithoutExpiration();
-    TestKey key2 = validKeyWithExpiration();
-    TestKey key5 = validKeyWithSecondUserId();
-
-    Map<String, GpgKeyInfo> infos =
-        gApi.accounts()
-            .self()
-            .putGpgKeys(
-                ImmutableList.of(key1.getPublicKeyArmored(), key2.getPublicKeyArmored()),
-                ImmutableList.of(key5.getKeyIdString()));
-    assertThat(infos.keySet()).containsExactly(key1.getKeyIdString(), key2.getKeyIdString());
-    assertKeys(key1, key2);
-    accountIndexedCounter.assertReindexOf(admin);
-
-    infos =
-        gApi.accounts()
-            .self()
-            .putGpgKeys(
-                ImmutableList.of(key5.getPublicKeyArmored()),
-                ImmutableList.of(key1.getKeyIdString()));
-    assertThat(infos.keySet()).containsExactly(key1.getKeyIdString(), key5.getKeyIdString());
-    assertKeyMapContains(key5, infos);
-    assertThat(infos.get(key1.getKeyIdString()).key).isNull();
-    assertKeys(key2, key5);
-    accountIndexedCounter.assertReindexOf(admin);
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("Cannot both add and delete key: " + keyToString(key2.getPublicKey()));
-    infos =
-        gApi.accounts()
-            .self()
-            .putGpgKeys(
-                ImmutableList.of(key2.getPublicKeyArmored()),
-                ImmutableList.of(key2.getKeyIdString()));
-  }
-
-  @Test
-  public void addMalformedGpgKey() throws Exception {
-    String key = "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\ntest\n-----END PGP PUBLIC KEY BLOCK-----";
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("Failed to parse GPG keys");
-    addGpgKey(key);
-  }
-
-  @Test
-  @UseSsh
-  public void sshKeys() throws Exception {
-    //
-    // The test account should initially have exactly one ssh key
-    List<SshKeyInfo> info = gApi.accounts().self().listSshKeys();
-    assertThat(info).hasSize(1);
-    assertSequenceNumbers(info);
-    SshKeyInfo key = info.get(0);
-    String inital = AccountCreator.publicKey(admin.sshKey, admin.email);
-    assertThat(key.sshPublicKey).isEqualTo(inital);
-    accountIndexedCounter.assertNoReindex();
-
-    // Add a new key
-    String newKey = AccountCreator.publicKey(AccountCreator.genSshKey(), admin.email);
-    gApi.accounts().self().addSshKey(newKey);
-    info = gApi.accounts().self().listSshKeys();
-    assertThat(info).hasSize(2);
-    assertSequenceNumbers(info);
-    accountIndexedCounter.assertReindexOf(admin);
-
-    // Add an existing key (the request succeeds, but the key isn't added again)
-    gApi.accounts().self().addSshKey(inital);
-    info = gApi.accounts().self().listSshKeys();
-    assertThat(info).hasSize(2);
-    assertSequenceNumbers(info);
-    accountIndexedCounter.assertNoReindex();
-
-    // Add another new key
-    String newKey2 = AccountCreator.publicKey(AccountCreator.genSshKey(), admin.email);
-    gApi.accounts().self().addSshKey(newKey2);
-    info = gApi.accounts().self().listSshKeys();
-    assertThat(info).hasSize(3);
-    assertSequenceNumbers(info);
-    accountIndexedCounter.assertReindexOf(admin);
-
-    // Delete second key
-    gApi.accounts().self().deleteSshKey(2);
-    info = gApi.accounts().self().listSshKeys();
-    assertThat(info).hasSize(2);
-    assertThat(info.get(0).seq).isEqualTo(1);
-    assertThat(info.get(1).seq).isEqualTo(3);
-    accountIndexedCounter.assertReindexOf(admin);
-  }
-
-  // reindex is tested by {@link AbstractQueryAccountsTest#reindex}
-  @Test
-  public void reindexPermissions() throws Exception {
-    // admin can reindex any account
-    setApiUser(admin);
-    gApi.accounts().id(user.username).index();
-    accountIndexedCounter.assertReindexOf(user);
-
-    // user can reindex own account
-    setApiUser(user);
-    gApi.accounts().self().index();
-    accountIndexedCounter.assertReindexOf(user);
-
-    // user cannot reindex any account
-    exception.expect(AuthException.class);
-    exception.expectMessage("modify account not permitted");
-    gApi.accounts().id(admin.username).index();
-  }
-
-  @Test
-  @Sandboxed
-  public void checkConsistency() throws Exception {
-    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
-    resetCurrentApiUser();
-
-    // Create an account with a preferred email.
-    String username = name("foo");
-    String email = username + "@example.com";
-    TestAccount account = accountCreator.create(username, email, "Foo Bar");
-
-    ConsistencyCheckInput input = new ConsistencyCheckInput();
-    input.checkAccounts = new CheckAccountsInput();
-    ConsistencyCheckInfo checkInfo = gApi.config().server().checkConsistency(input);
-    assertThat(checkInfo.checkAccountsResult.problems).isEmpty();
-
-    Set<ConsistencyProblemInfo> expectedProblems = new HashSet<>();
-
-    // Delete the external ID for the preferred email. This makes the account inconsistent since it
-    // now doesn't have an external ID for its preferred email.
-    externalIdsUpdate.delete(ExternalId.createEmail(account.getId(), email));
-    expectedProblems.add(
-        new ConsistencyProblemInfo(
-            ConsistencyProblemInfo.Status.ERROR,
-            "Account '"
-                + account.getId().get()
-                + "' has no external ID for its preferred email '"
-                + email
-                + "'"));
-
-    checkInfo = gApi.config().server().checkConsistency(input);
-    assertThat(checkInfo.checkAccountsResult.problems).hasSize(expectedProblems.size());
-    assertThat(checkInfo.checkAccountsResult.problems).containsExactlyElementsIn(expectedProblems);
-  }
-
-  @Test
-  public void internalQueryFindActiveAndInactiveAccounts() throws Exception {
-    String name = name("foo");
-    assertThat(accountQueryProvider.get().byDefault(name)).isEmpty();
-
-    TestAccount foo1 = accountCreator.create(name + "-1");
-    assertThat(gApi.accounts().id(foo1.username).getActive()).isTrue();
-
-    TestAccount foo2 = accountCreator.create(name + "-2");
-    gApi.accounts().id(foo2.username).setActive(false);
-    assertThat(gApi.accounts().id(foo2.username).getActive()).isFalse();
-
-    assertThat(accountQueryProvider.get().byDefault(name)).hasSize(2);
-  }
-
-  @Test
-  public void checkMetaId() throws Exception {
-    // metaId is set when account is loaded
-    assertThat(accounts.get(admin.getId()).getMetaId()).isEqualTo(getMetaId(admin.getId()));
-
-    // metaId is set when account is created
-    AccountsUpdate au = accountsUpdate.create();
-    Account.Id accountId = new Account.Id(seq.nextAccountId());
-    Account account = au.insert(accountId, a -> {});
-    assertThat(account.getMetaId()).isEqualTo(getMetaId(accountId));
-
-    // metaId is set when account is updated
-    Account updatedAccount = au.update(accountId, a -> a.setFullName("foo"));
-    assertThat(account.getMetaId()).isNotEqualTo(updatedAccount.getMetaId());
-    assertThat(updatedAccount.getMetaId()).isEqualTo(getMetaId(accountId));
-
-    // metaId is set when account is replaced
-    Account newAccount = new Account(accountId, TimeUtil.nowTs());
-    au.replace(newAccount);
-    assertThat(updatedAccount.getMetaId()).isNotEqualTo(newAccount.getMetaId());
-    assertThat(newAccount.getMetaId()).isEqualTo(getMetaId(accountId));
-  }
-
-  private EmailInput newEmailInput(String email, boolean noConfirmation) {
-    EmailInput input = new EmailInput();
-    input.email = email;
-    input.noConfirmation = noConfirmation;
-    return input;
-  }
-
-  private EmailInput newEmailInput(String email) {
-    return newEmailInput(email, true);
-  }
-
-  private String getMetaId(Account.Id accountId) throws IOException {
-    try (Repository repo = repoManager.openRepository(allUsers);
-        RevWalk rw = new RevWalk(repo);
-        ObjectReader or = repo.newObjectReader()) {
-      Ref ref = repo.exactRef(RefNames.refsUsers(accountId));
-      return ref != null ? ref.getObjectId().name() : null;
-    }
-  }
-
-  @Test
-  public void createUserWithValidUsername() throws Exception {
-    ImmutableList<String> names =
-        ImmutableList.of(
-            "user@domain",
-            "user-name",
-            "user_name",
-            "1234",
-            "user1234",
-            "1234@domain",
-            "user!+alias{*}#$%&’^=~|@domain");
-    for (String name : names) {
-      gApi.accounts().create(name);
-    }
-  }
-
-  @Test
-  public void createUserWithInvalidUsername() throws Exception {
-    ImmutableList<String> invalidNames =
-        ImmutableList.of(
-            "@", "@foo", "-", "-foo", "_", "_foo", "!", "+", "{", "}", "*", "%", "#", "$", "&", "’",
-            "^", "=", "~");
-    for (String name : invalidNames) {
-      try {
-        gApi.accounts().create(name);
-        fail(String.format("Expected BadRequestException for username [%s]", name));
-      } catch (BadRequestException e) {
-        assertThat(e).hasMessageThat().isEqualTo(String.format("Invalid username '%s'", name));
-      }
-    }
-  }
-
-  @Test
-  public void groups() throws Exception {
-    assertGroups(
-        admin.username, ImmutableList.of("Anonymous Users", "Registered Users", "Administrators"));
-
-    // TODO: update when test user is fixed to be included in "Anonymous Users" and
-    //      "Registered Users" groups
-    assertGroups(user.username, ImmutableList.of());
-
-    String group = createGroup("group");
-    String newUser = createAccount("user1", group);
-    assertGroups(newUser, ImmutableList.of(group));
-  }
-
-  @Test
-  public void updateDisplayName() throws Exception {
-    AccountInput input = new AccountInput();
-    input.username = name("test");
-    input.email = "user@gerrit.com";
-    gApi.accounts().create(input);
-    AuthRequest who = AuthRequest.forEmail(input.email);
-    AuthResult authResult = accountManager.authenticate(who);
-    assertThat(authResult.isNew()).isFalse();
-    AccountInfo info = gApi.accounts().id(input.email).get();
-    assertThat(info.username).isEqualTo(input.username);
-    assertThat(info.email).isEqualTo(input.email);
-    assertThat(info.name).isEqualTo(input.username);
-    who.setDisplayName("Something Else");
-    AuthResult authResult2 = accountManager.authenticate(who);
-    assertThat(authResult2.isNew()).isFalse();
-    assertThat(authResult2.getAccountId()).isEqualTo(authResult.getAccountId());
-    info = gApi.accounts().id(input.email).get();
-    assertThat(info.username).isEqualTo(input.username);
-    assertThat(info.email).isEqualTo(input.email);
-    assertThat(info.name).isEqualTo("Something Else");
-  }
-
-  private void assertGroups(String user, List<String> expected) throws Exception {
-    List<String> actual =
-        gApi.accounts().id(user).getGroups().stream().map(g -> g.name).collect(toList());
-    assertThat(actual).containsExactlyElementsIn(expected);
-  }
-
-  private void assertSequenceNumbers(List<SshKeyInfo> sshKeys) {
-    int seq = 1;
-    for (SshKeyInfo key : sshKeys) {
-      assertThat(key.seq).isEqualTo(seq++);
-    }
-  }
-
-  private PGPPublicKey getOnlyKeyFromStore(TestKey key) throws Exception {
-    try (PublicKeyStore store = publicKeyStoreProvider.get()) {
-      Iterable<PGPPublicKeyRing> keys = store.get(key.getKeyId());
-      assertThat(keys).hasSize(1);
-      return keys.iterator().next().getPublicKey();
-    }
-  }
-
-  private static String armor(PGPPublicKey key) throws Exception {
-    ByteArrayOutputStream out = new ByteArrayOutputStream(4096);
-    try (ArmoredOutputStream aout = new ArmoredOutputStream(out)) {
-      key.encode(aout);
-    }
-    return new String(out.toByteArray(), UTF_8);
-  }
-
-  private static void assertIteratorSize(int size, Iterator<?> it) {
-    List<?> lst = ImmutableList.copyOf(it);
-    assertThat(lst).hasSize(size);
-  }
-
-  private static void assertKeyMapContains(TestKey expected, Map<String, GpgKeyInfo> actualMap) {
-    GpgKeyInfo actual = actualMap.get(expected.getKeyIdString());
-    assertThat(actual).isNotNull();
-    assertThat(actual.id).isNull();
-    actual.id = expected.getKeyIdString();
-    assertKeyEquals(expected, actual);
-  }
-
-  private void assertKeys(TestKey... expectedKeys) throws Exception {
-    assertKeys(Arrays.asList(expectedKeys));
-  }
-
-  private void assertKeys(Iterable<TestKey> expectedKeys) throws Exception {
-    // Check via API.
-    FluentIterable<TestKey> expected = FluentIterable.from(expectedKeys);
-    Map<String, GpgKeyInfo> keyMap = gApi.accounts().self().listGpgKeys();
-    assertThat(keyMap.keySet())
-        .named("keys returned by listGpgKeys()")
-        .containsExactlyElementsIn(expected.transform(TestKey::getKeyIdString));
-
-    for (TestKey key : expected) {
-      assertKeyEquals(key, gApi.accounts().self().gpgKey(key.getKeyIdString()).get());
-      assertKeyEquals(
-          key,
-          gApi.accounts()
-              .self()
-              .gpgKey(Fingerprint.toString(key.getPublicKey().getFingerprint()))
-              .get());
-      assertKeyMapContains(key, keyMap);
-    }
-
-    // Check raw external IDs.
-    Account.Id currAccountId = atrScope.get().getUser().getAccountId();
-    Iterable<String> expectedFps =
-        expected.transform(k -> BaseEncoding.base16().encode(k.getPublicKey().getFingerprint()));
-    Iterable<String> actualFps =
-        externalIds.byAccount(currAccountId, SCHEME_GPGKEY).stream()
-            .map(e -> e.key().id())
-            .collect(toSet());
-    assertThat(actualFps).named("external IDs in database").containsExactlyElementsIn(expectedFps);
-
-    // Check raw stored keys.
-    for (TestKey key : expected) {
-      getOnlyKeyFromStore(key);
-    }
-  }
-
-  private static void assertKeyEquals(TestKey expected, GpgKeyInfo actual) {
-    String id = expected.getKeyIdString();
-    assertThat(actual.id).named(id).isEqualTo(id);
-    assertThat(actual.fingerprint)
-        .named(id)
-        .isEqualTo(Fingerprint.toString(expected.getPublicKey().getFingerprint()));
-    List<String> userIds = ImmutableList.copyOf(expected.getPublicKey().getUserIDs());
-    assertThat(actual.userIds).named(id).containsExactlyElementsIn(userIds);
-    String key = actual.key;
-    assertThat(key).named(id).startsWith("-----BEGIN PGP PUBLIC KEY BLOCK-----\n");
-    assertThat(key).named(id).endsWith("-----END PGP PUBLIC KEY BLOCK-----\n");
-    assertThat(actual.status).isEqualTo(GpgKeyInfo.Status.TRUSTED);
-    assertThat(actual.problems).isEmpty();
-  }
-
-  private void addExternalIdEmail(TestAccount account, String email) throws Exception {
-    checkNotNull(email);
-    externalIdsUpdate.insert(
-        ExternalId.createWithEmail(name("test"), email, account.getId(), email));
-    accountIndexedCounter.assertReindexOf(account);
-    setApiUser(account);
-  }
-
-  private Map<String, GpgKeyInfo> addGpgKey(String armored) throws Exception {
-    Map<String, GpgKeyInfo> gpgKeys =
-        gApi.accounts().self().putGpgKeys(ImmutableList.of(armored), ImmutableList.<String>of());
-    accountIndexedCounter.assertReindexOf(gApi.accounts().self().get());
-    return gpgKeys;
-  }
-
-  private void assertUser(AccountInfo info, TestAccount account) throws Exception {
-    assertThat(info.name).isEqualTo(account.fullName);
-    assertThat(info.email).isEqualTo(account.email);
-    assertThat(info.username).isEqualTo(account.username);
-    assertThat(info.status).isEqualTo(account.status);
-  }
-
-  private Set<String> getEmails() throws RestApiException {
-    return gApi.accounts().self().getEmails().stream().map(e -> e.email).collect(toSet());
-  }
-
-  private void assertEmail(Set<Account.Id> accounts, TestAccount expectedAccount) {
-    assertThat(accounts).hasSize(1);
-    assertThat(Iterables.getOnlyElement(accounts)).isEqualTo(expectedAccount.getId());
-  }
-
-  private Config getAccountConfig(TestRepository<?> allUsersRepo) throws Exception {
-    Config ac = new Config();
-    try (TreeWalk tw =
-        TreeWalk.forPath(
-            allUsersRepo.getRepository(),
-            AccountConfig.ACCOUNT_CONFIG,
-            getHead(allUsersRepo.getRepository()).getTree())) {
-      assertThat(tw).isNotNull();
-      ac.fromText(
-          new String(
-              allUsersRepo
-                  .getRevWalk()
-                  .getObjectReader()
-                  .open(tw.getObjectId(0), OBJ_BLOB)
-                  .getBytes(),
-              UTF_8));
-    }
-    return ac;
-  }
-
-  private static class AccountIndexedCounter implements AccountIndexedListener {
-    private final AtomicLongMap<Integer> countsByAccount = AtomicLongMap.create();
-
-    @Override
-    public void onAccountIndexed(int id) {
-      countsByAccount.incrementAndGet(id);
-    }
-
-    void clear() {
-      countsByAccount.clear();
-    }
-
-    long getCount(Account.Id accountId) {
-      return countsByAccount.get(accountId.get());
-    }
-
-    void assertReindexOf(TestAccount testAccount) {
-      assertReindexOf(testAccount, 1);
-    }
-
-    void assertReindexOf(AccountInfo accountInfo) {
-      assertReindexOf(new Account.Id(accountInfo._accountId), 1);
-    }
-
-    void assertReindexOf(TestAccount testAccount, int expectedCount) {
-      assertThat(getCount(testAccount.id)).isEqualTo(expectedCount);
-      assertThat(countsByAccount).hasSize(1);
-      clear();
-    }
-
-    void assertReindexOf(Account.Id accountId, int expectedCount) {
-      assertThat(getCount(accountId)).isEqualTo(expectedCount);
-      countsByAccount.remove(accountId.get());
-    }
-
-    void assertNoReindex() {
-      assertThat(countsByAccount).isEmpty();
-    }
-  }
-
-  private static class RefUpdateCounter implements GitReferenceUpdatedListener {
-    private final AtomicLongMap<String> countsByProjectRefs = AtomicLongMap.create();
-
-    static String projectRef(Project.NameKey project, String ref) {
-      return projectRef(project.get(), ref);
-    }
-
-    static String projectRef(String project, String ref) {
-      return project + ":" + ref;
-    }
-
-    @Override
-    public void onGitReferenceUpdated(Event event) {
-      countsByProjectRefs.incrementAndGet(projectRef(event.getProjectName(), event.getRefName()));
-    }
-
-    void clear() {
-      countsByProjectRefs.clear();
-    }
-
-    long getCount(String projectRef) {
-      return countsByProjectRefs.get(projectRef);
-    }
-
-    void assertRefUpdateFor(String... projectRefs) {
-      Map<String, Integer> expectedRefUpdateCounts = new HashMap<>();
-      for (String projectRef : projectRefs) {
-        expectedRefUpdateCounts.put(projectRef, 1);
-      }
-      assertRefUpdateFor(expectedRefUpdateCounts);
-    }
-
-    void assertRefUpdateFor(Map<String, Integer> expectedProjectRefUpdateCounts) {
-      for (Map.Entry<String, Integer> e : expectedProjectRefUpdateCounts.entrySet()) {
-        assertThat(getCount(e.getKey())).isEqualTo(e.getValue());
-      }
-      assertThat(countsByProjectRefs).hasSize(expectedProjectRefUpdateCounts.size());
-      clear();
-    }
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/AgreementsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/AgreementsIT.java
deleted file mode 100644
index 10acae4..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/AgreementsIT.java
+++ /dev/null
@@ -1,262 +0,0 @@
-// 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.
-
-package com.google.gerrit.acceptance.api.accounts;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.TruthJUnit.assume;
-import static java.util.concurrent.TimeUnit.SECONDS;
-import static org.junit.Assert.fail;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.common.data.ContributorAgreement;
-import com.google.gerrit.extensions.api.changes.CherryPickInput;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.api.changes.SubmitInput;
-import com.google.gerrit.extensions.api.projects.BranchInfo;
-import com.google.gerrit.extensions.api.projects.BranchInput;
-import com.google.gerrit.extensions.client.InheritableBoolean;
-import com.google.gerrit.extensions.common.AgreementInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.ChangeInput;
-import com.google.gerrit.extensions.common.ServerInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.testutil.ConfigSuite;
-import com.google.gerrit.testutil.TestTimeUtil;
-import java.util.List;
-import org.eclipse.jgit.lib.Config;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-public class AgreementsIT extends AbstractDaemonTest {
-  private ContributorAgreement caAutoVerify;
-  private ContributorAgreement caNoAutoVerify;
-
-  @ConfigSuite.Config
-  public static Config enableAgreementsConfig() {
-    Config cfg = new Config();
-    cfg.setBoolean("auth", null, "contributorAgreements", true);
-    return cfg;
-  }
-
-  @BeforeClass
-  public static void setTimeForTesting() {
-    TestTimeUtil.resetWithClockStep(1, SECONDS);
-  }
-
-  @AfterClass
-  public static void restoreTime() {
-    TestTimeUtil.useSystemTime();
-  }
-
-  @Before
-  public void setUp() throws Exception {
-    caAutoVerify = configureContributorAgreement(true);
-    caNoAutoVerify = configureContributorAgreement(false);
-    setApiUser(user);
-  }
-
-  @Test
-  public void getAvailableAgreements() throws Exception {
-    ServerInfo info = gApi.config().server().getInfo();
-    if (isContributorAgreementsEnabled()) {
-      assertThat(info.auth.useContributorAgreements).isTrue();
-      assertThat(info.auth.contributorAgreements).hasSize(2);
-      assertAgreement(info.auth.contributorAgreements.get(0), caAutoVerify);
-      assertAgreement(info.auth.contributorAgreements.get(1), caNoAutoVerify);
-    } else {
-      assertThat(info.auth.useContributorAgreements).isNull();
-      assertThat(info.auth.contributorAgreements).isNull();
-    }
-  }
-
-  @Test
-  public void signNonExistingAgreement() throws Exception {
-    assume().that(isContributorAgreementsEnabled()).isTrue();
-    exception.expect(UnprocessableEntityException.class);
-    exception.expectMessage("contributor agreement not found");
-    gApi.accounts().self().signAgreement("does-not-exist");
-  }
-
-  @Test
-  public void signAgreementNoAutoVerify() throws Exception {
-    assume().that(isContributorAgreementsEnabled()).isTrue();
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("cannot enter a non-autoVerify agreement");
-    gApi.accounts().self().signAgreement(caNoAutoVerify.getName());
-  }
-
-  @Test
-  public void signAgreement() throws Exception {
-    assume().that(isContributorAgreementsEnabled()).isTrue();
-
-    // List of agreements is initially empty
-    List<AgreementInfo> result = gApi.accounts().self().listAgreements();
-    assertThat(result).isEmpty();
-
-    // Sign the agreement
-    gApi.accounts().self().signAgreement(caAutoVerify.getName());
-
-    // Explicitly reset the user to force a new request context
-    setApiUser(user);
-
-    // Verify that the agreement was signed
-    result = gApi.accounts().self().listAgreements();
-    assertThat(result).hasSize(1);
-    AgreementInfo info = result.get(0);
-    assertAgreement(info, caAutoVerify);
-
-    // Signing the same agreement again has no effect
-    gApi.accounts().self().signAgreement(caAutoVerify.getName());
-    result = gApi.accounts().self().listAgreements();
-    assertThat(result).hasSize(1);
-  }
-
-  @Test
-  public void signAgreementAsOtherUser() throws Exception {
-    assume().that(isContributorAgreementsEnabled()).isTrue();
-    assertThat(gApi.accounts().self().get().name).isNotEqualTo("admin");
-    exception.expect(AuthException.class);
-    exception.expectMessage("not allowed to enter contributor agreement");
-    gApi.accounts().id("admin").signAgreement(caAutoVerify.getName());
-  }
-
-  @Test
-  public void signAgreementAnonymous() throws Exception {
-    setApiUserAnonymous();
-    exception.expect(AuthException.class);
-    exception.expectMessage("Authentication required");
-    gApi.accounts().self().signAgreement(caAutoVerify.getName());
-  }
-
-  @Test
-  public void agreementsDisabledSign() throws Exception {
-    assume().that(isContributorAgreementsEnabled()).isFalse();
-    exception.expect(MethodNotAllowedException.class);
-    exception.expectMessage("contributor agreements disabled");
-    gApi.accounts().self().signAgreement(caAutoVerify.getName());
-  }
-
-  @Test
-  public void agreementsDisabledList() throws Exception {
-    assume().that(isContributorAgreementsEnabled()).isFalse();
-    exception.expect(MethodNotAllowedException.class);
-    exception.expectMessage("contributor agreements disabled");
-    gApi.accounts().self().listAgreements();
-  }
-
-  @Test
-  public void revertChangeWithoutCLA() throws Exception {
-    assume().that(isContributorAgreementsEnabled()).isTrue();
-
-    // Create a change succeeds when agreement is not required
-    setUseContributorAgreements(InheritableBoolean.FALSE);
-    ChangeInfo change = gApi.changes().create(newChangeInput()).get();
-
-    // Approve and submit it
-    setApiUser(admin);
-    gApi.changes().id(change.changeId).current().review(ReviewInput.approve());
-    gApi.changes().id(change.changeId).current().submit(new SubmitInput());
-
-    // Revert is not allowed when CLA is required but not signed
-    setApiUser(user);
-    setUseContributorAgreements(InheritableBoolean.TRUE);
-    exception.expect(AuthException.class);
-    exception.expectMessage("A Contributor Agreement must be completed");
-    gApi.changes().id(change.changeId).revert();
-  }
-
-  @Test
-  public void cherrypickChangeWithoutCLA() throws Exception {
-    assume().that(isContributorAgreementsEnabled()).isTrue();
-
-    // Create a new branch
-    setApiUser(admin);
-    BranchInfo dest =
-        gApi.projects()
-            .name(project.get())
-            .branch("cherry-pick-to")
-            .create(new BranchInput())
-            .get();
-
-    // Create a change succeeds when agreement is not required
-    setUseContributorAgreements(InheritableBoolean.FALSE);
-    ChangeInfo change = gApi.changes().create(newChangeInput()).get();
-
-    // Approve and submit it
-    gApi.changes().id(change.changeId).current().review(ReviewInput.approve());
-    gApi.changes().id(change.changeId).current().submit(new SubmitInput());
-
-    // Cherry-pick is not allowed when CLA is required but not signed
-    setApiUser(user);
-    setUseContributorAgreements(InheritableBoolean.TRUE);
-    CherryPickInput in = new CherryPickInput();
-    in.destination = dest.ref;
-    in.message = change.subject;
-    exception.expect(AuthException.class);
-    exception.expectMessage("A Contributor Agreement must be completed");
-    gApi.changes().id(change.changeId).current().cherryPick(in);
-  }
-
-  @Test
-  public void createChangeRespectsCLA() throws Exception {
-    assume().that(isContributorAgreementsEnabled()).isTrue();
-
-    // Create a change succeeds when agreement is not required
-    setUseContributorAgreements(InheritableBoolean.FALSE);
-    gApi.changes().create(newChangeInput());
-
-    // Create a change is not allowed when CLA is required but not signed
-    setUseContributorAgreements(InheritableBoolean.TRUE);
-    try {
-      gApi.changes().create(newChangeInput());
-      fail("Expected AuthException");
-    } catch (AuthException e) {
-      assertThat(e.getMessage()).contains("A Contributor Agreement must be completed");
-    }
-
-    // Sign the agreement
-    gApi.accounts().self().signAgreement(caAutoVerify.getName());
-
-    // Explicitly reset the user to force a new request context
-    setApiUser(user);
-
-    // Create a change succeeds after signing the agreement
-    gApi.changes().create(newChangeInput());
-  }
-
-  private void assertAgreement(AgreementInfo info, ContributorAgreement ca) {
-    assertThat(info.name).isEqualTo(ca.getName());
-    assertThat(info.description).isEqualTo(ca.getDescription());
-    assertThat(info.url).isEqualTo(ca.getAgreementUrl());
-    if (ca.getAutoVerify() != null) {
-      assertThat(info.autoVerifyGroup.name).isEqualTo(ca.getAutoVerify().getName());
-    } else {
-      assertThat(info.autoVerifyGroup).isNull();
-    }
-  }
-
-  private ChangeInput newChangeInput() {
-    ChangeInput in = new ChangeInput();
-    in.branch = "master";
-    in.subject = "test";
-    in.project = project.get();
-    return in;
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/BUILD b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/BUILD
deleted file mode 100644
index 3d62cfc..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/BUILD
+++ /dev/null
@@ -1,10 +0,0 @@
-load("//gerrit-acceptance-tests:tests.bzl", "acceptance_tests")
-
-acceptance_tests(
-    srcs = glob(["*IT.java"]),
-    group = "api_account",
-    labels = [
-        "api",
-        "noci",
-    ],
-)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/DiffPreferencesIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/DiffPreferencesIT.java
deleted file mode 100644
index fcf939d..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/DiffPreferencesIT.java
+++ /dev/null
@@ -1,176 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.acceptance.api.accounts;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.AssertUtil.assertPrefs;
-import static com.google.gerrit.acceptance.GitUtil.fetch;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.acceptance.Sandboxed;
-import com.google.gerrit.extensions.client.DiffPreferencesInfo;
-import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
-import com.google.gerrit.extensions.client.Theme;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.account.VersionedAccountPreferences;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.inject.Inject;
-import org.eclipse.jgit.api.errors.TransportException;
-import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
-import org.eclipse.jgit.junit.TestRepository;
-import org.junit.After;
-import org.junit.Test;
-
-@NoHttpd
-@Sandboxed
-public class DiffPreferencesIT extends AbstractDaemonTest {
-  @Inject private AllUsersName allUsers;
-
-  @After
-  public void cleanUp() throws Exception {
-    gApi.accounts().id(admin.getId().toString()).setDiffPreferences(DiffPreferencesInfo.defaults());
-
-    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
-    try {
-      fetch(allUsersRepo, RefNames.REFS_USERS_DEFAULT + ":defaults");
-    } catch (TransportException e) {
-      if (e.getMessage()
-          .equals(
-              "Remote does not have " + RefNames.REFS_USERS_DEFAULT + " available for fetch.")) {
-        return;
-      }
-      throw e;
-    }
-    allUsersRepo.reset("defaults");
-    PushOneCommit push =
-        pushFactory.create(
-            db,
-            admin.getIdent(),
-            allUsersRepo,
-            "Delete default preferences",
-            VersionedAccountPreferences.PREFERENCES,
-            "");
-    push.rm(RefNames.REFS_USERS_DEFAULT).assertOkStatus();
-  }
-
-  @Test
-  public void getDiffPreferences() throws Exception {
-    DiffPreferencesInfo d = DiffPreferencesInfo.defaults();
-    DiffPreferencesInfo o = gApi.accounts().id(admin.getId().toString()).getDiffPreferences();
-    assertPrefs(o, d);
-  }
-
-  @Test
-  public void setDiffPreferences() throws Exception {
-    DiffPreferencesInfo i = DiffPreferencesInfo.defaults();
-
-    // change all default values
-    i.context *= -1;
-    i.tabSize *= -1;
-    i.fontSize *= -1;
-    i.lineLength *= -1;
-    i.cursorBlinkRate = 500;
-    i.theme = Theme.MIDNIGHT;
-    i.ignoreWhitespace = Whitespace.IGNORE_ALL;
-    i.expandAllComments ^= true;
-    i.intralineDifference ^= true;
-    i.manualReview ^= true;
-    i.retainHeader ^= true;
-    i.showLineEndings ^= true;
-    i.showTabs ^= true;
-    i.showWhitespaceErrors ^= true;
-    i.skipDeleted ^= true;
-    i.skipUnchanged ^= true;
-    i.skipUncommented ^= true;
-    i.syntaxHighlighting ^= true;
-    i.hideTopMenu ^= true;
-    i.autoHideDiffTableHeader ^= true;
-    i.hideLineNumbers ^= true;
-    i.renderEntireFile ^= true;
-    i.hideEmptyPane ^= true;
-    i.matchBrackets ^= true;
-    i.lineWrapping ^= true;
-
-    DiffPreferencesInfo o = gApi.accounts().id(admin.getId().toString()).setDiffPreferences(i);
-    assertPrefs(o, i);
-
-    // Partially fill input record
-    i = new DiffPreferencesInfo();
-    i.tabSize = 42;
-    DiffPreferencesInfo a = gApi.accounts().id(admin.getId().toString()).setDiffPreferences(i);
-    assertPrefs(a, o, "tabSize");
-    assertThat(a.tabSize).isEqualTo(42);
-  }
-
-  @Test
-  public void getDiffPreferencesWithConfiguredDefaults() throws Exception {
-    DiffPreferencesInfo d = DiffPreferencesInfo.defaults();
-    int newLineLength = d.lineLength + 10;
-    int newTabSize = d.tabSize * 2;
-    int newFontSize = d.fontSize - 2;
-    DiffPreferencesInfo update = new DiffPreferencesInfo();
-    update.lineLength = newLineLength;
-    update.tabSize = newTabSize;
-    update.fontSize = newFontSize;
-    gApi.config().server().setDefaultDiffPreferences(update);
-
-    DiffPreferencesInfo o = gApi.accounts().id(admin.getId().toString()).getDiffPreferences();
-
-    // assert configured defaults
-    assertThat(o.lineLength).isEqualTo(newLineLength);
-    assertThat(o.tabSize).isEqualTo(newTabSize);
-    assertThat(o.fontSize).isEqualTo(newFontSize);
-
-    // assert hard-coded defaults
-    assertPrefs(o, d, "lineLength", "tabSize", "fontSize");
-  }
-
-  @Test
-  public void overwriteConfiguredDefaults() throws Exception {
-    DiffPreferencesInfo d = DiffPreferencesInfo.defaults();
-    int configuredDefaultLineLength = d.lineLength + 10;
-    DiffPreferencesInfo update = new DiffPreferencesInfo();
-    update.lineLength = configuredDefaultLineLength;
-    gApi.config().server().setDefaultDiffPreferences(update);
-
-    DiffPreferencesInfo o = gApi.accounts().id(admin.getId().toString()).getDiffPreferences();
-    assertThat(o.lineLength).isEqualTo(configuredDefaultLineLength);
-    assertPrefs(o, d, "lineLength");
-
-    int newLineLength = configuredDefaultLineLength + 10;
-    DiffPreferencesInfo i = new DiffPreferencesInfo();
-    i.lineLength = newLineLength;
-    DiffPreferencesInfo a = gApi.accounts().id(admin.getId().toString()).setDiffPreferences(i);
-    assertThat(a.lineLength).isEqualTo(newLineLength);
-    assertPrefs(a, d, "lineLength");
-
-    a = gApi.accounts().id(admin.getId().toString()).getDiffPreferences();
-    assertThat(a.lineLength).isEqualTo(newLineLength);
-    assertPrefs(a, d, "lineLength");
-
-    // overwrite the configured default with original hard-coded default
-    i = new DiffPreferencesInfo();
-    i.lineLength = d.lineLength;
-    a = gApi.accounts().id(admin.getId().toString()).setDiffPreferences(i);
-    assertThat(a.lineLength).isEqualTo(d.lineLength);
-    assertPrefs(a, d, "lineLength");
-
-    a = gApi.accounts().id(admin.getId().toString()).getDiffPreferences();
-    assertThat(a.lineLength).isEqualTo(d.lineLength);
-    assertPrefs(a, d, "lineLength");
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/GeneralPreferencesIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/GeneralPreferencesIT.java
deleted file mode 100644
index 8bf46d6..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/GeneralPreferencesIT.java
+++ /dev/null
@@ -1,204 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.acceptance.api.accounts;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.AssertUtil.assertPrefs;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.Sandboxed;
-import com.google.gerrit.acceptance.TestAccount;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo.DateFormat;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo.DefaultBase;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo.DiffView;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo.DownloadCommand;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo.EmailFormat;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo.EmailStrategy;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo.ReviewCategoryStrategy;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo.TimeFormat;
-import com.google.gerrit.extensions.client.MenuItem;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.inject.Inject;
-import java.util.ArrayList;
-import java.util.HashMap;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.Repository;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-@NoHttpd
-@Sandboxed
-public class GeneralPreferencesIT extends AbstractDaemonTest {
-  @Inject private AllUsersName allUsers;
-
-  private TestAccount user42;
-
-  @Before
-  public void setUp() throws Exception {
-    String name = name("user42");
-    user42 = accountCreator.create(name, name + "@example.com", "User 42");
-  }
-
-  @After
-  public void cleanUp() throws Exception {
-    gApi.accounts().id(user42.getId().toString()).setPreferences(GeneralPreferencesInfo.defaults());
-
-    try (Repository git = repoManager.openRepository(allUsers)) {
-      if (git.exactRef(RefNames.REFS_USERS_DEFAULT) != null) {
-        RefUpdate u = git.updateRef(RefNames.REFS_USERS_DEFAULT);
-        u.setForceUpdate(true);
-        assertThat(u.delete()).isEqualTo(RefUpdate.Result.FORCED);
-      }
-    }
-    accountCache.evictAllNoReindex();
-  }
-
-  @Test
-  public void getAndSetPreferences() throws Exception {
-    GeneralPreferencesInfo o = gApi.accounts().id(user42.id.toString()).getPreferences();
-    assertPrefs(o, GeneralPreferencesInfo.defaults(), "my", "changeTable");
-    assertThat(o.my)
-        .containsExactly(
-            new MenuItem("Changes", "#/dashboard/self", null),
-            new MenuItem("Draft Comments", "#/q/has:draft", null),
-            new MenuItem("Edits", "#/q/has:edit", null),
-            new MenuItem("Watched Changes", "#/q/is:watched+is:open", null),
-            new MenuItem("Starred Changes", "#/q/is:starred", null),
-            new MenuItem("Groups", "#/groups/self", null));
-    assertThat(o.changeTable).isEmpty();
-
-    GeneralPreferencesInfo i = GeneralPreferencesInfo.defaults();
-
-    // change all default values
-    i.changesPerPage *= -1;
-    i.showSiteHeader ^= true;
-    i.useFlashClipboard ^= true;
-    i.downloadCommand = DownloadCommand.REPO_DOWNLOAD;
-    i.dateFormat = DateFormat.US;
-    i.timeFormat = TimeFormat.HHMM_24;
-    i.emailStrategy = EmailStrategy.DISABLED;
-    i.emailFormat = EmailFormat.PLAINTEXT;
-    i.defaultBaseForMerges = DefaultBase.AUTO_MERGE;
-    i.expandInlineDiffs ^= true;
-    i.highlightAssigneeInChangeTable ^= true;
-    i.relativeDateInChangeTable ^= true;
-    i.sizeBarInChangeTable ^= true;
-    i.legacycidInChangeTable ^= true;
-    i.muteCommonPathPrefixes ^= true;
-    i.signedOffBy ^= true;
-    i.reviewCategoryStrategy = ReviewCategoryStrategy.ABBREV;
-    i.diffView = DiffView.UNIFIED_DIFF;
-    i.my = new ArrayList<>();
-    i.my.add(new MenuItem("name", "url"));
-    i.changeTable = new ArrayList<>();
-    i.changeTable.add("Status");
-    i.urlAliases = new HashMap<>();
-    i.urlAliases.put("foo", "bar");
-
-    o = gApi.accounts().id(user42.getId().toString()).setPreferences(i);
-    assertPrefs(o, i, "my");
-    assertThat(o.my).containsExactlyElementsIn(i.my);
-    assertThat(o.changeTable).containsExactlyElementsIn(i.changeTable);
-  }
-
-  @Test
-  public void getPreferencesWithConfiguredDefaults() throws Exception {
-    GeneralPreferencesInfo d = GeneralPreferencesInfo.defaults();
-    int newChangesPerPage = d.changesPerPage * 2;
-    GeneralPreferencesInfo update = new GeneralPreferencesInfo();
-    update.changesPerPage = newChangesPerPage;
-    gApi.config().server().setDefaultPreferences(update);
-
-    GeneralPreferencesInfo o = gApi.accounts().id(user42.getId().toString()).getPreferences();
-
-    // assert configured defaults
-    assertThat(o.changesPerPage).isEqualTo(newChangesPerPage);
-
-    // assert hard-coded defaults
-    assertPrefs(o, d, "my", "changeTable", "changesPerPage");
-  }
-
-  @Test
-  public void overwriteConfiguredDefaults() throws Exception {
-    GeneralPreferencesInfo d = GeneralPreferencesInfo.defaults();
-    int configuredChangesPerPage = d.changesPerPage * 2;
-    GeneralPreferencesInfo update = new GeneralPreferencesInfo();
-    update.changesPerPage = configuredChangesPerPage;
-    gApi.config().server().setDefaultPreferences(update);
-
-    GeneralPreferencesInfo o = gApi.accounts().id(admin.getId().toString()).getPreferences();
-    assertThat(o.changesPerPage).isEqualTo(configuredChangesPerPage);
-    assertPrefs(o, d, "my", "changeTable", "changesPerPage");
-
-    int newChangesPerPage = configuredChangesPerPage * 2;
-    GeneralPreferencesInfo i = new GeneralPreferencesInfo();
-    i.changesPerPage = newChangesPerPage;
-    GeneralPreferencesInfo a = gApi.accounts().id(admin.getId().toString()).setPreferences(i);
-    assertThat(a.changesPerPage).isEqualTo(newChangesPerPage);
-    assertPrefs(a, d, "my", "changeTable", "changesPerPage");
-
-    a = gApi.accounts().id(admin.getId().toString()).getPreferences();
-    assertThat(a.changesPerPage).isEqualTo(newChangesPerPage);
-    assertPrefs(a, d, "my", "changeTable", "changesPerPage");
-
-    // overwrite the configured default with original hard-coded default
-    i = new GeneralPreferencesInfo();
-    i.changesPerPage = d.changesPerPage;
-    a = gApi.accounts().id(admin.getId().toString()).setPreferences(i);
-    assertThat(a.changesPerPage).isEqualTo(d.changesPerPage);
-    assertPrefs(a, d, "my", "changeTable", "changesPerPage");
-
-    a = gApi.accounts().id(admin.getId().toString()).getPreferences();
-    assertThat(a.changesPerPage).isEqualTo(d.changesPerPage);
-    assertPrefs(a, d, "my", "changeTable", "changesPerPage");
-  }
-
-  @Test
-  public void rejectMyMenuWithoutName() throws Exception {
-    GeneralPreferencesInfo i = GeneralPreferencesInfo.defaults();
-    i.my = new ArrayList<>();
-    i.my.add(new MenuItem(null, "url"));
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("name for menu item is required");
-    gApi.accounts().id(user42.getId().toString()).setPreferences(i);
-  }
-
-  @Test
-  public void rejectMyMenuWithoutUrl() throws Exception {
-    GeneralPreferencesInfo i = GeneralPreferencesInfo.defaults();
-    i.my = new ArrayList<>();
-    i.my.add(new MenuItem("name", null));
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("URL for menu item is required");
-    gApi.accounts().id(user42.getId().toString()).setPreferences(i);
-  }
-
-  @Test
-  public void trimMyMenuInput() throws Exception {
-    GeneralPreferencesInfo i = GeneralPreferencesInfo.defaults();
-    i.my = new ArrayList<>();
-    i.my.add(new MenuItem(" name\t", " url\t", " _blank\t", " id\t"));
-
-    GeneralPreferencesInfo o = gApi.accounts().id(user42.getId().toString()).setPreferences(i);
-    assertThat(o.my).containsExactly(new MenuItem("name", "url", "_blank", "id"));
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/AbandonIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/AbandonIT.java
deleted file mode 100644
index 2c1a5b3..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/AbandonIT.java
+++ /dev/null
@@ -1,183 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.acceptance.api.change;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-import static java.util.concurrent.TimeUnit.HOURS;
-import static java.util.concurrent.TimeUnit.SECONDS;
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.GerritConfig;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.client.ChangeStatus;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.change.AbandonUtil;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.testutil.TestTimeUtil;
-import com.google.inject.Inject;
-import java.util.List;
-import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
-import org.eclipse.jgit.junit.TestRepository;
-import org.junit.Test;
-
-public class AbandonIT extends AbstractDaemonTest {
-  @Inject private AbandonUtil abandonUtil;
-
-  @Test
-  public void abandon() throws Exception {
-    PushOneCommit.Result r = createChange();
-    String changeId = r.getChangeId();
-    assertThat(info(changeId).status).isEqualTo(ChangeStatus.NEW);
-    gApi.changes().id(changeId).abandon();
-    ChangeInfo info = get(changeId);
-    assertThat(info.status).isEqualTo(ChangeStatus.ABANDONED);
-    assertThat(Iterables.getLast(info.messages).message.toLowerCase()).contains("abandoned");
-
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("change is abandoned");
-    gApi.changes().id(changeId).abandon();
-  }
-
-  @Test
-  public void batchAbandon() throws Exception {
-    CurrentUser user = atrScope.get().getUser();
-    PushOneCommit.Result a = createChange();
-    PushOneCommit.Result b = createChange();
-    List<ChangeData> list = ImmutableList.of(a.getChange(), b.getChange());
-    changeAbandoner.batchAbandon(
-        batchUpdateFactory, a.getChange().project(), user, list, "deadbeef");
-
-    ChangeInfo info = get(a.getChangeId());
-    assertThat(info.status).isEqualTo(ChangeStatus.ABANDONED);
-    assertThat(Iterables.getLast(info.messages).message.toLowerCase()).contains("abandoned");
-    assertThat(Iterables.getLast(info.messages).message.toLowerCase()).contains("deadbeef");
-
-    info = get(b.getChangeId());
-    assertThat(info.status).isEqualTo(ChangeStatus.ABANDONED);
-    assertThat(Iterables.getLast(info.messages).message.toLowerCase()).contains("abandoned");
-    assertThat(Iterables.getLast(info.messages).message.toLowerCase()).contains("deadbeef");
-  }
-
-  @Test
-  public void batchAbandonChangeProject() throws Exception {
-    String project1Name = name("Project1");
-    String project2Name = name("Project2");
-    gApi.projects().create(project1Name);
-    gApi.projects().create(project2Name);
-    TestRepository<InMemoryRepository> project1 = cloneProject(new Project.NameKey(project1Name));
-    TestRepository<InMemoryRepository> project2 = cloneProject(new Project.NameKey(project2Name));
-
-    CurrentUser user = atrScope.get().getUser();
-    PushOneCommit.Result a = createChange(project1, "master", "x", "x", "x", "");
-    PushOneCommit.Result b = createChange(project2, "master", "x", "x", "x", "");
-    List<ChangeData> list = ImmutableList.of(a.getChange(), b.getChange());
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage(
-        String.format("Project name \"%s\" doesn't match \"%s\"", project2Name, project1Name));
-    changeAbandoner.batchAbandon(batchUpdateFactory, new Project.NameKey(project1Name), user, list);
-  }
-
-  @Test
-  @GerritConfig(name = "changeCleanup.abandonAfter", value = "1w")
-  public void abandonInactiveOpenChanges() throws Exception {
-    TestTimeUtil.resetWithClockStep(1, SECONDS);
-
-    // create 2 changes which will be abandoned ...
-    int id1 = createChange().getChange().getId().get();
-    int id2 = createChange().getChange().getId().get();
-
-    // ... because they are older than 1 week
-    TestTimeUtil.incrementClock(7 * 24, HOURS);
-
-    // create 1 new change that will not be abandoned
-    ChangeData cd = createChange().getChange();
-    int id3 = cd.getId().get();
-
-    assertThat(toChangeNumbers(query("is:open"))).containsExactly(id1, id2, id3);
-    assertThat(query("is:abandoned")).isEmpty();
-
-    abandonUtil.abandonInactiveOpenChanges(batchUpdateFactory);
-    assertThat(toChangeNumbers(query("is:open"))).containsExactly(id3);
-    assertThat(toChangeNumbers(query("is:abandoned"))).containsExactly(id1, id2);
-  }
-
-  @Test
-  public void abandonNotAllowedWithoutPermission() throws Exception {
-    PushOneCommit.Result r = createChange();
-    String changeId = r.getChangeId();
-    assertThat(info(changeId).status).isEqualTo(ChangeStatus.NEW);
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    exception.expectMessage("abandon not permitted");
-    gApi.changes().id(changeId).abandon();
-  }
-
-  @Test
-  public void abandonAndRestoreAllowedWithPermission() throws Exception {
-    PushOneCommit.Result r = createChange();
-    String changeId = r.getChangeId();
-    assertThat(info(changeId).status).isEqualTo(ChangeStatus.NEW);
-    grant(project, "refs/heads/master", Permission.ABANDON, false, REGISTERED_USERS);
-    setApiUser(user);
-    gApi.changes().id(changeId).abandon();
-    assertThat(info(changeId).status).isEqualTo(ChangeStatus.ABANDONED);
-    gApi.changes().id(changeId).restore();
-    assertThat(info(changeId).status).isEqualTo(ChangeStatus.NEW);
-  }
-
-  @Test
-  public void restore() throws Exception {
-    PushOneCommit.Result r = createChange();
-    String changeId = r.getChangeId();
-    assertThat(info(changeId).status).isEqualTo(ChangeStatus.NEW);
-    gApi.changes().id(changeId).abandon();
-    assertThat(info(changeId).status).isEqualTo(ChangeStatus.ABANDONED);
-
-    gApi.changes().id(changeId).restore();
-    ChangeInfo info = get(changeId);
-    assertThat(info.status).isEqualTo(ChangeStatus.NEW);
-    assertThat(Iterables.getLast(info.messages).message.toLowerCase()).contains("restored");
-
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("change is new");
-    gApi.changes().id(changeId).restore();
-  }
-
-  @Test
-  public void restoreNotAllowedWithoutPermission() throws Exception {
-    PushOneCommit.Result r = createChange();
-    String changeId = r.getChangeId();
-    assertThat(info(changeId).status).isEqualTo(ChangeStatus.NEW);
-    gApi.changes().id(changeId).abandon();
-    setApiUser(user);
-    assertThat(info(changeId).status).isEqualTo(ChangeStatus.ABANDONED);
-    exception.expect(AuthException.class);
-    exception.expectMessage("restore not permitted");
-    gApi.changes().id(changeId).restore();
-  }
-
-  private List<Integer> toChangeNumbers(List<ChangeInfo> changes) {
-    return changes.stream().map(i -> i._number).collect(toList());
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/BUILD b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/BUILD
deleted file mode 100644
index 3c4e219..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/BUILD
+++ /dev/null
@@ -1,10 +0,0 @@
-load("//gerrit-acceptance-tests:tests.bzl", "acceptance_tests")
-
-acceptance_tests(
-    srcs = glob(["*IT.java"]),
-    group = "api_change",
-    labels = [
-        "api",
-        "noci",
-    ],
-)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/ChangeIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/ChangeIT.java
deleted file mode 100644
index ce79a7c..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/ChangeIT.java
+++ /dev/null
@@ -1,3971 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.acceptance.api.change;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth8.assertThat;
-import static com.google.common.truth.TruthJUnit.assume;
-import static com.google.gerrit.acceptance.GitUtil.assertPushOk;
-import static com.google.gerrit.acceptance.GitUtil.pushHead;
-import static com.google.gerrit.acceptance.PushOneCommit.FILE_CONTENT;
-import static com.google.gerrit.acceptance.PushOneCommit.FILE_NAME;
-import static com.google.gerrit.acceptance.PushOneCommit.SUBJECT;
-import static com.google.gerrit.extensions.client.ListChangesOption.ALL_REVISIONS;
-import static com.google.gerrit.extensions.client.ListChangesOption.CHANGE_ACTIONS;
-import static com.google.gerrit.extensions.client.ListChangesOption.CHECK;
-import static com.google.gerrit.extensions.client.ListChangesOption.COMMIT_FOOTERS;
-import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_ACTIONS;
-import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_COMMIT;
-import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_REVISION;
-import static com.google.gerrit.extensions.client.ListChangesOption.DETAILED_ACCOUNTS;
-import static com.google.gerrit.extensions.client.ListChangesOption.DETAILED_LABELS;
-import static com.google.gerrit.extensions.client.ListChangesOption.LABELS;
-import static com.google.gerrit.extensions.client.ListChangesOption.MESSAGES;
-import static com.google.gerrit.extensions.client.ListChangesOption.PUSH_CERTIFICATES;
-import static com.google.gerrit.extensions.client.ListChangesOption.REVIEWED;
-import static com.google.gerrit.extensions.client.ListChangesOption.TRACKING_IDS;
-import static com.google.gerrit.extensions.client.ReviewerState.CC;
-import static com.google.gerrit.extensions.client.ReviewerState.REMOVED;
-import static com.google.gerrit.extensions.client.ReviewerState.REVIEWER;
-import static com.google.gerrit.reviewdb.client.RefNames.changeMetaRef;
-import static com.google.gerrit.reviewdb.server.ReviewDbUtil.unwrapDb;
-import static com.google.gerrit.server.StarredChangesUtil.DEFAULT_LABEL;
-import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
-import static com.google.gerrit.server.group.SystemGroupBackend.CHANGE_OWNER;
-import static com.google.gerrit.server.group.SystemGroupBackend.PROJECT_OWNERS;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-import static com.google.gerrit.server.project.Util.category;
-import static com.google.gerrit.server.project.Util.value;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.concurrent.TimeUnit.SECONDS;
-import static java.util.stream.Collectors.joining;
-import static java.util.stream.Collectors.toList;
-import static java.util.stream.Collectors.toSet;
-import static org.junit.Assert.fail;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.util.concurrent.AtomicLongMap;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.AcceptanceTestRequestScope;
-import com.google.gerrit.acceptance.GerritConfig;
-import com.google.gerrit.acceptance.GitUtil;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.acceptance.TestAccount;
-import com.google.gerrit.acceptance.TestProjectInput;
-import com.google.gerrit.common.FooterConstants;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.common.data.LabelFunction;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.changes.AddReviewerInput;
-import com.google.gerrit.extensions.api.changes.AddReviewerResult;
-import com.google.gerrit.extensions.api.changes.DeleteReviewerInput;
-import com.google.gerrit.extensions.api.changes.DeleteVoteInput;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.api.changes.NotifyInfo;
-import com.google.gerrit.extensions.api.changes.RebaseInput;
-import com.google.gerrit.extensions.api.changes.RecipientType;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.api.changes.ReviewInput.DraftHandling;
-import com.google.gerrit.extensions.api.changes.ReviewResult;
-import com.google.gerrit.extensions.api.changes.RevisionApi;
-import com.google.gerrit.extensions.api.changes.StarsInput;
-import com.google.gerrit.extensions.api.groups.GroupApi;
-import com.google.gerrit.extensions.api.projects.BranchInput;
-import com.google.gerrit.extensions.api.projects.ConfigInput;
-import com.google.gerrit.extensions.api.projects.ProjectApi;
-import com.google.gerrit.extensions.api.projects.ProjectInput;
-import com.google.gerrit.extensions.client.ChangeKind;
-import com.google.gerrit.extensions.client.ChangeStatus;
-import com.google.gerrit.extensions.client.Comment.Range;
-import com.google.gerrit.extensions.client.InheritableBoolean;
-import com.google.gerrit.extensions.client.ReviewerState;
-import com.google.gerrit.extensions.client.Side;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.ApprovalInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.ChangeInput;
-import com.google.gerrit.extensions.common.ChangeMessageInfo;
-import com.google.gerrit.extensions.common.CommentInfo;
-import com.google.gerrit.extensions.common.CommitInfo;
-import com.google.gerrit.extensions.common.GitPerson;
-import com.google.gerrit.extensions.common.LabelInfo;
-import com.google.gerrit.extensions.common.MergeInput;
-import com.google.gerrit.extensions.common.MergePatchSetInput;
-import com.google.gerrit.extensions.common.PureRevertInfo;
-import com.google.gerrit.extensions.common.RevisionInfo;
-import com.google.gerrit.extensions.common.TrackingIdInfo;
-import com.google.gerrit.extensions.events.ChangeIndexedListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.registration.RegistrationHandle;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.LabelId;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.StarredChangesUtil;
-import com.google.gerrit.server.change.ChangeResource;
-import com.google.gerrit.server.change.PostReview;
-import com.google.gerrit.server.config.AnonymousCowardNameProvider;
-import com.google.gerrit.server.git.ChangeMessageModifier;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.group.SystemGroupBackend;
-import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
-import com.google.gerrit.server.project.Util;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.testutil.FakeEmailSender.Message;
-import com.google.gerrit.testutil.TestTimeUtil;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import java.util.function.Function;
-import java.util.stream.Stream;
-import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.PushResult;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-@NoHttpd
-public class ChangeIT extends AbstractDaemonTest {
-  private String systemTimeZone;
-
-  @Inject private DynamicSet<ChangeMessageModifier> changeMessageModifiers;
-
-  @Inject private DynamicSet<ChangeIndexedListener> changeIndexedListeners;
-
-  private ChangeIndexedCounter changeIndexedCounter;
-  private RegistrationHandle changeIndexedCounterHandle;
-
-  @Before
-  public void setTimeForTesting() {
-    systemTimeZone = System.setProperty("user.timezone", "US/Eastern");
-  }
-
-  @After
-  public void resetTime() {
-    TestTimeUtil.useSystemTime();
-    System.setProperty("user.timezone", systemTimeZone);
-  }
-
-  @Before
-  public void addChangeIndexedCounter() {
-    changeIndexedCounter = new ChangeIndexedCounter();
-    changeIndexedCounterHandle = changeIndexedListeners.add(changeIndexedCounter);
-  }
-
-  @After
-  public void removeChangeIndexedCounter() {
-    if (changeIndexedCounterHandle != null) {
-      changeIndexedCounterHandle.remove();
-    }
-  }
-
-  @Test
-  public void get() throws Exception {
-    PushOneCommit.Result r = createChange();
-    String triplet = project.get() + "~master~" + r.getChangeId();
-    ChangeInfo c = info(triplet);
-    assertThat(c.id).isEqualTo(triplet);
-    assertThat(c.project).isEqualTo(project.get());
-    assertThat(c.branch).isEqualTo("master");
-    assertThat(c.status).isEqualTo(ChangeStatus.NEW);
-    assertThat(c.subject).isEqualTo("test commit");
-    assertThat(c.submitType).isEqualTo(SubmitType.MERGE_IF_NECESSARY);
-    assertThat(c.mergeable).isTrue();
-    assertThat(c.changeId).isEqualTo(r.getChangeId());
-    assertThat(c.created).isEqualTo(c.updated);
-    assertThat(c._number).isEqualTo(r.getChange().getId().get());
-
-    assertThat(c.owner._accountId).isEqualTo(admin.getId().get());
-    assertThat(c.owner.name).isNull();
-    assertThat(c.owner.email).isNull();
-    assertThat(c.owner.username).isNull();
-    assertThat(c.owner.avatars).isNull();
-  }
-
-  @Test
-  public void setPrivateByOwner() throws Exception {
-    TestRepository<InMemoryRepository> userRepo = cloneProject(project, user);
-    PushOneCommit.Result result =
-        pushFactory.create(db, user.getIdent(), userRepo).to("refs/for/master");
-
-    setApiUser(user);
-    String changeId = result.getChangeId();
-    assertThat(gApi.changes().id(changeId).get().isPrivate).isNull();
-
-    gApi.changes().id(changeId).setPrivate(true, null);
-    ChangeInfo info = gApi.changes().id(changeId).get();
-    assertThat(info.isPrivate).isTrue();
-    assertThat(Iterables.getLast(info.messages).message).isEqualTo("Set private");
-    assertThat(Iterables.getLast(info.messages).tag).contains(ChangeMessagesUtil.TAG_SET_PRIVATE);
-
-    gApi.changes().id(changeId).setPrivate(false, null);
-    info = gApi.changes().id(changeId).get();
-    assertThat(info.isPrivate).isNull();
-    assertThat(Iterables.getLast(info.messages).message).isEqualTo("Unset private");
-    assertThat(Iterables.getLast(info.messages).tag).contains(ChangeMessagesUtil.TAG_UNSET_PRIVATE);
-
-    String msg = "This is a security fix that must not be public.";
-    gApi.changes().id(changeId).setPrivate(true, msg);
-    info = gApi.changes().id(changeId).get();
-    assertThat(info.isPrivate).isTrue();
-    assertThat(Iterables.getLast(info.messages).message).isEqualTo("Set private\n\n" + msg);
-    assertThat(Iterables.getLast(info.messages).tag).contains(ChangeMessagesUtil.TAG_SET_PRIVATE);
-
-    msg = "After this security fix has been released we can make it public now.";
-    gApi.changes().id(changeId).setPrivate(false, msg);
-    info = gApi.changes().id(changeId).get();
-    assertThat(info.isPrivate).isNull();
-    assertThat(Iterables.getLast(info.messages).message).isEqualTo("Unset private\n\n" + msg);
-    assertThat(Iterables.getLast(info.messages).tag).contains(ChangeMessagesUtil.TAG_UNSET_PRIVATE);
-  }
-
-  @Test
-  public void administratorCanSetUserChangePrivate() throws Exception {
-    TestRepository<InMemoryRepository> userRepo = cloneProject(project, user);
-    PushOneCommit.Result result =
-        pushFactory.create(db, user.getIdent(), userRepo).to("refs/for/master");
-
-    String changeId = result.getChangeId();
-    assertThat(gApi.changes().id(changeId).get().isPrivate).isNull();
-
-    gApi.changes().id(changeId).setPrivate(true, null);
-    setApiUser(user);
-    ChangeInfo info = gApi.changes().id(changeId).get();
-    assertThat(info.isPrivate).isTrue();
-  }
-
-  @Test
-  public void cannotSetOtherUsersChangePrivate() throws Exception {
-    PushOneCommit.Result result = createChange();
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    exception.expectMessage("not allowed to mark private");
-    gApi.changes().id(result.getChangeId()).setPrivate(true, null);
-  }
-
-  @Test
-  public void accessPrivate() throws Exception {
-    TestRepository<InMemoryRepository> userRepo = cloneProject(project, user);
-    PushOneCommit.Result result =
-        pushFactory.create(db, user.getIdent(), userRepo).to("refs/for/master");
-
-    setApiUser(user);
-    gApi.changes().id(result.getChangeId()).setPrivate(true, null);
-    // Owner can always access its private changes.
-    assertThat(gApi.changes().id(result.getChangeId()).get().isPrivate).isTrue();
-
-    // Add admin as a reviewer.
-    gApi.changes().id(result.getChangeId()).addReviewer(admin.getId().toString());
-
-    // This change should be visible for admin as a reviewer.
-    setApiUser(admin);
-    assertThat(gApi.changes().id(result.getChangeId()).get().isPrivate).isTrue();
-
-    // Remove admin from reviewers.
-    gApi.changes().id(result.getChangeId()).reviewer(admin.getId().toString()).remove();
-
-    // This change should not be visible for admin anymore.
-    exception.expect(ResourceNotFoundException.class);
-    exception.expectMessage("Not found: " + result.getChangeId());
-    gApi.changes().id(result.getChangeId());
-  }
-
-  @Test
-  public void privateChangeOfOtherUserCanBeAccessedWithPermission() throws Exception {
-    PushOneCommit.Result result = createChange();
-    gApi.changes().id(result.getChangeId()).setPrivate(true, null);
-
-    allow("refs/*", Permission.VIEW_PRIVATE_CHANGES, REGISTERED_USERS);
-    setApiUser(user);
-    assertThat(gApi.changes().id(result.getChangeId()).get().isPrivate).isTrue();
-  }
-
-  @Test
-  public void administratorCanUnmarkPrivateAfterMerging() throws Exception {
-    PushOneCommit.Result result = createChange();
-    String changeId = result.getChangeId();
-    gApi.changes().id(changeId).setPrivate(true, null);
-    assertThat(gApi.changes().id(changeId).get().isPrivate).isTrue();
-    merge(result);
-    gApi.changes().id(changeId).setPrivate(false, null);
-    assertThat(gApi.changes().id(changeId).get().isPrivate).isNull();
-  }
-
-  @Test
-  public void administratorCanMarkPrivateAfterMerging() throws Exception {
-    PushOneCommit.Result result = createChange();
-    String changeId = result.getChangeId();
-    assertThat(gApi.changes().id(changeId).get().isPrivate).isNull();
-    merge(result);
-    gApi.changes().id(changeId).setPrivate(true, null);
-    assertThat(gApi.changes().id(changeId).get().isPrivate).isTrue();
-  }
-
-  @Test
-  public void ownerCannotMarkPrivateAfterMerging() throws Exception {
-    TestRepository<InMemoryRepository> userRepo = cloneProject(project, user);
-    PushOneCommit.Result result =
-        pushFactory.create(db, user.getIdent(), userRepo).to("refs/for/master");
-
-    String changeId = result.getChangeId();
-    assertThat(gApi.changes().id(changeId).get().isPrivate).isNull();
-
-    merge(result);
-
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    exception.expectMessage("not allowed to mark private");
-    gApi.changes().id(changeId).setPrivate(true, null);
-  }
-
-  @Test
-  public void ownerCanUnmarkPrivateAfterMerging() throws Exception {
-    TestRepository<InMemoryRepository> userRepo = cloneProject(project, user);
-    PushOneCommit.Result result =
-        pushFactory.create(db, user.getIdent(), userRepo).to("refs/for/master");
-
-    String changeId = result.getChangeId();
-    assertThat(gApi.changes().id(changeId).get().isPrivate).isNull();
-    gApi.changes().id(changeId).addReviewer(admin.getId().toString());
-    gApi.changes().id(changeId).setPrivate(true, null);
-    assertThat(gApi.changes().id(changeId).get().isPrivate).isTrue();
-
-    merge(result);
-
-    setApiUser(user);
-    gApi.changes().id(changeId).setPrivate(false, null);
-    assertThat(gApi.changes().id(changeId).get().isPrivate).isNull();
-  }
-
-  @Test
-  public void setWorkInProgressNotAllowedWithoutPermission() throws Exception {
-    PushOneCommit.Result rwip = createChange();
-    String changeId = rwip.getChangeId();
-
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    exception.expectMessage("not allowed to toggle work in progress");
-    gApi.changes().id(changeId).setWorkInProgress();
-  }
-
-  @Test
-  public void setWorkInProgressAllowedAsAdmin() throws Exception {
-    setApiUser(user);
-    String changeId =
-        gApi.changes().create(new ChangeInput(project.get(), "master", "Test Change")).get().id;
-
-    setApiUser(admin);
-    gApi.changes().id(changeId).setWorkInProgress();
-    assertThat(gApi.changes().id(changeId).get().workInProgress).isTrue();
-  }
-
-  @Test
-  public void setWorkInProgressAllowedAsProjectOwner() throws Exception {
-    setApiUser(user);
-    String changeId =
-        gApi.changes().create(new ChangeInput(project.get(), "master", "Test Change")).get().id;
-
-    com.google.gerrit.acceptance.TestAccount user2 = accountCreator.user2();
-    grant(project, "refs/*", Permission.OWNER, false, REGISTERED_USERS);
-    setApiUser(user2);
-    gApi.changes().id(changeId).setWorkInProgress();
-    assertThat(gApi.changes().id(changeId).get().workInProgress).isTrue();
-  }
-
-  @Test
-  public void createWipChangeWithWorkInProgressByDefaultForProject() throws Exception {
-    ConfigInput input = new ConfigInput();
-    input.workInProgressByDefault = InheritableBoolean.TRUE;
-    gApi.projects().name(project.get()).config(input);
-    String changeId =
-        gApi.changes().create(new ChangeInput(project.get(), "master", "Test Change")).get().id;
-    assertThat(gApi.changes().id(changeId).get().workInProgress).isTrue();
-  }
-
-  @Test
-  public void setReadyForReviewNotAllowedWithoutPermission() throws Exception {
-    PushOneCommit.Result rready = createChange();
-    String changeId = rready.getChangeId();
-    gApi.changes().id(changeId).setWorkInProgress();
-
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    exception.expectMessage("not allowed to toggle work in progress");
-    gApi.changes().id(changeId).setReadyForReview();
-  }
-
-  @Test
-  public void setReadyForReviewAllowedAsAdmin() throws Exception {
-    setApiUser(user);
-    String changeId =
-        gApi.changes().create(new ChangeInput(project.get(), "master", "Test Change")).get().id;
-    gApi.changes().id(changeId).setWorkInProgress();
-
-    setApiUser(admin);
-    gApi.changes().id(changeId).setReadyForReview();
-    assertThat(gApi.changes().id(changeId).get().workInProgress).isNull();
-  }
-
-  @Test
-  public void setReadyForReviewAllowedAsProjectOwner() throws Exception {
-    setApiUser(user);
-    String changeId =
-        gApi.changes().create(new ChangeInput(project.get(), "master", "Test Change")).get().id;
-    gApi.changes().id(changeId).setWorkInProgress();
-
-    com.google.gerrit.acceptance.TestAccount user2 = accountCreator.user2();
-    grant(project, "refs/*", Permission.OWNER, false, REGISTERED_USERS);
-    setApiUser(user2);
-    gApi.changes().id(changeId).setReadyForReview();
-    assertThat(gApi.changes().id(changeId).get().workInProgress).isNull();
-  }
-
-  @Test
-  public void hasReviewStarted() throws Exception {
-    PushOneCommit.Result r = createWorkInProgressChange();
-    String changeId = r.getChangeId();
-    ChangeInfo info = gApi.changes().id(changeId).get();
-    assertThat(info.hasReviewStarted).isFalse();
-
-    gApi.changes().id(changeId).setReadyForReview();
-    info = gApi.changes().id(changeId).get();
-    assertThat(info.hasReviewStarted).isTrue();
-  }
-
-  @Test
-  public void pendingReviewersInNoteDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    ConfigInput conf = new ConfigInput();
-    conf.enableReviewerByEmail = InheritableBoolean.TRUE;
-    gApi.projects().name(project.get()).config(conf);
-
-    PushOneCommit.Result r = createWorkInProgressChange();
-    String changeId = r.getChangeId();
-    assertThat(gApi.changes().id(changeId).get().pendingReviewers).isEmpty();
-
-    // Add some pending reviewers.
-    TestAccount user1 =
-        accountCreator.create(name("user1"), name("user1") + "@example.com", "User 1");
-    TestAccount user2 =
-        accountCreator.create(name("user2"), name("user2") + "@example.com", "User 2");
-    TestAccount user3 =
-        accountCreator.create(name("user3"), name("user3") + "@example.com", "User 3");
-    TestAccount user4 =
-        accountCreator.create(name("user4"), name("user4") + "@example.com", "User 4");
-    ReviewInput in =
-        ReviewInput.noScore()
-            .reviewer(user1.email)
-            .reviewer(user2.email)
-            .reviewer(user3.email, CC, false)
-            .reviewer(user4.email, CC, false)
-            .reviewer("byemail1@example.com")
-            .reviewer("byemail2@example.com")
-            .reviewer("byemail3@example.com", CC, false)
-            .reviewer("byemail4@example.com", CC, false);
-    ReviewResult result = gApi.changes().id(changeId).revision("current").review(in);
-    assertThat(result.reviewers).isNotEmpty();
-    ChangeInfo info = gApi.changes().id(changeId).get();
-    Function<Collection<AccountInfo>, Collection<String>> toEmails =
-        ais -> ais.stream().map(ai -> ai.email).collect(toSet());
-    assertThat(toEmails.apply(info.pendingReviewers.get(REVIEWER)))
-        .containsExactly(
-            admin.email, user1.email, user2.email, "byemail1@example.com", "byemail2@example.com");
-    assertThat(toEmails.apply(info.pendingReviewers.get(CC)))
-        .containsExactly(user3.email, user4.email, "byemail3@example.com", "byemail4@example.com");
-    assertThat(info.pendingReviewers.get(REMOVED)).isNull();
-
-    // Stage some pending reviewer removals.
-    gApi.changes().id(changeId).reviewer(user1.email).remove();
-    gApi.changes().id(changeId).reviewer(user3.email).remove();
-    gApi.changes().id(changeId).reviewer("byemail1@example.com").remove();
-    gApi.changes().id(changeId).reviewer("byemail3@example.com").remove();
-    info = gApi.changes().id(changeId).get();
-    assertThat(toEmails.apply(info.pendingReviewers.get(REVIEWER)))
-        .containsExactly(admin.email, user2.email, "byemail2@example.com");
-    assertThat(toEmails.apply(info.pendingReviewers.get(CC)))
-        .containsExactly(user4.email, "byemail4@example.com");
-    assertThat(toEmails.apply(info.pendingReviewers.get(REMOVED)))
-        .containsExactly(user1.email, user3.email, "byemail1@example.com", "byemail3@example.com");
-
-    // "Undo" a removal.
-    in = ReviewInput.noScore().reviewer(user1.email);
-    gApi.changes().id(changeId).revision("current").review(in);
-    info = gApi.changes().id(changeId).get();
-    assertThat(toEmails.apply(info.pendingReviewers.get(REVIEWER)))
-        .containsExactly(admin.email, user1.email, user2.email, "byemail2@example.com");
-    assertThat(toEmails.apply(info.pendingReviewers.get(CC)))
-        .containsExactly(user4.email, "byemail4@example.com");
-    assertThat(toEmails.apply(info.pendingReviewers.get(REMOVED)))
-        .containsExactly(user3.email, "byemail1@example.com", "byemail3@example.com");
-
-    // "Commit" by moving out of WIP.
-    gApi.changes().id(changeId).setReadyForReview();
-    info = gApi.changes().id(changeId).get();
-    assertThat(info.pendingReviewers).isEmpty();
-    assertThat(toEmails.apply(info.reviewers.get(REVIEWER)))
-        .containsExactly(admin.email, user1.email, user2.email, "byemail2@example.com");
-    assertThat(toEmails.apply(info.reviewers.get(CC)))
-        .containsExactly(user4.email, "byemail4@example.com");
-    assertThat(info.reviewers.get(REMOVED)).isNull();
-  }
-
-  @Test
-  public void toggleWorkInProgressState() throws Exception {
-    PushOneCommit.Result r = createChange();
-    String changeId = r.getChangeId();
-
-    // With message
-    gApi.changes().id(changeId).setWorkInProgress("Needs some refactoring");
-
-    ChangeInfo info = gApi.changes().id(changeId).get();
-
-    assertThat(info.workInProgress).isTrue();
-    assertThat(Iterables.getLast(info.messages).message).contains("Needs some refactoring");
-    assertThat(Iterables.getLast(info.messages).tag).contains(ChangeMessagesUtil.TAG_SET_WIP);
-
-    gApi.changes().id(changeId).setReadyForReview("PTAL");
-
-    info = gApi.changes().id(changeId).get();
-    assertThat(info.workInProgress).isNull();
-    assertThat(Iterables.getLast(info.messages).message).contains("PTAL");
-    assertThat(Iterables.getLast(info.messages).tag).contains(ChangeMessagesUtil.TAG_SET_READY);
-
-    // No message
-    gApi.changes().id(changeId).setWorkInProgress();
-
-    info = gApi.changes().id(changeId).get();
-
-    assertThat(info.workInProgress).isTrue();
-    assertThat(Iterables.getLast(info.messages).message).isEqualTo("Set Work In Progress");
-    assertThat(Iterables.getLast(info.messages).tag).contains(ChangeMessagesUtil.TAG_SET_WIP);
-
-    gApi.changes().id(changeId).setReadyForReview();
-
-    info = gApi.changes().id(changeId).get();
-    assertThat(info.workInProgress).isNull();
-    assertThat(Iterables.getLast(info.messages).message).isEqualTo("Set Ready For Review");
-    assertThat(Iterables.getLast(info.messages).tag).contains(ChangeMessagesUtil.TAG_SET_READY);
-  }
-
-  @Test
-  public void reviewAndStartReview() throws Exception {
-    PushOneCommit.Result r = createWorkInProgressChange();
-    r.assertOkStatus();
-    assertThat(r.getChange().change().isWorkInProgress()).isTrue();
-
-    ReviewInput in = ReviewInput.noScore().setWorkInProgress(false);
-    ReviewResult result = gApi.changes().id(r.getChangeId()).revision("current").review(in);
-    assertThat(result.ready).isTrue();
-
-    ChangeInfo info = gApi.changes().id(r.getChangeId()).get();
-    assertThat(info.workInProgress).isNull();
-  }
-
-  @Test
-  public void reviewAndMoveToWorkInProgress() throws Exception {
-    PushOneCommit.Result r = createChange();
-    assertThat(r.getChange().change().isWorkInProgress()).isFalse();
-
-    ReviewInput in = ReviewInput.noScore().setWorkInProgress(true);
-    ReviewResult result = gApi.changes().id(r.getChangeId()).revision("current").review(in);
-    assertThat(result.ready).isNull();
-
-    ChangeInfo info = gApi.changes().id(r.getChangeId()).get();
-    assertThat(info.workInProgress).isTrue();
-  }
-
-  @Test
-  public void reviewAndSetWorkInProgressAndAddReviewerAndVote() throws Exception {
-    PushOneCommit.Result r = createChange();
-    assertThat(r.getChange().change().isWorkInProgress()).isFalse();
-
-    ReviewInput in =
-        ReviewInput.approve().reviewer(user.email).label("Code-Review", 1).setWorkInProgress(true);
-    gApi.changes().id(r.getChangeId()).revision("current").review(in);
-
-    ChangeInfo info = gApi.changes().id(r.getChangeId()).get();
-    assertThat(info.workInProgress).isTrue();
-    assertThat(info.reviewers.get(REVIEWER).stream().map(ai -> ai._accountId).collect(toList()))
-        .containsExactly(admin.id.get(), user.id.get());
-    assertThat(info.labels.get("Code-Review").recommended._accountId).isEqualTo(admin.id.get());
-  }
-
-  @Test
-  public void reviewWithWorkInProgressAndReadyReturnsError() throws Exception {
-    PushOneCommit.Result r = createChange();
-    ReviewInput in = ReviewInput.noScore();
-    in.ready = true;
-    in.workInProgress = true;
-    ReviewResult result = gApi.changes().id(r.getChangeId()).revision("current").review(in);
-    assertThat(result.error).isEqualTo(PostReview.ERROR_WIP_READY_MUTUALLY_EXCLUSIVE);
-  }
-
-  @Test
-  @TestProjectInput(cloneAs = "user")
-  public void reviewWithWorkInProgressChangeOwner() throws Exception {
-    PushOneCommit push = pushFactory.create(db, user.getIdent(), testRepo);
-    PushOneCommit.Result r = push.to("refs/for/master");
-    r.assertOkStatus();
-    assertThat(r.getChange().change().getOwner()).isEqualTo(user.id);
-
-    setApiUser(user);
-    ReviewInput in = ReviewInput.noScore().setWorkInProgress(true);
-    gApi.changes().id(r.getChangeId()).current().review(in);
-    ChangeInfo info = gApi.changes().id(r.getChangeId()).get();
-    assertThat(info.workInProgress).isTrue();
-  }
-
-  @Test
-  @TestProjectInput(cloneAs = "user")
-  public void reviewWithWithWorkInProgressAdmin() throws Exception {
-    PushOneCommit push = pushFactory.create(db, user.getIdent(), testRepo);
-    PushOneCommit.Result r = push.to("refs/for/master");
-    r.assertOkStatus();
-    assertThat(r.getChange().change().getOwner()).isEqualTo(user.id);
-
-    setApiUser(admin);
-    ReviewInput in = ReviewInput.noScore().setWorkInProgress(true);
-    gApi.changes().id(r.getChangeId()).current().review(in);
-    ChangeInfo info = gApi.changes().id(r.getChangeId()).get();
-    assertThat(info.workInProgress).isTrue();
-  }
-
-  @Test
-  public void reviewWithWorkInProgressByNonOwnerReturnsError() throws Exception {
-    PushOneCommit.Result r = createChange();
-    ReviewInput in = ReviewInput.noScore().setWorkInProgress(true);
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    exception.expectMessage("not allowed to toggle work in progress");
-    gApi.changes().id(r.getChangeId()).current().review(in);
-  }
-
-  @Test
-  public void reviewWithReadyByNonOwnerReturnsError() throws Exception {
-    PushOneCommit.Result r = createChange();
-    ReviewInput in = ReviewInput.noScore().setReady(true);
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    exception.expectMessage("not allowed to toggle work in progress");
-    gApi.changes().id(r.getChangeId()).current().review(in);
-  }
-
-  @Test
-  public void getAmbiguous() throws Exception {
-    PushOneCommit.Result r1 = createChange();
-    String changeId = r1.getChangeId();
-    gApi.changes().id(changeId).get();
-
-    BranchInput b = new BranchInput();
-    b.revision = repo().exactRef("HEAD").getObjectId().name();
-    gApi.projects().name(project.get()).branch("other").create(b);
-
-    PushOneCommit push2 =
-        pushFactory.create(
-            db,
-            admin.getIdent(),
-            testRepo,
-            PushOneCommit.SUBJECT,
-            PushOneCommit.FILE_NAME,
-            PushOneCommit.FILE_CONTENT,
-            changeId);
-    PushOneCommit.Result r2 = push2.to("refs/for/other");
-    assertThat(r2.getChangeId()).isEqualTo(changeId);
-
-    exception.expect(ResourceNotFoundException.class);
-    exception.expectMessage("Multiple changes found for " + changeId);
-    gApi.changes().id(changeId).get();
-  }
-
-  @Test
-  public void revert() throws Exception {
-    PushOneCommit.Result r = createChange();
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).submit();
-    ChangeInfo revertChange = gApi.changes().id(r.getChangeId()).revert().get();
-
-    // expected messages on source change:
-    // 1. Uploaded patch set 1.
-    // 2. Patch Set 1: Code-Review+2
-    // 3. Change has been successfully merged by Administrator
-    // 4. Patch Set 1: Reverted
-    List<ChangeMessageInfo> sourceMessages =
-        new ArrayList<>(gApi.changes().id(r.getChangeId()).get().messages);
-    assertThat(sourceMessages).hasSize(4);
-    String expectedMessage =
-        String.format("Created a revert of this change as %s", revertChange.changeId);
-    assertThat(sourceMessages.get(3).message).isEqualTo(expectedMessage);
-
-    assertThat(revertChange.messages).hasSize(1);
-    assertThat(revertChange.messages.iterator().next().message).isEqualTo("Uploaded patch set 1.");
-    assertThat(revertChange.revertOf).isEqualTo(gApi.changes().id(r.getChangeId()).get()._number);
-  }
-
-  @Test
-  public void revertNotifications() throws Exception {
-    PushOneCommit.Result r = createChange();
-    gApi.changes().id(r.getChangeId()).addReviewer(user.email);
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).submit();
-
-    sender.clear();
-    ChangeInfo revertChange = gApi.changes().id(r.getChangeId()).revert().get();
-
-    List<Message> messages = sender.getMessages();
-    assertThat(messages).hasSize(2);
-    assertThat(sender.getMessages(revertChange.changeId, "newchange")).hasSize(1);
-    assertThat(sender.getMessages(r.getChangeId(), "revert")).hasSize(1);
-  }
-
-  @Test
-  public void revertPreservesReviewersAndCcs() throws Exception {
-    PushOneCommit.Result r = createChange();
-
-    ReviewInput in = ReviewInput.approve();
-    in.reviewer(user.email);
-    in.reviewer(accountCreator.user2().email, ReviewerState.CC, true);
-    // Add user as reviewer that will create the revert
-    in.reviewer(accountCreator.admin2().email);
-
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(in);
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).submit();
-
-    // expect both the original reviewers and CCs to be preserved
-    // original owner should be added as reviewer, user requesting the revert (new owner) removed
-    setApiUser(accountCreator.admin2());
-    Map<ReviewerState, Collection<AccountInfo>> result =
-        gApi.changes().id(r.getChangeId()).revert().get().reviewers;
-    assertThat(result).containsKey(ReviewerState.REVIEWER);
-
-    List<Integer> reviewers =
-        result.get(ReviewerState.REVIEWER).stream().map(a -> a._accountId).collect(toList());
-    if (notesMigration.readChanges()) {
-      assertThat(result).containsKey(ReviewerState.CC);
-      List<Integer> ccs =
-          result.get(ReviewerState.CC).stream().map(a -> a._accountId).collect(toList());
-      assertThat(ccs).containsExactly(accountCreator.user2().id.get());
-      assertThat(reviewers).containsExactly(user.id.get(), admin.id.get());
-    } else {
-      assertThat(reviewers)
-          .containsExactly(user.id.get(), admin.id.get(), accountCreator.user2().id.get());
-    }
-  }
-
-  @Test
-  @TestProjectInput(createEmptyCommit = false)
-  public void revertInitialCommit() throws Exception {
-    PushOneCommit.Result r = createChange();
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).submit();
-
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("Cannot revert initial commit");
-    gApi.changes().id(r.getChangeId()).revert();
-  }
-
-  @FunctionalInterface
-  private interface Rebase {
-    void call(String id) throws RestApiException;
-  }
-
-  @Test
-  public void rebaseViaRevisionApi() throws Exception {
-    testRebase(id -> gApi.changes().id(id).current().rebase());
-  }
-
-  @Test
-  public void rebaseViaChangeApi() throws Exception {
-    testRebase(id -> gApi.changes().id(id).rebase());
-  }
-
-  private void testRebase(Rebase rebase) throws Exception {
-    // Create two changes both with the same parent
-    PushOneCommit.Result r = createChange();
-    testRepo.reset("HEAD~1");
-    PushOneCommit.Result r2 = createChange();
-
-    // Approve and submit the first change
-    RevisionApi revision = gApi.changes().id(r.getChangeId()).current();
-    revision.review(ReviewInput.approve());
-    revision.submit();
-
-    // Add an approval whose score should be copied on trivial rebase
-    gApi.changes().id(r2.getChangeId()).current().review(ReviewInput.recommend());
-
-    String changeId = r2.getChangeId();
-    // Rebase the second change
-    rebase.call(changeId);
-
-    // Second change should have 2 patch sets and an approval
-    ChangeInfo c2 = gApi.changes().id(changeId).get(CURRENT_REVISION, DETAILED_LABELS);
-    assertThat(c2.revisions.get(c2.currentRevision)._number).isEqualTo(2);
-
-    // ...and the committer and description should be correct
-    ChangeInfo info = gApi.changes().id(changeId).get(CURRENT_REVISION, CURRENT_COMMIT);
-    GitPerson committer = info.revisions.get(info.currentRevision).commit.committer;
-    assertThat(committer.name).isEqualTo(admin.fullName);
-    assertThat(committer.email).isEqualTo(admin.email);
-    String description = info.revisions.get(info.currentRevision).description;
-    assertThat(description).isEqualTo("Rebase");
-
-    // ...and the approval was copied
-    LabelInfo cr = c2.labels.get("Code-Review");
-    assertThat(cr).isNotNull();
-    assertThat(cr.all).hasSize(1);
-    assertThat(cr.all.get(0).value).isEqualTo(1);
-
-    if (notesMigration.changePrimaryStorage() == PrimaryStorage.REVIEW_DB) {
-      // Ensure record was actually copied under ReviewDb
-      List<PatchSetApproval> psas =
-          unwrapDb(db)
-              .patchSetApprovals()
-              .byPatchSet(new PatchSet.Id(new Change.Id(c2._number), 2))
-              .toList();
-      assertThat(psas).hasSize(1);
-      assertThat(psas.get(0).getValue()).isEqualTo((short) 1);
-    }
-
-    // Rebasing the second change again should fail
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("Change is already up to date");
-    gApi.changes().id(changeId).current().rebase();
-  }
-
-  @Test
-  public void rebaseNotAllowedWithoutPermission() throws Exception {
-    // Create two changes both with the same parent
-    PushOneCommit.Result r = createChange();
-    testRepo.reset("HEAD~1");
-    PushOneCommit.Result r2 = createChange();
-
-    // Approve and submit the first change
-    RevisionApi revision = gApi.changes().id(r.getChangeId()).current();
-    revision.review(ReviewInput.approve());
-    revision.submit();
-
-    // Rebase the second
-    String changeId = r2.getChangeId();
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    exception.expectMessage("rebase not permitted");
-    gApi.changes().id(changeId).rebase();
-  }
-
-  @Test
-  public void rebaseAllowedWithPermission() throws Exception {
-    // Create two changes both with the same parent
-    PushOneCommit.Result r = createChange();
-    testRepo.reset("HEAD~1");
-    PushOneCommit.Result r2 = createChange();
-
-    // Approve and submit the first change
-    RevisionApi revision = gApi.changes().id(r.getChangeId()).current();
-    revision.review(ReviewInput.approve());
-    revision.submit();
-
-    grant(project, "refs/heads/master", Permission.REBASE, false, REGISTERED_USERS);
-
-    // Rebase the second
-    String changeId = r2.getChangeId();
-    setApiUser(user);
-    gApi.changes().id(changeId).rebase();
-  }
-
-  @Test
-  public void rebaseNotAllowedWithoutPushPermission() throws Exception {
-    // Create two changes both with the same parent
-    PushOneCommit.Result r = createChange();
-    testRepo.reset("HEAD~1");
-    PushOneCommit.Result r2 = createChange();
-
-    // Approve and submit the first change
-    RevisionApi revision = gApi.changes().id(r.getChangeId()).current();
-    revision.review(ReviewInput.approve());
-    revision.submit();
-
-    grant(project, "refs/heads/master", Permission.REBASE, false, REGISTERED_USERS);
-    block("refs/for/*", Permission.PUSH, REGISTERED_USERS);
-
-    // Rebase the second
-    String changeId = r2.getChangeId();
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    exception.expectMessage("rebase not permitted");
-    gApi.changes().id(changeId).rebase();
-  }
-
-  @Test
-  public void rebaseNotAllowedForOwnerWithoutPushPermission() throws Exception {
-    // Create two changes both with the same parent
-    PushOneCommit.Result r = createChange();
-    testRepo.reset("HEAD~1");
-    PushOneCommit.Result r2 = createChange();
-
-    // Approve and submit the first change
-    RevisionApi revision = gApi.changes().id(r.getChangeId()).current();
-    revision.review(ReviewInput.approve());
-    revision.submit();
-
-    block("refs/for/*", Permission.PUSH, REGISTERED_USERS);
-
-    // Rebase the second
-    String changeId = r2.getChangeId();
-    exception.expect(AuthException.class);
-    exception.expectMessage("rebase not permitted");
-    gApi.changes().id(changeId).rebase();
-  }
-
-  @Test
-  public void deleteNewChangeAsAdmin() throws Exception {
-    deleteChangeAsUser(admin, admin);
-  }
-
-  @Test
-  @TestProjectInput(cloneAs = "user")
-  public void deleteNewChangeAsNormalUser() throws Exception {
-    PushOneCommit.Result changeResult =
-        pushFactory.create(db, user.getIdent(), testRepo).to("refs/for/master");
-    String changeId = changeResult.getChangeId();
-
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    exception.expectMessage("delete not permitted");
-    gApi.changes().id(changeId).delete();
-  }
-
-  @Test
-  public void deleteNewChangeAsUserWithDeleteChangesPermissionForGroup() throws Exception {
-    allow("refs/*", Permission.DELETE_CHANGES, REGISTERED_USERS);
-    deleteChangeAsUser(admin, user);
-  }
-
-  @Test
-  public void deleteNewChangeAsUserWithDeleteChangesPermissionForProjectOwners() throws Exception {
-    GroupApi groupApi = gApi.groups().create(name("delete-change"));
-    groupApi.addMembers("user");
-
-    ProjectInput in = new ProjectInput();
-    in.name = name("delete-change");
-    in.owners = Lists.newArrayListWithCapacity(1);
-    in.owners.add(groupApi.name());
-    in.createEmptyCommit = true;
-    ProjectApi api = gApi.projects().create(in);
-
-    Project.NameKey nameKey = new Project.NameKey(api.get().name);
-
-    ProjectConfig cfg = projectCache.checkedGet(nameKey).getConfig();
-    Util.allow(cfg, Permission.DELETE_CHANGES, PROJECT_OWNERS, "refs/*");
-    saveProjectConfig(nameKey, cfg);
-
-    deleteChangeAsUser(nameKey, admin, user);
-  }
-
-  @Test
-  public void deleteChangeAsUserWithDeleteOwnChangesPermissionForGroup() throws Exception {
-    allow("refs/*", Permission.DELETE_OWN_CHANGES, REGISTERED_USERS);
-    deleteChangeAsUser(user, user);
-  }
-
-  @Test
-  public void deleteChangeAsUserWithDeleteOwnChangesPermissionForOwners() throws Exception {
-    allow("refs/*", Permission.DELETE_OWN_CHANGES, CHANGE_OWNER);
-    deleteChangeAsUser(user, user);
-  }
-
-  private void deleteChangeAsUser(TestAccount owner, TestAccount deleteAs) throws Exception {
-    deleteChangeAsUser(project, owner, deleteAs);
-  }
-
-  private void deleteChangeAsUser(
-      Project.NameKey projectName, TestAccount owner, TestAccount deleteAs) throws Exception {
-    try {
-      setApiUser(owner);
-      ChangeInput in = new ChangeInput();
-      in.project = projectName.get();
-      in.branch = "refs/heads/master";
-      in.subject = "test";
-      ChangeInfo changeInfo = gApi.changes().create(in).get();
-      String changeId = changeInfo.changeId;
-      int id = changeInfo._number;
-      String commit = changeInfo.currentRevision;
-
-      assertThat(gApi.changes().id(changeId).info().owner._accountId).isEqualTo(owner.id.get());
-
-      setApiUser(deleteAs);
-      gApi.changes().id(changeId).delete();
-
-      assertThat(query(changeId)).isEmpty();
-
-      String ref = new Change.Id(id).toRefPrefix() + "1";
-      eventRecorder.assertRefUpdatedEvents(projectName.get(), ref, null, commit, commit, null);
-      eventRecorder.assertChangeDeletedEvents(changeId, deleteAs.email);
-    } finally {
-      removePermission(project, "refs/*", Permission.DELETE_OWN_CHANGES);
-      removePermission(project, "refs/*", Permission.DELETE_CHANGES);
-    }
-  }
-
-  @Test
-  public void deleteNewChangeOfAnotherUserAsAdmin() throws Exception {
-    deleteChangeAsUser(user, admin);
-  }
-
-  @Test
-  public void deleteNewChangeOfAnotherUserWithDeleteOwnChangesPermission() throws Exception {
-    allow("refs/*", Permission.DELETE_OWN_CHANGES, REGISTERED_USERS);
-
-    try {
-      PushOneCommit.Result changeResult = createChange();
-      String changeId = changeResult.getChangeId();
-
-      setApiUser(user);
-      exception.expect(AuthException.class);
-      exception.expectMessage("delete not permitted");
-      gApi.changes().id(changeId).delete();
-    } finally {
-      removePermission(project, "refs/*", Permission.DELETE_OWN_CHANGES);
-    }
-  }
-
-  @Test
-  @TestProjectInput(createEmptyCommit = false)
-  public void deleteNewChangeForBranchWithoutCommits() throws Exception {
-    PushOneCommit.Result changeResult = createChange();
-    String changeId = changeResult.getChangeId();
-
-    gApi.changes().id(changeId).delete();
-
-    assertThat(query(changeId)).isEmpty();
-  }
-
-  @Test
-  @TestProjectInput(cloneAs = "user")
-  public void deleteAbandonedChangeAsNormalUser() throws Exception {
-    PushOneCommit.Result changeResult =
-        pushFactory.create(db, user.getIdent(), testRepo).to("refs/for/master");
-    String changeId = changeResult.getChangeId();
-
-    setApiUser(user);
-    gApi.changes().id(changeId).abandon();
-
-    exception.expect(AuthException.class);
-    exception.expectMessage("delete not permitted");
-    gApi.changes().id(changeId).delete();
-  }
-
-  @Test
-  @TestProjectInput(cloneAs = "user")
-  public void deleteAbandonedChangeOfAnotherUserAsAdmin() throws Exception {
-    PushOneCommit.Result changeResult =
-        pushFactory.create(db, user.getIdent(), testRepo).to("refs/for/master");
-    String changeId = changeResult.getChangeId();
-
-    gApi.changes().id(changeId).abandon();
-
-    gApi.changes().id(changeId).delete();
-
-    assertThat(query(changeId)).isEmpty();
-  }
-
-  @Test
-  public void deleteMergedChange() throws Exception {
-    PushOneCommit.Result changeResult = createChange();
-    String changeId = changeResult.getChangeId();
-
-    merge(changeResult);
-
-    exception.expect(MethodNotAllowedException.class);
-    exception.expectMessage("delete not permitted");
-    gApi.changes().id(changeId).delete();
-  }
-
-  @Test
-  @TestProjectInput(cloneAs = "user")
-  public void deleteMergedChangeWithDeleteOwnChangesPermission() throws Exception {
-    allow("refs/*", Permission.DELETE_OWN_CHANGES, REGISTERED_USERS);
-
-    try {
-      PushOneCommit.Result changeResult =
-          pushFactory.create(db, user.getIdent(), testRepo).to("refs/for/master");
-      String changeId = changeResult.getChangeId();
-
-      merge(changeResult);
-
-      setApiUser(user);
-      exception.expect(MethodNotAllowedException.class);
-      exception.expectMessage("delete not permitted");
-      gApi.changes().id(changeId).delete();
-    } finally {
-      removePermission(project, "refs/*", Permission.DELETE_OWN_CHANGES);
-    }
-  }
-
-  @Test
-  public void deleteNewChangeWithMergedPatchSet() throws Exception {
-    PushOneCommit.Result changeResult = createChange();
-    String changeId = changeResult.getChangeId();
-    Change.Id id = changeResult.getChange().getId();
-
-    merge(changeResult);
-    setChangeStatus(id, Change.Status.NEW);
-
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage(
-        String.format("Cannot delete change %s: patch set 1 is already merged", id));
-    gApi.changes().id(changeId).delete();
-  }
-
-  @Test
-  public void rebaseUpToDateChange() throws Exception {
-    PushOneCommit.Result r = createChange();
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("Change is already up to date");
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).rebase();
-  }
-
-  @Test
-  public void rebaseConflict() throws Exception {
-    PushOneCommit.Result r = createChange();
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).submit();
-
-    PushOneCommit push =
-        pushFactory.create(
-            db,
-            admin.getIdent(),
-            testRepo,
-            PushOneCommit.SUBJECT,
-            PushOneCommit.FILE_NAME,
-            "other content",
-            "If09d8782c1e59dd0b33de2b1ec3595d69cc10ad5");
-    r = push.to("refs/for/master");
-    r.assertOkStatus();
-
-    exception.expect(ResourceConflictException.class);
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).rebase();
-  }
-
-  @Test
-  public void rebaseChangeBase() throws Exception {
-    PushOneCommit.Result r1 = createChange();
-    PushOneCommit.Result r2 = createChange();
-    PushOneCommit.Result r3 = createChange();
-    RebaseInput ri = new RebaseInput();
-
-    // rebase r3 directly onto master (break dep. towards r2)
-    ri.base = "";
-    gApi.changes().id(r3.getChangeId()).revision(r3.getCommit().name()).rebase(ri);
-    PatchSet ps3 = r3.getPatchSet();
-    assertThat(ps3.getId().get()).isEqualTo(2);
-
-    // rebase r2 onto r3 (referenced by ref)
-    ri.base = ps3.getId().toRefName();
-    gApi.changes().id(r2.getChangeId()).revision(r2.getCommit().name()).rebase(ri);
-    PatchSet ps2 = r2.getPatchSet();
-    assertThat(ps2.getId().get()).isEqualTo(2);
-
-    // rebase r1 onto r2 (referenced by commit)
-    ri.base = ps2.getRevision().get();
-    gApi.changes().id(r1.getChangeId()).revision(r1.getCommit().name()).rebase(ri);
-    PatchSet ps1 = r1.getPatchSet();
-    assertThat(ps1.getId().get()).isEqualTo(2);
-
-    // rebase r1 onto r3 (referenced by change number)
-    ri.base = String.valueOf(r3.getChange().getId().get());
-    gApi.changes().id(r1.getChangeId()).revision(ps1.getRevision().get()).rebase(ri);
-    assertThat(r1.getPatchSetId().get()).isEqualTo(3);
-  }
-
-  @Test
-  public void rebaseChangeBaseRecursion() throws Exception {
-    PushOneCommit.Result r1 = createChange();
-    PushOneCommit.Result r2 = createChange();
-
-    RebaseInput ri = new RebaseInput();
-    ri.base = r2.getCommit().name();
-    String expectedMessage =
-        "base change "
-            + r2.getChangeId()
-            + " is a descendant of the current change - recursion not allowed";
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage(expectedMessage);
-    gApi.changes().id(r1.getChangeId()).revision(r1.getCommit().name()).rebase(ri);
-  }
-
-  @Test
-  public void rebaseAbandonedChange() throws Exception {
-    PushOneCommit.Result r = createChange();
-    String changeId = r.getChangeId();
-    assertThat(info(changeId).status).isEqualTo(ChangeStatus.NEW);
-    gApi.changes().id(changeId).abandon();
-    ChangeInfo info = get(changeId);
-    assertThat(info.status).isEqualTo(ChangeStatus.ABANDONED);
-
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("change is abandoned");
-    gApi.changes().id(changeId).revision(r.getCommit().name()).rebase();
-  }
-
-  @Test
-  public void rebaseOntoAbandonedChange() throws Exception {
-    // Create two changes both with the same parent
-    PushOneCommit.Result r = createChange();
-    testRepo.reset("HEAD~1");
-    PushOneCommit.Result r2 = createChange();
-
-    // Abandon the first change
-    String changeId = r.getChangeId();
-    assertThat(info(changeId).status).isEqualTo(ChangeStatus.NEW);
-    gApi.changes().id(changeId).abandon();
-    ChangeInfo info = get(changeId);
-    assertThat(info.status).isEqualTo(ChangeStatus.ABANDONED);
-
-    RebaseInput ri = new RebaseInput();
-    ri.base = r.getCommit().name();
-
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("base change is abandoned: " + changeId);
-    gApi.changes().id(r2.getChangeId()).revision(r2.getCommit().name()).rebase(ri);
-  }
-
-  @Test
-  public void rebaseOntoSelf() throws Exception {
-    PushOneCommit.Result r = createChange();
-    String changeId = r.getChangeId();
-    String commit = r.getCommit().name();
-    RebaseInput ri = new RebaseInput();
-    ri.base = commit;
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("cannot rebase change onto itself");
-    gApi.changes().id(changeId).revision(commit).rebase(ri);
-  }
-
-  @Test
-  @TestProjectInput(createEmptyCommit = false)
-  public void changeNoParentToOneParent() throws Exception {
-    // create initial commit with no parent and push it as change, so that patch
-    // set 1 has no parent
-    RevCommit c = testRepo.commit().message("Initial commit").insertChangeId().create();
-    String id = GitUtil.getChangeId(testRepo, c).get();
-    testRepo.reset(c);
-
-    PushResult pr = pushHead(testRepo, "refs/for/master", false);
-    assertPushOk(pr, "refs/for/master");
-
-    ChangeInfo change = gApi.changes().id(id).get();
-    assertThat(change.revisions.get(change.currentRevision).commit.parents).isEmpty();
-
-    // create another initial commit with no parent and push it directly into
-    // the remote repository
-    c = testRepo.amend(c.getId()).message("Initial Empty Commit").create();
-    testRepo.reset(c);
-    pr = pushHead(testRepo, "refs/heads/master", false);
-    assertPushOk(pr, "refs/heads/master");
-
-    // create a successor commit and push it as second patch set to the change,
-    // so that patch set 2 has 1 parent
-    RevCommit c2 =
-        testRepo
-            .commit()
-            .message("Initial commit")
-            .parent(c)
-            .insertChangeId(id.substring(1))
-            .create();
-    testRepo.reset(c2);
-
-    pr = pushHead(testRepo, "refs/for/master", false);
-    assertPushOk(pr, "refs/for/master");
-
-    change = gApi.changes().id(id).get();
-    RevisionInfo rev = change.revisions.get(change.currentRevision);
-    assertThat(rev.commit.parents).hasSize(1);
-    assertThat(rev.commit.parents.get(0).commit).isEqualTo(c.name());
-
-    // check that change kind is correctly detected as REWORK
-    assertThat(rev.kind).isEqualTo(ChangeKind.REWORK);
-  }
-
-  @Test
-  public void pushCommitOfOtherUser() throws Exception {
-    // admin pushes commit of user
-    PushOneCommit push = pushFactory.create(db, user.getIdent(), testRepo);
-    PushOneCommit.Result result = push.to("refs/for/master");
-    result.assertOkStatus();
-
-    ChangeInfo change = gApi.changes().id(result.getChangeId()).get();
-    assertThat(change.owner._accountId).isEqualTo(admin.id.get());
-    CommitInfo commit = change.revisions.get(change.currentRevision).commit;
-    assertThat(commit.author.email).isEqualTo(user.email);
-    assertThat(commit.committer.email).isEqualTo(user.email);
-
-    // check that the author/committer was added as reviewer
-    Collection<AccountInfo> reviewers = change.reviewers.get(REVIEWER);
-    assertThat(reviewers).isNotNull();
-    assertThat(reviewers).hasSize(1);
-    assertThat(reviewers.iterator().next()._accountId).isEqualTo(user.getId().get());
-    assertThat(change.reviewers.get(CC)).isNull();
-
-    List<Message> messages = sender.getMessages();
-    assertThat(messages).hasSize(1);
-    Message m = messages.get(0);
-    assertThat(m.rcpt()).containsExactly(user.emailAddress);
-    assertThat(m.body()).contains(admin.fullName + " has uploaded this change for review");
-    assertThat(m.body()).contains("Change subject: " + PushOneCommit.SUBJECT + "\n");
-    assertMailReplyTo(m, admin.email);
-  }
-
-  @Test
-  public void pushCommitOfOtherUserThatCannotSeeChange() throws Exception {
-    // create hidden project that is only visible to administrators
-    Project.NameKey p = createProject("p");
-    ProjectConfig cfg = projectCache.checkedGet(p).getConfig();
-    Util.allow(
-        cfg,
-        Permission.READ,
-        groupCache.get(new AccountGroup.NameKey("Administrators")).orElse(null).getGroupUUID(),
-        "refs/*");
-    Util.block(cfg, Permission.READ, REGISTERED_USERS, "refs/*");
-    saveProjectConfig(p, cfg);
-
-    // admin pushes commit of user
-    TestRepository<InMemoryRepository> repo = cloneProject(p, admin);
-    PushOneCommit push = pushFactory.create(db, user.getIdent(), repo);
-    PushOneCommit.Result result = push.to("refs/for/master");
-    result.assertOkStatus();
-
-    ChangeInfo change = gApi.changes().id(result.getChangeId()).get();
-    assertThat(change.owner._accountId).isEqualTo(admin.id.get());
-    CommitInfo commit = change.revisions.get(change.currentRevision).commit;
-    assertThat(commit.author.email).isEqualTo(user.email);
-    assertThat(commit.committer.email).isEqualTo(user.email);
-
-    // check the user cannot see the change
-    setApiUser(user);
-    try {
-      gApi.changes().id(result.getChangeId()).get();
-      fail("Expected ResourceNotFoundException");
-    } catch (ResourceNotFoundException e) {
-      // Expected.
-    }
-
-    // check that the author/committer was NOT added as reviewer (he can't see
-    // the change)
-    assertThat(change.reviewers.get(REVIEWER)).isNull();
-    assertThat(change.reviewers.get(CC)).isNull();
-    assertThat(sender.getMessages()).isEmpty();
-  }
-
-  @Test
-  public void pushCommitWithFooterOfOtherUser() throws Exception {
-    // admin pushes commit that references 'user' in a footer
-    PushOneCommit push =
-        pushFactory.create(
-            db,
-            admin.getIdent(),
-            testRepo,
-            PushOneCommit.SUBJECT
-                + "\n\n"
-                + FooterConstants.REVIEWED_BY.getName()
-                + ": "
-                + user.getIdent().toExternalString(),
-            PushOneCommit.FILE_NAME,
-            PushOneCommit.FILE_CONTENT);
-    PushOneCommit.Result result = push.to("refs/for/master");
-    result.assertOkStatus();
-
-    // check that 'user' was added as reviewer
-    ChangeInfo change = gApi.changes().id(result.getChangeId()).get();
-    Collection<AccountInfo> reviewers = change.reviewers.get(REVIEWER);
-    assertThat(reviewers).isNotNull();
-    assertThat(reviewers).hasSize(1);
-    assertThat(reviewers.iterator().next()._accountId).isEqualTo(user.getId().get());
-    assertThat(change.reviewers.get(CC)).isNull();
-
-    List<Message> messages = sender.getMessages();
-    assertThat(messages).hasSize(1);
-    Message m = messages.get(0);
-    assertThat(m.rcpt()).containsExactly(user.emailAddress);
-    assertThat(m.body()).contains("Hello " + user.fullName + ",\n");
-    assertThat(m.body()).contains("I'd like you to do a code review.");
-    assertThat(m.body()).contains("Change subject: " + PushOneCommit.SUBJECT + "\n");
-    assertMailReplyTo(m, admin.email);
-  }
-
-  @Test
-  public void pushCommitWithFooterOfOtherUserThatCannotSeeChange() throws Exception {
-    // create hidden project that is only visible to administrators
-    Project.NameKey p = createProject("p");
-    ProjectConfig cfg = projectCache.checkedGet(p).getConfig();
-    Util.allow(
-        cfg,
-        Permission.READ,
-        groupCache.get(new AccountGroup.NameKey("Administrators")).orElse(null).getGroupUUID(),
-        "refs/*");
-    Util.block(cfg, Permission.READ, REGISTERED_USERS, "refs/*");
-    saveProjectConfig(p, cfg);
-
-    // admin pushes commit that references 'user' in a footer
-    TestRepository<InMemoryRepository> repo = cloneProject(p, admin);
-    PushOneCommit push =
-        pushFactory.create(
-            db,
-            admin.getIdent(),
-            repo,
-            PushOneCommit.SUBJECT
-                + "\n\n"
-                + FooterConstants.REVIEWED_BY.getName()
-                + ": "
-                + user.getIdent().toExternalString(),
-            PushOneCommit.FILE_NAME,
-            PushOneCommit.FILE_CONTENT);
-    PushOneCommit.Result result = push.to("refs/for/master");
-    result.assertOkStatus();
-
-    // check that 'user' cannot see the change
-    setApiUser(user);
-    try {
-      gApi.changes().id(result.getChangeId()).get();
-      fail("Expected ResourceNotFoundException");
-    } catch (ResourceNotFoundException e) {
-      // Expected.
-    }
-
-    // check that 'user' was NOT added as cc ('user' can't see the change)
-    setApiUser(admin);
-    ChangeInfo change = gApi.changes().id(result.getChangeId()).get();
-    assertThat(change.reviewers.get(REVIEWER)).isNull();
-    assertThat(change.reviewers.get(CC)).isNull();
-    assertThat(sender.getMessages()).isEmpty();
-  }
-
-  @Test
-  public void addReviewerThatCannotSeeChange() throws Exception {
-    // create hidden project that is only visible to administrators
-    Project.NameKey p = createProject("p");
-    ProjectConfig cfg = projectCache.checkedGet(p).getConfig();
-    Util.allow(
-        cfg,
-        Permission.READ,
-        groupCache.get(new AccountGroup.NameKey("Administrators")).orElse(null).getGroupUUID(),
-        "refs/*");
-    Util.block(cfg, Permission.READ, REGISTERED_USERS, "refs/*");
-    saveProjectConfig(p, cfg);
-
-    // create change
-    TestRepository<InMemoryRepository> repo = cloneProject(p, admin);
-    PushOneCommit push = pushFactory.create(db, admin.getIdent(), repo);
-    PushOneCommit.Result result = push.to("refs/for/master");
-    result.assertOkStatus();
-
-    // check the user cannot see the change
-    setApiUser(user);
-    try {
-      gApi.changes().id(result.getChangeId()).get();
-      fail("Expected ResourceNotFoundException");
-    } catch (ResourceNotFoundException e) {
-      // Expected.
-    }
-
-    // try to add user as reviewer
-    setApiUser(admin);
-    AddReviewerInput in = new AddReviewerInput();
-    in.reviewer = user.email;
-    AddReviewerResult r = gApi.changes().id(result.getChangeId()).addReviewer(in);
-
-    assertThat(r.input).isEqualTo(user.email);
-    assertThat(r.error).contains("does not have permission to see this change");
-    assertThat(r.reviewers).isNull();
-  }
-
-  @Test
-  public void addReviewerThatIsInactive() throws Exception {
-    PushOneCommit.Result result = createChange();
-
-    String username = name("new-user");
-    gApi.accounts().create(username).setActive(false);
-
-    AddReviewerInput in = new AddReviewerInput();
-    in.reviewer = username;
-    AddReviewerResult r = gApi.changes().id(result.getChangeId()).addReviewer(in);
-
-    assertThat(r.input).isEqualTo(username);
-    assertThat(r.error).contains("identifies an inactive account");
-    assertThat(r.reviewers).isNull();
-  }
-
-  @Test
-  public void addReviewerThatIsInactiveEmailFallback() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    ConfigInput conf = new ConfigInput();
-    conf.enableReviewerByEmail = InheritableBoolean.TRUE;
-    gApi.projects().name(project.get()).config(conf);
-
-    PushOneCommit.Result result = createChange();
-
-    String username = "user@domain.com";
-    gApi.accounts().create(username).setActive(false);
-
-    AddReviewerInput in = new AddReviewerInput();
-    in.reviewer = username;
-    in.state = ReviewerState.CC;
-    AddReviewerResult r = gApi.changes().id(result.getChangeId()).addReviewer(in);
-
-    assertThat(r.input).isEqualTo(username);
-    assertThat(r.error).isNull();
-    // When adding by email, the reviewers field is also empty because we can't
-    // render a ReviewerInfo object for a non-account.
-    assertThat(r.reviewers).isNull();
-  }
-
-  @Test
-  public void addReviewer() throws Exception {
-    TestTimeUtil.resetWithClockStep(1, SECONDS);
-    PushOneCommit.Result r = createChange();
-    ChangeResource rsrc = parseResource(r);
-    String oldETag = rsrc.getETag();
-    Timestamp oldTs = rsrc.getChange().getLastUpdatedOn();
-
-    AddReviewerInput in = new AddReviewerInput();
-    in.reviewer = user.email;
-    gApi.changes().id(r.getChangeId()).addReviewer(in);
-
-    List<Message> messages = sender.getMessages();
-    assertThat(messages).hasSize(1);
-    Message m = messages.get(0);
-    assertThat(m.rcpt()).containsExactly(user.emailAddress);
-    assertThat(m.body()).contains("Hello " + user.fullName + ",\n");
-    assertThat(m.body()).contains("I'd like you to do a code review.");
-    assertThat(m.body()).contains("Change subject: " + PushOneCommit.SUBJECT + "\n");
-    assertMailReplyTo(m, admin.email);
-    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
-
-    // When NoteDb is enabled adding a reviewer records that user as reviewer
-    // in NoteDb. When NoteDb is disabled adding a reviewer results in a dummy 0
-    // approval on the change which is treated as CC when the ChangeInfo is
-    // created.
-    Collection<AccountInfo> reviewers = c.reviewers.get(REVIEWER);
-    assertThat(reviewers).isNotNull();
-    assertThat(reviewers).hasSize(1);
-    assertThat(reviewers.iterator().next()._accountId).isEqualTo(user.getId().get());
-
-    // Ensure ETag and lastUpdatedOn are updated.
-    rsrc = parseResource(r);
-    assertThat(rsrc.getETag()).isNotEqualTo(oldETag);
-    assertThat(rsrc.getChange().getLastUpdatedOn()).isNotEqualTo(oldTs);
-
-    // Change status of reviewer and ensure ETag is updated.
-    oldETag = rsrc.getETag();
-    gApi.accounts().id(user.id.get()).setStatus("new status");
-    rsrc = parseResource(r);
-    assertThat(rsrc.getETag()).isNotEqualTo(oldETag);
-  }
-
-  @Test
-  public void listReviewers() throws Exception {
-    PushOneCommit.Result r = createChange();
-    AddReviewerInput in = new AddReviewerInput();
-    in.reviewer = user.email;
-    gApi.changes().id(r.getChangeId()).addReviewer(in);
-    assertThat(gApi.changes().id(r.getChangeId()).reviewers()).hasSize(1);
-
-    TestAccount user1 =
-        accountCreator.create(name("user1"), name("user1") + "@example.com", "User 1");
-    in.reviewer = user1.email;
-    in.state = ReviewerState.CC;
-    gApi.changes().id(r.getChangeId()).addReviewer(in);
-    assertThat(gApi.changes().id(r.getChangeId()).reviewers().stream().map(a -> a.username))
-        .containsExactly(user.username, user1.username);
-  }
-
-  @Test
-  public void notificationsForAddedWorkInProgressReviewers() throws Exception {
-    AddReviewerInput in = new AddReviewerInput();
-    in.reviewer = user.email;
-    ReviewInput batchIn = new ReviewInput();
-    batchIn.reviewers = ImmutableList.of(in);
-
-    // Added reviewers not notified by default.
-    PushOneCommit.Result r = createWorkInProgressChange();
-    gApi.changes().id(r.getChangeId()).addReviewer(in);
-    assertThat(sender.getMessages()).hasSize(0);
-
-    // Default notification handling can be overridden.
-    r = createWorkInProgressChange();
-    in.notify = NotifyHandling.OWNER_REVIEWERS;
-    gApi.changes().id(r.getChangeId()).addReviewer(in);
-    assertThat(sender.getMessages()).hasSize(1);
-    sender.clear();
-
-    // Reviewers added via PostReview also not notified by default.
-    // In this case, the child ReviewerInput has a notify=OWNER_REVIEWERS
-    // that should be ignored.
-    r = createWorkInProgressChange();
-    gApi.changes().id(r.getChangeId()).revision("current").review(batchIn);
-    assertThat(sender.getMessages()).hasSize(0);
-
-    // Top-level notify property can force notifications when adding reviewer
-    // via PostReview.
-    r = createWorkInProgressChange();
-    batchIn.notify = NotifyHandling.OWNER_REVIEWERS;
-    gApi.changes().id(r.getChangeId()).revision("current").review(batchIn);
-    assertThat(sender.getMessages()).hasSize(1);
-  }
-
-  @Test
-  public void addReviewerThatIsNotPerfectMatch() throws Exception {
-    TestTimeUtil.resetWithClockStep(1, SECONDS);
-    PushOneCommit.Result r = createChange();
-    ChangeResource rsrc = parseResource(r);
-    String oldETag = rsrc.getETag();
-    Timestamp oldTs = rsrc.getChange().getLastUpdatedOn();
-
-    // create a group named "ab" with one user: testUser
-    TestAccount testUser = accountCreator.create("abcd", "abcd@test.com", "abcd");
-    String testGroup = createGroupWithRealName("ab");
-    GroupApi groupApi = gApi.groups().id(testGroup);
-    groupApi.description("test group");
-    groupApi.addMembers(user.fullName);
-
-    AddReviewerInput in = new AddReviewerInput();
-    in.reviewer = "abc";
-    gApi.changes().id(r.getChangeId()).addReviewer(in.reviewer);
-
-    List<Message> messages = sender.getMessages();
-    assertThat(messages).hasSize(1);
-    Message m = messages.get(0);
-    assertThat(m.rcpt()).containsExactly(testUser.emailAddress);
-    assertThat(m.body()).contains("Hello " + testUser.fullName + ",\n");
-    assertThat(m.body()).contains("I'd like you to do a code review.");
-    assertThat(m.body()).contains("Change subject: " + PushOneCommit.SUBJECT + "\n");
-    assertMailReplyTo(m, testUser.email);
-    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
-
-    // When NoteDb is enabled adding a reviewer records that user as reviewer
-    // in NoteDb. When NoteDb is disabled adding a reviewer results in a dummy 0
-    // approval on the change which is treated as CC when the ChangeInfo is
-    // created.
-    Collection<AccountInfo> reviewers = c.reviewers.get(REVIEWER);
-    assertThat(reviewers).isNotNull();
-    assertThat(reviewers).hasSize(1);
-    assertThat(reviewers.iterator().next()._accountId).isEqualTo(testUser.getId().get());
-
-    // Ensure ETag and lastUpdatedOn are updated.
-    rsrc = parseResource(r);
-    assertThat(rsrc.getETag()).isNotEqualTo(oldETag);
-    assertThat(rsrc.getChange().getLastUpdatedOn()).isNotEqualTo(oldTs);
-  }
-
-  @Test
-  public void addGroupAsReviewersWhenANotPerfectMatchedUserExists() throws Exception {
-    TestTimeUtil.resetWithClockStep(1, SECONDS);
-    PushOneCommit.Result r = createChange();
-    ChangeResource rsrc = parseResource(r);
-    String oldETag = rsrc.getETag();
-    Timestamp oldTs = rsrc.getChange().getLastUpdatedOn();
-
-    // create a group named "kobe" with one user: lee
-    TestAccount testUser = accountCreator.create("kobebryant", "kobebryant@test.com", "kobebryant");
-    TestAccount myGroupUser = accountCreator.create("lee", "lee@test.com", "lee");
-
-    String testGroup = createGroupWithRealName("kobe");
-    GroupApi groupApi = gApi.groups().id(testGroup);
-    groupApi.description("test group");
-    groupApi.addMembers(myGroupUser.fullName);
-
-    // ensure that user "user" is not in the group
-    groupApi.removeMembers(testUser.fullName);
-
-    AddReviewerInput in = new AddReviewerInput();
-    in.reviewer = testGroup;
-    gApi.changes().id(r.getChangeId()).addReviewer(in.reviewer);
-
-    List<Message> messages = sender.getMessages();
-    assertThat(messages).hasSize(1);
-    Message m = messages.get(0);
-    assertThat(m.rcpt()).containsExactly(myGroupUser.emailAddress);
-    assertThat(m.body()).contains("Hello " + myGroupUser.fullName + ",\n");
-    assertThat(m.body()).contains("I'd like you to do a code review.");
-    assertThat(m.body()).contains("Change subject: " + PushOneCommit.SUBJECT + "\n");
-    assertMailReplyTo(m, myGroupUser.email);
-    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
-
-    // When NoteDb is enabled adding a reviewer records that user as reviewer
-    // in NoteDb. When NoteDb is disabled adding a reviewer results in a dummy 0
-    // approval on the change which is treated as CC when the ChangeInfo is
-    // created.
-    Collection<AccountInfo> reviewers = c.reviewers.get(REVIEWER);
-    assertThat(reviewers).isNotNull();
-    assertThat(reviewers).hasSize(1);
-    assertThat(reviewers.iterator().next()._accountId).isEqualTo(myGroupUser.getId().get());
-
-    // Ensure ETag and lastUpdatedOn are updated.
-    rsrc = parseResource(r);
-    assertThat(rsrc.getETag()).isNotEqualTo(oldETag);
-    assertThat(rsrc.getChange().getLastUpdatedOn()).isNotEqualTo(oldTs);
-  }
-
-  @Test
-  public void addReviewerWithNoteDbWhenDummyApprovalInReviewDbExists() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    assume().that(notesMigration.changePrimaryStorage()).isEqualTo(PrimaryStorage.REVIEW_DB);
-
-    PushOneCommit.Result r = createChange();
-
-    // insert dummy approval in ReviewDb
-    PatchSetApproval psa =
-        new PatchSetApproval(
-            new PatchSetApproval.Key(r.getPatchSetId(), user.id, new LabelId("Code-Review")),
-            (short) 0,
-            TimeUtil.nowTs());
-    db.patchSetApprovals().insert(Collections.singleton(psa));
-
-    AddReviewerInput in = new AddReviewerInput();
-    in.reviewer = user.email;
-    gApi.changes().id(r.getChangeId()).addReviewer(in);
-  }
-
-  @Test
-  public void addSelfAsReviewer() throws Exception {
-    TestTimeUtil.resetWithClockStep(1, SECONDS);
-    PushOneCommit.Result r = createChange();
-    ChangeResource rsrc = parseResource(r);
-    String oldETag = rsrc.getETag();
-    Timestamp oldTs = rsrc.getChange().getLastUpdatedOn();
-
-    AddReviewerInput in = new AddReviewerInput();
-    in.reviewer = user.email;
-    setApiUser(user);
-    gApi.changes().id(r.getChangeId()).addReviewer(in);
-
-    // There should be no email notification when adding self
-    assertThat(sender.getMessages()).isEmpty();
-
-    // When NoteDb is enabled adding a reviewer records that user as reviewer
-    // in NoteDb. When NoteDb is disabled adding a reviewer results in a dummy 0
-    // approval on the change which is treated as CC when the ChangeInfo is
-    // created.
-    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
-    Collection<AccountInfo> reviewers = c.reviewers.get(REVIEWER);
-    assertThat(reviewers).isNotNull();
-    assertThat(reviewers).hasSize(1);
-    assertThat(reviewers.iterator().next()._accountId).isEqualTo(user.getId().get());
-
-    // Ensure ETag and lastUpdatedOn are updated.
-    rsrc = parseResource(r);
-    assertThat(rsrc.getETag()).isNotEqualTo(oldETag);
-    assertThat(rsrc.getChange().getLastUpdatedOn()).isNotEqualTo(oldTs);
-  }
-
-  @Test
-  public void implicitlyCcOnNonVotingReviewPgStyle() throws Exception {
-    PushOneCommit.Result r = createChange();
-    setApiUser(user);
-    assertThat(getReviewerState(r.getChangeId(), user.id)).isEmpty();
-
-    // Exact request format made by PG UI at ddc6b7160fe416fed9e7e3180489d44c82fd64f8.
-    ReviewInput in = new ReviewInput();
-    in.drafts = DraftHandling.PUBLISH_ALL_REVISIONS;
-    in.labels = ImmutableMap.of();
-    in.message = "comment";
-    in.reviewers = ImmutableList.of();
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(in);
-
-    // If we're not reading from NoteDb, then the CCed user will be returned in the REVIEWER state.
-    assertThat(getReviewerState(r.getChangeId(), user.id))
-        .hasValue(notesMigration.readChanges() ? CC : REVIEWER);
-  }
-
-  @Test
-  public void implicitlyCcOnNonVotingReviewGwtStyle() throws Exception {
-    PushOneCommit.Result r = createChange();
-    setApiUser(user);
-    assertThat(getReviewerState(r.getChangeId(), user.id)).isEmpty();
-
-    // Exact request format made by GWT UI at ddc6b7160fe416fed9e7e3180489d44c82fd64f8.
-    ReviewInput in = new ReviewInput();
-    in.labels = ImmutableMap.of("Code-Review", (short) 0);
-    in.drafts = DraftHandling.PUBLISH_ALL_REVISIONS;
-    in.message = "comment";
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(in);
-
-    // If we're not reading from NoteDb, then the CCed user will be returned in the REVIEWER state.
-    assertThat(getReviewerState(r.getChangeId(), user.id))
-        .hasValue(notesMigration.readChanges() ? CC : REVIEWER);
-  }
-
-  @Test
-  public void implicitlyAddReviewerOnVotingReview() throws Exception {
-    PushOneCommit.Result r = createChange();
-    setApiUser(user);
-    gApi.changes()
-        .id(r.getChangeId())
-        .revision(r.getCommit().name())
-        .review(ReviewInput.recommend().message("LGTM"));
-
-    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
-    assertThat(c.reviewers.get(REVIEWER).stream().map(ai -> ai._accountId).collect(toList()))
-        .containsExactly(user.id.get());
-
-    // Further test: remove the vote, then comment again. The user should be
-    // implicitly re-added to the ReviewerSet, as a CC if we're using NoteDb.
-    setApiUser(admin);
-    gApi.changes().id(r.getChangeId()).reviewer(user.getId().toString()).remove();
-    c = gApi.changes().id(r.getChangeId()).get();
-    assertThat(c.reviewers.values()).isEmpty();
-
-    setApiUser(user);
-    gApi.changes()
-        .id(r.getChangeId())
-        .revision(r.getCommit().name())
-        .review(new ReviewInput().message("hi"));
-    c = gApi.changes().id(r.getChangeId()).get();
-    ReviewerState state = notesMigration.readChanges() ? CC : REVIEWER;
-    assertThat(c.reviewers.get(state).stream().map(ai -> ai._accountId).collect(toList()))
-        .containsExactly(user.id.get());
-  }
-
-  @Test
-  public void addReviewerToClosedChange() throws Exception {
-    PushOneCommit.Result r = createChange();
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).submit();
-
-    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
-    Collection<AccountInfo> reviewers = c.reviewers.get(REVIEWER);
-    assertThat(reviewers).hasSize(1);
-    assertThat(reviewers.iterator().next()._accountId).isEqualTo(admin.getId().get());
-    assertThat(c.reviewers).doesNotContainKey(CC);
-
-    AddReviewerInput in = new AddReviewerInput();
-    in.reviewer = user.email;
-    gApi.changes().id(r.getChangeId()).addReviewer(in);
-
-    c = gApi.changes().id(r.getChangeId()).get();
-    reviewers = c.reviewers.get(REVIEWER);
-    assertThat(reviewers).hasSize(2);
-    Iterator<AccountInfo> reviewerIt = reviewers.iterator();
-    assertThat(reviewerIt.next()._accountId).isEqualTo(admin.getId().get());
-    assertThat(reviewerIt.next()._accountId).isEqualTo(user.getId().get());
-    assertThat(c.reviewers).doesNotContainKey(CC);
-  }
-
-  @Test
-  public void eTagChangesWhenOwnerUpdatesAccountStatus() throws Exception {
-    PushOneCommit.Result r = createChange();
-    ChangeResource rsrc = parseResource(r);
-    String oldETag = rsrc.getETag();
-
-    gApi.accounts().id(admin.id.get()).setStatus("new status");
-    rsrc = parseResource(r);
-    assertThat(rsrc.getETag()).isNotEqualTo(oldETag);
-  }
-
-  @Test
-  public void emailNotificationForFileLevelComment() throws Exception {
-    String changeId = createChange().getChangeId();
-
-    AddReviewerInput in = new AddReviewerInput();
-    in.reviewer = user.email;
-    gApi.changes().id(changeId).addReviewer(in);
-    sender.clear();
-
-    ReviewInput review = new ReviewInput();
-    ReviewInput.CommentInput comment = new ReviewInput.CommentInput();
-    comment.path = PushOneCommit.FILE_NAME;
-    comment.side = Side.REVISION;
-    comment.message = "comment 1";
-    review.comments = new HashMap<>();
-    review.comments.put(comment.path, Lists.newArrayList(comment));
-    gApi.changes().id(changeId).current().review(review);
-
-    assertThat(sender.getMessages()).hasSize(1);
-    Message m = sender.getMessages().get(0);
-    assertThat(m.rcpt()).containsExactly(user.emailAddress);
-  }
-
-  @Test
-  public void invalidRange() throws Exception {
-    String changeId = createChange().getChangeId();
-
-    ReviewInput review = new ReviewInput();
-    ReviewInput.CommentInput comment = new ReviewInput.CommentInput();
-
-    comment.range = new Range();
-    comment.range.startLine = 1;
-    comment.range.endLine = 1;
-    comment.range.startCharacter = -1;
-    comment.range.endCharacter = 0;
-
-    comment.path = PushOneCommit.FILE_NAME;
-    comment.side = Side.REVISION;
-    comment.message = "comment 1";
-    review.comments = ImmutableMap.of(comment.path, Lists.newArrayList(comment));
-
-    exception.expect(BadRequestException.class);
-    gApi.changes().id(changeId).current().review(review);
-  }
-
-  @Test
-  public void listVotes() throws Exception {
-    PushOneCommit.Result r = createChange();
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
-
-    Map<String, Short> m =
-        gApi.changes().id(r.getChangeId()).reviewer(admin.getId().toString()).votes();
-
-    assertThat(m).hasSize(1);
-    assertThat(m).containsEntry("Code-Review", Short.valueOf((short) 2));
-
-    setApiUser(user);
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.dislike());
-
-    m = gApi.changes().id(r.getChangeId()).reviewer(user.getId().toString()).votes();
-
-    assertThat(m).hasSize(1);
-    assertThat(m).containsEntry("Code-Review", Short.valueOf((short) -1));
-  }
-
-  @Test
-  public void removeReviewerNoVotes() throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-
-    LabelType verified =
-        category("Verified", value(1, "Passes"), value(0, "No score"), value(-1, "Failed"));
-    cfg.getLabelSections().put(verified.getName(), verified);
-
-    AccountGroup.UUID registeredUsers = systemGroupBackend.getGroup(REGISTERED_USERS).getUUID();
-    String heads = RefNames.REFS_HEADS + "*";
-    Util.allow(cfg, Permission.forLabel(Util.verified().getName()), -1, 1, registeredUsers, heads);
-    saveProjectConfig(project, cfg);
-
-    PushOneCommit.Result r = createChange();
-    String changeId = r.getChangeId();
-    gApi.changes().id(changeId).addReviewer(user.getId().toString());
-
-    // ReviewerState will vary between ReviewDb and NoteDb; we just care that it
-    // shows up somewhere.
-    Iterable<AccountInfo> reviewers =
-        Iterables.concat(gApi.changes().id(changeId).get().reviewers.values());
-    assertThat(reviewers).hasSize(1);
-    assertThat(reviewers.iterator().next()._accountId).isEqualTo(user.getId().get());
-
-    sender.clear();
-    gApi.changes().id(changeId).reviewer(user.getId().toString()).remove();
-    assertThat(gApi.changes().id(changeId).get().reviewers).isEmpty();
-
-    assertThat(sender.getMessages()).hasSize(1);
-    Message message = sender.getMessages().get(0);
-    assertThat(message.body()).contains("Removed reviewer " + user.fullName + ".");
-    assertThat(message.body()).doesNotContain("with the following votes");
-
-    // Make sure the reviewer can still be added again.
-    gApi.changes().id(changeId).addReviewer(user.getId().toString());
-    reviewers = Iterables.concat(gApi.changes().id(changeId).get().reviewers.values());
-    assertThat(reviewers).hasSize(1);
-    assertThat(reviewers.iterator().next()._accountId).isEqualTo(user.getId().get());
-
-    // Remove again, and then try to remove once more to verify 404 is
-    // returned.
-    gApi.changes().id(changeId).reviewer(user.getId().toString()).remove();
-    exception.expect(ResourceNotFoundException.class);
-    gApi.changes().id(changeId).reviewer(user.getId().toString()).remove();
-  }
-
-  @Test
-  public void removeReviewer() throws Exception {
-    testRemoveReviewer(true);
-  }
-
-  @Test
-  public void removeNoNotify() throws Exception {
-    testRemoveReviewer(false);
-  }
-
-  private void testRemoveReviewer(boolean notify) throws Exception {
-    PushOneCommit.Result r = createChange();
-    String changeId = r.getChangeId();
-    gApi.changes().id(changeId).revision(r.getCommit().name()).review(ReviewInput.approve());
-
-    setApiUser(user);
-    gApi.changes().id(changeId).revision(r.getCommit().name()).review(ReviewInput.recommend());
-
-    Collection<AccountInfo> reviewers = gApi.changes().id(changeId).get().reviewers.get(REVIEWER);
-
-    assertThat(reviewers).hasSize(2);
-    Iterator<AccountInfo> reviewerIt = reviewers.iterator();
-    assertThat(reviewerIt.next()._accountId).isEqualTo(admin.getId().get());
-    assertThat(reviewerIt.next()._accountId).isEqualTo(user.getId().get());
-
-    sender.clear();
-    setApiUser(admin);
-    DeleteReviewerInput input = new DeleteReviewerInput();
-    if (!notify) {
-      input.notify = NotifyHandling.NONE;
-    }
-    gApi.changes().id(changeId).reviewer(user.getId().toString()).remove(input);
-
-    if (notify) {
-      assertThat(sender.getMessages()).hasSize(1);
-      Message message = sender.getMessages().get(0);
-      assertThat(message.body())
-          .contains("Removed reviewer " + user.fullName + " with the following votes");
-      assertThat(message.body()).contains("* Code-Review+1 by " + user.fullName);
-    } else {
-      assertThat(sender.getMessages()).isEmpty();
-    }
-
-    reviewers = gApi.changes().id(changeId).get().reviewers.get(REVIEWER);
-    assertThat(reviewers).hasSize(1);
-    reviewerIt = reviewers.iterator();
-    assertThat(reviewerIt.next()._accountId).isEqualTo(admin.getId().get());
-
-    eventRecorder.assertReviewerDeletedEvents(changeId, user.email);
-  }
-
-  @Test
-  public void removeReviewerNotPermitted() throws Exception {
-    PushOneCommit.Result r = createChange();
-    String changeId = r.getChangeId();
-    gApi.changes().id(changeId).revision(r.getCommit().name()).review(ReviewInput.approve());
-
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    exception.expectMessage("remove reviewer not permitted");
-    gApi.changes().id(r.getChangeId()).reviewer(admin.getId().toString()).remove();
-  }
-
-  @Test
-  public void removeReviewerSelfFromMergedChangeNotPermitted() throws Exception {
-    PushOneCommit.Result r = createChange();
-    String changeId = r.getChangeId();
-
-    setApiUser(user);
-    recommend(changeId);
-
-    setApiUser(admin);
-    approve(changeId);
-    gApi.changes().id(changeId).revision(r.getCommit().name()).submit();
-
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    exception.expectMessage("remove reviewer not permitted");
-    gApi.changes().id(r.getChangeId()).reviewer("self").remove();
-  }
-
-  @Test
-  public void removeReviewerSelfFromAbandonedChangePermitted() throws Exception {
-    PushOneCommit.Result r = createChange();
-    String changeId = r.getChangeId();
-
-    setApiUser(user);
-    recommend(changeId);
-
-    setApiUser(admin);
-    gApi.changes().id(changeId).abandon();
-
-    setApiUser(user);
-    gApi.changes().id(r.getChangeId()).reviewer("self").remove();
-    eventRecorder.assertReviewerDeletedEvents(changeId, user.email);
-  }
-
-  @Test
-  public void removeOtherReviewerFromAbandonedChangeNotPermitted() throws Exception {
-    PushOneCommit.Result r = createChange();
-    String changeId = r.getChangeId();
-
-    setApiUser(user);
-    recommend(changeId);
-
-    setApiUser(admin);
-    approve(changeId);
-    gApi.changes().id(changeId).abandon();
-
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    exception.expectMessage("remove reviewer not permitted");
-    gApi.changes().id(r.getChangeId()).reviewer(admin.getId().toString()).remove();
-  }
-
-  @Test
-  public void deleteVote() throws Exception {
-    PushOneCommit.Result r = createChange();
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
-
-    setApiUser(user);
-    recommend(r.getChangeId());
-
-    setApiUser(admin);
-    sender.clear();
-    gApi.changes().id(r.getChangeId()).reviewer(user.getId().toString()).deleteVote("Code-Review");
-
-    List<Message> messages = sender.getMessages();
-    assertThat(messages).hasSize(1);
-    Message msg = messages.get(0);
-    assertThat(msg.rcpt()).containsExactly(user.emailAddress);
-    assertThat(msg.body()).contains(admin.fullName + " has removed a vote on this change.\n");
-    assertThat(msg.body())
-        .contains("Removed Code-Review+1 by " + user.fullName + " <" + user.email + ">\n");
-
-    Map<String, Short> m =
-        gApi.changes().id(r.getChangeId()).reviewer(user.getId().toString()).votes();
-
-    // Dummy 0 approval on the change to block vote copying to this patch set.
-    assertThat(m).containsExactly("Code-Review", Short.valueOf((short) 0));
-
-    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
-
-    ChangeMessageInfo message = Iterables.getLast(c.messages);
-    assertThat(message.author._accountId).isEqualTo(admin.getId().get());
-    assertThat(message.message).isEqualTo("Removed Code-Review+1 by User <user@example.com>\n");
-    assertThat(getReviewers(c.reviewers.get(REVIEWER)))
-        .containsExactlyElementsIn(ImmutableSet.of(admin.getId(), user.getId()));
-  }
-
-  @Test
-  public void deleteVoteNotifyNone() throws Exception {
-    PushOneCommit.Result r = createChange();
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
-
-    setApiUser(user);
-    recommend(r.getChangeId());
-
-    setApiUser(admin);
-    sender.clear();
-    DeleteVoteInput in = new DeleteVoteInput();
-    in.label = "Code-Review";
-    in.notify = NotifyHandling.NONE;
-    gApi.changes().id(r.getChangeId()).reviewer(user.getId().toString()).deleteVote(in);
-    assertThat(sender.getMessages()).isEmpty();
-  }
-
-  @Test
-  public void deleteVoteNotifyAccount() throws Exception {
-    PushOneCommit.Result r = createChange();
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
-
-    DeleteVoteInput in = new DeleteVoteInput();
-    in.label = "Code-Review";
-    in.notify = NotifyHandling.NONE;
-
-    // notify unrelated account as TO
-    TestAccount user2 = accountCreator.user2();
-    setApiUser(user);
-    recommend(r.getChangeId());
-    setApiUser(admin);
-    sender.clear();
-    in.notifyDetails = new HashMap<>();
-    in.notifyDetails.put(RecipientType.TO, new NotifyInfo(ImmutableList.of(user2.email)));
-    gApi.changes().id(r.getChangeId()).reviewer(user.getId().toString()).deleteVote(in);
-    assertNotifyTo(user2);
-
-    // notify unrelated account as CC
-    setApiUser(user);
-    recommend(r.getChangeId());
-    setApiUser(admin);
-    sender.clear();
-    in.notifyDetails = new HashMap<>();
-    in.notifyDetails.put(RecipientType.CC, new NotifyInfo(ImmutableList.of(user2.email)));
-    gApi.changes().id(r.getChangeId()).reviewer(user.getId().toString()).deleteVote(in);
-    assertNotifyCc(user2);
-
-    // notify unrelated account as BCC
-    setApiUser(user);
-    recommend(r.getChangeId());
-    setApiUser(admin);
-    sender.clear();
-    in.notifyDetails = new HashMap<>();
-    in.notifyDetails.put(RecipientType.BCC, new NotifyInfo(ImmutableList.of(user2.email)));
-    gApi.changes().id(r.getChangeId()).reviewer(user.getId().toString()).deleteVote(in);
-    assertNotifyBcc(user2);
-  }
-
-  @Test
-  public void deleteVoteNotPermitted() throws Exception {
-    PushOneCommit.Result r = createChange();
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
-
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    exception.expectMessage("delete vote not permitted");
-    gApi.changes().id(r.getChangeId()).reviewer(admin.getId().toString()).deleteVote("Code-Review");
-  }
-
-  @Test
-  public void nonVotingReviewerStaysAfterSubmit() throws Exception {
-    LabelType verified =
-        category("Verified", value(1, "Passes"), value(0, "No score"), value(-1, "Failed"));
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    cfg.getLabelSections().put(verified.getName(), verified);
-    String heads = "refs/heads/*";
-    AccountGroup.UUID owners = systemGroupBackend.getGroup(CHANGE_OWNER).getUUID();
-    AccountGroup.UUID registered = systemGroupBackend.getGroup(REGISTERED_USERS).getUUID();
-    Util.allow(cfg, Permission.forLabel(verified.getName()), -1, 1, owners, heads);
-    Util.allow(cfg, Permission.forLabel("Code-Review"), -2, +2, registered, heads);
-    saveProjectConfig(project, cfg);
-
-    // Set Code-Review+2 and Verified+1 as admin (change owner)
-    PushOneCommit.Result r = createChange();
-    String changeId = r.getChangeId();
-    String commit = r.getCommit().name();
-    ReviewInput input = ReviewInput.approve();
-    input.label(verified.getName(), 1);
-    gApi.changes().id(changeId).revision(commit).review(input);
-
-    // Reviewers should only be "admin"
-    ChangeInfo c = gApi.changes().id(changeId).get();
-    assertThat(getReviewers(c.reviewers.get(REVIEWER)))
-        .containsExactlyElementsIn(ImmutableSet.of(admin.getId()));
-    assertThat(c.reviewers.get(CC)).isNull();
-
-    // Add the user as reviewer
-    AddReviewerInput in = new AddReviewerInput();
-    in.reviewer = user.email;
-    gApi.changes().id(changeId).addReviewer(in);
-    c = gApi.changes().id(changeId).get();
-    assertThat(getReviewers(c.reviewers.get(REVIEWER)))
-        .containsExactlyElementsIn(ImmutableSet.of(admin.getId(), user.getId()));
-
-    // Approve the change as user, then remove the approval
-    // (only to confirm that the user does have Code-Review+2 permission)
-    setApiUser(user);
-    gApi.changes().id(changeId).revision(commit).review(ReviewInput.approve());
-    gApi.changes().id(changeId).revision(commit).review(ReviewInput.noScore());
-
-    // Submit the change
-    setApiUser(admin);
-    gApi.changes().id(changeId).revision(commit).submit();
-
-    // User should still be on the change
-    c = gApi.changes().id(changeId).get();
-    assertThat(getReviewers(c.reviewers.get(REVIEWER)))
-        .containsExactlyElementsIn(ImmutableSet.of(admin.getId(), user.getId()));
-  }
-
-  @Test
-  public void createEmptyChange() throws Exception {
-    ChangeInput in = new ChangeInput();
-    in.branch = Constants.MASTER;
-    in.subject = "Create a change from the API";
-    in.project = project.get();
-    ChangeInfo info = gApi.changes().create(in).get();
-    assertThat(info.project).isEqualTo(in.project);
-    assertThat(info.branch).isEqualTo(in.branch);
-    assertThat(info.subject).isEqualTo(in.subject);
-    assertThat(Iterables.getOnlyElement(info.messages).message).isEqualTo("Uploaded patch set 1.");
-  }
-
-  @Test
-  public void queryChangesNoQuery() throws Exception {
-    PushOneCommit.Result r = createChange();
-    List<ChangeInfo> results = gApi.changes().query().get();
-    assertThat(results.size()).isAtLeast(1);
-    List<Integer> ids = new ArrayList<>(results.size());
-    for (int i = 0; i < results.size(); i++) {
-      ChangeInfo info = results.get(i);
-      if (i == 0) {
-        assertThat(info._number).isEqualTo(r.getChange().getId().get());
-      }
-      assertThat(Change.Status.forChangeStatus(info.status).isOpen()).isTrue();
-      ids.add(info._number);
-    }
-    assertThat(ids).contains(r.getChange().getId().get());
-  }
-
-  @Test
-  public void queryChangesNoResults() throws Exception {
-    createChange();
-    assertThat(query("message:test")).isNotEmpty();
-    assertThat(query("message:{" + getClass().getName() + "fhqwhgads}")).isEmpty();
-  }
-
-  @Test
-  public void queryChanges() throws Exception {
-    PushOneCommit.Result r1 = createChange();
-    createChange();
-    List<ChangeInfo> results = query("project:{" + project.get() + "} " + r1.getChangeId());
-    assertThat(Iterables.getOnlyElement(results).changeId).isEqualTo(r1.getChangeId());
-  }
-
-  @Test
-  public void queryChangesLimit() throws Exception {
-    createChange();
-    PushOneCommit.Result r2 = createChange();
-    List<ChangeInfo> results = gApi.changes().query().withLimit(1).get();
-    assertThat(results).hasSize(1);
-    assertThat(Iterables.getOnlyElement(results).changeId).isEqualTo(r2.getChangeId());
-  }
-
-  @Test
-  public void queryChangesStart() throws Exception {
-    PushOneCommit.Result r1 = createChange();
-    createChange();
-    List<ChangeInfo> results =
-        gApi.changes().query("project:{" + project.get() + "}").withStart(1).get();
-    assertThat(Iterables.getOnlyElement(results).changeId).isEqualTo(r1.getChangeId());
-  }
-
-  @Test
-  public void queryChangesNoOptions() throws Exception {
-    PushOneCommit.Result r = createChange();
-    ChangeInfo result = Iterables.getOnlyElement(query(r.getChangeId()));
-    assertThat(result.labels).isNull();
-    assertThat(result.messages).isNull();
-    assertThat(result.revisions).isNull();
-    assertThat(result.actions).isNull();
-  }
-
-  @Test
-  public void queryChangesOptions() throws Exception {
-    PushOneCommit.Result r = createChange();
-
-    ChangeInfo result = Iterables.getOnlyElement(gApi.changes().query(r.getChangeId()).get());
-    assertThat(result.labels).isNull();
-    assertThat(result.messages).isNull();
-    assertThat(result.actions).isNull();
-    assertThat(result.revisions).isNull();
-
-    result =
-        Iterables.getOnlyElement(
-            gApi.changes()
-                .query(r.getChangeId())
-                .withOptions(
-                    ALL_REVISIONS, CHANGE_ACTIONS, CURRENT_ACTIONS, DETAILED_LABELS, MESSAGES)
-                .get());
-    assertThat(Iterables.getOnlyElement(result.labels.keySet())).isEqualTo("Code-Review");
-    assertThat(result.messages).hasSize(1);
-    assertThat(result.actions).isNotEmpty();
-
-    RevisionInfo rev = Iterables.getOnlyElement(result.revisions.values());
-    assertThat(rev._number).isEqualTo(r.getPatchSetId().get());
-    assertThat(rev.created).isNotNull();
-    assertThat(rev.uploader._accountId).isEqualTo(admin.getId().get());
-    assertThat(rev.ref).isEqualTo(r.getPatchSetId().toRefName());
-    assertThat(rev.actions).isNotEmpty();
-  }
-
-  @Test
-  public void queryChangesOwnerWithDifferentUsers() throws Exception {
-    PushOneCommit.Result r = createChange();
-    assertThat(
-            Iterables.getOnlyElement(query("project:{" + project.get() + "} owner:self")).changeId)
-        .isEqualTo(r.getChangeId());
-    setApiUser(user);
-    assertThat(query("owner:self project:{" + project.get() + "}")).isEmpty();
-  }
-
-  @Test
-  public void checkReviewedFlagBeforeAndAfterReview() throws Exception {
-    PushOneCommit.Result r = createChange();
-    AddReviewerInput in = new AddReviewerInput();
-    in.reviewer = user.email;
-    gApi.changes().id(r.getChangeId()).addReviewer(in);
-
-    setApiUser(user);
-    assertThat(get(r.getChangeId()).reviewed).isNull();
-
-    revision(r).review(ReviewInput.recommend());
-    assertThat(get(r.getChangeId()).reviewed).isTrue();
-  }
-
-  @Test
-  public void topic() throws Exception {
-    PushOneCommit.Result r = createChange();
-    assertThat(gApi.changes().id(r.getChangeId()).topic()).isEqualTo("");
-    gApi.changes().id(r.getChangeId()).topic("mytopic");
-    assertThat(gApi.changes().id(r.getChangeId()).topic()).isEqualTo("mytopic");
-    gApi.changes().id(r.getChangeId()).topic("");
-    assertThat(gApi.changes().id(r.getChangeId()).topic()).isEqualTo("");
-  }
-
-  @Test
-  public void editTopicWithoutPermissionNotAllowed() throws Exception {
-    PushOneCommit.Result r = createChange();
-    assertThat(gApi.changes().id(r.getChangeId()).topic()).isEqualTo("");
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    exception.expectMessage("edit topic name not permitted");
-    gApi.changes().id(r.getChangeId()).topic("mytopic");
-  }
-
-  @Test
-  public void editTopicWithPermissionAllowed() throws Exception {
-    PushOneCommit.Result r = createChange();
-    assertThat(gApi.changes().id(r.getChangeId()).topic()).isEqualTo("");
-    grant(project, "refs/heads/master", Permission.EDIT_TOPIC_NAME, false, REGISTERED_USERS);
-    setApiUser(user);
-    gApi.changes().id(r.getChangeId()).topic("mytopic");
-    assertThat(gApi.changes().id(r.getChangeId()).topic()).isEqualTo("mytopic");
-  }
-
-  @Test
-  public void submitted() throws Exception {
-    PushOneCommit.Result r = createChange();
-    String id = r.getChangeId();
-
-    ChangeInfo c = gApi.changes().id(r.getChangeId()).info();
-    assertThat(c.submitted).isNull();
-    assertThat(c.submitter).isNull();
-
-    gApi.changes().id(id).current().review(ReviewInput.approve());
-    gApi.changes().id(id).current().submit();
-
-    c = gApi.changes().id(r.getChangeId()).info();
-    assertThat(c.submitted).isNotNull();
-    assertThat(c.submitter).isNotNull();
-    assertThat(c.submitter._accountId).isEqualTo(atrScope.get().getUser().getAccountId().get());
-  }
-
-  @Test
-  public void submitStaleChange() throws Exception {
-    PushOneCommit.Result r = createChange();
-
-    disableChangeIndexWrites();
-    try {
-      r = amendChange(r.getChangeId());
-    } finally {
-      enableChangeIndexWrites();
-    }
-
-    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve());
-
-    gApi.changes().id(r.getChangeId()).current().submit();
-    assertThat(gApi.changes().id(r.getChangeId()).info().status).isEqualTo(ChangeStatus.MERGED);
-  }
-
-  @Test
-  public void submitNotAllowedWithoutPermission() throws Exception {
-    PushOneCommit.Result r = createChange();
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    exception.expectMessage("submit not permitted");
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).submit();
-  }
-
-  @Test
-  public void submitAllowedWithPermission() throws Exception {
-    PushOneCommit.Result r = createChange();
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
-    grant(project, "refs/heads/master", Permission.SUBMIT, false, REGISTERED_USERS);
-    setApiUser(user);
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).submit();
-    assertThat(gApi.changes().id(r.getChangeId()).info().status).isEqualTo(ChangeStatus.MERGED);
-  }
-
-  @Test
-  public void check() throws Exception {
-    PushOneCommit.Result r = createChange();
-    assertThat(gApi.changes().id(r.getChangeId()).get().problems).isNull();
-    assertThat(gApi.changes().id(r.getChangeId()).get(CHECK).problems).isEmpty();
-  }
-
-  @Test
-  public void commitFooters() throws Exception {
-    LabelType verified =
-        category("Verified", value(1, "Passes"), value(0, "No score"), value(-1, "Failed"));
-    LabelType custom1 =
-        category("Custom1", value(1, "Positive"), value(0, "No score"), value(-1, "Negative"));
-    LabelType custom2 =
-        category("Custom2", value(1, "Positive"), value(0, "No score"), value(-1, "Negative"));
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    cfg.getLabelSections().put(verified.getName(), verified);
-    cfg.getLabelSections().put(custom1.getName(), custom1);
-    cfg.getLabelSections().put(custom2.getName(), custom2);
-    String heads = "refs/heads/*";
-    AccountGroup.UUID anon = systemGroupBackend.getGroup(ANONYMOUS_USERS).getUUID();
-    Util.allow(cfg, Permission.forLabel("Verified"), -1, 1, anon, heads);
-    Util.allow(cfg, Permission.forLabel("Custom1"), -1, 1, anon, heads);
-    Util.allow(cfg, Permission.forLabel("Custom2"), -1, 1, anon, heads);
-    saveProjectConfig(project, cfg);
-
-    PushOneCommit.Result r1 = createChange();
-    r1.assertOkStatus();
-    PushOneCommit.Result r2 =
-        pushFactory
-            .create(
-                db, admin.getIdent(), testRepo, SUBJECT, FILE_NAME, "new content", r1.getChangeId())
-            .to("refs/for/master");
-    r2.assertOkStatus();
-
-    ReviewInput in = new ReviewInput();
-    in.label("Code-Review", 1);
-    in.label("Verified", 1);
-    in.label("Custom1", -1);
-    in.label("Custom2", 1);
-    gApi.changes().id(r2.getChangeId()).current().review(in);
-
-    ChangeInfo actual = gApi.changes().id(r2.getChangeId()).get(ALL_REVISIONS, COMMIT_FOOTERS);
-    assertThat(actual.revisions).hasSize(2);
-
-    // No footers except on latest patch set.
-    assertThat(actual.revisions.get(r1.getCommit().getName()).commitWithFooters).isNull();
-
-    List<String> footers =
-        new ArrayList<>(
-            Arrays.asList(
-                actual.revisions.get(r2.getCommit().getName()).commitWithFooters.split("\\n")));
-    // remove subject + blank line
-    footers.remove(0);
-    footers.remove(0);
-
-    List<String> expectedFooters =
-        Arrays.asList(
-            "Change-Id: " + r2.getChangeId(),
-            "Reviewed-on: " + canonicalWebUrl.get() + r2.getChange().getId(),
-            "Reviewed-by: Administrator <admin@example.com>",
-            "Custom2: Administrator <admin@example.com>",
-            "Tested-by: Administrator <admin@example.com>");
-
-    assertThat(footers).containsExactlyElementsIn(expectedFooters);
-  }
-
-  @Test
-  public void customCommitFooters() throws Exception {
-    PushOneCommit.Result change = createChange();
-    RegistrationHandle handle =
-        changeMessageModifiers.add(
-            new ChangeMessageModifier() {
-              @Override
-              public String onSubmit(
-                  String newCommitMessage,
-                  RevCommit original,
-                  RevCommit mergeTip,
-                  Branch.NameKey destination) {
-                assertThat(original.getName()).isNotEqualTo(mergeTip.getName());
-                return newCommitMessage + "Custom: " + destination.get();
-              }
-            });
-    ChangeInfo actual;
-    try {
-      actual = gApi.changes().id(change.getChangeId()).get(ALL_REVISIONS, COMMIT_FOOTERS);
-    } finally {
-      handle.remove();
-    }
-    List<String> footers =
-        new ArrayList<>(
-            Arrays.asList(
-                actual.revisions.get(change.getCommit().getName()).commitWithFooters.split("\\n")));
-    // remove subject + blank line
-    footers.remove(0);
-    footers.remove(0);
-
-    List<String> expectedFooters =
-        Arrays.asList(
-            "Change-Id: " + change.getChangeId(),
-            "Reviewed-on: " + canonicalWebUrl.get() + change.getChange().getId(),
-            "Custom: refs/heads/master");
-    assertThat(footers).containsExactlyElementsIn(expectedFooters);
-  }
-
-  @Test
-  public void defaultSearchDoesNotTouchDatabase() throws Exception {
-    setApiUser(admin);
-    PushOneCommit.Result r1 = createChange();
-    gApi.changes()
-        .id(r1.getChangeId())
-        .revision(r1.getCommit().name())
-        .review(ReviewInput.approve());
-    gApi.changes().id(r1.getChangeId()).revision(r1.getCommit().name()).submit();
-
-    createChange();
-
-    setApiUser(user);
-    AcceptanceTestRequestScope.Context ctx = disableDb();
-    try {
-      assertThat(
-              gApi.changes()
-                  .query()
-                  .withQuery("project:{" + project.get() + "} (status:open OR status:closed)")
-                  // Options should match defaults in AccountDashboardScreen.
-                  .withOption(LABELS)
-                  .withOption(DETAILED_ACCOUNTS)
-                  .withOption(REVIEWED)
-                  .get())
-          .hasSize(2);
-    } finally {
-      enableDb(ctx);
-    }
-  }
-
-  @Test
-  public void votable() throws Exception {
-    PushOneCommit.Result r = createChange();
-    String triplet = project.get() + "~master~" + r.getChangeId();
-    gApi.changes().id(triplet).addReviewer(user.username);
-    ChangeInfo c = gApi.changes().id(triplet).get(DETAILED_LABELS);
-    LabelInfo codeReview = c.labels.get("Code-Review");
-    assertThat(codeReview.all).hasSize(1);
-    ApprovalInfo approval = codeReview.all.get(0);
-    assertThat(approval._accountId).isEqualTo(user.id.get());
-    assertThat(approval.value).isEqualTo(0);
-
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    Util.blockLabel(cfg, "Code-Review", REGISTERED_USERS, "refs/heads/*");
-    saveProjectConfig(project, cfg);
-    c = gApi.changes().id(triplet).get(DETAILED_LABELS);
-    codeReview = c.labels.get("Code-Review");
-    assertThat(codeReview.all).hasSize(1);
-    approval = codeReview.all.get(0);
-    assertThat(approval._accountId).isEqualTo(user.id.get());
-    assertThat(approval.value).isNull();
-  }
-
-  @Test
-  @GerritConfig(name = "gerrit.editGpgKeys", value = "true")
-  @GerritConfig(name = "receive.enableSignedPush", value = "true")
-  public void pushCertificates() throws Exception {
-    PushOneCommit.Result r1 = createChange();
-    PushOneCommit.Result r2 = amendChange(r1.getChangeId());
-
-    ChangeInfo info = gApi.changes().id(r1.getChangeId()).get(ALL_REVISIONS, PUSH_CERTIFICATES);
-
-    RevisionInfo rev1 = info.revisions.get(r1.getCommit().name());
-    assertThat(rev1).isNotNull();
-    assertThat(rev1.pushCertificate).isNotNull();
-    assertThat(rev1.pushCertificate.certificate).isNull();
-    assertThat(rev1.pushCertificate.key).isNull();
-
-    RevisionInfo rev2 = info.revisions.get(r2.getCommit().name());
-    assertThat(rev2).isNotNull();
-    assertThat(rev2.pushCertificate).isNotNull();
-    assertThat(rev2.pushCertificate.certificate).isNull();
-    assertThat(rev2.pushCertificate.key).isNull();
-  }
-
-  @Test
-  public void anonymousRestApi() throws Exception {
-    setApiUserAnonymous();
-    PushOneCommit.Result r = createChange();
-
-    ChangeInfo info = gApi.changes().id(r.getChangeId()).get();
-    assertThat(info.changeId).isEqualTo(r.getChangeId());
-
-    String triplet = project.get() + "~master~" + r.getChangeId();
-    info = gApi.changes().id(triplet).get();
-    assertThat(info.changeId).isEqualTo(r.getChangeId());
-
-    info = gApi.changes().id(info._number).get();
-    assertThat(info.changeId).isEqualTo(r.getChangeId());
-
-    exception.expect(AuthException.class);
-    gApi.changes().id(triplet).current().review(ReviewInput.approve());
-  }
-
-  @Test
-  public void noteDbCommitsOnPatchSetCreation() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    PushOneCommit.Result r = createChange();
-    pushFactory
-        .create(
-            db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "b.txt", "4711", r.getChangeId())
-        .to("refs/for/master")
-        .assertOkStatus();
-    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
-    try (Repository repo = repoManager.openRepository(project);
-        RevWalk rw = new RevWalk(repo)) {
-      RevCommit commitPatchSetCreation =
-          rw.parseCommit(repo.exactRef(changeMetaRef(new Change.Id(c._number))).getObjectId());
-
-      assertThat(commitPatchSetCreation.getShortMessage()).isEqualTo("Create patch set 2");
-      PersonIdent expectedAuthor =
-          changeNoteUtil.newIdent(
-              accountCache.get(admin.id).getAccount(), c.updated,
-              serverIdent.get(), AnonymousCowardNameProvider.DEFAULT);
-      assertThat(commitPatchSetCreation.getAuthorIdent()).isEqualTo(expectedAuthor);
-      assertThat(commitPatchSetCreation.getCommitterIdent())
-          .isEqualTo(new PersonIdent(serverIdent.get(), c.updated));
-      assertThat(commitPatchSetCreation.getParentCount()).isEqualTo(1);
-
-      RevCommit commitChangeCreation = rw.parseCommit(commitPatchSetCreation.getParent(0));
-      assertThat(commitChangeCreation.getShortMessage()).isEqualTo("Create change");
-      expectedAuthor =
-          changeNoteUtil.newIdent(
-              accountCache.get(admin.id).getAccount(),
-              c.created,
-              serverIdent.get(),
-              AnonymousCowardNameProvider.DEFAULT);
-      assertThat(commitChangeCreation.getAuthorIdent()).isEqualTo(expectedAuthor);
-      assertThat(commitChangeCreation.getCommitterIdent())
-          .isEqualTo(new PersonIdent(serverIdent.get(), c.created));
-      assertThat(commitChangeCreation.getParentCount()).isEqualTo(0);
-    }
-  }
-
-  @Test
-  public void createEmptyChangeOnNonExistingBranch() throws Exception {
-    ChangeInput in = new ChangeInput();
-    in.branch = "foo";
-    in.subject = "Create a change on new branch from the API";
-    in.project = project.get();
-    in.newBranch = true;
-    ChangeInfo info = gApi.changes().create(in).get();
-    assertThat(info.project).isEqualTo(in.project);
-    assertThat(info.branch).isEqualTo(in.branch);
-    assertThat(info.subject).isEqualTo(in.subject);
-    assertThat(Iterables.getOnlyElement(info.messages).message).isEqualTo("Uploaded patch set 1.");
-  }
-
-  @Test
-  public void createEmptyChangeOnExistingBranchWithNewBranch() throws Exception {
-    ChangeInput in = new ChangeInput();
-    in.branch = Constants.MASTER;
-    in.subject = "Create a change on new branch from the API";
-    in.project = project.get();
-    in.newBranch = true;
-
-    exception.expect(ResourceConflictException.class);
-    gApi.changes().create(in).get();
-  }
-
-  @Test
-  public void createNewPatchSetWithoutPermission() throws Exception {
-    // Create new project with clean permissions
-    Project.NameKey p = createProject("addPatchSet1");
-
-    // Clone separate repositories of the same project as admin and as user
-    TestRepository<InMemoryRepository> adminTestRepo = cloneProject(p, admin);
-    TestRepository<InMemoryRepository> userTestRepo = cloneProject(p, user);
-
-    // Block default permission
-    block(p, "refs/for/*", Permission.ADD_PATCH_SET, REGISTERED_USERS);
-
-    // Create change as admin
-    PushOneCommit push = pushFactory.create(db, admin.getIdent(), adminTestRepo);
-    PushOneCommit.Result r1 = push.to("refs/for/master");
-    r1.assertOkStatus();
-
-    // Fetch change
-    GitUtil.fetch(userTestRepo, r1.getPatchSet().getRefName() + ":ps");
-    userTestRepo.reset("ps");
-
-    // Amend change as user
-    PushOneCommit.Result r2 = amendChange(r1.getChangeId(), "refs/for/master", user, userTestRepo);
-    r2.assertErrorStatus("cannot add patch set to " + r1.getChange().getId().id + ".");
-  }
-
-  @Test
-  public void createNewSetPatchWithPermission() throws Exception {
-    // Clone separate repositories of the same project as admin and as user
-    TestRepository<?> adminTestRepo = cloneProject(project, admin);
-    TestRepository<?> userTestRepo = cloneProject(project, user);
-
-    // Create change as admin
-    PushOneCommit push = pushFactory.create(db, admin.getIdent(), adminTestRepo);
-    PushOneCommit.Result r1 = push.to("refs/for/master");
-    r1.assertOkStatus();
-
-    // Fetch change
-    GitUtil.fetch(userTestRepo, r1.getPatchSet().getRefName() + ":ps");
-    userTestRepo.reset("ps");
-
-    // Amend change as user
-    PushOneCommit.Result r2 = amendChange(r1.getChangeId(), "refs/for/master", user, userTestRepo);
-    r2.assertOkStatus();
-  }
-
-  @Test
-  public void createNewPatchSetAsOwnerWithoutPermission() throws Exception {
-    // Create new project with clean permissions
-    Project.NameKey p = createProject("addPatchSet2");
-    // Clone separate repositories of the same project as admin and as user
-    TestRepository<?> adminTestRepo = cloneProject(project, admin);
-
-    // Block default permission
-    block(p, "refs/for/*", Permission.ADD_PATCH_SET, REGISTERED_USERS);
-
-    // Create change as admin
-    PushOneCommit push = pushFactory.create(db, admin.getIdent(), adminTestRepo);
-    PushOneCommit.Result r1 = push.to("refs/for/master");
-    r1.assertOkStatus();
-
-    // Fetch change
-    GitUtil.fetch(adminTestRepo, r1.getPatchSet().getRefName() + ":ps");
-    adminTestRepo.reset("ps");
-
-    // Amend change as admin
-    PushOneCommit.Result r2 =
-        amendChange(r1.getChangeId(), "refs/for/master", admin, adminTestRepo);
-    r2.assertOkStatus();
-  }
-
-  @Test
-  public void createMergePatchSet() throws Exception {
-    PushOneCommit.Result start = pushTo("refs/heads/master");
-    start.assertOkStatus();
-    // create a change for master
-    PushOneCommit.Result r = createChange();
-    r.assertOkStatus();
-    String changeId = r.getChangeId();
-
-    testRepo.reset(start.getCommit());
-    PushOneCommit.Result currentMaster = pushTo("refs/heads/master");
-    currentMaster.assertOkStatus();
-    String parent = currentMaster.getCommit().getName();
-
-    // push a commit into dev branch
-    createBranch(new Branch.NameKey(project, "dev"));
-    PushOneCommit.Result changeA =
-        pushFactory
-            .create(db, user.getIdent(), testRepo, "change A", "A.txt", "A content")
-            .to("refs/heads/dev");
-    changeA.assertOkStatus();
-    MergeInput mergeInput = new MergeInput();
-    mergeInput.source = "dev";
-    MergePatchSetInput in = new MergePatchSetInput();
-    in.merge = mergeInput;
-    in.subject = "update change by merge ps2";
-    gApi.changes().id(changeId).createMergePatchSet(in);
-    ChangeInfo changeInfo =
-        gApi.changes().id(changeId).get(ALL_REVISIONS, CURRENT_COMMIT, CURRENT_REVISION);
-    assertThat(changeInfo.revisions).hasSize(2);
-    assertThat(changeInfo.subject).isEqualTo(in.subject);
-    assertThat(changeInfo.revisions.get(changeInfo.currentRevision).commit.parents.get(0).commit)
-        .isEqualTo(parent);
-  }
-
-  @Test
-  public void createMergePatchSetInheritParent() throws Exception {
-    PushOneCommit.Result start = pushTo("refs/heads/master");
-    start.assertOkStatus();
-    // create a change for master
-    PushOneCommit.Result r = createChange();
-    r.assertOkStatus();
-    String changeId = r.getChangeId();
-    String parent = r.getCommit().getParent(0).getName();
-
-    // advance master branch
-    testRepo.reset(start.getCommit());
-    PushOneCommit.Result currentMaster = pushTo("refs/heads/master");
-    currentMaster.assertOkStatus();
-
-    // push a commit into dev branch
-    createBranch(new Branch.NameKey(project, "dev"));
-    PushOneCommit.Result changeA =
-        pushFactory
-            .create(db, user.getIdent(), testRepo, "change A", "A.txt", "A content")
-            .to("refs/heads/dev");
-    changeA.assertOkStatus();
-    MergeInput mergeInput = new MergeInput();
-    mergeInput.source = "dev";
-    MergePatchSetInput in = new MergePatchSetInput();
-    in.merge = mergeInput;
-    in.subject = "update change by merge ps2 inherit parent of ps1";
-    in.inheritParent = true;
-    gApi.changes().id(changeId).createMergePatchSet(in);
-    ChangeInfo changeInfo =
-        gApi.changes().id(changeId).get(ALL_REVISIONS, CURRENT_COMMIT, CURRENT_REVISION);
-
-    assertThat(changeInfo.revisions).hasSize(2);
-    assertThat(changeInfo.subject).isEqualTo(in.subject);
-    assertThat(changeInfo.revisions.get(changeInfo.currentRevision).commit.parents.get(0).commit)
-        .isEqualTo(parent);
-    assertThat(changeInfo.revisions.get(changeInfo.currentRevision).commit.parents.get(0).commit)
-        .isNotEqualTo(currentMaster.getCommit().getName());
-  }
-
-  @Test
-  public void checkLabelsForUnsubmittedChange() throws Exception {
-    PushOneCommit.Result r = createChange();
-    ChangeInfo change = gApi.changes().id(r.getChangeId()).get();
-    assertThat(change.status).isEqualTo(ChangeStatus.NEW);
-    assertThat(change.labels.keySet()).containsExactly("Code-Review");
-    assertThat(change.permittedLabels.keySet()).containsExactly("Code-Review");
-
-    // add new label and assert that it's returned for existing changes
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    LabelType verified = Util.verified();
-    cfg.getLabelSections().put(verified.getName(), verified);
-    AccountGroup.UUID registeredUsers = systemGroupBackend.getGroup(REGISTERED_USERS).getUUID();
-    String heads = RefNames.REFS_HEADS + "*";
-    Util.allow(cfg, Permission.forLabel(verified.getName()), -1, 1, registeredUsers, heads);
-    saveProjectConfig(project, cfg);
-
-    change = gApi.changes().id(r.getChangeId()).get();
-    assertThat(change.labels.keySet()).containsExactly("Code-Review", "Verified");
-    assertThat(change.permittedLabels.keySet()).containsExactly("Code-Review", "Verified");
-    assertPermitted(change, "Code-Review", -2, -1, 0, 1, 2);
-    assertPermitted(change, "Verified", -1, 0, 1);
-
-    // add an approval on the new label
-    gApi.changes()
-        .id(r.getChangeId())
-        .revision(r.getCommit().name())
-        .review(new ReviewInput().label(verified.getName(), verified.getMax().getValue()));
-
-    // remove label and assert that it's no longer returned for existing
-    // changes, even if there is an approval for it
-    cfg.getLabelSections().remove(verified.getName());
-    Util.remove(cfg, Permission.forLabel(verified.getName()), registeredUsers, heads);
-    saveProjectConfig(project, cfg);
-
-    change = gApi.changes().id(r.getChangeId()).get();
-    assertThat(change.labels.keySet()).containsExactly("Code-Review");
-    assertThat(change.permittedLabels.keySet()).containsExactly("Code-Review");
-
-    // abandon the change and see that the returned labels stay the same
-    // while all permitted labels disappear.
-    gApi.changes().id(r.getChangeId()).abandon();
-    change = gApi.changes().id(r.getChangeId()).get();
-    assertThat(change.status).isEqualTo(ChangeStatus.ABANDONED);
-    assertThat(change.labels.keySet()).containsExactly("Code-Review");
-    assertThat(change.permittedLabels).isEmpty();
-  }
-
-  @Test
-  public void checkLabelsForMergedChange() throws Exception {
-    PushOneCommit.Result r = createChange();
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).submit();
-
-    ChangeInfo change = gApi.changes().id(r.getChangeId()).get();
-    assertThat(change.status).isEqualTo(ChangeStatus.MERGED);
-    assertThat(change.labels.keySet()).containsExactly("Code-Review");
-    assertThat(change.permittedLabels.keySet()).containsExactly("Code-Review");
-    assertPermitted(change, "Code-Review", 2);
-
-    // add new label and assert that it's returned for existing changes
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    LabelType verified = Util.verified();
-    cfg.getLabelSections().put(verified.getName(), verified);
-    AccountGroup.UUID registeredUsers = systemGroupBackend.getGroup(REGISTERED_USERS).getUUID();
-    String heads = RefNames.REFS_HEADS + "*";
-    Util.allow(cfg, Permission.forLabel(verified.getName()), -1, 1, registeredUsers, heads);
-    saveProjectConfig(project, cfg);
-
-    change = gApi.changes().id(r.getChangeId()).get();
-    assertThat(change.labels.keySet()).containsExactly("Code-Review", "Verified");
-    assertThat(change.permittedLabels.keySet()).containsExactly("Code-Review", "Verified");
-    assertPermitted(change, "Code-Review", 2);
-    assertPermitted(change, "Verified", 0, 1);
-
-    // ignore the new label by Prolog submit rule and assert that the label is
-    // no longer returned
-    GitUtil.fetch(testRepo, RefNames.REFS_CONFIG + ":config");
-    testRepo.reset("config");
-    PushOneCommit push2 =
-        pushFactory.create(
-            db,
-            admin.getIdent(),
-            testRepo,
-            "Ignore Verified",
-            "rules.pl",
-            "submit_rule(submit(CR)) :-\n  gerrit:max_with_block(-2, 2, 'Code-Review', CR).");
-    push2.to(RefNames.REFS_CONFIG);
-
-    change = gApi.changes().id(r.getChangeId()).get();
-    assertPermitted(change, "Code-Review", 2);
-    assertPermitted(change, "Verified");
-
-    // add an approval on the new label and assert that the label is now
-    // returned although it is ignored by the Prolog submit rule and hence not
-    // included in the submit records
-    gApi.changes()
-        .id(r.getChangeId())
-        .revision(r.getCommit().name())
-        .review(new ReviewInput().label(verified.getName(), verified.getMax().getValue()));
-
-    change = gApi.changes().id(r.getChangeId()).get();
-    assertThat(change.labels.keySet()).containsExactly("Code-Review", "Verified");
-    assertPermitted(change, "Code-Review", 2);
-    assertPermitted(change, "Verified");
-
-    // remove label and assert that it's no longer returned for existing
-    // changes, even if there is an approval for it
-    cfg = projectCache.checkedGet(project).getConfig();
-    cfg.getLabelSections().remove(verified.getName());
-    Util.remove(cfg, Permission.forLabel(verified.getName()), registeredUsers, heads);
-    saveProjectConfig(project, cfg);
-
-    change = gApi.changes().id(r.getChangeId()).get();
-    assertThat(change.labels.keySet()).containsExactly("Code-Review");
-    assertThat(change.permittedLabels.keySet()).containsExactly("Code-Review");
-    assertPermitted(change, "Code-Review", 2);
-  }
-
-  @Test
-  public void checkLabelsForMergedChangeWithNonAuthorCodeReview() throws Exception {
-    // Configure Non-Author-Code-Review
-    RevCommit oldHead = getRemoteHead();
-    GitUtil.fetch(testRepo, RefNames.REFS_CONFIG + ":config");
-    testRepo.reset("config");
-    PushOneCommit push2 =
-        pushFactory.create(
-            db,
-            admin.getIdent(),
-            testRepo,
-            "Configure Non-Author-Code-Review",
-            "rules.pl",
-            "submit_rule(S) :-\n"
-                + "  gerrit:default_submit(X),\n"
-                + "  X =.. [submit | Ls],\n"
-                + "  add_non_author_approval(Ls, R),\n"
-                + "  S =.. [submit | R].\n"
-                + "\n"
-                + "add_non_author_approval(S1, S2) :-\n"
-                + "  gerrit:commit_author(A),\n"
-                + "  gerrit:commit_label(label('Code-Review', 2), R),\n"
-                + "  R \\= A, !,\n"
-                + "  S2 = [label('Non-Author-Code-Review', ok(R)) | S1].\n"
-                + "add_non_author_approval(S1,"
-                + " [label('Non-Author-Code-Review', need(_)) | S1]).");
-    push2.to(RefNames.REFS_CONFIG);
-    testRepo.reset(oldHead);
-
-    // Allow user to approve
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    AccountGroup.UUID registeredUsers = systemGroupBackend.getGroup(REGISTERED_USERS).getUUID();
-    String heads = RefNames.REFS_HEADS + "*";
-    Util.allow(
-        cfg, Permission.forLabel(Util.codeReview().getName()), -2, 2, registeredUsers, heads);
-    saveProjectConfig(project, cfg);
-
-    PushOneCommit.Result r = createChange();
-
-    setApiUser(user);
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
-
-    setApiUser(admin);
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).submit();
-
-    ChangeInfo change = gApi.changes().id(r.getChangeId()).get();
-    assertThat(change.status).isEqualTo(ChangeStatus.MERGED);
-    assertThat(change.labels.keySet()).containsExactly("Code-Review", "Non-Author-Code-Review");
-    assertThat(change.permittedLabels.keySet()).containsExactly("Code-Review");
-    assertPermitted(change, "Code-Review", 0, 1, 2);
-  }
-
-  @Test
-  public void checkLabelsForAutoClosedChange() throws Exception {
-    PushOneCommit.Result r = createChange();
-
-    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
-    PushOneCommit.Result result = push.to("refs/heads/master");
-    result.assertOkStatus();
-
-    ChangeInfo change = gApi.changes().id(r.getChangeId()).get();
-    assertThat(change.status).isEqualTo(ChangeStatus.MERGED);
-    assertThat(change.labels.keySet()).containsExactly("Code-Review");
-    assertPermitted(change, "Code-Review", 0, 1, 2);
-  }
-
-  @Test
-  public void maxPermittedValueAllowed() throws Exception {
-    final int minPermittedValue = -2;
-    final int maxPermittedValue = +2;
-    String heads = "refs/heads/*";
-
-    PushOneCommit.Result r = createChange();
-    String triplet = project.get() + "~master~" + r.getChangeId();
-
-    gApi.changes().id(triplet).addReviewer(user.username);
-
-    ChangeInfo c = gApi.changes().id(triplet).get(DETAILED_LABELS);
-    LabelInfo codeReview = c.labels.get("Code-Review");
-    assertThat(codeReview.all).hasSize(1);
-    ApprovalInfo approval = codeReview.all.get(0);
-    assertThat(approval._accountId).isEqualTo(user.id.get());
-    assertThat(approval.permittedVotingRange).isNotNull();
-    // default values
-    assertThat(approval.permittedVotingRange.min).isEqualTo(-1);
-    assertThat(approval.permittedVotingRange.max).isEqualTo(1);
-
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    Util.allow(
-        cfg,
-        Permission.forLabel("Code-Review"),
-        minPermittedValue,
-        maxPermittedValue,
-        REGISTERED_USERS,
-        heads);
-    saveProjectConfig(project, cfg);
-
-    c = gApi.changes().id(triplet).get(DETAILED_LABELS);
-    codeReview = c.labels.get("Code-Review");
-    assertThat(codeReview.all).hasSize(1);
-    approval = codeReview.all.get(0);
-    assertThat(approval._accountId).isEqualTo(user.id.get());
-    assertThat(approval.permittedVotingRange).isNotNull();
-    assertThat(approval.permittedVotingRange.min).isEqualTo(minPermittedValue);
-    assertThat(approval.permittedVotingRange.max).isEqualTo(maxPermittedValue);
-  }
-
-  @Test
-  public void maxPermittedValueBlocked() throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    Util.blockLabel(cfg, "Code-Review", REGISTERED_USERS, "refs/heads/*");
-    saveProjectConfig(project, cfg);
-
-    PushOneCommit.Result r = createChange();
-    String triplet = project.get() + "~master~" + r.getChangeId();
-
-    gApi.changes().id(triplet).addReviewer(user.username);
-
-    ChangeInfo c = gApi.changes().id(triplet).get(DETAILED_LABELS);
-    LabelInfo codeReview = c.labels.get("Code-Review");
-    assertThat(codeReview.all).hasSize(1);
-    ApprovalInfo approval = codeReview.all.get(0);
-    assertThat(approval._accountId).isEqualTo(user.id.get());
-    assertThat(approval.permittedVotingRange).isNull();
-  }
-
-  @Test
-  public void nonStrictLabelWithInvalidLabelPerDefault() throws Exception {
-    String changeId = createChange().getChangeId();
-
-    // Add a review with invalid labels.
-    ReviewInput input = ReviewInput.approve().label("Code-Style", 1);
-    gApi.changes().id(changeId).current().review(input);
-
-    Map<String, Short> votes = gApi.changes().id(changeId).current().reviewer(admin.email).votes();
-    assertThat(votes.keySet()).containsExactly("Code-Review");
-    assertThat(votes.values()).containsExactly((short) 2);
-  }
-
-  @Test
-  public void nonStrictLabelWithInvalidValuePerDefault() throws Exception {
-    String changeId = createChange().getChangeId();
-
-    // Add a review with invalid label values.
-    ReviewInput input = new ReviewInput().label("Code-Review", 3);
-    gApi.changes().id(changeId).current().review(input);
-
-    Map<String, Short> votes = gApi.changes().id(changeId).current().reviewer(admin.email).votes();
-    if (!notesMigration.readChanges()) {
-      assertThat(votes.keySet()).containsExactly("Code-Review");
-      assertThat(votes.values()).containsExactly((short) 0);
-    } else {
-      assertThat(votes).isEmpty();
-    }
-  }
-
-  @Test
-  @GerritConfig(name = "change.strictLabels", value = "true")
-  public void strictLabelWithInvalidLabel() throws Exception {
-    String changeId = createChange().getChangeId();
-    ReviewInput in = new ReviewInput().label("Code-Style", 1);
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("label \"Code-Style\" is not a configured label");
-    gApi.changes().id(changeId).current().review(in);
-  }
-
-  @Test
-  @GerritConfig(name = "change.strictLabels", value = "true")
-  public void strictLabelWithInvalidValue() throws Exception {
-    String changeId = createChange().getChangeId();
-    ReviewInput in = new ReviewInput().label("Code-Review", 3);
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("label \"Code-Review\": 3 is not a valid value");
-    gApi.changes().id(changeId).current().review(in);
-  }
-
-  @Test
-  public void unresolvedCommentsBlocked() throws Exception {
-    modifySubmitRules(
-        "submit_rule(submit(R)) :- \n"
-            + "gerrit:unresolved_comments_count(0), \n"
-            + "!,"
-            + "gerrit:commit_author(A), \n"
-            + "R = label('All-Comments-Resolved', ok(A)).\n"
-            + "submit_rule(submit(R)) :- \n"
-            + "gerrit:unresolved_comments_count(U), \n"
-            + "U > 0,"
-            + "R = label('All-Comments-Resolved', need(_)). \n\n");
-
-    String oldHead = getRemoteHead().name();
-    PushOneCommit.Result result1 =
-        pushFactory.create(db, user.getIdent(), testRepo).to("refs/for/master");
-    testRepo.reset(oldHead);
-    PushOneCommit.Result result2 =
-        pushFactory.create(db, user.getIdent(), testRepo).to("refs/for/master");
-
-    addComment(result1, "comment 1", true, false, null);
-    addComment(result2, "comment 2", true, true, null);
-
-    gApi.changes().id(result1.getChangeId()).current().submit();
-
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("Failed to submit 1 change due to the following problems");
-    exception.expectMessage("needs All-Comments-Resolved");
-    gApi.changes().id(result2.getChangeId()).current().submit();
-  }
-
-  @Test
-  public void pureRevertFactBlocksSubmissionOfNonReverts() throws Exception {
-    addPureRevertSubmitRule();
-
-    // Create a change that is not a revert of another change
-    PushOneCommit.Result r1 =
-        pushFactory.create(db, user.getIdent(), testRepo).to("refs/for/master");
-    approve(r1.getChangeId());
-
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("Failed to submit 1 change due to the following problems");
-    exception.expectMessage("needs Is-Pure-Revert");
-    gApi.changes().id(r1.getChangeId()).current().submit();
-  }
-
-  @Test
-  public void pureRevertFactBlocksSubmissionOfNonPureReverts() throws Exception {
-    PushOneCommit.Result r1 =
-        pushFactory.create(db, user.getIdent(), testRepo).to("refs/for/master");
-    merge(r1);
-
-    addPureRevertSubmitRule();
-
-    // Create a revert and push a content change
-    String revertId = gApi.changes().id(r1.getChangeId()).revert().get().changeId;
-    amendChange(revertId);
-    approve(revertId);
-
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("Failed to submit 1 change due to the following problems");
-    exception.expectMessage("needs Is-Pure-Revert");
-    gApi.changes().id(revertId).current().submit();
-  }
-
-  @Test
-  public void pureRevertFactAllowsSubmissionOfPureReverts() throws Exception {
-    // Create a change that we can later revert
-    PushOneCommit.Result r1 =
-        pushFactory.create(db, user.getIdent(), testRepo).to("refs/for/master");
-    merge(r1);
-
-    addPureRevertSubmitRule();
-
-    // Create a revert and submit it
-    String revertId = gApi.changes().id(r1.getChangeId()).revert().get().changeId;
-    approve(revertId);
-    gApi.changes().id(revertId).current().submit();
-  }
-
-  @Test
-  public void changeCommitMessage() throws Exception {
-    // Tests mutating the commit message as both the owner of the change and a regular user with
-    // addPatchSet permission. Asserts that both cases succeed.
-    PushOneCommit.Result r = createChange();
-    r.assertOkStatus();
-    assertThat(getCommitMessage(r.getChangeId()))
-        .isEqualTo("test commit\n\nChange-Id: " + r.getChangeId() + "\n");
-
-    for (TestAccount acc : ImmutableList.of(admin, user)) {
-      setApiUser(acc);
-      String newMessage =
-          "modified commit by " + acc.username + "\n\nChange-Id: " + r.getChangeId() + "\n";
-      gApi.changes().id(r.getChangeId()).setMessage(newMessage);
-      RevisionApi rApi = gApi.changes().id(r.getChangeId()).current();
-      assertThat(rApi.files().keySet()).containsExactly("/COMMIT_MSG", "a.txt");
-      assertThat(getCommitMessage(r.getChangeId())).isEqualTo(newMessage);
-      assertThat(rApi.description()).isEqualTo("Edit commit message");
-    }
-
-    // Verify tags, which should differ according to whether the change was WIP
-    // at the time the commit message was edited. First, look at the last edit
-    // we created above, when the change was not WIP.
-    ChangeInfo info = gApi.changes().id(r.getChangeId()).get();
-    assertThat(Iterables.getLast(info.messages).tag)
-        .isEqualTo(ChangeMessagesUtil.TAG_UPLOADED_PATCH_SET);
-
-    // Move the change to WIP and edit the commit message again, to observe a
-    // different tag. Must switch to change owner to move into WIP.
-    setApiUser(admin);
-    gApi.changes().id(r.getChangeId()).setWorkInProgress();
-    String newMessage = "modified commit in WIP change\n\nChange-Id: " + r.getChangeId() + "\n";
-    gApi.changes().id(r.getChangeId()).setMessage(newMessage);
-    info = gApi.changes().id(r.getChangeId()).get();
-    assertThat(Iterables.getLast(info.messages).tag)
-        .isEqualTo(ChangeMessagesUtil.TAG_UPLOADED_WIP_PATCH_SET);
-  }
-
-  @Test
-  public void changeCommitMessageWithNoChangeIdSucceedsIfChangeIdNotRequired() throws Exception {
-    ConfigInput configInput = new ConfigInput();
-    configInput.requireChangeId = InheritableBoolean.FALSE;
-    gApi.projects().name(project.get()).config(configInput);
-
-    PushOneCommit.Result r = createChange();
-    r.assertOkStatus();
-    assertThat(getCommitMessage(r.getChangeId()))
-        .isEqualTo("test commit\n\nChange-Id: " + r.getChangeId() + "\n");
-
-    String newMessage = "modified commit\n";
-    gApi.changes().id(r.getChangeId()).setMessage(newMessage);
-    RevisionApi rApi = gApi.changes().id(r.getChangeId()).current();
-    assertThat(rApi.files().keySet()).containsExactly("/COMMIT_MSG", "a.txt");
-    assertThat(getCommitMessage(r.getChangeId())).isEqualTo(newMessage);
-  }
-
-  @Test
-  public void changeCommitMessageWithNoChangeIdFails() throws Exception {
-    PushOneCommit.Result r = createChange();
-    assertThat(getCommitMessage(r.getChangeId()))
-        .isEqualTo("test commit\n\nChange-Id: " + r.getChangeId() + "\n");
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("missing Change-Id footer");
-    gApi.changes().id(r.getChangeId()).setMessage("modified commit\n");
-  }
-
-  @Test
-  public void changeCommitMessageWithWrongChangeIdFails() throws Exception {
-    PushOneCommit.Result otherChange = createChange();
-    PushOneCommit.Result r = createChange();
-    assertThat(getCommitMessage(r.getChangeId()))
-        .isEqualTo("test commit\n\nChange-Id: " + r.getChangeId() + "\n");
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("wrong Change-Id footer");
-    gApi.changes()
-        .id(r.getChangeId())
-        .setMessage("modified commit\n\nChange-Id: " + otherChange.getChangeId() + "\n");
-  }
-
-  @Test
-  public void changeCommitMessageWithoutPermissionFails() throws Exception {
-    // Create new project with clean permissions
-    Project.NameKey p = createProject("addPatchSetEdit");
-    TestRepository<InMemoryRepository> userTestRepo = cloneProject(p, user);
-    // Block default permission
-    block(p, "refs/for/*", Permission.ADD_PATCH_SET, REGISTERED_USERS);
-    // Create change as user
-    PushOneCommit push = pushFactory.create(db, user.getIdent(), userTestRepo);
-    PushOneCommit.Result r = push.to("refs/for/master");
-    r.assertOkStatus();
-    // Try to change the commit message
-    exception.expect(AuthException.class);
-    exception.expectMessage("modifying commit message not permitted");
-    gApi.changes().id(r.getChangeId()).setMessage("foo");
-  }
-
-  @Test
-  public void changeCommitMessageWithSameMessageFails() throws Exception {
-    PushOneCommit.Result r = createChange();
-    assertThat(getCommitMessage(r.getChangeId()))
-        .isEqualTo("test commit\n\nChange-Id: " + r.getChangeId() + "\n");
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("new and existing commit message are the same");
-    gApi.changes().id(r.getChangeId()).setMessage(getCommitMessage(r.getChangeId()));
-  }
-
-  @Test
-  public void fourByteEmoji() throws Exception {
-    // U+1F601 GRINNING FACE WITH SMILING EYES
-    String smile = new String(Character.toChars(0x1f601));
-    assertThat(smile).isEqualTo("😁");
-    assertThat(smile).hasLength(2); // Thanks, Java.
-    assertThat(smile.getBytes(UTF_8)).hasLength(4);
-
-    String subject = "A happy change " + smile;
-    PushOneCommit.Result r =
-        pushFactory
-            .create(db, admin.getIdent(), testRepo, subject, FILE_NAME, FILE_CONTENT)
-            .to("refs/for/master");
-    r.assertOkStatus();
-    String id = r.getChangeId();
-
-    ReviewInput ri = ReviewInput.approve();
-    ri.message = "I like it " + smile;
-    ReviewInput.CommentInput ci = new ReviewInput.CommentInput();
-    ci.path = FILE_NAME;
-    ci.side = Side.REVISION;
-    ci.message = "Good " + smile;
-    ri.comments = ImmutableMap.of(FILE_NAME, ImmutableList.of(ci));
-    gApi.changes().id(id).current().review(ri);
-
-    ChangeInfo info = gApi.changes().id(id).get(MESSAGES, CURRENT_COMMIT, CURRENT_REVISION);
-    assertThat(info.subject).isEqualTo(subject);
-    assertThat(Iterables.getLast(info.messages).message).endsWith(ri.message);
-    assertThat(Iterables.getOnlyElement(info.revisions.values()).commit.message)
-        .startsWith(subject);
-
-    List<CommentInfo> comments =
-        Iterables.getOnlyElement(gApi.changes().id(id).comments().values());
-    assertThat(Iterables.getOnlyElement(comments).message).isEqualTo(ci.message);
-  }
-
-  @Test
-  public void pureRevertReturnsTrueForPureRevert() throws Exception {
-    PushOneCommit.Result r = createChange();
-    merge(r);
-    String revertId = gApi.changes().id(r.getChangeId()).revert().get().id;
-    // Without query parameter
-    assertThat(gApi.changes().id(revertId).pureRevert().isPureRevert).isTrue();
-    // With query parameter
-    assertThat(
-            gApi.changes()
-                .id(revertId)
-                .pureRevert(getRemoteHead().toObjectId().name())
-                .isPureRevert)
-        .isTrue();
-  }
-
-  @Test
-  public void pureRevertReturnsFalseOnContentChange() throws Exception {
-    PushOneCommit.Result r1 = createChange();
-    merge(r1);
-    // Create a revert and expect pureRevert to be true
-    String revertId = gApi.changes().id(r1.getChangeId()).revert().get().changeId;
-    assertThat(gApi.changes().id(revertId).pureRevert().isPureRevert).isTrue();
-
-    // Create a new PS and expect pureRevert to be false
-    PushOneCommit.Result result = amendChange(revertId);
-    result.assertOkStatus();
-    assertThat(gApi.changes().id(revertId).pureRevert().isPureRevert).isFalse();
-  }
-
-  @Test
-  public void pureRevertParameterTakesPrecedence() throws Exception {
-    PushOneCommit.Result r1 = createChange("commit message", "a.txt", "content1");
-    merge(r1);
-    String oldHead = getRemoteHead().toObjectId().name();
-
-    PushOneCommit.Result r2 = createChange("commit message", "a.txt", "content2");
-    merge(r2);
-
-    String revertId = gApi.changes().id(r2.getChangeId()).revert().get().changeId;
-    assertThat(gApi.changes().id(revertId).pureRevert().isPureRevert).isTrue();
-    assertThat(gApi.changes().id(revertId).pureRevert(oldHead).isPureRevert).isFalse();
-  }
-
-  @Test
-  public void pureRevertReturnsFalseOnInvalidInput() throws Exception {
-    PushOneCommit.Result r1 = createChange();
-    merge(r1);
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("invalid object ID");
-    gApi.changes().id(createChange().getChangeId()).pureRevert("invalid id");
-  }
-
-  @Test
-  public void pureRevertReturnsTrueWithCleanRebase() throws Exception {
-    PushOneCommit.Result r1 = createChange("commit message", "a.txt", "content1");
-    merge(r1);
-
-    PushOneCommit.Result r2 = createChange("commit message", "b.txt", "content2");
-    merge(r2);
-
-    String revertId = gApi.changes().id(r1.getChangeId()).revert().get().changeId;
-    // Rebase revert onto HEAD
-    gApi.changes().id(revertId).rebase();
-    // Check that pureRevert is true which implies that the commit can be rebased onto the original
-    // commit.
-    assertThat(gApi.changes().id(revertId).pureRevert().isPureRevert).isTrue();
-  }
-
-  @Test
-  public void pureRevertReturnsFalseWithRebaseConflict() throws Exception {
-    // Create an initial commit to serve as claimed original
-    PushOneCommit.Result r1 = createChange("commit message", "a.txt", "content1");
-    merge(r1);
-    String claimedOriginal = getRemoteHead().toObjectId().name();
-
-    // Change contents of the file to provoke a conflict
-    merge(createChange("commit message", "a.txt", "content2"));
-
-    // Create a commit that we can revert
-    PushOneCommit.Result r2 = createChange("commit message", "a.txt", "content3");
-    merge(r2);
-
-    // Create a revert of r2
-    String revertR3Id = gApi.changes().id(r2.getChangeId()).revert().id();
-    // Assert that the change is a pure revert of it's 'revertOf'
-    assertThat(gApi.changes().id(revertR3Id).pureRevert().isPureRevert).isTrue();
-    // Assert that the change is not a pure revert of claimedOriginal because pureRevert is trying
-    // to rebase this on claimed original, which fails.
-    PureRevertInfo pureRevert = gApi.changes().id(revertR3Id).pureRevert(claimedOriginal);
-    assertThat(pureRevert.isPureRevert).isFalse();
-  }
-
-  @Test
-  public void pureRevertThrowsExceptionWhenChangeIsNotARevertAndNoIdProvided() throws Exception {
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("no ID was provided and change isn't a revert");
-    gApi.changes().id(createChange().getChangeId()).pureRevert();
-  }
-
-  @Test
-  public void putTopicExceedLimitFails() throws Exception {
-    String changeId = createChange().getChangeId();
-    String topic = Stream.generate(() -> "t").limit(2049).collect(joining());
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("topic length exceeds the limit");
-    gApi.changes().id(changeId).topic(topic);
-  }
-
-  @Test
-  public void submittableAfterLosingPermissions_MaxWithBlock() throws Exception {
-    configLabel("Label", LabelFunction.MAX_WITH_BLOCK);
-    submittableAfterLosingPermissions("Label");
-  }
-
-  @Test
-  public void submittableAfterLosingPermissions_AnyWithBlock() throws Exception {
-    configLabel("Label", LabelFunction.ANY_WITH_BLOCK);
-    submittableAfterLosingPermissions("Label");
-  }
-
-  public void submittableAfterLosingPermissions(String label) throws Exception {
-    String codeReviewLabel = "Code-Review";
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    AccountGroup.UUID registered = SystemGroupBackend.REGISTERED_USERS;
-    Util.allow(cfg, Permission.forLabel(label), -1, +1, registered, "refs/heads/*");
-    Util.allow(cfg, Permission.forLabel(codeReviewLabel), -2, +2, registered, "refs/heads/*");
-    saveProjectConfig(cfg);
-
-    setApiUser(user);
-    PushOneCommit.Result r = createChange();
-    String changeId = r.getChangeId();
-
-    // Verify user's permitted range.
-    ChangeInfo change = gApi.changes().id(changeId).get();
-    assertPermitted(change, label, -1, 0, 1);
-    assertPermitted(change, codeReviewLabel, -2, -1, 0, 1, 2);
-
-    ReviewInput input = new ReviewInput();
-    input.label(codeReviewLabel, 2);
-    input.label(label, 1);
-    gApi.changes().id(changeId).current().review(input);
-
-    assertThat(gApi.changes().id(changeId).current().reviewer(user.email).votes().keySet())
-        .containsExactly(codeReviewLabel, label);
-    assertThat(gApi.changes().id(changeId).current().reviewer(user.email).votes().values())
-        .containsExactly((short) 2, (short) 1);
-    assertThat(gApi.changes().id(changeId).get().submittable).isTrue();
-
-    setApiUser(admin);
-    // Remove user's permission for 'Label'.
-    Util.remove(cfg, Permission.forLabel(label), registered, "refs/heads/*");
-    // Update user's permitted range for 'Code-Review' to be -1...+1.
-    Util.remove(cfg, Permission.forLabel(codeReviewLabel), registered, "refs/heads/*");
-    Util.allow(cfg, Permission.forLabel(codeReviewLabel), -1, +1, registered, "refs/heads/*");
-    saveProjectConfig(cfg);
-
-    // Verify user's new permitted range.
-    setApiUser(user);
-    change = gApi.changes().id(changeId).get();
-    assertPermitted(change, label);
-    assertPermitted(change, codeReviewLabel, -1, 0, 1);
-
-    assertThat(gApi.changes().id(changeId).current().reviewer(user.email).votes().values())
-        .containsExactly((short) 2, (short) 1);
-    assertThat(gApi.changes().id(changeId).get().submittable).isTrue();
-
-    setApiUser(admin);
-    gApi.changes().id(changeId).current().submit();
-  }
-
-  private String getCommitMessage(String changeId) throws RestApiException, IOException {
-    return gApi.changes().id(changeId).current().file("/COMMIT_MSG").content().asString();
-  }
-
-  private void addComment(
-      PushOneCommit.Result r,
-      String message,
-      boolean omitDuplicateComments,
-      Boolean unresolved,
-      String inReplyTo)
-      throws Exception {
-    ReviewInput.CommentInput c = new ReviewInput.CommentInput();
-    c.line = 1;
-    c.message = message;
-    c.path = FILE_NAME;
-    c.unresolved = unresolved;
-    c.inReplyTo = inReplyTo;
-    ReviewInput in = new ReviewInput();
-    in.comments = new HashMap<>();
-    in.comments.put(c.path, Lists.newArrayList(c));
-    in.omitDuplicateComments = omitDuplicateComments;
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(in);
-  }
-
-  private static Iterable<Account.Id> getReviewers(Collection<AccountInfo> r) {
-    return Iterables.transform(r, a -> new Account.Id(a._accountId));
-  }
-
-  private ChangeResource parseResource(PushOneCommit.Result r) throws Exception {
-    return parseChangeResource(r.getChangeId());
-  }
-
-  private Optional<ReviewerState> getReviewerState(String changeId, Account.Id accountId)
-      throws Exception {
-    ChangeInfo c = gApi.changes().id(changeId).get(DETAILED_LABELS);
-    Set<ReviewerState> states =
-        c.reviewers.entrySet().stream()
-            .filter(e -> e.getValue().stream().anyMatch(a -> a._accountId == accountId.get()))
-            .map(e -> e.getKey())
-            .collect(toSet());
-    assertThat(states.size()).named(states.toString()).isAtMost(1);
-    return states.stream().findFirst();
-  }
-
-  private void setChangeStatus(Change.Id id, Change.Status newStatus) throws Exception {
-    try (BatchUpdate batchUpdate =
-        batchUpdateFactory.create(db, project, atrScope.get().getUser(), TimeUtil.nowTs())) {
-      batchUpdate.addOp(id, new ChangeStatusUpdateOp(newStatus));
-      batchUpdate.execute();
-    }
-
-    ChangeStatus changeStatus = gApi.changes().id(id.get()).get().status;
-    assertThat(changeStatus).isEqualTo(newStatus.asChangeStatus());
-  }
-
-  private static class ChangeStatusUpdateOp implements BatchUpdateOp {
-    private final Change.Status newStatus;
-
-    ChangeStatusUpdateOp(Change.Status newStatus) {
-      this.newStatus = newStatus;
-    }
-
-    @Override
-    public boolean updateChange(ChangeContext ctx) throws Exception {
-      Change change = ctx.getChange();
-
-      // Change status in database.
-      change.setStatus(newStatus);
-
-      // Change status in NoteDb.
-      PatchSet.Id currentPatchSetId = change.currentPatchSetId();
-      ctx.getUpdate(currentPatchSetId).setStatus(newStatus);
-
-      return true;
-    }
-  }
-
-  private void addPureRevertSubmitRule() throws Exception {
-    modifySubmitRules(
-        "submit_rule(submit(R)) :- \n"
-            + "gerrit:pure_revert(1), \n"
-            + "!,"
-            + "gerrit:commit_author(A), \n"
-            + "R = label('Is-Pure-Revert', ok(A)).\n"
-            + "submit_rule(submit(R)) :- \n"
-            + "gerrit:pure_revert(U), \n"
-            + "U \\= 1,"
-            + "R = label('Is-Pure-Revert', need(_)). \n\n");
-  }
-
-  private void modifySubmitRules(String newContent) throws Exception {
-    try (Repository repo = repoManager.openRepository(project)) {
-      TestRepository<?> testRepo = new TestRepository<>((InMemoryRepository) repo);
-      testRepo
-          .branch(RefNames.REFS_CONFIG)
-          .commit()
-          .author(admin.getIdent())
-          .committer(admin.getIdent())
-          .add("rules.pl", newContent)
-          .message("Modify rules.pl")
-          .create();
-    }
-  }
-
-  @Test
-  @GerritConfig(name = "trackingid.jira-bug.footer", value = "Bug:")
-  @GerritConfig(name = "trackingid.jira-bug.match", value = "JRA\\d{2,8}")
-  @GerritConfig(name = "trackingid.jira-bug.system", value = "JIRA")
-  public void trackingIds() throws Exception {
-    PushOneCommit push =
-        pushFactory.create(
-            db,
-            admin.getIdent(),
-            testRepo,
-            PushOneCommit.SUBJECT + "\n\n" + "Bug:JRA001",
-            PushOneCommit.FILE_NAME,
-            PushOneCommit.FILE_CONTENT);
-    PushOneCommit.Result result = push.to("refs/for/master");
-    result.assertOkStatus();
-
-    ChangeInfo change = gApi.changes().id(result.getChangeId()).get(TRACKING_IDS);
-    Collection<TrackingIdInfo> trackingIds = change.trackingIds;
-    assertThat(trackingIds).isNotNull();
-    assertThat(trackingIds).hasSize(1);
-    assertThat(trackingIds.iterator().next().system).isEqualTo("JIRA");
-    assertThat(trackingIds.iterator().next().id).isEqualTo("JRA001");
-  }
-
-  @Test
-  public void starUnstar() throws Exception {
-    PushOneCommit.Result r = createChange();
-    String triplet = project.get() + "~master~" + r.getChangeId();
-    changeIndexedCounter.clear();
-
-    gApi.accounts().self().starChange(triplet);
-    ChangeInfo change = info(triplet);
-    assertThat(change.starred).isTrue();
-    assertThat(change.stars).contains(DEFAULT_LABEL);
-    changeIndexedCounter.assertReindexOf(change);
-
-    gApi.accounts().self().unstarChange(triplet);
-    change = info(triplet);
-    assertThat(change.starred).isNull();
-    assertThat(change.stars).isNull();
-    changeIndexedCounter.assertReindexOf(change);
-  }
-
-  @Test
-  public void ignore() throws Exception {
-    TestAccount user2 = accountCreator.user2();
-
-    PushOneCommit.Result r = createChange();
-
-    AddReviewerInput in = new AddReviewerInput();
-    in.reviewer = user.email;
-    gApi.changes().id(r.getChangeId()).addReviewer(in);
-
-    in = new AddReviewerInput();
-    in.reviewer = user2.email;
-    gApi.changes().id(r.getChangeId()).addReviewer(in);
-
-    setApiUser(user);
-    gApi.changes().id(r.getChangeId()).ignore(true);
-    assertThat(gApi.changes().id(r.getChangeId()).ignored()).isTrue();
-
-    sender.clear();
-    setApiUser(admin);
-    gApi.changes().id(r.getChangeId()).abandon();
-    List<Message> messages = sender.getMessages();
-    assertThat(messages).hasSize(1);
-    assertThat(messages.get(0).rcpt()).containsExactly(user2.emailAddress);
-
-    setApiUser(user);
-    gApi.changes().id(r.getChangeId()).ignore(false);
-    assertThat(gApi.changes().id(r.getChangeId()).ignored()).isFalse();
-  }
-
-  @Test
-  public void cannotIgnoreOwnChange() throws Exception {
-    String changeId = createChange().getChangeId();
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("cannot ignore own change");
-    gApi.changes().id(changeId).ignore(true);
-  }
-
-  @Test
-  public void cannotIgnoreStarredChange() throws Exception {
-    String changeId = createChange().getChangeId();
-
-    setApiUser(user);
-    gApi.accounts().self().starChange(changeId);
-    assertThat(gApi.changes().id(changeId).get().starred).isTrue();
-
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage(
-        "The labels "
-            + StarredChangesUtil.DEFAULT_LABEL
-            + " and "
-            + StarredChangesUtil.IGNORE_LABEL
-            + " are mutually exclusive. Only one of them can be set.");
-    gApi.changes().id(changeId).ignore(true);
-  }
-
-  @Test
-  public void cannotStarIgnoredChange() throws Exception {
-    String changeId = createChange().getChangeId();
-
-    setApiUser(user);
-    gApi.changes().id(changeId).ignore(true);
-    assertThat(gApi.changes().id(changeId).ignored()).isTrue();
-
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage(
-        "The labels "
-            + StarredChangesUtil.DEFAULT_LABEL
-            + " and "
-            + StarredChangesUtil.IGNORE_LABEL
-            + " are mutually exclusive. Only one of them can be set.");
-    gApi.accounts().self().starChange(changeId);
-  }
-
-  @Test
-  public void markAsReviewed() throws Exception {
-    TestAccount user2 = accountCreator.user2();
-
-    PushOneCommit.Result r = createChange();
-
-    AddReviewerInput in = new AddReviewerInput();
-    in.reviewer = user.email;
-    gApi.changes().id(r.getChangeId()).addReviewer(in);
-
-    setApiUser(user);
-    assertThat(gApi.changes().id(r.getChangeId()).get().reviewed).isNull();
-    gApi.changes().id(r.getChangeId()).markAsReviewed(true);
-    assertThat(gApi.changes().id(r.getChangeId()).get().reviewed).isTrue();
-
-    setApiUser(user2);
-    sender.clear();
-    amendChange(r.getChangeId());
-
-    setApiUser(user);
-    assertThat(gApi.changes().id(r.getChangeId()).get().reviewed).isNull();
-
-    List<Message> messages = sender.getMessages();
-    assertThat(messages).hasSize(1);
-    assertThat(messages.get(0).rcpt()).containsExactly(user.emailAddress);
-  }
-
-  @Test
-  public void cannotSetUnreviewedLabelForPatchSetThatAlreadyHasReviewedLabel() throws Exception {
-    String changeId = createChange().getChangeId();
-
-    setApiUser(user);
-    gApi.changes().id(changeId).markAsReviewed(true);
-    assertThat(gApi.changes().id(changeId).get().reviewed).isTrue();
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage(
-        "The labels "
-            + StarredChangesUtil.REVIEWED_LABEL
-            + "/"
-            + 1
-            + " and "
-            + StarredChangesUtil.UNREVIEWED_LABEL
-            + "/"
-            + 1
-            + " are mutually exclusive. Only one of them can be set.");
-    gApi.accounts()
-        .self()
-        .setStars(
-            changeId, new StarsInput(ImmutableSet.of(StarredChangesUtil.UNREVIEWED_LABEL + "/1")));
-  }
-
-  @Test
-  public void cannotSetReviewedLabelForPatchSetThatAlreadyHasUnreviewedLabel() throws Exception {
-    String changeId = createChange().getChangeId();
-
-    setApiUser(user);
-    gApi.changes().id(changeId).markAsReviewed(false);
-    assertThat(gApi.changes().id(changeId).get().reviewed).isNull();
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage(
-        "The labels "
-            + StarredChangesUtil.REVIEWED_LABEL
-            + "/"
-            + 1
-            + " and "
-            + StarredChangesUtil.UNREVIEWED_LABEL
-            + "/"
-            + 1
-            + " are mutually exclusive. Only one of them can be set.");
-    gApi.accounts()
-        .self()
-        .setStars(
-            changeId, new StarsInput(ImmutableSet.of(StarredChangesUtil.REVIEWED_LABEL + "/1")));
-  }
-
-  @Test
-  public void setReviewedAndUnreviewedLabelsForDifferentPatchSets() throws Exception {
-    String changeId = createChange().getChangeId();
-
-    setApiUser(user);
-    gApi.changes().id(changeId).markAsReviewed(true);
-    assertThat(gApi.changes().id(changeId).get().reviewed).isTrue();
-
-    amendChange(changeId);
-    assertThat(gApi.changes().id(changeId).get().reviewed).isNull();
-
-    gApi.changes().id(changeId).markAsReviewed(false);
-    assertThat(gApi.changes().id(changeId).get().reviewed).isNull();
-
-    assertThat(gApi.accounts().self().getStars(changeId))
-        .containsExactly(
-            StarredChangesUtil.REVIEWED_LABEL + "/" + 1,
-            StarredChangesUtil.UNREVIEWED_LABEL + "/" + 2);
-  }
-
-  @Test
-  public void cannotSetInvalidLabel() throws Exception {
-    String changeId = createChange().getChangeId();
-
-    // label cannot contain whitespace
-    String invalidLabel = "invalid label";
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("invalid labels: " + invalidLabel);
-    gApi.accounts().self().setStars(changeId, new StarsInput(ImmutableSet.of(invalidLabel)));
-  }
-
-  private static class ChangeIndexedCounter implements ChangeIndexedListener {
-    private final AtomicLongMap<Integer> countsByChange = AtomicLongMap.create();
-
-    @Override
-    public void onChangeIndexed(String projectName, int id) {
-      countsByChange.incrementAndGet(id);
-    }
-
-    @Override
-    public void onChangeDeleted(int id) {
-      countsByChange.incrementAndGet(id);
-    }
-
-    void clear() {
-      countsByChange.clear();
-    }
-
-    long getCount(ChangeInfo info) {
-      return countsByChange.get(info._number);
-    }
-
-    void assertReindexOf(ChangeInfo info) {
-      assertReindexOf(info, 1);
-    }
-
-    void assertReindexOf(ChangeInfo info, int expectedCount) {
-      assertThat(getCount(info)).isEqualTo(expectedCount);
-      assertThat(countsByChange).hasSize(1);
-      clear();
-    }
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/ChangeIdIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/ChangeIdIT.java
deleted file mode 100644
index e0fc358..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/ChangeIdIT.java
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.acceptance.api.change;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.extensions.api.changes.ChangeApi;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.ChangeInput;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.reviewdb.client.Project;
-import org.junit.Before;
-import org.junit.Test;
-
-@NoHttpd
-public class ChangeIdIT extends AbstractDaemonTest {
-  private ChangeInfo changeInfo;
-
-  @Before
-  public void setup() throws Exception {
-    changeInfo = gApi.changes().create(new ChangeInput(project.get(), "master", "msg")).get();
-  }
-
-  @Test
-  public void projectChangeNumberReturnsChange() throws Exception {
-    ChangeApi cApi = gApi.changes().id(project.get(), changeInfo._number);
-    assertThat(cApi.get().changeId).isEqualTo(changeInfo.changeId);
-  }
-
-  @Test
-  public void projectChangeNumberReturnsChangeWhenProjectContainsSlashes() throws Exception {
-    Project.NameKey p = createProject("foo/bar");
-    ChangeInfo ci = gApi.changes().create(new ChangeInput(p.get(), "master", "msg")).get();
-    ChangeApi cApi = gApi.changes().id(p.get(), ci._number);
-    assertThat(cApi.get().changeId).isEqualTo(ci.changeId);
-  }
-
-  @Test
-  public void wrongProjectInProjectChangeNumberReturnsNotFound() throws Exception {
-    exception.expect(ResourceNotFoundException.class);
-    exception.expectMessage("Not found: unknown~" + changeInfo._number);
-    gApi.changes().id("unknown", changeInfo._number);
-  }
-
-  @Test
-  public void wrongIdInProjectChangeNumberReturnsNotFound() throws Exception {
-    exception.expect(ResourceNotFoundException.class);
-    exception.expectMessage("Not found: " + project.get() + "~" + Integer.MAX_VALUE);
-    gApi.changes().id(project.get(), Integer.MAX_VALUE);
-  }
-
-  @Test
-  public void changeNumberReturnsChange() throws Exception {
-    ChangeApi cApi = gApi.changes().id(changeInfo._number);
-    assertThat(cApi.get().changeId).isEqualTo(changeInfo.changeId);
-  }
-
-  @Test
-  public void wrongChangeNumberReturnsNotFound() throws Exception {
-    exception.expect(ResourceNotFoundException.class);
-    gApi.changes().id(Integer.MAX_VALUE);
-  }
-
-  @Test
-  public void tripletChangeIdReturnsChange() throws Exception {
-    ChangeApi cApi = gApi.changes().id(project.get(), changeInfo.branch, changeInfo.changeId);
-    assertThat(cApi.get().changeId).isEqualTo(changeInfo.changeId);
-  }
-
-  @Test
-  public void wrongProjectInTripletChangeIdReturnsNotFound() throws Exception {
-    exception.expect(ResourceNotFoundException.class);
-    exception.expectMessage("Not found: unknown~" + changeInfo.branch + "~" + changeInfo.changeId);
-    gApi.changes().id("unknown", changeInfo.branch, changeInfo.changeId);
-  }
-
-  @Test
-  public void wrongBranchInTripletChangeIdReturnsNotFound() throws Exception {
-    exception.expect(ResourceNotFoundException.class);
-    exception.expectMessage("Not found: " + project.get() + "~unknown~" + changeInfo.changeId);
-    gApi.changes().id(project.get(), "unknown", changeInfo.changeId);
-  }
-
-  @Test
-  public void wrongIdInTripletChangeIdReturnsNotFound() throws Exception {
-    String unknownId = "I1234567890";
-    exception.expect(ResourceNotFoundException.class);
-    exception.expectMessage(
-        "Not found: " + project.get() + "~" + changeInfo.branch + "~" + unknownId);
-    gApi.changes().id(project.get(), changeInfo.branch, unknownId);
-  }
-
-  @Test
-  public void changeIdReturnsChange() throws Exception {
-    // ChangeId is not unique and this method needs a unique changeId to work.
-    // Hence we generate a new change with a different content.
-    ChangeInfo ci =
-        gApi.changes().create(new ChangeInput(project.get(), "master", "different message")).get();
-    ChangeApi cApi = gApi.changes().id(ci.changeId);
-    assertThat(cApi.get()._number).isEqualTo(ci._number);
-  }
-
-  @Test
-  public void wrongChangeIdReturnsNotFound() throws Exception {
-    exception.expect(ResourceNotFoundException.class);
-    gApi.changes().id("I1234567890");
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/DisablePrivateChangesIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/DisablePrivateChangesIT.java
deleted file mode 100644
index 92de781..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/DisablePrivateChangesIT.java
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.acceptance.api.change;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.GerritConfig;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.extensions.common.ChangeInput;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.junit.Test;
-
-public class DisablePrivateChangesIT extends AbstractDaemonTest {
-
-  @Test
-  @GerritConfig(name = "change.disablePrivateChanges", value = "true")
-  public void createPrivateChangeWithDisablePrivateChangesTrue() throws Exception {
-    ChangeInput input = new ChangeInput(project.get(), "master", "empty change");
-    input.isPrivate = true;
-    exception.expect(MethodNotAllowedException.class);
-    exception.expectMessage("private changes are disabled");
-    gApi.changes().create(input);
-  }
-
-  @Test
-  @GerritConfig(name = "change.disablePrivateChanges", value = "true")
-  public void createNonPrivateChangeWithDisablePrivateChangesTrue() throws Exception {
-    ChangeInput input = new ChangeInput(project.get(), "master", "empty change");
-    assertThat(gApi.changes().create(input).get().isPrivate).isNull();
-  }
-
-  @Test
-  public void createPrivateChangeWithDisablePrivateChangesFalse() throws Exception {
-    ChangeInput input = new ChangeInput(project.get(), "master", "empty change");
-    input.isPrivate = true;
-    assertThat(gApi.changes().create(input).get().isPrivate).isEqualTo(true);
-  }
-
-  @Test
-  @GerritConfig(name = "change.disablePrivateChanges", value = "true")
-  public void pushPrivatesWithDisablePrivateChangesTrue() throws Exception {
-    PushOneCommit.Result result =
-        pushFactory.create(db, admin.getIdent(), testRepo).to("refs/for/master%private");
-    result.assertErrorStatus();
-  }
-
-  @Test
-  @GerritConfig(name = "change.allowDrafts", value = "true")
-  @GerritConfig(name = "change.disablePrivateChanges", value = "true")
-  public void pushDraftsWithDisablePrivateChangesTrue() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-    PushOneCommit.Result result =
-        pushFactory.create(db, admin.getIdent(), testRepo).to("refs/for/master%draft");
-    result.assertErrorStatus();
-
-    testRepo.reset(initialHead);
-    result = pushFactory.create(db, admin.getIdent(), testRepo).to("refs/drafts/master");
-    result.assertErrorStatus();
-  }
-
-  @Test
-  @GerritConfig(name = "change.disablePrivateChanges", value = "true")
-  public void pushWithDisablePrivateChangesTrue() throws Exception {
-    PushOneCommit.Result result =
-        pushFactory.create(db, admin.getIdent(), testRepo).to("refs/for/master");
-    result.assertOkStatus();
-    assertThat(result.getChange().change().isPrivate()).isFalse();
-  }
-
-  @Test
-  @GerritConfig(name = "change.allowDrafts", value = "true")
-  public void pushPrivatesWithDisablePrivateChangesFalse() throws Exception {
-    PushOneCommit.Result result =
-        pushFactory.create(db, admin.getIdent(), testRepo).to("refs/for/master%private");
-    assertThat(result.getChange().change().isPrivate()).isEqualTo(true);
-  }
-
-  @Test
-  @GerritConfig(name = "change.allowDrafts", value = "true")
-  public void pushDraftsWithDisablePrivateChangesFalse() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-    PushOneCommit.Result result =
-        pushFactory.create(db, admin.getIdent(), testRepo).to("refs/for/master%draft");
-    assertThat(result.getChange().change().isPrivate()).isEqualTo(true);
-
-    testRepo.reset(initialHead);
-    result = pushFactory.create(db, admin.getIdent(), testRepo).to("refs/drafts/master");
-    assertThat(result.getChange().change().isPrivate()).isEqualTo(true);
-  }
-
-  @Test
-  @GerritConfig(name = "change.disablePrivateChanges", value = "true")
-  public void setPrivateWithDisablePrivateChangesTrue() throws Exception {
-    PushOneCommit.Result result = createChange();
-
-    exception.expect(MethodNotAllowedException.class);
-    exception.expectMessage("private changes are disabled");
-    gApi.changes().id(result.getChangeId()).setPrivate(true, "set private");
-  }
-
-  @Test
-  public void setPrivateWithDisablePrivateChangesFalse() throws Exception {
-    PushOneCommit.Result result = createChange();
-    gApi.changes().id(result.getChangeId()).setPrivate(true, "set private");
-    assertThat(gApi.changes().id(result.getChangeId()).get().isPrivate).isTrue();
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/StickyApprovalsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/StickyApprovalsIT.java
deleted file mode 100644
index 28933ad..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/StickyApprovalsIT.java
+++ /dev/null
@@ -1,582 +0,0 @@
-// 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.
-
-package com.google.gerrit.acceptance.api.change;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.extensions.client.ChangeKind.MERGE_FIRST_PARENT_UPDATE;
-import static com.google.gerrit.extensions.client.ChangeKind.NO_CHANGE;
-import static com.google.gerrit.extensions.client.ChangeKind.NO_CODE_CHANGE;
-import static com.google.gerrit.extensions.client.ChangeKind.REWORK;
-import static com.google.gerrit.extensions.client.ChangeKind.TRIVIAL_REBASE;
-import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_COMMIT;
-import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_REVISION;
-import static com.google.gerrit.extensions.client.ListChangesOption.DETAILED_LABELS;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-import static com.google.gerrit.server.project.Util.category;
-import static com.google.gerrit.server.project.Util.value;
-import static org.eclipse.jgit.lib.Constants.HEAD;
-import static org.junit.Assert.fail;
-
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.GitUtil;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.acceptance.TestAccount;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.changes.CherryPickInput;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.api.changes.RevisionApi;
-import com.google.gerrit.extensions.client.ChangeKind;
-import com.google.gerrit.extensions.common.ApprovalInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.CommitInfo;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.project.Util;
-import java.util.EnumSet;
-import java.util.List;
-import java.util.Set;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.junit.Before;
-import org.junit.Test;
-
-@NoHttpd
-public class StickyApprovalsIT extends AbstractDaemonTest {
-  @Before
-  public void setup() throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-
-    // Overwrite "Code-Review" label that is inherited from All-Projects.
-    // This way changes to the "Code Review" label don't affect other tests.
-    LabelType codeReview =
-        category(
-            "Code-Review",
-            value(2, "Looks good to me, approved"),
-            value(1, "Looks good to me, but someone else must approve"),
-            value(0, "No score"),
-            value(-1, "I would prefer that you didn't submit this"),
-            value(-2, "Do not submit"));
-    codeReview.setCopyAllScoresIfNoChange(false);
-    cfg.getLabelSections().put(codeReview.getName(), codeReview);
-
-    LabelType verified =
-        category("Verified", value(1, "Passes"), value(0, "No score"), value(-1, "Failed"));
-    verified.setCopyAllScoresIfNoChange(false);
-    cfg.getLabelSections().put(verified.getName(), verified);
-
-    AccountGroup.UUID registeredUsers = systemGroupBackend.getGroup(REGISTERED_USERS).getUUID();
-    String heads = RefNames.REFS_HEADS + "*";
-    Util.allow(
-        cfg, Permission.forLabel(Util.codeReview().getName()), -2, 2, registeredUsers, heads);
-    Util.allow(cfg, Permission.forLabel(Util.verified().getName()), -1, 1, registeredUsers, heads);
-    saveProjectConfig(project, cfg);
-  }
-
-  @Test
-  public void notSticky() throws Exception {
-    assertNotSticky(
-        EnumSet.of(REWORK, TRIVIAL_REBASE, NO_CODE_CHANGE, MERGE_FIRST_PARENT_UPDATE, NO_CHANGE));
-  }
-
-  @Test
-  public void stickyOnMinScore() throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    cfg.getLabelSections().get("Code-Review").setCopyMinScore(true);
-    saveProjectConfig(project, cfg);
-
-    for (ChangeKind changeKind :
-        EnumSet.of(REWORK, TRIVIAL_REBASE, NO_CODE_CHANGE, MERGE_FIRST_PARENT_UPDATE, NO_CHANGE)) {
-      testRepo.reset(getRemoteHead());
-
-      String changeId = createChange(changeKind);
-      vote(admin, changeId, -1, 1);
-      vote(user, changeId, -2, -1);
-
-      updateChange(changeId, changeKind);
-      ChangeInfo c = detailedChange(changeId);
-      assertVotes(c, admin, 0, 0, changeKind);
-      assertVotes(c, user, -2, 0, changeKind);
-    }
-  }
-
-  @Test
-  public void stickyOnMaxScore() throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    cfg.getLabelSections().get("Code-Review").setCopyMaxScore(true);
-    saveProjectConfig(project, cfg);
-
-    for (ChangeKind changeKind :
-        EnumSet.of(REWORK, TRIVIAL_REBASE, NO_CODE_CHANGE, MERGE_FIRST_PARENT_UPDATE, NO_CHANGE)) {
-      testRepo.reset(getRemoteHead());
-
-      String changeId = createChange(changeKind);
-      vote(admin, changeId, 2, 1);
-      vote(user, changeId, 1, -1);
-
-      updateChange(changeId, changeKind);
-      ChangeInfo c = detailedChange(changeId);
-      assertVotes(c, admin, 2, 0, changeKind);
-      assertVotes(c, user, 0, 0, changeKind);
-    }
-  }
-
-  @Test
-  public void stickyOnTrivialRebase() throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    cfg.getLabelSections().get("Code-Review").setCopyAllScoresOnTrivialRebase(true);
-    saveProjectConfig(project, cfg);
-
-    String changeId = createChange(TRIVIAL_REBASE);
-    vote(admin, changeId, 2, 1);
-    vote(user, changeId, -2, -1);
-
-    updateChange(changeId, NO_CHANGE);
-    ChangeInfo c = detailedChange(changeId);
-    assertVotes(c, admin, 2, 0, NO_CHANGE);
-    assertVotes(c, user, -2, 0, NO_CHANGE);
-
-    updateChange(changeId, TRIVIAL_REBASE);
-    c = detailedChange(changeId);
-    assertVotes(c, admin, 2, 0, TRIVIAL_REBASE);
-    assertVotes(c, user, -2, 0, TRIVIAL_REBASE);
-
-    assertNotSticky(EnumSet.of(REWORK, NO_CODE_CHANGE, MERGE_FIRST_PARENT_UPDATE));
-
-    // check that votes are sticky when trivial rebase is done by cherry-pick
-    testRepo.reset(getRemoteHead());
-    changeId = createChange().getChangeId();
-    vote(admin, changeId, 2, 1);
-    vote(user, changeId, -2, -1);
-
-    String cherryPickChangeId = cherryPick(changeId, TRIVIAL_REBASE);
-    c = detailedChange(cherryPickChangeId);
-    assertVotes(c, admin, 2, 0);
-    assertVotes(c, user, -2, 0);
-
-    // check that votes are not sticky when rework is done by cherry-pick
-    testRepo.reset(getRemoteHead());
-    changeId = createChange().getChangeId();
-    vote(admin, changeId, 2, 1);
-    vote(user, changeId, -2, -1);
-
-    cherryPickChangeId = cherryPick(changeId, REWORK);
-    c = detailedChange(cherryPickChangeId);
-    assertVotes(c, admin, 0, 0);
-    assertVotes(c, user, 0, 0);
-  }
-
-  @Test
-  public void stickyOnNoCodeChange() throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    cfg.getLabelSections().get("Verified").setCopyAllScoresIfNoCodeChange(true);
-    saveProjectConfig(project, cfg);
-
-    String changeId = createChange(NO_CODE_CHANGE);
-    vote(admin, changeId, 2, 1);
-    vote(user, changeId, -2, -1);
-
-    updateChange(changeId, NO_CHANGE);
-    ChangeInfo c = detailedChange(changeId);
-    assertVotes(c, admin, 0, 1, NO_CHANGE);
-    assertVotes(c, user, 0, -1, NO_CHANGE);
-
-    updateChange(changeId, NO_CODE_CHANGE);
-    c = detailedChange(changeId);
-    assertVotes(c, admin, 0, 1, NO_CODE_CHANGE);
-    assertVotes(c, user, 0, -1, NO_CODE_CHANGE);
-
-    assertNotSticky(EnumSet.of(REWORK, TRIVIAL_REBASE, MERGE_FIRST_PARENT_UPDATE));
-  }
-
-  @Test
-  public void stickyOnMergeFirstParentUpdate() throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    cfg.getLabelSections().get("Code-Review").setCopyAllScoresOnMergeFirstParentUpdate(true);
-    saveProjectConfig(project, cfg);
-
-    String changeId = createChange(MERGE_FIRST_PARENT_UPDATE);
-    vote(admin, changeId, 2, 1);
-    vote(user, changeId, -2, -1);
-
-    updateChange(changeId, NO_CHANGE);
-    ChangeInfo c = detailedChange(changeId);
-    assertVotes(c, admin, 2, 0, NO_CHANGE);
-    assertVotes(c, user, -2, 0, NO_CHANGE);
-
-    updateChange(changeId, MERGE_FIRST_PARENT_UPDATE);
-    c = detailedChange(changeId);
-    assertVotes(c, admin, 2, 0, MERGE_FIRST_PARENT_UPDATE);
-    assertVotes(c, user, -2, 0, MERGE_FIRST_PARENT_UPDATE);
-
-    assertNotSticky(EnumSet.of(REWORK, NO_CODE_CHANGE, TRIVIAL_REBASE));
-  }
-
-  @Test
-  public void removedVotesNotSticky() throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    cfg.getLabelSections().get("Code-Review").setCopyAllScoresOnTrivialRebase(true);
-    cfg.getLabelSections().get("Verified").setCopyAllScoresIfNoCodeChange(true);
-    saveProjectConfig(project, cfg);
-
-    for (ChangeKind changeKind :
-        EnumSet.of(REWORK, TRIVIAL_REBASE, NO_CODE_CHANGE, MERGE_FIRST_PARENT_UPDATE, NO_CHANGE)) {
-      testRepo.reset(getRemoteHead());
-
-      String changeId = createChange(changeKind);
-      vote(admin, changeId, 2, 1);
-      vote(user, changeId, -2, -1);
-
-      // Remove votes by re-voting with 0
-      vote(admin, changeId, 0, 0);
-      vote(user, changeId, 0, 0);
-      ChangeInfo c = detailedChange(changeId);
-      assertVotes(c, admin, 0, 0, null);
-      assertVotes(c, user, 0, 0, null);
-
-      updateChange(changeId, changeKind);
-      c = detailedChange(changeId);
-      assertVotes(c, admin, 0, 0, changeKind);
-      assertVotes(c, user, 0, 0, changeKind);
-    }
-  }
-
-  @Test
-  public void stickyAcrossMultiplePatchSets() throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    cfg.getLabelSections().get("Code-Review").setCopyMaxScore(true);
-    cfg.getLabelSections().get("Verified").setCopyAllScoresIfNoCodeChange(true);
-    saveProjectConfig(project, cfg);
-
-    String changeId = createChange(REWORK);
-    vote(admin, changeId, 2, 1);
-
-    for (int i = 0; i < 5; i++) {
-      updateChange(changeId, NO_CODE_CHANGE);
-      ChangeInfo c = detailedChange(changeId);
-      assertVotes(c, admin, 2, 1, NO_CODE_CHANGE);
-    }
-
-    updateChange(changeId, REWORK);
-    ChangeInfo c = detailedChange(changeId);
-    assertVotes(c, admin, 2, 0, REWORK);
-  }
-
-  @Test
-  public void copyMinMaxAcrossMultiplePatchSets() throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    cfg.getLabelSections().get("Code-Review").setCopyMaxScore(true);
-    cfg.getLabelSections().get("Code-Review").setCopyMinScore(true);
-    saveProjectConfig(project, cfg);
-
-    // Vote max score on PS1
-    String changeId = createChange(REWORK);
-    vote(admin, changeId, 2, 1);
-
-    // Have someone else vote min score on PS2
-    updateChange(changeId, REWORK);
-    vote(user, changeId, -2, 0);
-    ChangeInfo c = detailedChange(changeId);
-    assertVotes(c, admin, 2, 0, REWORK);
-    assertVotes(c, user, -2, 0, REWORK);
-
-    // No vote changes on PS3
-    updateChange(changeId, REWORK);
-    c = detailedChange(changeId);
-    assertVotes(c, admin, 2, 0, REWORK);
-    assertVotes(c, user, -2, 0, REWORK);
-
-    // Both users revote on PS4
-    updateChange(changeId, REWORK);
-    vote(admin, changeId, 1, 1);
-    vote(user, changeId, 1, 1);
-    c = detailedChange(changeId);
-    assertVotes(c, admin, 1, 1, REWORK);
-    assertVotes(c, user, 1, 1, REWORK);
-
-    // New approvals shouldn't carry through to PS5
-    updateChange(changeId, REWORK);
-    c = detailedChange(changeId);
-    assertVotes(c, admin, 0, 0, REWORK);
-    assertVotes(c, user, 0, 0, REWORK);
-  }
-
-  @Test
-  public void deleteStickyVote() throws Exception {
-    String label = "Code-Review";
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    cfg.getLabelSections().get(label).setCopyMaxScore(true);
-    saveProjectConfig(project, cfg);
-
-    // Vote max score on PS1
-    String changeId = createChange(REWORK);
-    vote(admin, changeId, label, 2);
-    assertVotes(detailedChange(changeId), admin, label, 2, null);
-    updateChange(changeId, REWORK);
-    assertVotes(detailedChange(changeId), admin, label, 2, REWORK);
-
-    // Delete vote that was copied via sticky approval
-    deleteVote(admin, changeId, "Code-Review");
-    assertVotes(detailedChange(changeId), admin, label, 0, REWORK);
-  }
-
-  private ChangeInfo detailedChange(String changeId) throws Exception {
-    return gApi.changes().id(changeId).get(DETAILED_LABELS, CURRENT_REVISION, CURRENT_COMMIT);
-  }
-
-  private void assertNotSticky(Set<ChangeKind> changeKinds) throws Exception {
-    for (ChangeKind changeKind : changeKinds) {
-      testRepo.reset(getRemoteHead());
-
-      String changeId = createChange(changeKind);
-      vote(admin, changeId, +2, 1);
-      vote(user, changeId, -2, -1);
-
-      updateChange(changeId, changeKind);
-      ChangeInfo c = detailedChange(changeId);
-      assertVotes(c, admin, 0, 0, changeKind);
-      assertVotes(c, user, 0, 0, changeKind);
-    }
-  }
-
-  private String createChange(ChangeKind kind) throws Exception {
-    switch (kind) {
-      case NO_CODE_CHANGE:
-      case REWORK:
-      case TRIVIAL_REBASE:
-      case NO_CHANGE:
-        return createChange().getChangeId();
-      case MERGE_FIRST_PARENT_UPDATE:
-        return createChangeForMergeCommit();
-      default:
-        throw new IllegalStateException("unexpected change kind: " + kind);
-    }
-  }
-
-  private void updateChange(String changeId, ChangeKind changeKind) throws Exception {
-    switch (changeKind) {
-      case NO_CODE_CHANGE:
-        noCodeChange(changeId);
-        return;
-      case REWORK:
-        rework(changeId);
-        return;
-      case TRIVIAL_REBASE:
-        trivialRebase(changeId);
-        return;
-      case MERGE_FIRST_PARENT_UPDATE:
-        updateFirstParent(changeId);
-        return;
-      case NO_CHANGE:
-        noChange(changeId);
-        return;
-      default:
-        fail("unexpected change kind: " + changeKind);
-    }
-  }
-
-  private void noCodeChange(String changeId) throws Exception {
-    TestRepository<?>.CommitBuilder commitBuilder =
-        testRepo.amendRef("HEAD").insertChangeId(changeId.substring(1));
-    commitBuilder
-        .message("New subject " + System.nanoTime())
-        .author(admin.getIdent())
-        .committer(new PersonIdent(admin.getIdent(), testRepo.getDate()));
-    commitBuilder.create();
-    GitUtil.pushHead(testRepo, "refs/for/master", false);
-    assertThat(getChangeKind(changeId)).isEqualTo(NO_CODE_CHANGE);
-  }
-
-  private void noChange(String changeId) throws Exception {
-    ChangeInfo change = gApi.changes().id(changeId).get();
-    String commitMessage = change.revisions.get(change.currentRevision).commit.message;
-
-    TestRepository<?>.CommitBuilder commitBuilder =
-        testRepo.amendRef("HEAD").insertChangeId(changeId.substring(1));
-    commitBuilder
-        .message(commitMessage)
-        .author(admin.getIdent())
-        .committer(new PersonIdent(admin.getIdent(), testRepo.getDate()));
-    commitBuilder.create();
-    GitUtil.pushHead(testRepo, "refs/for/master", false);
-    assertThat(getChangeKind(changeId)).isEqualTo(NO_CHANGE);
-  }
-
-  private void rework(String changeId) throws Exception {
-    PushOneCommit push =
-        pushFactory.create(
-            db,
-            admin.getIdent(),
-            testRepo,
-            PushOneCommit.SUBJECT,
-            PushOneCommit.FILE_NAME,
-            "new content " + System.nanoTime(),
-            changeId);
-    push.to("refs/for/master").assertOkStatus();
-    assertThat(getChangeKind(changeId)).isEqualTo(REWORK);
-  }
-
-  private void trivialRebase(String changeId) throws Exception {
-    setApiUser(admin);
-    testRepo.reset(getRemoteHead());
-    PushOneCommit push =
-        pushFactory.create(
-            db,
-            admin.getIdent(),
-            testRepo,
-            "Other Change",
-            "a" + System.nanoTime() + ".txt",
-            PushOneCommit.FILE_CONTENT);
-    PushOneCommit.Result r = push.to("refs/for/master");
-    r.assertOkStatus();
-    RevisionApi revision = gApi.changes().id(r.getChangeId()).current();
-    ReviewInput in = new ReviewInput().label("Code-Review", 2).label("Verified", 1);
-    revision.review(in);
-    revision.submit();
-
-    gApi.changes().id(changeId).current().rebase();
-    assertThat(getChangeKind(changeId)).isEqualTo(TRIVIAL_REBASE);
-  }
-
-  private String createChangeForMergeCommit() throws Exception {
-    ObjectId initial = repo().exactRef(HEAD).getLeaf().getObjectId();
-
-    PushOneCommit.Result parent1 = createChange("parent 1", "p1.txt", "content 1");
-
-    testRepo.reset(initial);
-    PushOneCommit.Result parent2 = createChange("parent 2", "p2.txt", "content 2");
-
-    testRepo.reset(parent1.getCommit());
-
-    PushOneCommit merge = pushFactory.create(db, admin.getIdent(), testRepo);
-    merge.setParents(ImmutableList.of(parent1.getCommit(), parent2.getCommit()));
-    PushOneCommit.Result result = merge.to("refs/for/master");
-    result.assertOkStatus();
-    return result.getChangeId();
-  }
-
-  private void updateFirstParent(String changeId) throws Exception {
-    ChangeInfo c = detailedChange(changeId);
-    List<CommitInfo> parents = c.revisions.get(c.currentRevision).commit.parents;
-    String parent1 = parents.get(0).commit;
-    String parent2 = parents.get(1).commit;
-    RevCommit commitParent2 = testRepo.getRevWalk().parseCommit(ObjectId.fromString(parent2));
-
-    testRepo.reset(parent1);
-    PushOneCommit.Result newParent1 = createChange("new parent 1", "p1-1.txt", "content 1-1");
-
-    PushOneCommit merge = pushFactory.create(db, admin.getIdent(), testRepo, changeId);
-    merge.setParents(ImmutableList.of(newParent1.getCommit(), commitParent2));
-    PushOneCommit.Result result = merge.to("refs/for/master");
-    result.assertOkStatus();
-
-    assertThat(getChangeKind(changeId)).isEqualTo(MERGE_FIRST_PARENT_UPDATE);
-  }
-
-  private String cherryPick(String changeId, ChangeKind changeKind) throws Exception {
-    switch (changeKind) {
-      case REWORK:
-      case TRIVIAL_REBASE:
-        break;
-      case NO_CODE_CHANGE:
-      case NO_CHANGE:
-      case MERGE_FIRST_PARENT_UPDATE:
-      default:
-        fail("unexpected change kind: " + changeKind);
-    }
-
-    testRepo.reset(getRemoteHead());
-    PushOneCommit.Result r =
-        pushFactory
-            .create(
-                db,
-                admin.getIdent(),
-                testRepo,
-                PushOneCommit.SUBJECT,
-                "other.txt",
-                "new content " + System.nanoTime())
-            .to("refs/for/master");
-    r.assertOkStatus();
-    vote(admin, r.getChangeId(), 2, 1);
-    merge(r);
-
-    String subject =
-        TRIVIAL_REBASE.equals(changeKind)
-            ? PushOneCommit.SUBJECT
-            : "Reworked change " + System.nanoTime();
-    CherryPickInput in = new CherryPickInput();
-    in.destination = "master";
-    in.message = String.format("%s\n\nChange-Id: %s", subject, changeId);
-    ChangeInfo c = gApi.changes().id(changeId).revision("current").cherryPick(in).get();
-    return c.changeId;
-  }
-
-  private ChangeKind getChangeKind(String changeId) throws Exception {
-    ChangeInfo c = gApi.changes().id(changeId).get(CURRENT_REVISION);
-    return c.revisions.get(c.currentRevision).kind;
-  }
-
-  private void vote(TestAccount user, String changeId, String label, int vote) throws Exception {
-    setApiUser(user);
-    gApi.changes().id(changeId).current().review(new ReviewInput().label(label, vote));
-  }
-
-  private void vote(TestAccount user, String changeId, int codeReviewVote, int verifiedVote)
-      throws Exception {
-    setApiUser(user);
-    ReviewInput in =
-        new ReviewInput().label("Code-Review", codeReviewVote).label("Verified", verifiedVote);
-    gApi.changes().id(changeId).current().review(in);
-  }
-
-  private void deleteVote(TestAccount user, String changeId, String label) throws Exception {
-    setApiUser(user);
-    gApi.changes().id(changeId).reviewer(user.getId().toString()).deleteVote(label);
-  }
-
-  private void assertVotes(ChangeInfo c, TestAccount user, int codeReviewVote, int verifiedVote) {
-    assertVotes(c, user, codeReviewVote, verifiedVote, null);
-  }
-
-  private void assertVotes(
-      ChangeInfo c, TestAccount user, int codeReviewVote, int verifiedVote, ChangeKind changeKind) {
-    assertVotes(c, user, "Code-Review", codeReviewVote, changeKind);
-    assertVotes(c, user, "Verified", verifiedVote, changeKind);
-  }
-
-  private void assertVotes(
-      ChangeInfo c, TestAccount user, String label, int expectedVote, ChangeKind changeKind) {
-    Integer vote = 0;
-    if (c.labels.get(label) != null && c.labels.get(label).all != null) {
-      for (ApprovalInfo approval : c.labels.get(label).all) {
-        if (approval._accountId == user.id.get()) {
-          vote = approval.value;
-          break;
-        }
-      }
-    }
-
-    String name = "label = " + label;
-    if (changeKind != null) {
-      name += "; changeKind = " + changeKind.name();
-    }
-    assertThat(vote).named(name).isEqualTo(expectedVote);
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/SubmitTypeRuleIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/SubmitTypeRuleIT.java
deleted file mode 100644
index 6036dc5..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/SubmitTypeRuleIT.java
+++ /dev/null
@@ -1,271 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.acceptance.api.change;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.extensions.client.SubmitType.CHERRY_PICK;
-import static com.google.gerrit.extensions.client.SubmitType.FAST_FORWARD_ONLY;
-import static com.google.gerrit.extensions.client.SubmitType.MERGE_ALWAYS;
-import static com.google.gerrit.extensions.client.SubmitType.MERGE_IF_NECESSARY;
-import static com.google.gerrit.extensions.client.SubmitType.REBASE_ALWAYS;
-import static com.google.gerrit.extensions.client.SubmitType.REBASE_IF_NECESSARY;
-import static org.junit.Assert.fail;
-
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.api.projects.BranchInput;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.extensions.common.TestSubmitRuleInput;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.VersionedMetaData;
-import com.google.gerrit.testutil.ConfigSuite;
-import java.io.IOException;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
-import org.eclipse.jgit.api.Git;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.junit.Before;
-import org.junit.Test;
-
-@NoHttpd
-public class SubmitTypeRuleIT extends AbstractDaemonTest {
-  @ConfigSuite.Default
-  public static Config submitWholeTopicEnabled() {
-    return submitWholeTopicEnabledConfig();
-  }
-
-  private class RulesPl extends VersionedMetaData {
-    private static final String FILENAME = "rules.pl";
-
-    private String rule;
-
-    @Override
-    protected String getRefName() {
-      return RefNames.REFS_CONFIG;
-    }
-
-    @Override
-    protected void onLoad() throws IOException, ConfigInvalidException {
-      rule = readUTF8(FILENAME);
-    }
-
-    @Override
-    protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException {
-      TestSubmitRuleInput in = new TestSubmitRuleInput();
-      in.rule = rule;
-      try {
-        gApi.changes().id(testChangeId.get()).current().testSubmitType(in);
-      } catch (RestApiException e) {
-        throw new ConfigInvalidException("Invalid submit type rule", e);
-      }
-
-      saveUTF8(FILENAME, rule);
-      return true;
-    }
-  }
-
-  private AtomicInteger fileCounter;
-  private Change.Id testChangeId;
-
-  @Before
-  public void setUp() throws Exception {
-    fileCounter = new AtomicInteger();
-    gApi.projects().name(project.get()).branch("test").create(new BranchInput());
-    testChangeId = createChange("test", "test change").getChange().getId();
-  }
-
-  private void setRulesPl(String rule) throws Exception {
-    try (MetaDataUpdate md = metaDataUpdateFactory.create(project)) {
-      RulesPl r = new RulesPl();
-      r.load(md);
-      r.rule = rule;
-      r.commit(md);
-    }
-  }
-
-  private static final String SUBMIT_TYPE_FROM_SUBJECT =
-      "submit_type(fast_forward_only) :-"
-          + "gerrit:commit_message(M),"
-          + "regex_matches('.*FAST_FORWARD_ONLY.*', M),"
-          + "!.\n"
-          + "submit_type(merge_if_necessary) :-"
-          + "gerrit:commit_message(M),"
-          + "regex_matches('.*MERGE_IF_NECESSARY.*', M),"
-          + "!.\n"
-          + "submit_type(rebase_if_necessary) :-"
-          + "gerrit:commit_message(M),"
-          + "regex_matches('.*REBASE_IF_NECESSARY.*', M),"
-          + "!.\n"
-          + "submit_type(rebase_always) :-"
-          + "gerrit:commit_message(M),"
-          + "regex_matches('.*REBASE_ALWAYS.*', M),"
-          + "!.\n"
-          + "submit_type(merge_always) :-"
-          + "gerrit:commit_message(M),"
-          + "regex_matches('.*MERGE_ALWAYS.*', M),"
-          + "!.\n"
-          + "submit_type(cherry_pick) :-"
-          + "gerrit:commit_message(M),"
-          + "regex_matches('.*CHERRY_PICK.*', M),"
-          + "!.\n"
-          + "submit_type(T) :- gerrit:project_default_submit_type(T).";
-
-  private PushOneCommit.Result createChange(String dest, String subject) throws Exception {
-    PushOneCommit push =
-        pushFactory.create(
-            db,
-            admin.getIdent(),
-            testRepo,
-            subject,
-            "file" + fileCounter.incrementAndGet(),
-            PushOneCommit.FILE_CONTENT);
-    PushOneCommit.Result r = push.to("refs/for/" + dest);
-    r.assertOkStatus();
-    return r;
-  }
-
-  @Test
-  public void unconditionalCherryPick() throws Exception {
-    PushOneCommit.Result r = createChange();
-    assertSubmitType(MERGE_IF_NECESSARY, r.getChangeId());
-    setRulesPl("submit_type(cherry_pick).");
-    assertSubmitType(CHERRY_PICK, r.getChangeId());
-  }
-
-  @Test
-  public void submitTypeFromSubject() throws Exception {
-    PushOneCommit.Result r1 = createChange("master", "Default 1");
-    PushOneCommit.Result r2 = createChange("master", "FAST_FORWARD_ONLY 2");
-    PushOneCommit.Result r3 = createChange("master", "MERGE_IF_NECESSARY 3");
-    PushOneCommit.Result r4 = createChange("master", "REBASE_IF_NECESSARY 4");
-    PushOneCommit.Result r5 = createChange("master", "REBASE_ALWAYS 5");
-    PushOneCommit.Result r6 = createChange("master", "MERGE_ALWAYS 6");
-    PushOneCommit.Result r7 = createChange("master", "CHERRY_PICK 7");
-
-    assertSubmitType(MERGE_IF_NECESSARY, r1.getChangeId());
-    assertSubmitType(MERGE_IF_NECESSARY, r2.getChangeId());
-    assertSubmitType(MERGE_IF_NECESSARY, r3.getChangeId());
-    assertSubmitType(MERGE_IF_NECESSARY, r4.getChangeId());
-    assertSubmitType(MERGE_IF_NECESSARY, r5.getChangeId());
-    assertSubmitType(MERGE_IF_NECESSARY, r6.getChangeId());
-    assertSubmitType(MERGE_IF_NECESSARY, r7.getChangeId());
-
-    setRulesPl(SUBMIT_TYPE_FROM_SUBJECT);
-
-    assertSubmitType(MERGE_IF_NECESSARY, r1.getChangeId());
-    assertSubmitType(FAST_FORWARD_ONLY, r2.getChangeId());
-    assertSubmitType(MERGE_IF_NECESSARY, r3.getChangeId());
-    assertSubmitType(REBASE_IF_NECESSARY, r4.getChangeId());
-    assertSubmitType(REBASE_ALWAYS, r5.getChangeId());
-    assertSubmitType(MERGE_ALWAYS, r6.getChangeId());
-    assertSubmitType(CHERRY_PICK, r7.getChangeId());
-  }
-
-  @Test
-  public void submitTypeIsUsedForSubmit() throws Exception {
-    setRulesPl(SUBMIT_TYPE_FROM_SUBJECT);
-
-    PushOneCommit.Result r = createChange("master", "CHERRY_PICK 1");
-
-    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve());
-    gApi.changes().id(r.getChangeId()).current().submit();
-
-    List<RevCommit> log = log("master", 1);
-    assertThat(log.get(0).getShortMessage()).isEqualTo("CHERRY_PICK 1");
-    assertThat(log.get(0).name()).isNotEqualTo(r.getCommit().name());
-    assertThat(log.get(0).getFullMessage()).contains("Change-Id: " + r.getChangeId());
-    assertThat(log.get(0).getFullMessage()).contains("Reviewed-on: ");
-  }
-
-  @Test
-  public void mixingSubmitTypesAcrossBranchesSucceeds() throws Exception {
-    setRulesPl(SUBMIT_TYPE_FROM_SUBJECT);
-
-    PushOneCommit.Result r1 = createChange("master", "MERGE_IF_NECESSARY 1");
-
-    RevCommit initialCommit = r1.getCommit().getParent(0);
-    BranchInput bin = new BranchInput();
-    bin.revision = initialCommit.name();
-    gApi.projects().name(project.get()).branch("branch").create(bin);
-
-    testRepo.reset(initialCommit);
-    PushOneCommit.Result r2 = createChange("branch", "MERGE_ALWAYS 1");
-
-    gApi.changes().id(r1.getChangeId()).topic(name("topic"));
-    gApi.changes().id(r1.getChangeId()).current().review(ReviewInput.approve());
-    gApi.changes().id(r2.getChangeId()).topic(name("topic"));
-    gApi.changes().id(r2.getChangeId()).current().review(ReviewInput.approve());
-    gApi.changes().id(r2.getChangeId()).current().submit();
-
-    assertThat(log("master", 1).get(0).name()).isEqualTo(r1.getCommit().name());
-
-    List<RevCommit> branchLog = log("branch", 1);
-    assertThat(branchLog.get(0).getParents()).hasLength(2);
-    assertThat(branchLog.get(0).getParent(1).name()).isEqualTo(r2.getCommit().name());
-  }
-
-  @Test
-  public void mixingSubmitTypesOnOneBranchFails() throws Exception {
-    setRulesPl(SUBMIT_TYPE_FROM_SUBJECT);
-
-    PushOneCommit.Result r1 = createChange("master", "CHERRY_PICK 1");
-    PushOneCommit.Result r2 = createChange("master", "MERGE_IF_NECESSARY 2");
-
-    gApi.changes().id(r1.getChangeId()).current().review(ReviewInput.approve());
-    gApi.changes().id(r2.getChangeId()).current().review(ReviewInput.approve());
-
-    try {
-      gApi.changes().id(r2.getChangeId()).current().submit();
-      fail("Expected ResourceConflictException");
-    } catch (ResourceConflictException e) {
-      assertThat(e)
-          .hasMessageThat()
-          .isEqualTo(
-              "Failed to submit 2 changes due to the following problems:\n"
-                  + "Change "
-                  + r1.getChange().getId()
-                  + ": Change has submit type "
-                  + "CHERRY_PICK, but previously chose submit type MERGE_IF_NECESSARY "
-                  + "from change "
-                  + r2.getChange().getId()
-                  + " in the same batch");
-    }
-  }
-
-  private List<RevCommit> log(String commitish, int n) throws Exception {
-    try (Repository repo = repoManager.openRepository(project);
-        Git git = new Git(repo)) {
-      ObjectId id = repo.resolve(commitish);
-      assertThat(id).isNotNull();
-      return ImmutableList.copyOf(git.log().add(id).setMaxCount(n).call());
-    }
-  }
-
-  private void assertSubmitType(SubmitType expected, String id) throws Exception {
-    assertThat(gApi.changes().id(id).current().submitType()).isEqualTo(expected);
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/config/BUILD b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/config/BUILD
deleted file mode 100644
index 6d39131..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/config/BUILD
+++ /dev/null
@@ -1,7 +0,0 @@
-load("//gerrit-acceptance-tests:tests.bzl", "acceptance_tests")
-
-acceptance_tests(
-    srcs = glob(["*IT.java"]),
-    group = "api_config",
-    labels = ["api"],
-)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/config/GeneralPreferencesIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/config/GeneralPreferencesIT.java
deleted file mode 100644
index 54b2a47..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/config/GeneralPreferencesIT.java
+++ /dev/null
@@ -1,66 +0,0 @@
-// 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.
-
-package com.google.gerrit.acceptance.api.config;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.AssertUtil.assertPrefs;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.inject.Inject;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.Repository;
-import org.junit.After;
-import org.junit.Test;
-
-@NoHttpd
-public class GeneralPreferencesIT extends AbstractDaemonTest {
-  @Inject private AllUsersName allUsers;
-
-  @After
-  public void cleanUp() throws Exception {
-    try (Repository git = repoManager.openRepository(allUsers)) {
-      if (git.exactRef(RefNames.REFS_USERS_DEFAULT) != null) {
-        RefUpdate u = git.updateRef(RefNames.REFS_USERS_DEFAULT);
-        u.setForceUpdate(true);
-        assertThat(u.delete()).isEqualTo(RefUpdate.Result.FORCED);
-      }
-    }
-    accountCache.evictAllNoReindex();
-  }
-
-  @Test
-  public void getGeneralPreferences() throws Exception {
-    GeneralPreferencesInfo result = gApi.config().server().getDefaultPreferences();
-    assertPrefs(result, GeneralPreferencesInfo.defaults(), "my");
-  }
-
-  @Test
-  public void setGeneralPreferences() throws Exception {
-    boolean newSignedOffBy = !GeneralPreferencesInfo.defaults().signedOffBy;
-    GeneralPreferencesInfo update = new GeneralPreferencesInfo();
-    update.signedOffBy = newSignedOffBy;
-    GeneralPreferencesInfo result = gApi.config().server().setDefaultPreferences(update);
-    assertThat(result.signedOffBy).named("signedOffBy").isEqualTo(newSignedOffBy);
-
-    result = gApi.config().server().getDefaultPreferences();
-    GeneralPreferencesInfo expected = GeneralPreferencesInfo.defaults();
-    expected.signedOffBy = newSignedOffBy;
-    assertPrefs(result, expected, "my");
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/group/BUILD b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/group/BUILD
deleted file mode 100644
index 1b90776..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/group/BUILD
+++ /dev/null
@@ -1,23 +0,0 @@
-load("//gerrit-acceptance-tests:tests.bzl", "acceptance_tests")
-
-acceptance_tests(
-    srcs = glob(["*IT.java"]),
-    group = "api_group",
-    labels = ["api"],
-    deps = [
-        ":util",
-        "//gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account:util",
-    ],
-)
-
-java_library(
-    name = "util",
-    srcs = ["GroupAssert.java"],
-    deps = [
-        "//gerrit-extension-api:api",
-        "//gerrit-reviewdb:server",
-        "//gerrit-server:server",
-        "//lib:gwtorm",
-        "//lib:truth",
-    ],
-)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/group/GroupsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/group/GroupsIT.java
deleted file mode 100644
index 3f18f64..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/group/GroupsIT.java
+++ /dev/null
@@ -1,728 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.acceptance.api.group;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.api.group.GroupAssert.assertGroupInfo;
-import static com.google.gerrit.acceptance.rest.account.AccountAssert.assertAccountInfos;
-import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
-import static java.util.stream.Collectors.toList;
-import static org.junit.Assert.fail;
-
-import com.google.common.collect.Iterables;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.GerritConfig;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.TestAccount;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.extensions.api.groups.GroupApi;
-import com.google.gerrit.extensions.api.groups.GroupInput;
-import com.google.gerrit.extensions.api.groups.Groups.ListRequest;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.GroupAuditEventInfo;
-import com.google.gerrit.extensions.common.GroupAuditEventInfo.GroupMemberAuditEventInfo;
-import com.google.gerrit.extensions.common.GroupAuditEventInfo.Type;
-import com.google.gerrit.extensions.common.GroupAuditEventInfo.UserMemberAuditEventInfo;
-import com.google.gerrit.extensions.common.GroupInfo;
-import com.google.gerrit.extensions.common.GroupOptionsInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.extensions.restapi.Url;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.account.GroupIncludeCache;
-import com.google.gerrit.server.group.Groups;
-import com.google.gerrit.server.group.GroupsUpdate;
-import com.google.gerrit.server.group.InternalGroup;
-import com.google.gerrit.server.group.ServerInitiated;
-import com.google.gerrit.server.group.SystemGroupBackend;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import org.junit.Test;
-
-@NoHttpd
-public class GroupsIT extends AbstractDaemonTest {
-  @Inject @ServerInitiated private Provider<GroupsUpdate> groupsUpdateProvider;
-  @Inject private Groups groups;
-  @Inject private GroupIncludeCache groupIncludeCache;
-
-  @Test
-  public void systemGroupCanBeRetrievedFromIndex() throws Exception {
-    List<GroupInfo> groupInfos = gApi.groups().query("name:Administrators").get();
-    assertThat(groupInfos).isNotEmpty();
-  }
-
-  @Test
-  public void addToNonExistingGroup_NotFound() throws Exception {
-    exception.expect(ResourceNotFoundException.class);
-    gApi.groups().id("non-existing").addMembers("admin");
-  }
-
-  @Test
-  public void removeFromNonExistingGroup_NotFound() throws Exception {
-    exception.expect(ResourceNotFoundException.class);
-    gApi.groups().id("non-existing").removeMembers("admin");
-  }
-
-  @Test
-  public void addRemoveMember() throws Exception {
-    String g = createGroup("users");
-    gApi.groups().id(g).addMembers("user");
-    assertMembers(g, user);
-
-    gApi.groups().id(g).removeMembers("user");
-    assertNoMembers(g);
-  }
-
-  @Test
-  public void cachedGroupsForMemberAreUpdatedOnMemberAdditionAndRemoval() throws Exception {
-    // Fill the cache for the observed account.
-    groupIncludeCache.getGroupsWithMember(user.getId());
-    String groupName = createGroup("users");
-    AccountGroup.UUID groupUuid = new AccountGroup.UUID(gApi.groups().id(groupName).get().id);
-
-    gApi.groups().id(groupName).addMembers(user.fullName);
-
-    Collection<AccountGroup.UUID> groupsWithMemberAfterAddition =
-        groupIncludeCache.getGroupsWithMember(user.getId());
-    assertThat(groupsWithMemberAfterAddition).contains(groupUuid);
-
-    gApi.groups().id(groupName).removeMembers(user.fullName);
-
-    Collection<AccountGroup.UUID> groupsWithMemberAfterRemoval =
-        groupIncludeCache.getGroupsWithMember(user.getId());
-    assertThat(groupsWithMemberAfterRemoval).doesNotContain(groupUuid);
-  }
-
-  @Test
-  public void addExistingMember_OK() throws Exception {
-    String g = "Administrators";
-    assertMembers(g, admin);
-    gApi.groups().id("Administrators").addMembers("admin");
-    assertMembers(g, admin);
-  }
-
-  @Test
-  public void addNonExistingMember_UnprocessableEntity() throws Exception {
-    exception.expect(UnprocessableEntityException.class);
-    gApi.groups().id("Administrators").addMembers("non-existing");
-  }
-
-  @Test
-  public void addMultipleMembers() throws Exception {
-    String g = createGroup("users");
-    TestAccount u1 = accountCreator.create("u1", "u1@example.com", "Full Name 1");
-    TestAccount u2 = accountCreator.create("u2", "u2@example.com", "Full Name 2");
-    gApi.groups().id(g).addMembers(u1.username, u2.username);
-    assertMembers(g, u1, u2);
-  }
-
-  @Test
-  public void addMembersWithAtSign() throws Exception {
-    String g = createGroup("users");
-    TestAccount u10 = accountCreator.create("u10", "u10@example.com", "Full Name 10");
-    TestAccount u11_at =
-        accountCreator.create("u11@something", "u11@example.com", "Full Name 11 With At");
-    accountCreator.create("u11", "u11.another@example.com", "Full Name 11 Without At");
-    gApi.groups().id(g).addMembers(u10.username, u11_at.username);
-    assertMembers(g, u10, u11_at);
-  }
-
-  @Test
-  public void includeRemoveGroup() throws Exception {
-    String p = createGroup("parent");
-    String g = createGroup("newGroup");
-    gApi.groups().id(p).addGroups(g);
-    assertIncludes(p, g);
-
-    gApi.groups().id(p).removeGroups(g);
-    assertNoIncludes(p);
-  }
-
-  @Test
-  public void includeExistingGroup_OK() throws Exception {
-    String p = createGroup("parent");
-    String g = createGroup("newGroup");
-    gApi.groups().id(p).addGroups(g);
-    assertIncludes(p, g);
-    gApi.groups().id(p).addGroups(g);
-    assertIncludes(p, g);
-  }
-
-  @Test
-  public void addMultipleIncludes() throws Exception {
-    String p = createGroup("parent");
-    String g1 = createGroup("newGroup1");
-    String g2 = createGroup("newGroup2");
-    List<String> groups = new ArrayList<>();
-    groups.add(g1);
-    groups.add(g2);
-    gApi.groups().id(p).addGroups(g1, g2);
-    assertIncludes(p, g1, g2);
-  }
-
-  @Test
-  public void createGroup() throws Exception {
-    String newGroupName = name("newGroup");
-    GroupInfo g = gApi.groups().create(newGroupName).get();
-    assertGroupInfo(getFromCache(newGroupName), g);
-  }
-
-  @Test
-  public void createDuplicateInternalGroupCaseSensitiveName_Conflict() throws Exception {
-    String dupGroupName = name("dupGroup");
-    gApi.groups().create(dupGroupName);
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("group '" + dupGroupName + "' already exists");
-    gApi.groups().create(dupGroupName);
-  }
-
-  @Test
-  public void createDuplicateInternalGroupCaseInsensitiveName() throws Exception {
-    String dupGroupName = name("dupGroupA");
-    String dupGroupNameLowerCase = name("dupGroupA").toLowerCase();
-    gApi.groups().create(dupGroupName);
-    gApi.groups().create(dupGroupNameLowerCase);
-    assertThat(gApi.groups().list().getAsMap().keySet()).contains(dupGroupName);
-    assertThat(gApi.groups().list().getAsMap().keySet()).contains(dupGroupNameLowerCase);
-  }
-
-  @Test
-  public void createDuplicateSystemGroupCaseSensitiveName_Conflict() throws Exception {
-    String newGroupName = "Registered Users";
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("group 'Registered Users' already exists");
-    gApi.groups().create(newGroupName);
-  }
-
-  @Test
-  public void createDuplicateSystemGroupCaseInsensitiveName_Conflict() throws Exception {
-    String newGroupName = "registered users";
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("group 'Registered Users' already exists");
-    gApi.groups().create(newGroupName);
-  }
-
-  @Test
-  @GerritConfig(name = "groups.global:Anonymous-Users.name", value = "All Users")
-  public void createGroupWithConfiguredNameOfSystemGroup_Conflict() throws Exception {
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("group 'All Users' already exists");
-    gApi.groups().create("all users");
-  }
-
-  @Test
-  @GerritConfig(name = "groups.global:Anonymous-Users.name", value = "All Users")
-  public void createGroupWithDefaultNameOfSystemGroup_Conflict() throws Exception {
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("group name 'Anonymous Users' is reserved");
-    gApi.groups().create("anonymous users");
-  }
-
-  @Test
-  public void createGroupWithProperties() throws Exception {
-    GroupInput in = new GroupInput();
-    in.name = name("newGroup");
-    in.description = "Test description";
-    in.visibleToAll = true;
-    in.ownerId = getFromCache("Administrators").getGroupUUID().get();
-    GroupInfo g = gApi.groups().create(in).detail();
-    assertThat(g.description).isEqualTo(in.description);
-    assertThat(g.options.visibleToAll).isEqualTo(in.visibleToAll);
-    assertThat(g.ownerId).isEqualTo(in.ownerId);
-  }
-
-  @Test
-  public void createGroupWithoutCapability_Forbidden() throws Exception {
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    gApi.groups().create(name("newGroup"));
-  }
-
-  @Test
-  public void createdOnFieldIsPopulatedForNewGroup() throws Exception {
-    Timestamp testStartTime = TimeUtil.nowTs();
-    String newGroupName = name("newGroup");
-    GroupInfo group = gApi.groups().create(newGroupName).get();
-
-    assertThat(group.createdOn).isAtLeast(testStartTime);
-  }
-
-  @Test
-  public void createdOnFieldDefaultsToAuditCreationInstantBeforeSchemaUpgrade() throws Exception {
-    String newGroupName = name("newGroup");
-    GroupInfo newGroup = gApi.groups().create(newGroupName).get();
-    setCreatedOnToNull(new AccountGroup.UUID(newGroup.id));
-
-    GroupInfo updatedGroup = gApi.groups().id(newGroup.id).get();
-    assertThat(updatedGroup.createdOn).isEqualTo(AccountGroup.auditCreationInstantTs());
-  }
-
-  @Test
-  public void getGroup() throws Exception {
-    InternalGroup adminGroup = getFromCache("Administrators");
-    testGetGroup(adminGroup.getGroupUUID().get(), adminGroup);
-    testGetGroup(adminGroup.getName(), adminGroup);
-    testGetGroup(adminGroup.getId().get(), adminGroup);
-  }
-
-  private void testGetGroup(Object id, InternalGroup expectedGroup) throws Exception {
-    GroupInfo group = gApi.groups().id(id.toString()).get();
-    assertGroupInfo(expectedGroup, group);
-  }
-
-  @Test
-  @GerritConfig(name = "groups.global:Anonymous-Users.name", value = "All Users")
-  public void getSystemGroupByConfiguredName() throws Exception {
-    GroupReference anonymousUsersGroup = systemGroupBackend.getGroup(ANONYMOUS_USERS);
-    assertThat(anonymousUsersGroup.getName()).isEqualTo("All Users");
-
-    GroupInfo group = gApi.groups().id(anonymousUsersGroup.getUUID().get()).get();
-    assertThat(group.name).isEqualTo(anonymousUsersGroup.getName());
-
-    group = gApi.groups().id(anonymousUsersGroup.getName()).get();
-    assertThat(group.id).isEqualTo(Url.encode((anonymousUsersGroup.getUUID().get())));
-  }
-
-  @Test
-  public void getSystemGroupByDefaultName() throws Exception {
-    GroupReference anonymousUsersGroup = systemGroupBackend.getGroup(ANONYMOUS_USERS);
-    GroupInfo group = gApi.groups().id("Anonymous Users").get();
-    assertThat(group.name).isEqualTo(anonymousUsersGroup.getName());
-    assertThat(group.id).isEqualTo(Url.encode((anonymousUsersGroup.getUUID().get())));
-  }
-
-  @Test
-  @GerritConfig(name = "groups.global:Anonymous-Users.name", value = "All Users")
-  public void getSystemGroupByDefaultName_NotFound() throws Exception {
-    exception.expect(ResourceNotFoundException.class);
-    gApi.groups().id("Anonymous-Users").get();
-  }
-
-  @Test
-  public void groupName() throws Exception {
-    String name = name("group");
-    gApi.groups().create(name);
-
-    // get name
-    assertThat(gApi.groups().id(name).name()).isEqualTo(name);
-
-    // set name to same name
-    gApi.groups().id(name).name(name);
-    assertThat(gApi.groups().id(name).name()).isEqualTo(name);
-
-    // set name with name conflict
-    String other = name("other");
-    gApi.groups().create(other);
-    exception.expect(ResourceConflictException.class);
-    gApi.groups().id(name).name(other);
-  }
-
-  @Test
-  public void groupRename() throws Exception {
-    String name = name("group");
-    gApi.groups().create(name);
-
-    String newName = name("newName");
-    gApi.groups().id(name).name(newName);
-    assertThat(getFromCache(newName)).isNotNull();
-    assertThat(gApi.groups().id(newName).name()).isEqualTo(newName);
-
-    assertThat(getFromCache(name)).isNull();
-    exception.expect(ResourceNotFoundException.class);
-    gApi.groups().id(name).get();
-  }
-
-  @Test
-  public void groupDescription() throws Exception {
-    String name = name("group");
-    gApi.groups().create(name);
-
-    // get description
-    assertThat(gApi.groups().id(name).description()).isEmpty();
-
-    // set description
-    String desc = "New description for the group.";
-    gApi.groups().id(name).description(desc);
-    assertThat(gApi.groups().id(name).description()).isEqualTo(desc);
-
-    // set description to null
-    gApi.groups().id(name).description(null);
-    assertThat(gApi.groups().id(name).description()).isEmpty();
-
-    // set description to empty string
-    gApi.groups().id(name).description("");
-    assertThat(gApi.groups().id(name).description()).isEmpty();
-  }
-
-  @Test
-  public void groupOptions() throws Exception {
-    String name = name("group");
-    gApi.groups().create(name);
-
-    // get options
-    assertThat(gApi.groups().id(name).options().visibleToAll).isNull();
-
-    // set options
-    GroupOptionsInfo options = new GroupOptionsInfo();
-    options.visibleToAll = true;
-    gApi.groups().id(name).options(options);
-    assertThat(gApi.groups().id(name).options().visibleToAll).isTrue();
-  }
-
-  @Test
-  public void groupOwner() throws Exception {
-    String name = name("group");
-    GroupInfo info = gApi.groups().create(name).get();
-    String adminUUID = getFromCache("Administrators").getGroupUUID().get();
-    String registeredUUID = SystemGroupBackend.REGISTERED_USERS.get();
-
-    // get owner
-    assertThat(Url.decode(gApi.groups().id(name).owner().id)).isEqualTo(info.id);
-
-    // set owner by name
-    gApi.groups().id(name).owner("Registered Users");
-    assertThat(Url.decode(gApi.groups().id(name).owner().id)).isEqualTo(registeredUUID);
-
-    // set owner by UUID
-    gApi.groups().id(name).owner(adminUUID);
-    assertThat(Url.decode(gApi.groups().id(name).owner().id)).isEqualTo(adminUUID);
-
-    // set non existing owner
-    exception.expect(UnprocessableEntityException.class);
-    gApi.groups().id(name).owner("Non-Existing Group");
-  }
-
-  @Test
-  public void listNonExistingGroupIncludes_NotFound() throws Exception {
-    exception.expect(ResourceNotFoundException.class);
-    gApi.groups().id("non-existing").includedGroups();
-  }
-
-  @Test
-  public void listEmptyGroupIncludes() throws Exception {
-    String gx = createGroup("gx");
-    assertThat(gApi.groups().id(gx).includedGroups()).isEmpty();
-  }
-
-  @Test
-  public void includeNonExistingGroup() throws Exception {
-    String gx = createGroup("gx");
-    exception.expect(UnprocessableEntityException.class);
-    gApi.groups().id(gx).addGroups("non-existing");
-  }
-
-  @Test
-  public void listNonEmptyGroupIncludes() throws Exception {
-    String gx = createGroup("gx");
-    String gy = createGroup("gy");
-    String gz = createGroup("gz");
-    gApi.groups().id(gx).addGroups(gy);
-    gApi.groups().id(gx).addGroups(gz);
-    assertIncludes(gApi.groups().id(gx).includedGroups(), gy, gz);
-  }
-
-  @Test
-  public void listOneIncludeMember() throws Exception {
-    String gx = createGroup("gx");
-    String gy = createGroup("gy");
-    gApi.groups().id(gx).addGroups(gy);
-    assertIncludes(gApi.groups().id(gx).includedGroups(), gy);
-  }
-
-  @Test
-  public void listNonExistingGroupMembers_NotFound() throws Exception {
-    exception.expect(ResourceNotFoundException.class);
-    gApi.groups().id("non-existing").members();
-  }
-
-  @Test
-  public void listEmptyGroupMembers() throws Exception {
-    String group = createGroup("empty");
-    assertThat(gApi.groups().id(group).members()).isEmpty();
-  }
-
-  @Test
-  public void listNonEmptyGroupMembers() throws Exception {
-    String group = createGroup("group");
-    String user1 = createAccount("user1", group);
-    String user2 = createAccount("user2", group);
-    assertMembers(gApi.groups().id(group).members(), user1, user2);
-  }
-
-  @Test
-  public void listOneGroupMember() throws Exception {
-    String group = createGroup("group");
-    String user = createAccount("user1", group);
-    assertMembers(gApi.groups().id(group).members(), user);
-  }
-
-  @Test
-  public void listGroupMembersRecursively() throws Exception {
-    String gx = createGroup("gx");
-    String ux = createAccount("ux", gx);
-
-    String gy = createGroup("gy");
-    String uy = createAccount("uy", gy);
-
-    String gz = createGroup("gz");
-    String uz = createAccount("uz", gz);
-
-    gApi.groups().id(gx).addGroups(gy);
-    gApi.groups().id(gy).addGroups(gz);
-    assertMembers(gApi.groups().id(gx).members(), ux);
-    assertMembers(gApi.groups().id(gx).members(true), ux, uy, uz);
-  }
-
-  @Test
-  public void defaultGroupsCreated() throws Exception {
-    Iterable<String> names = gApi.groups().list().getAsMap().keySet();
-    assertThat(names).containsAllOf("Administrators", "Non-Interactive Users").inOrder();
-  }
-
-  @Test
-  public void listAllGroups() throws Exception {
-    List<String> expectedGroups =
-        groups.getAll(db).map(a -> a.getName()).sorted().collect(toList());
-    assertThat(expectedGroups.size()).isAtLeast(2);
-    assertThat(gApi.groups().list().getAsMap().keySet())
-        .containsExactlyElementsIn(expectedGroups)
-        .inOrder();
-  }
-
-  @Test
-  public void onlyVisibleGroupsReturned() throws Exception {
-    String newGroupName = name("newGroup");
-    GroupInput in = new GroupInput();
-    in.name = newGroupName;
-    in.description = "a hidden group";
-    in.visibleToAll = false;
-    in.ownerId = getFromCache("Administrators").getGroupUUID().get();
-    gApi.groups().create(in);
-
-    setApiUser(user);
-    assertThat(gApi.groups().list().getAsMap()).doesNotContainKey(newGroupName);
-
-    setApiUser(admin);
-    gApi.groups().id(newGroupName).addMembers(user.username);
-
-    setApiUser(user);
-    assertThat(gApi.groups().list().getAsMap()).containsKey(newGroupName);
-  }
-
-  @Test
-  public void suggestGroup() throws Exception {
-    Map<String, GroupInfo> groups = gApi.groups().list().withSuggest("adm").getAsMap();
-    assertThat(groups).containsKey("Administrators");
-    assertThat(groups).hasSize(1);
-    assertBadRequest(gApi.groups().list().withSuggest("adm").withSubstring("foo"));
-    assertBadRequest(gApi.groups().list().withSuggest("adm").withRegex("foo.*"));
-    assertBadRequest(gApi.groups().list().withSuggest("adm").withUser("user"));
-    assertBadRequest(gApi.groups().list().withSuggest("adm").withOwned(true));
-    assertBadRequest(gApi.groups().list().withSuggest("adm").withVisibleToAll(true));
-    assertBadRequest(gApi.groups().list().withSuggest("adm").withStart(1));
-  }
-
-  @Test
-  public void withSubstring() throws Exception {
-    Map<String, GroupInfo> groups = gApi.groups().list().withSubstring("dmin").getAsMap();
-    assertThat(groups).containsKey("Administrators");
-    assertThat(groups).hasSize(1);
-
-    groups = gApi.groups().list().withSubstring("admin").getAsMap();
-    assertThat(groups).containsKey("Administrators");
-    assertThat(groups).hasSize(1);
-
-    String other = name("Administrators");
-    gApi.groups().create(other);
-    groups = gApi.groups().list().withSubstring("dmin").getAsMap();
-    assertThat(groups).hasSize(2);
-    assertThat(groups).containsKey("Administrators");
-    assertThat(groups).containsKey(other);
-
-    groups = gApi.groups().list().withSubstring("foo").getAsMap();
-    assertThat(groups).isEmpty();
-  }
-
-  @Test
-  public void withRegex() throws Exception {
-    Map<String, GroupInfo> groups = gApi.groups().list().withRegex("Admin.*").getAsMap();
-    assertThat(groups).containsKey("Administrators");
-    assertThat(groups).hasSize(1);
-
-    groups = gApi.groups().list().withRegex("admin.*").getAsMap();
-    assertThat(groups).isEmpty();
-
-    groups = gApi.groups().list().withRegex(".*istrators").getAsMap();
-    assertThat(groups).containsKey("Administrators");
-    assertThat(groups).hasSize(1);
-
-    assertBadRequest(gApi.groups().list().withRegex(".*istrators").withSubstring("s"));
-  }
-
-  @Test
-  public void allGroupInfoFieldsSetCorrectly() throws Exception {
-    InternalGroup adminGroup = getFromCache("Administrators");
-    Map<String, GroupInfo> groups = gApi.groups().list().addGroup(adminGroup.getName()).getAsMap();
-    assertThat(groups).hasSize(1);
-    assertThat(groups).containsKey("Administrators");
-    assertGroupInfo(adminGroup, Iterables.getOnlyElement(groups.values()));
-  }
-
-  @Test
-  public void getAuditLog() throws Exception {
-    GroupApi g = gApi.groups().create(name("group"));
-    List<? extends GroupAuditEventInfo> auditEvents = g.auditLog();
-    assertThat(auditEvents).hasSize(1);
-    assertAuditEvent(auditEvents.get(0), Type.ADD_USER, admin.id, admin.id);
-
-    g.addMembers(user.username);
-    auditEvents = g.auditLog();
-    assertThat(auditEvents).hasSize(2);
-    assertAuditEvent(auditEvents.get(0), Type.ADD_USER, admin.id, user.id);
-
-    g.removeMembers(user.username);
-    auditEvents = g.auditLog();
-    assertThat(auditEvents).hasSize(3);
-    assertAuditEvent(auditEvents.get(0), Type.REMOVE_USER, admin.id, user.id);
-
-    String otherGroup = name("otherGroup");
-    gApi.groups().create(otherGroup);
-    g.addGroups(otherGroup);
-    auditEvents = g.auditLog();
-    assertThat(auditEvents).hasSize(4);
-    assertAuditEvent(auditEvents.get(0), Type.ADD_GROUP, admin.id, otherGroup);
-
-    g.removeGroups(otherGroup);
-    auditEvents = g.auditLog();
-    assertThat(auditEvents).hasSize(5);
-    assertAuditEvent(auditEvents.get(0), Type.REMOVE_GROUP, admin.id, otherGroup);
-
-    Timestamp lastDate = null;
-    for (GroupAuditEventInfo auditEvent : auditEvents) {
-      if (lastDate != null) {
-        assertThat(lastDate).isGreaterThan(auditEvent.date);
-      }
-      lastDate = auditEvent.date;
-    }
-  }
-
-  // reindex is tested by {@link AbstractQueryGroupsTest#reindex}
-  @Test
-  public void reindexPermissions() throws Exception {
-    TestAccount groupOwner = accountCreator.user2();
-    GroupInput in = new GroupInput();
-    in.name = name("group");
-    in.members =
-        Collections.singleton(groupOwner).stream().map(u -> u.id.toString()).collect(toList());
-    in.visibleToAll = true;
-    GroupInfo group = gApi.groups().create(in).get();
-
-    // admin can reindex any group
-    setApiUser(admin);
-    gApi.groups().id(group.id).index();
-
-    // group owner can reindex own group (group is owned by itself)
-    setApiUser(groupOwner);
-    gApi.groups().id(group.id).index();
-
-    // user cannot reindex any group
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    exception.expectMessage("not allowed to index group");
-    gApi.groups().id(group.id).index();
-  }
-
-  private void assertAuditEvent(
-      GroupAuditEventInfo info,
-      Type expectedType,
-      Account.Id expectedUser,
-      Account.Id expectedMember) {
-    assertThat(info.user._accountId).isEqualTo(expectedUser.get());
-    assertThat(info.type).isEqualTo(expectedType);
-    assertThat(info).isInstanceOf(UserMemberAuditEventInfo.class);
-    assertThat(((UserMemberAuditEventInfo) info).member._accountId).isEqualTo(expectedMember.get());
-  }
-
-  private void assertAuditEvent(
-      GroupAuditEventInfo info,
-      Type expectedType,
-      Account.Id expectedUser,
-      String expectedMemberGroupName) {
-    assertThat(info.user._accountId).isEqualTo(expectedUser.get());
-    assertThat(info.type).isEqualTo(expectedType);
-    assertThat(info).isInstanceOf(GroupMemberAuditEventInfo.class);
-    assertThat(((GroupMemberAuditEventInfo) info).member.name).isEqualTo(expectedMemberGroupName);
-  }
-
-  private void assertMembers(String group, TestAccount... expectedMembers) throws Exception {
-    assertMembers(
-        gApi.groups().id(group).members(),
-        TestAccount.names(expectedMembers).stream().toArray(String[]::new));
-    assertAccountInfos(Arrays.asList(expectedMembers), gApi.groups().id(group).members());
-  }
-
-  private void assertMembers(Iterable<AccountInfo> members, String... expectedNames) {
-    assertThat(Iterables.transform(members, i -> i.name))
-        .containsExactlyElementsIn(Arrays.asList(expectedNames))
-        .inOrder();
-  }
-
-  private void assertNoMembers(String group) throws Exception {
-    assertThat(gApi.groups().id(group).members()).isEmpty();
-  }
-
-  private void assertIncludes(String group, String... expectedNames) throws Exception {
-    assertIncludes(gApi.groups().id(group).includedGroups(), expectedNames);
-  }
-
-  private static void assertIncludes(Iterable<GroupInfo> includes, String... expectedNames) {
-    assertThat(Iterables.transform(includes, i -> i.name))
-        .containsExactlyElementsIn(Arrays.asList(expectedNames))
-        .inOrder();
-  }
-
-  private void assertNoIncludes(String group) throws Exception {
-    assertThat(gApi.groups().id(group).includedGroups()).isEmpty();
-  }
-
-  private InternalGroup getFromCache(String name) throws Exception {
-    return groupCache.get(new AccountGroup.NameKey(name)).orElse(null);
-  }
-
-  private void setCreatedOnToNull(AccountGroup.UUID groupUuid) throws Exception {
-    groupsUpdateProvider.get().updateGroup(db, groupUuid, group -> group.setCreatedOn(null));
-  }
-
-  private void assertBadRequest(ListRequest req) throws Exception {
-    try {
-      req.get();
-      fail("Expected BadRequestException");
-    } catch (BadRequestException e) {
-      // Expected
-    }
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/plugin/BUILD b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/plugin/BUILD
deleted file mode 100644
index 148fb2a..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/plugin/BUILD
+++ /dev/null
@@ -1,7 +0,0 @@
-load("//gerrit-acceptance-tests:tests.bzl", "acceptance_tests")
-
-acceptance_tests(
-    srcs = glob(["*IT.java"]),
-    group = "api_plugin",
-    labels = ["api"],
-)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/plugin/PluginIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/plugin/PluginIT.java
deleted file mode 100644
index 0fa09af..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/plugin/PluginIT.java
+++ /dev/null
@@ -1,155 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.acceptance.api.plugin;
-
-import static com.google.common.truth.Truth.assertThat;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.stream.Collectors.toList;
-import static org.junit.Assert.fail;
-
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.GerritConfig;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.common.RawInputUtil;
-import com.google.gerrit.extensions.api.plugins.PluginApi;
-import com.google.gerrit.extensions.api.plugins.Plugins.ListRequest;
-import com.google.gerrit.extensions.common.InstallPluginInput;
-import com.google.gerrit.extensions.common.PluginInfo;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.RawInput;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import java.util.List;
-import org.junit.Test;
-
-@NoHttpd
-public class PluginIT extends AbstractDaemonTest {
-  private static final String JS_PLUGIN = "Gerrit.install(function(self){});\n";
-  private static final String HTML_PLUGIN =
-      String.format("<dom-module id=\"test\"><script>%s</script></dom-module>", JS_PLUGIN);
-  private static final RawInput JS_PLUGIN_CONTENT = RawInputUtil.create(JS_PLUGIN.getBytes(UTF_8));
-  private static final RawInput HTML_PLUGIN_CONTENT =
-      RawInputUtil.create(HTML_PLUGIN.getBytes(UTF_8));
-
-  private static final List<String> PLUGINS =
-      ImmutableList.of(
-          "plugin-a.js", "plugin-b.html", "plugin-c.js", "plugin-d.html", "plugin_e.js");
-
-  @Test
-  @GerritConfig(name = "plugins.allowRemoteAdmin", value = "true")
-  public void pluginManagement() throws Exception {
-    // No plugins are loaded
-    assertThat(list().get()).isEmpty();
-    assertThat(list().all().get()).isEmpty();
-
-    PluginApi api;
-    // Install all the plugins
-    InstallPluginInput input = new InstallPluginInput();
-    for (String plugin : PLUGINS) {
-      input.raw = plugin.endsWith(".js") ? JS_PLUGIN_CONTENT : HTML_PLUGIN_CONTENT;
-      api = gApi.plugins().install(plugin, input);
-      assertThat(api).isNotNull();
-      PluginInfo info = api.get();
-      String name = pluginName(plugin);
-      assertThat(info.id).isEqualTo(name);
-      assertThat(info.version).isEqualTo(pluginVersion(plugin));
-      assertThat(info.indexUrl).isEqualTo(String.format("plugins/%s/", name));
-      assertThat(info.filename).isEqualTo(plugin);
-      assertThat(info.disabled).isNull();
-    }
-    assertPlugins(list().get(), PLUGINS);
-
-    // With pagination
-    assertPlugins(list().start(1).limit(2).get(), PLUGINS.subList(1, 3));
-
-    // With prefix
-    assertPlugins(list().prefix("plugin-b").get(), ImmutableList.of("plugin-b.html"));
-    assertPlugins(list().prefix("PLUGIN-").get(), ImmutableList.of());
-
-    // With substring
-    assertPlugins(list().substring("lugin-").get(), PLUGINS.subList(0, PLUGINS.size() - 1));
-    assertPlugins(list().substring("lugin-").start(1).limit(2).get(), PLUGINS.subList(1, 3));
-
-    // With regex
-    assertPlugins(list().regex(".*in-b").get(), ImmutableList.of("plugin-b.html"));
-    assertPlugins(list().regex("plugin-.*").get(), PLUGINS.subList(0, PLUGINS.size() - 1));
-    assertPlugins(list().regex("plugin-.*").start(1).limit(2).get(), PLUGINS.subList(1, 3));
-
-    // Invalid match combinations
-    assertBadRequest(list().regex(".*in-b").substring("a"));
-    assertBadRequest(list().regex(".*in-b").prefix("a"));
-    assertBadRequest(list().substring(".*in-b").prefix("a"));
-
-    // Disable
-    api = gApi.plugins().name("plugin-a");
-    api.disable();
-    api = gApi.plugins().name("plugin-a");
-    assertThat(api.get().disabled).isTrue();
-    assertPlugins(list().get(), PLUGINS.subList(1, PLUGINS.size()));
-    assertPlugins(list().all().get(), PLUGINS);
-
-    // Enable
-    api.enable();
-    api = gApi.plugins().name("plugin-a");
-    assertThat(api.get().disabled).isNull();
-    assertPlugins(list().get(), PLUGINS);
-  }
-
-  @Test
-  public void installNotAllowed() throws Exception {
-    exception.expect(MethodNotAllowedException.class);
-    exception.expectMessage("remote installation is disabled");
-    gApi.plugins().install("test.js", new InstallPluginInput());
-  }
-
-  @Test
-  public void getNonExistingThrowsNotFound() throws Exception {
-    exception.expect(ResourceNotFoundException.class);
-    gApi.plugins().name("does-not-exist");
-  }
-
-  private ListRequest list() throws RestApiException {
-    return gApi.plugins().list();
-  }
-
-  private void assertPlugins(List<PluginInfo> actual, List<String> expected) {
-    List<String> _actual = actual.stream().map(p -> p.id).collect(toList());
-    List<String> _expected = expected.stream().map(p -> pluginName(p)).collect(toList());
-    assertThat(_actual).containsExactlyElementsIn(_expected);
-  }
-
-  private String pluginName(String plugin) {
-    int dot = plugin.indexOf(".");
-    assertThat(dot).isGreaterThan(0);
-    return plugin.substring(0, dot);
-  }
-
-  private String pluginVersion(String plugin) {
-    String name = pluginName(plugin);
-    int dash = name.lastIndexOf("-");
-    return dash > 0 ? name.substring(dash + 1) : "";
-  }
-
-  private void assertBadRequest(ListRequest req) throws Exception {
-    try {
-      req.get();
-      fail("Expected BadRequestException");
-    } catch (BadRequestException e) {
-      // Expected
-    }
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/BUILD b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/BUILD
deleted file mode 100644
index 8be3101..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/BUILD
+++ /dev/null
@@ -1,7 +0,0 @@
-load("//gerrit-acceptance-tests:tests.bzl", "acceptance_tests")
-
-acceptance_tests(
-    srcs = glob(["*IT.java"]),
-    group = "api_project",
-    labels = ["api"],
-)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/CheckAccessIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/CheckAccessIT.java
deleted file mode 100644
index 2f92e7a..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/CheckAccessIT.java
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.acceptance.api.project;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.fail;
-
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.TestAccount;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.config.AccessCheckInfo;
-import com.google.gerrit.extensions.api.config.AccessCheckInput;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.group.InternalGroup;
-import com.google.gerrit.server.group.SystemGroupBackend;
-import java.util.List;
-import org.junit.Before;
-import org.junit.Test;
-
-public class CheckAccessIT extends AbstractDaemonTest {
-
-  private Project.NameKey normalProject;
-  private Project.NameKey secretProject;
-  private Project.NameKey secretRefProject;
-  private TestAccount privilegedUser;
-  private InternalGroup privilegedGroup;
-
-  @Before
-  public void setUp() throws Exception {
-    normalProject = createProject("normal");
-    secretProject = createProject("secret");
-    secretRefProject = createProject("secretRef");
-    privilegedGroup =
-        groupCache.get(new AccountGroup.NameKey(createGroup("privilegedGroup"))).orElse(null);
-
-    privilegedUser = accountCreator.create("privilegedUser", "snowden@nsa.gov", "Ed Snowden");
-    gApi.groups().id(privilegedGroup.getGroupUUID().get()).addMembers(privilegedUser.username);
-
-    assertThat(gApi.groups().id(privilegedGroup.getGroupUUID().get()).members().get(0).email)
-        .contains("snowden");
-
-    grant(secretProject, "refs/*", Permission.READ, false, privilegedGroup.getGroupUUID());
-    block(secretProject, "refs/*", Permission.READ, SystemGroupBackend.REGISTERED_USERS);
-
-    // deny/grant/block arg ordering is screwy.
-    deny(secretRefProject, "refs/*", Permission.READ, SystemGroupBackend.ANONYMOUS_USERS);
-    grant(
-        secretRefProject,
-        "refs/heads/secret/*",
-        Permission.READ,
-        false,
-        privilegedGroup.getGroupUUID());
-    block(
-        secretRefProject,
-        "refs/heads/secret/*",
-        Permission.READ,
-        SystemGroupBackend.REGISTERED_USERS);
-    grant(
-        secretRefProject,
-        "refs/heads/*",
-        Permission.READ,
-        false,
-        SystemGroupBackend.REGISTERED_USERS);
-  }
-
-  @Test
-  public void emptyInput() throws Exception {
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("input requires 'account'");
-    gApi.projects().name(normalProject.get()).checkAccess(new AccessCheckInput());
-  }
-
-  @Test
-  public void nonexistentEmail() throws Exception {
-    exception.expect(UnprocessableEntityException.class);
-    exception.expectMessage("cannot find account doesnotexist@invalid.com");
-    gApi.projects()
-        .name(normalProject.get())
-        .checkAccess(new AccessCheckInput("doesnotexist@invalid.com", null));
-  }
-
-  private static class TestCase {
-    AccessCheckInput input;
-    String project;
-    int want;
-
-    TestCase(String mail, String project, String ref, int want) {
-      this.input = new AccessCheckInput(mail, ref);
-      this.project = project;
-      this.want = want;
-    }
-  }
-
-  @Test
-  public void accessible() throws Exception {
-    List<TestCase> inputs =
-        ImmutableList.of(
-            new TestCase(user.email, normalProject.get(), null, 200),
-            new TestCase(user.email, secretProject.get(), null, 403),
-            new TestCase(user.email, secretRefProject.get(), "refs/heads/secret/master", 403),
-            new TestCase(
-                privilegedUser.email, secretRefProject.get(), "refs/heads/secret/master", 200),
-            new TestCase(privilegedUser.email, normalProject.get(), null, 200),
-            new TestCase(privilegedUser.email, secretProject.get(), null, 200));
-
-    for (TestCase tc : inputs) {
-      String in = newGson().toJson(tc.input);
-      AccessCheckInfo info = null;
-
-      try {
-        info = gApi.projects().name(tc.project).checkAccess(tc.input);
-      } catch (RestApiException e) {
-        fail(String.format("check.access(%s, %s): exception %s", tc.project, in, e));
-      }
-
-      int want = tc.want;
-      if (want != info.status) {
-        fail(
-            String.format("check.access(%s, %s) = %d, want %d", tc.project, in, info.status, want));
-      }
-
-      switch (want) {
-        case 403:
-          assertThat(info.message).contains("cannot see");
-          break;
-        case 404:
-          assertThat(info.message).contains("does not exist");
-          break;
-        case 200:
-          assertThat(info.message).isNull();
-          break;
-        default:
-          fail(String.format("unknown code %d", want));
-      }
-    }
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/CommitIncludedInIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/CommitIncludedInIT.java
deleted file mode 100644
index 7768916..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/CommitIncludedInIT.java
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.acceptance.api.project;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.PushOneCommit.Result;
-import com.google.gerrit.extensions.api.changes.IncludedInInfo;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.api.projects.TagInput;
-import com.google.gerrit.reviewdb.client.Branch;
-import org.eclipse.jgit.lib.ObjectId;
-import org.junit.Test;
-
-@NoHttpd
-public class CommitIncludedInIT extends AbstractDaemonTest {
-  @Test
-  public void includedInOpenChange() throws Exception {
-    Result result = createChange();
-    assertThat(getIncludedIn(result.getCommit().getId()).branches).isEmpty();
-    assertThat(getIncludedIn(result.getCommit().getId()).tags).isEmpty();
-  }
-
-  @Test
-  public void includedInMergedChange() throws Exception {
-    Result result = createChange();
-    gApi.changes()
-        .id(result.getChangeId())
-        .revision(result.getCommit().name())
-        .review(ReviewInput.approve());
-    gApi.changes().id(result.getChangeId()).revision(result.getCommit().name()).submit();
-
-    assertThat(getIncludedIn(result.getCommit().getId()).branches).containsExactly("master");
-    assertThat(getIncludedIn(result.getCommit().getId()).tags).isEmpty();
-
-    grantTagPermissions();
-    gApi.projects().name(result.getChange().project().get()).tag("test-tag").create(new TagInput());
-
-    assertThat(getIncludedIn(result.getCommit().getId()).tags).containsExactly("test-tag");
-
-    createBranch(new Branch.NameKey(project.get(), "test-branch"));
-
-    assertThat(getIncludedIn(result.getCommit().getId()).branches)
-        .containsExactly("master", "test-branch");
-  }
-
-  private IncludedInInfo getIncludedIn(ObjectId id) throws Exception {
-    return gApi.projects().name(project.get()).commit(id.name()).includedIn();
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/DashboardIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/DashboardIT.java
deleted file mode 100644
index b140a6e..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/DashboardIT.java
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.acceptance.api.project;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.projects.BranchInput;
-import com.google.gerrit.extensions.api.projects.DashboardInfo;
-import com.google.gerrit.extensions.api.projects.ProjectApi;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.server.project.DashboardsCollection;
-import java.util.List;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.junit.Before;
-import org.junit.Test;
-
-@NoHttpd
-public class DashboardIT extends AbstractDaemonTest {
-  @Before
-  public void setup() throws Exception {
-    allow("refs/meta/dashboards/*", Permission.CREATE, REGISTERED_USERS);
-  }
-
-  @Test
-  public void defaultDashboardDoesNotExist() throws Exception {
-    exception.expect(ResourceNotFoundException.class);
-    project().defaultDashboard().get();
-  }
-
-  @Test
-  public void dashboardDoesNotExist() throws Exception {
-    exception.expect(ResourceNotFoundException.class);
-    project().dashboard("my:dashboard").get();
-  }
-
-  @Test
-  public void getDashboard() throws Exception {
-    assertThat(dashboards()).isEmpty();
-    DashboardInfo info = createDashboard(DashboardsCollection.DEFAULT_DASHBOARD_NAME, "test");
-    DashboardInfo result = project().dashboard(info.id).get();
-    assertThat(result.id).isEqualTo(info.id);
-    assertThat(result.path).isEqualTo(info.path);
-    assertThat(result.ref).isEqualTo(info.ref);
-    assertThat(result.project).isEqualTo(project.get());
-    assertThat(result.definingProject).isEqualTo(project.get());
-    assertThat(dashboards()).hasSize(1);
-  }
-
-  @Test
-  public void setDefaultDashboard() throws Exception {
-    DashboardInfo info = createDashboard(DashboardsCollection.DEFAULT_DASHBOARD_NAME, "test");
-    assertThat(info.isDefault).isNull();
-    project().dashboard(info.id).setDefault();
-    assertThat(project().dashboard(info.id).get().isDefault).isTrue();
-    assertThat(project().defaultDashboard().get().id).isEqualTo(info.id);
-  }
-
-  @Test
-  public void setDefaultDashboardByProject() throws Exception {
-    DashboardInfo info = createDashboard(DashboardsCollection.DEFAULT_DASHBOARD_NAME, "test");
-    assertThat(info.isDefault).isNull();
-    project().defaultDashboard(info.id);
-    assertThat(project().dashboard(info.id).get().isDefault).isTrue();
-    assertThat(project().defaultDashboard().get().id).isEqualTo(info.id);
-
-    project().removeDefaultDashboard();
-    assertThat(project().dashboard(info.id).get().isDefault).isNull();
-
-    exception.expect(ResourceNotFoundException.class);
-    project().defaultDashboard().get();
-  }
-
-  @Test
-  public void replaceDefaultDashboard() throws Exception {
-    DashboardInfo d1 = createDashboard(DashboardsCollection.DEFAULT_DASHBOARD_NAME, "test1");
-    DashboardInfo d2 = createDashboard(DashboardsCollection.DEFAULT_DASHBOARD_NAME, "test2");
-    assertThat(d1.isDefault).isNull();
-    assertThat(d2.isDefault).isNull();
-    project().dashboard(d1.id).setDefault();
-    assertThat(project().dashboard(d1.id).get().isDefault).isTrue();
-    assertThat(project().dashboard(d2.id).get().isDefault).isNull();
-    assertThat(project().defaultDashboard().get().id).isEqualTo(d1.id);
-    project().dashboard(d2.id).setDefault();
-    assertThat(project().defaultDashboard().get().id).isEqualTo(d2.id);
-    assertThat(project().dashboard(d1.id).get().isDefault).isNull();
-    assertThat(project().dashboard(d2.id).get().isDefault).isTrue();
-  }
-
-  @Test
-  public void cannotGetDashboardWithInheritedForNonDefault() throws Exception {
-    DashboardInfo info = createDashboard(DashboardsCollection.DEFAULT_DASHBOARD_NAME, "test");
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("inherited flag can only be used with default");
-    project().dashboard(info.id).get(true);
-  }
-
-  private List<DashboardInfo> dashboards() throws Exception {
-    return project().dashboards().get();
-  }
-
-  private ProjectApi project() throws RestApiException {
-    return gApi.projects().name(project.get());
-  }
-
-  private DashboardInfo createDashboard(String ref, String path) throws Exception {
-    DashboardInfo info = DashboardsCollection.newDashboardInfo(ref, path);
-    String canonicalRef = DashboardsCollection.normalizeDashboardRef(info.ref);
-    try {
-      project().branch(canonicalRef).create(new BranchInput());
-    } catch (ResourceConflictException e) {
-      // The branch already exists if this method has already been called once.
-      if (!e.getMessage().contains("already exists")) {
-        throw e;
-      }
-    }
-    try (Repository r = repoManager.openRepository(project)) {
-      TestRepository<Repository>.CommitBuilder cb =
-          new TestRepository<>(r).branch(canonicalRef).commit();
-      String content =
-          "[dashboard]\n"
-              + "Description = Test\n"
-              + "foreach = owner:self\n"
-              + "[section \"Mine\"]\n"
-              + "query = is:open";
-      cb.add(info.path, content);
-      RevCommit c = cb.create();
-      project().commit(c.name());
-    }
-    return info;
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/ProjectIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/ProjectIT.java
deleted file mode 100644
index 2c80285..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/ProjectIT.java
+++ /dev/null
@@ -1,462 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.acceptance.api.project;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
-import static com.google.gerrit.server.project.ProjectState.INHERITED_FROM_GLOBAL;
-import static com.google.gerrit.server.project.ProjectState.INHERITED_FROM_PARENT;
-import static com.google.gerrit.server.project.ProjectState.OVERRIDDEN_BY_GLOBAL;
-import static com.google.gerrit.server.project.ProjectState.OVERRIDDEN_BY_PARENT;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.GerritConfig;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.projects.BranchInput;
-import com.google.gerrit.extensions.api.projects.ConfigInfo;
-import com.google.gerrit.extensions.api.projects.ConfigInput;
-import com.google.gerrit.extensions.api.projects.DescriptionInput;
-import com.google.gerrit.extensions.api.projects.ProjectInput;
-import com.google.gerrit.extensions.client.InheritableBoolean;
-import com.google.gerrit.extensions.client.ProjectState;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.junit.Test;
-
-@NoHttpd
-public class ProjectIT extends AbstractDaemonTest {
-
-  @Test
-  public void createProject() throws Exception {
-    String name = name("foo");
-    assertThat(name).isEqualTo(gApi.projects().create(name).get().name);
-
-    RevCommit head = getRemoteHead(name, RefNames.REFS_CONFIG);
-
-    eventRecorder.assertRefUpdatedEvents(name, RefNames.REFS_CONFIG, null, head);
-    eventRecorder.assertNoRefUpdatedEvents(name, "refs/heads/master");
-  }
-
-  @Test
-  public void createProjectWithGitSuffix() throws Exception {
-    String name = name("foo");
-    assertThat(name).isEqualTo(gApi.projects().create(name + ".git").get().name);
-
-    RevCommit head = getRemoteHead(name, RefNames.REFS_CONFIG);
-
-    eventRecorder.assertRefUpdatedEvents(name, RefNames.REFS_CONFIG, null, head);
-    eventRecorder.assertNoRefUpdatedEvents(name, "refs/heads/master");
-  }
-
-  @Test
-  public void createProjectWithInitialCommit() throws Exception {
-    String name = name("foo");
-    ProjectInput input = new ProjectInput();
-    input.name = name;
-    input.createEmptyCommit = true;
-    assertThat(name).isEqualTo(gApi.projects().create(input).get().name);
-
-    RevCommit head = getRemoteHead(name, RefNames.REFS_CONFIG);
-    eventRecorder.assertRefUpdatedEvents(name, RefNames.REFS_CONFIG, null, head);
-
-    head = getRemoteHead(name, "refs/heads/master");
-    eventRecorder.assertRefUpdatedEvents(name, "refs/heads/master", null, head);
-  }
-
-  @Test
-  public void createProjectWithMismatchedInput() throws Exception {
-    ProjectInput in = new ProjectInput();
-    in.name = name("foo");
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("name must match input.name");
-    gApi.projects().name("bar").create(in);
-  }
-
-  @Test
-  public void createProjectNoNameInInput() throws Exception {
-    ProjectInput in = new ProjectInput();
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("input.name is required");
-    gApi.projects().create(in);
-  }
-
-  @Test
-  public void createProjectDuplicate() throws Exception {
-    ProjectInput in = new ProjectInput();
-    in.name = name("baz");
-    gApi.projects().create(in);
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("Project already exists");
-    gApi.projects().create(in);
-  }
-
-  @Test
-  public void createBranch() throws Exception {
-    allow("refs/*", Permission.READ, ANONYMOUS_USERS);
-    gApi.projects().name(project.get()).branch("foo").create(new BranchInput());
-  }
-
-  @Test
-  public void descriptionChangeCausesRefUpdate() throws Exception {
-    RevCommit initialHead = getRemoteHead(project, RefNames.REFS_CONFIG);
-    assertThat(gApi.projects().name(project.get()).description()).isEmpty();
-    DescriptionInput in = new DescriptionInput();
-    in.description = "new project description";
-    gApi.projects().name(project.get()).description(in);
-    assertThat(gApi.projects().name(project.get()).description()).isEqualTo(in.description);
-
-    RevCommit updatedHead = getRemoteHead(project, RefNames.REFS_CONFIG);
-    eventRecorder.assertRefUpdatedEvents(
-        project.get(), RefNames.REFS_CONFIG, initialHead, updatedHead);
-  }
-
-  @Test
-  public void descriptionIsDeletedWhenNotSpecified() throws Exception {
-    assertThat(gApi.projects().name(project.get()).description()).isEmpty();
-    DescriptionInput in = new DescriptionInput();
-    in.description = "new project description";
-    gApi.projects().name(project.get()).description(in);
-    assertThat(gApi.projects().name(project.get()).description()).isEqualTo(in.description);
-    in.description = null;
-    gApi.projects().name(project.get()).description(in);
-    assertThat(gApi.projects().name(project.get()).description()).isEmpty();
-  }
-
-  @Test
-  public void configChangeCausesRefUpdate() throws Exception {
-    RevCommit initialHead = getRemoteHead(project, RefNames.REFS_CONFIG);
-
-    ConfigInfo info = getConfig();
-    assertThat(info.submitType).isEqualTo(SubmitType.MERGE_IF_NECESSARY);
-    ConfigInput input = new ConfigInput();
-    input.submitType = SubmitType.CHERRY_PICK;
-    info = setConfig(input);
-    assertThat(info.submitType).isEqualTo(SubmitType.CHERRY_PICK);
-    info = getConfig();
-    assertThat(info.submitType).isEqualTo(SubmitType.CHERRY_PICK);
-
-    RevCommit updatedHead = getRemoteHead(project, RefNames.REFS_CONFIG);
-    eventRecorder.assertRefUpdatedEvents(
-        project.get(), RefNames.REFS_CONFIG, initialHead, updatedHead);
-  }
-
-  @Test
-  public void setConfig() throws Exception {
-    ConfigInput input = createTestConfigInput();
-    ConfigInfo info = gApi.projects().name(project.get()).config(input);
-    assertThat(info.description).isEqualTo(input.description);
-    assertThat(info.useContributorAgreements.configuredValue)
-        .isEqualTo(input.useContributorAgreements);
-    assertThat(info.useContentMerge.configuredValue).isEqualTo(input.useContentMerge);
-    assertThat(info.useSignedOffBy.configuredValue).isEqualTo(input.useSignedOffBy);
-    assertThat(info.createNewChangeForAllNotInTarget.configuredValue)
-        .isEqualTo(input.createNewChangeForAllNotInTarget);
-    assertThat(info.requireChangeId.configuredValue).isEqualTo(input.requireChangeId);
-    assertThat(info.rejectImplicitMerges.configuredValue).isEqualTo(input.rejectImplicitMerges);
-    assertThat(info.enableReviewerByEmail.configuredValue).isEqualTo(input.enableReviewerByEmail);
-    assertThat(info.createNewChangeForAllNotInTarget.configuredValue)
-        .isEqualTo(input.createNewChangeForAllNotInTarget);
-    assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo(input.maxObjectSizeLimit);
-    assertThat(info.submitType).isEqualTo(input.submitType);
-    assertThat(info.state).isEqualTo(input.state);
-  }
-
-  @Test
-  public void setPartialConfig() throws Exception {
-    ConfigInput input = createTestConfigInput();
-    ConfigInfo info = gApi.projects().name(project.get()).config(input);
-
-    ConfigInput partialInput = new ConfigInput();
-    partialInput.useContributorAgreements = InheritableBoolean.FALSE;
-    info = gApi.projects().name(project.get()).config(partialInput);
-
-    assertThat(info.description).isNull();
-    assertThat(info.useContributorAgreements.configuredValue)
-        .isEqualTo(partialInput.useContributorAgreements);
-    assertThat(info.useContentMerge.configuredValue).isEqualTo(input.useContentMerge);
-    assertThat(info.useSignedOffBy.configuredValue).isEqualTo(input.useSignedOffBy);
-    assertThat(info.createNewChangeForAllNotInTarget.configuredValue)
-        .isEqualTo(input.createNewChangeForAllNotInTarget);
-    assertThat(info.requireChangeId.configuredValue).isEqualTo(input.requireChangeId);
-    assertThat(info.rejectImplicitMerges.configuredValue).isEqualTo(input.rejectImplicitMerges);
-    assertThat(info.enableReviewerByEmail.configuredValue).isEqualTo(input.enableReviewerByEmail);
-    assertThat(info.createNewChangeForAllNotInTarget.configuredValue)
-        .isEqualTo(input.createNewChangeForAllNotInTarget);
-    assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo(input.maxObjectSizeLimit);
-    assertThat(info.submitType).isEqualTo(input.submitType);
-    assertThat(info.state).isEqualTo(input.state);
-  }
-
-  @Test
-  public void nonOwnerCannotSetConfig() throws Exception {
-    ConfigInput input = createTestConfigInput();
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    exception.expectMessage("restricted to project owner");
-    gApi.projects().name(project.get()).config(input);
-  }
-
-  @Test
-  public void maxObjectSizeIsNotSetByDefault() throws Exception {
-    ConfigInfo info = getConfig();
-    assertThat(info.maxObjectSizeLimit.value).isNull();
-    assertThat(info.maxObjectSizeLimit.configuredValue).isNull();
-    assertThat(info.maxObjectSizeLimit.summary).isNull();
-  }
-
-  @Test
-  public void maxObjectSizeCanBeSetAndCleared() throws Exception {
-    // Set a value
-    ConfigInfo info = setMaxObjectSize("100k");
-    assertThat(info.maxObjectSizeLimit.value).isEqualTo("102400");
-    assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo("100k");
-    assertThat(info.maxObjectSizeLimit.summary).isNull();
-
-    // Clear the value
-    info = setMaxObjectSize("0");
-    assertThat(info.maxObjectSizeLimit.value).isNull();
-    assertThat(info.maxObjectSizeLimit.configuredValue).isNull();
-    assertThat(info.maxObjectSizeLimit.summary).isNull();
-  }
-
-  @Test
-  @GerritConfig(name = "receive.inheritProjectMaxObjectSizeLimit", value = "true")
-  public void maxObjectSizeIsInheritedFromParentProject() throws Exception {
-    Project.NameKey child = createProject(name("child"), project);
-
-    ConfigInfo info = setMaxObjectSize("100k");
-    assertThat(info.maxObjectSizeLimit.value).isEqualTo("102400");
-    assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo("100k");
-    assertThat(info.maxObjectSizeLimit.summary).isNull();
-
-    info = getConfig(child);
-    assertThat(info.maxObjectSizeLimit.value).isEqualTo("102400");
-    assertThat(info.maxObjectSizeLimit.configuredValue).isNull();
-    assertThat(info.maxObjectSizeLimit.summary)
-        .isEqualTo(String.format(INHERITED_FROM_PARENT, project));
-  }
-
-  @Test
-  public void maxObjectSizeIsNotInheritedFromParentProject() throws Exception {
-    Project.NameKey child = createProject(name("child"), project);
-
-    ConfigInfo info = setMaxObjectSize("100k");
-    assertThat(info.maxObjectSizeLimit.value).isEqualTo("102400");
-    assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo("100k");
-    assertThat(info.maxObjectSizeLimit.summary).isNull();
-
-    info = getConfig(child);
-    assertThat(info.maxObjectSizeLimit.value).isNull();
-    assertThat(info.maxObjectSizeLimit.configuredValue).isNull();
-    assertThat(info.maxObjectSizeLimit.summary).isNull();
-  }
-
-  @Test
-  public void maxObjectSizeOverridesParentProjectWhenNotSetOnParent() throws Exception {
-    Project.NameKey child = createProject(name("child"), project);
-
-    ConfigInfo info = setMaxObjectSize("0");
-    assertThat(info.maxObjectSizeLimit.value).isNull();
-    assertThat(info.maxObjectSizeLimit.configuredValue).isNull();
-    assertThat(info.maxObjectSizeLimit.summary).isNull();
-
-    info = setMaxObjectSize(child, "100k");
-    assertThat(info.maxObjectSizeLimit.value).isEqualTo("102400");
-    assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo("100k");
-    assertThat(info.maxObjectSizeLimit.summary).isNull();
-  }
-
-  @Test
-  public void maxObjectSizeOverridesParentProjectWhenLower() throws Exception {
-    Project.NameKey child = createProject(name("child"), project);
-
-    ConfigInfo info = setMaxObjectSize("200k");
-    assertThat(info.maxObjectSizeLimit.value).isEqualTo("204800");
-    assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo("200k");
-    assertThat(info.maxObjectSizeLimit.summary).isNull();
-
-    info = setMaxObjectSize(child, "100k");
-    assertThat(info.maxObjectSizeLimit.value).isEqualTo("102400");
-    assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo("100k");
-    assertThat(info.maxObjectSizeLimit.summary).isNull();
-  }
-
-  @Test
-  @GerritConfig(name = "receive.inheritProjectMaxObjectSizeLimit", value = "true")
-  public void maxObjectSizeDoesNotOverrideParentProjectWhenHigher() throws Exception {
-    Project.NameKey child = createProject(name("child"), project);
-
-    ConfigInfo info = setMaxObjectSize("100k");
-    assertThat(info.maxObjectSizeLimit.value).isEqualTo("102400");
-    assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo("100k");
-    assertThat(info.maxObjectSizeLimit.summary).isNull();
-
-    info = setMaxObjectSize(child, "200k");
-    assertThat(info.maxObjectSizeLimit.value).isEqualTo("102400");
-    assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo("200k");
-    assertThat(info.maxObjectSizeLimit.summary)
-        .isEqualTo(String.format(OVERRIDDEN_BY_PARENT, project));
-  }
-
-  @Test
-  @GerritConfig(name = "receive.maxObjectSizeLimit", value = "200k")
-  public void maxObjectSizeIsInheritedFromGlobalConfig() throws Exception {
-    Project.NameKey child = createProject(name("child"), project);
-
-    ConfigInfo info = getConfig();
-    assertThat(info.maxObjectSizeLimit.value).isEqualTo("204800");
-    assertThat(info.maxObjectSizeLimit.configuredValue).isNull();
-    assertThat(info.maxObjectSizeLimit.summary).isEqualTo(INHERITED_FROM_GLOBAL);
-
-    info = getConfig(child);
-    assertThat(info.maxObjectSizeLimit.value).isEqualTo("204800");
-    assertThat(info.maxObjectSizeLimit.configuredValue).isNull();
-    assertThat(info.maxObjectSizeLimit.summary).isEqualTo(INHERITED_FROM_GLOBAL);
-  }
-
-  @Test
-  @GerritConfig(name = "receive.maxObjectSizeLimit", value = "200k")
-  public void maxObjectSizeOverridesGlobalConfigWhenLower() throws Exception {
-    ConfigInfo info = setMaxObjectSize("100k");
-    assertThat(info.maxObjectSizeLimit.value).isEqualTo("102400");
-    assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo("100k");
-    assertThat(info.maxObjectSizeLimit.summary).isNull();
-  }
-
-  @Test
-  @GerritConfig(name = "receive.maxObjectSizeLimit", value = "300k")
-  public void inheritedMaxObjectSizeOverridesGlobalConfigWhenLower() throws Exception {
-    Project.NameKey child = createProject(name("child"), project);
-
-    ConfigInfo info = setMaxObjectSize("200k");
-    assertThat(info.maxObjectSizeLimit.value).isEqualTo("204800");
-    assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo("200k");
-    assertThat(info.maxObjectSizeLimit.summary).isNull();
-
-    info = setMaxObjectSize(child, "100k");
-    assertThat(info.maxObjectSizeLimit.value).isEqualTo("102400");
-    assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo("100k");
-    assertThat(info.maxObjectSizeLimit.summary).isNull();
-  }
-
-  @Test
-  @GerritConfig(name = "receive.maxObjectSizeLimit", value = "200k")
-  @GerritConfig(name = "receive.inheritProjectMaxObjectSizeLimit", value = "true")
-  public void maxObjectSizeDoesNotOverrideGlobalConfigWhenHigher() throws Exception {
-    Project.NameKey child = createProject(name("child"), project);
-
-    ConfigInfo info = setMaxObjectSize("300k");
-    assertThat(info.maxObjectSizeLimit.value).isEqualTo("204800");
-    assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo("300k");
-    assertThat(info.maxObjectSizeLimit.summary).isEqualTo(OVERRIDDEN_BY_GLOBAL);
-
-    info = getConfig(child);
-    assertThat(info.maxObjectSizeLimit.value).isEqualTo("204800");
-    assertThat(info.maxObjectSizeLimit.configuredValue).isNull();
-    assertThat(info.maxObjectSizeLimit.summary).isEqualTo(OVERRIDDEN_BY_GLOBAL);
-  }
-
-  @Test
-  public void invalidMaxObjectSizeIsRejected() throws Exception {
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("100 foo");
-    setMaxObjectSize("100 foo");
-  }
-
-  @Test
-  public void setHead() throws Exception {
-    assertThat(gApi.projects().name(project.get()).head()).isEqualTo("refs/heads/master");
-    gApi.projects().name(project.get()).branch("test1").create(new BranchInput());
-    gApi.projects().name(project.get()).branch("test2").create(new BranchInput());
-    for (String head : new String[] {"test1", "refs/heads/test2"}) {
-      gApi.projects().name(project.get()).head(head);
-      assertThat(gApi.projects().name(project.get()).head()).isEqualTo(RefNames.fullName(head));
-    }
-  }
-
-  @Test
-  public void setHeadToNonexistentBranch() throws Exception {
-    exception.expect(UnprocessableEntityException.class);
-    gApi.projects().name(project.get()).head("does-not-exist");
-  }
-
-  @Test
-  public void setHeadToSameBranch() throws Exception {
-    gApi.projects().name(project.get()).branch("test").create(new BranchInput());
-    for (String head : new String[] {"test", "refs/heads/test"}) {
-      gApi.projects().name(project.get()).head(head);
-      assertThat(gApi.projects().name(project.get()).head()).isEqualTo(RefNames.fullName(head));
-    }
-  }
-
-  @Test
-  public void setHeadNotAllowed() throws Exception {
-    gApi.projects().name(project.get()).branch("test").create(new BranchInput());
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    exception.expectMessage("restricted to project owner");
-    gApi.projects().name(project.get()).head("test");
-  }
-
-  private ConfigInput createTestConfigInput() {
-    ConfigInput input = new ConfigInput();
-    input.description = "some description";
-    input.useContributorAgreements = InheritableBoolean.TRUE;
-    input.useContentMerge = InheritableBoolean.TRUE;
-    input.useSignedOffBy = InheritableBoolean.TRUE;
-    input.createNewChangeForAllNotInTarget = InheritableBoolean.TRUE;
-    input.requireChangeId = InheritableBoolean.TRUE;
-    input.rejectImplicitMerges = InheritableBoolean.TRUE;
-    input.enableReviewerByEmail = InheritableBoolean.TRUE;
-    input.createNewChangeForAllNotInTarget = InheritableBoolean.TRUE;
-    input.maxObjectSizeLimit = "5m";
-    input.submitType = SubmitType.CHERRY_PICK;
-    input.state = ProjectState.HIDDEN;
-    return input;
-  }
-
-  private ConfigInfo setConfig(Project.NameKey name, ConfigInput input) throws Exception {
-    return gApi.projects().name(name.get()).config(input);
-  }
-
-  private ConfigInfo setConfig(ConfigInput input) throws Exception {
-    return setConfig(project, input);
-  }
-
-  private ConfigInfo setMaxObjectSize(String value) throws Exception {
-    return setMaxObjectSize(project, value);
-  }
-
-  private ConfigInfo setMaxObjectSize(Project.NameKey name, String value) throws Exception {
-    ConfigInput input = new ConfigInput();
-    input.maxObjectSizeLimit = value;
-    return setConfig(name, input);
-  }
-
-  private ConfigInfo getConfig(Project.NameKey name) throws Exception {
-    return gApi.projects().name(name.get()).config();
-  }
-
-  private ConfigInfo getConfig() throws Exception {
-    return getConfig(project);
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/BUILD b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/BUILD
deleted file mode 100644
index 4f15ec0..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/BUILD
+++ /dev/null
@@ -1,7 +0,0 @@
-load("//gerrit-acceptance-tests:tests.bzl", "acceptance_tests")
-
-acceptance_tests(
-    srcs = glob(["*IT.java"]),
-    group = "api_revision",
-    labels = ["api"],
-)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RevisionDiffIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RevisionDiffIT.java
deleted file mode 100644
index 2fa55af..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RevisionDiffIT.java
+++ /dev/null
@@ -1,1610 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.acceptance.api.revision;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.TruthJUnit.assume;
-import static com.google.gerrit.extensions.common.DiffInfoSubject.assertThat;
-import static com.google.gerrit.extensions.common.FileInfoSubject.assertThat;
-import static com.google.gerrit.reviewdb.client.Patch.COMMIT_MSG;
-import static java.util.stream.Collectors.joining;
-import static java.util.stream.Collectors.toMap;
-
-import com.google.common.base.Joiner;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.GitUtil;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.acceptance.PushOneCommit.Result;
-import com.google.gerrit.common.RawInputUtil;
-import com.google.gerrit.extensions.api.changes.FileApi;
-import com.google.gerrit.extensions.api.changes.RebaseInput;
-import com.google.gerrit.extensions.common.ChangeType;
-import com.google.gerrit.extensions.common.DiffInfo;
-import com.google.gerrit.extensions.common.FileInfo;
-import com.google.gerrit.extensions.restapi.BinaryResult;
-import com.google.gerrit.testutil.ConfigSuite;
-import java.awt.image.BufferedImage;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.function.Function;
-import java.util.stream.IntStream;
-import javax.imageio.ImageIO;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.junit.Before;
-import org.junit.Test;
-
-public class RevisionDiffIT extends AbstractDaemonTest {
-  // @RunWith(Parameterized.class) can't be used as AbstractDaemonTest is annotated with another
-  // runner. Using different configs is a workaround to achieve the same.
-  private static final String TEST_PARAMETER_MARKER = "test_only_parameter";
-  private static final String CURRENT = "current";
-  private static final String FILE_NAME = "some_file.txt";
-  private static final String FILE_NAME2 = "another_file.txt";
-  private static final String FILE_CONTENT =
-      IntStream.rangeClosed(1, 100)
-          .mapToObj(number -> String.format("Line %d\n", number))
-          .collect(joining());
-  private static final String FILE_CONTENT2 = "1st line\n2nd line\n3rd line\n";
-
-  private boolean intraline;
-  private ObjectId commit1;
-  private String changeId;
-  private String initialPatchSetId;
-
-  @ConfigSuite.Config
-  public static Config intralineConfig() {
-    Config config = new Config();
-    config.setBoolean(TEST_PARAMETER_MARKER, null, "intraline", true);
-    return config;
-  }
-
-  @Before
-  public void setUp() throws Exception {
-    // Reduce flakiness of tests. (If tests aren't fast enough, we would use a fall-back
-    // computation, which might yield different results.)
-    baseConfig.setString("cache", "diff", "timeout", "1 minute");
-    baseConfig.setString("cache", "diff_intraline", "timeout", "1 minute");
-
-    intraline = baseConfig.getBoolean(TEST_PARAMETER_MARKER, "intraline", false);
-
-    ObjectId headCommit = testRepo.getRepository().resolve("HEAD");
-    commit1 =
-        addCommit(headCommit, ImmutableMap.of(FILE_NAME, FILE_CONTENT, FILE_NAME2, FILE_CONTENT2));
-
-    Result result = createEmptyChange();
-    changeId = result.getChangeId();
-    initialPatchSetId = result.getPatchSetId().getId();
-  }
-
-  @Test
-  public void diff() throws Exception {
-    // The assertions assume that intraline is false.
-    assume().that(intraline).isFalse();
-
-    String fileName = "a_new_file.txt";
-    String fileContent = "First line\nSecond line\n";
-    PushOneCommit.Result result = createChange("Add a file", fileName, fileContent);
-    assertDiffForNewFile(result, fileName, fileContent);
-    assertDiffForNewFile(result, COMMIT_MSG, result.getCommit().getFullMessage());
-  }
-
-  @Test
-  public void diffDeletedFile() throws Exception {
-    gApi.changes().id(changeId).edit().deleteFile(FILE_NAME);
-    gApi.changes().id(changeId).edit().publish();
-
-    Map<String, FileInfo> changedFiles = gApi.changes().id(changeId).current().files();
-    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG, FILE_NAME);
-
-    DiffInfo diff = getDiffRequest(changeId, CURRENT, FILE_NAME).get();
-    assertThat(diff.metaA.lines).isEqualTo(100);
-    assertThat(diff.metaB).isNull();
-  }
-
-  @Test
-  public void addedFileIsIncludedInDiff() throws Exception {
-    String newFilePath = "a_new_file.txt";
-    String newFileContent = "arbitrary content";
-    gApi.changes().id(changeId).edit().modifyFile(newFilePath, RawInputUtil.create(newFileContent));
-    gApi.changes().id(changeId).edit().publish();
-
-    Map<String, FileInfo> changedFiles = gApi.changes().id(changeId).current().files();
-    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG, newFilePath);
-  }
-
-  @Test
-  public void renamedFileIsIncludedInDiff() throws Exception {
-    String newFilePath = "a_new_file.txt";
-    gApi.changes().id(changeId).edit().renameFile(FILE_NAME, newFilePath);
-    gApi.changes().id(changeId).edit().publish();
-
-    Map<String, FileInfo> changedFiles = gApi.changes().id(changeId).current().files();
-    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG, newFilePath);
-  }
-
-  @Test
-  public void copiedFileTreatedAsAddedFileInDiff() throws Exception {
-    String copyFilePath = "copy_of_some_file.txt";
-    gApi.changes().id(changeId).edit().modifyFile(copyFilePath, RawInputUtil.create(FILE_CONTENT));
-    gApi.changes().id(changeId).edit().publish();
-
-    Map<String, FileInfo> changedFiles = gApi.changes().id(changeId).current().files();
-    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG, copyFilePath);
-    // If this ever changes, please add tests which cover copied files.
-    assertThat(changedFiles.get(copyFilePath)).status().isEqualTo('A');
-    assertThat(changedFiles.get(copyFilePath)).linesInserted().isEqualTo(100);
-    assertThat(changedFiles.get(copyFilePath)).linesDeleted().isNull();
-  }
-
-  @Test
-  public void addedBinaryFileIsIncludedInDiff() throws Exception {
-    String imageFileName = "an_image.png";
-    byte[] imageBytes = createRgbImage(255, 0, 0);
-    gApi.changes().id(changeId).edit().modifyFile(imageFileName, RawInputUtil.create(imageBytes));
-    gApi.changes().id(changeId).edit().publish();
-
-    Map<String, FileInfo> changedFiles = gApi.changes().id(changeId).current().files();
-    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG, imageFileName);
-  }
-
-  @Test
-  public void modifiedBinaryFileIsIncludedInDiff() throws Exception {
-    String imageFileName = "an_image.png";
-    byte[] imageBytes1 = createRgbImage(255, 100, 0);
-    ObjectId commit2 = addCommit(commit1, imageFileName, imageBytes1);
-
-    rebaseChangeOn(changeId, commit2);
-    byte[] imageBytes2 = createRgbImage(0, 100, 255);
-    gApi.changes().id(changeId).edit().modifyFile(imageFileName, RawInputUtil.create(imageBytes2));
-    gApi.changes().id(changeId).edit().publish();
-
-    Map<String, FileInfo> changedFiles = gApi.changes().id(changeId).current().files();
-    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG, imageFileName);
-  }
-
-  @Test
-  public void diffOnMergeCommitChange() throws Exception {
-    PushOneCommit.Result r = createMergeCommitChange("refs/for/master");
-
-    DiffInfo diff;
-
-    // automerge
-    diff = getDiffRequest(r.getChangeId(), r.getCommit().name(), "foo").get();
-    assertThat(diff.metaA.lines).isEqualTo(5);
-    assertThat(diff.metaB.lines).isEqualTo(1);
-
-    diff = getDiffRequest(r.getChangeId(), r.getCommit().name(), "bar").get();
-    assertThat(diff.metaA.lines).isEqualTo(5);
-    assertThat(diff.metaB.lines).isEqualTo(1);
-
-    // parent 1
-    diff = getDiffRequest(r.getChangeId(), r.getCommit().name(), "bar").withParent(1).get();
-    assertThat(diff.metaA.lines).isEqualTo(1);
-    assertThat(diff.metaB.lines).isEqualTo(1);
-
-    // parent 2
-    diff = getDiffRequest(r.getChangeId(), r.getCommit().name(), "foo").withParent(2).get();
-    assertThat(diff.metaA.lines).isEqualTo(1);
-    assertThat(diff.metaB.lines).isEqualTo(1);
-  }
-
-  @Test
-  public void addedUnrelatedFileIsIgnored_ForPatchSetDiffWithRebase() throws Exception {
-    ObjectId commit2 = addCommit(commit1, "file_added_in_another_commit.txt", "Some file content");
-
-    rebaseChangeOn(changeId, commit2);
-    addModifiedPatchSet(changeId, FILE_NAME, "Another line\n"::concat);
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(initialPatchSetId);
-    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG, FILE_NAME);
-  }
-
-  @Test
-  public void removedUnrelatedFileIsIgnored_ForPatchSetDiffWithRebase() throws Exception {
-    ObjectId commit2 = addCommitRemovingFiles(commit1, FILE_NAME2);
-
-    rebaseChangeOn(changeId, commit2);
-    addModifiedPatchSet(changeId, FILE_NAME, "Another line\n"::concat);
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(initialPatchSetId);
-    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG, FILE_NAME);
-  }
-
-  @Test
-  public void renamedUnrelatedFileIsIgnored_ForPatchSetDiffWithRebase() throws Exception {
-    ObjectId commit2 = addCommitRenamingFile(commit1, FILE_NAME2, "a_new_file_name.txt");
-
-    rebaseChangeOn(changeId, commit2);
-    addModifiedPatchSet(changeId, FILE_NAME, "Another line\n"::concat);
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(initialPatchSetId);
-    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG, FILE_NAME);
-  }
-
-  @Test
-  public void renamedUnrelatedFileIsIgnored_ForPatchSetDiffWithRebase_WhenEquallyModifiedInBoth()
-      throws Exception {
-    Function<String, String> contentModification =
-        fileContent -> fileContent.replace("1st line\n", "First line\n");
-    addModifiedPatchSet(changeId, FILE_NAME2, contentModification);
-    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
-
-    // Revert the modification to be able to rebase.
-    addModifiedPatchSet(
-        changeId, FILE_NAME2, fileContent -> fileContent.replace("First line\n", "1st line\n"));
-
-    String renamedFileName = "renamed_file.txt";
-    ObjectId commit2 = addCommitRenamingFile(commit1, FILE_NAME2, renamedFileName);
-    rebaseChangeOn(changeId, commit2);
-    addModifiedPatchSet(changeId, renamedFileName, contentModification);
-    addModifiedPatchSet(changeId, FILE_NAME, "Another line\n"::concat);
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(previousPatchSetId);
-    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG, FILE_NAME);
-  }
-
-  @Test
-  public void renamedUnrelatedFileIsIgnored_ForPatchSetDiffWithRebase_WhenModifiedDuringRebase()
-      throws Exception {
-    String renamedFilePath = "renamed_some_file.txt";
-    ObjectId commit2 =
-        addCommit(commit1, FILE_NAME, FILE_CONTENT.replace("Line 5\n", "Line five\n"));
-    ObjectId commit3 = addCommitRenamingFile(commit2, FILE_NAME, renamedFilePath);
-
-    rebaseChangeOn(changeId, commit3);
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(initialPatchSetId);
-    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG);
-  }
-
-  @Test
-  public void fileRenamedDuringRebaseSameAsInPatchSetIsIgnored() throws Exception {
-    String renamedFileName = "renamed_file.txt";
-    gApi.changes().id(changeId).edit().renameFile(FILE_NAME, renamedFileName);
-    gApi.changes().id(changeId).edit().publish();
-    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
-
-    // Revert the renaming to be able to rebase.
-    gApi.changes().id(changeId).edit().renameFile(renamedFileName, FILE_NAME);
-    gApi.changes().id(changeId).edit().publish();
-
-    ObjectId commit2 = addCommitRenamingFile(commit1, FILE_NAME, renamedFileName);
-    rebaseChangeOn(changeId, commit2);
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(previousPatchSetId);
-    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG);
-  }
-
-  @Test
-  public void fileWithRebaseHunksRenamedDuringRebaseSameAsInPatchSetIsIgnored() throws Exception {
-    String renamedFileName = "renamed_file.txt";
-    gApi.changes().id(changeId).edit().renameFile(FILE_NAME, renamedFileName);
-    gApi.changes().id(changeId).edit().publish();
-    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
-
-    // Revert the renaming to be able to rebase.
-    gApi.changes().id(changeId).edit().renameFile(renamedFileName, FILE_NAME);
-    gApi.changes().id(changeId).edit().publish();
-
-    ObjectId commit2 =
-        addCommit(commit1, FILE_NAME, FILE_CONTENT.replace("Line 10\n", "Line ten\n"));
-    ObjectId commit3 = addCommitRenamingFile(commit2, FILE_NAME, renamedFileName);
-    rebaseChangeOn(changeId, commit3);
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(previousPatchSetId);
-    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG);
-  }
-
-  @Test
-  public void filesNotTouchedByPatchSetsAndContainingOnlyRebaseHunksAreIgnored() throws Exception {
-    String newFileContent = FILE_CONTENT.replace("Line 10\n", "Line ten\n");
-    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
-    ObjectId commit3 = addCommitRenamingFile(commit2, FILE_NAME2, "a_new_file_name.txt");
-
-    rebaseChangeOn(changeId, commit3);
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(initialPatchSetId);
-    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG);
-  }
-
-  @Test
-  public void filesTouchedByPatchSetsAndContainingOnlyRebaseHunksAreIgnored() throws Exception {
-    addModifiedPatchSet(
-        changeId, FILE_NAME, fileContent -> fileContent.replace("Line 50\n", "Line fifty\n"));
-    addModifiedPatchSet(
-        changeId, FILE_NAME2, fileContent -> fileContent.replace("1st line\n", "First line\n"));
-    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
-    // Revert the modification to allow rebasing.
-    addModifiedPatchSet(
-        changeId, FILE_NAME2, fileContent -> fileContent.replace("First line\n", "1st line\n"));
-
-    String newFileContent = FILE_CONTENT.replace("Line 10\n", "Line ten\n");
-    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
-    String newFilePath = "a_new_file_name.txt";
-    ObjectId commit3 = addCommitRenamingFile(commit2, FILE_NAME2, newFilePath);
-
-    rebaseChangeOn(changeId, commit3);
-    // Apply the modification again to bring the file into the same state as for the previous
-    // patch set.
-    addModifiedPatchSet(
-        changeId, newFilePath, fileContent -> fileContent.replace("1st line\n", "First line\n"));
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(previousPatchSetId);
-    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG);
-  }
-
-  @Test
-  public void rebaseHunksAtStartOfFileAreIdentified() throws Exception {
-    String newFileContent =
-        FILE_CONTENT.replace("Line 1\n", "Line one\n").replace("Line 5\n", "Line five\n");
-    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
-
-    rebaseChangeOn(changeId, commit2);
-    Function<String, String> contentModification =
-        fileContent -> fileContent.replace("Line 50\n", "Line fifty\n");
-    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
-
-    DiffInfo diffInfo =
-        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(initialPatchSetId).get();
-    assertThat(diffInfo).content().element(0).linesOfA().containsExactly("Line 1");
-    assertThat(diffInfo).content().element(0).linesOfB().containsExactly("Line one");
-    assertThat(diffInfo).content().element(0).isDueToRebase();
-    assertThat(diffInfo).content().element(1).commonLines().hasSize(3);
-    assertThat(diffInfo).content().element(2).linesOfA().containsExactly("Line 5");
-    assertThat(diffInfo).content().element(2).linesOfB().containsExactly("Line five");
-    assertThat(diffInfo).content().element(2).isDueToRebase();
-    assertThat(diffInfo).content().element(3).commonLines().hasSize(44);
-    assertThat(diffInfo).content().element(4).linesOfA().containsExactly("Line 50");
-    assertThat(diffInfo).content().element(4).linesOfB().containsExactly("Line fifty");
-    assertThat(diffInfo).content().element(4).isNotDueToRebase();
-    assertThat(diffInfo).content().element(5).commonLines().hasSize(50);
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(initialPatchSetId);
-    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(1);
-    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(1);
-  }
-
-  @Test
-  public void rebaseHunksAtEndOfFileAreIdentified() throws Exception {
-    String newFileContent =
-        FILE_CONTENT
-            .replace("Line 60\n", "Line sixty\n")
-            .replace("Line 100\n", "Line one hundred\n");
-    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
-
-    rebaseChangeOn(changeId, commit2);
-    Function<String, String> contentModification =
-        fileContent -> fileContent.replace("Line 50\n", "Line fifty\n");
-    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
-
-    DiffInfo diffInfo =
-        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(initialPatchSetId).get();
-    assertThat(diffInfo).content().element(0).commonLines().hasSize(49);
-    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 50");
-    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line fifty");
-    assertThat(diffInfo).content().element(1).isNotDueToRebase();
-    assertThat(diffInfo).content().element(2).commonLines().hasSize(9);
-    assertThat(diffInfo).content().element(3).linesOfA().containsExactly("Line 60");
-    assertThat(diffInfo).content().element(3).linesOfB().containsExactly("Line sixty");
-    assertThat(diffInfo).content().element(3).isDueToRebase();
-    assertThat(diffInfo).content().element(4).commonLines().hasSize(39);
-    assertThat(diffInfo).content().element(5).linesOfA().containsExactly("Line 100");
-    assertThat(diffInfo).content().element(5).linesOfB().containsExactly("Line one hundred");
-    assertThat(diffInfo).content().element(5).isDueToRebase();
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(initialPatchSetId);
-    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(1);
-    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(1);
-  }
-
-  @Test
-  public void rebaseHunksInBetweenRegularHunksAreIdentified() throws Exception {
-    String newFileContent =
-        FILE_CONTENT.replace("Line 40\n", "Line forty\n").replace("Line 45\n", "Line forty five\n");
-    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
-
-    rebaseChangeOn(changeId, commit2);
-    Function<String, String> contentModification =
-        fileContent ->
-            fileContent
-                .replace("Line 1\n", "Line one\n")
-                .replace("Line 100\n", "Line one hundred\n");
-    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
-
-    DiffInfo diffInfo =
-        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(initialPatchSetId).get();
-    assertThat(diffInfo).content().element(0).linesOfA().containsExactly("Line 1");
-    assertThat(diffInfo).content().element(0).linesOfB().containsExactly("Line one");
-    assertThat(diffInfo).content().element(0).isNotDueToRebase();
-    assertThat(diffInfo).content().element(1).commonLines().hasSize(38);
-    assertThat(diffInfo).content().element(2).linesOfA().containsExactly("Line 40");
-    assertThat(diffInfo).content().element(2).linesOfB().containsExactly("Line forty");
-    assertThat(diffInfo).content().element(2).isDueToRebase();
-    assertThat(diffInfo).content().element(3).commonLines().hasSize(4);
-    assertThat(diffInfo).content().element(4).linesOfA().containsExactly("Line 45");
-    assertThat(diffInfo).content().element(4).linesOfB().containsExactly("Line forty five");
-    assertThat(diffInfo).content().element(4).isDueToRebase();
-    assertThat(diffInfo).content().element(5).commonLines().hasSize(54);
-    assertThat(diffInfo).content().element(6).linesOfA().containsExactly("Line 100");
-    assertThat(diffInfo).content().element(6).linesOfB().containsExactly("Line one hundred");
-    assertThat(diffInfo).content().element(6).isNotDueToRebase();
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(initialPatchSetId);
-    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(2);
-    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(2);
-  }
-
-  @Test
-  public void rebaseHunkIsIdentifiedWhenMovedDownInPreviousPatchSet() throws Exception {
-    // Move the code down by introducing additional lines (pure insert + enlarging replacement) in
-    // the previous patch set.
-    Function<String, String> contentModification1 =
-        fileContent ->
-            "Line zero\n" + fileContent.replace("Line 10\n", "Line ten\nLine ten and a half\n");
-    addModifiedPatchSet(changeId, FILE_NAME, contentModification1);
-    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
-
-    String newFileContent = FILE_CONTENT.replace("Line 40\n", "Line forty\n");
-    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
-
-    rebaseChangeOn(changeId, commit2);
-    Function<String, String> contentModification2 =
-        fileContent -> fileContent.replace("Line 100\n", "Line one hundred\n");
-    addModifiedPatchSet(changeId, FILE_NAME, contentModification2);
-
-    DiffInfo diffInfo =
-        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(previousPatchSetId).get();
-    assertThat(diffInfo).content().element(0).commonLines().hasSize(41);
-    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 40");
-    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line forty");
-    assertThat(diffInfo).content().element(1).isDueToRebase();
-    assertThat(diffInfo).content().element(2).commonLines().hasSize(59);
-    assertThat(diffInfo).content().element(3).linesOfA().containsExactly("Line 100");
-    assertThat(diffInfo).content().element(3).linesOfB().containsExactly("Line one hundred");
-    assertThat(diffInfo).content().element(3).isNotDueToRebase();
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(previousPatchSetId);
-    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(1);
-    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(1);
-  }
-
-  @Test
-  public void rebaseHunkIsIdentifiedWhenMovedDownInLatestPatchSet() throws Exception {
-    String newFileContent = FILE_CONTENT.replace("Line 40\n", "Line forty\n");
-    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
-
-    rebaseChangeOn(changeId, commit2);
-    // Move the code down by introducing additional lines (pure insert + enlarging replacement) in
-    // the latest patch set.
-    Function<String, String> contentModification =
-        fileContent ->
-            "Line zero\n" + fileContent.replace("Line 10\n", "Line ten\nLine ten and a half\n");
-    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
-
-    DiffInfo diffInfo =
-        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(initialPatchSetId).get();
-    assertThat(diffInfo).content().element(0).linesOfA().isNull();
-    assertThat(diffInfo).content().element(0).linesOfB().containsExactly("Line zero");
-    assertThat(diffInfo).content().element(0).isNotDueToRebase();
-    assertThat(diffInfo).content().element(1).commonLines().hasSize(9);
-    assertThat(diffInfo).content().element(2).linesOfA().containsExactly("Line 10");
-    assertThat(diffInfo)
-        .content()
-        .element(2)
-        .linesOfB()
-        .containsExactly("Line ten", "Line ten and a half");
-    assertThat(diffInfo).content().element(2).isNotDueToRebase();
-    assertThat(diffInfo).content().element(3).commonLines().hasSize(29);
-    assertThat(diffInfo).content().element(4).linesOfA().containsExactly("Line 40");
-    assertThat(diffInfo).content().element(4).linesOfB().containsExactly("Line forty");
-    assertThat(diffInfo).content().element(4).isDueToRebase();
-    assertThat(diffInfo).content().element(5).commonLines().hasSize(60);
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(initialPatchSetId);
-    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(3);
-    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(1);
-  }
-
-  @Test
-  public void rebaseHunkIsIdentifiedWhenMovedUpInPreviousPatchSet() throws Exception {
-    // Move the code up by removing lines (pure deletion + shrinking replacement) in the previous
-    // patch set.
-    Function<String, String> contentModification1 =
-        fileContent ->
-            fileContent.replace("Line 1\n", "").replace("Line 10\nLine 11\n", "Line ten\n");
-    addModifiedPatchSet(changeId, FILE_NAME, contentModification1);
-    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
-
-    String newFileContent = FILE_CONTENT.replace("Line 40\n", "Line forty\n");
-    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
-
-    rebaseChangeOn(changeId, commit2);
-    Function<String, String> contentModification2 =
-        fileContent -> fileContent.replace("Line 100\n", "Line one hundred\n");
-    addModifiedPatchSet(changeId, FILE_NAME, contentModification2);
-
-    DiffInfo diffInfo =
-        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(previousPatchSetId).get();
-    assertThat(diffInfo).content().element(0).commonLines().hasSize(37);
-    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 40");
-    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line forty");
-    assertThat(diffInfo).content().element(1).isDueToRebase();
-    assertThat(diffInfo).content().element(2).commonLines().hasSize(59);
-    assertThat(diffInfo).content().element(3).linesOfA().containsExactly("Line 100");
-    assertThat(diffInfo).content().element(3).linesOfB().containsExactly("Line one hundred");
-    assertThat(diffInfo).content().element(3).isNotDueToRebase();
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(previousPatchSetId);
-    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(1);
-    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(1);
-  }
-
-  @Test
-  public void rebaseHunkIsIdentifiedWhenMovedUpInLatestPatchSet() throws Exception {
-    String newFileContent = FILE_CONTENT.replace("Line 40\n", "Line forty\n");
-    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
-
-    rebaseChangeOn(changeId, commit2);
-    // Move the code up by removing lines (pure deletion + shrinking replacement) in the latest
-    // patch set.
-    Function<String, String> contentModification =
-        fileContent ->
-            fileContent.replace("Line 1\n", "").replace("Line 10\nLine 11\n", "Line ten\n");
-    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
-
-    DiffInfo diffInfo =
-        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(initialPatchSetId).get();
-    assertThat(diffInfo).content().element(0).linesOfA().containsExactly("Line 1");
-    assertThat(diffInfo).content().element(0).linesOfB().isNull();
-    assertThat(diffInfo).content().element(0).isNotDueToRebase();
-    assertThat(diffInfo).content().element(1).commonLines().hasSize(8);
-    assertThat(diffInfo).content().element(2).linesOfA().containsExactly("Line 10", "Line 11");
-    assertThat(diffInfo).content().element(2).linesOfB().containsExactly("Line ten");
-    assertThat(diffInfo).content().element(2).isNotDueToRebase();
-    assertThat(diffInfo).content().element(3).commonLines().hasSize(28);
-    assertThat(diffInfo).content().element(4).linesOfA().containsExactly("Line 40");
-    assertThat(diffInfo).content().element(4).linesOfB().containsExactly("Line forty");
-    assertThat(diffInfo).content().element(4).isDueToRebase();
-    assertThat(diffInfo).content().element(5).commonLines().hasSize(60);
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(initialPatchSetId);
-    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(1);
-    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(3);
-  }
-
-  @Test
-  public void modifiedRebaseHunkWithSameRegionConsideredAsRegularHunk() throws Exception {
-    String newFileContent = FILE_CONTENT.replace("Line 40\n", "Line forty\n");
-    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
-
-    rebaseChangeOn(changeId, commit2);
-    Function<String, String> contentModification =
-        fileContent -> fileContent.replace("Line forty\n", "Line modified after rebase\n");
-    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
-
-    DiffInfo diffInfo =
-        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(initialPatchSetId).get();
-    assertThat(diffInfo).content().element(0).commonLines().hasSize(39);
-    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 40");
-    assertThat(diffInfo)
-        .content()
-        .element(1)
-        .linesOfB()
-        .containsExactly("Line modified after rebase");
-    assertThat(diffInfo).content().element(1).isNotDueToRebase();
-    assertThat(diffInfo).content().element(2).commonLines().hasSize(60);
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(initialPatchSetId);
-    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(1);
-    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(1);
-  }
-
-  @Test
-  public void rebaseHunkOverlappingAtBeginningConsideredAsRegularHunk() throws Exception {
-    String newFileContent =
-        FILE_CONTENT.replace("Line 40\nLine 41\n", "Line forty\nLine forty one\n");
-    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
-
-    rebaseChangeOn(changeId, commit2);
-    Function<String, String> contentModification =
-        fileContent ->
-            fileContent
-                .replace("Line 39\n", "Line thirty nine\n")
-                .replace("Line forty one\n", "Line 41\n");
-    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
-
-    DiffInfo diffInfo =
-        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(initialPatchSetId).get();
-    assertThat(diffInfo).content().element(0).commonLines().hasSize(38);
-    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 39", "Line 40");
-    assertThat(diffInfo)
-        .content()
-        .element(1)
-        .linesOfB()
-        .containsExactly("Line thirty nine", "Line forty");
-    assertThat(diffInfo).content().element(1).isNotDueToRebase();
-    assertThat(diffInfo).content().element(2).commonLines().hasSize(60);
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(initialPatchSetId);
-    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(2);
-    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(2);
-  }
-
-  @Test
-  public void rebaseHunkOverlappingAtEndConsideredAsRegularHunk() throws Exception {
-    String newFileContent =
-        FILE_CONTENT.replace("Line 40\nLine 41\n", "Line forty\nLine forty one\n");
-    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
-
-    rebaseChangeOn(changeId, commit2);
-    Function<String, String> contentModification =
-        fileContent ->
-            fileContent
-                .replace("Line forty\n", "Line 40\n")
-                .replace("Line 42\n", "Line forty two\n");
-    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
-
-    DiffInfo diffInfo =
-        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(initialPatchSetId).get();
-    assertThat(diffInfo).content().element(0).commonLines().hasSize(40);
-    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 41", "Line 42");
-    assertThat(diffInfo)
-        .content()
-        .element(1)
-        .linesOfB()
-        .containsExactly("Line forty one", "Line forty two");
-    assertThat(diffInfo).content().element(1).isNotDueToRebase();
-    assertThat(diffInfo).content().element(2).commonLines().hasSize(58);
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(initialPatchSetId);
-    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(2);
-    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(2);
-  }
-
-  @Test
-  public void rebaseHunkModifiedInsideConsideredAsRegularHunk() throws Exception {
-    String newFileContent =
-        FILE_CONTENT.replace(
-            "Line 39\nLine 40\nLine 41\n", "Line thirty nine\nLine forty\nLine forty one\n");
-    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
-
-    rebaseChangeOn(changeId, commit2);
-    Function<String, String> contentModification =
-        fileContent -> fileContent.replace("Line forty\n", "A different line forty\n");
-    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
-
-    DiffInfo diffInfo =
-        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(initialPatchSetId).get();
-    assertThat(diffInfo).content().element(0).commonLines().hasSize(38);
-    assertThat(diffInfo)
-        .content()
-        .element(1)
-        .linesOfA()
-        .containsExactly("Line 39", "Line 40", "Line 41");
-    assertThat(diffInfo)
-        .content()
-        .element(1)
-        .linesOfB()
-        .containsExactly("Line thirty nine", "A different line forty", "Line forty one");
-    assertThat(diffInfo).content().element(1).isNotDueToRebase();
-    assertThat(diffInfo).content().element(2).commonLines().hasSize(59);
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(initialPatchSetId);
-    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(3);
-    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(3);
-  }
-
-  @Test
-  public void rebaseHunkAfterLineNumberChangingOverlappingHunksIsIdentified() throws Exception {
-    String newFileContent =
-        FILE_CONTENT
-            .replace("Line 40\nLine 41\n", "Line forty\nLine forty one\n")
-            .replace("Line 60\n", "Line sixty\n");
-    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
-
-    rebaseChangeOn(changeId, commit2);
-    Function<String, String> contentModification =
-        fileContent ->
-            fileContent
-                .replace("Line forty\n", "Line 40\n")
-                .replace("Line 42\n", "Line forty two\nLine forty two and a half\n");
-    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
-
-    DiffInfo diffInfo =
-        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(initialPatchSetId).get();
-    assertThat(diffInfo).content().element(0).commonLines().hasSize(40);
-    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 41", "Line 42");
-    assertThat(diffInfo)
-        .content()
-        .element(1)
-        .linesOfB()
-        .containsExactly("Line forty one", "Line forty two", "Line forty two and a half");
-    assertThat(diffInfo).content().element(1).isNotDueToRebase();
-    assertThat(diffInfo).content().element(2).commonLines().hasSize(17);
-    assertThat(diffInfo).content().element(3).linesOfA().containsExactly("Line 60");
-    assertThat(diffInfo).content().element(3).linesOfB().containsExactly("Line sixty");
-    assertThat(diffInfo).content().element(3).isDueToRebase();
-    assertThat(diffInfo).content().element(4).commonLines().hasSize(40);
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(initialPatchSetId);
-    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(3);
-    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(2);
-  }
-
-  @Test
-  public void rebaseHunksOneLineApartFromRegularHunkAreIdentified() throws Exception {
-    String newFileContent =
-        FILE_CONTENT.replace("Line 1\n", "Line one\n").replace("Line 5\n", "Line five\n");
-    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
-
-    rebaseChangeOn(changeId, commit2);
-    Function<String, String> contentModification =
-        fileContent -> fileContent.replace("Line 3\n", "Line three\n");
-    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
-
-    DiffInfo diffInfo =
-        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(initialPatchSetId).get();
-    assertThat(diffInfo).content().element(0).linesOfA().containsExactly("Line 1");
-    assertThat(diffInfo).content().element(0).linesOfB().containsExactly("Line one");
-    assertThat(diffInfo).content().element(0).isDueToRebase();
-    assertThat(diffInfo).content().element(1).commonLines().hasSize(1);
-    assertThat(diffInfo).content().element(2).linesOfA().containsExactly("Line 3");
-    assertThat(diffInfo).content().element(2).linesOfB().containsExactly("Line three");
-    assertThat(diffInfo).content().element(2).isNotDueToRebase();
-    assertThat(diffInfo).content().element(3).commonLines().hasSize(1);
-    assertThat(diffInfo).content().element(4).linesOfA().containsExactly("Line 5");
-    assertThat(diffInfo).content().element(4).linesOfB().containsExactly("Line five");
-    assertThat(diffInfo).content().element(4).isDueToRebase();
-    assertThat(diffInfo).content().element(5).commonLines().hasSize(95);
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(initialPatchSetId);
-    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(1);
-    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(1);
-  }
-
-  @Test
-  public void rebaseHunksDirectlyTouchingHunksOfPatchSetsNotModifiedBetweenThemAreIdentified()
-      throws Exception {
-    // Add to hunks in a patch set and remove them in a further patch set to allow rebasing.
-    Function<String, String> contentModification =
-        fileContent ->
-            fileContent.replace("Line 1\n", "Line one\n").replace("Line 3\n", "Line three\n");
-    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
-    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
-    Function<String, String> reverseContentModification =
-        fileContent ->
-            fileContent.replace("Line one\n", "Line 1\n").replace("Line three\n", "Line 3\n");
-    addModifiedPatchSet(changeId, FILE_NAME, reverseContentModification);
-
-    String newFileContent = FILE_CONTENT.replace("Line 2\n", "Line two\n");
-    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
-    rebaseChangeOn(changeId, commit2);
-
-    // Add the hunks again and modify another line so that we get a diff for the file.
-    // (Files with only edits due to rebase are filtered out.)
-    addModifiedPatchSet(
-        changeId,
-        FILE_NAME,
-        contentModification.andThen(fileContent -> fileContent.replace("Line 10\n", "Line ten\n")));
-
-    DiffInfo diffInfo =
-        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(previousPatchSetId).get();
-    assertThat(diffInfo).content().element(0).commonLines().hasSize(1);
-    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 2");
-    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line two");
-    assertThat(diffInfo).content().element(1).isDueToRebase();
-    assertThat(diffInfo).content().element(2).commonLines().hasSize(7);
-    assertThat(diffInfo).content().element(3).linesOfA().containsExactly("Line 10");
-    assertThat(diffInfo).content().element(3).linesOfB().containsExactly("Line ten");
-    assertThat(diffInfo).content().element(3).isNotDueToRebase();
-    assertThat(diffInfo).content().element(4).commonLines().hasSize(90);
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(previousPatchSetId);
-    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(1);
-    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(1);
-  }
-
-  @Test
-  public void multipleRebaseEditsMixedWithRegularEditsCanBeIdentified() throws Exception {
-    addModifiedPatchSet(
-        changeId,
-        FILE_NAME,
-        fileContent -> fileContent.replace("Line 7\n", "Line seven\n").replace("Line 24\n", ""));
-    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
-
-    ObjectId commit2 =
-        addCommit(
-            commit1,
-            FILE_NAME,
-            FILE_CONTENT
-                .replace("Line 2\n", "Line two\n")
-                .replace("Line 18\nLine 19\n", "Line eighteen\nLine nineteen\n")
-                .replace("Line 50\n", "Line fifty\n"));
-
-    rebaseChangeOn(changeId, commit2);
-    addModifiedPatchSet(
-        changeId,
-        FILE_NAME,
-        fileContent ->
-            fileContent
-                .replace("Line seven\n", "Line 7\n")
-                .replace("Line 9\n", "Line nine\n")
-                .replace("Line 60\n", "Line sixty\n"));
-
-    DiffInfo diffInfo =
-        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(previousPatchSetId).get();
-    assertThat(diffInfo).content().element(0).commonLines().hasSize(1);
-    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 2");
-    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line two");
-    assertThat(diffInfo).content().element(1).isDueToRebase();
-    assertThat(diffInfo).content().element(2).commonLines().hasSize(4);
-    assertThat(diffInfo).content().element(3).linesOfA().containsExactly("Line seven");
-    assertThat(diffInfo).content().element(3).linesOfB().containsExactly("Line 7");
-    assertThat(diffInfo).content().element(3).isNotDueToRebase();
-    assertThat(diffInfo).content().element(4).commonLines().hasSize(1);
-    assertThat(diffInfo).content().element(5).linesOfA().containsExactly("Line 9");
-    assertThat(diffInfo).content().element(5).linesOfB().containsExactly("Line nine");
-    assertThat(diffInfo).content().element(5).isNotDueToRebase();
-    assertThat(diffInfo).content().element(6).commonLines().hasSize(8);
-    assertThat(diffInfo).content().element(7).linesOfA().containsExactly("Line 18", "Line 19");
-    assertThat(diffInfo)
-        .content()
-        .element(7)
-        .linesOfB()
-        .containsExactly("Line eighteen", "Line nineteen");
-    assertThat(diffInfo).content().element(7).isDueToRebase();
-    assertThat(diffInfo).content().element(8).commonLines().hasSize(29);
-    assertThat(diffInfo).content().element(9).linesOfA().containsExactly("Line 50");
-    assertThat(diffInfo).content().element(9).linesOfB().containsExactly("Line fifty");
-    assertThat(diffInfo).content().element(9).isDueToRebase();
-    assertThat(diffInfo).content().element(10).commonLines().hasSize(9);
-    assertThat(diffInfo).content().element(11).linesOfA().containsExactly("Line 60");
-    assertThat(diffInfo).content().element(11).linesOfB().containsExactly("Line sixty");
-    assertThat(diffInfo).content().element(11).isNotDueToRebase();
-    assertThat(diffInfo).content().element(12).commonLines().hasSize(40);
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(previousPatchSetId);
-    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(3);
-    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(3);
-  }
-
-  @Test
-  public void deletedFileDuringRebaseConsideredAsRegularHunkWhenModifiedInDiff() throws Exception {
-    // Modify the file and revert the modifications to allow rebasing.
-    addModifiedPatchSet(
-        changeId, FILE_NAME, fileContent -> fileContent.replace("Line 50\n", "Line fifty\n"));
-    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
-    addModifiedPatchSet(
-        changeId, FILE_NAME, fileContent -> fileContent.replace("Line fifty\n", "Line 50\n"));
-
-    ObjectId commit2 = addCommitRemovingFiles(commit1, FILE_NAME);
-
-    rebaseChangeOn(changeId, commit2);
-
-    DiffInfo diffInfo =
-        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(previousPatchSetId).get();
-    assertThat(diffInfo).changeType().isEqualTo(ChangeType.DELETED);
-    assertThat(diffInfo).content().element(0).linesOfA().hasSize(100);
-    assertThat(diffInfo).content().element(0).linesOfB().isNull();
-    assertThat(diffInfo).content().element(0).isNotDueToRebase();
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(previousPatchSetId);
-    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isNull();
-    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(100);
-  }
-
-  @Test
-  public void addedFileDuringRebaseConsideredAsRegularHunkWhenModifiedInDiff() throws Exception {
-    String newFilePath = "a_new_file.txt";
-    ObjectId commit2 = addCommit(commit1, newFilePath, "1st line\n2nd line\n3rd line\n");
-
-    rebaseChangeOn(changeId, commit2);
-    addModifiedPatchSet(
-        changeId, newFilePath, fileContent -> fileContent.replace("1st line\n", "First line\n"));
-
-    DiffInfo diffInfo =
-        getDiffRequest(changeId, CURRENT, newFilePath).withBase(initialPatchSetId).get();
-    assertThat(diffInfo).changeType().isEqualTo(ChangeType.ADDED);
-    assertThat(diffInfo).content().element(0).linesOfA().isNull();
-    assertThat(diffInfo).content().element(0).linesOfB().hasSize(3);
-    assertThat(diffInfo).content().element(0).isNotDueToRebase();
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(initialPatchSetId);
-    assertThat(changedFiles.get(newFilePath)).linesInserted().isEqualTo(3);
-    assertThat(changedFiles.get(newFilePath)).linesDeleted().isNull();
-  }
-
-  @Test
-  public void rebaseHunkInRenamedFileIsIdentified_WhenFileIsRenamedDuringRebase() throws Exception {
-    String renamedFilePath = "renamed_some_file.txt";
-    ObjectId commit2 =
-        addCommit(commit1, FILE_NAME, FILE_CONTENT.replace("Line 1\n", "Line one\n"));
-    ObjectId commit3 = addCommitRenamingFile(commit2, FILE_NAME, renamedFilePath);
-
-    rebaseChangeOn(changeId, commit3);
-    Function<String, String> contentModification =
-        fileContent -> fileContent.replace("Line 50\n", "Line fifty\n");
-    addModifiedPatchSet(changeId, renamedFilePath, contentModification);
-
-    DiffInfo diffInfo =
-        getDiffRequest(changeId, CURRENT, renamedFilePath).withBase(initialPatchSetId).get();
-    assertThat(diffInfo).content().element(0).linesOfA().containsExactly("Line 1");
-    assertThat(diffInfo).content().element(0).linesOfB().containsExactly("Line one");
-    assertThat(diffInfo).content().element(0).isDueToRebase();
-    assertThat(diffInfo).content().element(1).commonLines().hasSize(48);
-    assertThat(diffInfo).content().element(2).linesOfA().containsExactly("Line 50");
-    assertThat(diffInfo).content().element(2).linesOfB().containsExactly("Line fifty");
-    assertThat(diffInfo).content().element(2).isNotDueToRebase();
-    assertThat(diffInfo).content().element(3).commonLines().hasSize(50);
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(initialPatchSetId);
-    assertThat(changedFiles.get(renamedFilePath)).linesInserted().isEqualTo(1);
-    assertThat(changedFiles.get(renamedFilePath)).linesDeleted().isEqualTo(1);
-  }
-
-  @Test
-  public void rebaseHunkInRenamedFileIsIdentified_WhenFileIsRenamedInPatchSets() throws Exception {
-    String renamedFilePath = "renamed_some_file.txt";
-    gApi.changes().id(changeId).edit().renameFile(FILE_NAME, renamedFilePath);
-    gApi.changes().id(changeId).edit().publish();
-    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
-
-    // Revert the renaming to be able to rebase.
-    gApi.changes().id(changeId).edit().renameFile(renamedFilePath, FILE_NAME);
-    gApi.changes().id(changeId).edit().publish();
-
-    ObjectId commit2 =
-        addCommit(commit1, FILE_NAME, FILE_CONTENT.replace("Line 5\n", "Line five\n"));
-
-    rebaseChangeOn(changeId, commit2);
-    gApi.changes().id(changeId).edit().renameFile(FILE_NAME, renamedFilePath);
-    gApi.changes().id(changeId).edit().publish();
-    Function<String, String> contentModification =
-        fileContent -> fileContent.replace("Line 50\n", "Line fifty\n");
-    addModifiedPatchSet(changeId, renamedFilePath, contentModification);
-
-    DiffInfo diffInfo =
-        getDiffRequest(changeId, CURRENT, renamedFilePath).withBase(previousPatchSetId).get();
-    assertThat(diffInfo).content().element(0).commonLines().hasSize(4);
-    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 5");
-    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line five");
-    assertThat(diffInfo).content().element(1).isDueToRebase();
-    assertThat(diffInfo).content().element(2).commonLines().hasSize(44);
-    assertThat(diffInfo).content().element(3).linesOfA().containsExactly("Line 50");
-    assertThat(diffInfo).content().element(3).linesOfB().containsExactly("Line fifty");
-    assertThat(diffInfo).content().element(3).isNotDueToRebase();
-    assertThat(diffInfo).content().element(4).commonLines().hasSize(50);
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(previousPatchSetId);
-    assertThat(changedFiles.get(renamedFilePath)).linesInserted().isEqualTo(1);
-    assertThat(changedFiles.get(renamedFilePath)).linesDeleted().isEqualTo(1);
-  }
-
-  @Test
-  public void renamedFileWithOnlyRebaseHunksIsIdentified_WhenRenamedBetweenPatchSets()
-      throws Exception {
-    String newFilePath1 = "renamed_some_file.txt";
-    gApi.changes().id(changeId).edit().renameFile(FILE_NAME, newFilePath1);
-    gApi.changes().id(changeId).edit().publish();
-    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
-
-    // Revert the renaming to be able to rebase.
-    gApi.changes().id(changeId).edit().renameFile(newFilePath1, FILE_NAME);
-    gApi.changes().id(changeId).edit().publish();
-
-    ObjectId commit2 =
-        addCommit(commit1, FILE_NAME, FILE_CONTENT.replace("Line 5\n", "Line five\n"));
-
-    rebaseChangeOn(changeId, commit2);
-    String newFilePath2 = "renamed_some_file_to_something_else.txt";
-    gApi.changes().id(changeId).edit().renameFile(FILE_NAME, newFilePath2);
-    gApi.changes().id(changeId).edit().publish();
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(previousPatchSetId);
-    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG, newFilePath2);
-    assertThat(changedFiles.get(newFilePath2)).linesInserted().isNull();
-    assertThat(changedFiles.get(newFilePath2)).linesDeleted().isNull();
-
-    DiffInfo diffInfo =
-        getDiffRequest(changeId, CURRENT, newFilePath2).withBase(previousPatchSetId).get();
-    assertThat(diffInfo).content().element(0).commonLines().hasSize(4);
-    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 5");
-    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line five");
-    assertThat(diffInfo).content().element(1).isDueToRebase();
-    assertThat(diffInfo).content().element(2).commonLines().hasSize(95);
-  }
-
-  @Test
-  public void renamedFileWithOnlyRebaseHunksIsIdentified_WhenRenamedForRebaseAndForPatchSets()
-      throws Exception {
-    String newFilePath1 = "renamed_some_file.txt";
-    gApi.changes().id(changeId).edit().renameFile(FILE_NAME, newFilePath1);
-    gApi.changes().id(changeId).edit().publish();
-    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
-
-    // Revert the renaming to be able to rebase.
-    gApi.changes().id(changeId).edit().renameFile(newFilePath1, FILE_NAME);
-    gApi.changes().id(changeId).edit().publish();
-
-    ObjectId commit2 =
-        addCommit(commit1, FILE_NAME, FILE_CONTENT.replace("Line 5\n", "Line five\n"));
-    String newFilePath2 = "renamed_some_file_during_rebase.txt";
-    ObjectId commit3 = addCommitRenamingFile(commit2, FILE_NAME, newFilePath2);
-
-    rebaseChangeOn(changeId, commit3);
-    String newFilePath3 = "renamed_some_file_to_something_else.txt";
-    gApi.changes().id(changeId).edit().renameFile(newFilePath2, newFilePath3);
-    gApi.changes().id(changeId).edit().publish();
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(previousPatchSetId);
-    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG, newFilePath3);
-    assertThat(changedFiles.get(newFilePath3)).linesInserted().isNull();
-    assertThat(changedFiles.get(newFilePath3)).linesDeleted().isNull();
-
-    DiffInfo diffInfo =
-        getDiffRequest(changeId, CURRENT, newFilePath3).withBase(previousPatchSetId).get();
-    assertThat(diffInfo).content().element(0).commonLines().hasSize(4);
-    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 5");
-    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line five");
-    assertThat(diffInfo).content().element(1).isDueToRebase();
-    assertThat(diffInfo).content().element(2).commonLines().hasSize(95);
-  }
-
-  @Test
-  public void copiedAndRenamedFilesWithOnlyRebaseHunksAreIdentified() throws Exception {
-    String newFileContent = FILE_CONTENT.replace("Line 5\n", "Line five\n");
-    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
-
-    rebaseChangeOn(changeId, commit2);
-    // Copies are only identified by JGit when paired with renaming.
-    String copyFileName = "copy_of_some_file.txt";
-    String renamedFileName = "renamed_some_file.txt";
-    gApi.changes()
-        .id(changeId)
-        .edit()
-        .modifyFile(copyFileName, RawInputUtil.create(newFileContent));
-    gApi.changes().id(changeId).edit().renameFile(FILE_NAME, renamedFileName);
-    gApi.changes().id(changeId).edit().publish();
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(initialPatchSetId);
-    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG, copyFileName, renamedFileName);
-
-    DiffInfo renamedFileDiffInfo =
-        getDiffRequest(changeId, CURRENT, renamedFileName).withBase(initialPatchSetId).get();
-    assertThat(renamedFileDiffInfo).content().element(0).commonLines().hasSize(4);
-    assertThat(renamedFileDiffInfo).content().element(1).linesOfA().containsExactly("Line 5");
-    assertThat(renamedFileDiffInfo).content().element(1).linesOfB().containsExactly("Line five");
-    assertThat(renamedFileDiffInfo).content().element(1).isDueToRebase();
-    assertThat(renamedFileDiffInfo).content().element(2).commonLines().hasSize(95);
-
-    DiffInfo copiedFileDiffInfo =
-        getDiffRequest(changeId, CURRENT, copyFileName).withBase(initialPatchSetId).get();
-    assertThat(copiedFileDiffInfo).content().element(0).commonLines().hasSize(4);
-    assertThat(copiedFileDiffInfo).content().element(1).linesOfA().containsExactly("Line 5");
-    assertThat(copiedFileDiffInfo).content().element(1).linesOfB().containsExactly("Line five");
-    assertThat(copiedFileDiffInfo).content().element(1).isDueToRebase();
-    assertThat(copiedFileDiffInfo).content().element(2).commonLines().hasSize(95);
-  }
-
-  /*
-   *                change PS B
-   *                   |
-   * change PS A    commit4
-   *    |              |
-   * commit2        commit3
-   *    |             /
-   * commit1 --------
-   */
-  @Test
-  public void rebaseHunksWhenRebasingOnAnotherChangeOrPatchSetAreIdentified() throws Exception {
-    ObjectId commit2 =
-        addCommit(commit1, FILE_NAME, FILE_CONTENT.replace("Line 5\n", "Line five\n"));
-    rebaseChangeOn(changeId, commit2);
-    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
-
-    String commit3FileContent = FILE_CONTENT.replace("Line 35\n", "Line thirty five\n");
-    ObjectId commit3 = addCommit(commit1, FILE_NAME, commit3FileContent);
-    ObjectId commit4 =
-        addCommit(commit3, FILE_NAME, commit3FileContent.replace("Line 60\n", "Line sixty\n"));
-
-    rebaseChangeOn(changeId, commit4);
-    Function<String, String> contentModification =
-        fileContent -> fileContent.replace("Line 20\n", "Line twenty\n");
-    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
-
-    DiffInfo diffInfo =
-        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(previousPatchSetId).get();
-    assertThat(diffInfo).content().element(0).commonLines().hasSize(4);
-    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line five");
-    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line 5");
-    assertThat(diffInfo).content().element(1).isDueToRebase();
-    assertThat(diffInfo).content().element(2).commonLines().hasSize(14);
-    assertThat(diffInfo).content().element(3).linesOfA().containsExactly("Line 20");
-    assertThat(diffInfo).content().element(3).linesOfB().containsExactly("Line twenty");
-    assertThat(diffInfo).content().element(3).isNotDueToRebase();
-    assertThat(diffInfo).content().element(4).commonLines().hasSize(14);
-    assertThat(diffInfo).content().element(5).linesOfA().containsExactly("Line 35");
-    assertThat(diffInfo).content().element(5).linesOfB().containsExactly("Line thirty five");
-    assertThat(diffInfo).content().element(5).isDueToRebase();
-    assertThat(diffInfo).content().element(6).commonLines().hasSize(24);
-    assertThat(diffInfo).content().element(7).linesOfA().containsExactly("Line 60");
-    assertThat(diffInfo).content().element(7).linesOfB().containsExactly("Line sixty");
-    assertThat(diffInfo).content().element(7).isDueToRebase();
-    assertThat(diffInfo).content().element(8).commonLines().hasSize(40);
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(previousPatchSetId);
-    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(1);
-    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(1);
-  }
-
-  /*
-   *                change PS B
-   *                   |
-   * change PS A    commit4
-   *    |              |
-   * commit2        commit3
-   *    |             /
-   * commit1 --------
-   */
-  @Test
-  public void unrelatedFileWhenRebasingOnAnotherChangeOrPatchSetIsIgnored() throws Exception {
-    ObjectId commit2 =
-        addCommit(commit1, FILE_NAME, FILE_CONTENT.replace("Line 5\n", "Line five\n"));
-    rebaseChangeOn(changeId, commit2);
-    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
-
-    ObjectId commit3 =
-        addCommit(commit1, FILE_NAME2, FILE_CONTENT2.replace("2nd line\n", "Second line\n"));
-    ObjectId commit4 =
-        addCommit(commit3, FILE_NAME, FILE_CONTENT.replace("Line 60\n", "Line sixty\n"));
-
-    rebaseChangeOn(changeId, commit4);
-    Function<String, String> contentModification =
-        fileContent -> fileContent.replace("Line 20\n", "Line twenty\n");
-    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(previousPatchSetId);
-    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG, FILE_NAME);
-  }
-
-  @Test
-  public void rebaseHunksWhenReversingPatchSetOrderAreIdentified() throws Exception {
-    ObjectId commit2 =
-        addCommit(
-            commit1,
-            FILE_NAME,
-            FILE_CONTENT.replace("Line 5\n", "Line five\n").replace("Line 35\n", ""));
-
-    rebaseChangeOn(changeId, commit2);
-    Function<String, String> contentModification =
-        fileContent -> fileContent.replace("Line 20\n", "Line twenty\n");
-    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
-
-    String currentPatchSetId = gApi.changes().id(changeId).get().currentRevision;
-    DiffInfo diffInfo =
-        getDiffRequest(changeId, initialPatchSetId, FILE_NAME).withBase(currentPatchSetId).get();
-    assertThat(diffInfo).content().element(0).commonLines().hasSize(4);
-    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line five");
-    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line 5");
-    assertThat(diffInfo).content().element(1).isDueToRebase();
-    assertThat(diffInfo).content().element(2).commonLines().hasSize(14);
-    assertThat(diffInfo).content().element(3).linesOfA().containsExactly("Line twenty");
-    assertThat(diffInfo).content().element(3).linesOfB().containsExactly("Line 20");
-    assertThat(diffInfo).content().element(3).isNotDueToRebase();
-    assertThat(diffInfo).content().element(4).commonLines().hasSize(14);
-    assertThat(diffInfo).content().element(5).linesOfA().isNull();
-    assertThat(diffInfo).content().element(5).linesOfB().containsExactly("Line 35");
-    assertThat(diffInfo).content().element(5).isDueToRebase();
-    assertThat(diffInfo).content().element(6).commonLines().hasSize(65);
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).revision(initialPatchSetId).files(currentPatchSetId);
-    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(1);
-    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(1);
-  }
-
-  @Test
-  public void intralineEditsInNonRebaseHunksAreIdentified() throws Exception {
-    assume().that(intraline).isTrue();
-
-    Function<String, String> contentModification =
-        fileContent -> fileContent.replace("Line 1\n", "Line one\n");
-    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
-
-    DiffInfo diffInfo =
-        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(initialPatchSetId).get();
-    assertThat(diffInfo).content().element(0).linesOfA().containsExactly("Line 1");
-    assertThat(diffInfo).content().element(0).linesOfB().containsExactly("Line one");
-    assertThat(diffInfo)
-        .content()
-        .element(0)
-        .intralineEditsOfA()
-        .containsExactly(ImmutableList.of(5, 1));
-    assertThat(diffInfo)
-        .content()
-        .element(0)
-        .intralineEditsOfB()
-        .containsExactly(ImmutableList.of(5, 3));
-    assertThat(diffInfo).content().element(0).isNotDueToRebase();
-    assertThat(diffInfo).content().element(1).commonLines().hasSize(99);
-  }
-
-  @Test
-  public void intralineEditsInRebaseHunksAreIdentified() throws Exception {
-    assume().that(intraline).isTrue();
-
-    String newFileContent = FILE_CONTENT.replace("Line 1\n", "Line one\n");
-    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
-
-    rebaseChangeOn(changeId, commit2);
-    Function<String, String> contentModification =
-        fileContent -> fileContent.replace("Line 50\n", "Line fifty\n");
-    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
-
-    DiffInfo diffInfo =
-        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(initialPatchSetId).get();
-    assertThat(diffInfo).content().element(0).linesOfA().containsExactly("Line 1");
-    assertThat(diffInfo).content().element(0).linesOfB().containsExactly("Line one");
-    assertThat(diffInfo)
-        .content()
-        .element(0)
-        .intralineEditsOfA()
-        .containsExactly(ImmutableList.of(5, 1));
-    assertThat(diffInfo)
-        .content()
-        .element(0)
-        .intralineEditsOfB()
-        .containsExactly(ImmutableList.of(5, 3));
-    assertThat(diffInfo).content().element(0).isDueToRebase();
-    assertThat(diffInfo).content().element(1).commonLines().hasSize(48);
-    assertThat(diffInfo).content().element(2).linesOfA().containsExactly("Line 50");
-    assertThat(diffInfo).content().element(2).linesOfB().containsExactly("Line fifty");
-    assertThat(diffInfo).content().element(2).isNotDueToRebase();
-    assertThat(diffInfo).content().element(3).commonLines().hasSize(50);
-  }
-
-  @Test
-  public void closeNonRebaseHunksAreCombinedForIntralineOptimizations() throws Exception {
-    assume().that(intraline).isTrue();
-
-    String fileContent = FILE_CONTENT.replace("Line 5\n", "{\n");
-    ObjectId commit2 = addCommit(commit1, FILE_NAME, fileContent);
-    rebaseChangeOn(changeId, commit2);
-    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
-
-    addModifiedPatchSet(
-        changeId,
-        FILE_NAME,
-        content -> content.replace("Line 4\n", "Line four\n").replace("Line 6\n", "Line six\n"));
-
-    DiffInfo diffInfo =
-        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(previousPatchSetId).get();
-    assertThat(diffInfo).content().element(0).commonLines().hasSize(3);
-    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 4", "{", "Line 6");
-    assertThat(diffInfo)
-        .content()
-        .element(1)
-        .linesOfB()
-        .containsExactly("Line four", "{", "Line six");
-    assertThat(diffInfo).content().element(1).isNotDueToRebase();
-    assertThat(diffInfo).content().element(2).commonLines().hasSize(94);
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(previousPatchSetId);
-    // Lines which weren't modified but are included in a hunk due to optimization don't count for
-    // the number of inserted/deleted lines.
-    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(2);
-    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(2);
-  }
-
-  @Test
-  public void closeRebaseHunksAreNotCombinedForIntralineOptimizations() throws Exception {
-    assume().that(intraline).isTrue();
-
-    String fileContent = FILE_CONTENT.replace("Line 5\n", "{\n");
-    ObjectId commit2 = addCommit(commit1, FILE_NAME, fileContent);
-    rebaseChangeOn(changeId, commit2);
-    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
-
-    String newFileContent =
-        fileContent.replace("Line 4\n", "Line four\n").replace("Line 6\n", "Line six\n");
-    ObjectId commit3 = addCommit(commit1, FILE_NAME, newFileContent);
-    rebaseChangeOn(changeId, commit3);
-
-    addModifiedPatchSet(
-        changeId, FILE_NAME, content -> content.replace("Line 20\n", "Line twenty\n"));
-
-    DiffInfo diffInfo =
-        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(previousPatchSetId).get();
-    assertThat(diffInfo).content().element(0).commonLines().hasSize(3);
-    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 4");
-    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line four");
-    assertThat(diffInfo).content().element(1).isDueToRebase();
-    assertThat(diffInfo).content().element(2).commonLines().hasSize(1);
-    assertThat(diffInfo).content().element(3).linesOfA().containsExactly("Line 6");
-    assertThat(diffInfo).content().element(3).linesOfB().containsExactly("Line six");
-    assertThat(diffInfo).content().element(3).isDueToRebase();
-    assertThat(diffInfo).content().element(4).commonLines().hasSize(13);
-    assertThat(diffInfo).content().element(5).linesOfA().containsExactly("Line 20");
-    assertThat(diffInfo).content().element(5).linesOfB().containsExactly("Line twenty");
-    assertThat(diffInfo).content().element(5).isNotDueToRebase();
-    assertThat(diffInfo).content().element(6).commonLines().hasSize(80);
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(previousPatchSetId);
-    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(1);
-    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(1);
-  }
-
-  @Test
-  public void closeRebaseAndNonRebaseHunksAreNotCombinedForIntralineOptimizations()
-      throws Exception {
-    assume().that(intraline).isTrue();
-
-    String fileContent = FILE_CONTENT.replace("Line 5\n", "{\n").replace("Line 7\n", "{\n");
-    ObjectId commit2 = addCommit(commit1, FILE_NAME, fileContent);
-    rebaseChangeOn(changeId, commit2);
-    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
-
-    String newFileContent =
-        fileContent.replace("Line 4\n", "Line four\n").replace("Line 8\n", "Line eight\n");
-    ObjectId commit3 = addCommit(commit1, FILE_NAME, newFileContent);
-    rebaseChangeOn(changeId, commit3);
-
-    addModifiedPatchSet(changeId, FILE_NAME, content -> content.replace("Line 6\n", "Line six\n"));
-
-    DiffInfo diffInfo =
-        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(previousPatchSetId).get();
-    assertThat(diffInfo).content().element(0).commonLines().hasSize(3);
-    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 4");
-    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line four");
-    assertThat(diffInfo).content().element(1).isDueToRebase();
-    assertThat(diffInfo).content().element(2).commonLines().hasSize(1);
-    assertThat(diffInfo).content().element(3).linesOfA().containsExactly("Line 6");
-    assertThat(diffInfo).content().element(3).linesOfB().containsExactly("Line six");
-    assertThat(diffInfo).content().element(3).isNotDueToRebase();
-    assertThat(diffInfo).content().element(4).commonLines().hasSize(1);
-    assertThat(diffInfo).content().element(5).linesOfA().containsExactly("Line 8");
-    assertThat(diffInfo).content().element(5).linesOfB().containsExactly("Line eight");
-    assertThat(diffInfo).content().element(5).isDueToRebase();
-    assertThat(diffInfo).content().element(6).commonLines().hasSize(92);
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(previousPatchSetId);
-    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(1);
-    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(1);
-  }
-
-  @Test
-  public void closeNonRebaseHunksNextToRebaseHunksAreCombinedForIntralineOptimizations()
-      throws Exception {
-    assume().that(intraline).isTrue();
-
-    String fileContent = FILE_CONTENT.replace("Line 5\n", "{\n").replace("Line 7\n", "{\n");
-    ObjectId commit2 = addCommit(commit1, FILE_NAME, fileContent);
-    rebaseChangeOn(changeId, commit2);
-    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
-
-    String newFileContent = fileContent.replace("Line 8\n", "Line eight!\n");
-    ObjectId commit3 = addCommit(commit1, FILE_NAME, newFileContent);
-    rebaseChangeOn(changeId, commit3);
-
-    addModifiedPatchSet(
-        changeId,
-        FILE_NAME,
-        content -> content.replace("Line 4\n", "Line four\n").replace("Line 6\n", "Line six\n"));
-
-    DiffInfo diffInfo =
-        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(previousPatchSetId).get();
-    assertThat(diffInfo).content().element(0).commonLines().hasSize(3);
-    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 4", "{", "Line 6");
-    assertThat(diffInfo)
-        .content()
-        .element(1)
-        .linesOfB()
-        .containsExactly("Line four", "{", "Line six");
-    assertThat(diffInfo).content().element(1).isNotDueToRebase();
-    assertThat(diffInfo).content().element(2).commonLines().hasSize(1);
-    assertThat(diffInfo).content().element(3).linesOfA().containsExactly("Line 8");
-    assertThat(diffInfo).content().element(3).linesOfB().containsExactly("Line eight!");
-    assertThat(diffInfo).content().element(3).isDueToRebase();
-    assertThat(diffInfo).content().element(4).commonLines().hasSize(92);
-
-    Map<String, FileInfo> changedFiles =
-        gApi.changes().id(changeId).current().files(previousPatchSetId);
-    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(2);
-    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(2);
-  }
-
-  private void assertDiffForNewFile(
-      PushOneCommit.Result pushResult, String path, String expectedContentSideB) throws Exception {
-    DiffInfo diff =
-        gApi.changes()
-            .id(pushResult.getChangeId())
-            .revision(pushResult.getCommit().name())
-            .file(path)
-            .diff();
-
-    List<String> headers = new ArrayList<>();
-    if (path.equals(COMMIT_MSG)) {
-      RevCommit c = pushResult.getCommit();
-
-      RevCommit parentCommit = c.getParents()[0];
-      String parentCommitId =
-          testRepo.getRevWalk().getObjectReader().abbreviate(parentCommit.getId(), 8).name();
-      headers.add("Parent:     " + parentCommitId + " (" + parentCommit.getShortMessage() + ")");
-
-      SimpleDateFormat dtfmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z", Locale.US);
-      PersonIdent author = c.getAuthorIdent();
-      dtfmt.setTimeZone(author.getTimeZone());
-      headers.add("Author:     " + author.getName() + " <" + author.getEmailAddress() + ">");
-      headers.add("AuthorDate: " + dtfmt.format(author.getWhen().getTime()));
-
-      PersonIdent committer = c.getCommitterIdent();
-      dtfmt.setTimeZone(committer.getTimeZone());
-      headers.add("Commit:     " + committer.getName() + " <" + committer.getEmailAddress() + ">");
-      headers.add("CommitDate: " + dtfmt.format(committer.getWhen().getTime()));
-      headers.add("");
-    }
-
-    if (!headers.isEmpty()) {
-      String header = Joiner.on("\n").join(headers);
-      expectedContentSideB = header + "\n" + expectedContentSideB;
-    }
-
-    assertDiffForNewFile(diff, pushResult.getCommit(), path, expectedContentSideB);
-  }
-
-  private void rebaseChangeOn(String changeId, ObjectId newParent) throws Exception {
-    RebaseInput rebaseInput = new RebaseInput();
-    rebaseInput.base = newParent.getName();
-    gApi.changes().id(changeId).current().rebase(rebaseInput);
-  }
-
-  private ObjectId addCommit(ObjectId parentCommit, String filePath, String fileContent)
-      throws Exception {
-    ImmutableMap<String, String> files = ImmutableMap.of(filePath, fileContent);
-    return addCommit(parentCommit, files);
-  }
-
-  private ObjectId addCommit(ObjectId parentCommit, ImmutableMap<String, String> files)
-      throws Exception {
-    testRepo.reset(parentCommit);
-    PushOneCommit push =
-        pushFactory.create(db, admin.getIdent(), testRepo, "Adjust files of repo", files);
-    PushOneCommit.Result result = push.to("refs/for/master");
-    return result.getCommit();
-  }
-
-  private ObjectId addCommit(ObjectId parentCommit, String filePath, byte[] fileContent)
-      throws Exception {
-    testRepo.reset(parentCommit);
-    PushOneCommit.Result result = createEmptyChange();
-    String changeId = result.getChangeId();
-    gApi.changes().id(changeId).edit().modifyFile(filePath, RawInputUtil.create(fileContent));
-    gApi.changes().id(changeId).edit().publish();
-    String currentRevision = gApi.changes().id(changeId).get().currentRevision;
-    GitUtil.fetch(testRepo, "refs/*:refs/*");
-    return ObjectId.fromString(currentRevision);
-  }
-
-  private ObjectId addCommitRemovingFiles(ObjectId parentCommit, String... removedFilePaths)
-      throws Exception {
-    testRepo.reset(parentCommit);
-    Map<String, String> files =
-        Arrays.stream(removedFilePaths)
-            .collect(toMap(Function.identity(), path -> "Irrelevant content"));
-    PushOneCommit push =
-        pushFactory.create(db, admin.getIdent(), testRepo, "Remove files from repo", files);
-    PushOneCommit.Result result = push.rm("refs/for/master");
-    return result.getCommit();
-  }
-
-  private ObjectId addCommitRenamingFile(
-      ObjectId parentCommit, String oldFilePath, String newFilePath) throws Exception {
-    testRepo.reset(parentCommit);
-    PushOneCommit.Result result = createEmptyChange();
-    String changeId = result.getChangeId();
-    gApi.changes().id(changeId).edit().renameFile(oldFilePath, newFilePath);
-    gApi.changes().id(changeId).edit().publish();
-    String currentRevision = gApi.changes().id(changeId).get().currentRevision;
-    GitUtil.fetch(testRepo, "refs/*:refs/*");
-    return ObjectId.fromString(currentRevision);
-  }
-
-  private Result createEmptyChange() throws Exception {
-    PushOneCommit push =
-        pushFactory.create(db, admin.getIdent(), testRepo, "Test change", ImmutableMap.of());
-    return push.to("refs/for/master");
-  }
-
-  private void addModifiedPatchSet(
-      String changeId, String filePath, Function<String, String> contentModification)
-      throws Exception {
-    try (BinaryResult content = gApi.changes().id(changeId).current().file(filePath).content()) {
-      String newContent = contentModification.apply(content.asString());
-      gApi.changes().id(changeId).edit().modifyFile(filePath, RawInputUtil.create(newContent));
-    }
-    gApi.changes().id(changeId).edit().publish();
-  }
-
-  private static byte[] createRgbImage(int red, int green, int blue) throws IOException {
-    BufferedImage bufferedImage = new BufferedImage(10, 20, BufferedImage.TYPE_INT_RGB);
-    for (int x = 0; x < bufferedImage.getWidth(); x++) {
-      for (int y = 0; y < bufferedImage.getHeight(); y++) {
-        int rgb = (red << 16) + (green << 8) + blue;
-        bufferedImage.setRGB(x, y, rgb);
-      }
-    }
-
-    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
-    ImageIO.write(bufferedImage, "png", byteArrayOutputStream);
-    return byteArrayOutputStream.toByteArray();
-  }
-
-  private FileApi.DiffRequest getDiffRequest(String changeId, String revisionId, String fileName)
-      throws Exception {
-    return gApi.changes()
-        .id(changeId)
-        .revision(revisionId)
-        .file(fileName)
-        .diffRequest()
-        .withIntraline(intraline);
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RevisionIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RevisionIT.java
deleted file mode 100644
index 99f4fef..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RevisionIT.java
+++ /dev/null
@@ -1,1441 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.acceptance.api.revision;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth8.assertThat;
-import static com.google.gerrit.acceptance.PushOneCommit.FILE_CONTENT;
-import static com.google.gerrit.acceptance.PushOneCommit.FILE_NAME;
-import static com.google.gerrit.acceptance.PushOneCommit.PATCH;
-import static com.google.gerrit.acceptance.PushOneCommit.PATCH_FILE_ONLY;
-import static com.google.gerrit.acceptance.PushOneCommit.SUBJECT;
-import static com.google.gerrit.extensions.client.ListChangesOption.DETAILED_LABELS;
-import static com.google.gerrit.reviewdb.client.Patch.COMMIT_MSG;
-import static com.google.gerrit.reviewdb.client.Patch.MERGE_LIST;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.stream.Collectors.toList;
-import static org.eclipse.jgit.lib.Constants.HEAD;
-import static org.junit.Assert.fail;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Iterators;
-import com.google.common.collect.ListMultimap;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.acceptance.RestResponse;
-import com.google.gerrit.acceptance.TestAccount;
-import com.google.gerrit.acceptance.TestProjectInput;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.changes.ChangeApi;
-import com.google.gerrit.extensions.api.changes.CherryPickInput;
-import com.google.gerrit.extensions.api.changes.DraftApi;
-import com.google.gerrit.extensions.api.changes.DraftInput;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.api.changes.NotifyInfo;
-import com.google.gerrit.extensions.api.changes.RecipientType;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.api.changes.ReviewInput.CommentInput;
-import com.google.gerrit.extensions.api.changes.RevisionApi;
-import com.google.gerrit.extensions.api.projects.BranchInput;
-import com.google.gerrit.extensions.client.ChangeStatus;
-import com.google.gerrit.extensions.client.ReviewerState;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.ApprovalInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.ChangeMessageInfo;
-import com.google.gerrit.extensions.common.CommentInfo;
-import com.google.gerrit.extensions.common.CommitInfo;
-import com.google.gerrit.extensions.common.FileInfo;
-import com.google.gerrit.extensions.common.GitPerson;
-import com.google.gerrit.extensions.common.LabelInfo;
-import com.google.gerrit.extensions.common.MergeableInfo;
-import com.google.gerrit.extensions.common.RevisionInfo;
-import com.google.gerrit.extensions.common.WebLinkInfo;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.BinaryResult;
-import com.google.gerrit.extensions.restapi.ETagView;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.extensions.webui.PatchSetWebLink;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.server.change.GetRevisionActions;
-import com.google.gerrit.server.change.RevisionResource;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.inject.Inject;
-import java.io.ByteArrayOutputStream;
-import java.sql.Timestamp;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Optional;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.transport.RefSpec;
-import org.junit.Test;
-
-public class RevisionIT extends AbstractDaemonTest {
-
-  @Inject private GetRevisionActions getRevisionActions;
-  @Inject private DynamicSet<PatchSetWebLink> patchSetLinks;
-
-  @Test
-  public void reviewTriplet() throws Exception {
-    PushOneCommit.Result r = createChange();
-    gApi.changes()
-        .id(project.get() + "~master~" + r.getChangeId())
-        .revision(r.getCommit().name())
-        .review(ReviewInput.approve());
-  }
-
-  @Test
-  public void reviewCurrent() throws Exception {
-    PushOneCommit.Result r = createChange();
-    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve());
-  }
-
-  @Test
-  public void reviewNumber() throws Exception {
-    PushOneCommit.Result r = createChange();
-    gApi.changes().id(r.getChangeId()).revision(1).review(ReviewInput.approve());
-
-    r = updateChange(r, "new content");
-    gApi.changes().id(r.getChangeId()).revision(2).review(ReviewInput.approve());
-  }
-
-  @Test
-  public void submit() throws Exception {
-    PushOneCommit.Result r = createChange();
-    String changeId = project.get() + "~master~" + r.getChangeId();
-    gApi.changes().id(changeId).current().review(ReviewInput.approve());
-    gApi.changes().id(changeId).current().submit();
-    assertThat(gApi.changes().id(changeId).get().status).isEqualTo(ChangeStatus.MERGED);
-  }
-
-  @Test
-  public void postSubmitApproval() throws Exception {
-    PushOneCommit.Result r = createChange();
-    String changeId = project.get() + "~master~" + r.getChangeId();
-    gApi.changes().id(changeId).current().review(ReviewInput.recommend());
-
-    String label = "Code-Review";
-    ApprovalInfo approval = getApproval(changeId, label);
-    assertThat(approval.value).isEqualTo(1);
-    assertThat(approval.postSubmit).isNull();
-
-    // Submit by direct push.
-    git().push().setRefSpecs(new RefSpec(r.getCommit().name() + ":refs/heads/master")).call();
-    assertThat(gApi.changes().id(changeId).get().status).isEqualTo(ChangeStatus.MERGED);
-
-    approval = getApproval(changeId, label);
-    assertThat(approval.value).isEqualTo(1);
-    assertThat(approval.postSubmit).isNull();
-    assertPermitted(gApi.changes().id(changeId).get(DETAILED_LABELS), "Code-Review", 1, 2);
-
-    // Repeating the current label is allowed. Does not flip the postSubmit bit
-    // due to deduplication codepath.
-    gApi.changes().id(changeId).current().review(ReviewInput.recommend());
-    approval = getApproval(changeId, label);
-    assertThat(approval.value).isEqualTo(1);
-    assertThat(approval.postSubmit).isNull();
-
-    // Reducing vote is not allowed.
-    try {
-      gApi.changes().id(changeId).current().review(ReviewInput.dislike());
-      fail("expected ResourceConflictException");
-    } catch (ResourceConflictException e) {
-      assertThat(e)
-          .hasMessageThat()
-          .isEqualTo("Cannot reduce vote on labels for closed change: Code-Review");
-    }
-    approval = getApproval(changeId, label);
-    assertThat(approval.value).isEqualTo(1);
-    assertThat(approval.postSubmit).isNull();
-
-    // Increasing vote is allowed.
-    gApi.changes().id(changeId).current().review(ReviewInput.approve());
-    approval = getApproval(changeId, label);
-    assertThat(approval.value).isEqualTo(2);
-    assertThat(approval.postSubmit).isTrue();
-    assertPermitted(gApi.changes().id(changeId).get(DETAILED_LABELS), "Code-Review", 2);
-
-    // Decreasing to previous post-submit vote is still not allowed.
-    try {
-      gApi.changes().id(changeId).current().review(ReviewInput.dislike());
-      fail("expected ResourceConflictException");
-    } catch (ResourceConflictException e) {
-      assertThat(e)
-          .hasMessageThat()
-          .isEqualTo("Cannot reduce vote on labels for closed change: Code-Review");
-    }
-    approval = getApproval(changeId, label);
-    assertThat(approval.value).isEqualTo(2);
-    assertThat(approval.postSubmit).isTrue();
-  }
-
-  @Test
-  public void postSubmitApprovalAfterVoteRemoved() throws Exception {
-    PushOneCommit.Result r = createChange();
-    String changeId = project.get() + "~master~" + r.getChangeId();
-
-    setApiUser(admin);
-    revision(r).review(ReviewInput.approve());
-
-    setApiUser(user);
-    revision(r).review(ReviewInput.recommend());
-
-    setApiUser(admin);
-    gApi.changes().id(changeId).reviewer(user.username).deleteVote("Code-Review");
-    Optional<ApprovalInfo> crUser =
-        get(changeId, DETAILED_LABELS).labels.get("Code-Review").all.stream()
-            .filter(a -> a._accountId == user.id.get())
-            .findFirst();
-    assertThat(crUser).isPresent();
-    assertThat(crUser.get().value).isEqualTo(0);
-
-    revision(r).submit();
-
-    setApiUser(user);
-    ReviewInput in = new ReviewInput();
-    in.label("Code-Review", 1);
-    in.message = "Still LGTM";
-    revision(r).review(in);
-
-    ApprovalInfo cr =
-        gApi.changes().id(changeId).get(DETAILED_LABELS).labels.get("Code-Review").all.stream()
-            .filter(a -> a._accountId == user.getId().get())
-            .findFirst()
-            .get();
-    assertThat(cr.postSubmit).isTrue();
-  }
-
-  @Test
-  public void postSubmitDeleteApprovalNotAllowed() throws Exception {
-    PushOneCommit.Result r = createChange();
-
-    revision(r).review(ReviewInput.approve());
-    revision(r).submit();
-
-    ReviewInput in = new ReviewInput();
-    in.label("Code-Review", 0);
-
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("Cannot reduce vote on labels for closed change: Code-Review");
-    revision(r).review(in);
-  }
-
-  @TestProjectInput(submitType = SubmitType.CHERRY_PICK)
-  @Test
-  public void approvalCopiedDuringSubmitIsNotPostSubmit() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getChange().getId();
-    gApi.changes().id(id.get()).current().review(ReviewInput.approve());
-    gApi.changes().id(id.get()).current().submit();
-
-    ChangeData cd = r.getChange();
-    assertThat(cd.patchSets()).hasSize(2);
-    PatchSetApproval psa =
-        Iterators.getOnlyElement(
-            cd.currentApprovals().stream().filter(a -> !a.isLegacySubmit()).iterator());
-    assertThat(psa.getPatchSetId().get()).isEqualTo(2);
-    assertThat(psa.getLabel()).isEqualTo("Code-Review");
-    assertThat(psa.getValue()).isEqualTo(2);
-    assertThat(psa.isPostSubmit()).isFalse();
-  }
-
-  @Test
-  public void voteOnAbandonedChange() throws Exception {
-    PushOneCommit.Result r = createChange();
-    gApi.changes().id(r.getChangeId()).abandon();
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("change is closed");
-    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.reject());
-  }
-
-  @Test
-  public void voteNotAllowedWithoutPermission() throws Exception {
-    PushOneCommit.Result r = createChange();
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    exception.expectMessage("is restricted");
-    gApi.changes().id(r.getChange().getId().get()).current().review(ReviewInput.approve());
-  }
-
-  @Test
-  public void cherryPick() throws Exception {
-    PushOneCommit.Result r = pushTo("refs/for/master%topic=someTopic");
-    CherryPickInput in = new CherryPickInput();
-    in.destination = "foo";
-    in.message = "it goes to stable branch";
-    gApi.projects().name(project.get()).branch(in.destination).create(new BranchInput());
-    ChangeApi orig = gApi.changes().id(project.get() + "~master~" + r.getChangeId());
-
-    assertThat(orig.get().messages).hasSize(1);
-    ChangeApi cherry = orig.revision(r.getCommit().name()).cherryPick(in);
-
-    ChangeInfo changeInfoWithDetails =
-        gApi.changes().id(project.get() + "~master~" + r.getChangeId()).get();
-    Collection<ChangeMessageInfo> messages = changeInfoWithDetails.messages;
-    assertThat(messages).hasSize(2);
-
-    String cherryPickedRevision = cherry.get().currentRevision;
-    String expectedMessage =
-        String.format(
-            "Patch Set 1: Cherry Picked\n\n"
-                + "This patchset was cherry picked to branch %s as commit %s",
-            in.destination, cherryPickedRevision);
-
-    Iterator<ChangeMessageInfo> origIt = messages.iterator();
-    origIt.next();
-    assertThat(origIt.next().message).isEqualTo(expectedMessage);
-
-    ChangeInfo cherryPickChangeInfoWithDetails = cherry.get();
-    assertThat(cherryPickChangeInfoWithDetails.workInProgress).isNull();
-    assertThat(cherryPickChangeInfoWithDetails.messages).hasSize(1);
-    Iterator<ChangeMessageInfo> cherryIt = cherryPickChangeInfoWithDetails.messages.iterator();
-    expectedMessage = "Patch Set 1: Cherry Picked from branch master.";
-    assertThat(cherryIt.next().message).isEqualTo(expectedMessage);
-
-    assertThat(cherry.get().subject).contains(in.message);
-    assertThat(cherry.get().topic).isEqualTo("someTopic-foo");
-    cherry.current().review(ReviewInput.approve());
-    cherry.current().submit();
-  }
-
-  @Test
-  public void cherryPickSetChangeId() throws Exception {
-    PushOneCommit.Result r = pushTo("refs/for/master");
-    CherryPickInput in = new CherryPickInput();
-    in.destination = "foo";
-    String id = "Ideadbeefdeadbeefdeadbeefdeadbeefdeadbe3f";
-    in.message = "it goes to foo branch\n\nChange-Id: " + id;
-
-    gApi.projects().name(project.get()).branch(in.destination).create(new BranchInput());
-    ChangeApi orig = gApi.changes().id(project.get() + "~master~" + r.getChangeId());
-
-    assertThat(orig.get().messages).hasSize(1);
-    ChangeApi cherry = orig.revision(r.getCommit().name()).cherryPick(in);
-
-    ChangeInfo changeInfo = cherry.get();
-
-    // The cherry-pick honors the ChangeId specified in the input message:
-    RevisionInfo revInfo = changeInfo.revisions.get(changeInfo.currentRevision);
-    assertThat(revInfo).isNotNull();
-    assertThat(revInfo.commit.message).endsWith(id + "\n");
-  }
-
-  @Test
-  public void cherryPickwithNoTopic() throws Exception {
-    PushOneCommit.Result r = pushTo("refs/for/master");
-    CherryPickInput in = new CherryPickInput();
-    in.destination = "foo";
-    in.message = "it goes to stable branch";
-    gApi.projects().name(project.get()).branch(in.destination).create(new BranchInput());
-    ChangeApi orig = gApi.changes().id(project.get() + "~master~" + r.getChangeId());
-
-    ChangeApi cherry = orig.revision(r.getCommit().name()).cherryPick(in);
-    assertThat(cherry.get().topic).isNull();
-    cherry.current().review(ReviewInput.approve());
-    cherry.current().submit();
-  }
-
-  @Test
-  public void cherryPickWorkInProgressChange() throws Exception {
-    PushOneCommit.Result r = pushTo("refs/for/master%wip");
-    CherryPickInput in = new CherryPickInput();
-    in.destination = "foo";
-    in.message = "cherry pick message";
-    gApi.projects().name(project.get()).branch(in.destination).create(new BranchInput());
-    ChangeApi orig = gApi.changes().id(project.get() + "~master~" + r.getChangeId());
-
-    ChangeApi cherry = orig.revision(r.getCommit().name()).cherryPick(in);
-    assertThat(cherry.get().workInProgress).isTrue();
-  }
-
-  @Test
-  public void cherryPickToSameBranch() throws Exception {
-    PushOneCommit.Result r = createChange();
-    CherryPickInput in = new CherryPickInput();
-    in.destination = "master";
-    in.message = "it generates a new patch set\n\nChange-Id: " + r.getChangeId();
-    ChangeInfo cherryInfo =
-        gApi.changes()
-            .id(project.get() + "~master~" + r.getChangeId())
-            .revision(r.getCommit().name())
-            .cherryPick(in)
-            .get();
-    assertThat(cherryInfo.messages).hasSize(2);
-    Iterator<ChangeMessageInfo> cherryIt = cherryInfo.messages.iterator();
-    assertThat(cherryIt.next().message).isEqualTo("Uploaded patch set 1.");
-    assertThat(cherryIt.next().message).isEqualTo("Uploaded patch set 2.");
-  }
-
-  @Test
-  public void cherryPickToSameBranchWithRebase() throws Exception {
-    // Push a new change, then merge it
-    PushOneCommit.Result baseChange = createChange();
-    String triplet = project.get() + "~master~" + baseChange.getChangeId();
-    RevisionApi baseRevision = gApi.changes().id(triplet).current();
-    baseRevision.review(ReviewInput.approve());
-    baseRevision.submit();
-
-    // Push a new change (change 1)
-    PushOneCommit.Result r1 = createChange();
-
-    // Push another new change (change 2)
-    String subject = "Test change\n\nChange-Id: Ideadbeefdeadbeefdeadbeefdeadbeefdeadbeef";
-    PushOneCommit push =
-        pushFactory.create(
-            db, admin.getIdent(), testRepo, subject, "another_file.txt", "another content");
-    PushOneCommit.Result r2 = push.to("refs/for/master");
-
-    // Change 2's parent should be change 1
-    assertThat(r2.getCommit().getParents()[0].name()).isEqualTo(r1.getCommit().name());
-
-    // Cherry pick change 2 onto the same branch
-    triplet = project.get() + "~master~" + r2.getChangeId();
-    ChangeApi orig = gApi.changes().id(triplet);
-    CherryPickInput in = new CherryPickInput();
-    in.destination = "master";
-    in.message = subject;
-    ChangeApi cherry = orig.revision(r2.getCommit().name()).cherryPick(in);
-    ChangeInfo cherryInfo = cherry.get();
-    assertThat(cherryInfo.messages).hasSize(2);
-    Iterator<ChangeMessageInfo> cherryIt = cherryInfo.messages.iterator();
-    assertThat(cherryIt.next().message).isEqualTo("Uploaded patch set 1.");
-    assertThat(cherryIt.next().message).isEqualTo("Uploaded patch set 2.");
-
-    // Parent of change 2 should now be the change that was merged, i.e.
-    // change 2 is rebased onto the head of the master branch.
-    String newParent =
-        cherryInfo.revisions.get(cherryInfo.currentRevision).commit.parents.get(0).commit;
-    assertThat(newParent).isEqualTo(baseChange.getCommit().name());
-  }
-
-  @Test
-  public void cherryPickIdenticalTree() throws Exception {
-    PushOneCommit.Result r = createChange();
-    CherryPickInput in = new CherryPickInput();
-    in.destination = "foo";
-    in.message = "it goes to stable branch";
-    gApi.projects().name(project.get()).branch(in.destination).create(new BranchInput());
-    ChangeApi orig = gApi.changes().id(project.get() + "~master~" + r.getChangeId());
-
-    assertThat(orig.get().messages).hasSize(1);
-    ChangeApi cherry = orig.revision(r.getCommit().name()).cherryPick(in);
-
-    Collection<ChangeMessageInfo> messages =
-        gApi.changes().id(project.get() + "~master~" + r.getChangeId()).get().messages;
-    assertThat(messages).hasSize(2);
-
-    assertThat(cherry.get().subject).contains(in.message);
-    cherry.current().review(ReviewInput.approve());
-    cherry.current().submit();
-
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("Cherry pick failed: identical tree");
-    orig.revision(r.getCommit().name()).cherryPick(in);
-  }
-
-  @Test
-  public void cherryPickConflict() throws Exception {
-    PushOneCommit.Result r = createChange();
-    CherryPickInput in = new CherryPickInput();
-    in.destination = "foo";
-    in.message = "it goes to stable branch";
-    gApi.projects().name(project.get()).branch(in.destination).create(new BranchInput());
-
-    PushOneCommit push =
-        pushFactory.create(
-            db,
-            admin.getIdent(),
-            testRepo,
-            PushOneCommit.SUBJECT,
-            PushOneCommit.FILE_NAME,
-            "another content");
-    push.to("refs/heads/foo");
-
-    String triplet = project.get() + "~master~" + r.getChangeId();
-    ChangeApi orig = gApi.changes().id(triplet);
-    assertThat(orig.get().messages).hasSize(1);
-
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("Cherry pick failed: merge conflict");
-    orig.revision(r.getCommit().name()).cherryPick(in);
-  }
-
-  @Test
-  public void cherryPickToExistingChange() throws Exception {
-    PushOneCommit.Result r1 =
-        pushFactory
-            .create(db, admin.getIdent(), testRepo, SUBJECT, FILE_NAME, "a")
-            .to("refs/for/master");
-    String t1 = project.get() + "~master~" + r1.getChangeId();
-
-    BranchInput bin = new BranchInput();
-    bin.revision = r1.getCommit().getParent(0).name();
-    gApi.projects().name(project.get()).branch("foo").create(bin);
-
-    PushOneCommit.Result r2 =
-        pushFactory
-            .create(db, admin.getIdent(), testRepo, SUBJECT, FILE_NAME, "b", r1.getChangeId())
-            .to("refs/for/foo");
-    String t2 = project.get() + "~foo~" + r2.getChangeId();
-    gApi.changes().id(t2).abandon();
-
-    CherryPickInput in = new CherryPickInput();
-    in.destination = "foo";
-    in.message = r1.getCommit().getFullMessage();
-    try {
-      gApi.changes().id(t1).current().cherryPick(in);
-      fail();
-    } catch (ResourceConflictException e) {
-      assertThat(e.getMessage())
-          .isEqualTo(
-              "Cannot create new patch set of change "
-                  + info(t2)._number
-                  + " because it is abandoned");
-    }
-
-    gApi.changes().id(t2).restore();
-    gApi.changes().id(t1).current().cherryPick(in);
-    assertThat(get(t2).revisions).hasSize(2);
-    assertThat(gApi.changes().id(t2).current().file(FILE_NAME).content().asString()).isEqualTo("a");
-  }
-
-  @Test
-  public void cherryPickMergeRelativeToDefaultParent() throws Exception {
-    String parent1FileName = "a.txt";
-    String parent2FileName = "b.txt";
-    PushOneCommit.Result mergeChangeResult =
-        createCherryPickableMerge(parent1FileName, parent2FileName);
-
-    String cherryPickBranchName = "branch_for_cherry_pick";
-    createBranch(new Branch.NameKey(project, cherryPickBranchName));
-
-    CherryPickInput cherryPickInput = new CherryPickInput();
-    cherryPickInput.destination = cherryPickBranchName;
-    cherryPickInput.message = "Cherry-pick a merge commit to another branch";
-
-    ChangeInfo cherryPickedChangeInfo =
-        gApi.changes()
-            .id(mergeChangeResult.getChangeId())
-            .current()
-            .cherryPick(cherryPickInput)
-            .get();
-
-    Map<String, FileInfo> cherryPickedFilesByName =
-        cherryPickedChangeInfo.revisions.get(cherryPickedChangeInfo.currentRevision).files;
-    assertThat(cherryPickedFilesByName).containsKey(parent2FileName);
-    assertThat(cherryPickedFilesByName).doesNotContainKey(parent1FileName);
-  }
-
-  @Test
-  public void cherryPickMergeRelativeToSpecificParent() throws Exception {
-    String parent1FileName = "a.txt";
-    String parent2FileName = "b.txt";
-    PushOneCommit.Result mergeChangeResult =
-        createCherryPickableMerge(parent1FileName, parent2FileName);
-
-    String cherryPickBranchName = "branch_for_cherry_pick";
-    createBranch(new Branch.NameKey(project, cherryPickBranchName));
-
-    CherryPickInput cherryPickInput = new CherryPickInput();
-    cherryPickInput.destination = cherryPickBranchName;
-    cherryPickInput.message = "Cherry-pick a merge commit to another branch";
-    cherryPickInput.parent = 2;
-
-    ChangeInfo cherryPickedChangeInfo =
-        gApi.changes()
-            .id(mergeChangeResult.getChangeId())
-            .current()
-            .cherryPick(cherryPickInput)
-            .get();
-
-    Map<String, FileInfo> cherryPickedFilesByName =
-        cherryPickedChangeInfo.revisions.get(cherryPickedChangeInfo.currentRevision).files;
-    assertThat(cherryPickedFilesByName).containsKey(parent1FileName);
-    assertThat(cherryPickedFilesByName).doesNotContainKey(parent2FileName);
-  }
-
-  @Test
-  public void cherryPickMergeUsingInvalidParent() throws Exception {
-    String parent1FileName = "a.txt";
-    String parent2FileName = "b.txt";
-    PushOneCommit.Result mergeChangeResult =
-        createCherryPickableMerge(parent1FileName, parent2FileName);
-
-    String cherryPickBranchName = "branch_for_cherry_pick";
-    createBranch(new Branch.NameKey(project, cherryPickBranchName));
-
-    CherryPickInput cherryPickInput = new CherryPickInput();
-    cherryPickInput.destination = cherryPickBranchName;
-    cherryPickInput.message = "Cherry-pick a merge commit to another branch";
-    cherryPickInput.parent = 0;
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage(
-        "Cherry Pick: Parent 0 does not exist. Please specify a parent in range [1, 2].");
-    gApi.changes().id(mergeChangeResult.getChangeId()).current().cherryPick(cherryPickInput);
-  }
-
-  @Test
-  public void cherryPickMergeUsingNonExistentParent() throws Exception {
-    String parent1FileName = "a.txt";
-    String parent2FileName = "b.txt";
-    PushOneCommit.Result mergeChangeResult =
-        createCherryPickableMerge(parent1FileName, parent2FileName);
-
-    String cherryPickBranchName = "branch_for_cherry_pick";
-    createBranch(new Branch.NameKey(project, cherryPickBranchName));
-
-    CherryPickInput cherryPickInput = new CherryPickInput();
-    cherryPickInput.destination = cherryPickBranchName;
-    cherryPickInput.message = "Cherry-pick a merge commit to another branch";
-    cherryPickInput.parent = 3;
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage(
-        "Cherry Pick: Parent 3 does not exist. Please specify a parent in range [1, 2].");
-    gApi.changes().id(mergeChangeResult.getChangeId()).current().cherryPick(cherryPickInput);
-  }
-
-  @Test
-  public void cherryPickNotify() throws Exception {
-    createBranch(new Branch.NameKey(project, "branch-1"));
-    createBranch(new Branch.NameKey(project, "branch-2"));
-    createBranch(new Branch.NameKey(project, "branch-3"));
-
-    // Creates a change for 'admin'.
-    PushOneCommit.Result result = createChange();
-    String changeId = project.get() + "~master~" + result.getChangeId();
-
-    // 'user' cherry-picks the change to a new branch, the source change's author/committer('admin')
-    // will be added as a reviewer of the newly created change.
-    setApiUser(user);
-    CherryPickInput input = new CherryPickInput();
-    input.message = "it goes to a new branch";
-
-    // Enable the notification. 'admin' as a reviewer should be notified.
-    input.destination = "branch-1";
-    input.notify = NotifyHandling.ALL;
-    sender.clear();
-    gApi.changes().id(changeId).current().cherryPick(input);
-    assertNotifyCc(admin);
-
-    // Disable the notification. 'admin' as a reviewer should not be notified any more.
-    input.destination = "branch-2";
-    input.notify = NotifyHandling.NONE;
-    sender.clear();
-    gApi.changes().id(changeId).current().cherryPick(input);
-    assertThat(sender.getMessages()).hasSize(0);
-
-    // Disable the notification. The user provided in the 'notifyDetails' should still be notified.
-    TestAccount userToNotify = accountCreator.user2();
-    input.destination = "branch-3";
-    input.notify = NotifyHandling.NONE;
-    input.notifyDetails =
-        ImmutableMap.of(RecipientType.TO, new NotifyInfo(ImmutableList.of(userToNotify.email)));
-    sender.clear();
-    gApi.changes().id(changeId).current().cherryPick(input);
-    assertNotifyTo(userToNotify);
-  }
-
-  @Test
-  public void cherryPickKeepReviewers() throws Exception {
-    createBranch(new Branch.NameKey(project, "stable"));
-
-    // Change is created by 'admin'.
-    PushOneCommit.Result r = createChange();
-    // Change is approved by 'admin2'. Change is CC'd to 'user'.
-    setApiUser(accountCreator.admin2());
-    ReviewInput in = ReviewInput.approve();
-    in.reviewer(user.email, ReviewerState.CC, true);
-    gApi.changes().id(r.getChangeId()).current().review(in);
-
-    // Change is cherrypicked by 'user2'.
-    setApiUser(accountCreator.user2());
-    CherryPickInput cin = new CherryPickInput();
-    cin.message = "this need to go to stable";
-    cin.destination = "stable";
-    cin.keepReviewers = true;
-    Map<ReviewerState, Collection<AccountInfo>> result =
-        gApi.changes().id(r.getChangeId()).current().cherryPick(cin).get().reviewers;
-
-    // 'admin' should be a reviewer as the old owner.
-    // 'admin2' should be a reviewer as the old reviewer.
-    // 'user' should be on CC.
-    assertThat(result).containsKey(ReviewerState.REVIEWER);
-    List<Integer> reviewers =
-        result.get(ReviewerState.REVIEWER).stream().map(a -> a._accountId).collect(toList());
-    if (notesMigration.readChanges()) {
-      assertThat(result).containsKey(ReviewerState.CC);
-      List<Integer> ccs =
-          result.get(ReviewerState.CC).stream().map(a -> a._accountId).collect(toList());
-      assertThat(ccs).containsExactly(user.id.get());
-      assertThat(reviewers).containsExactly(admin.id.get(), accountCreator.admin2().id.get());
-    } else {
-      assertThat(reviewers)
-          .containsExactly(user.id.get(), admin.id.get(), accountCreator.admin2().id.get());
-    }
-  }
-
-  @Test
-  public void cherryPickToMergedChangeRevision() throws Exception {
-    createBranch(new Branch.NameKey(project, "foo"));
-
-    PushOneCommit.Result dstChange = createChange(testRepo, "foo", SUBJECT, "b.txt", "b", "t");
-    dstChange.assertOkStatus();
-
-    merge(dstChange);
-
-    PushOneCommit.Result result = createChange(testRepo, "foo", SUBJECT, "b.txt", "c", "t");
-    result.assertOkStatus();
-    merge(result);
-
-    PushOneCommit.Result srcChange = createChange();
-
-    CherryPickInput input = new CherryPickInput();
-    input.destination = "foo";
-    input.base = dstChange.getCommit().name();
-    input.message = srcChange.getCommit().getFullMessage();
-    ChangeInfo changeInfo =
-        gApi.changes().id(srcChange.getChangeId()).current().cherryPick(input).get();
-    assertCherryPickResult(changeInfo, input, srcChange.getChangeId());
-  }
-
-  @Test
-  public void cherryPickToOpenChangeRevision() throws Exception {
-    createBranch(new Branch.NameKey(project, "foo"));
-
-    PushOneCommit.Result dstChange = createChange(testRepo, "foo", SUBJECT, "b.txt", "b", "t");
-    dstChange.assertOkStatus();
-
-    PushOneCommit.Result srcChange = createChange();
-
-    CherryPickInput input = new CherryPickInput();
-    input.destination = "foo";
-    input.base = dstChange.getCommit().name();
-    input.message = srcChange.getCommit().getFullMessage();
-    ChangeInfo changeInfo =
-        gApi.changes().id(srcChange.getChangeId()).current().cherryPick(input).get();
-    assertCherryPickResult(changeInfo, input, srcChange.getChangeId());
-  }
-
-  @Test
-  public void cherryPickToNonVisibleChangeFails() throws Exception {
-    createBranch(new Branch.NameKey(project, "foo"));
-
-    PushOneCommit.Result dstChange = createChange(testRepo, "foo", SUBJECT, "b.txt", "b", "t");
-    dstChange.assertOkStatus();
-
-    gApi.changes().id(dstChange.getChangeId()).setPrivate(true, null);
-
-    PushOneCommit.Result srcChange = createChange();
-
-    CherryPickInput input = new CherryPickInput();
-    input.destination = "foo";
-    input.base = dstChange.getCommit().name();
-    input.message = srcChange.getCommit().getFullMessage();
-
-    setApiUser(user);
-    exception.expect(UnprocessableEntityException.class);
-    exception.expectMessage(
-        String.format("Commit %s does not exist on branch refs/heads/foo", input.base));
-    gApi.changes().id(srcChange.getChangeId()).current().cherryPick(input).get();
-  }
-
-  @Test
-  public void cherryPickToAbandonedChangeFails() throws Exception {
-    PushOneCommit.Result change1 = createChange();
-    PushOneCommit.Result change2 = createChange();
-    gApi.changes().id(change2.getChangeId()).abandon();
-
-    CherryPickInput input = new CherryPickInput();
-    input.destination = "master";
-    input.base = change2.getCommit().name();
-    input.message = change1.getCommit().getFullMessage();
-
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage(
-        String.format(
-            "Change %s with commit %s is %s",
-            change2.getChange().getId().get(), input.base, ChangeStatus.ABANDONED));
-    gApi.changes().id(change1.getChangeId()).current().cherryPick(input);
-  }
-
-  @Test
-  public void cherryPickWithInvalidBaseFails() throws Exception {
-    PushOneCommit.Result change1 = createChange();
-
-    CherryPickInput input = new CherryPickInput();
-    input.destination = "master";
-    input.base = "invalid-sha1";
-    input.message = change1.getCommit().getFullMessage();
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage(String.format("Base %s doesn't represent a valid SHA-1", input.base));
-    gApi.changes().id(change1.getChangeId()).current().cherryPick(input);
-  }
-
-  @Test
-  public void cherryPickToCommitWithoutChangeId() throws Exception {
-    RevCommit commit1 = createNewCommitWithoutChangeId("refs/heads/foo", "a.txt", "content 1");
-
-    createNewCommitWithoutChangeId("refs/heads/foo", "a.txt", "content 2");
-
-    PushOneCommit.Result srcChange = createChange("subject", "b.txt", "b");
-    srcChange.assertOkStatus();
-
-    CherryPickInput input = new CherryPickInput();
-    input.destination = "foo";
-    input.base = commit1.name();
-    input.message = srcChange.getCommit().getFullMessage();
-    ChangeInfo changeInfo =
-        gApi.changes().id(srcChange.getChangeId()).current().cherryPick(input).get();
-    assertCherryPickResult(changeInfo, input, srcChange.getChangeId());
-  }
-
-  @Test
-  public void canRebase() throws Exception {
-    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
-    PushOneCommit.Result r1 = push.to("refs/for/master");
-    merge(r1);
-
-    push = pushFactory.create(db, admin.getIdent(), testRepo);
-    PushOneCommit.Result r2 = push.to("refs/for/master");
-    boolean canRebase =
-        gApi.changes().id(r2.getChangeId()).revision(r2.getCommit().name()).canRebase();
-    assertThat(canRebase).isFalse();
-    merge(r2);
-
-    testRepo.reset(r1.getCommit());
-    push = pushFactory.create(db, admin.getIdent(), testRepo);
-    PushOneCommit.Result r3 = push.to("refs/for/master");
-
-    canRebase = gApi.changes().id(r3.getChangeId()).revision(r3.getCommit().name()).canRebase();
-    assertThat(canRebase).isTrue();
-  }
-
-  @Test
-  public void setUnsetReviewedFlag() throws Exception {
-    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
-    PushOneCommit.Result r = push.to("refs/for/master");
-
-    gApi.changes().id(r.getChangeId()).current().setReviewed(PushOneCommit.FILE_NAME, true);
-
-    assertThat(Iterables.getOnlyElement(gApi.changes().id(r.getChangeId()).current().reviewed()))
-        .isEqualTo(PushOneCommit.FILE_NAME);
-
-    gApi.changes().id(r.getChangeId()).current().setReviewed(PushOneCommit.FILE_NAME, false);
-
-    assertThat(gApi.changes().id(r.getChangeId()).current().reviewed()).isEmpty();
-  }
-
-  @Test
-  public void setUnsetReviewedFlagByFileApi() throws Exception {
-    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
-    PushOneCommit.Result r = push.to("refs/for/master");
-
-    gApi.changes().id(r.getChangeId()).current().file(PushOneCommit.FILE_NAME).setReviewed(true);
-
-    assertThat(Iterables.getOnlyElement(gApi.changes().id(r.getChangeId()).current().reviewed()))
-        .isEqualTo(PushOneCommit.FILE_NAME);
-
-    gApi.changes().id(r.getChangeId()).current().file(PushOneCommit.FILE_NAME).setReviewed(false);
-
-    assertThat(gApi.changes().id(r.getChangeId()).current().reviewed()).isEmpty();
-  }
-
-  @Test
-  public void mergeable() throws Exception {
-    ObjectId initial = repo().exactRef(HEAD).getLeaf().getObjectId();
-
-    PushOneCommit push1 =
-        pushFactory.create(
-            db,
-            admin.getIdent(),
-            testRepo,
-            PushOneCommit.SUBJECT,
-            PushOneCommit.FILE_NAME,
-            "push 1 content");
-
-    PushOneCommit.Result r1 = push1.to("refs/for/master");
-    assertMergeable(r1.getChangeId(), true);
-    merge(r1);
-
-    // Reset HEAD to initial so the new change is a merge conflict.
-    RefUpdate ru = repo().updateRef(HEAD);
-    ru.setNewObjectId(initial);
-    assertThat(ru.forceUpdate()).isEqualTo(RefUpdate.Result.FORCED);
-
-    PushOneCommit push2 =
-        pushFactory.create(
-            db,
-            admin.getIdent(),
-            testRepo,
-            PushOneCommit.SUBJECT,
-            PushOneCommit.FILE_NAME,
-            "push 2 content");
-    PushOneCommit.Result r2 = push2.to("refs/for/master");
-    assertMergeable(r2.getChangeId(), false);
-    // TODO(dborowitz): Test for other-branches.
-  }
-
-  @Test
-  public void files() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Map<String, FileInfo> files =
-        gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).files();
-    assertThat(files).hasSize(2);
-    assertThat(Iterables.all(files.keySet(), f -> f.matches(FILE_NAME + '|' + COMMIT_MSG)))
-        .isTrue();
-  }
-
-  @Test
-  public void filesOnMergeCommitChange() throws Exception {
-    PushOneCommit.Result r = createMergeCommitChange("refs/for/master");
-
-    // list files against auto-merge
-    assertThat(gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).files().keySet())
-        .containsExactly(COMMIT_MSG, MERGE_LIST, "foo", "bar");
-
-    // list files against parent 1
-    assertThat(gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).files(1).keySet())
-        .containsExactly(COMMIT_MSG, MERGE_LIST, "bar");
-
-    // list files against parent 2
-    assertThat(gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).files(2).keySet())
-        .containsExactly(COMMIT_MSG, MERGE_LIST, "foo");
-  }
-
-  @Test
-  public void listFilesOnDifferentBases() throws Exception {
-    PushOneCommit.Result result1 = createChange();
-    String changeId = result1.getChangeId();
-    PushOneCommit.Result result2 = amendChange(changeId, SUBJECT, "b.txt", "b");
-    PushOneCommit.Result result3 = amendChange(changeId, SUBJECT, "c.txt", "c");
-
-    String revId1 = result1.getCommit().name();
-    String revId2 = result2.getCommit().name();
-    String revId3 = result3.getCommit().name();
-
-    assertThat(gApi.changes().id(changeId).revision(revId1).files(null).keySet())
-        .containsExactly(COMMIT_MSG, "a.txt");
-    assertThat(gApi.changes().id(changeId).revision(revId2).files(null).keySet())
-        .containsExactly(COMMIT_MSG, "a.txt", "b.txt");
-    assertThat(gApi.changes().id(changeId).revision(revId3).files(null).keySet())
-        .containsExactly(COMMIT_MSG, "a.txt", "b.txt", "c.txt");
-
-    assertThat(gApi.changes().id(changeId).revision(revId2).files(revId1).keySet())
-        .containsExactly(COMMIT_MSG, "b.txt");
-    assertThat(gApi.changes().id(changeId).revision(revId3).files(revId1).keySet())
-        .containsExactly(COMMIT_MSG, "b.txt", "c.txt");
-    assertThat(gApi.changes().id(changeId).revision(revId3).files(revId2).keySet())
-        .containsExactly(COMMIT_MSG, "c.txt");
-  }
-
-  @Test
-  public void queryRevisionFiles() throws Exception {
-    Map<String, String> files = ImmutableMap.of("file1.txt", "content 1", "file2.txt", "content 2");
-    PushOneCommit.Result result =
-        pushFactory.create(db, admin.getIdent(), testRepo, SUBJECT, files).to("refs/for/master");
-    result.assertOkStatus();
-    String changeId = result.getChangeId();
-
-    assertThat(gApi.changes().id(changeId).current().queryFiles("file1.txt"))
-        .containsExactly("file1.txt");
-    assertThat(gApi.changes().id(changeId).current().queryFiles("file2.txt"))
-        .containsExactly("file2.txt");
-    assertThat(gApi.changes().id(changeId).current().queryFiles("file1"))
-        .containsExactly("file1.txt");
-    assertThat(gApi.changes().id(changeId).current().queryFiles("file2"))
-        .containsExactly("file2.txt");
-    assertThat(gApi.changes().id(changeId).current().queryFiles("file"))
-        .containsExactly("file1.txt", "file2.txt");
-    assertThat(gApi.changes().id(changeId).current().queryFiles(""))
-        .containsExactly("file1.txt", "file2.txt");
-  }
-
-  @Test
-  public void description() throws Exception {
-    PushOneCommit.Result r = createChange();
-    assertDescription(r, "");
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).description("test");
-    assertDescription(r, "test");
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).description("");
-    assertDescription(r, "");
-  }
-
-  @Test
-  public void setDescriptionNotAllowedWithoutPermission() throws Exception {
-    PushOneCommit.Result r = createChange();
-    assertDescription(r, "");
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    exception.expectMessage("edit description not permitted");
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).description("test");
-  }
-
-  @Test
-  public void setDescriptionAllowedWithPermission() throws Exception {
-    PushOneCommit.Result r = createChange();
-    assertDescription(r, "");
-    grant(project, "refs/heads/master", Permission.OWNER, false, REGISTERED_USERS);
-    setApiUser(user);
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).description("test");
-    assertDescription(r, "test");
-  }
-
-  private void assertDescription(PushOneCommit.Result r, String expected) throws Exception {
-    assertThat(gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).description())
-        .isEqualTo(expected);
-  }
-
-  @Test
-  public void content() throws Exception {
-    PushOneCommit.Result r = createChange();
-    assertContent(r, FILE_NAME, FILE_CONTENT);
-    assertContent(r, COMMIT_MSG, r.getCommit().getFullMessage());
-  }
-
-  @Test
-  public void contentType() throws Exception {
-    PushOneCommit.Result r = createChange();
-
-    String endPoint =
-        "/changes/"
-            + r.getChangeId()
-            + "/revisions/"
-            + r.getCommit().name()
-            + "/files/"
-            + FILE_NAME
-            + "/content";
-    RestResponse response = adminRestSession.head(endPoint);
-    response.assertOK();
-    assertThat(response.getContentType()).startsWith("text/plain");
-    assertThat(response.hasContent()).isFalse();
-  }
-
-  @Test
-  public void commit() throws Exception {
-    WebLinkInfo expectedWebLinkInfo = new WebLinkInfo("foo", "imageUrl", "url");
-    patchSetLinks.add(
-        new PatchSetWebLink() {
-          @Override
-          public WebLinkInfo getPatchSetWebLink(String projectName, String commit) {
-            return expectedWebLinkInfo;
-          }
-        });
-
-    PushOneCommit.Result r = createChange();
-    RevCommit c = r.getCommit();
-
-    CommitInfo commitInfo = gApi.changes().id(r.getChangeId()).current().commit(false);
-    assertThat(commitInfo.commit).isEqualTo(c.name());
-    assertPersonIdent(commitInfo.author, c.getAuthorIdent());
-    assertPersonIdent(commitInfo.committer, c.getCommitterIdent());
-    assertThat(commitInfo.message).isEqualTo(c.getFullMessage());
-    assertThat(commitInfo.subject).isEqualTo(c.getShortMessage());
-    assertThat(commitInfo.parents).hasSize(1);
-    assertThat(Iterables.getOnlyElement(commitInfo.parents).commit)
-        .isEqualTo(c.getParent(0).name());
-    assertThat(commitInfo.webLinks).isNull();
-
-    commitInfo = gApi.changes().id(r.getChangeId()).current().commit(true);
-    assertThat(commitInfo.webLinks).hasSize(1);
-    WebLinkInfo webLinkInfo = Iterables.getOnlyElement(commitInfo.webLinks);
-    assertThat(webLinkInfo.name).isEqualTo(expectedWebLinkInfo.name);
-    assertThat(webLinkInfo.imageUrl).isEqualTo(expectedWebLinkInfo.imageUrl);
-    assertThat(webLinkInfo.url).isEqualTo(expectedWebLinkInfo.url);
-    assertThat(webLinkInfo.target).isEqualTo(expectedWebLinkInfo.target);
-  }
-
-  private void assertPersonIdent(GitPerson gitPerson, PersonIdent expectedIdent) {
-    assertThat(gitPerson.name).isEqualTo(expectedIdent.getName());
-    assertThat(gitPerson.email).isEqualTo(expectedIdent.getEmailAddress());
-    assertThat(gitPerson.date).isEqualTo(new Timestamp(expectedIdent.getWhen().getTime()));
-    assertThat(gitPerson.tz).isEqualTo(expectedIdent.getTimeZoneOffset());
-  }
-
-  private void assertMergeable(String id, boolean expected) throws Exception {
-    MergeableInfo m = gApi.changes().id(id).current().mergeable();
-    assertThat(m.mergeable).isEqualTo(expected);
-    assertThat(m.submitType).isEqualTo(SubmitType.MERGE_IF_NECESSARY);
-    assertThat(m.mergeableInto).isNull();
-    ChangeInfo c = gApi.changes().id(id).info();
-    assertThat(c.mergeable).isEqualTo(expected);
-  }
-
-  @Test
-  public void drafts() throws Exception {
-    PushOneCommit.Result r = createChange();
-    DraftInput in = new DraftInput();
-    in.line = 1;
-    in.message = "nit: trailing whitespace";
-    in.path = FILE_NAME;
-
-    DraftApi draftApi =
-        gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).createDraft(in);
-    assertThat(draftApi.get().message).isEqualTo(in.message);
-    assertThat(
-            gApi.changes()
-                .id(r.getChangeId())
-                .revision(r.getCommit().name())
-                .draft(draftApi.get().id)
-                .get()
-                .message)
-        .isEqualTo(in.message);
-    assertThat(gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).drafts())
-        .hasSize(1);
-
-    in.message = "good catch!";
-    assertThat(
-            gApi.changes()
-                .id(r.getChangeId())
-                .revision(r.getCommit().name())
-                .draft(draftApi.get().id)
-                .update(in)
-                .message)
-        .isEqualTo(in.message);
-
-    assertThat(
-            gApi.changes()
-                .id(r.getChangeId())
-                .revision(r.getCommit().name())
-                .draft(draftApi.get().id)
-                .get()
-                .author
-                .email)
-        .isEqualTo(admin.email);
-
-    draftApi.delete();
-    assertThat(gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).drafts())
-        .isEmpty();
-  }
-
-  @Test
-  public void comments() throws Exception {
-    PushOneCommit.Result r = createChange();
-    CommentInput in = new CommentInput();
-    in.line = 1;
-    in.message = "nit: trailing whitespace";
-    in.path = FILE_NAME;
-    ReviewInput reviewInput = new ReviewInput();
-    Map<String, List<CommentInput>> comments = new HashMap<>();
-    comments.put(FILE_NAME, Collections.singletonList(in));
-    reviewInput.comments = comments;
-    reviewInput.message = "comment test";
-    gApi.changes().id(r.getChangeId()).current().review(reviewInput);
-
-    Map<String, List<CommentInfo>> out =
-        gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).comments();
-    assertThat(out).hasSize(1);
-    CommentInfo comment = Iterables.getOnlyElement(out.get(FILE_NAME));
-    assertThat(comment.message).isEqualTo(in.message);
-    assertThat(comment.author.email).isEqualTo(admin.email);
-    assertThat(comment.path).isNull();
-
-    List<CommentInfo> list =
-        gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).commentsAsList();
-    assertThat(list).hasSize(1);
-
-    CommentInfo comment2 = list.get(0);
-    assertThat(comment2.path).isEqualTo(FILE_NAME);
-    assertThat(comment2.line).isEqualTo(comment.line);
-    assertThat(comment2.message).isEqualTo(comment.message);
-    assertThat(comment2.author.email).isEqualTo(comment.author.email);
-
-    assertThat(
-            gApi.changes()
-                .id(r.getChangeId())
-                .revision(r.getCommit().name())
-                .comment(comment.id)
-                .get()
-                .message)
-        .isEqualTo(in.message);
-  }
-
-  @Test
-  public void commentOnNonExistingFile() throws Exception {
-    PushOneCommit.Result r = createChange();
-    r = updateChange(r, "new content");
-    CommentInput in = new CommentInput();
-    in.line = 1;
-    in.message = "nit: trailing whitespace";
-    in.path = "non-existing.txt";
-    ReviewInput reviewInput = new ReviewInput();
-    Map<String, List<CommentInput>> comments = new HashMap<>();
-    comments.put("non-existing.txt", Collections.singletonList(in));
-    reviewInput.comments = comments;
-    reviewInput.message = "comment test";
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage(
-        String.format("not found in revision %d,1", r.getChange().change().getId().id));
-    gApi.changes().id(r.getChangeId()).revision(1).review(reviewInput);
-  }
-
-  @Test
-  public void patch() throws Exception {
-    PushOneCommit.Result r = createChange();
-    ChangeApi changeApi = gApi.changes().id(r.getChangeId());
-    BinaryResult bin = changeApi.revision(r.getCommit().name()).patch();
-    ByteArrayOutputStream os = new ByteArrayOutputStream();
-    bin.writeTo(os);
-    String res = new String(os.toByteArray(), UTF_8);
-    ChangeInfo change = changeApi.get();
-    RevisionInfo rev = change.revisions.get(change.currentRevision);
-    DateFormat df = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US);
-    String date = df.format(rev.commit.author.date);
-    assertThat(res).isEqualTo(String.format(PATCH, r.getCommit().name(), date, r.getChangeId()));
-  }
-
-  @Test
-  public void patchWithPath() throws Exception {
-    PushOneCommit.Result r = createChange();
-    ChangeApi changeApi = gApi.changes().id(r.getChangeId());
-    BinaryResult bin = changeApi.revision(r.getCommit().name()).patch(FILE_NAME);
-    ByteArrayOutputStream os = new ByteArrayOutputStream();
-    bin.writeTo(os);
-    String res = new String(os.toByteArray(), UTF_8);
-    assertThat(res).isEqualTo(PATCH_FILE_ONLY);
-
-    exception.expect(ResourceNotFoundException.class);
-    exception.expectMessage("File not found: nonexistent-file.");
-    changeApi.revision(r.getCommit().name()).patch("nonexistent-file");
-  }
-
-  @Test
-  public void actions() throws Exception {
-    PushOneCommit.Result r = createChange();
-    assertThat(current(r).actions().keySet())
-        .containsExactly("cherrypick", "description", "rebase");
-
-    current(r).review(ReviewInput.approve());
-    assertThat(current(r).actions().keySet())
-        .containsExactly("submit", "cherrypick", "description", "rebase");
-
-    current(r).submit();
-    assertThat(current(r).actions().keySet()).containsExactly("cherrypick");
-  }
-
-  @Test
-  public void actionsETag() throws Exception {
-    PushOneCommit.Result r1 = createChange();
-    PushOneCommit.Result r2 = createChange();
-
-    String oldETag = checkETag(getRevisionActions, r2, null);
-    current(r2).review(ReviewInput.approve());
-    oldETag = checkETag(getRevisionActions, r2, oldETag);
-
-    // Dependent change is included in ETag.
-    current(r1).review(ReviewInput.approve());
-    oldETag = checkETag(getRevisionActions, r2, oldETag);
-
-    current(r2).submit();
-    oldETag = checkETag(getRevisionActions, r2, oldETag);
-  }
-
-  @Test
-  public void deleteVoteOnNonCurrentPatchSet() throws Exception {
-    PushOneCommit.Result r = createChange(); // patch set 1
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
-
-    // patch set 2
-    amendChange(r.getChangeId());
-
-    // code-review
-    setApiUser(user);
-    recommend(r.getChangeId());
-
-    // check if it's blocked to delete a vote on a non-current patch set.
-    setApiUser(admin);
-    exception.expect(MethodNotAllowedException.class);
-    exception.expectMessage("Cannot access on non-current patch set");
-    gApi.changes()
-        .id(r.getChangeId())
-        .revision(r.getCommit().getName())
-        .reviewer(user.getId().toString())
-        .deleteVote("Code-Review");
-  }
-
-  @Test
-  public void deleteVoteOnCurrentPatchSet() throws Exception {
-    PushOneCommit.Result r = createChange(); // patch set 1
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
-
-    // patch set 2
-    amendChange(r.getChangeId());
-
-    // code-review
-    setApiUser(user);
-    recommend(r.getChangeId());
-
-    setApiUser(admin);
-    gApi.changes()
-        .id(r.getChangeId())
-        .current()
-        .reviewer(user.getId().toString())
-        .deleteVote("Code-Review");
-
-    Map<String, Short> m =
-        gApi.changes().id(r.getChangeId()).current().reviewer(user.getId().toString()).votes();
-
-    assertThat(m).containsExactly("Code-Review", Short.valueOf((short) 0));
-
-    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
-    ChangeMessageInfo message = Iterables.getLast(c.messages);
-    assertThat(message.author._accountId).isEqualTo(admin.getId().get());
-    assertThat(message.message).isEqualTo("Removed Code-Review+1 by User <user@example.com>\n");
-    assertThat(getReviewers(c.reviewers.get(ReviewerState.REVIEWER)))
-        .containsExactlyElementsIn(ImmutableSet.of(admin.getId(), user.getId()));
-  }
-
-  @Test
-  public void listVotesByRevision() throws Exception {
-    // Create patch set 1 and vote on it
-    String changeId = createChange().getChangeId();
-    ListMultimap<String, ApprovalInfo> votes = gApi.changes().id(changeId).current().votes();
-    assertThat(votes).isEmpty();
-    recommend(changeId);
-    votes = gApi.changes().id(changeId).current().votes();
-    assertThat(votes.keySet()).containsExactly("Code-Review");
-    List<ApprovalInfo> approvals = votes.get("Code-Review");
-    assertThat(approvals).hasSize(1);
-    ApprovalInfo approval = approvals.get(0);
-    assertThat(approval._accountId).isEqualTo(admin.id.get());
-    assertThat(approval.email).isEqualTo(admin.email);
-    assertThat(approval.username).isEqualTo(admin.username);
-
-    // Also vote on it with another user
-    setApiUser(user);
-    gApi.changes().id(changeId).current().review(ReviewInput.dislike());
-
-    // Patch set 1 has 2 votes on Code-Review
-    setApiUser(admin);
-    votes = gApi.changes().id(changeId).current().votes();
-    assertThat(votes.keySet()).containsExactly("Code-Review");
-    approvals = votes.get("Code-Review");
-    assertThat(approvals).hasSize(2);
-    assertThat(approvals.stream().map(a -> a._accountId))
-        .containsExactlyElementsIn(ImmutableList.of(admin.id.get(), user.id.get()));
-
-    // Create a new patch set which does not have any votes
-    amendChange(changeId);
-    votes = gApi.changes().id(changeId).current().votes();
-    assertThat(votes).isEmpty();
-
-    // Votes are still returned for ps 1
-    votes = gApi.changes().id(changeId).revision(1).votes();
-    assertThat(votes.keySet()).containsExactly("Code-Review");
-    approvals = votes.get("Code-Review");
-    assertThat(approvals).hasSize(2);
-  }
-
-  private static void assertCherryPickResult(
-      ChangeInfo changeInfo, CherryPickInput input, String srcChangeId) throws Exception {
-    assertThat(changeInfo.changeId).isEqualTo(srcChangeId);
-    assertThat(changeInfo.revisions.keySet()).containsExactly(changeInfo.currentRevision);
-    RevisionInfo revisionInfo = changeInfo.revisions.get(changeInfo.currentRevision);
-    assertThat(revisionInfo.commit.message).isEqualTo(input.message);
-    assertThat(revisionInfo.commit.parents).hasSize(1);
-    assertThat(revisionInfo.commit.parents.get(0).commit).isEqualTo(input.base);
-  }
-
-  private PushOneCommit.Result updateChange(PushOneCommit.Result r, String content)
-      throws Exception {
-    PushOneCommit push =
-        pushFactory.create(
-            db, admin.getIdent(), testRepo, "test commit", "a.txt", content, r.getChangeId());
-    return push.to("refs/for/master");
-  }
-
-  private RevisionApi current(PushOneCommit.Result r) throws Exception {
-    return gApi.changes().id(r.getChangeId()).current();
-  }
-
-  private String checkETag(ETagView<RevisionResource> view, PushOneCommit.Result r, String oldETag)
-      throws Exception {
-    String eTag = view.getETag(parseRevisionResource(r));
-    assertThat(eTag).isNotEqualTo(oldETag);
-    return eTag;
-  }
-
-  private PushOneCommit.Result createCherryPickableMerge(
-      String parent1FileName, String parent2FileName) throws Exception {
-    RevCommit initialCommit = getHead(repo());
-
-    String branchAName = "branchA";
-    createBranch(new Branch.NameKey(project, branchAName));
-    String branchBName = "branchB";
-    createBranch(new Branch.NameKey(project, branchBName));
-
-    PushOneCommit.Result changeAResult =
-        pushFactory
-            .create(db, admin.getIdent(), testRepo, "change a", parent1FileName, "Content of a")
-            .to("refs/for/" + branchAName);
-
-    testRepo.reset(initialCommit);
-    PushOneCommit.Result changeBResult =
-        pushFactory
-            .create(db, admin.getIdent(), testRepo, "change b", parent2FileName, "Content of b")
-            .to("refs/for/" + branchBName);
-
-    PushOneCommit pushableMergeCommit =
-        pushFactory.create(
-            db,
-            admin.getIdent(),
-            testRepo,
-            "merge",
-            ImmutableMap.of(parent1FileName, "Content of a", parent2FileName, "Content of b"));
-    pushableMergeCommit.setParents(
-        ImmutableList.of(changeAResult.getCommit(), changeBResult.getCommit()));
-    PushOneCommit.Result mergeChangeResult = pushableMergeCommit.to("refs/for/" + branchAName);
-    mergeChangeResult.assertOkStatus();
-    return mergeChangeResult;
-  }
-
-  private ApprovalInfo getApproval(String changeId, String label) throws Exception {
-    ChangeInfo info = gApi.changes().id(changeId).get(DETAILED_LABELS);
-    LabelInfo li = info.labels.get(label);
-    assertThat(li).isNotNull();
-    int accountId = atrScope.get().getUser().getAccountId().get();
-    return li.all.stream().filter(a -> a._accountId == accountId).findFirst().get();
-  }
-
-  private static Iterable<Account.Id> getReviewers(Collection<AccountInfo> r) {
-    return Iterables.transform(r, a -> new Account.Id(a._accountId));
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RobotCommentsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RobotCommentsIT.java
deleted file mode 100644
index 27f8a2f..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RobotCommentsIT.java
+++ /dev/null
@@ -1,1150 +0,0 @@
-// 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.
-
-package com.google.gerrit.acceptance.api.revision;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.TruthJUnit.assume;
-import static com.google.gerrit.acceptance.PushOneCommit.SUBJECT;
-import static com.google.gerrit.extensions.common.EditInfoSubject.assertThat;
-import static com.google.gerrit.extensions.common.RobotCommentInfoSubject.assertThatList;
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.AcceptanceTestRequestScope;
-import com.google.gerrit.acceptance.GerritConfig;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.api.changes.ReviewInput.RobotCommentInput;
-import com.google.gerrit.extensions.client.Comment;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.EditInfo;
-import com.google.gerrit.extensions.common.FixReplacementInfo;
-import com.google.gerrit.extensions.common.FixSuggestionInfo;
-import com.google.gerrit.extensions.common.RobotCommentInfo;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.BinaryResult;
-import com.google.gerrit.extensions.restapi.BinaryResultSubject;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import org.junit.Before;
-import org.junit.Test;
-
-public class RobotCommentsIT extends AbstractDaemonTest {
-  private static final String FILE_NAME = "file_to_fix.txt";
-  private static final String FILE_NAME2 = "another_file_to_fix.txt";
-  private static final String FILE_CONTENT =
-      "First line\nSecond line\nThird line\nFourth line\nFifth line\nSixth line"
-          + "\nSeventh line\nEighth line\nNinth line\nTenth line\n";
-  private static final String FILE_CONTENT2 = "1st line\n2nd line\n3rd line\n";
-
-  private String changeId;
-  private FixReplacementInfo fixReplacementInfo;
-  private FixSuggestionInfo fixSuggestionInfo;
-  private RobotCommentInput withFixRobotCommentInput;
-
-  @Before
-  public void setUp() throws Exception {
-    PushOneCommit push =
-        pushFactory.create(
-            db,
-            admin.getIdent(),
-            testRepo,
-            "Provide files which can be used for fixes",
-            ImmutableMap.of(FILE_NAME, FILE_CONTENT, FILE_NAME2, FILE_CONTENT2));
-    PushOneCommit.Result changeResult = push.to("refs/for/master");
-    changeId = changeResult.getChangeId();
-
-    fixReplacementInfo = createFixReplacementInfo();
-    fixSuggestionInfo = createFixSuggestionInfo(fixReplacementInfo);
-    withFixRobotCommentInput = createRobotCommentInput(fixSuggestionInfo);
-  }
-
-  @Test
-  public void retrievingRobotCommentsBeforeAddingAnyDoesNotRaiseAnException() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    Map<String, List<RobotCommentInfo>> robotComments =
-        gApi.changes().id(changeId).current().robotComments();
-
-    assertThat(robotComments).isNotNull();
-    assertThat(robotComments).isEmpty();
-  }
-
-  @Test
-  public void addedRobotCommentsCanBeRetrieved() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    RobotCommentInput in = createRobotCommentInput();
-    addRobotComment(changeId, in);
-
-    Map<String, List<RobotCommentInfo>> out = gApi.changes().id(changeId).current().robotComments();
-
-    assertThat(out).hasSize(1);
-    RobotCommentInfo comment = Iterables.getOnlyElement(out.get(in.path));
-    assertRobotComment(comment, in, false);
-  }
-
-  @Test
-  public void addedRobotCommentsCanBeRetrievedByChange() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    RobotCommentInput in = createRobotCommentInput();
-    addRobotComment(changeId, in);
-
-    pushFactory.create(db, admin.getIdent(), testRepo, changeId).to("refs/for/master");
-
-    RobotCommentInput in2 = createRobotCommentInput();
-    addRobotComment(changeId, in2);
-
-    Map<String, List<RobotCommentInfo>> out = gApi.changes().id(changeId).robotComments();
-
-    assertThat(out).hasSize(1);
-    assertThat(out.get(in.path)).hasSize(2);
-
-    RobotCommentInfo comment1 = out.get(in.path).get(0);
-    assertRobotComment(comment1, in, false);
-    RobotCommentInfo comment2 = out.get(in.path).get(1);
-    assertRobotComment(comment2, in2, false);
-  }
-
-  @Test
-  public void robotCommentsCanBeRetrievedAsList() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    RobotCommentInput robotCommentInput = createRobotCommentInput();
-    addRobotComment(changeId, robotCommentInput);
-
-    List<RobotCommentInfo> robotCommentInfos =
-        gApi.changes().id(changeId).current().robotCommentsAsList();
-
-    assertThat(robotCommentInfos).hasSize(1);
-    RobotCommentInfo robotCommentInfo = Iterables.getOnlyElement(robotCommentInfos);
-    assertRobotComment(robotCommentInfo, robotCommentInput);
-  }
-
-  @Test
-  public void specificRobotCommentCanBeRetrieved() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    RobotCommentInput robotCommentInput = createRobotCommentInput();
-    addRobotComment(changeId, robotCommentInput);
-
-    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
-    RobotCommentInfo robotCommentInfo = Iterables.getOnlyElement(robotCommentInfos);
-
-    RobotCommentInfo specificRobotCommentInfo =
-        gApi.changes().id(changeId).current().robotComment(robotCommentInfo.id).get();
-    assertRobotComment(specificRobotCommentInfo, robotCommentInput);
-  }
-
-  @Test
-  public void robotCommentWithoutOptionalFieldsCanBeAdded() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    RobotCommentInput in = createRobotCommentInputWithMandatoryFields();
-    addRobotComment(changeId, in);
-
-    Map<String, List<RobotCommentInfo>> out = gApi.changes().id(changeId).current().robotComments();
-    assertThat(out).hasSize(1);
-    RobotCommentInfo comment = Iterables.getOnlyElement(out.get(in.path));
-    assertRobotComment(comment, in, false);
-  }
-
-  @Test
-  public void hugeRobotCommentIsRejected() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    int defaultSizeLimit = 1024 * 1024;
-    int sizeOfRest = 451;
-    fixReplacementInfo.replacement = getStringFor(defaultSizeLimit - sizeOfRest + 1);
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("limit");
-    addRobotComment(changeId, withFixRobotCommentInput);
-  }
-
-  @Test
-  public void reasonablyLargeRobotCommentIsAccepted() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    int defaultSizeLimit = 1024 * 1024;
-    int sizeOfRest = 451;
-    fixReplacementInfo.replacement = getStringFor(defaultSizeLimit - sizeOfRest);
-
-    addRobotComment(changeId, withFixRobotCommentInput);
-
-    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
-    assertThat(robotCommentInfos).hasSize(1);
-  }
-
-  @Test
-  @GerritConfig(name = "change.robotCommentSizeLimit", value = "10k")
-  public void maximumAllowedSizeOfRobotCommentCanBeAdjusted() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    int sizeLimit = 10 * 1024;
-    fixReplacementInfo.replacement = getStringFor(sizeLimit);
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("limit");
-    addRobotComment(changeId, withFixRobotCommentInput);
-  }
-
-  @Test
-  @GerritConfig(name = "change.robotCommentSizeLimit", value = "0")
-  public void zeroForMaximumAllowedSizeOfRobotCommentRemovesRestriction() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    int defaultSizeLimit = 1024 * 1024;
-    fixReplacementInfo.replacement = getStringFor(defaultSizeLimit);
-
-    addRobotComment(changeId, withFixRobotCommentInput);
-
-    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
-    assertThat(robotCommentInfos).hasSize(1);
-  }
-
-  @Test
-  @GerritConfig(name = "change.robotCommentSizeLimit", value = "-1")
-  public void negativeValueForMaximumAllowedSizeOfRobotCommentRemovesRestriction()
-      throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    int defaultSizeLimit = 1024 * 1024;
-    fixReplacementInfo.replacement = getStringFor(defaultSizeLimit);
-
-    addRobotComment(changeId, withFixRobotCommentInput);
-
-    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
-    assertThat(robotCommentInfos).hasSize(1);
-  }
-
-  @Test
-  public void addedFixSuggestionCanBeRetrieved() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    addRobotComment(changeId, withFixRobotCommentInput);
-    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
-
-    assertThatList(robotCommentInfos).onlyElement().onlyFixSuggestion().isNotNull();
-  }
-
-  @Test
-  public void fixIdIsGeneratedForFixSuggestion() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    addRobotComment(changeId, withFixRobotCommentInput);
-    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
-
-    assertThatList(robotCommentInfos).onlyElement().onlyFixSuggestion().fixId().isNotEmpty();
-    assertThatList(robotCommentInfos)
-        .onlyElement()
-        .onlyFixSuggestion()
-        .fixId()
-        .isNotEqualTo(fixSuggestionInfo.fixId);
-  }
-
-  @Test
-  public void descriptionOfFixSuggestionIsAcceptedAsIs() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    addRobotComment(changeId, withFixRobotCommentInput);
-    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
-
-    assertThatList(robotCommentInfos)
-        .onlyElement()
-        .onlyFixSuggestion()
-        .description()
-        .isEqualTo(fixSuggestionInfo.description);
-  }
-
-  @Test
-  public void descriptionOfFixSuggestionIsMandatory() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    fixSuggestionInfo.description = null;
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage(
-        String.format(
-            "A description is required for the suggested fix of the robot comment on %s",
-            withFixRobotCommentInput.path));
-    addRobotComment(changeId, withFixRobotCommentInput);
-  }
-
-  @Test
-  public void addedFixReplacementCanBeRetrieved() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    addRobotComment(changeId, withFixRobotCommentInput);
-    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
-
-    assertThatList(robotCommentInfos)
-        .onlyElement()
-        .onlyFixSuggestion()
-        .onlyReplacement()
-        .isNotNull();
-  }
-
-  @Test
-  public void fixReplacementsAreMandatory() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    fixSuggestionInfo.replacements = Collections.emptyList();
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage(
-        String.format(
-            "At least one replacement is required"
-                + " for the suggested fix of the robot comment on %s",
-            withFixRobotCommentInput.path));
-    addRobotComment(changeId, withFixRobotCommentInput);
-  }
-
-  @Test
-  public void pathOfFixReplacementIsAcceptedAsIs() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    addRobotComment(changeId, withFixRobotCommentInput);
-
-    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
-
-    assertThatList(robotCommentInfos)
-        .onlyElement()
-        .onlyFixSuggestion()
-        .onlyReplacement()
-        .path()
-        .isEqualTo(fixReplacementInfo.path);
-  }
-
-  @Test
-  public void pathOfFixReplacementIsMandatory() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    fixReplacementInfo.path = null;
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage(
-        String.format(
-            "A file path must be given for the replacement of the robot comment on %s",
-            withFixRobotCommentInput.path));
-    addRobotComment(changeId, withFixRobotCommentInput);
-  }
-
-  @Test
-  public void rangeOfFixReplacementIsAcceptedAsIs() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    addRobotComment(changeId, withFixRobotCommentInput);
-
-    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
-
-    assertThatList(robotCommentInfos)
-        .onlyElement()
-        .onlyFixSuggestion()
-        .onlyReplacement()
-        .range()
-        .isEqualTo(fixReplacementInfo.range);
-  }
-
-  @Test
-  public void rangeOfFixReplacementIsMandatory() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    fixReplacementInfo.range = null;
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage(
-        String.format(
-            "A range must be given for the replacement of the robot comment on %s",
-            withFixRobotCommentInput.path));
-    addRobotComment(changeId, withFixRobotCommentInput);
-  }
-
-  @Test
-  public void rangeOfFixReplacementNeedsToBeValid() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    fixReplacementInfo.range = createRange(13, 9, 5, 10);
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("Range (13:9 - 5:10)");
-    addRobotComment(changeId, withFixRobotCommentInput);
-  }
-
-  @Test
-  public void rangesOfFixReplacementsOfSameFixSuggestionForSameFileMayNotOverlap()
-      throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    FixReplacementInfo fixReplacementInfo1 = new FixReplacementInfo();
-    fixReplacementInfo1.path = FILE_NAME;
-    fixReplacementInfo1.range = createRange(2, 0, 3, 1);
-    fixReplacementInfo1.replacement = "First modification\n";
-
-    FixReplacementInfo fixReplacementInfo2 = new FixReplacementInfo();
-    fixReplacementInfo2.path = FILE_NAME;
-    fixReplacementInfo2.range = createRange(3, 0, 4, 0);
-    fixReplacementInfo2.replacement = "Second modification\n";
-
-    FixSuggestionInfo fixSuggestionInfo =
-        createFixSuggestionInfo(fixReplacementInfo1, fixReplacementInfo2);
-    withFixRobotCommentInput.fixSuggestions = ImmutableList.of(fixSuggestionInfo);
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("overlap");
-    addRobotComment(changeId, withFixRobotCommentInput);
-  }
-
-  @Test
-  public void rangesOfFixReplacementsOfSameFixSuggestionForDifferentFileMayOverlap()
-      throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    FixReplacementInfo fixReplacementInfo1 = new FixReplacementInfo();
-    fixReplacementInfo1.path = FILE_NAME;
-    fixReplacementInfo1.range = createRange(2, 0, 3, 1);
-    fixReplacementInfo1.replacement = "First modification\n";
-
-    FixReplacementInfo fixReplacementInfo2 = new FixReplacementInfo();
-    fixReplacementInfo2.path = FILE_NAME2;
-    fixReplacementInfo2.range = createRange(3, 0, 4, 0);
-    fixReplacementInfo2.replacement = "Second modification\n";
-
-    FixSuggestionInfo fixSuggestionInfo =
-        createFixSuggestionInfo(fixReplacementInfo1, fixReplacementInfo2);
-    withFixRobotCommentInput.fixSuggestions = ImmutableList.of(fixSuggestionInfo);
-
-    addRobotComment(changeId, withFixRobotCommentInput);
-
-    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
-    assertThatList(robotCommentInfos).onlyElement().fixSuggestions().hasSize(1);
-  }
-
-  @Test
-  public void rangesOfFixReplacementsOfDifferentFixSuggestionsForSameFileMayOverlap()
-      throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    FixReplacementInfo fixReplacementInfo1 = new FixReplacementInfo();
-    fixReplacementInfo1.path = FILE_NAME;
-    fixReplacementInfo1.range = createRange(2, 0, 3, 1);
-    fixReplacementInfo1.replacement = "First modification\n";
-    FixSuggestionInfo fixSuggestionInfo1 = createFixSuggestionInfo(fixReplacementInfo1);
-
-    FixReplacementInfo fixReplacementInfo2 = new FixReplacementInfo();
-    fixReplacementInfo2.path = FILE_NAME;
-    fixReplacementInfo2.range = createRange(3, 0, 4, 0);
-    fixReplacementInfo2.replacement = "Second modification\n";
-    FixSuggestionInfo fixSuggestionInfo2 = createFixSuggestionInfo(fixReplacementInfo2);
-
-    withFixRobotCommentInput.fixSuggestions =
-        ImmutableList.of(fixSuggestionInfo1, fixSuggestionInfo2);
-
-    addRobotComment(changeId, withFixRobotCommentInput);
-
-    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
-    assertThatList(robotCommentInfos).onlyElement().fixSuggestions().hasSize(2);
-  }
-
-  @Test
-  public void fixReplacementsDoNotNeedToBeOrderedAccordingToRange() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    FixReplacementInfo fixReplacementInfo1 = new FixReplacementInfo();
-    fixReplacementInfo1.path = FILE_NAME;
-    fixReplacementInfo1.range = createRange(2, 0, 3, 0);
-    fixReplacementInfo1.replacement = "First modification\n";
-
-    FixReplacementInfo fixReplacementInfo2 = new FixReplacementInfo();
-    fixReplacementInfo2.path = FILE_NAME;
-    fixReplacementInfo2.range = createRange(3, 0, 4, 0);
-    fixReplacementInfo2.replacement = "Second modification\n";
-
-    FixReplacementInfo fixReplacementInfo3 = new FixReplacementInfo();
-    fixReplacementInfo3.path = FILE_NAME;
-    fixReplacementInfo3.range = createRange(4, 0, 5, 0);
-    fixReplacementInfo3.replacement = "Third modification\n";
-
-    FixSuggestionInfo fixSuggestionInfo =
-        createFixSuggestionInfo(fixReplacementInfo2, fixReplacementInfo1, fixReplacementInfo3);
-    withFixRobotCommentInput.fixSuggestions = ImmutableList.of(fixSuggestionInfo);
-
-    addRobotComment(changeId, withFixRobotCommentInput);
-
-    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
-    assertThatList(robotCommentInfos).onlyElement().onlyFixSuggestion().replacements().hasSize(3);
-  }
-
-  @Test
-  public void replacementStringOfFixReplacementIsAcceptedAsIs() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    addRobotComment(changeId, withFixRobotCommentInput);
-
-    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
-
-    assertThatList(robotCommentInfos)
-        .onlyElement()
-        .onlyFixSuggestion()
-        .onlyReplacement()
-        .replacement()
-        .isEqualTo(fixReplacementInfo.replacement);
-  }
-
-  @Test
-  public void replacementStringOfFixReplacementIsMandatory() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    fixReplacementInfo.replacement = null;
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage(
-        String.format(
-            "A content for replacement must be "
-                + "indicated for the replacement of the robot comment on %s",
-            withFixRobotCommentInput.path));
-    addRobotComment(changeId, withFixRobotCommentInput);
-  }
-
-  @Test
-  public void fixWithinALineCanBeApplied() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    fixReplacementInfo.path = FILE_NAME;
-    fixReplacementInfo.replacement = "Modified content";
-    fixReplacementInfo.range = createRange(3, 1, 3, 3);
-
-    addRobotComment(changeId, withFixRobotCommentInput);
-    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
-
-    List<String> fixIds = getFixIds(robotCommentInfos);
-    String fixId = Iterables.getOnlyElement(fixIds);
-
-    gApi.changes().id(changeId).current().applyFix(fixId);
-
-    Optional<BinaryResult> file = gApi.changes().id(changeId).edit().getFile(FILE_NAME);
-    BinaryResultSubject.assertThat(file)
-        .value()
-        .asString()
-        .isEqualTo(
-            "First line\nSecond line\nTModified contentrd line\nFourth line\nFifth line\n"
-                + "Sixth line\nSeventh line\nEighth line\nNinth line\nTenth line\n");
-  }
-
-  @Test
-  public void fixSpanningMultipleLinesCanBeApplied() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    fixReplacementInfo.path = FILE_NAME;
-    fixReplacementInfo.replacement = "Modified content\n5";
-    fixReplacementInfo.range = createRange(3, 2, 5, 3);
-
-    addRobotComment(changeId, withFixRobotCommentInput);
-    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
-    List<String> fixIds = getFixIds(robotCommentInfos);
-    String fixId = Iterables.getOnlyElement(fixIds);
-
-    gApi.changes().id(changeId).current().applyFix(fixId);
-
-    Optional<BinaryResult> file = gApi.changes().id(changeId).edit().getFile(FILE_NAME);
-    BinaryResultSubject.assertThat(file)
-        .value()
-        .asString()
-        .isEqualTo(
-            "First line\nSecond line\nThModified content\n5th line\nSixth line\nSeventh line\n"
-                + "Eighth line\nNinth line\nTenth line\n");
-  }
-
-  @Test
-  public void fixWithTwoCloseReplacementsOnSameFileCanBeApplied() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    FixReplacementInfo fixReplacementInfo1 = new FixReplacementInfo();
-    fixReplacementInfo1.path = FILE_NAME;
-    fixReplacementInfo1.range = createRange(2, 0, 3, 0);
-    fixReplacementInfo1.replacement = "First modification\n";
-
-    FixReplacementInfo fixReplacementInfo2 = new FixReplacementInfo();
-    fixReplacementInfo2.path = FILE_NAME;
-    fixReplacementInfo2.range = createRange(3, 0, 4, 0);
-    fixReplacementInfo2.replacement = "Some other modified content\n";
-
-    FixSuggestionInfo fixSuggestionInfo =
-        createFixSuggestionInfo(fixReplacementInfo1, fixReplacementInfo2);
-    withFixRobotCommentInput.fixSuggestions = ImmutableList.of(fixSuggestionInfo);
-
-    addRobotComment(changeId, withFixRobotCommentInput);
-    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
-    List<String> fixIds = getFixIds(robotCommentInfos);
-    String fixId = Iterables.getOnlyElement(fixIds);
-
-    gApi.changes().id(changeId).current().applyFix(fixId);
-
-    Optional<BinaryResult> file = gApi.changes().id(changeId).edit().getFile(FILE_NAME);
-    BinaryResultSubject.assertThat(file)
-        .value()
-        .asString()
-        .isEqualTo(
-            "First line\nFirst modification\nSome other modified content\nFourth line\nFifth line\n"
-                + "Sixth line\nSeventh line\nEighth line\nNinth line\nTenth line\n");
-  }
-
-  @Test
-  public void twoFixesOnSameFileCanBeApplied() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    FixReplacementInfo fixReplacementInfo1 = new FixReplacementInfo();
-    fixReplacementInfo1.path = FILE_NAME;
-    fixReplacementInfo1.range = createRange(2, 0, 3, 0);
-    fixReplacementInfo1.replacement = "First modification\n";
-    FixSuggestionInfo fixSuggestionInfo1 = createFixSuggestionInfo(fixReplacementInfo1);
-
-    FixReplacementInfo fixReplacementInfo2 = new FixReplacementInfo();
-    fixReplacementInfo2.path = FILE_NAME;
-    fixReplacementInfo2.range = createRange(8, 0, 9, 0);
-    fixReplacementInfo2.replacement = "Some other modified content\n";
-    FixSuggestionInfo fixSuggestionInfo2 = createFixSuggestionInfo(fixReplacementInfo2);
-
-    RobotCommentInput robotCommentInput1 = createRobotCommentInput(fixSuggestionInfo1);
-    RobotCommentInput robotCommentInput2 = createRobotCommentInput(fixSuggestionInfo2);
-    addRobotComment(changeId, robotCommentInput1);
-    addRobotComment(changeId, robotCommentInput2);
-    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
-
-    List<String> fixIds = getFixIds(robotCommentInfos);
-    gApi.changes().id(changeId).current().applyFix(fixIds.get(0));
-    gApi.changes().id(changeId).current().applyFix(fixIds.get(1));
-
-    Optional<BinaryResult> file = gApi.changes().id(changeId).edit().getFile(FILE_NAME);
-    BinaryResultSubject.assertThat(file)
-        .value()
-        .asString()
-        .isEqualTo(
-            "First line\nFirst modification\nThird line\nFourth line\nFifth line\nSixth line\n"
-                + "Seventh line\nSome other modified content\nNinth line\nTenth line\n");
-  }
-
-  @Test
-  public void twoConflictingFixesOnSameFileCannotBeApplied() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    FixReplacementInfo fixReplacementInfo1 = new FixReplacementInfo();
-    fixReplacementInfo1.path = FILE_NAME;
-    fixReplacementInfo1.range = createRange(2, 0, 3, 1);
-    fixReplacementInfo1.replacement = "First modification\n";
-    FixSuggestionInfo fixSuggestionInfo1 = createFixSuggestionInfo(fixReplacementInfo1);
-
-    FixReplacementInfo fixReplacementInfo2 = new FixReplacementInfo();
-    fixReplacementInfo2.path = FILE_NAME;
-    fixReplacementInfo2.range = createRange(3, 0, 4, 0);
-    fixReplacementInfo2.replacement = "Some other modified content\n";
-    FixSuggestionInfo fixSuggestionInfo2 = createFixSuggestionInfo(fixReplacementInfo2);
-
-    RobotCommentInput robotCommentInput1 = createRobotCommentInput(fixSuggestionInfo1);
-    RobotCommentInput robotCommentInput2 = createRobotCommentInput(fixSuggestionInfo2);
-    addRobotComment(changeId, robotCommentInput1);
-    addRobotComment(changeId, robotCommentInput2);
-    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
-
-    List<String> fixIds = getFixIds(robotCommentInfos);
-    gApi.changes().id(changeId).current().applyFix(fixIds.get(0));
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("merge");
-    gApi.changes().id(changeId).current().applyFix(fixIds.get(1));
-  }
-
-  @Test
-  public void twoFixesOfSameRobotCommentCanBeApplied() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    FixReplacementInfo fixReplacementInfo1 = new FixReplacementInfo();
-    fixReplacementInfo1.path = FILE_NAME;
-    fixReplacementInfo1.range = createRange(2, 0, 3, 0);
-    fixReplacementInfo1.replacement = "First modification\n";
-    FixSuggestionInfo fixSuggestionInfo1 = createFixSuggestionInfo(fixReplacementInfo1);
-
-    FixReplacementInfo fixReplacementInfo2 = new FixReplacementInfo();
-    fixReplacementInfo2.path = FILE_NAME;
-    fixReplacementInfo2.range = createRange(8, 0, 9, 0);
-    fixReplacementInfo2.replacement = "Some other modified content\n";
-    FixSuggestionInfo fixSuggestionInfo2 = createFixSuggestionInfo(fixReplacementInfo2);
-
-    withFixRobotCommentInput.fixSuggestions =
-        ImmutableList.of(fixSuggestionInfo1, fixSuggestionInfo2);
-
-    addRobotComment(changeId, withFixRobotCommentInput);
-    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
-
-    List<String> fixIds = getFixIds(robotCommentInfos);
-    gApi.changes().id(changeId).current().applyFix(fixIds.get(0));
-    gApi.changes().id(changeId).current().applyFix(fixIds.get(1));
-
-    Optional<BinaryResult> file = gApi.changes().id(changeId).edit().getFile(FILE_NAME);
-    BinaryResultSubject.assertThat(file)
-        .value()
-        .asString()
-        .isEqualTo(
-            "First line\nFirst modification\nThird line\nFourth line\nFifth line\nSixth line\n"
-                + "Seventh line\nSome other modified content\nNinth line\nTenth line\n");
-  }
-
-  @Test
-  public void fixReferringToDifferentFileThanRobotCommentCanBeApplied() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    fixReplacementInfo.path = FILE_NAME2;
-    fixReplacementInfo.range = createRange(2, 0, 3, 0);
-    fixReplacementInfo.replacement = "Modified content\n";
-
-    addRobotComment(changeId, withFixRobotCommentInput);
-    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
-    List<String> fixIds = getFixIds(robotCommentInfos);
-    String fixId = Iterables.getOnlyElement(fixIds);
-
-    gApi.changes().id(changeId).current().applyFix(fixId);
-
-    Optional<BinaryResult> file = gApi.changes().id(changeId).edit().getFile(FILE_NAME2);
-    BinaryResultSubject.assertThat(file)
-        .value()
-        .asString()
-        .isEqualTo("1st line\nModified content\n3rd line\n");
-  }
-
-  @Test
-  public void fixInvolvingTwoFilesCanBeApplied() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    FixReplacementInfo fixReplacementInfo1 = new FixReplacementInfo();
-    fixReplacementInfo1.path = FILE_NAME;
-    fixReplacementInfo1.range = createRange(2, 0, 3, 0);
-    fixReplacementInfo1.replacement = "First modification\n";
-
-    FixReplacementInfo fixReplacementInfo2 = new FixReplacementInfo();
-    fixReplacementInfo2.path = FILE_NAME2;
-    fixReplacementInfo2.range = createRange(1, 0, 2, 0);
-    fixReplacementInfo2.replacement = "Different file modification\n";
-
-    FixSuggestionInfo fixSuggestionInfo =
-        createFixSuggestionInfo(fixReplacementInfo1, fixReplacementInfo2);
-    withFixRobotCommentInput.fixSuggestions = ImmutableList.of(fixSuggestionInfo);
-
-    addRobotComment(changeId, withFixRobotCommentInput);
-    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
-    List<String> fixIds = getFixIds(robotCommentInfos);
-    String fixId = Iterables.getOnlyElement(fixIds);
-
-    gApi.changes().id(changeId).current().applyFix(fixId);
-
-    Optional<BinaryResult> file = gApi.changes().id(changeId).edit().getFile(FILE_NAME);
-    BinaryResultSubject.assertThat(file)
-        .value()
-        .asString()
-        .isEqualTo(
-            "First line\nFirst modification\nThird line\nFourth line\nFifth line\nSixth line\n"
-                + "Seventh line\nEighth line\nNinth line\nTenth line\n");
-    Optional<BinaryResult> file2 = gApi.changes().id(changeId).edit().getFile(FILE_NAME2);
-    BinaryResultSubject.assertThat(file2)
-        .value()
-        .asString()
-        .isEqualTo("Different file modification\n2nd line\n3rd line\n");
-  }
-
-  @Test
-  public void fixReferringToNonExistentFileCannotBeApplied() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    fixReplacementInfo.path = "a_non_existent_file.txt";
-    fixReplacementInfo.range = createRange(1, 0, 2, 0);
-    fixReplacementInfo.replacement = "Modified content\n";
-
-    addRobotComment(changeId, withFixRobotCommentInput);
-    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
-    List<String> fixIds = getFixIds(robotCommentInfos);
-    String fixId = Iterables.getOnlyElement(fixIds);
-
-    exception.expect(ResourceNotFoundException.class);
-    gApi.changes().id(changeId).current().applyFix(fixId);
-  }
-
-  @Test
-  public void fixOnPreviousPatchSetWithoutChangeEditCannotBeApplied() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    fixReplacementInfo.path = FILE_NAME;
-    fixReplacementInfo.replacement = "Modified content";
-    fixReplacementInfo.range = createRange(3, 1, 3, 3);
-
-    addRobotComment(changeId, withFixRobotCommentInput);
-    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
-
-    // Remember patch set and add another one.
-    String previousRevision = gApi.changes().id(changeId).get().currentRevision;
-    amendChange(changeId);
-
-    List<String> fixIds = getFixIds(robotCommentInfos);
-    String fixId = Iterables.getOnlyElement(fixIds);
-
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("current");
-    gApi.changes().id(changeId).revision(previousRevision).applyFix(fixId);
-  }
-
-  @Test
-  public void fixOnPreviousPatchSetWithExistingChangeEditCanBeApplied() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    // Create an empty change edit.
-    gApi.changes().id(changeId).edit().create();
-
-    fixReplacementInfo.path = FILE_NAME;
-    fixReplacementInfo.replacement = "Modified content";
-    fixReplacementInfo.range = createRange(3, 1, 3, 3);
-
-    addRobotComment(changeId, withFixRobotCommentInput);
-    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
-
-    // Remember patch set and add another one.
-    String previousRevision = gApi.changes().id(changeId).get().currentRevision;
-    amendChange(changeId);
-
-    List<String> fixIds = getFixIds(robotCommentInfos);
-    String fixId = Iterables.getOnlyElement(fixIds);
-
-    EditInfo editInfo = gApi.changes().id(changeId).revision(previousRevision).applyFix(fixId);
-
-    Optional<BinaryResult> file = gApi.changes().id(changeId).edit().getFile(FILE_NAME);
-    BinaryResultSubject.assertThat(file)
-        .value()
-        .asString()
-        .isEqualTo(
-            "First line\nSecond line\nTModified contentrd line\nFourth line\nFifth line\n"
-                + "Sixth line\nSeventh line\nEighth line\nNinth line\nTenth line\n");
-    assertThat(editInfo).baseRevision().isEqualTo(previousRevision);
-  }
-
-  @Test
-  public void fixOnCurrentPatchSetWithChangeEditOnPreviousPatchSetCannotBeApplied()
-      throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    // Create an empty change edit.
-    gApi.changes().id(changeId).edit().create();
-
-    // Add another patch set.
-    amendChange(changeId);
-
-    fixReplacementInfo.path = FILE_NAME;
-    fixReplacementInfo.replacement = "Modified content";
-    fixReplacementInfo.range = createRange(3, 1, 3, 3);
-
-    addRobotComment(changeId, withFixRobotCommentInput);
-    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
-
-    List<String> fixIds = getFixIds(robotCommentInfos);
-    String fixId = Iterables.getOnlyElement(fixIds);
-
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("based");
-    gApi.changes().id(changeId).current().applyFix(fixId);
-  }
-
-  @Test
-  public void fixDoesNotModifyCommitMessageOfChangeEdit() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    String changeEditCommitMessage = "This is the commit message of the change edit.\n";
-    gApi.changes().id(changeId).edit().modifyCommitMessage(changeEditCommitMessage);
-
-    fixReplacementInfo.path = FILE_NAME;
-    fixReplacementInfo.replacement = "Modified content";
-    fixReplacementInfo.range = createRange(3, 1, 3, 3);
-
-    addRobotComment(changeId, withFixRobotCommentInput);
-    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
-
-    List<String> fixIds = getFixIds(robotCommentInfos);
-    String fixId = Iterables.getOnlyElement(fixIds);
-
-    gApi.changes().id(changeId).current().applyFix(fixId);
-
-    String commitMessage = gApi.changes().id(changeId).edit().getCommitMessage();
-    assertThat(commitMessage).isEqualTo(changeEditCommitMessage);
-  }
-
-  @Test
-  public void applyingFixTwiceIsIdempotent() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    fixReplacementInfo.path = FILE_NAME;
-    fixReplacementInfo.replacement = "Modified content";
-    fixReplacementInfo.range = createRange(3, 1, 3, 3);
-
-    addRobotComment(changeId, withFixRobotCommentInput);
-    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
-
-    List<String> fixIds = getFixIds(robotCommentInfos);
-    String fixId = Iterables.getOnlyElement(fixIds);
-
-    gApi.changes().id(changeId).current().applyFix(fixId);
-    String expectedEditCommit =
-        gApi.changes().id(changeId).edit().get().map(edit -> edit.commit.commit).orElse("");
-
-    // Apply the fix again.
-    gApi.changes().id(changeId).current().applyFix(fixId);
-
-    Optional<EditInfo> editInfo = gApi.changes().id(changeId).edit().get();
-    assertThat(editInfo).value().commit().commit().isEqualTo(expectedEditCommit);
-  }
-
-  @Test
-  public void nonExistentFixCannotBeApplied() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    fixReplacementInfo.path = FILE_NAME;
-    fixReplacementInfo.replacement = "Modified content";
-    fixReplacementInfo.range = createRange(3, 1, 3, 3);
-
-    addRobotComment(changeId, withFixRobotCommentInput);
-    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
-
-    List<String> fixIds = getFixIds(robotCommentInfos);
-    String fixId = Iterables.getOnlyElement(fixIds);
-    String nonExistentFixId = fixId + "_non-existent";
-
-    exception.expect(ResourceNotFoundException.class);
-    gApi.changes().id(changeId).current().applyFix(nonExistentFixId);
-  }
-
-  @Test
-  public void applyingFixReturnsEditInfoForCreatedChangeEdit() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    fixReplacementInfo.path = FILE_NAME;
-    fixReplacementInfo.replacement = "Modified content";
-    fixReplacementInfo.range = createRange(3, 1, 3, 3);
-
-    addRobotComment(changeId, withFixRobotCommentInput);
-    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
-
-    List<String> fixIds = getFixIds(robotCommentInfos);
-    String fixId = Iterables.getOnlyElement(fixIds);
-
-    EditInfo editInfo = gApi.changes().id(changeId).current().applyFix(fixId);
-
-    Optional<EditInfo> expectedEditInfo = gApi.changes().id(changeId).edit().get();
-    String expectedEditCommit = expectedEditInfo.map(edit -> edit.commit.commit).orElse("");
-    assertThat(editInfo).commit().commit().isEqualTo(expectedEditCommit);
-    String expectedBaseRevision = expectedEditInfo.map(edit -> edit.baseRevision).orElse("");
-    assertThat(editInfo).baseRevision().isEqualTo(expectedBaseRevision);
-  }
-
-  @Test
-  public void applyingFixOnTopOfChangeEditReturnsEditInfoForUpdatedChangeEdit() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    gApi.changes().id(changeId).edit().create();
-
-    fixReplacementInfo.path = FILE_NAME;
-    fixReplacementInfo.replacement = "Modified content";
-    fixReplacementInfo.range = createRange(3, 1, 3, 3);
-
-    addRobotComment(changeId, withFixRobotCommentInput);
-    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
-
-    List<String> fixIds = getFixIds(robotCommentInfos);
-    String fixId = Iterables.getOnlyElement(fixIds);
-
-    EditInfo editInfo = gApi.changes().id(changeId).current().applyFix(fixId);
-
-    Optional<EditInfo> expectedEditInfo = gApi.changes().id(changeId).edit().get();
-    String expectedEditCommit = expectedEditInfo.map(edit -> edit.commit.commit).orElse("");
-    assertThat(editInfo).commit().commit().isEqualTo(expectedEditCommit);
-    String expectedBaseRevision = expectedEditInfo.map(edit -> edit.baseRevision).orElse("");
-    assertThat(editInfo).baseRevision().isEqualTo(expectedBaseRevision);
-  }
-
-  @Test
-  public void createdChangeEditIsBasedOnCurrentPatchSet() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    String currentRevision = gApi.changes().id(changeId).get().currentRevision;
-
-    fixReplacementInfo.path = FILE_NAME;
-    fixReplacementInfo.replacement = "Modified content";
-    fixReplacementInfo.range = createRange(3, 1, 3, 3);
-
-    addRobotComment(changeId, withFixRobotCommentInput);
-    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
-
-    List<String> fixIds = getFixIds(robotCommentInfos);
-    String fixId = Iterables.getOnlyElement(fixIds);
-
-    EditInfo editInfo = gApi.changes().id(changeId).current().applyFix(fixId);
-
-    assertThat(editInfo).baseRevision().isEqualTo(currentRevision);
-  }
-
-  @Test
-  public void robotCommentsNotSupportedWithoutNoteDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isFalse();
-
-    RobotCommentInput in = createRobotCommentInput();
-    ReviewInput reviewInput = new ReviewInput();
-    Map<String, List<RobotCommentInput>> robotComments = new HashMap<>();
-    robotComments.put(in.path, ImmutableList.of(in));
-    reviewInput.robotComments = robotComments;
-    reviewInput.message = "comment test";
-
-    exception.expect(MethodNotAllowedException.class);
-    exception.expectMessage("robot comments not supported");
-    gApi.changes().id(changeId).current().review(reviewInput);
-  }
-
-  @Test
-  public void queryChangesWithUnresolvedCommentCount() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    PushOneCommit.Result r1 = createChange();
-    PushOneCommit.Result r2 =
-        pushFactory
-            .create(
-                db, admin.getIdent(), testRepo, SUBJECT, FILE_NAME, "new content", r1.getChangeId())
-            .to("refs/for/master");
-
-    addRobotComment(r2.getChangeId(), createRobotCommentInputWithMandatoryFields());
-
-    AcceptanceTestRequestScope.Context ctx = disableDb();
-    try {
-      ChangeInfo result = Iterables.getOnlyElement(query(r2.getChangeId()));
-      // currently, we create all robot comments as 'resolved' by default.
-      // if we allow users to resolve a robot comment, then this test should
-      // be modified.
-      assertThat(result.unresolvedCommentCount).isEqualTo(0);
-    } finally {
-      enableDb(ctx);
-    }
-  }
-
-  private static RobotCommentInput createRobotCommentInputWithMandatoryFields() {
-    RobotCommentInput in = new RobotCommentInput();
-    in.robotId = "happyRobot";
-    in.robotRunId = "1";
-    in.line = 1;
-    in.message = "nit: trailing whitespace";
-    in.path = FILE_NAME;
-    return in;
-  }
-
-  private static RobotCommentInput createRobotCommentInput(
-      FixSuggestionInfo... fixSuggestionInfos) {
-    RobotCommentInput in = createRobotCommentInputWithMandatoryFields();
-    in.url = "http://www.happy-robot.com";
-    in.properties = new HashMap<>();
-    in.properties.put("key1", "value1");
-    in.properties.put("key2", "value2");
-    in.fixSuggestions = Arrays.asList(fixSuggestionInfos);
-    return in;
-  }
-
-  private static FixSuggestionInfo createFixSuggestionInfo(
-      FixReplacementInfo... fixReplacementInfos) {
-    FixSuggestionInfo newFixSuggestionInfo = new FixSuggestionInfo();
-    newFixSuggestionInfo.fixId = "An ID which must be overwritten.";
-    newFixSuggestionInfo.description = "A description for a suggested fix.";
-    newFixSuggestionInfo.replacements = Arrays.asList(fixReplacementInfos);
-    return newFixSuggestionInfo;
-  }
-
-  private static FixReplacementInfo createFixReplacementInfo() {
-    FixReplacementInfo newFixReplacementInfo = new FixReplacementInfo();
-    newFixReplacementInfo.path = FILE_NAME;
-    newFixReplacementInfo.replacement = "some replacement code";
-    newFixReplacementInfo.range = createRange(3, 9, 8, 4);
-    return newFixReplacementInfo;
-  }
-
-  private static Comment.Range createRange(
-      int startLine, int startCharacter, int endLine, int endCharacter) {
-    Comment.Range range = new Comment.Range();
-    range.startLine = startLine;
-    range.startCharacter = startCharacter;
-    range.endLine = endLine;
-    range.endCharacter = endCharacter;
-    return range;
-  }
-
-  private void addRobotComment(String targetChangeId, RobotCommentInput robotCommentInput)
-      throws Exception {
-    ReviewInput reviewInput = new ReviewInput();
-    reviewInput.robotComments =
-        Collections.singletonMap(robotCommentInput.path, ImmutableList.of(robotCommentInput));
-    reviewInput.message = "robot comment test";
-    gApi.changes().id(targetChangeId).current().review(reviewInput);
-  }
-
-  private List<RobotCommentInfo> getRobotComments() throws RestApiException {
-    return gApi.changes().id(changeId).current().robotCommentsAsList();
-  }
-
-  private void assertRobotComment(RobotCommentInfo c, RobotCommentInput expected) {
-    assertRobotComment(c, expected, true);
-  }
-
-  private void assertRobotComment(
-      RobotCommentInfo c, RobotCommentInput expected, boolean expectPath) {
-    assertThat(c.robotId).isEqualTo(expected.robotId);
-    assertThat(c.robotRunId).isEqualTo(expected.robotRunId);
-    assertThat(c.url).isEqualTo(expected.url);
-    assertThat(c.properties).isEqualTo(expected.properties);
-    assertThat(c.line).isEqualTo(expected.line);
-    assertThat(c.message).isEqualTo(expected.message);
-
-    assertThat(c.author.email).isEqualTo(admin.email);
-
-    if (expectPath) {
-      assertThat(c.path).isEqualTo(expected.path);
-    } else {
-      assertThat(c.path).isNull();
-    }
-  }
-
-  private static String getStringFor(int numberOfBytes) {
-    char[] chars = new char[numberOfBytes];
-    // 'a' will require one byte even when mapped to a JSON string
-    Arrays.fill(chars, 'a');
-    return new String(chars);
-  }
-
-  private static List<String> getFixIds(List<RobotCommentInfo> robotComments) {
-    assertThatList(robotComments).isNotNull();
-    return robotComments.stream()
-        .map(robotCommentInfo -> robotCommentInfo.fixSuggestions)
-        .filter(Objects::nonNull)
-        .flatMap(List::stream)
-        .map(fixSuggestionInfo -> fixSuggestionInfo.fixId)
-        .collect(toList());
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/edit/BUILD b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/edit/BUILD
deleted file mode 100644
index 990bad6..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/edit/BUILD
+++ /dev/null
@@ -1,10 +0,0 @@
-load("//gerrit-acceptance-tests:tests.bzl", "acceptance_tests")
-
-acceptance_tests(
-    srcs = ["ChangeEditIT.java"],
-    group = "edit",
-    labels = ["edit"],
-    deps = [
-        "//lib/joda:joda-time",
-    ],
-)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/edit/ChangeEditIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/edit/ChangeEditIT.java
deleted file mode 100644
index dd26e6e..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/edit/ChangeEditIT.java
+++ /dev/null
@@ -1,856 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.acceptance.edit;
-
-import static com.google.common.collect.Iterables.getOnlyElement;
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.extensions.common.EditInfoSubject.assertThat;
-import static com.google.gerrit.extensions.restapi.BinaryResultSubject.assertThat;
-import static com.google.gerrit.reviewdb.client.Patch.COMMIT_MSG;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.concurrent.TimeUnit.SECONDS;
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.acceptance.RestResponse;
-import com.google.gerrit.acceptance.TestProjectInput;
-import com.google.gerrit.common.RawInputUtil;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.changes.AddReviewerInput;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.api.changes.PublishChangeEditInput;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.client.ChangeEditDetailOption;
-import com.google.gerrit.extensions.client.InheritableBoolean;
-import com.google.gerrit.extensions.client.ListChangesOption;
-import com.google.gerrit.extensions.common.ApprovalInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.DiffInfo;
-import com.google.gerrit.extensions.common.EditInfo;
-import com.google.gerrit.extensions.common.FileInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BinaryResult;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.change.ChangeEdits.EditMessage;
-import com.google.gerrit.server.change.ChangeEdits.Post;
-import com.google.gerrit.server.change.ChangeEdits.Put;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.project.Util;
-import com.google.gerrit.testutil.TestTimeUtil;
-import com.google.gson.reflect.TypeToken;
-import com.google.gson.stream.JsonReader;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-public class ChangeEditIT extends AbstractDaemonTest {
-
-  private static final String FILE_NAME = "foo";
-  private static final String FILE_NAME2 = "foo2";
-  private static final String FILE_NAME3 = "foo3";
-  private static final byte[] CONTENT_OLD = "bar".getBytes(UTF_8);
-  private static final byte[] CONTENT_NEW = "baz".getBytes(UTF_8);
-  private static final String CONTENT_NEW2_STR = "quxÄÜÖßµ";
-  private static final byte[] CONTENT_NEW2 = CONTENT_NEW2_STR.getBytes(UTF_8);
-
-  @Inject private SchemaFactory<ReviewDb> reviewDbProvider;
-
-  private String changeId;
-  private String changeId2;
-  private PatchSet ps;
-
-  @BeforeClass
-  public static void setTimeForTesting() {
-    TestTimeUtil.resetWithClockStep(1, SECONDS);
-  }
-
-  @AfterClass
-  public static void restoreTime() {
-    TestTimeUtil.useSystemTime();
-  }
-
-  @Before
-  public void setUp() throws Exception {
-    db = reviewDbProvider.open();
-    changeId = newChange(admin.getIdent());
-    ps = getCurrentPatchSet(changeId);
-    assertThat(ps).isNotNull();
-    amendChange(admin.getIdent(), changeId);
-    changeId2 = newChange2(admin.getIdent());
-  }
-
-  @After
-  public void cleanup() {
-    db.close();
-  }
-
-  @Test
-  public void parseEditRevision() throws Exception {
-    createArbitraryEditFor(changeId);
-
-    // check that '0' is parsed as edit revision
-    gApi.changes().id(changeId).revision(0).comments();
-
-    // check that 'edit' is parsed as edit revision
-    gApi.changes().id(changeId).revision("edit").comments();
-  }
-
-  @Test
-  public void deleteEditOfCurrentPatchSet() throws Exception {
-    createArbitraryEditFor(changeId);
-    gApi.changes().id(changeId).edit().delete();
-    assertThat(getEdit(changeId)).isAbsent();
-  }
-
-  @Test
-  public void deleteEditOfOlderPatchSet() throws Exception {
-    createArbitraryEditFor(changeId2);
-    amendChange(admin.getIdent(), changeId2);
-
-    gApi.changes().id(changeId2).edit().delete();
-    assertThat(getEdit(changeId2)).isAbsent();
-  }
-
-  @Test
-  public void publishEdit() throws Exception {
-    createArbitraryEditFor(changeId);
-
-    PublishChangeEditInput publishInput = new PublishChangeEditInput();
-    publishInput.notify = NotifyHandling.NONE;
-    gApi.changes().id(changeId).edit().publish(publishInput);
-
-    assertThat(getEdit(changeId)).isAbsent();
-    assertChangeMessages(
-        changeId,
-        ImmutableList.of(
-            "Uploaded patch set 1.",
-            "Uploaded patch set 2.",
-            "Patch Set 3: Published edit on patch set 2."));
-
-    // The tag for the publish edit change message should vary according
-    // to whether the change was WIP at the time of publishing.
-    ChangeInfo info = get(changeId);
-    assertThat(info.messages).isNotEmpty();
-    assertThat(Iterables.getLast(info.messages).tag)
-        .isEqualTo(ChangeMessagesUtil.TAG_UPLOADED_PATCH_SET);
-
-    // Move the change to WIP, repeat, and verify.
-    gApi.changes().id(changeId).setWorkInProgress();
-    createEmptyEditFor(changeId);
-    gApi.changes().id(changeId).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW2));
-    gApi.changes().id(changeId).edit().publish();
-    info = get(changeId);
-    assertThat(info.messages).isNotEmpty();
-    assertThat(Iterables.getLast(info.messages).tag)
-        .isEqualTo(ChangeMessagesUtil.TAG_UPLOADED_WIP_PATCH_SET);
-  }
-
-  @Test
-  public void publishEditRest() throws Exception {
-    PatchSet oldCurrentPatchSet = getCurrentPatchSet(changeId);
-    createArbitraryEditFor(changeId);
-
-    adminRestSession.post(urlPublish(changeId)).assertNoContent();
-    assertThat(getEdit(changeId)).isAbsent();
-    PatchSet newCurrentPatchSet = getCurrentPatchSet(changeId);
-    assertThat(newCurrentPatchSet.getId()).isNotEqualTo(oldCurrentPatchSet.getId());
-    assertChangeMessages(
-        changeId,
-        ImmutableList.of(
-            "Uploaded patch set 1.",
-            "Uploaded patch set 2.",
-            "Patch Set 3: Published edit on patch set 2."));
-  }
-
-  @Test
-  public void publishEditNotifyRest() throws Exception {
-    AddReviewerInput in = new AddReviewerInput();
-    in.reviewer = user.email;
-    gApi.changes().id(changeId).addReviewer(in);
-
-    createArbitraryEditFor(changeId);
-
-    sender.clear();
-    PublishChangeEditInput input = new PublishChangeEditInput();
-    input.notify = NotifyHandling.NONE;
-    adminRestSession.post(urlPublish(changeId), input).assertNoContent();
-    assertThat(sender.getMessages()).isEmpty();
-  }
-
-  @Test
-  public void publishEditWithDefaultNotify() throws Exception {
-    AddReviewerInput in = new AddReviewerInput();
-    in.reviewer = user.email;
-    gApi.changes().id(changeId).addReviewer(in);
-
-    createArbitraryEditFor(changeId);
-
-    sender.clear();
-    gApi.changes().id(changeId).edit().publish();
-    assertThat(sender.getMessages()).isNotEmpty();
-  }
-
-  @Test
-  public void deleteEditRest() throws Exception {
-    createArbitraryEditFor(changeId);
-    adminRestSession.delete(urlEdit(changeId)).assertNoContent();
-    assertThat(getEdit(changeId)).isAbsent();
-  }
-
-  @Test
-  public void publishEditRestWithoutCLA() throws Exception {
-    createArbitraryEditFor(changeId);
-    setUseContributorAgreements(InheritableBoolean.TRUE);
-    adminRestSession.post(urlPublish(changeId)).assertForbidden();
-    setUseContributorAgreements(InheritableBoolean.FALSE);
-    adminRestSession.post(urlPublish(changeId)).assertNoContent();
-  }
-
-  @Test
-  public void rebaseEdit() throws Exception {
-    PatchSet previousPatchSet = getCurrentPatchSet(changeId2);
-    createEmptyEditFor(changeId2);
-    gApi.changes().id(changeId2).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW));
-    amendChange(admin.getIdent(), changeId2);
-    PatchSet currentPatchSet = getCurrentPatchSet(changeId2);
-
-    Optional<EditInfo> originalEdit = getEdit(changeId2);
-    assertThat(originalEdit).value().baseRevision().isEqualTo(previousPatchSet.getRevision().get());
-    Timestamp beforeRebase = originalEdit.get().commit.committer.date;
-    gApi.changes().id(changeId2).edit().rebase();
-    ensureSameBytes(getFileContentOfEdit(changeId2, FILE_NAME), CONTENT_NEW);
-    ensureSameBytes(getFileContentOfEdit(changeId2, FILE_NAME2), CONTENT_NEW2);
-    Optional<EditInfo> rebasedEdit = getEdit(changeId2);
-    assertThat(rebasedEdit).value().baseRevision().isEqualTo(currentPatchSet.getRevision().get());
-    assertThat(rebasedEdit).value().commit().committer().creationDate().isNotEqualTo(beforeRebase);
-  }
-
-  @Test
-  public void rebaseEditRest() throws Exception {
-    PatchSet previousPatchSet = getCurrentPatchSet(changeId2);
-    createEmptyEditFor(changeId2);
-    gApi.changes().id(changeId2).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW));
-    amendChange(admin.getIdent(), changeId2);
-    PatchSet currentPatchSet = getCurrentPatchSet(changeId2);
-
-    Optional<EditInfo> originalEdit = getEdit(changeId2);
-    assertThat(originalEdit).value().baseRevision().isEqualTo(previousPatchSet.getRevision().get());
-    Timestamp beforeRebase = originalEdit.get().commit.committer.date;
-    adminRestSession.post(urlRebase(changeId2)).assertNoContent();
-    ensureSameBytes(getFileContentOfEdit(changeId2, FILE_NAME), CONTENT_NEW);
-    ensureSameBytes(getFileContentOfEdit(changeId2, FILE_NAME2), CONTENT_NEW2);
-    Optional<EditInfo> rebasedEdit = getEdit(changeId2);
-    assertThat(rebasedEdit).value().baseRevision().isEqualTo(currentPatchSet.getRevision().get());
-    assertThat(rebasedEdit).value().commit().committer().creationDate().isNotEqualTo(beforeRebase);
-  }
-
-  @Test
-  public void rebaseEditWithConflictsRest_Conflict() throws Exception {
-    PatchSet currentPatchSet = getCurrentPatchSet(changeId2);
-    createEmptyEditFor(changeId2);
-    gApi.changes().id(changeId2).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW));
-    Optional<EditInfo> edit = getEdit(changeId2);
-    assertThat(edit).value().baseRevision().isEqualTo(currentPatchSet.getRevision().get());
-    PushOneCommit push =
-        pushFactory.create(
-            db,
-            admin.getIdent(),
-            testRepo,
-            PushOneCommit.SUBJECT,
-            FILE_NAME,
-            new String(CONTENT_NEW2, UTF_8),
-            changeId2);
-    push.to("refs/for/master").assertOkStatus();
-    adminRestSession.post(urlRebase(changeId2)).assertConflict();
-  }
-
-  @Test
-  public void updateExistingFile() throws Exception {
-    createEmptyEditFor(changeId);
-    gApi.changes().id(changeId).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW));
-    assertThat(getEdit(changeId)).isPresent();
-    ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME), CONTENT_NEW);
-    ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME), CONTENT_NEW);
-  }
-
-  @Test
-  @TestProjectInput(createEmptyCommit = false)
-  public void updateRootCommitMessage() throws Exception {
-    // Re-clone empty repo; TestRepository doesn't let us reset to unborn head.
-    testRepo = cloneProject(project);
-    changeId = newChange(admin.getIdent());
-
-    createEmptyEditFor(changeId);
-    Optional<EditInfo> edit = getEdit(changeId);
-    assertThat(edit).value().commit().parents().isEmpty();
-
-    String msg = String.format("New commit message\n\nChange-Id: %s\n", changeId);
-    gApi.changes().id(changeId).edit().modifyCommitMessage(msg);
-    String commitMessage = gApi.changes().id(changeId).edit().getCommitMessage();
-    assertThat(commitMessage).isEqualTo(msg);
-  }
-
-  @Test
-  public void updateMessageNoChange() throws Exception {
-    createEmptyEditFor(changeId);
-    String commitMessage = gApi.changes().id(changeId).edit().getCommitMessage();
-
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("New commit message cannot be same as existing commit message");
-    gApi.changes().id(changeId).edit().modifyCommitMessage(commitMessage);
-  }
-
-  @Test
-  public void updateMessageOnlyAddTrailingNewLines() throws Exception {
-    createEmptyEditFor(changeId);
-    String commitMessage = gApi.changes().id(changeId).edit().getCommitMessage();
-
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("New commit message cannot be same as existing commit message");
-    gApi.changes().id(changeId).edit().modifyCommitMessage(commitMessage + "\n\n");
-  }
-
-  @Test
-  public void updateMessage() throws Exception {
-    createEmptyEditFor(changeId);
-    String msg = String.format("New commit message\n\nChange-Id: %s\n", changeId);
-    gApi.changes().id(changeId).edit().modifyCommitMessage(msg);
-    String commitMessage = gApi.changes().id(changeId).edit().getCommitMessage();
-    assertThat(commitMessage).isEqualTo(msg);
-
-    PublishChangeEditInput publishInput = new PublishChangeEditInput();
-    publishInput.notify = NotifyHandling.NONE;
-    gApi.changes().id(changeId).edit().publish(publishInput);
-    assertThat(getEdit(changeId)).isAbsent();
-
-    ChangeInfo info =
-        get(changeId, ListChangesOption.CURRENT_COMMIT, ListChangesOption.CURRENT_REVISION);
-    assertThat(info.revisions.get(info.currentRevision).commit.message).isEqualTo(msg);
-    assertThat(info.revisions.get(info.currentRevision).description)
-        .isEqualTo("Edit commit message");
-
-    assertChangeMessages(
-        changeId,
-        ImmutableList.of(
-            "Uploaded patch set 1.",
-            "Uploaded patch set 2.",
-            "Patch Set 3: Commit message was updated."));
-  }
-
-  @Test
-  public void updateMessageRest() throws Exception {
-    adminRestSession.get(urlEditMessage(changeId, false)).assertNotFound();
-    EditMessage.Input in = new EditMessage.Input();
-    in.message =
-        String.format(
-            "New commit message\n\n" + CONTENT_NEW2_STR + "\n\nChange-Id: %s\n", changeId);
-    adminRestSession.put(urlEditMessage(changeId, false), in).assertNoContent();
-    RestResponse r = adminRestSession.getJsonAccept(urlEditMessage(changeId, false));
-    r.assertOK();
-    assertThat(readContentFromJson(r)).isEqualTo(in.message);
-    String commitMessage = gApi.changes().id(changeId).edit().getCommitMessage();
-    assertThat(commitMessage).isEqualTo(in.message);
-    in.message = String.format("New commit message2\n\nChange-Id: %s\n", changeId);
-    adminRestSession.put(urlEditMessage(changeId, false), in).assertNoContent();
-    String updatedCommitMessage = gApi.changes().id(changeId).edit().getCommitMessage();
-    assertThat(updatedCommitMessage).isEqualTo(in.message);
-
-    r = adminRestSession.getJsonAccept(urlEditMessage(changeId, true));
-    try (Repository repo = repoManager.openRepository(project);
-        RevWalk rw = new RevWalk(repo)) {
-      RevCommit commit = rw.parseCommit(ObjectId.fromString(ps.getRevision().get()));
-      assertThat(readContentFromJson(r)).isEqualTo(commit.getFullMessage());
-    }
-
-    PublishChangeEditInput publishInput = new PublishChangeEditInput();
-    publishInput.notify = NotifyHandling.NONE;
-    gApi.changes().id(changeId).edit().publish(publishInput);
-    assertChangeMessages(
-        changeId,
-        ImmutableList.of(
-            "Uploaded patch set 1.",
-            "Uploaded patch set 2.",
-            "Patch Set 3: Commit message was updated."));
-  }
-
-  @Test
-  public void retrieveEdit() throws Exception {
-    adminRestSession.get(urlEdit(changeId)).assertNoContent();
-    createArbitraryEditFor(changeId);
-    Optional<EditInfo> maybeEditInfo = gApi.changes().id(changeId).edit().get();
-    assertThat(maybeEditInfo).isPresent();
-    EditInfo editInfo = maybeEditInfo.get();
-    ChangeInfo changeInfo = get(changeId);
-    assertThat(editInfo.commit.commit).isNotEqualTo(changeInfo.currentRevision);
-    assertThat(editInfo).commit().parents().hasSize(1);
-    assertThat(editInfo).baseRevision().isEqualTo(changeInfo.currentRevision);
-
-    gApi.changes().id(changeId).edit().delete();
-
-    adminRestSession.get(urlEdit(changeId)).assertNoContent();
-  }
-
-  @Test
-  public void retrieveFilesInEdit() throws Exception {
-    createEmptyEditFor(changeId);
-    assertFiles(changeId, ImmutableList.of(COMMIT_MSG, FILE_NAME, FILE_NAME2));
-  }
-
-  @Test
-  public void deleteExistingFile() throws Exception {
-    createEmptyEditFor(changeId);
-    gApi.changes().id(changeId).edit().deleteFile(FILE_NAME);
-    assertThat(getFileContentOfEdit(changeId, FILE_NAME)).isAbsent();
-  }
-
-  @Test
-  public void renameExistingFile() throws Exception {
-    createEmptyEditFor(changeId);
-    gApi.changes().id(changeId).edit().renameFile(FILE_NAME, FILE_NAME3);
-    ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME3), CONTENT_OLD);
-    assertThat(getFileContentOfEdit(changeId, FILE_NAME)).isAbsent();
-  }
-
-  @Test
-  public void createEditByDeletingExistingFileRest() throws Exception {
-    adminRestSession.delete(urlEditFile(changeId, FILE_NAME)).assertNoContent();
-    assertThat(getFileContentOfEdit(changeId, FILE_NAME)).isAbsent();
-  }
-
-  @Test
-  public void deletingNonExistingEditRest() throws Exception {
-    adminRestSession.delete(urlEdit(changeId)).assertNotFound();
-  }
-
-  @Test
-  public void deleteExistingFileRest() throws Exception {
-    createEmptyEditFor(changeId);
-    adminRestSession.delete(urlEditFile(changeId, FILE_NAME)).assertNoContent();
-    assertThat(getFileContentOfEdit(changeId, FILE_NAME)).isAbsent();
-  }
-
-  @Test
-  public void restoreDeletedFileInPatchSet() throws Exception {
-    createEmptyEditFor(changeId2);
-    gApi.changes().id(changeId2).edit().restoreFile(FILE_NAME);
-    ensureSameBytes(getFileContentOfEdit(changeId2, FILE_NAME), CONTENT_OLD);
-  }
-
-  @Test
-  public void revertChanges() throws Exception {
-    createEmptyEditFor(changeId2);
-    gApi.changes().id(changeId2).edit().restoreFile(FILE_NAME);
-    ensureSameBytes(getFileContentOfEdit(changeId2, FILE_NAME), CONTENT_OLD);
-    gApi.changes().id(changeId2).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW));
-    ensureSameBytes(getFileContentOfEdit(changeId2, FILE_NAME), CONTENT_NEW);
-    gApi.changes().id(changeId2).edit().restoreFile(FILE_NAME);
-    ensureSameBytes(getFileContentOfEdit(changeId2, FILE_NAME), CONTENT_OLD);
-  }
-
-  @Test
-  public void renameFileRest() throws Exception {
-    createEmptyEditFor(changeId);
-    Post.Input in = new Post.Input();
-    in.oldPath = FILE_NAME;
-    in.newPath = FILE_NAME3;
-    adminRestSession.post(urlEdit(changeId), in).assertNoContent();
-    ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME3), CONTENT_OLD);
-    assertThat(getFileContentOfEdit(changeId, FILE_NAME)).isAbsent();
-  }
-
-  @Test
-  public void restoreDeletedFileInPatchSetRest() throws Exception {
-    Post.Input in = new Post.Input();
-    in.restorePath = FILE_NAME;
-    adminRestSession.post(urlEdit(changeId2), in).assertNoContent();
-    ensureSameBytes(getFileContentOfEdit(changeId2, FILE_NAME), CONTENT_OLD);
-  }
-
-  @Test
-  public void amendExistingFile() throws Exception {
-    createEmptyEditFor(changeId);
-    gApi.changes().id(changeId).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW));
-    ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME), CONTENT_NEW);
-    gApi.changes().id(changeId).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW2));
-    ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME), CONTENT_NEW2);
-  }
-
-  @Test
-  public void createAndChangeEditInOneRequestRest() throws Exception {
-    Put.Input in = new Put.Input();
-    in.content = RawInputUtil.create(CONTENT_NEW);
-    adminRestSession.putRaw(urlEditFile(changeId, FILE_NAME), in.content).assertNoContent();
-    ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME), CONTENT_NEW);
-    in.content = RawInputUtil.create(CONTENT_NEW2);
-    adminRestSession.putRaw(urlEditFile(changeId, FILE_NAME), in.content).assertNoContent();
-    ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME), CONTENT_NEW2);
-  }
-
-  @Test
-  public void changeEditRest() throws Exception {
-    createEmptyEditFor(changeId);
-    Put.Input in = new Put.Input();
-    in.content = RawInputUtil.create(CONTENT_NEW);
-    adminRestSession.putRaw(urlEditFile(changeId, FILE_NAME), in.content).assertNoContent();
-    ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME), CONTENT_NEW);
-  }
-
-  @Test
-  public void emptyPutRequest() throws Exception {
-    createEmptyEditFor(changeId);
-    adminRestSession.put(urlEditFile(changeId, FILE_NAME)).assertNoContent();
-    ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME), "".getBytes(UTF_8));
-  }
-
-  @Test
-  public void createEmptyEditRest() throws Exception {
-    adminRestSession.post(urlEdit(changeId)).assertNoContent();
-    ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME), CONTENT_OLD);
-  }
-
-  @Test
-  public void getFileContentRest() throws Exception {
-    Put.Input in = new Put.Input();
-    in.content = RawInputUtil.create(CONTENT_NEW);
-    adminRestSession.putRaw(urlEditFile(changeId, FILE_NAME), in.content).assertNoContent();
-    gApi.changes().id(changeId).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW2));
-    RestResponse r = adminRestSession.getJsonAccept(urlEditFile(changeId, FILE_NAME));
-    r.assertOK();
-    assertThat(readContentFromJson(r)).isEqualTo(new String(CONTENT_NEW2, UTF_8));
-
-    r = adminRestSession.getJsonAccept(urlEditFile(changeId, FILE_NAME, true));
-    r.assertOK();
-    assertThat(readContentFromJson(r)).isEqualTo(new String(CONTENT_OLD, UTF_8));
-  }
-
-  @Test
-  public void getFileNotFoundRest() throws Exception {
-    createEmptyEditFor(changeId);
-    adminRestSession.delete(urlEditFile(changeId, FILE_NAME)).assertNoContent();
-    adminRestSession.get(urlEditFile(changeId, FILE_NAME)).assertNoContent();
-    assertThat(getFileContentOfEdit(changeId, FILE_NAME)).isAbsent();
-  }
-
-  @Test
-  public void addNewFile() throws Exception {
-    createEmptyEditFor(changeId);
-    assertFiles(changeId, ImmutableList.of(COMMIT_MSG, FILE_NAME, FILE_NAME2));
-    gApi.changes().id(changeId).edit().modifyFile(FILE_NAME3, RawInputUtil.create(CONTENT_NEW));
-    ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME3), CONTENT_NEW);
-    assertFiles(changeId, ImmutableList.of(COMMIT_MSG, FILE_NAME, FILE_NAME2, FILE_NAME3));
-  }
-
-  @Test
-  public void addNewFileAndAmend() throws Exception {
-    createEmptyEditFor(changeId);
-    gApi.changes().id(changeId).edit().modifyFile(FILE_NAME3, RawInputUtil.create(CONTENT_NEW));
-    ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME3), CONTENT_NEW);
-    gApi.changes().id(changeId).edit().modifyFile(FILE_NAME3, RawInputUtil.create(CONTENT_NEW2));
-    ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME3), CONTENT_NEW2);
-  }
-
-  @Test
-  public void writeNoChanges() throws Exception {
-    createEmptyEditFor(changeId);
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("no changes were made");
-    gApi.changes().id(changeId).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_OLD));
-  }
-
-  @Test
-  public void editCommitMessageCopiesLabelScores() throws Exception {
-    String cr = "Code-Review";
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    LabelType codeReview = Util.codeReview();
-    codeReview.setCopyAllScoresIfNoCodeChange(true);
-    cfg.getLabelSections().put(cr, codeReview);
-    saveProjectConfig(project, cfg);
-
-    ReviewInput r = new ReviewInput();
-    r.labels = ImmutableMap.of(cr, (short) 1);
-    gApi.changes().id(changeId).current().review(r);
-
-    createEmptyEditFor(changeId);
-    String newSubj = "New commit message";
-    String newMsg = newSubj + "\n\nChange-Id: " + changeId + "\n";
-    gApi.changes().id(changeId).edit().modifyCommitMessage(newMsg);
-    PublishChangeEditInput publishInput = new PublishChangeEditInput();
-    publishInput.notify = NotifyHandling.NONE;
-    gApi.changes().id(changeId).edit().publish(publishInput);
-
-    ChangeInfo info = get(changeId);
-    assertThat(info.subject).isEqualTo(newSubj);
-    List<ApprovalInfo> approvals = info.labels.get(cr).all;
-    assertThat(approvals).hasSize(1);
-    assertThat(approvals.get(0).value).isEqualTo(1);
-  }
-
-  @Test
-  public void hasEditPredicate() throws Exception {
-    createEmptyEditFor(changeId);
-    assertThat(queryEdits()).hasSize(1);
-
-    createEmptyEditFor(changeId2);
-    gApi.changes().id(changeId2).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW));
-    assertThat(queryEdits()).hasSize(2);
-
-    gApi.changes().id(changeId).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW));
-    gApi.changes().id(changeId).edit().delete();
-    assertThat(queryEdits()).hasSize(1);
-
-    PublishChangeEditInput publishInput = new PublishChangeEditInput();
-    publishInput.notify = NotifyHandling.NONE;
-    gApi.changes().id(changeId2).edit().publish(publishInput);
-    assertThat(queryEdits()).isEmpty();
-
-    setApiUser(user);
-    createEmptyEditFor(changeId);
-    assertThat(queryEdits()).hasSize(1);
-
-    setApiUser(admin);
-    assertThat(queryEdits()).isEmpty();
-  }
-
-  @Test
-  public void files() throws Exception {
-    createEmptyEditFor(changeId);
-    gApi.changes().id(changeId).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW));
-    Optional<EditInfo> edit = getEdit(changeId);
-    assertThat(edit).isPresent();
-    String editCommitId = edit.get().commit.commit;
-
-    RestResponse r = adminRestSession.getJsonAccept(urlRevisionFiles(changeId, editCommitId));
-    Map<String, FileInfo> files = readContentFromJson(r, new TypeToken<Map<String, FileInfo>>() {});
-    assertThat(files).containsKey(FILE_NAME);
-
-    r = adminRestSession.getJsonAccept(urlRevisionFiles(changeId));
-    files = readContentFromJson(r, new TypeToken<Map<String, FileInfo>>() {});
-    assertThat(files).containsKey(FILE_NAME);
-  }
-
-  @Test
-  public void diff() throws Exception {
-    createEmptyEditFor(changeId);
-    gApi.changes().id(changeId).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW));
-    Optional<EditInfo> edit = getEdit(changeId);
-    assertThat(edit).isPresent();
-    String editCommitId = edit.get().commit.commit;
-
-    RestResponse r = adminRestSession.getJsonAccept(urlDiff(changeId, editCommitId, FILE_NAME));
-    DiffInfo diff = readContentFromJson(r, DiffInfo.class);
-    assertThat(diff.diffHeader.get(0)).contains(FILE_NAME);
-
-    r = adminRestSession.getJsonAccept(urlDiff(changeId, FILE_NAME));
-    diff = readContentFromJson(r, DiffInfo.class);
-    assertThat(diff.diffHeader.get(0)).contains(FILE_NAME);
-  }
-
-  @Test
-  public void createEditWithoutPushPatchSetPermission() throws Exception {
-    // Create new project with clean permissions
-    Project.NameKey p = createProject("addPatchSetEdit");
-    // Clone repository as user
-    TestRepository<InMemoryRepository> userTestRepo = cloneProject(p, user);
-
-    // Block default permission
-    block(p, "refs/for/*", Permission.ADD_PATCH_SET, REGISTERED_USERS);
-
-    // Create change as user
-    PushOneCommit push = pushFactory.create(db, user.getIdent(), userTestRepo);
-    PushOneCommit.Result r1 = push.to("refs/for/master");
-    r1.assertOkStatus();
-
-    // Try to create edit as admin
-    exception.expect(AuthException.class);
-    createEmptyEditFor(r1.getChangeId());
-  }
-
-  private void createArbitraryEditFor(String changeId) throws Exception {
-    createEmptyEditFor(changeId);
-    arbitrarilyModifyEditOf(changeId);
-  }
-
-  private void createEmptyEditFor(String changeId) throws Exception {
-    gApi.changes().id(changeId).edit().create();
-  }
-
-  private void arbitrarilyModifyEditOf(String changeId) throws Exception {
-    gApi.changes().id(changeId).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW));
-  }
-
-  private Optional<BinaryResult> getFileContentOfEdit(String changeId, String filePath)
-      throws Exception {
-    return gApi.changes().id(changeId).edit().getFile(filePath);
-  }
-
-  private List<ChangeInfo> queryEdits() throws Exception {
-    return query("project:{" + project.get() + "} has:edit");
-  }
-
-  private String newChange(PersonIdent ident) throws Exception {
-    PushOneCommit push =
-        pushFactory.create(
-            db, ident, testRepo, PushOneCommit.SUBJECT, FILE_NAME, new String(CONTENT_OLD, UTF_8));
-    return push.to("refs/for/master").getChangeId();
-  }
-
-  private String amendChange(PersonIdent ident, String changeId) throws Exception {
-    PushOneCommit push =
-        pushFactory.create(
-            db,
-            ident,
-            testRepo,
-            PushOneCommit.SUBJECT,
-            FILE_NAME2,
-            new String(CONTENT_NEW2, UTF_8),
-            changeId);
-    return push.to("refs/for/master").getChangeId();
-  }
-
-  private String newChange2(PersonIdent ident) throws Exception {
-    PushOneCommit push =
-        pushFactory.create(
-            db, ident, testRepo, PushOneCommit.SUBJECT, FILE_NAME, new String(CONTENT_OLD, UTF_8));
-    return push.rm("refs/for/master").getChangeId();
-  }
-
-  private PatchSet getCurrentPatchSet(String changeId) throws Exception {
-    return getOnlyElement(queryProvider.get().byKeyPrefix(changeId)).currentPatchSet();
-  }
-
-  private void ensureSameBytes(Optional<BinaryResult> fileContent, byte[] expectedFileBytes)
-      throws IOException {
-    assertThat(fileContent).value().bytes().isEqualTo(expectedFileBytes);
-  }
-
-  private void assertFiles(String changeId, List<String> expected) throws Exception {
-    Optional<EditInfo> info =
-        gApi.changes()
-            .id(changeId)
-            .edit()
-            .detail()
-            .withOption(ChangeEditDetailOption.LIST_FILES)
-            .get();
-    assertThat(info).isPresent();
-    assertThat(info.get().files).isNotNull();
-    assertThat(info.get().files.keySet()).containsExactlyElementsIn(expected);
-  }
-
-  private String urlEdit(String changeId) {
-    return "/changes/" + changeId + "/edit";
-  }
-
-  private String urlEditMessage(String changeId, boolean base) {
-    return "/changes/" + changeId + "/edit:message" + (base ? "?base" : "");
-  }
-
-  private String urlEditFile(String changeId, String fileName) {
-    return urlEditFile(changeId, fileName, false);
-  }
-
-  private String urlEditFile(String changeId, String fileName, boolean base) {
-    return urlEdit(changeId) + "/" + fileName + (base ? "?base" : "");
-  }
-
-  private String urlRevisionFiles(String changeId, String revisionId) {
-    return "/changes/" + changeId + "/revisions/" + revisionId + "/files";
-  }
-
-  private String urlRevisionFiles(String changeId) {
-    return "/changes/" + changeId + "/revisions/0/files";
-  }
-
-  private String urlPublish(String changeId) {
-    return "/changes/" + changeId + "/edit:publish";
-  }
-
-  private String urlRebase(String changeId) {
-    return "/changes/" + changeId + "/edit:rebase";
-  }
-
-  private String urlDiff(String changeId, String fileName) {
-    return "/changes/"
-        + changeId
-        + "/revisions/0/files/"
-        + fileName
-        + "/diff?context=ALL&intraline";
-  }
-
-  private String urlDiff(String changeId, String revisionId, String fileName) {
-    return "/changes/"
-        + changeId
-        + "/revisions/"
-        + revisionId
-        + "/files/"
-        + fileName
-        + "/diff?context=ALL&intraline";
-  }
-
-  private <T> T readContentFromJson(RestResponse r, Class<T> clazz) throws Exception {
-    r.assertOK();
-    try (JsonReader jsonReader = new JsonReader(r.getReader())) {
-      jsonReader.setLenient(true);
-      return newGson().fromJson(jsonReader, clazz);
-    }
-  }
-
-  private <T> T readContentFromJson(RestResponse r, TypeToken<T> typeToken) throws Exception {
-    r.assertOK();
-    try (JsonReader jsonReader = new JsonReader(r.getReader())) {
-      jsonReader.setLenient(true);
-      return newGson().fromJson(jsonReader, typeToken.getType());
-    }
-  }
-
-  private String readContentFromJson(RestResponse r) throws Exception {
-    return readContentFromJson(r, String.class);
-  }
-
-  private void assertChangeMessages(String changeId, List<String> expectedMessages)
-      throws Exception {
-    ChangeInfo ci = get(changeId);
-    assertThat(ci.messages).isNotNull();
-    assertThat(ci.messages).hasSize(expectedMessages.size());
-    List<String> actualMessages =
-        ci.messages.stream().map(message -> message.message).collect(toList());
-    assertThat(actualMessages).containsExactlyElementsIn(expectedMessages).inOrder();
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/AbstractPushForReview.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/AbstractPushForReview.java
deleted file mode 100644
index 420fc04..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/AbstractPushForReview.java
+++ /dev/null
@@ -1,2138 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.acceptance.git;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth8.assertThat;
-import static com.google.common.truth.TruthJUnit.assume;
-import static com.google.gerrit.acceptance.GitUtil.assertPushOk;
-import static com.google.gerrit.acceptance.GitUtil.assertPushRejected;
-import static com.google.gerrit.acceptance.GitUtil.pushHead;
-import static com.google.gerrit.acceptance.PushOneCommit.FILE_NAME;
-import static com.google.gerrit.common.FooterConstants.CHANGE_ID;
-import static com.google.gerrit.extensions.client.ListChangesOption.ALL_REVISIONS;
-import static com.google.gerrit.extensions.client.ListChangesOption.MESSAGES;
-import static com.google.gerrit.extensions.common.EditInfoSubject.assertThat;
-import static com.google.gerrit.server.git.receive.ReceiveConstants.PUSH_OPTION_SKIP_VALIDATION;
-import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
-import static com.google.gerrit.server.project.Util.category;
-import static com.google.gerrit.server.project.Util.value;
-import static java.util.concurrent.TimeUnit.SECONDS;
-import static java.util.stream.Collectors.joining;
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Streams;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.GerritConfig;
-import com.google.gerrit.acceptance.GitUtil;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.acceptance.Sandboxed;
-import com.google.gerrit.acceptance.TestAccount;
-import com.google.gerrit.acceptance.TestProjectInput;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.changes.DraftInput;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.api.projects.BranchInput;
-import com.google.gerrit.extensions.client.ChangeStatus;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
-import com.google.gerrit.extensions.client.InheritableBoolean;
-import com.google.gerrit.extensions.client.ListChangesOption;
-import com.google.gerrit.extensions.client.ProjectWatchInfo;
-import com.google.gerrit.extensions.client.ReviewerState;
-import com.google.gerrit.extensions.client.Side;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.ChangeMessageInfo;
-import com.google.gerrit.extensions.common.CommentInfo;
-import com.google.gerrit.extensions.common.EditInfo;
-import com.google.gerrit.extensions.common.EditInfoSubject;
-import com.google.gerrit.extensions.common.LabelInfo;
-import com.google.gerrit.extensions.common.RevisionInfo;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.git.receive.ReceiveConstants;
-import com.google.gerrit.server.group.SystemGroupBackend;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.project.Util;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.testutil.FakeEmailSender.Message;
-import com.google.gerrit.testutil.TestTimeUtil;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import java.util.regex.Pattern;
-import java.util.stream.Stream;
-import org.eclipse.jgit.api.errors.GitAPIException;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.RefUpdate.Result;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.PushResult;
-import org.eclipse.jgit.transport.RefSpec;
-import org.eclipse.jgit.transport.RemoteRefUpdate;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-public abstract class AbstractPushForReview extends AbstractDaemonTest {
-  protected enum Protocol {
-    // TODO(dborowitz): TEST.
-    SSH,
-    HTTP
-  }
-
-  private LabelType patchSetLock;
-
-  @BeforeClass
-  public static void setTimeForTesting() {
-    TestTimeUtil.resetWithClockStep(1, SECONDS);
-  }
-
-  @AfterClass
-  public static void restoreTime() {
-    TestTimeUtil.useSystemTime();
-  }
-
-  @Before
-  public void setUp() throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    patchSetLock = Util.patchSetLock();
-    cfg.getLabelSections().put(patchSetLock.getName(), patchSetLock);
-    AccountGroup.UUID anonymousUsers = systemGroupBackend.getGroup(ANONYMOUS_USERS).getUUID();
-    Util.allow(
-        cfg, Permission.forLabel(patchSetLock.getName()), 0, 1, anonymousUsers, "refs/heads/*");
-    saveProjectConfig(cfg);
-    grant(project, "refs/heads/*", Permission.LABEL + "Patch-Set-Lock");
-  }
-
-  @After
-  public void tearDown() throws Exception {
-    setApiUser(admin);
-    GeneralPreferencesInfo prefs = gApi.accounts().id(admin.id.get()).getPreferences();
-    prefs.publishCommentsOnPush = false;
-    gApi.accounts().id(admin.id.get()).setPreferences(prefs);
-  }
-
-  protected void selectProtocol(Protocol p) throws Exception {
-    String url;
-    switch (p) {
-      case SSH:
-        url = adminSshSession.getUrl();
-        break;
-      case HTTP:
-        url = admin.getHttpUrl(server);
-        break;
-      default:
-        throw new IllegalArgumentException("unexpected protocol: " + p);
-    }
-    testRepo = GitUtil.cloneProject(project, url + "/" + project.get());
-  }
-
-  @Test
-  public void pushForMaster() throws Exception {
-    PushOneCommit.Result r = pushTo("refs/for/master");
-    r.assertOkStatus();
-    r.assertChange(Change.Status.NEW, null);
-  }
-
-  @Test
-  @TestProjectInput(createEmptyCommit = false)
-  public void pushInitialCommitForMasterBranch() throws Exception {
-    RevCommit c = testRepo.commit().message("Initial commit").insertChangeId().create();
-    String id = GitUtil.getChangeId(testRepo, c).get();
-    testRepo.reset(c);
-
-    String r = "refs/for/master";
-    PushResult pr = pushHead(testRepo, r, false);
-    assertPushOk(pr, r);
-
-    ChangeInfo change = gApi.changes().id(id).info();
-    assertThat(change.branch).isEqualTo("master");
-    assertThat(change.status).isEqualTo(ChangeStatus.NEW);
-
-    try (Repository repo = repoManager.openRepository(project)) {
-      assertThat(repo.resolve("master")).isNull();
-    }
-
-    gApi.changes().id(change.id).current().review(ReviewInput.approve());
-    gApi.changes().id(change.id).current().submit();
-
-    try (Repository repo = repoManager.openRepository(project)) {
-      assertThat(repo.resolve("master")).isEqualTo(c);
-    }
-  }
-
-  @Test
-  @GerritConfig(name = "receive.enableSignedPush", value = "true")
-  @TestProjectInput(
-      enableSignedPush = InheritableBoolean.TRUE,
-      requireSignedPush = InheritableBoolean.TRUE)
-  public void nonSignedPushRejectedWhenSignPushRequired() throws Exception {
-    pushTo("refs/for/master").assertErrorStatus("push cert error");
-  }
-
-  @Test
-  public void pushInitialCommitForRefsMetaConfigBranch() throws Exception {
-    // delete refs/meta/config
-    try (Repository repo = repoManager.openRepository(project);
-        RevWalk rw = new RevWalk(repo)) {
-      RefUpdate u = repo.updateRef(RefNames.REFS_CONFIG);
-      u.setForceUpdate(true);
-      u.setExpectedOldObjectId(repo.resolve(RefNames.REFS_CONFIG));
-      assertThat(u.delete(rw)).isEqualTo(Result.FORCED);
-    }
-
-    RevCommit c =
-        testRepo
-            .commit()
-            .message("Initial commit")
-            .author(admin.getIdent())
-            .committer(admin.getIdent())
-            .insertChangeId()
-            .create();
-    String id = GitUtil.getChangeId(testRepo, c).get();
-    testRepo.reset(c);
-
-    String r = "refs/for/" + RefNames.REFS_CONFIG;
-    PushResult pr = pushHead(testRepo, r, false);
-    assertPushOk(pr, r);
-
-    ChangeInfo change = gApi.changes().id(id).info();
-    assertThat(change.branch).isEqualTo(RefNames.REFS_CONFIG);
-    assertThat(change.status).isEqualTo(ChangeStatus.NEW);
-
-    try (Repository repo = repoManager.openRepository(project)) {
-      assertThat(repo.resolve(RefNames.REFS_CONFIG)).isNull();
-    }
-
-    gApi.changes().id(change.id).current().review(ReviewInput.approve());
-    gApi.changes().id(change.id).current().submit();
-
-    try (Repository repo = repoManager.openRepository(project)) {
-      assertThat(repo.resolve(RefNames.REFS_CONFIG)).isEqualTo(c);
-    }
-  }
-
-  @Test
-  public void pushInitialCommitForNormalNonExistingBranchFails() throws Exception {
-    RevCommit c =
-        testRepo
-            .commit()
-            .message("Initial commit")
-            .author(admin.getIdent())
-            .committer(admin.getIdent())
-            .insertChangeId()
-            .create();
-    testRepo.reset(c);
-
-    String r = "refs/for/foo";
-    PushResult pr = pushHead(testRepo, r, false);
-    assertPushRejected(pr, r, "branch foo not found");
-
-    try (Repository repo = repoManager.openRepository(project)) {
-      assertThat(repo.resolve("foo")).isNull();
-    }
-  }
-
-  @Test
-  public void output() throws Exception {
-    String url = canonicalWebUrl.get() + "#/c/" + project.get() + "/+/";
-    ObjectId initialHead = testRepo.getRepository().resolve("HEAD");
-    PushOneCommit.Result r1 = pushTo("refs/for/master");
-    Change.Id id1 = r1.getChange().getId();
-    r1.assertOkStatus();
-    r1.assertChange(Change.Status.NEW, null);
-    r1.assertMessage(
-        "New changes:\n  " + url + id1 + " " + r1.getCommit().getShortMessage() + "\n");
-
-    testRepo.reset(initialHead);
-    String newMsg = r1.getCommit().getShortMessage() + " v2";
-    testRepo
-        .branch("HEAD")
-        .commit()
-        .message(newMsg)
-        .insertChangeId(r1.getChangeId().substring(1))
-        .create();
-    PushOneCommit.Result r2 =
-        pushFactory
-            .create(db, admin.getIdent(), testRepo, "another commit", "b.txt", "bbb")
-            .to("refs/for/master");
-    Change.Id id2 = r2.getChange().getId();
-    r2.assertOkStatus();
-    r2.assertChange(Change.Status.NEW, null);
-    r2.assertMessage(
-        "New changes:\n"
-            + "  "
-            + url
-            + id2
-            + " another commit\n"
-            + "\n"
-            + "\n"
-            + "Updated changes:\n"
-            + "  "
-            + url
-            + id1
-            + " "
-            + newMsg
-            + "\n");
-  }
-
-  @Test
-  public void autoclose() throws Exception {
-    // Create a change
-    PushOneCommit.Result r = pushTo("refs/for/master");
-    r.assertOkStatus();
-
-    // Force push it, closing it
-    String master = "refs/heads/master";
-    assertPushOk(pushHead(testRepo, master, false), master);
-
-    // Attempt to push amended commit to same change
-    String url = canonicalWebUrl.get() + "#/c/" + project.get() + "/+/" + r.getChange().getId();
-    r = amendChange(r.getChangeId(), "refs/for/master");
-    r.assertErrorStatus("change " + url + " closed");
-  }
-
-  @Test
-  public void pushForMasterWithTopic() throws Exception {
-    // specify topic in ref
-    String topic = "my/topic";
-    PushOneCommit.Result r = pushTo("refs/for/master/" + topic);
-    r.assertOkStatus();
-    r.assertChange(Change.Status.NEW, topic);
-
-    // specify topic as option
-    r = pushTo("refs/for/master%topic=" + topic);
-    r.assertOkStatus();
-    r.assertChange(Change.Status.NEW, topic);
-  }
-
-  @Test
-  public void pushForMasterWithTopicOption() throws Exception {
-    String topicOption = "topic=myTopic";
-    List<String> pushOptions = new ArrayList<>();
-    pushOptions.add(topicOption);
-
-    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
-    push.setPushOptions(pushOptions);
-    PushOneCommit.Result r = push.to("refs/for/master");
-
-    r.assertOkStatus();
-    r.assertChange(Change.Status.NEW, "myTopic");
-    r.assertPushOptions(pushOptions);
-  }
-
-  @Test
-  public void pushForMasterWithTopicInRefExceedLimitFails() throws Exception {
-    String topic = Stream.generate(() -> "t").limit(2049).collect(joining());
-    PushOneCommit.Result r = pushTo("refs/for/master/" + topic);
-    r.assertErrorStatus("topic length exceeds the limit (2048)");
-  }
-
-  @Test
-  public void pushForMasterWithTopicAsOptionExceedLimitFails() throws Exception {
-    String topic = Stream.generate(() -> "t").limit(2049).collect(joining());
-    PushOneCommit.Result r = pushTo("refs/for/master%topic=" + topic);
-    r.assertErrorStatus("topic length exceeds the limit (2048)");
-  }
-
-  @Test
-  public void pushForMasterWithNotify() throws Exception {
-    // create a user that watches the project
-    TestAccount user3 = accountCreator.create("user3", "user3@example.com", "User3");
-    List<ProjectWatchInfo> projectsToWatch = new ArrayList<>();
-    ProjectWatchInfo pwi = new ProjectWatchInfo();
-    pwi.project = project.get();
-    pwi.filter = "*";
-    pwi.notifyNewChanges = true;
-    projectsToWatch.add(pwi);
-    setApiUser(user3);
-    gApi.accounts().self().setWatchedProjects(projectsToWatch);
-
-    TestAccount user2 = accountCreator.user2();
-    String pushSpec = "refs/for/master%reviewer=" + user.email + ",cc=" + user2.email;
-
-    sender.clear();
-    PushOneCommit.Result r = pushTo(pushSpec + ",notify=" + NotifyHandling.NONE);
-    r.assertOkStatus();
-    assertThat(sender.getMessages()).isEmpty();
-
-    sender.clear();
-    r = pushTo(pushSpec + ",notify=" + NotifyHandling.OWNER);
-    r.assertOkStatus();
-    // no email notification about own changes
-    assertThat(sender.getMessages()).isEmpty();
-
-    sender.clear();
-    r = pushTo(pushSpec + ",notify=" + NotifyHandling.OWNER_REVIEWERS);
-    r.assertOkStatus();
-    assertThat(sender.getMessages()).hasSize(1);
-    Message m = sender.getMessages().get(0);
-    assertThat(m.rcpt()).containsExactly(user.emailAddress);
-
-    sender.clear();
-    r = pushTo(pushSpec + ",notify=" + NotifyHandling.ALL);
-    r.assertOkStatus();
-    assertThat(sender.getMessages()).hasSize(1);
-    m = sender.getMessages().get(0);
-    assertThat(m.rcpt()).containsExactly(user.emailAddress, user2.emailAddress, user3.emailAddress);
-
-    sender.clear();
-    r = pushTo(pushSpec + ",notify=" + NotifyHandling.NONE + ",notify-to=" + user3.email);
-    r.assertOkStatus();
-    assertNotifyTo(user3);
-
-    sender.clear();
-    r = pushTo(pushSpec + ",notify=" + NotifyHandling.NONE + ",notify-cc=" + user3.email);
-    r.assertOkStatus();
-    assertNotifyCc(user3);
-
-    sender.clear();
-    r = pushTo(pushSpec + ",notify=" + NotifyHandling.NONE + ",notify-bcc=" + user3.email);
-    r.assertOkStatus();
-    assertNotifyBcc(user3);
-
-    // request that sender gets notified as TO, CC and BCC, email should be sent
-    // even if the sender is the only recipient
-    sender.clear();
-    r = pushTo(pushSpec + ",notify=" + NotifyHandling.NONE + ",notify-to=" + admin.email);
-    assertNotifyTo(admin);
-
-    sender.clear();
-    r = pushTo(pushSpec + ",notify=" + NotifyHandling.NONE + ",notify-cc=" + admin.email);
-    r.assertOkStatus();
-    assertNotifyCc(admin);
-
-    sender.clear();
-    r = pushTo(pushSpec + ",notify=" + NotifyHandling.NONE + ",notify-bcc=" + admin.email);
-    r.assertOkStatus();
-    assertNotifyBcc(admin);
-  }
-
-  @Test
-  public void pushForMasterWithCc() throws Exception {
-    // cc one user
-    String topic = "my/topic";
-    PushOneCommit.Result r = pushTo("refs/for/master/" + topic + "%cc=" + user.email);
-    r.assertOkStatus();
-    r.assertChange(Change.Status.NEW, topic, ImmutableList.of(), ImmutableList.of(user));
-
-    // cc several users
-    r =
-        pushTo(
-            "refs/for/master/"
-                + topic
-                + "%cc="
-                + admin.email
-                + ",cc="
-                + user.email
-                + ",cc="
-                + accountCreator.user2().email);
-    r.assertOkStatus();
-    // Check that admin isn't CC'd as they own the change
-    r.assertChange(
-        Change.Status.NEW,
-        topic,
-        ImmutableList.of(),
-        ImmutableList.of(user, accountCreator.user2()));
-
-    // cc non-existing user
-    String nonExistingEmail = "non.existing@example.com";
-    r =
-        pushTo(
-            "refs/for/master/"
-                + topic
-                + "%cc="
-                + admin.email
-                + ",cc="
-                + nonExistingEmail
-                + ",cc="
-                + user.email);
-    r.assertErrorStatus("user \"" + nonExistingEmail + "\" not found");
-  }
-
-  @Test
-  public void pushForMasterWithReviewer() throws Exception {
-    // add one reviewer
-    String topic = "my/topic";
-    PushOneCommit.Result r = pushTo("refs/for/master/" + topic + "%r=" + user.email);
-    r.assertOkStatus();
-    r.assertChange(Change.Status.NEW, topic, user);
-
-    // add several reviewers
-    TestAccount user2 =
-        accountCreator.create("another-user", "another.user@example.com", "Another User");
-    r =
-        pushTo(
-            "refs/for/master/"
-                + topic
-                + "%r="
-                + admin.email
-                + ",r="
-                + user.email
-                + ",r="
-                + user2.email);
-    r.assertOkStatus();
-    // admin is the owner of the change and should not appear as reviewer
-    r.assertChange(Change.Status.NEW, topic, user, user2);
-
-    // add non-existing user as reviewer
-    String nonExistingEmail = "non.existing@example.com";
-    r =
-        pushTo(
-            "refs/for/master/"
-                + topic
-                + "%r="
-                + admin.email
-                + ",r="
-                + nonExistingEmail
-                + ",r="
-                + user.email);
-    r.assertErrorStatus("user \"" + nonExistingEmail + "\" not found");
-  }
-
-  @Test
-  public void pushPrivateChange() throws Exception {
-    // Push a private change.
-    PushOneCommit.Result r = pushTo("refs/for/master%private");
-    r.assertOkStatus();
-    r.assertMessage(" [PRIVATE]");
-    assertThat(r.getChange().change().isPrivate()).isTrue();
-
-    // Pushing a new patch set without --private doesn't remove the privacy flag from the change.
-    r = amendChange(r.getChangeId(), "refs/for/master");
-    r.assertOkStatus();
-    r.assertMessage(" [PRIVATE]");
-    assertThat(r.getChange().change().isPrivate()).isTrue();
-
-    // Remove the privacy flag from the change.
-    r = amendChange(r.getChangeId(), "refs/for/master%remove-private");
-    r.assertOkStatus();
-    r.assertNotMessage(" [PRIVATE]");
-    assertThat(r.getChange().change().isPrivate()).isFalse();
-
-    // Normal push: privacy flag is not added back.
-    r = amendChange(r.getChangeId(), "refs/for/master");
-    r.assertOkStatus();
-    r.assertNotMessage(" [PRIVATE]");
-    assertThat(r.getChange().change().isPrivate()).isFalse();
-
-    // Make the change private again.
-    r = pushTo("refs/for/master%private");
-    r.assertOkStatus();
-    r.assertMessage(" [PRIVATE]");
-    assertThat(r.getChange().change().isPrivate()).isTrue();
-
-    // Can't use --private and --remove-private together.
-    r = pushTo("refs/for/master%private,remove-private");
-    r.assertErrorStatus();
-  }
-
-  @Test
-  public void pushWorkInProgressChange() throws Exception {
-    // Push a work-in-progress change.
-    PushOneCommit.Result r = pushTo("refs/for/master%wip");
-    r.assertOkStatus();
-    r.assertMessage(" [WIP]");
-    assertThat(r.getChange().change().isWorkInProgress()).isTrue();
-    assertUploadTag(r.getChange(), ChangeMessagesUtil.TAG_UPLOADED_WIP_PATCH_SET);
-
-    // Pushing a new patch set without --wip doesn't remove the wip flag from the change.
-    r = amendChange(r.getChangeId(), "refs/for/master");
-    r.assertOkStatus();
-    r.assertMessage(" [WIP]");
-    assertThat(r.getChange().change().isWorkInProgress()).isTrue();
-    assertUploadTag(r.getChange(), ChangeMessagesUtil.TAG_UPLOADED_WIP_PATCH_SET);
-
-    // Remove the wip flag from the change.
-    r = amendChange(r.getChangeId(), "refs/for/master%ready");
-    r.assertOkStatus();
-    r.assertNotMessage(" [WIP]");
-    assertThat(r.getChange().change().isWorkInProgress()).isFalse();
-    assertUploadTag(r.getChange(), ChangeMessagesUtil.TAG_UPLOADED_PATCH_SET);
-
-    // Normal push: wip flag is not added back.
-    r = amendChange(r.getChangeId(), "refs/for/master");
-    r.assertOkStatus();
-    r.assertNotMessage(" [WIP]");
-    assertThat(r.getChange().change().isWorkInProgress()).isFalse();
-    assertUploadTag(r.getChange(), ChangeMessagesUtil.TAG_UPLOADED_PATCH_SET);
-
-    // Make the change work-in-progress again.
-    r = amendChange(r.getChangeId(), "refs/for/master%wip");
-    r.assertOkStatus();
-    r.assertMessage(" [WIP]");
-    assertThat(r.getChange().change().isWorkInProgress()).isTrue();
-    assertUploadTag(r.getChange(), ChangeMessagesUtil.TAG_UPLOADED_WIP_PATCH_SET);
-
-    // Can't use --wip and --ready together.
-    r = amendChange(r.getChangeId(), "refs/for/master%wip,ready");
-    r.assertErrorStatus();
-  }
-
-  private void assertUploadTag(ChangeData cd, String expectedTag) throws Exception {
-    List<ChangeMessage> msgs = cd.messages();
-    assertThat(msgs).isNotEmpty();
-    assertThat(Iterables.getLast(msgs).getTag()).isEqualTo(expectedTag);
-  }
-
-  @Test
-  public void pushWorkInProgressChangeWhenNotOwner() throws Exception {
-    TestRepository<?> userRepo = cloneProject(project, user);
-    PushOneCommit.Result r =
-        pushFactory.create(db, user.getIdent(), userRepo).to("refs/for/master%wip");
-    r.assertOkStatus();
-    assertThat(r.getChange().change().getOwner()).isEqualTo(user.id);
-    assertThat(r.getChange().change().isWorkInProgress()).isTrue();
-
-    // Admin user trying to move from WIP to ready should succeed.
-    GitUtil.fetch(testRepo, r.getPatchSet().getRefName() + ":ps");
-    testRepo.reset("ps");
-    r = amendChange(r.getChangeId(), "refs/for/master%ready", user, testRepo);
-    r.assertOkStatus();
-
-    // Other user trying to move from WIP to WIP should succeed.
-    r = amendChange(r.getChangeId(), "refs/for/master%wip", admin, testRepo);
-    r.assertOkStatus();
-    assertThat(r.getChange().change().isWorkInProgress()).isTrue();
-
-    // Push as change owner to move change from WIP to ready.
-    r = pushFactory.create(db, user.getIdent(), userRepo).to("refs/for/master%ready");
-    r.assertOkStatus();
-    assertThat(r.getChange().change().isWorkInProgress()).isFalse();
-
-    // Admin user trying to move from ready to WIP should succeed.
-    GitUtil.fetch(testRepo, r.getPatchSet().getRefName() + ":ps");
-    testRepo.reset("ps");
-    r = amendChange(r.getChangeId(), "refs/for/master%wip", admin, testRepo);
-    r.assertOkStatus();
-
-    // Other user trying to move from wip to wip should succeed.
-    r = amendChange(r.getChangeId(), "refs/for/master%wip", admin, testRepo);
-    r.assertOkStatus();
-
-    // Non owner, non admin and non project owner cannot flip wip bit:
-    TestAccount user2 = accountCreator.user2();
-    grant(
-        project, "refs/*", Permission.FORGE_COMMITTER, false, SystemGroupBackend.REGISTERED_USERS);
-    TestRepository<?> user2Repo = cloneProject(project, user2);
-    GitUtil.fetch(user2Repo, r.getPatchSet().getRefName() + ":ps");
-    user2Repo.reset("ps");
-    r = amendChange(r.getChangeId(), "refs/for/master%ready", user2, user2Repo);
-    r.assertErrorStatus(ReceiveConstants.ONLY_CHANGE_OWNER_OR_PROJECT_OWNER_CAN_MODIFY_WIP);
-
-    // Project owner trying to move from WIP to ready should succeed.
-    allow("refs/*", Permission.OWNER, SystemGroupBackend.REGISTERED_USERS);
-    r = amendChange(r.getChangeId(), "refs/for/master%ready", user2, user2Repo);
-    r.assertOkStatus();
-  }
-
-  @Test
-  public void pushForMasterAsEdit() throws Exception {
-    PushOneCommit.Result r = pushTo("refs/for/master");
-    r.assertOkStatus();
-    Optional<EditInfo> edit = getEdit(r.getChangeId());
-    assertThat(edit).isAbsent();
-    assertThat(query("has:edit")).isEmpty();
-
-    // specify edit as option
-    r = amendChange(r.getChangeId(), "refs/for/master%edit");
-    r.assertOkStatus();
-    edit = getEdit(r.getChangeId());
-    assertThat(edit).isPresent();
-    EditInfo editInfo = edit.get();
-    r.assertMessage(
-        "Updated Changes:\n  "
-            + canonicalWebUrl.get()
-            + "#/c/"
-            + project.get()
-            + "/+/"
-            + r.getChange().getId()
-            + " "
-            + editInfo.commit.subject
-            + " [EDIT]\n");
-
-    // verify that the re-indexing was triggered for the change
-    assertThat(query("has:edit")).hasSize(1);
-  }
-
-  @Test
-  public void pushForMasterWithMessage() throws Exception {
-    PushOneCommit.Result r = pushTo("refs/for/master/%m=my_test_message");
-    r.assertOkStatus();
-    r.assertChange(Change.Status.NEW, null);
-    ChangeInfo ci = get(r.getChangeId());
-    Collection<ChangeMessageInfo> changeMessages = ci.messages;
-    assertThat(changeMessages).hasSize(1);
-    for (ChangeMessageInfo cm : changeMessages) {
-      assertThat(cm.message).isEqualTo("Uploaded patch set 1.\nmy test message");
-    }
-    Collection<RevisionInfo> revisions = ci.revisions.values();
-    assertThat(revisions).hasSize(1);
-    for (RevisionInfo ri : revisions) {
-      assertThat(ri.description).isEqualTo("my test message");
-    }
-  }
-
-  @Test
-  public void pushForMasterWithMessageTwiceWithDifferentMessages() throws Exception {
-    enableCreateNewChangeForAllNotInTarget();
-
-    PushOneCommit push =
-        pushFactory.create(
-            db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "a.txt", "content");
-    // %2C is comma; the value below tests that percent decoding happens after splitting.
-    // All three ways of representing space ("%20", "+", and "_" are also exercised.
-    PushOneCommit.Result r = push.to("refs/for/master/%m=my_test%20+_message%2Cm=");
-    r.assertOkStatus();
-
-    push =
-        pushFactory.create(
-            db,
-            admin.getIdent(),
-            testRepo,
-            PushOneCommit.SUBJECT,
-            "b.txt",
-            "anotherContent",
-            r.getChangeId());
-    r = push.to("refs/for/master/%m=new_test_message");
-    r.assertOkStatus();
-
-    ChangeInfo ci = get(r.getChangeId());
-    Collection<RevisionInfo> revisions = ci.revisions.values();
-    assertThat(revisions).hasSize(2);
-    for (RevisionInfo ri : revisions) {
-      if (ri.isCurrent) {
-        assertThat(ri.description).isEqualTo("new test message");
-      } else {
-        assertThat(ri.description).isEqualTo("my test   message,m=");
-      }
-    }
-  }
-
-  @Test
-  public void pushForMasterWithPercentEncodedMessage() throws Exception {
-    // Exercise percent-encoding of UTF-8, underscores, and patterns reserved by git-rev-parse.
-    PushOneCommit.Result r =
-        pushTo(
-            "refs/for/master/%m="
-                + "Punctu%2E%2e%2Eation%7E%2D%40%7Bu%7D%20%7C%20%28%E2%95%AF%C2%B0%E2%96%A1%C2%B0"
-                + "%EF%BC%89%E2%95%AF%EF%B8%B5%20%E2%94%BB%E2%94%81%E2%94%BB%20%5E%5F%5E");
-    r.assertOkStatus();
-    r.assertChange(Change.Status.NEW, null);
-    ChangeInfo ci = get(r.getChangeId(), MESSAGES, ALL_REVISIONS);
-    Collection<ChangeMessageInfo> changeMessages = ci.messages;
-    assertThat(changeMessages).hasSize(1);
-    for (ChangeMessageInfo cm : changeMessages) {
-      assertThat(cm.message)
-          .isEqualTo("Uploaded patch set 1.\nPunctu...ation~-@{u} | (╯°□°）╯︵ ┻━┻ ^_^");
-    }
-    Collection<RevisionInfo> revisions = ci.revisions.values();
-    assertThat(revisions).hasSize(1);
-    for (RevisionInfo ri : revisions) {
-      assertThat(ri.description).isEqualTo("Punctu...ation~-@{u} | (╯°□°）╯︵ ┻━┻ ^_^");
-    }
-  }
-
-  @Test
-  public void pushForMasterWithInvalidPercentEncodedMessage() throws Exception {
-    PushOneCommit.Result r = pushTo("refs/for/master/%m=not_percent_decodable_%%oops%20");
-    r.assertOkStatus();
-    r.assertChange(Change.Status.NEW, null);
-    ChangeInfo ci = get(r.getChangeId(), MESSAGES, ALL_REVISIONS);
-    Collection<ChangeMessageInfo> changeMessages = ci.messages;
-    assertThat(changeMessages).hasSize(1);
-    for (ChangeMessageInfo cm : changeMessages) {
-      assertThat(cm.message).isEqualTo("Uploaded patch set 1.\nnot percent decodable %%oops%20");
-    }
-    Collection<RevisionInfo> revisions = ci.revisions.values();
-    assertThat(revisions).hasSize(1);
-    for (RevisionInfo ri : revisions) {
-      assertThat(ri.description).isEqualTo("not percent decodable %%oops%20");
-    }
-  }
-
-  @Test
-  public void pushForMasterWithApprovals() throws Exception {
-    PushOneCommit.Result r = pushTo("refs/for/master/%l=Code-Review");
-    r.assertOkStatus();
-    ChangeInfo ci = get(r.getChangeId());
-    LabelInfo cr = ci.labels.get("Code-Review");
-    assertThat(cr.all).hasSize(1);
-    assertThat(cr.all.get(0).name).isEqualTo("Administrator");
-    assertThat(cr.all.get(0).value).isEqualTo(1);
-    assertThat(Iterables.getLast(ci.messages).message)
-        .isEqualTo("Uploaded patch set 1: Code-Review+1.");
-
-    PushOneCommit push =
-        pushFactory.create(
-            db,
-            admin.getIdent(),
-            testRepo,
-            PushOneCommit.SUBJECT,
-            "b.txt",
-            "anotherContent",
-            r.getChangeId());
-    r = push.to("refs/for/master/%l=Code-Review+2");
-
-    ci = get(r.getChangeId());
-    cr = ci.labels.get("Code-Review");
-    assertThat(Iterables.getLast(ci.messages).message)
-        .isEqualTo("Uploaded patch set 2: Code-Review+2.");
-    // Check that the user who pushed the change was added as a reviewer since they added a vote
-    assertThatUserIsOnlyReviewer(ci, admin);
-
-    assertThat(cr.all).hasSize(1);
-    assertThat(cr.all.get(0).name).isEqualTo("Administrator");
-    assertThat(cr.all.get(0).value).isEqualTo(2);
-
-    push =
-        pushFactory.create(
-            db,
-            admin.getIdent(),
-            testRepo,
-            PushOneCommit.SUBJECT,
-            "c.txt",
-            "moreContent",
-            r.getChangeId());
-    r = push.to("refs/for/master/%l=Code-Review+2");
-    ci = get(r.getChangeId());
-    assertThat(Iterables.getLast(ci.messages).message).isEqualTo("Uploaded patch set 3.");
-  }
-
-  @Test
-  public void pushNewPatchSetForMasterWithApprovals() throws Exception {
-    PushOneCommit.Result r = pushTo("refs/for/master");
-    r.assertOkStatus();
-
-    PushOneCommit push =
-        pushFactory.create(
-            db,
-            admin.getIdent(),
-            testRepo,
-            PushOneCommit.SUBJECT,
-            "b.txt",
-            "anotherContent",
-            r.getChangeId());
-    r = push.to("refs/for/master/%l=Code-Review+2");
-
-    ChangeInfo ci = get(r.getChangeId());
-    LabelInfo cr = ci.labels.get("Code-Review");
-    assertThat(Iterables.getLast(ci.messages).message)
-        .isEqualTo("Uploaded patch set 2: Code-Review+2.");
-
-    // Check that the user who pushed the new patch set was added as a reviewer since they added
-    // a vote
-    assertThatUserIsOnlyReviewer(ci, admin);
-
-    assertThat(cr.all).hasSize(1);
-    assertThat(cr.all.get(0).name).isEqualTo("Administrator");
-    assertThat(cr.all.get(0).value).isEqualTo(2);
-  }
-
-  /**
-   * There was a bug that allowed a user with Forge Committer Identity access right to upload a
-   * commit and put *votes on behalf of another user* on it. This test checks that this is not
-   * possible, but that the votes that are specified on push are applied only on behalf of the
-   * uploader.
-   *
-   * <p>This particular bug only occurred when there was more than one label defined. However to
-   * test that the votes that are specified on push are applied on behalf of the uploader a single
-   * label is sufficient.
-   */
-  @Test
-  public void pushForMasterWithApprovalsForgeCommitterButNoForgeVote() throws Exception {
-    // Create a commit with "User" as author and committer
-    RevCommit c =
-        commitBuilder()
-            .author(user.getIdent())
-            .committer(user.getIdent())
-            .add(PushOneCommit.FILE_NAME, PushOneCommit.FILE_CONTENT)
-            .message(PushOneCommit.SUBJECT)
-            .create();
-
-    // Push this commit as "Administrator" (requires Forge Committer Identity)
-    pushHead(testRepo, "refs/for/master/%l=Code-Review+1", false);
-
-    // Expected Code-Review votes:
-    // 1. 0 from User (committer):
-    //    When the committer is forged, the committer is automatically added as
-    //    reviewer, hence we expect a dummy 0 vote for the committer.
-    // 2. +1 from Administrator (uploader):
-    //    On push Code-Review+1 was specified, hence we expect a +1 vote from
-    //    the uploader.
-    ChangeInfo ci = get(GitUtil.getChangeId(testRepo, c).get());
-    LabelInfo cr = ci.labels.get("Code-Review");
-    assertThat(cr.all).hasSize(2);
-    int indexAdmin = admin.fullName.equals(cr.all.get(0).name) ? 0 : 1;
-    int indexUser = indexAdmin == 0 ? 1 : 0;
-    assertThat(cr.all.get(indexAdmin).name).isEqualTo(admin.fullName);
-    assertThat(cr.all.get(indexAdmin).value.intValue()).isEqualTo(1);
-    assertThat(cr.all.get(indexUser).name).isEqualTo(user.fullName);
-    assertThat(cr.all.get(indexUser).value.intValue()).isEqualTo(0);
-    assertThat(Iterables.getLast(ci.messages).message)
-        .isEqualTo("Uploaded patch set 1: Code-Review+1.");
-    // Check that the user who pushed the change was added as a reviewer since they added a vote
-    assertThatUserIsOnlyReviewer(ci, admin);
-  }
-
-  @Test
-  public void pushWithMultipleApprovals() throws Exception {
-    LabelType Q =
-        category("Custom-Label", value(1, "Positive"), value(0, "No score"), value(-1, "Negative"));
-    ProjectConfig config = projectCache.checkedGet(project).getConfig();
-    AccountGroup.UUID anon = systemGroupBackend.getGroup(ANONYMOUS_USERS).getUUID();
-    String heads = "refs/heads/*";
-    Util.allow(config, Permission.forLabel("Custom-Label"), -1, 1, anon, heads);
-    config.getLabelSections().put(Q.getName(), Q);
-    saveProjectConfig(project, config);
-
-    RevCommit c =
-        commitBuilder()
-            .author(admin.getIdent())
-            .committer(admin.getIdent())
-            .add(PushOneCommit.FILE_NAME, PushOneCommit.FILE_CONTENT)
-            .message(PushOneCommit.SUBJECT)
-            .create();
-
-    pushHead(testRepo, "refs/for/master/%l=Code-Review+1,l=Custom-Label-1", false);
-
-    ChangeInfo ci = get(GitUtil.getChangeId(testRepo, c).get());
-    LabelInfo cr = ci.labels.get("Code-Review");
-    assertThat(cr.all).hasSize(1);
-    cr = ci.labels.get("Custom-Label");
-    assertThat(cr.all).hasSize(1);
-    // Check that the user who pushed the change was added as a reviewer since they added a vote
-    assertThatUserIsOnlyReviewer(ci, admin);
-  }
-
-  @Test
-  public void pushNewPatchsetToRefsChanges() throws Exception {
-    PushOneCommit.Result r = pushTo("refs/for/master");
-    r.assertOkStatus();
-    PushOneCommit push =
-        pushFactory.create(
-            db,
-            admin.getIdent(),
-            testRepo,
-            PushOneCommit.SUBJECT,
-            "b.txt",
-            "anotherContent",
-            r.getChangeId());
-    r = push.to("refs/changes/" + r.getChange().change().getId().get());
-    r.assertOkStatus();
-  }
-
-  @Test
-  public void pushNewPatchsetToPatchSetLockedChange() throws Exception {
-    PushOneCommit.Result r = pushTo("refs/for/master");
-    r.assertOkStatus();
-    PushOneCommit push =
-        pushFactory.create(
-            db,
-            admin.getIdent(),
-            testRepo,
-            PushOneCommit.SUBJECT,
-            "b.txt",
-            "anotherContent",
-            r.getChangeId());
-    revision(r).review(new ReviewInput().label("Patch-Set-Lock", 1));
-    r = push.to("refs/for/master");
-    r.assertErrorStatus("cannot add patch set to " + r.getChange().change().getChangeId() + ".");
-  }
-
-  @Test
-  public void pushForMasterWithApprovals_MissingLabel() throws Exception {
-    PushOneCommit.Result r = pushTo("refs/for/master/%l=Verify");
-    r.assertErrorStatus("label \"Verify\" is not a configured label");
-  }
-
-  @Test
-  public void pushForMasterWithApprovals_ValueOutOfRange() throws Exception {
-    PushOneCommit.Result r = pushTo("refs/for/master/%l=Code-Review-3");
-    r.assertErrorStatus("label \"Code-Review\": -3 is not a valid value");
-  }
-
-  @Test
-  public void pushForNonExistingBranch() throws Exception {
-    String branchName = "non-existing";
-    PushOneCommit.Result r = pushTo("refs/for/" + branchName);
-    r.assertErrorStatus("branch " + branchName + " not found");
-  }
-
-  @Test
-  public void pushForMasterWithHashtags() throws Exception {
-    // Hashtags only work when reading from NoteDB is enabled
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    // specify a single hashtag as option
-    String hashtag1 = "tag1";
-    Set<String> expected = ImmutableSet.of(hashtag1);
-    PushOneCommit.Result r = pushTo("refs/for/master%hashtag=#" + hashtag1);
-    r.assertOkStatus();
-    r.assertChange(Change.Status.NEW, null);
-
-    Set<String> hashtags = gApi.changes().id(r.getChangeId()).getHashtags();
-    assertThat(hashtags).containsExactlyElementsIn(expected);
-
-    // specify a single hashtag as option in new patch set
-    String hashtag2 = "tag2";
-    PushOneCommit push =
-        pushFactory.create(
-            db,
-            admin.getIdent(),
-            testRepo,
-            PushOneCommit.SUBJECT,
-            "b.txt",
-            "anotherContent",
-            r.getChangeId());
-    r = push.to("refs/for/master/%hashtag=" + hashtag2);
-    r.assertOkStatus();
-    expected = ImmutableSet.of(hashtag1, hashtag2);
-    hashtags = gApi.changes().id(r.getChangeId()).getHashtags();
-    assertThat(hashtags).containsExactlyElementsIn(expected);
-  }
-
-  @Test
-  public void pushForMasterWithMultipleHashtags() throws Exception {
-    // Hashtags only work when reading from NoteDB is enabled
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    // specify multiple hashtags as options
-    String hashtag1 = "tag1";
-    String hashtag2 = "tag2";
-    Set<String> expected = ImmutableSet.of(hashtag1, hashtag2);
-    PushOneCommit.Result r =
-        pushTo("refs/for/master%hashtag=#" + hashtag1 + ",hashtag=##" + hashtag2);
-    r.assertOkStatus();
-    r.assertChange(Change.Status.NEW, null);
-
-    Set<String> hashtags = gApi.changes().id(r.getChangeId()).getHashtags();
-    assertThat(hashtags).containsExactlyElementsIn(expected);
-
-    // specify multiple hashtags as options in new patch set
-    String hashtag3 = "tag3";
-    String hashtag4 = "tag4";
-    PushOneCommit push =
-        pushFactory.create(
-            db,
-            admin.getIdent(),
-            testRepo,
-            PushOneCommit.SUBJECT,
-            "b.txt",
-            "anotherContent",
-            r.getChangeId());
-    r = push.to("refs/for/master%hashtag=" + hashtag3 + ",hashtag=" + hashtag4);
-    r.assertOkStatus();
-    expected = ImmutableSet.of(hashtag1, hashtag2, hashtag3, hashtag4);
-    hashtags = gApi.changes().id(r.getChangeId()).getHashtags();
-    assertThat(hashtags).containsExactlyElementsIn(expected);
-  }
-
-  @Test
-  public void pushForMasterWithHashtagsNoteDbDisabled() throws Exception {
-    // Push with hashtags should fail when reading from NoteDb is disabled.
-    assume().that(notesMigration.readChanges()).isFalse();
-    PushOneCommit.Result r = pushTo("refs/for/master%hashtag=tag1");
-    r.assertErrorStatus("cannot add hashtags; noteDb is disabled");
-  }
-
-  @Test
-  public void pushCommitUsingSignedOffBy() throws Exception {
-    PushOneCommit push =
-        pushFactory.create(
-            db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "b.txt", "anotherContent");
-    PushOneCommit.Result r = push.to("refs/for/master");
-    r.assertOkStatus();
-
-    setUseSignedOffBy(InheritableBoolean.TRUE);
-    blockForgeCommitter(project, "refs/heads/master");
-
-    push =
-        pushFactory.create(
-            db,
-            admin.getIdent(),
-            testRepo,
-            PushOneCommit.SUBJECT
-                + String.format("\n\nSigned-off-by: %s <%s>", admin.fullName, admin.email),
-            "b.txt",
-            "anotherContent");
-    r = push.to("refs/for/master");
-    r.assertOkStatus();
-
-    push =
-        pushFactory.create(
-            db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "b.txt", "anotherContent");
-    r = push.to("refs/for/master");
-    r.assertErrorStatus("not Signed-off-by author/committer/uploader in message footer");
-  }
-
-  @Test
-  public void createNewChangeForAllNotInTarget() throws Exception {
-    enableCreateNewChangeForAllNotInTarget();
-
-    PushOneCommit push =
-        pushFactory.create(
-            db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "a.txt", "content");
-    PushOneCommit.Result r = push.to("refs/for/master");
-    r.assertOkStatus();
-
-    push =
-        pushFactory.create(
-            db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "b.txt", "anotherContent");
-    r = push.to("refs/for/master");
-    r.assertOkStatus();
-
-    gApi.projects().name(project.get()).branch("otherBranch").create(new BranchInput());
-
-    PushOneCommit.Result r2 = push.to("refs/for/otherBranch");
-    r2.assertOkStatus();
-    assertTwoChangesWithSameRevision(r);
-  }
-
-  @Test
-  public void pushChangeBasedOnChangeOfOtherUserWithCreateNewChangeForAllNotInTarget()
-      throws Exception {
-    enableCreateNewChangeForAllNotInTarget();
-
-    // create a change as admin
-    PushOneCommit push =
-        pushFactory.create(
-            db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "a.txt", "content");
-    PushOneCommit.Result r = push.to("refs/for/master");
-    r.assertOkStatus();
-    RevCommit commitChange1 = r.getCommit();
-
-    // create a second change as user (depends on the change from admin)
-    TestRepository<?> userRepo = cloneProject(project, user);
-    GitUtil.fetch(userRepo, r.getPatchSet().getRefName() + ":change");
-    userRepo.reset("change");
-    push =
-        pushFactory.create(
-            db, user.getIdent(), userRepo, PushOneCommit.SUBJECT, "b.txt", "anotherContent");
-    r = push.to("refs/for/master");
-    r.assertOkStatus();
-
-    // assert that no new change was created for the commit of the predecessor change
-    assertThat(query(commitChange1.name())).hasSize(1);
-  }
-
-  @Test
-  public void pushSameCommitTwiceUsingMagicBranchBaseOption() throws Exception {
-    grant(project, "refs/heads/master", Permission.PUSH);
-    PushOneCommit.Result rBase = pushTo("refs/heads/master");
-    rBase.assertOkStatus();
-
-    gApi.projects().name(project.get()).branch("foo").create(new BranchInput());
-
-    PushOneCommit push =
-        pushFactory.create(
-            db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "b.txt", "anotherContent");
-
-    PushOneCommit.Result r = push.to("refs/for/master");
-    r.assertOkStatus();
-
-    PushResult pr =
-        GitUtil.pushHead(testRepo, "refs/for/foo%base=" + rBase.getCommit().name(), false, false);
-    assertThat(pr.getMessages()).containsMatch("changes: .*new: 1.*done");
-
-    // BatchUpdate implementations differ in how they hook into progress monitors. We mostly just
-    // care that there is a new change.
-    assertThat(pr.getMessages()).containsMatch("changes: new: 1,( refs: 1)? done");
-    assertTwoChangesWithSameRevision(r);
-  }
-
-  @Test
-  public void pushSameCommitTwice() throws Exception {
-    ProjectConfig config = projectCache.checkedGet(project).getConfig();
-    config.getProject().setCreateNewChangeForAllNotInTarget(InheritableBoolean.TRUE);
-    saveProjectConfig(project, config);
-
-    PushOneCommit push =
-        pushFactory.create(
-            db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "a.txt", "content");
-    PushOneCommit.Result r = push.to("refs/for/master");
-    r.assertOkStatus();
-
-    push =
-        pushFactory.create(
-            db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "b.txt", "anotherContent");
-    r = push.to("refs/for/master");
-    r.assertOkStatus();
-
-    assertPushRejected(
-        pushHead(testRepo, "refs/for/master", false),
-        "refs/for/master",
-        "commit(s) already exists (as current patchset)");
-  }
-
-  @Test
-  public void pushSameCommitTwiceWhenIndexFailed() throws Exception {
-    ProjectConfig config = projectCache.checkedGet(project).getConfig();
-    config.getProject().setCreateNewChangeForAllNotInTarget(InheritableBoolean.TRUE);
-    saveProjectConfig(project, config);
-
-    PushOneCommit push =
-        pushFactory.create(
-            db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "a.txt", "content");
-    PushOneCommit.Result r = push.to("refs/for/master");
-    r.assertOkStatus();
-
-    push =
-        pushFactory.create(
-            db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "b.txt", "anotherContent");
-    r = push.to("refs/for/master");
-    r.assertOkStatus();
-
-    indexer.delete(r.getChange().getId());
-
-    assertPushRejected(
-        pushHead(testRepo, "refs/for/master", false),
-        "refs/for/master",
-        "commit(s) already exists (as current patchset)");
-  }
-
-  private void assertTwoChangesWithSameRevision(PushOneCommit.Result result) throws Exception {
-    List<ChangeInfo> changes = query(result.getCommit().name());
-    assertThat(changes).hasSize(2);
-    ChangeInfo c1 = get(changes.get(0).id);
-    ChangeInfo c2 = get(changes.get(1).id);
-    assertThat(c1.project).isEqualTo(c2.project);
-    assertThat(c1.branch).isNotEqualTo(c2.branch);
-    assertThat(c1.changeId).isEqualTo(c2.changeId);
-    assertThat(c1.currentRevision).isEqualTo(c2.currentRevision);
-  }
-
-  @Test
-  public void pushAFewChanges() throws Exception {
-    testPushAFewChanges();
-  }
-
-  @Test
-  public void pushAFewChangesWithCreateNewChangeForAllNotInTarget() throws Exception {
-    enableCreateNewChangeForAllNotInTarget();
-    testPushAFewChanges();
-  }
-
-  private void testPushAFewChanges() throws Exception {
-    int n = 10;
-    String r = "refs/for/master";
-    ObjectId initialHead = testRepo.getRepository().resolve("HEAD");
-    List<RevCommit> commits = createChanges(n, r);
-
-    // Check that a change was created for each.
-    for (RevCommit c : commits) {
-      assertThat(byCommit(c).change().getSubject())
-          .named("change for " + c.name())
-          .isEqualTo(c.getShortMessage());
-    }
-
-    List<RevCommit> commits2 = amendChanges(initialHead, commits, r);
-
-    // Check that there are correct patch sets.
-    for (int i = 0; i < n; i++) {
-      RevCommit c = commits.get(i);
-      RevCommit c2 = commits2.get(i);
-      String name = "change for " + c2.name();
-      ChangeData cd = byCommit(c);
-      assertThat(cd.change().getSubject()).named(name).isEqualTo(c2.getShortMessage());
-      assertThat(getPatchSetRevisions(cd))
-          .named(name)
-          .containsExactlyEntriesIn(ImmutableMap.of(1, c.name(), 2, c2.name()));
-    }
-
-    // Pushing again results in "no new changes".
-    assertPushRejected(pushHead(testRepo, r, false), r, "no new changes");
-  }
-
-  @Test
-  public void pushWithoutChangeId() throws Exception {
-    testPushWithoutChangeId();
-  }
-
-  @Test
-  public void pushWithoutChangeIdWithCreateNewChangeForAllNotInTarget() throws Exception {
-    enableCreateNewChangeForAllNotInTarget();
-    testPushWithoutChangeId();
-  }
-
-  private void testPushWithoutChangeId() throws Exception {
-    RevCommit c = createCommit(testRepo, "Message without Change-Id");
-    assertThat(GitUtil.getChangeId(testRepo, c)).isEmpty();
-    pushForReviewRejected(testRepo, "missing Change-Id in message footer");
-
-    setRequireChangeId(InheritableBoolean.FALSE);
-    pushForReviewOk(testRepo);
-  }
-
-  @Test
-  public void pushWithMultipleChangeIds() throws Exception {
-    testPushWithMultipleChangeIds();
-  }
-
-  @Test
-  public void pushWithMultipleChangeIdsWithCreateNewChangeForAllNotInTarget() throws Exception {
-    enableCreateNewChangeForAllNotInTarget();
-    testPushWithMultipleChangeIds();
-  }
-
-  private void testPushWithMultipleChangeIds() throws Exception {
-    createCommit(
-        testRepo,
-        "Message with multiple Change-Id\n"
-            + "\n"
-            + "Change-Id: I10f98c2ef76e52e23aa23be5afeb71e40b350e86\n"
-            + "Change-Id: Ie9a132e107def33bdd513b7854b50de911edba0a\n");
-    pushForReviewRejected(testRepo, "multiple Change-Id lines in message footer");
-
-    setRequireChangeId(InheritableBoolean.FALSE);
-    pushForReviewRejected(testRepo, "multiple Change-Id lines in message footer");
-  }
-
-  @Test
-  public void pushWithInvalidChangeId() throws Exception {
-    testpushWithInvalidChangeId();
-  }
-
-  @Test
-  public void pushWithInvalidChangeIdWithCreateNewChangeForAllNotInTarget() throws Exception {
-    enableCreateNewChangeForAllNotInTarget();
-    testpushWithInvalidChangeId();
-  }
-
-  private void testpushWithInvalidChangeId() throws Exception {
-    createCommit(testRepo, "Message with invalid Change-Id\n\nChange-Id: X\n");
-    pushForReviewRejected(testRepo, "invalid Change-Id line format in message footer");
-
-    setRequireChangeId(InheritableBoolean.FALSE);
-    pushForReviewRejected(testRepo, "invalid Change-Id line format in message footer");
-  }
-
-  @Test
-  public void pushWithInvalidChangeIdFromEgit() throws Exception {
-    testPushWithInvalidChangeIdFromEgit();
-  }
-
-  @Test
-  public void pushWithInvalidChangeIdFromEgitWithCreateNewChangeForAllNotInTarget()
-      throws Exception {
-    enableCreateNewChangeForAllNotInTarget();
-    testPushWithInvalidChangeIdFromEgit();
-  }
-
-  private void testPushWithInvalidChangeIdFromEgit() throws Exception {
-    createCommit(
-        testRepo,
-        "Message with invalid Change-Id\n"
-            + "\n"
-            + "Change-Id: I0000000000000000000000000000000000000000\n");
-    pushForReviewRejected(testRepo, "invalid Change-Id line format in message footer");
-
-    setRequireChangeId(InheritableBoolean.FALSE);
-    pushForReviewRejected(testRepo, "invalid Change-Id line format in message footer");
-  }
-
-  @Test
-  public void pushWithChangeIdInSubjectLine() throws Exception {
-    createCommit(testRepo, "Change-Id: I1234000000000000000000000000000000000000");
-    pushForReviewRejected(testRepo, "missing subject; Change-Id must be in message footer");
-
-    setRequireChangeId(InheritableBoolean.FALSE);
-    pushForReviewRejected(testRepo, "missing subject; Change-Id must be in message footer");
-  }
-
-  @Test
-  public void pushCommitWithSameChangeIdAsPredecessorChange() throws Exception {
-    PushOneCommit push =
-        pushFactory.create(
-            db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "a.txt", "content");
-    PushOneCommit.Result r = push.to("refs/for/master");
-    r.assertOkStatus();
-    RevCommit commitChange1 = r.getCommit();
-
-    createCommit(testRepo, commitChange1.getFullMessage());
-
-    pushForReviewRejected(
-        testRepo,
-        "same Change-Id in multiple changes.\n"
-            + "Squash the commits with the same Change-Id or ensure Change-Ids are unique for each"
-            + " commit");
-
-    ProjectConfig config = projectCache.checkedGet(project).getConfig();
-    config.getProject().setRequireChangeID(InheritableBoolean.FALSE);
-    saveProjectConfig(project, config);
-
-    pushForReviewRejected(
-        testRepo,
-        "same Change-Id in multiple changes.\n"
-            + "Squash the commits with the same Change-Id or ensure Change-Ids are unique for each"
-            + " commit");
-  }
-
-  @Test
-  public void pushTwoCommitWithSameChangeId() throws Exception {
-    RevCommit commitChange1 = createCommitWithChangeId(testRepo, "some change");
-
-    createCommit(testRepo, commitChange1.getFullMessage());
-
-    pushForReviewRejected(
-        testRepo,
-        "same Change-Id in multiple changes.\n"
-            + "Squash the commits with the same Change-Id or ensure Change-Ids are unique for each"
-            + " commit");
-
-    ProjectConfig config = projectCache.checkedGet(project).getConfig();
-    config.getProject().setRequireChangeID(InheritableBoolean.FALSE);
-    saveProjectConfig(project, config);
-
-    pushForReviewRejected(
-        testRepo,
-        "same Change-Id in multiple changes.\n"
-            + "Squash the commits with the same Change-Id or ensure Change-Ids are unique for each"
-            + " commit");
-  }
-
-  private static RevCommit createCommit(TestRepository<?> testRepo, String message)
-      throws Exception {
-    return testRepo.branch("HEAD").commit().message(message).add("a.txt", "content").create();
-  }
-
-  private static RevCommit createCommitWithChangeId(TestRepository<?> testRepo, String message)
-      throws Exception {
-    RevCommit c =
-        testRepo
-            .branch("HEAD")
-            .commit()
-            .message(message)
-            .insertChangeId()
-            .add("a.txt", "content")
-            .create();
-    return testRepo.getRevWalk().parseCommit(c);
-  }
-
-  @Test
-  public void cantAutoCloseChangeAlreadyMergedToBranch() throws Exception {
-    PushOneCommit.Result r1 = createChange();
-    Change.Id id1 = r1.getChange().getId();
-    PushOneCommit.Result r2 = createChange();
-    Change.Id id2 = r2.getChange().getId();
-
-    // Merge change 1 behind Gerrit's back.
-    try (Repository repo = repoManager.openRepository(project)) {
-      TestRepository<?> tr = new TestRepository<>(repo);
-      tr.branch("refs/heads/master").update(r1.getCommit());
-    }
-
-    assertThat(gApi.changes().id(id1.get()).info().status).isEqualTo(ChangeStatus.NEW);
-    assertThat(gApi.changes().id(id2.get()).info().status).isEqualTo(ChangeStatus.NEW);
-    r2 = amendChange(r2.getChangeId());
-    r2.assertOkStatus();
-
-    // Change 1 is still new despite being merged into the branch, because
-    // ReceiveCommits only considers commits between the branch tip (which is
-    // now the merged change 1) and the push tip (new patch set of change 2).
-    assertThat(gApi.changes().id(id1.get()).info().status).isEqualTo(ChangeStatus.NEW);
-    assertThat(gApi.changes().id(id2.get()).info().status).isEqualTo(ChangeStatus.NEW);
-  }
-
-  @Test
-  public void accidentallyPushNewPatchSetDirectlyToBranchAndRecoverByPushingToRefsChanges()
-      throws Exception {
-    Change.Id id = accidentallyPushNewPatchSetDirectlyToBranch();
-    ChangeData cd = byChangeId(id);
-    String ps1Rev = Iterables.getOnlyElement(cd.patchSets()).getRevision().get();
-
-    String r = "refs/changes/" + id;
-    assertPushOk(pushHead(testRepo, r, false), r);
-
-    // Added a new patch set and auto-closed the change.
-    cd = byChangeId(id);
-    assertThat(cd.change().getStatus()).isEqualTo(Change.Status.MERGED);
-    assertThat(getPatchSetRevisions(cd))
-        .containsExactlyEntriesIn(
-            ImmutableMap.of(1, ps1Rev, 2, testRepo.getRepository().resolve("HEAD").name()));
-  }
-
-  @Test
-  public void accidentallyPushNewPatchSetDirectlyToBranchAndCantRecoverByPushingToRefsFor()
-      throws Exception {
-    Change.Id id = accidentallyPushNewPatchSetDirectlyToBranch();
-    ChangeData cd = byChangeId(id);
-    String ps1Rev = Iterables.getOnlyElement(cd.patchSets()).getRevision().get();
-
-    String r = "refs/for/master";
-    assertPushRejected(pushHead(testRepo, r, false), r, "no new changes");
-
-    // Change not updated.
-    cd = byChangeId(id);
-    assertThat(cd.change().getStatus()).isEqualTo(Change.Status.NEW);
-    assertThat(getPatchSetRevisions(cd)).containsExactlyEntriesIn(ImmutableMap.of(1, ps1Rev));
-  }
-
-  @Test
-  public void forcePushAbandonedChange() throws Exception {
-    grant(project, "refs/*", Permission.PUSH, true);
-    PushOneCommit push1 =
-        pushFactory.create(db, admin.getIdent(), testRepo, "change1", "a.txt", "content");
-    PushOneCommit.Result r = push1.to("refs/for/master");
-    r.assertOkStatus();
-
-    // abandon the change
-    String changeId = r.getChangeId();
-    assertThat(info(changeId).status).isEqualTo(ChangeStatus.NEW);
-    gApi.changes().id(changeId).abandon();
-    ChangeInfo info = get(changeId);
-    assertThat(info.status).isEqualTo(ChangeStatus.ABANDONED);
-
-    push1.setForce(true);
-    PushOneCommit.Result r1 = push1.to("refs/heads/master");
-    r1.assertOkStatus();
-    ChangeInfo result = Iterables.getOnlyElement(gApi.changes().query(r.getChangeId()).get());
-    assertThat(result.status).isEqualTo(ChangeStatus.MERGED);
-  }
-
-  private Change.Id accidentallyPushNewPatchSetDirectlyToBranch() throws Exception {
-    PushOneCommit.Result r = createChange();
-    RevCommit ps1Commit = r.getCommit();
-    Change c = r.getChange().change();
-
-    RevCommit ps2Commit;
-    try (Repository repo = repoManager.openRepository(project)) {
-      // Create a new patch set of the change directly in Gerrit's repository,
-      // without pushing it. In reality it's more likely that the client would
-      // create and push this behind Gerrit's back (e.g. an admin accidentally
-      // using direct ssh access to the repo), but that's harder to do in tests.
-      TestRepository<?> tr = new TestRepository<>(repo);
-      ps2Commit =
-          tr.branch("refs/heads/master")
-              .commit()
-              .message(ps1Commit.getShortMessage() + " v2")
-              .insertChangeId(r.getChangeId().substring(1))
-              .create();
-    }
-
-    testRepo.git().fetch().setRefSpecs(new RefSpec("refs/heads/master")).call();
-    testRepo.reset(ps2Commit);
-
-    ChangeData cd = byCommit(ps1Commit);
-    assertThat(cd.change().getStatus()).isEqualTo(Change.Status.NEW);
-    assertThat(getPatchSetRevisions(cd))
-        .containsExactlyEntriesIn(ImmutableMap.of(1, ps1Commit.name()));
-    return c.getId();
-  }
-
-  @Test
-  public void pushWithEmailInFooter() throws Exception {
-    pushWithReviewerInFooter(user.emailAddress.toString(), user);
-  }
-
-  @Test
-  public void pushWithNameInFooter() throws Exception {
-    pushWithReviewerInFooter(user.fullName, user);
-  }
-
-  @Test
-  public void pushWithEmailInFooterNotFound() throws Exception {
-    pushWithReviewerInFooter(new Address("No Body", "notarealuser@example.com").toString(), null);
-  }
-
-  @Test
-  public void pushWithNameInFooterNotFound() throws Exception {
-    pushWithReviewerInFooter("Notauser", null);
-  }
-
-  @Test
-  public void pushNewPatchsetOverridingStickyLabel() throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    LabelType codeReview = Util.codeReview();
-    codeReview.setCopyMaxScore(true);
-    cfg.getLabelSections().put(codeReview.getName(), codeReview);
-    saveProjectConfig(cfg);
-
-    PushOneCommit.Result r = pushTo("refs/for/master%l=Code-Review+2");
-    r.assertOkStatus();
-    PushOneCommit push =
-        pushFactory.create(
-            db,
-            admin.getIdent(),
-            testRepo,
-            PushOneCommit.SUBJECT,
-            "b.txt",
-            "anotherContent",
-            r.getChangeId());
-    r = push.to("refs/for/master%l=Code-Review+1");
-    r.assertOkStatus();
-  }
-
-  @Test
-  public void createChangeForMergedCommit() throws Exception {
-    String master = "refs/heads/master";
-    grant(project, master, Permission.PUSH, true);
-
-    // Update master with a direct push.
-    RevCommit c1 = testRepo.commit().message("Non-change 1").create();
-    RevCommit c2 =
-        testRepo.parseBody(
-            testRepo.commit().parent(c1).message("Non-change 2").insertChangeId().create());
-    String changeId = Iterables.getOnlyElement(c2.getFooterLines(CHANGE_ID));
-
-    testRepo.reset(c2);
-    assertPushOk(pushHead(testRepo, master, false, true), master);
-
-    String q = "commit:" + c1.name() + " OR commit:" + c2.name() + " OR change:" + changeId;
-    assertThat(gApi.changes().query(q).get()).isEmpty();
-
-    // Push c2 as a merged change.
-    String r = "refs/for/master%merged";
-    assertPushOk(pushHead(testRepo, r, false), r);
-
-    EnumSet<ListChangesOption> opts = EnumSet.of(ListChangesOption.CURRENT_REVISION);
-    ChangeInfo info = gApi.changes().id(changeId).get(opts);
-    assertThat(info.currentRevision).isEqualTo(c2.name());
-    assertThat(info.status).isEqualTo(ChangeStatus.MERGED);
-
-    // Only c2 was created as a change.
-    String q1 = "commit: " + c1.name();
-    assertThat(gApi.changes().query(q1).get()).isEmpty();
-
-    // Push c1 as a merged change.
-    testRepo.reset(c1);
-    assertPushOk(pushHead(testRepo, r, false), r);
-    List<ChangeInfo> infos = gApi.changes().query(q1).withOptions(opts).get();
-    assertThat(infos).hasSize(1);
-    info = infos.get(0);
-    assertThat(info.currentRevision).isEqualTo(c1.name());
-    assertThat(info.status).isEqualTo(ChangeStatus.MERGED);
-  }
-
-  @Test
-  public void mergedOptionFailsWhenCommitIsNotMerged() throws Exception {
-    PushOneCommit.Result r = pushTo("refs/for/master%merged");
-    r.assertErrorStatus("not merged into branch");
-  }
-
-  @Test
-  public void mergedOptionFailsWhenCommitIsMergedOnOtherBranch() throws Exception {
-    PushOneCommit.Result r = pushTo("refs/for/master");
-    r.assertOkStatus();
-    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve());
-    gApi.changes().id(r.getChangeId()).current().submit();
-
-    try (Repository repo = repoManager.openRepository(project)) {
-      TestRepository<?> tr = new TestRepository<>(repo);
-      tr.branch("refs/heads/branch").commit().message("Initial commit on branch").create();
-    }
-
-    pushTo("refs/for/master%merged").assertErrorStatus("not merged into branch");
-  }
-
-  @Test
-  public void mergedOptionFailsWhenChangeExists() throws Exception {
-    PushOneCommit.Result r = pushTo("refs/for/master");
-    r.assertOkStatus();
-    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve());
-    gApi.changes().id(r.getChangeId()).current().submit();
-
-    testRepo.reset(r.getCommit());
-    String ref = "refs/for/master%merged";
-    PushResult pr = pushHead(testRepo, ref, false);
-    RemoteRefUpdate rru = pr.getRemoteUpdate(ref);
-    assertThat(rru.getStatus()).isEqualTo(RemoteRefUpdate.Status.REJECTED_OTHER_REASON);
-    assertThat(rru.getMessage()).contains("no new changes");
-  }
-
-  @Test
-  public void mergedOptionWithNewCommitWithSameChangeIdFails() throws Exception {
-    PushOneCommit.Result r = pushTo("refs/for/master");
-    r.assertOkStatus();
-    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve());
-    gApi.changes().id(r.getChangeId()).current().submit();
-
-    RevCommit c2 =
-        testRepo
-            .amend(r.getCommit())
-            .message("New subject")
-            .insertChangeId(r.getChangeId().substring(1))
-            .create();
-    testRepo.reset(c2);
-
-    String ref = "refs/for/master%merged";
-    PushResult pr = pushHead(testRepo, ref, false);
-    RemoteRefUpdate rru = pr.getRemoteUpdate(ref);
-    assertThat(rru.getStatus()).isEqualTo(RemoteRefUpdate.Status.REJECTED_OTHER_REASON);
-    assertThat(rru.getMessage()).contains("not merged into branch");
-  }
-
-  @Test
-  public void mergedOptionWithExistingChangeInsertsPatchSet() throws Exception {
-    String master = "refs/heads/master";
-    grant(project, master, Permission.PUSH, true);
-
-    PushOneCommit.Result r = pushTo("refs/for/master");
-    r.assertOkStatus();
-    ObjectId c1 = r.getCommit().copy();
-
-    // Create a PS2 commit directly on master in the server's repo. This
-    // simulates the client amending locally and pushing directly to the branch,
-    // expecting the change to be auto-closed, but the change metadata update
-    // fails.
-    ObjectId c2;
-    try (Repository repo = repoManager.openRepository(project)) {
-      TestRepository<?> tr = new TestRepository<>(repo);
-      RevCommit commit2 =
-          tr.amend(c1).message("New subject").insertChangeId(r.getChangeId().substring(1)).create();
-      c2 = commit2.copy();
-      tr.update(master, c2);
-    }
-
-    testRepo.git().fetch().setRefSpecs(new RefSpec("refs/heads/master")).call();
-    testRepo.reset(c2);
-
-    String ref = "refs/for/master%merged";
-    assertPushOk(pushHead(testRepo, ref, false), ref);
-
-    ChangeInfo info = gApi.changes().id(r.getChangeId()).get(ALL_REVISIONS);
-    assertThat(info.currentRevision).isEqualTo(c2.name());
-    assertThat(info.revisions.keySet()).containsExactly(c1.name(), c2.name());
-    // TODO(dborowitz): Fix ReceiveCommits to also auto-close the change.
-    assertThat(info.status).isEqualTo(ChangeStatus.NEW);
-  }
-
-  @Test
-  public void publishCommentsOnPushPublishesDraftsOnAllRevisions() throws Exception {
-    PushOneCommit.Result r = createChange();
-    String rev1 = r.getCommit().name();
-    CommentInfo c1 = addDraft(r.getChangeId(), rev1, newDraft(FILE_NAME, 1, "comment1"));
-    CommentInfo c2 = addDraft(r.getChangeId(), rev1, newDraft(FILE_NAME, 1, "comment2"));
-
-    r = amendChange(r.getChangeId());
-    String rev2 = r.getCommit().name();
-    CommentInfo c3 = addDraft(r.getChangeId(), rev2, newDraft(FILE_NAME, 1, "comment3"));
-
-    assertThat(getPublishedComments(r.getChangeId())).isEmpty();
-
-    gApi.changes().id(r.getChangeId()).addReviewer(user.email);
-    sender.clear();
-    amendChange(r.getChangeId(), "refs/for/master%publish-comments");
-
-    Collection<CommentInfo> comments = getPublishedComments(r.getChangeId());
-    assertThat(comments.stream().map(c -> c.id)).containsExactly(c1.id, c2.id, c3.id);
-    assertThat(comments.stream().map(c -> c.message))
-        .containsExactly("comment1", "comment2", "comment3");
-    assertThat(getLastMessage(r.getChangeId())).isEqualTo("Uploaded patch set 3.\n\n(3 comments)");
-
-    List<String> messages =
-        sender.getMessages().stream()
-            .map(m -> m.body())
-            .sorted(Comparator.comparingInt(m -> m.contains("reexamine") ? 0 : 1))
-            .collect(toList());
-    assertThat(messages).hasSize(2);
-
-    assertThat(messages.get(0)).contains("Gerrit-MessageType: newpatchset");
-    assertThat(messages.get(0)).contains("I'd like you to reexamine a change");
-    assertThat(messages.get(0)).doesNotContain("Uploaded patch set 3");
-
-    assertThat(messages.get(1)).contains("Gerrit-MessageType: comment");
-    assertThat(messages.get(1))
-        .containsMatch(
-            Pattern.compile(
-                // A little weird that the comment email contains this text, but it's actually
-                // what's in the ChangeMessage. Really we should fuse the emails into one, but until
-                // then, this test documents the current behavior.
-                "Uploaded patch set 3\\.\n"
-                    + "\n"
-                    + "\\(3 comments\\)\\n.*"
-                    + "PS1, Line 1:.*"
-                    + "comment1\\n.*"
-                    + "PS1, Line 1:.*"
-                    + "comment2\\n.*"
-                    + "PS2, Line 1:.*"
-                    + "comment3\\n",
-                Pattern.DOTALL));
-  }
-
-  @Test
-  public void publishCommentsOnPushWithMessage() throws Exception {
-    PushOneCommit.Result r = createChange();
-    String rev = r.getCommit().name();
-    addDraft(r.getChangeId(), rev, newDraft(FILE_NAME, 1, "comment1"));
-
-    r = amendChange(r.getChangeId(), "refs/for/master%publish-comments,m=The_message");
-
-    Collection<CommentInfo> comments = getPublishedComments(r.getChangeId());
-    assertThat(comments.stream().map(c -> c.message)).containsExactly("comment1");
-    assertThat(getLastMessage(r.getChangeId()))
-        .isEqualTo("Uploaded patch set 2.\n\n(1 comment)\n\nThe message");
-  }
-
-  @Test
-  public void publishCommentsOnPushPublishesDraftsOnMultipleChanges() throws Exception {
-    ObjectId initialHead = testRepo.getRepository().resolve("HEAD");
-    List<RevCommit> commits = createChanges(2, "refs/for/master");
-    String id1 = byCommit(commits.get(0)).change().getKey().get();
-    String id2 = byCommit(commits.get(1)).change().getKey().get();
-    CommentInfo c1 = addDraft(id1, commits.get(0).name(), newDraft(FILE_NAME, 1, "comment1"));
-    CommentInfo c2 = addDraft(id2, commits.get(1).name(), newDraft(FILE_NAME, 1, "comment2"));
-
-    assertThat(getPublishedComments(id1)).isEmpty();
-    assertThat(getPublishedComments(id2)).isEmpty();
-
-    amendChanges(initialHead, commits, "refs/for/master%publish-comments");
-
-    Collection<CommentInfo> cs1 = getPublishedComments(id1);
-    assertThat(cs1.stream().map(c -> c.message)).containsExactly("comment1");
-    assertThat(cs1.stream().map(c -> c.id)).containsExactly(c1.id);
-    assertThat(getLastMessage(id1))
-        .isEqualTo("Uploaded patch set 2: Commit message was updated.\n\n(1 comment)");
-
-    Collection<CommentInfo> cs2 = getPublishedComments(id2);
-    assertThat(cs2.stream().map(c -> c.message)).containsExactly("comment2");
-    assertThat(cs2.stream().map(c -> c.id)).containsExactly(c2.id);
-    assertThat(getLastMessage(id2))
-        .isEqualTo("Uploaded patch set 2: Commit message was updated.\n\n(1 comment)");
-  }
-
-  @Test
-  public void publishCommentsOnPushOnlyPublishesDraftsOnUpdatedChanges() throws Exception {
-    PushOneCommit.Result r1 = createChange();
-    PushOneCommit.Result r2 = createChange();
-    String id1 = r1.getChangeId();
-    String id2 = r2.getChangeId();
-    addDraft(id1, r1.getCommit().name(), newDraft(FILE_NAME, 1, "comment1"));
-    CommentInfo c2 = addDraft(id2, r2.getCommit().name(), newDraft(FILE_NAME, 1, "comment2"));
-
-    assertThat(getPublishedComments(id1)).isEmpty();
-    assertThat(getPublishedComments(id2)).isEmpty();
-
-    r2 = amendChange(id2, "refs/for/master%publish-comments");
-
-    assertThat(getPublishedComments(id1)).isEmpty();
-    assertThat(gApi.changes().id(id1).drafts()).hasSize(1);
-
-    Collection<CommentInfo> cs2 = getPublishedComments(id2);
-    assertThat(cs2.stream().map(c -> c.message)).containsExactly("comment2");
-    assertThat(cs2.stream().map(c -> c.id)).containsExactly(c2.id);
-
-    assertThat(getLastMessage(id1)).doesNotMatch("[Cc]omment");
-    assertThat(getLastMessage(id2)).isEqualTo("Uploaded patch set 2.\n\n(1 comment)");
-  }
-
-  @Test
-  public void publishCommentsOnPushWithPreference() throws Exception {
-    PushOneCommit.Result r = createChange();
-    addDraft(r.getChangeId(), r.getCommit().name(), newDraft(FILE_NAME, 1, "comment1"));
-    r = amendChange(r.getChangeId());
-
-    assertThat(getPublishedComments(r.getChangeId())).isEmpty();
-
-    GeneralPreferencesInfo prefs = gApi.accounts().id(admin.id.get()).getPreferences();
-    prefs.publishCommentsOnPush = true;
-    gApi.accounts().id(admin.id.get()).setPreferences(prefs);
-
-    r = amendChange(r.getChangeId());
-    assertThat(getPublishedComments(r.getChangeId()).stream().map(c -> c.message))
-        .containsExactly("comment1");
-  }
-
-  @Test
-  public void publishCommentsOnPushOverridingPreference() throws Exception {
-    PushOneCommit.Result r = createChange();
-    addDraft(r.getChangeId(), r.getCommit().name(), newDraft(FILE_NAME, 1, "comment1"));
-
-    GeneralPreferencesInfo prefs = gApi.accounts().id(admin.id.get()).getPreferences();
-    prefs.publishCommentsOnPush = true;
-    gApi.accounts().id(admin.id.get()).setPreferences(prefs);
-
-    r = amendChange(r.getChangeId(), "refs/for/master%no-publish-comments");
-
-    assertThat(getPublishedComments(r.getChangeId())).isEmpty();
-  }
-
-  @Test
-  public void pushWithDraftOptionIsDisabledPerDefault() throws Exception {
-    for (String ref : ImmutableSet.of("refs/drafts/master", "refs/for/master%draft")) {
-      PushOneCommit.Result r = pushTo(ref);
-      r.assertErrorStatus();
-      r.assertMessage("draft workflow is disabled");
-    }
-  }
-
-  @GerritConfig(name = "change.allowDrafts", value = "true")
-  @Test
-  public void pushDraftGetsPrivateChange() throws Exception {
-    String changeId1 = createChange("refs/drafts/master").getChangeId();
-    String changeId2 = createChange("refs/for/master%draft").getChangeId();
-
-    ChangeInfo info1 = gApi.changes().id(changeId1).get();
-    ChangeInfo info2 = gApi.changes().id(changeId2).get();
-
-    assertThat(info1.status).isEqualTo(ChangeStatus.NEW);
-    assertThat(info2.status).isEqualTo(ChangeStatus.NEW);
-    assertThat(info1.isPrivate).isEqualTo(true);
-    assertThat(info2.isPrivate).isEqualTo(true);
-    assertThat(info1.revisions).hasSize(1);
-    assertThat(info2.revisions).hasSize(1);
-  }
-
-  @GerritConfig(name = "change.allowDrafts", value = "true")
-  @Sandboxed
-  @Test
-  public void pushWithDraftOptionToExistingNewChangeGetsChangeEdit() throws Exception {
-    String changeId = createChange().getChangeId();
-    EditInfoSubject.assertThat(getEdit(changeId)).isAbsent();
-
-    ChangeInfo changeInfo = gApi.changes().id(changeId).get();
-    ChangeStatus originalChangeStatus = changeInfo.status;
-
-    PushOneCommit.Result result = amendChange(changeId, "refs/drafts/master");
-    result.assertOkStatus();
-
-    changeInfo = gApi.changes().id(changeId).get();
-    assertThat(changeInfo.status).isEqualTo(originalChangeStatus);
-    assertThat(changeInfo.isPrivate).isNull();
-    assertThat(changeInfo.revisions).hasSize(1);
-
-    EditInfoSubject.assertThat(getEdit(changeId)).isPresent();
-  }
-
-  @GerritConfig(name = "receive.maxBatchCommits", value = "2")
-  @Test
-  public void maxBatchCommits() throws Exception {
-    List<RevCommit> commits = new ArrayList<>();
-    commits.addAll(initChanges(2));
-    String master = "refs/heads/master";
-    assertPushOk(pushHead(testRepo, master), master);
-
-    commits.addAll(initChanges(3));
-    assertPushRejected(pushHead(testRepo, master), master, "too many commits");
-
-    grantSkipValidation(project, master, SystemGroupBackend.REGISTERED_USERS);
-    PushResult r =
-        pushHead(testRepo, master, false, false, ImmutableList.of(PUSH_OPTION_SKIP_VALIDATION));
-    assertPushOk(r, master);
-
-    // No open changes; branch was advanced.
-    String q = commits.stream().map(ObjectId::name).collect(joining(" OR commit:", "commit:", ""));
-    assertThat(gApi.changes().query(q).get()).isEmpty();
-    assertThat(gApi.projects().name(project.get()).branch(master).get().revision)
-        .isEqualTo(Iterables.getLast(commits).name());
-  }
-
-  @Test
-  public void pushToPublishMagicBranchIsAllowed() throws Exception {
-    // Push to "refs/publish/*" will be a synonym of "refs/for/*".
-    createChange("refs/publish/master");
-    PushOneCommit.Result result = pushTo("refs/publish/master");
-    result.assertOkStatus();
-    assertThat(result.getMessage())
-        .endsWith("Pushing to refs/publish/* is deprecated, use refs/for/* instead.\n");
-  }
-
-  private DraftInput newDraft(String path, int line, String message) {
-    DraftInput d = new DraftInput();
-    d.path = path;
-    d.side = Side.REVISION;
-    d.line = line;
-    d.message = message;
-    d.unresolved = true;
-    return d;
-  }
-
-  private CommentInfo addDraft(String changeId, String revId, DraftInput in) throws Exception {
-    return gApi.changes().id(changeId).revision(revId).createDraft(in).get();
-  }
-
-  private Collection<CommentInfo> getPublishedComments(String changeId) throws Exception {
-    return gApi.changes().id(changeId).comments().values().stream()
-        .flatMap(cs -> cs.stream())
-        .collect(toList());
-  }
-
-  private String getLastMessage(String changeId) throws Exception {
-    return Streams.findLast(
-            gApi.changes().id(changeId).get(MESSAGES).messages.stream().map(m -> m.message))
-        .get();
-  }
-
-  private void assertThatUserIsOnlyReviewer(ChangeInfo ci, TestAccount reviewer) {
-    assertThat(ci.reviewers).isNotNull();
-    assertThat(ci.reviewers.keySet()).containsExactly(ReviewerState.REVIEWER);
-    assertThat(ci.reviewers.get(ReviewerState.REVIEWER).iterator().next().email)
-        .isEqualTo(reviewer.email);
-  }
-
-  private void pushWithReviewerInFooter(String nameEmail, TestAccount expectedReviewer)
-      throws Exception {
-    int n = 5;
-    String r = "refs/for/master";
-    ObjectId initialHead = testRepo.getRepository().resolve("HEAD");
-    List<RevCommit> commits = createChanges(n, r, ImmutableList.of("Acked-By: " + nameEmail));
-    for (int i = 0; i < n; i++) {
-      RevCommit c = commits.get(i);
-      ChangeData cd = byCommit(c);
-      String name = "reviewers for " + (i + 1);
-      if (expectedReviewer != null) {
-        assertThat(cd.reviewers().all()).named(name).containsExactly(expectedReviewer.getId());
-        gApi.changes().id(cd.getId().get()).reviewer(expectedReviewer.getId().toString()).remove();
-      }
-      assertThat(byCommit(c).reviewers().all()).named(name).isEmpty();
-    }
-
-    List<RevCommit> commits2 = amendChanges(initialHead, commits, r);
-    for (int i = 0; i < n; i++) {
-      RevCommit c = commits2.get(i);
-      ChangeData cd = byCommit(c);
-      String name = "reviewers for " + (i + 1);
-      if (expectedReviewer != null) {
-        assertThat(cd.reviewers().all()).named(name).containsExactly(expectedReviewer.getId());
-      } else {
-        assertThat(byCommit(c).reviewers().all()).named(name).isEmpty();
-      }
-    }
-  }
-
-  private List<RevCommit> createChanges(int n, String refsFor) throws Exception {
-    return createChanges(n, refsFor, ImmutableList.of());
-  }
-
-  private List<RevCommit> createChanges(int n, String refsFor, List<String> footerLines)
-      throws Exception {
-    List<RevCommit> commits = initChanges(n, footerLines);
-    assertPushOk(pushHead(testRepo, refsFor, false), refsFor);
-    return commits;
-  }
-
-  private List<RevCommit> initChanges(int n) throws Exception {
-    return initChanges(n, ImmutableList.of());
-  }
-
-  private List<RevCommit> initChanges(int n, List<String> footerLines) throws Exception {
-    List<RevCommit> commits = new ArrayList<>(n);
-    for (int i = 1; i <= n; i++) {
-      String msg = "Change " + i;
-      if (!footerLines.isEmpty()) {
-        StringBuilder sb = new StringBuilder(msg).append("\n\n");
-        for (String line : footerLines) {
-          sb.append(line).append('\n');
-        }
-        msg = sb.toString();
-      }
-      TestRepository<?>.CommitBuilder cb =
-          testRepo.branch("HEAD").commit().message(msg).insertChangeId();
-      if (!commits.isEmpty()) {
-        cb.parent(commits.get(commits.size() - 1));
-      }
-      RevCommit c = cb.create();
-      testRepo.getRevWalk().parseBody(c);
-      commits.add(c);
-    }
-    return commits;
-  }
-
-  private List<RevCommit> amendChanges(
-      ObjectId initialHead, List<RevCommit> origCommits, String refsFor) throws Exception {
-    testRepo.reset(initialHead);
-    List<RevCommit> newCommits = new ArrayList<>(origCommits.size());
-    for (RevCommit c : origCommits) {
-      String msg = c.getShortMessage() + "v2";
-      if (!c.getShortMessage().equals(c.getFullMessage())) {
-        msg = msg + c.getFullMessage().substring(c.getShortMessage().length());
-      }
-      TestRepository<?>.CommitBuilder cb = testRepo.branch("HEAD").commit().message(msg);
-      if (!newCommits.isEmpty()) {
-        cb.parent(origCommits.get(newCommits.size() - 1));
-      }
-      RevCommit c2 = cb.create();
-      testRepo.getRevWalk().parseBody(c2);
-      newCommits.add(c2);
-    }
-    assertPushOk(pushHead(testRepo, refsFor, false), refsFor);
-    return newCommits;
-  }
-
-  private static Map<Integer, String> getPatchSetRevisions(ChangeData cd) throws Exception {
-    Map<Integer, String> revisions = new HashMap<>();
-    for (PatchSet ps : cd.patchSets()) {
-      revisions.put(ps.getPatchSetId(), ps.getRevision().get());
-    }
-    return revisions;
-  }
-
-  private ChangeData byCommit(ObjectId id) throws Exception {
-    List<ChangeData> cds = queryProvider.get().byCommit(id);
-    assertThat(cds).named("change for " + id.name()).hasSize(1);
-    return cds.get(0);
-  }
-
-  private ChangeData byChangeId(Change.Id id) throws Exception {
-    List<ChangeData> cds = queryProvider.get().byLegacyChangeId(id);
-    assertThat(cds).named("change " + id).hasSize(1);
-    return cds.get(0);
-  }
-
-  private static void pushForReviewOk(TestRepository<?> testRepo) throws GitAPIException {
-    pushForReview(testRepo, RemoteRefUpdate.Status.OK, null);
-  }
-
-  private static void pushForReviewRejected(TestRepository<?> testRepo, String expectedMessage)
-      throws GitAPIException {
-    pushForReview(testRepo, RemoteRefUpdate.Status.REJECTED_OTHER_REASON, expectedMessage);
-  }
-
-  private static void pushForReview(
-      TestRepository<?> testRepo, RemoteRefUpdate.Status expectedStatus, String expectedMessage)
-      throws GitAPIException {
-    String ref = "refs/for/master";
-    PushResult r = pushHead(testRepo, ref);
-    RemoteRefUpdate refUpdate = r.getRemoteUpdate(ref);
-    assertThat(refUpdate.getStatus()).isEqualTo(expectedStatus);
-    if (expectedMessage != null) {
-      assertThat(refUpdate.getMessage()).contains(expectedMessage);
-    }
-  }
-
-  private void grantSkipValidation(Project.NameKey project, String ref, AccountGroup.UUID groupUuid)
-      throws Exception {
-    // See SKIP_VALIDATION implementation in default permission backend.
-    ProjectConfig config = projectCache.checkedGet(project).getConfig();
-    Util.allow(config, Permission.FORGE_AUTHOR, groupUuid, ref);
-    Util.allow(config, Permission.FORGE_COMMITTER, groupUuid, ref);
-    Util.allow(config, Permission.FORGE_SERVER, groupUuid, ref);
-    Util.allow(config, Permission.PUSH_MERGE, groupUuid, "refs/for/" + ref);
-    saveProjectConfig(project, config);
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/AbstractSubmoduleSubscription.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/AbstractSubmoduleSubscription.java
deleted file mode 100644
index c89ad5e..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/AbstractSubmoduleSubscription.java
+++ /dev/null
@@ -1,439 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.acceptance.git;
-
-import static com.google.common.truth.Truth.assertThat;
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.collect.Iterables;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.common.data.SubscribeSection;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.ProjectConfig;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.stream.StreamSupport;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevObject;
-import org.eclipse.jgit.revwalk.RevTree;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.PushResult;
-import org.eclipse.jgit.transport.RefSpec;
-import org.eclipse.jgit.transport.RemoteRefUpdate;
-import org.eclipse.jgit.transport.RemoteRefUpdate.Status;
-
-public abstract class AbstractSubmoduleSubscription extends AbstractDaemonTest {
-
-  protected SubmitType getSubmitType() {
-    return cfg.getEnum("project", null, "submitType", SubmitType.MERGE_IF_NECESSARY);
-  }
-
-  protected static Config submitByMergeAlways() {
-    Config cfg = new Config();
-    cfg.setBoolean("change", null, "submitWholeTopic", true);
-    cfg.setEnum("project", null, "submitType", SubmitType.MERGE_ALWAYS);
-    return cfg;
-  }
-
-  protected static Config submitByMergeIfNecessary() {
-    Config cfg = new Config();
-    cfg.setBoolean("change", null, "submitWholeTopic", true);
-    cfg.setEnum("project", null, "submitType", SubmitType.MERGE_IF_NECESSARY);
-    return cfg;
-  }
-
-  protected static Config submitByCherryPickConfig() {
-    Config cfg = new Config();
-    cfg.setBoolean("change", null, "submitWholeTopic", true);
-    cfg.setEnum("project", null, "submitType", SubmitType.CHERRY_PICK);
-    return cfg;
-  }
-
-  protected static Config submitByRebaseAlwaysConfig() {
-    Config cfg = new Config();
-    cfg.setBoolean("change", null, "submitWholeTopic", true);
-    cfg.setEnum("project", null, "submitType", SubmitType.REBASE_ALWAYS);
-    return cfg;
-  }
-
-  protected static Config submitByRebaseIfNecessaryConfig() {
-    Config cfg = new Config();
-    cfg.setBoolean("change", null, "submitWholeTopic", true);
-    cfg.setEnum("project", null, "submitType", SubmitType.REBASE_IF_NECESSARY);
-    return cfg;
-  }
-
-  protected TestRepository<?> createProjectWithPush(
-      String name,
-      @Nullable Project.NameKey parent,
-      boolean createEmptyCommit,
-      SubmitType submitType)
-      throws Exception {
-    Project.NameKey project = createProject(name, parent, createEmptyCommit, submitType);
-    grant(project, "refs/heads/*", Permission.PUSH);
-    grant(project, "refs/for/refs/heads/*", Permission.SUBMIT);
-    return cloneProject(project);
-  }
-
-  protected TestRepository<?> createProjectWithPush(String name, @Nullable Project.NameKey parent)
-      throws Exception {
-    return createProjectWithPush(name, parent, true, getSubmitType());
-  }
-
-  protected TestRepository<?> createProjectWithPush(String name, boolean createEmptyCommit)
-      throws Exception {
-    return createProjectWithPush(name, null, createEmptyCommit, getSubmitType());
-  }
-
-  protected TestRepository<?> createProjectWithPush(String name) throws Exception {
-    return createProjectWithPush(name, null, true, getSubmitType());
-  }
-
-  private static AtomicInteger contentCounter = new AtomicInteger(0);
-
-  protected ObjectId pushChangeTo(
-      TestRepository<?> repo, String ref, String file, String content, String message, String topic)
-      throws Exception {
-    ObjectId ret =
-        repo.branch("HEAD").commit().insertChangeId().message(message).add(file, content).create();
-
-    String pushedRef = ref;
-    if (!topic.isEmpty()) {
-      pushedRef += "/" + name(topic);
-    }
-    String refspec = "HEAD:" + pushedRef;
-
-    Iterable<PushResult> res =
-        repo.git().push().setRemote("origin").setRefSpecs(new RefSpec(refspec)).call();
-
-    RemoteRefUpdate u = Iterables.getOnlyElement(res).getRemoteUpdate(pushedRef);
-    assertThat(u).isNotNull();
-    assertThat(u.getStatus()).isEqualTo(Status.OK);
-    assertThat(u.getNewObjectId()).isEqualTo(ret);
-
-    return ret;
-  }
-
-  protected ObjectId pushChangeTo(TestRepository<?> repo, String ref, String message, String topic)
-      throws Exception {
-    return pushChangeTo(
-        repo, ref, "a.txt", "a contents: " + contentCounter.incrementAndGet(), message, topic);
-  }
-
-  protected ObjectId pushChangeTo(TestRepository<?> repo, String branch) throws Exception {
-    return pushChangeTo(repo, "refs/heads/" + branch, "some change", "");
-  }
-
-  protected ObjectId pushChangesTo(TestRepository<?> repo, String branch, int numChanges)
-      throws Exception {
-    for (int i = 0; i < numChanges; i++) {
-      repo.branch("HEAD")
-          .commit()
-          .insertChangeId()
-          .message("Message " + i)
-          .add(name("file"), "content" + i)
-          .create();
-    }
-    String remoteBranch = "refs/heads/" + branch;
-    Iterable<PushResult> res =
-        repo.git()
-            .push()
-            .setRemote("origin")
-            .setRefSpecs(new RefSpec("HEAD:" + remoteBranch))
-            .call();
-    List<Status> status =
-        StreamSupport.stream(res.spliterator(), false)
-            .map(r -> r.getRemoteUpdate(remoteBranch).getStatus())
-            .collect(toList());
-    assertThat(status).containsExactly(Status.OK);
-    return Iterables.getLast(res).getRemoteUpdate(remoteBranch).getNewObjectId();
-  }
-
-  protected void allowSubmoduleSubscription(
-      String submodule, String subBranch, String superproject, String superBranch, boolean match)
-      throws Exception {
-    Project.NameKey sub = new Project.NameKey(name(submodule));
-    Project.NameKey superName = new Project.NameKey(name(superproject));
-    try (MetaDataUpdate md = metaDataUpdateFactory.create(sub)) {
-      md.setMessage("Added superproject subscription");
-      SubscribeSection s;
-      ProjectConfig pc = ProjectConfig.read(md);
-      if (pc.getSubscribeSections().containsKey(superName)) {
-        s = pc.getSubscribeSections().get(superName);
-      } else {
-        s = new SubscribeSection(superName);
-      }
-      String refspec;
-      if (superBranch == null) {
-        refspec = subBranch;
-      } else {
-        refspec = subBranch + ":" + superBranch;
-      }
-      if (match) {
-        s.addMatchingRefSpec(refspec);
-      } else {
-        s.addMultiMatchRefSpec(refspec);
-      }
-      pc.addSubscribeSection(s);
-      ObjectId oldId = pc.getRevision();
-      ObjectId newId = pc.commit(md);
-      assertThat(newId).isNotEqualTo(oldId);
-      projectCache.evict(pc.getProject());
-    }
-  }
-
-  protected void allowMatchingSubmoduleSubscription(
-      String submodule, String subBranch, String superproject, String superBranch)
-      throws Exception {
-    allowSubmoduleSubscription(submodule, subBranch, superproject, superBranch, true);
-  }
-
-  protected void createSubmoduleSubscription(
-      TestRepository<?> repo, String branch, String subscribeToRepo, String subscribeToBranch)
-      throws Exception {
-    Config config = new Config();
-    prepareSubmoduleConfigEntry(config, subscribeToRepo, subscribeToBranch);
-    pushSubmoduleConfig(repo, branch, config);
-  }
-
-  protected void createRelativeSubmoduleSubscription(
-      TestRepository<?> repo,
-      String branch,
-      String subscribeToRepoPrefix,
-      String subscribeToRepo,
-      String subscribeToBranch)
-      throws Exception {
-    Config config = new Config();
-    prepareRelativeSubmoduleConfigEntry(
-        config, subscribeToRepoPrefix, subscribeToRepo, subscribeToBranch);
-    pushSubmoduleConfig(repo, branch, config);
-  }
-
-  protected void prepareRelativeSubmoduleConfigEntry(
-      Config config,
-      String subscribeToRepoPrefix,
-      String subscribeToRepo,
-      String subscribeToBranch) {
-    subscribeToRepo = name(subscribeToRepo);
-    String url = subscribeToRepoPrefix + subscribeToRepo;
-    config.setString("submodule", subscribeToRepo, "path", subscribeToRepo);
-    config.setString("submodule", subscribeToRepo, "url", url);
-    if (subscribeToBranch != null) {
-      config.setString("submodule", subscribeToRepo, "branch", subscribeToBranch);
-    }
-  }
-
-  protected void prepareSubmoduleConfigEntry(
-      Config config, String subscribeToRepo, String subscribeToBranch) {
-    // The submodule subscription module checks for gerrit.canonicalWebUrl to
-    // detect if it's configured for automatic updates. It doesn't matter if
-    // it serves from that URL.
-    prepareSubmoduleConfigEntry(config, subscribeToRepo, subscribeToRepo, subscribeToBranch);
-  }
-
-  protected void prepareSubmoduleConfigEntry(
-      Config config, String subscribeToRepo, String subscribeToRepoPath, String subscribeToBranch) {
-    subscribeToRepo = name(subscribeToRepo);
-    subscribeToRepoPath = name(subscribeToRepoPath);
-    // The submodule subscription module checks for gerrit.canonicalWebUrl to
-    // detect if it's configured for automatic updates. It doesn't matter if
-    // it serves from that URL.
-    String url = cfg.getString("gerrit", null, "canonicalWebUrl") + "/" + subscribeToRepo;
-    config.setString("submodule", subscribeToRepoPath, "path", subscribeToRepoPath);
-    config.setString("submodule", subscribeToRepoPath, "url", url);
-    if (subscribeToBranch != null) {
-      config.setString("submodule", subscribeToRepoPath, "branch", subscribeToBranch);
-    }
-  }
-
-  protected void pushSubmoduleConfig(TestRepository<?> repo, String branch, Config config)
-      throws Exception {
-
-    repo.branch("HEAD")
-        .commit()
-        .insertChangeId()
-        .message("subject: adding new subscription")
-        .add(".gitmodules", config.toText().toString())
-        .create();
-
-    repo.git()
-        .push()
-        .setRemote("origin")
-        .setRefSpecs(new RefSpec("HEAD:refs/heads/" + branch))
-        .call();
-  }
-
-  protected void expectToHaveSubmoduleState(
-      TestRepository<?> repo,
-      String branch,
-      String submodule,
-      TestRepository<?> subRepo,
-      String subBranch)
-      throws Exception {
-
-    submodule = name(submodule);
-    ObjectId commitId =
-        repo.git()
-            .fetch()
-            .setRemote("origin")
-            .call()
-            .getAdvertisedRef("refs/heads/" + branch)
-            .getObjectId();
-
-    ObjectId subHead =
-        subRepo
-            .git()
-            .fetch()
-            .setRemote("origin")
-            .call()
-            .getAdvertisedRef("refs/heads/" + subBranch)
-            .getObjectId();
-
-    RevWalk rw = repo.getRevWalk();
-    RevCommit c = rw.parseCommit(commitId);
-    rw.parseBody(c.getTree());
-
-    RevTree tree = c.getTree();
-    RevObject actualId = repo.get(tree, submodule);
-
-    assertThat(actualId).isEqualTo(subHead);
-  }
-
-  protected void expectToHaveSubmoduleState(
-      TestRepository<?> repo, String branch, String submodule, ObjectId expectedId)
-      throws Exception {
-
-    submodule = name(submodule);
-    ObjectId commitId =
-        repo.git()
-            .fetch()
-            .setRemote("origin")
-            .call()
-            .getAdvertisedRef("refs/heads/" + branch)
-            .getObjectId();
-
-    RevWalk rw = repo.getRevWalk();
-    RevCommit c = rw.parseCommit(commitId);
-    rw.parseBody(c.getTree());
-
-    RevTree tree = c.getTree();
-    RevObject actualId = repo.get(tree, submodule);
-
-    assertThat(actualId).isEqualTo(expectedId);
-  }
-
-  protected void deleteAllSubscriptions(TestRepository<?> repo, String branch) throws Exception {
-    repo.git().fetch().setRemote("origin").call();
-    repo.reset("refs/remotes/origin/" + branch);
-
-    ObjectId expectedId =
-        repo.branch("HEAD")
-            .commit()
-            .insertChangeId()
-            .message("delete contents in .gitmodules")
-            .add(".gitmodules", "") // Just remove the contents of the file!
-            .create();
-    repo.git()
-        .push()
-        .setRemote("origin")
-        .setRefSpecs(new RefSpec("HEAD:refs/heads/" + branch))
-        .call();
-
-    ObjectId actualId =
-        repo.git()
-            .fetch()
-            .setRemote("origin")
-            .call()
-            .getAdvertisedRef("refs/heads/master")
-            .getObjectId();
-    assertThat(actualId).isEqualTo(expectedId);
-  }
-
-  protected void deleteGitModulesFile(TestRepository<?> repo, String branch) throws Exception {
-    repo.git().fetch().setRemote("origin").call();
-    repo.reset("refs/remotes/origin/" + branch);
-
-    ObjectId expectedId =
-        repo.branch("HEAD")
-            .commit()
-            .insertChangeId()
-            .message("delete .gitmodules")
-            .rm(".gitmodules")
-            .create();
-    repo.git()
-        .push()
-        .setRemote("origin")
-        .setRefSpecs(new RefSpec("HEAD:refs/heads/" + branch))
-        .call();
-
-    ObjectId actualId =
-        repo.git()
-            .fetch()
-            .setRemote("origin")
-            .call()
-            .getAdvertisedRef("refs/heads/master")
-            .getObjectId();
-    assertThat(actualId).isEqualTo(expectedId);
-  }
-
-  protected boolean hasSubmodule(TestRepository<?> repo, String branch, String submodule)
-      throws Exception {
-
-    submodule = name(submodule);
-    Ref branchTip =
-        repo.git().fetch().setRemote("origin").call().getAdvertisedRef("refs/heads/" + branch);
-    if (branchTip == null) {
-      return false;
-    }
-
-    ObjectId commitId = branchTip.getObjectId();
-
-    RevWalk rw = repo.getRevWalk();
-    RevCommit c = rw.parseCommit(commitId);
-    rw.parseBody(c.getTree());
-
-    RevTree tree = c.getTree();
-    try {
-      repo.get(tree, submodule);
-      return true;
-    } catch (AssertionError e) {
-      return false;
-    }
-  }
-
-  protected void expectToHaveCommitMessage(
-      TestRepository<?> repo, String branch, String expectedMessage) throws Exception {
-
-    ObjectId commitId =
-        repo.git()
-            .fetch()
-            .setRemote("origin")
-            .call()
-            .getAdvertisedRef("refs/heads/" + branch)
-            .getObjectId();
-
-    RevWalk rw = repo.getRevWalk();
-    RevCommit c = rw.parseCommit(commitId);
-    assertThat(c.getFullMessage()).isEqualTo(expectedMessage);
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/BUILD b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/BUILD
deleted file mode 100644
index 43ec5bc..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/BUILD
+++ /dev/null
@@ -1,28 +0,0 @@
-load("//gerrit-acceptance-tests:tests.bzl", "acceptance_tests")
-
-acceptance_tests(
-    srcs = glob(["*IT.java"]),
-    group = "git",
-    labels = ["git"],
-    deps = [
-        ":push_for_review",
-        ":submodule_util",
-    ],
-)
-
-java_library(
-    name = "push_for_review",
-    testonly = 1,
-    srcs = ["AbstractPushForReview.java"],
-    deps = [
-        "//gerrit-acceptance-tests:lib",
-        "//lib/joda:joda-time",
-    ],
-)
-
-java_library(
-    name = "submodule_util",
-    testonly = 1,
-    srcs = ["AbstractSubmoduleSubscription.java"],
-    deps = ["//gerrit-acceptance-tests:lib"],
-)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/ForcePushIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/ForcePushIT.java
deleted file mode 100644
index ffa4b60..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/ForcePushIT.java
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.acceptance.git;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.GitUtil.deleteRef;
-import static org.eclipse.jgit.lib.Constants.HEAD;
-import static org.eclipse.jgit.transport.RemoteRefUpdate.Status.OK;
-import static org.eclipse.jgit.transport.RemoteRefUpdate.Status.REJECTED_OTHER_REASON;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.projects.BranchInput;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.transport.PushResult;
-import org.eclipse.jgit.transport.RemoteRefUpdate;
-import org.junit.Test;
-
-@NoHttpd
-public class ForcePushIT extends AbstractDaemonTest {
-
-  @Test
-  public void forcePushNotAllowed() throws Exception {
-    ObjectId initial = repo().exactRef(HEAD).getLeaf().getObjectId();
-    PushOneCommit push1 =
-        pushFactory.create(db, admin.getIdent(), testRepo, "change1", "a.txt", "content");
-    PushOneCommit.Result r1 = push1.to("refs/heads/master");
-    r1.assertOkStatus();
-
-    // Reset HEAD to initial so the new change is a non-fast forward
-    RefUpdate ru = repo().updateRef(HEAD);
-    ru.setNewObjectId(initial);
-    assertThat(ru.forceUpdate()).isEqualTo(RefUpdate.Result.FORCED);
-
-    PushOneCommit push2 =
-        pushFactory.create(db, admin.getIdent(), testRepo, "change2", "b.txt", "content");
-    push2.setForce(true);
-    PushOneCommit.Result r2 = push2.to("refs/heads/master");
-    r2.assertErrorStatus("non-fast forward");
-  }
-
-  @Test
-  public void forcePushAllowed() throws Exception {
-    ObjectId initial = repo().exactRef(HEAD).getLeaf().getObjectId();
-    grant(project, "refs/*", Permission.PUSH, true);
-    PushOneCommit push1 =
-        pushFactory.create(db, admin.getIdent(), testRepo, "change1", "a.txt", "content");
-    PushOneCommit.Result r1 = push1.to("refs/heads/master");
-    r1.assertOkStatus();
-
-    // Reset HEAD to initial so the new change is a non-fast forward
-    RefUpdate ru = repo().updateRef(HEAD);
-    ru.setNewObjectId(initial);
-    assertThat(ru.forceUpdate()).isEqualTo(RefUpdate.Result.FORCED);
-
-    PushOneCommit push2 =
-        pushFactory.create(db, admin.getIdent(), testRepo, "change2", "b.txt", "content");
-    push2.setForce(true);
-    PushOneCommit.Result r2 = push2.to("refs/heads/master");
-    r2.assertOkStatus();
-  }
-
-  @Test
-  public void deleteNotAllowed() throws Exception {
-    assertDeleteRef(REJECTED_OTHER_REASON);
-  }
-
-  @Test
-  public void deleteNotAllowedWithOnlyPushPermission() throws Exception {
-    grant(project, "refs/*", Permission.PUSH, false);
-    assertDeleteRef(REJECTED_OTHER_REASON);
-  }
-
-  @Test
-  public void deleteAllowedWithForcePushPermission() throws Exception {
-    grant(project, "refs/*", Permission.PUSH, true);
-    assertDeleteRef(OK);
-  }
-
-  @Test
-  public void deleteAllowedWithDeletePermission() throws Exception {
-    grant(project, "refs/*", Permission.DELETE, true);
-    assertDeleteRef(OK);
-  }
-
-  private void assertDeleteRef(RemoteRefUpdate.Status expectedStatus) throws Exception {
-    BranchInput in = new BranchInput();
-    in.ref = "refs/heads/test";
-    gApi.projects().name(project.get()).branch(in.ref).create(in);
-    PushResult result = deleteRef(testRepo, in.ref);
-    RemoteRefUpdate refUpdate = result.getRemoteUpdate(in.ref);
-    assertThat(refUpdate.getStatus()).isEqualTo(expectedStatus);
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/GitOverHttpServletIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/GitOverHttpServletIT.java
deleted file mode 100644
index 3d6d16a..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/GitOverHttpServletIT.java
+++ /dev/null
@@ -1,84 +0,0 @@
-// 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.
-
-package com.google.gerrit.acceptance.git;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.gerrit.audit.AuditEvent;
-import com.google.gerrit.audit.AuditService;
-import com.google.gerrit.testutil.FakeAuditService;
-import com.google.inject.AbstractModule;
-import java.util.Collections;
-import org.eclipse.jgit.transport.CredentialsProvider;
-import org.eclipse.jgit.transport.RefSpec;
-import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.Description;
-
-public class GitOverHttpServletIT extends AbstractPushForReview {
-
-  @Override
-  protected void beforeTest(Description description) throws Exception {
-    testSysModule =
-        new AbstractModule() {
-          @Override
-          protected void configure() {
-            bind(AuditService.class).to(FakeAuditService.class);
-          }
-        };
-    super.beforeTest(description);
-  }
-
-  @Before
-  public void beforeEach() throws Exception {
-    CredentialsProvider.setDefault(
-        new UsernamePasswordCredentialsProvider(admin.username, admin.httpPassword));
-    selectProtocol(AbstractPushForReview.Protocol.HTTP);
-    auditService.clearEvents();
-  }
-
-  @Test
-  public void receivePackAuditEventLog() throws Exception {
-    testRepo
-        .git()
-        .push()
-        .setRemote("origin")
-        .setRefSpecs(new RefSpec("HEAD:refs/for/master"))
-        .call();
-
-    // Git smart protocol makes two requests:
-    // https://github.com/git/git/blob/master/Documentation/technical/http-protocol.txt
-    assertThat(auditService.auditEvents.size()).isEqualTo(2);
-
-    AuditEvent e = auditService.auditEvents.get(1);
-    assertThat(e.who.getAccountId()).isEqualTo(admin.id);
-    assertThat(e.what).endsWith("/git-receive-pack");
-    assertThat(e.params).isEmpty();
-  }
-
-  @Test
-  public void uploadPackAuditEventLog() throws Exception {
-    testRepo.git().fetch().call();
-
-    assertThat(auditService.auditEvents.size()).isEqualTo(1);
-
-    AuditEvent e = auditService.auditEvents.get(0);
-    assertThat(e.who.toString()).isEqualTo("ANONYMOUS");
-    assertThat(e.params.get("service"))
-        .containsExactlyElementsIn(Collections.singletonList("git-upload-pack"));
-    assertThat(e.what).endsWith("service=git-upload-pack");
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/ImplicitMergeCheckIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/ImplicitMergeCheckIT.java
deleted file mode 100644
index 0064570..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/ImplicitMergeCheckIT.java
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.acceptance.git;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.GitUtil.pushHead;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.extensions.client.InheritableBoolean;
-import com.google.gerrit.server.git.ProjectConfig;
-import org.eclipse.jgit.lib.ObjectId;
-import org.junit.Test;
-
-public class ImplicitMergeCheckIT extends AbstractDaemonTest {
-
-  @Test
-  public void implicitMergeViaFastForward() throws Exception {
-    setRejectImplicitMerges();
-
-    pushHead(testRepo, "refs/heads/stable", false);
-    PushOneCommit.Result m = push("refs/heads/master", "0", "file", "0");
-    PushOneCommit.Result c = push("refs/for/stable", "1", "file", "1");
-
-    c.assertMessage(implicitMergeOf(m.getCommit()));
-    c.assertErrorStatus();
-  }
-
-  @Test
-  public void implicitMergeViaRealMerge() throws Exception {
-    setRejectImplicitMerges();
-
-    ObjectId base = repo().exactRef("HEAD").getObjectId();
-    push("refs/heads/stable", "0", "f", "0");
-    testRepo.reset(base);
-    PushOneCommit.Result m = push("refs/heads/master", "1", "f", "1");
-    PushOneCommit.Result c = push("refs/for/stable", "2", "f", "2");
-
-    c.assertMessage(implicitMergeOf(m.getCommit()));
-    c.assertErrorStatus();
-  }
-
-  @Test
-  public void implicitMergeCheckOff() throws Exception {
-    ObjectId base = repo().exactRef("HEAD").getObjectId();
-    push("refs/heads/stable", "0", "f", "0");
-    testRepo.reset(base);
-    PushOneCommit.Result m = push("refs/heads/master", "1", "f", "1");
-    PushOneCommit.Result c = push("refs/for/stable", "2", "f", "2");
-
-    assertThat(c.getMessage().toLowerCase()).doesNotContain(implicitMergeOf(m.getCommit()));
-  }
-
-  @Test
-  public void notImplicitMerge_noWarning() throws Exception {
-    setRejectImplicitMerges();
-
-    ObjectId base = repo().exactRef("HEAD").getObjectId();
-    push("refs/heads/stable", "0", "f", "0");
-    testRepo.reset(base);
-    PushOneCommit.Result m = push("refs/heads/master", "1", "f", "1");
-    PushOneCommit.Result c = push("refs/for/master", "2", "f", "2");
-
-    assertThat(c.getMessage().toLowerCase()).doesNotContain(implicitMergeOf(m.getCommit()));
-  }
-
-  private static String implicitMergeOf(ObjectId commit) {
-    return "implicit merge of " + commit.abbreviate(7).name();
-  }
-
-  private void setRejectImplicitMerges() throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    cfg.getProject().setRejectImplicitMerges(InheritableBoolean.TRUE);
-    saveProjectConfig(project, cfg);
-  }
-
-  private PushOneCommit.Result push(String ref, String subject, String fileName, String content)
-      throws Exception {
-    PushOneCommit push =
-        pushFactory.create(db, admin.getIdent(), testRepo, subject, fileName, content);
-    return push.to(ref);
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/RefAdvertisementIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/RefAdvertisementIT.java
deleted file mode 100644
index 4dfd7ac..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/RefAdvertisementIT.java
+++ /dev/null
@@ -1,690 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.acceptance.git;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth.assertWithMessage;
-import static com.google.common.truth.TruthJUnit.assume;
-import static com.google.gerrit.acceptance.GitUtil.fetch;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.base.Predicates;
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.AcceptanceTestRequestScope;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.acceptance.Sandboxed;
-import com.google.gerrit.acceptance.TestAccount;
-import com.google.gerrit.common.data.AccessSection;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.changes.DraftInput;
-import com.google.gerrit.extensions.api.projects.BranchInput;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Patch;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.Sequences;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.config.AnonymousCowardName;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.git.VisibleRefFilter;
-import com.google.gerrit.server.git.receive.ReceiveCommitsAdvertiseRefsHook;
-import com.google.gerrit.server.notedb.ChangeNoteUtil;
-import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
-import com.google.gerrit.server.project.Util;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.testutil.NoteDbMode;
-import com.google.gerrit.testutil.TestChanges;
-import com.google.inject.Inject;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.function.Predicate;
-import org.eclipse.jgit.api.Git;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.Repository;
-import org.junit.Before;
-import org.junit.Test;
-
-@NoHttpd
-public class RefAdvertisementIT extends AbstractDaemonTest {
-  @Inject private VisibleRefFilter.Factory refFilterFactory;
-  @Inject private ChangeNoteUtil noteUtil;
-  @Inject @AnonymousCowardName private String anonymousCowardName;
-  @Inject private AllUsersName allUsersName;
-
-  private AccountGroup.UUID admins;
-
-  private ChangeData c1;
-  private ChangeData c2;
-  private ChangeData c3;
-  private ChangeData c4;
-  private String r1;
-  private String r2;
-  private String r3;
-  private String r4;
-
-  @Before
-  public void setUp() throws Exception {
-    admins = groupCache.get(new AccountGroup.NameKey("Administrators")).orElse(null).getGroupUUID();
-    setUpPermissions();
-    setUpChanges();
-  }
-
-  private void setUpPermissions() throws Exception {
-    // Remove read permissions for all users besides admin. This method is idempotent, so is safe
-    // to call on every test setup.
-    ProjectConfig pc = projectCache.checkedGet(allProjects).getConfig();
-    for (AccessSection sec : pc.getAccessSections()) {
-      sec.removePermission(Permission.READ);
-    }
-    Util.allow(pc, Permission.READ, admins, "refs/*");
-    saveProjectConfig(allProjects, pc);
-
-    // Remove all read permissions on All-Users. This method is idempotent, so is safe to call on
-    // every test setup.
-    pc = projectCache.checkedGet(allUsersName).getConfig();
-    for (AccessSection sec : pc.getAccessSections()) {
-      sec.removePermission(Permission.READ);
-    }
-    saveProjectConfig(allUsersName, pc);
-  }
-
-  private static String changeRefPrefix(Change.Id id) {
-    String ps = new PatchSet.Id(id, 1).toRefName();
-    return ps.substring(0, ps.length() - 1);
-  }
-
-  private void setUpChanges() throws Exception {
-    gApi.projects().name(project.get()).branch("branch").create(new BranchInput());
-
-    // First 2 changes are merged, which means the tags pointing to them are
-    // visible.
-    allow("refs/for/refs/heads/*", Permission.SUBMIT, admins);
-    PushOneCommit.Result mr =
-        pushFactory.create(db, admin.getIdent(), testRepo).to("refs/for/master%submit");
-    mr.assertOkStatus();
-    c1 = mr.getChange();
-    r1 = changeRefPrefix(c1.getId());
-    PushOneCommit.Result br =
-        pushFactory.create(db, admin.getIdent(), testRepo).to("refs/for/branch%submit");
-    br.assertOkStatus();
-    c2 = br.getChange();
-    r2 = changeRefPrefix(c2.getId());
-
-    // Second 2 changes are unmerged.
-    mr = pushFactory.create(db, admin.getIdent(), testRepo).to("refs/for/master");
-    mr.assertOkStatus();
-    c3 = mr.getChange();
-    r3 = changeRefPrefix(c3.getId());
-    br = pushFactory.create(db, admin.getIdent(), testRepo).to("refs/for/branch");
-    br.assertOkStatus();
-    c4 = br.getChange();
-    r4 = changeRefPrefix(c4.getId());
-
-    try (Repository repo = repoManager.openRepository(project)) {
-      // master-tag -> master
-      RefUpdate mtu = repo.updateRef("refs/tags/master-tag");
-      mtu.setExpectedOldObjectId(ObjectId.zeroId());
-      mtu.setNewObjectId(repo.exactRef("refs/heads/master").getObjectId());
-      assertThat(mtu.update()).isEqualTo(RefUpdate.Result.NEW);
-
-      // branch-tag -> branch
-      RefUpdate btu = repo.updateRef("refs/tags/branch-tag");
-      btu.setExpectedOldObjectId(ObjectId.zeroId());
-      btu.setNewObjectId(repo.exactRef("refs/heads/branch").getObjectId());
-      assertThat(btu.update()).isEqualTo(RefUpdate.Result.NEW);
-    }
-  }
-
-  @Test
-  public void uploadPackAllRefsVisibleNoRefsMetaConfig() throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    Util.allow(cfg, Permission.READ, REGISTERED_USERS, "refs/*");
-    Util.allow(cfg, Permission.READ, admins, RefNames.REFS_CONFIG);
-    Util.doNotInherit(cfg, Permission.READ, RefNames.REFS_CONFIG);
-    saveProjectConfig(project, cfg);
-
-    setApiUser(user);
-    assertUploadPackRefs(
-        "HEAD",
-        r1 + "1",
-        r1 + "meta",
-        r2 + "1",
-        r2 + "meta",
-        r3 + "1",
-        r3 + "meta",
-        r4 + "1",
-        r4 + "meta",
-        "refs/heads/branch",
-        "refs/heads/master",
-        "refs/tags/branch-tag",
-        "refs/tags/master-tag");
-  }
-
-  @Test
-  public void uploadPackAllRefsVisibleWithRefsMetaConfig() throws Exception {
-    allow("refs/*", Permission.READ, REGISTERED_USERS);
-    allow(RefNames.REFS_CONFIG, Permission.READ, REGISTERED_USERS);
-
-    assertUploadPackRefs(
-        "HEAD",
-        r1 + "1",
-        r1 + "meta",
-        r2 + "1",
-        r2 + "meta",
-        r3 + "1",
-        r3 + "meta",
-        r4 + "1",
-        r4 + "meta",
-        "refs/heads/branch",
-        "refs/heads/master",
-        RefNames.REFS_CONFIG,
-        "refs/tags/branch-tag",
-        "refs/tags/master-tag");
-  }
-
-  @Test
-  public void uploadPackSubsetOfBranchesVisibleIncludingHead() throws Exception {
-    allow("refs/heads/master", Permission.READ, REGISTERED_USERS);
-    deny("refs/heads/branch", Permission.READ, REGISTERED_USERS);
-
-    setApiUser(user);
-    assertUploadPackRefs(
-        "HEAD",
-        r1 + "1",
-        r1 + "meta",
-        r3 + "1",
-        r3 + "meta",
-        "refs/heads/master",
-        "refs/tags/master-tag");
-  }
-
-  @Test
-  public void uploadPackSubsetOfBranchesVisibleNotIncludingHead() throws Exception {
-    deny("refs/heads/master", Permission.READ, REGISTERED_USERS);
-    allow("refs/heads/branch", Permission.READ, REGISTERED_USERS);
-
-    setApiUser(user);
-    assertUploadPackRefs(
-        r2 + "1",
-        r2 + "meta",
-        r4 + "1",
-        r4 + "meta",
-        "refs/heads/branch",
-        "refs/tags/branch-tag",
-        // master branch is not visible but master-tag is reachable from branch
-        // (since PushOneCommit always bases changes on each other).
-        "refs/tags/master-tag");
-  }
-
-  @Test
-  public void uploadPackSubsetOfBranchesVisibleWithEdit() throws Exception {
-    allow("refs/heads/master", Permission.READ, REGISTERED_USERS);
-
-    Change c = notesFactory.createChecked(db, project, c1.getId()).getChange();
-    String changeId = c.getKey().get();
-
-    // Admin's edit is not visible.
-    setApiUser(admin);
-    gApi.changes().id(changeId).edit().create();
-
-    // User's edit is visible.
-    setApiUser(user);
-    gApi.changes().id(changeId).edit().create();
-
-    assertUploadPackRefs(
-        "HEAD",
-        r1 + "1",
-        r1 + "meta",
-        r3 + "1",
-        r3 + "meta",
-        "refs/heads/master",
-        "refs/tags/master-tag",
-        "refs/users/01/1000001/edit-" + c1.getId() + "/1");
-  }
-
-  @Test
-  public void uploadPackSubsetOfBranchesAndEditsVisibleWithViewPrivateChanges() throws Exception {
-    allow("refs/heads/master", Permission.READ, REGISTERED_USERS);
-    allow("refs/*", Permission.VIEW_PRIVATE_CHANGES, REGISTERED_USERS);
-
-    Change change1 = notesFactory.createChecked(db, project, c1.getId()).getChange();
-    String changeId1 = change1.getKey().get();
-    Change change2 = notesFactory.createChecked(db, project, c2.getId()).getChange();
-    String changeId2 = change2.getKey().get();
-
-    // Admin's edit on change1 is visible.
-    setApiUser(admin);
-    gApi.changes().id(changeId1).edit().create();
-
-    // Admin's edit on change2 is not visible since user cannot see the change.
-    gApi.changes().id(changeId2).edit().create();
-
-    // User's edit is visible.
-    setApiUser(user);
-    gApi.changes().id(changeId1).edit().create();
-
-    assertUploadPackRefs(
-        "HEAD",
-        r1 + "1",
-        r1 + "meta",
-        r3 + "1",
-        r3 + "meta",
-        "refs/heads/master",
-        "refs/tags/master-tag",
-        "refs/users/00/1000000/edit-" + c1.getId() + "/1",
-        "refs/users/01/1000001/edit-" + c1.getId() + "/1");
-  }
-
-  @Test
-  public void uploadPackSubsetOfRefsVisibleWithAccessDatabase() throws Exception {
-    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
-    try {
-      deny("refs/heads/master", Permission.READ, REGISTERED_USERS);
-      allow("refs/heads/branch", Permission.READ, REGISTERED_USERS);
-
-      String changeId = c1.change().getKey().get();
-      setApiUser(admin);
-      gApi.changes().id(changeId).edit().create();
-      setApiUser(user);
-
-      assertUploadPackRefs(
-          // Change 1 is visible due to accessDatabase capability, even though
-          // refs/heads/master is not.
-          r1 + "1",
-          r1 + "meta",
-          r2 + "1",
-          r2 + "meta",
-          r3 + "1",
-          r3 + "meta",
-          r4 + "1",
-          r4 + "meta",
-          "refs/heads/branch",
-          "refs/tags/branch-tag",
-          // See comment in subsetOfBranchesVisibleNotIncludingHead.
-          "refs/tags/master-tag",
-          // All edits are visible due to accessDatabase capability.
-          "refs/users/00/1000000/edit-" + c1.getId() + "/1");
-    } finally {
-      removeGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
-    }
-  }
-
-  @Test
-  public void uploadPackNoSearchingChangeCacheImpl() throws Exception {
-    allow("refs/heads/*", Permission.READ, REGISTERED_USERS);
-
-    setApiUser(user);
-    try (Repository repo = repoManager.openRepository(project)) {
-      assertRefs(
-          repo,
-          refFilterFactory.create(projectCache.get(project), repo),
-          // Can't use stored values from the index so DB must be enabled.
-          false,
-          "HEAD",
-          r1 + "1",
-          r1 + "meta",
-          r2 + "1",
-          r2 + "meta",
-          r3 + "1",
-          r3 + "meta",
-          r4 + "1",
-          r4 + "meta",
-          "refs/heads/branch",
-          "refs/heads/master",
-          "refs/tags/branch-tag",
-          "refs/tags/master-tag");
-    }
-  }
-
-  @Test
-  public void uploadPackSequencesWithAccessDatabase() throws Exception {
-    assume().that(notesMigration.readChangeSequence()).isTrue();
-    try (Repository repo = repoManager.openRepository(allProjects)) {
-      setApiUser(user);
-      assertRefs(repo, newFilter(repo, allProjects), true);
-
-      allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
-      try {
-        setApiUser(user);
-        assertRefs(repo, newFilter(repo, allProjects), true, "refs/sequences/changes");
-      } finally {
-        removeGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
-      }
-    }
-  }
-
-  @Test
-  public void receivePackListsOpenChangesAsAdditionalHaves() throws Exception {
-    ReceiveCommitsAdvertiseRefsHook.Result r = getReceivePackRefs();
-    assertThat(r.allRefs().keySet())
-        .containsExactly(
-            // meta refs are excluded even when NoteDb is enabled.
-            "HEAD",
-            "refs/heads/branch",
-            "refs/heads/master",
-            "refs/meta/config",
-            "refs/tags/branch-tag",
-            "refs/tags/master-tag");
-    assertThat(r.additionalHaves()).containsExactly(obj(c3, 1), obj(c4, 1));
-  }
-
-  @Test
-  public void receivePackRespectsVisibilityOfOpenChanges() throws Exception {
-    allow("refs/heads/master", Permission.READ, REGISTERED_USERS);
-    deny("refs/heads/branch", Permission.READ, REGISTERED_USERS);
-    setApiUser(user);
-
-    assertThat(getReceivePackRefs().additionalHaves()).containsExactly(obj(c3, 1));
-  }
-
-  @Test
-  public void receivePackListsOnlyLatestPatchSet() throws Exception {
-    testRepo.reset(obj(c3, 1));
-    PushOneCommit.Result r = amendChange(c3.change().getKey().get());
-    r.assertOkStatus();
-    c3 = r.getChange();
-    assertThat(getReceivePackRefs().additionalHaves()).containsExactly(obj(c3, 2), obj(c4, 1));
-  }
-
-  @Test
-  public void receivePackOmitsMissingObject() throws Exception {
-    String rev = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef";
-    try (Repository repo = repoManager.openRepository(project)) {
-      TestRepository<?> tr = new TestRepository<>(repo);
-      String subject = "Subject for missing commit";
-      Change c = new Change(c3.change());
-      PatchSet.Id psId = new PatchSet.Id(c3.getId(), 2);
-      c.setCurrentPatchSet(psId, subject, c.getOriginalSubject());
-
-      if (notesMigration.changePrimaryStorage() == PrimaryStorage.REVIEW_DB) {
-        PatchSet ps = TestChanges.newPatchSet(psId, rev, admin.getId());
-        db.patchSets().insert(Collections.singleton(ps));
-        db.changes().update(Collections.singleton(c));
-      }
-
-      if (notesMigration.commitChangeWrites()) {
-        PersonIdent committer = serverIdent.get();
-        PersonIdent author =
-            noteUtil.newIdent(
-                accountCache.get(admin.getId()).getAccount(),
-                committer.getWhen(),
-                committer,
-                anonymousCowardName);
-        tr.branch(RefNames.changeMetaRef(c3.getId()))
-            .commit()
-            .author(author)
-            .committer(committer)
-            .message(
-                "Update patch set "
-                    + psId.get()
-                    + "\n"
-                    + "\n"
-                    + "Patch-set: "
-                    + psId.get()
-                    + "\n"
-                    + "Commit: "
-                    + rev
-                    + "\n"
-                    + "Subject: "
-                    + subject
-                    + "\n")
-            .create();
-      }
-      indexer.index(db, c.getProject(), c.getId());
-    }
-
-    assertThat(getReceivePackRefs().additionalHaves()).containsExactly(obj(c4, 1));
-  }
-
-  @Test
-  public void advertisedReferencesDontShowUserBranchWithoutRead() throws Exception {
-    TestRepository<?> userTestRepository = cloneProject(allUsersName, user);
-    try (Git git = userTestRepository.git()) {
-      assertThat(getUserRefs(git)).isEmpty();
-    }
-  }
-
-  @Test
-  public void advertisedReferencesOmitUserBranchesOfOtherUsers() throws Exception {
-    allow(allUsersName, RefNames.REFS_USERS + "*", Permission.READ, REGISTERED_USERS);
-    TestRepository<?> userTestRepository = cloneProject(allUsersName, user);
-    try (Git git = userTestRepository.git()) {
-      assertThat(getUserRefs(git))
-          .containsExactly(RefNames.REFS_USERS_SELF, RefNames.refsUsers(user.id));
-    }
-  }
-
-  @Test
-  public void advertisedReferencesIncludeAllUserBranchesWithAccessDatabase() throws Exception {
-    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
-    try {
-      TestRepository<?> userTestRepository = cloneProject(allUsersName, user);
-      try (Git git = userTestRepository.git()) {
-        assertThat(getUserRefs(git))
-            .containsExactly(
-                RefNames.REFS_USERS_SELF,
-                RefNames.refsUsers(user.id),
-                RefNames.refsUsers(admin.id));
-      }
-    } finally {
-      removeGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
-    }
-  }
-
-  @Test
-  public void advertisedReferencesOmitPrivateChangesOfOtherUsers() throws Exception {
-    allow("refs/heads/master", Permission.READ, REGISTERED_USERS);
-
-    TestRepository<?> userTestRepository = cloneProject(project, user);
-    try (Git git = userTestRepository.git()) {
-      String change3RefName = c3.currentPatchSet().getRefName();
-      assertWithMessage("Precondition violated").that(getRefs(git)).contains(change3RefName);
-
-      gApi.changes().id(c3.getId().get()).setPrivate(true, null);
-      assertThat(getRefs(git)).doesNotContain(change3RefName);
-    }
-  }
-
-  @Test
-  public void advertisedReferencesIncludePrivateChangesWhenAllRefsMayBeRead() throws Exception {
-    allow("refs/*", Permission.READ, REGISTERED_USERS);
-
-    TestRepository<?> userTestRepository = cloneProject(project, user);
-    try (Git git = userTestRepository.git()) {
-      String change3RefName = c3.currentPatchSet().getRefName();
-      assertWithMessage("Precondition violated").that(getRefs(git)).contains(change3RefName);
-
-      gApi.changes().id(c3.getId().get()).setPrivate(true, null);
-      assertThat(getRefs(git)).contains(change3RefName);
-    }
-  }
-
-  @Test
-  @Sandboxed
-  public void advertisedReferencesOmitDraftCommentRefsOfOtherUsers() throws Exception {
-    assume().that(notesMigration.commitChangeWrites()).isTrue();
-
-    allow(project, "refs/*", Permission.READ, REGISTERED_USERS);
-    allow(allUsersName, "refs/*", Permission.READ, REGISTERED_USERS);
-
-    setApiUser(user);
-    DraftInput draftInput = new DraftInput();
-    draftInput.line = 1;
-    draftInput.message = "nit: trailing whitespace";
-    draftInput.path = Patch.COMMIT_MSG;
-    gApi.changes().id(c3.getId().get()).current().createDraft(draftInput);
-    String draftCommentRef = RefNames.refsDraftComments(c3.getId(), user.id);
-
-    // user can see the draft comment ref of the own draft comment
-    assertThat(lsRemote(allUsersName, user)).contains(draftCommentRef);
-
-    // user2 can't see the draft comment ref of user's draft comment
-    assertThat(lsRemote(allUsersName, accountCreator.user2())).doesNotContain(draftCommentRef);
-  }
-
-  @Test
-  @Sandboxed
-  public void advertisedReferencesOmitStarredChangesRefsOfOtherUsers() throws Exception {
-    assume().that(notesMigration.commitChangeWrites()).isTrue();
-
-    allow(project, "refs/*", Permission.READ, REGISTERED_USERS);
-    allow(allUsersName, "refs/*", Permission.READ, REGISTERED_USERS);
-
-    setApiUser(user);
-    gApi.accounts().self().starChange(c3.getId().toString());
-    String starredChangesRef = RefNames.refsStarredChanges(c3.getId(), user.id);
-
-    // user can see the starred changes ref of the own star
-    assertThat(lsRemote(allUsersName, user)).contains(starredChangesRef);
-
-    // user2 can't see the starred changes ref of admin's star
-    assertThat(lsRemote(allUsersName, accountCreator.user2())).doesNotContain(starredChangesRef);
-  }
-
-  @Test
-  public void hideMetadata() throws Exception {
-    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
-    try {
-      // create change
-      TestRepository<?> allUsersRepo = cloneProject(allUsersName);
-      fetch(allUsersRepo, RefNames.REFS_USERS_SELF + ":userRef");
-      allUsersRepo.reset("userRef");
-      PushOneCommit.Result mr =
-          pushFactory
-              .create(db, admin.getIdent(), allUsersRepo)
-              .to("refs/for/" + RefNames.REFS_USERS_SELF);
-      mr.assertOkStatus();
-
-      List<String> expectedNonMetaRefs =
-          ImmutableList.of(
-              RefNames.REFS_USERS_SELF,
-              RefNames.refsUsers(admin.id),
-              RefNames.refsUsers(user.id),
-              RefNames.REFS_SEQUENCES + Sequences.NAME_ACCOUNTS,
-              RefNames.REFS_EXTERNAL_IDS,
-              RefNames.REFS_CONFIG);
-
-      List<String> expectedMetaRefs =
-          new ArrayList<>(ImmutableList.of(mr.getPatchSetId().toRefName()));
-      if (NoteDbMode.get() != NoteDbMode.OFF) {
-        expectedMetaRefs.add(changeRefPrefix(mr.getChange().getId()) + "meta");
-      }
-
-      List<String> expectedAllRefs = new ArrayList<>(expectedNonMetaRefs);
-      expectedAllRefs.addAll(expectedMetaRefs);
-
-      try (Repository repo = repoManager.openRepository(allUsersName)) {
-        Map<String, Ref> all = repo.getAllRefs();
-
-        VisibleRefFilter filter = refFilterFactory.create(projectCache.get(allUsersName), repo);
-        assertThat(filter.filter(all, false).keySet()).containsExactlyElementsIn(expectedAllRefs);
-
-        assertThat(filter.setShowMetadata(false).filter(all, false).keySet())
-            .containsExactlyElementsIn(expectedNonMetaRefs);
-      }
-    } finally {
-      removeGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
-    }
-  }
-
-  private List<String> lsRemote(Project.NameKey p, TestAccount a) throws Exception {
-    TestRepository<?> testRepository = cloneProject(p, a);
-    try (Git git = testRepository.git()) {
-      return git.lsRemote().call().stream().map(Ref::getName).collect(toList());
-    }
-  }
-
-  private List<String> getRefs(Git git) throws Exception {
-    return getRefs(git, Predicates.alwaysTrue());
-  }
-
-  private List<String> getUserRefs(Git git) throws Exception {
-    return getRefs(git, RefNames::isRefsUsers);
-  }
-
-  private List<String> getRefs(Git git, Predicate<String> predicate) throws Exception {
-    return git.lsRemote().call().stream().map(Ref::getName).filter(predicate).collect(toList());
-  }
-
-  /**
-   * Assert that refs seen by a non-admin user match expected.
-   *
-   * @param expectedWithMeta expected refs, in order. If NoteDb is disabled by the configuration,
-   *     any NoteDb refs (i.e. ending in "/meta") are removed from the expected list before
-   *     comparing to the actual results.
-   * @throws Exception
-   */
-  private void assertUploadPackRefs(String... expectedWithMeta) throws Exception {
-    try (Repository repo = repoManager.openRepository(project)) {
-      assertRefs(
-          repo, refFilterFactory.create(projectCache.get(project), repo), true, expectedWithMeta);
-    }
-  }
-
-  private void assertRefs(
-      Repository repo, VisibleRefFilter filter, boolean disableDb, String... expectedWithMeta)
-      throws Exception {
-    List<String> expected = new ArrayList<>(expectedWithMeta.length);
-    for (String r : expectedWithMeta) {
-      if (notesMigration.commitChangeWrites() || !r.endsWith(RefNames.META_SUFFIX)) {
-        expected.add(r);
-      }
-    }
-
-    AcceptanceTestRequestScope.Context ctx = null;
-    if (disableDb) {
-      ctx = disableDb();
-    }
-    try {
-      Map<String, Ref> all = repo.getAllRefs();
-      assertThat(filter.filter(all, false).keySet()).containsExactlyElementsIn(expected);
-    } finally {
-      if (disableDb) {
-        enableDb(ctx);
-      }
-    }
-  }
-
-  private ReceiveCommitsAdvertiseRefsHook.Result getReceivePackRefs() throws Exception {
-    ReceiveCommitsAdvertiseRefsHook hook =
-        new ReceiveCommitsAdvertiseRefsHook(queryProvider, project);
-    try (Repository repo = repoManager.openRepository(project)) {
-      return hook.advertiseRefs(repo.getAllRefs());
-    }
-  }
-
-  private VisibleRefFilter newFilter(Repository repo, Project.NameKey project) {
-    return refFilterFactory.create(projectCache.get(project), repo);
-  }
-
-  private static ObjectId obj(ChangeData cd, int psNum) throws Exception {
-    PatchSet.Id psId = new PatchSet.Id(cd.getId(), psNum);
-    PatchSet ps = cd.patchSet(psId);
-    assertWithMessage("%s not found in %s", psId, cd.patchSets()).that(ps).isNotNull();
-    return ObjectId.fromString(ps.getRevision().get());
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmitOnPushIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmitOnPushIT.java
deleted file mode 100644
index afc81e5..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmitOnPushIT.java
+++ /dev/null
@@ -1,427 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.acceptance.git;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.GitUtil.assertPushOk;
-import static com.google.gerrit.acceptance.GitUtil.pushHead;
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.collect.Iterables;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.inject.Inject;
-import org.eclipse.jgit.api.errors.GitAPIException;
-import org.eclipse.jgit.api.errors.InvalidRemoteException;
-import org.eclipse.jgit.api.errors.TransportException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevObject;
-import org.eclipse.jgit.revwalk.RevTag;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.RefSpec;
-import org.eclipse.jgit.transport.RemoteRefUpdate;
-import org.junit.Test;
-
-@NoHttpd
-public class SubmitOnPushIT extends AbstractDaemonTest {
-  @Inject private ApprovalsUtil approvalsUtil;
-
-  @Test
-  public void submitOnPush() throws Exception {
-    grant(project, "refs/for/refs/heads/master", Permission.SUBMIT);
-    PushOneCommit.Result r = pushTo("refs/for/master%submit");
-    r.assertOkStatus();
-    r.assertChange(Change.Status.MERGED, null, admin);
-    assertSubmitApproval(r.getPatchSetId());
-    assertCommit(project, "refs/heads/master");
-  }
-
-  @Test
-  public void submitOnPushWithTag() throws Exception {
-    grant(project, "refs/for/refs/heads/master", Permission.SUBMIT);
-    grant(project, "refs/tags/*", Permission.CREATE);
-    grant(project, "refs/tags/*", Permission.PUSH);
-    PushOneCommit.Tag tag = new PushOneCommit.Tag("v1.0");
-    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
-    push.setTag(tag);
-    PushOneCommit.Result r = push.to("refs/for/master%submit");
-    r.assertOkStatus();
-    r.assertChange(Change.Status.MERGED, null, admin);
-    assertSubmitApproval(r.getPatchSetId());
-    assertCommit(project, "refs/heads/master");
-    assertTag(project, "refs/heads/master", tag);
-  }
-
-  @Test
-  public void submitOnPushWithAnnotatedTag() throws Exception {
-    grant(project, "refs/for/refs/heads/master", Permission.SUBMIT);
-    grant(project, "refs/tags/*", Permission.PUSH);
-    PushOneCommit.AnnotatedTag tag =
-        new PushOneCommit.AnnotatedTag("v1.0", "annotation", admin.getIdent());
-    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
-    push.setTag(tag);
-    PushOneCommit.Result r = push.to("refs/for/master%submit");
-    r.assertOkStatus();
-    r.assertChange(Change.Status.MERGED, null, admin);
-    assertSubmitApproval(r.getPatchSetId());
-    assertCommit(project, "refs/heads/master");
-    assertTag(project, "refs/heads/master", tag);
-  }
-
-  @Test
-  public void submitOnPushToRefsMetaConfig() throws Exception {
-    grant(project, "refs/for/refs/meta/config", Permission.SUBMIT);
-
-    git().fetch().setRefSpecs(new RefSpec("refs/meta/config:refs/meta/config")).call();
-    testRepo.reset(RefNames.REFS_CONFIG);
-
-    PushOneCommit.Result r = pushTo("refs/for/refs/meta/config%submit");
-    r.assertOkStatus();
-    r.assertChange(Change.Status.MERGED, null, admin);
-    assertSubmitApproval(r.getPatchSetId());
-    assertCommit(project, RefNames.REFS_CONFIG);
-  }
-
-  @Test
-  public void submitOnPushMergeConflict() throws Exception {
-    ObjectId objectId = repo().exactRef("HEAD").getObjectId();
-    push("refs/heads/master", "one change", "a.txt", "some content");
-    testRepo.reset(objectId);
-
-    grant(project, "refs/for/refs/heads/master", Permission.SUBMIT);
-    PushOneCommit.Result r =
-        push("refs/for/master%submit", "other change", "a.txt", "other content");
-    r.assertErrorStatus();
-    r.assertChange(Change.Status.NEW, null);
-    r.assertMessage(
-        "Change " + r.getChange().getId() + ": change could not be merged due to a path conflict.");
-  }
-
-  @Test
-  public void submitOnPushSuccessfulMerge() throws Exception {
-    String master = "refs/heads/master";
-    ObjectId objectId = repo().exactRef("HEAD").getObjectId();
-    push(master, "one change", "a.txt", "some content");
-    testRepo.reset(objectId);
-
-    grant(project, "refs/for/refs/heads/master", Permission.SUBMIT);
-    PushOneCommit.Result r =
-        push("refs/for/master%submit", "other change", "b.txt", "other content");
-    r.assertOkStatus();
-    r.assertChange(Change.Status.MERGED, null, admin);
-    assertMergeCommit(master, "other change");
-  }
-
-  @Test
-  public void submitOnPushNewPatchSet() throws Exception {
-    PushOneCommit.Result r =
-        push("refs/for/master", PushOneCommit.SUBJECT, "a.txt", "some content");
-
-    grant(project, "refs/for/refs/heads/master", Permission.SUBMIT);
-    r =
-        push(
-            "refs/for/master%submit",
-            PushOneCommit.SUBJECT, "a.txt", "other content", r.getChangeId());
-    r.assertOkStatus();
-    r.assertChange(Change.Status.MERGED, null, admin);
-    ChangeData cd = Iterables.getOnlyElement(queryProvider.get().byKeyPrefix(r.getChangeId()));
-    assertThat(cd.patchSets()).hasSize(2);
-    assertSubmitApproval(r.getPatchSetId());
-    assertCommit(project, "refs/heads/master");
-  }
-
-  @Test
-  public void submitOnPushNotAllowed_Error() throws Exception {
-    PushOneCommit.Result r = pushTo("refs/for/master%submit");
-    r.assertErrorStatus("update by submit not permitted");
-  }
-
-  @Test
-  public void submitOnPushNewPatchSetNotAllowed_Error() throws Exception {
-    PushOneCommit.Result r =
-        push("refs/for/master", PushOneCommit.SUBJECT, "a.txt", "some content");
-
-    r =
-        push(
-            "refs/for/master%submit",
-            PushOneCommit.SUBJECT, "a.txt", "other content", r.getChangeId());
-    r.assertErrorStatus("update by submit not permitted");
-  }
-
-  @Test
-  public void submitOnPushToNonExistingBranch_Error() throws Exception {
-    String branchName = "non-existing";
-    PushOneCommit.Result r = pushTo("refs/for/" + branchName + "%submit");
-    r.assertErrorStatus("branch " + branchName + " not found");
-  }
-
-  @Test
-  public void mergeOnPushToBranch() throws Exception {
-    grant(project, "refs/heads/master", Permission.PUSH);
-    PushOneCommit.Result r =
-        push("refs/for/master", PushOneCommit.SUBJECT, "a.txt", "some content");
-    r.assertOkStatus();
-
-    git().push().setRefSpecs(new RefSpec(r.getCommit().name() + ":refs/heads/master")).call();
-    assertCommit(project, "refs/heads/master");
-
-    ChangeData cd =
-        Iterables.getOnlyElement(queryProvider.get().byKey(new Change.Key(r.getChangeId())));
-    RevCommit c = r.getCommit();
-    PatchSet.Id psId = cd.currentPatchSet().getId();
-    assertThat(psId.get()).isEqualTo(1);
-    assertThat(cd.change().getStatus()).isEqualTo(Change.Status.MERGED);
-    assertSubmitApproval(psId);
-
-    assertThat(cd.patchSets()).hasSize(1);
-    assertThat(cd.patchSet(psId).getRevision().get()).isEqualTo(c.name());
-  }
-
-  @Test
-  public void mergeOnPushToBranchWithChangeMergedInOther() throws Exception {
-    enableCreateNewChangeForAllNotInTarget();
-    String master = "refs/heads/master";
-    String other = "refs/heads/other";
-    grant(project, master, Permission.PUSH);
-    grant(project, other, Permission.CREATE);
-    grant(project, other, Permission.PUSH);
-    RevCommit masterRev = getRemoteHead();
-    pushCommitTo(masterRev, other);
-    PushOneCommit.Result r = createChange();
-    r.assertOkStatus();
-    RevCommit commit = r.getCommit();
-    pushCommitTo(commit, master);
-    assertCommit(project, master);
-    ChangeData cd =
-        Iterables.getOnlyElement(queryProvider.get().byKey(new Change.Key(r.getChangeId())));
-    assertThat(cd.change().getStatus()).isEqualTo(Change.Status.MERGED);
-
-    RemoteRefUpdate.Status status = pushCommitTo(commit, "refs/for/other");
-    assertThat(status).isEqualTo(RemoteRefUpdate.Status.OK);
-
-    pushCommitTo(commit, other);
-    assertCommit(project, other);
-
-    for (ChangeData c : queryProvider.get().byKey(new Change.Key(r.getChangeId()))) {
-      if (c.change().getDest().get().equals(other)) {
-        assertThat(c.change().getStatus()).isEqualTo(Change.Status.MERGED);
-      }
-    }
-  }
-
-  private RemoteRefUpdate.Status pushCommitTo(RevCommit commit, String ref)
-      throws GitAPIException, InvalidRemoteException, TransportException {
-    return Iterables.getOnlyElement(
-            git().push().setRefSpecs(new RefSpec(commit.name() + ":" + ref)).call())
-        .getRemoteUpdate(ref)
-        .getStatus();
-  }
-
-  @Test
-  public void mergeOnPushToBranchWithNewPatchset() throws Exception {
-    grant(project, "refs/heads/master", Permission.PUSH);
-    PushOneCommit.Result r = pushTo("refs/for/master");
-    r.assertOkStatus();
-    RevCommit c1 = r.getCommit();
-    PatchSet.Id psId1 = r.getPatchSetId();
-    assertThat(psId1.get()).isEqualTo(1);
-
-    PushOneCommit push =
-        pushFactory.create(
-            db,
-            admin.getIdent(),
-            testRepo,
-            PushOneCommit.SUBJECT,
-            "b.txt",
-            "anotherContent",
-            r.getChangeId());
-
-    r = push.to("refs/heads/master");
-    r.assertOkStatus();
-
-    ChangeData cd = r.getChange();
-    RevCommit c2 = r.getCommit();
-    assertThat(cd.change().getStatus()).isEqualTo(Change.Status.MERGED);
-    PatchSet.Id psId2 = cd.change().currentPatchSetId();
-    assertThat(psId2.get()).isEqualTo(2);
-    assertCommit(project, "refs/heads/master");
-    assertSubmitApproval(psId2);
-
-    assertThat(cd.patchSets()).hasSize(2);
-    assertThat(cd.patchSet(psId1).getRevision().get()).isEqualTo(c1.name());
-    assertThat(cd.patchSet(psId2).getRevision().get()).isEqualTo(c2.name());
-  }
-
-  @Test
-  public void mergeOnPushToBranchWithOldPatchset() throws Exception {
-    grant(project, "refs/heads/master", Permission.PUSH);
-    PushOneCommit.Result r = pushTo("refs/for/master");
-    r.assertOkStatus();
-    RevCommit c1 = r.getCommit();
-    PatchSet.Id psId1 = r.getPatchSetId();
-    String changeId = r.getChangeId();
-    assertThat(psId1.get()).isEqualTo(1);
-
-    r = amendChange(changeId);
-    ChangeData cd = r.getChange();
-    PatchSet.Id psId2 = cd.change().currentPatchSetId();
-    assertThat(psId2.getParentKey()).isEqualTo(psId1.getParentKey());
-    assertThat(psId2.get()).isEqualTo(2);
-
-    testRepo.reset(c1);
-    assertPushOk(pushHead(testRepo, "refs/heads/master", false), "refs/heads/master");
-
-    cd = changeDataFactory.create(db, project, psId1.getParentKey());
-    Change c = cd.change();
-    assertThat(c.getStatus()).isEqualTo(Change.Status.MERGED);
-    assertThat(c.currentPatchSetId()).isEqualTo(psId1);
-    assertThat(cd.patchSets().stream().map(ps -> ps.getId()).collect(toList()))
-        .containsExactly(psId1, psId2);
-  }
-
-  @Test
-  public void mergeMultipleOnPushToBranchWithNewPatchset() throws Exception {
-    grant(project, "refs/heads/master", Permission.PUSH);
-
-    // Create 2 changes.
-    ObjectId initialHead = getRemoteHead();
-    PushOneCommit.Result r1 = createChange("Change 1", "a", "a");
-    r1.assertOkStatus();
-    PushOneCommit.Result r2 = createChange("Change 2", "b", "b");
-    r2.assertOkStatus();
-
-    RevCommit c1_1 = r1.getCommit();
-    RevCommit c2_1 = r2.getCommit();
-    PatchSet.Id psId1_1 = r1.getPatchSetId();
-    PatchSet.Id psId2_1 = r2.getPatchSetId();
-    assertThat(c1_1.getParent(0)).isEqualTo(initialHead);
-    assertThat(c2_1.getParent(0)).isEqualTo(c1_1);
-
-    // Amend both changes.
-    testRepo.reset(initialHead);
-    RevCommit c1_2 =
-        testRepo
-            .branch("HEAD")
-            .commit()
-            .message(c1_1.getShortMessage() + "v2")
-            .insertChangeId(r1.getChangeId().substring(1))
-            .create();
-    RevCommit c2_2 = testRepo.cherryPick(c2_1);
-
-    // Push directly to branch.
-    assertPushOk(pushHead(testRepo, "refs/heads/master", false), "refs/heads/master");
-
-    ChangeData cd2 = r2.getChange();
-    assertThat(cd2.change().getStatus()).isEqualTo(Change.Status.MERGED);
-    PatchSet.Id psId2_2 = cd2.change().currentPatchSetId();
-    assertThat(psId2_2.get()).isEqualTo(2);
-    assertThat(cd2.patchSet(psId2_1).getRevision().get()).isEqualTo(c2_1.name());
-    assertThat(cd2.patchSet(psId2_2).getRevision().get()).isEqualTo(c2_2.name());
-
-    ChangeData cd1 = r1.getChange();
-    assertThat(cd1.change().getStatus()).isEqualTo(Change.Status.MERGED);
-    PatchSet.Id psId1_2 = cd1.change().currentPatchSetId();
-    assertThat(psId1_2.get()).isEqualTo(2);
-    assertThat(cd1.patchSet(psId1_1).getRevision().get()).isEqualTo(c1_1.name());
-    assertThat(cd1.patchSet(psId1_2).getRevision().get()).isEqualTo(c1_2.name());
-  }
-
-  private PatchSetApproval getSubmitter(PatchSet.Id patchSetId) throws Exception {
-    ChangeNotes notes = notesFactory.createChecked(db, project, patchSetId.getParentKey()).load();
-    return approvalsUtil.getSubmitter(db, notes, patchSetId);
-  }
-
-  private void assertSubmitApproval(PatchSet.Id patchSetId) throws Exception {
-    PatchSetApproval a = getSubmitter(patchSetId);
-    assertThat(a.isLegacySubmit()).isTrue();
-    assertThat(a.getValue()).isEqualTo((short) 1);
-    assertThat(a.getAccountId()).isEqualTo(admin.id);
-  }
-
-  private void assertCommit(Project.NameKey project, String branch) throws Exception {
-    try (Repository r = repoManager.openRepository(project);
-        RevWalk rw = new RevWalk(r)) {
-      RevCommit c = rw.parseCommit(r.exactRef(branch).getObjectId());
-      assertThat(c.getShortMessage()).isEqualTo(PushOneCommit.SUBJECT);
-      assertThat(c.getAuthorIdent().getEmailAddress()).isEqualTo(admin.email);
-      assertThat(c.getCommitterIdent().getEmailAddress()).isEqualTo(admin.email);
-    }
-  }
-
-  private void assertMergeCommit(String branch, String subject) throws Exception {
-    try (Repository r = repoManager.openRepository(project);
-        RevWalk rw = new RevWalk(r)) {
-      RevCommit c = rw.parseCommit(r.exactRef(branch).getObjectId());
-      assertThat(c.getParentCount()).isEqualTo(2);
-      assertThat(c.getShortMessage()).isEqualTo("Merge \"" + subject + "\"");
-      assertThat(c.getAuthorIdent().getEmailAddress()).isEqualTo(admin.email);
-      assertThat(c.getCommitterIdent().getEmailAddress())
-          .isEqualTo(serverIdent.get().getEmailAddress());
-    }
-  }
-
-  private void assertTag(Project.NameKey project, String branch, PushOneCommit.Tag tag)
-      throws Exception {
-    try (Repository repo = repoManager.openRepository(project)) {
-      Ref tagRef = repo.findRef(tag.name);
-      assertThat(tagRef).isNotNull();
-      ObjectId taggedCommit = null;
-      if (tag instanceof PushOneCommit.AnnotatedTag) {
-        PushOneCommit.AnnotatedTag annotatedTag = (PushOneCommit.AnnotatedTag) tag;
-        try (RevWalk rw = new RevWalk(repo)) {
-          RevObject object = rw.parseAny(tagRef.getObjectId());
-          assertThat(object).isInstanceOf(RevTag.class);
-          RevTag tagObject = (RevTag) object;
-          assertThat(tagObject.getFullMessage()).isEqualTo(annotatedTag.message);
-          assertThat(tagObject.getTaggerIdent()).isEqualTo(annotatedTag.tagger);
-          taggedCommit = tagObject.getObject();
-        }
-      } else {
-        taggedCommit = tagRef.getObjectId();
-      }
-      ObjectId headCommit = repo.exactRef(branch).getObjectId();
-      assertThat(taggedCommit).isNotNull();
-      assertThat(taggedCommit).isEqualTo(headCommit);
-    }
-  }
-
-  private PushOneCommit.Result push(String ref, String subject, String fileName, String content)
-      throws Exception {
-    PushOneCommit push =
-        pushFactory.create(db, admin.getIdent(), testRepo, subject, fileName, content);
-    return push.to(ref);
-  }
-
-  private PushOneCommit.Result push(
-      String ref, String subject, String fileName, String content, String changeId)
-      throws Exception {
-    PushOneCommit push =
-        pushFactory.create(db, admin.getIdent(), testRepo, subject, fileName, content, changeId);
-    return push.to(ref);
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSectionParserIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSectionParserIT.java
deleted file mode 100644
index d0225c7..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSectionParserIT.java
+++ /dev/null
@@ -1,426 +0,0 @@
-// 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.
-
-package com.google.gerrit.acceptance.git;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.common.collect.Sets;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.SubmoduleSubscription;
-import com.google.gerrit.server.util.SubmoduleSectionParser;
-import java.util.Set;
-import org.eclipse.jgit.lib.Config;
-import org.junit.Test;
-
-public class SubmoduleSectionParserIT extends AbstractDaemonTest {
-  private static final String THIS_SERVER = "http://localhost/";
-
-  @Test
-  public void followMasterBranch() throws Exception {
-    Project.NameKey p = createProject("a");
-    Config cfg = new Config();
-    cfg.fromText(
-        ""
-            + "[submodule \"a\"]\n"
-            + "path = localpath-to-a\n"
-            + "url = ssh://localhost/"
-            + p.get()
-            + "\n"
-            + "branch = master\n");
-    Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master");
-
-    Set<SubmoduleSubscription> res =
-        new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections();
-
-    Set<SubmoduleSubscription> expected =
-        Sets.newHashSet(
-            new SubmoduleSubscription(
-                targetBranch, new Branch.NameKey(p, "master"), "localpath-to-a"));
-
-    assertThat(res).containsExactlyElementsIn(expected);
-  }
-
-  @Test
-  public void followMatchingBranch() throws Exception {
-    Project.NameKey p = createProject("a");
-    Config cfg = new Config();
-    cfg.fromText(
-        ""
-            + "[submodule \"a\"]\n"
-            + "path = a\n"
-            + "url = ssh://localhost/"
-            + p.get()
-            + "\n"
-            + "branch = .\n");
-
-    Branch.NameKey targetBranch1 = new Branch.NameKey(new Project.NameKey("project"), "master");
-
-    Set<SubmoduleSubscription> res1 =
-        new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch1).parseAllSections();
-
-    Set<SubmoduleSubscription> expected1 =
-        Sets.newHashSet(
-            new SubmoduleSubscription(targetBranch1, new Branch.NameKey(p, "master"), "a"));
-
-    assertThat(res1).containsExactlyElementsIn(expected1);
-
-    Branch.NameKey targetBranch2 = new Branch.NameKey(new Project.NameKey("project"), "somebranch");
-
-    Set<SubmoduleSubscription> res2 =
-        new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch2).parseAllSections();
-
-    Set<SubmoduleSubscription> expected2 =
-        Sets.newHashSet(
-            new SubmoduleSubscription(targetBranch2, new Branch.NameKey(p, "somebranch"), "a"));
-
-    assertThat(res2).containsExactlyElementsIn(expected2);
-  }
-
-  @Test
-  public void followAnotherBranch() throws Exception {
-    Project.NameKey p = createProject("a");
-    Config cfg = new Config();
-    cfg.fromText(
-        ""
-            + "[submodule \"a\"]\n"
-            + "path = a\n"
-            + "url = ssh://localhost/"
-            + p.get()
-            + "\n"
-            + "branch = anotherbranch\n");
-
-    Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master");
-
-    Set<SubmoduleSubscription> res =
-        new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections();
-
-    Set<SubmoduleSubscription> expected =
-        Sets.newHashSet(
-            new SubmoduleSubscription(targetBranch, new Branch.NameKey(p, "anotherbranch"), "a"));
-
-    assertThat(res).containsExactlyElementsIn(expected);
-  }
-
-  @Test
-  public void withAnotherURI() throws Exception {
-    Project.NameKey p = createProject("a");
-    Config cfg = new Config();
-    cfg.fromText(
-        ""
-            + "[submodule \"a\"]\n"
-            + "path = a\n"
-            + "url = http://localhost:80/"
-            + p.get()
-            + "\n"
-            + "branch = master\n");
-
-    Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master");
-
-    Set<SubmoduleSubscription> res =
-        new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections();
-
-    Set<SubmoduleSubscription> expected =
-        Sets.newHashSet(
-            new SubmoduleSubscription(targetBranch, new Branch.NameKey(p, "master"), "a"));
-
-    assertThat(res).containsExactlyElementsIn(expected);
-  }
-
-  @Test
-  public void withSlashesInProjectName() throws Exception {
-    Project.NameKey p = createProject("project/with/slashes/a");
-    Config cfg = new Config();
-    cfg.fromText(
-        ""
-            + "[submodule \"project/with/slashes/a\"]\n"
-            + "path = a\n"
-            + "url = http://localhost:80/"
-            + p.get()
-            + "\n"
-            + "branch = master\n");
-
-    Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master");
-
-    Set<SubmoduleSubscription> res =
-        new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections();
-
-    Set<SubmoduleSubscription> expected =
-        Sets.newHashSet(
-            new SubmoduleSubscription(targetBranch, new Branch.NameKey(p, "master"), "a"));
-
-    assertThat(res).containsExactlyElementsIn(expected);
-  }
-
-  @Test
-  public void withSlashesInPath() throws Exception {
-    Project.NameKey p = createProject("a");
-    Config cfg = new Config();
-    cfg.fromText(
-        ""
-            + "[submodule \"a\"]\n"
-            + "path = a/b/c/d/e\n"
-            + "url = http://localhost:80/"
-            + p.get()
-            + "\n"
-            + "branch = master\n");
-
-    Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master");
-
-    Set<SubmoduleSubscription> res =
-        new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections();
-
-    Set<SubmoduleSubscription> expected =
-        Sets.newHashSet(
-            new SubmoduleSubscription(targetBranch, new Branch.NameKey(p, "master"), "a/b/c/d/e"));
-
-    assertThat(res).containsExactlyElementsIn(expected);
-  }
-
-  @Test
-  public void withMoreSections() throws Exception {
-    Project.NameKey p1 = createProject("a");
-    Project.NameKey p2 = createProject("b");
-    Config cfg = new Config();
-    cfg.fromText(
-        ""
-            + "[submodule \"a\"]\n"
-            + "     path = a\n"
-            + "     url = ssh://localhost/"
-            + p1.get()
-            + "\n"
-            + "     branch = .\n"
-            + "[submodule \"b\"]\n"
-            + "		path = b\n"
-            + "		url = http://localhost:80/"
-            + p2.get()
-            + "\n"
-            + "		branch = master\n");
-
-    Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master");
-
-    Set<SubmoduleSubscription> res =
-        new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections();
-
-    Set<SubmoduleSubscription> expected =
-        Sets.newHashSet(
-            new SubmoduleSubscription(targetBranch, new Branch.NameKey(p1, "master"), "a"),
-            new SubmoduleSubscription(targetBranch, new Branch.NameKey(p2, "master"), "b"));
-
-    assertThat(res).containsExactlyElementsIn(expected);
-  }
-
-  @Test
-  public void withSubProjectFound() throws Exception {
-    Project.NameKey p1 = createProject("a/b");
-    Project.NameKey p2 = createProject("b");
-    Config cfg = new Config();
-    cfg.fromText(
-        "\n"
-            + "[submodule \"a/b\"]\n"
-            + "path = a/b\n"
-            + "url = ssh://localhost/"
-            + p1.get()
-            + "\n"
-            + "branch = .\n"
-            + "[submodule \"b\"]\n"
-            + "path = b\n"
-            + "url = http://localhost/"
-            + p2.get()
-            + "\n"
-            + "branch = .\n");
-
-    Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master");
-
-    Set<SubmoduleSubscription> res =
-        new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections();
-
-    Set<SubmoduleSubscription> expected =
-        Sets.newHashSet(
-            new SubmoduleSubscription(targetBranch, new Branch.NameKey(p2, "master"), "b"),
-            new SubmoduleSubscription(targetBranch, new Branch.NameKey(p1, "master"), "a/b"));
-
-    assertThat(res).containsExactlyElementsIn(expected);
-  }
-
-  @Test
-  public void withAnInvalidSection() throws Exception {
-    Project.NameKey p1 = createProject("a");
-    Project.NameKey p2 = createProject("b");
-    Project.NameKey p3 = createProject("d");
-    Project.NameKey p4 = createProject("e");
-    Config cfg = new Config();
-    cfg.fromText(
-        "\n"
-            + "[submodule \"a\"]\n"
-            + "    path = a\n"
-            + "    url = ssh://localhost/"
-            + p1.get()
-            + "\n"
-            + "    branch = .\n"
-            + "[submodule \"b\"]\n"
-            // path missing
-            + "    url = http://localhost:80/"
-            + p2.get()
-            + "\n"
-            + "    branch = master\n"
-            + "[submodule \"c\"]\n"
-            + "    path = c\n"
-            // url missing
-            + "    branch = .\n"
-            + "[submodule \"d\"]\n"
-            + "    path = d-parent/the-d-folder\n"
-            + "    url = ssh://localhost/"
-            + p3.get()
-            + "\n"
-            // branch missing
-            + "[submodule \"e\"]\n"
-            + "    path = e\n"
-            + "    url = ssh://localhost/"
-            + p4.get()
-            + "\n"
-            + "    branch = refs/heads/master\n");
-
-    Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master");
-
-    Set<SubmoduleSubscription> res =
-        new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections();
-
-    Set<SubmoduleSubscription> expected =
-        Sets.newHashSet(
-            new SubmoduleSubscription(targetBranch, new Branch.NameKey(p1, "master"), "a"),
-            new SubmoduleSubscription(targetBranch, new Branch.NameKey(p4, "master"), "e"));
-
-    assertThat(res).containsExactlyElementsIn(expected);
-  }
-
-  @Test
-  public void withSectionOfNonexistingProject() throws Exception {
-    Config cfg = new Config();
-    cfg.fromText(
-        "\n"
-            + "[submodule \"a\"]\n"
-            + "path = a\n"
-            + "url = ssh://non-localhost/a\n"
-            // Project "a" doesn't exist
-            + "branch = .\\n");
-
-    Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master");
-
-    Set<SubmoduleSubscription> res =
-        new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections();
-
-    assertThat(res).isEmpty();
-  }
-
-  @Test
-  public void withSectionToOtherServer() throws Exception {
-    Project.NameKey p1 = createProject("a");
-    Config cfg = new Config();
-    cfg.fromText(
-        ""
-            + "[submodule \"a\"]"
-            + "path = a"
-            + "url = ssh://non-localhost/"
-            + p1.get()
-            + "\n"
-            + "branch = .");
-
-    Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master");
-
-    Set<SubmoduleSubscription> res =
-        new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections();
-
-    assertThat(res).isEmpty();
-  }
-
-  @Test
-  public void withRelativeURI() throws Exception {
-    Project.NameKey p1 = createProject("a");
-    Config cfg = new Config();
-    cfg.fromText(
-        ""
-            + "[submodule \"a\"]\n"
-            + "path = a\n"
-            + "url = ../"
-            + p1.get()
-            + "\n"
-            + "branch = master\n");
-
-    Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master");
-
-    Set<SubmoduleSubscription> res =
-        new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections();
-
-    Set<SubmoduleSubscription> expected =
-        Sets.newHashSet(
-            new SubmoduleSubscription(targetBranch, new Branch.NameKey(p1, "master"), "a"));
-
-    assertThat(res).containsExactlyElementsIn(expected);
-  }
-
-  @Test
-  public void withDeepRelativeURI() throws Exception {
-    Project.NameKey p1 = createProject("a");
-    Config cfg = new Config();
-    cfg.fromText(
-        ""
-            + "[submodule \"a\"]\n"
-            + "path = a\n"
-            + "url = ../../"
-            + p1.get()
-            + "\n"
-            + "branch = master\n");
-
-    Branch.NameKey targetBranch =
-        new Branch.NameKey(new Project.NameKey("nested/project"), "master");
-
-    Set<SubmoduleSubscription> res =
-        new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections();
-
-    Set<SubmoduleSubscription> expected =
-        Sets.newHashSet(
-            new SubmoduleSubscription(targetBranch, new Branch.NameKey(p1, "master"), "a"));
-
-    assertThat(res).containsExactlyElementsIn(expected);
-  }
-
-  @Test
-  public void withOverlyDeepRelativeURI() throws Exception {
-    Project.NameKey p1 = createProject("nested/a");
-    Config cfg = new Config();
-    cfg.fromText(
-        ""
-            + "[submodule \"a\"]\n"
-            + "path = a\n"
-            + "url = ../../"
-            + p1.get()
-            + "\n"
-            + "branch = master\n");
-
-    Branch.NameKey targetBranch =
-        new Branch.NameKey(new Project.NameKey("nested/project"), "master");
-
-    Set<SubmoduleSubscription> res =
-        new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections();
-
-    Set<SubmoduleSubscription> expected =
-        Sets.newHashSet(
-            new SubmoduleSubscription(targetBranch, new Branch.NameKey(p1, "master"), "a"));
-
-    assertThat(res).containsExactlyElementsIn(expected);
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsIT.java
deleted file mode 100644
index 689c5b7..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsIT.java
+++ /dev/null
@@ -1,545 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.acceptance.git;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.TruthJUnit.assume;
-
-import com.google.common.collect.Iterables;
-import com.google.gerrit.acceptance.GerritConfig;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.testutil.ConfigSuite;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.PushResult;
-import org.eclipse.jgit.transport.RefSpec;
-import org.eclipse.jgit.transport.RemoteRefUpdate;
-import org.junit.Test;
-
-@NoHttpd
-public class SubmoduleSubscriptionsIT extends AbstractSubmoduleSubscription {
-  @ConfigSuite.Config
-  public static Config submitWholeTopicEnabled() {
-    return submitWholeTopicEnabledConfig();
-  }
-
-  @Test
-  @GerritConfig(name = "submodule.enableSuperProjectSubscriptions", value = "false")
-  public void testSubscriptionWithoutGlobalServerSetting() throws Exception {
-    TestRepository<?> superRepo = createProjectWithPush("super-project");
-    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
-    allowMatchingSubmoduleSubscription(
-        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
-
-    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
-    pushChangeTo(subRepo, "master");
-    assertThat(hasSubmodule(superRepo, "master", "subscribed-to-project")).isFalse();
-  }
-
-  @Test
-  public void subscriptionWithoutSpecificSubscription() throws Exception {
-    TestRepository<?> superRepo = createProjectWithPush("super-project");
-    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
-
-    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
-    pushChangeTo(subRepo, "master");
-    assertThat(hasSubmodule(superRepo, "master", "subscribed-to-project")).isFalse();
-  }
-
-  @Test
-  public void subscriptionToEmptyRepo() throws Exception {
-    TestRepository<?> superRepo = createProjectWithPush("super-project");
-    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
-    allowMatchingSubmoduleSubscription(
-        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
-
-    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
-    pushChangeTo(subRepo, "master");
-    ObjectId subHEAD = pushChangeTo(subRepo, "master");
-    assertThat(hasSubmodule(superRepo, "master", "subscribed-to-project")).isTrue();
-    expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subHEAD);
-  }
-
-  @Test
-  public void subscriptionToExistingRepo() throws Exception {
-    TestRepository<?> superRepo = createProjectWithPush("super-project");
-    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
-    allowMatchingSubmoduleSubscription(
-        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
-
-    pushChangeTo(subRepo, "master");
-    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
-    ObjectId subHEAD = pushChangeTo(subRepo, "master");
-    assertThat(hasSubmodule(superRepo, "master", "subscribed-to-project")).isTrue();
-    expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subHEAD);
-  }
-
-  @Test
-  public void subscriptionWildcardACLForSingleBranch() throws Exception {
-    TestRepository<?> superRepo = createProjectWithPush("super-project");
-    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
-    // master is allowed to be subscribed to master branch only:
-    allowMatchingSubmoduleSubscription(
-        "subscribed-to-project", "refs/heads/master", "super-project", null);
-    // create 'branch':
-    pushChangeTo(superRepo, "branch");
-
-    pushChangeTo(subRepo, "master");
-    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
-    createSubmoduleSubscription(superRepo, "branch", "subscribed-to-project", "master");
-
-    ObjectId subHEAD = pushChangeTo(subRepo, "master");
-
-    expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subHEAD);
-    assertThat(hasSubmodule(superRepo, "branch", "subscribed-to-project")).isFalse();
-  }
-
-  @Test
-  public void subscriptionWildcardACLForMissingProject() throws Exception {
-    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
-    allowMatchingSubmoduleSubscription(
-        "subscribed-to-project", "refs/heads/*", "not-existing-super-project", "refs/heads/*");
-    pushChangeTo(subRepo, "master");
-  }
-
-  @Test
-  public void subscriptionWildcardACLForMissingBranch() throws Exception {
-    createProjectWithPush("super-project");
-    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
-    allowMatchingSubmoduleSubscription(
-        "subscribed-to-project", "refs/heads/*", "super-project", "refs/heads/*");
-    pushChangeTo(subRepo, "foo");
-  }
-
-  @Test
-  public void subscriptionWildcardACLForMissingGitmodules() throws Exception {
-    TestRepository<?> superRepo = createProjectWithPush("super-project");
-    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
-    allowMatchingSubmoduleSubscription(
-        "subscribed-to-project", "refs/heads/*", "super-project", "refs/heads/*");
-    pushChangeTo(superRepo, "master");
-    pushChangeTo(subRepo, "master");
-  }
-
-  @Test
-  public void subscriptionWildcardACLOneOnOneMapping() throws Exception {
-    TestRepository<?> superRepo = createProjectWithPush("super-project");
-    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
-    // any branch is allowed to be subscribed to the same superprojects branch:
-    allowMatchingSubmoduleSubscription(
-        "subscribed-to-project", "refs/heads/*", "super-project", "refs/heads/*");
-
-    // create 'branch' in both repos:
-    pushChangeTo(superRepo, "branch");
-    pushChangeTo(subRepo, "branch");
-
-    pushChangeTo(subRepo, "master");
-    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
-    createSubmoduleSubscription(superRepo, "branch", "subscribed-to-project", "branch");
-
-    ObjectId subHEAD1 = pushChangeTo(subRepo, "master");
-    ObjectId subHEAD2 = pushChangeTo(subRepo, "branch");
-
-    expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subHEAD1);
-    expectToHaveSubmoduleState(superRepo, "branch", "subscribed-to-project", subHEAD2);
-
-    // Now test that cross subscriptions do not work:
-    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "branch");
-    ObjectId subHEAD3 = pushChangeTo(subRepo, "branch");
-
-    expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subHEAD1);
-    expectToHaveSubmoduleState(superRepo, "branch", "subscribed-to-project", subHEAD3);
-  }
-
-  @Test
-  public void subscriptionWildcardACLForManyBranches() throws Exception {
-    TestRepository<?> superRepo = createProjectWithPush("super-project");
-    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
-
-    // Any branch is allowed to be subscribed to any superproject branch:
-    allowSubmoduleSubscription(
-        "subscribed-to-project", "refs/heads/*", "super-project", null, false);
-    pushChangeTo(superRepo, "branch");
-    pushChangeTo(subRepo, "another-branch");
-    createSubmoduleSubscription(superRepo, "branch", "subscribed-to-project", "another-branch");
-    ObjectId subHEAD = pushChangeTo(subRepo, "another-branch");
-    expectToHaveSubmoduleState(superRepo, "branch", "subscribed-to-project", subHEAD);
-  }
-
-  @Test
-  public void subscriptionWildcardACLOneToManyBranches() throws Exception {
-    TestRepository<?> superRepo = createProjectWithPush("super-project");
-    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
-
-    // Any branch is allowed to be subscribed to any superproject branch:
-    allowSubmoduleSubscription(
-        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/*", false);
-    pushChangeTo(superRepo, "branch");
-    createSubmoduleSubscription(superRepo, "branch", "subscribed-to-project", "master");
-    ObjectId subHEAD = pushChangeTo(subRepo, "master");
-    expectToHaveSubmoduleState(superRepo, "branch", "subscribed-to-project", subHEAD);
-
-    createSubmoduleSubscription(superRepo, "branch", "subscribed-to-project", "branch");
-    pushChangeTo(subRepo, "branch");
-
-    // no change expected, as only master is subscribed:
-    expectToHaveSubmoduleState(superRepo, "branch", "subscribed-to-project", subHEAD);
-  }
-
-  @Test
-  @GerritConfig(name = "submodule.verboseSuperprojectUpdate", value = "false")
-  public void testSubmoduleShortCommitMessage() throws Exception {
-    TestRepository<?> superRepo = createProjectWithPush("super-project");
-    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
-    allowMatchingSubmoduleSubscription(
-        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
-
-    pushChangeTo(subRepo, "master");
-    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
-
-    // The first update doesn't include any commit messages
-    ObjectId subRepoId = pushChangeTo(subRepo, "master");
-    expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subRepoId);
-    expectToHaveCommitMessage(superRepo, "master", "Update git submodules\n\n");
-
-    // Any following update also has a short message
-    subRepoId = pushChangeTo(subRepo, "master");
-    expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subRepoId);
-    expectToHaveCommitMessage(superRepo, "master", "Update git submodules\n\n");
-  }
-
-  @Test
-  @GerritConfig(name = "submodule.verboseSuperprojectUpdate", value = "SUBJECT_ONLY")
-  public void testSubmoduleSubjectCommitMessage() throws Exception {
-    TestRepository<?> superRepo = createProjectWithPush("super-project");
-    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
-    allowMatchingSubmoduleSubscription(
-        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
-
-    pushChangeTo(subRepo, "master");
-    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
-    ObjectId subHEAD = pushChangeTo(subRepo, "master");
-
-    // The first update doesn't include the rev log
-    RevWalk rw = subRepo.getRevWalk();
-    expectToHaveCommitMessage(
-        superRepo,
-        "master",
-        "Update git submodules\n\n"
-            + "* Update "
-            + name("subscribed-to-project")
-            + " from branch 'master'\n  to "
-            + subHEAD.getName());
-
-    // The next commit should generate only its commit message,
-    // omitting previous commit logs
-    subHEAD = pushChangeTo(subRepo, "master");
-    RevCommit subCommitMsg = rw.parseCommit(subHEAD);
-    expectToHaveCommitMessage(
-        superRepo,
-        "master",
-        "Update git submodules\n\n"
-            + "* Update "
-            + name("subscribed-to-project")
-            + " from branch 'master'\n  to "
-            + subHEAD.getName()
-            + "\n  - "
-            + subCommitMsg.getShortMessage());
-  }
-
-  @Test
-  public void submoduleCommitMessage() throws Exception {
-    TestRepository<?> superRepo = createProjectWithPush("super-project");
-    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
-    allowMatchingSubmoduleSubscription(
-        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
-
-    pushChangeTo(subRepo, "master");
-    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
-    ObjectId subHEAD = pushChangeTo(subRepo, "master");
-
-    // The first update doesn't include the rev log
-    RevWalk rw = subRepo.getRevWalk();
-    expectToHaveCommitMessage(
-        superRepo,
-        "master",
-        "Update git submodules\n\n"
-            + "* Update "
-            + name("subscribed-to-project")
-            + " from branch 'master'\n  to "
-            + subHEAD.getName());
-
-    // The next commit should generate only its commit message,
-    // omitting previous commit logs
-    subHEAD = pushChangeTo(subRepo, "master");
-    RevCommit subCommitMsg = rw.parseCommit(subHEAD);
-    expectToHaveCommitMessage(
-        superRepo,
-        "master",
-        "Update git submodules\n\n"
-            + "* Update "
-            + name("subscribed-to-project")
-            + " from branch 'master'\n  to "
-            + subHEAD.getName()
-            + "\n  - "
-            + subCommitMsg.getFullMessage().replace("\n", "\n    "));
-  }
-
-  @Test
-  public void subscriptionUnsubscribe() throws Exception {
-    TestRepository<?> superRepo = createProjectWithPush("super-project");
-    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
-    allowMatchingSubmoduleSubscription(
-        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
-
-    pushChangeTo(subRepo, "master");
-    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
-
-    pushChangeTo(subRepo, "master");
-    ObjectId subHEADbeforeUnsubscribing = pushChangeTo(subRepo, "master");
-
-    deleteAllSubscriptions(superRepo, "master");
-    expectToHaveSubmoduleState(
-        superRepo, "master", "subscribed-to-project", subHEADbeforeUnsubscribing);
-
-    pushChangeTo(superRepo, "refs/heads/master", "commit after unsubscribe", "");
-    pushChangeTo(subRepo, "refs/heads/master", "commit after unsubscribe", "");
-    expectToHaveSubmoduleState(
-        superRepo, "master", "subscribed-to-project", subHEADbeforeUnsubscribing);
-  }
-
-  @Test
-  public void subscriptionUnsubscribeByDeletingGitModules() throws Exception {
-    TestRepository<?> superRepo = createProjectWithPush("super-project");
-    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
-    allowMatchingSubmoduleSubscription(
-        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
-
-    pushChangeTo(subRepo, "master");
-    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
-
-    pushChangeTo(subRepo, "master");
-    ObjectId subHEADbeforeUnsubscribing = pushChangeTo(subRepo, "master");
-
-    deleteGitModulesFile(superRepo, "master");
-    expectToHaveSubmoduleState(
-        superRepo, "master", "subscribed-to-project", subHEADbeforeUnsubscribing);
-
-    pushChangeTo(superRepo, "refs/heads/master", "commit after unsubscribe", "");
-    pushChangeTo(subRepo, "refs/heads/master", "commit after unsubscribe", "");
-    expectToHaveSubmoduleState(
-        superRepo, "master", "subscribed-to-project", subHEADbeforeUnsubscribing);
-  }
-
-  @Test
-  public void subscriptionToDifferentBranches() throws Exception {
-    TestRepository<?> superRepo = createProjectWithPush("super-project");
-    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
-    allowMatchingSubmoduleSubscription(
-        "subscribed-to-project", "refs/heads/foo", "super-project", "refs/heads/master");
-
-    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "foo");
-    ObjectId subFoo = pushChangeTo(subRepo, "foo");
-    pushChangeTo(subRepo, "master");
-
-    expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subFoo);
-  }
-
-  @Test
-  public void branchCircularSubscription() throws Exception {
-    TestRepository<?> superRepo = createProjectWithPush("super-project");
-    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
-    allowMatchingSubmoduleSubscription(
-        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
-    allowMatchingSubmoduleSubscription(
-        "super-project", "refs/heads/master", "subscribed-to-project", "refs/heads/master");
-
-    pushChangeTo(subRepo, "master");
-    pushChangeTo(superRepo, "master");
-    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
-    createSubmoduleSubscription(subRepo, "master", "super-project", "master");
-
-    pushChangeTo(subRepo, "master");
-    pushChangeTo(superRepo, "master");
-
-    assertThat(hasSubmodule(subRepo, "master", "super-project")).isFalse();
-    assertThat(hasSubmodule(superRepo, "master", "subscribed-to-project")).isFalse();
-  }
-
-  @Test
-  public void projectCircularSubscription() throws Exception {
-    TestRepository<?> superRepo = createProjectWithPush("super-project");
-    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
-
-    allowMatchingSubmoduleSubscription(
-        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
-    allowMatchingSubmoduleSubscription(
-        "super-project", "refs/heads/dev", "subscribed-to-project", "refs/heads/dev");
-
-    pushChangeTo(subRepo, "master");
-    pushChangeTo(superRepo, "master");
-    pushChangeTo(subRepo, "dev");
-    pushChangeTo(superRepo, "dev");
-
-    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
-    createSubmoduleSubscription(subRepo, "dev", "super-project", "dev");
-
-    ObjectId subMasterHead = pushChangeTo(subRepo, "master");
-    ObjectId superDevHead = pushChangeTo(superRepo, "dev");
-
-    assertThat(hasSubmodule(superRepo, "master", "subscribed-to-project")).isTrue();
-    assertThat(hasSubmodule(subRepo, "dev", "super-project")).isTrue();
-    expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subMasterHead);
-    expectToHaveSubmoduleState(subRepo, "dev", "super-project", superDevHead);
-  }
-
-  @Test
-  public void subscriptionFailOnMissingACL() throws Exception {
-    TestRepository<?> superRepo = createProjectWithPush("super-project");
-    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
-
-    pushChangeTo(subRepo, "master");
-    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
-    pushChangeTo(subRepo, "master");
-    assertThat(hasSubmodule(superRepo, "master", "subscribed-to-project")).isFalse();
-  }
-
-  @Test
-  public void subscriptionFailOnWrongProjectACL() throws Exception {
-    TestRepository<?> superRepo = createProjectWithPush("super-project");
-    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
-    allowMatchingSubmoduleSubscription(
-        "subscribed-to-project", "refs/heads/master", "wrong-super-project", "refs/heads/master");
-
-    pushChangeTo(subRepo, "master");
-    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
-    pushChangeTo(subRepo, "master");
-    assertThat(hasSubmodule(superRepo, "master", "subscribed-to-project")).isFalse();
-  }
-
-  @Test
-  public void subscriptionFailOnWrongBranchACL() throws Exception {
-    TestRepository<?> superRepo = createProjectWithPush("super-project");
-    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
-    allowMatchingSubmoduleSubscription(
-        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/wrong-branch");
-
-    pushChangeTo(subRepo, "master");
-    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
-    pushChangeTo(subRepo, "master");
-    assertThat(hasSubmodule(superRepo, "master", "subscribed-to-project")).isFalse();
-  }
-
-  @Test
-  public void subscriptionInheritACL() throws Exception {
-    createProjectWithPush("config-repo");
-    createProjectWithPush("config-repo2", new Project.NameKey(name("config-repo")));
-    TestRepository<?> superRepo = createProjectWithPush("super-project");
-    TestRepository<?> subRepo =
-        createProjectWithPush("subscribed-to-project", new Project.NameKey(name("config-repo2")));
-    allowMatchingSubmoduleSubscription(
-        "config-repo", "refs/heads/*", "super-project", "refs/heads/*");
-
-    pushChangeTo(subRepo, "master");
-    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
-    ObjectId subHEAD = pushChangeTo(subRepo, "master");
-    expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subHEAD);
-  }
-
-  @Test
-  public void allowedButNotSubscribed() throws Exception {
-    TestRepository<?> superRepo = createProjectWithPush("super-project");
-    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
-    allowMatchingSubmoduleSubscription(
-        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
-
-    pushChangeTo(subRepo, "master");
-    subRepo
-        .branch("HEAD")
-        .commit()
-        .insertChangeId()
-        .message("some change")
-        .add("b.txt", "b contents for testing")
-        .create();
-    String refspec = "HEAD:refs/heads/master";
-    PushResult r =
-        Iterables.getOnlyElement(
-            subRepo.git().push().setRemote("origin").setRefSpecs(new RefSpec(refspec)).call());
-    assertThat(r.getMessages()).doesNotContain("error");
-    assertThat(r.getRemoteUpdate("refs/heads/master").getStatus())
-        .isEqualTo(RemoteRefUpdate.Status.OK);
-
-    assertThat(hasSubmodule(superRepo, "master", "subscribed-to-project")).isFalse();
-  }
-
-  @Test
-  public void subscriptionDeepRelative() throws Exception {
-    TestRepository<?> superRepo = createProjectWithPush("super-project");
-    TestRepository<?> subRepo = createProjectWithPush("nested/subscribed-to-project");
-    // master is allowed to be subscribed to any superprojects branch:
-    allowMatchingSubmoduleSubscription(
-        "nested/subscribed-to-project", "refs/heads/master", "super-project", null);
-
-    pushChangeTo(subRepo, "master");
-    createRelativeSubmoduleSubscription(
-        superRepo, "master", "../", "nested/subscribed-to-project", "master");
-
-    ObjectId subHEAD = pushChangeTo(subRepo, "master");
-
-    expectToHaveSubmoduleState(superRepo, "master", "nested/subscribed-to-project", subHEAD);
-  }
-
-  @Test
-  @GerritConfig(name = "submodule.verboseSuperprojectUpdate", value = "SUBJECT_ONLY")
-  @GerritConfig(name = "submodule.maxCommitMessages", value = "1")
-  public void submoduleSubjectCommitMessageCountLimit() throws Exception {
-    testSubmoduleSubjectCommitMessageAndExpectTruncation();
-  }
-
-  @Test
-  @GerritConfig(name = "submodule.verboseSuperprojectUpdate", value = "SUBJECT_ONLY")
-  @GerritConfig(name = "submodule.maxCombinedCommitMessageSize", value = "220")
-  public void submoduleSubjectCommitMessageSizeLimit() throws Exception {
-    assume().that(isSubmitWholeTopicEnabled()).isFalse();
-    testSubmoduleSubjectCommitMessageAndExpectTruncation();
-  }
-
-  private void testSubmoduleSubjectCommitMessageAndExpectTruncation() throws Exception {
-    TestRepository<?> superRepo = createProjectWithPush("super-project");
-    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
-    allowMatchingSubmoduleSubscription(
-        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
-
-    pushChangeTo(subRepo, "master");
-    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
-    // The first update doesn't include the rev log, so we ignore it
-    pushChangeTo(subRepo, "master");
-
-    // Next, we push two commits at once. Since maxCommitMessages=1, we expect to see only the first
-    // message plus ellipsis to mark truncation.
-    ObjectId subHEAD = pushChangesTo(subRepo, "master", 2);
-    RevCommit subCommitMsg = subRepo.getRevWalk().parseCommit(subHEAD);
-    expectToHaveCommitMessage(
-        superRepo,
-        "master",
-        String.format(
-            "Update git submodules\n\n* Update %s from branch 'master'\n  to %s\n  - %s\n\n[...]",
-            name("subscribed-to-project"), subHEAD.getName(), subCommitMsg.getShortMessage()));
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsWholeTopicMergeIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsWholeTopicMergeIT.java
deleted file mode 100644
index b1a8e0f..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsWholeTopicMergeIT.java
+++ /dev/null
@@ -1,859 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.acceptance.git;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth.assertWithMessage;
-import static com.google.common.truth.TruthJUnit.assume;
-import static com.google.gerrit.acceptance.GitUtil.getChangeId;
-
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.client.ChangeStatus;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.change.Submit.TestSubmitInput;
-import com.google.gerrit.testutil.ConfigSuite;
-import java.util.ArrayDeque;
-import java.util.Map;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.RefSpec;
-import org.junit.Test;
-
-@NoHttpd
-public class SubmoduleSubscriptionsWholeTopicMergeIT extends AbstractSubmoduleSubscription {
-
-  @ConfigSuite.Default
-  public static Config mergeIfNecessary() {
-    return submitByMergeIfNecessary();
-  }
-
-  @ConfigSuite.Config
-  public static Config mergeAlways() {
-    return submitByMergeAlways();
-  }
-
-  @ConfigSuite.Config
-  public static Config cherryPick() {
-    return submitByCherryPickConfig();
-  }
-
-  @ConfigSuite.Config
-  public static Config rebaseAlways() {
-    return submitByRebaseAlwaysConfig();
-  }
-
-  @ConfigSuite.Config
-  public static Config rebaseIfNecessary() {
-    return submitByRebaseIfNecessaryConfig();
-  }
-
-  @Test
-  public void subscriptionUpdateOfManyChanges() throws Exception {
-    TestRepository<?> superRepo = createProjectWithPush("super-project");
-    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
-    allowMatchingSubmoduleSubscription(
-        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
-
-    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
-
-    ObjectId subHEAD =
-        subRepo
-            .branch("HEAD")
-            .commit()
-            .insertChangeId()
-            .message("some change")
-            .add("a.txt", "a contents ")
-            .create();
-    subRepo
-        .git()
-        .push()
-        .setRemote("origin")
-        .setRefSpecs(new RefSpec("HEAD:refs/heads/master"))
-        .call();
-
-    RevCommit c = subRepo.getRevWalk().parseCommit(subHEAD);
-
-    RevCommit c1 =
-        subRepo
-            .branch("HEAD")
-            .commit()
-            .insertChangeId()
-            .message("first change")
-            .add("asdf", "asdf\n")
-            .create();
-    subRepo
-        .git()
-        .push()
-        .setRemote("origin")
-        .setRefSpecs(new RefSpec("HEAD:refs/for/master/" + name("topic-foo")))
-        .call();
-
-    subRepo.reset(c.getId());
-    RevCommit c2 =
-        subRepo
-            .branch("HEAD")
-            .commit()
-            .insertChangeId()
-            .message("qwerty")
-            .add("qwerty", "qwerty")
-            .create();
-
-    RevCommit c3 =
-        subRepo
-            .branch("HEAD")
-            .commit()
-            .insertChangeId()
-            .message("qwerty followup")
-            .add("qwerty", "qwerty\nqwerty\n")
-            .create();
-    subRepo
-        .git()
-        .push()
-        .setRemote("origin")
-        .setRefSpecs(new RefSpec("HEAD:refs/for/master/" + name("topic-foo")))
-        .call();
-
-    String id1 = getChangeId(subRepo, c1).get();
-    String id2 = getChangeId(subRepo, c2).get();
-    String id3 = getChangeId(subRepo, c3).get();
-    gApi.changes().id(id1).current().review(ReviewInput.approve());
-    gApi.changes().id(id2).current().review(ReviewInput.approve());
-    gApi.changes().id(id3).current().review(ReviewInput.approve());
-
-    Map<Branch.NameKey, ObjectId> preview = fetchFromSubmitPreview(id1);
-    gApi.changes().id(id1).current().submit();
-    ObjectId subRepoId =
-        subRepo
-            .git()
-            .fetch()
-            .setRemote("origin")
-            .call()
-            .getAdvertisedRef("refs/heads/master")
-            .getObjectId();
-
-    expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subRepoId);
-
-    // As the submodules have changed commits, the superproject tree will be
-    // different, so we cannot directly compare the trees here, so make
-    // assumptions only about the changed branches:
-    Project.NameKey p1 = new Project.NameKey(name("super-project"));
-    Project.NameKey p2 = new Project.NameKey(name("subscribed-to-project"));
-    assertThat(preview).containsKey(new Branch.NameKey(p1, "refs/heads/master"));
-    assertThat(preview).containsKey(new Branch.NameKey(p2, "refs/heads/master"));
-
-    if ((getSubmitType() == SubmitType.CHERRY_PICK)
-        || (getSubmitType() == SubmitType.REBASE_ALWAYS)) {
-      // each change is updated and the respective target branch is updated:
-      assertThat(preview).hasSize(5);
-    } else if ((getSubmitType() == SubmitType.REBASE_IF_NECESSARY)) {
-      // Either the first is used first as is, then the second and third need
-      // rebasing, or those two stay as is and the first is rebased.
-      // add in 2 master branches, expect 3 or 4:
-      assertThat(preview.size()).isAnyOf(3, 4);
-    } else {
-      assertThat(preview).hasSize(2);
-    }
-  }
-
-  @Test
-  public void subscriptionUpdateIncludingChangeInSuperproject() throws Exception {
-    TestRepository<?> superRepo = createProjectWithPush("super-project");
-    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
-    allowMatchingSubmoduleSubscription(
-        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
-
-    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
-
-    ObjectId subHEAD =
-        subRepo
-            .branch("HEAD")
-            .commit()
-            .insertChangeId()
-            .message("some change")
-            .add("a.txt", "a contents ")
-            .create();
-    subRepo
-        .git()
-        .push()
-        .setRemote("origin")
-        .setRefSpecs(new RefSpec("HEAD:refs/heads/master"))
-        .call();
-
-    RevCommit c = subRepo.getRevWalk().parseCommit(subHEAD);
-
-    RevCommit c1 =
-        subRepo
-            .branch("HEAD")
-            .commit()
-            .insertChangeId()
-            .message("first change")
-            .add("asdf", "asdf\n")
-            .create();
-    subRepo
-        .git()
-        .push()
-        .setRemote("origin")
-        .setRefSpecs(new RefSpec("HEAD:refs/for/master/" + name("topic-foo")))
-        .call();
-
-    subRepo.reset(c.getId());
-    RevCommit c2 =
-        subRepo
-            .branch("HEAD")
-            .commit()
-            .insertChangeId()
-            .message("qwerty")
-            .add("qwerty", "qwerty")
-            .create();
-
-    RevCommit c3 =
-        subRepo
-            .branch("HEAD")
-            .commit()
-            .insertChangeId()
-            .message("qwerty followup")
-            .add("qwerty", "qwerty\nqwerty\n")
-            .create();
-    subRepo
-        .git()
-        .push()
-        .setRemote("origin")
-        .setRefSpecs(new RefSpec("HEAD:refs/for/master/" + name("topic-foo")))
-        .call();
-
-    RevCommit c4 =
-        superRepo
-            .branch("HEAD")
-            .commit()
-            .insertChangeId()
-            .message("new change on superproject")
-            .add("foo", "bar")
-            .create();
-    superRepo
-        .git()
-        .push()
-        .setRemote("origin")
-        .setRefSpecs(new RefSpec("HEAD:refs/for/master/" + name("topic-foo")))
-        .call();
-
-    String id1 = getChangeId(subRepo, c1).get();
-    String id2 = getChangeId(subRepo, c2).get();
-    String id3 = getChangeId(subRepo, c3).get();
-    String id4 = getChangeId(superRepo, c4).get();
-    gApi.changes().id(id1).current().review(ReviewInput.approve());
-    gApi.changes().id(id2).current().review(ReviewInput.approve());
-    gApi.changes().id(id3).current().review(ReviewInput.approve());
-    gApi.changes().id(id4).current().review(ReviewInput.approve());
-
-    gApi.changes().id(id1).current().submit();
-    ObjectId subRepoId =
-        subRepo
-            .git()
-            .fetch()
-            .setRemote("origin")
-            .call()
-            .getAdvertisedRef("refs/heads/master")
-            .getObjectId();
-
-    expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subRepoId);
-  }
-
-  @Test
-  public void updateManySubmodules() throws Exception {
-    TestRepository<?> superRepo = createProjectWithPush("super-project");
-    TestRepository<?> sub1 = createProjectWithPush("sub1");
-    TestRepository<?> sub2 = createProjectWithPush("sub2");
-    TestRepository<?> sub3 = createProjectWithPush("sub3");
-
-    allowMatchingSubmoduleSubscription(
-        "sub1", "refs/heads/master", "super-project", "refs/heads/master");
-    allowMatchingSubmoduleSubscription(
-        "sub2", "refs/heads/master", "super-project", "refs/heads/master");
-    allowMatchingSubmoduleSubscription(
-        "sub3", "refs/heads/master", "super-project", "refs/heads/master");
-
-    Config config = new Config();
-    prepareSubmoduleConfigEntry(config, "sub1", "master");
-    prepareSubmoduleConfigEntry(config, "sub2", "master");
-    prepareSubmoduleConfigEntry(config, "sub3", "master");
-    pushSubmoduleConfig(superRepo, "master", config);
-
-    ObjectId superPreviousId = pushChangeTo(superRepo, "master");
-
-    ObjectId sub1Id = pushChangeTo(sub1, "refs/for/master", "some message", "same-topic");
-    ObjectId sub2Id = pushChangeTo(sub2, "refs/for/master", "some message", "same-topic");
-    ObjectId sub3Id = pushChangeTo(sub3, "refs/for/master", "some message", "same-topic");
-
-    approve(getChangeId(sub1, sub1Id).get());
-    approve(getChangeId(sub2, sub2Id).get());
-    approve(getChangeId(sub3, sub3Id).get());
-
-    gApi.changes().id(getChangeId(sub1, sub1Id).get()).current().submit();
-
-    expectToHaveSubmoduleState(superRepo, "master", "sub1", sub1, "master");
-    expectToHaveSubmoduleState(superRepo, "master", "sub2", sub2, "master");
-    expectToHaveSubmoduleState(superRepo, "master", "sub3", sub3, "master");
-
-    String sub1HEAD =
-        sub1.git()
-            .fetch()
-            .setRemote("origin")
-            .call()
-            .getAdvertisedRef("refs/heads/master")
-            .getObjectId()
-            .name();
-
-    String sub2HEAD =
-        sub2.git()
-            .fetch()
-            .setRemote("origin")
-            .call()
-            .getAdvertisedRef("refs/heads/master")
-            .getObjectId()
-            .name();
-
-    String sub3HEAD =
-        sub3.git()
-            .fetch()
-            .setRemote("origin")
-            .call()
-            .getAdvertisedRef("refs/heads/master")
-            .getObjectId()
-            .name();
-
-    if (getSubmitType() == SubmitType.MERGE_IF_NECESSARY) {
-      expectToHaveCommitMessage(
-          superRepo,
-          "master",
-          "Update git submodules\n\n"
-              + "* Update "
-              + name("sub3")
-              + " from branch 'master'\n  to "
-              + sub3HEAD
-              + "\n\n* Update "
-              + name("sub2")
-              + " from branch 'master'\n  to "
-              + sub2HEAD
-              + "\n\n* Update "
-              + name("sub1")
-              + " from branch 'master'\n  to "
-              + sub1HEAD);
-    }
-
-    superRepo
-        .git()
-        .fetch()
-        .setRemote("origin")
-        .call()
-        .getAdvertisedRef("refs/heads/master")
-        .getObjectId();
-
-    assertWithMessage("submodule subscription update should have made one commit")
-        .that(superRepo.getRepository().resolve("origin/master^"))
-        .isEqualTo(superPreviousId);
-  }
-
-  @Test
-  public void doNotUseFastForward() throws Exception {
-    TestRepository<?> superRepo = createProjectWithPush("super-project", false);
-    TestRepository<?> sub = createProjectWithPush("sub", false);
-
-    allowMatchingSubmoduleSubscription(
-        "sub", "refs/heads/master", "super-project", "refs/heads/master");
-
-    createSubmoduleSubscription(superRepo, "master", "sub", "master");
-
-    ObjectId subId = pushChangeTo(sub, "refs/for/master", "some message", "same-topic");
-
-    ObjectId superId = pushChangeTo(superRepo, "refs/for/master", "some message", "same-topic");
-
-    String subChangeId = getChangeId(sub, subId).get();
-    approve(subChangeId);
-    approve(getChangeId(superRepo, superId).get());
-
-    gApi.changes().id(subChangeId).current().submit();
-
-    expectToHaveSubmoduleState(superRepo, "master", "sub", sub, "master");
-    RevCommit superHead = getRemoteHead(name("super-project"), "master");
-    assertThat(superHead.getShortMessage()).contains("some message");
-    assertThat(superHead.getId()).isNotEqualTo(superId);
-  }
-
-  @Test
-  public void useFastForwardWhenNoSubmodule() throws Exception {
-    TestRepository<?> superRepo = createProjectWithPush("super-project", false);
-    TestRepository<?> sub = createProjectWithPush("sub", false);
-
-    ObjectId subId = pushChangeTo(sub, "refs/for/master", "some message", "same-topic");
-
-    ObjectId superId = pushChangeTo(superRepo, "refs/for/master", "some message", "same-topic");
-
-    String subChangeId = getChangeId(sub, subId).get();
-    approve(subChangeId);
-    approve(getChangeId(superRepo, superId).get());
-
-    gApi.changes().id(subChangeId).current().submit();
-
-    RevCommit superHead = getRemoteHead(name("super-project"), "master");
-    assertThat(superHead.getShortMessage()).isEqualTo("some message");
-    assertThat(superHead.getId()).isEqualTo(superId);
-  }
-
-  @Test
-  public void sameProjectSameBranchDifferentPaths() throws Exception {
-    TestRepository<?> superRepo = createProjectWithPush("super-project");
-    TestRepository<?> sub = createProjectWithPush("sub");
-
-    allowMatchingSubmoduleSubscription(
-        "sub", "refs/heads/master", "super-project", "refs/heads/master");
-
-    Config config = new Config();
-    prepareSubmoduleConfigEntry(config, "sub", "master");
-    prepareSubmoduleConfigEntry(config, "sub", "sub-copy", "master");
-    pushSubmoduleConfig(superRepo, "master", config);
-
-    ObjectId superPreviousId = pushChangeTo(superRepo, "master");
-
-    ObjectId subId = pushChangeTo(sub, "refs/for/master", "some message", "");
-
-    approve(getChangeId(sub, subId).get());
-
-    gApi.changes().id(getChangeId(sub, subId).get()).current().submit();
-
-    expectToHaveSubmoduleState(superRepo, "master", "sub", sub, "master");
-    expectToHaveSubmoduleState(superRepo, "master", "sub-copy", sub, "master");
-
-    superRepo
-        .git()
-        .fetch()
-        .setRemote("origin")
-        .call()
-        .getAdvertisedRef("refs/heads/master")
-        .getObjectId();
-
-    assertWithMessage("submodule subscription update should have made one commit")
-        .that(superRepo.getRepository().resolve("origin/master^"))
-        .isEqualTo(superPreviousId);
-  }
-
-  @Test
-  public void sameProjectDifferentBranchDifferentPaths() throws Exception {
-    TestRepository<?> superRepo = createProjectWithPush("super-project");
-    TestRepository<?> sub = createProjectWithPush("sub");
-
-    allowMatchingSubmoduleSubscription(
-        "sub", "refs/heads/master", "super-project", "refs/heads/master");
-    allowMatchingSubmoduleSubscription(
-        "sub", "refs/heads/dev", "super-project", "refs/heads/master");
-
-    ObjectId devHead = pushChangeTo(sub, "dev");
-    Config config = new Config();
-    prepareSubmoduleConfigEntry(config, "sub", "sub-master", "master");
-    prepareSubmoduleConfigEntry(config, "sub", "sub-dev", "dev");
-    pushSubmoduleConfig(superRepo, "master", config);
-
-    ObjectId subMasterId =
-        pushChangeTo(sub, "refs/for/master", "some message", "b.txt", "content b", "same-topic");
-
-    sub.reset(devHead);
-    ObjectId subDevId =
-        pushChangeTo(
-            sub, "refs/for/dev", "some message in dev", "b.txt", "content b", "same-topic");
-
-    approve(getChangeId(sub, subMasterId).get());
-    approve(getChangeId(sub, subDevId).get());
-
-    ObjectId superPreviousId = pushChangeTo(superRepo, "master");
-
-    gApi.changes().id(getChangeId(sub, subMasterId).get()).current().submit();
-
-    expectToHaveSubmoduleState(superRepo, "master", "sub-master", sub, "master");
-    expectToHaveSubmoduleState(superRepo, "master", "sub-dev", sub, "dev");
-
-    superRepo
-        .git()
-        .fetch()
-        .setRemote("origin")
-        .call()
-        .getAdvertisedRef("refs/heads/master")
-        .getObjectId();
-
-    assertWithMessage("submodule subscription update should have made one commit")
-        .that(superRepo.getRepository().resolve("origin/master^"))
-        .isEqualTo(superPreviousId);
-  }
-
-  @Test
-  public void nonSubmoduleInSameTopic() throws Exception {
-    TestRepository<?> superRepo = createProjectWithPush("super-project");
-    TestRepository<?> sub = createProjectWithPush("sub");
-    TestRepository<?> standAlone = createProjectWithPush("standalone");
-
-    allowMatchingSubmoduleSubscription(
-        "sub", "refs/heads/master", "super-project", "refs/heads/master");
-
-    createSubmoduleSubscription(superRepo, "master", "sub", "master");
-
-    ObjectId superPreviousId = pushChangeTo(superRepo, "master");
-
-    ObjectId subId = pushChangeTo(sub, "refs/for/master", "some message", "same-topic");
-    ObjectId standAloneId =
-        pushChangeTo(standAlone, "refs/for/master", "some message", "same-topic");
-
-    String subChangeId = getChangeId(sub, subId).get();
-    String standAloneChangeId = getChangeId(standAlone, standAloneId).get();
-    approve(subChangeId);
-    approve(standAloneChangeId);
-
-    gApi.changes().id(subChangeId).current().submit();
-
-    expectToHaveSubmoduleState(superRepo, "master", "sub", sub, "master");
-
-    ChangeStatus status = gApi.changes().id(standAloneChangeId).info().status;
-    assertThat(status).isEqualTo(ChangeStatus.MERGED);
-
-    superRepo
-        .git()
-        .fetch()
-        .setRemote("origin")
-        .call()
-        .getAdvertisedRef("refs/heads/master")
-        .getObjectId();
-
-    assertWithMessage("submodule subscription update should have made one commit")
-        .that(superRepo.getRepository().resolve("origin/master^"))
-        .isEqualTo(superPreviousId);
-  }
-
-  @Test
-  public void recursiveSubmodules() throws Exception {
-    TestRepository<?> topRepo = createProjectWithPush("top-project");
-    TestRepository<?> midRepo = createProjectWithPush("mid-project");
-    TestRepository<?> bottomRepo = createProjectWithPush("bottom-project");
-
-    allowMatchingSubmoduleSubscription(
-        "mid-project", "refs/heads/master", "top-project", "refs/heads/master");
-    allowMatchingSubmoduleSubscription(
-        "bottom-project", "refs/heads/master", "mid-project", "refs/heads/master");
-
-    createSubmoduleSubscription(topRepo, "master", "mid-project", "master");
-    createSubmoduleSubscription(midRepo, "master", "bottom-project", "master");
-
-    ObjectId bottomHead = pushChangeTo(bottomRepo, "refs/for/master", "some message", "same-topic");
-    ObjectId topHead = pushChangeTo(topRepo, "refs/for/master", "some message", "same-topic");
-
-    String id1 = getChangeId(bottomRepo, bottomHead).get();
-    String id2 = getChangeId(topRepo, topHead).get();
-
-    gApi.changes().id(id1).current().review(ReviewInput.approve());
-    gApi.changes().id(id2).current().review(ReviewInput.approve());
-
-    gApi.changes().id(id1).current().submit();
-
-    expectToHaveSubmoduleState(midRepo, "master", "bottom-project", bottomRepo, "master");
-    expectToHaveSubmoduleState(topRepo, "master", "mid-project", midRepo, "master");
-  }
-
-  @Test
-  public void triangleSubmodules() throws Exception {
-    TestRepository<?> topRepo = createProjectWithPush("top-project");
-    TestRepository<?> midRepo = createProjectWithPush("mid-project");
-    TestRepository<?> bottomRepo = createProjectWithPush("bottom-project");
-
-    allowMatchingSubmoduleSubscription(
-        "mid-project", "refs/heads/master", "top-project", "refs/heads/master");
-    allowMatchingSubmoduleSubscription(
-        "bottom-project", "refs/heads/master", "mid-project", "refs/heads/master");
-    allowMatchingSubmoduleSubscription(
-        "bottom-project", "refs/heads/master", "top-project", "refs/heads/master");
-
-    createSubmoduleSubscription(midRepo, "master", "bottom-project", "master");
-    Config config = new Config();
-    prepareSubmoduleConfigEntry(config, "bottom-project", "master");
-    prepareSubmoduleConfigEntry(config, "mid-project", "master");
-    pushSubmoduleConfig(topRepo, "master", config);
-
-    ObjectId bottomHead = pushChangeTo(bottomRepo, "refs/for/master", "some message", "same-topic");
-    ObjectId topHead = pushChangeTo(topRepo, "refs/for/master", "some message", "same-topic");
-
-    String id1 = getChangeId(bottomRepo, bottomHead).get();
-    String id2 = getChangeId(topRepo, topHead).get();
-
-    gApi.changes().id(id1).current().review(ReviewInput.approve());
-    gApi.changes().id(id2).current().review(ReviewInput.approve());
-
-    gApi.changes().id(id1).current().submit();
-
-    expectToHaveSubmoduleState(midRepo, "master", "bottom-project", bottomRepo, "master");
-    expectToHaveSubmoduleState(topRepo, "master", "mid-project", midRepo, "master");
-    expectToHaveSubmoduleState(topRepo, "master", "bottom-project", bottomRepo, "master");
-  }
-
-  private String prepareBranchCircularSubscription() throws Exception {
-    TestRepository<?> topRepo = createProjectWithPush("top-project");
-    TestRepository<?> midRepo = createProjectWithPush("mid-project");
-    TestRepository<?> bottomRepo = createProjectWithPush("bottom-project");
-
-    createSubmoduleSubscription(midRepo, "master", "bottom-project", "master");
-    createSubmoduleSubscription(topRepo, "master", "mid-project", "master");
-    createSubmoduleSubscription(bottomRepo, "master", "top-project", "master");
-
-    allowMatchingSubmoduleSubscription(
-        "bottom-project", "refs/heads/master", "mid-project", "refs/heads/master");
-    allowMatchingSubmoduleSubscription(
-        "mid-project", "refs/heads/master", "top-project", "refs/heads/master");
-    allowMatchingSubmoduleSubscription(
-        "top-project", "refs/heads/master", "bottom-project", "refs/heads/master");
-
-    ObjectId bottomMasterHead = pushChangeTo(bottomRepo, "refs/for/master", "some message", "");
-    String changeId = getChangeId(bottomRepo, bottomMasterHead).get();
-
-    approve(changeId);
-    exception.expectMessage("Branch level circular subscriptions detected");
-    exception.expectMessage("top-project,refs/heads/master");
-    exception.expectMessage("mid-project,refs/heads/master");
-    exception.expectMessage("bottom-project,refs/heads/master");
-    return changeId;
-  }
-
-  @Test
-  public void branchCircularSubscription() throws Exception {
-    String changeId = prepareBranchCircularSubscription();
-    gApi.changes().id(changeId).current().submit();
-  }
-
-  @Test
-  public void branchCircularSubscriptionPreview() throws Exception {
-    String changeId = prepareBranchCircularSubscription();
-    gApi.changes().id(changeId).current().submitPreview();
-  }
-
-  @Test
-  public void projectCircularSubscriptionWholeTopic() throws Exception {
-    TestRepository<?> superRepo = createProjectWithPush("super-project");
-    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
-
-    allowMatchingSubmoduleSubscription(
-        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
-    allowMatchingSubmoduleSubscription(
-        "super-project", "refs/heads/dev", "subscribed-to-project", "refs/heads/dev");
-
-    pushChangeTo(subRepo, "dev");
-    pushChangeTo(superRepo, "dev");
-
-    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
-    createSubmoduleSubscription(subRepo, "dev", "super-project", "dev");
-
-    ObjectId subMasterHead =
-        pushChangeTo(
-            subRepo, "refs/for/master", "b.txt", "content b", "some message", "same-topic");
-    ObjectId superDevHead = pushChangeTo(superRepo, "refs/for/dev", "some message", "same-topic");
-
-    approve(getChangeId(subRepo, subMasterHead).get());
-    approve(getChangeId(superRepo, superDevHead).get());
-
-    exception.expectMessage("Project level circular subscriptions detected");
-    exception.expectMessage("subscribed-to-project");
-    exception.expectMessage("super-project");
-    gApi.changes().id(getChangeId(subRepo, subMasterHead).get()).current().submit();
-  }
-
-  @Test
-  public void projectNoSubscriptionWholeTopic() throws Exception {
-    TestRepository<?> repoA = createProjectWithPush("project-a");
-    TestRepository<?> repoB = createProjectWithPush("project-b");
-    // bootstrap the dev branch
-    ObjectId a0 = pushChangeTo(repoA, "dev");
-
-    // bootstrap the dev branch
-    ObjectId b0 = pushChangeTo(repoB, "dev");
-
-    // create a change for master branch in repo a
-    ObjectId aHead =
-        pushChangeTo(
-            repoA,
-            "refs/for/master",
-            "master.txt",
-            "content master A",
-            "some message in a master.txt",
-            "same-topic");
-
-    // create a change for master branch in repo b
-    ObjectId bHead =
-        pushChangeTo(
-            repoB,
-            "refs/for/master",
-            "master.txt",
-            "content master B",
-            "some message in b master.txt",
-            "same-topic");
-
-    // create a change for dev branch in repo a
-    repoA.reset(a0);
-    ObjectId aDevHead =
-        pushChangeTo(
-            repoA,
-            "refs/for/dev",
-            "dev.txt",
-            "content dev A",
-            "some message in a dev.txt",
-            "same-topic");
-
-    // create a change for dev branch in repo b
-    repoB.reset(b0);
-    ObjectId bDevHead =
-        pushChangeTo(
-            repoB,
-            "refs/for/dev",
-            "dev.txt",
-            "content dev B",
-            "some message in b dev.txt",
-            "same-topic");
-
-    approve(getChangeId(repoA, aHead).get());
-    approve(getChangeId(repoB, bHead).get());
-    approve(getChangeId(repoA, aDevHead).get());
-    approve(getChangeId(repoB, bDevHead).get());
-
-    gApi.changes().id(getChangeId(repoA, aDevHead).get()).current().submit();
-    assertThat(getRemoteHead(name("project-a"), "refs/heads/master").getShortMessage())
-        .contains("some message in a master.txt");
-    assertThat(getRemoteHead(name("project-a"), "refs/heads/dev").getShortMessage())
-        .contains("some message in a dev.txt");
-    assertThat(getRemoteHead(name("project-b"), "refs/heads/master").getShortMessage())
-        .contains("some message in b master.txt");
-    assertThat(getRemoteHead(name("project-b"), "refs/heads/dev").getShortMessage())
-        .contains("some message in b dev.txt");
-  }
-
-  @Test
-  public void twoProjectsMultipleBranchesWholeTopic() throws Exception {
-    TestRepository<?> repoA = createProjectWithPush("project-a");
-    TestRepository<?> repoB = createProjectWithPush("project-b");
-    // bootstrap the dev branch
-    pushChangeTo(repoA, "dev");
-
-    // bootstrap the dev branch
-    ObjectId b0 = pushChangeTo(repoB, "dev");
-
-    allowMatchingSubmoduleSubscription(
-        "project-b", "refs/heads/master", "project-a", "refs/heads/master");
-    allowMatchingSubmoduleSubscription(
-        "project-b", "refs/heads/dev", "project-a", "refs/heads/dev");
-
-    createSubmoduleSubscription(repoA, "master", "project-b", "master");
-    createSubmoduleSubscription(repoA, "dev", "project-b", "dev");
-
-    // create a change for master branch in repo b
-    ObjectId bHead =
-        pushChangeTo(
-            repoB,
-            "refs/for/master",
-            "master.txt",
-            "content master B",
-            "some message in b master.txt",
-            "same-topic");
-
-    // create a change for dev branch in repo b
-    repoB.reset(b0);
-    ObjectId bDevHead =
-        pushChangeTo(
-            repoB,
-            "refs/for/dev",
-            "dev.txt",
-            "content dev B",
-            "some message in b dev.txt",
-            "same-topic");
-
-    approve(getChangeId(repoB, bHead).get());
-    approve(getChangeId(repoB, bDevHead).get());
-    gApi.changes().id(getChangeId(repoB, bHead).get()).current().submit();
-
-    expectToHaveSubmoduleState(repoA, "master", "project-b", repoB, "master");
-    expectToHaveSubmoduleState(repoA, "dev", "project-b", repoB, "dev");
-  }
-
-  @Test
-  public void retrySubmitAfterTornTopicOnLockFailure() throws Exception {
-    assume().that(notesMigration.disableChangeReviewDb()).isTrue();
-
-    TestRepository<?> superRepo = createProjectWithPush("super-project");
-    TestRepository<?> sub1 = createProjectWithPush("sub1");
-    TestRepository<?> sub2 = createProjectWithPush("sub2");
-
-    allowMatchingSubmoduleSubscription(
-        "sub1", "refs/heads/master", "super-project", "refs/heads/master");
-    allowMatchingSubmoduleSubscription(
-        "sub2", "refs/heads/master", "super-project", "refs/heads/master");
-
-    Config config = new Config();
-    prepareSubmoduleConfigEntry(config, "sub1", "master");
-    prepareSubmoduleConfigEntry(config, "sub2", "master");
-    pushSubmoduleConfig(superRepo, "master", config);
-
-    ObjectId superPreviousId = pushChangeTo(superRepo, "master");
-
-    String topic = "same-topic";
-    ObjectId sub1Id = pushChangeTo(sub1, "refs/for/master", "some message", topic);
-    ObjectId sub2Id = pushChangeTo(sub2, "refs/for/master", "some message", topic);
-
-    String changeId1 = getChangeId(sub1, sub1Id).get();
-    String changeId2 = getChangeId(sub2, sub2Id).get();
-    approve(changeId1);
-    approve(changeId2);
-
-    TestSubmitInput input = new TestSubmitInput();
-    input.generateLockFailures =
-        new ArrayDeque<>(
-            ImmutableList.of(
-                false, // Change 1, attempt 1: success
-                true, // Change 2, attempt 1: lock failure
-                false, // Change 1, attempt 2: success
-                false, // Change 2, attempt 2: success
-                false)); // Leftover value to check total number of calls.
-    gApi.changes().id(changeId1).current().submit(input);
-
-    assertThat(info(changeId1).status).isEqualTo(ChangeStatus.MERGED);
-    assertThat(info(changeId2).status).isEqualTo(ChangeStatus.MERGED);
-
-    sub1.git().fetch().call();
-    RevWalk rw1 = sub1.getRevWalk();
-    RevCommit master1 = rw1.parseCommit(getRemoteHead(name("sub1"), "master"));
-    RevCommit change1Ps = parseCurrentRevision(rw1, changeId1);
-    assertThat(rw1.isMergedInto(change1Ps, master1)).isTrue();
-
-    sub2.git().fetch().call();
-    RevWalk rw2 = sub2.getRevWalk();
-    RevCommit master2 = rw2.parseCommit(getRemoteHead(name("sub2"), "master"));
-    RevCommit change2Ps = parseCurrentRevision(rw2, changeId2);
-    assertThat(rw2.isMergedInto(change2Ps, master2)).isTrue();
-
-    assertThat(input.generateLockFailures).containsExactly(false);
-
-    expectToHaveSubmoduleState(superRepo, "master", "sub1", sub1, "master");
-    expectToHaveSubmoduleState(superRepo, "master", "sub2", sub2, "master");
-
-    assertWithMessage("submodule subscription update should have made one commit")
-        .that(superRepo.getRepository().resolve("origin/master^"))
-        .isEqualTo(superPreviousId);
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/AbstractReindexTests.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/AbstractReindexTests.java
deleted file mode 100644
index e5496c0..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/AbstractReindexTests.java
+++ /dev/null
@@ -1,179 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.acceptance.pgm;
-
-import static com.google.common.collect.ImmutableMap.toImmutableMap;
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth8.assertThat;
-import static com.google.gerrit.extensions.client.ListGroupsOption.MEMBERS;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.io.MoreFiles;
-import com.google.common.io.RecursiveDeleteOption;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.StandaloneSiteTest;
-import com.google.gerrit.acceptance.pgm.IndexUpgradeController.UpgradeAttempt;
-import com.google.gerrit.extensions.api.GerritApi;
-import com.google.gerrit.extensions.common.ChangeInput;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.index.GerritIndexStatus;
-import com.google.gerrit.server.index.change.ChangeIndexCollection;
-import com.google.gerrit.server.index.change.ChangeSchemaDefinitions;
-import com.google.gerrit.server.query.change.InternalChangeQuery;
-import com.google.inject.Injector;
-import com.google.inject.Provider;
-import java.nio.file.Files;
-import java.util.Set;
-import org.eclipse.jgit.storage.file.FileBasedConfig;
-import org.eclipse.jgit.util.FS;
-import org.junit.Test;
-
-@NoHttpd
-public abstract class AbstractReindexTests extends StandaloneSiteTest {
-  /** @param injector injector */
-  public abstract void configureIndex(Injector injector) throws Exception;
-
-  private static final String CHANGES = ChangeSchemaDefinitions.NAME;
-
-  private String changeId;
-
-  @Test
-  public void reindexFromScratch() throws Exception {
-    setUpChange();
-
-    MoreFiles.deleteRecursively(sitePaths.index_dir, RecursiveDeleteOption.ALLOW_INSECURE);
-    Files.createDirectory(sitePaths.index_dir);
-    assertServerStartupFails();
-
-    runGerrit("reindex", "-d", sitePaths.site_path.toString(), "--show-stack-trace");
-    assertReady(ChangeSchemaDefinitions.INSTANCE.getLatest().getVersion());
-
-    try (ServerContext ctx = startServer()) {
-      GerritApi gApi = ctx.getInjector().getInstance(GerritApi.class);
-      // Query change index
-      assertThat(gApi.changes().query("message:Test").get().stream().map(c -> c.changeId))
-          .containsExactly(changeId);
-      // Query account index
-      assertThat(gApi.accounts().query("admin").get().stream().map(a -> a._accountId))
-          .containsExactly(adminId.get());
-      // Query group index
-      assertThat(
-              gApi.groups().query("Group").withOption(MEMBERS).get().stream()
-                  .flatMap(g -> g.members.stream())
-                  .map(a -> a._accountId))
-          .containsExactly(adminId.get());
-    }
-  }
-
-  @Test
-  public void onlineUpgradeChanges() throws Exception {
-    int prevVersion = ChangeSchemaDefinitions.INSTANCE.getPrevious().getVersion();
-    int currVersion = ChangeSchemaDefinitions.INSTANCE.getLatest().getVersion();
-
-    // Before storing any changes, switch back to the previous version.
-    GerritIndexStatus status = new GerritIndexStatus(sitePaths);
-    status.setReady(CHANGES, currVersion, false);
-    status.setReady(CHANGES, prevVersion, true);
-    status.save();
-    assertReady(prevVersion);
-
-    setOnlineUpgradeConfig(false);
-    setUpChange();
-    setOnlineUpgradeConfig(true);
-
-    IndexUpgradeController u = new IndexUpgradeController(1);
-    try (ServerContext ctx = startServer(u.module())) {
-      assertSearchVersion(ctx, prevVersion);
-      assertWriteVersions(ctx, prevVersion, currVersion);
-
-      // Updating and searching old schema version works.
-      Provider<InternalChangeQuery> queryProvider =
-          ctx.getInjector().getProvider(InternalChangeQuery.class);
-      assertThat(queryProvider.get().byKey(new Change.Key(changeId))).hasSize(1);
-      assertThat(queryProvider.get().byTopicOpen("topic1")).isEmpty();
-
-      GerritApi gApi = ctx.getInjector().getInstance(GerritApi.class);
-      gApi.changes().id(changeId).topic("topic1");
-      assertThat(queryProvider.get().byTopicOpen("topic1")).hasSize(1);
-
-      u.runUpgrades();
-      assertThat(u.getStartedAttempts())
-          .containsExactly(UpgradeAttempt.create(CHANGES, prevVersion, currVersion));
-      assertThat(u.getSucceededAttempts())
-          .containsExactly(UpgradeAttempt.create(CHANGES, prevVersion, currVersion));
-      assertThat(u.getFailedAttempts()).isEmpty();
-
-      assertReady(currVersion);
-      assertSearchVersion(ctx, currVersion);
-      assertWriteVersions(ctx, currVersion);
-
-      // Updating and searching new schema version works.
-      assertThat(queryProvider.get().byTopicOpen("topic1")).hasSize(1);
-      assertThat(queryProvider.get().byTopicOpen("topic2")).isEmpty();
-      gApi.changes().id(changeId).topic("topic2");
-      assertThat(queryProvider.get().byTopicOpen("topic1")).isEmpty();
-      assertThat(queryProvider.get().byTopicOpen("topic2")).hasSize(1);
-    }
-  }
-
-  private void setUpChange() throws Exception {
-    Project.NameKey project = new Project.NameKey("project");
-    try (ServerContext ctx = startServer()) {
-      configureIndex(ctx.getInjector());
-      GerritApi gApi = ctx.getInjector().getInstance(GerritApi.class);
-      gApi.projects().create(project.get());
-
-      ChangeInput in = new ChangeInput(project.get(), "master", "Test change");
-      in.newBranch = true;
-      changeId = gApi.changes().create(in).info().changeId;
-    }
-  }
-
-  private void setOnlineUpgradeConfig(boolean enable) throws Exception {
-    FileBasedConfig cfg = new FileBasedConfig(sitePaths.gerrit_config.toFile(), FS.detect());
-    cfg.load();
-    cfg.setBoolean("index", null, "onlineUpgrade", enable);
-    cfg.save();
-  }
-
-  private void assertSearchVersion(ServerContext ctx, int expected) {
-    assertThat(
-            ctx.getInjector()
-                .getInstance(ChangeIndexCollection.class)
-                .getSearchIndex()
-                .getSchema()
-                .getVersion())
-        .named("search version")
-        .isEqualTo(expected);
-  }
-
-  private void assertWriteVersions(ServerContext ctx, Integer... expected) {
-    assertThat(
-            ctx.getInjector().getInstance(ChangeIndexCollection.class).getWriteIndexes().stream()
-                .map(i -> i.getSchema().getVersion()))
-        .named("write versions")
-        .containsExactlyElementsIn(ImmutableSet.copyOf(expected));
-  }
-
-  private void assertReady(int expectedReady) throws Exception {
-    Set<Integer> allVersions = ChangeSchemaDefinitions.INSTANCE.getSchemas().keySet();
-    GerritIndexStatus status = new GerritIndexStatus(sitePaths);
-    assertThat(
-            allVersions.stream().collect(toImmutableMap(v -> v, v -> status.getReady(CHANGES, v))))
-        .named("ready state for index versions")
-        .isEqualTo(allVersions.stream().collect(toImmutableMap(v -> v, v -> v == expectedReady)));
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/BUILD b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/BUILD
deleted file mode 100644
index ccd73d0..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/BUILD
+++ /dev/null
@@ -1,40 +0,0 @@
-load("//gerrit-acceptance-tests:tests.bzl", "acceptance_tests")
-
-acceptance_tests(
-    srcs = glob(
-        ["*IT.java"],
-        exclude = ["ElasticReindexIT.java"],
-    ),
-    group = "pgm",
-    labels = ["pgm"],
-    vm_args = ["-Xmx512m"],
-    deps = [":util"],
-)
-
-acceptance_tests(
-    srcs = [
-        "ElasticReindexIT.java",
-    ],
-    group = "elastic",
-    labels = [
-        "docker",
-        "elastic",
-        "exclusive",
-        "pgm",
-    ],
-    deps = [
-        ":util",
-        "//gerrit-elasticsearch:elasticsearch",
-        "//gerrit-elasticsearch:elasticsearch_test_utils",
-    ],
-)
-
-java_library(
-    name = "util",
-    testonly = 1,
-    srcs = [
-        "AbstractReindexTests.java",
-        "IndexUpgradeController.java",
-    ],
-    deps = ["//gerrit-acceptance-tests:lib"],
-)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/ElasticReindexIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/ElasticReindexIT.java
deleted file mode 100644
index a8eab03..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/ElasticReindexIT.java
+++ /dev/null
@@ -1,53 +0,0 @@
-// 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.
-
-package com.google.gerrit.acceptance.pgm;
-
-import static com.google.gerrit.elasticsearch.ElasticTestUtils.createAllIndexes;
-import static com.google.gerrit.elasticsearch.ElasticTestUtils.getConfig;
-
-import com.google.gerrit.elasticsearch.ElasticVersion;
-import com.google.gerrit.testutil.ConfigSuite;
-import com.google.inject.Injector;
-import org.eclipse.jgit.lib.Config;
-import org.junit.Before;
-
-public class ElasticReindexIT extends AbstractReindexTests {
-
-  @ConfigSuite.Default
-  public static Config elasticsearchV5() {
-    return getConfig(ElasticVersion.V5_6);
-  }
-
-  @ConfigSuite.Config
-  public static Config elasticsearchV6() {
-    return getConfig(ElasticVersion.V6_6);
-  }
-
-  @ConfigSuite.Config
-  public static Config elasticsearchV7() {
-    return getConfig(ElasticVersion.V7_0);
-  }
-
-  @Override
-  public void configureIndex(Injector injector) throws Exception {
-    createAllIndexes(injector);
-  }
-
-  @Before
-  public void reindexFirstSinceElastic() throws Exception {
-    assertServerStartupFails();
-    runGerrit("reindex", "-d", sitePaths.site_path.toString(), "--show-stack-trace");
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/StandaloneNoteDbMigrationIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/StandaloneNoteDbMigrationIT.java
deleted file mode 100644
index 342268b..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/StandaloneNoteDbMigrationIT.java
+++ /dev/null
@@ -1,352 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.acceptance.pgm;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth8.assertThat;
-import static com.google.common.truth.TruthJUnit.assume;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.StandaloneSiteTest;
-import com.google.gerrit.extensions.api.GerritApi;
-import com.google.gerrit.extensions.common.ChangeInput;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.LocalDiskRepositoryManager;
-import com.google.gerrit.server.index.GerritIndexStatus;
-import com.google.gerrit.server.index.change.ChangeIndexCollection;
-import com.google.gerrit.server.index.change.ChangeSchemaDefinitions;
-import com.google.gerrit.server.notedb.NoteDbChangeState;
-import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
-import com.google.gerrit.server.notedb.NoteDbChangeState.RefState;
-import com.google.gerrit.server.notedb.NotesMigrationState;
-import com.google.gerrit.server.schema.ReviewDbFactory;
-import com.google.gerrit.testutil.NoteDbMode;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Key;
-import com.google.inject.TypeLiteral;
-import java.io.File;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.stream.Stream;
-import org.eclipse.jgit.internal.storage.file.FileRepository;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.lib.StoredConfig;
-import org.eclipse.jgit.storage.file.FileBasedConfig;
-import org.eclipse.jgit.util.FS;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests for NoteDb migrations where the entry point is through a program, {@code
- * migrate-to-note-db} or {@code daemon}.
- *
- * <p><strong>Note:</strong> These tests are very slow due to the repeated daemon startup. Prefer
- * adding tests to {@link com.google.gerrit.acceptance.server.notedb.OnlineNoteDbMigrationIT} if
- * possible.
- */
-@NoHttpd
-public class StandaloneNoteDbMigrationIT extends StandaloneSiteTest {
-  private StoredConfig gerritConfig;
-  private StoredConfig noteDbConfig;
-
-  private Project.NameKey project;
-  private Change.Id changeId;
-
-  @Before
-  public void setUp() throws Exception {
-    assume().that(NoteDbMode.get()).isEqualTo(NoteDbMode.OFF);
-    gerritConfig = new FileBasedConfig(sitePaths.gerrit_config.toFile(), FS.detect());
-    // Unlike in the running server, for tests, we don't stack notedb.config on gerrit.config.
-    noteDbConfig = new FileBasedConfig(sitePaths.notedb_config.toFile(), FS.detect());
-  }
-
-  @Test
-  public void rebuildOneChangeTrialMode() throws Exception {
-    assertNoAutoMigrateConfig(gerritConfig);
-    assertNoAutoMigrateConfig(noteDbConfig);
-    assertNotesMigrationState(NotesMigrationState.REVIEW_DB);
-    setUpOneChange();
-
-    migrate("--trial");
-    assertNotesMigrationState(NotesMigrationState.READ_WRITE_NO_SEQUENCE);
-
-    try (ServerContext ctx = startServer()) {
-      GitRepositoryManager repoManager = ctx.getInjector().getInstance(GitRepositoryManager.class);
-      ObjectId metaId;
-      try (Repository repo = repoManager.openRepository(project)) {
-        Ref ref = repo.exactRef(RefNames.changeMetaRef(changeId));
-        assertThat(ref).isNotNull();
-        metaId = ref.getObjectId();
-      }
-
-      try (ReviewDb db = openUnderlyingReviewDb(ctx)) {
-        Change c = db.changes().get(changeId);
-        assertThat(c).isNotNull();
-        NoteDbChangeState state = NoteDbChangeState.parse(c);
-        assertThat(state).isNotNull();
-        assertThat(state.getPrimaryStorage()).isEqualTo(PrimaryStorage.REVIEW_DB);
-        assertThat(state.getRefState()).hasValue(RefState.create(metaId, ImmutableMap.of()));
-      }
-    }
-  }
-
-  @Test
-  public void migrateOneChange() throws Exception {
-    assertNoAutoMigrateConfig(gerritConfig);
-    assertNoAutoMigrateConfig(noteDbConfig);
-    assertNotesMigrationState(NotesMigrationState.REVIEW_DB);
-    setUpOneChange();
-
-    migrate();
-    assertNotesMigrationState(NotesMigrationState.NOTE_DB);
-
-    File allUsersDir;
-    try (ServerContext ctx = startServer()) {
-      GitRepositoryManager repoManager = ctx.getInjector().getInstance(GitRepositoryManager.class);
-      try (Repository repo = repoManager.openRepository(project)) {
-        assertThat(repo.exactRef(RefNames.changeMetaRef(changeId))).isNotNull();
-      }
-      assertThat(repoManager).isInstanceOf(LocalDiskRepositoryManager.class);
-      try (Repository repo =
-          repoManager.openRepository(ctx.getInjector().getInstance(AllUsersName.class))) {
-        allUsersDir = repo.getDirectory();
-      }
-
-      try (ReviewDb db = openUnderlyingReviewDb(ctx)) {
-        Change c = db.changes().get(changeId);
-        assertThat(c).isNotNull();
-        NoteDbChangeState state = NoteDbChangeState.parse(c);
-        assertThat(state).isNotNull();
-        assertThat(state.getPrimaryStorage()).isEqualTo(PrimaryStorage.NOTE_DB);
-        assertThat(state.getRefState()).isEmpty();
-
-        ChangeInput in = new ChangeInput(project.get(), "master", "NoteDb-only change");
-        in.newBranch = true;
-        GerritApi gApi = ctx.getInjector().getInstance(GerritApi.class);
-        Change.Id id2 = new Change.Id(gApi.changes().create(in).info()._number);
-        assertThat(db.changes().get(id2)).isNull();
-      }
-    }
-    assertNoAutoMigrateConfig(gerritConfig);
-    assertAutoMigrateConfig(noteDbConfig, false);
-
-    try (FileRepository repo = new FileRepository(allUsersDir)) {
-      try (Stream<Path> paths = Files.walk(repo.getObjectsDirectory().toPath())) {
-        assertThat(paths.filter(p -> !p.toString().contains("pack") && Files.isRegularFile(p)))
-            .named("loose object files in All-Users")
-            .isEmpty();
-      }
-      assertThat(repo.getObjectDatabase().getPacks()).named("packfiles in All-Users").hasSize(1);
-    }
-  }
-
-  @Test
-  public void migrationWithReindex() throws Exception {
-    assertNotesMigrationState(NotesMigrationState.REVIEW_DB);
-    setUpOneChange();
-
-    int version = ChangeSchemaDefinitions.INSTANCE.getLatest().getVersion();
-    GerritIndexStatus status = new GerritIndexStatus(sitePaths);
-    assertThat(status.getReady(ChangeSchemaDefinitions.NAME, version)).isTrue();
-    status.setReady(ChangeSchemaDefinitions.NAME, version, false);
-    status.save();
-    assertServerStartupFails();
-
-    migrate();
-    assertNotesMigrationState(NotesMigrationState.NOTE_DB);
-
-    status = new GerritIndexStatus(sitePaths);
-    assertThat(status.getReady(ChangeSchemaDefinitions.NAME, version)).isTrue();
-  }
-
-  @Test
-  public void onlineMigrationViaDaemon() throws Exception {
-    assertNoAutoMigrateConfig(gerritConfig);
-    assertNoAutoMigrateConfig(noteDbConfig);
-
-    testOnlineMigration(u -> startServer(u.module(), "--migrate-to-note-db", "true"));
-
-    assertNoAutoMigrateConfig(gerritConfig);
-    assertAutoMigrateConfig(noteDbConfig, false);
-  }
-
-  @Test
-  public void onlineMigrationViaConfig() throws Exception {
-    assertNoAutoMigrateConfig(gerritConfig);
-    assertNoAutoMigrateConfig(noteDbConfig);
-
-    testOnlineMigration(
-        u -> {
-          gerritConfig.setBoolean("noteDb", "changes", "autoMigrate", true);
-          gerritConfig.save();
-          return startServer(u.module());
-        });
-
-    // Auto-migration is turned off in notedb.config, which takes precedence, but is still on in
-    // gerrit.config. This means Puppet can continue overwriting gerrit.config without turning
-    // auto-migration back on.
-    assertAutoMigrateConfig(gerritConfig, true);
-    assertAutoMigrateConfig(noteDbConfig, false);
-  }
-
-  @Test
-  public void onlineMigrationTrialModeViaFlag() throws Exception {
-    assertNoAutoMigrateConfig(gerritConfig);
-    assertNoTrialConfig(gerritConfig);
-
-    assertNoAutoMigrateConfig(noteDbConfig);
-    assertNoTrialConfig(noteDbConfig);
-
-    testOnlineMigration(
-        u -> startServer(u.module(), "--migrate-to-note-db", "--trial"),
-        NotesMigrationState.READ_WRITE_NO_SEQUENCE);
-
-    assertNoAutoMigrateConfig(gerritConfig);
-    assertNoTrialConfig(gerritConfig);
-
-    assertAutoMigrateConfig(noteDbConfig, true);
-    assertTrialConfig(noteDbConfig, true);
-  }
-
-  @Test
-  public void onlineMigrationTrialModeViaConfig() throws Exception {
-    assertNoAutoMigrateConfig(gerritConfig);
-    assertNoTrialConfig(gerritConfig);
-
-    assertNoAutoMigrateConfig(noteDbConfig);
-    assertNoTrialConfig(noteDbConfig);
-
-    testOnlineMigration(
-        u -> {
-          gerritConfig.setBoolean("noteDb", "changes", "autoMigrate", true);
-          gerritConfig.setBoolean("noteDb", "changes", "trial", true);
-          gerritConfig.save();
-          return startServer(u.module());
-        },
-        NotesMigrationState.READ_WRITE_NO_SEQUENCE);
-
-    assertAutoMigrateConfig(gerritConfig, true);
-    assertTrialConfig(gerritConfig, true);
-
-    assertAutoMigrateConfig(noteDbConfig, true);
-    assertTrialConfig(noteDbConfig, true);
-  }
-
-  @FunctionalInterface
-  private interface StartServerWithMigration {
-    ServerContext start(IndexUpgradeController u) throws Exception;
-  }
-
-  private void testOnlineMigration(StartServerWithMigration start) throws Exception {
-    testOnlineMigration(start, NotesMigrationState.NOTE_DB);
-  }
-
-  private void testOnlineMigration(
-      StartServerWithMigration start, NotesMigrationState expectedEndState) throws Exception {
-    assertNotesMigrationState(NotesMigrationState.REVIEW_DB);
-    int prevVersion = ChangeSchemaDefinitions.INSTANCE.getPrevious().getVersion();
-    int currVersion = ChangeSchemaDefinitions.INSTANCE.getLatest().getVersion();
-
-    // Before storing any changes, switch back to the previous version.
-    GerritIndexStatus status = new GerritIndexStatus(sitePaths);
-    status.setReady(ChangeSchemaDefinitions.NAME, currVersion, false);
-    status.setReady(ChangeSchemaDefinitions.NAME, prevVersion, true);
-    status.save();
-
-    setOnlineUpgradeConfig(false);
-    setUpOneChange();
-    setOnlineUpgradeConfig(true);
-
-    IndexUpgradeController u = new IndexUpgradeController(1);
-    try (ServerContext ctx = start.start(u)) {
-      ChangeIndexCollection indexes = ctx.getInjector().getInstance(ChangeIndexCollection.class);
-      assertThat(indexes.getSearchIndex().getSchema().getVersion()).isEqualTo(prevVersion);
-
-      // Index schema upgrades happen after NoteDb migration, so waiting for those to complete
-      // should be sufficient.
-      u.runUpgrades();
-
-      assertThat(indexes.getSearchIndex().getSchema().getVersion()).isEqualTo(currVersion);
-      assertNotesMigrationState(expectedEndState);
-    }
-  }
-
-  private void setUpOneChange() throws Exception {
-    project = new Project.NameKey("project");
-    try (ServerContext ctx = startServer()) {
-      GerritApi gApi = ctx.getInjector().getInstance(GerritApi.class);
-      gApi.projects().create("project");
-
-      ChangeInput in = new ChangeInput(project.get(), "master", "Test change");
-      in.newBranch = true;
-      changeId = new Change.Id(gApi.changes().create(in).info()._number);
-    }
-  }
-
-  private void migrate(String... additionalArgs) throws Exception {
-    runGerrit(
-        ImmutableList.of(
-            "migrate-to-note-db", "-d", sitePaths.site_path.toString(), "--show-stack-trace"),
-        ImmutableList.copyOf(additionalArgs));
-  }
-
-  private void assertNotesMigrationState(NotesMigrationState expected) throws Exception {
-    noteDbConfig.load();
-    assertThat(NotesMigrationState.forConfig(noteDbConfig)).hasValue(expected);
-  }
-
-  private ReviewDb openUnderlyingReviewDb(ServerContext ctx) throws Exception {
-    return ctx.getInjector()
-        .getInstance(Key.get(new TypeLiteral<SchemaFactory<ReviewDb>>() {}, ReviewDbFactory.class))
-        .open();
-  }
-
-  private static void assertNoAutoMigrateConfig(StoredConfig cfg) throws Exception {
-    cfg.load();
-    assertThat(cfg.getString("noteDb", "changes", "autoMigrate")).isNull();
-  }
-
-  private static void assertAutoMigrateConfig(StoredConfig cfg, boolean expected) throws Exception {
-    cfg.load();
-    assertThat(cfg.getString("noteDb", "changes", "autoMigrate")).isNotNull();
-    assertThat(cfg.getBoolean("noteDb", "changes", "autoMigrate", false)).isEqualTo(expected);
-  }
-
-  private static void assertNoTrialConfig(StoredConfig cfg) throws Exception {
-    cfg.load();
-    assertThat(cfg.getString("noteDb", "changes", "trial")).isNull();
-  }
-
-  private static void assertTrialConfig(StoredConfig cfg, boolean expected) throws Exception {
-    cfg.load();
-    assertThat(cfg.getString("noteDb", "changes", "trial")).isNotNull();
-    assertThat(cfg.getBoolean("noteDb", "changes", "trial", false)).isEqualTo(expected);
-  }
-
-  private void setOnlineUpgradeConfig(boolean enable) throws Exception {
-    gerritConfig.load();
-    gerritConfig.setBoolean("index", null, "onlineUpgrade", enable);
-    gerritConfig.save();
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/BUILD b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/BUILD
deleted file mode 100644
index ea59d61..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/BUILD
+++ /dev/null
@@ -1,24 +0,0 @@
-load("//gerrit-acceptance-tests:tests.bzl", "acceptance_tests")
-
-acceptance_tests(
-    srcs = glob(["*IT.java"]),
-    group = "rest_account",
-    labels = ["rest"],
-    deps = [":util"],
-)
-
-java_library(
-    name = "util",
-    testonly = 1,
-    srcs = [
-        "AccountAssert.java",
-        "CapabilityInfo.java",
-    ],
-    visibility = ["//visibility:public"],
-    deps = [
-        "//gerrit-acceptance-tests:lib",
-        "//gerrit-reviewdb:server",
-        "//lib:gwtorm",
-        "//lib:junit",
-    ],
-)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/CapabilityInfo.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/CapabilityInfo.java
deleted file mode 100644
index fac594a..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/CapabilityInfo.java
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.acceptance.rest.account;
-
-class CapabilityInfo {
-  public boolean accessDatabase;
-  public boolean administrateServer;
-  public BatchChangesLimit batchChangesLimit;
-  public boolean createAccount;
-  public boolean createGroup;
-  public boolean createProject;
-  public boolean emailReviewers;
-  public boolean flushCaches;
-  public boolean killTask;
-  public boolean maintainServer;
-  public boolean modifyAccount;
-  public boolean priority;
-  public QueryLimit queryLimit;
-  public boolean runAs;
-  public boolean runGC;
-  public boolean streamEvents;
-  public boolean viewAllAccounts;
-  public boolean viewCaches;
-  public boolean viewConnections;
-  public boolean viewPlugins;
-  public boolean viewQueue;
-
-  static class QueryLimit {
-    short min;
-    short max;
-  }
-
-  static class BatchChangesLimit {
-    short min;
-    short max;
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/EmailIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/EmailIT.java
deleted file mode 100644
index a1dc8a2..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/EmailIT.java
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.acceptance.rest.account;
-
-import static com.google.common.truth.Truth.assertThat;
-import static java.util.stream.Collectors.toSet;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.RestResponse;
-import com.google.gerrit.extensions.api.accounts.EmailInput;
-import com.google.gerrit.extensions.common.EmailInfo;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gson.reflect.TypeToken;
-import java.util.List;
-import java.util.Set;
-import org.junit.Test;
-
-public class EmailIT extends AbstractDaemonTest {
-
-  @Test
-  public void addEmail() throws Exception {
-    String email = "foo.bar@example.com";
-    assertThat(getEmails()).doesNotContain(email);
-
-    createEmail(email);
-    assertThat(getEmails()).contains(email);
-  }
-
-  @Test
-  public void addUrlEncodedEmail() throws Exception {
-    String email = "foo.bar2@example.com";
-    assertThat(getEmails()).doesNotContain(email);
-
-    createEmail(email.replace("@", "%40"));
-    assertThat(getEmails()).contains(email);
-  }
-
-  @Test
-  public void addEmailWithLeadingAndTrailingWhitespace() throws Exception {
-    String email = "foo.bar3@example.com";
-    assertThat(getEmails()).doesNotContain(email);
-
-    createEmail(IdString.fromDecoded(" " + email + " ").encoded());
-    assertThat(getEmails()).contains(email);
-  }
-
-  @Test
-  public void deleteEmail() throws Exception {
-    String email = "foo.baz@example.com";
-    assertThat(getEmails()).doesNotContain(email);
-
-    createEmail(email);
-    assertThat(getEmails()).contains(email);
-
-    RestResponse r = adminRestSession.delete("/accounts/self/emails/" + email);
-    r.assertNoContent();
-    assertThat(getEmails()).doesNotContain(email);
-  }
-
-  @Test
-  public void deleteUrlEncodedEmail() throws Exception {
-    String email = "foo.baz2@example.com";
-    assertThat(getEmails()).doesNotContain(email);
-
-    createEmail(email);
-    assertThat(getEmails()).contains(email);
-
-    RestResponse r = adminRestSession.delete("/accounts/self/emails/" + email.replace("@", "%40"));
-    r.assertNoContent();
-    assertThat(getEmails()).doesNotContain(email);
-  }
-
-  private Set<String> getEmails() throws Exception {
-    RestResponse r = adminRestSession.get("/accounts/self/emails");
-    r.assertOK();
-    List<EmailInfo> emails =
-        newGson().fromJson(r.getReader(), new TypeToken<List<EmailInfo>>() {}.getType());
-    return emails.stream().map(e -> e.email).collect(toSet());
-  }
-
-  private void createEmail(String email) throws Exception {
-    EmailInput input = new EmailInput();
-    input.noConfirmation = true;
-    RestResponse r = adminRestSession.put("/accounts/self/emails/" + email, input);
-    r.assertCreated();
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/ExternalIdIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/ExternalIdIT.java
deleted file mode 100644
index 33313d1..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/ExternalIdIT.java
+++ /dev/null
@@ -1,973 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.acceptance.rest.account;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.GitUtil.fetch;
-import static com.google.gerrit.acceptance.GitUtil.pushHead;
-import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_MAILTO;
-import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_USERNAME;
-import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_UUID;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.stream.Collectors.toList;
-import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
-import static org.junit.Assert.fail;
-
-import com.github.rholder.retry.BlockStrategy;
-import com.github.rholder.retry.Retryer;
-import com.github.rholder.retry.RetryerBuilder;
-import com.github.rholder.retry.StopStrategies;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.RestResponse;
-import com.google.gerrit.acceptance.Sandboxed;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo;
-import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo.ConsistencyProblemInfo;
-import com.google.gerrit.extensions.api.config.ConsistencyCheckInput;
-import com.google.gerrit.extensions.api.config.ConsistencyCheckInput.CheckAccountExternalIdsInput;
-import com.google.gerrit.extensions.common.AccountExternalIdInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.metrics.MetricMaker;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.account.externalids.DisabledExternalIdCache;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.account.externalids.ExternalIdReader;
-import com.google.gerrit.server.account.externalids.ExternalIds;
-import com.google.gerrit.server.account.externalids.ExternalIdsUpdate;
-import com.google.gerrit.server.account.externalids.ExternalIdsUpdate.RefsMetaExternalIdsUpdate;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.LockFailureException;
-import com.google.gson.reflect.TypeToken;
-import com.google.gwtorm.server.OrmDuplicateKeyException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-import org.eclipse.jgit.api.errors.TransportException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.notes.NoteMap;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.PushResult;
-import org.eclipse.jgit.transport.RemoteRefUpdate;
-import org.eclipse.jgit.transport.RemoteRefUpdate.Status;
-import org.eclipse.jgit.util.MutableInteger;
-import org.junit.Test;
-
-@Sandboxed
-public class ExternalIdIT extends AbstractDaemonTest {
-  @Inject private AllUsersName allUsers;
-  @Inject private ExternalIdsUpdate.Server extIdsUpdate;
-  @Inject private ExternalIds externalIds;
-  @Inject private ExternalIdReader externalIdReader;
-  @Inject private MetricMaker metricMaker;
-
-  @Test
-  public void getExternalIds() throws Exception {
-    Collection<ExternalId> expectedIds = accountCache.get(user.getId()).getExternalIds();
-    List<AccountExternalIdInfo> expectedIdInfos = toExternalIdInfos(expectedIds);
-
-    RestResponse response = userRestSession.get("/accounts/self/external.ids");
-    response.assertOK();
-
-    List<AccountExternalIdInfo> results =
-        newGson()
-            .fromJson(
-                response.getReader(), new TypeToken<List<AccountExternalIdInfo>>() {}.getType());
-
-    Collections.sort(expectedIdInfos);
-    Collections.sort(results);
-    assertThat(results).containsExactlyElementsIn(expectedIdInfos);
-  }
-
-  @Test
-  public void getExternalIdsOfOtherUserNotAllowed() throws Exception {
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    exception.expectMessage("access database not permitted");
-    gApi.accounts().id(admin.id.get()).getExternalIds();
-  }
-
-  @Test
-  public void getExternalIdsOfOtherUserWithAccessDatabase() throws Exception {
-    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
-
-    Collection<ExternalId> expectedIds = accountCache.get(admin.getId()).getExternalIds();
-    List<AccountExternalIdInfo> expectedIdInfos = toExternalIdInfos(expectedIds);
-
-    RestResponse response = userRestSession.get("/accounts/" + admin.id + "/external.ids");
-    response.assertOK();
-
-    List<AccountExternalIdInfo> results =
-        newGson()
-            .fromJson(
-                response.getReader(), new TypeToken<List<AccountExternalIdInfo>>() {}.getType());
-
-    Collections.sort(expectedIdInfos);
-    Collections.sort(results);
-    assertThat(results).containsExactlyElementsIn(expectedIdInfos);
-  }
-
-  @Test
-  public void deleteExternalIds() throws Exception {
-    setApiUser(user);
-    List<AccountExternalIdInfo> externalIds = gApi.accounts().self().getExternalIds();
-
-    List<String> toDelete = new ArrayList<>();
-    List<AccountExternalIdInfo> expectedIds = new ArrayList<>();
-    for (AccountExternalIdInfo id : externalIds) {
-      if (id.canDelete != null && id.canDelete) {
-        toDelete.add(id.identity);
-        continue;
-      }
-      expectedIds.add(id);
-    }
-
-    assertThat(toDelete).hasSize(1);
-
-    RestResponse response = userRestSession.post("/accounts/self/external.ids:delete", toDelete);
-    response.assertNoContent();
-    List<AccountExternalIdInfo> results = gApi.accounts().self().getExternalIds();
-    // The external ID in WebSession will not be set for tests, resulting that
-    // "mailto:user@example.com" can be deleted while "username:user" can't.
-    assertThat(results).hasSize(1);
-    assertThat(results).containsExactlyElementsIn(expectedIds);
-  }
-
-  @Test
-  public void deleteExternalIdsOfOtherUserNotAllowed() throws Exception {
-    List<AccountExternalIdInfo> extIds = gApi.accounts().self().getExternalIds();
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    exception.expectMessage("access database not permitted");
-    gApi.accounts()
-        .id(admin.id.get())
-        .deleteExternalIds(extIds.stream().map(e -> e.identity).collect(toList()));
-  }
-
-  @Test
-  public void deleteExternalIdOfOtherUserUnderOwnAccount_UnprocessableEntity() throws Exception {
-    List<AccountExternalIdInfo> extIds = gApi.accounts().self().getExternalIds();
-    setApiUser(user);
-    exception.expect(UnprocessableEntityException.class);
-    exception.expectMessage(String.format("External id %s does not exist", extIds.get(0).identity));
-    gApi.accounts()
-        .self()
-        .deleteExternalIds(extIds.stream().map(e -> e.identity).collect(toList()));
-  }
-
-  @Test
-  public void deleteExternalIdsOfOtherUserWithAccessDatabase() throws Exception {
-    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
-
-    List<AccountExternalIdInfo> externalIds = gApi.accounts().self().getExternalIds();
-
-    List<String> toDelete = new ArrayList<>();
-    List<AccountExternalIdInfo> expectedIds = new ArrayList<>();
-    for (AccountExternalIdInfo id : externalIds) {
-      if (id.canDelete != null && id.canDelete) {
-        toDelete.add(id.identity);
-        continue;
-      }
-      expectedIds.add(id);
-    }
-
-    assertThat(toDelete).hasSize(1);
-
-    setApiUser(user);
-    RestResponse response =
-        userRestSession.post("/accounts/" + admin.id + "/external.ids:delete", toDelete);
-    response.assertNoContent();
-    List<AccountExternalIdInfo> results = gApi.accounts().id(admin.id.get()).getExternalIds();
-    // The external ID in WebSession will not be set for tests, resulting that
-    // "mailto:user@example.com" can be deleted while "username:user" can't.
-    assertThat(results).hasSize(1);
-    assertThat(results).containsExactlyElementsIn(expectedIds);
-  }
-
-  @Test
-  public void deleteExternalIdOfPreferredEmail() throws Exception {
-    String preferredEmail = gApi.accounts().self().get().email;
-    assertThat(preferredEmail).isNotNull();
-
-    gApi.accounts()
-        .self()
-        .deleteExternalIds(
-            ImmutableList.of(ExternalId.Key.create(SCHEME_MAILTO, preferredEmail).get()));
-    assertThat(gApi.accounts().self().get().email).isNull();
-  }
-
-  @Test
-  public void deleteExternalIds_Conflict() throws Exception {
-    List<String> toDelete = new ArrayList<>();
-    String externalIdStr = "username:" + user.username;
-    toDelete.add(externalIdStr);
-    RestResponse response = userRestSession.post("/accounts/self/external.ids:delete", toDelete);
-    response.assertConflict();
-    assertThat(response.getEntityContent())
-        .isEqualTo(String.format("External id %s cannot be deleted", externalIdStr));
-  }
-
-  @Test
-  public void deleteExternalIds_UnprocessableEntity() throws Exception {
-    List<String> toDelete = new ArrayList<>();
-    String externalIdStr = "mailto:user@domain.com";
-    toDelete.add(externalIdStr);
-    RestResponse response = userRestSession.post("/accounts/self/external.ids:delete", toDelete);
-    response.assertUnprocessableEntity();
-    assertThat(response.getEntityContent())
-        .isEqualTo(String.format("External id %s does not exist", externalIdStr));
-  }
-
-  @Test
-  public void fetchExternalIdsBranch() throws Exception {
-    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers, user);
-
-    // refs/meta/external-ids is only visible to users with the 'Access Database' capability
-    try {
-      fetch(allUsersRepo, RefNames.REFS_EXTERNAL_IDS);
-      fail("expected TransportException");
-    } catch (TransportException e) {
-      assertThat(e.getMessage())
-          .isEqualTo(
-              "Remote does not have " + RefNames.REFS_EXTERNAL_IDS + " available for fetch.");
-    }
-
-    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
-
-    // re-clone to get new request context, otherwise the old global capabilities are still cached
-    // in the IdentifiedUser object
-    allUsersRepo = cloneProject(allUsers, user);
-    fetch(allUsersRepo, RefNames.REFS_EXTERNAL_IDS);
-  }
-
-  @Test
-  public void pushToExternalIdsBranch() throws Exception {
-    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
-
-    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
-    fetch(allUsersRepo, RefNames.REFS_EXTERNAL_IDS + ":" + RefNames.REFS_EXTERNAL_IDS);
-    allUsersRepo.reset(RefNames.REFS_EXTERNAL_IDS);
-
-    // different case email is allowed
-    ExternalId newExtId = createExternalIdWithOtherCaseEmail("foo:bar");
-    addExtId(allUsersRepo, newExtId);
-    allUsersRepo.reset(RefNames.REFS_EXTERNAL_IDS);
-
-    List<AccountExternalIdInfo> extIdsBefore = gApi.accounts().self().getExternalIds();
-
-    allowPushOfExternalIds();
-    PushResult r = pushHead(allUsersRepo, RefNames.REFS_EXTERNAL_IDS);
-    assertThat(r.getRemoteUpdate(RefNames.REFS_EXTERNAL_IDS).getStatus()).isEqualTo(Status.OK);
-
-    List<AccountExternalIdInfo> extIdsAfter = gApi.accounts().self().getExternalIds();
-    assertThat(extIdsAfter)
-        .containsExactlyElementsIn(
-            Iterables.concat(extIdsBefore, ImmutableSet.of(toExternalIdInfo(newExtId))));
-  }
-
-  @Test
-  public void pushToExternalIdsBranchRejectsExternalIdWithoutAccountId() throws Exception {
-    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
-
-    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
-    fetch(allUsersRepo, RefNames.REFS_EXTERNAL_IDS + ":" + RefNames.REFS_EXTERNAL_IDS);
-    allUsersRepo.reset(RefNames.REFS_EXTERNAL_IDS);
-
-    insertExternalIdWithoutAccountId(
-        allUsersRepo.getRepository(), allUsersRepo.getRevWalk(), "foo:bar");
-    allUsersRepo.reset(RefNames.REFS_EXTERNAL_IDS);
-
-    allowPushOfExternalIds();
-    PushResult r = pushHead(allUsersRepo, RefNames.REFS_EXTERNAL_IDS);
-    assertRefUpdateFailure(r.getRemoteUpdate(RefNames.REFS_EXTERNAL_IDS), "invalid external IDs");
-  }
-
-  @Test
-  public void pushToExternalIdsBranchRejectsExternalIdWithKeyThatDoesntMatchTheNoteId()
-      throws Exception {
-    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
-
-    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
-    fetch(allUsersRepo, RefNames.REFS_EXTERNAL_IDS + ":" + RefNames.REFS_EXTERNAL_IDS);
-    allUsersRepo.reset(RefNames.REFS_EXTERNAL_IDS);
-
-    insertExternalIdWithKeyThatDoesntMatchNoteId(
-        allUsersRepo.getRepository(), allUsersRepo.getRevWalk(), "foo:bar");
-    allUsersRepo.reset(RefNames.REFS_EXTERNAL_IDS);
-
-    allowPushOfExternalIds();
-    PushResult r = pushHead(allUsersRepo, RefNames.REFS_EXTERNAL_IDS);
-    assertRefUpdateFailure(r.getRemoteUpdate(RefNames.REFS_EXTERNAL_IDS), "invalid external IDs");
-  }
-
-  @Test
-  public void pushToExternalIdsBranchRejectsExternalIdWithInvalidConfig() throws Exception {
-    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
-
-    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
-    fetch(allUsersRepo, RefNames.REFS_EXTERNAL_IDS + ":" + RefNames.REFS_EXTERNAL_IDS);
-    allUsersRepo.reset(RefNames.REFS_EXTERNAL_IDS);
-
-    insertExternalIdWithInvalidConfig(
-        allUsersRepo.getRepository(), allUsersRepo.getRevWalk(), "foo:bar");
-    allUsersRepo.reset(RefNames.REFS_EXTERNAL_IDS);
-
-    allowPushOfExternalIds();
-    PushResult r = pushHead(allUsersRepo, RefNames.REFS_EXTERNAL_IDS);
-    assertRefUpdateFailure(r.getRemoteUpdate(RefNames.REFS_EXTERNAL_IDS), "invalid external IDs");
-  }
-
-  @Test
-  public void pushToExternalIdsBranchRejectsExternalIdWithEmptyNote() throws Exception {
-    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
-
-    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
-    fetch(allUsersRepo, RefNames.REFS_EXTERNAL_IDS + ":" + RefNames.REFS_EXTERNAL_IDS);
-    allUsersRepo.reset(RefNames.REFS_EXTERNAL_IDS);
-
-    insertExternalIdWithEmptyNote(
-        allUsersRepo.getRepository(), allUsersRepo.getRevWalk(), "foo:bar");
-    allUsersRepo.reset(RefNames.REFS_EXTERNAL_IDS);
-
-    allowPushOfExternalIds();
-    PushResult r = pushHead(allUsersRepo, RefNames.REFS_EXTERNAL_IDS);
-    assertRefUpdateFailure(r.getRemoteUpdate(RefNames.REFS_EXTERNAL_IDS), "invalid external IDs");
-  }
-
-  @Test
-  public void pushToExternalIdsBranchRejectsExternalIdForNonExistingAccount() throws Exception {
-    testPushToExternalIdsBranchRejectsInvalidExternalId(
-        createExternalIdForNonExistingAccount("foo:bar"));
-  }
-
-  @Test
-  public void pushToExternalIdsBranchRejectsExternalIdWithInvalidEmail() throws Exception {
-    testPushToExternalIdsBranchRejectsInvalidExternalId(
-        createExternalIdWithInvalidEmail("foo:bar"));
-  }
-
-  @Test
-  public void pushToExternalIdsBranchRejectsDuplicateEmails() throws Exception {
-    testPushToExternalIdsBranchRejectsInvalidExternalId(
-        createExternalIdWithDuplicateEmail("foo:bar"));
-  }
-
-  @Test
-  public void pushToExternalIdsBranchRejectsBadPassword() throws Exception {
-    testPushToExternalIdsBranchRejectsInvalidExternalId(createExternalIdWithBadPassword("foo"));
-  }
-
-  private void testPushToExternalIdsBranchRejectsInvalidExternalId(ExternalId invalidExtId)
-      throws Exception {
-    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
-
-    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
-    fetch(allUsersRepo, RefNames.REFS_EXTERNAL_IDS + ":" + RefNames.REFS_EXTERNAL_IDS);
-    allUsersRepo.reset(RefNames.REFS_EXTERNAL_IDS);
-
-    addExtId(allUsersRepo, invalidExtId);
-    allUsersRepo.reset(RefNames.REFS_EXTERNAL_IDS);
-
-    allowPushOfExternalIds();
-    PushResult r = pushHead(allUsersRepo, RefNames.REFS_EXTERNAL_IDS);
-    assertRefUpdateFailure(r.getRemoteUpdate(RefNames.REFS_EXTERNAL_IDS), "invalid external IDs");
-  }
-
-  @Test
-  public void readExternalIdsWhenInvalidExternalIdsExist() throws Exception {
-    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
-    resetCurrentApiUser();
-
-    insertValidExternalIds();
-    insertInvalidButParsableExternalIds();
-
-    Set<ExternalId> parseableExtIds = externalIds.all();
-
-    insertNonParsableExternalIds();
-
-    Set<ExternalId> extIds = externalIds.all();
-    assertThat(extIds).containsExactlyElementsIn(parseableExtIds);
-
-    for (ExternalId parseableExtId : parseableExtIds) {
-      ExternalId extId = externalIds.get(parseableExtId.key());
-      assertThat(extId).isEqualTo(parseableExtId);
-    }
-  }
-
-  @Test
-  public void checkConsistency() throws Exception {
-    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
-    resetCurrentApiUser();
-
-    insertValidExternalIds();
-
-    ConsistencyCheckInput input = new ConsistencyCheckInput();
-    input.checkAccountExternalIds = new CheckAccountExternalIdsInput();
-    ConsistencyCheckInfo checkInfo = gApi.config().server().checkConsistency(input);
-    assertThat(checkInfo.checkAccountExternalIdsResult.problems).isEmpty();
-
-    Set<ConsistencyProblemInfo> expectedProblems = new HashSet<>();
-    expectedProblems.addAll(insertInvalidButParsableExternalIds());
-    expectedProblems.addAll(insertNonParsableExternalIds());
-
-    checkInfo = gApi.config().server().checkConsistency(input);
-    assertThat(checkInfo.checkAccountExternalIdsResult.problems).hasSize(expectedProblems.size());
-    assertThat(checkInfo.checkAccountExternalIdsResult.problems)
-        .containsExactlyElementsIn(expectedProblems);
-  }
-
-  @Test
-  public void checkConsistencyNotAllowed() throws Exception {
-    exception.expect(AuthException.class);
-    exception.expectMessage("access database not permitted");
-    gApi.config().server().checkConsistency(new ConsistencyCheckInput());
-  }
-
-  private ConsistencyProblemInfo consistencyError(String message) {
-    return new ConsistencyProblemInfo(ConsistencyProblemInfo.Status.ERROR, message);
-  }
-
-  private void insertValidExternalIds() throws IOException, ConfigInvalidException, OrmException {
-    MutableInteger i = new MutableInteger();
-    String scheme = "valid";
-    ExternalIdsUpdate u = extIdsUpdate.create();
-
-    // create valid external IDs
-    u.insert(
-        ExternalId.createWithPassword(
-            ExternalId.Key.parse(nextId(scheme, i)),
-            admin.id,
-            "admin.other@example.com",
-            "secret-password"));
-    u.insert(createExternalIdWithOtherCaseEmail(nextId(scheme, i)));
-  }
-
-  private Set<ConsistencyProblemInfo> insertInvalidButParsableExternalIds()
-      throws IOException, ConfigInvalidException, OrmException {
-    MutableInteger i = new MutableInteger();
-    String scheme = "invalid";
-    ExternalIdsUpdate u = extIdsUpdate.create();
-
-    Set<ConsistencyProblemInfo> expectedProblems = new HashSet<>();
-    ExternalId extIdForNonExistingAccount =
-        createExternalIdForNonExistingAccount(nextId(scheme, i));
-    u.insert(extIdForNonExistingAccount);
-    expectedProblems.add(
-        consistencyError(
-            "External ID '"
-                + extIdForNonExistingAccount.key().get()
-                + "' belongs to account that doesn't exist: "
-                + extIdForNonExistingAccount.accountId().get()));
-
-    ExternalId extIdWithInvalidEmail = createExternalIdWithInvalidEmail(nextId(scheme, i));
-    u.insert(extIdWithInvalidEmail);
-    expectedProblems.add(
-        consistencyError(
-            "External ID '"
-                + extIdWithInvalidEmail.key().get()
-                + "' has an invalid email: "
-                + extIdWithInvalidEmail.email()));
-
-    ExternalId extIdWithDuplicateEmail = createExternalIdWithDuplicateEmail(nextId(scheme, i));
-    u.insert(extIdWithDuplicateEmail);
-    expectedProblems.add(
-        consistencyError(
-            "Email '"
-                + extIdWithDuplicateEmail.email()
-                + "' is not unique, it's used by the following external IDs: '"
-                + extIdWithDuplicateEmail.key().get()
-                + "', 'mailto:"
-                + extIdWithDuplicateEmail.email()
-                + "'"));
-
-    ExternalId extIdWithBadPassword = createExternalIdWithBadPassword("admin-username");
-    u.insert(extIdWithBadPassword);
-    expectedProblems.add(
-        consistencyError(
-            "External ID '"
-                + extIdWithBadPassword.key().get()
-                + "' has an invalid password: unrecognized algorithm"));
-
-    return expectedProblems;
-  }
-
-  private Set<ConsistencyProblemInfo> insertNonParsableExternalIds() throws IOException {
-    MutableInteger i = new MutableInteger();
-    String scheme = "corrupt";
-
-    Set<ConsistencyProblemInfo> expectedProblems = new HashSet<>();
-    try (Repository repo = repoManager.openRepository(allUsers);
-        RevWalk rw = new RevWalk(repo)) {
-      String externalId = nextId(scheme, i);
-      String noteId = insertExternalIdWithoutAccountId(repo, rw, externalId);
-      expectedProblems.add(
-          consistencyError(
-              "Invalid external ID config for note '"
-                  + noteId
-                  + "': Value for 'externalId."
-                  + externalId
-                  + ".accountId' is missing, expected account ID"));
-
-      externalId = nextId(scheme, i);
-      noteId = insertExternalIdWithKeyThatDoesntMatchNoteId(repo, rw, externalId);
-      expectedProblems.add(
-          consistencyError(
-              "Invalid external ID config for note '"
-                  + noteId
-                  + "': SHA1 of external ID '"
-                  + externalId
-                  + "' does not match note ID '"
-                  + noteId
-                  + "'"));
-
-      noteId = insertExternalIdWithInvalidConfig(repo, rw, nextId(scheme, i));
-      expectedProblems.add(
-          consistencyError(
-              "Invalid external ID config for note '" + noteId + "': Invalid line in config file"));
-
-      noteId = insertExternalIdWithEmptyNote(repo, rw, nextId(scheme, i));
-      expectedProblems.add(
-          consistencyError(
-              "Invalid external ID config for note '"
-                  + noteId
-                  + "': Expected exactly 1 'externalId' section, found 0"));
-    }
-
-    return expectedProblems;
-  }
-
-  private ExternalId createExternalIdWithOtherCaseEmail(String externalId) {
-    return ExternalId.createWithPassword(
-        ExternalId.Key.parse(externalId), admin.id, admin.email.toUpperCase(Locale.US), "password");
-  }
-
-  private String insertExternalIdWithoutAccountId(Repository repo, RevWalk rw, String externalId)
-      throws IOException {
-    ObjectId rev = ExternalIdReader.readRevision(repo);
-    NoteMap noteMap = ExternalIdReader.readNoteMap(rw, rev);
-
-    ExternalId extId = ExternalId.create(ExternalId.Key.parse(externalId), admin.id);
-
-    try (ObjectInserter ins = repo.newObjectInserter()) {
-      ObjectId noteId = extId.key().sha1();
-      Config c = new Config();
-      extId.writeToConfig(c);
-      c.unset("externalId", extId.key().get(), "accountId");
-      byte[] raw = c.toText().getBytes(UTF_8);
-      ObjectId dataBlob = ins.insert(OBJ_BLOB, raw);
-      noteMap.set(noteId, dataBlob);
-
-      ExternalIdsUpdate.commit(
-          allUsers,
-          repo,
-          rw,
-          ins,
-          rev,
-          noteMap,
-          "Add external ID",
-          admin.getIdent(),
-          admin.getIdent(),
-          null,
-          GitReferenceUpdated.DISABLED);
-      return noteId.getName();
-    }
-  }
-
-  private String insertExternalIdWithKeyThatDoesntMatchNoteId(
-      Repository repo, RevWalk rw, String externalId) throws IOException {
-    ObjectId rev = ExternalIdReader.readRevision(repo);
-    NoteMap noteMap = ExternalIdReader.readNoteMap(rw, rev);
-
-    ExternalId extId = ExternalId.create(ExternalId.Key.parse(externalId), admin.id);
-
-    try (ObjectInserter ins = repo.newObjectInserter()) {
-      ObjectId noteId = ExternalId.Key.parse(externalId + "x").sha1();
-      Config c = new Config();
-      extId.writeToConfig(c);
-      byte[] raw = c.toText().getBytes(UTF_8);
-      ObjectId dataBlob = ins.insert(OBJ_BLOB, raw);
-      noteMap.set(noteId, dataBlob);
-
-      ExternalIdsUpdate.commit(
-          allUsers,
-          repo,
-          rw,
-          ins,
-          rev,
-          noteMap,
-          "Add external ID",
-          admin.getIdent(),
-          admin.getIdent(),
-          null,
-          GitReferenceUpdated.DISABLED);
-      return noteId.getName();
-    }
-  }
-
-  private String insertExternalIdWithInvalidConfig(Repository repo, RevWalk rw, String externalId)
-      throws IOException {
-    ObjectId rev = ExternalIdReader.readRevision(repo);
-    NoteMap noteMap = ExternalIdReader.readNoteMap(rw, rev);
-
-    try (ObjectInserter ins = repo.newObjectInserter()) {
-      ObjectId noteId = ExternalId.Key.parse(externalId).sha1();
-      byte[] raw = "bad-config".getBytes(UTF_8);
-      ObjectId dataBlob = ins.insert(OBJ_BLOB, raw);
-      noteMap.set(noteId, dataBlob);
-
-      ExternalIdsUpdate.commit(
-          allUsers,
-          repo,
-          rw,
-          ins,
-          rev,
-          noteMap,
-          "Add external ID",
-          admin.getIdent(),
-          admin.getIdent(),
-          null,
-          GitReferenceUpdated.DISABLED);
-      return noteId.getName();
-    }
-  }
-
-  private String insertExternalIdWithEmptyNote(Repository repo, RevWalk rw, String externalId)
-      throws IOException {
-    ObjectId rev = ExternalIdReader.readRevision(repo);
-    NoteMap noteMap = ExternalIdReader.readNoteMap(rw, rev);
-
-    try (ObjectInserter ins = repo.newObjectInserter()) {
-      ObjectId noteId = ExternalId.Key.parse(externalId).sha1();
-      byte[] raw = "".getBytes(UTF_8);
-      ObjectId dataBlob = ins.insert(OBJ_BLOB, raw);
-      noteMap.set(noteId, dataBlob);
-
-      ExternalIdsUpdate.commit(
-          allUsers,
-          repo,
-          rw,
-          ins,
-          rev,
-          noteMap,
-          "Add external ID",
-          admin.getIdent(),
-          admin.getIdent(),
-          null,
-          GitReferenceUpdated.DISABLED);
-      return noteId.getName();
-    }
-  }
-
-  private ExternalId createExternalIdForNonExistingAccount(String externalId) {
-    return ExternalId.create(ExternalId.Key.parse(externalId), new Account.Id(1));
-  }
-
-  private ExternalId createExternalIdWithInvalidEmail(String externalId) {
-    return ExternalId.createWithEmail(ExternalId.Key.parse(externalId), admin.id, "invalid-email");
-  }
-
-  private ExternalId createExternalIdWithDuplicateEmail(String externalId) {
-    return ExternalId.createWithEmail(ExternalId.Key.parse(externalId), admin.id, admin.email);
-  }
-
-  private ExternalId createExternalIdWithBadPassword(String username) {
-    return ExternalId.create(
-        ExternalId.Key.create(SCHEME_USERNAME, username),
-        admin.id,
-        null,
-        "non-hashed-password-is-not-allowed");
-  }
-
-  private static String nextId(String scheme, MutableInteger i) {
-    return scheme + ":foo" + ++i.value;
-  }
-
-  @Test
-  public void retryOnLockFailure() throws Exception {
-    Retryer<RefsMetaExternalIdsUpdate> retryer =
-        ExternalIdsUpdate.retryerBuilder()
-            .withBlockStrategy(
-                new BlockStrategy() {
-                  @Override
-                  public void block(long sleepTime) {
-                    // Don't sleep in tests.
-                  }
-                })
-            .build();
-
-    ExternalId.Key fooId = ExternalId.Key.create("foo", "foo");
-    ExternalId.Key barId = ExternalId.Key.create("bar", "bar");
-
-    final AtomicBoolean doneBgUpdate = new AtomicBoolean(false);
-    ExternalIdsUpdate update =
-        new ExternalIdsUpdate(
-            repoManager,
-            accountCache,
-            allUsers,
-            metricMaker,
-            externalIds,
-            new DisabledExternalIdCache(),
-            serverIdent.get(),
-            serverIdent.get(),
-            null,
-            GitReferenceUpdated.DISABLED,
-            () -> {
-              if (!doneBgUpdate.getAndSet(true)) {
-                try {
-                  extIdsUpdate.create().insert(ExternalId.create(barId, admin.id));
-                } catch (IOException | ConfigInvalidException | OrmException e) {
-                  // Ignore, the successful insertion of the external ID is asserted later
-                }
-              }
-            },
-            retryer);
-    assertThat(doneBgUpdate.get()).isFalse();
-    update.insert(ExternalId.create(fooId, admin.id));
-    assertThat(doneBgUpdate.get()).isTrue();
-
-    assertThat(externalIds.get(fooId)).isNotNull();
-    assertThat(externalIds.get(barId)).isNotNull();
-  }
-
-  @Test
-  public void failAfterRetryerGivesUp() throws Exception {
-    ExternalId.Key[] extIdsKeys = {
-      ExternalId.Key.create("foo", "foo"),
-      ExternalId.Key.create("bar", "bar"),
-      ExternalId.Key.create("baz", "baz")
-    };
-    final AtomicInteger bgCounter = new AtomicInteger(0);
-    ExternalIdsUpdate update =
-        new ExternalIdsUpdate(
-            repoManager,
-            accountCache,
-            allUsers,
-            metricMaker,
-            externalIds,
-            new DisabledExternalIdCache(),
-            serverIdent.get(),
-            serverIdent.get(),
-            null,
-            GitReferenceUpdated.DISABLED,
-            () -> {
-              try {
-                extIdsUpdate
-                    .create()
-                    .insert(ExternalId.create(extIdsKeys[bgCounter.getAndAdd(1)], admin.id));
-              } catch (IOException | ConfigInvalidException | OrmException e) {
-                // Ignore, the successful insertion of the external ID is asserted later
-              }
-            },
-            RetryerBuilder.<RefsMetaExternalIdsUpdate>newBuilder()
-                .retryIfException(e -> e instanceof LockFailureException)
-                .withStopStrategy(StopStrategies.stopAfterAttempt(extIdsKeys.length))
-                .build());
-    assertThat(bgCounter.get()).isEqualTo(0);
-    try {
-      update.insert(ExternalId.create(ExternalId.Key.create("abc", "abc"), admin.id));
-      fail("expected LockFailureException");
-    } catch (LockFailureException e) {
-      // Ignore, expected
-    }
-    assertThat(bgCounter.get()).isEqualTo(extIdsKeys.length);
-    for (ExternalId.Key extIdKey : extIdsKeys) {
-      assertThat(externalIds.get(extIdKey)).isNotNull();
-    }
-  }
-
-  @Test
-  public void readExternalIdWithAccountIdThatCanBeExpressedInKiB() throws Exception {
-    ExternalId.Key extIdKey = ExternalId.Key.parse("foo:bar");
-    Account.Id accountId = new Account.Id(1024 * 100);
-    extIdsUpdate.create().insert(ExternalId.create(extIdKey, accountId));
-    ExternalId extId = externalIds.get(extIdKey);
-    assertThat(extId.accountId()).isEqualTo(accountId);
-  }
-
-  @Test
-  public void checkNoReloadAfterUpdate() throws Exception {
-    Set<ExternalId> expectedExtIds = new HashSet<>(externalIds.byAccount(admin.id));
-    externalIdReader.setFailOnLoad(true);
-
-    // insert external ID
-    ExternalId extId = ExternalId.create("foo", "bar", admin.id);
-    extIdsUpdate.create().insert(extId);
-    expectedExtIds.add(extId);
-    assertThat(externalIds.byAccount(admin.id)).containsExactlyElementsIn(expectedExtIds);
-
-    // update external ID
-    expectedExtIds.remove(extId);
-    extId = ExternalId.createWithEmail("foo", "bar", admin.id, "foo.bar@example.com");
-    extIdsUpdate.create().upsert(extId);
-    expectedExtIds.add(extId);
-    assertThat(externalIds.byAccount(admin.id)).containsExactlyElementsIn(expectedExtIds);
-
-    // delete external ID
-    extIdsUpdate.create().delete(extId);
-    expectedExtIds.remove(extId);
-    assertThat(externalIds.byAccount(admin.id)).containsExactlyElementsIn(expectedExtIds);
-  }
-
-  @Test
-  public void byAccountFailIfReadingExternalIdsFails() throws Exception {
-    externalIdReader.setFailOnLoad(true);
-
-    // update external ID branch so that external IDs need to be reloaded
-    insertExtIdBehindGerritsBack(ExternalId.create("foo", "bar", admin.id));
-
-    exception.expect(IOException.class);
-    externalIds.byAccount(admin.id);
-  }
-
-  @Test
-  public void byEmailFailIfReadingExternalIdsFails() throws Exception {
-    externalIdReader.setFailOnLoad(true);
-
-    // update external ID branch so that external IDs need to be reloaded
-    insertExtIdBehindGerritsBack(ExternalId.create("foo", "bar", admin.id));
-
-    exception.expect(IOException.class);
-    externalIds.byEmail(admin.email);
-  }
-
-  @Test
-  public void byAccountUpdateExternalIdsBehindGerritsBack() throws Exception {
-    Set<ExternalId> expectedExternalIds = new HashSet<>(externalIds.byAccount(admin.id));
-    ExternalId newExtId = ExternalId.create("foo", "bar", admin.id);
-    insertExtIdBehindGerritsBack(newExtId);
-    expectedExternalIds.add(newExtId);
-    assertThat(externalIds.byAccount(admin.id)).containsExactlyElementsIn(expectedExternalIds);
-  }
-
-  @Test
-  public void unsetEmail() throws Exception {
-    ExternalId extId = ExternalId.createWithEmail("x", "1", user.id, "x@example.com");
-    extIdsUpdate.create().insert(extId);
-
-    ExternalId extIdWithoutEmail = ExternalId.create("x", "1", user.id);
-    extIdsUpdate.create().upsert(extIdWithoutEmail);
-
-    assertThat(externalIds.get(extId.key())).isEqualTo(extIdWithoutEmail);
-  }
-
-  @Test
-  public void unsetHttpPassword() throws Exception {
-    ExternalId extId =
-        ExternalId.createWithPassword(ExternalId.Key.create("y", "1"), user.id, null, "secret");
-    extIdsUpdate.create().insert(extId);
-
-    ExternalId extIdWithoutPassword = ExternalId.create("y", "1", user.id);
-    extIdsUpdate.create().upsert(extIdWithoutPassword);
-
-    assertThat(externalIds.get(extId.key())).isEqualTo(extIdWithoutPassword);
-  }
-
-  private void insertExtIdBehindGerritsBack(ExternalId extId) throws Exception {
-    try (Repository repo = repoManager.openRepository(allUsers);
-        RevWalk rw = new RevWalk(repo);
-        ObjectInserter ins = repo.newObjectInserter()) {
-      ObjectId rev = ExternalIdReader.readRevision(repo);
-      NoteMap noteMap = ExternalIdReader.readNoteMap(rw, rev);
-      ExternalIdsUpdate.insert(rw, ins, noteMap, extId);
-      ExternalIdsUpdate.commit(
-          allUsers,
-          repo,
-          rw,
-          ins,
-          rev,
-          noteMap,
-          "insert new ID",
-          serverIdent.get(),
-          serverIdent.get(),
-          null,
-          GitReferenceUpdated.DISABLED);
-    }
-  }
-
-  private void addExtId(TestRepository<?> testRepo, ExternalId... extIds)
-      throws IOException, OrmDuplicateKeyException, ConfigInvalidException {
-    ObjectId rev = ExternalIdReader.readRevision(testRepo.getRepository());
-
-    try (ObjectInserter ins = testRepo.getRepository().newObjectInserter()) {
-      NoteMap noteMap = ExternalIdReader.readNoteMap(testRepo.getRevWalk(), rev);
-      for (ExternalId extId : extIds) {
-        ExternalIdsUpdate.insert(testRepo.getRevWalk(), ins, noteMap, extId);
-      }
-
-      ExternalIdsUpdate.commit(
-          allUsers,
-          testRepo.getRepository(),
-          testRepo.getRevWalk(),
-          ins,
-          rev,
-          noteMap,
-          "Add external ID",
-          admin.getIdent(),
-          admin.getIdent(),
-          null,
-          GitReferenceUpdated.DISABLED);
-    }
-  }
-
-  private List<AccountExternalIdInfo> toExternalIdInfos(Collection<ExternalId> extIds) {
-    return extIds.stream().map(this::toExternalIdInfo).collect(toList());
-  }
-
-  private AccountExternalIdInfo toExternalIdInfo(ExternalId extId) {
-    AccountExternalIdInfo info = new AccountExternalIdInfo();
-    info.identity = extId.key().get();
-    info.emailAddress = extId.email();
-    info.canDelete = !extId.isScheme(SCHEME_USERNAME) ? true : null;
-    info.trusted =
-        extId.isScheme(SCHEME_MAILTO)
-                || extId.isScheme(SCHEME_UUID)
-                || extId.isScheme(SCHEME_USERNAME)
-            ? true
-            : null;
-    return info;
-  }
-
-  private void allowPushOfExternalIds() throws IOException, ConfigInvalidException {
-    grant(allUsers, RefNames.REFS_EXTERNAL_IDS, Permission.READ);
-    grant(allUsers, RefNames.REFS_EXTERNAL_IDS, Permission.PUSH);
-  }
-
-  private void assertRefUpdateFailure(RemoteRefUpdate update, String msg) {
-    assertThat(update.getStatus()).isEqualTo(Status.REJECTED_OTHER_REASON);
-    assertThat(update.getMessage()).contains(msg);
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/GetAccountDetailIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/GetAccountDetailIT.java
deleted file mode 100644
index dcd40b9..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/GetAccountDetailIT.java
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.acceptance.rest.account;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.rest.account.AccountAssert.assertAccountInfo;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.RestResponse;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.account.GetDetail.AccountDetailInfo;
-import org.junit.Test;
-
-public class GetAccountDetailIT extends AbstractDaemonTest {
-  @Test
-  public void getDetail() throws Exception {
-    RestResponse r = adminRestSession.get("/accounts/" + admin.username + "/detail/");
-    AccountDetailInfo info = newGson().fromJson(r.getReader(), AccountDetailInfo.class);
-    assertAccountInfo(admin, info);
-    Account account = accountCache.get(admin.getId()).getAccount();
-    assertThat(info.registeredOn).isEqualTo(account.getRegisteredOn());
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/ImpersonationIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/ImpersonationIT.java
deleted file mode 100644
index 5004d95..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/ImpersonationIT.java
+++ /dev/null
@@ -1,592 +0,0 @@
-// 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.
-
-package com.google.gerrit.acceptance.rest.account;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.TruthJUnit.assume;
-import static com.google.gerrit.extensions.client.ListChangesOption.MESSAGES;
-import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.GerritConfig;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.acceptance.RestResponse;
-import com.google.gerrit.acceptance.RestSession;
-import com.google.gerrit.acceptance.TestAccount;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.changes.DraftInput;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.api.changes.ReviewInput.CommentInput;
-import com.google.gerrit.extensions.api.changes.ReviewInput.DraftHandling;
-import com.google.gerrit.extensions.api.changes.ReviewInput.RobotCommentInput;
-import com.google.gerrit.extensions.api.changes.RevisionApi;
-import com.google.gerrit.extensions.api.changes.SubmitInput;
-import com.google.gerrit.extensions.api.groups.GroupInput;
-import com.google.gerrit.extensions.client.Side;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.ChangeMessageInfo;
-import com.google.gerrit.extensions.common.CommentInfo;
-import com.google.gerrit.extensions.common.GroupInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.Patch;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.client.RobotComment;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.CommentsUtil;
-import com.google.gerrit.server.account.AccountControl;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.project.Util;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.inject.Inject;
-import org.apache.http.Header;
-import org.apache.http.message.BasicHeader;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-public class ImpersonationIT extends AbstractDaemonTest {
-  @Inject private AccountControl.Factory accountControlFactory;
-
-  @Inject private ApprovalsUtil approvalsUtil;
-
-  @Inject private ChangeMessagesUtil cmUtil;
-
-  @Inject private CommentsUtil commentsUtil;
-
-  private RestSession anonRestSession;
-  private TestAccount admin2;
-  private GroupInfo newGroup;
-
-  @Before
-  public void setUp() throws Exception {
-    anonRestSession = new RestSession(server, null);
-    admin2 = accountCreator.admin2();
-    GroupInput gi = new GroupInput();
-    gi.name = name("New-Group");
-    gi.members = ImmutableList.of(user.id.toString());
-    newGroup = gApi.groups().create(gi).get();
-  }
-
-  @After
-  public void tearDown() throws Exception {
-    removeRunAs();
-  }
-
-  @Test
-  public void voteOnBehalfOf() throws Exception {
-    allowCodeReviewOnBehalfOf();
-    PushOneCommit.Result r = createChange();
-    RevisionApi revision = gApi.changes().id(r.getChangeId()).current();
-
-    ReviewInput in = ReviewInput.recommend();
-    in.onBehalfOf = user.id.toString();
-    in.message = "Message on behalf of";
-    revision.review(in);
-
-    PatchSetApproval psa = Iterables.getOnlyElement(r.getChange().approvals().values());
-    assertThat(psa.getPatchSetId().get()).isEqualTo(1);
-    assertThat(psa.getLabel()).isEqualTo("Code-Review");
-    assertThat(psa.getAccountId()).isEqualTo(user.id);
-    assertThat(psa.getValue()).isEqualTo(1);
-    assertThat(psa.getRealAccountId()).isEqualTo(admin.id);
-
-    ChangeData cd = r.getChange();
-    ChangeMessage m = Iterables.getLast(cmUtil.byChange(db, cd.notes()));
-    assertThat(m.getMessage()).endsWith(in.message);
-    assertThat(m.getAuthor()).isEqualTo(user.id);
-    assertThat(m.getRealAuthor()).isEqualTo(admin.id);
-  }
-
-  @Test
-  public void voteOnBehalfOfRequiresLabel() throws Exception {
-    allowCodeReviewOnBehalfOf();
-    PushOneCommit.Result r = createChange();
-    RevisionApi revision = gApi.changes().id(r.getChangeId()).current();
-
-    ReviewInput in = new ReviewInput();
-    in.onBehalfOf = user.id.toString();
-    in.message = "Message on behalf of";
-
-    exception.expect(AuthException.class);
-    exception.expectMessage("label required to post review on behalf of \"" + in.onBehalfOf + '"');
-    revision.review(in);
-  }
-
-  @Test
-  @GerritConfig(name = "change.strictLabels", value = "true")
-  public void voteOnBehalfOfInvalidLabel() throws Exception {
-    allowCodeReviewOnBehalfOf();
-
-    String changeId = createChange().getChangeId();
-    ReviewInput in = new ReviewInput().label("Not-A-Label", 5);
-    in.onBehalfOf = user.id.toString();
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("label \"Not-A-Label\" is not a configured label");
-    gApi.changes().id(changeId).current().review(in);
-  }
-
-  @Test
-  public void voteOnBehalfOfInvalidLabelIgnoredWithoutStrictLabels() throws Exception {
-    allowCodeReviewOnBehalfOf();
-
-    String changeId = createChange().getChangeId();
-    ReviewInput in = new ReviewInput().label("Code-Review", 1).label("Not-A-Label", 5);
-    in.onBehalfOf = user.id.toString();
-    gApi.changes().id(changeId).current().review(in);
-
-    assertThat(gApi.changes().id(changeId).get().labels).doesNotContainKey("Not-A-Label");
-  }
-
-  @Test
-  public void voteOnBehalfOfLabelNotPermitted() throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    LabelType verified = Util.verified();
-    cfg.getLabelSections().put(verified.getName(), verified);
-    saveProjectConfig(project, cfg);
-
-    PushOneCommit.Result r = createChange();
-    RevisionApi revision = gApi.changes().id(r.getChangeId()).current();
-
-    ReviewInput in = new ReviewInput();
-    in.onBehalfOf = user.id.toString();
-    in.label("Verified", 1);
-
-    exception.expect(AuthException.class);
-    exception.expectMessage(
-        "not permitted to modify label \"Verified\" on behalf of \"" + in.onBehalfOf + '"');
-    revision.review(in);
-  }
-
-  @Test
-  public void voteOnBehalfOfWithComment() throws Exception {
-    testVoteOnBehalfOfWithComment();
-  }
-
-  @GerritConfig(name = "notedb.writeJson", value = "true")
-  @Test
-  public void voteOnBehalfOfWithCommentWritingJson() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    testVoteOnBehalfOfWithComment();
-  }
-
-  private void testVoteOnBehalfOfWithComment() throws Exception {
-    allowCodeReviewOnBehalfOf();
-    PushOneCommit.Result r = createChange();
-
-    ReviewInput in = new ReviewInput();
-    in.onBehalfOf = user.id.toString();
-    in.label("Code-Review", 1);
-    CommentInput ci = new CommentInput();
-    ci.path = Patch.COMMIT_MSG;
-    ci.side = Side.REVISION;
-    ci.line = 1;
-    ci.message = "message";
-    in.comments = ImmutableMap.of(ci.path, ImmutableList.of(ci));
-    gApi.changes().id(r.getChangeId()).current().review(in);
-
-    PatchSetApproval psa = Iterables.getOnlyElement(r.getChange().approvals().values());
-    assertThat(psa.getPatchSetId().get()).isEqualTo(1);
-    assertThat(psa.getLabel()).isEqualTo("Code-Review");
-    assertThat(psa.getAccountId()).isEqualTo(user.id);
-    assertThat(psa.getValue()).isEqualTo(1);
-    assertThat(psa.getRealAccountId()).isEqualTo(admin.id);
-
-    ChangeData cd = r.getChange();
-    Comment c = Iterables.getOnlyElement(commentsUtil.publishedByChange(db, cd.notes()));
-    assertThat(c.message).isEqualTo(ci.message);
-    assertThat(c.author.getId()).isEqualTo(user.id);
-    assertThat(c.getRealAuthor().getId()).isEqualTo(admin.id);
-  }
-
-  @GerritConfig(name = "notedb.writeJson", value = "true")
-  @Test
-  public void voteOnBehalfOfWithRobotComment() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    allowCodeReviewOnBehalfOf();
-    PushOneCommit.Result r = createChange();
-
-    ReviewInput in = new ReviewInput();
-    in.onBehalfOf = user.id.toString();
-    in.label("Code-Review", 1);
-    RobotCommentInput ci = new RobotCommentInput();
-    ci.robotId = "my-robot";
-    ci.robotRunId = "abcd1234";
-    ci.path = Patch.COMMIT_MSG;
-    ci.side = Side.REVISION;
-    ci.line = 1;
-    ci.message = "message";
-    in.robotComments = ImmutableMap.of(ci.path, ImmutableList.of(ci));
-    gApi.changes().id(r.getChangeId()).current().review(in);
-
-    ChangeData cd = r.getChange();
-    RobotComment c = Iterables.getOnlyElement(commentsUtil.robotCommentsByChange(cd.notes()));
-    assertThat(c.message).isEqualTo(ci.message);
-    assertThat(c.robotId).isEqualTo(ci.robotId);
-    assertThat(c.robotRunId).isEqualTo(ci.robotRunId);
-    assertThat(c.author.getId()).isEqualTo(user.id);
-    assertThat(c.getRealAuthor().getId()).isEqualTo(admin.id);
-  }
-
-  @Test
-  public void voteOnBehalfOfCannotModifyDrafts() throws Exception {
-    allowCodeReviewOnBehalfOf();
-    PushOneCommit.Result r = createChange();
-
-    setApiUser(user);
-    DraftInput di = new DraftInput();
-    di.path = Patch.COMMIT_MSG;
-    di.side = Side.REVISION;
-    di.line = 1;
-    di.message = "message";
-    gApi.changes().id(r.getChangeId()).current().createDraft(di);
-
-    setApiUser(admin);
-    ReviewInput in = new ReviewInput();
-    in.onBehalfOf = user.id.toString();
-    in.label("Code-Review", 1);
-    in.drafts = DraftHandling.PUBLISH;
-
-    exception.expect(AuthException.class);
-    exception.expectMessage("not allowed to modify other user's drafts");
-    gApi.changes().id(r.getChangeId()).current().review(in);
-  }
-
-  @Test
-  public void voteOnBehalfOfMissingUser() throws Exception {
-    allowCodeReviewOnBehalfOf();
-    PushOneCommit.Result r = createChange();
-    RevisionApi revision = gApi.changes().id(r.getChangeId()).current();
-
-    ReviewInput in = new ReviewInput();
-    in.onBehalfOf = "doesnotexist";
-    in.label("Code-Review", 1);
-
-    exception.expect(UnprocessableEntityException.class);
-    exception.expectMessage("Account Not Found: doesnotexist");
-    revision.review(in);
-  }
-
-  @Test
-  public void voteOnBehalfOfFailsWhenUserCannotSeeDestinationRef() throws Exception {
-    blockRead(newGroup);
-
-    allowCodeReviewOnBehalfOf();
-    PushOneCommit.Result r = createChange();
-    RevisionApi revision = gApi.changes().id(r.getChangeId()).current();
-
-    ReviewInput in = new ReviewInput();
-    in.onBehalfOf = user.id.toString();
-    in.label("Code-Review", 1);
-
-    exception.expect(UnprocessableEntityException.class);
-    exception.expectMessage("on_behalf_of account " + user.id + " cannot see change");
-    revision.review(in);
-  }
-
-  @GerritConfig(name = "accounts.visibility", value = "SAME_GROUP")
-  @Test
-  public void voteOnBehalfOfInvisibleUserNotAllowed() throws Exception {
-    allowCodeReviewOnBehalfOf();
-    setApiUser(accountCreator.user2());
-    assertThat(accountControlFactory.get().canSee(user.id)).isFalse();
-
-    PushOneCommit.Result r = createChange();
-    RevisionApi revision = gApi.changes().id(r.getChangeId()).current();
-
-    ReviewInput in = new ReviewInput();
-    in.onBehalfOf = user.id.toString();
-    in.label("Code-Review", 1);
-
-    exception.expect(UnprocessableEntityException.class);
-    exception.expectMessage("Account Not Found: " + in.onBehalfOf);
-    revision.review(in);
-  }
-
-  @Test
-  public void submitOnBehalfOf() throws Exception {
-    allowSubmitOnBehalfOf();
-    PushOneCommit.Result r = createChange();
-    String changeId = project.get() + "~master~" + r.getChangeId();
-    gApi.changes().id(changeId).current().review(ReviewInput.approve());
-    SubmitInput in = new SubmitInput();
-    in.onBehalfOf = admin2.email;
-    gApi.changes().id(changeId).current().submit(in);
-
-    ChangeData cd = r.getChange();
-    assertThat(cd.change().getStatus()).isEqualTo(Change.Status.MERGED);
-    PatchSetApproval submitter =
-        approvalsUtil.getSubmitter(db, cd.notes(), cd.change().currentPatchSetId());
-    assertThat(submitter.getAccountId()).isEqualTo(admin2.id);
-    assertThat(submitter.getRealAccountId()).isEqualTo(admin.id);
-  }
-
-  @Test
-  public void submitOnBehalfOfInvalidUser() throws Exception {
-    allowSubmitOnBehalfOf();
-    PushOneCommit.Result r = createChange();
-    String changeId = project.get() + "~master~" + r.getChangeId();
-    gApi.changes().id(changeId).current().review(ReviewInput.approve());
-    SubmitInput in = new SubmitInput();
-    in.onBehalfOf = "doesnotexist";
-    exception.expect(UnprocessableEntityException.class);
-    exception.expectMessage("Account Not Found: doesnotexist");
-    gApi.changes().id(changeId).current().submit(in);
-  }
-
-  @Test
-  public void submitOnBehalfOfNotPermitted() throws Exception {
-    PushOneCommit.Result r = createChange();
-    gApi.changes()
-        .id(project.get() + "~master~" + r.getChangeId())
-        .current()
-        .review(ReviewInput.approve());
-    SubmitInput in = new SubmitInput();
-    in.onBehalfOf = admin2.email;
-    exception.expect(AuthException.class);
-    exception.expectMessage("submit as not permitted");
-    gApi.changes().id(project.get() + "~master~" + r.getChangeId()).current().submit(in);
-  }
-
-  @Test
-  public void submitOnBehalfOfFailsWhenUserCannotSeeDestinationRef() throws Exception {
-    blockRead(newGroup);
-
-    allowSubmitOnBehalfOf();
-    PushOneCommit.Result r = createChange();
-    String changeId = project.get() + "~master~" + r.getChangeId();
-    gApi.changes().id(changeId).current().review(ReviewInput.approve());
-    SubmitInput in = new SubmitInput();
-    in.onBehalfOf = user.email;
-    exception.expect(UnprocessableEntityException.class);
-    exception.expectMessage("on_behalf_of account " + user.id + " cannot see change");
-    gApi.changes().id(changeId).current().submit(in);
-  }
-
-  @GerritConfig(name = "accounts.visibility", value = "SAME_GROUP")
-  @Test
-  public void submitOnBehalfOfInvisibleUserNotAllowed() throws Exception {
-    allowSubmitOnBehalfOf();
-    setApiUser(accountCreator.user2());
-    assertThat(accountControlFactory.get().canSee(user.id)).isFalse();
-
-    PushOneCommit.Result r = createChange();
-    String changeId = project.get() + "~master~" + r.getChangeId();
-    gApi.changes().id(changeId).current().review(ReviewInput.approve());
-    SubmitInput in = new SubmitInput();
-    in.onBehalfOf = user.email;
-    exception.expect(UnprocessableEntityException.class);
-    exception.expectMessage("Account Not Found: " + in.onBehalfOf);
-    gApi.changes().id(changeId).current().submit(in);
-  }
-
-  @Test
-  public void runAsValidUser() throws Exception {
-    allowRunAs();
-    RestResponse res = adminRestSession.getWithHeader("/accounts/self", runAsHeader(user.id));
-    res.assertOK();
-    AccountInfo account = newGson().fromJson(res.getEntityContent(), AccountInfo.class);
-    assertThat(account._accountId).isEqualTo(user.id.get());
-  }
-
-  @GerritConfig(name = "auth.enableRunAs", value = "false")
-  @Test
-  public void runAsDisabledByConfig() throws Exception {
-    allowRunAs();
-    RestResponse res = adminRestSession.getWithHeader("/changes/", runAsHeader(user.id));
-    res.assertForbidden();
-    assertThat(res.getEntityContent())
-        .isEqualTo("X-Gerrit-RunAs disabled by auth.enableRunAs = false");
-  }
-
-  @Test
-  public void runAsNotPermitted() throws Exception {
-    RestResponse res = adminRestSession.getWithHeader("/changes/", runAsHeader(user.id));
-    res.assertForbidden();
-    assertThat(res.getEntityContent()).isEqualTo("not permitted to use X-Gerrit-RunAs");
-  }
-
-  @Test
-  public void runAsNeverPermittedForAnonymousUsers() throws Exception {
-    allowRunAs();
-    RestResponse res = anonRestSession.getWithHeader("/changes/", runAsHeader(user.id));
-    res.assertForbidden();
-    assertThat(res.getEntityContent()).isEqualTo("not permitted to use X-Gerrit-RunAs");
-  }
-
-  @Test
-  public void runAsInvalidUser() throws Exception {
-    allowRunAs();
-    RestResponse res = adminRestSession.getWithHeader("/changes/", runAsHeader("doesnotexist"));
-    res.assertForbidden();
-    assertThat(res.getEntityContent()).isEqualTo("no account matches X-Gerrit-RunAs");
-  }
-
-  @Test
-  public void voteUsingRunAsAvoidsRestrictionsOfOnBehalfOf() throws Exception {
-    allowRunAs();
-    PushOneCommit.Result r = createChange();
-
-    setApiUser(user);
-    DraftInput di = new DraftInput();
-    di.path = Patch.COMMIT_MSG;
-    di.side = Side.REVISION;
-    di.line = 1;
-    di.message = "inline comment";
-    gApi.changes().id(r.getChangeId()).current().createDraft(di);
-    setApiUser(admin);
-
-    // Things that aren't allowed with on_behalf_of:
-    //  - no labels.
-    //  - publish other user's drafts.
-    ReviewInput in = new ReviewInput();
-    in.message = "message";
-    in.drafts = DraftHandling.PUBLISH;
-    RestResponse res =
-        adminRestSession.postWithHeader(
-            "/changes/" + r.getChangeId() + "/revisions/current/review", runAsHeader(user.id), in);
-    res.assertOK();
-
-    ChangeMessageInfo m = Iterables.getLast(gApi.changes().id(r.getChangeId()).get().messages);
-    assertThat(m.message).endsWith(in.message);
-    assertThat(m.author._accountId).isEqualTo(user.id.get());
-
-    CommentInfo c =
-        Iterables.getOnlyElement(gApi.changes().id(r.getChangeId()).comments().get(di.path));
-    assertThat(c.author._accountId).isEqualTo(user.id.get());
-    assertThat(c.message).isEqualTo(di.message);
-
-    setApiUser(user);
-    assertThat(gApi.changes().id(r.getChangeId()).drafts()).isEmpty();
-  }
-
-  @Test
-  public void runAsWithOnBehalfOf() throws Exception {
-    // - Has the same restrictions as on_behalf_of (e.g. requires labels).
-    // - Takes the effective user from on_behalf_of (user).
-    // - Takes the real user from the real caller, not the intermediate
-    //   X-Gerrit-RunAs user (user2).
-    allowRunAs();
-    allowCodeReviewOnBehalfOf();
-    TestAccount user2 = accountCreator.user2();
-
-    PushOneCommit.Result r = createChange();
-    ReviewInput in = new ReviewInput();
-    in.onBehalfOf = user.id.toString();
-    in.message = "Message on behalf of";
-
-    String endpoint = "/changes/" + r.getChangeId() + "/revisions/current/review";
-    RestResponse res = adminRestSession.postWithHeader(endpoint, runAsHeader(user2.id), in);
-    res.assertForbidden();
-    assertThat(res.getEntityContent())
-        .isEqualTo("label required to post review on behalf of \"" + in.onBehalfOf + '"');
-
-    in.label("Code-Review", 1);
-    adminRestSession.postWithHeader(endpoint, runAsHeader(user2.id), in).assertOK();
-
-    PatchSetApproval psa = Iterables.getOnlyElement(r.getChange().approvals().values());
-    assertThat(psa.getPatchSetId().get()).isEqualTo(1);
-    assertThat(psa.getLabel()).isEqualTo("Code-Review");
-    assertThat(psa.getAccountId()).isEqualTo(user.id);
-    assertThat(psa.getValue()).isEqualTo(1);
-    assertThat(psa.getRealAccountId()).isEqualTo(admin.id); // not user2
-
-    ChangeData cd = r.getChange();
-    ChangeMessage m = Iterables.getLast(cmUtil.byChange(db, cd.notes()));
-    assertThat(m.getMessage()).endsWith(in.message);
-    assertThat(m.getAuthor()).isEqualTo(user.id);
-    assertThat(m.getRealAuthor()).isEqualTo(admin.id); // not user2
-  }
-
-  @Test
-  public void changeMessageCreatedOnBehalfOfHasRealUser() throws Exception {
-    allowCodeReviewOnBehalfOf();
-
-    PushOneCommit.Result r = createChange();
-    ReviewInput in = new ReviewInput();
-    in.onBehalfOf = user.id.toString();
-    in.message = "Message on behalf of";
-    in.label("Code-Review", 1);
-
-    setApiUser(accountCreator.user2());
-    gApi.changes().id(r.getChangeId()).revision(r.getPatchSetId().getId()).review(in);
-
-    ChangeInfo info = gApi.changes().id(r.getChangeId()).get(MESSAGES);
-    assertThat(info.messages).hasSize(2);
-
-    ChangeMessageInfo changeMessageInfo = Iterables.getLast(info.messages);
-    assertThat(changeMessageInfo.realAuthor).isNotNull();
-    assertThat(changeMessageInfo.realAuthor._accountId).isEqualTo(accountCreator.user2().id.get());
-  }
-
-  private void allowCodeReviewOnBehalfOf() throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    LabelType codeReviewType = Util.codeReview();
-    String forCodeReviewAs = Permission.forLabelAs(codeReviewType.getName());
-    String heads = "refs/heads/*";
-    AccountGroup.UUID uuid = systemGroupBackend.getGroup(REGISTERED_USERS).getUUID();
-    Util.allow(cfg, forCodeReviewAs, -1, 1, uuid, heads);
-    saveProjectConfig(project, cfg);
-  }
-
-  private void allowSubmitOnBehalfOf() throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    String heads = "refs/heads/*";
-    AccountGroup.UUID uuid = systemGroupBackend.getGroup(REGISTERED_USERS).getUUID();
-    Util.allow(cfg, Permission.SUBMIT_AS, uuid, heads);
-    Util.allow(cfg, Permission.SUBMIT, uuid, heads);
-    LabelType codeReviewType = Util.codeReview();
-    Util.allow(cfg, Permission.forLabel(codeReviewType.getName()), -2, 2, uuid, heads);
-    saveProjectConfig(project, cfg);
-  }
-
-  private void blockRead(GroupInfo group) throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    Util.block(cfg, Permission.READ, new AccountGroup.UUID(group.id), "refs/heads/master");
-    saveProjectConfig(project, cfg);
-  }
-
-  private void allowRunAs() throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(allProjects).getConfig();
-    Util.allow(
-        cfg, GlobalCapability.RUN_AS, systemGroupBackend.getGroup(ANONYMOUS_USERS).getUUID());
-    saveProjectConfig(allProjects, cfg);
-  }
-
-  private void removeRunAs() throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(allProjects).getConfig();
-    Util.remove(
-        cfg, GlobalCapability.RUN_AS, systemGroupBackend.getGroup(ANONYMOUS_USERS).getUUID());
-    saveProjectConfig(allProjects, cfg);
-  }
-
-  private static Header runAsHeader(Object user) {
-    return new BasicHeader("X-Gerrit-RunAs", user.toString());
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/PutUsernameIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/PutUsernameIT.java
deleted file mode 100644
index 7de9d70..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/PutUsernameIT.java
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.acceptance.rest.account;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.RestResponse;
-import com.google.gerrit.server.account.PutUsername;
-import org.junit.Test;
-
-public class PutUsernameIT extends AbstractDaemonTest {
-  @Test
-  public void set() throws Exception {
-    PutUsername.Input in = new PutUsername.Input();
-    in.username = "myUsername";
-    RestResponse r =
-        adminRestSession.put("/accounts/" + accountCreator.create().id.get() + "/username", in);
-    r.assertOK();
-    assertThat(newGson().fromJson(r.getReader(), String.class)).isEqualTo(in.username);
-  }
-
-  @Test
-  public void setExisting_Conflict() throws Exception {
-    PutUsername.Input in = new PutUsername.Input();
-    in.username = admin.username;
-    adminRestSession
-        .put("/accounts/" + accountCreator.create().id.get() + "/username", in)
-        .assertConflict();
-  }
-
-  @Test
-  public void setNew_MethodNotAllowed() throws Exception {
-    PutUsername.Input in = new PutUsername.Input();
-    in.username = "newUsername";
-    adminRestSession.put("/accounts/" + admin.username + "/username", in).assertMethodNotAllowed();
-  }
-
-  @Test
-  public void delete_MethodNotAllowed() throws Exception {
-    adminRestSession.put("/accounts/" + admin.username + "/username").assertMethodNotAllowed();
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/WatchedProjectsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/WatchedProjectsIT.java
deleted file mode 100644
index 9edafb8..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/WatchedProjectsIT.java
+++ /dev/null
@@ -1,238 +0,0 @@
-// 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.
-
-package com.google.gerrit.acceptance.rest.account;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.common.collect.Lists;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.extensions.client.ProjectWatchInfo;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import java.util.ArrayList;
-import java.util.List;
-import org.junit.Test;
-
-public class WatchedProjectsIT extends AbstractDaemonTest {
-
-  private static final String NEW_PROJECT_NAME = "newProjectAccess";
-
-  @Test
-  public void setAndGetWatchedProjects() throws Exception {
-    String projectName1 = createProject(NEW_PROJECT_NAME).get();
-    String projectName2 = createProject(NEW_PROJECT_NAME + "2").get();
-
-    List<ProjectWatchInfo> projectsToWatch = new ArrayList<>(2);
-
-    ProjectWatchInfo pwi = new ProjectWatchInfo();
-    pwi.project = projectName1;
-    pwi.notifyAbandonedChanges = true;
-    pwi.notifyNewChanges = true;
-    pwi.notifyAllComments = true;
-    projectsToWatch.add(pwi);
-
-    pwi = new ProjectWatchInfo();
-    pwi.project = projectName2;
-    pwi.filter = "branch:master";
-    pwi.notifySubmittedChanges = true;
-    pwi.notifyNewPatchSets = true;
-    projectsToWatch.add(pwi);
-
-    List<ProjectWatchInfo> persistedWatchedProjects =
-        gApi.accounts().self().setWatchedProjects(projectsToWatch);
-    assertThat(persistedWatchedProjects).containsAllIn(projectsToWatch).inOrder();
-  }
-
-  @Test
-  public void setAndDeleteWatchedProjects() throws Exception {
-    String projectName1 = createProject(NEW_PROJECT_NAME).get();
-    String projectName2 = createProject(NEW_PROJECT_NAME + "2").get();
-
-    List<ProjectWatchInfo> projectsToWatch = new ArrayList<>();
-
-    ProjectWatchInfo pwi = new ProjectWatchInfo();
-    pwi.project = projectName1;
-    pwi.notifyAbandonedChanges = true;
-    pwi.notifyNewChanges = true;
-    pwi.notifyAllComments = true;
-    projectsToWatch.add(pwi);
-
-    pwi = new ProjectWatchInfo();
-    pwi.project = projectName2;
-    pwi.filter = "branch:master";
-    pwi.notifySubmittedChanges = true;
-    pwi.notifyNewPatchSets = true;
-    projectsToWatch.add(pwi);
-
-    // Persist watched projects
-    gApi.accounts().self().setWatchedProjects(projectsToWatch);
-
-    List<ProjectWatchInfo> d = Lists.newArrayList(pwi);
-    gApi.accounts().self().deleteWatchedProjects(d);
-    projectsToWatch.remove(pwi);
-
-    List<ProjectWatchInfo> persistedWatchedProjects = gApi.accounts().self().getWatchedProjects();
-
-    assertThat(persistedWatchedProjects).doesNotContain(pwi);
-    assertThat(persistedWatchedProjects).containsAllIn(projectsToWatch);
-  }
-
-  @Test
-  public void setConflictingWatches() throws Exception {
-    String projectName = createProject(NEW_PROJECT_NAME).get();
-
-    List<ProjectWatchInfo> projectsToWatch = new ArrayList<>();
-
-    ProjectWatchInfo pwi = new ProjectWatchInfo();
-    pwi.project = projectName;
-    pwi.notifyAbandonedChanges = true;
-    pwi.notifyNewChanges = true;
-    pwi.notifyAllComments = true;
-    projectsToWatch.add(pwi);
-
-    pwi = new ProjectWatchInfo();
-    pwi.project = projectName;
-    pwi.notifySubmittedChanges = true;
-    pwi.notifyNewPatchSets = true;
-    projectsToWatch.add(pwi);
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("duplicate entry for project " + projectName);
-    gApi.accounts().self().setWatchedProjects(projectsToWatch);
-  }
-
-  @Test
-  public void setAndGetEmptyWatch() throws Exception {
-    String projectName = createProject(NEW_PROJECT_NAME).get();
-
-    List<ProjectWatchInfo> projectsToWatch = new ArrayList<>();
-
-    ProjectWatchInfo pwi = new ProjectWatchInfo();
-    pwi.project = projectName;
-    projectsToWatch.add(pwi);
-
-    gApi.accounts().self().setWatchedProjects(projectsToWatch);
-    List<ProjectWatchInfo> persistedWatchedProjects = gApi.accounts().self().getWatchedProjects();
-    assertThat(persistedWatchedProjects).containsAllIn(projectsToWatch);
-  }
-
-  @Test
-  public void watchNonExistingProject() throws Exception {
-    String projectName = NEW_PROJECT_NAME + "3";
-
-    List<ProjectWatchInfo> projectsToWatch = new ArrayList<>(2);
-
-    ProjectWatchInfo pwi = new ProjectWatchInfo();
-    pwi.project = projectName;
-    pwi.notifyAbandonedChanges = true;
-    pwi.notifyNewChanges = true;
-    pwi.notifyAllComments = true;
-    projectsToWatch.add(pwi);
-
-    exception.expect(UnprocessableEntityException.class);
-    gApi.accounts().self().setWatchedProjects(projectsToWatch);
-  }
-
-  @Test
-  public void deleteNonExistingProjectWatch() throws Exception {
-    String projectName = project.get();
-
-    // Let another user watch a project
-    setApiUser(admin);
-    List<ProjectWatchInfo> projectsToWatch = new ArrayList<>();
-
-    ProjectWatchInfo pwi = new ProjectWatchInfo();
-    pwi.project = projectName;
-    pwi.notifyAbandonedChanges = true;
-    pwi.notifyNewChanges = true;
-    pwi.notifyAllComments = true;
-    projectsToWatch.add(pwi);
-
-    gApi.accounts().self().setWatchedProjects(projectsToWatch);
-
-    // Try to delete a watched project using a different user
-    List<ProjectWatchInfo> d = Lists.newArrayList(pwi);
-    gApi.accounts().self().deleteWatchedProjects(d);
-
-    // Check that trying to delete a non-existing watch doesn't fail
-    setApiUser(user);
-    gApi.accounts().self().deleteWatchedProjects(d);
-  }
-
-  @Test
-  public void modifyProjectWatchUsingOmittedValues() throws Exception {
-    String projectName = project.get();
-
-    // Let another user watch a project
-    setApiUser(admin);
-    List<ProjectWatchInfo> projectsToWatch = new ArrayList<>();
-
-    ProjectWatchInfo pwi = new ProjectWatchInfo();
-    pwi.project = projectName;
-    pwi.notifyAbandonedChanges = true;
-    pwi.notifyNewChanges = true;
-    pwi.notifyAllComments = true;
-    projectsToWatch.add(pwi);
-
-    // Persist a defined state
-    gApi.accounts().self().setWatchedProjects(projectsToWatch);
-
-    // Omit previously set value - will set it to false on the server
-    // The response will not carry this field then as we omit sending
-    // false values in JSON
-    pwi.notifyNewChanges = null;
-
-    // Perform update
-    gApi.accounts().self().setWatchedProjects(projectsToWatch);
-
-    List<ProjectWatchInfo> watchedProjects = gApi.accounts().self().getWatchedProjects();
-
-    assertThat(watchedProjects).containsAllIn(projectsToWatch);
-  }
-
-  @Test
-  public void setAndDeleteWatchedProjectsWithDifferentFilter() throws Exception {
-    String projectName = project.get();
-
-    List<ProjectWatchInfo> projectsToWatch = new ArrayList<>();
-
-    ProjectWatchInfo pwi = new ProjectWatchInfo();
-    pwi.project = projectName;
-    pwi.filter = "branch:stable";
-    pwi.notifyAbandonedChanges = true;
-    pwi.notifyNewChanges = true;
-    pwi.notifyAllComments = true;
-    projectsToWatch.add(pwi);
-
-    pwi = new ProjectWatchInfo();
-    pwi.project = projectName;
-    pwi.filter = "branch:master";
-    pwi.notifySubmittedChanges = true;
-    pwi.notifyNewPatchSets = true;
-    projectsToWatch.add(pwi);
-
-    // Persist watched projects
-    gApi.accounts().self().setWatchedProjects(projectsToWatch);
-
-    List<ProjectWatchInfo> d = Lists.newArrayList(pwi);
-    gApi.accounts().self().deleteWatchedProjects(d);
-    projectsToWatch.remove(pwi);
-
-    List<ProjectWatchInfo> persistedWatchedProjects = gApi.accounts().self().getWatchedProjects();
-
-    assertThat(persistedWatchedProjects).doesNotContain(pwi);
-    assertThat(persistedWatchedProjects).containsAllIn(projectsToWatch);
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java
deleted file mode 100644
index 682b5bc..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java
+++ /dev/null
@@ -1,1231 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.acceptance.rest.change;
-
-import static com.google.common.collect.Iterables.getOnlyElement;
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth8.assertThat;
-import static com.google.common.truth.TruthJUnit.assume;
-import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_REVISION;
-import static com.google.gerrit.extensions.client.ListChangesOption.DETAILED_LABELS;
-import static com.google.gerrit.extensions.client.ListChangesOption.SUBMITTABLE;
-import static com.google.gerrit.server.group.SystemGroupBackend.CHANGE_OWNER;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-import static java.util.concurrent.TimeUnit.SECONDS;
-import static java.util.stream.Collectors.toList;
-import static org.junit.Assert.fail;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.GitUtil;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.acceptance.TestAccount;
-import com.google.gerrit.acceptance.TestProjectInput;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.changes.SubmitInput;
-import com.google.gerrit.extensions.api.projects.BranchInput;
-import com.google.gerrit.extensions.api.projects.ConfigInput;
-import com.google.gerrit.extensions.api.projects.ProjectInput;
-import com.google.gerrit.extensions.client.ChangeStatus;
-import com.google.gerrit.extensions.client.InheritableBoolean;
-import com.google.gerrit.extensions.client.ListChangesOption;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.LabelInfo;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.registration.RegistrationHandle;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BinaryResult;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.webui.UiAction;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.change.RevisionResource;
-import com.google.gerrit.server.change.Submit;
-import com.google.gerrit.server.change.Submit.TestSubmitInput;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.git.validators.OnSubmitValidationListener;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.project.Util;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.validators.ValidationException;
-import com.google.gerrit.testutil.ConfigSuite;
-import com.google.gerrit.testutil.TestTimeUtil;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.ArrayDeque;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicBoolean;
-import org.eclipse.jgit.diff.DiffFormatter;
-import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.ReceiveCommand;
-import org.eclipse.jgit.transport.RefSpec;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-@NoHttpd
-public abstract class AbstractSubmit extends AbstractDaemonTest {
-  @ConfigSuite.Config
-  public static Config submitWholeTopicEnabled() {
-    return submitWholeTopicEnabledConfig();
-  }
-
-  @Inject private ApprovalsUtil approvalsUtil;
-
-  @Inject private Submit submitHandler;
-
-  @Inject private IdentifiedUser.GenericFactory userFactory;
-
-  @Inject private DynamicSet<OnSubmitValidationListener> onSubmitValidationListeners;
-  private RegistrationHandle onSubmitValidatorHandle;
-
-  private String systemTimeZone;
-
-  @Before
-  public void setTimeForTesting() {
-    systemTimeZone = System.setProperty("user.timezone", "US/Eastern");
-    TestTimeUtil.resetWithClockStep(1, SECONDS);
-  }
-
-  @After
-  public void resetTime() {
-    TestTimeUtil.useSystemTime();
-    System.setProperty("user.timezone", systemTimeZone);
-  }
-
-  @After
-  public void cleanup() {
-    db.close();
-  }
-
-  @After
-  public void removeOnSubmitValidator() {
-    if (onSubmitValidatorHandle != null) {
-      onSubmitValidatorHandle.remove();
-    }
-  }
-
-  protected abstract SubmitType getSubmitType();
-
-  @Test
-  @TestProjectInput(createEmptyCommit = false)
-  public void submitToEmptyRepo() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-    PushOneCommit.Result change = createChange();
-    Map<Branch.NameKey, ObjectId> actual = fetchFromSubmitPreview(change.getChangeId());
-    RevCommit headAfterSubmitPreview = getRemoteHead();
-    assertThat(headAfterSubmitPreview).isEqualTo(initialHead);
-    assertThat(actual).hasSize(1);
-
-    submit(change.getChangeId());
-    assertThat(getRemoteHead().getId()).isEqualTo(change.getCommit());
-    assertTrees(project, actual);
-  }
-
-  @Test
-  public void submitSingleChange() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-    PushOneCommit.Result change = createChange();
-    Map<Branch.NameKey, ObjectId> actual = fetchFromSubmitPreview(change.getChangeId());
-    RevCommit headAfterSubmit = getRemoteHead();
-    assertThat(headAfterSubmit).isEqualTo(initialHead);
-    assertRefUpdatedEvents();
-    assertChangeMergedEvents();
-
-    if ((getSubmitType() == SubmitType.CHERRY_PICK)
-        || (getSubmitType() == SubmitType.REBASE_ALWAYS)) {
-      // The change is updated as well:
-      assertThat(actual).hasSize(2);
-    } else {
-      assertThat(actual).hasSize(1);
-    }
-
-    submit(change.getChangeId());
-    assertTrees(project, actual);
-  }
-
-  @Test
-  public void submitMultipleChangesOtherMergeConflictPreview() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-
-    PushOneCommit.Result change = createChange("Change 1", "a.txt", "content");
-    submit(change.getChangeId());
-
-    RevCommit headAfterFirstSubmit = getRemoteHead();
-    testRepo.reset(initialHead);
-    PushOneCommit.Result change2 = createChange("Change 2", "a.txt", "other content");
-    PushOneCommit.Result change3 = createChange("Change 3", "d", "d");
-    PushOneCommit.Result change4 = createChange("Change 4", "e", "e");
-    // change 2 is not approved, but we ignore labels
-    approve(change3.getChangeId());
-
-    try (BinaryResult request = submitPreview(change4.getChangeId())) {
-      assertThat(getSubmitType()).isEqualTo(SubmitType.CHERRY_PICK);
-      submit(change4.getChangeId());
-    } catch (RestApiException e) {
-      switch (getSubmitType()) {
-        case FAST_FORWARD_ONLY:
-          assertThat(e.getMessage())
-              .isEqualTo(
-                  "Failed to submit 3 changes due to the following problems:\n"
-                      + "Change "
-                      + change2.getChange().getId()
-                      + ": internal error: "
-                      + "change not processed by merge strategy\n"
-                      + "Change "
-                      + change3.getChange().getId()
-                      + ": internal error: "
-                      + "change not processed by merge strategy\n"
-                      + "Change "
-                      + change4.getChange().getId()
-                      + ": Project policy "
-                      + "requires all submissions to be a fast-forward. Please "
-                      + "rebase the change locally and upload again for review.");
-          break;
-        case REBASE_IF_NECESSARY:
-        case REBASE_ALWAYS:
-          String change2hash = change2.getChange().currentPatchSet().getRevision().get();
-          assertThat(e.getMessage())
-              .isEqualTo(
-                  "Cannot rebase "
-                      + change2hash
-                      + ": The change could "
-                      + "not be rebased due to a conflict during merge.");
-          break;
-        case MERGE_ALWAYS:
-        case MERGE_IF_NECESSARY:
-          assertThat(e.getMessage())
-              .isEqualTo(
-                  "Failed to submit 3 changes due to the following problems:\n"
-                      + "Change "
-                      + change2.getChange().getId()
-                      + ": Change could not be "
-                      + "merged due to a path conflict. Please rebase the change "
-                      + "locally and upload the rebased commit for review.\n"
-                      + "Change "
-                      + change3.getChange().getId()
-                      + ": Change could not be "
-                      + "merged due to a path conflict. Please rebase the change "
-                      + "locally and upload the rebased commit for review.\n"
-                      + "Change "
-                      + change4.getChange().getId()
-                      + ": Change could not be "
-                      + "merged due to a path conflict. Please rebase the change "
-                      + "locally and upload the rebased commit for review.");
-          break;
-        case CHERRY_PICK:
-        default:
-          fail("Should not reach here.");
-          break;
-      }
-
-      RevCommit headAfterSubmit = getRemoteHead();
-      assertThat(headAfterSubmit).isEqualTo(headAfterFirstSubmit);
-      assertRefUpdatedEvents(initialHead, headAfterFirstSubmit);
-      assertChangeMergedEvents(change.getChangeId(), headAfterFirstSubmit.name());
-    }
-  }
-
-  @Test
-  public void submitMultipleChangesPreview() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-    PushOneCommit.Result change2 = createChange("Change 2", "a.txt", "other content");
-    PushOneCommit.Result change3 = createChange("Change 3", "d", "d");
-    PushOneCommit.Result change4 = createChange("Change 4", "e", "e");
-    // change 2 is not approved, but we ignore labels
-    approve(change3.getChangeId());
-    Map<Branch.NameKey, ObjectId> actual = fetchFromSubmitPreview(change4.getChangeId());
-    Map<String, Map<String, Integer>> expected = new HashMap<>();
-    expected.put(project.get(), new HashMap<>());
-    expected.get(project.get()).put("refs/heads/master", 3);
-
-    assertThat(actual).containsKey(new Branch.NameKey(project, "refs/heads/master"));
-    if (getSubmitType() == SubmitType.CHERRY_PICK) {
-      // CherryPick ignores dependencies, thus only change and destination
-      // branch refs are modified.
-      assertThat(actual).hasSize(2);
-    } else if (getSubmitType() == SubmitType.REBASE_ALWAYS) {
-      // RebaseAlways takes care of dependencies, therefore Change{2,3,4} and
-      // destination branch will be modified.
-      assertThat(actual).hasSize(4);
-    } else {
-      assertThat(actual).hasSize(1);
-    }
-
-    // check that the submit preview did not actually submit
-    RevCommit headAfterSubmit = getRemoteHead();
-    assertThat(headAfterSubmit).isEqualTo(initialHead);
-    assertRefUpdatedEvents();
-    assertChangeMergedEvents();
-
-    // now check we actually have the same content:
-    approve(change2.getChangeId());
-    submit(change4.getChangeId());
-    assertTrees(project, actual);
-  }
-
-  @Test
-  public void submitNoPermission() throws Exception {
-    // create project where submit is blocked
-    Project.NameKey p = createProject("p");
-    block(p, "refs/*", Permission.SUBMIT, REGISTERED_USERS);
-
-    TestRepository<InMemoryRepository> repo = cloneProject(p, admin);
-    PushOneCommit push = pushFactory.create(db, admin.getIdent(), repo);
-    PushOneCommit.Result result = push.to("refs/for/master");
-    result.assertOkStatus();
-
-    submit(result.getChangeId(), new SubmitInput(), AuthException.class, "submit not permitted");
-  }
-
-  @Test
-  public void noSelfSubmit() throws Exception {
-    // create project where submit is blocked for the change owner
-    Project.NameKey p = createProject("p");
-    ProjectConfig cfg = projectCache.checkedGet(p).getConfig();
-    Util.block(cfg, Permission.SUBMIT, CHANGE_OWNER, "refs/*");
-    Util.allow(cfg, Permission.SUBMIT, REGISTERED_USERS, "refs/heads/*");
-    Util.allow(cfg, Permission.forLabel("Code-Review"), -2, +2, REGISTERED_USERS, "refs/*");
-    saveProjectConfig(p, cfg);
-
-    TestRepository<InMemoryRepository> repo = cloneProject(p, admin);
-    PushOneCommit push = pushFactory.create(db, admin.getIdent(), repo);
-    PushOneCommit.Result result = push.to("refs/for/master");
-    result.assertOkStatus();
-
-    ChangeInfo change = gApi.changes().id(result.getChangeId()).get();
-    assertThat(change.owner._accountId).isEqualTo(admin.id.get());
-
-    submit(result.getChangeId(), new SubmitInput(), AuthException.class, "submit not permitted");
-
-    setApiUser(user);
-    submit(result.getChangeId());
-  }
-
-  @Test
-  public void onlySelfSubmit() throws Exception {
-    // create project where only the change owner can submit
-    Project.NameKey p = createProject("p");
-    ProjectConfig cfg = projectCache.checkedGet(p).getConfig();
-    Util.block(cfg, Permission.SUBMIT, REGISTERED_USERS, "refs/*");
-    Util.allow(cfg, Permission.SUBMIT, CHANGE_OWNER, "refs/*");
-    Util.allow(cfg, Permission.forLabel("Code-Review"), -2, +2, REGISTERED_USERS, "refs/*");
-    saveProjectConfig(p, cfg);
-
-    TestRepository<InMemoryRepository> repo = cloneProject(p, admin);
-    PushOneCommit push = pushFactory.create(db, admin.getIdent(), repo);
-    PushOneCommit.Result result = push.to("refs/for/master");
-    result.assertOkStatus();
-
-    ChangeInfo change = gApi.changes().id(result.getChangeId()).get();
-    assertThat(change.owner._accountId).isEqualTo(admin.id.get());
-
-    setApiUser(user);
-    submit(result.getChangeId(), new SubmitInput(), AuthException.class, "submit not permitted");
-
-    setApiUser(admin);
-    submit(result.getChangeId());
-  }
-
-  @Test
-  public void submitWholeTopicMultipleProjects() throws Exception {
-    assume().that(isSubmitWholeTopicEnabled()).isTrue();
-    String topic = "test-topic";
-
-    // Create test projects
-    TestRepository<?> repoA = createProjectWithPush("project-a", null, getSubmitType());
-    TestRepository<?> repoB = createProjectWithPush("project-b", null, getSubmitType());
-
-    // Create changes on project-a
-    PushOneCommit.Result change1 =
-        createChange(repoA, "master", "Change 1", "a.txt", "content", topic);
-    PushOneCommit.Result change2 =
-        createChange(repoA, "master", "Change 2", "b.txt", "content", topic);
-
-    // Create changes on project-b
-    PushOneCommit.Result change3 =
-        createChange(repoB, "master", "Change 3", "a.txt", "content", topic);
-    PushOneCommit.Result change4 =
-        createChange(repoB, "master", "Change 4", "b.txt", "content", topic);
-
-    approve(change1.getChangeId());
-    approve(change2.getChangeId());
-    approve(change3.getChangeId());
-    approve(change4.getChangeId());
-    submit(change4.getChangeId());
-
-    String expectedTopic = name(topic);
-    change1.assertChange(Change.Status.MERGED, expectedTopic, admin);
-    change2.assertChange(Change.Status.MERGED, expectedTopic, admin);
-    change3.assertChange(Change.Status.MERGED, expectedTopic, admin);
-    change4.assertChange(Change.Status.MERGED, expectedTopic, admin);
-  }
-
-  @Test
-  public void submitWholeTopicMultipleBranchesOnSameProject() throws Exception {
-    assume().that(isSubmitWholeTopicEnabled()).isTrue();
-    String topic = "test-topic";
-
-    // Create test project
-    String projectName = "project-a";
-    TestRepository<?> repoA = createProjectWithPush(projectName, null, getSubmitType());
-
-    RevCommit initialHead = getRemoteHead(new Project.NameKey(name(projectName)), "master");
-
-    // Create the dev branch on the test project
-    BranchInput in = new BranchInput();
-    in.revision = initialHead.name();
-    gApi.projects().name(name(projectName)).branch("dev").create(in);
-
-    // Create changes on master
-    PushOneCommit.Result change1 =
-        createChange(repoA, "master", "Change 1", "a.txt", "content", topic);
-    PushOneCommit.Result change2 =
-        createChange(repoA, "master", "Change 2", "b.txt", "content", topic);
-
-    // Create  changes on dev
-    repoA.reset(initialHead);
-    PushOneCommit.Result change3 =
-        createChange(repoA, "dev", "Change 3", "a.txt", "content", topic);
-    PushOneCommit.Result change4 =
-        createChange(repoA, "dev", "Change 4", "b.txt", "content", topic);
-
-    approve(change1.getChangeId());
-    approve(change2.getChangeId());
-    approve(change3.getChangeId());
-    approve(change4.getChangeId());
-    submit(change4.getChangeId());
-
-    String expectedTopic = name(topic);
-    change1.assertChange(Change.Status.MERGED, expectedTopic, admin);
-    change2.assertChange(Change.Status.MERGED, expectedTopic, admin);
-    change3.assertChange(Change.Status.MERGED, expectedTopic, admin);
-    change4.assertChange(Change.Status.MERGED, expectedTopic, admin);
-  }
-
-  @Test
-  public void submitWholeTopic() throws Exception {
-    assume().that(isSubmitWholeTopicEnabled()).isTrue();
-    String topic = "test-topic";
-    PushOneCommit.Result change1 = createChange("Change 1", "a.txt", "content", topic);
-    PushOneCommit.Result change2 = createChange("Change 2", "b.txt", "content", topic);
-    PushOneCommit.Result change3 = createChange("Change 3", "c.txt", "content", topic);
-    approve(change1.getChangeId());
-    approve(change2.getChangeId());
-    approve(change3.getChangeId());
-    submit(change3.getChangeId());
-    String expectedTopic = name(topic);
-    change1.assertChange(Change.Status.MERGED, expectedTopic, admin);
-    change2.assertChange(Change.Status.MERGED, expectedTopic, admin);
-    change3.assertChange(Change.Status.MERGED, expectedTopic, admin);
-
-    // Check for the exact change to have the correct submitter.
-    assertSubmitter(change3);
-    // Also check submitters for changes submitted via the topic relationship.
-    assertSubmitter(change1);
-    assertSubmitter(change2);
-
-    // Check that the repo has the expected commits
-    List<RevCommit> log = getRemoteLog();
-    List<String> commitsInRepo = log.stream().map(c -> c.getShortMessage()).collect(toList());
-    int expectedCommitCount =
-        getSubmitType() == SubmitType.MERGE_ALWAYS
-            ? 5 // initial commit + 3 commits + merge commit
-            : 4; // initial commit + 3 commits
-    assertThat(log).hasSize(expectedCommitCount);
-
-    assertThat(commitsInRepo)
-        .containsAllOf("Initial empty repository", "Change 1", "Change 2", "Change 3");
-    if (getSubmitType() == SubmitType.MERGE_ALWAYS) {
-      assertThat(commitsInRepo).contains("Merge changes from topic \"" + expectedTopic + "\"");
-    }
-  }
-
-  @Test
-  public void submitReusingOldTopic() throws Exception {
-    assume().that(isSubmitWholeTopicEnabled()).isTrue();
-
-    String topic = "test-topic";
-    PushOneCommit.Result change1 = createChange("Change 1", "a.txt", "content", topic);
-    PushOneCommit.Result change2 = createChange("Change 2", "a.txt", "content", topic);
-    String id1 = change1.getChangeId();
-    String id2 = change2.getChangeId();
-    approve(id1);
-    approve(id2);
-    assertSubmittedTogether(id1, ImmutableList.of(id1, id2));
-    assertSubmittedTogether(id2, ImmutableList.of(id1, id2));
-    submit(id2);
-
-    String expectedTopic = name(topic);
-    change1.assertChange(Change.Status.MERGED, expectedTopic, admin);
-    change2.assertChange(Change.Status.MERGED, expectedTopic, admin);
-    assertSubmittedTogether(id1, ImmutableList.of(id1, id2));
-    assertSubmittedTogether(id2, ImmutableList.of(id1, id2));
-
-    PushOneCommit.Result change3 = createChange("Change 3", "c.txt", "content", topic);
-    String id3 = change3.getChangeId();
-    approve(id3);
-    assertSubmittedTogether(id3, ImmutableList.of());
-    submit(id3);
-
-    change3.assertChange(Change.Status.MERGED, expectedTopic, admin);
-    assertSubmittedTogether(id3, ImmutableList.of());
-  }
-
-  private void assertSubmittedTogether(String changeId, Iterable<String> expected)
-      throws Exception {
-    assertThat(gApi.changes().id(changeId).submittedTogether().stream().map(i -> i.changeId))
-        .containsExactlyElementsIn(expected);
-  }
-
-  @Test
-  public void submitWorkInProgressChange() throws Exception {
-    PushOneCommit.Result change = createWorkInProgressChange();
-    Change.Id num = change.getChange().getId();
-    submitWithConflict(
-        change.getChangeId(),
-        "Failed to submit 1 change due to the following problems:\n"
-            + "Change "
-            + num
-            + ": Change "
-            + num
-            + " is work in progress");
-  }
-
-  @Test
-  public void submitWithHiddenBranchInSameTopic() throws Exception {
-    assume().that(isSubmitWholeTopicEnabled()).isTrue();
-    PushOneCommit.Result visible = createChange("refs/for/master/" + name("topic"));
-    Change.Id num = visible.getChange().getId();
-
-    createBranch(new Branch.NameKey(project, "hidden"));
-    PushOneCommit.Result hidden = createChange("refs/for/hidden/" + name("topic"));
-    approve(hidden.getChangeId());
-    blockRead("refs/heads/hidden");
-
-    submit(
-        visible.getChangeId(),
-        new SubmitInput(),
-        AuthException.class,
-        "A change to be submitted with " + num + " is not visible");
-  }
-
-  @Test
-  public void submitChangeWhenParentOfOtherBranchTip() throws Exception {
-    // Chain of two commits
-    // Push both to topic-branch
-    // Push the first commit for review and submit
-    //
-    // C2 -- tip of topic branch
-    //  |
-    // C1 -- pushed for review
-    //  |
-    // C0 -- Master
-    //
-    ProjectConfig config = projectCache.checkedGet(project).getConfig();
-    config.getProject().setCreateNewChangeForAllNotInTarget(InheritableBoolean.TRUE);
-    saveProjectConfig(project, config);
-
-    PushOneCommit push1 =
-        pushFactory.create(
-            db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "a.txt", "content");
-    PushOneCommit.Result c1 = push1.to("refs/heads/topic");
-    c1.assertOkStatus();
-    PushOneCommit push2 =
-        pushFactory.create(
-            db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "b.txt", "anotherContent");
-    PushOneCommit.Result c2 = push2.to("refs/heads/topic");
-    c2.assertOkStatus();
-
-    PushOneCommit.Result change1 = push1.to("refs/for/master");
-    change1.assertOkStatus();
-
-    approve(change1.getChangeId());
-    submit(change1.getChangeId());
-  }
-
-  @Test
-  public void submitMergeOfNonChangeBranchTip() throws Exception {
-    // Merge a branch with commits that have not been submitted as
-    // changes.
-    //
-    // M  -- mergeCommit (pushed for review and submitted)
-    // | \
-    // |  S -- stable (pushed directly to refs/heads/stable)
-    // | /
-    // I   -- master
-    //
-    RevCommit master = getRemoteHead(project, "master");
-    PushOneCommit stableTip =
-        pushFactory.create(
-            db, admin.getIdent(), testRepo, "Tip of branch stable", "stable.txt", "");
-    PushOneCommit.Result stable = stableTip.to("refs/heads/stable");
-    PushOneCommit mergeCommit =
-        pushFactory.create(db, admin.getIdent(), testRepo, "The merge commit", "merge.txt", "");
-    mergeCommit.setParents(ImmutableList.of(master, stable.getCommit()));
-    PushOneCommit.Result mergeReview = mergeCommit.to("refs/for/master");
-    approve(mergeReview.getChangeId());
-    submit(mergeReview.getChangeId());
-
-    List<RevCommit> log = getRemoteLog();
-    assertThat(log).contains(stable.getCommit());
-    assertThat(log).contains(mergeReview.getCommit());
-  }
-
-  @Test
-  public void submitMergeOfNonChangeBranchNonTip() throws Exception {
-    // Merge a branch with commits that have not been submitted as
-    // changes.
-    //
-    // MC  -- merge commit (pushed for review and submitted)
-    // |\   S2 -- new stable tip (pushed directly to refs/heads/stable)
-    // M \ /
-    // |  S1 -- stable (pushed directly to refs/heads/stable)
-    // | /
-    // I -- master
-    //
-    RevCommit initial = getRemoteHead(project, "master");
-    // push directly to stable to S1
-    PushOneCommit.Result s1 =
-        pushFactory
-            .create(db, admin.getIdent(), testRepo, "new commit into stable", "stable1.txt", "")
-            .to("refs/heads/stable");
-    // move the stable tip ahead to S2
-    pushFactory
-        .create(db, admin.getIdent(), testRepo, "Tip of branch stable", "stable2.txt", "")
-        .to("refs/heads/stable");
-
-    testRepo.reset(initial);
-
-    // move the master ahead
-    PushOneCommit.Result m =
-        pushFactory
-            .create(db, admin.getIdent(), testRepo, "Move master ahead", "master.txt", "")
-            .to("refs/heads/master");
-
-    // create merge change
-    PushOneCommit mc =
-        pushFactory.create(db, admin.getIdent(), testRepo, "The merge commit", "merge.txt", "");
-    mc.setParents(ImmutableList.of(m.getCommit(), s1.getCommit()));
-    PushOneCommit.Result mergeReview = mc.to("refs/for/master");
-    approve(mergeReview.getChangeId());
-    submit(mergeReview.getChangeId());
-
-    List<RevCommit> log = getRemoteLog();
-    assertThat(log).contains(s1.getCommit());
-    assertThat(log).contains(mergeReview.getCommit());
-  }
-
-  @Test
-  public void submitChangeWithCommitThatWasAlreadyMerged() throws Exception {
-    // create and submit a change
-    PushOneCommit.Result change = createChange();
-    submit(change.getChangeId());
-    RevCommit headAfterSubmit = getRemoteHead();
-
-    // set the status of the change back to NEW to simulate a failed submit that
-    // merged the commit but failed to update the change status
-    setChangeStatusToNew(change);
-
-    // submitting the change again should detect that the commit was already
-    // merged and just fix the change status to be MERGED
-    submit(change.getChangeId());
-    assertThat(getRemoteHead()).isEqualTo(headAfterSubmit);
-  }
-
-  @Test
-  public void submitChangesWithCommitsThatWereAlreadyMerged() throws Exception {
-    // create and submit 2 changes
-    PushOneCommit.Result change1 = createChange();
-    PushOneCommit.Result change2 = createChange();
-    approve(change1.getChangeId());
-    if (getSubmitType() == SubmitType.CHERRY_PICK) {
-      submit(change1.getChangeId());
-    }
-    submit(change2.getChangeId());
-    assertMerged(change1.getChangeId());
-    RevCommit headAfterSubmit = getRemoteHead();
-
-    // set the status of the changes back to NEW to simulate a failed submit that
-    // merged the commits but failed to update the change status
-    setChangeStatusToNew(change1, change2);
-
-    // submitting the changes again should detect that the commits were already
-    // merged and just fix the change status to be MERGED
-    submit(change1.getChangeId());
-    submit(change2.getChangeId());
-    assertThat(getRemoteHead()).isEqualTo(headAfterSubmit);
-  }
-
-  @Test
-  public void submitTopicWithCommitsThatWereAlreadyMerged() throws Exception {
-    assume().that(isSubmitWholeTopicEnabled()).isTrue();
-
-    // create and submit 2 changes with the same topic
-    String topic = name("topic");
-    PushOneCommit.Result change1 = createChange("refs/for/master/" + topic);
-    PushOneCommit.Result change2 = createChange("refs/for/master/" + topic);
-    approve(change1.getChangeId());
-    submit(change2.getChangeId());
-    assertMerged(change1.getChangeId());
-    RevCommit headAfterSubmit = getRemoteHead();
-
-    // set the status of the second change back to NEW to simulate a failed
-    // submit that merged the commits but failed to update the change status of
-    // some changes in the topic
-    setChangeStatusToNew(change2);
-
-    // submitting the topic again should detect that the commits were already
-    // merged and just fix the change status to be MERGED
-    submit(change2.getChangeId());
-    assertThat(getRemoteHead()).isEqualTo(headAfterSubmit);
-  }
-
-  @Test
-  public void submitWithValidation() throws Exception {
-    AtomicBoolean called = new AtomicBoolean(false);
-    this.addOnSubmitValidationListener(
-        new OnSubmitValidationListener() {
-          @Override
-          public void preBranchUpdate(Arguments args) throws ValidationException {
-            called.set(true);
-            HashSet<String> refs = Sets.newHashSet(args.getCommands().keySet());
-            assertThat(refs).contains("refs/heads/master");
-            refs.remove("refs/heads/master");
-            if (!refs.isEmpty()) {
-              // Some submit strategies need to insert new patchset.
-              assertThat(refs).hasSize(1);
-              assertThat(refs.iterator().next()).startsWith(RefNames.REFS_CHANGES);
-            }
-          }
-        });
-
-    PushOneCommit.Result change = createChange();
-    approve(change.getChangeId());
-    submit(change.getChangeId());
-    assertThat(called.get()).isTrue();
-  }
-
-  @Test
-  public void submitWithValidationMultiRepo() throws Exception {
-    assume().that(isSubmitWholeTopicEnabled()).isTrue();
-    String topic = "test-topic";
-
-    // Create test projects
-    TestRepository<?> repoA = createProjectWithPush("project-a", null, getSubmitType());
-    TestRepository<?> repoB = createProjectWithPush("project-b", null, getSubmitType());
-
-    // Create changes on project-a
-    PushOneCommit.Result change1 =
-        createChange(repoA, "master", "Change 1", "a.txt", "content", topic);
-    PushOneCommit.Result change2 =
-        createChange(repoA, "master", "Change 2", "b.txt", "content", topic);
-
-    // Create changes on project-b
-    PushOneCommit.Result change3 =
-        createChange(repoB, "master", "Change 3", "a.txt", "content", topic);
-    PushOneCommit.Result change4 =
-        createChange(repoB, "master", "Change 4", "b.txt", "content", topic);
-
-    List<PushOneCommit.Result> changes = Lists.newArrayList(change1, change2, change3, change4);
-    for (PushOneCommit.Result change : changes) {
-      approve(change.getChangeId());
-    }
-
-    // Construct validator which will throw on a second call.
-    // Since there are 2 repos, first submit attempt will fail, the second will
-    // succeed.
-    List<String> projectsCalled = new ArrayList<>(4);
-    this.addOnSubmitValidationListener(
-        new OnSubmitValidationListener() {
-          @Override
-          public void preBranchUpdate(Arguments args) throws ValidationException {
-            String master = "refs/heads/master";
-            assertThat(args.getCommands()).containsKey(master);
-            ReceiveCommand cmd = args.getCommands().get(master);
-            ObjectId newMasterId = cmd.getNewId();
-            try (Repository repo = repoManager.openRepository(args.getProject())) {
-              assertThat(repo.exactRef(master).getObjectId()).isEqualTo(cmd.getOldId());
-              assertThat(args.getRef(master)).hasValue(newMasterId);
-              args.getRevWalk().parseBody(args.getRevWalk().parseCommit(newMasterId));
-            } catch (IOException e) {
-              throw new AssertionError("failed checking new ref value", e);
-            }
-            projectsCalled.add(args.getProject().get());
-            if (projectsCalled.size() == 2) {
-              throw new ValidationException("time to fail");
-            }
-          }
-        });
-    submitWithConflict(change4.getChangeId(), "time to fail");
-    assertThat(projectsCalled).containsExactly(name("project-a"), name("project-b"));
-    for (PushOneCommit.Result change : changes) {
-      change.assertChange(Change.Status.NEW, name(topic), admin);
-    }
-
-    submit(change4.getChangeId());
-    assertThat(projectsCalled)
-        .containsExactly(
-            name("project-a"), name("project-b"), name("project-a"), name("project-b"));
-    for (PushOneCommit.Result change : changes) {
-      change.assertChange(Change.Status.MERGED, name(topic), admin);
-    }
-  }
-
-  @Test
-  public void submitWithCommitAndItsMergeCommitTogether() throws Exception {
-    assume().that(isSubmitWholeTopicEnabled()).isTrue();
-
-    RevCommit initialHead = getRemoteHead();
-
-    // Create a stable branch and bootstrap it.
-    gApi.projects().name(project.get()).branch("stable").create(new BranchInput());
-    PushOneCommit push =
-        pushFactory.create(db, user.getIdent(), testRepo, "initial commit", "a.txt", "a");
-    PushOneCommit.Result change = push.to("refs/heads/stable");
-
-    RevCommit stable = getRemoteHead(project, "stable");
-    RevCommit master = getRemoteHead(project, "master");
-
-    assertThat(master).isEqualTo(initialHead);
-    assertThat(stable).isEqualTo(change.getCommit());
-
-    testRepo.git().fetch().call();
-    testRepo.git().branchCreate().setName("stable").setStartPoint(stable).call();
-    testRepo.git().branchCreate().setName("master").setStartPoint(master).call();
-
-    // Create a fix in stable branch.
-    testRepo.reset(stable);
-    RevCommit fix =
-        testRepo
-            .commit()
-            .parent(stable)
-            .message("small fix")
-            .add("b.txt", "b")
-            .insertChangeId()
-            .create();
-    testRepo.branch("refs/heads/stable").update(fix);
-    testRepo
-        .git()
-        .push()
-        .setRefSpecs(new RefSpec("refs/heads/stable:refs/for/stable/" + name("topic")))
-        .call();
-
-    // Merge the fix into master.
-    testRepo.reset(master);
-    RevCommit merge =
-        testRepo
-            .commit()
-            .parent(master)
-            .parent(fix)
-            .message("Merge stable into master")
-            .insertChangeId()
-            .create();
-    testRepo.branch("refs/heads/master").update(merge);
-    testRepo
-        .git()
-        .push()
-        .setRefSpecs(new RefSpec("refs/heads/master:refs/for/master/" + name("topic")))
-        .call();
-
-    // Submit together.
-    String fixId = GitUtil.getChangeId(testRepo, fix).get();
-    String mergeId = GitUtil.getChangeId(testRepo, merge).get();
-    approve(fixId);
-    approve(mergeId);
-    submit(mergeId);
-    assertMerged(fixId);
-    assertMerged(mergeId);
-    testRepo.git().fetch().call();
-    RevWalk rw = testRepo.getRevWalk();
-    master = rw.parseCommit(getRemoteHead(project, "master"));
-    assertThat(rw.isMergedInto(merge, master)).isTrue();
-    assertThat(rw.isMergedInto(fix, master)).isTrue();
-  }
-
-  @Test
-  public void retrySubmitSingleChangeOnLockFailure() throws Exception {
-    assume().that(notesMigration.disableChangeReviewDb()).isTrue();
-
-    PushOneCommit.Result change = createChange();
-    String id = change.getChangeId();
-    approve(id);
-
-    TestSubmitInput input = new TestSubmitInput();
-    input.generateLockFailures =
-        new ArrayDeque<>(
-            ImmutableList.of(
-                true, // Attempt 1: lock failure
-                false, // Attempt 2: success
-                false)); // Leftover value to check total number of calls.
-    submit(id, input);
-    assertMerged(id);
-
-    testRepo.git().fetch().call();
-    RevWalk rw = testRepo.getRevWalk();
-    RevCommit master = rw.parseCommit(getRemoteHead(project, "master"));
-    RevCommit patchSet = parseCurrentRevision(rw, change);
-    assertThat(rw.isMergedInto(patchSet, master)).isTrue();
-
-    assertThat(input.generateLockFailures).containsExactly(false);
-  }
-
-  @Test
-  public void retrySubmitAfterTornTopicOnLockFailure() throws Exception {
-    assume().that(notesMigration.disableChangeReviewDb()).isTrue();
-    assume().that(isSubmitWholeTopicEnabled()).isTrue();
-
-    String topic = "test-topic";
-
-    TestRepository<?> repoA = createProjectWithPush("project-a", null, getSubmitType());
-    TestRepository<?> repoB = createProjectWithPush("project-b", null, getSubmitType());
-
-    PushOneCommit.Result change1 =
-        createChange(repoA, "master", "Change 1", "a.txt", "content", topic);
-    PushOneCommit.Result change2 =
-        createChange(repoB, "master", "Change 2", "b.txt", "content", topic);
-
-    approve(change1.getChangeId());
-    approve(change2.getChangeId());
-
-    TestSubmitInput input = new TestSubmitInput();
-    input.generateLockFailures =
-        new ArrayDeque<>(
-            ImmutableList.of(
-                false, // Change 1, attempt 1: success
-                true, // Change 2, attempt 1: lock failure
-                false, // Change 1, attempt 2: success
-                false, // Change 2, attempt 2: success
-                false)); // Leftover value to check total number of calls.
-    submit(change2.getChangeId(), input);
-
-    String expectedTopic = name(topic);
-    change1.assertChange(Change.Status.MERGED, expectedTopic, admin);
-    change2.assertChange(Change.Status.MERGED, expectedTopic, admin);
-
-    repoA.git().fetch().call();
-    RevWalk rwA = repoA.getRevWalk();
-    RevCommit masterA = rwA.parseCommit(getRemoteHead(name("project-a"), "master"));
-    RevCommit change1Ps = parseCurrentRevision(rwA, change1);
-    assertThat(rwA.isMergedInto(change1Ps, masterA)).isTrue();
-
-    repoB.git().fetch().call();
-    RevWalk rwB = repoB.getRevWalk();
-    RevCommit masterB = rwB.parseCommit(getRemoteHead(name("project-b"), "master"));
-    RevCommit change2Ps = parseCurrentRevision(rwB, change2);
-    assertThat(rwB.isMergedInto(change2Ps, masterB)).isTrue();
-
-    assertThat(input.generateLockFailures).containsExactly(false);
-  }
-
-  @Test
-  public void authorAndCommitDateAreEqual() throws Exception {
-    assume().that(getSubmitType()).isNotEqualTo(SubmitType.FAST_FORWARD_ONLY);
-
-    ConfigInput ci = new ConfigInput();
-    ci.matchAuthorToCommitterDate = InheritableBoolean.TRUE;
-    gApi.projects().name(project.get()).config(ci);
-
-    RevCommit initialHead = getRemoteHead();
-    testRepo.reset(initialHead);
-    PushOneCommit.Result change = createChange("Change 1", "b", "b");
-
-    testRepo.reset(initialHead);
-    PushOneCommit.Result change2 = createChange("Change 2", "c", "c");
-
-    if (getSubmitType() == SubmitType.MERGE_IF_NECESSARY
-        || getSubmitType() == SubmitType.REBASE_IF_NECESSARY) {
-      // Merge another change so that change2 is not a fast-forward
-      submit(change.getChangeId());
-    }
-
-    submit(change2.getChangeId());
-    assertAuthorAndCommitDateEquals(getRemoteHead());
-  }
-
-  private void setChangeStatusToNew(PushOneCommit.Result... changes) throws Exception {
-    for (PushOneCommit.Result change : changes) {
-      try (BatchUpdate bu =
-          batchUpdateFactory.create(db, project, userFactory.create(admin.id), TimeUtil.nowTs())) {
-        bu.addOp(
-            change.getChange().getId(),
-            new BatchUpdateOp() {
-              @Override
-              public boolean updateChange(ChangeContext ctx) throws OrmException {
-                ctx.getChange().setStatus(Change.Status.NEW);
-                ctx.getUpdate(ctx.getChange().currentPatchSetId()).setStatus(Change.Status.NEW);
-                return true;
-              }
-            });
-        bu.execute();
-      }
-    }
-  }
-
-  private void assertSubmitter(PushOneCommit.Result change) throws Exception {
-    ChangeInfo info = get(change.getChangeId(), ListChangesOption.MESSAGES);
-    assertThat(info.messages).isNotNull();
-    Iterable<String> messages = Iterables.transform(info.messages, i -> i.message);
-    assertThat(messages).hasSize(3);
-    String last = Iterables.getLast(messages);
-    if (getSubmitType() == SubmitType.CHERRY_PICK) {
-      assertThat(last).startsWith("Change has been successfully cherry-picked as ");
-    } else if (getSubmitType() == SubmitType.REBASE_ALWAYS) {
-      assertThat(last).startsWith("Change has been successfully rebased and submitted as");
-    } else {
-      assertThat(last).isEqualTo("Change has been successfully merged by Administrator");
-    }
-  }
-
-  @Override
-  protected void updateProjectInput(ProjectInput in) {
-    in.submitType = getSubmitType();
-    if (in.useContentMerge == InheritableBoolean.INHERIT) {
-      in.useContentMerge = InheritableBoolean.FALSE;
-    }
-  }
-
-  protected void submit(String changeId) throws Exception {
-    submit(changeId, new SubmitInput(), null, null);
-  }
-
-  protected void submit(String changeId, SubmitInput input) throws Exception {
-    submit(changeId, input, null, null);
-  }
-
-  protected void submitWithConflict(String changeId, String expectedError) throws Exception {
-    submit(changeId, new SubmitInput(), ResourceConflictException.class, expectedError);
-  }
-
-  protected void submit(
-      String changeId,
-      SubmitInput input,
-      Class<? extends RestApiException> expectedExceptionType,
-      String expectedExceptionMsg)
-      throws Exception {
-    approve(changeId);
-    if (expectedExceptionType == null) {
-      assertSubmittable(changeId);
-    }
-    try {
-      gApi.changes().id(changeId).current().submit(input);
-      if (expectedExceptionType != null) {
-        fail("Expected exception of type " + expectedExceptionType.getSimpleName());
-      }
-    } catch (RestApiException e) {
-      if (expectedExceptionType == null) {
-        throw e;
-      }
-      // More verbose than using assertThat and/or ExpectedException, but gives
-      // us the stack trace.
-      if (!expectedExceptionType.isAssignableFrom(e.getClass())
-          || !e.getMessage().equals(expectedExceptionMsg)) {
-        throw new AssertionError(
-            "Expected exception of type "
-                + expectedExceptionType.getSimpleName()
-                + " with message: \""
-                + expectedExceptionMsg
-                + "\" but got exception of type "
-                + e.getClass().getSimpleName()
-                + " with message \""
-                + e.getMessage()
-                + "\"",
-            e);
-      }
-      return;
-    }
-    ChangeInfo change = gApi.changes().id(changeId).info();
-    assertMerged(change.changeId);
-  }
-
-  protected void assertSubmittable(String changeId) throws Exception {
-    assertThat(get(changeId, SUBMITTABLE).submittable)
-        .named("submit bit on ChangeInfo")
-        .isEqualTo(true);
-    RevisionResource rsrc = parseCurrentRevisionResource(changeId);
-    UiAction.Description desc = submitHandler.getDescription(rsrc);
-    assertThat(desc.isVisible()).named("visible bit on submit action").isTrue();
-    assertThat(desc.isEnabled()).named("enabled bit on submit action").isTrue();
-  }
-
-  protected void assertChangeMergedEvents(String... expected) throws Exception {
-    eventRecorder.assertChangeMergedEvents(project.get(), "refs/heads/master", expected);
-  }
-
-  protected void assertRefUpdatedEvents(RevCommit... expected) throws Exception {
-    eventRecorder.assertRefUpdatedEvents(project.get(), "refs/heads/master", expected);
-  }
-
-  protected void assertCurrentRevision(String changeId, int expectedNum, ObjectId expectedId)
-      throws Exception {
-    ChangeInfo c = get(changeId, CURRENT_REVISION);
-    assertThat(c.currentRevision).isEqualTo(expectedId.name());
-    assertThat(c.revisions.get(expectedId.name())._number).isEqualTo(expectedNum);
-    try (Repository repo = repoManager.openRepository(new Project.NameKey(c.project))) {
-      String refName = new PatchSet.Id(new Change.Id(c._number), expectedNum).toRefName();
-      Ref ref = repo.exactRef(refName);
-      assertThat(ref).named(refName).isNotNull();
-      assertThat(ref.getObjectId()).isEqualTo(expectedId);
-    }
-  }
-
-  protected void assertNew(String changeId) throws Exception {
-    assertThat(get(changeId).status).isEqualTo(ChangeStatus.NEW);
-  }
-
-  protected void assertApproved(String changeId) throws Exception {
-    assertApproved(changeId, admin);
-  }
-
-  protected void assertApproved(String changeId, TestAccount user) throws Exception {
-    ChangeInfo c = get(changeId, DETAILED_LABELS);
-    LabelInfo cr = c.labels.get("Code-Review");
-    assertThat(cr.all).hasSize(1);
-    assertThat(cr.all.get(0).value).isEqualTo(2);
-    assertThat(new Account.Id(cr.all.get(0)._accountId)).isEqualTo(user.getId());
-  }
-
-  protected void assertMerged(String changeId) throws RestApiException {
-    ChangeStatus status = gApi.changes().id(changeId).info().status;
-    assertThat(status).isEqualTo(ChangeStatus.MERGED);
-  }
-
-  protected void assertPersonEquals(PersonIdent expected, PersonIdent actual) {
-    assertThat(actual.getEmailAddress()).isEqualTo(expected.getEmailAddress());
-    assertThat(actual.getName()).isEqualTo(expected.getName());
-    assertThat(actual.getTimeZone()).isEqualTo(expected.getTimeZone());
-  }
-
-  protected void assertAuthorAndCommitDateEquals(RevCommit commit) {
-    assertThat(commit.getAuthorIdent().getWhen()).isEqualTo(commit.getCommitterIdent().getWhen());
-    assertThat(commit.getAuthorIdent().getTimeZone())
-        .isEqualTo(commit.getCommitterIdent().getTimeZone());
-  }
-
-  protected void assertSubmitter(String changeId, int psId) throws Exception {
-    assertSubmitter(changeId, psId, admin);
-  }
-
-  protected void assertSubmitter(String changeId, int psId, TestAccount user) throws Exception {
-    Change c = getOnlyElement(queryProvider.get().byKeyPrefix(changeId)).change();
-    ChangeNotes cn = notesFactory.createChecked(db, c);
-    PatchSetApproval submitter =
-        approvalsUtil.getSubmitter(db, cn, new PatchSet.Id(cn.getChangeId(), psId));
-    assertThat(submitter).isNotNull();
-    assertThat(submitter.isLegacySubmit()).isTrue();
-    assertThat(submitter.getAccountId()).isEqualTo(user.getId());
-  }
-
-  protected void assertNoSubmitter(String changeId, int psId) throws Exception {
-    Change c = getOnlyElement(queryProvider.get().byKeyPrefix(changeId)).change();
-    ChangeNotes cn = notesFactory.createChecked(db, c);
-    PatchSetApproval submitter =
-        approvalsUtil.getSubmitter(db, cn, new PatchSet.Id(cn.getChangeId(), psId));
-    assertThat(submitter).isNull();
-  }
-
-  protected void assertCherryPick(TestRepository<?> testRepo, boolean contentMerge)
-      throws Exception {
-    assertRebase(testRepo, contentMerge);
-    RevCommit remoteHead = getRemoteHead();
-    assertThat(remoteHead.getFooterLines("Reviewed-On")).isNotEmpty();
-    assertThat(remoteHead.getFooterLines("Reviewed-By")).isNotEmpty();
-  }
-
-  protected void assertRebase(TestRepository<?> testRepo, boolean contentMerge) throws Exception {
-    Repository repo = testRepo.getRepository();
-    RevCommit localHead = getHead(repo);
-    RevCommit remoteHead = getRemoteHead();
-    assertThat(localHead.getId()).isNotEqualTo(remoteHead.getId());
-    assertThat(remoteHead.getParentCount()).isEqualTo(1);
-    if (!contentMerge) {
-      assertThat(getLatestRemoteDiff()).isEqualTo(getLatestDiff(repo));
-    }
-    assertThat(remoteHead.getShortMessage()).isEqualTo(localHead.getShortMessage());
-  }
-
-  protected List<RevCommit> getRemoteLog(Project.NameKey project, String branch) throws Exception {
-    try (Repository repo = repoManager.openRepository(project);
-        RevWalk rw = new RevWalk(repo)) {
-      rw.markStart(rw.parseCommit(repo.exactRef("refs/heads/" + branch).getObjectId()));
-      return Lists.newArrayList(rw);
-    }
-  }
-
-  protected List<RevCommit> getRemoteLog() throws Exception {
-    return getRemoteLog(project, "master");
-  }
-
-  protected void addOnSubmitValidationListener(OnSubmitValidationListener listener) {
-    assertThat(onSubmitValidatorHandle).isNull();
-    onSubmitValidatorHandle = onSubmitValidationListeners.add(listener);
-  }
-
-  private String getLatestDiff(Repository repo) throws Exception {
-    ObjectId oldTreeId = repo.resolve("HEAD~1^{tree}");
-    ObjectId newTreeId = repo.resolve("HEAD^{tree}");
-    return getLatestDiff(repo, oldTreeId, newTreeId);
-  }
-
-  private String getLatestRemoteDiff() throws Exception {
-    try (Repository repo = repoManager.openRepository(project);
-        RevWalk rw = new RevWalk(repo)) {
-      ObjectId oldTreeId = repo.resolve("refs/heads/master~1^{tree}");
-      ObjectId newTreeId = repo.resolve("refs/heads/master^{tree}");
-      return getLatestDiff(repo, oldTreeId, newTreeId);
-    }
-  }
-
-  private String getLatestDiff(Repository repo, ObjectId oldTreeId, ObjectId newTreeId)
-      throws Exception {
-    ByteArrayOutputStream out = new ByteArrayOutputStream();
-    try (DiffFormatter fmt = new DiffFormatter(out)) {
-      fmt.setRepository(repo);
-      fmt.format(oldTreeId, newTreeId);
-      fmt.flush();
-      return out.toString();
-    }
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmitByMerge.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmitByMerge.java
deleted file mode 100644
index b4d8557..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmitByMerge.java
+++ /dev/null
@@ -1,181 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.acceptance.rest.change;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.TruthJUnit.assume;
-
-import com.google.common.collect.Iterables;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.acceptance.TestProjectInput;
-import com.google.gerrit.extensions.api.changes.SubmitInput;
-import com.google.gerrit.extensions.client.ChangeStatus;
-import com.google.gerrit.extensions.client.InheritableBoolean;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.server.change.Submit.TestSubmitInput;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.junit.Test;
-
-public abstract class AbstractSubmitByMerge extends AbstractSubmit {
-
-  @Test
-  public void submitWithMerge() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-    PushOneCommit.Result change = createChange("Change 1", "a.txt", "content");
-    submit(change.getChangeId());
-
-    RevCommit oldHead = getRemoteHead();
-    testRepo.reset(initialHead);
-    PushOneCommit.Result change2 = createChange("Change 2", "b.txt", "other content");
-    submit(change2.getChangeId());
-    RevCommit head = getRemoteHead();
-    assertThat(head.getParentCount()).isEqualTo(2);
-    assertThat(head.getParent(0)).isEqualTo(oldHead);
-    assertThat(head.getParent(1)).isEqualTo(change2.getCommit());
-  }
-
-  @Test
-  @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
-  public void submitWithContentMerge() throws Exception {
-    PushOneCommit.Result change = createChange("Change 1", "a.txt", "aaa\nbbb\nccc\n");
-    submit(change.getChangeId());
-    PushOneCommit.Result change2 = createChange("Change 2", "a.txt", "aaa\nbbb\nccc\nddd\n");
-    submit(change2.getChangeId());
-
-    RevCommit oldHead = getRemoteHead();
-    testRepo.reset(change.getCommit());
-    PushOneCommit.Result change3 = createChange("Change 3", "a.txt", "bbb\nccc\n");
-    submit(change3.getChangeId());
-    RevCommit head = getRemoteHead();
-    assertThat(head.getParentCount()).isEqualTo(2);
-    assertThat(head.getParent(0)).isEqualTo(oldHead);
-    assertThat(head.getParent(1)).isEqualTo(change3.getCommit());
-  }
-
-  @Test
-  @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
-  public void submitWithContentMerge_Conflict() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-    PushOneCommit.Result change = createChange("Change 1", "a.txt", "content");
-    submit(change.getChangeId());
-
-    RevCommit oldHead = getRemoteHead();
-    testRepo.reset(initialHead);
-    PushOneCommit.Result change2 = createChange("Change 2", "a.txt", "other content");
-    submitWithConflict(
-        change2.getChangeId(),
-        "Failed to submit 1 change due to the following problems:\n"
-            + "Change "
-            + change2.getChange().getId()
-            + ": "
-            + "Change could not be merged due to a path conflict. "
-            + "Please rebase the change locally "
-            + "and upload the rebased commit for review.");
-    assertThat(getRemoteHead()).isEqualTo(oldHead);
-  }
-
-  @Test
-  @TestProjectInput(createEmptyCommit = false)
-  public void submitMultipleCommitsToEmptyRepoAsFastForward() throws Exception {
-    PushOneCommit.Result change1 = createChange();
-    PushOneCommit.Result change2 = createChange();
-    approve(change1.getChangeId());
-    submit(change2.getChangeId());
-    assertThat(getRemoteHead().getId()).isEqualTo(change2.getCommit());
-  }
-
-  @Test
-  @TestProjectInput(createEmptyCommit = false)
-  public void submitMultipleCommitsToEmptyRepoWithOneMerge() throws Exception {
-    assume().that(isSubmitWholeTopicEnabled()).isTrue();
-    PushOneCommit.Result change1 =
-        pushFactory
-            .create(db, admin.getIdent(), testRepo, "Change 1", "a", "a")
-            .to("refs/for/master/" + name("topic"));
-
-    PushOneCommit push2 = pushFactory.create(db, admin.getIdent(), testRepo, "Change 2", "b", "b");
-    push2.noParents();
-    PushOneCommit.Result change2 = push2.to("refs/for/master/" + name("topic"));
-    change2.assertOkStatus();
-
-    approve(change1.getChangeId());
-    submit(change2.getChangeId());
-
-    RevCommit head = getRemoteHead();
-    assertThat(head.getParents()).hasLength(2);
-    assertThat(head.getParent(0)).isEqualTo(change1.getCommit());
-    assertThat(head.getParent(1)).isEqualTo(change2.getCommit());
-  }
-
-  @Test
-  public void repairChangeStateAfterFailure() throws Exception {
-    // In NoteDb-only mode, repo and meta updates are atomic (at least in InMemoryRepository).
-    assume().that(notesMigration.disableChangeReviewDb()).isFalse();
-
-    RevCommit initialHead = getRemoteHead();
-    PushOneCommit.Result change = createChange("Change 1", "a.txt", "content");
-    submit(change.getChangeId());
-    RevCommit afterChange1Head = getRemoteHead();
-
-    testRepo.reset(initialHead);
-    PushOneCommit.Result change2 = createChange("Change 2", "b.txt", "other content");
-    Change.Id id2 = change2.getChange().getId();
-    TestSubmitInput failInput = new TestSubmitInput();
-    failInput.failAfterRefUpdates = true;
-    submit(
-        change2.getChangeId(),
-        failInput,
-        ResourceConflictException.class,
-        "Failing after ref updates");
-
-    // Bad: ref advanced but change wasn't updated.
-    PatchSet.Id psId1 = new PatchSet.Id(id2, 1);
-    ChangeInfo info = gApi.changes().id(id2.get()).get();
-    assertThat(info.status).isEqualTo(ChangeStatus.NEW);
-    assertThat(info.revisions.get(info.currentRevision)._number).isEqualTo(1);
-
-    RevCommit tip;
-    try (Repository repo = repoManager.openRepository(project);
-        RevWalk rw = new RevWalk(repo)) {
-      ObjectId rev1 = repo.exactRef(psId1.toRefName()).getObjectId();
-      assertThat(rev1).isNotNull();
-
-      tip = rw.parseCommit(repo.exactRef("refs/heads/master").getObjectId());
-      assertThat(tip.getParentCount()).isEqualTo(2);
-      assertThat(tip.getParent(0)).isEqualTo(afterChange1Head);
-      assertThat(tip.getParent(1)).isEqualTo(change2.getCommit());
-    }
-
-    submit(change2.getChangeId(), new SubmitInput(), null, null);
-
-    // Change status and patch set entities were updated, and branch tip stayed
-    // the same.
-    info = gApi.changes().id(id2.get()).get();
-    assertThat(info.status).isEqualTo(ChangeStatus.MERGED);
-    assertThat(info.revisions.get(info.currentRevision)._number).isEqualTo(1);
-    assertThat(Iterables.getLast(info.messages).message)
-        .isEqualTo("Change has been successfully merged by Administrator");
-
-    try (Repository repo = repoManager.openRepository(project)) {
-      assertThat(repo.exactRef("refs/heads/master").getObjectId()).isEqualTo(tip);
-    }
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmitByRebase.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmitByRebase.java
deleted file mode 100644
index 5dfc76d..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmitByRebase.java
+++ /dev/null
@@ -1,458 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.acceptance.rest.change;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.TruthJUnit.assume;
-import static com.google.gerrit.acceptance.GitUtil.getChangeId;
-import static com.google.gerrit.acceptance.GitUtil.pushHead;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.acceptance.TestAccount;
-import com.google.gerrit.acceptance.TestProjectInput;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.client.ChangeStatus;
-import com.google.gerrit.extensions.client.InheritableBoolean;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.change.Submit.TestSubmitInput;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.project.Util;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.junit.Test;
-
-public abstract class AbstractSubmitByRebase extends AbstractSubmit {
-
-  @Override
-  protected abstract SubmitType getSubmitType();
-
-  @Test
-  @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
-  public void submitWithRebase() throws Exception {
-    submitWithRebase(admin);
-  }
-
-  @Test
-  @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
-  public void submitWithRebaseWithoutAddPatchSetPermission() throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    Util.block(cfg, Permission.ADD_PATCH_SET, REGISTERED_USERS, "refs/*");
-    Util.allow(cfg, Permission.SUBMIT, REGISTERED_USERS, "refs/heads/*");
-    Util.allow(
-        cfg,
-        Permission.forLabel(Util.codeReview().getName()),
-        -2,
-        2,
-        REGISTERED_USERS,
-        "refs/heads/*");
-    saveProjectConfig(project, cfg);
-
-    submitWithRebase(user);
-  }
-
-  private void submitWithRebase(TestAccount submitter) throws Exception {
-    setApiUser(submitter);
-    RevCommit initialHead = getRemoteHead();
-    PushOneCommit.Result change = createChange("Change 1", "a.txt", "content");
-    submit(change.getChangeId());
-
-    RevCommit headAfterFirstSubmit = getRemoteHead();
-    testRepo.reset(initialHead);
-    PushOneCommit.Result change2 = createChange("Change 2", "b.txt", "other content");
-    submit(change2.getChangeId());
-    assertRebase(testRepo, false);
-    RevCommit headAfterSecondSubmit = getRemoteHead();
-    assertThat(headAfterSecondSubmit.getParent(0)).isEqualTo(headAfterFirstSubmit);
-    assertApproved(change2.getChangeId(), submitter);
-    assertCurrentRevision(change2.getChangeId(), 2, headAfterSecondSubmit);
-    assertSubmitter(change2.getChangeId(), 1, submitter);
-    assertSubmitter(change2.getChangeId(), 2, submitter);
-    assertPersonEquals(admin.getIdent(), headAfterSecondSubmit.getAuthorIdent());
-    assertPersonEquals(submitter.getIdent(), headAfterSecondSubmit.getCommitterIdent());
-
-    assertRefUpdatedEvents(
-        initialHead, headAfterFirstSubmit, headAfterFirstSubmit, headAfterSecondSubmit);
-    assertChangeMergedEvents(
-        change.getChangeId(),
-        headAfterFirstSubmit.name(),
-        change2.getChangeId(),
-        headAfterSecondSubmit.name());
-  }
-
-  @Test
-  public void submitWithRebaseMultipleChanges() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-    PushOneCommit.Result change1 = createChange("Change 1", "a.txt", "content");
-    submit(change1.getChangeId());
-    RevCommit headAfterFirstSubmit = getRemoteHead();
-    if (getSubmitType() == SubmitType.REBASE_ALWAYS) {
-      assertCurrentRevision(change1.getChangeId(), 2, headAfterFirstSubmit);
-    } else {
-      assertThat(headAfterFirstSubmit.name()).isEqualTo(change1.getCommit().name());
-    }
-
-    testRepo.reset(initialHead);
-    PushOneCommit.Result change2 = createChange("Change 2", "b.txt", "other content");
-    assertThat(change2.getCommit().getParent(0)).isNotEqualTo(change1.getCommit());
-    PushOneCommit.Result change3 = createChange("Change 3", "c.txt", "third content");
-    PushOneCommit.Result change4 = createChange("Change 4", "d.txt", "fourth content");
-    approve(change2.getChangeId());
-    approve(change3.getChangeId());
-    submit(change4.getChangeId());
-
-    assertRebase(testRepo, false);
-    assertApproved(change2.getChangeId());
-    assertApproved(change3.getChangeId());
-    assertApproved(change4.getChangeId());
-
-    RevCommit headAfterSecondSubmit = parse(getRemoteHead());
-    assertThat(headAfterSecondSubmit.getShortMessage()).isEqualTo("Change 4");
-    assertThat(headAfterSecondSubmit).isNotEqualTo(change4.getCommit());
-    assertCurrentRevision(change4.getChangeId(), 2, headAfterSecondSubmit);
-
-    RevCommit parent = parse(headAfterSecondSubmit.getParent(0));
-    assertThat(parent.getShortMessage()).isEqualTo("Change 3");
-    assertThat(parent).isNotEqualTo(change3.getCommit());
-    assertCurrentRevision(change3.getChangeId(), 2, parent);
-
-    RevCommit grandparent = parse(parent.getParent(0));
-    assertThat(grandparent).isNotEqualTo(change2.getCommit());
-    assertCurrentRevision(change2.getChangeId(), 2, grandparent);
-
-    RevCommit greatgrandparent = parse(grandparent.getParent(0));
-    assertThat(greatgrandparent).isEqualTo(headAfterFirstSubmit);
-    if (getSubmitType() == SubmitType.REBASE_ALWAYS) {
-      assertCurrentRevision(change1.getChangeId(), 2, greatgrandparent);
-    } else {
-      assertCurrentRevision(change1.getChangeId(), 1, greatgrandparent);
-    }
-
-    assertRefUpdatedEvents(
-        initialHead, headAfterFirstSubmit, headAfterFirstSubmit, headAfterSecondSubmit);
-    assertChangeMergedEvents(
-        change1.getChangeId(),
-        headAfterFirstSubmit.name(),
-        change2.getChangeId(),
-        headAfterSecondSubmit.name(),
-        change3.getChangeId(),
-        headAfterSecondSubmit.name(),
-        change4.getChangeId(),
-        headAfterSecondSubmit.name());
-  }
-
-  @Test
-  public void submitWithRebaseMergeCommit() throws Exception {
-    /*
-       *  (HEAD, origin/master, origin/HEAD) Merge changes X,Y
-       |\
-       | *   Merge branch 'master' into origin/master
-       | |\
-       | | * SHA Added a
-       | |/
-       * | Before
-       |/
-       * Initial empty repository
-    */
-    RevCommit initialHead = getRemoteHead();
-    PushOneCommit.Result change1 = createChange("Added a", "a.txt", "");
-
-    PushOneCommit change2Push =
-        pushFactory.create(db, admin.getIdent(), testRepo, "Merge to master", "m.txt", "");
-    change2Push.setParents(ImmutableList.of(initialHead, change1.getCommit()));
-    PushOneCommit.Result change2 = change2Push.to("refs/for/master");
-
-    testRepo.reset(initialHead);
-    PushOneCommit.Result change3 = createChange("Before", "b.txt", "");
-
-    approve(change3.getChangeId());
-    submit(change3.getChangeId());
-
-    approve(change1.getChangeId());
-    approve(change2.getChangeId());
-    submit(change2.getChangeId());
-
-    RevCommit newHead = getRemoteHead();
-    assertThat(newHead.getParentCount()).isEqualTo(2);
-
-    RevCommit headParent1 = parse(newHead.getParent(0).getId());
-    RevCommit headParent2 = parse(newHead.getParent(1).getId());
-
-    if (getSubmitType() == SubmitType.REBASE_ALWAYS) {
-      assertCurrentRevision(change3.getChangeId(), 2, headParent1.getId());
-    } else {
-      assertThat(change3.getCommit().getId()).isEqualTo(headParent1.getId());
-    }
-    assertThat(headParent1.getParentCount()).isEqualTo(1);
-    assertThat(headParent1.getParent(0)).isEqualTo(initialHead);
-
-    assertThat(headParent2.getId()).isEqualTo(change2.getCommit().getId());
-    assertThat(headParent2.getParentCount()).isEqualTo(2);
-
-    RevCommit headGrandparent1 = parse(headParent2.getParent(0).getId());
-    RevCommit headGrandparent2 = parse(headParent2.getParent(1).getId());
-
-    assertThat(headGrandparent1.getId()).isEqualTo(initialHead.getId());
-    assertThat(headGrandparent2.getId()).isEqualTo(change1.getCommit().getId());
-  }
-
-  @Test
-  @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
-  public void submitWithContentMerge_Conflict() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-    PushOneCommit.Result change = createChange("Change 1", "a.txt", "content");
-    submit(change.getChangeId());
-
-    RevCommit headAfterFirstSubmit = getRemoteHead();
-    testRepo.reset(initialHead);
-    PushOneCommit.Result change2 = createChange("Change 2", "a.txt", "other content");
-    submitWithConflict(
-        change2.getChangeId(),
-        "Cannot rebase "
-            + change2.getCommit().name()
-            + ": The change could not be rebased due to a conflict during merge.");
-    RevCommit head = getRemoteHead();
-    assertThat(head).isEqualTo(headAfterFirstSubmit);
-    assertCurrentRevision(change2.getChangeId(), 1, change2.getCommit());
-    assertNoSubmitter(change2.getChangeId(), 1);
-
-    assertRefUpdatedEvents(initialHead, headAfterFirstSubmit);
-    assertChangeMergedEvents(change.getChangeId(), headAfterFirstSubmit.name());
-  }
-
-  @Test
-  public void repairChangeStateAfterFailure() throws Exception {
-    // In NoteDb-only mode, repo and meta updates are atomic (at least in InMemoryRepository).
-    assume().that(notesMigration.disableChangeReviewDb()).isFalse();
-
-    RevCommit initialHead = getRemoteHead();
-    PushOneCommit.Result change = createChange("Change 1", "a.txt", "content");
-    submit(change.getChangeId());
-
-    RevCommit headAfterFirstSubmit = getRemoteHead();
-    testRepo.reset(initialHead);
-    PushOneCommit.Result change2 = createChange("Change 2", "b.txt", "other content");
-    Change.Id id2 = change2.getChange().getId();
-    TestSubmitInput failInput = new TestSubmitInput();
-    failInput.failAfterRefUpdates = true;
-    submit(
-        change2.getChangeId(),
-        failInput,
-        ResourceConflictException.class,
-        "Failing after ref updates");
-    RevCommit headAfterFailedSubmit = getRemoteHead();
-
-    // Bad: ref advanced but change wasn't updated.
-    PatchSet.Id psId1 = new PatchSet.Id(id2, 1);
-    PatchSet.Id psId2 = new PatchSet.Id(id2, 2);
-    ChangeInfo info = gApi.changes().id(id2.get()).get();
-    assertThat(info.status).isEqualTo(ChangeStatus.NEW);
-    assertThat(info.revisions.get(info.currentRevision)._number).isEqualTo(1);
-    assertThat(getPatchSet(psId2)).isNull();
-
-    ObjectId rev2;
-    try (Repository repo = repoManager.openRepository(project);
-        RevWalk rw = new RevWalk(repo)) {
-      ObjectId rev1 = repo.exactRef(psId1.toRefName()).getObjectId();
-      assertThat(rev1).isNotNull();
-
-      rev2 = repo.exactRef(psId2.toRefName()).getObjectId();
-      assertThat(rev2).isNotNull();
-      assertThat(rev2).isNotEqualTo(rev1);
-      assertThat(rw.parseCommit(rev2).getParent(0)).isEqualTo(headAfterFirstSubmit);
-
-      assertThat(repo.exactRef("refs/heads/master").getObjectId()).isEqualTo(rev2);
-    }
-
-    submit(change2.getChangeId());
-    RevCommit headAfterSecondSubmit = getRemoteHead();
-    assertThat(headAfterSecondSubmit).isEqualTo(headAfterFailedSubmit);
-
-    // Change status and patch set entities were updated, and branch tip stayed
-    // the same.
-    info = gApi.changes().id(id2.get()).get();
-    assertThat(info.status).isEqualTo(ChangeStatus.MERGED);
-    assertThat(info.revisions.get(info.currentRevision)._number).isEqualTo(2);
-    PatchSet ps2 = getPatchSet(psId2);
-    assertThat(ps2).isNotNull();
-    assertThat(ps2.getRevision().get()).isEqualTo(rev2.name());
-    assertThat(Iterables.getLast(info.messages).message)
-        .isEqualTo(
-            "Change has been successfully rebased and submitted as "
-                + rev2.name()
-                + " by Administrator");
-
-    try (Repository repo = repoManager.openRepository(project)) {
-      assertThat(repo.exactRef("refs/heads/master").getObjectId()).isEqualTo(rev2);
-    }
-
-    assertRefUpdatedEvents(initialHead, headAfterFirstSubmit);
-    assertChangeMergedEvents(
-        change.getChangeId(),
-        headAfterFirstSubmit.name(),
-        change2.getChangeId(),
-        headAfterSecondSubmit.name());
-  }
-
-  protected RevCommit parse(ObjectId id) throws Exception {
-    try (Repository repo = repoManager.openRepository(project);
-        RevWalk rw = new RevWalk(repo)) {
-      RevCommit c = rw.parseCommit(id);
-      rw.parseBody(c);
-      return c;
-    }
-  }
-
-  @Test
-  public void submitAfterReorderOfCommits() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-
-    // Create two commits and push.
-    RevCommit c1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
-    RevCommit c2 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
-    pushHead(testRepo, "refs/for/master", false);
-
-    String id1 = getChangeId(testRepo, c1).get();
-    String id2 = getChangeId(testRepo, c2).get();
-
-    // Swap the order of commits and push again.
-    testRepo.reset("HEAD~2");
-    testRepo.cherryPick(c2);
-    testRepo.cherryPick(c1);
-    pushHead(testRepo, "refs/for/master", false);
-
-    approve(id1);
-    approve(id2);
-    submit(id1);
-    RevCommit headAfterSubmit = getRemoteHead();
-
-    assertRefUpdatedEvents(initialHead, headAfterSubmit);
-    assertChangeMergedEvents(id2, headAfterSubmit.name(), id1, headAfterSubmit.name());
-  }
-
-  @Test
-  public void submitChangesAfterBranchOnSecond() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-
-    PushOneCommit.Result change = createChange();
-    approve(change.getChangeId());
-
-    PushOneCommit.Result change2 = createChange();
-    approve(change2.getChangeId());
-    Project.NameKey project = change2.getChange().change().getProject();
-    Branch.NameKey branch = new Branch.NameKey(project, "branch");
-    createBranchWithRevision(branch, change2.getCommit().getName());
-    gApi.changes().id(change2.getChangeId()).current().submit();
-    assertMerged(change2.getChangeId());
-    assertMerged(change.getChangeId());
-
-    RevCommit newHead = getRemoteHead();
-    assertRefUpdatedEvents(initialHead, newHead);
-    assertChangeMergedEvents(
-        change.getChangeId(), newHead.name(), change2.getChangeId(), newHead.name());
-  }
-
-  @Test
-  @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
-  public void submitFastForwardIdenticalTree() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-    PushOneCommit.Result change1 = createChange("Change 1", "a.txt", "a");
-    PushOneCommit.Result change2 = createChange("Change 2", "a.txt", "a");
-
-    assertThat(change1.getCommit().getTree()).isEqualTo(change2.getCommit().getTree());
-
-    // for rebase if necessary, otherwise, the manual rebase of change2 will
-    // fail since change1 would be merged as fast forward
-    testRepo.reset(initialHead);
-    PushOneCommit.Result change0 = createChange("Change 0", "b.txt", "b");
-    submit(change0.getChangeId());
-    RevCommit headAfterChange0 = getRemoteHead();
-    assertThat(headAfterChange0.getShortMessage()).isEqualTo("Change 0");
-
-    submit(change1.getChangeId());
-    RevCommit headAfterChange1 = getRemoteHead();
-    assertThat(headAfterChange1.getShortMessage()).isEqualTo("Change 1");
-    assertThat(headAfterChange0).isEqualTo(headAfterChange1.getParent(0));
-
-    // Do manual rebase first.
-    gApi.changes().id(change2.getChangeId()).current().rebase();
-    submit(change2.getChangeId());
-    RevCommit headAfterChange2 = getRemoteHead();
-    assertThat(headAfterChange2.getShortMessage()).isEqualTo("Change 2");
-    assertThat(headAfterChange1).isEqualTo(headAfterChange2.getParent(0));
-
-    ChangeInfo info2 = get(change2.getChangeId());
-    assertThat(info2.status).isEqualTo(ChangeStatus.MERGED);
-  }
-
-  @Test
-  @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
-  public void submitChainOneByOne() throws Exception {
-    PushOneCommit.Result change1 = createChange("subject 1", "fileName 1", "content 1");
-    PushOneCommit.Result change2 = createChange("subject 2", "fileName 2", "content 2");
-    submit(change1.getChangeId());
-    submit(change2.getChangeId());
-  }
-
-  @Test
-  @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
-  public void submitChainFailsOnRework() throws Exception {
-    PushOneCommit.Result change1 = createChange("subject 1", "fileName 1", "content 1");
-    RevCommit headAfterChange1 = change1.getCommit();
-    PushOneCommit.Result change2 = createChange("subject 2", "fileName 2", "content 2");
-    testRepo.reset(headAfterChange1);
-    change1 =
-        amendChange(change1.getChangeId(), "subject 1 amend", "fileName 2", "rework content 2");
-    submit(change1.getChangeId());
-    headAfterChange1 = getRemoteHead();
-
-    submitWithConflict(
-        change2.getChangeId(),
-        "Cannot rebase "
-            + change2.getCommit().getName()
-            + ": "
-            + "The change could not be rebased due to a conflict during merge.");
-    assertThat(getRemoteHead()).isEqualTo(headAfterChange1);
-  }
-
-  @Test
-  @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
-  public void submitChainOneByOneManualRebase() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-    PushOneCommit.Result change1 = createChange("subject 1", "fileName 1", "content 1");
-    PushOneCommit.Result change2 = createChange("subject 2", "fileName 2", "content 2");
-
-    // for rebase if necessary, otherwise, the manual rebase of change2 will
-    // fail since change1 would be merged as fast forward
-    testRepo.reset(initialHead);
-    PushOneCommit.Result change = createChange();
-    submit(change.getChangeId());
-
-    submit(change1.getChangeId());
-    // Do manual rebase first.
-    gApi.changes().id(change2.getChangeId()).current().rebase();
-    submit(change2.getChangeId());
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ActionsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ActionsIT.java
deleted file mode 100644
index 72be321..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ActionsIT.java
+++ /dev/null
@@ -1,455 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.acceptance.rest.change;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.extensions.client.ListChangesOption.CHANGE_ACTIONS;
-import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_ACTIONS;
-import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_REVISION;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.TestProjectInput;
-import com.google.gerrit.extensions.api.changes.ActionVisitor;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.client.ListChangesOption;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.extensions.common.ActionInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.RevisionInfo;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.registration.RegistrationHandle;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.server.change.ChangeJson;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.testutil.ConfigSuite;
-import com.google.inject.Inject;
-import java.util.EnumSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-import org.eclipse.jgit.lib.Config;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-public class ActionsIT extends AbstractDaemonTest {
-  @ConfigSuite.Config
-  public static Config submitWholeTopicEnabled() {
-    return submitWholeTopicEnabledConfig();
-  }
-
-  @Inject private ChangeJson.Factory changeJsonFactory;
-
-  @Inject private DynamicSet<ActionVisitor> actionVisitors;
-
-  private RegistrationHandle visitorHandle;
-
-  @Before
-  public void setUp() {
-    visitorHandle = null;
-  }
-
-  @After
-  public void tearDown() {
-    if (visitorHandle != null) {
-      visitorHandle.remove();
-    }
-  }
-
-  @Test
-  public void revisionActionsOneChangePerTopicUnapproved() throws Exception {
-    String changeId = createChangeWithTopic().getChangeId();
-    Map<String, ActionInfo> actions = getActions(changeId);
-    assertThat(actions).hasSize(3);
-    assertThat(actions).containsKey("cherrypick");
-    assertThat(actions).containsKey("rebase");
-    assertThat(actions).containsKey("description");
-  }
-
-  @Test
-  public void revisionActionsOneChangePerTopic() throws Exception {
-    String changeId = createChangeWithTopic().getChangeId();
-    approve(changeId);
-    Map<String, ActionInfo> actions = getActions(changeId);
-    commonActionsAssertions(actions);
-    // We want to treat a single change in a topic not as a whole topic,
-    // so regardless of how submitWholeTopic is configured:
-    noSubmitWholeTopicAssertions(actions, 1);
-  }
-
-  @Test
-  public void revisionActionsTwoChangesInTopic() throws Exception {
-    String changeId = createChangeWithTopic().getChangeId();
-    approve(changeId);
-    String changeId2 = createChangeWithTopic().getChangeId();
-    Map<String, ActionInfo> actions = getActions(changeId);
-    commonActionsAssertions(actions);
-    if (isSubmitWholeTopicEnabled()) {
-      ActionInfo info = actions.get("submit");
-      assertThat(info.enabled).isNull();
-      assertThat(info.label).isEqualTo("Submit whole topic");
-      assertThat(info.method).isEqualTo("POST");
-      assertThat(info.title).isEqualTo("This change depends on other changes which are not ready");
-    } else {
-      noSubmitWholeTopicAssertions(actions, 1);
-
-      assertThat(getActions(changeId2).get("submit")).isNull();
-      approve(changeId2);
-      noSubmitWholeTopicAssertions(getActions(changeId2), 2);
-    }
-  }
-
-  @Test
-  public void revisionActionsETag() throws Exception {
-    String parent = createChange().getChangeId();
-    String change = createChangeWithTopic().getChangeId();
-    approve(change);
-    String etag1 = getETag(change);
-
-    approve(parent);
-    String etag2 = getETag(change);
-
-    String changeWithSameTopic = createChangeWithTopic().getChangeId();
-    String etag3 = getETag(change);
-
-    approve(changeWithSameTopic);
-    String etag4 = getETag(change);
-
-    if (isSubmitWholeTopicEnabled()) {
-      assertThat(ImmutableList.of(etag1, etag2, etag3, etag4)).containsNoDuplicates();
-    } else {
-      assertThat(etag2).isNotEqualTo(etag1);
-      assertThat(etag3).isEqualTo(etag2);
-      assertThat(etag4).isEqualTo(etag2);
-    }
-  }
-
-  @Test
-  public void revisionActionsAnonymousETag() throws Exception {
-    String parent = createChange().getChangeId();
-    String change = createChangeWithTopic().getChangeId();
-    approve(change);
-
-    setApiUserAnonymous();
-    String etag1 = getETag(change);
-
-    setApiUser(admin);
-    approve(parent);
-
-    setApiUserAnonymous();
-    String etag2 = getETag(change);
-
-    setApiUser(admin);
-    String changeWithSameTopic = createChangeWithTopic().getChangeId();
-
-    setApiUserAnonymous();
-    String etag3 = getETag(change);
-
-    setApiUser(admin);
-    approve(changeWithSameTopic);
-
-    setApiUserAnonymous();
-    String etag4 = getETag(change);
-
-    if (isSubmitWholeTopicEnabled()) {
-      assertThat(ImmutableList.of(etag1, etag2, etag3, etag4)).containsNoDuplicates();
-    } else {
-      assertThat(etag2).isNotEqualTo(etag1);
-      assertThat(etag3).isEqualTo(etag2);
-      assertThat(etag4).isEqualTo(etag2);
-    }
-  }
-
-  @Test
-  @TestProjectInput(submitType = SubmitType.CHERRY_PICK)
-  public void revisionActionsAnonymousETagCherryPickStrategy() throws Exception {
-    String parent = createChange().getChangeId();
-    String change = createChange().getChangeId();
-    approve(change);
-
-    setApiUserAnonymous();
-    String etag1 = getETag(change);
-
-    setApiUser(admin);
-    approve(parent);
-
-    setApiUserAnonymous();
-    String etag2 = getETag(change);
-    assertThat(etag2).isEqualTo(etag1);
-  }
-
-  @Test
-  public void revisionActionsTwoChangesInTopic_conflicting() throws Exception {
-    String changeId = createChangeWithTopic().getChangeId();
-    approve(changeId);
-
-    // create another change with the same topic
-    String changeId2 =
-        createChangeWithTopic(testRepo, "topic", "touching b", "b.txt", "real content")
-            .getChangeId();
-    int changeNum2 = gApi.changes().id(changeId2).info()._number;
-    approve(changeId2);
-
-    // collide with the other change in the same topic
-    testRepo.reset("HEAD~2");
-    String collidingChange =
-        createChangeWithTopic(
-                testRepo, "off_topic", "rewriting file b", "b.txt", "garbage\ngarbage\ngarbage")
-            .getChangeId();
-    gApi.changes().id(collidingChange).current().review(ReviewInput.approve());
-    gApi.changes().id(collidingChange).current().submit();
-
-    Map<String, ActionInfo> actions = getActions(changeId);
-    commonActionsAssertions(actions);
-    if (isSubmitWholeTopicEnabled()) {
-      ActionInfo info = actions.get("submit");
-      assertThat(info.enabled).isNull();
-      assertThat(info.label).isEqualTo("Submit whole topic");
-      assertThat(info.method).isEqualTo("POST");
-      assertThat(info.title).isEqualTo("Problems with change(s): " + changeNum2);
-    } else {
-      noSubmitWholeTopicAssertions(actions, 1);
-    }
-  }
-
-  @Test
-  public void revisionActionsTwoChangesInTopicWithAncestorReady() throws Exception {
-    String changeId = createChange().getChangeId();
-    approve(changeId);
-    approve(changeId);
-    String changeId1 = createChangeWithTopic().getChangeId();
-    approve(changeId1);
-    // create another change with the same topic
-    String changeId2 = createChangeWithTopic().getChangeId();
-    approve(changeId2);
-    Map<String, ActionInfo> actions = getActions(changeId1);
-    commonActionsAssertions(actions);
-    if (isSubmitWholeTopicEnabled()) {
-      ActionInfo info = actions.get("submit");
-      assertThat(info.enabled).isTrue();
-      assertThat(info.label).isEqualTo("Submit whole topic");
-      assertThat(info.method).isEqualTo("POST");
-      assertThat(info.title)
-          .isEqualTo(
-              "Submit all 2 changes of the same "
-                  + "topic (3 changes including ancestors "
-                  + "and other changes related by topic)");
-    } else {
-      noSubmitWholeTopicAssertions(actions, 2);
-    }
-  }
-
-  @Test
-  public void revisionActionsReadyWithAncestors() throws Exception {
-    String changeId = createChange().getChangeId();
-    approve(changeId);
-    approve(changeId);
-    String changeId1 = createChange().getChangeId();
-    approve(changeId1);
-    String changeId2 = createChangeWithTopic().getChangeId();
-    approve(changeId2);
-    Map<String, ActionInfo> actions = getActions(changeId2);
-    commonActionsAssertions(actions);
-    // The topic contains only one change, so standard text applies
-    noSubmitWholeTopicAssertions(actions, 3);
-  }
-
-  private void noSubmitWholeTopicAssertions(Map<String, ActionInfo> actions, int nrChanges) {
-    ActionInfo info = actions.get("submit");
-    assertThat(info.enabled).isTrue();
-    if (nrChanges == 1) {
-      assertThat(info.label).isEqualTo("Submit");
-    } else {
-      assertThat(info.label).isEqualTo("Submit including parents");
-    }
-    assertThat(info.method).isEqualTo("POST");
-    if (nrChanges == 1) {
-      assertThat(info.title).isEqualTo("Submit patch set 1 into master");
-    } else {
-      assertThat(info.title)
-          .isEqualTo(
-              String.format(
-                  "Submit patch set 1 and ancestors (%d changes altogether) into master",
-                  nrChanges));
-    }
-  }
-
-  @Test
-  public void changeActionVisitor() throws Exception {
-    String id = createChange().getChangeId();
-    ChangeInfo origChange = gApi.changes().id(id).get(CHANGE_ACTIONS);
-
-    class Visitor implements ActionVisitor {
-      @Override
-      public boolean visit(String name, ActionInfo actionInfo, ChangeInfo changeInfo) {
-        assertThat(changeInfo).isNotNull();
-        assertThat(changeInfo._number).isEqualTo(origChange._number);
-        if (name.equals("followup")) {
-          return false;
-        }
-        if (name.equals("abandon")) {
-          actionInfo.label = "Abandon All Hope";
-        }
-        return true;
-      }
-
-      @Override
-      public boolean visit(
-          String name, ActionInfo actionInfo, ChangeInfo changeInfo, RevisionInfo revisionInfo) {
-        throw new UnsupportedOperationException();
-      }
-    }
-
-    Map<String, ActionInfo> origActions = origChange.actions;
-    assertThat(origActions.keySet()).containsAllOf("followup", "abandon");
-    assertThat(origActions.get("abandon").label).isEqualTo("Abandon");
-
-    Visitor v = new Visitor();
-    visitorHandle = actionVisitors.add(v);
-
-    Map<String, ActionInfo> newActions =
-        gApi.changes().id(id).get(EnumSet.of(ListChangesOption.CHANGE_ACTIONS)).actions;
-
-    Set<String> expectedNames = new TreeSet<>(origActions.keySet());
-    expectedNames.remove("followup");
-    assertThat(newActions.keySet()).isEqualTo(expectedNames);
-
-    ActionInfo abandon = newActions.get("abandon");
-    assertThat(abandon).isNotNull();
-    assertThat(abandon.label).isEqualTo("Abandon All Hope");
-  }
-
-  @Test
-  public void currentRevisionActionVisitor() throws Exception {
-    String id = createChange().getChangeId();
-    amendChange(id);
-    ChangeInfo origChange = gApi.changes().id(id).get(CHANGE_ACTIONS);
-    Change.Id changeId = new Change.Id(origChange._number);
-
-    class Visitor implements ActionVisitor {
-      @Override
-      public boolean visit(String name, ActionInfo actionInfo, ChangeInfo changeInfo) {
-        return true; // Do nothing; implicitly called for CURRENT_ACTIONS.
-      }
-
-      @Override
-      public boolean visit(
-          String name, ActionInfo actionInfo, ChangeInfo changeInfo, RevisionInfo revisionInfo) {
-        assertThat(changeInfo).isNotNull();
-        assertThat(changeInfo._number).isEqualTo(origChange._number);
-        assertThat(revisionInfo).isNotNull();
-        assertThat(revisionInfo._number).isEqualTo(2);
-        if (name.equals("cherrypick")) {
-          return false;
-        }
-        if (name.equals("rebase")) {
-          actionInfo.label = "All Your Base";
-        }
-        return true;
-      }
-    }
-
-    Map<String, ActionInfo> origActions = gApi.changes().id(id).current().actions();
-    assertThat(origActions.keySet()).containsAllOf("cherrypick", "rebase");
-    assertThat(origActions.get("rebase").label).isEqualTo("Rebase");
-
-    Visitor v = new Visitor();
-    visitorHandle = actionVisitors.add(v);
-
-    // Test different codepaths within ActionJson...
-    // ...via revision API.
-    visitedCurrentRevisionActionsAssertions(origActions, gApi.changes().id(id).current().actions());
-
-    // ...via change API with option.
-    EnumSet<ListChangesOption> opts = EnumSet.of(CURRENT_ACTIONS, CURRENT_REVISION);
-    ChangeInfo changeInfo = gApi.changes().id(id).get(opts);
-    RevisionInfo revisionInfo = Iterables.getOnlyElement(changeInfo.revisions.values());
-    visitedCurrentRevisionActionsAssertions(origActions, revisionInfo.actions);
-
-    // ...via ChangeJson directly.
-    ChangeData cd = changeDataFactory.create(db, project, changeId);
-    revisionInfo =
-        changeJsonFactory
-            .create(opts)
-            .getRevisionInfo(cd, cd.patchSet(new PatchSet.Id(changeId, 1)));
-  }
-
-  private void visitedCurrentRevisionActionsAssertions(
-      Map<String, ActionInfo> origActions, Map<String, ActionInfo> newActions) {
-    assertThat(newActions).isNotNull();
-    Set<String> expectedNames = new TreeSet<>(origActions.keySet());
-    expectedNames.remove("cherrypick");
-    assertThat(newActions.keySet()).isEqualTo(expectedNames);
-
-    ActionInfo rebase = newActions.get("rebase");
-    assertThat(rebase).isNotNull();
-    assertThat(rebase.label).isEqualTo("All Your Base");
-  }
-
-  @Test
-  public void oldRevisionActionVisitor() throws Exception {
-    String id = createChange().getChangeId();
-    amendChange(id);
-    ChangeInfo origChange = gApi.changes().id(id).get(CHANGE_ACTIONS);
-
-    class Visitor implements ActionVisitor {
-      @Override
-      public boolean visit(String name, ActionInfo actionInfo, ChangeInfo changeInfo) {
-        return true; // Do nothing; implicitly called for CURRENT_ACTIONS.
-      }
-
-      @Override
-      public boolean visit(
-          String name, ActionInfo actionInfo, ChangeInfo changeInfo, RevisionInfo revisionInfo) {
-        assertThat(changeInfo).isNotNull();
-        assertThat(changeInfo._number).isEqualTo(origChange._number);
-        assertThat(revisionInfo).isNotNull();
-        assertThat(revisionInfo._number).isEqualTo(1);
-        if (name.equals("description")) {
-          actionInfo.label = "Describify";
-        }
-        return true;
-      }
-    }
-
-    Map<String, ActionInfo> origActions = gApi.changes().id(id).revision(1).actions();
-    assertThat(origActions.keySet()).containsExactly("description");
-    assertThat(origActions.get("description").label).isEqualTo("Edit Description");
-
-    Visitor v = new Visitor();
-    visitorHandle = actionVisitors.add(v);
-
-    // Unlike for the current revision, actions for old revisions are only available via the
-    // revision API.
-    Map<String, ActionInfo> newActions = gApi.changes().id(id).revision(1).actions();
-    assertThat(newActions).isNotNull();
-    assertThat(newActions.keySet()).isEqualTo(origActions.keySet());
-
-    ActionInfo description = newActions.get("description");
-    assertThat(description).isNotNull();
-    assertThat(description.label).isEqualTo("Describify");
-  }
-
-  private void commonActionsAssertions(Map<String, ActionInfo> actions) {
-    assertThat(actions).hasSize(4);
-    assertThat(actions).containsKey("cherrypick");
-    assertThat(actions).containsKey("submit");
-    assertThat(actions).containsKey("description");
-    assertThat(actions).containsKey("rebase");
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AssigneeIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AssigneeIT.java
deleted file mode 100644
index a905d38..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AssigneeIT.java
+++ /dev/null
@@ -1,193 +0,0 @@
-// 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.
-
-package com.google.gerrit.acceptance.rest.change;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.TruthJUnit.assume;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-import static java.util.concurrent.TimeUnit.SECONDS;
-
-import com.google.common.collect.Iterables;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.acceptance.Sandboxed;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.changes.AssigneeInput;
-import com.google.gerrit.extensions.client.ReviewerState;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.testutil.FakeEmailSender.Message;
-import com.google.gerrit.testutil.TestTimeUtil;
-import java.util.Iterator;
-import java.util.List;
-import org.eclipse.jgit.transport.RefSpec;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-@NoHttpd
-public class AssigneeIT extends AbstractDaemonTest {
-
-  @BeforeClass
-  public static void setTimeForTesting() {
-    TestTimeUtil.resetWithClockStep(1, SECONDS);
-  }
-
-  @AfterClass
-  public static void restoreTime() {
-    TestTimeUtil.useSystemTime();
-  }
-
-  @Test
-  public void getNoAssignee() throws Exception {
-    PushOneCommit.Result r = createChange();
-    assertThat(getAssignee(r)).isNull();
-  }
-
-  @Test
-  public void addGetAssignee() throws Exception {
-    PushOneCommit.Result r = createChange();
-    assertThat(setAssignee(r, user.email)._accountId).isEqualTo(user.getId().get());
-    assertThat(getAssignee(r)._accountId).isEqualTo(user.getId().get());
-
-    assertThat(sender.getMessages()).hasSize(1);
-    Message m = sender.getMessages().get(0);
-    assertThat(m.rcpt()).containsExactly(user.emailAddress);
-  }
-
-  @Test
-  public void setNewAssigneeWhenExists() throws Exception {
-    PushOneCommit.Result r = createChange();
-    setAssignee(r, user.email);
-    assertThat(setAssignee(r, user.email)._accountId).isEqualTo(user.getId().get());
-  }
-
-  @Test
-  public void getPastAssignees() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    PushOneCommit.Result r = createChange();
-    setAssignee(r, user.email);
-    setAssignee(r, admin.email);
-    List<AccountInfo> assignees = getPastAssignees(r);
-    assertThat(assignees).hasSize(2);
-    Iterator<AccountInfo> itr = assignees.iterator();
-    assertThat(itr.next()._accountId).isEqualTo(user.getId().get());
-    assertThat(itr.next()._accountId).isEqualTo(admin.getId().get());
-  }
-
-  @Test
-  public void assigneeAddedAsReviewer() throws Exception {
-    ReviewerState state;
-    // Assignee is added as CC, if back-end is reviewDb (that does not support
-    // CC) CC is stored as REVIEWER
-    if (notesMigration.readChanges()) {
-      state = ReviewerState.CC;
-    } else {
-      state = ReviewerState.REVIEWER;
-    }
-    PushOneCommit.Result r = createChange();
-    Iterable<AccountInfo> reviewers = getReviewers(r, state);
-    assertThat(reviewers).isNull();
-    assertThat(setAssignee(r, user.email)._accountId).isEqualTo(user.getId().get());
-    reviewers = getReviewers(r, state);
-    assertThat(reviewers).hasSize(1);
-    AccountInfo reviewer = Iterables.getFirst(reviewers, null);
-    assertThat(reviewer._accountId).isEqualTo(user.getId().get());
-  }
-
-  @Test
-  public void setAlreadyExistingAssignee() throws Exception {
-    PushOneCommit.Result r = createChange();
-    setAssignee(r, user.email);
-    assertThat(setAssignee(r, user.email)._accountId).isEqualTo(user.getId().get());
-  }
-
-  @Test
-  public void deleteAssignee() throws Exception {
-    PushOneCommit.Result r = createChange();
-    assertThat(setAssignee(r, user.email)._accountId).isEqualTo(user.getId().get());
-    assertThat(deleteAssignee(r)._accountId).isEqualTo(user.getId().get());
-    assertThat(getAssignee(r)).isNull();
-  }
-
-  @Test
-  public void deleteAssigneeWhenNoAssignee() throws Exception {
-    PushOneCommit.Result r = createChange();
-    assertThat(deleteAssignee(r)).isNull();
-  }
-
-  @Test
-  @Sandboxed
-  public void setAssigneeToInactiveUser() throws Exception {
-    PushOneCommit.Result r = createChange();
-    gApi.accounts().id(user.getId().get()).setActive(false);
-    exception.expect(UnprocessableEntityException.class);
-    exception.expectMessage("is not active");
-    setAssignee(r, user.email);
-  }
-
-  @Test
-  public void setAssigneeForNonVisibleChange() throws Exception {
-    git().fetch().setRefSpecs(new RefSpec("refs/meta/config:refs/meta/config")).call();
-    testRepo.reset(RefNames.REFS_CONFIG);
-    PushOneCommit.Result r = createChange("refs/for/refs/meta/config");
-    exception.expect(AuthException.class);
-    exception.expectMessage("read not permitted");
-    setAssignee(r, user.email);
-  }
-
-  @Test
-  public void setAssigneeNotAllowedWithoutPermission() throws Exception {
-    PushOneCommit.Result r = createChange();
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    exception.expectMessage("not permitted");
-    setAssignee(r, user.email);
-  }
-
-  @Test
-  public void setAssigneeAllowedWithPermission() throws Exception {
-    PushOneCommit.Result r = createChange();
-    grant(project, "refs/heads/master", Permission.EDIT_ASSIGNEE, false, REGISTERED_USERS);
-    setApiUser(user);
-    assertThat(setAssignee(r, user.email)._accountId).isEqualTo(user.getId().get());
-  }
-
-  private AccountInfo getAssignee(PushOneCommit.Result r) throws Exception {
-    return gApi.changes().id(r.getChange().getId().get()).getAssignee();
-  }
-
-  private List<AccountInfo> getPastAssignees(PushOneCommit.Result r) throws Exception {
-    return gApi.changes().id(r.getChange().getId().get()).getPastAssignees();
-  }
-
-  private Iterable<AccountInfo> getReviewers(PushOneCommit.Result r, ReviewerState state)
-      throws Exception {
-    return get(r.getChangeId()).reviewers.get(state);
-  }
-
-  private AccountInfo setAssignee(PushOneCommit.Result r, String identifieer) throws Exception {
-    AssigneeInput input = new AssigneeInput();
-    input.assignee = identifieer;
-    return gApi.changes().id(r.getChange().getId().get()).setAssignee(input);
-  }
-
-  private AccountInfo deleteAssignee(PushOneCommit.Result r) throws Exception {
-    return gApi.changes().id(r.getChange().getId().get()).deleteAssignee();
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/BUILD b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/BUILD
deleted file mode 100644
index b7ed2e8..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/BUILD
+++ /dev/null
@@ -1,38 +0,0 @@
-load("//gerrit-acceptance-tests:tests.bzl", "acceptance_tests")
-
-SUBMIT_UTIL_SRCS = glob(["AbstractSubmit*.java"])
-
-SUBMIT_TESTS = glob(["Submit*IT.java"])
-
-OTHER_TESTS = glob(
-    ["*IT.java"],
-    exclude = SUBMIT_TESTS,
-)
-
-acceptance_tests(
-    srcs = OTHER_TESTS,
-    group = "rest_change_other",
-    labels = ["rest"],
-    deps = [
-        ":submit_util",
-        "//lib/joda:joda-time",
-    ],
-)
-
-acceptance_tests(
-    srcs = SUBMIT_TESTS,
-    group = "rest_change_submit",
-    labels = ["rest"],
-    deps = [
-        ":submit_util",
-    ],
-)
-
-java_library(
-    name = "submit_util",
-    testonly = 1,
-    srcs = SUBMIT_UTIL_SRCS,
-    deps = [
-        "//gerrit-acceptance-tests:lib",
-    ],
-)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeIncludedInIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeIncludedInIT.java
deleted file mode 100644
index fbd55bb..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeIncludedInIT.java
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.acceptance.rest.change;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.PushOneCommit.Result;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.api.projects.TagInput;
-import com.google.gerrit.reviewdb.client.Branch;
-import org.junit.Test;
-
-@NoHttpd
-public class ChangeIncludedInIT extends AbstractDaemonTest {
-
-  @Test
-  public void includedInOpenChange() throws Exception {
-    Result result = createChange();
-    assertThat(gApi.changes().id(result.getChangeId()).includedIn().branches).isEmpty();
-    assertThat(gApi.changes().id(result.getChangeId()).includedIn().tags).isEmpty();
-  }
-
-  @Test
-  public void includedInMergedChange() throws Exception {
-    Result result = createChange();
-    gApi.changes()
-        .id(result.getChangeId())
-        .revision(result.getCommit().name())
-        .review(ReviewInput.approve());
-    gApi.changes().id(result.getChangeId()).revision(result.getCommit().name()).submit();
-
-    assertThat(gApi.changes().id(result.getChangeId()).includedIn().branches)
-        .containsExactly("master");
-    assertThat(gApi.changes().id(result.getChangeId()).includedIn().tags).isEmpty();
-
-    grantTagPermissions();
-    gApi.projects().name(project.get()).tag("test-tag").create(new TagInput());
-
-    assertThat(gApi.changes().id(result.getChangeId()).includedIn().tags)
-        .containsExactly("test-tag");
-
-    createBranch(new Branch.NameKey(project.get(), "test-branch"));
-
-    assertThat(gApi.changes().id(result.getChangeId()).includedIn().branches)
-        .containsExactly("master", "test-branch");
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeMessagesIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeMessagesIT.java
deleted file mode 100644
index 4c49e4c..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeMessagesIT.java
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.acceptance.rest.change;
-
-import static com.google.common.truth.Truth.assertThat;
-import static java.util.concurrent.TimeUnit.SECONDS;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.ChangeMessageInfo;
-import com.google.gerrit.testutil.ConfigSuite;
-import com.google.gerrit.testutil.TestTimeUtil;
-import java.util.Iterator;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(ConfigSuite.class)
-public class ChangeMessagesIT extends AbstractDaemonTest {
-  private String systemTimeZone;
-
-  @Before
-  public void setTimeForTesting() {
-    systemTimeZone = System.setProperty("user.timezone", "US/Eastern");
-    TestTimeUtil.resetWithClockStep(1, SECONDS);
-  }
-
-  @After
-  public void resetTime() {
-    TestTimeUtil.useSystemTime();
-    System.setProperty("user.timezone", systemTimeZone);
-  }
-
-  @Test
-  public void messagesNotReturnedByDefault() throws Exception {
-    String changeId = createChange().getChangeId();
-    postMessage(changeId, "Some nits need to be fixed.");
-    ChangeInfo c = info(changeId);
-    assertThat(c.messages).isNull();
-  }
-
-  @Test
-  public void defaultMessage() throws Exception {
-    String changeId = createChange().getChangeId();
-    ChangeInfo c = get(changeId);
-    assertThat(c.messages).isNotNull();
-    assertThat(c.messages).hasSize(1);
-    assertThat(c.messages.iterator().next().message).isEqualTo("Uploaded patch set 1.");
-  }
-
-  @Test
-  public void messagesReturnedInChronologicalOrder() throws Exception {
-    String changeId = createChange().getChangeId();
-    String firstMessage = "Some nits need to be fixed.";
-    postMessage(changeId, firstMessage);
-    String secondMessage = "I like this feature.";
-    postMessage(changeId, secondMessage);
-    ChangeInfo c = get(changeId);
-    assertThat(c.messages).isNotNull();
-    assertThat(c.messages).hasSize(3);
-    Iterator<ChangeMessageInfo> it = c.messages.iterator();
-    assertThat(it.next().message).isEqualTo("Uploaded patch set 1.");
-    assertMessage(firstMessage, it.next().message);
-    assertMessage(secondMessage, it.next().message);
-  }
-
-  @Test
-  public void postMessageWithTag() throws Exception {
-    String changeId = createChange().getChangeId();
-    String tag = "jenkins";
-    String msg = "Message with tag.";
-    postMessage(changeId, msg, tag);
-    ChangeInfo c = get(changeId);
-    assertThat(c.messages).isNotNull();
-    assertThat(c.messages).hasSize(2);
-    Iterator<ChangeMessageInfo> it = c.messages.iterator();
-    assertThat(it.next().message).isEqualTo("Uploaded patch set 1.");
-    ChangeMessageInfo actual = it.next();
-    assertMessage(msg, actual.message);
-    assertThat(actual.tag).isEqualTo(tag);
-  }
-
-  private void assertMessage(String expected, String actual) {
-    assertThat(actual).isEqualTo("Patch Set 1:\n\n" + expected);
-  }
-
-  private void postMessage(String changeId, String msg) throws Exception {
-    postMessage(changeId, msg, null);
-  }
-
-  private void postMessage(String changeId, String msg, String tag) throws Exception {
-    ReviewInput in = new ReviewInput();
-    in.message = msg;
-    in.tag = tag;
-    gApi.changes().id(changeId).current().review(in);
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeReviewersByEmailIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeReviewersByEmailIT.java
deleted file mode 100644
index f4526e5..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeReviewersByEmailIT.java
+++ /dev/null
@@ -1,325 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.acceptance.rest.change;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.TruthJUnit.assume;
-import static com.google.gerrit.extensions.client.ListChangesOption.DETAILED_LABELS;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.extensions.api.changes.AddReviewerInput;
-import com.google.gerrit.extensions.api.changes.AddReviewerResult;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.api.projects.ConfigInput;
-import com.google.gerrit.extensions.client.InheritableBoolean;
-import com.google.gerrit.extensions.client.ReviewerState;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.testutil.FakeEmailSender.Message;
-import java.util.List;
-import org.junit.Before;
-import org.junit.Test;
-
-@NoHttpd
-public class ChangeReviewersByEmailIT extends AbstractDaemonTest {
-
-  @Before
-  public void setUp() throws Exception {
-    ConfigInput conf = new ConfigInput();
-    conf.enableReviewerByEmail = InheritableBoolean.TRUE;
-    gApi.projects().name(project.get()).config(conf);
-  }
-
-  @Test
-  public void addByEmail() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    AccountInfo acc = new AccountInfo("Foo Bar", "foo.bar@gerritcodereview.com");
-
-    for (ReviewerState state : ImmutableList.of(ReviewerState.CC, ReviewerState.REVIEWER)) {
-      PushOneCommit.Result r = createChange();
-
-      AddReviewerInput input = new AddReviewerInput();
-      input.reviewer = toRfcAddressString(acc);
-      input.state = state;
-      gApi.changes().id(r.getChangeId()).addReviewer(input);
-
-      ChangeInfo info = gApi.changes().id(r.getChangeId()).get(DETAILED_LABELS);
-      assertThat(info.reviewers).isEqualTo(ImmutableMap.of(state, ImmutableList.of(acc)));
-      // All reviewers added by email should be removable
-      assertThat(info.removableReviewers).isEqualTo(ImmutableList.of(acc));
-    }
-  }
-
-  @Test
-  public void addByEmailAndById() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    AccountInfo byEmail = new AccountInfo("Foo Bar", "foo.bar@gerritcodereview.com");
-    AccountInfo byId = new AccountInfo(user.id.get());
-
-    for (ReviewerState state : ImmutableList.of(ReviewerState.CC, ReviewerState.REVIEWER)) {
-      PushOneCommit.Result r = createChange();
-
-      AddReviewerInput inputByEmail = new AddReviewerInput();
-      inputByEmail.reviewer = toRfcAddressString(byEmail);
-      inputByEmail.state = state;
-      gApi.changes().id(r.getChangeId()).addReviewer(inputByEmail);
-
-      AddReviewerInput inputById = new AddReviewerInput();
-      inputById.reviewer = user.email;
-      inputById.state = state;
-      gApi.changes().id(r.getChangeId()).addReviewer(inputById);
-
-      ChangeInfo info = gApi.changes().id(r.getChangeId()).get(DETAILED_LABELS);
-      assertThat(info.reviewers).isEqualTo(ImmutableMap.of(state, ImmutableList.of(byId, byEmail)));
-      // All reviewers (both by id and by email) should be removable
-      assertThat(info.removableReviewers).isEqualTo(ImmutableList.of(byId, byEmail));
-    }
-  }
-
-  @Test
-  public void removeByEmail() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    AccountInfo acc = new AccountInfo("Foo Bar", "foo.bar@gerritcodereview.com");
-
-    for (ReviewerState state : ImmutableList.of(ReviewerState.CC, ReviewerState.REVIEWER)) {
-      PushOneCommit.Result r = createChange();
-
-      AddReviewerInput addInput = new AddReviewerInput();
-      addInput.reviewer = toRfcAddressString(acc);
-      addInput.state = state;
-      gApi.changes().id(r.getChangeId()).addReviewer(addInput);
-
-      gApi.changes().id(r.getChangeId()).reviewer(acc.email).remove();
-
-      ChangeInfo info = gApi.changes().id(r.getChangeId()).get(DETAILED_LABELS);
-      assertThat(info.reviewers).isEmpty();
-    }
-  }
-
-  @Test
-  public void convertFromCCToReviewer() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    AccountInfo acc = new AccountInfo("Foo Bar", "foo.bar@gerritcodereview.com");
-
-    PushOneCommit.Result r = createChange();
-
-    AddReviewerInput addInput = new AddReviewerInput();
-    addInput.reviewer = toRfcAddressString(acc);
-    addInput.state = ReviewerState.CC;
-    gApi.changes().id(r.getChangeId()).addReviewer(addInput);
-
-    AddReviewerInput modifyInput = new AddReviewerInput();
-    modifyInput.reviewer = addInput.reviewer;
-    modifyInput.state = ReviewerState.REVIEWER;
-    gApi.changes().id(r.getChangeId()).addReviewer(modifyInput);
-
-    ChangeInfo info = gApi.changes().id(r.getChangeId()).get(DETAILED_LABELS);
-    assertThat(info.reviewers)
-        .isEqualTo(ImmutableMap.of(ReviewerState.REVIEWER, ImmutableList.of(acc)));
-  }
-
-  @Test
-  public void addedReviewersGetNotified() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    AccountInfo acc = new AccountInfo("Foo Bar", "foo.bar@gerritcodereview.com");
-
-    for (ReviewerState state : ImmutableList.of(ReviewerState.CC, ReviewerState.REVIEWER)) {
-      PushOneCommit.Result r = createChange();
-
-      AddReviewerInput input = new AddReviewerInput();
-      input.reviewer = toRfcAddressString(acc);
-      input.state = state;
-      gApi.changes().id(r.getChangeId()).addReviewer(input);
-
-      List<Message> messages = sender.getMessages();
-      assertThat(messages).hasSize(1);
-      assertThat(messages.get(0).rcpt()).containsExactly(Address.parse(input.reviewer));
-      sender.clear();
-    }
-  }
-
-  @Test
-  public void removingReviewerTriggersNotification() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    AccountInfo acc = new AccountInfo("Foo Bar", "foo.bar@gerritcodereview.com");
-
-    for (ReviewerState state : ImmutableList.of(ReviewerState.CC, ReviewerState.REVIEWER)) {
-      PushOneCommit.Result r = createChange();
-
-      AddReviewerInput addInput = new AddReviewerInput();
-      addInput.reviewer = toRfcAddressString(acc);
-      addInput.state = state;
-      gApi.changes().id(r.getChangeId()).addReviewer(addInput);
-
-      // Review change as user
-      ReviewInput reviewInput = new ReviewInput();
-      reviewInput.message = "I have a comment";
-      setApiUser(user);
-      revision(r).review(reviewInput);
-      setApiUser(admin);
-
-      sender.clear();
-
-      // Delete as admin
-      gApi.changes().id(r.getChangeId()).reviewer(addInput.reviewer).remove();
-
-      List<Message> messages = sender.getMessages();
-      assertThat(messages).hasSize(1);
-      assertThat(messages.get(0).rcpt())
-          .containsExactly(Address.parse(addInput.reviewer), user.emailAddress);
-      sender.clear();
-    }
-  }
-
-  @Test
-  public void reviewerAndCCReceiveRegularNotification() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    AccountInfo acc = new AccountInfo("Foo Bar", "foo.bar@gerritcodereview.com");
-
-    for (ReviewerState state : ImmutableList.of(ReviewerState.CC, ReviewerState.REVIEWER)) {
-      PushOneCommit.Result r = createChange();
-
-      AddReviewerInput input = new AddReviewerInput();
-      input.reviewer = toRfcAddressString(acc);
-      input.state = state;
-      gApi.changes().id(r.getChangeId()).addReviewer(input);
-      sender.clear();
-
-      gApi.changes()
-          .id(r.getChangeId())
-          .revision(r.getCommit().name())
-          .review(ReviewInput.approve());
-
-      assertNotifyCc(Address.parse(input.reviewer));
-    }
-  }
-
-  @Test
-  public void reviewerAndCCReceiveSameEmail() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    PushOneCommit.Result r = createChange();
-    for (ReviewerState state : ImmutableList.of(ReviewerState.CC, ReviewerState.REVIEWER)) {
-      for (int i = 0; i < 10; i++) {
-        AddReviewerInput input = new AddReviewerInput();
-        input.reviewer = String.format("%s-%s@gerritcodereview.com", state, i);
-        input.state = state;
-        gApi.changes().id(r.getChangeId()).addReviewer(input);
-      }
-    }
-
-    // Also add user as a regular reviewer
-    AddReviewerInput input = new AddReviewerInput();
-    input.reviewer = user.email;
-    input.state = ReviewerState.REVIEWER;
-    gApi.changes().id(r.getChangeId()).addReviewer(input);
-
-    sender.clear();
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
-    // Assert that only one email was sent out to everyone
-    assertThat(sender.getMessages()).hasSize(1);
-  }
-
-  @Test
-  public void addingMultipleReviewersAndCCsAtOnceSendsOnlyOneEmail() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    PushOneCommit.Result r = createChange();
-    ReviewInput reviewInput = new ReviewInput();
-    for (ReviewerState state : ImmutableList.of(ReviewerState.CC, ReviewerState.REVIEWER)) {
-      for (int i = 0; i < 10; i++) {
-        reviewInput.reviewer(String.format("%s-%s@gerritcodereview.com", state, i), state, true);
-      }
-    }
-    assertThat(reviewInput.reviewers).hasSize(20);
-
-    sender.clear();
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(reviewInput);
-    assertThat(sender.getMessages()).hasSize(1);
-  }
-
-  @Test
-  public void rejectMissingEmail() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    PushOneCommit.Result r = createChange();
-
-    AddReviewerResult result = gApi.changes().id(r.getChangeId()).addReviewer("");
-    assertThat(result.error).isEqualTo(" is not a valid user identifier");
-    assertThat(result.reviewers).isNull();
-  }
-
-  @Test
-  public void rejectMalformedEmail() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    PushOneCommit.Result r = createChange();
-
-    AddReviewerResult result = gApi.changes().id(r.getChangeId()).addReviewer("Foo Bar <foo.bar@");
-    assertThat(result.error).isEqualTo("Foo Bar <foo.bar@ is not a valid user identifier");
-    assertThat(result.reviewers).isNull();
-  }
-
-  @Test
-  public void rejectWhenFeatureIsDisabled() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    ConfigInput conf = new ConfigInput();
-    conf.enableReviewerByEmail = InheritableBoolean.FALSE;
-    gApi.projects().name(project.get()).config(conf);
-
-    PushOneCommit.Result r = createChange();
-
-    AddReviewerResult result =
-        gApi.changes().id(r.getChangeId()).addReviewer("Foo Bar <foo.bar@gerritcodereview.com>");
-    assertThat(result.error)
-        .isEqualTo(
-            "Foo Bar <foo.bar@gerritcodereview.com> does not identify a registered user or group");
-    assertThat(result.reviewers).isNull();
-  }
-
-  @Test
-  public void reviewersByEmailAreServedFromIndex() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    AccountInfo acc = new AccountInfo("Foo Bar", "foo.bar@gerritcodereview.com");
-
-    for (ReviewerState state : ImmutableList.of(ReviewerState.CC, ReviewerState.REVIEWER)) {
-      PushOneCommit.Result r = createChange();
-
-      AddReviewerInput input = new AddReviewerInput();
-      input.reviewer = toRfcAddressString(acc);
-      input.state = state;
-      gApi.changes().id(r.getChangeId()).addReviewer(input);
-
-      notesMigration.setFailOnLoadForTest(true);
-      try {
-        ChangeInfo info =
-            Iterables.getOnlyElement(
-                gApi.changes().query(r.getChangeId()).withOption(DETAILED_LABELS).get());
-        assertThat(info.reviewers).isEqualTo(ImmutableMap.of(state, ImmutableList.of(acc)));
-      } finally {
-        notesMigration.setFailOnLoadForTest(false);
-      }
-    }
-  }
-
-  private static String toRfcAddressString(AccountInfo info) {
-    return (new Address(info.name, info.email)).toString();
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeReviewersIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeReviewersIT.java
deleted file mode 100644
index 76b7646..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeReviewersIT.java
+++ /dev/null
@@ -1,880 +0,0 @@
-// 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.
-
-package com.google.gerrit.acceptance.rest.change;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.TruthJUnit.assume;
-import static com.google.gerrit.extensions.client.ListChangesOption.DETAILED_LABELS;
-import static com.google.gerrit.extensions.client.ReviewerState.CC;
-import static com.google.gerrit.extensions.client.ReviewerState.REMOVED;
-import static com.google.gerrit.extensions.client.ReviewerState.REVIEWER;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
-import static javax.servlet.http.HttpServletResponse.SC_OK;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.acceptance.RestResponse;
-import com.google.gerrit.acceptance.Sandboxed;
-import com.google.gerrit.acceptance.TestAccount;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.changes.AddReviewerInput;
-import com.google.gerrit.extensions.api.changes.AddReviewerResult;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.api.changes.NotifyInfo;
-import com.google.gerrit.extensions.api.changes.RecipientType;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.api.changes.ReviewResult;
-import com.google.gerrit.extensions.client.ReviewerState;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.ApprovalInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.LabelInfo;
-import com.google.gerrit.extensions.common.ReviewerUpdateInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.change.PostReviewers;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.testutil.FakeEmailSender.Message;
-import com.google.gson.stream.JsonReader;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import org.junit.Test;
-
-public class ChangeReviewersIT extends AbstractDaemonTest {
-  @Test
-  public void addGroupAsReviewer() throws Exception {
-    // Set up two groups, one that is too large too add as reviewer, and one
-    // that is too large to add without confirmation.
-    String largeGroup = createGroup("largeGroup");
-    String mediumGroup = createGroup("mediumGroup");
-
-    int largeGroupSize = PostReviewers.DEFAULT_MAX_REVIEWERS + 1;
-    int mediumGroupSize = PostReviewers.DEFAULT_MAX_REVIEWERS_WITHOUT_CHECK + 1;
-    List<TestAccount> users = createAccounts(largeGroupSize, "addGroupAsReviewer");
-    List<String> largeGroupUsernames = new ArrayList<>(mediumGroupSize);
-    for (TestAccount u : users) {
-      largeGroupUsernames.add(u.username);
-    }
-    List<String> mediumGroupUsernames = largeGroupUsernames.subList(0, mediumGroupSize);
-    gApi.groups()
-        .id(largeGroup)
-        .addMembers(largeGroupUsernames.toArray(new String[largeGroupSize]));
-    gApi.groups()
-        .id(mediumGroup)
-        .addMembers(mediumGroupUsernames.toArray(new String[mediumGroupSize]));
-
-    // Attempt to add overly large group as reviewers.
-    PushOneCommit.Result r = createChange();
-    String changeId = r.getChangeId();
-    AddReviewerResult result = addReviewer(changeId, largeGroup);
-    assertThat(result.input).isEqualTo(largeGroup);
-    assertThat(result.confirm).isNull();
-    assertThat(result.error).contains("has too many members to add them all as reviewers");
-    assertThat(result.reviewers).isNull();
-
-    // Attempt to add medium group without confirmation.
-    result = addReviewer(changeId, mediumGroup);
-    assertThat(result.input).isEqualTo(mediumGroup);
-    assertThat(result.confirm).isTrue();
-    assertThat(result.error)
-        .contains("has " + mediumGroupSize + " members. Do you want to add them all as reviewers?");
-    assertThat(result.reviewers).isNull();
-
-    // Add medium group with confirmation.
-    AddReviewerInput in = new AddReviewerInput();
-    in.reviewer = mediumGroup;
-    in.confirmed = true;
-    result = addReviewer(changeId, in);
-    assertThat(result.input).isEqualTo(mediumGroup);
-    assertThat(result.confirm).isNull();
-    assertThat(result.error).isNull();
-    assertThat(result.reviewers).hasSize(mediumGroupSize);
-
-    // Verify that group members were added as reviewers.
-    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
-    assertReviewers(c, REVIEWER, users.subList(0, mediumGroupSize));
-  }
-
-  @Test
-  public void addCcAccount() throws Exception {
-    PushOneCommit.Result r = createChange();
-    String changeId = r.getChangeId();
-    AddReviewerInput in = new AddReviewerInput();
-    in.reviewer = user.email;
-    in.state = CC;
-    AddReviewerResult result = addReviewer(changeId, in);
-
-    assertThat(result.input).isEqualTo(user.email);
-    assertThat(result.confirm).isNull();
-    assertThat(result.error).isNull();
-    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
-    if (notesMigration.readChanges()) {
-      assertThat(result.reviewers).isNull();
-      assertThat(result.ccs).hasSize(1);
-      AccountInfo ai = result.ccs.get(0);
-      assertThat(ai._accountId).isEqualTo(user.id.get());
-      assertReviewers(c, CC, user);
-    } else {
-      assertThat(result.ccs).isNull();
-      assertThat(result.reviewers).hasSize(1);
-      AccountInfo ai = result.reviewers.get(0);
-      assertThat(ai._accountId).isEqualTo(user.id.get());
-      assertReviewers(c, REVIEWER, user);
-    }
-
-    // Verify email was sent to CCed account.
-    List<Message> messages = sender.getMessages();
-    assertThat(messages).hasSize(1);
-    Message m = messages.get(0);
-    assertThat(m.rcpt()).containsExactly(user.emailAddress);
-    if (notesMigration.readChanges()) {
-      assertThat(m.body()).contains(admin.fullName + " has uploaded this change for review.");
-    } else {
-      assertThat(m.body()).contains("Hello " + user.fullName + ",\n");
-      assertThat(m.body()).contains("I'd like you to do a code review.");
-    }
-  }
-
-  @Test
-  public void addCcGroup() throws Exception {
-    List<TestAccount> users = createAccounts(6, "addCcGroup");
-    List<String> usernames = new ArrayList<>(6);
-    for (TestAccount u : users) {
-      usernames.add(u.username);
-    }
-
-    List<TestAccount> firstUsers = users.subList(0, 3);
-    List<String> firstUsernames = usernames.subList(0, 3);
-
-    PushOneCommit.Result r = createChange();
-    String changeId = r.getChangeId();
-    AddReviewerInput in = new AddReviewerInput();
-    in.reviewer = createGroup("cc1");
-    in.state = CC;
-    gApi.groups()
-        .id(in.reviewer)
-        .addMembers(firstUsernames.toArray(new String[firstUsernames.size()]));
-    AddReviewerResult result = addReviewer(changeId, in);
-
-    assertThat(result.input).isEqualTo(in.reviewer);
-    assertThat(result.confirm).isNull();
-    assertThat(result.error).isNull();
-    if (notesMigration.readChanges()) {
-      assertThat(result.reviewers).isNull();
-    } else {
-      assertThat(result.ccs).isNull();
-    }
-    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
-    if (notesMigration.readChanges()) {
-      assertReviewers(c, CC, firstUsers);
-    } else {
-      assertReviewers(c, REVIEWER, firstUsers);
-      assertReviewers(c, CC);
-    }
-
-    // Verify emails were sent to each of the group's accounts.
-    List<Message> messages = sender.getMessages();
-    assertThat(messages).hasSize(1);
-    Message m = messages.get(0);
-    List<Address> expectedAddresses = new ArrayList<>(firstUsers.size());
-    for (TestAccount u : firstUsers) {
-      expectedAddresses.add(u.emailAddress);
-    }
-    assertThat(m.rcpt()).containsExactlyElementsIn(expectedAddresses);
-
-    // CC a group that overlaps with some existing reviewers and CCed accounts.
-    TestAccount reviewer =
-        accountCreator.create(name("reviewer"), "addCcGroup-reviewer@example.com", "Reviewer");
-    result = addReviewer(changeId, reviewer.username);
-    assertThat(result.error).isNull();
-    sender.clear();
-    in.reviewer = createGroup("cc2");
-    gApi.groups().id(in.reviewer).addMembers(usernames.toArray(new String[usernames.size()]));
-    gApi.groups().id(in.reviewer).addMembers(reviewer.username);
-    result = addReviewer(changeId, in);
-    assertThat(result.input).isEqualTo(in.reviewer);
-    assertThat(result.confirm).isNull();
-    assertThat(result.error).isNull();
-    c = gApi.changes().id(r.getChangeId()).get();
-    if (notesMigration.readChanges()) {
-      assertThat(result.ccs).hasSize(3);
-      assertThat(result.reviewers).isNull();
-      assertReviewers(c, REVIEWER, reviewer);
-      assertReviewers(c, CC, users);
-    } else {
-      assertThat(result.ccs).isNull();
-      assertThat(result.reviewers).hasSize(3);
-      List<TestAccount> expectedUsers = new ArrayList<>(users.size() + 2);
-      expectedUsers.addAll(users);
-      expectedUsers.add(reviewer);
-      assertReviewers(c, REVIEWER, expectedUsers);
-    }
-
-    messages = sender.getMessages();
-    assertThat(messages).hasSize(1);
-    m = messages.get(0);
-    expectedAddresses = new ArrayList<>(4);
-    for (int i = 0; i < 3; i++) {
-      expectedAddresses.add(users.get(users.size() - i - 1).emailAddress);
-    }
-    if (!notesMigration.readChanges()) {
-      for (int i = 0; i < 3; i++) {
-        expectedAddresses.add(users.get(i).emailAddress);
-      }
-    }
-    expectedAddresses.add(reviewer.emailAddress);
-    assertThat(m.rcpt()).containsExactlyElementsIn(expectedAddresses);
-  }
-
-  @Test
-  public void transitionCcToReviewer() throws Exception {
-    PushOneCommit.Result r = createChange();
-    String changeId = r.getChangeId();
-    AddReviewerInput in = new AddReviewerInput();
-    in.reviewer = user.email;
-    in.state = CC;
-    addReviewer(changeId, in);
-    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
-    if (notesMigration.readChanges()) {
-      assertReviewers(c, REVIEWER);
-      assertReviewers(c, CC, user);
-    } else {
-      assertReviewers(c, REVIEWER, user);
-      assertReviewers(c, CC);
-    }
-
-    in.state = REVIEWER;
-    addReviewer(changeId, in);
-    c = gApi.changes().id(r.getChangeId()).get();
-    assertReviewers(c, REVIEWER, user);
-    assertReviewers(c, CC);
-  }
-
-  @Test
-  public void driveByComment() throws Exception {
-    // Create change owned by admin.
-    PushOneCommit.Result r = createChange();
-
-    // Post drive-by message as user.
-    ReviewInput input = new ReviewInput().message("hello");
-    RestResponse resp =
-        userRestSession.post(
-            "/changes/" + r.getChangeId() + "/revisions/" + r.getCommit().getName() + "/review",
-            input);
-    ReviewResult result = readContentFromJson(resp, 200, ReviewResult.class);
-    assertThat(result.labels).isNull();
-    assertThat(result.reviewers).isNull();
-
-    // Verify user is added to CC list.
-    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
-    if (notesMigration.readChanges()) {
-      assertReviewers(c, REVIEWER);
-      assertReviewers(c, CC, user);
-    } else {
-      // If we aren't reading from NoteDb, the user will appear as a
-      // reviewer.
-      assertReviewers(c, REVIEWER, user);
-      assertReviewers(c, CC);
-    }
-  }
-
-  @Test
-  public void addSelfAsReviewer() throws Exception {
-    // Create change owned by admin.
-    PushOneCommit.Result r = createChange();
-
-    // user adds self as REVIEWER.
-    ReviewInput input = new ReviewInput().reviewer(user.username);
-    RestResponse resp =
-        userRestSession.post(
-            "/changes/" + r.getChangeId() + "/revisions/" + r.getCommit().getName() + "/review",
-            input);
-    ReviewResult result = readContentFromJson(resp, 200, ReviewResult.class);
-    assertThat(result.labels).isNull();
-    assertThat(result.reviewers).isNotNull();
-    assertThat(result.reviewers).hasSize(1);
-
-    // Verify reviewer state.
-    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
-    assertReviewers(c, REVIEWER, user);
-    assertReviewers(c, CC);
-    LabelInfo label = c.labels.get("Code-Review");
-    assertThat(label).isNotNull();
-    assertThat(label.all).isNotNull();
-    assertThat(label.all).hasSize(1);
-    ApprovalInfo approval = label.all.get(0);
-    assertThat(approval._accountId).isEqualTo(user.getId().get());
-  }
-
-  @Test
-  public void addSelfAsCc() throws Exception {
-    // Create change owned by admin.
-    PushOneCommit.Result r = createChange();
-
-    // user adds self as CC.
-    ReviewInput input = new ReviewInput().reviewer(user.username, CC, false);
-    RestResponse resp =
-        userRestSession.post(
-            "/changes/" + r.getChangeId() + "/revisions/" + r.getCommit().getName() + "/review",
-            input);
-    ReviewResult result = readContentFromJson(resp, 200, ReviewResult.class);
-    assertThat(result.labels).isNull();
-    assertThat(result.reviewers).isNotNull();
-    assertThat(result.reviewers).hasSize(1);
-
-    // Verify reviewer state.
-    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
-    if (notesMigration.readChanges()) {
-      assertReviewers(c, REVIEWER);
-      assertReviewers(c, CC, user);
-      // Verify no approvals were added.
-      assertThat(c.labels).isNotNull();
-      LabelInfo label = c.labels.get("Code-Review");
-      assertThat(label).isNotNull();
-      assertThat(label.all).isNull();
-    } else {
-      // When approvals are stored in ReviewDb, we still create a label for
-      // the reviewing user, and force them into the REVIEWER state.
-      assertReviewers(c, REVIEWER, user);
-      assertReviewers(c, CC);
-      LabelInfo label = c.labels.get("Code-Review");
-      assertThat(label).isNotNull();
-      assertThat(label.all).isNotNull();
-      assertThat(label.all).hasSize(1);
-      ApprovalInfo approval = label.all.get(0);
-      assertThat(approval._accountId).isEqualTo(user.getId().get());
-    }
-  }
-
-  @Test
-  public void reviewerReplyWithoutVote() throws Exception {
-    // Create change owned by admin.
-    PushOneCommit.Result r = createChange();
-
-    // Verify reviewer state.
-    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
-    assertReviewers(c, REVIEWER);
-    assertReviewers(c, CC);
-    LabelInfo label = c.labels.get("Code-Review");
-    assertThat(label).isNotNull();
-    assertThat(label.all).isNull();
-
-    // Add user as REVIEWER.
-    ReviewInput input = new ReviewInput().reviewer(user.username);
-    ReviewResult result = review(r.getChangeId(), r.getCommit().name(), input);
-    assertThat(result.labels).isNull();
-    assertThat(result.reviewers).isNotNull();
-    assertThat(result.reviewers).hasSize(1);
-
-    // Verify reviewer state. Both admin and user should be REVIEWERs now,
-    // because admin gets forced into REVIEWER state by virtue of being owner.
-    c = gApi.changes().id(r.getChangeId()).get();
-    assertReviewers(c, REVIEWER, admin, user);
-    assertReviewers(c, CC);
-    label = c.labels.get("Code-Review");
-    assertThat(label).isNotNull();
-    assertThat(label.all).isNotNull();
-    assertThat(label.all).hasSize(2);
-    Map<Integer, Integer> approvals = new HashMap<>();
-    for (ApprovalInfo approval : label.all) {
-      approvals.put(approval._accountId, approval.value);
-    }
-    assertThat(approvals).containsEntry(admin.getId().get(), 0);
-    assertThat(approvals).containsEntry(user.getId().get(), 0);
-
-    // Comment as user without voting. This should delete the approval and
-    // then replace it with the default value.
-    input = new ReviewInput().message("hello");
-    RestResponse resp =
-        userRestSession.post(
-            "/changes/" + r.getChangeId() + "/revisions/" + r.getCommit().getName() + "/review",
-            input);
-    result = readContentFromJson(resp, 200, ReviewResult.class);
-    assertThat(result.labels).isNull();
-
-    // Verify reviewer state.
-    c = gApi.changes().id(r.getChangeId()).get();
-    assertReviewers(c, REVIEWER, admin, user);
-    assertReviewers(c, CC);
-    label = c.labels.get("Code-Review");
-    assertThat(label).isNotNull();
-    assertThat(label.all).isNotNull();
-    assertThat(label.all).hasSize(2);
-    approvals.clear();
-    for (ApprovalInfo approval : label.all) {
-      approvals.put(approval._accountId, approval.value);
-    }
-    assertThat(approvals).containsEntry(admin.getId().get(), 0);
-    assertThat(approvals).containsEntry(user.getId().get(), 0);
-  }
-
-  @Test
-  public void reviewAndAddReviewers() throws Exception {
-    TestAccount observer = accountCreator.user2();
-    PushOneCommit.Result r = createChange();
-    ReviewInput input =
-        ReviewInput.approve().reviewer(user.email).reviewer(observer.email, CC, false);
-
-    ReviewResult result = review(r.getChangeId(), r.getCommit().name(), input);
-    assertThat(result.labels).isNotNull();
-    assertThat(result.reviewers).isNotNull();
-    assertThat(result.reviewers).hasSize(2);
-
-    // Verify reviewer and CC were added. If not in NoteDb read mode, both
-    // parties will be returned as CCed.
-    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
-    if (notesMigration.readChanges()) {
-      assertReviewers(c, REVIEWER, admin, user);
-      assertReviewers(c, CC, observer);
-    } else {
-      // In legacy mode, everyone should be a reviewer.
-      assertReviewers(c, REVIEWER, admin, user, observer);
-      assertReviewers(c, CC);
-    }
-
-    // Verify emails were sent to added reviewers.
-    List<Message> messages = sender.getMessages();
-    assertThat(messages).hasSize(2);
-
-    Message m = messages.get(0);
-    assertThat(m.rcpt()).containsExactly(user.emailAddress, observer.emailAddress);
-    assertThat(m.body()).contains(admin.fullName + " has posted comments on this change.");
-    assertThat(m.body()).contains("Change subject: " + PushOneCommit.SUBJECT + "\n");
-    assertThat(m.body()).contains("Patch Set 1: Code-Review+2");
-
-    m = messages.get(1);
-    assertThat(m.rcpt()).containsExactly(user.emailAddress, observer.emailAddress);
-    assertThat(m.body()).contains("Hello " + user.fullName + ",\n");
-    assertThat(m.body()).contains("I'd like you to do a code review.");
-  }
-
-  @Test
-  public void reviewAndAddGroupReviewers() throws Exception {
-    int largeGroupSize = PostReviewers.DEFAULT_MAX_REVIEWERS + 1;
-    int mediumGroupSize = PostReviewers.DEFAULT_MAX_REVIEWERS_WITHOUT_CHECK + 1;
-    List<TestAccount> users = createAccounts(largeGroupSize, "reviewAndAddGroupReviewers");
-    List<String> usernames = new ArrayList<>(largeGroupSize);
-    for (TestAccount u : users) {
-      usernames.add(u.username);
-    }
-
-    String largeGroup = createGroup("largeGroup");
-    String mediumGroup = createGroup("mediumGroup");
-    gApi.groups().id(largeGroup).addMembers(usernames.toArray(new String[largeGroupSize]));
-    gApi.groups()
-        .id(mediumGroup)
-        .addMembers(usernames.subList(0, mediumGroupSize).toArray(new String[mediumGroupSize]));
-
-    TestAccount observer = accountCreator.user2();
-    PushOneCommit.Result r = createChange();
-
-    // Attempt to add overly large group as reviewers.
-    ReviewInput input =
-        ReviewInput.approve()
-            .reviewer(user.email)
-            .reviewer(observer.email, CC, false)
-            .reviewer(largeGroup);
-    ReviewResult result = review(r.getChangeId(), r.getCommit().name(), input, SC_BAD_REQUEST);
-    assertThat(result.labels).isNull();
-    assertThat(result.reviewers).isNotNull();
-    assertThat(result.reviewers).hasSize(3);
-    AddReviewerResult reviewerResult = result.reviewers.get(largeGroup);
-    assertThat(reviewerResult).isNotNull();
-    assertThat(reviewerResult.confirm).isNull();
-    assertThat(reviewerResult.error).isNotNull();
-    assertThat(reviewerResult.error).contains("has too many members to add them all as reviewers");
-
-    // No labels should have changed, and no reviewers/CCs should have been added.
-    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
-    assertThat(c.messages).hasSize(1);
-    assertThat(c.reviewers.get(REVIEWER)).isNull();
-    assertThat(c.reviewers.get(CC)).isNull();
-
-    // Attempt to add group large enough to require confirmation, without
-    // confirmation, as reviewers.
-    input =
-        ReviewInput.approve()
-            .reviewer(user.email)
-            .reviewer(observer.email, CC, false)
-            .reviewer(mediumGroup);
-    result = review(r.getChangeId(), r.getCommit().name(), input, SC_BAD_REQUEST);
-    assertThat(result.labels).isNull();
-    assertThat(result.reviewers).isNotNull();
-    assertThat(result.reviewers).hasSize(3);
-    reviewerResult = result.reviewers.get(mediumGroup);
-    assertThat(reviewerResult).isNotNull();
-    assertThat(reviewerResult.confirm).isTrue();
-    assertThat(reviewerResult.error)
-        .contains("has " + mediumGroupSize + " members. Do you want to add them all as reviewers?");
-
-    // No labels should have changed, and no reviewers/CCs should have been added.
-    c = gApi.changes().id(r.getChangeId()).get();
-    assertThat(c.messages).hasSize(1);
-    assertThat(c.reviewers.get(REVIEWER)).isNull();
-    assertThat(c.reviewers.get(CC)).isNull();
-
-    // Retrying with confirmation should successfully approve and add reviewers/CCs.
-    input = ReviewInput.approve().reviewer(user.email).reviewer(mediumGroup, CC, true);
-    result = review(r.getChangeId(), r.getCommit().name(), input);
-    assertThat(result.labels).isNotNull();
-    assertThat(result.reviewers).isNotNull();
-    assertThat(result.reviewers).hasSize(2);
-
-    c = gApi.changes().id(r.getChangeId()).get();
-    assertThat(c.messages).hasSize(2);
-
-    if (notesMigration.readChanges()) {
-      assertReviewers(c, REVIEWER, admin, user);
-      assertReviewers(c, CC, users.subList(0, mediumGroupSize));
-    } else {
-      // If not in NoteDb mode, then everyone is a REVIEWER.
-      List<TestAccount> expected = users.subList(0, mediumGroupSize);
-      expected.add(admin);
-      expected.add(user);
-      assertReviewers(c, REVIEWER, expected);
-      assertReviewers(c, CC);
-    }
-  }
-
-  @Test
-  public void noteDbAddReviewerToReviewerChangeInfo() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    PushOneCommit.Result r = createChange();
-    String changeId = r.getChangeId();
-    AddReviewerInput in = new AddReviewerInput();
-    in.reviewer = user.email;
-    in.state = CC;
-    addReviewer(changeId, in);
-
-    in.state = REVIEWER;
-    addReviewer(changeId, in);
-
-    gApi.changes().id(changeId).current().review(ReviewInput.dislike());
-
-    setApiUser(user);
-    // NoteDb adds reviewer to a change on every review.
-    gApi.changes().id(changeId).current().review(ReviewInput.dislike());
-
-    deleteReviewer(changeId, user).assertNoContent();
-
-    ChangeInfo c = gApi.changes().id(changeId).get();
-    assertThat(c.reviewerUpdates).isNotNull();
-    assertThat(c.reviewerUpdates).hasSize(3);
-
-    Iterator<ReviewerUpdateInfo> it = c.reviewerUpdates.iterator();
-    ReviewerUpdateInfo reviewerChange = it.next();
-    assertThat(reviewerChange.state).isEqualTo(CC);
-    assertThat(reviewerChange.reviewer._accountId).isEqualTo(user.getId().get());
-    assertThat(reviewerChange.updatedBy._accountId).isEqualTo(admin.getId().get());
-
-    reviewerChange = it.next();
-    assertThat(reviewerChange.state).isEqualTo(REVIEWER);
-    assertThat(reviewerChange.reviewer._accountId).isEqualTo(user.getId().get());
-    assertThat(reviewerChange.updatedBy._accountId).isEqualTo(admin.getId().get());
-
-    reviewerChange = it.next();
-    assertThat(reviewerChange.state).isEqualTo(REMOVED);
-    assertThat(reviewerChange.reviewer._accountId).isEqualTo(user.getId().get());
-    assertThat(reviewerChange.updatedBy._accountId).isEqualTo(admin.getId().get());
-  }
-
-  @Test
-  public void addDuplicateReviewers() throws Exception {
-    PushOneCommit.Result r = createChange();
-    ReviewInput input = ReviewInput.approve().reviewer(user.email).reviewer(user.email);
-    ReviewResult result = review(r.getChangeId(), r.getCommit().name(), input);
-    assertThat(result.reviewers).isNotNull();
-    assertThat(result.reviewers).hasSize(1);
-    AddReviewerResult reviewerResult = result.reviewers.get(user.email);
-    assertThat(reviewerResult).isNotNull();
-    assertThat(reviewerResult.confirm).isNull();
-    assertThat(reviewerResult.error).isNull();
-  }
-
-  @Test
-  public void addOverlappingGroups() throws Exception {
-    String emailPrefix = "addOverlappingGroups-";
-    TestAccount user1 =
-        accountCreator.create(name("user1"), emailPrefix + "user1@example.com", "User1");
-    TestAccount user2 =
-        accountCreator.create(name("user2"), emailPrefix + "user2@example.com", "User2");
-    TestAccount user3 =
-        accountCreator.create(name("user3"), emailPrefix + "user3@example.com", "User3");
-    String group1 = createGroup("group1");
-    String group2 = createGroup("group2");
-    gApi.groups().id(group1).addMembers(user1.username, user2.username);
-    gApi.groups().id(group2).addMembers(user2.username, user3.username);
-
-    PushOneCommit.Result r = createChange();
-    ReviewInput input = ReviewInput.approve().reviewer(group1).reviewer(group2);
-    ReviewResult result = review(r.getChangeId(), r.getCommit().name(), input);
-    assertThat(result.reviewers).isNotNull();
-    assertThat(result.reviewers).hasSize(2);
-    AddReviewerResult reviewerResult = result.reviewers.get(group1);
-    assertThat(reviewerResult.error).isNull();
-    assertThat(reviewerResult.reviewers).hasSize(2);
-    reviewerResult = result.reviewers.get(group2);
-    assertThat(reviewerResult.error).isNull();
-    assertThat(reviewerResult.reviewers).hasSize(1);
-
-    // Repeat the above for CCs
-    if (!notesMigration.readChanges()) {
-      return;
-    }
-    r = createChange();
-    input = ReviewInput.approve().reviewer(group1, CC, false).reviewer(group2, CC, false);
-    result = review(r.getChangeId(), r.getCommit().name(), input);
-    assertThat(result.reviewers).isNotNull();
-    assertThat(result.reviewers).hasSize(2);
-    reviewerResult = result.reviewers.get(group1);
-    assertThat(reviewerResult.error).isNull();
-    assertThat(reviewerResult.ccs).hasSize(2);
-    reviewerResult = result.reviewers.get(group2);
-    assertThat(reviewerResult.error).isNull();
-    assertThat(reviewerResult.ccs).hasSize(1);
-
-    // Repeat again with one group REVIEWER, the other CC. The overlapping
-    // member should end up as a REVIEWER.
-    r = createChange();
-    input = ReviewInput.approve().reviewer(group1, REVIEWER, false).reviewer(group2, CC, false);
-    result = review(r.getChangeId(), r.getCommit().name(), input);
-    assertThat(result.reviewers).isNotNull();
-    assertThat(result.reviewers).hasSize(2);
-    reviewerResult = result.reviewers.get(group1);
-    assertThat(reviewerResult.error).isNull();
-    assertThat(reviewerResult.reviewers).hasSize(2);
-    reviewerResult = result.reviewers.get(group2);
-    assertThat(reviewerResult.error).isNull();
-    assertThat(reviewerResult.reviewers).isNull();
-    assertThat(reviewerResult.ccs).hasSize(1);
-  }
-
-  @Test
-  public void removingReviewerRemovesTheirVote() throws Exception {
-    String crLabel = "Code-Review";
-    PushOneCommit.Result r = createChange();
-    ReviewInput input = ReviewInput.approve().reviewer(admin.email);
-    ReviewResult addResult = review(r.getChangeId(), r.getCommit().name(), input);
-    assertThat(addResult.reviewers).isNotNull();
-    assertThat(addResult.reviewers).hasSize(1);
-
-    Map<String, LabelInfo> changeLabels = getChangeLabels(r.getChangeId());
-    assertThat(changeLabels.get(crLabel).all).hasSize(1);
-
-    RestResponse deleteResult = deleteReviewer(r.getChangeId(), admin);
-    deleteResult.assertNoContent();
-
-    changeLabels = getChangeLabels(r.getChangeId());
-    assertThat(changeLabels.get(crLabel).all).isNull();
-
-    // Check that the vote is gone even after the reviewer is added back
-    addReviewer(r.getChangeId(), admin.email);
-    changeLabels = getChangeLabels(r.getChangeId());
-    assertThat(changeLabels.get(crLabel).all).isNull();
-  }
-
-  @Test
-  public void notifyDetailsWorkOnPostReview() throws Exception {
-    PushOneCommit.Result r = createChange();
-    TestAccount userToNotify = createAccounts(1, "notify-details-post-review").get(0);
-
-    ReviewInput reviewInput = new ReviewInput();
-    reviewInput.reviewer(user.email, ReviewerState.REVIEWER, true);
-    reviewInput.notify = NotifyHandling.NONE;
-    reviewInput.notifyDetails =
-        ImmutableMap.of(RecipientType.TO, new NotifyInfo(ImmutableList.of(userToNotify.email)));
-
-    sender.clear();
-    gApi.changes().id(r.getChangeId()).current().review(reviewInput);
-    assertThat(sender.getMessages()).hasSize(1);
-    assertThat(sender.getMessages().get(0).rcpt()).containsExactly(userToNotify.emailAddress);
-  }
-
-  @Test
-  public void notifyDetailsWorkOnPostReviewers() throws Exception {
-    PushOneCommit.Result r = createChange();
-    TestAccount userToNotify = createAccounts(1, "notify-details-post-reviewers").get(0);
-
-    AddReviewerInput addReviewer = new AddReviewerInput();
-    addReviewer.reviewer = user.email;
-    addReviewer.notify = NotifyHandling.NONE;
-    addReviewer.notifyDetails =
-        ImmutableMap.of(RecipientType.TO, new NotifyInfo(ImmutableList.of(userToNotify.email)));
-
-    sender.clear();
-    gApi.changes().id(r.getChangeId()).addReviewer(addReviewer);
-    assertThat(sender.getMessages()).hasSize(1);
-    assertThat(sender.getMessages().get(0).rcpt()).containsExactly(userToNotify.emailAddress);
-  }
-
-  @Test
-  public void removeReviewerWithVoteWithoutPermissionFails() throws Exception {
-    PushOneCommit.Result r = createChange();
-    TestAccount newUser = createAccounts(1, name("foo")).get(0);
-
-    setApiUser(user);
-    gApi.changes().id(r.getChangeId()).current().review(new ReviewInput().label("Code-Review", 1));
-    setApiUser(newUser);
-    exception.expect(AuthException.class);
-    exception.expectMessage("remove reviewer not permitted");
-    gApi.changes().id(r.getChangeId()).reviewer(user.email).remove();
-  }
-
-  @Test
-  @Sandboxed
-  public void removeReviewerWithoutVoteWithPermissionSucceeds() throws Exception {
-    PushOneCommit.Result r = createChange();
-    // This test creates a new user so that it can explicitly check the REMOVE_REVIEWER permission
-    // rather than bypassing the check because of project or ref ownership.
-    TestAccount newUser = createAccounts(1, name("foo")).get(0);
-    grant(project, RefNames.REFS + "*", Permission.REMOVE_REVIEWER, false, REGISTERED_USERS);
-
-    gApi.changes().id(r.getChangeId()).addReviewer(user.email);
-    assertThatUserIsOnlyReviewer(r.getChangeId());
-    setApiUser(newUser);
-    gApi.changes().id(r.getChangeId()).reviewer(user.email).remove();
-    assertThat(gApi.changes().id(r.getChangeId()).get().reviewers).isEmpty();
-  }
-
-  @Test
-  public void removeReviewerWithoutVoteWithoutPermissionFails() throws Exception {
-    PushOneCommit.Result r = createChange();
-    TestAccount newUser = createAccounts(1, name("foo")).get(0);
-
-    gApi.changes().id(r.getChangeId()).addReviewer(user.email);
-    setApiUser(newUser);
-    exception.expect(AuthException.class);
-    exception.expectMessage("remove reviewer not permitted");
-    gApi.changes().id(r.getChangeId()).reviewer(user.email).remove();
-  }
-
-  @Test
-  public void removeCCWithoutPermissionFails() throws Exception {
-    PushOneCommit.Result r = createChange();
-    TestAccount newUser = createAccounts(1, name("foo")).get(0);
-
-    AddReviewerInput input = new AddReviewerInput();
-    input.reviewer = user.email;
-    input.state = ReviewerState.CC;
-    gApi.changes().id(r.getChangeId()).addReviewer(input);
-    setApiUser(newUser);
-    exception.expect(AuthException.class);
-    exception.expectMessage("remove reviewer not permitted");
-    gApi.changes().id(r.getChangeId()).reviewer(user.email).remove();
-  }
-
-  private void assertThatUserIsOnlyReviewer(String changeId) throws Exception {
-    AccountInfo userInfo = new AccountInfo(user.fullName, user.emailAddress.getEmail());
-    userInfo._accountId = user.id.get();
-    userInfo.username = user.username;
-    assertThat(gApi.changes().id(changeId).get().reviewers)
-        .containsExactly(ReviewerState.REVIEWER, ImmutableList.of(userInfo));
-  }
-
-  private AddReviewerResult addReviewer(String changeId, String reviewer) throws Exception {
-    return addReviewer(changeId, reviewer, SC_OK);
-  }
-
-  private AddReviewerResult addReviewer(String changeId, String reviewer, int expectedStatus)
-      throws Exception {
-    AddReviewerInput in = new AddReviewerInput();
-    in.reviewer = reviewer;
-    return addReviewer(changeId, in, expectedStatus);
-  }
-
-  private AddReviewerResult addReviewer(String changeId, AddReviewerInput in) throws Exception {
-    return addReviewer(changeId, in, SC_OK);
-  }
-
-  private AddReviewerResult addReviewer(String changeId, AddReviewerInput in, int expectedStatus)
-      throws Exception {
-    RestResponse resp = adminRestSession.post("/changes/" + changeId + "/reviewers", in);
-    return readContentFromJson(resp, expectedStatus, AddReviewerResult.class);
-  }
-
-  private RestResponse deleteReviewer(String changeId, TestAccount account) throws Exception {
-    return adminRestSession.delete("/changes/" + changeId + "/reviewers/" + account.getId().get());
-  }
-
-  private ReviewResult review(String changeId, String revisionId, ReviewInput in) throws Exception {
-    return review(changeId, revisionId, in, SC_OK);
-  }
-
-  private ReviewResult review(
-      String changeId, String revisionId, ReviewInput in, int expectedStatus) throws Exception {
-    RestResponse resp =
-        adminRestSession.post("/changes/" + changeId + "/revisions/" + revisionId + "/review", in);
-    return readContentFromJson(resp, expectedStatus, ReviewResult.class);
-  }
-
-  private static <T> T readContentFromJson(RestResponse r, int expectedStatus, Class<T> clazz)
-      throws Exception {
-    r.assertStatus(expectedStatus);
-    try (JsonReader jsonReader = new JsonReader(r.getReader())) {
-      jsonReader.setLenient(true);
-      return newGson().fromJson(jsonReader, clazz);
-    }
-  }
-
-  private static void assertReviewers(
-      ChangeInfo c, ReviewerState reviewerState, TestAccount... accounts) throws Exception {
-    List<TestAccount> accountList = new ArrayList<>(accounts.length);
-    for (TestAccount a : accounts) {
-      accountList.add(a);
-    }
-    assertReviewers(c, reviewerState, accountList);
-  }
-
-  private static void assertReviewers(
-      ChangeInfo c, ReviewerState reviewerState, Iterable<TestAccount> accounts) throws Exception {
-    Collection<AccountInfo> actualAccounts = c.reviewers.get(reviewerState);
-    if (actualAccounts == null) {
-      assertThat(accounts.iterator().hasNext()).isFalse();
-      return;
-    }
-    assertThat(actualAccounts).isNotNull();
-    List<Integer> actualAccountIds = new ArrayList<>(actualAccounts.size());
-    for (AccountInfo account : actualAccounts) {
-      actualAccountIds.add(account._accountId);
-    }
-    List<Integer> expectedAccountIds = new ArrayList<>();
-    for (TestAccount account : accounts) {
-      expectedAccountIds.add(account.getId().get());
-    }
-    assertThat(actualAccountIds).containsExactlyElementsIn(expectedAccountIds);
-  }
-
-  private List<TestAccount> createAccounts(int n, String emailPrefix) throws Exception {
-    List<TestAccount> result = new ArrayList<>(n);
-    for (int i = 0; i < n; i++) {
-      result.add(
-          accountCreator.create(
-              name("u" + i), emailPrefix + "-" + i + "@example.com", "Full Name " + i));
-    }
-    return result;
-  }
-
-  private Map<String, LabelInfo> getChangeLabels(String changeId) throws Exception {
-    return gApi.changes().id(changeId).get(DETAILED_LABELS).labels;
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ConfigChangeIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ConfigChangeIT.java
deleted file mode 100644
index 3b49b59..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ConfigChangeIT.java
+++ /dev/null
@@ -1,204 +0,0 @@
-// 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.
-
-package com.google.gerrit.acceptance.rest.change;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.junit.Assert.fail;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.GitUtil;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.acceptance.TestProjectInput;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.api.projects.ProjectInput;
-import com.google.gerrit.extensions.client.ChangeStatus;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.project.Util;
-import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectLoader;
-import org.eclipse.jgit.revwalk.RevObject;
-import org.eclipse.jgit.revwalk.RevTree;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.RefSpec;
-import org.junit.Before;
-import org.junit.Test;
-
-public class ConfigChangeIT extends AbstractDaemonTest {
-  @Before
-  public void setUp() throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    Util.allow(cfg, Permission.OWNER, REGISTERED_USERS, "refs/*");
-    Util.allow(cfg, Permission.PUSH, REGISTERED_USERS, "refs/for/refs/meta/config");
-    Util.allow(cfg, Permission.SUBMIT, REGISTERED_USERS, RefNames.REFS_CONFIG);
-    saveProjectConfig(project, cfg);
-
-    setApiUser(user);
-    fetchRefsMetaConfig();
-  }
-
-  @Test
-  @TestProjectInput(cloneAs = "user")
-  public void updateProjectConfig() throws Exception {
-    String id = testUpdateProjectConfig();
-    assertThat(gApi.changes().id(id).get().revisions).hasSize(1);
-  }
-
-  @Test
-  @TestProjectInput(cloneAs = "user", submitType = SubmitType.CHERRY_PICK)
-  public void updateProjectConfigWithCherryPick() throws Exception {
-    String id = testUpdateProjectConfig();
-    assertThat(gApi.changes().id(id).get().revisions).hasSize(2);
-  }
-
-  private String testUpdateProjectConfig() throws Exception {
-    Config cfg = readProjectConfig();
-    assertThat(cfg.getString("project", null, "description")).isNull();
-    String desc = "new project description";
-    cfg.setString("project", null, "description", desc);
-
-    PushOneCommit.Result r = createConfigChange(cfg);
-    String id = r.getChangeId();
-
-    gApi.changes().id(id).current().review(ReviewInput.approve());
-    gApi.changes().id(id).current().submit();
-
-    assertThat(gApi.changes().id(id).info().status).isEqualTo(ChangeStatus.MERGED);
-    assertThat(gApi.projects().name(project.get()).get().description).isEqualTo(desc);
-    fetchRefsMetaConfig();
-    assertThat(readProjectConfig().getString("project", null, "description")).isEqualTo(desc);
-    String changeRev = gApi.changes().id(id).get().currentRevision;
-    String branchRev =
-        gApi.projects().name(project.get()).branch(RefNames.REFS_CONFIG).get().revision;
-    assertThat(changeRev).isEqualTo(branchRev);
-    return id;
-  }
-
-  @Test
-  @TestProjectInput(cloneAs = "user")
-  public void onlyAdminMayUpdateProjectParent() throws Exception {
-    setApiUser(admin);
-    ProjectInput parent = new ProjectInput();
-    parent.name = name("parent");
-    parent.permissionsOnly = true;
-    gApi.projects().create(parent);
-
-    setApiUser(user);
-    Config cfg = readProjectConfig();
-    assertThat(cfg.getString("access", null, "inheritFrom")).isAnyOf(null, allProjects.get());
-    cfg.setString("access", null, "inheritFrom", parent.name);
-
-    PushOneCommit.Result r = createConfigChange(cfg);
-    String id = r.getChangeId();
-
-    gApi.changes().id(id).current().review(ReviewInput.approve());
-    try {
-      gApi.changes().id(id).current().submit();
-      fail("expected submit to fail");
-    } catch (ResourceConflictException e) {
-      int n = gApi.changes().id(id).info()._number;
-      assertThat(e)
-          .hasMessageThat()
-          .isEqualTo(
-              "Failed to submit 1 change due to the following problems:\n"
-                  + "Change "
-                  + n
-                  + ": Change contains a project configuration that"
-                  + " changes the parent project.\n"
-                  + "The change must be submitted by a Gerrit administrator.");
-    }
-
-    assertThat(gApi.projects().name(project.get()).get().parent).isEqualTo(allProjects.get());
-    fetchRefsMetaConfig();
-    assertThat(readProjectConfig().getString("access", null, "inheritFrom"))
-        .isAnyOf(null, allProjects.get());
-
-    setApiUser(admin);
-    gApi.changes().id(id).current().submit();
-    assertThat(gApi.changes().id(id).info().status).isEqualTo(ChangeStatus.MERGED);
-    assertThat(gApi.projects().name(project.get()).get().parent).isEqualTo(parent.name);
-    fetchRefsMetaConfig();
-    assertThat(readProjectConfig().getString("access", null, "inheritFrom")).isEqualTo(parent.name);
-  }
-
-  @Test
-  public void rejectDoubleInheritance() throws Exception {
-    setApiUser(admin);
-    // Create separate projects to test the config
-    Project.NameKey parent = createProject("projectToInheritFrom");
-    Project.NameKey child = createProject("projectWithMalformedConfig");
-
-    String config =
-        gApi.projects()
-            .name(child.get())
-            .branch(RefNames.REFS_CONFIG)
-            .file("project.config")
-            .asString();
-
-    // Append and push malformed project config
-    String pattern = "[access]\n\tinheritFrom = " + allProjects.get() + "\n";
-    String doubleInherit = pattern + "\tinheritFrom = " + parent.get() + "\n";
-    config = config.replace(pattern, doubleInherit);
-
-    TestRepository<InMemoryRepository> childRepo = cloneProject(child, admin);
-    // Fetch meta ref
-    GitUtil.fetch(childRepo, RefNames.REFS_CONFIG + ":cfg");
-    childRepo.reset("cfg");
-    PushOneCommit push =
-        pushFactory.create(db, admin.getIdent(), childRepo, "Subject", "project.config", config);
-    PushOneCommit.Result res = push.to(RefNames.REFS_CONFIG);
-    res.assertErrorStatus();
-    res.assertMessage("cannot inherit from multiple projects");
-  }
-
-  private void fetchRefsMetaConfig() throws Exception {
-    git().fetch().setRefSpecs(new RefSpec("refs/meta/config:refs/meta/config")).call();
-    testRepo.reset(RefNames.REFS_CONFIG);
-  }
-
-  private Config readProjectConfig() throws Exception {
-    RevWalk rw = testRepo.getRevWalk();
-    RevTree tree = rw.parseTree(testRepo.getRepository().resolve("HEAD"));
-    RevObject obj = rw.parseAny(testRepo.get(tree, "project.config"));
-    ObjectLoader loader = rw.getObjectReader().open(obj);
-    String text = new String(loader.getCachedBytes(), UTF_8);
-    Config cfg = new Config();
-    cfg.fromText(text);
-    return cfg;
-  }
-
-  private PushOneCommit.Result createConfigChange(Config cfg) throws Exception {
-    PushOneCommit.Result r =
-        pushFactory
-            .create(
-                db,
-                user.getIdent(),
-                testRepo,
-                "Update project config",
-                "project.config",
-                cfg.toText())
-            .to("refs/for/refs/meta/config");
-    r.assertOkStatus();
-    return r;
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/CorsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/CorsIT.java
deleted file mode 100644
index 861a22c..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/CorsIT.java
+++ /dev/null
@@ -1,291 +0,0 @@
-// 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.
-
-package com.google.gerrit.acceptance.rest.change;
-
-import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS;
-import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS;
-import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS;
-import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN;
-import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_MAX_AGE;
-import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_REQUEST_HEADERS;
-import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD;
-import static com.google.common.net.HttpHeaders.AUTHORIZATION;
-import static com.google.common.net.HttpHeaders.CONTENT_TYPE;
-import static com.google.common.net.HttpHeaders.ORIGIN;
-import static com.google.common.net.HttpHeaders.VARY;
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.common.base.Splitter;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.truth.StringSubject;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.PushOneCommit.Result;
-import com.google.gerrit.acceptance.RestResponse;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.server.UrlEncoded;
-import com.google.gerrit.testutil.ConfigSuite;
-import java.nio.charset.StandardCharsets;
-import java.util.Locale;
-import java.util.stream.Stream;
-import org.apache.http.Header;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.fluent.Executor;
-import org.apache.http.client.fluent.Request;
-import org.apache.http.cookie.Cookie;
-import org.apache.http.impl.client.BasicCookieStore;
-import org.apache.http.message.BasicHeader;
-import org.eclipse.jgit.lib.Config;
-import org.junit.Test;
-
-public class CorsIT extends AbstractDaemonTest {
-  @ConfigSuite.Default
-  public static Config allowExampleDotCom() {
-    Config cfg = new Config();
-    cfg.setString("auth", null, "type", "DEVELOPMENT_BECOME_ANY_ACCOUNT");
-    cfg.setStringList(
-        "site",
-        null,
-        "allowOriginRegex",
-        ImmutableList.of("https?://(.+[.])?example[.]com", "http://friend[.]ly"));
-    return cfg;
-  }
-
-  @Test
-  public void missingOriginIsAllowedWithNoCorsResponseHeaders() throws Exception {
-    Result change = createChange();
-    String url = "/changes/" + change.getChangeId() + "/detail";
-    RestResponse r = adminRestSession.get(url);
-    r.assertOK();
-
-    String allowOrigin = r.getHeader(ACCESS_CONTROL_ALLOW_ORIGIN);
-    String allowCred = r.getHeader(ACCESS_CONTROL_ALLOW_CREDENTIALS);
-    String maxAge = r.getHeader(ACCESS_CONTROL_MAX_AGE);
-    String allowMethods = r.getHeader(ACCESS_CONTROL_ALLOW_METHODS);
-    String allowHeaders = r.getHeader(ACCESS_CONTROL_ALLOW_HEADERS);
-
-    assertThat(allowOrigin).named(ACCESS_CONTROL_ALLOW_ORIGIN).isNull();
-    assertThat(allowCred).named(ACCESS_CONTROL_ALLOW_CREDENTIALS).isNull();
-    assertThat(maxAge).named(ACCESS_CONTROL_MAX_AGE).isNull();
-    assertThat(allowMethods).named(ACCESS_CONTROL_ALLOW_METHODS).isNull();
-    assertThat(allowHeaders).named(ACCESS_CONTROL_ALLOW_HEADERS).isNull();
-  }
-
-  @Test
-  public void origins() throws Exception {
-    Result change = createChange();
-    String url = "/changes/" + change.getChangeId() + "/detail";
-
-    check(url, true, "http://example.com");
-    check(url, true, "https://sub.example.com");
-    check(url, true, "http://friend.ly");
-
-    check(url, false, "http://evil.attacker");
-    check(url, false, "http://friendsly");
-  }
-
-  @Test
-  public void putWithServerOriginAcceptedWithNoCorsResponseHeaders() throws Exception {
-    Result change = createChange();
-    String origin = adminRestSession.url();
-    RestResponse r =
-        adminRestSession.putWithHeader(
-            "/changes/" + change.getChangeId() + "/topic", new BasicHeader(ORIGIN, origin), "A");
-    r.assertOK();
-    checkCors(r, false, origin);
-    checkTopic(change, "A");
-  }
-
-  @Test
-  public void putWithOtherOriginAccepted() throws Exception {
-    Result change = createChange();
-    String origin = "http://example.com";
-    RestResponse r =
-        adminRestSession.putWithHeader(
-            "/changes/" + change.getChangeId() + "/topic", new BasicHeader(ORIGIN, origin), "A");
-    r.assertOK();
-    checkCors(r, true, origin);
-  }
-
-  @Test
-  public void preflightOk() throws Exception {
-    Result change = createChange();
-
-    String origin = "http://example.com";
-    Request req =
-        Request.Options(adminRestSession.url() + "/a/changes/" + change.getChangeId() + "/detail");
-    req.addHeader(ORIGIN, origin);
-    req.addHeader(ACCESS_CONTROL_REQUEST_METHOD, "GET");
-    req.addHeader(ACCESS_CONTROL_REQUEST_HEADERS, "X-Requested-With");
-
-    RestResponse res = adminRestSession.execute(req);
-    res.assertOK();
-
-    String vary = res.getHeader(VARY);
-    assertThat(vary).named(VARY).isNotNull();
-    assertThat(Splitter.on(", ").splitToList(vary))
-        .containsExactly(ORIGIN, ACCESS_CONTROL_REQUEST_METHOD, ACCESS_CONTROL_REQUEST_HEADERS);
-    checkCors(res, true, origin);
-  }
-
-  @Test
-  public void preflightBadOrigin() throws Exception {
-    Result change = createChange();
-    Request req =
-        Request.Options(adminRestSession.url() + "/a/changes/" + change.getChangeId() + "/detail");
-    req.addHeader(ORIGIN, "http://evil.attacker");
-    req.addHeader(ACCESS_CONTROL_REQUEST_METHOD, "GET");
-    adminRestSession.execute(req).assertBadRequest();
-  }
-
-  @Test
-  public void preflightBadMethod() throws Exception {
-    Result change = createChange();
-    Request req =
-        Request.Options(adminRestSession.url() + "/a/changes/" + change.getChangeId() + "/detail");
-    req.addHeader(ORIGIN, "http://example.com");
-    req.addHeader(ACCESS_CONTROL_REQUEST_METHOD, "CALL");
-    adminRestSession.execute(req).assertBadRequest();
-  }
-
-  @Test
-  public void preflightBadHeader() throws Exception {
-    Result change = createChange();
-    Request req =
-        Request.Options(adminRestSession.url() + "/a/changes/" + change.getChangeId() + "/detail");
-    req.addHeader(ORIGIN, "http://example.com");
-    req.addHeader(ACCESS_CONTROL_REQUEST_METHOD, "GET");
-    req.addHeader(ACCESS_CONTROL_REQUEST_HEADERS, "X-Secret-Auth-Token");
-    adminRestSession.execute(req).assertBadRequest();
-  }
-
-  @Test
-  public void crossDomainPutTopic() throws Exception {
-    Result change = createChange();
-    BasicCookieStore cookies = new BasicCookieStore();
-    Executor http = Executor.newInstance().cookieStore(cookies);
-
-    Request req = Request.Get(canonicalWebUrl.get() + "/login/?account_id=" + admin.id.get());
-    HttpResponse r = http.execute(req).returnResponse();
-    String auth = null;
-    for (Cookie c : cookies.getCookies()) {
-      if ("GerritAccount".equals(c.getName())) {
-        auth = c.getValue();
-      }
-    }
-    assertThat(auth).named("GerritAccount cookie").isNotNull();
-    cookies.clear();
-
-    UrlEncoded url =
-        new UrlEncoded(canonicalWebUrl.get() + "/changes/" + change.getChangeId() + "/topic");
-    url.put("$m", "PUT");
-    url.put("$ct", "application/json; charset=US-ASCII");
-    url.put("access_token", auth);
-
-    String origin = "http://example.com";
-    req = Request.Post(url.toString());
-    req.setHeader(CONTENT_TYPE, "text/plain");
-    req.setHeader(ORIGIN, origin);
-    req.bodyByteArray("{\"topic\":\"test-xd\"}".getBytes(StandardCharsets.US_ASCII));
-
-    r = http.execute(req).returnResponse();
-    assertThat(r.getStatusLine().getStatusCode()).isEqualTo(200);
-
-    Header vary = r.getFirstHeader(VARY);
-    assertThat(vary).named(VARY).isNotNull();
-    assertThat(Splitter.on(", ").splitToList(vary.getValue())).named(VARY).contains(ORIGIN);
-
-    Header allowOrigin = r.getFirstHeader(ACCESS_CONTROL_ALLOW_ORIGIN);
-    assertThat(allowOrigin).named(ACCESS_CONTROL_ALLOW_ORIGIN).isNotNull();
-    assertThat(allowOrigin.getValue()).named(ACCESS_CONTROL_ALLOW_ORIGIN).isEqualTo(origin);
-
-    Header allowAuth = r.getFirstHeader(ACCESS_CONTROL_ALLOW_CREDENTIALS);
-    assertThat(allowAuth).named(ACCESS_CONTROL_ALLOW_CREDENTIALS).isNotNull();
-    assertThat(allowAuth.getValue()).named(ACCESS_CONTROL_ALLOW_CREDENTIALS).isEqualTo("true");
-
-    checkTopic(change, "test-xd");
-  }
-
-  @Test
-  public void crossDomainRejectsBadOrigin() throws Exception {
-    Result change = createChange();
-    UrlEncoded url =
-        new UrlEncoded(canonicalWebUrl.get() + "/changes/" + change.getChangeId() + "/topic");
-    url.put("$m", "PUT");
-    url.put("$ct", "application/json; charset=US-ASCII");
-
-    Request req = Request.Post(url.toString());
-    req.setHeader(CONTENT_TYPE, "text/plain");
-    req.setHeader(ORIGIN, "http://evil.attacker");
-    req.bodyByteArray("{\"topic\":\"test-xd\"}".getBytes(StandardCharsets.US_ASCII));
-    adminRestSession.execute(req).assertBadRequest();
-    checkTopic(change, null);
-  }
-
-  private void checkTopic(Result change, @Nullable String topic) throws RestApiException {
-    ChangeInfo info = gApi.changes().id(change.getChangeId()).get();
-    StringSubject t = assertThat(info.topic).named("topic");
-    if (topic != null) {
-      t.isEqualTo(topic);
-    } else {
-      t.isNull();
-    }
-  }
-
-  private void check(String url, boolean accept, String origin) throws Exception {
-    Header hdr = new BasicHeader(ORIGIN, origin);
-    RestResponse r = adminRestSession.getWithHeader(url, hdr);
-    r.assertOK();
-    checkCors(r, accept, origin);
-  }
-
-  private void checkCors(RestResponse r, boolean accept, String origin) {
-    String vary = r.getHeader(VARY);
-    assertThat(vary).named(VARY).isNotNull();
-    assertThat(Splitter.on(", ").splitToList(vary)).named(VARY).contains(ORIGIN);
-
-    String allowOrigin = r.getHeader(ACCESS_CONTROL_ALLOW_ORIGIN);
-    String allowCred = r.getHeader(ACCESS_CONTROL_ALLOW_CREDENTIALS);
-    String maxAge = r.getHeader(ACCESS_CONTROL_MAX_AGE);
-    String allowMethods = r.getHeader(ACCESS_CONTROL_ALLOW_METHODS);
-    String allowHeaders = r.getHeader(ACCESS_CONTROL_ALLOW_HEADERS);
-    if (accept) {
-      assertThat(allowOrigin).named(ACCESS_CONTROL_ALLOW_ORIGIN).isEqualTo(origin);
-      assertThat(allowCred).named(ACCESS_CONTROL_ALLOW_CREDENTIALS).isEqualTo("true");
-      assertThat(maxAge).named(ACCESS_CONTROL_MAX_AGE).isEqualTo("600");
-
-      assertThat(allowMethods).named(ACCESS_CONTROL_ALLOW_METHODS).isNotNull();
-      assertThat(Splitter.on(", ").splitToList(allowMethods))
-          .named(ACCESS_CONTROL_ALLOW_METHODS)
-          .containsExactly("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS");
-
-      assertThat(allowHeaders).named(ACCESS_CONTROL_ALLOW_HEADERS).isNotNull();
-      assertThat(Splitter.on(", ").splitToList(allowHeaders))
-          .named(ACCESS_CONTROL_ALLOW_HEADERS)
-          .containsExactlyElementsIn(
-              Stream.of(AUTHORIZATION, CONTENT_TYPE, "X-Gerrit-Auth", "X-Requested-With")
-                  .map(s -> s.toLowerCase(Locale.US))
-                  .collect(ImmutableSet.toImmutableSet()));
-    } else {
-      assertThat(allowOrigin).named(ACCESS_CONTROL_ALLOW_ORIGIN).isNull();
-      assertThat(allowCred).named(ACCESS_CONTROL_ALLOW_CREDENTIALS).isNull();
-      assertThat(maxAge).named(ACCESS_CONTROL_MAX_AGE).isNull();
-      assertThat(allowMethods).named(ACCESS_CONTROL_ALLOW_METHODS).isNull();
-      assertThat(allowHeaders).named(ACCESS_CONTROL_ALLOW_HEADERS).isNull();
-    }
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/CreateChangeIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/CreateChangeIT.java
deleted file mode 100644
index 216eb3a..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/CreateChangeIT.java
+++ /dev/null
@@ -1,539 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.acceptance.rest.change;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.TruthJUnit.assume;
-import static com.google.gerrit.common.data.Permission.READ;
-import static com.google.gerrit.reviewdb.client.RefNames.changeMetaRef;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-import static java.util.concurrent.TimeUnit.SECONDS;
-import static org.eclipse.jgit.lib.Constants.SIGNED_OFF_BY_TAG;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableMap;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.acceptance.PushOneCommit.Result;
-import com.google.gerrit.acceptance.RestResponse;
-import com.google.gerrit.extensions.api.changes.ChangeApi;
-import com.google.gerrit.extensions.api.changes.CherryPickInput;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.api.projects.BranchInput;
-import com.google.gerrit.extensions.client.ChangeStatus;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.ChangeInput;
-import com.google.gerrit.extensions.common.ChangeMessageInfo;
-import com.google.gerrit.extensions.common.CommitInfo;
-import com.google.gerrit.extensions.common.MergeInput;
-import com.google.gerrit.extensions.common.RevisionInfo;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.server.config.AnonymousCowardNameProvider;
-import com.google.gerrit.server.git.ChangeAlreadyMergedException;
-import com.google.gerrit.testutil.FakeEmailSender.Message;
-import com.google.gerrit.testutil.TestTimeUtil;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.RefSpec;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-public class CreateChangeIT extends AbstractDaemonTest {
-  @BeforeClass
-  public static void setTimeForTesting() {
-    TestTimeUtil.resetWithClockStep(1, SECONDS);
-  }
-
-  @AfterClass
-  public static void restoreTime() {
-    TestTimeUtil.useSystemTime();
-  }
-
-  @Test
-  public void createEmptyChange_MissingBranch() throws Exception {
-    ChangeInput ci = new ChangeInput();
-    ci.project = project.get();
-    assertCreateFails(ci, BadRequestException.class, "branch must be non-empty");
-  }
-
-  @Test
-  public void createEmptyChange_MissingMessage() throws Exception {
-    ChangeInput ci = new ChangeInput();
-    ci.project = project.get();
-    ci.branch = "master";
-    assertCreateFails(ci, BadRequestException.class, "commit message must be non-empty");
-  }
-
-  @Test
-  public void createEmptyChange_InvalidStatus() throws Exception {
-    ChangeInput ci = newChangeInput(ChangeStatus.MERGED);
-    assertCreateFails(ci, BadRequestException.class, "unsupported change status");
-  }
-
-  @Test
-  public void createEmptyChange_InvalidChangeId() throws Exception {
-    ChangeInput ci = newChangeInput(ChangeStatus.NEW);
-    ci.subject = "Subject\n\nChange-Id: I0000000000000000000000000000000000000000";
-    assertCreateFails(
-        ci, ResourceConflictException.class, "invalid Change-Id line format in message footer");
-  }
-
-  @Test
-  public void createEmptyChange_InvalidSubject() throws Exception {
-    ChangeInput ci = newChangeInput(ChangeStatus.NEW);
-    ci.subject = "Change-Id: I1234000000000000000000000000000000000000";
-    assertCreateFails(
-        ci,
-        ResourceConflictException.class,
-        "missing subject; Change-Id must be in message footer");
-  }
-
-  @Test
-  public void createNewChange_InvalidCommentInCommitMessage() throws Exception {
-    ChangeInput ci = newChangeInput(ChangeStatus.NEW);
-    ci.subject = "#12345 Test";
-    assertCreateFails(ci, BadRequestException.class, "commit message must be non-empty");
-  }
-
-  @Test
-  public void createNewChange() throws Exception {
-    ChangeInfo info = assertCreateSucceeds(newChangeInput(ChangeStatus.NEW));
-    assertThat(info.revisions.get(info.currentRevision).commit.message)
-        .contains("Change-Id: " + info.changeId);
-  }
-
-  @Test
-  public void createNewChangeWithCommentsInCommitMessage() throws Exception {
-    ChangeInput ci = newChangeInput(ChangeStatus.NEW);
-    ci.subject += "\n# Comment line";
-    ChangeInfo info = gApi.changes().create(ci).get();
-    assertThat(info.revisions.get(info.currentRevision).commit.message)
-        .doesNotContain("# Comment line");
-  }
-
-  @Test
-  public void createNewChangeWithChangeId() throws Exception {
-    ChangeInput ci = newChangeInput(ChangeStatus.NEW);
-    String changeId = "I1234000000000000000000000000000000000000";
-    String changeIdLine = "Change-Id: " + changeId;
-    ci.subject = "Subject\n\n" + changeIdLine;
-    ChangeInfo info = assertCreateSucceeds(ci);
-    assertThat(info.changeId).isEqualTo(changeId);
-    assertThat(info.revisions.get(info.currentRevision).commit.message).contains(changeIdLine);
-  }
-
-  @Test
-  public void notificationsOnChangeCreation() throws Exception {
-    setApiUser(user);
-    watch(project.get());
-
-    // check that watcher is notified
-    setApiUser(admin);
-    assertCreateSucceeds(newChangeInput(ChangeStatus.NEW));
-
-    List<Message> messages = sender.getMessages();
-    assertThat(messages).hasSize(1);
-    Message m = messages.get(0);
-    assertThat(m.rcpt()).containsExactly(user.emailAddress);
-    assertThat(m.body()).contains(admin.fullName + " has uploaded this change for review.");
-
-    // check that watcher is not notified if notify=NONE
-    sender.clear();
-    ChangeInput input = newChangeInput(ChangeStatus.NEW);
-    input.notify = NotifyHandling.NONE;
-    assertCreateSucceeds(input);
-    assertThat(sender.getMessages()).isEmpty();
-  }
-
-  @Test
-  public void createNewChangeSignedOffByFooter() throws Exception {
-    setSignedOffByFooter(true);
-    try {
-      ChangeInfo info = assertCreateSucceeds(newChangeInput(ChangeStatus.NEW));
-      String message = info.revisions.get(info.currentRevision).commit.message;
-      assertThat(message)
-          .contains(
-              String.format(
-                  "%sAdministrator <%s>", SIGNED_OFF_BY_TAG, admin.getIdent().getEmailAddress()));
-    } finally {
-      setSignedOffByFooter(false);
-    }
-  }
-
-  @Test
-  public void createNewChangeSignedOffByFooterWithChangeId() throws Exception {
-    setSignedOffByFooter(true);
-    try {
-      ChangeInput ci = newChangeInput(ChangeStatus.NEW);
-      String changeId = "I1234000000000000000000000000000000000000";
-      String changeIdLine = "Change-Id: " + changeId;
-      ci.subject = "Subject\n\n" + changeIdLine;
-      ChangeInfo info = assertCreateSucceeds(ci);
-      assertThat(info.changeId).isEqualTo(changeId);
-      String message = info.revisions.get(info.currentRevision).commit.message;
-      assertThat(message).contains(changeIdLine);
-      assertThat(message)
-          .contains(
-              String.format(
-                  "%sAdministrator <%s>", SIGNED_OFF_BY_TAG, admin.getIdent().getEmailAddress()));
-    } finally {
-      setSignedOffByFooter(false);
-    }
-  }
-
-  @Test
-  public void createNewPrivateChange() throws Exception {
-    ChangeInput input = newChangeInput(ChangeStatus.NEW);
-    input.isPrivate = true;
-    assertCreateSucceeds(input);
-  }
-
-  @Test
-  public void createNewWorkInProgressChange() throws Exception {
-    ChangeInput input = newChangeInput(ChangeStatus.NEW);
-    input.workInProgress = true;
-    assertCreateSucceeds(input);
-  }
-
-  @Test
-  public void createChangeWithoutAccessToParentCommitFails() throws Exception {
-    Map<String, PushOneCommit.Result> results =
-        changeInTwoBranches("invisible-branch", "a.txt", "visible-branch", "b.txt");
-    block(project, "refs/heads/invisible-branch", READ, REGISTERED_USERS);
-
-    ChangeInput in = newChangeInput(ChangeStatus.NEW);
-    in.branch = "visible-branch";
-    in.baseChange = results.get("invisible-branch").getChangeId();
-    assertCreateFails(
-        in, UnprocessableEntityException.class, "Base change not found: " + in.baseChange);
-  }
-
-  @Test
-  public void createChangeOnInvisibleBranchFails() throws Exception {
-    changeInTwoBranches("invisible-branch", "a.txt", "branchB", "b.txt");
-    block(project, "refs/heads/invisible-branch", READ, REGISTERED_USERS);
-
-    ChangeInput in = newChangeInput(ChangeStatus.NEW);
-    in.branch = "invisible-branch";
-    assertCreateFails(in, ResourceNotFoundException.class, "");
-  }
-
-  @Test
-  public void noteDbCommit() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    ChangeInfo c = assertCreateSucceeds(newChangeInput(ChangeStatus.NEW));
-    try (Repository repo = repoManager.openRepository(project);
-        RevWalk rw = new RevWalk(repo)) {
-      RevCommit commit =
-          rw.parseCommit(repo.exactRef(changeMetaRef(new Change.Id(c._number))).getObjectId());
-
-      assertThat(commit.getShortMessage()).isEqualTo("Create change");
-
-      PersonIdent expectedAuthor =
-          changeNoteUtil.newIdent(
-              accountCache.get(admin.id).getAccount(),
-              c.created,
-              serverIdent.get(),
-              AnonymousCowardNameProvider.DEFAULT);
-      assertThat(commit.getAuthorIdent()).isEqualTo(expectedAuthor);
-
-      assertThat(commit.getCommitterIdent())
-          .isEqualTo(new PersonIdent(serverIdent.get(), c.created));
-      assertThat(commit.getParentCount()).isEqualTo(0);
-    }
-  }
-
-  @Test
-  public void createMergeChange() throws Exception {
-    changeInTwoBranches("branchA", "a.txt", "branchB", "b.txt");
-    ChangeInput in = newMergeChangeInput("branchA", "branchB", "");
-    assertCreateSucceeds(in);
-  }
-
-  @Test
-  public void createMergeChange_Conflicts() throws Exception {
-    changeInTwoBranches("branchA", "shared.txt", "branchB", "shared.txt");
-    ChangeInput in = newMergeChangeInput("branchA", "branchB", "");
-    assertCreateFails(in, RestApiException.class, "merge conflict");
-  }
-
-  @Test
-  public void createMergeChange_Conflicts_Ours() throws Exception {
-    changeInTwoBranches("branchA", "shared.txt", "branchB", "shared.txt");
-    ChangeInput in = newMergeChangeInput("branchA", "branchB", "ours");
-    assertCreateSucceeds(in);
-  }
-
-  @Test
-  public void invalidSource() throws Exception {
-    changeInTwoBranches("branchA", "a.txt", "branchB", "b.txt");
-    ChangeInput in = newMergeChangeInput("branchA", "invalid", "");
-    assertCreateFails(in, BadRequestException.class, "Cannot resolve 'invalid' to a commit");
-  }
-
-  @Test
-  public void invalidStrategy() throws Exception {
-    changeInTwoBranches("branchA", "a.txt", "branchB", "b.txt");
-    ChangeInput in = newMergeChangeInput("branchA", "branchB", "octopus");
-    assertCreateFails(in, BadRequestException.class, "invalid merge strategy: octopus");
-  }
-
-  @Test
-  public void alreadyMerged() throws Exception {
-    ObjectId c0 =
-        testRepo
-            .branch("HEAD")
-            .commit()
-            .insertChangeId()
-            .message("first commit")
-            .add("a.txt", "a contents ")
-            .create();
-    testRepo
-        .git()
-        .push()
-        .setRemote("origin")
-        .setRefSpecs(new RefSpec("HEAD:refs/heads/master"))
-        .call();
-
-    testRepo
-        .branch("HEAD")
-        .commit()
-        .insertChangeId()
-        .message("second commit")
-        .add("b.txt", "b contents ")
-        .create();
-    testRepo
-        .git()
-        .push()
-        .setRemote("origin")
-        .setRefSpecs(new RefSpec("HEAD:refs/heads/master"))
-        .call();
-
-    ChangeInput in = newMergeChangeInput("master", c0.getName(), "");
-    assertCreateFails(
-        in, ChangeAlreadyMergedException.class, "'" + c0.getName() + "' has already been merged");
-  }
-
-  @Test
-  public void onlyContentMerged() throws Exception {
-    testRepo
-        .branch("HEAD")
-        .commit()
-        .insertChangeId()
-        .message("first commit")
-        .add("a.txt", "a contents ")
-        .create();
-    testRepo
-        .git()
-        .push()
-        .setRemote("origin")
-        .setRefSpecs(new RefSpec("HEAD:refs/heads/master"))
-        .call();
-
-    // create a change, and cherrypick into master
-    PushOneCommit.Result cId = createChange();
-    RevCommit commitId = cId.getCommit();
-    CherryPickInput cpi = new CherryPickInput();
-    cpi.destination = "master";
-    cpi.message = "cherry pick the commit";
-    ChangeApi orig = gApi.changes().id(cId.getChangeId());
-    ChangeApi cherry = orig.current().cherryPick(cpi);
-    cherry.current().review(ReviewInput.approve());
-    cherry.current().submit();
-
-    ObjectId remoteId = getRemoteHead();
-    assertThat(remoteId).isNotEqualTo(commitId);
-
-    ChangeInput in = newMergeChangeInput("master", commitId.getName(), "");
-    assertCreateSucceeds(in);
-  }
-
-  @Test
-  public void cherryPickCommitWithoutChangeId() throws Exception {
-    // This test is a little superfluous, since the current cherry-pick code ignores
-    // the commit message of the to-be-cherry-picked change, using the one in
-    // CherryPickInput instead.
-    CherryPickInput input = new CherryPickInput();
-    input.destination = "foo";
-    input.message = "it goes to foo branch";
-    gApi.projects().name(project.get()).branch(input.destination).create(new BranchInput());
-
-    RevCommit revCommit = createNewCommitWithoutChangeId("refs/heads/master", "a.txt", "content");
-    ChangeInfo changeInfo =
-        gApi.projects().name(project.get()).commit(revCommit.getName()).cherryPick(input).get();
-
-    assertThat(changeInfo.messages).hasSize(1);
-    Iterator<ChangeMessageInfo> messageIterator = changeInfo.messages.iterator();
-    String expectedMessage =
-        String.format("Patch Set 1: Cherry Picked from commit %s.", revCommit.getName());
-    assertThat(messageIterator.next().message).isEqualTo(expectedMessage);
-
-    RevisionInfo revInfo = changeInfo.revisions.get(changeInfo.currentRevision);
-    assertThat(revInfo).isNotNull();
-    CommitInfo commitInfo = revInfo.commit;
-    assertThat(commitInfo.message)
-        .isEqualTo(input.message + "\n\nChange-Id: " + changeInfo.changeId + "\n");
-  }
-
-  @Test
-  public void cherryPickCommitWithChangeId() throws Exception {
-    CherryPickInput input = new CherryPickInput();
-    input.destination = "foo";
-
-    RevCommit revCommit = createChange().getCommit();
-    List<String> footers = revCommit.getFooterLines("Change-Id");
-    assertThat(footers).hasSize(1);
-    String changeId = footers.get(0);
-
-    input.message = "it goes to foo branch\n\nChange-Id: " + changeId;
-    gApi.projects().name(project.get()).branch(input.destination).create(new BranchInput());
-
-    ChangeInfo changeInfo =
-        gApi.projects().name(project.get()).commit(revCommit.getName()).cherryPick(input).get();
-
-    assertThat(changeInfo.messages).hasSize(1);
-    Iterator<ChangeMessageInfo> messageIterator = changeInfo.messages.iterator();
-    String expectedMessage =
-        String.format("Patch Set 1: Cherry Picked from commit %s.", revCommit.getName());
-    assertThat(messageIterator.next().message).isEqualTo(expectedMessage);
-
-    RevisionInfo revInfo = changeInfo.revisions.get(changeInfo.currentRevision);
-    assertThat(revInfo).isNotNull();
-    assertThat(revInfo.commit.message).isEqualTo(input.message + "\n");
-  }
-
-  private ChangeInput newChangeInput(ChangeStatus status) {
-    ChangeInput in = new ChangeInput();
-    in.project = project.get();
-    in.branch = "master";
-    in.subject = "Empty change";
-    in.topic = "support-gerrit-workflow-in-browser";
-    in.status = status;
-    return in;
-  }
-
-  private ChangeInfo assertCreateSucceeds(ChangeInput in) throws Exception {
-    ChangeInfo out = gApi.changes().create(in).get();
-    assertThat(out.project).isEqualTo(in.project);
-    assertThat(out.branch).isEqualTo(in.branch);
-    assertThat(out.subject).isEqualTo(in.subject.split("\n")[0]);
-    assertThat(out.topic).isEqualTo(in.topic);
-    assertThat(out.status).isEqualTo(in.status);
-    assertThat(out.isPrivate).isEqualTo(in.isPrivate);
-    assertThat(out.workInProgress).isEqualTo(in.workInProgress);
-    assertThat(out.revisions).hasSize(1);
-    assertThat(out.submitted).isNull();
-    assertThat(in.status).isEqualTo(ChangeStatus.NEW);
-    return out;
-  }
-
-  private void assertCreateFails(
-      ChangeInput in, Class<? extends RestApiException> errType, String errSubstring)
-      throws Exception {
-    exception.expect(errType);
-    exception.expectMessage(errSubstring);
-    gApi.changes().create(in);
-  }
-
-  // TODO(davido): Expose setting of account preferences in the API
-  private void setSignedOffByFooter(boolean value) throws Exception {
-    RestResponse r = adminRestSession.get("/accounts/" + admin.email + "/preferences");
-    r.assertOK();
-    GeneralPreferencesInfo i = newGson().fromJson(r.getReader(), GeneralPreferencesInfo.class);
-    i.signedOffBy = value;
-
-    r = adminRestSession.put("/accounts/" + admin.email + "/preferences", i);
-    r.assertOK();
-    GeneralPreferencesInfo o = newGson().fromJson(r.getReader(), GeneralPreferencesInfo.class);
-
-    if (value) {
-      assertThat(o.signedOffBy).isTrue();
-    } else {
-      assertThat(o.signedOffBy).isNull();
-    }
-  }
-
-  private ChangeInput newMergeChangeInput(String targetBranch, String sourceRef, String strategy) {
-    // create a merge change from branchA to master in gerrit
-    ChangeInput in = new ChangeInput();
-    in.project = project.get();
-    in.branch = targetBranch;
-    in.subject = "merge " + sourceRef + " to " + targetBranch;
-    in.status = ChangeStatus.NEW;
-    MergeInput mergeInput = new MergeInput();
-    mergeInput.source = sourceRef;
-    in.merge = mergeInput;
-    if (!Strings.isNullOrEmpty(strategy)) {
-      in.merge.strategy = strategy;
-    }
-    return in;
-  }
-
-  /**
-   * Create an empty commit in master, two new branches with one commit each.
-   *
-   * @param branchA name of first branch to create
-   * @param fileA name of file to commit to branchA
-   * @param branchB name of second branch to create
-   * @param fileB name of file to commit to branchB
-   * @return A {@code Map} of branchName => commit result.
-   * @throws Exception
-   */
-  private Map<String, Result> changeInTwoBranches(
-      String branchA, String fileA, String branchB, String fileB) throws Exception {
-    // create a initial commit in master
-    Result initialCommit =
-        pushFactory
-            .create(db, user.getIdent(), testRepo, "initial commit", "readme.txt", "initial commit")
-            .to("refs/heads/master");
-    initialCommit.assertOkStatus();
-
-    // create two new branches
-    createBranch(new Branch.NameKey(project, branchA));
-    createBranch(new Branch.NameKey(project, branchB));
-
-    // create a commit in branchA
-    Result changeA =
-        pushFactory
-            .create(db, user.getIdent(), testRepo, "change A", fileA, "A content")
-            .to("refs/heads/" + branchA);
-    changeA.assertOkStatus();
-
-    // create a commit in branchB
-    PushOneCommit commitB =
-        pushFactory.create(db, user.getIdent(), testRepo, "change B", fileB, "B content");
-    commitB.setParent(initialCommit.getCommit());
-    Result changeB = commitB.to("refs/heads/" + branchB);
-    changeB.assertOkStatus();
-
-    return ImmutableMap.of("master", initialCommit, branchA, changeA, branchB, changeB);
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/DeleteVoteIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/DeleteVoteIT.java
deleted file mode 100644
index ff4eb3d..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/DeleteVoteIT.java
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.acceptance.rest.change;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.extensions.client.ReviewerState.REVIEWER;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.acceptance.RestResponse;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.ChangeMessageInfo;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.testutil.FakeEmailSender;
-import com.google.gson.reflect.TypeToken;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import org.junit.Test;
-
-public class DeleteVoteIT extends AbstractDaemonTest {
-  @Test
-  public void deleteVoteOnChange() throws Exception {
-    deleteVote(false);
-  }
-
-  @Test
-  public void deleteVoteOnRevision() throws Exception {
-    deleteVote(true);
-  }
-
-  private void deleteVote(boolean onRevisionLevel) throws Exception {
-    PushOneCommit.Result r = createChange();
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
-
-    PushOneCommit.Result r2 = amendChange(r.getChangeId());
-
-    setApiUser(user);
-    recommend(r.getChangeId());
-
-    sender.clear();
-    String endPoint =
-        "/changes/"
-            + r.getChangeId()
-            + (onRevisionLevel ? ("/revisions/" + r2.getCommit().getName()) : "")
-            + "/reviewers/"
-            + user.getId().toString()
-            + "/votes/Code-Review";
-
-    RestResponse response = adminRestSession.delete(endPoint);
-    response.assertNoContent();
-
-    List<FakeEmailSender.Message> messages = sender.getMessages();
-    assertThat(messages).hasSize(1);
-    FakeEmailSender.Message msg = messages.get(0);
-    assertThat(msg.rcpt()).containsExactly(user.emailAddress);
-    assertThat(msg.body()).contains(admin.fullName + " has removed a vote on this change.\n");
-    assertThat(msg.body())
-        .contains("Removed Code-Review+1 by " + user.fullName + " <" + user.email + ">\n");
-
-    endPoint =
-        "/changes/"
-            + r.getChangeId()
-            + (onRevisionLevel ? ("/revisions/" + r2.getCommit().getName()) : "")
-            + "/reviewers/"
-            + user.getId().toString()
-            + "/votes";
-
-    response = adminRestSession.get(endPoint);
-    response.assertOK();
-
-    Map<String, Short> m =
-        newGson().fromJson(response.getReader(), new TypeToken<Map<String, Short>>() {}.getType());
-
-    assertThat(m).containsExactly("Code-Review", Short.valueOf((short) 0));
-
-    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
-
-    ChangeMessageInfo message = Iterables.getLast(c.messages);
-    assertThat(message.author._accountId).isEqualTo(admin.getId().get());
-    assertThat(message.message).isEqualTo("Removed Code-Review+1 by User <user@example.com>\n");
-    assertThat(getReviewers(c.reviewers.get(REVIEWER)))
-        .containsExactlyElementsIn(ImmutableSet.of(admin.getId(), user.getId()));
-  }
-
-  private Iterable<Account.Id> getReviewers(Collection<AccountInfo> r) {
-    return Iterables.transform(r, a -> new Account.Id(a._accountId));
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/HashtagsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/HashtagsIT.java
deleted file mode 100644
index 08f0699..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/HashtagsIT.java
+++ /dev/null
@@ -1,313 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.acceptance.rest.change;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.TruthJUnit.assume;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-import static java.util.concurrent.TimeUnit.SECONDS;
-
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Sets;
-import com.google.common.truth.IterableSubject;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.changes.HashtagsInput;
-import com.google.gerrit.extensions.common.ChangeMessageInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.testutil.TestTimeUtil;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-@NoHttpd
-public class HashtagsIT extends AbstractDaemonTest {
-  @Before
-  public void before() {
-    assume().that(notesMigration.readChanges()).isTrue();
-  }
-
-  @BeforeClass
-  public static void setTimeForTesting() {
-    TestTimeUtil.resetWithClockStep(1, SECONDS);
-  }
-
-  @AfterClass
-  public static void restoreTime() {
-    TestTimeUtil.useSystemTime();
-  }
-
-  @Test
-  public void getNoHashtags() throws Exception {
-    // Get on a change with no hashtags returns an empty list.
-    PushOneCommit.Result r = createChange();
-    assertThatGet(r).isEmpty();
-  }
-
-  @Test
-  public void addSingleHashtag() throws Exception {
-    PushOneCommit.Result r = createChange();
-
-    // Adding a single hashtag returns a single hashtag.
-    addHashtags(r, "tag2");
-    assertThatGet(r).containsExactly("tag2");
-    assertMessage(r, "Hashtag added: tag2");
-
-    // Adding another single hashtag to change that already has one hashtag
-    // returns a sorted list of hashtags with existing and new.
-    addHashtags(r, "tag1");
-    assertThatGet(r).containsExactly("tag1", "tag2").inOrder();
-    assertMessage(r, "Hashtag added: tag1");
-  }
-
-  @Test
-  public void addInvalidHashtag() throws Exception {
-    PushOneCommit.Result r = createChange();
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("hashtags may not contain commas");
-    addHashtags(r, "invalid,hashtag");
-  }
-
-  @Test
-  public void addMultipleHashtags() throws Exception {
-    PushOneCommit.Result r = createChange();
-
-    // Adding multiple hashtags returns a sorted list of hashtags.
-    addHashtags(r, "tag3", "tag1");
-    assertThatGet(r).containsExactly("tag1", "tag3").inOrder();
-    assertMessage(r, "Hashtags added: tag1, tag3");
-
-    // Adding multiple hashtags to change that already has hashtags returns a
-    // sorted list of hashtags with existing and new.
-    addHashtags(r, "tag2", "tag4");
-    assertThatGet(r).containsExactly("tag1", "tag2", "tag3", "tag4").inOrder();
-    assertMessage(r, "Hashtags added: tag2, tag4");
-  }
-
-  @Test
-  public void addAlreadyExistingHashtag() throws Exception {
-    // Adding a hashtag that already exists on the change returns a sorted list
-    // of hashtags without duplicates.
-    PushOneCommit.Result r = createChange();
-    addHashtags(r, "tag2");
-    assertThatGet(r).containsExactly("tag2");
-    assertMessage(r, "Hashtag added: tag2");
-    ChangeMessageInfo last = getLastMessage(r);
-
-    addHashtags(r, "tag2");
-    assertThatGet(r).containsExactly("tag2");
-    assertNoNewMessageSince(r, last);
-
-    addHashtags(r, "tag1", "tag2");
-    assertThatGet(r).containsExactly("tag1", "tag2").inOrder();
-    assertMessage(r, "Hashtag added: tag1");
-  }
-
-  @Test
-  public void hashtagsWithPrefix() throws Exception {
-    PushOneCommit.Result r = createChange();
-
-    // Leading # is stripped from added tag.
-    addHashtags(r, "#tag1");
-    assertThatGet(r).containsExactly("tag1");
-    assertMessage(r, "Hashtag added: tag1");
-
-    // Leading # is stripped from multiple added tags.
-    addHashtags(r, "#tag2", "#tag3");
-    assertThatGet(r).containsExactly("tag1", "tag2", "tag3").inOrder();
-    assertMessage(r, "Hashtags added: tag2, tag3");
-
-    // Leading # is stripped from removed tag.
-    removeHashtags(r, "#tag2");
-    assertThatGet(r).containsExactly("tag1", "tag3").inOrder();
-    assertMessage(r, "Hashtag removed: tag2");
-
-    // Leading # is stripped from multiple removed tags.
-    removeHashtags(r, "#tag1", "#tag3");
-    assertThatGet(r).isEmpty();
-    assertMessage(r, "Hashtags removed: tag1, tag3");
-
-    // Leading # and space are stripped from added tag.
-    addHashtags(r, "# tag1");
-    assertThatGet(r).containsExactly("tag1");
-    assertMessage(r, "Hashtag added: tag1");
-
-    // Multiple leading # are stripped from added tag.
-    addHashtags(r, "##tag2");
-    assertThatGet(r).containsExactly("tag1", "tag2").inOrder();
-    assertMessage(r, "Hashtag added: tag2");
-
-    // Multiple leading spaces and # are stripped from added tag.
-    addHashtags(r, "# # tag3");
-    assertThatGet(r).containsExactly("tag1", "tag2", "tag3").inOrder();
-    assertMessage(r, "Hashtag added: tag3");
-  }
-
-  @Test
-  public void removeSingleHashtag() throws Exception {
-    // Removing a single tag from a change that only has that tag returns an
-    // empty list.
-    PushOneCommit.Result r = createChange();
-    addHashtags(r, "tag1");
-    assertThatGet(r).containsExactly("tag1");
-    removeHashtags(r, "tag1");
-    assertThatGet(r).isEmpty();
-    assertMessage(r, "Hashtag removed: tag1");
-
-    // Removing a single tag from a change that has multiple tags returns a
-    // sorted list of remaining tags.
-    addHashtags(r, "tag1", "tag2", "tag3");
-    removeHashtags(r, "tag2");
-    assertThatGet(r).containsExactly("tag1", "tag3").inOrder();
-    assertMessage(r, "Hashtag removed: tag2");
-  }
-
-  @Test
-  public void removeMultipleHashtags() throws Exception {
-    // Removing multiple tags from a change that only has those tags returns an
-    // empty list.
-    PushOneCommit.Result r = createChange();
-    addHashtags(r, "tag1", "tag2");
-    assertThatGet(r).containsExactly("tag1", "tag2").inOrder();
-    removeHashtags(r, "tag1", "tag2");
-    assertThatGet(r).isEmpty();
-    assertMessage(r, "Hashtags removed: tag1, tag2");
-
-    // Removing multiple tags from a change that has multiple tags returns a
-    // sorted list of remaining tags.
-    addHashtags(r, "tag1", "tag2", "tag3", "tag4");
-    assertThatGet(r).containsExactly("tag1", "tag2", "tag3", "tag4").inOrder();
-    removeHashtags(r, "tag2", "tag4");
-    assertThatGet(r).containsExactly("tag1", "tag3").inOrder();
-    assertMessage(r, "Hashtags removed: tag2, tag4");
-  }
-
-  @Test
-  public void removeNotExistingHashtag() throws Exception {
-    // Removing a single hashtag from change that has no hashtags returns an
-    // empty list.
-    PushOneCommit.Result r = createChange();
-    ChangeMessageInfo last = getLastMessage(r);
-    removeHashtags(r, "tag1");
-    assertThatGet(r).isEmpty();
-    assertNoNewMessageSince(r, last);
-
-    // Removing a single non-existing tag from a change that only has one other
-    // tag returns a list of only one tag.
-    addHashtags(r, "tag1");
-    last = getLastMessage(r);
-    removeHashtags(r, "tag4");
-    assertThatGet(r).containsExactly("tag1");
-    assertNoNewMessageSince(r, last);
-
-    // Removing a single non-existing tag from a change that has multiple tags
-    // returns a sorted list of tags without any deleted.
-    addHashtags(r, "tag1", "tag2", "tag3");
-    last = getLastMessage(r);
-    removeHashtags(r, "tag4");
-    assertThatGet(r).containsExactly("tag1", "tag2", "tag3").inOrder();
-    assertNoNewMessageSince(r, last);
-  }
-
-  @Test
-  public void addAndRemove() throws Exception {
-    // Adding and remove hashtags in a single request performs correctly.
-    PushOneCommit.Result r = createChange();
-    addHashtags(r, "tag1", "tag2");
-    HashtagsInput input = new HashtagsInput();
-    input.add = Sets.newHashSet("tag3", "tag4");
-    input.remove = Sets.newHashSet("tag1");
-    gApi.changes().id(r.getChange().getId().get()).setHashtags(input);
-    assertThatGet(r).containsExactly("tag2", "tag3", "tag4");
-    assertMessage(r, "Hashtags added: tag3, tag4\nHashtag removed: tag1");
-
-    // Adding and removing the same hashtag actually removes it.
-    addHashtags(r, "tag1", "tag2");
-    input = new HashtagsInput();
-    input.add = Sets.newHashSet("tag3", "tag4");
-    input.remove = Sets.newHashSet("tag3");
-    gApi.changes().id(r.getChange().getId().get()).setHashtags(input);
-    assertThatGet(r).containsExactly("tag1", "tag2", "tag4");
-    assertMessage(r, "Hashtag removed: tag3");
-  }
-
-  @Test
-  public void hashtagWithMixedCase() throws Exception {
-    PushOneCommit.Result r = createChange();
-    addHashtags(r, "MyHashtag");
-    assertThatGet(r).containsExactly("MyHashtag");
-    assertMessage(r, "Hashtag added: MyHashtag");
-  }
-
-  @Test
-  public void addHashtagWithoutPermissionNotAllowed() throws Exception {
-    PushOneCommit.Result r = createChange();
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    exception.expectMessage("edit hashtags not permitted");
-    addHashtags(r, "MyHashtag");
-  }
-
-  @Test
-  public void addHashtagWithPermissionAllowed() throws Exception {
-    PushOneCommit.Result r = createChange();
-    grant(project, "refs/heads/master", Permission.EDIT_HASHTAGS, false, REGISTERED_USERS);
-    setApiUser(user);
-    addHashtags(r, "MyHashtag");
-    assertThatGet(r).containsExactly("MyHashtag");
-    assertMessage(r, "Hashtag added: MyHashtag");
-  }
-
-  private IterableSubject assertThatGet(PushOneCommit.Result r) throws Exception {
-    return assertThat(gApi.changes().id(r.getChange().getId().get()).getHashtags());
-  }
-
-  private void addHashtags(PushOneCommit.Result r, String... toAdd) throws Exception {
-    HashtagsInput input = new HashtagsInput();
-    input.add = Sets.newHashSet(toAdd);
-    gApi.changes().id(r.getChange().getId().get()).setHashtags(input);
-  }
-
-  private void removeHashtags(PushOneCommit.Result r, String... toRemove) throws Exception {
-    HashtagsInput input = new HashtagsInput();
-    input.remove = Sets.newHashSet(toRemove);
-    gApi.changes().id(r.getChange().getId().get()).setHashtags(input);
-  }
-
-  private void assertMessage(PushOneCommit.Result r, String expectedMessage) throws Exception {
-    assertThat(getLastMessage(r).message).isEqualTo(expectedMessage);
-  }
-
-  private void assertNoNewMessageSince(PushOneCommit.Result r, ChangeMessageInfo expected)
-      throws Exception {
-    checkNotNull(expected);
-    ChangeMessageInfo last = getLastMessage(r);
-    assertThat(last.message).isEqualTo(expected.message);
-    assertThat(last.id).isEqualTo(expected.id);
-  }
-
-  private ChangeMessageInfo getLastMessage(PushOneCommit.Result r) throws Exception {
-    ChangeMessageInfo lastMessage =
-        Iterables.getLast(gApi.changes().id(r.getChange().getId().get()).get().messages, null);
-    assertThat(lastMessage).named(lastMessage.message).isNotNull();
-    return lastMessage;
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/IndexChangeIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/IndexChangeIT.java
deleted file mode 100644
index 94138cf..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/IndexChangeIT.java
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.acceptance.rest.change;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.acceptance.TestAccount;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.project.Util;
-import java.util.List;
-import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
-import org.eclipse.jgit.junit.TestRepository;
-import org.junit.Test;
-
-public class IndexChangeIT extends AbstractDaemonTest {
-  @Test
-  public void indexChange() throws Exception {
-    String changeId = createChange().getChangeId();
-    adminRestSession.post("/changes/" + changeId + "/index/").assertNoContent();
-  }
-
-  @Test
-  public void indexChangeOnNonVisibleBranch() throws Exception {
-    String changeId = createChange().getChangeId();
-    blockRead("refs/heads/master");
-    userRestSession.post("/changes/" + changeId + "/index/").assertNotFound();
-  }
-
-  @Test
-  public void indexChangeAfterOwnerLosesVisibility() throws Exception {
-    // Create a test group with 2 users as members
-    TestAccount user2 = accountCreator.user2();
-    String group = createGroup("test");
-    gApi.groups().id(group).addMembers("admin", "user", user2.username);
-
-    // Create a project and restrict its visibility to the group
-    Project.NameKey p = createProject("p");
-    ProjectConfig cfg = projectCache.checkedGet(p).getConfig();
-    Util.allow(
-        cfg,
-        Permission.READ,
-        groupCache.get(new AccountGroup.NameKey(group)).get().getGroupUUID(),
-        "refs/*");
-    Util.block(cfg, Permission.READ, REGISTERED_USERS, "refs/*");
-    saveProjectConfig(p, cfg);
-
-    // Clone it and push a change as a regular user
-    TestRepository<InMemoryRepository> repo = cloneProject(p, user);
-    PushOneCommit push = pushFactory.create(db, user.getIdent(), repo);
-    PushOneCommit.Result result = push.to("refs/for/master");
-    result.assertOkStatus();
-    assertThat(result.getChange().change().getOwner()).isEqualTo(user.id);
-    String changeId = result.getChangeId();
-
-    // User can see the change and it is mergeable
-    setApiUser(user);
-    List<ChangeInfo> changes = gApi.changes().query(changeId).get();
-    assertThat(changes).hasSize(1);
-    assertThat(changes.get(0).mergeable).isNotNull();
-
-    // Other user can see the change and it is mergeable
-    setApiUser(user2);
-    changes = gApi.changes().query(changeId).get();
-    assertThat(changes).hasSize(1);
-    assertThat(changes.get(0).mergeable).isTrue();
-
-    // Remove the user from the group so they can no longer see the project
-    setApiUser(admin);
-    gApi.groups().id(group).removeMembers("user");
-
-    // User can no longer see the change
-    setApiUser(user);
-    changes = gApi.changes().query(changeId).get();
-    assertThat(changes).isEmpty();
-
-    // Reindex the change
-    setApiUser(admin);
-    gApi.changes().id(changeId).index();
-
-    // Other user can still see the change and it is still mergeable
-    setApiUser(user2);
-    changes = gApi.changes().query(changeId).get();
-    assertThat(changes).hasSize(1);
-    assertThat(changes.get(0).mergeable).isTrue();
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/MoveChangeIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/MoveChangeIT.java
deleted file mode 100644
index 8096bbd..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/MoveChangeIT.java
+++ /dev/null
@@ -1,344 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.acceptance.rest.change;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.GitUtil.pushHead;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.GitUtil;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.common.data.LabelFunction;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.changes.MoveInput;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.api.projects.BranchInput;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.group.SystemGroupBackend;
-import com.google.gerrit.server.project.Util;
-import java.util.Arrays;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.junit.Test;
-
-@NoHttpd
-public class MoveChangeIT extends AbstractDaemonTest {
-  @Test
-  public void moveChangeWithShortRef() throws Exception {
-    // Move change to a different branch using short ref name
-    PushOneCommit.Result r = createChange();
-    Branch.NameKey newBranch = new Branch.NameKey(r.getChange().change().getProject(), "moveTest");
-    createBranch(newBranch);
-    move(r.getChangeId(), newBranch.getShortName());
-    assertThat(r.getChange().change().getDest()).isEqualTo(newBranch);
-  }
-
-  @Test
-  public void moveChangeWithFullRef() throws Exception {
-    // Move change to a different branch using full ref name
-    PushOneCommit.Result r = createChange();
-    Branch.NameKey newBranch = new Branch.NameKey(r.getChange().change().getProject(), "moveTest");
-    createBranch(newBranch);
-    move(r.getChangeId(), newBranch.get());
-    assertThat(r.getChange().change().getDest()).isEqualTo(newBranch);
-  }
-
-  @Test
-  public void moveChangeWithMessage() throws Exception {
-    // Provide a message using --message flag
-    PushOneCommit.Result r = createChange();
-    Branch.NameKey newBranch = new Branch.NameKey(r.getChange().change().getProject(), "moveTest");
-    createBranch(newBranch);
-    String moveMessage = "Moving for the move test";
-    move(r.getChangeId(), newBranch.get(), moveMessage);
-    assertThat(r.getChange().change().getDest()).isEqualTo(newBranch);
-    StringBuilder expectedMessage = new StringBuilder();
-    expectedMessage.append("Change destination moved from master to moveTest");
-    expectedMessage.append("\n\n");
-    expectedMessage.append(moveMessage);
-    assertThat(r.getChange().messages().get(1).getMessage()).isEqualTo(expectedMessage.toString());
-  }
-
-  @Test
-  public void moveChangeToSameRefAsCurrent() throws Exception {
-    // Move change to the branch same as change's destination
-    PushOneCommit.Result r = createChange();
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("Change is already destined for the specified branch");
-    move(r.getChangeId(), r.getChange().change().getDest().get());
-  }
-
-  @Test
-  public void moveChangeToSameChangeId() throws Exception {
-    // Move change to a branch with existing change with same change ID
-    PushOneCommit.Result r = createChange();
-    Branch.NameKey newBranch = new Branch.NameKey(r.getChange().change().getProject(), "moveTest");
-    createBranch(newBranch);
-    int changeNum = r.getChange().change().getChangeId();
-    createChange(newBranch.get(), r.getChangeId());
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage(
-        "Destination "
-            + newBranch.getShortName()
-            + " has a different change with same change key "
-            + r.getChangeId());
-    move(changeNum, newBranch.get());
-  }
-
-  @Test
-  public void moveChangeToNonExistentRef() throws Exception {
-    // Move change to a non-existing branch
-    PushOneCommit.Result r = createChange();
-    Branch.NameKey newBranch =
-        new Branch.NameKey(r.getChange().change().getProject(), "does_not_exist");
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("Destination " + newBranch.get() + " not found in the project");
-    move(r.getChangeId(), newBranch.get());
-  }
-
-  @Test
-  public void moveClosedChange() throws Exception {
-    // Move a change which is not open
-    PushOneCommit.Result r = createChange();
-    Branch.NameKey newBranch = new Branch.NameKey(r.getChange().change().getProject(), "moveTest");
-    createBranch(newBranch);
-    merge(r);
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("Change is merged");
-    move(r.getChangeId(), newBranch.get());
-  }
-
-  @Test
-  public void moveMergeCommitChange() throws Exception {
-    // Move a change which has a merge commit as the current PS
-    // Create a merge commit and push for review
-    PushOneCommit.Result r1 = createChange();
-    PushOneCommit.Result r2 = createChange();
-    TestRepository<?>.CommitBuilder commitBuilder =
-        testRepo.branch("HEAD").commit().insertChangeId();
-    commitBuilder
-        .parent(r1.getCommit())
-        .parent(r2.getCommit())
-        .message("Move change Merge Commit")
-        .author(admin.getIdent())
-        .committer(new PersonIdent(admin.getIdent(), testRepo.getDate()));
-    RevCommit c = commitBuilder.create();
-    pushHead(testRepo, "refs/for/master", false, false);
-
-    // Try to move the merge commit to another branch
-    Branch.NameKey newBranch = new Branch.NameKey(r1.getChange().change().getProject(), "moveTest");
-    createBranch(newBranch);
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("Merge commit cannot be moved");
-    move(GitUtil.getChangeId(testRepo, c).get(), newBranch.get());
-  }
-
-  @Test
-  public void moveChangeToBranchWithoutUploadPerms() throws Exception {
-    // Move change to a destination where user doesn't have upload permissions
-    PushOneCommit.Result r = createChange();
-    Branch.NameKey newBranch =
-        new Branch.NameKey(r.getChange().change().getProject(), "blocked_branch");
-    createBranch(newBranch);
-    block(
-        "refs/for/" + newBranch.get(),
-        Permission.PUSH,
-        systemGroupBackend.getGroup(REGISTERED_USERS).getUUID());
-    exception.expect(AuthException.class);
-    exception.expectMessage("move not permitted");
-    move(r.getChangeId(), newBranch.get());
-  }
-
-  @Test
-  public void moveChangeFromBranchWithoutAbandonPerms() throws Exception {
-    // Move change for which user does not have abandon permissions
-    PushOneCommit.Result r = createChange();
-    Branch.NameKey newBranch = new Branch.NameKey(r.getChange().change().getProject(), "moveTest");
-    createBranch(newBranch);
-    block(
-        r.getChange().change().getDest().get(),
-        Permission.ABANDON,
-        systemGroupBackend.getGroup(REGISTERED_USERS).getUUID());
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    exception.expectMessage("move not permitted");
-    move(r.getChangeId(), newBranch.get());
-  }
-
-  @Test
-  public void moveChangeToBranchThatContainsCurrentCommit() throws Exception {
-    // Move change to a branch for which current PS revision is reachable from
-    // tip
-
-    // Create a change
-    PushOneCommit.Result r = createChange();
-    int changeNum = r.getChange().change().getChangeId();
-
-    // Create a branch with that same commit
-    Branch.NameKey newBranch = new Branch.NameKey(r.getChange().change().getProject(), "moveTest");
-    BranchInput bi = new BranchInput();
-    bi.revision = r.getCommit().name();
-    gApi.projects().name(newBranch.getParentKey().get()).branch(newBranch.get()).create(bi);
-
-    // Try to move the change to the branch with the same commit
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage(
-        "Current patchset revision is reachable from tip of " + newBranch.get());
-    move(changeNum, newBranch.get());
-  }
-
-  @Test
-  public void moveChangeWithCurrentPatchSetLocked() throws Exception {
-    // Move change that is locked
-    PushOneCommit.Result r = createChange();
-    Branch.NameKey newBranch = new Branch.NameKey(r.getChange().change().getProject(), "moveTest");
-    createBranch(newBranch);
-
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    LabelType patchSetLock = Util.patchSetLock();
-    cfg.getLabelSections().put(patchSetLock.getName(), patchSetLock);
-    AccountGroup.UUID registeredUsers = systemGroupBackend.getGroup(REGISTERED_USERS).getUUID();
-    Util.allow(
-        cfg, Permission.forLabel(patchSetLock.getName()), 0, 1, registeredUsers, "refs/heads/*");
-    saveProjectConfig(cfg);
-    grant(project, "refs/heads/*", Permission.LABEL + "Patch-Set-Lock");
-    revision(r).review(new ReviewInput().label("Patch-Set-Lock", 1));
-
-    exception.expect(AuthException.class);
-    exception.expectMessage("move not permitted");
-    move(r.getChangeId(), newBranch.get());
-  }
-
-  @Test
-  public void moveChangeOnlyKeepVetoVotes() throws Exception {
-    // A vote for a label will be kept after moving if the label's function is *WithBlock and the
-    // vote holds the minimum value.
-    createBranch(new Branch.NameKey(project, "foo"));
-
-    String codeReviewLabel = "Code-Review"; // 'Code-Review' uses 'MaxWithBlock' function.
-    String testLabelA = "Label-A";
-    String testLabelB = "Label-B";
-    String testLabelC = "Label-C";
-    configLabel(testLabelA, LabelFunction.ANY_WITH_BLOCK);
-    configLabel(testLabelB, LabelFunction.MAX_NO_BLOCK);
-    configLabel(testLabelC, LabelFunction.NO_BLOCK);
-
-    AccountGroup.UUID registered = SystemGroupBackend.REGISTERED_USERS;
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    Util.allow(cfg, Permission.forLabel(testLabelA), -1, +1, registered, "refs/heads/*");
-    Util.allow(cfg, Permission.forLabel(testLabelB), -1, +1, registered, "refs/heads/*");
-    Util.allow(cfg, Permission.forLabel(testLabelC), -1, +1, registered, "refs/heads/*");
-    saveProjectConfig(cfg);
-
-    String changeId = createChange().getChangeId();
-    gApi.changes().id(changeId).current().review(ReviewInput.reject());
-
-    amendChange(changeId);
-
-    ReviewInput input = new ReviewInput();
-    input.label(testLabelA, -1);
-    input.label(testLabelB, -1);
-    input.label(testLabelC, -1);
-    gApi.changes().id(changeId).current().review(input);
-
-    assertThat(gApi.changes().id(changeId).current().reviewer(admin.email).votes().keySet())
-        .containsExactly(codeReviewLabel, testLabelA, testLabelB, testLabelC);
-    assertThat(gApi.changes().id(changeId).current().reviewer(admin.email).votes().values())
-        .containsExactly((short) -2, (short) -1, (short) -1, (short) -1);
-
-    // Move the change to the 'foo' branch.
-    assertThat(gApi.changes().id(changeId).get().branch).isEqualTo("master");
-    move(changeId, "foo");
-    assertThat(gApi.changes().id(changeId).get().branch).isEqualTo("foo");
-
-    // 'Code-Review -2' and 'Label-A -1' will be kept.
-    assertThat(gApi.changes().id(changeId).current().reviewer(admin.email).votes().values())
-        .containsExactly((short) -2, (short) -1, (short) 0, (short) 0);
-
-    // Move the change back to 'master'.
-    move(changeId, "master");
-    assertThat(gApi.changes().id(changeId).get().branch).isEqualTo("master");
-    assertThat(gApi.changes().id(changeId).current().reviewer(admin.email).votes().values())
-        .containsExactly((short) -2, (short) -1, (short) 0, (short) 0);
-  }
-
-  @Test
-  public void moveToBranchWithoutLabel() throws Exception {
-    createBranch(new Branch.NameKey(project, "foo"));
-    String testLabelA = "Label-A";
-    configLabel(testLabelA, LabelFunction.MAX_WITH_BLOCK, Arrays.asList("refs/heads/master"));
-
-    AccountGroup.UUID registered = SystemGroupBackend.REGISTERED_USERS;
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    Util.allow(cfg, Permission.forLabel(testLabelA), -1, +1, registered, "refs/heads/master");
-    saveProjectConfig(cfg);
-
-    String changeId = createChange().getChangeId();
-
-    ReviewInput input = new ReviewInput();
-    input.label(testLabelA, -1);
-    gApi.changes().id(changeId).current().review(input);
-
-    assertThat(gApi.changes().id(changeId).current().reviewer(admin.email).votes().keySet())
-        .containsExactly(testLabelA);
-    assertThat(gApi.changes().id(changeId).current().reviewer(admin.email).votes().values())
-        .containsExactly((short) -1);
-
-    move(changeId, "foo");
-
-    // TODO(dpursehouse): Assert about state of labels after move
-  }
-
-  @Test
-  public void moveNoDestinationBranchSpecified() throws Exception {
-    PushOneCommit.Result r = createChange();
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("destination branch is required");
-    move(r.getChangeId(), null);
-  }
-
-  private void move(int changeNum, String destination) throws RestApiException {
-    gApi.changes().id(changeNum).move(destination);
-  }
-
-  private void move(String changeId, String destination) throws RestApiException {
-    gApi.changes().id(changeId).move(destination);
-  }
-
-  private void move(String changeId, String destination, String message) throws RestApiException {
-    MoveInput in = new MoveInput();
-    in.destinationBranch = destination;
-    in.message = message;
-    gApi.changes().id(changeId).move(in);
-  }
-
-  private PushOneCommit.Result createChange(String branch, String changeId) throws Exception {
-    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo, changeId);
-    PushOneCommit.Result result = push.to("refs/for/" + branch);
-    result.assertOkStatus();
-    return result;
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/PrivateByDefaultIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/PrivateByDefaultIT.java
deleted file mode 100644
index 993c144..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/PrivateByDefaultIT.java
+++ /dev/null
@@ -1,159 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.acceptance.rest.change;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.GerritConfig;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.extensions.api.projects.ConfigInput;
-import com.google.gerrit.extensions.client.InheritableBoolean;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.ChangeInput;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.reviewdb.client.Project;
-import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.junit.Before;
-import org.junit.Test;
-
-public class PrivateByDefaultIT extends AbstractDaemonTest {
-  private Project.NameKey project1;
-  private Project.NameKey project2;
-
-  @Before
-  public void setUp() throws Exception {
-    project1 = createProject("project-1");
-    project2 = createProject("project-2", project1);
-    setPrivateByDefault(project1, InheritableBoolean.FALSE);
-  }
-
-  @Test
-  public void createChangeWithPrivateByDefaultEnabled() throws Exception {
-    setPrivateByDefault(project2, InheritableBoolean.TRUE);
-    ChangeInput input = new ChangeInput(project2.get(), "master", "empty change");
-    assertThat(gApi.changes().create(input).get().isPrivate).isEqualTo(true);
-  }
-
-  @Test
-  public void createChangeBypassPrivateByDefaultEnabled() throws Exception {
-    setPrivateByDefault(project2, InheritableBoolean.TRUE);
-    ChangeInput input = new ChangeInput(project2.get(), "master", "empty change");
-    input.isPrivate = false;
-    assertThat(gApi.changes().create(input).get().isPrivate).isNull();
-  }
-
-  @Test
-  public void createChangeWithPrivateByDefaultDisabled() throws Exception {
-    ChangeInfo info =
-        gApi.changes().create(new ChangeInput(project2.get(), "master", "empty change")).get();
-    assertThat(info.isPrivate).isNull();
-  }
-
-  @Test
-  public void createChangeWithPrivateByDefaultInherited() throws Exception {
-    setPrivateByDefault(project1, InheritableBoolean.TRUE);
-    ChangeInfo info =
-        gApi.changes().create(new ChangeInput(project2.get(), "master", "empty change")).get();
-    assertThat(info.isPrivate).isTrue();
-  }
-
-  @Test
-  @GerritConfig(name = "change.disablePrivateChanges", value = "true")
-  public void createChangeWithPrivateByDefaultAndDisablePrivateChangesTrue() throws Exception {
-    setPrivateByDefault(project2, InheritableBoolean.TRUE);
-
-    ChangeInput input = new ChangeInput(project2.get(), "master", "empty change");
-    exception.expect(MethodNotAllowedException.class);
-    exception.expectMessage("private changes are disabled");
-    gApi.changes().create(input);
-  }
-
-  @Test
-  public void pushWithPrivateByDefaultEnabled() throws Exception {
-    setPrivateByDefault(project2, InheritableBoolean.TRUE);
-    assertThat(createChange(project2).getChange().change().isPrivate()).isEqualTo(true);
-  }
-
-  @Test
-  public void pushBypassPrivateByDefaultEnabled() throws Exception {
-    setPrivateByDefault(project2, InheritableBoolean.TRUE);
-    assertThat(
-            createChange(project2, "refs/for/master%remove-private")
-                .getChange()
-                .change()
-                .isPrivate())
-        .isEqualTo(false);
-  }
-
-  @Test
-  public void pushWithPrivateByDefaultDisabled() throws Exception {
-    assertThat(createChange(project2).getChange().change().isPrivate()).isEqualTo(false);
-  }
-
-  @Test
-  public void pushBypassPrivateByDefaultInherited() throws Exception {
-    setPrivateByDefault(project1, InheritableBoolean.TRUE);
-    assertThat(createChange(project2).getChange().change().isPrivate()).isEqualTo(true);
-  }
-
-  @Test
-  @GerritConfig(name = "change.disablePrivateChanges", value = "true")
-  public void pushPrivatesWithPrivateByDefaultAndDisablePrivateChangesTrue() throws Exception {
-    setPrivateByDefault(project2, InheritableBoolean.TRUE);
-
-    TestRepository<InMemoryRepository> testRepo = cloneProject(project2);
-    PushOneCommit.Result result =
-        pushFactory.create(db, admin.getIdent(), testRepo).to("refs/for/master%private");
-    result.assertErrorStatus();
-  }
-
-  @Test
-  @GerritConfig(name = "change.disablePrivateChanges", value = "true")
-  public void pushDraftsWithPrivateByDefaultAndDisablePrivateChangesTrue() throws Exception {
-    setPrivateByDefault(project2, InheritableBoolean.TRUE);
-
-    RevCommit initialHead = getRemoteHead();
-    TestRepository<InMemoryRepository> testRepo = cloneProject(project2);
-    PushOneCommit.Result result =
-        pushFactory.create(db, admin.getIdent(), testRepo).to("refs/for/master%draft");
-    result.assertErrorStatus();
-
-    testRepo.reset(initialHead);
-    result = pushFactory.create(db, admin.getIdent(), testRepo).to("refs/drafts/master");
-    result.assertErrorStatus();
-  }
-
-  private void setPrivateByDefault(Project.NameKey proj, InheritableBoolean value)
-      throws Exception {
-    ConfigInput input = new ConfigInput();
-    input.privateByDefault = value;
-    gApi.projects().name(proj.get()).config(input);
-  }
-
-  private PushOneCommit.Result createChange(Project.NameKey proj) throws Exception {
-    return createChange(proj, "refs/for/master");
-  }
-
-  private PushOneCommit.Result createChange(Project.NameKey proj, String ref) throws Exception {
-    TestRepository<InMemoryRepository> testRepo = cloneProject(proj);
-    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
-    PushOneCommit.Result result = push.to(ref);
-    result.assertOkStatus();
-    return result;
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByCherryPickIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByCherryPickIT.java
deleted file mode 100644
index a385932..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByCherryPickIT.java
+++ /dev/null
@@ -1,461 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.acceptance.rest.change;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.TruthJUnit.assume;
-
-import com.google.common.collect.Iterables;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.acceptance.TestProjectInput;
-import com.google.gerrit.common.FooterConstants;
-import com.google.gerrit.extensions.api.changes.SubmitInput;
-import com.google.gerrit.extensions.client.ChangeStatus;
-import com.google.gerrit.extensions.client.InheritableBoolean;
-import com.google.gerrit.extensions.client.ListChangesOption;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.registration.RegistrationHandle;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.server.change.Submit.TestSubmitInput;
-import com.google.gerrit.server.git.ChangeMessageModifier;
-import com.google.gerrit.server.git.strategy.CommitMergeStatus;
-import com.google.inject.Inject;
-import java.util.List;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.junit.Test;
-
-public class SubmitByCherryPickIT extends AbstractSubmit {
-  @Inject private DynamicSet<ChangeMessageModifier> changeMessageModifiers;
-
-  @Override
-  protected SubmitType getSubmitType() {
-    return SubmitType.CHERRY_PICK;
-  }
-
-  @Test
-  public void submitWithCherryPickIfFastForwardPossible() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-    PushOneCommit.Result change = createChange();
-    submit(change.getChangeId());
-    assertCherryPick(testRepo, false);
-    RevCommit newHead = getRemoteHead();
-    assertThat(newHead.getParent(0)).isEqualTo(change.getCommit().getParent(0));
-
-    assertRefUpdatedEvents(initialHead, newHead);
-    assertChangeMergedEvents(change.getChangeId(), newHead.name());
-  }
-
-  @Test
-  public void submitWithCherryPick() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-    PushOneCommit.Result change = createChange("Change 1", "a.txt", "content");
-    submit(change.getChangeId());
-
-    RevCommit headAfterFirstSubmit = getRemoteHead();
-    testRepo.reset(initialHead);
-    PushOneCommit.Result change2 = createChange("Change 2", "b.txt", "other content");
-    submit(change2.getChangeId());
-    assertCherryPick(testRepo, false);
-    RevCommit newHead = getRemoteHead();
-    assertThat(newHead.getParentCount()).isEqualTo(1);
-    assertThat(newHead.getParent(0)).isEqualTo(headAfterFirstSubmit);
-    assertCurrentRevision(change2.getChangeId(), 2, newHead);
-    assertSubmitter(change2.getChangeId(), 1);
-    assertSubmitter(change2.getChangeId(), 2);
-    assertPersonEquals(admin.getIdent(), newHead.getAuthorIdent());
-    assertPersonEquals(admin.getIdent(), newHead.getCommitterIdent());
-
-    assertRefUpdatedEvents(initialHead, headAfterFirstSubmit, headAfterFirstSubmit, newHead);
-    assertChangeMergedEvents(
-        change.getChangeId(), headAfterFirstSubmit.name(), change2.getChangeId(), newHead.name());
-  }
-
-  @Test
-  public void changeMessageOnSubmit() throws Exception {
-    PushOneCommit.Result change = createChange();
-    RegistrationHandle handle =
-        changeMessageModifiers.add(
-            new ChangeMessageModifier() {
-              @Override
-              public String onSubmit(
-                  String newCommitMessage,
-                  RevCommit original,
-                  RevCommit mergeTip,
-                  Branch.NameKey destination) {
-                return newCommitMessage + "Custom: " + destination.get();
-              }
-            });
-    try {
-      submit(change.getChangeId());
-    } finally {
-      handle.remove();
-    }
-    testRepo.git().fetch().setRemote("origin").call();
-    ChangeInfo info = get(change.getChangeId());
-    RevCommit c = testRepo.getRevWalk().parseCommit(ObjectId.fromString(info.currentRevision));
-    testRepo.getRevWalk().parseBody(c);
-    assertThat(c.getFooterLines("Custom")).containsExactly("refs/heads/master");
-    assertThat(c.getFooterLines(FooterConstants.REVIEWED_ON)).hasSize(1);
-  }
-
-  @Test
-  @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
-  public void submitWithContentMerge() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-    PushOneCommit.Result change = createChange("Change 1", "a.txt", "aaa\nbbb\nccc\n");
-    submit(change.getChangeId());
-    RevCommit headAfterFirstSubmit = getRemoteHead();
-    PushOneCommit.Result change2 = createChange("Change 2", "a.txt", "aaa\nbbb\nccc\nddd\n");
-    submit(change2.getChangeId());
-    RevCommit headAfterSecondSubmit = getRemoteHead();
-
-    testRepo.reset(change.getCommit());
-    PushOneCommit.Result change3 = createChange("Change 3", "a.txt", "bbb\nccc\n");
-    submit(change3.getChangeId());
-    assertCherryPick(testRepo, true);
-    RevCommit headAfterThirdSubmit = getRemoteHead();
-    assertThat(headAfterThirdSubmit.getParent(0)).isEqualTo(headAfterSecondSubmit);
-    assertApproved(change3.getChangeId());
-    assertCurrentRevision(change3.getChangeId(), 2, headAfterThirdSubmit);
-    assertSubmitter(change2.getChangeId(), 1);
-    assertSubmitter(change2.getChangeId(), 2);
-
-    assertRefUpdatedEvents(
-        initialHead,
-        headAfterFirstSubmit,
-        headAfterFirstSubmit,
-        headAfterSecondSubmit,
-        headAfterSecondSubmit,
-        headAfterThirdSubmit);
-    assertChangeMergedEvents(
-        change.getChangeId(),
-        headAfterFirstSubmit.name(),
-        change2.getChangeId(),
-        headAfterSecondSubmit.name(),
-        change3.getChangeId(),
-        headAfterThirdSubmit.name());
-  }
-
-  @Test
-  @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
-  public void submitWithContentMerge_Conflict() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-    PushOneCommit.Result change = createChange("Change 1", "a.txt", "content");
-    submit(change.getChangeId());
-
-    RevCommit newHead = getRemoteHead();
-    testRepo.reset(initialHead);
-    PushOneCommit.Result change2 = createChange("Change 2", "a.txt", "other content");
-    submitWithConflict(
-        change2.getChangeId(),
-        "Failed to submit 1 change due to the following problems:\n"
-            + "Change "
-            + change2.getChange().getId()
-            + ": Change could not be "
-            + "merged due to a path conflict. Please rebase the change locally and "
-            + "upload the rebased commit for review.");
-
-    assertThat(getRemoteHead()).isEqualTo(newHead);
-    assertCurrentRevision(change2.getChangeId(), 1, change2.getCommit());
-    assertNoSubmitter(change2.getChangeId(), 1);
-
-    assertRefUpdatedEvents(initialHead, newHead);
-    assertChangeMergedEvents(change.getChangeId(), newHead.name());
-  }
-
-  @Test
-  public void submitOutOfOrder() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-    PushOneCommit.Result change = createChange("Change 1", "a.txt", "content");
-    submit(change.getChangeId());
-
-    RevCommit headAfterFirstSubmit = getRemoteHead();
-    testRepo.reset(initialHead);
-    createChange("Change 2", "b.txt", "other content");
-    PushOneCommit.Result change3 = createChange("Change 3", "c.txt", "different content");
-    submit(change3.getChangeId());
-    assertCherryPick(testRepo, false);
-    RevCommit headAfterSecondSubmit = getRemoteHead();
-    assertThat(headAfterSecondSubmit.getParent(0)).isEqualTo(headAfterFirstSubmit);
-    assertApproved(change3.getChangeId());
-    assertCurrentRevision(change3.getChangeId(), 2, headAfterSecondSubmit);
-    assertSubmitter(change3.getChangeId(), 1);
-    assertSubmitter(change3.getChangeId(), 2);
-
-    assertRefUpdatedEvents(
-        initialHead, headAfterFirstSubmit, headAfterFirstSubmit, headAfterSecondSubmit);
-    assertChangeMergedEvents(
-        change.getChangeId(),
-        headAfterFirstSubmit.name(),
-        change3.getChangeId(),
-        headAfterSecondSubmit.name());
-  }
-
-  @Test
-  public void submitOutOfOrder_Conflict() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-    PushOneCommit.Result change = createChange("Change 1", "a.txt", "content");
-    submit(change.getChangeId());
-
-    RevCommit newHead = getRemoteHead();
-    testRepo.reset(initialHead);
-    createChange("Change 2", "b.txt", "other content");
-    PushOneCommit.Result change3 = createChange("Change 3", "b.txt", "different content");
-    submitWithConflict(
-        change3.getChangeId(),
-        "Failed to submit 1 change due to the following problems:\n"
-            + "Change "
-            + change3.getChange().getId()
-            + ": Change could not be "
-            + "merged due to a path conflict. Please rebase the change locally and "
-            + "upload the rebased commit for review.");
-
-    assertThat(getRemoteHead()).isEqualTo(newHead);
-    assertCurrentRevision(change3.getChangeId(), 1, change3.getCommit());
-    assertNoSubmitter(change3.getChangeId(), 1);
-
-    assertRefUpdatedEvents(initialHead, newHead);
-    assertChangeMergedEvents(change.getChangeId(), newHead.name());
-  }
-
-  @Test
-  public void submitMultipleChanges() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-
-    testRepo.reset(initialHead);
-    PushOneCommit.Result change = createChange("Change 1", "b", "b");
-
-    testRepo.reset(initialHead);
-    PushOneCommit.Result change2 = createChange("Change 2", "c", "c");
-
-    testRepo.reset(initialHead);
-    PushOneCommit.Result change3 = createChange("Change 3", "d", "d");
-
-    approve(change.getChangeId());
-    approve(change2.getChangeId());
-    submit(change3.getChangeId());
-
-    List<RevCommit> log = getRemoteLog();
-    assertThat(log.get(0).getShortMessage()).isEqualTo(change3.getCommit().getShortMessage());
-    assertThat(log.get(1).getId()).isEqualTo(initialHead.getId());
-
-    assertNew(change.getChangeId());
-    assertNew(change2.getChangeId());
-
-    assertRefUpdatedEvents(initialHead, log.get(0));
-    assertChangeMergedEvents(change3.getChangeId(), log.get(0).name());
-  }
-
-  @Test
-  public void submitDependentNonConflictingChangesOutOfOrder() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-
-    testRepo.reset(initialHead);
-    PushOneCommit.Result change = createChange("Change 1", "b", "b");
-    PushOneCommit.Result change2 = createChange("Change 2", "c", "c");
-    assertThat(change2.getCommit().getParent(0)).isEqualTo(change.getCommit());
-
-    // Submit succeeds; change2 is successfully cherry-picked onto head.
-    submit(change2.getChangeId());
-    RevCommit headAfterFirstSubmit = getRemoteHead();
-    // Submit succeeds; change is successfully cherry-picked onto head
-    // (which was change2's cherry-pick).
-    submit(change.getChangeId());
-    RevCommit headAfterSecondSubmit = getRemoteHead();
-
-    // change is the new tip.
-    List<RevCommit> log = getRemoteLog();
-    assertThat(log.get(0).getShortMessage()).isEqualTo(change.getCommit().getShortMessage());
-    assertThat(log.get(0).getParent(0)).isEqualTo(log.get(1));
-
-    assertThat(log.get(1).getShortMessage()).isEqualTo(change2.getCommit().getShortMessage());
-    assertThat(log.get(1).getParent(0)).isEqualTo(log.get(2));
-
-    assertThat(log.get(2).getId()).isEqualTo(initialHead.getId());
-
-    assertRefUpdatedEvents(
-        initialHead, headAfterFirstSubmit, headAfterFirstSubmit, headAfterSecondSubmit);
-    assertChangeMergedEvents(
-        change2.getChangeId(),
-        headAfterFirstSubmit.name(),
-        change.getChangeId(),
-        headAfterSecondSubmit.name());
-  }
-
-  @Test
-  public void submitDependentConflictingChangesOutOfOrder() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-
-    testRepo.reset(initialHead);
-    PushOneCommit.Result change = createChange("Change 1", "b", "b1");
-    PushOneCommit.Result change2 = createChange("Change 2", "b", "b2");
-    assertThat(change2.getCommit().getParent(0)).isEqualTo(change.getCommit());
-
-    // Submit fails; change2 contains the delta "b1" -> "b2", which cannot be
-    // applied against tip.
-    submitWithConflict(
-        change2.getChangeId(),
-        "Failed to submit 1 change due to the following problems:\n"
-            + "Change "
-            + change2.getChange().getId()
-            + ": Change could not be "
-            + "merged due to a path conflict. Please rebase the change locally and "
-            + "upload the rebased commit for review.");
-
-    ChangeInfo info3 = get(change2.getChangeId(), ListChangesOption.MESSAGES);
-    assertThat(info3.status).isEqualTo(ChangeStatus.NEW);
-
-    // Tip has not changed.
-    List<RevCommit> log = getRemoteLog();
-    assertThat(log.get(0)).isEqualTo(initialHead.getId());
-    assertNoSubmitter(change2.getChangeId(), 1);
-
-    assertRefUpdatedEvents();
-    assertChangeMergedEvents();
-  }
-
-  @Test
-  public void submitSubsetOfDependentChanges() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-
-    testRepo.reset(initialHead);
-    PushOneCommit.Result change = createChange("Change 1", "b", "b");
-    PushOneCommit.Result change2 = createChange("Change 2", "c", "c");
-    PushOneCommit.Result change3 = createChange("Change 3", "e", "e");
-
-    // Out of the above, only submit change 3. Changes 1 and 2 are not
-    // related to change 3 by topic or ancestor (due to cherrypicking!)
-    approve(change2.getChangeId());
-    submit(change3.getChangeId());
-    RevCommit newHead = getRemoteHead();
-
-    assertNew(change.getChangeId());
-    assertNew(change2.getChangeId());
-
-    assertRefUpdatedEvents(initialHead, newHead);
-    assertChangeMergedEvents(change3.getChangeId(), newHead.name());
-  }
-
-  @Test
-  @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
-  public void submitIdenticalTree() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-
-    PushOneCommit.Result change1 = createChange("Change 1", "a.txt", "a");
-
-    testRepo.reset(initialHead);
-    PushOneCommit.Result change2 = createChange("Change 2", "a.txt", "a");
-
-    submit(change1.getChangeId());
-    RevCommit headAfterFirstSubmit = getRemoteHead();
-    assertThat(headAfterFirstSubmit.getShortMessage()).isEqualTo("Change 1");
-
-    submit(change2.getChangeId(), new SubmitInput(), null, null);
-
-    assertThat(getRemoteHead()).isEqualTo(headAfterFirstSubmit);
-
-    ChangeInfo info2 = get(change2.getChangeId());
-    assertThat(info2.status).isEqualTo(ChangeStatus.MERGED);
-    assertThat(Iterables.getLast(info2.messages).message)
-        .isEqualTo(CommitMergeStatus.SKIPPED_IDENTICAL_TREE.getMessage());
-
-    assertRefUpdatedEvents(initialHead, headAfterFirstSubmit);
-    assertChangeMergedEvents(
-        change1.getChangeId(),
-        headAfterFirstSubmit.name(),
-        change2.getChangeId(),
-        headAfterFirstSubmit.name());
-  }
-
-  @Test
-  public void repairChangeStateAfterFailure() throws Exception {
-    // In NoteDb-only mode, repo and meta updates are atomic (at least in InMemoryRepository).
-    assume().that(notesMigration.disableChangeReviewDb()).isFalse();
-
-    RevCommit initialHead = getRemoteHead();
-    PushOneCommit.Result change = createChange("Change 1", "a.txt", "content");
-    submit(change.getChangeId());
-
-    RevCommit headAfterFirstSubmit = getRemoteHead();
-    testRepo.reset(initialHead);
-    PushOneCommit.Result change2 = createChange("Change 2", "b.txt", "other content");
-    Change.Id id2 = change2.getChange().getId();
-    TestSubmitInput failInput = new TestSubmitInput();
-    failInput.failAfterRefUpdates = true;
-    submit(
-        change2.getChangeId(),
-        failInput,
-        ResourceConflictException.class,
-        "Failing after ref updates");
-    RevCommit headAfterFailedSubmit = getRemoteHead();
-
-    // Bad: ref advanced but change wasn't updated.
-    PatchSet.Id psId1 = new PatchSet.Id(id2, 1);
-    PatchSet.Id psId2 = new PatchSet.Id(id2, 2);
-    ChangeInfo info = gApi.changes().id(id2.get()).get();
-    assertThat(info.status).isEqualTo(ChangeStatus.NEW);
-    assertThat(info.revisions.get(info.currentRevision)._number).isEqualTo(1);
-    assertThat(getPatchSet(psId2)).isNull();
-
-    ObjectId rev2;
-    try (Repository repo = repoManager.openRepository(project);
-        RevWalk rw = new RevWalk(repo)) {
-      ObjectId rev1 = repo.exactRef(psId1.toRefName()).getObjectId();
-      assertThat(rev1).isNotNull();
-
-      rev2 = repo.exactRef(psId2.toRefName()).getObjectId();
-      assertThat(rev2).isNotNull();
-      assertThat(rev2).isNotEqualTo(rev1);
-      assertThat(rw.parseCommit(rev2).getParent(0)).isEqualTo(headAfterFirstSubmit);
-
-      assertThat(repo.exactRef("refs/heads/master").getObjectId()).isEqualTo(rev2);
-    }
-
-    submit(change2.getChangeId());
-
-    // Change status and patch set entities were updated, and branch tip stayed
-    // the same.
-    RevCommit headAfterSecondSubmit = getRemoteHead();
-    assertThat(headAfterSecondSubmit).isEqualTo(headAfterFailedSubmit);
-    info = gApi.changes().id(id2.get()).get();
-    assertThat(info.status).isEqualTo(ChangeStatus.MERGED);
-    assertThat(info.revisions.get(info.currentRevision)._number).isEqualTo(2);
-    PatchSet ps2 = getPatchSet(psId2);
-    assertThat(ps2).isNotNull();
-    assertThat(ps2.getRevision().get()).isEqualTo(rev2.name());
-    assertThat(Iterables.getLast(info.messages).message)
-        .isEqualTo(
-            "Change has been successfully cherry-picked as " + rev2.name() + " by Administrator");
-
-    try (Repository repo = repoManager.openRepository(project)) {
-      assertThat(repo.exactRef("refs/heads/master").getObjectId()).isEqualTo(rev2);
-    }
-
-    assertRefUpdatedEvents(initialHead, headAfterFirstSubmit);
-    assertChangeMergedEvents(
-        change.getChangeId(),
-        headAfterFirstSubmit.name(),
-        change2.getChangeId(),
-        headAfterSecondSubmit.name());
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByFastForwardIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByFastForwardIT.java
deleted file mode 100644
index d4397d64..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByFastForwardIT.java
+++ /dev/null
@@ -1,218 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.acceptance.rest.change;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.TruthJUnit.assume;
-import static com.google.gerrit.acceptance.GitUtil.pushHead;
-
-import com.google.common.collect.Iterables;
-import com.google.gerrit.acceptance.GitUtil;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.client.ChangeStatus;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.extensions.common.ActionInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.server.change.Submit.TestSubmitInput;
-import java.util.Map;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.PushResult;
-import org.junit.Test;
-
-public class SubmitByFastForwardIT extends AbstractSubmit {
-
-  @Override
-  protected SubmitType getSubmitType() {
-    return SubmitType.FAST_FORWARD_ONLY;
-  }
-
-  @Test
-  public void submitWithFastForward() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-    PushOneCommit.Result change = createChange();
-    submit(change.getChangeId());
-    RevCommit updatedHead = getRemoteHead();
-    assertThat(updatedHead.getId()).isEqualTo(change.getCommit());
-    assertThat(updatedHead.getParent(0)).isEqualTo(initialHead);
-    assertSubmitter(change.getChangeId(), 1);
-
-    assertRefUpdatedEvents(initialHead, updatedHead);
-    assertChangeMergedEvents(change.getChangeId(), updatedHead.name());
-  }
-
-  @Test
-  public void submitMultipleChangesWithFastForward() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-
-    PushOneCommit.Result change = createChange();
-    PushOneCommit.Result change2 = createChange();
-    PushOneCommit.Result change3 = createChange();
-
-    String id1 = change.getChangeId();
-    String id2 = change2.getChangeId();
-    String id3 = change3.getChangeId();
-    approve(id1);
-    approve(id2);
-    submit(id3);
-
-    RevCommit updatedHead = getRemoteHead();
-    assertThat(updatedHead.getId()).isEqualTo(change3.getCommit());
-    assertThat(updatedHead.getParent(0).getId()).isEqualTo(change2.getCommit());
-    assertSubmitter(change.getChangeId(), 1);
-    assertSubmitter(change2.getChangeId(), 1);
-    assertSubmitter(change3.getChangeId(), 1);
-    assertPersonEquals(admin.getIdent(), updatedHead.getAuthorIdent());
-    assertPersonEquals(admin.getIdent(), updatedHead.getCommitterIdent());
-    assertSubmittedTogether(id1, id3, id2, id1);
-    assertSubmittedTogether(id2, id3, id2, id1);
-    assertSubmittedTogether(id3, id3, id2, id1);
-
-    assertRefUpdatedEvents(initialHead, updatedHead);
-    assertChangeMergedEvents(
-        id1, updatedHead.name(), id2, updatedHead.name(), id3, updatedHead.name());
-  }
-
-  @Test
-  public void submitTwoChangesWithFastForward_missingDependency() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-    PushOneCommit.Result change1 = createChange();
-    PushOneCommit.Result change2 = createChange();
-
-    Change.Id id1 = change1.getPatchSetId().getParentKey();
-    submitWithConflict(
-        change2.getChangeId(),
-        "Failed to submit 2 changes due to the following problems:\n"
-            + "Change "
-            + id1
-            + ": needs Code-Review");
-
-    RevCommit updatedHead = getRemoteHead();
-    assertThat(updatedHead.getId()).isEqualTo(initialHead.getId());
-    assertRefUpdatedEvents();
-    assertChangeMergedEvents();
-  }
-
-  @Test
-  public void submitFastForwardNotPossible_Conflict() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-    PushOneCommit.Result change = createChange("Change 1", "a.txt", "content");
-    submit(change.getChangeId());
-
-    RevCommit headAfterFirstSubmit = getRemoteHead();
-    testRepo.reset(initialHead);
-    PushOneCommit.Result change2 = createChange("Change 2", "b.txt", "other content");
-
-    approve(change2.getChangeId());
-    Map<String, ActionInfo> actions = getActions(change2.getChangeId());
-
-    assertThat(actions).containsKey("submit");
-    ActionInfo info = actions.get("submit");
-    assertThat(info.enabled).isNull();
-
-    submitWithConflict(
-        change2.getChangeId(),
-        "Failed to submit 1 change due to the following problems:\n"
-            + "Change "
-            + change2.getChange().getId()
-            + ": Project policy requires "
-            + "all submissions to be a fast-forward. Please rebase the change "
-            + "locally and upload again for review.");
-    assertThat(getRemoteHead()).isEqualTo(headAfterFirstSubmit);
-    assertSubmitter(change.getChangeId(), 1);
-
-    assertRefUpdatedEvents(initialHead, headAfterFirstSubmit);
-    assertChangeMergedEvents(change.getChangeId(), headAfterFirstSubmit.name());
-  }
-
-  @Test
-  public void repairChangeStateAfterFailure() throws Exception {
-    // In NoteDb-only mode, repo and meta updates are atomic (at least in InMemoryRepository).
-    assume().that(notesMigration.disableChangeReviewDb()).isFalse();
-
-    PushOneCommit.Result change = createChange("Change 1", "a.txt", "content");
-    Change.Id id = change.getChange().getId();
-    TestSubmitInput failInput = new TestSubmitInput();
-    failInput.failAfterRefUpdates = true;
-    submit(
-        change.getChangeId(),
-        failInput,
-        ResourceConflictException.class,
-        "Failing after ref updates");
-
-    // Bad: ref advanced but change wasn't updated.
-    PatchSet.Id psId = new PatchSet.Id(id, 1);
-    ChangeInfo info = gApi.changes().id(id.get()).get();
-    assertThat(info.status).isEqualTo(ChangeStatus.NEW);
-    assertThat(info.revisions.get(info.currentRevision)._number).isEqualTo(1);
-
-    ObjectId rev;
-    try (Repository repo = repoManager.openRepository(project);
-        RevWalk rw = new RevWalk(repo)) {
-      rev = repo.exactRef(psId.toRefName()).getObjectId();
-      assertThat(rev).isNotNull();
-      assertThat(repo.exactRef("refs/heads/master").getObjectId()).isEqualTo(rev);
-    }
-
-    submit(change.getChangeId());
-
-    // Change status was updated, and branch tip stayed the same.
-    info = gApi.changes().id(id.get()).get();
-    assertThat(info.status).isEqualTo(ChangeStatus.MERGED);
-    assertThat(info.revisions.get(info.currentRevision)._number).isEqualTo(1);
-    assertThat(Iterables.getLast(info.messages).message)
-        .isEqualTo("Change has been successfully merged by Administrator");
-
-    try (Repository repo = repoManager.openRepository(project)) {
-      assertThat(repo.exactRef("refs/heads/master").getObjectId()).isEqualTo(rev);
-    }
-
-    assertRefUpdatedEvents();
-    assertChangeMergedEvents(change.getChangeId(), getRemoteHead().name());
-  }
-
-  @Test
-  public void submitSameCommitsAsInExperimentalBranch() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-
-    grant(project, "refs/heads/*", Permission.CREATE);
-    grant(project, "refs/heads/experimental", Permission.PUSH);
-
-    RevCommit c1 = commitBuilder().add("b.txt", "1").message("commit at tip").create();
-    String id1 = GitUtil.getChangeId(testRepo, c1).get();
-
-    PushResult r1 = pushHead(testRepo, "refs/for/master", false);
-    assertThat(r1.getRemoteUpdate("refs/for/master").getNewObjectId()).isEqualTo(c1.getId());
-
-    PushResult r2 = pushHead(testRepo, "refs/heads/experimental", false);
-    assertThat(r2.getRemoteUpdate("refs/heads/experimental").getNewObjectId())
-        .isEqualTo(c1.getId());
-
-    submit(id1);
-    RevCommit headAfterSubmit = getRemoteHead();
-
-    assertThat(getRemoteHead().getId()).isEqualTo(c1.getId());
-    assertSubmitter(id1, 1);
-
-    assertRefUpdatedEvents(initialHead, headAfterSubmit);
-    assertChangeMergedEvents(id1, headAfterSubmit.name());
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeIfNecessaryIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeIfNecessaryIT.java
deleted file mode 100644
index bb4abe1..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeIfNecessaryIT.java
+++ /dev/null
@@ -1,539 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.acceptance.rest.change;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.fail;
-
-import com.google.gerrit.acceptance.GitUtil;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.extensions.api.changes.ChangeApi;
-import com.google.gerrit.extensions.api.changes.CherryPickInput;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.api.projects.BranchInput;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.extensions.restapi.BinaryResult;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Project;
-import java.io.File;
-import java.io.InputStream;
-import java.nio.file.Files;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.zip.GZIPInputStream;
-import org.apache.commons.compress.archivers.ArchiveStreamFactory;
-import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
-import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.transport.RefSpec;
-import org.junit.Test;
-
-public class SubmitByMergeIfNecessaryIT extends AbstractSubmitByMerge {
-
-  @Override
-  protected SubmitType getSubmitType() {
-    return SubmitType.MERGE_IF_NECESSARY;
-  }
-
-  @Test
-  public void submitWithFastForward() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-    PushOneCommit.Result change = createChange();
-    submit(change.getChangeId());
-    RevCommit updatedHead = getRemoteHead();
-    assertThat(updatedHead.getId()).isEqualTo(change.getCommit());
-    assertThat(updatedHead.getParent(0)).isEqualTo(initialHead);
-    assertSubmitter(change.getChangeId(), 1);
-    assertPersonEquals(admin.getIdent(), updatedHead.getAuthorIdent());
-    assertPersonEquals(admin.getIdent(), updatedHead.getCommitterIdent());
-
-    assertRefUpdatedEvents(initialHead, updatedHead);
-    assertChangeMergedEvents(change.getChangeId(), updatedHead.name());
-  }
-
-  @Test
-  public void submitMultipleChanges() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-
-    testRepo.reset(initialHead);
-    PushOneCommit.Result change = createChange("Change 1", "b", "b");
-
-    testRepo.reset(initialHead);
-    PushOneCommit.Result change2 = createChange("Change 2", "c", "c");
-
-    testRepo.reset(initialHead);
-    PushOneCommit.Result change3 = createChange("Change 3", "d", "d");
-    PushOneCommit.Result change4 = createChange("Change 4", "e", "e");
-    PushOneCommit.Result change5 = createChange("Change 5", "f", "f");
-
-    // Change 2 is a fast-forward, no need to merge.
-    submit(change2.getChangeId());
-
-    RevCommit headAfterFirstSubmit = getRemoteLog().get(0);
-    assertThat(headAfterFirstSubmit.getShortMessage())
-        .isEqualTo(change2.getCommit().getShortMessage());
-    assertThat(headAfterFirstSubmit.getParent(0).getId()).isEqualTo(initialHead.getId());
-    assertPersonEquals(admin.getIdent(), headAfterFirstSubmit.getAuthorIdent());
-    assertPersonEquals(admin.getIdent(), headAfterFirstSubmit.getCommitterIdent());
-
-    // We need to merge changes 3, 4 and 5.
-    approve(change3.getChangeId());
-    approve(change4.getChangeId());
-    submit(change5.getChangeId());
-
-    RevCommit headAfterSecondSubmit = getRemoteLog().get(0);
-    assertThat(headAfterSecondSubmit.getParent(1).getShortMessage())
-        .isEqualTo(change5.getCommit().getShortMessage());
-    assertThat(headAfterSecondSubmit.getParent(0).getShortMessage())
-        .isEqualTo(change2.getCommit().getShortMessage());
-
-    assertPersonEquals(admin.getIdent(), headAfterSecondSubmit.getAuthorIdent());
-    assertPersonEquals(serverIdent.get(), headAfterSecondSubmit.getCommitterIdent());
-
-    // First change stays untouched.
-    assertNew(change.getChangeId());
-
-    // The two submit operations should have resulted in two ref-update events
-    // and three change-merged events.
-    assertRefUpdatedEvents(
-        initialHead, headAfterFirstSubmit, headAfterFirstSubmit, headAfterSecondSubmit);
-    assertChangeMergedEvents(
-        change2.getChangeId(),
-        headAfterFirstSubmit.name(),
-        change3.getChangeId(),
-        headAfterSecondSubmit.name(),
-        change4.getChangeId(),
-        headAfterSecondSubmit.name(),
-        change5.getChangeId(),
-        headAfterSecondSubmit.name());
-  }
-
-  @Test
-  public void submitChangesAcrossRepos() throws Exception {
-    Project.NameKey p1 = createProject("project-where-we-submit");
-    Project.NameKey p2 = createProject("project-impacted-via-topic");
-    Project.NameKey p3 = createProject("project-impacted-indirectly-via-topic");
-
-    RevCommit initialHead2 = getRemoteHead(p2, "master");
-    RevCommit initialHead3 = getRemoteHead(p3, "master");
-
-    TestRepository<?> repo1 = cloneProject(p1);
-    TestRepository<?> repo2 = cloneProject(p2);
-    TestRepository<?> repo3 = cloneProject(p3);
-
-    PushOneCommit.Result change1a =
-        createChange(
-            repo1,
-            "master",
-            "An ancestor of the change we want to submit",
-            "a.txt",
-            "1",
-            "dependent-topic");
-    PushOneCommit.Result change1b =
-        createChange(
-            repo1,
-            "master",
-            "We're interested in submitting this change",
-            "a.txt",
-            "2",
-            "topic-to-submit");
-
-    PushOneCommit.Result change2a =
-        createChange(repo2, "master", "indirection level 1", "a.txt", "1", "topic-indirect");
-    PushOneCommit.Result change2b =
-        createChange(
-            repo2, "master", "should go in with first change", "a.txt", "2", "dependent-topic");
-
-    PushOneCommit.Result change3 =
-        createChange(repo3, "master", "indirection level 2", "a.txt", "1", "topic-indirect");
-
-    approve(change1a.getChangeId());
-    approve(change2a.getChangeId());
-    approve(change2b.getChangeId());
-    approve(change3.getChangeId());
-
-    // get a preview before submitting:
-    Map<Branch.NameKey, ObjectId> preview = fetchFromSubmitPreview(change1b.getChangeId());
-    submit(change1b.getChangeId());
-
-    RevCommit tip1 = getRemoteLog(p1, "master").get(0);
-    RevCommit tip2 = getRemoteLog(p2, "master").get(0);
-    RevCommit tip3 = getRemoteLog(p3, "master").get(0);
-
-    assertThat(tip1.getShortMessage()).isEqualTo(change1b.getCommit().getShortMessage());
-
-    if (isSubmitWholeTopicEnabled()) {
-      assertThat(tip2.getShortMessage()).isEqualTo(change2b.getCommit().getShortMessage());
-      assertThat(tip3.getShortMessage()).isEqualTo(change3.getCommit().getShortMessage());
-
-      // check that the preview matched what happened:
-      assertThat(preview).hasSize(3);
-
-      assertThat(preview).containsKey(new Branch.NameKey(p1, "refs/heads/master"));
-      assertTrees(p1, preview);
-
-      assertThat(preview).containsKey(new Branch.NameKey(p2, "refs/heads/master"));
-      assertTrees(p2, preview);
-
-      assertThat(preview).containsKey(new Branch.NameKey(p3, "refs/heads/master"));
-      assertTrees(p3, preview);
-    } else {
-      assertThat(tip2.getShortMessage()).isEqualTo(initialHead2.getShortMessage());
-      assertThat(tip3.getShortMessage()).isEqualTo(initialHead3.getShortMessage());
-      assertThat(preview).hasSize(1);
-      assertThat(preview.get(new Branch.NameKey(p1, "refs/heads/master"))).isNotNull();
-    }
-  }
-
-  @Test
-  public void submitChangesAcrossReposBlocked() throws Exception {
-    Project.NameKey p1 = createProject("project-where-we-submit");
-    Project.NameKey p2 = createProject("project-impacted-via-topic");
-    Project.NameKey p3 = createProject("project-impacted-indirectly-via-topic");
-
-    TestRepository<?> repo1 = cloneProject(p1);
-    TestRepository<?> repo2 = cloneProject(p2);
-    TestRepository<?> repo3 = cloneProject(p3);
-
-    RevCommit initialHead1 = getRemoteHead(p1, "master");
-    RevCommit initialHead2 = getRemoteHead(p2, "master");
-    RevCommit initialHead3 = getRemoteHead(p3, "master");
-
-    PushOneCommit.Result change1a =
-        createChange(
-            repo1,
-            "master",
-            "An ancestor of the change we want to submit",
-            "a.txt",
-            "1",
-            "dependent-topic");
-    PushOneCommit.Result change1b =
-        createChange(
-            repo1,
-            "master",
-            "we're interested to submit this change",
-            "a.txt",
-            "2",
-            "topic-to-submit");
-
-    PushOneCommit.Result change2a =
-        createChange(repo2, "master", "indirection level 2a", "a.txt", "1", "topic-indirect");
-    PushOneCommit.Result change2b =
-        createChange(
-            repo2, "master", "should go in with first change", "a.txt", "2", "dependent-topic");
-
-    PushOneCommit.Result change3 =
-        createChange(repo3, "master", "indirection level 2b", "a.txt", "1", "topic-indirect");
-
-    // Create a merge conflict for change3 which is only indirectly related
-    // via topics.
-    repo3.reset(initialHead3);
-    PushOneCommit.Result change3Conflict =
-        createChange(repo3, "master", "conflicting change", "a.txt", "2\n2", "conflicting-topic");
-    submit(change3Conflict.getChangeId());
-    RevCommit tipConflict = getRemoteLog(p3, "master").get(0);
-    assertThat(tipConflict.getShortMessage())
-        .isEqualTo(change3Conflict.getCommit().getShortMessage());
-
-    approve(change1a.getChangeId());
-    approve(change2a.getChangeId());
-    approve(change2b.getChangeId());
-    approve(change3.getChangeId());
-
-    if (isSubmitWholeTopicEnabled()) {
-      String msg =
-          "Failed to submit 5 changes due to the following problems:\n"
-              + "Change "
-              + change3.getChange().getId()
-              + ": Change could not be "
-              + "merged due to a path conflict. Please rebase the change locally "
-              + "and upload the rebased commit for review.";
-
-      // Get a preview before submitting:
-      try (BinaryResult r = submitPreview(change1b.getChangeId())) {
-        // We cannot just use the ExpectedException infrastructure as provided
-        // by AbstractDaemonTest, as then we'd stop early and not test the
-        // actual submit.
-
-        fail("expected failure");
-      } catch (RestApiException e) {
-        assertThat(e.getMessage()).isEqualTo(msg);
-      }
-      submitWithConflict(change1b.getChangeId(), msg);
-    } else {
-      submit(change1b.getChangeId());
-    }
-
-    RevCommit tip1 = getRemoteLog(p1, "master").get(0);
-    RevCommit tip2 = getRemoteLog(p2, "master").get(0);
-    RevCommit tip3 = getRemoteLog(p3, "master").get(0);
-    if (isSubmitWholeTopicEnabled()) {
-      assertThat(tip1.getShortMessage()).isEqualTo(initialHead1.getShortMessage());
-      assertThat(tip2.getShortMessage()).isEqualTo(initialHead2.getShortMessage());
-      assertThat(tip3.getShortMessage()).isEqualTo(change3Conflict.getCommit().getShortMessage());
-      assertNoSubmitter(change1a.getChangeId(), 1);
-      assertNoSubmitter(change2a.getChangeId(), 1);
-      assertNoSubmitter(change2b.getChangeId(), 1);
-      assertNoSubmitter(change3.getChangeId(), 1);
-    } else {
-      assertThat(tip1.getShortMessage()).isEqualTo(change1b.getCommit().getShortMessage());
-      assertThat(tip2.getShortMessage()).isEqualTo(initialHead2.getShortMessage());
-      assertThat(tip3.getShortMessage()).isEqualTo(change3Conflict.getCommit().getShortMessage());
-      assertNoSubmitter(change2a.getChangeId(), 1);
-      assertNoSubmitter(change2b.getChangeId(), 1);
-      assertNoSubmitter(change3.getChangeId(), 1);
-    }
-  }
-
-  @Test
-  public void submitWithMergedAncestorsOnOtherBranch() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-
-    PushOneCommit.Result change1 =
-        createChange(testRepo, "master", "base commit", "a.txt", "1", "");
-    submit(change1.getChangeId());
-    RevCommit headAfterFirstSubmit = getRemoteHead();
-
-    gApi.projects().name(project.get()).branch("branch").create(new BranchInput());
-
-    PushOneCommit.Result change2 =
-        createChange(
-            testRepo, "master", "We want to commit this to master first", "a.txt", "2", "");
-
-    submit(change2.getChangeId());
-
-    RevCommit headAfterSecondSubmit = getRemoteLog(project, "master").get(0);
-    assertThat(headAfterSecondSubmit.getShortMessage())
-        .isEqualTo(change2.getCommit().getShortMessage());
-
-    RevCommit tip2 = getRemoteLog(project, "branch").get(0);
-    assertThat(tip2.getShortMessage()).isEqualTo(change1.getCommit().getShortMessage());
-
-    PushOneCommit.Result change3 =
-        createChange(
-            testRepo,
-            "branch",
-            "This commit is based on master, which includes change2, "
-                + "but is targeted at branch, which doesn't include it.",
-            "a.txt",
-            "3",
-            "");
-
-    submit(change3.getChangeId());
-
-    List<RevCommit> log3 = getRemoteLog(project, "branch");
-    assertThat(log3.get(0).getShortMessage()).isEqualTo(change3.getCommit().getShortMessage());
-    assertThat(log3.get(1).getShortMessage()).isEqualTo(change2.getCommit().getShortMessage());
-
-    assertRefUpdatedEvents(
-        initialHead, headAfterFirstSubmit, headAfterFirstSubmit, headAfterSecondSubmit);
-    assertChangeMergedEvents(
-        change1.getChangeId(),
-        headAfterFirstSubmit.name(),
-        change2.getChangeId(),
-        headAfterSecondSubmit.name());
-  }
-
-  @Test
-  public void submitWithOpenAncestorsOnOtherBranch() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-    PushOneCommit.Result change1 =
-        createChange(testRepo, "master", "base commit", "a.txt", "1", "");
-    submit(change1.getChangeId());
-    RevCommit headAfterFirstSubmit = getRemoteHead();
-
-    gApi.projects().name(project.get()).branch("branch").create(new BranchInput());
-
-    PushOneCommit.Result change2 =
-        createChange(
-            testRepo, "master", "We want to commit this to master first", "a.txt", "2", "");
-
-    approve(change2.getChangeId());
-
-    RevCommit tip1 = getRemoteLog(project, "master").get(0);
-    assertThat(tip1.getShortMessage()).isEqualTo(change1.getCommit().getShortMessage());
-
-    RevCommit tip2 = getRemoteLog(project, "branch").get(0);
-    assertThat(tip2.getShortMessage()).isEqualTo(change1.getCommit().getShortMessage());
-
-    PushOneCommit.Result change3a =
-        createChange(
-            testRepo,
-            "branch",
-            "This commit is based on change2 pending for master, "
-                + "but is targeted itself at branch, which doesn't include it.",
-            "a.txt",
-            "3",
-            "a-topic-here");
-
-    Project.NameKey p3 = createProject("project-related-to-change3");
-    TestRepository<?> repo3 = cloneProject(p3);
-    RevCommit repo3Head = getRemoteHead(p3, "master");
-    PushOneCommit.Result change3b =
-        createChange(
-            repo3,
-            "master",
-            "some accompanying changes for change3a in another repo tied together via topic",
-            "a.txt",
-            "1",
-            "a-topic-here");
-    approve(change3b.getChangeId());
-
-    String cnt = isSubmitWholeTopicEnabled() ? "2 changes" : "1 change";
-    submitWithConflict(
-        change3a.getChangeId(),
-        "Failed to submit "
-            + cnt
-            + " due to the following problems:\n"
-            + "Change "
-            + change3a.getChange().getId()
-            + ": depends on change that"
-            + " was not submitted");
-
-    RevCommit tipbranch = getRemoteLog(project, "branch").get(0);
-    assertThat(tipbranch.getShortMessage()).isEqualTo(change1.getCommit().getShortMessage());
-
-    RevCommit tipmaster = getRemoteLog(p3, "master").get(0);
-    assertThat(tipmaster.getShortMessage()).isEqualTo(repo3Head.getShortMessage());
-
-    assertRefUpdatedEvents(initialHead, headAfterFirstSubmit);
-    assertChangeMergedEvents(change1.getChangeId(), headAfterFirstSubmit.name());
-  }
-
-  @Test
-  public void gerritWorkflow() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-
-    // We'll setup a master and a stable branch.
-    // Then we create a change to be applied to master, which is
-    // then cherry picked back to stable. The stable branch will
-    // be merged up into master again.
-    gApi.projects().name(project.get()).branch("stable").create(new BranchInput());
-
-    // Push a change to master
-    PushOneCommit push =
-        pushFactory.create(db, user.getIdent(), testRepo, "small fix", "a.txt", "2");
-    PushOneCommit.Result change = push.to("refs/for/master");
-    submit(change.getChangeId());
-    RevCommit headAfterFirstSubmit = getRemoteLog(project, "master").get(0);
-    assertThat(headAfterFirstSubmit.getShortMessage())
-        .isEqualTo(change.getCommit().getShortMessage());
-
-    // Now cherry pick to stable
-    CherryPickInput in = new CherryPickInput();
-    in.destination = "stable";
-    in.message = "This goes to stable as well\n" + headAfterFirstSubmit.getFullMessage();
-    ChangeApi orig = gApi.changes().id(change.getChangeId());
-    String cherryId = orig.current().cherryPick(in).id();
-    gApi.changes().id(cherryId).current().review(ReviewInput.approve());
-    gApi.changes().id(cherryId).current().submit();
-
-    // Create the merge locally
-    RevCommit stable = getRemoteHead(project, "stable");
-    RevCommit master = getRemoteHead(project, "master");
-    testRepo.git().fetch().call();
-    testRepo.git().branchCreate().setName("stable").setStartPoint(stable).call();
-    testRepo.git().branchCreate().setName("master").setStartPoint(master).call();
-
-    RevCommit merge =
-        testRepo
-            .commit()
-            .parent(master)
-            .parent(stable)
-            .message("Merge stable into master")
-            .insertChangeId()
-            .create();
-
-    testRepo.branch("refs/heads/master").update(merge);
-    testRepo.git().push().setRefSpecs(new RefSpec("refs/heads/master:refs/for/master")).call();
-
-    String changeId = GitUtil.getChangeId(testRepo, merge).get();
-    approve(changeId);
-    submit(changeId);
-    RevCommit headAfterSecondSubmit = getRemoteLog(project, "master").get(0);
-    assertThat(headAfterSecondSubmit.getShortMessage()).isEqualTo(merge.getShortMessage());
-
-    assertRefUpdatedEvents(
-        initialHead, headAfterFirstSubmit, headAfterFirstSubmit, headAfterSecondSubmit);
-    assertChangeMergedEvents(
-        change.getChangeId(), headAfterFirstSubmit.name(), changeId, headAfterSecondSubmit.name());
-  }
-
-  @Test
-  public void openChangeForTargetBranchPreventsMerge() throws Exception {
-    gApi.projects().name(project.get()).branch("stable").create(new BranchInput());
-
-    // Propose a change for master, but leave it open for master!
-    PushOneCommit change =
-        pushFactory.create(db, user.getIdent(), testRepo, "small fix", "a.txt", "2");
-    PushOneCommit.Result change2result = change.to("refs/for/master");
-
-    // Now cherry pick to stable
-    CherryPickInput in = new CherryPickInput();
-    in.destination = "stable";
-    in.message = "it goes to stable branch";
-    ChangeApi orig = gApi.changes().id(change2result.getChangeId());
-    ChangeApi cherry = orig.current().cherryPick(in);
-    cherry.current().review(ReviewInput.approve());
-    cherry.current().submit();
-
-    // Create a commit locally
-    testRepo.git().fetch().setRefSpecs(new RefSpec("refs/heads/stable")).call();
-
-    PushOneCommit.Result change3 = createChange(testRepo, "stable", "test", "a.txt", "3", "");
-    submitWithConflict(
-        change3.getChangeId(),
-        "Failed to submit 1 change due to the following problems:\n"
-            + "Change "
-            + change3.getPatchSetId().getParentKey().get()
-            + ": depends on change that was not submitted");
-
-    assertRefUpdatedEvents();
-    assertChangeMergedEvents();
-  }
-
-  @Test
-  public void testPreviewSubmitTgz() throws Exception {
-    Project.NameKey p1 = createProject("project-name");
-
-    TestRepository<?> repo1 = cloneProject(p1);
-    PushOneCommit.Result change1 = createChange(repo1, "master", "test", "a.txt", "1", "topic");
-    approve(change1.getChangeId());
-
-    // get a preview before submitting:
-    File tempfile;
-    try (BinaryResult request = submitPreview(change1.getChangeId(), "tgz")) {
-      assertThat(request.getContentType()).isEqualTo("application/x-gzip");
-      tempfile = File.createTempFile("test", null);
-      request.writeTo(Files.newOutputStream(tempfile.toPath()));
-    }
-
-    InputStream is = new GZIPInputStream(Files.newInputStream(tempfile.toPath()));
-
-    List<String> untarredFiles = new ArrayList<>();
-    try (TarArchiveInputStream tarInputStream =
-        (TarArchiveInputStream) new ArchiveStreamFactory().createArchiveInputStream("tar", is)) {
-      TarArchiveEntry entry = null;
-      while ((entry = (TarArchiveEntry) tarInputStream.getNextEntry()) != null) {
-        untarredFiles.add(entry.getName());
-      }
-    }
-    assertThat(untarredFiles).containsExactly(name("project-name") + ".git");
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByRebaseAlwaysIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByRebaseAlwaysIT.java
deleted file mode 100644
index e4c929a..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByRebaseAlwaysIT.java
+++ /dev/null
@@ -1,134 +0,0 @@
-// 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.
-
-package com.google.gerrit.acceptance.rest.change;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.acceptance.TestProjectInput;
-import com.google.gerrit.common.FooterConstants;
-import com.google.gerrit.extensions.client.InheritableBoolean;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.registration.RegistrationHandle;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.server.git.ChangeMessageModifier;
-import com.google.inject.Inject;
-import java.util.List;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.junit.Test;
-
-public class SubmitByRebaseAlwaysIT extends AbstractSubmitByRebase {
-  @Inject private DynamicSet<ChangeMessageModifier> changeMessageModifiers;
-
-  @Override
-  protected SubmitType getSubmitType() {
-    return SubmitType.REBASE_ALWAYS;
-  }
-
-  @Test
-  @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
-  public void submitWithPossibleFastForward() throws Exception {
-    RevCommit oldHead = getRemoteHead();
-    PushOneCommit.Result change = createChange();
-    submit(change.getChangeId());
-
-    RevCommit head = getRemoteHead();
-    assertThat(head.getId()).isNotEqualTo(change.getCommit());
-    assertThat(head.getParent(0)).isEqualTo(oldHead);
-    assertApproved(change.getChangeId());
-    assertCurrentRevision(change.getChangeId(), 2, head);
-    assertSubmitter(change.getChangeId(), 1);
-    assertSubmitter(change.getChangeId(), 2);
-    assertPersonEquals(admin.getIdent(), head.getAuthorIdent());
-    assertPersonEquals(admin.getIdent(), head.getCommitterIdent());
-    assertRefUpdatedEvents(oldHead, head);
-    assertChangeMergedEvents(change.getChangeId(), head.name());
-  }
-
-  @Test
-  @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
-  public void alwaysAddFooters() throws Exception {
-    PushOneCommit.Result change1 = createChange();
-    PushOneCommit.Result change2 = createChange();
-
-    assertThat(getCurrentCommit(change1).getFooterLines(FooterConstants.REVIEWED_BY)).isEmpty();
-    assertThat(getCurrentCommit(change2).getFooterLines(FooterConstants.REVIEWED_BY)).isEmpty();
-
-    // change1 is a fast-forward, but should be rebased in cherry pick style
-    // anyway, making change2 not a fast-forward, requiring a rebase.
-    approve(change1.getChangeId());
-    submit(change2.getChangeId());
-    // ... but both changes should get reviewed-by footers.
-    assertLatestRevisionHasFooters(change1);
-    assertLatestRevisionHasFooters(change2);
-  }
-
-  @Test
-  @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
-  public void changeMessageOnSubmit() throws Exception {
-    PushOneCommit.Result change1 = createChange();
-    PushOneCommit.Result change2 = createChange();
-
-    RegistrationHandle handle =
-        changeMessageModifiers.add(
-            new ChangeMessageModifier() {
-              @Override
-              public String onSubmit(
-                  String newCommitMessage,
-                  RevCommit original,
-                  RevCommit mergeTip,
-                  Branch.NameKey destination) {
-                List<String> custom = mergeTip.getFooterLines("Custom");
-                if (!custom.isEmpty()) {
-                  newCommitMessage += "Custom-Parent: " + custom.get(0) + "\n";
-                }
-                return newCommitMessage + "Custom: " + destination.get();
-              }
-            });
-    try {
-      // change1 is a fast-forward, but should be rebased in cherry pick style
-      // anyway, making change2 not a fast-forward, requiring a rebase.
-      approve(change1.getChangeId());
-      submit(change2.getChangeId());
-    } finally {
-      handle.remove();
-    }
-    // ... but both changes should get custom footers.
-    assertThat(getCurrentCommit(change1).getFooterLines("Custom"))
-        .containsExactly("refs/heads/master");
-    assertThat(getCurrentCommit(change2).getFooterLines("Custom"))
-        .containsExactly("refs/heads/master");
-    assertThat(getCurrentCommit(change2).getFooterLines("Custom-Parent"))
-        .containsExactly("refs/heads/master");
-  }
-
-  private void assertLatestRevisionHasFooters(PushOneCommit.Result change) throws Exception {
-    RevCommit c = getCurrentCommit(change);
-    assertThat(c.getFooterLines(FooterConstants.CHANGE_ID)).isNotEmpty();
-    assertThat(c.getFooterLines(FooterConstants.REVIEWED_BY)).isNotEmpty();
-    assertThat(c.getFooterLines(FooterConstants.REVIEWED_ON)).isNotEmpty();
-  }
-
-  private RevCommit getCurrentCommit(PushOneCommit.Result change) throws Exception {
-    testRepo.git().fetch().setRemote("origin").call();
-    ChangeInfo info = get(change.getChangeId());
-    RevCommit c = testRepo.getRevWalk().parseCommit(ObjectId.fromString(info.currentRevision));
-    testRepo.getRevWalk().parseBody(c);
-    return c;
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitResolvingMergeCommitIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitResolvingMergeCommitIT.java
deleted file mode 100644
index bb7da11..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitResolvingMergeCommitIT.java
+++ /dev/null
@@ -1,382 +0,0 @@
-// 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.
-
-package com.google.gerrit.acceptance.rest.change;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.TruthJUnit.assume;
-
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.extensions.client.ChangeStatus;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.change.Submit;
-import com.google.gerrit.server.git.ChangeSet;
-import com.google.gerrit.server.git.MergeSuperSet;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.testutil.ConfigSuite;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import org.eclipse.jgit.errors.IncorrectObjectTypeException;
-import org.eclipse.jgit.errors.MissingObjectException;
-import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.junit.Test;
-
-@NoHttpd
-public class SubmitResolvingMergeCommitIT extends AbstractDaemonTest {
-  @Inject private Provider<MergeSuperSet> mergeSuperSet;
-
-  @Inject private Submit submit;
-
-  @ConfigSuite.Default
-  public static Config submitWholeTopicEnabled() {
-    return submitWholeTopicEnabledConfig();
-  }
-
-  @Test
-  public void resolvingMergeCommitAtEndOfChain() throws Exception {
-    /*
-      A <- B <- C <------- D
-      ^                    ^
-      |                    |
-      E <- F <- G <- H <-- M*
-
-      G has a conflict with C and is resolved in M which is a merge
-      commit of H and D.
-    */
-
-    PushOneCommit.Result a = createChange("A");
-    PushOneCommit.Result b =
-        createChange("B", "new.txt", "No conflict line", ImmutableList.of(a.getCommit()));
-    PushOneCommit.Result c = createChange("C", ImmutableList.of(b.getCommit()));
-    PushOneCommit.Result d = createChange("D", ImmutableList.of(c.getCommit()));
-
-    PushOneCommit.Result e = createChange("E", ImmutableList.of(a.getCommit()));
-    PushOneCommit.Result f = createChange("F", ImmutableList.of(e.getCommit()));
-    PushOneCommit.Result g =
-        createChange("G", "new.txt", "Conflicting line", ImmutableList.of(f.getCommit()));
-    PushOneCommit.Result h = createChange("H", ImmutableList.of(g.getCommit()));
-
-    approve(a.getChangeId());
-    approve(b.getChangeId());
-    approve(c.getChangeId());
-    approve(d.getChangeId());
-    submit(d.getChangeId());
-
-    approve(e.getChangeId());
-    approve(f.getChangeId());
-    approve(g.getChangeId());
-    approve(h.getChangeId());
-
-    assertMergeable(e.getChange());
-    assertMergeable(f.getChange());
-    assertNotMergeable(g.getChange());
-    assertNotMergeable(h.getChange());
-
-    PushOneCommit.Result m =
-        createChange(
-            "M", "new.txt", "Resolved conflict", ImmutableList.of(d.getCommit(), h.getCommit()));
-    approve(m.getChangeId());
-
-    assertChangeSetMergeable(m.getChange(), true);
-
-    assertMergeable(m.getChange());
-    submit(m.getChangeId());
-
-    assertMerged(e.getChangeId());
-    assertMerged(f.getChangeId());
-    assertMerged(g.getChangeId());
-    assertMerged(h.getChangeId());
-    assertMerged(m.getChangeId());
-  }
-
-  @Test
-  public void resolvingMergeCommitComingBeforeConflict() throws Exception {
-    /*
-      A <- B <- C <- D
-      ^    ^
-      |    |
-      E <- F* <- G
-
-      F is a merge commit of E and B and resolves any conflict.
-      However G is conflicting with C.
-    */
-
-    PushOneCommit.Result a = createChange("A");
-    PushOneCommit.Result b =
-        createChange("B", "new.txt", "No conflict line", ImmutableList.of(a.getCommit()));
-    PushOneCommit.Result c =
-        createChange("C", "new.txt", "No conflict line #2", ImmutableList.of(b.getCommit()));
-    PushOneCommit.Result d = createChange("D", ImmutableList.of(c.getCommit()));
-    PushOneCommit.Result e =
-        createChange("E", "new.txt", "Conflicting line", ImmutableList.of(a.getCommit()));
-    PushOneCommit.Result f =
-        createChange(
-            "F", "new.txt", "Resolved conflict", ImmutableList.of(b.getCommit(), e.getCommit()));
-    PushOneCommit.Result g =
-        createChange("G", "new.txt", "Conflicting line #2", ImmutableList.of(f.getCommit()));
-
-    assertMergeable(e.getChange());
-
-    approve(a.getChangeId());
-    approve(b.getChangeId());
-    submit(b.getChangeId());
-
-    assertNotMergeable(e.getChange());
-    assertMergeable(f.getChange());
-    assertMergeable(g.getChange());
-
-    approve(c.getChangeId());
-    approve(d.getChangeId());
-    submit(d.getChangeId());
-
-    approve(e.getChangeId());
-    approve(f.getChangeId());
-    approve(g.getChangeId());
-
-    assertNotMergeable(g.getChange());
-    assertChangeSetMergeable(g.getChange(), false);
-  }
-
-  @Test
-  public void resolvingMergeCommitWithTopics() throws Exception {
-    /*
-      Project1:
-        A <- B <-- C <---
-        ^    ^          |
-        |    |          |
-        E <- F* <- G <- L*
-
-      G clashes with C, and F resolves the clashes between E and B.
-      Later, L resolves the clashes between C and G.
-
-      Project2:
-        H <- I
-        ^    ^
-        |    |
-        J <- K*
-
-      J clashes with I, and K resolves all problems.
-      G, K and L are in the same topic.
-    */
-    assume().that(isSubmitWholeTopicEnabled()).isTrue();
-
-    String project1Name = name("Project1");
-    String project2Name = name("Project2");
-    gApi.projects().create(project1Name);
-    gApi.projects().create(project2Name);
-    TestRepository<InMemoryRepository> project1 = cloneProject(new Project.NameKey(project1Name));
-    TestRepository<InMemoryRepository> project2 = cloneProject(new Project.NameKey(project2Name));
-
-    PushOneCommit.Result a = createChange(project1, "A");
-    PushOneCommit.Result b =
-        createChange(project1, "B", "new.txt", "No conflict line", ImmutableList.of(a.getCommit()));
-    PushOneCommit.Result c =
-        createChange(
-            project1, "C", "new.txt", "No conflict line #2", ImmutableList.of(b.getCommit()));
-
-    approve(a.getChangeId());
-    approve(b.getChangeId());
-    approve(c.getChangeId());
-    submit(c.getChangeId());
-
-    PushOneCommit.Result e =
-        createChange(project1, "E", "new.txt", "Conflicting line", ImmutableList.of(a.getCommit()));
-    PushOneCommit.Result f =
-        createChange(
-            project1,
-            "F",
-            "new.txt",
-            "Resolved conflict",
-            ImmutableList.of(b.getCommit(), e.getCommit()));
-    PushOneCommit.Result g =
-        createChange(
-            project1,
-            "G",
-            "new.txt",
-            "Conflicting line #2",
-            ImmutableList.of(f.getCommit()),
-            "refs/for/master/" + name("topic1"));
-
-    PushOneCommit.Result h = createChange(project2, "H");
-    PushOneCommit.Result i =
-        createChange(project2, "I", "new.txt", "No conflict line", ImmutableList.of(h.getCommit()));
-    PushOneCommit.Result j =
-        createChange(project2, "J", "new.txt", "Conflicting line", ImmutableList.of(h.getCommit()));
-    PushOneCommit.Result k =
-        createChange(
-            project2,
-            "K",
-            "new.txt",
-            "Sadly conflicting topic-wise",
-            ImmutableList.of(i.getCommit(), j.getCommit()),
-            "refs/for/master/" + name("topic1"));
-
-    approve(h.getChangeId());
-    approve(i.getChangeId());
-    submit(i.getChangeId());
-
-    approve(e.getChangeId());
-    approve(f.getChangeId());
-    approve(g.getChangeId());
-    approve(j.getChangeId());
-    approve(k.getChangeId());
-
-    assertChangeSetMergeable(g.getChange(), false);
-    assertChangeSetMergeable(k.getChange(), false);
-
-    PushOneCommit.Result l =
-        createChange(
-            project1,
-            "L",
-            "new.txt",
-            "Resolving conflicts again",
-            ImmutableList.of(c.getCommit(), g.getCommit()),
-            "refs/for/master/" + name("topic1"));
-
-    approve(l.getChangeId());
-    assertChangeSetMergeable(l.getChange(), true);
-
-    submit(l.getChangeId());
-    assertMerged(c.getChangeId());
-    assertMerged(g.getChangeId());
-    assertMerged(k.getChangeId());
-  }
-
-  @Test
-  public void resolvingMergeCommitAtEndOfChainAndNotUpToDate() throws Exception {
-    /*
-        A <-- B
-         \
-          C  <- D
-           \   /
-             E
-
-        B is the target branch, and D should be merged with B, but one
-        of C conflicts with B
-    */
-
-    PushOneCommit.Result a = createChange("A");
-    PushOneCommit.Result b =
-        createChange("B", "new.txt", "No conflict line", ImmutableList.of(a.getCommit()));
-
-    approve(a.getChangeId());
-    approve(b.getChangeId());
-    submit(b.getChangeId());
-
-    PushOneCommit.Result c =
-        createChange("C", "new.txt", "Create conflicts", ImmutableList.of(a.getCommit()));
-    PushOneCommit.Result e = createChange("E", ImmutableList.of(c.getCommit()));
-    PushOneCommit.Result d =
-        createChange(
-            "D", "new.txt", "Resolves conflicts", ImmutableList.of(c.getCommit(), e.getCommit()));
-
-    approve(c.getChangeId());
-    approve(e.getChangeId());
-    approve(d.getChangeId());
-    assertNotMergeable(d.getChange());
-    assertChangeSetMergeable(d.getChange(), false);
-  }
-
-  private void submit(String changeId) throws Exception {
-    gApi.changes().id(changeId).current().submit();
-  }
-
-  private void assertChangeSetMergeable(ChangeData change, boolean expected)
-      throws MissingObjectException, IncorrectObjectTypeException, IOException, OrmException,
-          PermissionBackendException {
-    ChangeSet cs = mergeSuperSet.get().completeChangeSet(db, change.change(), user(admin));
-    assertThat(submit.unmergeableChanges(cs).isEmpty()).isEqualTo(expected);
-  }
-
-  private void assertMergeable(ChangeData change) throws Exception {
-    change.setMergeable(null);
-    assertThat(change.isMergeable()).isTrue();
-  }
-
-  private void assertNotMergeable(ChangeData change) throws Exception {
-    change.setMergeable(null);
-    assertThat(change.isMergeable()).isFalse();
-  }
-
-  private void assertMerged(String changeId) throws Exception {
-    assertThat(gApi.changes().id(changeId).get().status).isEqualTo(ChangeStatus.MERGED);
-  }
-
-  private PushOneCommit.Result createChange(
-      TestRepository<?> repo,
-      String subject,
-      String fileName,
-      String content,
-      List<RevCommit> parents,
-      String ref)
-      throws Exception {
-    PushOneCommit push = pushFactory.create(db, admin.getIdent(), repo, subject, fileName, content);
-
-    if (!parents.isEmpty()) {
-      push.setParents(parents);
-    }
-
-    PushOneCommit.Result result;
-    if (fileName.isEmpty()) {
-      result = push.execute(ref);
-    } else {
-      result = push.to(ref);
-    }
-    result.assertOkStatus();
-    return result;
-  }
-
-  private PushOneCommit.Result createChange(TestRepository<?> repo, String subject)
-      throws Exception {
-    return createChange(repo, subject, "x", "x", new ArrayList<RevCommit>(), "refs/for/master");
-  }
-
-  private PushOneCommit.Result createChange(
-      TestRepository<?> repo,
-      String subject,
-      String fileName,
-      String content,
-      List<RevCommit> parents)
-      throws Exception {
-    return createChange(repo, subject, fileName, content, parents, "refs/for/master");
-  }
-
-  @Override
-  protected PushOneCommit.Result createChange(String subject) throws Exception {
-    return createChange(
-        testRepo, subject, "", "", Collections.<RevCommit>emptyList(), "refs/for/master");
-  }
-
-  private PushOneCommit.Result createChange(String subject, List<RevCommit> parents)
-      throws Exception {
-    return createChange(testRepo, subject, "", "", parents, "refs/for/master");
-  }
-
-  private PushOneCommit.Result createChange(
-      String subject, String fileName, String content, List<RevCommit> parents) throws Exception {
-    return createChange(testRepo, subject, fileName, content, parents, "refs/for/master");
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SuggestReviewersIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SuggestReviewersIT.java
deleted file mode 100644
index c5c864d..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SuggestReviewersIT.java
+++ /dev/null
@@ -1,481 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.acceptance.rest.change;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.GerritConfig;
-import com.google.gerrit.acceptance.Sandboxed;
-import com.google.gerrit.acceptance.TestAccount;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.common.ChangeInput;
-import com.google.gerrit.extensions.common.GroupInfo;
-import com.google.gerrit.extensions.common.SuggestedReviewerInfo;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.group.CreateGroup;
-import com.google.gerrit.server.group.InternalGroup;
-import com.google.inject.Inject;
-import java.util.Arrays;
-import java.util.List;
-import org.junit.Before;
-import org.junit.Test;
-
-@Sandboxed
-public class SuggestReviewersIT extends AbstractDaemonTest {
-  @Inject private CreateGroup.Factory createGroupFactory;
-
-  private InternalGroup group1;
-  private InternalGroup group2;
-  private InternalGroup group3;
-
-  private TestAccount user1;
-  private TestAccount user2;
-  private TestAccount user3;
-  private TestAccount user4;
-
-  @Before
-  public void setUp() throws Exception {
-    group1 = group("users1");
-    group2 = group("users2");
-    group3 = group("users3");
-
-    user1 = user("user1", "First1 Last1", group1);
-    user2 = user("user2", "First2 Last2", group2);
-    user3 = user("user3", "First3 Last3", group1, group2);
-    user4 = user("jdoe", "John Doe", "JDOE");
-  }
-
-  @Test
-  @GerritConfig(name = "accounts.visibility", value = "NONE")
-  public void suggestReviewersNoResult1() throws Exception {
-    String changeId = createChange().getChangeId();
-    List<SuggestedReviewerInfo> reviewers = suggestReviewers(changeId, name("u"), 6);
-    assertThat(reviewers).isEmpty();
-  }
-
-  @Test
-  @GerritConfig(name = "suggest.from", value = "1")
-  @GerritConfig(name = "accounts.visibility", value = "NONE")
-  public void suggestReviewersNoResult2() throws Exception {
-    String changeId = createChange().getChangeId();
-    List<SuggestedReviewerInfo> reviewers = suggestReviewers(changeId, name("u"), 6);
-    assertThat(reviewers).isEmpty();
-  }
-
-  @Test
-  public void suggestReviewersChange() throws Exception {
-    String changeId = createChange().getChangeId();
-    List<SuggestedReviewerInfo> reviewers = suggestReviewers(changeId, name("u"), 6);
-    assertReviewers(
-        reviewers, ImmutableList.of(user1, user2, user3), ImmutableList.of(group1, group2, group3));
-
-    reviewers = suggestReviewers(changeId, name("u"), 5);
-    assertReviewers(
-        reviewers, ImmutableList.of(user1, user2, user3), ImmutableList.of(group1, group2));
-
-    reviewers = suggestReviewers(changeId, group3.getName(), 10);
-    assertReviewers(reviewers, ImmutableList.of(), ImmutableList.of(group3));
-
-    // Suggested accounts are ordered by activity. All users have no activity,
-    // hence we don't know which of the matching accounts we get when the query
-    // is limited to 1.
-    reviewers = suggestReviewers(changeId, name("u"), 1);
-    assertThat(reviewers).hasSize(1);
-    assertThat(reviewers.get(0).account).isNotNull();
-    assertThat(ImmutableList.of(reviewers.get(0).account._accountId))
-        .containsAnyIn(
-            ImmutableList.of(user1, user2, user3).stream().map(u -> u.id.get()).collect(toList()));
-  }
-
-  @Test
-  @GerritConfig(name = "accounts.visibility", value = "SAME_GROUP")
-  public void suggestReviewersSameGroupVisibility() throws Exception {
-    String changeId = createChange().getChangeId();
-    List<SuggestedReviewerInfo> reviewers;
-
-    reviewers = suggestReviewers(changeId, user2.username, 2);
-    assertThat(reviewers).hasSize(1);
-    assertThat(Iterables.getOnlyElement(reviewers).account.name).isEqualTo(user2.fullName);
-
-    setApiUser(user1);
-    reviewers = suggestReviewers(changeId, user2.fullName, 2);
-    assertThat(reviewers).isEmpty();
-
-    setApiUser(user2);
-    reviewers = suggestReviewers(changeId, user2.username, 2);
-    assertThat(reviewers).hasSize(1);
-    assertThat(Iterables.getOnlyElement(reviewers).account.name).isEqualTo(user2.fullName);
-
-    setApiUser(user3);
-    reviewers = suggestReviewers(changeId, user2.username, 2);
-    assertThat(reviewers).hasSize(1);
-    assertThat(Iterables.getOnlyElement(reviewers).account.name).isEqualTo(user2.fullName);
-  }
-
-  @Test
-  public void suggestReviewsPrivateProjectVisibility() throws Exception {
-    String changeId = createChange().getChangeId();
-    List<SuggestedReviewerInfo> reviewers;
-
-    setApiUser(user3);
-    block("refs/*", "read", ANONYMOUS_USERS);
-    allow("refs/*", "read", group1.getGroupUUID());
-    reviewers = suggestReviewers(changeId, user2.username, 2);
-    assertThat(reviewers).isEmpty();
-  }
-
-  @Test
-  @GerritConfig(name = "accounts.visibility", value = "SAME_GROUP")
-  public void suggestReviewersViewAllAccounts() throws Exception {
-    String changeId = createChange().getChangeId();
-    List<SuggestedReviewerInfo> reviewers;
-
-    setApiUser(user1);
-    reviewers = suggestReviewers(changeId, user2.username, 2);
-    assertThat(reviewers).isEmpty();
-
-    setApiUser(user1); // Clear cached group info.
-    allowGlobalCapabilities(group1.getGroupUUID(), GlobalCapability.VIEW_ALL_ACCOUNTS);
-    reviewers = suggestReviewers(changeId, user2.username, 2);
-    assertThat(reviewers).hasSize(1);
-    assertThat(Iterables.getOnlyElement(reviewers).account.name).isEqualTo(user2.fullName);
-  }
-
-  @Test
-  @GerritConfig(name = "suggest.maxSuggestedReviewers", value = "2")
-  public void suggestReviewersMaxNbrSuggestions() throws Exception {
-    String changeId = createChange().getChangeId();
-    List<SuggestedReviewerInfo> reviewers = suggestReviewers(changeId, name("user"), 5);
-    assertThat(reviewers).hasSize(2);
-  }
-
-  @Test
-  public void suggestReviewersFullTextSearch() throws Exception {
-    String changeId = createChange().getChangeId();
-    List<SuggestedReviewerInfo> reviewers;
-
-    reviewers = suggestReviewers(changeId, "first");
-    assertThat(reviewers).hasSize(3);
-
-    reviewers = suggestReviewers(changeId, "first1");
-    assertThat(reviewers).hasSize(1);
-
-    reviewers = suggestReviewers(changeId, "last");
-    assertThat(reviewers).hasSize(3);
-
-    reviewers = suggestReviewers(changeId, "last1");
-    assertThat(reviewers).hasSize(1);
-
-    reviewers = suggestReviewers(changeId, "fi la");
-    assertThat(reviewers).hasSize(3);
-
-    reviewers = suggestReviewers(changeId, "la fi");
-    assertThat(reviewers).hasSize(3);
-
-    reviewers = suggestReviewers(changeId, "first1 la");
-    assertThat(reviewers).hasSize(1);
-
-    reviewers = suggestReviewers(changeId, "fi last1");
-    assertThat(reviewers).hasSize(1);
-
-    reviewers = suggestReviewers(changeId, "first1 last2");
-    assertThat(reviewers).isEmpty();
-
-    reviewers = suggestReviewers(changeId, name("user"));
-    assertThat(reviewers).hasSize(6);
-
-    reviewers = suggestReviewers(changeId, user1.username);
-    assertThat(reviewers).hasSize(1);
-
-    reviewers = suggestReviewers(changeId, "example.com");
-    assertThat(reviewers).hasSize(5);
-
-    reviewers = suggestReviewers(changeId, user1.email);
-    assertThat(reviewers).hasSize(1);
-
-    reviewers = suggestReviewers(changeId, user1.username + " example");
-    assertThat(reviewers).hasSize(1);
-
-    reviewers = suggestReviewers(changeId, user4.email.toLowerCase());
-    assertThat(reviewers).hasSize(1);
-    assertThat(reviewers.get(0).account.email).isEqualTo(user4.email);
-  }
-
-  @Test
-  public void suggestReviewersWithoutLimitOptionSpecified() throws Exception {
-    String changeId = createChange().getChangeId();
-    String query = user3.username;
-    List<SuggestedReviewerInfo> suggestedReviewerInfos =
-        gApi.changes().id(changeId).suggestReviewers(query).get();
-    assertThat(suggestedReviewerInfos).hasSize(1);
-  }
-
-  @Test
-  @GerritConfig(name = "addreviewer.maxAllowed", value = "2")
-  @GerritConfig(name = "addreviewer.maxWithoutConfirmation", value = "1")
-  public void suggestReviewersGroupSizeConsiderations() throws Exception {
-    InternalGroup largeGroup = group("large");
-    InternalGroup mediumGroup = group("medium");
-
-    // Both groups have Administrator as a member. Add two users to large
-    // group to push it past maxAllowed, and one to medium group to push it
-    // past maxWithoutConfirmation.
-    user("individual 0", "Test0 Last0", largeGroup, mediumGroup);
-    user("individual 1", "Test1 Last1", largeGroup);
-
-    String changeId = createChange().getChangeId();
-    List<SuggestedReviewerInfo> reviewers;
-    SuggestedReviewerInfo reviewer;
-
-    // Individual account suggestions have count of 1 and no confirm.
-    reviewers = suggestReviewers(changeId, "test", 10);
-    assertThat(reviewers).hasSize(2);
-    reviewer = reviewers.get(0);
-    assertThat(reviewer.count).isEqualTo(1);
-    assertThat(reviewer.confirm).isNull();
-
-    // Large group should never be suggested.
-    reviewers = suggestReviewers(changeId, largeGroup.getName(), 10);
-    assertThat(reviewers).isEmpty();
-
-    // Medium group should be suggested with appropriate count and confirm.
-    reviewers = suggestReviewers(changeId, mediumGroup.getName(), 10);
-    assertThat(reviewers).hasSize(1);
-    reviewer = reviewers.get(0);
-    assertThat(reviewer.group.name).isEqualTo(mediumGroup.getName());
-    assertThat(reviewer.count).isEqualTo(2);
-    assertThat(reviewer.confirm).isTrue();
-  }
-
-  @Test
-  public void defaultReviewerSuggestion() throws Exception {
-    TestAccount user1 = user("customuser1", "User1");
-    TestAccount reviewer1 = user("customuser2", "User2");
-    TestAccount reviewer2 = user("customuser3", "User3");
-
-    setApiUser(user1);
-    String changeId1 = createChangeFromApi();
-
-    setApiUser(reviewer1);
-    reviewChange(changeId1);
-
-    setApiUser(user1);
-    String changeId2 = createChangeFromApi();
-
-    setApiUser(reviewer1);
-    reviewChange(changeId2);
-
-    setApiUser(reviewer2);
-    reviewChange(changeId2);
-
-    setApiUser(user1);
-    String changeId3 = createChangeFromApi();
-    List<SuggestedReviewerInfo> reviewers = suggestReviewers(changeId3, null, 4);
-    assertThat(reviewers.stream().map(r -> r.account._accountId).collect(toList()))
-        .containsExactly(reviewer1.id.get(), reviewer2.id.get())
-        .inOrder();
-
-    // check that existing reviewers are filtered out
-    gApi.changes().id(changeId3).addReviewer(reviewer1.email);
-    reviewers = suggestReviewers(changeId3, null, 4);
-    assertThat(reviewers.stream().map(r -> r.account._accountId).collect(toList()))
-        .containsExactly(reviewer2.id.get())
-        .inOrder();
-  }
-
-  @Test
-  public void defaultReviewerSuggestionOnFirstChange() throws Exception {
-    TestAccount user1 = user("customuser1", "User1");
-    setApiUser(user1);
-    List<SuggestedReviewerInfo> reviewers = suggestReviewers(createChange().getChangeId(), "", 4);
-    assertThat(reviewers).isEmpty();
-  }
-
-  @Test
-  @GerritConfig(name = "suggest.maxSuggestedReviewers", value = "10")
-  public void reviewerRanking() throws Exception {
-    // Assert that user are ranked by the number of times they have applied a
-    // a label to a change (highest), added comments (medium) or owned a
-    // change (low).
-    String fullName = "Primum Finalis";
-    TestAccount userWhoOwns = user("customuser1", fullName);
-    TestAccount reviewer1 = user("customuser2", fullName);
-    TestAccount reviewer2 = user("customuser3", fullName);
-    TestAccount userWhoComments = user("customuser4", fullName);
-    TestAccount userWhoLooksForSuggestions = user("customuser5", fullName);
-
-    // Create a change as userWhoOwns and add some reviews
-    setApiUser(userWhoOwns);
-    String changeId1 = createChangeFromApi();
-
-    setApiUser(reviewer1);
-    reviewChange(changeId1);
-
-    setApiUser(user1);
-    String changeId2 = createChangeFromApi();
-
-    setApiUser(reviewer1);
-    reviewChange(changeId2);
-
-    setApiUser(reviewer2);
-    reviewChange(changeId2);
-
-    // Create a comment as a different user
-    setApiUser(userWhoComments);
-    ReviewInput ri = new ReviewInput();
-    ri.message = "Test";
-    gApi.changes().id(changeId1).revision(1).review(ri);
-
-    // Create a change as a new user to assert that we receive the correct
-    // ranking
-
-    setApiUser(userWhoLooksForSuggestions);
-    List<SuggestedReviewerInfo> reviewers = suggestReviewers(createChangeFromApi(), "Pri", 4);
-    assertThat(reviewers.stream().map(r -> r.account._accountId).collect(toList()))
-        .containsExactly(
-            reviewer1.id.get(), reviewer2.id.get(), userWhoOwns.id.get(), userWhoComments.id.get())
-        .inOrder();
-  }
-
-  @Test
-  public void reviewerRankingProjectIsolation() throws Exception {
-    // Create new project
-    Project.NameKey newProject = createProject("test");
-
-    // Create users who review changes in both the default and the new project
-    String fullName = "Primum Finalis";
-    TestAccount userWhoOwns = user("customuser1", fullName);
-    TestAccount reviewer1 = user("customuser2", fullName);
-    TestAccount reviewer2 = user("customuser3", fullName);
-
-    setApiUser(userWhoOwns);
-    String changeId1 = createChangeFromApi();
-
-    setApiUser(reviewer1);
-    reviewChange(changeId1);
-
-    setApiUser(userWhoOwns);
-    String changeId2 = createChangeFromApi(newProject);
-
-    setApiUser(reviewer2);
-    reviewChange(changeId2);
-
-    setApiUser(userWhoOwns);
-    String changeId3 = createChangeFromApi(newProject);
-
-    setApiUser(reviewer2);
-    reviewChange(changeId3);
-
-    setApiUser(userWhoOwns);
-    List<SuggestedReviewerInfo> reviewers = suggestReviewers(createChangeFromApi(), "Prim", 4);
-
-    // Assert that reviewer1 is on top, even though reviewer2 has more reviews
-    // in other projects
-    assertThat(reviewers.stream().map(r -> r.account._accountId).collect(toList()))
-        .containsExactly(reviewer1.id.get(), reviewer2.id.get())
-        .inOrder();
-  }
-
-  @Test
-  public void suggestNoInactiveAccounts() throws Exception {
-    String name = name("foo");
-    TestAccount foo1 = accountCreator.create(name + "-1");
-    assertThat(gApi.accounts().id(foo1.username).getActive()).isTrue();
-
-    TestAccount foo2 = accountCreator.create(name + "-2");
-    assertThat(gApi.accounts().id(foo2.username).getActive()).isTrue();
-
-    String changeId = createChange().getChangeId();
-    assertReviewers(
-        suggestReviewers(changeId, name), ImmutableList.of(foo1, foo2), ImmutableList.of());
-
-    gApi.accounts().id(foo2.username).setActive(false);
-    assertThat(gApi.accounts().id(foo2.username).getActive()).isFalse();
-    assertReviewers(suggestReviewers(changeId, name), ImmutableList.of(foo1), ImmutableList.of());
-  }
-
-  private List<SuggestedReviewerInfo> suggestReviewers(String changeId, String query)
-      throws Exception {
-    return gApi.changes().id(changeId).suggestReviewers(query).get();
-  }
-
-  private List<SuggestedReviewerInfo> suggestReviewers(String changeId, String query, int n)
-      throws Exception {
-    return gApi.changes().id(changeId).suggestReviewers(query).withLimit(n).get();
-  }
-
-  private InternalGroup group(String name) throws Exception {
-    GroupInfo group = createGroupFactory.create(name(name)).apply(TopLevelResource.INSTANCE, null);
-    return groupCache.get(new AccountGroup.UUID(group.id)).orElse(null);
-  }
-
-  private TestAccount user(String name, String fullName, String emailName, InternalGroup... groups)
-      throws Exception {
-    String[] groupNames = Arrays.stream(groups).map(InternalGroup::getName).toArray(String[]::new);
-    return accountCreator.create(
-        name(name), name(emailName) + "@example.com", fullName, groupNames);
-  }
-
-  private TestAccount user(String name, String fullName, InternalGroup... groups) throws Exception {
-    return user(name, fullName, name, groups);
-  }
-
-  private void reviewChange(String changeId) throws RestApiException {
-    ReviewInput ri = new ReviewInput();
-    ri.label("Code-Review", 1);
-    gApi.changes().id(changeId).current().review(ri);
-  }
-
-  private String createChangeFromApi() throws RestApiException {
-    return createChangeFromApi(project);
-  }
-
-  private String createChangeFromApi(Project.NameKey project) throws RestApiException {
-    ChangeInput ci = new ChangeInput();
-    ci.project = project.get();
-    ci.subject = "Test change at" + System.nanoTime();
-    ci.branch = "master";
-    return gApi.changes().create(ci).get().changeId;
-  }
-
-  private void assertReviewers(
-      List<SuggestedReviewerInfo> actual,
-      List<TestAccount> expectedUsers,
-      List<InternalGroup> expectedGroups) {
-    List<Integer> actualAccountIds =
-        actual.stream()
-            .filter(i -> i.account != null)
-            .map(i -> i.account._accountId)
-            .collect(toList());
-    assertThat(actualAccountIds)
-        .containsExactlyElementsIn(expectedUsers.stream().map(u -> u.id.get()).collect(toList()));
-
-    List<String> actualGroupIds =
-        actual.stream().filter(i -> i.group != null).map(i -> i.group.id).collect(toList());
-    assertThat(actualGroupIds)
-        .containsExactlyElementsIn(
-            expectedGroups.stream().map(g -> g.getGroupUUID().get()).collect(toList()))
-        .inOrder();
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/TopicIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/TopicIT.java
deleted file mode 100644
index 3121812..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/TopicIT.java
+++ /dev/null
@@ -1,39 +0,0 @@
-// 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.
-
-package com.google.gerrit.acceptance.rest.change;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.PushOneCommit.Result;
-import com.google.gerrit.acceptance.RestResponse;
-import org.junit.Test;
-
-public class TopicIT extends AbstractDaemonTest {
-  @Test
-  public void topic() throws Exception {
-    Result result = createChange();
-    String endpoint = "/changes/" + result.getChangeId() + "/topic";
-    RestResponse response = adminRestSession.put(endpoint, "topic");
-    response.assertOK();
-
-    response = adminRestSession.delete(endpoint);
-    response.assertNoContent();
-
-    response = adminRestSession.put(endpoint, "topic");
-    response.assertOK();
-
-    response = adminRestSession.put(endpoint, "");
-    response.assertNoContent();
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/BUILD b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/BUILD
deleted file mode 100644
index 6becf0f..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/BUILD
+++ /dev/null
@@ -1,7 +0,0 @@
-load("//gerrit-acceptance-tests:tests.bzl", "acceptance_tests")
-
-acceptance_tests(
-    srcs = glob(["*IT.java"]),
-    group = "rest_config",
-    labels = ["rest"],
-)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/CacheOperationsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/CacheOperationsIT.java
deleted file mode 100644
index d448fa5..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/CacheOperationsIT.java
+++ /dev/null
@@ -1,145 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.acceptance.rest.config;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.server.config.PostCaches.Operation.FLUSH;
-import static com.google.gerrit.server.config.PostCaches.Operation.FLUSH_ALL;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.RestResponse;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.server.config.ListCaches.CacheInfo;
-import com.google.gerrit.server.config.PostCaches;
-import java.util.Arrays;
-import org.junit.Test;
-
-public class CacheOperationsIT extends AbstractDaemonTest {
-
-  @Test
-  public void flushAll() throws Exception {
-    RestResponse r = adminRestSession.get("/config/server/caches/project_list");
-    r.assertOK();
-    CacheInfo cacheInfo = newGson().fromJson(r.getReader(), CacheInfo.class);
-    assertThat(cacheInfo.entries.mem).isGreaterThan((long) 0);
-
-    r = adminRestSession.post("/config/server/caches/", new PostCaches.Input(FLUSH_ALL));
-    r.assertOK();
-    r.consume();
-
-    r = adminRestSession.get("/config/server/caches/project_list");
-    r.assertOK();
-    cacheInfo = newGson().fromJson(r.getReader(), CacheInfo.class);
-    assertThat(cacheInfo.entries.mem).isNull();
-  }
-
-  @Test
-  public void flushAll_Forbidden() throws Exception {
-    userRestSession
-        .post("/config/server/caches/", new PostCaches.Input(FLUSH_ALL))
-        .assertForbidden();
-  }
-
-  @Test
-  public void flushAll_BadRequest() throws Exception {
-    adminRestSession
-        .post("/config/server/caches/", new PostCaches.Input(FLUSH_ALL, Arrays.asList("projects")))
-        .assertBadRequest();
-  }
-
-  @Test
-  public void flush() throws Exception {
-    RestResponse r = adminRestSession.get("/config/server/caches/project_list");
-    r.assertOK();
-    CacheInfo cacheInfo = newGson().fromJson(r.getReader(), CacheInfo.class);
-    assertThat(cacheInfo.entries.mem).isGreaterThan((long) 0);
-
-    r = adminRestSession.get("/config/server/caches/projects");
-    r.assertOK();
-    cacheInfo = newGson().fromJson(r.getReader(), CacheInfo.class);
-    assertThat(cacheInfo.entries.mem).isGreaterThan((long) 1);
-
-    r =
-        adminRestSession.post(
-            "/config/server/caches/",
-            new PostCaches.Input(FLUSH, Arrays.asList("accounts", "project_list")));
-    r.assertOK();
-    r.consume();
-
-    r = adminRestSession.get("/config/server/caches/project_list");
-    r.assertOK();
-    cacheInfo = newGson().fromJson(r.getReader(), CacheInfo.class);
-    assertThat(cacheInfo.entries.mem).isNull();
-
-    r = adminRestSession.get("/config/server/caches/projects");
-    r.assertOK();
-    cacheInfo = newGson().fromJson(r.getReader(), CacheInfo.class);
-    assertThat(cacheInfo.entries.mem).isGreaterThan((long) 1);
-  }
-
-  @Test
-  public void flush_Forbidden() throws Exception {
-    userRestSession
-        .post("/config/server/caches/", new PostCaches.Input(FLUSH, Arrays.asList("projects")))
-        .assertForbidden();
-  }
-
-  @Test
-  public void flush_BadRequest() throws Exception {
-    adminRestSession.post("/config/server/caches/", new PostCaches.Input(FLUSH)).assertBadRequest();
-  }
-
-  @Test
-  public void flush_UnprocessableEntity() throws Exception {
-    RestResponse r = adminRestSession.get("/config/server/caches/projects");
-    r.assertOK();
-    CacheInfo cacheInfo = newGson().fromJson(r.getReader(), CacheInfo.class);
-    assertThat(cacheInfo.entries.mem).isGreaterThan((long) 0);
-
-    r =
-        adminRestSession.post(
-            "/config/server/caches/",
-            new PostCaches.Input(FLUSH, Arrays.asList("projects", "unprocessable")));
-    r.assertUnprocessableEntity();
-    r.consume();
-
-    r = adminRestSession.get("/config/server/caches/projects");
-    r.assertOK();
-    cacheInfo = newGson().fromJson(r.getReader(), CacheInfo.class);
-    assertThat(cacheInfo.entries.mem).isGreaterThan((long) 0);
-  }
-
-  @Test
-  public void flushWebSessions_Forbidden() throws Exception {
-    allowGlobalCapabilities(
-        REGISTERED_USERS, GlobalCapability.FLUSH_CACHES, GlobalCapability.VIEW_CACHES);
-    try {
-      RestResponse r =
-          userRestSession.post(
-              "/config/server/caches/", new PostCaches.Input(FLUSH, Arrays.asList("projects")));
-      r.assertOK();
-      r.consume();
-
-      userRestSession
-          .post(
-              "/config/server/caches/", new PostCaches.Input(FLUSH, Arrays.asList("web_sessions")))
-          .assertForbidden();
-    } finally {
-      removeGlobalCapabilities(
-          REGISTERED_USERS, GlobalCapability.FLUSH_CACHES, GlobalCapability.VIEW_CACHES);
-    }
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ConfirmEmailIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ConfirmEmailIT.java
deleted file mode 100644
index dea9174..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ConfirmEmailIT.java
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.acceptance.rest.config;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.server.config.ConfirmEmail;
-import com.google.gerrit.server.mail.EmailTokenVerifier;
-import com.google.gerrit.testutil.ConfigSuite;
-import com.google.gwtjsonrpc.server.SignedToken;
-import com.google.inject.Inject;
-import org.eclipse.jgit.lib.Config;
-import org.junit.Test;
-
-public class ConfirmEmailIT extends AbstractDaemonTest {
-  @ConfigSuite.Default
-  public static Config defaultConfig() {
-    Config cfg = new Config();
-    cfg.setString("auth", null, "registerEmailPrivateKey", SignedToken.generateRandomKey());
-    return cfg;
-  }
-
-  @Inject private EmailTokenVerifier emailTokenVerifier;
-
-  @Test
-  public void confirm() throws Exception {
-    ConfirmEmail.Input in = new ConfirmEmail.Input();
-    in.token = emailTokenVerifier.encode(admin.getId(), "new.mail@example.com");
-    adminRestSession.put("/config/server/email.confirm", in).assertNoContent();
-  }
-
-  @Test
-  public void confirmForOtherUser_UnprocessableEntity() throws Exception {
-    ConfirmEmail.Input in = new ConfirmEmail.Input();
-    in.token = emailTokenVerifier.encode(user.getId(), "new.mail@example.com");
-    adminRestSession.put("/config/server/email.confirm", in).assertUnprocessableEntity();
-  }
-
-  @Test
-  public void confirmInvalidToken_UnprocessableEntity() throws Exception {
-    ConfirmEmail.Input in = new ConfirmEmail.Input();
-    in.token = "invalidToken";
-    adminRestSession.put("/config/server/email.confirm", in).assertUnprocessableEntity();
-  }
-
-  @Test
-  public void confirmAlreadyInUse_UnprocessableEntity() throws Exception {
-    ConfirmEmail.Input in = new ConfirmEmail.Input();
-    in.token = emailTokenVerifier.encode(admin.getId(), user.email);
-    adminRestSession.put("/config/server/email.confirm", in).assertUnprocessableEntity();
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/FlushCacheIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/FlushCacheIT.java
deleted file mode 100644
index b586ab2..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/FlushCacheIT.java
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.acceptance.rest.config;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth.assertWithMessage;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.RestResponse;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.config.ListCaches.CacheInfo;
-import com.google.gerrit.server.group.InternalGroup;
-import org.junit.Test;
-
-public class FlushCacheIT extends AbstractDaemonTest {
-
-  @Test
-  public void flushCache() throws Exception {
-    InternalGroup group = groupCache.get(new AccountGroup.NameKey("Administrators")).orElse(null);
-    assertWithMessage("Precondition: The group 'Administrators' was loaded by the group cache")
-        .that(group)
-        .isNotNull();
-
-    RestResponse r = adminRestSession.get("/config/server/caches/groups_byname");
-    CacheInfo result = newGson().fromJson(r.getReader(), CacheInfo.class);
-    assertThat(result.entries.mem).isGreaterThan((long) 0);
-
-    r = adminRestSession.post("/config/server/caches/groups_byname/flush");
-    r.assertOK();
-    r.consume();
-
-    r = adminRestSession.get("/config/server/caches/groups_byname");
-    result = newGson().fromJson(r.getReader(), CacheInfo.class);
-    assertThat(result.entries.mem).isNull();
-  }
-
-  @Test
-  public void flushCache_Forbidden() throws Exception {
-    userRestSession.post("/config/server/caches/accounts/flush").assertForbidden();
-  }
-
-  @Test
-  public void flushCache_NotFound() throws Exception {
-    adminRestSession.post("/config/server/caches/nonExisting/flush").assertNotFound();
-  }
-
-  @Test
-  public void flushCacheWithGerritPrefix() throws Exception {
-    adminRestSession.post("/config/server/caches/gerrit-accounts/flush").assertOK();
-  }
-
-  @Test
-  public void flushWebSessionsCache() throws Exception {
-    adminRestSession.post("/config/server/caches/web_sessions/flush").assertOK();
-  }
-
-  @Test
-  public void flushWebSessionsCache_Forbidden() throws Exception {
-    allowGlobalCapabilities(
-        REGISTERED_USERS, GlobalCapability.VIEW_CACHES, GlobalCapability.FLUSH_CACHES);
-    try {
-      RestResponse r = userRestSession.post("/config/server/caches/accounts/flush");
-      r.assertOK();
-      r.consume();
-
-      userRestSession.post("/config/server/caches/web_sessions/flush").assertForbidden();
-    } finally {
-      removeGlobalCapabilities(
-          REGISTERED_USERS, GlobalCapability.VIEW_CACHES, GlobalCapability.FLUSH_CACHES);
-    }
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/GetCacheIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/GetCacheIT.java
deleted file mode 100644
index fe600cc..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/GetCacheIT.java
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.acceptance.rest.config;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.RestResponse;
-import com.google.gerrit.server.config.ListCaches.CacheInfo;
-import com.google.gerrit.server.config.ListCaches.CacheType;
-import org.junit.Test;
-
-public class GetCacheIT extends AbstractDaemonTest {
-
-  @Test
-  public void getCache() throws Exception {
-    RestResponse r = adminRestSession.get("/config/server/caches/accounts");
-    r.assertOK();
-    CacheInfo result = newGson().fromJson(r.getReader(), CacheInfo.class);
-
-    assertThat(result.name).isEqualTo("accounts");
-    assertThat(result.type).isEqualTo(CacheType.MEM);
-    assertThat(result.entries.mem).isAtLeast(1L);
-    assertThat(result.averageGet).isNotNull();
-    assertThat(result.averageGet).endsWith("s");
-    assertThat(result.entries.disk).isNull();
-    assertThat(result.entries.space).isNull();
-    assertThat(result.hitRatio.mem).isAtLeast(0);
-    assertThat(result.hitRatio.mem).isAtMost(100);
-    assertThat(result.hitRatio.disk).isNull();
-
-    userRestSession.get("/config/server/version").consume();
-    r = adminRestSession.get("/config/server/caches/accounts");
-    r.assertOK();
-    result = newGson().fromJson(r.getReader(), CacheInfo.class);
-    assertThat(result.entries.mem).isEqualTo(2);
-  }
-
-  @Test
-  public void getCache_Forbidden() throws Exception {
-    userRestSession.get("/config/server/caches/accounts").assertForbidden();
-  }
-
-  @Test
-  public void getCache_NotFound() throws Exception {
-    adminRestSession.get("/config/server/caches/nonExisting").assertNotFound();
-  }
-
-  @Test
-  public void getCacheWithGerritPrefix() throws Exception {
-    adminRestSession.get("/config/server/caches/gerrit-accounts").assertOK();
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/GetTaskIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/GetTaskIT.java
deleted file mode 100644
index 900b4be..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/GetTaskIT.java
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.acceptance.rest.config;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.RestResponse;
-import com.google.gerrit.server.config.ListTasks.TaskInfo;
-import com.google.gson.reflect.TypeToken;
-import java.util.List;
-import org.junit.Test;
-
-public class GetTaskIT extends AbstractDaemonTest {
-
-  @Test
-  public void getTask() throws Exception {
-    RestResponse r = adminRestSession.get("/config/server/tasks/" + getLogFileCompressorTaskId());
-    r.assertOK();
-    TaskInfo info = newGson().fromJson(r.getReader(), new TypeToken<TaskInfo>() {}.getType());
-    assertThat(info.id).isNotNull();
-    Long.parseLong(info.id, 16);
-    assertThat(info.command).isEqualTo("Log File Compressor");
-    assertThat(info.startTime).isNotNull();
-  }
-
-  @Test
-  public void getTask_NotFound() throws Exception {
-    userRestSession.get("/config/server/tasks/" + getLogFileCompressorTaskId()).assertNotFound();
-  }
-
-  private String getLogFileCompressorTaskId() throws Exception {
-    RestResponse r = adminRestSession.get("/config/server/tasks/");
-    List<TaskInfo> result =
-        newGson().fromJson(r.getReader(), new TypeToken<List<TaskInfo>>() {}.getType());
-    r.consume();
-    for (TaskInfo info : result) {
-      if ("Log File Compressor".equals(info.command)) {
-        return info.id;
-      }
-    }
-    return null;
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/KillTaskIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/KillTaskIT.java
deleted file mode 100644
index 86f375e..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/KillTaskIT.java
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.acceptance.rest.config;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth8.assertThat;
-import static java.util.stream.Collectors.toSet;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.RestResponse;
-import com.google.gerrit.server.config.ListTasks.TaskInfo;
-import com.google.gson.reflect.TypeToken;
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
-import org.junit.Test;
-
-public class KillTaskIT extends AbstractDaemonTest {
-
-  private void killTask() throws Exception {
-    RestResponse r = adminRestSession.get("/config/server/tasks/");
-    List<TaskInfo> result =
-        newGson().fromJson(r.getReader(), new TypeToken<List<TaskInfo>>() {}.getType());
-    r.consume();
-
-    Optional<String> id =
-        result.stream()
-            .filter(t -> "Log File Compressor".equals(t.command))
-            .map(t -> t.id)
-            .findFirst();
-    assertThat(id).isPresent();
-
-    r = adminRestSession.delete("/config/server/tasks/" + id.get());
-    r.assertNoContent();
-    r.consume();
-
-    r = adminRestSession.get("/config/server/tasks/");
-    result = newGson().fromJson(r.getReader(), new TypeToken<List<TaskInfo>>() {}.getType());
-    r.consume();
-    Set<String> ids = result.stream().map(t -> t.id).collect(toSet());
-    assertThat(ids).doesNotContain(id.get());
-  }
-
-  private void killTask_NotFound() throws Exception {
-    RestResponse r = adminRestSession.get("/config/server/tasks/");
-    List<TaskInfo> result =
-        newGson().fromJson(r.getReader(), new TypeToken<List<TaskInfo>>() {}.getType());
-    r.consume();
-    assertThat(result.size()).isGreaterThan(0);
-
-    userRestSession.delete("/config/server/tasks/" + result.get(0).id).assertNotFound();
-  }
-
-  @Test
-  public void killTaskTests_inOrder() throws Exception {
-    // As killTask() changes the state of the server, we want to test it last
-    killTask_NotFound();
-    killTask();
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ListCachesIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ListCachesIT.java
deleted file mode 100644
index 4d48bf4..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ListCachesIT.java
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.acceptance.rest.config;
-
-import static com.google.common.truth.Truth.assertThat;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.collect.Ordering;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.RestResponse;
-import com.google.gerrit.server.config.ListCaches.CacheInfo;
-import com.google.gerrit.server.config.ListCaches.CacheType;
-import com.google.gson.reflect.TypeToken;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import org.eclipse.jgit.util.Base64;
-import org.junit.Test;
-
-public class ListCachesIT extends AbstractDaemonTest {
-
-  @Test
-  public void listCaches() throws Exception {
-    RestResponse r = adminRestSession.get("/config/server/caches/");
-    r.assertOK();
-    Map<String, CacheInfo> result =
-        newGson().fromJson(r.getReader(), new TypeToken<Map<String, CacheInfo>>() {}.getType());
-
-    assertThat(result).containsKey("accounts");
-    CacheInfo accountsCacheInfo = result.get("accounts");
-    assertThat(accountsCacheInfo.type).isEqualTo(CacheType.MEM);
-    assertThat(accountsCacheInfo.entries.mem).isAtLeast(1L);
-    assertThat(accountsCacheInfo.averageGet).isNotNull();
-    assertThat(accountsCacheInfo.averageGet).endsWith("s");
-    assertThat(accountsCacheInfo.entries.disk).isNull();
-    assertThat(accountsCacheInfo.entries.space).isNull();
-    assertThat(accountsCacheInfo.hitRatio.mem).isAtLeast(0);
-    assertThat(accountsCacheInfo.hitRatio.mem).isAtMost(100);
-    assertThat(accountsCacheInfo.hitRatio.disk).isNull();
-
-    userRestSession.get("/config/server/version").consume();
-    r = adminRestSession.get("/config/server/caches/");
-    r.assertOK();
-    result =
-        newGson().fromJson(r.getReader(), new TypeToken<Map<String, CacheInfo>>() {}.getType());
-    assertThat(result.get("accounts").entries.mem).isEqualTo(2);
-  }
-
-  @Test
-  public void listCaches_Forbidden() throws Exception {
-    userRestSession.get("/config/server/caches/").assertForbidden();
-  }
-
-  @Test
-  public void listCacheNames() throws Exception {
-    RestResponse r = adminRestSession.get("/config/server/caches/?format=LIST");
-    r.assertOK();
-    List<String> result =
-        newGson().fromJson(r.getReader(), new TypeToken<List<String>>() {}.getType());
-    assertThat(result).contains("accounts");
-    assertThat(result).contains("projects");
-    assertThat(Ordering.natural().isOrdered(result)).isTrue();
-  }
-
-  @Test
-  public void listCacheNamesTextList() throws Exception {
-    RestResponse r = adminRestSession.get("/config/server/caches/?format=TEXT_LIST");
-    r.assertOK();
-    String result = new String(Base64.decode(r.getEntityContent()), UTF_8.name());
-    List<String> list = Arrays.asList(result.split("\n"));
-    assertThat(list).contains("accounts");
-    assertThat(list).contains("projects");
-    assertThat(Ordering.natural().isOrdered(list)).isTrue();
-  }
-
-  @Test
-  public void listCaches_BadRequest() throws Exception {
-    adminRestSession.get("/config/server/caches/?format=NONSENSE").assertBadRequest();
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ListTasksIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ListTasksIT.java
deleted file mode 100644
index ee6411a..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ListTasksIT.java
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.acceptance.rest.config;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.RestResponse;
-import com.google.gerrit.server.config.ListTasks.TaskInfo;
-import com.google.gson.reflect.TypeToken;
-import java.util.List;
-import org.junit.Test;
-
-public class ListTasksIT extends AbstractDaemonTest {
-
-  @Test
-  public void listTasks() throws Exception {
-    RestResponse r = adminRestSession.get("/config/server/tasks/");
-    r.assertOK();
-    List<TaskInfo> result =
-        newGson().fromJson(r.getReader(), new TypeToken<List<TaskInfo>>() {}.getType());
-    assertThat(result).isNotEmpty();
-    boolean foundLogFileCompressorTask = false;
-    for (TaskInfo info : result) {
-      if ("Log File Compressor".equals(info.command)) {
-        foundLogFileCompressorTask = true;
-      }
-      assertThat(info.id).isNotNull();
-      Long.parseLong(info.id, 16);
-      assertThat(info.command).isNotNull();
-      assertThat(info.startTime).isNotNull();
-    }
-    assertThat(foundLogFileCompressorTask).isTrue();
-  }
-
-  @Test
-  public void listTasksWithoutViewQueueCapability() throws Exception {
-    RestResponse r = userRestSession.get("/config/server/tasks/");
-    r.assertOK();
-    List<TaskInfo> result =
-        newGson().fromJson(r.getReader(), new TypeToken<List<TaskInfo>>() {}.getType());
-
-    assertThat(result).isEmpty();
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ServerInfoIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ServerInfoIT.java
deleted file mode 100644
index 22f1602..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ServerInfoIT.java
+++ /dev/null
@@ -1,209 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.acceptance.rest.config;
-
-import static com.google.common.truth.Truth.assertThat;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.GerritConfig;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.common.RawInputUtil;
-import com.google.gerrit.extensions.client.AccountFieldName;
-import com.google.gerrit.extensions.client.AuthType;
-import com.google.gerrit.extensions.common.AccountVisibility;
-import com.google.gerrit.extensions.common.InstallPluginInput;
-import com.google.gerrit.extensions.common.ServerInfo;
-import com.google.gerrit.server.config.AllProjectsNameProvider;
-import com.google.gerrit.server.config.AllUsersNameProvider;
-import com.google.gerrit.server.config.AnonymousCowardNameProvider;
-import org.junit.Test;
-
-@NoHttpd
-public class ServerInfoIT extends AbstractDaemonTest {
-  private static final byte[] JS_PLUGIN_CONTENT =
-      "Gerrit.install(function(self){});\n".getBytes(UTF_8);
-
-  @Test
-  // accounts
-  @GerritConfig(name = "accounts.visibility", value = "VISIBLE_GROUP")
-
-  // auth
-  @GerritConfig(name = "auth.type", value = "HTTP")
-  @GerritConfig(name = "auth.contributorAgreements", value = "true")
-  @GerritConfig(name = "auth.loginUrl", value = "https://example.com/login")
-  @GerritConfig(name = "auth.loginText", value = "LOGIN")
-  @GerritConfig(name = "auth.switchAccountUrl", value = "https://example.com/switch")
-
-  // auth fields ignored when auth == HTTP
-  @GerritConfig(name = "auth.registerUrl", value = "https://example.com/register")
-  @GerritConfig(name = "auth.registerText", value = "REGISTER")
-  @GerritConfig(name = "auth.editFullNameUrl", value = "https://example.com/editname")
-  @GerritConfig(name = "auth.httpPasswordUrl", value = "https://example.com/password")
-
-  // change
-  @GerritConfig(name = "change.largeChange", value = "300")
-  @GerritConfig(name = "change.replyTooltip", value = "Publish votes and draft comments")
-  @GerritConfig(name = "change.replyLabel", value = "Vote")
-  @GerritConfig(name = "change.updateDelay", value = "50s")
-  @GerritConfig(name = "change.disablePrivateChanges", value = "true")
-
-  // download
-  @GerritConfig(
-      name = "download.archive",
-      values = {"tar", "tbz2", "tgz", "txz"})
-
-  // gerrit
-  @GerritConfig(name = "gerrit.allProjects", value = "Root")
-  @GerritConfig(name = "gerrit.allUsers", value = "Users")
-  @GerritConfig(name = "gerrit.enableGwtUi", value = "true")
-  @GerritConfig(name = "gerrit.reportBugText", value = "REPORT BUG")
-  @GerritConfig(name = "gerrit.reportBugUrl", value = "https://example.com/report")
-
-  // suggest
-  @GerritConfig(name = "suggest.from", value = "3")
-
-  // user
-  @GerritConfig(name = "user.anonymousCoward", value = "Unnamed User")
-  public void serverConfig() throws Exception {
-    ServerInfo i = gApi.config().server().getInfo();
-
-    // accounts
-    assertThat(i.accounts.visibility).isEqualTo(AccountVisibility.VISIBLE_GROUP);
-
-    // auth
-    assertThat(i.auth.authType).isEqualTo(AuthType.HTTP);
-    assertThat(i.auth.editableAccountFields)
-        .containsExactly(AccountFieldName.REGISTER_NEW_EMAIL, AccountFieldName.FULL_NAME);
-    assertThat(i.auth.useContributorAgreements).isTrue();
-    assertThat(i.auth.loginUrl).isEqualTo("https://example.com/login");
-    assertThat(i.auth.loginText).isEqualTo("LOGIN");
-    assertThat(i.auth.switchAccountUrl).isEqualTo("https://example.com/switch");
-    assertThat(i.auth.registerUrl).isNull();
-    assertThat(i.auth.registerText).isNull();
-    assertThat(i.auth.editFullNameUrl).isNull();
-    assertThat(i.auth.httpPasswordUrl).isNull();
-
-    // change
-    assertThat(i.change.largeChange).isEqualTo(300);
-    assertThat(i.change.replyTooltip).startsWith("Publish votes and draft comments");
-    assertThat(i.change.replyLabel).isEqualTo("Vote\u2026");
-    assertThat(i.change.updateDelay).isEqualTo(50);
-    assertThat(i.change.disablePrivateChanges).isTrue();
-
-    // download
-    assertThat(i.download.archives).containsExactly("tar", "tbz2", "tgz", "txz");
-    assertThat(i.download.schemes).isEmpty();
-
-    // gerrit
-    assertThat(i.gerrit.allProjects).isEqualTo("Root");
-    assertThat(i.gerrit.allUsers).isEqualTo("Users");
-    assertThat(i.gerrit.reportBugUrl).isEqualTo("https://example.com/report");
-    assertThat(i.gerrit.reportBugText).isEqualTo("REPORT BUG");
-
-    // Acceptance tests force --headless even when UIs are specified in config.
-    assertThat(i.gerrit.webUis).isEmpty();
-
-    // plugin
-    assertThat(i.plugin.jsResourcePaths).isEmpty();
-
-    // sshd
-    assertThat(i.sshd).isNotNull();
-
-    // suggest
-    assertThat(i.suggest.from).isEqualTo(3);
-
-    // user
-    assertThat(i.user.anonymousCowardName).isEqualTo("Unnamed User");
-
-    // notedb
-    notesMigration.setReadChanges(true);
-    assertThat(gApi.config().server().getInfo().noteDbEnabled).isTrue();
-    notesMigration.setReadChanges(false);
-    assertThat(gApi.config().server().getInfo().noteDbEnabled).isNull();
-  }
-
-  @Test
-  @GerritConfig(name = "plugins.allowRemoteAdmin", value = "true")
-  public void serverConfigWithPlugin() throws Exception {
-    ServerInfo i = gApi.config().server().getInfo();
-    assertThat(i.plugin.jsResourcePaths).isEmpty();
-
-    InstallPluginInput input = new InstallPluginInput();
-    input.raw = RawInputUtil.create(JS_PLUGIN_CONTENT);
-    gApi.plugins().install("js-plugin-1.js", input);
-
-    i = gApi.config().server().getInfo();
-    assertThat(i.plugin.jsResourcePaths).hasSize(1);
-  }
-
-  @Test
-  public void serverConfigWithDefaults() throws Exception {
-    ServerInfo i = gApi.config().server().getInfo();
-
-    // auth
-    assertThat(i.auth.authType).isEqualTo(AuthType.OPENID);
-    assertThat(i.auth.editableAccountFields)
-        .containsExactly(
-            AccountFieldName.REGISTER_NEW_EMAIL,
-            AccountFieldName.FULL_NAME,
-            AccountFieldName.USER_NAME);
-    assertThat(i.auth.useContributorAgreements).isNull();
-    assertThat(i.auth.loginUrl).isNull();
-    assertThat(i.auth.loginText).isNull();
-    assertThat(i.auth.switchAccountUrl).isNull();
-    assertThat(i.auth.registerUrl).isNull();
-    assertThat(i.auth.registerText).isNull();
-    assertThat(i.auth.editFullNameUrl).isNull();
-    assertThat(i.auth.httpPasswordUrl).isNull();
-
-    // change
-    assertThat(i.change.largeChange).isEqualTo(500);
-    assertThat(i.change.replyTooltip).startsWith("Reply and score");
-    assertThat(i.change.replyLabel).isEqualTo("Reply\u2026");
-    assertThat(i.change.updateDelay).isEqualTo(300);
-
-    // download
-    assertThat(i.download.archives).containsExactly("tar", "tbz2", "tgz", "txz");
-    assertThat(i.download.schemes).isEmpty();
-
-    // gerrit
-    assertThat(i.gerrit.allProjects).isEqualTo(AllProjectsNameProvider.DEFAULT);
-    assertThat(i.gerrit.allUsers).isEqualTo(AllUsersNameProvider.DEFAULT);
-    assertThat(i.gerrit.reportBugUrl).isNull();
-    assertThat(i.gerrit.reportBugText).isNull();
-
-    // plugin
-    assertThat(i.plugin.jsResourcePaths).isEmpty();
-
-    // sshd
-    assertThat(i.sshd).isNotNull();
-
-    // suggest
-    assertThat(i.suggest.from).isEqualTo(0);
-
-    // user
-    assertThat(i.user.anonymousCowardName).isEqualTo(AnonymousCowardNameProvider.DEFAULT);
-  }
-
-  @Test
-  @GerritConfig(name = "auth.contributorAgreements", value = "true")
-  public void anonymousAccess() throws Exception {
-    configureContributorAgreement(true);
-
-    setApiUserAnonymous();
-    gApi.config().server().getInfo();
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/group/BUILD b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/group/BUILD
deleted file mode 100644
index b3672ee..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/group/BUILD
+++ /dev/null
@@ -1,7 +0,0 @@
-load("//gerrit-acceptance-tests:tests.bzl", "acceptance_tests")
-
-acceptance_tests(
-    srcs = glob(["*IT.java"]),
-    group = "rest_group",
-    labels = ["rest"],
-)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/AbstractPushTag.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/AbstractPushTag.java
deleted file mode 100644
index cea907d..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/AbstractPushTag.java
+++ /dev/null
@@ -1,261 +0,0 @@
-// 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.
-
-package com.google.gerrit.acceptance.rest.project;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.GitUtil.createAnnotatedTag;
-import static com.google.gerrit.acceptance.GitUtil.deleteRef;
-import static com.google.gerrit.acceptance.GitUtil.pushHead;
-import static com.google.gerrit.acceptance.GitUtil.updateAnnotatedTag;
-import static com.google.gerrit.acceptance.rest.project.AbstractPushTag.TagType.ANNOTATED;
-import static com.google.gerrit.acceptance.rest.project.AbstractPushTag.TagType.LIGHTWEIGHT;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-
-import com.google.common.base.MoreObjects;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.GitUtil;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.reviewdb.client.RefNames;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.transport.PushResult;
-import org.eclipse.jgit.transport.RemoteRefUpdate;
-import org.eclipse.jgit.transport.RemoteRefUpdate.Status;
-import org.junit.Before;
-import org.junit.Test;
-
-@NoHttpd
-public abstract class AbstractPushTag extends AbstractDaemonTest {
-  enum TagType {
-    LIGHTWEIGHT(Permission.CREATE),
-    ANNOTATED(Permission.CREATE_TAG);
-
-    final String createPermission;
-
-    TagType(String createPermission) {
-      this.createPermission = createPermission;
-    }
-  }
-
-  private RevCommit initialHead;
-  private TagType tagType;
-
-  @Before
-  public void setup() throws Exception {
-    // clone with user to avoid inherited tag permissions of admin user
-    testRepo = cloneProject(project, user);
-
-    initialHead = getRemoteHead();
-    tagType = getTagType();
-  }
-
-  protected abstract TagType getTagType();
-
-  @Test
-  public void createTagForExistingCommit() throws Exception {
-    pushTagForExistingCommit(Status.REJECTED_OTHER_REASON);
-
-    allowTagCreation();
-    pushTagForExistingCommit(Status.OK);
-
-    allowPushOnRefsTags();
-    pushTagForExistingCommit(Status.OK);
-
-    removePushFromRefsTags();
-  }
-
-  @Test
-  public void createTagForNewCommit() throws Exception {
-    pushTagForNewCommit(Status.REJECTED_OTHER_REASON);
-
-    allowTagCreation();
-    pushTagForNewCommit(Status.REJECTED_OTHER_REASON);
-
-    allowPushOnRefsTags();
-    pushTagForNewCommit(Status.OK);
-
-    removePushFromRefsTags();
-  }
-
-  @Test
-  public void fastForward() throws Exception {
-    allowTagCreation();
-    String tagName = pushTagForExistingCommit(Status.OK);
-
-    fastForwardTagToExistingCommit(tagName, Status.REJECTED_OTHER_REASON);
-    fastForwardTagToNewCommit(tagName, Status.REJECTED_OTHER_REASON);
-
-    allowTagDeletion();
-    fastForwardTagToExistingCommit(tagName, Status.REJECTED_OTHER_REASON);
-    fastForwardTagToNewCommit(tagName, Status.REJECTED_OTHER_REASON);
-
-    allowPushOnRefsTags();
-    Status expectedStatus = tagType == ANNOTATED ? Status.REJECTED_OTHER_REASON : Status.OK;
-    fastForwardTagToExistingCommit(tagName, expectedStatus);
-    fastForwardTagToNewCommit(tagName, expectedStatus);
-
-    allowForcePushOnRefsTags();
-    fastForwardTagToExistingCommit(tagName, Status.OK);
-    fastForwardTagToNewCommit(tagName, Status.OK);
-
-    removePushFromRefsTags();
-  }
-
-  @Test
-  public void forceUpdate() throws Exception {
-    allowTagCreation();
-    String tagName = pushTagForExistingCommit(Status.OK);
-
-    forceUpdateTagToExistingCommit(tagName, Status.REJECTED_OTHER_REASON);
-    forceUpdateTagToNewCommit(tagName, Status.REJECTED_OTHER_REASON);
-
-    allowPushOnRefsTags();
-    forceUpdateTagToExistingCommit(tagName, Status.REJECTED_OTHER_REASON);
-    forceUpdateTagToNewCommit(tagName, Status.REJECTED_OTHER_REASON);
-
-    allowTagDeletion();
-    forceUpdateTagToExistingCommit(tagName, Status.REJECTED_OTHER_REASON);
-    forceUpdateTagToNewCommit(tagName, Status.REJECTED_OTHER_REASON);
-
-    allowForcePushOnRefsTags();
-    forceUpdateTagToExistingCommit(tagName, Status.OK);
-    forceUpdateTagToNewCommit(tagName, Status.OK);
-
-    removePushFromRefsTags();
-  }
-
-  @Test
-  public void delete() throws Exception {
-    allowTagCreation();
-    String tagName = pushTagForExistingCommit(Status.OK);
-
-    pushTagDeletion(tagName, Status.REJECTED_OTHER_REASON);
-
-    allowPushOnRefsTags();
-    pushTagDeletion(tagName, Status.REJECTED_OTHER_REASON);
-
-    allowForcePushOnRefsTags();
-    tagName = pushTagForExistingCommit(Status.OK);
-    pushTagDeletion(tagName, Status.OK);
-
-    removePushFromRefsTags();
-    allowTagDeletion();
-    tagName = pushTagForExistingCommit(Status.OK);
-    pushTagDeletion(tagName, Status.OK);
-  }
-
-  private String pushTagForExistingCommit(Status expectedStatus) throws Exception {
-    return pushTag(null, false, false, expectedStatus);
-  }
-
-  private String pushTagForNewCommit(Status expectedStatus) throws Exception {
-    return pushTag(null, true, false, expectedStatus);
-  }
-
-  private void fastForwardTagToExistingCommit(String tagName, Status expectedStatus)
-      throws Exception {
-    pushTag(tagName, false, false, expectedStatus);
-  }
-
-  private void fastForwardTagToNewCommit(String tagName, Status expectedStatus) throws Exception {
-    pushTag(tagName, true, false, expectedStatus);
-  }
-
-  private void forceUpdateTagToExistingCommit(String tagName, Status expectedStatus)
-      throws Exception {
-    pushTag(tagName, false, true, expectedStatus);
-  }
-
-  private void forceUpdateTagToNewCommit(String tagName, Status expectedStatus) throws Exception {
-    pushTag(tagName, true, true, expectedStatus);
-  }
-
-  private String pushTag(String tagName, boolean newCommit, boolean force, Status expectedStatus)
-      throws Exception {
-    if (force) {
-      testRepo.reset(initialHead);
-    }
-    commit(user.getIdent(), "subject");
-
-    boolean createTag = tagName == null;
-    tagName = MoreObjects.firstNonNull(tagName, "v1_" + System.nanoTime());
-    switch (tagType) {
-      case LIGHTWEIGHT:
-        break;
-      case ANNOTATED:
-        if (createTag) {
-          createAnnotatedTag(testRepo, tagName, user.getIdent());
-        } else {
-          updateAnnotatedTag(testRepo, tagName, user.getIdent());
-        }
-        break;
-      default:
-        throw new IllegalStateException("unexpected tag type: " + tagType);
-    }
-
-    if (!newCommit) {
-      grant(project, "refs/for/refs/heads/master", Permission.SUBMIT, false, REGISTERED_USERS);
-      pushHead(testRepo, "refs/for/master%submit");
-    }
-
-    String tagRef = tagRef(tagName);
-    PushResult r =
-        tagType == LIGHTWEIGHT
-            ? pushHead(testRepo, tagRef, false, force)
-            : GitUtil.pushTag(testRepo, tagName, !createTag);
-    RemoteRefUpdate refUpdate = r.getRemoteUpdate(tagRef);
-    assertThat(refUpdate.getStatus()).named(tagType.name()).isEqualTo(expectedStatus);
-    return tagName;
-  }
-
-  private void pushTagDeletion(String tagName, Status expectedStatus) throws Exception {
-    String tagRef = tagRef(tagName);
-    PushResult r = deleteRef(testRepo, tagRef);
-    RemoteRefUpdate refUpdate = r.getRemoteUpdate(tagRef);
-    assertThat(refUpdate.getStatus()).named(tagType.name()).isEqualTo(expectedStatus);
-  }
-
-  private void allowTagCreation() throws Exception {
-    grant(project, "refs/tags/*", tagType.createPermission, false, REGISTERED_USERS);
-  }
-
-  private void allowPushOnRefsTags() throws Exception {
-    removePushFromRefsTags();
-    grant(project, "refs/tags/*", Permission.PUSH, false, REGISTERED_USERS);
-  }
-
-  private void allowForcePushOnRefsTags() throws Exception {
-    removePushFromRefsTags();
-    grant(project, "refs/tags/*", Permission.PUSH, true, REGISTERED_USERS);
-  }
-
-  private void allowTagDeletion() throws Exception {
-    removePushFromRefsTags();
-    grant(project, "refs/tags/*", Permission.DELETE, true, REGISTERED_USERS);
-  }
-
-  private void removePushFromRefsTags() throws Exception {
-    removePermission(project, "refs/tags/*", Permission.PUSH);
-  }
-
-  private void commit(PersonIdent ident, String subject) throws Exception {
-    commitBuilder().ident(ident).message(subject + " (" + System.nanoTime() + ")").create();
-  }
-
-  private static String tagRef(String tagName) {
-    return RefNames.REFS_TAGS + tagName;
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/AccessIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/AccessIT.java
deleted file mode 100644
index a0c8275..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/AccessIT.java
+++ /dev/null
@@ -1,617 +0,0 @@
-// 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.
-package com.google.gerrit.acceptance.rest.project;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth8.assertThat;
-import static com.google.gerrit.extensions.client.ListChangesOption.MESSAGES;
-import static org.junit.Assert.fail;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.GitUtil;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.common.data.AccessSection;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.access.AccessSectionInfo;
-import com.google.gerrit.extensions.api.access.PermissionInfo;
-import com.google.gerrit.extensions.api.access.PermissionRuleInfo;
-import com.google.gerrit.extensions.api.access.ProjectAccessInfo;
-import com.google.gerrit.extensions.api.access.ProjectAccessInput;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.api.projects.BranchInfo;
-import com.google.gerrit.extensions.api.projects.ProjectApi;
-import com.google.gerrit.extensions.client.ChangeStatus;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.config.AllProjectsNameProvider;
-import com.google.gerrit.server.group.InternalGroup;
-import com.google.gerrit.server.group.SystemGroupBackend;
-import java.util.HashMap;
-import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.junit.Before;
-import org.junit.Test;
-
-public class AccessIT extends AbstractDaemonTest {
-
-  private static final String PROJECT_NAME = "newProject";
-
-  private static final String REFS_ALL = Constants.R_REFS + "*";
-  private static final String REFS_HEADS = Constants.R_HEADS + "*";
-
-  private static final String LABEL_CODE_REVIEW = "Code-Review";
-
-  private String newProjectName;
-  private ProjectApi pApi;
-
-  @Before
-  public void setUp() throws Exception {
-    newProjectName = createProject(PROJECT_NAME).get();
-    pApi = gApi.projects().name(newProjectName);
-  }
-
-  @Test
-  public void getDefaultInheritance() throws Exception {
-    String inheritedName = pApi.access().inheritsFrom.name;
-    assertThat(inheritedName).isEqualTo(AllProjectsNameProvider.DEFAULT);
-  }
-
-  @Test
-  public void addAccessSection() throws Exception {
-    Project.NameKey p = new Project.NameKey(newProjectName);
-    RevCommit initialHead = getRemoteHead(p, RefNames.REFS_CONFIG);
-
-    ProjectAccessInput accessInput = newProjectAccessInput();
-    AccessSectionInfo accessSectionInfo = createDefaultAccessSectionInfo();
-
-    accessInput.add.put(REFS_HEADS, accessSectionInfo);
-    pApi.access(accessInput);
-
-    assertThat(pApi.access().local).isEqualTo(accessInput.add);
-
-    RevCommit updatedHead = getRemoteHead(p, RefNames.REFS_CONFIG);
-    eventRecorder.assertRefUpdatedEvents(
-        p.get(), RefNames.REFS_CONFIG, null, initialHead, initialHead, updatedHead);
-  }
-
-  @Test
-  public void createAccessChange() throws Exception {
-    // User can see the branch
-    setApiUser(user);
-    gApi.projects().name(newProjectName).branch("refs/heads/master").get();
-
-    ProjectAccessInput accessInput = newProjectAccessInput();
-
-    AccessSectionInfo accessSection = newAccessSectionInfo();
-
-    // Deny read to registered users.
-    PermissionInfo read = newPermissionInfo();
-    PermissionRuleInfo pri = new PermissionRuleInfo(PermissionRuleInfo.Action.DENY, false);
-    read.rules.put(SystemGroupBackend.REGISTERED_USERS.get(), pri);
-    read.exclusive = true;
-    accessSection.permissions.put(Permission.READ, read);
-    accessInput.add.put(REFS_HEADS, accessSection);
-
-    setApiUser(user);
-    ChangeInfo out = pApi.accessChange(accessInput);
-
-    assertThat(out.project).isEqualTo(newProjectName);
-    assertThat(out.branch).isEqualTo(RefNames.REFS_CONFIG);
-    assertThat(out.status).isEqualTo(ChangeStatus.NEW);
-    assertThat(out.submitted).isNull();
-
-    setApiUser(admin);
-
-    ChangeInfo c = gApi.changes().id(out._number).get(MESSAGES);
-    assertThat(c.messages.stream().map(m -> m.message)).containsExactly("Uploaded patch set 1");
-
-    ReviewInput reviewIn = new ReviewInput();
-    reviewIn.label("Code-Review", (short) 2);
-    gApi.changes().id(out._number).current().review(reviewIn);
-    gApi.changes().id(out._number).current().submit();
-
-    // check that the change took effect.
-    setApiUser(user);
-    try {
-      BranchInfo info = gApi.projects().name(newProjectName).branch("refs/heads/master").get();
-      fail("wanted failure, got " + newGson().toJson(info));
-    } catch (ResourceNotFoundException e) {
-      // OK.
-    }
-
-    // Restore.
-    accessInput.add.clear();
-    accessInput.remove.put(REFS_HEADS, accessSection);
-    setApiUser(user);
-
-    pApi.accessChange(accessInput);
-
-    setApiUser(admin);
-    out = pApi.accessChange(accessInput);
-
-    gApi.changes().id(out._number).current().review(reviewIn);
-    gApi.changes().id(out._number).current().submit();
-
-    // Now it works again.
-    setApiUser(user);
-    gApi.projects().name(newProjectName).branch("refs/heads/master").get();
-  }
-
-  @Test
-  public void removePermission() throws Exception {
-    // Add initial permission set
-    ProjectAccessInput accessInput = newProjectAccessInput();
-    AccessSectionInfo accessSectionInfo = createDefaultAccessSectionInfo();
-
-    accessInput.add.put(REFS_HEADS, accessSectionInfo);
-    pApi.access(accessInput);
-
-    // Remove specific permission
-    AccessSectionInfo accessSectionToRemove = newAccessSectionInfo();
-    accessSectionToRemove.permissions.put(
-        Permission.LABEL + LABEL_CODE_REVIEW, newPermissionInfo());
-    ProjectAccessInput removal = newProjectAccessInput();
-    removal.remove.put(REFS_HEADS, accessSectionToRemove);
-    pApi.access(removal);
-
-    // Remove locally
-    accessInput.add.get(REFS_HEADS).permissions.remove(Permission.LABEL + LABEL_CODE_REVIEW);
-
-    // Check
-    assertThat(pApi.access().local).isEqualTo(accessInput.add);
-  }
-
-  @Test
-  public void removePermissionRule() throws Exception {
-    // Add initial permission set
-    ProjectAccessInput accessInput = newProjectAccessInput();
-    AccessSectionInfo accessSectionInfo = createDefaultAccessSectionInfo();
-
-    accessInput.add.put(REFS_HEADS, accessSectionInfo);
-    pApi.access(accessInput);
-
-    // Remove specific permission rule
-    AccessSectionInfo accessSectionToRemove = newAccessSectionInfo();
-    PermissionInfo codeReview = newPermissionInfo();
-    codeReview.label = LABEL_CODE_REVIEW;
-    PermissionRuleInfo pri = new PermissionRuleInfo(PermissionRuleInfo.Action.DENY, false);
-    codeReview.rules.put(SystemGroupBackend.REGISTERED_USERS.get(), pri);
-    accessSectionToRemove.permissions.put(Permission.LABEL + LABEL_CODE_REVIEW, codeReview);
-    ProjectAccessInput removal = newProjectAccessInput();
-    removal.remove.put(REFS_HEADS, accessSectionToRemove);
-    pApi.access(removal);
-
-    // Remove locally
-    accessInput
-        .add
-        .get(REFS_HEADS)
-        .permissions
-        .get(Permission.LABEL + LABEL_CODE_REVIEW)
-        .rules
-        .remove(SystemGroupBackend.REGISTERED_USERS.get());
-
-    // Check
-    assertThat(pApi.access().local).isEqualTo(accessInput.add);
-  }
-
-  @Test
-  public void removePermissionRulesAndCleanupEmptyEntries() throws Exception {
-    // Add initial permission set
-    ProjectAccessInput accessInput = newProjectAccessInput();
-    AccessSectionInfo accessSectionInfo = createDefaultAccessSectionInfo();
-
-    accessInput.add.put(REFS_HEADS, accessSectionInfo);
-    pApi.access(accessInput);
-
-    // Remove specific permission rules
-    AccessSectionInfo accessSectionToRemove = newAccessSectionInfo();
-    PermissionInfo codeReview = newPermissionInfo();
-    codeReview.label = LABEL_CODE_REVIEW;
-    PermissionRuleInfo pri = new PermissionRuleInfo(PermissionRuleInfo.Action.DENY, false);
-    codeReview.rules.put(SystemGroupBackend.REGISTERED_USERS.get(), pri);
-    pri = new PermissionRuleInfo(PermissionRuleInfo.Action.DENY, false);
-    codeReview.rules.put(SystemGroupBackend.PROJECT_OWNERS.get(), pri);
-    accessSectionToRemove.permissions.put(Permission.LABEL + LABEL_CODE_REVIEW, codeReview);
-    ProjectAccessInput removal = newProjectAccessInput();
-    removal.remove.put(REFS_HEADS, accessSectionToRemove);
-    pApi.access(removal);
-
-    // Remove locally
-    accessInput.add.get(REFS_HEADS).permissions.remove(Permission.LABEL + LABEL_CODE_REVIEW);
-
-    // Check
-    assertThat(pApi.access().local).isEqualTo(accessInput.add);
-  }
-
-  @Test
-  public void getPermissionsWithDisallowedUser() throws Exception {
-    // Add initial permission set
-    ProjectAccessInput accessInput = newProjectAccessInput();
-    AccessSectionInfo accessSectionInfo = createAccessSectionInfoDenyAll();
-
-    // Disallow READ
-    accessInput.add.put(REFS_ALL, accessSectionInfo);
-    pApi.access(accessInput);
-
-    setApiUser(user);
-    exception.expect(ResourceNotFoundException.class);
-    gApi.projects().name(newProjectName).access();
-  }
-
-  @Test
-  public void setPermissionsWithDisallowedUser() throws Exception {
-    // Add initial permission set
-    ProjectAccessInput accessInput = newProjectAccessInput();
-    AccessSectionInfo accessSectionInfo = createAccessSectionInfoDenyAll();
-
-    // Disallow READ
-    accessInput.add.put(REFS_ALL, accessSectionInfo);
-    pApi.access(accessInput);
-
-    // Create a change to apply
-    ProjectAccessInput accessInfoToApply = newProjectAccessInput();
-    AccessSectionInfo accessSectionInfoToApply = createDefaultAccessSectionInfo();
-    accessInfoToApply.add.put(REFS_HEADS, accessSectionInfoToApply);
-
-    setApiUser(user);
-    exception.expect(ResourceNotFoundException.class);
-    gApi.projects().name(newProjectName).access();
-  }
-
-  @Test
-  public void permissionsGroupMap() throws Exception {
-    // Add initial permission set
-    ProjectAccessInput accessInput = newProjectAccessInput();
-    AccessSectionInfo accessSection = newAccessSectionInfo();
-
-    PermissionInfo push = newPermissionInfo();
-    PermissionRuleInfo pri = new PermissionRuleInfo(PermissionRuleInfo.Action.ALLOW, false);
-    push.rules.put(SystemGroupBackend.PROJECT_OWNERS.get(), pri);
-    accessSection.permissions.put(Permission.PUSH, push);
-
-    PermissionInfo read = newPermissionInfo();
-    pri = new PermissionRuleInfo(PermissionRuleInfo.Action.ALLOW, false);
-    read.rules.put(SystemGroupBackend.ANONYMOUS_USERS.get(), pri);
-    accessSection.permissions.put(Permission.READ, read);
-
-    accessInput.add.put(REFS_ALL, accessSection);
-    ProjectAccessInfo result = pApi.access(accessInput);
-    assertThat(result.groups.keySet())
-        .containsExactly(
-            SystemGroupBackend.PROJECT_OWNERS.get(), SystemGroupBackend.ANONYMOUS_USERS.get());
-
-    // Check the name, which is what the UI cares about; exhaustive
-    // coverage of GroupInfo should be in groups REST API tests.
-    assertThat(result.groups.get(SystemGroupBackend.PROJECT_OWNERS.get()).name)
-        .isEqualTo("Project Owners");
-    // Strip the ID, since it is in the key.
-    assertThat(result.groups.get(SystemGroupBackend.PROJECT_OWNERS.get()).id).isNull();
-
-    // Get call returns groups too.
-    ProjectAccessInfo loggedInResult = pApi.access();
-    assertThat(loggedInResult.groups.keySet())
-        .containsExactly(
-            SystemGroupBackend.PROJECT_OWNERS.get(), SystemGroupBackend.ANONYMOUS_USERS.get());
-    assertThat(loggedInResult.groups.get(SystemGroupBackend.PROJECT_OWNERS.get()).name)
-        .isEqualTo("Project Owners");
-    assertThat(loggedInResult.groups.get(SystemGroupBackend.PROJECT_OWNERS.get()).id).isNull();
-
-    // PROJECT_OWNERS is invisible to anonymous user, so we strip it.
-    setApiUserAnonymous();
-    ProjectAccessInfo anonResult = pApi.access();
-    assertThat(anonResult.groups.keySet())
-        .containsExactly(SystemGroupBackend.ANONYMOUS_USERS.get());
-  }
-
-  @Test
-  public void updateParentAsUser() throws Exception {
-    // Create child
-    String newParentProjectName = createProject(PROJECT_NAME + "PA").get();
-
-    // Set new parent
-    ProjectAccessInput accessInput = newProjectAccessInput();
-    accessInput.parent = newParentProjectName;
-
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    exception.expectMessage("administrate server not permitted");
-    gApi.projects().name(newProjectName).access(accessInput);
-  }
-
-  @Test
-  public void updateParentAsAdministrator() throws Exception {
-    // Create parent
-    String newParentProjectName = createProject(PROJECT_NAME + "PA").get();
-
-    // Set new parent
-    ProjectAccessInput accessInput = newProjectAccessInput();
-    accessInput.parent = newParentProjectName;
-
-    gApi.projects().name(newProjectName).access(accessInput);
-
-    assertThat(pApi.access().inheritsFrom.name).isEqualTo(newParentProjectName);
-  }
-
-  @Test
-  public void addGlobalCapabilityAsUser() throws Exception {
-    ProjectAccessInput accessInput = newProjectAccessInput();
-    AccessSectionInfo accessSectionInfo = createDefaultGlobalCapabilitiesAccessSectionInfo();
-
-    accessInput.add.put(AccessSection.GLOBAL_CAPABILITIES, accessSectionInfo);
-
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    gApi.projects().name(allProjects.get()).access(accessInput);
-  }
-
-  @Test
-  public void addGlobalCapabilityAsAdmin() throws Exception {
-    ProjectAccessInput accessInput = newProjectAccessInput();
-    AccessSectionInfo accessSectionInfo = createDefaultGlobalCapabilitiesAccessSectionInfo();
-
-    accessInput.add.put(AccessSection.GLOBAL_CAPABILITIES, accessSectionInfo);
-
-    ProjectAccessInfo updatedAccessSectionInfo =
-        gApi.projects().name(allProjects.get()).access(accessInput);
-    assertThat(
-            updatedAccessSectionInfo
-                .local
-                .get(AccessSection.GLOBAL_CAPABILITIES)
-                .permissions
-                .keySet())
-        .containsAllIn(accessSectionInfo.permissions.keySet());
-  }
-
-  @Test
-  public void addGlobalCapabilityForNonRootProject() throws Exception {
-    ProjectAccessInput accessInput = newProjectAccessInput();
-    AccessSectionInfo accessSectionInfo = createDefaultGlobalCapabilitiesAccessSectionInfo();
-
-    accessInput.add.put(AccessSection.GLOBAL_CAPABILITIES, accessSectionInfo);
-
-    exception.expect(BadRequestException.class);
-    pApi.access(accessInput);
-  }
-
-  @Test
-  public void addNonGlobalCapabilityToGlobalCapabilities() throws Exception {
-    InternalGroup adminGroup =
-        groupCache.get(new AccountGroup.NameKey("Administrators")).orElse(null);
-
-    ProjectAccessInput accessInput = newProjectAccessInput();
-    AccessSectionInfo accessSectionInfo = newAccessSectionInfo();
-
-    PermissionInfo permissionInfo = newPermissionInfo();
-    permissionInfo.rules.put(adminGroup.getGroupUUID().get(), null);
-    accessSectionInfo.permissions.put(Permission.PUSH, permissionInfo);
-
-    accessInput.add.put(AccessSection.GLOBAL_CAPABILITIES, accessSectionInfo);
-
-    exception.expect(BadRequestException.class);
-    gApi.projects().name(allProjects.get()).access(accessInput);
-  }
-
-  @Test
-  public void removeGlobalCapabilityAsUser() throws Exception {
-    ProjectAccessInput accessInput = newProjectAccessInput();
-    AccessSectionInfo accessSectionInfo = createDefaultGlobalCapabilitiesAccessSectionInfo();
-
-    accessInput.remove.put(AccessSection.GLOBAL_CAPABILITIES, accessSectionInfo);
-
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    gApi.projects().name(allProjects.get()).access(accessInput);
-  }
-
-  @Test
-  public void removeGlobalCapabilityAsAdmin() throws Exception {
-    InternalGroup adminGroup =
-        groupCache.get(new AccountGroup.NameKey("Administrators")).orElse(null);
-
-    ProjectAccessInput accessInput = newProjectAccessInput();
-    AccessSectionInfo accessSectionInfo = newAccessSectionInfo();
-
-    PermissionInfo permissionInfo = newPermissionInfo();
-    permissionInfo.rules.put(adminGroup.getGroupUUID().get(), null);
-    accessSectionInfo.permissions.put(GlobalCapability.ACCESS_DATABASE, permissionInfo);
-
-    // Add and validate first as removing existing privileges such as
-    // administrateServer would break upcoming tests
-    accessInput.add.put(AccessSection.GLOBAL_CAPABILITIES, accessSectionInfo);
-
-    ProjectAccessInfo updatedProjectAccessInfo =
-        gApi.projects().name(allProjects.get()).access(accessInput);
-    assertThat(
-            updatedProjectAccessInfo
-                .local
-                .get(AccessSection.GLOBAL_CAPABILITIES)
-                .permissions
-                .keySet())
-        .containsAllIn(accessSectionInfo.permissions.keySet());
-
-    // Remove
-    accessInput.add.clear();
-    accessInput.remove.put(AccessSection.GLOBAL_CAPABILITIES, accessSectionInfo);
-
-    updatedProjectAccessInfo = gApi.projects().name(allProjects.get()).access(accessInput);
-    assertThat(
-            updatedProjectAccessInfo
-                .local
-                .get(AccessSection.GLOBAL_CAPABILITIES)
-                .permissions
-                .keySet())
-        .containsNoneIn(accessSectionInfo.permissions.keySet());
-  }
-
-  @Test
-  public void unknownPermissionRemainsUnchanged() throws Exception {
-    String access = "access";
-    String unknownPermission = "unknownPermission";
-    String registeredUsers = "group Registered Users";
-    String refsFor = "refs/for/*";
-    // Clone repository to forcefully add permission
-    TestRepository<InMemoryRepository> allProjectsRepo = cloneProject(allProjects, admin);
-
-    // Fetch permission ref
-    GitUtil.fetch(allProjectsRepo, "refs/meta/config:cfg");
-    allProjectsRepo.reset("cfg");
-
-    // Load current permissions
-    String config =
-        gApi.projects()
-            .name(allProjects.get())
-            .branch(RefNames.REFS_CONFIG)
-            .file("project.config")
-            .asString();
-
-    // Append and push unknown permission
-    Config cfg = new Config();
-    cfg.fromText(config);
-    cfg.setString(access, refsFor, unknownPermission, registeredUsers);
-    config = cfg.toText();
-    PushOneCommit push =
-        pushFactory.create(
-            db, admin.getIdent(), allProjectsRepo, "Subject", "project.config", config);
-    push.to(RefNames.REFS_CONFIG).assertOkStatus();
-
-    // Verify that unknownPermission is present
-    config =
-        gApi.projects()
-            .name(allProjects.get())
-            .branch(RefNames.REFS_CONFIG)
-            .file("project.config")
-            .asString();
-    cfg.fromText(config);
-    assertThat(cfg.getString(access, refsFor, unknownPermission)).isEqualTo(registeredUsers);
-
-    // Make permission change through API
-    ProjectAccessInput accessInput = newProjectAccessInput();
-    AccessSectionInfo accessSectionInfo = createDefaultAccessSectionInfo();
-    accessInput.add.put(refsFor, accessSectionInfo);
-    gApi.projects().name(allProjects.get()).access(accessInput);
-    accessInput.add.clear();
-    accessInput.remove.put(refsFor, accessSectionInfo);
-    gApi.projects().name(allProjects.get()).access(accessInput);
-
-    // Verify that unknownPermission is still present
-    config =
-        gApi.projects()
-            .name(allProjects.get())
-            .branch(RefNames.REFS_CONFIG)
-            .file("project.config")
-            .asString();
-    cfg.fromText(config);
-    assertThat(cfg.getString(access, refsFor, unknownPermission)).isEqualTo(registeredUsers);
-  }
-
-  @Test
-  public void addAccessSectionForInvalidRef() throws Exception {
-    ProjectAccessInput accessInput = newProjectAccessInput();
-    AccessSectionInfo accessSectionInfo = createDefaultAccessSectionInfo();
-
-    // 'refs/heads/stable_*' is invalid, correct would be '^refs/heads/stable_.*'
-    String invalidRef = Constants.R_HEADS + "stable_*";
-    accessInput.add.put(invalidRef, accessSectionInfo);
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("Invalid Name: " + invalidRef);
-    pApi.access(accessInput);
-  }
-
-  @Test
-  public void createAccessChangeWithAccessSectionForInvalidRef() throws Exception {
-    ProjectAccessInput accessInput = newProjectAccessInput();
-    AccessSectionInfo accessSectionInfo = createDefaultAccessSectionInfo();
-
-    // 'refs/heads/stable_*' is invalid, correct would be '^refs/heads/stable_.*'
-    String invalidRef = Constants.R_HEADS + "stable_*";
-    accessInput.add.put(invalidRef, accessSectionInfo);
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("Invalid Name: " + invalidRef);
-    pApi.accessChange(accessInput);
-  }
-
-  private ProjectAccessInput newProjectAccessInput() {
-    ProjectAccessInput p = new ProjectAccessInput();
-    p.add = new HashMap<>();
-    p.remove = new HashMap<>();
-    return p;
-  }
-
-  private PermissionInfo newPermissionInfo() {
-    PermissionInfo p = new PermissionInfo(null, null);
-    p.rules = new HashMap<>();
-    return p;
-  }
-
-  private AccessSectionInfo newAccessSectionInfo() {
-    AccessSectionInfo a = new AccessSectionInfo();
-    a.permissions = new HashMap<>();
-    return a;
-  }
-
-  private AccessSectionInfo createDefaultAccessSectionInfo() {
-    AccessSectionInfo accessSection = newAccessSectionInfo();
-
-    PermissionInfo push = newPermissionInfo();
-    PermissionRuleInfo pri = new PermissionRuleInfo(PermissionRuleInfo.Action.ALLOW, false);
-    push.rules.put(SystemGroupBackend.REGISTERED_USERS.get(), pri);
-    accessSection.permissions.put(Permission.PUSH, push);
-
-    PermissionInfo codeReview = newPermissionInfo();
-    codeReview.label = LABEL_CODE_REVIEW;
-    pri = new PermissionRuleInfo(PermissionRuleInfo.Action.DENY, false);
-    codeReview.rules.put(SystemGroupBackend.REGISTERED_USERS.get(), pri);
-
-    pri = new PermissionRuleInfo(PermissionRuleInfo.Action.ALLOW, false);
-    pri.max = 1;
-    pri.min = -1;
-    codeReview.rules.put(SystemGroupBackend.PROJECT_OWNERS.get(), pri);
-    accessSection.permissions.put(Permission.LABEL + LABEL_CODE_REVIEW, codeReview);
-
-    return accessSection;
-  }
-
-  private AccessSectionInfo createDefaultGlobalCapabilitiesAccessSectionInfo() {
-    AccessSectionInfo accessSection = newAccessSectionInfo();
-
-    PermissionInfo email = newPermissionInfo();
-    PermissionRuleInfo pri = new PermissionRuleInfo(PermissionRuleInfo.Action.ALLOW, false);
-    email.rules.put(SystemGroupBackend.REGISTERED_USERS.get(), pri);
-    accessSection.permissions.put(GlobalCapability.EMAIL_REVIEWERS, email);
-
-    return accessSection;
-  }
-
-  private AccessSectionInfo createAccessSectionInfoDenyAll() {
-    AccessSectionInfo accessSection = newAccessSectionInfo();
-
-    PermissionInfo read = newPermissionInfo();
-    PermissionRuleInfo pri = new PermissionRuleInfo(PermissionRuleInfo.Action.DENY, false);
-    read.rules.put(SystemGroupBackend.ANONYMOUS_USERS.get(), pri);
-    accessSection.permissions.put(Permission.READ, read);
-
-    return accessSection;
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/BUILD b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/BUILD
deleted file mode 100644
index fbe5d80..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/BUILD
+++ /dev/null
@@ -1,49 +0,0 @@
-load("//gerrit-acceptance-tests:tests.bzl", "acceptance_tests")
-
-acceptance_tests(
-    srcs = glob(["*IT.java"]),
-    group = "rest_project",
-    labels = ["rest"],
-    deps = [
-        ":project",
-        ":push_tag_util",
-        ":refassert",
-    ],
-)
-
-java_library(
-    name = "refassert",
-    srcs = [
-        "RefAssert.java",
-    ],
-    deps = [
-        "//gerrit-extension-api:api",
-        "//gerrit-server:server",
-        "//lib:truth",
-    ],
-)
-
-java_library(
-    name = "project",
-    srcs = [
-        "ProjectAssert.java",
-    ],
-    deps = [
-        "//gerrit-extension-api:api",
-        "//gerrit-reviewdb:server",
-        "//gerrit-server:server",
-        "//lib:gwtorm",
-        "//lib:truth",
-    ],
-)
-
-java_library(
-    name = "push_tag_util",
-    testonly = 1,
-    srcs = [
-        "AbstractPushTag.java",
-    ],
-    deps = [
-        "//gerrit-acceptance-tests:lib",
-    ],
-)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/BanCommitIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/BanCommitIT.java
deleted file mode 100644
index 00a11de..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/BanCommitIT.java
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.acceptance.rest.project;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.GitUtil.pushHead;
-import static org.eclipse.jgit.transport.RemoteRefUpdate.Status.REJECTED_OTHER_REASON;
-
-import com.google.common.collect.Iterables;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.RestResponse;
-import com.google.gerrit.server.project.BanCommit;
-import com.google.gerrit.server.project.BanCommit.BanResultInfo;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.transport.RemoteRefUpdate;
-import org.junit.Test;
-
-public class BanCommitIT extends AbstractDaemonTest {
-
-  @Test
-  public void banCommit() throws Exception {
-    RevCommit c = commitBuilder().add("a.txt", "some content").create();
-
-    RestResponse r =
-        adminRestSession.put(
-            "/projects/" + project.get() + "/ban/", BanCommit.Input.fromCommits(c.name()));
-    r.assertOK();
-    BanResultInfo info = newGson().fromJson(r.getReader(), BanResultInfo.class);
-    assertThat(Iterables.getOnlyElement(info.newlyBanned)).isEqualTo(c.name());
-    assertThat(info.alreadyBanned).isNull();
-    assertThat(info.ignored).isNull();
-
-    RemoteRefUpdate u =
-        pushHead(testRepo, "refs/heads/master", false).getRemoteUpdate("refs/heads/master");
-    assertThat(u).isNotNull();
-    assertThat(u.getStatus()).isEqualTo(REJECTED_OTHER_REASON);
-    assertThat(u.getMessage()).contains("contains banned commit");
-  }
-
-  @Test
-  public void banAlreadyBannedCommit() throws Exception {
-    RestResponse r =
-        adminRestSession.put(
-            "/projects/" + project.get() + "/ban/",
-            BanCommit.Input.fromCommits("a8a477efffbbf3b44169bb9a1d3a334cbbd9aa96"));
-    r.consume();
-
-    r =
-        adminRestSession.put(
-            "/projects/" + project.get() + "/ban/",
-            BanCommit.Input.fromCommits("a8a477efffbbf3b44169bb9a1d3a334cbbd9aa96"));
-    r.assertOK();
-    BanResultInfo info = newGson().fromJson(r.getReader(), BanResultInfo.class);
-    assertThat(Iterables.getOnlyElement(info.alreadyBanned))
-        .isEqualTo("a8a477efffbbf3b44169bb9a1d3a334cbbd9aa96");
-    assertThat(info.newlyBanned).isNull();
-    assertThat(info.ignored).isNull();
-  }
-
-  @Test
-  public void banCommit_Forbidden() throws Exception {
-    userRestSession
-        .put(
-            "/projects/" + project.get() + "/ban/",
-            BanCommit.Input.fromCommits("a8a477efffbbf3b44169bb9a1d3a334cbbd9aa96"))
-        .assertForbidden();
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateBranchIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateBranchIT.java
deleted file mode 100644
index 1b9a34a..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateBranchIT.java
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.acceptance.rest.project;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.projects.BranchApi;
-import com.google.gerrit.extensions.api.projects.BranchInfo;
-import com.google.gerrit.extensions.api.projects.BranchInput;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Branch;
-import org.eclipse.jgit.lib.Constants;
-import org.junit.Before;
-import org.junit.Test;
-
-@NoHttpd
-public class CreateBranchIT extends AbstractDaemonTest {
-  private Branch.NameKey branch;
-
-  @Before
-  public void setUp() throws Exception {
-    branch = new Branch.NameKey(project, "test");
-  }
-
-  @Test
-  public void createBranch_Forbidden() throws Exception {
-    setApiUser(user);
-    assertCreateFails(AuthException.class, "create not permitted for refs/heads/test");
-  }
-
-  @Test
-  public void createBranchByAdmin() throws Exception {
-    assertCreateSucceeds();
-  }
-
-  @Test
-  public void branchAlreadyExists_Conflict() throws Exception {
-    assertCreateSucceeds();
-    assertCreateFails(ResourceConflictException.class);
-  }
-
-  @Test
-  public void createBranchByProjectOwner() throws Exception {
-    grantOwner();
-    setApiUser(user);
-    assertCreateSucceeds();
-  }
-
-  @Test
-  public void createBranchByAdminCreateReferenceBlocked_Forbidden() throws Exception {
-    blockCreateReference();
-    assertCreateFails(AuthException.class, "create not permitted for refs/heads/test");
-  }
-
-  @Test
-  public void createBranchByProjectOwnerCreateReferenceBlocked_Forbidden() throws Exception {
-    grantOwner();
-    blockCreateReference();
-    setApiUser(user);
-    assertCreateFails(AuthException.class, "create not permitted for refs/heads/test");
-  }
-
-  private void blockCreateReference() throws Exception {
-    block("refs/*", Permission.CREATE, ANONYMOUS_USERS);
-  }
-
-  private void grantOwner() throws Exception {
-    allow("refs/*", Permission.OWNER, REGISTERED_USERS);
-  }
-
-  private BranchApi branch() throws Exception {
-    return gApi.projects().name(branch.getParentKey().get()).branch(branch.get());
-  }
-
-  private void assertCreateSucceeds() throws Exception {
-    BranchInfo created = branch().create(new BranchInput()).get();
-    assertThat(created.ref).isEqualTo(Constants.R_HEADS + branch.getShortName());
-  }
-
-  private void assertCreateFails(Class<? extends RestApiException> errType, String errMsg)
-      throws Exception {
-    if (errMsg != null) {
-      exception.expectMessage(errMsg);
-    }
-    exception.expect(errType);
-    branch().create(new BranchInput());
-  }
-
-  private void assertCreateFails(Class<? extends RestApiException> errType) throws Exception {
-    assertCreateFails(errType, null);
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java
deleted file mode 100644
index 0409fbc..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java
+++ /dev/null
@@ -1,329 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.acceptance.rest.project;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth.assertWithMessage;
-import static com.google.gerrit.acceptance.rest.project.ProjectAssert.assertProjectInfo;
-import static com.google.gerrit.acceptance.rest.project.ProjectAssert.assertProjectOwners;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-import com.google.common.net.HttpHeaders;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.RestResponse;
-import com.google.gerrit.acceptance.UseLocalDisk;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.extensions.api.projects.ProjectInput;
-import com.google.gerrit.extensions.client.InheritableBoolean;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.extensions.common.ProjectInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.extensions.restapi.Url;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.group.SystemGroupBackend;
-import com.google.gerrit.server.project.ProjectState;
-import java.util.Collections;
-import java.util.Set;
-import org.apache.http.HttpStatus;
-import org.apache.http.message.BasicHeader;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.treewalk.TreeWalk;
-import org.junit.Test;
-
-public class CreateProjectIT extends AbstractDaemonTest {
-  @Test
-  public void createProjectHttp() throws Exception {
-    String newProjectName = name("newProject");
-    RestResponse r = adminRestSession.put("/projects/" + newProjectName);
-    r.assertCreated();
-    ProjectInfo p = newGson().fromJson(r.getReader(), ProjectInfo.class);
-    assertThat(p.name).isEqualTo(newProjectName);
-
-    // Check that we populate the label data in the HTTP path. See GetProjectIT#getProject
-    // for more extensive coverage of the LabelTypeInfo.
-    assertThat(p.labels).hasSize(1);
-
-    ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
-    assertThat(projectState).isNotNull();
-    assertProjectInfo(projectState.getProject(), p);
-    assertHead(newProjectName, "refs/heads/master");
-  }
-
-  @Test
-  public void createProjectHttpWhenProjectAlreadyExists_Conflict() throws Exception {
-    adminRestSession.put("/projects/" + allProjects.get()).assertConflict();
-  }
-
-  @Test
-  public void createProjectHttpWhenProjectAlreadyExists_PreconditionFailed() throws Exception {
-    adminRestSession
-        .putWithHeader(
-            "/projects/" + allProjects.get(), new BasicHeader(HttpHeaders.IF_NONE_MATCH, "*"))
-        .assertPreconditionFailed();
-  }
-
-  @Test
-  @UseLocalDisk
-  public void createProjectHttpWithUnreasonableName_BadRequest() throws Exception {
-    ImmutableList<String> forbiddenStrings =
-        ImmutableList.of(
-            "/../", "/./", "//", ".git/", "?", "%", "*", ":", "<", ">", "|", "$", "/+", "~");
-    for (String s : forbiddenStrings) {
-      String projectName = name("invalid" + s + "name");
-      assertWithMessage("Expected status code for " + projectName + " to be 400.")
-          .that(adminRestSession.put("/projects/" + Url.encode(projectName)).getStatusCode())
-          .isEqualTo(HttpStatus.SC_BAD_REQUEST);
-    }
-  }
-
-  @Test
-  public void createProjectHttpWithNameMismatch_BadRequest() throws Exception {
-    ProjectInput in = new ProjectInput();
-    in.name = name("otherName");
-    adminRestSession.put("/projects/" + name("someName"), in).assertBadRequest();
-  }
-
-  @Test
-  public void createProjectHttpWithInvalidRefName_BadRequest() throws Exception {
-    ProjectInput in = new ProjectInput();
-    in.branches = Collections.singletonList(name("invalid ref name"));
-    adminRestSession.put("/projects/" + name("newProject"), in).assertBadRequest();
-  }
-
-  @Test
-  public void createProject() throws Exception {
-    String newProjectName = name("newProject");
-    ProjectInfo p = gApi.projects().create(newProjectName).get();
-    assertThat(p.name).isEqualTo(newProjectName);
-    ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
-    assertThat(projectState).isNotNull();
-    assertProjectInfo(projectState.getProject(), p);
-    assertHead(newProjectName, "refs/heads/master");
-  }
-
-  @Test
-  public void createProjectWithGitSuffix() throws Exception {
-    String newProjectName = name("newProject");
-    ProjectInfo p = gApi.projects().create(newProjectName + ".git").get();
-    assertThat(p.name).isEqualTo(newProjectName);
-    ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
-    assertThat(projectState).isNotNull();
-    assertProjectInfo(projectState.getProject(), p);
-    assertHead(newProjectName, "refs/heads/master");
-  }
-
-  @Test
-  public void createProjectWithProperties() throws Exception {
-    String newProjectName = name("newProject");
-    ProjectInput in = new ProjectInput();
-    in.name = newProjectName;
-    in.description = "Test description";
-    in.submitType = SubmitType.CHERRY_PICK;
-    in.useContributorAgreements = InheritableBoolean.TRUE;
-    in.useSignedOffBy = InheritableBoolean.TRUE;
-    in.useContentMerge = InheritableBoolean.TRUE;
-    in.requireChangeId = InheritableBoolean.TRUE;
-    ProjectInfo p = gApi.projects().create(in).get();
-    assertThat(p.name).isEqualTo(newProjectName);
-    Project project = projectCache.get(new Project.NameKey(newProjectName)).getProject();
-    assertProjectInfo(project, p);
-    assertThat(project.getDescription()).isEqualTo(in.description);
-    assertThat(project.getSubmitType()).isEqualTo(in.submitType);
-    assertThat(project.getUseContributorAgreements()).isEqualTo(in.useContributorAgreements);
-    assertThat(project.getUseSignedOffBy()).isEqualTo(in.useSignedOffBy);
-    assertThat(project.getUseContentMerge()).isEqualTo(in.useContentMerge);
-    assertThat(project.getRequireChangeID()).isEqualTo(in.requireChangeId);
-  }
-
-  @Test
-  public void createChildProject() throws Exception {
-    String parentName = name("parent");
-    ProjectInput in = new ProjectInput();
-    in.name = parentName;
-    gApi.projects().create(in);
-
-    String childName = name("child");
-    in = new ProjectInput();
-    in.name = childName;
-    in.parent = parentName;
-    gApi.projects().create(in);
-    Project project = projectCache.get(new Project.NameKey(childName)).getProject();
-    assertThat(project.getParentName()).isEqualTo(in.parent);
-  }
-
-  @Test
-  public void createChildProjectUnderNonExistingParent_UnprocessableEntity() throws Exception {
-    ProjectInput in = new ProjectInput();
-    in.name = name("newProjectName");
-    in.parent = "non-existing-project";
-    assertCreateFails(in, UnprocessableEntityException.class);
-  }
-
-  @Test
-  public void createProjectWithOwner() throws Exception {
-    String newProjectName = name("newProject");
-    ProjectInput in = new ProjectInput();
-    in.name = newProjectName;
-    in.owners = Lists.newArrayListWithCapacity(3);
-    in.owners.add("Anonymous Users"); // by name
-    in.owners.add(SystemGroupBackend.REGISTERED_USERS.get()); // by UUID
-    in.owners.add(
-        Integer.toString(
-            groupCache
-                .get(new AccountGroup.NameKey("Administrators"))
-                .orElse(null)
-                .getId()
-                .get())); // by ID
-    gApi.projects().create(in);
-    ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
-    Set<AccountGroup.UUID> expectedOwnerIds = Sets.newHashSetWithExpectedSize(3);
-    expectedOwnerIds.add(SystemGroupBackend.ANONYMOUS_USERS);
-    expectedOwnerIds.add(SystemGroupBackend.REGISTERED_USERS);
-    expectedOwnerIds.add(groupUuid("Administrators"));
-    assertProjectOwners(expectedOwnerIds, projectState);
-  }
-
-  @Test
-  public void createProjectWithNonExistingOwner_UnprocessableEntity() throws Exception {
-    ProjectInput in = new ProjectInput();
-    in.name = name("newProjectName");
-    in.owners = Collections.singletonList("non-existing-group");
-    assertCreateFails(in, UnprocessableEntityException.class);
-  }
-
-  @Test
-  public void createPermissionOnlyProject() throws Exception {
-    String newProjectName = name("newProject");
-    ProjectInput in = new ProjectInput();
-    in.name = newProjectName;
-    in.permissionsOnly = true;
-    gApi.projects().create(in);
-    assertHead(newProjectName, RefNames.REFS_CONFIG);
-  }
-
-  @Test
-  public void createProjectWithEmptyCommit() throws Exception {
-    String newProjectName = name("newProject");
-    ProjectInput in = new ProjectInput();
-    in.name = newProjectName;
-    in.createEmptyCommit = true;
-    gApi.projects().create(in);
-    assertEmptyCommit(newProjectName, "refs/heads/master");
-  }
-
-  @Test
-  public void createProjectWithBranches() throws Exception {
-    String newProjectName = name("newProject");
-    ProjectInput in = new ProjectInput();
-    in.name = newProjectName;
-    in.createEmptyCommit = true;
-    in.branches = Lists.newArrayListWithCapacity(3);
-    in.branches.add("refs/heads/test");
-    in.branches.add("refs/heads/master");
-    in.branches.add("release"); // without 'refs/heads' prefix
-    gApi.projects().create(in);
-    assertHead(newProjectName, "refs/heads/test");
-    assertEmptyCommit(newProjectName, "refs/heads/test", "refs/heads/master", "refs/heads/release");
-  }
-
-  @Test
-  public void createProjectWithCapability() throws Exception {
-    allowGlobalCapabilities(SystemGroupBackend.REGISTERED_USERS, GlobalCapability.CREATE_PROJECT);
-    try {
-      setApiUser(user);
-      ProjectInput in = new ProjectInput();
-      in.name = name("newProject");
-      ProjectInfo p = gApi.projects().create(in).get();
-      assertThat(p.name).isEqualTo(in.name);
-    } finally {
-      removeGlobalCapabilities(
-          SystemGroupBackend.REGISTERED_USERS, GlobalCapability.CREATE_PROJECT);
-    }
-  }
-
-  @Test
-  public void createProjectWithoutCapability_Forbidden() throws Exception {
-    setApiUser(user);
-    ProjectInput in = new ProjectInput();
-    in.name = name("newProject");
-    assertCreateFails(in, AuthException.class);
-  }
-
-  @Test
-  public void createProjectWhenProjectAlreadyExists_Conflict() throws Exception {
-    ProjectInput in = new ProjectInput();
-    in.name = allProjects.get();
-    assertCreateFails(in, ResourceConflictException.class);
-  }
-
-  @Test
-  public void createProjectWithCreateProjectCapabilityAndParentNotVisible() throws Exception {
-    Project parent = projectCache.get(allProjects).getProject();
-    parent.setState(com.google.gerrit.extensions.client.ProjectState.HIDDEN);
-    allowGlobalCapabilities(SystemGroupBackend.REGISTERED_USERS, GlobalCapability.CREATE_PROJECT);
-    try {
-      setApiUser(user);
-      ProjectInput in = new ProjectInput();
-      in.name = name("newProject");
-      ProjectInfo p = gApi.projects().create(in).get();
-      assertThat(p.name).isEqualTo(in.name);
-    } finally {
-      parent.setState(com.google.gerrit.extensions.client.ProjectState.ACTIVE);
-      removeGlobalCapabilities(
-          SystemGroupBackend.REGISTERED_USERS, GlobalCapability.CREATE_PROJECT);
-    }
-  }
-
-  private AccountGroup.UUID groupUuid(String groupName) {
-    return groupCache.get(new AccountGroup.NameKey(groupName)).orElse(null).getGroupUUID();
-  }
-
-  private void assertHead(String projectName, String expectedRef) throws Exception {
-    try (Repository repo = repoManager.openRepository(new Project.NameKey(projectName))) {
-      assertThat(repo.exactRef(Constants.HEAD).getTarget().getName()).isEqualTo(expectedRef);
-    }
-  }
-
-  private void assertEmptyCommit(String projectName, String... refs) throws Exception {
-    Project.NameKey projectKey = new Project.NameKey(projectName);
-    try (Repository repo = repoManager.openRepository(projectKey);
-        RevWalk rw = new RevWalk(repo);
-        TreeWalk tw = new TreeWalk(rw.getObjectReader())) {
-      for (String ref : refs) {
-        RevCommit commit = rw.lookupCommit(repo.exactRef(ref).getObjectId());
-        rw.parseBody(commit);
-        tw.addTree(commit.getTree());
-        assertThat(tw.next()).isFalse();
-        tw.reset();
-      }
-    }
-  }
-
-  private void assertCreateFails(ProjectInput in, Class<? extends RestApiException> errType)
-      throws Exception {
-    exception.expect(errType);
-    gApi.projects().create(in);
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/DeleteBranchIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/DeleteBranchIT.java
deleted file mode 100644
index ce30cd5..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/DeleteBranchIT.java
+++ /dev/null
@@ -1,176 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.acceptance.rest.project;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-import static org.eclipse.jgit.lib.Constants.R_HEADS;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.RestResponse;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.projects.BranchApi;
-import com.google.gerrit.extensions.api.projects.BranchInput;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.RefNames;
-import org.junit.Before;
-import org.junit.Test;
-
-public class DeleteBranchIT extends AbstractDaemonTest {
-
-  private Branch.NameKey testBranch;
-
-  @Before
-  public void setUp() throws Exception {
-    project = createProject(name("p"));
-    testBranch = new Branch.NameKey(project, "test");
-    branch(testBranch).create(new BranchInput());
-  }
-
-  @Test
-  public void deleteBranch_Forbidden() throws Exception {
-    setApiUser(user);
-    assertDeleteForbidden(testBranch);
-  }
-
-  @Test
-  public void deleteBranchByAdmin() throws Exception {
-    assertDeleteSucceeds(testBranch);
-  }
-
-  @Test
-  public void deleteBranchByProjectOwner() throws Exception {
-    grantOwner();
-    setApiUser(user);
-    assertDeleteSucceeds(testBranch);
-  }
-
-  @Test
-  public void deleteBranchByAdminForcePushBlocked() throws Exception {
-    blockForcePush();
-    assertDeleteSucceeds(testBranch);
-  }
-
-  @Test
-  public void deleteBranchByProjectOwnerForcePushBlocked_Forbidden() throws Exception {
-    grantOwner();
-    blockForcePush();
-    setApiUser(user);
-    assertDeleteForbidden(testBranch);
-  }
-
-  @Test
-  public void deleteBranchByUserWithForcePushPermission() throws Exception {
-    grantForcePush();
-    setApiUser(user);
-    assertDeleteSucceeds(testBranch);
-  }
-
-  @Test
-  public void deleteBranchByUserWithDeletePermission() throws Exception {
-    grantDelete();
-    setApiUser(user);
-    assertDeleteSucceeds(testBranch);
-  }
-
-  @Test
-  public void deleteBranchByRestWithoutRefsHeadsPrefix() throws Exception {
-    grantDelete();
-    String ref = testBranch.getShortName();
-    assertThat(ref).doesNotMatch(R_HEADS);
-    assertDeleteByRestSucceeds(testBranch, ref);
-  }
-
-  @Test
-  public void deleteBranchByRestWithFullName() throws Exception {
-    grantDelete();
-    assertDeleteByRestSucceeds(testBranch, testBranch.get());
-  }
-
-  @Test
-  public void deleteBranchByRestFailsWithUnencodedFullName() throws Exception {
-    grantDelete();
-    RestResponse r =
-        userRestSession.delete("/projects/" + project.get() + "/branches/" + testBranch.get());
-    r.assertNotFound();
-    branch(testBranch).get();
-  }
-
-  @Test
-  public void deleteMetaBranch() throws Exception {
-    String metaRef = RefNames.REFS_META + "foo";
-    allow(metaRef, Permission.CREATE, REGISTERED_USERS);
-    allow(metaRef, Permission.PUSH, REGISTERED_USERS);
-
-    Branch.NameKey metaBranch = new Branch.NameKey(project, metaRef);
-    branch(metaBranch).create(new BranchInput());
-
-    grantDelete();
-    assertDeleteByRestSucceeds(metaBranch, metaRef);
-  }
-
-  private void blockForcePush() throws Exception {
-    block("refs/heads/*", Permission.PUSH, ANONYMOUS_USERS).setForce(true);
-  }
-
-  private void grantForcePush() throws Exception {
-    grant(project, "refs/heads/*", Permission.PUSH, true, ANONYMOUS_USERS);
-  }
-
-  private void grantDelete() throws Exception {
-    allow("refs/*", Permission.DELETE, ANONYMOUS_USERS);
-  }
-
-  private void grantOwner() throws Exception {
-    allow("refs/*", Permission.OWNER, REGISTERED_USERS);
-  }
-
-  private BranchApi branch(Branch.NameKey branch) throws Exception {
-    return gApi.projects().name(branch.getParentKey().get()).branch(branch.get());
-  }
-
-  private void assertDeleteByRestSucceeds(Branch.NameKey branch, String ref) throws Exception {
-    RestResponse r =
-        userRestSession.delete(
-            "/projects/"
-                + IdString.fromDecoded(project.get()).encoded()
-                + "/branches/"
-                + IdString.fromDecoded(ref).encoded());
-    r.assertNoContent();
-    exception.expect(ResourceNotFoundException.class);
-    branch(branch).get();
-  }
-
-  private void assertDeleteSucceeds(Branch.NameKey branch) throws Exception {
-    assertThat(branch(branch).get().canDelete).isTrue();
-    String branchRev = branch(branch).get().revision;
-    branch(branch).delete();
-    eventRecorder.assertRefUpdatedEvents(
-        project.get(), branch.get(), null, branchRev, branchRev, null);
-    exception.expect(ResourceNotFoundException.class);
-    branch(branch).get();
-  }
-
-  private void assertDeleteForbidden(Branch.NameKey branch) throws Exception {
-    assertThat(branch(branch).get().canDelete).isNull();
-    exception.expect(AuthException.class);
-    exception.expectMessage("delete not permitted");
-    branch(branch).delete();
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/DeleteBranchesIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/DeleteBranchesIT.java
deleted file mode 100644
index c61e8fa..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/DeleteBranchesIT.java
+++ /dev/null
@@ -1,214 +0,0 @@
-// 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.
-
-package com.google.gerrit.acceptance.rest.project;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-import static java.util.stream.Collectors.toList;
-import static org.eclipse.jgit.lib.Constants.R_HEADS;
-import static org.eclipse.jgit.lib.Constants.R_REFS;
-import static org.junit.Assert.fail;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.projects.BranchInput;
-import com.google.gerrit.extensions.api.projects.DeleteBranchesInput;
-import com.google.gerrit.extensions.api.projects.ProjectApi;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.reviewdb.client.RefNames;
-import java.util.HashMap;
-import java.util.List;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.junit.Before;
-import org.junit.Test;
-
-@NoHttpd
-public class DeleteBranchesIT extends AbstractDaemonTest {
-  private static final ImmutableList<String> BRANCHES =
-      ImmutableList.of("refs/heads/test-1", "refs/heads/test-2", "test-3", "refs/meta/foo");
-
-  @Before
-  public void setUp() throws Exception {
-    allow("refs/*", Permission.CREATE, REGISTERED_USERS);
-    allow("refs/*", Permission.PUSH, REGISTERED_USERS);
-    for (String name : BRANCHES) {
-      project().branch(name).create(new BranchInput());
-    }
-    assertBranches(BRANCHES);
-  }
-
-  @Test
-  public void deleteBranches() throws Exception {
-    HashMap<String, RevCommit> initialRevisions = initialRevisions(BRANCHES);
-    DeleteBranchesInput input = new DeleteBranchesInput();
-    input.branches = BRANCHES;
-    project().deleteBranches(input);
-    assertBranchesDeleted(BRANCHES);
-    assertRefUpdatedEvents(initialRevisions);
-  }
-
-  @Test
-  public void deleteOneBranchWithoutPermissionForbidden() throws Exception {
-    ImmutableList<String> branchToDelete = ImmutableList.of("refs/heads/test-1");
-
-    DeleteBranchesInput input = new DeleteBranchesInput();
-    input.branches = branchToDelete;
-    setApiUser(user);
-    try {
-      project().deleteBranches(input);
-      fail("Expected AuthException");
-    } catch (AuthException e) {
-      assertThat(e).hasMessageThat().isEqualTo("delete not permitted for refs/heads/test-1");
-    }
-    setApiUser(admin);
-    assertBranches(BRANCHES);
-  }
-
-  @Test
-  public void deleteMultiBranchesWithoutPermissionForbidden() throws Exception {
-    DeleteBranchesInput input = new DeleteBranchesInput();
-    input.branches = BRANCHES;
-    setApiUser(user);
-    try {
-      project().deleteBranches(input);
-      fail("Expected ResourceConflictException");
-    } catch (ResourceConflictException e) {
-      assertThat(e).hasMessageThat().isEqualTo(errorMessageForBranches(BRANCHES));
-    }
-    setApiUser(admin);
-    assertBranches(BRANCHES);
-  }
-
-  @Test
-  public void deleteBranchesNotFound() throws Exception {
-    DeleteBranchesInput input = new DeleteBranchesInput();
-    List<String> branches = Lists.newArrayList(BRANCHES);
-    branches.add("refs/heads/does-not-exist");
-    input.branches = branches;
-    try {
-      project().deleteBranches(input);
-      fail("Expected ResourceConflictException");
-    } catch (ResourceConflictException e) {
-      assertThat(e)
-          .hasMessageThat()
-          .isEqualTo(errorMessageForBranches(ImmutableList.of("refs/heads/does-not-exist")));
-    }
-    assertBranchesDeleted(BRANCHES);
-  }
-
-  @Test
-  public void deleteBranchesNotFoundContinue() throws Exception {
-    // If it fails on the first branch in the input, it should still
-    // continue to process the remaining branches.
-    DeleteBranchesInput input = new DeleteBranchesInput();
-    List<String> branches = Lists.newArrayList("refs/heads/does-not-exist");
-    branches.addAll(BRANCHES);
-    input.branches = branches;
-    try {
-      project().deleteBranches(input);
-      fail("Expected ResourceConflictException");
-    } catch (ResourceConflictException e) {
-      assertThat(e)
-          .hasMessageThat()
-          .isEqualTo(errorMessageForBranches(ImmutableList.of("refs/heads/does-not-exist")));
-    }
-    assertBranchesDeleted(BRANCHES);
-  }
-
-  @Test
-  public void missingInput() throws Exception {
-    DeleteBranchesInput input = null;
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("branches must be specified");
-    project().deleteBranches(input);
-  }
-
-  @Test
-  public void missingBranchList() throws Exception {
-    DeleteBranchesInput input = new DeleteBranchesInput();
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("branches must be specified");
-    project().deleteBranches(input);
-  }
-
-  @Test
-  public void emptyBranchList() throws Exception {
-    DeleteBranchesInput input = new DeleteBranchesInput();
-    input.branches = Lists.newArrayList();
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("branches must be specified");
-    project().deleteBranches(input);
-  }
-
-  private String errorMessageForBranches(List<String> branches) {
-    StringBuilder message = new StringBuilder();
-    for (String branch : branches) {
-      message
-          .append("Cannot delete ")
-          .append(prefixRef(branch))
-          .append(": it doesn't exist or you do not have permission ")
-          .append("to delete it\n");
-    }
-    return message.toString();
-  }
-
-  private HashMap<String, RevCommit> initialRevisions(List<String> branches) throws Exception {
-    HashMap<String, RevCommit> result = new HashMap<>();
-    for (String branch : branches) {
-      result.put(branch, getRemoteHead(project, branch));
-    }
-    return result;
-  }
-
-  private void assertRefUpdatedEvents(HashMap<String, RevCommit> revisions) throws Exception {
-    for (String branch : revisions.keySet()) {
-      RevCommit revision = revisions.get(branch);
-      eventRecorder.assertRefUpdatedEvents(
-          project.get(), prefixRef(branch), null, revision, revision, null);
-    }
-  }
-
-  private String prefixRef(String ref) {
-    return ref.startsWith(R_REFS) ? ref : R_HEADS + ref;
-  }
-
-  private ProjectApi project() throws Exception {
-    return gApi.projects().name(project.get());
-  }
-
-  private void assertBranches(List<String> branches) throws Exception {
-    List<String> expected = Lists.newArrayList("HEAD", RefNames.REFS_CONFIG, "refs/heads/master");
-    expected.addAll(branches.stream().map(b -> prefixRef(b)).collect(toList()));
-    try (Repository repo = repoManager.openRepository(project)) {
-      for (String branch : expected) {
-        assertThat(repo.exactRef(branch)).isNotNull();
-      }
-    }
-  }
-
-  private void assertBranchesDeleted(List<String> branches) throws Exception {
-    try (Repository repo = repoManager.openRepository(project)) {
-      for (String branch : branches) {
-        assertThat(repo.exactRef(branch)).isNull();
-      }
-    }
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/DeleteTagIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/DeleteTagIT.java
deleted file mode 100644
index 0cbbe44..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/DeleteTagIT.java
+++ /dev/null
@@ -1,131 +0,0 @@
-// 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.
-
-package com.google.gerrit.acceptance.rest.project;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-import static org.eclipse.jgit.lib.Constants.R_TAGS;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.RestResponse;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.projects.TagApi;
-import com.google.gerrit.extensions.api.projects.TagInfo;
-import com.google.gerrit.extensions.api.projects.TagInput;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import org.junit.Before;
-import org.junit.Test;
-
-public class DeleteTagIT extends AbstractDaemonTest {
-  private static final String TAG = "refs/tags/test";
-
-  @Before
-  public void setUp() throws Exception {
-    tag().create(new TagInput());
-  }
-
-  @Test
-  public void deleteTag_Forbidden() throws Exception {
-    setApiUser(user);
-    assertDeleteForbidden();
-  }
-
-  @Test
-  public void deleteTagByAdmin() throws Exception {
-    assertDeleteSucceeds();
-  }
-
-  @Test
-  public void deleteTagByProjectOwner() throws Exception {
-    grantOwner();
-    setApiUser(user);
-    assertDeleteSucceeds();
-  }
-
-  @Test
-  public void deleteTagByAdminForcePushBlocked() throws Exception {
-    blockForcePush();
-    assertDeleteSucceeds();
-  }
-
-  @Test
-  public void deleteTagByProjectOwnerForcePushBlocked_Forbidden() throws Exception {
-    grantOwner();
-    blockForcePush();
-    setApiUser(user);
-    assertDeleteForbidden();
-  }
-
-  @Test
-  public void deleteTagByUserWithForcePushPermission() throws Exception {
-    grantForcePush();
-    setApiUser(user);
-    assertDeleteSucceeds();
-  }
-
-  @Test
-  public void deleteTagByUserWithDeletePermission() throws Exception {
-    grantDelete();
-    setApiUser(user);
-    assertDeleteSucceeds();
-  }
-
-  @Test
-  public void deleteTagByRestWithoutRefsTagsPrefix() throws Exception {
-    grantDelete();
-    String ref = TAG.substring(R_TAGS.length());
-    RestResponse r = userRestSession.delete("/projects/" + project.get() + "/tags/" + ref);
-    r.assertNoContent();
-  }
-
-  private void blockForcePush() throws Exception {
-    block("refs/tags/*", Permission.PUSH, ANONYMOUS_USERS).setForce(true);
-  }
-
-  private void grantForcePush() throws Exception {
-    grant(project, "refs/tags/*", Permission.PUSH, true, ANONYMOUS_USERS);
-  }
-
-  private void grantDelete() throws Exception {
-    allow("refs/tags/*", Permission.DELETE, ANONYMOUS_USERS);
-  }
-
-  private void grantOwner() throws Exception {
-    allow("refs/tags/*", Permission.OWNER, REGISTERED_USERS);
-  }
-
-  private TagApi tag() throws Exception {
-    return gApi.projects().name(project.get()).tag(TAG);
-  }
-
-  private void assertDeleteSucceeds() throws Exception {
-    TagInfo tagInfo = tag().get();
-    assertThat(tagInfo.canDelete).isTrue();
-    String tagRev = tagInfo.revision;
-    tag().delete();
-    eventRecorder.assertRefUpdatedEvents(project.get(), TAG, null, tagRev, tagRev, null);
-    exception.expect(ResourceNotFoundException.class);
-    tag().get();
-  }
-
-  private void assertDeleteForbidden() throws Exception {
-    assertThat(tag().get().canDelete).isNull();
-    exception.expect(AuthException.class);
-    exception.expectMessage("delete not permitted");
-    tag().delete();
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/DeleteTagsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/DeleteTagsIT.java
deleted file mode 100644
index 8f24609..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/DeleteTagsIT.java
+++ /dev/null
@@ -1,160 +0,0 @@
-// 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.
-
-package com.google.gerrit.acceptance.rest.project;
-
-import static com.google.common.truth.Truth.assertThat;
-import static java.util.stream.Collectors.toList;
-import static org.eclipse.jgit.lib.Constants.R_TAGS;
-import static org.junit.Assert.fail;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.extensions.api.projects.DeleteTagsInput;
-import com.google.gerrit.extensions.api.projects.ProjectApi;
-import com.google.gerrit.extensions.api.projects.TagInfo;
-import com.google.gerrit.extensions.api.projects.TagInput;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import java.util.HashMap;
-import java.util.List;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.junit.Before;
-import org.junit.Test;
-
-@NoHttpd
-public class DeleteTagsIT extends AbstractDaemonTest {
-  private static final ImmutableList<String> TAGS =
-      ImmutableList.of("refs/tags/test-1", "refs/tags/test-2", "refs/tags/test-3", "test-4");
-
-  @Before
-  public void setUp() throws Exception {
-    for (String name : TAGS) {
-      project().tag(name).create(new TagInput());
-    }
-    assertTags(TAGS);
-  }
-
-  @Test
-  public void deleteTags() throws Exception {
-    HashMap<String, RevCommit> initialRevisions = initialRevisions(TAGS);
-    DeleteTagsInput input = new DeleteTagsInput();
-    input.tags = TAGS;
-    project().deleteTags(input);
-    assertTagsDeleted();
-    assertRefUpdatedEvents(initialRevisions);
-  }
-
-  @Test
-  public void deleteTagsForbidden() throws Exception {
-    DeleteTagsInput input = new DeleteTagsInput();
-    input.tags = TAGS;
-    setApiUser(user);
-    try {
-      project().deleteTags(input);
-      fail("Expected ResourceConflictException");
-    } catch (ResourceConflictException e) {
-      assertThat(e).hasMessageThat().isEqualTo(errorMessageForTags(TAGS));
-    }
-    setApiUser(admin);
-    assertTags(TAGS);
-  }
-
-  @Test
-  public void deleteTagsNotFound() throws Exception {
-    DeleteTagsInput input = new DeleteTagsInput();
-    List<String> tags = Lists.newArrayList(TAGS);
-    tags.add("refs/tags/does-not-exist");
-    input.tags = tags;
-    try {
-      project().deleteTags(input);
-      fail("Expected ResourceConflictException");
-    } catch (ResourceConflictException e) {
-      assertThat(e)
-          .hasMessageThat()
-          .isEqualTo(errorMessageForTags(ImmutableList.of("refs/tags/does-not-exist")));
-    }
-    assertTagsDeleted();
-  }
-
-  @Test
-  public void deleteTagsNotFoundContinue() throws Exception {
-    // If it fails on the first tag in the input, it should still
-    // continue to process the remaining tags.
-    DeleteTagsInput input = new DeleteTagsInput();
-    List<String> tags = Lists.newArrayList("refs/tags/does-not-exist");
-    tags.addAll(TAGS);
-    input.tags = tags;
-    try {
-      project().deleteTags(input);
-      fail("Expected ResourceConflictException");
-    } catch (ResourceConflictException e) {
-      assertThat(e)
-          .hasMessageThat()
-          .isEqualTo(errorMessageForTags(ImmutableList.of("refs/tags/does-not-exist")));
-    }
-    assertTagsDeleted();
-  }
-
-  private String errorMessageForTags(List<String> tags) {
-    StringBuilder message = new StringBuilder();
-    for (String tag : tags) {
-      message
-          .append("Cannot delete ")
-          .append(prefixRef(tag))
-          .append(": it doesn't exist or you do not have permission ")
-          .append("to delete it\n");
-    }
-    return message.toString();
-  }
-
-  private HashMap<String, RevCommit> initialRevisions(List<String> tags) throws Exception {
-    HashMap<String, RevCommit> result = new HashMap<>();
-    for (String tag : tags) {
-      String ref = prefixRef(tag);
-      result.put(ref, getRemoteHead(project, ref));
-    }
-    return result;
-  }
-
-  private void assertRefUpdatedEvents(HashMap<String, RevCommit> revisions) throws Exception {
-    for (String tag : revisions.keySet()) {
-      RevCommit revision = revisions.get(prefixRef(tag));
-      eventRecorder.assertRefUpdatedEvents(
-          project.get(), prefixRef(tag), null, revision, revision, null);
-    }
-  }
-
-  private String prefixRef(String ref) {
-    return ref.startsWith(R_TAGS) ? ref : R_TAGS + ref;
-  }
-
-  private ProjectApi project() throws Exception {
-    return gApi.projects().name(project.get());
-  }
-
-  private void assertTags(List<String> expected) throws Exception {
-    List<TagInfo> actualTags = project().tags().get();
-    Iterable<String> actualNames = Iterables.transform(actualTags, b -> b.ref);
-    assertThat(actualNames)
-        .containsExactlyElementsIn(expected.stream().map(t -> prefixRef(t)).collect(toList()))
-        .inOrder();
-  }
-
-  private void assertTagsDeleted() throws Exception {
-    assertTags(ImmutableList.<String>of());
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetCommitIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetCommitIT.java
deleted file mode 100644
index 76d17f1..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetCommitIT.java
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.acceptance.rest.project;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.common.collect.Iterables;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.GitUtil;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.acceptance.RestResponse;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.common.CommitInfo;
-import com.google.gerrit.server.git.ProjectConfig;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-public class GetCommitIT extends AbstractDaemonTest {
-  private TestRepository<Repository> repo;
-
-  @Before
-  public void setUp() throws Exception {
-    repo = GitUtil.newTestRepository(repoManager.openRepository(project));
-    blockRead("refs/*");
-  }
-
-  @After
-  public void tearDown() throws Exception {
-    if (repo != null) {
-      repo.getRepository().close();
-    }
-  }
-
-  @Test
-  public void getNonExistingCommit_NotFound() throws Exception {
-    assertNotFound(ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
-  }
-
-  @Test
-  public void getMergedCommit_Found() throws Exception {
-    unblockRead();
-    RevCommit commit =
-        repo.parseBody(repo.branch("master").commit().message("Create\n\nNew commit\n").create());
-
-    CommitInfo info = getCommit(commit);
-    assertThat(info.commit).isEqualTo(commit.name());
-    assertThat(info.subject).isEqualTo("Create");
-    assertThat(info.message).isEqualTo("Create\n\nNew commit\n");
-    assertThat(info.author.name).isEqualTo("J. Author");
-    assertThat(info.author.email).isEqualTo("jauthor@example.com");
-    assertThat(info.committer.name).isEqualTo("J. Committer");
-    assertThat(info.committer.email).isEqualTo("jcommitter@example.com");
-
-    CommitInfo parent = Iterables.getOnlyElement(info.parents);
-    assertThat(parent.commit).isEqualTo(commit.getParent(0).name());
-    assertThat(parent.subject).isEqualTo("Initial empty repository");
-    assertThat(parent.message).isNull();
-    assertThat(parent.author).isNull();
-    assertThat(parent.committer).isNull();
-  }
-
-  @Test
-  public void getMergedCommit_NotFound() throws Exception {
-    RevCommit commit =
-        repo.parseBody(repo.branch("master").commit().message("Create\n\nNew commit\n").create());
-    assertNotFound(commit);
-  }
-
-  @Test
-  public void getOpenChange_Found() throws Exception {
-    unblockRead();
-    PushOneCommit.Result r =
-        pushFactory.create(db, admin.getIdent(), testRepo).to("refs/for/master");
-    r.assertOkStatus();
-
-    CommitInfo info = getCommit(r.getCommit());
-    assertThat(info.commit).isEqualTo(r.getCommit().name());
-    assertThat(info.subject).isEqualTo("test commit");
-    assertThat(info.message).isEqualTo("test commit\n\nChange-Id: " + r.getChangeId() + "\n");
-    assertThat(info.author.name).isEqualTo("Administrator");
-    assertThat(info.author.email).isEqualTo("admin@example.com");
-    assertThat(info.committer.name).isEqualTo("Administrator");
-    assertThat(info.committer.email).isEqualTo("admin@example.com");
-
-    CommitInfo parent = Iterables.getOnlyElement(info.parents);
-    assertThat(parent.commit).isEqualTo(r.getCommit().getParent(0).name());
-    assertThat(parent.subject).isEqualTo("Initial empty repository");
-    assertThat(parent.message).isNull();
-    assertThat(parent.author).isNull();
-    assertThat(parent.committer).isNull();
-  }
-
-  @Test
-  public void getOpenChange_NotFound() throws Exception {
-    PushOneCommit.Result r =
-        pushFactory.create(db, admin.getIdent(), testRepo).to("refs/for/master");
-    r.assertOkStatus();
-    assertNotFound(r.getCommit());
-  }
-
-  private void unblockRead() throws Exception {
-    ProjectConfig pc = projectCache.checkedGet(project).getConfig();
-    pc.getAccessSection("refs/*").remove(new Permission(Permission.READ));
-    saveProjectConfig(project, pc);
-  }
-
-  private void assertNotFound(ObjectId id) throws Exception {
-    userRestSession.get("/projects/" + project.get() + "/commits/" + id.name()).assertNotFound();
-  }
-
-  private CommitInfo getCommit(ObjectId id) throws Exception {
-    RestResponse r = userRestSession.get("/projects/" + project.get() + "/commits/" + id.name());
-    r.assertOK();
-    CommitInfo result = newGson().fromJson(r.getReader(), CommitInfo.class);
-    r.consume();
-    return result;
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListBranchesIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListBranchesIT.java
deleted file mode 100644
index b62fd68..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListBranchesIT.java
+++ /dev/null
@@ -1,185 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.acceptance.rest.project;
-
-import static com.google.gerrit.acceptance.rest.project.RefAssert.assertRefNames;
-import static com.google.gerrit.acceptance.rest.project.RefAssert.assertRefs;
-import static org.junit.Assert.fail;
-
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.TestProjectInput;
-import com.google.gerrit.extensions.api.projects.BranchInfo;
-import com.google.gerrit.extensions.api.projects.ProjectApi.ListRefsRequest;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.reviewdb.client.RefNames;
-import org.junit.Test;
-
-@NoHttpd
-public class ListBranchesIT extends AbstractDaemonTest {
-  @Test
-  public void listBranchesOfNonExistingProject_NotFound() throws Exception {
-    exception.expect(ResourceNotFoundException.class);
-    gApi.projects().name("non-existing").branches().get();
-  }
-
-  @Test
-  public void listBranchesOfNonVisibleProject_NotFound() throws Exception {
-    blockRead("refs/*");
-    setApiUser(user);
-    exception.expect(ResourceNotFoundException.class);
-    gApi.projects().name(project.get()).branches().get();
-  }
-
-  @Test
-  @TestProjectInput(createEmptyCommit = false)
-  public void listBranchesOfEmptyProject() throws Exception {
-    assertRefs(
-        ImmutableList.of(branch("HEAD", null, false), branch(RefNames.REFS_CONFIG, null, false)),
-        list().get());
-  }
-
-  @Test
-  public void listBranches() throws Exception {
-    String master = pushTo("refs/heads/master").getCommit().name();
-    String dev = pushTo("refs/heads/dev").getCommit().name();
-    assertRefs(
-        ImmutableList.of(
-            branch("HEAD", "master", false),
-            branch(RefNames.REFS_CONFIG, null, false),
-            branch("refs/heads/dev", dev, true),
-            branch("refs/heads/master", master, false)),
-        list().get());
-  }
-
-  @Test
-  public void listBranchesSomeHidden() throws Exception {
-    blockRead("refs/heads/dev");
-    String master = pushTo("refs/heads/master").getCommit().name();
-    pushTo("refs/heads/dev");
-    setApiUser(user);
-    // refs/meta/config is hidden since user is no project owner
-    assertRefs(
-        ImmutableList.of(
-            branch("HEAD", "master", false), branch("refs/heads/master", master, false)),
-        list().get());
-  }
-
-  @Test
-  public void listBranchesHeadHidden() throws Exception {
-    blockRead("refs/heads/master");
-    pushTo("refs/heads/master");
-    String dev = pushTo("refs/heads/dev").getCommit().name();
-    setApiUser(user);
-    // refs/meta/config is hidden since user is no project owner
-    assertRefs(ImmutableList.of(branch("refs/heads/dev", dev, false)), list().get());
-  }
-
-  @Test
-  public void listBranchesUsingPagination() throws Exception {
-    pushTo("refs/heads/master");
-    pushTo("refs/heads/someBranch1");
-    pushTo("refs/heads/someBranch2");
-    pushTo("refs/heads/someBranch3");
-
-    // Using only limit.
-    assertRefNames(
-        ImmutableList.of(
-            "HEAD", RefNames.REFS_CONFIG, "refs/heads/master", "refs/heads/someBranch1"),
-        list().withLimit(4).get());
-
-    // Limit higher than total number of branches.
-    assertRefNames(
-        ImmutableList.of(
-            "HEAD",
-            RefNames.REFS_CONFIG,
-            "refs/heads/master",
-            "refs/heads/someBranch1",
-            "refs/heads/someBranch2",
-            "refs/heads/someBranch3"),
-        list().withLimit(25).get());
-
-    // Using start only.
-    assertRefNames(
-        ImmutableList.of(
-            "refs/heads/master",
-            "refs/heads/someBranch1",
-            "refs/heads/someBranch2",
-            "refs/heads/someBranch3"),
-        list().withStart(2).get());
-
-    // Skip more branches than the number of available branches.
-    assertRefNames(ImmutableList.<String>of(), list().withStart(7).get());
-
-    // Ssing start and limit.
-    assertRefNames(
-        ImmutableList.of("refs/heads/master", "refs/heads/someBranch1"),
-        list().withStart(2).withLimit(2).get());
-  }
-
-  @Test
-  public void listBranchesUsingFilter() throws Exception {
-    pushTo("refs/heads/master");
-    pushTo("refs/heads/someBranch1");
-    pushTo("refs/heads/someBranch2");
-    pushTo("refs/heads/someBranch3");
-
-    // Using substring.
-    assertRefNames(
-        ImmutableList.of(
-            "refs/heads/someBranch1", "refs/heads/someBranch2", "refs/heads/someBranch3"),
-        list().withSubstring("some").get());
-
-    assertRefNames(
-        ImmutableList.of(
-            "refs/heads/someBranch1", "refs/heads/someBranch2", "refs/heads/someBranch3"),
-        list().withSubstring("Branch").get());
-
-    assertRefNames(
-        ImmutableList.of(
-            "refs/heads/someBranch1", "refs/heads/someBranch2", "refs/heads/someBranch3"),
-        list().withSubstring("somebranch").get());
-
-    // Using regex.
-    assertRefNames(ImmutableList.of("refs/heads/master"), list().withRegex(".*ast.*r").get());
-    assertRefNames(ImmutableList.of(), list().withRegex(".*AST.*R").get());
-
-    // Conflicting options
-    assertBadRequest(list().withSubstring("somebranch").withRegex(".*ast.*r"));
-  }
-
-  private ListRefsRequest<BranchInfo> list() throws Exception {
-    return gApi.projects().name(project.get()).branches();
-  }
-
-  private static BranchInfo branch(String ref, String revision, boolean canDelete) {
-    BranchInfo info = new BranchInfo();
-    info.ref = ref;
-    info.revision = revision;
-    info.canDelete = canDelete ? true : null;
-    return info;
-  }
-
-  private void assertBadRequest(ListRefsRequest<BranchInfo> req) throws Exception {
-    try {
-      req.get();
-      fail("Expected BadRequestException");
-    } catch (BadRequestException e) {
-      // Expected
-    }
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListChildProjectsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListChildProjectsIT.java
deleted file mode 100644
index dd92a7a..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListChildProjectsIT.java
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.acceptance.rest.project;
-
-import static com.google.gerrit.acceptance.rest.project.ProjectAssert.assertThatNameList;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.reviewdb.client.Project;
-import org.junit.Test;
-
-@NoHttpd
-public class ListChildProjectsIT extends AbstractDaemonTest {
-
-  @Test
-  public void listChildrenOfNonExistingProject_NotFound() throws Exception {
-    exception.expect(ResourceNotFoundException.class);
-    exception.expectMessage("non-existing");
-    gApi.projects().name(name("non-existing")).child("children");
-  }
-
-  @Test
-  public void listNoChildren() throws Exception {
-    assertThatNameList(gApi.projects().name(project.get()).children()).isEmpty();
-  }
-
-  @Test
-  public void listChildren() throws Exception {
-    Project.NameKey child1 = createProject("p1");
-    Project.NameKey child1_1 = createProject("p1.1", child1);
-    Project.NameKey child1_2 = createProject("p1.2", child1);
-
-    assertThatNameList(gApi.projects().name(child1.get()).children())
-        .containsExactly(child1_1, child1_2)
-        .inOrder();
-  }
-
-  @Test
-  public void listChildrenRecursively() throws Exception {
-    Project.NameKey child1 = createProject("p1");
-    createProject("p2");
-    Project.NameKey child1_1 = createProject("p1.1", child1);
-    Project.NameKey child1_2 = createProject("p1.2", child1);
-    Project.NameKey child1_1_1 = createProject("p1.1.1", child1_1);
-    Project.NameKey child1_1_1_1 = createProject("p1.1.1.1", child1_1_1);
-
-    assertThatNameList(gApi.projects().name(child1.get()).children(true))
-        .containsExactly(child1_1, child1_1_1, child1_1_1_1, child1_2)
-        .inOrder();
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListProjectsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListProjectsIT.java
deleted file mode 100644
index a854764..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListProjectsIT.java
+++ /dev/null
@@ -1,273 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.acceptance.rest.project;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.rest.project.ProjectAssert.assertThatNameList;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-import static org.junit.Assert.fail;
-
-import com.google.common.collect.Iterables;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.Sandboxed;
-import com.google.gerrit.acceptance.TestProjectInput;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.projects.ConfigInfo;
-import com.google.gerrit.extensions.api.projects.ConfigInput;
-import com.google.gerrit.extensions.api.projects.Projects.ListRequest;
-import com.google.gerrit.extensions.api.projects.Projects.ListRequest.FilterType;
-import com.google.gerrit.extensions.client.ProjectState;
-import com.google.gerrit.extensions.common.ProjectInfo;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.project.ProjectCacheImpl;
-import com.google.gerrit.server.project.Util;
-import com.google.inject.Inject;
-import java.util.List;
-import java.util.Map;
-import org.junit.Test;
-
-@NoHttpd
-@Sandboxed
-public class ListProjectsIT extends AbstractDaemonTest {
-
-  @Inject private AllUsersName allUsers;
-
-  @Test
-  public void listProjects() throws Exception {
-    Project.NameKey someProject = createProject("some-project");
-    assertThatNameList(filter(gApi.projects().list().get()))
-        .containsExactly(allProjects, allUsers, project, someProject)
-        .inOrder();
-  }
-
-  @Test
-  public void listProjectsFiltersInvisibleProjects() throws Exception {
-    setApiUser(user);
-    assertThatNameList(gApi.projects().list().get()).contains(project);
-
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    Util.block(cfg, Permission.READ, REGISTERED_USERS, "refs/*");
-    saveProjectConfig(project, cfg);
-
-    assertThatNameList(filter(gApi.projects().list().get())).doesNotContain(project);
-  }
-
-  @Test
-  public void listProjectsWithBranch() throws Exception {
-    Map<String, ProjectInfo> result = gApi.projects().list().addShowBranch("master").getAsMap();
-    assertThat(result).containsKey(project.get());
-    ProjectInfo info = result.get(project.get());
-    assertThat(info.branches).isNotNull();
-    assertThat(info.branches).hasSize(1);
-    assertThat(info.branches.get("master")).isNotNull();
-  }
-
-  @Test
-  @TestProjectInput(description = "Description of some-project")
-  public void listProjectWithDescription() throws Exception {
-    // description not be included in the results by default.
-    Map<String, ProjectInfo> result = gApi.projects().list().getAsMap();
-    assertThat(result).containsKey(project.get());
-    assertThat(result.get(project.get()).description).isNull();
-
-    result = gApi.projects().list().withDescription(true).getAsMap();
-    assertThat(result).containsKey(project.get());
-    assertThat(result.get(project.get()).description).isEqualTo("Description of some-project");
-  }
-
-  @Test
-  public void listProjectsWithLimit() throws Exception {
-    ProjectCacheImpl projectCacheImpl = (ProjectCacheImpl) projectCache;
-    for (int i = 0; i < 5; i++) {
-      createProject("someProject" + i);
-    }
-
-    String p = name("");
-    // 5, plus p which was automatically created.
-    int n = 6;
-    projectCacheImpl.evictAllByName();
-    for (int i = 1; i <= n + 2; i++) {
-      assertThatNameList(gApi.projects().list().withPrefix(p).withLimit(i).get())
-          .hasSize(Math.min(i, n));
-      assertThat(projectCacheImpl.sizeAllByName())
-          .isAtMost((long) (i + 2)); // 2 = AllProjects + AllUsers
-    }
-  }
-
-  @Test
-  public void listProjectsWithPrefix() throws Exception {
-    Project.NameKey someProject = createProject("some-project");
-    Project.NameKey someOtherProject = createProject("some-other-project");
-    createProject("project-awesome");
-
-    String p = name("some");
-    assertBadRequest(gApi.projects().list().withPrefix(p).withRegex(".*"));
-    assertBadRequest(gApi.projects().list().withPrefix(p).withSubstring(p));
-    assertThatNameList(filter(gApi.projects().list().withPrefix(p).get()))
-        .containsExactly(someOtherProject, someProject)
-        .inOrder();
-    p = name("SOME");
-    assertThatNameList(filter(gApi.projects().list().withPrefix(p).get())).isEmpty();
-  }
-
-  @Test
-  public void listProjectsWithRegex() throws Exception {
-    Project.NameKey someProject = createProject("some-project");
-    Project.NameKey someOtherProject = createProject("some-other-project");
-    Project.NameKey projectAwesome = createProject("project-awesome");
-
-    assertBadRequest(gApi.projects().list().withRegex("[.*"));
-    assertBadRequest(gApi.projects().list().withRegex(".*").withPrefix("p"));
-    assertBadRequest(gApi.projects().list().withRegex(".*").withSubstring("p"));
-
-    assertThatNameList(filter(gApi.projects().list().withRegex(".*some").get()))
-        .containsExactly(projectAwesome);
-    String r = name("some-project$").replace(".", "\\.");
-    assertThatNameList(filter(gApi.projects().list().withRegex(r).get()))
-        .containsExactly(someProject);
-    assertThatNameList(filter(gApi.projects().list().withRegex(".*").get()))
-        .containsExactly(
-            allProjects, allUsers, project, projectAwesome, someOtherProject, someProject)
-        .inOrder();
-  }
-
-  @Test
-  public void listProjectsWithStart() throws Exception {
-    for (int i = 0; i < 5; i++) {
-      createProject(new Project.NameKey("someProject" + i).get());
-    }
-
-    String p = name("");
-    List<ProjectInfo> all = gApi.projects().list().withPrefix(p).get();
-    // 5, plus p which was automatically created.
-    int n = 6;
-    assertThat(all).hasSize(n);
-    assertThatNameList(gApi.projects().list().withPrefix(p).withStart(n - 1).get())
-        .containsExactly(new Project.NameKey(Iterables.getLast(all).name));
-  }
-
-  @Test
-  public void listProjectsWithSubstring() throws Exception {
-    Project.NameKey someProject = createProject("some-project");
-    Project.NameKey someOtherProject = createProject("some-other-project");
-    Project.NameKey projectAwesome = createProject("project-awesome");
-
-    assertBadRequest(gApi.projects().list().withSubstring("some").withRegex(".*"));
-    assertBadRequest(gApi.projects().list().withSubstring("some").withPrefix("some"));
-    assertThatNameList(filter(gApi.projects().list().withSubstring("some").get()))
-        .containsExactly(projectAwesome, someOtherProject, someProject)
-        .inOrder();
-    assertThatNameList(filter(gApi.projects().list().withSubstring("SOME").get()))
-        .containsExactly(projectAwesome, someOtherProject, someProject)
-        .inOrder();
-  }
-
-  @Test
-  public void listProjectsWithTree() throws Exception {
-    Project.NameKey someParentProject = createProject("some-parent-project");
-    Project.NameKey someChildProject = createProject("some-child-project", someParentProject);
-
-    Map<String, ProjectInfo> result = gApi.projects().list().withTree(true).getAsMap();
-    assertThat(result).containsKey(someChildProject.get());
-    assertThat(result.get(someChildProject.get()).parent).isEqualTo(someParentProject.get());
-  }
-
-  @Test
-  public void listProjectWithType() throws Exception {
-    Map<String, ProjectInfo> result =
-        gApi.projects().list().withType(FilterType.PERMISSIONS).getAsMap();
-    assertThat(result).hasSize(1);
-    assertThat(result).containsKey(allProjects.get());
-
-    assertThatNameList(filter(gApi.projects().list().withType(FilterType.ALL).get()))
-        .containsExactly(allProjects, allUsers, project)
-        .inOrder();
-  }
-
-  @Test
-  public void listParentCandidates() throws Exception {
-    Map<String, ProjectInfo> result =
-        gApi.projects().list().withType(FilterType.PARENT_CANDIDATES).getAsMap();
-    assertThat(result).hasSize(1);
-    assertThat(result).containsKey(allProjects.get());
-
-    // Create a new project with 'project' as parent
-    Project.NameKey testProject = createProject(name("test"), project);
-
-    // Parent candidates are All-Projects and 'project'
-    assertThatNameList(filter(gApi.projects().list().withType(FilterType.PARENT_CANDIDATES).get()))
-        .containsExactly(allProjects, project)
-        .inOrder();
-
-    // All projects are listed
-    assertThatNameList(filter(gApi.projects().list().get()))
-        .containsExactly(allProjects, allUsers, testProject, project)
-        .inOrder();
-  }
-
-  @Test
-  public void listWithHiddenProject() throws Exception {
-    Project.NameKey hidden = createProject("project-to-hide");
-
-    // The project is included because it was not hidden yet
-    assertThatNameList(gApi.projects().list().get())
-        .containsExactly(allProjects, allUsers, project, hidden)
-        .inOrder();
-
-    // Hide the project
-    ConfigInput input = new ConfigInput();
-    input.state = ProjectState.HIDDEN;
-    ConfigInfo info = gApi.projects().name(hidden.get()).config(input);
-    assertThat(info.state).isEqualTo(input.state);
-
-    // Project is still accessible directly
-    gApi.projects().name(hidden.get()).get();
-
-    // But is not included in the list
-    assertThatNameList(gApi.projects().list().get())
-        .containsExactly(allProjects, allUsers, project)
-        .inOrder();
-
-    // ALL filter applies to type, and doesn't include hidden state
-    assertThatNameList(gApi.projects().list().withType(FilterType.ALL).get())
-        .containsExactly(allProjects, allUsers, project)
-        .inOrder();
-  }
-
-  private void assertBadRequest(ListRequest req) throws Exception {
-    try {
-      req.get();
-      fail("Expected BadRequestException");
-    } catch (BadRequestException expected) {
-      // Expected.
-    }
-  }
-
-  private Iterable<ProjectInfo> filter(Iterable<ProjectInfo> infos) {
-    String prefix = name("");
-    return Iterables.filter(
-        infos,
-        p -> {
-          return p.name != null
-              && (p.name.equals(allProjects.get())
-                  || p.name.equals(allUsers.get())
-                  || p.name.startsWith(prefix));
-        });
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/SetParentIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/SetParentIT.java
deleted file mode 100644
index 841e398..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/SetParentIT.java
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.acceptance.rest.project;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.RestResponse;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.config.AllProjectsNameProvider;
-import com.google.gerrit.server.project.SetParent;
-import org.junit.Test;
-
-public class SetParentIT extends AbstractDaemonTest {
-  @Test
-  public void setParent_Forbidden() throws Exception {
-    String parent = createProject("parent", null, true).get();
-    RestResponse r =
-        userRestSession.put("/projects/" + project.get() + "/parent", newParentInput(parent));
-    r.assertForbidden();
-    r.consume();
-  }
-
-  @Test
-  public void setParent() throws Exception {
-    String parent = createProject("parent", null, true).get();
-    RestResponse r =
-        adminRestSession.put("/projects/" + project.get() + "/parent", newParentInput(parent));
-    r.assertOK();
-    r.consume();
-
-    r = adminRestSession.get("/projects/" + project.get() + "/parent");
-    r.assertOK();
-    String newParent = newGson().fromJson(r.getReader(), String.class);
-    assertThat(newParent).isEqualTo(parent);
-    r.consume();
-
-    // When the parent name is not explicitly set, it should be
-    // set to "All-Projects".
-    r = adminRestSession.put("/projects/" + project.get() + "/parent", newParentInput(null));
-    r.assertOK();
-    r.consume();
-
-    r = adminRestSession.get("/projects/" + project.get() + "/parent");
-    r.assertOK();
-    newParent = newGson().fromJson(r.getReader(), String.class);
-    assertThat(newParent).isEqualTo(AllProjectsNameProvider.DEFAULT);
-    r.consume();
-  }
-
-  @Test
-  public void setParentForAllProjects_Conflict() throws Exception {
-    RestResponse r =
-        adminRestSession.put(
-            "/projects/" + allProjects.get() + "/parent", newParentInput(project.get()));
-    r.assertConflict();
-    r.consume();
-  }
-
-  @Test
-  public void setInvalidParent_Conflict() throws Exception {
-    RestResponse r =
-        adminRestSession.put(
-            "/projects/" + project.get() + "/parent", newParentInput(project.get()));
-    r.assertConflict();
-    r.consume();
-
-    Project.NameKey child = createProject("child", project, true);
-    r = adminRestSession.put("/projects/" + project.get() + "/parent", newParentInput(child.get()));
-    r.assertConflict();
-    r.consume();
-
-    String grandchild = createProject("grandchild", child, true).get();
-    r = adminRestSession.put("/projects/" + project.get() + "/parent", newParentInput(grandchild));
-    r.assertConflict();
-    r.consume();
-  }
-
-  @Test
-  public void setNonExistingParent_UnprocessibleEntity() throws Exception {
-    RestResponse r =
-        adminRestSession.put(
-            "/projects/" + project.get() + "/parent", newParentInput("non-existing"));
-    r.assertUnprocessableEntity();
-    r.consume();
-  }
-
-  SetParent.Input newParentInput(String project) {
-    SetParent.Input in = new SetParent.Input();
-    in.parent = project;
-    return in;
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/TagsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/TagsIT.java
deleted file mode 100644
index ed791a2..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/TagsIT.java
+++ /dev/null
@@ -1,363 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.acceptance.rest.project;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-import static org.eclipse.jgit.lib.Constants.R_TAGS;
-import static org.junit.Assert.fail;
-
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.projects.ProjectApi.ListRefsRequest;
-import com.google.gerrit.extensions.api.projects.TagApi;
-import com.google.gerrit.extensions.api.projects.TagInfo;
-import com.google.gerrit.extensions.api.projects.TagInput;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import java.util.List;
-import org.junit.Test;
-
-@NoHttpd
-public class TagsIT extends AbstractDaemonTest {
-  private static final List<String> testTags =
-      ImmutableList.of("tag-A", "tag-B", "tag-C", "tag-D", "tag-E", "tag-F", "tag-G", "tag-H");
-
-  private static final String SIGNED_ANNOTATION =
-      "annotation\n"
-          + "-----BEGIN PGP SIGNATURE-----\n"
-          + "Version: GnuPG v1\n"
-          + "\n"
-          + "iQEcBAABAgAGBQJVeGg5AAoJEPfTicJkUdPkUggH/RKAeI9/i/LduuiqrL/SSdIa\n"
-          + "9tYaSqJKLbXz63M/AW4Sp+4u+dVCQvnAt/a35CVEnpZz6hN4Kn/tiswOWVJf4CO7\n"
-          + "htNubGs5ZMwvD6sLYqKAnrM3WxV/2TbbjzjZW6Jkidz3jz/WRT4SmjGYiEO7aA+V\n"
-          + "4ZdIS9f7sW5VsHHYlNThCA7vH8Uu48bUovFXyQlPTX0pToSgrWV3JnTxDNxfn3iG\n"
-          + "IL0zTY/qwVCdXgFownLcs6J050xrrBWIKqfcWr3u4D2aCLyR0v+S/KArr7ulZygY\n"
-          + "+SOklImn8TAZiNxhWtA6ens66IiammUkZYFv7SSzoPLFZT4dC84SmGPWgf94NoQ=\n"
-          + "=XFeC\n"
-          + "-----END PGP SIGNATURE-----";
-
-  @Test
-  public void listTagsOfNonExistingProject() throws Exception {
-    exception.expect(ResourceNotFoundException.class);
-    gApi.projects().name("does-not-exist").tags().get();
-  }
-
-  @Test
-  public void getTagOfNonExistingProject() throws Exception {
-    exception.expect(ResourceNotFoundException.class);
-    gApi.projects().name("does-not-exist").tag("tag").get();
-  }
-
-  @Test
-  public void listTagsOfNonVisibleProject() throws Exception {
-    blockRead("refs/*");
-    setApiUser(user);
-    exception.expect(ResourceNotFoundException.class);
-    gApi.projects().name(project.get()).tags().get();
-  }
-
-  @Test
-  public void getTagOfNonVisibleProject() throws Exception {
-    blockRead("refs/*");
-    exception.expect(ResourceNotFoundException.class);
-    gApi.projects().name(project.get()).tag("tag").get();
-  }
-
-  @Test
-  public void listTags() throws Exception {
-    createTags();
-
-    // No options
-    List<TagInfo> result = getTags().get();
-    assertTagList(FluentIterable.from(testTags), result);
-
-    // With start option
-    result = getTags().withStart(1).get();
-    assertTagList(FluentIterable.from(testTags).skip(1), result);
-
-    // With limit option
-    int limit = testTags.size() - 1;
-    result = getTags().withLimit(limit).get();
-    assertTagList(FluentIterable.from(testTags).limit(limit), result);
-
-    // With both start and limit
-    limit = testTags.size() - 3;
-    result = getTags().withStart(1).withLimit(limit).get();
-    assertTagList(FluentIterable.from(testTags).skip(1).limit(limit), result);
-
-    // With regular expression filter
-    result = getTags().withRegex("^tag-[C|D]$").get();
-    assertTagList(FluentIterable.from(ImmutableList.of("tag-C", "tag-D")), result);
-
-    result = getTags().withRegex("^tag-[c|d]$").get();
-    assertTagList(FluentIterable.from(ImmutableList.of()), result);
-
-    // With substring filter
-    result = getTags().withSubstring("tag-").get();
-    assertTagList(FluentIterable.from(testTags), result);
-    result = getTags().withSubstring("ag-B").get();
-    assertTagList(FluentIterable.from(ImmutableList.of("tag-B")), result);
-
-    // With conflicting options
-    assertBadRequest(getTags().withSubstring("ag-B").withRegex("^tag-[c|d]$"));
-  }
-
-  @Test
-  public void listTagsOfNonVisibleBranch() throws Exception {
-    grantTagPermissions();
-
-    PushOneCommit push1 = pushFactory.create(db, admin.getIdent(), testRepo);
-    PushOneCommit.Result r1 = push1.to("refs/heads/master");
-    r1.assertOkStatus();
-    TagInput tag1 = new TagInput();
-    tag1.ref = "v1.0";
-    tag1.revision = r1.getCommit().getName();
-    TagInfo result = tag(tag1.ref).create(tag1).get();
-    assertThat(result.ref).isEqualTo(R_TAGS + tag1.ref);
-    assertThat(result.revision).isEqualTo(tag1.revision);
-
-    pushTo("refs/heads/hidden");
-    PushOneCommit push2 = pushFactory.create(db, admin.getIdent(), testRepo);
-    PushOneCommit.Result r2 = push2.to("refs/heads/hidden");
-    r2.assertOkStatus();
-
-    TagInput tag2 = new TagInput();
-    tag2.ref = "v2.0";
-    tag2.revision = r2.getCommit().getName();
-    result = tag(tag2.ref).create(tag2).get();
-    assertThat(result.ref).isEqualTo(R_TAGS + tag2.ref);
-    assertThat(result.revision).isEqualTo(tag2.revision);
-
-    List<TagInfo> tags = getTags().get();
-    assertThat(tags).hasSize(2);
-    assertThat(tags.get(0).ref).isEqualTo(R_TAGS + tag1.ref);
-    assertThat(tags.get(0).revision).isEqualTo(tag1.revision);
-    assertThat(tags.get(1).ref).isEqualTo(R_TAGS + tag2.ref);
-    assertThat(tags.get(1).revision).isEqualTo(tag2.revision);
-
-    blockRead("refs/heads/hidden");
-    tags = getTags().get();
-    assertThat(tags).hasSize(1);
-    assertThat(tags.get(0).ref).isEqualTo(R_TAGS + tag1.ref);
-    assertThat(tags.get(0).revision).isEqualTo(tag1.revision);
-  }
-
-  @Test
-  public void lightweightTag() throws Exception {
-    grantTagPermissions();
-
-    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
-    PushOneCommit.Result r = push.to("refs/heads/master");
-    r.assertOkStatus();
-
-    TagInput input = new TagInput();
-    input.ref = "v1.0";
-    input.revision = r.getCommit().getName();
-
-    TagInfo result = tag(input.ref).create(input).get();
-    assertThat(result.ref).isEqualTo(R_TAGS + input.ref);
-    assertThat(result.revision).isEqualTo(input.revision);
-    assertThat(result.canDelete).isTrue();
-
-    input.ref = "refs/tags/v2.0";
-    result = tag(input.ref).create(input).get();
-    assertThat(result.ref).isEqualTo(input.ref);
-    assertThat(result.revision).isEqualTo(input.revision);
-    assertThat(result.canDelete).isTrue();
-
-    setApiUser(user);
-    result = tag(input.ref).get();
-    assertThat(result.canDelete).isNull();
-
-    eventRecorder.assertRefUpdatedEvents(project.get(), result.ref, null, result.revision);
-  }
-
-  @Test
-  public void annotatedTag() throws Exception {
-    grantTagPermissions();
-
-    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
-    PushOneCommit.Result r = push.to("refs/heads/master");
-    r.assertOkStatus();
-
-    TagInput input = new TagInput();
-    input.ref = "v1.0";
-    input.revision = r.getCommit().getName();
-    input.message = "annotation message";
-
-    TagInfo result = tag(input.ref).create(input).get();
-    assertThat(result.ref).isEqualTo(R_TAGS + input.ref);
-    assertThat(result.object).isEqualTo(input.revision);
-    assertThat(result.message).isEqualTo(input.message);
-    assertThat(result.tagger.name).isEqualTo(admin.fullName);
-    assertThat(result.tagger.email).isEqualTo(admin.email);
-
-    eventRecorder.assertRefUpdatedEvents(project.get(), result.ref, null, result.revision);
-
-    // A second tag pushed on the same ref should have the same ref
-    TagInput input2 = new TagInput();
-    input2.ref = "refs/tags/v2.0";
-    input2.revision = input.revision;
-    input2.message = "second annotation message";
-    TagInfo result2 = tag(input2.ref).create(input2).get();
-    assertThat(result2.ref).isEqualTo(input2.ref);
-    assertThat(result2.object).isEqualTo(input2.revision);
-    assertThat(result2.message).isEqualTo(input2.message);
-    assertThat(result2.tagger.name).isEqualTo(admin.fullName);
-    assertThat(result2.tagger.email).isEqualTo(admin.email);
-
-    eventRecorder.assertRefUpdatedEvents(project.get(), result2.ref, null, result2.revision);
-  }
-
-  @Test
-  public void createExistingTag() throws Exception {
-    grantTagPermissions();
-
-    TagInput input = new TagInput();
-    input.ref = "test";
-    TagInfo result = tag(input.ref).create(input).get();
-    assertThat(result.ref).isEqualTo(R_TAGS + "test");
-
-    input.ref = "refs/tags/test";
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("tag \"" + R_TAGS + "test\" already exists");
-    tag(input.ref).create(input);
-  }
-
-  @Test
-  public void createTagNotAllowed() throws Exception {
-    block(R_TAGS + "*", Permission.CREATE, REGISTERED_USERS);
-    TagInput input = new TagInput();
-    input.ref = "test";
-    exception.expect(AuthException.class);
-    exception.expectMessage("create not permitted");
-    tag(input.ref).create(input);
-  }
-
-  @Test
-  public void createAnnotatedTagNotAllowed() throws Exception {
-    block(R_TAGS + "*", Permission.CREATE_TAG, REGISTERED_USERS);
-    TagInput input = new TagInput();
-    input.ref = "test";
-    input.message = "annotation";
-    exception.expect(AuthException.class);
-    exception.expectMessage("Cannot create annotated tag \"" + R_TAGS + "test\"");
-    tag(input.ref).create(input);
-  }
-
-  @Test
-  public void createSignedTagNotSupported() throws Exception {
-    TagInput input = new TagInput();
-    input.ref = "test";
-    input.message = SIGNED_ANNOTATION;
-    exception.expect(MethodNotAllowedException.class);
-    exception.expectMessage("Cannot create signed tag \"" + R_TAGS + "test\"");
-    tag(input.ref).create(input);
-  }
-
-  @Test
-  public void mismatchedInput() throws Exception {
-    TagInput input = new TagInput();
-    input.ref = "test";
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("ref must match URL");
-    tag("TEST").create(input);
-  }
-
-  @Test
-  public void invalidTagName() throws Exception {
-    grantTagPermissions();
-
-    TagInput input = new TagInput();
-    input.ref = "refs/heads/test";
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("invalid tag name \"" + input.ref + "\"");
-    tag(input.ref).create(input);
-  }
-
-  @Test
-  public void invalidTagNameOnlySlashes() throws Exception {
-    grantTagPermissions();
-
-    TagInput input = new TagInput();
-    input.ref = "//";
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("invalid tag name \"refs/tags/\"");
-    tag(input.ref).create(input);
-  }
-
-  @Test
-  public void invalidBaseRevision() throws Exception {
-    grantTagPermissions();
-
-    TagInput input = new TagInput();
-    input.ref = "test";
-    input.revision = "abcdefg";
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("Invalid base revision");
-    tag(input.ref).create(input);
-  }
-
-  private void assertTagList(FluentIterable<String> expected, List<TagInfo> actual)
-      throws Exception {
-    assertThat(actual).hasSize(expected.size());
-    for (int i = 0; i < expected.size(); i++) {
-      assertThat(actual.get(i).ref).isEqualTo(R_TAGS + expected.get(i));
-    }
-  }
-
-  private void createTags() throws Exception {
-    grantTagPermissions();
-
-    String revision = pushTo("refs/heads/master").getCommit().name();
-    TagInput input = new TagInput();
-    input.revision = revision;
-
-    for (String tagname : testTags) {
-      TagInfo result = tag(tagname).create(input).get();
-      assertThat(result.revision).isEqualTo(input.revision);
-      assertThat(result.ref).isEqualTo(R_TAGS + tagname);
-    }
-  }
-
-  private ListRefsRequest<TagInfo> getTags() throws Exception {
-    return gApi.projects().name(project.get()).tags();
-  }
-
-  private TagApi tag(String tagname) throws Exception {
-    return gApi.projects().name(project.get()).tag(tagname);
-  }
-
-  private void assertBadRequest(ListRefsRequest<TagInfo> req) throws Exception {
-    try {
-      req.get();
-      fail("Expected BadRequestException");
-    } catch (BadRequestException e) {
-      // Expected
-    }
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/revision/BUILD b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/revision/BUILD
deleted file mode 100644
index f47ac46..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/revision/BUILD
+++ /dev/null
@@ -1,7 +0,0 @@
-load("//gerrit-acceptance-tests:tests.bzl", "acceptance_tests")
-
-acceptance_tests(
-    srcs = glob(["*IT.java"]),
-    group = "rest_revision",
-    labels = ["rest"],
-)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/BUILD b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/BUILD
deleted file mode 100644
index ac32b02..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/BUILD
+++ /dev/null
@@ -1,7 +0,0 @@
-load("//gerrit-acceptance-tests:tests.bzl", "acceptance_tests")
-
-acceptance_tests(
-    srcs = glob(["*IT.java"]),
-    group = "server_change",
-    labels = ["server"],
-)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/CommentsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/CommentsIT.java
deleted file mode 100644
index 620b448..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/CommentsIT.java
+++ /dev/null
@@ -1,1183 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.acceptance.server.change;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth8.assertThat;
-import static com.google.gerrit.acceptance.PushOneCommit.FILE_NAME;
-import static com.google.gerrit.acceptance.PushOneCommit.SUBJECT;
-import static java.util.stream.Collectors.groupingBy;
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.base.Function;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.AcceptanceTestRequestScope;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.extensions.api.changes.DeleteCommentInput;
-import com.google.gerrit.extensions.api.changes.DraftInput;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.api.changes.ReviewInput.CommentInput;
-import com.google.gerrit.extensions.api.changes.ReviewInput.DraftHandling;
-import com.google.gerrit.extensions.client.Comment;
-import com.google.gerrit.extensions.client.Side;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.CommentInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Patch;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.change.ChangeResource;
-import com.google.gerrit.server.change.ChangesCollection;
-import com.google.gerrit.server.change.PostReview;
-import com.google.gerrit.server.change.RevisionResource;
-import com.google.gerrit.server.notedb.ChangeNoteUtil;
-import com.google.gerrit.server.notedb.DeleteCommentRewriter;
-import com.google.gerrit.testutil.FakeEmailSender;
-import com.google.gerrit.testutil.FakeEmailSender.Message;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Optional;
-import java.util.function.Supplier;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.notes.NoteMap;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.junit.Before;
-import org.junit.Test;
-
-@NoHttpd
-public class CommentsIT extends AbstractDaemonTest {
-
-  @Inject private Provider<ChangesCollection> changes;
-
-  @Inject private Provider<PostReview> postReview;
-
-  @Inject private FakeEmailSender email;
-
-  @Inject private ChangeNoteUtil noteUtil;
-
-  private final Integer[] lines = {0, 1};
-
-  @Before
-  public void setUp() {
-    setApiUser(user);
-  }
-
-  @Test
-  public void getNonExistingComment() throws Exception {
-    PushOneCommit.Result r = createChange();
-    String changeId = r.getChangeId();
-    String revId = r.getCommit().getName();
-    exception.expect(ResourceNotFoundException.class);
-    getPublishedComment(changeId, revId, "non-existing");
-  }
-
-  @Test
-  public void createDraft() throws Exception {
-    for (Integer line : lines) {
-      PushOneCommit.Result r = createChange();
-      String changeId = r.getChangeId();
-      String revId = r.getCommit().getName();
-      String path = "file1";
-      DraftInput comment = newDraft(path, Side.REVISION, line, "comment 1");
-      addDraft(changeId, revId, comment);
-      Map<String, List<CommentInfo>> result = getDraftComments(changeId, revId);
-      assertThat(result).hasSize(1);
-      CommentInfo actual = Iterables.getOnlyElement(result.get(comment.path));
-      assertThat(comment).isEqualTo(infoToDraft(path).apply(actual));
-    }
-  }
-
-  @Test
-  public void createDraftOnMergeCommitChange() throws Exception {
-    for (Integer line : lines) {
-      PushOneCommit.Result r = createMergeCommitChange("refs/for/master");
-      String changeId = r.getChangeId();
-      String revId = r.getCommit().getName();
-      String path = "file1";
-      DraftInput c1 = newDraft(path, Side.REVISION, line, "ps-1");
-      DraftInput c2 = newDraft(path, Side.PARENT, line, "auto-merge of ps-1");
-      DraftInput c3 = newDraftOnParent(path, 1, line, "parent-1 of ps-1");
-      DraftInput c4 = newDraftOnParent(path, 2, line, "parent-2 of ps-1");
-      addDraft(changeId, revId, c1);
-      addDraft(changeId, revId, c2);
-      addDraft(changeId, revId, c3);
-      addDraft(changeId, revId, c4);
-      Map<String, List<CommentInfo>> result = getDraftComments(changeId, revId);
-      assertThat(result).hasSize(1);
-      assertThat(Lists.transform(result.get(path), infoToDraft(path)))
-          .containsExactly(c1, c2, c3, c4);
-    }
-  }
-
-  @Test
-  public void postComment() throws Exception {
-    for (Integer line : lines) {
-      String file = "file";
-      String contents = "contents " + line;
-      PushOneCommit push =
-          pushFactory.create(db, admin.getIdent(), testRepo, "first subject", file, contents);
-      PushOneCommit.Result r = push.to("refs/for/master");
-      String changeId = r.getChangeId();
-      String revId = r.getCommit().getName();
-      ReviewInput input = new ReviewInput();
-      CommentInput comment = newComment(file, Side.REVISION, line, "comment 1", false);
-      input.comments = new HashMap<>();
-      input.comments.put(comment.path, Lists.newArrayList(comment));
-      revision(r).review(input);
-      Map<String, List<CommentInfo>> result = getPublishedComments(changeId, revId);
-      assertThat(result).isNotEmpty();
-      CommentInfo actual = Iterables.getOnlyElement(result.get(comment.path));
-      assertThat(comment).isEqualTo(infoToInput(file).apply(actual));
-      assertThat(comment)
-          .isEqualTo(infoToInput(file).apply(getPublishedComment(changeId, revId, actual.id)));
-    }
-  }
-
-  @Test
-  public void postCommentWithReply() throws Exception {
-    for (Integer line : lines) {
-      String file = "file";
-      String contents = "contents " + line;
-      PushOneCommit push =
-          pushFactory.create(db, admin.getIdent(), testRepo, "first subject", file, contents);
-      PushOneCommit.Result r = push.to("refs/for/master");
-      String changeId = r.getChangeId();
-      String revId = r.getCommit().getName();
-      ReviewInput input = new ReviewInput();
-      CommentInput comment = newComment(file, Side.REVISION, line, "comment 1", false);
-      input.comments = new HashMap<>();
-      input.comments.put(comment.path, Lists.newArrayList(comment));
-      revision(r).review(input);
-      Map<String, List<CommentInfo>> result = getPublishedComments(changeId, revId);
-      CommentInfo actual = Iterables.getOnlyElement(result.get(comment.path));
-
-      input = new ReviewInput();
-      comment = newComment(file, Side.REVISION, line, "comment 1 reply", false);
-      comment.inReplyTo = actual.id;
-      input.comments = new HashMap<>();
-      input.comments.put(comment.path, Lists.newArrayList(comment));
-      revision(r).review(input);
-      result = getPublishedComments(changeId, revId);
-      actual = result.get(comment.path).get(1);
-      assertThat(comment).isEqualTo(infoToInput(file).apply(actual));
-      assertThat(comment)
-          .isEqualTo(infoToInput(file).apply(getPublishedComment(changeId, revId, actual.id)));
-    }
-  }
-
-  @Test
-  public void postCommentWithUnresolved() throws Exception {
-    for (Integer line : lines) {
-      String file = "file";
-      String contents = "contents " + line;
-      PushOneCommit push =
-          pushFactory.create(db, admin.getIdent(), testRepo, "first subject", file, contents);
-      PushOneCommit.Result r = push.to("refs/for/master");
-      String changeId = r.getChangeId();
-      String revId = r.getCommit().getName();
-      ReviewInput input = new ReviewInput();
-      CommentInput comment = newComment(file, Side.REVISION, line, "comment 1", true);
-      input.comments = new HashMap<>();
-      input.comments.put(comment.path, Lists.newArrayList(comment));
-      revision(r).review(input);
-      Map<String, List<CommentInfo>> result = getPublishedComments(changeId, revId);
-      assertThat(result).isNotEmpty();
-      CommentInfo actual = Iterables.getOnlyElement(result.get(comment.path));
-      assertThat(comment).isEqualTo(infoToInput(file).apply(actual));
-      assertThat(comment)
-          .isEqualTo(infoToInput(file).apply(getPublishedComment(changeId, revId, actual.id)));
-    }
-  }
-
-  @Test
-  public void postCommentOnMergeCommitChange() throws Exception {
-    for (Integer line : lines) {
-      String file = "foo";
-      PushOneCommit.Result r = createMergeCommitChange("refs/for/master", file);
-      String changeId = r.getChangeId();
-      String revId = r.getCommit().getName();
-      ReviewInput input = new ReviewInput();
-      CommentInput c1 = newComment(file, Side.REVISION, line, "ps-1", false);
-      CommentInput c2 = newComment(file, Side.PARENT, line, "auto-merge of ps-1", false);
-      CommentInput c3 = newCommentOnParent(file, 1, line, "parent-1 of ps-1");
-      CommentInput c4 = newCommentOnParent(file, 2, line, "parent-2 of ps-1");
-      input.comments = new HashMap<>();
-      input.comments.put(file, ImmutableList.of(c1, c2, c3, c4));
-      revision(r).review(input);
-      Map<String, List<CommentInfo>> result = getPublishedComments(changeId, revId);
-      assertThat(result).isNotEmpty();
-      assertThat(Lists.transform(result.get(file), infoToInput(file)))
-          .containsExactly(c1, c2, c3, c4);
-    }
-
-    // for the commit message comments on the auto-merge are not possible
-    for (Integer line : lines) {
-      String file = Patch.COMMIT_MSG;
-      PushOneCommit.Result r = createMergeCommitChange("refs/for/master");
-      String changeId = r.getChangeId();
-      String revId = r.getCommit().getName();
-      ReviewInput input = new ReviewInput();
-      CommentInput c1 = newComment(file, Side.REVISION, line, "ps-1", false);
-      CommentInput c2 = newCommentOnParent(file, 1, line, "parent-1 of ps-1");
-      CommentInput c3 = newCommentOnParent(file, 2, line, "parent-2 of ps-1");
-      input.comments = new HashMap<>();
-      input.comments.put(file, ImmutableList.of(c1, c2, c3));
-      revision(r).review(input);
-      Map<String, List<CommentInfo>> result = getPublishedComments(changeId, revId);
-      assertThat(result).isNotEmpty();
-      assertThat(Lists.transform(result.get(file), infoToInput(file))).containsExactly(c1, c2, c3);
-    }
-  }
-
-  @Test
-  public void postCommentOnCommitMessageOnAutoMerge() throws Exception {
-    PushOneCommit.Result r = createMergeCommitChange("refs/for/master");
-    ReviewInput input = new ReviewInput();
-    CommentInput c = newComment(Patch.COMMIT_MSG, Side.PARENT, 0, "comment on auto-merge", false);
-    input.comments = new HashMap<>();
-    input.comments.put(Patch.COMMIT_MSG, ImmutableList.of(c));
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("cannot comment on " + Patch.COMMIT_MSG + " on auto-merge");
-    revision(r).review(input);
-  }
-
-  @Test
-  public void listComments() throws Exception {
-    String file = "file";
-    PushOneCommit push =
-        pushFactory.create(db, admin.getIdent(), testRepo, "first subject", file, "contents");
-    PushOneCommit.Result r = push.to("refs/for/master");
-    String changeId = r.getChangeId();
-    String revId = r.getCommit().getName();
-    assertThat(getPublishedComments(changeId, revId)).isEmpty();
-
-    List<CommentInput> expectedComments = new ArrayList<>();
-    for (Integer line : lines) {
-      ReviewInput input = new ReviewInput();
-      CommentInput comment = newComment(file, Side.REVISION, line, "comment " + line, false);
-      expectedComments.add(comment);
-      input.comments = new HashMap<>();
-      input.comments.put(comment.path, Lists.newArrayList(comment));
-      revision(r).review(input);
-    }
-
-    Map<String, List<CommentInfo>> result = getPublishedComments(changeId, revId);
-    assertThat(result).isNotEmpty();
-    List<CommentInfo> actualComments = result.get(file);
-    assertThat(Lists.transform(actualComments, infoToInput(file)))
-        .containsExactlyElementsIn(expectedComments);
-  }
-
-  @Test
-  public void putDraft() throws Exception {
-    for (Integer line : lines) {
-      PushOneCommit.Result r = createChange();
-      Timestamp origLastUpdated = r.getChange().change().getLastUpdatedOn();
-      String changeId = r.getChangeId();
-      String revId = r.getCommit().getName();
-      String path = "file1";
-      DraftInput comment = newDraft(path, Side.REVISION, line, "comment 1");
-      addDraft(changeId, revId, comment);
-      Map<String, List<CommentInfo>> result = getDraftComments(changeId, revId);
-      CommentInfo actual = Iterables.getOnlyElement(result.get(comment.path));
-      assertThat(comment).isEqualTo(infoToDraft(path).apply(actual));
-      String uuid = actual.id;
-      comment.message = "updated comment 1";
-      updateDraft(changeId, revId, comment, uuid);
-      result = getDraftComments(changeId, revId);
-      actual = Iterables.getOnlyElement(result.get(comment.path));
-      assertThat(comment).isEqualTo(infoToDraft(path).apply(actual));
-
-      // Posting a draft comment doesn't cause lastUpdatedOn to change.
-      assertThat(r.getChange().change().getLastUpdatedOn()).isEqualTo(origLastUpdated);
-    }
-  }
-
-  @Test
-  public void listDrafts() throws Exception {
-    String file = "file";
-    PushOneCommit.Result r = createChange();
-    String changeId = r.getChangeId();
-    String revId = r.getCommit().getName();
-    assertThat(getDraftComments(changeId, revId)).isEmpty();
-
-    List<DraftInput> expectedDrafts = new ArrayList<>();
-    for (Integer line : lines) {
-      DraftInput comment = newDraft(file, Side.REVISION, line, "comment " + line);
-      expectedDrafts.add(comment);
-      addDraft(changeId, revId, comment);
-    }
-
-    Map<String, List<CommentInfo>> result = getDraftComments(changeId, revId);
-    assertThat(result).isNotEmpty();
-    List<CommentInfo> actualComments = result.get(file);
-    assertThat(Lists.transform(actualComments, infoToDraft(file)))
-        .containsExactlyElementsIn(expectedDrafts);
-  }
-
-  @Test
-  public void getDraft() throws Exception {
-    for (Integer line : lines) {
-      PushOneCommit.Result r = createChange();
-      String changeId = r.getChangeId();
-      String revId = r.getCommit().getName();
-      String path = "file1";
-      DraftInput comment = newDraft(path, Side.REVISION, line, "comment 1");
-      CommentInfo returned = addDraft(changeId, revId, comment);
-      CommentInfo actual = getDraftComment(changeId, revId, returned.id);
-      assertThat(comment).isEqualTo(infoToDraft(path).apply(actual));
-    }
-  }
-
-  @Test
-  public void deleteDraft() throws Exception {
-    for (Integer line : lines) {
-      PushOneCommit.Result r = createChange();
-      Timestamp origLastUpdated = r.getChange().change().getLastUpdatedOn();
-      String changeId = r.getChangeId();
-      String revId = r.getCommit().getName();
-      DraftInput draft = newDraft("file1", Side.REVISION, line, "comment 1");
-      CommentInfo returned = addDraft(changeId, revId, draft);
-      deleteDraft(changeId, revId, returned.id);
-      Map<String, List<CommentInfo>> drafts = getDraftComments(changeId, revId);
-      assertThat(drafts).isEmpty();
-
-      // Deleting a draft comment doesn't cause lastUpdatedOn to change.
-      assertThat(r.getChange().change().getLastUpdatedOn()).isEqualTo(origLastUpdated);
-    }
-  }
-
-  @Test
-  public void insertCommentsWithHistoricTimestamp() throws Exception {
-    Timestamp timestamp = new Timestamp(0);
-    for (Integer line : lines) {
-      String file = "file";
-      String contents = "contents " + line;
-      PushOneCommit push =
-          pushFactory.create(db, admin.getIdent(), testRepo, "first subject", file, contents);
-      PushOneCommit.Result r = push.to("refs/for/master");
-      String changeId = r.getChangeId();
-      String revId = r.getCommit().getName();
-      Timestamp origLastUpdated = r.getChange().change().getLastUpdatedOn();
-
-      ReviewInput input = new ReviewInput();
-      CommentInput comment = newComment(file, Side.REVISION, line, "comment 1", false);
-      comment.updated = timestamp;
-      input.comments = new HashMap<>();
-      input.comments.put(comment.path, Lists.newArrayList(comment));
-      ChangeResource changeRsrc =
-          changes.get().parse(TopLevelResource.INSTANCE, IdString.fromDecoded(changeId));
-      RevisionResource revRsrc = revisions.parse(changeRsrc, IdString.fromDecoded(revId));
-      postReview.get().apply(batchUpdateFactory, revRsrc, input, timestamp);
-      Map<String, List<CommentInfo>> result = getPublishedComments(changeId, revId);
-      assertThat(result).isNotEmpty();
-      CommentInfo actual = Iterables.getOnlyElement(result.get(comment.path));
-      CommentInput ci = infoToInput(file).apply(actual);
-      ci.updated = comment.updated;
-      assertThat(comment).isEqualTo(ci);
-      assertThat(actual.updated).isEqualTo(gApi.changes().id(r.getChangeId()).info().created);
-
-      // Updating historic comments doesn't cause lastUpdatedOn to regress.
-      assertThat(r.getChange().change().getLastUpdatedOn()).isEqualTo(origLastUpdated);
-    }
-  }
-
-  @Test
-  public void addDuplicateComments() throws Exception {
-    PushOneCommit.Result r1 = createChange();
-    String changeId = r1.getChangeId();
-    String revId = r1.getCommit().getName();
-    addComment(r1, "nit: trailing whitespace");
-    addComment(r1, "nit: trailing whitespace");
-    Map<String, List<CommentInfo>> result = getPublishedComments(changeId, revId);
-    assertThat(result.get(FILE_NAME)).hasSize(2);
-    addComment(r1, "nit: trailing whitespace", true, false, null);
-    result = getPublishedComments(changeId, revId);
-    assertThat(result.get(FILE_NAME)).hasSize(2);
-
-    PushOneCommit.Result r2 =
-        pushFactory
-            .create(db, admin.getIdent(), testRepo, SUBJECT, FILE_NAME, "content")
-            .to("refs/for/master");
-    changeId = r2.getChangeId();
-    revId = r2.getCommit().getName();
-    addComment(r2, "nit: trailing whitespace", true, false, null);
-    result = getPublishedComments(changeId, revId);
-    assertThat(result.get(FILE_NAME)).hasSize(1);
-  }
-
-  @Test
-  public void listChangeDrafts() throws Exception {
-    PushOneCommit.Result r1 = createChange();
-
-    PushOneCommit.Result r2 =
-        pushFactory
-            .create(
-                db, admin.getIdent(), testRepo, SUBJECT, FILE_NAME, "new content", r1.getChangeId())
-            .to("refs/for/master");
-
-    setApiUser(admin);
-    addDraft(
-        r1.getChangeId(),
-        r1.getCommit().getName(),
-        newDraft(FILE_NAME, Side.REVISION, 1, "nit: trailing whitespace"));
-    addDraft(
-        r2.getChangeId(),
-        r2.getCommit().getName(),
-        newDraft(FILE_NAME, Side.REVISION, 1, "typo: content"));
-
-    setApiUser(user);
-    addDraft(
-        r2.getChangeId(),
-        r2.getCommit().getName(),
-        newDraft(FILE_NAME, Side.REVISION, 1, "+1, please fix"));
-
-    setApiUser(admin);
-    Map<String, List<CommentInfo>> actual = gApi.changes().id(r1.getChangeId()).drafts();
-    assertThat(actual.keySet()).containsExactly(FILE_NAME);
-    List<CommentInfo> comments = actual.get(FILE_NAME);
-    assertThat(comments).hasSize(2);
-
-    CommentInfo c1 = comments.get(0);
-    assertThat(c1.author).isNull();
-    assertThat(c1.patchSet).isEqualTo(1);
-    assertThat(c1.message).isEqualTo("nit: trailing whitespace");
-    assertThat(c1.side).isNull();
-    assertThat(c1.line).isEqualTo(1);
-
-    CommentInfo c2 = comments.get(1);
-    assertThat(c2.author).isNull();
-    assertThat(c2.patchSet).isEqualTo(2);
-    assertThat(c2.message).isEqualTo("typo: content");
-    assertThat(c2.side).isNull();
-    assertThat(c2.line).isEqualTo(1);
-  }
-
-  @Test
-  public void listChangeComments() throws Exception {
-    PushOneCommit.Result r1 = createChange();
-
-    PushOneCommit.Result r2 =
-        pushFactory
-            .create(
-                db, admin.getIdent(), testRepo, SUBJECT, FILE_NAME, "new cntent", r1.getChangeId())
-            .to("refs/for/master");
-
-    addComment(r1, "nit: trailing whitespace");
-    addComment(r2, "typo: content");
-
-    Map<String, List<CommentInfo>> actual = gApi.changes().id(r2.getChangeId()).comments();
-    assertThat(actual.keySet()).containsExactly(FILE_NAME);
-
-    List<CommentInfo> comments = actual.get(FILE_NAME);
-    assertThat(comments).hasSize(2);
-
-    CommentInfo c1 = comments.get(0);
-    assertThat(c1.author._accountId).isEqualTo(user.getId().get());
-    assertThat(c1.patchSet).isEqualTo(1);
-    assertThat(c1.message).isEqualTo("nit: trailing whitespace");
-    assertThat(c1.side).isNull();
-    assertThat(c1.line).isEqualTo(1);
-
-    CommentInfo c2 = comments.get(1);
-    assertThat(c2.author._accountId).isEqualTo(user.getId().get());
-    assertThat(c2.patchSet).isEqualTo(2);
-    assertThat(c2.message).isEqualTo("typo: content");
-    assertThat(c2.side).isNull();
-    assertThat(c2.line).isEqualTo(1);
-  }
-
-  @Test
-  public void listChangeWithDrafts() throws Exception {
-    for (Integer line : lines) {
-      PushOneCommit.Result r = createChange();
-      String changeId = r.getChangeId();
-      String revId = r.getCommit().getName();
-      DraftInput comment = newDraft("file1", Side.REVISION, line, "comment 1");
-      addDraft(changeId, revId, comment);
-      assertThat(gApi.changes().query("change:" + changeId + " has:draft").get()).hasSize(1);
-    }
-  }
-
-  @Test
-  public void publishCommentsAllRevisions() throws Exception {
-    PushOneCommit.Result r1 = createChange();
-
-    PushOneCommit.Result r2 =
-        pushFactory
-            .create(
-                db,
-                admin.getIdent(),
-                testRepo,
-                SUBJECT,
-                FILE_NAME,
-                "new\ncntent\n",
-                r1.getChangeId())
-            .to("refs/for/master");
-
-    addDraft(
-        r1.getChangeId(),
-        r1.getCommit().getName(),
-        newDraft(FILE_NAME, Side.REVISION, 1, "nit: trailing whitespace"));
-    addDraft(
-        r1.getChangeId(),
-        r1.getCommit().getName(),
-        newDraft(FILE_NAME, Side.PARENT, 2, "what happened to this?"));
-    addDraft(
-        r2.getChangeId(),
-        r2.getCommit().getName(),
-        newDraft(FILE_NAME, Side.REVISION, 1, "join lines"));
-    addDraft(
-        r2.getChangeId(),
-        r2.getCommit().getName(),
-        newDraft(FILE_NAME, Side.REVISION, 2, "typo: content"));
-    addDraft(
-        r2.getChangeId(),
-        r2.getCommit().getName(),
-        newDraft(FILE_NAME, Side.PARENT, 1, "comment 1 on base"));
-    addDraft(
-        r2.getChangeId(),
-        r2.getCommit().getName(),
-        newDraft(FILE_NAME, Side.PARENT, 2, "comment 2 on base"));
-
-    PushOneCommit.Result other = createChange();
-    // Drafts on other changes aren't returned.
-    addDraft(
-        other.getChangeId(),
-        other.getCommit().getName(),
-        newDraft(FILE_NAME, Side.REVISION, 1, "unrelated comment"));
-
-    setApiUser(admin);
-    // Drafts by other users aren't returned.
-    addDraft(
-        r2.getChangeId(), r2.getCommit().getName(), newDraft(FILE_NAME, Side.REVISION, 2, "oops"));
-    setApiUser(user);
-
-    ReviewInput reviewInput = new ReviewInput();
-    reviewInput.drafts = DraftHandling.PUBLISH_ALL_REVISIONS;
-    reviewInput.message = "comments";
-    gApi.changes().id(r2.getChangeId()).current().review(reviewInput);
-
-    assertThat(gApi.changes().id(r1.getChangeId()).revision(r1.getCommit().name()).drafts())
-        .isEmpty();
-    Map<String, List<CommentInfo>> ps1Map =
-        gApi.changes().id(r1.getChangeId()).revision(r1.getCommit().name()).comments();
-    assertThat(ps1Map.keySet()).containsExactly(FILE_NAME);
-    List<CommentInfo> ps1List = ps1Map.get(FILE_NAME);
-    assertThat(ps1List).hasSize(2);
-    assertThat(ps1List.get(0).message).isEqualTo("what happened to this?");
-    assertThat(ps1List.get(0).side).isEqualTo(Side.PARENT);
-    assertThat(ps1List.get(1).message).isEqualTo("nit: trailing whitespace");
-    assertThat(ps1List.get(1).side).isNull();
-
-    assertThat(gApi.changes().id(r2.getChangeId()).revision(r2.getCommit().name()).drafts())
-        .isEmpty();
-    Map<String, List<CommentInfo>> ps2Map =
-        gApi.changes().id(r2.getChangeId()).revision(r2.getCommit().name()).comments();
-    assertThat(ps2Map.keySet()).containsExactly(FILE_NAME);
-    List<CommentInfo> ps2List = ps2Map.get(FILE_NAME);
-    assertThat(ps2List).hasSize(4);
-    assertThat(ps2List.get(0).message).isEqualTo("comment 1 on base");
-    assertThat(ps2List.get(1).message).isEqualTo("comment 2 on base");
-    assertThat(ps2List.get(2).message).isEqualTo("join lines");
-    assertThat(ps2List.get(3).message).isEqualTo("typo: content");
-
-    List<Message> messages = email.getMessages(r2.getChangeId(), "comment");
-    assertThat(messages).hasSize(1);
-    String url = canonicalWebUrl.get();
-    int c = r1.getChange().getId().get();
-    assertThat(extractComments(messages.get(0).body()))
-        .isEqualTo(
-            "Patch Set 2:\n"
-                + "\n"
-                + "(6 comments)\n"
-                + "\n"
-                + "comments\n"
-                + "\n"
-                + url
-                + "#/c/"
-                + c
-                + "/1/a.txt\n"
-                + "File a.txt:\n"
-                + "\n"
-                + url
-                + "#/c/"
-                + c
-                + "/1/a.txt@a2\n"
-                + "PS1, Line 2: \n"
-                + "what happened to this?\n"
-                + "\n"
-                + "\n"
-                + url
-                + "#/c/"
-                + c
-                + "/1/a.txt@1\n"
-                + "PS1, Line 1: ew\n"
-                + "nit: trailing whitespace\n"
-                + "\n"
-                + "\n"
-                + url
-                + "#/c/"
-                + c
-                + "/2/a.txt\n"
-                + "File a.txt:\n"
-                + "\n"
-                + url
-                + "#/c/"
-                + c
-                + "/2/a.txt@a1\n"
-                + "PS2, Line 1: \n"
-                + "comment 1 on base\n"
-                + "\n"
-                + "\n"
-                + url
-                + "#/c/"
-                + c
-                + "/2/a.txt@a2\n"
-                + "PS2, Line 2: \n"
-                + "comment 2 on base\n"
-                + "\n"
-                + "\n"
-                + url
-                + "#/c/"
-                + c
-                + "/2/a.txt@1\n"
-                + "PS2, Line 1: ew\n"
-                + "join lines\n"
-                + "\n"
-                + "\n"
-                + url
-                + "#/c/"
-                + c
-                + "/2/a.txt@2\n"
-                + "PS2, Line 2: nten\n"
-                + "typo: content\n"
-                + "\n"
-                + "\n");
-  }
-
-  @Test
-  public void commentTags() throws Exception {
-    PushOneCommit.Result r = createChange();
-
-    CommentInput pub = new CommentInput();
-    pub.line = 1;
-    pub.message = "published comment";
-    pub.path = FILE_NAME;
-    ReviewInput rin = newInput(pub);
-    rin.tag = "tag1";
-    gApi.changes().id(r.getChangeId()).current().review(rin);
-
-    List<CommentInfo> comments = gApi.changes().id(r.getChangeId()).current().commentsAsList();
-    assertThat(comments).hasSize(1);
-    assertThat(comments.get(0).tag).isEqualTo("tag1");
-
-    DraftInput draft = new DraftInput();
-    draft.line = 2;
-    draft.message = "draft comment";
-    draft.path = FILE_NAME;
-    draft.tag = "tag2";
-    addDraft(r.getChangeId(), r.getCommit().name(), draft);
-
-    List<CommentInfo> drafts = gApi.changes().id(r.getChangeId()).current().draftsAsList();
-    assertThat(drafts).hasSize(1);
-    assertThat(drafts.get(0).tag).isEqualTo("tag2");
-  }
-
-  @Test
-  public void queryChangesWithUnresolvedCommentCount() throws Exception {
-    // PS1 has three comments in three different threads, PS2 has one comment in one thread.
-    PushOneCommit.Result result = createChange("change 1", FILE_NAME, "content 1");
-    String changeId1 = result.getChangeId();
-    addComment(result, "comment 1", false, true, null);
-    addComment(result, "comment 2", false, null, null);
-    addComment(result, "comment 3", false, false, null);
-    PushOneCommit.Result result2 = amendChange(changeId1);
-    addComment(result2, "comment4", false, true, null);
-
-    // Change2 has two comments in one thread, the first is unresolved and the second is resolved.
-    result = createChange("change 2", FILE_NAME, "content 2");
-    String changeId2 = result.getChangeId();
-    addComment(result, "comment 1", false, true, null);
-    Map<String, List<CommentInfo>> comments =
-        getPublishedComments(changeId2, result.getCommit().name());
-    assertThat(comments).hasSize(1);
-    assertThat(comments.get(FILE_NAME)).hasSize(1);
-    addComment(result, "comment 2", false, false, comments.get(FILE_NAME).get(0).id);
-
-    // Change3 has two comments in one thread, the first is resolved, the second is unresolved.
-    result = createChange("change 3", FILE_NAME, "content 3");
-    String changeId3 = result.getChangeId();
-    addComment(result, "comment 1", false, false, null);
-    comments = getPublishedComments(result.getChangeId(), result.getCommit().name());
-    assertThat(comments).hasSize(1);
-    assertThat(comments.get(FILE_NAME)).hasSize(1);
-    addComment(result, "comment 2", false, true, comments.get(FILE_NAME).get(0).id);
-
-    AcceptanceTestRequestScope.Context ctx = disableDb();
-    try {
-      ChangeInfo changeInfo1 = Iterables.getOnlyElement(query(changeId1));
-      ChangeInfo changeInfo2 = Iterables.getOnlyElement(query(changeId2));
-      ChangeInfo changeInfo3 = Iterables.getOnlyElement(query(changeId3));
-      assertThat(changeInfo1.unresolvedCommentCount).isEqualTo(2);
-      assertThat(changeInfo2.unresolvedCommentCount).isEqualTo(0);
-      assertThat(changeInfo3.unresolvedCommentCount).isEqualTo(1);
-    } finally {
-      enableDb(ctx);
-    }
-  }
-
-  @Test
-  public void deleteCommentCannotBeAppliedByUser() throws Exception {
-    PushOneCommit.Result result = createChange();
-    CommentInput targetComment = addComment(result.getChangeId(), "My password: abc123");
-
-    Map<String, List<CommentInfo>> commentsMap =
-        getPublishedComments(result.getChangeId(), result.getCommit().name());
-
-    assertThat(commentsMap).hasSize(1);
-    assertThat(commentsMap.get(FILE_NAME)).hasSize(1);
-
-    String uuid = commentsMap.get(targetComment.path).get(0).id;
-    DeleteCommentInput input = new DeleteCommentInput("contains confidential information");
-
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    gApi.changes().id(result.getChangeId()).current().comment(uuid).delete(input);
-  }
-
-  @Test
-  public void deleteCommentByRewritingCommitHistory() throws Exception {
-    // Creates the following commit history on the meta branch of the test change. Then tries to
-    // delete the comments one by one, which will rewrite most of the commits on the 'meta' branch.
-    // Commits will be rewritten N times for N added comments. After each deletion, the meta branch
-    // should keep its previous state except that the target comment's message should be updated.
-
-    // 1st commit: Create PS1.
-    PushOneCommit.Result result1 = createChange(SUBJECT, "a.txt", "a");
-    Change.Id id = result1.getChange().getId();
-    String changeId = result1.getChangeId();
-    String ps1 = result1.getCommit().name();
-
-    // 2nd commit: Add (c1) to PS1.
-    CommentInput c1 = newComment("a.txt", "comment 1");
-    addComments(changeId, ps1, c1);
-
-    // 3rd commit: Add (c2, c3) to PS1.
-    CommentInput c2 = newComment("a.txt", "comment 2");
-    CommentInput c3 = newComment("a.txt", "comment 3");
-    addComments(changeId, ps1, c2, c3);
-
-    // 4th commit: Add (c4) to PS1.
-    CommentInput c4 = newComment("a.txt", "comment 4");
-    addComments(changeId, ps1, c4);
-
-    // 5th commit: Create PS2.
-    PushOneCommit.Result result2 = amendChange(changeId, "refs/for/master", "b.txt", "b");
-    String ps2 = result2.getCommit().name();
-
-    // 6th commit: Add (c5) to PS1.
-    CommentInput c5 = newComment("a.txt", "comment 5");
-    addComments(changeId, ps1, c5);
-
-    // 7th commit: Add (c6) to PS2.
-    CommentInput c6 = newComment("b.txt", "comment 6");
-    addComments(changeId, ps2, c6);
-
-    // 8th commit: Create PS3.
-    PushOneCommit.Result result3 = amendChange(changeId);
-    String ps3 = result3.getCommit().name();
-
-    // 9th commit: Create PS4.
-    PushOneCommit.Result result4 = amendChange(changeId, "refs/for/master", "c.txt", "c");
-    String ps4 = result4.getCommit().name();
-
-    // 10th commit: Add (c7, c8) to PS4.
-    CommentInput c7 = newComment("c.txt", "comment 7");
-    CommentInput c8 = newComment("b.txt", "comment 8");
-    addComments(changeId, ps4, c7, c8);
-
-    // 11th commit: Add (c9) to PS2.
-    CommentInput c9 = newComment("b.txt", "comment 9");
-    addComments(changeId, ps2, c9);
-
-    List<CommentInfo> commentsBeforeDelete = getChangeSortedComments(changeId);
-    assertThat(commentsBeforeDelete).hasSize(9);
-    // PS1 has comments [c1, c2, c3, c4, c5].
-    assertThat(getRevisionComments(changeId, ps1)).hasSize(5);
-    // PS2 has comments [c6, c9].
-    assertThat(getRevisionComments(changeId, ps2)).hasSize(2);
-    // PS3 has no comment.
-    assertThat(getRevisionComments(changeId, ps3)).hasSize(0);
-    // PS4 has comments [c7, c8].
-    assertThat(getRevisionComments(changeId, ps4)).hasSize(2);
-
-    setApiUser(admin);
-    for (int i = 0; i < commentsBeforeDelete.size(); i++) {
-      List<RevCommit> commitsBeforeDelete = new ArrayList<>();
-      if (notesMigration.commitChangeWrites()) {
-        commitsBeforeDelete = getCommits(id);
-      }
-
-      CommentInfo comment = commentsBeforeDelete.get(i);
-      String uuid = comment.id;
-      int patchSet = comment.patchSet;
-      // 'oldComment' has some fields unset compared with 'comment'.
-      CommentInfo oldComment = gApi.changes().id(changeId).revision(patchSet).comment(uuid).get();
-
-      DeleteCommentInput input = new DeleteCommentInput("delete comment " + uuid);
-      CommentInfo updatedComment =
-          gApi.changes().id(changeId).revision(patchSet).comment(uuid).delete(input);
-
-      String expectedMsg =
-          String.format("Comment removed by: %s; Reason: %s", admin.fullName, input.reason);
-      assertThat(updatedComment.message).isEqualTo(expectedMsg);
-      oldComment.message = expectedMsg;
-      assertThat(updatedComment).isEqualTo(oldComment);
-
-      // Check the NoteDb state after the deletion.
-      if (notesMigration.commitChangeWrites()) {
-        assertMetaBranchCommitsAfterRewriting(commitsBeforeDelete, id, uuid, expectedMsg);
-      }
-
-      comment.message = expectedMsg;
-      commentsBeforeDelete.set(i, comment);
-      List<CommentInfo> commentsAfterDelete = getChangeSortedComments(changeId);
-      assertThat(commentsAfterDelete).isEqualTo(commentsBeforeDelete);
-    }
-
-    // Make sure that comments can still be added correctly.
-    CommentInput c10 = newComment("a.txt", "comment 10");
-    CommentInput c11 = newComment("b.txt", "comment 11");
-    CommentInput c12 = newComment("a.txt", "comment 12");
-    CommentInput c13 = newComment("c.txt", "comment 13");
-    addComments(changeId, ps1, c10);
-    addComments(changeId, ps2, c11);
-    addComments(changeId, ps3, c12);
-    addComments(changeId, ps4, c13);
-
-    assertThat(getChangeSortedComments(changeId)).hasSize(13);
-    assertThat(getRevisionComments(changeId, ps1)).hasSize(6);
-    assertThat(getRevisionComments(changeId, ps2)).hasSize(3);
-    assertThat(getRevisionComments(changeId, ps3)).hasSize(1);
-    assertThat(getRevisionComments(changeId, ps4)).hasSize(3);
-  }
-
-  @Test
-  public void deleteOneCommentMultipleTimes() throws Exception {
-    PushOneCommit.Result result = createChange();
-    Change.Id id = result.getChange().getId();
-    String changeId = result.getChangeId();
-    String ps1 = result.getCommit().name();
-
-    CommentInput c1 = newComment(FILE_NAME, "comment 1");
-    CommentInput c2 = newComment(FILE_NAME, "comment 2");
-    CommentInput c3 = newComment(FILE_NAME, "comment 3");
-    addComments(changeId, ps1, c1);
-    addComments(changeId, ps1, c2);
-    addComments(changeId, ps1, c3);
-
-    List<CommentInfo> commentsBeforeDelete = getChangeSortedComments(changeId);
-    assertThat(commentsBeforeDelete).hasSize(3);
-    Optional<CommentInfo> targetComment =
-        commentsBeforeDelete.stream().filter(c -> c.message.equals("comment 2")).findFirst();
-    assertThat(targetComment).isPresent();
-    String uuid = targetComment.get().id;
-    CommentInfo oldComment = gApi.changes().id(changeId).revision(ps1).comment(uuid).get();
-
-    List<RevCommit> commitsBeforeDelete = new ArrayList<>();
-    if (notesMigration.commitChangeWrites()) {
-      commitsBeforeDelete = getCommits(id);
-    }
-
-    setApiUser(admin);
-    for (int i = 0; i < 3; i++) {
-      DeleteCommentInput input = new DeleteCommentInput("delete comment 2, iteration: " + i);
-      gApi.changes().id(changeId).revision(ps1).comment(uuid).delete(input);
-    }
-
-    CommentInfo updatedComment = gApi.changes().id(changeId).revision(ps1).comment(uuid).get();
-    String expectedMsg =
-        String.format(
-            "Comment removed by: %s; Reason: %s", admin.fullName, "delete comment 2, iteration: 2");
-    assertThat(updatedComment.message).isEqualTo(expectedMsg);
-    oldComment.message = expectedMsg;
-    assertThat(updatedComment).isEqualTo(oldComment);
-
-    if (notesMigration.commitChangeWrites()) {
-      assertMetaBranchCommitsAfterRewriting(commitsBeforeDelete, id, uuid, expectedMsg);
-    }
-    assertThat(getChangeSortedComments(changeId)).hasSize(3);
-  }
-
-  private List<CommentInfo> getChangeSortedComments(String changeId) throws Exception {
-    List<CommentInfo> comments = new ArrayList<>();
-    Map<String, List<CommentInfo>> commentsMap = getPublishedComments(changeId);
-    for (Entry<String, List<CommentInfo>> e : commentsMap.entrySet()) {
-      for (CommentInfo c : e.getValue()) {
-        c.path = e.getKey(); // Set the comment's path field.
-        comments.add(c);
-      }
-    }
-    comments.sort(Comparator.comparing(c -> c.id));
-    return comments;
-  }
-
-  private List<CommentInfo> getRevisionComments(String changeId, String revId) throws Exception {
-    return getPublishedComments(changeId, revId).values().stream()
-        .flatMap(List::stream)
-        .collect(toList());
-  }
-
-  private CommentInput addComment(String changeId, String message) throws Exception {
-    ReviewInput input = new ReviewInput();
-    CommentInput comment = newComment(FILE_NAME, Side.REVISION, 0, message, false);
-    input.comments = ImmutableMap.of(comment.path, Lists.newArrayList(comment));
-    gApi.changes().id(changeId).current().review(input);
-    return comment;
-  }
-
-  private void addComments(String changeId, String revision, CommentInput... commentInputs)
-      throws Exception {
-    ReviewInput input = new ReviewInput();
-    input.comments = Arrays.stream(commentInputs).collect(groupingBy(c -> c.path));
-    gApi.changes().id(changeId).revision(revision).review(input);
-  }
-
-  private List<RevCommit> getCommits(Change.Id changeId) throws IOException {
-    try (Repository repo = repoManager.openRepository(project);
-        RevWalk revWalk = new RevWalk(repo)) {
-      Ref metaRef = repo.exactRef(RefNames.changeMetaRef(changeId));
-      revWalk.markStart(revWalk.parseCommit(metaRef.getObjectId()));
-      return Lists.newArrayList(revWalk);
-    }
-  }
-
-  /**
-   * All the commits, which contain the target comment before, should still contain the comment with
-   * the updated message. All the other metas of the commits should be exactly the same.
-   */
-  private void assertMetaBranchCommitsAfterRewriting(
-      List<RevCommit> beforeDelete,
-      Change.Id changeId,
-      String targetCommentUuid,
-      String expectedMessage)
-      throws Exception {
-    List<RevCommit> afterDelete = getCommits(changeId);
-    assertThat(afterDelete).hasSize(beforeDelete.size());
-
-    try (Repository repo = repoManager.openRepository(project);
-        ObjectReader reader = repo.newObjectReader()) {
-      for (int i = 0; i < beforeDelete.size(); i++) {
-        RevCommit commitBefore = beforeDelete.get(i);
-        RevCommit commitAfter = afterDelete.get(i);
-
-        Map<String, com.google.gerrit.reviewdb.client.Comment> commentMapBefore =
-            DeleteCommentRewriter.getPublishedComments(
-                noteUtil, changeId, reader, NoteMap.read(reader, commitBefore));
-        Map<String, com.google.gerrit.reviewdb.client.Comment> commentMapAfter =
-            DeleteCommentRewriter.getPublishedComments(
-                noteUtil, changeId, reader, NoteMap.read(reader, commitAfter));
-
-        if (commentMapBefore.containsKey(targetCommentUuid)) {
-          assertThat(commentMapAfter).containsKey(targetCommentUuid);
-          com.google.gerrit.reviewdb.client.Comment comment =
-              commentMapAfter.get(targetCommentUuid);
-          assertThat(comment.message).isEqualTo(expectedMessage);
-          comment.message = commentMapBefore.get(targetCommentUuid).message;
-          commentMapAfter.put(targetCommentUuid, comment);
-          assertThat(commentMapAfter).isEqualTo(commentMapBefore);
-        } else {
-          assertThat(commentMapAfter).doesNotContainKey(targetCommentUuid);
-        }
-
-        // Other metas should be exactly the same.
-        assertThat(commitAfter.getFullMessage()).isEqualTo(commitBefore.getFullMessage());
-        assertThat(commitAfter.getCommitterIdent()).isEqualTo(commitBefore.getCommitterIdent());
-        assertThat(commitAfter.getAuthorIdent()).isEqualTo(commitBefore.getAuthorIdent());
-        assertThat(commitAfter.getEncoding()).isEqualTo(commitBefore.getEncoding());
-        assertThat(commitAfter.getEncodingName()).isEqualTo(commitBefore.getEncodingName());
-      }
-    }
-  }
-
-  private static String extractComments(String msg) {
-    // Extract lines between start "....." and end "-- ".
-    Pattern p = Pattern.compile(".*[.]{5}\n+(.*)\\n+-- \n.*", Pattern.DOTALL);
-    Matcher m = p.matcher(msg);
-    return m.matches() ? m.group(1) : msg;
-  }
-
-  private ReviewInput newInput(CommentInput c) {
-    ReviewInput in = new ReviewInput();
-    in.comments = new HashMap<>();
-    in.comments.put(c.path, Lists.newArrayList(c));
-    return in;
-  }
-
-  private void addComment(PushOneCommit.Result r, String message) throws Exception {
-    addComment(r, message, false, false, null);
-  }
-
-  private void addComment(
-      PushOneCommit.Result r,
-      String message,
-      boolean omitDuplicateComments,
-      Boolean unresolved,
-      String inReplyTo)
-      throws Exception {
-    CommentInput c = new CommentInput();
-    c.line = 1;
-    c.message = message;
-    c.path = FILE_NAME;
-    c.unresolved = unresolved;
-    c.inReplyTo = inReplyTo;
-    ReviewInput in = newInput(c);
-    in.omitDuplicateComments = omitDuplicateComments;
-    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(in);
-  }
-
-  private CommentInfo addDraft(String changeId, String revId, DraftInput in) throws Exception {
-    return gApi.changes().id(changeId).revision(revId).createDraft(in).get();
-  }
-
-  private void updateDraft(String changeId, String revId, DraftInput in, String uuid)
-      throws Exception {
-    gApi.changes().id(changeId).revision(revId).draft(uuid).update(in);
-  }
-
-  private void deleteDraft(String changeId, String revId, String uuid) throws Exception {
-    gApi.changes().id(changeId).revision(revId).draft(uuid).delete();
-  }
-
-  private CommentInfo getPublishedComment(String changeId, String revId, String uuid)
-      throws Exception {
-    return gApi.changes().id(changeId).revision(revId).comment(uuid).get();
-  }
-
-  private Map<String, List<CommentInfo>> getPublishedComments(String changeId, String revId)
-      throws Exception {
-    return gApi.changes().id(changeId).revision(revId).comments();
-  }
-
-  private Map<String, List<CommentInfo>> getDraftComments(String changeId, String revId)
-      throws Exception {
-    return gApi.changes().id(changeId).revision(revId).drafts();
-  }
-
-  private Map<String, List<CommentInfo>> getPublishedComments(String changeId) throws Exception {
-    return gApi.changes().id(changeId).comments();
-  }
-
-  private CommentInfo getDraftComment(String changeId, String revId, String uuid) throws Exception {
-    return gApi.changes().id(changeId).revision(revId).draft(uuid).get();
-  }
-
-  private static CommentInput newComment(String file, String message) {
-    return newComment(file, Side.REVISION, 0, message, false);
-  }
-
-  private static CommentInput newComment(
-      String path, Side side, int line, String message, Boolean unresolved) {
-    CommentInput c = new CommentInput();
-    return populate(c, path, side, null, line, message, unresolved);
-  }
-
-  private static CommentInput newCommentOnParent(
-      String path, int parent, int line, String message) {
-    CommentInput c = new CommentInput();
-    return populate(c, path, Side.PARENT, Integer.valueOf(parent), line, message, false);
-  }
-
-  private DraftInput newDraft(String path, Side side, int line, String message) {
-    DraftInput d = new DraftInput();
-    return populate(d, path, side, null, line, message, false);
-  }
-
-  private DraftInput newDraftOnParent(String path, int parent, int line, String message) {
-    DraftInput d = new DraftInput();
-    return populate(d, path, Side.PARENT, Integer.valueOf(parent), line, message, false);
-  }
-
-  private static <C extends Comment> C populate(
-      C c, String path, Side side, Integer parent, int line, String message, Boolean unresolved) {
-    c.path = path;
-    c.side = side;
-    c.parent = parent;
-    c.line = line != 0 ? line : null;
-    c.message = message;
-    c.unresolved = unresolved;
-    if (line != 0) {
-      Comment.Range range = new Comment.Range();
-      range.startLine = line;
-      range.startCharacter = 1;
-      range.endLine = line;
-      range.endCharacter = 5;
-      c.range = range;
-    }
-    return c;
-  }
-
-  private static Function<CommentInfo, CommentInput> infoToInput(String path) {
-    return infoToInput(path, CommentInput::new);
-  }
-
-  private static Function<CommentInfo, DraftInput> infoToDraft(String path) {
-    return infoToInput(path, DraftInput::new);
-  }
-
-  private static <I extends Comment> Function<CommentInfo, I> infoToInput(
-      String path, Supplier<I> supplier) {
-    return info -> {
-      I i = supplier.get();
-      i.path = path;
-      copy(info, i);
-      return i;
-    };
-  }
-
-  private static void copy(Comment from, Comment to) {
-    to.side = from.side == null ? Side.REVISION : from.side;
-    to.parent = from.parent;
-    to.line = from.line;
-    to.message = from.message;
-    to.range = from.range;
-    to.unresolved = from.unresolved;
-    to.inReplyTo = from.inReplyTo;
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/ConsistencyCheckerIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/ConsistencyCheckerIT.java
deleted file mode 100644
index ed64ce0..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/ConsistencyCheckerIT.java
+++ /dev/null
@@ -1,964 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.acceptance.server.change;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.TruthJUnit.assume;
-import static com.google.gerrit.extensions.common.ProblemInfo.Status.FIXED;
-import static com.google.gerrit.extensions.common.ProblemInfo.Status.FIX_FAILED;
-import static com.google.gerrit.testutil.TestChanges.newPatchSet;
-import static java.util.Collections.singleton;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.TestAccount;
-import com.google.gerrit.common.FooterConstants;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.api.changes.FixInput;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.client.ChangeStatus;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.ProblemInfo;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.ChangeUtil;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.Sequences;
-import com.google.gerrit.server.account.AccountsUpdate;
-import com.google.gerrit.server.change.ChangeInserter;
-import com.google.gerrit.server.change.ConsistencyChecker;
-import com.google.gerrit.server.change.PatchSetInserter;
-import com.google.gerrit.server.config.AnonymousCowardName;
-import com.google.gerrit.server.notedb.ChangeNoteUtil;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.RepoContext;
-import com.google.gerrit.testutil.InMemoryRepositoryManager;
-import com.google.gerrit.testutil.NoteDbMode;
-import com.google.gerrit.testutil.TestChanges;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.junit.Before;
-import org.junit.Test;
-
-@NoHttpd
-public class ConsistencyCheckerIT extends AbstractDaemonTest {
-  @Inject private ChangeNotes.Factory changeNotesFactory;
-
-  @Inject private Provider<ConsistencyChecker> checkerProvider;
-
-  @Inject private IdentifiedUser.GenericFactory userFactory;
-
-  @Inject private ChangeInserter.Factory changeInserterFactory;
-
-  @Inject private PatchSetInserter.Factory patchSetInserterFactory;
-
-  @Inject private ChangeNoteUtil noteUtil;
-
-  @Inject @AnonymousCowardName private String anonymousCowardName;
-
-  @Inject private Sequences sequences;
-
-  @Inject private AccountsUpdate.Server accountsUpdate;
-
-  private RevCommit tip;
-  private Account.Id adminId;
-  private ConsistencyChecker checker;
-
-  private void assumeNoteDbDisabled() {
-    assume().that(notesMigration.readChanges()).isFalse();
-    assume().that(NoteDbMode.get()).isNotEqualTo(NoteDbMode.CHECK);
-  }
-
-  @Before
-  public void setUp() throws Exception {
-    // Ignore client clone of project; repurpose as server-side TestRepository.
-    testRepo = new TestRepository<>((InMemoryRepository) repoManager.openRepository(project));
-    tip =
-        testRepo.getRevWalk().parseCommit(testRepo.getRepository().exactRef("HEAD").getObjectId());
-    adminId = admin.getId();
-    checker = checkerProvider.get();
-  }
-
-  @Test
-  public void validNewChange() throws Exception {
-    assertNoProblems(insertChange(), null);
-  }
-
-  @Test
-  public void validMergedChange() throws Exception {
-    ChangeNotes notes = mergeChange(incrementPatchSet(insertChange()));
-    assertNoProblems(notes, null);
-  }
-
-  @Test
-  public void missingOwner() throws Exception {
-    TestAccount owner = accountCreator.create("missing");
-    ChangeNotes notes = insertChange(owner);
-    accountsUpdate.create().deleteByKey(owner.getId());
-
-    assertProblems(notes, null, problem("Missing change owner: " + owner.getId()));
-  }
-
-  @Test
-  public void missingRepo() throws Exception {
-    // NoteDb can't have a change without a repo.
-    assumeNoteDbDisabled();
-
-    ChangeNotes notes = insertChange();
-    Project.NameKey name = notes.getProjectName();
-    ((InMemoryRepositoryManager) repoManager).deleteRepository(name);
-    assertThat(checker.check(notes, null).problems())
-        .containsExactly(problem("Destination repository not found: " + name));
-  }
-
-  @Test
-  public void invalidRevision() throws Exception {
-    // NoteDb always parses the revision when inserting a patch set, so we can't
-    // create an invalid patch set.
-    assumeNoteDbDisabled();
-
-    ChangeNotes notes = insertChange();
-    PatchSet ps =
-        newPatchSet(
-            notes.getChange().currentPatchSetId(),
-            "fooooooooooooooooooooooooooooooooooooooo",
-            adminId);
-    db.patchSets().update(singleton(ps));
-
-    assertProblems(
-        notes,
-        null,
-        problem("Invalid revision on patch set 1: fooooooooooooooooooooooooooooooooooooooo"));
-  }
-
-  // No test for ref existing but object missing; InMemoryRepository won't let
-  // us do such a thing.
-
-  @Test
-  public void patchSetObjectAndRefMissing() throws Exception {
-    String rev = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef";
-    ChangeNotes notes = insertChange();
-    PatchSet ps = insertMissingPatchSet(notes, rev);
-    notes = reload(notes);
-    assertProblems(
-        notes,
-        null,
-        problem("Ref missing: " + ps.getId().toRefName()),
-        problem("Object missing: patch set 2: deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
-  }
-
-  @Test
-  public void patchSetObjectAndRefMissingWithFix() throws Exception {
-    String rev = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef";
-    ChangeNotes notes = insertChange();
-    PatchSet ps = insertMissingPatchSet(notes, rev);
-    notes = reload(notes);
-
-    String refName = ps.getId().toRefName();
-    assertProblems(
-        notes,
-        new FixInput(),
-        problem("Ref missing: " + refName),
-        problem("Object missing: patch set 2: " + rev));
-  }
-
-  @Test
-  public void patchSetRefMissing() throws Exception {
-    ChangeNotes notes = insertChange();
-    testRepo.update(
-        "refs/other/foo", ObjectId.fromString(psUtil.current(db, notes).getRevision().get()));
-    String refName = notes.getChange().currentPatchSetId().toRefName();
-    deleteRef(refName);
-
-    assertProblems(notes, null, problem("Ref missing: " + refName));
-  }
-
-  @Test
-  public void patchSetRefMissingWithFix() throws Exception {
-    ChangeNotes notes = insertChange();
-    String rev = psUtil.current(db, notes).getRevision().get();
-    testRepo.update("refs/other/foo", ObjectId.fromString(rev));
-    String refName = notes.getChange().currentPatchSetId().toRefName();
-    deleteRef(refName);
-
-    assertProblems(
-        notes, new FixInput(), problem("Ref missing: " + refName, FIXED, "Repaired patch set ref"));
-    assertThat(testRepo.getRepository().exactRef(refName).getObjectId().name()).isEqualTo(rev);
-  }
-
-  @Test
-  public void patchSetObjectAndRefMissingWithDeletingPatchSet() throws Exception {
-    ChangeNotes notes = insertChange();
-    PatchSet ps1 = psUtil.current(db, notes);
-
-    String rev2 = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef";
-    PatchSet ps2 = insertMissingPatchSet(notes, rev2);
-    notes = reload(notes);
-
-    FixInput fix = new FixInput();
-    fix.deletePatchSetIfCommitMissing = true;
-    assertProblems(
-        notes,
-        fix,
-        problem("Ref missing: " + ps2.getId().toRefName()),
-        problem("Object missing: patch set 2: " + rev2, FIXED, "Deleted patch set"));
-
-    notes = reload(notes);
-    assertThat(notes.getChange().currentPatchSetId().get()).isEqualTo(1);
-    assertThat(psUtil.get(db, notes, ps1.getId())).isNotNull();
-    assertThat(psUtil.get(db, notes, ps2.getId())).isNull();
-  }
-
-  @Test
-  public void patchSetMultipleObjectsMissingWithDeletingPatchSets() throws Exception {
-    ChangeNotes notes = insertChange();
-    PatchSet ps1 = psUtil.current(db, notes);
-
-    String rev2 = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef";
-    PatchSet ps2 = insertMissingPatchSet(notes, rev2);
-
-    notes = incrementPatchSet(reload(notes));
-    PatchSet ps3 = psUtil.current(db, notes);
-
-    String rev4 = "c0ffeeeec0ffeeeec0ffeeeec0ffeeeec0ffeeee";
-    PatchSet ps4 = insertMissingPatchSet(notes, rev4);
-    notes = reload(notes);
-
-    FixInput fix = new FixInput();
-    fix.deletePatchSetIfCommitMissing = true;
-    assertProblems(
-        notes,
-        fix,
-        problem("Ref missing: " + ps2.getId().toRefName()),
-        problem("Object missing: patch set 2: " + rev2, FIXED, "Deleted patch set"),
-        problem("Ref missing: " + ps4.getId().toRefName()),
-        problem("Object missing: patch set 4: " + rev4, FIXED, "Deleted patch set"));
-
-    notes = reload(notes);
-    assertThat(notes.getChange().currentPatchSetId().get()).isEqualTo(3);
-    assertThat(psUtil.get(db, notes, ps1.getId())).isNotNull();
-    assertThat(psUtil.get(db, notes, ps2.getId())).isNull();
-    assertThat(psUtil.get(db, notes, ps3.getId())).isNotNull();
-    assertThat(psUtil.get(db, notes, ps4.getId())).isNull();
-  }
-
-  @Test
-  public void onlyPatchSetObjectMissingWithFix() throws Exception {
-    Change c = TestChanges.newChange(project, admin.getId(), sequences.nextChangeId());
-
-    // Set review started, mimicking Schema_153, so tests pass with NoteDbMode.CHECK.
-    c.setReviewStarted(true);
-
-    PatchSet.Id psId = c.currentPatchSetId();
-    String rev = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef";
-    PatchSet ps = newPatchSet(psId, rev, adminId);
-
-    if (notesMigration.changePrimaryStorage() == PrimaryStorage.REVIEW_DB) {
-      db.changes().insert(singleton(c));
-      db.patchSets().insert(singleton(ps));
-    }
-    addNoteDbCommit(
-        c.getId(),
-        "Create change\n"
-            + "\n"
-            + "Patch-set: 1\n"
-            + "Branch: "
-            + c.getDest().get()
-            + "\n"
-            + "Change-id: "
-            + c.getKey().get()
-            + "\n"
-            + "Subject: Bogus subject\n"
-            + "Commit: "
-            + rev
-            + "\n"
-            + "Groups: "
-            + rev
-            + "\n");
-    indexer.index(db, c.getProject(), c.getId());
-    ChangeNotes notes = changeNotesFactory.create(db, c.getProject(), c.getId());
-
-    FixInput fix = new FixInput();
-    fix.deletePatchSetIfCommitMissing = true;
-    assertProblems(
-        notes,
-        fix,
-        problem("Ref missing: " + ps.getId().toRefName()),
-        problem(
-            "Object missing: patch set 1: " + rev,
-            FIX_FAILED,
-            "Cannot delete patch set; no patch sets would remain"));
-
-    notes = reload(notes);
-    assertThat(notes.getChange().currentPatchSetId().get()).isEqualTo(1);
-    assertThat(psUtil.current(db, notes)).isNotNull();
-  }
-
-  @Test
-  public void currentPatchSetMissing() throws Exception {
-    // NoteDb can't create a change without a patch set.
-    assumeNoteDbDisabled();
-
-    ChangeNotes notes = insertChange();
-    db.patchSets().deleteKeys(singleton(notes.getChange().currentPatchSetId()));
-    assertProblems(notes, null, problem("Current patch set 1 not found"));
-  }
-
-  @Test
-  public void duplicatePatchSetRevisions() throws Exception {
-    ChangeNotes notes = insertChange();
-    PatchSet ps1 = psUtil.current(db, notes);
-    String rev = ps1.getRevision().get();
-
-    notes = incrementPatchSet(notes, testRepo.getRevWalk().parseCommit(ObjectId.fromString(rev)));
-
-    assertProblems(notes, null, problem("Multiple patch sets pointing to " + rev + ": [1, 2]"));
-  }
-
-  @Test
-  public void missingDestRef() throws Exception {
-    ChangeNotes notes = insertChange();
-
-    String ref = "refs/heads/master";
-    // Detach head so we're allowed to delete ref.
-    testRepo.reset(testRepo.getRepository().exactRef(ref).getObjectId());
-    RefUpdate ru = testRepo.getRepository().updateRef(ref);
-    ru.setForceUpdate(true);
-    assertThat(ru.delete()).isEqualTo(RefUpdate.Result.FORCED);
-
-    assertProblems(notes, null, problem("Destination ref not found (may be new branch): " + ref));
-  }
-
-  @Test
-  public void mergedChangeIsNotMerged() throws Exception {
-    ChangeNotes notes = insertChange();
-
-    try (BatchUpdate bu = newUpdate(adminId)) {
-      bu.addOp(
-          notes.getChangeId(),
-          new BatchUpdateOp() {
-            @Override
-            public boolean updateChange(ChangeContext ctx) throws OrmException {
-              ctx.getChange().setStatus(Change.Status.MERGED);
-              ctx.getUpdate(ctx.getChange().currentPatchSetId()).fixStatus(Change.Status.MERGED);
-              return true;
-            }
-          });
-      bu.execute();
-    }
-    notes = reload(notes);
-
-    String rev = psUtil.current(db, notes).getRevision().get();
-    ObjectId tip = getDestRef(notes);
-    assertProblems(
-        notes,
-        null,
-        problem(
-            "Patch set 1 ("
-                + rev
-                + ") is not merged into destination ref"
-                + " refs/heads/master ("
-                + tip.name()
-                + "), but change status is MERGED"));
-  }
-
-  @Test
-  public void newChangeIsMerged() throws Exception {
-    ChangeNotes notes = insertChange();
-    String rev = psUtil.current(db, notes).getRevision().get();
-    testRepo
-        .branch(notes.getChange().getDest().get())
-        .update(testRepo.getRevWalk().parseCommit(ObjectId.fromString(rev)));
-
-    assertProblems(
-        notes,
-        null,
-        problem(
-            "Patch set 1 ("
-                + rev
-                + ") is merged into destination ref"
-                + " refs/heads/master ("
-                + rev
-                + "), but change status is NEW"));
-  }
-
-  @Test
-  public void newChangeIsMergedWithFix() throws Exception {
-    ChangeNotes notes = insertChange();
-    String rev = psUtil.current(db, notes).getRevision().get();
-    testRepo
-        .branch(notes.getChange().getDest().get())
-        .update(testRepo.getRevWalk().parseCommit(ObjectId.fromString(rev)));
-
-    assertProblems(
-        notes,
-        new FixInput(),
-        problem(
-            "Patch set 1 ("
-                + rev
-                + ") is merged into destination ref"
-                + " refs/heads/master ("
-                + rev
-                + "), but change status is NEW",
-            FIXED,
-            "Marked change as merged"));
-
-    notes = reload(notes);
-    assertThat(notes.getChange().getStatus()).isEqualTo(Change.Status.MERGED);
-    assertNoProblems(notes, null);
-  }
-
-  @Test
-  public void extensionApiReturnsUpdatedValueAfterFix() throws Exception {
-    ChangeNotes notes = insertChange();
-    String rev = psUtil.current(db, notes).getRevision().get();
-    testRepo
-        .branch(notes.getChange().getDest().get())
-        .update(testRepo.getRevWalk().parseCommit(ObjectId.fromString(rev)));
-
-    ChangeInfo info = gApi.changes().id(notes.getChangeId().get()).info();
-    assertThat(info.status).isEqualTo(ChangeStatus.NEW);
-
-    info = gApi.changes().id(notes.getChangeId().get()).check(new FixInput());
-    assertThat(info.status).isEqualTo(ChangeStatus.MERGED);
-  }
-
-  @Test
-  public void expectedMergedCommitIsLatestPatchSet() throws Exception {
-    ChangeNotes notes = insertChange();
-    String rev = psUtil.current(db, notes).getRevision().get();
-    testRepo
-        .branch(notes.getChange().getDest().get())
-        .update(testRepo.getRevWalk().parseCommit(ObjectId.fromString(rev)));
-
-    FixInput fix = new FixInput();
-    fix.expectMergedAs = rev;
-    assertProblems(
-        notes,
-        fix,
-        problem(
-            "Patch set 1 ("
-                + rev
-                + ") is merged into destination ref"
-                + " refs/heads/master ("
-                + rev
-                + "), but change status is NEW",
-            FIXED,
-            "Marked change as merged"));
-
-    notes = reload(notes);
-    assertThat(notes.getChange().getStatus()).isEqualTo(Change.Status.MERGED);
-    assertNoProblems(notes, null);
-  }
-
-  @Test
-  public void expectedMergedCommitNotMergedIntoDestination() throws Exception {
-    ChangeNotes notes = insertChange();
-    String rev = psUtil.current(db, notes).getRevision().get();
-    RevCommit commit = testRepo.getRevWalk().parseCommit(ObjectId.fromString(rev));
-    testRepo.branch(notes.getChange().getDest().get()).update(commit);
-
-    FixInput fix = new FixInput();
-    RevCommit other = testRepo.commit().message(commit.getFullMessage()).create();
-    fix.expectMergedAs = other.name();
-    assertProblems(
-        notes,
-        fix,
-        problem(
-            "Expected merged commit "
-                + other.name()
-                + " is not merged into destination ref refs/heads/master"
-                + " ("
-                + commit.name()
-                + ")"));
-  }
-
-  @Test
-  public void createNewPatchSetForExpectedMergeCommitWithNoChangeId() throws Exception {
-    ChangeNotes notes = insertChange();
-    String dest = notes.getChange().getDest().get();
-    String rev = psUtil.current(db, notes).getRevision().get();
-    RevCommit commit = testRepo.getRevWalk().parseCommit(ObjectId.fromString(rev));
-
-    RevCommit mergedAs =
-        testRepo.commit().parent(commit.getParent(0)).message(commit.getShortMessage()).create();
-    testRepo.getRevWalk().parseBody(mergedAs);
-    assertThat(mergedAs.getFooterLines(FooterConstants.CHANGE_ID)).isEmpty();
-    testRepo.update(dest, mergedAs);
-
-    assertNoProblems(notes, null);
-
-    FixInput fix = new FixInput();
-    fix.expectMergedAs = mergedAs.name();
-    assertProblems(
-        notes,
-        fix,
-        problem(
-            "No patch set found for merged commit " + mergedAs.name(),
-            FIXED,
-            "Marked change as merged"),
-        problem(
-            "Expected merged commit " + mergedAs.name() + " has no associated patch set",
-            FIXED,
-            "Inserted as patch set 2"));
-
-    notes = reload(notes);
-    PatchSet.Id psId2 = new PatchSet.Id(notes.getChangeId(), 2);
-    assertThat(notes.getChange().currentPatchSetId()).isEqualTo(psId2);
-    assertThat(psUtil.get(db, notes, psId2).getRevision().get()).isEqualTo(mergedAs.name());
-
-    assertNoProblems(notes, null);
-  }
-
-  @Test
-  public void createNewPatchSetForExpectedMergeCommitWithChangeId() throws Exception {
-    ChangeNotes notes = insertChange();
-    String dest = notes.getChange().getDest().get();
-    String rev = psUtil.current(db, notes).getRevision().get();
-    RevCommit commit = testRepo.getRevWalk().parseCommit(ObjectId.fromString(rev));
-
-    RevCommit mergedAs =
-        testRepo
-            .commit()
-            .parent(commit.getParent(0))
-            .message(
-                commit.getShortMessage()
-                    + "\n"
-                    + "\n"
-                    + "Change-Id: "
-                    + notes.getChange().getKey().get()
-                    + "\n")
-            .create();
-    testRepo.getRevWalk().parseBody(mergedAs);
-    assertThat(mergedAs.getFooterLines(FooterConstants.CHANGE_ID))
-        .containsExactly(notes.getChange().getKey().get());
-    testRepo.update(dest, mergedAs);
-
-    assertNoProblems(notes, null);
-
-    FixInput fix = new FixInput();
-    fix.expectMergedAs = mergedAs.name();
-    assertProblems(
-        notes,
-        fix,
-        problem(
-            "No patch set found for merged commit " + mergedAs.name(),
-            FIXED,
-            "Marked change as merged"),
-        problem(
-            "Expected merged commit " + mergedAs.name() + " has no associated patch set",
-            FIXED,
-            "Inserted as patch set 2"));
-
-    notes = reload(notes);
-    PatchSet.Id psId2 = new PatchSet.Id(notes.getChangeId(), 2);
-    assertThat(notes.getChange().currentPatchSetId()).isEqualTo(psId2);
-    assertThat(psUtil.get(db, notes, psId2).getRevision().get()).isEqualTo(mergedAs.name());
-
-    assertNoProblems(notes, null);
-  }
-
-  @Test
-  public void expectedMergedCommitIsOldPatchSetOfSameChange() throws Exception {
-    ChangeNotes notes = insertChange();
-    PatchSet ps1 = psUtil.current(db, notes);
-    String rev1 = ps1.getRevision().get();
-    notes = incrementPatchSet(notes);
-    PatchSet ps2 = psUtil.current(db, notes);
-    testRepo
-        .branch(notes.getChange().getDest().get())
-        .update(testRepo.getRevWalk().parseCommit(ObjectId.fromString(rev1)));
-
-    FixInput fix = new FixInput();
-    fix.expectMergedAs = rev1;
-    assertProblems(
-        notes,
-        fix,
-        problem("No patch set found for merged commit " + rev1, FIXED, "Marked change as merged"),
-        problem(
-            "Expected merge commit "
-                + rev1
-                + " corresponds to patch set 1,"
-                + " not the current patch set 2",
-            FIXED,
-            "Deleted patch set"),
-        problem(
-            "Expected merge commit "
-                + rev1
-                + " corresponds to patch set 1,"
-                + " not the current patch set 2",
-            FIXED,
-            "Inserted as patch set 3"));
-
-    notes = reload(notes);
-    PatchSet.Id psId3 = new PatchSet.Id(notes.getChangeId(), 3);
-    assertThat(notes.getChange().currentPatchSetId()).isEqualTo(psId3);
-    assertThat(notes.getChange().getStatus()).isEqualTo(Change.Status.MERGED);
-    assertThat(psUtil.byChangeAsMap(db, notes).keySet()).containsExactly(ps2.getId(), psId3);
-    assertThat(psUtil.get(db, notes, psId3).getRevision().get()).isEqualTo(rev1);
-  }
-
-  @Test
-  public void expectedMergedCommitIsDanglingPatchSetOlderThanCurrent() throws Exception {
-    ChangeNotes notes = insertChange();
-    PatchSet ps1 = psUtil.current(db, notes);
-
-    // Create dangling ref so next ID in the database becomes 3.
-    PatchSet.Id psId2 = new PatchSet.Id(notes.getChangeId(), 2);
-    RevCommit commit2 = patchSetCommit(psId2);
-    String rev2 = commit2.name();
-    testRepo.branch(psId2.toRefName()).update(commit2);
-
-    notes = incrementPatchSet(notes);
-    PatchSet ps3 = psUtil.current(db, notes);
-    assertThat(ps3.getId().get()).isEqualTo(3);
-
-    testRepo
-        .branch(notes.getChange().getDest().get())
-        .update(testRepo.getRevWalk().parseCommit(ObjectId.fromString(rev2)));
-
-    FixInput fix = new FixInput();
-    fix.expectMergedAs = rev2;
-    assertProblems(
-        notes,
-        fix,
-        problem("No patch set found for merged commit " + rev2, FIXED, "Marked change as merged"),
-        problem(
-            "Expected merge commit "
-                + rev2
-                + " corresponds to patch set 2,"
-                + " not the current patch set 3",
-            FIXED,
-            "Deleted patch set"),
-        problem(
-            "Expected merge commit "
-                + rev2
-                + " corresponds to patch set 2,"
-                + " not the current patch set 3",
-            FIXED,
-            "Inserted as patch set 4"));
-
-    notes = reload(notes);
-    PatchSet.Id psId4 = new PatchSet.Id(notes.getChangeId(), 4);
-    assertThat(notes.getChange().currentPatchSetId()).isEqualTo(psId4);
-    assertThat(notes.getChange().getStatus()).isEqualTo(Change.Status.MERGED);
-    assertThat(psUtil.byChangeAsMap(db, notes).keySet())
-        .containsExactly(ps1.getId(), ps3.getId(), psId4);
-    assertThat(psUtil.get(db, notes, psId4).getRevision().get()).isEqualTo(rev2);
-  }
-
-  @Test
-  public void expectedMergedCommitIsDanglingPatchSetNewerThanCurrent() throws Exception {
-    ChangeNotes notes = insertChange();
-    PatchSet ps1 = psUtil.current(db, notes);
-
-    // Create dangling ref with no patch set.
-    PatchSet.Id psId2 = new PatchSet.Id(notes.getChangeId(), 2);
-    RevCommit commit2 = patchSetCommit(psId2);
-    String rev2 = commit2.name();
-    testRepo.branch(psId2.toRefName()).update(commit2);
-
-    testRepo
-        .branch(notes.getChange().getDest().get())
-        .update(testRepo.getRevWalk().parseCommit(ObjectId.fromString(rev2)));
-
-    FixInput fix = new FixInput();
-    fix.expectMergedAs = rev2;
-    assertProblems(
-        notes,
-        fix,
-        problem("No patch set found for merged commit " + rev2, FIXED, "Marked change as merged"),
-        problem(
-            "Expected merge commit "
-                + rev2
-                + " corresponds to patch set 2,"
-                + " not the current patch set 1",
-            FIXED,
-            "Inserted as patch set 2"));
-
-    notes = reload(notes);
-    assertThat(notes.getChange().currentPatchSetId()).isEqualTo(psId2);
-    assertThat(notes.getChange().getStatus()).isEqualTo(Change.Status.MERGED);
-    assertThat(psUtil.byChangeAsMap(db, notes).keySet()).containsExactly(ps1.getId(), psId2);
-    assertThat(psUtil.get(db, notes, psId2).getRevision().get()).isEqualTo(rev2);
-  }
-
-  @Test
-  public void expectedMergedCommitWithMismatchedChangeId() throws Exception {
-    ChangeNotes notes = insertChange();
-    String dest = notes.getChange().getDest().get();
-    RevCommit parent = testRepo.branch(dest).commit().message("parent").create();
-    String rev = psUtil.current(db, notes).getRevision().get();
-    RevCommit commit = testRepo.getRevWalk().parseCommit(ObjectId.fromString(rev));
-    testRepo.branch(dest).update(commit);
-
-    String badId = "I0000000000000000000000000000000000000000";
-    RevCommit mergedAs =
-        testRepo
-            .commit()
-            .parent(parent)
-            .message(commit.getShortMessage() + "\n\nChange-Id: " + badId + "\n")
-            .create();
-    testRepo.getRevWalk().parseBody(mergedAs);
-    assertThat(mergedAs.getFooterLines(FooterConstants.CHANGE_ID)).containsExactly(badId);
-    testRepo.update(dest, mergedAs);
-
-    assertNoProblems(notes, null);
-
-    FixInput fix = new FixInput();
-    fix.expectMergedAs = mergedAs.name();
-    assertProblems(
-        notes,
-        fix,
-        problem(
-            "Expected merged commit "
-                + mergedAs.name()
-                + " has Change-Id: "
-                + badId
-                + ", but expected "
-                + notes.getChange().getKey().get()));
-  }
-
-  @Test
-  public void expectedMergedCommitMatchesMultiplePatchSets() throws Exception {
-    ChangeNotes notes1 = insertChange();
-    PatchSet.Id psId1 = psUtil.current(db, notes1).getId();
-    String dest = notes1.getChange().getDest().get();
-    String rev = psUtil.current(db, notes1).getRevision().get();
-    RevCommit commit = testRepo.getRevWalk().parseCommit(ObjectId.fromString(rev));
-    testRepo.branch(dest).update(commit);
-
-    ChangeNotes notes2 = insertChange();
-    notes2 = incrementPatchSet(notes2, commit);
-    PatchSet.Id psId2 = psUtil.current(db, notes2).getId();
-
-    ChangeNotes notes3 = insertChange();
-    notes3 = incrementPatchSet(notes3, commit);
-    PatchSet.Id psId3 = psUtil.current(db, notes3).getId();
-
-    FixInput fix = new FixInput();
-    fix.expectMergedAs = commit.name();
-    assertProblems(
-        notes1,
-        fix,
-        problem(
-            "Multiple patch sets for expected merged commit "
-                + commit.name()
-                + ": ["
-                + psId1
-                + ", "
-                + psId2
-                + ", "
-                + psId3
-                + "]"));
-  }
-
-  private BatchUpdate newUpdate(Account.Id owner) {
-    return batchUpdateFactory.create(db, project, userFactory.create(owner), TimeUtil.nowTs());
-  }
-
-  private ChangeNotes insertChange() throws Exception {
-    return insertChange(admin);
-  }
-
-  private ChangeNotes insertChange(TestAccount owner) throws Exception {
-    return insertChange(owner, "refs/heads/master");
-  }
-
-  private ChangeNotes insertChange(TestAccount owner, String dest) throws Exception {
-    Change.Id id = new Change.Id(sequences.nextChangeId());
-    ChangeInserter ins;
-    try (BatchUpdate bu = newUpdate(owner.getId())) {
-      RevCommit commit = patchSetCommit(new PatchSet.Id(id, 1));
-      ins =
-          changeInserterFactory
-              .create(id, commit, dest)
-              .setValidate(false)
-              .setNotify(NotifyHandling.NONE)
-              .setFireRevisionCreated(false)
-              .setSendMail(false);
-      bu.insertChange(ins).execute();
-    }
-    return changeNotesFactory.create(db, project, ins.getChange().getId());
-  }
-
-  private PatchSet.Id nextPatchSetId(ChangeNotes notes) throws Exception {
-    return ChangeUtil.nextPatchSetId(
-        testRepo.getRepository(), notes.getChange().currentPatchSetId());
-  }
-
-  private ChangeNotes incrementPatchSet(ChangeNotes notes) throws Exception {
-    return incrementPatchSet(notes, patchSetCommit(nextPatchSetId(notes)));
-  }
-
-  private ChangeNotes incrementPatchSet(ChangeNotes notes, RevCommit commit) throws Exception {
-    PatchSetInserter ins;
-    try (BatchUpdate bu = newUpdate(notes.getChange().getOwner())) {
-      ins =
-          patchSetInserterFactory
-              .create(notes, nextPatchSetId(notes), commit)
-              .setValidate(false)
-              .setFireRevisionCreated(false)
-              .setNotify(NotifyHandling.NONE);
-      bu.addOp(notes.getChangeId(), ins).execute();
-    }
-    return reload(notes);
-  }
-
-  private ChangeNotes reload(ChangeNotes notes) throws Exception {
-    return changeNotesFactory.create(db, notes.getChange().getProject(), notes.getChangeId());
-  }
-
-  private RevCommit patchSetCommit(PatchSet.Id psId) throws Exception {
-    RevCommit c = testRepo.commit().parent(tip).message("Change " + psId).create();
-    return testRepo.parseBody(c);
-  }
-
-  private PatchSet insertMissingPatchSet(ChangeNotes notes, String rev) throws Exception {
-    // Don't use BatchUpdate since we're manually updating the meta ref rather
-    // than using ChangeUpdate.
-    String subject = "Subject for missing commit";
-    Change c = new Change(notes.getChange());
-    PatchSet.Id psId = nextPatchSetId(notes);
-    c.setCurrentPatchSet(psId, subject, c.getOriginalSubject());
-    PatchSet ps = newPatchSet(psId, rev, adminId);
-
-    if (PrimaryStorage.of(c) == PrimaryStorage.REVIEW_DB) {
-      db.patchSets().insert(singleton(ps));
-      db.changes().update(singleton(c));
-    }
-
-    addNoteDbCommit(
-        c.getId(),
-        "Update patch set "
-            + psId.get()
-            + "\n"
-            + "\n"
-            + "Patch-set: "
-            + psId.get()
-            + "\n"
-            + "Commit: "
-            + rev
-            + "\n"
-            + "Subject: "
-            + subject
-            + "\n");
-    indexer.index(db, c.getProject(), c.getId());
-
-    return ps;
-  }
-
-  private void deleteRef(String refName) throws Exception {
-    RefUpdate ru = testRepo.getRepository().updateRef(refName, true);
-    ru.setForceUpdate(true);
-    assertThat(ru.delete()).isEqualTo(RefUpdate.Result.FORCED);
-  }
-
-  private void addNoteDbCommit(Change.Id id, String commitMessage) throws Exception {
-    if (!notesMigration.commitChangeWrites()) {
-      return;
-    }
-    PersonIdent committer = serverIdent.get();
-    PersonIdent author =
-        noteUtil.newIdent(
-            accountCache.get(admin.getId()).getAccount(),
-            committer.getWhen(),
-            committer,
-            anonymousCowardName);
-    testRepo
-        .branch(RefNames.changeMetaRef(id))
-        .commit()
-        .author(author)
-        .committer(committer)
-        .message(commitMessage)
-        .create();
-  }
-
-  private ObjectId getDestRef(ChangeNotes notes) throws Exception {
-    return testRepo.getRepository().exactRef(notes.getChange().getDest().get()).getObjectId();
-  }
-
-  private ChangeNotes mergeChange(ChangeNotes notes) throws Exception {
-    final ObjectId oldId = getDestRef(notes);
-    final ObjectId newId = ObjectId.fromString(psUtil.current(db, notes).getRevision().get());
-    final String dest = notes.getChange().getDest().get();
-
-    try (BatchUpdate bu = newUpdate(adminId)) {
-      bu.addOp(
-          notes.getChangeId(),
-          new BatchUpdateOp() {
-            @Override
-            public void updateRepo(RepoContext ctx) throws IOException {
-              ctx.addRefUpdate(oldId, newId, dest);
-            }
-
-            @Override
-            public boolean updateChange(ChangeContext ctx) throws OrmException {
-              ctx.getChange().setStatus(Change.Status.MERGED);
-              ctx.getUpdate(ctx.getChange().currentPatchSetId()).fixStatus(Change.Status.MERGED);
-              return true;
-            }
-          });
-      bu.execute();
-    }
-    return reload(notes);
-  }
-
-  private static ProblemInfo problem(String message) {
-    ProblemInfo p = new ProblemInfo();
-    p.message = message;
-    return p;
-  }
-
-  private static ProblemInfo problem(String message, ProblemInfo.Status status, String outcome) {
-    ProblemInfo p = problem(message);
-    p.status = checkNotNull(status);
-    p.outcome = checkNotNull(outcome);
-    return p;
-  }
-
-  private void assertProblems(
-      ChangeNotes notes, @Nullable FixInput fix, ProblemInfo first, ProblemInfo... rest)
-      throws Exception {
-    List<ProblemInfo> expected = new ArrayList<>(1 + rest.length);
-    expected.add(first);
-    expected.addAll(Arrays.asList(rest));
-    assertThat(checker.check(notes, fix).problems()).containsExactlyElementsIn(expected).inOrder();
-  }
-
-  private void assertNoProblems(ChangeNotes notes, @Nullable FixInput fix) throws Exception {
-    assertThat(checker.check(notes, fix).problems()).isEmpty();
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/GetRelatedIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/GetRelatedIT.java
deleted file mode 100644
index f0dbac2..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/GetRelatedIT.java
+++ /dev/null
@@ -1,611 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.acceptance.server.change;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.GitUtil.pushHead;
-import static com.google.gerrit.extensions.common.EditInfoSubject.assertThat;
-import static java.util.concurrent.TimeUnit.SECONDS;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.GerritConfig;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.common.RawInputUtil;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.api.changes.RelatedChangeAndCommitInfo;
-import com.google.gerrit.extensions.common.CommitInfo;
-import com.google.gerrit.extensions.common.EditInfo;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.server.change.ChangesCollection;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.testutil.TestTimeUtil;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.util.List;
-import java.util.Optional;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-@NoHttpd
-public class GetRelatedIT extends AbstractDaemonTest {
-  private String systemTimeZone;
-
-  @Before
-  public void setTimeForTesting() {
-    systemTimeZone = System.setProperty("user.timezone", "US/Eastern");
-    TestTimeUtil.resetWithClockStep(1, SECONDS);
-  }
-
-  @After
-  public void resetTime() {
-    TestTimeUtil.useSystemTime();
-    System.setProperty("user.timezone", systemTimeZone);
-  }
-
-  @Inject private ChangesCollection changes;
-
-  @Test
-  public void getRelatedNoResult() throws Exception {
-    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
-    assertRelated(push.to("refs/for/master").getPatchSetId());
-  }
-
-  @Test
-  public void getRelatedLinear() throws Exception {
-    // 1,1---2,1
-    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
-    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
-    pushHead(testRepo, "refs/for/master", false);
-    PatchSet.Id ps1_1 = getPatchSetId(c1_1);
-    PatchSet.Id ps2_1 = getPatchSetId(c2_1);
-
-    for (PatchSet.Id ps : ImmutableList.of(ps2_1, ps1_1)) {
-      assertRelated(ps, changeAndCommit(ps2_1, c2_1, 1), changeAndCommit(ps1_1, c1_1, 1));
-    }
-  }
-
-  @Test
-  public void getRelatedLinearSeparatePushes() throws Exception {
-    // 1,1---2,1
-    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
-    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
-
-    testRepo.reset(c1_1);
-    pushHead(testRepo, "refs/for/master", false);
-    PatchSet.Id ps1_1 = getPatchSetId(c1_1);
-    String oldETag = changes.parse(ps1_1.getParentKey()).getETag();
-
-    testRepo.reset(c2_1);
-    pushHead(testRepo, "refs/for/master", false);
-    PatchSet.Id ps2_1 = getPatchSetId(c2_1);
-
-    // Push of change 2 should not affect groups (or anything else) of change 1.
-    assertThat(changes.parse(ps1_1.getParentKey()).getETag()).isEqualTo(oldETag);
-
-    for (PatchSet.Id ps : ImmutableList.of(ps2_1, ps1_1)) {
-      assertRelated(ps, changeAndCommit(ps2_1, c2_1, 1), changeAndCommit(ps1_1, c1_1, 1));
-    }
-  }
-
-  @Test
-  public void getRelatedReorder() throws Exception {
-    // 1,1---2,1
-    //
-    // 2,2---1,2
-
-    // Create two commits and push.
-    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
-    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
-    pushHead(testRepo, "refs/for/master", false);
-    PatchSet.Id ps1_1 = getPatchSetId(c1_1);
-    PatchSet.Id ps2_1 = getPatchSetId(c2_1);
-
-    // Swap the order of commits and push again.
-    testRepo.reset("HEAD~2");
-    RevCommit c2_2 = testRepo.cherryPick(c2_1);
-    RevCommit c1_2 = testRepo.cherryPick(c1_1);
-    pushHead(testRepo, "refs/for/master", false);
-    PatchSet.Id ps1_2 = getPatchSetId(c1_1);
-    PatchSet.Id ps2_2 = getPatchSetId(c2_1);
-
-    for (PatchSet.Id ps : ImmutableList.of(ps2_2, ps1_2)) {
-      assertRelated(ps, changeAndCommit(ps1_2, c1_2, 2), changeAndCommit(ps2_2, c2_2, 2));
-    }
-
-    for (PatchSet.Id ps : ImmutableList.of(ps2_1, ps1_1)) {
-      assertRelated(ps, changeAndCommit(ps2_1, c2_1, 2), changeAndCommit(ps1_1, c1_1, 2));
-    }
-  }
-
-  @Test
-  public void getRelatedAmendParentChange() throws Exception {
-    // 1,1---2,1
-    //
-    // 1,2
-
-    // Create two commits and push.
-    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
-    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
-    pushHead(testRepo, "refs/for/master", false);
-    PatchSet.Id ps1_1 = getPatchSetId(c1_1);
-    PatchSet.Id ps2_1 = getPatchSetId(c2_1);
-
-    // Amend parent change and push.
-    testRepo.reset("HEAD~1");
-    RevCommit c1_2 = amendBuilder().add("c.txt", "2").create();
-    pushHead(testRepo, "refs/for/master", false);
-    PatchSet.Id ps1_2 = getPatchSetId(c1_2);
-
-    for (PatchSet.Id ps : ImmutableList.of(ps2_1, ps1_1)) {
-      assertRelated(ps, changeAndCommit(ps2_1, c2_1, 1), changeAndCommit(ps1_1, c1_1, 2));
-    }
-
-    assertRelated(ps1_2, changeAndCommit(ps2_1, c2_1, 1), changeAndCommit(ps1_2, c1_2, 2));
-  }
-
-  @Test
-  public void getRelatedReorderAndExtend() throws Exception {
-    // 1,1---2,1
-    //
-    // 2,2---1,2---3,1
-
-    // Create two commits and push.
-    ObjectId initial = repo().exactRef("HEAD").getObjectId();
-    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
-    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
-    pushHead(testRepo, "refs/for/master", false);
-    PatchSet.Id ps1_1 = getPatchSetId(c1_1);
-    PatchSet.Id ps2_1 = getPatchSetId(c2_1);
-
-    // Swap the order of commits, create a new commit on top, and push again.
-    testRepo.reset(initial);
-    RevCommit c2_2 = testRepo.cherryPick(c2_1);
-    RevCommit c1_2 = testRepo.cherryPick(c1_1);
-    RevCommit c3_1 = commitBuilder().add("c.txt", "3").message("subject: 3").create();
-    pushHead(testRepo, "refs/for/master", false);
-    PatchSet.Id ps1_2 = getPatchSetId(c1_1);
-    PatchSet.Id ps2_2 = getPatchSetId(c2_1);
-    PatchSet.Id ps3_1 = getPatchSetId(c3_1);
-
-    for (PatchSet.Id ps : ImmutableList.of(ps3_1, ps2_2, ps1_2)) {
-      assertRelated(
-          ps,
-          changeAndCommit(ps3_1, c3_1, 1),
-          changeAndCommit(ps1_2, c1_2, 2),
-          changeAndCommit(ps2_2, c2_2, 2));
-    }
-
-    for (PatchSet.Id ps : ImmutableList.of(ps2_1, ps1_1)) {
-      assertRelated(
-          ps,
-          changeAndCommit(ps3_1, c3_1, 1),
-          changeAndCommit(ps2_1, c2_1, 2),
-          changeAndCommit(ps1_1, c1_1, 2));
-    }
-  }
-
-  @Test
-  public void getRelatedReworkSeries() throws Exception {
-    // 1,1---2,1---3,1
-    //
-    // 1,2---2,2---3,2
-
-    // Create three commits and push.
-    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
-    RevCommit c2_1 = commitBuilder().add("b.txt", "1").message("subject: 2").create();
-    RevCommit c3_1 = commitBuilder().add("b.txt", "1").message("subject: 3").create();
-    pushHead(testRepo, "refs/for/master", false);
-    PatchSet.Id ps1_1 = getPatchSetId(c1_1);
-    PatchSet.Id ps2_1 = getPatchSetId(c2_1);
-    PatchSet.Id ps3_1 = getPatchSetId(c3_1);
-
-    // Amend all changes change and push.
-    testRepo.reset(c1_1);
-    RevCommit c1_2 = amendBuilder().add("a.txt", "2").create();
-    RevCommit c2_2 =
-        commitBuilder().add("b.txt", "2").message(parseBody(c2_1).getFullMessage()).create();
-    RevCommit c3_2 =
-        commitBuilder().add("b.txt", "3").message(parseBody(c3_1).getFullMessage()).create();
-    pushHead(testRepo, "refs/for/master", false);
-    PatchSet.Id ps1_2 = getPatchSetId(c1_2);
-    PatchSet.Id ps2_2 = getPatchSetId(c2_2);
-    PatchSet.Id ps3_2 = getPatchSetId(c3_2);
-
-    for (PatchSet.Id ps : ImmutableList.of(ps1_1, ps2_1, ps3_1)) {
-      assertRelated(
-          ps,
-          changeAndCommit(ps3_1, c3_1, 2),
-          changeAndCommit(ps2_1, c2_1, 2),
-          changeAndCommit(ps1_1, c1_1, 2));
-    }
-
-    for (PatchSet.Id ps : ImmutableList.of(ps1_2, ps2_2, ps3_2)) {
-      assertRelated(
-          ps,
-          changeAndCommit(ps3_2, c3_2, 2),
-          changeAndCommit(ps2_2, c2_2, 2),
-          changeAndCommit(ps1_2, c1_2, 2));
-    }
-  }
-
-  @Test
-  public void getRelatedReworkThenExtendInTheMiddleOfSeries() throws Exception {
-    // 1,1---2,1---3,1
-    //
-    // 1,2---2,2---3,2
-    //   \---4,1
-
-    // Create three commits and push.
-    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
-    RevCommit c2_1 = commitBuilder().add("b.txt", "1").message("subject: 2").create();
-    RevCommit c3_1 = commitBuilder().add("b.txt", "1").message("subject: 3").create();
-    pushHead(testRepo, "refs/for/master", false);
-    PatchSet.Id ps1_1 = getPatchSetId(c1_1);
-    PatchSet.Id ps2_1 = getPatchSetId(c2_1);
-    PatchSet.Id ps3_1 = getPatchSetId(c3_1);
-
-    // Amend all changes change and push.
-    testRepo.reset(c1_1);
-    RevCommit c1_2 = amendBuilder().add("a.txt", "2").create();
-    RevCommit c2_2 =
-        commitBuilder().add("b.txt", "2").message(parseBody(c2_1).getFullMessage()).create();
-    RevCommit c3_2 =
-        commitBuilder().add("b.txt", "3").message(parseBody(c3_1).getFullMessage()).create();
-    pushHead(testRepo, "refs/for/master", false);
-    PatchSet.Id ps1_2 = getPatchSetId(c1_2);
-    PatchSet.Id ps2_2 = getPatchSetId(c2_2);
-    PatchSet.Id ps3_2 = getPatchSetId(c3_2);
-
-    // Add one more commit 4,1 based on 1,2.
-    testRepo.reset(c1_2);
-    RevCommit c4_1 = commitBuilder().add("d.txt", "4").message("subject: 4").create();
-    pushHead(testRepo, "refs/for/master", false);
-    PatchSet.Id ps4_1 = getPatchSetId(c4_1);
-
-    // 1,1 is related indirectly to 4,1.
-    assertRelated(
-        ps1_1,
-        changeAndCommit(ps4_1, c4_1, 1),
-        changeAndCommit(ps3_1, c3_1, 2),
-        changeAndCommit(ps2_1, c2_1, 2),
-        changeAndCommit(ps1_1, c1_1, 2));
-
-    // 2,1 and 3,1 don't include 4,1 since we don't walk forward after walking
-    // backward.
-    for (PatchSet.Id ps : ImmutableList.of(ps2_1, ps3_1)) {
-      assertRelated(
-          ps,
-          changeAndCommit(ps3_1, c3_1, 2),
-          changeAndCommit(ps2_1, c2_1, 2),
-          changeAndCommit(ps1_1, c1_1, 2));
-    }
-
-    // 1,2 is related directly to 4,1, and the 2-3 parallel branch stays intact.
-    assertRelated(
-        ps1_2,
-        changeAndCommit(ps4_1, c4_1, 1),
-        changeAndCommit(ps3_2, c3_2, 2),
-        changeAndCommit(ps2_2, c2_2, 2),
-        changeAndCommit(ps1_2, c1_2, 2));
-
-    // 4,1 is only related to 1,2, since we don't walk forward after walking
-    // backward.
-    assertRelated(ps4_1, changeAndCommit(ps4_1, c4_1, 1), changeAndCommit(ps1_2, c1_2, 2));
-
-    // 2,2 and 3,2 don't include 4,1 since we don't walk forward after walking
-    // backward.
-    for (PatchSet.Id ps : ImmutableList.of(ps2_2, ps3_2)) {
-      assertRelated(
-          ps,
-          changeAndCommit(ps3_2, c3_2, 2),
-          changeAndCommit(ps2_2, c2_2, 2),
-          changeAndCommit(ps1_2, c1_2, 2));
-    }
-  }
-
-  @Test
-  public void getRelatedCrissCrossDependency() throws Exception {
-    // 1,1---2,1---3,2
-    //
-    // 1,2---2,2---3,1
-
-    // Create two commits and push.
-    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
-    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
-    pushHead(testRepo, "refs/for/master", false);
-    PatchSet.Id ps1_1 = getPatchSetId(c1_1);
-    PatchSet.Id ps2_1 = getPatchSetId(c2_1);
-
-    // Amend both changes change and push.
-    testRepo.reset(c1_1);
-    RevCommit c1_2 = amendBuilder().add("a.txt", "2").create();
-    RevCommit c2_2 =
-        commitBuilder().add("b.txt", "2").message(parseBody(c2_1).getFullMessage()).create();
-    pushHead(testRepo, "refs/for/master", false);
-    PatchSet.Id ps1_2 = getPatchSetId(c1_2);
-    PatchSet.Id ps2_2 = getPatchSetId(c2_2);
-
-    // PS 3,1 depends on 2,2.
-    RevCommit c3_1 = commitBuilder().add("c.txt", "1").message("subject: 3").create();
-    pushHead(testRepo, "refs/for/master", false);
-    PatchSet.Id ps3_1 = getPatchSetId(c3_1);
-
-    // PS 3,2 depends on 2,1.
-    testRepo.reset(c2_1);
-    RevCommit c3_2 =
-        commitBuilder().add("c.txt", "2").message(parseBody(c3_1).getFullMessage()).create();
-    pushHead(testRepo, "refs/for/master", false);
-    PatchSet.Id ps3_2 = getPatchSetId(c3_2);
-
-    for (PatchSet.Id ps : ImmutableList.of(ps1_1, ps2_1, ps3_2)) {
-      assertRelated(
-          ps,
-          changeAndCommit(ps3_2, c3_2, 2),
-          changeAndCommit(ps2_1, c2_1, 2),
-          changeAndCommit(ps1_1, c1_1, 2));
-    }
-
-    for (PatchSet.Id ps : ImmutableList.of(ps1_2, ps2_2, ps3_1)) {
-      assertRelated(
-          ps,
-          changeAndCommit(ps3_1, c3_1, 2),
-          changeAndCommit(ps2_2, c2_2, 2),
-          changeAndCommit(ps1_2, c1_2, 2));
-    }
-  }
-
-  @Test
-  public void getRelatedParallelDescendentBranches() throws Exception {
-    // 1,1---2,1---3,1
-    //   \---4,1---5,1
-    //    \--6,1---7,1
-
-    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
-    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
-    RevCommit c3_1 = commitBuilder().add("c.txt", "3").message("subject: 3").create();
-    pushHead(testRepo, "refs/for/master", false);
-    PatchSet.Id ps1_1 = getPatchSetId(c1_1);
-    PatchSet.Id ps2_1 = getPatchSetId(c2_1);
-    PatchSet.Id ps3_1 = getPatchSetId(c3_1);
-
-    testRepo.reset(c1_1);
-    RevCommit c4_1 = commitBuilder().add("d.txt", "4").message("subject: 4").create();
-    RevCommit c5_1 = commitBuilder().add("e.txt", "5").message("subject: 5").create();
-    pushHead(testRepo, "refs/for/master", false);
-    PatchSet.Id ps4_1 = getPatchSetId(c4_1);
-    PatchSet.Id ps5_1 = getPatchSetId(c5_1);
-
-    testRepo.reset(c1_1);
-    RevCommit c6_1 = commitBuilder().add("f.txt", "6").message("subject: 6").create();
-    RevCommit c7_1 = commitBuilder().add("g.txt", "7").message("subject: 7").create();
-    pushHead(testRepo, "refs/for/master", false);
-    PatchSet.Id ps6_1 = getPatchSetId(c6_1);
-    PatchSet.Id ps7_1 = getPatchSetId(c7_1);
-
-    // All changes are related to 1,1, keeping each of the parallel branches
-    // intact.
-    assertRelated(
-        ps1_1,
-        changeAndCommit(ps7_1, c7_1, 1),
-        changeAndCommit(ps6_1, c6_1, 1),
-        changeAndCommit(ps5_1, c5_1, 1),
-        changeAndCommit(ps4_1, c4_1, 1),
-        changeAndCommit(ps3_1, c3_1, 1),
-        changeAndCommit(ps2_1, c2_1, 1),
-        changeAndCommit(ps1_1, c1_1, 1));
-
-    // The 2-3 branch is only related back to 1, not the other branches.
-    for (PatchSet.Id ps : ImmutableList.of(ps2_1, ps3_1)) {
-      assertRelated(
-          ps,
-          changeAndCommit(ps3_1, c3_1, 1),
-          changeAndCommit(ps2_1, c2_1, 1),
-          changeAndCommit(ps1_1, c1_1, 1));
-    }
-
-    // The 4-5 branch is only related back to 1, not the other branches.
-    for (PatchSet.Id ps : ImmutableList.of(ps4_1, ps5_1)) {
-      assertRelated(
-          ps,
-          changeAndCommit(ps5_1, c5_1, 1),
-          changeAndCommit(ps4_1, c4_1, 1),
-          changeAndCommit(ps1_1, c1_1, 1));
-    }
-
-    // The 6-7 branch is only related back to 1, not the other branches.
-    for (PatchSet.Id ps : ImmutableList.of(ps6_1, ps7_1)) {
-      assertRelated(
-          ps,
-          changeAndCommit(ps7_1, c7_1, 1),
-          changeAndCommit(ps6_1, c6_1, 1),
-          changeAndCommit(ps1_1, c1_1, 1));
-    }
-  }
-
-  @Test
-  public void getRelatedEdit() throws Exception {
-    // 1,1---2,1---3,1
-    //   \---2,E---/
-
-    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
-    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
-    RevCommit c3_1 = commitBuilder().add("c.txt", "3").message("subject: 3").create();
-    pushHead(testRepo, "refs/for/master", false);
-
-    Change ch2 = getChange(c2_1).change();
-    String changeId2 = ch2.getKey().get();
-    gApi.changes().id(changeId2).edit().create();
-    gApi.changes().id(changeId2).edit().modifyFile("a.txt", RawInputUtil.create(new byte[] {'a'}));
-    Optional<EditInfo> edit = getEdit(changeId2);
-    assertThat(edit).isPresent();
-    ObjectId editRev = ObjectId.fromString(edit.get().commit.commit);
-
-    PatchSet.Id ps1_1 = getPatchSetId(c1_1);
-    PatchSet.Id ps2_1 = getPatchSetId(c2_1);
-    PatchSet.Id ps2_edit = new PatchSet.Id(ch2.getId(), 0);
-    PatchSet.Id ps3_1 = getPatchSetId(c3_1);
-
-    for (PatchSet.Id ps : ImmutableList.of(ps1_1, ps2_1, ps3_1)) {
-      assertRelated(
-          ps,
-          changeAndCommit(ps3_1, c3_1, 1),
-          changeAndCommit(ps2_1, c2_1, 1),
-          changeAndCommit(ps1_1, c1_1, 1));
-    }
-
-    assertRelated(
-        ps2_edit,
-        changeAndCommit(ps3_1, c3_1, 1),
-        changeAndCommit(new PatchSet.Id(ch2.getId(), 0), editRev, 1),
-        changeAndCommit(ps1_1, c1_1, 1));
-  }
-
-  @Test
-  public void pushNewPatchSetWhenParentHasNullGroup() throws Exception {
-    // 1,1---2,1
-    //   \---2,2
-
-    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
-    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
-    pushHead(testRepo, "refs/for/master", false);
-    PatchSet.Id psId1_1 = getPatchSetId(c1_1);
-    PatchSet.Id psId2_1 = getPatchSetId(c2_1);
-
-    for (PatchSet.Id psId : ImmutableList.of(psId1_1, psId2_1)) {
-      assertRelated(psId, changeAndCommit(psId2_1, c2_1, 1), changeAndCommit(psId1_1, c1_1, 1));
-    }
-
-    // Pretend PS1,1 was pushed before the groups field was added.
-    clearGroups(psId1_1);
-    indexer.index(changeDataFactory.create(db, project, psId1_1.getParentKey()));
-
-    // PS1,1 has no groups, so disappeared from related changes.
-    assertRelated(psId2_1);
-
-    RevCommit c2_2 = testRepo.amend(c2_1).add("c.txt", "2").create();
-    testRepo.reset(c2_2);
-    pushHead(testRepo, "refs/for/master", false);
-    PatchSet.Id psId2_2 = getPatchSetId(c2_2);
-
-    // Push updated the group for PS1,1, so it shows up in related changes even
-    // though a new patch set was not pushed.
-    assertRelated(psId2_2, changeAndCommit(psId2_2, c2_2, 2), changeAndCommit(psId1_1, c1_1, 1));
-  }
-
-  @Test
-  @GerritConfig(name = "index.autoReindexIfStale", value = "false")
-  public void getRelatedForStaleChange() throws Exception {
-    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
-
-    RevCommit c2_1 = commitBuilder().add("b.txt", "1").message("subject: 1").create();
-    pushHead(testRepo, "refs/for/master", false);
-
-    RevCommit c2_2 = testRepo.amend(c2_1).add("b.txt", "2").create();
-    testRepo.reset(c2_2);
-
-    disableChangeIndexWrites();
-    try {
-      pushHead(testRepo, "refs/for/master", false);
-    } finally {
-      enableChangeIndexWrites();
-    }
-
-    PatchSet.Id psId1_1 = getPatchSetId(c1_1);
-    PatchSet.Id psId2_1 = getPatchSetId(c2_1);
-    PatchSet.Id psId2_2 = new PatchSet.Id(psId2_1.changeId, psId2_1.get() + 1);
-
-    assertRelated(psId2_2, changeAndCommit(psId2_2, c2_2, 2), changeAndCommit(psId1_1, c1_1, 1));
-  }
-
-  private List<RelatedChangeAndCommitInfo> getRelated(PatchSet.Id ps) throws Exception {
-    return getRelated(ps.getParentKey(), ps.get());
-  }
-
-  private List<RelatedChangeAndCommitInfo> getRelated(Change.Id changeId, int ps) throws Exception {
-    return gApi.changes().id(changeId.get()).revision(ps).related().changes;
-  }
-
-  private RevCommit parseBody(RevCommit c) throws Exception {
-    testRepo.getRevWalk().parseBody(c);
-    return c;
-  }
-
-  private PatchSet.Id getPatchSetId(ObjectId c) throws Exception {
-    return getChange(c).change().currentPatchSetId();
-  }
-
-  private ChangeData getChange(ObjectId c) throws Exception {
-    return Iterables.getOnlyElement(queryProvider.get().byCommit(c));
-  }
-
-  private RelatedChangeAndCommitInfo changeAndCommit(
-      PatchSet.Id psId, ObjectId commitId, int currentRevisionNum) {
-    RelatedChangeAndCommitInfo result = new RelatedChangeAndCommitInfo();
-    result.project = project.get();
-    result._changeNumber = psId.getParentKey().get();
-    result.commit = new CommitInfo();
-    result.commit.commit = commitId.name();
-    result._revisionNumber = psId.get();
-    result._currentRevisionNumber = currentRevisionNum;
-    result.status = "NEW";
-    return result;
-  }
-
-  private void clearGroups(PatchSet.Id psId) throws Exception {
-    try (BatchUpdate bu = batchUpdateFactory.create(db, project, user(user), TimeUtil.nowTs())) {
-      bu.addOp(
-          psId.getParentKey(),
-          new BatchUpdateOp() {
-            @Override
-            public boolean updateChange(ChangeContext ctx) throws OrmException {
-              PatchSet ps = psUtil.get(ctx.getDb(), ctx.getNotes(), psId);
-              psUtil.setGroups(ctx.getDb(), ctx.getUpdate(psId), ps, ImmutableList.<String>of());
-              ctx.dontBumpLastUpdatedOn();
-              return true;
-            }
-          });
-      bu.execute();
-    }
-  }
-
-  private void assertRelated(PatchSet.Id psId, RelatedChangeAndCommitInfo... expected)
-      throws Exception {
-    List<RelatedChangeAndCommitInfo> actual = getRelated(psId);
-    assertThat(actual).named("related to " + psId).hasSize(expected.length);
-    for (int i = 0; i < actual.size(); i++) {
-      String name = "index " + i + " related to " + psId;
-      RelatedChangeAndCommitInfo a = actual.get(i);
-      RelatedChangeAndCommitInfo e = expected[i];
-      assertThat(a.project).named("project of " + name).isEqualTo(e.project);
-      assertThat(a._changeNumber).named("change ID of " + name).isEqualTo(e._changeNumber);
-      // Don't bother checking changeId; assume _changeNumber is sufficient.
-      assertThat(a._revisionNumber).named("revision of " + name).isEqualTo(e._revisionNumber);
-      assertThat(a.commit.commit).named("commit of " + name).isEqualTo(e.commit.commit);
-      assertThat(a._currentRevisionNumber)
-          .named("current revision of " + name)
-          .isEqualTo(e._currentRevisionNumber);
-    }
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/PatchListCacheIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/PatchListCacheIT.java
deleted file mode 100644
index cefde21..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/PatchListCacheIT.java
+++ /dev/null
@@ -1,272 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.acceptance.server.change;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.GitUtil.getChangeId;
-import static com.google.gerrit.acceptance.GitUtil.pushHead;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.cache.Cache;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
-import com.google.gerrit.reviewdb.client.Patch;
-import com.google.gerrit.reviewdb.client.Patch.ChangeType;
-import com.google.gerrit.server.patch.IntraLineDiff;
-import com.google.gerrit.server.patch.IntraLineDiffArgs;
-import com.google.gerrit.server.patch.IntraLineDiffKey;
-import com.google.gerrit.server.patch.PatchList;
-import com.google.gerrit.server.patch.PatchListCache;
-import com.google.gerrit.server.patch.PatchListCacheImpl;
-import com.google.gerrit.server.patch.PatchListEntry;
-import com.google.gerrit.server.patch.PatchListKey;
-import com.google.gerrit.server.patch.Text;
-import com.google.inject.Inject;
-import com.google.inject.name.Named;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import org.eclipse.jgit.diff.Edit;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.junit.Test;
-
-@NoHttpd
-public class PatchListCacheIT extends AbstractDaemonTest {
-  private static String SUBJECT_1 = "subject 1";
-  private static String SUBJECT_2 = "subject 2";
-  private static String SUBJECT_3 = "subject 3";
-  private static String FILE_A = "a.txt";
-  private static String FILE_B = "b.txt";
-  private static String FILE_C = "c.txt";
-  private static String FILE_D = "d.txt";
-
-  @Inject private PatchListCache patchListCache;
-
-  @Inject
-  @Named("diff")
-  private Cache<PatchListKey, PatchList> abstractPatchListCache;
-
-  @Test
-  public void listPatchesAgainstBase() throws Exception {
-    commitBuilder().add(FILE_D, "4").message(SUBJECT_1).create();
-    pushHead(testRepo, "refs/heads/master", false);
-
-    // Change 1, 1 (+FILE_A, -FILE_D)
-    RevCommit c =
-        commitBuilder().add(FILE_A, "1").rm(FILE_D).message(SUBJECT_2).insertChangeId().create();
-    String id = getChangeId(testRepo, c).get();
-    pushHead(testRepo, "refs/for/master", false);
-
-    // Compare Change 1,1 with Base (+FILE_A, -FILE_D)
-    List<PatchListEntry> entries = getCurrentPatches(id);
-    assertThat(entries).hasSize(3);
-    assertAdded(Patch.COMMIT_MSG, entries.get(0));
-    assertAdded(FILE_A, entries.get(1));
-    assertDeleted(FILE_D, entries.get(2));
-
-    // Change 1,2 (+FILE_A, +FILE_B, -FILE_D)
-    c = amendBuilder().add(FILE_B, "2").create();
-    pushHead(testRepo, "refs/for/master", false);
-    entries = getCurrentPatches(id);
-
-    // Compare Change 1,2 with Base (+FILE_A, +FILE_B, -FILE_D)
-    assertThat(entries).hasSize(4);
-    assertAdded(Patch.COMMIT_MSG, entries.get(0));
-    assertAdded(FILE_A, entries.get(1));
-    assertAdded(FILE_B, entries.get(2));
-    assertDeleted(FILE_D, entries.get(3));
-  }
-
-  @Test
-  public void listPatchesAgainstBaseWithRebase() throws Exception {
-    commitBuilder().add(FILE_D, "4").message(SUBJECT_1).create();
-    pushHead(testRepo, "refs/heads/master", false);
-
-    // Change 1,1 (+FILE_A, -FILE_D)
-    RevCommit c = commitBuilder().add(FILE_A, "1").rm(FILE_D).message(SUBJECT_2).create();
-    String id = getChangeId(testRepo, c).get();
-    pushHead(testRepo, "refs/for/master", false);
-    List<PatchListEntry> entries = getCurrentPatches(id);
-    assertThat(entries).hasSize(3);
-    assertAdded(Patch.COMMIT_MSG, entries.get(0));
-    assertAdded(FILE_A, entries.get(1));
-    assertDeleted(FILE_D, entries.get(2));
-
-    // Change 2,1 (+FILE_B)
-    testRepo.reset("HEAD~1");
-    commitBuilder().add(FILE_B, "2").message(SUBJECT_3).create();
-    pushHead(testRepo, "refs/for/master", false);
-
-    // Change 1,2 (+FILE_A, -FILE_D))
-    testRepo.cherryPick(c);
-    pushHead(testRepo, "refs/for/master", false);
-
-    // Compare Change 1,2 with Base (+FILE_A, -FILE_D))
-    entries = getCurrentPatches(id);
-    assertThat(entries).hasSize(3);
-    assertAdded(Patch.COMMIT_MSG, entries.get(0));
-    assertAdded(FILE_A, entries.get(1));
-    assertDeleted(FILE_D, entries.get(2));
-  }
-
-  @Test
-  public void listPatchesAgainstOtherPatchSet() throws Exception {
-    commitBuilder().add(FILE_D, "4").message(SUBJECT_1).create();
-    pushHead(testRepo, "refs/heads/master", false);
-
-    // Change 1,1 (+FILE_A, +FILE_C, -FILE_D)
-    RevCommit a =
-        commitBuilder().add(FILE_A, "1").add(FILE_C, "3").rm(FILE_D).message(SUBJECT_2).create();
-    pushHead(testRepo, "refs/for/master", false);
-
-    // Change 1,2 (+FILE_A, +FILE_B, -FILE_D)
-    RevCommit b = amendBuilder().add(FILE_B, "2").rm(FILE_C).create();
-    pushHead(testRepo, "refs/for/master", false);
-
-    // Compare Change 1,1 with Change 1,2 (+FILE_B, -FILE_C)
-    List<PatchListEntry> entries = getPatches(a, b);
-    assertThat(entries).hasSize(3);
-    assertModified(Patch.COMMIT_MSG, entries.get(0));
-    assertAdded(FILE_B, entries.get(1));
-    assertDeleted(FILE_C, entries.get(2));
-
-    // Compare Change 1,2 with Change 1,1 (-FILE_B, +FILE_C)
-    List<PatchListEntry> entriesReverse = getPatches(b, a);
-    assertThat(entriesReverse).hasSize(3);
-    assertModified(Patch.COMMIT_MSG, entriesReverse.get(0));
-    assertDeleted(FILE_B, entriesReverse.get(1));
-    assertAdded(FILE_C, entriesReverse.get(2));
-  }
-
-  @Test
-  public void listPatchesAgainstOtherPatchSetWithRebase() throws Exception {
-    commitBuilder().add(FILE_D, "4").message(SUBJECT_1).create();
-    pushHead(testRepo, "refs/heads/master", false);
-
-    // Change 1,1 (+FILE_A, -FILE_D)
-    RevCommit a = commitBuilder().add(FILE_A, "1").rm(FILE_D).message(SUBJECT_2).create();
-    pushHead(testRepo, "refs/for/master", false);
-
-    // Change 2,1 (+FILE_B)
-    testRepo.reset("HEAD~1");
-    commitBuilder().add(FILE_B, "2").message(SUBJECT_3).create();
-    pushHead(testRepo, "refs/for/master", false);
-
-    // Change 1,2 (+FILE_A, +FILE_C, -FILE_D)
-    testRepo.cherryPick(a);
-    RevCommit b = amendBuilder().add(FILE_C, "2").create();
-    pushHead(testRepo, "refs/for/master", false);
-
-    // Compare Change 1,1 with Change 1,2 (+FILE_C)
-    List<PatchListEntry> entries = getPatches(a, b);
-    assertThat(entries).hasSize(2);
-    assertModified(Patch.COMMIT_MSG, entries.get(0));
-    assertAdded(FILE_C, entries.get(1));
-
-    // Compare Change 1,2 with Change 1,1 (-FILE_C)
-    List<PatchListEntry> entriesReverse = getPatches(b, a);
-    assertThat(entriesReverse).hasSize(2);
-    assertModified(Patch.COMMIT_MSG, entriesReverse.get(0));
-    assertDeleted(FILE_C, entriesReverse.get(1));
-  }
-
-  @Test
-  public void harmfulMutationsOfEditsAreNotPossibleForIntraLineDiffArgsAndCachedValue() {
-    String a = "First line\nSecond line\n";
-    String b = "1st line\n2nd line\n";
-    Text aText = new Text(a.getBytes(UTF_8));
-    Text bText = new Text(b.getBytes(UTF_8));
-    Edit inputEdit = new Edit(0, 2, 0, 2);
-    List<Edit> inputEdits = new ArrayList<>(ImmutableList.of(inputEdit));
-    Set<Edit> inputEditsDueToRebase = new HashSet<>(ImmutableSet.of(inputEdit));
-
-    IntraLineDiffKey diffKey =
-        IntraLineDiffKey.create(ObjectId.zeroId(), ObjectId.zeroId(), Whitespace.IGNORE_NONE);
-    IntraLineDiffArgs diffArgs =
-        IntraLineDiffArgs.create(
-            aText,
-            bText,
-            inputEdits,
-            inputEditsDueToRebase,
-            project,
-            ObjectId.zeroId(),
-            "file.txt");
-    IntraLineDiff intraLineDiff = patchListCache.getIntraLineDiff(diffKey, diffArgs);
-
-    Edit outputEdit = Iterables.getOnlyElement(intraLineDiff.getEdits());
-
-    outputEdit.shift(5);
-    inputEdit.shift(7);
-    inputEdits.add(new Edit(43, 47, 50, 51));
-    inputEditsDueToRebase.add(new Edit(53, 57, 60, 61));
-
-    Edit originalEdit = new Edit(0, 2, 0, 2);
-    assertThat(diffArgs.edits()).containsExactly(originalEdit);
-    assertThat(diffArgs.editsDueToRebase()).containsExactly(originalEdit);
-    assertThat(intraLineDiff.getEdits()).containsExactly(originalEdit);
-  }
-
-  @Test
-  public void largeObjectTombstoneGetsCached() {
-    PatchListKey key = PatchListKey.againstDefaultBase(ObjectId.zeroId(), Whitespace.IGNORE_ALL);
-    PatchListCacheImpl.LargeObjectTombstone tombstone =
-        new PatchListCacheImpl.LargeObjectTombstone();
-    abstractPatchListCache.put(key, tombstone);
-    assertThat(abstractPatchListCache.getIfPresent(key)).isSameAs(tombstone);
-  }
-
-  private static void assertAdded(String expectedNewName, PatchListEntry e) {
-    assertName(expectedNewName, e);
-    assertThat(e.getChangeType()).isEqualTo(ChangeType.ADDED);
-  }
-
-  private static void assertModified(String expectedNewName, PatchListEntry e) {
-    assertName(expectedNewName, e);
-    assertThat(e.getChangeType()).isEqualTo(ChangeType.MODIFIED);
-  }
-
-  private static void assertDeleted(String expectedNewName, PatchListEntry e) {
-    assertName(expectedNewName, e);
-    assertThat(e.getChangeType()).isEqualTo(ChangeType.DELETED);
-  }
-
-  private static void assertName(String expectedNewName, PatchListEntry e) {
-    assertThat(e.getNewName()).isEqualTo(expectedNewName);
-    assertThat(e.getOldName()).isNull();
-  }
-
-  private List<PatchListEntry> getCurrentPatches(String changeId) throws Exception {
-    return patchListCache.get(getKey(null, getCurrentRevisionId(changeId)), project).getPatches();
-  }
-
-  private List<PatchListEntry> getPatches(ObjectId revisionIdA, ObjectId revisionIdB)
-      throws Exception {
-    return patchListCache.get(getKey(revisionIdA, revisionIdB), project).getPatches();
-  }
-
-  private PatchListKey getKey(ObjectId revisionIdA, ObjectId revisionIdB) {
-    return PatchListKey.againstCommit(revisionIdA, revisionIdB, Whitespace.IGNORE_NONE);
-  }
-
-  private ObjectId getCurrentRevisionId(String changeId) throws Exception {
-    return ObjectId.fromString(gApi.changes().id(changeId).get().currentRevision);
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/SubmittedTogetherIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/SubmittedTogetherIT.java
deleted file mode 100644
index 49588e7..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/SubmittedTogetherIT.java
+++ /dev/null
@@ -1,262 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.acceptance.server.change;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.acceptance.GitUtil.pushHead;
-import static com.google.gerrit.extensions.api.changes.SubmittedTogetherOption.NON_VISIBLE_CHANGES;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.GitUtil;
-import com.google.gerrit.acceptance.TestProjectInput;
-import com.google.gerrit.extensions.api.changes.SubmittedTogetherInfo;
-import com.google.gerrit.extensions.client.ChangeStatus;
-import com.google.gerrit.extensions.client.ListChangesOption;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.extensions.common.FileInfo;
-import com.google.gerrit.extensions.common.RevisionInfo;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.testutil.ConfigSuite;
-import java.util.EnumSet;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.junit.Test;
-
-public class SubmittedTogetherIT extends AbstractDaemonTest {
-  @ConfigSuite.Config
-  public static Config submitWholeTopicEnabled() {
-    return submitWholeTopicEnabledConfig();
-  }
-
-  @Test
-  public void doesNotIncludeCurrentFiles() throws Exception {
-    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
-    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
-    String id2 = getChangeId(c2_1);
-    pushHead(testRepo, "refs/for/master", false);
-
-    SubmittedTogetherInfo info =
-        gApi.changes().id(id2).submittedTogether(EnumSet.of(NON_VISIBLE_CHANGES));
-    assertThat(info.changes).hasSize(2);
-    assertThat(info.changes.get(0).currentRevision).isEqualTo(c2_1.name());
-    assertThat(info.changes.get(1).currentRevision).isEqualTo(c1_1.name());
-
-    assertThat(info.changes.get(0).currentRevision).isEqualTo(c2_1.name());
-    RevisionInfo rev = info.changes.get(0).revisions.get(c2_1.name());
-    assertThat(rev.files).isNull();
-  }
-
-  @Test
-  public void returnsCurrentFilesIfOptionRequested() throws Exception {
-    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
-    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
-    String id2 = getChangeId(c2_1);
-    pushHead(testRepo, "refs/for/master", false);
-
-    SubmittedTogetherInfo info =
-        gApi.changes()
-            .id(id2)
-            .submittedTogether(
-                EnumSet.of(ListChangesOption.CURRENT_FILES), EnumSet.of(NON_VISIBLE_CHANGES));
-    assertThat(info.changes).hasSize(2);
-    assertThat(info.changes.get(0).currentRevision).isEqualTo(c2_1.name());
-    assertThat(info.changes.get(1).currentRevision).isEqualTo(c1_1.name());
-
-    assertThat(info.changes.get(0).currentRevision).isEqualTo(c2_1.name());
-    RevisionInfo rev = info.changes.get(0).revisions.get(c2_1.name());
-    assertThat(rev).isNotNull();
-    FileInfo file = rev.files.get("b.txt");
-    assertThat(file).isNotNull();
-    assertThat(file.status).isEqualTo('A');
-  }
-
-  @Test
-  public void returnsAncestors() throws Exception {
-    // Create two commits and push.
-    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
-    String id1 = getChangeId(c1_1);
-    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
-    String id2 = getChangeId(c2_1);
-    pushHead(testRepo, "refs/for/master", false);
-
-    assertSubmittedTogether(id1);
-    assertSubmittedTogether(id2, id2, id1);
-  }
-
-  @Test
-  public void anonymousAncestors() throws Exception {
-    RevCommit a = commitBuilder().add("a", "1").message("change 1").create();
-    RevCommit b = commitBuilder().add("b", "1").message("change 2").create();
-    pushHead(testRepo, "refs/for/master", false);
-
-    setApiUserAnonymous();
-    assertSubmittedTogether(getChangeId(a));
-    assertSubmittedTogether(getChangeId(b), getChangeId(b), getChangeId(a));
-  }
-
-  @Test
-  public void respectsWholeTopicAndAncestors() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-    // Create two independent commits and push.
-    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
-    String id1 = getChangeId(c1_1);
-    pushHead(testRepo, "refs/for/master/" + name("connectingTopic"), false);
-
-    testRepo.reset(initialHead);
-    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
-    String id2 = getChangeId(c2_1);
-    pushHead(testRepo, "refs/for/master/" + name("connectingTopic"), false);
-
-    if (isSubmitWholeTopicEnabled()) {
-      assertSubmittedTogether(id1, id2, id1);
-      assertSubmittedTogether(id2, id2, id1);
-    } else {
-      assertSubmittedTogether(id1);
-      assertSubmittedTogether(id2);
-    }
-  }
-
-  @Test
-  public void anonymousWholeTopic() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-    RevCommit a = commitBuilder().add("a", "1").message("change 1").create();
-    pushHead(testRepo, "refs/for/master/" + name("topic"), false);
-    String id1 = getChangeId(a);
-
-    testRepo.reset(initialHead);
-    RevCommit b = commitBuilder().add("b", "1").message("change 2").create();
-    pushHead(testRepo, "refs/for/master/" + name("topic"), false);
-    String id2 = getChangeId(b);
-
-    setApiUserAnonymous();
-    if (isSubmitWholeTopicEnabled()) {
-      assertSubmittedTogether(id1, id2, id1);
-      assertSubmittedTogether(id2, id2, id1);
-    } else {
-      assertSubmittedTogether(id1);
-      assertSubmittedTogether(id2);
-    }
-  }
-
-  @Test
-  public void topicChaining() throws Exception {
-    RevCommit initialHead = getRemoteHead();
-    // Create two independent commits and push.
-    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
-    String id1 = getChangeId(c1_1);
-    pushHead(testRepo, "refs/for/master/" + name("connectingTopic"), false);
-
-    testRepo.reset(initialHead);
-    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
-    String id2 = getChangeId(c2_1);
-    pushHead(testRepo, "refs/for/master/" + name("connectingTopic"), false);
-
-    RevCommit c3_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
-    String id3 = getChangeId(c3_1);
-    pushHead(testRepo, "refs/for/master/" + name("unrelated-topic"), false);
-
-    if (isSubmitWholeTopicEnabled()) {
-      assertSubmittedTogether(id1, id2, id1);
-      assertSubmittedTogether(id2, id2, id1);
-      assertSubmittedTogether(id3, id3, id2, id1);
-    } else {
-      assertSubmittedTogether(id1);
-      assertSubmittedTogether(id2);
-      assertSubmittedTogether(id3, id3, id2);
-    }
-  }
-
-  @Test
-  public void newBranchTwoChangesTogether() throws Exception {
-    Project.NameKey p1 = createProject("a-new-project", null, false);
-    TestRepository<?> repo1 = cloneProject(p1);
-
-    RevCommit c1 =
-        repo1
-            .branch("HEAD")
-            .commit()
-            .insertChangeId()
-            .add("a.txt", "1")
-            .message("subject: 1")
-            .create();
-    String id1 = GitUtil.getChangeId(repo1, c1).get();
-    pushHead(repo1, "refs/for/master", false);
-
-    RevCommit c2 =
-        repo1
-            .branch("HEAD")
-            .commit()
-            .insertChangeId()
-            .add("b.txt", "2")
-            .message("subject: 2")
-            .create();
-    String id2 = GitUtil.getChangeId(repo1, c2).get();
-    pushHead(repo1, "refs/for/master", false);
-    assertSubmittedTogether(id1);
-    assertSubmittedTogether(id2, id2, id1);
-  }
-
-  @Test
-  @TestProjectInput(submitType = SubmitType.CHERRY_PICK)
-  public void testCherryPickWithoutAncestors() throws Exception {
-    // Create two commits and push.
-    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
-    String id1 = getChangeId(c1_1);
-    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
-    String id2 = getChangeId(c2_1);
-    pushHead(testRepo, "refs/for/master", false);
-
-    assertSubmittedTogether(id1);
-    assertSubmittedTogether(id2);
-  }
-
-  @Test
-  public void submissionIdSavedOnMergeInOneProject() throws Exception {
-    // Create two commits and push.
-    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
-    String id1 = getChangeId(c1_1);
-    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
-    String id2 = getChangeId(c2_1);
-    pushHead(testRepo, "refs/for/master", false);
-
-    assertSubmittedTogether(id1);
-    assertSubmittedTogether(id2, id2, id1);
-
-    approve(id1);
-    approve(id2);
-    submit(id2);
-    assertMerged(id1);
-    assertMerged(id2);
-
-    // Prior to submission this was empty, but the post-merge value is what was
-    // actually submitted.
-    assertSubmittedTogether(id1, id2, id1);
-
-    assertSubmittedTogether(id2, id2, id1);
-  }
-
-  private String getChangeId(RevCommit c) throws Exception {
-    return GitUtil.getChangeId(testRepo, c).get();
-  }
-
-  private void submit(String changeId) throws Exception {
-    gApi.changes().id(changeId).current().submit();
-  }
-
-  private void assertMerged(String changeId) throws Exception {
-    assertThat(gApi.changes().id(changeId).get().status).isEqualTo(ChangeStatus.MERGED);
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/event/BUILD b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/event/BUILD
deleted file mode 100644
index 3804bea..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/event/BUILD
+++ /dev/null
@@ -1,7 +0,0 @@
-load("//gerrit-acceptance-tests:tests.bzl", "acceptance_tests")
-
-acceptance_tests(
-    srcs = glob(["*IT.java"]),
-    group = "server_event",
-    labels = ["server"],
-)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/event/CommentAddedEventIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/event/CommentAddedEventIT.java
deleted file mode 100644
index 56c55e4..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/event/CommentAddedEventIT.java
+++ /dev/null
@@ -1,259 +0,0 @@
-// 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.
-
-package com.google.gerrit.acceptance.server.event;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
-import static com.google.gerrit.server.project.Util.category;
-import static com.google.gerrit.server.project.Util.value;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.common.ApprovalInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.LabelInfo;
-import com.google.gerrit.extensions.events.CommentAddedListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.registration.RegistrationHandle;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.project.Util;
-import com.google.inject.Inject;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-@NoHttpd
-public class CommentAddedEventIT extends AbstractDaemonTest {
-
-  @Inject private DynamicSet<CommentAddedListener> source;
-
-  private final LabelType label =
-      category("CustomLabel", value(1, "Positive"), value(0, "No score"), value(-1, "Negative"));
-
-  private final LabelType pLabel =
-      category("CustomLabel2", value(1, "Positive"), value(0, "No score"));
-
-  private RegistrationHandle eventListenerRegistration;
-  private CommentAddedListener.Event lastCommentAddedEvent;
-
-  @Before
-  public void setUp() throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    AccountGroup.UUID anonymousUsers = systemGroupBackend.getGroup(ANONYMOUS_USERS).getUUID();
-    Util.allow(cfg, Permission.forLabel(label.getName()), -1, 1, anonymousUsers, "refs/heads/*");
-    Util.allow(cfg, Permission.forLabel(pLabel.getName()), 0, 1, anonymousUsers, "refs/heads/*");
-    saveProjectConfig(project, cfg);
-
-    eventListenerRegistration =
-        source.add(
-            new CommentAddedListener() {
-              @Override
-              public void onCommentAdded(Event event) {
-                lastCommentAddedEvent = event;
-              }
-            });
-  }
-
-  @After
-  public void cleanup() {
-    eventListenerRegistration.remove();
-  }
-
-  private void saveLabelConfig() throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    cfg.getLabelSections().put(label.getName(), label);
-    cfg.getLabelSections().put(pLabel.getName(), pLabel);
-    saveProjectConfig(project, cfg);
-  }
-
-  /* Need to lookup info for the label under test since there can be multiple
-   * labels defined.  By default Gerrit already has a Code-Review label.
-   */
-  private ApprovalValues getApprovalValues(LabelType label) {
-    ApprovalValues res = new ApprovalValues();
-    ApprovalInfo info = lastCommentAddedEvent.getApprovals().get(label.getName());
-    if (info != null) {
-      res.value = info.value;
-    }
-    info = lastCommentAddedEvent.getOldApprovals().get(label.getName());
-    if (info != null) {
-      res.oldValue = info.value;
-    }
-    return res;
-  }
-
-  @Test
-  public void newChangeWithVote() throws Exception {
-    saveLabelConfig();
-
-    // push a new change with -1 vote
-    PushOneCommit.Result r = createChange();
-    ReviewInput reviewInput = new ReviewInput().label(label.getName(), (short) -1);
-    revision(r).review(reviewInput);
-    ApprovalValues attr = getApprovalValues(label);
-    assertThat(attr.oldValue).isEqualTo(0);
-    assertThat(attr.value).isEqualTo(-1);
-    assertThat(lastCommentAddedEvent.getComment())
-        .isEqualTo(String.format("Patch Set 1: %s-1", label.getName()));
-  }
-
-  @Test
-  public void newPatchSetWithVote() throws Exception {
-    saveLabelConfig();
-
-    // push a new change
-    PushOneCommit.Result r = createChange();
-    ReviewInput reviewInput = new ReviewInput().message(label.getName());
-    revision(r).review(reviewInput);
-
-    // push a new revision with +1 vote
-    ChangeInfo c = get(r.getChangeId());
-    r = amendChange(c.changeId);
-    reviewInput = new ReviewInput().label(label.getName(), (short) 1);
-    revision(r).review(reviewInput);
-    ApprovalValues attr = getApprovalValues(label);
-    assertThat(attr.oldValue).isEqualTo(0);
-    assertThat(attr.value).isEqualTo(1);
-    assertThat(lastCommentAddedEvent.getComment())
-        .isEqualTo(String.format("Patch Set 2: %s+1", label.getName()));
-  }
-
-  @Test
-  public void reviewChange() throws Exception {
-    saveLabelConfig();
-
-    // push a change
-    PushOneCommit.Result r = createChange();
-
-    // review with message only, do not apply votes
-    ReviewInput reviewInput = new ReviewInput().message(label.getName());
-    revision(r).review(reviewInput);
-    // reply message only so vote is shown as 0
-    ApprovalValues attr = getApprovalValues(label);
-    assertThat(attr.oldValue).isNull();
-    assertThat(attr.value).isEqualTo(0);
-    assertThat(lastCommentAddedEvent.getComment())
-        .isEqualTo(String.format("Patch Set 1:\n\n%s", label.getName()));
-
-    // transition from un-voted to -1 vote
-    reviewInput = new ReviewInput().label(label.getName(), -1);
-    revision(r).review(reviewInput);
-    attr = getApprovalValues(label);
-    assertThat(attr.oldValue).isEqualTo(0);
-    assertThat(attr.value).isEqualTo(-1);
-    assertThat(lastCommentAddedEvent.getComment())
-        .isEqualTo(String.format("Patch Set 1: %s-1", label.getName()));
-
-    // transition vote from -1 to 0
-    reviewInput = new ReviewInput().label(label.getName(), 0);
-    revision(r).review(reviewInput);
-    attr = getApprovalValues(label);
-    assertThat(attr.oldValue).isEqualTo(-1);
-    assertThat(attr.value).isEqualTo(0);
-    assertThat(lastCommentAddedEvent.getComment())
-        .isEqualTo(String.format("Patch Set 1: -%s", label.getName()));
-
-    // transition vote from 0 to 1
-    reviewInput = new ReviewInput().label(label.getName(), 1);
-    revision(r).review(reviewInput);
-    attr = getApprovalValues(label);
-    assertThat(attr.oldValue).isEqualTo(0);
-    assertThat(attr.value).isEqualTo(1);
-    assertThat(lastCommentAddedEvent.getComment())
-        .isEqualTo(String.format("Patch Set 1: %s+1", label.getName()));
-
-    // transition vote from 1 to -1
-    reviewInput = new ReviewInput().label(label.getName(), -1);
-    revision(r).review(reviewInput);
-    attr = getApprovalValues(label);
-    assertThat(attr.oldValue).isEqualTo(1);
-    assertThat(attr.value).isEqualTo(-1);
-    assertThat(lastCommentAddedEvent.getComment())
-        .isEqualTo(String.format("Patch Set 1: %s-1", label.getName()));
-
-    // review with message only, do not apply votes
-    reviewInput = new ReviewInput().message(label.getName());
-    revision(r).review(reviewInput);
-    attr = getApprovalValues(label);
-    assertThat(attr.oldValue).isNull(); // no vote change so not included
-    assertThat(attr.value).isEqualTo(-1);
-    assertThat(lastCommentAddedEvent.getComment())
-        .isEqualTo(String.format("Patch Set 1:\n\n%s", label.getName()));
-  }
-
-  @Test
-  public void reviewChange_MultipleVotes() throws Exception {
-    saveLabelConfig();
-    PushOneCommit.Result r = createChange();
-    ReviewInput reviewInput = new ReviewInput().label(label.getName(), -1);
-    reviewInput.message = label.getName();
-    revision(r).review(reviewInput);
-
-    ChangeInfo c = get(r.getChangeId());
-    LabelInfo q = c.labels.get(label.getName());
-    assertThat(q.all).hasSize(1);
-    ApprovalValues labelAttr = getApprovalValues(label);
-    assertThat(labelAttr.oldValue).isEqualTo(0);
-    assertThat(labelAttr.value).isEqualTo(-1);
-    assertThat(lastCommentAddedEvent.getComment())
-        .isEqualTo(String.format("Patch Set 1: %s-1\n\n%s", label.getName(), label.getName()));
-
-    // there should be 3 approval labels (label, pLabel, and CRVV)
-    assertThat(lastCommentAddedEvent.getApprovals()).hasSize(3);
-
-    // check the approvals that were not voted on
-    ApprovalValues pLabelAttr = getApprovalValues(pLabel);
-    assertThat(pLabelAttr.oldValue).isNull();
-    assertThat(pLabelAttr.value).isEqualTo(0);
-
-    LabelType crLabel = LabelType.withDefaultValues("Code-Review");
-    ApprovalValues crlAttr = getApprovalValues(crLabel);
-    assertThat(crlAttr.oldValue).isNull();
-    assertThat(crlAttr.value).isEqualTo(0);
-
-    // update pLabel approval
-    reviewInput = new ReviewInput().label(pLabel.getName(), 1);
-    reviewInput.message = pLabel.getName();
-    revision(r).review(reviewInput);
-
-    c = get(r.getChangeId());
-    q = c.labels.get(label.getName());
-    assertThat(q.all).hasSize(1);
-    pLabelAttr = getApprovalValues(pLabel);
-    assertThat(pLabelAttr.oldValue).isEqualTo(0);
-    assertThat(pLabelAttr.value).isEqualTo(1);
-    assertThat(lastCommentAddedEvent.getComment())
-        .isEqualTo(String.format("Patch Set 1: %s+1\n\n%s", pLabel.getName(), pLabel.getName()));
-
-    // check the approvals that were not voted on
-    labelAttr = getApprovalValues(label);
-    assertThat(labelAttr.oldValue).isNull();
-    assertThat(labelAttr.value).isEqualTo(-1);
-
-    crlAttr = getApprovalValues(crLabel);
-    assertThat(crlAttr.oldValue).isNull();
-    assertThat(crlAttr.value).isEqualTo(0);
-  }
-
-  private static class ApprovalValues {
-    Integer value;
-    Integer oldValue;
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/AbstractMailIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/AbstractMailIT.java
deleted file mode 100644
index 6f4bdab..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/AbstractMailIT.java
+++ /dev/null
@@ -1,147 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.acceptance.server.mail;
-
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.acceptance.TestAccount;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.api.changes.ReviewInput.CommentInput;
-import com.google.gerrit.extensions.client.Comment;
-import com.google.gerrit.extensions.client.Side;
-import com.google.gerrit.server.mail.receive.MailMessage;
-import java.util.HashMap;
-import org.joda.time.DateTime;
-import org.junit.Ignore;
-
-@Ignore
-public class AbstractMailIT extends AbstractDaemonTest {
-
-  protected MailMessage.Builder messageBuilderWithDefaultFields() {
-    MailMessage.Builder b = MailMessage.builder();
-    b.id("some id");
-    b.from(user.emailAddress);
-    b.addTo(user.emailAddress); // Not evaluated
-    b.subject("");
-    b.dateReceived(new DateTime());
-    return b;
-  }
-
-  protected String createChangeWithReview() throws Exception {
-    return createChangeWithReview(admin);
-  }
-
-  protected String createChangeWithReview(TestAccount reviewer) throws Exception {
-    // Create change
-    String file = "gerrit-server/test.txt";
-    String contents = "contents \nlorem \nipsum \nlorem";
-    PushOneCommit push =
-        pushFactory.create(db, admin.getIdent(), testRepo, "first subject", file, contents);
-    PushOneCommit.Result r = push.to("refs/for/master");
-    String changeId = r.getChangeId();
-
-    // Review it
-    setApiUser(reviewer);
-    ReviewInput input = new ReviewInput();
-    input.message = "I have two comments";
-    input.comments = new HashMap<>();
-    CommentInput c1 = newComment(file, Side.REVISION, 0, "comment on file");
-    CommentInput c2 = newComment(file, Side.REVISION, 2, "inline comment");
-    input.comments.put(c1.path, ImmutableList.of(c1, c2));
-    revision(r).review(input);
-    return changeId;
-  }
-
-  protected static CommentInput newComment(String path, Side side, int line, String message) {
-    CommentInput c = new CommentInput();
-    c.path = path;
-    c.side = side;
-    c.line = line != 0 ? line : null;
-    c.message = message;
-    if (line != 0) {
-      Comment.Range range = new Comment.Range();
-      range.startLine = line;
-      range.startCharacter = 1;
-      range.endLine = line;
-      range.endCharacter = 5;
-      c.range = range;
-    }
-    return c;
-  }
-
-  /**
-   * Create a plaintext message body with the specified comments.
-   *
-   * @param changeMessage
-   * @param c1 Comment in reply to first inline comment.
-   * @param f1 Comment on file one.
-   * @param fc1 Comment in reply to a comment of file 1.
-   * @return A string with all inline comments and the original quoted email.
-   */
-  protected static String newPlaintextBody(
-      String changeURL, String changeMessage, String c1, String f1, String fc1) {
-    return (changeMessage == null ? "" : changeMessage + "\n")
-        + "> Foo Bar has posted comments on this change. (  \n"
-        + "> "
-        + changeURL
-        + " )\n"
-        + "> \n"
-        + "> Change subject: Test change\n"
-        + "> ...............................................................\n"
-        + "> \n"
-        + "> \n"
-        + "> Patch Set 1: Code-Review+1\n"
-        + "> \n"
-        + "> (3 comments)\n"
-        + "> \n"
-        + "> "
-        + changeURL
-        + "/gerrit-server/test.txt\n"
-        + "> File  \n"
-        + "> gerrit-server/test.txt:\n"
-        + (f1 == null ? "" : f1 + "\n")
-        + "> \n"
-        + "> Patch Set #4:\n"
-        + "> "
-        + changeURL
-        + "/gerrit-server/test.txt\n"
-        + "> \n"
-        + "> Some comment"
-        + "> \n"
-        + (fc1 == null ? "" : fc1 + "\n")
-        + "> "
-        + changeURL
-        + "/gerrit-server/test.txt@2\n"
-        + "> PS1, Line 2: throw new Exception(\"Object has unsupported: \" +\n"
-        + ">               :             entry.getValue() +\n"
-        + ">               :             \" must be java.util.Date\");\n"
-        + "> Should entry.getKey() be included in this message?\n"
-        + "> \n"
-        + (c1 == null ? "" : c1 + "\n")
-        + "> \n";
-  }
-
-  protected static String textFooterForChange(int changeNumber, String timestamp) {
-    return "Gerrit-Change-Number: "
-        + changeNumber
-        + "\n"
-        + "Gerrit-PatchSet: 1\n"
-        + "Gerrit-MessageType: comment\n"
-        + "Gerrit-Comment-Date: "
-        + timestamp
-        + "\n";
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/BUILD b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/BUILD
deleted file mode 100644
index 71a6135..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/BUILD
+++ /dev/null
@@ -1,24 +0,0 @@
-load("//gerrit-acceptance-tests:tests.bzl", "acceptance_tests")
-
-DEPS = [
-    "//lib/greenmail",
-    "//lib/joda:joda-time",
-    "//lib/mail",
-]
-
-acceptance_tests(
-    srcs = glob(
-        ["*IT.java"],
-        exclude = ["AbstractMailIT.java"],
-    ),
-    group = "server_mail",
-    labels = ["server"],
-    deps = [":util"] + DEPS,
-)
-
-java_library(
-    name = "util",
-    testonly = 1,
-    srcs = ["AbstractMailIT.java"],
-    deps = ["//gerrit-acceptance-tests:lib"] + DEPS,
-)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/ChangeNotificationsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/ChangeNotificationsIT.java
deleted file mode 100644
index a94a63d..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/ChangeNotificationsIT.java
+++ /dev/null
@@ -1,2662 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.acceptance.server.mail;
-
-import static com.google.common.truth.TruthJUnit.assume;
-import static com.google.gerrit.extensions.api.changes.NotifyHandling.ALL;
-import static com.google.gerrit.extensions.api.changes.NotifyHandling.NONE;
-import static com.google.gerrit.extensions.api.changes.NotifyHandling.OWNER;
-import static com.google.gerrit.extensions.api.changes.NotifyHandling.OWNER_REVIEWERS;
-import static com.google.gerrit.extensions.client.GeneralPreferencesInfo.EmailStrategy.CC_ON_OWN_COMMENTS;
-import static com.google.gerrit.extensions.client.GeneralPreferencesInfo.EmailStrategy.ENABLED;
-import static com.google.gerrit.server.account.WatchConfig.NotifyType.ABANDONED_CHANGES;
-import static com.google.gerrit.server.account.WatchConfig.NotifyType.ALL_COMMENTS;
-import static com.google.gerrit.server.account.WatchConfig.NotifyType.NEW_CHANGES;
-import static com.google.gerrit.server.account.WatchConfig.NotifyType.NEW_PATCHSETS;
-import static com.google.gerrit.server.account.WatchConfig.NotifyType.SUBMITTED_CHANGES;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.truth.Truth;
-import com.google.gerrit.acceptance.AbstractNotificationTest;
-import com.google.gerrit.acceptance.TestAccount;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.changes.AbandonInput;
-import com.google.gerrit.extensions.api.changes.AddReviewerInput;
-import com.google.gerrit.extensions.api.changes.AssigneeInput;
-import com.google.gerrit.extensions.api.changes.DeleteReviewerInput;
-import com.google.gerrit.extensions.api.changes.DeleteVoteInput;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.api.changes.SubmitInput;
-import com.google.gerrit.extensions.api.projects.ConfigInput;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo.EmailStrategy;
-import com.google.gerrit.extensions.client.InheritableBoolean;
-import com.google.gerrit.extensions.client.ReviewerState;
-import com.google.gerrit.extensions.common.CommitInfo;
-import com.google.gerrit.extensions.common.CommitMessageInput;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.change.PostReview;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.project.Util;
-import org.junit.Before;
-import org.junit.Test;
-
-public class ChangeNotificationsIT extends AbstractNotificationTest {
-  /*
-   * Set up for extra standard test accounts and permissions.
-   */
-  private TestAccount other;
-  private TestAccount extraReviewer;
-  private TestAccount extraCcer;
-
-  @Before
-  public void createExtraAccounts() throws Exception {
-    extraReviewer =
-        accountCreator.create("extraReviewer", "extraReviewer@example.com", "extraReviewer");
-    extraCcer = accountCreator.create("extraCcer", "extraCcer@example.com", "extraCcer");
-    other = accountCreator.create("other", "other@example.com", "other");
-  }
-
-  @Before
-  public void grantPermissions() throws Exception {
-    grant(project, "refs/*", Permission.FORGE_COMMITTER, false, REGISTERED_USERS);
-    grant(project, "refs/*", Permission.SUBMIT, false, REGISTERED_USERS);
-    grant(project, "refs/heads/master", Permission.ABANDON, false, REGISTERED_USERS);
-    ProjectConfig cfg = projectCache.get(project).getConfig();
-    Util.allow(cfg, Permission.forLabel("Code-Review"), -2, +2, REGISTERED_USERS, "refs/*");
-  }
-
-  /*
-   * AbandonedSender tests.
-   */
-
-  @Test
-  public void abandonReviewableChangeByOwner() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    abandon(sc.changeId, sc.owner);
-    assertThat(sender)
-        .sent("abandon", sc)
-        .cc(sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ABANDONED_CHANGES)
-        .noOneElse();
-  }
-
-  @Test
-  public void abandonReviewableChangeByOwnerCcingSelf() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    abandon(sc.changeId, sc.owner, CC_ON_OWN_COMMENTS);
-    assertThat(sender)
-        .sent("abandon", sc)
-        .to(sc.owner)
-        .cc(sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ABANDONED_CHANGES)
-        .noOneElse();
-  }
-
-  @Test
-  public void abandonReviewableChangeByOther() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    TestAccount other = accountCreator.create("other", "other@example.com", "other");
-    abandon(sc.changeId, other);
-    assertThat(sender)
-        .sent("abandon", sc)
-        .to(sc.owner)
-        .cc(sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ABANDONED_CHANGES)
-        .noOneElse();
-  }
-
-  @Test
-  public void abandonReviewableChangeByOtherCcingSelf() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    TestAccount other = accountCreator.create("other", "other@example.com", "other");
-    abandon(sc.changeId, other, CC_ON_OWN_COMMENTS);
-    assertThat(sender)
-        .sent("abandon", sc)
-        .to(sc.owner)
-        .cc(sc.reviewer, sc.ccer, other)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ABANDONED_CHANGES)
-        .noOneElse();
-  }
-
-  @Test
-  public void abandonReviewableChangeNotifyOwnersReviewers() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    abandon(sc.changeId, sc.owner, OWNER_REVIEWERS);
-    assertThat(sender)
-        .sent("abandon", sc)
-        .cc(sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .noOneElse();
-  }
-
-  @Test
-  public void abandonReviewableChangeNotifyOwner() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    abandon(sc.changeId, sc.owner, OWNER);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void abandonReviewableChangeNotifyOwnerCcingSelf() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    abandon(sc.changeId, sc.owner, CC_ON_OWN_COMMENTS, OWNER);
-    // Self-CC applies *after* need for sending notification is determined.
-    // Since there are no recipients before including the user taking action,
-    // there should no notification sent.
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void abandonReviewableChangeByOtherCcingSelfNotifyOwner() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    TestAccount other = accountCreator.create("other", "other@example.com", "other");
-    abandon(sc.changeId, other, CC_ON_OWN_COMMENTS, OWNER);
-    assertThat(sender).sent("abandon", sc).to(sc.owner).cc(other).noOneElse();
-  }
-
-  @Test
-  public void abandonReviewableChangeNotifyNone() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    abandon(sc.changeId, sc.owner, NONE);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void abandonReviewableChangeNotifyNoneCcingSelf() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    abandon(sc.changeId, sc.owner, CC_ON_OWN_COMMENTS, NONE);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void abandonReviewableWipChange() throws Exception {
-    StagedChange sc = stageReviewableWipChange();
-    abandon(sc.changeId, sc.owner);
-    assertThat(sender)
-        .sent("abandon", sc)
-        .cc(sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ABANDONED_CHANGES)
-        .noOneElse();
-  }
-
-  @Test
-  public void abandonWipChange() throws Exception {
-    StagedChange sc = stageWipChange();
-    abandon(sc.changeId, sc.owner);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void abandonWipChangeNotifyAll() throws Exception {
-    StagedChange sc = stageWipChange();
-    abandon(sc.changeId, sc.owner, ALL);
-    assertThat(sender)
-        .sent("abandon", sc)
-        .cc(sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ABANDONED_CHANGES)
-        .noOneElse();
-  }
-
-  private void abandon(String changeId, TestAccount by) throws Exception {
-    abandon(changeId, by, ENABLED);
-  }
-
-  private void abandon(String changeId, TestAccount by, EmailStrategy emailStrategy)
-      throws Exception {
-    abandon(changeId, by, emailStrategy, null);
-  }
-
-  private void abandon(String changeId, TestAccount by, @Nullable NotifyHandling notify)
-      throws Exception {
-    abandon(changeId, by, ENABLED, notify);
-  }
-
-  private void abandon(
-      String changeId, TestAccount by, EmailStrategy emailStrategy, @Nullable NotifyHandling notify)
-      throws Exception {
-    setEmailStrategy(by, emailStrategy);
-    setApiUser(by);
-    AbandonInput in = new AbandonInput();
-    if (notify != null) {
-      in.notify = notify;
-    }
-    gApi.changes().id(changeId).abandon(in);
-  }
-
-  /*
-   * AddReviewerSender tests.
-   */
-
-  private void addReviewerToReviewableChangeInReviewDb(Adder adder) throws Exception {
-    assume().that(notesMigration.readChanges()).isFalse();
-    StagedChange sc = stageReviewableChange();
-    TestAccount reviewer = accountCreator.create("added", "added@example.com", "added");
-    addReviewer(adder, sc.changeId, sc.owner, reviewer.email);
-    assertThat(sender)
-        .sent("newchange", sc)
-        .to(reviewer)
-        .cc(sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .noOneElse();
-  }
-
-  @Test
-  public void addReviewerToReviewableChangeInReviewDbSingly() throws Exception {
-    addReviewerToReviewableChangeInReviewDb(singly());
-  }
-
-  @Test
-  public void addReviewerToReviewableChangeInReviewDbBatch() throws Exception {
-    addReviewerToReviewableChangeInReviewDb(batch());
-  }
-
-  private void addReviewerToReviewableChangeInNoteDb(Adder adder) throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    StagedChange sc = stageReviewableChange();
-    TestAccount reviewer = accountCreator.create("added", "added@example.com", "added");
-    addReviewer(adder, sc.changeId, sc.owner, reviewer.email);
-    // TODO(logan): Should CCs be included?
-    assertThat(sender)
-        .sent("newchange", sc)
-        .to(reviewer)
-        .cc(sc.reviewer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .noOneElse();
-  }
-
-  @Test
-  public void addReviewerToReviewableChangeInNoteDbSingly() throws Exception {
-    addReviewerToReviewableChangeInNoteDb(singly());
-  }
-
-  @Test
-  public void addReviewerToReviewableChangeInNoteDbBatch() throws Exception {
-    addReviewerToReviewableChangeInNoteDb(batch());
-  }
-
-  private void addReviewerToReviewableChangeByOwnerCcingSelfInNoteDb(Adder adder) throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    StagedChange sc = stageReviewableChange();
-    TestAccount reviewer = accountCreator.create("added", "added@example.com", "added");
-    addReviewer(adder, sc.changeId, sc.owner, reviewer.email, CC_ON_OWN_COMMENTS, null);
-    // TODO(logan): Should CCs be included?
-    assertThat(sender)
-        .sent("newchange", sc)
-        .to(reviewer)
-        .cc(sc.owner, sc.reviewer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .noOneElse();
-  }
-
-  @Test
-  public void addReviewerToReviewableChangeByOwnerCcingSelfInNoteDbSingly() throws Exception {
-    addReviewerToReviewableChangeByOwnerCcingSelfInNoteDb(singly());
-  }
-
-  @Test
-  public void addReviewerToReviewableChangeByOwnerCcingSelfInNoteDbBatch() throws Exception {
-    addReviewerToReviewableChangeByOwnerCcingSelfInNoteDb(batch());
-  }
-
-  private void addReviewerToReviewableChangeByOtherInNoteDb(Adder adder) throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    TestAccount other = accountCreator.create("other", "other@example.com", "other");
-    StagedChange sc = stageReviewableChange();
-    TestAccount reviewer = accountCreator.create("added", "added@example.com", "added");
-    addReviewer(adder, sc.changeId, other, reviewer.email);
-    // TODO(logan): Should CCs be included?
-    assertThat(sender)
-        .sent("newchange", sc)
-        .to(reviewer)
-        .cc(sc.owner, sc.reviewer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .noOneElse();
-  }
-
-  @Test
-  public void addReviewerToReviewableChangeByOtherInNoteDbSingly() throws Exception {
-    addReviewerToReviewableChangeByOtherInNoteDb(singly());
-  }
-
-  @Test
-  public void addReviewerToReviewableChangeByOtherInNoteDbBatch() throws Exception {
-    addReviewerToReviewableChangeByOtherInNoteDb(batch());
-  }
-
-  private void addReviewerToReviewableChangeByOtherCcingSelfInNoteDb(Adder adder) throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    TestAccount other = accountCreator.create("other", "other@example.com", "other");
-    StagedChange sc = stageReviewableChange();
-    TestAccount reviewer = accountCreator.create("added", "added@example.com", "added");
-    addReviewer(adder, sc.changeId, other, reviewer.email, CC_ON_OWN_COMMENTS, null);
-    // TODO(logan): Should CCs be included?
-    assertThat(sender)
-        .sent("newchange", sc)
-        .to(reviewer)
-        .cc(sc.owner, sc.reviewer, other)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .noOneElse();
-  }
-
-  @Test
-  public void addReviewerToReviewableChangeByOtherCcingSelfInNoteDbSingly() throws Exception {
-    addReviewerToReviewableChangeByOtherCcingSelfInNoteDb(singly());
-  }
-
-  @Test
-  public void addReviewerToReviewableChangeByOtherCcingSelfInNoteDbBatch() throws Exception {
-    addReviewerToReviewableChangeByOtherCcingSelfInNoteDb(batch());
-  }
-
-  private void addReviewerByEmailToReviewableChangeInReviewDb(Adder adder) throws Exception {
-    assume().that(notesMigration.readChanges()).isFalse();
-    String email = "addedbyemail@example.com";
-    StagedChange sc = stageReviewableChange();
-    addReviewer(adder, sc.changeId, sc.owner, email);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void addReviewerByEmailToReviewableChangeInReviewDbSingly() throws Exception {
-    addReviewerByEmailToReviewableChangeInReviewDb(singly());
-  }
-
-  @Test
-  public void addReviewerByEmailToReviewableChangeInReviewDbBatch() throws Exception {
-    addReviewerByEmailToReviewableChangeInReviewDb(batch());
-  }
-
-  private void addReviewerByEmailToReviewableChangeInNoteDb(Adder adder) throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    String email = "addedbyemail@example.com";
-    StagedChange sc = stageReviewableChange();
-    addReviewer(adder, sc.changeId, sc.owner, email);
-    // TODO(logan): Should CCs be included?
-    assertThat(sender)
-        .sent("newchange", sc)
-        .to(email)
-        .cc(sc.reviewer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .noOneElse();
-  }
-
-  @Test
-  public void addReviewerByEmailToReviewableChangeInNoteDbSingly() throws Exception {
-    addReviewerByEmailToReviewableChangeInNoteDb(singly());
-  }
-
-  @Test
-  public void addReviewerByEmailToReviewableChangeInNoteDbBatch() throws Exception {
-    addReviewerByEmailToReviewableChangeInNoteDb(batch());
-  }
-
-  private void addReviewerToWipChange(Adder adder) throws Exception {
-    StagedChange sc = stageWipChange();
-    TestAccount reviewer = accountCreator.create("added", "added@example.com", "added");
-    addReviewer(adder, sc.changeId, sc.owner, reviewer.email);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void addReviewerToWipChangeSingly() throws Exception {
-    addReviewerToWipChange(singly());
-  }
-
-  @Test
-  public void addReviewerToWipChangeBatch() throws Exception {
-    addReviewerToWipChange(batch());
-  }
-
-  private void addReviewerToReviewableWipChange(Adder adder) throws Exception {
-    StagedChange sc = stageReviewableWipChange();
-    TestAccount reviewer = accountCreator.create("added", "added@example.com", "added");
-    addReviewer(adder, sc.changeId, sc.owner, reviewer.email);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void addReviewerToReviewableWipChangeSingly() throws Exception {
-    addReviewerToReviewableWipChange(singly());
-  }
-
-  @Test
-  public void addReviewerToReviewableWipChangeBatch() throws Exception {
-    addReviewerToReviewableWipChange(batch());
-  }
-
-  private void addReviewerToWipChangeInNoteDbNotifyAll(Adder adder) throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    StagedChange sc = stageWipChange();
-    TestAccount reviewer = accountCreator.create("added", "added@example.com", "added");
-    addReviewer(adder, sc.changeId, sc.owner, reviewer.email, NotifyHandling.ALL);
-    // TODO(logan): Should CCs be included?
-    assertThat(sender)
-        .sent("newchange", sc)
-        .to(reviewer)
-        .cc(sc.reviewer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .noOneElse();
-  }
-
-  @Test
-  public void addReviewerToWipChangeInNoteDbNotifyAllSingly() throws Exception {
-    addReviewerToWipChangeInNoteDbNotifyAll(singly());
-  }
-
-  @Test
-  public void addReviewerToWipChangeInNoteDbNotifyAllBatch() throws Exception {
-    addReviewerToWipChangeInNoteDbNotifyAll(batch());
-  }
-
-  private void addReviewerToWipChangeInReviewDbNotifyAll(Adder adder) throws Exception {
-    assume().that(notesMigration.readChanges()).isFalse();
-    StagedChange sc = stageWipChange();
-    TestAccount reviewer = accountCreator.create("added", "added@example.com", "added");
-    addReviewer(adder, sc.changeId, sc.owner, reviewer.email, NotifyHandling.ALL);
-    assertThat(sender)
-        .sent("newchange", sc)
-        .to(reviewer)
-        .cc(sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .noOneElse();
-  }
-
-  @Test
-  public void addReviewerToWipChangeInReviewDbNotifyAllSingly() throws Exception {
-    addReviewerToWipChangeInReviewDbNotifyAll(singly());
-  }
-
-  @Test
-  public void addReviewerToWipChangeInReviewDbNotifyAllBatch() throws Exception {
-    addReviewerToWipChangeInReviewDbNotifyAll(batch());
-  }
-
-  private void addReviewerToReviewableChangeInNoteDbNotifyOwnerReviewers(Adder adder)
-      throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    StagedChange sc = stageReviewableChange();
-    TestAccount reviewer = accountCreator.create("added", "added@example.com", "added");
-    addReviewer(adder, sc.changeId, sc.owner, reviewer.email, OWNER_REVIEWERS);
-    // TODO(logan): Should CCs be included?
-    assertThat(sender)
-        .sent("newchange", sc)
-        .to(reviewer)
-        .cc(sc.reviewer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .noOneElse();
-  }
-
-  @Test
-  public void addReviewerToReviewableChangeInNoteDbNotifyOwnerReviewersSingly() throws Exception {
-    addReviewerToReviewableChangeInNoteDbNotifyOwnerReviewers(singly());
-  }
-
-  @Test
-  public void addReviewerToReviewableChangeInNoteDbNotifyOwnerReviewersBatch() throws Exception {
-    addReviewerToReviewableChangeInNoteDbNotifyOwnerReviewers(batch());
-  }
-
-  private void addReviewerToReviewableChangeInNoteDbByOwnerCcingSelfNotifyOwner(Adder adder)
-      throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    StagedChange sc = stageReviewableChange();
-    TestAccount reviewer = accountCreator.create("added", "added@example.com", "added");
-    addReviewer(adder, sc.changeId, sc.owner, reviewer.email, CC_ON_OWN_COMMENTS, OWNER);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void addReviewerToReviewableChangeInNoteDbByOwnerCcingSelfNotifyOwnerSingly()
-      throws Exception {
-    addReviewerToReviewableChangeInNoteDbByOwnerCcingSelfNotifyOwner(singly());
-  }
-
-  @Test
-  public void addReviewerToReviewableChangeInNoteDbByOwnerCcingSelfNotifyOwnerBatch()
-      throws Exception {
-    addReviewerToReviewableChangeInNoteDbByOwnerCcingSelfNotifyOwner(batch());
-  }
-
-  private void addReviewerToReviewableChangeInNoteDbByOwnerCcingSelfNotifyNone(Adder adder)
-      throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    StagedChange sc = stageReviewableChange();
-    TestAccount reviewer = accountCreator.create("added", "added@example.com", "added");
-    addReviewer(adder, sc.changeId, sc.owner, reviewer.email, CC_ON_OWN_COMMENTS, NONE);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void addReviewerToReviewableChangeInNoteDbByOwnerCcingSelfNotifyNoneSingly()
-      throws Exception {
-    addReviewerToReviewableChangeInNoteDbByOwnerCcingSelfNotifyNone(singly());
-  }
-
-  @Test
-  public void addReviewerToReviewableChangeInNoteDbByOwnerCcingSelfNotifyNoneBatch()
-      throws Exception {
-    addReviewerToReviewableChangeInNoteDbByOwnerCcingSelfNotifyNone(batch());
-  }
-
-  private interface Adder {
-    void addReviewer(String changeId, String reviewer, @Nullable NotifyHandling notify)
-        throws Exception;
-  }
-
-  private Adder singly() {
-    return (String changeId, String reviewer, @Nullable NotifyHandling notify) -> {
-      AddReviewerInput in = new AddReviewerInput();
-      in.reviewer = reviewer;
-      if (notify != null) {
-        in.notify = notify;
-      }
-      gApi.changes().id(changeId).addReviewer(in);
-    };
-  }
-
-  private Adder batch() {
-    return (String changeId, String reviewer, @Nullable NotifyHandling notify) -> {
-      ReviewInput in = ReviewInput.noScore();
-      in.reviewer(reviewer);
-      if (notify != null) {
-        in.notify = notify;
-      }
-      gApi.changes().id(changeId).revision("current").review(in);
-    };
-  }
-
-  private void addReviewer(Adder adder, String changeId, TestAccount by, String reviewer)
-      throws Exception {
-    addReviewer(adder, changeId, by, reviewer, ENABLED, null);
-  }
-
-  private void addReviewer(
-      Adder adder, String changeId, TestAccount by, String reviewer, NotifyHandling notify)
-      throws Exception {
-    addReviewer(adder, changeId, by, reviewer, ENABLED, notify);
-  }
-
-  private void addReviewer(
-      Adder adder,
-      String changeId,
-      TestAccount by,
-      String reviewer,
-      EmailStrategy emailStrategy,
-      @Nullable NotifyHandling notify)
-      throws Exception {
-    setEmailStrategy(by, emailStrategy);
-    setApiUser(by);
-    adder.addReviewer(changeId, reviewer, notify);
-  }
-
-  /*
-   * CommentSender tests.
-   */
-
-  @Test
-  public void commentOnReviewableChangeByOwner() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    review(sc.owner, sc.changeId, ENABLED);
-    assertThat(sender)
-        .sent("comment", sc)
-        .cc(sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void commentOnReviewableChangeByReviewer() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    review(sc.reviewer, sc.changeId, ENABLED);
-    assertThat(sender)
-        .sent("comment", sc)
-        .to(sc.owner)
-        .cc(sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void commentOnReviewableChangeByOwnerCcingSelf() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    review(sc.owner, sc.changeId, CC_ON_OWN_COMMENTS);
-    assertThat(sender)
-        .sent("comment", sc)
-        .to(sc.owner)
-        .cc(sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void commentOnReviewableChangeByReviewerCcingSelf() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    review(sc.reviewer, sc.changeId, CC_ON_OWN_COMMENTS);
-    assertThat(sender)
-        .sent("comment", sc)
-        .to(sc.owner)
-        .cc(sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void commentOnReviewableChangeByOther() throws Exception {
-    TestAccount other = accountCreator.create("other", "other@example.com", "other");
-    StagedChange sc = stageReviewableChange();
-    review(other, sc.changeId, ENABLED);
-    assertThat(sender)
-        .sent("comment", sc)
-        .to(sc.owner)
-        .cc(sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void commentOnReviewableChangeByOtherCcingSelf() throws Exception {
-    TestAccount other = accountCreator.create("other", "other@example.com", "other");
-    StagedChange sc = stageReviewableChange();
-    review(other, sc.changeId, CC_ON_OWN_COMMENTS);
-    assertThat(sender)
-        .sent("comment", sc)
-        .to(sc.owner)
-        .cc(sc.reviewer, sc.ccer, other)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void commentOnReviewableChangeByOwnerNotifyOwnerReviewers() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    review(sc.owner, sc.changeId, ENABLED, OWNER_REVIEWERS);
-    assertThat(sender)
-        .sent("comment", sc)
-        .cc(sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .noOneElse();
-  }
-
-  @Test
-  public void commentOnReviewableChangeByOwnerNotifyOwner() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    review(sc.owner, sc.changeId, ENABLED, OWNER);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void commentOnReviewableChangeByOwnerCcingSelfNotifyOwner() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    setEmailStrategy(sc.owner, CC_ON_OWN_COMMENTS);
-    review(sc.owner, sc.changeId, ENABLED, OWNER);
-    assertThat(sender).notSent(); // TODO(logan): Why not send to owner?
-  }
-
-  @Test
-  public void commentOnReviewableChangeByOwnerNotifyNone() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    review(sc.owner, sc.changeId, ENABLED, NONE);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void commentOnReviewableChangeByOwnerCcingSelfNotifyNone() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    setEmailStrategy(sc.owner, CC_ON_OWN_COMMENTS);
-    review(sc.owner, sc.changeId, ENABLED, NONE);
-    assertThat(sender).notSent(); // TODO(logan): Why not send to owner?
-  }
-
-  @Test
-  public void commentOnReviewableChangeByBot() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    TestAccount bot = sc.testAccount("bot");
-    review(bot, sc.changeId, ENABLED, null, "autogenerated:bot");
-    assertThat(sender)
-        .sent("comment", sc)
-        .to(sc.owner)
-        .cc(sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .noOneElse();
-  }
-
-  @Test
-  public void commentOnWipChangeByOwner() throws Exception {
-    StagedChange sc = stageWipChange();
-    review(sc.owner, sc.changeId, ENABLED);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void commentOnWipChangeByOwnerCcingSelf() throws Exception {
-    StagedChange sc = stageWipChange();
-    review(sc.owner, sc.changeId, CC_ON_OWN_COMMENTS);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void commentOnWipChangeByOwnerNotifyAll() throws Exception {
-    StagedChange sc = stageWipChange();
-    review(sc.owner, sc.changeId, ENABLED, ALL);
-    assertThat(sender)
-        .sent("comment", sc)
-        .cc(sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void commentOnWipChangeByBot() throws Exception {
-    StagedChange sc = stageWipChange();
-    TestAccount bot = sc.testAccount("bot");
-    review(bot, sc.changeId, ENABLED, null, "autogenerated:tag");
-    assertThat(sender).sent("comment", sc).to(sc.owner).noOneElse();
-  }
-
-  @Test
-  public void commentOnReviewableWipChangeByBot() throws Exception {
-    StagedChange sc = stageReviewableWipChange();
-    TestAccount bot = sc.testAccount("bot");
-    review(bot, sc.changeId, ENABLED, null, "autogenerated:tag");
-    assertThat(sender).sent("comment", sc).to(sc.owner).noOneElse();
-  }
-
-  @Test
-  public void commentOnReviewableWipChangeByBotNotifyAll() throws Exception {
-    StagedChange sc = stageWipChange();
-    TestAccount bot = sc.testAccount("bot");
-    review(bot, sc.changeId, ENABLED, ALL, "tag");
-    assertThat(sender)
-        .sent("comment", sc)
-        .to(sc.owner)
-        .cc(sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void commentOnReviewableWipChangeByOwner() throws Exception {
-    StagedChange sc = stageReviewableWipChange();
-    review(sc.owner, sc.changeId, ENABLED);
-    assertThat(sender)
-        .sent("comment", sc)
-        .cc(sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void noCommentAndSetWorkInProgress() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    ReviewInput in = ReviewInput.noScore().setWorkInProgress(true);
-    gApi.changes().id(sc.changeId).revision("current").review(in);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void commentAndSetWorkInProgress() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    ReviewInput in = ReviewInput.noScore().message("ok").setWorkInProgress(true);
-    gApi.changes().id(sc.changeId).revision("current").review(in);
-    assertThat(sender)
-        .sent("comment", sc)
-        .cc(sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void commentOnWipChangeAndStartReview() throws Exception {
-    StagedChange sc = stageWipChange();
-    ReviewInput in = ReviewInput.noScore().message("ok").setWorkInProgress(false);
-    gApi.changes().id(sc.changeId).revision("current").review(in);
-    assertThat(sender)
-        .sent("comment", sc)
-        .cc(sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void addReviewerOnWipChangeAndStartReview() throws Exception {
-    StagedChange sc = stageWipChange();
-    ReviewInput in = ReviewInput.noScore().reviewer(other.email).setWorkInProgress(false);
-    gApi.changes().id(sc.changeId).revision("current").review(in);
-    assertThat(sender)
-        .sent("comment", sc)
-        .cc(sc.reviewer, sc.ccer, other)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void startReviewMessageNotRepeated() throws Exception {
-    // TODO(logan): Remove this test check once PolyGerrit workaround is rolled back.
-    StagedChange sc = stageWipChange();
-    ReviewInput in =
-        ReviewInput.noScore().message(PostReview.START_REVIEW_MESSAGE).setWorkInProgress(false);
-    gApi.changes().id(sc.changeId).revision("current").review(in);
-    Truth.assertThat(sender.getMessages()).isNotEmpty();
-    String body = sender.getMessages().get(0).body();
-    int idx = body.indexOf(PostReview.START_REVIEW_MESSAGE);
-    Truth.assertThat(idx).isAtLeast(0);
-    Truth.assertThat(body.indexOf(PostReview.START_REVIEW_MESSAGE, idx + 1)).isEqualTo(-1);
-  }
-
-  private void review(TestAccount account, String changeId, EmailStrategy strategy)
-      throws Exception {
-    review(account, changeId, strategy, null);
-  }
-
-  private void review(
-      TestAccount account, String changeId, EmailStrategy strategy, @Nullable NotifyHandling notify)
-      throws Exception {
-    review(account, changeId, strategy, notify, null);
-  }
-
-  private void review(
-      TestAccount account,
-      String changeId,
-      EmailStrategy strategy,
-      @Nullable NotifyHandling notify,
-      @Nullable String tag)
-      throws Exception {
-    setEmailStrategy(account, strategy);
-    ReviewInput in = ReviewInput.recommend();
-    in.notify = notify;
-    in.tag = tag;
-    gApi.changes().id(changeId).revision("current").review(in);
-  }
-
-  /*
-   * CreateChangeSender tests.
-   */
-
-  @Test
-  public void createReviewableChange() throws Exception {
-    StagedPreChange spc = stagePreChange("refs/for/master");
-    assertThat(sender)
-        .sent("newchange", spc)
-        .to(spc.watchingProjectOwner)
-        .bcc(NEW_CHANGES, NEW_PATCHSETS)
-        .noOneElse();
-  }
-
-  @Test
-  public void createWipChange() throws Exception {
-    stagePreChange("refs/for/master%wip");
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void createWipChangeWithWorkInProgressByDefaultForProject() throws Exception {
-    setWorkInProgressByDefault(project, InheritableBoolean.TRUE);
-    StagedPreChange spc = stagePreChange("refs/for/master");
-    Truth.assertThat(gApi.changes().id(spc.changeId).get().workInProgress).isTrue();
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void createWipChangeWithWorkInProgressByDefaultForUser() throws Exception {
-    // Make sure owner user is created
-    StagedChange sc = stageReviewableChange();
-    // All was cleaned already
-    assertThat(sender).notSent();
-
-    // Toggle workInProgress flag for owner
-    GeneralPreferencesInfo prefs = gApi.accounts().id(sc.owner.id.get()).getPreferences();
-    prefs.workInProgressByDefault = true;
-    gApi.accounts().id(sc.owner.id.get()).setPreferences(prefs);
-
-    // Create another change without notification that should be wip
-    StagedPreChange spc = stagePreChange("refs/for/master");
-    Truth.assertThat(gApi.changes().id(spc.changeId).get().workInProgress).isTrue();
-    assertThat(sender).notSent();
-
-    // Clean up workInProgressByDefault by owner
-    prefs = gApi.accounts().id(sc.owner.id.get()).getPreferences();
-    Truth.assertThat(prefs.workInProgressByDefault).isTrue();
-    prefs.workInProgressByDefault = false;
-    gApi.accounts().id(sc.owner.id.get()).setPreferences(prefs);
-  }
-
-  @Test
-  public void createReviewableChangeWithNotifyOwnerReviewers() throws Exception {
-    stagePreChange("refs/for/master%notify=OWNER_REVIEWERS");
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void createReviewableChangeWithNotifyOwner() throws Exception {
-    stagePreChange("refs/for/master%notify=OWNER");
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void createReviewableChangeWithNotifyNone() throws Exception {
-    stagePreChange("refs/for/master%notify=OWNER");
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void createWipChangeWithNotifyAll() throws Exception {
-    StagedPreChange spc = stagePreChange("refs/for/master%wip,notify=ALL");
-    assertThat(sender)
-        .sent("newchange", spc)
-        .to(spc.watchingProjectOwner)
-        .bcc(NEW_CHANGES, NEW_PATCHSETS)
-        .noOneElse();
-  }
-
-  @Test
-  public void createReviewableChangeWithReviewersAndCcs() throws Exception {
-    // TODO(logan): Support reviewers/CCs-by-email via push option.
-    StagedPreChange spc =
-        stagePreChange(
-            "refs/for/master",
-            users -> ImmutableList.of("r=" + users.reviewer.username, "cc=" + users.ccer.username));
-    assertThat(sender)
-        .sent("newchange", spc)
-        .to(spc.reviewer, spc.watchingProjectOwner)
-        .cc(spc.ccer)
-        .bcc(NEW_CHANGES, NEW_PATCHSETS)
-        .noOneElse();
-  }
-
-  /*
-   * DeleteReviewerSender tests.
-   */
-
-  @Test
-  public void deleteReviewerFromReviewableChange() throws Exception {
-    StagedChange sc = stageReviewableChangeWithExtraReviewer();
-    setApiUser(sc.owner);
-    removeReviewer(sc, extraReviewer);
-    assertThat(sender)
-        .sent("deleteReviewer", sc)
-        .to(extraReviewer)
-        .cc(extraCcer, sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void deleteReviewerFromReviewableChangeByOwnerCcingSelf() throws Exception {
-    StagedChange sc = stageReviewableChangeWithExtraReviewer();
-    setEmailStrategy(sc.owner, EmailStrategy.CC_ON_OWN_COMMENTS);
-    removeReviewer(sc, extraReviewer);
-    assertThat(sender)
-        .sent("deleteReviewer", sc)
-        .to(sc.owner, extraReviewer)
-        .cc(extraCcer, sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void deleteReviewerFromReviewableChangeByAdmin() throws Exception {
-    StagedChange sc = stageReviewableChangeWithExtraReviewer();
-    setApiUser(admin);
-    removeReviewer(sc, extraReviewer);
-    assertThat(sender)
-        .sent("deleteReviewer", sc)
-        .to(sc.owner, extraReviewer)
-        .cc(extraCcer, sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void deleteReviewerFromReviewableChangeByAdminCcingSelf() throws Exception {
-    StagedChange sc = stageReviewableChangeWithExtraReviewer();
-    setEmailStrategy(admin, EmailStrategy.CC_ON_OWN_COMMENTS);
-    setApiUser(admin);
-    removeReviewer(sc, extraReviewer);
-    assertThat(sender)
-        .sent("deleteReviewer", sc)
-        .to(sc.owner, extraReviewer)
-        .cc(admin, extraCcer, sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void deleteCcerFromReviewableChange() throws Exception {
-    StagedChange sc = stageReviewableChangeWithExtraReviewer();
-    setApiUser(sc.owner);
-    removeReviewer(sc, extraCcer);
-    assertThat(sender)
-        .sent("deleteReviewer", sc)
-        .to(extraCcer)
-        .cc(sc.reviewer, sc.ccer, extraReviewer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void deleteReviewerFromReviewableChangeNotifyOwnerReviewers() throws Exception {
-    StagedChange sc = stageReviewableChangeWithExtraReviewer();
-    setApiUser(sc.owner);
-    removeReviewer(sc, extraReviewer, NotifyHandling.OWNER_REVIEWERS);
-    assertThat(sender)
-        .sent("deleteReviewer", sc)
-        .to(extraReviewer)
-        .cc(extraCcer, sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .noOneElse();
-  }
-
-  @Test
-  public void deleteReviewerFromReviewableChangeNotifyOwner() throws Exception {
-    StagedChange sc = stageReviewableChangeWithExtraReviewer();
-    removeReviewer(sc, extraReviewer, NotifyHandling.OWNER);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void deleteReviewerFromReviewableChangeByOwnerCcingSelfNotifyOwner() throws Exception {
-    StagedChange sc = stageReviewableChangeWithExtraReviewer();
-    setEmailStrategy(sc.owner, EmailStrategy.CC_ON_OWN_COMMENTS);
-    removeReviewer(sc, extraReviewer, NotifyHandling.OWNER);
-    assertThat(sender).sent("deleteReviewer", sc).to(sc.owner, extraReviewer).noOneElse();
-  }
-
-  @Test
-  public void deleteReviewerFromReviewableChangeNotifyNone() throws Exception {
-    StagedChange sc = stageReviewableChangeWithExtraReviewer();
-    removeReviewer(sc, extraReviewer, NotifyHandling.NONE);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void deleteReviewerFromReviewableChangeByOwnerCcingSelfNotifyNone() throws Exception {
-    StagedChange sc = stageReviewableChangeWithExtraReviewer();
-    setEmailStrategy(sc.owner, EmailStrategy.CC_ON_OWN_COMMENTS);
-    removeReviewer(sc, extraReviewer, NotifyHandling.NONE);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void deleteReviewerFromReviewableWipChange() throws Exception {
-    StagedChange sc = stageReviewableWipChangeWithExtraReviewer();
-    removeReviewer(sc, extraReviewer);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void deleteReviewerFromWipChange() throws Exception {
-    StagedChange sc = stageWipChangeWithExtraReviewer();
-    removeReviewer(sc, extraReviewer);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void deleteReviewerFromWipChangeNotifyAll() throws Exception {
-    StagedChange sc = stageWipChangeWithExtraReviewer();
-    setApiUser(sc.owner);
-    removeReviewer(sc, extraReviewer, NotifyHandling.ALL);
-    assertThat(sender)
-        .sent("deleteReviewer", sc)
-        .to(extraReviewer)
-        .cc(extraCcer, sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void deleteReviewerWithApprovalFromWipChange() throws Exception {
-    StagedChange sc = stageWipChangeWithExtraReviewer();
-    recommend(sc, extraReviewer);
-    setApiUser(sc.owner);
-    removeReviewer(sc, extraReviewer);
-    assertThat(sender).sent("deleteReviewer", sc).to(extraReviewer).noOneElse();
-  }
-
-  @Test
-  public void deleteReviewerWithApprovalFromWipChangeNotifyOwner() throws Exception {
-    StagedChange sc = stageWipChangeWithExtraReviewer();
-    recommend(sc, extraReviewer);
-    removeReviewer(sc, extraReviewer, NotifyHandling.OWNER);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void deleteReviewerByEmailFromWipChangeInNoteDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    StagedChange sc = stageWipChangeWithExtraReviewer();
-    gApi.changes().id(sc.changeId).reviewer(sc.reviewerByEmail).remove();
-    assertThat(sender).notSent();
-  }
-
-  private void recommend(StagedChange sc, TestAccount by) throws Exception {
-    setApiUser(by);
-    gApi.changes().id(sc.changeId).revision("current").review(ReviewInput.recommend());
-  }
-
-  private interface Stager {
-    StagedChange stage() throws Exception;
-  }
-
-  private StagedChange stageChangeWithExtraReviewer(Stager stager) throws Exception {
-    StagedChange sc = stager.stage();
-    ReviewInput in =
-        ReviewInput.noScore()
-            .reviewer(extraReviewer.email)
-            .reviewer(extraCcer.email, ReviewerState.CC, false);
-    setApiUser(extraReviewer);
-    gApi.changes().id(sc.changeId).revision("current").review(in);
-    return sc;
-  }
-
-  private StagedChange stageReviewableChangeWithExtraReviewer() throws Exception {
-    return stageChangeWithExtraReviewer(this::stageReviewableChange);
-  }
-
-  private StagedChange stageReviewableWipChangeWithExtraReviewer() throws Exception {
-    return stageChangeWithExtraReviewer(this::stageReviewableWipChange);
-  }
-
-  private StagedChange stageWipChangeWithExtraReviewer() throws Exception {
-    return stageChangeWithExtraReviewer(this::stageWipChange);
-  }
-
-  private void removeReviewer(StagedChange sc, TestAccount account) throws Exception {
-    sender.clear();
-    gApi.changes().id(sc.changeId).reviewer(account.email).remove();
-  }
-
-  private void removeReviewer(StagedChange sc, TestAccount account, NotifyHandling notify)
-      throws Exception {
-    sender.clear();
-    DeleteReviewerInput in = new DeleteReviewerInput();
-    in.notify = notify;
-    gApi.changes().id(sc.changeId).reviewer(account.email).remove(in);
-  }
-
-  /*
-   * DeleteVoteSender tests.
-   */
-
-  @Test
-  public void deleteVoteFromReviewableChange() throws Exception {
-    StagedChange sc = stageReviewableChangeWithExtraReviewer();
-    recommend(sc, extraReviewer);
-    setApiUser(sc.owner);
-    deleteVote(sc, extraReviewer);
-    assertThat(sender)
-        .sent("deleteVote", sc)
-        .cc(sc.reviewer, sc.ccer, extraReviewer, extraCcer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void deleteVoteFromReviewableChangeWithSelfCc() throws Exception {
-    StagedChange sc = stageReviewableChangeWithExtraReviewer();
-    recommend(sc, extraReviewer);
-    setEmailStrategy(sc.owner, CC_ON_OWN_COMMENTS);
-    setApiUser(sc.owner);
-    deleteVote(sc, extraReviewer);
-    assertThat(sender)
-        .sent("deleteVote", sc)
-        .to(sc.owner)
-        .cc(sc.reviewer, sc.ccer, extraReviewer, extraCcer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void deleteVoteFromReviewableChangeByAdmin() throws Exception {
-    StagedChange sc = stageReviewableChangeWithExtraReviewer();
-    recommend(sc, extraReviewer);
-    setApiUser(admin);
-    deleteVote(sc, extraReviewer);
-    assertThat(sender)
-        .sent("deleteVote", sc)
-        .to(sc.owner)
-        .cc(sc.reviewer, sc.ccer, extraReviewer, extraCcer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void deleteVoteFromReviewableChangeByAdminCcingSelf() throws Exception {
-    StagedChange sc = stageReviewableChangeWithExtraReviewer();
-    recommend(sc, extraReviewer);
-    setEmailStrategy(admin, EmailStrategy.CC_ON_OWN_COMMENTS);
-    setApiUser(admin);
-    deleteVote(sc, extraReviewer);
-    assertThat(sender)
-        .sent("deleteVote", sc)
-        .to(sc.owner)
-        .cc(sc.reviewer, sc.ccer, admin, extraReviewer, extraCcer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void deleteVoteFromReviewableChangeNotifyOwnerReviewers() throws Exception {
-    StagedChange sc = stageReviewableChangeWithExtraReviewer();
-    recommend(sc, extraReviewer);
-    setApiUser(sc.owner);
-    deleteVote(sc, extraReviewer, NotifyHandling.OWNER_REVIEWERS);
-    assertThat(sender)
-        .sent("deleteVote", sc)
-        .cc(sc.reviewer, sc.ccer, extraReviewer, extraCcer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .noOneElse();
-  }
-
-  @Test
-  public void deleteVoteFromReviewableChangeNotifyOwnerReviewersWithSelfCc() throws Exception {
-    StagedChange sc = stageReviewableChangeWithExtraReviewer();
-    recommend(sc, extraReviewer);
-    setEmailStrategy(sc.owner, CC_ON_OWN_COMMENTS);
-    setApiUser(sc.owner);
-    deleteVote(sc, extraReviewer, NotifyHandling.OWNER_REVIEWERS);
-    assertThat(sender)
-        .sent("deleteVote", sc)
-        .to(sc.owner)
-        .cc(sc.reviewer, sc.ccer, extraReviewer, extraCcer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .noOneElse();
-  }
-
-  @Test
-  public void deleteVoteFromReviewableChangeNotifyOwner() throws Exception {
-    StagedChange sc = stageReviewableChangeWithExtraReviewer();
-    recommend(sc, extraReviewer);
-    setApiUser(admin);
-    deleteVote(sc, extraReviewer, NotifyHandling.OWNER);
-    assertThat(sender).sent("deleteVote", sc).to(sc.owner).noOneElse();
-  }
-
-  @Test
-  public void deleteVoteFromReviewableChangeNotifyNone() throws Exception {
-    StagedChange sc = stageReviewableChangeWithExtraReviewer();
-    recommend(sc, extraReviewer);
-    setApiUser(sc.owner);
-    deleteVote(sc, extraReviewer, NotifyHandling.NONE);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void deleteVoteFromReviewableChangeNotifyNoneWithSelfCc() throws Exception {
-    StagedChange sc = stageReviewableChangeWithExtraReviewer();
-    recommend(sc, extraReviewer);
-    setEmailStrategy(sc.owner, CC_ON_OWN_COMMENTS);
-    setApiUser(sc.owner);
-    deleteVote(sc, extraReviewer, NotifyHandling.NONE);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void deleteVoteFromReviewableWipChange() throws Exception {
-    StagedChange sc = stageReviewableWipChangeWithExtraReviewer();
-    recommend(sc, extraReviewer);
-    setApiUser(sc.owner);
-    deleteVote(sc, extraReviewer);
-    assertThat(sender)
-        .sent("deleteVote", sc)
-        .cc(sc.reviewer, sc.ccer, extraReviewer, extraCcer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void deleteVoteFromWipChange() throws Exception {
-    StagedChange sc = stageWipChangeWithExtraReviewer();
-    recommend(sc, extraReviewer);
-    setApiUser(sc.owner);
-    deleteVote(sc, extraReviewer);
-    assertThat(sender)
-        .sent("deleteVote", sc)
-        .cc(sc.reviewer, sc.ccer, extraReviewer, extraCcer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  private void deleteVote(StagedChange sc, TestAccount account) throws Exception {
-    sender.clear();
-    gApi.changes().id(sc.changeId).reviewer(account.email).deleteVote("Code-Review");
-  }
-
-  private void deleteVote(StagedChange sc, TestAccount account, NotifyHandling notify)
-      throws Exception {
-    sender.clear();
-    DeleteVoteInput in = new DeleteVoteInput();
-    in.label = "Code-Review";
-    in.notify = notify;
-    gApi.changes().id(sc.changeId).reviewer(account.email).deleteVote(in);
-  }
-
-  /*
-   * MergedSender tests.
-   */
-
-  @Test
-  public void mergeByOwner() throws Exception {
-    StagedChange sc = stageChangeReadyForMerge();
-    merge(sc.changeId, sc.owner);
-    assertThat(sender)
-        .sent("merged", sc)
-        .cc(sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS, SUBMITTED_CHANGES)
-        .noOneElse();
-  }
-
-  @Test
-  public void mergeByOwnerCcingSelf() throws Exception {
-    StagedChange sc = stageChangeReadyForMerge();
-    merge(sc.changeId, sc.owner, EmailStrategy.CC_ON_OWN_COMMENTS);
-    assertThat(sender)
-        .sent("merged", sc)
-        .to(sc.owner)
-        .cc(sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS, SUBMITTED_CHANGES)
-        .noOneElse();
-  }
-
-  @Test
-  public void mergeByReviewer() throws Exception {
-    StagedChange sc = stageChangeReadyForMerge();
-    merge(sc.changeId, sc.reviewer);
-    assertThat(sender)
-        .sent("merged", sc)
-        .to(sc.owner)
-        .cc(sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS, SUBMITTED_CHANGES)
-        .noOneElse();
-  }
-
-  @Test
-  public void mergeByReviewerCcingSelf() throws Exception {
-    StagedChange sc = stageChangeReadyForMerge();
-    merge(sc.changeId, sc.reviewer, EmailStrategy.CC_ON_OWN_COMMENTS);
-    assertThat(sender)
-        .sent("merged", sc)
-        .to(sc.owner)
-        .cc(sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS, SUBMITTED_CHANGES)
-        .noOneElse();
-  }
-
-  @Test
-  public void mergeByOtherNotifyOwnerReviewers() throws Exception {
-    StagedChange sc = stageChangeReadyForMerge();
-    merge(sc.changeId, other, OWNER_REVIEWERS);
-    assertThat(sender)
-        .sent("merged", sc)
-        .to(sc.owner)
-        .cc(sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .noOneElse();
-  }
-
-  @Test
-  public void mergeByOtherNotifyOwner() throws Exception {
-    StagedChange sc = stageChangeReadyForMerge();
-    merge(sc.changeId, other, OWNER);
-    assertThat(sender).sent("merged", sc).to(sc.owner).noOneElse();
-  }
-
-  @Test
-  public void mergeByOtherCcingSelfNotifyOwner() throws Exception {
-    StagedChange sc = stageChangeReadyForMerge();
-    setEmailStrategy(other, EmailStrategy.CC_ON_OWN_COMMENTS);
-    merge(sc.changeId, other, OWNER);
-    assertThat(sender).sent("merged", sc).to(sc.owner).noOneElse();
-  }
-
-  @Test
-  public void mergeByOtherNotifyNone() throws Exception {
-    StagedChange sc = stageChangeReadyForMerge();
-    merge(sc.changeId, other, NONE);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void mergeByOtherCcingSelfNotifyNone() throws Exception {
-    StagedChange sc = stageChangeReadyForMerge();
-    setEmailStrategy(other, EmailStrategy.CC_ON_OWN_COMMENTS);
-    merge(sc.changeId, other, NONE);
-    assertThat(sender).notSent();
-  }
-
-  private void merge(String changeId, TestAccount by) throws Exception {
-    merge(changeId, by, ENABLED);
-  }
-
-  private void merge(String changeId, TestAccount by, EmailStrategy emailStrategy)
-      throws Exception {
-    setEmailStrategy(by, emailStrategy);
-    setApiUser(by);
-    gApi.changes().id(changeId).revision("current").submit();
-  }
-
-  private void merge(String changeId, TestAccount by, NotifyHandling notify) throws Exception {
-    merge(changeId, by, ENABLED, notify);
-  }
-
-  private void merge(
-      String changeId, TestAccount by, EmailStrategy emailStrategy, NotifyHandling notify)
-      throws Exception {
-    setEmailStrategy(by, emailStrategy);
-    setApiUser(by);
-    SubmitInput in = new SubmitInput();
-    in.notify = notify;
-    gApi.changes().id(changeId).revision("current").submit(in);
-  }
-
-  private StagedChange stageChangeReadyForMerge() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    setApiUser(sc.reviewer);
-    gApi.changes().id(sc.changeId).revision("current").review(ReviewInput.approve());
-    sender.clear();
-    return sc;
-  }
-
-  /*
-   * ReplacePatchSetSender tests.
-   */
-
-  @Test
-  public void newPatchSetByOwnerOnReviewableChangeInNoteDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    StagedChange sc = stageReviewableChange();
-    pushTo(sc, "refs/for/master", sc.owner);
-    assertThat(sender)
-        .sent("newpatchset", sc)
-        .to(sc.reviewer)
-        .cc(sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(NEW_PATCHSETS)
-        .noOneElse();
-  }
-
-  @Test
-  public void newPatchSetByOwnerOnReviewableChangeInReviewDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isFalse();
-    StagedChange sc = stageReviewableChange();
-    pushTo(sc, "refs/for/master", sc.owner);
-    assertThat(sender)
-        .sent("newpatchset", sc)
-        .to(sc.reviewer, sc.ccer)
-        .bcc(sc.starrer)
-        .bcc(NEW_PATCHSETS)
-        .noOneElse();
-  }
-
-  @Test
-  public void newPatchSetByOtherOnReviewableChangeInNoteDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    StagedChange sc = stageReviewableChange();
-    pushTo(sc, "refs/for/master", other);
-    assertThat(sender)
-        .sent("newpatchset", sc)
-        .notTo(sc.owner) // TODO(logan): This shouldn't be sent *from* the owner.
-        .to(sc.reviewer, other)
-        .cc(sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(NEW_PATCHSETS)
-        .noOneElse();
-  }
-
-  @Test
-  public void newPatchSetByOtherOnReviewableChangeInReviewDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isFalse();
-    StagedChange sc = stageReviewableChange();
-    pushTo(sc, "refs/for/master", other);
-    assertThat(sender)
-        .sent("newpatchset", sc)
-        .notTo(sc.owner) // TODO(logan): This email shouldn't come from the owner.
-        .to(sc.reviewer, sc.ccer, other)
-        .bcc(sc.starrer)
-        .bcc(NEW_PATCHSETS)
-        .noOneElse();
-  }
-
-  @Test
-  public void newPatchSetByOtherOnReviewableChangeOwnerSelfCcInNoteDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    StagedChange sc = stageReviewableChange();
-    pushTo(sc, "refs/for/master", other, EmailStrategy.CC_ON_OWN_COMMENTS);
-    assertThat(sender)
-        .sent("newpatchset", sc)
-        .notTo(sc.owner) // TODO(logan): This shouldn't be sent *from* the owner.
-        .to(sc.reviewer, other)
-        .cc(sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(NEW_PATCHSETS)
-        .noOneElse();
-  }
-
-  @Test
-  public void newPatchSetByOtherOnReviewableChangeOwnerSelfCcInReviewDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isFalse();
-    StagedChange sc = stageReviewableChange();
-    pushTo(sc, "refs/for/master", other, EmailStrategy.CC_ON_OWN_COMMENTS);
-    assertThat(sender)
-        .sent("newpatchset", sc)
-        .notTo(sc.owner) // TODO(logan): This shouldn't be sent *from* the owner.
-        .to(sc.reviewer, sc.ccer, other)
-        .bcc(sc.starrer)
-        .bcc(NEW_PATCHSETS)
-        .noOneElse();
-  }
-
-  @Test
-  public void newPatchSetByOtherOnReviewableChangeNotifyOwnerReviewersInNoteDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    StagedChange sc = stageReviewableChange();
-    pushTo(sc, "refs/for/master%notify=OWNER_REVIEWERS", other);
-    assertThat(sender)
-        .sent("newpatchset", sc)
-        .notTo(sc.owner) // TODO(logan): This shouldn't be sent *from* the owner.
-        .to(sc.reviewer)
-        .cc(sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .noOneElse();
-  }
-
-  @Test
-  public void newPatchSetByOtherOnReviewableChangeNotifyOwnerReviewersInReviewDb()
-      throws Exception {
-    assume().that(notesMigration.readChanges()).isFalse();
-    StagedChange sc = stageReviewableChange();
-    pushTo(sc, "refs/for/master%notify=OWNER_REVIEWERS", other);
-    assertThat(sender)
-        .sent("newpatchset", sc)
-        .notTo(sc.owner) // TODO(logan): This shouldn't be sent *from* the owner.
-        .to(sc.reviewer, sc.ccer)
-        .noOneElse();
-  }
-
-  @Test
-  public void newPatchSetByOtherOnReviewableChangeOwnerSelfCcNotifyOwnerReviewersInNoteDb()
-      throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    StagedChange sc = stageReviewableChange();
-    pushTo(sc, "refs/for/master%notify=OWNER_REVIEWERS", other, EmailStrategy.CC_ON_OWN_COMMENTS);
-    assertThat(sender)
-        .sent("newpatchset", sc)
-        .notTo(sc.owner) // TODO(logan): This shouldn't be sent *from* the owner.
-        .to(sc.reviewer)
-        .cc(sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .noOneElse();
-  }
-
-  @Test
-  public void newPatchSetByOtherOnReviewableChangeOwnerSelfCcNotifyOwnerReviewersInReviewDb()
-      throws Exception {
-    assume().that(notesMigration.readChanges()).isFalse();
-    StagedChange sc = stageReviewableChange();
-    pushTo(sc, "refs/for/master%notify=OWNER_REVIEWERS", other, EmailStrategy.CC_ON_OWN_COMMENTS);
-    assertThat(sender)
-        .sent("newpatchset", sc)
-        .to(sc.reviewer, sc.ccer)
-        .notTo(sc.owner) // TODO(logan): This shouldn't be sent *from* the owner.
-        .noOneElse();
-  }
-
-  @Test
-  public void newPatchSetByOtherOnReviewableChangeNotifyOwner() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    pushTo(sc, "refs/for/master%notify=OWNER", other);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void newPatchSetByOtherOnReviewableChangeOwnerSelfCcNotifyOwner() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    pushTo(sc, "refs/for/master%notify=OWNER", other, EmailStrategy.CC_ON_OWN_COMMENTS);
-    // TODO(logan): This email shouldn't come from the owner, and that's why
-    // no email is currently sent (owner isn't CCing self).
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void newPatchSetByOtherOnReviewableChangeNotifyNone() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    pushTo(sc, "refs/for/master%notify=NONE", other);
-    // TODO(logan): This email shouldn't come from the owner, and that's why
-    // no email is currently sent (owner isn't CCing self).
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void newPatchSetByOtherOnReviewableChangeOwnerSelfCcNotifyNone() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    pushTo(sc, "refs/for/master%notify=NONE", other, EmailStrategy.CC_ON_OWN_COMMENTS);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void newPatchSetByOwnerOnReviewableChangeToWip() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    pushTo(sc, "refs/for/master%wip", sc.owner);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void newPatchSetOnWipChange() throws Exception {
-    StagedChange sc = stageWipChange();
-    pushTo(sc, "refs/for/master%wip", sc.owner);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void newPatchSetOnWipChangeNotifyAllInNoteDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    StagedChange sc = stageWipChange();
-    pushTo(sc, "refs/for/master%wip,notify=ALL", sc.owner);
-    assertThat(sender)
-        .sent("newpatchset", sc)
-        .to(sc.reviewer)
-        .cc(sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(NEW_PATCHSETS)
-        .noOneElse();
-  }
-
-  @Test
-  public void newPatchSetOnWipChangeNotifyAllInReviewDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isFalse();
-    StagedChange sc = stageWipChange();
-    pushTo(sc, "refs/for/master%wip,notify=ALL", sc.owner);
-    assertThat(sender)
-        .sent("newpatchset", sc)
-        .to(sc.reviewer, sc.ccer)
-        .bcc(sc.starrer)
-        .bcc(NEW_PATCHSETS)
-        .noOneElse();
-  }
-
-  @Test
-  public void newPatchSetOnWipChangeToReadyInNoteDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    StagedChange sc = stageWipChange();
-    pushTo(sc, "refs/for/master%ready", sc.owner);
-    assertThat(sender)
-        .sent("newpatchset", sc)
-        .to(sc.reviewer)
-        .cc(sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(NEW_PATCHSETS)
-        .noOneElse();
-  }
-
-  @Test
-  public void newPatchSetOnWipChangeToReadyInReviewDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isFalse();
-    StagedChange sc = stageWipChange();
-    pushTo(sc, "refs/for/master%ready", sc.owner);
-    assertThat(sender)
-        .sent("newpatchset", sc)
-        .to(sc.reviewer, sc.ccer)
-        .bcc(sc.starrer)
-        .bcc(NEW_PATCHSETS)
-        .noOneElse();
-  }
-
-  @Test
-  public void newPatchSetOnReviewableWipChange() throws Exception {
-    StagedChange sc = stageReviewableWipChange();
-    pushTo(sc, "refs/for/master%wip", sc.owner);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void newPatchSetOnReviewableChangeAddingReviewerInNoteDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    StagedChange sc = stageReviewableChange();
-    TestAccount newReviewer = sc.testAccount("newReviewer");
-    pushTo(sc, "refs/for/master%r=" + newReviewer.username, sc.owner);
-    assertThat(sender)
-        .sent("newpatchset", sc)
-        .to(sc.reviewer, newReviewer)
-        .cc(sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(NEW_PATCHSETS)
-        .noOneElse();
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void newPatchSetOnReviewableChangeAddingReviewerInReviewDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isFalse();
-    StagedChange sc = stageReviewableChange();
-    TestAccount newReviewer = sc.testAccount("newReviewer");
-    pushTo(sc, "refs/for/master%r=" + newReviewer.username, sc.owner);
-    assertThat(sender)
-        .sent("newpatchset", sc)
-        .to(sc.reviewer, sc.ccer, newReviewer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(NEW_PATCHSETS)
-        .noOneElse();
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void newPatchSetOnWipChangeAddingReviewer() throws Exception {
-    StagedChange sc = stageWipChange();
-    TestAccount newReviewer = sc.testAccount("newReviewer");
-    pushTo(sc, "refs/for/master%r=" + newReviewer.username, sc.owner);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void newPatchSetOnWipChangeAddingReviewerNotifyAllInNoteDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    StagedChange sc = stageWipChange();
-    TestAccount newReviewer = sc.testAccount("newReviewer");
-    pushTo(sc, "refs/for/master%notify=ALL,r=" + newReviewer.username, sc.owner);
-    assertThat(sender)
-        .sent("newpatchset", sc)
-        .to(sc.reviewer, newReviewer)
-        .cc(sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(NEW_PATCHSETS)
-        .noOneElse();
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void newPatchSetOnWipChangeAddingReviewerNotifyAllInReviewDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isFalse();
-    StagedChange sc = stageWipChange();
-    TestAccount newReviewer = sc.testAccount("newReviewer");
-    pushTo(sc, "refs/for/master%notify=ALL,r=" + newReviewer.username, sc.owner);
-    assertThat(sender)
-        .sent("newpatchset", sc)
-        .to(sc.reviewer, sc.ccer, newReviewer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(NEW_PATCHSETS)
-        .noOneElse();
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void newPatchSetOnWipChangeSettingReadyInNoteDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    StagedChange sc = stageWipChange();
-    pushTo(sc, "refs/for/master%ready", sc.owner);
-    assertThat(sender)
-        .sent("newpatchset", sc)
-        .to(sc.reviewer)
-        .cc(sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(NEW_PATCHSETS)
-        .noOneElse();
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void newPatchSetOnWipChangeSettingReadyInReviewDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isFalse();
-    StagedChange sc = stageWipChange();
-    pushTo(sc, "refs/for/master%ready", sc.owner);
-    assertThat(sender)
-        .sent("newpatchset", sc)
-        .to(sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(NEW_PATCHSETS)
-        .noOneElse();
-    assertThat(sender).notSent();
-  }
-
-  private void pushTo(StagedChange sc, String ref, TestAccount by) throws Exception {
-    pushTo(sc, ref, by, ENABLED);
-  }
-
-  private void pushTo(StagedChange sc, String ref, TestAccount by, EmailStrategy emailStrategy)
-      throws Exception {
-    setEmailStrategy(by, emailStrategy);
-    pushFactory.create(db, by.getIdent(), sc.repo, sc.changeId).to(ref).assertOkStatus();
-  }
-
-  @Test
-  public void editCommitMessageEditByOwnerOnReviewableChangeInNoteDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    StagedChange sc = stageReviewableChange();
-    editCommitMessage(sc, sc.owner);
-    assertThat(sender)
-        .sent("newpatchset", sc)
-        .to(sc.reviewer)
-        .cc(sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(NEW_PATCHSETS)
-        .noOneElse();
-  }
-
-  @Test
-  public void editCommitMessageEditByOwnerOnReviewableChangeInReviewDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isFalse();
-    StagedChange sc = stageReviewableChange();
-    editCommitMessage(sc, sc.owner);
-    assertThat(sender)
-        .sent("newpatchset", sc)
-        .to(sc.reviewer, sc.ccer)
-        .bcc(sc.starrer)
-        .bcc(NEW_PATCHSETS)
-        .noOneElse();
-  }
-
-  @Test
-  public void editCommitMessageEditByOtherOnReviewableChangeInNoteDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    StagedChange sc = stageReviewableChange();
-    editCommitMessage(sc, other);
-    assertThat(sender)
-        .sent("newpatchset", sc)
-        .to(sc.owner, sc.reviewer)
-        .cc(sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(NEW_PATCHSETS)
-        .noOneElse();
-  }
-
-  @Test
-  public void editCommitMessageEditByOtherOnReviewableChangeInReviewDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isFalse();
-    StagedChange sc = stageReviewableChange();
-    editCommitMessage(sc, other);
-    assertThat(sender)
-        .sent("newpatchset", sc)
-        .to(sc.owner, sc.reviewer, sc.ccer)
-        .bcc(sc.starrer)
-        .bcc(NEW_PATCHSETS)
-        .noOneElse();
-  }
-
-  @Test
-  public void editCommitMessageByOtherOnReviewableChangeOwnerSelfCcInNoteDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    StagedChange sc = stageReviewableChange();
-    editCommitMessage(sc, other, CC_ON_OWN_COMMENTS);
-    assertThat(sender)
-        .sent("newpatchset", sc)
-        .to(sc.owner, sc.reviewer, other)
-        .cc(sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(NEW_PATCHSETS)
-        .noOneElse();
-  }
-
-  @Test
-  public void editCommitMessageByOtherOnReviewableChangeOwnerSelfCcInReviewDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isFalse();
-    StagedChange sc = stageReviewableChange();
-    editCommitMessage(sc, other, CC_ON_OWN_COMMENTS);
-    assertThat(sender)
-        .sent("newpatchset", sc)
-        .to(sc.owner, sc.reviewer, sc.ccer, other)
-        .bcc(sc.starrer)
-        .bcc(NEW_PATCHSETS)
-        .noOneElse();
-  }
-
-  @Test
-  public void editCommitMessageByOtherOnReviewableChangeNotifyOwnerReviewersInNoteDb()
-      throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    StagedChange sc = stageReviewableChange();
-    editCommitMessage(sc, other, OWNER_REVIEWERS);
-    assertThat(sender)
-        .sent("newpatchset", sc)
-        .to(sc.owner, sc.reviewer)
-        .cc(sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .noOneElse();
-  }
-
-  @Test
-  public void editCommitMessageByOtherOnReviewableChangeNotifyOwnerReviewersInReviewDb()
-      throws Exception {
-    assume().that(notesMigration.readChanges()).isFalse();
-    StagedChange sc = stageReviewableChange();
-    editCommitMessage(sc, other, OWNER_REVIEWERS);
-    assertThat(sender).sent("newpatchset", sc).to(sc.owner, sc.reviewer, sc.ccer).noOneElse();
-  }
-
-  @Test
-  public void editCommitMessageByOtherOnReviewableChangeOwnerSelfCcNotifyOwnerReviewersInNoteDb()
-      throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    StagedChange sc = stageReviewableChange();
-    editCommitMessage(sc, other, OWNER_REVIEWERS, CC_ON_OWN_COMMENTS);
-    assertThat(sender)
-        .sent("newpatchset", sc)
-        .to(sc.owner, sc.reviewer)
-        .cc(sc.ccer, other)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .noOneElse();
-  }
-
-  @Test
-  public void editCommitMessageByOtherOnReviewableChangeOwnerSelfCcNotifyOwnerReviewersInReviewDb()
-      throws Exception {
-    assume().that(notesMigration.readChanges()).isFalse();
-    StagedChange sc = stageReviewableChange();
-    editCommitMessage(sc, other, OWNER_REVIEWERS, CC_ON_OWN_COMMENTS);
-    assertThat(sender)
-        .sent("newpatchset", sc)
-        .to(sc.owner, sc.reviewer, sc.ccer)
-        .cc(other)
-        .noOneElse();
-  }
-
-  @Test
-  public void editCommitMessageByOtherOnReviewableChangeNotifyOwner() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    editCommitMessage(sc, other, OWNER);
-    assertThat(sender).sent("newpatchset", sc).to(sc.owner).noOneElse();
-  }
-
-  @Test
-  public void editCommitMessageByOtherOnReviewableChangeOwnerSelfCcNotifyOwner() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    editCommitMessage(sc, other, OWNER, CC_ON_OWN_COMMENTS);
-    assertThat(sender).sent("newpatchset", sc).to(sc.owner).cc(other).noOneElse();
-  }
-
-  @Test
-  public void editCommitMessageByOtherOnReviewableChangeNotifyNone() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    editCommitMessage(sc, other, NONE);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void editCommitMessageByOtherOnReviewableChangeOwnerSelfCcNotifyNone() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    editCommitMessage(sc, other, NONE, CC_ON_OWN_COMMENTS);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void editCommitMessageOnWipChange() throws Exception {
-    StagedChange sc = stageWipChange();
-    editCommitMessage(sc, sc.owner);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void editCommitMessageByOtherOnWipChange() throws Exception {
-    StagedChange sc = stageWipChange();
-    editCommitMessage(sc, other);
-    assertThat(sender).sent("newpatchset", sc).to(sc.owner).noOneElse();
-  }
-
-  @Test
-  public void editCommitMessageByOtherOnWipChangeSelfCc() throws Exception {
-    StagedChange sc = stageWipChange();
-    editCommitMessage(sc, other, CC_ON_OWN_COMMENTS);
-    assertThat(sender).sent("newpatchset", sc).to(sc.owner).cc(other).noOneElse();
-  }
-
-  @Test
-  public void editCommitMessageOnWipChangeNotifyAllInNoteDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    StagedChange sc = stageWipChange();
-    editCommitMessage(sc, sc.owner, ALL);
-    assertThat(sender)
-        .sent("newpatchset", sc)
-        .to(sc.reviewer)
-        .cc(sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(NEW_PATCHSETS)
-        .noOneElse();
-  }
-
-  @Test
-  public void editCommitMessageOnWipChangeNotifyAllInReviewDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isFalse();
-    StagedChange sc = stageWipChange();
-    editCommitMessage(sc, sc.owner, ALL);
-    assertThat(sender)
-        .sent("newpatchset", sc)
-        .to(sc.reviewer, sc.ccer)
-        .bcc(sc.starrer)
-        .bcc(NEW_PATCHSETS)
-        .noOneElse();
-  }
-
-  private void editCommitMessage(StagedChange sc, TestAccount by) throws Exception {
-    editCommitMessage(sc, by, null, ENABLED);
-  }
-
-  private void editCommitMessage(StagedChange sc, TestAccount by, @Nullable NotifyHandling notify)
-      throws Exception {
-    editCommitMessage(sc, by, notify, ENABLED);
-  }
-
-  private void editCommitMessage(StagedChange sc, TestAccount by, EmailStrategy emailStrategy)
-      throws Exception {
-    editCommitMessage(sc, by, null, emailStrategy);
-  }
-
-  private void editCommitMessage(
-      StagedChange sc, TestAccount by, @Nullable NotifyHandling notify, EmailStrategy emailStrategy)
-      throws Exception {
-    setEmailStrategy(by, emailStrategy);
-    CommitInfo commit = gApi.changes().id(sc.changeId).revision("current").commit(false);
-    CommitMessageInput in = new CommitMessageInput();
-    in.message = "update\n" + commit.message;
-    in.notify = notify;
-    gApi.changes().id(sc.changeId).setMessage(in);
-  }
-
-  /*
-   * RestoredSender tests.
-   */
-
-  @Test
-  public void restoreReviewableChange() throws Exception {
-    StagedChange sc = stageAbandonedReviewableChange();
-    restore(sc.changeId, sc.owner);
-    assertThat(sender)
-        .sent("restore", sc)
-        .cc(sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void restoreReviewableWipChange() throws Exception {
-    StagedChange sc = stageAbandonedReviewableWipChange();
-    restore(sc.changeId, sc.owner);
-    assertThat(sender)
-        .sent("restore", sc)
-        .cc(sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void restoreWipChange() throws Exception {
-    StagedChange sc = stageAbandonedWipChange();
-    restore(sc.changeId, sc.owner);
-    assertThat(sender)
-        .sent("restore", sc)
-        .cc(sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void restoreReviewableChangeByAdmin() throws Exception {
-    StagedChange sc = stageAbandonedReviewableChange();
-    restore(sc.changeId, admin);
-    assertThat(sender)
-        .sent("restore", sc)
-        .to(sc.owner)
-        .cc(sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void restoreReviewableChangeByOwnerCcingSelf() throws Exception {
-    StagedChange sc = stageAbandonedReviewableChange();
-    restore(sc.changeId, sc.owner, CC_ON_OWN_COMMENTS);
-    assertThat(sender)
-        .sent("restore", sc)
-        .to(sc.owner)
-        .cc(sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void restoreReviewableChangeByAdminCcingSelf() throws Exception {
-    StagedChange sc = stageAbandonedReviewableChange();
-    restore(sc.changeId, admin, CC_ON_OWN_COMMENTS);
-    assertThat(sender)
-        .sent("restore", sc)
-        .to(sc.owner)
-        .cc(sc.reviewer, sc.ccer, admin)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  private void restore(String changeId, TestAccount by) throws Exception {
-    restore(changeId, by, ENABLED);
-  }
-
-  private void restore(String changeId, TestAccount by, EmailStrategy emailStrategy)
-      throws Exception {
-    setEmailStrategy(by, emailStrategy);
-    setApiUser(by);
-    gApi.changes().id(changeId).restore();
-  }
-
-  /*
-   * RevertedSender tests.
-   */
-
-  @Test
-  public void revertChangeByOwnerInReviewDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isFalse();
-    StagedChange sc = stageChange();
-    revert(sc, sc.owner);
-
-    // email for the newly created revert change
-    assertThat(sender)
-        .sent("newchange", sc)
-        .to(sc.reviewer, sc.ccer, sc.watchingProjectOwner, admin)
-        .bcc(NEW_CHANGES, NEW_PATCHSETS)
-        .noOneElse();
-
-    // email for the change that is reverted
-    assertThat(sender)
-        .sent("revert", sc)
-        .cc(sc.reviewer, sc.ccer, admin)
-        .cc(sc.reviewerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void revertChangeByOwnerInNoteDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    StagedChange sc = stageChange();
-    revert(sc, sc.owner);
-
-    // email for the newly created revert change
-    assertThat(sender)
-        .sent("newchange", sc)
-        .to(sc.reviewer, sc.watchingProjectOwner, admin)
-        .cc(sc.ccer)
-        .bcc(NEW_CHANGES, NEW_PATCHSETS)
-        .noOneElse();
-
-    // email for the change that is reverted
-    assertThat(sender)
-        .sent("revert", sc)
-        .cc(sc.reviewer, sc.ccer, admin)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void revertChangeByOwnerCcingSelfInReviewDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isFalse();
-    StagedChange sc = stageChange();
-    revert(sc, sc.owner, CC_ON_OWN_COMMENTS);
-
-    // email for the newly created revert change
-    assertThat(sender)
-        .sent("newchange", sc)
-        .to(sc.reviewer, sc.ccer, sc.watchingProjectOwner, admin)
-        .cc(sc.owner)
-        .bcc(NEW_CHANGES, NEW_PATCHSETS)
-        .noOneElse();
-
-    // email for the change that is reverted
-    assertThat(sender)
-        .sent("revert", sc)
-        .to(sc.owner)
-        .cc(sc.reviewer, sc.ccer, admin)
-        .cc(sc.reviewerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void revertChangeByOwnerCcingSelfInNoteDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    StagedChange sc = stageChange();
-    revert(sc, sc.owner, CC_ON_OWN_COMMENTS);
-
-    // email for the newly created revert change
-    assertThat(sender)
-        .sent("newchange", sc)
-        .to(sc.reviewer, sc.watchingProjectOwner, admin)
-        .cc(sc.owner, sc.ccer)
-        .bcc(NEW_CHANGES, NEW_PATCHSETS)
-        .noOneElse();
-
-    // email for the change that is reverted
-    assertThat(sender)
-        .sent("revert", sc)
-        .to(sc.owner)
-        .cc(sc.reviewer, sc.ccer, admin)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void revertChangeByOtherInReviewDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isFalse();
-    StagedChange sc = stageChange();
-    revert(sc, other);
-
-    // email for the newly created revert change
-    assertThat(sender)
-        .sent("newchange", sc)
-        .to(sc.owner, sc.reviewer, sc.ccer, sc.watchingProjectOwner, admin)
-        .bcc(NEW_CHANGES, NEW_PATCHSETS)
-        .noOneElse();
-
-    // email for the change that is reverted
-    assertThat(sender)
-        .sent("revert", sc)
-        .to(sc.owner)
-        .cc(sc.reviewer, sc.ccer, admin)
-        .cc(sc.reviewerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void revertChangeByOtherInNoteDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    StagedChange sc = stageChange();
-    revert(sc, other);
-
-    // email for the newly created revert change
-    assertThat(sender)
-        .sent("newchange", sc)
-        .to(sc.owner, sc.reviewer, sc.watchingProjectOwner, admin)
-        .cc(sc.ccer)
-        .bcc(NEW_CHANGES, NEW_PATCHSETS)
-        .noOneElse();
-
-    // email for the change that is reverted
-    assertThat(sender)
-        .sent("revert", sc)
-        .to(sc.owner)
-        .cc(sc.reviewer, sc.ccer, admin)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void revertChangeByOtherCcingSelfInReviewDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isFalse();
-    StagedChange sc = stageChange();
-    revert(sc, other, CC_ON_OWN_COMMENTS);
-
-    // email for the newly created revert change
-    assertThat(sender)
-        .sent("newchange", sc)
-        .to(sc.owner, sc.reviewer, sc.ccer, sc.watchingProjectOwner, admin)
-        .cc(other)
-        .bcc(NEW_CHANGES, NEW_PATCHSETS)
-        .noOneElse();
-
-    // email for the change that is reverted
-    assertThat(sender)
-        .sent("revert", sc)
-        .to(sc.owner)
-        .cc(other, sc.reviewer, sc.ccer, admin)
-        .cc(sc.reviewerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void revertChangeByOtherCcingSelfInNoteDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    StagedChange sc = stageChange();
-    revert(sc, other, CC_ON_OWN_COMMENTS);
-
-    // email for the newly created revert change
-    assertThat(sender)
-        .sent("newchange", sc)
-        .to(sc.owner, sc.reviewer, sc.watchingProjectOwner, admin)
-        .cc(sc.ccer, other)
-        .bcc(NEW_CHANGES, NEW_PATCHSETS)
-        .noOneElse();
-
-    // email for the change that is reverted
-    assertThat(sender)
-        .sent("revert", sc)
-        .to(sc.owner)
-        .cc(other, sc.reviewer, sc.ccer, admin)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  private StagedChange stageChange() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    setApiUser(admin);
-    gApi.changes().id(sc.changeId).revision("current").review(ReviewInput.approve());
-    gApi.changes().id(sc.changeId).revision("current").submit();
-    sender.clear();
-    return sc;
-  }
-
-  private void revert(StagedChange sc, TestAccount by) throws Exception {
-    revert(sc, by, ENABLED);
-  }
-
-  private void revert(StagedChange sc, TestAccount by, EmailStrategy emailStrategy)
-      throws Exception {
-    setEmailStrategy(by, emailStrategy);
-    setApiUser(by);
-    gApi.changes().id(sc.changeId).revert();
-  }
-
-  /*
-   * SetAssigneeSender tests.
-   */
-
-  @Test
-  public void setAssigneeOnReviewableChange() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    assign(sc, sc.owner, sc.assignee);
-    assertThat(sender)
-        .sent("setassignee", sc)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail) // TODO(logan): This is probably not intended!
-        .to(sc.assignee)
-        .noOneElse();
-  }
-
-  @Test
-  public void setAssigneeOnReviewableChangeByOwnerCcingSelf() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    assign(sc, sc.owner, sc.assignee, CC_ON_OWN_COMMENTS);
-    assertThat(sender)
-        .sent("setassignee", sc)
-        .cc(sc.owner)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail) // TODO(logan): This is probably not intended!
-        .to(sc.assignee)
-        .noOneElse();
-  }
-
-  @Test
-  public void setAssigneeOnReviewableChangeByAdmin() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    assign(sc, admin, sc.assignee);
-    assertThat(sender)
-        .sent("setassignee", sc)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail) // TODO(logan): This is probably not intended!
-        .to(sc.assignee)
-        .noOneElse();
-  }
-
-  @Test
-  public void setAssigneeOnReviewableChangeByAdminCcingSelf() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    assign(sc, admin, sc.assignee, CC_ON_OWN_COMMENTS);
-    assertThat(sender)
-        .sent("setassignee", sc)
-        .cc(admin)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail) // TODO(logan): This is probably not intended!
-        .to(sc.assignee)
-        .noOneElse();
-  }
-
-  @Test
-  public void setAssigneeToSelfOnReviewableChangeInNoteDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    StagedChange sc = stageReviewableChange();
-    assign(sc, sc.owner, sc.owner);
-    assertThat(sender)
-        .sent("setassignee", sc)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail) // TODO(logan): This is probably not intended!
-        .noOneElse();
-  }
-
-  @Test
-  public void setAssigneeToSelfOnReviewableChangeInReviewDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isFalse();
-    StagedChange sc = stageReviewableChange();
-    assign(sc, sc.owner, sc.owner);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void changeAssigneeOnReviewableChange() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    TestAccount other = accountCreator.create("other", "other@example.com", "other");
-    assign(sc, sc.owner, other);
-    sender.clear();
-    assign(sc, sc.owner, sc.assignee);
-    assertThat(sender)
-        .sent("setassignee", sc)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail) // TODO(logan): This is probably not intended!
-        .to(sc.assignee)
-        .noOneElse();
-  }
-
-  @Test
-  public void changeAssigneeToSelfOnReviewableChangeInNoteDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    StagedChange sc = stageReviewableChange();
-    assign(sc, sc.owner, sc.assignee);
-    sender.clear();
-    assign(sc, sc.owner, sc.owner);
-    assertThat(sender)
-        .sent("setassignee", sc)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail) // TODO(logan): This is probably not intended!
-        .noOneElse();
-  }
-
-  @Test
-  public void changeAssigneeToSelfOnReviewableChangeInReviewDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isFalse();
-    StagedChange sc = stageReviewableChange();
-    assign(sc, sc.owner, sc.assignee);
-    sender.clear();
-    assign(sc, sc.owner, sc.owner);
-    assertThat(sender).notSent();
-  }
-
-  @Test
-  public void setAssigneeOnReviewableWipChange() throws Exception {
-    StagedChange sc = stageReviewableWipChange();
-    assign(sc, sc.owner, sc.assignee);
-    assertThat(sender)
-        .sent("setassignee", sc)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail) // TODO(logan): This is probably not intended!
-        .to(sc.assignee)
-        .noOneElse();
-  }
-
-  @Test
-  public void setAssigneeOnWipChange() throws Exception {
-    StagedChange sc = stageWipChange();
-    assign(sc, sc.owner, sc.assignee);
-    assertThat(sender)
-        .sent("setassignee", sc)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail) // TODO(logan): This is probably not intended!
-        .to(sc.assignee)
-        .noOneElse();
-  }
-
-  private void assign(StagedChange sc, TestAccount by, TestAccount to) throws Exception {
-    assign(sc, by, to, ENABLED);
-  }
-
-  private void assign(StagedChange sc, TestAccount by, TestAccount to, EmailStrategy emailStrategy)
-      throws Exception {
-    setEmailStrategy(by, emailStrategy);
-    setApiUser(by);
-    AssigneeInput in = new AssigneeInput();
-    in.assignee = to.email;
-    gApi.changes().id(sc.changeId).setAssignee(in);
-  }
-
-  /*
-   * Start review and WIP tests.
-   */
-
-  @Test
-  public void startReviewOnWipChange() throws Exception {
-    StagedChange sc = stageWipChange();
-    startReview(sc);
-    assertThat(sender)
-        .sent("comment", sc)
-        .cc(sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void startReviewOnWipChangeCcingSelf() throws Exception {
-    StagedChange sc = stageWipChange();
-    setEmailStrategy(sc.owner, CC_ON_OWN_COMMENTS);
-    startReview(sc);
-    assertThat(sender)
-        .sent("comment", sc)
-        .to(sc.owner)
-        .cc(sc.reviewer, sc.ccer)
-        .cc(sc.reviewerByEmail, sc.ccerByEmail)
-        .bcc(sc.starrer)
-        .bcc(ALL_COMMENTS)
-        .noOneElse();
-  }
-
-  @Test
-  public void setWorkInProgress() throws Exception {
-    StagedChange sc = stageReviewableChange();
-    gApi.changes().id(sc.changeId).setWorkInProgress();
-    assertThat(sender).notSent();
-  }
-
-  private void startReview(StagedChange sc) throws Exception {
-    setApiUser(sc.owner);
-    gApi.changes().id(sc.changeId).setReadyForReview();
-    // PolyGerrit current immediately follows up with a review.
-    gApi.changes().id(sc.changeId).revision("current").review(ReviewInput.noScore());
-  }
-
-  private void setWorkInProgressByDefault(Project.NameKey p, InheritableBoolean v)
-      throws Exception {
-    ConfigInput input = new ConfigInput();
-    input.workInProgressByDefault = v;
-    gApi.projects().name(p.get()).config(input);
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/ListMailFilterIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/ListMailFilterIT.java
deleted file mode 100644
index ea4f501..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/ListMailFilterIT.java
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.acceptance.server.mail;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.gerrit.acceptance.GerritConfig;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.ChangeMessageInfo;
-import com.google.gerrit.extensions.common.CommentInfo;
-import com.google.gerrit.server.mail.MailUtil;
-import com.google.gerrit.server.mail.receive.MailMessage;
-import com.google.gerrit.server.mail.receive.MailProcessor;
-import com.google.inject.Inject;
-import java.time.ZoneId;
-import java.time.ZonedDateTime;
-import java.util.Collection;
-import java.util.List;
-import org.junit.Test;
-
-@NoHttpd
-public class ListMailFilterIT extends AbstractMailIT {
-  @Inject private MailProcessor mailProcessor;
-
-  @Test
-  @GerritConfig(name = "receiveemail.filter.mode", value = "OFF")
-  public void listFilterOff() throws Exception {
-    ChangeInfo changeInfo = createChangeAndReplyByEmail();
-    // Check that the comments from the email have been persisted
-    Collection<ChangeMessageInfo> messages = gApi.changes().id(changeInfo.id).get().messages;
-    assertThat(messages).hasSize(3);
-  }
-
-  @Test
-  @GerritConfig(name = "receiveemail.filter.mode", value = "WHITELIST")
-  @GerritConfig(
-      name = "receiveemail.filter.patterns",
-      values = {".+ser@example\\.com", "a@b\\.com"})
-  public void listFilterWhitelistDoesNotFilterListedUser() throws Exception {
-    ChangeInfo changeInfo = createChangeAndReplyByEmail();
-    // Check that the comments from the email have been persisted
-    Collection<ChangeMessageInfo> messages = gApi.changes().id(changeInfo.id).get().messages;
-    assertThat(messages).hasSize(3);
-  }
-
-  @Test
-  @GerritConfig(name = "receiveemail.filter.mode", value = "WHITELIST")
-  @GerritConfig(
-      name = "receiveemail.filter.patterns",
-      values = {".+@gerritcodereview\\.com", "a@b\\.com"})
-  public void listFilterWhitelistFiltersNotListedUser() throws Exception {
-    ChangeInfo changeInfo = createChangeAndReplyByEmail();
-    // Check that the comments from the email have NOT been persisted
-    Collection<ChangeMessageInfo> messages = gApi.changes().id(changeInfo.id).get().messages;
-    assertThat(messages).hasSize(2);
-  }
-
-  @Test
-  @GerritConfig(name = "receiveemail.filter.mode", value = "BLACKLIST")
-  @GerritConfig(
-      name = "receiveemail.filter.patterns",
-      values = {".+@gerritcodereview\\.com", "a@b\\.com"})
-  public void listFilterBlacklistDoesNotFilterNotListedUser() throws Exception {
-    ChangeInfo changeInfo = createChangeAndReplyByEmail();
-    // Check that the comments from the email have been persisted
-    Collection<ChangeMessageInfo> messages = gApi.changes().id(changeInfo.id).get().messages;
-    assertThat(messages).hasSize(3);
-  }
-
-  @Test
-  @GerritConfig(name = "receiveemail.filter.mode", value = "BLACKLIST")
-  @GerritConfig(
-      name = "receiveemail.filter.patterns",
-      values = {".+@example\\.com", "a@b\\.com"})
-  public void listFilterBlacklistFiltersListedUser() throws Exception {
-    ChangeInfo changeInfo = createChangeAndReplyByEmail();
-    // Check that the comments from the email have been persisted
-    Collection<ChangeMessageInfo> messages = gApi.changes().id(changeInfo.id).get().messages;
-    assertThat(messages).hasSize(2);
-  }
-
-  private ChangeInfo createChangeAndReplyByEmail() throws Exception {
-    String changeId = createChangeWithReview();
-    ChangeInfo changeInfo = gApi.changes().id(changeId).get();
-    List<CommentInfo> comments = gApi.changes().id(changeId).current().commentsAsList();
-    String ts =
-        MailUtil.rfcDateformatter.format(
-            ZonedDateTime.ofInstant(comments.get(0).updated.toInstant(), ZoneId.of("UTC")));
-
-    // Build Message
-    MailMessage.Builder b = messageBuilderWithDefaultFields();
-    String txt =
-        newPlaintextBody(
-            canonicalWebUrl.get() + "#/c/" + changeInfo._number + "/1",
-            "Test Message",
-            null,
-            null,
-            null);
-    b.textContent(txt + textFooterForChange(changeInfo._number, ts));
-
-    mailProcessor.process(b.build());
-    return changeInfo;
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/MailIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/MailIT.java
deleted file mode 100644
index f25223c..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/MailIT.java
+++ /dev/null
@@ -1,102 +0,0 @@
-// 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.
-
-package com.google.gerrit.acceptance.server.mail;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.server.mail.receive.MailReceiver;
-import com.google.gerrit.testutil.ConfigSuite;
-import com.google.inject.Inject;
-import com.icegreen.greenmail.junit.GreenMailRule;
-import com.icegreen.greenmail.user.GreenMailUser;
-import com.icegreen.greenmail.util.GreenMail;
-import com.icegreen.greenmail.util.GreenMailUtil;
-import com.icegreen.greenmail.util.ServerSetupTest;
-import javax.mail.internet.MimeMessage;
-import org.eclipse.jgit.lib.Config;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@NoHttpd
-@RunWith(ConfigSuite.class)
-public class MailIT extends AbstractDaemonTest {
-  private static final String RECEIVEEMAIL = "receiveemail";
-  private static final String HOST = "localhost";
-  private static final String USERNAME = "user@domain.com";
-  private static final String PASSWORD = "password";
-
-  @Inject private MailReceiver mailReceiver;
-
-  @Inject private GreenMail greenMail;
-
-  @Rule
-  public final GreenMailRule mockPop3Server = new GreenMailRule(ServerSetupTest.SMTP_POP3_IMAP);
-
-  @ConfigSuite.Default
-  public static Config pop3Config() {
-    Config cfg = new Config();
-    cfg.setString(RECEIVEEMAIL, null, "host", HOST);
-    cfg.setString(RECEIVEEMAIL, null, "port", "3110");
-    cfg.setString(RECEIVEEMAIL, null, "username", USERNAME);
-    cfg.setString(RECEIVEEMAIL, null, "password", PASSWORD);
-    cfg.setString(RECEIVEEMAIL, null, "protocol", "POP3");
-    cfg.setString(RECEIVEEMAIL, null, "fetchInterval", Integer.toString(Integer.MAX_VALUE));
-    return cfg;
-  }
-
-  @ConfigSuite.Config
-  public static Config imapConfig() {
-    Config cfg = new Config();
-    cfg.setString(RECEIVEEMAIL, null, "host", HOST);
-    cfg.setString(RECEIVEEMAIL, null, "port", "3143");
-    cfg.setString(RECEIVEEMAIL, null, "username", USERNAME);
-    cfg.setString(RECEIVEEMAIL, null, "password", PASSWORD);
-    cfg.setString(RECEIVEEMAIL, null, "protocol", "IMAP");
-    cfg.setString(RECEIVEEMAIL, null, "fetchInterval", Integer.toString(Integer.MAX_VALUE));
-    return cfg;
-  }
-
-  @Test
-  public void doesNotDeleteMessageNotMarkedForDeletion() throws Exception {
-    GreenMailUser user = mockPop3Server.setUser(USERNAME, USERNAME, PASSWORD);
-    user.deliver(createSimpleMessage());
-    assertThat(mockPop3Server.getReceivedMessages().length).isEqualTo(1);
-    // Let Gerrit handle emails
-    mailReceiver.handleEmails(false);
-    // Check that the message is still present
-    assertThat(mockPop3Server.getReceivedMessages().length).isEqualTo(1);
-  }
-
-  @Test
-  public void deletesMessageMarkedForDeletion() throws Exception {
-    GreenMailUser user = mockPop3Server.setUser(USERNAME, USERNAME, PASSWORD);
-    user.deliver(createSimpleMessage());
-    assertThat(mockPop3Server.getReceivedMessages().length).isEqualTo(1);
-    // Mark the message for deletion
-    mailReceiver.requestDeletion(mockPop3Server.getReceivedMessages()[0].getMessageID());
-    // Let Gerrit handle emails
-    mailReceiver.handleEmails(false);
-    // Check that the message was deleted
-    assertThat(mockPop3Server.getReceivedMessages().length).isEqualTo(0);
-  }
-
-  private MimeMessage createSimpleMessage() {
-    return GreenMailUtil.createTextEmail(
-        USERNAME, "from@localhost.com", "subject", "body", greenMail.getImap().getServerSetup());
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/MailMetadataIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/MailMetadataIT.java
deleted file mode 100644
index 7cef8e7..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/MailMetadataIT.java
+++ /dev/null
@@ -1,162 +0,0 @@
-// 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.
-
-package com.google.gerrit.acceptance.server.mail;
-
-import static com.google.common.truth.Truth.assertThat;
-import static java.util.concurrent.TimeUnit.SECONDS;
-
-import com.google.common.collect.Iterables;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.common.ChangeMessageInfo;
-import com.google.gerrit.server.mail.MailUtil;
-import com.google.gerrit.server.mail.send.EmailHeader;
-import com.google.gerrit.testutil.FakeEmailSender;
-import com.google.gerrit.testutil.TestTimeUtil;
-import java.sql.Timestamp;
-import java.time.ZoneId;
-import java.time.ZonedDateTime;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-/** Tests the presence of required metadata in email headers, text and html. */
-public class MailMetadataIT extends AbstractDaemonTest {
-  private String systemTimeZone;
-
-  @Before
-  public void setTimeForTesting() {
-    systemTimeZone = System.setProperty("user.timezone", "US/Eastern");
-    TestTimeUtil.resetWithClockStep(1, SECONDS);
-  }
-
-  @After
-  public void resetTime() {
-    TestTimeUtil.useSystemTime();
-    System.setProperty("user.timezone", systemTimeZone);
-  }
-
-  @Test
-  public void metadataOnNewChange() throws Exception {
-    PushOneCommit.Result newChange = createChange();
-    gApi.changes().id(newChange.getChangeId()).addReviewer(user.getId().toString());
-
-    List<FakeEmailSender.Message> emails = sender.getMessages();
-    assertThat(emails).hasSize(1);
-    FakeEmailSender.Message message = emails.get(0);
-
-    String changeURL = "<" + canonicalWebUrl.get() + newChange.getChange().getId().get() + ">";
-
-    Map<String, Object> expectedHeaders = new HashMap<>();
-    expectedHeaders.put("Gerrit-PatchSet", "1");
-    expectedHeaders.put(
-        "Gerrit-Change-Number", String.valueOf(newChange.getChange().getId().get()));
-    expectedHeaders.put("Gerrit-MessageType", "newchange");
-    expectedHeaders.put("Gerrit-Commit", newChange.getCommit().getId().name());
-    expectedHeaders.put("Gerrit-ChangeURL", changeURL);
-
-    assertHeaders(message.headers(), expectedHeaders);
-
-    // Remove metadata that is not present in email
-    expectedHeaders.remove("Gerrit-ChangeURL");
-    expectedHeaders.remove("Gerrit-Commit");
-    assertTextFooter(message.body(), expectedHeaders);
-  }
-
-  @Test
-  public void metadataOnNewComment() throws Exception {
-    PushOneCommit.Result newChange = createChange();
-    gApi.changes().id(newChange.getChangeId()).addReviewer(user.getId().toString());
-    sender.clear();
-
-    // Review change
-    ReviewInput input = new ReviewInput();
-    input.message = "Test";
-    revision(newChange).review(input);
-    setApiUser(user);
-    Collection<ChangeMessageInfo> result =
-        gApi.changes().id(newChange.getChangeId()).get().messages;
-    assertThat(result).isNotEmpty();
-
-    List<FakeEmailSender.Message> emails = sender.getMessages();
-    assertThat(emails).hasSize(1);
-    FakeEmailSender.Message message = emails.get(0);
-
-    String changeURL = "<" + canonicalWebUrl.get() + newChange.getChange().getId().get() + ">";
-    Map<String, Object> expectedHeaders = new HashMap<>();
-    expectedHeaders.put("Gerrit-PatchSet", "1");
-    expectedHeaders.put(
-        "Gerrit-Change-Number", String.valueOf(newChange.getChange().getId().get()));
-    expectedHeaders.put("Gerrit-MessageType", "comment");
-    expectedHeaders.put("Gerrit-Commit", newChange.getCommit().getId().name());
-    expectedHeaders.put("Gerrit-ChangeURL", changeURL);
-    expectedHeaders.put("Gerrit-Comment-Date", Iterables.getLast(result).date);
-
-    assertHeaders(message.headers(), expectedHeaders);
-
-    // Remove metadata that is not present in email
-    expectedHeaders.remove("Gerrit-ChangeURL");
-    expectedHeaders.remove("Gerrit-Commit");
-    assertTextFooter(message.body(), expectedHeaders);
-  }
-
-  private static void assertHeaders(Map<String, EmailHeader> have, Map<String, Object> want)
-      throws Exception {
-    for (Map.Entry<String, Object> entry : want.entrySet()) {
-      if (entry.getValue() instanceof String) {
-        assertThat(have)
-            .containsEntry(
-                "X-" + entry.getKey(), new EmailHeader.String((String) entry.getValue()));
-      } else if (entry.getValue() instanceof Date) {
-        assertThat(have)
-            .containsEntry("X-" + entry.getKey(), new EmailHeader.Date((Date) entry.getValue()));
-      } else {
-        throw new Exception(
-            "Object has unsupported type: "
-                + entry.getValue().getClass().getName()
-                + " must be java.util.Date or java.lang.String for key "
-                + entry.getKey());
-      }
-    }
-  }
-
-  private static void assertTextFooter(String body, Map<String, Object> want) throws Exception {
-    for (Map.Entry<String, Object> entry : want.entrySet()) {
-      if (entry.getValue() instanceof String) {
-        assertThat(body).contains(entry.getKey() + ": " + entry.getValue());
-      } else if (entry.getValue() instanceof Timestamp) {
-        assertThat(body)
-            .contains(
-                entry.getKey()
-                    + ": "
-                    + MailUtil.rfcDateformatter.format(
-                        ZonedDateTime.ofInstant(
-                            ((Timestamp) entry.getValue()).toInstant(), ZoneId.of("UTC"))));
-      } else {
-        throw new Exception(
-            "Object has unsupported type: "
-                + entry.getValue().getClass().getName()
-                + " must be java.util.Date or java.lang.String for key "
-                + entry.getKey());
-      }
-    }
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/MailProcessorIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/MailProcessorIT.java
deleted file mode 100644
index 9de4797..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/MailProcessorIT.java
+++ /dev/null
@@ -1,229 +0,0 @@
-// 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.
-
-package com.google.gerrit.acceptance.server.mail;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.common.collect.Iterables;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.ChangeMessageInfo;
-import com.google.gerrit.extensions.common.CommentInfo;
-import com.google.gerrit.server.mail.MailUtil;
-import com.google.gerrit.server.mail.receive.MailMessage;
-import com.google.gerrit.server.mail.receive.MailProcessor;
-import com.google.inject.Inject;
-import java.time.ZoneId;
-import java.time.ZonedDateTime;
-import java.util.Collection;
-import java.util.List;
-import org.junit.Test;
-
-public class MailProcessorIT extends AbstractMailIT {
-  @Inject private MailProcessor mailProcessor;
-
-  @Test
-  public void parseAndPersistChangeMessage() throws Exception {
-    String changeId = createChangeWithReview();
-    ChangeInfo changeInfo = gApi.changes().id(changeId).get();
-    List<CommentInfo> comments = gApi.changes().id(changeId).current().commentsAsList();
-    String ts =
-        MailUtil.rfcDateformatter.format(
-            ZonedDateTime.ofInstant(comments.get(0).updated.toInstant(), ZoneId.of("UTC")));
-
-    // Build Message
-    MailMessage.Builder b = messageBuilderWithDefaultFields();
-    String txt =
-        newPlaintextBody(
-            canonicalWebUrl.get() + "#/c/" + changeInfo._number + "/1",
-            "Test Message",
-            null,
-            null,
-            null);
-    b.textContent(txt + textFooterForChange(changeInfo._number, ts));
-
-    mailProcessor.process(b.build());
-
-    Collection<ChangeMessageInfo> messages = gApi.changes().id(changeId).get().messages;
-    assertThat(messages).hasSize(3);
-    assertThat(Iterables.getLast(messages).message).isEqualTo("Patch Set 1:\n\nTest Message");
-    assertThat(Iterables.getLast(messages).tag).isEqualTo("mailMessageId=some id");
-  }
-
-  @Test
-  public void parseAndPersistInlineComment() throws Exception {
-    String changeId = createChangeWithReview();
-    ChangeInfo changeInfo = gApi.changes().id(changeId).get();
-    List<CommentInfo> comments = gApi.changes().id(changeId).current().commentsAsList();
-    String ts =
-        MailUtil.rfcDateformatter.format(
-            ZonedDateTime.ofInstant(comments.get(0).updated.toInstant(), ZoneId.of("UTC")));
-
-    // Build Message
-    MailMessage.Builder b = messageBuilderWithDefaultFields();
-    String txt =
-        newPlaintextBody(
-            canonicalWebUrl.get() + "#/c/" + changeInfo._number + "/1",
-            null,
-            "Some Inline Comment",
-            null,
-            null);
-    b.textContent(txt + textFooterForChange(changeInfo._number, ts));
-
-    mailProcessor.process(b.build());
-
-    // Assert messages
-    Collection<ChangeMessageInfo> messages = gApi.changes().id(changeId).get().messages;
-    assertThat(messages).hasSize(3);
-    assertThat(Iterables.getLast(messages).message).isEqualTo("Patch Set 1:\n\n(1 comment)");
-    assertThat(Iterables.getLast(messages).tag).isEqualTo("mailMessageId=some id");
-
-    // Assert comment
-    comments = gApi.changes().id(changeId).current().commentsAsList();
-    assertThat(comments).hasSize(3);
-    assertThat(comments.get(2).message).isEqualTo("Some Inline Comment");
-    assertThat(comments.get(2).tag).isEqualTo("mailMessageId=some id");
-    assertThat(comments.get(2).inReplyTo).isEqualTo(comments.get(1).id);
-  }
-
-  @Test
-  public void parseAndPersistFileComment() throws Exception {
-    String changeId = createChangeWithReview();
-    ChangeInfo changeInfo = gApi.changes().id(changeId).get();
-    List<CommentInfo> comments = gApi.changes().id(changeId).current().commentsAsList();
-    String ts =
-        MailUtil.rfcDateformatter.format(
-            ZonedDateTime.ofInstant(comments.get(0).updated.toInstant(), ZoneId.of("UTC")));
-
-    // Build Message
-    MailMessage.Builder b = messageBuilderWithDefaultFields();
-    String txt =
-        newPlaintextBody(
-            canonicalWebUrl.get() + "#/c/" + changeInfo._number + "/1",
-            null,
-            null,
-            "Some Comment on File 1",
-            null);
-    b.textContent(txt + textFooterForChange(changeInfo._number, ts));
-
-    mailProcessor.process(b.build());
-
-    // Assert messages
-    Collection<ChangeMessageInfo> messages = gApi.changes().id(changeId).get().messages;
-    assertThat(messages).hasSize(3);
-    assertThat(Iterables.getLast(messages).message).isEqualTo("Patch Set 1:\n\n(1 comment)");
-    assertThat(Iterables.getLast(messages).tag).isEqualTo("mailMessageId=some id");
-
-    // Assert comment
-    comments = gApi.changes().id(changeId).current().commentsAsList();
-    assertThat(comments).hasSize(3);
-    assertThat(comments.get(0).message).isEqualTo("Some Comment on File 1");
-    assertThat(comments.get(0).inReplyTo).isNull();
-    assertThat(comments.get(0).tag).isEqualTo("mailMessageId=some id");
-    assertThat(comments.get(0).path).isEqualTo("gerrit-server/test.txt");
-  }
-
-  @Test
-  public void parseAndPersistMessageTwice() throws Exception {
-    String changeId = createChangeWithReview();
-    ChangeInfo changeInfo = gApi.changes().id(changeId).get();
-    List<CommentInfo> comments = gApi.changes().id(changeId).current().commentsAsList();
-    String ts =
-        MailUtil.rfcDateformatter.format(
-            ZonedDateTime.ofInstant(comments.get(0).updated.toInstant(), ZoneId.of("UTC")));
-
-    // Build Message
-    MailMessage.Builder b = messageBuilderWithDefaultFields();
-    String txt =
-        newPlaintextBody(
-            canonicalWebUrl.get() + "#/c/" + changeInfo._number + "/1",
-            null,
-            "Some Inline Comment",
-            null,
-            null);
-    b.textContent(txt + textFooterForChange(changeInfo._number, ts));
-
-    mailProcessor.process(b.build());
-    comments = gApi.changes().id(changeId).current().commentsAsList();
-    assertThat(comments).hasSize(3);
-
-    // Check that the comment has not been persisted a second time
-    mailProcessor.process(b.build());
-    comments = gApi.changes().id(changeId).current().commentsAsList();
-    assertThat(comments).hasSize(3);
-  }
-
-  @Test
-  public void parseAndPersistMessageFromInactiveAccount() throws Exception {
-    String changeId = createChangeWithReview();
-    ChangeInfo changeInfo = gApi.changes().id(changeId).get();
-    List<CommentInfo> comments = gApi.changes().id(changeId).current().commentsAsList();
-    String ts =
-        MailUtil.rfcDateformatter.format(
-            ZonedDateTime.ofInstant(comments.get(0).updated.toInstant(), ZoneId.of("UTC")));
-    assertThat(comments).hasSize(2);
-
-    // Build Message
-    MailMessage.Builder b = messageBuilderWithDefaultFields();
-    String txt =
-        newPlaintextBody(
-            canonicalWebUrl.get() + "#/c/" + changeInfo._number + "/1",
-            null,
-            "Some Inline Comment",
-            null,
-            null);
-    b.textContent(txt + textFooterForChange(changeInfo._number, ts));
-
-    // Set account state to inactive
-    gApi.accounts().id("user").setActive(false);
-
-    mailProcessor.process(b.build());
-    comments = gApi.changes().id(changeId).current().commentsAsList();
-
-    // Check that comment size has not changed
-    assertThat(comments).hasSize(2);
-
-    // Reset
-    gApi.accounts().id("user").setActive(true);
-  }
-
-  @Test
-  public void sendNotificationAfterPersistingComments() throws Exception {
-    String changeId = createChangeWithReview();
-    ChangeInfo changeInfo = gApi.changes().id(changeId).get();
-    List<CommentInfo> comments = gApi.changes().id(changeId).current().commentsAsList();
-    assertThat(comments).hasSize(2);
-    String ts =
-        MailUtil.rfcDateformatter.format(
-            ZonedDateTime.ofInstant(comments.get(0).updated.toInstant(), ZoneId.of("UTC")));
-
-    // Build Message
-    String txt =
-        newPlaintextBody(
-            canonicalWebUrl.get() + "#/c/" + changeInfo._number + "/1",
-            "Test Message",
-            null,
-            null,
-            null);
-    MailMessage.Builder b =
-        messageBuilderWithDefaultFields()
-            .from(user.emailAddress)
-            .textContent(txt + textFooterForChange(changeInfo._number, ts));
-
-    sender.clear();
-    mailProcessor.process(b.build());
-
-    assertNotifyTo(admin);
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/MailSenderIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/MailSenderIT.java
deleted file mode 100644
index 43f046a..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/MailSenderIT.java
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.acceptance.server.mail;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.gerrit.acceptance.GerritConfig;
-import com.google.gerrit.server.mail.send.EmailHeader;
-import java.util.Map;
-import org.junit.Test;
-
-public class MailSenderIT extends AbstractMailIT {
-
-  @Test
-  @GerritConfig(name = "sendemail.replyToAddress", value = "custom@gerritcodereview.com")
-  @GerritConfig(name = "receiveemail.protocol", value = "POP3")
-  public void outgoingMailHasCustomReplyToHeader() throws Exception {
-    createChangeWithReview(user);
-    // Check that the custom address was added as Reply-To
-    assertThat(sender.getMessages()).hasSize(1);
-    Map<String, EmailHeader> headers = sender.getMessages().iterator().next().headers();
-    assertThat(headers.get("Reply-To")).isInstanceOf(EmailHeader.String.class);
-    assertThat(((EmailHeader.String) headers.get("Reply-To")).getString())
-        .isEqualTo("custom@gerritcodereview.com");
-  }
-
-  @Test
-  public void outgoingMailHasUserEmailInReplyToHeader() throws Exception {
-    createChangeWithReview(user);
-    // Check that the user's email was added as Reply-To
-    assertThat(sender.getMessages()).hasSize(1);
-    Map<String, EmailHeader> headers = sender.getMessages().iterator().next().headers();
-    assertThat(headers.get("Reply-To")).isInstanceOf(EmailHeader.String.class);
-    assertThat(((EmailHeader.String) headers.get("Reply-To")).getString()).contains(user.email);
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/NotificationMailFormatIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/NotificationMailFormatIT.java
deleted file mode 100644
index 8485012..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/NotificationMailFormatIT.java
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.acceptance.server.mail;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo.EmailFormat;
-import com.google.gerrit.testutil.FakeEmailSender;
-import org.junit.Test;
-
-public class NotificationMailFormatIT extends AbstractDaemonTest {
-
-  @Test
-  public void userReceivesPlaintextEmail() throws Exception {
-    // Set user preference to receive only plaintext content
-    GeneralPreferencesInfo i = new GeneralPreferencesInfo();
-    i.emailFormat = EmailFormat.PLAINTEXT;
-    gApi.accounts().id(admin.getId().toString()).setPreferences(i);
-
-    // Create change as admin and review as user
-    PushOneCommit.Result r = createChange();
-    setApiUser(user);
-    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.recommend());
-
-    // Check that admin has received only plaintext content
-    assertThat(sender.getMessages()).hasSize(1);
-    FakeEmailSender.Message m = sender.getMessages().get(0);
-    assertThat(m.body()).isNotNull();
-    assertThat(m.htmlBody()).isNull();
-    assertMailReplyTo(m, admin.email);
-    assertMailReplyTo(m, user.email);
-
-    // Reset user preference
-    setApiUser(admin);
-    i.emailFormat = EmailFormat.HTML_PLAINTEXT;
-    gApi.accounts().id(admin.getId().toString()).setPreferences(i);
-  }
-
-  @Test
-  public void userReceivesHtmlAndPlaintextEmail() throws Exception {
-    // Create change as admin and review as user
-    PushOneCommit.Result r = createChange();
-    setApiUser(user);
-    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.recommend());
-
-    // Check that admin has received both HTML and plaintext content
-    assertThat(sender.getMessages()).hasSize(1);
-    FakeEmailSender.Message m = sender.getMessages().get(0);
-    assertThat(m.body()).isNotNull();
-    assertThat(m.htmlBody()).isNotNull();
-    assertMailReplyTo(m, admin.email);
-    assertMailReplyTo(m, user.email);
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/notedb/BUILD b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/notedb/BUILD
deleted file mode 100644
index 212db28..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/notedb/BUILD
+++ /dev/null
@@ -1,13 +0,0 @@
-load("//gerrit-acceptance-tests:tests.bzl", "acceptance_tests")
-
-acceptance_tests(
-    srcs = glob(["*IT.java"]),
-    group = "server_notedb",
-    labels = [
-        "notedb",
-        "server",
-    ],
-    # TODO(dborowitz): Fix leaks in local disk tests so we can reduce heap size.
-    # http://crbug.com/gerrit/8567
-    vm_args = ["-Xmx1024m"],
-)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/notedb/ChangeRebuilderIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/notedb/ChangeRebuilderIT.java
deleted file mode 100644
index 6eaa16d..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/notedb/ChangeRebuilderIT.java
+++ /dev/null
@@ -1,1592 +0,0 @@
-// 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.
-
-package com.google.gerrit.acceptance.server.notedb;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth.assert_;
-import static com.google.common.truth.TruthJUnit.assume;
-import static com.google.gerrit.reviewdb.client.RefNames.changeMetaRef;
-import static com.google.gerrit.reviewdb.client.RefNames.refsDraftComments;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.concurrent.TimeUnit.DAYS;
-import static java.util.concurrent.TimeUnit.MILLISECONDS;
-import static java.util.concurrent.TimeUnit.SECONDS;
-import static java.util.stream.Collectors.joining;
-import static java.util.stream.Collectors.toList;
-import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
-import static org.junit.Assert.fail;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Ordering;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.AcceptanceTestRequestScope;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.acceptance.TestAccount;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.extensions.api.changes.DraftInput;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.api.changes.ReviewInput.CommentInput;
-import com.google.gerrit.extensions.api.changes.ReviewInput.DraftHandling;
-import com.google.gerrit.extensions.client.Side;
-import com.google.gerrit.extensions.common.CommentInfo;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.Patch;
-import com.google.gerrit.reviewdb.client.PatchLineComment;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.client.RevId;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.reviewdb.server.ReviewDbUtil;
-import com.google.gerrit.server.ChangeUtil;
-import com.google.gerrit.server.CommentsUtil;
-import com.google.gerrit.server.Sequences;
-import com.google.gerrit.server.change.PostReview;
-import com.google.gerrit.server.change.Rebuild;
-import com.google.gerrit.server.change.RevisionResource;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.git.RepoRefCache;
-import com.google.gerrit.server.notedb.ChangeBundle;
-import com.google.gerrit.server.notedb.ChangeBundleReader;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.NoteDbChangeState;
-import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
-import com.google.gerrit.server.notedb.NoteDbUpdateManager;
-import com.google.gerrit.server.notedb.TestChangeRebuilderWrapper;
-import com.google.gerrit.server.notedb.rebuild.ChangeRebuilder.NoPatchSetsException;
-import com.google.gerrit.server.patch.PatchListCache;
-import com.google.gerrit.server.patch.PatchListNotAvailableException;
-import com.google.gerrit.server.patch.PatchSetInfoFactory;
-import com.google.gerrit.server.patch.PatchSetInfoNotAvailableException;
-import com.google.gerrit.server.project.Util;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gerrit.testutil.ConfigSuite;
-import com.google.gerrit.testutil.NoteDbChecker;
-import com.google.gerrit.testutil.NoteDbMode;
-import com.google.gerrit.testutil.TestChanges;
-import com.google.gerrit.testutil.TestTimeUtil;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.OrmRuntimeException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.sql.Timestamp;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Stream;
-import org.apache.http.Header;
-import org.apache.http.message.BasicHeader;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.Repository;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-public class ChangeRebuilderIT extends AbstractDaemonTest {
-  @ConfigSuite.Default
-  public static Config defaultConfig() {
-    Config cfg = new Config();
-    cfg.setBoolean("noteDb", null, "testRebuilderWrapper", true);
-
-    // Disable async reindex-if-stale check after index update. This avoids
-    // unintentional auto-rebuilding of the change in NoteDb during the read
-    // path of the reindex-if-stale check. For the purposes of this test, we
-    // want precise control over when auto-rebuilding happens.
-    cfg.setBoolean("index", null, "autoReindexIfStale", false);
-
-    // setNotesMigration tries to keep IDs in sync between ReviewDb and NoteDb, which is behavior
-    // unique to this test. This gets prohibitively slow if we use the default sequence gap.
-    cfg.setInt("noteDb", "changes", "initialSequenceGap", 0);
-
-    return cfg;
-  }
-
-  @Inject private AllUsersName allUsers;
-
-  @Inject private NoteDbChecker checker;
-
-  @Inject private Rebuild rebuildHandler;
-
-  @Inject private Provider<ReviewDb> dbProvider;
-
-  @Inject private CommentsUtil commentsUtil;
-
-  @Inject private Provider<PostReview> postReview;
-
-  @Inject private TestChangeRebuilderWrapper rebuilderWrapper;
-
-  @Inject private Sequences seq;
-
-  @Inject private ChangeBundleReader bundleReader;
-
-  @Inject private PatchSetInfoFactory patchSetInfoFactory;
-
-  @Inject private PatchListCache patchListCache;
-
-  @Before
-  public void setUp() throws Exception {
-    assume().that(NoteDbMode.get()).isEqualTo(NoteDbMode.OFF);
-    TestTimeUtil.resetWithClockStep(1, SECONDS);
-    setNotesMigration(false, false);
-  }
-
-  @After
-  public void tearDown() {
-    TestTimeUtil.useSystemTime();
-  }
-
-  @SuppressWarnings("deprecation")
-  private void setNotesMigration(boolean writeChanges, boolean readChanges) throws Exception {
-    notesMigration.setWriteChanges(writeChanges);
-    notesMigration.setReadChanges(readChanges);
-    db = atrScope.reopenDb().getReviewDbProvider().get();
-
-    if (notesMigration.readChangeSequence()) {
-      // Copy next ReviewDb ID to NoteDb.
-      seq.getChangeIdRepoSequence().set(db.nextChangeId());
-    } else {
-      // Copy next NoteDb ID to ReviewDb.
-      while (db.nextChangeId() < seq.getChangeIdRepoSequence().next()) {}
-    }
-  }
-
-  @Test
-  public void changeFields() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getPatchSetId().getParentKey();
-    gApi.changes().id(id.get()).topic(name("a-topic"));
-    checker.rebuildAndCheckChanges(id);
-  }
-
-  @Test
-  public void patchSets() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getPatchSetId().getParentKey();
-    r = amendChange(r.getChangeId());
-    checker.rebuildAndCheckChanges(id);
-  }
-
-  @Test
-  public void publishedComment() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getPatchSetId().getParentKey();
-    putComment(user, id, 1, "comment", null);
-    checker.rebuildAndCheckChanges(id);
-  }
-
-  @Test
-  public void publishedCommentAndReply() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getPatchSetId().getParentKey();
-    putComment(user, id, 1, "comment", null);
-    Map<String, List<CommentInfo>> comments = getPublishedComments(id);
-    String parentUuid = comments.get("a.txt").get(0).id;
-    putComment(user, id, 1, "comment", parentUuid);
-    checker.rebuildAndCheckChanges(id);
-  }
-
-  @Test
-  public void patchSetWithNullGroups() throws Exception {
-    Timestamp ts = TimeUtil.nowTs();
-    Change c = TestChanges.newChange(project, user.getId(), seq.nextChangeId());
-    c.setCreatedOn(ts);
-    c.setLastUpdatedOn(ts);
-    c.setReviewStarted(true);
-    PatchSet ps =
-        TestChanges.newPatchSet(
-            c.currentPatchSetId(), "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef", user.getId());
-    ps.setCreatedOn(ts);
-    db.changes().insert(Collections.singleton(c));
-    db.patchSets().insert(Collections.singleton(ps));
-
-    assertThat(ps.getGroups()).isEmpty();
-    checker.rebuildAndCheckChanges(c.getId());
-  }
-
-  @Test
-  public void draftComment() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getPatchSetId().getParentKey();
-    putDraft(user, id, 1, "comment", null);
-    checker.rebuildAndCheckChanges(id);
-  }
-
-  @Test
-  public void draftAndPublishedComment() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getPatchSetId().getParentKey();
-    putDraft(user, id, 1, "draft comment", null);
-    putComment(user, id, 1, "published comment", null);
-    checker.rebuildAndCheckChanges(id);
-  }
-
-  @Test
-  public void publishDraftComment() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getPatchSetId().getParentKey();
-    putDraft(user, id, 1, "draft comment", null);
-    publishDrafts(user, id);
-    checker.rebuildAndCheckChanges(id);
-  }
-
-  @Test
-  public void nullAccountId() throws Exception {
-    PushOneCommit.Result r = createChange();
-    PatchSet.Id psId = r.getPatchSetId();
-    Change.Id id = psId.getParentKey();
-
-    // Events need to be otherwise identical for the account ID to be compared.
-    ChangeMessage msg1 = insertMessage(id, psId, user.getId(), TimeUtil.nowTs(), "message 1");
-    insertMessage(id, psId, null, msg1.getWrittenOn(), "message 2");
-
-    checker.rebuildAndCheckChanges(id);
-  }
-
-  @Test
-  public void nullPatchSetId() throws Exception {
-    PushOneCommit.Result r = createChange();
-    PatchSet.Id psId1 = r.getPatchSetId();
-    Change.Id id = psId1.getParentKey();
-
-    // Events need to be otherwise identical for the PatchSet.ID to be compared.
-    ChangeMessage msg1 = insertMessage(id, null, user.getId(), TimeUtil.nowTs(), "message 1");
-    insertMessage(id, null, user.getId(), msg1.getWrittenOn(), "message 2");
-
-    PatchSet.Id psId2 = amendChange(r.getChangeId()).getPatchSetId();
-
-    ChangeMessage msg3 = insertMessage(id, null, user.getId(), TimeUtil.nowTs(), "message 3");
-    insertMessage(id, null, user.getId(), msg3.getWrittenOn(), "message 4");
-
-    checker.rebuildAndCheckChanges(id);
-
-    setNotesMigration(true, true);
-
-    ChangeNotes notes = notesFactory.create(db, project, id);
-    Map<String, PatchSet.Id> psIds = new HashMap<>();
-    for (ChangeMessage msg : notes.getChangeMessages()) {
-      PatchSet.Id psId = msg.getPatchSetId();
-      assertThat(psId).named("patchset for " + msg).isNotNull();
-      psIds.put(msg.getMessage(), psId);
-    }
-    // Patch set IDs were replaced during conversion process.
-    assertThat(psIds).containsEntry("message 1", psId1);
-    assertThat(psIds).containsEntry("message 2", psId1);
-    assertThat(psIds).containsEntry("message 3", psId2);
-    assertThat(psIds).containsEntry("message 4", psId2);
-  }
-
-  @Test
-  public void noWriteToNewRef() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getPatchSetId().getParentKey();
-    checker.assertNoChangeRef(project, id);
-
-    setNotesMigration(true, false);
-    gApi.changes().id(id.get()).topic(name("a-topic"));
-
-    // First write doesn't create the ref, but rebuilding works.
-    checker.assertNoChangeRef(project, id);
-    assertThat(getUnwrappedDb().changes().get(id).getNoteDbState()).isNull();
-    checker.rebuildAndCheckChanges(id);
-
-    // Now that there is a ref, writes are "turned on" for this change, and
-    // NoteDb stays up to date without explicit rebuilding.
-    gApi.changes().id(id.get()).topic(name("new-topic"));
-    assertThat(getUnwrappedDb().changes().get(id).getNoteDbState()).isNotNull();
-    checker.checkChanges(id);
-  }
-
-  @Test
-  public void restApiNotFoundWhenNoteDbDisabled() throws Exception {
-    PushOneCommit.Result r = createChange();
-    exception.expect(ResourceNotFoundException.class);
-    rebuildHandler.apply(parseChangeResource(r.getChangeId()), new Rebuild.Input());
-  }
-
-  @Test
-  public void rebuildViaRestApi() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getPatchSetId().getParentKey();
-    setNotesMigration(true, false);
-
-    checker.assertNoChangeRef(project, id);
-    rebuildHandler.apply(parseChangeResource(r.getChangeId()), new Rebuild.Input());
-    checker.checkChanges(id);
-  }
-
-  @Test
-  public void writeToNewRefForNewChange() throws Exception {
-    PushOneCommit.Result r1 = createChange();
-    Change.Id id1 = r1.getPatchSetId().getParentKey();
-
-    setNotesMigration(true, false);
-    gApi.changes().id(id1.get()).topic(name("a-topic"));
-    PushOneCommit.Result r2 = createChange();
-    Change.Id id2 = r2.getPatchSetId().getParentKey();
-
-    // Second change was created after NoteDb writes were turned on, so it was
-    // allowed to write to a new ref.
-    checker.checkChanges(id2);
-
-    // First change was created before NoteDb writes were turned on, so its meta
-    // ref doesn't exist until a manual rebuild.
-    checker.assertNoChangeRef(project, id1);
-    checker.rebuildAndCheckChanges(id1);
-  }
-
-  @Test
-  public void noteDbChangeState() throws Exception {
-    setNotesMigration(true, true);
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getPatchSetId().getParentKey();
-
-    ObjectId changeMetaId = getMetaRef(project, changeMetaRef(id));
-    assertThat(getUnwrappedDb().changes().get(id).getNoteDbState()).isEqualTo(changeMetaId.name());
-
-    putDraft(user, id, 1, "comment by user", null);
-    ObjectId userDraftsId = getMetaRef(allUsers, refsDraftComments(id, user.getId()));
-    assertThat(getUnwrappedDb().changes().get(id).getNoteDbState())
-        .isEqualTo(changeMetaId.name() + "," + user.getId() + "=" + userDraftsId.name());
-
-    putDraft(admin, id, 2, "comment by admin", null);
-    ObjectId adminDraftsId = getMetaRef(allUsers, refsDraftComments(id, admin.getId()));
-    assertThat(admin.getId().get()).isLessThan(user.getId().get());
-    assertThat(getUnwrappedDb().changes().get(id).getNoteDbState())
-        .isEqualTo(
-            changeMetaId.name()
-                + ","
-                + admin.getId()
-                + "="
-                + adminDraftsId.name()
-                + ","
-                + user.getId()
-                + "="
-                + userDraftsId.name());
-
-    putDraft(admin, id, 2, "revised comment by admin", null);
-    adminDraftsId = getMetaRef(allUsers, refsDraftComments(id, admin.getId()));
-    assertThat(getUnwrappedDb().changes().get(id).getNoteDbState())
-        .isEqualTo(
-            changeMetaId.name()
-                + ","
-                + admin.getId()
-                + "="
-                + adminDraftsId.name()
-                + ","
-                + user.getId()
-                + "="
-                + userDraftsId.name());
-  }
-
-  @Test
-  public void rebuildAutomaticallyWhenChangeOutOfDate() throws Exception {
-    setNotesMigration(true, true);
-
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getPatchSetId().getParentKey();
-    assertChangeUpToDate(true, id);
-
-    // Make a ReviewDb change behind NoteDb's back and ensure it's detected.
-    setNotesMigration(false, false);
-    gApi.changes().id(id.get()).topic(name("a-topic"));
-    setInvalidNoteDbState(id);
-    assertChangeUpToDate(false, id);
-
-    // On next NoteDb read, the change is transparently rebuilt.
-    setNotesMigration(true, true);
-    assertThat(gApi.changes().id(id.get()).info().topic).isEqualTo(name("a-topic"));
-    assertChangeUpToDate(true, id);
-
-    // Check that the bundles are equal.
-    ChangeBundle actual =
-        ChangeBundle.fromNotes(commentsUtil, notesFactory.create(dbProvider.get(), project, id));
-    ChangeBundle expected = bundleReader.fromReviewDb(getUnwrappedDb(), id);
-    assertThat(actual.differencesFrom(expected)).isEmpty();
-  }
-
-  @Test
-  public void rebuildAutomaticallyWithinBatchUpdate() throws Exception {
-    setNotesMigration(true, true);
-
-    PushOneCommit.Result r = createChange();
-    final Change.Id id = r.getPatchSetId().getParentKey();
-    assertChangeUpToDate(true, id);
-
-    // Update ReviewDb and NoteDb, then revert the corresponding NoteDb change
-    // to simulate it failing.
-    NoteDbChangeState oldState = NoteDbChangeState.parse(getUnwrappedDb().changes().get(id));
-    String topic = name("a-topic");
-    gApi.changes().id(id.get()).topic(topic);
-    try (Repository repo = repoManager.openRepository(project)) {
-      new TestRepository<>(repo).update(RefNames.changeMetaRef(id), oldState.getChangeMetaId());
-    }
-    assertChangeUpToDate(false, id);
-
-    // Next NoteDb read comes inside the transaction started by BatchUpdate. In
-    // reality this could be caused by a failed update happening between when
-    // the change is parsed by ChangesCollection and when the BatchUpdate
-    // executes. We simulate it here by using BatchUpdate directly and not going
-    // through an API handler.
-    final String msg = "message from BatchUpdate";
-    try (BatchUpdate bu =
-        batchUpdateFactory.create(
-            db, project, identifiedUserFactory.create(user.getId()), TimeUtil.nowTs())) {
-      bu.addOp(
-          id,
-          new BatchUpdateOp() {
-            @Override
-            public boolean updateChange(ChangeContext ctx) throws OrmException {
-              PatchSet.Id psId = ctx.getChange().currentPatchSetId();
-              ChangeMessage cm =
-                  new ChangeMessage(
-                      new ChangeMessage.Key(id, ChangeUtil.messageUuid()),
-                      ctx.getAccountId(),
-                      ctx.getWhen(),
-                      psId);
-              cm.setMessage(msg);
-              ctx.getDb().changeMessages().insert(Collections.singleton(cm));
-              ctx.getUpdate(psId).setChangeMessage(msg);
-              return true;
-            }
-          });
-      try {
-        bu.execute();
-        fail("expected update to fail");
-      } catch (UpdateException e) {
-        assertThat(e.getMessage()).contains("cannot copy ChangeNotesState");
-      }
-    }
-
-    // TODO(dborowitz): Re-enable these assertions once we fix auto-rebuilding
-    // in the BatchUpdate path.
-    // As an implementation detail, change wasn't actually rebuilt inside the
-    // BatchUpdate transaction, but it was rebuilt during read for the
-    // subsequent reindex. Thus it's impossible to actually observe an
-    // out-of-date state in the caller.
-    // assertChangeUpToDate(true, id);
-
-    // Check that the bundles are equal.
-    // ChangeNotes notes = notesFactory.create(dbProvider.get(), project, id);
-    // ChangeBundle actual = ChangeBundle.fromNotes(commentsUtil, notes);
-    // ChangeBundle expected = bundleReader.fromReviewDb(getUnwrappedDb(), id);
-    // assertThat(actual.differencesFrom(expected)).isEmpty();
-    // assertThat(
-    //        Iterables.transform(
-    //            notes.getChangeMessages(),
-    //            ChangeMessage::getMessage))
-    //    .contains(msg);
-    // assertThat(actual.getChange().getTopic()).isEqualTo(topic);
-  }
-
-  @Test
-  public void rebuildIgnoresErrorIfChangeIsUpToDateAfter() throws Exception {
-    setNotesMigration(true, true);
-
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getPatchSetId().getParentKey();
-    assertChangeUpToDate(true, id);
-
-    // Make a ReviewDb change behind NoteDb's back and ensure it's detected.
-    setNotesMigration(false, false);
-    gApi.changes().id(id.get()).topic(name("a-topic"));
-    setInvalidNoteDbState(id);
-    assertChangeUpToDate(false, id);
-
-    // Force the next rebuild attempt to fail but also rebuild the change in the
-    // background.
-    rebuilderWrapper.stealNextUpdate();
-    setNotesMigration(true, true);
-    assertThat(gApi.changes().id(id.get()).info().topic).isEqualTo(name("a-topic"));
-    assertChangeUpToDate(true, id);
-
-    // Check that the bundles are equal.
-    ChangeBundle actual =
-        ChangeBundle.fromNotes(commentsUtil, notesFactory.create(dbProvider.get(), project, id));
-    ChangeBundle expected = bundleReader.fromReviewDb(getUnwrappedDb(), id);
-    assertThat(actual.differencesFrom(expected)).isEmpty();
-  }
-
-  @Test
-  public void rebuildReturnsCorrectResultEvenIfSavingToNoteDbFailed() throws Exception {
-    setNotesMigration(true, true);
-
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getPatchSetId().getParentKey();
-    assertChangeUpToDate(true, id);
-    ObjectId oldMetaId = getMetaRef(project, changeMetaRef(id));
-
-    // Make a ReviewDb change behind NoteDb's back.
-    setNotesMigration(false, false);
-    gApi.changes().id(id.get()).topic(name("a-topic"));
-    setInvalidNoteDbState(id);
-    assertChangeUpToDate(false, id);
-    assertThat(getMetaRef(project, changeMetaRef(id))).isEqualTo(oldMetaId);
-
-    // Force the next rebuild attempt to fail.
-    rebuilderWrapper.failNextUpdate();
-    setNotesMigration(true, true);
-    ChangeNotes notes = notesFactory.create(dbProvider.get(), project, id);
-
-    // Not up to date, but the actual returned state matches anyway.
-    assertChangeUpToDate(false, id);
-    assertThat(getMetaRef(project, changeMetaRef(id))).isEqualTo(oldMetaId);
-    ChangeBundle actual = ChangeBundle.fromNotes(commentsUtil, notes);
-    ChangeBundle expected = bundleReader.fromReviewDb(getUnwrappedDb(), id);
-    assertThat(actual.differencesFrom(expected)).isEmpty();
-    assertChangeUpToDate(false, id);
-
-    // Another rebuild attempt succeeds
-    notesFactory.create(dbProvider.get(), project, id);
-    assertThat(getMetaRef(project, changeMetaRef(id))).isNotEqualTo(oldMetaId);
-    assertChangeUpToDate(true, id);
-  }
-
-  @Test
-  public void rebuildReturnsDraftResultWhenRebuildingInChangeNotesFails() throws Exception {
-    setNotesMigration(true, true);
-
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getPatchSetId().getParentKey();
-    putDraft(user, id, 1, "comment by user", null);
-    assertChangeUpToDate(true, id);
-
-    ObjectId oldMetaId = getMetaRef(allUsers, refsDraftComments(id, user.getId()));
-
-    // Add a draft behind NoteDb's back.
-    setNotesMigration(false, false);
-    putDraft(user, id, 1, "second comment by user", null);
-    setInvalidNoteDbState(id);
-    assertDraftsUpToDate(false, id, user);
-    assertThat(getMetaRef(allUsers, refsDraftComments(id, user.getId()))).isEqualTo(oldMetaId);
-
-    // Force the next rebuild attempt to fail (in ChangeNotes).
-    rebuilderWrapper.failNextUpdate();
-    setNotesMigration(true, true);
-    ChangeNotes notes = notesFactory.create(dbProvider.get(), project, id);
-    notes.getDraftComments(user.getId());
-    assertThat(getMetaRef(allUsers, refsDraftComments(id, user.getId()))).isEqualTo(oldMetaId);
-
-    // Not up to date, but the actual returned state matches anyway.
-    assertDraftsUpToDate(false, id, user);
-    ChangeBundle actual = ChangeBundle.fromNotes(commentsUtil, notes);
-    ChangeBundle expected = bundleReader.fromReviewDb(getUnwrappedDb(), id);
-    assertThat(actual.differencesFrom(expected)).isEmpty();
-
-    // Another rebuild attempt succeeds
-    notesFactory.create(dbProvider.get(), project, id);
-    assertChangeUpToDate(true, id);
-    assertDraftsUpToDate(true, id, user);
-    assertThat(getMetaRef(allUsers, refsDraftComments(id, user.getId()))).isNotEqualTo(oldMetaId);
-  }
-
-  @Test
-  public void rebuildReturnsDraftResultWhenRebuildingInDraftCommentNotesFails() throws Exception {
-    setNotesMigration(true, true);
-
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getPatchSetId().getParentKey();
-    putDraft(user, id, 1, "comment by user", null);
-    assertChangeUpToDate(true, id);
-
-    ObjectId oldMetaId = getMetaRef(allUsers, refsDraftComments(id, user.getId()));
-
-    // Add a draft behind NoteDb's back.
-    setNotesMigration(false, false);
-    putDraft(user, id, 1, "second comment by user", null);
-
-    ReviewDb db = getUnwrappedDb();
-    Change c = db.changes().get(id);
-    // Leave change meta ID alone so DraftCommentNotes does the rebuild.
-    ObjectId badSha = ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef");
-    NoteDbChangeState bogusState =
-        new NoteDbChangeState(
-            id,
-            PrimaryStorage.REVIEW_DB,
-            Optional.of(
-                NoteDbChangeState.RefState.create(
-                    NoteDbChangeState.parse(c).getChangeMetaId(),
-                    ImmutableMap.of(user.getId(), badSha))),
-            Optional.empty());
-    c.setNoteDbState(bogusState.toString());
-    db.changes().update(Collections.singleton(c));
-
-    assertDraftsUpToDate(false, id, user);
-    assertThat(getMetaRef(allUsers, refsDraftComments(id, user.getId()))).isEqualTo(oldMetaId);
-
-    // Force the next rebuild attempt to fail (in DraftCommentNotes).
-    rebuilderWrapper.failNextUpdate();
-    setNotesMigration(true, true);
-    ChangeNotes notes = notesFactory.create(dbProvider.get(), project, id);
-    notes.getDraftComments(user.getId());
-    assertThat(getMetaRef(allUsers, refsDraftComments(id, user.getId()))).isEqualTo(oldMetaId);
-
-    // Not up to date, but the actual returned state matches anyway.
-    assertChangeUpToDate(true, id);
-    assertDraftsUpToDate(false, id, user);
-    ChangeBundle actual = ChangeBundle.fromNotes(commentsUtil, notes);
-    ChangeBundle expected = bundleReader.fromReviewDb(getUnwrappedDb(), id);
-    assertThat(actual.differencesFrom(expected)).isEmpty();
-
-    // Another rebuild attempt succeeds
-    notesFactory.create(dbProvider.get(), project, id).getDraftComments(user.getId());
-    assertChangeUpToDate(true, id);
-    assertDraftsUpToDate(true, id, user);
-    assertThat(getMetaRef(allUsers, refsDraftComments(id, user.getId()))).isNotEqualTo(oldMetaId);
-  }
-
-  @Test
-  public void rebuildAutomaticallyWhenDraftsOutOfDate() throws Exception {
-    setNotesMigration(true, true);
-    setApiUser(user);
-
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getPatchSetId().getParentKey();
-    putDraft(user, id, 1, "comment", null);
-    assertDraftsUpToDate(true, id, user);
-
-    // Make a ReviewDb change behind NoteDb's back and ensure it's detected.
-    setNotesMigration(false, false);
-    putDraft(user, id, 1, "comment", null);
-    setInvalidNoteDbState(id);
-    assertDraftsUpToDate(false, id, user);
-
-    // On next NoteDb read, the drafts are transparently rebuilt.
-    setNotesMigration(true, true);
-    assertThat(gApi.changes().id(id.get()).current().drafts()).containsKey(PushOneCommit.FILE_NAME);
-    assertDraftsUpToDate(true, id, user);
-  }
-
-  @Test
-  public void pushCert() throws Exception {
-    // We don't have the code in our test harness to do signed pushes, so just
-    // use a hard-coded cert. This cert was actually generated by C git 2.2.0
-    // (albeit not for sending to Gerrit).
-    String cert =
-        "certificate version 0.1\n"
-            + "pusher Dave Borowitz <dborowitz@google.com> 1433954361 -0700\n"
-            + "pushee git://localhost/repo.git\n"
-            + "nonce 1433954361-bde756572d665bba81d8\n"
-            + "\n"
-            + "0000000000000000000000000000000000000000"
-            + "b981a177396fb47345b7df3e4d3f854c6bea7"
-            + "s/heads/master\n"
-            + "-----BEGIN PGP SIGNATURE-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "iQEcBAABAgAGBQJVeGg5AAoJEPfTicJkUdPkUggH/RKAeI9/i/LduuiqrL/SSdIa\n"
-            + "9tYaSqJKLbXz63M/AW4Sp+4u+dVCQvnAt/a35CVEnpZz6hN4Kn/tiswOWVJf4CO7\n"
-            + "htNubGs5ZMwvD6sLYqKAnrM3WxV/2TbbjzjZW6Jkidz3jz/WRT4SmjGYiEO7aA+V\n"
-            + "4ZdIS9f7sW5VsHHYlNThCA7vH8Uu48bUovFXyQlPTX0pToSgrWV3JnTxDNxfn3iG\n"
-            + "IL0zTY/qwVCdXgFownLcs6J050xrrBWIKqfcWr3u4D2aCLyR0v+S/KArr7ulZygY\n"
-            + "+SOklImn8TAZiNxhWtA6ens66IiammUkZYFv7SSzoPLFZT4dC84SmGPWgf94NoQ=\n"
-            + "=XFeC\n"
-            + "-----END PGP SIGNATURE-----\n";
-
-    PushOneCommit.Result r = createChange();
-    PatchSet.Id psId = r.getPatchSetId();
-    Change.Id id = psId.getParentKey();
-
-    PatchSet ps = db.patchSets().get(psId);
-    ps.setPushCertificate(cert);
-    db.patchSets().update(Collections.singleton(ps));
-    indexer.index(db, project, id);
-
-    checker.rebuildAndCheckChanges(id);
-  }
-
-  @Test
-  public void emptyTopic() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getPatchSetId().getParentKey();
-    Change c = db.changes().get(id);
-    assertThat(c.getTopic()).isNull();
-    c.setTopic("");
-    db.changes().update(Collections.singleton(c));
-
-    checker.rebuildAndCheckChanges(id);
-
-    setNotesMigration(true, true);
-
-    // Rebuild and check was successful, but NoteDb doesn't support storing an
-    // empty topic, so it comes out as null.
-    ChangeNotes notes = notesFactory.create(db, project, id);
-    assertThat(notes.getChange().getTopic()).isNull();
-  }
-
-  @Test
-  public void commentBeforeFirstPatchSet() throws Exception {
-    PushOneCommit.Result r = createChange();
-    PatchSet.Id psId = r.getPatchSetId();
-    Change.Id id = psId.getParentKey();
-
-    Change c = db.changes().get(id);
-    c.setCreatedOn(new Timestamp(c.getCreatedOn().getTime() - 5000));
-    db.changes().update(Collections.singleton(c));
-    indexer.index(db, project, id);
-
-    ReviewInput rin = new ReviewInput();
-    rin.message = "comment";
-
-    Timestamp ts = new Timestamp(c.getCreatedOn().getTime() + 2000);
-    assertThat(ts).isGreaterThan(c.getCreatedOn());
-    assertThat(ts).isLessThan(db.patchSets().get(psId).getCreatedOn());
-    RevisionResource revRsrc = parseCurrentRevisionResource(r.getChangeId());
-    postReview.get().apply(batchUpdateFactory, revRsrc, rin, ts);
-
-    checker.rebuildAndCheckChanges(id);
-  }
-
-  @Test
-  public void commentPredatingChangeBySomeoneOtherThanOwner() throws Exception {
-    PushOneCommit.Result r = createChange();
-    PatchSet.Id psId = r.getPatchSetId();
-    Change.Id id = psId.getParentKey();
-    Change c = db.changes().get(id);
-
-    ReviewInput rin = new ReviewInput();
-    rin.message = "comment";
-
-    Timestamp ts = new Timestamp(c.getCreatedOn().getTime() - 10000);
-    RevisionResource revRsrc = parseCurrentRevisionResource(r.getChangeId());
-    setApiUser(user);
-    postReview.get().apply(batchUpdateFactory, revRsrc, rin, ts);
-
-    checker.rebuildAndCheckChanges(id);
-  }
-
-  @Test
-  public void noteDbUsesOriginalSubjectFromPatchSetAndIgnoresChangeField() throws Exception {
-    PushOneCommit.Result r = createChange();
-    String orig = r.getChange().change().getSubject();
-    r =
-        pushFactory
-            .create(
-                db,
-                admin.getIdent(),
-                testRepo,
-                orig + " v2",
-                PushOneCommit.FILE_NAME,
-                "new contents",
-                r.getChangeId())
-            .to("refs/for/master");
-    r.assertOkStatus();
-
-    PatchSet.Id psId = r.getPatchSetId();
-    Change.Id id = psId.getParentKey();
-    Change c = db.changes().get(id);
-
-    c.setCurrentPatchSet(psId, c.getSubject(), "Bogus original subject");
-    db.changes().update(Collections.singleton(c));
-
-    checker.rebuildAndCheckChanges(id);
-
-    setNotesMigration(true, true);
-    ChangeNotes notes = notesFactory.create(db, project, id);
-    Change nc = notes.getChange();
-    assertThat(nc.getSubject()).isEqualTo(c.getSubject());
-    assertThat(nc.getSubject()).isEqualTo(orig + " v2");
-    assertThat(nc.getOriginalSubject()).isNotEqualTo(c.getOriginalSubject());
-    assertThat(nc.getOriginalSubject()).isEqualTo(orig);
-  }
-
-  @Test
-  public void ignorePatchLineCommentsOnPatchSet0() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change change = r.getChange().change();
-    Change.Id id = change.getId();
-
-    PatchLineComment comment =
-        new PatchLineComment(
-            new PatchLineComment.Key(
-                new Patch.Key(new PatchSet.Id(id, 0), PushOneCommit.FILE_NAME), "uuid"),
-            0,
-            user.getId(),
-            null,
-            TimeUtil.nowTs());
-    comment.setSide((short) 1);
-    comment.setMessage("message");
-    comment.setStatus(PatchLineComment.Status.PUBLISHED);
-    db.patchComments().insert(Collections.singleton(comment));
-    indexer.index(db, change.getProject(), id);
-
-    checker.rebuildAndCheckChanges(id);
-
-    setNotesMigration(true, true);
-    ChangeNotes notes = notesFactory.create(db, project, id);
-    assertThat(notes.getComments()).isEmpty();
-  }
-
-  @Test
-  public void leadingSpacesInSubject() throws Exception {
-    String subj = "   " + PushOneCommit.SUBJECT;
-    PushOneCommit push =
-        pushFactory.create(
-            db,
-            admin.getIdent(),
-            testRepo,
-            subj,
-            PushOneCommit.FILE_NAME,
-            PushOneCommit.FILE_CONTENT);
-    PushOneCommit.Result r = push.to("refs/for/master");
-    r.assertOkStatus();
-    Change change = r.getChange().change();
-    assertThat(change.getSubject()).isEqualTo(subj);
-    Change.Id id = r.getPatchSetId().getParentKey();
-
-    checker.rebuildAndCheckChanges(id);
-
-    setNotesMigration(true, true);
-    ChangeNotes notes = notesFactory.create(db, project, id);
-    assertThat(notes.getChange().getSubject()).isNotEqualTo(subj);
-    assertThat(notes.getChange().getSubject()).isEqualTo(PushOneCommit.SUBJECT);
-  }
-
-  @Test
-  public void allTimestampsExceptUpdatedAreEqualDueToBadMigration() throws Exception {
-    // https://bugs.chromium.org/p/gerrit/issues/detail?id=7397
-    PushOneCommit.Result r = createChange();
-    Change c = r.getChange().change();
-    Change.Id id = c.getId();
-    Timestamp ts = TimeUtil.nowTs();
-    Timestamp origUpdated = c.getLastUpdatedOn();
-
-    c.setCreatedOn(ts);
-    assertThat(c.getCreatedOn()).isGreaterThan(c.getLastUpdatedOn());
-    db.changes().update(Collections.singleton(c));
-
-    List<ChangeMessage> cm = db.changeMessages().byChange(id).toList();
-    cm.forEach(m -> m.setWrittenOn(ts));
-    db.changeMessages().update(cm);
-
-    List<PatchSet> ps = db.patchSets().byChange(id).toList();
-    ps.forEach(p -> p.setCreatedOn(ts));
-    db.patchSets().update(ps);
-
-    List<PatchSetApproval> psa = db.patchSetApprovals().byChange(id).toList();
-    psa.forEach(p -> p.setGranted(ts));
-    db.patchSetApprovals().update(psa);
-
-    List<PatchLineComment> plc = db.patchComments().byChange(id).toList();
-    plc.forEach(p -> p.setWrittenOn(ts));
-    db.patchComments().update(plc);
-
-    checker.rebuildAndCheckChanges(id);
-
-    setNotesMigration(true, true);
-    ChangeNotes notes = notesFactory.create(db, project, id);
-    assertThat(notes.getChange().getCreatedOn()).isEqualTo(origUpdated);
-    assertThat(notes.getChange().getLastUpdatedOn()).isAtLeast(origUpdated);
-    assertThat(notes.getPatchSets().get(new PatchSet.Id(id, 1)).getCreatedOn())
-        .isEqualTo(origUpdated);
-  }
-
-  @Test
-  public void createWithAutoRebuildingDisabled() throws Exception {
-    ReviewDb oldDb = db;
-    setNotesMigration(true, true);
-
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getPatchSetId().getParentKey();
-    ChangeNotes oldNotes = notesFactory.create(db, project, id);
-
-    // Make a ReviewDb change behind NoteDb's back.
-    Change c = oldDb.changes().get(id);
-    assertThat(c.getTopic()).isNull();
-    String topic = name("a-topic");
-    c.setTopic(topic);
-    oldDb.changes().update(Collections.singleton(c));
-
-    c = oldDb.changes().get(c.getId());
-    ChangeNotes newNotes = notesFactory.createWithAutoRebuildingDisabled(c, null);
-    assertThat(newNotes.getChange().getTopic()).isNotEqualTo(topic);
-    assertThat(newNotes.getChange().getTopic()).isEqualTo(oldNotes.getChange().getTopic());
-  }
-
-  @Test
-  public void rebuildDeletesOldDraftRefs() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getPatchSetId().getParentKey();
-    putDraft(user, id, 1, "comment", null);
-
-    Account.Id otherAccountId = new Account.Id(user.getId().get() + 1234);
-    String otherDraftRef = refsDraftComments(id, otherAccountId);
-
-    try (Repository repo = repoManager.openRepository(allUsers);
-        ObjectInserter ins = repo.newObjectInserter()) {
-      ObjectId sha = ins.insert(OBJ_BLOB, "garbage data".getBytes(UTF_8));
-      ins.flush();
-      RefUpdate ru = repo.updateRef(otherDraftRef);
-      ru.setExpectedOldObjectId(ObjectId.zeroId());
-      ru.setNewObjectId(sha);
-      assertThat(ru.update()).isEqualTo(RefUpdate.Result.NEW);
-    }
-
-    checker.rebuildAndCheckChanges(id);
-
-    try (Repository repo = repoManager.openRepository(allUsers)) {
-      assertThat(repo.exactRef(otherDraftRef)).isNull();
-    }
-  }
-
-  @Test
-  public void failWhenWritesDisabled() throws Exception {
-    setNotesMigration(true, true);
-
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getPatchSetId().getParentKey();
-    assertChangeUpToDate(true, id);
-    assertThat(gApi.changes().id(id.get()).info().topic).isNull();
-
-    // Turning off writes causes failure.
-    setNotesMigration(false, true);
-    try {
-      gApi.changes().id(id.get()).topic(name("a-topic"));
-      fail("Expected write to fail");
-    } catch (RestApiException e) {
-      assertChangesReadOnly(e);
-    }
-
-    // Update was not written.
-    assertThat(gApi.changes().id(id.get()).info().topic).isNull();
-    assertChangeUpToDate(true, id);
-  }
-
-  @Test
-  public void rebuildWhenWritesDisabledWorksButDoesNotWrite() throws Exception {
-    setNotesMigration(true, true);
-
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getPatchSetId().getParentKey();
-    assertChangeUpToDate(true, id);
-
-    // Make a ReviewDb change behind NoteDb's back and ensure it's detected.
-    setNotesMigration(false, false);
-    gApi.changes().id(id.get()).topic(name("a-topic"));
-    setInvalidNoteDbState(id);
-    assertChangeUpToDate(false, id);
-
-    // On next NoteDb read, change is rebuilt in-memory but not stored.
-    setNotesMigration(false, true);
-    assertThat(gApi.changes().id(id.get()).info().topic).isEqualTo(name("a-topic"));
-    assertChangeUpToDate(false, id);
-
-    // Attempting to write directly causes failure.
-    try {
-      gApi.changes().id(id.get()).topic(name("other-topic"));
-      fail("Expected write to fail");
-    } catch (RestApiException e) {
-      assertChangesReadOnly(e);
-    }
-
-    // Update was not written.
-    assertThat(gApi.changes().id(id.get()).info().topic).isEqualTo(name("a-topic"));
-    assertChangeUpToDate(false, id);
-  }
-
-  @Test
-  public void rebuildChangeWithNoPatchSets() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getPatchSetId().getParentKey();
-    db.changes().beginTransaction(id);
-    try {
-      db.patchSets().delete(db.patchSets().byChange(id));
-      db.commit();
-    } finally {
-      db.rollback();
-    }
-
-    try {
-      checker.rebuildAndCheckChanges(id);
-      assert_().fail("expected NoPatchSetsException");
-    } catch (NoPatchSetsException e) {
-      // Expected.
-    }
-
-    Change c = db.changes().get(id);
-    assertThat(c.getNoteDbState()).isNull();
-    checker.assertNoChangeRef(project, id);
-  }
-
-  @Test
-  public void rebuildChangeWithNoEntitiesOtherThanChange() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getPatchSetId().getParentKey();
-    db.changes().beginTransaction(id);
-    try {
-      db.changeMessages().delete(db.changeMessages().byChange(id));
-      db.patchSets().delete(db.patchSets().byChange(id));
-      db.patchSetApprovals().delete(db.patchSetApprovals().byChange(id));
-      db.patchComments().delete(db.patchComments().byChange(id));
-      db.commit();
-    } finally {
-      db.rollback();
-    }
-
-    try {
-      checker.rebuildAndCheckChanges(id);
-      assert_().fail("expected NoPatchSetsException");
-    } catch (NoPatchSetsException e) {
-      // Expected.
-    }
-
-    Change c = db.changes().get(id);
-    assertThat(c.getNoteDbState()).isNull();
-    checker.assertNoChangeRef(project, id);
-  }
-
-  @Test
-  public void rebuildEntitiesCreatedByImpersonation() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getPatchSetId().getParentKey();
-    PatchSet.Id psId = new PatchSet.Id(id, 1);
-    String prefix = "/changes/" + id + "/revisions/current/";
-
-    // For each of the entities that have a real user field, create one entity
-    // without impersonation and one with.
-    CommentInput ci = new CommentInput();
-    ci.path = Patch.COMMIT_MSG;
-    ci.side = Side.REVISION;
-    ci.line = 1;
-    ci.message = "comment without impersonation";
-    ReviewInput ri = new ReviewInput();
-    ri.label("Code-Review", -1);
-    ri.message = "message without impersonation";
-    ri.drafts = DraftHandling.KEEP;
-    ri.comments = ImmutableMap.of(ci.path, ImmutableList.of(ci));
-    userRestSession.post(prefix + "review", ri).assertOK();
-
-    DraftInput di = new DraftInput();
-    di.path = Patch.COMMIT_MSG;
-    di.side = Side.REVISION;
-    di.line = 1;
-    di.message = "draft without impersonation";
-    userRestSession.put(prefix + "drafts", di).assertCreated();
-
-    allowRunAs();
-    try {
-      Header runAs = new BasicHeader("X-Gerrit-RunAs", user.id.toString());
-      ci.message = "comment with impersonation";
-      ri.message = "message with impersonation";
-      ri.label("Code-Review", 1);
-      adminRestSession.postWithHeader(prefix + "review", runAs, ri).assertOK();
-
-      di.message = "draft with impersonation";
-      adminRestSession.putWithHeader(prefix + "drafts", runAs, di).assertCreated();
-    } finally {
-      removeRunAs();
-    }
-
-    List<ChangeMessage> msgs =
-        Ordering.natural()
-            .onResultOf(ChangeMessage::getWrittenOn)
-            .sortedCopy(db.changeMessages().byChange(id));
-    assertThat(msgs).hasSize(3);
-    assertThat(msgs.get(1).getMessage()).endsWith("message without impersonation");
-    assertThat(msgs.get(1).getAuthor()).isEqualTo(user.id);
-    assertThat(msgs.get(1).getRealAuthor()).isEqualTo(user.id);
-    assertThat(msgs.get(2).getMessage()).endsWith("message with impersonation");
-    assertThat(msgs.get(2).getAuthor()).isEqualTo(user.id);
-    assertThat(msgs.get(2).getRealAuthor()).isEqualTo(admin.id);
-
-    List<PatchSetApproval> psas = db.patchSetApprovals().byChange(id).toList();
-    assertThat(psas).hasSize(1);
-    assertThat(psas.get(0).getLabel()).isEqualTo("Code-Review");
-    assertThat(psas.get(0).getValue()).isEqualTo(1);
-    assertThat(psas.get(0).getAccountId()).isEqualTo(user.id);
-    assertThat(psas.get(0).getRealAccountId()).isEqualTo(admin.id);
-
-    Ordering<PatchLineComment> commentOrder =
-        Ordering.natural().onResultOf(PatchLineComment::getWrittenOn);
-    List<PatchLineComment> drafts =
-        commentOrder.sortedCopy(db.patchComments().draftByPatchSetAuthor(psId, user.id));
-    assertThat(drafts).hasSize(2);
-    assertThat(drafts.get(0).getMessage()).isEqualTo("draft without impersonation");
-    assertThat(drafts.get(0).getAuthor()).isEqualTo(user.id);
-    assertThat(drafts.get(0).getRealAuthor()).isEqualTo(user.id);
-    assertThat(drafts.get(1).getMessage()).isEqualTo("draft with impersonation");
-    assertThat(drafts.get(1).getAuthor()).isEqualTo(user.id);
-    assertThat(drafts.get(1).getRealAuthor()).isEqualTo(admin.id);
-
-    List<PatchLineComment> pub =
-        commentOrder.sortedCopy(db.patchComments().publishedByPatchSet(psId));
-    assertThat(pub).hasSize(2);
-    assertThat(pub.get(0).getMessage()).isEqualTo("comment without impersonation");
-    assertThat(pub.get(0).getAuthor()).isEqualTo(user.id);
-    assertThat(pub.get(0).getRealAuthor()).isEqualTo(user.id);
-    assertThat(pub.get(1).getMessage()).isEqualTo("comment with impersonation");
-    assertThat(pub.get(1).getAuthor()).isEqualTo(user.id);
-    assertThat(pub.get(1).getRealAuthor()).isEqualTo(admin.id);
-  }
-
-  @Test
-  public void laterEventsDependingOnEarlierPatchSetDontIntefereWithOtherPatchSets()
-      throws Exception {
-    PushOneCommit.Result r1 = createChange();
-    ChangeData cd = r1.getChange();
-    Change.Id id = cd.getId();
-    amendChange(cd.change().getKey().get());
-    TestTimeUtil.incrementClock(90, TimeUnit.DAYS);
-
-    ReviewInput rin = ReviewInput.approve();
-    rin.message = "Some very late message on PS1";
-    gApi.changes().id(id.get()).revision(1).review(rin);
-
-    checker.rebuildAndCheckChanges(id);
-  }
-
-  @Test
-  public void ignoreChangeMessageBeyondCurrentPatchSet() throws Exception {
-    PushOneCommit.Result r = createChange();
-    PatchSet.Id psId1 = r.getPatchSetId();
-    Change.Id id = psId1.getParentKey();
-    gApi.changes().id(id.get()).current().review(ReviewInput.recommend());
-
-    r = amendChange(r.getChangeId());
-    PatchSet.Id psId2 = r.getPatchSetId();
-
-    assertThat(db.patchSets().byChange(id)).hasSize(2);
-    assertThat(db.changeMessages().byPatchSet(psId2)).hasSize(1);
-    db.patchSets().deleteKeys(Collections.singleton(psId2));
-
-    checker.rebuildAndCheckChanges(psId2.getParentKey());
-    setNotesMigration(true, true);
-
-    ChangeData cd = changeDataFactory.create(db, project, id);
-    assertThat(cd.change().currentPatchSetId()).isEqualTo(psId1);
-    assertThat(cd.patchSets().stream().map(ps -> ps.getId()).collect(toList()))
-        .containsExactly(psId1);
-    PatchSet ps = cd.currentPatchSet();
-    assertThat(ps).isNotNull();
-    assertThat(ps.getId()).isEqualTo(psId1);
-  }
-
-  @Test
-  public void highestNumberedPatchSetIsNotCurrent() throws Exception {
-    PushOneCommit.Result r1 = createChange();
-    PatchSet.Id psId1 = r1.getPatchSetId();
-    Change.Id id = psId1.getParentKey();
-    PushOneCommit.Result r2 = amendChange(r1.getChangeId());
-    PatchSet.Id psId2 = r2.getPatchSetId();
-
-    try (BatchUpdate bu =
-        batchUpdateFactory.create(
-            db, project, identifiedUserFactory.create(user.getId()), TimeUtil.nowTs())) {
-      bu.addOp(
-          id,
-          new BatchUpdateOp() {
-            @Override
-            public boolean updateChange(ChangeContext ctx)
-                throws PatchSetInfoNotAvailableException {
-              ctx.getChange()
-                  .setCurrentPatchSet(patchSetInfoFactory.get(ctx.getDb(), ctx.getNotes(), psId1));
-              return true;
-            }
-          });
-      bu.execute();
-    }
-    ChangeNotes notes = notesFactory.create(db, project, id);
-    assertThat(psUtil.byChangeAsMap(db, notes).keySet()).containsExactly(psId1, psId2);
-    assertThat(notes.getChange().currentPatchSetId()).isEqualTo(psId1);
-
-    assertThat(db.changes().get(id).currentPatchSetId()).isEqualTo(psId1);
-
-    checker.rebuildAndCheckChanges(id);
-    setNotesMigration(true, true);
-
-    notes = notesFactory.create(db, project, id);
-    assertThat(psUtil.byChangeAsMap(db, notes).keySet()).containsExactly(psId1, psId2);
-    assertThat(notes.getChange().currentPatchSetId()).isEqualTo(psId1);
-  }
-
-  @Test
-  public void resolveCommentsInheritsValueFromParentWhenUnspecified() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getPatchSetId().getParentKey();
-    putDraft(user, id, 1, "comment", true);
-    putDraft(user, id, 1, "newComment", null);
-
-    Map<String, List<CommentInfo>> comments = gApi.changes().id(id.get()).current().drafts();
-    for (List<CommentInfo> cList : comments.values()) {
-      for (CommentInfo ci : cList) {
-        assertThat(ci.unresolved).isEqualTo(true);
-      }
-    }
-  }
-
-  @Test
-  public void rebuilderRespectsReadOnlyInNoteDbChangeState() throws Exception {
-    TestTimeUtil.resetWithClockStep(1, SECONDS);
-    PushOneCommit.Result r = createChange();
-    PatchSet.Id psId1 = r.getPatchSetId();
-    Change.Id id = psId1.getParentKey();
-
-    checker.rebuildAndCheckChanges(id);
-    setNotesMigration(true, true);
-
-    ReviewDb db = getUnwrappedDb();
-    Change c = db.changes().get(id);
-    NoteDbChangeState state = NoteDbChangeState.parse(c);
-    Timestamp until = new Timestamp(TimeUtil.nowMs() + MILLISECONDS.convert(1, DAYS));
-    state = state.withReadOnlyUntil(until);
-    c.setNoteDbState(state.toString());
-    db.changes().update(Collections.singleton(c));
-
-    try {
-      rebuilderWrapper.rebuild(db, id);
-      assert_().fail("expected rebuild to fail");
-    } catch (OrmRuntimeException e) {
-      assertThat(e.getMessage()).contains("read-only until");
-    }
-
-    TestTimeUtil.setClock(new Timestamp(until.getTime() + MILLISECONDS.convert(1, SECONDS)));
-    rebuilderWrapper.rebuild(db, id);
-  }
-
-  @Test
-  public void commitWithCrLineEndings() throws Exception {
-    PushOneCommit.Result r =
-        createChange("Subject\r\rBody\r", PushOneCommit.FILE_NAME, PushOneCommit.FILE_CONTENT);
-    Change c = r.getChange().change();
-
-    // This assertion demonstrates an arguable bug in JGit's commit subject
-    // parsing, and shows how this kind of data might have gotten into
-    // ReviewDb. If that bug ever gets fixed upstream, this assert may start
-    // failing. If that happens, this test can be rewritten to directly set the
-    // subject field in ReviewDb.
-    assertThat(c.getSubject()).isEqualTo("Subject\r\rBody");
-
-    checker.rebuildAndCheckChanges(c.getId());
-  }
-
-  @Test
-  public void patchSetsOutOfOrder() throws Exception {
-    String id = createChange().getChangeId();
-    amendChange(id);
-    PushOneCommit.Result r = amendChange(id);
-
-    ChangeData cd = r.getChange();
-    PatchSet.Id psId3 = cd.change().currentPatchSetId();
-    assertThat(psId3.get()).isEqualTo(3);
-
-    PatchSet ps1 = db.patchSets().get(new PatchSet.Id(cd.getId(), 1));
-    PatchSet ps3 = db.patchSets().get(psId3);
-    assertThat(ps1.getCreatedOn()).isLessThan(ps3.getCreatedOn());
-
-    // Simulate an old Gerrit bug by setting the created timestamp of the latest
-    // patch set ID to the timestamp of PS1.
-    ps3.setCreatedOn(ps1.getCreatedOn());
-    db.patchSets().update(Collections.singleton(ps3));
-
-    checker.rebuildAndCheckChanges(cd.getId());
-
-    setNotesMigration(true, true);
-    cd = changeDataFactory.create(db, project, cd.getId());
-    assertThat(cd.change().currentPatchSetId()).isEqualTo(psId3);
-
-    List<PatchSet> patchSets = ImmutableList.copyOf(cd.patchSets());
-    assertThat(patchSets).hasSize(3);
-
-    PatchSet newPs1 = patchSets.get(0);
-    assertThat(newPs1.getId()).isEqualTo(ps1.getId());
-    assertThat(newPs1.getCreatedOn()).isEqualTo(ps1.getCreatedOn());
-
-    PatchSet newPs2 = patchSets.get(1);
-    assertThat(newPs2.getCreatedOn()).isGreaterThan(newPs1.getCreatedOn());
-
-    PatchSet newPs3 = patchSets.get(2);
-    assertThat(newPs3.getId()).isEqualTo(ps3.getId());
-    // Migrated with a newer timestamp than the original, to preserve ordering.
-    assertThat(newPs3.getCreatedOn()).isAtLeast(newPs2.getCreatedOn());
-    assertThat(newPs3.getCreatedOn()).isGreaterThan(ps1.getCreatedOn());
-  }
-
-  @Test
-  public void ignoreNoteDbStateWithNoCorrespondingRefWhenWritesAndReadsDisabled() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getChange().getId();
-    ReviewDb db = getUnwrappedDb();
-    Change c = db.changes().get(id);
-    c.setNoteDbState("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef");
-    db.changes().update(Collections.singleton(c));
-    c = db.changes().get(id);
-
-    String refName = RefNames.changeMetaRef(id);
-    assertThat(getMetaRef(project, refName)).isNull();
-
-    ChangeNotes notes = notesFactory.create(dbProvider.get(), project, id);
-    assertThat(notes.getChange().getRowVersion()).isEqualTo(c.getRowVersion());
-
-    notes = notesFactory.createChecked(dbProvider.get(), project, id);
-    assertThat(notes.getChange().getRowVersion()).isEqualTo(c.getRowVersion());
-
-    assertThat(getMetaRef(project, refName)).isNull();
-  }
-
-  @Test
-  public void autoRebuildMissingRefWriteOnly() throws Exception {
-    setNotesMigration(true, false);
-    testAutoRebuildMissingRef();
-  }
-
-  @Test
-  public void autoRebuildMissingRefReadWrite() throws Exception {
-    setNotesMigration(true, true);
-    testAutoRebuildMissingRef();
-  }
-
-  private void testAutoRebuildMissingRef() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getChange().getId();
-
-    assertChangeUpToDate(true, id);
-    notesFactory.createChecked(db, project, id);
-
-    try (Repository repo = repoManager.openRepository(project)) {
-      RefUpdate ru = repo.updateRef(RefNames.changeMetaRef(id));
-      ru.setForceUpdate(true);
-      assertThat(ru.delete()).isEqualTo(RefUpdate.Result.FORCED);
-    }
-    assertChangeUpToDate(false, id);
-
-    notesFactory.createChecked(db, project, id);
-    assertChangeUpToDate(true, id);
-  }
-
-  @Test
-  public void missingPatchSetCommitOkForCommentsNotOnParentSide() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getChange().getId();
-
-    putDraft(user, id, 1, "draft comment", null, Side.REVISION);
-    putComment(user, id, 1, "published comment", null, Side.REVISION);
-
-    ReviewDb db = getUnwrappedDb();
-    PatchSet ps = db.patchSets().get(new PatchSet.Id(id, 1));
-    ps.setRevision(new RevId("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
-    db.patchSets().update(Collections.singleton(ps));
-
-    try {
-      patchListCache.getOldId(db.changes().get(id), ps, null);
-      assert_().fail("Expected PatchListNotAvailableException");
-    } catch (PatchListNotAvailableException e) {
-      // Expected.
-    }
-
-    checker.rebuildAndCheckChanges(id);
-  }
-
-  @Test
-  public void missingPatchSetCommitOmitsCommentsOnParentSide() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getChange().getId();
-
-    CommentInfo draftInfo = putDraft(user, id, 1, "draft comment", null, Side.PARENT);
-    putComment(user, id, 1, "published comment", null, Side.PARENT);
-    CommentInfo commentInfo =
-        gApi.changes().id(id.get()).comments().values().stream()
-            .flatMap(List::stream)
-            .findFirst()
-            .get();
-
-    ReviewDb db = getUnwrappedDb();
-    PatchSet ps = db.patchSets().get(new PatchSet.Id(id, 1));
-    ps.setRevision(new RevId("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
-    db.patchSets().update(Collections.singleton(ps));
-
-    try {
-      patchListCache.getOldId(db.changes().get(id), ps, null);
-      assert_().fail("Expected PatchListNotAvailableException");
-    } catch (PatchListNotAvailableException e) {
-      // Expected.
-    }
-
-    checker.rebuildAndCheckChange(
-        id,
-        Stream.of(draftInfo.id, commentInfo.id)
-            .sorted()
-            .map(c -> id + ",1," + PushOneCommit.FILE_NAME + "," + c)
-            .collect(
-                joining(", ", "PatchLineComment.Key sets differ: [", "] only in A; [] only in B")));
-  }
-
-  private void assertChangesReadOnly(RestApiException e) throws Exception {
-    Throwable cause = e.getCause();
-    assertThat(cause).isInstanceOf(UpdateException.class);
-    assertThat(cause.getCause()).isInstanceOf(OrmException.class);
-    assertThat(cause.getCause()).hasMessageThat().isEqualTo(NoteDbUpdateManager.CHANGES_READ_ONLY);
-  }
-
-  private void setInvalidNoteDbState(Change.Id id) throws Exception {
-    ReviewDb db = getUnwrappedDb();
-    Change c = db.changes().get(id);
-    // In reality we would have NoteDb writes enabled, which would write a real
-    // state into this field. For tests however, we turn NoteDb writes off, so
-    // just use a dummy state to force ChangeNotes to view the notes as
-    // out-of-date.
-    c.setNoteDbState("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef");
-    db.changes().update(Collections.singleton(c));
-  }
-
-  private void assertChangeUpToDate(boolean expected, Change.Id id) throws Exception {
-    try (Repository repo = repoManager.openRepository(project)) {
-      Change c = getUnwrappedDb().changes().get(id);
-      assertThat(c).isNotNull();
-      assertThat(c.getNoteDbState()).isNotNull();
-      NoteDbChangeState state = NoteDbChangeState.parse(c);
-      assertThat(state).isNotNull();
-      assertThat(state.getPrimaryStorage()).isEqualTo(PrimaryStorage.REVIEW_DB);
-      assertThat(state.isChangeUpToDate(new RepoRefCache(repo))).isEqualTo(expected);
-    }
-  }
-
-  private void assertDraftsUpToDate(boolean expected, Change.Id changeId, TestAccount account)
-      throws Exception {
-    try (Repository repo = repoManager.openRepository(allUsers)) {
-      Change c = getUnwrappedDb().changes().get(changeId);
-      assertThat(c).isNotNull();
-      assertThat(c.getNoteDbState()).isNotNull();
-      NoteDbChangeState state = NoteDbChangeState.parse(c);
-      assertThat(state.areDraftsUpToDate(new RepoRefCache(repo), account.getId()))
-          .isEqualTo(expected);
-    }
-  }
-
-  private ObjectId getMetaRef(Project.NameKey p, String name) throws Exception {
-    try (Repository repo = repoManager.openRepository(p)) {
-      Ref ref = repo.exactRef(name);
-      return ref != null ? ref.getObjectId() : null;
-    }
-  }
-
-  private CommentInfo putDraft(
-      TestAccount account, Change.Id id, int line, String msg, Boolean unresolved)
-      throws Exception {
-    return putDraft(account, id, line, msg, unresolved, Side.REVISION);
-  }
-
-  private CommentInfo putDraft(
-      TestAccount account, Change.Id id, int line, String msg, Boolean unresolved, Side side)
-      throws Exception {
-    DraftInput in = new DraftInput();
-    in.side = side;
-    in.line = line;
-    in.message = msg;
-    in.path = PushOneCommit.FILE_NAME;
-    in.unresolved = unresolved;
-    AcceptanceTestRequestScope.Context old = setApiUser(account);
-    try {
-      return gApi.changes().id(id.get()).current().createDraft(in).get();
-    } finally {
-      atrScope.set(old);
-    }
-  }
-
-  private void putComment(TestAccount account, Change.Id id, int line, String msg, String inReplyTo)
-      throws Exception {
-    putComment(account, id, line, msg, inReplyTo, Side.REVISION);
-  }
-
-  private void putComment(
-      TestAccount account, Change.Id id, int line, String msg, String inReplyTo, Side side)
-      throws Exception {
-    CommentInput in = new CommentInput();
-    in.side = side;
-    in.line = line;
-    in.message = msg;
-    in.inReplyTo = inReplyTo;
-    ReviewInput rin = new ReviewInput();
-    rin.comments = new HashMap<>();
-    rin.comments.put(PushOneCommit.FILE_NAME, ImmutableList.of(in));
-    rin.drafts = ReviewInput.DraftHandling.KEEP;
-    AcceptanceTestRequestScope.Context old = setApiUser(account);
-    try {
-      gApi.changes().id(id.get()).current().review(rin);
-    } finally {
-      atrScope.set(old);
-    }
-  }
-
-  private void publishDrafts(TestAccount account, Change.Id id) throws Exception {
-    ReviewInput rin = new ReviewInput();
-    rin.drafts = ReviewInput.DraftHandling.PUBLISH_ALL_REVISIONS;
-    AcceptanceTestRequestScope.Context old = setApiUser(account);
-    try {
-      gApi.changes().id(id.get()).current().review(rin);
-    } finally {
-      atrScope.set(old);
-    }
-  }
-
-  private ChangeMessage insertMessage(
-      Change.Id id, PatchSet.Id psId, Account.Id author, Timestamp ts, String message)
-      throws Exception {
-    ChangeMessage msg =
-        new ChangeMessage(new ChangeMessage.Key(id, ChangeUtil.messageUuid()), author, ts, psId);
-    msg.setMessage(message);
-    db.changeMessages().insert(Collections.singleton(msg));
-
-    Change c = db.changes().get(id);
-    if (ts.compareTo(c.getLastUpdatedOn()) > 0) {
-      c.setLastUpdatedOn(ts);
-      db.changes().update(Collections.singleton(c));
-    }
-
-    return msg;
-  }
-
-  private ReviewDb getUnwrappedDb() {
-    ReviewDb db = dbProvider.get();
-    return ReviewDbUtil.unwrapDb(db);
-  }
-
-  private void allowRunAs() throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(allProjects).getConfig();
-    Util.allow(
-        cfg, GlobalCapability.RUN_AS, systemGroupBackend.getGroup(REGISTERED_USERS).getUUID());
-    saveProjectConfig(allProjects, cfg);
-  }
-
-  private void removeRunAs() throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(allProjects).getConfig();
-    Util.remove(
-        cfg, GlobalCapability.RUN_AS, systemGroupBackend.getGroup(REGISTERED_USERS).getUUID());
-    saveProjectConfig(allProjects, cfg);
-  }
-
-  private Map<String, List<CommentInfo>> getPublishedComments(Change.Id id) throws Exception {
-    return gApi.changes().id(id.get()).current().comments();
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/notedb/NoteDbOnlyIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/notedb/NoteDbOnlyIT.java
deleted file mode 100644
index 6291447..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/notedb/NoteDbOnlyIT.java
+++ /dev/null
@@ -1,323 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.acceptance.server.notedb;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth.assert_;
-import static com.google.common.truth.Truth8.assertThat;
-import static com.google.common.truth.TruthJUnit.assume;
-import static com.google.gerrit.extensions.client.ListChangesOption.MESSAGES;
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Streams;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.BatchUpdateListener;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.RepoContext;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.testutil.ConfigSuite;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.List;
-import java.util.Optional;
-import java.util.concurrent.Callable;
-import java.util.concurrent.atomic.AtomicInteger;
-import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevSort;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.junit.Before;
-import org.junit.Test;
-
-public class NoteDbOnlyIT extends AbstractDaemonTest {
-  @ConfigSuite.Default
-  public static Config defaultConfig() {
-    Config cfg = new Config();
-    // Avoid spurious timeouts during intentional retries due to overloaded test machines.
-    cfg.setString("noteDb", null, "retryTimeout", Integer.MAX_VALUE + "s");
-    return cfg;
-  }
-
-  @Inject private RetryHelper retryHelper;
-
-  @Before
-  public void setUp() throws Exception {
-    assume().that(notesMigration.disableChangeReviewDb()).isTrue();
-  }
-
-  @Test
-  public void updateChangeFailureRollsBackRefUpdate() throws Exception {
-    assume().that(notesMigration.disableChangeReviewDb()).isTrue();
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getChange().getId();
-
-    String master = "refs/heads/master";
-    String backup = "refs/backup/master";
-    ObjectId master1 = getRef(master).get();
-    assertThat(getRef(backup)).isEmpty();
-
-    // Toy op that copies the value of refs/heads/master to refs/backup/master.
-    BatchUpdateOp backupMasterOp =
-        new BatchUpdateOp() {
-          ObjectId newId;
-
-          @Override
-          public void updateRepo(RepoContext ctx) throws IOException {
-            ObjectId oldId = ctx.getRepoView().getRef(backup).orElse(ObjectId.zeroId());
-            newId = ctx.getRepoView().getRef(master).get();
-            ctx.addRefUpdate(oldId, newId, backup);
-          }
-
-          @Override
-          public boolean updateChange(ChangeContext ctx) {
-            ctx.getUpdate(ctx.getChange().currentPatchSetId())
-                .setChangeMessage("Backed up master branch to " + newId.name());
-            return true;
-          }
-        };
-
-    try (BatchUpdate bu = newBatchUpdate(batchUpdateFactory)) {
-      bu.addOp(id, backupMasterOp);
-      bu.execute();
-    }
-
-    // Ensure backupMasterOp worked.
-    assertThat(getRef(backup)).hasValue(master1);
-    assertThat(getMessages(id)).contains("Backed up master branch to " + master1.name());
-
-    // Advance master by submitting the change.
-    gApi.changes().id(id.get()).current().review(ReviewInput.approve());
-    gApi.changes().id(id.get()).current().submit();
-    ObjectId master2 = getRef(master).get();
-    assertThat(master2).isNotEqualTo(master1);
-    int msgCount = getMessages(id).size();
-
-    try (BatchUpdate bu = newBatchUpdate(batchUpdateFactory)) {
-      // This time, we attempt to back up master, but we fail during updateChange.
-      bu.addOp(id, backupMasterOp);
-      String msg = "Change is bad";
-      bu.addOp(
-          id,
-          new BatchUpdateOp() {
-            @Override
-            public boolean updateChange(ChangeContext ctx) throws ResourceConflictException {
-              throw new ResourceConflictException(msg);
-            }
-          });
-      try {
-        bu.execute();
-        assert_().fail("expected ResourceConflictException");
-      } catch (ResourceConflictException e) {
-        assertThat(e).hasMessageThat().isEqualTo(msg);
-      }
-    }
-
-    // If updateChange hadn't failed, backup would have been updated to master2.
-    assertThat(getRef(backup)).hasValue(master1);
-    assertThat(getMessages(id)).hasSize(msgCount);
-  }
-
-  @Test
-  public void retryOnLockFailureWithAtomicUpdates() throws Exception {
-    assume().that(notesMigration.disableChangeReviewDb()).isTrue();
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getChange().getId();
-    String master = "refs/heads/master";
-    ObjectId initial;
-    try (Repository repo = repoManager.openRepository(project)) {
-      ensureAtomicTransactions(repo);
-      initial = repo.exactRef(master).getObjectId();
-    }
-
-    AtomicInteger updateRepoCalledCount = new AtomicInteger();
-    AtomicInteger updateChangeCalledCount = new AtomicInteger();
-    AtomicInteger afterUpdateReposCalledCount = new AtomicInteger();
-
-    String result =
-        retryHelper.execute(
-            batchUpdateFactory -> {
-              try (BatchUpdate bu = newBatchUpdate(batchUpdateFactory)) {
-                bu.addOp(
-                    id,
-                    new UpdateRefAndAddMessageOp(updateRepoCalledCount, updateChangeCalledCount));
-                bu.execute(new ConcurrentWritingListener(afterUpdateReposCalledCount));
-              }
-              return "Done";
-            });
-
-    assertThat(result).isEqualTo("Done");
-    assertThat(updateRepoCalledCount.get()).isEqualTo(2);
-    assertThat(afterUpdateReposCalledCount.get()).isEqualTo(2);
-    assertThat(updateChangeCalledCount.get()).isEqualTo(2);
-
-    List<String> messages = getMessages(id);
-    assertThat(Iterables.getLast(messages)).isEqualTo(UpdateRefAndAddMessageOp.CHANGE_MESSAGE);
-    assertThat(Collections.frequency(messages, UpdateRefAndAddMessageOp.CHANGE_MESSAGE))
-        .isEqualTo(1);
-
-    try (Repository repo = repoManager.openRepository(project)) {
-      // Op lost the race, so the other writer's commit happened first. Then op retried and wrote
-      // its commit with the other writer's commit as parent.
-      assertThat(commitMessages(repo, initial, repo.exactRef(master).getObjectId()))
-          .containsExactly(
-              ConcurrentWritingListener.MSG_PREFIX + "1", UpdateRefAndAddMessageOp.COMMIT_MESSAGE)
-          .inOrder();
-    }
-  }
-
-  @Test
-  public void missingChange() throws Exception {
-    Change.Id changeId = new Change.Id(1234567);
-    assertNoSuchChangeException(() -> notesFactory.create(db, project, changeId));
-    assertNoSuchChangeException(() -> notesFactory.createChecked(db, project, changeId));
-  }
-
-  private void assertNoSuchChangeException(Callable<?> callable) throws Exception {
-    try {
-      callable.call();
-      assert_().fail("expected NoSuchChangeException");
-    } catch (NoSuchChangeException e) {
-      // Expected.
-    }
-  }
-
-  private class ConcurrentWritingListener implements BatchUpdateListener {
-    static final String MSG_PREFIX = "Other writer ";
-
-    private final AtomicInteger calledCount;
-
-    private ConcurrentWritingListener(AtomicInteger calledCount) {
-      this.calledCount = calledCount;
-    }
-
-    @Override
-    public void afterUpdateRepos() throws Exception {
-      // Reopen repo and update ref, to simulate a concurrent write in another
-      // thread. Only do this the first time the listener is called.
-      if (calledCount.getAndIncrement() > 0) {
-        return;
-      }
-      try (Repository repo = repoManager.openRepository(project);
-          RevWalk rw = new RevWalk(repo);
-          ObjectInserter ins = repo.newObjectInserter()) {
-        String master = "refs/heads/master";
-        ObjectId oldId = repo.exactRef(master).getObjectId();
-        ObjectId newId = newCommit(rw, ins, oldId, MSG_PREFIX + calledCount.get());
-        ins.flush();
-        RefUpdate ru = repo.updateRef(master);
-        ru.setExpectedOldObjectId(oldId);
-        ru.setNewObjectId(newId);
-        assertThat(ru.update(rw)).isEqualTo(RefUpdate.Result.FAST_FORWARD);
-      }
-    }
-  }
-
-  private class UpdateRefAndAddMessageOp implements BatchUpdateOp {
-    static final String COMMIT_MESSAGE = "A commit";
-    static final String CHANGE_MESSAGE = "A change message";
-
-    private final AtomicInteger updateRepoCalledCount;
-    private final AtomicInteger updateChangeCalledCount;
-
-    private UpdateRefAndAddMessageOp(
-        AtomicInteger updateRepoCalledCount, AtomicInteger updateChangeCalledCount) {
-      this.updateRepoCalledCount = updateRepoCalledCount;
-      this.updateChangeCalledCount = updateChangeCalledCount;
-    }
-
-    @Override
-    public void updateRepo(RepoContext ctx) throws Exception {
-      String master = "refs/heads/master";
-      ObjectId oldId = ctx.getRepoView().getRef(master).get();
-      ObjectId newId = newCommit(ctx.getRevWalk(), ctx.getInserter(), oldId, COMMIT_MESSAGE);
-      ctx.addRefUpdate(oldId, newId, master);
-      updateRepoCalledCount.incrementAndGet();
-    }
-
-    @Override
-    public boolean updateChange(ChangeContext ctx) throws Exception {
-      ctx.getUpdate(ctx.getChange().currentPatchSetId()).setChangeMessage(CHANGE_MESSAGE);
-      updateChangeCalledCount.incrementAndGet();
-      return true;
-    }
-  }
-
-  private ObjectId newCommit(RevWalk rw, ObjectInserter ins, ObjectId parent, String msg)
-      throws IOException {
-    PersonIdent ident = serverIdent.get();
-    CommitBuilder cb = new CommitBuilder();
-    cb.setParentId(parent);
-    cb.setTreeId(rw.parseCommit(parent).getTree());
-    cb.setMessage(msg);
-    cb.setAuthor(ident);
-    cb.setCommitter(ident);
-    return ins.insert(Constants.OBJ_COMMIT, cb.build());
-  }
-
-  private BatchUpdate newBatchUpdate(BatchUpdate.Factory buf) {
-    return buf.create(db, project, identifiedUserFactory.create(user.getId()), TimeUtil.nowTs());
-  }
-
-  private Optional<ObjectId> getRef(String name) throws Exception {
-    try (Repository repo = repoManager.openRepository(project)) {
-      return Optional.ofNullable(repo.exactRef(name)).map(Ref::getObjectId);
-    }
-  }
-
-  private List<String> getMessages(Change.Id id) throws Exception {
-    return gApi.changes().id(id.get()).get(MESSAGES).messages.stream()
-        .map(m -> m.message)
-        .collect(toList());
-  }
-
-  private static List<String> commitMessages(
-      Repository repo, ObjectId fromExclusive, ObjectId toInclusive) throws Exception {
-    try (RevWalk rw = new RevWalk(repo)) {
-      rw.markStart(rw.parseCommit(toInclusive));
-      rw.markUninteresting(rw.parseCommit(fromExclusive));
-      rw.sort(RevSort.REVERSE);
-      rw.setRetainBody(true);
-      return Streams.stream(rw).map(c -> c.getShortMessage()).collect(toList());
-    }
-  }
-
-  private void ensureAtomicTransactions(Repository repo) throws Exception {
-    if (repo instanceof InMemoryRepository) {
-      ((InMemoryRepository) repo).setPerformsAtomicTransactions(true);
-    } else {
-      assertThat(repo.getRefDatabase().performsAtomicTransactions())
-          .named("performsAtomicTransactions on %s", repo)
-          .isTrue();
-    }
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/notedb/NoteDbPrimaryIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/notedb/NoteDbPrimaryIT.java
deleted file mode 100644
index 01f3d19..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/notedb/NoteDbPrimaryIT.java
+++ /dev/null
@@ -1,530 +0,0 @@
-// 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.
-
-package com.google.gerrit.acceptance.server.notedb;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth.assert_;
-import static com.google.common.truth.Truth8.assertThat;
-import static com.google.common.truth.TruthJUnit.assume;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.formatTime;
-import static com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage.REVIEW_DB;
-import static java.util.concurrent.TimeUnit.DAYS;
-import static java.util.concurrent.TimeUnit.MILLISECONDS;
-import static java.util.concurrent.TimeUnit.SECONDS;
-import static java.util.stream.Collectors.toList;
-
-import com.github.rholder.retry.Retryer;
-import com.github.rholder.retry.RetryerBuilder;
-import com.github.rholder.retry.StopStrategies;
-import com.google.common.base.Throwables;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.api.changes.DraftInput;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.api.changes.ReviewInput.CommentInput;
-import com.google.gerrit.extensions.client.ChangeStatus;
-import com.google.gerrit.extensions.common.ApprovalInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.CommentInfo;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDbUtil;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.CommentsUtil;
-import com.google.gerrit.server.InternalUser;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.git.RepoRefCache;
-import com.google.gerrit.server.notedb.ChangeBundle;
-import com.google.gerrit.server.notedb.ChangeBundleReader;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.ChangeUpdate;
-import com.google.gerrit.server.notedb.NoteDbChangeState;
-import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
-import com.google.gerrit.server.notedb.PrimaryStorageMigrator;
-import com.google.gerrit.server.notedb.TestChangeRebuilderWrapper;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.testutil.ConfigSuite;
-import com.google.gerrit.testutil.NoteDbMode;
-import com.google.gerrit.testutil.TestTimeUtil;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.OrmRuntimeException;
-import com.google.inject.Inject;
-import com.google.inject.util.Providers;
-import java.sql.Timestamp;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Optional;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-@NoHttpd
-public class NoteDbPrimaryIT extends AbstractDaemonTest {
-  @ConfigSuite.Default
-  public static Config defaultConfig() {
-    Config cfg = new Config();
-    cfg.setString("notedb", null, "concurrentWriterTimeout", "0s");
-    cfg.setString("notedb", null, "primaryStorageMigrationTimeout", "1d");
-    cfg.setBoolean("noteDb", null, "testRebuilderWrapper", true);
-    return cfg;
-  }
-
-  @Inject private AllUsersName allUsers;
-  @Inject private ChangeBundleReader bundleReader;
-  @Inject private CommentsUtil commentsUtil;
-  @Inject private TestChangeRebuilderWrapper rebuilderWrapper;
-  @Inject private ChangeNotes.Factory changeNotesFactory;
-  @Inject private ChangeUpdate.Factory updateFactory;
-  @Inject private InternalUser.Factory internalUserFactory;
-  @Inject private RetryHelper retryHelper;
-
-  private PrimaryStorageMigrator migrator;
-
-  @Before
-  public void setUp() throws Exception {
-    assume().that(NoteDbMode.get()).isEqualTo(NoteDbMode.READ_WRITE);
-    db = ReviewDbUtil.unwrapDb(db);
-    TestTimeUtil.resetWithClockStep(1, SECONDS);
-    migrator = newMigrator(null);
-  }
-
-  private PrimaryStorageMigrator newMigrator(
-      @Nullable Retryer<NoteDbChangeState> ensureRebuiltRetryer) {
-    return new PrimaryStorageMigrator(
-        cfg,
-        Providers.of(db),
-        repoManager,
-        allUsers,
-        rebuilderWrapper,
-        ensureRebuiltRetryer,
-        changeNotesFactory,
-        queryProvider,
-        updateFactory,
-        internalUserFactory,
-        retryHelper);
-  }
-
-  @After
-  public void tearDown() {
-    TestTimeUtil.useSystemTime();
-  }
-
-  @Test
-  public void updateChange() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getChange().getId();
-    setNoteDbPrimary(id);
-
-    gApi.changes().id(id.get()).current().review(ReviewInput.approve());
-    gApi.changes().id(id.get()).current().submit();
-
-    ChangeInfo info = gApi.changes().id(id.get()).get();
-    assertThat(info.status).isEqualTo(ChangeStatus.MERGED);
-    ApprovalInfo approval = Iterables.getOnlyElement(info.labels.get("Code-Review").all);
-    assertThat(approval._accountId).isEqualTo(admin.id.get());
-    assertThat(approval.value).isEqualTo(2);
-    assertThat(info.messages).hasSize(3);
-    assertThat(Iterables.getLast(info.messages).message)
-        .isEqualTo("Change has been successfully merged by " + admin.fullName);
-
-    ChangeNotes notes = notesFactory.create(db, project, id);
-    assertThat(notes.getChange().getStatus()).isEqualTo(Change.Status.MERGED);
-    assertThat(notes.getChange().getNoteDbState())
-        .isEqualTo(NoteDbChangeState.NOTE_DB_PRIMARY_STATE);
-
-    // Writes weren't reflected in ReviewDb.
-    assertThat(db.changes().get(id).getStatus()).isEqualTo(Change.Status.NEW);
-    assertThat(db.patchSetApprovals().byChange(id)).isEmpty();
-    assertThat(db.changeMessages().byChange(id)).hasSize(1);
-  }
-
-  @Test
-  public void deleteDraftComment() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getChange().getId();
-    setNoteDbPrimary(id);
-
-    DraftInput din = new DraftInput();
-    din.path = PushOneCommit.FILE_NAME;
-    din.line = 1;
-    din.message = "A comment";
-    gApi.changes().id(id.get()).current().createDraft(din);
-
-    CommentInfo di =
-        Iterables.getOnlyElement(
-            gApi.changes().id(id.get()).current().drafts().get(PushOneCommit.FILE_NAME));
-    assertThat(di.message).isEqualTo(din.message);
-
-    assertThat(db.patchComments().draftByChangeFileAuthor(id, din.path, admin.id)).isEmpty();
-
-    gApi.changes().id(id.get()).current().draft(di.id).delete();
-    assertThat(gApi.changes().id(id.get()).current().drafts()).isEmpty();
-  }
-
-  @Test
-  public void deleteVote() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getChange().getId();
-    setNoteDbPrimary(id);
-
-    gApi.changes().id(id.get()).current().review(ReviewInput.approve());
-    List<ApprovalInfo> approvals = gApi.changes().id(id.get()).get().labels.get("Code-Review").all;
-    assertThat(approvals).hasSize(1);
-    assertThat(approvals.get(0).value).isEqualTo(2);
-
-    gApi.changes().id(id.get()).reviewer(admin.id.toString()).deleteVote("Code-Review");
-
-    approvals = gApi.changes().id(id.get()).get().labels.get("Code-Review").all;
-    assertThat(approvals).hasSize(1);
-    assertThat(approvals.get(0).value).isEqualTo(0);
-  }
-
-  @Test
-  public void deleteVoteViaReview() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getChange().getId();
-    setNoteDbPrimary(id);
-
-    gApi.changes().id(id.get()).current().review(ReviewInput.approve());
-    List<ApprovalInfo> approvals = gApi.changes().id(id.get()).get().labels.get("Code-Review").all;
-    assertThat(approvals).hasSize(1);
-    assertThat(approvals.get(0).value).isEqualTo(2);
-
-    gApi.changes().id(id.get()).current().review(ReviewInput.noScore());
-
-    approvals = gApi.changes().id(id.get()).get().labels.get("Code-Review").all;
-    assertThat(approvals).hasSize(1);
-    assertThat(approvals.get(0).value).isEqualTo(0);
-  }
-
-  @Test
-  public void deleteReviewer() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getChange().getId();
-    setNoteDbPrimary(id);
-
-    gApi.changes().id(id.get()).addReviewer(user.id.toString());
-    assertThat(getReviewers(id)).containsExactly(user.id);
-    gApi.changes().id(id.get()).reviewer(user.id.toString()).remove();
-    assertThat(getReviewers(id)).isEmpty();
-  }
-
-  @Test
-  public void readOnlyReviewDb() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getChange().getId();
-    testReadOnly(id);
-  }
-
-  @Test
-  public void readOnlyNoteDb() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getChange().getId();
-    setNoteDbPrimary(id);
-    testReadOnly(id);
-  }
-
-  private void testReadOnly(Change.Id id) throws Exception {
-    Timestamp before = TimeUtil.nowTs();
-    Timestamp until = new Timestamp(before.getTime() + 1000 * 3600);
-
-    // Set read-only.
-    Change c = db.changes().get(id);
-    assertThat(c).named("change " + id).isNotNull();
-    NoteDbChangeState state = NoteDbChangeState.parse(c);
-    state = state.withReadOnlyUntil(until);
-    c.setNoteDbState(state.toString());
-    db.changes().update(Collections.singleton(c));
-
-    assertThat(gApi.changes().id(id.get()).get().subject).isEqualTo(PushOneCommit.SUBJECT);
-    assertThat(gApi.changes().id(id.get()).get().topic).isNull();
-    try {
-      gApi.changes().id(id.get()).topic("a-topic");
-      assert_().fail("expected read-only exception");
-    } catch (RestApiException e) {
-      Optional<Throwable> oe =
-          Throwables.getCausalChain(e).stream()
-              .filter(x -> x instanceof OrmRuntimeException)
-              .findFirst();
-      assertThat(oe).named("OrmRuntimeException in causal chain of " + e).isPresent();
-      assertThat(oe.get().getMessage()).contains("read-only");
-    }
-    assertThat(gApi.changes().id(id.get()).get().topic).isNull();
-
-    TestTimeUtil.setClock(new Timestamp(until.getTime() + 1000));
-    assertThat(gApi.changes().id(id.get()).get().subject).isEqualTo(PushOneCommit.SUBJECT);
-    gApi.changes().id(id.get()).topic("a-topic");
-    assertThat(gApi.changes().id(id.get()).get().topic).isEqualTo("a-topic");
-  }
-
-  @Test
-  public void migrateToNoteDb() throws Exception {
-    testMigrateToNoteDb(createChange().getChange().getId());
-  }
-
-  @Test
-  public void migrateToNoteDbWithRebuildingFirst() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getChange().getId();
-
-    Change c = db.changes().get(id);
-    c.setNoteDbState("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef");
-    db.changes().update(Collections.singleton(c));
-    testMigrateToNoteDb(id);
-  }
-
-  private void testMigrateToNoteDb(Change.Id id) throws Exception {
-    assertThat(PrimaryStorage.of(db.changes().get(id))).isEqualTo(PrimaryStorage.REVIEW_DB);
-    migrator.migrateToNoteDbPrimary(id);
-    assertNoteDbPrimary(id);
-
-    gApi.changes().id(id.get()).topic("a-topic");
-    assertThat(gApi.changes().id(id.get()).get().topic).isEqualTo("a-topic");
-    assertThat(db.changes().get(id).getTopic()).isNull();
-  }
-
-  @Test
-  public void migrateToNoteDbFailsRebuildingOnceAndRetries() throws Exception {
-    Change.Id id = createChange().getChange().getId();
-
-    Change c = db.changes().get(id);
-    c.setNoteDbState("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef");
-    db.changes().update(Collections.singleton(c));
-    rebuilderWrapper.failNextUpdate();
-
-    migrator =
-        newMigrator(
-            RetryerBuilder.<NoteDbChangeState>newBuilder()
-                .retryIfException()
-                .withStopStrategy(StopStrategies.neverStop())
-                .build());
-    migrator.migrateToNoteDbPrimary(id);
-    assertNoteDbPrimary(id);
-  }
-
-  @Test
-  public void migrateToNoteDbFailsRebuildingAndStops() throws Exception {
-    Change.Id id = createChange().getChange().getId();
-
-    Change c = db.changes().get(id);
-    c.setNoteDbState("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef");
-    db.changes().update(Collections.singleton(c));
-    rebuilderWrapper.failNextUpdate();
-
-    migrator =
-        newMigrator(
-            RetryerBuilder.<NoteDbChangeState>newBuilder()
-                .retryIfException()
-                .withStopStrategy(StopStrategies.stopAfterAttempt(1))
-                .build());
-    exception.expect(OrmException.class);
-    exception.expectMessage("Retrying failed");
-    migrator.migrateToNoteDbPrimary(id);
-  }
-
-  @Test
-  public void migrateToNoteDbMissingOldState() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getChange().getId();
-
-    Change c = db.changes().get(id);
-    c.setNoteDbState(null);
-    db.changes().update(Collections.singleton(c));
-
-    exception.expect(OrmRuntimeException.class);
-    exception.expectMessage("no note_db_state");
-    migrator.migrateToNoteDbPrimary(id);
-  }
-
-  @Test
-  public void migrateToNoteDbLeaseExpires() throws Exception {
-    TestTimeUtil.resetWithClockStep(2, DAYS);
-    exception.expect(OrmRuntimeException.class);
-    exception.expectMessage("read-only lease");
-    migrator.migrateToNoteDbPrimary(createChange().getChange().getId());
-  }
-
-  @Test
-  public void migrateToNoteDbAlreadyReadOnly() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getChange().getId();
-
-    Change c = db.changes().get(id);
-    NoteDbChangeState state = NoteDbChangeState.parse(c);
-    Timestamp until = new Timestamp(TimeUtil.nowMs() + MILLISECONDS.convert(1, DAYS));
-    state = state.withReadOnlyUntil(until);
-    c.setNoteDbState(state.toString());
-    db.changes().update(Collections.singleton(c));
-
-    exception.expect(OrmRuntimeException.class);
-    exception.expectMessage("read-only until " + until);
-    migrator.migrateToNoteDbPrimary(id);
-  }
-
-  @Test
-  public void migrateToNoteDbAlreadyMigrated() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getChange().getId();
-
-    assertThat(PrimaryStorage.of(db.changes().get(id))).isEqualTo(PrimaryStorage.REVIEW_DB);
-    migrator.migrateToNoteDbPrimary(id);
-    assertNoteDbPrimary(id);
-
-    migrator.migrateToNoteDbPrimary(id);
-    assertNoteDbPrimary(id);
-  }
-
-  @Test
-  public void rebuildReviewDb() throws Exception {
-    Change c = createChange().getChange().change();
-    Change.Id id = c.getId();
-
-    CommentInput cin = new CommentInput();
-    cin.line = 1;
-    cin.message = "Published comment";
-    ReviewInput rin = ReviewInput.approve();
-    rin.comments = ImmutableMap.of(PushOneCommit.FILE_NAME, ImmutableList.of(cin));
-    gApi.changes().id(id.get()).current().review(ReviewInput.approve());
-
-    DraftInput din = new DraftInput();
-    din.path = PushOneCommit.FILE_NAME;
-    din.line = 1;
-    din.message = "Draft comment";
-    gApi.changes().id(id.get()).current().createDraft(din);
-    gApi.changes().id(id.get()).current().review(ReviewInput.approve());
-    gApi.changes().id(id.get()).current().createDraft(din);
-
-    assertThat(db.changeMessages().byChange(id)).isNotEmpty();
-    assertThat(db.patchSets().byChange(id)).isNotEmpty();
-    assertThat(db.patchSetApprovals().byChange(id)).isNotEmpty();
-    assertThat(db.patchComments().byChange(id)).isNotEmpty();
-
-    ChangeBundle noteDbBundle =
-        ChangeBundle.fromNotes(commentsUtil, notesFactory.create(db, project, id));
-
-    setNoteDbPrimary(id);
-
-    db.changeMessages().delete(db.changeMessages().byChange(id));
-    db.patchSets().delete(db.patchSets().byChange(id));
-    db.patchSetApprovals().delete(db.patchSetApprovals().byChange(id));
-    db.patchComments().delete(db.patchComments().byChange(id));
-    ChangeMessage bogusMessage =
-        ChangeMessagesUtil.newMessage(
-            c.currentPatchSetId(),
-            identifiedUserFactory.create(admin.getId()),
-            TimeUtil.nowTs(),
-            "some message",
-            null);
-    db.changeMessages().insert(Collections.singleton(bogusMessage));
-
-    rebuilderWrapper.rebuildReviewDb(db, project, id);
-
-    assertThat(db.changeMessages().byChange(id)).isNotEmpty();
-    assertThat(db.patchSets().byChange(id)).isNotEmpty();
-    assertThat(db.patchSetApprovals().byChange(id)).isNotEmpty();
-    assertThat(db.patchComments().byChange(id)).isNotEmpty();
-
-    ChangeBundle reviewDbBundle = bundleReader.fromReviewDb(ReviewDbUtil.unwrapDb(db), id);
-    assertThat(reviewDbBundle.differencesFrom(noteDbBundle)).isEmpty();
-  }
-
-  @Test
-  public void rebuildReviewDbRequiresNoteDbPrimary() throws Exception {
-    Change.Id id = createChange().getChange().getId();
-
-    exception.expect(OrmException.class);
-    exception.expectMessage("primary storage of " + id + " is REVIEW_DB");
-    rebuilderWrapper.rebuildReviewDb(db, project, id);
-  }
-
-  @Test
-  public void migrateBackToReviewDbPrimary() throws Exception {
-    Change c = createChange().getChange().change();
-    Change.Id id = c.getId();
-
-    migrator.migrateToNoteDbPrimary(id);
-    assertNoteDbPrimary(id);
-
-    gApi.changes().id(id.get()).topic("new-topic");
-    assertThat(gApi.changes().id(id.get()).topic()).isEqualTo("new-topic");
-    assertThat(db.changes().get(id).getTopic()).isNotEqualTo("new-topic");
-
-    migrator.migrateToReviewDbPrimary(id, null);
-    ObjectId metaId;
-    try (Repository repo = repoManager.openRepository(c.getProject());
-        RevWalk rw = new RevWalk(repo)) {
-      metaId = repo.exactRef(RefNames.changeMetaRef(id)).getObjectId();
-      RevCommit commit = rw.parseCommit(metaId);
-      rw.parseBody(commit);
-      assertThat(commit.getFullMessage())
-          .contains("Read-only-until: " + formatTime(serverIdent.get(), new Timestamp(0)));
-    }
-    NoteDbChangeState state = NoteDbChangeState.parse(db.changes().get(id));
-    assertThat(state.getPrimaryStorage()).isEqualTo(PrimaryStorage.REVIEW_DB);
-    assertThat(state.getChangeMetaId()).isEqualTo(metaId);
-    assertThat(gApi.changes().id(id.get()).topic()).isEqualTo("new-topic");
-    assertThat(db.changes().get(id).getTopic()).isEqualTo("new-topic");
-
-    ChangeNotes notes = notesFactory.create(db, project, id);
-    assertThat(notes.getRevision()).isEqualTo(metaId); // No rebuilding, change was up to date.
-    assertThat(notes.getReadOnlyUntil()).isNotNull();
-
-    gApi.changes().id(id.get()).topic("reviewdb-topic");
-    assertThat(db.changes().get(id).getTopic()).isEqualTo("reviewdb-topic");
-  }
-
-  private void setNoteDbPrimary(Change.Id id) throws Exception {
-    Change c = db.changes().get(id);
-    assertThat(c).named("change " + id).isNotNull();
-    NoteDbChangeState state = NoteDbChangeState.parse(c);
-    assertThat(state.getPrimaryStorage()).named("storage of " + id).isEqualTo(REVIEW_DB);
-
-    try (Repository changeRepo = repoManager.openRepository(c.getProject());
-        Repository allUsersRepo = repoManager.openRepository(allUsers)) {
-      assertThat(state.isUpToDate(new RepoRefCache(changeRepo), new RepoRefCache(allUsersRepo)))
-          .named("change " + id + " up to date")
-          .isTrue();
-    }
-
-    c.setNoteDbState(NoteDbChangeState.NOTE_DB_PRIMARY_STATE);
-    db.changes().update(Collections.singleton(c));
-  }
-
-  private void assertNoteDbPrimary(Change.Id id) throws Exception {
-    assertThat(PrimaryStorage.of(db.changes().get(id))).isEqualTo(PrimaryStorage.NOTE_DB);
-  }
-
-  private List<Account.Id> getReviewers(Change.Id id) throws Exception {
-    return gApi.changes().id(id.get()).get().reviewers.values().stream()
-        .flatMap(Collection::stream)
-        .map(a -> new Account.Id(a._accountId))
-        .collect(toList());
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/notedb/OnlineNoteDbMigrationIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/notedb/OnlineNoteDbMigrationIT.java
deleted file mode 100644
index 1358090..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/notedb/OnlineNoteDbMigrationIT.java
+++ /dev/null
@@ -1,675 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.acceptance.server.notedb;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth.assert_;
-import static com.google.common.truth.Truth8.assertThat;
-import static com.google.common.truth.TruthJUnit.assume;
-import static com.google.gerrit.server.notedb.NoteDbChangeState.NOTE_DB_PRIMARY_STATE;
-import static com.google.gerrit.server.notedb.NotesMigrationState.NOTE_DB;
-import static com.google.gerrit.server.notedb.NotesMigrationState.READ_WRITE_NO_SEQUENCE;
-import static com.google.gerrit.server.notedb.NotesMigrationState.READ_WRITE_WITH_SEQUENCE_NOTE_DB_PRIMARY;
-import static com.google.gerrit.server.notedb.NotesMigrationState.READ_WRITE_WITH_SEQUENCE_REVIEW_DB_PRIMARY;
-import static com.google.gerrit.server.notedb.NotesMigrationState.REVIEW_DB;
-import static com.google.gerrit.server.notedb.NotesMigrationState.WRITE;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.easymock.EasyMock.createStrictMock;
-import static org.easymock.EasyMock.expectLastCall;
-import static org.easymock.EasyMock.replay;
-import static org.easymock.EasyMock.verify;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.GerritConfig;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.acceptance.Sandboxed;
-import com.google.gerrit.acceptance.UseLocalDisk;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.registration.RegistrationHandle;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CommentsUtil;
-import com.google.gerrit.server.Sequences;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.notedb.ChangeBundle;
-import com.google.gerrit.server.notedb.ChangeBundleReader;
-import com.google.gerrit.server.notedb.NoteDbChangeState;
-import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
-import com.google.gerrit.server.notedb.NoteDbChangeState.RefState;
-import com.google.gerrit.server.notedb.NotesMigrationState;
-import com.google.gerrit.server.notedb.rebuild.MigrationException;
-import com.google.gerrit.server.notedb.rebuild.NoteDbMigrator;
-import com.google.gerrit.server.notedb.rebuild.NotesMigrationStateListener;
-import com.google.gerrit.server.schema.ReviewDbFactory;
-import com.google.gerrit.testutil.ConfigSuite;
-import com.google.gerrit.testutil.NoteDbMode;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.nio.file.FileVisitResult;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.SimpleFileVisitor;
-import java.nio.file.attribute.BasicFileAttributes;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-import java.util.SortedSet;
-import java.util.TreeSet;
-import org.eclipse.jgit.internal.storage.file.FileRepository;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectLoader;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.storage.file.FileBasedConfig;
-import org.eclipse.jgit.util.FS;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-@Sandboxed
-@UseLocalDisk
-@NoHttpd
-public class OnlineNoteDbMigrationIT extends AbstractDaemonTest {
-  private static final String INVALID_STATE = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef";
-
-  @ConfigSuite.Default
-  public static Config defaultConfig() {
-    Config cfg = new Config();
-    cfg.setInt("noteDb", "changes", "sequenceBatchSize", 10);
-    cfg.setInt("noteDb", "changes", "initialSequenceGap", 500);
-    return cfg;
-  }
-
-  // Tests in this class are generally interested in the actual ReviewDb contents, but the shifting
-  // migration state may result in various kinds of wrappers showing up unexpectedly.
-  @Inject @ReviewDbFactory private SchemaFactory<ReviewDb> schemaFactory;
-
-  @Inject private ChangeBundleReader changeBundleReader;
-  @Inject private CommentsUtil commentsUtil;
-  @Inject private DynamicSet<NotesMigrationStateListener> listeners;
-  @Inject private Provider<NoteDbMigrator.Builder> migratorBuilderProvider;
-  @Inject private Sequences sequences;
-  @Inject private SitePaths sitePaths;
-
-  private FileBasedConfig noteDbConfig;
-  private List<RegistrationHandle> addedListeners;
-
-  @Before
-  public void setUp() throws Exception {
-    assume().that(NoteDbMode.get()).isEqualTo(NoteDbMode.OFF);
-    // Unlike in the running server, for tests, we don't stack notedb.config on gerrit.config.
-    noteDbConfig = new FileBasedConfig(sitePaths.notedb_config.toFile(), FS.detect());
-    assertNotesMigrationState(REVIEW_DB, false, false);
-    addedListeners = new ArrayList<>();
-  }
-
-  @After
-  public void tearDown() throws Exception {
-    if (addedListeners != null) {
-      addedListeners.forEach(RegistrationHandle::remove);
-      addedListeners = null;
-    }
-  }
-
-  @Test
-  public void preconditionsFail() throws Exception {
-    List<Change.Id> cs = ImmutableList.of(new Change.Id(1));
-    List<Project.NameKey> ps = ImmutableList.of(new Project.NameKey("p"));
-    assertMigrationException(
-        "Cannot rebuild without noteDb.changes.write=true", b -> b, NoteDbMigrator::rebuild);
-    assertMigrationException(
-        "Cannot combine changes, projects and skipProjects",
-        b -> b.setChanges(cs).setProjects(ps),
-        m -> {});
-    assertMigrationException(
-        "Cannot combine changes, projects and skipProjects",
-        b -> b.setChanges(cs).setSkipProjects(ps),
-        m -> {});
-    assertMigrationException(
-        "Cannot combine changes, projects and skipProjects",
-        b -> b.setProjects(ps).setSkipProjects(ps),
-        m -> {});
-    assertMigrationException(
-        "Cannot set changes or projects or skipProjects during full migration",
-        b -> b.setChanges(cs),
-        NoteDbMigrator::migrate);
-    assertMigrationException(
-        "Cannot set changes or projects or skipProjects during full migration",
-        b -> b.setProjects(ps),
-        NoteDbMigrator::migrate);
-    assertMigrationException(
-        "Cannot set changes or projects or skipProjects during full migration",
-        b -> b.setSkipProjects(ps),
-        NoteDbMigrator::migrate);
-
-    setNotesMigrationState(READ_WRITE_WITH_SEQUENCE_REVIEW_DB_PRIMARY);
-    assertMigrationException(
-        "Migration has already progressed past the endpoint of the \"trial mode\" state",
-        b -> b.setTrialMode(true),
-        NoteDbMigrator::migrate);
-
-    setNotesMigrationState(READ_WRITE_WITH_SEQUENCE_NOTE_DB_PRIMARY);
-    assertMigrationException(
-        "Cannot force rebuild changes; NoteDb is already the primary storage for some changes",
-        b -> b.setForceRebuild(true),
-        NoteDbMigrator::migrate);
-  }
-
-  @Test
-  @GerritConfig(name = "noteDb.changes.initialSequenceGap", value = "-7")
-  public void initialSequenceGapMustBeNonNegative() throws Exception {
-    setNotesMigrationState(READ_WRITE_NO_SEQUENCE);
-    assertMigrationException("Sequence gap must be non-negative: -7", b -> b, m -> {});
-  }
-
-  @Test
-  public void rebuildOneChangeTrialModeAndForceRebuild() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getChange().getId();
-
-    migrate(b -> b.setTrialMode(true));
-    assertNotesMigrationState(READ_WRITE_NO_SEQUENCE, false, true);
-
-    ObjectId oldMetaId;
-    try (Repository repo = repoManager.openRepository(project);
-        ReviewDb db = schemaFactory.open()) {
-      Ref ref = repo.exactRef(RefNames.changeMetaRef(id));
-      assertThat(ref).isNotNull();
-      oldMetaId = ref.getObjectId();
-
-      Change c = db.changes().get(id);
-      assertThat(c).isNotNull();
-      NoteDbChangeState state = NoteDbChangeState.parse(c);
-      assertThat(state).isNotNull();
-      assertThat(state.getPrimaryStorage()).isEqualTo(PrimaryStorage.REVIEW_DB);
-      assertThat(state.getRefState()).hasValue(RefState.create(oldMetaId, ImmutableMap.of()));
-
-      // Force change to be out of date, and change topic so it will get rebuilt as something other
-      // than oldMetaId.
-      c.setNoteDbState(INVALID_STATE);
-      c.setTopic(name("a-new-topic"));
-      db.changes().update(ImmutableList.of(c));
-    }
-
-    migrate(b -> b.setTrialMode(true));
-    assertNotesMigrationState(READ_WRITE_NO_SEQUENCE, false, true);
-
-    try (Repository repo = repoManager.openRepository(project);
-        ReviewDb db = schemaFactory.open()) {
-      // Change is out of date, but was not rebuilt without forceRebuild.
-      assertThat(repo.exactRef(RefNames.changeMetaRef(id)).getObjectId()).isEqualTo(oldMetaId);
-      Change c = db.changes().get(id);
-      assertThat(c.getNoteDbState()).isEqualTo(INVALID_STATE);
-    }
-
-    migrate(b -> b.setTrialMode(true).setForceRebuild(true));
-    assertNotesMigrationState(READ_WRITE_NO_SEQUENCE, false, true);
-
-    try (Repository repo = repoManager.openRepository(project);
-        ReviewDb db = schemaFactory.open()) {
-      Ref ref = repo.exactRef(RefNames.changeMetaRef(id));
-      assertThat(ref).isNotNull();
-      ObjectId newMetaId = ref.getObjectId();
-      assertThat(newMetaId).isNotEqualTo(oldMetaId);
-
-      NoteDbChangeState state = NoteDbChangeState.parse(db.changes().get(id));
-      assertThat(state).isNotNull();
-      assertThat(state.getPrimaryStorage()).isEqualTo(PrimaryStorage.REVIEW_DB);
-      assertThat(state.getRefState()).hasValue(RefState.create(newMetaId, ImmutableMap.of()));
-    }
-  }
-
-  @Test
-  public void autoMigrateTrialMode() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getChange().getId();
-
-    migrate(b -> b.setAutoMigrate(true).setTrialMode(true).setStopAtStateForTesting(WRITE));
-    assertNotesMigrationState(WRITE, true, true);
-
-    migrate(b -> b);
-    // autoMigrate is still enabled so that we can continue the migration by only unsetting trial.
-    assertNotesMigrationState(READ_WRITE_NO_SEQUENCE, true, true);
-
-    ObjectId metaId;
-    try (Repository repo = repoManager.openRepository(project);
-        ReviewDb db = schemaFactory.open()) {
-      Ref ref = repo.exactRef(RefNames.changeMetaRef(id));
-      assertThat(ref).isNotNull();
-      metaId = ref.getObjectId();
-      NoteDbChangeState state = NoteDbChangeState.parse(db.changes().get(id));
-      assertThat(state).isNotNull();
-      assertThat(state.getPrimaryStorage()).isEqualTo(PrimaryStorage.REVIEW_DB);
-      assertThat(state.getRefState()).hasValue(RefState.create(metaId, ImmutableMap.of()));
-    }
-
-    // Unset trial mode and the next migration runs to completion.
-    noteDbConfig.load();
-    NoteDbMigrator.setTrialMode(noteDbConfig, false);
-    noteDbConfig.save();
-
-    migrate(b -> b);
-    assertNotesMigrationState(NOTE_DB, false, false);
-
-    try (Repository repo = repoManager.openRepository(project);
-        ReviewDb db = schemaFactory.open()) {
-      Ref ref = repo.exactRef(RefNames.changeMetaRef(id));
-      assertThat(ref).isNotNull();
-      assertThat(ref.getObjectId()).isEqualTo(metaId);
-      NoteDbChangeState state = NoteDbChangeState.parse(db.changes().get(id));
-      assertThat(state).isNotNull();
-      assertThat(state.getPrimaryStorage()).isEqualTo(PrimaryStorage.NOTE_DB);
-    }
-  }
-
-  @Test
-  public void rebuildSubsetOfChanges() throws Exception {
-    setNotesMigrationState(WRITE);
-
-    PushOneCommit.Result r1 = createChange();
-    PushOneCommit.Result r2 = createChange();
-    Change.Id id1 = r1.getChange().getId();
-    Change.Id id2 = r2.getChange().getId();
-
-    invalidateNoteDbState(id1, id2);
-    migrate(b -> b.setChanges(ImmutableList.of(id2)), NoteDbMigrator::rebuild);
-    assertNotRebuilt(id1);
-    assertRebuilt(id2);
-  }
-
-  @Test
-  public void rebuildSubsetOfProjects() throws Exception {
-    setNotesMigrationState(WRITE);
-
-    Project.NameKey p2 = createProject("project2");
-    TestRepository<?> tr2 = cloneProject(p2, admin);
-
-    PushOneCommit.Result r1 = createChange();
-    PushOneCommit.Result r2 = pushFactory.create(db, admin.getIdent(), tr2).to("refs/for/master");
-    Change.Id id1 = r1.getChange().getId();
-    Change.Id id2 = r2.getChange().getId();
-
-    invalidateNoteDbState(id1, id2);
-    migrate(b -> b.setProjects(ImmutableList.of(p2)), NoteDbMigrator::rebuild);
-    assertNotRebuilt(id1);
-    assertRebuilt(id2);
-  }
-
-  @Test
-  public void rebuildNonSkippedProjects() throws Exception {
-    setNotesMigrationState(WRITE);
-
-    Project.NameKey p2 = createProject("project2");
-    TestRepository<?> tr2 = cloneProject(p2, admin);
-    Project.NameKey p3 = createProject("project3");
-    TestRepository<?> tr3 = cloneProject(p3, admin);
-
-    PushOneCommit.Result r1 = createChange();
-    PushOneCommit.Result r2 = pushFactory.create(db, admin.getIdent(), tr2).to("refs/for/master");
-    PushOneCommit.Result r3 = pushFactory.create(db, admin.getIdent(), tr3).to("refs/for/master");
-    Change.Id id1 = r1.getChange().getId();
-    Change.Id id2 = r2.getChange().getId();
-    Change.Id id3 = r3.getChange().getId();
-
-    invalidateNoteDbState(id1, id2, id3);
-    migrate(b -> b.setSkipProjects(ImmutableList.of(p3)), NoteDbMigrator::rebuild);
-    assertRebuilt(id1, id2);
-    assertNotRebuilt(id3);
-  }
-
-  private void invalidateNoteDbState(Change.Id... ids) throws OrmException {
-    List<Change> list = new ArrayList<>(ids.length);
-    try (ReviewDb db = schemaFactory.open()) {
-      for (Change.Id id : ids) {
-        Change c = db.changes().get(id);
-        c.setNoteDbState(INVALID_STATE);
-        list.add(c);
-      }
-      db.changes().update(list);
-    }
-  }
-
-  private void assertRebuilt(Change.Id... ids) throws OrmException {
-    try (ReviewDb db = schemaFactory.open()) {
-      for (Change.Id id : ids) {
-        NoteDbChangeState s = NoteDbChangeState.parse(db.changes().get(id));
-        assertThat(s.getChangeMetaId().name()).isNotEqualTo(INVALID_STATE);
-      }
-    }
-  }
-
-  private void assertNotRebuilt(Change.Id... ids) throws OrmException {
-    try (ReviewDb db = schemaFactory.open()) {
-      for (Change.Id id : ids) {
-        NoteDbChangeState s = NoteDbChangeState.parse(db.changes().get(id));
-        assertThat(s.getChangeMetaId().name()).isEqualTo(INVALID_STATE);
-      }
-    }
-  }
-
-  @Test
-  public void enableSequencesNoGap() throws Exception {
-    testEnableSequences(0, 3, "13");
-  }
-
-  @Test
-  public void enableSequencesWithGap() throws Exception {
-    testEnableSequences(-1, 502, "512");
-  }
-
-  private void testEnableSequences(int builderOption, int expectedFirstId, String expectedRefValue)
-      throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getChange().getId();
-    assertThat(id.get()).isEqualTo(1);
-
-    migrate(
-        b ->
-            b.setSequenceGap(builderOption)
-                .setStopAtStateForTesting(READ_WRITE_WITH_SEQUENCE_REVIEW_DB_PRIMARY));
-
-    assertThat(sequences.nextChangeId()).isEqualTo(expectedFirstId);
-    assertThat(sequences.nextChangeId()).isEqualTo(expectedFirstId + 1);
-
-    try (Repository repo = repoManager.openRepository(allProjects);
-        ObjectReader reader = repo.newObjectReader()) {
-      Ref ref = repo.exactRef("refs/sequences/changes");
-      assertThat(ref).isNotNull();
-      ObjectLoader loader = reader.open(ref.getObjectId());
-      assertThat(loader.getType()).isEqualTo(Constants.OBJ_BLOB);
-      // Acquired a block of 10 to serve the first nextChangeId call after migration.
-      assertThat(new String(loader.getCachedBytes(), UTF_8)).isEqualTo(expectedRefValue);
-    }
-
-    try (ReviewDb db = schemaFactory.open()) {
-      // Underlying, unused ReviewDb is still on its own sequence.
-      @SuppressWarnings("deprecation")
-      int nextFromReviewDb = db.nextChangeId();
-      assertThat(nextFromReviewDb).isEqualTo(3);
-    }
-  }
-
-  @Test
-  public void fullMigrationSameThread() throws Exception {
-    testFullMigration(1);
-  }
-
-  @Test
-  public void fullMigrationMultipleThreads() throws Exception {
-    testFullMigration(2);
-  }
-
-  private void testFullMigration(int threads) throws Exception {
-    PushOneCommit.Result r1 = createChange();
-    PushOneCommit.Result r2 = createChange();
-    Change.Id id1 = r1.getChange().getId();
-    Change.Id id2 = r2.getChange().getId();
-
-    Set<String> objectFiles = getObjectFiles(project);
-    assertThat(objectFiles).isNotEmpty();
-
-    migrate(b -> b.setThreads(threads));
-
-    assertNotesMigrationState(NOTE_DB, false, false);
-    assertThat(sequences.nextChangeId()).isEqualTo(503);
-    assertThat(getObjectFiles(project)).containsExactlyElementsIn(objectFiles);
-
-    ObjectId oldMetaId = null;
-    int rowVersion = 0;
-    try (ReviewDb db = schemaFactory.open();
-        Repository repo = repoManager.openRepository(project)) {
-      for (Change.Id id : ImmutableList.of(id1, id2)) {
-        String refName = RefNames.changeMetaRef(id);
-        Ref ref = repo.exactRef(refName);
-        assertThat(ref).named(refName).isNotNull();
-
-        Change c = db.changes().get(id);
-        assertThat(c.getTopic()).named("topic of change %s", id).isNull();
-        NoteDbChangeState s = NoteDbChangeState.parse(c);
-        assertThat(s.getPrimaryStorage())
-            .named("primary storage of change %s", id)
-            .isEqualTo(PrimaryStorage.NOTE_DB);
-        assertThat(s.getRefState()).named("ref state of change %s").isEmpty();
-
-        if (id.equals(id1)) {
-          oldMetaId = ref.getObjectId();
-          rowVersion = c.getRowVersion();
-        }
-      }
-    }
-
-    // Do not open a new context, to simulate races with other threads that opened a context earlier
-    // in the migration process; this needs to work.
-    gApi.changes().id(id1.get()).topic(name("a-topic"));
-
-    // Of course, it should also work with a new context.
-    resetCurrentApiUser();
-    gApi.changes().id(id1.get()).topic(name("another-topic"));
-
-    try (ReviewDb db = schemaFactory.open();
-        Repository repo = repoManager.openRepository(project)) {
-      assertThat(repo.exactRef(RefNames.changeMetaRef(id1)).getObjectId()).isNotEqualTo(oldMetaId);
-
-      Change c = db.changes().get(id1);
-      assertThat(c.getTopic()).isNull();
-      assertThat(c.getRowVersion()).isEqualTo(rowVersion);
-    }
-  }
-
-  @Test
-  public void fullMigrationOneChangeWithNoPatchSets() throws Exception {
-    PushOneCommit.Result r1 = createChange();
-    PushOneCommit.Result r2 = createChange();
-    Change.Id id1 = r1.getChange().getId();
-    Change.Id id2 = r2.getChange().getId();
-
-    db.changes().beginTransaction(id2);
-    try {
-      db.patchSets().delete(db.patchSets().byChange(id2));
-      db.commit();
-    } finally {
-      db.rollback();
-    }
-
-    migrate(b -> b);
-    assertNotesMigrationState(NOTE_DB, false, false);
-
-    try (ReviewDb db = schemaFactory.open();
-        Repository repo = repoManager.openRepository(project)) {
-      assertThat(repo.exactRef(RefNames.changeMetaRef(id1))).isNotNull();
-      assertThat(db.changes().get(id1).getNoteDbState()).isEqualTo(NOTE_DB_PRIMARY_STATE);
-
-      // A change with no patch sets is so corrupt that it is completely skipped by the migration
-      // process.
-      assertThat(repo.exactRef(RefNames.changeMetaRef(id2))).isNull();
-      assertThat(db.changes().get(id2).getNoteDbState()).isNull();
-    }
-  }
-
-  @Test
-  public void fullMigrationMissingPatchSetRefs() throws Exception {
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getChange().getId();
-
-    try (Repository repo = repoManager.openRepository(project)) {
-      RefUpdate u = repo.updateRef(new PatchSet.Id(id, 1).toRefName());
-      u.setForceUpdate(true);
-      assertThat(u.delete()).isEqualTo(RefUpdate.Result.FORCED);
-    }
-
-    ChangeBundle reviewDbBundle;
-    try (ReviewDb db = schemaFactory.open()) {
-      reviewDbBundle = changeBundleReader.fromReviewDb(db, id);
-    }
-
-    migrate(b -> b);
-    assertNotesMigrationState(NOTE_DB, false, false);
-
-    try (ReviewDb db = schemaFactory.open();
-        Repository repo = repoManager.openRepository(project)) {
-      // Change migrated successfully even though it was missing patch set refs.
-      assertThat(repo.exactRef(RefNames.changeMetaRef(id))).isNotNull();
-      assertThat(db.changes().get(id).getNoteDbState()).isEqualTo(NOTE_DB_PRIMARY_STATE);
-
-      ChangeBundle noteDbBundle =
-          ChangeBundle.fromNotes(commentsUtil, notesFactory.createChecked(db, project, id));
-      assertThat(noteDbBundle.differencesFrom(reviewDbBundle)).isEmpty();
-    }
-  }
-
-  @Test
-  public void autoMigrationConfig() throws Exception {
-    createChange();
-
-    migrate(b -> b.setStopAtStateForTesting(WRITE));
-    assertNotesMigrationState(WRITE, false, false);
-
-    migrate(b -> b.setAutoMigrate(true).setStopAtStateForTesting(READ_WRITE_NO_SEQUENCE));
-    assertNotesMigrationState(READ_WRITE_NO_SEQUENCE, true, false);
-
-    migrate(b -> b);
-    assertNotesMigrationState(NOTE_DB, false, false);
-  }
-
-  @Test
-  public void notesMigrationStateListener() throws Exception {
-    NotesMigrationStateListener listener = createStrictMock(NotesMigrationStateListener.class);
-    listener.preStateChange(REVIEW_DB, WRITE);
-    expectLastCall();
-    listener.preStateChange(WRITE, READ_WRITE_NO_SEQUENCE);
-    expectLastCall();
-    listener.preStateChange(READ_WRITE_NO_SEQUENCE, READ_WRITE_WITH_SEQUENCE_REVIEW_DB_PRIMARY);
-    expectLastCall();
-    listener.preStateChange(
-        READ_WRITE_WITH_SEQUENCE_REVIEW_DB_PRIMARY, READ_WRITE_WITH_SEQUENCE_NOTE_DB_PRIMARY);
-    listener.preStateChange(READ_WRITE_WITH_SEQUENCE_NOTE_DB_PRIMARY, NOTE_DB);
-    expectLastCall();
-    replay(listener);
-    addListener(listener);
-
-    createChange();
-    migrate(b -> b);
-    assertNotesMigrationState(NOTE_DB, false, false);
-    verify(listener);
-  }
-
-  @Test
-  public void notesMigrationStateListenerFails() throws Exception {
-    NotesMigrationStateListener listener = createStrictMock(NotesMigrationStateListener.class);
-    listener.preStateChange(REVIEW_DB, WRITE);
-    expectLastCall();
-    listener.preStateChange(WRITE, READ_WRITE_NO_SEQUENCE);
-    IOException listenerException = new IOException("Listener failed");
-    expectLastCall().andThrow(listenerException);
-    replay(listener);
-    addListener(listener);
-
-    createChange();
-    try {
-      migrate(b -> b);
-      assert_().fail("expected IOException");
-    } catch (IOException e) {
-      assertThat(e).isSameAs(listenerException);
-    }
-    assertNotesMigrationState(WRITE, false, false);
-    verify(listener);
-  }
-
-  private void assertNotesMigrationState(
-      NotesMigrationState expected, boolean autoMigrate, boolean trialMode) throws Exception {
-    assertThat(NotesMigrationState.forNotesMigration(notesMigration)).hasValue(expected);
-    noteDbConfig.load();
-    assertThat(NotesMigrationState.forConfig(noteDbConfig)).hasValue(expected);
-    assertThat(NoteDbMigrator.getAutoMigrate(noteDbConfig))
-        .named("noteDb.changes.autoMigrate")
-        .isEqualTo(autoMigrate);
-    assertThat(NoteDbMigrator.getTrialMode(noteDbConfig))
-        .named("noteDb.changes.trial")
-        .isEqualTo(trialMode);
-  }
-
-  private void setNotesMigrationState(NotesMigrationState state) throws Exception {
-    noteDbConfig.load();
-    state.setConfigValues(noteDbConfig);
-    noteDbConfig.save();
-    notesMigration.setFrom(state);
-  }
-
-  @FunctionalInterface
-  interface PrepareBuilder {
-    NoteDbMigrator.Builder prepare(NoteDbMigrator.Builder b) throws Exception;
-  }
-
-  @FunctionalInterface
-  interface RunMigration {
-    void run(NoteDbMigrator m) throws Exception;
-  }
-
-  private void migrate(PrepareBuilder b) throws Exception {
-    migrate(b, NoteDbMigrator::migrate);
-  }
-
-  private void migrate(PrepareBuilder b, RunMigration m) throws Exception {
-    try (NoteDbMigrator migrator = b.prepare(migratorBuilderProvider.get()).build()) {
-      m.run(migrator);
-    }
-  }
-
-  private void assertMigrationException(
-      String expectMessageContains, PrepareBuilder b, RunMigration m) throws Exception {
-    try {
-      migrate(b, m);
-    } catch (MigrationException e) {
-      assertThat(e).hasMessageThat().contains(expectMessageContains);
-    }
-  }
-
-  private void addListener(NotesMigrationStateListener listener) {
-    addedListeners.add(listeners.add(listener));
-  }
-
-  private SortedSet<String> getObjectFiles(Project.NameKey project) throws Exception {
-    SortedSet<String> files = new TreeSet<>();
-    try (Repository repo = repoManager.openRepository(project)) {
-      Files.walkFileTree(
-          ((FileRepository) repo).getObjectDatabase().getDirectory().toPath(),
-          new SimpleFileVisitor<Path>() {
-            @Override
-            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
-              String name = file.getFileName().toString();
-              if (!attrs.isDirectory() && !name.endsWith(".pack") && !name.endsWith(".idx")) {
-                files.add(name);
-              }
-              return FileVisitResult.CONTINUE;
-            }
-          });
-    }
-    return files;
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/BUILD b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/BUILD
deleted file mode 100644
index 622caf7..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/BUILD
+++ /dev/null
@@ -1,7 +0,0 @@
-load("//gerrit-acceptance-tests:tests.bzl", "acceptance_tests")
-
-acceptance_tests(
-    srcs = glob(["*IT.java"]),
-    group = "server_project",
-    labels = ["server"],
-)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/CustomLabelIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/CustomLabelIT.java
deleted file mode 100644
index 6a43cc4..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/CustomLabelIT.java
+++ /dev/null
@@ -1,215 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.acceptance.server.project;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.common.data.LabelFunction.ANY_WITH_BLOCK;
-import static com.google.gerrit.common.data.LabelFunction.MAX_NO_BLOCK;
-import static com.google.gerrit.common.data.LabelFunction.NO_BLOCK;
-import static com.google.gerrit.common.data.LabelFunction.NO_OP;
-import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
-import static com.google.gerrit.server.project.Util.category;
-import static com.google.gerrit.server.project.Util.value;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.changes.AddReviewerInput;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.client.ListChangesOption;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.LabelInfo;
-import com.google.gerrit.extensions.events.CommentAddedListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.registration.RegistrationHandle;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.project.Util;
-import com.google.inject.Inject;
-import java.util.Arrays;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-@NoHttpd
-public class CustomLabelIT extends AbstractDaemonTest {
-
-  @Inject private DynamicSet<CommentAddedListener> source;
-
-  private final LabelType label =
-      category("CustomLabel", value(1, "Positive"), value(0, "No score"), value(-1, "Negative"));
-
-  private final LabelType P = category("CustomLabel2", value(1, "Positive"), value(0, "No score"));
-
-  private RegistrationHandle eventListenerRegistration;
-  private CommentAddedListener.Event lastCommentAddedEvent;
-
-  @Before
-  public void setUp() throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    AccountGroup.UUID anonymousUsers = systemGroupBackend.getGroup(ANONYMOUS_USERS).getUUID();
-    Util.allow(cfg, Permission.forLabel(label.getName()), -1, 1, anonymousUsers, "refs/heads/*");
-    Util.allow(cfg, Permission.forLabel(P.getName()), 0, 1, anonymousUsers, "refs/heads/*");
-    saveProjectConfig(project, cfg);
-
-    eventListenerRegistration =
-        source.add(
-            new CommentAddedListener() {
-              @Override
-              public void onCommentAdded(Event event) {
-                lastCommentAddedEvent = event;
-              }
-            });
-  }
-
-  @After
-  public void cleanup() {
-    eventListenerRegistration.remove();
-    db.close();
-  }
-
-  @Test
-  public void customLabelNoOp_NegativeVoteNotBlock() throws Exception {
-    label.setFunction(NO_OP);
-    saveLabelConfig();
-    PushOneCommit.Result r = createChange();
-    revision(r).review(new ReviewInput().label(label.getName(), -1));
-    ChangeInfo c = get(r.getChangeId());
-    LabelInfo q = c.labels.get(label.getName());
-    assertThat(q.all).hasSize(1);
-    assertThat(q.rejected).isNotNull();
-    assertThat(q.blocking).isNull();
-  }
-
-  @Test
-  public void customLabelNoBlock_NegativeVoteNotBlock() throws Exception {
-    label.setFunction(NO_BLOCK);
-    saveLabelConfig();
-    PushOneCommit.Result r = createChange();
-    revision(r).review(new ReviewInput().label(label.getName(), -1));
-    ChangeInfo c = get(r.getChangeId());
-    LabelInfo q = c.labels.get(label.getName());
-    assertThat(q.all).hasSize(1);
-    assertThat(q.rejected).isNotNull();
-    assertThat(q.blocking).isNull();
-  }
-
-  @Test
-  public void customLabelMaxNoBlock_NegativeVoteNotBlock() throws Exception {
-    label.setFunction(MAX_NO_BLOCK);
-    saveLabelConfig();
-    PushOneCommit.Result r = createChange();
-    revision(r).review(new ReviewInput().label(label.getName(), -1));
-    ChangeInfo c = get(r.getChangeId());
-    LabelInfo q = c.labels.get(label.getName());
-    assertThat(q.all).hasSize(1);
-    assertThat(q.rejected).isNotNull();
-    assertThat(q.blocking).isNull();
-  }
-
-  @Test
-  public void customLabelAnyWithBlock_NegativeVoteBlock() throws Exception {
-    label.setFunction(ANY_WITH_BLOCK);
-    saveLabelConfig();
-    PushOneCommit.Result r = createChange();
-    revision(r).review(new ReviewInput().label(label.getName(), -1));
-    ChangeInfo c = get(r.getChangeId());
-    LabelInfo q = c.labels.get(label.getName());
-    assertThat(q.all).hasSize(1);
-    assertThat(q.disliked).isNull();
-    assertThat(q.rejected).isNotNull();
-    assertThat(q.blocking).isTrue();
-  }
-
-  @Test
-  public void customLabelAnyWithBlock_Addreviewer_ZeroVote() throws Exception {
-    P.setFunction(ANY_WITH_BLOCK);
-    saveLabelConfig();
-    PushOneCommit.Result r = createChange();
-    AddReviewerInput in = new AddReviewerInput();
-    in.reviewer = user.email;
-    gApi.changes().id(r.getChangeId()).addReviewer(in);
-
-    ReviewInput input = new ReviewInput().label(P.getName(), 0);
-    input.message = "foo";
-
-    revision(r).review(input);
-    ChangeInfo c = get(r.getChangeId());
-    LabelInfo q = c.labels.get(P.getName());
-    assertThat(q.all).hasSize(2);
-    assertThat(q.disliked).isNull();
-    assertThat(q.rejected).isNull();
-    assertThat(q.blocking).isNull();
-    assertThat(lastCommentAddedEvent.getComment()).isEqualTo("Patch Set 1:\n\n" + input.message);
-  }
-
-  @Test
-  public void customLabelMaxWithBlock_NegativeVoteBlock() throws Exception {
-    saveLabelConfig();
-    PushOneCommit.Result r = createChange();
-    revision(r).review(new ReviewInput().label(label.getName(), -1));
-    ChangeInfo c = get(r.getChangeId());
-    LabelInfo q = c.labels.get(label.getName());
-    assertThat(q.all).hasSize(1);
-    assertThat(q.disliked).isNull();
-    assertThat(q.rejected).isNotNull();
-    assertThat(q.blocking).isTrue();
-  }
-
-  @Test
-  public void customLabel_DisallowPostSubmit() throws Exception {
-    label.setFunction(NO_OP);
-    label.setAllowPostSubmit(false);
-    P.setFunction(NO_OP);
-    saveLabelConfig();
-
-    PushOneCommit.Result r = createChange();
-    revision(r).review(ReviewInput.approve());
-    revision(r).submit();
-
-    ChangeInfo info = get(r.getChangeId(), ListChangesOption.DETAILED_LABELS);
-    assertPermitted(info, "Code-Review", 2);
-    assertPermitted(info, P.getName(), 0, 1);
-    assertPermitted(info, label.getName());
-
-    ReviewInput in = new ReviewInput();
-    in.label(P.getName(), P.getMax().getValue());
-    revision(r).review(in);
-
-    in = new ReviewInput();
-    in.label(label.getName(), label.getMax().getValue());
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("Voting on labels disallowed after submit: " + label.getName());
-    revision(r).review(in);
-  }
-
-  @Test
-  public void customLabel_withBranch() throws Exception {
-    label.setRefPatterns(Arrays.asList("master"));
-    saveLabelConfig();
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    assertThat(cfg.getLabelSections().get(label.getName()).getRefPatterns()).contains("master");
-  }
-
-  private void saveLabelConfig() throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    cfg.getLabelSections().put(label.getName(), label);
-    cfg.getLabelSections().put(P.getName(), P);
-    saveProjectConfig(project, cfg);
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/ProjectWatchIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/ProjectWatchIT.java
deleted file mode 100644
index bc82e8d..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/ProjectWatchIT.java
+++ /dev/null
@@ -1,591 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.acceptance.server.project;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.server.StarredChangesUtil.IGNORE_LABEL;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.acceptance.Sandboxed;
-import com.google.gerrit.acceptance.TestAccount;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.api.changes.StarsInput;
-import com.google.gerrit.extensions.common.GroupInfo;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.account.WatchConfig;
-import com.google.gerrit.server.account.WatchConfig.NotifyType;
-import com.google.gerrit.server.account.WatchConfig.ProjectWatchKey;
-import com.google.gerrit.server.git.NotifyConfig;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.testutil.FakeEmailSender.Message;
-import com.google.inject.Inject;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
-import org.eclipse.jgit.junit.TestRepository;
-import org.junit.Test;
-
-@NoHttpd
-@Sandboxed
-public class ProjectWatchIT extends AbstractDaemonTest {
-  @Inject private WatchConfig.Accessor watchConfig;
-
-  @Test
-  public void newPatchSetsNotifyConfig() throws Exception {
-    Address addr = new Address("Watcher", "watcher@example.com");
-    NotifyConfig nc = new NotifyConfig();
-    nc.addEmail(addr);
-    nc.setName("new-patch-set");
-    nc.setHeader(NotifyConfig.Header.CC);
-    nc.setTypes(EnumSet.of(NotifyType.NEW_PATCHSETS));
-    nc.setFilter("message:sekret");
-
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    cfg.putNotifyConfig("watch", nc);
-    saveProjectConfig(project, cfg);
-
-    PushOneCommit.Result r =
-        pushFactory
-            .create(db, admin.getIdent(), testRepo, "original subject", "a", "a1")
-            .to("refs/for/master");
-    r.assertOkStatus();
-
-    r =
-        pushFactory
-            .create(
-                db, admin.getIdent(), testRepo, "super sekret subject", "a", "a2", r.getChangeId())
-            .to("refs/for/master");
-    r.assertOkStatus();
-
-    r =
-        pushFactory
-            .create(db, admin.getIdent(), testRepo, "back to original subject", "a", "a3")
-            .to("refs/for/master");
-    r.assertOkStatus();
-
-    List<Message> messages = sender.getMessages();
-    assertThat(messages).hasSize(1);
-    Message m = messages.get(0);
-    assertThat(m.rcpt()).containsExactly(addr);
-    assertThat(m.body()).contains("Change subject: super sekret subject\n");
-    assertThat(m.body()).contains("Gerrit-PatchSet: 2\n");
-  }
-
-  @Test
-  public void noNotificationForPrivateChangesForWatchersInNotifyConfig() throws Exception {
-    Address addr = new Address("Watcher", "watcher@example.com");
-    NotifyConfig nc = new NotifyConfig();
-    nc.addEmail(addr);
-    nc.setName("team");
-    nc.setHeader(NotifyConfig.Header.TO);
-    nc.setTypes(EnumSet.of(NotifyType.NEW_CHANGES, NotifyType.ALL_COMMENTS));
-
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    cfg.putNotifyConfig("team", nc);
-    saveProjectConfig(project, cfg);
-
-    sender.clear();
-    PushOneCommit.Result r =
-        pushFactory
-            .create(db, admin.getIdent(), testRepo, "private change", "a", "a1")
-            .to("refs/for/master%private");
-    r.assertOkStatus();
-
-    assertThat(sender.getMessages()).isEmpty();
-
-    setApiUser(admin);
-    ReviewInput in = new ReviewInput();
-    in.message = "comment";
-    gApi.changes().id(r.getChangeId()).current().review(in);
-
-    assertThat(sender.getMessages()).isEmpty();
-  }
-
-  @Test
-  public void noNotificationForChangeThatIsTurnedPrivateForWatchersInNotifyConfig()
-      throws Exception {
-    Address addr = new Address("Watcher", "watcher@example.com");
-    NotifyConfig nc = new NotifyConfig();
-    nc.addEmail(addr);
-    nc.setName("team");
-    nc.setHeader(NotifyConfig.Header.TO);
-    nc.setTypes(EnumSet.of(NotifyType.NEW_PATCHSETS));
-
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    cfg.putNotifyConfig("team", nc);
-    saveProjectConfig(project, cfg);
-
-    PushOneCommit.Result r =
-        pushFactory
-            .create(db, admin.getIdent(), testRepo, "subject", "a", "a1")
-            .to("refs/for/master");
-    r.assertOkStatus();
-
-    sender.clear();
-
-    r =
-        pushFactory
-            .create(db, admin.getIdent(), testRepo, "subject", "a", "a2", r.getChangeId())
-            .to("refs/for/master%private");
-    r.assertOkStatus();
-
-    assertThat(sender.getMessages()).isEmpty();
-  }
-
-  @Test
-  public void noNotificationForWipChangesForWatchersInNotifyConfig() throws Exception {
-    Address addr = new Address("Watcher", "watcher@example.com");
-    NotifyConfig nc = new NotifyConfig();
-    nc.addEmail(addr);
-    nc.setName("team");
-    nc.setHeader(NotifyConfig.Header.TO);
-    nc.setTypes(EnumSet.of(NotifyType.NEW_CHANGES, NotifyType.ALL_COMMENTS));
-
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    cfg.putNotifyConfig("team", nc);
-    saveProjectConfig(project, cfg);
-
-    sender.clear();
-    PushOneCommit.Result r =
-        pushFactory
-            .create(db, admin.getIdent(), testRepo, "wip change", "a", "a1")
-            .to("refs/for/master%wip");
-    r.assertOkStatus();
-
-    assertThat(sender.getMessages()).isEmpty();
-
-    setApiUser(admin);
-    ReviewInput in = new ReviewInput();
-    in.message = "comment";
-    gApi.changes().id(r.getChangeId()).current().review(in);
-
-    assertThat(sender.getMessages()).isEmpty();
-  }
-
-  @Test
-  public void noNotificationForChangeThatIsTurnedWipForWatchersInNotifyConfig() throws Exception {
-    Address addr = new Address("Watcher", "watcher@example.com");
-    NotifyConfig nc = new NotifyConfig();
-    nc.addEmail(addr);
-    nc.setName("team");
-    nc.setHeader(NotifyConfig.Header.TO);
-    nc.setTypes(EnumSet.of(NotifyType.NEW_PATCHSETS));
-
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    cfg.putNotifyConfig("team", nc);
-    saveProjectConfig(project, cfg);
-
-    PushOneCommit.Result r =
-        pushFactory
-            .create(db, admin.getIdent(), testRepo, "subject", "a", "a1")
-            .to("refs/for/master");
-    r.assertOkStatus();
-
-    sender.clear();
-
-    r =
-        pushFactory
-            .create(db, admin.getIdent(), testRepo, "subject", "a", "a2", r.getChangeId())
-            .to("refs/for/master%wip");
-    r.assertOkStatus();
-
-    assertThat(sender.getMessages()).isEmpty();
-  }
-
-  @Test
-  public void watchProject() throws Exception {
-    // watch project
-    String watchedProject = createProject("watchedProject").get();
-    setApiUser(user);
-    watch(watchedProject);
-
-    // push a change to watched project -> should trigger email notification
-    setApiUser(admin);
-    TestRepository<InMemoryRepository> watchedRepo =
-        cloneProject(new Project.NameKey(watchedProject), admin);
-    PushOneCommit.Result r =
-        pushFactory
-            .create(db, admin.getIdent(), watchedRepo, "TRIGGER", "a", "a1")
-            .to("refs/for/master");
-    r.assertOkStatus();
-
-    // push a change to non-watched project -> should not trigger email
-    // notification
-    String notWatchedProject = createProject("otherProject").get();
-    TestRepository<InMemoryRepository> notWatchedRepo =
-        cloneProject(new Project.NameKey(notWatchedProject), admin);
-    r =
-        pushFactory
-            .create(db, admin.getIdent(), notWatchedRepo, "DONT_TRIGGER", "a", "a1")
-            .to("refs/for/master");
-    r.assertOkStatus();
-
-    // assert email notification
-    List<Message> messages = sender.getMessages();
-    assertThat(messages).hasSize(1);
-    Message m = messages.get(0);
-    assertThat(m.rcpt()).containsExactly(user.emailAddress);
-    assertThat(m.body()).contains("Change subject: TRIGGER\n");
-    assertThat(m.body()).contains("Gerrit-PatchSet: 1\n");
-  }
-
-  @Test
-  public void watchFile() throws Exception {
-    String watchedProject = createProject("watchedProject").get();
-    String otherWatchedProject = createProject("otherWatchedProject").get();
-    setApiUser(user);
-
-    // watch file in project as user
-    watch(watchedProject, "file:a.txt");
-
-    // watch other project as user
-    watch(otherWatchedProject);
-
-    // push a change to watched file -> should trigger email notification for
-    // user
-    setApiUser(admin);
-    TestRepository<InMemoryRepository> watchedRepo =
-        cloneProject(new Project.NameKey(watchedProject), admin);
-    PushOneCommit.Result r =
-        pushFactory
-            .create(db, admin.getIdent(), watchedRepo, "TRIGGER", "a.txt", "a1")
-            .to("refs/for/master");
-    r.assertOkStatus();
-
-    // assert email notification for user
-    List<Message> messages = sender.getMessages();
-    assertThat(messages).hasSize(1);
-    Message m = messages.get(0);
-    assertThat(m.rcpt()).containsExactly(user.emailAddress);
-    assertThat(m.body()).contains("Change subject: TRIGGER\n");
-    assertThat(m.body()).contains("Gerrit-PatchSet: 1\n");
-    sender.clear();
-
-    // watch project as user2
-    TestAccount user2 = accountCreator.create("user2", "user2@test.com", "User2");
-    setApiUser(user2);
-    watch(watchedProject);
-
-    // push a change to non-watched file -> should not trigger email
-    // notification for user, only for user2
-    r =
-        pushFactory
-            .create(db, admin.getIdent(), watchedRepo, "TRIGGER_USER2", "b.txt", "b1")
-            .to("refs/for/master");
-    r.assertOkStatus();
-
-    // assert email notification
-    messages = sender.getMessages();
-    assertThat(messages).hasSize(1);
-    m = messages.get(0);
-    assertThat(m.rcpt()).containsExactly(user2.emailAddress);
-    assertThat(m.body()).contains("Change subject: TRIGGER_USER2\n");
-    assertThat(m.body()).contains("Gerrit-PatchSet: 1\n");
-  }
-
-  @Test
-  public void watchKeyword() throws Exception {
-    String watchedProject = createProject("watchedProject").get();
-    setApiUser(user);
-
-    // watch keyword in project as user
-    watch(watchedProject, "multimaster");
-
-    // push a change with keyword -> should trigger email notification
-    setApiUser(admin);
-    TestRepository<InMemoryRepository> watchedRepo =
-        cloneProject(new Project.NameKey(watchedProject), admin);
-    PushOneCommit.Result r =
-        pushFactory
-            .create(db, admin.getIdent(), watchedRepo, "Document multimaster setup", "a.txt", "a1")
-            .to("refs/for/master");
-    r.assertOkStatus();
-
-    // assert email notification for user
-    List<Message> messages = sender.getMessages();
-    assertThat(messages).hasSize(1);
-    Message m = messages.get(0);
-    assertThat(m.rcpt()).containsExactly(user.emailAddress);
-    assertThat(m.body()).contains("Change subject: Document multimaster setup\n");
-    assertThat(m.body()).contains("Gerrit-PatchSet: 1\n");
-    sender.clear();
-
-    // push a change without keyword -> should not trigger email notification
-    r =
-        pushFactory
-            .create(
-                db, admin.getIdent(), watchedRepo, "Cleanup cache implementation", "b.txt", "b1")
-            .to("refs/for/master");
-    r.assertOkStatus();
-
-    // assert email notification
-    assertThat(sender.getMessages()).isEmpty();
-  }
-
-  @Test
-  public void watchAllProjects() throws Exception {
-    String anyProject = createProject("anyProject").get();
-    setApiUser(user);
-
-    // watch the All-Projects project to watch all projects
-    watch(allProjects.get());
-
-    // push a change to any project -> should trigger email notification
-    setApiUser(admin);
-    TestRepository<InMemoryRepository> anyRepo =
-        cloneProject(new Project.NameKey(anyProject), admin);
-    PushOneCommit.Result r =
-        pushFactory
-            .create(db, admin.getIdent(), anyRepo, "TRIGGER", "a", "a1")
-            .to("refs/for/master");
-    r.assertOkStatus();
-
-    // assert email notification
-    List<Message> messages = sender.getMessages();
-    assertThat(messages).hasSize(1);
-    Message m = messages.get(0);
-    assertThat(m.rcpt()).containsExactly(user.emailAddress);
-    assertThat(m.body()).contains("Change subject: TRIGGER\n");
-    assertThat(m.body()).contains("Gerrit-PatchSet: 1\n");
-  }
-
-  @Test
-  public void watchFileAllProjects() throws Exception {
-    String anyProject = createProject("anyProject").get();
-    setApiUser(user);
-
-    // watch file in All-Projects project as user to watch the file in all
-    // projects
-    watch(allProjects.get(), "file:a.txt");
-
-    // push a change to watched file in any project -> should trigger email
-    // notification for user
-    setApiUser(admin);
-    TestRepository<InMemoryRepository> anyRepo =
-        cloneProject(new Project.NameKey(anyProject), admin);
-    PushOneCommit.Result r =
-        pushFactory
-            .create(db, admin.getIdent(), anyRepo, "TRIGGER", "a.txt", "a1")
-            .to("refs/for/master");
-    r.assertOkStatus();
-
-    // assert email notification for user
-    List<Message> messages = sender.getMessages();
-    assertThat(messages).hasSize(1);
-    Message m = messages.get(0);
-    assertThat(m.rcpt()).containsExactly(user.emailAddress);
-    assertThat(m.body()).contains("Change subject: TRIGGER\n");
-    assertThat(m.body()).contains("Gerrit-PatchSet: 1\n");
-    sender.clear();
-
-    // watch project as user2
-    TestAccount user2 = accountCreator.create("user2", "user2@test.com", "User2");
-    setApiUser(user2);
-    watch(anyProject);
-
-    // push a change to non-watched file in any project -> should not trigger
-    // email notification for user, only for user2
-    r =
-        pushFactory
-            .create(db, admin.getIdent(), anyRepo, "TRIGGER_USER2", "b.txt", "b1")
-            .to("refs/for/master");
-    r.assertOkStatus();
-
-    // assert email notification
-    messages = sender.getMessages();
-    assertThat(messages).hasSize(1);
-    m = messages.get(0);
-    assertThat(m.rcpt()).containsExactly(user2.emailAddress);
-    assertThat(m.body()).contains("Change subject: TRIGGER_USER2\n");
-    assertThat(m.body()).contains("Gerrit-PatchSet: 1\n");
-  }
-
-  @Test
-  public void watchKeywordAllProjects() throws Exception {
-    String anyProject = createProject("anyProject").get();
-    setApiUser(user);
-
-    // watch keyword in project as user
-    watch(allProjects.get(), "multimaster");
-
-    // push a change with keyword to any project -> should trigger email
-    // notification
-    setApiUser(admin);
-    TestRepository<InMemoryRepository> anyRepo =
-        cloneProject(new Project.NameKey(anyProject), admin);
-    PushOneCommit.Result r =
-        pushFactory
-            .create(db, admin.getIdent(), anyRepo, "Document multimaster setup", "a.txt", "a1")
-            .to("refs/for/master");
-    r.assertOkStatus();
-
-    // assert email notification for user
-    List<Message> messages = sender.getMessages();
-    assertThat(messages).hasSize(1);
-    Message m = messages.get(0);
-    assertThat(m.rcpt()).containsExactly(user.emailAddress);
-    assertThat(m.body()).contains("Change subject: Document multimaster setup\n");
-    assertThat(m.body()).contains("Gerrit-PatchSet: 1\n");
-    sender.clear();
-
-    // push a change without keyword to any project -> should not trigger email
-    // notification
-    r =
-        pushFactory
-            .create(db, admin.getIdent(), anyRepo, "Cleanup cache implementation", "b.txt", "b1")
-            .to("refs/for/master");
-    r.assertOkStatus();
-
-    // assert email notification
-    assertThat(sender.getMessages()).isEmpty();
-  }
-
-  @Test
-  public void watchProjectNoNotificationForIgnoredChange() throws Exception {
-    // watch project
-    String watchedProject = createProject("watchedProject").get();
-    setApiUser(user);
-    watch(watchedProject);
-
-    // push a change to watched project
-    setApiUser(admin);
-    TestRepository<InMemoryRepository> watchedRepo =
-        cloneProject(new Project.NameKey(watchedProject), admin);
-    PushOneCommit.Result r =
-        pushFactory
-            .create(db, admin.getIdent(), watchedRepo, "ignored change", "a", "a1")
-            .to("refs/for/master");
-    r.assertOkStatus();
-
-    // ignore the change
-    setApiUser(user);
-    gApi.accounts().self().setStars(r.getChangeId(), new StarsInput(ImmutableSet.of(IGNORE_LABEL)));
-
-    sender.clear();
-
-    // post a comment -> should not trigger email notification since user ignored the change
-    setApiUser(admin);
-    ReviewInput in = new ReviewInput();
-    in.message = "comment";
-    gApi.changes().id(r.getChangeId()).current().review(in);
-
-    // assert email notification
-    assertThat(sender.getMessages()).isEmpty();
-  }
-
-  @Test
-  public void deleteAllProjectWatches() throws Exception {
-    Map<ProjectWatchKey, Set<NotifyType>> watches = new HashMap<>();
-    watches.put(ProjectWatchKey.create(project, "*"), ImmutableSet.of(NotifyType.ALL));
-    watchConfig.upsertProjectWatches(admin.getId(), watches);
-    assertThat(watchConfig.getProjectWatches(admin.getId())).isNotEmpty();
-
-    watchConfig.deleteAllProjectWatches(admin.getId());
-    assertThat(watchConfig.getProjectWatches(admin.getId())).isEmpty();
-  }
-
-  @Test
-  public void deleteAllProjectWatchesIfWatchConfigIsTheOnlyFileInUserBranch() throws Exception {
-    // Create account that has no files in its refs/users/ branch.
-    Account.Id id = accountCreator.create().id;
-
-    // Add a project watch so that a watch.config file in the refs/users/ branch is created.
-    Map<ProjectWatchKey, Set<NotifyType>> watches = new HashMap<>();
-    watches.put(ProjectWatchKey.create(project, "*"), ImmutableSet.of(NotifyType.ALL));
-    watchConfig.upsertProjectWatches(id, watches);
-    assertThat(watchConfig.getProjectWatches(id)).isNotEmpty();
-
-    // Delete all project watches so that the watch.config file in the refs/users/ branch is
-    // deleted.
-    watchConfig.deleteAllProjectWatches(id);
-    assertThat(watchConfig.getProjectWatches(id)).isEmpty();
-  }
-
-  @Test
-  public void watchProjectNoNotificationForPrivateChange() throws Exception {
-    // watch project
-    String watchedProject = createProject("watchedProject").get();
-    setApiUser(user);
-    watch(watchedProject);
-
-    // push a private change to watched project -> should not trigger email notification
-    setApiUser(admin);
-    TestRepository<InMemoryRepository> watchedRepo =
-        cloneProject(new Project.NameKey(watchedProject), admin);
-    PushOneCommit.Result r =
-        pushFactory
-            .create(db, admin.getIdent(), watchedRepo, "private change", "a", "a1")
-            .to("refs/for/master%private");
-    r.assertOkStatus();
-
-    // assert email notification
-    assertThat(sender.getMessages()).isEmpty();
-  }
-
-  @Test
-  public void watchProjectNotifyOnPrivateChange() throws Exception {
-    String watchedProject = createProject("watchedProject").get();
-
-    // create group that can view all private changes
-    GroupInfo groupThatCanViewPrivateChanges =
-        gApi.groups().create("groupThatCanViewPrivateChanges").get();
-    grant(
-        new Project.NameKey(watchedProject),
-        "refs/*",
-        Permission.VIEW_PRIVATE_CHANGES,
-        false,
-        new AccountGroup.UUID(groupThatCanViewPrivateChanges.id));
-
-    // watch project as user that can't view private changes
-    setApiUser(user);
-    watch(watchedProject);
-
-    // watch project as user that can view all private change
-    TestAccount userThatCanViewPrivateChanges =
-        accountCreator.create(
-            "user2", "user2@test.com", "User2", groupThatCanViewPrivateChanges.name);
-    setApiUser(userThatCanViewPrivateChanges);
-    watch(watchedProject);
-
-    // push a private change to watched project -> should trigger email notification for
-    // userThatCanViewPrivateChanges, but not for user
-    setApiUser(admin);
-    TestRepository<InMemoryRepository> watchedRepo =
-        cloneProject(new Project.NameKey(watchedProject), admin);
-    PushOneCommit.Result r =
-        pushFactory
-            .create(db, admin.getIdent(), watchedRepo, "TRIGGER", "a", "a1")
-            .to("refs/for/master%private");
-    r.assertOkStatus();
-
-    // assert email notification
-    List<Message> messages = sender.getMessages();
-    assertThat(messages).hasSize(1);
-    Message m = messages.get(0);
-    assertThat(m.rcpt()).containsExactly(userThatCanViewPrivateChanges.emailAddress);
-    assertThat(m.body()).contains("Change subject: TRIGGER\n");
-    assertThat(m.body()).contains("Gerrit-PatchSet: 1\n");
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/ReflogIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/ReflogIT.java
deleted file mode 100644
index 7b4e2d6..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/ReflogIT.java
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.acceptance.server.project;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.TruthJUnit.assume;
-import static com.google.gerrit.reviewdb.client.RefNames.changeMetaRef;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.acceptance.UseLocalDisk;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.api.groups.GroupApi;
-import com.google.gerrit.extensions.api.projects.BranchApi;
-import com.google.gerrit.extensions.api.projects.ReflogEntryInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.project.Util;
-import java.io.File;
-import java.util.List;
-import org.eclipse.jgit.lib.ReflogEntry;
-import org.eclipse.jgit.lib.Repository;
-import org.junit.Test;
-
-public class ReflogIT extends AbstractDaemonTest {
-  @Test
-  @UseLocalDisk
-  public void guessRestApiInReflog() throws Exception {
-    assume().that(notesMigration.disableChangeReviewDb()).isTrue();
-    PushOneCommit.Result r = createChange();
-    Change.Id id = r.getChange().getId();
-
-    try (Repository repo = repoManager.openRepository(r.getChange().project())) {
-      File log = new File(repo.getDirectory(), "logs/" + changeMetaRef(id));
-      if (!log.exists()) {
-        log.getParentFile().mkdirs();
-        assertThat(log.createNewFile()).isTrue();
-      }
-
-      gApi.changes().id(id.get()).topic("foo");
-      ReflogEntry last = repo.getReflogReader(changeMetaRef(id)).getLastEntry();
-      assertThat(last).named("last RefLogEntry").isNotNull();
-      assertThat(last.getComment()).isEqualTo("change.PutTopic");
-    }
-  }
-
-  @Test
-  @UseLocalDisk
-  public void reflogUpdatedBySubmittingChange() throws Exception {
-    BranchApi branchApi = gApi.projects().name(project.get()).branch("master");
-    List<ReflogEntryInfo> reflog = branchApi.reflog();
-    assertThat(reflog).isNotEmpty();
-
-    // Current number of entries in the reflog
-    int refLogLen = reflog.size();
-
-    // Create and submit a change
-    PushOneCommit.Result r = createChange();
-    String changeId = r.getChangeId();
-    String revision = r.getCommit().name();
-    ReviewInput in = ReviewInput.approve();
-    gApi.changes().id(changeId).revision(revision).review(in);
-    gApi.changes().id(changeId).revision(revision).submit();
-
-    // Submitting the change causes a new entry in the reflog
-    reflog = branchApi.reflog();
-    assertThat(reflog).hasSize(refLogLen + 1);
-  }
-
-  @Test
-  @UseLocalDisk
-  public void regularUserIsNotAllowedToGetReflog() throws Exception {
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    gApi.projects().name(project.get()).branch("master").reflog();
-  }
-
-  @Test
-  @UseLocalDisk
-  public void ownerUserIsAllowedToGetReflog() throws Exception {
-    GroupApi groupApi = gApi.groups().create(name("get-reflog"));
-    groupApi.addMembers("user");
-
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    Util.allow(cfg, Permission.OWNER, new AccountGroup.UUID(groupApi.get().id), "refs/*");
-    saveProjectConfig(project, cfg);
-
-    setApiUser(user);
-    gApi.projects().name(project.get()).branch("master").reflog();
-  }
-
-  @Test
-  @UseLocalDisk
-  public void adminUserIsAllowedToGetReflog() throws Exception {
-    setApiUser(admin);
-    gApi.projects().name(project.get()).branch("master").reflog();
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/AbandonRestoreIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/AbandonRestoreIT.java
deleted file mode 100644
index 2131273..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/AbandonRestoreIT.java
+++ /dev/null
@@ -1,79 +0,0 @@
-// 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.
-
-package com.google.gerrit.acceptance.ssh;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.PushOneCommit.Result;
-import com.google.gerrit.acceptance.UseSsh;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.ChangeMessageInfo;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-import org.junit.Test;
-
-@NoHttpd
-@UseSsh
-public class AbandonRestoreIT extends AbstractDaemonTest {
-
-  @Test
-  public void withMessage() throws Exception {
-    Result result = createChange();
-    String commit = result.getCommit().name();
-    executeCmd(commit, "abandon", "'abandon it'");
-    executeCmd(commit, "restore", "'restore it'");
-    assertChangeMessages(
-        result.getChangeId(),
-        ImmutableList.of(
-            "Uploaded patch set 1.", "Abandoned\n\nabandon it", "Restored\n\nrestore it"));
-  }
-
-  @Test
-  public void withoutMessage() throws Exception {
-    Result result = createChange();
-    String commit = result.getCommit().name();
-    executeCmd(commit, "abandon", null);
-    executeCmd(commit, "restore", null);
-    assertChangeMessages(
-        result.getChangeId(), ImmutableList.of("Uploaded patch set 1.", "Abandoned", "Restored"));
-  }
-
-  private void executeCmd(String commit, String op, String message) throws Exception {
-    StringBuilder command =
-        new StringBuilder("gerrit review ").append(commit).append(" --").append(op);
-    if (message != null) {
-      command.append(" --message ").append(message);
-    }
-    String response = adminSshSession.exec(command.toString());
-    adminSshSession.assertSuccess();
-    assertThat(response.toLowerCase(Locale.US)).doesNotContain("error");
-  }
-
-  private void assertChangeMessages(String changeId, List<String> expected) throws Exception {
-    ChangeInfo c = get(changeId);
-    Iterable<ChangeMessageInfo> messages = c.messages;
-    assertThat(messages).isNotNull();
-    assertThat(messages).hasSize(expected.size());
-    List<String> actual = new ArrayList<>();
-    for (ChangeMessageInfo info : messages) {
-      actual.add(info.message);
-    }
-    assertThat(actual).containsExactlyElementsIn(expected);
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/AbstractIndexTests.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/AbstractIndexTests.java
deleted file mode 100644
index 208f380..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/AbstractIndexTests.java
+++ /dev/null
@@ -1,130 +0,0 @@
-// 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.
-
-package com.google.gerrit.acceptance.ssh;
-
-import static com.google.common.truth.Truth.assertThat;
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.base.Joiner;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.ChangeIndexedCounter;
-import com.google.gerrit.acceptance.GerritConfig;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.acceptance.UseSsh;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.events.ChangeIndexedListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.registration.RegistrationHandle;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import java.util.List;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-@NoHttpd
-@UseSsh
-public abstract class AbstractIndexTests extends AbstractDaemonTest {
-  @Inject private DynamicSet<ChangeIndexedListener> changeIndexedListeners;
-
-  private ChangeIndexedCounter changeIndexedCounter;
-  private RegistrationHandle changeIndexedCounterHandle;
-
-  /** @param injector injector */
-  public abstract void configureIndex(Injector injector) throws Exception;
-
-  @Before
-  public void addChangeIndexedCounter() {
-    changeIndexedCounter = new ChangeIndexedCounter();
-    changeIndexedCounterHandle = changeIndexedListeners.add(changeIndexedCounter);
-  }
-
-  @After
-  public void removeChangeIndexedCounter() {
-    if (changeIndexedCounterHandle != null) {
-      changeIndexedCounterHandle.remove();
-    }
-  }
-
-  @Test
-  @GerritConfig(name = "index.autoReindexIfStale", value = "false")
-  public void indexChange() throws Exception {
-    configureIndex(server.getTestInjector());
-
-    PushOneCommit.Result change = createChange("first change", "test1.txt", "test1");
-    String changeId = change.getChangeId();
-    String changeLegacyId = change.getChange().getId().toString();
-    ChangeInfo changeInfo = gApi.changes().id(changeId).get();
-
-    disableChangeIndexWrites();
-    amendChange(changeId, "second test", "test2.txt", "test2");
-
-    assertChangeQuery("message:second", change.getChange(), false);
-    enableChangeIndexWrites();
-
-    changeIndexedCounter.clear();
-    String cmd = Joiner.on(" ").join("gerrit", "index", "changes", changeLegacyId);
-    adminSshSession.exec(cmd);
-    adminSshSession.assertSuccess();
-
-    changeIndexedCounter.assertReindexOf(changeInfo, 1);
-
-    assertChangeQuery("message:second", change.getChange(), true);
-  }
-
-  @Test
-  @GerritConfig(name = "index.autoReindexIfStale", value = "false")
-  public void indexProject() throws Exception {
-    configureIndex(server.getTestInjector());
-
-    PushOneCommit.Result change = createChange("first change", "test1.txt", "test1");
-    String changeId = change.getChangeId();
-    ChangeInfo changeInfo = gApi.changes().id(changeId).get();
-
-    disableChangeIndexWrites();
-    amendChange(changeId, "second test", "test2.txt", "test2");
-
-    assertChangeQuery("message:second", change.getChange(), false);
-    enableChangeIndexWrites();
-
-    changeIndexedCounter.clear();
-    String cmd = Joiner.on(" ").join("gerrit", "index", "project", project.get());
-    adminSshSession.exec(cmd);
-    adminSshSession.assertSuccess();
-
-    boolean indexing = true;
-    while (indexing) {
-      String out = adminSshSession.exec("gerrit show-queue --wide");
-      adminSshSession.assertSuccess();
-      indexing = out.contains("Index all changes of project " + project.get());
-    }
-
-    changeIndexedCounter.assertReindexOf(changeInfo, 1);
-
-    assertChangeQuery("message:second", change.getChange(), true);
-  }
-
-  protected void assertChangeQuery(String q, ChangeData change, boolean assertTrue)
-      throws Exception {
-    List<Integer> ids = query(q).stream().map(c -> c._number).collect(toList());
-    if (assertTrue) {
-      assertThat(ids).contains(change.getId().get());
-    } else {
-      assertThat(ids).doesNotContain(change.getId().get());
-    }
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/BUILD b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/BUILD
deleted file mode 100644
index 3a8b677..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/BUILD
+++ /dev/null
@@ -1,38 +0,0 @@
-load("//gerrit-acceptance-tests:tests.bzl", "acceptance_tests")
-
-java_library(
-    name = "util",
-    testonly = 1,
-    srcs = ["AbstractIndexTests.java"],
-    deps = ["//gerrit-acceptance-tests:lib"],
-)
-
-acceptance_tests(
-    srcs = glob(
-        ["*IT.java"],
-        exclude = ["ElasticIndexIT.java"],
-    ),
-    group = "ssh",
-    labels = ["ssh"],
-    deps = [
-        ":util",
-        "//lib/commons:compress",
-    ],
-)
-
-acceptance_tests(
-    srcs = ["ElasticIndexIT.java"],
-    group = "elastic",
-    labels = [
-        "docker",
-        "elastic",
-        "exclusive",
-        "ssh",
-    ],
-    deps = [
-        ":util",
-        "//gerrit-elasticsearch:elasticsearch",
-        "//gerrit-elasticsearch:elasticsearch_test_utils",
-        "//lib/commons:compress",
-    ],
-)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/CreateProjectIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/CreateProjectIT.java
deleted file mode 100644
index e583179..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/CreateProjectIT.java
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.acceptance.ssh;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.UseSsh;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.project.ProjectState;
-import org.junit.Test;
-
-@UseSsh
-public class CreateProjectIT extends AbstractDaemonTest {
-
-  @Test
-  public void withValidGroupName() throws Exception {
-    String newGroupName = "newGroup";
-    adminRestSession.put("/groups/" + newGroupName);
-    String newProjectName = "newProject";
-    adminSshSession.exec(
-        "gerrit create-project --branch master --owner " + newGroupName + " " + newProjectName);
-    adminSshSession.assertSuccess();
-    ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
-    assertThat(projectState).isNotNull();
-  }
-
-  @Test
-  public void withInvalidGroupName() throws Exception {
-    String newGroupName = "newGroup";
-    adminRestSession.put("/groups/" + newGroupName);
-    String wrongGroupName = "newG";
-    String newProjectName = "newProject";
-    adminSshSession.exec(
-        "gerrit create-project --branch master --owner " + wrongGroupName + " " + newProjectName);
-    adminSshSession.assertFailure();
-    ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
-    assertThat(projectState).isNull();
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/ElasticIndexIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/ElasticIndexIT.java
deleted file mode 100644
index 3a1d05f..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/ElasticIndexIT.java
+++ /dev/null
@@ -1,46 +0,0 @@
-// 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.
-
-package com.google.gerrit.acceptance.ssh;
-
-import static com.google.gerrit.elasticsearch.ElasticTestUtils.createAllIndexes;
-import static com.google.gerrit.elasticsearch.ElasticTestUtils.getConfig;
-
-import com.google.gerrit.elasticsearch.ElasticVersion;
-import com.google.gerrit.testutil.ConfigSuite;
-import com.google.inject.Injector;
-import org.eclipse.jgit.lib.Config;
-
-public class ElasticIndexIT extends AbstractIndexTests {
-
-  @ConfigSuite.Default
-  public static Config elasticsearchV5() {
-    return getConfig(ElasticVersion.V5_6);
-  }
-
-  @ConfigSuite.Config
-  public static Config elasticsearchV6() {
-    return getConfig(ElasticVersion.V6_6);
-  }
-
-  @ConfigSuite.Config
-  public static Config elasticsearchV7() {
-    return getConfig(ElasticVersion.V7_0);
-  }
-
-  @Override
-  public void configureIndex(Injector injector) throws Exception {
-    createAllIndexes(injector);
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/SshCommandsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/SshCommandsIT.java
deleted file mode 100644
index 8a55aea..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/SshCommandsIT.java
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.acceptance.ssh;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth.assertWithMessage;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.UseSsh;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.sshd.Commands;
-import java.util.List;
-import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@NoHttpd
-@UseSsh
-public class SshCommandsIT extends AbstractDaemonTest {
-  private static final Logger log = LoggerFactory.getLogger(SshCommandsIT.class);
-
-  // TODO: It would be better to dynamically generate this list
-  private static final ImmutableMap<String, List<String>> COMMANDS =
-      ImmutableMap.of(
-          Commands.ROOT,
-          ImmutableList.of(
-              "apropos",
-              "ban-commit",
-              "close-connection",
-              "create-account",
-              "create-branch",
-              "create-group",
-              "create-project",
-              "flush-caches",
-              "gc",
-              "gsql",
-              "index",
-              "logging",
-              "ls-groups",
-              "ls-members",
-              "ls-projects",
-              "ls-user-refs",
-              "plugin",
-              "query",
-              "receive-pack",
-              "rename-group",
-              "review",
-              "set-account",
-              "set-head",
-              "set-members",
-              "set-project",
-              "set-project-parent",
-              "set-reviewers",
-              "show-caches",
-              "show-connections",
-              "show-queue",
-              "stream-events",
-              "test-submit",
-              "version"),
-          "index",
-          ImmutableList.of("changes", "project"), // "activate" and "start" are not included
-          "logging",
-          ImmutableList.of("ls", "set"),
-          "plugin",
-          ImmutableList.of("add", "enable", "install", "ls", "reload", "remove", "rm"),
-          "test-submit",
-          ImmutableList.of("rule", "type"));
-
-  @Test
-  public void sshCommandCanBeExecuted() throws Exception {
-    // Access Database capability is required to run the "gerrit gsql" command
-    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
-
-    for (String root : COMMANDS.keySet()) {
-      for (String command : COMMANDS.get(root)) {
-        // We can't assert that adminSshSession.hasError() is false, because using the --help
-        // option causes the usage info to be written to stderr. Instead, we assert on the
-        // content of the stderr, which will always start with "gerrit command" when the --help
-        // option is used.
-        String cmd = String.format("gerrit%s%s %s", root.isEmpty() ? "" : " ", root, command);
-        log.debug(cmd);
-        adminSshSession.exec(String.format("%s --help", cmd));
-        String response = adminSshSession.getError();
-        assertWithMessage(String.format("command %s failed: %s", command, response))
-            .that(response)
-            .startsWith(cmd);
-      }
-    }
-  }
-
-  @Test
-  public void nonExistingCommandFails() throws Exception {
-    adminSshSession.exec("gerrit non-existing-command --help");
-    assertThat(adminSshSession.getError())
-        .startsWith("fatal: gerrit: non-existing-command: not found");
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/UploadArchiveIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/UploadArchiveIT.java
deleted file mode 100644
index b8fd95f..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/UploadArchiveIT.java
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.acceptance.ssh;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.TruthJUnit.assume;
-
-import com.google.common.base.Splitter;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.GerritConfig;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.acceptance.UseSsh;
-import com.google.gerrit.testutil.NoteDbMode;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
-import java.util.Set;
-import java.util.TreeSet;
-import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
-import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
-import org.eclipse.jgit.transport.PacketLineIn;
-import org.eclipse.jgit.transport.PacketLineOut;
-import org.eclipse.jgit.util.IO;
-import org.junit.Before;
-import org.junit.Test;
-
-@NoHttpd
-@UseSsh
-public class UploadArchiveIT extends AbstractDaemonTest {
-
-  @Before
-  public void setUp() {
-    // There is some Guice request scoping problem preventing this test from
-    // passing in CHECK mode.
-    assume().that(NoteDbMode.get()).isNotEqualTo(NoteDbMode.CHECK);
-  }
-
-  @Test
-  @GerritConfig(name = "download.archive", value = "off")
-  public void archiveFeatureOff() throws Exception {
-    archiveNotPermitted();
-  }
-
-  @Test
-  @GerritConfig(
-      name = "download.archive",
-      values = {"tar", "tbz2", "tgz", "txz"})
-  public void zipFormatDisabled() throws Exception {
-    archiveNotPermitted();
-  }
-
-  @Test
-  public void zipFormat() throws Exception {
-    PushOneCommit.Result r = createChange();
-    String abbreviated = r.getCommit().abbreviate(8).name();
-    String c = command(r, abbreviated);
-
-    InputStream out =
-        adminSshSession.exec2("git-upload-archive " + project.get(), argumentsToInputStream(c));
-
-    // Wrap with PacketLineIn to read ACK bytes from output stream
-    PacketLineIn in = new PacketLineIn(out);
-    String tmp = in.readString();
-    assertThat(tmp).isEqualTo("ACK");
-    tmp = in.readString();
-
-    // Skip length (4 bytes) + 1 byte
-    // to position the output stream to the raw zip stream
-    byte[] buffer = new byte[5];
-    IO.readFully(out, buffer, 0, 5);
-    Set<String> entryNames = new TreeSet<>();
-    try (ZipArchiveInputStream zip = new ZipArchiveInputStream(out)) {
-      ZipArchiveEntry zipEntry = zip.getNextZipEntry();
-      while (zipEntry != null) {
-        String name = zipEntry.getName();
-        entryNames.add(name);
-        zipEntry = zip.getNextZipEntry();
-      }
-    }
-
-    assertThat(entryNames)
-        .containsExactly(
-            String.format("%s/", abbreviated),
-            String.format("%s/%s", abbreviated, PushOneCommit.FILE_NAME))
-        .inOrder();
-  }
-
-  private String command(PushOneCommit.Result r, String abbreviated) {
-    String c =
-        "-f=zip "
-            + "-9 "
-            + "--prefix="
-            + abbreviated
-            + "/ "
-            + r.getCommit().name()
-            + " "
-            + PushOneCommit.FILE_NAME;
-    return c;
-  }
-
-  private void archiveNotPermitted() throws Exception {
-    PushOneCommit.Result r = createChange();
-    String abbreviated = r.getCommit().abbreviate(8).name();
-    String c = command(r, abbreviated);
-
-    InputStream out =
-        adminSshSession.exec2("git-upload-archive " + project.get(), argumentsToInputStream(c));
-
-    // Wrap with PacketLineIn to read ACK bytes from output stream
-    PacketLineIn in = new PacketLineIn(out);
-    String tmp = in.readString();
-    assertThat(tmp).isEqualTo("ACK");
-    tmp = in.readString();
-    tmp = in.readString();
-    tmp = tmp.substring(1);
-    assertThat(tmp).isEqualTo("fatal: upload-archive not permitted");
-  }
-
-  private InputStream argumentsToInputStream(String c) throws Exception {
-    ByteArrayOutputStream out = new ByteArrayOutputStream();
-    PacketLineOut pctOut = new PacketLineOut(out);
-    for (String arg : Splitter.on(' ').split(c)) {
-      pctOut.writeString("argument " + arg);
-    }
-    pctOut.end();
-    return new ByteArrayInputStream(out.toByteArray());
-  }
-}
diff --git a/gerrit-acceptance-tests/tests.bzl b/gerrit-acceptance-tests/tests.bzl
deleted file mode 100644
index c1e34dd..0000000
--- a/gerrit-acceptance-tests/tests.bzl
+++ /dev/null
@@ -1,21 +0,0 @@
-load("//tools/bzl:junit.bzl", "junit_tests")
-
-def acceptance_tests(
-        group,
-        deps = [],
-        labels = [],
-        vm_args = ["-Xmx256m"],
-        **kwargs):
-    junit_tests(
-        name = group,
-        deps = deps + [
-            "//gerrit-acceptance-tests:lib",
-        ],
-        tags = labels + [
-            "acceptance",
-            "slow",
-        ],
-        size = "large",
-        jvm_flags = vm_args,
-        **kwargs
-    )
diff --git a/gerrit-cache-h2/BUILD b/gerrit-cache-h2/BUILD
deleted file mode 100644
index 45cf416..0000000
--- a/gerrit-cache-h2/BUILD
+++ /dev/null
@@ -1,30 +0,0 @@
-load("//tools/bzl:junit.bzl", "junit_tests")
-
-java_library(
-    name = "cache-h2",
-    srcs = glob(["src/main/java/**/*.java"]),
-    visibility = ["//visibility:public"],
-    deps = [
-        "//gerrit-common:server",
-        "//gerrit-extension-api:api",
-        "//gerrit-server:server",
-        "//lib:guava",
-        "//lib:h2",
-        "//lib/guice",
-        "//lib/jgit/org.eclipse.jgit:jgit",
-        "//lib/log:api",
-    ],
-)
-
-junit_tests(
-    name = "tests",
-    srcs = glob(["src/test/java/**/*.java"]),
-    deps = [
-        ":cache-h2",
-        "//gerrit-server:server",
-        "//lib:guava",
-        "//lib:h2",
-        "//lib:junit",
-        "//lib/guice",
-    ],
-)
diff --git a/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheBindingProxy.java b/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheBindingProxy.java
deleted file mode 100644
index 0d1cf20..0000000
--- a/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheBindingProxy.java
+++ /dev/null
@@ -1,112 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.cache.h2;
-
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.Weigher;
-import com.google.gerrit.server.cache.CacheBinding;
-import com.google.gerrit.server.cache.h2.H2CacheImpl.ValueHolder;
-import com.google.inject.TypeLiteral;
-import java.util.concurrent.TimeUnit;
-
-class H2CacheBindingProxy<K, V> implements CacheBinding<K, V> {
-  private static final String MSG_NOT_SUPPORTED =
-      "This is read-only wrapper. Modifications are not supported";
-
-  private final CacheBinding<K, V> source;
-
-  H2CacheBindingProxy(CacheBinding<K, V> source) {
-    this.source = source;
-  }
-
-  @Override
-  public Long expireAfterWrite(TimeUnit unit) {
-    return source.expireAfterWrite(unit);
-  }
-
-  @SuppressWarnings("unchecked")
-  @Override
-  public Weigher<K, V> weigher() {
-    Weigher<K, V> weigher = source.weigher();
-    if (weigher == null) {
-      return null;
-    }
-
-    // introduce weigher that performs calculations
-    // on value that is being stored not on ValueHolder
-    return (Weigher<K, V>)
-        new Weigher<K, ValueHolder<V>>() {
-          @Override
-          public int weigh(K key, ValueHolder<V> value) {
-            return weigher.weigh(key, value.value);
-          }
-        };
-  }
-
-  @Override
-  public String name() {
-    return source.name();
-  }
-
-  @Override
-  public TypeLiteral<K> keyType() {
-    return source.keyType();
-  }
-
-  @Override
-  public TypeLiteral<V> valueType() {
-    return source.valueType();
-  }
-
-  @Override
-  public long maximumWeight() {
-    return source.maximumWeight();
-  }
-
-  @Override
-  public long diskLimit() {
-    return source.diskLimit();
-  }
-
-  @Override
-  public CacheLoader<K, V> loader() {
-    return source.loader();
-  }
-
-  @Override
-  public CacheBinding<K, V> maximumWeight(long weight) {
-    throw new RuntimeException(MSG_NOT_SUPPORTED);
-  }
-
-  @Override
-  public CacheBinding<K, V> diskLimit(long limit) {
-    throw new RuntimeException(MSG_NOT_SUPPORTED);
-  }
-
-  @Override
-  public CacheBinding<K, V> expireAfterWrite(long duration, TimeUnit durationUnits) {
-    throw new RuntimeException(MSG_NOT_SUPPORTED);
-  }
-
-  @Override
-  public CacheBinding<K, V> loader(Class<? extends CacheLoader<K, V>> clazz) {
-    throw new RuntimeException(MSG_NOT_SUPPORTED);
-  }
-
-  @Override
-  public CacheBinding<K, V> weigher(Class<? extends Weigher<K, V>> clazz) {
-    throw new RuntimeException(MSG_NOT_SUPPORTED);
-  }
-}
diff --git a/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java b/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java
deleted file mode 100644
index a2c0d15..0000000
--- a/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java
+++ /dev/null
@@ -1,231 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.cache.h2;
-
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import com.google.common.util.concurrent.ThreadFactoryBuilder;
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.server.cache.CacheBinding;
-import com.google.gerrit.server.cache.MemoryCacheFactory;
-import com.google.gerrit.server.cache.PersistentCacheFactory;
-import com.google.gerrit.server.cache.h2.H2CacheImpl.SqlStore;
-import com.google.gerrit.server.cache.h2.H2CacheImpl.ValueHolder;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.plugins.Plugin;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import com.google.inject.TypeLiteral;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-class H2CacheFactory implements PersistentCacheFactory, LifecycleListener {
-  private static final Logger log = LoggerFactory.getLogger(H2CacheFactory.class);
-
-  private final MemoryCacheFactory memCacheFactory;
-  private final Config config;
-  private final Path cacheDir;
-  private final List<H2CacheImpl<?, ?>> caches;
-  private final DynamicMap<Cache<?, ?>> cacheMap;
-  private final ExecutorService executor;
-  private final ScheduledExecutorService cleanup;
-  private final long h2CacheSize;
-  private final boolean h2AutoServer;
-
-  @Inject
-  H2CacheFactory(
-      MemoryCacheFactory memCacheFactory,
-      @GerritServerConfig Config cfg,
-      SitePaths site,
-      DynamicMap<Cache<?, ?>> cacheMap) {
-    this.memCacheFactory = memCacheFactory;
-    config = cfg;
-    cacheDir = getCacheDir(site, cfg.getString("cache", null, "directory"));
-    h2CacheSize = cfg.getLong("cache", null, "h2CacheSize", -1);
-    h2AutoServer = cfg.getBoolean("cache", null, "h2AutoServer", false);
-    caches = new LinkedList<>();
-    this.cacheMap = cacheMap;
-
-    if (cacheDir != null) {
-      executor =
-          Executors.newFixedThreadPool(
-              1, new ThreadFactoryBuilder().setNameFormat("DiskCache-Store-%d").build());
-      cleanup =
-          Executors.newScheduledThreadPool(
-              1,
-              new ThreadFactoryBuilder()
-                  .setNameFormat("DiskCache-Prune-%d")
-                  .setDaemon(true)
-                  .build());
-    } else {
-      executor = null;
-      cleanup = null;
-    }
-  }
-
-  private static Path getCacheDir(SitePaths site, String name) {
-    if (name == null) {
-      return null;
-    }
-    Path loc = site.resolve(name);
-    if (!Files.exists(loc)) {
-      try {
-        Files.createDirectories(loc);
-      } catch (IOException e) {
-        log.warn("Can't create disk cache: {}", loc.toAbsolutePath());
-        return null;
-      }
-    }
-    if (!Files.isWritable(loc)) {
-      log.warn("Can't write to disk cache: {}", loc.toAbsolutePath());
-      return null;
-    }
-    log.info("Enabling disk cache {}", loc.toAbsolutePath());
-    return loc;
-  }
-
-  @Override
-  public void start() {
-    if (executor != null) {
-      for (H2CacheImpl<?, ?> cache : caches) {
-        executor.execute(cache::start);
-        @SuppressWarnings("unused")
-        Future<?> possiblyIgnoredError =
-            cleanup.schedule(() -> cache.prune(cleanup), 30, TimeUnit.SECONDS);
-      }
-    }
-  }
-
-  @Override
-  public void stop() {
-    if (executor != null) {
-      try {
-        cleanup.shutdownNow();
-
-        List<Runnable> pending = executor.shutdownNow();
-        if (executor.awaitTermination(15, TimeUnit.MINUTES)) {
-          if (pending != null && !pending.isEmpty()) {
-            log.info("Finishing {} disk cache updates", pending.size());
-            for (Runnable update : pending) {
-              update.run();
-            }
-          }
-        } else {
-          log.info("Timeout waiting for disk cache to close");
-        }
-      } catch (InterruptedException e) {
-        log.warn("Interrupted waiting for disk cache to shutdown");
-      }
-    }
-    synchronized (caches) {
-      for (H2CacheImpl<?, ?> cache : caches) {
-        cache.stop();
-      }
-    }
-  }
-
-  @SuppressWarnings({"unchecked"})
-  @Override
-  public <K, V> Cache<K, V> build(CacheBinding<K, V> in) {
-    long limit = config.getLong("cache", in.name(), "diskLimit", in.diskLimit());
-
-    if (cacheDir == null || limit <= 0) {
-      return memCacheFactory.build(in);
-    }
-
-    H2CacheBindingProxy<K, V> def = new H2CacheBindingProxy<>(in);
-    SqlStore<K, V> store =
-        newSqlStore(def.name(), def.keyType(), limit, def.expireAfterWrite(TimeUnit.SECONDS));
-    H2CacheImpl<K, V> cache =
-        new H2CacheImpl<>(
-            executor, store, def.keyType(), (Cache<K, ValueHolder<V>>) memCacheFactory.build(def));
-    synchronized (caches) {
-      caches.add(cache);
-    }
-    return cache;
-  }
-
-  @SuppressWarnings("unchecked")
-  @Override
-  public <K, V> LoadingCache<K, V> build(CacheBinding<K, V> in, CacheLoader<K, V> loader) {
-    long limit = config.getLong("cache", in.name(), "diskLimit", in.diskLimit());
-
-    if (cacheDir == null || limit <= 0) {
-      return memCacheFactory.build(in, loader);
-    }
-
-    H2CacheBindingProxy<K, V> def = new H2CacheBindingProxy<>(in);
-    SqlStore<K, V> store =
-        newSqlStore(def.name(), def.keyType(), limit, def.expireAfterWrite(TimeUnit.SECONDS));
-    Cache<K, ValueHolder<V>> mem =
-        (Cache<K, ValueHolder<V>>)
-            memCacheFactory.build(
-                def, (CacheLoader<K, V>) new H2CacheImpl.Loader<>(executor, store, loader));
-    H2CacheImpl<K, V> cache = new H2CacheImpl<>(executor, store, def.keyType(), mem);
-    synchronized (caches) {
-      caches.add(cache);
-    }
-    return cache;
-  }
-
-  @Override
-  public void onStop(Plugin plugin) {
-    synchronized (caches) {
-      for (Map.Entry<String, Provider<Cache<?, ?>>> entry :
-          cacheMap.byPlugin(plugin.getName()).entrySet()) {
-        Cache<?, ?> cache = entry.getValue().get();
-        if (caches.remove(cache)) {
-          ((H2CacheImpl<?, ?>) cache).stop();
-        }
-      }
-    }
-  }
-
-  private <V, K> SqlStore<K, V> newSqlStore(
-      String name, TypeLiteral<K> keyType, long maxSize, Long expireAfterWrite) {
-    StringBuilder url = new StringBuilder();
-    url.append("jdbc:h2:").append(cacheDir.resolve(name).toUri());
-    if (h2CacheSize >= 0) {
-      url.append(";CACHE_SIZE=");
-      // H2 CACHE_SIZE is always given in KB
-      url.append(h2CacheSize / 1024);
-    }
-    if (h2AutoServer) {
-      url.append(";AUTO_SERVER=TRUE");
-    }
-    return new SqlStore<>(
-        url.toString(),
-        keyType,
-        maxSize,
-        expireAfterWrite == null ? 0 : expireAfterWrite.longValue());
-  }
-}
diff --git a/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java b/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java
deleted file mode 100644
index eaa9af9..0000000
--- a/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java
+++ /dev/null
@@ -1,715 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.cache.h2;
-
-import com.google.common.base.Throwables;
-import com.google.common.cache.AbstractLoadingCache;
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.CacheStats;
-import com.google.common.cache.LoadingCache;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.hash.BloomFilter;
-import com.google.common.hash.Funnel;
-import com.google.common.hash.Funnels;
-import com.google.common.hash.PrimitiveSink;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.server.cache.PersistentCache;
-import com.google.inject.TypeLiteral;
-import java.io.IOException;
-import java.io.InvalidClassException;
-import java.io.ObjectOutputStream;
-import java.io.OutputStream;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.sql.Timestamp;
-import java.sql.Types;
-import java.util.Calendar;
-import java.util.Map;
-import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Executor;
-import java.util.concurrent.Future;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicLong;
-import org.h2.jdbc.JdbcSQLException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Hybrid in-memory and database backed cache built on H2.
- *
- * <p>This cache can be used as either a recall cache, or a loading cache if a CacheLoader was
- * supplied to its constructor at build time. Before creating an entry the in-memory cache is
- * checked for the item, then the database is checked, and finally the CacheLoader is used to
- * construct the item. This is mostly useful for CacheLoaders that are computationally intensive,
- * such as the PatchListCache.
- *
- * <p>Cache stores and invalidations are performed on a background thread, hiding the latency
- * associated with serializing the key and value pairs and writing them to the database log.
- *
- * <p>A BloomFilter is used around the database to reduce the number of SELECTs issued against the
- * database for new cache items that have not been seen before, a common operation for the
- * PatchListCache. The BloomFilter is sized when the cache starts to be 64,000 entries or double the
- * number of items currently in the database table.
- *
- * <p>This cache does not export its items as a ConcurrentMap.
- *
- * @see H2CacheFactory
- */
-public class H2CacheImpl<K, V> extends AbstractLoadingCache<K, V> implements PersistentCache {
-  private static final Logger log = LoggerFactory.getLogger(H2CacheImpl.class);
-
-  private static final ImmutableSet<String> OLD_CLASS_NAMES =
-      ImmutableSet.of("com.google.gerrit.server.change.ChangeKind");
-
-  private final Executor executor;
-  private final SqlStore<K, V> store;
-  private final TypeLiteral<K> keyType;
-  private final Cache<K, ValueHolder<V>> mem;
-
-  H2CacheImpl(
-      Executor executor,
-      SqlStore<K, V> store,
-      TypeLiteral<K> keyType,
-      Cache<K, ValueHolder<V>> mem) {
-    this.executor = executor;
-    this.store = store;
-    this.keyType = keyType;
-    this.mem = mem;
-  }
-
-  @Override
-  public V getIfPresent(Object objKey) {
-    if (!keyType.getRawType().isInstance(objKey)) {
-      return null;
-    }
-
-    @SuppressWarnings("unchecked")
-    K key = (K) objKey;
-
-    ValueHolder<V> h = mem.getIfPresent(key);
-    if (h != null) {
-      return h.value;
-    }
-
-    if (store.mightContain(key)) {
-      h = store.getIfPresent(key);
-      if (h != null) {
-        mem.put(key, h);
-        return h.value;
-      }
-    }
-    return null;
-  }
-
-  @Override
-  public V get(K key) throws ExecutionException {
-    if (mem instanceof LoadingCache) {
-      return ((LoadingCache<K, ValueHolder<V>>) mem).get(key).value;
-    }
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public V get(K key, Callable<? extends V> valueLoader) throws ExecutionException {
-    return mem.get(
-            key,
-            () -> {
-              if (store.mightContain(key)) {
-                ValueHolder<V> h = store.getIfPresent(key);
-                if (h != null) {
-                  return h;
-                }
-              }
-
-              ValueHolder<V> h = new ValueHolder<>(valueLoader.call());
-              h.created = TimeUtil.nowMs();
-              executor.execute(() -> store.put(key, h));
-              return h;
-            })
-        .value;
-  }
-
-  @Override
-  public void put(K key, V val) {
-    final ValueHolder<V> h = new ValueHolder<>(val);
-    h.created = TimeUtil.nowMs();
-    mem.put(key, h);
-    executor.execute(() -> store.put(key, h));
-  }
-
-  @SuppressWarnings("unchecked")
-  @Override
-  public void invalidate(Object key) {
-    if (keyType.getRawType().isInstance(key) && store.mightContain((K) key)) {
-      executor.execute(() -> store.invalidate((K) key));
-    }
-    mem.invalidate(key);
-  }
-
-  @Override
-  public void invalidateAll() {
-    store.invalidateAll();
-    mem.invalidateAll();
-  }
-
-  @Override
-  public long size() {
-    return mem.size();
-  }
-
-  @Override
-  public CacheStats stats() {
-    return mem.stats();
-  }
-
-  @Override
-  public DiskStats diskStats() {
-    return store.diskStats();
-  }
-
-  void start() {
-    store.open();
-  }
-
-  void stop() {
-    for (Map.Entry<K, ValueHolder<V>> e : mem.asMap().entrySet()) {
-      ValueHolder<V> h = e.getValue();
-      if (!h.clean) {
-        store.put(e.getKey(), h);
-      }
-    }
-    store.close();
-  }
-
-  void prune(ScheduledExecutorService service) {
-    store.prune(mem);
-
-    Calendar cal = Calendar.getInstance();
-    cal.set(Calendar.HOUR_OF_DAY, 01);
-    cal.set(Calendar.MINUTE, 0);
-    cal.set(Calendar.SECOND, 0);
-    cal.set(Calendar.MILLISECOND, 0);
-    cal.add(Calendar.DAY_OF_MONTH, 1);
-
-    long delay = cal.getTimeInMillis() - TimeUtil.nowMs();
-    @SuppressWarnings("unused")
-    Future<?> possiblyIgnoredError =
-        service.schedule(() -> prune(service), delay, TimeUnit.MILLISECONDS);
-  }
-
-  static class ValueHolder<V> {
-    final V value;
-    long created;
-    volatile boolean clean;
-
-    ValueHolder(V value) {
-      this.value = value;
-    }
-  }
-
-  static class Loader<K, V> extends CacheLoader<K, ValueHolder<V>> {
-    private final Executor executor;
-    private final SqlStore<K, V> store;
-    private final CacheLoader<K, V> loader;
-
-    Loader(Executor executor, SqlStore<K, V> store, CacheLoader<K, V> loader) {
-      this.executor = executor;
-      this.store = store;
-      this.loader = loader;
-    }
-
-    @Override
-    public ValueHolder<V> load(K key) throws Exception {
-      if (store.mightContain(key)) {
-        ValueHolder<V> h = store.getIfPresent(key);
-        if (h != null) {
-          return h;
-        }
-      }
-
-      final ValueHolder<V> h = new ValueHolder<>(loader.load(key));
-      h.created = TimeUtil.nowMs();
-      executor.execute(() -> store.put(key, h));
-      return h;
-    }
-  }
-
-  private static class KeyType<K> {
-    String columnType() {
-      return "OTHER";
-    }
-
-    @SuppressWarnings("unchecked")
-    K get(ResultSet rs, int col) throws SQLException {
-      return (K) rs.getObject(col);
-    }
-
-    void set(PreparedStatement ps, int col, K value) throws SQLException {
-      ps.setObject(col, value, Types.JAVA_OBJECT);
-    }
-
-    Funnel<K> funnel() {
-      return new Funnel<K>() {
-        private static final long serialVersionUID = 1L;
-
-        @Override
-        public void funnel(K from, PrimitiveSink into) {
-          try (ObjectOutputStream ser = new ObjectOutputStream(new SinkOutputStream(into))) {
-            ser.writeObject(from);
-            ser.flush();
-          } catch (IOException err) {
-            throw new RuntimeException("Cannot hash as Serializable", err);
-          }
-        }
-      };
-    }
-
-    @SuppressWarnings("unchecked")
-    static <K> KeyType<K> create(TypeLiteral<K> type) {
-      if (type.getRawType() == String.class) {
-        return (KeyType<K>) STRING;
-      }
-      return (KeyType<K>) OTHER;
-    }
-
-    static final KeyType<?> OTHER = new KeyType<>();
-    static final KeyType<String> STRING =
-        new KeyType<String>() {
-          @Override
-          String columnType() {
-            return "VARCHAR(4096)";
-          }
-
-          @Override
-          String get(ResultSet rs, int col) throws SQLException {
-            return rs.getString(col);
-          }
-
-          @Override
-          void set(PreparedStatement ps, int col, String value) throws SQLException {
-            ps.setString(col, value);
-          }
-
-          @SuppressWarnings("unchecked")
-          @Override
-          Funnel<String> funnel() {
-            Funnel<?> s = Funnels.unencodedCharsFunnel();
-            return (Funnel<String>) s;
-          }
-        };
-  }
-
-  static class SqlStore<K, V> {
-    private final String url;
-    private final KeyType<K> keyType;
-    private final long maxSize;
-    private final long expireAfterWrite;
-    private final BlockingQueue<SqlHandle> handles;
-    private final AtomicLong hitCount = new AtomicLong();
-    private final AtomicLong missCount = new AtomicLong();
-    private volatile BloomFilter<K> bloomFilter;
-    private int estimatedSize;
-
-    SqlStore(String jdbcUrl, TypeLiteral<K> keyType, long maxSize, long expireAfterWrite) {
-      this.url = jdbcUrl;
-      this.keyType = KeyType.create(keyType);
-      this.maxSize = maxSize;
-      this.expireAfterWrite = expireAfterWrite;
-
-      int cores = Runtime.getRuntime().availableProcessors();
-      int keep = Math.min(cores, 16);
-      this.handles = new ArrayBlockingQueue<>(keep);
-    }
-
-    synchronized void open() {
-      if (bloomFilter == null) {
-        bloomFilter = buildBloomFilter();
-      }
-    }
-
-    void close() {
-      SqlHandle h;
-      while ((h = handles.poll()) != null) {
-        h.close();
-      }
-    }
-
-    boolean mightContain(K key) {
-      BloomFilter<K> b = bloomFilter;
-      if (b == null) {
-        synchronized (this) {
-          b = bloomFilter;
-          if (b == null) {
-            b = buildBloomFilter();
-            bloomFilter = b;
-          }
-        }
-      }
-      return b == null || b.mightContain(key);
-    }
-
-    private BloomFilter<K> buildBloomFilter() {
-      SqlHandle c = null;
-      try {
-        c = acquire();
-        try (Statement s = c.conn.createStatement()) {
-          if (estimatedSize <= 0) {
-            try (ResultSet r = s.executeQuery("SELECT COUNT(*) FROM data")) {
-              estimatedSize = r.next() ? r.getInt(1) : 0;
-            }
-          }
-
-          BloomFilter<K> b = newBloomFilter();
-          try (ResultSet r = s.executeQuery("SELECT k FROM data")) {
-            while (r.next()) {
-              b.put(keyType.get(r, 1));
-            }
-          } catch (JdbcSQLException e) {
-            if (e.getCause() instanceof InvalidClassException) {
-              log.warn(
-                  "Entries cached for "
-                      + url
-                      + " have an incompatible class and can't be deserialized. "
-                      + "Cache is flushed.");
-              invalidateAll();
-            } else {
-              throw e;
-            }
-          }
-          return b;
-        }
-      } catch (SQLException e) {
-        log.warn("Cannot build BloomFilter for " + url + ": " + e.getMessage());
-        c = close(c);
-        return null;
-      } finally {
-        release(c);
-      }
-    }
-
-    ValueHolder<V> getIfPresent(K key) {
-      SqlHandle c = null;
-      try {
-        c = acquire();
-        if (c.get == null) {
-          c.get = c.conn.prepareStatement("SELECT v, created FROM data WHERE k=?");
-        }
-        keyType.set(c.get, 1, key);
-        try (ResultSet r = c.get.executeQuery()) {
-          if (!r.next()) {
-            missCount.incrementAndGet();
-            return null;
-          }
-
-          Timestamp created = r.getTimestamp(2);
-          if (expired(created)) {
-            invalidate(key);
-            missCount.incrementAndGet();
-            return null;
-          }
-
-          @SuppressWarnings("unchecked")
-          V val = (V) r.getObject(1);
-          ValueHolder<V> h = new ValueHolder<>(val);
-          h.clean = true;
-          hitCount.incrementAndGet();
-          touch(c, key);
-          return h;
-        } finally {
-          c.get.clearParameters();
-        }
-      } catch (SQLException e) {
-        if (!isOldClassNameError(e)) {
-          log.warn("Cannot read cache " + url + " for " + key, e);
-        }
-        c = close(c);
-        return null;
-      } finally {
-        release(c);
-      }
-    }
-
-    private static boolean isOldClassNameError(Throwable t) {
-      for (Throwable c : Throwables.getCausalChain(t)) {
-        if (c instanceof ClassNotFoundException && OLD_CLASS_NAMES.contains(c.getMessage())) {
-          return true;
-        }
-      }
-      return false;
-    }
-
-    private boolean expired(Timestamp created) {
-      if (expireAfterWrite == 0) {
-        return false;
-      }
-      long age = TimeUtil.nowMs() - created.getTime();
-      return 1000 * expireAfterWrite < age;
-    }
-
-    private void touch(SqlHandle c, K key) throws SQLException {
-      if (c.touch == null) {
-        c.touch = c.conn.prepareStatement("UPDATE data SET accessed=? WHERE k=?");
-      }
-      try {
-        c.touch.setTimestamp(1, TimeUtil.nowTs());
-        keyType.set(c.touch, 2, key);
-        c.touch.executeUpdate();
-      } finally {
-        c.touch.clearParameters();
-      }
-    }
-
-    void put(K key, ValueHolder<V> holder) {
-      if (holder.clean) {
-        return;
-      }
-
-      BloomFilter<K> b = bloomFilter;
-      if (b != null) {
-        b.put(key);
-        bloomFilter = b;
-      }
-
-      SqlHandle c = null;
-      try {
-        c = acquire();
-        if (c.put == null) {
-          c.put =
-              c.conn.prepareStatement("MERGE INTO data (k, v, created, accessed) VALUES(?,?,?,?)");
-        }
-        try {
-          keyType.set(c.put, 1, key);
-          c.put.setObject(2, holder.value, Types.JAVA_OBJECT);
-          c.put.setTimestamp(3, new Timestamp(holder.created));
-          c.put.setTimestamp(4, TimeUtil.nowTs());
-          c.put.executeUpdate();
-          holder.clean = true;
-        } finally {
-          c.put.clearParameters();
-        }
-      } catch (SQLException e) {
-        log.warn("Cannot put into cache " + url, e);
-        c = close(c);
-      } finally {
-        release(c);
-      }
-    }
-
-    void invalidate(K key) {
-      SqlHandle c = null;
-      try {
-        c = acquire();
-        invalidate(c, key);
-      } catch (SQLException e) {
-        log.warn("Cannot invalidate cache " + url, e);
-        c = close(c);
-      } finally {
-        release(c);
-      }
-    }
-
-    private void invalidate(SqlHandle c, K key) throws SQLException {
-      if (c.invalidate == null) {
-        c.invalidate = c.conn.prepareStatement("DELETE FROM data WHERE k=?");
-      }
-      try {
-        keyType.set(c.invalidate, 1, key);
-        c.invalidate.executeUpdate();
-      } finally {
-        c.invalidate.clearParameters();
-      }
-    }
-
-    void invalidateAll() {
-      SqlHandle c = null;
-      try {
-        c = acquire();
-        try (Statement s = c.conn.createStatement()) {
-          s.executeUpdate("DELETE FROM data");
-        }
-        bloomFilter = newBloomFilter();
-      } catch (SQLException e) {
-        log.warn("Cannot invalidate cache " + url, e);
-        c = close(c);
-      } finally {
-        release(c);
-      }
-    }
-
-    void prune(Cache<K, ?> mem) {
-      SqlHandle c = null;
-      try {
-        c = acquire();
-        try (Statement s = c.conn.createStatement()) {
-          long used = 0;
-          try (ResultSet r = s.executeQuery("SELECT SUM(space) FROM data")) {
-            used = r.next() ? r.getLong(1) : 0;
-          }
-          if (used <= maxSize) {
-            return;
-          }
-
-          try (ResultSet r =
-              s.executeQuery(
-                  "SELECT" + " k" + ",space" + ",created" + " FROM data" + " ORDER BY accessed")) {
-            while (maxSize < used && r.next()) {
-              K key = keyType.get(r, 1);
-              Timestamp created = r.getTimestamp(3);
-              if (mem.getIfPresent(key) != null && !expired(created)) {
-                touch(c, key);
-              } else {
-                invalidate(c, key);
-                used -= r.getLong(2);
-              }
-            }
-          }
-        }
-      } catch (SQLException e) {
-        log.warn("Cannot prune cache " + url, e);
-        c = close(c);
-      } finally {
-        release(c);
-      }
-    }
-
-    DiskStats diskStats() {
-      long size = 0;
-      long space = 0;
-      SqlHandle c = null;
-      try {
-        c = acquire();
-        try (Statement s = c.conn.createStatement();
-            ResultSet r = s.executeQuery("SELECT" + " COUNT(*)" + ",SUM(space)" + " FROM data")) {
-          if (r.next()) {
-            size = r.getLong(1);
-            space = r.getLong(2);
-          }
-        }
-      } catch (SQLException e) {
-        log.warn("Cannot get DiskStats for " + url, e);
-        c = close(c);
-      } finally {
-        release(c);
-      }
-      return new DiskStats(size, space, hitCount.get(), missCount.get());
-    }
-
-    private SqlHandle acquire() throws SQLException {
-      SqlHandle h = handles.poll();
-      return h != null ? h : new SqlHandle(url, keyType);
-    }
-
-    private void release(SqlHandle h) {
-      if (h != null && !handles.offer(h)) {
-        h.close();
-      }
-    }
-
-    private SqlHandle close(SqlHandle h) {
-      if (h != null) {
-        h.close();
-      }
-      return null;
-    }
-
-    private BloomFilter<K> newBloomFilter() {
-      int cnt = Math.max(64 * 1024, 2 * estimatedSize);
-      return BloomFilter.create(keyType.funnel(), cnt);
-    }
-  }
-
-  static class SqlHandle {
-    private final String url;
-    Connection conn;
-    PreparedStatement get;
-    PreparedStatement put;
-    PreparedStatement touch;
-    PreparedStatement invalidate;
-
-    SqlHandle(String url, KeyType<?> type) throws SQLException {
-      this.url = url;
-      this.conn = org.h2.Driver.load().connect(url, null);
-      try (Statement stmt = conn.createStatement()) {
-        stmt.addBatch(
-            "CREATE TABLE IF NOT EXISTS data"
-                + "(k "
-                + type.columnType()
-                + " NOT NULL PRIMARY KEY HASH"
-                + ",v OTHER NOT NULL"
-                + ",created TIMESTAMP NOT NULL"
-                + ",accessed TIMESTAMP NOT NULL"
-                + ")");
-        stmt.addBatch(
-            "ALTER TABLE data ADD COLUMN IF NOT EXISTS "
-                + "space BIGINT AS OCTET_LENGTH(k) + OCTET_LENGTH(v)");
-        stmt.executeBatch();
-      }
-    }
-
-    void close() {
-      get = closeStatement(get);
-      put = closeStatement(put);
-      touch = closeStatement(touch);
-      invalidate = closeStatement(invalidate);
-
-      if (conn != null) {
-        try {
-          conn.close();
-        } catch (SQLException e) {
-          log.warn("Cannot close connection to " + url, e);
-        } finally {
-          conn = null;
-        }
-      }
-    }
-
-    private PreparedStatement closeStatement(PreparedStatement ps) {
-      if (ps != null) {
-        try {
-          ps.close();
-        } catch (SQLException e) {
-          log.warn("Cannot close statement for " + url, e);
-        }
-      }
-      return null;
-    }
-  }
-
-  private static class SinkOutputStream extends OutputStream {
-    private final PrimitiveSink sink;
-
-    SinkOutputStream(PrimitiveSink sink) {
-      this.sink = sink;
-    }
-
-    @Override
-    public void write(int b) {
-      sink.putByte((byte) b);
-    }
-
-    @Override
-    public void write(byte[] b, int p, int n) {
-      sink.putBytes(b, p, n);
-    }
-  }
-}
diff --git a/gerrit-cache-h2/src/test/java/com/google/gerrit/server/cache/h2/H2CacheTest.java b/gerrit-cache-h2/src/test/java/com/google/gerrit/server/cache/h2/H2CacheTest.java
deleted file mode 100644
index 80bca6d..0000000
--- a/gerrit-cache-h2/src/test/java/com/google/gerrit/server/cache/h2/H2CacheTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.cache.h2;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.util.concurrent.MoreExecutors;
-import com.google.gerrit.server.cache.h2.H2CacheImpl.SqlStore;
-import com.google.gerrit.server.cache.h2.H2CacheImpl.ValueHolder;
-import com.google.inject.TypeLiteral;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.atomic.AtomicBoolean;
-import org.junit.Before;
-import org.junit.Test;
-
-public class H2CacheTest {
-  private static int dbCnt;
-
-  private Cache<String, ValueHolder<Boolean>> mem;
-  private H2CacheImpl<String, Boolean> impl;
-
-  @Before
-  public void setUp() {
-    mem = CacheBuilder.newBuilder().build();
-
-    TypeLiteral<String> keyType = new TypeLiteral<String>() {};
-    SqlStore<String, Boolean> store =
-        new SqlStore<>("jdbc:h2:mem:Test_" + (++dbCnt), keyType, 1 << 20, 0);
-    impl = new H2CacheImpl<>(MoreExecutors.directExecutor(), store, keyType, mem);
-  }
-
-  @Test
-  public void get() throws ExecutionException {
-    assertNull(impl.getIfPresent("foo"));
-
-    final AtomicBoolean called = new AtomicBoolean();
-    assertTrue(
-        impl.get(
-            "foo",
-            () -> {
-              called.set(true);
-              return true;
-            }));
-    assertTrue("used Callable", called.get());
-    assertTrue("exists in cache", impl.getIfPresent("foo"));
-    mem.invalidate("foo");
-    assertTrue("exists on disk", impl.getIfPresent("foo"));
-
-    called.set(false);
-    assertTrue(
-        impl.get(
-            "foo",
-            () -> {
-              called.set(true);
-              return true;
-            }));
-    assertFalse("did not invoke Callable", called.get());
-  }
-}
diff --git a/gerrit-cache-mem/BUILD b/gerrit-cache-mem/BUILD
deleted file mode 100644
index 85e027a..0000000
--- a/gerrit-cache-mem/BUILD
+++ /dev/null
@@ -1,12 +0,0 @@
-java_library(
-    name = "mem",
-    srcs = glob(["src/main/java/**/*.java"]),
-    visibility = ["//visibility:public"],
-    deps = [
-        "//gerrit-extension-api:api",
-        "//gerrit-server:server",
-        "//lib:guava",
-        "//lib/guice",
-        "//lib/jgit/org.eclipse.jgit:jgit",
-    ],
-)
diff --git a/gerrit-cache-mem/src/main/java/com/google/gerrit/server/cache/mem/DefaultMemoryCacheFactory.java b/gerrit-cache-mem/src/main/java/com/google/gerrit/server/cache/mem/DefaultMemoryCacheFactory.java
deleted file mode 100644
index 8091e16..0000000
--- a/gerrit-cache-mem/src/main/java/com/google/gerrit/server/cache/mem/DefaultMemoryCacheFactory.java
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.cache.mem;
-
-import com.google.common.base.Strings;
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import com.google.common.cache.Weigher;
-import com.google.gerrit.server.cache.CacheBinding;
-import com.google.gerrit.server.cache.ForwardingRemovalListener;
-import com.google.gerrit.server.cache.MemoryCacheFactory;
-import com.google.gerrit.server.config.ConfigUtil;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.inject.Inject;
-import java.util.concurrent.TimeUnit;
-import org.eclipse.jgit.lib.Config;
-
-public class DefaultMemoryCacheFactory implements MemoryCacheFactory {
-  private final Config cfg;
-  private final ForwardingRemovalListener.Factory forwardingRemovalListenerFactory;
-
-  @Inject
-  DefaultMemoryCacheFactory(
-      @GerritServerConfig Config config,
-      ForwardingRemovalListener.Factory forwardingRemovalListenerFactory) {
-    this.cfg = config;
-    this.forwardingRemovalListenerFactory = forwardingRemovalListenerFactory;
-  }
-
-  @Override
-  public <K, V> Cache<K, V> build(CacheBinding<K, V> def) {
-    return create(def).build();
-  }
-
-  @Override
-  public <K, V> LoadingCache<K, V> build(CacheBinding<K, V> def, CacheLoader<K, V> loader) {
-    return create(def).build(loader);
-  }
-
-  @SuppressWarnings("unchecked")
-  private <K, V> CacheBuilder<K, V> create(CacheBinding<K, V> def) {
-    CacheBuilder<K, V> builder = newCacheBuilder();
-    builder.recordStats();
-    builder.maximumWeight(cfg.getLong("cache", def.name(), "memoryLimit", def.maximumWeight()));
-
-    builder = builder.removalListener(forwardingRemovalListenerFactory.create(def.name()));
-
-    Weigher<K, V> weigher = def.weigher();
-    if (weigher == null) {
-      weigher = unitWeight();
-    }
-    builder.weigher(weigher);
-
-    Long age = def.expireAfterWrite(TimeUnit.SECONDS);
-    if (has(def.name(), "maxAge")) {
-      builder.expireAfterWrite(
-          ConfigUtil.getTimeUnit(
-              cfg, "cache", def.name(), "maxAge", age != null ? age : 0, TimeUnit.SECONDS),
-          TimeUnit.SECONDS);
-    } else if (age != null) {
-      builder.expireAfterWrite(age, TimeUnit.SECONDS);
-    }
-
-    return builder;
-  }
-
-  private boolean has(String name, String var) {
-    return !Strings.isNullOrEmpty(cfg.getString("cache", name, var));
-  }
-
-  @SuppressWarnings("unchecked")
-  private static <K, V> CacheBuilder<K, V> newCacheBuilder() {
-    return (CacheBuilder<K, V>) CacheBuilder.newBuilder();
-  }
-
-  private static <K, V> Weigher<K, V> unitWeight() {
-    return new Weigher<K, V>() {
-      @Override
-      public int weigh(K key, V value) {
-        return 1;
-      }
-    };
-  }
-}
diff --git a/gerrit-common/BUILD b/gerrit-common/BUILD
deleted file mode 100644
index 6432060..0000000
--- a/gerrit-common/BUILD
+++ /dev/null
@@ -1,87 +0,0 @@
-load("//tools/bzl:gwt.bzl", "gwt_module")
-load("//tools/bzl:junit.bzl", "junit_tests")
-
-SRC = "src/main/java/com/google/gerrit/"
-
-ANNOTATIONS = [
-    SRC + x
-    for x in [
-        "common/Nullable.java",
-        "common/audit/Audit.java",
-        "common/auth/SignInRequired.java",
-    ]
-]
-
-java_library(
-    name = "annotations",
-    srcs = ANNOTATIONS,
-    visibility = ["//visibility:public"],
-)
-
-gwt_module(
-    name = "client",
-    srcs = glob([SRC + "common/**/*.java"]),
-    exported_deps = [
-        "//gerrit-extension-api:api",
-        "//gerrit-prettify:client",
-        "//lib:guava",
-        "//lib:gwtorm-client",
-        "//lib:servlet-api-3_1",
-        "//lib/jgit/org.eclipse.jgit:jgit",
-        "//lib/joda:joda-time",
-        "//lib/log:api",
-    ],
-    gwt_xml = SRC + "Common.gwt.xml",
-    visibility = ["//visibility:public"],
-)
-
-java_library(
-    name = "server",
-    srcs = glob(
-        [SRC + "common/**/*.java"],
-        exclude = ANNOTATIONS,
-    ),
-    visibility = ["//visibility:public"],
-    deps = [
-        ":annotations",
-        "//gerrit-extension-api:api",
-        "//gerrit-patch-jgit:server",
-        "//gerrit-prettify:server",
-        "//gerrit-reviewdb:server",
-        "//lib:guava",
-        "//lib:gwtjsonrpc",
-        "//lib:gwtorm",
-        "//lib:servlet-api-3_1",
-        "//lib/jgit/org.eclipse.jgit:jgit",
-        "//lib/joda:joda-time",
-        "//lib/log:api",
-    ],
-)
-
-TEST = "src/test/java/com/google/gerrit/common/"
-
-AUTO_VALUE_TEST_SRCS = [TEST + "AutoValueTest.java"]
-
-junit_tests(
-    name = "client_tests",
-    srcs = glob(
-        ["src/test/java/**/*.java"],
-        exclude = AUTO_VALUE_TEST_SRCS,
-    ),
-    deps = [
-        ":client",
-        "//lib:guava",
-        "//lib:junit",
-        "//lib:truth",
-    ],
-)
-
-junit_tests(
-    name = "auto_value_tests",
-    srcs = AUTO_VALUE_TEST_SRCS,
-    deps = [
-        "//lib:truth",
-        "//lib/auto:auto-value",
-        "//lib/auto:auto-value-annotations",
-    ],
-)
diff --git a/gerrit-common/src/main/java/com/google/gerrit/Common.gwt.xml b/gerrit-common/src/main/java/com/google/gerrit/Common.gwt.xml
deleted file mode 100644
index 80bd2cb..0000000
--- a/gerrit-common/src/main/java/com/google/gerrit/Common.gwt.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<!--
- Copyright (C) 2009 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.
--->
-<module>
-  <inherits name='com.google.gerrit.reviewdb.ReviewDB' />
-  <inherits name='com.google.gwtjsonrpc.GWTJSONRPC'/>
-  <inherits name="com.google.gwt.logging.Logging"/>
-  <source path='common' />
-</module>
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/ProjectUtil.java b/gerrit-common/src/main/java/com/google/gerrit/common/ProjectUtil.java
deleted file mode 100644
index bfd5ef9..0000000
--- a/gerrit-common/src/main/java/com/google/gerrit/common/ProjectUtil.java
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.common;
-
-public class ProjectUtil {
-  public static String stripGitSuffix(String name) {
-    if (name.endsWith(".git")) {
-      // Be nice and drop the trailing ".git" suffix, which we never keep
-      // in our database, but clients might mistakenly provide anyway.
-      //
-      name = name.substring(0, name.length() - 4);
-      while (name.endsWith("/")) {
-        name = name.substring(0, name.length() - 1);
-      }
-    }
-    return name;
-  }
-
-  private ProjectUtil() {}
-}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/RawInputUtil.java b/gerrit-common/src/main/java/com/google/gerrit/common/RawInputUtil.java
deleted file mode 100644
index f59d4a9..0000000
--- a/gerrit-common/src/main/java/com/google/gerrit/common/RawInputUtil.java
+++ /dev/null
@@ -1,76 +0,0 @@
-// 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.
-
-package com.google.gerrit.common;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.annotations.GwtIncompatible;
-import com.google.common.base.Preconditions;
-import com.google.gerrit.extensions.restapi.RawInput;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import javax.servlet.http.HttpServletRequest;
-
-@GwtIncompatible("Unemulated classes in java.io and javax.servlet")
-public class RawInputUtil {
-  public static RawInput create(String content) {
-    return create(content.getBytes(UTF_8));
-  }
-
-  public static RawInput create(byte[] bytes, String contentType) {
-    Preconditions.checkNotNull(bytes);
-    Preconditions.checkArgument(bytes.length > 0);
-    return new RawInput() {
-      @Override
-      public InputStream getInputStream() throws IOException {
-        return new ByteArrayInputStream(bytes);
-      }
-
-      @Override
-      public String getContentType() {
-        return contentType;
-      }
-
-      @Override
-      public long getContentLength() {
-        return bytes.length;
-      }
-    };
-  }
-
-  public static RawInput create(byte[] bytes) {
-    return create(bytes, "application/octet-stream");
-  }
-
-  public static RawInput create(HttpServletRequest req) {
-    return new RawInput() {
-      @Override
-      public String getContentType() {
-        return req.getContentType();
-      }
-
-      @Override
-      public long getContentLength() {
-        return req.getContentLength();
-      }
-
-      @Override
-      public InputStream getInputStream() throws IOException {
-        return req.getInputStream();
-      }
-    };
-  }
-}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/SiteLibraryLoaderUtil.java b/gerrit-common/src/main/java/com/google/gerrit/common/SiteLibraryLoaderUtil.java
deleted file mode 100644
index e8fa896..0000000
--- a/gerrit-common/src/main/java/com/google/gerrit/common/SiteLibraryLoaderUtil.java
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.common;
-
-import static com.google.gerrit.common.FileUtil.lastModified;
-import static java.util.stream.Collectors.joining;
-
-import com.google.common.annotations.GwtIncompatible;
-import com.google.common.collect.ComparisonChain;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Ordering;
-import java.io.IOException;
-import java.nio.file.DirectoryStream;
-import java.nio.file.Files;
-import java.nio.file.NoSuchFileException;
-import java.nio.file.Path;
-import java.util.List;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@GwtIncompatible("Unemulated classes in java.nio and Guava")
-public final class SiteLibraryLoaderUtil {
-  private static final Logger log = LoggerFactory.getLogger(SiteLibraryLoaderUtil.class);
-
-  public static void loadSiteLib(Path libdir) {
-    try {
-      List<Path> jars = listJars(libdir);
-      IoUtil.loadJARs(jars);
-      log.debug("Loaded site libraries: {}", jarList(jars));
-    } catch (IOException e) {
-      log.error("Error scanning lib directory " + libdir, e);
-    }
-  }
-
-  private static String jarList(List<Path> jars) {
-    return jars.stream().map(p -> p.getFileName().toString()).collect(joining(","));
-  }
-
-  public static List<Path> listJars(Path dir) throws IOException {
-    DirectoryStream.Filter<Path> filter =
-        new DirectoryStream.Filter<Path>() {
-          @Override
-          public boolean accept(Path entry) throws IOException {
-            String name = entry.getFileName().toString();
-            return (name.endsWith(".jar") || name.endsWith(".zip")) && Files.isRegularFile(entry);
-          }
-        };
-    try (DirectoryStream<Path> jars = Files.newDirectoryStream(dir, filter)) {
-      return new Ordering<Path>() {
-        @Override
-        public int compare(Path a, Path b) {
-          // Sort by reverse last-modified time so newer JARs are first.
-          return ComparisonChain.start()
-              .compare(lastModified(b), lastModified(a))
-              .compare(a, b)
-              .result();
-        }
-      }.sortedCopy(jars);
-    } catch (NoSuchFileException nsfe) {
-      return ImmutableList.of();
-    }
-  }
-
-  private SiteLibraryLoaderUtil() {}
-}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/TimeUtil.java b/gerrit-common/src/main/java/com/google/gerrit/common/TimeUtil.java
deleted file mode 100644
index a8e40c6..0000000
--- a/gerrit-common/src/main/java/com/google/gerrit/common/TimeUtil.java
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.common;
-
-import com.google.common.annotations.GwtIncompatible;
-import java.sql.Timestamp;
-import org.joda.time.DateTimeUtils;
-
-/** Static utility methods for dealing with dates and times. */
-@GwtIncompatible("Unemulated org.joda.time.DateTimeUtils")
-public class TimeUtil {
-  public static long nowMs() {
-    return DateTimeUtils.currentTimeMillis();
-  }
-
-  public static Timestamp nowTs() {
-    return new Timestamp(nowMs());
-  }
-
-  public static Timestamp roundToSecond(Timestamp t) {
-    return new Timestamp((t.getTime() / 1000) * 1000);
-  }
-
-  private TimeUtil() {}
-}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/audit/Audit.java b/gerrit-common/src/main/java/com/google/gerrit/common/audit/Audit.java
deleted file mode 100644
index 25e4caf..0000000
--- a/gerrit-common/src/main/java/com/google/gerrit/common/audit/Audit.java
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.common.audit;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Audit annotation for JSON/RPC interfaces.
- *
- * <p>Flag with @Audit all the JSON/RPC methods to be traced in audit-trail and submitted to the
- * AuditService.
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target({ElementType.METHOD})
-public @interface Audit {
-  String action() default "";
-
-  /** List of positions of parameters to be obfuscated in audit-trail (i.e. passwords) */
-  int[] obfuscate() default {};
-}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/AccessSection.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/AccessSection.java
deleted file mode 100644
index cfecd78..0000000
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/AccessSection.java
+++ /dev/null
@@ -1,131 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.common.data;
-
-import com.google.gerrit.reviewdb.client.Project;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-/** Portion of a {@link Project} describing access rules. */
-public class AccessSection extends RefConfigSection implements Comparable<AccessSection> {
-  /** Special name given to the global capabilities; not a valid reference. */
-  public static final String GLOBAL_CAPABILITIES = "GLOBAL_CAPABILITIES";
-
-  protected List<Permission> permissions;
-
-  protected AccessSection() {}
-
-  public AccessSection(String refPattern) {
-    super(refPattern);
-  }
-
-  public List<Permission> getPermissions() {
-    if (permissions == null) {
-      permissions = new ArrayList<>();
-    }
-    return permissions;
-  }
-
-  public void setPermissions(List<Permission> list) {
-    Set<String> names = new HashSet<>();
-    for (Permission p : list) {
-      if (!names.add(p.getName().toLowerCase())) {
-        throw new IllegalArgumentException();
-      }
-    }
-
-    permissions = list;
-  }
-
-  public Permission getPermission(String name) {
-    return getPermission(name, false);
-  }
-
-  public Permission getPermission(String name, boolean create) {
-    for (Permission p : getPermissions()) {
-      if (p.getName().equalsIgnoreCase(name)) {
-        return p;
-      }
-    }
-
-    if (create) {
-      Permission p = new Permission(name);
-      permissions.add(p);
-      return p;
-    }
-
-    return null;
-  }
-
-  public void addPermission(Permission p) {
-    getPermissions().add(p);
-  }
-
-  public void remove(Permission permission) {
-    if (permission != null) {
-      removePermission(permission.getName());
-    }
-  }
-
-  public void removePermission(String name) {
-    if (permissions != null) {
-      for (Iterator<Permission> itr = permissions.iterator(); itr.hasNext(); ) {
-        if (name.equalsIgnoreCase(itr.next().getName())) {
-          itr.remove();
-        }
-      }
-    }
-  }
-
-  public void mergeFrom(AccessSection section) {
-    for (Permission src : section.getPermissions()) {
-      Permission dst = getPermission(src.getName());
-      if (dst != null) {
-        dst.mergeFrom(src);
-      } else {
-        permissions.add(src);
-      }
-    }
-  }
-
-  @Override
-  public int compareTo(AccessSection o) {
-    return comparePattern().compareTo(o.comparePattern());
-  }
-
-  private String comparePattern() {
-    if (getName().startsWith(REGEX_PREFIX)) {
-      return getName().substring(REGEX_PREFIX.length());
-    }
-    return getName();
-  }
-
-  @Override
-  public String toString() {
-    return "AccessSection[" + getName() + "]";
-  }
-
-  @Override
-  public boolean equals(Object obj) {
-    if (!super.equals(obj) || !(obj instanceof AccessSection)) {
-      return false;
-    }
-    return new HashSet<>(getPermissions())
-        .equals(new HashSet<>(((AccessSection) obj).getPermissions()));
-  }
-}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/AccountInfo.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/AccountInfo.java
deleted file mode 100644
index 788a26d..0000000
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/AccountInfo.java
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.common.data;
-
-import com.google.gerrit.reviewdb.client.Account;
-
-/** Summary information about an {@link Account}, for simple tabular displays. */
-public class AccountInfo {
-  protected Account.Id id;
-  protected String fullName;
-  protected String preferredEmail;
-  protected String username;
-
-  protected AccountInfo() {}
-
-  /**
-   * Create an 'Anonymous Coward' account info, when only the id is known.
-   *
-   * <p>This constructor should only be a last-ditch effort, when the usual account lookup has
-   * failed and a stale account id has been discovered in the data store.
-   */
-  public AccountInfo(Account.Id id) {
-    this.id = id;
-  }
-
-  /**
-   * Create an account description from a real data store record.
-   *
-   * @param a the data store record holding the specific account details.
-   */
-  public AccountInfo(Account a) {
-    id = a.getId();
-    fullName = a.getFullName();
-    preferredEmail = a.getPreferredEmail();
-    username = a.getUserName();
-  }
-
-  /** @return the unique local id of the account */
-  public Account.Id getId() {
-    return id;
-  }
-
-  public void setFullName(String n) {
-    fullName = n;
-  }
-
-  /** @return the full name of the account holder; null if not supplied */
-  public String getFullName() {
-    return fullName;
-  }
-
-  /** @return the email address of the account holder; null if not supplied */
-  public String getPreferredEmail() {
-    return preferredEmail;
-  }
-
-  public void setPreferredEmail(String email) {
-    preferredEmail = email;
-  }
-
-  /** @return the username of the account holder */
-  public String getUsername() {
-    return username;
-  }
-}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/AgreementInfo.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/AgreementInfo.java
deleted file mode 100644
index 4fb4053..0000000
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/AgreementInfo.java
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.common.data;
-
-import java.util.List;
-import java.util.Map;
-
-public class AgreementInfo {
-  public List<String> accepted;
-  public Map<String, ContributorAgreement> agreements;
-
-  public AgreementInfo() {}
-
-  public void setAccepted(List<String> a) {
-    accepted = a;
-  }
-
-  public void setAgreements(Map<String, ContributorAgreement> a) {
-    agreements = a;
-  }
-}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/GlobalCapability.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/GlobalCapability.java
deleted file mode 100644
index 6fd0e77..0000000
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/GlobalCapability.java
+++ /dev/null
@@ -1,193 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.common.data;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-/** Server wide capabilities. Represented as {@link Permission} objects. */
-public class GlobalCapability {
-  /** Ability to access the database (with gsql). */
-  public static final String ACCESS_DATABASE = "accessDatabase";
-
-  /**
-   * Denotes the server's administrators.
-   *
-   * <p>This is similar to UNIX root, or Windows SYSTEM account. Any user that has this capability
-   * can perform almost any other action, or can grant themselves the power to perform any other
-   * action on the site. Most of the other capabilities and permissions fall-back to the predicate
-   * "OR user has capability ADMINISTRATE_SERVER".
-   */
-  public static final String ADMINISTRATE_SERVER = "administrateServer";
-
-  /** Maximum number of changes that may be pushed in a batch. */
-  public static final String BATCH_CHANGES_LIMIT = "batchChangesLimit";
-
-  /**
-   * Default maximum number of changes that may be pushed in a batch, 0 means no limit. This is just
-   * used as a suggestion for prepopulating the field in the access UI.
-   */
-  public static final int DEFAULT_MAX_BATCH_CHANGES_LIMIT = 0;
-
-  /** Can create any account on the server. */
-  public static final String CREATE_ACCOUNT = "createAccount";
-
-  /** Can create any group on the server. */
-  public static final String CREATE_GROUP = "createGroup";
-
-  /** Can create any project on the server. */
-  public static final String CREATE_PROJECT = "createProject";
-
-  /**
-   * Denotes who may email change reviewers and watchers.
-   *
-   * <p>This can be used to deny build bots from emailing reviewers and people who watch the change.
-   * Instead, only the authors of the change and those who starred it will be emailed. The allow
-   * rules are evaluated before deny rules, however the default is to allow emailing, if no explicit
-   * rule is matched.
-   */
-  public static final String EMAIL_REVIEWERS = "emailReviewers";
-
-  /** Can flush any cache except the active web_sessions cache. */
-  public static final String FLUSH_CACHES = "flushCaches";
-
-  /** Can terminate any task using the kill command. */
-  public static final String KILL_TASK = "killTask";
-
-  /**
-   * Can perform limited server maintenance.
-   *
-   * <p>Includes tasks such as reindexing changes and flushing caches that may need to be performed
-   * regularly. Does <strong>not</strong> grant arbitrary read/write/ACL management permissions as
-   * does {@link #ADMINISTRATE_SERVER}.
-   */
-  public static final String MAINTAIN_SERVER = "maintainServer";
-
-  /** Can modify any account on the server. */
-  public static final String MODIFY_ACCOUNT = "modifyAccount";
-
-  /** Queue a user can access to submit their tasks to. */
-  public static final String PRIORITY = "priority";
-
-  /** Maximum result limit per executed query. */
-  public static final String QUERY_LIMIT = "queryLimit";
-
-  /** Default result limit per executed query. */
-  public static final int DEFAULT_MAX_QUERY_LIMIT = 500;
-
-  /** Ability to impersonate another user. */
-  public static final String RUN_AS = "runAs";
-
-  /** Can run the Git garbage collection. */
-  public static final String RUN_GC = "runGC";
-
-  /** Can perform streaming of Gerrit events. */
-  public static final String STREAM_EVENTS = "streamEvents";
-
-  /** Can view all accounts, regardless of {@code accounts.visibility}. */
-  public static final String VIEW_ALL_ACCOUNTS = "viewAllAccounts";
-
-  /** Can view the server's current cache states. */
-  public static final String VIEW_CACHES = "viewCaches";
-
-  /** Can view open connections to the server's SSH port. */
-  public static final String VIEW_CONNECTIONS = "viewConnections";
-
-  /** Can view all installed plugins. */
-  public static final String VIEW_PLUGINS = "viewPlugins";
-
-  /** Can view all pending tasks in the queue (not just the filtered set). */
-  public static final String VIEW_QUEUE = "viewQueue";
-
-  private static final List<String> NAMES_ALL;
-  private static final List<String> NAMES_LC;
-  private static final String[] RANGE_NAMES = {
-    QUERY_LIMIT, BATCH_CHANGES_LIMIT,
-  };
-
-  static {
-    NAMES_ALL = new ArrayList<>();
-    NAMES_ALL.add(ACCESS_DATABASE);
-    NAMES_ALL.add(ADMINISTRATE_SERVER);
-    NAMES_ALL.add(BATCH_CHANGES_LIMIT);
-    NAMES_ALL.add(CREATE_ACCOUNT);
-    NAMES_ALL.add(CREATE_GROUP);
-    NAMES_ALL.add(CREATE_PROJECT);
-    NAMES_ALL.add(EMAIL_REVIEWERS);
-    NAMES_ALL.add(FLUSH_CACHES);
-    NAMES_ALL.add(KILL_TASK);
-    NAMES_ALL.add(MAINTAIN_SERVER);
-    NAMES_ALL.add(MODIFY_ACCOUNT);
-    NAMES_ALL.add(PRIORITY);
-    NAMES_ALL.add(QUERY_LIMIT);
-    NAMES_ALL.add(RUN_AS);
-    NAMES_ALL.add(RUN_GC);
-    NAMES_ALL.add(STREAM_EVENTS);
-    NAMES_ALL.add(VIEW_ALL_ACCOUNTS);
-    NAMES_ALL.add(VIEW_CACHES);
-    NAMES_ALL.add(VIEW_CONNECTIONS);
-    NAMES_ALL.add(VIEW_PLUGINS);
-    NAMES_ALL.add(VIEW_QUEUE);
-
-    NAMES_LC = new ArrayList<>(NAMES_ALL.size());
-    for (String name : NAMES_ALL) {
-      NAMES_LC.add(name.toLowerCase());
-    }
-  }
-
-  /** @return all valid capability names. */
-  public static Collection<String> getAllNames() {
-    return Collections.unmodifiableList(NAMES_ALL);
-  }
-
-  /** @return true if the name is recognized as a capability name. */
-  public static boolean isCapability(String varName) {
-    return NAMES_LC.contains(varName.toLowerCase());
-  }
-
-  /** @return true if the capability should have a range attached. */
-  public static boolean hasRange(String varName) {
-    for (String n : RANGE_NAMES) {
-      if (n.equalsIgnoreCase(varName)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  public static List<String> getRangeNames() {
-    return Collections.unmodifiableList(Arrays.asList(RANGE_NAMES));
-  }
-
-  /** @return the valid range for the capability if it has one, otherwise null. */
-  public static PermissionRange.WithDefaults getRange(String varName) {
-    if (QUERY_LIMIT.equalsIgnoreCase(varName)) {
-      return new PermissionRange.WithDefaults(
-          varName, 0, Integer.MAX_VALUE, 0, DEFAULT_MAX_QUERY_LIMIT);
-    }
-    if (BATCH_CHANGES_LIMIT.equalsIgnoreCase(varName)) {
-      return new PermissionRange.WithDefaults(
-          varName, 0, Integer.MAX_VALUE, 0, DEFAULT_MAX_BATCH_CHANGES_LIMIT);
-    }
-    return null;
-  }
-
-  private GlobalCapability() {
-    // Utility class, do not create instances.
-  }
-}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/GroupDescription.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/GroupDescription.java
deleted file mode 100644
index c915cb9..0000000
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/GroupDescription.java
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.common.data;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import java.sql.Timestamp;
-
-/** Group methods exposed by the GroupBackend. */
-public class GroupDescription {
-  /** The Basic information required to be exposed by any Group. */
-  public interface Basic {
-    /** @return the non-null UUID of the group. */
-    AccountGroup.UUID getGroupUUID();
-
-    /** @return the non-null name of the group. */
-    String getName();
-
-    /**
-     * @return optional email address to send to the group's members. If provided, Gerrit will use
-     *     this email address to send change notifications to the group.
-     */
-    @Nullable
-    String getEmailAddress();
-
-    /**
-     * @return optional URL to information about the group. Typically a URL to a web page that
-     *     permits users to apply to join the group, or manage their membership.
-     */
-    @Nullable
-    String getUrl();
-  }
-
-  /** The extended information exposed by internal groups. */
-  public interface Internal extends Basic {
-
-    AccountGroup.Id getId();
-
-    @Nullable
-    String getDescription();
-
-    AccountGroup.UUID getOwnerGroupUUID();
-
-    boolean isVisibleToAll();
-
-    Timestamp getCreatedOn();
-  }
-
-  private GroupDescription() {}
-}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/GroupDescriptions.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/GroupDescriptions.java
deleted file mode 100644
index 25493e8..0000000
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/GroupDescriptions.java
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.common.data;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.PageLinks;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import java.sql.Timestamp;
-
-/** Utility class for building GroupDescription objects. */
-public class GroupDescriptions {
-
-  public static GroupDescription.Internal forAccountGroup(AccountGroup group) {
-    return new GroupDescription.Internal() {
-      @Override
-      public AccountGroup.UUID getGroupUUID() {
-        return group.getGroupUUID();
-      }
-
-      @Override
-      public String getName() {
-        return group.getName();
-      }
-
-      @Override
-      @Nullable
-      public String getEmailAddress() {
-        return null;
-      }
-
-      @Override
-      public String getUrl() {
-        return "#" + PageLinks.toGroup(getGroupUUID());
-      }
-
-      @Override
-      public AccountGroup.Id getId() {
-        return group.getId();
-      }
-
-      @Override
-      @Nullable
-      public String getDescription() {
-        return group.getDescription();
-      }
-
-      @Override
-      public AccountGroup.UUID getOwnerGroupUUID() {
-        return group.getOwnerGroupUUID();
-      }
-
-      @Override
-      public boolean isVisibleToAll() {
-        return group.isVisibleToAll();
-      }
-
-      @Override
-      public Timestamp getCreatedOn() {
-        return group.getCreatedOn();
-      }
-    };
-  }
-
-  private GroupDescriptions() {}
-}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/GroupReference.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/GroupReference.java
deleted file mode 100644
index dc22d62..0000000
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/GroupReference.java
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.common.data;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-
-/** Describes a group within a projects {@link AccessSection}s. */
-public class GroupReference implements Comparable<GroupReference> {
-
-  private static final String PREFIX = "group ";
-
-  /** @return a new reference to the given group description. */
-  public static GroupReference forGroup(AccountGroup group) {
-    return new GroupReference(group.getGroupUUID(), group.getName());
-  }
-
-  public static GroupReference forGroup(GroupDescription.Basic group) {
-    return new GroupReference(group.getGroupUUID(), group.getName());
-  }
-
-  public static boolean isGroupReference(String configValue) {
-    return configValue != null && configValue.startsWith(PREFIX);
-  }
-
-  @Nullable
-  public static String extractGroupName(String configValue) {
-    if (!isGroupReference(configValue)) {
-      return null;
-    }
-    return configValue.substring(PREFIX.length()).trim();
-  }
-
-  protected String uuid;
-  protected String name;
-
-  protected GroupReference() {}
-
-  public GroupReference(AccountGroup.UUID uuid, String name) {
-    setUUID(uuid);
-    setName(name);
-  }
-
-  public AccountGroup.UUID getUUID() {
-    return uuid != null ? new AccountGroup.UUID(uuid) : null;
-  }
-
-  public void setUUID(AccountGroup.UUID newUUID) {
-    uuid = newUUID != null ? newUUID.get() : null;
-  }
-
-  public String getName() {
-    return name;
-  }
-
-  public void setName(String newName) {
-    this.name = newName;
-  }
-
-  @Override
-  public int compareTo(GroupReference o) {
-    return uuid(this).compareTo(uuid(o));
-  }
-
-  private static String uuid(GroupReference a) {
-    return a.getUUID() != null ? a.getUUID().get() : "?";
-  }
-
-  @Override
-  public int hashCode() {
-    return uuid(this).hashCode();
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    return o instanceof GroupReference && compareTo((GroupReference) o) == 0;
-  }
-
-  public String toConfigValue() {
-    return PREFIX + name;
-  }
-
-  @Override
-  public String toString() {
-    return "Group[" + getName() + " / " + getUUID() + "]";
-  }
-}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelFunction.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelFunction.java
deleted file mode 100644
index 0ce2c29..0000000
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelFunction.java
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.common.data;
-
-import com.google.gerrit.common.Nullable;
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Optional;
-
-/**
- * Functions for determining submittability based on label votes.
- *
- * <p>Only describes built-in label functions. Admins can extend the logic arbitrarily using Prolog
- * rules, in which case the choice of function in the project config is ignored.
- *
- * <p>Function semantics are documented in {@code config-labels.txt}, and actual behavior is
- * implemented in Prolog in {@code gerrit_common.pl}.
- */
-public enum LabelFunction {
-  MAX_WITH_BLOCK("MaxWithBlock", true),
-  ANY_WITH_BLOCK("AnyWithBlock", true),
-  MAX_NO_BLOCK("MaxNoBlock", false),
-  NO_BLOCK("NoBlock", false),
-  NO_OP("NoOp", false),
-  PATCH_SET_LOCK("PatchSetLock", false);
-
-  public static final Map<String, LabelFunction> ALL;
-
-  static {
-    Map<String, LabelFunction> all = new LinkedHashMap<>();
-    for (LabelFunction f : values()) {
-      all.put(f.getFunctionName(), f);
-    }
-    ALL = Collections.unmodifiableMap(all);
-  }
-
-  public static Optional<LabelFunction> parse(@Nullable String str) {
-    return Optional.ofNullable(ALL.get(str));
-  }
-
-  private final String name;
-  private final boolean isBlock;
-
-  private LabelFunction(String name, boolean isBlock) {
-    this.name = name;
-    this.isBlock = isBlock;
-  }
-
-  /** The function name as defined in documentation and {@code project.config}. */
-  public String getFunctionName() {
-    return name;
-  }
-
-  /** Whether the label is a "block" label, meaning a minimum vote will prevent submission. */
-  public boolean isBlock() {
-    return isBlock;
-  }
-}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelType.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelType.java
deleted file mode 100644
index 7bfd22e..0000000
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelType.java
+++ /dev/null
@@ -1,336 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.common.data;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.reviewdb.client.LabelId;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-
-public class LabelType {
-  public static final boolean DEF_ALLOW_POST_SUBMIT = true;
-  public static final boolean DEF_CAN_OVERRIDE = true;
-  public static final boolean DEF_COPY_ALL_SCORES_IF_NO_CHANGE = true;
-  public static final boolean DEF_COPY_ALL_SCORES_IF_NO_CODE_CHANGE = false;
-  public static final boolean DEF_COPY_ALL_SCORES_ON_TRIVIAL_REBASE = false;
-  public static final boolean DEF_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE = false;
-  public static final boolean DEF_COPY_MAX_SCORE = false;
-  public static final boolean DEF_COPY_MIN_SCORE = false;
-
-  public static LabelType withDefaultValues(String name) {
-    checkName(name);
-    List<LabelValue> values = new ArrayList<>(2);
-    values.add(new LabelValue((short) 0, "Rejected"));
-    values.add(new LabelValue((short) 1, "Approved"));
-    return new LabelType(name, values);
-  }
-
-  public static String checkName(String name) {
-    checkNameInternal(name);
-    if ("SUBM".equals(name)) {
-      throw new IllegalArgumentException("Reserved label name \"" + name + "\"");
-    }
-    return name;
-  }
-
-  public static String checkNameInternal(String name) {
-    if (name == null || name.isEmpty()) {
-      throw new IllegalArgumentException("Empty label name");
-    }
-    for (int i = 0; i < name.length(); i++) {
-      char c = name.charAt(i);
-      if ((i == 0 && c == '-')
-          || !((c >= 'a' && c <= 'z')
-              || (c >= 'A' && c <= 'Z')
-              || (c >= '0' && c <= '9')
-              || c == '-')) {
-        throw new IllegalArgumentException("Illegal label name \"" + name + "\"");
-      }
-    }
-    return name;
-  }
-
-  private static List<LabelValue> sortValues(List<LabelValue> values) {
-    values = new ArrayList<>(values);
-    if (values.size() <= 1) {
-      return Collections.unmodifiableList(values);
-    }
-    Collections.sort(
-        values,
-        new Comparator<LabelValue>() {
-          @Override
-          public int compare(LabelValue o1, LabelValue o2) {
-            return o1.getValue() - o2.getValue();
-          }
-        });
-    short min = values.get(0).getValue();
-    short max = values.get(values.size() - 1).getValue();
-    short v = min;
-    short i = 0;
-    List<LabelValue> result = new ArrayList<>(max - min + 1);
-    // Fill in any missing values with empty text.
-    while (i < values.size()) {
-      while (v < values.get(i).getValue()) {
-        result.add(new LabelValue(v++, ""));
-      }
-      v++;
-      result.add(values.get(i++));
-    }
-    return Collections.unmodifiableList(result);
-  }
-
-  protected String name;
-
-  // String rather than LabelFunction for backwards compatibility with GWT JSON interface.
-  protected String functionName;
-
-  protected boolean copyMinScore;
-  protected boolean copyMaxScore;
-  protected boolean copyAllScoresOnMergeFirstParentUpdate;
-  protected boolean copyAllScoresOnTrivialRebase;
-  protected boolean copyAllScoresIfNoCodeChange;
-  protected boolean copyAllScoresIfNoChange;
-  protected boolean allowPostSubmit;
-  protected short defaultValue;
-
-  protected List<LabelValue> values;
-  protected short maxNegative;
-  protected short maxPositive;
-
-  private transient boolean canOverride;
-  private transient List<String> refPatterns;
-  private transient List<Integer> intList;
-  private transient Map<Short, LabelValue> byValue;
-
-  protected LabelType() {}
-
-  public LabelType(String name, List<LabelValue> valueList) {
-    this.name = checkName(name);
-    canOverride = true;
-    values = sortValues(valueList);
-    defaultValue = 0;
-
-    functionName = LabelFunction.MAX_WITH_BLOCK.getFunctionName();
-
-    maxNegative = Short.MIN_VALUE;
-    maxPositive = Short.MAX_VALUE;
-    if (values.size() > 0) {
-      if (values.get(0).getValue() < 0) {
-        maxNegative = values.get(0).getValue();
-      }
-      if (values.get(values.size() - 1).getValue() > 0) {
-        maxPositive = values.get(values.size() - 1).getValue();
-      }
-    }
-    setCanOverride(DEF_CAN_OVERRIDE);
-    setCopyAllScoresIfNoChange(DEF_COPY_ALL_SCORES_IF_NO_CHANGE);
-    setCopyAllScoresIfNoCodeChange(DEF_COPY_ALL_SCORES_IF_NO_CODE_CHANGE);
-    setCopyAllScoresOnTrivialRebase(DEF_COPY_ALL_SCORES_ON_TRIVIAL_REBASE);
-    setCopyAllScoresOnMergeFirstParentUpdate(DEF_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE);
-    setCopyMaxScore(DEF_COPY_MAX_SCORE);
-    setCopyMinScore(DEF_COPY_MIN_SCORE);
-    setAllowPostSubmit(DEF_ALLOW_POST_SUBMIT);
-  }
-
-  public String getName() {
-    return name;
-  }
-
-  public boolean matches(PatchSetApproval psa) {
-    return psa.getLabelId().get().equalsIgnoreCase(name);
-  }
-
-  public LabelFunction getFunction() {
-    if (functionName == null) {
-      return null;
-    }
-    Optional<LabelFunction> f = LabelFunction.parse(functionName);
-    if (!f.isPresent()) {
-      throw new IllegalStateException("Unsupported functionName: " + functionName);
-    }
-    return f.get();
-  }
-
-  public void setFunction(@Nullable LabelFunction function) {
-    this.functionName = function != null ? function.getFunctionName() : null;
-  }
-
-  public boolean canOverride() {
-    return canOverride;
-  }
-
-  public List<String> getRefPatterns() {
-    return refPatterns;
-  }
-
-  public void setCanOverride(boolean canOverride) {
-    this.canOverride = canOverride;
-  }
-
-  public boolean allowPostSubmit() {
-    return allowPostSubmit;
-  }
-
-  public void setAllowPostSubmit(boolean allowPostSubmit) {
-    this.allowPostSubmit = allowPostSubmit;
-  }
-
-  public void setRefPatterns(List<String> refPatterns) {
-    this.refPatterns = refPatterns;
-  }
-
-  public List<LabelValue> getValues() {
-    return values;
-  }
-
-  public LabelValue getMin() {
-    if (values.isEmpty()) {
-      return null;
-    }
-    return values.get(0);
-  }
-
-  public LabelValue getMax() {
-    if (values.isEmpty()) {
-      return null;
-    }
-    return values.get(values.size() - 1);
-  }
-
-  public short getDefaultValue() {
-    return defaultValue;
-  }
-
-  public void setDefaultValue(short defaultValue) {
-    this.defaultValue = defaultValue;
-  }
-
-  public boolean isCopyMinScore() {
-    return copyMinScore;
-  }
-
-  public void setCopyMinScore(boolean copyMinScore) {
-    this.copyMinScore = copyMinScore;
-  }
-
-  public boolean isCopyMaxScore() {
-    return copyMaxScore;
-  }
-
-  public void setCopyMaxScore(boolean copyMaxScore) {
-    this.copyMaxScore = copyMaxScore;
-  }
-
-  public boolean isCopyAllScoresOnMergeFirstParentUpdate() {
-    return copyAllScoresOnMergeFirstParentUpdate;
-  }
-
-  public void setCopyAllScoresOnMergeFirstParentUpdate(
-      boolean copyAllScoresOnMergeFirstParentUpdate) {
-    this.copyAllScoresOnMergeFirstParentUpdate = copyAllScoresOnMergeFirstParentUpdate;
-  }
-
-  public boolean isCopyAllScoresOnTrivialRebase() {
-    return copyAllScoresOnTrivialRebase;
-  }
-
-  public void setCopyAllScoresOnTrivialRebase(boolean copyAllScoresOnTrivialRebase) {
-    this.copyAllScoresOnTrivialRebase = copyAllScoresOnTrivialRebase;
-  }
-
-  public boolean isCopyAllScoresIfNoCodeChange() {
-    return copyAllScoresIfNoCodeChange;
-  }
-
-  public void setCopyAllScoresIfNoCodeChange(boolean copyAllScoresIfNoCodeChange) {
-    this.copyAllScoresIfNoCodeChange = copyAllScoresIfNoCodeChange;
-  }
-
-  public boolean isCopyAllScoresIfNoChange() {
-    return copyAllScoresIfNoChange;
-  }
-
-  public void setCopyAllScoresIfNoChange(boolean copyAllScoresIfNoChange) {
-    this.copyAllScoresIfNoChange = copyAllScoresIfNoChange;
-  }
-
-  public boolean isMaxNegative(PatchSetApproval ca) {
-    return maxNegative == ca.getValue();
-  }
-
-  public boolean isMaxPositive(PatchSetApproval ca) {
-    return maxPositive == ca.getValue();
-  }
-
-  public LabelValue getValue(short value) {
-    initByValue();
-    return byValue.get(value);
-  }
-
-  public LabelValue getValue(PatchSetApproval ca) {
-    initByValue();
-    return byValue.get(ca.getValue());
-  }
-
-  private void initByValue() {
-    if (byValue == null) {
-      byValue = new HashMap<>();
-      for (LabelValue v : values) {
-        byValue.put(v.getValue(), v);
-      }
-    }
-  }
-
-  public List<Integer> getValuesAsList() {
-    if (intList == null) {
-      intList = new ArrayList<>(values.size());
-      for (LabelValue v : values) {
-        intList.add(Integer.valueOf(v.getValue()));
-      }
-      Collections.sort(intList);
-      Collections.reverse(intList);
-    }
-    return intList;
-  }
-
-  public LabelId getLabelId() {
-    return new LabelId(name);
-  }
-
-  @Override
-  public String toString() {
-    StringBuilder sb = new StringBuilder(name).append('[');
-    LabelValue min = getMin();
-    LabelValue max = getMax();
-    if (min != null && max != null) {
-      sb.append(
-          new PermissionRange(Permission.forLabel(name), min.getValue(), max.getValue())
-              .toString()
-              .trim());
-    } else if (min != null) {
-      sb.append(min.formatValue().trim());
-    } else if (max != null) {
-      sb.append(max.formatValue().trim());
-    }
-    sb.append(']');
-    return sb.toString();
-  }
-}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelValue.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelValue.java
deleted file mode 100644
index 811e751..0000000
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelValue.java
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.common.data;
-
-public class LabelValue {
-  public static String formatValue(short value) {
-    if (value < 0) {
-      return Short.toString(value);
-    } else if (value == 0) {
-      return " 0";
-    } else {
-      return "+" + Short.toString(value);
-    }
-  }
-
-  protected short value;
-  protected String text;
-
-  public LabelValue(short value, String text) {
-    this.value = value;
-    this.text = text;
-  }
-
-  protected LabelValue() {}
-
-  public short getValue() {
-    return value;
-  }
-
-  public String getText() {
-    return text;
-  }
-
-  public String formatValue() {
-    return formatValue(value);
-  }
-
-  public String format() {
-    StringBuilder sb = new StringBuilder(formatValue());
-    if (!text.isEmpty()) {
-      sb.append(' ').append(text);
-    }
-    return sb.toString();
-  }
-
-  @Override
-  public String toString() {
-    return format();
-  }
-}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/Permission.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/Permission.java
deleted file mode 100644
index 4910424..0000000
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/Permission.java
+++ /dev/null
@@ -1,296 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.common.data;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-/** A single permission within an {@link AccessSection} of a project. */
-public class Permission implements Comparable<Permission> {
-  public static final String ABANDON = "abandon";
-  public static final String ADD_PATCH_SET = "addPatchSet";
-  public static final String CREATE = "create";
-  public static final String DELETE = "delete";
-  public static final String CREATE_TAG = "createTag";
-  public static final String CREATE_SIGNED_TAG = "createSignedTag";
-  public static final String DELETE_CHANGES = "deleteChanges";
-  public static final String DELETE_OWN_CHANGES = "deleteOwnChanges";
-  public static final String EDIT_HASHTAGS = "editHashtags";
-  public static final String EDIT_ASSIGNEE = "editAssignee";
-  public static final String EDIT_TOPIC_NAME = "editTopicName";
-  public static final String FORGE_AUTHOR = "forgeAuthor";
-  public static final String FORGE_COMMITTER = "forgeCommitter";
-  public static final String FORGE_SERVER = "forgeServerAsCommitter";
-  public static final String LABEL = "label-";
-  public static final String LABEL_AS = "labelAs-";
-  public static final String OWNER = "owner";
-  public static final String PUSH = "push";
-  public static final String PUSH_MERGE = "pushMerge";
-  public static final String READ = "read";
-  public static final String REBASE = "rebase";
-  public static final String REMOVE_REVIEWER = "removeReviewer";
-  public static final String SUBMIT = "submit";
-  public static final String SUBMIT_AS = "submitAs";
-  public static final String VIEW_PRIVATE_CHANGES = "viewPrivateChanges";
-
-  private static final List<String> NAMES_LC;
-  private static final int LABEL_INDEX;
-  private static final int LABEL_AS_INDEX;
-
-  static {
-    NAMES_LC = new ArrayList<>();
-    NAMES_LC.add(OWNER.toLowerCase());
-    NAMES_LC.add(READ.toLowerCase());
-    NAMES_LC.add(ABANDON.toLowerCase());
-    NAMES_LC.add(ADD_PATCH_SET.toLowerCase());
-    NAMES_LC.add(CREATE.toLowerCase());
-    NAMES_LC.add(CREATE_TAG.toLowerCase());
-    NAMES_LC.add(CREATE_SIGNED_TAG.toLowerCase());
-    NAMES_LC.add(DELETE.toLowerCase());
-    NAMES_LC.add(FORGE_AUTHOR.toLowerCase());
-    NAMES_LC.add(FORGE_COMMITTER.toLowerCase());
-    NAMES_LC.add(FORGE_SERVER.toLowerCase());
-    NAMES_LC.add(PUSH.toLowerCase());
-    NAMES_LC.add(PUSH_MERGE.toLowerCase());
-    NAMES_LC.add(LABEL.toLowerCase());
-    NAMES_LC.add(LABEL_AS.toLowerCase());
-    NAMES_LC.add(REBASE.toLowerCase());
-    NAMES_LC.add(REMOVE_REVIEWER.toLowerCase());
-    NAMES_LC.add(SUBMIT.toLowerCase());
-    NAMES_LC.add(SUBMIT_AS.toLowerCase());
-    NAMES_LC.add(VIEW_PRIVATE_CHANGES.toLowerCase());
-    NAMES_LC.add(EDIT_TOPIC_NAME.toLowerCase());
-    NAMES_LC.add(EDIT_HASHTAGS.toLowerCase());
-    NAMES_LC.add(EDIT_ASSIGNEE.toLowerCase());
-    NAMES_LC.add(DELETE_OWN_CHANGES.toLowerCase());
-    NAMES_LC.add(DELETE_CHANGES.toLowerCase());
-
-    LABEL_INDEX = NAMES_LC.indexOf(Permission.LABEL);
-    LABEL_AS_INDEX = NAMES_LC.indexOf(Permission.LABEL_AS.toLowerCase());
-  }
-
-  /** @return true if the name is recognized as a permission name. */
-  public static boolean isPermission(String varName) {
-    return isLabel(varName) || isLabelAs(varName) || NAMES_LC.contains(varName.toLowerCase());
-  }
-
-  public static boolean hasRange(String varName) {
-    return isLabel(varName) || isLabelAs(varName);
-  }
-
-  /** @return true if the permission name is actually for a review label. */
-  public static boolean isLabel(String varName) {
-    return varName.startsWith(LABEL) && LABEL.length() < varName.length();
-  }
-
-  /** @return true if the permission is for impersonated review labels. */
-  public static boolean isLabelAs(String var) {
-    return var.startsWith(LABEL_AS) && LABEL_AS.length() < var.length();
-  }
-
-  /** @return permission name for the given review label. */
-  public static String forLabel(String labelName) {
-    return LABEL + labelName;
-  }
-
-  /** @return permission name to apply a label for another user. */
-  public static String forLabelAs(String labelName) {
-    return LABEL_AS + labelName;
-  }
-
-  public static String extractLabel(String varName) {
-    if (isLabel(varName)) {
-      return varName.substring(LABEL.length());
-    } else if (isLabelAs(varName)) {
-      return varName.substring(LABEL_AS.length());
-    }
-    return null;
-  }
-
-  public static boolean canBeOnAllProjects(String ref, String permissionName) {
-    if (AccessSection.ALL.equals(ref)) {
-      return !OWNER.equals(permissionName);
-    }
-    return true;
-  }
-
-  protected String name;
-  protected boolean exclusiveGroup;
-  protected List<PermissionRule> rules;
-
-  protected Permission() {}
-
-  public Permission(String name) {
-    this.name = name;
-  }
-
-  public String getName() {
-    return name;
-  }
-
-  public String getLabel() {
-    return extractLabel(getName());
-  }
-
-  public Boolean getExclusiveGroup() {
-    // Only permit exclusive group behavior on non OWNER permissions,
-    // otherwise an owner might lose access to a delegated subspace.
-    //
-    return exclusiveGroup && !OWNER.equals(getName());
-  }
-
-  public void setExclusiveGroup(Boolean newExclusiveGroup) {
-    exclusiveGroup = newExclusiveGroup;
-  }
-
-  public List<PermissionRule> getRules() {
-    initRules();
-    return rules;
-  }
-
-  public void setRules(List<PermissionRule> list) {
-    rules = list;
-  }
-
-  public void add(PermissionRule rule) {
-    initRules();
-    rules.add(rule);
-  }
-
-  public void remove(PermissionRule rule) {
-    if (rule != null) {
-      removeRule(rule.getGroup());
-    }
-  }
-
-  public void removeRule(GroupReference group) {
-    if (rules != null) {
-      for (Iterator<PermissionRule> itr = rules.iterator(); itr.hasNext(); ) {
-        if (sameGroup(itr.next(), group)) {
-          itr.remove();
-        }
-      }
-    }
-  }
-
-  public PermissionRule getRule(GroupReference group) {
-    return getRule(group, false);
-  }
-
-  public PermissionRule getRule(GroupReference group, boolean create) {
-    initRules();
-
-    for (PermissionRule r : rules) {
-      if (sameGroup(r, group)) {
-        return r;
-      }
-    }
-
-    if (create) {
-      PermissionRule r = new PermissionRule(group);
-      rules.add(r);
-      return r;
-    }
-    return null;
-  }
-
-  void mergeFrom(Permission src) {
-    for (PermissionRule srcRule : src.getRules()) {
-      PermissionRule dstRule = getRule(srcRule.getGroup());
-      if (dstRule != null) {
-        dstRule.mergeFrom(srcRule);
-      } else {
-        add(srcRule);
-      }
-    }
-  }
-
-  private static boolean sameGroup(PermissionRule rule, GroupReference group) {
-    if (group.getUUID() != null) {
-      return group.getUUID().equals(rule.getGroup().getUUID());
-
-    } else if (group.getName() != null) {
-      return group.getName().equals(rule.getGroup().getName());
-
-    } else {
-      return false;
-    }
-  }
-
-  private void initRules() {
-    if (rules == null) {
-      rules = new ArrayList<>(4);
-    }
-  }
-
-  @Override
-  public int compareTo(Permission b) {
-    int cmp = index(this) - index(b);
-    if (cmp == 0) {
-      cmp = getName().compareTo(b.getName());
-    }
-    return cmp;
-  }
-
-  private static int index(Permission a) {
-    if (isLabel(a.getName())) {
-      return LABEL_INDEX;
-    } else if (isLabelAs(a.getName())) {
-      return LABEL_AS_INDEX;
-    }
-
-    int index = NAMES_LC.indexOf(a.getName().toLowerCase());
-    return 0 <= index ? index : NAMES_LC.size();
-  }
-
-  @Override
-  public boolean equals(Object obj) {
-    if (!(obj instanceof Permission)) {
-      return false;
-    }
-
-    final Permission other = (Permission) obj;
-    if (!name.equals(other.name) || exclusiveGroup != other.exclusiveGroup) {
-      return false;
-    }
-    return new HashSet<>(getRules()).equals(new HashSet<>(other.getRules()));
-  }
-
-  @Override
-  public int hashCode() {
-    return name.hashCode();
-  }
-
-  @Override
-  public String toString() {
-    StringBuilder bldr = new StringBuilder();
-    bldr.append(name).append(" ");
-    if (exclusiveGroup) {
-      bldr.append("[exclusive] ");
-    }
-    bldr.append("[");
-    Iterator<PermissionRule> it = getRules().iterator();
-    while (it.hasNext()) {
-      bldr.append(it.next());
-      if (it.hasNext()) {
-        bldr.append(", ");
-      }
-    }
-    bldr.append("]");
-    return bldr.toString();
-  }
-}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/PermissionRule.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/PermissionRule.java
deleted file mode 100644
index c50af5c..0000000
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/PermissionRule.java
+++ /dev/null
@@ -1,296 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.common.data;
-
-public class PermissionRule implements Comparable<PermissionRule> {
-  public static final String FORCE_PUSH = "Force Push";
-  public static final String FORCE_EDIT = "Force Edit";
-
-  public enum Action {
-    ALLOW,
-    DENY,
-    BLOCK,
-
-    INTERACTIVE,
-    BATCH
-  }
-
-  protected Action action = Action.ALLOW;
-  protected boolean force;
-  protected int min;
-  protected int max;
-  protected GroupReference group;
-
-  public PermissionRule() {}
-
-  public PermissionRule(GroupReference group) {
-    this.group = group;
-  }
-
-  public Action getAction() {
-    return action;
-  }
-
-  public void setAction(Action action) {
-    if (action == null) {
-      throw new NullPointerException("action");
-    }
-    this.action = action;
-  }
-
-  public boolean isDeny() {
-    return action == Action.DENY;
-  }
-
-  public void setDeny() {
-    action = Action.DENY;
-  }
-
-  public boolean isBlock() {
-    return action == Action.BLOCK;
-  }
-
-  public void setBlock() {
-    action = Action.BLOCK;
-  }
-
-  public Boolean getForce() {
-    return force;
-  }
-
-  public void setForce(Boolean newForce) {
-    force = newForce;
-  }
-
-  public Integer getMin() {
-    return min;
-  }
-
-  public void setMin(Integer min) {
-    this.min = min;
-  }
-
-  public void setMax(Integer max) {
-    this.max = max;
-  }
-
-  public Integer getMax() {
-    return max;
-  }
-
-  public void setRange(int newMin, int newMax) {
-    if (newMax < newMin) {
-      min = newMax;
-      max = newMin;
-    } else {
-      min = newMin;
-      max = newMax;
-    }
-  }
-
-  public GroupReference getGroup() {
-    return group;
-  }
-
-  public void setGroup(GroupReference newGroup) {
-    group = newGroup;
-  }
-
-  void mergeFrom(PermissionRule src) {
-    if (getAction() != src.getAction()) {
-      if (getAction() == Action.BLOCK || src.getAction() == Action.BLOCK) {
-        setAction(Action.BLOCK);
-
-      } else if (getAction() == Action.DENY || src.getAction() == Action.DENY) {
-        setAction(Action.DENY);
-
-      } else if (getAction() == Action.BATCH || src.getAction() == Action.BATCH) {
-        setAction(Action.BATCH);
-      }
-    }
-
-    setForce(getForce() || src.getForce());
-    setRange(Math.min(getMin(), src.getMin()), Math.max(getMax(), src.getMax()));
-  }
-
-  @Override
-  public int compareTo(PermissionRule o) {
-    int cmp = action(this) - action(o);
-    if (cmp == 0) {
-      cmp = range(o) - range(this);
-    }
-    if (cmp == 0) {
-      cmp = group(this).compareTo(group(o));
-    }
-    return cmp;
-  }
-
-  private static int action(PermissionRule a) {
-    switch (a.getAction()) {
-      case DENY:
-        return 0;
-      case ALLOW:
-      case BATCH:
-      case BLOCK:
-      case INTERACTIVE:
-      default:
-        return 1 + a.getAction().ordinal();
-    }
-  }
-
-  private static int range(PermissionRule a) {
-    return Math.abs(a.getMin()) + Math.abs(a.getMax());
-  }
-
-  private static String group(PermissionRule a) {
-    return a.getGroup().getName() != null ? a.getGroup().getName() : "";
-  }
-
-  @Override
-  public String toString() {
-    return asString(true);
-  }
-
-  public String asString(boolean canUseRange) {
-    StringBuilder r = new StringBuilder();
-
-    switch (getAction()) {
-      case ALLOW:
-        break;
-
-      case DENY:
-        r.append("deny ");
-        break;
-
-      case BLOCK:
-        r.append("block ");
-        break;
-
-      case INTERACTIVE:
-        r.append("interactive ");
-        break;
-
-      case BATCH:
-        r.append("batch ");
-        break;
-    }
-
-    if (getForce()) {
-      r.append("+force ");
-    }
-
-    if (canUseRange && (getMin() != 0 || getMax() != 0)) {
-      if (0 <= getMin()) {
-        r.append('+');
-      }
-      r.append(getMin());
-      r.append("..");
-      if (0 <= getMax()) {
-        r.append('+');
-      }
-      r.append(getMax());
-      r.append(' ');
-    }
-
-    r.append(getGroup().toConfigValue());
-
-    return r.toString();
-  }
-
-  public static PermissionRule fromString(String src, boolean mightUseRange) {
-    final String orig = src;
-    final PermissionRule rule = new PermissionRule();
-
-    src = src.trim();
-
-    if (src.startsWith("deny ")) {
-      rule.setAction(Action.DENY);
-      src = src.substring("deny ".length()).trim();
-
-    } else if (src.startsWith("block ")) {
-      rule.setAction(Action.BLOCK);
-      src = src.substring("block ".length()).trim();
-
-    } else if (src.startsWith("interactive ")) {
-      rule.setAction(Action.INTERACTIVE);
-      src = src.substring("interactive ".length()).trim();
-
-    } else if (src.startsWith("batch ")) {
-      rule.setAction(Action.BATCH);
-      src = src.substring("batch ".length()).trim();
-    }
-
-    if (src.startsWith("+force ")) {
-      rule.setForce(true);
-      src = src.substring("+force ".length()).trim();
-    }
-
-    if (mightUseRange && !GroupReference.isGroupReference(src)) {
-      int sp = src.indexOf(' ');
-      String range = src.substring(0, sp);
-
-      if (range.matches("^([+-]?\\d+)\\.\\.([+-]?\\d+)$")) {
-        int dotdot = range.indexOf("..");
-        int min = parseInt(range.substring(0, dotdot));
-        int max = parseInt(range.substring(dotdot + 2));
-        rule.setRange(min, max);
-      } else {
-        throw new IllegalArgumentException("Invalid range in rule: " + orig);
-      }
-
-      src = src.substring(sp + 1).trim();
-    }
-
-    String groupName = GroupReference.extractGroupName(src);
-    if (groupName != null) {
-      GroupReference group = new GroupReference();
-      group.setName(groupName);
-      rule.setGroup(group);
-    } else {
-      throw new IllegalArgumentException("Rule must include group: " + orig);
-    }
-
-    return rule;
-  }
-
-  public boolean hasRange() {
-    return (!(getMin() == null || getMin() == 0)) || (!(getMax() == null || getMax() == 0));
-  }
-
-  public static int parseInt(String value) {
-    if (value.startsWith("+")) {
-      value = value.substring(1);
-    }
-    return Integer.parseInt(value);
-  }
-
-  @Override
-  public boolean equals(Object obj) {
-    if (!(obj instanceof PermissionRule)) {
-      return false;
-    }
-    final PermissionRule other = (PermissionRule) obj;
-    return action.equals(other.action)
-        && force == other.force
-        && min == other.min
-        && max == other.max
-        && group.equals(other.group);
-  }
-
-  @Override
-  public int hashCode() {
-    return group.hashCode();
-  }
-}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/SubmitRecord.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/SubmitRecord.java
deleted file mode 100644
index 9151222..0000000
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/SubmitRecord.java
+++ /dev/null
@@ -1,162 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.common.data;
-
-import com.google.gerrit.reviewdb.client.Account;
-import java.util.Collection;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
-
-/** Describes the state required to submit a change. */
-public class SubmitRecord {
-  public static Optional<SubmitRecord> findOkRecord(Collection<SubmitRecord> in) {
-    if (in == null) {
-      return Optional.empty();
-    }
-    return in.stream().filter(r -> r.status == Status.OK).findFirst();
-  }
-
-  public enum Status {
-    // NOTE: These values are persisted in the index, so deleting or changing
-    // the name of any values requires a schema upgrade.
-
-    /** The change is ready for submission. */
-    OK,
-
-    /** The change is missing a required label. */
-    NOT_READY,
-
-    /** The change has been closed. */
-    CLOSED,
-
-    /** The change was submitted bypassing submit rules. */
-    FORCED,
-
-    /**
-     * An internal server error occurred preventing computation.
-     *
-     * <p>Additional detail may be available in {@link SubmitRecord#errorMessage}.
-     */
-    RULE_ERROR
-  }
-
-  public Status status;
-  public List<Label> labels;
-  public String errorMessage;
-
-  public static class Label {
-    public enum Status {
-      // NOTE: These values are persisted in the index, so deleting or changing
-      // the name of any values requires a schema upgrade.
-
-      /**
-       * This label provides what is necessary for submission.
-       *
-       * <p>If provided, {@link Label#appliedBy} describes the user account that applied this label
-       * to the change.
-       */
-      OK,
-
-      /**
-       * This label prevents the change from being submitted.
-       *
-       * <p>If provided, {@link Label#appliedBy} describes the user account that applied this label
-       * to the change.
-       */
-      REJECT,
-
-      /** The label is required for submission, but has not been satisfied. */
-      NEED,
-
-      /**
-       * The label may be set, but it's neither necessary for submission nor does it block
-       * submission if set.
-       */
-      MAY,
-
-      /**
-       * The label is required for submission, but is impossible to complete. The likely cause is
-       * access has not been granted correctly by the project owner or site administrator.
-       */
-      IMPOSSIBLE
-    }
-
-    public String label;
-    public Status status;
-    public Account.Id appliedBy;
-
-    @Override
-    public String toString() {
-      StringBuilder sb = new StringBuilder();
-      sb.append(label).append(": ").append(status);
-      if (appliedBy != null) {
-        sb.append(" by ").append(appliedBy);
-      }
-      return sb.toString();
-    }
-
-    @Override
-    public boolean equals(Object o) {
-      if (o instanceof Label) {
-        Label l = (Label) o;
-        return Objects.equals(label, l.label)
-            && Objects.equals(status, l.status)
-            && Objects.equals(appliedBy, l.appliedBy);
-      }
-      return false;
-    }
-
-    @Override
-    public int hashCode() {
-      return Objects.hash(label, status, appliedBy);
-    }
-  }
-
-  @Override
-  public String toString() {
-    StringBuilder sb = new StringBuilder();
-    sb.append(status);
-    if (status == Status.RULE_ERROR && errorMessage != null) {
-      sb.append('(').append(errorMessage).append(')');
-    }
-    sb.append('[');
-    if (labels != null) {
-      String delimiter = "";
-      for (Label label : labels) {
-        sb.append(delimiter).append(label);
-        delimiter = ", ";
-      }
-    }
-    sb.append(']');
-    return sb.toString();
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (o instanceof SubmitRecord) {
-      SubmitRecord r = (SubmitRecord) o;
-      return Objects.equals(status, r.status)
-          && Objects.equals(labels, r.labels)
-          && Objects.equals(errorMessage, r.errorMessage);
-    }
-    return false;
-  }
-
-  @Override
-  public int hashCode() {
-    return Objects.hash(status, labels, errorMessage);
-  }
-}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/SubmitTypeRecord.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/SubmitTypeRecord.java
deleted file mode 100644
index a01d83d..0000000
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/SubmitTypeRecord.java
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.common.data;
-
-import com.google.gerrit.extensions.client.SubmitType;
-
-/** Describes the submit type for a change. */
-public class SubmitTypeRecord {
-  public enum Status {
-    /** The type was computed successfully */
-    OK,
-
-    /**
-     * An internal server error occurred preventing computation.
-     *
-     * <p>Additional detail may be available in {@link SubmitTypeRecord#errorMessage}
-     */
-    RULE_ERROR
-  }
-
-  public static SubmitTypeRecord OK(SubmitType type) {
-    return new SubmitTypeRecord(Status.OK, type, null);
-  }
-
-  public static SubmitTypeRecord error(String err) {
-    return new SubmitTypeRecord(SubmitTypeRecord.Status.RULE_ERROR, null, err);
-  }
-
-  /** Status enum value of the record. */
-  public final Status status;
-
-  /** Submit type of the record; never null if {@link #status} is {@code OK}. */
-  public final SubmitType type;
-
-  /** Submit type of the record; always null if {@link #status} is {@code OK}. */
-  public final String errorMessage;
-
-  private SubmitTypeRecord(Status status, SubmitType type, String errorMessage) {
-    this.status = status;
-    this.type = type;
-    this.errorMessage = errorMessage;
-  }
-
-  public boolean isOk() {
-    return status == Status.OK;
-  }
-
-  @Override
-  public String toString() {
-    StringBuilder sb = new StringBuilder();
-    sb.append(status);
-    if (status == Status.RULE_ERROR && errorMessage != null) {
-      sb.append('(').append(errorMessage).append(")");
-    }
-    if (type != null) {
-      sb.append('[');
-      sb.append(type.name());
-      sb.append(']');
-    }
-    return sb.toString();
-  }
-}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/errors/InvalidQueryException.java b/gerrit-common/src/main/java/com/google/gerrit/common/errors/InvalidQueryException.java
deleted file mode 100644
index 4a66a416a..0000000
--- a/gerrit-common/src/main/java/com/google/gerrit/common/errors/InvalidQueryException.java
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.common.errors;
-
-/** Error indicating the query cannot be executed. */
-public class InvalidQueryException extends Exception {
-  private static final long serialVersionUID = 1L;
-
-  public InvalidQueryException(String message, String query) {
-    super("Invalid query: " + query + "\n\n" + message);
-  }
-}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/errors/PermissionDeniedException.java b/gerrit-common/src/main/java/com/google/gerrit/common/errors/PermissionDeniedException.java
deleted file mode 100644
index 0faf498..0000000
--- a/gerrit-common/src/main/java/com/google/gerrit/common/errors/PermissionDeniedException.java
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.common.errors;
-
-/** Indicates the user cannot perform this task. */
-public class PermissionDeniedException extends Exception {
-  private static final long serialVersionUID = 1L;
-
-  public PermissionDeniedException(String msg) {
-    super(msg);
-  }
-}
diff --git a/gerrit-common/src/test/java/com/google/gerrit/common/data/EncodePathSeparatorTest.java b/gerrit-common/src/test/java/com/google/gerrit/common/data/EncodePathSeparatorTest.java
deleted file mode 100644
index 4c4c769..0000000
--- a/gerrit-common/src/test/java/com/google/gerrit/common/data/EncodePathSeparatorTest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.common.data;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Test;
-
-public class EncodePathSeparatorTest {
-  @Test
-  public void defaultBehaviour() {
-    assertEquals("a/b", new GitwebType().replacePathSeparator("a/b"));
-  }
-
-  @Test
-  public void exclamationMark() {
-    GitwebType gitwebType = new GitwebType();
-    gitwebType.setPathSeparator('!');
-    assertEquals("a!b", gitwebType.replacePathSeparator("a/b"));
-  }
-}
diff --git a/gerrit-common/src/test/java/com/google/gerrit/common/data/ParameterizedStringTest.java b/gerrit-common/src/test/java/com/google/gerrit/common/data/ParameterizedStringTest.java
deleted file mode 100644
index 0f067c4..0000000
--- a/gerrit-common/src/test/java/com/google/gerrit/common/data/ParameterizedStringTest.java
+++ /dev/null
@@ -1,417 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.common.data;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import com.google.common.collect.ImmutableMap;
-import java.util.HashMap;
-import java.util.Map;
-import org.junit.Test;
-
-public class ParameterizedStringTest {
-  @Test
-  public void emptyString() {
-    final ParameterizedString p = new ParameterizedString("");
-    assertEquals("", p.getPattern());
-    assertEquals("", p.getRawPattern());
-    assertTrue(p.getParameterNames().isEmpty());
-
-    final Map<String, String> a = new HashMap<>();
-    assertNotNull(p.bind(a));
-    assertEquals(0, p.bind(a).length);
-    assertEquals("", p.replace(a));
-  }
-
-  @Test
-  public void asis1() {
-    final ParameterizedString p = ParameterizedString.asis("${bar}c");
-    assertEquals("${bar}c", p.getPattern());
-    assertEquals("${bar}c", p.getRawPattern());
-    assertTrue(p.getParameterNames().isEmpty());
-
-    final Map<String, String> a = new HashMap<>();
-    a.put("bar", "frobinator");
-    assertNotNull(p.bind(a));
-    assertEquals(0, p.bind(a).length);
-    assertEquals("${bar}c", p.replace(a));
-  }
-
-  @Test
-  public void replace1() {
-    final ParameterizedString p = new ParameterizedString("${bar}c");
-    assertEquals("${bar}c", p.getPattern());
-    assertEquals("{0}c", p.getRawPattern());
-    assertEquals(1, p.getParameterNames().size());
-    assertTrue(p.getParameterNames().contains("bar"));
-
-    final Map<String, String> a = new HashMap<>();
-    a.put("bar", "frobinator");
-    assertNotNull(p.bind(a));
-    assertEquals(1, p.bind(a).length);
-    assertEquals("frobinator", p.bind(a)[0]);
-    assertEquals("frobinatorc", p.replace(a));
-  }
-
-  @Test
-  public void replace2() {
-    final ParameterizedString p = new ParameterizedString("a${bar}c");
-    assertEquals("a${bar}c", p.getPattern());
-    assertEquals("a{0}c", p.getRawPattern());
-    assertEquals(1, p.getParameterNames().size());
-    assertTrue(p.getParameterNames().contains("bar"));
-
-    final Map<String, String> a = new HashMap<>();
-    a.put("bar", "frobinator");
-    assertNotNull(p.bind(a));
-    assertEquals(1, p.bind(a).length);
-    assertEquals("frobinator", p.bind(a)[0]);
-    assertEquals("afrobinatorc", p.replace(a));
-  }
-
-  @Test
-  public void replace3() {
-    final ParameterizedString p = new ParameterizedString("a${bar}");
-    assertEquals("a${bar}", p.getPattern());
-    assertEquals("a{0}", p.getRawPattern());
-    assertEquals(1, p.getParameterNames().size());
-    assertTrue(p.getParameterNames().contains("bar"));
-
-    final Map<String, String> a = new HashMap<>();
-    a.put("bar", "frobinator");
-    assertNotNull(p.bind(a));
-    assertEquals(1, p.bind(a).length);
-    assertEquals("frobinator", p.bind(a)[0]);
-    assertEquals("afrobinator", p.replace(a));
-  }
-
-  @Test
-  public void replace4() {
-    final ParameterizedString p = new ParameterizedString("a${bar}c");
-    assertEquals("a${bar}c", p.getPattern());
-    assertEquals("a{0}c", p.getRawPattern());
-    assertEquals(1, p.getParameterNames().size());
-    assertTrue(p.getParameterNames().contains("bar"));
-
-    final Map<String, String> a = new HashMap<>();
-    assertNotNull(p.bind(a));
-    assertEquals(1, p.bind(a).length);
-    assertEquals("", p.bind(a)[0]);
-    assertEquals("ac", p.replace(a));
-  }
-
-  @Test
-  public void replaceToLowerCase() {
-    final ParameterizedString p = new ParameterizedString("${a.toLowerCase}");
-    assertEquals(1, p.getParameterNames().size());
-    assertTrue(p.getParameterNames().contains("a"));
-
-    final Map<String, String> a = new HashMap<>();
-
-    a.put("a", "foo");
-    assertNotNull(p.bind(a));
-    assertEquals(1, p.bind(a).length);
-    assertEquals("foo", p.bind(a)[0]);
-    assertEquals("foo", p.replace(a));
-
-    a.put("a", "FOO");
-    assertNotNull(p.bind(a));
-    assertEquals(1, p.bind(a).length);
-    assertEquals("foo", p.bind(a)[0]);
-    assertEquals("foo", p.replace(a));
-  }
-
-  @Test
-  public void replaceToUpperCase() {
-    final ParameterizedString p = new ParameterizedString("${a.toUpperCase}");
-    assertEquals(1, p.getParameterNames().size());
-    assertTrue(p.getParameterNames().contains("a"));
-
-    final Map<String, String> a = new HashMap<>();
-
-    a.put("a", "foo");
-    assertNotNull(p.bind(a));
-    assertEquals(1, p.bind(a).length);
-    assertEquals("FOO", p.bind(a)[0]);
-    assertEquals("FOO", p.replace(a));
-
-    a.put("a", "FOO");
-    assertNotNull(p.bind(a));
-    assertEquals(1, p.bind(a).length);
-    assertEquals("FOO", p.bind(a)[0]);
-    assertEquals("FOO", p.replace(a));
-  }
-
-  @Test
-  public void replaceLocalName() {
-    final ParameterizedString p = new ParameterizedString("${a.localPart}");
-    assertEquals(1, p.getParameterNames().size());
-    assertTrue(p.getParameterNames().contains("a"));
-
-    final Map<String, String> a = new HashMap<>();
-
-    a.put("a", "foo@example.com");
-    assertNotNull(p.bind(a));
-    assertEquals(1, p.bind(a).length);
-    assertEquals("foo", p.bind(a)[0]);
-    assertEquals("foo", p.replace(a));
-
-    a.put("a", "foo");
-    assertNotNull(p.bind(a));
-    assertEquals(1, p.bind(a).length);
-    assertEquals("foo", p.bind(a)[0]);
-    assertEquals("foo", p.replace(a));
-  }
-
-  @Test
-  public void undefinedFunctionName() {
-    ParameterizedString p =
-        new ParameterizedString(
-            "hi, ${userName.toUpperCase},your eamil address is '${email.toLowerCase.localPart}'.right?");
-    assertEquals(2, p.getParameterNames().size());
-    assertTrue(p.getParameterNames().contains("userName"));
-    assertTrue(p.getParameterNames().contains("email"));
-
-    final Map<String, String> a = new HashMap<>();
-    a.put("userName", "firstName lastName");
-    a.put("email", "FIRSTNAME.LASTNAME@EXAMPLE.COM");
-    assertNotNull(p.bind(a));
-    assertEquals(2, p.bind(a).length);
-
-    assertEquals("FIRSTNAME LASTNAME", p.bind(a)[0]);
-    assertEquals("firstname.lastname", p.bind(a)[1]);
-    assertEquals(
-        "hi, FIRSTNAME LASTNAME,your eamil address is 'firstname.lastname'.right?", p.replace(a));
-  }
-
-  @Test
-  public void replaceToUpperCaseToLowerCase() {
-    final ParameterizedString p = new ParameterizedString("${a.toUpperCase.toLowerCase}");
-    assertEquals(1, p.getParameterNames().size());
-    assertTrue(p.getParameterNames().contains("a"));
-
-    final Map<String, String> a = new HashMap<>();
-
-    a.put("a", "FOO@EXAMPLE.COM");
-    assertNotNull(p.bind(a));
-    assertEquals(1, p.bind(a).length);
-    assertEquals("foo@example.com", p.bind(a)[0]);
-    assertEquals("foo@example.com", p.replace(a));
-
-    a.put("a", "foo@example.com");
-    assertNotNull(p.bind(a));
-    assertEquals(1, p.bind(a).length);
-    assertEquals("foo@example.com", p.bind(a)[0]);
-    assertEquals("foo@example.com", p.replace(a));
-  }
-
-  @Test
-  public void replaceToUpperCaseLocalName() {
-    final ParameterizedString p = new ParameterizedString("${a.toUpperCase.localPart}");
-    assertEquals(1, p.getParameterNames().size());
-    assertTrue(p.getParameterNames().contains("a"));
-
-    final Map<String, String> a = new HashMap<>();
-
-    a.put("a", "foo@example.com");
-    assertNotNull(p.bind(a));
-    assertEquals(1, p.bind(a).length);
-    assertEquals("FOO", p.bind(a)[0]);
-    assertEquals("FOO", p.replace(a));
-
-    a.put("a", "FOO@EXAMPLE.COM");
-    assertNotNull(p.bind(a));
-    assertEquals(1, p.bind(a).length);
-    assertEquals("FOO", p.bind(a)[0]);
-    assertEquals("FOO", p.replace(a));
-  }
-
-  @Test
-  public void replaceToUpperCaseAnUndefinedMethod() {
-    final ParameterizedString p = new ParameterizedString("${a.toUpperCase.anUndefinedMethod}");
-    assertEquals(1, p.getParameterNames().size());
-    assertTrue(p.getParameterNames().contains("a"));
-
-    final Map<String, String> a = new HashMap<>();
-
-    a.put("a", "foo@example.com");
-    assertNotNull(p.bind(a));
-    assertEquals(1, p.bind(a).length);
-    assertEquals("FOO@EXAMPLE.COM", p.bind(a)[0]);
-    assertEquals("FOO@EXAMPLE.COM", p.replace(a));
-
-    a.put("a", "FOO@EXAMPLE.COM");
-    assertNotNull(p.bind(a));
-    assertEquals(1, p.bind(a).length);
-    assertEquals("FOO@EXAMPLE.COM", p.bind(a)[0]);
-    assertEquals("FOO@EXAMPLE.COM", p.replace(a));
-  }
-
-  @Test
-  public void replaceLocalNameToUpperCase() {
-    final ParameterizedString p = new ParameterizedString("${a.localPart.toUpperCase}");
-    assertEquals(1, p.getParameterNames().size());
-    assertTrue(p.getParameterNames().contains("a"));
-
-    final Map<String, String> a = new HashMap<>();
-
-    a.put("a", "foo@example.com");
-    assertNotNull(p.bind(a));
-    assertEquals(1, p.bind(a).length);
-    assertEquals("FOO", p.bind(a)[0]);
-    assertEquals("FOO", p.replace(a));
-
-    a.put("a", "FOO@EXAMPLE.COM");
-    assertNotNull(p.bind(a));
-    assertEquals(1, p.bind(a).length);
-    assertEquals("FOO", p.bind(a)[0]);
-    assertEquals("FOO", p.replace(a));
-  }
-
-  @Test
-  public void replaceLocalNameToLowerCase() {
-    final ParameterizedString p = new ParameterizedString("${a.localPart.toLowerCase}");
-    assertEquals(1, p.getParameterNames().size());
-    assertTrue(p.getParameterNames().contains("a"));
-
-    final Map<String, String> a = new HashMap<>();
-
-    a.put("a", "FOO@EXAMPLE.COM");
-    assertNotNull(p.bind(a));
-    assertEquals(1, p.bind(a).length);
-    assertEquals("foo", p.bind(a)[0]);
-    assertEquals("foo", p.replace(a));
-
-    a.put("a", "foo@example.com");
-    assertNotNull(p.bind(a));
-    assertEquals(1, p.bind(a).length);
-    assertEquals("foo", p.bind(a)[0]);
-    assertEquals("foo", p.replace(a));
-  }
-
-  @Test
-  public void replaceLocalNameAnUndefinedMethod() {
-    final ParameterizedString p = new ParameterizedString("${a.localPart.anUndefinedMethod}");
-    assertEquals(1, p.getParameterNames().size());
-    assertTrue(p.getParameterNames().contains("a"));
-
-    final Map<String, String> a = new HashMap<>();
-
-    a.put("a", "FOO@EXAMPLE.COM");
-    assertNotNull(p.bind(a));
-    assertEquals(1, p.bind(a).length);
-    assertEquals("FOO", p.bind(a)[0]);
-    assertEquals("FOO", p.replace(a));
-
-    a.put("a", "foo@example.com");
-    assertNotNull(p.bind(a));
-    assertEquals(1, p.bind(a).length);
-    assertEquals("foo", p.bind(a)[0]);
-    assertEquals("foo", p.replace(a));
-  }
-
-  @Test
-  public void replaceToLowerCaseToUpperCase() {
-    final ParameterizedString p = new ParameterizedString("${a.toLowerCase.toUpperCase}");
-    assertEquals(1, p.getParameterNames().size());
-    assertTrue(p.getParameterNames().contains("a"));
-
-    final Map<String, String> a = new HashMap<>();
-
-    a.put("a", "FOO@EXAMPLE.COM");
-    assertNotNull(p.bind(a));
-    assertEquals(1, p.bind(a).length);
-    assertEquals("FOO@EXAMPLE.COM", p.bind(a)[0]);
-    assertEquals("FOO@EXAMPLE.COM", p.replace(a));
-
-    a.put("a", "foo@example.com");
-    assertNotNull(p.bind(a));
-    assertEquals(1, p.bind(a).length);
-    assertEquals("FOO@EXAMPLE.COM", p.bind(a)[0]);
-    assertEquals("FOO@EXAMPLE.COM", p.replace(a));
-  }
-
-  @Test
-  public void replaceToLowerCaseLocalName() {
-    final ParameterizedString p = new ParameterizedString("${a.toLowerCase.localPart}");
-    assertEquals(1, p.getParameterNames().size());
-    assertTrue(p.getParameterNames().contains("a"));
-
-    final Map<String, String> a = new HashMap<>();
-
-    a.put("a", "FOO@EXAMPLE.COM");
-    assertNotNull(p.bind(a));
-    assertEquals(1, p.bind(a).length);
-    assertEquals("foo", p.bind(a)[0]);
-    assertEquals("foo", p.replace(a));
-
-    a.put("a", "foo@example.com");
-    assertNotNull(p.bind(a));
-    assertEquals(1, p.bind(a).length);
-    assertEquals("foo", p.bind(a)[0]);
-    assertEquals("foo", p.replace(a));
-  }
-
-  @Test
-  public void replaceToLowerCaseAnUndefinedMethod() {
-    final ParameterizedString p = new ParameterizedString("${a.toLowerCase.anUndefinedMethod}");
-    assertEquals(1, p.getParameterNames().size());
-    assertTrue(p.getParameterNames().contains("a"));
-
-    final Map<String, String> a = new HashMap<>();
-
-    a.put("a", "foo@example.com");
-    assertNotNull(p.bind(a));
-    assertEquals(1, p.bind(a).length);
-    assertEquals("foo@example.com", p.bind(a)[0]);
-    assertEquals("foo@example.com", p.replace(a));
-
-    a.put("a", "FOO@EXAMPLE.COM");
-    assertNotNull(p.bind(a));
-    assertEquals(1, p.bind(a).length);
-    assertEquals("foo@example.com", p.bind(a)[0]);
-    assertEquals("foo@example.com", p.replace(a));
-  }
-
-  @Test
-  public void replaceSubmitTooltipWithVariables() {
-    ParameterizedString p = new ParameterizedString("Submit patch set ${patchSet} into ${branch}");
-    assertEquals(2, p.getParameterNames().size());
-    assertTrue(p.getParameterNames().contains("patchSet"));
-
-    Map<String, String> params =
-        ImmutableMap.of(
-            "patchSet", "42",
-            "branch", "foo");
-    assertNotNull(p.bind(params));
-    assertEquals(2, p.bind(params).length);
-    assertEquals("42", p.bind(params)[0]);
-    assertEquals("foo", p.bind(params)[1]);
-    assertEquals("Submit patch set 42 into foo", p.replace(params));
-  }
-
-  @Test
-  public void replaceSubmitTooltipWithoutVariables() {
-    ParameterizedString p = new ParameterizedString("Submit patch set 40 into master");
-    Map<String, String> params =
-        ImmutableMap.of(
-            "patchSet", "42",
-            "branch", "foo");
-    assertEquals(0, p.bind(params).length);
-    assertEquals("Submit patch set 40 into master", p.replace(params));
-  }
-}
diff --git a/gerrit-elasticsearch/BUILD b/gerrit-elasticsearch/BUILD
deleted file mode 100644
index 5936775..0000000
--- a/gerrit-elasticsearch/BUILD
+++ /dev/null
@@ -1,127 +0,0 @@
-load("//tools/bzl:junit.bzl", "junit_tests")
-
-java_library(
-    name = "elasticsearch",
-    srcs = glob(["src/main/java/**/*.java"]),
-    visibility = ["//visibility:public"],
-    deps = [
-        "//gerrit-common:annotations",
-        "//gerrit-extension-api:api",
-        "//gerrit-index:index",
-        "//gerrit-index:query_exception",
-        "//gerrit-reviewdb:server",
-        "//gerrit-server:server",
-        "//lib:gson",
-        "//lib:guava",
-        "//lib:gwtorm",
-        "//lib/commons:codec",
-        "//lib/elasticsearch-rest-client",
-        "//lib/guice",
-        "//lib/guice:guice-assistedinject",
-        "//lib/httpcomponents:httpasyncclient",
-        "//lib/httpcomponents:httpclient",
-        "//lib/httpcomponents:httpcore",
-        "//lib/httpcomponents:httpcore-nio",
-        "//lib/jackson:jackson-core",
-        "//lib/jgit/org.eclipse.jgit:jgit",
-        "//lib/log:api",
-    ],
-)
-
-java_library(
-    name = "elasticsearch_test_utils",
-    testonly = 1,
-    srcs = glob([
-        "src/test/java/**/ElasticTestUtils.java",
-        "src/test/java/**/ElasticContainer.java",
-    ]),
-    visibility = ["//visibility:public"],
-    deps = [
-        ":elasticsearch",
-        "//gerrit-index:index",
-        "//gerrit-reviewdb:server",
-        "//gerrit-server:server",
-        "//lib:truth",
-        "//lib/guice",
-        "//lib/httpcomponents:httpcore",
-        "//lib/jgit/org.eclipse.jgit:jgit",
-        "//lib/testcontainers",
-        "//lib/testcontainers:testcontainers-elasticsearch",
-    ],
-)
-
-ELASTICSEARCH_DEPS = [
-    ":elasticsearch",
-    ":elasticsearch_test_utils",
-    "//gerrit-server:query_tests_code",
-    "//gerrit-server:testutil",
-    "//lib:truth",
-    "//lib/guice",
-    "//lib/jgit/org.eclipse.jgit:jgit",
-]
-
-TYPES = [
-    "account",
-    "change",
-    "group",
-]
-
-SUFFIX = "sTest.java"
-
-ELASTICSEARCH_TESTS_V5 = {i: "src/test/java/com/google/gerrit/elasticsearch/ElasticV5Query" + i.capitalize() + SUFFIX for i in TYPES}
-
-ELASTICSEARCH_TESTS_V6 = {i: "src/test/java/com/google/gerrit/elasticsearch/ElasticV6Query" + i.capitalize() + SUFFIX for i in TYPES}
-
-ELASTICSEARCH_TESTS_V7 = {i: "src/test/java/com/google/gerrit/elasticsearch/ElasticV7Query" + i.capitalize() + SUFFIX for i in TYPES}
-
-ELASTICSEARCH_TAGS = [
-    "docker",
-    "elastic",
-    "exclusive",
-]
-
-[junit_tests(
-    name = "elasticsearch_query_%ss_test_v5" % name,
-    size = "large",
-    srcs = [src],
-    tags = ELASTICSEARCH_TAGS,
-    deps = ELASTICSEARCH_DEPS,
-) for name, src in ELASTICSEARCH_TESTS_V5.items()]
-
-[junit_tests(
-    name = "elasticsearch_query_%ss_test_v6" % name,
-    size = "large",
-    srcs = [src],
-    tags = ELASTICSEARCH_TAGS,
-    deps = ELASTICSEARCH_DEPS,
-) for name, src in ELASTICSEARCH_TESTS_V6.items()]
-
-[junit_tests(
-    name = "elasticsearch_query_%ss_test_v7" % name,
-    size = "large",
-    srcs = [src],
-    tags = ELASTICSEARCH_TAGS,
-    deps = ELASTICSEARCH_DEPS + [
-        "//lib/httpcomponents:httpasyncclient",
-        "//lib/httpcomponents:httpclient",
-    ],
-) for name, src in ELASTICSEARCH_TESTS_V7.items()]
-
-junit_tests(
-    name = "elasticsearch_tests",
-    size = "small",
-    srcs = glob(
-        ["src/test/java/com/google/gerrit/elasticsearch/*Test.java"],
-        exclude = ["src/test/java/com/google/gerrit/elasticsearch/Elastic*Query*" + SUFFIX],
-    ),
-    tags = ["elastic"],
-    deps = [
-        ":elasticsearch",
-        ":elasticsearch_test_utils",
-        "//gerrit-server:testutil",
-        "//lib:guava",
-        "//lib:truth",
-        "//lib/guice",
-        "//lib/jgit/org.eclipse.jgit:jgit",
-    ],
-)
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java
deleted file mode 100644
index 4f811b9..0000000
--- a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java
+++ /dev/null
@@ -1,274 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.elasticsearch;
-
-import static com.google.gson.FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.apache.commons.codec.binary.Base64.decodeBase64;
-
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.io.CharStreams;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.elasticsearch.ElasticMapping.MappingProperties;
-import com.google.gerrit.elasticsearch.builders.SearchSourceBuilder;
-import com.google.gerrit.elasticsearch.bulk.DeleteRequest;
-import com.google.gerrit.index.Index;
-import com.google.gerrit.index.Schema;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.index.IndexUtils;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
-import com.google.gwtorm.protobuf.ProtobufCodec;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpStatus;
-import org.apache.http.entity.ContentType;
-import org.apache.http.nio.entity.NStringEntity;
-import org.elasticsearch.client.Request;
-import org.elasticsearch.client.Response;
-
-abstract class AbstractElasticIndex<K, V> implements Index<K, V> {
-  protected static final String BULK = "_bulk";
-  protected static final String MAPPINGS = "mappings";
-  protected static final String ORDER = "order";
-  protected static final String SEARCH = "_search";
-  protected static final String SETTINGS = "settings";
-
-  protected static <T> List<T> decodeProtos(
-      JsonObject doc, String fieldName, ProtobufCodec<T> codec) {
-    JsonArray field = doc.getAsJsonArray(fieldName);
-    if (field == null) {
-      return null;
-    }
-    return FluentIterable.from(field)
-        .transform(i -> codec.decode(decodeBase64(i.toString())))
-        .toList();
-  }
-
-  static String getContent(Response response) throws IOException {
-    HttpEntity responseEntity = response.getEntity();
-    String content = "";
-    if (responseEntity != null) {
-      InputStream contentStream = responseEntity.getContent();
-      try (Reader reader = new InputStreamReader(contentStream, UTF_8)) {
-        content = CharStreams.toString(reader);
-      }
-    }
-    return content;
-  }
-
-  private final ElasticConfiguration config;
-  private final Schema<V> schema;
-  private final SitePaths sitePaths;
-  private final String indexNameRaw;
-
-  protected final String type;
-  protected final ElasticRestClientProvider client;
-  protected final String indexName;
-  protected final Gson gson;
-  protected final ElasticQueryBuilder queryBuilder;
-
-  AbstractElasticIndex(
-      ElasticConfiguration config,
-      SitePaths sitePaths,
-      Schema<V> schema,
-      ElasticRestClientProvider client,
-      String indexName,
-      String indexType) {
-    this.config = config;
-    this.sitePaths = sitePaths;
-    this.schema = schema;
-    this.gson = new GsonBuilder().setFieldNamingPolicy(LOWER_CASE_WITH_UNDERSCORES).create();
-    this.queryBuilder = new ElasticQueryBuilder();
-    this.indexName = config.getIndexName(indexName, schema.getVersion());
-    this.indexNameRaw = indexName;
-    this.client = client;
-    this.type = client.adapter().getType(indexType);
-  }
-
-  AbstractElasticIndex(
-      ElasticConfiguration cfg,
-      SitePaths sitePaths,
-      Schema<V> schema,
-      ElasticRestClientProvider client,
-      String indexName) {
-    this(cfg, sitePaths, schema, client, indexName, indexName);
-  }
-
-  @Override
-  public Schema<V> getSchema() {
-    return schema;
-  }
-
-  @Override
-  public void close() {
-    // Do nothing. Client is closed by the provider.
-  }
-
-  @Override
-  public void markReady(boolean ready) throws IOException {
-    IndexUtils.setReady(sitePaths, indexNameRaw, schema.getVersion(), ready);
-  }
-
-  @Override
-  public void delete(K id) throws IOException {
-    String uri = getURI(type, BULK);
-    Response response = postRequest(uri, getDeleteActions(id), getRefreshParam());
-    int statusCode = response.getStatusLine().getStatusCode();
-    if (statusCode != HttpStatus.SC_OK) {
-      throw new IOException(
-          String.format("Failed to delete %s from index %s: %s", id, indexName, statusCode));
-    }
-  }
-
-  @Override
-  public void deleteAll() throws IOException {
-    // Delete the index, if it exists.
-    String endpoint = indexName + client.adapter().indicesExistParam();
-    Response response = performRequest("HEAD", endpoint);
-    int statusCode = response.getStatusLine().getStatusCode();
-    if (statusCode == HttpStatus.SC_OK) {
-      response = performRequest("DELETE", indexName);
-      statusCode = response.getStatusLine().getStatusCode();
-      if (statusCode != HttpStatus.SC_OK) {
-        throw new IOException(
-            String.format("Failed to delete index %s: %s", indexName, statusCode));
-      }
-    }
-
-    // Recreate the index.
-    String indexCreationFields = concatJsonString(getSettings(), getMappings());
-    response =
-        performRequest(
-            "PUT", indexName + client.adapter().includeTypeNameParam(), indexCreationFields);
-    statusCode = response.getStatusLine().getStatusCode();
-    if (statusCode != HttpStatus.SC_OK) {
-      String error = String.format("Failed to create index %s: %s", indexName, statusCode);
-      throw new IOException(error);
-    }
-  }
-
-  protected abstract String getDeleteActions(K id);
-
-  protected abstract String getMappings();
-
-  private String getSettings() {
-    return gson.toJson(ImmutableMap.of(SETTINGS, ElasticSetting.createSetting(config)));
-  }
-
-  protected abstract String getId(V v);
-
-  protected String getMappingsForSingleType(String candidateType, MappingProperties properties) {
-    return getMappingsFor(client.adapter().getType(candidateType), properties);
-  }
-
-  protected String getMappingsFor(String type, MappingProperties properties) {
-    JsonObject mappingType = new JsonObject();
-    mappingType.add(type, gson.toJsonTree(properties));
-    JsonObject mappings = new JsonObject();
-    mappings.add(MAPPINGS, gson.toJsonTree(mappingType));
-    return gson.toJson(mappings);
-  }
-
-  protected String delete(String type, K id) {
-    return new DeleteRequest(id.toString(), indexName, type, client.adapter()).toString();
-  }
-
-  protected void addNamedElement(String name, JsonObject element, JsonArray array) {
-    JsonObject arrayElement = new JsonObject();
-    arrayElement.add(name, element);
-    array.add(arrayElement);
-  }
-
-  protected Map<String, String> getRefreshParam() {
-    Map<String, String> params = new HashMap<>();
-    params.put("refresh", "true");
-    return params;
-  }
-
-  protected String getSearch(SearchSourceBuilder searchSource, JsonArray sortArray) {
-    JsonObject search = new JsonParser().parse(searchSource.toString()).getAsJsonObject();
-    search.add("sort", sortArray);
-    return gson.toJson(search);
-  }
-
-  protected JsonArray getSortArray(String idFieldName) {
-    JsonObject properties = new JsonObject();
-    properties.addProperty(ORDER, "asc");
-    client.adapter().setIgnoreUnmapped(properties);
-
-    JsonArray sortArray = new JsonArray();
-    addNamedElement(idFieldName, properties, sortArray);
-    return sortArray;
-  }
-
-  protected String getURI(String type, String request) throws UnsupportedEncodingException {
-    String encodedIndexName = URLEncoder.encode(indexName, UTF_8.toString());
-    if (SEARCH.equals(request) && client.adapter().omitTypeFromSearch()) {
-      return encodedIndexName + "/" + request;
-    }
-    String encodedType = URLEncoder.encode(type, UTF_8.toString());
-    return encodedIndexName + "/" + encodedType + "/" + request;
-  }
-
-  protected Response postRequest(String uri, Object payload) throws IOException {
-    return performRequest("POST", uri, payload);
-  }
-
-  protected Response postRequest(String uri, Object payload, Map<String, String> params)
-      throws IOException {
-    return performRequest("POST", uri, payload, params);
-  }
-
-  private String concatJsonString(String target, String addition) {
-    return target.substring(0, target.length() - 1) + "," + addition.substring(1);
-  }
-
-  private Response performRequest(String method, String uri) throws IOException {
-    return performRequest(method, uri, null);
-  }
-
-  private Response performRequest(String method, String uri, @Nullable Object payload)
-      throws IOException {
-    return performRequest(method, uri, payload, Collections.emptyMap());
-  }
-
-  private Response performRequest(
-      String method, String uri, @Nullable Object payload, Map<String, String> params)
-      throws IOException {
-    Request request = new Request(method, uri.startsWith("/") ? uri : "/" + uri);
-    if (payload != null) {
-      String payloadStr = payload instanceof String ? (String) payload : payload.toString();
-      request.setEntity(new NStringEntity(payloadStr, ContentType.APPLICATION_JSON));
-    }
-    for (Map.Entry<String, String> entry : params.entrySet()) {
-      request.addParameter(entry.getKey(), entry.getValue());
-    }
-    return client.get().performRequest(request);
-  }
-}
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticAccountIndex.java b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticAccountIndex.java
deleted file mode 100644
index 722e6d8..0000000
--- a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticAccountIndex.java
+++ /dev/null
@@ -1,207 +0,0 @@
-// 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.
-
-package com.google.gerrit.elasticsearch;
-
-import static com.google.gerrit.server.index.account.AccountField.ID;
-
-import com.google.common.collect.Lists;
-import com.google.gerrit.elasticsearch.ElasticMapping.MappingProperties;
-import com.google.gerrit.elasticsearch.builders.QueryBuilder;
-import com.google.gerrit.elasticsearch.builders.SearchSourceBuilder;
-import com.google.gerrit.elasticsearch.bulk.BulkRequest;
-import com.google.gerrit.elasticsearch.bulk.IndexRequest;
-import com.google.gerrit.elasticsearch.bulk.UpdateRequest;
-import com.google.gerrit.index.QueryOptions;
-import com.google.gerrit.index.Schema;
-import com.google.gerrit.index.query.DataSource;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.index.query.QueryParseException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.index.IndexUtils;
-import com.google.gerrit.server.index.account.AccountField;
-import com.google.gerrit.server.index.account.AccountIndex;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.ResultSet;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import com.google.inject.assistedinject.AssistedInject;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import org.apache.http.HttpStatus;
-import org.apache.http.StatusLine;
-import org.elasticsearch.client.Response;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ElasticAccountIndex extends AbstractElasticIndex<Account.Id, AccountState>
-    implements AccountIndex {
-  private static final Logger log = LoggerFactory.getLogger(ElasticAccountIndex.class);
-
-  static class AccountMapping {
-    final MappingProperties accounts;
-
-    AccountMapping(Schema<AccountState> schema, ElasticQueryAdapter adapter) {
-      this.accounts = ElasticMapping.createMapping(schema, adapter);
-    }
-  }
-
-  private static final String ACCOUNTS = "accounts";
-
-  private final AccountMapping mapping;
-  private final Provider<AccountCache> accountCache;
-  private final Schema<AccountState> schema;
-
-  @AssistedInject
-  ElasticAccountIndex(
-      ElasticConfiguration cfg,
-      SitePaths sitePaths,
-      Provider<AccountCache> accountCache,
-      ElasticRestClientProvider client,
-      @Assisted Schema<AccountState> schema) {
-    super(cfg, sitePaths, schema, client, ACCOUNTS);
-    this.accountCache = accountCache;
-    this.mapping = new AccountMapping(schema, client.adapter());
-    this.schema = schema;
-  }
-
-  @Override
-  public void replace(AccountState as) throws IOException {
-    BulkRequest bulk =
-        new IndexRequest(getId(as), indexName, type, client.adapter())
-            .add(new UpdateRequest<>(schema, as));
-
-    String uri = getURI(type, BULK);
-    Response response = postRequest(uri, bulk, getRefreshParam());
-    int statusCode = response.getStatusLine().getStatusCode();
-    if (statusCode != HttpStatus.SC_OK) {
-      throw new IOException(
-          String.format(
-              "Failed to replace account %s in index %s: %s",
-              as.getAccount().getId(), indexName, statusCode));
-    }
-  }
-
-  @Override
-  public DataSource<AccountState> getSource(Predicate<AccountState> p, QueryOptions opts)
-      throws QueryParseException {
-    return new QuerySource(p, opts);
-  }
-
-  @Override
-  protected String getDeleteActions(Account.Id a) {
-    return delete(type, a);
-  }
-
-  @Override
-  protected String getMappings() {
-    return getMappingsForSingleType(ACCOUNTS, mapping.accounts);
-  }
-
-  @Override
-  protected String getId(AccountState as) {
-    return as.getAccount().getId().toString();
-  }
-
-  private class QuerySource implements DataSource<AccountState> {
-    private final String search;
-    private final Set<String> fields;
-
-    QuerySource(Predicate<AccountState> p, QueryOptions opts) throws QueryParseException {
-      QueryBuilder qb = queryBuilder.toQueryBuilder(p);
-      fields = IndexUtils.accountFields(opts);
-      SearchSourceBuilder searchSource =
-          new SearchSourceBuilder(client.adapter())
-              .query(qb)
-              .from(opts.start())
-              .size(opts.limit())
-              .fields(Lists.newArrayList(fields));
-
-      JsonArray sortArray = getSortArray(AccountField.ID.getName());
-      search = getSearch(searchSource, sortArray);
-    }
-
-    @Override
-    public int getCardinality() {
-      return 10;
-    }
-
-    @Override
-    public ResultSet<AccountState> read() throws OrmException {
-      try {
-        List<AccountState> results = Collections.emptyList();
-        String uri = getURI(type, SEARCH);
-        Response response = postRequest(uri, search);
-        StatusLine statusLine = response.getStatusLine();
-        if (statusLine.getStatusCode() == HttpStatus.SC_OK) {
-          String content = getContent(response);
-          JsonObject obj =
-              new JsonParser().parse(content).getAsJsonObject().getAsJsonObject("hits");
-          if (obj.get("hits") != null) {
-            JsonArray json = obj.getAsJsonArray("hits");
-            results = Lists.newArrayListWithCapacity(json.size());
-            for (int i = 0; i < json.size(); i++) {
-              results.add(toAccountState(json.get(i)));
-            }
-          }
-        } else {
-          log.error(statusLine.getReasonPhrase());
-        }
-        final List<AccountState> r = Collections.unmodifiableList(results);
-        return new ResultSet<AccountState>() {
-          @Override
-          public Iterator<AccountState> iterator() {
-            return r.iterator();
-          }
-
-          @Override
-          public List<AccountState> toList() {
-            return r;
-          }
-
-          @Override
-          public void close() {
-            // Do nothing.
-          }
-        };
-      } catch (IOException e) {
-        throw new OrmException(e);
-      }
-    }
-
-    private AccountState toAccountState(JsonElement json) {
-      JsonElement source = json.getAsJsonObject().get("_source");
-      if (source == null) {
-        source = json.getAsJsonObject().get("fields");
-      }
-
-      Account.Id id = new Account.Id(source.getAsJsonObject().get(ID.getName()).getAsInt());
-      // Use the AccountCache rather than depending on any stored fields in the
-      // document (of which there shouldn't be any). The most expensive part to
-      // compute anyway is the effective group IDs, and we don't have a good way
-      // to reindex when those change.
-      return accountCache.get().get(id);
-    }
-  }
-}
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticChangeIndex.java b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticChangeIndex.java
deleted file mode 100644
index 264822e..0000000
--- a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticChangeIndex.java
+++ /dev/null
@@ -1,465 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.elasticsearch;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.gerrit.server.index.change.ChangeField.APPROVAL_CODEC;
-import static com.google.gerrit.server.index.change.ChangeField.CHANGE_CODEC;
-import static com.google.gerrit.server.index.change.ChangeField.PATCH_SET_CODEC;
-import static com.google.gerrit.server.index.change.ChangeIndexRewriter.CLOSED_STATUSES;
-import static com.google.gerrit.server.index.change.ChangeIndexRewriter.OPEN_STATUSES;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.apache.commons.codec.binary.Base64.decodeBase64;
-
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.Lists;
-import com.google.common.collect.MultimapBuilder;
-import com.google.common.collect.Sets;
-import com.google.gerrit.elasticsearch.ElasticMapping.MappingProperties;
-import com.google.gerrit.elasticsearch.builders.QueryBuilder;
-import com.google.gerrit.elasticsearch.builders.SearchSourceBuilder;
-import com.google.gerrit.elasticsearch.bulk.BulkRequest;
-import com.google.gerrit.elasticsearch.bulk.DeleteRequest;
-import com.google.gerrit.elasticsearch.bulk.IndexRequest;
-import com.google.gerrit.elasticsearch.bulk.UpdateRequest;
-import com.google.gerrit.index.QueryOptions;
-import com.google.gerrit.index.Schema;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.index.query.QueryParseException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Change.Id;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ReviewerByEmailSet;
-import com.google.gerrit.server.ReviewerSet;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.index.IndexUtils;
-import com.google.gerrit.server.index.change.ChangeField;
-import com.google.gerrit.server.index.change.ChangeIndex;
-import com.google.gerrit.server.index.change.ChangeIndexRewriter;
-import com.google.gerrit.server.project.SubmitRuleOptions;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.ChangeDataSource;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.ResultSet;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import org.apache.commons.codec.binary.Base64;
-import org.apache.http.HttpStatus;
-import org.apache.http.StatusLine;
-import org.elasticsearch.client.Response;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Secondary index implementation using Elasticsearch. */
-class ElasticChangeIndex extends AbstractElasticIndex<Change.Id, ChangeData>
-    implements ChangeIndex {
-  private static final Logger log = LoggerFactory.getLogger(ElasticChangeIndex.class);
-
-  static class ChangeMapping {
-    final MappingProperties changes;
-    final MappingProperties openChanges;
-    final MappingProperties closedChanges;
-
-    ChangeMapping(Schema<ChangeData> schema, ElasticQueryAdapter adapter) {
-      MappingProperties mapping = ElasticMapping.createMapping(schema, adapter);
-      this.changes = mapping;
-      this.openChanges = mapping;
-      this.closedChanges = mapping;
-    }
-  }
-
-  private static final String CHANGES = "changes";
-  private static final String OPEN_CHANGES = "open_" + CHANGES;
-  private static final String CLOSED_CHANGES = "closed_" + CHANGES;
-  private static final String ALL_CHANGES = OPEN_CHANGES + "," + CLOSED_CHANGES;
-  private final ChangeMapping mapping;
-  private final Provider<ReviewDb> db;
-  private final ChangeData.Factory changeDataFactory;
-  private final Schema<ChangeData> schema;
-
-  @Inject
-  ElasticChangeIndex(
-      ElasticConfiguration cfg,
-      Provider<ReviewDb> db,
-      ChangeData.Factory changeDataFactory,
-      SitePaths sitePaths,
-      ElasticRestClientProvider client,
-      @Assisted Schema<ChangeData> schema) {
-    super(cfg, sitePaths, schema, client, CHANGES, ALL_CHANGES);
-    this.db = db;
-    this.changeDataFactory = changeDataFactory;
-    this.schema = schema;
-    this.mapping = new ChangeMapping(schema, client.adapter());
-  }
-
-  @Override
-  public void replace(ChangeData cd) throws IOException {
-    String deleteIndex;
-    String insertIndex;
-
-    try {
-      if (cd.change().getStatus().isOpen()) {
-        insertIndex = OPEN_CHANGES;
-        deleteIndex = CLOSED_CHANGES;
-      } else {
-        insertIndex = CLOSED_CHANGES;
-        deleteIndex = OPEN_CHANGES;
-      }
-    } catch (OrmException e) {
-      throw new IOException(e);
-    }
-
-    ElasticQueryAdapter adapter = client.adapter();
-    BulkRequest bulk =
-        new IndexRequest(getId(cd), indexName, adapter.getType(insertIndex), adapter)
-            .add(new UpdateRequest<>(schema, cd));
-    if (!adapter.usePostV5Type()) {
-      bulk.add(new DeleteRequest(cd.getId().toString(), indexName, deleteIndex, adapter));
-    }
-
-    String uri = getURI(type, BULK);
-    Response response = postRequest(uri, bulk, getRefreshParam());
-    int statusCode = response.getStatusLine().getStatusCode();
-    if (statusCode != HttpStatus.SC_OK) {
-      throw new IOException(
-          String.format(
-              "Failed to replace change %s in index %s: %s", cd.getId(), indexName, statusCode));
-    }
-  }
-
-  @Override
-  public ChangeDataSource getSource(Predicate<ChangeData> p, QueryOptions opts)
-      throws QueryParseException {
-    Set<Change.Status> statuses = ChangeIndexRewriter.getPossibleStatus(p);
-    List<String> indexes = Lists.newArrayListWithCapacity(2);
-    if (client.adapter().usePostV5Type()) {
-      if (!Sets.intersection(statuses, OPEN_STATUSES).isEmpty()
-          || !Sets.intersection(statuses, CLOSED_STATUSES).isEmpty()) {
-        indexes.add(ElasticQueryAdapter.POST_V5_TYPE);
-      }
-    } else {
-      if (!Sets.intersection(statuses, OPEN_STATUSES).isEmpty()) {
-        indexes.add(OPEN_CHANGES);
-      }
-      if (!Sets.intersection(statuses, CLOSED_STATUSES).isEmpty()) {
-        indexes.add(CLOSED_CHANGES);
-      }
-    }
-    return new QuerySource(indexes, p, opts);
-  }
-
-  @Override
-  protected String getDeleteActions(Id c) {
-    if (client.adapter().usePostV5Type()) {
-      return delete(ElasticQueryAdapter.POST_V5_TYPE, c);
-    }
-    return delete(OPEN_CHANGES, c) + delete(CLOSED_CHANGES, c);
-  }
-
-  @Override
-  protected String getMappings() {
-    if (client.adapter().usePostV5Type()) {
-      return getMappingsFor(ElasticQueryAdapter.POST_V5_TYPE, mapping.changes);
-    }
-    return gson.toJson(ImmutableMap.of(MAPPINGS, mapping));
-  }
-
-  @Override
-  protected String getId(ChangeData cd) {
-    return cd.getId().toString();
-  }
-
-  private class QuerySource implements ChangeDataSource {
-    private final String search;
-    private final Set<String> fields;
-    private final List<String> types;
-
-    QuerySource(List<String> types, Predicate<ChangeData> p, QueryOptions opts)
-        throws QueryParseException {
-      QueryBuilder qb = queryBuilder.toQueryBuilder(p);
-      fields = IndexUtils.changeFields(opts);
-      SearchSourceBuilder searchSource =
-          new SearchSourceBuilder(client.adapter())
-              .query(qb)
-              .from(opts.start())
-              .size(opts.limit())
-              .fields(Lists.newArrayList(fields));
-
-      search = getSearch(searchSource, getSortArray());
-      this.types = types;
-    }
-
-    @Override
-    public int getCardinality() {
-      return 10;
-    }
-
-    @Override
-    public ResultSet<ChangeData> read() throws OrmException {
-      try {
-        List<ChangeData> results = Collections.emptyList();
-        String uri = getURI(types);
-        Response response = postRequest(uri, search);
-        StatusLine statusLine = response.getStatusLine();
-        if (statusLine.getStatusCode() == HttpStatus.SC_OK) {
-          String content = getContent(response);
-          JsonObject obj =
-              new JsonParser().parse(content).getAsJsonObject().getAsJsonObject("hits");
-          if (obj.get("hits") != null) {
-            JsonArray json = obj.getAsJsonArray("hits");
-            results = Lists.newArrayListWithCapacity(json.size());
-            for (int i = 0; i < json.size(); i++) {
-              results.add(toChangeData(json.get(i)));
-            }
-          }
-        } else {
-          log.error(statusLine.getReasonPhrase());
-        }
-        final List<ChangeData> r = Collections.unmodifiableList(results);
-        return new ResultSet<ChangeData>() {
-          @Override
-          public Iterator<ChangeData> iterator() {
-            return r.iterator();
-          }
-
-          @Override
-          public List<ChangeData> toList() {
-            return r;
-          }
-
-          @Override
-          public void close() {
-            // Do nothing.
-          }
-        };
-      } catch (IOException e) {
-        throw new OrmException(e);
-      }
-    }
-
-    @Override
-    public boolean hasChange() {
-      return false;
-    }
-
-    private ChangeData toChangeData(JsonElement json) {
-      JsonElement sourceElement = json.getAsJsonObject().get("_source");
-      if (sourceElement == null) {
-        sourceElement = json.getAsJsonObject().get("fields");
-      }
-      JsonObject source = sourceElement.getAsJsonObject();
-      JsonElement c = source.get(ChangeField.CHANGE.getName());
-
-      if (c == null) {
-        int id = source.get(ChangeField.LEGACY_ID.getName()).getAsInt();
-        // IndexUtils#changeFields ensures either CHANGE or PROJECT is always present.
-        String projectName = checkNotNull(source.get(ChangeField.PROJECT.getName()).getAsString());
-        return changeDataFactory.create(
-            db.get(), new Project.NameKey(projectName), new Change.Id(id));
-      }
-
-      ChangeData cd =
-          changeDataFactory.create(
-              db.get(), CHANGE_CODEC.decode(Base64.decodeBase64(c.getAsString())));
-
-      // Patch sets.
-      cd.setPatchSets(decodeProtos(source, ChangeField.PATCH_SET.getName(), PATCH_SET_CODEC));
-
-      // Approvals.
-      if (source.get(ChangeField.APPROVAL.getName()) != null) {
-        cd.setCurrentApprovals(
-            decodeProtos(source, ChangeField.APPROVAL.getName(), APPROVAL_CODEC));
-      } else if (fields.contains(ChangeField.APPROVAL.getName())) {
-        cd.setCurrentApprovals(Collections.emptyList());
-      }
-
-      JsonElement addedElement = source.get(ChangeField.ADDED.getName());
-      JsonElement deletedElement = source.get(ChangeField.DELETED.getName());
-      if (addedElement != null && deletedElement != null) {
-        // Changed lines.
-        int added = addedElement.getAsInt();
-        int deleted = deletedElement.getAsInt();
-        cd.setChangedLines(added, deleted);
-      }
-
-      // Star.
-      JsonElement starredElement = source.get(ChangeField.STAR.getName());
-      if (starredElement != null) {
-        ListMultimap<Account.Id, String> stars =
-            MultimapBuilder.hashKeys().arrayListValues().build();
-        JsonArray starBy = starredElement.getAsJsonArray();
-        if (starBy.size() > 0) {
-          for (int i = 0; i < starBy.size(); i++) {
-            String[] indexableFields = starBy.get(i).getAsString().split(":");
-            Account.Id id = Account.Id.parse(indexableFields[0]);
-            stars.put(id, indexableFields[1]);
-          }
-        }
-        cd.setStars(stars);
-      }
-
-      // Mergeable.
-      JsonElement mergeableElement = source.get(ChangeField.MERGEABLE.getName());
-      if (mergeableElement != null) {
-        String mergeable = mergeableElement.getAsString();
-        if ("1".equals(mergeable)) {
-          cd.setMergeable(true);
-        } else if ("0".equals(mergeable)) {
-          cd.setMergeable(false);
-        }
-      }
-
-      // Reviewed-by.
-      if (source.get(ChangeField.REVIEWEDBY.getName()) != null) {
-        JsonArray reviewedBy = source.get(ChangeField.REVIEWEDBY.getName()).getAsJsonArray();
-        if (reviewedBy.size() > 0) {
-          Set<Account.Id> accounts = Sets.newHashSetWithExpectedSize(reviewedBy.size());
-          for (int i = 0; i < reviewedBy.size(); i++) {
-            int aId = reviewedBy.get(i).getAsInt();
-            if (reviewedBy.size() == 1 && aId == ChangeField.NOT_REVIEWED) {
-              break;
-            }
-            accounts.add(new Account.Id(aId));
-          }
-          cd.setReviewedBy(accounts);
-        }
-      } else if (fields.contains(ChangeField.REVIEWEDBY.getName())) {
-        cd.setReviewedBy(Collections.emptySet());
-      }
-
-      if (source.get(ChangeField.REVIEWER.getName()) != null) {
-        cd.setReviewers(
-            ChangeField.parseReviewerFieldValues(
-                FluentIterable.from(source.get(ChangeField.REVIEWER.getName()).getAsJsonArray())
-                    .transform(JsonElement::getAsString)));
-      } else if (fields.contains(ChangeField.REVIEWER.getName())) {
-        cd.setReviewers(ReviewerSet.empty());
-      }
-
-      if (source.get(ChangeField.REVIEWER_BY_EMAIL.getName()) != null) {
-        cd.setReviewersByEmail(
-            ChangeField.parseReviewerByEmailFieldValues(
-                FluentIterable.from(
-                        source.get(ChangeField.REVIEWER_BY_EMAIL.getName()).getAsJsonArray())
-                    .transform(JsonElement::getAsString)));
-      } else if (fields.contains(ChangeField.REVIEWER_BY_EMAIL.getName())) {
-        cd.setReviewersByEmail(ReviewerByEmailSet.empty());
-      }
-
-      if (source.get(ChangeField.PENDING_REVIEWER.getName()) != null) {
-        cd.setPendingReviewers(
-            ChangeField.parseReviewerFieldValues(
-                FluentIterable.from(
-                        source.get(ChangeField.PENDING_REVIEWER.getName()).getAsJsonArray())
-                    .transform(JsonElement::getAsString)));
-      } else if (fields.contains(ChangeField.PENDING_REVIEWER.getName())) {
-        cd.setPendingReviewers(ReviewerSet.empty());
-      }
-
-      if (source.get(ChangeField.PENDING_REVIEWER_BY_EMAIL.getName()) != null) {
-        cd.setPendingReviewersByEmail(
-            ChangeField.parseReviewerByEmailFieldValues(
-                FluentIterable.from(
-                        source
-                            .get(ChangeField.PENDING_REVIEWER_BY_EMAIL.getName())
-                            .getAsJsonArray())
-                    .transform(JsonElement::getAsString)));
-      } else if (fields.contains(ChangeField.PENDING_REVIEWER_BY_EMAIL.getName())) {
-        cd.setPendingReviewersByEmail(ReviewerByEmailSet.empty());
-      }
-      decodeSubmitRecords(
-          source,
-          ChangeField.STORED_SUBMIT_RECORD_STRICT.getName(),
-          ChangeField.SUBMIT_RULE_OPTIONS_STRICT,
-          cd);
-      decodeSubmitRecords(
-          source,
-          ChangeField.STORED_SUBMIT_RECORD_LENIENT.getName(),
-          ChangeField.SUBMIT_RULE_OPTIONS_LENIENT,
-          cd);
-      decodeUnresolvedCommentCount(source, ChangeField.UNRESOLVED_COMMENT_COUNT.getName(), cd);
-
-      if (fields.contains(ChangeField.REF_STATE.getName())) {
-        cd.setRefStates(getByteArray(source, ChangeField.REF_STATE.getName()));
-      }
-      if (fields.contains(ChangeField.REF_STATE_PATTERN.getName())) {
-        cd.setRefStatePatterns(getByteArray(source, ChangeField.REF_STATE_PATTERN.getName()));
-      }
-
-      return cd;
-    }
-
-    private Iterable<byte[]> getByteArray(JsonObject source, String name) {
-      JsonElement element = source.get(name);
-      return element != null
-          ? Iterables.transform(element.getAsJsonArray(), e -> Base64.decodeBase64(e.getAsString()))
-          : Collections.emptyList();
-    }
-
-    private void decodeSubmitRecords(
-        JsonObject doc, String fieldName, SubmitRuleOptions opts, ChangeData out) {
-      JsonArray records = doc.getAsJsonArray(fieldName);
-      if (records == null) {
-        return;
-      }
-      ChangeField.parseSubmitRecords(
-          FluentIterable.from(records)
-              .transform(i -> new String(decodeBase64(i.toString()), UTF_8))
-              .toList(),
-          opts,
-          out);
-    }
-
-    private void decodeUnresolvedCommentCount(JsonObject doc, String fieldName, ChangeData out) {
-      JsonElement count = doc.get(fieldName);
-      if (count == null) {
-        return;
-      }
-      out.setUnresolvedCommentCount(count.getAsInt());
-    }
-
-    private JsonArray getSortArray() {
-      JsonObject properties = new JsonObject();
-      properties.addProperty(ORDER, "desc");
-      client.adapter().setIgnoreUnmapped(properties);
-
-      JsonArray sortArray = new JsonArray();
-      addNamedElement(ChangeField.UPDATED.getName(), properties, sortArray);
-      addNamedElement(ChangeField.LEGACY_ID.getName(), properties, sortArray);
-      return sortArray;
-    }
-  }
-
-  private String getURI(List<String> types) throws UnsupportedEncodingException {
-    String joinedTypes = String.join(",", types);
-    return getURI(joinedTypes, SEARCH);
-  }
-}
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticConfiguration.java b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticConfiguration.java
deleted file mode 100644
index cd74567..0000000
--- a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticConfiguration.java
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.elasticsearch;
-
-import static com.google.common.base.MoreObjects.firstNonNull;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.inject.Inject;
-import com.google.inject.ProvisionException;
-import com.google.inject.Singleton;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-import org.apache.http.HttpHost;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-class ElasticConfiguration {
-  private static final Logger log = LoggerFactory.getLogger(ElasticConfiguration.class);
-
-  static final String SECTION_ELASTICSEARCH = "elasticsearch";
-  static final String KEY_PASSWORD = "password";
-  static final String KEY_USERNAME = "username";
-  static final String KEY_MAX_RETRY_TIMEOUT = "maxRetryTimeout";
-  static final String KEY_PREFIX = "prefix";
-  static final String KEY_SERVER = "server";
-  static final String KEY_NUMBER_OF_SHARDS = "numberOfShards";
-  static final String KEY_NUMBER_OF_REPLICAS = "numberOfReplicas";
-  static final String DEFAULT_PORT = "9200";
-  static final String DEFAULT_USERNAME = "elastic";
-  static final int DEFAULT_MAX_RETRY_TIMEOUT_MS = 30000;
-  static final int DEFAULT_NUMBER_OF_SHARDS = 5;
-  static final int DEFAULT_NUMBER_OF_REPLICAS = 1;
-  static final TimeUnit MAX_RETRY_TIMEOUT_UNIT = TimeUnit.MILLISECONDS;
-
-  private final Config cfg;
-  private final List<HttpHost> hosts;
-
-  final String username;
-  final String password;
-  final int maxRetryTimeout;
-  final int numberOfShards;
-  final int numberOfReplicas;
-  final String prefix;
-
-  @Inject
-  ElasticConfiguration(@GerritServerConfig Config cfg) {
-    this.cfg = cfg;
-    this.password = cfg.getString(SECTION_ELASTICSEARCH, null, KEY_PASSWORD);
-    this.username =
-        password == null
-            ? null
-            : firstNonNull(
-                cfg.getString(SECTION_ELASTICSEARCH, null, KEY_USERNAME), DEFAULT_USERNAME);
-    this.maxRetryTimeout =
-        (int)
-            cfg.getTimeUnit(
-                SECTION_ELASTICSEARCH,
-                null,
-                KEY_MAX_RETRY_TIMEOUT,
-                DEFAULT_MAX_RETRY_TIMEOUT_MS,
-                MAX_RETRY_TIMEOUT_UNIT);
-    this.prefix = Strings.nullToEmpty(cfg.getString(SECTION_ELASTICSEARCH, null, KEY_PREFIX));
-    this.numberOfShards =
-        cfg.getInt(SECTION_ELASTICSEARCH, null, KEY_NUMBER_OF_SHARDS, DEFAULT_NUMBER_OF_SHARDS);
-    this.numberOfReplicas =
-        cfg.getInt(SECTION_ELASTICSEARCH, null, KEY_NUMBER_OF_REPLICAS, DEFAULT_NUMBER_OF_REPLICAS);
-    this.hosts = new ArrayList<>();
-    for (String server : cfg.getStringList(SECTION_ELASTICSEARCH, null, KEY_SERVER)) {
-      try {
-        URI uri = new URI(server);
-        int port = uri.getPort();
-        HttpHost httpHost =
-            new HttpHost(
-                uri.getHost(), port == -1 ? Integer.valueOf(DEFAULT_PORT) : port, uri.getScheme());
-        this.hosts.add(httpHost);
-      } catch (URISyntaxException | IllegalArgumentException e) {
-        log.error("Invalid server URI {}: {}", server, e.getMessage());
-      }
-    }
-
-    if (hosts.isEmpty()) {
-      throw new ProvisionException("No valid Elasticsearch servers configured");
-    }
-
-    log.info("Elasticsearch servers: {}", hosts);
-  }
-
-  Config getConfig() {
-    return cfg;
-  }
-
-  HttpHost[] getHosts() {
-    return hosts.toArray(new HttpHost[hosts.size()]);
-  }
-
-  String getIndexName(String name, int schemaVersion) {
-    return String.format("%s%s_%04d", prefix, name, schemaVersion);
-  }
-}
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticGroupIndex.java b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticGroupIndex.java
deleted file mode 100644
index 79701e1..0000000
--- a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticGroupIndex.java
+++ /dev/null
@@ -1,206 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.elasticsearch;
-
-import com.google.common.collect.Lists;
-import com.google.gerrit.elasticsearch.ElasticMapping.MappingProperties;
-import com.google.gerrit.elasticsearch.builders.QueryBuilder;
-import com.google.gerrit.elasticsearch.builders.SearchSourceBuilder;
-import com.google.gerrit.elasticsearch.bulk.BulkRequest;
-import com.google.gerrit.elasticsearch.bulk.IndexRequest;
-import com.google.gerrit.elasticsearch.bulk.UpdateRequest;
-import com.google.gerrit.index.QueryOptions;
-import com.google.gerrit.index.Schema;
-import com.google.gerrit.index.query.DataSource;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.index.query.QueryParseException;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.account.GroupCache;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.group.InternalGroup;
-import com.google.gerrit.server.index.IndexUtils;
-import com.google.gerrit.server.index.group.GroupField;
-import com.google.gerrit.server.index.group.GroupIndex;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.ResultSet;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import com.google.inject.assistedinject.AssistedInject;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
-import org.apache.http.HttpStatus;
-import org.apache.http.StatusLine;
-import org.elasticsearch.client.Response;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ElasticGroupIndex extends AbstractElasticIndex<AccountGroup.UUID, InternalGroup>
-    implements GroupIndex {
-  private static final Logger log = LoggerFactory.getLogger(ElasticGroupIndex.class);
-
-  static class GroupMapping {
-    final MappingProperties groups;
-
-    GroupMapping(Schema<InternalGroup> schema, ElasticQueryAdapter adapter) {
-      this.groups = ElasticMapping.createMapping(schema, adapter);
-    }
-  }
-
-  private static final String GROUPS = "groups";
-
-  private final GroupMapping mapping;
-  private final Provider<GroupCache> groupCache;
-  private final Schema<InternalGroup> schema;
-
-  @AssistedInject
-  ElasticGroupIndex(
-      ElasticConfiguration cfg,
-      SitePaths sitePaths,
-      Provider<GroupCache> groupCache,
-      ElasticRestClientProvider client,
-      @Assisted Schema<InternalGroup> schema) {
-    super(cfg, sitePaths, schema, client, GROUPS);
-    this.groupCache = groupCache;
-    this.mapping = new GroupMapping(schema, client.adapter());
-    this.schema = schema;
-  }
-
-  @Override
-  public void replace(InternalGroup group) throws IOException {
-    BulkRequest bulk =
-        new IndexRequest(getId(group), indexName, type, client.adapter())
-            .add(new UpdateRequest<>(schema, group));
-
-    String uri = getURI(type, BULK);
-    Response response = postRequest(uri, bulk, getRefreshParam());
-    int statusCode = response.getStatusLine().getStatusCode();
-    if (statusCode != HttpStatus.SC_OK) {
-      throw new IOException(
-          String.format(
-              "Failed to replace group %s in index %s: %s",
-              group.getGroupUUID().get(), indexName, statusCode));
-    }
-  }
-
-  @Override
-  public DataSource<InternalGroup> getSource(Predicate<InternalGroup> p, QueryOptions opts)
-      throws QueryParseException {
-    return new QuerySource(p, opts);
-  }
-
-  @Override
-  protected String getDeleteActions(AccountGroup.UUID g) {
-    return delete(type, g);
-  }
-
-  @Override
-  protected String getMappings() {
-    return getMappingsForSingleType(GROUPS, mapping.groups);
-  }
-
-  @Override
-  protected String getId(InternalGroup group) {
-    return group.getGroupUUID().get();
-  }
-
-  private class QuerySource implements DataSource<InternalGroup> {
-    private final String search;
-    private final Set<String> fields;
-
-    QuerySource(Predicate<InternalGroup> p, QueryOptions opts) throws QueryParseException {
-      QueryBuilder qb = queryBuilder.toQueryBuilder(p);
-      fields = IndexUtils.groupFields(opts);
-      SearchSourceBuilder searchSource =
-          new SearchSourceBuilder(client.adapter())
-              .query(qb)
-              .from(opts.start())
-              .size(opts.limit())
-              .fields(Lists.newArrayList(fields));
-
-      JsonArray sortArray = getSortArray(GroupField.UUID.getName());
-      search = getSearch(searchSource, sortArray);
-    }
-
-    @Override
-    public int getCardinality() {
-      return 10;
-    }
-
-    @Override
-    public ResultSet<InternalGroup> read() throws OrmException {
-      try {
-        List<InternalGroup> results = Collections.emptyList();
-        String uri = getURI(type, SEARCH);
-        Response response = postRequest(uri, search);
-        StatusLine statusLine = response.getStatusLine();
-        if (statusLine.getStatusCode() == HttpStatus.SC_OK) {
-          String content = getContent(response);
-          JsonObject obj =
-              new JsonParser().parse(content).getAsJsonObject().getAsJsonObject("hits");
-          if (obj.get("hits") != null) {
-            JsonArray json = obj.getAsJsonArray("hits");
-            results = Lists.newArrayListWithCapacity(json.size());
-            for (int i = 0; i < json.size(); i++) {
-              results.add(toAccountGroup(json.get(i)).get());
-            }
-          }
-        } else {
-          log.error(statusLine.getReasonPhrase());
-        }
-        final List<InternalGroup> r = Collections.unmodifiableList(results);
-        return new ResultSet<InternalGroup>() {
-          @Override
-          public Iterator<InternalGroup> iterator() {
-            return r.iterator();
-          }
-
-          @Override
-          public List<InternalGroup> toList() {
-            return r;
-          }
-
-          @Override
-          public void close() {
-            // Do nothing.
-          }
-        };
-      } catch (IOException e) {
-        throw new OrmException(e);
-      }
-    }
-
-    private Optional<InternalGroup> toAccountGroup(JsonElement json) {
-      JsonElement source = json.getAsJsonObject().get("_source");
-      if (source == null) {
-        source = json.getAsJsonObject().get("fields");
-      }
-
-      AccountGroup.UUID uuid =
-          new AccountGroup.UUID(
-              source.getAsJsonObject().get(GroupField.UUID.getName()).getAsString());
-      // Use the GroupCache rather than depending on any stored fields in the
-      // document (of which there shouldn't be any).
-      return groupCache.get().get(uuid);
-    }
-  }
-}
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticIndexModule.java b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticIndexModule.java
deleted file mode 100644
index 6bc51ce..0000000
--- a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticIndexModule.java
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.elasticsearch;
-
-import com.google.gerrit.server.index.AbstractIndexModule;
-import com.google.gerrit.server.index.VersionManager;
-import com.google.gerrit.server.index.account.AccountIndex;
-import com.google.gerrit.server.index.change.ChangeIndex;
-import com.google.gerrit.server.index.group.GroupIndex;
-import java.util.Map;
-
-public class ElasticIndexModule extends AbstractIndexModule {
-
-  public static ElasticIndexModule singleVersionWithExplicitVersions(
-      Map<String, Integer> versions, int threads) {
-    return new ElasticIndexModule(versions, threads);
-  }
-
-  public static ElasticIndexModule latestVersion() {
-    return new ElasticIndexModule(null, 0);
-  }
-
-  private ElasticIndexModule(Map<String, Integer> singleVersions, int threads) {
-    super(singleVersions, threads);
-  }
-
-  @Override
-  public void configure() {
-    super.configure();
-    install(ElasticRestClientProvider.module());
-  }
-
-  @Override
-  protected Class<? extends AccountIndex> getAccountIndex() {
-    return ElasticAccountIndex.class;
-  }
-
-  @Override
-  protected Class<? extends ChangeIndex> getChangeIndex() {
-    return ElasticChangeIndex.class;
-  }
-
-  @Override
-  protected Class<? extends GroupIndex> getGroupIndex() {
-    return ElasticGroupIndex.class;
-  }
-
-  @Override
-  protected Class<? extends VersionManager> getVersionManager() {
-    return ElasticIndexVersionManager.class;
-  }
-}
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticIndexVersionDiscovery.java b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticIndexVersionDiscovery.java
deleted file mode 100644
index 8b343c2..0000000
--- a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticIndexVersionDiscovery.java
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.elasticsearch;
-
-import static java.util.stream.Collectors.toList;
-
-import com.google.gson.JsonParser;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.List;
-import org.apache.http.HttpStatus;
-import org.apache.http.StatusLine;
-import org.elasticsearch.client.Request;
-import org.elasticsearch.client.Response;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-class ElasticIndexVersionDiscovery {
-  private static final Logger log = LoggerFactory.getLogger(ElasticIndexVersionDiscovery.class);
-
-  private final ElasticRestClientProvider client;
-
-  @Inject
-  ElasticIndexVersionDiscovery(ElasticRestClientProvider client) {
-    this.client = client;
-  }
-
-  List<String> discover(String prefix, String indexName) throws IOException {
-    String name = prefix + indexName + "_";
-    Request request = new Request("GET", client.adapter().getVersionDiscoveryUrl(name));
-    Response response = client.get().performRequest(request);
-
-    StatusLine statusLine = response.getStatusLine();
-    if (statusLine.getStatusCode() != HttpStatus.SC_OK) {
-      String message =
-          String.format(
-              "Failed to discover index versions for %s: %d: %s",
-              name, statusLine.getStatusCode(), statusLine.getReasonPhrase());
-      log.error(message);
-      throw new IOException(message);
-    }
-
-    return new JsonParser()
-        .parse(AbstractElasticIndex.getContent(response)).getAsJsonObject().entrySet().stream()
-            .map(e -> e.getKey().replace(name, ""))
-            .collect(toList());
-  }
-}
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticIndexVersionManager.java b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticIndexVersionManager.java
deleted file mode 100644
index cff1911..0000000
--- a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticIndexVersionManager.java
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.elasticsearch;
-
-import com.google.common.primitives.Ints;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.index.Index;
-import com.google.gerrit.index.IndexDefinition;
-import com.google.gerrit.index.Schema;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.index.GerritIndexStatus;
-import com.google.gerrit.server.index.OnlineUpgradeListener;
-import com.google.gerrit.server.index.VersionManager;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.List;
-import java.util.TreeMap;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class ElasticIndexVersionManager extends VersionManager {
-  private static final Logger log = LoggerFactory.getLogger(ElasticIndexVersionManager.class);
-
-  private final String prefix;
-  private final ElasticIndexVersionDiscovery versionDiscovery;
-
-  @Inject
-  ElasticIndexVersionManager(
-      ElasticConfiguration cfg,
-      SitePaths sitePaths,
-      DynamicSet<OnlineUpgradeListener> listeners,
-      Collection<IndexDefinition<?, ?, ?>> defs,
-      ElasticIndexVersionDiscovery versionDiscovery) {
-    super(sitePaths, listeners, defs, VersionManager.getOnlineUpgrade(cfg.getConfig()));
-    this.versionDiscovery = versionDiscovery;
-    prefix = cfg.prefix;
-  }
-
-  @Override
-  protected <K, V, I extends Index<K, V>> TreeMap<Integer, Version<V>> scanVersions(
-      IndexDefinition<K, V, I> def, GerritIndexStatus cfg) {
-    TreeMap<Integer, Version<V>> versions = new TreeMap<>();
-    try {
-      List<String> discovered = versionDiscovery.discover(prefix, def.getName());
-      log.debug("Discovered versions for {}: {}", def.getName(), discovered);
-      for (String version : discovered) {
-        Integer v = Ints.tryParse(version);
-        if (v == null || version.length() != 4) {
-          log.warn("Unrecognized version in index {}: {}", def.getName(), version);
-          continue;
-        }
-        versions.put(v, new Version<>(null, v, true, cfg.getReady(def.getName(), v)));
-      }
-    } catch (IOException e) {
-      log.error("Error scanning index: " + def.getName(), e);
-    }
-
-    for (Schema<V> schema : def.getSchemas().values()) {
-      int v = schema.getVersion();
-      boolean exists = versions.containsKey(v);
-      versions.put(v, new Version<>(schema, v, exists, cfg.getReady(def.getName(), v)));
-    }
-    return versions;
-  }
-}
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticQueryAdapter.java b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticQueryAdapter.java
deleted file mode 100644
index 85fbee8..0000000
--- a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticQueryAdapter.java
+++ /dev/null
@@ -1,98 +0,0 @@
-// 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.
-
-package com.google.gerrit.elasticsearch;
-
-import com.google.gson.JsonObject;
-
-public class ElasticQueryAdapter {
-  static final String POST_V5_TYPE = "_doc";
-
-  private final boolean ignoreUnmapped;
-  private final boolean usePostV5Type;
-  private final boolean omitTypeFromSearch;
-
-  private final String searchFilteringName;
-  private final String indicesExistParam;
-  private final String exactFieldType;
-  private final String stringFieldType;
-  private final String indexProperty;
-  private final String versionDiscoveryUrl;
-  private final String includeTypeNameParam;
-
-  ElasticQueryAdapter(ElasticVersion version) {
-    this.ignoreUnmapped = false;
-    this.usePostV5Type = version.isV6OrLater();
-    this.omitTypeFromSearch = version.isV7OrLater();
-    this.versionDiscoveryUrl = version.isV6OrLater() ? "/%s*" : "/%s*/_aliases";
-    this.searchFilteringName = "_source";
-    this.indicesExistParam = "?allow_no_indices=false";
-    this.exactFieldType = "keyword";
-    this.stringFieldType = "text";
-    this.indexProperty = "true";
-    this.includeTypeNameParam = version.isV7OrLater() ? "?include_type_name=true" : "";
-  }
-
-  void setIgnoreUnmapped(JsonObject properties) {
-    if (ignoreUnmapped) {
-      properties.addProperty("ignore_unmapped", true);
-    }
-  }
-
-  public void setType(JsonObject properties, String type) {
-    if (!usePostV5Type) {
-      properties.addProperty("_type", type);
-    }
-  }
-
-  public String searchFilteringName() {
-    return searchFilteringName;
-  }
-
-  String indicesExistParam() {
-    return indicesExistParam;
-  }
-
-  String exactFieldType() {
-    return exactFieldType;
-  }
-
-  String stringFieldType() {
-    return stringFieldType;
-  }
-
-  String indexProperty() {
-    return indexProperty;
-  }
-
-  boolean usePostV5Type() {
-    return usePostV5Type;
-  }
-
-  boolean omitTypeFromSearch() {
-    return omitTypeFromSearch;
-  }
-
-  String getType(String type) {
-    return usePostV5Type() ? POST_V5_TYPE : type;
-  }
-
-  String getVersionDiscoveryUrl(String name) {
-    return String.format(versionDiscoveryUrl, name);
-  }
-
-  String includeTypeNameParam() {
-    return includeTypeNameParam;
-  }
-}
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticRestClientProvider.java b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticRestClientProvider.java
deleted file mode 100644
index 9c1cf02..0000000
--- a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticRestClientProvider.java
+++ /dev/null
@@ -1,149 +0,0 @@
-// 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.
-
-package com.google.gerrit.elasticsearch;
-
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.gerrit.lifecycle.LifecycleModule;
-import com.google.gson.JsonParser;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.apache.http.HttpStatus;
-import org.apache.http.StatusLine;
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.UsernamePasswordCredentials;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.impl.client.BasicCredentialsProvider;
-import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
-import org.elasticsearch.client.Request;
-import org.elasticsearch.client.Response;
-import org.elasticsearch.client.RestClient;
-import org.elasticsearch.client.RestClientBuilder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-class ElasticRestClientProvider implements Provider<RestClient>, LifecycleListener {
-  private static final Logger log = LoggerFactory.getLogger(ElasticRestClientProvider.class);
-
-  private final ElasticConfiguration cfg;
-
-  private volatile RestClient client;
-  private ElasticQueryAdapter adapter;
-
-  @Inject
-  ElasticRestClientProvider(ElasticConfiguration cfg) {
-    this.cfg = cfg;
-  }
-
-  public static LifecycleModule module() {
-    return new LifecycleModule() {
-      @Override
-      protected void configure() {
-        listener().to(ElasticRestClientProvider.class);
-      }
-    };
-  }
-
-  @Override
-  public RestClient get() {
-    if (client == null) {
-      synchronized (this) {
-        if (client == null) {
-          client = build();
-          ElasticVersion version = getVersion();
-          log.info("Elasticsearch integration version {}", version);
-          adapter = new ElasticQueryAdapter(version);
-        }
-      }
-    }
-    return client;
-  }
-
-  @Override
-  public void start() {}
-
-  @Override
-  public void stop() {
-    if (client != null) {
-      try {
-        client.close();
-      } catch (IOException e) {
-        // Ignore. We can't do anything about it.
-      }
-    }
-  }
-
-  ElasticQueryAdapter adapter() {
-    get(); // Make sure we're connected
-    return adapter;
-  }
-
-  public static class FailedToGetVersion extends ElasticException {
-    private static final long serialVersionUID = 1L;
-    private static final String MESSAGE = "Failed to get Elasticsearch version";
-
-    FailedToGetVersion(StatusLine status) {
-      super(String.format("%s: %d %s", MESSAGE, status.getStatusCode(), status.getReasonPhrase()));
-    }
-
-    FailedToGetVersion(Throwable cause) {
-      super(MESSAGE, cause);
-    }
-  }
-
-  private ElasticVersion getVersion() throws ElasticException {
-    try {
-      Response response = client.performRequest(new Request("GET", "/"));
-      StatusLine statusLine = response.getStatusLine();
-      if (statusLine.getStatusCode() != HttpStatus.SC_OK) {
-        throw new FailedToGetVersion(statusLine);
-      }
-      String version =
-          new JsonParser()
-              .parse(AbstractElasticIndex.getContent(response))
-              .getAsJsonObject()
-              .get("version")
-              .getAsJsonObject()
-              .get("number")
-              .getAsString();
-      log.info("Connected to Elasticsearch version {}", version);
-      return ElasticVersion.forVersion(version);
-    } catch (IOException e) {
-      throw new FailedToGetVersion(e);
-    }
-  }
-
-  private RestClient build() {
-    RestClientBuilder builder = RestClient.builder(cfg.getHosts());
-    builder.setMaxRetryTimeoutMillis(cfg.maxRetryTimeout);
-    setConfiguredCredentialsIfAny(builder);
-    return builder.build();
-  }
-
-  private void setConfiguredCredentialsIfAny(RestClientBuilder builder) {
-    String username = cfg.username;
-    String password = cfg.password;
-    if (username != null && password != null) {
-      CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
-      credentialsProvider.setCredentials(
-          AuthScope.ANY, new UsernamePasswordCredentials(username, password));
-      builder.setHttpClientConfigCallback(
-          (HttpAsyncClientBuilder httpClientBuilder) ->
-              httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider));
-    }
-  }
-}
diff --git a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticContainer.java b/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticContainer.java
deleted file mode 100644
index 1c7102a..0000000
--- a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticContainer.java
+++ /dev/null
@@ -1,64 +0,0 @@
-// 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.
-
-package com.google.gerrit.elasticsearch;
-
-import org.apache.http.HttpHost;
-import org.junit.internal.AssumptionViolatedException;
-import org.testcontainers.elasticsearch.ElasticsearchContainer;
-
-/* Helper class for running ES integration tests in docker container */
-public class ElasticContainer extends ElasticsearchContainer {
-  private static final int ELASTICSEARCH_DEFAULT_PORT = 9200;
-
-  public static ElasticContainer createAndStart(ElasticVersion version) {
-    // Assumption violation is not natively supported by Testcontainers.
-    // See https://github.com/testcontainers/testcontainers-java/issues/343
-    try {
-      ElasticContainer container = new ElasticContainer(version);
-      container.start();
-      return container;
-    } catch (Throwable t) {
-      throw new AssumptionViolatedException("Unable to start container", t);
-    }
-  }
-
-  private static String getImageName(ElasticVersion version) {
-    switch (version) {
-      case V5_6:
-        return "docker.elastic.co/elasticsearch/elasticsearch:5.6.15";
-      case V6_2:
-        return "docker.elastic.co/elasticsearch/elasticsearch-oss:6.2.4";
-      case V6_3:
-        return "docker.elastic.co/elasticsearch/elasticsearch-oss:6.3.2";
-      case V6_4:
-        return "docker.elastic.co/elasticsearch/elasticsearch-oss:6.4.3";
-      case V6_5:
-        return "docker.elastic.co/elasticsearch/elasticsearch-oss:6.5.4";
-      case V6_6:
-        return "docker.elastic.co/elasticsearch/elasticsearch-oss:6.6.1";
-      case V7_0:
-        return "docker.elastic.co/elasticsearch/elasticsearch-oss:7.0.0-beta1";
-    }
-    throw new IllegalStateException("No tests for version: " + version.name());
-  }
-
-  private ElasticContainer(ElasticVersion version) {
-    super(getImageName(version));
-  }
-
-  public HttpHost getHttpHost() {
-    return new HttpHost(getContainerIpAddress(), getMappedPort(ELASTICSEARCH_DEFAULT_PORT));
-  }
-}
diff --git a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticV5QueryAccountsTest.java b/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticV5QueryAccountsTest.java
deleted file mode 100644
index 01a523b..0000000
--- a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticV5QueryAccountsTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-// 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.
-
-package com.google.gerrit.elasticsearch;
-
-import com.google.gerrit.elasticsearch.ElasticTestUtils.ElasticNodeInfo;
-import com.google.gerrit.server.query.account.AbstractQueryAccountsTest;
-import com.google.gerrit.testutil.InMemoryModule;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import org.eclipse.jgit.lib.Config;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-
-public class ElasticV5QueryAccountsTest extends AbstractQueryAccountsTest {
-  private static ElasticNodeInfo nodeInfo;
-  private static ElasticContainer container;
-
-  @BeforeClass
-  public static void startIndexService() {
-    if (nodeInfo != null) {
-      // do not start Elasticsearch twice
-      return;
-    }
-
-    container = ElasticContainer.createAndStart(ElasticVersion.V5_6);
-    nodeInfo = new ElasticNodeInfo(container.getHttpHost().getPort());
-  }
-
-  @AfterClass
-  public static void stopElasticsearchServer() {
-    if (container != null) {
-      container.stop();
-    }
-  }
-
-  @Override
-  protected void initAfterLifecycleStart() throws Exception {
-    super.initAfterLifecycleStart();
-    ElasticTestUtils.createAllIndexes(injector);
-  }
-
-  @Override
-  protected Injector createInjector() {
-    Config elasticsearchConfig = new Config(config);
-    InMemoryModule.setDefaults(elasticsearchConfig);
-    String indicesPrefix = getSanitizedMethodName();
-    ElasticTestUtils.configure(
-        elasticsearchConfig, nodeInfo.port, indicesPrefix, ElasticVersion.V5_6);
-    return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
-  }
-}
diff --git a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticV5QueryChangesTest.java b/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticV5QueryChangesTest.java
deleted file mode 100644
index d60b7ec..0000000
--- a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticV5QueryChangesTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-// 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.
-
-package com.google.gerrit.elasticsearch;
-
-import com.google.gerrit.elasticsearch.ElasticTestUtils.ElasticNodeInfo;
-import com.google.gerrit.server.query.change.AbstractQueryChangesTest;
-import com.google.gerrit.testutil.InMemoryModule;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import org.eclipse.jgit.lib.Config;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-
-public class ElasticV5QueryChangesTest extends AbstractQueryChangesTest {
-  private static ElasticNodeInfo nodeInfo;
-  private static ElasticContainer container;
-
-  @BeforeClass
-  public static void startIndexService() {
-    if (nodeInfo != null) {
-      // do not start Elasticsearch twice
-      return;
-    }
-
-    container = ElasticContainer.createAndStart(ElasticVersion.V5_6);
-    nodeInfo = new ElasticNodeInfo(container.getHttpHost().getPort());
-  }
-
-  @AfterClass
-  public static void stopElasticsearchServer() {
-    if (container != null) {
-      container.stop();
-    }
-  }
-
-  @Override
-  protected void initAfterLifecycleStart() throws Exception {
-    super.initAfterLifecycleStart();
-    ElasticTestUtils.createAllIndexes(injector);
-  }
-
-  @Override
-  protected Injector createInjector() {
-    Config elasticsearchConfig = new Config(config);
-    InMemoryModule.setDefaults(elasticsearchConfig);
-    String indicesPrefix = getSanitizedMethodName();
-    ElasticTestUtils.configure(
-        elasticsearchConfig, nodeInfo.port, indicesPrefix, ElasticVersion.V5_6);
-    return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
-  }
-}
diff --git a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticV5QueryGroupsTest.java b/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticV5QueryGroupsTest.java
deleted file mode 100644
index e8d9a78..0000000
--- a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticV5QueryGroupsTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-// 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.
-
-package com.google.gerrit.elasticsearch;
-
-import com.google.gerrit.elasticsearch.ElasticTestUtils.ElasticNodeInfo;
-import com.google.gerrit.server.query.group.AbstractQueryGroupsTest;
-import com.google.gerrit.testutil.InMemoryModule;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import org.eclipse.jgit.lib.Config;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-
-public class ElasticV5QueryGroupsTest extends AbstractQueryGroupsTest {
-  private static ElasticNodeInfo nodeInfo;
-  private static ElasticContainer container;
-
-  @BeforeClass
-  public static void startIndexService() {
-    if (nodeInfo != null) {
-      // do not start Elasticsearch twice
-      return;
-    }
-
-    container = ElasticContainer.createAndStart(ElasticVersion.V5_6);
-    nodeInfo = new ElasticNodeInfo(container.getHttpHost().getPort());
-  }
-
-  @AfterClass
-  public static void stopElasticsearchServer() {
-    if (container != null) {
-      container.stop();
-    }
-  }
-
-  @Override
-  protected void initAfterLifecycleStart() throws Exception {
-    super.initAfterLifecycleStart();
-    ElasticTestUtils.createAllIndexes(injector);
-  }
-
-  @Override
-  protected Injector createInjector() {
-    Config elasticsearchConfig = new Config(config);
-    InMemoryModule.setDefaults(elasticsearchConfig);
-    String indicesPrefix = getSanitizedMethodName();
-    ElasticTestUtils.configure(
-        elasticsearchConfig, nodeInfo.port, indicesPrefix, ElasticVersion.V5_6);
-    return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
-  }
-}
diff --git a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticV6QueryAccountsTest.java b/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticV6QueryAccountsTest.java
deleted file mode 100644
index 5e75c82..0000000
--- a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticV6QueryAccountsTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-// 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.
-
-package com.google.gerrit.elasticsearch;
-
-import com.google.gerrit.elasticsearch.ElasticTestUtils.ElasticNodeInfo;
-import com.google.gerrit.server.query.account.AbstractQueryAccountsTest;
-import com.google.gerrit.testutil.InMemoryModule;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import org.eclipse.jgit.lib.Config;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-
-public class ElasticV6QueryAccountsTest extends AbstractQueryAccountsTest {
-  private static ElasticNodeInfo nodeInfo;
-  private static ElasticContainer container;
-
-  @BeforeClass
-  public static void startIndexService() {
-    if (nodeInfo != null) {
-      // do not start Elasticsearch twice
-      return;
-    }
-
-    container = ElasticContainer.createAndStart(ElasticVersion.V6_6);
-    nodeInfo = new ElasticNodeInfo(container.getHttpHost().getPort());
-  }
-
-  @AfterClass
-  public static void stopElasticsearchServer() {
-    if (container != null) {
-      container.stop();
-    }
-  }
-
-  @Override
-  protected void initAfterLifecycleStart() throws Exception {
-    super.initAfterLifecycleStart();
-    ElasticTestUtils.createAllIndexes(injector);
-  }
-
-  @Override
-  protected Injector createInjector() {
-    Config elasticsearchConfig = new Config(config);
-    InMemoryModule.setDefaults(elasticsearchConfig);
-    String indicesPrefix = getSanitizedMethodName();
-    ElasticTestUtils.configure(elasticsearchConfig, nodeInfo.port, indicesPrefix);
-    return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
-  }
-}
diff --git a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticV6QueryChangesTest.java b/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticV6QueryChangesTest.java
deleted file mode 100644
index 413a815..0000000
--- a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticV6QueryChangesTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-// 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.
-
-package com.google.gerrit.elasticsearch;
-
-import com.google.gerrit.elasticsearch.ElasticTestUtils.ElasticNodeInfo;
-import com.google.gerrit.server.query.change.AbstractQueryChangesTest;
-import com.google.gerrit.testutil.InMemoryModule;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import org.eclipse.jgit.lib.Config;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-
-public class ElasticV6QueryChangesTest extends AbstractQueryChangesTest {
-
-  private static ElasticNodeInfo nodeInfo;
-  private static ElasticContainer container;
-
-  @BeforeClass
-  public static void startIndexService() {
-    if (nodeInfo != null) {
-      // do not start Elasticsearch twice
-      return;
-    }
-
-    container = ElasticContainer.createAndStart(ElasticVersion.V6_6);
-    nodeInfo = new ElasticNodeInfo(container.getHttpHost().getPort());
-  }
-
-  @AfterClass
-  public static void stopElasticsearchServer() {
-    if (container != null) {
-      container.stop();
-    }
-  }
-
-  @Override
-  protected void initAfterLifecycleStart() throws Exception {
-    super.initAfterLifecycleStart();
-    ElasticTestUtils.createAllIndexes(injector);
-  }
-
-  @Override
-  protected Injector createInjector() {
-    Config elasticsearchConfig = new Config(config);
-    InMemoryModule.setDefaults(elasticsearchConfig);
-    String indicesPrefix = getSanitizedMethodName();
-    ElasticTestUtils.configure(elasticsearchConfig, nodeInfo.port, indicesPrefix);
-    return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
-  }
-}
diff --git a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticV6QueryGroupsTest.java b/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticV6QueryGroupsTest.java
deleted file mode 100644
index 84e1f8a..0000000
--- a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticV6QueryGroupsTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-// 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.
-
-package com.google.gerrit.elasticsearch;
-
-import com.google.gerrit.elasticsearch.ElasticTestUtils.ElasticNodeInfo;
-import com.google.gerrit.server.query.group.AbstractQueryGroupsTest;
-import com.google.gerrit.testutil.InMemoryModule;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import org.eclipse.jgit.lib.Config;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-
-public class ElasticV6QueryGroupsTest extends AbstractQueryGroupsTest {
-  private static ElasticNodeInfo nodeInfo;
-  private static ElasticContainer container;
-
-  @BeforeClass
-  public static void startIndexService() {
-    if (nodeInfo != null) {
-      // do not start Elasticsearch twice
-      return;
-    }
-
-    container = ElasticContainer.createAndStart(ElasticVersion.V6_6);
-    nodeInfo = new ElasticNodeInfo(container.getHttpHost().getPort());
-  }
-
-  @AfterClass
-  public static void stopElasticsearchServer() {
-    if (container != null) {
-      container.stop();
-    }
-  }
-
-  @Override
-  protected void initAfterLifecycleStart() throws Exception {
-    super.initAfterLifecycleStart();
-    ElasticTestUtils.createAllIndexes(injector);
-  }
-
-  @Override
-  protected Injector createInjector() {
-    Config elasticsearchConfig = new Config(config);
-    InMemoryModule.setDefaults(elasticsearchConfig);
-    String indicesPrefix = getSanitizedMethodName();
-    ElasticTestUtils.configure(elasticsearchConfig, nodeInfo.port, indicesPrefix);
-    return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
-  }
-}
diff --git a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticV7QueryAccountsTest.java b/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticV7QueryAccountsTest.java
deleted file mode 100644
index 8634709..0000000
--- a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticV7QueryAccountsTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-// 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.
-
-package com.google.gerrit.elasticsearch;
-
-import com.google.gerrit.elasticsearch.ElasticTestUtils.ElasticNodeInfo;
-import com.google.gerrit.server.query.account.AbstractQueryAccountsTest;
-import com.google.gerrit.testutil.InMemoryModule;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import org.eclipse.jgit.lib.Config;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-
-public class ElasticV7QueryAccountsTest extends AbstractQueryAccountsTest {
-  private static ElasticNodeInfo nodeInfo;
-  private static ElasticContainer container;
-
-  @BeforeClass
-  public static void startIndexService() {
-    if (nodeInfo != null) {
-      // do not start Elasticsearch twice
-      return;
-    }
-
-    container = ElasticContainer.createAndStart(ElasticVersion.V7_0);
-    nodeInfo = new ElasticNodeInfo(container.getHttpHost().getPort());
-  }
-
-  @AfterClass
-  public static void stopElasticsearchServer() {
-    if (container != null) {
-      container.stop();
-    }
-  }
-
-  @Override
-  protected void initAfterLifecycleStart() throws Exception {
-    super.initAfterLifecycleStart();
-    ElasticTestUtils.createAllIndexes(injector);
-  }
-
-  @Override
-  protected Injector createInjector() {
-    Config elasticsearchConfig = new Config(config);
-    InMemoryModule.setDefaults(elasticsearchConfig);
-    String indicesPrefix = getSanitizedMethodName();
-    ElasticTestUtils.configure(elasticsearchConfig, nodeInfo.port, indicesPrefix);
-    return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
-  }
-}
diff --git a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticV7QueryChangesTest.java b/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticV7QueryChangesTest.java
deleted file mode 100644
index f46364e..0000000
--- a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticV7QueryChangesTest.java
+++ /dev/null
@@ -1,81 +0,0 @@
-// 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.
-
-package com.google.gerrit.elasticsearch;
-
-import com.google.gerrit.elasticsearch.ElasticTestUtils.ElasticNodeInfo;
-import com.google.gerrit.server.query.change.AbstractQueryChangesTest;
-import com.google.gerrit.testutil.InMemoryModule;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
-import org.apache.http.impl.nio.client.HttpAsyncClients;
-import org.eclipse.jgit.lib.Config;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-
-public class ElasticV7QueryChangesTest extends AbstractQueryChangesTest {
-
-  private static ElasticNodeInfo nodeInfo;
-  private static ElasticContainer container;
-  private static CloseableHttpAsyncClient client;
-
-  @BeforeClass
-  public static void startIndexService() {
-    if (nodeInfo != null) {
-      // do not start Elasticsearch twice
-      return;
-    }
-
-    container = ElasticContainer.createAndStart(ElasticVersion.V7_0);
-    nodeInfo = new ElasticNodeInfo(container.getHttpHost().getPort());
-    client = HttpAsyncClients.createDefault();
-    client.start();
-  }
-
-  @AfterClass
-  public static void stopElasticsearchServer() {
-    if (container != null) {
-      container.stop();
-    }
-  }
-
-  @After
-  public void closeIndex() {
-    client.execute(
-        new HttpPost(
-            String.format(
-                "http://localhost:%d/%s*/_close", nodeInfo.port, getSanitizedMethodName())),
-        HttpClientContext.create(),
-        null);
-  }
-
-  @Override
-  protected void initAfterLifecycleStart() throws Exception {
-    super.initAfterLifecycleStart();
-    ElasticTestUtils.createAllIndexes(injector);
-  }
-
-  @Override
-  protected Injector createInjector() {
-    Config elasticsearchConfig = new Config(config);
-    InMemoryModule.setDefaults(elasticsearchConfig);
-    String indicesPrefix = getSanitizedMethodName();
-    ElasticTestUtils.configure(elasticsearchConfig, nodeInfo.port, indicesPrefix);
-    return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
-  }
-}
diff --git a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticV7QueryGroupsTest.java b/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticV7QueryGroupsTest.java
deleted file mode 100644
index 33f6666..0000000
--- a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticV7QueryGroupsTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-// 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.
-
-package com.google.gerrit.elasticsearch;
-
-import com.google.gerrit.elasticsearch.ElasticTestUtils.ElasticNodeInfo;
-import com.google.gerrit.server.query.group.AbstractQueryGroupsTest;
-import com.google.gerrit.testutil.InMemoryModule;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import org.eclipse.jgit.lib.Config;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-
-public class ElasticV7QueryGroupsTest extends AbstractQueryGroupsTest {
-  private static ElasticNodeInfo nodeInfo;
-  private static ElasticContainer container;
-
-  @BeforeClass
-  public static void startIndexService() {
-    if (nodeInfo != null) {
-      // do not start Elasticsearch twice
-      return;
-    }
-
-    container = ElasticContainer.createAndStart(ElasticVersion.V7_0);
-    nodeInfo = new ElasticNodeInfo(container.getHttpHost().getPort());
-  }
-
-  @AfterClass
-  public static void stopElasticsearchServer() {
-    if (container != null) {
-      container.stop();
-    }
-  }
-
-  @Override
-  protected void initAfterLifecycleStart() throws Exception {
-    super.initAfterLifecycleStart();
-    ElasticTestUtils.createAllIndexes(injector);
-  }
-
-  @Override
-  protected Injector createInjector() {
-    Config elasticsearchConfig = new Config(config);
-    InMemoryModule.setDefaults(elasticsearchConfig);
-    String indicesPrefix = getSanitizedMethodName();
-    ElasticTestUtils.configure(elasticsearchConfig, nodeInfo.port, indicesPrefix);
-    return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
-  }
-}
diff --git a/gerrit-extension-api/BUILD b/gerrit-extension-api/BUILD
deleted file mode 100644
index 9b3eacc..0000000
--- a/gerrit-extension-api/BUILD
+++ /dev/null
@@ -1,72 +0,0 @@
-load("//lib/jgit:jgit.bzl", "JGIT_DOC_URL")
-load("//lib:guava.bzl", "GUAVA_DOC_URL")
-load("//tools/bzl:gwt.bzl", "gwt_module")
-load("//tools/bzl:javadoc.bzl", "java_doc")
-load("//tools/bzl:junit.bzl", "junit_tests")
-
-SRC = "src/main/java/com/google/gerrit/extensions/"
-
-EXT_API_SRCS = glob([SRC + "client/*.java"])
-
-gwt_module(
-    name = "client",
-    srcs = EXT_API_SRCS,
-    gwt_xml = SRC + "Extensions.gwt.xml",
-    visibility = ["//visibility:public"],
-)
-
-java_binary(
-    name = "extension-api",
-    main_class = "Dummy",
-    visibility = ["//visibility:public"],
-    runtime_deps = [":lib"],
-)
-
-java_library(
-    name = "lib",
-    visibility = ["//visibility:public"],
-    exports = [
-        ":api",
-        "//lib:guava",
-        "//lib:servlet-api-3_1",
-        "//lib/guice",
-        "//lib/guice:guice-assistedinject",
-        "//lib/guice:guice-servlet",
-    ],
-)
-
-#TODO(davido): There is no provided_deps argument to java_library rule
-java_library(
-    name = "api",
-    srcs = glob([SRC + "**/*.java"]),
-    visibility = ["//visibility:public"],
-    deps = [
-        "//gerrit-common:annotations",
-        "//lib:guava",
-        "//lib/guice",
-        "//lib/guice:guice-assistedinject",
-    ],
-)
-
-junit_tests(
-    name = "api_tests",
-    srcs = glob(["src/test/java/**/*Test.java"]),
-    deps = [
-        ":api",
-        "//gerrit-test-util:test_util",
-        "//lib:truth",
-        "//lib/guice",
-    ],
-)
-
-java_doc(
-    name = "extension-api-javadoc",
-    external_docs = [
-        JGIT_DOC_URL,
-        GUAVA_DOC_URL,
-    ],
-    libs = [":api"],
-    pkgs = ["com.google.gerrit.extensions"],
-    title = "Gerrit Review Extension API Documentation",
-    visibility = ["//visibility:public"],
-)
diff --git a/gerrit-extension-api/pom.xml b/gerrit-extension-api/pom.xml
deleted file mode 100644
index 056010a0..0000000
--- a/gerrit-extension-api/pom.xml
+++ /dev/null
@@ -1,83 +0,0 @@
-<project>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>com.google.gerrit</groupId>
-  <artifactId>gerrit-extension-api</artifactId>
-  <version>2.15.12-SNAPSHOT</version>
-  <packaging>jar</packaging>
-  <name>Gerrit Code Review - Extension API</name>
-  <description>API for Gerrit Extensions</description>
-  <url>https://www.gerritcodereview.com/</url>
-
-  <licenses>
-    <license>
-      <name>The Apache Software License, Version 2.0</name>
-      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
-      <distribution>repo</distribution>
-    </license>
-  </licenses>
-
-  <scm>
-    <url>https://gerrit.googlesource.com/gerrit</url>
-    <connection>https://gerrit.googlesource.com/gerrit</connection>
-  </scm>
-
-  <developers>
-    <developer>
-      <name>Alice Kober-Sotzek</name>
-    </developer>
-    <developer>
-      <name>Ben Rohlfs</name>
-    </developer>
-    <developer>
-      <name>Dave Borowitz</name>
-    </developer>
-    <developer>
-      <name>David Ostrovsky</name>
-    </developer>
-    <developer>
-      <name>David Pursehouse</name>
-    </developer>
-    <developer>
-      <name>Edwin Kempin</name>
-    </developer>
-    <developer>
-      <name>Han-Wen Nienhuys</name>
-    </developer>
-    <developer>
-      <name>Hugo Arès</name>
-    </developer>
-    <developer>
-      <name>Luca Milanesio</name>
-    </developer>
-    <developer>
-      <name>Marco Miller</name>
-    </developer>
-    <developer>
-      <name>Martin Fick</name>
-    </developer>
-    <developer>
-      <name>Ole Rehmsen</name>
-    </developer>
-    <developer>
-      <name>Patrick Hiesel</name>
-    </developer>
-    <developer>
-      <name>Saša Živkov</name>
-    </developer>
-  </developers>
-
-  <mailingLists>
-    <mailingList>
-      <name>Repo and Gerrit Discussion</name>
-      <post>repo-discuss@googlegroups.com</post>
-      <subscribe>https://groups.google.com/forum/#!forum/repo-discuss</subscribe>
-      <unsubscribe>https://groups.google.com/forum/#!forum/repo-discuss</unsubscribe>
-      <archive>https://groups.google.com/forum/#!forum/repo-discuss</archive>
-    </mailingList>
-  </mailingLists>
-
-  <issueManagement>
-    <url>https://bugs.chromium.org/p/gerrit/issues/list</url>
-    <system>Gerrit Issue Tracker</system>
-  </issueManagement>
-</project>
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/access/GlobalOrPluginPermission.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/access/GlobalOrPluginPermission.java
deleted file mode 100644
index deae084..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/access/GlobalOrPluginPermission.java
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.extensions.api.access;
-
-/**
- * A {@link com.google.gerrit.server.permissions.GlobalPermission} or a {@link PluginPermission}.
- */
-public interface GlobalOrPluginPermission {
-  /** @return name used in {@code project.config} permissions. */
-  public String permissionName();
-
-  /** @return readable identifier of this permission for exception message. */
-  public String describeForException();
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/access/PluginPermission.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/access/PluginPermission.java
deleted file mode 100644
index 7a467b8..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/access/PluginPermission.java
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.extensions.api.access;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.Objects;
-
-/** A global capability type permission used by a plugin. */
-public class PluginPermission implements GlobalOrPluginPermission {
-  private final String pluginName;
-  private final String capability;
-  private final boolean fallBackToAdmin;
-
-  public PluginPermission(String pluginName, String capability) {
-    this(pluginName, capability, true);
-  }
-
-  public PluginPermission(String pluginName, String capability, boolean fallBackToAdmin) {
-    this.pluginName = checkNotNull(pluginName, "pluginName");
-    this.capability = checkNotNull(capability, "capability");
-    this.fallBackToAdmin = fallBackToAdmin;
-  }
-
-  public String pluginName() {
-    return pluginName;
-  }
-
-  public String capability() {
-    return capability;
-  }
-
-  public boolean fallBackToAdmin() {
-    return fallBackToAdmin;
-  }
-
-  @Override
-  public String permissionName() {
-    return pluginName + '-' + capability;
-  }
-
-  @Override
-  public String describeForException() {
-    return capability + " for plugin " + pluginName;
-  }
-
-  @Override
-  public int hashCode() {
-    return Objects.hash(pluginName, capability);
-  }
-
-  @Override
-  public boolean equals(Object other) {
-    if (other instanceof PluginPermission) {
-      PluginPermission b = (PluginPermission) other;
-      return pluginName.equals(b.pluginName) && capability.equals(b.capability);
-    }
-    return false;
-  }
-
-  @Override
-  public String toString() {
-    return "PluginPermission[plugin=" + pluginName + ", capability=" + capability + ']';
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/access/ProjectAccessInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/access/ProjectAccessInfo.java
deleted file mode 100644
index bc5daf6..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/access/ProjectAccessInfo.java
+++ /dev/null
@@ -1,33 +0,0 @@
-// 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.
-
-package com.google.gerrit.extensions.api.access;
-
-import com.google.gerrit.extensions.common.GroupInfo;
-import com.google.gerrit.extensions.common.ProjectInfo;
-import java.util.Map;
-import java.util.Set;
-
-public class ProjectAccessInfo {
-  public String revision;
-  public ProjectInfo inheritsFrom;
-  public Map<String, AccessSectionInfo> local;
-  public Boolean isOwner;
-  public Set<String> ownerOf;
-  public Boolean canUpload;
-  public Boolean canAdd;
-  public Boolean canAddTags;
-  public Boolean configVisible;
-  public Map<String, GroupInfo> groups;
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/AccountApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/AccountApi.java
deleted file mode 100644
index 1526cc6..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/AccountApi.java
+++ /dev/null
@@ -1,290 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.extensions.api.accounts;
-
-import com.google.gerrit.extensions.api.changes.StarsInput;
-import com.google.gerrit.extensions.client.DiffPreferencesInfo;
-import com.google.gerrit.extensions.client.EditPreferencesInfo;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
-import com.google.gerrit.extensions.client.ProjectWatchInfo;
-import com.google.gerrit.extensions.common.AccountExternalIdInfo;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.AgreementInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.EmailInfo;
-import com.google.gerrit.extensions.common.GpgKeyInfo;
-import com.google.gerrit.extensions.common.GroupInfo;
-import com.google.gerrit.extensions.common.SshKeyInfo;
-import com.google.gerrit.extensions.restapi.NotImplementedException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import java.util.List;
-import java.util.Map;
-import java.util.SortedSet;
-
-public interface AccountApi {
-  AccountInfo get() throws RestApiException;
-
-  boolean getActive() throws RestApiException;
-
-  void setActive(boolean active) throws RestApiException;
-
-  String getAvatarUrl(int size) throws RestApiException;
-
-  GeneralPreferencesInfo getPreferences() throws RestApiException;
-
-  GeneralPreferencesInfo setPreferences(GeneralPreferencesInfo in) throws RestApiException;
-
-  DiffPreferencesInfo getDiffPreferences() throws RestApiException;
-
-  DiffPreferencesInfo setDiffPreferences(DiffPreferencesInfo in) throws RestApiException;
-
-  EditPreferencesInfo getEditPreferences() throws RestApiException;
-
-  EditPreferencesInfo setEditPreferences(EditPreferencesInfo in) throws RestApiException;
-
-  List<ProjectWatchInfo> getWatchedProjects() throws RestApiException;
-
-  List<ProjectWatchInfo> setWatchedProjects(List<ProjectWatchInfo> in) throws RestApiException;
-
-  void deleteWatchedProjects(List<ProjectWatchInfo> in) throws RestApiException;
-
-  void starChange(String changeId) throws RestApiException;
-
-  void unstarChange(String changeId) throws RestApiException;
-
-  void setStars(String changeId, StarsInput input) throws RestApiException;
-
-  SortedSet<String> getStars(String changeId) throws RestApiException;
-
-  List<ChangeInfo> getStarredChanges() throws RestApiException;
-
-  List<GroupInfo> getGroups() throws RestApiException;
-
-  List<EmailInfo> getEmails() throws RestApiException;
-
-  void addEmail(EmailInput input) throws RestApiException;
-
-  void deleteEmail(String email) throws RestApiException;
-
-  void setStatus(String status) throws RestApiException;
-
-  List<SshKeyInfo> listSshKeys() throws RestApiException;
-
-  SshKeyInfo addSshKey(String key) throws RestApiException;
-
-  void deleteSshKey(int seq) throws RestApiException;
-
-  Map<String, GpgKeyInfo> listGpgKeys() throws RestApiException;
-
-  Map<String, GpgKeyInfo> putGpgKeys(List<String> add, List<String> remove) throws RestApiException;
-
-  GpgKeyApi gpgKey(String id) throws RestApiException;
-
-  List<AgreementInfo> listAgreements() throws RestApiException;
-
-  void signAgreement(String agreementName) throws RestApiException;
-
-  void index() throws RestApiException;
-
-  List<AccountExternalIdInfo> getExternalIds() throws RestApiException;
-
-  void deleteExternalIds(List<String> externalIds) throws RestApiException;
-
-  void setName(String name) throws RestApiException;
-
-  /**
-   * A default implementation which allows source compatibility when adding new methods to the
-   * interface.
-   */
-  class NotImplemented implements AccountApi {
-    @Override
-    public AccountInfo get() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public boolean getActive() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void setActive(boolean active) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public String getAvatarUrl(int size) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public GeneralPreferencesInfo getPreferences() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public GeneralPreferencesInfo setPreferences(GeneralPreferencesInfo in)
-        throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public DiffPreferencesInfo getDiffPreferences() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public DiffPreferencesInfo setDiffPreferences(DiffPreferencesInfo in) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public EditPreferencesInfo getEditPreferences() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public EditPreferencesInfo setEditPreferences(EditPreferencesInfo in) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public List<ProjectWatchInfo> getWatchedProjects() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public List<ProjectWatchInfo> setWatchedProjects(List<ProjectWatchInfo> in)
-        throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void deleteWatchedProjects(List<ProjectWatchInfo> in) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void starChange(String changeId) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void unstarChange(String changeId) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void setStars(String changeId, StarsInput input) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public SortedSet<String> getStars(String changeId) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public List<ChangeInfo> getStarredChanges() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public List<GroupInfo> getGroups() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public List<EmailInfo> getEmails() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void addEmail(EmailInput input) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void deleteEmail(String email) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void setStatus(String status) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public List<SshKeyInfo> listSshKeys() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public SshKeyInfo addSshKey(String key) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void deleteSshKey(int seq) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public Map<String, GpgKeyInfo> putGpgKeys(List<String> add, List<String> remove)
-        throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public GpgKeyApi gpgKey(String id) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public Map<String, GpgKeyInfo> listGpgKeys() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public List<AgreementInfo> listAgreements() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void signAgreement(String agreementName) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void index() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public List<AccountExternalIdInfo> getExternalIds() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void deleteExternalIds(List<String> externalIds) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void setName(String name) throws RestApiException {
-      throw new NotImplementedException();
-    }
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/Accounts.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/Accounts.java
deleted file mode 100644
index 8ab5110..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/Accounts.java
+++ /dev/null
@@ -1,254 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.extensions.api.accounts;
-
-import com.google.gerrit.extensions.client.ListAccountsOption;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.restapi.NotImplementedException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import java.util.Arrays;
-import java.util.EnumSet;
-import java.util.List;
-
-public interface Accounts {
-  /**
-   * Look up an account by ID.
-   *
-   * <p><strong>Note:</strong> This method eagerly reads the account. Methods that mutate the
-   * account do not necessarily re-read the account. Therefore, calling a getter method on an
-   * instance after calling a mutation method on that same instance is not guaranteed to reflect the
-   * mutation. It is not recommended to store references to {@code AccountApi} instances.
-   *
-   * @param id any identifier supported by the REST API, including numeric ID, email, or username.
-   * @return API for accessing the account.
-   * @throws RestApiException if an error occurred.
-   */
-  AccountApi id(String id) throws RestApiException;
-
-  /** @see #id(String) */
-  AccountApi id(int id) throws RestApiException;
-
-  /**
-   * Look up the account of the current in-scope user.
-   *
-   * @see #id(String)
-   */
-  AccountApi self() throws RestApiException;
-
-  /** Create a new account with the given username and default options. */
-  AccountApi create(String username) throws RestApiException;
-
-  /** Create a new account. */
-  AccountApi create(AccountInput input) throws RestApiException;
-
-  /**
-   * Suggest users for a given query.
-   *
-   * <p>Example code: {@code suggestAccounts().withQuery("Reviewer").withLimit(5).get()}
-   *
-   * @return API for setting parameters and getting result.
-   */
-  SuggestAccountsRequest suggestAccounts() throws RestApiException;
-
-  /**
-   * Suggest users for a given query.
-   *
-   * <p>Shortcut API for {@code suggestAccounts().withQuery(String)}.
-   *
-   * @see #suggestAccounts()
-   */
-  SuggestAccountsRequest suggestAccounts(String query) throws RestApiException;
-
-  /**
-   * Query users.
-   *
-   * <p>Example code: {@code query().withQuery("name:John email:example.com").withLimit(5).get()}
-   *
-   * @return API for setting parameters and getting result.
-   */
-  QueryRequest query() throws RestApiException;
-
-  /**
-   * Query users.
-   *
-   * <p>Shortcut API for {@code query().withQuery(String)}.
-   *
-   * @see #query()
-   */
-  QueryRequest query(String query) throws RestApiException;
-
-  /**
-   * API for setting parameters and getting result. Used for {@code suggestAccounts()}.
-   *
-   * @see #suggestAccounts()
-   */
-  abstract class SuggestAccountsRequest {
-    private String query;
-    private int limit;
-
-    /** Execute query and return a list of accounts. */
-    public abstract List<AccountInfo> get() throws RestApiException;
-
-    /**
-     * Set query.
-     *
-     * @param query needs to be in human-readable form.
-     */
-    public SuggestAccountsRequest withQuery(String query) {
-      this.query = query;
-      return this;
-    }
-
-    /**
-     * Set limit for returned list of accounts. Optional; server-default is used when not provided.
-     */
-    public SuggestAccountsRequest withLimit(int limit) {
-      this.limit = limit;
-      return this;
-    }
-
-    public String getQuery() {
-      return query;
-    }
-
-    public int getLimit() {
-      return limit;
-    }
-  }
-
-  /**
-   * API for setting parameters and getting result. Used for {@code query()}.
-   *
-   * @see #query()
-   */
-  abstract class QueryRequest {
-    private String query;
-    private int limit;
-    private int start;
-    private EnumSet<ListAccountsOption> options = EnumSet.noneOf(ListAccountsOption.class);
-
-    /** Execute query and return a list of accounts. */
-    public abstract List<AccountInfo> get() throws RestApiException;
-
-    /**
-     * Set query.
-     *
-     * @param query needs to be in human-readable form.
-     */
-    public QueryRequest withQuery(String query) {
-      this.query = query;
-      return this;
-    }
-
-    /**
-     * Set limit for returned list of accounts. Optional; server-default is used when not provided.
-     */
-    public QueryRequest withLimit(int limit) {
-      this.limit = limit;
-      return this;
-    }
-
-    /** Set number of accounts to skip. Optional; no accounts are skipped when not provided. */
-    public QueryRequest withStart(int start) {
-      this.start = start;
-      return this;
-    }
-
-    /** Set an option on the request, appending to existing options. */
-    public QueryRequest withOption(ListAccountsOption options) {
-      this.options.add(options);
-      return this;
-    }
-
-    /** Set options on the request, appending to existing options. */
-    public QueryRequest withOptions(ListAccountsOption... options) {
-      this.options.addAll(Arrays.asList(options));
-      return this;
-    }
-
-    /** Set options on the request, replacing existing options. */
-    public QueryRequest withOptions(EnumSet<ListAccountsOption> options) {
-      this.options = options;
-      return this;
-    }
-
-    public String getQuery() {
-      return query;
-    }
-
-    public int getLimit() {
-      return limit;
-    }
-
-    public int getStart() {
-      return start;
-    }
-
-    public EnumSet<ListAccountsOption> getOptions() {
-      return options;
-    }
-  }
-
-  /**
-   * A default implementation which allows source compatibility when adding new methods to the
-   * interface.
-   */
-  class NotImplemented implements Accounts {
-    @Override
-    public AccountApi id(String id) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public AccountApi id(int id) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public AccountApi self() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public AccountApi create(String username) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public AccountApi create(AccountInput input) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public SuggestAccountsRequest suggestAccounts() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public SuggestAccountsRequest suggestAccounts(String query) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public QueryRequest query() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public QueryRequest query(String query) throws RestApiException {
-      throw new NotImplementedException();
-    }
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ChangeApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ChangeApi.java
deleted file mode 100644
index 5183a89..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ChangeApi.java
+++ /dev/null
@@ -1,608 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.extensions.api.changes;
-
-import com.google.common.collect.Sets;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.client.ListChangesOption;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.CommentInfo;
-import com.google.gerrit.extensions.common.CommitMessageInput;
-import com.google.gerrit.extensions.common.EditInfo;
-import com.google.gerrit.extensions.common.MergePatchSetInput;
-import com.google.gerrit.extensions.common.PureRevertInfo;
-import com.google.gerrit.extensions.common.RobotCommentInfo;
-import com.google.gerrit.extensions.common.SuggestedReviewerInfo;
-import com.google.gerrit.extensions.restapi.NotImplementedException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import java.util.Arrays;
-import java.util.EnumSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-public interface ChangeApi {
-  String id();
-
-  /**
-   * Look up the current revision for the change.
-   *
-   * <p><strong>Note:</strong> This method eagerly reads the revision. Methods that mutate the
-   * revision do not necessarily re-read the revision. Therefore, calling a getter method on an
-   * instance after calling a mutation method on that same instance is not guaranteed to reflect the
-   * mutation. It is not recommended to store references to {@code RevisionApi} instances.
-   *
-   * @return API for accessing the revision.
-   * @throws RestApiException if an error occurred.
-   */
-  RevisionApi current() throws RestApiException;
-
-  /**
-   * Look up a revision of a change by number.
-   *
-   * @see #current()
-   */
-  RevisionApi revision(int id) throws RestApiException;
-
-  /**
-   * Look up a revision of a change by commit SHA-1.
-   *
-   * @see #current()
-   */
-  RevisionApi revision(String id) throws RestApiException;
-
-  /**
-   * Look up the reviewer of the change.
-   *
-   * <p>
-   *
-   * @param id ID of the account, can be a string of the format "Full Name
-   *     &lt;mail@example.com&gt;", just the email address, a full name if it is unique, an account
-   *     ID, a user name or 'self' for the calling user.
-   * @return API for accessing the reviewer.
-   * @throws RestApiException if id is not account ID or is a user that isn't known to be a reviewer
-   *     for this change.
-   */
-  ReviewerApi reviewer(String id) throws RestApiException;
-
-  void abandon() throws RestApiException;
-
-  void abandon(AbandonInput in) throws RestApiException;
-
-  void restore() throws RestApiException;
-
-  void restore(RestoreInput in) throws RestApiException;
-
-  void move(String destination) throws RestApiException;
-
-  void move(MoveInput in) throws RestApiException;
-
-  void setPrivate(boolean value, @Nullable String message) throws RestApiException;
-
-  default void setPrivate(boolean value) throws RestApiException {
-    setPrivate(value, null);
-  }
-
-  void setWorkInProgress(@Nullable String message) throws RestApiException;
-
-  void setReadyForReview(@Nullable String message) throws RestApiException;
-
-  default void setWorkInProgress() throws RestApiException {
-    setWorkInProgress(null);
-  }
-
-  default void setReadyForReview() throws RestApiException {
-    setReadyForReview(null);
-  }
-
-  /**
-   * Ignore or un-ignore this change.
-   *
-   * @param ignore ignore the change if true
-   */
-  void ignore(boolean ignore) throws RestApiException;
-
-  /**
-   * Check if this change is ignored.
-   *
-   * @return true if the change is ignored
-   */
-  boolean ignored() throws RestApiException;
-
-  /**
-   * Mark this change as reviewed/unreviewed.
-   *
-   * @param reviewed flag to decide if this change should be marked as reviewed ({@code true}) or
-   *     unreviewed ({@code false})
-   */
-  void markAsReviewed(boolean reviewed) throws RestApiException;
-
-  /**
-   * Create a new change that reverts this change.
-   *
-   * @see Changes#id(int)
-   */
-  ChangeApi revert() throws RestApiException;
-
-  /**
-   * Create a new change that reverts this change.
-   *
-   * @see Changes#id(int)
-   */
-  ChangeApi revert(RevertInput in) throws RestApiException;
-
-  /** Create a merge patch set for the change. */
-  ChangeInfo createMergePatchSet(MergePatchSetInput in) throws RestApiException;
-
-  List<ChangeInfo> submittedTogether() throws RestApiException;
-
-  SubmittedTogetherInfo submittedTogether(EnumSet<SubmittedTogetherOption> options)
-      throws RestApiException;
-
-  SubmittedTogetherInfo submittedTogether(
-      EnumSet<ListChangesOption> listOptions, EnumSet<SubmittedTogetherOption> submitOptions)
-      throws RestApiException;
-
-  /** Publishes a draft change. */
-  @Deprecated
-  void publish() throws RestApiException;
-
-  /** Rebase the current revision of a change using default options. */
-  void rebase() throws RestApiException;
-
-  /** Rebase the current revision of a change. */
-  void rebase(RebaseInput in) throws RestApiException;
-
-  /** Deletes a change. */
-  void delete() throws RestApiException;
-
-  String topic() throws RestApiException;
-
-  void topic(String topic) throws RestApiException;
-
-  IncludedInInfo includedIn() throws RestApiException;
-
-  AddReviewerResult addReviewer(AddReviewerInput in) throws RestApiException;
-
-  AddReviewerResult addReviewer(String in) throws RestApiException;
-
-  SuggestedReviewersRequest suggestReviewers() throws RestApiException;
-
-  SuggestedReviewersRequest suggestReviewers(String query) throws RestApiException;
-
-  /**
-   * Retrieve reviewers ({@code ReviewerState.REVIEWER} and {@code ReviewerState.CC}) on the change.
-   */
-  List<ReviewerInfo> reviewers() throws RestApiException;
-
-  ChangeInfo get(EnumSet<ListChangesOption> options) throws RestApiException;
-
-  default ChangeInfo get(Iterable<ListChangesOption> options) throws RestApiException {
-    return get(Sets.newEnumSet(options, ListChangesOption.class));
-  }
-
-  default ChangeInfo get(ListChangesOption... options) throws RestApiException {
-    return get(Arrays.asList(options));
-  }
-
-  /** {@code get} with {@link ListChangesOption} set to all except CHECK. */
-  ChangeInfo get() throws RestApiException;
-  /** {@code get} with {@link ListChangesOption} set to none. */
-  ChangeInfo info() throws RestApiException;
-
-  /**
-   * Retrieve change edit when exists.
-   *
-   * @deprecated Replaced by {@link ChangeApi#edit()} in combination with {@link
-   *     ChangeEditApi#get()}.
-   */
-  @Deprecated
-  EditInfo getEdit() throws RestApiException;
-
-  /**
-   * Provides access to an API regarding the change edit of this change.
-   *
-   * @return a {@code ChangeEditApi} for the change edit of this change
-   * @throws RestApiException if the API isn't accessible
-   */
-  ChangeEditApi edit() throws RestApiException;
-
-  /** Create a new patch set with a new commit message. */
-  void setMessage(String message) throws RestApiException;
-
-  /** Create a new patch set with a new commit message. */
-  void setMessage(CommitMessageInput in) throws RestApiException;
-
-  /** Set hashtags on a change */
-  void setHashtags(HashtagsInput input) throws RestApiException;
-
-  /**
-   * Get hashtags on a change.
-   *
-   * @return hashtags
-   * @throws RestApiException
-   */
-  Set<String> getHashtags() throws RestApiException;
-
-  /** Set the assignee of a change. */
-  AccountInfo setAssignee(AssigneeInput input) throws RestApiException;
-
-  /** Get the assignee of a change. */
-  AccountInfo getAssignee() throws RestApiException;
-
-  /** Get all past assignees. */
-  List<AccountInfo> getPastAssignees() throws RestApiException;
-
-  /**
-   * Delete the assignee of a change.
-   *
-   * @return the assignee that was deleted, or null if there was no assignee.
-   */
-  AccountInfo deleteAssignee() throws RestApiException;
-
-  /**
-   * Get all published comments on a change.
-   *
-   * @return comments in a map keyed by path; comments have the {@code revision} field set to
-   *     indicate their patch set.
-   * @throws RestApiException
-   */
-  Map<String, List<CommentInfo>> comments() throws RestApiException;
-
-  /**
-   * Get all robot comments on a change.
-   *
-   * @return robot comments in a map keyed by path; robot comments have the {@code revision} field
-   *     set to indicate their patch set.
-   * @throws RestApiException
-   */
-  Map<String, List<RobotCommentInfo>> robotComments() throws RestApiException;
-
-  /**
-   * Get all draft comments for the current user on a change.
-   *
-   * @return drafts in a map keyed by path; comments have the {@code revision} field set to indicate
-   *     their patch set.
-   * @throws RestApiException
-   */
-  Map<String, List<CommentInfo>> drafts() throws RestApiException;
-
-  ChangeInfo check() throws RestApiException;
-
-  ChangeInfo check(FixInput fix) throws RestApiException;
-
-  void index() throws RestApiException;
-
-  /** Check if this change is a pure revert of the change stored in revertOf. */
-  PureRevertInfo pureRevert() throws RestApiException;
-
-  /** Check if this change is a pure revert of claimedOriginal (SHA1 in 40 digit hex). */
-  PureRevertInfo pureRevert(String claimedOriginal) throws RestApiException;
-
-  abstract class SuggestedReviewersRequest {
-    private String query;
-    private int limit;
-
-    public abstract List<SuggestedReviewerInfo> get() throws RestApiException;
-
-    public SuggestedReviewersRequest withQuery(String query) {
-      this.query = query;
-      return this;
-    }
-
-    public SuggestedReviewersRequest withLimit(int limit) {
-      this.limit = limit;
-      return this;
-    }
-
-    public String getQuery() {
-      return query;
-    }
-
-    public int getLimit() {
-      return limit;
-    }
-  }
-
-  /**
-   * A default implementation which allows source compatibility when adding new methods to the
-   * interface.
-   */
-  class NotImplemented implements ChangeApi {
-    @Override
-    public String id() {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public RevisionApi current() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public RevisionApi revision(int id) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public ReviewerApi reviewer(String id) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public RevisionApi revision(String id) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void abandon() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void abandon(AbandonInput in) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void restore() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void restore(RestoreInput in) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void move(String destination) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void move(MoveInput in) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void setPrivate(boolean value, @Nullable String message) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void setWorkInProgress(String message) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void setReadyForReview(String message) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public ChangeApi revert() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public ChangeApi revert(RevertInput in) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void publish() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Deprecated
-    @Override
-    public void rebase() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void rebase(RebaseInput in) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void delete() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public String topic() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void topic(String topic) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public IncludedInInfo includedIn() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public AddReviewerResult addReviewer(AddReviewerInput in) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public AddReviewerResult addReviewer(String in) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public SuggestedReviewersRequest suggestReviewers() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public SuggestedReviewersRequest suggestReviewers(String query) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public List<ReviewerInfo> reviewers() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public ChangeInfo get(EnumSet<ListChangesOption> options) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public ChangeInfo get() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public ChangeInfo info() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void setMessage(String message) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void setMessage(CommitMessageInput in) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public EditInfo getEdit() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public ChangeEditApi edit() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void setHashtags(HashtagsInput input) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public Set<String> getHashtags() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public AccountInfo setAssignee(AssigneeInput input) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public AccountInfo getAssignee() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public List<AccountInfo> getPastAssignees() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public AccountInfo deleteAssignee() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public Map<String, List<CommentInfo>> comments() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public Map<String, List<RobotCommentInfo>> robotComments() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public Map<String, List<CommentInfo>> drafts() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public ChangeInfo check() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public ChangeInfo check(FixInput fix) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void index() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public List<ChangeInfo> submittedTogether() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public SubmittedTogetherInfo submittedTogether(EnumSet<SubmittedTogetherOption> options)
-        throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public SubmittedTogetherInfo submittedTogether(
-        EnumSet<ListChangesOption> a, EnumSet<SubmittedTogetherOption> b) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public ChangeInfo createMergePatchSet(MergePatchSetInput in) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void ignore(boolean ignore) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public boolean ignored() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void markAsReviewed(boolean reviewed) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public PureRevertInfo pureRevert() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public PureRevertInfo pureRevert(String claimedOriginal) throws RestApiException {
-      throw new NotImplementedException();
-    }
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/CherryPickInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/CherryPickInput.java
deleted file mode 100644
index 694e06b..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/CherryPickInput.java
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.extensions.api.changes;
-
-import java.util.Map;
-
-public class CherryPickInput {
-  public String message;
-  // Cherry-pick destination branch, which will be the destination of the newly created change.
-  public String destination;
-  // 40-hex digit SHA-1 of the commit which will be the parent commit of the newly created change.
-  public String base;
-  public Integer parent;
-
-  public NotifyHandling notify = NotifyHandling.NONE;
-  public Map<RecipientType, NotifyInfo> notifyDetails;
-
-  public boolean keepReviewers;
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/IncludedInInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/IncludedInInfo.java
deleted file mode 100644
index d876034..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/IncludedInInfo.java
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.extensions.api.changes;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
-public class IncludedInInfo {
-  public List<String> branches;
-  public List<String> tags;
-  public Map<String, Collection<String>> external;
-
-  public IncludedInInfo(
-      List<String> branches, List<String> tags, Map<String, Collection<String>> external) {
-    this.branches = branches;
-    this.tags = tags;
-    this.external = external;
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevertInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevertInput.java
deleted file mode 100644
index 893472e..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevertInput.java
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.extensions.api.changes;
-
-import com.google.gerrit.extensions.restapi.DefaultInput;
-
-public class RevertInput {
-  @DefaultInput public String message;
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewInput.java
deleted file mode 100644
index 69acf75..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewInput.java
+++ /dev/null
@@ -1,176 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.extensions.api.changes;
-
-import static com.google.gerrit.extensions.client.ReviewerState.REVIEWER;
-
-import com.google.gerrit.extensions.client.Comment;
-import com.google.gerrit.extensions.client.ReviewerState;
-import com.google.gerrit.extensions.common.FixSuggestionInfo;
-import com.google.gerrit.extensions.restapi.DefaultInput;
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-/** Input passed to {@code POST /changes/[id]/revisions/[id]/review}. */
-public class ReviewInput {
-  @DefaultInput public String message;
-
-  public String tag;
-
-  public Map<String, Short> labels;
-  public Map<String, List<CommentInput>> comments;
-  public Map<String, List<RobotCommentInput>> robotComments;
-
-  /**
-   * How to process draft comments already in the database that were not also described in this
-   * input request.
-   *
-   * <p>Defaults to DELETE, unless {@link #onBehalfOf} is set, in which case it defaults to KEEP and
-   * any other value is disallowed.
-   */
-  public DraftHandling drafts;
-
-  /** Who to send email notifications to after review is stored. */
-  public NotifyHandling notify;
-
-  public Map<RecipientType, NotifyInfo> notifyDetails;
-
-  /** If true check to make sure that the comments being posted aren't already present. */
-  public boolean omitDuplicateComments;
-
-  /**
-   * Account ID, name, email address or username of another user. The review will be posted/updated
-   * on behalf of this named user instead of the caller. Caller must have the labelAs-$NAME
-   * permission granted for each label that appears in {@link #labels}. This is in addition to the
-   * named user also needing to have permission to use the labels.
-   */
-  public String onBehalfOf;
-
-  /** Reviewers that should be added to this change. */
-  public List<AddReviewerInput> reviewers;
-
-  /**
-   * If true mark the change as work in progress. It is an error for both {@link #workInProgress}
-   * and {@link #ready} to be true.
-   */
-  public boolean workInProgress;
-
-  /**
-   * If true mark the change as ready for review. It is an error for both {@link #workInProgress}
-   * and {@link #ready} to be true.
-   */
-  public boolean ready;
-
-  public enum DraftHandling {
-    /** Delete pending drafts on this revision only. */
-    DELETE,
-
-    /** Publish pending drafts on this revision only. */
-    PUBLISH,
-
-    /** Leave pending drafts alone. */
-    KEEP,
-
-    /** Publish pending drafts on all revisions. */
-    PUBLISH_ALL_REVISIONS
-  }
-
-  public static class CommentInput extends Comment {}
-
-  public static class RobotCommentInput extends CommentInput {
-    public String robotId;
-    public String robotRunId;
-    public String url;
-    public Map<String, String> properties;
-    public List<FixSuggestionInfo> fixSuggestions;
-  }
-
-  public ReviewInput message(String msg) {
-    message = msg != null && !msg.isEmpty() ? msg : null;
-    return this;
-  }
-
-  public ReviewInput label(String name, short value) {
-    if (name == null || name.isEmpty()) {
-      throw new IllegalArgumentException();
-    }
-    if (labels == null) {
-      labels = new LinkedHashMap<>(4);
-    }
-    labels.put(name, value);
-    return this;
-  }
-
-  public ReviewInput label(String name, int value) {
-    if (value < Short.MIN_VALUE || value > Short.MAX_VALUE) {
-      throw new IllegalArgumentException();
-    }
-    return label(name, (short) value);
-  }
-
-  public ReviewInput label(String name) {
-    return label(name, (short) 1);
-  }
-
-  public ReviewInput reviewer(String reviewer) {
-    return reviewer(reviewer, REVIEWER, false);
-  }
-
-  public ReviewInput reviewer(String reviewer, ReviewerState state, boolean confirmed) {
-    AddReviewerInput input = new AddReviewerInput();
-    input.reviewer = reviewer;
-    input.state = state;
-    input.confirmed = confirmed;
-    if (reviewers == null) {
-      reviewers = new ArrayList<>();
-    }
-    reviewers.add(input);
-    return this;
-  }
-
-  public ReviewInput setWorkInProgress(boolean workInProgress) {
-    this.workInProgress = workInProgress;
-    ready = !workInProgress;
-    return this;
-  }
-
-  public ReviewInput setReady(boolean ready) {
-    this.ready = ready;
-    workInProgress = !ready;
-    return this;
-  }
-
-  public static ReviewInput recommend() {
-    return new ReviewInput().label("Code-Review", 1);
-  }
-
-  public static ReviewInput dislike() {
-    return new ReviewInput().label("Code-Review", -1);
-  }
-
-  public static ReviewInput noScore() {
-    return new ReviewInput().label("Code-Review", 0);
-  }
-
-  public static ReviewInput approve() {
-    return new ReviewInput().label("Code-Review", 2);
-  }
-
-  public static ReviewInput reject() {
-    return new ReviewInput().label("Code-Review", -2);
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewerInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewerInfo.java
deleted file mode 100644
index 3a33de9..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewerInfo.java
+++ /dev/null
@@ -1,45 +0,0 @@
-// 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.
-
-package com.google.gerrit.extensions.api.changes;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.common.AccountInfo;
-import java.util.Map;
-
-/** Account and approval details for an added reviewer. */
-public class ReviewerInfo extends AccountInfo {
-  /**
-   * {@link Map} of label name to initial value for each approval the reviewer is responsible for.
-   */
-  @Nullable public Map<String, String> approvals;
-
-  public static ReviewerInfo byEmail(@Nullable String name, String email) {
-    ReviewerInfo info = new ReviewerInfo();
-    info.name = name;
-    info.email = email;
-    return info;
-  }
-
-  public ReviewerInfo(Integer id) {
-    super(id);
-  }
-
-  @Override
-  public String toString() {
-    return username;
-  }
-
-  private ReviewerInfo() {}
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevisionApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevisionApi.java
deleted file mode 100644
index 2c2b3d1..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevisionApi.java
+++ /dev/null
@@ -1,389 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.extensions.api.changes;
-
-import com.google.common.collect.ListMultimap;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.extensions.common.ActionInfo;
-import com.google.gerrit.extensions.common.ApprovalInfo;
-import com.google.gerrit.extensions.common.CommentInfo;
-import com.google.gerrit.extensions.common.CommitInfo;
-import com.google.gerrit.extensions.common.EditInfo;
-import com.google.gerrit.extensions.common.FileInfo;
-import com.google.gerrit.extensions.common.MergeableInfo;
-import com.google.gerrit.extensions.common.RobotCommentInfo;
-import com.google.gerrit.extensions.common.TestSubmitRuleInput;
-import com.google.gerrit.extensions.restapi.BinaryResult;
-import com.google.gerrit.extensions.restapi.NotImplementedException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-public interface RevisionApi {
-  @Deprecated
-  void delete() throws RestApiException;
-
-  String description() throws RestApiException;
-
-  void description(String description) throws RestApiException;
-
-  ReviewResult review(ReviewInput in) throws RestApiException;
-
-  void submit() throws RestApiException;
-
-  void submit(SubmitInput in) throws RestApiException;
-
-  BinaryResult submitPreview() throws RestApiException;
-
-  BinaryResult submitPreview(String format) throws RestApiException;
-
-  @Deprecated
-  void publish() throws RestApiException;
-
-  ChangeApi cherryPick(CherryPickInput in) throws RestApiException;
-
-  ChangeApi rebase() throws RestApiException;
-
-  ChangeApi rebase(RebaseInput in) throws RestApiException;
-
-  boolean canRebase() throws RestApiException;
-
-  RevisionReviewerApi reviewer(String id) throws RestApiException;
-
-  void setReviewed(String path, boolean reviewed) throws RestApiException;
-
-  Set<String> reviewed() throws RestApiException;
-
-  Map<String, FileInfo> files() throws RestApiException;
-
-  Map<String, FileInfo> files(String base) throws RestApiException;
-
-  Map<String, FileInfo> files(int parentNum) throws RestApiException;
-
-  List<String> queryFiles(String query) throws RestApiException;
-
-  FileApi file(String path);
-
-  CommitInfo commit(boolean addLinks) throws RestApiException;
-
-  MergeableInfo mergeable() throws RestApiException;
-
-  MergeableInfo mergeableOtherBranches() throws RestApiException;
-
-  Map<String, List<CommentInfo>> comments() throws RestApiException;
-
-  Map<String, List<RobotCommentInfo>> robotComments() throws RestApiException;
-
-  Map<String, List<CommentInfo>> drafts() throws RestApiException;
-
-  List<CommentInfo> commentsAsList() throws RestApiException;
-
-  List<CommentInfo> draftsAsList() throws RestApiException;
-
-  List<RobotCommentInfo> robotCommentsAsList() throws RestApiException;
-
-  /**
-   * Applies the indicated fix by creating a new change edit or integrating the fix with the
-   * existing change edit. If no change edit exists before this call, the fix must refer to the
-   * current patch set. If a change edit exists, the fix must refer to the patch set on which the
-   * change edit is based.
-   *
-   * @param fixId the ID of the fix which should be applied
-   * @throws RestApiException if the fix couldn't be applied
-   */
-  EditInfo applyFix(String fixId) throws RestApiException;
-
-  DraftApi createDraft(DraftInput in) throws RestApiException;
-
-  DraftApi draft(String id) throws RestApiException;
-
-  CommentApi comment(String id) throws RestApiException;
-
-  RobotCommentApi robotComment(String id) throws RestApiException;
-
-  String etag() throws RestApiException;
-
-  /** Returns patch of revision. */
-  BinaryResult patch() throws RestApiException;
-
-  BinaryResult patch(String path) throws RestApiException;
-
-  Map<String, ActionInfo> actions() throws RestApiException;
-
-  SubmitType submitType() throws RestApiException;
-
-  SubmitType testSubmitType(TestSubmitRuleInput in) throws RestApiException;
-
-  MergeListRequest getMergeList() throws RestApiException;
-
-  RelatedChangesInfo related() throws RestApiException;
-
-  /** Returns votes on the revision. */
-  ListMultimap<String, ApprovalInfo> votes() throws RestApiException;
-
-  abstract class MergeListRequest {
-    private boolean addLinks;
-    private int uninterestingParent = 1;
-
-    public abstract List<CommitInfo> get() throws RestApiException;
-
-    public MergeListRequest withLinks() {
-      this.addLinks = true;
-      return this;
-    }
-
-    public MergeListRequest withUninterestingParent(int uninterestingParent) {
-      this.uninterestingParent = uninterestingParent;
-      return this;
-    }
-
-    public boolean getAddLinks() {
-      return addLinks;
-    }
-
-    public int getUninterestingParent() {
-      return uninterestingParent;
-    }
-  }
-
-  /**
-   * A default implementation which allows source compatibility when adding new methods to the
-   * interface.
-   */
-  class NotImplemented implements RevisionApi {
-    @Deprecated
-    @Override
-    public void delete() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public ReviewResult review(ReviewInput in) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void submit() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void submit(SubmitInput in) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Deprecated
-    @Override
-    public void publish() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public ChangeApi cherryPick(CherryPickInput in) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public ChangeApi rebase() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public ChangeApi rebase(RebaseInput in) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public boolean canRebase() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public RevisionReviewerApi reviewer(String id) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void setReviewed(String path, boolean reviewed) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public Set<String> reviewed() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public MergeableInfo mergeable() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public MergeableInfo mergeableOtherBranches() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public Map<String, FileInfo> files(String base) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public Map<String, FileInfo> files(int parentNum) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public Map<String, FileInfo> files() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public List<String> queryFiles(String query) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public FileApi file(String path) {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public CommitInfo commit(boolean addLinks) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public Map<String, List<CommentInfo>> comments() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public Map<String, List<RobotCommentInfo>> robotComments() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public List<CommentInfo> commentsAsList() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public List<CommentInfo> draftsAsList() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public List<RobotCommentInfo> robotCommentsAsList() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public EditInfo applyFix(String fixId) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public Map<String, List<CommentInfo>> drafts() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public DraftApi createDraft(DraftInput in) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public DraftApi draft(String id) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public CommentApi comment(String id) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public RobotCommentApi robotComment(String id) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public BinaryResult patch() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public BinaryResult patch(String path) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public Map<String, ActionInfo> actions() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public SubmitType submitType() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public BinaryResult submitPreview() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public BinaryResult submitPreview(String format) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public SubmitType testSubmitType(TestSubmitRuleInput in) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public MergeListRequest getMergeList() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public RelatedChangesInfo related() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public ListMultimap<String, ApprovalInfo> votes() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void description(String description) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public String description() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public String etag() throws RestApiException {
-      throw new NotImplementedException();
-    }
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/config/AccessCheckInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/config/AccessCheckInput.java
deleted file mode 100644
index 7b7c19d..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/config/AccessCheckInput.java
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.extensions.api.config;
-
-import com.google.gerrit.common.Nullable;
-
-public class AccessCheckInput {
-  public String account;
-
-  @Nullable public String ref;
-
-  public AccessCheckInput(String account, @Nullable String ref) {
-    this.account = account;
-    this.ref = ref;
-  }
-
-  public AccessCheckInput() {}
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/config/ConsistencyCheckInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/config/ConsistencyCheckInfo.java
deleted file mode 100644
index e44eb28..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/config/ConsistencyCheckInfo.java
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.extensions.api.config;
-
-import java.util.List;
-import java.util.Objects;
-
-public class ConsistencyCheckInfo {
-  public CheckAccountsResultInfo checkAccountsResult;
-  public CheckAccountExternalIdsResultInfo checkAccountExternalIdsResult;
-
-  public static class CheckAccountsResultInfo {
-    public List<ConsistencyProblemInfo> problems;
-
-    public CheckAccountsResultInfo(List<ConsistencyProblemInfo> problems) {
-      this.problems = problems;
-    }
-  }
-
-  public static class CheckAccountExternalIdsResultInfo {
-    public List<ConsistencyProblemInfo> problems;
-
-    public CheckAccountExternalIdsResultInfo(List<ConsistencyProblemInfo> problems) {
-      this.problems = problems;
-    }
-  }
-
-  public static class ConsistencyProblemInfo {
-    public enum Status {
-      ERROR,
-      WARNING,
-    }
-
-    public final Status status;
-    public final String message;
-
-    public ConsistencyProblemInfo(Status status, String message) {
-      this.status = status;
-      this.message = message;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-      if (o instanceof ConsistencyProblemInfo) {
-        ConsistencyProblemInfo other = ((ConsistencyProblemInfo) o);
-        return Objects.equals(status, other.status) && Objects.equals(message, other.message);
-      }
-      return false;
-    }
-
-    @Override
-    public int hashCode() {
-      return Objects.hash(status, message);
-    }
-
-    @Override
-    public String toString() {
-      return status.name() + ": " + message;
-    }
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/config/ConsistencyCheckInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/config/ConsistencyCheckInput.java
deleted file mode 100644
index f3d927e..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/config/ConsistencyCheckInput.java
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.extensions.api.config;
-
-public class ConsistencyCheckInput {
-  public CheckAccountsInput checkAccounts;
-  public CheckAccountExternalIdsInput checkAccountExternalIds;
-
-  public static class CheckAccountsInput {}
-
-  public static class CheckAccountExternalIdsInput {}
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/config/Server.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/config/Server.java
deleted file mode 100644
index ba81698..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/config/Server.java
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.extensions.api.config;
-
-import com.google.gerrit.extensions.client.DiffPreferencesInfo;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
-import com.google.gerrit.extensions.common.ServerInfo;
-import com.google.gerrit.extensions.restapi.NotImplementedException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-
-public interface Server {
-  /** @return Version of server. */
-  String getVersion() throws RestApiException;
-
-  ServerInfo getInfo() throws RestApiException;
-
-  GeneralPreferencesInfo getDefaultPreferences() throws RestApiException;
-
-  GeneralPreferencesInfo setDefaultPreferences(GeneralPreferencesInfo in) throws RestApiException;
-
-  DiffPreferencesInfo getDefaultDiffPreferences() throws RestApiException;
-
-  DiffPreferencesInfo setDefaultDiffPreferences(DiffPreferencesInfo in) throws RestApiException;
-
-  ConsistencyCheckInfo checkConsistency(ConsistencyCheckInput in) throws RestApiException;
-
-  /**
-   * A default implementation which allows source compatibility when adding new methods to the
-   * interface.
-   */
-  class NotImplemented implements Server {
-    @Override
-    public String getVersion() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public ServerInfo getInfo() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public GeneralPreferencesInfo getDefaultPreferences() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public GeneralPreferencesInfo setDefaultPreferences(GeneralPreferencesInfo in)
-        throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public DiffPreferencesInfo getDefaultDiffPreferences() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public DiffPreferencesInfo setDefaultDiffPreferences(DiffPreferencesInfo in)
-        throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public ConsistencyCheckInfo checkConsistency(ConsistencyCheckInput in) throws RestApiException {
-      throw new NotImplementedException();
-    }
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/groups/Groups.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/groups/Groups.java
deleted file mode 100644
index 47b6390..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/groups/Groups.java
+++ /dev/null
@@ -1,316 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.extensions.api.groups;
-
-import com.google.gerrit.extensions.client.ListGroupsOption;
-import com.google.gerrit.extensions.common.GroupInfo;
-import com.google.gerrit.extensions.restapi.NotImplementedException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.List;
-import java.util.Map;
-
-public interface Groups {
-  /**
-   * Look up a group by ID.
-   *
-   * <p><strong>Note:</strong> This method eagerly reads the group. Methods that mutate the group do
-   * not necessarily re-read the group. Therefore, calling a getter method on an instance after
-   * calling a mutation method on that same instance is not guaranteed to reflect the mutation. It
-   * is not recommended to store references to {@code groupApi} instances.
-   *
-   * @param id any identifier supported by the REST API, including group name or UUID.
-   * @return API for accessing the group.
-   * @throws RestApiException if an error occurred.
-   */
-  GroupApi id(String id) throws RestApiException;
-
-  /** Create a new group with the given name and default options. */
-  GroupApi create(String name) throws RestApiException;
-
-  /** Create a new group. */
-  GroupApi create(GroupInput input) throws RestApiException;
-
-  /** @return new request for listing groups. */
-  ListRequest list();
-
-  /**
-   * Query groups.
-   *
-   * <p>Example code: {@code query().withQuery("inname:test").withLimit(10).get()}
-   *
-   * @return API for setting parameters and getting result.
-   */
-  QueryRequest query();
-
-  /**
-   * Query groups.
-   *
-   * <p>Shortcut API for {@code query().withQuery(String)}.
-   *
-   * @see #query()
-   */
-  QueryRequest query(String query);
-
-  abstract class ListRequest {
-    private final EnumSet<ListGroupsOption> options = EnumSet.noneOf(ListGroupsOption.class);
-    private final List<String> projects = new ArrayList<>();
-    private final List<String> groups = new ArrayList<>();
-
-    private boolean visibleToAll;
-    private String user;
-    private boolean owned;
-    private int limit;
-    private int start;
-    private String substring;
-    private String suggest;
-    private String regex;
-
-    public List<GroupInfo> get() throws RestApiException {
-      Map<String, GroupInfo> map = getAsMap();
-      List<GroupInfo> result = new ArrayList<>(map.size());
-      for (Map.Entry<String, GroupInfo> e : map.entrySet()) {
-        // ListGroups "helpfully" nulls out names when converting to a map.
-        e.getValue().name = e.getKey();
-        result.add(e.getValue());
-      }
-      return Collections.unmodifiableList(result);
-    }
-
-    public abstract Map<String, GroupInfo> getAsMap() throws RestApiException;
-
-    public ListRequest addOption(ListGroupsOption option) {
-      options.add(option);
-      return this;
-    }
-
-    public ListRequest addOptions(ListGroupsOption... options) {
-      return addOptions(Arrays.asList(options));
-    }
-
-    public ListRequest addOptions(Iterable<ListGroupsOption> options) {
-      for (ListGroupsOption option : options) {
-        this.options.add(option);
-      }
-      return this;
-    }
-
-    public ListRequest withProject(String project) {
-      projects.add(project);
-      return this;
-    }
-
-    public ListRequest addGroup(String uuid) {
-      groups.add(uuid);
-      return this;
-    }
-
-    public ListRequest withVisibleToAll(boolean visible) {
-      visibleToAll = visible;
-      return this;
-    }
-
-    public ListRequest withUser(String user) {
-      this.user = user;
-      return this;
-    }
-
-    public ListRequest withOwned(boolean owned) {
-      this.owned = owned;
-      return this;
-    }
-
-    public ListRequest withLimit(int limit) {
-      this.limit = limit;
-      return this;
-    }
-
-    public ListRequest withStart(int start) {
-      this.start = start;
-      return this;
-    }
-
-    public ListRequest withSubstring(String substring) {
-      this.substring = substring;
-      return this;
-    }
-
-    public ListRequest withRegex(String regex) {
-      this.regex = regex;
-      return this;
-    }
-
-    public ListRequest withSuggest(String suggest) {
-      this.suggest = suggest;
-      return this;
-    }
-
-    public EnumSet<ListGroupsOption> getOptions() {
-      return options;
-    }
-
-    public List<String> getProjects() {
-      return Collections.unmodifiableList(projects);
-    }
-
-    public List<String> getGroups() {
-      return Collections.unmodifiableList(groups);
-    }
-
-    public boolean getVisibleToAll() {
-      return visibleToAll;
-    }
-
-    public String getUser() {
-      return user;
-    }
-
-    public boolean getOwned() {
-      return owned;
-    }
-
-    public int getLimit() {
-      return limit;
-    }
-
-    public int getStart() {
-      return start;
-    }
-
-    public String getSubstring() {
-      return substring;
-    }
-
-    public String getRegex() {
-      return regex;
-    }
-
-    public String getSuggest() {
-      return suggest;
-    }
-  }
-
-  /**
-   * API for setting parameters and getting result. Used for {@code query()}.
-   *
-   * @see #query()
-   */
-  abstract class QueryRequest {
-    private String query;
-    private int limit;
-    private int start;
-    private EnumSet<ListGroupsOption> options = EnumSet.noneOf(ListGroupsOption.class);
-
-    /** Execute query and returns the matched groups as list. */
-    public abstract List<GroupInfo> get() throws RestApiException;
-
-    /**
-     * Set query.
-     *
-     * @param query needs to be in human-readable form.
-     */
-    public QueryRequest withQuery(String query) {
-      this.query = query;
-      return this;
-    }
-
-    /**
-     * Set limit for returned list of groups. Optional; server-default is used when not provided.
-     */
-    public QueryRequest withLimit(int limit) {
-      this.limit = limit;
-      return this;
-    }
-
-    /** Set number of groups to skip. Optional; no groups are skipped when not provided. */
-    public QueryRequest withStart(int start) {
-      this.start = start;
-      return this;
-    }
-
-    /** Set an option on the request, appending to existing options. */
-    public QueryRequest withOption(ListGroupsOption options) {
-      this.options.add(options);
-      return this;
-    }
-
-    /** Set options on the request, appending to existing options. */
-    public QueryRequest withOptions(ListGroupsOption... options) {
-      this.options.addAll(Arrays.asList(options));
-      return this;
-    }
-
-    /** Set options on the request, replacing existing options. */
-    public QueryRequest withOptions(EnumSet<ListGroupsOption> options) {
-      this.options = options;
-      return this;
-    }
-
-    public String getQuery() {
-      return query;
-    }
-
-    public int getLimit() {
-      return limit;
-    }
-
-    public int getStart() {
-      return start;
-    }
-
-    public EnumSet<ListGroupsOption> getOptions() {
-      return options;
-    }
-  }
-
-  /**
-   * A default implementation which allows source compatibility when adding new methods to the
-   * interface.
-   */
-  class NotImplemented implements Groups {
-    @Override
-    public GroupApi id(String id) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public GroupApi create(String name) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public GroupApi create(GroupInput input) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public ListRequest list() {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public QueryRequest query() {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public QueryRequest query(String query) {
-      throw new NotImplementedException();
-    }
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/plugins/Plugins.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/plugins/Plugins.java
deleted file mode 100644
index 2828db5..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/plugins/Plugins.java
+++ /dev/null
@@ -1,128 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.extensions.api.plugins;
-
-import com.google.gerrit.extensions.common.InstallPluginInput;
-import com.google.gerrit.extensions.common.PluginInfo;
-import com.google.gerrit.extensions.restapi.NotImplementedException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.SortedMap;
-
-public interface Plugins {
-
-  ListRequest list() throws RestApiException;
-
-  PluginApi name(String name) throws RestApiException;
-
-  PluginApi install(String name, InstallPluginInput input) throws RestApiException;
-
-  abstract class ListRequest {
-    private boolean all;
-    private int limit;
-    private int start;
-    private String substring;
-    private String prefix;
-    private String regex;
-
-    public List<PluginInfo> get() throws RestApiException {
-      Map<String, PluginInfo> map = getAsMap();
-      List<PluginInfo> result = new ArrayList<>(map.size());
-      for (Map.Entry<String, PluginInfo> e : map.entrySet()) {
-        result.add(e.getValue());
-      }
-      return result;
-    }
-
-    public abstract SortedMap<String, PluginInfo> getAsMap() throws RestApiException;
-
-    public ListRequest all() {
-      this.all = true;
-      return this;
-    }
-
-    public boolean getAll() {
-      return all;
-    }
-
-    public ListRequest limit(int limit) {
-      this.limit = limit;
-      return this;
-    }
-
-    public int getLimit() {
-      return limit;
-    }
-
-    public ListRequest start(int start) {
-      this.start = start;
-      return this;
-    }
-
-    public int getStart() {
-      return start;
-    }
-
-    public ListRequest substring(String substring) {
-      this.substring = substring;
-      return this;
-    }
-
-    public String getSubstring() {
-      return substring;
-    }
-
-    public ListRequest prefix(String prefix) {
-      this.prefix = prefix;
-      return this;
-    }
-
-    public String getPrefix() {
-      return prefix;
-    }
-
-    public ListRequest regex(String regex) {
-      this.regex = regex;
-      return this;
-    }
-
-    public String getRegex() {
-      return regex;
-    }
-  }
-
-  /**
-   * A default implementation which allows source compatibility when adding new methods to the
-   * interface.
-   */
-  class NotImplemented implements Plugins {
-    @Override
-    public ListRequest list() {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public PluginApi name(String name) {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public PluginApi install(String name, InstallPluginInput input) throws RestApiException {
-      throw new NotImplementedException();
-    }
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/CommentLinkInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/CommentLinkInfo.java
deleted file mode 100644
index 64ad6086..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/CommentLinkInfo.java
+++ /dev/null
@@ -1,24 +0,0 @@
-// 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.
-
-package com.google.gerrit.extensions.api.projects;
-
-public class CommentLinkInfo {
-  public String match;
-  public String link;
-  public String html;
-  public Boolean enabled; // null means true
-
-  public transient String name;
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ConfigInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ConfigInfo.java
deleted file mode 100644
index 1460899..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ConfigInfo.java
+++ /dev/null
@@ -1,83 +0,0 @@
-// 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.
-
-package com.google.gerrit.extensions.api.projects;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.client.InheritableBoolean;
-import com.google.gerrit.extensions.client.ProjectState;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.extensions.common.ActionInfo;
-import java.util.List;
-import java.util.Map;
-
-public class ConfigInfo {
-  public String description;
-  public InheritedBooleanInfo useContributorAgreements;
-  public InheritedBooleanInfo useContentMerge;
-  public InheritedBooleanInfo useSignedOffBy;
-  public InheritedBooleanInfo createNewChangeForAllNotInTarget;
-  public InheritedBooleanInfo requireChangeId;
-  public InheritedBooleanInfo enableSignedPush;
-  public InheritedBooleanInfo requireSignedPush;
-  public InheritedBooleanInfo rejectImplicitMerges;
-  public InheritedBooleanInfo privateByDefault;
-  public InheritedBooleanInfo workInProgressByDefault;
-  public InheritedBooleanInfo enableReviewerByEmail;
-  public InheritedBooleanInfo matchAuthorToCommitterDate;
-  public MaxObjectSizeLimitInfo maxObjectSizeLimit;
-  public SubmitType submitType;
-  public ProjectState state;
-  public Map<String, Map<String, ConfigParameterInfo>> pluginConfig;
-  public Map<String, ActionInfo> actions;
-
-  public Map<String, CommentLinkInfo> commentlinks;
-  public ThemeInfo theme;
-
-  public Map<String, List<String>> extensionPanelNames;
-
-  public static class InheritedBooleanInfo {
-    public Boolean value;
-    public InheritableBoolean configuredValue;
-    public Boolean inheritedValue;
-  }
-
-  public static class MaxObjectSizeLimitInfo {
-    /** The effective value in bytes. Null if not set. */
-    @Nullable public String value;
-
-    /** The value configured explicitly on the project as a formatted string. Null if not set. */
-    @Nullable public String configuredValue;
-
-    /**
-     * Whether the value was inherited or overridden from the project's parent hierarchy or global
-     * config. Null if not inherited or overridden.
-     */
-    @Nullable public String summary;
-  }
-
-  public static class ConfigParameterInfo {
-    public String displayName;
-    public String description;
-    public String warning;
-    public ProjectConfigEntryType type;
-    public String value;
-    public Boolean editable;
-    public Boolean inheritable;
-    public String configuredValue;
-    public String inheritedValue;
-    public List<String> permittedValues;
-    public List<String> values;
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ConfigInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ConfigInput.java
deleted file mode 100644
index 24c882c8..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ConfigInput.java
+++ /dev/null
@@ -1,40 +0,0 @@
-// 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.
-
-package com.google.gerrit.extensions.api.projects;
-
-import com.google.gerrit.extensions.client.InheritableBoolean;
-import com.google.gerrit.extensions.client.ProjectState;
-import com.google.gerrit.extensions.client.SubmitType;
-import java.util.Map;
-
-public class ConfigInput {
-  public String description;
-  public InheritableBoolean useContributorAgreements;
-  public InheritableBoolean useContentMerge;
-  public InheritableBoolean useSignedOffBy;
-  public InheritableBoolean createNewChangeForAllNotInTarget;
-  public InheritableBoolean requireChangeId;
-  public InheritableBoolean enableSignedPush;
-  public InheritableBoolean requireSignedPush;
-  public InheritableBoolean rejectImplicitMerges;
-  public InheritableBoolean privateByDefault;
-  public InheritableBoolean workInProgressByDefault;
-  public InheritableBoolean enableReviewerByEmail;
-  public InheritableBoolean matchAuthorToCommitterDate;
-  public String maxObjectSizeLimit;
-  public SubmitType submitType;
-  public ProjectState state;
-  public Map<String, Map<String, ConfigValue>> pluginConfigValues;
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/DescriptionInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/DescriptionInput.java
deleted file mode 100644
index 322b076..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/DescriptionInput.java
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.extensions.api.projects;
-
-import com.google.gerrit.extensions.restapi.DefaultInput;
-
-public class DescriptionInput {
-  @DefaultInput public String description;
-  public String commitMessage;
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectApi.java
deleted file mode 100644
index 86b6a27..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectApi.java
+++ /dev/null
@@ -1,328 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.extensions.api.projects;
-
-import com.google.gerrit.extensions.api.access.ProjectAccessInfo;
-import com.google.gerrit.extensions.api.access.ProjectAccessInput;
-import com.google.gerrit.extensions.api.config.AccessCheckInfo;
-import com.google.gerrit.extensions.api.config.AccessCheckInput;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.ProjectInfo;
-import com.google.gerrit.extensions.restapi.NotImplementedException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import java.util.List;
-
-public interface ProjectApi {
-  ProjectApi create() throws RestApiException;
-
-  ProjectApi create(ProjectInput in) throws RestApiException;
-
-  ProjectInfo get() throws RestApiException;
-
-  String description() throws RestApiException;
-
-  void description(DescriptionInput in) throws RestApiException;
-
-  ProjectAccessInfo access() throws RestApiException;
-
-  ProjectAccessInfo access(ProjectAccessInput p) throws RestApiException;
-
-  ChangeInfo accessChange(ProjectAccessInput p) throws RestApiException;
-
-  AccessCheckInfo checkAccess(AccessCheckInput in) throws RestApiException;
-
-  ConfigInfo config() throws RestApiException;
-
-  ConfigInfo config(ConfigInput in) throws RestApiException;
-
-  ListRefsRequest<BranchInfo> branches();
-
-  ListRefsRequest<TagInfo> tags();
-
-  void deleteBranches(DeleteBranchesInput in) throws RestApiException;
-
-  void deleteTags(DeleteTagsInput in) throws RestApiException;
-
-  abstract class ListRefsRequest<T extends RefInfo> {
-    protected int limit;
-    protected int start;
-    protected String substring;
-    protected String regex;
-
-    public abstract List<T> get() throws RestApiException;
-
-    public ListRefsRequest<T> withLimit(int limit) {
-      this.limit = limit;
-      return this;
-    }
-
-    public ListRefsRequest<T> withStart(int start) {
-      this.start = start;
-      return this;
-    }
-
-    public ListRefsRequest<T> withSubstring(String substring) {
-      this.substring = substring;
-      return this;
-    }
-
-    public ListRefsRequest<T> withRegex(String regex) {
-      this.regex = regex;
-      return this;
-    }
-
-    public int getLimit() {
-      return limit;
-    }
-
-    public int getStart() {
-      return start;
-    }
-
-    public String getSubstring() {
-      return substring;
-    }
-
-    public String getRegex() {
-      return regex;
-    }
-  }
-
-  List<ProjectInfo> children() throws RestApiException;
-
-  List<ProjectInfo> children(boolean recursive) throws RestApiException;
-
-  ChildProjectApi child(String name) throws RestApiException;
-
-  /**
-   * Look up a branch by refname.
-   *
-   * <p><strong>Note:</strong> This method eagerly reads the branch. Methods that mutate the branch
-   * do not necessarily re-read the branch. Therefore, calling a getter method on an instance after
-   * calling a mutation method on that same instance is not guaranteed to reflect the mutation. It
-   * is not recommended to store references to {@code BranchApi} instances.
-   *
-   * @param ref branch name, with or without "refs/heads/" prefix.
-   * @throws RestApiException if a problem occurred reading the project.
-   * @return API for accessing the branch.
-   */
-  BranchApi branch(String ref) throws RestApiException;
-
-  /**
-   * Look up a tag by refname.
-   *
-   * <p>
-   *
-   * @param ref tag name, with or without "refs/tags/" prefix.
-   * @throws RestApiException if a problem occurred reading the project.
-   * @return API for accessing the tag.
-   */
-  TagApi tag(String ref) throws RestApiException;
-
-  /**
-   * Lookup a commit by its {@code ObjectId} string.
-   *
-   * @param commit the {@code ObjectId} string.
-   * @return API for accessing the commit.
-   */
-  CommitApi commit(String commit) throws RestApiException;
-
-  /**
-   * Lookup a dashboard by its name.
-   *
-   * @param name the name.
-   * @return API for accessing the dashboard.
-   */
-  DashboardApi dashboard(String name) throws RestApiException;
-
-  /**
-   * Get the project's default dashboard.
-   *
-   * @return API for accessing the dashboard.
-   */
-  DashboardApi defaultDashboard() throws RestApiException;
-
-  /**
-   * Set the project's default dashboard.
-   *
-   * @param name the dashboard to set as default.
-   */
-  void defaultDashboard(String name) throws RestApiException;
-
-  /** Remove the project's default dashboard. */
-  void removeDefaultDashboard() throws RestApiException;
-
-  abstract class ListDashboardsRequest {
-    public abstract List<DashboardInfo> get() throws RestApiException;
-  }
-
-  ListDashboardsRequest dashboards() throws RestApiException;
-
-  /** Get the name of the branch to which {@code HEAD} points. */
-  String head() throws RestApiException;
-
-  /**
-   * Set the project's {@code HEAD}.
-   *
-   * @param head the HEAD
-   */
-  void head(String head) throws RestApiException;
-
-  /**
-   * A default implementation which allows source compatibility when adding new methods to the
-   * interface.
-   */
-  class NotImplemented implements ProjectApi {
-    @Override
-    public ProjectApi create() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public ProjectApi create(ProjectInput in) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public ProjectInfo get() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public String description() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public ProjectAccessInfo access() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public ProjectAccessInfo access(ProjectAccessInput p) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public ChangeInfo accessChange(ProjectAccessInput input) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public AccessCheckInfo checkAccess(AccessCheckInput in) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public ConfigInfo config() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public ConfigInfo config(ConfigInput in) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void description(DescriptionInput in) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public ListRefsRequest<BranchInfo> branches() {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public ListRefsRequest<TagInfo> tags() {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public List<ProjectInfo> children() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public List<ProjectInfo> children(boolean recursive) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public ChildProjectApi child(String name) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public BranchApi branch(String ref) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public TagApi tag(String ref) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void deleteBranches(DeleteBranchesInput in) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void deleteTags(DeleteTagsInput in) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public CommitApi commit(String commit) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public DashboardApi dashboard(String name) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public DashboardApi defaultDashboard() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public ListDashboardsRequest dashboards() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void defaultDashboard(String name) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void removeDefaultDashboard() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public String head() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public void head(String head) throws RestApiException {
-      throw new NotImplementedException();
-    }
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectInput.java
deleted file mode 100644
index 2adb2dd..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectInput.java
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.extensions.api.projects;
-
-import com.google.gerrit.extensions.client.InheritableBoolean;
-import com.google.gerrit.extensions.client.SubmitType;
-import java.util.List;
-import java.util.Map;
-
-public class ProjectInput {
-  public String name;
-  public String parent;
-  public String description;
-  public boolean permissionsOnly;
-  public boolean createEmptyCommit;
-  public SubmitType submitType;
-  public List<String> branches;
-  public List<String> owners;
-  public InheritableBoolean useContributorAgreements;
-  public InheritableBoolean useSignedOffBy;
-  public InheritableBoolean useContentMerge;
-  public InheritableBoolean requireChangeId;
-  public InheritableBoolean createNewChangeForAllNotInTarget;
-  public InheritableBoolean enableSignedPush;
-  public InheritableBoolean requireSignedPush;
-  public String maxObjectSizeLimit;
-  public Map<String, Map<String, ConfigValue>> pluginConfigValues;
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/Projects.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/Projects.java
deleted file mode 100644
index e4a659c..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/Projects.java
+++ /dev/null
@@ -1,199 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.extensions.api.projects;
-
-import com.google.gerrit.extensions.common.ProjectInfo;
-import com.google.gerrit.extensions.restapi.NotImplementedException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.SortedMap;
-
-public interface Projects {
-  /**
-   * Look up a project by name.
-   *
-   * <p><strong>Note:</strong> This method eagerly reads the project. Methods that mutate the
-   * project do not necessarily re-read the project. Therefore, calling a getter method on an
-   * instance after calling a mutation method on that same instance is not guaranteed to reflect the
-   * mutation. It is not recommended to store references to {@code ProjectApi} instances.
-   *
-   * @param name project name.
-   * @return API for accessing the project.
-   * @throws RestApiException if an error occurred.
-   */
-  ProjectApi name(String name) throws RestApiException;
-
-  /**
-   * Create a project using the default configuration.
-   *
-   * @param name project name.
-   * @return API for accessing the newly-created project.
-   * @throws RestApiException if an error occurred.
-   */
-  ProjectApi create(String name) throws RestApiException;
-
-  /**
-   * Create a project.
-   *
-   * @param in project creation input; name must be set.
-   * @return API for accessing the newly-created project.
-   * @throws RestApiException if an error occurred.
-   */
-  ProjectApi create(ProjectInput in) throws RestApiException;
-
-  ListRequest list();
-
-  abstract class ListRequest {
-    public enum FilterType {
-      CODE,
-      PARENT_CANDIDATES,
-      PERMISSIONS,
-      ALL
-    }
-
-    private final List<String> branches = new ArrayList<>();
-    private boolean description;
-    private String prefix;
-    private String substring;
-    private String regex;
-    private int limit;
-    private int start;
-    private boolean showTree;
-    private FilterType type = FilterType.ALL;
-
-    public List<ProjectInfo> get() throws RestApiException {
-      Map<String, ProjectInfo> map = getAsMap();
-      List<ProjectInfo> result = new ArrayList<>(map.size());
-      for (Map.Entry<String, ProjectInfo> e : map.entrySet()) {
-        // ListProjects "helpfully" nulls out names when converting to a map.
-        e.getValue().name = e.getKey();
-        result.add(e.getValue());
-      }
-      return Collections.unmodifiableList(result);
-    }
-
-    public abstract SortedMap<String, ProjectInfo> getAsMap() throws RestApiException;
-
-    public ListRequest withDescription(boolean description) {
-      this.description = description;
-      return this;
-    }
-
-    public ListRequest withPrefix(String prefix) {
-      this.prefix = prefix;
-      return this;
-    }
-
-    public ListRequest withSubstring(String substring) {
-      this.substring = substring;
-      return this;
-    }
-
-    public ListRequest withRegex(String regex) {
-      this.regex = regex;
-      return this;
-    }
-
-    public ListRequest withLimit(int limit) {
-      this.limit = limit;
-      return this;
-    }
-
-    public ListRequest withStart(int start) {
-      this.start = start;
-      return this;
-    }
-
-    public ListRequest addShowBranch(String branch) {
-      branches.add(branch);
-      return this;
-    }
-
-    public ListRequest withTree(boolean show) {
-      showTree = show;
-      return this;
-    }
-
-    public ListRequest withType(FilterType type) {
-      this.type = type != null ? type : FilterType.ALL;
-      return this;
-    }
-
-    public boolean getDescription() {
-      return description;
-    }
-
-    public String getPrefix() {
-      return prefix;
-    }
-
-    public String getSubstring() {
-      return substring;
-    }
-
-    public String getRegex() {
-      return regex;
-    }
-
-    public int getLimit() {
-      return limit;
-    }
-
-    public int getStart() {
-      return start;
-    }
-
-    public List<String> getBranches() {
-      return Collections.unmodifiableList(branches);
-    }
-
-    public boolean getShowTree() {
-      return showTree;
-    }
-
-    public FilterType getFilterType() {
-      return type;
-    }
-  }
-
-  /**
-   * A default implementation which allows source compatibility when adding new methods to the
-   * interface.
-   */
-  class NotImplemented implements Projects {
-    @Override
-    public ProjectApi name(String name) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public ProjectApi create(ProjectInput in) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public ProjectApi create(String name) throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public ListRequest list() {
-      throw new NotImplementedException();
-    }
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/RefInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/RefInfo.java
deleted file mode 100644
index c573600..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/RefInfo.java
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.extensions.api.projects;
-
-public class RefInfo {
-  public String ref;
-  public String revision;
-  public Boolean canDelete;
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/TagInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/TagInfo.java
deleted file mode 100644
index 99fc6ec..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/TagInfo.java
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.extensions.api.projects;
-
-import com.google.gerrit.extensions.common.GitPerson;
-import com.google.gerrit.extensions.common.WebLinkInfo;
-import java.util.List;
-
-public class TagInfo extends RefInfo {
-  public String object;
-  public String message;
-  public GitPerson tagger;
-  public List<WebLinkInfo> webLinks;
-
-  public TagInfo(String ref, String revision, Boolean canDelete, List<WebLinkInfo> webLinks) {
-    this.ref = ref;
-    this.revision = revision;
-    this.canDelete = canDelete;
-    this.webLinks = webLinks;
-  }
-
-  public TagInfo(
-      String ref,
-      String revision,
-      String object,
-      String message,
-      GitPerson tagger,
-      Boolean canDelete,
-      List<WebLinkInfo> webLinks) {
-    this(ref, revision, canDelete, webLinks);
-    this.object = object;
-    this.message = message;
-    this.tagger = tagger;
-    this.webLinks = webLinks;
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/auth/oauth/OAuthToken.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/auth/oauth/OAuthToken.java
deleted file mode 100644
index b736262..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/auth/oauth/OAuthToken.java
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.extensions.auth.oauth;
-
-import java.io.Serializable;
-
-/* OAuth token */
-public class OAuthToken implements Serializable {
-
-  private static final long serialVersionUID = 1L;
-
-  private final String token;
-  private final String secret;
-  private final String raw;
-
-  /**
-   * Time of expiration of this token, or {@code Long#MAX_VALUE} if this token never expires, or
-   * time of expiration is unknown.
-   */
-  private final long expiresAt;
-
-  /**
-   * The identifier of the OAuth provider that issued this token in the form
-   * <tt>"plugin-name:provider-name"</tt>, or {@code null}.
-   */
-  private final String providerId;
-
-  public OAuthToken(String token, String secret, String raw) {
-    this(token, secret, raw, Long.MAX_VALUE, null);
-  }
-
-  public OAuthToken(String token, String secret, String raw, long expiresAt, String providerId) {
-    this.token = token;
-    this.secret = secret;
-    this.raw = raw;
-    this.expiresAt = expiresAt;
-    this.providerId = providerId;
-  }
-
-  public String getToken() {
-    return token;
-  }
-
-  public String getSecret() {
-    return secret;
-  }
-
-  public String getRaw() {
-    return raw;
-  }
-
-  public long getExpiresAt() {
-    return expiresAt;
-  }
-
-  public boolean isExpired() {
-    return System.currentTimeMillis() > expiresAt;
-  }
-
-  public String getProviderId() {
-    return providerId;
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/Comment.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/Comment.java
deleted file mode 100644
index 3307997..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/Comment.java
+++ /dev/null
@@ -1,131 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.extensions.client;
-
-import java.sql.Timestamp;
-import java.util.Comparator;
-import java.util.Objects;
-
-public abstract class Comment {
-  /**
-   * Patch set number containing this commit.
-   *
-   * <p>Only set in contexts where comments may come from multiple patch sets.
-   */
-  public Integer patchSet;
-
-  public String id;
-  public String path;
-  public Side side;
-  public Integer parent;
-  public Integer line; // value 0 or null indicates a file comment, normal lines start at 1
-  public Range range;
-  public String inReplyTo;
-  public Timestamp updated;
-  public String message;
-  public Boolean unresolved;
-
-  public static class Range implements Comparable<Range> {
-    private static final Comparator<Range> RANGE_COMPARATOR =
-        Comparator.<Range>comparingInt(range -> range.startLine)
-            .thenComparingInt(range -> range.startCharacter)
-            .thenComparingInt(range -> range.endLine)
-            .thenComparingInt(range -> range.endCharacter);
-
-    public int startLine; // 1-based, inclusive
-    public int startCharacter; // 0-based, inclusive
-    public int endLine; // 1-based, exclusive
-    public int endCharacter; // 0-based, exclusive
-
-    public boolean isValid() {
-      return startLine > 0
-          && startCharacter >= 0
-          && endLine > 0
-          && endCharacter >= 0
-          && startLine <= endLine
-          && (startLine != endLine || startCharacter <= endCharacter);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-      if (o instanceof Range) {
-        Range r = (Range) o;
-        return Objects.equals(startLine, r.startLine)
-            && Objects.equals(startCharacter, r.startCharacter)
-            && Objects.equals(endLine, r.endLine)
-            && Objects.equals(endCharacter, r.endCharacter);
-      }
-      return false;
-    }
-
-    @Override
-    public int hashCode() {
-      return Objects.hash(startLine, startCharacter, endLine, endCharacter);
-    }
-
-    @Override
-    public String toString() {
-      return "Range{"
-          + "startLine="
-          + startLine
-          + ", startCharacter="
-          + startCharacter
-          + ", endLine="
-          + endLine
-          + ", endCharacter="
-          + endCharacter
-          + '}';
-    }
-
-    @Override
-    public int compareTo(Range otherRange) {
-      return RANGE_COMPARATOR.compare(this, otherRange);
-    }
-  }
-
-  public short side() {
-    if (side == Side.PARENT) {
-      return (short) (parent == null ? 0 : -parent.shortValue());
-    }
-    return 1;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o != null && getClass() == o.getClass()) {
-      Comment c = (Comment) o;
-      return Objects.equals(patchSet, c.patchSet)
-          && Objects.equals(id, c.id)
-          && Objects.equals(path, c.path)
-          && Objects.equals(side, c.side)
-          && Objects.equals(parent, c.parent)
-          && Objects.equals(line, c.line)
-          && Objects.equals(range, c.range)
-          && Objects.equals(inReplyTo, c.inReplyTo)
-          && Objects.equals(updated, c.updated)
-          && Objects.equals(message, c.message)
-          && Objects.equals(unresolved, c.unresolved);
-    }
-    return false;
-  }
-
-  @Override
-  public int hashCode() {
-    return Objects.hash(patchSet, id, path, side, parent, line, range, inReplyTo, updated, message);
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/ListChangesOption.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/ListChangesOption.java
deleted file mode 100644
index f04685f..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/ListChangesOption.java
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.extensions.client;
-
-import java.util.EnumSet;
-import java.util.Set;
-
-/** Output options available for retrieval of change details. */
-public enum ListChangesOption {
-  LABELS(0),
-  DETAILED_LABELS(8),
-
-  /** Return information on the current patch set of the change. */
-  CURRENT_REVISION(1),
-  ALL_REVISIONS(2),
-
-  /** If revisions are included, parse the commit object. */
-  CURRENT_COMMIT(3),
-  ALL_COMMITS(4),
-
-  /** If a patch set is included, include the files of the patch set. */
-  CURRENT_FILES(5),
-  ALL_FILES(6),
-
-  /** If accounts are included, include detailed account info. */
-  DETAILED_ACCOUNTS(7),
-
-  /** Include messages associated with the change. */
-  MESSAGES(9),
-
-  /** Include allowed actions client could perform. */
-  CURRENT_ACTIONS(10),
-
-  /** Set the reviewed boolean for the caller. */
-  REVIEWED(11),
-
-  /** Not used anymore, kept for backward compatibility */
-  @Deprecated
-  DRAFT_COMMENTS(12),
-
-  /** Include download commands for the caller. */
-  DOWNLOAD_COMMANDS(13),
-
-  /** Include patch set weblinks. */
-  WEB_LINKS(14),
-
-  /** Include consistency check results. */
-  CHECK(15),
-
-  /** Include allowed change actions client could perform. */
-  CHANGE_ACTIONS(16),
-
-  /** Include a copy of commit messages including review footers. */
-  COMMIT_FOOTERS(17),
-
-  /** Include push certificate information along with any patch sets. */
-  PUSH_CERTIFICATES(18),
-
-  /** Include change's reviewer updates. */
-  REVIEWER_UPDATES(19),
-
-  /** Set the submittable boolean. */
-  SUBMITTABLE(20),
-
-  /** If tracking Ids are included, include detailed tracking Ids info. */
-  TRACKING_IDS(21);
-
-  private final int value;
-
-  ListChangesOption(int v) {
-    this.value = v;
-  }
-
-  public int getValue() {
-    return value;
-  }
-
-  public static EnumSet<ListChangesOption> fromBits(int v) {
-    EnumSet<ListChangesOption> r = EnumSet.noneOf(ListChangesOption.class);
-    for (ListChangesOption o : ListChangesOption.values()) {
-      if ((v & (1 << o.value)) != 0) {
-        r.add(o);
-        v &= ~(1 << o.value);
-      }
-      if (v == 0) {
-        return r;
-      }
-    }
-    if (v != 0) {
-      throw new IllegalArgumentException("unknown " + Integer.toHexString(v));
-    }
-    return r;
-  }
-
-  public static int toBits(Set<ListChangesOption> set) {
-    int r = 0;
-    for (ListChangesOption o : set) {
-      r |= 1 << o.value;
-    }
-    return r;
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/ProjectState.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/ProjectState.java
deleted file mode 100644
index e5bc194..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/ProjectState.java
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.extensions.client;
-
-public enum ProjectState {
-  ACTIVE(true, true),
-  READ_ONLY(true, false),
-  HIDDEN(false, false);
-
-  private final boolean permitsRead;
-  private final boolean permitsWrite;
-
-  ProjectState(boolean permitsRead, boolean permitsWrite) {
-    this.permitsRead = permitsRead;
-    this.permitsWrite = permitsWrite;
-  }
-
-  public boolean permitsRead() {
-    return permitsRead;
-  }
-
-  public boolean permitsWrite() {
-    return permitsWrite;
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/SubmitType.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/SubmitType.java
deleted file mode 100644
index b52e89a..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/SubmitType.java
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.extensions.client;
-
-public enum SubmitType {
-  FAST_FORWARD_ONLY,
-  MERGE_IF_NECESSARY,
-  REBASE_IF_NECESSARY,
-  REBASE_ALWAYS,
-  MERGE_ALWAYS,
-  CHERRY_PICK
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AgreementInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AgreementInput.java
deleted file mode 100644
index 0c6cf2d..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AgreementInput.java
+++ /dev/null
@@ -1,23 +0,0 @@
-// 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.
-
-package com.google.gerrit.extensions.common;
-
-import com.google.gerrit.extensions.restapi.DefaultInput;
-
-/** This entity contains information for registering a new contributor agreement. */
-public class AgreementInput {
-  /* The agreement name. */
-  @DefaultInput public String name;
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ApprovalInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ApprovalInfo.java
deleted file mode 100644
index 9125bfd..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ApprovalInfo.java
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.extensions.common;
-
-import java.sql.Timestamp;
-
-public class ApprovalInfo extends AccountInfo {
-  public String tag;
-  public Integer value;
-  public Timestamp date;
-  public Boolean postSubmit;
-  public VotingRangeInfo permittedVotingRange;
-
-  public ApprovalInfo(Integer id) {
-    super(id);
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeInfo.java
deleted file mode 100644
index 97f9ba1..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeInfo.java
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.extensions.common;
-
-import com.google.gerrit.extensions.client.ChangeStatus;
-import com.google.gerrit.extensions.client.ReviewerState;
-import com.google.gerrit.extensions.client.SubmitType;
-import java.sql.Timestamp;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
-public class ChangeInfo {
-  // ActionJson#copy(List, ChangeInfo) must be adapted if new fields are added that are not
-  // protected by any ListChangesOption.
-  public String id;
-  public String project;
-  public String branch;
-  public String topic;
-  public AccountInfo assignee;
-  public Collection<String> hashtags;
-  public String changeId;
-  public String subject;
-  public ChangeStatus status;
-  public Timestamp created;
-  public Timestamp updated;
-  public Timestamp submitted;
-  public AccountInfo submitter;
-  public Boolean starred;
-  public Collection<String> stars;
-  public Boolean reviewed;
-  public SubmitType submitType;
-  public Boolean mergeable;
-  public Boolean submittable;
-  public Integer insertions;
-  public Integer deletions;
-  public Integer unresolvedCommentCount;
-  public Boolean isPrivate;
-  public Boolean workInProgress;
-  public Boolean hasReviewStarted;
-  public Integer revertOf;
-
-  public int _number;
-
-  public AccountInfo owner;
-
-  public Map<String, ActionInfo> actions;
-  public Map<String, LabelInfo> labels;
-  public Map<String, Collection<String>> permittedLabels;
-  public Collection<AccountInfo> removableReviewers;
-  public Map<ReviewerState, Collection<AccountInfo>> reviewers;
-  public Map<ReviewerState, Collection<AccountInfo>> pendingReviewers;
-  public Collection<ReviewerUpdateInfo> reviewerUpdates;
-  public Collection<ChangeMessageInfo> messages;
-
-  public String currentRevision;
-  public Map<String, RevisionInfo> revisions;
-  public Boolean _moreChanges;
-
-  public List<ProblemInfo> problems;
-  public List<PluginDefinedInfo> plugins;
-  public Collection<TrackingIdInfo> trackingIds;
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeInput.java
deleted file mode 100644
index c8e7bca..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeInput.java
+++ /dev/null
@@ -1,56 +0,0 @@
-// 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.
-
-package com.google.gerrit.extensions.common;
-
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.api.changes.NotifyInfo;
-import com.google.gerrit.extensions.api.changes.RecipientType;
-import com.google.gerrit.extensions.client.ChangeStatus;
-import java.util.Map;
-
-public class ChangeInput {
-  public String project;
-  public String branch;
-  public String subject;
-
-  public String topic;
-  public ChangeStatus status;
-  public Boolean isPrivate;
-  public Boolean workInProgress;
-  public String baseChange;
-  public Boolean newBranch;
-  public MergeInput merge;
-
-  public ChangeInput() {}
-
-  /**
-   * Creates a new {@code ChangeInput} with the minimal attributes required for a successful
-   * creation of a new change.
-   *
-   * @param project the project name for the new change
-   * @param branch the branch name for the new change
-   * @param subject the subject (commit message) for the new change
-   */
-  public ChangeInput(String project, String branch, String subject) {
-    this.project = project;
-    this.branch = branch;
-    this.subject = subject;
-  }
-
-  /** Who to send email notifications to after change is created. */
-  public NotifyHandling notify = NotifyHandling.ALL;
-
-  public Map<RecipientType, NotifyInfo> notifyDetails;
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeMessageInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeMessageInfo.java
deleted file mode 100644
index 735b84f..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeMessageInfo.java
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.extensions.common;
-
-import java.sql.Timestamp;
-
-public class ChangeMessageInfo {
-  public String id;
-  public String tag;
-  public AccountInfo author;
-  public AccountInfo realAuthor;
-  public Timestamp date;
-  public String message;
-  public Integer _revisionNumber;
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/FileInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/FileInfo.java
deleted file mode 100644
index a812908..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/FileInfo.java
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.extensions.common;
-
-public class FileInfo {
-  public Character status;
-  public Boolean binary;
-  public String oldPath;
-  public Integer linesInserted;
-  public Integer linesDeleted;
-  public long sizeDelta;
-  public long size;
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GerritInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GerritInfo.java
deleted file mode 100644
index f904b06..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GerritInfo.java
+++ /dev/null
@@ -1,29 +0,0 @@
-// 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.
-
-package com.google.gerrit.extensions.common;
-
-import com.google.gerrit.extensions.client.UiType;
-import java.util.Set;
-
-public class GerritInfo {
-  public String allProjects;
-  public String allUsers;
-  public Boolean docSearch;
-  public String docUrl;
-  public Boolean editGpgKeys;
-  public String reportBugUrl;
-  public String reportBugText;
-  public Set<UiType> webUis;
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GitPerson.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GitPerson.java
deleted file mode 100644
index 904829c..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GitPerson.java
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.extensions.common;
-
-import java.sql.Timestamp;
-import java.util.Objects;
-
-public class GitPerson {
-  public String name;
-  public String email;
-  public Timestamp date;
-  public int tz;
-
-  @Override
-  public boolean equals(Object o) {
-    if (!(o instanceof GitPerson)) {
-      return false;
-    }
-    GitPerson p = (GitPerson) o;
-    return Objects.equals(name, p.name)
-        && Objects.equals(email, p.email)
-        && Objects.equals(date, p.date)
-        && tz == p.tz;
-  }
-
-  @Override
-  public int hashCode() {
-    return Objects.hash(name, email, date, tz);
-  }
-
-  @Override
-  public String toString() {
-    return getClass().getSimpleName()
-        + "{name="
-        + name
-        + ", email="
-        + email
-        + ", date="
-        + date
-        + ", tz="
-        + tz
-        + "}".toString();
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/InstallPluginInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/InstallPluginInput.java
deleted file mode 100644
index 4774ae7..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/InstallPluginInput.java
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.extensions.common;
-
-import com.google.gerrit.extensions.restapi.DefaultInput;
-import com.google.gerrit.extensions.restapi.RawInput;
-
-public class InstallPluginInput {
-  public @DefaultInput String url;
-  public RawInput raw;
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/MergePatchSetInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/MergePatchSetInput.java
deleted file mode 100644
index 263b6c4..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/MergePatchSetInput.java
+++ /dev/null
@@ -1,21 +0,0 @@
-// 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.
-
-package com.google.gerrit.extensions.common;
-
-public class MergePatchSetInput {
-  public String subject;
-  public boolean inheritParent;
-  public MergeInput merge;
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SetDashboardInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SetDashboardInput.java
deleted file mode 100644
index 13d2b9d..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SetDashboardInput.java
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.extensions.common;
-
-import com.google.gerrit.extensions.restapi.DefaultInput;
-
-public class SetDashboardInput {
-  @DefaultInput public String id;
-  public String commitMessage;
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/WebLinkInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/WebLinkInfo.java
deleted file mode 100644
index 3af5aba..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/WebLinkInfo.java
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.extensions.common;
-
-import com.google.gerrit.extensions.webui.WebLink.Target;
-import java.util.Objects;
-
-public class WebLinkInfo {
-  public String name;
-  public String imageUrl;
-  public String url;
-  public String target;
-
-  public WebLinkInfo(String name, String imageUrl, String url, String target) {
-    this.name = name;
-    this.imageUrl = imageUrl;
-    this.url = url;
-    this.target = target;
-  }
-
-  public WebLinkInfo(String name, String imageUrl, String url) {
-    this(name, imageUrl, url, Target.SELF);
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (!(o instanceof WebLinkInfo)) {
-      return false;
-    }
-    WebLinkInfo i = (WebLinkInfo) o;
-    return Objects.equals(name, i.name)
-        && Objects.equals(imageUrl, i.imageUrl)
-        && Objects.equals(url, i.url)
-        && Objects.equals(target, i.target);
-  }
-
-  @Override
-  public int hashCode() {
-    return Objects.hash(name, imageUrl, url, target);
-  }
-
-  @Override
-  public String toString() {
-    return getClass().getSimpleName()
-        + "{name="
-        + name
-        + ", imageUrl="
-        + imageUrl
-        + ", url="
-        + url
-        + ", target"
-        + target
-        + "}".toString();
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/conditions/BooleanCondition.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/conditions/BooleanCondition.java
deleted file mode 100644
index 950365a..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/conditions/BooleanCondition.java
+++ /dev/null
@@ -1,217 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.extensions.conditions;
-
-import com.google.common.collect.Iterables;
-import java.util.Collections;
-
-/** Delayed evaluation of a boolean condition. */
-public abstract class BooleanCondition {
-  public static final BooleanCondition TRUE = new Value(true);
-  public static final BooleanCondition FALSE = new Value(false);
-
-  public static BooleanCondition valueOf(boolean a) {
-    return a ? TRUE : FALSE;
-  }
-
-  public static BooleanCondition and(BooleanCondition a, BooleanCondition b) {
-    return a == FALSE || b == FALSE ? FALSE : new And(a, b);
-  }
-
-  public static BooleanCondition and(boolean a, BooleanCondition b) {
-    return and(valueOf(a), b);
-  }
-
-  public static BooleanCondition or(BooleanCondition a, BooleanCondition b) {
-    return a == TRUE || b == TRUE ? TRUE : new Or(a, b);
-  }
-
-  public static BooleanCondition or(boolean a, BooleanCondition b) {
-    return or(valueOf(a), b);
-  }
-
-  public static BooleanCondition not(BooleanCondition bc) {
-    return bc == TRUE ? FALSE : bc == FALSE ? TRUE : new Not(bc);
-  }
-
-  BooleanCondition() {}
-
-  /** @return evaluate the condition and return its value. */
-  public abstract boolean value();
-
-  /**
-   * Recursively collect all children of type {@code type}.
-   *
-   * @param type implementation type of the conditions to collect and return.
-   * @return non-null, unmodifiable iteration of children of type {@code type}.
-   */
-  public abstract <T> Iterable<T> children(Class<T> type);
-
-  private static final class And extends BooleanCondition {
-    private final BooleanCondition a;
-    private final BooleanCondition b;
-
-    And(BooleanCondition a, BooleanCondition b) {
-      this.a = a;
-      this.b = b;
-    }
-
-    @Override
-    public boolean value() {
-      return a.value() && b.value();
-    }
-
-    @Override
-    public <T> Iterable<T> children(Class<T> type) {
-      return Iterables.concat(a.children(type), b.children(type));
-    }
-
-    @Override
-    public int hashCode() {
-      return a.hashCode() * 31 + b.hashCode();
-    }
-
-    @Override
-    public boolean equals(Object other) {
-      if (other instanceof And) {
-        And o = (And) other;
-        return a.equals(o.a) && b.equals(o.b);
-      }
-      return false;
-    }
-
-    @Override
-    public String toString() {
-      return "(" + maybeTrim(a, getClass()) + " && " + maybeTrim(a, getClass()) + ")";
-    }
-  }
-
-  private static final class Or extends BooleanCondition {
-    private final BooleanCondition a;
-    private final BooleanCondition b;
-
-    Or(BooleanCondition a, BooleanCondition b) {
-      this.a = a;
-      this.b = b;
-    }
-
-    @Override
-    public boolean value() {
-      return a.value() || b.value();
-    }
-
-    @Override
-    public <T> Iterable<T> children(Class<T> type) {
-      return Iterables.concat(a.children(type), b.children(type));
-    }
-
-    @Override
-    public int hashCode() {
-      return a.hashCode() * 31 + b.hashCode();
-    }
-
-    @Override
-    public boolean equals(Object other) {
-      if (other instanceof Or) {
-        Or o = (Or) other;
-        return a.equals(o.a) && b.equals(o.b);
-      }
-      return false;
-    }
-
-    @Override
-    public String toString() {
-      return "(" + maybeTrim(a, getClass()) + " || " + maybeTrim(a, getClass()) + ")";
-    }
-  }
-
-  private static final class Not extends BooleanCondition {
-    private final BooleanCondition cond;
-
-    Not(BooleanCondition bc) {
-      cond = bc;
-    }
-
-    @Override
-    public boolean value() {
-      return !cond.value();
-    }
-
-    @Override
-    public <T> Iterable<T> children(Class<T> type) {
-      return cond.children(type);
-    }
-
-    @Override
-    public int hashCode() {
-      return cond.hashCode() * 31;
-    }
-
-    @Override
-    public boolean equals(Object other) {
-      return other instanceof Not ? cond.equals(((Not) other).cond) : false;
-    }
-
-    @Override
-    public String toString() {
-      return "!" + cond;
-    }
-  }
-
-  private static final class Value extends BooleanCondition {
-    private final boolean value;
-
-    Value(boolean v) {
-      value = v;
-    }
-
-    @Override
-    public boolean value() {
-      return value;
-    }
-
-    @Override
-    public <T> Iterable<T> children(Class<T> type) {
-      return Collections.emptyList();
-    }
-
-    @Override
-    public int hashCode() {
-      return value ? 1 : 0;
-    }
-
-    @Override
-    public boolean equals(Object other) {
-      return other instanceof Value ? value == ((Value) other).value : false;
-    }
-
-    @Override
-    public String toString() {
-      return Boolean.toString(value);
-    }
-  }
-
-  /** Remove leading '(' and trailing ')' if the type is the same as the parent. */
-  static String maybeTrim(BooleanCondition cond, Class<? extends BooleanCondition> type) {
-    String s = cond.toString();
-    if (cond.getClass() == type
-        && s.length() > 2
-        && s.charAt(0) == '('
-        && s.charAt(s.length() - 1) == ')') {
-      s = s.substring(1, s.length() - 1);
-    }
-    return s;
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicItem.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicItem.java
deleted file mode 100644
index 477b666..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicItem.java
+++ /dev/null
@@ -1,244 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.extensions.registration;
-
-import com.google.inject.Binder;
-import com.google.inject.Key;
-import com.google.inject.Provider;
-import com.google.inject.ProvisionException;
-import com.google.inject.Scopes;
-import com.google.inject.TypeLiteral;
-import com.google.inject.binder.LinkedBindingBuilder;
-import com.google.inject.util.Providers;
-import com.google.inject.util.Types;
-import java.util.concurrent.atomic.AtomicReference;
-
-/**
- * A single item that can be modified as plugins reload.
- *
- * <p>DynamicItems are always mapped as singletons in Guice. Items store a Provider internally, and
- * resolve the provider to an instance on demand. This enables registrations to decide between
- * singleton and non-singleton members. If multiple plugins try to provide the same Provider, an
- * exception is thrown.
- */
-public class DynamicItem<T> {
-  /** Pair of provider implementation and plugin providing it. */
-  static class NamedProvider<T> {
-    final Provider<T> impl;
-    final String pluginName;
-
-    NamedProvider(Provider<T> provider, String pluginName) {
-      this.impl = provider;
-      this.pluginName = pluginName;
-    }
-  }
-
-  /**
-   * Declare a singleton {@code DynamicItem<T>} with a binder.
-   *
-   * <p>Items must be defined in a Guice module before they can be bound:
-   *
-   * <pre>
-   *   DynamicItem.itemOf(binder(), Interface.class);
-   *   DynamicItem.bind(binder(), Interface.class).to(Impl.class);
-   * </pre>
-   *
-   * @param binder a new binder created in the module.
-   * @param member type of entry to store.
-   */
-  public static <T> void itemOf(Binder binder, Class<T> member) {
-    itemOf(binder, TypeLiteral.get(member));
-  }
-
-  /**
-   * Declare a singleton {@code DynamicItem<T>} with a binder.
-   *
-   * <p>Items must be defined in a Guice module before they can be bound:
-   *
-   * <pre>
-   *   DynamicSet.itemOf(binder(), new TypeLiteral&lt;Thing&lt;Foo&gt;&gt;() {});
-   * </pre>
-   *
-   * @param binder a new binder created in the module.
-   * @param member type of entry to store.
-   */
-  public static <T> void itemOf(Binder binder, TypeLiteral<T> member) {
-    Key<DynamicItem<T>> key = keyFor(member);
-    binder.bind(key).toProvider(new DynamicItemProvider<>(member, key)).in(Scopes.SINGLETON);
-  }
-
-  /**
-   * Construct a single {@code DynamicItem<T>} with a fixed value.
-   *
-   * <p>Primarily useful for passing {@code DynamicItem}s to constructors in tests.
-   *
-   * @param member type of item.
-   * @param item item to store.
-   */
-  public static <T> DynamicItem<T> itemOf(Class<T> member, T item) {
-    return new DynamicItem<>(keyFor(TypeLiteral.get(member)), Providers.of(item), "gerrit");
-  }
-
-  @SuppressWarnings("unchecked")
-  private static <T> Key<DynamicItem<T>> keyFor(TypeLiteral<T> member) {
-    return (Key<DynamicItem<T>>)
-        Key.get(Types.newParameterizedType(DynamicItem.class, member.getType()));
-  }
-
-  /**
-   * Bind one implementation as the item using a unique annotation.
-   *
-   * @param binder a new binder created in the module.
-   * @param type type of entry to store.
-   * @return a binder to continue configuring the new item.
-   */
-  public static <T> LinkedBindingBuilder<T> bind(Binder binder, Class<T> type) {
-    return bind(binder, TypeLiteral.get(type));
-  }
-
-  /**
-   * Bind one implementation as the item.
-   *
-   * @param binder a new binder created in the module.
-   * @param type type of entry to store.
-   * @return a binder to continue configuring the new item.
-   */
-  public static <T> LinkedBindingBuilder<T> bind(Binder binder, TypeLiteral<T> type) {
-    return binder.bind(type);
-  }
-
-  private final Key<DynamicItem<T>> key;
-  private final AtomicReference<NamedProvider<T>> ref;
-
-  DynamicItem(Key<DynamicItem<T>> key, Provider<T> provider, String pluginName) {
-    NamedProvider<T> in = null;
-    if (provider != null) {
-      in = new NamedProvider<>(provider, pluginName);
-    }
-    this.key = key;
-    this.ref = new AtomicReference<>(in);
-  }
-
-  /**
-   * Get the configured item, or null.
-   *
-   * @return the configured item instance; null if no implementation has been bound to the item.
-   *     This is common if no plugin registered an implementation for the type.
-   */
-  public T get() {
-    NamedProvider<T> item = ref.get();
-    return item != null ? item.impl.get() : null;
-  }
-
-  /**
-   * Set the element to provide.
-   *
-   * @param item the item to use. Must not be null.
-   * @param pluginName the name of the plugin providing the item.
-   * @return handle to remove the item at a later point in time.
-   */
-  public RegistrationHandle set(T item, String pluginName) {
-    return set(Providers.of(item), pluginName);
-  }
-
-  /**
-   * Set the element to provide.
-   *
-   * @param impl the item to add to the collection. Must not be null.
-   * @param pluginName name of the source providing the implementation.
-   * @return handle to remove the item at a later point in time.
-   */
-  public RegistrationHandle set(Provider<T> impl, String pluginName) {
-    final NamedProvider<T> item = new NamedProvider<>(impl, pluginName);
-    NamedProvider<T> old = null;
-    while (!ref.compareAndSet(old, item)) {
-      old = ref.get();
-      if (old != null && !"gerrit".equals(old.pluginName)) {
-        throw new ProvisionException(
-            String.format(
-                "%s already provided by %s, ignoring plugin %s",
-                key.getTypeLiteral(), old.pluginName, pluginName));
-      }
-    }
-
-    final NamedProvider<T> defaultItem = old;
-    return new RegistrationHandle() {
-      @Override
-      public void remove() {
-        ref.compareAndSet(item, defaultItem);
-      }
-    };
-  }
-
-  /**
-   * Set the element that may be hot-replaceable in the future.
-   *
-   * @param key unique description from the item's Guice binding. This can be later obtained from
-   *     the registration handle to facilitate matching with the new equivalent instance during a
-   *     hot reload.
-   * @param impl the item to set as our value right now. Must not be null.
-   * @param pluginName the name of the plugin providing the item.
-   * @return a handle that can remove this item later, or hot-swap the item.
-   */
-  public ReloadableRegistrationHandle<T> set(Key<T> key, Provider<T> impl, String pluginName) {
-    final NamedProvider<T> item = new NamedProvider<>(impl, pluginName);
-    NamedProvider<T> old = null;
-    while (!ref.compareAndSet(old, item)) {
-      old = ref.get();
-      if (old != null && !"gerrit".equals(old.pluginName) && !pluginName.equals(old.pluginName)) {
-        // We allow to replace:
-        // 1. Gerrit core items, e.g. websession cache
-        //    can be replaced by plugin implementation
-        // 2. Reload of current plugin
-        throw new ProvisionException(
-            String.format(
-                "%s already provided by %s, ignoring plugin %s",
-                this.key.getTypeLiteral(), old.pluginName, pluginName));
-      }
-    }
-    return new ReloadableHandle(key, item, old);
-  }
-
-  private class ReloadableHandle implements ReloadableRegistrationHandle<T> {
-    private final Key<T> handleKey;
-    private final NamedProvider<T> item;
-    private final NamedProvider<T> defaultItem;
-
-    ReloadableHandle(Key<T> handleKey, NamedProvider<T> item, NamedProvider<T> defaultItem) {
-      this.handleKey = handleKey;
-      this.item = item;
-      this.defaultItem = defaultItem;
-    }
-
-    @Override
-    public Key<T> getKey() {
-      return handleKey;
-    }
-
-    @Override
-    public void remove() {
-      ref.compareAndSet(item, defaultItem);
-    }
-
-    @Override
-    public ReloadableHandle replace(Key<T> newKey, Provider<T> newItem) {
-      NamedProvider<T> n = new NamedProvider<>(newItem, item.pluginName);
-      if (ref.compareAndSet(item, n)) {
-        return new ReloadableHandle(newKey, n, defaultItem);
-      }
-      return null;
-    }
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicItemProvider.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicItemProvider.java
deleted file mode 100644
index 5b76741..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicItemProvider.java
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.extensions.registration;
-
-import com.google.inject.Binding;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.Key;
-import com.google.inject.Provider;
-import com.google.inject.ProvisionException;
-import com.google.inject.TypeLiteral;
-import java.util.List;
-
-class DynamicItemProvider<T> implements Provider<DynamicItem<T>> {
-  private final TypeLiteral<T> type;
-  private final Key<DynamicItem<T>> key;
-
-  @Inject private Injector injector;
-
-  DynamicItemProvider(TypeLiteral<T> type, Key<DynamicItem<T>> key) {
-    this.type = type;
-    this.key = key;
-  }
-
-  @Override
-  public DynamicItem<T> get() {
-    return new DynamicItem<>(key, find(injector, type), "gerrit");
-  }
-
-  private static <T> Provider<T> find(Injector src, TypeLiteral<T> type) {
-    List<Binding<T>> bindings = src.findBindingsByType(type);
-    if (bindings != null && bindings.size() == 1) {
-      return bindings.get(0).getProvider();
-    } else if (bindings != null && bindings.size() > 1) {
-      throw new ProvisionException(
-          String.format(
-              "Multiple providers bound for DynamicItem<%s>\n"
-                  + "This is not allowed; check the server configuration.",
-              type));
-    } else {
-      return null;
-    }
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicMap.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicMap.java
deleted file mode 100644
index e0db0c7..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicMap.java
+++ /dev/null
@@ -1,213 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.extensions.registration;
-
-import com.google.inject.Binder;
-import com.google.inject.Key;
-import com.google.inject.Provider;
-import com.google.inject.ProvisionException;
-import com.google.inject.Scopes;
-import com.google.inject.TypeLiteral;
-import com.google.inject.util.Types;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.SortedMap;
-import java.util.SortedSet;
-import java.util.TreeMap;
-import java.util.TreeSet;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-/**
- * A map of members that can be modified as plugins reload.
- *
- * <p>Maps index their members by plugin name and export name.
- *
- * <p>DynamicMaps are always mapped as singletons in Guice. Maps store Providers internally, and
- * resolve the provider to an instance on demand. This enables registrations to decide between
- * singleton and non-singleton members.
- */
-public abstract class DynamicMap<T> implements Iterable<DynamicMap.Entry<T>> {
-  /**
-   * Declare a singleton {@code DynamicMap<T>} with a binder.
-   *
-   * <p>Maps must be defined in a Guice module before they can be bound:
-   *
-   * <pre>
-   * DynamicMap.mapOf(binder(), Interface.class);
-   * bind(Interface.class)
-   *   .annotatedWith(Exports.named(&quot;foo&quot;))
-   *   .to(Impl.class);
-   * </pre>
-   *
-   * @param binder a new binder created in the module.
-   * @param member type of value in the map.
-   */
-  public static <T> void mapOf(Binder binder, Class<T> member) {
-    mapOf(binder, TypeLiteral.get(member));
-  }
-
-  /**
-   * Declare a singleton {@code DynamicMap<T>} with a binder.
-   *
-   * <p>Maps must be defined in a Guice module before they can be bound:
-   *
-   * <pre>
-   * DynamicMap.mapOf(binder(), new TypeLiteral&lt;Thing&lt;Bar&gt;&gt;(){});
-   * bind(new TypeLiteral&lt;Thing&lt;Bar&gt;&gt;() {})
-   *   .annotatedWith(Exports.named(&quot;foo&quot;))
-   *   .to(Impl.class);
-   * </pre>
-   *
-   * @param binder a new binder created in the module.
-   * @param member type of value in the map.
-   */
-  public static <T> void mapOf(Binder binder, TypeLiteral<T> member) {
-    @SuppressWarnings("unchecked")
-    Key<DynamicMap<T>> key =
-        (Key<DynamicMap<T>>)
-            Key.get(Types.newParameterizedType(DynamicMap.class, member.getType()));
-    binder.bind(key).toProvider(new DynamicMapProvider<>(member)).in(Scopes.SINGLETON);
-  }
-
-  final ConcurrentMap<NamePair, Provider<T>> items;
-
-  DynamicMap() {
-    items =
-        new ConcurrentHashMap<>(
-            16 /* initial size */,
-            0.75f /* load factor */,
-            1 /* concurrency level of 1, load/unload is single threaded */);
-  }
-
-  /**
-   * Lookup an implementation by name.
-   *
-   * @param pluginName local name of the plugin providing the item.
-   * @param exportName name the plugin exports the item as.
-   * @return the implementation. Null if the plugin is not running, or if the plugin does not export
-   *     this name.
-   * @throws ProvisionException if the registered provider is unable to obtain an instance of the
-   *     requested implementation.
-   */
-  public T get(String pluginName, String exportName) throws ProvisionException {
-    Provider<T> p = items.get(new NamePair(pluginName, exportName));
-    return p != null ? p.get() : null;
-  }
-
-  /**
-   * Get the names of all running plugins supplying this type.
-   *
-   * @return sorted set of active plugins that supply at least one item.
-   */
-  public SortedSet<String> plugins() {
-    SortedSet<String> r = new TreeSet<>();
-    for (NamePair p : items.keySet()) {
-      r.add(p.pluginName);
-    }
-    return Collections.unmodifiableSortedSet(r);
-  }
-
-  /**
-   * Get the items exported by a single plugin.
-   *
-   * @param pluginName name of the plugin.
-   * @return items exported by a plugin, keyed by the export name.
-   */
-  public SortedMap<String, Provider<T>> byPlugin(String pluginName) {
-    SortedMap<String, Provider<T>> r = new TreeMap<>();
-    for (Map.Entry<NamePair, Provider<T>> e : items.entrySet()) {
-      if (e.getKey().pluginName.equals(pluginName)) {
-        r.put(e.getKey().exportName, e.getValue());
-      }
-    }
-    return Collections.unmodifiableSortedMap(r);
-  }
-
-  /** Iterate through all entries in an undefined order. */
-  @Override
-  public Iterator<Entry<T>> iterator() {
-    final Iterator<Map.Entry<NamePair, Provider<T>>> i = items.entrySet().iterator();
-    return new Iterator<Entry<T>>() {
-      @Override
-      public boolean hasNext() {
-        return i.hasNext();
-      }
-
-      @Override
-      public Entry<T> next() {
-        final Map.Entry<NamePair, Provider<T>> e = i.next();
-        return new Entry<T>() {
-          @Override
-          public String getPluginName() {
-            return e.getKey().pluginName;
-          }
-
-          @Override
-          public String getExportName() {
-            return e.getKey().exportName;
-          }
-
-          @Override
-          public Provider<T> getProvider() {
-            return e.getValue();
-          }
-        };
-      }
-
-      @Override
-      public void remove() {
-        throw new UnsupportedOperationException();
-      }
-    };
-  }
-
-  public interface Entry<T> {
-    String getPluginName();
-
-    String getExportName();
-
-    Provider<T> getProvider();
-  }
-
-  static class NamePair {
-    private final String pluginName;
-    private final String exportName;
-
-    NamePair(String pn, String en) {
-      this.pluginName = pn;
-      this.exportName = en;
-    }
-
-    @Override
-    public int hashCode() {
-      return pluginName.hashCode() * 31 + exportName.hashCode();
-    }
-
-    @Override
-    public boolean equals(Object other) {
-      if (other instanceof NamePair) {
-        NamePair np = (NamePair) other;
-        return pluginName.equals(np.pluginName) && exportName.equals(np.exportName);
-      }
-      return false;
-    }
-  }
-
-  public static <T> DynamicMap<T> emptyMap() {
-    return new DynamicMap<T>() {};
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicMapProvider.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicMapProvider.java
deleted file mode 100644
index 420a356..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicMapProvider.java
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.extensions.registration;
-
-import com.google.inject.Binding;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.Provider;
-import com.google.inject.TypeLiteral;
-import java.util.List;
-
-class DynamicMapProvider<T> implements Provider<DynamicMap<T>> {
-  private final TypeLiteral<T> type;
-
-  @Inject private Injector injector;
-
-  DynamicMapProvider(TypeLiteral<T> type) {
-    this.type = type;
-  }
-
-  @Override
-  public DynamicMap<T> get() {
-    PrivateInternals_DynamicMapImpl<T> m = new PrivateInternals_DynamicMapImpl<>();
-    List<Binding<T>> bindings = injector.findBindingsByType(type);
-    if (bindings != null) {
-      for (Binding<T> b : bindings) {
-        if (b.getKey().getAnnotation() != null) {
-          m.put("gerrit", b.getKey(), b.getProvider());
-        }
-      }
-    }
-    return m;
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicSet.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicSet.java
deleted file mode 100644
index 5cdf267..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicSet.java
+++ /dev/null
@@ -1,276 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.extensions.registration;
-
-import com.google.inject.Binder;
-import com.google.inject.Key;
-import com.google.inject.Provider;
-import com.google.inject.Scopes;
-import com.google.inject.TypeLiteral;
-import com.google.inject.binder.LinkedBindingBuilder;
-import com.google.inject.internal.UniqueAnnotations;
-import com.google.inject.name.Named;
-import com.google.inject.util.Providers;
-import com.google.inject.util.Types;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.atomic.AtomicReference;
-
-/**
- * A set of members that can be modified as plugins reload.
- *
- * <p>DynamicSets are always mapped as singletons in Guice. Sets store Providers internally, and
- * resolve the provider to an instance on demand. This enables registrations to decide between
- * singleton and non-singleton members.
- */
-public class DynamicSet<T> implements Iterable<T> {
-  /**
-   * Declare a singleton {@code DynamicSet<T>} with a binder.
-   *
-   * <p>Sets must be defined in a Guice module before they can be bound:
-   *
-   * <pre>
-   *   DynamicSet.setOf(binder(), Interface.class);
-   *   DynamicSet.bind(binder(), Interface.class).to(Impl.class);
-   * </pre>
-   *
-   * @param binder a new binder created in the module.
-   * @param member type of entry in the set.
-   */
-  public static <T> void setOf(Binder binder, Class<T> member) {
-    binder.disableCircularProxies();
-    setOf(binder, TypeLiteral.get(member));
-  }
-
-  /**
-   * Declare a singleton {@code DynamicSet<T>} with a binder.
-   *
-   * <p>Sets must be defined in a Guice module before they can be bound:
-   *
-   * <pre>
-   *   DynamicSet.setOf(binder(), new TypeLiteral&lt;Thing&lt;Foo&gt;&gt;() {});
-   * </pre>
-   *
-   * @param binder a new binder created in the module.
-   * @param member type of entry in the set.
-   */
-  public static <T> void setOf(Binder binder, TypeLiteral<T> member) {
-    @SuppressWarnings("unchecked")
-    Key<DynamicSet<T>> key =
-        (Key<DynamicSet<T>>)
-            Key.get(Types.newParameterizedType(DynamicSet.class, member.getType()));
-    binder.disableCircularProxies();
-    binder.bind(key).toProvider(new DynamicSetProvider<>(member)).in(Scopes.SINGLETON);
-  }
-
-  /**
-   * Bind one implementation into the set using a unique annotation.
-   *
-   * @param binder a new binder created in the module.
-   * @param type type of entries in the set.
-   * @return a binder to continue configuring the new set member.
-   */
-  public static <T> LinkedBindingBuilder<T> bind(Binder binder, Class<T> type) {
-    binder.disableCircularProxies();
-    return bind(binder, TypeLiteral.get(type));
-  }
-
-  /**
-   * Bind one implementation into the set using a unique annotation.
-   *
-   * @param binder a new binder created in the module.
-   * @param type type of entries in the set.
-   * @return a binder to continue configuring the new set member.
-   */
-  public static <T> LinkedBindingBuilder<T> bind(Binder binder, TypeLiteral<T> type) {
-    binder.disableCircularProxies();
-    return binder.bind(type).annotatedWith(UniqueAnnotations.create());
-  }
-
-  /**
-   * Bind a named implementation into the set.
-   *
-   * @param binder a new binder created in the module.
-   * @param type type of entries in the set.
-   * @param name {@code @Named} annotation to apply instead of a unique annotation.
-   * @return a binder to continue configuring the new set member.
-   */
-  public static <T> LinkedBindingBuilder<T> bind(Binder binder, Class<T> type, Named name) {
-    binder.disableCircularProxies();
-    return bind(binder, TypeLiteral.get(type));
-  }
-
-  /**
-   * Bind a named implementation into the set.
-   *
-   * @param binder a new binder created in the module.
-   * @param type type of entries in the set.
-   * @param name {@code @Named} annotation to apply instead of a unique annotation.
-   * @return a binder to continue configuring the new set member.
-   */
-  public static <T> LinkedBindingBuilder<T> bind(Binder binder, TypeLiteral<T> type, Named name) {
-    binder.disableCircularProxies();
-    return binder.bind(type).annotatedWith(name);
-  }
-
-  public static <T> DynamicSet<T> emptySet() {
-    return new DynamicSet<>(Collections.<AtomicReference<Provider<T>>>emptySet());
-  }
-
-  private final CopyOnWriteArrayList<AtomicReference<Provider<T>>> items;
-
-  DynamicSet(Collection<AtomicReference<Provider<T>>> base) {
-    items = new CopyOnWriteArrayList<>(base);
-  }
-
-  public DynamicSet() {
-    this(Collections.<AtomicReference<Provider<T>>>emptySet());
-  }
-
-  @Override
-  public Iterator<T> iterator() {
-    final Iterator<AtomicReference<Provider<T>>> itr = items.iterator();
-    return new Iterator<T>() {
-      private T next;
-
-      @Override
-      public boolean hasNext() {
-        while (next == null && itr.hasNext()) {
-          Provider<T> p = itr.next().get();
-          if (p != null) {
-            try {
-              next = p.get();
-            } catch (RuntimeException e) {
-              // TODO Log failed member of DynamicSet.
-            }
-          }
-        }
-        return next != null;
-      }
-
-      @Override
-      public T next() {
-        if (hasNext()) {
-          T result = next;
-          next = null;
-          return result;
-        }
-        throw new NoSuchElementException();
-      }
-
-      @Override
-      public void remove() {
-        throw new UnsupportedOperationException();
-      }
-    };
-  }
-
-  /**
-   * Returns {@code true} if this set contains the given item.
-   *
-   * @param item item to check whether or not it is contained.
-   * @return {@code true} if this set contains the given item.
-   */
-  public boolean contains(T item) {
-    Iterator<T> iterator = iterator();
-    while (iterator.hasNext()) {
-      T candidate = iterator.next();
-      if (candidate == item) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * Add one new element to the set.
-   *
-   * @param item the item to add to the collection. Must not be null.
-   * @return handle to remove the item at a later point in time.
-   */
-  public RegistrationHandle add(T item) {
-    return add(Providers.of(item));
-  }
-
-  /**
-   * Add one new element to the set.
-   *
-   * @param item the item to add to the collection. Must not be null.
-   * @return handle to remove the item at a later point in time.
-   */
-  public RegistrationHandle add(Provider<T> item) {
-    final AtomicReference<Provider<T>> ref = new AtomicReference<>(item);
-    items.add(ref);
-    return new RegistrationHandle() {
-      @Override
-      public void remove() {
-        if (ref.compareAndSet(item, null)) {
-          items.remove(ref);
-        }
-      }
-    };
-  }
-
-  /**
-   * Add one new element that may be hot-replaceable in the future.
-   *
-   * @param key unique description from the item's Guice binding. This can be later obtained from
-   *     the registration handle to facilitate matching with the new equivalent instance during a
-   *     hot reload.
-   * @param item the item to add to the collection right now. Must not be null.
-   * @return a handle that can remove this item later, or hot-swap the item without it ever leaving
-   *     the collection.
-   */
-  public ReloadableRegistrationHandle<T> add(Key<T> key, Provider<T> item) {
-    AtomicReference<Provider<T>> ref = new AtomicReference<>(item);
-    items.add(ref);
-    return new ReloadableHandle(ref, key, item);
-  }
-
-  private class ReloadableHandle implements ReloadableRegistrationHandle<T> {
-    private final AtomicReference<Provider<T>> ref;
-    private final Key<T> key;
-    private final Provider<T> item;
-
-    ReloadableHandle(AtomicReference<Provider<T>> ref, Key<T> key, Provider<T> item) {
-      this.ref = ref;
-      this.key = key;
-      this.item = item;
-    }
-
-    @Override
-    public void remove() {
-      if (ref.compareAndSet(item, null)) {
-        items.remove(ref);
-      }
-    }
-
-    @Override
-    public Key<T> getKey() {
-      return key;
-    }
-
-    @Override
-    public ReloadableHandle replace(Key<T> newKey, Provider<T> newItem) {
-      if (ref.compareAndSet(item, newItem)) {
-        return new ReloadableHandle(ref, newKey, newItem);
-      }
-      return null;
-    }
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicSetProvider.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicSetProvider.java
deleted file mode 100644
index 707c76a..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicSetProvider.java
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.extensions.registration;
-
-import com.google.inject.Binding;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.Provider;
-import com.google.inject.TypeLiteral;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicReference;
-
-class DynamicSetProvider<T> implements Provider<DynamicSet<T>> {
-  private final TypeLiteral<T> type;
-
-  @Inject private Injector injector;
-
-  DynamicSetProvider(TypeLiteral<T> type) {
-    this.type = type;
-  }
-
-  @Override
-  public DynamicSet<T> get() {
-    return new DynamicSet<>(find(injector, type));
-  }
-
-  private static <T> List<AtomicReference<Provider<T>>> find(Injector src, TypeLiteral<T> type) {
-    List<Binding<T>> bindings = src.findBindingsByType(type);
-    int cnt = bindings != null ? bindings.size() : 0;
-    if (cnt == 0) {
-      return Collections.emptyList();
-    }
-    List<AtomicReference<Provider<T>>> r = new ArrayList<>(cnt);
-    for (Binding<T> b : bindings) {
-      if (b.getKey().getAnnotation() != null) {
-        r.add(new AtomicReference<>(b.getProvider()));
-      }
-    }
-    return r;
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/PrivateInternals_DynamicMapImpl.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/PrivateInternals_DynamicMapImpl.java
deleted file mode 100644
index 50aed7d..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/PrivateInternals_DynamicMapImpl.java
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.extensions.registration;
-
-import com.google.gerrit.extensions.annotations.Export;
-import com.google.inject.Key;
-import com.google.inject.Provider;
-
-/** <b>DO NOT USE</b> */
-public class PrivateInternals_DynamicMapImpl<T> extends DynamicMap<T> {
-  PrivateInternals_DynamicMapImpl() {}
-
-  /**
-   * Store one new element into the map.
-   *
-   * @param pluginName unique name of the plugin providing the export.
-   * @param exportName name the plugin has exported the item as.
-   * @param item the item to add to the collection. Must not be null.
-   * @return handle to remove the item at a later point in time.
-   */
-  public RegistrationHandle put(String pluginName, String exportName, Provider<T> item) {
-    final NamePair key = new NamePair(pluginName, exportName);
-    items.put(key, item);
-    return new RegistrationHandle() {
-      @Override
-      public void remove() {
-        items.remove(key, item);
-      }
-    };
-  }
-
-  /**
-   * Store one new element that may be hot-replaceable in the future.
-   *
-   * @param pluginName unique name of the plugin providing the export.
-   * @param key unique description from the item's Guice binding. This can be later obtained from
-   *     the registration handle to facilitate matching with the new equivalent instance during a
-   *     hot reload. The key must use an {@link Export} annotation.
-   * @param item the item to add to the collection right now. Must not be null.
-   * @return a handle that can remove this item later, or hot-swap the item without it ever leaving
-   *     the collection.
-   */
-  public ReloadableRegistrationHandle<T> put(String pluginName, Key<T> key, Provider<T> item) {
-    String exportName = ((Export) key.getAnnotation()).value();
-    NamePair np = new NamePair(pluginName, exportName);
-    items.put(np, item);
-    return new ReloadableHandle(np, key, item);
-  }
-
-  private class ReloadableHandle implements ReloadableRegistrationHandle<T> {
-    private final NamePair np;
-    private final Key<T> key;
-    private final Provider<T> item;
-
-    ReloadableHandle(NamePair np, Key<T> key, Provider<T> item) {
-      this.np = np;
-      this.key = key;
-      this.item = item;
-    }
-
-    @Override
-    public void remove() {
-      items.remove(np, item);
-    }
-
-    @Override
-    public Key<T> getKey() {
-      return key;
-    }
-
-    @Override
-    public ReloadableHandle replace(Key<T> newKey, Provider<T> newItem) {
-      if (items.replace(np, item, newItem)) {
-        return new ReloadableHandle(np, newKey, newItem);
-      }
-      return null;
-    }
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/PrivateInternals_DynamicTypes.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/PrivateInternals_DynamicTypes.java
deleted file mode 100644
index e606079..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/PrivateInternals_DynamicTypes.java
+++ /dev/null
@@ -1,205 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.extensions.registration;
-
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.inject.Binding;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.Key;
-import com.google.inject.TypeLiteral;
-import java.lang.reflect.ParameterizedType;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/** <b>DO NOT USE</b> */
-public class PrivateInternals_DynamicTypes {
-  public static Map<TypeLiteral<?>, DynamicItem<?>> dynamicItemsOf(Injector src) {
-    Map<TypeLiteral<?>, DynamicItem<?>> m = new HashMap<>();
-    for (Map.Entry<Key<?>, Binding<?>> e : src.getBindings().entrySet()) {
-      TypeLiteral<?> type = e.getKey().getTypeLiteral();
-      if (type.getRawType() == DynamicItem.class) {
-        ParameterizedType p = (ParameterizedType) type.getType();
-        m.put(
-            TypeLiteral.get(p.getActualTypeArguments()[0]),
-            (DynamicItem<?>) e.getValue().getProvider().get());
-      }
-    }
-    if (m.isEmpty()) {
-      return Collections.emptyMap();
-    }
-    return Collections.unmodifiableMap(m);
-  }
-
-  public static Map<TypeLiteral<?>, DynamicSet<?>> dynamicSetsOf(Injector src) {
-    Map<TypeLiteral<?>, DynamicSet<?>> m = new HashMap<>();
-    for (Map.Entry<Key<?>, Binding<?>> e : src.getBindings().entrySet()) {
-      TypeLiteral<?> type = e.getKey().getTypeLiteral();
-      if (type.getRawType() == DynamicSet.class) {
-        ParameterizedType p = (ParameterizedType) type.getType();
-        m.put(
-            TypeLiteral.get(p.getActualTypeArguments()[0]),
-            (DynamicSet<?>) e.getValue().getProvider().get());
-      }
-    }
-    if (m.isEmpty()) {
-      return Collections.emptyMap();
-    }
-    return Collections.unmodifiableMap(m);
-  }
-
-  public static Map<TypeLiteral<?>, DynamicMap<?>> dynamicMapsOf(Injector src) {
-    Map<TypeLiteral<?>, DynamicMap<?>> m = new HashMap<>();
-    for (Map.Entry<Key<?>, Binding<?>> e : src.getBindings().entrySet()) {
-      TypeLiteral<?> type = e.getKey().getTypeLiteral();
-      if (type.getRawType() == DynamicMap.class) {
-        ParameterizedType p = (ParameterizedType) type.getType();
-        m.put(
-            TypeLiteral.get(p.getActualTypeArguments()[0]),
-            (DynamicMap<?>) e.getValue().getProvider().get());
-      }
-    }
-    if (m.isEmpty()) {
-      return Collections.emptyMap();
-    }
-    return Collections.unmodifiableMap(m);
-  }
-
-  public static List<RegistrationHandle> attachItems(
-      Injector src, Map<TypeLiteral<?>, DynamicItem<?>> items, String pluginName) {
-    if (src == null || items == null || items.isEmpty()) {
-      return Collections.emptyList();
-    }
-
-    List<RegistrationHandle> handles = new ArrayList<>(4);
-    try {
-      for (Map.Entry<TypeLiteral<?>, DynamicItem<?>> e : items.entrySet()) {
-        @SuppressWarnings("unchecked")
-        TypeLiteral<Object> type = (TypeLiteral<Object>) e.getKey();
-
-        @SuppressWarnings("unchecked")
-        DynamicItem<Object> item = (DynamicItem<Object>) e.getValue();
-
-        for (Binding<Object> b : bindings(src, type)) {
-          handles.add(item.set(b.getKey(), b.getProvider(), pluginName));
-        }
-      }
-    } catch (RuntimeException | Error e) {
-      remove(handles);
-      throw e;
-    }
-    return handles;
-  }
-
-  public static List<RegistrationHandle> attachSets(
-      Injector src, Map<TypeLiteral<?>, DynamicSet<?>> sets) {
-    if (src == null || sets == null || sets.isEmpty()) {
-      return Collections.emptyList();
-    }
-
-    List<RegistrationHandle> handles = new ArrayList<>(4);
-    try {
-      for (Map.Entry<TypeLiteral<?>, DynamicSet<?>> e : sets.entrySet()) {
-        @SuppressWarnings("unchecked")
-        TypeLiteral<Object> type = (TypeLiteral<Object>) e.getKey();
-
-        @SuppressWarnings("unchecked")
-        DynamicSet<Object> set = (DynamicSet<Object>) e.getValue();
-
-        for (Binding<Object> b : bindings(src, type)) {
-          if (b.getKey().getAnnotation() != null) {
-            handles.add(set.add(b.getKey(), b.getProvider()));
-          }
-        }
-      }
-    } catch (RuntimeException | Error e) {
-      remove(handles);
-      throw e;
-    }
-    return handles;
-  }
-
-  public static List<RegistrationHandle> attachMaps(
-      Injector src, String groupName, Map<TypeLiteral<?>, DynamicMap<?>> maps) {
-    if (src == null || maps == null || maps.isEmpty()) {
-      return Collections.emptyList();
-    }
-
-    List<RegistrationHandle> handles = new ArrayList<>(4);
-    try {
-      for (Map.Entry<TypeLiteral<?>, DynamicMap<?>> e : maps.entrySet()) {
-        @SuppressWarnings("unchecked")
-        TypeLiteral<Object> type = (TypeLiteral<Object>) e.getKey();
-
-        @SuppressWarnings("unchecked")
-        PrivateInternals_DynamicMapImpl<Object> set =
-            (PrivateInternals_DynamicMapImpl<Object>) e.getValue();
-
-        for (Binding<Object> b : bindings(src, type)) {
-          if (b.getKey().getAnnotation() != null) {
-            handles.add(set.put(groupName, b.getKey(), b.getProvider()));
-          }
-        }
-      }
-    } catch (RuntimeException | Error e) {
-      remove(handles);
-      throw e;
-    }
-    return handles;
-  }
-
-  public static LifecycleListener registerInParentInjectors() {
-    return new LifecycleListener() {
-      private List<RegistrationHandle> handles;
-
-      @Inject private Injector self;
-
-      @Override
-      public void start() {
-        handles = new ArrayList<>(4);
-        Injector parent = self.getParent();
-        while (parent != null) {
-          handles.addAll(attachSets(self, dynamicSetsOf(parent)));
-          handles.addAll(attachMaps(self, "gerrit", dynamicMapsOf(parent)));
-          parent = parent.getParent();
-        }
-        if (handles.isEmpty()) {
-          handles = null;
-        }
-      }
-
-      @Override
-      public void stop() {
-        remove(handles);
-        handles = null;
-      }
-    };
-  }
-
-  private static void remove(List<RegistrationHandle> handles) {
-    if (handles != null) {
-      for (RegistrationHandle handle : handles) {
-        handle.remove();
-      }
-    }
-  }
-
-  private static <T> List<Binding<T>> bindings(Injector src, TypeLiteral<T> type) {
-    return src.findBindingsByType(type);
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/AcceptsCreate.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/AcceptsCreate.java
deleted file mode 100644
index 994e7f2..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/AcceptsCreate.java
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.extensions.restapi;
-
-/**
- * Optional interface for {@link RestCollection}.
- *
- * <p>Collections that implement this interface can accept a {@code PUT} or {@code POST} when the
- * parse method throws {@link ResourceNotFoundException}.
- */
-public interface AcceptsCreate<P extends RestResource> {
-  /**
-   * Handle creation of a child resource.
-   *
-   * @param parent parent collection handle.
-   * @param id id of the resource being created.
-   * @return a view to perform the creation. The create method must embed the id into the newly
-   *     returned view object, as it will not be passed.
-   * @throws RestApiException the view cannot be constructed.
-   */
-  RestModifyView<P, ?> create(P parent, IdString id) throws RestApiException;
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/AcceptsDelete.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/AcceptsDelete.java
deleted file mode 100644
index 6b5da7c..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/AcceptsDelete.java
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.extensions.restapi;
-
-/**
- * Optional interface for {@link RestCollection}.
- *
- * <p>Collections that implement this interface can accept a {@code DELETE} directly on the
- * collection itself.
- */
-public interface AcceptsDelete<P extends RestResource> {
-  /**
-   * Handle deletion of a child resource by DELETE on the collection.
-   *
-   * @param parent parent collection handle.
-   * @param id id of the resource being created (optional).
-   * @return a view to perform the deletion.
-   * @throws RestApiException the view cannot be constructed.
-   */
-  RestModifyView<P, ?> delete(P parent, IdString id) throws RestApiException;
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/AcceptsPost.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/AcceptsPost.java
deleted file mode 100644
index da87d32..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/AcceptsPost.java
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.extensions.restapi;
-
-/**
- * Optional interface for {@link RestCollection}.
- *
- * <p>Collections that implement this interface can accept a {@code POST} directly on the collection
- * itself when no id was given in the path. This interface is intended to be used with
- * TopLevelResource collections. Nested collections often bind POST on the parent collection to the
- * view implementation handling the insertion of a new member.
- */
-public interface AcceptsPost<P extends RestResource> {
-  /**
-   * Handle creation of a child resource by POST on the collection.
-   *
-   * @param parent parent collection handle.
-   * @return a view to perform the creation. The id of the newly created resource should be
-   *     determined from the input body.
-   * @throws RestApiException the view cannot be constructed.
-   */
-  RestModifyView<P, ?> post(P parent) throws RestApiException;
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/AuthException.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/AuthException.java
deleted file mode 100644
index 0b4f459..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/AuthException.java
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.extensions.restapi;
-
-/** Caller cannot perform the request operation (HTTP 403 Forbidden). */
-public class AuthException extends RestApiException {
-  private static final long serialVersionUID = 1L;
-
-  /** @param msg message to return to the client. */
-  public AuthException(String msg) {
-    super(msg);
-  }
-
-  /**
-   * @param msg message to return to the client.
-   * @param cause cause of this exception.
-   */
-  public AuthException(String msg, Throwable cause) {
-    super(msg, cause);
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestApiModule.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestApiModule.java
deleted file mode 100644
index 0db2891..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestApiModule.java
+++ /dev/null
@@ -1,166 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.extensions.restapi;
-
-import com.google.gerrit.extensions.annotations.Export;
-import com.google.gerrit.extensions.annotations.Exports;
-import com.google.gerrit.extensions.config.FactoryModule;
-import com.google.inject.Provider;
-import com.google.inject.TypeLiteral;
-import com.google.inject.binder.LinkedBindingBuilder;
-import com.google.inject.binder.ScopedBindingBuilder;
-
-/** Guice DSL for binding {@link RestView} implementations. */
-public abstract class RestApiModule extends FactoryModule {
-  protected static final String GET = "GET";
-  protected static final String PUT = "PUT";
-  protected static final String DELETE = "DELETE";
-  protected static final String POST = "POST";
-
-  protected <R extends RestResource> ReadViewBinder<R> get(TypeLiteral<RestView<R>> viewType) {
-    return new ReadViewBinder<>(view(viewType, GET, "/"));
-  }
-
-  protected <R extends RestResource> ModifyViewBinder<R> put(TypeLiteral<RestView<R>> viewType) {
-    return new ModifyViewBinder<>(view(viewType, PUT, "/"));
-  }
-
-  protected <R extends RestResource> ModifyViewBinder<R> post(TypeLiteral<RestView<R>> viewType) {
-    return new ModifyViewBinder<>(view(viewType, POST, "/"));
-  }
-
-  protected <R extends RestResource> ModifyViewBinder<R> delete(TypeLiteral<RestView<R>> viewType) {
-    return new ModifyViewBinder<>(view(viewType, DELETE, "/"));
-  }
-
-  protected <R extends RestResource> ReadViewBinder<R> get(
-      TypeLiteral<RestView<R>> viewType, String name) {
-    return new ReadViewBinder<>(view(viewType, GET, name));
-  }
-
-  protected <R extends RestResource> ModifyViewBinder<R> put(
-      TypeLiteral<RestView<R>> viewType, String name) {
-    return new ModifyViewBinder<>(view(viewType, PUT, name));
-  }
-
-  protected <R extends RestResource> ModifyViewBinder<R> post(
-      TypeLiteral<RestView<R>> viewType, String name) {
-    return new ModifyViewBinder<>(view(viewType, POST, name));
-  }
-
-  protected <R extends RestResource> ModifyViewBinder<R> delete(
-      TypeLiteral<RestView<R>> viewType, String name) {
-    return new ModifyViewBinder<>(view(viewType, DELETE, name));
-  }
-
-  protected <P extends RestResource> ChildCollectionBinder<P> child(
-      TypeLiteral<RestView<P>> type, String name) {
-    return new ChildCollectionBinder<>(view(type, GET, name));
-  }
-
-  protected <R extends RestResource> LinkedBindingBuilder<RestView<R>> view(
-      TypeLiteral<RestView<R>> viewType, String method, String name) {
-    return bind(viewType).annotatedWith(export(method, name));
-  }
-
-  private static Export export(String method, String name) {
-    if (name.length() > 1 && name.startsWith("/")) {
-      // Views may be bound as "/" to mean the resource itself, or
-      // as "status" as in "/type/{id}/status". Don't bind "/status"
-      // if the caller asked for that, bind what the server expects.
-      name = name.substring(1);
-    }
-    return Exports.named(method + "." + name);
-  }
-
-  public static class ReadViewBinder<P extends RestResource> {
-    private final LinkedBindingBuilder<RestView<P>> binder;
-
-    private ReadViewBinder(LinkedBindingBuilder<RestView<P>> binder) {
-      this.binder = binder;
-    }
-
-    public <T extends RestReadView<P>> ScopedBindingBuilder to(Class<T> impl) {
-      return binder.to(impl);
-    }
-
-    public <T extends RestReadView<P>> void toInstance(T impl) {
-      binder.toInstance(impl);
-    }
-
-    public <T extends RestReadView<P>> ScopedBindingBuilder toProvider(
-        Class<? extends Provider<? extends T>> providerType) {
-      return binder.toProvider(providerType);
-    }
-
-    public <T extends RestReadView<P>> ScopedBindingBuilder toProvider(
-        Provider<? extends T> provider) {
-      return binder.toProvider(provider);
-    }
-  }
-
-  public static class ModifyViewBinder<P extends RestResource> {
-    private final LinkedBindingBuilder<RestView<P>> binder;
-
-    private ModifyViewBinder(LinkedBindingBuilder<RestView<P>> binder) {
-      this.binder = binder;
-    }
-
-    public <T extends RestModifyView<P, ?>> ScopedBindingBuilder to(Class<T> impl) {
-      return binder.to(impl);
-    }
-
-    public <T extends RestModifyView<P, ?>> void toInstance(T impl) {
-      binder.toInstance(impl);
-    }
-
-    public <T extends RestModifyView<P, ?>> ScopedBindingBuilder toProvider(
-        Class<? extends Provider<? extends T>> providerType) {
-      return binder.toProvider(providerType);
-    }
-
-    public <T extends RestModifyView<P, ?>> ScopedBindingBuilder toProvider(
-        Provider<? extends T> provider) {
-      return binder.toProvider(provider);
-    }
-  }
-
-  public static class ChildCollectionBinder<P extends RestResource> {
-    private final LinkedBindingBuilder<RestView<P>> binder;
-
-    private ChildCollectionBinder(LinkedBindingBuilder<RestView<P>> binder) {
-      this.binder = binder;
-    }
-
-    public <C extends RestResource, T extends ChildCollection<P, C>> ScopedBindingBuilder to(
-        Class<T> impl) {
-      return binder.to(impl);
-    }
-
-    public <C extends RestResource, T extends ChildCollection<P, C>> void toInstance(T impl) {
-      binder.toInstance(impl);
-    }
-
-    public <C extends RestResource, T extends ChildCollection<P, C>>
-        ScopedBindingBuilder toProvider(Class<? extends Provider<? extends T>> providerType) {
-      return binder.toProvider(providerType);
-    }
-
-    public <C extends RestResource, T extends ChildCollection<P, C>>
-        ScopedBindingBuilder toProvider(Provider<? extends T> provider) {
-      return binder.toProvider(provider);
-    }
-  }
-}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestCollection.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestCollection.java
deleted file mode 100644
index 46a4984..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestCollection.java
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.extensions.restapi;
-
-import com.google.gerrit.extensions.registration.DynamicMap;
-
-/**
- * A collection of resources accessible through a REST API.
- *
- * <p>To build a collection declare a resource, the map in a module, and the collection itself
- * accepting the map:
- *
- * <pre>
- * public class MyResource implements RestResource {
- *   public static final TypeLiteral&lt;RestView&lt;MyResource&gt;&gt; MY_KIND =
- *       new TypeLiteral&lt;RestView&lt;MyResource&gt;&gt;() {};
- * }
- *
- * public class MyModule extends AbstractModule {
- *   &#064;Override
- *   protected void configure() {
- *     DynamicMap.mapOf(binder(), MyResource.MY_KIND);
- *
- *     get(MyResource.MY_KIND, &quot;action&quot;).to(MyAction.class);
- *   }
- * }
- *
- * public class MyCollection extends RestCollection&lt;TopLevelResource, MyResource&gt; {
- *   private final DynamicMap&lt;RestView&lt;MyResource&gt;&gt; views;
- *
- *   &#064;Inject
- *   MyCollection(DynamicMap&lt;RestView&lt;MyResource&gt;&gt; views) {
- *     this.views = views;
- *   }
- *
- *   public DynamicMap&lt;RestView&lt;MyResource&gt;&gt; views() {
- *     return views;
- *   }
- * }
- * </pre>
- *
- * <p>To build a nested collection, implement {@link ChildCollection}.
- *
- * @param <P> type of the parent resource. For a top level collection this should always be {@link
- *     TopLevelResource}.
- * @param <R> type of resource operated on by each view.
- */
-public interface RestCollection<P extends RestResource, R extends RestResource> {
-  /**
-   * Create a view to list the contents of the collection.
-   *
-   * <p>The returned view should accept the parent type to scope the search, and may want to take a
-   * "q" parameter option to narrow the results.
-   *
-   * @return view to list the collection.
-   * @throws ResourceNotFoundException if the collection cannot be listed.
-   * @throws AuthException if the collection requires authentication.
-   */
-  RestView<P> list() throws ResourceNotFoundException, AuthException;
-
-  /**
-   * Parse a path component into a resource handle.
-   *
-   * @param parent the handle to the collection.
-   * @param id string identifier supplied by the client. In a URL such as {@code
-   *     /changes/1234/abandon} this string is {@code "1234"}.
-   * @return a resource handle for the identified object.
-   * @throws ResourceNotFoundException the object does not exist, or the caller is not permitted to
-   *     know if the resource exists.
-   * @throws Exception if the implementation had any errors converting to a resource handle. This
-   *     results in an HTTP 500 Internal Server Error.
-   */
-  R parse(P parent, IdString id) throws ResourceNotFoundException, Exception;
-
-  /**
-   * Get the views that support this collection.
-   *
-   * <p>Within a resource the views are accessed as {@code RESOURCE/plugin~view}.
-   *
-   * @return map of views.
-   */
-  DynamicMap<RestView<R>> views();
-}
diff --git a/gerrit-extension-api/src/test/java/com/google/gerrit/extensions/client/RangeTest.java b/gerrit-extension-api/src/test/java/com/google/gerrit/extensions/client/RangeTest.java
deleted file mode 100644
index 9695933..0000000
--- a/gerrit-extension-api/src/test/java/com/google/gerrit/extensions/client/RangeTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-// 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.
-
-package com.google.gerrit.extensions.client;
-
-import static com.google.gerrit.extensions.client.RangeSubject.assertThat;
-
-import org.junit.Test;
-
-public class RangeTest {
-
-  @Test
-  public void rangeOverMultipleLinesWithSmallerEndCharacterIsValid() {
-    Comment.Range range = createRange(13, 31, 19, 10);
-    assertThat(range).isValid();
-  }
-
-  @Test
-  public void rangeInOneLineIsValid() {
-    Comment.Range range = createRange(13, 2, 13, 10);
-    assertThat(range).isValid();
-  }
-
-  @Test
-  public void startPositionEqualToEndPositionIsValidRange() {
-    Comment.Range range = createRange(13, 11, 13, 11);
-    assertThat(range).isValid();
-  }
-
-  @Test
-  public void negativeStartLineResultsInInvalidRange() {
-    Comment.Range range = createRange(-1, 2, 19, 10);
-    assertThat(range).isInvalid();
-  }
-
-  @Test
-  public void negativeEndLineResultsInInvalidRange() {
-    Comment.Range range = createRange(13, 2, -1, 10);
-    assertThat(range).isInvalid();
-  }
-
-  @Test
-  public void negativeStartCharacterResultsInInvalidRange() {
-    Comment.Range range = createRange(13, -1, 19, 10);
-    assertThat(range).isInvalid();
-  }
-
-  @Test
-  public void negativeEndCharacterResultsInInvalidRange() {
-    Comment.Range range = createRange(13, 2, 19, -1);
-    assertThat(range).isInvalid();
-  }
-
-  @Test
-  public void zeroStartLineResultsInInvalidRange() {
-    Comment.Range range = createRange(0, 2, 19, 10);
-    assertThat(range).isInvalid();
-  }
-
-  @Test
-  public void zeroEndLineResultsInInvalidRange() {
-    Comment.Range range = createRange(13, 2, 0, 10);
-    assertThat(range).isInvalid();
-  }
-
-  @Test
-  public void zeroStartCharacterResultsInValidRange() {
-    Comment.Range range = createRange(13, 0, 19, 10);
-    assertThat(range).isValid();
-  }
-
-  @Test
-  public void zeroEndCharacterResultsInValidRange() {
-    Comment.Range range = createRange(13, 31, 19, 0);
-    assertThat(range).isValid();
-  }
-
-  @Test
-  public void startLineGreaterThanEndLineResultsInInvalidRange() {
-    Comment.Range range = createRange(20, 2, 19, 10);
-    assertThat(range).isInvalid();
-  }
-
-  @Test
-  public void startCharGreaterThanEndCharForSameLineResultsInInvalidRange() {
-    Comment.Range range = createRange(13, 11, 13, 10);
-    assertThat(range).isInvalid();
-  }
-
-  private Comment.Range createRange(
-      int startLine, int startCharacter, int endLine, int endCharacter) {
-    Comment.Range range = new Comment.Range();
-    range.startLine = startLine;
-    range.startCharacter = startCharacter;
-    range.endLine = endLine;
-    range.endCharacter = endCharacter;
-    return range;
-  }
-}
diff --git a/gerrit-extension-api/src/test/java/com/google/gerrit/extensions/registration/DynamicSetTest.java b/gerrit-extension-api/src/test/java/com/google/gerrit/extensions/registration/DynamicSetTest.java
deleted file mode 100644
index 117e474..0000000
--- a/gerrit-extension-api/src/test/java/com/google/gerrit/extensions/registration/DynamicSetTest.java
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.extensions.registration;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.inject.Key;
-import com.google.inject.util.Providers;
-import org.junit.Test;
-
-public class DynamicSetTest {
-  // In tests for {@link DynamicSet#contains(Object)}, be sure to avoid
-  // {@code assertThat(ds).contains(...) @} and
-  // {@code assertThat(ds).DoesNotContains(...) @} as (since
-  // {@link DynamicSet@} is not a {@link Collection@}) those boil down to
-  // iterating over the {@link DynamicSet@} and checking equality instead
-  // of calling {@link DynamicSet#contains(Object)}.
-  // To test for {@link DynamicSet#contains(Object)}, use
-  // {@code assertThat(ds.contains(...)).isTrue() @} and
-  // {@code assertThat(ds.contains(...)).isFalse() @} instead.
-
-  @Test
-  public void containsWithEmpty() throws Exception {
-    DynamicSet<Integer> ds = new DynamicSet<>();
-    assertThat(ds.contains(2)).isFalse(); // See above comment about ds.contains
-  }
-
-  @Test
-  public void containsTrueWithSingleElement() throws Exception {
-    DynamicSet<Integer> ds = new DynamicSet<>();
-    ds.add(2);
-
-    assertThat(ds.contains(2)).isTrue(); // See above comment about ds.contains
-  }
-
-  @Test
-  public void containsFalseWithSingleElement() throws Exception {
-    DynamicSet<Integer> ds = new DynamicSet<>();
-    ds.add(2);
-
-    assertThat(ds.contains(3)).isFalse(); // See above comment about ds.contains
-  }
-
-  @Test
-  public void containsTrueWithTwoElements() throws Exception {
-    DynamicSet<Integer> ds = new DynamicSet<>();
-    ds.add(2);
-    ds.add(4);
-
-    assertThat(ds.contains(4)).isTrue(); // See above comment about ds.contains
-  }
-
-  @Test
-  public void containsFalseWithTwoElements() throws Exception {
-    DynamicSet<Integer> ds = new DynamicSet<>();
-    ds.add(2);
-    ds.add(4);
-
-    assertThat(ds.contains(3)).isFalse(); // See above comment about ds.contains
-  }
-
-  @Test
-  public void containsDynamic() throws Exception {
-    DynamicSet<Integer> ds = new DynamicSet<>();
-    ds.add(2);
-
-    Key<Integer> key = Key.get(Integer.class);
-    ReloadableRegistrationHandle<Integer> handle = ds.add(key, Providers.of(4));
-
-    ds.add(6);
-
-    // At first, 4 is contained.
-    assertThat(ds.contains(4)).isTrue(); // See above comment about ds.contains
-
-    // Then we remove 4.
-    handle.remove();
-
-    // And now 4 should no longer be contained.
-    assertThat(ds.contains(4)).isFalse(); // See above comment about ds.contains
-  }
-}
diff --git a/gerrit-gpg/BUILD b/gerrit-gpg/BUILD
deleted file mode 100644
index 6cf17fa..0000000
--- a/gerrit-gpg/BUILD
+++ /dev/null
@@ -1,60 +0,0 @@
-load("//tools/bzl:junit.bzl", "junit_tests")
-
-DEPS = [
-    "//gerrit-common:server",
-    "//gerrit-extension-api:api",
-    "//gerrit-reviewdb:server",
-    "//gerrit-server:server",
-    "//lib:guava",
-    "//lib:gwtorm",
-    "//lib/guice:guice",
-    "//lib/guice:guice-assistedinject",
-    "//lib/guice:guice-servlet",
-    "//lib/jgit/org.eclipse.jgit:jgit",
-    "//lib/log:api",
-]
-
-java_library(
-    name = "gpg",
-    srcs = glob(["src/main/java/**/*.java"]),
-    visibility = ["//visibility:public"],
-    deps = DEPS + [
-        "//lib/bouncycastle:bcpg-neverlink",
-        "//lib/bouncycastle:bcprov-neverlink",
-    ],
-)
-
-TESTUTIL_SRCS = glob(["src/test/**/testutil/**/*.java"])
-
-java_library(
-    name = "testutil",
-    testonly = 1,
-    srcs = TESTUTIL_SRCS,
-    visibility = ["//visibility:public"],
-    deps = DEPS + [
-        "//lib/bouncycastle:bcpg-neverlink",
-        "//lib/bouncycastle:bcprov-neverlink",
-        ":gpg",
-    ],
-)
-
-junit_tests(
-    name = "gpg_tests",
-    srcs = glob(
-        ["src/test/java/**/*.java"],
-        exclude = TESTUTIL_SRCS,
-    ),
-    visibility = ["//visibility:public"],
-    deps = DEPS + [
-        ":gpg",
-        ":testutil",
-        "//gerrit-cache-h2:cache-h2",
-        "//gerrit-cache-mem:mem",
-        "//gerrit-lucene:lucene",
-        "//gerrit-server:testutil",
-        "//lib:truth",
-        "//lib/jgit/org.eclipse.jgit.junit:junit",
-        "//lib/bouncycastle:bcpg",
-        "//lib/bouncycastle:bcprov",
-    ],
-)
diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/GerritPublicKeyChecker.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/GerritPublicKeyChecker.java
deleted file mode 100644
index ffedcfb..0000000
--- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/GerritPublicKeyChecker.java
+++ /dev/null
@@ -1,252 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.gpg;
-
-import static com.google.gerrit.gpg.PublicKeyStore.keyIdToString;
-import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_GPGKEY;
-
-import com.google.common.base.CharMatcher;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Maps;
-import com.google.common.io.BaseEncoding;
-import com.google.gerrit.common.PageLinks;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.config.CanonicalWebUrl;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.query.account.InternalAccountQuery;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.bouncycastle.openpgp.PGPException;
-import org.bouncycastle.openpgp.PGPPublicKey;
-import org.bouncycastle.openpgp.PGPSignature;
-import org.bouncycastle.openpgp.operator.bc.BcPGPContentVerifierBuilderProvider;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.transport.PushCertificateIdent;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Checker for GPG public keys including Gerrit-specific checks.
- *
- * <p>For Gerrit, keys must contain a self-signed user ID certification matching a trusted external
- * ID in the database, or an email address thereof.
- */
-public class GerritPublicKeyChecker extends PublicKeyChecker {
-  private static final Logger log = LoggerFactory.getLogger(GerritPublicKeyChecker.class);
-
-  @Singleton
-  public static class Factory {
-    private final Provider<InternalAccountQuery> accountQueryProvider;
-    private final String webUrl;
-    private final IdentifiedUser.GenericFactory userFactory;
-    private final int maxTrustDepth;
-    private final ImmutableMap<Long, Fingerprint> trusted;
-
-    @Inject
-    Factory(
-        @GerritServerConfig Config cfg,
-        Provider<InternalAccountQuery> accountQueryProvider,
-        IdentifiedUser.GenericFactory userFactory,
-        @CanonicalWebUrl String webUrl) {
-      this.accountQueryProvider = accountQueryProvider;
-      this.webUrl = webUrl;
-      this.userFactory = userFactory;
-      this.maxTrustDepth = cfg.getInt("receive", null, "maxTrustDepth", 0);
-
-      String[] strs = cfg.getStringList("receive", null, "trustedKey");
-      if (strs.length != 0) {
-        Map<Long, Fingerprint> fps = Maps.newHashMapWithExpectedSize(strs.length);
-        for (String str : strs) {
-          str = CharMatcher.whitespace().removeFrom(str).toUpperCase();
-          Fingerprint fp = new Fingerprint(BaseEncoding.base16().decode(str));
-          fps.put(fp.getId(), fp);
-        }
-        trusted = ImmutableMap.copyOf(fps);
-      } else {
-        trusted = null;
-      }
-    }
-
-    public GerritPublicKeyChecker create() {
-      return new GerritPublicKeyChecker(this);
-    }
-
-    public GerritPublicKeyChecker create(IdentifiedUser expectedUser, PublicKeyStore store) {
-      GerritPublicKeyChecker checker = new GerritPublicKeyChecker(this);
-      checker.setExpectedUser(expectedUser);
-      checker.setStore(store);
-      return checker;
-    }
-  }
-
-  private final Provider<InternalAccountQuery> accountQueryProvider;
-  private final String webUrl;
-  private final IdentifiedUser.GenericFactory userFactory;
-
-  private IdentifiedUser expectedUser;
-
-  private GerritPublicKeyChecker(Factory factory) {
-    this.accountQueryProvider = factory.accountQueryProvider;
-    this.webUrl = factory.webUrl;
-    this.userFactory = factory.userFactory;
-    if (factory.trusted != null) {
-      enableTrust(factory.maxTrustDepth, factory.trusted);
-    }
-  }
-
-  /**
-   * Set the expected user for this checker.
-   *
-   * <p>If set, the top-level key passed to {@link #check(PGPPublicKey)} must belong to the given
-   * user. (Other keys checked in the course of verifying the web of trust are checked against the
-   * set of identities in the database belonging to the same user as the key.)
-   */
-  public GerritPublicKeyChecker setExpectedUser(IdentifiedUser expectedUser) {
-    this.expectedUser = expectedUser;
-    return this;
-  }
-
-  @Override
-  public CheckResult checkCustom(PGPPublicKey key, int depth) {
-    try {
-      if (depth == 0 && expectedUser != null) {
-        return checkIdsForExpectedUser(key);
-      }
-      return checkIdsForArbitraryUser(key);
-    } catch (PGPException | OrmException e) {
-      String msg = "Error checking user IDs for key";
-      log.warn(msg + " " + keyIdToString(key.getKeyID()), e);
-      return CheckResult.bad(msg);
-    }
-  }
-
-  private CheckResult checkIdsForExpectedUser(PGPPublicKey key) throws PGPException {
-    Set<String> allowedUserIds = getAllowedUserIds(expectedUser);
-    if (allowedUserIds.isEmpty()) {
-      return CheckResult.bad(
-          "No identities found for user; check " + webUrl + "#" + PageLinks.SETTINGS_WEBIDENT);
-    }
-    if (hasAllowedUserId(key, allowedUserIds)) {
-      return CheckResult.trusted();
-    }
-    return CheckResult.bad(missingUserIds(allowedUserIds));
-  }
-
-  private CheckResult checkIdsForArbitraryUser(PGPPublicKey key) throws PGPException, OrmException {
-    List<AccountState> accountStates = accountQueryProvider.get().byExternalId(toExtIdKey(key));
-    if (accountStates.isEmpty()) {
-      return CheckResult.bad("Key is not associated with any users");
-    }
-    if (accountStates.size() > 1) {
-      return CheckResult.bad("Key is associated with multiple users");
-    }
-    IdentifiedUser user = userFactory.create(accountStates.get(0));
-
-    Set<String> allowedUserIds = getAllowedUserIds(user);
-    if (allowedUserIds.isEmpty()) {
-      return CheckResult.bad("No identities found for user");
-    }
-    if (hasAllowedUserId(key, allowedUserIds)) {
-      return CheckResult.trusted();
-    }
-    return CheckResult.bad("Key does not contain any valid certifications for user's identities");
-  }
-
-  private boolean hasAllowedUserId(PGPPublicKey key, Set<String> allowedUserIds)
-      throws PGPException {
-    Iterator<String> userIds = key.getUserIDs();
-    while (userIds.hasNext()) {
-      String userId = userIds.next();
-      if (isAllowed(userId, allowedUserIds)) {
-        Iterator<PGPSignature> sigs = getSignaturesForId(key, userId);
-        while (sigs.hasNext()) {
-          if (isValidCertification(key, sigs.next(), userId)) {
-            return true;
-          }
-        }
-      }
-    }
-
-    return false;
-  }
-
-  private Iterator<PGPSignature> getSignaturesForId(PGPPublicKey key, String userId) {
-    Iterator<PGPSignature> result = key.getSignaturesForID(userId);
-    return result != null ? result : Collections.emptyIterator();
-  }
-
-  private Set<String> getAllowedUserIds(IdentifiedUser user) {
-    Set<String> result = new HashSet<>();
-    result.addAll(user.getEmailAddresses());
-    for (ExternalId extId : user.state().getExternalIds()) {
-      if (extId.isScheme(SCHEME_GPGKEY)) {
-        continue; // Omit GPG keys.
-      }
-      result.add(extId.key().get());
-    }
-    return result;
-  }
-
-  private static boolean isAllowed(String userId, Set<String> allowedUserIds) {
-    return allowedUserIds.contains(userId)
-        || allowedUserIds.contains(PushCertificateIdent.parse(userId).getEmailAddress());
-  }
-
-  private static boolean isValidCertification(PGPPublicKey key, PGPSignature sig, String userId)
-      throws PGPException {
-    if (sig.getSignatureType() != PGPSignature.DEFAULT_CERTIFICATION
-        && sig.getSignatureType() != PGPSignature.POSITIVE_CERTIFICATION) {
-      return false;
-    }
-    if (sig.getKeyID() != key.getKeyID()) {
-      return false;
-    }
-    // TODO(dborowitz): Handle certification revocations:
-    // - Is there a revocation by either this key or another key trusted by the
-    //   server?
-    // - Does such a revocation postdate all other valid certifications?
-
-    sig.init(new BcPGPContentVerifierBuilderProvider(), key);
-    return sig.verifyCertification(userId, key);
-  }
-
-  private static String missingUserIds(Set<String> allowedUserIds) {
-    StringBuilder sb =
-        new StringBuilder(
-            "Key must contain a valid certification for one of the following identities:\n");
-    Iterator<String> sorted = allowedUserIds.stream().sorted().iterator();
-    while (sorted.hasNext()) {
-      sb.append("  ").append(sorted.next());
-      if (sorted.hasNext()) {
-        sb.append('\n');
-      }
-    }
-    return sb.toString();
-  }
-
-  static ExternalId.Key toExtIdKey(PGPPublicKey key) {
-    return ExternalId.Key.create(SCHEME_GPGKEY, BaseEncoding.base16().encode(key.getFingerprint()));
-  }
-}
diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/GpgModule.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/GpgModule.java
deleted file mode 100644
index d12e921..0000000
--- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/GpgModule.java
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.gpg;
-
-import com.google.gerrit.extensions.config.FactoryModule;
-import com.google.gerrit.gpg.api.GpgApiModule;
-import com.google.gerrit.server.EnableSignedPush;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class GpgModule extends FactoryModule {
-  private static final Logger log = LoggerFactory.getLogger(GpgModule.class);
-
-  private final Config cfg;
-
-  public GpgModule(Config cfg) {
-    this.cfg = cfg;
-  }
-
-  @Override
-  protected void configure() {
-    boolean configEnableSignedPush = cfg.getBoolean("receive", null, "enableSignedPush", false);
-    boolean configEditGpgKeys = cfg.getBoolean("gerrit", null, "editGpgKeys", true);
-    boolean havePgp = BouncyCastleUtil.havePGP();
-    boolean enableSignedPush = configEnableSignedPush && havePgp;
-    bindConstant().annotatedWith(EnableSignedPush.class).to(enableSignedPush);
-
-    if (configEnableSignedPush && !havePgp) {
-      log.info("Bouncy Castle PGP not installed; signed push verification is disabled");
-    }
-    if (enableSignedPush) {
-      install(new SignedPushModule());
-      factory(GerritPushCertificateChecker.Factory.class);
-    }
-    install(new GpgApiModule(enableSignedPush && configEditGpgKeys));
-  }
-}
diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/PublicKeyChecker.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/PublicKeyChecker.java
deleted file mode 100644
index 70e9a24..0000000
--- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/PublicKeyChecker.java
+++ /dev/null
@@ -1,474 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.gpg;
-
-import static com.google.gerrit.extensions.common.GpgKeyInfo.Status.BAD;
-import static com.google.gerrit.extensions.common.GpgKeyInfo.Status.OK;
-import static com.google.gerrit.extensions.common.GpgKeyInfo.Status.TRUSTED;
-import static com.google.gerrit.gpg.PublicKeyStore.keyIdToString;
-import static com.google.gerrit.gpg.PublicKeyStore.keyToString;
-import static org.bouncycastle.bcpg.SignatureSubpacketTags.REVOCATION_KEY;
-import static org.bouncycastle.bcpg.SignatureSubpacketTags.REVOCATION_REASON;
-import static org.bouncycastle.bcpg.sig.RevocationReasonTags.KEY_COMPROMISED;
-import static org.bouncycastle.bcpg.sig.RevocationReasonTags.KEY_RETIRED;
-import static org.bouncycastle.bcpg.sig.RevocationReasonTags.KEY_SUPERSEDED;
-import static org.bouncycastle.bcpg.sig.RevocationReasonTags.NO_REASON;
-import static org.bouncycastle.openpgp.PGPSignature.DIRECT_KEY;
-import static org.bouncycastle.openpgp.PGPSignature.KEY_REVOCATION;
-
-import com.google.gerrit.extensions.common.GpgKeyInfo.Status;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.bouncycastle.bcpg.SignatureSubpacket;
-import org.bouncycastle.bcpg.SignatureSubpacketTags;
-import org.bouncycastle.bcpg.sig.RevocationKey;
-import org.bouncycastle.bcpg.sig.RevocationReason;
-import org.bouncycastle.openpgp.PGPException;
-import org.bouncycastle.openpgp.PGPPublicKey;
-import org.bouncycastle.openpgp.PGPPublicKeyRing;
-import org.bouncycastle.openpgp.PGPPublicKeyRingCollection;
-import org.bouncycastle.openpgp.PGPSignature;
-import org.bouncycastle.openpgp.operator.bc.BcPGPContentVerifierBuilderProvider;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Checker for GPG public keys for use in a push certificate. */
-public class PublicKeyChecker {
-  private static final Logger log = LoggerFactory.getLogger(PublicKeyChecker.class);
-
-  // https://tools.ietf.org/html/rfc4880#section-5.2.3.13
-  private static final int COMPLETE_TRUST = 120;
-
-  private PublicKeyStore store;
-  private Map<Long, Fingerprint> trusted;
-  private int maxTrustDepth;
-  private Date effectiveTime = new Date();
-
-  /**
-   * Enable web-of-trust checks.
-   *
-   * <p>If enabled, a store must be set with {@link #setStore(PublicKeyStore)}. (These methods are
-   * separate since the store is a closeable resource that may not be available when reading trusted
-   * keys from a config.)
-   *
-   * @param maxTrustDepth maximum depth to search while looking for a trusted key.
-   * @param trusted ultimately trusted key fingerprints, keyed by fingerprint; may not be empty. To
-   *     construct a map, see {@link Fingerprint#byId(Iterable)}.
-   * @return a reference to this object.
-   */
-  public PublicKeyChecker enableTrust(int maxTrustDepth, Map<Long, Fingerprint> trusted) {
-    if (maxTrustDepth <= 0) {
-      throw new IllegalArgumentException("maxTrustDepth must be positive, got: " + maxTrustDepth);
-    }
-    if (trusted == null || trusted.isEmpty()) {
-      throw new IllegalArgumentException("at least one trusted key is required");
-    }
-    this.maxTrustDepth = maxTrustDepth;
-    this.trusted = trusted;
-    return this;
-  }
-
-  /** Disable web-of-trust checks. */
-  public PublicKeyChecker disableTrust() {
-    trusted = null;
-    return this;
-  }
-
-  /** Set the public key store for reading keys referenced in signatures. */
-  public PublicKeyChecker setStore(PublicKeyStore store) {
-    if (store == null) {
-      throw new IllegalArgumentException("PublicKeyStore is required");
-    }
-    this.store = store;
-    return this;
-  }
-
-  /**
-   * Set the effective time for checking the key.
-   *
-   * <p>If set, check whether the key should be considered valid (e.g. unexpired) as of this time.
-   *
-   * @param effectiveTime effective time.
-   * @return a reference to this object.
-   */
-  public PublicKeyChecker setEffectiveTime(Date effectiveTime) {
-    this.effectiveTime = effectiveTime;
-    return this;
-  }
-
-  protected Date getEffectiveTime() {
-    return effectiveTime;
-  }
-
-  /**
-   * Check a public key.
-   *
-   * @param key the public key.
-   * @return the result of the check.
-   */
-  public final CheckResult check(PGPPublicKey key) {
-    if (store == null) {
-      throw new IllegalStateException("PublicKeyStore is required");
-    }
-    return check(key, 0, true, trusted != null ? new HashSet<Fingerprint>() : null);
-  }
-
-  /**
-   * Perform custom checks.
-   *
-   * <p>Default implementation reports no problems, but may be overridden by subclasses.
-   *
-   * @param key the public key.
-   * @param depth the depth from the initial key passed to {@link #check( PGPPublicKey)}: 0 if this
-   *     was the initial key, up to a maximum of {@code maxTrustDepth}.
-   * @return the result of the custom check.
-   */
-  public CheckResult checkCustom(PGPPublicKey key, int depth) {
-    return CheckResult.ok();
-  }
-
-  private CheckResult check(PGPPublicKey key, int depth, boolean expand, Set<Fingerprint> seen) {
-    CheckResult basicResult = checkBasic(key, effectiveTime);
-    CheckResult customResult = checkCustom(key, depth);
-    CheckResult trustResult = checkWebOfTrust(key, store, depth, seen);
-    if (!expand && !trustResult.isTrusted()) {
-      trustResult = CheckResult.create(trustResult.getStatus(), "Key is not trusted");
-    }
-
-    List<String> problems =
-        new ArrayList<>(
-            basicResult.getProblems().size()
-                + customResult.getProblems().size()
-                + trustResult.getProblems().size());
-    problems.addAll(basicResult.getProblems());
-    problems.addAll(customResult.getProblems());
-    problems.addAll(trustResult.getProblems());
-
-    Status status;
-    if (basicResult.getStatus() == BAD
-        || customResult.getStatus() == BAD
-        || trustResult.getStatus() == BAD) {
-      // Any BAD result and the final result is BAD.
-      status = BAD;
-    } else if (trustResult.getStatus() == TRUSTED) {
-      // basicResult is BAD or OK, whereas trustResult is BAD or TRUSTED. If
-      // TRUSTED, we trust the final result.
-      status = TRUSTED;
-    } else {
-      // All results were OK or better, but trustResult was not TRUSTED. Don't
-      // let subclasses bypass checkWebOfTrust by returning TRUSTED; just return
-      // OK here.
-      status = OK;
-    }
-    return CheckResult.create(status, problems);
-  }
-
-  private CheckResult checkBasic(PGPPublicKey key, Date now) {
-    List<String> problems = new ArrayList<>(2);
-    gatherRevocationProblems(key, now, problems);
-
-    long validMs = key.getValidSeconds() * 1000;
-    if (validMs != 0) {
-      long msSinceCreation = now.getTime() - key.getCreationTime().getTime();
-      if (msSinceCreation > validMs) {
-        problems.add("Key is expired");
-      }
-    }
-    return CheckResult.create(problems);
-  }
-
-  private void gatherRevocationProblems(PGPPublicKey key, Date now, List<String> problems) {
-    try {
-      List<PGPSignature> revocations = new ArrayList<>();
-      Map<Long, RevocationKey> revokers = new HashMap<>();
-      PGPSignature selfRevocation = scanRevocations(key, now, revocations, revokers);
-      if (selfRevocation != null) {
-        RevocationReason reason = getRevocationReason(selfRevocation);
-        if (isRevocationValid(selfRevocation, reason, now)) {
-          problems.add(reasonToString(reason));
-        }
-      } else {
-        checkRevocations(key, revocations, revokers, problems);
-      }
-    } catch (PGPException | IOException e) {
-      problems.add("Error checking key revocation");
-    }
-  }
-
-  private static boolean isRevocationValid(
-      PGPSignature revocation, RevocationReason reason, Date now) {
-    // RFC4880 states:
-    // "If a key has been revoked because of a compromise, all signatures
-    // created by that key are suspect. However, if it was merely superseded or
-    // retired, old signatures are still valid."
-    //
-    // Note that GnuPG does not implement this correctly, as it does not
-    // consider the revocation reason and timestamp when checking whether a
-    // signature (data or certification) is valid.
-    return reason.getRevocationReason() == KEY_COMPROMISED
-        || revocation.getCreationTime().before(now);
-  }
-
-  private PGPSignature scanRevocations(
-      PGPPublicKey key, Date now, List<PGPSignature> revocations, Map<Long, RevocationKey> revokers)
-      throws PGPException {
-    @SuppressWarnings("unchecked")
-    Iterator<PGPSignature> allSigs = key.getSignatures();
-    while (allSigs.hasNext()) {
-      PGPSignature sig = allSigs.next();
-      switch (sig.getSignatureType()) {
-        case KEY_REVOCATION:
-          if (sig.getKeyID() == key.getKeyID()) {
-            sig.init(new BcPGPContentVerifierBuilderProvider(), key);
-            if (sig.verifyCertification(key)) {
-              return sig;
-            }
-          } else {
-            RevocationReason reason = getRevocationReason(sig);
-            if (reason != null && isRevocationValid(sig, reason, now)) {
-              revocations.add(sig);
-            }
-          }
-          break;
-        case DIRECT_KEY:
-          RevocationKey r = getRevocationKey(key, sig);
-          if (r != null) {
-            revokers.put(Fingerprint.getId(r.getFingerprint()), r);
-          }
-          break;
-      }
-    }
-    return null;
-  }
-
-  private RevocationKey getRevocationKey(PGPPublicKey key, PGPSignature sig) throws PGPException {
-    if (sig.getKeyID() != key.getKeyID()) {
-      return null;
-    }
-    SignatureSubpacket sub = sig.getHashedSubPackets().getSubpacket(REVOCATION_KEY);
-    if (sub == null) {
-      return null;
-    }
-    sig.init(new BcPGPContentVerifierBuilderProvider(), key);
-    if (!sig.verifyCertification(key)) {
-      return null;
-    }
-
-    return new RevocationKey(sub.isCritical(), sub.isLongLength(), sub.getData());
-  }
-
-  private void checkRevocations(
-      PGPPublicKey key,
-      List<PGPSignature> revocations,
-      Map<Long, RevocationKey> revokers,
-      List<String> problems)
-      throws PGPException, IOException {
-    for (PGPSignature revocation : revocations) {
-      RevocationKey revoker = revokers.get(revocation.getKeyID());
-      if (revoker == null) {
-        continue; // Not a designated revoker.
-      }
-      byte[] rfp = revoker.getFingerprint();
-      PGPPublicKeyRing revokerKeyRing = store.get(rfp);
-      if (revokerKeyRing == null) {
-        // Revoker is authorized and there is a revocation signature by this
-        // revoker, but the key is not in the store so we can't verify the
-        // signature.
-        log.info(
-            "Key "
-                + Fingerprint.toString(key.getFingerprint())
-                + " is revoked by "
-                + Fingerprint.toString(rfp)
-                + ", which is not in the store. Assuming revocation is valid.");
-        problems.add(reasonToString(getRevocationReason(revocation)));
-        continue;
-      }
-      PGPPublicKey rk = revokerKeyRing.getPublicKey();
-      if (rk.getAlgorithm() != revoker.getAlgorithm()) {
-        continue;
-      }
-      if (!checkBasic(rk, revocation.getCreationTime()).isOk()) {
-        // Revoker's key was expired or revoked at time of revocation, so the
-        // revocation is invalid.
-        continue;
-      }
-      revocation.init(new BcPGPContentVerifierBuilderProvider(), rk);
-      if (revocation.verifyCertification(key)) {
-        problems.add(reasonToString(getRevocationReason(revocation)));
-      }
-    }
-  }
-
-  private static RevocationReason getRevocationReason(PGPSignature sig) {
-    if (sig.getSignatureType() != KEY_REVOCATION) {
-      throw new IllegalArgumentException(
-          "Expected KEY_REVOCATION signature, got " + sig.getSignatureType());
-    }
-    SignatureSubpacket sub = sig.getHashedSubPackets().getSubpacket(REVOCATION_REASON);
-    if (sub == null) {
-      return null;
-    }
-    return new RevocationReason(sub.isCritical(), sub.isLongLength(), sub.getData());
-  }
-
-  private static String reasonToString(RevocationReason reason) {
-    StringBuilder r = new StringBuilder("Key is revoked (");
-    if (reason == null) {
-      return r.append("no reason provided)").toString();
-    }
-    switch (reason.getRevocationReason()) {
-      case NO_REASON:
-        r.append("no reason code specified");
-        break;
-      case KEY_SUPERSEDED:
-        r.append("superseded");
-        break;
-      case KEY_COMPROMISED:
-        r.append("key material has been compromised");
-        break;
-      case KEY_RETIRED:
-        r.append("retired and no longer valid");
-        break;
-      default:
-        r.append("reason code ").append(Integer.toString(reason.getRevocationReason())).append(')');
-        break;
-    }
-    r.append(')');
-    String desc = reason.getRevocationDescription();
-    if (!desc.isEmpty()) {
-      r.append(": ").append(desc);
-    }
-    return r.toString();
-  }
-
-  private CheckResult checkWebOfTrust(
-      PGPPublicKey key, PublicKeyStore store, int depth, Set<Fingerprint> seen) {
-    if (trusted == null) {
-      // Trust checking not configured, server trusts all OK keys.
-      return CheckResult.trusted();
-    }
-    Fingerprint fp = new Fingerprint(key.getFingerprint());
-    if (seen.contains(fp)) {
-      return CheckResult.ok("Key is trusted in a cycle");
-    }
-    seen.add(fp);
-
-    Fingerprint trustedFp = trusted.get(key.getKeyID());
-    if (trustedFp != null && trustedFp.equals(fp)) {
-      return CheckResult.trusted(); // Directly trusted.
-    } else if (depth >= maxTrustDepth) {
-      return CheckResult.ok("No path of depth <= " + maxTrustDepth + " to a trusted key");
-    }
-
-    List<CheckResult> signerResults = new ArrayList<>();
-    Iterator<String> userIds = key.getUserIDs();
-    while (userIds.hasNext()) {
-      String userId = userIds.next();
-
-      // Don't check the timestamp of these certifications. This allows admins
-      // to correct untrusted keys by signing them with a trusted key, such that
-      // older signatures created by those keys retroactively appear valid.
-      Iterator<PGPSignature> sigs = key.getSignaturesForID(userId);
-
-      while (sigs.hasNext()) {
-        PGPSignature sig = sigs.next();
-        // TODO(dborowitz): Handle CERTIFICATION_REVOCATION.
-        if (sig.getSignatureType() != PGPSignature.DEFAULT_CERTIFICATION
-            && sig.getSignatureType() != PGPSignature.POSITIVE_CERTIFICATION) {
-          continue; // Not a certification.
-        }
-
-        PGPPublicKey signer = getSigner(store, sig, userId, key, signerResults);
-        // TODO(dborowitz): Require self certification.
-        if (signer == null || Arrays.equals(signer.getFingerprint(), key.getFingerprint())) {
-          continue;
-        }
-        String subpacketProblem = checkTrustSubpacket(sig, depth);
-        if (subpacketProblem == null) {
-          CheckResult signerResult = check(signer, depth + 1, false, seen);
-          if (signerResult.isTrusted()) {
-            return CheckResult.trusted();
-          }
-        }
-        signerResults.add(
-            CheckResult.ok(
-                "Certification by " + keyToString(signer) + " is valid, but key is not trusted"));
-      }
-    }
-
-    List<String> problems = new ArrayList<>();
-    problems.add("No path to a trusted key");
-    for (CheckResult signerResult : signerResults) {
-      problems.addAll(signerResult.getProblems());
-    }
-    return CheckResult.create(OK, problems);
-  }
-
-  private static PGPPublicKey getSigner(
-      PublicKeyStore store,
-      PGPSignature sig,
-      String userId,
-      PGPPublicKey key,
-      List<CheckResult> results) {
-    try {
-      PGPPublicKeyRingCollection signers = store.get(sig.getKeyID());
-      if (!signers.getKeyRings().hasNext()) {
-        results.add(
-            CheckResult.ok(
-                "Key "
-                    + keyIdToString(sig.getKeyID())
-                    + " used for certification is not in store"));
-        return null;
-      }
-      PGPPublicKey signer = PublicKeyStore.getSigner(signers, sig, userId, key);
-      if (signer == null) {
-        results.add(
-            CheckResult.ok("Certification by " + keyIdToString(sig.getKeyID()) + " is not valid"));
-        return null;
-      }
-      return signer;
-    } catch (PGPException | IOException e) {
-      results.add(
-          CheckResult.ok("Error checking certification by " + keyIdToString(sig.getKeyID())));
-      return null;
-    }
-  }
-
-  private String checkTrustSubpacket(PGPSignature sig, int depth) {
-    SignatureSubpacket trustSub =
-        sig.getHashedSubPackets().getSubpacket(SignatureSubpacketTags.TRUST_SIG);
-    if (trustSub == null || trustSub.getData().length != 2) {
-      return "Certification is missing trust information";
-    }
-    byte amount = trustSub.getData()[1];
-    if (amount < COMPLETE_TRUST) {
-      return "Certification does not fully trust key";
-    }
-    byte level = trustSub.getData()[0];
-    int required = depth + 1;
-    if (level < required) {
-      return "Certification trusts to depth " + level + ", but depth " + required + " is required";
-    }
-    return null;
-  }
-}
diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/PushCertificateChecker.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/PushCertificateChecker.java
deleted file mode 100644
index 95b89d0..0000000
--- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/PushCertificateChecker.java
+++ /dev/null
@@ -1,217 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.gpg;
-
-import static com.google.gerrit.extensions.common.GpgKeyInfo.Status.BAD;
-import static com.google.gerrit.extensions.common.GpgKeyInfo.Status.OK;
-import static com.google.gerrit.extensions.common.GpgKeyInfo.Status.TRUSTED;
-import static com.google.gerrit.gpg.PublicKeyStore.keyIdToString;
-import static com.google.gerrit.gpg.PublicKeyStore.keyToString;
-
-import com.google.common.base.Joiner;
-import com.google.gerrit.extensions.common.GpgKeyInfo.Status;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import org.bouncycastle.bcpg.ArmoredInputStream;
-import org.bouncycastle.openpgp.PGPException;
-import org.bouncycastle.openpgp.PGPObjectFactory;
-import org.bouncycastle.openpgp.PGPPublicKey;
-import org.bouncycastle.openpgp.PGPPublicKeyRingCollection;
-import org.bouncycastle.openpgp.PGPSignature;
-import org.bouncycastle.openpgp.PGPSignatureList;
-import org.bouncycastle.openpgp.bc.BcPGPObjectFactory;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.transport.PushCertificate;
-import org.eclipse.jgit.transport.PushCertificate.NonceStatus;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Checker for push certificates. */
-public abstract class PushCertificateChecker {
-  private static final Logger log = LoggerFactory.getLogger(PushCertificateChecker.class);
-
-  public static class Result {
-    private final PGPPublicKey key;
-    private final CheckResult checkResult;
-
-    private Result(PGPPublicKey key, CheckResult checkResult) {
-      this.key = key;
-      this.checkResult = checkResult;
-    }
-
-    public PGPPublicKey getPublicKey() {
-      return key;
-    }
-
-    public CheckResult getCheckResult() {
-      return checkResult;
-    }
-  }
-
-  private final PublicKeyChecker publicKeyChecker;
-
-  private boolean checkNonce;
-
-  protected PushCertificateChecker(PublicKeyChecker publicKeyChecker) {
-    this.publicKeyChecker = publicKeyChecker;
-    checkNonce = true;
-  }
-
-  /** Set whether to check the status of the nonce; defaults to true. */
-  public PushCertificateChecker setCheckNonce(boolean checkNonce) {
-    this.checkNonce = checkNonce;
-    return this;
-  }
-
-  /**
-   * Check a push certificate.
-   *
-   * @return result of the check.
-   */
-  public final Result check(PushCertificate cert) {
-    if (checkNonce && cert.getNonceStatus() != NonceStatus.OK) {
-      return new Result(null, CheckResult.bad("Invalid nonce"));
-    }
-    List<CheckResult> results = new ArrayList<>(2);
-    Result sigResult = null;
-    try {
-      PGPSignature sig = readSignature(cert);
-      if (sig != null) {
-        @SuppressWarnings("resource")
-        Repository repo = getRepository();
-        try (PublicKeyStore store = new PublicKeyStore(repo)) {
-          sigResult = checkSignature(sig, cert, store);
-          results.add(checkCustom(repo));
-        } finally {
-          if (shouldClose(repo)) {
-            repo.close();
-          }
-        }
-      } else {
-        results.add(CheckResult.bad("Invalid signature format"));
-      }
-    } catch (PGPException | IOException e) {
-      String msg = "Internal error checking push certificate";
-      log.error(msg, e);
-      results.add(CheckResult.bad(msg));
-    }
-
-    return combine(sigResult, results);
-  }
-
-  private static Result combine(Result sigResult, List<CheckResult> results) {
-    // Combine results:
-    //  - If any input result is BAD, the final result is bad.
-    //  - If sigResult is TRUSTED and no other result is BAD, the final result
-    //    is TRUSTED.
-    //  - Otherwise, the result is OK.
-    List<String> problems = new ArrayList<>();
-    boolean bad = false;
-    for (CheckResult result : results) {
-      problems.addAll(result.getProblems());
-      bad |= result.getStatus() == BAD;
-    }
-    Status status = bad ? BAD : OK;
-
-    PGPPublicKey key;
-    if (sigResult != null) {
-      key = sigResult.getPublicKey();
-      CheckResult cr = sigResult.getCheckResult();
-      problems.addAll(cr.getProblems());
-      if (cr.getStatus() == BAD) {
-        status = BAD;
-      } else if (!bad && cr.getStatus() == TRUSTED) {
-        status = TRUSTED;
-      }
-    } else {
-      key = null;
-    }
-    return new Result(key, CheckResult.create(status, problems));
-  }
-
-  /**
-   * Get the repository that this checker should operate on.
-   *
-   * <p>This method is called once per call to {@link #check(PushCertificate)}.
-   *
-   * @return the repository.
-   * @throws IOException if an error occurred reading the repository.
-   */
-  protected abstract Repository getRepository() throws IOException;
-
-  /**
-   * @param repo a repository previously returned by {@link #getRepository()}.
-   * @return whether this repository should be closed before returning from {@link
-   *     #check(PushCertificate)}.
-   */
-  protected abstract boolean shouldClose(Repository repo);
-
-  /**
-   * Perform custom checks.
-   *
-   * <p>Default implementation reports no problems, but may be overridden by subclasses.
-   *
-   * @param repo a repository previously returned by {@link #getRepository()}.
-   * @return the result of the custom check.
-   */
-  protected CheckResult checkCustom(Repository repo) {
-    return CheckResult.ok();
-  }
-
-  private PGPSignature readSignature(PushCertificate cert) throws IOException {
-    ArmoredInputStream in =
-        new ArmoredInputStream(new ByteArrayInputStream(Constants.encode(cert.getSignature())));
-    PGPObjectFactory factory = new BcPGPObjectFactory(in);
-    Object obj;
-    while ((obj = factory.nextObject()) != null) {
-      if (obj instanceof PGPSignatureList) {
-        PGPSignatureList sigs = (PGPSignatureList) obj;
-        if (!sigs.isEmpty()) {
-          return sigs.get(0);
-        }
-      }
-    }
-    return null;
-  }
-
-  private Result checkSignature(PGPSignature sig, PushCertificate cert, PublicKeyStore store)
-      throws PGPException, IOException {
-    PGPPublicKeyRingCollection keys = store.get(sig.getKeyID());
-    if (!keys.getKeyRings().hasNext()) {
-      return new Result(
-          null,
-          CheckResult.bad("No public keys found for key ID " + keyIdToString(sig.getKeyID())));
-    }
-    PGPPublicKey signer = PublicKeyStore.getSigner(keys, sig, Constants.encode(cert.toText()));
-    if (signer == null) {
-      return new Result(
-          null, CheckResult.bad("Signature by " + keyIdToString(sig.getKeyID()) + " is not valid"));
-    }
-    CheckResult result =
-        publicKeyChecker.setStore(store).setEffectiveTime(sig.getCreationTime()).check(signer);
-    if (!result.getProblems().isEmpty()) {
-      StringBuilder err =
-          new StringBuilder("Invalid public key ")
-              .append(keyToString(signer))
-              .append(":\n  ")
-              .append(Joiner.on("\n  ").join(result.getProblems()));
-      return new Result(signer, CheckResult.create(result.getStatus(), err.toString()));
-    }
-    return new Result(signer, result);
-  }
-}
diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/SignedPushModule.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/SignedPushModule.java
deleted file mode 100644
index c32e1df..0000000
--- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/SignedPushModule.java
+++ /dev/null
@@ -1,160 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.gpg;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.EnableSignedPush;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.ReceivePackInitializer;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.inject.AbstractModule;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.ProvisionException;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.security.NoSuchAlgorithmException;
-import java.security.SecureRandom;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.transport.PreReceiveHook;
-import org.eclipse.jgit.transport.PreReceiveHookChain;
-import org.eclipse.jgit.transport.ReceivePack;
-import org.eclipse.jgit.transport.SignedPushConfig;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-class SignedPushModule extends AbstractModule {
-  private static final Logger log = LoggerFactory.getLogger(SignedPushModule.class);
-
-  @Override
-  protected void configure() {
-    if (!BouncyCastleUtil.havePGP()) {
-      throw new ProvisionException("Bouncy Castle PGP not installed");
-    }
-    bind(PublicKeyStore.class).toProvider(StoreProvider.class);
-    DynamicSet.bind(binder(), ReceivePackInitializer.class).to(Initializer.class);
-  }
-
-  @Singleton
-  private static class Initializer implements ReceivePackInitializer {
-    private final SignedPushConfig signedPushConfig;
-    private final SignedPushPreReceiveHook hook;
-    private final ProjectCache projectCache;
-
-    @Inject
-    Initializer(
-        @GerritServerConfig Config cfg,
-        @EnableSignedPush boolean enableSignedPush,
-        SignedPushPreReceiveHook hook,
-        ProjectCache projectCache) {
-      this.hook = hook;
-      this.projectCache = projectCache;
-
-      if (enableSignedPush) {
-        String seed = cfg.getString("receive", null, "certNonceSeed");
-        if (Strings.isNullOrEmpty(seed)) {
-          seed = randomString(64);
-        }
-        signedPushConfig = new SignedPushConfig();
-        signedPushConfig.setCertNonceSeed(seed);
-        signedPushConfig.setCertNonceSlopLimit(
-            cfg.getInt("receive", null, "certNonceSlop", 5 * 60));
-      } else {
-        signedPushConfig = null;
-      }
-    }
-
-    @Override
-    public void init(Project.NameKey project, ReceivePack rp) {
-      ProjectState ps = projectCache.get(project);
-      if (!ps.isEnableSignedPush()) {
-        rp.setSignedPushConfig(null);
-        return;
-      } else if (signedPushConfig == null) {
-        log.error(
-            "receive.enableSignedPush is true for project {} but"
-                + " false in gerrit.config, so signed push verification is"
-                + " disabled",
-            project.get());
-        rp.setSignedPushConfig(null);
-        return;
-      }
-      rp.setSignedPushConfig(signedPushConfig);
-
-      List<PreReceiveHook> hooks = new ArrayList<>(3);
-      if (ps.isRequireSignedPush()) {
-        hooks.add(SignedPushPreReceiveHook.Required.INSTANCE);
-      }
-      hooks.add(hook);
-      hooks.add(rp.getPreReceiveHook());
-      rp.setPreReceiveHook(PreReceiveHookChain.newChain(hooks));
-    }
-  }
-
-  @Singleton
-  private static class StoreProvider implements Provider<PublicKeyStore> {
-    private final GitRepositoryManager repoManager;
-    private final AllUsersName allUsers;
-
-    @Inject
-    StoreProvider(GitRepositoryManager repoManager, AllUsersName allUsers) {
-      this.repoManager = repoManager;
-      this.allUsers = allUsers;
-    }
-
-    @Override
-    public PublicKeyStore get() {
-      final Repository repo;
-      try {
-        repo = repoManager.openRepository(allUsers);
-      } catch (IOException e) {
-        throw new ProvisionException("Cannot open " + allUsers, e);
-      }
-      return new PublicKeyStore(repo) {
-        @Override
-        public void close() {
-          try {
-            super.close();
-          } finally {
-            repo.close();
-          }
-        }
-      };
-    }
-  }
-
-  private static String randomString(int len) {
-    Random random;
-    try {
-      random = SecureRandom.getInstance("SHA1PRNG");
-    } catch (NoSuchAlgorithmException e) {
-      throw new IllegalStateException(e);
-    }
-    StringBuilder sb = new StringBuilder(len);
-    for (int i = 0; i < len; i++) {
-      sb.append((char) random.nextInt());
-    }
-    return sb.toString();
-  }
-}
diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/api/GpgApiAdapterImpl.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/api/GpgApiAdapterImpl.java
deleted file mode 100644
index 49c7f67..0000000
--- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/api/GpgApiAdapterImpl.java
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.gpg.api;
-
-import com.google.gerrit.extensions.api.accounts.GpgKeyApi;
-import com.google.gerrit.extensions.common.GpgKeyInfo;
-import com.google.gerrit.extensions.common.PushCertificateInfo;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.gpg.GerritPushCertificateChecker;
-import com.google.gerrit.gpg.PushCertificateChecker;
-import com.google.gerrit.gpg.server.GpgKeys;
-import com.google.gerrit.gpg.server.PostGpgKeys;
-import com.google.gerrit.server.GpgException;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountResource;
-import com.google.gerrit.server.api.accounts.GpgApiAdapter;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-import org.bouncycastle.openpgp.PGPException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.transport.PushCertificate;
-import org.eclipse.jgit.transport.PushCertificateParser;
-
-public class GpgApiAdapterImpl implements GpgApiAdapter {
-  private final Provider<PostGpgKeys> postGpgKeys;
-  private final Provider<GpgKeys> gpgKeys;
-  private final GpgKeyApiImpl.Factory gpgKeyApiFactory;
-  private final GerritPushCertificateChecker.Factory pushCertCheckerFactory;
-
-  @Inject
-  GpgApiAdapterImpl(
-      Provider<PostGpgKeys> postGpgKeys,
-      Provider<GpgKeys> gpgKeys,
-      GpgKeyApiImpl.Factory gpgKeyApiFactory,
-      GerritPushCertificateChecker.Factory pushCertCheckerFactory) {
-    this.postGpgKeys = postGpgKeys;
-    this.gpgKeys = gpgKeys;
-    this.gpgKeyApiFactory = gpgKeyApiFactory;
-    this.pushCertCheckerFactory = pushCertCheckerFactory;
-  }
-
-  @Override
-  public boolean isEnabled() {
-    return true;
-  }
-
-  @Override
-  public Map<String, GpgKeyInfo> listGpgKeys(AccountResource account)
-      throws RestApiException, GpgException {
-    try {
-      return gpgKeys.get().list().apply(account);
-    } catch (OrmException | PGPException | IOException e) {
-      throw new GpgException(e);
-    }
-  }
-
-  @Override
-  public Map<String, GpgKeyInfo> putGpgKeys(
-      AccountResource account, List<String> add, List<String> delete)
-      throws RestApiException, GpgException {
-    PostGpgKeys.Input in = new PostGpgKeys.Input();
-    in.add = add;
-    in.delete = delete;
-    try {
-      return postGpgKeys.get().apply(account, in);
-    } catch (PGPException | OrmException | IOException | ConfigInvalidException e) {
-      throw new GpgException(e);
-    }
-  }
-
-  @Override
-  public GpgKeyApi gpgKey(AccountResource account, IdString idStr)
-      throws RestApiException, GpgException {
-    try {
-      return gpgKeyApiFactory.create(gpgKeys.get().parse(account, idStr));
-    } catch (PGPException | OrmException | IOException e) {
-      throw new GpgException(e);
-    }
-  }
-
-  @Override
-  public PushCertificateInfo checkPushCertificate(String certStr, IdentifiedUser expectedUser)
-      throws GpgException {
-    try {
-      PushCertificate cert = PushCertificateParser.fromString(certStr);
-      PushCertificateChecker.Result result =
-          pushCertCheckerFactory.create(expectedUser).setCheckNonce(false).check(cert);
-      PushCertificateInfo info = new PushCertificateInfo();
-      info.certificate = certStr;
-      info.key = GpgKeys.toJson(result.getPublicKey(), result.getCheckResult());
-      return info;
-    } catch (IOException e) {
-      throw new GpgException(e);
-    }
-  }
-}
diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/api/GpgApiModule.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/api/GpgApiModule.java
deleted file mode 100644
index f7102d8..0000000
--- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/api/GpgApiModule.java
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.gpg.api;
-
-import static com.google.gerrit.gpg.server.GpgKey.GPG_KEY_KIND;
-import static com.google.gerrit.server.account.AccountResource.ACCOUNT_KIND;
-
-import com.google.gerrit.extensions.api.accounts.GpgKeyApi;
-import com.google.gerrit.extensions.common.GpgKeyInfo;
-import com.google.gerrit.extensions.common.PushCertificateInfo;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.NotImplementedException;
-import com.google.gerrit.extensions.restapi.RestApiModule;
-import com.google.gerrit.gpg.server.DeleteGpgKey;
-import com.google.gerrit.gpg.server.GpgKeys;
-import com.google.gerrit.gpg.server.PostGpgKeys;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountResource;
-import com.google.gerrit.server.api.accounts.GpgApiAdapter;
-import java.util.List;
-import java.util.Map;
-
-public class GpgApiModule extends RestApiModule {
-  private final boolean enabled;
-
-  public GpgApiModule(boolean enabled) {
-    this.enabled = enabled;
-  }
-
-  @Override
-  protected void configure() {
-    if (!enabled) {
-      bind(GpgApiAdapter.class).to(NoGpgApi.class);
-      return;
-    }
-    bind(GpgApiAdapter.class).to(GpgApiAdapterImpl.class);
-    factory(GpgKeyApiImpl.Factory.class);
-
-    DynamicMap.mapOf(binder(), GPG_KEY_KIND);
-
-    child(ACCOUNT_KIND, "gpgkeys").to(GpgKeys.class);
-    post(ACCOUNT_KIND, "gpgkeys").to(PostGpgKeys.class);
-    get(GPG_KEY_KIND).to(GpgKeys.Get.class);
-    delete(GPG_KEY_KIND).to(DeleteGpgKey.class);
-  }
-
-  private static class NoGpgApi implements GpgApiAdapter {
-    private static final String MSG = "GPG key APIs disabled";
-
-    @Override
-    public boolean isEnabled() {
-      return false;
-    }
-
-    @Override
-    public Map<String, GpgKeyInfo> listGpgKeys(AccountResource account) {
-      throw new NotImplementedException(MSG);
-    }
-
-    @Override
-    public Map<String, GpgKeyInfo> putGpgKeys(
-        AccountResource account, List<String> add, List<String> delete) {
-      throw new NotImplementedException(MSG);
-    }
-
-    @Override
-    public GpgKeyApi gpgKey(AccountResource account, IdString idStr) {
-      throw new NotImplementedException(MSG);
-    }
-
-    @Override
-    public PushCertificateInfo checkPushCertificate(String certStr, IdentifiedUser expectedUser) {
-      throw new NotImplementedException(MSG);
-    }
-  }
-}
diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/api/GpgKeyApiImpl.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/api/GpgKeyApiImpl.java
deleted file mode 100644
index 14a4c6d..0000000
--- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/api/GpgKeyApiImpl.java
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.gpg.api;
-
-import com.google.gerrit.extensions.api.accounts.GpgKeyApi;
-import com.google.gerrit.extensions.common.GpgKeyInfo;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.gpg.server.DeleteGpgKey;
-import com.google.gerrit.gpg.server.GpgKey;
-import com.google.gerrit.gpg.server.GpgKeys;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import org.bouncycastle.openpgp.PGPException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-public class GpgKeyApiImpl implements GpgKeyApi {
-  public interface Factory {
-    GpgKeyApiImpl create(GpgKey rsrc);
-  }
-
-  private final GpgKeys.Get get;
-  private final DeleteGpgKey delete;
-  private final GpgKey rsrc;
-
-  @Inject
-  GpgKeyApiImpl(GpgKeys.Get get, DeleteGpgKey delete, @Assisted GpgKey rsrc) {
-    this.get = get;
-    this.delete = delete;
-    this.rsrc = rsrc;
-  }
-
-  @Override
-  public GpgKeyInfo get() throws RestApiException {
-    try {
-      return get.apply(rsrc);
-    } catch (IOException e) {
-      throw new RestApiException("Cannot get GPG key", e);
-    }
-  }
-
-  @Override
-  public void delete() throws RestApiException {
-    try {
-      delete.apply(rsrc, new DeleteGpgKey.Input());
-    } catch (PGPException | OrmException | IOException | ConfigInvalidException e) {
-      throw new RestApiException("Cannot delete GPG key", e);
-    }
-  }
-}
diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/DeleteGpgKey.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/DeleteGpgKey.java
deleted file mode 100644
index baf5a58..0000000
--- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/DeleteGpgKey.java
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.gpg.server;
-
-import static com.google.gerrit.gpg.PublicKeyStore.keyIdToString;
-import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_GPGKEY;
-
-import com.google.common.io.BaseEncoding;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.gpg.PublicKeyStore;
-import com.google.gerrit.gpg.server.DeleteGpgKey.Input;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.account.externalids.ExternalIdsUpdate;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import org.bouncycastle.openpgp.PGPException;
-import org.bouncycastle.openpgp.PGPPublicKey;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.RefUpdate;
-
-public class DeleteGpgKey implements RestModifyView<GpgKey, Input> {
-  public static class Input {}
-
-  private final Provider<PersonIdent> serverIdent;
-  private final Provider<PublicKeyStore> storeProvider;
-  private final ExternalIdsUpdate.User externalIdsUpdateFactory;
-
-  @Inject
-  DeleteGpgKey(
-      @GerritPersonIdent Provider<PersonIdent> serverIdent,
-      Provider<PublicKeyStore> storeProvider,
-      ExternalIdsUpdate.User externalIdsUpdateFactory) {
-    this.serverIdent = serverIdent;
-    this.storeProvider = storeProvider;
-    this.externalIdsUpdateFactory = externalIdsUpdateFactory;
-  }
-
-  @Override
-  public Response<?> apply(GpgKey rsrc, Input input)
-      throws ResourceConflictException, PGPException, OrmException, IOException,
-          ConfigInvalidException {
-    PGPPublicKey key = rsrc.getKeyRing().getPublicKey();
-    externalIdsUpdateFactory
-        .create()
-        .delete(
-            rsrc.getUser().getAccountId(),
-            ExternalId.Key.create(
-                SCHEME_GPGKEY, BaseEncoding.base16().encode(key.getFingerprint())));
-
-    try (PublicKeyStore store = storeProvider.get()) {
-      store.remove(rsrc.getKeyRing().getPublicKey().getFingerprint());
-
-      CommitBuilder cb = new CommitBuilder();
-      PersonIdent committer = serverIdent.get();
-      cb.setAuthor(rsrc.getUser().newCommitterIdent(committer.getWhen(), committer.getTimeZone()));
-      cb.setCommitter(committer);
-      cb.setMessage("Delete public key " + keyIdToString(key.getKeyID()));
-
-      RefUpdate.Result saveResult = store.save(cb);
-      switch (saveResult) {
-        case NO_CHANGE:
-        case FAST_FORWARD:
-          break;
-        case FORCED:
-        case IO_FAILURE:
-        case LOCK_FAILURE:
-        case NEW:
-        case NOT_ATTEMPTED:
-        case REJECTED:
-        case REJECTED_CURRENT_BRANCH:
-        case RENAMED:
-        case REJECTED_MISSING_OBJECT:
-        case REJECTED_OTHER_REASON:
-        default:
-          throw new ResourceConflictException("Failed to delete public key: " + saveResult);
-      }
-    }
-    return Response.none();
-  }
-}
diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/GpgKeys.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/GpgKeys.java
deleted file mode 100644
index 6dd3c7e..0000000
--- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/GpgKeys.java
+++ /dev/null
@@ -1,252 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.gpg.server;
-
-import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_GPGKEY;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.base.CharMatcher;
-import com.google.common.collect.ImmutableList;
-import com.google.common.io.BaseEncoding;
-import com.google.gerrit.extensions.common.GpgKeyInfo;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ChildCollection;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.gpg.BouncyCastleUtil;
-import com.google.gerrit.gpg.CheckResult;
-import com.google.gerrit.gpg.Fingerprint;
-import com.google.gerrit.gpg.GerritPublicKeyChecker;
-import com.google.gerrit.gpg.PublicKeyChecker;
-import com.google.gerrit.gpg.PublicKeyStore;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.account.AccountResource;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.account.externalids.ExternalIds;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import org.bouncycastle.bcpg.ArmoredOutputStream;
-import org.bouncycastle.openpgp.PGPException;
-import org.bouncycastle.openpgp.PGPPublicKey;
-import org.bouncycastle.openpgp.PGPPublicKeyRing;
-import org.eclipse.jgit.util.NB;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class GpgKeys implements ChildCollection<AccountResource, GpgKey> {
-  private static final Logger log = LoggerFactory.getLogger(GpgKeys.class);
-
-  public static final String MIME_TYPE = "application/pgp-keys";
-
-  private final DynamicMap<RestView<GpgKey>> views;
-  private final Provider<CurrentUser> self;
-  private final Provider<PublicKeyStore> storeProvider;
-  private final GerritPublicKeyChecker.Factory checkerFactory;
-  private final ExternalIds externalIds;
-
-  @Inject
-  GpgKeys(
-      DynamicMap<RestView<GpgKey>> views,
-      Provider<CurrentUser> self,
-      Provider<PublicKeyStore> storeProvider,
-      GerritPublicKeyChecker.Factory checkerFactory,
-      ExternalIds externalIds) {
-    this.views = views;
-    this.self = self;
-    this.storeProvider = storeProvider;
-    this.checkerFactory = checkerFactory;
-    this.externalIds = externalIds;
-  }
-
-  @Override
-  public ListGpgKeys list() throws ResourceNotFoundException, AuthException {
-    return new ListGpgKeys();
-  }
-
-  @Override
-  public GpgKey parse(AccountResource parent, IdString id)
-      throws ResourceNotFoundException, PGPException, OrmException, IOException {
-    checkVisible(self, parent);
-    String str = CharMatcher.whitespace().removeFrom(id.get()).toUpperCase();
-    if ((str.length() != 8 && str.length() != 40)
-        || !CharMatcher.anyOf("0123456789ABCDEF").matchesAllOf(str)) {
-      throw new ResourceNotFoundException(id);
-    }
-
-    byte[] fp = parseFingerprint(id.get(), getGpgExtIds(parent));
-    try (PublicKeyStore store = storeProvider.get()) {
-      long keyId = keyId(fp);
-      for (PGPPublicKeyRing keyRing : store.get(keyId)) {
-        PGPPublicKey key = keyRing.getPublicKey();
-        if (Arrays.equals(key.getFingerprint(), fp)) {
-          return new GpgKey(parent.getUser(), keyRing);
-        }
-      }
-    }
-
-    throw new ResourceNotFoundException(id);
-  }
-
-  static byte[] parseFingerprint(String str, Iterable<ExternalId> existingExtIds)
-      throws ResourceNotFoundException {
-    str = CharMatcher.whitespace().removeFrom(str).toUpperCase();
-    if ((str.length() != 8 && str.length() != 40)
-        || !CharMatcher.anyOf("0123456789ABCDEF").matchesAllOf(str)) {
-      throw new ResourceNotFoundException(str);
-    }
-    byte[] fp = null;
-    for (ExternalId extId : existingExtIds) {
-      String fpStr = extId.key().id();
-      if (!fpStr.endsWith(str)) {
-        continue;
-      } else if (fp != null) {
-        throw new ResourceNotFoundException("Multiple keys found for " + str);
-      }
-      fp = BaseEncoding.base16().decode(fpStr);
-      if (str.length() == 40) {
-        break;
-      }
-    }
-    if (fp == null) {
-      throw new ResourceNotFoundException(str);
-    }
-    return fp;
-  }
-
-  @Override
-  public DynamicMap<RestView<GpgKey>> views() {
-    return views;
-  }
-
-  public class ListGpgKeys implements RestReadView<AccountResource> {
-    @Override
-    public Map<String, GpgKeyInfo> apply(AccountResource rsrc)
-        throws OrmException, PGPException, IOException, ResourceNotFoundException {
-      checkVisible(self, rsrc);
-      Map<String, GpgKeyInfo> keys = new HashMap<>();
-      try (PublicKeyStore store = storeProvider.get()) {
-        for (ExternalId extId : getGpgExtIds(rsrc)) {
-          String fpStr = extId.key().id();
-          byte[] fp = BaseEncoding.base16().decode(fpStr);
-          boolean found = false;
-          for (PGPPublicKeyRing keyRing : store.get(keyId(fp))) {
-            if (Arrays.equals(keyRing.getPublicKey().getFingerprint(), fp)) {
-              found = true;
-              GpgKeyInfo info =
-                  toJson(
-                      keyRing.getPublicKey(), checkerFactory.create(rsrc.getUser(), store), store);
-              keys.put(info.id, info);
-              info.id = null;
-              break;
-            }
-          }
-          if (!found) {
-            log.warn("No public key stored for fingerprint {}", Fingerprint.toString(fp));
-          }
-        }
-      }
-      return keys;
-    }
-  }
-
-  @Singleton
-  public static class Get implements RestReadView<GpgKey> {
-    private final Provider<PublicKeyStore> storeProvider;
-    private final GerritPublicKeyChecker.Factory checkerFactory;
-
-    @Inject
-    Get(Provider<PublicKeyStore> storeProvider, GerritPublicKeyChecker.Factory checkerFactory) {
-      this.storeProvider = storeProvider;
-      this.checkerFactory = checkerFactory;
-    }
-
-    @Override
-    public GpgKeyInfo apply(GpgKey rsrc) throws IOException {
-      try (PublicKeyStore store = storeProvider.get()) {
-        return toJson(
-            rsrc.getKeyRing().getPublicKey(),
-            checkerFactory.create().setExpectedUser(rsrc.getUser()),
-            store);
-      }
-    }
-  }
-
-  private Iterable<ExternalId> getGpgExtIds(AccountResource rsrc) throws IOException {
-    return externalIds.byAccount(rsrc.getUser().getAccountId(), SCHEME_GPGKEY);
-  }
-
-  private static long keyId(byte[] fp) {
-    return NB.decodeInt64(fp, fp.length - 8);
-  }
-
-  static void checkVisible(Provider<CurrentUser> self, AccountResource rsrc)
-      throws ResourceNotFoundException {
-    if (!BouncyCastleUtil.havePGP()) {
-      throw new ResourceNotFoundException("GPG not enabled");
-    }
-    if (!self.get().hasSameAccountId(rsrc.getUser())) {
-      throw new ResourceNotFoundException();
-    }
-  }
-
-  public static GpgKeyInfo toJson(PGPPublicKey key, CheckResult checkResult) throws IOException {
-    GpgKeyInfo info = new GpgKeyInfo();
-
-    if (key != null) {
-      info.id = PublicKeyStore.keyIdToString(key.getKeyID());
-      info.fingerprint = Fingerprint.toString(key.getFingerprint());
-      Iterator<String> userIds = key.getUserIDs();
-      info.userIds = ImmutableList.copyOf(userIds);
-
-      try (ByteArrayOutputStream out = new ByteArrayOutputStream(4096)) {
-        try (ArmoredOutputStream aout = new ArmoredOutputStream(out)) {
-          // This is not exactly the key stored in the store, but is equivalent. In
-          // particular, it will have a Bouncy Castle version string. The armored
-          // stream reader in PublicKeyStore doesn't give us an easy way to extract
-          // the original ASCII armor.
-          key.encode(aout);
-        }
-        info.key = new String(out.toByteArray(), UTF_8);
-      }
-    }
-
-    info.status = checkResult.getStatus();
-    info.problems = checkResult.getProblems();
-
-    return info;
-  }
-
-  static GpgKeyInfo toJson(PGPPublicKey key, PublicKeyChecker checker, PublicKeyStore store)
-      throws IOException {
-    return toJson(key, checker.setStore(store).check(key));
-  }
-
-  public static void toJson(GpgKeyInfo info, CheckResult checkResult) {
-    info.status = checkResult.getStatus();
-    info.problems = checkResult.getProblems();
-  }
-}
diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/PostGpgKeys.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/PostGpgKeys.java
deleted file mode 100644
index 39e789a..0000000
--- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/PostGpgKeys.java
+++ /dev/null
@@ -1,296 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.gpg.server;
-
-import static com.google.gerrit.gpg.PublicKeyStore.keyIdToString;
-import static com.google.gerrit.gpg.PublicKeyStore.keyToString;
-import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_GPGKEY;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.base.Joiner;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import com.google.common.io.BaseEncoding;
-import com.google.gerrit.common.errors.EmailException;
-import com.google.gerrit.extensions.common.GpgKeyInfo;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.gpg.CheckResult;
-import com.google.gerrit.gpg.Fingerprint;
-import com.google.gerrit.gpg.GerritPublicKeyChecker;
-import com.google.gerrit.gpg.PublicKeyChecker;
-import com.google.gerrit.gpg.PublicKeyStore;
-import com.google.gerrit.gpg.server.PostGpgKeys.Input;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountResource;
-import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.account.externalids.ExternalIds;
-import com.google.gerrit.server.account.externalids.ExternalIdsUpdate;
-import com.google.gerrit.server.mail.send.AddKeySender;
-import com.google.gerrit.server.query.account.InternalAccountQuery;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.bouncycastle.bcpg.ArmoredInputStream;
-import org.bouncycastle.openpgp.PGPException;
-import org.bouncycastle.openpgp.PGPPublicKey;
-import org.bouncycastle.openpgp.PGPPublicKeyRing;
-import org.bouncycastle.openpgp.PGPRuntimeOperationException;
-import org.bouncycastle.openpgp.bc.BcPGPObjectFactory;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class PostGpgKeys implements RestModifyView<AccountResource, Input> {
-  public static class Input {
-    public List<String> add;
-    public List<String> delete;
-  }
-
-  private final Logger log = LoggerFactory.getLogger(getClass());
-  private final Provider<PersonIdent> serverIdent;
-  private final Provider<CurrentUser> self;
-  private final Provider<PublicKeyStore> storeProvider;
-  private final GerritPublicKeyChecker.Factory checkerFactory;
-  private final AddKeySender.Factory addKeyFactory;
-  private final Provider<InternalAccountQuery> accountQueryProvider;
-  private final ExternalIds externalIds;
-  private final ExternalIdsUpdate.User externalIdsUpdateFactory;
-
-  @Inject
-  PostGpgKeys(
-      @GerritPersonIdent Provider<PersonIdent> serverIdent,
-      Provider<CurrentUser> self,
-      Provider<PublicKeyStore> storeProvider,
-      GerritPublicKeyChecker.Factory checkerFactory,
-      AddKeySender.Factory addKeyFactory,
-      Provider<InternalAccountQuery> accountQueryProvider,
-      ExternalIds externalIds,
-      ExternalIdsUpdate.User externalIdsUpdateFactory) {
-    this.serverIdent = serverIdent;
-    this.self = self;
-    this.storeProvider = storeProvider;
-    this.checkerFactory = checkerFactory;
-    this.addKeyFactory = addKeyFactory;
-    this.accountQueryProvider = accountQueryProvider;
-    this.externalIds = externalIds;
-    this.externalIdsUpdateFactory = externalIdsUpdateFactory;
-  }
-
-  @Override
-  public Map<String, GpgKeyInfo> apply(AccountResource rsrc, Input input)
-      throws ResourceNotFoundException, BadRequestException, ResourceConflictException,
-          PGPException, OrmException, IOException, ConfigInvalidException {
-    GpgKeys.checkVisible(self, rsrc);
-
-    Collection<ExternalId> existingExtIds =
-        externalIds.byAccount(rsrc.getUser().getAccountId(), SCHEME_GPGKEY);
-    try (PublicKeyStore store = storeProvider.get()) {
-      Set<Fingerprint> toRemove = readKeysToRemove(input, existingExtIds);
-      List<PGPPublicKeyRing> newKeys = readKeysToAdd(input, toRemove);
-      List<ExternalId> newExtIds = new ArrayList<>(existingExtIds.size());
-
-      for (PGPPublicKeyRing keyRing : newKeys) {
-        PGPPublicKey key = keyRing.getPublicKey();
-        ExternalId.Key extIdKey = toExtIdKey(key.getFingerprint());
-        Account account = getAccountByExternalId(extIdKey);
-        if (account != null) {
-          if (!account.getId().equals(rsrc.getUser().getAccountId())) {
-            throw new ResourceConflictException("GPG key already associated with another account");
-          }
-        } else {
-          newExtIds.add(ExternalId.create(extIdKey, rsrc.getUser().getAccountId()));
-        }
-      }
-
-      storeKeys(rsrc, newKeys, toRemove);
-
-      List<ExternalId.Key> extIdKeysToRemove =
-          toRemove.stream().map(fp -> toExtIdKey(fp.get())).collect(toList());
-      externalIdsUpdateFactory
-          .create()
-          .replace(rsrc.getUser().getAccountId(), extIdKeysToRemove, newExtIds);
-      return toJson(newKeys, toRemove, store, rsrc.getUser());
-    }
-  }
-
-  private Set<Fingerprint> readKeysToRemove(Input input, Collection<ExternalId> existingExtIds) {
-    if (input.delete == null || input.delete.isEmpty()) {
-      return ImmutableSet.of();
-    }
-    Set<Fingerprint> fingerprints = Sets.newHashSetWithExpectedSize(input.delete.size());
-    for (String id : input.delete) {
-      try {
-        fingerprints.add(new Fingerprint(GpgKeys.parseFingerprint(id, existingExtIds)));
-      } catch (ResourceNotFoundException e) {
-        // Skip removal.
-      }
-    }
-    return fingerprints;
-  }
-
-  private List<PGPPublicKeyRing> readKeysToAdd(Input input, Set<Fingerprint> toRemove)
-      throws BadRequestException, IOException {
-    if (input.add == null || input.add.isEmpty()) {
-      return ImmutableList.of();
-    }
-    List<PGPPublicKeyRing> keyRings = new ArrayList<>(input.add.size());
-    for (String armored : input.add) {
-      try (InputStream in = new ByteArrayInputStream(armored.getBytes(UTF_8));
-          ArmoredInputStream ain = new ArmoredInputStream(in)) {
-        @SuppressWarnings("unchecked")
-        List<Object> objs = Lists.newArrayList(new BcPGPObjectFactory(ain));
-        if (objs.size() != 1 || !(objs.get(0) instanceof PGPPublicKeyRing)) {
-          throw new BadRequestException("Expected exactly one PUBLIC KEY BLOCK");
-        }
-        PGPPublicKeyRing keyRing = (PGPPublicKeyRing) objs.get(0);
-        if (toRemove.contains(new Fingerprint(keyRing.getPublicKey().getFingerprint()))) {
-          throw new BadRequestException(
-              "Cannot both add and delete key: " + keyToString(keyRing.getPublicKey()));
-        }
-        keyRings.add(keyRing);
-      } catch (PGPRuntimeOperationException e) {
-        throw new BadRequestException("Failed to parse GPG keys", e);
-      }
-    }
-    return keyRings;
-  }
-
-  private void storeKeys(
-      AccountResource rsrc, List<PGPPublicKeyRing> keyRings, Set<Fingerprint> toRemove)
-      throws BadRequestException, ResourceConflictException, PGPException, IOException {
-    try (PublicKeyStore store = storeProvider.get()) {
-      List<String> addedKeys = new ArrayList<>();
-      for (PGPPublicKeyRing keyRing : keyRings) {
-        PGPPublicKey key = keyRing.getPublicKey();
-        // Don't check web of trust; admins can fill in certifications later.
-        CheckResult result = checkerFactory.create(rsrc.getUser(), store).disableTrust().check(key);
-        if (!result.isOk()) {
-          throw new BadRequestException(
-              String.format(
-                  "Problems with public key %s:\n%s",
-                  keyToString(key), Joiner.on('\n').join(result.getProblems())));
-        }
-        addedKeys.add(PublicKeyStore.keyToString(key));
-        store.add(keyRing);
-      }
-      for (Fingerprint fp : toRemove) {
-        store.remove(fp.get());
-      }
-      CommitBuilder cb = new CommitBuilder();
-      PersonIdent committer = serverIdent.get();
-      cb.setAuthor(rsrc.getUser().newCommitterIdent(committer.getWhen(), committer.getTimeZone()));
-      cb.setCommitter(committer);
-
-      RefUpdate.Result saveResult = store.save(cb);
-      switch (saveResult) {
-        case NEW:
-        case FAST_FORWARD:
-        case FORCED:
-          try {
-            addKeyFactory.create(rsrc.getUser(), addedKeys).send();
-          } catch (EmailException e) {
-            log.error(
-                "Cannot send GPG key added message to "
-                    + rsrc.getUser().getAccount().getPreferredEmail(),
-                e);
-          }
-          break;
-        case NO_CHANGE:
-          break;
-        case IO_FAILURE:
-        case LOCK_FAILURE:
-        case NOT_ATTEMPTED:
-        case REJECTED:
-        case REJECTED_CURRENT_BRANCH:
-        case RENAMED:
-        case REJECTED_MISSING_OBJECT:
-        case REJECTED_OTHER_REASON:
-        default:
-          // TODO(dborowitz): Backoff and retry on LOCK_FAILURE.
-          throw new ResourceConflictException("Failed to save public keys: " + saveResult);
-      }
-    }
-  }
-
-  private ExternalId.Key toExtIdKey(byte[] fp) {
-    return ExternalId.Key.create(SCHEME_GPGKEY, BaseEncoding.base16().encode(fp));
-  }
-
-  private Account getAccountByExternalId(ExternalId.Key extIdKey) throws OrmException {
-    List<AccountState> accountStates = accountQueryProvider.get().byExternalId(extIdKey);
-
-    if (accountStates.isEmpty()) {
-      return null;
-    }
-
-    if (accountStates.size() > 1) {
-      StringBuilder msg = new StringBuilder();
-      msg.append("GPG key ")
-          .append(extIdKey.get())
-          .append(" associated with multiple accounts: ")
-          .append(Lists.transform(accountStates, AccountState.ACCOUNT_ID_FUNCTION));
-      throw new IllegalStateException(msg.toString());
-    }
-
-    return accountStates.get(0).getAccount();
-  }
-
-  private Map<String, GpgKeyInfo> toJson(
-      Collection<PGPPublicKeyRing> keys,
-      Set<Fingerprint> deleted,
-      PublicKeyStore store,
-      IdentifiedUser user)
-      throws IOException {
-    // Unlike when storing keys, include web-of-trust checks when producing
-    // result JSON, so the user at least knows of any issues.
-    PublicKeyChecker checker = checkerFactory.create(user, store);
-    Map<String, GpgKeyInfo> infos = Maps.newHashMapWithExpectedSize(keys.size() + deleted.size());
-    for (PGPPublicKeyRing keyRing : keys) {
-      PGPPublicKey key = keyRing.getPublicKey();
-      CheckResult result = checker.check(key);
-      GpgKeyInfo info = GpgKeys.toJson(key, result);
-      infos.put(info.id, info);
-      info.id = null;
-    }
-    for (Fingerprint fp : deleted) {
-      infos.put(keyIdToString(fp.getId()), new GpgKeyInfo());
-    }
-    return infos;
-  }
-}
diff --git a/gerrit-gpg/src/test/java/com/google/gerrit/gpg/GerritPublicKeyCheckerTest.java b/gerrit-gpg/src/test/java/com/google/gerrit/gpg/GerritPublicKeyCheckerTest.java
deleted file mode 100644
index 07a4fe3..0000000
--- a/gerrit-gpg/src/test/java/com/google/gerrit/gpg/GerritPublicKeyCheckerTest.java
+++ /dev/null
@@ -1,433 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.gpg;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.gpg.GerritPublicKeyChecker.toExtIdKey;
-import static com.google.gerrit.gpg.PublicKeyStore.keyToString;
-import static com.google.gerrit.gpg.testutil.TestKeys.validKeyWithSecondUserId;
-import static com.google.gerrit.gpg.testutil.TestTrustKeys.keyA;
-import static com.google.gerrit.gpg.testutil.TestTrustKeys.keyB;
-import static com.google.gerrit.gpg.testutil.TestTrustKeys.keyC;
-import static com.google.gerrit.gpg.testutil.TestTrustKeys.keyD;
-import static com.google.gerrit.gpg.testutil.TestTrustKeys.keyE;
-import static org.eclipse.jgit.lib.RefUpdate.Result.FAST_FORWARD;
-import static org.eclipse.jgit.lib.RefUpdate.Result.FORCED;
-import static org.eclipse.jgit.lib.RefUpdate.Result.NEW;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterators;
-import com.google.gerrit.extensions.common.GpgKeyInfo.Status;
-import com.google.gerrit.gpg.testutil.TestKey;
-import com.google.gerrit.lifecycle.LifecycleManager;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountManager;
-import com.google.gerrit.server.account.AccountsUpdate;
-import com.google.gerrit.server.account.AuthRequest;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.account.externalids.ExternalIdsUpdate;
-import com.google.gerrit.server.schema.SchemaCreator;
-import com.google.gerrit.server.util.RequestContext;
-import com.google.gerrit.server.util.ThreadLocalRequestContext;
-import com.google.gerrit.testutil.InMemoryDatabase;
-import com.google.gerrit.testutil.InMemoryModule;
-import com.google.gerrit.testutil.NoteDbMode;
-import com.google.inject.Guice;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.Provider;
-import com.google.inject.util.Providers;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import org.bouncycastle.openpgp.PGPPublicKey;
-import org.bouncycastle.openpgp.PGPPublicKeyRing;
-import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
-import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.transport.PushCertificateIdent;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-/** Unit tests for {@link GerritPublicKeyChecker}. */
-public class GerritPublicKeyCheckerTest {
-  @Inject private AccountsUpdate.Server accountsUpdate;
-
-  @Inject private AccountManager accountManager;
-
-  @Inject private GerritPublicKeyChecker.Factory checkerFactory;
-
-  @Inject private IdentifiedUser.GenericFactory userFactory;
-
-  @Inject private InMemoryDatabase schemaFactory;
-
-  @Inject private SchemaCreator schemaCreator;
-
-  @Inject private ThreadLocalRequestContext requestContext;
-
-  @Inject private ExternalIdsUpdate.Server externalIdsUpdateFactory;
-
-  private LifecycleManager lifecycle;
-  private ReviewDb db;
-  private Account.Id userId;
-  private IdentifiedUser user;
-  private Repository storeRepo;
-  private PublicKeyStore store;
-
-  @Before
-  public void setUpInjector() throws Exception {
-    Config cfg = InMemoryModule.newDefaultConfig();
-    cfg.setInt("receive", null, "maxTrustDepth", 2);
-    cfg.setStringList(
-        "receive",
-        null,
-        "trustedKey",
-        ImmutableList.of(
-            Fingerprint.toString(keyB().getPublicKey().getFingerprint()),
-            Fingerprint.toString(keyD().getPublicKey().getFingerprint())));
-    Injector injector =
-        Guice.createInjector(new InMemoryModule(cfg, NoteDbMode.newNotesMigrationFromEnv()));
-
-    lifecycle = new LifecycleManager();
-    lifecycle.add(injector);
-    injector.injectMembers(this);
-    lifecycle.start();
-
-    db = schemaFactory.open();
-    schemaCreator.create(db);
-    userId = accountManager.authenticate(AuthRequest.forUser("user")).getAccountId();
-    // Note: does not match any key in TestKeys.
-    accountsUpdate.create().update(userId, a -> a.setPreferredEmail("user@example.com"));
-    user = reloadUser();
-
-    requestContext.setContext(
-        new RequestContext() {
-          @Override
-          public CurrentUser getUser() {
-            return user;
-          }
-
-          @Override
-          public Provider<ReviewDb> getReviewDbProvider() {
-            return Providers.of(db);
-          }
-        });
-
-    storeRepo = new InMemoryRepository(new DfsRepositoryDescription("repo"));
-    store = new PublicKeyStore(storeRepo);
-  }
-
-  @After
-  public void tearDown() throws Exception {
-    store.close();
-    storeRepo.close();
-  }
-
-  private IdentifiedUser addUser(String name) throws Exception {
-    AuthRequest req = AuthRequest.forUser(name);
-    Account.Id id = accountManager.authenticate(req).getAccountId();
-    return userFactory.create(id);
-  }
-
-  private IdentifiedUser reloadUser() {
-    user = userFactory.create(userId);
-    return user;
-  }
-
-  @After
-  public void tearDownInjector() {
-    if (lifecycle != null) {
-      lifecycle.stop();
-    }
-    if (db != null) {
-      db.close();
-    }
-    InMemoryDatabase.drop(schemaFactory);
-  }
-
-  @Test
-  public void defaultGpgCertificationMatchesEmail() throws Exception {
-    TestKey key = validKeyWithSecondUserId();
-    PublicKeyChecker checker = checkerFactory.create(user, store).disableTrust();
-    assertProblems(
-        checker.check(key.getPublicKey()),
-        Status.BAD,
-        "Key must contain a valid certification for one of the following "
-            + "identities:\n"
-            + "  gerrit:user\n"
-            + "  username:user");
-
-    addExternalId("test", "test", "test5@example.com");
-    checker = checkerFactory.create(user, store).disableTrust();
-    assertNoProblems(checker.check(key.getPublicKey()));
-  }
-
-  @Test
-  public void defaultGpgCertificationDoesNotMatchEmail() throws Exception {
-    addExternalId("test", "test", "nobody@example.com");
-    PublicKeyChecker checker = checkerFactory.create(user, store).disableTrust();
-    assertProblems(
-        checker.check(validKeyWithSecondUserId().getPublicKey()),
-        Status.BAD,
-        "Key must contain a valid certification for one of the following "
-            + "identities:\n"
-            + "  gerrit:user\n"
-            + "  nobody@example.com\n"
-            + "  test:test\n"
-            + "  username:user");
-  }
-
-  @Test
-  public void manualCertificationMatchesExternalId() throws Exception {
-    addExternalId("foo", "myId", null);
-    PublicKeyChecker checker = checkerFactory.create(user, store).disableTrust();
-    assertNoProblems(checker.check(validKeyWithSecondUserId().getPublicKey()));
-  }
-
-  @Test
-  public void manualCertificationDoesNotMatchExternalId() throws Exception {
-    addExternalId("foo", "otherId", null);
-    PublicKeyChecker checker = checkerFactory.create(user, store).disableTrust();
-    assertProblems(
-        checker.check(validKeyWithSecondUserId().getPublicKey()),
-        Status.BAD,
-        "Key must contain a valid certification for one of the following "
-            + "identities:\n"
-            + "  foo:otherId\n"
-            + "  gerrit:user\n"
-            + "  username:user");
-  }
-
-  @Test
-  public void noExternalIds() throws Exception {
-    ExternalIdsUpdate externalIdsUpdate = externalIdsUpdateFactory.create();
-    externalIdsUpdate.deleteAll(user.getAccountId());
-    reloadUser();
-
-    TestKey key = validKeyWithSecondUserId();
-    PublicKeyChecker checker = checkerFactory.create(user, store).disableTrust();
-    assertProblems(
-        checker.check(key.getPublicKey()),
-        Status.BAD,
-        "No identities found for user; check http://test/#/settings/web-identities");
-
-    checker = checkerFactory.create().setStore(store).disableTrust();
-    assertProblems(
-        checker.check(key.getPublicKey()), Status.BAD, "Key is not associated with any users");
-    externalIdsUpdate.insert(
-        ExternalId.create(toExtIdKey(key.getPublicKey()), user.getAccountId()));
-    reloadUser();
-    assertProblems(checker.check(key.getPublicKey()), Status.BAD, "No identities found for user");
-  }
-
-  @Test
-  public void checkValidTrustChainAndCorrectExternalIds() throws Exception {
-    // A---Bx
-    //  \
-    //   \---C---D
-    //        \
-    //         \---Ex
-    //
-    // The server ultimately trusts B and D.
-    // D and E trust C to be a valid introducer of depth 2.
-    IdentifiedUser userB = addUser("userB");
-    TestKey keyA = add(keyA(), user);
-    TestKey keyB = add(keyB(), userB);
-    add(keyC(), addUser("userC"));
-    add(keyD(), addUser("userD"));
-    add(keyE(), addUser("userE"));
-
-    // Checker for A, checking A.
-    PublicKeyChecker checkerA = checkerFactory.create(user, store);
-    assertNoProblems(checkerA.check(keyA.getPublicKey()));
-
-    // Checker for B, checking B. Trust chain and IDs are correct, so the only
-    // problem is with the key itself.
-    PublicKeyChecker checkerB = checkerFactory.create(userB, store);
-    assertProblems(checkerB.check(keyB.getPublicKey()), Status.BAD, "Key is expired");
-  }
-
-  @Test
-  public void checkWithValidKeyButWrongExpectedUserInChecker() throws Exception {
-    // A---Bx
-    //  \
-    //   \---C---D
-    //        \
-    //         \---Ex
-    //
-    // The server ultimately trusts B and D.
-    // D and E trust C to be a valid introducer of depth 2.
-    IdentifiedUser userB = addUser("userB");
-    TestKey keyA = add(keyA(), user);
-    TestKey keyB = add(keyB(), userB);
-    add(keyC(), addUser("userC"));
-    add(keyD(), addUser("userD"));
-    add(keyE(), addUser("userE"));
-
-    // Checker for A, checking B.
-    PublicKeyChecker checkerA = checkerFactory.create(user, store);
-    assertProblems(
-        checkerA.check(keyB.getPublicKey()),
-        Status.BAD,
-        "Key is expired",
-        "Key must contain a valid certification for one of the following"
-            + " identities:\n"
-            + "  gerrit:user\n"
-            + "  mailto:testa@example.com\n"
-            + "  testa@example.com\n"
-            + "  username:user");
-
-    // Checker for B, checking A.
-    PublicKeyChecker checkerB = checkerFactory.create(userB, store);
-    assertProblems(
-        checkerB.check(keyA.getPublicKey()),
-        Status.BAD,
-        "Key must contain a valid certification for one of the following"
-            + " identities:\n"
-            + "  gerrit:userB\n"
-            + "  mailto:testb@example.com\n"
-            + "  testb@example.com\n"
-            + "  username:userB");
-  }
-
-  @Test
-  public void checkTrustChainWithExpiredKey() throws Exception {
-    // A---Bx
-    //
-    // The server ultimately trusts B.
-    TestKey keyA = add(keyA(), user);
-    TestKey keyB = add(keyB(), addUser("userB"));
-
-    PublicKeyChecker checker = checkerFactory.create(user, store);
-    assertProblems(
-        checker.check(keyA.getPublicKey()),
-        Status.OK,
-        "No path to a trusted key",
-        "Certification by "
-            + keyToString(keyB.getPublicKey())
-            + " is valid, but key is not trusted",
-        "Key D24FE467 used for certification is not in store");
-  }
-
-  @Test
-  public void checkTrustChainUsingCheckerWithoutExpectedKey() throws Exception {
-    // A---Bx
-    //  \
-    //   \---C---D
-    //        \
-    //         \---Ex
-    //
-    // The server ultimately trusts B and D.
-    // D and E trust C to be a valid introducer of depth 2.
-    TestKey keyA = add(keyA(), user);
-    TestKey keyB = add(keyB(), addUser("userB"));
-    TestKey keyC = add(keyC(), addUser("userC"));
-    TestKey keyD = add(keyD(), addUser("userD"));
-    TestKey keyE = add(keyE(), addUser("userE"));
-
-    // This checker can check any key, so the only problems come from issues
-    // with the keys themselves, not having invalid user IDs.
-    PublicKeyChecker checker = checkerFactory.create().setStore(store);
-    assertNoProblems(checker.check(keyA.getPublicKey()));
-    assertProblems(checker.check(keyB.getPublicKey()), Status.BAD, "Key is expired");
-    assertNoProblems(checker.check(keyC.getPublicKey()));
-    assertNoProblems(checker.check(keyD.getPublicKey()));
-    assertProblems(
-        checker.check(keyE.getPublicKey()),
-        Status.BAD,
-        "Key is expired",
-        "No path to a trusted key");
-  }
-
-  @Test
-  public void keyLaterInTrustChainMissingUserId() throws Exception {
-    // A---Bx
-    //  \
-    //   \---C
-    //
-    // The server ultimately trusts B.
-    // C signed A's key but is not in the store.
-    TestKey keyA = add(keyA(), user);
-
-    PGPPublicKeyRing keyRingB = keyB().getPublicKeyRing();
-    PGPPublicKey keyB = keyRingB.getPublicKey();
-    keyB = PGPPublicKey.removeCertification(keyB, keyB.getUserIDs().next());
-    keyRingB = PGPPublicKeyRing.insertPublicKey(keyRingB, keyB);
-    add(keyRingB, addUser("userB"));
-
-    PublicKeyChecker checkerA = checkerFactory.create(user, store);
-    assertProblems(
-        checkerA.check(keyA.getPublicKey()),
-        Status.OK,
-        "No path to a trusted key",
-        "Certification by " + keyToString(keyB) + " is valid, but key is not trusted",
-        "Key D24FE467 used for certification is not in store");
-  }
-
-  private void add(PGPPublicKeyRing kr, IdentifiedUser user) throws Exception {
-    Account.Id id = user.getAccountId();
-    List<ExternalId> newExtIds = new ArrayList<>(2);
-    newExtIds.add(ExternalId.create(toExtIdKey(kr.getPublicKey()), id));
-
-    String userId = Iterators.getOnlyElement(kr.getPublicKey().getUserIDs(), null);
-    if (userId != null) {
-      String email = PushCertificateIdent.parse(userId).getEmailAddress();
-      assertThat(email).contains("@");
-      newExtIds.add(ExternalId.createEmail(id, email));
-    }
-
-    store.add(kr);
-    PersonIdent ident = new PersonIdent("A U Thor", "author@example.com");
-    CommitBuilder cb = new CommitBuilder();
-    cb.setAuthor(ident);
-    cb.setCommitter(ident);
-    assertThat(store.save(cb)).isAnyOf(NEW, FAST_FORWARD, FORCED);
-
-    externalIdsUpdateFactory.create().insert(newExtIds);
-  }
-
-  private TestKey add(TestKey k, IdentifiedUser user) throws Exception {
-    add(k.getPublicKeyRing(), user);
-    return k;
-  }
-
-  private void assertProblems(
-      CheckResult result, Status expectedStatus, String first, String... rest) throws Exception {
-    List<String> expectedProblems = new ArrayList<>();
-    expectedProblems.add(first);
-    expectedProblems.addAll(Arrays.asList(rest));
-    assertThat(result.getStatus()).isEqualTo(expectedStatus);
-    assertThat(result.getProblems()).containsExactlyElementsIn(expectedProblems).inOrder();
-  }
-
-  private void assertNoProblems(CheckResult result) {
-    assertThat(result.getStatus()).isEqualTo(Status.TRUSTED);
-    assertThat(result.getProblems()).isEmpty();
-  }
-
-  private void addExternalId(String scheme, String id, String email) throws Exception {
-    externalIdsUpdateFactory
-        .create()
-        .insert(ExternalId.createWithEmail(scheme, id, user.getAccountId(), email));
-    reloadUser();
-  }
-}
diff --git a/gerrit-gpg/src/test/java/com/google/gerrit/gpg/PublicKeyCheckerTest.java b/gerrit-gpg/src/test/java/com/google/gerrit/gpg/PublicKeyCheckerTest.java
deleted file mode 100644
index 04ed1de..0000000
--- a/gerrit-gpg/src/test/java/com/google/gerrit/gpg/PublicKeyCheckerTest.java
+++ /dev/null
@@ -1,377 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.gpg;
-
-import static com.google.gerrit.gpg.PublicKeyStore.keyToString;
-import static com.google.gerrit.gpg.testutil.TestKeys.expiredKey;
-import static com.google.gerrit.gpg.testutil.TestKeys.keyRevokedByExpiredKeyAfterExpiration;
-import static com.google.gerrit.gpg.testutil.TestKeys.keyRevokedByExpiredKeyBeforeExpiration;
-import static com.google.gerrit.gpg.testutil.TestKeys.revokedCompromisedKey;
-import static com.google.gerrit.gpg.testutil.TestKeys.revokedNoLongerUsedKey;
-import static com.google.gerrit.gpg.testutil.TestKeys.selfRevokedKey;
-import static com.google.gerrit.gpg.testutil.TestKeys.validKeyWithExpiration;
-import static com.google.gerrit.gpg.testutil.TestKeys.validKeyWithoutExpiration;
-import static com.google.gerrit.gpg.testutil.TestTrustKeys.keyA;
-import static com.google.gerrit.gpg.testutil.TestTrustKeys.keyB;
-import static com.google.gerrit.gpg.testutil.TestTrustKeys.keyC;
-import static com.google.gerrit.gpg.testutil.TestTrustKeys.keyD;
-import static com.google.gerrit.gpg.testutil.TestTrustKeys.keyE;
-import static com.google.gerrit.gpg.testutil.TestTrustKeys.keyF;
-import static com.google.gerrit.gpg.testutil.TestTrustKeys.keyG;
-import static com.google.gerrit.gpg.testutil.TestTrustKeys.keyH;
-import static com.google.gerrit.gpg.testutil.TestTrustKeys.keyI;
-import static com.google.gerrit.gpg.testutil.TestTrustKeys.keyJ;
-import static org.bouncycastle.bcpg.SignatureSubpacketTags.REVOCATION_KEY;
-import static org.bouncycastle.openpgp.PGPSignature.DIRECT_KEY;
-import static org.junit.Assert.assertEquals;
-
-import com.google.gerrit.gpg.testutil.TestKey;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import org.bouncycastle.openpgp.PGPPublicKey;
-import org.bouncycastle.openpgp.PGPPublicKeyRing;
-import org.bouncycastle.openpgp.PGPSignature;
-import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
-import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-
-public class PublicKeyCheckerTest {
-  @Rule public ExpectedException thrown = ExpectedException.none();
-
-  private InMemoryRepository repo;
-  private PublicKeyStore store;
-
-  @Before
-  public void setUp() {
-    repo = new InMemoryRepository(new DfsRepositoryDescription("repo"));
-    store = new PublicKeyStore(repo);
-  }
-
-  @After
-  public void tearDown() {
-    if (store != null) {
-      store.close();
-      store = null;
-    }
-    if (repo != null) {
-      repo.close();
-      repo = null;
-    }
-  }
-
-  @Test
-  public void validKey() throws Exception {
-    assertNoProblems(validKeyWithoutExpiration());
-  }
-
-  @Test
-  public void keyExpiringInFuture() throws Exception {
-    TestKey k = validKeyWithExpiration();
-
-    PublicKeyChecker checker = new PublicKeyChecker().setStore(store);
-    assertNoProblems(checker, k);
-
-    checker.setEffectiveTime(parseDate("2015-07-10 12:00:00 -0400"));
-    assertNoProblems(checker, k);
-
-    checker.setEffectiveTime(parseDate("2075-07-10 12:00:00 -0400"));
-    assertProblems(checker, k, "Key is expired");
-  }
-
-  @Test
-  public void expiredKeyIsExpired() throws Exception {
-    assertProblems(expiredKey(), "Key is expired");
-  }
-
-  @Test
-  public void selfRevokedKeyIsRevoked() throws Exception {
-    assertProblems(selfRevokedKey(), "Key is revoked (key material has been compromised)");
-  }
-
-  // Test keys specific to this test are at the bottom of this class. Each test
-  // has a diagram of the trust network, where:
-  //  - The notation M---N indicates N trusts M.
-  //  - An 'x' indicates the key is expired.
-
-  @Test
-  public void trustValidPathLength2() throws Exception {
-    // A---Bx
-    //  \
-    //   \---C---D
-    //        \
-    //         \---Ex
-    //
-    // D and E trust C to be a valid introducer of depth 2.
-    TestKey ka = add(keyA());
-    TestKey kb = add(keyB());
-    TestKey kc = add(keyC());
-    TestKey kd = add(keyD());
-    TestKey ke = add(keyE());
-    save();
-
-    PublicKeyChecker checker = newChecker(2, kb, kd);
-    assertNoProblems(checker, ka);
-    assertProblems(checker, kb, "Key is expired");
-    assertNoProblems(checker, kc);
-    assertNoProblems(checker, kd);
-    assertProblems(checker, ke, "Key is expired", "No path to a trusted key");
-  }
-
-  @Test
-  public void trustValidPathLength1() throws Exception {
-    // A---Bx
-    //  \
-    //   \---C---D
-    //        \
-    //         \---Ex
-    //
-    // D and E trust C to be a valid introducer of depth 2.
-    TestKey ka = add(keyA());
-    TestKey kb = add(keyB());
-    TestKey kc = add(keyC());
-    TestKey kd = add(keyD());
-    add(keyE());
-    save();
-
-    PublicKeyChecker checker = newChecker(1, kd);
-    assertProblems(checker, ka, "No path to a trusted key", notTrusted(kb), notTrusted(kc));
-  }
-
-  @Test
-  public void trustCycle() throws Exception {
-    // F---G---F, in a cycle.
-    TestKey kf = add(keyF());
-    TestKey kg = add(keyG());
-    save();
-
-    PublicKeyChecker checker = newChecker(10, keyA());
-    assertProblems(checker, kf, "No path to a trusted key", notTrusted(kg));
-    assertProblems(checker, kg, "No path to a trusted key", notTrusted(kf));
-  }
-
-  @Test
-  public void trustInsufficientDepthInSignature() throws Exception {
-    // H---I---J, but J is only trusted to length 1.
-    TestKey kh = add(keyH());
-    TestKey ki = add(keyI());
-    add(keyJ());
-    save();
-
-    PublicKeyChecker checker = newChecker(10, keyJ());
-
-    // J trusts I to a depth of 1, so I itself is valid, but I's certification
-    // of K is not valid.
-    assertNoProblems(checker, ki);
-    assertProblems(checker, kh, "No path to a trusted key", notTrusted(ki));
-  }
-
-  @Test
-  public void revokedKeyDueToCompromise() throws Exception {
-    TestKey k = add(revokedCompromisedKey());
-    add(validKeyWithoutExpiration());
-    save();
-
-    assertProblems(k, "Key is revoked (key material has been compromised): test6 compromised");
-
-    PGPPublicKeyRing kr = removeRevokers(k.getPublicKeyRing());
-    store.add(kr);
-    save();
-
-    // Key no longer specified as revoker.
-    assertNoProblems(kr.getPublicKey());
-  }
-
-  @Test
-  public void revokedKeyDueToCompromiseRevokesKeyRetroactively() throws Exception {
-    TestKey k = add(revokedCompromisedKey());
-    add(validKeyWithoutExpiration());
-    save();
-
-    String problem = "Key is revoked (key material has been compromised): test6 compromised";
-    assertProblems(k, problem);
-
-    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-    PublicKeyChecker checker =
-        new PublicKeyChecker().setStore(store).setEffectiveTime(df.parse("2010-01-01 12:00:00"));
-    assertProblems(checker, k, problem);
-  }
-
-  @Test
-  public void revokedByKeyNotPresentInStore() throws Exception {
-    TestKey k = add(revokedCompromisedKey());
-    save();
-
-    assertProblems(k, "Key is revoked (key material has been compromised): test6 compromised");
-  }
-
-  @Test
-  public void revokedKeyDueToNoLongerBeingUsed() throws Exception {
-    TestKey k = add(revokedNoLongerUsedKey());
-    add(validKeyWithoutExpiration());
-    save();
-
-    assertProblems(k, "Key is revoked (retired and no longer valid): test7 not used");
-  }
-
-  @Test
-  public void revokedKeyDueToNoLongerBeingUsedDoesNotRevokeKeyRetroactively() throws Exception {
-    TestKey k = add(revokedNoLongerUsedKey());
-    add(validKeyWithoutExpiration());
-    save();
-
-    assertProblems(k, "Key is revoked (retired and no longer valid): test7 not used");
-
-    PublicKeyChecker checker =
-        new PublicKeyChecker()
-            .setStore(store)
-            .setEffectiveTime(parseDate("2010-01-01 12:00:00 -0400"));
-    assertNoProblems(checker, k);
-  }
-
-  @Test
-  public void keyRevokedByExpiredKeyAfterExpirationIsNotRevoked() throws Exception {
-    TestKey k = add(keyRevokedByExpiredKeyAfterExpiration());
-    add(expiredKey());
-    save();
-
-    PublicKeyChecker checker = new PublicKeyChecker().setStore(store);
-    assertNoProblems(checker, k);
-  }
-
-  @Test
-  public void keyRevokedByExpiredKeyBeforeExpirationIsRevoked() throws Exception {
-    TestKey k = add(keyRevokedByExpiredKeyBeforeExpiration());
-    add(expiredKey());
-    save();
-
-    PublicKeyChecker checker = new PublicKeyChecker().setStore(store);
-    assertProblems(checker, k, "Key is revoked (retired and no longer valid): test9 not used");
-
-    // Set time between key creation and revocation.
-    checker.setEffectiveTime(parseDate("2005-08-01 13:00:00 -0400"));
-    assertNoProblems(checker, k);
-  }
-
-  private PGPPublicKeyRing removeRevokers(PGPPublicKeyRing kr) {
-    PGPPublicKey k = kr.getPublicKey();
-    @SuppressWarnings("unchecked")
-    Iterator<PGPSignature> sigs = k.getSignaturesOfType(DIRECT_KEY);
-    while (sigs.hasNext()) {
-      PGPSignature sig = sigs.next();
-      if (sig.getHashedSubPackets().hasSubpacket(REVOCATION_KEY)) {
-        k = PGPPublicKey.removeCertification(k, sig);
-      }
-    }
-    return PGPPublicKeyRing.insertPublicKey(kr, k);
-  }
-
-  private PublicKeyChecker newChecker(int maxTrustDepth, TestKey... trusted) {
-    Map<Long, Fingerprint> fps = new HashMap<>();
-    for (TestKey k : trusted) {
-      Fingerprint fp = new Fingerprint(k.getPublicKey().getFingerprint());
-      fps.put(fp.getId(), fp);
-    }
-    return new PublicKeyChecker().enableTrust(maxTrustDepth, fps).setStore(store);
-  }
-
-  private TestKey add(TestKey k) {
-    store.add(k.getPublicKeyRing());
-    return k;
-  }
-
-  private void save() throws Exception {
-    PersonIdent ident = new PersonIdent("A U Thor", "author@example.com");
-    CommitBuilder cb = new CommitBuilder();
-    cb.setAuthor(ident);
-    cb.setCommitter(ident);
-    RefUpdate.Result result = store.save(cb);
-    switch (result) {
-      case NEW:
-      case FAST_FORWARD:
-      case FORCED:
-        break;
-      case IO_FAILURE:
-      case LOCK_FAILURE:
-      case NOT_ATTEMPTED:
-      case NO_CHANGE:
-      case REJECTED:
-      case REJECTED_CURRENT_BRANCH:
-      case RENAMED:
-      case REJECTED_MISSING_OBJECT:
-      case REJECTED_OTHER_REASON:
-      default:
-        throw new AssertionError(result);
-    }
-  }
-
-  private void assertProblems(PublicKeyChecker checker, TestKey k, String first, String... rest) {
-    CheckResult result = checker.setStore(store).check(k.getPublicKey());
-    assertEquals(list(first, rest), result.getProblems());
-  }
-
-  private void assertNoProblems(PublicKeyChecker checker, TestKey k) {
-    CheckResult result = checker.setStore(store).check(k.getPublicKey());
-    assertEquals(Collections.emptyList(), result.getProblems());
-  }
-
-  private void assertProblems(TestKey tk, String first, String... rest) {
-    assertProblems(tk.getPublicKey(), first, rest);
-  }
-
-  private void assertNoProblems(TestKey tk) {
-    assertNoProblems(tk.getPublicKey());
-  }
-
-  private void assertProblems(PGPPublicKey k, String first, String... rest) {
-    CheckResult result = new PublicKeyChecker().setStore(store).check(k);
-    assertEquals(list(first, rest), result.getProblems());
-  }
-
-  private void assertNoProblems(PGPPublicKey k) {
-    CheckResult result = new PublicKeyChecker().setStore(store).check(k);
-    assertEquals(Collections.emptyList(), result.getProblems());
-  }
-
-  private static String notTrusted(TestKey k) {
-    return "Certification by "
-        + keyToString(k.getPublicKey())
-        + " is valid, but key is not trusted";
-  }
-
-  private static Date parseDate(String str) throws Exception {
-    return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z").parse(str);
-  }
-
-  private static List<String> list(String first, String[] rest) {
-    List<String> all = new ArrayList<>();
-    all.add(first);
-    all.addAll(Arrays.asList(rest));
-    return all;
-  }
-}
diff --git a/gerrit-gpg/src/test/java/com/google/gerrit/gpg/PublicKeyStoreTest.java b/gerrit-gpg/src/test/java/com/google/gerrit/gpg/PublicKeyStoreTest.java
deleted file mode 100644
index 9a2acff..0000000
--- a/gerrit-gpg/src/test/java/com/google/gerrit/gpg/PublicKeyStoreTest.java
+++ /dev/null
@@ -1,255 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.gpg;
-
-import static com.google.gerrit.gpg.PublicKeyStore.REFS_GPG_KEYS;
-import static com.google.gerrit.gpg.PublicKeyStore.keyIdToString;
-import static com.google.gerrit.gpg.PublicKeyStore.keyObjectId;
-import static com.google.gerrit.gpg.PublicKeyStore.keyToString;
-import static com.google.gerrit.gpg.testutil.TestKeys.validKeyWithExpiration;
-import static com.google.gerrit.gpg.testutil.TestKeys.validKeyWithSecondUserId;
-import static com.google.gerrit.gpg.testutil.TestKeys.validKeyWithoutExpiration;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import com.google.common.collect.Iterators;
-import com.google.gerrit.gpg.testutil.TestKey;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.TreeSet;
-import org.bouncycastle.openpgp.PGPPublicKey;
-import org.bouncycastle.openpgp.PGPPublicKeyRing;
-import org.bouncycastle.openpgp.PGPPublicKeyRingCollection;
-import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
-import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.notes.NoteMap;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.junit.Before;
-import org.junit.Test;
-
-public class PublicKeyStoreTest {
-  private TestRepository<?> tr;
-  private PublicKeyStore store;
-
-  @Before
-  public void setUp() throws Exception {
-    tr = new TestRepository<>(new InMemoryRepository(new DfsRepositoryDescription("pubkeys")));
-    store = new PublicKeyStore(tr.getRepository());
-  }
-
-  @Test
-  public void testKeyIdToString() throws Exception {
-    PGPPublicKey key = validKeyWithoutExpiration().getPublicKey();
-    assertEquals("46328A8C", keyIdToString(key.getKeyID()));
-  }
-
-  @Test
-  public void testKeyToString() throws Exception {
-    PGPPublicKey key = validKeyWithoutExpiration().getPublicKey();
-    assertEquals(
-        "46328A8C Testuser One <test1@example.com>"
-            + " (04AE A7ED 2F82 1133 E5B1  28D1 ED06 25DC 4632 8A8C)",
-        keyToString(key));
-  }
-
-  @Test
-  public void testKeyObjectId() throws Exception {
-    PGPPublicKey key = validKeyWithoutExpiration().getPublicKey();
-    String objId = keyObjectId(key.getKeyID()).name();
-    assertEquals("ed0625dc46328a8c000000000000000000000000", objId);
-    assertEquals(keyIdToString(key.getKeyID()).toLowerCase(), objId.substring(8, 16));
-  }
-
-  @Test
-  public void get() throws Exception {
-    TestKey key1 = validKeyWithoutExpiration();
-    tr.branch(REFS_GPG_KEYS)
-        .commit()
-        .add(keyObjectId(key1.getKeyId()).name(), key1.getPublicKeyArmored())
-        .create();
-    TestKey key2 = validKeyWithExpiration();
-    tr.branch(REFS_GPG_KEYS)
-        .commit()
-        .add(keyObjectId(key2.getKeyId()).name(), key2.getPublicKeyArmored())
-        .create();
-
-    assertKeys(key1.getKeyId(), key1);
-    assertKeys(key2.getKeyId(), key2);
-  }
-
-  @Test
-  public void getMultiple() throws Exception {
-    TestKey key1 = validKeyWithoutExpiration();
-    TestKey key2 = validKeyWithExpiration();
-    tr.branch(REFS_GPG_KEYS)
-        .commit()
-        .add(
-            keyObjectId(key1.getKeyId()).name(),
-            key1.getPublicKeyArmored()
-                // Mismatched for this key ID, but we can still read it out.
-                + key2.getPublicKeyArmored())
-        .create();
-    assertKeys(key1.getKeyId(), key1, key2);
-  }
-
-  @Test
-  public void save() throws Exception {
-    TestKey key1 = validKeyWithoutExpiration();
-    TestKey key2 = validKeyWithExpiration();
-    store.add(key1.getPublicKeyRing());
-    store.add(key2.getPublicKeyRing());
-
-    assertEquals(RefUpdate.Result.NEW, store.save(newCommitBuilder()));
-
-    assertKeys(key1.getKeyId(), key1);
-    assertKeys(key2.getKeyId(), key2);
-  }
-
-  @Test
-  public void saveAppendsToExistingList() throws Exception {
-    TestKey key1 = validKeyWithoutExpiration();
-    TestKey key2 = validKeyWithExpiration();
-    tr.branch(REFS_GPG_KEYS)
-        .commit()
-        // Mismatched for this key ID, but we can still read it out.
-        .add(keyObjectId(key1.getKeyId()).name(), key2.getPublicKeyArmored())
-        .create();
-
-    store.add(key1.getPublicKeyRing());
-    assertEquals(RefUpdate.Result.FAST_FORWARD, store.save(newCommitBuilder()));
-
-    assertKeys(key1.getKeyId(), key1, key2);
-
-    try (ObjectReader reader = tr.getRepository().newObjectReader();
-        RevWalk rw = new RevWalk(reader)) {
-      NoteMap notes =
-          NoteMap.read(
-              reader,
-              tr.getRevWalk()
-                  .parseCommit(tr.getRepository().exactRef(REFS_GPG_KEYS).getObjectId()));
-      String contents =
-          new String(reader.open(notes.get(keyObjectId(key1.getKeyId()))).getBytes(), UTF_8);
-      String header = "-----BEGIN PGP PUBLIC KEY BLOCK-----";
-      int i1 = contents.indexOf(header);
-      assertTrue(i1 >= 0);
-      int i2 = contents.indexOf(header, i1 + header.length());
-      assertTrue(i2 >= 0);
-    }
-  }
-
-  @Test
-  public void updateExisting() throws Exception {
-    TestKey key5 = validKeyWithSecondUserId();
-    PGPPublicKeyRing keyRing = key5.getPublicKeyRing();
-    PGPPublicKey key = keyRing.getPublicKey();
-    PGPPublicKey subKey =
-        keyRing.getPublicKey(Iterators.get(keyRing.getPublicKeys(), 1).getKeyID());
-    store.add(keyRing);
-    assertEquals(RefUpdate.Result.NEW, store.save(newCommitBuilder()));
-
-    assertUserIds(
-        store.get(key5.getKeyId()).iterator().next(),
-        "Testuser Five <test5@example.com>",
-        "foo:myId");
-
-    keyRing = PGPPublicKeyRing.removePublicKey(keyRing, subKey);
-    keyRing = PGPPublicKeyRing.removePublicKey(keyRing, key);
-    key = PGPPublicKey.removeCertification(key, "foo:myId");
-    keyRing = PGPPublicKeyRing.insertPublicKey(keyRing, key);
-    keyRing = PGPPublicKeyRing.insertPublicKey(keyRing, subKey);
-    store.add(keyRing);
-    assertEquals(RefUpdate.Result.FAST_FORWARD, store.save(newCommitBuilder()));
-
-    Iterator<PGPPublicKeyRing> keyRings = store.get(key.getKeyID()).iterator();
-    keyRing = keyRings.next();
-    assertFalse(keyRings.hasNext());
-    assertUserIds(keyRing, "Testuser Five <test5@example.com>");
-  }
-
-  @Test
-  public void remove() throws Exception {
-    TestKey key1 = validKeyWithoutExpiration();
-    store.add(key1.getPublicKeyRing());
-    assertEquals(RefUpdate.Result.NEW, store.save(newCommitBuilder()));
-    assertKeys(key1.getKeyId(), key1);
-
-    store.remove(key1.getPublicKey().getFingerprint());
-    assertEquals(RefUpdate.Result.FAST_FORWARD, store.save(newCommitBuilder()));
-    assertKeys(key1.getKeyId());
-  }
-
-  @Test
-  public void removeNonexisting() throws Exception {
-    TestKey key1 = validKeyWithoutExpiration();
-    store.add(key1.getPublicKeyRing());
-    assertEquals(RefUpdate.Result.NEW, store.save(newCommitBuilder()));
-
-    TestKey key2 = validKeyWithExpiration();
-    store.remove(key2.getPublicKey().getFingerprint());
-    assertEquals(RefUpdate.Result.NO_CHANGE, store.save(newCommitBuilder()));
-    assertKeys(key1.getKeyId(), key1);
-  }
-
-  @Test
-  public void addThenRemove() throws Exception {
-    TestKey key1 = validKeyWithoutExpiration();
-    store.add(key1.getPublicKeyRing());
-    store.remove(key1.getPublicKey().getFingerprint());
-    assertEquals(RefUpdate.Result.NO_CHANGE, store.save(newCommitBuilder()));
-    assertKeys(key1.getKeyId());
-  }
-
-  private void assertKeys(long keyId, TestKey... expected) throws Exception {
-    Set<String> expectedStrings = new TreeSet<>();
-    for (TestKey k : expected) {
-      expectedStrings.add(keyToString(k.getPublicKey()));
-    }
-    PGPPublicKeyRingCollection actual = store.get(keyId);
-    Set<String> actualStrings = new TreeSet<>();
-    for (PGPPublicKeyRing k : actual) {
-      actualStrings.add(keyToString(k.getPublicKey()));
-    }
-    assertEquals(expectedStrings, actualStrings);
-  }
-
-  private void assertUserIds(PGPPublicKeyRing keyRing, String... expected) throws Exception {
-    List<String> actual = new ArrayList<>();
-    Iterator<String> userIds =
-        store.get(keyRing.getPublicKey().getKeyID()).iterator().next().getPublicKey().getUserIDs();
-    while (userIds.hasNext()) {
-      actual.add(userIds.next());
-    }
-
-    assertEquals(Arrays.asList(expected), actual);
-  }
-
-  private CommitBuilder newCommitBuilder() {
-    CommitBuilder cb = new CommitBuilder();
-    PersonIdent ident = new PersonIdent("A U Thor", "author@example.com");
-    cb.setAuthor(ident);
-    cb.setCommitter(ident);
-    return cb;
-  }
-}
diff --git a/gerrit-gpg/src/test/java/com/google/gerrit/gpg/PushCertificateCheckerTest.java b/gerrit-gpg/src/test/java/com/google/gerrit/gpg/PushCertificateCheckerTest.java
deleted file mode 100644
index 3f5bc3c..0000000
--- a/gerrit-gpg/src/test/java/com/google/gerrit/gpg/PushCertificateCheckerTest.java
+++ /dev/null
@@ -1,204 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.gpg;
-
-import static com.google.gerrit.gpg.PublicKeyStore.keyIdToString;
-import static com.google.gerrit.gpg.PublicKeyStore.keyToString;
-import static com.google.gerrit.gpg.testutil.TestKeys.expiredKey;
-import static com.google.gerrit.gpg.testutil.TestKeys.validKeyWithExpiration;
-import static com.google.gerrit.gpg.testutil.TestKeys.validKeyWithoutExpiration;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.junit.Assert.assertEquals;
-
-import com.google.gerrit.gpg.testutil.TestKey;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-import org.bouncycastle.bcpg.ArmoredOutputStream;
-import org.bouncycastle.bcpg.BCPGOutputStream;
-import org.bouncycastle.openpgp.PGPSignature;
-import org.bouncycastle.openpgp.PGPSignatureGenerator;
-import org.bouncycastle.openpgp.PGPSignatureSubpacketGenerator;
-import org.bouncycastle.openpgp.PGPUtil;
-import org.bouncycastle.openpgp.operator.bc.BcPGPContentSignerBuilder;
-import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
-import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.transport.PushCertificate;
-import org.eclipse.jgit.transport.PushCertificateIdent;
-import org.eclipse.jgit.transport.PushCertificateParser;
-import org.eclipse.jgit.transport.SignedPushConfig;
-import org.junit.Before;
-import org.junit.Test;
-
-public class PushCertificateCheckerTest {
-  private InMemoryRepository repo;
-  private PublicKeyStore store;
-  private SignedPushConfig signedPushConfig;
-  private PushCertificateChecker checker;
-
-  @Before
-  public void setUp() throws Exception {
-    TestKey key1 = validKeyWithoutExpiration();
-    TestKey key3 = expiredKey();
-    repo = new InMemoryRepository(new DfsRepositoryDescription("repo"));
-    store = new PublicKeyStore(repo);
-    store.add(key1.getPublicKeyRing());
-    store.add(key3.getPublicKeyRing());
-
-    PersonIdent ident = new PersonIdent("A U Thor", "author@example.com");
-    CommitBuilder cb = new CommitBuilder();
-    cb.setAuthor(ident);
-    cb.setCommitter(ident);
-    assertEquals(RefUpdate.Result.NEW, store.save(cb));
-
-    signedPushConfig = new SignedPushConfig();
-    signedPushConfig.setCertNonceSeed("sekret");
-    signedPushConfig.setCertNonceSlopLimit(60 * 24);
-    checker = newChecker(true);
-  }
-
-  private PushCertificateChecker newChecker(boolean checkNonce) {
-    PublicKeyChecker keyChecker = new PublicKeyChecker().setStore(store);
-    return new PushCertificateChecker(keyChecker) {
-      @Override
-      protected Repository getRepository() {
-        return repo;
-      }
-
-      @Override
-      protected boolean shouldClose(Repository repo) {
-        return false;
-      }
-    }.setCheckNonce(checkNonce);
-  }
-
-  @Test
-  public void validCert() throws Exception {
-    PushCertificate cert = newSignedCert(validNonce(), validKeyWithoutExpiration());
-    assertNoProblems(cert);
-  }
-
-  @Test
-  public void invalidNonce() throws Exception {
-    PushCertificate cert = newSignedCert("invalid-nonce", validKeyWithoutExpiration());
-    assertProblems(cert, "Invalid nonce");
-  }
-
-  @Test
-  public void invalidNonceNotChecked() throws Exception {
-    checker = newChecker(false);
-    PushCertificate cert = newSignedCert("invalid-nonce", validKeyWithoutExpiration());
-    assertNoProblems(cert);
-  }
-
-  @Test
-  public void missingKey() throws Exception {
-    TestKey key2 = validKeyWithExpiration();
-    PushCertificate cert = newSignedCert(validNonce(), key2);
-    assertProblems(cert, "No public keys found for key ID " + keyIdToString(key2.getKeyId()));
-  }
-
-  @Test
-  public void invalidKey() throws Exception {
-    TestKey key3 = expiredKey();
-    PushCertificate cert = newSignedCert(validNonce(), key3);
-    assertProblems(
-        cert, "Invalid public key " + keyToString(key3.getPublicKey()) + ":\n  Key is expired");
-  }
-
-  @Test
-  public void signatureByExpiredKeyBeforeExpiration() throws Exception {
-    TestKey key3 = expiredKey();
-    Date now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z").parse("2005-07-10 12:00:00 -0400");
-    PushCertificate cert = newSignedCert(validNonce(), key3, now);
-    assertNoProblems(cert);
-  }
-
-  private String validNonce() {
-    return signedPushConfig
-        .getNonceGenerator()
-        .createNonce(repo, System.currentTimeMillis() / 1000);
-  }
-
-  private PushCertificate newSignedCert(String nonce, TestKey signingKey) throws Exception {
-    return newSignedCert(nonce, signingKey, null);
-  }
-
-  private PushCertificate newSignedCert(String nonce, TestKey signingKey, Date now)
-      throws Exception {
-    PushCertificateIdent ident =
-        new PushCertificateIdent(signingKey.getFirstUserId(), System.currentTimeMillis(), -7 * 60);
-    String payload =
-        "certificate version 0.1\n"
-            + "pusher "
-            + ident.getRaw()
-            + "\n"
-            + "pushee test://localhost/repo.git\n"
-            + "nonce "
-            + nonce
-            + "\n"
-            + "\n"
-            + "0000000000000000000000000000000000000000"
-            + " deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"
-            + " refs/heads/master\n";
-    PGPSignatureGenerator gen =
-        new PGPSignatureGenerator(
-            new BcPGPContentSignerBuilder(signingKey.getPublicKey().getAlgorithm(), PGPUtil.SHA1));
-
-    if (now != null) {
-      PGPSignatureSubpacketGenerator subGen = new PGPSignatureSubpacketGenerator();
-      subGen.setSignatureCreationTime(false, now);
-      gen.setHashedSubpackets(subGen.generate());
-    }
-
-    gen.init(PGPSignature.BINARY_DOCUMENT, signingKey.getPrivateKey());
-    gen.update(payload.getBytes(UTF_8));
-    PGPSignature sig = gen.generate();
-
-    ByteArrayOutputStream bout = new ByteArrayOutputStream();
-    try (BCPGOutputStream out = new BCPGOutputStream(new ArmoredOutputStream(bout))) {
-      sig.encode(out);
-    }
-
-    String cert = payload + new String(bout.toByteArray(), UTF_8);
-    Reader reader = new InputStreamReader(new ByteArrayInputStream(cert.getBytes(UTF_8)), UTF_8);
-    PushCertificateParser parser = new PushCertificateParser(repo, signedPushConfig);
-    return parser.parse(reader);
-  }
-
-  private void assertProblems(PushCertificate cert, String first, String... rest) throws Exception {
-    List<String> expected = new ArrayList<>();
-    expected.add(first);
-    expected.addAll(Arrays.asList(rest));
-    CheckResult result = checker.check(cert).getCheckResult();
-    assertEquals(expected, result.getProblems());
-  }
-
-  private void assertNoProblems(PushCertificate cert) {
-    CheckResult result = checker.check(cert).getCheckResult();
-    assertEquals(Collections.emptyList(), result.getProblems());
-  }
-}
diff --git a/gerrit-gpg/src/test/java/com/google/gerrit/gpg/testutil/TestKey.java b/gerrit-gpg/src/test/java/com/google/gerrit/gpg/testutil/TestKey.java
deleted file mode 100644
index b2ef65d..0000000
--- a/gerrit-gpg/src/test/java/com/google/gerrit/gpg/testutil/TestKey.java
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.gpg.testutil;
-
-import static com.google.gerrit.gpg.PublicKeyStore.keyIdToString;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import org.bouncycastle.bcpg.ArmoredInputStream;
-import org.bouncycastle.openpgp.PGPException;
-import org.bouncycastle.openpgp.PGPPrivateKey;
-import org.bouncycastle.openpgp.PGPPublicKey;
-import org.bouncycastle.openpgp.PGPPublicKeyRing;
-import org.bouncycastle.openpgp.PGPSecretKey;
-import org.bouncycastle.openpgp.PGPSecretKeyRing;
-import org.bouncycastle.openpgp.operator.bc.BcKeyFingerprintCalculator;
-import org.bouncycastle.openpgp.operator.bc.BcPBESecretKeyDecryptorBuilder;
-import org.bouncycastle.openpgp.operator.bc.BcPGPDigestCalculatorProvider;
-import org.eclipse.jgit.lib.Constants;
-
-public class TestKey {
-  private final String pubArmored;
-  private final String secArmored;
-  private final PGPPublicKeyRing pubRing;
-  private final PGPSecretKeyRing secRing;
-
-  public TestKey(String pubArmored, String secArmored) {
-    this.pubArmored = pubArmored;
-    this.secArmored = secArmored;
-    BcKeyFingerprintCalculator fc = new BcKeyFingerprintCalculator();
-    try {
-      this.pubRing = new PGPPublicKeyRing(newStream(pubArmored), fc);
-      this.secRing = new PGPSecretKeyRing(newStream(secArmored), fc);
-    } catch (PGPException | IOException e) {
-      throw new AssertionError(e);
-    }
-  }
-
-  public String getPublicKeyArmored() {
-    return pubArmored;
-  }
-
-  public String getSecretKeyArmored() {
-    return secArmored;
-  }
-
-  public PGPPublicKeyRing getPublicKeyRing() {
-    return pubRing;
-  }
-
-  public PGPPublicKey getPublicKey() {
-    return pubRing.getPublicKey();
-  }
-
-  public PGPSecretKey getSecretKey() {
-    return secRing.getSecretKey();
-  }
-
-  public long getKeyId() {
-    return getPublicKey().getKeyID();
-  }
-
-  public String getKeyIdString() {
-    return keyIdToString(getPublicKey().getKeyID());
-  }
-
-  public String getFirstUserId() {
-    return getPublicKey().getUserIDs().next();
-  }
-
-  public PGPPrivateKey getPrivateKey() throws PGPException {
-    return getSecretKey()
-        .extractPrivateKey(
-            new BcPBESecretKeyDecryptorBuilder(new BcPGPDigestCalculatorProvider())
-                // All test keys have no passphrase.
-                .build(new char[0]));
-  }
-
-  private static ArmoredInputStream newStream(String armored) throws IOException {
-    return new ArmoredInputStream(new ByteArrayInputStream(Constants.encode(armored)));
-  }
-}
diff --git a/gerrit-gpg/src/test/java/com/google/gerrit/gpg/testutil/TestKeys.java b/gerrit-gpg/src/test/java/com/google/gerrit/gpg/testutil/TestKeys.java
deleted file mode 100644
index 82d7ada..0000000
--- a/gerrit-gpg/src/test/java/com/google/gerrit/gpg/testutil/TestKeys.java
+++ /dev/null
@@ -1,1032 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.gpg.testutil;
-
-import com.google.common.collect.ImmutableList;
-
-/** Common test keys used by a variety of tests. */
-public class TestKeys {
-  public static ImmutableList<TestKey> allValidKeys() {
-    return ImmutableList.of(
-        validKeyWithoutExpiration(), validKeyWithExpiration(), validKeyWithSecondUserId());
-  }
-
-  /**
-   * A valid key with no expiration.
-   *
-   * <pre>
-   * pub   2048R/46328A8C 2015-07-08
-   *       Key fingerprint = 04AE A7ED 2F82 1133 E5B1  28D1 ED06 25DC 4632 8A8C
-   * uid                  Testuser One &lt;test1@example.com&gt;
-   * sub   2048R/F0AF69C0 2015-07-08
-   * </pre>
-   */
-  public static TestKey validKeyWithoutExpiration() {
-    return new TestKey(
-        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "mQENBFWdTIkBCADOaygDKjLuRX6LXAvBAYB91cmTf1MSlmEy+qsG3c9ijjQixPkr\n"
-            + "atdYkocrrT2S0R9UGjksTOI2WN5S0lQfLA1RSk63KURQE+OF+IfNqdD6nQdLBs1w\n"
-            + "va+GDj/uvuI05I0oXf/M7POdFphutrS4EUDBnFPj6ns/0C2sTRTxliD+Y9Y9a84V\n"
-            + "DfVVUbJB6wc3LP3L6ImT+cSM7dLq3hZHya+9FNeYPmPYnBrkJyqf2NDd38Sddsro\n"
-            + "7smw/GgCZHnnuVNS4C7NsHr6900VKC+JDtdx+fqptixcAEJWiGoQfWqU+hYmia3p\n"
-            + "9+Xw02+3FcjOT6ONUCmHX+xlz0pXW4iIYlPpABEBAAG0IFRlc3R1c2VyIE9uZSA8\n"
-            + "dGVzdDFAZXhhbXBsZS5jb20+iQE4BBMBAgAiBQJVnUyJAhsDBgsJCAcDAgYVCAIJ\n"
-            + "CgsEFgIDAQIeAQIXgAAKCRDtBiXcRjKKjHblB/9RaFO5+GTDIphAL/aVj2u+d8Lq\n"
-            + "yUpBrDp3P06QDGpKGFMAovBuh+NLH76VKNIzQLQC8rdTj651fLcLMuJ1enQ3Rblg\n"
-            + "RKr1oc+wqqtFHr4QyOQjE/N3C9GQjEzfqn4qnp5KtZxYFnlvU5NGehid7M1HTZMx\n"
-            + "jRcHbM9KQnsE5Z4fh4wmN5ynG+5nbaF4O9otPOpFzYRvIhxFmHscWyOgRaMZiYEX\n"
-            + "7Qkzze+scAlc9E/EWRJQIFcxnxV/SYIT4qCTT1g2aKA8OCBO/ZTOleH8SzvTODjy\n"
-            + "W0lGHnh/ZqH6XGVcGUaJZZ2uHTck1+czuVVShNcXPW1W20T6E9UqzHbJHN0guQEN\n"
-            + "BFWdTIkBCACoLVdPr3gpQwzI+2NGXjdtoyqYoPlgfeyI2M1XQD/7+rLZTbi14ZjN\n"
-            + "vYkS/+/oGtVEmiYOiAVTwmkjCYkKGDgNcCiJVekiPAN6JryVv488wRc999b5LpFE\n"
-            + "fhLGwI0YxjcS4KFFnpMC3wSb6tJUnHRLVoE5d8icdiaOpgYdp7uqWkSx2oxqHgIb\n"
-            + "nuyrk3ydEcS4ZeGD+w+taIxMc9F1DS9kiXALD7xWgUkmqZLEQoNgF6KlwCHXRd3m\n"
-            + "rBCo97sE95yKcq98ZMIWuQtTcEccZsN/6jlsei+9RI0tqs+FbZnIFm/go9zk11Vl\n"
-            + "IQ9QFSj6ruqoKrYvNZuDDLD1lHvZPD4/ABEBAAGJAR8EGAECAAkFAlWdTIkCGwwA\n"
-            + "CgkQ7QYl3EYyiox+HAf/Z/OCQO3jxALAcn3oUb1g/IlHm6qZv7RJOFUsj/16fGiF\n"
-            + "rRTP15zMXzyqV+L/LGV/owvOsdD/o7boZz4C/U98COx0Nl1jOrmPATOl+xqsgpEj\n"
-            + "Fhk+eAR7exO2XxW+u2g4cYoSMosIOX5w1GrdsxQeaZDwiSJMEOR2cVLs3YI19Ci/\n"
-            + "FuzActZ0wJNk0nlNF6l8CAbzwN6pM9OIc/iBIwDjz92KUco0NF8XKZnxqhH4wfHB\n"
-            + "PGkTx8RwOvELUTDMtvYnG5R0QtND0RbOnmp4ZVZmeOjKSLo1mZliUZB1H2PPSxrA\n"
-            + "0oLr8+wLntz1SU7uS4ddvhSQW+j2M/0pa352KUwmrw==\n"
-            + "=o/aU\n"
-            + "-----END PGP PUBLIC KEY BLOCK-----\n",
-        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "lQOYBFWdTIkBCADOaygDKjLuRX6LXAvBAYB91cmTf1MSlmEy+qsG3c9ijjQixPkr\n"
-            + "atdYkocrrT2S0R9UGjksTOI2WN5S0lQfLA1RSk63KURQE+OF+IfNqdD6nQdLBs1w\n"
-            + "va+GDj/uvuI05I0oXf/M7POdFphutrS4EUDBnFPj6ns/0C2sTRTxliD+Y9Y9a84V\n"
-            + "DfVVUbJB6wc3LP3L6ImT+cSM7dLq3hZHya+9FNeYPmPYnBrkJyqf2NDd38Sddsro\n"
-            + "7smw/GgCZHnnuVNS4C7NsHr6900VKC+JDtdx+fqptixcAEJWiGoQfWqU+hYmia3p\n"
-            + "9+Xw02+3FcjOT6ONUCmHX+xlz0pXW4iIYlPpABEBAAEAB/wLoOXEJ+Buo+OZHjpb\n"
-            + "SSZf8GdGs+mOJoKbSJvR6zT/rFsrikUvOPmgt8B9qWjKmJVXO5L09+/Wd/MuX0L1\n"
-            + "7plhdvowP1bl2/j5VyLvZx2qwKXkiCGStFzrBGp9nKtJp4Z8O69pb//ZXaiAtDJC\n"
-            + "HFa1kYT4VgFTevrXtg/z/C0np4Yjx0mZpw4nfISEeHCiYCyRa/B8R1+Pc4uIcoSo\n"
-            + "G3aq6Ow9m/LGvw0MRO5qHvqoF41TLPQpGKjKEsCBKHF1qh0tOOUHnLGrvbmdFnGr\n"
-            + "UXJpRkLdRTnj8ufvA4XVZhImzL+lD+ALtjlV14xh8nsNKYL42880GFl5Cl0OtBcE\n"
-            + "lgQBBADPJ6kHdvUYOe0zugRdukBSYLkZcYwRiphom7dZuavYICIu6B14ljEONzVD\n"
-            + "mPhi2lDOawZOURKwYd9S4K11XWLsTYe7XEwkc+1Fpvu4L/JqnJTTnnvbx05ZsqD5\n"
-            + "j9tybPlrTuLrf2ctfcC03Z55wfo6azsbf89yrr6QX0+l9dlkYQQA/xcMdQJ0Z5vm\n"
-            + "kvyaCPsQzJc/8noVO9PMv7xJm14gJWK7Px3y2eBidzpCbVVFnGWW6CPb3qKerB5U\n"
-            + "pwcF4gCFWyP9C2YtnB0hgqixIPfR+UO8gpqdY6MP8NPspoXouffRn+Zic/P6Cxje\n"
-            + "/MGxNQBeRtqb2IGh1xZ8v/8tmmmxHIkEAP74HkGETcXmlj3/6RlwTBUAovPARSn7\n"
-            + "LDtOCPezg6mQmble1BvnTnAwOHKJVqjx+3qsGqMe8OGGXAxZPSU1xSmOShBFrpDp\n"
-            + "xArE67arE17pT1lyD/gmHRuqnNMvgRrwz1mDm3G2ohWkCVixEiB+8vPQfbZrJBgQ\n"
-            + "WxOF4RCo2WWyRKa0IFRlc3R1c2VyIE9uZSA8dGVzdDFAZXhhbXBsZS5jb20+iQE4\n"
-            + "BBMBAgAiBQJVnUyJAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRDtBiXc\n"
-            + "RjKKjHblB/9RaFO5+GTDIphAL/aVj2u+d8LqyUpBrDp3P06QDGpKGFMAovBuh+NL\n"
-            + "H76VKNIzQLQC8rdTj651fLcLMuJ1enQ3RblgRKr1oc+wqqtFHr4QyOQjE/N3C9GQ\n"
-            + "jEzfqn4qnp5KtZxYFnlvU5NGehid7M1HTZMxjRcHbM9KQnsE5Z4fh4wmN5ynG+5n\n"
-            + "baF4O9otPOpFzYRvIhxFmHscWyOgRaMZiYEX7Qkzze+scAlc9E/EWRJQIFcxnxV/\n"
-            + "SYIT4qCTT1g2aKA8OCBO/ZTOleH8SzvTODjyW0lGHnh/ZqH6XGVcGUaJZZ2uHTck\n"
-            + "1+czuVVShNcXPW1W20T6E9UqzHbJHN0gnQOYBFWdTIkBCACoLVdPr3gpQwzI+2NG\n"
-            + "XjdtoyqYoPlgfeyI2M1XQD/7+rLZTbi14ZjNvYkS/+/oGtVEmiYOiAVTwmkjCYkK\n"
-            + "GDgNcCiJVekiPAN6JryVv488wRc999b5LpFEfhLGwI0YxjcS4KFFnpMC3wSb6tJU\n"
-            + "nHRLVoE5d8icdiaOpgYdp7uqWkSx2oxqHgIbnuyrk3ydEcS4ZeGD+w+taIxMc9F1\n"
-            + "DS9kiXALD7xWgUkmqZLEQoNgF6KlwCHXRd3mrBCo97sE95yKcq98ZMIWuQtTcEcc\n"
-            + "ZsN/6jlsei+9RI0tqs+FbZnIFm/go9zk11VlIQ9QFSj6ruqoKrYvNZuDDLD1lHvZ\n"
-            + "PD4/ABEBAAEAB/4kQnJauehcbRpqktjaqSGmP9HFSp+50CyZbLUJJM8m0uyQsZMr\n"
-            + "k9JQOZc+Q3RERNTKj7m41Fbhsj7c0Qd856/eJdp3kdBME0hko8lxN/X4EWGjeLYe\n"
-            + "z41+iPgfZhCF0Oa66TecPQ5RRihGPaDPoVPpkmMWMt9L7KVviBg1eJ6bobVIY5hu\n"
-            + "a7KFJHZQcCI1OvdJ0cx89KDSbnH8iMM6Kmw1bE3D2FEaWctuKLBo5PNRgyTJvdBd\n"
-            + "PSf56/Rc6csPqmOntQi2Yn8n47eCOTclHNuygSTJeHPpymVuWbhMq6fhJat/xA+V\n"
-            + "kyT8I2c45RQb0dKId+wEytjbKw8AI6Q3GXqhBADOhsr9M+JWc4MpD43mCDZACN4v\n"
-            + "RBRxSrJvO/V6HqQPmKYRmr9Gk3vxgF0zCf5zB1QeBiXpTpShxV87RIbUYReOyavp\n"
-            + "87zH6/SkRxQJiBEpQh5Fu5CoAaxGOivxbPqdWHrBY6jvqkrRoMPNiFJ6/ty5w9jx\n"
-            + "i9kGm9PelQGu2SdLNwQA0HbGo8sC8h5TSTEDCkFHRYzVYONx+32AlkCsJX9mEt0E\n"
-            + "nG8d97Ay24JsbnuXSq04FJrqzjOVyHLUffpXnAGELJZVNCIparSyqIaj43UG/oPc\n"
-            + "ICPmR7zI9G49ICUPSzI7+S2+BwjbiHRQcP0zmxbH92G4abYwKfk7dsDpGyVM+TkD\n"
-            + "/2nUiV0CRqnGipeiLWNjW/Md0ufkwqBvCWxrtxj0rQCyvBOVg3B6DocVNzgOOYa1\n"
-            + "ji3We5A9mSP40JBmMfk2veFrDdsGn4G+OpzMxKQtNfYemqjALfZ2zTdax0mXPXy6\n"
-            + "Gl0jUgSGrxGm8QnRLsrRx7G7ZKnvkcS+YsdQ8dbtzvJtQfiJAR8EGAECAAkFAlWd\n"
-            + "TIkCGwwACgkQ7QYl3EYyiox+HAf/Z/OCQO3jxALAcn3oUb1g/IlHm6qZv7RJOFUs\n"
-            + "j/16fGiFrRTP15zMXzyqV+L/LGV/owvOsdD/o7boZz4C/U98COx0Nl1jOrmPATOl\n"
-            + "+xqsgpEjFhk+eAR7exO2XxW+u2g4cYoSMosIOX5w1GrdsxQeaZDwiSJMEOR2cVLs\n"
-            + "3YI19Ci/FuzActZ0wJNk0nlNF6l8CAbzwN6pM9OIc/iBIwDjz92KUco0NF8XKZnx\n"
-            + "qhH4wfHBPGkTx8RwOvELUTDMtvYnG5R0QtND0RbOnmp4ZVZmeOjKSLo1mZliUZB1\n"
-            + "H2PPSxrA0oLr8+wLntz1SU7uS4ddvhSQW+j2M/0pa352KUwmrw==\n"
-            + "=MuAn\n"
-            + "-----END PGP PRIVATE KEY BLOCK-----\n");
-  }
-
-  /**
-   * A valid key expiring in 2065.
-   *
-   * <pre>
-   * pub   2048R/378A0AED 2015-07-08 [expires: 2065-06-25]
-   *       Key fingerprint = C378 369A CBCD 34CC 138D  90B1 4531 1A6F 378A 0AED
-   * uid                  Testuser Two &lt;test2@example.com&gt;
-   * sub   2048R/46D4F204 2015-07-08 [expires: 2065-06-25]
-   * </pre>
-   */
-  public static final TestKey validKeyWithExpiration() {
-    return new TestKey(
-        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "mQENBFWdTP8BCADRxNpasIv0jtNXTK6VYIS2VJ2Xk0ZD6gtxeoXCpjQ+TsB9fxh3\n"
-            + "vAMPt2Zu5LqoGwygKOJj1zquG8xk7GUCCHJk3+qG8xxB1xGtSz2vLyfRm7fOZmHj\n"
-            + "3W/C/25lynSPDrfvcwvwA4PN8iP5EWbWU10L6WOZGMwwwtVDUSEouSOw2LEepxLV\n"
-            + "rkKuZcyHaivheDbUlZliwe9rGXd4hh1h4qyNQWG3q+ytlL28sVkOzUh6IMBTvqhe\n"
-            + "IRsvxvaVSLV8jRVKfUTqw0g57ft4ZD2/L46yUTXzr9aUCBjTNxvWLlyboqql/D8P\n"
-            + "inp51h3cvAg7NW5RdG1GEYmylH8SygT5utPxABEBAAG0IFRlc3R1c2VyIFR3byA8\n"
-            + "dGVzdDJAZXhhbXBsZS5jb20+iQE+BBMBAgAoBQJVnUz/AhsDBQld/A8ABgsJCAcD\n"
-            + "AgYVCAIJCgsEFgIDAQIeAQIXgAAKCRBFMRpvN4oK7UZqCACWwQL/YvBK4b0m+R0d\n"
-            + "UdvAXeBx7DwOAnAodis9ZVqChb7RxcZQxF1Ti9mtCBPPQGuEs5wE2Ocrrq+L13r6\n"
-            + "bgW+1WOB1tZSDVxwL1PnZFw/SyADRIDCZrOHiAkp82UnZwWAkk39GzNJtt1wTYDZ\n"
-            + "FMTFUr2SPscXk1k7muS+ZfEFwNPD4tODo/poJKDYEJ80Z5UXXFQLDtsfdeIXMFIT\n"
-            + "449CYoq8XBMBfvyWl/LLpw0r3JI6pV/YdH3Oeuz8XkkEVzRxaxB6Zmeo5jSwjR/T\n"
-            + "8TKDGwwiuwiiT3SfkFSVdcjKulRuXSRNs1Ouf7/UC3cq4bG2WXWa85X1+HQRm7iu\n"
-            + "RHSOuQENBFWdTP8BCADhhGxAA0pX5yBHwIgM1j0gw2h5nSsopDrO6t/sbRUcNxnR\n"
-            + "tBScgKZnP0sjRTYEUIwmZuseHMBohtVCuMaDt06qyZDvDk/98j3AeE5t2dgFnOIe\n"
-            + "qCrm/6aejbFcQOpxe6U29KJRCAxuwNtB15X1VH1Kj7B0gRSTu13n/5sUsi2lunoZ\n"
-            + "oIvpIe9tZH4aXitCY2MCQH+hTyCyNBzlEa44kWz6LxUsPdo7I6rXkTr6Ot7wQh+9\n"
-            + "7HCe042GIq65h0apgujyjhJidjch5ur1mngaSNSEyvbji2MGC+cd3wAIstG5a7xP\n"
-            + "d9MncY5Q/eH+hn96694k5bckottSyGm/3f2Ihfj1ABEBAAGJASUEGAECAA8FAlWd\n"
-            + "TP8CGwwFCV38DwAACgkQRTEabzeKCu1FNwgAif4eK2v7R3QubL2S6wmb1nsgRMgV\n"
-            + "YoxGBeUk2EK6WZ5IPor93ySd0ixRVNMRmJ8BLH3EMjZQTzkDG+BH6zFyxo6lLHw9\n"
-            + "NxQjI06tqQWgyyK0mEweVwB/zqtxiB4lNUpsNbqOZWnBJ3d6o1SsnD2Q3uwvP5fb\n"
-            + "fSIgdmUk3c0VMdgA+KzWjPD/PJIPujE+ckHhjn5cbDNw35/FuyhkLJfqlOG7SPvM\n"
-            + "NmCdJ1Pcqju9t7sf6b0BGPDOCL4gpuWKK7HJz9WxngNb3FSziLbyPLk13ynADO+v\n"
-            + "EOR44LPyXE9kVxPusazsXlt9ayTOhELhwzw7sGFFu8E17Cpn7GnVj3tN9A==\n"
-            + "=1e/A\n"
-            + "-----END PGP PUBLIC KEY BLOCK-----\n",
-        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "lQOYBFWdTP8BCADRxNpasIv0jtNXTK6VYIS2VJ2Xk0ZD6gtxeoXCpjQ+TsB9fxh3\n"
-            + "vAMPt2Zu5LqoGwygKOJj1zquG8xk7GUCCHJk3+qG8xxB1xGtSz2vLyfRm7fOZmHj\n"
-            + "3W/C/25lynSPDrfvcwvwA4PN8iP5EWbWU10L6WOZGMwwwtVDUSEouSOw2LEepxLV\n"
-            + "rkKuZcyHaivheDbUlZliwe9rGXd4hh1h4qyNQWG3q+ytlL28sVkOzUh6IMBTvqhe\n"
-            + "IRsvxvaVSLV8jRVKfUTqw0g57ft4ZD2/L46yUTXzr9aUCBjTNxvWLlyboqql/D8P\n"
-            + "inp51h3cvAg7NW5RdG1GEYmylH8SygT5utPxABEBAAEAB/0WW33OVqzEBwj9b/3X\n"
-            + "i+75I/Gb+yVtDZ/km2NwSJie33PirE4mTNKitTBkt1oxmphw5Yqji4gEkI/rXcqy\n"
-            + "OcY/fCIZ+gVT+yE2MCPF7Se4Tnl7tSvPxoUn6mOQ09AygyYVjlSCY02EAL/WxwUH\n"
-            + "6OCs6VYlNiBlPg7O2vHGzlzAd1aMmlG3ytlhb0SIbilaJn/wlQ2SEGySjIAP1qRH\n"
-            + "UXsTfW7oAjdqAY1CbCWg/0FnMBF+DnChH634dbLrS2OefcB70l61trEfRcHbMNTv\n"
-            + "9nVxDDCpaIdxsOfgWpe0GMG1qddRAxBIOVjNUFOL22xEFyaXnt/uagUtKQ7yejci\n"
-            + "bgTFBADcuhsfQaBX1G095iG2qr8Rx2T5GqNf9oZA+rbweWegqIH7MUXHI1KKwwJx\n"
-            + "C+rR5AgnxTSP614XI/AWB/txdelm8z0jLobpS6B1vzM2vRQ7hpwjJ3UvUkoQ5uYL\n"
-            + "DjaBqQi0w1cPJA79H0Yujc1zgdhATymz0uDL1BC2bHLIMuhelwQA80p07G1w8HLQ\n"
-            + "bTdgNwtDBMKIw39/ZyQy8ppxmpD4J6zf25r95g3er0r+njrHsa+72LnvexbedpKA\n"
-            + "4eiDJPN+l5jJOEWfL2WtGcqJ01bdFBPcl73tuwDJJtieUlKZH0jRjykuuUX8F+tJ\n"
-            + "yrmVoIGtawoeLKq3hMMOK4xi+sh3OrcD+wXIU24eO3YfUde5bhyaQplNMU5smIU0\n"
-            + "+looOEmFsZcTONgoN+FKrnm2TY9d4FHZ+QgtnksWHmmLxQJPtp9rHJ5BgdxMBPcK\n"
-            + "3w5GXRuWlOmqmnAb6vp0Q0yzVDLKCcwba0S23m3tbjZsLDcI7MG/knsp9gtL676D\n"
-            + "AsrpeF2+Apj0OwG0IFRlc3R1c2VyIFR3byA8dGVzdDJAZXhhbXBsZS5jb20+iQE+\n"
-            + "BBMBAgAoBQJVnUz/AhsDBQld/A8ABgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK\n"
-            + "CRBFMRpvN4oK7UZqCACWwQL/YvBK4b0m+R0dUdvAXeBx7DwOAnAodis9ZVqChb7R\n"
-            + "xcZQxF1Ti9mtCBPPQGuEs5wE2Ocrrq+L13r6bgW+1WOB1tZSDVxwL1PnZFw/SyAD\n"
-            + "RIDCZrOHiAkp82UnZwWAkk39GzNJtt1wTYDZFMTFUr2SPscXk1k7muS+ZfEFwNPD\n"
-            + "4tODo/poJKDYEJ80Z5UXXFQLDtsfdeIXMFIT449CYoq8XBMBfvyWl/LLpw0r3JI6\n"
-            + "pV/YdH3Oeuz8XkkEVzRxaxB6Zmeo5jSwjR/T8TKDGwwiuwiiT3SfkFSVdcjKulRu\n"
-            + "XSRNs1Ouf7/UC3cq4bG2WXWa85X1+HQRm7iuRHSOnQOYBFWdTP8BCADhhGxAA0pX\n"
-            + "5yBHwIgM1j0gw2h5nSsopDrO6t/sbRUcNxnRtBScgKZnP0sjRTYEUIwmZuseHMBo\n"
-            + "htVCuMaDt06qyZDvDk/98j3AeE5t2dgFnOIeqCrm/6aejbFcQOpxe6U29KJRCAxu\n"
-            + "wNtB15X1VH1Kj7B0gRSTu13n/5sUsi2lunoZoIvpIe9tZH4aXitCY2MCQH+hTyCy\n"
-            + "NBzlEa44kWz6LxUsPdo7I6rXkTr6Ot7wQh+97HCe042GIq65h0apgujyjhJidjch\n"
-            + "5ur1mngaSNSEyvbji2MGC+cd3wAIstG5a7xPd9MncY5Q/eH+hn96694k5bckottS\n"
-            + "yGm/3f2Ihfj1ABEBAAEAB/wP5H+mcTTrhe+57sEHuo9bQDocG+3fMtesHlRCept6\n"
-            + "vg1VQG4Va2GOtCCs7yMz4aNGz4jxOdB7bUkZJyFiRehG0+ahWi5b9JbSegf46Nm2\n"
-            + "54vt4icH2WtaEB04JaD/91k4yrunnzwVEAVDmhhIzjf4KbEjPLeBA7rF7zb0Gexq\n"
-            + "mdxEGO/6KdeQ6KOxkpWEqIIdl/mAGsYCprHeKL/XL+KXYr92nEbUcltmt59TTnoo\n"
-            + "00BQCPuHCdpcUd5nuaxpCZLM+BEpxtj0sinz0ofuWU9RI4K00R01MKXWMucdOhTZ\n"
-            + "kUy5dMx8wA07xbjkE/nH86N76Mty133OB7G3lBBDfO4PBADulfLzbjXUnS1kTKeP\n"
-            + "j/HF1E9qafzTDS/QD55OVajDq66A6zaOazKbURHNZmIqpLO4715+iNtrZQUEP3e1\n"
-            + "mwngeizvAv9luA9kJ1YDTCfsS5H5cYzavhfwuqBu7fQBm/PQqZplQuPCxgXEIBaY\n"
-            + "M0uvR0I/FSwFrepRN2IA6dAkrwQA8fpJEg8C9OLFzDf0rxV3eWwEelemN4E50Obu\n"
-            + "nxtg9IJWZ+QIWkRVLJ8if5+p85s2ieCw8hzEF0FyNfWUnfW5eoN4/j50loR4EbZS\n"
-            + "qOpUJGwr8ezyQN8PpduDOe9OQnUYAv9FY9Rk46L4937GDF2w5gdxyNdKO8yG+Z3A\n"
-            + "6/0DLZsEAOQsRUXIl1XLjkdugfFQ8V9Fv3AYWJt+8zknwcQ+Z3uOtyY2muCi9hX2\n"
-            + "BtuPojjwmN6x8wntMaUkzYHVSdz/cdx+na7VNS2kZHfnECWZGR6IHyRTJN5612yi\n"
-            + "e4MIdTE+BgL1HPq+VIPlMBehEksC5qM0WSq8baMsacGMYeAL8ntoRuyJASUEGAEC\n"
-            + "AA8FAlWdTP8CGwwFCV38DwAACgkQRTEabzeKCu1FNwgAif4eK2v7R3QubL2S6wmb\n"
-            + "1nsgRMgVYoxGBeUk2EK6WZ5IPor93ySd0ixRVNMRmJ8BLH3EMjZQTzkDG+BH6zFy\n"
-            + "xo6lLHw9NxQjI06tqQWgyyK0mEweVwB/zqtxiB4lNUpsNbqOZWnBJ3d6o1SsnD2Q\n"
-            + "3uwvP5fbfSIgdmUk3c0VMdgA+KzWjPD/PJIPujE+ckHhjn5cbDNw35/FuyhkLJfq\n"
-            + "lOG7SPvMNmCdJ1Pcqju9t7sf6b0BGPDOCL4gpuWKK7HJz9WxngNb3FSziLbyPLk1\n"
-            + "3ynADO+vEOR44LPyXE9kVxPusazsXlt9ayTOhELhwzw7sGFFu8E17Cpn7GnVj3tN\n"
-            + "9A==\n"
-            + "=qbV3\n"
-            + "-----END PGP PRIVATE KEY BLOCK-----\n");
-  }
-
-  /**
-   * A key that expired in 2006.
-   *
-   * <pre>
-   * pub   2048R/17DE1ACD 2005-07-08 [expired: 2006-07-08]
-   *       Key fingerprint = 1D9E EB79 DD38 B049 939D  9CAF 3CEC 781B 17DE 1ACD
-   * uid                  Testuser Three &lt;test3@example.com&gt;
-   * </pre>
-   */
-  public static final TestKey expiredKey() {
-    return new TestKey(
-        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "mQENBELOp0UBCACxholOPWuKhK+TYb88nvLUSCMvTLIFEpb5u3Eavr0wiluEzq6H\n"
-            + "55nswAD3dQm8DWxA7yUlEYjPr5btpw7V9441bb1+qtgZMJ10RTdEb/WjyctdGA99\n"
-            + "uOKBEarWbt8W+w6lyJ9NXy5bS/x5EwHHfoTFp4ff6ffHI5hbx1a00K8oxmitgd0X\n"
-            + "Mx86UmauFNJYupZOZG9gEcP4RbRp7e2pm4Jy1WLEOeg9Fdgm5e5Hj2nMkCSZ9BKV\n"
-            + "cxuOllSVzM/Zp0/4+RS9R57jKo3/V74Whwh9yQNgL9UxdNk7L0eGqvaT3EjXxjOc\n"
-            + "RCeJiucGN/0W2iq+V01/QGspp4SKtAogWBozABEBAAG0IlRlc3R1c2VyIFRocmVl\n"
-            + "IDx0ZXN0M0BleGFtcGxlLmNvbT6JAT4EEwECACgFAkLOp0UCGwMFCQHhM4AGCwkI\n"
-            + "BwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEDzseBsX3hrNYg0H/2CMm5/JDQNSuRFC\n"
-            + "ECWLrcOeimuvwbmkonNzOkvKbGXl73GStISAksRWAHBQED1rEPC0NkFCDeVZO7df\n"
-            + "SYLlsqKwV6uSh05Ra0F5XeniC12YpAyzoQyCGRS2wLaS822j0zUPXA8XLaO2blCu\n"
-            + "R+8sNu/oecMRcFK4S9NaApi3vdqBNhLiN1/Lpqn1LfB8uIO+eaUf4PmCWbaPgzSk\n"
-            + "qcPfKZmocNXdgLV5Q80n3hc2y2nrl+vDW2M+eVZuDHAok2BOD9uGKFfLAbaXLbX5\n"
-            + "btBW2L0UHtoEyiqkRfD6lX2laSLQmA6+eup7e4GS+s0vXBuVh8XEYddV6Yjt8H7/\n"
-            + "2thO41K5AQ0EQs6nRQEIAM/833UHK1DuFlOm7/n18dRMvs7BkXvg+hPquKWMG3be\n"
-            + "eE4sh1NG5DbRCdo6iacZLarWr3FDz7J9+wswRhtHCh3pGHEuaJk52vRjQxlkNh5F\n"
-            + "p5u2R4WF546bWqX45xPdLfHVTPyWB9q7aVxE+6Q+MHa6lMoyTVnTVCOy3nshiihw\n"
-            + "dxLsxaga+QmaL0bAR+dRcO6ucj7TDQXz1AJAVp26c0LXV9iErhFuuybUZKT0a9Aj\n"
-            + "FoumMZ6l+k30sSdjSjpBMsNvPos0dTPPRXUMu77o5sj+pHa4o8WctgB3o7BHQELp\n"
-            + "KgujZ2sKC9Nm395u6Q4cqUWihzb/Y7rIRuNHJarI7vUAEQEAAYkBJQQYAQIADwUC\n"
-            + "Qs6nRQIbDAUJAeEzgAAKCRA87HgbF94azRiBB/4vAyOOjUjK3lDWjHGs7mvEWJI/\n"
-            + "1MeLlGPswCSInJBa+HMiMI4tzq+hu5ejGThojNbmnL96GdzfDkMlP4Feyxb2rjtb\n"
-            + "NrD/R5tlXHmjX/QLzep4LCeMziP80fu8qUeiOej/Ecdny0w365PlMdt10RaYR8VE\n"
-            + "ZX/DAie6JfElnfQcG5q8TIOH3i71qxV+kIoPqKWfQ0MXrNEJ3BYFfDGdUt8U1Kq9\n"
-            + "OuIHVRgGS7mMSyjgNqqp7MBeMY+PFFZaZel5yoYVjb9d3L8XvVv2eoa/jPj5FUEU\n"
-            + "kE9uxNmwaD1PiV8DvBTYI+eQL4qzfu+3NTG2SfgQYtj5oiGHw8aL3U6QHDJb\n"
-            + "=d/Xp\n"
-            + "-----END PGP PUBLIC KEY BLOCK-----\n",
-        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "lQOYBELOp0UBCACxholOPWuKhK+TYb88nvLUSCMvTLIFEpb5u3Eavr0wiluEzq6H\n"
-            + "55nswAD3dQm8DWxA7yUlEYjPr5btpw7V9441bb1+qtgZMJ10RTdEb/WjyctdGA99\n"
-            + "uOKBEarWbt8W+w6lyJ9NXy5bS/x5EwHHfoTFp4ff6ffHI5hbx1a00K8oxmitgd0X\n"
-            + "Mx86UmauFNJYupZOZG9gEcP4RbRp7e2pm4Jy1WLEOeg9Fdgm5e5Hj2nMkCSZ9BKV\n"
-            + "cxuOllSVzM/Zp0/4+RS9R57jKo3/V74Whwh9yQNgL9UxdNk7L0eGqvaT3EjXxjOc\n"
-            + "RCeJiucGN/0W2iq+V01/QGspp4SKtAogWBozABEBAAEAB/4hGI3ckkLMTjRVa7G1\n"
-            + "YYSv4sr8dHXz0CVpZXKOo+Stef3Z4pZTK/BcXOdROvaXooD+EheAs6Yn4fpnT+/K\n"
-            + "IB7ZAx6C0OL8vz17gbPuBFltMZ/COUwaCi/gFCUfWQgqRp/SdHaOfCIuTxpAkDSS\n"
-            + "tpmWJ8eDDSFudMpgweb+SrF9DkCwp+FgUbzDRzO1aqzuu8PGihCHQt/pkhNHQ63/\n"
-            + "srDDqk6lIxxZHhv9+ucr3plDuijkvAa5/QDudQlucKDLtTPSD40UcqYnpg/V/RJU\n"
-            + "eBK0ZXmCIHpG9beHW/xdlwrK3eY4Z2sVDMm9TeeHmRYOCr5wQCyeLpMdAt0Ijk6a\n"
-            + "nINhBADI2lRodgnLvUKbOvVocz8WQjG1IXlL8iXSNuuHONijPXZiWh7XdkNxr9fm\n"
-            + "jRqzvZzYsWGT6MnirX2eXaEWJsWJHxTxJuiuOk0V/iGnV/d+jFduoKXNmB5k/ZB3\n"
-            + "6zySi7+STKNyIvnMATVsRoI/cNUwfmx53m6trFg581CnSiA82QQA4kSPw9OXmTKj\n"
-            + "ctlHrWsapWu+66pDVZw62lW6lvrd7t+m8liNb6VJuTnwIKVXJOQtUo1+GSMs0+YK\n"
-            + "wnd9FGq4jT8l0qBO4K/8B1HxppLC2S0ntC+CusxWMUDbdC2xg+G2W3oLwq3iamgz\n"
-            + "LvPTy1Pzs9PqDd6FXIdzieFy6J8W1+sEAKS3vjh7Z/PIVULZhdaohAd5Igd67S/Z\n"
-            + "BMWYNbBuJTnnb7DiOllLZSd2lR7IAKPKsUd6UY8uskOxI81hI116zNx17mIGFIIq\n"
-            + "DdDgRbvzMNEgNlOxg/BD01kXOS4fhnT2F6ca3VGTgUtOdcdF3M9MtePWQLBzEDPz\n"
-            + "8nx3O20HDupuQmG0IlRlc3R1c2VyIFRocmVlIDx0ZXN0M0BleGFtcGxlLmNvbT6J\n"
-            + "AT4EEwECACgFAkLOp0UCGwMFCQHhM4AGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheA\n"
-            + "AAoJEDzseBsX3hrNYg0H/2CMm5/JDQNSuRFCECWLrcOeimuvwbmkonNzOkvKbGXl\n"
-            + "73GStISAksRWAHBQED1rEPC0NkFCDeVZO7dfSYLlsqKwV6uSh05Ra0F5XeniC12Y\n"
-            + "pAyzoQyCGRS2wLaS822j0zUPXA8XLaO2blCuR+8sNu/oecMRcFK4S9NaApi3vdqB\n"
-            + "NhLiN1/Lpqn1LfB8uIO+eaUf4PmCWbaPgzSkqcPfKZmocNXdgLV5Q80n3hc2y2nr\n"
-            + "l+vDW2M+eVZuDHAok2BOD9uGKFfLAbaXLbX5btBW2L0UHtoEyiqkRfD6lX2laSLQ\n"
-            + "mA6+eup7e4GS+s0vXBuVh8XEYddV6Yjt8H7/2thO41KdA5gEQs6nRQEIAM/833UH\n"
-            + "K1DuFlOm7/n18dRMvs7BkXvg+hPquKWMG3beeE4sh1NG5DbRCdo6iacZLarWr3FD\n"
-            + "z7J9+wswRhtHCh3pGHEuaJk52vRjQxlkNh5Fp5u2R4WF546bWqX45xPdLfHVTPyW\n"
-            + "B9q7aVxE+6Q+MHa6lMoyTVnTVCOy3nshiihwdxLsxaga+QmaL0bAR+dRcO6ucj7T\n"
-            + "DQXz1AJAVp26c0LXV9iErhFuuybUZKT0a9AjFoumMZ6l+k30sSdjSjpBMsNvPos0\n"
-            + "dTPPRXUMu77o5sj+pHa4o8WctgB3o7BHQELpKgujZ2sKC9Nm395u6Q4cqUWihzb/\n"
-            + "Y7rIRuNHJarI7vUAEQEAAQAH+gNBKDf7FDzwdM37Sz8Ej7OsPcIbekzPcOpV3mzM\n"
-            + "u/NIuOY0QSvW7KRE8hwFlXjVZocJU/Z4Qqw+12pN55LusiRUrOq8eKuJIbl4QikI\n"
-            + "Dea8XUqM+CKJPV3YZXs6YVdIuzrRBSLgsB/Glff5JlzkEjsRYVmmnto8edETL/MK\n"
-            + "S9ClJqQiFKE4b01+Eh9oB/DfxzsiEf/a+rdRnWRh/jtpEwgeXcfmjhf+0zrzChu2\n"
-            + "ylQQ5QOuwQNKJP6DvRu/W5pOaKH9tPDR31SccDJDdnDUzBD7oSsXl06DcfMNEa8q\n"
-            + "PaNHLDDRNnqTEhwYSJ4r2emDFMxg7Kky+aatUNjAYk9vkgMEANnvumgr6/KCLWKc\n"
-            + "D3fZE09N7BveGBBDQBYNGPFtx60WbKrSY3e2RSfgWbyEXkzwm1VlB2869T1we0rL\n"
-            + "z6eV/TK5rrJQxJFHZ/anMxbQY0sCiOgqi6PKT03RTpA2N803hTym+oypy+5T6BFM\n"
-            + "rtjXvwIZN/BgAE2JjA70crTAd1mvBAD0UFNAU9oE7K7sgDbni4EhxmDyaviBHfxV\n"
-            + "PJP1ICUXAcEzAsz2T/L5TqZUD+LfYIkbf8wk2/mPZFfrCrQgCrzWn7KV1SHXkhf4\n"
-            + "4Sg6Y6p0g0Jl3mWRPiQ6ALlOVQIkp5V8z4b0hTF2c4oct1Pzaeq+ZkahyvrhW06P\n"
-            + "iaucRZb+mwP/aVTpkd4n/FyKCcbf9/KniYJ+Ou1OunsBQr/jzN+r0PKCb8l/ksig\n"
-            + "i/M0NGetemq9CxYsJDAyJs1aO4SWgx5LbfcMmyXDuJ3sL0ztFLOES31Mih3ZJebg\n"
-            + "xPpj2bB/67i2zeYRcjxQ116y23gOa2TWM8EE4TW7F/mQjw4fIPJ93ClBMIkBJQQY\n"
-            + "AQIADwUCQs6nRQIbDAUJAeEzgAAKCRA87HgbF94azRiBB/4vAyOOjUjK3lDWjHGs\n"
-            + "7mvEWJI/1MeLlGPswCSInJBa+HMiMI4tzq+hu5ejGThojNbmnL96GdzfDkMlP4Fe\n"
-            + "yxb2rjtbNrD/R5tlXHmjX/QLzep4LCeMziP80fu8qUeiOej/Ecdny0w365PlMdt1\n"
-            + "0RaYR8VEZX/DAie6JfElnfQcG5q8TIOH3i71qxV+kIoPqKWfQ0MXrNEJ3BYFfDGd\n"
-            + "Ut8U1Kq9OuIHVRgGS7mMSyjgNqqp7MBeMY+PFFZaZel5yoYVjb9d3L8XvVv2eoa/\n"
-            + "jPj5FUEUkE9uxNmwaD1PiV8DvBTYI+eQL4qzfu+3NTG2SfgQYtj5oiGHw8aL3U6Q\n"
-            + "HDJb\n"
-            + "=RrXv\n"
-            + "-----END PGP PRIVATE KEY BLOCK-----\n");
-  }
-
-  /**
-   * A self-revoked key with no expiration.
-   *
-   * <pre>
-   * pub   2048R/7CA87821 2015-07-08 [revoked: 2015-07-08]
-   *       Key fingerprint = E328 CAB1 1F7E B1BC 1451  ABA5 0855 2A17 7CA8 7821
-   * uid                  Testuser Four &lt;test4@example.com&gt;
-   * </pre>
-   */
-  public static final TestKey selfRevokedKey() {
-    return new TestKey(
-        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "mQENBFWdTZwBCAC1jukp5mlitfq2sAmdtx1s1VbWh+buDbBY2kWcxbbssczozFUP\n"
-            + "Ii67wPwjRbn3GM5+jY3GMsqKIrdyDlxeTxGWoU/qa2YkCQzgFGD/XJBqkVpP6osm\n"
-            + "qFYSP0xST1iBkatkMHq5KMjrX2q2bGVLlchLF9eHrWSefMcfff1Vs/Y8F2RCo38y\n"
-            + "gH88mbcvgyC+zq6Q2T3h5RiLK2IaZDNsn3uUoIMYHxI6oYtXXMSXRJlLJvamXVrB\n"
-            + "7QAq8L8cNikJjZMz+bHtLtGDyVVp9tqo4yvMrHe6BYmBUte3tPYQlDVdEo7UqepR\n"
-            + "uT7JbBOGBoD+9ngDrDggPUBAoa0h3VNOTyoDABEBAAGJAR8EIAECAAkFAlWdVXkC\n"
-            + "HQIACgkQCFUqF3yoeCH4lgf/aBdTYqnwL1lreHbQaUXI0/B2zlMuoptoi/x+xjIB\n"
-            + "7RszzaN3w0n4/87kUN2koNtgNymv2ccKTR1PiX+obscJhsWzNbz3/Cjtr/IpEQRd\n"
-            + "E6qRptHDk0U2cHW4BYDSltndOktICdhWCWYLDxJHGjdyXqqqdEEFJ24u2fUJ3yF3\n"
-            + "NF2Bxa6llrmLb2fVeVYBzQSztQopKRWP9nt3ySoeJQqRWjNBN2j7cC93nrLHZTvB\n"
-            + "L/sWuTq5ecbXeeNVzxoBd21jmGrIUPNwGdDKdbTB0CjpLpVHOTwGByeRKQXhMlQB\n"
-            + "pK96wUpxxtShtOjNjN1s9GEyLHwDiHSuHNYs/AxxFzf9nbQhVGVzdHVzZXIgRm91\n"
-            + "ciA8dGVzdDRAZXhhbXBsZS5jb20+iQE4BBMBAgAiBQJVnU2cAhsDBgsJCAcDAgYV\n"
-            + "CAIJCgsEFgIDAQIeAQIXgAAKCRAIVSoXfKh4IXsHCACSm9RIdxxqibAaxh+nm6w5\n"
-            + "F5a6Hju5cdmkk9albDoQYh2eM8E5NdDq+r0qSSe2+ujDaQ4C95DZNJQESvIcHHHb\n"
-            + "9AECrBfS8Yk86rX8hxVeYQczMkB9LdBHximTSoOr8L/eAxBE/VXDwust6EAe6Q1A\n"
-            + "a3tlTTvCfcmw4PipvtP7F6UzFaq+QU6fvARpBATOcvVc2JU4JQOrxuNEQ2PKrSti\n"
-            + "75S5mnVWm0pRebM+EorWBtlA0eOAeLNqCp87UwLdvUyOTRZT4DJ51eTxfrFADXrI\n"
-            + "9/ejs3/YxCPYxaPicAlcldduuajU/s+9ifrUn0Npg2ILl8mQkNzqeerlBeecUV4E\n"
-            + "uQENBFWdTZwBCADEOsK+mFQ/2uds9znkmAqrk24waVBpyPGrTTXtXX0dKhtQAsh6\n"
-            + "QkZGkjLTnKxEsa9syqVckw+1JtCh44SP1gjqDUoShpBz5wIuksZ7q96Hx+F0TVG/\n"
-            + "njS6GrWvwKhL2Lb9hYfdlrZiYtOOi0iiOzud25H/Ms15kC8tuQm7NWtANJJF4Sxo\n"
-            + "Bxor6L/F4zunEkTL0L9/dp4qVrw23fJVKE38cSdxjB0u1qSDzLV/u0QJqlYxJAiE\n"
-            + "ciwQN2uVnTY1/XSpouMy6LvbYU7B2uU/WohNmH3RiN/fQ6jJm4x+fCZ8+zqXMiZn\n"
-            + "G2fPkwmxxK9cl64YnNGcTwsVt6BMbCHk9jHxABEBAAGJAR8EGAECAAkFAlWdTZwC\n"
-            + "GwwACgkQCFUqF3yoeCGOdwf/TmoxH3pFBm/MDhY5Ct5FO0KvsgQk2ZgDa68HyQ8j\n"
-            + "QYi1FUCtyDjsxf5KTfyvzpzcTpS7cyOwcJNtTj6UixwATkcivvYWYoOXghAsTo4f\n"
-            + "1+j/x6ECq1+nYE6NpcAN7VRJpYMk2UO2qlhHCesTPGzsHchL7mwiYdhGrdiWGTpd\n"
-            + "KI9WfOYDZZ9ZSw/QINJUyTRxrDnauOvVbhbAXc7jdKCkRQRZpsNlF//1Stg6nstj\n"
-            + "FJ7SrjVdsMJNlihT6fG5ujmrty1/6b1VCLkIQfW5cWvzRzTBFytq7i4PVKh3u7Oz\n"
-            + "tt9lf8s50zt2uBE/AKMkyE6IJLsBWpJPk7iFKkHGDx044Q==\n"
-            + "=477N\n"
-            + "-----END PGP PUBLIC KEY BLOCK-----\n",
-        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "lQOYBFWdTZwBCAC1jukp5mlitfq2sAmdtx1s1VbWh+buDbBY2kWcxbbssczozFUP\n"
-            + "Ii67wPwjRbn3GM5+jY3GMsqKIrdyDlxeTxGWoU/qa2YkCQzgFGD/XJBqkVpP6osm\n"
-            + "qFYSP0xST1iBkatkMHq5KMjrX2q2bGVLlchLF9eHrWSefMcfff1Vs/Y8F2RCo38y\n"
-            + "gH88mbcvgyC+zq6Q2T3h5RiLK2IaZDNsn3uUoIMYHxI6oYtXXMSXRJlLJvamXVrB\n"
-            + "7QAq8L8cNikJjZMz+bHtLtGDyVVp9tqo4yvMrHe6BYmBUte3tPYQlDVdEo7UqepR\n"
-            + "uT7JbBOGBoD+9ngDrDggPUBAoa0h3VNOTyoDABEBAAEAB/4jqeZoOiACaV/Nygeh\n"
-            + "iOpJSiDsNDbrFRpKYdnhwT69APIQ2q5sshi+/dopbZVpkeBiIJk0UR7TAp3JVEPV\n"
-            + "rK92SMqjcCRYuMRkMeyZzMt7e4DjiN17ov6BSBjMZFSs4vnpTNKWk4ngHlaebe15\n"
-            + "6vq0sYK/XpKQxU7yAzQjxR190P/F+QEL98zVG/9uqM8PupfdSm4Smp2cIpfta+JD\n"
-            + "mO23HC6jAEm2RFwklovzgK3rbIjyiMuowIkAKx5xxRvpxMHf1l566b9zJrRi0xau\n"
-            + "vp4J/lnBJtTMzCbsaaFxhrj23xvTXaWR+UkaGPCv7wheXQ9K7NAHwmH8YrR+cZx7\n"
-            + "KbDlBADUTHZ+OhNslx/rkjRWrFuK9p49x7qxQc26kcqlGPbW6KOAMdUpwneQbhCG\n"
-            + "a36E/GAZgsgQ4SUqn37EVCtd2Y9Dp0inPAujcZXSwgDHev6ea7fzbxT9KLtEgvQN\n"
-            + "0vrFJDCPIt0wzGqNDw4wgFjF2rAafBO//Wu5K5QLW4hfzSguRQQA2u6DpVja/FYY\n"
-            + "UHVh2HLiB8th4T+qogOsBe5mKEsGRPXtAh7QzJu36C4PJyHeNlmlMx+15cCFnovj\n"
-            + "6cLpGn6ZP4okLyq2+VsW7wh/Vir+UZHoAO/cZRlOc1PsaQconcxxq30SsbaRQrAd\n"
-            + "YargKlXU7HMFiK34nkidBV6vVW0+P6cD/jYRInM983KXqX5bYvqsM1Zyvvlu6otD\n"
-            + "nG0F/nQYT7oaKKR46quDa+xHMxK8/Vu1+TabzY8XapnoYFaFvrl/d2rUBEZSoury\n"
-            + "z2yfTyeomft9MGGQsCGAJ95bVDT+jBoohnYwfwdC7HG3qk0aK/TxFyUqvMOX7SFe\n"
-            + "YT55n3HlD9InST+0IVRlc3R1c2VyIEZvdXIgPHRlc3Q0QGV4YW1wbGUuY29tPokB\n"
-            + "OAQTAQIAIgUCVZ1NnAIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQCFUq\n"
-            + "F3yoeCF7BwgAkpvUSHccaomwGsYfp5usOReWuh47uXHZpJPWpWw6EGIdnjPBOTXQ\n"
-            + "6vq9Kkkntvrow2kOAveQ2TSUBEryHBxx2/QBAqwX0vGJPOq1/IcVXmEHMzJAfS3Q\n"
-            + "R8Ypk0qDq/C/3gMQRP1Vw8LrLehAHukNQGt7ZU07wn3JsOD4qb7T+xelMxWqvkFO\n"
-            + "n7wEaQQEznL1XNiVOCUDq8bjRENjyq0rYu+UuZp1VptKUXmzPhKK1gbZQNHjgHiz\n"
-            + "agqfO1MC3b1Mjk0WU+AyedXk8X6xQA16yPf3o7N/2MQj2MWj4nAJXJXXbrmo1P7P\n"
-            + "vYn61J9DaYNiC5fJkJDc6nnq5QXnnFFeBJ0DmARVnU2cAQgAxDrCvphUP9rnbPc5\n"
-            + "5JgKq5NuMGlQacjxq0017V19HSobUALIekJGRpIy05ysRLGvbMqlXJMPtSbQoeOE\n"
-            + "j9YI6g1KEoaQc+cCLpLGe6veh8fhdE1Rv540uhq1r8CoS9i2/YWH3Za2YmLTjotI\n"
-            + "ojs7nduR/zLNeZAvLbkJuzVrQDSSReEsaAcaK+i/xeM7pxJEy9C/f3aeKla8Nt3y\n"
-            + "VShN/HEncYwdLtakg8y1f7tECapWMSQIhHIsEDdrlZ02Nf10qaLjMui722FOwdrl\n"
-            + "P1qITZh90Yjf30OoyZuMfnwmfPs6lzImZxtnz5MJscSvXJeuGJzRnE8LFbegTGwh\n"
-            + "5PYx8QARAQABAAf8CeTumd6jbN7USXXDyQdzjkguR6mfwN29dcY8YF4U52oOm3+w\n"
-            + "bR23XmqTvoDJXONatZEYOm093wP4hBktP3Vq2KZX5Ew9r2JoBUIoWOcHHvCQqSUW\n"
-            + "6KMJBJNBMv3zXnOscmcPvTgStS5HfYn/XRLAhEqkd2ov2x/OiS8p0vM0F7YYSOdu\n"
-            + "X6/nHeBCM5QSJl00kgcaeQYdIGL0bPv9DnoeAC2/yITEvtvs+MHZ7FjH8A45QjWn\n"
-            + "DwfVoLg7WOc3wJtqJ55/r/2pylrWz0YYM8s6I3gbDilCF+Wb8tEIOaWJEwY73J1/\n"
-            + "KQG5qlO3/hBlO80DtzNmi3ylRUuzGhTxQfvemwQA3EuZ+E48LJ3dwtdJhh5mFlWI\n"
-            + "Ket21e5v1mqMxuLhf5/2CYcifM08u3EsEUdIr7egF25Sea8otqmCYcG8FuB37VY/\n"
-            + "Hd4G/+YVVaaAB8EU6u64YfSswhzr0R2qWVLtkJr0EAephzdPdoUEtKDSdTxnXiDV\n"
-            + "3vSqLWtZekScLa979uMEAOQIodJwxSvveKQWILjK67ZJr56X8YQZWA6rFsr1xMY0\n"
-            + "N0GH+5k0k+tr4wT3H9uk9ZM1Z11G3c01mhzCNg5roFoKtftKUZRKxmbfjjDmAofl\n"
-            + "bA6EZ0WHLdOwDLLTuXK09IsjjSHq0YHOxIlgFzIreuoxtz27bEEGhVFQg7xb0Lgb\n"
-            + "A/9LP8i32L7/CHsuN0q4YjhJkkaB6JWUQMFqWwoAXALG3rnw/CGRYHmHpiAuSeHR\n"
-            + "dSlZzndVi5poNC/d27msTx7ZuWlN7nOyywHBCTWV/nstm2I9rDhrHK7Axgq0Vv0y\n"
-            + "bWAurUmEgDJHU3ZpsNVt4e30FooXIDLR4cnpRM7tILv39D4giQEfBBgBAgAJBQJV\n"
-            + "nU2cAhsMAAoJEAhVKhd8qHghjncH/05qMR96RQZvzA4WOQreRTtCr7IEJNmYA2uv\n"
-            + "B8kPI0GItRVArcg47MX+Sk38r86c3E6Uu3MjsHCTbU4+lIscAE5HIr72FmKDl4IQ\n"
-            + "LE6OH9fo/8ehAqtfp2BOjaXADe1USaWDJNlDtqpYRwnrEzxs7B3IS+5sImHYRq3Y\n"
-            + "lhk6XSiPVnzmA2WfWUsP0CDSVMk0caw52rjr1W4WwF3O43SgpEUEWabDZRf/9UrY\n"
-            + "Op7LYxSe0q41XbDCTZYoU+nxubo5q7ctf+m9VQi5CEH1uXFr80c0wRcrau4uD1So\n"
-            + "d7uzs7bfZX/LOdM7drgRPwCjJMhOiCS7AVqST5O4hSpBxg8dOOE=\n"
-            + "=5aNq\n"
-            + "-----END PGP PRIVATE KEY BLOCK-----\n");
-  }
-
-  /**
-   * A key with an additional user ID.
-   *
-   * <pre>
-   * pub   2048R/98C51DBF 2015-07-30
-   *       Key fingerprint = 42B3 294D 1924 D7EB AF4A  A99F 5024 BB44 98C5 1DBF
-   * uid                  foo:myId
-   * uid                  Testuser Five <test5@example.com>
-   * sub   2048R/C781A9E3 2015-07-30
-   * </pre>
-   */
-  public static TestKey validKeyWithSecondUserId() {
-    return new TestKey(
-        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "mQENBFW6jd4BCACrf+BZS3lntuWq2DWPOG07/BUWhx3RSoiS3JBuKEDmlsjswKcp\n"
-            + "JHT+p2tqH52XbujMlzNjAQcZjJwfOMt6Fg7zd3F8cwYQdCE/W5dpMs/mqdeEz6GL\n"
-            + "VJDZ0Y5wwz54ZQHp91Xq6uejxt5qffeTQk5cToQZ0RVx3iwBc+2P3iYJqMFmJzj8\n"
-            + "djabEoF4D50iI5tY8moE83VcXJ5Y4xn+5Z5AThmlfrMP6gIdG0b4lEe1tsnJC6AG\n"
-            + "GUU6VkzK6E1Tp93Y0brtWpJKi9Gt6eUqvWhZtPEdFVCFbLTpezUdRFEuaFbGg5pn\n"
-            + "9K/DceahFmquDJOHVgawt6erlq/ie7QEEld/ABEBAAG0IVRlc3R1c2VyIEZpdmUg\n"
-            + "PHRlc3Q1QGV4YW1wbGUuY29tPokBOAQTAQIAIgUCVbqN3gIbAwYLCQgHAwIGFQgC\n"
-            + "CQoLBBYCAwECHgECF4AACgkQUCS7RJjFHb+/MAf9FKZatGcuOIoYqwGQQneyc63v\n"
-            + "3H/PyhvYF1nuKNftmhqIiUHec9RaUHQkgam6LRoonkDfIpNlQVRv2XBV2VOAOFVO\n"
-            + "RyQ/Tv7/xtpqGZqivV0yn2ZXbCceA627Vz7gP4gkO0ZJ0JsYJTc/5wO+nVG5Lohu\n"
-            + "/zdUofEbFAvcXs+Z1uXnUDdeGn47Lf1xZ2XOHOI0aQW4DdNaFoAd+AOTe0W3iB6W\n"
-            + "paCIGno69CyNHNnWjJCSD33oLVaXyvbgw5UoyITvSqRnPyLGIc6dsqDLT59ok0Fk\n"
-            + "t4jtiGu9aze4n59GbtSjmWQgzbLCQWhK9K7UCcSLYNKXVyMha2WapBO156V027QI\n"
-            + "Zm9vOm15SWSJATgEEwECACIFAlW6jwYCGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4B\n"
-            + "AheAAAoJEFAku0SYxR2/zZUH/1BwPsResHLDSmo6UdQyQGxvV0NcwBqGAPSLHr+S\n"
-            + "PHEaHEIYvOywNfWXquYrECa/5iIrXuTQmCH0q8WRcz1UapDCeD8Ui82r+3O8m6gk\n"
-            + "hIR5VAeza+x/fGWhG342PvtpDU7JycDA3KMCTWtcAM89tFhffzuEQ3f5p5cMTtZk\n"
-            + "/23iegXbHd61vojYO17QYEj+qp9l0VNiyFymPL3qr5bVj/xn/mXFj+asj0L2ypIj\n"
-            + "zC36FkhzW5EX2xgV9Cl9zu7kLMTm+yM+jxbMLskYkG8z/D+xBQsoX8tEIPlxHLhB\n"
-            + "miEmVuZrp91ArRMWa3B7PYz7hQzs+M/bxKXcmWxacggTOvy5AQ0EVbqN3gEIAOlq\n"
-            + "mwdiXW0BQP/iQvIweP1taNypAvdjI2fpnXkUfBT5X/+E/RjYOHQEAzy8nEkS+Y0l\n"
-            + "MLwKt3S0IVRvdeXxlpL6Tl+P8DkcD5H+uvACrg9rtgbbNSoQtc9/3bknG9hea6xi\n"
-            + "6SBH1k9Y2RInIrwWslfKmuNkyZVhxPKypasBsvyhOWLlpCngGiCa74KJ1th1WKa2\n"
-            + "aaDqcbieBTc1mtsXR6kBhJZqK+JYBoHriUQMs7nyXxn2qyv6Lehs/tHlrBZ7j16S\n"
-            + "faQzYoBi1edVrpFr/CuGk6RNKxG9vi/uAA9q2cLCMjjyfMH4g0G2l0HuDPQLA9wi\n"
-            + "BfusEC+OceaeFKtS9ykAEQEAAYkBHwQYAQIACQUCVbqN3gIbDAAKCRBQJLtEmMUd\n"
-            + "vw/DB/9Qx9m1eSdddqz/fk16wJf7Ncr2teVvdQOjRf/qo43KDKxEzeepjgypG1br\n"
-            + "St7U4/MlPygJLBDB4pXp0kaKt+S/aqLpEGSGzQ1FysM8oY6K0e1Kbf6nMaQS8ATG\n"
-            + "aD377FrUJ42NV4JS+NGlwaM9PhpRVm5n8iCzRs9HtlTyfCBkNGDjGOSdWcah2m6T\n"
-            + "fEQdD+XVDN1ZC8zAnc8FW28YOTeTjX079okP6ZCjLJ16VZ7eiHFkrNbS9Dl4SPNK\n"
-            + "eElvsZLBaf8t4RQXFFKwRq4BW+zS8zm9E2H6bZ9yGrmgIREzyRPpwU98g8yrabu0\n"
-            + "54w16Vp/SVViJs7nTMSug0WREyd2\n"
-            + "=ldwB\n"
-            + "-----END PGP PUBLIC KEY BLOCK-----\n",
-        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "lQOYBFW6jd4BCACrf+BZS3lntuWq2DWPOG07/BUWhx3RSoiS3JBuKEDmlsjswKcp\n"
-            + "JHT+p2tqH52XbujMlzNjAQcZjJwfOMt6Fg7zd3F8cwYQdCE/W5dpMs/mqdeEz6GL\n"
-            + "VJDZ0Y5wwz54ZQHp91Xq6uejxt5qffeTQk5cToQZ0RVx3iwBc+2P3iYJqMFmJzj8\n"
-            + "djabEoF4D50iI5tY8moE83VcXJ5Y4xn+5Z5AThmlfrMP6gIdG0b4lEe1tsnJC6AG\n"
-            + "GUU6VkzK6E1Tp93Y0brtWpJKi9Gt6eUqvWhZtPEdFVCFbLTpezUdRFEuaFbGg5pn\n"
-            + "9K/DceahFmquDJOHVgawt6erlq/ie7QEEld/ABEBAAEAB/9MIlrQiWb+Gf3fWFh+\n"
-            + "mkg0Bva9p4IfNX1n5S7hGFGnjGzqXaRX6W1e16gh1qM5ZO1IVh9j5kLmnrt4SNhb\n"
-            + "/Irqnq3s14trpoJUBC81bm9JMUESHrLSjdo4OIWJncOP4xd0bG7h+SKYXGLE1+Me\n"
-            + "pqLu65RNebqRcFYM1xAxfCdaxatcz+LrW5ZX+6T/Gh/VCHRkkzzVIZO1dDBbyU2C\n"
-            + "JrNcfHSvNrjzfqYHtwfsk/lwcuY9pqkYcuwZ2IM+iWKit+WyCR2BzOpG/Sva1t8b\n"
-            + "7B7ituQCFMCv5IiaAoaSKX/t/0ucWCoT1ttih8LdwgEE0kgij/ZUfRxCiL9HmtLy\n"
-            + "ad9BBADBGYWv6NiTQiBG7+MZ+twCjlSL7vq8iENhQYZShGHF9z+ju7m8U1dteLny\n"
-            + "pC3NcNfCgWyy+8lRn1e6Oe6m7xL83LL3HJT5nIy9mpsCw/TIrrkzkoE+VpkEIL/o\n"
-            + "Yeoxauah4SU7laVD29aAQZ3TqwSwx0sJwPjsj73WjjqtzJfFkQQA410ghqMbQZN1\n"
-            + "yJzXgVAj162ZwTi961N5iYmqTiBtqGz1UfaNBJWdJMkCmhMTsiOtm1h4zUQRuEH+\n"
-            + "yq1xhKOGf15dB/cLSMj2KpVVlvgLoVmYDugSER8Q23juilY7iaf0bqo9q1sTHpn9\n"
-            + "O7Oin/9J3sz+ic45vDh4aa74sOzfhA8EAJwAFEWLrGSxtnYJR5vQNstHIH1wtQ5G\n"
-            + "ZUZ57y9CbDkKrfCQvd0JOBjfUDz+N8qiamNIqfhQBtlhIDYgtswiG+iGP/2G0l6S\n"
-            + "j9DHNe2CYPUKgy+zQiRnyNGE2XUfcE+HuNDfu3AryPqaD8vLLw8TnsAgis3bRGg+\n"
-            + "hhrAC1NyKfDXTg20IVRlc3R1c2VyIEZpdmUgPHRlc3Q1QGV4YW1wbGUuY29tPokB\n"
-            + "OAQTAQIAIgUCVbqN3gIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQUCS7\n"
-            + "RJjFHb+/MAf9FKZatGcuOIoYqwGQQneyc63v3H/PyhvYF1nuKNftmhqIiUHec9Ra\n"
-            + "UHQkgam6LRoonkDfIpNlQVRv2XBV2VOAOFVORyQ/Tv7/xtpqGZqivV0yn2ZXbCce\n"
-            + "A627Vz7gP4gkO0ZJ0JsYJTc/5wO+nVG5Lohu/zdUofEbFAvcXs+Z1uXnUDdeGn47\n"
-            + "Lf1xZ2XOHOI0aQW4DdNaFoAd+AOTe0W3iB6WpaCIGno69CyNHNnWjJCSD33oLVaX\n"
-            + "yvbgw5UoyITvSqRnPyLGIc6dsqDLT59ok0Fkt4jtiGu9aze4n59GbtSjmWQgzbLC\n"
-            + "QWhK9K7UCcSLYNKXVyMha2WapBO156V0250DmARVuo3eAQgA6WqbB2JdbQFA/+JC\n"
-            + "8jB4/W1o3KkC92MjZ+mdeRR8FPlf/4T9GNg4dAQDPLycSRL5jSUwvAq3dLQhVG91\n"
-            + "5fGWkvpOX4/wORwPkf668AKuD2u2Bts1KhC1z3/duScb2F5rrGLpIEfWT1jZEici\n"
-            + "vBayV8qa42TJlWHE8rKlqwGy/KE5YuWkKeAaIJrvgonW2HVYprZpoOpxuJ4FNzWa\n"
-            + "2xdHqQGElmor4lgGgeuJRAyzufJfGfarK/ot6Gz+0eWsFnuPXpJ9pDNigGLV51Wu\n"
-            + "kWv8K4aTpE0rEb2+L+4AD2rZwsIyOPJ8wfiDQbaXQe4M9AsD3CIF+6wQL45x5p4U\n"
-            + "q1L3KQARAQABAAf8C+2DsJPpPEnFHY5dZ2zssd6mbihA2414YLYCcw6F7Lh1nGQa\n"
-            + "XuulruAJnk/xGJbco8bTv7g4ecE+tsbfWnnG/QnHeYCsgO6bKRXATcWFSYpyidUn\n"
-            + "2VdzQwBAv1ZtSNhCXlPLn/erzvA2X4QadUwfnvbehWJAHt8ZJmHUr3FtyRUHEdCK\n"
-            + "2EXsBWnzPCcqHZOMvcbSINSqBFGzVXkOZsMFvPTNIUYRHz8NbJT/OPiOmyBshXpS\n"
-            + "t8w3QqZhBcTT3NZo3kgxN1RygaTa10ytB2cxTCVuD8hmUBaV9gakdfMYkVJds7/T\n"
-            + "ZY3It68F0vitBnqpppZQ+NFgr/vwVg0p3gbmAQQA79zsWPvyIqYvyJhmiKvLIpev\n"
-            + "569ho8tC9xx+IZ5WnjN8ZADlb9brAdA9cqGfBgZkpZUhngCRVOYUIco+m2NYkEJm\n"
-            + "BsSTTM77dqU55DRloJ3FtBwCPXHkwg9P/FHMMYYGyLpQTSB92hXk8yomo+ozX7kx\n"
-            + "DtUHZIrir/rr0lQe+GkEAPkep9V5jBmfHMArnfji7Nfb1/ZjrSAaK+rtqczgm+6j\n"
-            + "ubY/0DpM/6gm+/8X27WFw2m45ncH3qNvOe4Qm40EmgmHkXsdQyU0Fv7uXc9nBYoo\n"
-            + "G6s7DWLY4VAqWwPsvbqgpSp/qdGn9nlcJjjY1HtfU7HM3xysT7TJ2YVhYHlJdjDB\n"
-            + "A/0alBcYtHvaCJaRLWX4UiashbfETWAf/4oHlERjkXj64qOdsGnD6CD99t9x91Ue\n"
-            + "pClPsLDFvY8/HxWX7STA9pQZAa2ZdJd8b58Rgy9TBShw2mbz2S6Cbw77pP/WEjtJ\n"
-            + "pJuS2gDp70H01fYRaw7YH32CfUr1VeEv7hTjk/SNVteIZkkOiQEfBBgBAgAJBQJV\n"
-            + "uo3eAhsMAAoJEFAku0SYxR2/D8MH/1DH2bV5J112rP9+TXrAl/s1yva15W91A6NF\n"
-            + "/+qjjcoMrETN56mODKkbVutK3tTj8yU/KAksEMHilenSRoq35L9qoukQZIbNDUXK\n"
-            + "wzyhjorR7Upt/qcxpBLwBMZoPfvsWtQnjY1XglL40aXBoz0+GlFWbmfyILNGz0e2\n"
-            + "VPJ8IGQ0YOMY5J1ZxqHabpN8RB0P5dUM3VkLzMCdzwVbbxg5N5ONfTv2iQ/pkKMs\n"
-            + "nXpVnt6IcWSs1tL0OXhI80p4SW+xksFp/y3hFBcUUrBGrgFb7NLzOb0TYfptn3Ia\n"
-            + "uaAhETPJE+nBT3yDzKtpu7TnjDXpWn9JVWImzudMxK6DRZETJ3Y=\n"
-            + "=uND5\n"
-            + "-----END PGP PRIVATE KEY BLOCK-----\n");
-  }
-
-  /**
-   * A key revoked by a valid key, due to key compromise.
-   *
-   * <p>Revoked by {@link #validKeyWithoutExpiration()}.
-   *
-   * <pre>
-   * pub   2048R/3434B39F 2015-10-20 [revoked: 2015-10-20]
-   *       Key fingerprint = 931F 047D 7D01 DDEF 367A  8D90 8C4F D28E 3434 B39F
-   * uid                  Testuser Six &lt;test6@example.com&gt;
-   * </pre>
-   */
-  public static TestKey revokedCompromisedKey() throws Exception {
-    return new TestKey(
-        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "mQENBFYmpXkBCACqaLz51DcWQmfOJnat9iHSySfSHwbKfVvoN43Ba2cf/D/PadRc\n"
-            + "HLgc+91k2yk1kV1LnMdvUGj5zZ84ZqrQx3f1WeItnzZpqxtmQS/GSxCp9EY/s7w6\n"
-            + "5i86R/k9Tzgvk0B7dKZJXbM/OWxxDkkxHWE3Un9wreX7bDU5b9D2knHRiNFqH9ZJ\n"
-            + "KqDIFZqH9WTUxNZcHz20sTCRIMfvsAwf2vRU5N5xTu4Mbk6JFc7BAj7h1f/mYEPo\n"
-            + "CTyB1jV/DSDVdn1FjJVocSg6W/CvsYF9hKFYjJHl4VXdePTpnOjHhJLL0QWk0TMe\n"
-            + "xYeUi/xDr5DeMxTmi7F7BFaQEF+KmUM46e+9ABEBAAGJATAEIAECABoFAlYmq1gT\n"
-            + "HQJ0ZXN0NiBjb21wcm9taXNlZAAKCRDtBiXcRjKKjIm6B/9YwkyG4w+9KUNESywM\n"
-            + "bxC2WWGWrFcQGoKxixzt0uT251UY8qxa1IED0wnLsIQmffTQcnrK3B9svd4HhQlk\n"
-            + "pheKQ3w5iluLeGmGljhDBdAVyS07jYoFUGTXjwzPAgJ3Dxzul8Q8Zj+fOmRcfsP9\n"
-            + "72kl6g2yEEbevnydWIiOj/vWHVLFb54G8bwXTNwH/FXQsHuPYxXZifwyDwdwEQMq\n"
-            + "0VTZcrukgeJ+VbSSuq+uX4I3+kJw5hL49KYAQltQBmTo3yhuY/Q+LkgcBv/umtY/\n"
-            + "DrUqSCBV1bTnfq5SfaObkUu22HWjrtSFSjnXYyh+wyTG3AXG3N9VPrjGQIJIW1j6\n"
-            + "9QM0iQE3BB8BAgAhBQJWJqYUFwyAAQSup+0vghEz5bEo0e0GJdxGMoqMAgcAAAoJ\n"
-            + "EIxP0o40NLOfYd4H/3GpfxfJ+nMzBChn1JqFrKOqqYiOO4sUwubXzpRO33V2jUrU\n"
-            + "V75PTWG/6NlgDbPfKFcU0qZud6M2EQxSS9/I20i/MpRB7qJnWMM/6HxdMDJ0o/pN\n"
-            + "4ImIGj38QTIWx0DS9n3bwlcobl7ZlM8g2N1kv5jQPEuurffeJRS4ny4pEvCCm2IS\n"
-            + "SGOuB0DVtYHGDrJLQ0k4mDkEJuU8fP5un8mN8I8eAINlsTFpsTswMXMiptZTm5SI\n"
-            + "5QZlG3m5MvvckngYdhynvCWc6JHGt1EHXlI4A5Qetr/4FbNE4uYcEEhyzBy4WQfi\n"
-            + "QCPiIzzm3O4cMnr9N+5HzYqRhu2OveYm86G2Rxq0IFRlc3R1c2VyIFNpeCA8dGVz\n"
-            + "dDZAZXhhbXBsZS5jb20+iQE4BBMBAgAiBQJWJqV5AhsDBgsJCAcDAgYVCAIJCgsE\n"
-            + "FgIDAQIeAQIXgAAKCRCMT9KONDSzn2XtB/4wl4ctc3cW9Fwp17cktFi6md8fjRiR\n"
-            + "wE/ruVKIKmAHzeMLBoZn4LZVunyNCRGLZfP+MUs4JhLkp8ioTzUB7xPl9k94FXel\n"
-            + "bObn9F0T7htjFLiFAOMeykneylk2kalTt6IBKtaOPn+V6onBwO+YHbwt+xLMhAWj\n"
-            + "Z/WA0TIC1RIukdzWErhd+9lG8B9kupGC5bPo/AgCPoajPhS1qLrth+lCsNJXT/Rt\n"
-            + "k6Jx5omypxMXPzgzNtULMFONszaRnHnrCHQg/yJZDCw3ffW5ShfyfWdFM65jgEKo\n"
-            + "nMKLzy9XV+BM6IJQlgHCBAP8WHKSf4qMG4/hEWLrwA/bTQ7w0DSV88msuQENBFYm\n"
-            + "pXkBCACzIMFDC6kcV58uvF3XwOrS3DmKNPDNzO/4Ay/iOxZbm+9NP8QWEEm+AzCt\n"
-            + "ZMfYdZ8C3DjuzxkhcacI/E5agZICds6bs0+VS7VKEeNYp/UrTF9pkZNXseCrJPgr\n"
-            + "U31eoGVc5bE5c0TGLhAjbMKtR5LZFMpAXgpA7hXJSSuAXGs8gjkJkYSJYnJwIOyd\n"
-            + "xOi5jmnE/U5QuMjBG0bwxFXxkaDa5mcebJ/6C8mgkKyATbQkCe7YJGl1JLK4vY28\n"
-            + "ybSMhMDtZiwgvKzd+HcQr+xUQvmgSMApJaMxKPHRA1IrP/STXUEAjcGfk/HCz/0j\n"
-            + "7mJG2cvCxeOMAmp/pTzhSoXiqUNlABEBAAGJAR8EGAECAAkFAlYmpXkCGwwACgkQ\n"
-            + "jE/SjjQ0s5/kVAf/QvHOhuoBSlSxPcgvnvCl8V3zbNR1P9lgjYGwMsvLhwCT7Wvm\n"
-            + "mkUKvtT913uER93N8xJD2svGhKabpiPj9/eo0p3p64dicijsP1UQfpmWKPa/V9sv\n"
-            + "zep08cpDl/eczSiLqgcTXCoZeewWXoQGqqoXnwa4lwQv4Zvj7TTCN2wRzoGwbRcm\n"
-            + "G2hmc27uOwA+hXbF+bLe6HOZR/7U93j8a22g2X9OgST/QCsLgyiUSw3YYaEan9tn\n"
-            + "wuEgAEY/rchOvgeXe5Sl0wTFLHH6OS4BBGgc1LRKnSCM2dgZqvhOOxOvuuieBWY6\n"
-            + "tULvIEIjNNP8Qizfc4u2O8h7HP2b3yYSrp9MMQ==\n"
-            + "=Dxr7\n"
-            + "-----END PGP PUBLIC KEY BLOCK-----\n",
-        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "lQOYBFYmpXkBCACqaLz51DcWQmfOJnat9iHSySfSHwbKfVvoN43Ba2cf/D/PadRc\n"
-            + "HLgc+91k2yk1kV1LnMdvUGj5zZ84ZqrQx3f1WeItnzZpqxtmQS/GSxCp9EY/s7w6\n"
-            + "5i86R/k9Tzgvk0B7dKZJXbM/OWxxDkkxHWE3Un9wreX7bDU5b9D2knHRiNFqH9ZJ\n"
-            + "KqDIFZqH9WTUxNZcHz20sTCRIMfvsAwf2vRU5N5xTu4Mbk6JFc7BAj7h1f/mYEPo\n"
-            + "CTyB1jV/DSDVdn1FjJVocSg6W/CvsYF9hKFYjJHl4VXdePTpnOjHhJLL0QWk0TMe\n"
-            + "xYeUi/xDr5DeMxTmi7F7BFaQEF+KmUM46e+9ABEBAAEAB/wOspbuA1A3AsY6QRYG\n"
-            + "Xg6/w+rD1Do9N7+4ESaQUqej2hlU1d9jjHSSx2RqgP6WaLG/xkdrQeez9/iuICjG\n"
-            + "dhXSGw0He05xobjswl2RAENxLSjr8KAhAl57a97C23TQoaYzn7WB6Wt+3gCM5bsJ\n"
-            + "WevbHinwuYb2/ve+OvcudSYM+Nhtpv0DoTaizhi9wzc3g/XLbturlpdCffbw4y+h\n"
-            + "gBPd/t3cc/0Ams8Wi2RlmDOoe73ls23nBHcNomgydyIYBn7U5Z3v3YkPNp9VBiXx\n"
-            + "rC4mDtB1ugucMhqjRNAYqinaLP35CiBTU/IB0WLu7ZyytnjY5frly1ShAG8wFL0B\n"
-            + "MOMxBADJjGy1NwGSd/7eMeYyYThyhXDxo5so91/O1+RLnSUVv/Nz6VOPp2TtuVN5\n"
-            + "uTJkpSXtUFyWbf8mkQiFz4++vHW5E/Q6+KomXRalK7JeBzeFMtax64ykQHID9cSu\n"
-            + "TaSHBhOEEeZZuf6BlulYEJEBHYK6EFlPJn+cpZtTFaqDoKh22QQA2HKjfyeppNre\n"
-            + "WRFJ9h1x1hBlSRR+XIPYmDmZUjL37jQUlw8iF+txPclfyNBw2I2Om+Jhcf25peOx\n"
-            + "ow4yvjt8r3qDjNhI2zLE9u4zrQ9xU8CUingT0t4k3NO2vigpKlmp1/w2IHSMctry\n"
-            + "v1v3+BAS8qGIYDY1lgI7QBvle5hxGYUD/00zMyHOIgYg/cM5sR0qafesoj9kRff5\n"
-            + "UMnSy1dw+pGMv6GqKGbcZDoC060hUO9GhQRPZXF8PlYzD30lOLS2Uw4mPXjOmQVv\n"
-            + "lDiyl/vLkfkVfP/alYH0FW6mErDrjtHhrZewqDm3iPLGMVGfGCJsL+N37VBSe+jr\n"
-            + "4rZCnjk/Jo5JRoKJATcEHwECACEFAlYmphQXDIABBK6n7S+CETPlsSjR7QYl3EYy\n"
-            + "iowCBwAACgkQjE/SjjQ0s59h3gf/cal/F8n6czMEKGfUmoWso6qpiI47ixTC5tfO\n"
-            + "lE7fdXaNStRXvk9NYb/o2WANs98oVxTSpm53ozYRDFJL38jbSL8ylEHuomdYwz/o\n"
-            + "fF0wMnSj+k3giYgaPfxBMhbHQNL2fdvCVyhuXtmUzyDY3WS/mNA8S66t994lFLif\n"
-            + "LikS8IKbYhJIY64HQNW1gcYOsktDSTiYOQQm5Tx8/m6fyY3wjx4Ag2WxMWmxOzAx\n"
-            + "cyKm1lOblIjlBmUbebky+9ySeBh2HKe8JZzokca3UQdeUjgDlB62v/gVs0Ti5hwQ\n"
-            + "SHLMHLhZB+JAI+IjPObc7hwyev037kfNipGG7Y695ibzobZHGrQgVGVzdHVzZXIg\n"
-            + "U2l4IDx0ZXN0NkBleGFtcGxlLmNvbT6JATgEEwECACIFAlYmpXkCGwMGCwkIBwMC\n"
-            + "BhUIAgkKCwQWAgMBAh4BAheAAAoJEIxP0o40NLOfZe0H/jCXhy1zdxb0XCnXtyS0\n"
-            + "WLqZ3x+NGJHAT+u5UogqYAfN4wsGhmfgtlW6fI0JEYtl8/4xSzgmEuSnyKhPNQHv\n"
-            + "E+X2T3gVd6Vs5uf0XRPuG2MUuIUA4x7KSd7KWTaRqVO3ogEq1o4+f5XqicHA75gd\n"
-            + "vC37EsyEBaNn9YDRMgLVEi6R3NYSuF372UbwH2S6kYLls+j8CAI+hqM+FLWouu2H\n"
-            + "6UKw0ldP9G2TonHmibKnExc/ODM21QswU42zNpGceesIdCD/IlkMLDd99blKF/J9\n"
-            + "Z0UzrmOAQqicwovPL1dX4EzoglCWAcIEA/xYcpJ/iowbj+ERYuvAD9tNDvDQNJXz\n"
-            + "yaydA5gEVialeQEIALMgwUMLqRxXny68XdfA6tLcOYo08M3M7/gDL+I7Flub700/\n"
-            + "xBYQSb4DMK1kx9h1nwLcOO7PGSFxpwj8TlqBkgJ2zpuzT5VLtUoR41in9StMX2mR\n"
-            + "k1ex4Ksk+CtTfV6gZVzlsTlzRMYuECNswq1HktkUykBeCkDuFclJK4BcazyCOQmR\n"
-            + "hIlicnAg7J3E6LmOacT9TlC4yMEbRvDEVfGRoNrmZx5sn/oLyaCQrIBNtCQJ7tgk\n"
-            + "aXUksri9jbzJtIyEwO1mLCC8rN34dxCv7FRC+aBIwCklozEo8dEDUis/9JNdQQCN\n"
-            + "wZ+T8cLP/SPuYkbZy8LF44wCan+lPOFKheKpQ2UAEQEAAQAH/A1Os+Tb9yiGnuoN\n"
-            + "LuiSKa/YEgNBOxmC7dnuPK6xJpBQNZc200WzWJMf8AwVpl4foNxIyYb+Rjbsl1Ts\n"
-            + "z5JcOWFq+57oE5O7D+EMkqf5tFZO4nC4kqprac41HSW02mW/A0DDRKcIt/WEIwlK\n"
-            + "sWzHmjJ736moAtl/holRYQS0ePgB8bUPDQcFovH6X3SUxlPGTYD1DEX+WNvYRk3r\n"
-            + "pa9YXH65qbG9CEJIFTmwZIRDl+CBtBlN/fKadyMJr9fXtv7Fu9hNsK1K1pUtLqCa\n"
-            + "nc22Zak+o+LCPlZ8vmw/UmOGtp2iZlEragmh2rOywp0dHF7gsdlgoafQf8Q4NIag\n"
-            + "TFyHf1kEAMSOKUUwLBEmPnDVfoEOt5spQLVtlF8sh/Okk9zVazWmw0n/b1Ef72z6\n"
-            + "EZqCW9/XhH5pXfKJeV+08hroHI6a5UESa7/xOIx50TaQdRqjwGciMnH2LJcpIU/L\n"
-            + "f0cGXcnTLKt4Z2GeSPKFTj4VzwmwH5F/RYdc5eiVb7VNoy9DC5RZBADpTVH5pklS\n"
-            + "44VDJIcwSNy1LBEU3oj+Nu+sufCimJ5B7HLokoJtm6q8VQRga5hN1TZkdQcLy+b2\n"
-            + "wzxHYoIsIsYFfG/mqLZ3LJNDFqze1/Kj987DYSUGeNYexMN2Fkzbo35Jf0cpOiao\n"
-            + "390JFOS7qecUak5/yJ/V4xy8/nds37617QP9GWlFBykDoESBC2AIz8wXcpUBVNeH\n"
-            + "BNSthmC+PJPhsS6jTQuipqtXUZBgZBrMHp/bA8gTOkI4rPXycH3+ACbuQMAjbFny\n"
-            + "Kt69lPHD8VWw/82E4EY2J9LmHli+2BcATz89ouC4kqC5zF90qJseviSZPihpnFxA\n"
-            + "1UqMU2ZjsPb4CM9C/YkBHwQYAQIACQUCVialeQIbDAAKCRCMT9KONDSzn+RUB/9C\n"
-            + "8c6G6gFKVLE9yC+e8KXxXfNs1HU/2WCNgbAyy8uHAJPta+aaRQq+1P3Xe4RH3c3z\n"
-            + "EkPay8aEppumI+P396jSnenrh2JyKOw/VRB+mZYo9r9X2y/N6nTxykOX95zNKIuq\n"
-            + "BxNcKhl57BZehAaqqhefBriXBC/hm+PtNMI3bBHOgbBtFyYbaGZzbu47AD6FdsX5\n"
-            + "st7oc5lH/tT3ePxrbaDZf06BJP9AKwuDKJRLDdhhoRqf22fC4SAARj+tyE6+B5d7\n"
-            + "lKXTBMUscfo5LgEEaBzUtEqdIIzZ2Bmq+E47E6+66J4FZjq1Qu8gQiM00/xCLN9z\n"
-            + "i7Y7yHsc/ZvfJhKun0wx\n"
-            + "=M/kw\n"
-            + "-----END PGP PRIVATE KEY BLOCK-----\n");
-  }
-
-  /**
-   * A key revoked by a valid key, due to no longer being used.
-   *
-   * <p>Revoked by {@link #validKeyWithoutExpiration()}.
-   *
-   * <pre>
-   * pub   2048R/3D6C52D0 2015-10-20 [revoked: 2015-10-20]
-   *       Key fingerprint = 32DB 6C31 2ED7 A98D 11B2  43EA FAD2 ABE2 3D6C 52D0
-   * uid                  Testuser Seven &lt;test7@example.com&gt;
-   * </pre>
-   */
-  public static TestKey revokedNoLongerUsedKey() throws Exception {
-    return new TestKey(
-        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "mQENBFYmq3EBCAC9ssY6QhFsnZqKEPlQrx8Zomblj8qV93/B448isOT2L6OVY7UC\n"
-            + "kKPj6afW5UDkYeyZSmLZfTrpePcbAB8FB3uvd/AS9mHC+6zuBlwlkl9xIXlwUXQP\n"
-            + "KER4LKYNTP21AM+/vTJm4+u26tlZECIZlez31KEeqM30EAm+/pO8VkEp8+1ImfLv\n"
-            + "otndIjMoq9gxJvn6KZeexJT2eKCsSa20vVsmAhuFjLZitU3lEjIROfDiyHUZ2cZ+\n"
-            + "qynfppJCKlHJRu/T9L/yxDFVUFDFSajNzSfjG1g3FEveDITyAhRetVfZbhyJptnV\n"
-            + "jfiHSQkLamPsBmMoKfP+aO5SfsTHTJvxgLUdABEBAAGJAS0EIAECABcFAlYmq8AQ\n"
-            + "HQN0ZXN0NyBub3QgdXNlZAAKCRDtBiXcRjKKjPKqB/sF+ypJZaZ5M4jFdoH/YA3s\n"
-            + "4+VkA/NbLKcrlMI0lbnIrax02jdyTo7rBUJfTwuBs5QeQ25+VfaBcz9fWSv4Z8Bk\n"
-            + "9+w61bQZLQkExZ9W7hnhaapyR0aT0rY48KGtHOPNoMQu9Si+RnRiI024jMUUjrau\n"
-            + "w/exgCteY261VtCPRgyZOlpbX43rsBhF8ott0ZzSfLwaNTHhsjFsD1uH6TSFO8La\n"
-            + "/H1nO31sORlY3+rCGiQVuYIJD1qI7bEjDHYO0nq/f7JjfYKmVBg9grwLsX3h1qZ2\n"
-            + "L3Yz+0eCi7/6T/Sm7PavQ+EGL7+WBXX3qJpwc+EFNHs6VxQp86k6csba0c5mNcaQ\n"
-            + "iQE3BB8BAgAhBQJWJqusFwyAAQSup+0vghEz5bEo0e0GJdxGMoqMAgcAAAoJEPrS\n"
-            + "q+I9bFLQ2BYH/jm+t7pZuv8WqZdb8FiBa9CFfhcSKjYarMHjBw7GxWZJMd5VR4DC\n"
-            + "r4T/ZSAGRKBRKQ2uXrkm9H0NPDp0c/UKCHtQMFDnqTk7B63mwSR1d7W0qaRPXYQ1\n"
-            + "bbatnzkEDOj0e+rX6aiqVRMo/q6uMNUFl6UMrUZPSNB5PVRQWPnQ7K11mw3vg0e5\n"
-            + "ycqJbyFvER6EtyDUXGBo8a5/4bK8VBNBMTAIy6GeGpeSM5b7cpQk7/j4dXugCJAV\n"
-            + "fhFNUOgLduoIKM4u+VcFjk3Km/YxOtGi1dLqCbTX/0LiCRA9mgQpyNVyA+Sm48LM\n"
-            + "LUkbcrN/F3SHX1ao/5lm19r8Biu1ziQnLgC0IlRlc3R1c2VyIFNldmVuIDx0ZXN0\n"
-            + "N0BleGFtcGxlLmNvbT6JATgEEwECACIFAlYmq3ECGwMGCwkIBwMCBhUIAgkKCwQW\n"
-            + "AgMBAh4BAheAAAoJEPrSq+I9bFLQvjQH/0K7aBsGU2U/rm4I+u+uPa6BnFTYQJqg\n"
-            + "034pwdD0WfM3M/XgVh7ERjnR9ZViCMVej+K3kW5d2DNaXu5vVpcD6L6jjWwiJHBw\n"
-            + "LIcmpqQrL0TdoCr4F4FKQnBbcH1fNvP8A/hLDHB3k3ERPvEFIo1AkVuK4s/v7yZY\n"
-            + "HAowX0r4ok4ndu/wAc0HI1FkApkAfh18JDTuui53dkKhnkDp7Xnfm/ElAZYjB7Se\n"
-            + "ivxOD9vdhViWSx1VhttPZo5hSyJrEYaJ5u9hsXNUN85DxgLqCmS1v8n3pN1lVY/Q\n"
-            + "TYXtgocakQgHGEG0Tl6a3xpNkn9ihnyCr80mHCxXTyUUBGfygccelB+5AQ0EViar\n"
-            + "cQEIAKxwXb6HGV9QjepADyWW7GMxc2JVZ7pZM2sdf8wrgnQqV2G1rc9gAgwTX4jt\n"
-            + "OY0vSKT1vBq09ZXS3qpYHi/Wwft0KkaX/a7e6vKabDSfhilxC2LuGz2+56f6UOzj\n"
-            + "ggwf5k4LFTQvkDUZumwPjoeC2hqQO3Q/9PW39C6GnvsCr5L0MRdO3PbVJM7lJaOk\n"
-            + "MbGwgysErWgiZXKlxMpIvffIsLC4BAxnjXaCy6zHuBcPMPaRMs7sDRBzeuTV2wnX\n"
-            + "Sd+IXZgdpd1hF7VkuXenzwOqvBGS66C3ILW0ZTFaOtgrloIkTvtYEcJFWvxqWl2F\n"
-            + "+JQ5V6eu2aJ3HIGyr9L1R8MUA6EAEQEAAYkBHwQYAQIACQUCViarcQIbDAAKCRD6\n"
-            + "0qviPWxS0M0PB/9Rbk4/pNW67+uE1lwtaIG7uFiMbJqu8jK6MkD8GdayflroWEZA\n"
-            + "x0Xow9HL8UaRfeRPTZMrDRpjl+fJIXT5qnlB0FPmzSXAKr3piC8migBcbp5m6hWh\n"
-            + "c3ScAqWOeMt9j0TTWHh4hKS8Q+lK392ht65cI/kpFhxm9EEaXmajplNL/2G3PVrl\n"
-            + "fFUgCdOn2DYdVSgJsfBhkcoiy17G3vqtb+We6ulhziae4SIrkUSqdYmRjiFyvqZz\n"
-            + "tmMEoF6CQNCUb1NK0TsSDeIdDacYjUwyq0Qj6TaXrWcbC3kW0GtWoFTNIiX4q9bN\n"
-            + "+B6paw/s8P7XCWznTBRdlFWWgrhcpzQ8fefC\n"
-            + "=CHer\n"
-            + "-----END PGP PUBLIC KEY BLOCK-----\n",
-        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "lQOYBFYmq3EBCAC9ssY6QhFsnZqKEPlQrx8Zomblj8qV93/B448isOT2L6OVY7UC\n"
-            + "kKPj6afW5UDkYeyZSmLZfTrpePcbAB8FB3uvd/AS9mHC+6zuBlwlkl9xIXlwUXQP\n"
-            + "KER4LKYNTP21AM+/vTJm4+u26tlZECIZlez31KEeqM30EAm+/pO8VkEp8+1ImfLv\n"
-            + "otndIjMoq9gxJvn6KZeexJT2eKCsSa20vVsmAhuFjLZitU3lEjIROfDiyHUZ2cZ+\n"
-            + "qynfppJCKlHJRu/T9L/yxDFVUFDFSajNzSfjG1g3FEveDITyAhRetVfZbhyJptnV\n"
-            + "jfiHSQkLamPsBmMoKfP+aO5SfsTHTJvxgLUdABEBAAEAB/9AdCtFJSidcolNKwpC\n"
-            + "/1V+VL9IdYxcWx02CDccjuUkvrgCrL+WcQW2jS/hZMChOKJ2zR78DcBEDr1LF8Xy\n"
-            + "ZAIC8yoHj15VLUUrFM8fVvYFzt1fq9VWxxRIjscW0teLNgzgdYzYB84RtwcFa2Vi\n"
-            + "sx2ycTUTYUClEgP1uLMCtX3rnibJh4vR+lVgnDtKSoh4CLAlW6grAAVdw5sSuV7Q\n"
-            + "i9EJcPezGw1RvBU5PooqNDG6kyw/QqsAS4q3WP4uVJKK1e7S9oqXFEN8k/zfllI0\n"
-            + "SSkoyP2flzz71rJF/wQMfJ8uf/CelKXd+gPO4FbCWiZSTLe20JR23qiOyvZkfCwg\n"
-            + "eFmzBADIJUzspDrg5yaqE+HMc8U3O9G9FHoDSweZTbhiq3aK0BqMAn34u0ps6chy\n"
-            + "VMO6aPWVzgcSHNfTlzpjuN9lwDoimYBH5vZa1HlCHt5eeqTORixkxSerOmILabTi\n"
-            + "QWq5JPdJwYZiSvK45G5k3G37RTd6/QyhTlRYXj59RXYajrYngwQA8qMZRkRYcTop\n"
-            + "aG+5M0x44k6NgIyH7Ap+2vRPpDdUlHs+z+6iRvoutkSfKHeZUYBQjgt+tScfn1hM\n"
-            + "BRB+x146ecmSVh/Dh8yu6uCrhitFlKpyJqNptZo5o+sH41zjefpMd/bc8rtHTw3n\n"
-            + "GiFl57ZbXbze2O8UimUVgRI2DtOebt8EAJHM/8vZahzF0chzL4sNVAb8FcNYxAyn\n"
-            + "95VpnWeAtKX7f0bqUvIN4BNV++o6JdMNvBoYEQpKeQIda7QM59hNiS8f/bxkRikF\n"
-            + "OiHB5YGy2zRX5T1G5rVQ0YqrOu959eEwdGZmOQ8GOqq5B/NoHXUtotV6SGE3R+Tl\n"
-            + "grlV4U5/PT0fM3KJATcEHwECACEFAlYmq6wXDIABBK6n7S+CETPlsSjR7QYl3EYy\n"
-            + "iowCBwAACgkQ+tKr4j1sUtDYFgf+Ob63ulm6/xapl1vwWIFr0IV+FxIqNhqsweMH\n"
-            + "DsbFZkkx3lVHgMKvhP9lIAZEoFEpDa5euSb0fQ08OnRz9QoIe1AwUOepOTsHrebB\n"
-            + "JHV3tbSppE9dhDVttq2fOQQM6PR76tfpqKpVEyj+rq4w1QWXpQytRk9I0Hk9VFBY\n"
-            + "+dDsrXWbDe+DR7nJyolvIW8RHoS3INRcYGjxrn/hsrxUE0ExMAjLoZ4al5Izlvty\n"
-            + "lCTv+Ph1e6AIkBV+EU1Q6At26ggozi75VwWOTcqb9jE60aLV0uoJtNf/QuIJED2a\n"
-            + "BCnI1XID5KbjwswtSRtys38XdIdfVqj/mWbX2vwGK7XOJCcuALQiVGVzdHVzZXIg\n"
-            + "U2V2ZW4gPHRlc3Q3QGV4YW1wbGUuY29tPokBOAQTAQIAIgUCViarcQIbAwYLCQgH\n"
-            + "AwIGFQgCCQoLBBYCAwECHgECF4AACgkQ+tKr4j1sUtC+NAf/QrtoGwZTZT+ubgj6\n"
-            + "7649roGcVNhAmqDTfinB0PRZ8zcz9eBWHsRGOdH1lWIIxV6P4reRbl3YM1pe7m9W\n"
-            + "lwPovqONbCIkcHAshyampCsvRN2gKvgXgUpCcFtwfV828/wD+EsMcHeTcRE+8QUi\n"
-            + "jUCRW4riz+/vJlgcCjBfSviiTid27/ABzQcjUWQCmQB+HXwkNO66Lnd2QqGeQOnt\n"
-            + "ed+b8SUBliMHtJ6K/E4P292FWJZLHVWG209mjmFLImsRhonm72Gxc1Q3zkPGAuoK\n"
-            + "ZLW/yfek3WVVj9BNhe2ChxqRCAcYQbROXprfGk2Sf2KGfIKvzSYcLFdPJRQEZ/KB\n"
-            + "xx6UH50DmARWJqtxAQgArHBdvocZX1CN6kAPJZbsYzFzYlVnulkzax1/zCuCdCpX\n"
-            + "YbWtz2ACDBNfiO05jS9IpPW8GrT1ldLeqlgeL9bB+3QqRpf9rt7q8ppsNJ+GKXEL\n"
-            + "Yu4bPb7np/pQ7OOCDB/mTgsVNC+QNRm6bA+Oh4LaGpA7dD/09bf0Loae+wKvkvQx\n"
-            + "F07c9tUkzuUlo6QxsbCDKwStaCJlcqXEyki998iwsLgEDGeNdoLLrMe4Fw8w9pEy\n"
-            + "zuwNEHN65NXbCddJ34hdmB2l3WEXtWS5d6fPA6q8EZLroLcgtbRlMVo62CuWgiRO\n"
-            + "+1gRwkVa/GpaXYX4lDlXp67ZonccgbKv0vVHwxQDoQARAQABAAf5Ae8xa1mPns1E\n"
-            + "B5yCrvzDl79Dw0F1rED46IWIW/ghpVTzmFHV6ngcvcRFM5TZquxHXSuxLv7YVxRq\n"
-            + "UVszXNJaEwyJYYkDRwAS1E2IKN+gknwapm2eWkchySAajUsQt+XEYHFpDPtQRlA3\n"
-            + "Z6PrCOPJDOLmT9Zcf0R6KurGrhvTGrZkKU6ZCFqZWETfZy5cPfq2qxtw3YEUI+eT\n"
-            + "09AgMmPJ9nDPI3cA69tvy/phVFgpglsS76qgd6uFJ5kcDoIB+YepmJoHnzJeowYt\n"
-            + "lvnmmyGqmVS/KCgvILaD0c73Dp2X0BN64hSZHa3nUU67WbKJzo2OXr+yr0hvofcf\n"
-            + "8vhKJe5+2wQAy+rRKSAOPaFiKT8ZenRucx1pTJLoB8JdediOdR4dtXB2Z59Ze7N3\n"
-            + "sedfrJn1ao+jJEpnKeudlDq7oa9THd7ZojN4gBF/lz0duzfertuQ/MrHaTPeK8YI\n"
-            + "dEPg3SgYVOLDBptaKmo0xr2f6aslGLPHgxCgzOcLuuUNGKJSigZvhdMEANh7VKsX\n"
-            + "nb5shZh+KRET84us/uu74q4iIfc8Q10oXuN9+IPlqfAIclo4uMhvo5rtI9ApFtxs\n"
-            + "oZzqqc+gt+OAbn/fHeb61eT36BA+r61Ka+erxkpWU5r1BPVIqq+biTY/HHchqroJ\n"
-            + "aw81qWudO9h5a0yP1alDiBSwhZWIMCKzp6Q7A/472amrSzgs7u8ToQ/2THDxaMf3\n"
-            + "Se0HgMrIT1/+5es2CWiEoZGSZTXlimDYXJULu/DFC7ia7kXOLrMsO85bEi7SHagA\n"
-            + "eO+mAw3xP3OuNkZDt9x4qtal28fNIz22DH5qg2wtsGdCWXz5C6OdcrtQ736kNxa2\n"
-            + "5QemZ/0VWxHPnvXz40RtiQEfBBgBAgAJBQJWJqtxAhsMAAoJEPrSq+I9bFLQzQ8H\n"
-            + "/1FuTj+k1brv64TWXC1ogbu4WIxsmq7yMroyQPwZ1rJ+WuhYRkDHRejD0cvxRpF9\n"
-            + "5E9NkysNGmOX58khdPmqeUHQU+bNJcAqvemILyaKAFxunmbqFaFzdJwCpY54y32P\n"
-            + "RNNYeHiEpLxD6Urf3aG3rlwj+SkWHGb0QRpeZqOmU0v/Ybc9WuV8VSAJ06fYNh1V\n"
-            + "KAmx8GGRyiLLXsbe+q1v5Z7q6WHOJp7hIiuRRKp1iZGOIXK+pnO2YwSgXoJA0JRv\n"
-            + "U0rROxIN4h0NpxiNTDKrRCPpNpetZxsLeRbQa1agVM0iJfir1s34HqlrD+zw/tcJ\n"
-            + "bOdMFF2UVZaCuFynNDx958I=\n"
-            + "=aoJv\n"
-            + "-----END PGP PRIVATE KEY BLOCK-----\n");
-  }
-
-  /**
-   * Key revoked by an expired key, after that key's expiration.
-   *
-   * <p>Revoked by {@link #expiredKey()}.
-   *
-   * <pre>
-   * pub   2048R/78BF7D7E 2005-08-01 [revoked: 2015-10-20]
-   *       Key fingerprint = 916F AB22 5BE7 7585 F59A  994C 001A DF8B 78BF 7D7E
-   * uid                  Testuser Eight &lt;test8@example.com&gt;
-   * </pre>
-   */
-  public static TestKey keyRevokedByExpiredKeyAfterExpiration() throws Exception {
-    return new TestKey(
-        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "mQENBELuRwABCAC56yhFKybBtuKT4nyb7RdLE98pZR54aGjcDcKH3VKVyBF8Z4Kx\n"
-            + "ptd7Sre0mLPCQiNWVOmCT+JG7GKVE6YeFmyXDUnhX9w4+HAeDEh23S4u9JvwWaF+\n"
-            + "wlJ6jLq/oe5gdT1F6Y2yqNpQ6CztOw52Ko9KSYz7/1zBMPcCkl/4k15ee4iebVdq\n"
-            + "c7qT5Qt49Poiozh0DI5prPQ624uckHkz2mXshjWQVuHWwrkIkCJZ2I/KQN2kBjKw\n"
-            + "/ALxumaWmiB9lQ0nIwLuGzHCh0Xg5RxuCrK8fJp47Aza3ikVuYlNzSxhJVav3OtK\n"
-            + "gftBihQXUlY3Uy/4QTCeH/BdVs5OALtXL3VhABEBAAGJAS0EIAECABcFAlYmr4kQ\n"
-            + "HQN0ZXN0OCBub3QgdXNlZAAKCRA87HgbF94azQJ5B/0TeQk7TSChNp+NqCKPTuw0\n"
-            + "wpflDyc+5ru/Gcs4r358cWzgiLUb3M0Q1+M8CF13BFQdrxT05vjheI9o5PCn3b//\n"
-            + "AHV8m+QFSnRi2J3QslbvuOqOnipz7vc7lyZ7q1sWNC33YN+ZcGZiMuu5HJi9iadf\n"
-            + "ZL7AdInpUb4Zb+XKphbMokDcN3yw7rqSMMcx+rKytUAqUnt9qvaSLrIH/zeazxlp\n"
-            + "YG4jaN53WPfLCcGG+Rw56mW+eCQD2rmzaNHCw8Qr+19sokXLB7OML+rd1wNwZT4q\n"
-            + "stWnL+nOj8ZkbFV0w3zClDYaARr7H+vTckwVStyDVRbnpRitSAtJwbRDzZBaS4Vx\n"
-            + "iQE3BB8BAgAhBQJC7lUQFwyAAR2e63ndOLBJk52crzzseBsX3hrNAgcAAAoJEAAa\n"
-            + "34t4v31+AS4H/0x3Y9E3q9DR5FCuYTXG4BHyrALo2WKoP0CfUWL98Fw9Txl0hF+9\n"
-            + "5wriNlnmd2zvM0quHs78x4/xehQO88cw0lqPx3RARq/ju5/VbOjoNlcHvfGYZiEd\n"
-            + "yWOwHu7O8sZrenFDjeDglD6NArrjncOcC51XIPSSTLvVQpSauQ1FS4tan5Q4aWMb\n"
-            + "s4DzE+Vqu2xMkO/X9toYAZKzyWP29OckpouMbt3GUnS6/o0A8Z7jVX+XOIk3XolP\n"
-            + "Li9tzTQB12Xl23mgFvearDoguR2Bu2SbmTJtdiXz8L3S54kGvxVqak5uOP2dagzU\n"
-            + "vBiqR4SVoAdGoXt6TI6mpA+qdYmPMG8v21S0IlRlc3R1c2VyIEVpZ2h0IDx0ZXN0\n"
-            + "OEBleGFtcGxlLmNvbT6JATgEEwECACIFAkLuRwACGwMGCwkIBwMCBhUIAgkKCwQW\n"
-            + "AgMBAh4BAheAAAoJEAAa34t4v31+8/sIAIuqd+dU8k9c5VQ12k7IfZGGYQHF2Mk/\n"
-            + "8FNuP7hFP/VOXBK3QIxIfGEOHbDX6uIxudYMaDmn2UJbdIqJd8NuQByh1gqXdX/x\n"
-            + "nteUa+4e7U6uTjkp/Ij5UzRed8suINA3NzVOy6qwCu3DTOXIZcjiOZtOA5GTqG6Z\n"
-            + "naDP0hwDssJp+LXIYTJgsvneJQFGSdQhhJSv19oV0JPSbb6Zc7gEIHtPcaJHjuZQ\n"
-            + "Ev+TRcRrI9HPTF0MvgOYgIDo2sbcSFV+8moKsHMC+j1Hmuuqgm/1yKGIZrt0V75s\n"
-            + "D9HYu0tiS3+Wlsry3y1hg/2XBQbwgh6sT/jWkpWar7+uzNxO5GdFYrC5AQ0EQu5H\n"
-            + "AAEIALPFTedbfyK+9B35Uo9cPsmFa3mT3qp/bAQtnOjiTTTiIO3tu0ALnaBjf6On\n"
-            + "fAV1HmGz6hRMRK4LGyHkNTaGDNNPoXO7+t9DWycSHmsCL5d5zp7VevQE8MPR8zHK\n"
-            + "Il2YQlCzdy5TWSUhunKd4guDNZ9GiOS6NQ9feYZ9DQ1kzC8nnu7jLkR2zNT02sYU\n"
-            + "kuOCZUktQhVNszUlavdIFjvToZo3RPcdb/E3kTTy2R9xi89AXjWZf3lSAZe3igkL\n"
-            + "jhwsd+u3RRx0ptOJym7zYl5ZdUZk4QrS7FPI6zEBpjawbS4/r6uEW89P3QAkanDI\n"
-            + "ridIAZP8awLZU3uSPtMwPIJpao0AEQEAAYkBHwQYAQIACQUCQu5HAAIbDAAKCRAA\n"
-            + "Gt+LeL99fqpHB/wOXhdMNtgeVW38bLk8YhcEB23FW6fDjFjBJb9m/yqRTh5CIeG2\n"
-            + "bm29ofT4PTamPb8Gt+YuDLnQQ3K2jURakxNDcYwiurvR/oHVdxsBRU7Px7UPeZk3\n"
-            + "BG5VnIJRT198dF7MWFJ+x5wHbNXwM8DDvUwTjXLH/TlGl1XIheSTHCYd9Pra4ejE\n"
-            + "ockkrDaZlPCQdTwY+P7K2ieb5tsqNpJkQeBrglF2bemY/CtQHnM9qwa6ZJqkyYNR\n"
-            + "F1nkSYn36BPuNpytYw1CaQV9GbePugPHtshECLwA160QzqISQUcJlKXttUqUGnoO\n"
-            + "0d0PyzZT3676mQwmFoebMR9vACAeHjvDxD4F\n"
-            + "=ihWb\n"
-            + "-----END PGP PUBLIC KEY BLOCK-----\n",
-        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "lQOYBELuRwABCAC56yhFKybBtuKT4nyb7RdLE98pZR54aGjcDcKH3VKVyBF8Z4Kx\n"
-            + "ptd7Sre0mLPCQiNWVOmCT+JG7GKVE6YeFmyXDUnhX9w4+HAeDEh23S4u9JvwWaF+\n"
-            + "wlJ6jLq/oe5gdT1F6Y2yqNpQ6CztOw52Ko9KSYz7/1zBMPcCkl/4k15ee4iebVdq\n"
-            + "c7qT5Qt49Poiozh0DI5prPQ624uckHkz2mXshjWQVuHWwrkIkCJZ2I/KQN2kBjKw\n"
-            + "/ALxumaWmiB9lQ0nIwLuGzHCh0Xg5RxuCrK8fJp47Aza3ikVuYlNzSxhJVav3OtK\n"
-            + "gftBihQXUlY3Uy/4QTCeH/BdVs5OALtXL3VhABEBAAEAB/wLr88oGuxsoqIHRQZL\n"
-            + "eGm9jc4aQGmcDMcjpwdGilhrwyfrO6f84hWbQdD+rJcnI8hsH7oOd5ZMGkWfpJyt\n"
-            + "eUAh9iNB5ChYGfDVSLUg6KojqDtprj6vNMihvLkr/OI6xL/hZksikwfnLFMPpgXU\n"
-            + "knwPocQ3nn+egsUSL7CR8/SLiIm4MC0brer6jhDxB5LKweExNlfTe4c0MDeYTsWt\n"
-            + "0WGzNPlvRZQXRotJzqemt3wdNZXUnCKR0n7pSQ8EhZr2O6NXr+mUgp6PIOE/3un2\n"
-            + "YGiBEf5uy3qEFe7FjEGIHz+Z3ySRdUDfHOk82TKAzynoJIxRUvLIYVNw4eFB3l5U\n"
-            + "s1w5BADUzfciG7RVLa8UFKJfqQ/5M06QmdS1v1/hMQXg38+3vKe8RgfSSnMJ08Sc\n"
-            + "eAEsmugwpNXAxgRKHcmWzN3NMBHhE3KiyiogWaMGqmSo6swFpu0+dwMvZSxMlfD+\n"
-            + "ka/BWt8YsUdrqW06ow39aTgCV+icbNRV81C7NKe7u0X1JDx2CQQA36gbdo62h/Wd\n"
-            + "gJI8kdz/se3xrt8x6RoWvOnWPNmsZR5XkDqAMTL1dWiEEA/dQTphMcgAe9z3WaP+\n"
-            + "F1TPAfounbiurGCcS3kxJ5tY7ojyU7nYz4DA/V2OU0C/LUoLXhttG5HM+m/i3qn4\n"
-            + "K9bBoWIQY1ijliS7cTSwNqd6IHaQGpkEAMnp5GwSGhY+kUuLw06hmH4xnsuf6agz\n"
-            + "AfhbPylB2nf/ZaX6dt6/mFEAkvQNahcoWEskfS3LGCD8jHm8PvF8K0mciXPDweq2\n"
-            + "gW3/irE0RXNwn3Oa222VSvcgUlocBm9InkfvpFXh20OYFe3dFH7uYkwUqIHJeXjw\n"
-            + "TjpXUX/vC5QJQOyJATcEHwECACEFAkLuVRAXDIABHZ7red04sEmTnZyvPOx4Gxfe\n"
-            + "Gs0CBwAACgkQABrfi3i/fX4BLgf/THdj0Ter0NHkUK5hNcbgEfKsAujZYqg/QJ9R\n"
-            + "Yv3wXD1PGXSEX73nCuI2WeZ3bO8zSq4ezvzHj/F6FA7zxzDSWo/HdEBGr+O7n9Vs\n"
-            + "6Og2Vwe98ZhmIR3JY7Ae7s7yxmt6cUON4OCUPo0CuuOdw5wLnVcg9JJMu9VClJq5\n"
-            + "DUVLi1qflDhpYxuzgPMT5Wq7bEyQ79f22hgBkrPJY/b05ySmi4xu3cZSdLr+jQDx\n"
-            + "nuNVf5c4iTdeiU8uL23NNAHXZeXbeaAW95qsOiC5HYG7ZJuZMm12JfPwvdLniQa/\n"
-            + "FWpqTm44/Z1qDNS8GKpHhJWgB0ahe3pMjqakD6p1iY8wby/bVLQiVGVzdHVzZXIg\n"
-            + "RWlnaHQgPHRlc3Q4QGV4YW1wbGUuY29tPokBOAQTAQIAIgUCQu5HAAIbAwYLCQgH\n"
-            + "AwIGFQgCCQoLBBYCAwECHgECF4AACgkQABrfi3i/fX7z+wgAi6p351TyT1zlVDXa\n"
-            + "Tsh9kYZhAcXYyT/wU24/uEU/9U5cErdAjEh8YQ4dsNfq4jG51gxoOafZQlt0iol3\n"
-            + "w25AHKHWCpd1f/Ge15Rr7h7tTq5OOSn8iPlTNF53yy4g0Dc3NU7LqrAK7cNM5chl\n"
-            + "yOI5m04DkZOobpmdoM/SHAOywmn4tchhMmCy+d4lAUZJ1CGElK/X2hXQk9Jtvplz\n"
-            + "uAQge09xokeO5lAS/5NFxGsj0c9MXQy+A5iAgOjaxtxIVX7yagqwcwL6PUea66qC\n"
-            + "b/XIoYhmu3RXvmwP0di7S2JLf5aWyvLfLWGD/ZcFBvCCHqxP+NaSlZqvv67M3E7k\n"
-            + "Z0VisJ0DmARC7kcAAQgAs8VN51t/Ir70HflSj1w+yYVreZPeqn9sBC2c6OJNNOIg\n"
-            + "7e27QAudoGN/o6d8BXUeYbPqFExErgsbIeQ1NoYM00+hc7v630NbJxIeawIvl3nO\n"
-            + "ntV69ATww9HzMcoiXZhCULN3LlNZJSG6cp3iC4M1n0aI5Lo1D195hn0NDWTMLyee\n"
-            + "7uMuRHbM1PTaxhSS44JlSS1CFU2zNSVq90gWO9OhmjdE9x1v8TeRNPLZH3GLz0Be\n"
-            + "NZl/eVIBl7eKCQuOHCx367dFHHSm04nKbvNiXll1RmThCtLsU8jrMQGmNrBtLj+v\n"
-            + "q4Rbz0/dACRqcMiuJ0gBk/xrAtlTe5I+0zA8gmlqjQARAQABAAf+JNVkZOcGYaQm\n"
-            + "eI3BMMaBxuCjaMG3ec+p3iFKaR0VHKTIgneXSkQXA+nfGTUT4DpjAznN2GLYH6D+\n"
-            + "6i7MCGPm9NT4C7KUcHJoltTLjrlf7vVyNHEhRCZO/pBh9+2mpO6xh799x+wj88u5\n"
-            + "XAqlah50OjJFkjfk70VsrPWqWvgwLejkaQpGbE+pdL+vjy+ol5FHzidzmJvsXDR1\n"
-            + "I1as0vBu5g2XPpexyVanmHJglZdZX07OPYQBhxQKuPXT/2/IRnXsXEpitk4IyJT0\n"
-            + "U5D/iedEUldhBByep1lBcJnAap0CP7iuu2CYhRp6V2wVvdweNPng5Eo7f7LNyjnX\n"
-            + "UMAeaeCjAQQA1A0iKtg3Grxc9+lpFl1znc2/kO3p6ixM13uUvci+yGFNJJninnxo\n"
-            + "99KXEzqqVD0zerjiyyegQmzpITE/+hFIOJZInxEH08WQwZstV/KYeRSJkXf0Um48\n"
-            + "E+Zrh8fpJVW1w3ZCw9Ee2yE6fEhAA4w66+50pM+vBXanWOrG1HDrkxEEANkHc2Rz\n"
-            + "YJsO4v63xo/7/njLSQ31miOglb99ACKBA0Yl/jvj2KqLcomKILqvK3DKP+BHNq86\n"
-            + "LUBUglyKjKuj0wkSWT0tCnfgLzysUpowcoyFhJ36KzAz8hjqIn3TQpMF21HvkZdG\n"
-            + "Mtkcyhu5UDvbfOuWOBaKIeNQWCWv1rNzMme9A/9zU1+esEhKwGWEqa3/B/Te/xQh\n"
-            + "alk180n74sTZid6lXD8o8cEei0CUq7zBSV0P8v6kk8PP9/XyLRl3Rqa95fESUWrL\n"
-            + "xD6TBY1JlHBZS+N6rN/7Ilf5EXSELmnbDFsVxkNGp4elKxajvZxC6uEWYBu62AYy\n"
-            + "wS0dj8mZR3faCEps90YXiQEfBBgBAgAJBQJC7kcAAhsMAAoJEAAa34t4v31+qkcH\n"
-            + "/A5eF0w22B5VbfxsuTxiFwQHbcVbp8OMWMElv2b/KpFOHkIh4bZubb2h9Pg9NqY9\n"
-            + "vwa35i4MudBDcraNRFqTE0NxjCK6u9H+gdV3GwFFTs/HtQ95mTcEblWcglFPX3x0\n"
-            + "XsxYUn7HnAds1fAzwMO9TBONcsf9OUaXVciF5JMcJh30+trh6MShySSsNpmU8JB1\n"
-            + "PBj4/sraJ5vm2yo2kmRB4GuCUXZt6Zj8K1Aecz2rBrpkmqTJg1EXWeRJiffoE+42\n"
-            + "nK1jDUJpBX0Zt4+6A8e2yEQIvADXrRDOohJBRwmUpe21SpQaeg7R3Q/LNlPfrvqZ\n"
-            + "DCYWh5sxH28AIB4eO8PEPgU=\n"
-            + "=cSfw\n"
-            + "-----END PGP PRIVATE KEY BLOCK-----\n");
-  }
-
-  /**
-   * Key revoked by an expired key, before that key's expiration.
-   *
-   * <p>Revoked by {@link #expiredKey()}.
-   *
-   * <pre>
-   * pub   2048R/C43BF2E1 2005-08-01 [revoked: 2005-08-01]
-   *       Key fingerprint = 916D 6AD6 36A5 CBA6 B5A6  7274 6040 8661 C43B F2E1
-   * uid                  Testuser Nine &lt;test9@example.com&gt;
-   * </pre>
-   */
-  public static TestKey keyRevokedByExpiredKeyBeforeExpiration() throws Exception {
-    return new TestKey(
-        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "mQENBELuRwABCADnf2z5dqp3BMFlpd6iUs5dhROrslfzswak1LmbGirK2IPIl4NX\n"
-            + "arAi76xXK9BcF/Cqcj/X/WqFKBd/qMGxwdvwbSN6PVBP6T1jvuVgrPTjd4x5xPUD\n"
-            + "xZ5VPy9hgQXs+1mugTkHYVTU8GI1eGpZ8Oj3PJIgVyqGxGkjWmcz5APbVIRan6L1\n"
-            + "482bZTidH9Nd9YnYlXNgiJcaOPAVBwO/j/myocQCIohvIo4IT8vc/ODhRgfwA0gD\n"
-            + "GVK+tXwT4f4x3qjG/YRpOOZZjBS09B/gJ9QfEnR6WNxg/Tm3T0uipoISOhR+cP/V\n"
-            + "e5o/73SM+w+WlILk/xpbbOfyCxD4Q3lb8EZFABEBAAGJAS0EIAECABcFAkLuYyAQ\n"
-            + "HQN0ZXN0OSBub3QgdXNlZAAKCRA87HgbF94azV2BB/9Rc1j3XOxKbDyUFAORAGnE\n"
-            + "ezQtpOmQhaSUhFC35GFOdTg4eX53FTFSXLJQleTVzvE+eVkQI5tvUZ+SqHoyjnhU\n"
-            + "DpWlmfRUQy4GTUjUTkpFOK07TVTjhUQwaAxN13UZgByopVKc7hLf+uh1xkRJIqAJ\n"
-            + "Tx6LIFZiSIGwStDO6TJlhl1e8h45J3rAV4N+DsGpMy9S4uYOU7erJDupdXK739/l\n"
-            + "VBsP2SeT85iuAv+4A9Jq3+iq+cjK9q3QZCw1O6iI2v3seAWCI6HH3tVw4THr+M6T\n"
-            + "EdTGmyESjdAl+f7/uK0QNfqIMpvUf+AvMakrLi7WOeDs8mpUIjonpeQVLfz6I0Zo\n"
-            + "iQE3BB8BAgAhBQJC7lUQFwyAAR2e63ndOLBJk52crzzseBsX3hrNAgcAAAoJEGBA\n"
-            + "hmHEO/LhHjUH/R/7+iNBLAfKYbpprkWy/8eXVEJhxfh6DI/ppsKLIA+687gX74R9\n"
-            + "6CM5k6fZDjeND26ZEA0rDZmYrbnGUfsu55aeM0/+jiSOZJ2uTlrLXiHMurbNY0pT\n"
-            + "xv215muhumPBzuL1jsAK2Kc/4oE7Z46jaStsPCvDOcx9PW76wR8/uCPvHVz5H/A7\n"
-            + "3erXAloC43jupXwZB32VZq8L0kZNVfuEsjHUcu3GUoZdGfTb4/Qq5a1FK+CGhwWC\n"
-            + "OwpUWZEIUImwUv4FNE4iNFYEHaHLU9fotmIxIkH8TC4NcO+GvkEyMyJ6NVkBBDP2\n"
-            + "EarncWAJxDBlx1CO4ET+/ULvzDnAcYuTc6G0IVRlc3R1c2VyIE5pbmUgPHRlc3Q5\n"
-            + "QGV4YW1wbGUuY29tPokBOAQTAQIAIgUCQu5HAAIbAwYLCQgHAwIGFQgCCQoLBBYC\n"
-            + "AwECHgECF4AACgkQYECGYcQ78uG78ggA1TjeOZtaXjXNG8Bx2sl4W+ypylWWB6yc\n"
-            + "IeR0suLhVlisZ33yOtV4MsvZw0TJNyYmFXiskPTyOcP8RJjS+a41IHc33i13MUnN\n"
-            + "RI5cqhqsWRhf9chlm7XqXtqv57IjojG9vgSUeZdXSTMdHIDDHAjJ/ryBXflzprSw\n"
-            + "2Sab8OXjLkyo9z6ZytFyfXSc8TNiWU6Duollh/bWIsgPETIe2wGn8LcFiVMfPpsI\n"
-            + "RhkphOdTJb+W/zQwLHUcS22A4xsJtBxIXTH/QSG3lAaw8IRbl25EIpaEAF+gExCr\n"
-            + "QM0haAVMmGgYYWpMHXrDhB7ff3kAiqD2qmhSySA6NLmTO+6qGPYJg7kBDQRC7kcA\n"
-            + "AQgA2wqE3DypQhTcYl26dXc9DZzABRQa6KFRqQbhmUBz95cQpAamQjrwOyl2fg84\n"
-            + "b9o9t+DuZcdLzLF/gPVSznOcNUV9mJNdLAxBPPOMUrP/+Snb83FkNpCscrXhIqSf\n"
-            + "BU5D+FOb3bEI2WTJ7lLe8oCrWPE3JIDVCrpAWgZk9puAk1Z7ZFaHsS6ezsZP0YIM\n"
-            + "qTWdoX0zHMPMnr9GG08c0mniXtvfcgtOCeIRU4WZws28sGYCoLeQXsHVDal+gcLp\n"
-            + "1enPh6dfEWBJuhhBBajzm53fzV2a7khEdffggVVylHPLpvms2nIqoearDQtVNpSK\n"
-            + "uhNiykJSMIUn/Y6g5LMySmL+MwARAQABiQEfBBgBAgAJBQJC7kcAAhsMAAoJEGBA\n"
-            + "hmHEO/LhdwcH/0wAxT1NGaR2boMjpTouVUcnEcEzHc0dSwuu+06mLRggSdAfBC8C\n"
-            + "9fdlAYHQ5tp1sRuPwLfQZjo8wLxJ+wLASnIPLaGrtpEHkIKvDwHqwkOXvXeGD/Bh\n"
-            + "40NbJUa7Ec3Jpo+FPFlM8hDsUyHf8IhUAdRd4d+znOVEaZ6S7c1RrtoVTUqzi59n\n"
-            + "nC6ZewL/Jp+znKZlMTM3X1onAGhd+/XdrS52LM8pE3xRjbTLTYWcjnjyLbm0yoO8\n"
-            + "G3yCfIibAaII4a/jGON2X9ZUwaFNIqJ4iIc8Nme86rD/flXsu6Zv+NXVQWylrIG/\n"
-            + "REW68wsnWjwTtrPG8bqo6cCsOzqGYVt81eU=\n"
-            + "=FnZg\n"
-            + "-----END PGP PUBLIC KEY BLOCK-----\n",
-        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "lQOYBELuRwABCADnf2z5dqp3BMFlpd6iUs5dhROrslfzswak1LmbGirK2IPIl4NX\n"
-            + "arAi76xXK9BcF/Cqcj/X/WqFKBd/qMGxwdvwbSN6PVBP6T1jvuVgrPTjd4x5xPUD\n"
-            + "xZ5VPy9hgQXs+1mugTkHYVTU8GI1eGpZ8Oj3PJIgVyqGxGkjWmcz5APbVIRan6L1\n"
-            + "482bZTidH9Nd9YnYlXNgiJcaOPAVBwO/j/myocQCIohvIo4IT8vc/ODhRgfwA0gD\n"
-            + "GVK+tXwT4f4x3qjG/YRpOOZZjBS09B/gJ9QfEnR6WNxg/Tm3T0uipoISOhR+cP/V\n"
-            + "e5o/73SM+w+WlILk/xpbbOfyCxD4Q3lb8EZFABEBAAEAB/9GTcWLkUU9tf0B4LjX\n"
-            + "NSyk7ChIKXZadVEcN9pSR0Udq1mCTrk9kBID2iPNqWmyvjaBnQbUkoqJ+93/EAIa\n"
-            + "+NPRlWOD2SEN07ioFS5WCNCqUAEibfU2+woVu4WpJ+TjzoWy4F2wZxe7P3Gj6Xjq\n"
-            + "7aXih8uc9Lveh8GiUe8rrCCbt+BH1RzuV/khZw+2ZDPMCx7yfcfKobc3NWx75WLh\n"
-            + "pki512fawSC6eJHRI50ilPrqAmmhcccfwPji9P+oPj2S6wlhe5kp3R5yU85fWy3b\n"
-            + "C8AtLTfZIn4v6NAtBaurGEjRjzeNEGMJHxnRPWvFc4iD+xvPg6SNPJM/bbTE+yZ3\n"
-            + "16W1BADxjAQLMuGpemaVmOpZ3K02hcNjwniEK2QPp11BnfoQCIwegON+sUD/6AuZ\n"
-            + "S1vOVvS3//eGbPaMM45FK/SQAVHpC9IOL4Tql0C8B6csRhFL824yPfc3WDb4kayQ\n"
-            + "T5oLjlJ0W2r7tWcBcREEzZT6gNi4KI7C4oFF6tU9lsQJuQyAbwQA9Vl6VW/7oG0W\n"
-            + "CC+lcHJc+4rxUB3yak7d4mEccTNb+crOBRH/7dKZOe7A6Fz+ra++MmucDUzsAx0K\n"
-            + "MGT9Xoi5+CBBaNr+Y2lB9fF20N7eRNzQ3Xrz2OPl4cmU4gfECTZ1vZaKlmB+Vt8C\n"
-            + "E/nn49QGRI+BNBOdW+2aEpPoENczFosEAJXi5Cn2l0jOswDD7FU2PER1wfVY629i\n"
-            + "bICunudOSo64GKQslKkQWktc57DgdOQnH15qW1nVO7Z4H0GBxjSTRCu7Z7q08/qM\n"
-            + "ueWIvJ85HcFhOCl+vITOn0fZV0p8/IwsWz8G9h5bb2QgMAwDSdhnLuK/cXaGM09w\n"
-            + "n6k8O2rCvDtXRjqJATcEHwECACEFAkLuVRAXDIABHZ7red04sEmTnZyvPOx4Gxfe\n"
-            + "Gs0CBwAACgkQYECGYcQ78uEeNQf9H/v6I0EsB8phummuRbL/x5dUQmHF+HoMj+mm\n"
-            + "wosgD7rzuBfvhH3oIzmTp9kON40PbpkQDSsNmZitucZR+y7nlp4zT/6OJI5kna5O\n"
-            + "WsteIcy6ts1jSlPG/bXma6G6Y8HO4vWOwArYpz/igTtnjqNpK2w8K8M5zH09bvrB\n"
-            + "Hz+4I+8dXPkf8Dvd6tcCWgLjeO6lfBkHfZVmrwvSRk1V+4SyMdRy7cZShl0Z9Nvj\n"
-            + "9CrlrUUr4IaHBYI7ClRZkQhQibBS/gU0TiI0VgQdoctT1+i2YjEiQfxMLg1w74a+\n"
-            + "QTIzIno1WQEEM/YRqudxYAnEMGXHUI7gRP79Qu/MOcBxi5NzobQhVGVzdHVzZXIg\n"
-            + "TmluZSA8dGVzdDlAZXhhbXBsZS5jb20+iQE4BBMBAgAiBQJC7kcAAhsDBgsJCAcD\n"
-            + "AgYVCAIJCgsEFgIDAQIeAQIXgAAKCRBgQIZhxDvy4bvyCADVON45m1peNc0bwHHa\n"
-            + "yXhb7KnKVZYHrJwh5HSy4uFWWKxnffI61Xgyy9nDRMk3JiYVeKyQ9PI5w/xEmNL5\n"
-            + "rjUgdzfeLXcxSc1EjlyqGqxZGF/1yGWbtepe2q/nsiOiMb2+BJR5l1dJMx0cgMMc\n"
-            + "CMn+vIFd+XOmtLDZJpvw5eMuTKj3PpnK0XJ9dJzxM2JZToO6iWWH9tYiyA8RMh7b\n"
-            + "AafwtwWJUx8+mwhGGSmE51Mlv5b/NDAsdRxLbYDjGwm0HEhdMf9BIbeUBrDwhFuX\n"
-            + "bkQiloQAX6ATEKtAzSFoBUyYaBhhakwdesOEHt9/eQCKoPaqaFLJIDo0uZM77qoY\n"
-            + "9gmDnQOYBELuRwABCADbCoTcPKlCFNxiXbp1dz0NnMAFFBrooVGpBuGZQHP3lxCk\n"
-            + "BqZCOvA7KXZ+Dzhv2j234O5lx0vMsX+A9VLOc5w1RX2Yk10sDEE884xSs//5Kdvz\n"
-            + "cWQ2kKxyteEipJ8FTkP4U5vdsQjZZMnuUt7ygKtY8TckgNUKukBaBmT2m4CTVntk\n"
-            + "VoexLp7Oxk/RggypNZ2hfTMcw8yev0YbTxzSaeJe299yC04J4hFThZnCzbywZgKg\n"
-            + "t5BewdUNqX6BwunV6c+Hp18RYEm6GEEFqPObnd/NXZruSER19+CBVXKUc8um+aza\n"
-            + "ciqh5qsNC1U2lIq6E2LKQlIwhSf9jqDkszJKYv4zABEBAAEAB/0c76POOw6aazUT\n"
-            + "TZHUnhQ+WHHJefbKuoeWI7w+dD7y+02NzaRoZW7XnJ+fAZW8Dlb5k/O1FayUIEgE\n"
-            + "GjnT336dpE4g5NQkfdifG7Fy5NKGRkWx6viJI3g/OHsYX3+ebNDFMmO0gq7067/9\n"
-            + "WuHsTpvUMRwkF1zi1j4AETjZ7IBXdjuSCSu8OhEwr3d+WXibEmY5ec/d24l/APJx\n"
-            + "c3RMHw9PiDQeAKrByS6N10/yFgRpnouVx3wC7zFmhVewNV476Nyg34OvRoc+lCtk\n"
-            + "ixKdua6KuUJzGRWxgw+q2JD4goXxe0v2qU2KSU63gOYi0kg9tpwpn98lDNQykgmJ\n"
-            + "aQYdNIZJBADdlbkg9qbH1DREs7UF4jXN/SoYRbTh9639GfA4zkbfPmh/RmVIIEKd\n"
-            + "QN7qWK/Xy1bUS9vDzRfFgmoYGtqMmygOOFsVtfm8Y18lSXopN/3vhtai+dn+04Ef\n"
-            + "dl1irmGvm3p7y9Jh3s6uYTEJok0MywA7qBHvgSTVtc1PcZc6j6Bz1QQA/Q+nqyZY\n"
-            + "fLimt4KVYO1y6kSHgEqzggLTxyfGMW5RplTA0V1zCwjM6S+QWNqRxVNdB9Kkzn+S\n"
-            + "YDKHLYs8lXO2zvf8Yk9M7glgqvT4rJ51Zn2rc6lg1YUwFBXup5idTsuZwtqkvvKJ\n"
-            + "eS7L3cSBCqJMRjk47Y3V8zkrrN/HcYmyFecD/A+HPf4eSweUS025Bb+eCk4gTHbR\n"
-            + "uwmnKq7npk2XY4m0A/QdYF9dEWlpadsAr+ZwNQB3f21nQgKG0BudfL4FmpeW9RMt\n"
-            + "35aSIaV7RkxYOt5HEvjFRvLbeL1YYaj+D0dvz8SP1AUPvpWIVlQ03OjRlPyrPW50\n"
-            + "LoqyP8PTb6svnHvmQseJAR8EGAECAAkFAkLuRwACGwwACgkQYECGYcQ78uF3Bwf/\n"
-            + "TADFPU0ZpHZugyOlOi5VRycRwTMdzR1LC677TqYtGCBJ0B8ELwL192UBgdDm2nWx\n"
-            + "G4/At9BmOjzAvEn7AsBKcg8toau2kQeQgq8PAerCQ5e9d4YP8GHjQ1slRrsRzcmm\n"
-            + "j4U8WUzyEOxTId/wiFQB1F3h37Oc5URpnpLtzVGu2hVNSrOLn2ecLpl7Av8mn7Oc\n"
-            + "pmUxMzdfWicAaF379d2tLnYszykTfFGNtMtNhZyOePItubTKg7wbfIJ8iJsBogjh\n"
-            + "r+MY43Zf1lTBoU0ioniIhzw2Z7zqsP9+Vey7pm/41dVBbKWsgb9ERbrzCydaPBO2\n"
-            + "s8bxuqjpwKw7OoZhW3zV5Q==\n"
-            + "=JxsF\n"
-            + "-----END PGP PRIVATE KEY BLOCK-----\n");
-  }
-}
diff --git a/gerrit-gpg/src/test/java/com/google/gerrit/gpg/testutil/TestTrustKeys.java b/gerrit-gpg/src/test/java/com/google/gerrit/gpg/testutil/TestTrustKeys.java
deleted file mode 100644
index a469075..0000000
--- a/gerrit-gpg/src/test/java/com/google/gerrit/gpg/testutil/TestTrustKeys.java
+++ /dev/null
@@ -1,1039 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.gpg.testutil;
-
-/**
- * Test keys specific to web-of-trust checks.
- *
- * <p>In the following diagrams, the notation <code>M---N</code> indicates N trusts M, and an 'x'
- * indicates the key is expired.
- *
- * <p>
- *
- * <pre>
- *  A---Bx
- *   \
- *    \---C---D
- *         \
- *          \---Ex
- *
- *  D and E trust C to be a valid introducer of depth 2.
- *
- * F---G---F, in a cycle.
- *
- * H---I---J, but J is only trusted to length 1.
- * </pre>
- */
-public class TestTrustKeys {
-  /**
-   * pub 2048R/9FD0D396 2010-08-29 Key fingerprint = E401 17FC 4BF4 17BD 8F93 DEB1 D25A D07A 9FD0
-   * D396 uid Testuser A &lt;testa@example.com&gt; sub 2048R/F5C099DB 2010-08-29
-   */
-  public static TestKey keyA() throws Exception {
-    return new TestKey(
-        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "mQENBEx6npoBCACp0vHePNPeLzm0HM35i70bRChyZXu/ARxOHZHNbh6hWJkq5saI\n"
-            + "zuzZoaqXAr3xZwHftTULlkgoJIt40x6VCT8EBnUHTkOqoHTsFnXg2kNuhFvmn0OX\n"
-            + "7RQFlR1SGoQG4fEy6t/GlOwEknpNSIMLkbDMP2FzEkLVWtlIe2hqqawVIgqzyO3k\n"
-            + "HaQxW8gWyyTx0qeSdSi4DyFZIzdyu/aZa7sj/MhO3DB3UwubW6yE+PMcAVrJD+0d\n"
-            + "EToMT7i8Erncc+xEzuXAoQUHaQfOXV4DG5qSgVpKaLxJ/ABWUri0eMPhj0cT4iDx\n"
-            + "eNTL7cZ4h72B1uJs8byDN74PHrypNiVE+IRHABEBAAG0HlRlc3R1c2VyIEEgPHRl\n"
-            + "c3RhQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTHqemgIbAwYLCQgHAwIGFQgCCQoL\n"
-            + "BBYCAwECHgECF4AACgkQ0lrQep/Q05ZxMAf+OoRzXWbGfv7kZb7xdrVyAUTAV4bU\n"
-            + "UvLoJZUIQ1ckPBcty2LUvY7l9efgp3c57nvTD6U98dVnsKfaW4PT0CRXlpl1IFyh\n"
-            + "kgbInFS5rO+cJMQn1KyC+FfiwyGNii630SwiHyWRG5+XQ6Iptx9JELwWUMCLJxFp\n"
-            + "B8DZQKlNnvdl+YUgEeQOkWTXfTSaBATdXHiZhskiumnTOGO24jSg8CrZc5O/n6fC\n"
-            + "CgEsAFWL7fnO0ii6EW1JH5btLHPxL9QI+5DJIypgOhGI1lqZW9KrpfmJ3w6N1Gek\n"
-            + "GBda98DmzxxxZ9iyq1cELAAiQMjkvws67cOs/hwXNn9YaK74dzhb49MLGIkBIAQQ\n"
-            + "AQIACgUCTHqf0QMFAXgACgkQV2Bph7AH1JCO/Qf+PBJqeWS7p32+K5r1cA7AeCB2\n"
-            + "pcHs78wLjnSxuimf0l+JItb9JQAKjzcdZTKVGkUivkq3zhsPCCtssgSav2wlG59F\n"
-            + "TaqtpGOxvGjc8TKWHW1TrPhV86wh0yUempKTMWfdZ0RAJVG3krAj60bzUsQNK41/\n"
-            + "0EZi4JI+sm/TRlwQcmEzdaGxhFSJqiJyaBWbPL8AQNA2iRyjMKNeGCrgapEl2IkW\n"
-            + "2ST+/yUPI/485LS0uU1+TLB+NhiJ6j5PoiVqYD+ul8WJ+cy1vvcp1GCQpbRv1yXY\n"
-            + "4GB1mw0JPIinVE1q+eKKQxN38zARPqyupiIuBQaqX9NCHCAdNtFc3kJQ7Nm83YkB\n"
-            + "IAQQAQIACgUCTHqkCwMFAXgACgkQZB8Rk9JP5GfGVQgArMBVQo3AD56p4g5A+DRA\n"
-            + "h0KdQMt4hs/dl+2GLAi+nK0wwuHrHvr9kcZNiQNMtu+YiwvxMpJ/JvXRwOp4wbEx\n"
-            + "6P6Uzp18R2sqbV4agnL5tXFZXfsa3OR2NLm56Ox1ReHnZtAcC6qa1nHqt9z2sTt1\n"
-            + "vh7IfK8GDU/3M3z4XBXPpmpZPAczqujuO/yshz84O6oc3noXfRUJRklbkhNC3WyS\n"
-            + "u5+3nupq4GwIYehQQpxBTD9xXj4hl3KfUnctg/MkgUGweEK3oZ22kObTLJttTP9t\n"
-            + "9q/hLkVyDtFhGorcsYbNZyupm3xhddzYovkReePwOO4WA7VeRqRdiYDU1UjIKvv4\n"
-            + "TrkBDQRMep6aAQgA3NQtBhS8yiEGN8rT4hGtuuprVd5jQVprLz4ImcI2+Gt71+CR\n"
-            + "gv/BZ0zzFp3VPjTGRusungJYkKKOGpEpERiqEG1X/ZyL7EzoyT+iKIMDsVJgmyDN\n"
-            + "cryHTejlKA8Z6GQ1hPlOIws22oLq5zQXxD9pzMDuabHl/s/bYlU5qXc7LhxdtrmT\n"
-            + "b2uBP9a+eneWKrz8OfgtS5m9DgqJ6Bjl0TvbeVJgKHX42pqzJlBTCn3hJjJosy8x\n"
-            + "4qTbqMraENnl9y+qynM7atoHX6TPWsD7vWtWvi+FA5OWGEe3rof8o/sJSj05DQUn\n"
-            + "i8mmSiCYW/tUklPPXOvPRP0GZ/GhBzIUtE3jBwARAQABiQEfBBgBAgAJBQJMep6a\n"
-            + "AhsMAAoJENJa0Hqf0NOW/gkH/jm9FL+S53NjrthdbNjffryhp7KhTmYAsRk3Hc3X\n"
-            + "4TBj3upecarJynpvsz5HlLi/OxDRR6L2yfjKk6/2iKAbV56mdnnu5xG3TG8++naL\n"
-            + "7n/s9TGBhgknb6+vGhSMZ/1dpQ6wkiyuEmgKJo8DzHAh3k3VATHiBeSD7fNSsgtK\n"
-            + "gzK0hi53IFRFDDPYiCca+SS6/pA2zF56JWGETiIa8rSHIQaK4hNJ38vgKOZM80vQ\n"
-            + "fp+CxvJkYY71Yc94oQByaQzrXod7xnukp5SXe/N3BYTFCWoaSTRUI/THRywWwKqa\n"
-            + "rUsttYrqs/EQSy0X3kZ7CAm04uzA8csNyxapEVRvJxbrt5I=\n"
-            + "=DAMW\n"
-            + "-----END PGP PUBLIC KEY BLOCK-----\n",
-        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "lQOYBEx6npoBCACp0vHePNPeLzm0HM35i70bRChyZXu/ARxOHZHNbh6hWJkq5saI\n"
-            + "zuzZoaqXAr3xZwHftTULlkgoJIt40x6VCT8EBnUHTkOqoHTsFnXg2kNuhFvmn0OX\n"
-            + "7RQFlR1SGoQG4fEy6t/GlOwEknpNSIMLkbDMP2FzEkLVWtlIe2hqqawVIgqzyO3k\n"
-            + "HaQxW8gWyyTx0qeSdSi4DyFZIzdyu/aZa7sj/MhO3DB3UwubW6yE+PMcAVrJD+0d\n"
-            + "EToMT7i8Erncc+xEzuXAoQUHaQfOXV4DG5qSgVpKaLxJ/ABWUri0eMPhj0cT4iDx\n"
-            + "eNTL7cZ4h72B1uJs8byDN74PHrypNiVE+IRHABEBAAEAB/9BbaG9Bz9zd0tqjrx2\n"
-            + "u/VQR3qz1FCQXtuqZu8RMC+B5zIf2si71clf8c7ZHnfSxWZt65Ez1SMYwDeyBdje\n"
-            + "/7B1Gw3Ekk00tFxHx0GEL2NSdZE4sbynkHIp0nD4/HlIc41rmh08E405F7wiAWFn\n"
-            + "uCpfDr47SNpR/A4BxHYOvi8r9pBxn/fXiHluqYROit0Z4tfKDCvQ47k+wqVD5nOt\n"
-            + "BEbHDfEwUMibgTuJ1qPyHf6HDlSdTQSfYV8QW1/UbHWus9QikfjGfLJpX0Rv3UG+\n"
-            + "WXHmowpRDVixj74UQCYXQ/AZi/OBlcS8PRY6EZV4RLyEWlZrdzKViNLOTUbJNHvA\n"
-            + "ZAQVBADQND7CIO6z4k8e9Z8Lf4iLWP9iIbH9R7ArTZr2mX1vkwp+sk0BNQurL/BQ\n"
-            + "jUHOJZnouwkc+C3pQi/JvGvAe1fLHPA0+NKe/tcuDXMk+L1HH6XmDgKtByac41AR\n"
-            + "txxqhaECNeK9OKXAXaEvenkGFMcqQV3QMiF2q5VlmFxSSXydEwQA0M8tCowz0iZF\n"
-            + "i3fGuuZDTN3Ut4u6Uf9FiLcR4ye2Aa5ppO8vlNjObNqpHz0UqdDjB+e3O/n7BUx3\n"
-            + "A5PRZNQvcMbhgr2U3zjWvFMHS3YuxbuIaZ1Vj69vpOAGkUc98v4i0/3Lk7Lijpto\n"
-            + "n40S0eCVo+eccHA4HRvS5XSdNGHVJn0EAMzfBt3DalOlHm+PrAiZdVdp5IfbJwJv\n"
-            + "xkyI++0p4VaYTZhOxjswTs6vgv30FBmHAlx1FzoUOKLaOhxPyLgamFd9YG+ab4DK\n"
-            + "chc4TxIj3kkx3/m6JufW8DWhKyAJNZ/MW+Iqop5pUIeTbOBlNyaflK+XxjkP71rP\n"
-            + "2gZx4pjYjK5EPDy0HlRlc3R1c2VyIEEgPHRlc3RhQGV4YW1wbGUuY29tPokBOAQT\n"
-            + "AQIAIgUCTHqemgIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQ0lrQep/Q\n"
-            + "05ZxMAf+OoRzXWbGfv7kZb7xdrVyAUTAV4bUUvLoJZUIQ1ckPBcty2LUvY7l9efg\n"
-            + "p3c57nvTD6U98dVnsKfaW4PT0CRXlpl1IFyhkgbInFS5rO+cJMQn1KyC+FfiwyGN\n"
-            + "ii630SwiHyWRG5+XQ6Iptx9JELwWUMCLJxFpB8DZQKlNnvdl+YUgEeQOkWTXfTSa\n"
-            + "BATdXHiZhskiumnTOGO24jSg8CrZc5O/n6fCCgEsAFWL7fnO0ii6EW1JH5btLHPx\n"
-            + "L9QI+5DJIypgOhGI1lqZW9KrpfmJ3w6N1GekGBda98DmzxxxZ9iyq1cELAAiQMjk\n"
-            + "vws67cOs/hwXNn9YaK74dzhb49MLGJ0DmARMep6aAQgA3NQtBhS8yiEGN8rT4hGt\n"
-            + "uuprVd5jQVprLz4ImcI2+Gt71+CRgv/BZ0zzFp3VPjTGRusungJYkKKOGpEpERiq\n"
-            + "EG1X/ZyL7EzoyT+iKIMDsVJgmyDNcryHTejlKA8Z6GQ1hPlOIws22oLq5zQXxD9p\n"
-            + "zMDuabHl/s/bYlU5qXc7LhxdtrmTb2uBP9a+eneWKrz8OfgtS5m9DgqJ6Bjl0Tvb\n"
-            + "eVJgKHX42pqzJlBTCn3hJjJosy8x4qTbqMraENnl9y+qynM7atoHX6TPWsD7vWtW\n"
-            + "vi+FA5OWGEe3rof8o/sJSj05DQUni8mmSiCYW/tUklPPXOvPRP0GZ/GhBzIUtE3j\n"
-            + "BwARAQABAAf+KQOPSS3Y0oHHsd0N9VLrPWgEf3JKZPzyI1gWKNiVdRYhbjrbS8VM\n"
-            + "mm8ERxMRY/hRSyKrCdXNtS87zVtgkThPfbWRPh0xL7YpFhenena63Ng78RPqlIDH\n"
-            + "cITs6r/DRBI4jnXvOTr/+R2Pm1llgKF2ePzsSt0rpmPcjyrdBsiKSUnLGxm4tGtW\n"
-            + "wVoEjy3+MRN2ULyTO8Pe4URKTtUkkb23iuQuJZy+k+SfH+H0/3oEb8ERRE3UXNG7\n"
-            + "BIbaj71nsx8+H8+x8ffRm1s5Unn86AJ418oEhxNzQk59NnrrlJ4HH9NNbjjzI3JE\n"
-            + "intSQKhFJsvMARdzX062yartQtnm1v6jwQQA65rpMMHCoh9pxvL6yagw3WjQLEPw\n"
-            + "vOGpD9ossBvcv/SfAe7SgJsx6J6X0IIW6EKIjyRhWTIfK/rVR0cmUFTGStib+y22\n"
-            + "BPcQmt/Oiw9rdUfOmDrnosPC0SB+19tKw1v1AfW5swpJnGBCkGz9UfX4Fr/eTS3e\n"
-            + "2KaMq+r1KALSUVkEAO/x0SWOiBRH3X1ETNE9nLTP6u2W3TAvrd+dXyP7JjXWZPB8\n"
-            + "NOwT7qidvUlhTbxdR7xWNI1W924Ywwgs43cAPGyq95pjdzhvi0Xxab7124UK+MS3\n"
-            + "V4WBvjOYYW8pkdMOydRLETXSkco2mDCRTiVKe3Zi7p+lKlVJj4xrFUPUnetfBADH\n"
-            + "EPwYeeZ8sQnW644J75eoph2e5KLRJaOy5GMPRLNmq+ODtJxdoIGpfQnEA35nSlze\n"
-            + "Ea+1UvLBlWyF+p08bNfnXHp3j5ugucAYbVEs4ptUwTB3vFt7eJ8rkx9GYcuBFiwm\n"
-            + "H47rg7QmS1mWDLyX6v2pI9brsb1SCgBL+oi9CyjypkjqiQEfBBgBAgAJBQJMep6a\n"
-            + "AhsMAAoJENJa0Hqf0NOW/gkH/jm9FL+S53NjrthdbNjffryhp7KhTmYAsRk3Hc3X\n"
-            + "4TBj3upecarJynpvsz5HlLi/OxDRR6L2yfjKk6/2iKAbV56mdnnu5xG3TG8++naL\n"
-            + "7n/s9TGBhgknb6+vGhSMZ/1dpQ6wkiyuEmgKJo8DzHAh3k3VATHiBeSD7fNSsgtK\n"
-            + "gzK0hi53IFRFDDPYiCca+SS6/pA2zF56JWGETiIa8rSHIQaK4hNJ38vgKOZM80vQ\n"
-            + "fp+CxvJkYY71Yc94oQByaQzrXod7xnukp5SXe/N3BYTFCWoaSTRUI/THRywWwKqa\n"
-            + "rUsttYrqs/EQSy0X3kZ7CAm04uzA8csNyxapEVRvJxbrt5I=\n"
-            + "=FLdD\n"
-            + "-----END PGP PRIVATE KEY BLOCK-----\n");
-  }
-
-  /**
-   * pub 2048R/B007D490 2010-08-29 [expired: 2011-08-29] Key fingerprint = 355D 5B98 FECE 6199 83CD
-   * C91D 5760 6987 B007 D490 uid Testuser B &lt;testb@example.com&gt;
-   */
-  public static TestKey keyB() throws Exception {
-    return new TestKey(
-        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "mQENBEx6ntMBCADG7j/nuI+VvvNbPY9nnfLrAc3KTj0Z+DMxxUMYoZNLjTw1szQ0\n"
-            + "PuKKACiiSA9Oyj4R0aIhWdIR9iYxp6gQdje3yewzoqMwE+t5onYDpdX9QDFXyEzF\n"
-            + "UPWCjA7OSji1G6fyWakiYxKseqyRXOdHXI5TqMikBalmSpwwvmik0cfRGO+l6qvM\n"
-            + "mVJlcn6mkZB0d8WOPV8j8rFxmVSPn9SVP9L8HaFWv1uI9EY3zXbfNeDNgNeTWIMY\n"
-            + "75saINBA2LALBQ54u52GoSbaR8ukZYAjjkif3WIFI8B9xREwjUBLFy3E357aGyLZ\n"
-            + "jE8nsmPk4MDxDaeDNoSHJjcxtDWQJBub3u1zABEBAAG0HlRlc3R1c2VyIEIgPHRl\n"
-            + "c3RiQGV4YW1wbGUuY29tPokBPgQTAQIAKAUCTHqe0wIbAwUJAeEzgAYLCQgHAwIG\n"
-            + "FQgCCQoLBBYCAwECHgECF4AACgkQV2Bph7AH1JD0nQf/Vm+/Mvl99/y3Qw10S6et\n"
-            + "H6NYWDUeAKXe9mfXBJ39HdtlF50jZ5NzSwksAOSQtQZJ3tQQeElXB29cZDvAscva\n"
-            + "RiTtt+KUxDZSYbEHrC0EO7w0Wi5ltwaWdXnoitMOgPZ/grL7UpUbL8rB1evfLbhm\n"
-            + "AqC/6kgHuXeY/7EAzwU3o0wKbmfx1sh8AyQSi4unUwIDCV1RIAP0+ZfJSg0WwGoS\n"
-            + "JB5+lKajtIE6kMn9m8CWM66/zxSCY3XLcoXvjVxCYPwwgYSyje8dDxxOI+x7uj2I\n"
-            + "IjM5RHQ9hTsR7NQ9JUTFmpKZlcdah93NZLKJAFLUtOPjMa5d5t2O0ZOxZ5ftlhHp\n"
-            + "Q7kBDQRMep7TAQgAwOuLBXnACIsd879ld/vLcn8umpKV8MIUjrqOMjR0rNKpCUDw\n"
-            + "LxL4uVh3q/ksESHnQPPqxFYkgeA66SYrx4jwZjbZ5vv9BW99LHe8lSahqrJA9A9g\n"
-            + "5iw5hH+2ZWrGlu3P65UdQUJW+JaDx1IIBt3BbmdGDuKF/ESsy9qxEKq7tKqHI2JL\n"
-            + "Ed+6OIwWblU7ZogfiNpgZJ0lapxTe84mGsD0TowGTu5re/8wIJf1f2q4PuG+L9OZ\n"
-            + "0ZD5i9s1MAxdw4OD+705owPCQnqsr18nH9aUBHWJn9NCXb3jL7QGaId84Yq8SRlK\n"
-            + "wHSRtHLLJoowJ5fXw5UbZcUtRUergxFRwae87wARAQABiQElBBgBAgAPBQJMep7T\n"
-            + "AhsMBQkB4TOAAAoJEFdgaYewB9SQMbsH/iu1HY7OMJxd8EkfxairRNec/v9uEvYQ\n"
-            + "XqfEPw/Hihdef1TY8vB69ymAPd89e1PRDj1m+0/RivO045qFP7lbWMkjKeR9dXXe\n"
-            + "UzIEsTUJ1CNnA7C3fo11NBVg59E0d84bMKQx7n4AZkljgKFKghUb6OJZiWRdh+8W\n"
-            + "0I95JI2R7nMYw3L8/sSGxt+Vjhs9acB1DldbyYbJitYA4fhVZQH9zgeuhQqdCULQ\n"
-            + "ZexpkQqvG0o4iJKO4yeJNHdeM+NwH38wXfzydtEv6Dxz/YZSTwt08p97l6DQ//H7\n"
-            + "wek1LcqeX47YFa9Ftns8Y8fjh4S8Kyi1F6BhZKbsdDqg2hA+0AFv7LA=\n"
-            + "=tmW1\n"
-            + "-----END PGP PUBLIC KEY BLOCK-----\n",
-        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "lQOYBEx6ntMBCADG7j/nuI+VvvNbPY9nnfLrAc3KTj0Z+DMxxUMYoZNLjTw1szQ0\n"
-            + "PuKKACiiSA9Oyj4R0aIhWdIR9iYxp6gQdje3yewzoqMwE+t5onYDpdX9QDFXyEzF\n"
-            + "UPWCjA7OSji1G6fyWakiYxKseqyRXOdHXI5TqMikBalmSpwwvmik0cfRGO+l6qvM\n"
-            + "mVJlcn6mkZB0d8WOPV8j8rFxmVSPn9SVP9L8HaFWv1uI9EY3zXbfNeDNgNeTWIMY\n"
-            + "75saINBA2LALBQ54u52GoSbaR8ukZYAjjkif3WIFI8B9xREwjUBLFy3E357aGyLZ\n"
-            + "jE8nsmPk4MDxDaeDNoSHJjcxtDWQJBub3u1zABEBAAEAB/wPPV1Om92pc9F3jJsZ\n"
-            + "2F3YZxukLfjnA76tnMEWd/pYGrUhdV3AdY4r/aB0njSeApxdXRlLQ3L2cUxdGCJQ\n"
-            + "mzM1ies7IXCC/w5WaShwAG+zpmFL/5+cq3vDc9tb2Q/IasVOVFQYEE2el7SfW5Cp\n"
-            + "mjZFGR8V1wvdNvC0Q0IHrmfdECYSeftzZBEj7CcoGc2pF5zpCG0XQxq7K6cEeSf5\n"
-            + "TKf//UVHgyBCIso6mzgP5k6DGw2d64843CPhhlHEbirUu/wNnbm1SqJ5xFL2VatH\n"
-            + "w7ij4V/hbgnP0GQkbY5+p/PU74P7fx/Ee8D8mF2HmEKRy6ZQY/SAnrjsAURBYR5S\n"
-            + "GF5RBADfhOYEgseWr81lq6Y1oM4YQz+pXRIZk34BagOJsL767B7+uwhvmxBJKIOS\n"
-            + "nRIxfV8GlvT22hrbqsRRyusoIlo2ZUat94IMAL6Oqm6VFm71PT3z9+ukWK43FIXf\n"
-            + "Bsz4swSV001398e3jpSizI6fGW7LRxvnua+NPN+xJLmDVcsPvwQA49ajm48NorD9\n"
-            + "bIWG87+2ScNTVOnHKryR+/LrGWA0f3G6LUsHZPKHNBdFZ4yza2QtEKw95L3K9D4y\n"
-            + "jIeKGwSRYJPb5oh5tSge58pxwP88eI9J4dL+XF1nsG0vYF9B41+qG1TCsPyUJTp6\n"
-            + "ry7NAgWrbpsZpjB0yJ1kFva3iS/hD00EAMu66p1CtsosoDHhekvRZp8a3svd+8uf\n"
-            + "YEKkEKXZuNNmJJktJBSA2FK1RKl9bV8wuG0Pi1/k39egLO3QTjruWUbSggT+aibR\n"
-            + "RW3hU7G+Z5IBOU3p+kTFLat6+TBg0XhCjJ+Eq366nZy1QIfqTCixIaDwrutZd6DC\n"
-            + "BXOjdoG6ZvLcQia0HlRlc3R1c2VyIEIgPHRlc3RiQGV4YW1wbGUuY29tPokBPgQT\n"
-            + "AQIAKAUCTHqe0wIbAwUJAeEzgAYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQ\n"
-            + "V2Bph7AH1JD0nQf/Vm+/Mvl99/y3Qw10S6etH6NYWDUeAKXe9mfXBJ39HdtlF50j\n"
-            + "Z5NzSwksAOSQtQZJ3tQQeElXB29cZDvAscvaRiTtt+KUxDZSYbEHrC0EO7w0Wi5l\n"
-            + "twaWdXnoitMOgPZ/grL7UpUbL8rB1evfLbhmAqC/6kgHuXeY/7EAzwU3o0wKbmfx\n"
-            + "1sh8AyQSi4unUwIDCV1RIAP0+ZfJSg0WwGoSJB5+lKajtIE6kMn9m8CWM66/zxSC\n"
-            + "Y3XLcoXvjVxCYPwwgYSyje8dDxxOI+x7uj2IIjM5RHQ9hTsR7NQ9JUTFmpKZlcda\n"
-            + "h93NZLKJAFLUtOPjMa5d5t2O0ZOxZ5ftlhHpQ50DmARMep7TAQgAwOuLBXnACIsd\n"
-            + "879ld/vLcn8umpKV8MIUjrqOMjR0rNKpCUDwLxL4uVh3q/ksESHnQPPqxFYkgeA6\n"
-            + "6SYrx4jwZjbZ5vv9BW99LHe8lSahqrJA9A9g5iw5hH+2ZWrGlu3P65UdQUJW+JaD\n"
-            + "x1IIBt3BbmdGDuKF/ESsy9qxEKq7tKqHI2JLEd+6OIwWblU7ZogfiNpgZJ0lapxT\n"
-            + "e84mGsD0TowGTu5re/8wIJf1f2q4PuG+L9OZ0ZD5i9s1MAxdw4OD+705owPCQnqs\n"
-            + "r18nH9aUBHWJn9NCXb3jL7QGaId84Yq8SRlKwHSRtHLLJoowJ5fXw5UbZcUtRUer\n"
-            + "gxFRwae87wARAQABAAf8DAVBKsyswfuFGMB2vpSiVxaEnV3/2LoHFOOb45XwJSqV\n"
-            + "HL3+mThJ5iaUglMqw0CFC7+HA8fIS41grlFSDgNC02OcjS9rUxDg0En/pp17Gks0\n"
-            + "D+D7bSwZQ1+/yi7ug836lBe89GmBSMj8GgnK9T6RBGOL8nZ72b2ftK4CNWMmAfo4\n"
-            + "NZUy+rnnziV5WoYrkFZhl3dMMd3nITILBy9eYUoiKJl8O1b8amhrNkB/PEMAV7jc\n"
-            + "260XEQ9fgzMMe5/oT8pzIOGyrB+QO5rMu9pGVJ1qeMzTiZjjHXE2CEaEbvEk0F4l\n"
-            + "6w2gp5C6O5GoMpCOPwCy7dOYX5ETdO4Ppjnrob2XEQQAwus5q+EFoBVG8vfEf56x\n"
-            + "czkC15+0VcMe/IM8l/ur/oF1NUlAnPCq7WfgdELvGNszW7R+A625yXJJf7LJE/y/\n"
-            + "5GUGHAK60FUa0ElbVEn0A6kDcvll0dM6rKPQvFguaFpBKXre6k17cdOrf9hasfJk\n"
-            + "+lzaHlh9hJgoM30pAwG4+n8EAP1f+TEkEfVFo4Uy84eO6xVkYVndopDU1gCpfW1a\n"
-            + "84SA2PNjU3vkdIoFsEvOmf1xlfYeDYn37dikFPEZDsHBUzELDMewAXRgmVvnMJrj\n"
-            + "8Zq4FbEQSVjyz3qJOGk5V999qqoVMRXdnlQs5IXgZauPsnIqi5TRQZOMhbaiOVBO\n"
-            + "kqWRBAC9FhxypA3t9j1zGTFDppWmcBxpVzGGsgmzGO+WTVyk6szbZgTsf2+R+gTJ\n"
-            + "ZKVVzE6Mu+iZmPbrn/x7LWzKJuavRz0xSrvCYbIxYyheFz5LOPFHLF181h1g79gY\n"
-            + "E5Tz7uwu3jIldM7rY5RhxS6V5GGDVSfA+/Dsk6Iaujs6Hs7y30C0iQElBBgBAgAP\n"
-            + "BQJMep7TAhsMBQkB4TOAAAoJEFdgaYewB9SQMbsH/iu1HY7OMJxd8EkfxairRNec\n"
-            + "/v9uEvYQXqfEPw/Hihdef1TY8vB69ymAPd89e1PRDj1m+0/RivO045qFP7lbWMkj\n"
-            + "KeR9dXXeUzIEsTUJ1CNnA7C3fo11NBVg59E0d84bMKQx7n4AZkljgKFKghUb6OJZ\n"
-            + "iWRdh+8W0I95JI2R7nMYw3L8/sSGxt+Vjhs9acB1DldbyYbJitYA4fhVZQH9zgeu\n"
-            + "hQqdCULQZexpkQqvG0o4iJKO4yeJNHdeM+NwH38wXfzydtEv6Dxz/YZSTwt08p97\n"
-            + "l6DQ//H7wek1LcqeX47YFa9Ftns8Y8fjh4S8Kyi1F6BhZKbsdDqg2hA+0AFv7LA=\n"
-            + "=uFLT\n"
-            + "-----END PGP PRIVATE KEY BLOCK-----\n");
-  }
-
-  /**
-   * pub 2048R/D24FE467 2010-08-29 Key fingerprint = 6C21 10AC F4FC 1C7B F270 C00E 641F 1193 D24F
-   * E467 uid Testuser C &lt;testc@example.com&gt; sub 2048R/DBECD4FA 2010-08-29
-   */
-  public static TestKey keyC() throws Exception {
-    return new TestKey(
-        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "mQENBEx6nuMBCADd077pyfsDGbGhHh+7xzipWihMJRrzQnpbSeVJIxA/Js+Z2MW8\n"
-            + "9J98AgnjONjGVlLqtp11O8Bp9xgdoGYWvFl2CrooQrCe+70JORHE30MJT+61mgLQ\n"
-            + "jm9l2WmIIcuzNwoTOKqWlXuaRIKddXMVbwr++Enl/9znx81FCf1KioDijeeHzVZb\n"
-            + "IjELLCtLlhwhGlYNy6LfNhSY+rNHOomIM9CUXkGZU7JvTe3M1plUzYYIFu3tttZI\n"
-            + "b6e1FSfR60yZ/f88fLacloc3fSrPWA261R/gHuFfLCdTt/I3EcYE+x33LZnSSOgz\n"
-            + "v/JtAuFlCaF/oNRTJHeRbALeri+FxBYule15ABEBAAG0HlRlc3R1c2VyIEMgPHRl\n"
-            + "c3RjQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTHqe4wIbAwYLCQgHAwIGFQgCCQoL\n"
-            + "BBYCAwECHgECF4AACgkQZB8Rk9JP5GcEIgf/cMvYBwH8ENrWec366Txaaeh/TO6n\n"
-            + "4v4P2LUR4/hcrNpHx3+9ikznkyF/b8OCsOE+KstvOO6i9vuRGVBPmfoALVv8iCGs\n"
-            + "5MXZJskjACXOqQav0I7ZY5rDJxuOKq6DrxtpHNxK8n0D1PEZllyk/OZVBAcjL2vu\n"
-            + "WC6ujP3jbMKaV0+heFqOVIghQjdA4McLH2u1XLOGEZdp7hLfmTnClmfzbnslFBSQ\n"
-            + "xU2g3jCq2k2zAPhn+jOGCL0987QGj1e6pHRXdUxcfnLRyNadRied0HO/clIb8vdt\n"
-            + "UaexujHjgg+1KDxj4PBAftN2lRtnnsSG9z4T31aTFz5YVG+pq8UXk9ohCokBIAQQ\n"
-            + "AQIACgUCTHqkKQMFAngACgkQqZHi1Q/dNnexiQf/ba9LcR76+tVvos1cxrGO3VkD\n"
-            + "3R1pvIWsb37/NTypWCvrFhsy4OUEy3bVCfJcqfwdY3Q2XixB9kuKo3qCSom1EjGg\n"
-            + "Qhr5ZsrB3qYqaa6S0AeVusmIwArEr9uuMUDjXhKlUALDX8HfXWGy2UmjNJkkT8Jm\n"
-            + "GtISS4KOfXUuZY04DttvbukEnyxAiLU9V0BnzrI9DARh0gEjqjUZAVyP5lOXJJxt\n"
-            + "sau95mOe8E61GELXPkxDLrnCboX7ys2OxcFO6S7q1xJPkki2SVq0y0k5oY/3jktw\n"
-            + "jO8uC3n7NiyW+BYJK6+zj3u3iA+o0YGm+i6F7aneJEaJrFqRj9L1vbojvuH0cYkB\n"
-            + "IAQQAQIACgUCTHqkOwMFAngACgkQOwm5f0tDh+7dSQf+PnEUftNSOuLVLoJ+2tyD\n"
-            + "DPJpcLIavNCyNR3hCGL86NXRUxOrmYgDVVv8pJuYB6aUTm69rFFZlzNwqQN5pBiX\n"
-            + "Zr3NM1jgJT6gKfXddcg1p/X2S9+xn4RN92R0fn0kEjM65fpE1Do+YWHOuHDZEOrx\n"
-            + "L8OaSo8lr19+r27fn09/HBhz2lOyTYzsdTjHeWdxPVQ3JNiVX11k7iKsttdYtM/V\n"
-            + "mAHzzd54Kvt5So/2qLIAcfSmUe9DQAdmcEcJQpQ2veND9uwccX7tH0cH4n9Cp16o\n"
-            + "quJ2pxWzOvKR3zxSw+cRxyIS4VjT6k+UsG3Lw55QZgdb5IEaJfezPj+tOhQlQz0f\n"
-            + "VrkBDQRMep7jAQgAw+67ahlOGnkF6mTtmg6MOGzAbRQ11MNrORnNtGOccNgtlgrO\n"
-            + "Y8TBqw1HkJ56v26E1FxfRh69CUGkYVXx0tMw0QbI+unX35ce5hJD4aWa8bOA1vfw\n"
-            + "474p/NpI+czWsFvcdOu5K6xIGXHShaQQyf2FQ9QeIFrU60qfaBL5jzuLyujCACqU\n"
-            + "46QGgBgeUjaT54LjrWSdn/Jtsbpv0MPv3Ea8fMdtSMkkBsDkF55jaJDFYq+xbs+e\n"
-            + "IKBjTwtSvrUisnLAC0Z9YY21GXGI3DGYqpVXz+Fe5xMTX1a6K3VKEmxmX2m/ebhm\n"
-            + "1p6EqjAJguOjJbJJQHKHMOol0zU6ANB6SgP26wARAQABiQEfBBgBAgAJBQJMep7j\n"
-            + "AhsMAAoJEGQfEZPST+Rn7AcH/32HACPLdxINsi8OSWa8OccMG5XEUvHTZjmdwVT2\n"
-            + "czMss8nwgifU9D4hEVRu1MWpiyxUgegW94wuSh4PWIVOVd18PmzAYc73aYgonakb\n"
-            + "M+MDIqGVvAH8QtHo79sqZ9vrkQaQXB3Y8cq+WxDQZyl8KLXP2icmq1Rl6Q6+i9oS\n"
-            + "pFe88Wr0cGaTblkfDbbWcih3C6tKAfcFwLLg8u4jYfXjZg/E9eAJf0dIFcQSQoHd\n"
-            + "O8hVXaZwx/rYXA8UFwAuROo2nu6SIof1lrH92p+now95d5zUZ5BYnKVd3uXsln0j\n"
-            + "z585UPQKS2J8PUy9IirmahgTyEYFwO64kZ2B4hYOE2g+rYw=\n"
-            + "=LtMR\n"
-            + "-----END PGP PUBLIC KEY BLOCK-----\n",
-        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "lQOYBEx6nuMBCADd077pyfsDGbGhHh+7xzipWihMJRrzQnpbSeVJIxA/Js+Z2MW8\n"
-            + "9J98AgnjONjGVlLqtp11O8Bp9xgdoGYWvFl2CrooQrCe+70JORHE30MJT+61mgLQ\n"
-            + "jm9l2WmIIcuzNwoTOKqWlXuaRIKddXMVbwr++Enl/9znx81FCf1KioDijeeHzVZb\n"
-            + "IjELLCtLlhwhGlYNy6LfNhSY+rNHOomIM9CUXkGZU7JvTe3M1plUzYYIFu3tttZI\n"
-            + "b6e1FSfR60yZ/f88fLacloc3fSrPWA261R/gHuFfLCdTt/I3EcYE+x33LZnSSOgz\n"
-            + "v/JtAuFlCaF/oNRTJHeRbALeri+FxBYule15ABEBAAEAB/sFPLoJDG1eV5QpqEZf\n"
-            + "m/QMOTOn8ZJ9xraQvXFvV7zgVXxJBvTLMbuACrnHnoiCrULS+w8Dt66Nfz7s4yQJ\n"
-            + "5SDtFX2AlMDVWL7wBEPgF1UpN6ox1CzSa6HOaygaUFGeKHO20WDjV4HmBLhQkKIa\n"
-            + "vKbghHA/4Nm1s1z3BHB8GtdGZ1VHc+s1DhPK5w+WHqYpLYjpNmI9yJg3gclEqEG9\n"
-            + "XzBqTZm9mPJRBdDMOD0xLa4nUD3Dkrjimqod3X7EuXE6sT2DuGVa1nuynk/8gIyO\n"
-            + "uS6crY7YJzEQUtQJ2n3y/h+QnZFo9UFuIVpgsxhBDsCnYNFWNR91Q0IM6PohHvqx\n"
-            + "BtFhBADsax1Bc0obP+bIkeAXltGlUYqm3bjOgVZ87XR0qe4TGwXGe8T1Yjfc8rj0\n"
-            + "cfBYCud201r/05CgchojMnTWlFLg308bSIZ9YvN3oOVay8nZ7h62dUIs45zebw3R\n"
-            + "SHwvjE5Sm/VWIdLrUUW1aGfk/VPudNMMMu2C64ev8DF/iwYjoQQA8DM+9oPvFJPA\n"
-            + "kLYg71tP2iIE5GbFqkiIEx59eQUxTsn6ubEfREjI99QliAdcKbyRHc3jc68NopLB\n"
-            + "41L7ny0j6VKuEszOYhhQ0qQK/jlI461aG14qHAylhuQTLrjpsUPE+WelBm9bxli0\n"
-            + "gA8F81WLOvJ2HzuMYVrj3tjGl3AHetkEAI77VKxGCGRzK63qBnmLwQEvqbphpgxH\n"
-            + "ANNAsg5HuWtDUgk85t2nrIgL1kfhu++CfP9duN/qU4dw/bgJaKOamWTfLBwST8qe\n"
-            + "3F8omovi1vLzHVpmvQp6Ly4wggJ4Gl/n0DNFopKw20V8ZTiRYtuLS43H7VsczE+8\n"
-            + "NKjy01EgHDMAP8O0HlRlc3R1c2VyIEMgPHRlc3RjQGV4YW1wbGUuY29tPokBOAQT\n"
-            + "AQIAIgUCTHqe4wIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQZB8Rk9JP\n"
-            + "5GcEIgf/cMvYBwH8ENrWec366Txaaeh/TO6n4v4P2LUR4/hcrNpHx3+9ikznkyF/\n"
-            + "b8OCsOE+KstvOO6i9vuRGVBPmfoALVv8iCGs5MXZJskjACXOqQav0I7ZY5rDJxuO\n"
-            + "Kq6DrxtpHNxK8n0D1PEZllyk/OZVBAcjL2vuWC6ujP3jbMKaV0+heFqOVIghQjdA\n"
-            + "4McLH2u1XLOGEZdp7hLfmTnClmfzbnslFBSQxU2g3jCq2k2zAPhn+jOGCL0987QG\n"
-            + "j1e6pHRXdUxcfnLRyNadRied0HO/clIb8vdtUaexujHjgg+1KDxj4PBAftN2lRtn\n"
-            + "nsSG9z4T31aTFz5YVG+pq8UXk9ohCp0DmARMep7jAQgAw+67ahlOGnkF6mTtmg6M\n"
-            + "OGzAbRQ11MNrORnNtGOccNgtlgrOY8TBqw1HkJ56v26E1FxfRh69CUGkYVXx0tMw\n"
-            + "0QbI+unX35ce5hJD4aWa8bOA1vfw474p/NpI+czWsFvcdOu5K6xIGXHShaQQyf2F\n"
-            + "Q9QeIFrU60qfaBL5jzuLyujCACqU46QGgBgeUjaT54LjrWSdn/Jtsbpv0MPv3Ea8\n"
-            + "fMdtSMkkBsDkF55jaJDFYq+xbs+eIKBjTwtSvrUisnLAC0Z9YY21GXGI3DGYqpVX\n"
-            + "z+Fe5xMTX1a6K3VKEmxmX2m/ebhm1p6EqjAJguOjJbJJQHKHMOol0zU6ANB6SgP2\n"
-            + "6wARAQABAAf9HIsMy8S/92SmE018vQgILrgjwursz1Vgq22HkBNALm2acSnwgzbz\n"
-            + "V8M+0mH5U9ClPSKae+aXzLS+s7IHi++u7uSO0YQmKgZ5PonD+ygFoyxumo0oOfqc\n"
-            + "DJ/oKFaforWJ2jv05S3bRbRVN5l9G0/5jWC7ZXnrXBOqQUkdCLFjXhMPq3zg2Yy3\n"
-            + "XSU83dVteOtrYRZqv33umZNCdk44z6kQOvh9tgSCL/aZ3d7AqjRK99I/IYY1IuVN\n"
-            + "qreFriVcJ0EzlnbPCnva+ReWAd2zt5VEClGu9J0CVnHmZNlwfmbFSiUN1hiMonkr\n"
-            + "sFImlw3adfJ7dsi/GzCC4147ep6jXw7QwQQAzwkeRWR9xc3ndrnXqUbQmgQkAD3D\n"
-            + "p2cwPygyLr0UDBDVX0z+8GKeBhNs3KIFXwUs6GxmDodHh0t4HUJeVLs7ur5ZATqo\n"
-            + "Bx50cSUOoaeSHRFVwicdJRtVgTTQ4UwwmKcLLJe2fWv6hnmyInK7Lp8ThLGQgqo8\n"
-            + "UWg3cdfzCvhKSvsEAPJFYhsFA/E92xUpzP8oYs3AA4mUXB+F0eObe9gqv8lAE6SX\n"
-            + "gB5kWhcd+MGddUGJuJV2LRrgOx3nXu3m3n35AH6iAY4Qi9URPzi/K659oefUU1c5\n"
-            + "BFArHX9bN1k1cOvH28tpQ38eAxaMygLqyR5Q5VbtZ5tYqLKCvHVs3I8lekDRA/4i\n"
-            + "e0vlu34qenppPANPm+Vq/7cSlG3XY4ioxwC/j6Y+92u90DXbbGatOg1SqGSwn1VP\n"
-            + "S034m7bDCNoWOXL0yAcbXrLZV74AyfvVOYOs/WtehehzWeTQRT5lkxX5+xGc1/h6\n"
-            + "9HQvsKKnUK8n1oc5aM5xzRVkU9+kcmqYqXqyOHnIbDbPiQEfBBgBAgAJBQJMep7j\n"
-            + "AhsMAAoJEGQfEZPST+Rn7AcH/32HACPLdxINsi8OSWa8OccMG5XEUvHTZjmdwVT2\n"
-            + "czMss8nwgifU9D4hEVRu1MWpiyxUgegW94wuSh4PWIVOVd18PmzAYc73aYgonakb\n"
-            + "M+MDIqGVvAH8QtHo79sqZ9vrkQaQXB3Y8cq+WxDQZyl8KLXP2icmq1Rl6Q6+i9oS\n"
-            + "pFe88Wr0cGaTblkfDbbWcih3C6tKAfcFwLLg8u4jYfXjZg/E9eAJf0dIFcQSQoHd\n"
-            + "O8hVXaZwx/rYXA8UFwAuROo2nu6SIof1lrH92p+now95d5zUZ5BYnKVd3uXsln0j\n"
-            + "z585UPQKS2J8PUy9IirmahgTyEYFwO64kZ2B4hYOE2g+rYw=\n"
-            + "=5pIh\n"
-            + "-----END PGP PRIVATE KEY BLOCK-----\n");
-  }
-
-  /**
-   * pub 2048R/0FDD3677 2010-08-29 Key fingerprint = C96C 5E9D 669C 448A D1B9 BEB5 A991 E2D5 0FDD
-   * 3677 uid Testuser D &lt;testd@example.com&gt; sub 2048R/CAB81AE0 2010-08-29
-   */
-  public static TestKey keyD() throws Exception {
-    return new TestKey(
-        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "mQENBEx6nwkBCADuztv2tGhjPljwW46qEhth7ZnkdhYXuctZ6lNQuy5LMaEECE3C\n"
-            + "jvVKY+nBrgsLY2Trts+q+mdooBWvxy/qe5PAQTcPR83KjVS4fYwNMBgeRxBEZAZg\n"
-            + "DFwRRCsRrHost+cMgtzLocQ+vL3+9yTRAIe/WmYwbEDXg/c9JSC7kQbZqaAaOshO\n"
-            + "cIOyeB8/QoYee0fEnBzHMmcd0SB1YpwIvRG6v61lXmgpQ9CbovvXO6ZZyEyCX784\n"
-            + "9xprzqP1y03DPrbhuhBAY8EMf3KGJA1dEcU4+lbGEgmlOe2YSbWoLs7mRLFcq5xx\n"
-            + "JroYMtvXF04k4ZHNZAnT3IZc+lJyCqOp4vXpABEBAAG0HlRlc3R1c2VyIEQgPHRl\n"
-            + "c3RkQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTHqfCQIbAwYLCQgHAwIGFQgCCQoL\n"
-            + "BBYCAwECHgECF4AACgkQqZHi1Q/dNne/0wgApuPzh4J8p2quCK1ScsJHlgGRojGq\n"
-            + "IDPhZFtPn0p2IAkqr5sAhvZAjd3u9A2DqQ7pwOX7gnGRE7dSrK69IAjfbRMc5k16\n"
-            + "aBK2ADq2YgPEmTToots1A0Tj+LaCFOXYUtEkgAC+RfFIkCdt8z86GIr0kg19Q/vY\n"
-            + "I/LtvThAk28D8yIfDnW49Mc4GGq+qvrOytBaGu3dzW0mjYWGEyl0fdSjNqtKyWN7\n"
-            + "Qw70Kqysaoy1KiPRAgwiPQfMCEx6pVaXuAfgRKaJ18kCNOldpajLgQv6yeY7mhgu\n"
-            + "Q3Qe7xQlAtVObxskcTH2CWggl2dPqSMNieLK0g/ER8PIReGDCBXNSJ4qYbkBDQRM\n"
-            + "ep8JAQgAw/o1nhJPLGlIfEMzOGU0Jjj+DwEyB3QIEEc+WKRvgtGsJ4cbZdaGWBJq\n"
-            + "jSo7e9XC9jA2ih0+Gld0vWV7S0LZ84xXxQeadC+AZBFR+b9ga4aUFIji8Tdi2dWX\n"
-            + "QmY76hHIaF8rs6aJB7lRig735VRLxVHOb194t9KLUzZiEKqd71BvLQyuLqAfTEsT\n"
-            + "GRHgmydaxZbGXz+Z57jbQgm11CQEHX1dtS8uqWb64xrV5GAeuEhRj4R6Yiy7OPNi\n"
-            + "xXHxryH2Jd34pA0cGHYVcTgVjXuZ9FFP2SnXuxABONGAIaJuqg7ozYBa2kOdr0DN\n"
-            + "5Pxy5ocR7R2ZoN0pYD5+Cc7oGHjuCQARAQABiQEfBBgBAgAJBQJMep8JAhsMAAoJ\n"
-            + "EKmR4tUP3TZ369QIAKPlfX2TUfhP3otYiaa24zBJ/cvGljGiSfX0KrausBHH161j\n"
-            + "lraJfLzpe7vSOZhwZwgIY/eKoErAkJwVnX1+dLuOcHaqRDi5gnLqa6Yg9a2LWb4z\n"
-            + "rvgsvbiNUs1o9htOcvcpv7e3UUUcRa8lO+aNkO+VoI6DI8RJ3wIfJayboePRXdfr\n"
-            + "8g9of0jSdIOzlaaBPxA2wYSWXm4kv7QXzZooxuGqhn0+JKuq2+oO9y5QUig+c3oG\n"
-            + "a5mpVblmv5ZL6Gc36kCbeEC8j6JkNT4wnceQwpNUNYtPU186cjy3rAD4C58w0Uvp\n"
-            + "HZZSTc0syLOShQr//We39LUNaX6WF3NmyF8K/OM=\n"
-            + "=YDhQ\n"
-            + "-----END PGP PUBLIC KEY BLOCK-----\n",
-        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "lQOYBEx6nwkBCADuztv2tGhjPljwW46qEhth7ZnkdhYXuctZ6lNQuy5LMaEECE3C\n"
-            + "jvVKY+nBrgsLY2Trts+q+mdooBWvxy/qe5PAQTcPR83KjVS4fYwNMBgeRxBEZAZg\n"
-            + "DFwRRCsRrHost+cMgtzLocQ+vL3+9yTRAIe/WmYwbEDXg/c9JSC7kQbZqaAaOshO\n"
-            + "cIOyeB8/QoYee0fEnBzHMmcd0SB1YpwIvRG6v61lXmgpQ9CbovvXO6ZZyEyCX784\n"
-            + "9xprzqP1y03DPrbhuhBAY8EMf3KGJA1dEcU4+lbGEgmlOe2YSbWoLs7mRLFcq5xx\n"
-            + "JroYMtvXF04k4ZHNZAnT3IZc+lJyCqOp4vXpABEBAAEAB/0Yf+FiLHz/HYDbW9FF\n"
-            + "kmj7wXgFz7WRho6dsWQNxr5HmZZWxxFPMgJpONnc9GGOsApFAnLIrDraqX3AFFPO\n"
-            + "nxH36djfuPKcYqZ77Olm2vXGeWzqT0a2KN5zKQawH/1CxDUwe+Zx/60V8KAfXbSJ\n"
-            + "up+ymnAcbKa0VYYSYFI82/KTdthJ1jFMNtXkaLskpM8TrDBCgd38m8Dpb5GCrDVY\n"
-            + "faZgkHokTTrvaTcx7ebGOxlOcbfzOPMJyFiz6lHf4JGr5ZVQXymaAG18kRDFxXHm\n"
-            + "AskOJIxnMdcy2IzNximht2CIgRuGznyPoeh/j8KFONKIKf3N6dVfV12uIvGOVV+D\n"
-            + "/ZQZBAD2dennp3Z4IsOWkgHTG3bloOVcIY5n+WvliQY/5G3psKdKeaGZxt6MhMSj\n"
-            + "sJEiUgveYTt5PxvQc5jmFEyjEQJmDAHo3RbycdFVvICrKIhKFyIlcVFCOSwDvLAW\n"
-            + "aZhu/m47jGnnYZ+bDzZl4X8L7Zu8e3TStEiVhjYTRqJfdEdMVQQA+A0ehIhIa1mJ\n"
-            + "ytGKWQVxn9BwKTP583vf2qPzul7yDEsYdGfoA0QGUicVwV4NNK3vK3FQM9MBSevp\n"
-            + "JFpxh2bRS/tgd5tFDyRqekTcagMqTxnJoIpCPUvj5D+WXsS1Kwrcm7OpWoNHOcjD\n"
-            + "Hbhk/966QALO+T6BTVLx32/72jtQ10UD/RsqQfRDzlQUOd6ZYOlH5qCb1+f8f3qJ\n"
-            + "yUmudrmjj8unBK3QbBVrxZ1h9AyaI5evFmsMlLKdTp0y49CmrSQmgEnUYzvBDjse\n"
-            + "/jYanpRKnt69HeZFilHLIF+HBbQfSM66UVXVoJSNTJIsncVa0IcGoZTpCUVOng3/\n"
-            + "MLfW4sh9NX1yRIi0HlRlc3R1c2VyIEQgPHRlc3RkQGV4YW1wbGUuY29tPokBOAQT\n"
-            + "AQIAIgUCTHqfCQIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQqZHi1Q/d\n"
-            + "Nne/0wgApuPzh4J8p2quCK1ScsJHlgGRojGqIDPhZFtPn0p2IAkqr5sAhvZAjd3u\n"
-            + "9A2DqQ7pwOX7gnGRE7dSrK69IAjfbRMc5k16aBK2ADq2YgPEmTToots1A0Tj+LaC\n"
-            + "FOXYUtEkgAC+RfFIkCdt8z86GIr0kg19Q/vYI/LtvThAk28D8yIfDnW49Mc4GGq+\n"
-            + "qvrOytBaGu3dzW0mjYWGEyl0fdSjNqtKyWN7Qw70Kqysaoy1KiPRAgwiPQfMCEx6\n"
-            + "pVaXuAfgRKaJ18kCNOldpajLgQv6yeY7mhguQ3Qe7xQlAtVObxskcTH2CWggl2dP\n"
-            + "qSMNieLK0g/ER8PIReGDCBXNSJ4qYZ0DmARMep8JAQgAw/o1nhJPLGlIfEMzOGU0\n"
-            + "Jjj+DwEyB3QIEEc+WKRvgtGsJ4cbZdaGWBJqjSo7e9XC9jA2ih0+Gld0vWV7S0LZ\n"
-            + "84xXxQeadC+AZBFR+b9ga4aUFIji8Tdi2dWXQmY76hHIaF8rs6aJB7lRig735VRL\n"
-            + "xVHOb194t9KLUzZiEKqd71BvLQyuLqAfTEsTGRHgmydaxZbGXz+Z57jbQgm11CQE\n"
-            + "HX1dtS8uqWb64xrV5GAeuEhRj4R6Yiy7OPNixXHxryH2Jd34pA0cGHYVcTgVjXuZ\n"
-            + "9FFP2SnXuxABONGAIaJuqg7ozYBa2kOdr0DN5Pxy5ocR7R2ZoN0pYD5+Cc7oGHju\n"
-            + "CQARAQABAAf/QiN/k9y+/pB7h4BQWXCCNIIYb6zqGuzUSdYZWuYHwiEL1f05SFmp\n"
-            + "VjDE5+ZAU+8U0Gv+BAeRbWdlfQOyI/ioQJL1DggeXqanUF4uCbjGDBPLhtCZsmmM\n"
-            + "QVLdrOl+v+SHe33e7E7AQSyQMaUSkUEtHycYIasZPQRfw9H/L3u9OEWXkMUbPso5\n"
-            + "L0A0StkcsM1isYfC8ApnF4zSTWHO9uqnc+qE4qChCqsGvaSIyLKEpVe4F0vEkbrq\n"
-            + "3usVp3cxJd9apN+JjMoC9dHJcQahgfJZ1jzgJ3rueRxrGZV+keo8VmyrDGFCerX9\n"
-            + "6Ke3RPMHN/evCHyPMtHC82QKYuy4ZTvldwQAyzbNKIIpNjyHRc/hXLMBUtnW0VYS\n"
-            + "dELA1VBMmT/d6Xx6pI9gg9HCjDx+DuQRych7ShxrYLL1pNQD8jwEJhZIeUpSgIFD\n"
-            + "BXdwkiGbmdrU5N0tBhxp8kRcqcGbL68zC9S0X2hNju6Dxu9hbG8ZAdYaCdAavVy0\n"
-            + "O6E66+T0cLRBinsEAPbiL/0rpV15DdITwD3hvzhYDyURE+yxQZe9ngS1uoui3mGn\n"
-            + "bLc/L/nbHf2Z91ViSsUaqJjpb2/eDsJtGJ9pFlFLTndujkA62CktJytD9DIYLlYD\n"
-            + "huXlsKvZkNZEZNDKLC5Tg8YR/28Opz0/ZFzfVuJAQqg7+iWkxklG3SvN71RLA/9x\n"
-            + "wun1AEw6tLJ2R2j8+yXIt8UaWExqAviT/JgZELVXdCTqcYuOmktsM2z+2D+OyUtP\n"
-            + "7+Yyz7MGQKMAU+V/1uOK4YqwUJrcGy501o9Of+xm+5DASsK1oM5e9sBdmNewdLHL\n"
-            + "ZJEllURrEC6zCE/4zzs7qUfakH4l4ZJgjRL6va+ED0HfiQEfBBgBAgAJBQJMep8J\n"
-            + "AhsMAAoJEKmR4tUP3TZ369QIAKPlfX2TUfhP3otYiaa24zBJ/cvGljGiSfX0Krau\n"
-            + "sBHH161jlraJfLzpe7vSOZhwZwgIY/eKoErAkJwVnX1+dLuOcHaqRDi5gnLqa6Yg\n"
-            + "9a2LWb4zrvgsvbiNUs1o9htOcvcpv7e3UUUcRa8lO+aNkO+VoI6DI8RJ3wIfJayb\n"
-            + "oePRXdfr8g9of0jSdIOzlaaBPxA2wYSWXm4kv7QXzZooxuGqhn0+JKuq2+oO9y5Q\n"
-            + "Uig+c3oGa5mpVblmv5ZL6Gc36kCbeEC8j6JkNT4wnceQwpNUNYtPU186cjy3rAD4\n"
-            + "C58w0UvpHZZSTc0syLOShQr//We39LUNaX6WF3NmyF8K/OM=\n"
-            + "=e1xT\n"
-            + "-----END PGP PRIVATE KEY BLOCK-----\n");
-  }
-
-  /**
-   * pub 2048R/4B4387EE 2010-08-29 [expired: 2011-08-29] Key fingerprint = F01D 677C 8BDB 854E 1054
-   * 406E 3B09 B97F 4B43 87EE uid Testuser E &lt;teste@example.com&gt;
-   */
-  public static TestKey keyE() throws Exception {
-    return new TestKey(
-        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "mQENBEx6nxoBCADjYOWOFa7ZBJpRuNspRoXBTK0LiK5zqN894b87LgIYEgUM6q5J\n"
-            + "yLNo43x7V+ow1/7BEq0JUAMSQ3uRn2jqXiJskSXvwlFYcTVFb0gY09CSD0ptHvda\n"
-            + "zqYOuM/MU1l9jqmlM+pDw/z0pLTKYmAHi6pKJ64pqccMHPUZHpLywyzSNX+JM86I\n"
-            + "K5KAsyGArtgpT9vfci3idNeXjhMR8rfLPDFbdGvGFOZrYv0cfgTbBpVEWeHjs2FR\n"
-            + "4vHG133AdjdZcvA9Y9VW34ZLeiyBEeFix7+HPVS82rko2kQxZu1UZRu340maKDAo\n"
-            + "+UVirgo0FQ8nNUR+c9oNKgiZtO39IAPJv/WZABEBAAG0HlRlc3R1c2VyIEUgPHRl\n"
-            + "c3RlQGV4YW1wbGUuY29tPokBPgQTAQIAKAUCTHqfGgIbAwUJAeEzgAYLCQgHAwIG\n"
-            + "FQgCCQoLBBYCAwECHgECF4AACgkQOwm5f0tDh+6Fowf9FZgntlW4qc7BHe8zYJ0q\n"
-            + "zoLZrHwCFcaeO3kz53y5Lz3+plMuqVDjoQDOt8DxsPHrXWKiu0qBTjZ28ztN3ef6\n"
-            + "f0MpguTGclvFroevUct0xiyox5r1DfMT8JRvqsojE1XPscR2zJzIgEg3OCPuksT9\n"
-            + "EsHsF+/3RBbsXbQgDpW38g0GzIJI4AiQ/yvG2ON9awN2kzIWoBkthVCGy54lCTGj\n"
-            + "yPhatE7Zu2ABNcerIDstupWww2Psec6pGbPPci8ojc90fzalk3UMXcXHD7m8cTJS\n"
-            + "kgHScOzTElIQqOA1+w6uiHy2oAn+qW7534j6p9Tj+DrSIzUXBedGjXZevaKaurVy\n"
-            + "KLkBDQRMep8aAQgAn5r6toYnEzwDeig8r+t89vqOFtohYcmtyeLeTiTTdAz/xWBW\n"
-            + "HUlqV8sglQ9aINpGtBf37v13RhtU3WkUv8cZMQoRM8P2H3cKDNwkucFO6uKSEQO5\n"
-            + "FdzTm4C4WaoE7QiTRbiekwh7O54mz4Wup6LHuEFQEcSpdRUp8w/qaJIHG9EJad1q\n"
-            + "UEsKNnITW+mWHY3+ccK1hgqPwOPqO3/8QtaipekKOYAtOb+57c1jtDFBZnYIkant\n"
-            + "oKs+kRw0DykXFTyFOMYqaleBMcVG+u7ljwAq18L8Ev+qVIpBIZ5eQ5+6p1w9B69h\n"
-            + "RH0Ebn50ebpoqKOXhN4/bu/wq596y0o4xDB0GQARAQABiQElBBgBAgAPBQJMep8a\n"
-            + "AhsMBQkB4TOAAAoJEDsJuX9LQ4fu0/wH/35/22xina8ktbvGV/kB0pH2LBqeXN/b\n"
-            + "CLdA+CDzfwMDzqG0kU39EJ3Fbux7fj4uMaeiYfbO9U85+NOuDmeH41B2dM9S1AzE\n"
-            + "H+/OiCp/Zf1fdd1qXhsA4Xe5vc/VD9oso9OrZK5CM5u0TPmYFijfVDPNgag6mPnD\n"
-            + "zd8JCsuEj4VEy6NF1KcoCc8edQ8AZ4L6ZQ6qiV24gxLnh8xImVr5YjBKDUCdrl79\n"
-            + "0u4wekfgapSx9Sw9Ycz5dFOL07OOHPiKZwUG0f8td6oJX4Ddxset5JAm1pPcLQHR\n"
-            + "6PRx0hI/Tz7rsAI6O37/BEM15+MVGIgOSLL/SRIpOa0L8qmuUhhS6Bg=\n"
-            + "=uA5x\n"
-            + "-----END PGP PUBLIC KEY BLOCK-----\n",
-        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "lQOYBEx6nxoBCADjYOWOFa7ZBJpRuNspRoXBTK0LiK5zqN894b87LgIYEgUM6q5J\n"
-            + "yLNo43x7V+ow1/7BEq0JUAMSQ3uRn2jqXiJskSXvwlFYcTVFb0gY09CSD0ptHvda\n"
-            + "zqYOuM/MU1l9jqmlM+pDw/z0pLTKYmAHi6pKJ64pqccMHPUZHpLywyzSNX+JM86I\n"
-            + "K5KAsyGArtgpT9vfci3idNeXjhMR8rfLPDFbdGvGFOZrYv0cfgTbBpVEWeHjs2FR\n"
-            + "4vHG133AdjdZcvA9Y9VW34ZLeiyBEeFix7+HPVS82rko2kQxZu1UZRu340maKDAo\n"
-            + "+UVirgo0FQ8nNUR+c9oNKgiZtO39IAPJv/WZABEBAAEAB/4xKKzYqDVyM/2NN5Mi\n"
-            + "fF3EqegruzRESzlgrqLij5LiU1sGLOLbjunC/pPWMu6t+rTYV0pT3hmb5D0eAcH0\n"
-            + "EcANiuAR0wg1P9yNk36Z54mLWoTzzKMb3dunCSvb+BU8AREKZ4v5dLEGz2lK7DPo\n"
-            + "zbhWaffMiClBpC0VbjfFBo91LrVUVnhRglBYKdPLQm/Lhw5cNCYOw194ZturO+cC\n"
-            + "iQZhGSy52HMoMs4Wr470CeFZvvWaiDCirVLcj4UhMsVANFKsahMARm9c+QrGrkRP\n"
-            + "+654f8M9ptapcQYpGOMmaeZVnpocONXOTkiJd7Hhr4PRUY+QS8C8F0LbmL2ERQbL\n"
-            + "F65RBADkIelztY/8Xy2S0jsW7+xF2ziz9riOR87G6b0wrXDdFz4GHPzLvwsdXOeN\n"
-            + "cODic14d9bf5jtXr9hgbAzx55ANDjOl3jK5qil8Z9qwsrNK9Mz0wT1acQXBwf/5D\n"
-            + "hI/whBK1FsH7Y+wdX64XA3EXmclxB8GZf1JsGXF3jNH30vyS7QQA/ydoMMw8ja9L\n"
-            + "j6MxHtVHcE4A4j6tFljLDuf8icOwwNUfb7SsHTDjUI2+30ZJOv+qISrthsASCSj3\n"
-            + "AN87CGdVR62Xe923DNdW8/moKKDILNaESyOi27qhI5qWrVRgNB5QwbQcSoClUxbj\n"
-            + "V7YZSfrZkiI+GE1gh1QPMOVyCUmqu90D+wc0x0wUj8emX/4xbbujOa5RAvNcNvnD\n"
-            + "mOB2CfPWD10TEeOOlHBhuoy2/GdIl76W0szJaxnzcV82VArllSciCBzpSfkExDZ6\n"
-            + "08hA8GpOsuOmAAPwXWZsb8YZbJeM0ULMgUCGHgvUj1/pGsCVA6c7sPAdkCfAFlmO\n"
-            + "smC9bvpS2VHZPuG0HlRlc3R1c2VyIEUgPHRlc3RlQGV4YW1wbGUuY29tPokBPgQT\n"
-            + "AQIAKAUCTHqfGgIbAwUJAeEzgAYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQ\n"
-            + "Owm5f0tDh+6Fowf9FZgntlW4qc7BHe8zYJ0qzoLZrHwCFcaeO3kz53y5Lz3+plMu\n"
-            + "qVDjoQDOt8DxsPHrXWKiu0qBTjZ28ztN3ef6f0MpguTGclvFroevUct0xiyox5r1\n"
-            + "DfMT8JRvqsojE1XPscR2zJzIgEg3OCPuksT9EsHsF+/3RBbsXbQgDpW38g0GzIJI\n"
-            + "4AiQ/yvG2ON9awN2kzIWoBkthVCGy54lCTGjyPhatE7Zu2ABNcerIDstupWww2Ps\n"
-            + "ec6pGbPPci8ojc90fzalk3UMXcXHD7m8cTJSkgHScOzTElIQqOA1+w6uiHy2oAn+\n"
-            + "qW7534j6p9Tj+DrSIzUXBedGjXZevaKaurVyKJ0DmARMep8aAQgAn5r6toYnEzwD\n"
-            + "eig8r+t89vqOFtohYcmtyeLeTiTTdAz/xWBWHUlqV8sglQ9aINpGtBf37v13RhtU\n"
-            + "3WkUv8cZMQoRM8P2H3cKDNwkucFO6uKSEQO5FdzTm4C4WaoE7QiTRbiekwh7O54m\n"
-            + "z4Wup6LHuEFQEcSpdRUp8w/qaJIHG9EJad1qUEsKNnITW+mWHY3+ccK1hgqPwOPq\n"
-            + "O3/8QtaipekKOYAtOb+57c1jtDFBZnYIkantoKs+kRw0DykXFTyFOMYqaleBMcVG\n"
-            + "+u7ljwAq18L8Ev+qVIpBIZ5eQ5+6p1w9B69hRH0Ebn50ebpoqKOXhN4/bu/wq596\n"
-            + "y0o4xDB0GQARAQABAAf7Bk9bQCIXo2QJAyhaFd5qh10qhu7CyRnvG/8zKMW98mWd\n"
-            + "KxF+9hNz99qZBCuiNZBLoU0dST6OG6By/3nrDxXxAgZS3cgOj/nl1NJTRWDGHPUu\n"
-            + "LywFgj7Dwu8Y2rqlDTX8lJIS+t8n+BhtkmDHoesGmFtErh8nT/CxQuHLM60qSMgv\n"
-            + "6mSmtOkM+2KfiA5z2o1fDWXjDieW+hdgDPxkaB835wfuDn/Dsn1ch1XHON0xSyTo\n"
-            + "+c35nFXoK1pAXaoalAxZNxcXCAM3NhU37Ih4GejM0K7sSgK72HmgxtNYF77DrTIM\n"
-            + "m5+3960ri1JUuEaJ7ZcqbpKxy/GDldNCYBTx07QMzQQAyYQ+ujT9Pj8zfp1jMLRs\n"
-            + "Xn9GsvYawjo+AIZuHeUmmIXfEoyNmsEUoGHnz9ROLnJzanW5XEStiTys8tHJPIkz\n"
-            + "zL0Ce0oUF93ln0z/jQBIKaSzYB7PMmYCd7ueF94aKqAOrQ/QBb+6JsVjGAtLUoTv\n"
-            + "ey09hGYMogiBV1r0MB2Rsa8EAMrB5VKVQF6+q0XuP6ljFQRaumi4lH7PoQ65E7UD\n"
-            + "6YpyQpLBOE7dV+fHizdUuwsD/wyAOu0EskV1ZLXvXzyk10r3PRoFdpHOvijwZBGt\n"
-            + "jiOiVvK1vkQKDMBczOe74+DaknKn6HzgCsXmLgfk+P8BtLOJnCYsbS9IbnImy2vi\n"
-            + "aJC3A/9wOOK+po8C7JPHVIEfxbe7nwHOoi/h7T4uPrlq/gcQRquqGhQ16nDGYZvX\n"
-            + "ny9aPQ3NcvDR69RM2AaXav03bHVxfhVEyGjP5jLZz7956e4LlnKrsuEhDLfiv30i\n"
-            + "qCC7zNHNA99s5u25vt8AuPVVHfSQ++jifabfv5lU4FHqmK8/4EAoiQElBBgBAgAP\n"
-            + "BQJMep8aAhsMBQkB4TOAAAoJEDsJuX9LQ4fu0/wH/35/22xina8ktbvGV/kB0pH2\n"
-            + "LBqeXN/bCLdA+CDzfwMDzqG0kU39EJ3Fbux7fj4uMaeiYfbO9U85+NOuDmeH41B2\n"
-            + "dM9S1AzEH+/OiCp/Zf1fdd1qXhsA4Xe5vc/VD9oso9OrZK5CM5u0TPmYFijfVDPN\n"
-            + "gag6mPnDzd8JCsuEj4VEy6NF1KcoCc8edQ8AZ4L6ZQ6qiV24gxLnh8xImVr5YjBK\n"
-            + "DUCdrl790u4wekfgapSx9Sw9Ycz5dFOL07OOHPiKZwUG0f8td6oJX4Ddxset5JAm\n"
-            + "1pPcLQHR6PRx0hI/Tz7rsAI6O37/BEM15+MVGIgOSLL/SRIpOa0L8qmuUhhS6Bg=\n"
-            + "=HTKj\n"
-            + "-----END PGP PRIVATE KEY BLOCK-----\n");
-  }
-
-  /**
-   * pub 2048R/31FA48C4 2010-09-01 Key fingerprint = 85CE F045 8113 42DA 14A4 42AA 4A9F AC70 31FA
-   * 48C4 uid Testuser F &lt;testf@example.com&gt; sub 2048R/50FF7D5C 2010-09-01
-   */
-  public static TestKey keyF() throws Exception {
-    return new TestKey(
-        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "mQENBEx+aQkBCADycHmQ8wC4GzaDIvw4uv6/HiTWOUmuLcT06PpsvNBdR2sQ6Vyy\n"
-            + "w1SAnaPmskdgxE7TXpDrwIWPmIkg8KzSfPAap6qZy5zyE1ABQa9yD9v6wsew+lM5\n"
-            + "3UdBO6HQodpWSJMbeR48mUQ96z72B7Lb2GvhFLxvcn5od9jQhbQXfb2k67l33hgR\n"
-            + "D427lxXa+qnmL9pMRGhRw6QATFX+icHxsPfpKnzuk0aY3feJm4+jr4RgHP4djH3i\n"
-            + "NZbv3ibZ24Dj3CK07PwbhqUhZwMqueWbo3ChYjLkRGT/UosNTN0EbHjqBMl4N9OT\n"
-            + "Pl2CM6kuzuaLz3ZeAf48B29GX4rAXfuJTKBbABEBAAG0HlRlc3R1c2VyIEYgPHRl\n"
-            + "c3RmQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTH5pCQIbAwYLCQgHAwIGFQgCCQoL\n"
-            + "BBYCAwECHgECF4AACgkQSp+scDH6SMRfqggAh//U/l4JuwFgWx14mo0SB9YWU81L\n"
-            + "EgUYUd2MUzvX4p/HIFQa0c7stj68Za40+O0tG/J0RCMNb7piM9JFii+MQZzOVuza\n"
-            + "4bbO59D9qboc7Anvx9hGlfIdinT+n5rwX9kZvD2D7GMskm8ZgovkvNwNKcW+5W/4\n"
-            + "ciWqCJKE/Fp9XsooJgN94pJfgDQ2WBL5KDx1aGt4wZXhH2Atl6a6oVZJIH4SaizD\n"
-            + "jau7F4vc7hBfbcDhxFcrVX1QMpzpl352cIx6KVw4FRWvQ8VKkga4JiQwosfvCT2Z\n"
-            + "pdMwy3cARynv8BWLc4Uexf88QIeClP9ZhoVeMqvHMfUb3d6Q5362VdZqI4kBIAQQ\n"
-            + "AQIACgUCTH5xcgMFCngACgkQiptSk+LTK6UqsAgAlsEmzC3Xxv4o5ui95AFbWZGi\n"
-            + "es5rI9WoW2P+6OqVUy1E8+5HdlJ8wUbU1H7JAdFTjY9rH3vKXCXsTetF4z0cupER\n"
-            + "Rkx06M9/jl5OSw8i9bPNNJFobHwiiNO00ctC1tT5oUVXVsfPQHlEbMofv8jehfgC\n"
-            + "gMqH/ve/aafKFfYCZkNHugRgLzxeDpXp3IdyXoSAFGiULnGvMDN7n61QOvEYOw2Z\n"
-            + "i63ql+bL2oj4G+/bNOkdYkuIBN4F/P45P7xy80MSOvkMH7IG/aFTKMNQGWSykKwI\n"
-            + "FRkC+y+F5Oqf/WD30GvbSA7q013sb6nHYvsaHS/48cgIJ5TSVd0LTlrF9uv43bkB\n"
-            + "DQRMfmkJAQgAzc1uAF4x16Cx4GtHI0Hvm+v7bUEUtBw2XzyOKu883XC5JmGcY18y\n"
-            + "YItRpchAtmacDpu0/2925/mWF7aS9RMgSYI/1D9LaTeimISM3iGFY35kt78NGZwJ\n"
-            + "DeCPJPI1sbOU0njfrCPTbOQuRDJ6evaBNX9HYArSEp0ygruJdOUYgnepCt4A7W95\n"
-            + "EKp9KPo7XV1K8y86vrKbgpJ+NnEi7dzMqVxnhO4wAWqb6HYcKLrEc2gVnLtzHkBl\n"
-            + "Y/6dOP15jgQKql1/yQIXae/WGT24n/VeaKqrbSmDNkhW5eW5o1Bkgy/M98oNHXd0\n"
-            + "nVrT8Lyf6un5TwMy+vk0l5AjMMtIZKS0GQARAQABiQEfBBgBAgAJBQJMfmkJAhsM\n"
-            + "AAoJEEqfrHAx+kjEvDAH/iO6BHQfFa+kqjfYD3NE+FNosXv3jiXOU7SCD2MG3AwD\n"
-            + "YqM+v1n4UvvMLLdEbtboht1Btys1vuyNM3RAmR45oh9Dfuc4SKtVzSCkKs85jNvH\n"
-            + "7Ik8gxZ9ARzJbawNzTLFyLwDdcdX42Umuvh49Pn7Nc7FDYcZLffEcTh9sZ7KyxLY\n"
-            + "qcjtnblx5oOQnYnpBbM61GvgNXC8Z+g9fg0oHRouKXKE/HDKbsN0siEf9XJFJTKd\n"
-            + "Eg1NgoyKWdaV4+pU/fTzZUvvDqOSRx8he5w64dvW9o7WdARq/3vPvHgy0O8fMTSI\n"
-            + "tmcHxCU8l0jptJz181N36Uhmjyc9oC4dn9ceSn6VDbg=\n"
-            + "=WDx2\n"
-            + "-----END PGP PUBLIC KEY BLOCK-----\n",
-        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "lQOYBEx+aQkBCADycHmQ8wC4GzaDIvw4uv6/HiTWOUmuLcT06PpsvNBdR2sQ6Vyy\n"
-            + "w1SAnaPmskdgxE7TXpDrwIWPmIkg8KzSfPAap6qZy5zyE1ABQa9yD9v6wsew+lM5\n"
-            + "3UdBO6HQodpWSJMbeR48mUQ96z72B7Lb2GvhFLxvcn5od9jQhbQXfb2k67l33hgR\n"
-            + "D427lxXa+qnmL9pMRGhRw6QATFX+icHxsPfpKnzuk0aY3feJm4+jr4RgHP4djH3i\n"
-            + "NZbv3ibZ24Dj3CK07PwbhqUhZwMqueWbo3ChYjLkRGT/UosNTN0EbHjqBMl4N9OT\n"
-            + "Pl2CM6kuzuaLz3ZeAf48B29GX4rAXfuJTKBbABEBAAEAB/4vTP+C5s5snS6ZDlHc\n"
-            + "datvOV/hhgLYn2huiigV4A7dLCp4/bbOz+pkP51zTLQ9bn+coLYwsPq+Bfo3OY3W\n"
-            + "cXbdFHpmEEJaPqdc32ZuICcAuVEBuA1V3FTjJtHO5U02iWleMlbSZurYE9ZQZTch\n"
-            + "yotdulB7hACivENKh9OXw7ok+1GZVvBGA8tpIwzLZo0Pkb2lDQHaL0GXAjlMNzwg\n"
-            + "cCPFtzjNu6K4g58nuYrjGiE+yWPMJgfo4fTGXcapqXgvh1tKIVxwr2YQSyEOqfMH\n"
-            + "8EwgBj5NPwv0UXAivQUkTaguUJXrlJLtS3mp45nCEAlGT4PNoMyPdvPEf62gND7C\n"
-            + "y9K1BAD493ADPAx9pWCSQI9wp4ARUelTzwHgZ6fRVIzmwO6MuZN1PrtiOLCwY5Jw\n"
-            + "r+97VvMmem7Ya3khP4vz0IiN7p1oCR5nJazk2eRaQNuim0aB0lqrTsli8OXtBlgQ\n"
-            + "5WtLcRi5798Jw8coczc5OftZKhu1SbQZ1VdDdmTbMTAsSRtMjQQA+UnU6FYJZBjE\n"
-            + "NHNheV6+k45HXHubcCm4Ka3kJK88zbZzyt+nrBLEtElosxDCqT8WbiAH7qmpnd/r\n"
-            + "ly7ryIX08etuWVYnx0Xa02cKQ6TzNcbxijeGQYGHIE0RK29nRo8zRWVmbCydqJz1\n"
-            + "5cHgcvoTu7DWWjM5QEZlLPQytJeAyocEAM6AiWDXYVZVnCB9w0wwK/9cX0v3tfYv\n"
-            + "QrJZCT3/YKxJWnMZ+LgHYO0w1B0YwGEeVTnmXODDy5mRh9lxV1aZnwKCwMR1tXTx\n"
-            + "G1potBR0GJxI2xpMb/MJPxeJCAZPu8NncRpl/8v0stiGnkpYCNR/k3JV5jEXq0u6\n"
-            + "4pDSzRGehOHnOqu0HlRlc3R1c2VyIEYgPHRlc3RmQGV4YW1wbGUuY29tPokBOAQT\n"
-            + "AQIAIgUCTH5pCQIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQSp+scDH6\n"
-            + "SMRfqggAh//U/l4JuwFgWx14mo0SB9YWU81LEgUYUd2MUzvX4p/HIFQa0c7stj68\n"
-            + "Za40+O0tG/J0RCMNb7piM9JFii+MQZzOVuza4bbO59D9qboc7Anvx9hGlfIdinT+\n"
-            + "n5rwX9kZvD2D7GMskm8ZgovkvNwNKcW+5W/4ciWqCJKE/Fp9XsooJgN94pJfgDQ2\n"
-            + "WBL5KDx1aGt4wZXhH2Atl6a6oVZJIH4SaizDjau7F4vc7hBfbcDhxFcrVX1QMpzp\n"
-            + "l352cIx6KVw4FRWvQ8VKkga4JiQwosfvCT2ZpdMwy3cARynv8BWLc4Uexf88QIeC\n"
-            + "lP9ZhoVeMqvHMfUb3d6Q5362VdZqI50DmARMfmkJAQgAzc1uAF4x16Cx4GtHI0Hv\n"
-            + "m+v7bUEUtBw2XzyOKu883XC5JmGcY18yYItRpchAtmacDpu0/2925/mWF7aS9RMg\n"
-            + "SYI/1D9LaTeimISM3iGFY35kt78NGZwJDeCPJPI1sbOU0njfrCPTbOQuRDJ6evaB\n"
-            + "NX9HYArSEp0ygruJdOUYgnepCt4A7W95EKp9KPo7XV1K8y86vrKbgpJ+NnEi7dzM\n"
-            + "qVxnhO4wAWqb6HYcKLrEc2gVnLtzHkBlY/6dOP15jgQKql1/yQIXae/WGT24n/Ve\n"
-            + "aKqrbSmDNkhW5eW5o1Bkgy/M98oNHXd0nVrT8Lyf6un5TwMy+vk0l5AjMMtIZKS0\n"
-            + "GQARAQABAAf/T22JFmhESUnSTOBqeK+Sd/WIOJ7lDCxVScVXwzdJINfIBYmnr2yG\n"
-            + "x18NuHOEkkEg2rx6ixksZZRcurMynZZvoB8+Xj69bpLT1JRXv8VlM0SNP6NjPW6M\n"
-            + "ygfQhzxZv8ck2WRgQxIin8SjHJv0zG9F5+1DEUyrzhZQb8dMYkqm/nbZ1FDnMu4F\n"
-            + "1qUZxKx0hU70tAXfywtpH9NQs8jwenUjiXA00k6A48BF7gartYtcGnEG9mk+Z+lh\n"
-            + "/uD+z5j3/ym9XqOJPpFIWhMYTLueSD5yrCT34VdIc1xBOjjtxBsCCbgSFZaewCpB\n"
-            + "5usRr2I4+CK3vbAMny5Hk+/RYZdFQkCA5wQA2JusdhwqPjfzxtcxz13Vu1ZzKR41\n"
-            + "kkno/boGh5afBlf7kL/5FXDhGVVvHMvXtQntU1kHgOcE8b2Jfy38gNGkd3TAh4Oj\n"
-            + "fLavcYyn+9tEkjRVdOeU0P9fszDA1cW5Gjuv6GkbCUSQrv68TKp/mWiTlYm+FT3a\n"
-            + "RSIz2gEyOZNkTzsEAPM6sU/VOwpJ2ppOa5+290sptjSbRNYjKlQ66nHZnbafzLz5\n"
-            + "tKpRc0BzG/N2lXwlVl5+3oXSSSbWhJscA8EFwSnAx8Id10zW5NAEfxNuqxxEXlJg\n"
-            + "kOhqwJ1JMz32xlZFRZYxSdXSycYrX/AhV7I7RQxgC48X9udMb8LIXYq0lzy7A/9p\n"
-            + "Skd2Me9JotuTN3OaR42hXozLx+yERBBEWuI3WXovWRD8b8gCfWL3P40d2UVnjFmP\n"
-            + "TZ8p9aHAd2srWgaPSZaSsHtIyI6dQGScMEOKEaCJxYvF/wuvx/MABDatcaJhMaAc\n"
-            + "W/0w+gb8Lr2hbuRhBSP754V3Amma6LxsmLRAwB6ioT7NiQEfBBgBAgAJBQJMfmkJ\n"
-            + "AhsMAAoJEEqfrHAx+kjEvDAH/iO6BHQfFa+kqjfYD3NE+FNosXv3jiXOU7SCD2MG\n"
-            + "3AwDYqM+v1n4UvvMLLdEbtboht1Btys1vuyNM3RAmR45oh9Dfuc4SKtVzSCkKs85\n"
-            + "jNvH7Ik8gxZ9ARzJbawNzTLFyLwDdcdX42Umuvh49Pn7Nc7FDYcZLffEcTh9sZ7K\n"
-            + "yxLYqcjtnblx5oOQnYnpBbM61GvgNXC8Z+g9fg0oHRouKXKE/HDKbsN0siEf9XJF\n"
-            + "JTKdEg1NgoyKWdaV4+pU/fTzZUvvDqOSRx8he5w64dvW9o7WdARq/3vPvHgy0O8f\n"
-            + "MTSItmcHxCU8l0jptJz181N36Uhmjyc9oC4dn9ceSn6VDbg=\n"
-            + "=ZLpl\n"
-            + "-----END PGP PRIVATE KEY BLOCK-----\n");
-  }
-
-  /**
-   * pub 2048R/E2D32BA5 2010-09-01 Key fingerprint = CB2B 665B 88DA D56A 7009 C15D 8A9B 5293 E2D3
-   * 2BA5 uid Testuser G &lt;testg@example.com&gt; sub 2048R/829DAE8D 2010-09-01
-   */
-  public static TestKey keyG() throws Exception {
-    return new TestKey(
-        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "mQENBEx+aRYBCAC77YjBScTjRFHtZvk0yyAy8KAXopbCdMBQs7S7iidFMMxhs0Uu\n"
-            + "D7GeleyVusLFJfEM0Ul0b0pLgfJx9j3cot4BTl71OqnawHp4ktuqFyTjhhYy8kBe\n"
-            + "4mliNP36WW7fYXh+f5SZqDQ6rgyoJCOmiUlosb6CM2yUPH3oDtOKg/9Z0iMUcXfQ\n"
-            + "y+bxRKSQmDtiSIS7hwUZmQoo30iAZNygMBLnYyVau3YFan+xyBMCFLa2/pfE0qaU\n"
-            + "QMy67XP8uP7DXlepfc4Lk/qa/2WnAqmuTT2ty9MG+X8M8LuiPuMWfOEx8ICUWB9s\n"
-            + "kCCMWCagS7EUIPhp6AOqjMqEWGOyLmclkGCJABEBAAG0HlRlc3R1c2VyIEcgPHRl\n"
-            + "c3RnQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTH5pFgIbAwYLCQgHAwIGFQgCCQoL\n"
-            + "BBYCAwECHgECF4AACgkQiptSk+LTK6VSwQf/WnIYkLZoARZIUfH61EDlkUPv8+6G\n"
-            + "1YY3YgFFMjeOKybu47eU3QtATEaKHphvKqFtxdNyEtmti1Zx7Cq2LzReY1KoQQ5E\n"
-            + "OlKeyxVmXAuAqoRWesxuG318rVTrozCqSdKPCHLcC26M5sO+Gd2sKbA4DjoSyfrE\n"
-            + "zEOVS1NA9dtZ7WBMXr8gjH//ob7dvuptSAlADaLYYaJugcmbzkRGRbfiCQHqv30I\n"
-            + "+81d7RAeSx8XS38YEWm2IvBLpiS/d7A/2AQ25SHxf+QMMWt83+uOuEVa9rEOraid\n"
-            + "ZC6T8vnSRu1TKkX/60LnJvAw9tigmedi21O6Gpz3H3uGyjuk9o18+m8dJokBIAQQ\n"
-            + "AQIACgUCTH5xfAMFCngACgkQSp+scDH6SMT42gf9H7K0jp6PF1vD5t90bcjtnP/t\n"
-            + "CkOXgfL3lJK/l0KMkoDzyO5z898PP8IAnAj1veJ2fNPsRP903/3K8kd9/31kBriC\n"
-            + "poTVPWBmeLut16TgSDxAQPDLsBPcKe2VadhszOQwhfmdsUlCXwXcwbiAjweXwKh+\n"
-            + "00UoW1GLnPw0T387ttCjHsLe972SVUPFxb6NUkA7val62qxDKg+6MRcf6tDs8sN8\n"
-            + "orhYgh9VJcI3Iw8qK1wHI0CenNie0U5xEkZ5U6W4lfhnL5sggjoAeVeAVLiQ4eiP\n"
-            + "sFrq4TOYq9qfuThYiRaSuTLXzuWG5NVs7NyXxOGFSkwzXrQsBo+LuPwjSCERLbkB\n"
-            + "DQRMfmkWAQgA1O0I9vfZNSRuYTx++SkJccXXqL4neVWEnQ4Ws9tzfSG0Rch3Gb/d\n"
-            + "+ckDtJhlQOdaayTVX7h5k8tTGx0myg6OjG2UM6i+aTgFAzwGnBh/N3p5tTaJhRCF\n"
-            + "x1IapX0N7ijq6rQPPCISc3CUZhCVBTnp5dk3c0/hNxsyYXlI1AwuoMabygzTFN/c\n"
-            + "b1bXp0UTTVrdN+Sj5hHVDvpxyaljLa77I0V+lI3bCil9VhQ9h/TP4C2iK3ZdXOMb\n"
-            + "uW7ANhd+I9LWulmExZIiD9RIsHvB3bDu32g1847uT+DUynKETbZWlZS0Q93Aly1N\n"
-            + "lBIkvOCVCBt+VatzZ8oBV8vbk5R41W1HywARAQABiQEfBBgBAgAJBQJMfmkWAhsM\n"
-            + "AAoJEIqbUpPi0yul/doH+wR+o6UCdD6OZxGMx7d0a7yDJqQFkFf2DRsJvY2suug0\n"
-            + "CMJZRWiA+hIin5P6Brn/eb5nTdWgzlrHxkvb68YkevHALdOvmrYNQFXbb9uWGgEf\n"
-            + "3qERdI8ayJsSTqYsTqyuh9YVz21kADxTHN3JkJ4evjHpyz0Xbtq+oDADg+uswj1b\n"
-            + "ihHthFif54vNMEIW9rX9T7ufhXKamr4LuGwKTPTxV8gEPW4h4ZoQwFKV2qOjR+su\n"
-            + "tHnuXVL24kTnv8CHXUVzJXVTNz7i7fAJTgWc9drH6Ktp3XHfLDBwzT5/5ZhyxGJk\n"
-            + "Qq2Jm/Q8mNkXi34H2DeQ3VPtjtMLr9JR9pf6ivmvUag=\n"
-            + "=34GE\n"
-            + "-----END PGP PUBLIC KEY BLOCK-----\n",
-        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "lQOXBEx+aRYBCAC77YjBScTjRFHtZvk0yyAy8KAXopbCdMBQs7S7iidFMMxhs0Uu\n"
-            + "D7GeleyVusLFJfEM0Ul0b0pLgfJx9j3cot4BTl71OqnawHp4ktuqFyTjhhYy8kBe\n"
-            + "4mliNP36WW7fYXh+f5SZqDQ6rgyoJCOmiUlosb6CM2yUPH3oDtOKg/9Z0iMUcXfQ\n"
-            + "y+bxRKSQmDtiSIS7hwUZmQoo30iAZNygMBLnYyVau3YFan+xyBMCFLa2/pfE0qaU\n"
-            + "QMy67XP8uP7DXlepfc4Lk/qa/2WnAqmuTT2ty9MG+X8M8LuiPuMWfOEx8ICUWB9s\n"
-            + "kCCMWCagS7EUIPhp6AOqjMqEWGOyLmclkGCJABEBAAEAB/QJiwZmylg1MkL2y0Pc\n"
-            + "anQ4If//M0J0nXkmn/mNjHZyDQhT7caVkDZ01ygsck9xs3uKKxaP0xbyvqaRIvAB\n"
-            + "REQBzPkFevUlJqERfmOpP4OgCi8WZzbdmqG/WvGKxP/cWBbGVbQ2GVSNpkj+QNeO\n"
-            + "nWoc5unFstbQsEG0hww2/Hz7EppYoBvDrDLY1EPKzr0r6sk1O5gk3VWOqMEJVCh+\n"
-            + "K7EV4pPGmzMrfZQ0jSwRpr0HhzzhDYR7+QUbxr4OS5PoSJDFh0+A5kqFagyupe7A\n"
-            + "96L3Lh7wJBQJsOe5xjOu3lkFp+3vU+Mq7VzO9Fnp9BCwjb4mEjI39bJdGeeOVCWR\n"
-            + "sYEEAMjmftMhIHrjGRlbZVrLcZY8Du4CFQqImb2Tluo/6siIEurVp4F2swZFm7fw\n"
-            + "B2v09GGJ6zKpauJuxlbwo3CFnxbk24W39F/SixZLggLPtNOXdSrLIQrQ1AXu5ucQ\n"
-            + "oCnXS5FaVkD3Rtd53hSMIf2xJiSRKGp/1X9hga/phScud7URBADveDh1oEmwl3gc\n"
-            + "gorhABLYV7cPrARteQRV13tYWcuAZ6WjqNlbbW2mzBE7KTh4bgTzIX0uQ6SZ7bPl\n"
-            + "RmuKQHrdOO9vFGiSf3zDnIg8fhqSyy2SNrC/e7teuaguGCrg5GrP5izBAsiwvXbt\n"
-            + "ST3OG7c8Ky717JGTiUeTJoe4IaET+QP/SB4uQzVTrbXjBNtq1KqL/CT7l2ABnXsn\n"
-            + "psaVwHOMmY/wP+PiazMEDvLInDAu7R8oLNGqYR+7UYmYeAGmWgrc0L3yFVC01tTG\n"
-            + "bk7Yt/V5KRKVO2I9x+2CP0v0EqW4BNOJzbx5TJ5lBFLMTvbviOdsoDXw0S98HIHB\n"
-            + "T1bFFmhVeulCDLQeVGVzdHVzZXIgRyA8dGVzdGdAZXhhbXBsZS5jb20+iQE4BBMB\n"
-            + "AgAiBQJMfmkWAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRCKm1KT4tMr\n"
-            + "pVLBB/9achiQtmgBFkhR8frUQOWRQ+/z7obVhjdiAUUyN44rJu7jt5TdC0BMRooe\n"
-            + "mG8qoW3F03IS2a2LVnHsKrYvNF5jUqhBDkQ6Up7LFWZcC4CqhFZ6zG4bfXytVOuj\n"
-            + "MKpJ0o8IctwLbozmw74Z3awpsDgOOhLJ+sTMQ5VLU0D121ntYExevyCMf/+hvt2+\n"
-            + "6m1ICUANothhom6ByZvOREZFt+IJAeq/fQj7zV3tEB5LHxdLfxgRabYi8EumJL93\n"
-            + "sD/YBDblIfF/5Awxa3zf6464RVr2sQ6tqJ1kLpPy+dJG7VMqRf/rQucm8DD22KCZ\n"
-            + "52LbU7oanPcfe4bKO6T2jXz6bx0mnQOYBEx+aRYBCADU7Qj299k1JG5hPH75KQlx\n"
-            + "xdeovid5VYSdDhaz23N9IbRFyHcZv935yQO0mGVA51prJNVfuHmTy1MbHSbKDo6M\n"
-            + "bZQzqL5pOAUDPAacGH83enm1NomFEIXHUhqlfQ3uKOrqtA88IhJzcJRmEJUFOenl\n"
-            + "2TdzT+E3GzJheUjUDC6gxpvKDNMU39xvVtenRRNNWt035KPmEdUO+nHJqWMtrvsj\n"
-            + "RX6UjdsKKX1WFD2H9M/gLaIrdl1c4xu5bsA2F34j0ta6WYTFkiIP1Eiwe8HdsO7f\n"
-            + "aDXzju5P4NTKcoRNtlaVlLRD3cCXLU2UEiS84JUIG35Vq3NnygFXy9uTlHjVbUfL\n"
-            + "ABEBAAEAB/48KLaaNJ+xhJgNMA797crF0uyiOAumG/PqfeMLMQs5xQ6OktuXsl6Q\n"
-            + "pus9mLsu8c7Zq9//efsbt1xFMmDVwPQkmAdB60DVMKc16T1C2CcFcTy25vBG4Mqz\n"
-            + "bK6rqCAJ9JSe+H2/cy78X8gF6FR6VAkSUGN62IxcyfnbkW1yv/hiowZ5pQpGVjBH\n"
-            + "sjfu+6HGZhdJIyzrjnVjTJhXNCodtKq1lQGuL2t3ZB6osOXEsFtsI6lQF2s6QZZd\n"
-            + "MUOpSO+X1Rb5TCpWpR/Yj43sH6Tq7LZWEml9fV4wKe2PQWmFW+L8eZCwbYEz6GgZ\n"
-            + "w2pMoMxxOZJsOMOq4LFs4r9qaNQI+sU1BADZhx42JjqBIUsq0OhQcCizjCbPURNw\n"
-            + "7HRfPV8SQkldzmccVzGwFIKQqAVglNdT9AQefUQzx84CRqmWaROXaypkulOB79gM\n"
-            + "R/C/aXOdWz9/dGJ9fT/gcgq1vg9zt7dPE5QIYlhmNdfQPt6R50bUTXe22N2UYL98\n"
-            + "n1pQrhAdlsbT3QQA+pWPXQE4k3Hm7pwCycM2d4TmOIfB6YiaxjMNsZiepV4bqWPX\n"
-            + "iaHh0gw1f8Av6zmMncQELKRspA8Zrj3ZzB/OvNwfpgpqmjS0LyH4u8fGttm7y3In\n"
-            + "/NxZO33omf5vdB2yptzE6DegtsvS94ux6zp01SuzgCXjQbiSjb/VDL0/A8cD/1sQ\n"
-            + "PQGP1yrhn8aX/HAxgJv8cdI6ZnrSUW+G8RnhX281dl5a9so8APchhqeXspYFX6DJ\n"
-            + "Br6MqNkX69a7jthdLZCxaa3hGInr+A/nPVkNEHhjQ8a/kI+28ChRWndofme10hje\n"
-            + "QISFfGuMf6ULK9uo4d1MzGlstfcNRecizfniKby3SBmJAR8EGAECAAkFAkx+aRYC\n"
-            + "GwwACgkQiptSk+LTK6X92gf7BH6jpQJ0Po5nEYzHt3RrvIMmpAWQV/YNGwm9jay6\n"
-            + "6DQIwllFaID6EiKfk/oGuf95vmdN1aDOWsfGS9vrxiR68cAt06+atg1AVdtv25Ya\n"
-            + "AR/eoRF0jxrImxJOpixOrK6H1hXPbWQAPFMc3cmQnh6+MenLPRdu2r6gMAOD66zC\n"
-            + "PVuKEe2EWJ/ni80wQhb2tf1Pu5+Fcpqavgu4bApM9PFXyAQ9biHhmhDAUpXao6NH\n"
-            + "6y60ee5dUvbiROe/wIddRXMldVM3PuLt8AlOBZz12sfoq2ndcd8sMHDNPn/lmHLE\n"
-            + "YmRCrYmb9DyY2ReLfgfYN5DdU+2O0wuv0lH2l/qK+a9RqA==\n"
-            + "=T1WV\n"
-            + "-----END PGP PRIVATE KEY BLOCK-----\n");
-  }
-
-  /**
-   * pub 2048R/080E5723 2010-09-01 Key fingerprint = 2957 ABE4 937D A84A 2E5D 31DB 65C4 33C4 080E
-   * 5723 uid Testuser H &lt;testh@example.com&gt; sub 2048R/68C7C262 2010-09-01
-   */
-  public static TestKey keyH() throws Exception {
-    return new TestKey(
-        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "mQENBEx+aSUBCADzpZ1h9awUQR1ChzrMhtoE1ltyTlJpS1G5HFEov9QNxVDTjpB8\n"
-            + "PMdb20NNdk/7g6E+ETpCBJGPoC4/TPFDiqe+UI7cRrRZJVbInkCbflYycLTUt9qW\n"
-            + "5c7IuyZA1+cSYaKp3jYccFZfIWvfTWDLWyUozTs9t1TsI28s3r5fBPvrZ+F1nYv/\n"
-            + "xpSkx3Zsxnn7QJTnd63rZdp0RdfJmF2rXERwR6XVtuLj5CqrFoLxy6OrSOl4am4J\n"
-            + "C2HRWhskB21LpdRtloY8bz0DOn6W6JUFRmSxQ1kbPClOXaiNhzMI0fD/KFnHImgR\n"
-            + "IKbbQyHHsKHBjNyn+zTIm5zUL6JMZMf9PoSZABEBAAG0HlRlc3R1c2VyIEggPHRl\n"
-            + "c3RoQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTH5pJQIbAwYLCQgHAwIGFQgCCQoL\n"
-            + "BBYCAwECHgECF4AACgkQZcQzxAgOVyORcAf/QaHVlyhlBnU4edujW2uG/PFrZvwK\n"
-            + "fqOKW0QqQ7kVN8okKhnFv4y11IwLIzL9mOLYe2+Zyv3I3bz4X8Xw+MsBF6sMWLLf\n"
-            + "9ieu4Wz/5ScVu0PxY36kgV0AQRiLXk802Vk4t9jElCp9qx/dDln7f3879LLb3wNt\n"
-            + "fajne8EH0hjR4E3joPoG+IXSvSzWcPoZTmAZOKHPcRS8iqy0Ao8/UuQWYCedI/4R\n"
-            + "S1IJaByk8mmkMkqqV0kuPyDkvGpqhfh9zFYh97LuKcJktRTEBp3YMvuGcBDBwofG\n"
-            + "vYIVEMr7Ci5rowRQO/sxJfI1zNSWterWC46v6tOb9IvenOgP0/dQxlU82YkBIAQQ\n"
-            + "AQIACgUCTH5xmAMFAXgACgkQ0CLaOl6a7dCYuQf/V2i3Ih5Dqze0Rz5zoTD56/J7\n"
-            + "0SA4/SFm5eDUirY5B9BohkyxoMVG04uyjUmVs62ree7N0IASmeiF/wkBUZ/r/rr/\n"
-            + "0ntGj43y+1JpuSEohZOfgZJryDKRqyVWhRbeBj0g/SzxIQ1lEt2iHFvdSlfFVd+a\n"
-            + "SH1uDDjT/ZATKfAXcgeajUirWorJRaldue7O4oFe67fMLy36ewvpaMVZ+SpxH4CC\n"
-            + "Owq4Ls3dIAg2C5GQK8G0G7FwT1M26EPg66C79EGYkaxprgrilWE6l7QHc484TY1L\n"
-            + "ys04qKoPRnBinmrRxgRyyimvDN/+nd1jdM6nMe1gVLL3s5Vgo0fJMwNhDZMtdrkB\n"
-            + "DQRMfmklAQgAyajPVMt+OXO1ow7xzb0aZYNa5Xdv+w50JzVeWI0boPOuOmq6RCc1\n"
-            + "3NhOmBzx3CKH6zbSRoLBCZWM3cs1EQbl+8noaxq6YQVWiaROX8U7CThYA50jONP/\n"
-            + "qEk655QFsP8Bq96Z5AT/MflxEMayOtQywUFREF4/olhXvJOdurZfQPGnIis35NUc\n"
-            + "IaubI+gGVsluqWBohLOgqzyF7GMlv+Y2JZE5JKGSTO7ZosyI+OCNdZ6X2CJdDPZ1\n"
-            + "325QHYkmqiMJtb73AYTXurL7NNTxdxQVOnfvwXXW4mgHwPEHr8PU30+2xgo1ktrr\n"
-            + "rpFsd0o2UFhybTe7w1z2sAO1gP5s1bbGlwARAQABiQEfBBgBAgAJBQJMfmklAhsM\n"
-            + "AAoJEGXEM8QIDlcjqkQIAI78nwAgO5EgrUDoFikH6d36Kie9SHleaYcSX2c95Vqc\n"
-            + "umuiSAhaulGX0gM/jwvZkoawSyWIq+O2sPSc9F7VzdYdEnWVj2J5BpVx83TRPrTu\n"
-            + "72tsJ97op6JZz+Q8HwTLYJBmyW3/TEKh+iRL9CBtfTVywodZa58j41vCkx37NFPw\n"
-            + "plglT/Se1/US1rWYTH3Kfqo5zNARLUYzAdcxEpjwXWOvqnybn86KfMwqiOunz8eq\n"
-            + "MnTQYECfUrhX2WrbEAjCSc6/LfrTv/S+cO0rvulO/R97gG99pZdWSUjZypU5KLbp\n"
-            + "MBh0qq2wQxO2iagNXE6ms3kV/XihvCpXo9RArmldmW0=\n"
-            + "=lddL\n"
-            + "-----END PGP PUBLIC KEY BLOCK-----\n",
-        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "lQOYBEx+aSUBCADzpZ1h9awUQR1ChzrMhtoE1ltyTlJpS1G5HFEov9QNxVDTjpB8\n"
-            + "PMdb20NNdk/7g6E+ETpCBJGPoC4/TPFDiqe+UI7cRrRZJVbInkCbflYycLTUt9qW\n"
-            + "5c7IuyZA1+cSYaKp3jYccFZfIWvfTWDLWyUozTs9t1TsI28s3r5fBPvrZ+F1nYv/\n"
-            + "xpSkx3Zsxnn7QJTnd63rZdp0RdfJmF2rXERwR6XVtuLj5CqrFoLxy6OrSOl4am4J\n"
-            + "C2HRWhskB21LpdRtloY8bz0DOn6W6JUFRmSxQ1kbPClOXaiNhzMI0fD/KFnHImgR\n"
-            + "IKbbQyHHsKHBjNyn+zTIm5zUL6JMZMf9PoSZABEBAAEAB/wPPOigp4d9VcwxbLkz\n"
-            + "8OwiONDLz5OuY6hHCjsWMBcgTFqffI9TQc7bExW8ur1KVuNm+RdaaSQ8ZhF2YobF\n"
-            + "SV7v02R36NEfMStiDSmvv+E+stdQZXY9kT5TRgcgr5ATUXllo9DhCvKP7Qxs0Q9Q\n"
-            + "cJEcoedGVxiv0xCBLyYbVbm2sW+GJYjq0R5loaOy/Swbt5vOKQsajU8iyA4czSE8\n"
-            + "Ryr63OtwZ1TZsxekj//HKcngnptYY/FT5TPe4uzw8g1tJTIg/OZXrm8CahWzpfE3\n"
-            + "q8lGafhd0GjLftA9ffIHF0cAUs7HklMrgIKGdVPXfQmPzqDpmH5FO2y6QmqTG0v6\n"
-            + "JYW9BAD4Iobwh80MT3JZhJ0jGYMdi07cRyFN+hRwVKgNcBTdx3QGpGJatcyumD0C\n"
-            + "Yn/aXAn+XUkewSgYhdj9sSRodnWGoavdWELxUQkktsdiFg2/rnqmpqRXTGfR/tDh\n"
-            + "ohD2JaPrsavmUF6ShT3stGp8nUN+n6Bhd+QosaCZm5TC1CtA7QQA+16rrNNdP8XN\n"
-            + "MvpQRqJM5ljH0haqR/yD8vdCCZjk23hBk3YsXwSrhSbPzMeZC2FcDqkQTraTxrSG\n"
-            + "U0+xK3NjKKtbzCjQFH4cy4zdNMUX04OWopLGOEnnvTYukGtXT4lZQ9qm8ZBPh5a4\n"
-            + "cXfWy3ovjvRbxUuFOWm0gOfIoRcuWN0D/isTjqPmjihCuWkKTfa3xoq+dD7ynYhg\n"
-            + "Yu3UKfCqbNVor59ZrB4AkQiaVIDLKim3E1XDMS+IukmTuNVXpJeqK32tAYbEduHM\n"
-            + "7kwEq7SgVh34QvryKjCC/EUkDcjSQ+xlUaKl8QKYOdwtH97zZYK6QixB4uNQ6CuM\n"
-            + "75dqTZ6iQw7jQA+0HlRlc3R1c2VyIEggPHRlc3RoQGV4YW1wbGUuY29tPokBOAQT\n"
-            + "AQIAIgUCTH5pJQIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQZcQzxAgO\n"
-            + "VyORcAf/QaHVlyhlBnU4edujW2uG/PFrZvwKfqOKW0QqQ7kVN8okKhnFv4y11IwL\n"
-            + "IzL9mOLYe2+Zyv3I3bz4X8Xw+MsBF6sMWLLf9ieu4Wz/5ScVu0PxY36kgV0AQRiL\n"
-            + "Xk802Vk4t9jElCp9qx/dDln7f3879LLb3wNtfajne8EH0hjR4E3joPoG+IXSvSzW\n"
-            + "cPoZTmAZOKHPcRS8iqy0Ao8/UuQWYCedI/4RS1IJaByk8mmkMkqqV0kuPyDkvGpq\n"
-            + "hfh9zFYh97LuKcJktRTEBp3YMvuGcBDBwofGvYIVEMr7Ci5rowRQO/sxJfI1zNSW\n"
-            + "terWC46v6tOb9IvenOgP0/dQxlU82Z0DmARMfmklAQgAyajPVMt+OXO1ow7xzb0a\n"
-            + "ZYNa5Xdv+w50JzVeWI0boPOuOmq6RCc13NhOmBzx3CKH6zbSRoLBCZWM3cs1EQbl\n"
-            + "+8noaxq6YQVWiaROX8U7CThYA50jONP/qEk655QFsP8Bq96Z5AT/MflxEMayOtQy\n"
-            + "wUFREF4/olhXvJOdurZfQPGnIis35NUcIaubI+gGVsluqWBohLOgqzyF7GMlv+Y2\n"
-            + "JZE5JKGSTO7ZosyI+OCNdZ6X2CJdDPZ1325QHYkmqiMJtb73AYTXurL7NNTxdxQV\n"
-            + "OnfvwXXW4mgHwPEHr8PU30+2xgo1ktrrrpFsd0o2UFhybTe7w1z2sAO1gP5s1bbG\n"
-            + "lwARAQABAAf8C3vFcrqz0Wm5ajOrqV+fZTB5uJ94jP9htengGYLPk/bMcR8qxD7H\n"
-            + "XnAi6Z6cV0DQJKDWkJVZkMYnY2ny96lA53mz9oVrH6NCLkxg+istFXVT7cDBBLdt\n"
-            + "05N3+z/+ovmiirr+YHG4Zowh2Ca4d4kl6sNhbmEvlnsZY++0B7Hi8ru2KgFBag2g\n"
-            + "wDmeVt2+ANJNfJ4uIHUEG+sDSDL4+rxQlBTMhxfVY5+zjbvzPlTf2jyAgDa5zGN2\n"
-            + "vRjB33Z0lbdZTeW7HsJcDsXaS77lKnQeWMmHSvpOXvFSIjnrWpxcMpg8hGY5e5UC\n"
-            + "zLCk+nucY/Od1NbtFYu/e7fl9/n3YnT7AQQA0v/t43Ut3go9vRlb47NN/KpJYL1N\n"
-            + "hh9F/SRzFwWxS+79CiZkf/bgmdJe4XkkS7QJMv+nXhtcko/gfzoaCrvIWIAyvhYa\n"
-            + "7tEbqH+iZ0eaLrQf7bu89Jmp2UNRT1EHLzm38eJ8gg7eNu+SjIhs3wART1KB7GvT\n"
-            + "YmpN5caJA2t2OaEEAPSq7CbvlPDc0qomQSs+NrDnhAv89mQEeksZRmhVa0o4Z7EO\n"
-            + "84DzM+Vxho5fn9h0LtxthhuKWKT8uYN/Qu4Y42cKQuRgMx09+GGwc4GWSC6gJPeP\n"
-            + "oKVJCdZx0l9u8fWQb37gnyH34WDxPvdQx3e4iw/dvruNzu17zmPndkdcyEU3BACD\n"
-            + "yXo21SEflFcfrO16VsITXWc9yweKTSD8Mq7wg2GG6eJPopgtwCLZSlYjnehxD2w2\n"
-            + "38lyr6jGPyITvalVwH6R//676Q2osbQ948Dv2ZcxaTlyla4RyY6E33hsnV9m8ZmM\n"
-            + "PUoNJvFSkKCuPy1N5zaYgUAPKwbEkc3qG+bZm+x2WU2biQEfBBgBAgAJBQJMfmkl\n"
-            + "AhsMAAoJEGXEM8QIDlcjqkQIAI78nwAgO5EgrUDoFikH6d36Kie9SHleaYcSX2c9\n"
-            + "5VqcumuiSAhaulGX0gM/jwvZkoawSyWIq+O2sPSc9F7VzdYdEnWVj2J5BpVx83TR\n"
-            + "PrTu72tsJ97op6JZz+Q8HwTLYJBmyW3/TEKh+iRL9CBtfTVywodZa58j41vCkx37\n"
-            + "NFPwplglT/Se1/US1rWYTH3Kfqo5zNARLUYzAdcxEpjwXWOvqnybn86KfMwqiOun\n"
-            + "z8eqMnTQYECfUrhX2WrbEAjCSc6/LfrTv/S+cO0rvulO/R97gG99pZdWSUjZypU5\n"
-            + "KLbpMBh0qq2wQxO2iagNXE6ms3kV/XihvCpXo9RArmldmW0=\n"
-            + "=voB9\n"
-            + "-----END PGP PRIVATE KEY BLOCK-----\n");
-  }
-
-  /**
-   * pub 2048R/5E9AEDD0 2010-09-01 Key fingerprint = 818D 5D0B 4AE2 A4FE A4C3 C44D D022 DA3A 5E9A
-   * EDD0 uid Testuser I &lt;testi@example.com&gt; sub 2048R/0884E452 2010-09-01
-   */
-  public static TestKey keyI() throws Exception {
-    return new TestKey(
-        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "mQENBEx+aTEBCAC6dFperkew4ZowIfEyAjScjPBggcbw5XUXxLCF0nBRjWH+HvuI\n"
-            + "CGwznRyeuTiy5yyB9/CcvTLTkEs8qIyJUJoikm7QpaVVL6imVq1HD1xcOJpV1FV1\n"
-            + "eFu562xCRDUqD6KQf54N04V9TMDyubhPkQYbx1H2gq+uBEo9d1w6AsSMgaUn3xH/\n"
-            + "xYe+INxcP6jFT2OKc36x+8ipP6pc8Hba1X90JwadOcJlwEyJfJKs7hYHTaYn+I6+\n"
-            + "4w0Y//WebhT4ocsYIiOYrENQUcic+vL3fkwwJCloyDBCGxr7w7Gn4Pe3peTCl4Sp\n"
-            + "vIIoYnHPW4h3Nyh8qAlBNDw7dCPS9LP7wRdNABEBAAG0HlRlc3R1c2VyIEkgPHRl\n"
-            + "c3RpQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTH5pMQIbAwYLCQgHAwIGFQgCCQoL\n"
-            + "BBYCAwECHgECF4AACgkQ0CLaOl6a7dAjNQf/fLmGeKgaesawP53UeioQ8hgDEFKP\n"
-            + "BddNQP248NpReZ1rg3h8Q21PQJVKrtDYn94WJi5NTqUtk9rtx9SiqKaEc3wzIpLc\n"
-            + "nIYrgGLWot5nq+5V1nY9t9QAiJJDrmm2/3tX+jTWW6CpuLih7IsD+gJmpZkY6PfM\n"
-            + "T+teKEeh5E1XBbu10fwDwMJta+043/TiljInjER1f/b41EnSjI6YXFnxnyiLeDgD\n"
-            + "A1QIIzB/W2ccGqphzJriDETDJhKFZIeqvjylZofgCLyMRSyZtsu+b4pfBK3hMpu5\n"
-            + "aaYylaM1BWOpAiqUmGUKqxN/o9EGx4wvsMxK6xgiZe5UdQPaoDcFCsEMg4kBIAQQ\n"
-            + "AQIACgUCTH5xrAMFAXgACgkQoTk8RsLmoZiu2Af8D4PnyWkosYYkcmU4T7CvIHGW\n"
-            + "Qnx4KsnYWaAqYrYrorL6R+f8SZ5caGwj05UOvHnqx/Ij0a1Zv4MpEuzB0se1XkyQ\n"
-            + "eCLdAIKVodfiepsCHyqW6/mc9LV2qKS1HF5x5LwDkI1atOuPt/O14fch4E0beTbl\n"
-            + "FXzGo7YdpH8RunV8l+i3FxxTcUtUkij3Ro4EMwVF/6YG8gBOd08GxWspEQWBH3GK\n"
-            + "k7Repj4IPwXCoEfU1H+XJNPaM5cnt+L87QfbhNOWmHmWhhrOmZg160joODON8w8x\n"
-            + "j3gma9Cp6luPDEQC3XnsEup3BdCdIciG5JS6JA/2GDeulg+eS4x9Xkmmp6nzObkB\n"
-            + "DQRMfmkxAQgAxeT+bUBbADga+lYtkmtYVbuG7uWjwdg9TR6qWKD7n37mcu6OgNNl\n"
-            + "rPaHoClvOL20fcArZ8wT/FbjvDI6ZHn22YA19OvAR+Eqmf3D7qTmebchnCu955Pk\n"
-            + "X7AOOpKfX48qoYq8BoskZDnbFidm5YKfIin3CNDdlQbd3na+ihGCuv0KoGzefuAH\n"
-            + "cITeYEUESh7HLzQ9/pMES9eCgdTEkwYD5NJjfkLnj2kZtDsSiNnENZ0TIlyKOBMn\n"
-            + "ixgsARDjLrkqyTg79thWALiqVBXUKn2NBtMkK5xTDc/7q3nIw4InYMIrLtntSu1w\n"
-            + "pn1gXbdg1HFl5BgqEB9Fp0k02YvrSiiVswARAQABiQEfBBgBAgAJBQJMfmkxAhsM\n"
-            + "AAoJENAi2jpemu3QFPoH/1ynX1j1QWL8TfJFPoB3vXivwGURs3J7LsywHTRjpQVQ\n"
-            + "vxQvKTzB1+woUxtEbdjKgMbvY/ShHSlEZKVV9l3ZihrNewHA1GMHrDtBGXcNRP9B\n"
-            + "RfJHTrDzjUxrEEwu4QIq71o4tS89NvQmlYYi7O4ThtVB4hYSwl436+vAT9ybIQkU\n"
-            + "OjCkYrKye6JHs1K4BnVuWcOVujQwW4H8QFbddcWF49uN6DSqrwDFsjFog6wL7u6V\n"
-            + "UL5upRBP/RZWA4HKJVF2tS0Ptr6xLTmf4Tp5n10CGFYkPcRp9biVyeVRJBW4uZf0\n"
-            + "EDsn9J5rNG0pWtgnhAEi6smoT4fADTOzpOovUiTSQhQ=\n"
-            + "=SiG3\n"
-            + "-----END PGP PUBLIC KEY BLOCK-----\n",
-        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "lQOYBEx+aTEBCAC6dFperkew4ZowIfEyAjScjPBggcbw5XUXxLCF0nBRjWH+HvuI\n"
-            + "CGwznRyeuTiy5yyB9/CcvTLTkEs8qIyJUJoikm7QpaVVL6imVq1HD1xcOJpV1FV1\n"
-            + "eFu562xCRDUqD6KQf54N04V9TMDyubhPkQYbx1H2gq+uBEo9d1w6AsSMgaUn3xH/\n"
-            + "xYe+INxcP6jFT2OKc36x+8ipP6pc8Hba1X90JwadOcJlwEyJfJKs7hYHTaYn+I6+\n"
-            + "4w0Y//WebhT4ocsYIiOYrENQUcic+vL3fkwwJCloyDBCGxr7w7Gn4Pe3peTCl4Sp\n"
-            + "vIIoYnHPW4h3Nyh8qAlBNDw7dCPS9LP7wRdNABEBAAEAB/oCD6EKLvjXgItlqdm/\n"
-            + "X+OWMYHDCtuRCMW7+2gEw/TxfLeGJaOHWxAouwUIArEEb/hjdaRfIg4wdJUxmyPX\n"
-            + "WyNqUdupkjdXNa7RNaesIi0ilrdZOn7NlHWJCCXwKt2R0jd2p8PDED6CWaE1+76I\n"
-            + "/IuwOHDTD8MABke3KvHDXMxjzdeuRbm670Aqz6zTVY+BZG1GH63Ef5JEyezMgAU5\n"
-            + "42+v+OgD0W0/jCxF7jt2ddP9QiOzu0q65mI4qlOuSebxjH8P7ye0LU9EuWVgAcwc\n"
-            + "YJh2lk3eH8bCWTwlIHj4+8MYgY5i510I5xfY3sWuylw/qtFP9vYjisrysadcUExc\n"
-            + "QUxFBADXQSCmvtgRoSLiGfQv2y2qInx67eJw8pUXFEIJKdOFOhX4vogT9qPWQAms\n"
-            + "/vSshcsAPgpZJZ8MNeGpMGLAGm8y4D2zWWd9YLNmVXsPu7EyrDpXlKHCFnsQfOGN\n"
-            + "c5j8u4CHBn1cS/Yk53S+6Yge2jvnOjVNFmxB0ocs0Y5zbdTJYwQA3b+hQebH7NNr\n"
-            + "FlPwthRZS0TiX5+qkE9tE/0mpRrUN3iS9bnF0IXRmHFp7Hz+EsVbA2Re2A5HIHnQ\n"
-            + "/BSpAsSHRhjU3MH4gzwfg9W43eZGVfofSY6IlUCIcd1bGjSAjJgmfhjU7ofS59i/\n"
-            + "DjzP1jBfXdjOEUQULTkXjHPqO7j4048D/jqMwZNY3AawTMjqKr9nGK49aWv/OVdy\n"
-            + "6xGn4dRJNk3gnnIvjAEFy5+HHbUCJ2lA3X2AssQ9tvbuyDnoSL5/G+zEYtyRuAC5\n"
-            + "9TLQQRmy4qjsYC5TwfoUwFbgqRsmGUcjj2wtE+gb1S8P/zudYrEqOD3K60Y5qXcn\n"
-            + "S3PHgJ++5TzFQba0HlRlc3R1c2VyIEkgPHRlc3RpQGV4YW1wbGUuY29tPokBOAQT\n"
-            + "AQIAIgUCTH5pMQIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQ0CLaOl6a\n"
-            + "7dAjNQf/fLmGeKgaesawP53UeioQ8hgDEFKPBddNQP248NpReZ1rg3h8Q21PQJVK\n"
-            + "rtDYn94WJi5NTqUtk9rtx9SiqKaEc3wzIpLcnIYrgGLWot5nq+5V1nY9t9QAiJJD\n"
-            + "rmm2/3tX+jTWW6CpuLih7IsD+gJmpZkY6PfMT+teKEeh5E1XBbu10fwDwMJta+04\n"
-            + "3/TiljInjER1f/b41EnSjI6YXFnxnyiLeDgDA1QIIzB/W2ccGqphzJriDETDJhKF\n"
-            + "ZIeqvjylZofgCLyMRSyZtsu+b4pfBK3hMpu5aaYylaM1BWOpAiqUmGUKqxN/o9EG\n"
-            + "x4wvsMxK6xgiZe5UdQPaoDcFCsEMg50DmARMfmkxAQgAxeT+bUBbADga+lYtkmtY\n"
-            + "VbuG7uWjwdg9TR6qWKD7n37mcu6OgNNlrPaHoClvOL20fcArZ8wT/FbjvDI6ZHn2\n"
-            + "2YA19OvAR+Eqmf3D7qTmebchnCu955PkX7AOOpKfX48qoYq8BoskZDnbFidm5YKf\n"
-            + "Iin3CNDdlQbd3na+ihGCuv0KoGzefuAHcITeYEUESh7HLzQ9/pMES9eCgdTEkwYD\n"
-            + "5NJjfkLnj2kZtDsSiNnENZ0TIlyKOBMnixgsARDjLrkqyTg79thWALiqVBXUKn2N\n"
-            + "BtMkK5xTDc/7q3nIw4InYMIrLtntSu1wpn1gXbdg1HFl5BgqEB9Fp0k02YvrSiiV\n"
-            + "swARAQABAAf/VXp4O5CUvh9956vZu2kKmt2Jhx9CALT6pZkdU3MVvOr/d517iEHH\n"
-            + "pVJHevLqy8OFdtvO4+LOryyI6f14I3ZbHc+3frdmMqYb1LA8NZScyO5FYkOyn5jO\n"
-            + "CFbvjnVOyeP5MhXO6bSoX3JuI7+ZPoGRYxxlTDWLwJdatoDsBI9TvJhVekyAchTH\n"
-            + "Tyt3NQIvLXqHvKU/8WAgclBKeL/y/idep1BrJ4cIJ+EFp0agEG0WpRRUAYjwfE3P\n"
-            + "aSEV0NOoB8rapPW3XuEjO+ZTht+NYvqgPIdTjwXZGFPYnwvEuz772Th4pO3o/PdF\n"
-            + "2cljvRn3qo+lSVnJ0Ki2pb+LukJSIdfHgQQA1DBdm29a/3dBla2y6wxlSXW/3WBp\n"
-            + "51Vpd8SBuwdVrNNQMwPmf1L93YskJnUKSTo7MwgrYZFWf7QzgfD/cHXr8QK2C1TP\n"
-            + "czUC0/uFCm8pPQoOt/osp3PjDAzGgUAMFXCgLtb04P2JqbFvtse5oTFWrKqmscTG\n"
-            + "KnEBkzfgy37U0iMEAO7BEgXCYvqyztHmQATqJfbpxgQGqk738UW6qWwG8mK6aT5V\n"
-            + "OidZvrWqJ3WeIKmEhoJlY2Ky1ZTuJfeQuVucqzNWlZy2yzDijs+t3v4pFGajv4nV\n"
-            + "ivGvlb/O/QoHBuF/9K36lIIqcZstfa2UIYRqkkdEz2JHWJsr81VvCw2Gb38xA/sG\n"
-            + "hqErrIgSBPRCJObM/gb9rJ6dbA5SNY5trc778EjS1myhyPhGOaOmYbdQMONUqLo2\n"
-            + "q1UZo1G7oaI1Um9v5MXN1yZNX/kvx1TMldZEEixrhCIob81eXSpEUfs+Mz2RqvqT\n"
-            + "YsYquYQNPrPXWZQwTJV6fpsBQUMeE/pmlisaSAijHkXPiQEfBBgBAgAJBQJMfmkx\n"
-            + "AhsMAAoJENAi2jpemu3QFPoH/1ynX1j1QWL8TfJFPoB3vXivwGURs3J7LsywHTRj\n"
-            + "pQVQvxQvKTzB1+woUxtEbdjKgMbvY/ShHSlEZKVV9l3ZihrNewHA1GMHrDtBGXcN\n"
-            + "RP9BRfJHTrDzjUxrEEwu4QIq71o4tS89NvQmlYYi7O4ThtVB4hYSwl436+vAT9yb\n"
-            + "IQkUOjCkYrKye6JHs1K4BnVuWcOVujQwW4H8QFbddcWF49uN6DSqrwDFsjFog6wL\n"
-            + "7u6VUL5upRBP/RZWA4HKJVF2tS0Ptr6xLTmf4Tp5n10CGFYkPcRp9biVyeVRJBW4\n"
-            + "uZf0EDsn9J5rNG0pWtgnhAEi6smoT4fADTOzpOovUiTSQhQ=\n"
-            + "=RcWw\n"
-            + "-----END PGP PRIVATE KEY BLOCK-----\n");
-  }
-
-  /**
-   * pub 2048R/C2E6A198 2010-09-01 Key fingerprint = 83AB CE4D 6845 D6DA F7FB AA47 A139 3C46 C2E6
-   * A198 uid Testuser J &lt;testj@example.com&gt; sub 2048R/863E8ABF 2010-09-01
-   */
-  public static TestKey keyJ() throws Exception {
-    return new TestKey(
-        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "mQENBEx+aUgBCADczNio9UWnUggUZkdqJye57497oD9vNo9rmtR+i1TkMpVeWaMH\n"
-            + "UWrm1twzIPV9D4lAWLJoG2cYF6nXG1JxsKc9mOIZ6O1WfsopMUU0p+EfU8H/cvdM\n"
-            + "/iccYS6OnNL4/xR1R7hlA4+b/jaOZfzdS3i5jwOf+TtCk7c5qOuFhraiVQ9H1G86\n"
-            + "+LsiWVeXEFc/FXxnESRmbaZFNJrAdJl23eKXRC6az0S5FwMVBvUhRpLwIGDbVT/0\n"
-            + "/QwaNUOq3bYwudPREFLg/1HtBuxNhRdV6mCrit+tsPan9o0/WtsHuq8n4/pqOKBc\n"
-            + "RRmOIQR9SEohE2TuVT3XVFpMXa4a4CBuNXjTABEBAAG0HlRlc3R1c2VyIEogPHRl\n"
-            + "c3RqQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTH5pSAIbAwYLCQgHAwIGFQgCCQoL\n"
-            + "BBYCAwECHgECF4AACgkQoTk8RsLmoZi0BggAlnbCwmwaLwcpU9YcOE9/8KF56dIs\n"
-            + "XhdxzqdP91UmhVT0df1OBhgTqFkKprBLCT+B9yBClsnyXMatkvuhQG6C7lw9toMO\n"
-            + "TITRPZoFJe3Ezi+HRRPqAPubIcSgeILuilvFhkoUOgoC1ubmVPgcGBLb8tdvI3bA\n"
-            + "svq+n2jaYUlgL5N6ZNRNakc07e8vH5SeKiD8ZntJlTU49fkxzlawtDaI3+GhyUiB\n"
-            + "0Ah8pl143DFNAq8CfvQCPKwX4WFPkEflh0LlgaEPJUZ/H6KxKXXF8SC9cD2VIii8\n"
-            + "Yrue8y9T+j5y699A0GCptb1IKrgxbfhgD//3g3l1eXsEwn2cwFNCt7pZFLkBDQRM\n"
-            + "fmlIAQgA3E2pM6oDJGgfxbqSfykuRtTbiAi7JEd1DNvEe6gJ7qkBLM4ipILBD0qR\n"
-            + "qCwL37E4/3nMsZjA7GIFLQj2DrFW3aEEKwR/zdh7R67lo9CunCY+FPWTuOkCG8Sh\n"
-            + "3RLpbAV6I61NG/wDznW30vmKNJDgPpkzYj8u0T4MtpywEgxTxCqWZKCufWDRfNAy\n"
-            + "IBLt+piG+bcYKfw9pS8PvXPQMNIi4U2pu3hb/BHC3Y1A8FVpEe4CFV7rWb/K2Ydx\n"
-            + "eBxwwxm9sBxF+vhlI+ZEeb9JxGH6jYlc6twD4e6p3KqusAKLKiLsS5uLQnpMGGZ8\n"
-            + "vcpTSfyHjG2QHc3qG9S/yDCZjhhe2QARAQABiQEfBBgBAgAJBQJMfmlIAhsMAAoJ\n"
-            + "EKE5PEbC5qGYClMIANTdZ+/g/FPl1Lm0tO1CSnHVHekeGNA9n3L6SGiSZQJjEDo0\n"
-            + "gsye5xgxh5JGKf7CqbEFfeLC9Jx5W5EN4dVFudncIlC/SutfRzdt5W8CLXMl0c41\n"
-            + "5FmtpWNStk3MglkcjE5PrRRrSiRc45S0e2kIPb8eiVKg98/rCToC9+Qn3pMi/fcM\n"
-            + "LVpYE+dhvB5EhOSwBWWgvWXzeLhv5CnBKxH0ItHhNwvt8qPOHgQAJKPc6dV888xn\n"
-            + "Sew62LFefHPnGTHLP8RRgVIvZBG5IoovxSz89QGHQZiC4xv00I7zNwmtr6eEcl+y\n"
-            + "BkUK9QWITEBHUDqR+cbVa2dRr3fUHwRP7G2G+ow=\n"
-            + "=ucAX\n"
-            + "-----END PGP PUBLIC KEY BLOCK-----\n",
-        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "lQOYBEx+aUgBCADczNio9UWnUggUZkdqJye57497oD9vNo9rmtR+i1TkMpVeWaMH\n"
-            + "UWrm1twzIPV9D4lAWLJoG2cYF6nXG1JxsKc9mOIZ6O1WfsopMUU0p+EfU8H/cvdM\n"
-            + "/iccYS6OnNL4/xR1R7hlA4+b/jaOZfzdS3i5jwOf+TtCk7c5qOuFhraiVQ9H1G86\n"
-            + "+LsiWVeXEFc/FXxnESRmbaZFNJrAdJl23eKXRC6az0S5FwMVBvUhRpLwIGDbVT/0\n"
-            + "/QwaNUOq3bYwudPREFLg/1HtBuxNhRdV6mCrit+tsPan9o0/WtsHuq8n4/pqOKBc\n"
-            + "RRmOIQR9SEohE2TuVT3XVFpMXa4a4CBuNXjTABEBAAEAB/9sW1MQR53xKP6yFCeD\n"
-            + "3sdOJlSB1PiMeXgU1JznpTT58CEBdnfdRYVy14qkxM30m8U9gMm88YW8exBscgoZ\n"
-            + "pRnNztNW58phokNPx9AwsRp3p0ETPbZDYI6NDNwuPKQEchn2HEZPvFmjsjPP2hkn\n"
-            + "+Lu8RIUA4uzEFX3bnBxJIP1L2AztqyTgHDfXS4/nqerO/cheXhN7j1TUyRO4hinp\n"
-            + "C3WXaxm2kpQXFP2ktq2eu7YPFoW6I6HzHVDN2Z7fD/NzfmR2h4gcIaSDEjIs893N\n"
-            + "b3hsYiOTYwVFX9TBWLr9rSWyrjR4sWelFuMZpjQ53qq+rBm/+8knoNtoWgZFhbR0\n"
-            + "WJyRBADlBuX8kveqLl31QShgw+6TwTHXI40GiCA6DHwZiTstOO6d2KDNq2nHdtuo\n"
-            + "HBvSKYP4a2na39JKb7YfuSMg16QvxQNd7BQWz+NzbGLQEGuX455OD3TE74ZfVElo\n"
-            + "2H/i51hSjOdWihJVNBGlcDYPgb7oLLTbPdKXxptRM1+wrk2//QQA9s3pw2O3lSbV\n"
-            + "U8JyL/FhdyhDvRDuiNBPnB4O/Ynnzz8YSFwSdSE/u8FpguFWdh+UdSrdwE+Ux8kj\n"
-            + "W/miXaqTxUeKnpzOkiO5O2fLvAeriO3rU9KfBER03+NJo4weSorLXzeU4SWkw63N\n"
-            + "OiY3fc67Nj+l8qi1tmoEJyHUomuy7Q8EAOfBvMzGsQQJ12k+4gOSXN9DTWUa85P6\n"
-            + "IphFHC2cpTDy30IRR55sI6Mf3GpC+KzxEyw7WXjlTensEJAHMpyVVRhv6uF0eMaY\n"
-            + "+QGS+vyCgtUfGIwM5Teu6NjeqyShJDTC8qnM+75JgCNu6gZ2F2iTeY+tM3zE1auq\n"
-            + "po1pUACVm7qwR6u0HlRlc3R1c2VyIEogPHRlc3RqQGV4YW1wbGUuY29tPokBOAQT\n"
-            + "AQIAIgUCTH5pSAIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQoTk8RsLm\n"
-            + "oZi0BggAlnbCwmwaLwcpU9YcOE9/8KF56dIsXhdxzqdP91UmhVT0df1OBhgTqFkK\n"
-            + "prBLCT+B9yBClsnyXMatkvuhQG6C7lw9toMOTITRPZoFJe3Ezi+HRRPqAPubIcSg\n"
-            + "eILuilvFhkoUOgoC1ubmVPgcGBLb8tdvI3bAsvq+n2jaYUlgL5N6ZNRNakc07e8v\n"
-            + "H5SeKiD8ZntJlTU49fkxzlawtDaI3+GhyUiB0Ah8pl143DFNAq8CfvQCPKwX4WFP\n"
-            + "kEflh0LlgaEPJUZ/H6KxKXXF8SC9cD2VIii8Yrue8y9T+j5y699A0GCptb1IKrgx\n"
-            + "bfhgD//3g3l1eXsEwn2cwFNCt7pZFJ0DmARMfmlIAQgA3E2pM6oDJGgfxbqSfyku\n"
-            + "RtTbiAi7JEd1DNvEe6gJ7qkBLM4ipILBD0qRqCwL37E4/3nMsZjA7GIFLQj2DrFW\n"
-            + "3aEEKwR/zdh7R67lo9CunCY+FPWTuOkCG8Sh3RLpbAV6I61NG/wDznW30vmKNJDg\n"
-            + "PpkzYj8u0T4MtpywEgxTxCqWZKCufWDRfNAyIBLt+piG+bcYKfw9pS8PvXPQMNIi\n"
-            + "4U2pu3hb/BHC3Y1A8FVpEe4CFV7rWb/K2YdxeBxwwxm9sBxF+vhlI+ZEeb9JxGH6\n"
-            + "jYlc6twD4e6p3KqusAKLKiLsS5uLQnpMGGZ8vcpTSfyHjG2QHc3qG9S/yDCZjhhe\n"
-            + "2QARAQABAAf7BUTPxk/u/vi935DpBXoXRKHZnLM3bFuIexCGQ74rQqR2qazUMH8o\n"
-            + "SFEsaBJpm2WyR47J5WqSHNi5SxPT2AUdNFeh/39hxY61Q6SuBFED+WMRbHrKbURR\n"
-            + "WjPiFuwus02eAkAYFWfBFY0n9/BcAhicQa90MTRj+RZb/EHa+GDdbgDatpwEK22z\n"
-            + "pPb3t/D2TC7ModizelngBN7bdp4Vqna/vMLhsiE+FqL+Ob0KiLkDxtcjZljc9xLK\n"
-            + "B7ZuGH/AZfhF08OAxUcsJdu5cF3viBT+HeSI4OUvdfxPFX98U/SFfuW4mPdHPEI9\n"
-            + "438pdjDUIpJFtcnROtZdS2o6C9ohHa5BUwQA52P8AKKRfg7LpaFMvtKkNORnscac\n"
-            + "1qvXLqAXaMeSsvyU5o1GNvSgbhFzDcXbAFJcXdOo2XgT7JzW/6v1uW9AuQPAkYhr\n"
-            + "ep0uE3mewlzWHZR41MQRaMGN4l80RN6ju4c/Ei+OMHYp2DUfZFDBXbxwWpN8tNoR\n"
-            + "S1X+rOL5RsQgkrcEAPO7zthR+GQnIgJC3c9Las9JkPywCxddjoWZoyt6yITVjIso\n"
-            + "IGD0SJppAkOS3Vdb+raydLuN7HmbpPFnvzyc+RdSt+YCGUObrHb/z9MfahzDNG3S\n"
-            + "VwUQEIl+L6glhwscQOCz80MCcYMFMk4TiankvChRFF5Wil//8QnaonH4bcrvA/46\n"
-            + "VB+ZaEdR+Z8IkYIf7oHLJNEwaH+kRTBQ2x5F9Gnwr9SL6AXAkNkvYD4in/+Bw35r\n"
-            + "o9zGirQQvNrvH3JlZ5PWp1/9rRl2Tefaaf8P2ij/Ky2poBLAhPwK56JXHLt5v+BZ\n"
-            + "mQwhY+teJnbfCwiiS0OeWtpVY/tDVU7wYOd2RIhVfkUziQEfBBgBAgAJBQJMfmlI\n"
-            + "AhsMAAoJEKE5PEbC5qGYClMIANTdZ+/g/FPl1Lm0tO1CSnHVHekeGNA9n3L6SGiS\n"
-            + "ZQJjEDo0gsye5xgxh5JGKf7CqbEFfeLC9Jx5W5EN4dVFudncIlC/SutfRzdt5W8C\n"
-            + "LXMl0c415FmtpWNStk3MglkcjE5PrRRrSiRc45S0e2kIPb8eiVKg98/rCToC9+Qn\n"
-            + "3pMi/fcMLVpYE+dhvB5EhOSwBWWgvWXzeLhv5CnBKxH0ItHhNwvt8qPOHgQAJKPc\n"
-            + "6dV888xnSew62LFefHPnGTHLP8RRgVIvZBG5IoovxSz89QGHQZiC4xv00I7zNwmt\n"
-            + "r6eEcl+yBkUK9QWITEBHUDqR+cbVa2dRr3fUHwRP7G2G+ow=\n"
-            + "=NiQI\n"
-            + "-----END PGP PRIVATE KEY BLOCK-----\n");
-  }
-
-  private TestTrustKeys() {}
-}
diff --git a/gerrit-gwtdebug/BUILD b/gerrit-gwtdebug/BUILD
index 115c6b9..f564745 100644
--- a/gerrit-gwtdebug/BUILD
+++ b/gerrit-gwtdebug/BUILD
@@ -3,15 +3,14 @@
     srcs = glob(["src/main/java/**/*.java"]),
     visibility = ["//visibility:public"],
     deps = [
-        "//gerrit-pgm:daemon",
-        "//gerrit-pgm:pgm",
-        "//gerrit-pgm:util",
-        "//gerrit-util-cli:cli",
+        "//java/com/google/gerrit/pgm",
+        "//java/com/google/gerrit/pgm/util",
+        "//java/com/google/gerrit/util/cli",
+        "//lib/flogger:api",
         "//lib/gwt:dev",
         "//lib/jetty:server",
         "//lib/jetty:servlet",
         "//lib/jetty:servlets",
-        "//lib/log:api",
         "//lib/log:log4j",
     ],
 )
diff --git a/gerrit-gwtdebug/src/main/java/com/google/gerrit/gwtdebug/GerritGwtDebugLauncher.java b/gerrit-gwtdebug/src/main/java/com/google/gerrit/gwtdebug/GerritGwtDebugLauncher.java
index 4edff0e..cf84919 100644
--- a/gerrit-gwtdebug/src/main/java/com/google/gerrit/gwtdebug/GerritGwtDebugLauncher.java
+++ b/gerrit-gwtdebug/src/main/java/com/google/gerrit/gwtdebug/GerritGwtDebugLauncher.java
@@ -14,16 +14,15 @@
 
 package com.google.gerrit.gwtdebug;
 
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.pgm.Daemon;
 import com.google.gwt.dev.codeserver.CodeServer;
 import com.google.gwt.dev.codeserver.Options;
 import java.util.ArrayList;
 import java.util.List;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 class GerritGwtDebugLauncher {
-  private static final Logger log = LoggerFactory.getLogger(GerritGwtDebugLauncher.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   public static void main(String[] argv) throws Exception {
     GerritGwtDebugLauncher launcher = new GerritGwtDebugLauncher();
@@ -54,7 +53,7 @@
 
     Options options = new Options();
     if (!options.parseArgs(sdmLauncherOptions.toArray(new String[sdmLauncherOptions.size()]))) {
-      log.error("Failed to parse codeserver arguments");
+      logger.atSevere().log("Failed to parse codeserver arguments");
       return 1;
     }
 
@@ -65,11 +64,11 @@
           new Daemon()
               .main(daemonLauncherOptions.toArray(new String[daemonLauncherOptions.size()]));
       if (r != 0) {
-        log.error("Daemon exited with return code: " + r);
+        logger.atSevere().log("Daemon exited with return code: %d", r);
         return 1;
       }
     } catch (Exception e) {
-      log.error("Cannot start daemon", e);
+      logger.atSevere().withCause(e).log("Cannot start daemon");
       return 1;
     }
 
diff --git a/gerrit-gwtexpui/BUILD b/gerrit-gwtexpui/BUILD
deleted file mode 100644
index a9a2e48..0000000
--- a/gerrit-gwtexpui/BUILD
+++ /dev/null
@@ -1,118 +0,0 @@
-load("//tools/bzl:gwt.bzl", "gwt_module")
-load("//tools/bzl:junit.bzl", "junit_tests")
-
-SRC = "src/main/java/com/google/gwtexpui/"
-
-gwt_module(
-    name = "Clippy",
-    srcs = glob([SRC + "clippy/client/*.java"]),
-    data = [
-        "//lib:LICENSE-clippy",
-        "//lib:LICENSE-silk_icons",
-    ],
-    gwt_xml = SRC + "clippy/Clippy.gwt.xml",
-    resources = [
-        SRC + "clippy/client/clippy.css",
-        SRC + "clippy/client/clippy.swf",
-        SRC + "clippy/client/page_white_copy.png",
-        SRC + "clippy/client/CopyableLabelText.properties",
-    ],
-    visibility = ["//visibility:public"],
-    deps = [
-        ":SafeHtml",
-        ":UserAgent",
-        "//lib/gwt:user-neverlink",
-    ],
-)
-
-java_library(
-    name = "CSS",
-    srcs = glob([SRC + "css/rebind/*.java"]),
-    resources = [SRC + "css/CSS.gwt.xml"],
-    visibility = ["//visibility:public"],
-    deps = ["//lib/gwt:dev"],
-)
-
-gwt_module(
-    name = "GlobalKey",
-    srcs = glob([SRC + "globalkey/client/*.java"]),
-    gwt_xml = SRC + "globalkey/GlobalKey.gwt.xml",
-    resources = [
-        SRC + "globalkey/client/KeyConstants.properties",
-        SRC + "globalkey/client/key.css",
-    ],
-    visibility = ["//visibility:public"],
-    deps = [
-        ":SafeHtml",
-        ":UserAgent",
-        "//lib/gwt:user",
-    ],
-)
-
-java_library(
-    name = "linker_server",
-    srcs = glob([SRC + "linker/server/*.java"]),
-    visibility = ["//visibility:public"],
-    deps = ["//lib:servlet-api-3_1"],
-)
-
-gwt_module(
-    name = "Progress",
-    srcs = glob([SRC + "progress/client/*.java"]),
-    gwt_xml = SRC + "progress/Progress.gwt.xml",
-    resources = [SRC + "progress/client/progress.css"],
-    visibility = ["//visibility:public"],
-    deps = ["//lib/gwt:user"],
-)
-
-gwt_module(
-    name = "SafeHtml",
-    srcs = glob([SRC + "safehtml/client/*.java"]),
-    gwt_xml = SRC + "safehtml/SafeHtml.gwt.xml",
-    resources = [SRC + "safehtml/client/safehtml.css"],
-    visibility = ["//visibility:public"],
-    deps = ["//lib/gwt:user"],
-)
-
-junit_tests(
-    name = "SafeHtml_tests",
-    srcs = glob([
-        "src/test/java/com/google/gwtexpui/safehtml/client/**/*.java",
-    ]),
-    deps = [
-        ":SafeHtml",
-        "//lib:truth",
-        "//lib/gwt:dev",
-        "//lib/gwt:user",
-    ],
-)
-
-gwt_module(
-    name = "UserAgent",
-    srcs = glob([SRC + "user/client/*.java"]),
-    gwt_xml = SRC + "user/User.gwt.xml",
-    resources = [SRC + "user/client/tooltip.css"],
-    visibility = ["//visibility:public"],
-    deps = ["//lib/gwt:user"],
-)
-
-java_library(
-    name = "server",
-    srcs = glob([SRC + "server/*.java"]),
-    visibility = ["//visibility:public"],
-    deps = ["//lib:servlet-api-3_1"],
-)
-
-java_library(
-    name = "client-src-lib",
-    srcs = [],
-    resources = glob(
-        [SRC + n for n in [
-            "clippy/**/*",
-            "globalkey/**/*",
-            "safehtml/**/*",
-            "user/**/*",
-        ]],
-    ),
-    visibility = ["//visibility:public"],
-)
diff --git a/gerrit-gwtexpui/COPYING b/gerrit-gwtexpui/COPYING
deleted file mode 100644
index d645695..0000000
--- a/gerrit-gwtexpui/COPYING
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 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/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/GlobalKey.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/GlobalKey.java
deleted file mode 100644
index 3eac789..0000000
--- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/GlobalKey.java
+++ /dev/null
@@ -1,196 +0,0 @@
-// Copyright (C) 2009 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.google.gwtexpui.globalkey.client;
-
-import com.google.gwt.event.dom.client.KeyCodes;
-import com.google.gwt.event.dom.client.KeyDownEvent;
-import com.google.gwt.event.dom.client.KeyDownHandler;
-import com.google.gwt.event.dom.client.KeyPressEvent;
-import com.google.gwt.event.dom.client.KeyPressHandler;
-import com.google.gwt.event.logical.shared.CloseEvent;
-import com.google.gwt.event.logical.shared.CloseHandler;
-import com.google.gwt.event.shared.HandlerRegistration;
-import com.google.gwt.user.client.Timer;
-import com.google.gwt.user.client.ui.PopupPanel;
-import com.google.gwt.user.client.ui.Widget;
-
-public class GlobalKey {
-  public static final KeyPressHandler STOP_PROPAGATION =
-      new KeyPressHandler() {
-        @Override
-        public void onKeyPress(KeyPressEvent event) {
-          event.stopPropagation();
-        }
-      };
-
-  private static State global;
-  static State active;
-  private static CloseHandler<PopupPanel> restoreGlobal;
-  private static Timer restoreTimer;
-
-  static {
-    KeyResources.I.css().ensureInjected();
-  }
-
-  private static void initEvents() {
-    if (active == null) {
-      DocWidget.get()
-          .addKeyPressHandler(
-              new KeyPressHandler() {
-                @Override
-                public void onKeyPress(KeyPressEvent event) {
-                  final KeyCommandSet s = active.live;
-                  if (s != active.all) {
-                    active.live = active.all;
-                    restoreTimer.cancel();
-                  }
-                  s.onKeyPress(event);
-                }
-              });
-
-      restoreTimer =
-          new Timer() {
-            @Override
-            public void run() {
-              active.live = active.all;
-            }
-          };
-
-      global = new State(null);
-      active = global;
-    }
-  }
-
-  private static void initDialog() {
-    if (restoreGlobal == null) {
-      restoreGlobal =
-          new CloseHandler<PopupPanel>() {
-            @Override
-            public void onClose(CloseEvent<PopupPanel> event) {
-              active = global;
-            }
-          };
-    }
-  }
-
-  static void temporaryWithTimeout(KeyCommandSet s) {
-    active.live = s;
-    restoreTimer.schedule(250);
-  }
-
-  public static void dialog(PopupPanel panel) {
-    initEvents();
-    initDialog();
-    assert panel.isShowing();
-    assert active == global;
-    active = new State(panel);
-    active.add(new HidePopupPanelCommand(0, KeyCodes.KEY_ESCAPE, panel));
-    panel.addCloseHandler(restoreGlobal);
-    panel.addDomHandler(
-        new KeyDownHandler() {
-          @Override
-          public void onKeyDown(KeyDownEvent event) {
-            if (event.getNativeKeyCode() == KeyCodes.KEY_ESCAPE) {
-              panel.hide();
-            }
-          }
-        },
-        KeyDownEvent.getType());
-  }
-
-  public static HandlerRegistration addApplication(Widget widget, KeyCommand appKey) {
-    initEvents();
-    final State state = stateFor(widget);
-    state.add(appKey);
-    return new HandlerRegistration() {
-      @Override
-      public void removeHandler() {
-        state.remove(appKey);
-      }
-    };
-  }
-
-  public static HandlerRegistration add(Widget widget, KeyCommandSet cmdSet) {
-    initEvents();
-    final State state = stateFor(widget);
-    state.add(cmdSet);
-    return new HandlerRegistration() {
-      @Override
-      public void removeHandler() {
-        state.remove(cmdSet);
-      }
-    };
-  }
-
-  private static State stateFor(Widget w) {
-    while (w != null) {
-      if (w == active.root) {
-        return active;
-      }
-      w = w.getParent();
-    }
-    return global;
-  }
-
-  public static void filter(KeyCommandFilter filter) {
-    active.filter(filter);
-    if (active != global) {
-      global.filter(filter);
-    }
-  }
-
-  private GlobalKey() {}
-
-  static class State {
-    final Widget root;
-    final KeyCommandSet app;
-    final KeyCommandSet all;
-    KeyCommandSet live;
-
-    State(Widget r) {
-      root = r;
-
-      app = new KeyCommandSet(KeyConstants.I.applicationSection());
-      app.add(ShowHelpCommand.INSTANCE);
-
-      all = new KeyCommandSet();
-      all.add(app);
-
-      live = all;
-    }
-
-    void add(KeyCommand k) {
-      app.add(k);
-      all.add(k);
-    }
-
-    void remove(KeyCommand k) {
-      app.remove(k);
-      all.remove(k);
-    }
-
-    void add(KeyCommandSet s) {
-      all.add(s);
-    }
-
-    void remove(KeyCommandSet s) {
-      all.remove(s);
-    }
-
-    void filter(KeyCommandFilter f) {
-      all.filter(f);
-    }
-  }
-}
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyHelpPopup.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyHelpPopup.java
deleted file mode 100644
index 1318125..0000000
--- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyHelpPopup.java
+++ /dev/null
@@ -1,242 +0,0 @@
-// Copyright (C) 2009 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.google.gwtexpui.globalkey.client;
-
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.event.dom.client.KeyCodes;
-import com.google.gwt.event.dom.client.KeyDownEvent;
-import com.google.gwt.event.dom.client.KeyDownHandler;
-import com.google.gwt.event.dom.client.KeyPressEvent;
-import com.google.gwt.event.dom.client.KeyPressHandler;
-import com.google.gwt.user.client.DOM;
-import com.google.gwt.user.client.ui.Anchor;
-import com.google.gwt.user.client.ui.FlowPanel;
-import com.google.gwt.user.client.ui.FocusPanel;
-import com.google.gwt.user.client.ui.Grid;
-import com.google.gwt.user.client.ui.HTMLTable.CellFormatter;
-import com.google.gwt.user.client.ui.HasHorizontalAlignment;
-import com.google.gwt.user.client.ui.PopupPanel;
-import com.google.gwtexpui.safehtml.client.SafeHtml;
-import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-public class KeyHelpPopup extends PopupPanel implements KeyPressHandler, KeyDownHandler {
-  private final FocusPanel focus;
-
-  public KeyHelpPopup() {
-    super(true /* autohide */, true /* modal */);
-    setStyleName(KeyResources.I.css().helpPopup());
-
-    final Anchor closer = new Anchor(KeyConstants.I.closeButton());
-    closer.addClickHandler(
-        new ClickHandler() {
-          @Override
-          public void onClick(ClickEvent event) {
-            hide();
-          }
-        });
-
-    final Grid header = new Grid(1, 3);
-    header.setStyleName(KeyResources.I.css().helpHeader());
-    header.setText(0, 0, KeyConstants.I.keyboardShortcuts());
-    header.setWidget(0, 2, closer);
-
-    final CellFormatter fmt = header.getCellFormatter();
-    fmt.addStyleName(0, 1, KeyResources.I.css().helpHeaderGlue());
-    fmt.setHorizontalAlignment(0, 2, HasHorizontalAlignment.ALIGN_RIGHT);
-
-    final Grid lists = new Grid(0, 7);
-    lists.setStyleName(KeyResources.I.css().helpTable());
-    populate(lists);
-    lists.getCellFormatter().addStyleName(0, 3, KeyResources.I.css().helpTableGlue());
-
-    final FlowPanel body = new FlowPanel();
-    body.add(header);
-    body.getElement().appendChild(DOM.createElement("hr"));
-    body.add(lists);
-
-    focus = new FocusPanel(body);
-    focus.getElement().getStyle().setProperty("outline", "0px");
-    focus.getElement().setAttribute("hideFocus", "true");
-    focus.addKeyPressHandler(this);
-    focus.addKeyDownHandler(this);
-    add(focus);
-  }
-
-  @Override
-  public void setVisible(boolean show) {
-    super.setVisible(show);
-    if (show) {
-      focus.setFocus(true);
-    }
-  }
-
-  @Override
-  public void onKeyPress(KeyPressEvent event) {
-    if (KeyCommandSet.toMask(event) == ShowHelpCommand.INSTANCE.keyMask) {
-      // Block the '?' key from triggering us to show right after
-      // we just hide ourselves.
-      //
-      event.stopPropagation();
-      event.preventDefault();
-    }
-    hide();
-  }
-
-  @Override
-  public void onKeyDown(KeyDownEvent event) {
-    if (event.getNativeKeyCode() == KeyCodes.KEY_ESCAPE) {
-      hide();
-    }
-  }
-
-  private void populate(Grid lists) {
-    int[] end = new int[5];
-    int column = 0;
-    for (KeyCommandSet set : combinedSetsByName()) {
-      int row = end[column];
-      row = formatGroup(lists, row, column, set);
-      end[column] = row;
-      if (column == 0) {
-        column = 4;
-      } else {
-        column = 0;
-      }
-    }
-  }
-
-  /**
-   * @return an ordered collection of KeyCommandSet, combining sets which share the same name, so
-   *     that each set name appears at most once.
-   */
-  private static Collection<KeyCommandSet> combinedSetsByName() {
-    LinkedHashMap<String, KeyCommandSet> byName = new LinkedHashMap<>();
-    for (KeyCommandSet set : GlobalKey.active.all.getSets()) {
-      KeyCommandSet v = byName.get(set.getName());
-      if (v == null) {
-        v = new KeyCommandSet(set.getName());
-        byName.put(v.getName(), v);
-      }
-      v.add(set);
-    }
-    return byName.values();
-  }
-
-  private int formatGroup(Grid lists, int row, int col, KeyCommandSet set) {
-    if (set.isEmpty()) {
-      return row;
-    }
-
-    if (lists.getRowCount() < row + 1) {
-      lists.resizeRows(row + 1);
-    }
-    lists.setText(row, col + 2, set.getName());
-    lists.getCellFormatter().addStyleName(row, col + 2, KeyResources.I.css().helpGroup());
-    row++;
-
-    return formatKeys(lists, row, col, set, null);
-  }
-
-  private int formatKeys(final Grid lists, int row, int col, KeyCommandSet set, SafeHtml prefix) {
-    final CellFormatter fmt = lists.getCellFormatter();
-    final List<KeyCommand> keys = sort(set);
-    if (lists.getRowCount() < row + keys.size()) {
-      lists.resizeRows(row + keys.size());
-    }
-
-    Map<KeyCommand, Integer> rows = new HashMap<>();
-    FORMAT_KEYS:
-    for (int i = 0; i < keys.size(); i++) {
-      final KeyCommand k = keys.get(i);
-      if (rows.containsKey(k)) {
-        continue;
-      }
-
-      if (k instanceof CompoundKeyCommand) {
-        final SafeHtmlBuilder b = new SafeHtmlBuilder();
-        b.append(k.describeKeyStroke());
-        row = formatKeys(lists, row, col, ((CompoundKeyCommand) k).getSet(), b);
-        continue;
-      }
-
-      for (int prior = 0; prior < i; prior++) {
-        if (KeyCommand.same(keys.get(prior), k)) {
-          final int r = rows.get(keys.get(prior));
-          final SafeHtmlBuilder b = new SafeHtmlBuilder();
-          b.append(SafeHtml.get(lists, r, col + 0));
-          b.append(" ");
-          b.append(KeyConstants.I.orOtherKey());
-          b.append(" ");
-          if (prefix != null) {
-            b.append(prefix);
-            b.append(" ");
-            b.append(KeyConstants.I.thenOtherKey());
-            b.append(" ");
-          }
-          b.append(k.describeKeyStroke());
-          SafeHtml.set(lists, r, col + 0, b);
-          rows.put(k, r);
-          continue FORMAT_KEYS;
-        }
-      }
-
-      SafeHtmlBuilder b = new SafeHtmlBuilder();
-      String t = k.getHelpText();
-      if (prefix != null) {
-        b.append(prefix);
-        b.append(" ");
-        b.append(KeyConstants.I.thenOtherKey());
-        b.append(" ");
-      }
-      b.append(k.describeKeyStroke());
-      if (k.sibling != null) {
-        b.append(" / ").append(k.sibling.describeKeyStroke());
-        t += " / " + k.sibling.getHelpText();
-        rows.put(k.sibling, row);
-      }
-      SafeHtml.set(lists, row, col + 0, b);
-      lists.setText(row, col + 1, ":");
-      lists.setText(row, col + 2, t);
-      rows.put(k, row);
-
-      fmt.addStyleName(row, col + 0, KeyResources.I.css().helpKeyStroke());
-      fmt.addStyleName(row, col + 1, KeyResources.I.css().helpSeparator());
-      row++;
-    }
-
-    return row;
-  }
-
-  private List<KeyCommand> sort(KeyCommandSet set) {
-    final List<KeyCommand> keys = new ArrayList<>(set.getKeys());
-    Collections.sort(
-        keys,
-        new Comparator<KeyCommand>() {
-          @Override
-          public int compare(KeyCommand arg0, KeyCommand arg1) {
-            return arg0.getHelpText().compareTo(arg1.getHelpText());
-          }
-        });
-    return keys;
-  }
-}
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/linker/server/UserAgentRule.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/linker/server/UserAgentRule.java
deleted file mode 100644
index 8f7bede..0000000
--- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/linker/server/UserAgentRule.java
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright (C) 2009 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.google.gwtexpui.linker.server;
-
-import static java.util.regex.Pattern.compile;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import javax.servlet.http.HttpServletRequest;
-
-/**
- * Selects the value for the {@code user.agent} property.
- *
- * <p>Examines the {@code User-Agent} HTTP request header, and tries to match it to known {@code
- * user.agent} values.
- *
- * <p>Ported from JavaScript in {@code com.google.gwt.user.UserAgent.gwt.xml}.
- */
-public class UserAgentRule {
-  private static final Pattern msie = compile(".*msie ([0-11]+)\\.([0-11]+).*");
-  private static final Pattern gecko = compile(".*rv:([0-9]+)\\.([0-9]+).*");
-
-  public String getName() {
-    return "user.agent";
-  }
-
-  public String select(HttpServletRequest req) {
-    String ua = req.getHeader("User-Agent");
-    if (ua == null) {
-      return null;
-    }
-
-    ua = ua.toLowerCase();
-
-    if (ua.contains("opera")) {
-      return "opera";
-
-    } else if (ua.contains("webkit")) {
-      return "safari";
-
-    } else if (ua.contains("msie")) {
-      // GWT 2.0 uses document.documentMode here, which we can't do
-      // on the server side.
-
-      Matcher m = msie.matcher(ua);
-      if (m.matches() && m.groupCount() == 2) {
-        int v = makeVersion(m);
-        if (v >= 11000) {
-          return "ie11";
-        }
-        if (v >= 10000) {
-          return "ie10";
-        }
-        if (v >= 9000) {
-          return "ie9";
-        }
-        if (v >= 8000) {
-          return "ie8";
-        }
-      }
-      return null;
-
-    } else if (ua.contains("edge")) {
-      return "edge";
-    } else if (ua.contains("gecko")) {
-      Matcher m = gecko.matcher(ua);
-      if (m.matches() && m.groupCount() == 2) {
-        if (makeVersion(m) >= 1008) {
-          return "gecko1_8";
-        }
-      }
-      return "gecko";
-    }
-
-    return null;
-  }
-
-  private int makeVersion(Matcher result) {
-    return (Integer.parseInt(result.group(1)) * 1000) + Integer.parseInt(result.group(2));
-  }
-}
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/HighlightSuggestOracle.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/HighlightSuggestOracle.java
deleted file mode 100644
index ef80cdb..0000000
--- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/HighlightSuggestOracle.java
+++ /dev/null
@@ -1,157 +0,0 @@
-// Copyright (C) 2009 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.google.gwtexpui.safehtml.client;
-
-import com.google.gwt.user.client.ui.SuggestOracle;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-/**
- * A suggestion oracle that tries to highlight the matched text.
- *
- * <p>Suggestions supplied by the implementation of {@link #onRequestSuggestions(Request, Callback)}
- * are modified to wrap all occurrences of the {@link
- * com.google.gwt.user.client.ui.SuggestOracle.Request#getQuery()} substring in HTML {@code
- * &lt;strong&gt;} tags, so they can be emphasized to the user.
- */
-public abstract class HighlightSuggestOracle extends SuggestOracle {
-  private static String escape(String ds) {
-    return new SafeHtmlBuilder().append(ds).asString();
-  }
-
-  @Override
-  public final boolean isDisplayStringHTML() {
-    return true;
-  }
-
-  @Override
-  public final void requestSuggestions(Request request, Callback cb) {
-    onRequestSuggestions(
-        request,
-        new Callback() {
-          @Override
-          public void onSuggestionsReady(Request request, Response response) {
-            final String qpat = getQueryPattern(request.getQuery());
-            final boolean html = isHTML();
-            final ArrayList<Suggestion> r = new ArrayList<>();
-            for (Suggestion s : response.getSuggestions()) {
-              r.add(new BoldSuggestion(qpat, s, html));
-            }
-            cb.onSuggestionsReady(request, new Response(r));
-          }
-        });
-  }
-
-  protected String getQueryPattern(String query) {
-    return query;
-  }
-
-  /**
-   * @return true if {@link
-   *     com.google.gwt.user.client.ui.SuggestOracle.Suggestion#getDisplayString()} returns HTML;
-   *     false if the text must be escaped before evaluating in an HTML like context.
-   */
-  protected boolean isHTML() {
-    return false;
-  }
-
-  /** Compute the suggestions and return them for display. */
-  protected abstract void onRequestSuggestions(Request request, Callback done);
-
-  private static class BoldSuggestion implements Suggestion {
-    private final Suggestion suggestion;
-    private final String displayString;
-
-    BoldSuggestion(String qstr, Suggestion s, boolean html) {
-      suggestion = s;
-
-      String ds = s.getDisplayString();
-      if (!html) {
-        ds = escape(ds);
-      }
-
-      if (qstr != null && !qstr.isEmpty()) {
-        StringBuilder pattern = new StringBuilder();
-        for (String qterm : splitQuery(qstr)) {
-          qterm = escape(qterm);
-          // We now surround qstr by <strong>. But the chosen approach is not too
-          // smooth, if qstr is small (e.g.: "t") and this small qstr may occur in
-          // escapes (e.g.: "Tim &lt;email@example.org&gt;"). Those escapes will
-          // get <strong>-ed as well (e.g.: "&lt;" -> "&<strong>l</strong>t;"). But
-          // as repairing those mangled escapes is easier than not mangling them in
-          // the first place, we repair them afterwards.
-          if (pattern.length() > 0) {
-            pattern.append("|");
-          }
-          pattern.append(qterm);
-        }
-
-        ds = sgi(ds, "(" + pattern.toString() + ")", "<strong>$1</strong>");
-
-        // Repairing <strong>-ed escapes.
-        ds = sgi(ds, "(&[a-z]*)<strong>([a-z]*)</strong>([a-z]*;)", "$1$2$3");
-      }
-
-      displayString = ds;
-    }
-
-    /**
-     * Split the query by whitespace and filter out query terms which are substrings of other query
-     * terms.
-     */
-    private static List<String> splitQuery(String query) {
-      List<String> queryTerms = Arrays.asList(query.split("\\s+"));
-      Collections.sort(
-          queryTerms,
-          new Comparator<String>() {
-            @Override
-            public int compare(String s1, String s2) {
-              return Integer.compare(s2.length(), s1.length());
-            }
-          });
-
-      List<String> result = new ArrayList<>();
-      for (String s : queryTerms) {
-        boolean add = true;
-        for (String queryTerm : result) {
-          if (queryTerm.toLowerCase().contains(s.toLowerCase())) {
-            add = false;
-            break;
-          }
-        }
-        if (add) {
-          result.add(s);
-        }
-      }
-      return result;
-    }
-
-    private static native String sgi(String inString, String pat, String newHtml)
-        /*-{ return inString.replace(RegExp(pat, 'gi'), newHtml); }-*/ ;
-
-    @Override
-    public String getDisplayString() {
-      return displayString;
-    }
-
-    @Override
-    public String getReplacementString() {
-      return suggestion.getReplacementString();
-    }
-  }
-}
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/server/CacheControlFilter.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/server/CacheControlFilter.java
deleted file mode 100644
index 571f72d..0000000
--- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/server/CacheControlFilter.java
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright (C) 2008 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.google.gwtexpui.server;
-
-import java.io.IOException;
-import java.util.concurrent.TimeUnit;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * Forces GWT resources to cache for a very long time.
- *
- * <p>GWT compiled JavaScript and ImageBundles can be cached indefinitely by a browser and/or an
- * edge proxy, as they never contain user-specific data and are named by a unique checksum. If their
- * content is ever modified then the URL changes, so user agents would request a different resource.
- * We force these resources to have very long expiration times.
- *
- * <p>To use, add the following block to your {@code web.xml}:
- *
- * <pre>
- * &lt;filter&gt;
- *     &lt;filter-name&gt;CacheControl&lt;/filter-name&gt;
- *     &lt;filter-class&gt;com.google.gwtexpui.server.CacheControlFilter&lt;/filter-class&gt;
- *   &lt;/filter&gt;
- *   &lt;filter-mapping&gt;
- *     &lt;filter-name&gt;CacheControl&lt;/filter-name&gt;
- *     &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
- *   &lt;/filter-mapping&gt;
- * </pre>
- */
-public class CacheControlFilter implements Filter {
-  @Override
-  public void init(FilterConfig config) {}
-
-  @Override
-  public void destroy() {}
-
-  @Override
-  public void doFilter(final ServletRequest sreq, ServletResponse srsp, FilterChain chain)
-      throws IOException, ServletException {
-    final HttpServletRequest req = (HttpServletRequest) sreq;
-    final HttpServletResponse rsp = (HttpServletResponse) srsp;
-    final String pathInfo = pathInfo(req);
-
-    if (cacheForever(pathInfo, req)) {
-      CacheHeaders.setCacheable(req, rsp, 365, TimeUnit.DAYS);
-    } else if (nocache(pathInfo)) {
-      CacheHeaders.setNotCacheable(rsp);
-    }
-
-    chain.doFilter(req, rsp);
-  }
-
-  private static boolean cacheForever(String pathInfo, HttpServletRequest req) {
-    if (pathInfo.endsWith(".cache.html")
-        || pathInfo.endsWith(".cache.gif")
-        || pathInfo.endsWith(".cache.png")
-        || pathInfo.endsWith(".cache.css")
-        || pathInfo.endsWith(".cache.jar")
-        || pathInfo.endsWith(".cache.swf")
-        || pathInfo.endsWith(".cache.txt")
-        || pathInfo.endsWith(".cache.js")) {
-      return true;
-    } else if (pathInfo.endsWith(".nocache.js")) {
-      final String v = req.getParameter("content");
-      return v != null && v.length() > 20;
-    }
-    return false;
-  }
-
-  private static boolean nocache(String pathInfo) {
-    if (pathInfo.endsWith(".nocache.js")) {
-      return true;
-    }
-    return false;
-  }
-
-  private static String pathInfo(HttpServletRequest req) {
-    final String uri = req.getRequestURI();
-    final String ctx = req.getContextPath();
-    return uri.startsWith(ctx) ? uri.substring(ctx.length()) : uri;
-  }
-}
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/server/CacheHeaders.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/server/CacheHeaders.java
deleted file mode 100644
index 0e5e425..0000000
--- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/server/CacheHeaders.java
+++ /dev/null
@@ -1,148 +0,0 @@
-// Copyright (C) 2013 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.google.gwtexpui.server;
-
-import static java.util.concurrent.TimeUnit.DAYS;
-import static java.util.concurrent.TimeUnit.SECONDS;
-
-import java.util.concurrent.TimeUnit;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/** Utilities to manage HTTP caching directives in responses. */
-public class CacheHeaders {
-  private static final long MAX_CACHE_DURATION = DAYS.toSeconds(365);
-
-  /**
-   * Do not cache the response, anywhere.
-   *
-   * @param res response being returned.
-   */
-  public static void setNotCacheable(HttpServletResponse res) {
-    String cc = "no-cache, no-store, max-age=0, must-revalidate";
-    res.setHeader("Cache-Control", cc);
-    res.setHeader("Pragma", "no-cache");
-    res.setHeader("Expires", "Mon, 01 Jan 1990 00:00:00 GMT");
-    res.setDateHeader("Date", System.currentTimeMillis());
-  }
-
-  /**
-   * Permit caching the response for up to the age specified.
-   *
-   * <p>If the request is on a secure connection (e.g. SSL) private caching is used. This allows the
-   * user-agent to cache the response, but requests intermediate proxies to not cache. This may
-   * offer better protection for Set-Cookie headers.
-   *
-   * <p>If the request is on plaintext (insecure), public caching is used. This may allow an
-   * intermediate proxy to cache the response, including any Set-Cookie header that may have also
-   * been included.
-   *
-   * @param req current request.
-   * @param res response being returned.
-   * @param age how long the response can be cached.
-   * @param unit time unit for age, usually {@link TimeUnit#SECONDS}.
-   */
-  public static void setCacheable(
-      HttpServletRequest req, HttpServletResponse res, long age, TimeUnit unit) {
-    setCacheable(req, res, age, unit, false);
-  }
-
-  /**
-   * Permit caching the response for up to the age specified.
-   *
-   * <p>If the request is on a secure connection (e.g. SSL) private caching is used. This allows the
-   * user-agent to cache the response, but requests intermediate proxies to not cache. This may
-   * offer better protection for Set-Cookie headers.
-   *
-   * <p>If the request is on plaintext (insecure), public caching is used. This may allow an
-   * intermediate proxy to cache the response, including any Set-Cookie header that may have also
-   * been included.
-   *
-   * @param req current request.
-   * @param res response being returned.
-   * @param age how long the response can be cached.
-   * @param unit time unit for age, usually {@link TimeUnit#SECONDS}.
-   * @param mustRevalidate true if the client must validate the cached entity.
-   */
-  public static void setCacheable(
-      HttpServletRequest req,
-      HttpServletResponse res,
-      long age,
-      TimeUnit unit,
-      boolean mustRevalidate) {
-    if (req.isSecure()) {
-      setCacheablePrivate(res, age, unit, mustRevalidate);
-    } else {
-      setCacheablePublic(res, age, unit, mustRevalidate);
-    }
-  }
-
-  /**
-   * Allow the response to be cached by proxies and user-agents.
-   *
-   * <p>If the response includes a Set-Cookie header the cookie may be cached by a proxy and
-   * returned to multiple browsers behind the same proxy. This is insecure for authenticated
-   * connections.
-   *
-   * @param res response being returned.
-   * @param age how long the response can be cached.
-   * @param unit time unit for age, usually {@link TimeUnit#SECONDS}.
-   * @param mustRevalidate true if the client must validate the cached entity.
-   */
-  public static void setCacheablePublic(
-      HttpServletResponse res, long age, TimeUnit unit, boolean mustRevalidate) {
-    long now = System.currentTimeMillis();
-    long sec = maxAgeSeconds(age, unit);
-
-    res.setDateHeader("Expires", now + SECONDS.toMillis(sec));
-    res.setDateHeader("Date", now);
-    cache(res, "public", age, unit, mustRevalidate);
-  }
-
-  /**
-   * Allow the response to be cached only by the user-agent.
-   *
-   * @param res response being returned.
-   * @param age how long the response can be cached.
-   * @param unit time unit for age, usually {@link TimeUnit#SECONDS}.
-   * @param mustRevalidate true if the client must validate the cached entity.
-   */
-  public static void setCacheablePrivate(
-      HttpServletResponse res, long age, TimeUnit unit, boolean mustRevalidate) {
-    long now = System.currentTimeMillis();
-    res.setDateHeader("Expires", now);
-    res.setDateHeader("Date", now);
-    cache(res, "private", age, unit, mustRevalidate);
-  }
-
-  public static boolean hasCacheHeader(HttpServletResponse res) {
-    return res.containsHeader("Cache-Control") || res.containsHeader("Expires");
-  }
-
-  private static void cache(
-      HttpServletResponse res, String type, long age, TimeUnit unit, boolean revalidate) {
-    res.setHeader(
-        "Cache-Control",
-        String.format(
-            "%s, max-age=%d%s",
-            type, maxAgeSeconds(age, unit), revalidate ? ", must-revalidate" : ""));
-  }
-
-  private static long maxAgeSeconds(long age, TimeUnit unit) {
-    return Math.min(unit.toSeconds(age), MAX_CACHE_DURATION);
-  }
-
-  private CacheHeaders() {}
-}
diff --git a/gerrit-gwtui-common/BUILD b/gerrit-gwtui-common/BUILD
index 96b48e5..c644b85 100644
--- a/gerrit-gwtui-common/BUILD
+++ b/gerrit-gwtui-common/BUILD
@@ -3,12 +3,12 @@
 load("//tools/bzl:junit.bzl", "junit_tests")
 
 EXPORTED_DEPS = [
-    "//gerrit-common:client",
-    "//gerrit-gwtexpui:Clippy",
-    "//gerrit-gwtexpui:GlobalKey",
-    "//gerrit-gwtexpui:Progress",
-    "//gerrit-gwtexpui:SafeHtml",
-    "//gerrit-gwtexpui:UserAgent",
+    "//java/com/google/gerrit/common:client",
+    "//java/com/google/gwtexpui/clippy",
+    "//java/com/google/gwtexpui/globalkey",
+    "//java/com/google/gwtexpui/progress",
+    "//java/com/google/gwtexpui/safehtml",
+    "//java/com/google/gwtexpui/user:agent",
 ]
 
 DEPS = ["//lib/gwt:user-neverlink"]
diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/GerritGwtUICommon.gwt.xml b/gerrit-gwtui-common/src/main/java/com/google/gerrit/GerritGwtUICommon.gwt.xml
index c01dea1..dc478fc 100644
--- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/GerritGwtUICommon.gwt.xml
+++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/GerritGwtUICommon.gwt.xml
@@ -15,7 +15,7 @@
 -->
 <module>
   <inherits name='org.eclipse.jgit.JGit'/>
-  <inherits name='com.google.gerrit.Common'/>
+  <inherits name='com.google.gerrit.common.Common'/>
   <inherits name='com.google.gerrit.extensions.Extensions'/>
   <inherits name='com.google.gerrit.prettify.PrettyFormatter'/>
   <inherits name='com.google.gwtexpui.clippy.Clippy'/>
diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AccountInfo.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AccountInfo.java
index dc37285..e4c008c 100644
--- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AccountInfo.java
+++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AccountInfo.java
@@ -14,7 +14,6 @@
 
 package com.google.gerrit.client.info;
 
-import com.google.gerrit.reviewdb.client.Account;
 import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.core.client.JsArray;
 import com.google.gwt.core.client.JsArrayString;
@@ -22,10 +21,6 @@
 import java.sql.Timestamp;
 
 public class AccountInfo extends JavaScriptObject {
-  public final Account.Id getId() {
-    return new Account.Id(_accountId());
-  }
-
   public final native int _accountId() /*-{ return this._account_id || 0; }-*/;
 
   public final native String name() /*-{ return this.name; }-*/;
diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AuthInfo.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AuthInfo.java
index d2e5d49..43281bd 100644
--- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AuthInfo.java
+++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AuthInfo.java
@@ -69,9 +69,7 @@
     List<AgreementInfo> agreements = new ArrayList<>();
     JsArray<AgreementInfo> contributorAgreements = _contributorAgreements();
     if (contributorAgreements != null) {
-      for (AgreementInfo a : Natives.asList(contributorAgreements)) {
-        agreements.add(a);
-      }
+      agreements.addAll(Natives.asList(contributorAgreements));
     }
     return agreements;
   }
diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/ChangeInfo.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/ChangeInfo.java
index 866d74f..0f786a6 100644
--- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/ChangeInfo.java
+++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/ChangeInfo.java
@@ -14,6 +14,8 @@
 
 package com.google.gerrit.client.info;
 
+import static java.util.Comparator.comparing;
+
 import com.google.gerrit.client.rpc.NativeMap;
 import com.google.gerrit.client.rpc.NativeString;
 import com.google.gerrit.client.rpc.Natives;
@@ -30,8 +32,6 @@
 import com.google.gwtjsonrpc.client.impl.ser.JavaSqlTimestamp_JsonSerializer;
 import java.sql.Timestamp;
 import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -447,18 +447,8 @@
 
     public static void sortRevisionInfoByNumber(JsArray<RevisionInfo> list) {
       final int editParent = findEditParent(list);
-      Collections.sort(
-          Natives.asList(list),
-          new Comparator<RevisionInfo>() {
-            @Override
-            public int compare(RevisionInfo a, RevisionInfo b) {
-              return num(a) - num(b);
-            }
-
-            private int num(RevisionInfo r) {
-              return !r.isEdit() ? 2 * (r._number() - 1) + 1 : 2 * editParent;
-            }
-          });
+      Natives.asList(list)
+          .sort(comparing(r -> !r.isEdit() ? 2 * (r._number() - 1) + 1 : 2 * editParent));
     }
 
     public static int findEditParent(JsArray<RevisionInfo> list) {
diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/DownloadInfo.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/DownloadInfo.java
index 8d56a1c..a22a1e8 100644
--- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/DownloadInfo.java
+++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/DownloadInfo.java
@@ -31,9 +31,7 @@
 
   public final List<String> archives() {
     List<String> archives = new ArrayList<>();
-    for (String f : Natives.asList(_archives())) {
-      archives.add(f);
-    }
+    archives.addAll(Natives.asList(_archives()));
     return archives;
   }
 
diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/FileInfo.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/FileInfo.java
index 345a260..fc3dbf1 100644
--- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/FileInfo.java
+++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/FileInfo.java
@@ -19,7 +19,6 @@
 import com.google.gerrit.reviewdb.client.Patch;
 import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.core.client.JsArray;
-import java.util.Collections;
 import java.util.Comparator;
 
 public class FileInfo extends JavaScriptObject {
@@ -55,8 +54,7 @@
   public final native void _row(int r) /*-{ this._row = r }-*/;
 
   public static void sortFileInfoByPath(JsArray<FileInfo> list) {
-    Collections.sort(
-        Natives.asList(list), Comparator.comparing(FileInfo::path, FilenameComparator.INSTANCE));
+    Natives.asList(list).sort(Comparator.comparing(FileInfo::path, FilenameComparator.INSTANCE));
   }
 
   public static String getFileName(String path) {
diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/rpc/NativeMap.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/rpc/NativeMap.java
index 4b17068..41306ff 100644
--- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/rpc/NativeMap.java
+++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/rpc/NativeMap.java
@@ -14,11 +14,12 @@
 
 package com.google.gerrit.client.rpc;
 
+import static java.util.stream.Collectors.toCollection;
+
 import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.core.client.JsArray;
 import com.google.gwt.user.client.rpc.AsyncCallback;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
@@ -57,10 +58,7 @@
   }
 
   public final List<String> sortedKeys() {
-    Set<String> keys = keySet();
-    List<String> sorted = new ArrayList<>(keys);
-    Collections.sort(sorted);
-    return sorted;
+    return keySet().stream().sorted().collect(toCollection(ArrayList::new));
   }
 
   public final native JsArray<T> values() /*-{
diff --git a/gerrit-gwtui/BUILD b/gerrit-gwtui/BUILD
index bda9aed..9deed9b 100644
--- a/gerrit-gwtui/BUILD
+++ b/gerrit-gwtui/BUILD
@@ -31,11 +31,11 @@
     visibility = ["//visibility:public"],
     deps = [
         ":ui_module",
-        "//gerrit-common:client",
-        "//gerrit-extension-api:client",
+        "//java/com/google/gerrit/common:client",
+        "//java/com/google/gerrit/extensions:client",
         "//lib:junit",
-        "//lib:truth",
         "//lib/gwt:dev",
         "//lib/gwt:user",
+        "//lib/truth",
     ],
 )
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java
index 5302808..4b84864 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java
@@ -96,7 +96,6 @@
 import com.google.gerrit.common.Nullable;
 import com.google.gerrit.common.PageLinks;
 import com.google.gerrit.extensions.client.GeneralPreferencesInfo.DiffView;
-import com.google.gerrit.reviewdb.client.Account;
 import com.google.gerrit.reviewdb.client.AccountGroup;
 import com.google.gerrit.reviewdb.client.Change;
 import com.google.gerrit.reviewdb.client.Patch;
@@ -237,7 +236,7 @@
     if (matchPrefix(QUERY, token)) {
       query(token);
 
-    } else if (matchPrefix("/Documentation/", token)) {
+    } else if (matchPrefix("/Documentation/q/", token)) {
       docSearch(token);
 
     } else if (matchPrefix("/c/", token)) {
@@ -299,7 +298,7 @@
 
   private static Screen mine() {
     if (Gerrit.isSignedIn()) {
-      return new AccountDashboardScreen(Gerrit.getUserAccount().getId());
+      return new AccountDashboardScreen(Gerrit.getUserAccount()._accountId());
     }
     Screen r = new AccountDashboardScreen(null);
     r.setRequiresSignIn(true);
@@ -309,13 +308,14 @@
   private static void dashboard(String token) {
     String rest = skip(token);
     if (rest.matches("[0-9]+")) {
-      Gerrit.display(token, new AccountDashboardScreen(Account.Id.parse(rest)));
+      int accountId = Integer.parseInt(rest);
+      Gerrit.display(token, new AccountDashboardScreen(accountId));
       return;
     }
 
     if (rest.equals("self")) {
       if (Gerrit.isSignedIn()) {
-        Gerrit.display(token, new AccountDashboardScreen(Gerrit.getUserAccount().getId()));
+        Gerrit.display(token, new AccountDashboardScreen(Gerrit.getUserAccount()._accountId()));
       } else {
         Screen s = new AccountDashboardScreen(null);
         s.setRequiresSignIn(true);
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/FormatUtil.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/FormatUtil.java
index b30b3ec..c8d052e 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/FormatUtil.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/FormatUtil.java
@@ -83,17 +83,6 @@
     return createAccountFormatter().name(info);
   }
 
-  public static AccountInfo asInfo(com.google.gerrit.common.data.AccountInfo acct) {
-    if (acct == null) {
-      return AccountInfo.create(0, null, null, null);
-    }
-    return AccountInfo.create(
-        acct.getId() != null ? acct.getId().get() : 0,
-        acct.getFullName(),
-        acct.getPreferredEmail(),
-        acct.getUsername());
-  }
-
   private static AccountFormatter createAccountFormatter() {
     return new AccountFormatter(Gerrit.info().user().anonymousCowardName());
   }
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java
index e02c4e0..afc65c9 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java
@@ -51,7 +51,6 @@
 import com.google.gerrit.extensions.client.DiffPreferencesInfo;
 import com.google.gerrit.extensions.client.EditPreferencesInfo;
 import com.google.gerrit.extensions.client.GerritTopMenu;
-import com.google.gerrit.extensions.client.UiType;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gwt.aria.client.Roles;
 import com.google.gwt.core.client.EntryPoint;
@@ -561,6 +560,12 @@
     if (Location.getPath().endsWith("/") && tokens[0].startsWith("/")) {
       tokens[0] = tokens[0].substring(1);
     }
+    if (tokens[0].startsWith("projects/") && tokens[0].contains(",dashboards/")) {
+      // Rewrite project dashboard URIs to a new format, because otherwise
+      // "/projects/..." would be served as an API request.
+      tokens[0] = "p/" + tokens[0].substring("projects/".length());
+      tokens[0] = tokens[0].replace(",dashboards/", "/+/dashboard/");
+    }
     builder.setPath(Location.getPath() + tokens[0]);
     if (tokens.length == 2) {
       builder.setHash(tokens[1]);
@@ -577,12 +582,10 @@
 
     btmmenu.add(new InlineHTML(M.poweredBy(vs)));
 
-    if (info().gerrit().webUis().contains(UiType.POLYGERRIT)) {
-      btmmenu.add(new InlineLabel(" | "));
-      uiSwitcherLink = new Anchor(C.newUi(), getUiSwitcherUrl(History.getToken()));
-      uiSwitcherLink.setStyleName("");
-      btmmenu.add(uiSwitcherLink);
-    }
+    btmmenu.add(new InlineLabel(" | "));
+    uiSwitcherLink = new Anchor(C.newUi(), getUiSwitcherUrl(History.getToken()));
+    uiSwitcherLink.setStyleName("");
+    btmmenu.add(uiSwitcherLink);
 
     String reportBugUrl = info().gerrit().reportBugUrl();
     if (reportBugUrl != null) {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountConstants.properties b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountConstants.properties
index 59b8b3d..c32efed 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountConstants.properties
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountConstants.properties
@@ -38,7 +38,7 @@
 showLegacycidInChangeTable = Show Change Number In Changes Table
 muteCommonPathPrefixes = Mute Common Path Prefixes In File List
 signedOffBy = Insert Signed-off-by Footer For Inline Edit Changes
-publishCommentsOnPush = Publish Draft Comments When a Change Is Updated by Push
+publishCommentsOnPush = Publish Comments On Push
 workInProgressByDefault = Set all new changes work-in-progress by default
 myMenu = My Menu
 myMenuInfo = \
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyGpgKeysScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyGpgKeysScreen.java
index 0dc1dab..1a0090a 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyGpgKeysScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyGpgKeysScreen.java
@@ -14,6 +14,8 @@
 
 package com.google.gerrit.client.account;
 
+import static java.util.Comparator.comparing;
+
 import com.google.gerrit.client.Gerrit;
 import com.google.gerrit.client.info.GpgKeyInfo;
 import com.google.gerrit.client.rpc.GerritCallback;
@@ -40,8 +42,6 @@
 import com.google.gwtexpui.clippy.client.CopyableLabel;
 import com.google.gwtexpui.globalkey.client.NpTextArea;
 import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
 import java.util.List;
 
 public class MyGpgKeysScreen extends SettingsScreen {
@@ -118,14 +118,7 @@
                     List<GpgKeyInfo> list = Natives.asList(result.values());
                     // TODO(dborowitz): Sort on something more meaningful, like
                     // created date?
-                    Collections.sort(
-                        list,
-                        new Comparator<GpgKeyInfo>() {
-                          @Override
-                          public int compare(GpgKeyInfo a, GpgKeyInfo b) {
-                            return a.id().compareTo(b.id());
-                          }
-                        });
+                    list.sort(comparing(GpgKeyInfo::id));
                     keys.clear();
                     keyText.setText("");
                     errorPanel.setVisible(false);
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyIdentitiesScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyIdentitiesScreen.java
index 5c6d40f..730d98e 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyIdentitiesScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyIdentitiesScreen.java
@@ -14,6 +14,8 @@
 
 package com.google.gerrit.client.account;
 
+import static java.util.Comparator.naturalOrder;
+
 import com.google.gerrit.client.Gerrit;
 import com.google.gerrit.client.VoidResult;
 import com.google.gerrit.client.rpc.GerritCallback;
@@ -29,7 +31,6 @@
 import com.google.gwt.user.client.ui.Button;
 import com.google.gwt.user.client.ui.CheckBox;
 import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 
@@ -169,7 +170,7 @@
 
     void display(JsArray<ExternalIdInfo> results) {
       List<ExternalIdInfo> idList = Natives.asList(results);
-      Collections.sort(idList);
+      idList.sort(naturalOrder());
 
       while (1 < table.getRowCount()) {
         table.removeRow(table.getRowCount() - 1);
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyProfileScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyProfileScreen.java
index 177fc09..0275948 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyProfileScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyProfileScreen.java
@@ -122,6 +122,6 @@
     info.setText(row++, fieldIdx, account.name());
     info.setText(row++, fieldIdx, account.email());
     info.setText(row++, fieldIdx, mediumFormat(account.registeredOn()));
-    info.setText(row, fieldIdx, account.getId().toString());
+    info.setText(row, fieldIdx, Integer.toString(account._accountId()));
   }
 }
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyWatchedProjectsScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyWatchedProjectsScreen.java
index c99cd1a..f29b573 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyWatchedProjectsScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyWatchedProjectsScreen.java
@@ -182,11 +182,6 @@
       return;
     }
 
-    String filter = filterTxt.getText();
-    if (filter == null || filter.isEmpty() || filter.equals(Util.C.defaultFilter())) {
-      filter = null;
-    }
-
     addNew.setEnabled(false);
     nameBox.setEnabled(false);
     filterTxt.setEnabled(false);
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/UsernameField.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/UsernameField.java
index def29b2..4fdd067 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/UsernameField.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/UsernameField.java
@@ -39,7 +39,7 @@
 class UsernameField extends Composite {
   // If these regular expressions are modified the same modifications should be done to the
   // corresponding regular expressions in the
-  // com.google.gerrit.server.account.ExternalId class.
+  // com.google.gerrit.server.account.externalids.ExternalId class.
   private static final String USER_NAME_PATTERN_FIRST_REGEX = "[a-zA-Z0-9]";
   private static final String USER_NAME_PATTERN_REST_REGEX = "[a-zA-Z0-9.!#$%&’*+=?^_`\\{|\\}~@-]";
 
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccessSectionEditor.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccessSectionEditor.java
index e518d26..7bd8b82 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccessSectionEditor.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccessSectionEditor.java
@@ -14,6 +14,8 @@
 
 package com.google.gerrit.client.admin;
 
+import static java.util.stream.Collectors.toCollection;
+
 import com.google.gerrit.client.Gerrit;
 import com.google.gerrit.common.data.AccessSection;
 import com.google.gerrit.common.data.LabelType;
@@ -45,7 +47,6 @@
 import com.google.gwt.user.client.ui.HTMLPanel;
 import com.google.gwt.user.client.ui.ValueListBox;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
 public class AccessSectionEditor extends Composite
@@ -169,7 +170,7 @@
 
   @Override
   public void setValue(AccessSection value) {
-    Collections.sort(value.getPermissions());
+    sortPermissions(value);
 
     this.value = value;
     this.readOnly = !editing || !(projectAccess.isOwnerOf(value) || projectAccess.canUpload());
@@ -204,6 +205,11 @@
     }
   }
 
+  private void sortPermissions(AccessSection accessSection) {
+    accessSection.setPermissions(
+        accessSection.getPermissions().stream().sorted().collect(toCollection(ArrayList::new)));
+  }
+
   void setEditing(boolean editing) {
     this.editing = editing;
   }
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupMembersScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupMembersScreen.java
index 2614224..6eaab5d 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupMembersScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupMembersScreen.java
@@ -14,6 +14,8 @@
 
 package com.google.gerrit.client.admin;
 
+import static java.util.Comparator.comparing;
+
 import com.google.gerrit.client.Dispatcher;
 import com.google.gerrit.client.Gerrit;
 import com.google.gerrit.client.VoidResult;
@@ -29,7 +31,6 @@
 import com.google.gerrit.client.ui.FancyFlexTable;
 import com.google.gerrit.client.ui.Hyperlink;
 import com.google.gerrit.client.ui.SmallHeading;
-import com.google.gerrit.common.Nullable;
 import com.google.gerrit.reviewdb.client.AccountGroup;
 import com.google.gwt.event.dom.client.ClickEvent;
 import com.google.gwt.event.dom.client.ClickHandler;
@@ -295,26 +296,9 @@
 
     void insert(AccountInfo info) {
       Comparator<AccountInfo> c =
-          new Comparator<AccountInfo>() {
-            @Override
-            public int compare(AccountInfo a, AccountInfo b) {
-              int cmp = nullToEmpty(a.name()).compareTo(nullToEmpty(b.name()));
-              if (cmp != 0) {
-                return cmp;
-              }
-
-              cmp = nullToEmpty(a.email()).compareTo(nullToEmpty(b.email()));
-              if (cmp != 0) {
-                return cmp;
-              }
-
-              return a._accountId() - b._accountId();
-            }
-
-            public String nullToEmpty(String str) {
-              return str == null ? "" : str;
-            }
-          };
+          comparing((AccountInfo a) -> nullToEmpty(a.name()))
+              .thenComparing(a -> nullToEmpty(a.email()))
+              .thenComparing(AccountInfo::_accountId);
       int insertPos = getInsertRow(c, info);
       if (insertPos >= 0) {
         table.insertRow(insertPos);
@@ -405,20 +389,7 @@
 
     void insert(GroupInfo info) {
       Comparator<GroupInfo> c =
-          new Comparator<GroupInfo>() {
-            @Override
-            public int compare(GroupInfo a, GroupInfo b) {
-              int cmp = nullToEmpty(a.name()).compareTo(nullToEmpty(b.name()));
-              if (cmp != 0) {
-                return cmp;
-              }
-              return a.getGroupUUID().compareTo(b.getGroupUUID());
-            }
-
-            private String nullToEmpty(@Nullable String str) {
-              return (str == null) ? "" : str;
-            }
-          };
+          comparing((GroupInfo g) -> nullToEmpty(g.name())).thenComparing(GroupInfo::getGroupUUID);
       int insertPos = getInsertRow(c, info);
       if (insertPos >= 0) {
         table.insertRow(insertPos);
@@ -457,4 +428,9 @@
       setRowItem(row, i);
     }
   }
+
+  // Like Guava's Strings#nullToEmpty, which can't be used in GWT UI code.
+  private static String nullToEmpty(String str) {
+    return str == null ? "" : str;
+  }
 }
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.java
index 9d33f5a..9def3b3 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.java
@@ -135,6 +135,8 @@
 
   String headingProjectSubmitType();
 
+  String projectSubmitType_INHERIT();
+
   String projectSubmitType_FAST_FORWARD_ONLY();
 
   String projectSubmitType_MERGE_ALWAYS();
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.properties b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.properties
index 527cb1e..7901f33 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.properties
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.properties
@@ -58,6 +58,7 @@
 headingAuditLog = Audit Log
 
 headingProjectSubmitType = Submit Type
+projectSubmitType_INHERIT = Inherit
 projectSubmitType_FAST_FORWARD_ONLY = Fast Forward Only
 projectSubmitType_MERGE_IF_NECESSARY = Merge if Necessary
 projectSubmitType_REBASE_ALWAYS = Rebase Always
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupTable.java
index 259847e..be0db41 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupTable.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupTable.java
@@ -14,6 +14,8 @@
 
 package com.google.gerrit.client.admin;
 
+import static java.util.Comparator.comparing;
+
 import com.google.gerrit.client.Dispatcher;
 import com.google.gerrit.client.Gerrit;
 import com.google.gerrit.client.groups.GroupList;
@@ -32,8 +34,6 @@
 import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;
 import com.google.gwt.user.client.ui.HTMLTable.Cell;
 import com.google.gwt.user.client.ui.Image;
-import java.util.Collections;
-import java.util.Comparator;
 import java.util.List;
 
 public class GroupTable extends NavigationTable<GroupInfo> {
@@ -105,14 +105,7 @@
       table.removeRow(table.getRowCount() - 1);
     }
 
-    Collections.sort(
-        list,
-        new Comparator<GroupInfo>() {
-          @Override
-          public int compare(GroupInfo a, GroupInfo b) {
-            return a.name().compareTo(b.name());
-          }
-        });
+    list.sort(comparing(GroupInfo::name));
     for (GroupInfo group : list.subList(fromIndex, toIndex)) {
       final int row = table.getRowCount();
       table.insertRow(row);
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/PermissionEditor.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/PermissionEditor.java
index 79a4cef..39dadcc 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/PermissionEditor.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/PermissionEditor.java
@@ -273,7 +273,7 @@
                 lt.getMin().getValue(),
                 lt.getMax().getValue());
       }
-    } else if (GlobalCapability.isCapability(value.getName())) {
+    } else if (GlobalCapability.isGlobalCapability(value.getName())) {
       validRange = GlobalCapability.getRange(value.getName());
 
     } else {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectInfoScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectInfoScreen.java
index c54a41b..d10a031 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectInfoScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectInfoScreen.java
@@ -30,6 +30,7 @@
 import com.google.gerrit.client.projects.ConfigInfo.ConfigParameterInfo;
 import com.google.gerrit.client.projects.ConfigInfo.ConfigParameterValue;
 import com.google.gerrit.client.projects.ConfigInfo.InheritedBooleanInfo;
+import com.google.gerrit.client.projects.ConfigInfo.SubmitTypeInfo;
 import com.google.gerrit.client.projects.ProjectApi;
 import com.google.gerrit.client.rpc.CallbackGroup;
 import com.google.gerrit.client.rpc.GerritCallback;
@@ -341,13 +342,15 @@
     grid.addHtml(AdminConstants.I.useSignedOffBy(), signedOffBy);
   }
 
-  private void setSubmitType(SubmitType newSubmitType) {
+  private void setSubmitType(SubmitTypeInfo newSubmitType) {
     int index = -1;
-    if (submitType != null) {
+    if (newSubmitType != null) {
       for (int i = 0; i < submitType.getItemCount(); i++) {
-        if (newSubmitType.name().equals(submitType.getValue(i))) {
+        if (submitType.getValue(i).equals(SubmitType.INHERIT.name())) {
+          submitType.setItemText(i, getInheritString(newSubmitType));
+        }
+        if (newSubmitType.configuredValue().name().equals(submitType.getValue(i))) {
           index = i;
-          break;
         }
       }
       submitType.setSelectedIndex(index);
@@ -355,6 +358,13 @@
     }
   }
 
+  private static String getInheritString(SubmitTypeInfo submitType) {
+    return Util.toLongString(SubmitType.INHERIT)
+        + " ("
+        + Util.toLongString(submitType.inheritedValue())
+        + ")";
+  }
+
   private void setState(ProjectState newState) {
     if (state != null) {
       for (int i = 0; i < state.getItemCount(); i++) {
@@ -426,7 +436,7 @@
     setBool(workInProgressByDefault, result.workInProgressByDefault());
     setBool(enableReviewerByEmail, result.enableReviewerByEmail());
     setBool(matchAuthorToCommitterDate, result.matchAuthorToCommitterDate());
-    setSubmitType(result.submitType());
+    setSubmitType(result.defaultSubmitType());
     setState(result.state());
     maxObjectSizeLimit.setText(result.maxObjectSizeLimit().configuredValue());
     if (result.maxObjectSizeLimit().value() != null) {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/Util.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/Util.java
index 2e4926d..bbc8a1d 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/Util.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/Util.java
@@ -35,6 +35,8 @@
       return "";
     }
     switch (type) {
+      case INHERIT:
+        return AdminConstants.I.projectSubmitType_INHERIT();
       case FAST_FORWARD_ONLY:
         return AdminConstants.I.projectSubmitType_FAST_FORWARD_ONLY();
       case MERGE_IF_NECESSARY:
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen.java
index 8db2da2..ec7bc4a 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen.java
@@ -26,6 +26,7 @@
 import com.google.gerrit.client.changes.ChangeApi;
 import com.google.gerrit.client.changes.ChangeList;
 import com.google.gerrit.client.changes.CommentInfo;
+import com.google.gerrit.client.changes.QueryScreen;
 import com.google.gerrit.client.changes.RevisionInfoCache;
 import com.google.gerrit.client.changes.StarredChanges;
 import com.google.gerrit.client.changes.Util;
@@ -282,11 +283,46 @@
   @Override
   protected void onLoad() {
     super.onLoad();
+    loadChangeScreen();
+  }
+
+  private void loadChangeScreen() {
+    if (project == null) {
+      // Load the project if it is not already present. This is the case when the user used a URL
+      // that doesn't include the project. Setting it here will rewrite the URL token to include the
+      // project (visible to the user) and all future API calls made from the change screen will use
+      // project/+/changeId to identify the change.
+      String query = "change:" + changeId.get();
+      ChangeList.query(
+          query,
+          Collections.emptySet(),
+          new AsyncCallback<ChangeList>() {
+            @Override
+            public void onSuccess(ChangeList result) {
+              if (result.length() == 0) {
+                Gerrit.display(getToken(), new NotFoundScreen());
+              } else if (result.length() > 1) {
+                Gerrit.display(PageLinks.toChangeQuery(query), QueryScreen.forQuery(query));
+              } else {
+                // Initialize current screen with newly obtained project
+                project = result.get(0).projectNameKey();
+                loadChangeScreen();
+              }
+            }
+
+            @Override
+            public void onFailure(Throwable caught) {
+              GerritCallback.showFailure(caught);
+            }
+          });
+
+      return;
+    }
     CallbackGroup group = new CallbackGroup();
     if (Gerrit.isSignedIn()) {
       ChangeList.query(
           "change:" + changeId.get() + " has:draft",
-          Collections.<ListChangesOption>emptySet(),
+          Collections.emptySet(),
           group.add(
               new AsyncCallback<ChangeList>() {
                 @Override
@@ -318,15 +354,6 @@
               @Override
               public void onSuccess(ChangeInfo info) {
                 info.init();
-                if (project == null) {
-                  // Update Project when the first API call succeeded if it wasn't already present.
-                  // This is the case when the user used a URL that doesn't include the project.
-                  // Setting it here will rewrite the URL token to include the project (visible to
-                  // the user) and all future API calls made from the change screen will use
-                  // project/+/changeId to identify the change.
-                  project = info.projectNameKey();
-                }
-
                 initCurrentRevision(info);
                 final RevisionInfo rev = info.revision(revision);
                 CallbackGroup group = new CallbackGroup();
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Labels.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Labels.java
index 1f4820f..267a983 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Labels.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Labels.java
@@ -14,6 +14,10 @@
 
 package com.google.gerrit.client.change;
 
+import static java.util.stream.Collectors.collectingAndThen;
+import static java.util.stream.Collectors.toCollection;
+import static java.util.stream.Collectors.toList;
+
 import com.google.gerrit.client.Gerrit;
 import com.google.gerrit.client.changes.ChangeApi;
 import com.google.gerrit.client.changes.Util;
@@ -135,9 +139,11 @@
   }
 
   void set(ChangeInfo info) {
-    List<String> names = new ArrayList<>(info.labels());
+    List<String> names =
+        info.labels().stream()
+            .sorted()
+            .collect(collectingAndThen(toList(), Collections::unmodifiableList));
     Set<Integer> removable = info.removableReviewerIds();
-    Collections.sort(names);
 
     resize(names.size(), 2);
 
@@ -197,8 +203,7 @@
   }
 
   private static List<Integer> sort(Set<Integer> keySet, int a, int b) {
-    List<Integer> r = new ArrayList<>(keySet);
-    Collections.sort(r);
+    List<Integer> r = keySet.stream().sorted().collect(toCollection(ArrayList::new));
     if (keySet.contains(a)) {
       r.remove(Integer.valueOf(a));
       r.add(0, a);
@@ -238,31 +243,32 @@
       Set<Integer> removable,
       String label,
       Map<Integer, VotableInfo> votable) {
-    List<AccountInfo> users = new ArrayList<>(in);
-    Collections.sort(
-        users,
-        new Comparator<AccountInfo>() {
-          @Override
-          public int compare(AccountInfo a, AccountInfo b) {
-            String as = name(a);
-            String bs = name(b);
-            if (as.isEmpty()) {
-              return 1;
-            } else if (bs.isEmpty()) {
-              return -1;
-            }
-            return as.compareTo(bs);
-          }
+    List<AccountInfo> users =
+        in.stream()
+            .sorted(
+                new Comparator<AccountInfo>() {
+                  @Override
+                  public int compare(AccountInfo a, AccountInfo b) {
+                    String as = name(a);
+                    String bs = name(b);
+                    if (as.isEmpty()) {
+                      return 1;
+                    } else if (bs.isEmpty()) {
+                      return -1;
+                    }
+                    return as.compareTo(bs);
+                  }
 
-          private String name(AccountInfo a) {
-            if (a.name() != null) {
-              return a.name();
-            } else if (a.email() != null) {
-              return a.email();
-            }
-            return "";
-          }
-        });
+                  private String name(AccountInfo a) {
+                    if (a.name() != null) {
+                      return a.name();
+                    } else if (a.email() != null) {
+                      return a.email();
+                    }
+                    return "";
+                  }
+                })
+            .collect(collectingAndThen(toList(), Collections::unmodifiableList));
 
     SafeHtmlBuilder html = new SafeHtmlBuilder();
     Iterator<? extends AccountInfo> itr = users.iterator();
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/LocalComments.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/LocalComments.java
index 44652cf..d2f031a 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/LocalComments.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/LocalComments.java
@@ -201,8 +201,8 @@
 
   private static InlineComment getInlineComment(String key) {
     String path;
-    Side side = Side.PARENT;
-    int line = 0;
+    Side side;
+    int line;
     CommentRange range;
     StorageBackend storage = new StorageBackend();
 
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RelatedChanges.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RelatedChanges.java
index 81a94a2..2c52800 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RelatedChanges.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RelatedChanges.java
@@ -226,6 +226,7 @@
     if (info.currentRevision() != null && info.currentRevision().equals(revision)) {
       ChangeApi.change(info.project(), info.legacyId().get())
           .view("submitted_together")
+          .addParameter("o", "CURRENT_COMMIT")
           .get(new TabChangeListCallback(Tab.SUBMITTED_TOGETHER, info.project(), revision));
     }
 
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ReplyBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ReplyBox.java
index 80b1796..addd692 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ReplyBox.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ReplyBox.java
@@ -16,6 +16,8 @@
 
 import static com.google.gwt.event.dom.client.KeyCodes.KEY_ENTER;
 import static com.google.gwt.event.dom.client.KeyCodes.KEY_MAC_ENTER;
+import static java.util.stream.Collectors.collectingAndThen;
+import static java.util.stream.Collectors.toList;
 
 import com.google.gerrit.client.Gerrit;
 import com.google.gerrit.client.changes.ChangeApi;
@@ -123,11 +125,13 @@
     this.lc = new LocalComments(project, psId.getParentKey());
     initWidget(uiBinder.createAndBindUi(this));
 
-    List<String> names = new ArrayList<>(permitted.keySet());
+    List<String> names =
+        permitted.keySet().stream()
+            .sorted()
+            .collect(collectingAndThen(toList(), Collections::unmodifiableList));
     if (names.isEmpty()) {
       UIObject.setVisible(labelsParent, false);
     } else {
-      Collections.sort(names);
       renderLabels(names, all, permitted);
     }
 
@@ -373,7 +377,7 @@
     fmt.setStyleName(row, labelHelpColumn, style.label_help());
 
     ApprovalInfo self =
-        Gerrit.isSignedIn() ? lv.info.forUser(Gerrit.getUserAccount().getId().get()) : null;
+        Gerrit.isSignedIn() ? lv.info.forUser(Gerrit.getUserAccount()._accountId()) : null;
 
     final LabelRadioGroup group = new LabelRadioGroup(row, id, lv.permitted.size());
     for (int i = 0; i < columns.size(); i++) {
@@ -395,7 +399,7 @@
 
   private void renderCheckBox(int row, LabelAndValues lv) {
     ApprovalInfo self =
-        Gerrit.isSignedIn() ? lv.info.forUser(Gerrit.getUserAccount().getId().get()) : null;
+        Gerrit.isSignedIn() ? lv.info.forUser(Gerrit.getUserAccount()._accountId()) : null;
 
     final String id = lv.info.name();
     final CheckBox b = new CheckBox();
@@ -439,8 +443,10 @@
               clp, project, psId, Util.C.commitMessage(), copyPath(Patch.MERGE_LIST, l)));
     }
 
-    List<String> paths = new ArrayList<>(m.keySet());
-    Collections.sort(paths);
+    List<String> paths =
+        m.keySet().stream()
+            .sorted()
+            .collect(collectingAndThen(toList(), Collections::unmodifiableList));
 
     for (String path : paths) {
       if (!Patch.isMagic(path)) {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/AccountDashboardScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/AccountDashboardScreen.java
index 0465902..7ec1102 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/AccountDashboardScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/AccountDashboardScreen.java
@@ -14,6 +14,8 @@
 
 package com.google.gerrit.client.changes;
 
+import static java.util.Comparator.comparing;
+
 import com.google.gerrit.client.Gerrit;
 import com.google.gerrit.client.NotFoundScreen;
 import com.google.gerrit.client.info.ChangeInfo;
@@ -23,7 +25,6 @@
 import com.google.gerrit.client.ui.Screen;
 import com.google.gerrit.common.PageLinks;
 import com.google.gerrit.extensions.client.ListChangesOption;
-import com.google.gerrit.reviewdb.client.Account;
 import com.google.gwt.core.client.JsArray;
 import com.google.gwt.event.dom.client.KeyPressEvent;
 import com.google.gwtexpui.globalkey.client.KeyCommand;
@@ -43,7 +44,7 @@
     MY_DASHBOARD_OPTIONS = Collections.unmodifiableSet(options);
   }
 
-  private final Account.Id ownerId;
+  private final Integer ownerId;
   private final boolean mine;
   private ChangeTable table;
   private ChangeTable.Section workInProgress;
@@ -51,9 +52,9 @@
   private ChangeTable.Section incoming;
   private ChangeTable.Section closed;
 
-  public AccountDashboardScreen(Account.Id id) {
-    ownerId = id;
-    mine = Gerrit.isSignedIn() && ownerId.equals(Gerrit.getUserAccount().getId());
+  public AccountDashboardScreen(Integer accountId) {
+    ownerId = accountId;
+    mine = Gerrit.isSignedIn() && ownerId == Gerrit.getUserAccount()._accountId();
   }
 
   @Override
@@ -177,7 +178,7 @@
       }
     }
 
-    Collections.sort(Natives.asList(out), outComparator());
+    Natives.asList(out).sort(outComparator());
 
     table.updateColumnsForLabels(wip, out, in, done);
     workInProgress.display(wip);
@@ -188,16 +189,7 @@
   }
 
   private Comparator<ChangeInfo> outComparator() {
-    return new Comparator<ChangeInfo>() {
-      @Override
-      public int compare(ChangeInfo a, ChangeInfo b) {
-        int cmp = a.created().compareTo(b.created());
-        if (cmp != 0) {
-          return cmp;
-        }
-        return a._number() - b._number();
-      }
-    };
+    return comparing(ChangeInfo::created).thenComparing(ChangeInfo::_number);
   }
 
   private boolean hasChanges(JsArray<ChangeList> result) {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeTable.java
index b9363cc..4fda78b 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeTable.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeTable.java
@@ -16,11 +16,13 @@
 
 import static com.google.gerrit.client.FormatUtil.relativeFormat;
 import static com.google.gerrit.client.FormatUtil.shortFormat;
+import static java.util.stream.Collectors.toList;
 
 import com.google.gerrit.client.Gerrit;
 import com.google.gerrit.client.info.AccountInfo;
 import com.google.gerrit.client.info.ChangeInfo;
 import com.google.gerrit.client.info.ChangeInfo.LabelInfo;
+import com.google.gerrit.client.rpc.Natives;
 import com.google.gerrit.client.ui.AccountLinkPanel;
 import com.google.gerrit.client.ui.BranchLink;
 import com.google.gerrit.client.ui.ChangeLink;
@@ -45,6 +47,7 @@
 import com.google.gwt.user.client.ui.UIObject;
 import com.google.gwt.user.client.ui.Widget;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.EnumSet;
 import java.util.List;
@@ -185,17 +188,13 @@
   }
 
   public void updateColumnsForLabels(ChangeList... lists) {
-    labelNames = new ArrayList<>();
-    for (ChangeList list : lists) {
-      for (int i = 0; i < list.length(); i++) {
-        for (String name : list.get(i).labels()) {
-          if (!labelNames.contains(name)) {
-            labelNames.add(name);
-          }
-        }
-      }
-    }
-    Collections.sort(labelNames);
+    labelNames =
+        Arrays.stream(lists)
+            .flatMap(l -> Natives.asList(l).stream())
+            .flatMap(c -> c.labels().stream())
+            .distinct()
+            .sorted()
+            .collect(toList());
 
     int baseColumns = BASE_COLUMNS;
     if (baseColumns + labelNames.size() < columns) {
@@ -264,7 +263,7 @@
       if (c.assignee() != null) {
         table.setWidget(row, C_ASSIGNEE, AccountLinkPanel.forAssignee(c.assignee()));
         if (Gerrit.getUserPreferences().highlightAssigneeInChangeTable()
-            && Objects.equals(c.assignee().getId(), Gerrit.getUserAccount().getId())) {
+            && Objects.equals(c.assignee()._accountId(), Gerrit.getUserAccount()._accountId())) {
           table.getRowFormatter().addStyleName(row, Gerrit.RESOURCES.css().cASSIGNEDTOME());
         }
       } else {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/dashboards/DashboardsTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/dashboards/DashboardsTable.java
index 0e4ef4e..dcb9c01 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/dashboards/DashboardsTable.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/dashboards/DashboardsTable.java
@@ -14,6 +14,8 @@
 
 package com.google.gerrit.client.dashboards;
 
+import static java.util.Comparator.comparing;
+
 import com.google.gerrit.client.Gerrit;
 import com.google.gerrit.client.rpc.Natives;
 import com.google.gerrit.client.ui.NavigationTable;
@@ -25,8 +27,6 @@
 import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;
 import com.google.gwt.user.client.ui.Image;
 import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -75,14 +75,7 @@
       table.removeRow(table.getRowCount() - 1);
     }
 
-    Collections.sort(
-        list,
-        new Comparator<DashboardInfo>() {
-          @Override
-          public int compare(DashboardInfo a, DashboardInfo b) {
-            return a.id().compareTo(b.id());
-          }
-        });
+    list.sort(comparing(DashboardInfo::id));
 
     String ref = null;
     for (DashboardInfo d : list) {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentsCollections.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentsCollections.java
index 533b745..2698584 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentsCollections.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentsCollections.java
@@ -14,6 +14,8 @@
 
 package com.google.gerrit.client.diff;
 
+import static java.util.Comparator.comparing;
+
 import com.google.gerrit.client.DiffObject;
 import com.google.gerrit.client.Gerrit;
 import com.google.gerrit.client.changes.CommentApi;
@@ -27,8 +29,6 @@
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gwt.core.client.JsArray;
 import com.google.gwt.user.client.rpc.AsyncCallback;
-import java.util.Collections;
-import java.util.Comparator;
 
 /** Collection of published and draft comments loaded from the server. */
 class CommentsCollections {
@@ -158,14 +158,7 @@
       for (CommentInfo c : Natives.asList(in)) {
         c.path(path);
       }
-      Collections.sort(
-          Natives.asList(in),
-          new Comparator<CommentInfo>() {
-            @Override
-            public int compare(CommentInfo a, CommentInfo b) {
-              return a.updated().compareTo(b.updated());
-            }
-          });
+      Natives.asList(in).sort(comparing(CommentInfo::updated));
     }
     return in;
   }
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffInfo.java
index cf40762..d942c2e 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffInfo.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffInfo.java
@@ -137,7 +137,10 @@
 
   private static void append(StringBuilder s, JsArrayString lines) {
     for (int i = 0; i < lines.length(); i++) {
-      s.append(lines.get(i)).append('\n');
+      if (s.length() > 0) {
+        s.append('\n');
+      }
+      s.append(lines.get(i));
     }
   }
 
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/UnifiedChunkManager.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/UnifiedChunkManager.java
index 1a662e2..98ad023 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/UnifiedChunkManager.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/UnifiedChunkManager.java
@@ -14,6 +14,8 @@
 
 package com.google.gerrit.client.diff;
 
+import static java.util.Comparator.comparing;
+
 import com.google.gerrit.client.diff.DiffInfo.Region;
 import com.google.gerrit.client.diff.DiffInfo.Span;
 import com.google.gerrit.client.rpc.Natives;
@@ -227,12 +229,7 @@
 
   /** Diff chunks are ordered by their starting lines in CodeMirror */
   private Comparator<UnifiedDiffChunkInfo> getDiffChunkComparatorCmLine() {
-    return new Comparator<UnifiedDiffChunkInfo>() {
-      @Override
-      public int compare(UnifiedDiffChunkInfo o1, UnifiedDiffChunkInfo o2) {
-        return o1.getCmLine() - o2.getCmLine();
-      }
-    };
+    return comparing(UnifiedDiffChunkInfo::getCmLine);
   }
 
   @Override
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditPreferencesBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditPreferencesBox.java
index 6ef71e6..5157123 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditPreferencesBox.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditPreferencesBox.java
@@ -282,7 +282,9 @@
             Gerrit.setEditPreferences(p.copyTo(new EditPreferencesInfo()));
           }
         });
-    close();
+    if (view != null) {
+      close();
+    }
   }
 
   @UiHandler("close")
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ConfigInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ConfigInfo.java
index a6a7ce6..684f8e6 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ConfigInfo.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ConfigInfo.java
@@ -73,6 +73,8 @@
     return SubmitType.valueOf(submitTypeRaw());
   }
 
+  public final native SubmitTypeInfo defaultSubmitType() /*-{ return this.default_submit_type; }-*/;
+
   public final native NativeMap<NativeMap<ConfigParameterInfo>> pluginConfig()
       /*-{ return this.plugin_config || {}; }-*/ ;
 
@@ -235,4 +237,26 @@
 
     protected ConfigParameterValue() {}
   }
+
+  public static class SubmitTypeInfo extends JavaScriptObject {
+    public final SubmitType value() {
+      return SubmitType.valueOf(valueRaw());
+    }
+
+    public final SubmitType configuredValue() {
+      return SubmitType.valueOf(configuredValueRaw());
+    }
+
+    public final SubmitType inheritedValue() {
+      return SubmitType.valueOf(inheritedValueRaw());
+    }
+
+    private final native String valueRaw() /*-{ return this.value; }-*/;
+
+    private final native String configuredValueRaw() /*-{ return this.configured_value; }-*/;
+
+    private final native String inheritedValueRaw() /*-{ return this.inherited_value; }-*/;
+
+    protected SubmitTypeInfo() {}
+  }
 }
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ProjectApi.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ProjectApi.java
index 7a4ec83..3be52e6 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ProjectApi.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ProjectApi.java
@@ -178,7 +178,9 @@
     in.setPrivateByDefault(privateByDefault);
     in.setWorkInProgressByDefault(workInProgressByDefault);
     in.setMaxObjectSizeLimit(maxObjectSizeLimit);
-    in.setSubmitType(submitType);
+    if (submitType != null) {
+      in.setSubmitType(submitType);
+    }
     in.setState(state);
     in.setPluginConfigValues(pluginConfigValues);
     in.setEnableReviewerByEmail(enableReviewerByEmail);
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectsTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectsTable.java
index ac89180..3576b12 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectsTable.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectsTable.java
@@ -14,14 +14,14 @@
 
 package com.google.gerrit.client.ui;
 
+import static java.util.Comparator.comparing;
+
 import com.google.gerrit.client.Gerrit;
 import com.google.gerrit.client.projects.ProjectInfo;
 import com.google.gerrit.client.projects.ProjectMap;
 import com.google.gerrit.client.rpc.Natives;
 import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;
 import com.google.gwt.user.client.ui.Image;
-import java.util.Collections;
-import java.util.Comparator;
 import java.util.List;
 
 public class ProjectsTable extends NavigationTable<ProjectInfo> {
@@ -69,14 +69,7 @@
     }
 
     List<ProjectInfo> list = Natives.asList(projects.values());
-    Collections.sort(
-        list,
-        new Comparator<ProjectInfo>() {
-          @Override
-          public int compare(ProjectInfo a, ProjectInfo b) {
-            return a.name().compareTo(b.name());
-          }
-        });
+    list.sort(comparing(ProjectInfo::name));
     for (ProjectInfo p : list.subList(fromIndex, toIndex)) {
       insert(table.getRowCount(), p);
     }
diff --git a/gerrit-gwtui/src/main/java/net/codemirror/mode/ModeInfo.java b/gerrit-gwtui/src/main/java/net/codemirror/mode/ModeInfo.java
index c6f113e..9df066d 100644
--- a/gerrit-gwtui/src/main/java/net/codemirror/mode/ModeInfo.java
+++ b/gerrit-gwtui/src/main/java/net/codemirror/mode/ModeInfo.java
@@ -14,6 +14,8 @@
 
 package net.codemirror.mode;
 
+import static java.util.Comparator.comparing;
+
 import com.google.gerrit.client.rpc.NativeMap;
 import com.google.gerrit.client.rpc.Natives;
 import com.google.gwt.core.client.JavaScriptObject;
@@ -21,8 +23,6 @@
 import com.google.gwt.core.client.JsArrayString;
 import com.google.gwt.resources.client.DataResource;
 import com.google.gwt.safehtml.shared.SafeUri;
-import java.util.Collections;
-import java.util.Comparator;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -242,14 +242,7 @@
         byMime.put(m.mode(), m);
       }
     }
-    Collections.sort(
-        Natives.asList(filtered),
-        new Comparator<ModeInfo>() {
-          @Override
-          public int compare(ModeInfo a, ModeInfo b) {
-            return a.name().toLowerCase().compareTo(b.name().toLowerCase());
-          }
-        });
+    Natives.asList(filtered).sort(comparing(m -> m.name().toLowerCase()));
     setAll(filtered);
   }
 
diff --git a/gerrit-httpd/BUILD b/gerrit-httpd/BUILD
deleted file mode 100644
index 15dd4c8..0000000
--- a/gerrit-httpd/BUILD
+++ /dev/null
@@ -1,81 +0,0 @@
-load("//tools/bzl:junit.bzl", "junit_tests")
-
-package(default_visibility = ["//visibility:public"])
-
-SRCS = glob(
-    ["src/main/java/**/*.java"],
-)
-
-RESOURCES = glob(["src/main/resources/**/*"])
-
-java_library(
-    name = "httpd",
-    srcs = SRCS,
-    resources = RESOURCES,
-    deps = [
-        "//gerrit-common:annotations",
-        "//gerrit-common:server",
-        "//gerrit-extension-api:api",
-        "//gerrit-gwtexpui:linker_server",
-        "//gerrit-gwtexpui:server",
-        "//gerrit-index:query_exception",
-        "//gerrit-launcher:launcher",
-        "//gerrit-patch-jgit:server",
-        "//gerrit-prettify:server",
-        "//gerrit-reviewdb:server",
-        "//gerrit-server:metrics",
-        "//gerrit-server:receive",
-        "//gerrit-server:server",
-        "//gerrit-util-cli:cli",
-        "//gerrit-util-http:http",
-        "//lib:args4j",
-        "//lib:gson",
-        "//lib:guava",
-        "//lib:gwtjsonrpc",
-        "//lib:gwtorm",
-        "//lib:jsch",
-        "//lib:mime-util",
-        "//lib:servlet-api-3_1",
-        "//lib:soy",
-        "//lib/auto:auto-value",
-        "//lib/auto:auto-value-annotations",
-        "//lib/commons:codec",
-        "//lib/commons:lang",
-        "//lib/guice",
-        "//lib/guice:guice-assistedinject",
-        "//lib/guice:guice-servlet",
-        "//lib/jgit/org.eclipse.jgit.http.server:jgit-servlet",
-        "//lib/jgit/org.eclipse.jgit:jgit",
-        "//lib/log:api",
-        "//lib/lucene:lucene-core-and-backward-codecs",
-    ],
-)
-
-junit_tests(
-    name = "httpd_tests",
-    srcs = glob(["src/test/java/**/*.java"]),
-    deps = [
-        ":httpd",
-        "//gerrit-common:annotations",
-        "//gerrit-common:server",
-        "//gerrit-extension-api:api",
-        "//gerrit-reviewdb:server",
-        "//gerrit-server:server",
-        "//gerrit-util-http:http",
-        "//gerrit-util-http:testutil",
-        "//lib:gson",
-        "//lib:guava",
-        "//lib:gwtorm",
-        "//lib:jimfs",
-        "//lib:junit",
-        "//lib:servlet-api-3_1-without-neverlink",
-        "//lib:soy",
-        "//lib:truth",
-        "//lib/easymock",
-        "//lib/guice",
-        "//lib/guice:guice-servlet",
-        "//lib/jgit/org.eclipse.jgit:jgit",
-        "//lib/jgit/org.eclipse.jgit.junit:junit",
-        "//lib/joda:joda-time",
-    ],
-)
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/AllRequestFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/AllRequestFilter.java
deleted file mode 100644
index b8b0bc8..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/AllRequestFilter.java
+++ /dev/null
@@ -1,174 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.httpd;
-
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.server.plugins.Plugin;
-import com.google.gerrit.server.plugins.StopPluginListener;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.google.inject.internal.UniqueAnnotations;
-import com.google.inject.servlet.ServletModule;
-import java.io.IOException;
-import java.util.Iterator;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-
-/** Filters all HTTP requests passing through the server. */
-public abstract class AllRequestFilter implements Filter {
-  public static ServletModule module() {
-    return new ServletModule() {
-      @Override
-      protected void configureServlets() {
-        DynamicSet.setOf(binder(), AllRequestFilter.class);
-        filter("/*").through(FilterProxy.class);
-
-        bind(StopPluginListener.class)
-            .annotatedWith(UniqueAnnotations.create())
-            .to(FilterProxy.class);
-      }
-    };
-  }
-
-  @Singleton
-  static class FilterProxy implements Filter, StopPluginListener {
-    private final DynamicSet<AllRequestFilter> filters;
-
-    private DynamicSet<AllRequestFilter> initializedFilters;
-    private FilterConfig filterConfig;
-
-    @Inject
-    FilterProxy(DynamicSet<AllRequestFilter> filters) {
-      this.filters = filters;
-      this.initializedFilters = new DynamicSet<>();
-      this.filterConfig = null;
-    }
-
-    /**
-     * Initializes a filter if needed
-     *
-     * @param filter The filter that should get initialized
-     * @return {@code true} iff filter is now initialized
-     * @throws ServletException if filter itself fails to init
-     */
-    private synchronized boolean initFilterIfNeeded(AllRequestFilter filter)
-        throws ServletException {
-      boolean ret = true;
-      if (filters.contains(filter)) {
-        // Regardless of whether or not the caller checked filter's
-        // containment in initializedFilters, we better re-check as we're now
-        // synchronized.
-        if (!initializedFilters.contains(filter)) {
-          filter.init(filterConfig);
-          initializedFilters.add(filter);
-        }
-      } else {
-        ret = false;
-      }
-      return ret;
-    }
-
-    private synchronized void cleanUpInitializedFilters() {
-      Iterable<AllRequestFilter> filtersToCleanUp = initializedFilters;
-      initializedFilters = new DynamicSet<>();
-      for (AllRequestFilter filter : filtersToCleanUp) {
-        if (filters.contains(filter)) {
-          initializedFilters.add(filter);
-        } else {
-          filter.destroy();
-        }
-      }
-    }
-
-    @Override
-    public void doFilter(ServletRequest req, ServletResponse res, FilterChain last)
-        throws IOException, ServletException {
-      final Iterator<AllRequestFilter> itr = filters.iterator();
-      new FilterChain() {
-        @Override
-        public void doFilter(ServletRequest req, ServletResponse res)
-            throws IOException, ServletException {
-          while (itr.hasNext()) {
-            AllRequestFilter filter = itr.next();
-            // To avoid {@code synchronized} on the whole filtering (and
-            // thereby killing concurrency), we start the below disjunction
-            // with an unsynchronized check for containment. This
-            // unsynchronized check is always correct if no filters got
-            // initialized/cleaned concurrently behind our back.
-            // The case of concurrently initialized filters is saved by the
-            // call to initFilterIfNeeded. So that's fine too.
-            // The case of concurrently cleaned filters between the {@code if}
-            // condition and the call to {@code doFilter} is not saved by
-            // anything. If a filter is getting removed concurrently while
-            // another thread is in those two lines, doFilter might (but need
-            // not) fail.
-            //
-            // Since this failure only occurs if a filter is deleted
-            // (e.g.: a plugin reloaded) exactly when a thread is in those
-            // two lines, and it only breaks a single request, we're ok with
-            // it, given that this is really both really improbable and also
-            // the "proper" fix for it would basically kill concurrency of
-            // webrequests.
-            if (initializedFilters.contains(filter) || initFilterIfNeeded(filter)) {
-              filter.doFilter(req, res, this);
-              return;
-            }
-          }
-          last.doFilter(req, res);
-        }
-      }.doFilter(req, res);
-    }
-
-    @Override
-    public void init(FilterConfig config) throws ServletException {
-      // Plugins that provide AllRequestFilters might get loaded later at
-      // runtime, long after this init method had been called. To allow to
-      // correctly init such plugins' AllRequestFilters, we keep the
-      // FilterConfig around, and reuse it to lazy init the AllRequestFilters.
-      filterConfig = config;
-
-      for (AllRequestFilter f : filters) {
-        initFilterIfNeeded(f);
-      }
-    }
-
-    @Override
-    public synchronized void destroy() {
-      Iterable<AllRequestFilter> filtersToDestroy = initializedFilters;
-      initializedFilters = new DynamicSet<>();
-      for (AllRequestFilter filter : filtersToDestroy) {
-        filter.destroy();
-      }
-    }
-
-    @Override
-    public void onStopPlugin(Plugin plugin) {
-      // In order to allow properly garbage collection, we need to scrub
-      // initializedFilters clean of filters stemming from plugins as they
-      // get unloaded.
-      cleanUpInitializedFilters();
-    }
-  }
-
-  @Override
-  public void init(FilterConfig config) throws ServletException {}
-
-  @Override
-  public void destroy() {}
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ContainerAuthFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ContainerAuthFilter.java
deleted file mode 100644
index 7d261c8..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ContainerAuthFilter.java
+++ /dev/null
@@ -1,132 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.httpd;
-
-import static com.google.common.base.MoreObjects.firstNonNull;
-import static com.google.common.base.Strings.emptyToNull;
-import static com.google.common.net.HttpHeaders.AUTHORIZATION;
-import static com.google.gerrit.extensions.api.lfs.LfsDefinitions.CONTENTTYPE_VND_GIT_LFS_JSON;
-import static com.google.gerrit.httpd.GerritAuthModule.NOT_AUTHORIZED_LFS_URL_REGEX;
-import static javax.servlet.http.HttpServletResponse.SC_FORBIDDEN;
-import static javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.httpd.restapi.RestApiServlet;
-import com.google.gerrit.server.AccessPath;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.config.AuthConfig;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.Locale;
-import java.util.regex.Pattern;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.eclipse.jgit.lib.Config;
-
-/**
- * Trust the authentication which is done by the container.
- *
- * <p>Check whether the container has already authenticated the user. If yes, then lookup the
- * account and set the account ID in our current session.
- *
- * <p>This filter should only be configured to run, when authentication is configured to trust
- * container authentication. This filter is intended to protect the {@link GitOverHttpServlet} and
- * its handled URLs, which provide remote repository access over HTTP. It also protects {@link
- * RestApiServlet}.
- */
-@Singleton
-class ContainerAuthFilter implements Filter {
-  private static final String LFS_AUTH_PREFIX = "Ssh: ";
-  private static final Pattern LFS_ENDPOINT = Pattern.compile(NOT_AUTHORIZED_LFS_URL_REGEX);
-
-  private final DynamicItem<WebSession> session;
-  private final AccountCache accountCache;
-  private final Config config;
-  private final String loginHttpHeader;
-
-  @Inject
-  ContainerAuthFilter(
-      DynamicItem<WebSession> session,
-      AccountCache accountCache,
-      AuthConfig authConfig,
-      @GerritServerConfig Config config) {
-    this.session = session;
-    this.accountCache = accountCache;
-    this.config = config;
-
-    loginHttpHeader = firstNonNull(emptyToNull(authConfig.getLoginHttpHeader()), AUTHORIZATION);
-  }
-
-  @Override
-  public void init(FilterConfig config) {}
-
-  @Override
-  public void destroy() {}
-
-  @Override
-  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
-      throws IOException, ServletException {
-    HttpServletRequest req = (HttpServletRequest) request;
-    HttpServletResponse rsp = (HttpServletResponse) response;
-
-    if (verify(req, rsp)) {
-      chain.doFilter(req, response);
-    }
-  }
-
-  private boolean verify(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
-    String username = RemoteUserUtil.getRemoteUser(req, loginHttpHeader);
-    if (username == null) {
-      if (isLfsOverSshRequest(req)) {
-        // LFS-over-SSH auth request cannot be authorized by container
-        // therefore let it go through the filter
-        return true;
-      }
-      rsp.sendError(SC_FORBIDDEN);
-      return false;
-    }
-    if (config.getBoolean("auth", "userNameToLowerCase", false)) {
-      username = username.toLowerCase(Locale.US);
-    }
-    final AccountState who = accountCache.getByUsername(username);
-    if (who == null || !who.getAccount().isActive()) {
-      rsp.sendError(SC_UNAUTHORIZED);
-      return false;
-    }
-    WebSession ws = session.get();
-    ws.setUserAccountId(who.getAccount().getId());
-    ws.setAccessPathOk(AccessPath.GIT, true);
-    ws.setAccessPathOk(AccessPath.REST_API, true);
-    return true;
-  }
-
-  private static boolean isLfsOverSshRequest(HttpServletRequest req) {
-    String hdr = req.getHeader(AUTHORIZATION);
-    return CONTENTTYPE_VND_GIT_LFS_JSON.equals(req.getContentType())
-        && !Strings.isNullOrEmpty(hdr)
-        && hdr.startsWith(LFS_AUTH_PREFIX)
-        && LFS_ENDPOINT.matcher(req.getRequestURI()).matches();
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/DirectChangeByCommit.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/DirectChangeByCommit.java
deleted file mode 100644
index 26e4198..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/DirectChangeByCommit.java
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2011 Google Inc. All Rights Reserved.
-
-package com.google.gerrit.httpd;
-
-import com.google.common.base.CharMatcher;
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.common.PageLinks;
-import com.google.gerrit.extensions.api.changes.Changes;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.List;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-class DirectChangeByCommit extends HttpServlet {
-  private static final long serialVersionUID = 1L;
-  private static final Logger log = LoggerFactory.getLogger(DirectChangeByCommit.class);
-
-  private final Changes changes;
-
-  @Inject
-  DirectChangeByCommit(Changes changes) {
-    this.changes = changes;
-  }
-
-  @Override
-  protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
-    String query = CharMatcher.is('/').trimTrailingFrom(req.getPathInfo());
-    List<ChangeInfo> results;
-    try {
-      results = changes.query(query).withLimit(2).get();
-    } catch (RestApiException e) {
-      log.warn("Cannot process query by URL: /r/" + query, e);
-      results = ImmutableList.of();
-    }
-    String token;
-    if (results.size() == 1) {
-      // If exactly one change matches, link to that change.
-      // TODO Link to a specific patch set, if one matched.
-      ChangeInfo ci = results.iterator().next();
-      token = PageLinks.toChange(new Project.NameKey(ci.project), new Change.Id(ci._number));
-    } else {
-      // Otherwise, link to the query page.
-      token = PageLinks.toChangeQuery(query);
-    }
-    UrlModule.toGerrit(token, req, rsp);
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GetUserFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GetUserFilter.java
deleted file mode 100644
index 103daba..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GetUserFilter.java
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.httpd;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import com.google.inject.servlet.ServletModule;
-import java.io.IOException;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletResponse;
-import org.eclipse.jgit.lib.Config;
-
-/**
- * Stores user as a request attribute and/or response header, so servlets and reverse proxies can
- * access it outside of the request/response scope.
- */
-@Singleton
-public class GetUserFilter implements Filter {
-
-  public static final String USER_ATTR_KEY = "User";
-
-  public static class Module extends ServletModule {
-
-    private final boolean reqEnabled;
-    private final boolean resEnabled;
-
-    @Inject
-    Module(@GerritServerConfig Config cfg) {
-      reqEnabled = cfg.getBoolean("http", "addUserAsRequestAttribute", true);
-      resEnabled = cfg.getBoolean("http", "addUserAsResponseHeader", false);
-    }
-
-    @Override
-    protected void configureServlets() {
-      if (resEnabled || reqEnabled) {
-        ImmutableMap.Builder<String, String> initParams = ImmutableMap.builder();
-        if (reqEnabled) {
-          initParams.put("reqEnabled", "");
-        }
-        if (resEnabled) {
-          initParams.put("resEnabled", "");
-        }
-        filter("/*").through(GetUserFilter.class, initParams.build());
-      }
-    }
-  }
-
-  private final Provider<CurrentUser> userProvider;
-
-  private boolean reqEnabled;
-  private boolean resEnabled;
-
-  @Inject
-  GetUserFilter(Provider<CurrentUser> userProvider) {
-    this.userProvider = userProvider;
-  }
-
-  @Override
-  public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
-      throws IOException, ServletException {
-    CurrentUser user = userProvider.get();
-    if (user != null && user.isIdentifiedUser()) {
-
-      IdentifiedUser who = user.asIdentifiedUser();
-      String loggableName;
-      if (who.getUserName() != null && !who.getUserName().isEmpty()) {
-        loggableName = who.getUserName();
-      } else {
-        loggableName = "a/" + who.getAccountId();
-      }
-      if (reqEnabled) {
-        req.setAttribute(USER_ATTR_KEY, loggableName);
-      }
-      if (resEnabled && resp instanceof HttpServletResponse) {
-        ((HttpServletResponse) resp).addHeader(USER_ATTR_KEY, loggableName);
-      }
-    }
-    chain.doFilter(req, resp);
-  }
-
-  @Override
-  public void destroy() {}
-
-  @Override
-  public void init(FilterConfig arg0) {
-    reqEnabled = arg0.getInitParameter("reqEnabled") != null ? true : false;
-    resEnabled = arg0.getInitParameter("resEnabled") != null ? true : false;
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitOverHttpServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitOverHttpServlet.java
deleted file mode 100644
index 0da2f92..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitOverHttpServlet.java
+++ /dev/null
@@ -1,486 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.httpd;
-
-import com.google.common.cache.Cache;
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.ImmutableSetMultimap;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.Lists;
-import com.google.gerrit.audit.AuditService;
-import com.google.gerrit.audit.HttpAuditEvent;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.common.data.Capable;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.AccessPath;
-import com.google.gerrit.server.AnonymousUser;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.cache.CacheModule;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.TransferConfig;
-import com.google.gerrit.server.git.UploadPackInitializer;
-import com.google.gerrit.server.git.VisibleRefFilter;
-import com.google.gerrit.server.git.receive.AsyncReceiveCommits;
-import com.google.gerrit.server.git.validators.UploadValidators;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.ProjectPermission;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.inject.AbstractModule;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import com.google.inject.TypeLiteral;
-import com.google.inject.name.Named;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.http.server.GitServlet;
-import org.eclipse.jgit.http.server.GitSmartHttpTools;
-import org.eclipse.jgit.http.server.ServletUtils;
-import org.eclipse.jgit.http.server.resolver.AsIsFileService;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.transport.PostUploadHook;
-import org.eclipse.jgit.transport.PostUploadHookChain;
-import org.eclipse.jgit.transport.PreUploadHook;
-import org.eclipse.jgit.transport.PreUploadHookChain;
-import org.eclipse.jgit.transport.ReceivePack;
-import org.eclipse.jgit.transport.ServiceMayNotContinueException;
-import org.eclipse.jgit.transport.UploadPack;
-import org.eclipse.jgit.transport.resolver.ReceivePackFactory;
-import org.eclipse.jgit.transport.resolver.RepositoryResolver;
-import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException;
-import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
-import org.eclipse.jgit.transport.resolver.UploadPackFactory;
-
-/** Serves Git repositories over HTTP. */
-@Singleton
-public class GitOverHttpServlet extends GitServlet {
-  private static final long serialVersionUID = 1L;
-
-  private static final String ATT_CONTROL = ProjectControl.class.getName();
-  private static final String ATT_ARC = AsyncReceiveCommits.class.getName();
-  private static final String ID_CACHE = "adv_bases";
-
-  public static final String URL_REGEX;
-
-  static {
-    StringBuilder url = new StringBuilder();
-    url.append("^(?:/a)?(?:/p/|/)(.*/(?:info/refs");
-    for (String name : GitSmartHttpTools.VALID_SERVICES) {
-      url.append('|').append(name);
-    }
-    url.append("))$");
-    URL_REGEX = url.toString();
-  }
-
-  static class Module extends AbstractModule {
-
-    private final boolean enableReceive;
-
-    Module(boolean enableReceive) {
-      this.enableReceive = enableReceive;
-    }
-
-    @Override
-    protected void configure() {
-      bind(Resolver.class);
-      bind(UploadFactory.class);
-      bind(UploadFilter.class);
-      bind(new TypeLiteral<ReceivePackFactory<HttpServletRequest>>() {})
-          .to(enableReceive ? ReceiveFactory.class : DisabledReceiveFactory.class);
-      bind(ReceiveFilter.class);
-      install(
-          new CacheModule() {
-            @Override
-            protected void configure() {
-              cache(ID_CACHE, AdvertisedObjectsCacheKey.class, new TypeLiteral<Set<ObjectId>>() {})
-                  .maximumWeight(4096)
-                  .expireAfterWrite(10, TimeUnit.MINUTES);
-            }
-          });
-    }
-  }
-
-  @Inject
-  GitOverHttpServlet(
-      Resolver resolver,
-      UploadFactory upload,
-      UploadFilter uploadFilter,
-      ReceivePackFactory<HttpServletRequest> receive,
-      ReceiveFilter receiveFilter) {
-    setRepositoryResolver(resolver);
-    setAsIsFileService(AsIsFileService.DISABLED);
-
-    setUploadPackFactory(upload);
-    addUploadPackFilter(uploadFilter);
-
-    setReceivePackFactory(receive);
-    addReceivePackFilter(receiveFilter);
-  }
-
-  private static String extractWhat(HttpServletRequest request) {
-    StringBuilder commandName = new StringBuilder(request.getRequestURL());
-    if (request.getQueryString() != null) {
-      commandName.append("?").append(request.getQueryString());
-    }
-    return commandName.toString();
-  }
-
-  private static ListMultimap<String, String> extractParameters(HttpServletRequest request) {
-
-    ListMultimap<String, String> multiMap = ArrayListMultimap.create();
-    if (request.getQueryString() != null) {
-      request
-          .getParameterMap()
-          .forEach(
-              (k, v) -> {
-                for (int i = 0; i < v.length; i++) {
-                  multiMap.put(k, v[i]);
-                }
-              });
-    }
-    return multiMap;
-  }
-
-  static class Resolver implements RepositoryResolver<HttpServletRequest> {
-    private final GitRepositoryManager manager;
-    private final PermissionBackend permissionBackend;
-    private final Provider<CurrentUser> userProvider;
-    private final ProjectControl.GenericFactory projectControlFactory;
-
-    @Inject
-    Resolver(
-        GitRepositoryManager manager,
-        PermissionBackend permissionBackend,
-        Provider<CurrentUser> userProvider,
-        ProjectControl.GenericFactory projectControlFactory) {
-      this.manager = manager;
-      this.permissionBackend = permissionBackend;
-      this.userProvider = userProvider;
-      this.projectControlFactory = projectControlFactory;
-    }
-
-    @Override
-    public Repository open(HttpServletRequest req, String projectName)
-        throws RepositoryNotFoundException, ServiceNotAuthorizedException,
-            ServiceNotEnabledException, ServiceMayNotContinueException {
-      while (projectName.endsWith("/")) {
-        projectName = projectName.substring(0, projectName.length() - 1);
-      }
-
-      if (projectName.endsWith(".git")) {
-        // Be nice and drop the trailing ".git" suffix, which we never keep
-        // in our database, but clients might mistakenly provide anyway.
-        //
-        projectName = projectName.substring(0, projectName.length() - 4);
-        while (projectName.endsWith("/")) {
-          projectName = projectName.substring(0, projectName.length() - 1);
-        }
-      }
-
-      CurrentUser user = userProvider.get();
-      user.setAccessPath(AccessPath.GIT);
-
-      try {
-        Project.NameKey nameKey = new Project.NameKey(projectName);
-        ProjectControl pc;
-        try {
-          pc = projectControlFactory.controlFor(nameKey, user);
-        } catch (NoSuchProjectException err) {
-          throw new RepositoryNotFoundException(projectName);
-        }
-        req.setAttribute(ATT_CONTROL, pc);
-
-        try {
-          permissionBackend.user(user).project(nameKey).check(ProjectPermission.ACCESS);
-        } catch (AuthException e) {
-          if (user instanceof AnonymousUser) {
-            throw new ServiceNotAuthorizedException();
-          }
-          throw new ServiceNotEnabledException(e.getMessage());
-        }
-
-        return manager.openRepository(nameKey);
-      } catch (IOException | PermissionBackendException err) {
-        throw new ServiceMayNotContinueException(projectName + " unavailable", err);
-      }
-    }
-  }
-
-  static class UploadFactory implements UploadPackFactory<HttpServletRequest> {
-    private final TransferConfig config;
-    private final DynamicSet<PreUploadHook> preUploadHooks;
-    private final DynamicSet<PostUploadHook> postUploadHooks;
-    private final DynamicSet<UploadPackInitializer> uploadPackInitializers;
-
-    @Inject
-    UploadFactory(
-        TransferConfig tc,
-        DynamicSet<PreUploadHook> preUploadHooks,
-        DynamicSet<PostUploadHook> postUploadHooks,
-        DynamicSet<UploadPackInitializer> uploadPackInitializers) {
-      this.config = tc;
-      this.preUploadHooks = preUploadHooks;
-      this.postUploadHooks = postUploadHooks;
-      this.uploadPackInitializers = uploadPackInitializers;
-    }
-
-    @Override
-    public UploadPack create(HttpServletRequest req, Repository repo) {
-      UploadPack up = new UploadPack(repo);
-      up.setPackConfig(config.getPackConfig());
-      up.setTimeout(config.getTimeout());
-      up.setPreUploadHook(PreUploadHookChain.newChain(Lists.newArrayList(preUploadHooks)));
-      up.setPostUploadHook(PostUploadHookChain.newChain(Lists.newArrayList(postUploadHooks)));
-      ProjectControl pc = (ProjectControl) req.getAttribute(ATT_CONTROL);
-      for (UploadPackInitializer initializer : uploadPackInitializers) {
-        initializer.init(pc.getProject().getNameKey(), up);
-      }
-      return up;
-    }
-  }
-
-  static class UploadFilter implements Filter {
-    private final VisibleRefFilter.Factory refFilterFactory;
-    private final UploadValidators.Factory uploadValidatorsFactory;
-    private final PermissionBackend permissionBackend;
-    private final Provider<CurrentUser> userProvider;
-    private final AuditService auditService;
-
-    @Inject
-    UploadFilter(
-        VisibleRefFilter.Factory refFilterFactory,
-        UploadValidators.Factory uploadValidatorsFactory,
-        PermissionBackend permissionBackend,
-        Provider<CurrentUser> userProvider,
-        AuditService auditService) {
-      this.refFilterFactory = refFilterFactory;
-      this.uploadValidatorsFactory = uploadValidatorsFactory;
-      this.permissionBackend = permissionBackend;
-      this.userProvider = userProvider;
-      this.auditService = auditService;
-    }
-
-    @Override
-    public void doFilter(ServletRequest request, ServletResponse response, FilterChain next)
-        throws IOException, ServletException {
-      // The Resolver above already checked READ access for us.
-      Repository repo = ServletUtils.getRepository(request);
-      ProjectControl pc = (ProjectControl) request.getAttribute(ATT_CONTROL);
-      UploadPack up = (UploadPack) request.getAttribute(ServletUtils.ATTRIBUTE_HANDLER);
-
-      try {
-        permissionBackend
-            .user(pc.getUser())
-            .project(pc.getProject().getNameKey())
-            .check(ProjectPermission.RUN_UPLOAD_PACK);
-      } catch (AuthException e) {
-        GitSmartHttpTools.sendError(
-            (HttpServletRequest) request,
-            (HttpServletResponse) response,
-            HttpServletResponse.SC_FORBIDDEN,
-            "upload-pack not permitted on this server");
-        return;
-      } catch (PermissionBackendException e) {
-        throw new ServletException(e);
-      } finally {
-        HttpServletRequest httpRequest = (HttpServletRequest) request;
-        HttpServletResponse httpResponse = (HttpServletResponse) response;
-        auditService.dispatch(
-            new HttpAuditEvent(
-                httpRequest.getSession().getId(),
-                userProvider.get(),
-                extractWhat(httpRequest),
-                TimeUtil.nowMs(),
-                extractParameters(httpRequest),
-                httpRequest.getMethod(),
-                httpRequest,
-                httpResponse.getStatus(),
-                httpResponse));
-      }
-
-      // We use getRemoteHost() here instead of getRemoteAddr() because REMOTE_ADDR
-      // may have been overridden by a proxy server -- we'll try to avoid this.
-      UploadValidators uploadValidators =
-          uploadValidatorsFactory.create(pc.getProject(), repo, request.getRemoteHost());
-      up.setPreUploadHook(
-          PreUploadHookChain.newChain(Lists.newArrayList(up.getPreUploadHook(), uploadValidators)));
-      up.setAdvertiseRefsHook(refFilterFactory.create(pc.getProjectState(), repo));
-
-      next.doFilter(request, response);
-    }
-
-    @Override
-    public void init(FilterConfig config) {}
-
-    @Override
-    public void destroy() {}
-  }
-
-  static class ReceiveFactory implements ReceivePackFactory<HttpServletRequest> {
-    private final AsyncReceiveCommits.Factory factory;
-
-    @Inject
-    ReceiveFactory(AsyncReceiveCommits.Factory factory) {
-      this.factory = factory;
-    }
-
-    @Override
-    public ReceivePack create(HttpServletRequest req, Repository db)
-        throws ServiceNotAuthorizedException {
-      final ProjectControl pc = (ProjectControl) req.getAttribute(ATT_CONTROL);
-
-      if (!(pc.getUser().isIdentifiedUser())) {
-        // Anonymous users are not permitted to push.
-        throw new ServiceNotAuthorizedException();
-      }
-
-      AsyncReceiveCommits arc = factory.create(pc, db, null, ImmutableSetMultimap.of());
-      ReceivePack rp = arc.getReceivePack();
-      req.setAttribute(ATT_ARC, arc);
-      return rp;
-    }
-  }
-
-  static class DisabledReceiveFactory implements ReceivePackFactory<HttpServletRequest> {
-    @Override
-    public ReceivePack create(HttpServletRequest req, Repository db)
-        throws ServiceNotEnabledException {
-      throw new ServiceNotEnabledException();
-    }
-  }
-
-  static class ReceiveFilter implements Filter {
-    private final Cache<AdvertisedObjectsCacheKey, Set<ObjectId>> cache;
-    private final PermissionBackend permissionBackend;
-    private final Provider<CurrentUser> userProvider;
-    private final AuditService auditService;
-
-    @Inject
-    ReceiveFilter(
-        @Named(ID_CACHE) Cache<AdvertisedObjectsCacheKey, Set<ObjectId>> cache,
-        PermissionBackend permissionBackend,
-        Provider<CurrentUser> userProvider,
-        AuditService auditService) {
-      this.cache = cache;
-      this.permissionBackend = permissionBackend;
-      this.userProvider = userProvider;
-      this.auditService = auditService;
-    }
-
-    @Override
-    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
-        throws IOException, ServletException {
-      boolean isGet = "GET".equalsIgnoreCase(((HttpServletRequest) request).getMethod());
-
-      AsyncReceiveCommits arc = (AsyncReceiveCommits) request.getAttribute(ATT_ARC);
-      ReceivePack rp = arc.getReceivePack();
-      rp.getAdvertiseRefsHook().advertiseRefs(rp);
-      ProjectControl pc = (ProjectControl) request.getAttribute(ATT_CONTROL);
-      Project.NameKey projectName = pc.getProject().getNameKey();
-
-      try {
-        permissionBackend
-            .user(pc.getUser())
-            .project(pc.getProject().getNameKey())
-            .check(ProjectPermission.RUN_RECEIVE_PACK);
-      } catch (AuthException e) {
-        GitSmartHttpTools.sendError(
-            (HttpServletRequest) request,
-            (HttpServletResponse) response,
-            HttpServletResponse.SC_FORBIDDEN,
-            "receive-pack not permitted on this server");
-        return;
-      } catch (PermissionBackendException e) {
-        throw new RuntimeException(e);
-      } finally {
-        HttpServletRequest httpRequest = (HttpServletRequest) request;
-        HttpServletResponse httpResponse = (HttpServletResponse) response;
-        auditService.dispatch(
-            new HttpAuditEvent(
-                httpRequest.getSession().getId(),
-                userProvider.get(),
-                extractWhat(httpRequest),
-                TimeUtil.nowMs(),
-                extractParameters(httpRequest),
-                httpRequest.getMethod(),
-                httpRequest,
-                httpResponse.getStatus(),
-                httpResponse));
-      }
-
-      Capable s = arc.canUpload();
-      if (s != Capable.OK) {
-        GitSmartHttpTools.sendError(
-            (HttpServletRequest) request,
-            (HttpServletResponse) response,
-            HttpServletResponse.SC_FORBIDDEN,
-            "\n" + s.getMessage());
-        return;
-      }
-
-      if (!rp.isCheckReferencedObjectsAreReachable()) {
-        chain.doFilter(request, response);
-        return;
-      }
-
-      if (!(pc.getUser().isIdentifiedUser())) {
-        chain.doFilter(request, response);
-        return;
-      }
-
-      AdvertisedObjectsCacheKey cacheKey =
-          AdvertisedObjectsCacheKey.create(pc.getUser().getAccountId(), projectName);
-
-      if (isGet) {
-        cache.invalidate(cacheKey);
-      } else {
-        Set<ObjectId> ids = cache.getIfPresent(cacheKey);
-        if (ids != null) {
-          rp.getAdvertisedObjects().addAll(ids);
-          cache.invalidate(cacheKey);
-        }
-      }
-
-      chain.doFilter(request, response);
-
-      if (isGet) {
-        cache.put(cacheKey, Collections.unmodifiableSet(new HashSet<>(rp.getAdvertisedObjects())));
-      }
-    }
-
-    @Override
-    public void init(FilterConfig arg0) {}
-
-    @Override
-    public void destroy() {}
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/H2CacheBasedWebSession.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/H2CacheBasedWebSession.java
deleted file mode 100644
index c466290..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/H2CacheBasedWebSession.java
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.httpd;
-
-import static java.util.concurrent.TimeUnit.MINUTES;
-
-import com.google.common.cache.Cache;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.httpd.WebSessionManager.Val;
-import com.google.gerrit.server.AnonymousUser;
-import com.google.gerrit.server.IdentifiedUser.RequestFactory;
-import com.google.gerrit.server.cache.CacheModule;
-import com.google.gerrit.server.config.AuthConfig;
-import com.google.inject.Inject;
-import com.google.inject.Module;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.FactoryModuleBuilder;
-import com.google.inject.name.Named;
-import com.google.inject.servlet.RequestScoped;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-@RequestScoped
-public class H2CacheBasedWebSession extends CacheBasedWebSession {
-  public static Module module() {
-    return new CacheModule() {
-      @Override
-      protected void configure() {
-        persist(WebSessionManager.CACHE_NAME, String.class, Val.class)
-            .maximumWeight(1024) // reasonable default for many sites
-            .expireAfterWrite(
-                CacheBasedWebSession.MAX_AGE_MINUTES,
-                MINUTES) // expire sessions if they are inactive
-        ;
-        install(new FactoryModuleBuilder().build(WebSessionManagerFactory.class));
-        DynamicItem.itemOf(binder(), WebSession.class);
-        DynamicItem.bind(binder(), WebSession.class)
-            .to(H2CacheBasedWebSession.class)
-            .in(RequestScoped.class);
-      }
-    };
-  }
-
-  @Inject
-  H2CacheBasedWebSession(
-      HttpServletRequest request,
-      @Nullable HttpServletResponse response,
-      WebSessionManagerFactory managerFactory,
-      @Named(WebSessionManager.CACHE_NAME) Cache<String, Val> cache,
-      AuthConfig authConfig,
-      Provider<AnonymousUser> anonymousProvider,
-      RequestFactory identified) {
-    super(
-        request, response, managerFactory.create(cache), authConfig, anonymousProvider, identified);
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HtmlDomUtil.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HtmlDomUtil.java
deleted file mode 100644
index 9acc754..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HtmlDomUtil.java
+++ /dev/null
@@ -1,220 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.httpd;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.io.ByteStreams;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.StringWriter;
-import java.nio.charset.Charset;
-import java.nio.file.Files;
-import java.nio.file.NoSuchFileException;
-import java.nio.file.Path;
-import java.util.zip.GZIPOutputStream;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpression;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-/** Utility functions to deal with HTML using W3C DOM operations. */
-public class HtmlDomUtil {
-  /** Standard character encoding we prefer (UTF-8). */
-  public static final Charset ENC = UTF_8;
-
-  /** DOCTYPE for a standards mode HTML document. */
-  public static final String HTML_STRICT =
-      "-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd";
-
-  /** Convert a document to a UTF-8 byte sequence. */
-  public static byte[] toUTF8(Document hostDoc) throws IOException {
-    return toString(hostDoc).getBytes(ENC);
-  }
-
-  /** Compress the document. */
-  public static byte[] compress(byte[] raw) throws IOException {
-    ByteArrayOutputStream out = new ByteArrayOutputStream();
-    GZIPOutputStream gz = new GZIPOutputStream(out);
-    gz.write(raw);
-    gz.finish();
-    gz.flush();
-    return out.toByteArray();
-  }
-
-  /** Convert a document to a String, assuming later encoding to UTF-8. */
-  public static String toString(Document hostDoc) throws IOException {
-    try {
-      StringWriter out = new StringWriter();
-      DOMSource domSource = new DOMSource(hostDoc);
-      StreamResult streamResult = new StreamResult(out);
-      TransformerFactory tf = TransformerFactory.newInstance();
-      Transformer serializer = tf.newTransformer();
-      serializer.setOutputProperty(OutputKeys.ENCODING, ENC.name());
-      serializer.setOutputProperty(OutputKeys.METHOD, "html");
-      serializer.setOutputProperty(OutputKeys.INDENT, "no");
-      serializer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, HtmlDomUtil.HTML_STRICT);
-      serializer.transform(domSource, streamResult);
-      return out.toString();
-    } catch (TransformerException e) {
-      IOException r = new IOException("Error transforming page");
-      r.initCause(e);
-      throw r;
-    }
-  }
-
-  /** Find an element by its "id" attribute; null if no element is found. */
-  public static Element find(Node parent, String name) {
-    NodeList list = parent.getChildNodes();
-    for (int i = 0; i < list.getLength(); i++) {
-      Node n = list.item(i);
-      if (n instanceof Element) {
-        Element e = (Element) n;
-        if (name.equals(e.getAttribute("id"))) {
-          return e;
-        }
-      }
-      Element r = find(n, name);
-      if (r != null) {
-        return r;
-      }
-    }
-    return null;
-  }
-
-  /** Append an HTML &lt;input type="hidden"&gt; to the form. */
-  public static void addHidden(Element form, String name, String value) {
-    Element in = form.getOwnerDocument().createElement("input");
-    in.setAttribute("type", "hidden");
-    in.setAttribute("name", name);
-    in.setAttribute("value", value);
-    form.appendChild(in);
-  }
-
-  /** Construct a new empty document. */
-  public static Document newDocument() {
-    try {
-      return newBuilder().newDocument();
-    } catch (ParserConfigurationException e) {
-      throw new RuntimeException("Cannot create new document", e);
-    }
-  }
-
-  /** Clone a document so it can be safely modified on a per-request basis. */
-  public static Document clone(Document doc) throws IOException {
-    Document d;
-    try {
-      d = newBuilder().newDocument();
-    } catch (ParserConfigurationException e) {
-      throw new IOException("Cannot clone document");
-    }
-    Node n = d.importNode(doc.getDocumentElement(), true);
-    d.appendChild(n);
-    return d;
-  }
-
-  /** Parse an XHTML file from our CLASSPATH and return the instance. */
-  public static Document parseFile(Class<?> context, String name) throws IOException {
-    try (InputStream in = context.getResourceAsStream(name)) {
-      if (in == null) {
-        return null;
-      }
-      Document doc = newBuilder().parse(in);
-      compact(doc);
-      return doc;
-    } catch (SAXException | ParserConfigurationException | IOException e) {
-      throw new IOException("Error reading " + name, e);
-    }
-  }
-
-  private static void compact(Document doc) {
-    try {
-      String expr = "//text()[normalize-space(.) = '']";
-      XPathFactory xp = XPathFactory.newInstance();
-      XPathExpression e = xp.newXPath().compile(expr);
-      NodeList empty = (NodeList) e.evaluate(doc, XPathConstants.NODESET);
-      for (int i = 0; i < empty.getLength(); i++) {
-        Node node = empty.item(i);
-        node.getParentNode().removeChild(node);
-      }
-    } catch (XPathExpressionException e) {
-      // Don't do the whitespace removal.
-    }
-  }
-
-  /** Read a Read a UTF-8 text file from our CLASSPATH and return it. */
-  public static String readFile(Class<?> context, String name) throws IOException {
-    try (InputStream in = context.getResourceAsStream(name)) {
-      if (in == null) {
-        return null;
-      }
-      return new String(ByteStreams.toByteArray(in), ENC);
-    } catch (IOException e) {
-      throw new IOException("Error reading " + name, e);
-    }
-  }
-
-  /** Parse an XHTML file from the local drive and return the instance. */
-  public static Document parseFile(Path path) throws IOException {
-    try (InputStream in = Files.newInputStream(path)) {
-      Document doc = newBuilder().parse(in);
-      compact(doc);
-      return doc;
-    } catch (NoSuchFileException e) {
-      return null;
-    } catch (SAXException | ParserConfigurationException | IOException e) {
-      throw new IOException("Error reading " + path, e);
-    }
-  }
-
-  /** Read a UTF-8 text file from the local drive. */
-  public static String readFile(Path parentDir, String name) throws IOException {
-    if (parentDir == null) {
-      return null;
-    }
-    Path path = parentDir.resolve(name);
-    try (InputStream in = Files.newInputStream(path)) {
-      return new String(ByteStreams.toByteArray(in), ENC);
-    } catch (NoSuchFileException e) {
-      return null;
-    } catch (IOException e) {
-      throw new IOException("Error reading " + path, e);
-    }
-  }
-
-  private static DocumentBuilder newBuilder() throws ParserConfigurationException {
-    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-    factory.setValidating(false);
-    factory.setExpandEntityReferences(false);
-    factory.setIgnoringComments(true);
-    factory.setCoalescing(true);
-    return factory.newDocumentBuilder();
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpCanonicalWebUrlProvider.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpCanonicalWebUrlProvider.java
deleted file mode 100644
index 3dd31d9..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpCanonicalWebUrlProvider.java
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.httpd;
-
-import com.google.gerrit.server.config.CanonicalWebUrlProvider;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.inject.Inject;
-import com.google.inject.OutOfScopeException;
-import com.google.inject.Provider;
-import com.google.inject.ProvisionException;
-import javax.servlet.http.HttpServletRequest;
-import org.eclipse.jgit.lib.Config;
-
-/** Sets {@code CanonicalWebUrl} to current HTTP request if not configured. */
-public class HttpCanonicalWebUrlProvider extends CanonicalWebUrlProvider {
-  private Provider<HttpServletRequest> requestProvider;
-
-  @Inject
-  HttpCanonicalWebUrlProvider(@GerritServerConfig Config config) {
-    super(config);
-  }
-
-  @Inject(optional = true)
-  public void setHttpServletRequest(Provider<HttpServletRequest> hsr) {
-    requestProvider = hsr;
-  }
-
-  @Override
-  public String get() {
-    String canonicalUrl = super.get();
-    if (canonicalUrl != null) {
-      return canonicalUrl;
-    }
-
-    if (requestProvider != null) {
-      // No canonical URL configured? Maybe we can get a reasonable
-      // guess from the incoming HTTP request, if we are currently
-      // inside of an HTTP request scope.
-      //
-      final HttpServletRequest req;
-      try {
-        req = requestProvider.get();
-      } catch (ProvisionException noWeb) {
-        if (noWeb.getCause() instanceof OutOfScopeException) {
-          // We can't obtain the request as we are not inside of
-          // an HTTP request scope. Callers must handle null.
-          //
-          return null;
-        }
-        throw noWeb;
-      }
-      return CanonicalWebUrl.computeFromRequest(req);
-    }
-
-    // We have no way of guessing our HTTP url.
-    //
-    return null;
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpLogoutServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpLogoutServlet.java
deleted file mode 100644
index eb77a30..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpLogoutServlet.java
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.httpd;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.audit.AuditEvent;
-import com.google.gerrit.audit.AuditService;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.config.AuthConfig;
-import com.google.gerrit.server.config.CanonicalWebUrl;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-@Singleton
-public class HttpLogoutServlet extends HttpServlet {
-  private static final long serialVersionUID = 1L;
-
-  private final DynamicItem<WebSession> webSession;
-  private final Provider<String> urlProvider;
-  private final String logoutUrl;
-  private final AuditService audit;
-
-  @Inject
-  protected HttpLogoutServlet(
-      AuthConfig authConfig,
-      DynamicItem<WebSession> webSession,
-      @CanonicalWebUrl @Nullable Provider<String> urlProvider,
-      AuditService audit) {
-    this.webSession = webSession;
-    this.urlProvider = urlProvider;
-    this.logoutUrl = authConfig.getLogoutURL();
-    this.audit = audit;
-  }
-
-  protected void doLogout(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
-    webSession.get().logout();
-    if (logoutUrl != null) {
-      rsp.sendRedirect(logoutUrl);
-    } else {
-      String url = urlProvider.get();
-      if (Strings.isNullOrEmpty(url)) {
-        url = req.getContextPath();
-      }
-      if (Strings.isNullOrEmpty(url)) {
-        url = "/";
-      }
-      if (!url.endsWith("/")) {
-        url += "/";
-      }
-      rsp.sendRedirect(url);
-    }
-  }
-
-  @Override
-  protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
-
-    final String sid = webSession.get().getSessionId();
-    final CurrentUser currentUser = webSession.get().getUser();
-    final String what = "sign out";
-    final long when = TimeUtil.nowMs();
-
-    try {
-      doLogout(req, rsp);
-    } finally {
-      audit.dispatch(new AuditEvent(sid, currentUser, what, when, null, null));
-    }
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpServletResponseRecorder.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpServletResponseRecorder.java
deleted file mode 100644
index 3a43e24..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpServletResponseRecorder.java
+++ /dev/null
@@ -1,90 +0,0 @@
-// 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.
-
-package com.google.gerrit.httpd;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpServletResponseWrapper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * HttpServletResponse wrapper to allow response status code override.
- *
- * <p>Differently from the normal HttpServletResponse, this class allows multiple filters to
- * override the response http status code.
- */
-public class HttpServletResponseRecorder extends HttpServletResponseWrapper {
-  private static final Logger log = LoggerFactory.getLogger(HttpServletResponseWrapper.class);
-  private static final String LOCATION_HEADER = "Location";
-
-  private int status;
-  private String statusMsg = "";
-  private Map<String, String> headers = new HashMap<>();
-
-  /**
-   * Constructs a response recorder wrapping the given response.
-   *
-   * @param response the response to be wrapped
-   */
-  public HttpServletResponseRecorder(HttpServletResponse response) {
-    super(response);
-  }
-
-  @Override
-  public void sendError(int sc) throws IOException {
-    this.status = sc;
-  }
-
-  @Override
-  public void sendError(int sc, String msg) throws IOException {
-    this.status = sc;
-    this.statusMsg = msg;
-  }
-
-  @Override
-  public void sendRedirect(String location) throws IOException {
-    this.status = SC_MOVED_TEMPORARILY;
-    setHeader(LOCATION_HEADER, location);
-  }
-
-  @Override
-  public void setHeader(String name, String value) {
-    super.setHeader(name, value);
-    headers.put(name, value);
-  }
-
-  @SuppressWarnings("all")
-  // @Override is omitted for backwards compatibility with servlet-api 2.5
-  // TODO: Remove @SuppressWarnings and add @Override when Google upgrades
-  //       to servlet-api 3.1
-  public int getStatus() {
-    return status;
-  }
-
-  void play() throws IOException {
-    if (status != 0) {
-      log.debug("Replaying {} {}", status, statusMsg);
-
-      if (status == SC_MOVED_TEMPORARILY) {
-        super.sendRedirect(headers.get(LOCATION_HEADER));
-      } else {
-        super.sendError(status, statusMsg);
-      }
-    }
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectBasicAuthFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectBasicAuthFilter.java
deleted file mode 100644
index b374cb4..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectBasicAuthFilter.java
+++ /dev/null
@@ -1,245 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.httpd;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Strings;
-import com.google.gerrit.extensions.client.GitBasicAuthPolicy;
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.AccessPath;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.AccountException;
-import com.google.gerrit.server.account.AccountManager;
-import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.account.AuthRequest;
-import com.google.gerrit.server.account.AuthResult;
-import com.google.gerrit.server.account.AuthenticationFailedException;
-import com.google.gerrit.server.auth.NoSuchUserException;
-import com.google.gerrit.server.config.AuthConfig;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.Locale;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpServletResponseWrapper;
-import org.apache.commons.codec.binary.Base64;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Authenticates the current user by HTTP basic authentication.
- *
- * <p>The current HTTP request is authenticated by looking up the username and password from the
- * Base64 encoded Authorization header and validating them against any username/password configured
- * authentication system in Gerrit. This filter is intended only to protect the {@link
- * GitOverHttpServlet} and its handled URLs, which provide remote repository access over HTTP.
- *
- * @see <a href="http://www.ietf.org/rfc/rfc2617.txt">RFC 2617</a>
- */
-@Singleton
-class ProjectBasicAuthFilter implements Filter {
-  private static final Logger log = LoggerFactory.getLogger(ProjectBasicAuthFilter.class);
-
-  public static final String REALM_NAME = "Gerrit Code Review";
-  private static final String AUTHORIZATION = "Authorization";
-  private static final String LIT_BASIC = "Basic ";
-
-  private final DynamicItem<WebSession> session;
-  private final AccountCache accountCache;
-  private final AccountManager accountManager;
-  private final AuthConfig authConfig;
-
-  @Inject
-  ProjectBasicAuthFilter(
-      DynamicItem<WebSession> session,
-      AccountCache accountCache,
-      AccountManager accountManager,
-      AuthConfig authConfig) {
-    this.session = session;
-    this.accountCache = accountCache;
-    this.accountManager = accountManager;
-    this.authConfig = authConfig;
-  }
-
-  @Override
-  public void init(FilterConfig config) {}
-
-  @Override
-  public void destroy() {}
-
-  @Override
-  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
-      throws IOException, ServletException {
-    HttpServletRequest req = (HttpServletRequest) request;
-    Response rsp = new Response((HttpServletResponse) response);
-
-    if (verify(req, rsp)) {
-      chain.doFilter(req, rsp);
-    }
-  }
-
-  private boolean verify(HttpServletRequest req, Response rsp) throws IOException {
-    final String hdr = req.getHeader(AUTHORIZATION);
-    if (hdr == null || !hdr.startsWith(LIT_BASIC)) {
-      // Allow an anonymous connection through, or it might be using a
-      // session cookie instead of basic authentication.
-      return true;
-    }
-
-    final byte[] decoded = Base64.decodeBase64(hdr.substring(LIT_BASIC.length()));
-    String usernamePassword = new String(decoded, encoding(req));
-    int splitPos = usernamePassword.indexOf(':');
-    if (splitPos < 1) {
-      rsp.sendError(SC_UNAUTHORIZED);
-      return false;
-    }
-
-    String username = usernamePassword.substring(0, splitPos);
-    String password = usernamePassword.substring(splitPos + 1);
-    if (Strings.isNullOrEmpty(password)) {
-      rsp.sendError(SC_UNAUTHORIZED);
-      return false;
-    }
-    if (authConfig.isUserNameToLowerCase()) {
-      username = username.toLowerCase(Locale.US);
-    }
-
-    final AccountState who = accountCache.getByUsername(username);
-    if (who == null || !who.getAccount().isActive()) {
-      log.warn(
-          "Authentication failed for "
-              + username
-              + ": account inactive or not provisioned in Gerrit");
-      rsp.sendError(SC_UNAUTHORIZED);
-      return false;
-    }
-
-    GitBasicAuthPolicy gitBasicAuthPolicy = authConfig.getGitBasicAuthPolicy();
-    if (gitBasicAuthPolicy == GitBasicAuthPolicy.HTTP
-        || gitBasicAuthPolicy == GitBasicAuthPolicy.HTTP_LDAP) {
-      if (who.checkPassword(password, username)) {
-        return succeedAuthentication(who);
-      }
-    }
-
-    if (gitBasicAuthPolicy == GitBasicAuthPolicy.HTTP) {
-      return failAuthentication(rsp, username);
-    }
-
-    AuthRequest whoAuth = AuthRequest.forUser(username);
-    whoAuth.setPassword(password);
-
-    try {
-      AuthResult whoAuthResult = accountManager.authenticate(whoAuth);
-      setUserIdentified(whoAuthResult.getAccountId());
-      return true;
-    } catch (NoSuchUserException e) {
-      if (who.checkPassword(password, who.getUserName())) {
-        return succeedAuthentication(who);
-      }
-      log.warn("Authentication failed for " + username, e);
-      rsp.sendError(SC_UNAUTHORIZED);
-      return false;
-    } catch (AuthenticationFailedException e) {
-      // This exception is thrown if the user provided wrong credentials, we don't need to log a
-      // stacktrace for it.
-      log.warn("Authentication failed for " + username + ": " + e.getMessage());
-      rsp.sendError(SC_UNAUTHORIZED);
-      return false;
-    } catch (AccountException e) {
-      log.warn("Authentication failed for " + username, e);
-      rsp.sendError(SC_UNAUTHORIZED);
-      return false;
-    }
-  }
-
-  private boolean succeedAuthentication(AccountState who) {
-    setUserIdentified(who.getAccount().getId());
-    return true;
-  }
-
-  private boolean failAuthentication(Response rsp, String username) throws IOException {
-    log.warn(
-        "Authentication failed for {}: password does not match the one stored in Gerrit", username);
-    rsp.sendError(SC_UNAUTHORIZED);
-    return false;
-  }
-
-  private void setUserIdentified(Account.Id id) {
-    WebSession ws = session.get();
-    ws.setUserAccountId(id);
-    ws.setAccessPathOk(AccessPath.GIT, true);
-    ws.setAccessPathOk(AccessPath.REST_API, true);
-  }
-
-  private String encoding(HttpServletRequest req) {
-    return MoreObjects.firstNonNull(req.getCharacterEncoding(), UTF_8.name());
-  }
-
-  static class Response extends HttpServletResponseWrapper {
-    private static final String WWW_AUTHENTICATE = "WWW-Authenticate";
-
-    Response(HttpServletResponse rsp) {
-      super(rsp);
-    }
-
-    private void status(int sc) {
-      if (sc == SC_UNAUTHORIZED) {
-        StringBuilder v = new StringBuilder();
-        v.append(LIT_BASIC);
-        v.append("realm=\"").append(REALM_NAME).append("\"");
-        setHeader(WWW_AUTHENTICATE, v.toString());
-      } else if (containsHeader(WWW_AUTHENTICATE)) {
-        setHeader(WWW_AUTHENTICATE, null);
-      }
-    }
-
-    @Override
-    public void sendError(int sc, String msg) throws IOException {
-      status(sc);
-      super.sendError(sc, msg);
-    }
-
-    @Override
-    public void sendError(int sc) throws IOException {
-      status(sc);
-      super.sendError(sc);
-    }
-
-    @Override
-    @Deprecated
-    public void setStatus(int sc, String sm) {
-      status(sc);
-      super.setStatus(sc, sm);
-    }
-
-    @Override
-    public void setStatus(int sc) {
-      status(sc);
-      super.setStatus(sc);
-    }
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectOAuthFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectOAuthFilter.java
deleted file mode 100644
index 1f21da2..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectOAuthFilter.java
+++ /dev/null
@@ -1,339 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.httpd;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Strings;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.extensions.auth.oauth.OAuthLoginProvider;
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.registration.DynamicMap.Entry;
-import com.google.gerrit.server.AccessPath;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.AccountException;
-import com.google.gerrit.server.account.AccountManager;
-import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.account.AuthRequest;
-import com.google.gerrit.server.account.AuthResult;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import java.util.Locale;
-import java.util.NoSuchElementException;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpServletResponseWrapper;
-import org.apache.commons.codec.binary.Base64;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Authenticates the current user with an OAuth2 server.
- *
- * @see <a href="https://tools.ietf.org/rfc/rfc6750.txt">RFC 6750</a>
- */
-@Singleton
-class ProjectOAuthFilter implements Filter {
-
-  private static final Logger log = LoggerFactory.getLogger(ProjectOAuthFilter.class);
-
-  private static final String REALM_NAME = "Gerrit Code Review";
-  private static final String AUTHORIZATION = "Authorization";
-  private static final String BASIC = "Basic ";
-  private static final String GIT_COOKIE_PREFIX = "git-";
-
-  private final DynamicItem<WebSession> session;
-  private final DynamicMap<OAuthLoginProvider> loginProviders;
-  private final AccountCache accountCache;
-  private final AccountManager accountManager;
-  private final String gitOAuthProvider;
-  private final boolean userNameToLowerCase;
-
-  private String defaultAuthPlugin;
-  private String defaultAuthProvider;
-
-  @Inject
-  ProjectOAuthFilter(
-      DynamicItem<WebSession> session,
-      DynamicMap<OAuthLoginProvider> pluginsProvider,
-      AccountCache accountCache,
-      AccountManager accountManager,
-      @GerritServerConfig Config gerritConfig) {
-    this.session = session;
-    this.loginProviders = pluginsProvider;
-    this.accountCache = accountCache;
-    this.accountManager = accountManager;
-    this.gitOAuthProvider = gerritConfig.getString("auth", null, "gitOAuthProvider");
-    this.userNameToLowerCase = gerritConfig.getBoolean("auth", null, "userNameToLowerCase", false);
-  }
-
-  @Override
-  public void init(FilterConfig config) throws ServletException {
-    if (Strings.isNullOrEmpty(gitOAuthProvider)) {
-      pickOnlyProvider();
-    } else {
-      pickConfiguredProvider();
-    }
-  }
-
-  @Override
-  public void destroy() {}
-
-  @Override
-  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
-      throws IOException, ServletException {
-    HttpServletRequest req = (HttpServletRequest) request;
-    Response rsp = new Response((HttpServletResponse) response);
-    if (verify(req, rsp)) {
-      chain.doFilter(req, rsp);
-    }
-  }
-
-  private boolean verify(HttpServletRequest req, Response rsp) throws IOException {
-    AuthInfo authInfo = null;
-
-    // first check if there is a BASIC authentication header
-    String hdr = req.getHeader(AUTHORIZATION);
-    if (hdr != null && hdr.startsWith(BASIC)) {
-      authInfo = extractAuthInfo(hdr, encoding(req));
-      if (authInfo == null) {
-        rsp.sendError(SC_UNAUTHORIZED);
-        return false;
-      }
-    } else {
-      // if there is no BASIC authentication header, check if there is
-      // a cookie starting with the prefix "git-"
-      Cookie cookie = findGitCookie(req);
-      if (cookie != null) {
-        authInfo = extractAuthInfo(cookie);
-        if (authInfo == null) {
-          rsp.sendError(SC_UNAUTHORIZED);
-          return false;
-        }
-      } else {
-        // if there is no authentication information at all, it might be
-        // an anonymous connection, or there might be a session cookie
-        return true;
-      }
-    }
-
-    // if there is authentication information but no secret => 401
-    if (Strings.isNullOrEmpty(authInfo.tokenOrSecret)) {
-      rsp.sendError(SC_UNAUTHORIZED);
-      return false;
-    }
-
-    AccountState who = accountCache.getByUsername(authInfo.username);
-    if (who == null || !who.getAccount().isActive()) {
-      log.warn(
-          "Authentication failed for "
-              + authInfo.username
-              + ": account inactive or not provisioned in Gerrit");
-      rsp.sendError(SC_UNAUTHORIZED);
-      return false;
-    }
-
-    AuthRequest authRequest = AuthRequest.forExternalUser(authInfo.username);
-    authRequest.setEmailAddress(who.getAccount().getPreferredEmail());
-    authRequest.setDisplayName(who.getAccount().getFullName());
-    authRequest.setPassword(authInfo.tokenOrSecret);
-    authRequest.setAuthPlugin(authInfo.pluginName);
-    authRequest.setAuthProvider(authInfo.exportName);
-
-    try {
-      AuthResult authResult = accountManager.authenticate(authRequest);
-      WebSession ws = session.get();
-      ws.setUserAccountId(authResult.getAccountId());
-      ws.setAccessPathOk(AccessPath.GIT, true);
-      ws.setAccessPathOk(AccessPath.REST_API, true);
-      return true;
-    } catch (AccountException e) {
-      log.warn("Authentication failed for " + authInfo.username, e);
-      rsp.sendError(SC_UNAUTHORIZED);
-      return false;
-    }
-  }
-
-  /**
-   * Picks the only installed OAuth provider. If there is a multiude of providers available, the
-   * actual provider must be determined from the authentication request.
-   *
-   * @throws ServletException if there is no {@code OAuthLoginProvider} installed at all.
-   */
-  private void pickOnlyProvider() throws ServletException {
-    try {
-      Entry<OAuthLoginProvider> loginProvider = Iterables.getOnlyElement(loginProviders);
-      defaultAuthPlugin = loginProvider.getPluginName();
-      defaultAuthProvider = loginProvider.getExportName();
-    } catch (NoSuchElementException e) {
-      throw new ServletException("No OAuth login provider installed");
-    } catch (IllegalArgumentException e) {
-      // multiple providers found => do not pick any
-    }
-  }
-
-  /**
-   * Picks the {@code OAuthLoginProvider} configured with <tt>auth.gitOAuthProvider</tt>.
-   *
-   * @throws ServletException if the configured provider was not found.
-   */
-  private void pickConfiguredProvider() throws ServletException {
-    int splitPos = gitOAuthProvider.lastIndexOf(':');
-    if (splitPos < 1 || splitPos == gitOAuthProvider.length() - 1) {
-      // no colon at all or leading/trailing colon: malformed providerId
-      throw new ServletException(
-          "OAuth login provider configuration is"
-              + " invalid: Must be of the form pluginName:providerName");
-    }
-    defaultAuthPlugin = gitOAuthProvider.substring(0, splitPos);
-    defaultAuthProvider = gitOAuthProvider.substring(splitPos + 1);
-    OAuthLoginProvider provider = loginProviders.get(defaultAuthPlugin, defaultAuthProvider);
-    if (provider == null) {
-      throw new ServletException(
-          "Configured OAuth login provider " + gitOAuthProvider + " wasn't installed");
-    }
-  }
-
-  private AuthInfo extractAuthInfo(String hdr, String encoding)
-      throws UnsupportedEncodingException {
-    byte[] decoded = Base64.decodeBase64(hdr.substring(BASIC.length()));
-    String usernamePassword = new String(decoded, encoding);
-    int splitPos = usernamePassword.indexOf(':');
-    if (splitPos < 1 || splitPos == usernamePassword.length() - 1) {
-      return null;
-    }
-    return new AuthInfo(
-        usernamePassword.substring(0, splitPos),
-        usernamePassword.substring(splitPos + 1),
-        defaultAuthPlugin,
-        defaultAuthProvider);
-  }
-
-  private AuthInfo extractAuthInfo(Cookie cookie) throws UnsupportedEncodingException {
-    String username =
-        URLDecoder.decode(cookie.getName().substring(GIT_COOKIE_PREFIX.length()), UTF_8.name());
-    String value = cookie.getValue();
-    int splitPos = value.lastIndexOf('@');
-    if (splitPos < 1 || splitPos == value.length() - 1) {
-      // no providerId in the cookie value => assume default provider
-      // note: a leading/trailing at sign is considered to belong to
-      // the access token rather than being a separator
-      return new AuthInfo(username, cookie.getValue(), defaultAuthPlugin, defaultAuthProvider);
-    }
-    String token = value.substring(0, splitPos);
-    String providerId = value.substring(splitPos + 1);
-    splitPos = providerId.lastIndexOf(':');
-    if (splitPos < 1 || splitPos == providerId.length() - 1) {
-      // no colon at all or leading/trailing colon: malformed providerId
-      return null;
-    }
-    String pluginName = providerId.substring(0, splitPos);
-    String exportName = providerId.substring(splitPos + 1);
-    OAuthLoginProvider provider = loginProviders.get(pluginName, exportName);
-    if (provider == null) {
-      return null;
-    }
-    return new AuthInfo(username, token, pluginName, exportName);
-  }
-
-  private static String encoding(HttpServletRequest req) {
-    return MoreObjects.firstNonNull(req.getCharacterEncoding(), UTF_8.name());
-  }
-
-  private static Cookie findGitCookie(HttpServletRequest req) {
-    Cookie[] cookies = req.getCookies();
-    if (cookies != null) {
-      for (Cookie cookie : cookies) {
-        if (cookie.getName().startsWith(GIT_COOKIE_PREFIX)) {
-          return cookie;
-        }
-      }
-    }
-    return null;
-  }
-
-  private class AuthInfo {
-    private final String username;
-    private final String tokenOrSecret;
-    private final String pluginName;
-    private final String exportName;
-
-    private AuthInfo(String username, String tokenOrSecret, String pluginName, String exportName) {
-      this.username = userNameToLowerCase ? username.toLowerCase(Locale.US) : username;
-      this.tokenOrSecret = tokenOrSecret;
-      this.pluginName = pluginName;
-      this.exportName = exportName;
-    }
-  }
-
-  private static class Response extends HttpServletResponseWrapper {
-    private static final String WWW_AUTHENTICATE = "WWW-Authenticate";
-
-    Response(HttpServletResponse rsp) {
-      super(rsp);
-    }
-
-    private void status(int sc) {
-      if (sc == SC_UNAUTHORIZED) {
-        StringBuilder v = new StringBuilder();
-        v.append(BASIC);
-        v.append("realm=\"").append(REALM_NAME).append("\"");
-        setHeader(WWW_AUTHENTICATE, v.toString());
-      } else if (containsHeader(WWW_AUTHENTICATE)) {
-        setHeader(WWW_AUTHENTICATE, null);
-      }
-    }
-
-    @Override
-    public void sendError(int sc, String msg) throws IOException {
-      status(sc);
-      super.sendError(sc, msg);
-    }
-
-    @Override
-    public void sendError(int sc) throws IOException {
-      status(sc);
-      super.sendError(sc);
-    }
-
-    @Override
-    @Deprecated
-    public void setStatus(int sc, String sm) {
-      status(sc);
-      super.setStatus(sc, sm);
-    }
-
-    @Override
-    public void setStatus(int sc) {
-      status(sc);
-      super.setStatus(sc);
-    }
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/QueryDocumentationFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/QueryDocumentationFilter.java
deleted file mode 100644
index 7a89b3b..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/QueryDocumentationFilter.java
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.httpd;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableListMultimap;
-import com.google.gerrit.httpd.restapi.RestApiServlet;
-import com.google.gerrit.server.documentation.QueryDocumentationExecutor;
-import com.google.gerrit.server.documentation.QueryDocumentationExecutor.DocQueryException;
-import com.google.gerrit.server.documentation.QueryDocumentationExecutor.DocResult;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.List;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class QueryDocumentationFilter implements Filter {
-  private final Logger log = LoggerFactory.getLogger(QueryDocumentationFilter.class);
-
-  private final QueryDocumentationExecutor searcher;
-
-  @Inject
-  QueryDocumentationFilter(QueryDocumentationExecutor searcher) {
-    this.searcher = searcher;
-  }
-
-  @Override
-  public void init(FilterConfig filterConfig) {}
-
-  @Override
-  public void destroy() {}
-
-  @Override
-  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
-      throws IOException, ServletException {
-    HttpServletRequest req = (HttpServletRequest) request;
-    if ("GET".equals(req.getMethod()) && !Strings.isNullOrEmpty(req.getParameter("q"))) {
-      HttpServletResponse rsp = (HttpServletResponse) response;
-      try {
-        List<DocResult> result = searcher.doQuery(request.getParameter("q"));
-        RestApiServlet.replyJson(req, rsp, ImmutableListMultimap.of(), result);
-      } catch (DocQueryException e) {
-        log.error("Doc search failed:", e);
-        rsp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
-      }
-    } else {
-      chain.doFilter(request, response);
-    }
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RunAsFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RunAsFilter.java
deleted file mode 100644
index 9940cd9..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RunAsFilter.java
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.httpd;
-
-import static com.google.gerrit.httpd.restapi.RestApiServlet.replyError;
-import static javax.servlet.http.HttpServletResponse.SC_FORBIDDEN;
-import static javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
-
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.account.AccountResolver;
-import com.google.gerrit.server.config.AuthConfig;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.google.inject.servlet.ServletModule;
-import java.io.IOException;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Allows running a request as another user account. */
-@Singleton
-class RunAsFilter implements Filter {
-  private static final Logger log = LoggerFactory.getLogger(RunAsFilter.class);
-  private static final String RUN_AS = "X-Gerrit-RunAs";
-
-  static class Module extends ServletModule {
-    @Override
-    protected void configureServlets() {
-      filter("/*").through(RunAsFilter.class);
-    }
-  }
-
-  private final boolean enabled;
-  private final DynamicItem<WebSession> session;
-  private final PermissionBackend permissionBackend;
-  private final AccountResolver accountResolver;
-
-  @Inject
-  RunAsFilter(
-      AuthConfig config,
-      DynamicItem<WebSession> session,
-      PermissionBackend permissionBackend,
-      AccountResolver accountResolver) {
-    this.enabled = config.isRunAsEnabled();
-    this.session = session;
-    this.permissionBackend = permissionBackend;
-    this.accountResolver = accountResolver;
-  }
-
-  @Override
-  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
-      throws IOException, ServletException {
-    HttpServletRequest req = (HttpServletRequest) request;
-    HttpServletResponse res = (HttpServletResponse) response;
-
-    String runas = req.getHeader(RUN_AS);
-    if (runas != null) {
-      if (!enabled) {
-        replyError(req, res, SC_FORBIDDEN, RUN_AS + " disabled by auth.enableRunAs = false", null);
-        return;
-      }
-
-      CurrentUser self = session.get().getUser();
-      try {
-        if (!self.isIdentifiedUser()) {
-          // Always disallow for anonymous users, even if permitted by the ACL,
-          // because that would be crazy.
-          throw new AuthException("denied");
-        }
-        permissionBackend.user(self).check(GlobalPermission.RUN_AS);
-      } catch (AuthException e) {
-        replyError(req, res, SC_FORBIDDEN, "not permitted to use " + RUN_AS, null);
-        return;
-      } catch (PermissionBackendException e) {
-        log.warn("cannot check runAs", e);
-        replyError(req, res, SC_INTERNAL_SERVER_ERROR, RUN_AS + " unavailable", null);
-        return;
-      }
-
-      Account target;
-      try {
-        target = accountResolver.find(runas);
-      } catch (OrmException | IOException | ConfigInvalidException e) {
-        log.warn("cannot resolve account for " + RUN_AS, e);
-        replyError(req, res, SC_INTERNAL_SERVER_ERROR, "cannot resolve " + RUN_AS, e);
-        return;
-      }
-      if (target == null) {
-        replyError(req, res, SC_FORBIDDEN, "no account matches " + RUN_AS, null);
-        return;
-      }
-      session.get().setUserAccountId(target.getId());
-    }
-
-    chain.doFilter(req, res);
-  }
-
-  @Override
-  public void init(FilterConfig filterConfig) {}
-
-  @Override
-  public void destroy() {}
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/UrlModule.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/UrlModule.java
deleted file mode 100644
index 3ab0d79..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/UrlModule.java
+++ /dev/null
@@ -1,288 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.httpd;
-
-import static com.google.inject.Scopes.SINGLETON;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.common.PageLinks;
-import com.google.gerrit.extensions.client.AuthType;
-import com.google.gerrit.httpd.raw.CatServlet;
-import com.google.gerrit.httpd.raw.HostPageServlet;
-import com.google.gerrit.httpd.raw.LegacyGerritServlet;
-import com.google.gerrit.httpd.raw.SshInfoServlet;
-import com.google.gerrit.httpd.raw.ToolServlet;
-import com.google.gerrit.httpd.restapi.AccessRestApiServlet;
-import com.google.gerrit.httpd.restapi.AccountsRestApiServlet;
-import com.google.gerrit.httpd.restapi.ChangesRestApiServlet;
-import com.google.gerrit.httpd.restapi.ConfigRestApiServlet;
-import com.google.gerrit.httpd.restapi.GroupsRestApiServlet;
-import com.google.gerrit.httpd.restapi.ProjectsRestApiServlet;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.config.AuthConfig;
-import com.google.gerrit.server.config.GerritOptions;
-import com.google.gwtexpui.server.CacheControlFilter;
-import com.google.inject.Key;
-import com.google.inject.Provider;
-import com.google.inject.internal.UniqueAnnotations;
-import com.google.inject.servlet.ServletModule;
-import java.io.IOException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.eclipse.jgit.lib.Constants;
-
-class UrlModule extends ServletModule {
-  private GerritOptions options;
-  private AuthConfig authConfig;
-
-  UrlModule(GerritOptions options, AuthConfig authConfig) {
-    this.options = options;
-    this.authConfig = authConfig;
-  }
-
-  @Override
-  protected void configureServlets() {
-    filter("/*").through(Key.get(CacheControlFilter.class));
-    bind(Key.get(CacheControlFilter.class)).in(SINGLETON);
-
-    if (options.enableGwtUi()) {
-      filter("/").through(XsrfCookieFilter.class);
-      filter("/accounts/self/detail").through(XsrfCookieFilter.class);
-      serve("/").with(HostPageServlet.class);
-      serve("/Gerrit").with(LegacyGerritServlet.class);
-      serve("/Gerrit/*").with(legacyGerritScreen());
-      // Forward PolyGerrit URLs to their respective GWT equivalents.
-      serveRegex("^/(c|q|x|admin|dashboard|settings)/(.*)").with(gerritUrl());
-    }
-    serve("/cat/*").with(CatServlet.class);
-
-    if (authConfig.getAuthType() != AuthType.OAUTH && authConfig.getAuthType() != AuthType.OPENID) {
-      serve("/logout").with(HttpLogoutServlet.class);
-      serve("/signout").with(HttpLogoutServlet.class);
-    }
-    serve("/ssh_info").with(SshInfoServlet.class);
-
-    serve("/Main.class").with(notFound());
-    serve("/com/google/gerrit/launcher/*").with(notFound());
-    serve("/servlet/*").with(notFound());
-
-    serve("/all").with(query("status:merged"));
-    serve("/mine").with(screen(PageLinks.MINE));
-    serve("/open").with(query("status:open"));
-    serve("/watched").with(query("is:watched status:open"));
-    serve("/starred").with(query("is:starred"));
-
-    serveRegex("^/settings/?$").with(screen(PageLinks.SETTINGS));
-    serveRegex("^/register$").with(registerScreen(false));
-    serveRegex("^/register/(.+)$").with(registerScreen(true));
-    serveRegex("^/([1-9][0-9]*)/?$").with(directChangeById());
-    serveRegex("^/p/(.*)$").with(queryProjectNew());
-    serveRegex("^/r/(.+)/?$").with(DirectChangeByCommit.class);
-
-    filter("/a/*").through(RequireIdentifiedUserFilter.class);
-
-    // Must be after RequireIdentifiedUserFilter so auth happens before checking
-    // for RunAs capability.
-    install(new RunAsFilter.Module());
-
-    serveRegex("^/(?:a/)?tools/(.*)$").with(ToolServlet.class);
-
-    // Bind servlets for REST root collections.
-    // The '/plugins/' root collection is already handled by HttpPluginServlet
-    // which is bound in HttpPluginModule. We cannot bind it here again although
-    // this means that plugins can't add REST views on PLUGIN_KIND.
-    serveRegex("^/(?:a/)?access/(.*)$").with(AccessRestApiServlet.class);
-    serveRegex("^/(?:a/)?accounts/(.*)$").with(AccountsRestApiServlet.class);
-    serveRegex("^/(?:a/)?changes/(.*)$").with(ChangesRestApiServlet.class);
-    serveRegex("^/(?:a/)?config/(.*)$").with(ConfigRestApiServlet.class);
-    serveRegex("^/(?:a/)?groups/(.*)?$").with(GroupsRestApiServlet.class);
-    serveRegex("^/(?:a/)?projects/(.*)?$").with(ProjectsRestApiServlet.class);
-
-    serveRegex("^/Documentation$").with(redirectDocumentation());
-    serveRegex("^/Documentation/$").with(redirectDocumentation());
-    filter("/Documentation/*").through(QueryDocumentationFilter.class);
-  }
-
-  private Key<HttpServlet> notFound() {
-    return key(
-        new HttpServlet() {
-          private static final long serialVersionUID = 1L;
-
-          @Override
-          protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
-            rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
-          }
-        });
-  }
-
-  private Key<HttpServlet> gerritUrl() {
-    return key(
-        new HttpServlet() {
-          private static final long serialVersionUID = 1L;
-
-          @Override
-          protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
-            toGerrit(req.getRequestURI().substring(req.getContextPath().length()), req, rsp);
-          }
-        });
-  }
-
-  private Key<HttpServlet> screen(String target) {
-    return key(
-        new HttpServlet() {
-          private static final long serialVersionUID = 1L;
-
-          @Override
-          protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
-            toGerrit(target, req, rsp);
-          }
-        });
-  }
-
-  private Key<HttpServlet> legacyGerritScreen() {
-    return key(
-        new HttpServlet() {
-          private static final long serialVersionUID = 1L;
-
-          @Override
-          protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
-            final String token = req.getPathInfo().substring(1);
-            toGerrit(token, req, rsp);
-          }
-        });
-  }
-
-  private Key<HttpServlet> directChangeById() {
-    return key(
-        new HttpServlet() {
-          private static final long serialVersionUID = 1L;
-
-          @Override
-          protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
-            try {
-              String idString = req.getPathInfo();
-              if (idString.endsWith("/")) {
-                idString = idString.substring(0, idString.length() - 1);
-              }
-              Change.Id id = Change.Id.parse(idString);
-              // User accessed Gerrit with /1234, so we have no project yet.
-              // TODO(hiesel) Replace with a preflight request to obtain project before we deprecate
-              // the numeric change id.
-              toGerrit(PageLinks.toChange(null, id), req, rsp);
-            } catch (IllegalArgumentException err) {
-              rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
-            }
-          }
-        });
-  }
-
-  private Key<HttpServlet> queryProjectNew() {
-    return key(
-        new HttpServlet() {
-          private static final long serialVersionUID = 1L;
-
-          @Override
-          protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
-            String name = req.getPathInfo();
-            if (Strings.isNullOrEmpty(name)) {
-              toGerrit(PageLinks.ADMIN_PROJECTS, req, rsp);
-              return;
-            }
-
-            while (name.endsWith("/")) {
-              name = name.substring(0, name.length() - 1);
-            }
-            if (name.endsWith(Constants.DOT_GIT_EXT)) {
-              name =
-                  name.substring(
-                      0, //
-                      name.length() - Constants.DOT_GIT_EXT.length());
-            }
-            while (name.endsWith("/")) {
-              name = name.substring(0, name.length() - 1);
-            }
-            Project.NameKey project = new Project.NameKey(name);
-            toGerrit(
-                PageLinks.toChangeQuery(PageLinks.projectQuery(project, Change.Status.NEW)),
-                req,
-                rsp);
-          }
-        });
-  }
-
-  private Key<HttpServlet> query(String query) {
-    return key(
-        new HttpServlet() {
-          private static final long serialVersionUID = 1L;
-
-          @Override
-          protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
-            toGerrit(PageLinks.toChangeQuery(query), req, rsp);
-          }
-        });
-  }
-
-  private Key<HttpServlet> key(HttpServlet servlet) {
-    final Key<HttpServlet> srv = Key.get(HttpServlet.class, UniqueAnnotations.create());
-    bind(srv)
-        .toProvider(
-            new Provider<HttpServlet>() {
-              @Override
-              public HttpServlet get() {
-                return servlet;
-              }
-            })
-        .in(SINGLETON);
-    return srv;
-  }
-
-  private Key<HttpServlet> registerScreen(final Boolean slash) {
-    return key(
-        new HttpServlet() {
-          private static final long serialVersionUID = 1L;
-
-          @Override
-          protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
-            String path = String.format("/register%s", slash ? req.getPathInfo() : "");
-            toGerrit(path, req, rsp);
-          }
-        });
-  }
-
-  private Key<HttpServlet> redirectDocumentation() {
-    return key(
-        new HttpServlet() {
-          private static final long serialVersionUID = 1L;
-
-          @Override
-          protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
-            String path = "/Documentation/index.html";
-            toGerrit(path, req, rsp);
-          }
-        });
-  }
-
-  static void toGerrit(String target, HttpServletRequest req, HttpServletResponse rsp)
-      throws IOException {
-    final StringBuilder url = new StringBuilder();
-    url.append(req.getContextPath());
-    url.append('/');
-    url.append('#');
-    url.append(target);
-    rsp.sendRedirect(url.toString());
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebModule.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebModule.java
deleted file mode 100644
index 538d605..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebModule.java
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.httpd;
-
-import static com.google.gerrit.extensions.registration.PrivateInternals_DynamicTypes.registerInParentInjectors;
-
-import com.google.gerrit.httpd.auth.become.BecomeAnyAccountModule;
-import com.google.gerrit.httpd.auth.container.HttpAuthModule;
-import com.google.gerrit.httpd.auth.container.HttpsClientSslCertModule;
-import com.google.gerrit.httpd.auth.ldap.LdapAuthModule;
-import com.google.gerrit.httpd.gitweb.GitwebModule;
-import com.google.gerrit.httpd.rpc.UiRpcModule;
-import com.google.gerrit.lifecycle.LifecycleModule;
-import com.google.gerrit.server.RemotePeer;
-import com.google.gerrit.server.config.AuthConfig;
-import com.google.gerrit.server.config.GerritOptions;
-import com.google.gerrit.server.config.GerritRequestModule;
-import com.google.gerrit.server.config.GitwebCgiConfig;
-import com.google.gerrit.server.git.receive.AsyncReceiveCommits;
-import com.google.gerrit.server.util.GuiceRequestScopePropagator;
-import com.google.gerrit.server.util.RequestScopePropagator;
-import com.google.inject.Inject;
-import com.google.inject.ProvisionException;
-import com.google.inject.servlet.RequestScoped;
-import java.net.SocketAddress;
-
-public class WebModule extends LifecycleModule {
-  private final AuthConfig authConfig;
-  private final GitwebCgiConfig gitwebCgiConfig;
-  private final GerritOptions options;
-
-  @Inject
-  WebModule(AuthConfig authConfig, GerritOptions options, GitwebCgiConfig gitwebCgiConfig) {
-    this.authConfig = authConfig;
-    this.options = options;
-    this.gitwebCgiConfig = gitwebCgiConfig;
-  }
-
-  @Override
-  protected void configure() {
-    bind(RequestScopePropagator.class).to(GuiceRequestScopePropagator.class);
-    bind(HttpRequestContext.class);
-
-    installAuthModule();
-    if (options.enableMasterFeatures()) {
-      install(new UrlModule(options, authConfig));
-      install(new UiRpcModule());
-    }
-    install(new GerritRequestModule());
-    install(new GitOverHttpServlet.Module(options.enableMasterFeatures()));
-
-    if (gitwebCgiConfig.getGitwebCgi() != null) {
-      install(new GitwebModule());
-    }
-
-    install(new AsyncReceiveCommits.Module());
-
-    bind(SocketAddress.class)
-        .annotatedWith(RemotePeer.class)
-        .toProvider(HttpRemotePeerProvider.class)
-        .in(RequestScoped.class);
-
-    bind(ProxyProperties.class).toProvider(ProxyPropertiesProvider.class);
-
-    listener().toInstance(registerInParentInjectors());
-
-    install(UniversalWebLoginFilter.module());
-  }
-
-  private void installAuthModule() {
-    switch (authConfig.getAuthType()) {
-      case HTTP:
-      case HTTP_LDAP:
-        install(new HttpAuthModule(authConfig));
-        break;
-
-      case CLIENT_SSL_CERT_LDAP:
-        install(new HttpsClientSslCertModule());
-        break;
-
-      case LDAP:
-      case LDAP_BIND:
-        install(new LdapAuthModule());
-        break;
-
-      case DEVELOPMENT_BECOME_ANY_ACCOUNT:
-        install(new BecomeAnyAccountModule());
-        break;
-
-      case OAUTH:
-        // OAuth support is bound in WebAppInitializer and Daemon.
-      case OPENID:
-      case OPENID_SSO:
-        // OpenID support is bound in WebAppInitializer and Daemon.
-      case CUSTOM_EXTENSION:
-        break;
-      default:
-        throw new ProvisionException("Unsupported loginType: " + authConfig.getAuthType());
-    }
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSessionManager.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSessionManager.java
deleted file mode 100644
index f43c2dc..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSessionManager.java
+++ /dev/null
@@ -1,312 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.httpd;
-
-import static com.google.gerrit.common.TimeUtil.nowMs;
-import static com.google.gerrit.httpd.CacheBasedWebSession.MAX_AGE_MINUTES;
-import static com.google.gerrit.server.ioutil.BasicSerialization.readFixInt64;
-import static com.google.gerrit.server.ioutil.BasicSerialization.readString;
-import static com.google.gerrit.server.ioutil.BasicSerialization.readVarInt32;
-import static com.google.gerrit.server.ioutil.BasicSerialization.writeBytes;
-import static com.google.gerrit.server.ioutil.BasicSerialization.writeFixInt64;
-import static com.google.gerrit.server.ioutil.BasicSerialization.writeString;
-import static com.google.gerrit.server.ioutil.BasicSerialization.writeVarInt32;
-import static java.util.concurrent.TimeUnit.HOURS;
-import static java.util.concurrent.TimeUnit.MILLISECONDS;
-import static java.util.concurrent.TimeUnit.MINUTES;
-import static java.util.concurrent.TimeUnit.SECONDS;
-
-import com.google.common.cache.Cache;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.config.ConfigUtil;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-import java.security.SecureRandom;
-import java.util.concurrent.TimeUnit;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class WebSessionManager {
-  private static final Logger log = LoggerFactory.getLogger(WebSessionManager.class);
-  public static final String CACHE_NAME = "web_sessions";
-
-  private final long sessionMaxAgeMillis;
-  private final SecureRandom prng;
-  private final Cache<String, Val> self;
-
-  @Inject
-  WebSessionManager(@GerritServerConfig Config cfg, @Assisted Cache<String, Val> cache) {
-    prng = new SecureRandom();
-    self = cache;
-
-    sessionMaxAgeMillis =
-        SECONDS.toMillis(
-            ConfigUtil.getTimeUnit(
-                cfg,
-                "cache",
-                CACHE_NAME,
-                "maxAge",
-                SECONDS.convert(MAX_AGE_MINUTES, MINUTES),
-                SECONDS));
-    if (sessionMaxAgeMillis < MINUTES.toMillis(5)) {
-      log.warn(
-          "cache.{}.maxAge is set to {} milliseconds; it should be at least 5 minutes.",
-          CACHE_NAME,
-          sessionMaxAgeMillis);
-    }
-  }
-
-  Key createKey(Account.Id who) {
-    return new Key(newUniqueToken(who));
-  }
-
-  private String newUniqueToken(Account.Id who) {
-    try {
-      final int nonceLen = 20;
-      final ByteArrayOutputStream buf;
-      final byte[] rnd = new byte[nonceLen];
-      prng.nextBytes(rnd);
-
-      buf = new ByteArrayOutputStream(3 + nonceLen);
-      writeVarInt32(buf, (int) Val.serialVersionUID);
-      writeVarInt32(buf, who.get());
-      writeBytes(buf, rnd);
-
-      return CookieBase64.encode(buf.toByteArray());
-    } catch (IOException e) {
-      throw new RuntimeException("Cannot produce new account cookie", e);
-    }
-  }
-
-  Val createVal(Key key, Val val) {
-    Account.Id who = val.getAccountId();
-    boolean remember = val.isPersistentCookie();
-    ExternalId.Key lastLogin = val.getExternalId();
-    return createVal(key, who, remember, lastLogin, val.sessionId, val.auth);
-  }
-
-  Val createVal(
-      Key key,
-      Account.Id who,
-      boolean remember,
-      ExternalId.Key lastLogin,
-      String sid,
-      String auth) {
-    // Refresh the cookie every hour or when it is half-expired.
-    // This reduces the odds that the user session will be kicked
-    // early but also avoids us needing to refresh the cookie on
-    // every single request.
-    //
-    final long halfAgeRefresh = sessionMaxAgeMillis >>> 1;
-    final long minRefresh = MILLISECONDS.convert(1, HOURS);
-    final long refresh = Math.min(halfAgeRefresh, minRefresh);
-    final long now = nowMs();
-    final long refreshCookieAt = now + refresh;
-    final long expiresAt = now + sessionMaxAgeMillis;
-    if (sid == null) {
-      sid = newUniqueToken(who);
-    }
-    if (auth == null) {
-      auth = newUniqueToken(who);
-    }
-
-    Val val = new Val(who, refreshCookieAt, remember, lastLogin, expiresAt, sid, auth);
-    self.put(key.token, val);
-    return val;
-  }
-
-  int getCookieAge(Val val) {
-    if (val.isPersistentCookie()) {
-      // Client may store the cookie until we would remove it from our
-      // own cache, after which it will certainly be invalid.
-      //
-      return (int) MILLISECONDS.toSeconds(sessionMaxAgeMillis);
-    }
-    // Client should not store the cookie, as the user asked for us
-    // to not remember them long-term. Sending -1 as the age will
-    // cause the cookie to be only for this "browser session", which
-    // is usually until the user exits their browser.
-    //
-    return -1;
-  }
-
-  Val get(Key key) {
-    Val val = self.getIfPresent(key.token);
-    if (val != null && val.expiresAt <= nowMs()) {
-      self.invalidate(key.token);
-      return null;
-    }
-    return val;
-  }
-
-  void destroy(Key key) {
-    self.invalidate(key.token);
-  }
-
-  static final class Key {
-    private transient String token;
-
-    Key(String t) {
-      token = t;
-    }
-
-    String getToken() {
-      return token;
-    }
-
-    @Override
-    public int hashCode() {
-      return token.hashCode();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-      return obj instanceof Key && token.equals(((Key) obj).token);
-    }
-  }
-
-  public static final class Val implements Serializable {
-    static final long serialVersionUID = 2L;
-
-    private transient Account.Id accountId;
-    private transient long refreshCookieAt;
-    private transient boolean persistentCookie;
-    private transient ExternalId.Key externalId;
-    private transient long expiresAt;
-    private transient String sessionId;
-    private transient String auth;
-
-    Val(
-        Account.Id accountId,
-        long refreshCookieAt,
-        boolean persistentCookie,
-        ExternalId.Key externalId,
-        long expiresAt,
-        String sessionId,
-        String auth) {
-      this.accountId = accountId;
-      this.refreshCookieAt = refreshCookieAt;
-      this.persistentCookie = persistentCookie;
-      this.externalId = externalId;
-      this.expiresAt = expiresAt;
-      this.sessionId = sessionId;
-      this.auth = auth;
-    }
-
-    public long getExpiresAt() {
-      return expiresAt;
-    }
-
-    Account.Id getAccountId() {
-      return accountId;
-    }
-
-    ExternalId.Key getExternalId() {
-      return externalId;
-    }
-
-    String getSessionId() {
-      return sessionId;
-    }
-
-    String getAuth() {
-      return auth;
-    }
-
-    boolean needsCookieRefresh() {
-      return refreshCookieAt <= nowMs();
-    }
-
-    boolean isPersistentCookie() {
-      return persistentCookie;
-    }
-
-    private void writeObject(ObjectOutputStream out) throws IOException {
-      writeVarInt32(out, 1);
-      writeVarInt32(out, accountId.get());
-
-      writeVarInt32(out, 2);
-      writeFixInt64(out, refreshCookieAt);
-
-      writeVarInt32(out, 3);
-      writeVarInt32(out, persistentCookie ? 1 : 0);
-
-      if (externalId != null) {
-        writeVarInt32(out, 4);
-        writeString(out, externalId.toString());
-      }
-
-      if (sessionId != null) {
-        writeVarInt32(out, 5);
-        writeString(out, sessionId);
-      }
-
-      writeVarInt32(out, 6);
-      writeFixInt64(out, expiresAt);
-
-      if (auth != null) {
-        writeVarInt32(out, 7);
-        writeString(out, auth);
-      }
-
-      writeVarInt32(out, 0);
-    }
-
-    private void readObject(ObjectInputStream in) throws IOException {
-      PARSE:
-      for (; ; ) {
-        final int tag = readVarInt32(in);
-        switch (tag) {
-          case 0:
-            break PARSE;
-          case 1:
-            accountId = new Account.Id(readVarInt32(in));
-            continue;
-          case 2:
-            refreshCookieAt = readFixInt64(in);
-            continue;
-          case 3:
-            persistentCookie = readVarInt32(in) != 0;
-            continue;
-          case 4:
-            externalId = ExternalId.Key.parse(readString(in));
-            continue;
-          case 5:
-            sessionId = readString(in);
-            continue;
-          case 6:
-            expiresAt = readFixInt64(in);
-            continue;
-          case 7:
-            auth = readString(in);
-            continue;
-          default:
-            throw new IOException("Unknown tag found in object: " + tag);
-        }
-      }
-      if (expiresAt == 0) {
-        expiresAt = refreshCookieAt + TimeUnit.HOURS.toMillis(2);
-      }
-    }
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/become/BecomeAnyAccountLoginServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/become/BecomeAnyAccountLoginServlet.java
deleted file mode 100644
index a441901..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/become/BecomeAnyAccountLoginServlet.java
+++ /dev/null
@@ -1,257 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.httpd.auth.become;
-
-import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_USERNAME;
-import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_UUID;
-
-import com.google.gerrit.common.PageLinks;
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.httpd.HtmlDomUtil;
-import com.google.gerrit.httpd.LoginUrlToken;
-import com.google.gerrit.httpd.WebSession;
-import com.google.gerrit.httpd.template.SiteHeaderFooter;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.AccountException;
-import com.google.gerrit.server.account.AccountManager;
-import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.account.Accounts;
-import com.google.gerrit.server.account.AuthRequest;
-import com.google.gerrit.server.account.AuthResult;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.query.account.InternalAccountQuery;
-import com.google.gwtexpui.server.CacheHeaders;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.Writer;
-import java.util.List;
-import java.util.Optional;
-import java.util.UUID;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-@Singleton
-class BecomeAnyAccountLoginServlet extends HttpServlet {
-  private static final long serialVersionUID = 1L;
-
-  private final DynamicItem<WebSession> webSession;
-  private final SchemaFactory<ReviewDb> schema;
-  private final Accounts accounts;
-  private final AccountCache accountCache;
-  private final AccountManager accountManager;
-  private final SiteHeaderFooter headers;
-  private final Provider<InternalAccountQuery> queryProvider;
-
-  @Inject
-  BecomeAnyAccountLoginServlet(
-      DynamicItem<WebSession> ws,
-      SchemaFactory<ReviewDb> sf,
-      Accounts a,
-      AccountCache ac,
-      AccountManager am,
-      SiteHeaderFooter shf,
-      Provider<InternalAccountQuery> qp) {
-    webSession = ws;
-    schema = sf;
-    accounts = a;
-    accountCache = ac;
-    accountManager = am;
-    headers = shf;
-    queryProvider = qp;
-  }
-
-  @Override
-  protected void doGet(HttpServletRequest req, HttpServletResponse rsp)
-      throws IOException, ServletException {
-    doPost(req, rsp);
-  }
-
-  @Override
-  protected void doPost(HttpServletRequest req, HttpServletResponse rsp)
-      throws IOException, ServletException {
-    CacheHeaders.setNotCacheable(rsp);
-
-    final AuthResult res;
-    if ("create_account".equals(req.getParameter("action"))) {
-      res = create();
-
-    } else if (req.getParameter("user_name") != null) {
-      res = byUserName(req.getParameter("user_name"));
-
-    } else if (req.getParameter("preferred_email") != null) {
-      res = byPreferredEmail(req.getParameter("preferred_email"));
-
-    } else if (req.getParameter("account_id") != null) {
-      res = byAccountId(req.getParameter("account_id"));
-
-    } else {
-      byte[] raw;
-      try {
-        raw = prepareHtmlOutput();
-      } catch (OrmException e) {
-        throw new ServletException(e);
-      }
-      rsp.setContentType("text/html");
-      rsp.setCharacterEncoding(HtmlDomUtil.ENC.name());
-      rsp.setContentLength(raw.length);
-      try (OutputStream out = rsp.getOutputStream()) {
-        out.write(raw);
-      }
-      return;
-    }
-
-    if (res != null) {
-      webSession.get().login(res, false);
-      final StringBuilder rdr = new StringBuilder();
-      rdr.append(req.getContextPath());
-      rdr.append("/");
-
-      if (res.isNew()) {
-        rdr.append('#' + PageLinks.REGISTER);
-      } else {
-        rdr.append(LoginUrlToken.getToken(req));
-      }
-      rsp.sendRedirect(rdr.toString());
-
-    } else {
-      rsp.setContentType("text/html");
-      rsp.setCharacterEncoding(HtmlDomUtil.ENC.name());
-      try (Writer out = rsp.getWriter()) {
-        out.write("<html>");
-        out.write("<body>");
-        out.write("<h1>Account Not Found</h1>");
-        out.write("</body>");
-        out.write("</html>");
-      }
-    }
-  }
-
-  private byte[] prepareHtmlOutput() throws IOException, OrmException {
-    final String pageName = "BecomeAnyAccount.html";
-    Document doc = headers.parse(getClass(), pageName);
-    if (doc == null) {
-      throw new FileNotFoundException("No " + pageName + " in webapp");
-    }
-
-    Element userlistElement = HtmlDomUtil.find(doc, "userlist");
-    try (ReviewDb db = schema.open()) {
-      for (Account.Id accountId : accounts.firstNIds(100)) {
-        Account a = accountCache.get(accountId).getAccount();
-        String displayName;
-        if (a.getUserName() != null) {
-          displayName = a.getUserName();
-        } else if (a.getFullName() != null && !a.getFullName().isEmpty()) {
-          displayName = a.getFullName();
-        } else if (a.getPreferredEmail() != null) {
-          displayName = a.getPreferredEmail();
-        } else {
-          displayName = accountId.toString();
-        }
-
-        Element linkElement = doc.createElement("a");
-        linkElement.setAttribute("href", "?account_id=" + a.getId().toString());
-        linkElement.setTextContent(displayName);
-        userlistElement.appendChild(linkElement);
-        userlistElement.appendChild(doc.createElement("br"));
-      }
-    }
-
-    return HtmlDomUtil.toUTF8(doc);
-  }
-
-  private AuthResult auth(Account account) {
-    if (account != null) {
-      return new AuthResult(account.getId(), null, false);
-    }
-    return null;
-  }
-
-  private AuthResult auth(Account.Id account) {
-    if (account != null) {
-      return new AuthResult(account, null, false);
-    }
-    return null;
-  }
-
-  private AuthResult byUserName(String userName) {
-    try {
-      List<AccountState> accountStates =
-          queryProvider.get().byExternalId(SCHEME_USERNAME, userName);
-      if (accountStates.isEmpty()) {
-        getServletContext().log("No accounts with username " + userName + " found");
-        return null;
-      }
-      if (accountStates.size() > 1) {
-        getServletContext().log("Multiple accounts with username " + userName + " found");
-        return null;
-      }
-      return auth(accountStates.get(0).getAccount().getId());
-    } catch (OrmException e) {
-      getServletContext().log("cannot query account index", e);
-      return null;
-    }
-  }
-
-  private AuthResult byPreferredEmail(String email) {
-    try (ReviewDb db = schema.open()) {
-      Optional<Account> match =
-          queryProvider.get().byPreferredEmail(email).stream()
-              .map(AccountState::getAccount)
-              .findFirst();
-      return match.isPresent() ? auth(match.get()) : null;
-    } catch (OrmException e) {
-      getServletContext().log("cannot query database", e);
-      return null;
-    }
-  }
-
-  private AuthResult byAccountId(String idStr) {
-    final Account.Id id;
-    try {
-      id = Account.Id.parse(idStr);
-    } catch (NumberFormatException nfe) {
-      return null;
-    }
-    try {
-      return auth(accounts.get(id));
-    } catch (IOException | ConfigInvalidException e) {
-      getServletContext().log("cannot query database", e);
-      return null;
-    }
-  }
-
-  private AuthResult create() throws IOException {
-    try {
-      return accountManager.authenticate(
-          new AuthRequest(ExternalId.Key.create(SCHEME_UUID, UUID.randomUUID().toString())));
-    } catch (AccountException e) {
-      getServletContext().log("cannot create new account", e);
-      return null;
-    }
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpAuthFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpAuthFilter.java
deleted file mode 100644
index c7229bc..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpAuthFilter.java
+++ /dev/null
@@ -1,170 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.httpd.auth.container;
-
-import static com.google.common.base.MoreObjects.firstNonNull;
-import static com.google.common.base.Strings.emptyToNull;
-import static com.google.common.net.HttpHeaders.AUTHORIZATION;
-import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_GERRIT;
-import static java.nio.charset.StandardCharsets.ISO_8859_1;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.httpd.HtmlDomUtil;
-import com.google.gerrit.httpd.RemoteUserUtil;
-import com.google.gerrit.httpd.WebSession;
-import com.google.gerrit.httpd.raw.HostPageServlet;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.config.AuthConfig;
-import com.google.gwtexpui.server.CacheHeaders;
-import com.google.gwtjsonrpc.server.RPCServletUtils;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.Locale;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * Watches request for the host page and requires login if not yet signed in.
- *
- * <p>If HTTP authentication has been enabled on this server this filter is bound in front of the
- * {@link HostPageServlet} and redirects users who are not yet signed in to visit {@code /login/},
- * so the web container can force login. This redirect is performed with JavaScript, such that any
- * existing anchor token in the URL can be rewritten and preserved through the authentication
- * process of any enterprise single sign-on solutions.
- */
-@Singleton
-class HttpAuthFilter implements Filter {
-  private final DynamicItem<WebSession> sessionProvider;
-  private final byte[] signInRaw;
-  private final byte[] signInGzip;
-  private final String loginHeader;
-  private final String displaynameHeader;
-  private final String emailHeader;
-  private final String externalIdHeader;
-  private final boolean userNameToLowerCase;
-
-  @Inject
-  HttpAuthFilter(DynamicItem<WebSession> webSession, AuthConfig authConfig) throws IOException {
-    this.sessionProvider = webSession;
-
-    final String pageName = "LoginRedirect.html";
-    final String doc = HtmlDomUtil.readFile(getClass(), pageName);
-    if (doc == null) {
-      throw new FileNotFoundException("No " + pageName + " in webapp");
-    }
-
-    signInRaw = doc.getBytes(HtmlDomUtil.ENC);
-    signInGzip = HtmlDomUtil.compress(signInRaw);
-    loginHeader = firstNonNull(emptyToNull(authConfig.getLoginHttpHeader()), AUTHORIZATION);
-    displaynameHeader = emptyToNull(authConfig.getHttpDisplaynameHeader());
-    emailHeader = emptyToNull(authConfig.getHttpEmailHeader());
-    externalIdHeader = emptyToNull(authConfig.getHttpExternalIdHeader());
-    userNameToLowerCase = authConfig.isUserNameToLowerCase();
-  }
-
-  @Override
-  public void doFilter(final ServletRequest request, ServletResponse response, FilterChain chain)
-      throws IOException, ServletException {
-    if (isSessionValid((HttpServletRequest) request)) {
-      chain.doFilter(request, response);
-    } else {
-      // Not signed in yet. Since the browser state might have an anchor
-      // token which we want to capture and carry through the auth process
-      // we send back JavaScript now to capture that, and do the real work
-      // of redirecting to the authentication area.
-      //
-      final HttpServletRequest req = (HttpServletRequest) request;
-      final HttpServletResponse rsp = (HttpServletResponse) response;
-      final byte[] tosend;
-      if (RPCServletUtils.acceptsGzipEncoding(req)) {
-        rsp.setHeader("Content-Encoding", "gzip");
-        tosend = signInGzip;
-      } else {
-        tosend = signInRaw;
-      }
-
-      CacheHeaders.setNotCacheable(rsp);
-      rsp.setContentType("text/html");
-      rsp.setCharacterEncoding(HtmlDomUtil.ENC.name());
-      rsp.setContentLength(tosend.length);
-      try (OutputStream out = rsp.getOutputStream()) {
-        out.write(tosend);
-      }
-    }
-  }
-
-  private boolean isSessionValid(HttpServletRequest req) {
-    WebSession session = sessionProvider.get();
-    if (session.isSignedIn()) {
-      String user = getRemoteUser(req);
-      return user == null || correctUser(user, session);
-    }
-    return false;
-  }
-
-  private static boolean correctUser(String user, WebSession session) {
-    ExternalId.Key id = session.getLastLoginExternalId();
-    return id != null && id.equals(ExternalId.Key.create(SCHEME_GERRIT, user));
-  }
-
-  String getRemoteUser(HttpServletRequest req) {
-    String remoteUser = RemoteUserUtil.getRemoteUser(req, loginHeader);
-    return (userNameToLowerCase && remoteUser != null)
-        ? remoteUser.toLowerCase(Locale.US)
-        : remoteUser;
-  }
-
-  String getRemoteDisplayname(HttpServletRequest req) {
-    if (displaynameHeader != null) {
-      String raw = req.getHeader(displaynameHeader);
-      return emptyToNull(new String(raw.getBytes(ISO_8859_1), UTF_8));
-    }
-    return null;
-  }
-
-  String getRemoteEmail(HttpServletRequest req) {
-    if (emailHeader != null) {
-      return emptyToNull(req.getHeader(emailHeader));
-    }
-    return null;
-  }
-
-  String getRemoteExternalIdToken(HttpServletRequest req) {
-    if (externalIdHeader != null) {
-      return emptyToNull(req.getHeader(externalIdHeader));
-    }
-    return null;
-  }
-
-  String getLoginHeader() {
-    return loginHeader;
-  }
-
-  @Override
-  public void init(FilterConfig filterConfig) {}
-
-  @Override
-  public void destroy() {}
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpLoginServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpLoginServlet.java
deleted file mode 100644
index d86c85a..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpLoginServlet.java
+++ /dev/null
@@ -1,188 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.httpd.auth.container;
-
-import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_EXTERNAL;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.gerrit.common.PageLinks;
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.httpd.CanonicalWebUrl;
-import com.google.gerrit.httpd.HtmlDomUtil;
-import com.google.gerrit.httpd.LoginUrlToken;
-import com.google.gerrit.httpd.WebSession;
-import com.google.gerrit.server.account.AccountException;
-import com.google.gerrit.server.account.AccountManager;
-import com.google.gerrit.server.account.AuthRequest;
-import com.google.gerrit.server.account.AuthResult;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.config.AuthConfig;
-import com.google.gwtexpui.server.CacheHeaders;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * Initializes the user session if HTTP authentication is enabled.
- *
- * <p>If HTTP authentication has been enabled this servlet binds to {@code /login/} and initializes
- * the user session based on user information contained in the HTTP request.
- */
-@Singleton
-class HttpLoginServlet extends HttpServlet {
-  private static final long serialVersionUID = 1L;
-  private static final Logger log = LoggerFactory.getLogger(HttpLoginServlet.class);
-
-  private final DynamicItem<WebSession> webSession;
-  private final CanonicalWebUrl urlProvider;
-  private final AccountManager accountManager;
-  private final HttpAuthFilter authFilter;
-  private final AuthConfig authConfig;
-
-  @Inject
-  HttpLoginServlet(
-      final DynamicItem<WebSession> webSession,
-      final CanonicalWebUrl urlProvider,
-      final AccountManager accountManager,
-      final HttpAuthFilter authFilter,
-      final AuthConfig authConfig) {
-    this.webSession = webSession;
-    this.urlProvider = urlProvider;
-    this.accountManager = accountManager;
-    this.authFilter = authFilter;
-    this.authConfig = authConfig;
-  }
-
-  @Override
-  protected void doGet(HttpServletRequest req, HttpServletResponse rsp)
-      throws ServletException, IOException {
-    final String token = LoginUrlToken.getToken(req);
-
-    CacheHeaders.setNotCacheable(rsp);
-    final String user = authFilter.getRemoteUser(req);
-    if (user == null || "".equals(user)) {
-      log.error(
-          "Unable to authenticate user by "
-              + authFilter.getLoginHeader()
-              + " request header.  Check container or server configuration.");
-
-      final Document doc =
-          HtmlDomUtil.parseFile( //
-              HttpLoginServlet.class, "ConfigurationError.html");
-
-      replace(doc, "loginHeader", authFilter.getLoginHeader());
-      replace(doc, "ServerName", req.getServerName());
-      replace(doc, "ServerPort", ":" + req.getServerPort());
-      replace(doc, "ContextPath", req.getContextPath());
-
-      final byte[] bin = HtmlDomUtil.toUTF8(doc);
-      rsp.setStatus(HttpServletResponse.SC_FORBIDDEN);
-      rsp.setContentType("text/html");
-      rsp.setCharacterEncoding(UTF_8.name());
-      rsp.setContentLength(bin.length);
-      try (ServletOutputStream out = rsp.getOutputStream()) {
-        out.write(bin);
-      }
-      return;
-    }
-
-    final AuthRequest areq = AuthRequest.forUser(user);
-    areq.setDisplayName(authFilter.getRemoteDisplayname(req));
-    areq.setEmailAddress(authFilter.getRemoteEmail(req));
-    final AuthResult arsp;
-    try {
-      arsp = accountManager.authenticate(areq);
-    } catch (AccountException e) {
-      log.error("Unable to authenticate user \"" + user + "\"", e);
-      rsp.sendError(HttpServletResponse.SC_FORBIDDEN);
-      return;
-    }
-
-    String remoteExternalId = authFilter.getRemoteExternalIdToken(req);
-    if (remoteExternalId != null) {
-      try {
-        log.debug("Associating external identity \"{}\" to user \"{}\"", remoteExternalId, user);
-        updateRemoteExternalId(arsp, remoteExternalId);
-      } catch (AccountException | OrmException | ConfigInvalidException e) {
-        log.error(
-            "Unable to associate external identity \""
-                + remoteExternalId
-                + "\" to user \""
-                + user
-                + "\"",
-            e);
-        rsp.sendError(HttpServletResponse.SC_FORBIDDEN);
-        return;
-      }
-    }
-
-    final StringBuilder rdr = new StringBuilder();
-    if (arsp.isNew() && authConfig.getRegisterPageUrl() != null) {
-      rdr.append(authConfig.getRegisterPageUrl());
-    } else {
-      rdr.append(urlProvider.get(req));
-      if (arsp.isNew() && !token.startsWith(PageLinks.REGISTER + "/")) {
-        rdr.append('#' + PageLinks.REGISTER);
-      }
-      rdr.append(token);
-    }
-
-    webSession.get().login(arsp, true /* persistent cookie */);
-    rsp.sendRedirect(rdr.toString());
-  }
-
-  private void updateRemoteExternalId(AuthResult arsp, String remoteAuthToken)
-      throws AccountException, OrmException, IOException, ConfigInvalidException {
-    accountManager.updateLink(
-        arsp.getAccountId(),
-        new AuthRequest(ExternalId.Key.create(SCHEME_EXTERNAL, remoteAuthToken)));
-  }
-
-  private void replace(Document doc, String name, String value) {
-    Element e = HtmlDomUtil.find(doc, name);
-    if (e != null) {
-      e.setTextContent(value);
-    } else {
-      replaceByClass(doc, name, value);
-    }
-  }
-
-  private void replaceByClass(Node parent, String name, String value) {
-    final NodeList list = parent.getChildNodes();
-    for (int i = 0; i < list.getLength(); i++) {
-      final Node n = list.item(i);
-      if (n instanceof Element) {
-        final Element e = (Element) n;
-        if (name.equals(e.getAttribute("class"))) {
-          e.setTextContent(value);
-        }
-      }
-      replaceByClass(n, name, value);
-    }
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpsClientSslCertAuthFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpsClientSslCertAuthFilter.java
deleted file mode 100644
index 534e50ec..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpsClientSslCertAuthFilter.java
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.httpd.auth.container;
-
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.httpd.WebSession;
-import com.google.gerrit.server.account.AccountException;
-import com.google.gerrit.server.account.AccountManager;
-import com.google.gerrit.server.account.AuthRequest;
-import com.google.gerrit.server.account.AuthResult;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.security.cert.X509Certificate;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-class HttpsClientSslCertAuthFilter implements Filter {
-
-  private static final Pattern REGEX_USERID = Pattern.compile("CN=([^,]*)");
-  private static final Logger log = LoggerFactory.getLogger(HttpsClientSslCertAuthFilter.class);
-
-  private final DynamicItem<WebSession> webSession;
-  private final AccountManager accountManager;
-
-  @Inject
-  HttpsClientSslCertAuthFilter(
-      final DynamicItem<WebSession> webSession, AccountManager accountManager) {
-    this.webSession = webSession;
-    this.accountManager = accountManager;
-  }
-
-  @Override
-  public void destroy() {}
-
-  @Override
-  public void doFilter(ServletRequest req, ServletResponse rsp, FilterChain chain)
-      throws IOException, ServletException {
-    X509Certificate[] certs =
-        (X509Certificate[]) req.getAttribute("javax.servlet.request.X509Certificate");
-    if (certs == null || certs.length == 0) {
-      throw new ServletException(
-          "Couldn't get the attribute javax.servlet.request.X509Certificate from the request");
-    }
-    String name = certs[0].getSubjectDN().getName();
-    Matcher m = REGEX_USERID.matcher(name);
-    String userName;
-    if (m.find()) {
-      userName = m.group(1);
-    } else {
-      throw new ServletException("Couldn't extract username from your certificate");
-    }
-    final AuthRequest areq = AuthRequest.forUser(userName);
-    final AuthResult arsp;
-    try {
-      arsp = accountManager.authenticate(areq);
-    } catch (AccountException e) {
-      String err = "Unable to authenticate user \"" + userName + "\"";
-      log.error(err, e);
-      throw new ServletException(err, e);
-    }
-    webSession.get().login(arsp, true);
-    chain.doFilter(req, rsp);
-  }
-
-  @Override
-  public void init(FilterConfig arg0) throws ServletException {}
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpsClientSslCertLoginServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpsClientSslCertLoginServlet.java
deleted file mode 100644
index e93b0b6..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpsClientSslCertLoginServlet.java
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.httpd.auth.container;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.httpd.LoginUrlToken;
-import com.google.gerrit.server.config.CanonicalWebUrl;
-import com.google.gwtexpui.server.CacheHeaders;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * Servlet bound to {@code /login/*} to redirect after client SSL certificate login.
- *
- * <p>When using client SSL certificate one should normally never see the sign in dialog. However,
- * this will happen if users session gets invalidated in some way. Like in other authentication
- * types, we need to force page to fully reload in order to initialize a new session and create a
- * valid xsrfKey.
- */
-@Singleton
-public class HttpsClientSslCertLoginServlet extends HttpServlet {
-  private static final long serialVersionUID = 1L;
-
-  private final Provider<String> urlProvider;
-
-  @Inject
-  public HttpsClientSslCertLoginServlet(
-      @CanonicalWebUrl @Nullable final Provider<String> urlProvider) {
-    this.urlProvider = urlProvider;
-  }
-
-  @Override
-  protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
-    final StringBuilder rdr = new StringBuilder();
-    rdr.append(urlProvider.get());
-    rdr.append(LoginUrlToken.getToken(req));
-
-    CacheHeaders.setNotCacheable(rsp);
-    rsp.sendRedirect(rdr.toString());
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/ldap/LdapLoginServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/ldap/LdapLoginServlet.java
deleted file mode 100644
index 316bf5d..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/ldap/LdapLoginServlet.java
+++ /dev/null
@@ -1,155 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.httpd.auth.ldap;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Strings;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.httpd.CanonicalWebUrl;
-import com.google.gerrit.httpd.HtmlDomUtil;
-import com.google.gerrit.httpd.LoginUrlToken;
-import com.google.gerrit.httpd.WebSession;
-import com.google.gerrit.httpd.template.SiteHeaderFooter;
-import com.google.gerrit.server.account.AccountException;
-import com.google.gerrit.server.account.AccountManager;
-import com.google.gerrit.server.account.AccountUserNameException;
-import com.google.gerrit.server.account.AuthRequest;
-import com.google.gerrit.server.account.AuthResult;
-import com.google.gerrit.server.account.AuthenticationFailedException;
-import com.google.gerrit.server.auth.AuthenticationUnavailableException;
-import com.google.gwtexpui.server.CacheHeaders;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-/** Handles username/password based authentication against the directory. */
-@Singleton
-class LdapLoginServlet extends HttpServlet {
-  private static final long serialVersionUID = 1L;
-
-  private static final Logger log = LoggerFactory.getLogger(LdapLoginServlet.class);
-
-  private final AccountManager accountManager;
-  private final DynamicItem<WebSession> webSession;
-  private final CanonicalWebUrl urlProvider;
-  private final SiteHeaderFooter headers;
-
-  @Inject
-  LdapLoginServlet(
-      AccountManager accountManager,
-      DynamicItem<WebSession> webSession,
-      CanonicalWebUrl urlProvider,
-      SiteHeaderFooter headers) {
-    this.accountManager = accountManager;
-    this.webSession = webSession;
-    this.urlProvider = urlProvider;
-    this.headers = headers;
-  }
-
-  private void sendForm(
-      HttpServletRequest req, HttpServletResponse res, @Nullable String errorMessage)
-      throws IOException {
-    String self = req.getRequestURI();
-    String cancel = MoreObjects.firstNonNull(urlProvider.get(req), "/");
-    cancel += LoginUrlToken.getToken(req);
-
-    Document doc = headers.parse(LdapLoginServlet.class, "LoginForm.html");
-    HtmlDomUtil.find(doc, "hostName").setTextContent(req.getServerName());
-    HtmlDomUtil.find(doc, "login_form").setAttribute("action", self);
-    HtmlDomUtil.find(doc, "cancel_link").setAttribute("href", cancel);
-
-    Element emsg = HtmlDomUtil.find(doc, "error_message");
-    if (Strings.isNullOrEmpty(errorMessage)) {
-      emsg.getParentNode().removeChild(emsg);
-    } else {
-      emsg.setTextContent(errorMessage);
-    }
-
-    byte[] bin = HtmlDomUtil.toUTF8(doc);
-    res.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
-    res.setContentType("text/html");
-    res.setCharacterEncoding(UTF_8.name());
-    res.setContentLength(bin.length);
-    try (ServletOutputStream out = res.getOutputStream()) {
-      out.write(bin);
-    }
-  }
-
-  @Override
-  protected void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
-    sendForm(req, res, null);
-  }
-
-  @Override
-  protected void doPost(HttpServletRequest req, HttpServletResponse res)
-      throws ServletException, IOException {
-    req.setCharacterEncoding(UTF_8.name());
-    String username = Strings.nullToEmpty(req.getParameter("username")).trim();
-    String password = Strings.nullToEmpty(req.getParameter("password"));
-    String remember = Strings.nullToEmpty(req.getParameter("rememberme"));
-    if (username.isEmpty() || password.isEmpty()) {
-      sendForm(req, res, "Invalid username or password.");
-      return;
-    }
-
-    AuthRequest areq = AuthRequest.forUser(username);
-    areq.setPassword(password);
-
-    AuthResult ares;
-    try {
-      ares = accountManager.authenticate(areq);
-    } catch (AccountUserNameException e) {
-      sendForm(req, res, e.getMessage());
-      return;
-    } catch (AuthenticationUnavailableException e) {
-      sendForm(req, res, "Authentication unavailable at this time.");
-      return;
-    } catch (AuthenticationFailedException e) {
-      // This exception is thrown if the user provided wrong credentials, we don't need to log a
-      // stacktrace for it.
-      log.warn("'{}' failed to sign in: {}", username, e.getMessage());
-      sendForm(req, res, "Invalid username or password.");
-      return;
-    } catch (AccountException e) {
-      log.warn("'{}' failed to sign in", username, e);
-      sendForm(req, res, "Authentication failed.");
-      return;
-    } catch (RuntimeException e) {
-      log.error("LDAP authentication failed", e);
-      sendForm(req, res, "Authentication unavailable at this time.");
-      return;
-    }
-
-    StringBuilder dest = new StringBuilder();
-    dest.append(urlProvider.get(req));
-    dest.append(LoginUrlToken.getToken(req));
-
-    CacheHeaders.setNotCacheable(res);
-    webSession.get().login(ares, "1".equals(remember));
-    res.sendRedirect(dest.toString());
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitLogoServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitLogoServlet.java
deleted file mode 100644
index 2019dec..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitLogoServlet.java
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.httpd.gitweb;
-
-import static com.google.gerrit.common.FileUtil.lastModified;
-
-import com.google.common.io.ByteStreams;
-import com.google.gerrit.server.config.GitwebCgiConfig;
-import com.google.gwtexpui.server.CacheHeaders;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.Files;
-import java.nio.file.NoSuchFileException;
-import java.nio.file.Path;
-import java.util.concurrent.TimeUnit;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-@Singleton
-class GitLogoServlet extends HttpServlet {
-  private static final long serialVersionUID = 1L;
-
-  private final long modified;
-  private final byte[] raw;
-
-  @Inject
-  GitLogoServlet(GitwebCgiConfig cfg) throws IOException {
-    byte[] png;
-    Path src = cfg.getGitLogoPng();
-    if (src != null) {
-      try (InputStream in = Files.newInputStream(src)) {
-        png = ByteStreams.toByteArray(in);
-      } catch (NoSuchFileException e) {
-        png = null;
-      }
-      modified = lastModified(src);
-    } else {
-      modified = -1;
-      png = null;
-    }
-    raw = png;
-  }
-
-  @Override
-  protected long getLastModified(HttpServletRequest req) {
-    return modified;
-  }
-
-  @Override
-  protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
-    if (raw != null) {
-      rsp.setContentType("image/png");
-      rsp.setContentLength(raw.length);
-      rsp.setDateHeader("Last-Modified", modified);
-      CacheHeaders.setCacheable(req, rsp, 5, TimeUnit.MINUTES);
-
-      try (ServletOutputStream os = rsp.getOutputStream()) {
-        os.write(raw);
-      }
-    } else {
-      CacheHeaders.setNotCacheable(rsp);
-      rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
-    }
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebCssServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebCssServlet.java
deleted file mode 100644
index 83aed9c..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebCssServlet.java
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.httpd.gitweb;
-
-import static com.google.gerrit.common.FileUtil.lastModified;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.gerrit.httpd.HtmlDomUtil;
-import com.google.gerrit.server.config.GitwebCgiConfig;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gwtexpui.server.CacheHeaders;
-import com.google.gwtjsonrpc.server.RPCServletUtils;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.util.concurrent.TimeUnit;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-abstract class GitwebCssServlet extends HttpServlet {
-  private static final long serialVersionUID = 1L;
-
-  @Singleton
-  static class Site extends GitwebCssServlet {
-    private static final long serialVersionUID = 1L;
-
-    @Inject
-    Site(SitePaths paths) throws IOException {
-      super(paths.site_css);
-    }
-  }
-
-  @Singleton
-  static class Default extends GitwebCssServlet {
-    private static final long serialVersionUID = 1L;
-
-    @Inject
-    Default(GitwebCgiConfig gwcc) throws IOException {
-      super(gwcc.getGitwebCss());
-    }
-  }
-
-  private final long modified;
-  private final byte[] raw_css;
-  private final byte[] gz_css;
-
-  GitwebCssServlet(Path src) throws IOException {
-    if (src != null) {
-      final Path dir = src.getParent();
-      final String name = src.getFileName().toString();
-      final String raw = HtmlDomUtil.readFile(dir, name);
-      if (raw != null) {
-        modified = lastModified(src);
-        raw_css = raw.getBytes(UTF_8);
-        gz_css = HtmlDomUtil.compress(raw_css);
-      } else {
-        modified = -1L;
-        raw_css = null;
-        gz_css = null;
-      }
-    } else {
-      modified = -1;
-      raw_css = null;
-      gz_css = null;
-    }
-  }
-
-  @Override
-  protected long getLastModified(HttpServletRequest req) {
-    return modified;
-  }
-
-  @Override
-  protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
-    if (raw_css != null) {
-      rsp.setContentType("text/css");
-      rsp.setCharacterEncoding(UTF_8.name());
-      final byte[] toSend;
-      if (RPCServletUtils.acceptsGzipEncoding(req)) {
-        rsp.setHeader("Content-Encoding", "gzip");
-        toSend = gz_css;
-      } else {
-        toSend = raw_css;
-      }
-      rsp.setContentLength(toSend.length);
-      rsp.setDateHeader("Last-Modified", modified);
-      CacheHeaders.setCacheable(req, rsp, 5, TimeUnit.MINUTES);
-
-      try (ServletOutputStream os = rsp.getOutputStream()) {
-        os.write(toSend);
-      }
-    } else {
-      CacheHeaders.setNotCacheable(rsp);
-      rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
-    }
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebJavaScriptServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebJavaScriptServlet.java
deleted file mode 100644
index 1b26f6d..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebJavaScriptServlet.java
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.httpd.gitweb;
-
-import static com.google.gerrit.common.FileUtil.lastModified;
-
-import com.google.common.io.ByteStreams;
-import com.google.gerrit.server.config.GitwebCgiConfig;
-import com.google.gwtexpui.server.CacheHeaders;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.Files;
-import java.nio.file.NoSuchFileException;
-import java.nio.file.Path;
-import java.util.concurrent.TimeUnit;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-@Singleton
-class GitwebJavaScriptServlet extends HttpServlet {
-  private static final long serialVersionUID = 1L;
-
-  private final long modified;
-  private final byte[] raw;
-
-  @Inject
-  GitwebJavaScriptServlet(GitwebCgiConfig gitwebCgiConfig) throws IOException {
-    byte[] png;
-    Path src = gitwebCgiConfig.getGitwebJs();
-    if (src != null) {
-      try (InputStream in = Files.newInputStream(src)) {
-        png = ByteStreams.toByteArray(in);
-      } catch (NoSuchFileException e) {
-        png = null;
-      }
-      modified = lastModified(src);
-    } else {
-      modified = -1;
-      png = null;
-    }
-    raw = png;
-  }
-
-  @Override
-  protected long getLastModified(HttpServletRequest req) {
-    return modified;
-  }
-
-  @Override
-  protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
-    if (raw != null) {
-      rsp.setContentType("text/javascript");
-      rsp.setContentLength(raw.length);
-      rsp.setDateHeader("Last-Modified", modified);
-      CacheHeaders.setCacheable(req, rsp, 5, TimeUnit.MINUTES);
-
-      try (ServletOutputStream os = rsp.getOutputStream()) {
-        os.write(raw);
-      }
-    } else {
-      CacheHeaders.setNotCacheable(rsp);
-      rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
-    }
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebServlet.java
deleted file mode 100644
index ec7c477..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebServlet.java
+++ /dev/null
@@ -1,751 +0,0 @@
-// Copyright (C) 2009 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.
-
-// CGI environment and execution management portions are:
-//
-// ========================================================================
-// Copyright (c) 2006-2009 Mort Bay Consulting Pty. Ltd.
-// ------------------------------------------------------------------------
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// and Apache License v2.0 which accompanies this distribution.
-// The Eclipse Public License is available at
-// http://www.eclipse.org/legal/epl-v10.html
-// The Apache License v2.0 is available at
-// http://www.opensource.org/licenses/apache2.0.php
-// You may elect to redistribute this code under either of these licenses.
-// ========================================================================
-
-package com.google.gerrit.httpd.gitweb;
-
-import static java.nio.charset.StandardCharsets.ISO_8859_1;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.gerrit.common.PageLinks;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.Url;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.AnonymousUser;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.GitwebCgiConfig;
-import com.google.gerrit.server.config.GitwebConfig;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.LocalDiskRepositoryManager;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.ProjectPermission;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.ssh.SshInfo;
-import com.google.gwtexpui.server.CacheHeaders;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.ProvisionException;
-import com.google.inject.Singleton;
-import java.io.BufferedInputStream;
-import java.io.BufferedReader;
-import java.io.EOFException;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.Repository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Invokes {@code gitweb.cgi} for the project given in {@code p}. */
-@Singleton
-class GitwebServlet extends HttpServlet {
-  private static final long serialVersionUID = 1L;
-
-  private static final Logger log = LoggerFactory.getLogger(GitwebServlet.class);
-
-  private static final String PROJECT_LIST_ACTION = "project_list";
-
-  private final Set<String> deniedActions;
-  private final int bufferSize = 8192;
-  private final Path gitwebCgi;
-  private final URI gitwebUrl;
-  private final LocalDiskRepositoryManager repoManager;
-  private final ProjectCache projectCache;
-  private final PermissionBackend permissionBackend;
-  private final Provider<AnonymousUser> anonymousUserProvider;
-  private final Provider<CurrentUser> userProvider;
-  private final EnvList _env;
-
-  @Inject
-  GitwebServlet(
-      GitRepositoryManager repoManager,
-      ProjectCache projectCache,
-      PermissionBackend permissionBackend,
-      Provider<AnonymousUser> anonymousUserProvider,
-      Provider<CurrentUser> userProvider,
-      SitePaths site,
-      @GerritServerConfig Config cfg,
-      SshInfo sshInfo,
-      GitwebConfig gitwebConfig,
-      GitwebCgiConfig gitwebCgiConfig)
-      throws IOException {
-    if (!(repoManager instanceof LocalDiskRepositoryManager)) {
-      throw new ProvisionException("Gitweb can only be used with LocalDiskRepositoryManager");
-    }
-    this.repoManager = (LocalDiskRepositoryManager) repoManager;
-    this.projectCache = projectCache;
-    this.permissionBackend = permissionBackend;
-    this.anonymousUserProvider = anonymousUserProvider;
-    this.userProvider = userProvider;
-    this.gitwebCgi = gitwebCgiConfig.getGitwebCgi();
-    this.deniedActions = new HashSet<>();
-
-    final String url = gitwebConfig.getUrl();
-    if ((url != null) && (!url.equals("gitweb"))) {
-      URI uri = null;
-      try {
-        uri = new URI(url);
-      } catch (URISyntaxException e) {
-        log.error("Invalid gitweb.url: {}", url);
-      }
-      gitwebUrl = uri;
-    } else {
-      gitwebUrl = null;
-    }
-
-    deniedActions.add("forks");
-    deniedActions.add("opml");
-    deniedActions.add("project_index");
-
-    _env = new EnvList();
-    makeSiteConfig(site, cfg, sshInfo);
-
-    if (!_env.envMap.containsKey("SystemRoot")) {
-      String os = System.getProperty("os.name");
-      if (os != null && os.toLowerCase().contains("windows")) {
-        String sysroot = System.getenv("SystemRoot");
-        if (sysroot == null || sysroot.isEmpty()) {
-          sysroot = "C:\\WINDOWS";
-        }
-        _env.set("SystemRoot", sysroot);
-      }
-    }
-
-    if (!_env.envMap.containsKey("PATH")) {
-      _env.set("PATH", System.getenv("PATH"));
-    }
-  }
-
-  private void makeSiteConfig(SitePaths site, Config cfg, SshInfo sshInfo) throws IOException {
-    if (!Files.exists(site.tmp_dir)) {
-      Files.createDirectories(site.tmp_dir);
-    }
-    Path myconf = Files.createTempFile(site.tmp_dir, "gitweb_config", ".perl");
-
-    // To make our configuration file only readable or writable by us;
-    // this reduces the chances of someone tampering with the file.
-    //
-    // TODO(dborowitz): Is there a portable way to do this with NIO?
-    File myconfFile = myconf.toFile();
-    myconfFile.setWritable(false, false /* all */);
-    myconfFile.setReadable(false, false /* all */);
-    myconfFile.setExecutable(false, false /* all */);
-
-    myconfFile.setWritable(true, true /* owner only */);
-    myconfFile.setReadable(true, true /* owner only */);
-
-    myconfFile.deleteOnExit();
-
-    _env.set("GIT_DIR", ".");
-    _env.set("GITWEB_CONFIG", myconf.toAbsolutePath().toString());
-
-    try (PrintWriter p = new PrintWriter(Files.newBufferedWriter(myconf, UTF_8))) {
-      p.print("# Autogenerated by Gerrit Code Review \n");
-      p.print("# DO NOT EDIT\n");
-      p.print("\n");
-
-      // We are mounted at the same level in the context as the main
-      // UI, so we can include the same header and footer scheme.
-      //
-      Path hdr = site.site_header;
-      if (Files.isRegularFile(hdr)) {
-        p.print("$site_header = " + quoteForPerl(hdr) + ";\n");
-      }
-      Path ftr = site.site_footer;
-      if (Files.isRegularFile(ftr)) {
-        p.print("$site_footer = " + quoteForPerl(ftr) + ";\n");
-      }
-
-      // Top level should return to Gerrit's UI.
-      //
-      p.print("$home_link = $ENV{'GERRIT_CONTEXT_PATH'};\n");
-      p.print("$home_link_str = 'Code Review';\n");
-
-      p.print("$favicon = 'favicon.ico';\n");
-      p.print("$logo = 'gitweb-logo.png';\n");
-      p.print("$javascript = 'gitweb.js';\n");
-      p.print("@stylesheets = ('gitweb-default.css');\n");
-      Path css = site.site_css;
-      if (Files.isRegularFile(css)) {
-        p.print("push @stylesheets, 'gitweb-site.css';\n");
-      }
-
-      // Try to make the title match Gerrit's normal window title
-      // scheme of host followed by 'Code Review'.
-      //
-      p.print("$site_name = $home_link_str;\n");
-      p.print("$site_name = qq{$1 $site_name} if ");
-      p.print("$ENV{'SERVER_NAME'} =~ m,^([^.]+(?:\\.[^.]+)?)(?:\\.|$),;\n");
-
-      // Assume by default that XSS is a problem, and try to prevent it.
-      //
-      p.print("$prevent_xss = 1;\n");
-
-      // Generate URLs using smart http://
-      //
-      p.print("{\n");
-      p.print("  my $secure = $ENV{'HTTPS'} =~ /^ON$/i;\n");
-      p.print("  my $http_url = $secure ? 'https://' : 'http://';\n");
-      p.print("  $http_url .= qq{$ENV{'GERRIT_USER_NAME'}@}\n");
-      p.print("    unless $ENV{'GERRIT_ANONYMOUS_READ'};\n");
-      p.print("  $http_url .= $ENV{'SERVER_NAME'};\n");
-      p.print("  $http_url .= qq{:$ENV{'SERVER_PORT'}}\n");
-      p.print("    if (( $secure && $ENV{'SERVER_PORT'} != 443)\n");
-      p.print("     || (!$secure && $ENV{'SERVER_PORT'} != 80)\n");
-      p.print("    );\n");
-      p.print("  my $context = $ENV{'GERRIT_CONTEXT_PATH'};\n");
-      p.print("  chop($context);\n");
-      p.print("  $http_url .= qq{$context};\n");
-      p.print("  $http_url .= qq{/a}\n");
-      p.print("    unless $ENV{'GERRIT_ANONYMOUS_READ'};\n");
-      p.print("  push @git_base_url_list, $http_url;\n");
-      p.print("}\n");
-
-      // Generate URLs using anonymous git://
-      //
-      String url = cfg.getString("gerrit", null, "canonicalGitUrl");
-      if (url != null) {
-        if (url.endsWith("/")) {
-          url = url.substring(0, url.length() - 1);
-        }
-        p.print("if ($ENV{'GERRIT_ANONYMOUS_READ'}) {\n");
-        p.print("  push @git_base_url_list, ");
-        p.print(quoteForPerl(url));
-        p.print(";\n");
-        p.print("}\n");
-      }
-
-      // Generate URLs using authenticated ssh://
-      //
-      if (sshInfo != null && !sshInfo.getHostKeys().isEmpty()) {
-        String sshAddr = sshInfo.getHostKeys().get(0).getHost();
-        p.print("if ($ENV{'GERRIT_USER_NAME'}) {\n");
-        p.print("  push @git_base_url_list, join('', 'ssh://'");
-        p.print(", $ENV{'GERRIT_USER_NAME'}");
-        p.print(", '@'");
-        if (sshAddr.startsWith("*:") || "".equals(sshAddr)) {
-          p.print(", $ENV{'SERVER_NAME'}");
-        }
-        if (sshAddr.startsWith("*")) {
-          sshAddr = sshAddr.substring(1);
-        }
-        p.print(", " + quoteForPerl(sshAddr));
-        p.print(");\n");
-        p.print("}\n");
-      }
-
-      // Link back to Gerrit (when possible, to matching review record).
-      // Supported gitweb's hash values are:
-      // - (missing),
-      // - HEAD,
-      // - refs/heads/<branch>,
-      // - refs/changes/*/<change>/*,
-      // - <revision>.
-      //
-      p.print("sub add_review_link {\n");
-      p.print("  my $h = shift;\n");
-      p.print("  my $q;\n");
-      p.print("  if (!$h || $h eq 'HEAD') {\n");
-      p.print("    $q = qq{#/q/project:$ENV{'GERRIT_PROJECT_NAME'}};\n");
-      p.print("  } elsif ($h =~ /^refs\\/heads\\/([-\\w]+)$/) {\n");
-      p.print("    $q = qq{#/q/project:$ENV{'GERRIT_PROJECT_NAME'}");
-      p.print("+branch:$1};\n"); // wrapped
-      p.print("  } elsif ($h =~ /^refs\\/changes\\/\\d{2}\\/(\\d+)\\/\\d+$/) ");
-      p.print("{\n"); // wrapped
-      p.print("    $q = qq{#/c/$1};\n");
-      p.print("  } else {\n");
-      p.print("    $q = qq{#/q/$h};\n");
-      p.print("  }\n");
-      p.print("  my $r = qq{$ENV{'GERRIT_CONTEXT_PATH'}$q};\n");
-      p.print("  push @{$feature{'actions'}{'default'}},\n");
-      p.print("      ('review',$r,'commitdiff');\n");
-      p.print("}\n");
-      p.print("if ($cgi->param('hb')) {\n");
-      p.print("  add_review_link(scalar $cgi->param('hb'));\n");
-      p.print("} elsif ($cgi->param('h')) {\n");
-      p.print("  add_review_link(scalar $cgi->param('h'));\n");
-      p.print("} else {\n");
-      p.print("  add_review_link();\n");
-      p.print("}\n");
-
-      // If the administrator has created a site-specific gitweb_config,
-      // load that before we perform any final overrides.
-      //
-      Path sitecfg = site.site_gitweb;
-      if (Files.isRegularFile(sitecfg)) {
-        p.print("$GITWEB_CONFIG = " + quoteForPerl(sitecfg) + ";\n");
-        p.print("if (-e $GITWEB_CONFIG) {\n");
-        p.print("  do " + quoteForPerl(sitecfg) + ";\n");
-        p.print("}\n");
-      }
-
-      p.print("$projectroot = $ENV{'GITWEB_PROJECTROOT'};\n");
-
-      // Permit exporting only the project we were started for.
-      // We use the name under $projectroot in case symlinks
-      // were involved in the path.
-      //
-      p.print("$export_auth_hook = sub {\n");
-      p.print("    my $dir = shift;\n");
-      p.print("    my $name = $ENV{'GERRIT_PROJECT_NAME'};\n");
-      p.print("    my $allow = qq{$projectroot/$name.git};\n");
-      p.print("    return $dir eq $allow;\n");
-      p.print("  };\n");
-
-      // Do not allow the administrator to enable path info, its
-      // not a URL format we currently support.
-      //
-      p.print("$feature{'pathinfo'}{'override'} = 0;\n");
-      p.print("$feature{'pathinfo'}{'default'} = [0];\n");
-
-      // We don't do forking, so don't allow it to be enabled.
-      //
-      p.print("$feature{'forks'}{'override'} = 0;\n");
-      p.print("$feature{'forks'}{'default'} = [0];\n");
-    }
-
-    myconfFile.setReadOnly();
-  }
-
-  private static String quoteForPerl(Path value) {
-    return quoteForPerl(value.toAbsolutePath().toString());
-  }
-
-  private static String quoteForPerl(String value) {
-    if (value == null || value.isEmpty()) {
-      return "''";
-    }
-    if (!value.contains("'")) {
-      return "'" + value + "'";
-    }
-    if (!value.contains("{") && !value.contains("}")) {
-      return "q{" + value + "}";
-    }
-    throw new IllegalArgumentException("Cannot quote in Perl: " + value);
-  }
-
-  @Override
-  protected void service(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
-    if (req.getQueryString() == null || req.getQueryString().isEmpty()) {
-      // No query string? They want the project list, which we don't
-      // currently support. Return to Gerrit's own web UI.
-      //
-      rsp.sendRedirect(req.getContextPath() + "/");
-      return;
-    }
-
-    final Map<String, String> params = getParameters(req);
-    String a = params.get("a");
-    if (a != null) {
-      if (deniedActions.contains(a)) {
-        rsp.sendError(HttpServletResponse.SC_FORBIDDEN);
-        return;
-      }
-
-      if (a.equals(PROJECT_LIST_ACTION)) {
-        rsp.sendRedirect(
-            req.getContextPath()
-                + "/#"
-                + PageLinks.ADMIN_PROJECTS
-                + "?filter="
-                + Url.encode(params.get("pf") + "/"));
-        return;
-      }
-    }
-
-    String name = params.get("p");
-    if (name == null) {
-      rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
-      return;
-    }
-    if (name.endsWith(".git")) {
-      name = name.substring(0, name.length() - 4);
-    }
-
-    Project.NameKey nameKey = new Project.NameKey(name);
-    try {
-      if (projectCache.checkedGet(nameKey) == null) {
-        notFound(req, rsp);
-        return;
-      }
-      permissionBackend.user(userProvider).project(nameKey).check(ProjectPermission.READ);
-    } catch (AuthException e) {
-      notFound(req, rsp);
-      return;
-    } catch (IOException | PermissionBackendException err) {
-      log.error("cannot load " + name, err);
-      rsp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
-      return;
-    }
-
-    try (Repository repo = repoManager.openRepository(nameKey)) {
-      CacheHeaders.setNotCacheable(rsp);
-      exec(req, rsp, nameKey);
-    } catch (RepositoryNotFoundException e) {
-      getServletContext().log("Cannot open repository", e);
-      rsp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
-    }
-  }
-
-  private void notFound(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
-    if (userProvider.get().isIdentifiedUser()) {
-      rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
-    } else {
-      rsp.sendRedirect(getLoginRedirectUrl(req));
-    }
-  }
-
-  private static String getLoginRedirectUrl(HttpServletRequest req) {
-    String contextPath = req.getContextPath();
-    String loginUrl = contextPath + "/login/";
-    String token = req.getRequestURI();
-    if (!contextPath.isEmpty()) {
-      token = token.substring(contextPath.length());
-    }
-
-    String queryString = req.getQueryString();
-    if (queryString != null && !queryString.isEmpty()) {
-      token = token.concat("?" + queryString);
-    }
-    return (loginUrl + Url.encode(token));
-  }
-
-  private static Map<String, String> getParameters(HttpServletRequest req) {
-    final Map<String, String> params = new HashMap<>();
-    for (String pair : req.getQueryString().split("[&;]")) {
-      final int eq = pair.indexOf('=');
-      if (0 < eq) {
-        String name = pair.substring(0, eq);
-        String value = pair.substring(eq + 1);
-
-        name = Url.decode(name);
-        value = Url.decode(value);
-        params.put(name, value);
-      }
-    }
-    return params;
-  }
-
-  private void exec(HttpServletRequest req, HttpServletResponse rsp, Project.NameKey project)
-      throws IOException {
-    final Process proc =
-        Runtime.getRuntime()
-            .exec(
-                new String[] {gitwebCgi.toAbsolutePath().toString()},
-                makeEnv(req, project),
-                gitwebCgi.toAbsolutePath().getParent().toFile());
-
-    copyStderrToLog(proc.getErrorStream());
-    if (0 < req.getContentLength()) {
-      copyContentToCGI(req, proc.getOutputStream());
-    } else {
-      proc.getOutputStream().close();
-    }
-
-    try (InputStream in = new BufferedInputStream(proc.getInputStream(), bufferSize)) {
-      readCgiHeaders(rsp, in);
-
-      try (OutputStream out = rsp.getOutputStream()) {
-        final byte[] buf = new byte[bufferSize];
-        int n;
-        while ((n = in.read(buf)) > 0) {
-          out.write(buf, 0, n);
-        }
-      }
-    } catch (IOException e) {
-      // The browser has probably closed its input stream. We don't
-      // want to continue executing this request.
-      //
-      proc.destroy();
-      return;
-    }
-
-    try {
-      proc.waitFor();
-
-      final int status = proc.exitValue();
-      if (0 != status) {
-        log.error("Non-zero exit status ({}) from {}", status, gitwebCgi);
-        if (!rsp.isCommitted()) {
-          rsp.sendError(500);
-        }
-      }
-    } catch (InterruptedException ie) {
-      log.debug("CGI: interrupted waiting for CGI to terminate");
-    }
-  }
-
-  private String[] makeEnv(HttpServletRequest req, Project.NameKey nameKey) {
-    final EnvList env = new EnvList(_env);
-    final int contentLength = Math.max(0, req.getContentLength());
-
-    // These ones are from "The WWW Common Gateway Interface Version 1.1"
-    //
-    env.set("AUTH_TYPE", req.getAuthType());
-    env.set("CONTENT_LENGTH", Integer.toString(contentLength));
-    env.set("CONTENT_TYPE", req.getContentType());
-    env.set("GATEWAY_INTERFACE", "CGI/1.1");
-    env.set("PATH_INFO", req.getPathInfo());
-    env.set("PATH_TRANSLATED", null);
-    env.set("QUERY_STRING", req.getQueryString());
-    env.set("REMOTE_ADDR", req.getRemoteAddr());
-    env.set("REMOTE_HOST", req.getRemoteHost());
-    env.set("HTTPS", req.isSecure() ? "ON" : "OFF");
-
-    // The identity information reported about the connection by a
-    // RFC 1413 [11] request to the remote agent, if
-    // available. Servers MAY choose not to support this feature, or
-    // not to request the data for efficiency reasons.
-    // "REMOTE_IDENT" => "NYI"
-    //
-    env.set("REQUEST_METHOD", req.getMethod());
-    env.set("SCRIPT_NAME", req.getContextPath() + req.getServletPath());
-    env.set("SCRIPT_FILENAME", gitwebCgi.toAbsolutePath().toString());
-    env.set("SERVER_NAME", req.getServerName());
-    env.set("SERVER_PORT", Integer.toString(req.getServerPort()));
-    env.set("SERVER_PROTOCOL", req.getProtocol());
-    env.set("SERVER_SOFTWARE", getServletContext().getServerInfo());
-
-    final Enumeration<String> hdrs = enumerateHeaderNames(req);
-    while (hdrs.hasMoreElements()) {
-      final String name = hdrs.nextElement();
-      final String value = req.getHeader(name);
-      env.set("HTTP_" + name.toUpperCase().replace('-', '_'), value);
-    }
-
-    env.set("GERRIT_CONTEXT_PATH", req.getContextPath() + "/");
-    env.set("GERRIT_PROJECT_NAME", nameKey.get());
-
-    env.set("GITWEB_PROJECTROOT", repoManager.getBasePath(nameKey).toAbsolutePath().toString());
-
-    if (permissionBackend
-        .user(anonymousUserProvider)
-        .project(nameKey)
-        .testOrFalse(ProjectPermission.READ)) {
-      env.set("GERRIT_ANONYMOUS_READ", "1");
-    }
-
-    String remoteUser = null;
-    if (userProvider.get().isIdentifiedUser()) {
-      IdentifiedUser u = userProvider.get().asIdentifiedUser();
-      String user = u.getUserName();
-      env.set("GERRIT_USER_NAME", user);
-      if (user != null && !user.isEmpty()) {
-        remoteUser = user;
-      } else {
-        remoteUser = "account-" + u.getAccountId();
-      }
-    }
-    env.set("REMOTE_USER", remoteUser);
-
-    // Override CGI settings using alternative URI provided by gitweb.url.
-    // This is required to trick gitweb into thinking that it's served under
-    // different URL. Setting just $my_uri on the perl's side isn't enough,
-    // because few actions (atom, blobdiff_plain, commitdiff_plain) rely on
-    // URL returned by $cgi->self_url().
-    //
-    if (gitwebUrl != null) {
-      int schemePort = -1;
-
-      if (gitwebUrl.getScheme() != null) {
-        if (gitwebUrl.getScheme().equals("http")) {
-          env.set("HTTPS", "OFF");
-          schemePort = 80;
-        } else {
-          env.set("HTTPS", "ON");
-          schemePort = 443;
-        }
-      }
-
-      if (gitwebUrl.getHost() != null) {
-        env.set("SERVER_NAME", gitwebUrl.getHost());
-        env.set("HTTP_HOST", gitwebUrl.getHost());
-      }
-
-      if (gitwebUrl.getPort() != -1) {
-        env.set("SERVER_PORT", Integer.toString(gitwebUrl.getPort()));
-      } else if (schemePort != -1) {
-        env.set("SERVER_PORT", Integer.toString(schemePort));
-      }
-
-      if (gitwebUrl.getPath() != null) {
-        env.set("SCRIPT_NAME", gitwebUrl.getPath().isEmpty() ? "/" : gitwebUrl.getPath());
-      }
-    }
-
-    return env.getEnvArray();
-  }
-
-  private void copyContentToCGI(HttpServletRequest req, OutputStream dst) throws IOException {
-    final int contentLength = req.getContentLength();
-    final InputStream src = req.getInputStream();
-    new Thread(
-            () -> {
-              try {
-                try {
-                  final byte[] buf = new byte[bufferSize];
-                  int remaining = contentLength;
-                  while (0 < remaining) {
-                    final int max = Math.max(buf.length, remaining);
-                    final int n = src.read(buf, 0, max);
-                    if (n < 0) {
-                      throw new EOFException("Expected " + remaining + " more bytes");
-                    }
-                    dst.write(buf, 0, n);
-                    remaining -= n;
-                  }
-                } finally {
-                  dst.close();
-                }
-              } catch (IOException e) {
-                log.error("Unexpected error copying input to CGI", e);
-              }
-            },
-            "Gitweb-InputFeeder")
-        .start();
-  }
-
-  private void copyStderrToLog(InputStream in) {
-    new Thread(
-            () -> {
-              try (BufferedReader br =
-                  new BufferedReader(new InputStreamReader(in, ISO_8859_1.name()))) {
-                String err =
-                    br.lines()
-                        .filter(s -> !s.isEmpty())
-                        .map(s -> "CGI: " + s)
-                        .collect(Collectors.joining("\n"))
-                        .trim();
-                if (!err.isEmpty()) {
-                  log.error(err);
-                }
-              } catch (IOException e) {
-                log.error("Unexpected error copying stderr from CGI", e);
-              }
-            },
-            "Gitweb-ErrorLogger")
-        .start();
-  }
-
-  private static Enumeration<String> enumerateHeaderNames(HttpServletRequest req) {
-    return req.getHeaderNames();
-  }
-
-  private void readCgiHeaders(HttpServletResponse res, InputStream in) throws IOException {
-    String line;
-    while (!(line = readLine(in)).isEmpty()) {
-      if (line.startsWith("HTTP")) {
-        // CGI believes it is a non-parsed-header CGI. We refuse
-        // to support that here so abort.
-        //
-        throw new IOException("NPH CGI not supported: " + line);
-      }
-
-      final int sep = line.indexOf(':');
-      if (sep < 0) {
-        throw new IOException("CGI returned invalid header: " + line);
-      }
-
-      final String key = line.substring(0, sep).trim();
-      final String value = line.substring(sep + 1).trim();
-      if ("Location".equalsIgnoreCase(key)) {
-        res.sendRedirect(value);
-
-      } else if ("Status".equalsIgnoreCase(key)) {
-        final String[] token = value.split(" ");
-        final int status = Integer.parseInt(token[0]);
-        res.setStatus(status);
-
-      } else {
-        res.addHeader(key, value);
-      }
-    }
-  }
-
-  private String readLine(InputStream in) throws IOException {
-    final StringBuilder buf = new StringBuilder();
-    int b;
-    while ((b = in.read()) != -1 && b != '\n') {
-      buf.append((char) b);
-    }
-    return buf.toString().trim();
-  }
-
-  /** private utility class that manages the Environment passed to exec. */
-  private static class EnvList {
-    private Map<String, String> envMap;
-
-    EnvList() {
-      envMap = new HashMap<>();
-    }
-
-    EnvList(EnvList l) {
-      envMap = new HashMap<>(l.envMap);
-    }
-
-    /** Set a name/value pair, null values will be treated as an empty String */
-    public void set(String name, String value) {
-      if (value == null) {
-        value = "";
-      }
-      envMap.put(name, name + "=" + value);
-    }
-
-    /** Get representation suitable for passing to exec. */
-    public String[] getEnvArray() {
-      return envMap.values().toArray(new String[envMap.size()]);
-    }
-
-    @Override
-    public String toString() {
-      return envMap.toString();
-    }
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java
deleted file mode 100644
index 9b55042..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java
+++ /dev/null
@@ -1,745 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.httpd.plugins;
-
-import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS;
-import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS;
-import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN;
-import static com.google.common.net.HttpHeaders.ORIGIN;
-import static com.google.common.net.HttpHeaders.VARY;
-import static com.google.gerrit.common.FileUtil.lastModified;
-import static com.google.gerrit.server.plugins.PluginEntry.ATTR_CHARACTER_ENCODING;
-import static com.google.gerrit.server.plugins.PluginEntry.ATTR_CONTENT_TYPE;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.base.CharMatcher;
-import com.google.common.base.Joiner;
-import com.google.common.base.Splitter;
-import com.google.common.base.Strings;
-import com.google.common.cache.Cache;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.io.ByteStreams;
-import com.google.common.net.HttpHeaders;
-import com.google.gerrit.extensions.registration.RegistrationHandle;
-import com.google.gerrit.httpd.resources.Resource;
-import com.google.gerrit.httpd.resources.ResourceKey;
-import com.google.gerrit.httpd.resources.SmallResource;
-import com.google.gerrit.httpd.restapi.RestApiServlet;
-import com.google.gerrit.server.config.CanonicalWebUrl;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.documentation.MarkdownFormatter;
-import com.google.gerrit.server.mime.MimeUtilFileTypeRegistry;
-import com.google.gerrit.server.plugins.Plugin;
-import com.google.gerrit.server.plugins.Plugin.ApiType;
-import com.google.gerrit.server.plugins.PluginContentScanner;
-import com.google.gerrit.server.plugins.PluginEntry;
-import com.google.gerrit.server.plugins.PluginsCollection;
-import com.google.gerrit.server.plugins.ReloadPluginListener;
-import com.google.gerrit.server.plugins.StartPluginListener;
-import com.google.gerrit.server.ssh.SshInfo;
-import com.google.gerrit.util.http.RequestUtil;
-import com.google.gwtexpui.server.CacheHeaders;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import com.google.inject.name.Named;
-import com.google.inject.servlet.GuiceFilter;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
-import java.nio.charset.Charset;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Optional;
-import java.util.concurrent.ConcurrentMap;
-import java.util.function.Predicate;
-import java.util.jar.Attributes;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import javax.servlet.FilterChain;
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.apache.commons.lang.StringUtils;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.util.IO;
-import org.eclipse.jgit.util.RawParseUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-class HttpPluginServlet extends HttpServlet implements StartPluginListener, ReloadPluginListener {
-  private static final int SMALL_RESOURCE = 128 * 1024;
-  private static final long serialVersionUID = 1L;
-  private static final Logger log = LoggerFactory.getLogger(HttpPluginServlet.class);
-
-  private final MimeUtilFileTypeRegistry mimeUtil;
-  private final Provider<String> webUrl;
-  private final Cache<ResourceKey, Resource> resourceCache;
-  private final String sshHost;
-  private final int sshPort;
-  private final RestApiServlet managerApi;
-
-  private List<Plugin> pending = new ArrayList<>();
-  private ContextMapper wrapper;
-  private final ConcurrentMap<String, PluginHolder> plugins = Maps.newConcurrentMap();
-  private final Pattern allowOrigin;
-
-  @Inject
-  HttpPluginServlet(
-      MimeUtilFileTypeRegistry mimeUtil,
-      @CanonicalWebUrl Provider<String> webUrl,
-      @Named(HttpPluginModule.PLUGIN_RESOURCES) Cache<ResourceKey, Resource> cache,
-      SshInfo sshInfo,
-      RestApiServlet.Globals globals,
-      PluginsCollection plugins,
-      @GerritServerConfig Config cfg) {
-    this.mimeUtil = mimeUtil;
-    this.webUrl = webUrl;
-    this.resourceCache = cache;
-    this.managerApi = new RestApiServlet(globals, plugins);
-
-    String sshHost = "review.example.com";
-    int sshPort = 29418;
-    if (!sshInfo.getHostKeys().isEmpty()) {
-      String host = sshInfo.getHostKeys().get(0).getHost();
-      int c = host.lastIndexOf(':');
-      if (0 <= c) {
-        sshHost = host.substring(0, c);
-        sshPort = Integer.parseInt(host.substring(c + 1));
-      } else {
-        sshHost = host;
-        sshPort = 22;
-      }
-    }
-    this.sshHost = sshHost;
-    this.sshPort = sshPort;
-    this.allowOrigin = makeAllowOrigin(cfg);
-  }
-
-  @Override
-  public synchronized void init(ServletConfig config) throws ServletException {
-    super.init(config);
-
-    wrapper = new ContextMapper(config.getServletContext().getContextPath());
-    for (Plugin plugin : pending) {
-      install(plugin);
-    }
-    pending = null;
-  }
-
-  @Override
-  public synchronized void onStartPlugin(Plugin plugin) {
-    if (pending != null) {
-      pending.add(plugin);
-    } else {
-      install(plugin);
-    }
-  }
-
-  @Override
-  public void onReloadPlugin(Plugin oldPlugin, Plugin newPlugin) {
-    install(newPlugin);
-  }
-
-  private void install(Plugin plugin) {
-    GuiceFilter filter = load(plugin);
-    final String name = plugin.getName();
-    final PluginHolder holder = new PluginHolder(plugin, filter);
-    plugin.add(
-        new RegistrationHandle() {
-          @Override
-          public void remove() {
-            plugins.remove(name, holder);
-          }
-        });
-    plugins.put(name, holder);
-  }
-
-  private GuiceFilter load(Plugin plugin) {
-    if (plugin.getHttpInjector() != null) {
-      final String name = plugin.getName();
-      final GuiceFilter filter;
-      try {
-        filter = plugin.getHttpInjector().getInstance(GuiceFilter.class);
-      } catch (RuntimeException e) {
-        log.warn("Plugin {} cannot load GuiceFilter", name, e);
-        return null;
-      }
-
-      try {
-        ServletContext ctx = PluginServletContext.create(plugin, wrapper.getFullPath(name));
-        filter.init(new WrappedFilterConfig(ctx));
-      } catch (ServletException e) {
-        log.warn("Plugin {} failed to initialize HTTP", name, e);
-        return null;
-      }
-
-      plugin.add(
-          new RegistrationHandle() {
-            @Override
-            public void remove() {
-              filter.destroy();
-            }
-          });
-      return filter;
-    }
-    return null;
-  }
-
-  @Override
-  public void service(HttpServletRequest req, HttpServletResponse res)
-      throws IOException, ServletException {
-    List<String> parts =
-        Lists.newArrayList(
-            Splitter.on('/')
-                .limit(3)
-                .omitEmptyStrings()
-                .split(Strings.nullToEmpty(RequestUtil.getEncodedPathInfo(req))));
-
-    if (isApiCall(req, parts)) {
-      managerApi.service(req, res);
-      return;
-    }
-
-    String name = parts.get(0);
-    final PluginHolder holder = plugins.get(name);
-    if (holder == null) {
-      CacheHeaders.setNotCacheable(res);
-      res.sendError(HttpServletResponse.SC_NOT_FOUND);
-      return;
-    }
-
-    HttpServletRequest wr = wrapper.create(req, name);
-    FilterChain chain =
-        new FilterChain() {
-          @Override
-          public void doFilter(ServletRequest req, ServletResponse res) throws IOException {
-            onDefault(holder, (HttpServletRequest) req, (HttpServletResponse) res);
-          }
-        };
-    if (holder.filter != null) {
-      holder.filter.doFilter(wr, res, chain);
-    } else {
-      chain.doFilter(wr, res);
-    }
-  }
-
-  private static boolean isApiCall(HttpServletRequest req, List<String> parts) {
-    String method = req.getMethod();
-    int cnt = parts.size();
-    return cnt == 0
-        || (cnt == 1 && ("PUT".equals(method) || "DELETE".equals(method)))
-        || (cnt == 2 && parts.get(1).startsWith("gerrit~"));
-  }
-
-  private void onDefault(PluginHolder holder, HttpServletRequest req, HttpServletResponse res)
-      throws IOException {
-    if (!"GET".equals(req.getMethod()) && !"HEAD".equals(req.getMethod())) {
-      CacheHeaders.setNotCacheable(res);
-      res.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
-      return;
-    }
-
-    String pathInfo = RequestUtil.getEncodedPathInfo(req);
-    if (pathInfo.length() < 1) {
-      Resource.NOT_FOUND.send(req, res);
-      return;
-    }
-
-    checkCors(req, res);
-
-    String file = pathInfo.substring(1);
-    PluginResourceKey key = PluginResourceKey.create(holder.plugin, file);
-    Resource rsc = resourceCache.getIfPresent(key);
-    if (rsc != null && req.getHeader(HttpHeaders.IF_MODIFIED_SINCE) == null) {
-      rsc.send(req, res);
-      return;
-    }
-
-    String uri = req.getRequestURI();
-    if ("".equals(file)) {
-      res.sendRedirect(uri + holder.docPrefix + "index.html");
-      return;
-    }
-
-    if (file.startsWith(holder.staticPrefix)) {
-      if (holder.plugin.getApiType() == ApiType.JS) {
-        sendJsPlugin(holder.plugin, key, req, res);
-      } else {
-        PluginContentScanner scanner = holder.plugin.getContentScanner();
-        Optional<PluginEntry> entry = scanner.getEntry(file);
-        if (entry.isPresent()) {
-          if (hasUpToDateCachedResource(rsc, entry.get().getTime())) {
-            rsc.send(req, res);
-          } else {
-            sendResource(scanner, entry.get(), key, res);
-          }
-        } else {
-          resourceCache.put(key, Resource.NOT_FOUND);
-          Resource.NOT_FOUND.send(req, res);
-        }
-      }
-    } else if (file.equals(holder.docPrefix.substring(0, holder.docPrefix.length() - 1))) {
-      res.sendRedirect(uri + "/index.html");
-    } else if (file.startsWith(holder.docPrefix) && file.endsWith("/")) {
-      res.sendRedirect(uri + "index.html");
-    } else if (file.startsWith(holder.docPrefix)) {
-      PluginContentScanner scanner = holder.plugin.getContentScanner();
-      Optional<PluginEntry> entry = scanner.getEntry(file);
-      if (!entry.isPresent()) {
-        entry = findSource(scanner, file);
-      }
-      if (!entry.isPresent() && file.endsWith("/index.html")) {
-        String pfx = file.substring(0, file.length() - "index.html".length());
-        long pluginLastModified = lastModified(holder.plugin.getSrcFile());
-        if (hasUpToDateCachedResource(rsc, pluginLastModified)) {
-          rsc.send(req, res);
-        } else {
-          sendAutoIndex(scanner, pfx, holder.plugin.getName(), key, res, pluginLastModified);
-        }
-      } else if (entry.isPresent() && entry.get().getName().endsWith(".md")) {
-        if (hasUpToDateCachedResource(rsc, entry.get().getTime())) {
-          rsc.send(req, res);
-        } else {
-          sendMarkdownAsHtml(scanner, entry.get(), holder.plugin.getName(), key, res);
-        }
-      } else if (entry.isPresent()) {
-        if (hasUpToDateCachedResource(rsc, entry.get().getTime())) {
-          rsc.send(req, res);
-        } else {
-          sendResource(scanner, entry.get(), key, res);
-        }
-      } else {
-        resourceCache.put(key, Resource.NOT_FOUND);
-        Resource.NOT_FOUND.send(req, res);
-      }
-    } else {
-      resourceCache.put(key, Resource.NOT_FOUND);
-      Resource.NOT_FOUND.send(req, res);
-    }
-  }
-
-  private static Pattern makeAllowOrigin(Config cfg) {
-    String[] allow = cfg.getStringList("site", null, "allowOriginRegex");
-    if (allow.length > 0) {
-      return Pattern.compile(Joiner.on('|').join(allow));
-    }
-    return null;
-  }
-
-  private void checkCors(HttpServletRequest req, HttpServletResponse res) {
-    String origin = req.getHeader(ORIGIN);
-    if (!Strings.isNullOrEmpty(origin) && isOriginAllowed(origin)) {
-      res.addHeader(VARY, ORIGIN);
-      setCorsHeaders(res, origin);
-    }
-  }
-
-  private void setCorsHeaders(HttpServletResponse res, String origin) {
-    res.setHeader(ACCESS_CONTROL_ALLOW_ORIGIN, origin);
-    res.setHeader(ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
-    res.setHeader(ACCESS_CONTROL_ALLOW_METHODS, "GET, HEAD");
-  }
-
-  private boolean isOriginAllowed(String origin) {
-    return allowOrigin == null || allowOrigin.matcher(origin).matches();
-  }
-
-  private boolean hasUpToDateCachedResource(Resource cachedResource, long lastUpdateTime) {
-    return cachedResource != null && cachedResource.isUnchanged(lastUpdateTime);
-  }
-
-  private void appendEntriesSection(
-      PluginContentScanner scanner,
-      List<PluginEntry> entries,
-      String sectionTitle,
-      StringBuilder md,
-      String prefix,
-      int nameOffset)
-      throws IOException {
-    if (!entries.isEmpty()) {
-      md.append("## ").append(sectionTitle).append(" ##\n");
-      for (PluginEntry entry : entries) {
-        String rsrc = entry.getName().substring(prefix.length());
-        String entryTitle;
-        if (rsrc.endsWith(".html")) {
-          entryTitle = rsrc.substring(nameOffset, rsrc.length() - 5).replace('-', ' ');
-        } else if (rsrc.endsWith(".md")) {
-          entryTitle = extractTitleFromMarkdown(scanner, entry);
-          if (Strings.isNullOrEmpty(entryTitle)) {
-            entryTitle = rsrc.substring(nameOffset, rsrc.length() - 3).replace('-', ' ');
-          }
-        } else {
-          entryTitle = rsrc.substring(nameOffset).replace('-', ' ');
-        }
-        md.append(String.format("* [%s](%s)\n", entryTitle, rsrc));
-      }
-      md.append("\n");
-    }
-  }
-
-  private void sendAutoIndex(
-      PluginContentScanner scanner,
-      final String prefix,
-      final String pluginName,
-      PluginResourceKey cacheKey,
-      HttpServletResponse res,
-      long lastModifiedTime)
-      throws IOException {
-    List<PluginEntry> cmds = new ArrayList<>();
-    List<PluginEntry> servlets = new ArrayList<>();
-    List<PluginEntry> restApis = new ArrayList<>();
-    List<PluginEntry> docs = new ArrayList<>();
-    PluginEntry about = null;
-
-    Predicate<PluginEntry> filter =
-        entry -> {
-          String name = entry.getName();
-          Optional<Long> size = entry.getSize();
-          if (name.startsWith(prefix)
-              && (name.endsWith(".md") || name.endsWith(".html"))
-              && size.isPresent()) {
-            if (size.get() <= 0 || size.get() > SMALL_RESOURCE) {
-              log.warn(
-                  "Plugin {}: {} omitted from document index. Size {} out of range (0,{}).",
-                  pluginName,
-                  name.substring(prefix.length()),
-                  size.get(),
-                  SMALL_RESOURCE);
-              return false;
-            }
-            return true;
-          }
-          return false;
-        };
-
-    List<PluginEntry> entries =
-        Collections.list(scanner.entries()).stream().filter(filter).collect(toList());
-    for (PluginEntry entry : entries) {
-      String name = entry.getName().substring(prefix.length());
-      if (name.startsWith("cmd-")) {
-        cmds.add(entry);
-      } else if (name.startsWith("servlet-")) {
-        servlets.add(entry);
-      } else if (name.startsWith("rest-api-")) {
-        restApis.add(entry);
-      } else if (name.startsWith("about.")) {
-        if (about == null) {
-          about = entry;
-        } else {
-          log.warn(
-              "Plugin {}: Multiple 'about' documents found; using {}",
-              pluginName,
-              about.getName().substring(prefix.length()));
-        }
-      } else {
-        docs.add(entry);
-      }
-    }
-
-    Collections.sort(cmds, PluginEntry.COMPARATOR_BY_NAME);
-    Collections.sort(docs, PluginEntry.COMPARATOR_BY_NAME);
-
-    StringBuilder md = new StringBuilder();
-    md.append(String.format("# Plugin %s #\n", pluginName));
-    md.append("\n");
-    appendPluginInfoTable(md, scanner.getManifest().getMainAttributes());
-
-    if (about != null) {
-      InputStreamReader isr = new InputStreamReader(scanner.getInputStream(about), UTF_8);
-      StringBuilder aboutContent = new StringBuilder();
-      try (BufferedReader reader = new BufferedReader(isr)) {
-        String line;
-        while ((line = reader.readLine()) != null) {
-          line = StringUtils.stripEnd(line, null);
-          if (line.isEmpty()) {
-            aboutContent.append("\n");
-          } else {
-            aboutContent.append(line).append("\n");
-          }
-        }
-      }
-
-      // Only append the About section if there was anything in it
-      if (aboutContent.toString().trim().length() > 0) {
-        md.append("## About ##\n");
-        md.append("\n").append(aboutContent);
-      }
-    }
-
-    appendEntriesSection(scanner, docs, "Documentation", md, prefix, 0);
-    appendEntriesSection(scanner, servlets, "Servlets", md, prefix, "servlet-".length());
-    appendEntriesSection(scanner, restApis, "REST APIs", md, prefix, "rest-api-".length());
-    appendEntriesSection(scanner, cmds, "Commands", md, prefix, "cmd-".length());
-
-    sendMarkdownAsHtml(md.toString(), pluginName, cacheKey, res, lastModifiedTime);
-  }
-
-  private void sendMarkdownAsHtml(
-      String md,
-      String pluginName,
-      PluginResourceKey cacheKey,
-      HttpServletResponse res,
-      long lastModifiedTime)
-      throws UnsupportedEncodingException, IOException {
-    Map<String, String> macros = new HashMap<>();
-    macros.put("PLUGIN", pluginName);
-    macros.put("SSH_HOST", sshHost);
-    macros.put("SSH_PORT", "" + sshPort);
-    String url = webUrl.get();
-    if (Strings.isNullOrEmpty(url)) {
-      url = "http://review.example.com/";
-    }
-    macros.put("URL", url);
-
-    Matcher m = Pattern.compile("(\\\\)?@([A-Z_]+)@").matcher(md);
-    StringBuffer sb = new StringBuffer();
-    while (m.find()) {
-      String key = m.group(2);
-      String val = macros.get(key);
-      if (m.group(1) != null) {
-        m.appendReplacement(sb, "@" + key + "@");
-      } else if (val != null) {
-        m.appendReplacement(sb, val);
-      } else {
-        m.appendReplacement(sb, "@" + key + "@");
-      }
-    }
-    m.appendTail(sb);
-
-    byte[] html = new MarkdownFormatter().markdownToDocHtml(sb.toString(), UTF_8.name());
-    resourceCache.put(
-        cacheKey,
-        new SmallResource(html)
-            .setContentType("text/html")
-            .setCharacterEncoding(UTF_8.name())
-            .setLastModified(lastModifiedTime));
-    res.setContentType("text/html");
-    res.setCharacterEncoding(UTF_8.name());
-    res.setContentLength(html.length);
-    res.setDateHeader("Last-Modified", lastModifiedTime);
-    res.getOutputStream().write(html);
-  }
-
-  private static void appendPluginInfoTable(StringBuilder html, Attributes main) {
-    if (main != null) {
-      String t = main.getValue(Attributes.Name.IMPLEMENTATION_TITLE);
-      String n = main.getValue(Attributes.Name.IMPLEMENTATION_VENDOR);
-      String v = main.getValue(Attributes.Name.IMPLEMENTATION_VERSION);
-      String a = main.getValue("Gerrit-ApiVersion");
-
-      html.append("<table class=\"plugin_info\">");
-      if (!Strings.isNullOrEmpty(t)) {
-        html.append("<tr><th>Name</th><td>").append(t).append("</td></tr>\n");
-      }
-      if (!Strings.isNullOrEmpty(n)) {
-        html.append("<tr><th>Vendor</th><td>").append(n).append("</td></tr>\n");
-      }
-      if (!Strings.isNullOrEmpty(v)) {
-        html.append("<tr><th>Version</th><td>").append(v).append("</td></tr>\n");
-      }
-      if (!Strings.isNullOrEmpty(a)) {
-        html.append("<tr><th>API Version</th><td>").append(a).append("</td></tr>\n");
-      }
-      html.append("</table>\n");
-    }
-  }
-
-  private static String extractTitleFromMarkdown(PluginContentScanner scanner, PluginEntry entry)
-      throws IOException {
-    String charEnc = null;
-    Map<Object, String> atts = entry.getAttrs();
-    if (atts != null) {
-      charEnc = Strings.emptyToNull(atts.get(ATTR_CHARACTER_ENCODING));
-    }
-    if (charEnc == null) {
-      charEnc = UTF_8.name();
-    }
-    return new MarkdownFormatter()
-        .extractTitleFromMarkdown(readWholeEntry(scanner, entry), charEnc);
-  }
-
-  private static Optional<PluginEntry> findSource(PluginContentScanner scanner, String file)
-      throws IOException {
-    if (file.endsWith(".html")) {
-      int d = file.lastIndexOf('.');
-      return scanner.getEntry(file.substring(0, d) + ".md");
-    }
-    return Optional.empty();
-  }
-
-  private void sendMarkdownAsHtml(
-      PluginContentScanner scanner,
-      PluginEntry entry,
-      String pluginName,
-      PluginResourceKey key,
-      HttpServletResponse res)
-      throws IOException {
-    byte[] rawmd = readWholeEntry(scanner, entry);
-    String encoding = null;
-    Map<Object, String> atts = entry.getAttrs();
-    if (atts != null) {
-      encoding = Strings.emptyToNull(atts.get(ATTR_CHARACTER_ENCODING));
-    }
-
-    String txtmd =
-        RawParseUtils.decode(Charset.forName(encoding != null ? encoding : UTF_8.name()), rawmd);
-    long time = entry.getTime();
-    if (0 < time) {
-      res.setDateHeader("Last-Modified", time);
-    }
-    sendMarkdownAsHtml(txtmd, pluginName, key, res, time);
-  }
-
-  private void sendResource(
-      PluginContentScanner scanner,
-      PluginEntry entry,
-      PluginResourceKey key,
-      HttpServletResponse res)
-      throws IOException {
-    byte[] data = null;
-    Optional<Long> size = entry.getSize();
-    if (size.isPresent() && size.get() <= SMALL_RESOURCE) {
-      data = readWholeEntry(scanner, entry);
-    }
-
-    String contentType = null;
-    String charEnc = null;
-    Map<Object, String> atts = entry.getAttrs();
-    if (atts != null) {
-      contentType = Strings.emptyToNull(atts.get(ATTR_CONTENT_TYPE));
-      charEnc = Strings.emptyToNull(atts.get(ATTR_CHARACTER_ENCODING));
-    }
-    if (contentType == null) {
-      contentType = mimeUtil.getMimeType(entry.getName(), data).toString();
-      if ("application/octet-stream".equals(contentType) && entry.getName().endsWith(".js")) {
-        contentType = "application/javascript";
-      } else if ("application/x-pointplus".equals(contentType)
-          && entry.getName().endsWith(".css")) {
-        contentType = "text/css";
-      }
-    }
-
-    long time = entry.getTime();
-    if (0 < time) {
-      res.setDateHeader("Last-Modified", time);
-    }
-    if (size.isPresent()) {
-      res.setHeader("Content-Length", size.get().toString());
-    }
-    res.setContentType(contentType);
-    if (charEnc != null) {
-      res.setCharacterEncoding(charEnc);
-    }
-    if (data != null) {
-      resourceCache.put(
-          key,
-          new SmallResource(data)
-              .setContentType(contentType)
-              .setCharacterEncoding(charEnc)
-              .setLastModified(time));
-      res.getOutputStream().write(data);
-    } else {
-      writeToResponse(res, scanner.getInputStream(entry));
-    }
-  }
-
-  private void sendJsPlugin(
-      Plugin plugin, PluginResourceKey key, HttpServletRequest req, HttpServletResponse res)
-      throws IOException {
-    Path path = plugin.getSrcFile();
-    if (req.getRequestURI().endsWith(getJsPluginPath(plugin)) && Files.exists(path)) {
-      res.setHeader("Content-Length", Long.toString(Files.size(path)));
-      if (path.toString().toLowerCase(Locale.US).endsWith(".html")) {
-        res.setContentType("text/html");
-      } else {
-        res.setContentType("application/javascript");
-      }
-      writeToResponse(res, Files.newInputStream(path));
-    } else {
-      resourceCache.put(key, Resource.NOT_FOUND);
-      Resource.NOT_FOUND.send(req, res);
-    }
-  }
-
-  private static String getJsPluginPath(Plugin plugin) {
-    return String.format(
-        "/plugins/%s/static/%s", plugin.getName(), plugin.getSrcFile().getFileName());
-  }
-
-  private void writeToResponse(HttpServletResponse res, InputStream inputStream)
-      throws IOException {
-    try (OutputStream out = res.getOutputStream();
-        InputStream in = inputStream) {
-      ByteStreams.copy(in, out);
-    }
-  }
-
-  private static byte[] readWholeEntry(PluginContentScanner scanner, PluginEntry entry)
-      throws IOException {
-    try (InputStream in = scanner.getInputStream(entry)) {
-      return IO.readWholeStream(in, entry.getSize().get().intValue()).array();
-    }
-  }
-
-  private static class PluginHolder {
-    final Plugin plugin;
-    final GuiceFilter filter;
-    final String staticPrefix;
-    final String docPrefix;
-
-    PluginHolder(Plugin plugin, GuiceFilter filter) {
-      this.plugin = plugin;
-      this.filter = filter;
-      this.staticPrefix = getPrefix(plugin, "Gerrit-HttpStaticPrefix", "static/");
-      this.docPrefix = getPrefix(plugin, "Gerrit-HttpDocumentationPrefix", "Documentation/");
-    }
-
-    private static String getPrefix(Plugin plugin, String attr, String def) {
-      Path path = plugin.getSrcFile();
-      PluginContentScanner scanner = plugin.getContentScanner();
-      if (path == null || scanner == PluginContentScanner.EMPTY) {
-        return def;
-      }
-      try {
-        String prefix = scanner.getManifest().getMainAttributes().getValue(attr);
-        if (prefix != null) {
-          return CharMatcher.is('/').trimFrom(prefix) + "/";
-        }
-        return def;
-      } catch (IOException e) {
-        log.warn("Error getting {} for plugin {}, using default", attr, plugin.getName(), e);
-        return null;
-      }
-    }
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/LfsPluginServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/LfsPluginServlet.java
deleted file mode 100644
index e13ea95..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/LfsPluginServlet.java
+++ /dev/null
@@ -1,165 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.httpd.plugins;
-
-import static com.google.gerrit.extensions.api.lfs.LfsDefinitions.CONTENTTYPE_VND_GIT_LFS_JSON;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static javax.servlet.http.HttpServletResponse.SC_NOT_IMPLEMENTED;
-
-import com.google.gerrit.extensions.registration.RegistrationHandle;
-import com.google.gerrit.httpd.resources.Resource;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.plugins.Plugin;
-import com.google.gerrit.server.plugins.ReloadPluginListener;
-import com.google.gerrit.server.plugins.StartPluginListener;
-import com.google.gwtexpui.server.CacheHeaders;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.google.inject.servlet.GuiceFilter;
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicReference;
-import javax.servlet.FilterChain;
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class LfsPluginServlet extends HttpServlet
-    implements StartPluginListener, ReloadPluginListener {
-  private static final long serialVersionUID = 1L;
-  private static final Logger log = LoggerFactory.getLogger(LfsPluginServlet.class);
-  private static final String MESSAGE_LFS_NOT_CONFIGURED =
-      "{\"message\":\"No LFS plugin is configured to handle LFS requests.\"}";
-
-  private List<Plugin> pending = new ArrayList<>();
-  private final String pluginName;
-  private final FilterChain chain;
-  private AtomicReference<GuiceFilter> filter;
-
-  @Inject
-  LfsPluginServlet(@GerritServerConfig Config cfg) {
-    this.pluginName = cfg.getString("lfs", null, "plugin");
-    this.chain =
-        new FilterChain() {
-          @Override
-          public void doFilter(ServletRequest req, ServletResponse res) throws IOException {
-            Resource.NOT_FOUND.send((HttpServletRequest) req, (HttpServletResponse) res);
-          }
-        };
-    this.filter = new AtomicReference<>();
-  }
-
-  @Override
-  protected void service(HttpServletRequest req, HttpServletResponse res)
-      throws ServletException, IOException {
-    if (filter.get() == null) {
-      responseLfsNotConfigured(res);
-      return;
-    }
-    filter.get().doFilter(req, res, chain);
-  }
-
-  @Override
-  public synchronized void init(ServletConfig config) throws ServletException {
-    super.init(config);
-
-    for (Plugin plugin : pending) {
-      install(plugin);
-    }
-    pending = null;
-  }
-
-  @Override
-  public synchronized void onStartPlugin(Plugin plugin) {
-    if (pending != null) {
-      pending.add(plugin);
-    } else {
-      install(plugin);
-    }
-  }
-
-  @Override
-  public void onReloadPlugin(Plugin oldPlugin, Plugin newPlugin) {
-    install(newPlugin);
-  }
-
-  private void responseLfsNotConfigured(HttpServletResponse res) throws IOException {
-    CacheHeaders.setNotCacheable(res);
-    res.setContentType(CONTENTTYPE_VND_GIT_LFS_JSON);
-    res.setStatus(SC_NOT_IMPLEMENTED);
-    Writer w = new BufferedWriter(new OutputStreamWriter(res.getOutputStream(), UTF_8));
-    w.write(MESSAGE_LFS_NOT_CONFIGURED);
-    w.flush();
-  }
-
-  private void install(Plugin plugin) {
-    if (!plugin.getName().equals(pluginName)) {
-      return;
-    }
-    final GuiceFilter guiceFilter = load(plugin);
-    plugin.add(
-        new RegistrationHandle() {
-          @Override
-          public void remove() {
-            filter.compareAndSet(guiceFilter, null);
-          }
-        });
-    filter.set(guiceFilter);
-  }
-
-  private GuiceFilter load(Plugin plugin) {
-    if (plugin.getHttpInjector() != null) {
-      final String name = plugin.getName();
-      final GuiceFilter guiceFilter;
-      try {
-        guiceFilter = plugin.getHttpInjector().getInstance(GuiceFilter.class);
-      } catch (RuntimeException e) {
-        log.warn("Plugin {} cannot load GuiceFilter", name, e);
-        return null;
-      }
-
-      try {
-        ServletContext ctx = PluginServletContext.create(plugin, "/");
-        guiceFilter.init(new WrappedFilterConfig(ctx));
-      } catch (ServletException e) {
-        log.warn("Plugin {} failed to initialize HTTP", name, e);
-        return null;
-      }
-
-      plugin.add(
-          new RegistrationHandle() {
-            @Override
-            public void remove() {
-              guiceFilter.destroy();
-            }
-          });
-      return guiceFilter;
-    }
-    return null;
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/PluginServletContext.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/PluginServletContext.java
deleted file mode 100644
index 8f64d9f..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/PluginServletContext.java
+++ /dev/null
@@ -1,258 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.httpd.plugins;
-
-import com.google.common.collect.Maps;
-import com.google.gerrit.common.Version;
-import com.google.gerrit.server.plugins.Plugin;
-import java.io.InputStream;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-import java.net.URL;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.Set;
-import java.util.concurrent.ConcurrentMap;
-import javax.servlet.RequestDispatcher;
-import javax.servlet.Servlet;
-import javax.servlet.ServletContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-class PluginServletContext {
-  private static final Logger log = LoggerFactory.getLogger(PluginServletContext.class);
-
-  static ServletContext create(Plugin plugin, String contextPath) {
-    return (ServletContext)
-        Proxy.newProxyInstance(
-            PluginServletContext.class.getClassLoader(),
-            new Class<?>[] {ServletContext.class, API.class},
-            new Handler(plugin, contextPath));
-  }
-
-  private PluginServletContext() {}
-
-  private static class Handler implements InvocationHandler, API {
-    private final Plugin plugin;
-    private final String contextPath;
-    private final ConcurrentMap<String, Object> attributes;
-
-    Handler(Plugin plugin, String contextPath) {
-      this.plugin = plugin;
-      this.contextPath = contextPath;
-      this.attributes = Maps.newConcurrentMap();
-    }
-
-    @Override
-    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
-      Method handler;
-      try {
-        handler = API.class.getDeclaredMethod(method.getName(), method.getParameterTypes());
-      } catch (NoSuchMethodException e) {
-        throw new NoSuchMethodError(
-            String.format(
-                "%s does not implement %s", PluginServletContext.class, method.toGenericString()));
-      }
-      return handler.invoke(this, args);
-    }
-
-    @Override
-    public String getContextPath() {
-      return contextPath;
-    }
-
-    @Override
-    public String getInitParameter(String name) {
-      return null;
-    }
-
-    @SuppressWarnings("rawtypes")
-    @Override
-    public Enumeration getInitParameterNames() {
-      return Collections.enumeration(Collections.emptyList());
-    }
-
-    @Override
-    public ServletContext getContext(String name) {
-      return null;
-    }
-
-    @Override
-    public RequestDispatcher getNamedDispatcher(String name) {
-      return null;
-    }
-
-    @Override
-    public RequestDispatcher getRequestDispatcher(String name) {
-      return null;
-    }
-
-    @Override
-    public URL getResource(String name) {
-      return null;
-    }
-
-    @Override
-    public InputStream getResourceAsStream(String name) {
-      return null;
-    }
-
-    @SuppressWarnings("rawtypes")
-    @Override
-    public Set getResourcePaths(String name) {
-      return null;
-    }
-
-    @Override
-    public Servlet getServlet(String name) {
-      return null;
-    }
-
-    @Override
-    public String getRealPath(String name) {
-      return null;
-    }
-
-    @Override
-    public String getServletContextName() {
-      return plugin.getName();
-    }
-
-    @SuppressWarnings("rawtypes")
-    @Override
-    public Enumeration getServletNames() {
-      return Collections.enumeration(Collections.emptyList());
-    }
-
-    @SuppressWarnings("rawtypes")
-    @Override
-    public Enumeration getServlets() {
-      return Collections.enumeration(Collections.emptyList());
-    }
-
-    @Override
-    public void log(Exception reason, String msg) {
-      log(msg, reason);
-    }
-
-    @Override
-    public void log(String msg) {
-      log(msg, null);
-    }
-
-    @Override
-    public void log(String msg, Throwable reason) {
-      log.warn("[plugin {}] {}", plugin.getName(), msg, reason);
-    }
-
-    @Override
-    public Object getAttribute(String name) {
-      return attributes.get(name);
-    }
-
-    @Override
-    public Enumeration<String> getAttributeNames() {
-      return Collections.enumeration(attributes.keySet());
-    }
-
-    @Override
-    public void setAttribute(String name, Object value) {
-      attributes.put(name, value);
-    }
-
-    @Override
-    public void removeAttribute(String name) {
-      attributes.remove(name);
-    }
-
-    @Override
-    public String getMimeType(String file) {
-      return null;
-    }
-
-    @Override
-    public int getMajorVersion() {
-      return 2;
-    }
-
-    @Override
-    public int getMinorVersion() {
-      return 5;
-    }
-
-    @Override
-    public String getServerInfo() {
-      String v = Version.getVersion();
-      return "Gerrit Code Review/" + (v != null ? v : "dev");
-    }
-  }
-
-  interface API {
-    String getContextPath();
-
-    String getInitParameter(String name);
-
-    @SuppressWarnings("rawtypes")
-    Enumeration getInitParameterNames();
-
-    ServletContext getContext(String name);
-
-    RequestDispatcher getNamedDispatcher(String name);
-
-    RequestDispatcher getRequestDispatcher(String name);
-
-    URL getResource(String name);
-
-    InputStream getResourceAsStream(String name);
-
-    @SuppressWarnings("rawtypes")
-    Set getResourcePaths(String name);
-
-    Servlet getServlet(String name);
-
-    String getRealPath(String name);
-
-    String getServletContextName();
-
-    @SuppressWarnings("rawtypes")
-    Enumeration getServletNames();
-
-    @SuppressWarnings("rawtypes")
-    Enumeration getServlets();
-
-    void log(Exception reason, String msg);
-
-    void log(String msg);
-
-    void log(String msg, Throwable reason);
-
-    Object getAttribute(String name);
-
-    Enumeration<String> getAttributeNames();
-
-    void setAttribute(String name, Object value);
-
-    void removeAttribute(String name);
-
-    String getMimeType(String file);
-
-    int getMajorVersion();
-
-    int getMinorVersion();
-
-    String getServerInfo();
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/BazelBuild.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/BazelBuild.java
deleted file mode 100644
index f52792c..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/BazelBuild.java
+++ /dev/null
@@ -1,165 +0,0 @@
-// 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.
-
-package com.google.gerrit.httpd.raw;
-
-import static com.google.common.base.MoreObjects.firstNonNull;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.base.Joiner;
-import com.google.common.escape.Escaper;
-import com.google.common.html.HtmlEscapers;
-import com.google.common.io.ByteStreams;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gwtexpui.server.CacheHeaders;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InterruptedIOException;
-import java.io.PrintWriter;
-import java.nio.file.Files;
-import java.nio.file.NoSuchFileException;
-import java.nio.file.Path;
-import java.util.Properties;
-import javax.servlet.http.HttpServletResponse;
-import org.eclipse.jgit.util.RawParseUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class BazelBuild {
-  private static final Logger log = LoggerFactory.getLogger(BazelBuild.class);
-
-  private final Path sourceRoot;
-
-  public BazelBuild(Path sourceRoot) {
-    this.sourceRoot = sourceRoot;
-  }
-
-  // builds the given label.
-  public void build(Label label) throws IOException, BuildFailureException {
-    ProcessBuilder proc = newBuildProcess(label);
-    proc.directory(sourceRoot.toFile()).redirectErrorStream(true);
-    log.info("building " + label.fullName());
-    long start = TimeUtil.nowMs();
-    Process rebuild = proc.start();
-    byte[] out;
-    try (InputStream in = rebuild.getInputStream()) {
-      out = ByteStreams.toByteArray(in);
-    } finally {
-      rebuild.getOutputStream().close();
-    }
-
-    int status;
-    try {
-      status = rebuild.waitFor();
-    } catch (InterruptedException e) {
-      throw new InterruptedIOException(
-          "interrupted waiting for: " + Joiner.on(' ').join(proc.command()));
-    }
-    if (status != 0) {
-      log.warn("build failed: " + new String(out, UTF_8));
-      throw new BuildFailureException(out);
-    }
-
-    long time = TimeUtil.nowMs() - start;
-    log.info(String.format("UPDATED    %s in %.3fs", label.fullName(), time / 1000.0));
-  }
-
-  // Represents a label in bazel.
-  static class Label {
-    protected final String pkg;
-    protected final String name;
-
-    public String fullName() {
-      return "//" + pkg + ":" + name;
-    }
-
-    @Override
-    public String toString() {
-      return fullName();
-    }
-
-    // Label in Bazel style.
-    Label(String pkg, String name) {
-      this.name = name;
-      this.pkg = pkg;
-    }
-  }
-
-  static class BuildFailureException extends Exception {
-    private static final long serialVersionUID = 1L;
-
-    final byte[] why;
-
-    BuildFailureException(byte[] why) {
-      this.why = why;
-    }
-
-    public void display(String rule, HttpServletResponse res) throws IOException {
-      res.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
-      res.setContentType("text/html");
-      res.setCharacterEncoding(UTF_8.name());
-      CacheHeaders.setNotCacheable(res);
-
-      Escaper html = HtmlEscapers.htmlEscaper();
-      try (PrintWriter w = res.getWriter()) {
-        w.write("<html><title>BUILD FAILED</title><body>");
-        w.format("<h1>%s FAILED</h1>", html.escape(rule));
-        w.write("<pre>");
-        w.write(html.escape(RawParseUtils.decode(why)));
-        w.write("</pre>");
-        w.write("</body></html>");
-      }
-    }
-  }
-
-  private Properties loadBuildProperties(Path propPath) throws IOException {
-    Properties properties = new Properties();
-    try (InputStream in = Files.newInputStream(propPath)) {
-      properties.load(in);
-    } catch (NoSuchFileException e) {
-      // Ignore; will be run from PATH, with a descriptive error if it fails.
-    }
-    return properties;
-  }
-
-  private ProcessBuilder newBuildProcess(Label label) throws IOException {
-    Properties properties = loadBuildProperties(sourceRoot.resolve(".bazel_path"));
-    String bazel = firstNonNull(properties.getProperty("bazel"), "bazel");
-    ProcessBuilder proc = new ProcessBuilder(bazel, "build", label.fullName());
-    if (properties.containsKey("PATH")) {
-      proc.environment().put("PATH", properties.getProperty("PATH"));
-    }
-    return proc;
-  }
-
-  /** returns the root relative path to the artifact for the given label */
-  public Path targetPath(Label l) {
-    return sourceRoot.resolve("bazel-bin").resolve(l.pkg).resolve(l.name);
-  }
-
-  /** Label for the agent specific GWT zip. */
-  public Label gwtZipLabel(String agent) {
-    return new Label("gerrit-gwtui", "ui_" + agent + ".zip");
-  }
-
-  /** Label for the polygerrit component zip. */
-  public Label polygerritComponents() {
-    return new Label("polygerrit-ui", "polygerrit_components.bower_components.zip");
-  }
-
-  /** Label for the fonts zip file. */
-  public Label fontZipLabel() {
-    return new Label("polygerrit-ui", "fonts.zip");
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/CatServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/CatServlet.java
deleted file mode 100644
index d28e582..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/CatServlet.java
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.httpd.raw;
-
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.Url;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Patch;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.edit.ChangeEdit;
-import com.google.gerrit.server.edit.ChangeEditUtil;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.Optional;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.eclipse.jgit.lib.ObjectId;
-
-/**
- * Exports a single version of a patch as a normal file download.
- *
- * <p>This can be relatively unsafe with Microsoft Internet Explorer 6.0 as the browser will (rather
- * incorrectly) treat an HTML or JavaScript file its supposed to download as though it was served by
- * this site, and will execute it with the site's own protection domain. This opens a massive
- * security hole so we package the content into a zip file.
- */
-@Singleton
-public class CatServlet extends HttpServlet {
-  private static final long serialVersionUID = 1L;
-
-  private final Provider<ReviewDb> requestDb;
-  private final Provider<CurrentUser> userProvider;
-  private final ChangeEditUtil changeEditUtil;
-  private final PatchSetUtil psUtil;
-  private final ChangeNotes.Factory changeNotesFactory;
-  private final PermissionBackend permissionBackend;
-
-  @Inject
-  CatServlet(
-      Provider<ReviewDb> sf,
-      Provider<CurrentUser> usrprv,
-      ChangeEditUtil ceu,
-      PatchSetUtil psu,
-      ChangeNotes.Factory cnf,
-      PermissionBackend pb) {
-    requestDb = sf;
-    userProvider = usrprv;
-    changeEditUtil = ceu;
-    psUtil = psu;
-    changeNotesFactory = cnf;
-    permissionBackend = pb;
-  }
-
-  @Override
-  protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
-    String keyStr = req.getPathInfo();
-
-    // We shouldn't have to do this extra decode pass, but somehow we
-    // are now receiving our "^1" suffix as "%5E1", which confuses us
-    // downstream. Other times we get our embedded "," as "%2C", which
-    // is equally bad. And yet when these happen a "%2F" is left as-is,
-    // rather than escaped as "%252F", which makes me feel really really
-    // uncomfortable with a blind decode right here.
-    //
-    keyStr = Url.decode(keyStr);
-
-    if (!keyStr.startsWith("/")) {
-      rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
-      return;
-    }
-    keyStr = keyStr.substring(1);
-
-    final Patch.Key patchKey;
-    final int side;
-    {
-      final int c = keyStr.lastIndexOf('^');
-      if (c == 0) {
-        rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
-        return;
-      }
-
-      if (c < 0) {
-        side = 0;
-      } else {
-        try {
-          side = Integer.parseInt(keyStr.substring(c + 1));
-          keyStr = keyStr.substring(0, c);
-        } catch (NumberFormatException e) {
-          rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
-          return;
-        }
-      }
-
-      try {
-        patchKey = Patch.Key.parse(keyStr);
-      } catch (NumberFormatException e) {
-        rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
-        return;
-      }
-    }
-
-    final Change.Id changeId = patchKey.getParentKey().getParentKey();
-    String revision;
-    try {
-      ChangeNotes notes = changeNotesFactory.createChecked(changeId);
-      permissionBackend
-          .user(userProvider)
-          .change(notes)
-          .database(requestDb)
-          .check(ChangePermission.READ);
-      if (patchKey.getParentKey().get() == 0) {
-        // change edit
-        Optional<ChangeEdit> edit = changeEditUtil.byChange(notes);
-        if (edit.isPresent()) {
-          revision = ObjectId.toString(edit.get().getEditCommit());
-        } else {
-          rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
-          return;
-        }
-      } else {
-        PatchSet patchSet = psUtil.get(requestDb.get(), notes, patchKey.getParentKey());
-        if (patchSet == null) {
-          rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
-          return;
-        }
-        revision = patchSet.getRevision().get();
-      }
-    } catch (NoSuchChangeException | AuthException e) {
-      rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
-      return;
-    } catch (OrmException | PermissionBackendException e) {
-      getServletContext().log("Cannot query database", e);
-      rsp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
-      return;
-    }
-
-    String path = patchKey.getFileName();
-    String restUrl =
-        String.format(
-            "%s/changes/%d/revisions/%s/files/%s/download?parent=%d",
-            req.getContextPath(), changeId.get(), revision, Url.encode(path), side);
-    rsp.sendRedirect(restUrl);
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/DirectoryGwtUiServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/DirectoryGwtUiServlet.java
deleted file mode 100644
index 0f3e342..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/DirectoryGwtUiServlet.java
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.httpd.raw;
-
-import com.google.common.cache.Cache;
-import com.google.gerrit.common.TimeUtil;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.attribute.FileTime;
-
-class DirectoryGwtUiServlet extends ResourceServlet {
-  private static final long serialVersionUID = 1L;
-
-  private static final FileTime NOW = FileTime.fromMillis(TimeUtil.nowMs());
-
-  private final Path ui;
-
-  DirectoryGwtUiServlet(Cache<Path, Resource> cache, Path unpackedWar, boolean dev)
-      throws IOException {
-    super(cache, false);
-    ui = unpackedWar.resolve("gerrit_ui");
-    if (!Files.exists(ui)) {
-      Files.createDirectory(ui);
-    }
-    if (dev) {
-      ui.toFile().deleteOnExit();
-    }
-  }
-
-  @Override
-  protected Path getResourcePath(String pathInfo) {
-    return ui.resolve(pathInfo);
-  }
-
-  @Override
-  protected FileTime getLastModifiedTime(Path p) {
-    // Return initialization time of this class, since the GWT outputs from the
-    // build process all have mtimes of 1980/1/1.
-    return NOW;
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/HostPageServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/HostPageServlet.java
deleted file mode 100644
index 9818a34..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/HostPageServlet.java
+++ /dev/null
@@ -1,409 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.httpd.raw;
-
-import static com.google.gerrit.common.FileUtil.lastModified;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.base.Strings;
-import com.google.common.hash.Hasher;
-import com.google.common.hash.Hashing;
-import com.google.common.primitives.Bytes;
-import com.google.gerrit.common.Version;
-import com.google.gerrit.common.data.HostPageData;
-import com.google.gerrit.extensions.client.DiffPreferencesInfo;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.systemstatus.MessageOfTheDay;
-import com.google.gerrit.extensions.webui.WebUiPlugin;
-import com.google.gerrit.httpd.HtmlDomUtil;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountResource;
-import com.google.gerrit.server.account.GetDiffPreferences;
-import com.google.gerrit.server.config.ConfigUtil;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.notedb.NotesMigration;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtexpui.server.CacheHeaders;
-import com.google.gwtjsonrpc.server.JsonServlet;
-import com.google.gwtjsonrpc.server.RPCServletUtils;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.StringWriter;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/** Sends the Gerrit host page to clients. */
-@Singleton
-public class HostPageServlet extends HttpServlet {
-  private static final long serialVersionUID = 1L;
-
-  private static final Logger log = LoggerFactory.getLogger(HostPageServlet.class);
-
-  private static final String HPD_ID = "gerrit_hostpagedata";
-  private static final int DEFAULT_JS_LOAD_TIMEOUT = 5000;
-
-  private final Provider<CurrentUser> currentUser;
-  private final DynamicSet<WebUiPlugin> plugins;
-  private final DynamicSet<MessageOfTheDay> messages;
-  private final HostPageData.Theme signedOutTheme;
-  private final HostPageData.Theme signedInTheme;
-  private final SitePaths site;
-  private final Document template;
-  private final String noCacheName;
-  private final boolean refreshHeaderFooter;
-  private final SiteStaticDirectoryServlet staticServlet;
-  private final boolean isNoteDbEnabled;
-  private final Integer pluginsLoadTimeout;
-  private final boolean canLoadInIFrame;
-  private final GetDiffPreferences getDiff;
-  private volatile Page page;
-
-  @Inject
-  HostPageServlet(
-      Provider<CurrentUser> cu,
-      SitePaths sp,
-      ThemeFactory themeFactory,
-      ServletContext servletContext,
-      DynamicSet<WebUiPlugin> webUiPlugins,
-      DynamicSet<MessageOfTheDay> motd,
-      @GerritServerConfig Config cfg,
-      SiteStaticDirectoryServlet ss,
-      NotesMigration migration,
-      GetDiffPreferences diffPref)
-      throws IOException, ServletException {
-    currentUser = cu;
-    plugins = webUiPlugins;
-    messages = motd;
-    signedOutTheme = themeFactory.getSignedOutTheme();
-    signedInTheme = themeFactory.getSignedInTheme();
-    site = sp;
-    refreshHeaderFooter = cfg.getBoolean("site", "refreshHeaderFooter", true);
-    staticServlet = ss;
-    isNoteDbEnabled = migration.readChanges();
-    pluginsLoadTimeout = getPluginsLoadTimeout(cfg);
-    canLoadInIFrame = cfg.getBoolean("gerrit", "canLoadInIFrame", false);
-    getDiff = diffPref;
-
-    String pageName = "HostPage.html";
-    template = HtmlDomUtil.parseFile(getClass(), pageName);
-    if (template == null) {
-      throw new FileNotFoundException("No " + pageName + " in webapp");
-    }
-
-    if (HtmlDomUtil.find(template, "gerrit_module") == null) {
-      throw new ServletException("No gerrit_module in " + pageName);
-    }
-    if (HtmlDomUtil.find(template, HPD_ID) == null) {
-      throw new ServletException("No " + HPD_ID + " in " + pageName);
-    }
-
-    String src = "gerrit_ui/gerrit_ui.nocache.js";
-    try (InputStream in = servletContext.getResourceAsStream("/" + src)) {
-      if (in != null) {
-        Hasher md = Hashing.murmur3_128().newHasher();
-        byte[] buf = new byte[1024];
-        int n;
-        while ((n = in.read(buf)) > 0) {
-          md.putBytes(buf, 0, n);
-        }
-        src += "?content=" + md.hash().toString();
-      } else {
-        log.debug("No " + src + " in webapp root; keeping noncache.js URL");
-      }
-    } catch (IOException e) {
-      throw new IOException("Failed reading " + src, e);
-    }
-
-    noCacheName = src;
-    page = new Page();
-  }
-
-  private static int getPluginsLoadTimeout(Config cfg) {
-    long cfgValue =
-        ConfigUtil.getTimeUnit(
-            cfg, "plugins", null, "jsLoadTimeout", DEFAULT_JS_LOAD_TIMEOUT, TimeUnit.MILLISECONDS);
-    if (cfgValue < 0) {
-      return 0;
-    }
-    return (int) cfgValue;
-  }
-
-  private void json(Object data, StringWriter w) {
-    JsonServlet.defaultGsonBuilder().create().toJson(data, w);
-  }
-
-  private Page get() {
-    Page p = page;
-    try {
-      if (refreshHeaderFooter && p.isStale()) {
-        p = new Page();
-        page = p;
-      }
-    } catch (IOException e) {
-      log.error("Cannot refresh site header/footer", e);
-    }
-    return p;
-  }
-
-  @Override
-  protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
-    Page.Content page = select(req);
-    StringWriter w = new StringWriter();
-    CurrentUser user = currentUser.get();
-    if (user.isIdentifiedUser()) {
-      w.write(HPD_ID + ".accountDiffPref=");
-      json(getDiffPreferences(user.asIdentifiedUser()), w);
-      w.write(";");
-
-      w.write(HPD_ID + ".theme=");
-      json(signedInTheme, w);
-      w.write(";");
-    } else {
-      w.write(HPD_ID + ".theme=");
-      json(signedOutTheme, w);
-      w.write(";");
-    }
-    plugins(w);
-    messages(w);
-
-    byte[] hpd = w.toString().getBytes(UTF_8);
-    byte[] raw = Bytes.concat(page.part1, hpd, page.part2);
-    byte[] tosend;
-    if (RPCServletUtils.acceptsGzipEncoding(req)) {
-      rsp.setHeader("Content-Encoding", "gzip");
-      tosend = HtmlDomUtil.compress(raw);
-    } else {
-      tosend = raw;
-    }
-
-    CacheHeaders.setNotCacheable(rsp);
-    rsp.setContentType("text/html");
-    rsp.setCharacterEncoding(HtmlDomUtil.ENC.name());
-    rsp.setContentLength(tosend.length);
-    try (OutputStream out = rsp.getOutputStream()) {
-      out.write(tosend);
-    }
-  }
-
-  private DiffPreferencesInfo getDiffPreferences(IdentifiedUser user) {
-    try {
-      return getDiff.apply(new AccountResource(user));
-    } catch (AuthException | ConfigInvalidException | IOException | PermissionBackendException e) {
-      log.warn("Cannot query account diff preferences", e);
-    }
-    return DiffPreferencesInfo.defaults();
-  }
-
-  private void plugins(StringWriter w) {
-    List<String> urls = new ArrayList<>();
-    for (WebUiPlugin u : plugins) {
-      urls.add(String.format("plugins/%s/%s", u.getPluginName(), u.getJavaScriptResourcePath()));
-    }
-    if (!urls.isEmpty()) {
-      w.write(HPD_ID + ".plugins=");
-      json(urls, w);
-      w.write(";");
-    }
-  }
-
-  private void messages(StringWriter w) {
-    List<HostPageData.Message> list = new ArrayList<>(2);
-    for (MessageOfTheDay motd : messages) {
-      String html = motd.getHtmlMessage();
-      if (!Strings.isNullOrEmpty(html)) {
-        HostPageData.Message m = new HostPageData.Message();
-        m.id = motd.getMessageId();
-        m.redisplay = motd.getRedisplay();
-        m.html = html;
-        list.add(m);
-      }
-    }
-    if (!list.isEmpty()) {
-      w.write(HPD_ID + ".messages=");
-      json(list, w);
-      w.write(";");
-    }
-  }
-
-  private Page.Content select(HttpServletRequest req) {
-    Page pg = get();
-    if ("1".equals(req.getParameter("dbg"))) {
-      return pg.debug;
-    }
-    return pg.opt;
-  }
-
-  private void insertETags(Element e) {
-    if ("img".equalsIgnoreCase(e.getTagName()) || "script".equalsIgnoreCase(e.getTagName())) {
-      String src = e.getAttribute("src");
-      if (src != null && src.startsWith("static/")) {
-        String name = src.substring("static/".length());
-        ResourceServlet.Resource r = staticServlet.getResource(name);
-        if (r != null) {
-          e.setAttribute("src", src + "?e=" + r.etag);
-        }
-      }
-    }
-
-    for (Node n = e.getFirstChild(); n != null; n = n.getNextSibling()) {
-      if (n instanceof Element) {
-        insertETags((Element) n);
-      }
-    }
-  }
-
-  private static class FileInfo {
-    private final Path path;
-    private final long time;
-
-    FileInfo(Path p) {
-      path = p;
-      time = lastModified(path);
-    }
-
-    boolean isStale() {
-      return time != lastModified(path);
-    }
-  }
-
-  private class Page {
-    private final FileInfo css;
-    private final FileInfo header;
-    private final FileInfo footer;
-    private final Content opt;
-    private final Content debug;
-
-    Page() throws IOException {
-      Document hostDoc = HtmlDomUtil.clone(template);
-
-      css = injectCssFile(hostDoc, "gerrit_sitecss", site.site_css);
-      header = injectXmlFile(hostDoc, "gerrit_header", site.site_header);
-      footer = injectXmlFile(hostDoc, "gerrit_footer", site.site_footer);
-
-      HostPageData pageData = new HostPageData();
-      pageData.version = Version.getVersion();
-      pageData.isNoteDbEnabled = isNoteDbEnabled;
-      pageData.pluginsLoadTimeout = pluginsLoadTimeout;
-      pageData.canLoadInIFrame = canLoadInIFrame;
-
-      StringWriter w = new StringWriter();
-      w.write("var " + HPD_ID + "=");
-      json(pageData, w);
-      w.write(";");
-
-      Element data = HtmlDomUtil.find(hostDoc, HPD_ID);
-      asScript(data);
-      data.appendChild(hostDoc.createTextNode(w.toString()));
-      data.appendChild(hostDoc.createComment(HPD_ID));
-
-      Element nocache = HtmlDomUtil.find(hostDoc, "gerrit_module");
-      asScript(nocache);
-      nocache.removeAttribute("id");
-      nocache.setAttribute("src", noCacheName);
-      opt = new Content(hostDoc);
-
-      nocache.setAttribute("src", "gerrit_ui/dbg_gerrit_ui.nocache.js");
-      debug = new Content(hostDoc);
-    }
-
-    boolean isStale() {
-      return css.isStale() || header.isStale() || footer.isStale();
-    }
-
-    private void asScript(Element scriptNode) {
-      scriptNode.setAttribute("type", "text/javascript");
-      scriptNode.setAttribute("language", "javascript");
-    }
-
-    class Content {
-      final byte[] part1;
-      final byte[] part2;
-
-      Content(Document hostDoc) throws IOException {
-        String raw = HtmlDomUtil.toString(hostDoc);
-        int p = raw.indexOf("<!--" + HPD_ID);
-        if (p < 0) {
-          throw new IOException("No tag in transformed host page HTML");
-        }
-        part1 = raw.substring(0, p).getBytes(UTF_8);
-        part2 = raw.substring(raw.indexOf('>', p) + 1).getBytes(UTF_8);
-      }
-    }
-
-    private FileInfo injectCssFile(Document hostDoc, String id, Path src) throws IOException {
-      FileInfo info = new FileInfo(src);
-      Element banner = HtmlDomUtil.find(hostDoc, id);
-      if (banner == null) {
-        return info;
-      }
-
-      while (banner.getFirstChild() != null) {
-        banner.removeChild(banner.getFirstChild());
-      }
-
-      String css = HtmlDomUtil.readFile(src.getParent(), src.getFileName().toString());
-      if (css == null) {
-        return info;
-      }
-
-      banner.appendChild(hostDoc.createCDATASection("\n" + css + "\n"));
-      return info;
-    }
-
-    private FileInfo injectXmlFile(Document hostDoc, String id, Path src) throws IOException {
-      FileInfo info = new FileInfo(src);
-      Element banner = HtmlDomUtil.find(hostDoc, id);
-      if (banner == null) {
-        return info;
-      }
-
-      while (banner.getFirstChild() != null) {
-        banner.removeChild(banner.getFirstChild());
-      }
-
-      Document html = HtmlDomUtil.parseFile(src);
-      if (html == null) {
-        return info;
-      }
-
-      Element content = html.getDocumentElement();
-      insertETags(content);
-      banner.appendChild(hostDoc.importNode(content, true));
-      return info;
-    }
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/IndexServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/IndexServlet.java
deleted file mode 100644
index db0212e..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/IndexServlet.java
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.httpd.raw;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static javax.servlet.http.HttpServletResponse.SC_OK;
-
-import com.google.common.base.Strings;
-import com.google.common.io.Resources;
-import com.google.gerrit.common.Nullable;
-import com.google.template.soy.SoyFileSet;
-import com.google.template.soy.data.SanitizedContent;
-import com.google.template.soy.data.SoyMapData;
-import com.google.template.soy.data.UnsafeSanitizedContentOrdainer;
-import com.google.template.soy.tofu.SoyTofu;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.net.URI;
-import java.net.URISyntaxException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-public class IndexServlet extends HttpServlet {
-  private static final long serialVersionUID = 1L;
-  protected final byte[] indexSource;
-
-  IndexServlet(String canonicalURL, @Nullable String cdnPath) throws URISyntaxException {
-    String resourcePath = "com/google/gerrit/httpd/raw/PolyGerritIndexHtml.soy";
-    SoyFileSet.Builder builder = SoyFileSet.builder();
-    builder.add(Resources.getResource(resourcePath));
-    SoyTofu.Renderer renderer =
-        builder
-            .build()
-            .compileToTofu()
-            .newRenderer("com.google.gerrit.httpd.raw.Index")
-            .setContentKind(SanitizedContent.ContentKind.HTML)
-            .setData(getTemplateData(canonicalURL, cdnPath));
-    indexSource = renderer.render().getBytes(UTF_8);
-  }
-
-  @Override
-  protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
-    rsp.setCharacterEncoding(UTF_8.name());
-    rsp.setContentType("text/html");
-    rsp.setStatus(SC_OK);
-    try (OutputStream w = rsp.getOutputStream()) {
-      w.write(indexSource);
-    }
-  }
-
-  static String computeCanonicalPath(String canonicalURL) throws URISyntaxException {
-    if (Strings.isNullOrEmpty(canonicalURL)) {
-      return "";
-    }
-
-    // If we serving from a sub-directory rather than root, determine the path
-    // from the cannonical web URL.
-    URI uri = new URI(canonicalURL);
-    return uri.getPath().replaceAll("/$", "");
-  }
-
-  static SoyMapData getTemplateData(String canonicalURL, String cdnPath) throws URISyntaxException {
-    String canonicalPath = computeCanonicalPath(canonicalURL);
-
-    String staticPath = "";
-    if (cdnPath != null) {
-      staticPath = cdnPath;
-    } else if (canonicalPath != null) {
-      staticPath = canonicalPath;
-    }
-
-    // The resource path must be typed as safe for use in a script src.
-    // TODO(wyatta): Upgrade this to use an appropriate safe URL type.
-    SanitizedContent sanitizedStaticPath =
-        UnsafeSanitizedContentOrdainer.ordainAsSafe(
-            staticPath, SanitizedContent.ContentKind.TRUSTED_RESOURCE_URI);
-
-    return new SoyMapData(
-        "canonicalPath", canonicalPath,
-        "staticResourcePath", sanitizedStaticPath);
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/LegacyGerritServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/LegacyGerritServlet.java
deleted file mode 100644
index c34b3cb..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/LegacyGerritServlet.java
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.httpd.raw;
-
-import com.google.gerrit.httpd.HtmlDomUtil;
-import com.google.gwtexpui.server.CacheHeaders;
-import com.google.gwtjsonrpc.server.RPCServletUtils;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.OutputStream;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * Redirects from {@code /Gerrit#foo} to {@code /#foo} in JavaScript.
- *
- * <p>This redirect exists to convert the older /Gerrit URL into the more modern URL format which
- * does not use a servlet name for the host page. We cannot do the redirect here in the server side,
- * as it would lose any history token that appears in the URL. Instead we send an HTML page which
- * instructs the browser to replace the URL, but preserve the history token.
- */
-@Singleton
-public class LegacyGerritServlet extends HttpServlet {
-  private static final long serialVersionUID = 1L;
-
-  private final byte[] raw;
-  private final byte[] compressed;
-
-  @Inject
-  LegacyGerritServlet() throws IOException {
-    final String pageName = "LegacyGerrit.html";
-    final String doc = HtmlDomUtil.readFile(getClass(), pageName);
-    if (doc == null) {
-      throw new FileNotFoundException("No " + pageName + " in webapp");
-    }
-
-    raw = doc.getBytes(HtmlDomUtil.ENC);
-    compressed = HtmlDomUtil.compress(raw);
-  }
-
-  @Override
-  protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
-    final byte[] tosend;
-    if (RPCServletUtils.acceptsGzipEncoding(req)) {
-      rsp.setHeader("Content-Encoding", "gzip");
-      tosend = compressed;
-    } else {
-      tosend = raw;
-    }
-
-    CacheHeaders.setNotCacheable(rsp);
-    rsp.setContentType("text/html");
-    rsp.setCharacterEncoding(HtmlDomUtil.ENC.name());
-    rsp.setContentLength(tosend.length);
-    try (OutputStream out = rsp.getOutputStream()) {
-      out.write(tosend);
-    }
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/PolyGerritUiServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/PolyGerritUiServlet.java
deleted file mode 100644
index c508b2d..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/PolyGerritUiServlet.java
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.httpd.raw;
-
-import com.google.common.cache.Cache;
-import com.google.gerrit.common.TimeUtil;
-import java.io.IOException;
-import java.nio.file.FileSystems;
-import java.nio.file.Path;
-import java.nio.file.attribute.FileTime;
-
-class PolyGerritUiServlet extends ResourceServlet {
-  private static final long serialVersionUID = 1L;
-
-  private static final FileTime NOW = FileTime.fromMillis(TimeUtil.nowMs());
-
-  private final Path ui;
-
-  PolyGerritUiServlet(Cache<Path, Resource> cache, Path ui) {
-    super(cache, true);
-    this.ui = ui;
-  }
-
-  @Override
-  protected Path getResourcePath(String pathInfo) {
-    return ui.resolve(pathInfo);
-  }
-
-  @Override
-  protected FileTime getLastModifiedTime(Path p) throws IOException {
-    if (ui.getFileSystem().equals(FileSystems.getDefault())) {
-      // Assets are being served from disk, so we can trust the mtime.
-      return super.getLastModifiedTime(p);
-    }
-    // Assume this FileSystem is serving from a WAR. All WAR outputs from the build process have
-    // mtimes of 1980/1/1, so we can't trust it, and return the initialization time of this class
-    // instead.
-    return NOW;
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/RecompileGwtUiFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/RecompileGwtUiFilter.java
deleted file mode 100644
index 90aedbe..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/RecompileGwtUiFilter.java
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.httpd.raw;
-
-import com.google.gwtexpui.linker.server.UserAgentRule;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.Enumeration;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-class RecompileGwtUiFilter implements Filter {
-  private final boolean gwtuiRecompile =
-      System.getProperty("gerrit.disable-gwtui-recompile") == null;
-  private final UserAgentRule rule = new UserAgentRule();
-  private final Set<String> uaInitialized = new HashSet<>();
-  private final Path unpackedWar;
-  private final BazelBuild builder;
-
-  private String lastAgent;
-  private long lastTime;
-
-  RecompileGwtUiFilter(BazelBuild builder, Path unpackedWar) {
-    this.builder = builder;
-    this.unpackedWar = unpackedWar;
-  }
-
-  @Override
-  public void doFilter(ServletRequest request, ServletResponse res, FilterChain chain)
-      throws IOException, ServletException {
-    String agent = rule.select((HttpServletRequest) request);
-    if (unpackedWar != null && (gwtuiRecompile || !uaInitialized.contains(agent))) {
-      BazelBuild.Label label = builder.gwtZipLabel(agent);
-      File zip = builder.targetPath(label).toFile();
-
-      synchronized (this) {
-        try {
-          builder.build(label);
-        } catch (BazelBuild.BuildFailureException e) {
-          e.display(label.toString(), (HttpServletResponse) res);
-          return;
-        }
-
-        if (!agent.equals(lastAgent) || lastTime != zip.lastModified()) {
-          lastAgent = agent;
-          lastTime = zip.lastModified();
-          unpack(zip, unpackedWar.toFile());
-        }
-      }
-      uaInitialized.add(agent);
-    }
-    chain.doFilter(request, res);
-  }
-
-  @Override
-  public void init(FilterConfig config) {}
-
-  @Override
-  public void destroy() {}
-
-  private static void unpack(File srcwar, File dstwar) throws IOException {
-    try (ZipFile zf = new ZipFile(srcwar)) {
-      final Enumeration<? extends ZipEntry> e = zf.entries();
-      while (e.hasMoreElements()) {
-        final ZipEntry ze = e.nextElement();
-        final String name = ze.getName();
-
-        if (ze.isDirectory()
-            || name.startsWith("WEB-INF/")
-            || name.startsWith("META-INF/")
-            || name.startsWith("com/google/gerrit/launcher/")
-            || name.equals("Main.class")) {
-          continue;
-        }
-
-        final File rawtmp = new File(dstwar, name);
-        mkdir(rawtmp.getParentFile());
-        rawtmp.deleteOnExit();
-
-        try (OutputStream rawout = Files.newOutputStream(rawtmp.toPath());
-            InputStream in = zf.getInputStream(ze)) {
-          final byte[] buf = new byte[4096];
-          int n;
-          while ((n = in.read(buf, 0, buf.length)) > 0) {
-            rawout.write(buf, 0, n);
-          }
-        }
-      }
-    }
-  }
-
-  private static void mkdir(File dir) throws IOException {
-    if (!dir.isDirectory()) {
-      mkdir(dir.getParentFile());
-      if (!dir.mkdir()) {
-        throw new IOException("Cannot mkdir " + dir.getAbsolutePath());
-      }
-      dir.deleteOnExit();
-    }
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/ResourceServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/ResourceServlet.java
deleted file mode 100644
index 3ec6bdb..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/ResourceServlet.java
+++ /dev/null
@@ -1,334 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.httpd.raw;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.net.HttpHeaders.CONTENT_ENCODING;
-import static com.google.common.net.HttpHeaders.ETAG;
-import static com.google.common.net.HttpHeaders.IF_MODIFIED_SINCE;
-import static com.google.common.net.HttpHeaders.IF_NONE_MATCH;
-import static com.google.common.net.HttpHeaders.LAST_MODIFIED;
-import static java.util.concurrent.TimeUnit.DAYS;
-import static java.util.concurrent.TimeUnit.MINUTES;
-import static javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
-import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND;
-import static javax.servlet.http.HttpServletResponse.SC_NOT_MODIFIED;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.CharMatcher;
-import com.google.common.cache.Cache;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.hash.Hashing;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.httpd.HtmlDomUtil;
-import com.google.gwtexpui.server.CacheHeaders;
-import com.google.gwtjsonrpc.server.RPCServletUtils;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.nio.file.Files;
-import java.nio.file.NoSuchFileException;
-import java.nio.file.Path;
-import java.nio.file.attribute.FileTime;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.zip.GZIPOutputStream;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Base class for serving static resources.
- *
- * <p>Supports caching, ETags, basic content type detection, and limited gzip compression.
- */
-public abstract class ResourceServlet extends HttpServlet {
-  private static final long serialVersionUID = 1L;
-
-  private static final Logger log = LoggerFactory.getLogger(ResourceServlet.class);
-
-  private static final int CACHE_FILE_SIZE_LIMIT_BYTES = 100 << 10;
-
-  private static final String JS = "application/x-javascript";
-  private static final ImmutableMap<String, String> MIME_TYPES =
-      ImmutableMap.<String, String>builder()
-          .put("css", "text/css")
-          .put("gif", "image/gif")
-          .put("htm", "text/html")
-          .put("html", "text/html")
-          .put("ico", "image/x-icon")
-          .put("jpeg", "image/jpeg")
-          .put("jpg", "image/jpeg")
-          .put("js", JS)
-          .put("pdf", "application/pdf")
-          .put("png", "image/png")
-          .put("rtf", "text/rtf")
-          .put("svg", "image/svg+xml")
-          .put("text", "text/plain")
-          .put("tif", "image/tiff")
-          .put("tiff", "image/tiff")
-          .put("txt", "text/plain")
-          .put("woff", "font/woff")
-          .put("woff2", "font/woff2")
-          .build();
-
-  protected static String contentType(String name) {
-    int dot = name.lastIndexOf('.');
-    String ext = 0 < dot ? name.substring(dot + 1) : "";
-    String type = MIME_TYPES.get(ext);
-    return type != null ? type : "application/octet-stream";
-  }
-
-  private final Cache<Path, Resource> cache;
-  private final boolean refresh;
-  private final boolean cacheOnClient;
-  private final int cacheFileSizeLimitBytes;
-
-  protected ResourceServlet(Cache<Path, Resource> cache, boolean refresh) {
-    this(cache, refresh, true, CACHE_FILE_SIZE_LIMIT_BYTES);
-  }
-
-  protected ResourceServlet(Cache<Path, Resource> cache, boolean refresh, boolean cacheOnClient) {
-    this(cache, refresh, cacheOnClient, CACHE_FILE_SIZE_LIMIT_BYTES);
-  }
-
-  @VisibleForTesting
-  ResourceServlet(
-      Cache<Path, Resource> cache,
-      boolean refresh,
-      boolean cacheOnClient,
-      int cacheFileSizeLimitBytes) {
-    this.cache = checkNotNull(cache, "cache");
-    this.refresh = refresh;
-    this.cacheOnClient = cacheOnClient;
-    this.cacheFileSizeLimitBytes = cacheFileSizeLimitBytes;
-  }
-
-  /**
-   * Get the resource path on the filesystem that should be served for this request.
-   *
-   * @param pathInfo result of {@link HttpServletRequest#getPathInfo()}.
-   * @return path where static content can be found.
-   * @throws IOException if an error occurred resolving the resource.
-   */
-  protected abstract Path getResourcePath(String pathInfo) throws IOException;
-
-  protected FileTime getLastModifiedTime(Path p) throws IOException {
-    return Files.getLastModifiedTime(p);
-  }
-
-  @Override
-  protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
-    String name;
-    if (req.getPathInfo() == null) {
-      name = "/";
-    } else {
-      name = CharMatcher.is('/').trimFrom(req.getPathInfo());
-    }
-    if (isUnreasonableName(name)) {
-      notFound(rsp);
-      return;
-    }
-    Path p = getResourcePath(name);
-    if (p == null) {
-      notFound(rsp);
-      return;
-    }
-
-    Resource r = cache.getIfPresent(p);
-    try {
-      if (r == null) {
-        if (maybeStream(p, req, rsp)) {
-          return; // Bypass cache for large resource.
-        }
-        r = cache.get(p, newLoader(p));
-      }
-      if (refresh && r.isStale(p, this)) {
-        cache.invalidate(p);
-        r = cache.get(p, newLoader(p));
-      }
-    } catch (ExecutionException e) {
-      log.warn("Cannot load static resource {}", req.getPathInfo(), e);
-      CacheHeaders.setNotCacheable(rsp);
-      rsp.setStatus(SC_INTERNAL_SERVER_ERROR);
-      return;
-    }
-    if (r == Resource.NOT_FOUND) {
-      notFound(rsp); // Cached not found response.
-      return;
-    }
-
-    String e = req.getParameter("e");
-    if (e != null && !r.etag.equals(e)) {
-      CacheHeaders.setNotCacheable(rsp);
-      rsp.setStatus(SC_NOT_FOUND);
-      return;
-    } else if (cacheOnClient && r.etag.equals(req.getHeader(IF_NONE_MATCH))) {
-      rsp.setStatus(SC_NOT_MODIFIED);
-      return;
-    }
-
-    byte[] tosend = r.raw;
-    if (!r.contentType.equals(JS) && RPCServletUtils.acceptsGzipEncoding(req)) {
-      byte[] gz = HtmlDomUtil.compress(tosend);
-      if ((gz.length + 24) < tosend.length) {
-        rsp.setHeader(CONTENT_ENCODING, "gzip");
-        tosend = gz;
-      }
-    }
-
-    if (cacheOnClient) {
-      rsp.setHeader(ETAG, r.etag);
-    } else {
-      CacheHeaders.setNotCacheable(rsp);
-    }
-    if (!CacheHeaders.hasCacheHeader(rsp)) {
-      if (e != null && r.etag.equals(e)) {
-        CacheHeaders.setCacheable(req, rsp, 360, DAYS, false);
-      } else {
-        CacheHeaders.setCacheable(req, rsp, 15, MINUTES, refresh);
-      }
-    }
-    rsp.setContentType(r.contentType);
-    rsp.setContentLength(tosend.length);
-    try (OutputStream out = rsp.getOutputStream()) {
-      out.write(tosend);
-    }
-  }
-
-  @Nullable
-  Resource getResource(String name) {
-    try {
-      Path p = getResourcePath(name);
-      if (p == null) {
-        log.warn("Path doesn't exist {}", name);
-        return null;
-      }
-      return cache.get(p, newLoader(p));
-    } catch (ExecutionException | IOException e) {
-      log.warn("Cannot load static resource {}", name, e);
-      return null;
-    }
-  }
-
-  private static void notFound(HttpServletResponse rsp) {
-    rsp.setStatus(SC_NOT_FOUND);
-    CacheHeaders.setNotCacheable(rsp);
-  }
-
-  /**
-   * Maybe stream a path to the response, depending on the properties of the file and cache headers
-   * in the request.
-   *
-   * @param p path to stream
-   * @param req HTTP request.
-   * @param rsp HTTP response.
-   * @return true if the response was written (either the file contents or an error); false if the
-   *     path is too small to stream and should be cached.
-   */
-  private boolean maybeStream(Path p, HttpServletRequest req, HttpServletResponse rsp)
-      throws IOException {
-    try {
-      if (Files.size(p) < cacheFileSizeLimitBytes) {
-        return false;
-      }
-    } catch (NoSuchFileException e) {
-      cache.put(p, Resource.NOT_FOUND);
-      notFound(rsp);
-      return true;
-    }
-
-    long lastModified = getLastModifiedTime(p).toMillis();
-    if (req.getDateHeader(IF_MODIFIED_SINCE) >= lastModified) {
-      rsp.setStatus(SC_NOT_MODIFIED);
-      return true;
-    }
-
-    if (lastModified > 0) {
-      rsp.setDateHeader(LAST_MODIFIED, lastModified);
-    }
-    if (!CacheHeaders.hasCacheHeader(rsp)) {
-      CacheHeaders.setCacheable(req, rsp, 15, MINUTES, refresh);
-    }
-    rsp.setContentType(contentType(p.toString()));
-
-    OutputStream out = rsp.getOutputStream();
-    GZIPOutputStream gz = null;
-    if (RPCServletUtils.acceptsGzipEncoding(req)) {
-      rsp.setHeader(CONTENT_ENCODING, "gzip");
-      gz = new GZIPOutputStream(out);
-      out = gz;
-    }
-    Files.copy(p, out);
-    if (gz != null) {
-      gz.finish();
-    }
-    return true;
-  }
-
-  private static boolean isUnreasonableName(String name) {
-    return name.length() < 1
-        || name.contains("\\") // no windows/dos style paths
-        || name.startsWith("../") // no "../etc/passwd"
-        || name.contains("/../") // no "foo/../etc/passwd"
-        || name.contains("/./") // "foo/./foo" is insane to ask
-        || name.contains("//"); // windows UNC path can be "//..."
-  }
-
-  private Callable<Resource> newLoader(Path p) {
-    return () -> {
-      try {
-        return new Resource(
-            getLastModifiedTime(p), contentType(p.toString()), Files.readAllBytes(p));
-      } catch (NoSuchFileException e) {
-        return Resource.NOT_FOUND;
-      }
-    };
-  }
-
-  public static class Resource {
-    static final Resource NOT_FOUND = new Resource(FileTime.fromMillis(0), "", new byte[] {});
-
-    final FileTime lastModified;
-    final String contentType;
-    final String etag;
-    final byte[] raw;
-
-    Resource(FileTime lastModified, String contentType, byte[] raw) {
-      this.lastModified = checkNotNull(lastModified, "lastModified");
-      this.contentType = checkNotNull(contentType, "contentType");
-      this.raw = checkNotNull(raw, "raw");
-      this.etag = Hashing.murmur3_128().hashBytes(raw).toString();
-    }
-
-    boolean isStale(Path p, ResourceServlet rs) throws IOException {
-      FileTime t;
-      try {
-        t = rs.getLastModifiedTime(p);
-      } catch (NoSuchFileException e) {
-        return this != NOT_FOUND;
-      }
-      return t.toMillis() == 0 || lastModified.toMillis() == 0 || !lastModified.equals(t);
-    }
-  }
-
-  public static class Weigher implements com.google.common.cache.Weigher<Path, Resource> {
-    @Override
-    public int weigh(Path p, Resource r) {
-      return 2 * p.toString().length() + r.raw.length;
-    }
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/SshInfoServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/SshInfoServlet.java
deleted file mode 100644
index d68b009..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/SshInfoServlet.java
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.httpd.raw;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.gerrit.server.ssh.SshInfo;
-import com.google.gwtexpui.server.CacheHeaders;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.jcraft.jsch.HostKey;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.List;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * Servlet hosting an SSH daemon on another port. During a standard HTTP GET request the servlet
- * returns the hostname and port number back to the client in the form <code>${host} ${port}</code>.
- *
- * <p>Use a Git URL such as <code>ssh://${email}@${host}:${port}/${path}</code>, e.g. {@code
- * ssh://sop@google.com@gerrit.com:8010/tools/gerrit.git} to access the SSH daemon itself.
- *
- * <p>Versions of Git before 1.5.3 may require setting the username and port properties in the
- * user's {@code ~/.ssh/config} file, and using a host alias through a URL such as {@code
- * gerrit-alias:/tools/gerrit.git}:
- *
- * <pre>{@code
- * Host gerrit-alias
- *  User sop@google.com
- *  Hostname gerrit.com
- *  Port 8010
- * }</pre>
- */
-@Singleton
-public class SshInfoServlet extends HttpServlet {
-  private static final long serialVersionUID = 1L;
-
-  private final SshInfo sshd;
-
-  @Inject
-  SshInfoServlet(SshInfo daemon) {
-    sshd = daemon;
-  }
-
-  @Override
-  protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
-    final List<HostKey> hostKeys = sshd.getHostKeys();
-    final String out;
-    if (!hostKeys.isEmpty()) {
-      String host = hostKeys.get(0).getHost();
-      String port = "22";
-
-      if (host.contains(":")) {
-        final int p = host.lastIndexOf(':');
-        port = host.substring(p + 1);
-        host = host.substring(0, p);
-      }
-
-      if (host.equals("*")) {
-        host = req.getServerName();
-
-      } else if (host.startsWith("[") && host.endsWith("]")) {
-        host = host.substring(1, host.length() - 1);
-      }
-
-      out = host + " " + port;
-    } else {
-      out = "NOT_AVAILABLE";
-    }
-
-    CacheHeaders.setNotCacheable(rsp);
-    rsp.setCharacterEncoding(UTF_8.name());
-    rsp.setContentType("text/plain");
-    try (PrintWriter w = rsp.getWriter()) {
-      w.write(out);
-    }
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/StaticModule.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/StaticModule.java
deleted file mode 100644
index 369ad48..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/StaticModule.java
+++ /dev/null
@@ -1,602 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.httpd.raw;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkState;
-import static java.nio.file.Files.exists;
-import static java.nio.file.Files.isReadable;
-
-import com.google.common.cache.Cache;
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.client.UiType;
-import com.google.gerrit.httpd.XsrfCookieFilter;
-import com.google.gerrit.httpd.raw.ResourceServlet.Resource;
-import com.google.gerrit.launcher.GerritLauncher;
-import com.google.gerrit.server.cache.CacheModule;
-import com.google.gerrit.server.config.CanonicalWebUrl;
-import com.google.gerrit.server.config.GerritOptions;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.inject.Inject;
-import com.google.inject.Key;
-import com.google.inject.Provides;
-import com.google.inject.ProvisionException;
-import com.google.inject.Singleton;
-import com.google.inject.name.Named;
-import com.google.inject.name.Names;
-import com.google.inject.servlet.ServletModule;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.net.URISyntaxException;
-import java.nio.file.FileSystem;
-import java.nio.file.Path;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletRequestWrapper;
-import javax.servlet.http.HttpServletResponse;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class StaticModule extends ServletModule {
-  private static final Logger log = LoggerFactory.getLogger(StaticModule.class);
-
-  public static final String CACHE = "static_content";
-  public static final String GERRIT_UI_COOKIE = "GERRIT_UI";
-
-  /**
-   * Paths at which we should serve the main PolyGerrit application {@code index.html}.
-   *
-   * <p>Supports {@code "/*"} as a trailing wildcard.
-   */
-  public static final ImmutableList<String> POLYGERRIT_INDEX_PATHS =
-      ImmutableList.of("/", "/c/*", "/q/*", "/x/*", "/admin/*", "/dashboard/*", "/settings/*");
-  // TODO(dborowitz): These fragments conflict with the REST API
-  // namespace, so they will need to use a different path.
-  // "/groups/*",
-  // "/projects/*");
-  //
-
-  /**
-   * Paths that should be treated as static assets when serving PolyGerrit.
-   *
-   * <p>Supports {@code "/*"} as a trailing wildcard.
-   */
-  private static final ImmutableList<String> POLYGERRIT_ASSET_PATHS =
-      ImmutableList.of(
-          "/behaviors/*",
-          "/bower_components/*",
-          "/elements/*",
-          "/fonts/*",
-          "/scripts/*",
-          "/styles/*");
-
-  private static final String DOC_SERVLET = "DocServlet";
-  private static final String FAVICON_SERVLET = "FaviconServlet";
-  private static final String GWT_UI_SERVLET = "GwtUiServlet";
-  private static final String POLYGERRIT_INDEX_SERVLET = "PolyGerritUiIndexServlet";
-  private static final String ROBOTS_TXT_SERVLET = "RobotsTxtServlet";
-
-  private static final int GERRIT_UI_COOKIE_MAX_AGE = 60 * 60 * 24 * 365;
-
-  private final GerritOptions options;
-  private Paths paths;
-
-  @Inject
-  public StaticModule(GerritOptions options) {
-    this.options = options;
-  }
-
-  @Provides
-  @Singleton
-  private Paths getPaths() {
-    if (paths == null) {
-      paths = new Paths(options);
-    }
-    return paths;
-  }
-
-  @Override
-  protected void configureServlets() {
-    serveRegex("^/Documentation$").with(named(DOC_SERVLET));
-    serveRegex("^/Documentation/$").with(named(DOC_SERVLET));
-    serveRegex("^/Documentation/(.+)$").with(named(DOC_SERVLET));
-    serve("/static/*").with(SiteStaticDirectoryServlet.class);
-    install(
-        new CacheModule() {
-          @Override
-          protected void configure() {
-            cache(CACHE, Path.class, Resource.class)
-                .maximumWeight(1 << 20)
-                .weigher(ResourceServlet.Weigher.class);
-          }
-        });
-    if (!options.headless()) {
-      install(new CoreStaticModule());
-    }
-    if (options.enablePolyGerrit()) {
-      install(new PolyGerritModule());
-    }
-    if (options.enableGwtUi()) {
-      install(new GwtUiModule());
-    }
-  }
-
-  @Provides
-  @Singleton
-  @Named(DOC_SERVLET)
-  HttpServlet getDocServlet(@Named(CACHE) Cache<Path, Resource> cache) {
-    Paths p = getPaths();
-    if (p.warFs != null) {
-      return new WarDocServlet(cache, p.warFs);
-    } else if (p.unpackedWar != null && !p.isDev()) {
-      return new DirectoryDocServlet(cache, p.unpackedWar);
-    } else {
-      return new HttpServlet() {
-        private static final long serialVersionUID = 1L;
-
-        @Override
-        protected void service(HttpServletRequest req, HttpServletResponse resp)
-            throws IOException {
-          resp.sendError(HttpServletResponse.SC_NOT_FOUND);
-        }
-      };
-    }
-  }
-
-  private class CoreStaticModule extends ServletModule {
-    @Override
-    public void configureServlets() {
-      serve("/robots.txt").with(named(ROBOTS_TXT_SERVLET));
-      serve("/favicon.ico").with(named(FAVICON_SERVLET));
-    }
-
-    @Provides
-    @Singleton
-    @Named(ROBOTS_TXT_SERVLET)
-    HttpServlet getRobotsTxtServlet(
-        @GerritServerConfig Config cfg,
-        SitePaths sitePaths,
-        @Named(CACHE) Cache<Path, Resource> cache) {
-      Path configPath = sitePaths.resolve(cfg.getString("httpd", null, "robotsFile"));
-      if (configPath != null) {
-        if (exists(configPath) && isReadable(configPath)) {
-          return new SingleFileServlet(cache, configPath, true);
-        }
-        log.warn("Cannot read httpd.robotsFile, using default");
-      }
-      Paths p = getPaths();
-      if (p.warFs != null) {
-        return new SingleFileServlet(cache, p.warFs.getPath("/robots.txt"), false);
-      }
-      return new SingleFileServlet(cache, webappSourcePath("robots.txt"), true);
-    }
-
-    @Provides
-    @Singleton
-    @Named(FAVICON_SERVLET)
-    HttpServlet getFaviconServlet(@Named(CACHE) Cache<Path, Resource> cache) {
-      Paths p = getPaths();
-      if (p.warFs != null) {
-        return new SingleFileServlet(cache, p.warFs.getPath("/favicon.ico"), false);
-      }
-      return new SingleFileServlet(cache, webappSourcePath("favicon.ico"), true);
-    }
-
-    private Path webappSourcePath(String name) {
-      Paths p = getPaths();
-      if (p.unpackedWar != null) {
-        return p.unpackedWar.resolve(name);
-      }
-      return p.sourceRoot.resolve("gerrit-war/src/main/webapp/" + name);
-    }
-  }
-
-  private class GwtUiModule extends ServletModule {
-    @Override
-    public void configureServlets() {
-      serveRegex("^/gerrit_ui/(?!rpc/)(.*)$")
-          .with(Key.get(HttpServlet.class, Names.named(GWT_UI_SERVLET)));
-      Paths p = getPaths();
-      if (p.isDev()) {
-        filter("/").through(new RecompileGwtUiFilter(p.builder, p.unpackedWar));
-      }
-    }
-
-    @Provides
-    @Singleton
-    @Named(GWT_UI_SERVLET)
-    HttpServlet getGwtUiServlet(@Named(CACHE) Cache<Path, Resource> cache) throws IOException {
-      Paths p = getPaths();
-      if (p.warFs != null) {
-        return new WarGwtUiServlet(cache, p.warFs);
-      }
-      return new DirectoryGwtUiServlet(cache, p.unpackedWar, p.isDev());
-    }
-  }
-
-  private class PolyGerritModule extends ServletModule {
-    @Override
-    public void configureServlets() {
-      for (String p : POLYGERRIT_INDEX_PATHS) {
-        // Skip XsrfCookieFilter for /, since that is already done in the GWT UI
-        // path (UrlModule).
-        if (!p.equals("/")) {
-          filter(p).through(XsrfCookieFilter.class);
-        }
-      }
-      filter("/*").through(PolyGerritFilter.class);
-    }
-
-    @Provides
-    @Singleton
-    @Named(POLYGERRIT_INDEX_SERVLET)
-    HttpServlet getPolyGerritUiIndexServlet(
-        @CanonicalWebUrl @Nullable String canonicalUrl, @GerritServerConfig Config cfg)
-        throws URISyntaxException {
-      String cdnPath = cfg.getString("gerrit", null, "cdnPath");
-      return new IndexServlet(canonicalUrl, cdnPath);
-    }
-
-    @Provides
-    @Singleton
-    PolyGerritUiServlet getPolyGerritUiServlet(@Named(CACHE) Cache<Path, Resource> cache) {
-      return new PolyGerritUiServlet(cache, polyGerritBasePath());
-    }
-
-    @Provides
-    @Singleton
-    BowerComponentsDevServlet getBowerComponentsServlet(@Named(CACHE) Cache<Path, Resource> cache)
-        throws IOException {
-      return getPaths().isDev() ? new BowerComponentsDevServlet(cache, getPaths().builder) : null;
-    }
-
-    @Provides
-    @Singleton
-    FontsDevServlet getFontsServlet(@Named(CACHE) Cache<Path, Resource> cache) throws IOException {
-      return getPaths().isDev() ? new FontsDevServlet(cache, getPaths().builder) : null;
-    }
-
-    private Path polyGerritBasePath() {
-      Paths p = getPaths();
-      if (options.forcePolyGerritDev()) {
-        checkArgument(
-            p.sourceRoot != null, "no source root directory found for PolyGerrit developer mode");
-      }
-
-      if (p.isDev()) {
-        return p.sourceRoot.resolve("polygerrit-ui").resolve("app");
-      }
-
-      return p.warFs != null
-          ? p.warFs.getPath("/polygerrit_ui")
-          : p.unpackedWar.resolve("polygerrit_ui");
-    }
-  }
-
-  private static class Paths {
-    private final FileSystem warFs;
-    private final BazelBuild builder;
-    private final Path sourceRoot;
-    private final Path unpackedWar;
-    private final boolean development;
-
-    private Paths(GerritOptions options) {
-      try {
-        File launcherLoadedFrom = getLauncherLoadedFrom();
-        if (launcherLoadedFrom != null && launcherLoadedFrom.getName().endsWith(".jar")) {
-          // Special case: unpacked war archive deployed in container.
-          // The path is something like:
-          // <container>/<gerrit>/WEB-INF/lib/launcher.jar
-          // Switch to exploded war case with <container>/webapp>/<gerrit>
-          // root directory
-          warFs = null;
-          unpackedWar =
-              java.nio.file.Paths.get(
-                  launcherLoadedFrom.getParentFile().getParentFile().getParentFile().toURI());
-          sourceRoot = null;
-          development = false;
-          builder = null;
-          return;
-        }
-        warFs = getDistributionArchive(launcherLoadedFrom);
-        if (warFs == null) {
-          unpackedWar = makeWarTempDir();
-          development = true;
-        } else if (options.forcePolyGerritDev()) {
-          unpackedWar = null;
-          development = true;
-        } else {
-          unpackedWar = null;
-          development = false;
-          sourceRoot = null;
-          builder = null;
-          return;
-        }
-      } catch (IOException e) {
-        throw new ProvisionException("Error initializing static content paths", e);
-      }
-
-      sourceRoot = getSourceRootOrNull();
-      builder = new BazelBuild(sourceRoot);
-    }
-
-    private static Path getSourceRootOrNull() {
-      try {
-        return GerritLauncher.resolveInSourceRoot(".");
-      } catch (FileNotFoundException e) {
-        return null;
-      }
-    }
-
-    private FileSystem getDistributionArchive(File war) throws IOException {
-      if (war == null) {
-        return null;
-      }
-      return GerritLauncher.getZipFileSystem(war.toPath());
-    }
-
-    private File getLauncherLoadedFrom() {
-      File war;
-      try {
-        war = GerritLauncher.getDistributionArchive();
-      } catch (IOException e) {
-        if ((e instanceof FileNotFoundException)
-            && GerritLauncher.NOT_ARCHIVED.equals(e.getMessage())) {
-          return null;
-        }
-        ProvisionException pe = new ProvisionException("Error reading gerrit.war");
-        pe.initCause(e);
-        throw pe;
-      }
-      return war;
-    }
-
-    private boolean isDev() {
-      return development;
-    }
-
-    private Path makeWarTempDir() {
-      // Obtain our local temporary directory, but it comes back as a file
-      // so we have to switch it to be a directory post creation.
-      //
-      try {
-        File dstwar = GerritLauncher.createTempFile("gerrit_", "war");
-        if (!dstwar.delete() || !dstwar.mkdir()) {
-          throw new IOException("Cannot mkdir " + dstwar.getAbsolutePath());
-        }
-
-        // Jetty normally refuses to serve out of a symlinked directory, as
-        // a security feature. Try to resolve out any symlinks in the path.
-        //
-        try {
-          return dstwar.getCanonicalFile().toPath();
-        } catch (IOException e) {
-          return dstwar.getAbsoluteFile().toPath();
-        }
-      } catch (IOException e) {
-        ProvisionException pe = new ProvisionException("Cannot create war tempdir");
-        pe.initCause(e);
-        throw pe;
-      }
-    }
-  }
-
-  private static Key<HttpServlet> named(String name) {
-    return Key.get(HttpServlet.class, Names.named(name));
-  }
-
-  @Singleton
-  private static class PolyGerritFilter implements Filter {
-    private final GerritOptions options;
-    private final Paths paths;
-    private final HttpServlet polyGerritIndex;
-    private final PolyGerritUiServlet polygerritUI;
-    private final BowerComponentsDevServlet bowerComponentServlet;
-    private final FontsDevServlet fontServlet;
-
-    @Inject
-    PolyGerritFilter(
-        GerritOptions options,
-        Paths paths,
-        @Named(POLYGERRIT_INDEX_SERVLET) HttpServlet polyGerritIndex,
-        PolyGerritUiServlet polygerritUI,
-        @Nullable BowerComponentsDevServlet bowerComponentServlet,
-        @Nullable FontsDevServlet fontServlet) {
-      this.paths = paths;
-      this.options = options;
-      this.polyGerritIndex = polyGerritIndex;
-      this.polygerritUI = polygerritUI;
-      this.bowerComponentServlet = bowerComponentServlet;
-      this.fontServlet = fontServlet;
-      checkState(
-          options.enablePolyGerrit(), "can't install PolyGerritFilter when PolyGerrit is disabled");
-    }
-
-    @Override
-    public void init(FilterConfig filterConfig) throws ServletException {}
-
-    @Override
-    public void destroy() {}
-
-    @Override
-    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
-        throws IOException, ServletException {
-      HttpServletRequest req = (HttpServletRequest) request;
-      HttpServletResponse res = (HttpServletResponse) response;
-      if (handlePolyGerritParam(req, res)) {
-        return;
-      }
-      if (!isPolyGerritEnabled(req)) {
-        chain.doFilter(req, res);
-        return;
-      }
-
-      GuiceFilterRequestWrapper reqWrapper = new GuiceFilterRequestWrapper(req);
-      String path = pathInfo(req);
-
-      // Special case assets during development that are built by Buck and not
-      // served out of the source tree.
-      //
-      // In the war case, these are either inlined by vulcanize, or live under
-      // /polygerrit_ui in the war file, so we can just treat them as normal
-      // assets.
-      if (paths.isDev()) {
-        if (path.startsWith("/bower_components/")) {
-          bowerComponentServlet.service(reqWrapper, res);
-          return;
-        } else if (path.startsWith("/fonts/")) {
-          fontServlet.service(reqWrapper, res);
-          return;
-        }
-      }
-
-      if (isPolyGerritIndex(path)) {
-        polyGerritIndex.service(reqWrapper, res);
-        return;
-      }
-      if (isPolyGerritAsset(path)) {
-        polygerritUI.service(reqWrapper, res);
-        return;
-      }
-
-      chain.doFilter(req, res);
-    }
-
-    private static String pathInfo(HttpServletRequest req) {
-      String uri = req.getRequestURI();
-      String ctx = req.getContextPath();
-      return uri.startsWith(ctx) ? uri.substring(ctx.length()) : uri;
-    }
-
-    private boolean handlePolyGerritParam(HttpServletRequest req, HttpServletResponse res)
-        throws IOException {
-      if (!options.enableGwtUi() || !"GET".equals(req.getMethod())) {
-        return false;
-      }
-      boolean redirect = false;
-      String param = req.getParameter("polygerrit");
-      if ("1".equals(param)) {
-        setPolyGerritCookie(req, res, UiType.POLYGERRIT);
-        redirect = true;
-      } else if ("0".equals(param)) {
-        setPolyGerritCookie(req, res, UiType.GWT);
-        redirect = true;
-      }
-      if (redirect) {
-        // Strip polygerrit param from URL. This actually strips all params,
-        // which is a similar behavior to the JS PolyGerrit redirector code.
-        // Stripping just one param is frustratingly difficult without the use
-        // of Apache httpclient, which is a dep we don't want here:
-        // https://gerrit-review.googlesource.com/#/c/57570/57/gerrit-httpd/BUCK@32
-        res.sendRedirect(req.getRequestURL().toString());
-      }
-      return redirect;
-    }
-
-    private boolean isPolyGerritEnabled(HttpServletRequest req) {
-      return !options.enableGwtUi() || isPolyGerritCookie(req);
-    }
-
-    private boolean isPolyGerritCookie(HttpServletRequest req) {
-      UiType type = options.defaultUi();
-      Cookie[] all = req.getCookies();
-      if (all != null) {
-        for (Cookie c : all) {
-          if (GERRIT_UI_COOKIE.equals(c.getName())) {
-            UiType t = UiType.parse(c.getValue());
-            if (t != null) {
-              type = t;
-              break;
-            }
-          }
-        }
-      }
-      return type == UiType.POLYGERRIT;
-    }
-
-    private void setPolyGerritCookie(HttpServletRequest req, HttpServletResponse res, UiType pref) {
-      // Only actually set a cookie if both UIs are enabled in the server;
-      // otherwise clear it.
-      Cookie cookie = new Cookie(GERRIT_UI_COOKIE, pref.name());
-      if (options.enablePolyGerrit() && options.enableGwtUi()) {
-        cookie.setPath("/");
-        cookie.setSecure(isSecure(req));
-        cookie.setMaxAge(GERRIT_UI_COOKIE_MAX_AGE);
-      } else {
-        cookie.setValue("");
-        cookie.setMaxAge(0);
-      }
-      res.addCookie(cookie);
-    }
-
-    private static boolean isSecure(HttpServletRequest req) {
-      return req.isSecure() || "https".equals(req.getScheme());
-    }
-
-    private static boolean isPolyGerritAsset(String path) {
-      return matchPath(POLYGERRIT_ASSET_PATHS, path);
-    }
-
-    private static boolean isPolyGerritIndex(String path) {
-      return matchPath(POLYGERRIT_INDEX_PATHS, path);
-    }
-
-    private static boolean matchPath(Iterable<String> paths, String path) {
-      for (String p : paths) {
-        if (p.endsWith("/*")) {
-          if (path.regionMatches(0, p, 0, p.length() - 1)) {
-            return true;
-          }
-        } else if (p.equals(path)) {
-          return true;
-        }
-      }
-      return false;
-    }
-  }
-
-  private static class GuiceFilterRequestWrapper extends HttpServletRequestWrapper {
-    GuiceFilterRequestWrapper(HttpServletRequest req) {
-      super(req);
-    }
-
-    @Override
-    public String getPathInfo() {
-      String uri = getRequestURI();
-      String ctx = getContextPath();
-      // This is a workaround for long standing guice filter bug:
-      // https://github.com/google/guice/issues/807
-      String res = uri.startsWith(ctx) ? uri.substring(ctx.length()) : uri;
-
-      // Match the logic in the ResourceServlet, that re-add "/"
-      // for null path info
-      if ("/".equals(res)) {
-        return null;
-      }
-      return res;
-    }
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/WarDocServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/WarDocServlet.java
deleted file mode 100644
index 3f6ff25..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/WarDocServlet.java
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.httpd.raw;
-
-import com.google.common.cache.Cache;
-import com.google.gerrit.common.TimeUtil;
-import java.nio.file.FileSystem;
-import java.nio.file.Path;
-import java.nio.file.attribute.FileTime;
-
-class WarDocServlet extends ResourceServlet {
-  private static final long serialVersionUID = 1L;
-
-  private static final FileTime NOW = FileTime.fromMillis(TimeUtil.nowMs());
-
-  private final FileSystem warFs;
-
-  WarDocServlet(Cache<Path, Resource> cache, FileSystem warFs) {
-    super(cache, false);
-    this.warFs = warFs;
-  }
-
-  @Override
-  protected Path getResourcePath(String pathInfo) {
-    return warFs.getPath("/Documentation/" + pathInfo);
-  }
-
-  @Override
-  protected FileTime getLastModifiedTime(Path p) {
-    // Return initialization time of this class, since the WAR outputs from the build process all
-    // have mtimes of 1980/1/1.
-    return NOW;
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/WarGwtUiServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/WarGwtUiServlet.java
deleted file mode 100644
index ff27965..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/WarGwtUiServlet.java
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.httpd.raw;
-
-import com.google.common.cache.Cache;
-import com.google.gerrit.common.TimeUtil;
-import java.nio.file.FileSystem;
-import java.nio.file.Path;
-import java.nio.file.attribute.FileTime;
-
-class WarGwtUiServlet extends ResourceServlet {
-  private static final long serialVersionUID = 1L;
-
-  private static final FileTime NOW = FileTime.fromMillis(TimeUtil.nowMs());
-
-  private final FileSystem warFs;
-
-  WarGwtUiServlet(Cache<Path, Resource> cache, FileSystem warFs) {
-    super(cache, false);
-    this.warFs = warFs;
-  }
-
-  @Override
-  protected Path getResourcePath(String pathInfo) {
-    return warFs.getPath("/gerrit_ui/" + pathInfo);
-  }
-
-  @Override
-  protected FileTime getLastModifiedTime(Path p) {
-    // Return initialization time of this class, since the GWT outputs from the
-    // build process all have mtimes of 1980/1/1.
-    return NOW;
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/resources/Resource.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/resources/Resource.java
deleted file mode 100644
index bfa0b95..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/resources/Resource.java
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.httpd.resources;
-
-import com.google.gwtexpui.server.CacheHeaders;
-import java.io.IOException;
-import java.io.Serializable;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-public abstract class Resource implements Serializable {
-  private static final long serialVersionUID = 1L;
-
-  public static final Resource NOT_FOUND =
-      new Resource() {
-        private static final long serialVersionUID = 1L;
-
-        @Override
-        public int weigh() {
-          return 0;
-        }
-
-        @Override
-        public void send(HttpServletRequest req, HttpServletResponse res) throws IOException {
-          CacheHeaders.setNotCacheable(res);
-          res.sendError(HttpServletResponse.SC_NOT_FOUND);
-        }
-
-        @Override
-        public boolean isUnchanged(long latestModifiedDate) {
-          return false;
-        }
-
-        protected Object readResolve() {
-          return NOT_FOUND;
-        }
-      };
-
-  public abstract boolean isUnchanged(long latestModifiedDate);
-
-  public abstract int weigh();
-
-  public abstract void send(HttpServletRequest req, HttpServletResponse res) throws IOException;
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/AccessRestApiServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/AccessRestApiServlet.java
deleted file mode 100644
index 0d1e53c..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/AccessRestApiServlet.java
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.httpd.restapi;
-
-import com.google.gerrit.server.access.AccessCollection;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-
-@Singleton
-public class AccessRestApiServlet extends RestApiServlet {
-  private static final long serialVersionUID = 1L;
-
-  @Inject
-  AccessRestApiServlet(RestApiServlet.Globals globals, Provider<AccessCollection> access) {
-    super(globals, access);
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/AccountsRestApiServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/AccountsRestApiServlet.java
deleted file mode 100644
index ee57000..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/AccountsRestApiServlet.java
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.httpd.restapi;
-
-import com.google.gerrit.server.account.AccountsCollection;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-
-@Singleton
-public class AccountsRestApiServlet extends RestApiServlet {
-  private static final long serialVersionUID = 1L;
-
-  @Inject
-  AccountsRestApiServlet(RestApiServlet.Globals globals, Provider<AccountsCollection> accounts) {
-    super(globals, accounts);
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/ChangesRestApiServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/ChangesRestApiServlet.java
deleted file mode 100644
index ccafc6d..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/ChangesRestApiServlet.java
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.httpd.restapi;
-
-import com.google.gerrit.server.change.ChangesCollection;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-
-@Singleton
-public class ChangesRestApiServlet extends RestApiServlet {
-  private static final long serialVersionUID = 1L;
-
-  @Inject
-  ChangesRestApiServlet(RestApiServlet.Globals globals, Provider<ChangesCollection> changes) {
-    super(globals, changes);
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/ConfigRestApiServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/ConfigRestApiServlet.java
deleted file mode 100644
index 87df4cf..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/ConfigRestApiServlet.java
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.httpd.restapi;
-
-import com.google.gerrit.server.config.ConfigCollection;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-
-@Singleton
-public class ConfigRestApiServlet extends RestApiServlet {
-  private static final long serialVersionUID = 1L;
-
-  @Inject
-  ConfigRestApiServlet(
-      RestApiServlet.Globals globals, Provider<ConfigCollection> configCollection) {
-    super(globals, configCollection);
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/GroupsRestApiServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/GroupsRestApiServlet.java
deleted file mode 100644
index 5c7502f..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/GroupsRestApiServlet.java
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.httpd.restapi;
-
-import com.google.gerrit.server.group.GroupsCollection;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-
-@Singleton
-public class GroupsRestApiServlet extends RestApiServlet {
-  private static final long serialVersionUID = 1L;
-
-  @Inject
-  GroupsRestApiServlet(RestApiServlet.Globals globals, Provider<GroupsCollection> groups) {
-    super(globals, groups);
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/ParameterParser.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/ParameterParser.java
deleted file mode 100644
index bfaf0c7..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/ParameterParser.java
+++ /dev/null
@@ -1,298 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.httpd.restapi;
-
-import static com.google.gerrit.httpd.restapi.RestApiServlet.ALLOWED_CORS_METHODS;
-import static com.google.gerrit.httpd.restapi.RestApiServlet.XD_AUTHORIZATION;
-import static com.google.gerrit.httpd.restapi.RestApiServlet.XD_CONTENT_TYPE;
-import static com.google.gerrit.httpd.restapi.RestApiServlet.XD_METHOD;
-import static com.google.gerrit.httpd.restapi.RestApiServlet.replyBinaryResult;
-import static com.google.gerrit.httpd.restapi.RestApiServlet.replyError;
-import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Splitter;
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableListMultimap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.MultimapBuilder;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.BinaryResult;
-import com.google.gerrit.extensions.restapi.Url;
-import com.google.gerrit.server.DynamicOptions;
-import com.google.gerrit.util.cli.CmdLineParser;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonPrimitive;
-import com.google.gwtexpui.server.CacheHeaders;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import java.io.IOException;
-import java.io.StringWriter;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.kohsuke.args4j.CmdLineException;
-
-public class ParameterParser {
-  private static final ImmutableSet<String> RESERVED_KEYS =
-      ImmutableSet.of("pp", "prettyPrint", "strict", "callback", "alt", "fields");
-
-  @AutoValue
-  public abstract static class QueryParams {
-    static final String I = QueryParams.class.getName();
-
-    static QueryParams create(
-        @Nullable String accessToken,
-        @Nullable String xdMethod,
-        @Nullable String xdContentType,
-        ImmutableListMultimap<String, String> config,
-        ImmutableListMultimap<String, String> params) {
-      return new AutoValue_ParameterParser_QueryParams(
-          accessToken, xdMethod, xdContentType, config, params);
-    }
-
-    @Nullable
-    public abstract String accessToken();
-
-    @Nullable
-    abstract String xdMethod();
-
-    @Nullable
-    abstract String xdContentType();
-
-    abstract ImmutableListMultimap<String, String> config();
-
-    abstract ImmutableListMultimap<String, String> params();
-
-    boolean hasXdOverride() {
-      return xdMethod() != null || xdContentType() != null;
-    }
-  }
-
-  public static QueryParams getQueryParams(HttpServletRequest req) throws BadRequestException {
-    QueryParams qp = (QueryParams) req.getAttribute(QueryParams.I);
-    if (qp != null) {
-      return qp;
-    }
-
-    String accessToken = null;
-    String xdMethod = null;
-    String xdContentType = null;
-    ListMultimap<String, String> config = MultimapBuilder.hashKeys(4).arrayListValues().build();
-    ListMultimap<String, String> params = MultimapBuilder.hashKeys().arrayListValues().build();
-
-    String queryString = req.getQueryString();
-    if (!Strings.isNullOrEmpty(queryString)) {
-      for (String kvPair : Splitter.on('&').split(queryString)) {
-        Iterator<String> i = Splitter.on('=').limit(2).split(kvPair).iterator();
-        String key = Url.decode(i.next());
-        String val = i.hasNext() ? Url.decode(i.next()) : "";
-
-        if (XD_AUTHORIZATION.equals(key)) {
-          if (accessToken != null) {
-            throw new BadRequestException("duplicate " + XD_AUTHORIZATION);
-          }
-          accessToken = val;
-        } else if (XD_METHOD.equals(key)) {
-          if (xdMethod != null) {
-            throw new BadRequestException("duplicate " + XD_METHOD);
-          } else if (!ALLOWED_CORS_METHODS.contains(val)) {
-            throw new BadRequestException("invalid " + XD_METHOD);
-          }
-          xdMethod = val;
-        } else if (XD_CONTENT_TYPE.equals(key)) {
-          if (xdContentType != null) {
-            throw new BadRequestException("duplicate " + XD_CONTENT_TYPE);
-          }
-          xdContentType = val;
-        } else if (RESERVED_KEYS.contains(key)) {
-          config.put(key, val);
-        } else {
-          params.put(key, val);
-        }
-      }
-    }
-
-    qp =
-        QueryParams.create(
-            accessToken,
-            xdMethod,
-            xdContentType,
-            ImmutableListMultimap.copyOf(config),
-            ImmutableListMultimap.copyOf(params));
-    req.setAttribute(QueryParams.I, qp);
-    return qp;
-  }
-
-  private final CmdLineParser.Factory parserFactory;
-  private final Injector injector;
-  private final DynamicMap<DynamicOptions.DynamicBean> dynamicBeans;
-
-  @Inject
-  ParameterParser(
-      CmdLineParser.Factory pf,
-      Injector injector,
-      DynamicMap<DynamicOptions.DynamicBean> dynamicBeans) {
-    this.parserFactory = pf;
-    this.injector = injector;
-    this.dynamicBeans = dynamicBeans;
-  }
-
-  <T> boolean parse(
-      T param, ListMultimap<String, String> in, HttpServletRequest req, HttpServletResponse res)
-      throws IOException {
-    CmdLineParser clp = parserFactory.create(param);
-    DynamicOptions pluginOptions = new DynamicOptions(param, injector, dynamicBeans);
-    pluginOptions.parseDynamicBeans(clp);
-    pluginOptions.setDynamicBeans();
-    pluginOptions.onBeanParseStart();
-    try {
-      clp.parseOptionMap(in);
-    } catch (CmdLineException | NumberFormatException e) {
-      if (!clp.wasHelpRequestedByOption()) {
-        replyError(req, res, SC_BAD_REQUEST, e.getMessage(), e);
-        return false;
-      }
-    }
-
-    if (clp.wasHelpRequestedByOption()) {
-      StringWriter msg = new StringWriter();
-      clp.printQueryStringUsage(req.getRequestURI(), msg);
-      msg.write('\n');
-      msg.write('\n');
-      clp.printUsage(msg, null);
-      msg.write('\n');
-      CacheHeaders.setNotCacheable(res);
-      replyBinaryResult(req, res, BinaryResult.create(msg.toString()).setContentType("text/plain"));
-      return false;
-    }
-    pluginOptions.onBeanParseEnd();
-
-    return true;
-  }
-
-  private static Set<String> query(HttpServletRequest req) {
-    Set<String> params = new HashSet<>();
-    if (!Strings.isNullOrEmpty(req.getQueryString())) {
-      for (String kvPair : Splitter.on('&').split(req.getQueryString())) {
-        params.add(Iterables.getFirst(Splitter.on('=').limit(2).split(kvPair), null));
-      }
-    }
-    return params;
-  }
-
-  /**
-   * Convert a standard URL encoded form input into a parsed JSON tree.
-   *
-   * <p>Given an input such as:
-   *
-   * <pre>
-   * message=Does+not+compile.&labels.Verified=-1
-   * </pre>
-   *
-   * which is easily created using the curl command line tool:
-   *
-   * <pre>
-   * curl --data 'message=Does not compile.' --data labels.Verified=-1
-   * </pre>
-   *
-   * converts to a JSON object structure that is normally expected:
-   *
-   * <pre>
-   * {
-   *   "message": "Does not compile.",
-   *   "labels": {
-   *     "Verified": "-1"
-   *   }
-   * }
-   * </pre>
-   *
-   * This input can then be further processed into the Java input type expected by a view using
-   * Gson. Here we rely on Gson to perform implicit conversion of a string {@code "-1"} to a number
-   * type when the Java input type expects a number.
-   *
-   * <p>Conversion assumes any field name that does not contain {@code "."} will be a property of
-   * the top level input object. Any field with a dot will use the first segment as the top level
-   * property name naming an object, and the rest of the field name as a property in the nested
-   * object.
-   *
-   * @param req request to parse form input from and create JSON tree.
-   * @return the converted JSON object tree.
-   * @throws BadRequestException the request cannot be cast, as there are conflicting definitions
-   *     for a nested object.
-   */
-  static JsonObject formToJson(HttpServletRequest req) throws BadRequestException {
-    Map<String, String[]> map = req.getParameterMap();
-    return formToJson(map, query(req));
-  }
-
-  @VisibleForTesting
-  static JsonObject formToJson(Map<String, String[]> map, Set<String> query)
-      throws BadRequestException {
-    JsonObject inputObject = new JsonObject();
-    for (Map.Entry<String, String[]> ent : map.entrySet()) {
-      String key = ent.getKey();
-      String[] values = ent.getValue();
-
-      if (query.contains(key) || values.length == 0) {
-        // Disallow processing query parameters as input body fields.
-        // Implementations of views should avoid duplicate naming.
-        continue;
-      }
-
-      JsonObject obj = inputObject;
-      int dot = key.indexOf('.');
-      if (0 <= dot) {
-        String property = key.substring(0, dot);
-        JsonElement e = inputObject.get(property);
-        if (e == null) {
-          obj = new JsonObject();
-          inputObject.add(property, obj);
-        } else if (e.isJsonObject()) {
-          obj = e.getAsJsonObject();
-        } else {
-          throw new BadRequestException(String.format("key %s conflicts with %s", key, property));
-        }
-        key = key.substring(dot + 1);
-      }
-
-      if (obj.get(key) != null) {
-        // This error should never happen. If all form values are handled
-        // together in a single pass properties are set only once. Setting
-        // again indicates something has gone very wrong.
-        throw new BadRequestException("invalid form input, use JSON instead");
-      } else if (values.length == 1) {
-        obj.addProperty(key, values[0]);
-      } else {
-        JsonArray list = new JsonArray();
-        for (String v : values) {
-          list.add(new JsonPrimitive(v));
-        }
-        obj.add(key, list);
-      }
-    }
-    return inputObject;
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/ProjectsRestApiServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/ProjectsRestApiServlet.java
deleted file mode 100644
index f34608a..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/ProjectsRestApiServlet.java
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.httpd.restapi;
-
-import com.google.gerrit.server.project.ProjectsCollection;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-
-@Singleton
-public class ProjectsRestApiServlet extends RestApiServlet {
-  private static final long serialVersionUID = 1L;
-
-  @Inject
-  ProjectsRestApiServlet(RestApiServlet.Globals globals, Provider<ProjectsCollection> projects) {
-    super(globals, projects);
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiMetrics.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiMetrics.java
deleted file mode 100644
index 4af03a3..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiMetrics.java
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.httpd.restapi;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.httpd.restapi.RestApiServlet.ViewData;
-import com.google.gerrit.metrics.Counter1;
-import com.google.gerrit.metrics.Counter2;
-import com.google.gerrit.metrics.Description;
-import com.google.gerrit.metrics.Description.Units;
-import com.google.gerrit.metrics.Field;
-import com.google.gerrit.metrics.Histogram1;
-import com.google.gerrit.metrics.MetricMaker;
-import com.google.gerrit.metrics.Timer1;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-@Singleton
-public class RestApiMetrics {
-  private static final String[] PKGS = {
-    "com.google.gerrit.server.", "com.google.gerrit.",
-  };
-
-  final Counter1<String> count;
-  final Counter2<String, Integer> errorCount;
-  final Timer1<String> serverLatency;
-  final Histogram1<String> responseBytes;
-
-  @Inject
-  RestApiMetrics(MetricMaker metrics) {
-    Field<String> view = Field.ofString("view", "view implementation class");
-    count =
-        metrics.newCounter(
-            "http/server/rest_api/count",
-            new Description("REST API calls by view").setRate(),
-            view);
-
-    errorCount =
-        metrics.newCounter(
-            "http/server/rest_api/error_count",
-            new Description("REST API errors by view").setRate(),
-            view,
-            Field.ofInteger("error_code", "HTTP status code"));
-
-    serverLatency =
-        metrics.newTimer(
-            "http/server/rest_api/server_latency",
-            new Description("REST API call latency by view")
-                .setCumulative()
-                .setUnit(Units.MILLISECONDS),
-            view);
-
-    responseBytes =
-        metrics.newHistogram(
-            "http/server/rest_api/response_bytes",
-            new Description("Size of response on network (may be gzip compressed)")
-                .setCumulative()
-                .setUnit(Units.BYTES),
-            view);
-  }
-
-  String view(ViewData viewData) {
-    String impl = viewData.view.getClass().getName().replace('$', '.');
-    for (String p : PKGS) {
-      if (impl.startsWith(p)) {
-        impl = impl.substring(p.length());
-        break;
-      }
-    }
-    if (!Strings.isNullOrEmpty(viewData.pluginName) && !"gerrit".equals(viewData.pluginName)) {
-      impl = viewData.pluginName + '-' + impl;
-    }
-    return impl;
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java
deleted file mode 100644
index f73e27d..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java
+++ /dev/null
@@ -1,1315 +0,0 @@
-// Copyright (C) 2012 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.
-
-// WARNING: NoteDbUpdateManager cares about the package name RestApiServlet lives in.
-package com.google.gerrit.httpd.restapi;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS;
-import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS;
-import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS;
-import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN;
-import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_MAX_AGE;
-import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_REQUEST_HEADERS;
-import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD;
-import static com.google.common.net.HttpHeaders.AUTHORIZATION;
-import static com.google.common.net.HttpHeaders.CONTENT_TYPE;
-import static com.google.common.net.HttpHeaders.ORIGIN;
-import static com.google.common.net.HttpHeaders.VARY;
-import static java.math.RoundingMode.CEILING;
-import static java.nio.charset.StandardCharsets.ISO_8859_1;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.stream.Collectors.joining;
-import static javax.servlet.http.HttpServletResponse.SC_ACCEPTED;
-import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
-import static javax.servlet.http.HttpServletResponse.SC_CONFLICT;
-import static javax.servlet.http.HttpServletResponse.SC_CREATED;
-import static javax.servlet.http.HttpServletResponse.SC_FORBIDDEN;
-import static javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
-import static javax.servlet.http.HttpServletResponse.SC_METHOD_NOT_ALLOWED;
-import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND;
-import static javax.servlet.http.HttpServletResponse.SC_NOT_IMPLEMENTED;
-import static javax.servlet.http.HttpServletResponse.SC_NOT_MODIFIED;
-import static javax.servlet.http.HttpServletResponse.SC_NO_CONTENT;
-import static javax.servlet.http.HttpServletResponse.SC_OK;
-import static javax.servlet.http.HttpServletResponse.SC_PRECONDITION_FAILED;
-
-import com.google.common.base.CharMatcher;
-import com.google.common.base.Joiner;
-import com.google.common.base.Splitter;
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableListMultimap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.Lists;
-import com.google.common.io.BaseEncoding;
-import com.google.common.io.CountingOutputStream;
-import com.google.common.math.IntMath;
-import com.google.common.net.HttpHeaders;
-import com.google.gerrit.audit.AuditService;
-import com.google.gerrit.audit.ExtendedHttpAuditEvent;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.RawInputUtil;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AcceptsCreate;
-import com.google.gerrit.extensions.restapi.AcceptsDelete;
-import com.google.gerrit.extensions.restapi.AcceptsPost;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.BinaryResult;
-import com.google.gerrit.extensions.restapi.CacheControl;
-import com.google.gerrit.extensions.restapi.DefaultInput;
-import com.google.gerrit.extensions.restapi.ETagView;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.NeedsParams;
-import com.google.gerrit.extensions.restapi.NotImplementedException;
-import com.google.gerrit.extensions.restapi.PreconditionFailedException;
-import com.google.gerrit.extensions.restapi.RawInput;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestCollection;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.extensions.restapi.RestResource;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.httpd.WebSession;
-import com.google.gerrit.httpd.restapi.ParameterParser.QueryParams;
-import com.google.gerrit.server.AccessPath;
-import com.google.gerrit.server.AnonymousUser;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.OptionUtil;
-import com.google.gerrit.server.OutputFormat;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.util.http.RequestUtil;
-import com.google.gson.ExclusionStrategy;
-import com.google.gson.FieldAttributes;
-import com.google.gson.FieldNamingPolicy;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonParseException;
-import com.google.gson.JsonPrimitive;
-import com.google.gson.stream.JsonReader;
-import com.google.gson.stream.JsonToken;
-import com.google.gson.stream.JsonWriter;
-import com.google.gson.stream.MalformedJsonException;
-import com.google.gwtexpui.server.CacheHeaders;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.TypeLiteral;
-import com.google.inject.util.Providers;
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.EOFException;
-import java.io.FilterOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.concurrent.TimeUnit;
-import java.util.regex.Pattern;
-import java.util.stream.Stream;
-import java.util.zip.GZIPOutputStream;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletRequestWrapper;
-import javax.servlet.http.HttpServletResponse;
-import org.eclipse.jgit.http.server.ServletUtils;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.util.TemporaryBuffer;
-import org.eclipse.jgit.util.TemporaryBuffer.Heap;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class RestApiServlet extends HttpServlet {
-  private static final long serialVersionUID = 1L;
-  private static final Logger log = LoggerFactory.getLogger(RestApiServlet.class);
-
-  /** MIME type used for a JSON response body. */
-  private static final String JSON_TYPE = "application/json";
-
-  private static final String FORM_TYPE = "application/x-www-form-urlencoded";
-
-  // HTTP 422 Unprocessable Entity.
-  // TODO: Remove when HttpServletResponse.SC_UNPROCESSABLE_ENTITY is available
-  private static final int SC_UNPROCESSABLE_ENTITY = 422;
-  private static final String X_REQUESTED_WITH = "X-Requested-With";
-  private static final String X_GERRIT_AUTH = "X-Gerrit-Auth";
-  static final ImmutableSet<String> ALLOWED_CORS_METHODS =
-      ImmutableSet.of("GET", "HEAD", "POST", "PUT", "DELETE");
-  private static final ImmutableSet<String> ALLOWED_CORS_REQUEST_HEADERS =
-      Stream.of(AUTHORIZATION, CONTENT_TYPE, X_GERRIT_AUTH, X_REQUESTED_WITH)
-          .map(s -> s.toLowerCase(Locale.US))
-          .collect(ImmutableSet.toImmutableSet());
-
-  public static final String XD_AUTHORIZATION = "access_token";
-  public static final String XD_CONTENT_TYPE = "$ct";
-  public static final String XD_METHOD = "$m";
-
-  private static final int HEAP_EST_SIZE = 10 * 8 * 1024; // Presize 10 blocks.
-
-  /**
-   * Garbage prefix inserted before JSON output to prevent XSSI.
-   *
-   * <p>This prefix is ")]}'\n" and is designed to prevent a web browser from executing the response
-   * body if the resource URI were to be referenced using a &lt;script src="...&gt; HTML tag from
-   * another web site. Clients using the HTTP interface will need to always strip the first line of
-   * response data to remove this magic header.
-   */
-  public static final byte[] JSON_MAGIC;
-
-  static {
-    JSON_MAGIC = ")]}'\n".getBytes(UTF_8);
-  }
-
-  public static class Globals {
-    final Provider<CurrentUser> currentUser;
-    final DynamicItem<WebSession> webSession;
-    final Provider<ParameterParser> paramParser;
-    final PermissionBackend permissionBackend;
-    final AuditService auditService;
-    final RestApiMetrics metrics;
-    final Pattern allowOrigin;
-
-    @Inject
-    Globals(
-        Provider<CurrentUser> currentUser,
-        DynamicItem<WebSession> webSession,
-        Provider<ParameterParser> paramParser,
-        PermissionBackend permissionBackend,
-        AuditService auditService,
-        RestApiMetrics metrics,
-        @GerritServerConfig Config cfg) {
-      this.currentUser = currentUser;
-      this.webSession = webSession;
-      this.paramParser = paramParser;
-      this.permissionBackend = permissionBackend;
-      this.auditService = auditService;
-      this.metrics = metrics;
-      allowOrigin = makeAllowOrigin(cfg);
-    }
-
-    private static Pattern makeAllowOrigin(Config cfg) {
-      String[] allow = cfg.getStringList("site", null, "allowOriginRegex");
-      if (allow.length > 0) {
-        return Pattern.compile(Joiner.on('|').join(allow));
-      }
-      return null;
-    }
-  }
-
-  private final Globals globals;
-  private final Provider<RestCollection<RestResource, RestResource>> members;
-
-  public RestApiServlet(
-      Globals globals, RestCollection<? extends RestResource, ? extends RestResource> members) {
-    this(globals, Providers.of(members));
-  }
-
-  public RestApiServlet(
-      Globals globals,
-      Provider<? extends RestCollection<? extends RestResource, ? extends RestResource>> members) {
-    @SuppressWarnings("unchecked")
-    Provider<RestCollection<RestResource, RestResource>> n =
-        (Provider<RestCollection<RestResource, RestResource>>) checkNotNull((Object) members);
-    this.globals = globals;
-    this.members = n;
-  }
-
-  @Override
-  protected final void service(HttpServletRequest req, HttpServletResponse res)
-      throws ServletException, IOException {
-    final long startNanos = System.nanoTime();
-    long auditStartTs = TimeUtil.nowMs();
-    res.setHeader("Content-Disposition", "attachment");
-    res.setHeader("X-Content-Type-Options", "nosniff");
-    int status = SC_OK;
-    long responseBytes = -1;
-    Object result = null;
-    QueryParams qp = null;
-    Object inputRequestBody = null;
-    RestResource rsrc = TopLevelResource.INSTANCE;
-    ViewData viewData = null;
-
-    try {
-      if (isCorsPreflight(req)) {
-        doCorsPreflight(req, res);
-        return;
-      }
-
-      qp = ParameterParser.getQueryParams(req);
-      checkCors(req, res, qp.hasXdOverride());
-      if (qp.hasXdOverride()) {
-        req = applyXdOverrides(req, qp);
-      }
-      checkUserSession(req);
-
-      List<IdString> path = splitPath(req);
-      RestCollection<RestResource, RestResource> rc = members.get();
-      globals
-          .permissionBackend
-          .user(globals.currentUser)
-          .checkAny(GlobalPermission.fromAnnotation(rc.getClass()));
-
-      viewData = new ViewData(null, null);
-
-      if (path.isEmpty()) {
-        if (rc instanceof NeedsParams) {
-          ((NeedsParams) rc).setParams(qp.params());
-        }
-
-        if (isRead(req)) {
-          viewData = new ViewData(null, rc.list());
-        } else if (rc instanceof AcceptsPost && "POST".equals(req.getMethod())) {
-          @SuppressWarnings("unchecked")
-          AcceptsPost<RestResource> ac = (AcceptsPost<RestResource>) rc;
-          viewData = new ViewData(null, ac.post(rsrc));
-        } else {
-          throw new MethodNotAllowedException();
-        }
-      } else {
-        IdString id = path.remove(0);
-        try {
-          rsrc = rc.parse(rsrc, id);
-          if (path.isEmpty()) {
-            checkPreconditions(req);
-          }
-        } catch (ResourceNotFoundException e) {
-          if (rc instanceof AcceptsCreate
-              && path.isEmpty()
-              && ("POST".equals(req.getMethod()) || "PUT".equals(req.getMethod()))) {
-            @SuppressWarnings("unchecked")
-            AcceptsCreate<RestResource> ac = (AcceptsCreate<RestResource>) rc;
-            viewData = new ViewData(null, ac.create(rsrc, id));
-            status = SC_CREATED;
-          } else {
-            throw e;
-          }
-        }
-        if (viewData.view == null) {
-          viewData = view(rsrc, rc, req.getMethod(), path);
-        }
-      }
-      checkRequiresCapability(viewData);
-
-      while (viewData.view instanceof RestCollection<?, ?>) {
-        @SuppressWarnings("unchecked")
-        RestCollection<RestResource, RestResource> c =
-            (RestCollection<RestResource, RestResource>) viewData.view;
-
-        if (path.isEmpty()) {
-          if (isRead(req)) {
-            viewData = new ViewData(null, c.list());
-          } else if (c instanceof AcceptsPost && "POST".equals(req.getMethod())) {
-            @SuppressWarnings("unchecked")
-            AcceptsPost<RestResource> ac = (AcceptsPost<RestResource>) c;
-            viewData = new ViewData(null, ac.post(rsrc));
-          } else if (c instanceof AcceptsDelete && "DELETE".equals(req.getMethod())) {
-            @SuppressWarnings("unchecked")
-            AcceptsDelete<RestResource> ac = (AcceptsDelete<RestResource>) c;
-            viewData = new ViewData(null, ac.delete(rsrc, null));
-          } else {
-            throw new MethodNotAllowedException();
-          }
-          break;
-        }
-        IdString id = path.remove(0);
-        try {
-          rsrc = c.parse(rsrc, id);
-          checkPreconditions(req);
-          viewData = new ViewData(null, null);
-        } catch (ResourceNotFoundException e) {
-          if (c instanceof AcceptsCreate
-              && path.isEmpty()
-              && ("POST".equals(req.getMethod()) || "PUT".equals(req.getMethod()))) {
-            @SuppressWarnings("unchecked")
-            AcceptsCreate<RestResource> ac = (AcceptsCreate<RestResource>) c;
-            viewData = new ViewData(viewData.pluginName, ac.create(rsrc, id));
-            status = SC_CREATED;
-          } else if (c instanceof AcceptsDelete
-              && path.isEmpty()
-              && "DELETE".equals(req.getMethod())) {
-            @SuppressWarnings("unchecked")
-            AcceptsDelete<RestResource> ac = (AcceptsDelete<RestResource>) c;
-            viewData = new ViewData(viewData.pluginName, ac.delete(rsrc, id));
-            status = SC_NO_CONTENT;
-          } else {
-            throw e;
-          }
-        }
-        if (viewData.view == null) {
-          viewData = view(rsrc, c, req.getMethod(), path);
-        }
-        checkRequiresCapability(viewData);
-      }
-
-      if (notModified(req, rsrc, viewData.view)) {
-        res.sendError(SC_NOT_MODIFIED);
-        return;
-      }
-
-      if (!globals.paramParser.get().parse(viewData.view, qp.params(), req, res)) {
-        return;
-      }
-
-      if (viewData.view instanceof RestReadView<?> && isRead(req)) {
-        result = ((RestReadView<RestResource>) viewData.view).apply(rsrc);
-      } else if (viewData.view instanceof RestModifyView<?, ?>) {
-        @SuppressWarnings("unchecked")
-        RestModifyView<RestResource, Object> m =
-            (RestModifyView<RestResource, Object>) viewData.view;
-
-        Type type = inputType(m);
-        inputRequestBody = parseRequest(req, type);
-        result = m.apply(rsrc, inputRequestBody);
-        if (inputRequestBody instanceof RawInput) {
-          try (InputStream is = req.getInputStream()) {
-            ServletUtils.consumeRequestBody(is);
-          }
-        }
-      } else {
-        throw new ResourceNotFoundException();
-      }
-
-      if (result instanceof Response) {
-        @SuppressWarnings("rawtypes")
-        Response<?> r = (Response) result;
-        status = r.statusCode();
-        configureCaching(req, res, rsrc, viewData.view, r.caching());
-      } else if (result instanceof Response.Redirect) {
-        CacheHeaders.setNotCacheable(res);
-        res.sendRedirect(((Response.Redirect) result).location());
-        return;
-      } else if (result instanceof Response.Accepted) {
-        CacheHeaders.setNotCacheable(res);
-        res.setStatus(SC_ACCEPTED);
-        res.setHeader(HttpHeaders.LOCATION, ((Response.Accepted) result).location());
-        return;
-      } else {
-        CacheHeaders.setNotCacheable(res);
-      }
-      res.setStatus(status);
-
-      if (result != Response.none()) {
-        result = Response.unwrap(result);
-        if (result instanceof BinaryResult) {
-          responseBytes = replyBinaryResult(req, res, (BinaryResult) result);
-        } else {
-          responseBytes = replyJson(req, res, qp.config(), result);
-        }
-      }
-    } catch (MalformedJsonException e) {
-      responseBytes =
-          replyError(req, res, status = SC_BAD_REQUEST, "Invalid " + JSON_TYPE + " in request", e);
-    } catch (JsonParseException e) {
-      responseBytes =
-          replyError(req, res, status = SC_BAD_REQUEST, "Invalid " + JSON_TYPE + " in request", e);
-    } catch (BadRequestException e) {
-      responseBytes =
-          replyError(
-              req, res, status = SC_BAD_REQUEST, messageOr(e, "Bad Request"), e.caching(), e);
-    } catch (AuthException e) {
-      responseBytes =
-          replyError(req, res, status = SC_FORBIDDEN, messageOr(e, "Forbidden"), e.caching(), e);
-    } catch (AmbiguousViewException e) {
-      responseBytes = replyError(req, res, status = SC_NOT_FOUND, messageOr(e, "Ambiguous"), e);
-    } catch (ResourceNotFoundException e) {
-      responseBytes =
-          replyError(req, res, status = SC_NOT_FOUND, messageOr(e, "Not Found"), e.caching(), e);
-    } catch (MethodNotAllowedException e) {
-      responseBytes =
-          replyError(
-              req,
-              res,
-              status = SC_METHOD_NOT_ALLOWED,
-              messageOr(e, "Method Not Allowed"),
-              e.caching(),
-              e);
-    } catch (ResourceConflictException e) {
-      responseBytes =
-          replyError(req, res, status = SC_CONFLICT, messageOr(e, "Conflict"), e.caching(), e);
-    } catch (PreconditionFailedException e) {
-      responseBytes =
-          replyError(
-              req,
-              res,
-              status = SC_PRECONDITION_FAILED,
-              messageOr(e, "Precondition Failed"),
-              e.caching(),
-              e);
-    } catch (UnprocessableEntityException e) {
-      responseBytes =
-          replyError(
-              req,
-              res,
-              status = SC_UNPROCESSABLE_ENTITY,
-              messageOr(e, "Unprocessable Entity"),
-              e.caching(),
-              e);
-    } catch (NotImplementedException e) {
-      responseBytes =
-          replyError(req, res, status = SC_NOT_IMPLEMENTED, messageOr(e, "Not Implemented"), e);
-    } catch (Exception e) {
-      status = SC_INTERNAL_SERVER_ERROR;
-      responseBytes = handleException(e, req, res);
-    } finally {
-      String metric =
-          viewData != null && viewData.view != null ? globals.metrics.view(viewData) : "_unknown";
-      globals.metrics.count.increment(metric);
-      if (status >= SC_BAD_REQUEST) {
-        globals.metrics.errorCount.increment(metric, status);
-      }
-      if (responseBytes != -1) {
-        globals.metrics.responseBytes.record(metric, responseBytes);
-      }
-      globals.metrics.serverLatency.record(
-          metric, System.nanoTime() - startNanos, TimeUnit.NANOSECONDS);
-      globals.auditService.dispatch(
-          new ExtendedHttpAuditEvent(
-              globals.webSession.get().getSessionId(),
-              globals.currentUser.get(),
-              req,
-              auditStartTs,
-              qp != null ? qp.params() : ImmutableListMultimap.of(),
-              inputRequestBody,
-              status,
-              result,
-              rsrc,
-              viewData == null ? null : viewData.view));
-    }
-  }
-
-  private static HttpServletRequest applyXdOverrides(HttpServletRequest req, QueryParams qp)
-      throws BadRequestException {
-    if (!"POST".equals(req.getMethod())) {
-      throw new BadRequestException("POST required");
-    }
-
-    String method = qp.xdMethod();
-    String contentType = qp.xdContentType();
-    if (method.equals("POST") || method.equals("PUT")) {
-      if (!"text/plain".equals(req.getContentType())) {
-        throw new BadRequestException("invalid " + CONTENT_TYPE);
-      } else if (Strings.isNullOrEmpty(contentType)) {
-        throw new BadRequestException(XD_CONTENT_TYPE + " required");
-      }
-    }
-
-    return new HttpServletRequestWrapper(req) {
-      @Override
-      public String getMethod() {
-        return method;
-      }
-
-      @Override
-      public String getContentType() {
-        return contentType;
-      }
-    };
-  }
-
-  private void checkCors(HttpServletRequest req, HttpServletResponse res, boolean isXd)
-      throws BadRequestException {
-    String origin = req.getHeader(ORIGIN);
-    if (isXd) {
-      // Cross-domain, non-preflighted requests must come from an approved origin.
-      if (Strings.isNullOrEmpty(origin) || !isOriginAllowed(origin)) {
-        throw new BadRequestException("origin not allowed");
-      }
-      res.addHeader(VARY, ORIGIN);
-      res.setHeader(ACCESS_CONTROL_ALLOW_ORIGIN, origin);
-      res.setHeader(ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
-    } else if (!Strings.isNullOrEmpty(origin)) {
-      // All other requests must be processed, but conditionally set CORS headers.
-      if (globals.allowOrigin != null) {
-        res.addHeader(VARY, ORIGIN);
-      }
-      if (isOriginAllowed(origin)) {
-        setCorsHeaders(res, origin);
-      }
-    }
-  }
-
-  private static boolean isCorsPreflight(HttpServletRequest req) {
-    return "OPTIONS".equals(req.getMethod())
-        && !Strings.isNullOrEmpty(req.getHeader(ORIGIN))
-        && !Strings.isNullOrEmpty(req.getHeader(ACCESS_CONTROL_REQUEST_METHOD));
-  }
-
-  private void doCorsPreflight(HttpServletRequest req, HttpServletResponse res)
-      throws BadRequestException {
-    CacheHeaders.setNotCacheable(res);
-    setHeaderList(
-        res,
-        VARY,
-        ImmutableList.of(ORIGIN, ACCESS_CONTROL_REQUEST_METHOD, ACCESS_CONTROL_REQUEST_HEADERS));
-
-    String origin = req.getHeader(ORIGIN);
-    if (Strings.isNullOrEmpty(origin) || !isOriginAllowed(origin)) {
-      throw new BadRequestException("CORS not allowed");
-    }
-
-    String method = req.getHeader(ACCESS_CONTROL_REQUEST_METHOD);
-    if (!ALLOWED_CORS_METHODS.contains(method)) {
-      throw new BadRequestException(method + " not allowed in CORS");
-    }
-
-    String headers = req.getHeader(ACCESS_CONTROL_REQUEST_HEADERS);
-    if (headers != null) {
-      for (String reqHdr : Splitter.on(',').trimResults().split(headers)) {
-        if (!ALLOWED_CORS_REQUEST_HEADERS.contains(reqHdr.toLowerCase(Locale.US))) {
-          throw new BadRequestException(reqHdr + " not allowed in CORS");
-        }
-      }
-    }
-
-    res.setStatus(SC_OK);
-    setCorsHeaders(res, origin);
-    res.setContentType("text/plain");
-    res.setContentLength(0);
-  }
-
-  private static void setCorsHeaders(HttpServletResponse res, String origin) {
-    res.setHeader(ACCESS_CONTROL_ALLOW_ORIGIN, origin);
-    res.setHeader(ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
-    res.setHeader(ACCESS_CONTROL_MAX_AGE, "600");
-    setHeaderList(
-        res,
-        ACCESS_CONTROL_ALLOW_METHODS,
-        Iterables.concat(ALLOWED_CORS_METHODS, ImmutableList.of("OPTIONS")));
-    setHeaderList(res, ACCESS_CONTROL_ALLOW_HEADERS, ALLOWED_CORS_REQUEST_HEADERS);
-  }
-
-  private static void setHeaderList(HttpServletResponse res, String name, Iterable<String> values) {
-    res.setHeader(name, Joiner.on(", ").join(values));
-  }
-
-  private boolean isOriginAllowed(String origin) {
-    return globals.allowOrigin != null && globals.allowOrigin.matcher(origin).matches();
-  }
-
-  private static String messageOr(Throwable t, String defaultMessage) {
-    if (!Strings.isNullOrEmpty(t.getMessage())) {
-      return t.getMessage();
-    }
-    return defaultMessage;
-  }
-
-  @SuppressWarnings({"unchecked", "rawtypes"})
-  private static boolean notModified(
-      HttpServletRequest req, RestResource rsrc, RestView<RestResource> view) {
-    if (!isRead(req)) {
-      return false;
-    }
-
-    if (view instanceof ETagView) {
-      String have = req.getHeader(HttpHeaders.IF_NONE_MATCH);
-      if (have != null) {
-        return have.equals(((ETagView) view).getETag(rsrc));
-      }
-    }
-
-    if (rsrc instanceof RestResource.HasETag) {
-      String have = req.getHeader(HttpHeaders.IF_NONE_MATCH);
-      if (have != null) {
-        return have.equals(((RestResource.HasETag) rsrc).getETag());
-      }
-    }
-
-    if (rsrc instanceof RestResource.HasLastModified) {
-      Timestamp m = ((RestResource.HasLastModified) rsrc).getLastModified();
-      long d = req.getDateHeader(HttpHeaders.IF_MODIFIED_SINCE);
-
-      // HTTP times are in seconds, database may have millisecond precision.
-      return d / 1000L == m.getTime() / 1000L;
-    }
-    return false;
-  }
-
-  private static <R extends RestResource> void configureCaching(
-      HttpServletRequest req, HttpServletResponse res, R rsrc, RestView<R> view, CacheControl c) {
-    if (isRead(req)) {
-      switch (c.getType()) {
-        case NONE:
-        default:
-          CacheHeaders.setNotCacheable(res);
-          break;
-        case PRIVATE:
-          addResourceStateHeaders(res, rsrc, view);
-          CacheHeaders.setCacheablePrivate(res, c.getAge(), c.getUnit(), c.isMustRevalidate());
-          break;
-        case PUBLIC:
-          addResourceStateHeaders(res, rsrc, view);
-          CacheHeaders.setCacheable(req, res, c.getAge(), c.getUnit(), c.isMustRevalidate());
-          break;
-      }
-    } else {
-      CacheHeaders.setNotCacheable(res);
-    }
-  }
-
-  private static <R extends RestResource> void addResourceStateHeaders(
-      HttpServletResponse res, R rsrc, RestView<R> view) {
-    if (view instanceof ETagView) {
-      res.setHeader(HttpHeaders.ETAG, ((ETagView<R>) view).getETag(rsrc));
-    } else if (rsrc instanceof RestResource.HasETag) {
-      res.setHeader(HttpHeaders.ETAG, ((RestResource.HasETag) rsrc).getETag());
-    }
-    if (rsrc instanceof RestResource.HasLastModified) {
-      res.setDateHeader(
-          HttpHeaders.LAST_MODIFIED,
-          ((RestResource.HasLastModified) rsrc).getLastModified().getTime());
-    }
-  }
-
-  private void checkPreconditions(HttpServletRequest req) throws PreconditionFailedException {
-    if ("*".equals(req.getHeader(HttpHeaders.IF_NONE_MATCH))) {
-      throw new PreconditionFailedException("Resource already exists");
-    }
-  }
-
-  private static Type inputType(RestModifyView<RestResource, Object> m) {
-    // MyModifyView implements RestModifyView<SomeResource, MyInput>
-    TypeLiteral<?> typeLiteral = TypeLiteral.get(m.getClass());
-
-    // RestModifyView<SomeResource, MyInput>
-    // This is smart enough to resolve even when there are intervening subclasses, even if they have
-    // reordered type arguments.
-    TypeLiteral<?> supertypeLiteral = typeLiteral.getSupertype(RestModifyView.class);
-
-    Type supertype = supertypeLiteral.getType();
-    checkState(
-        supertype instanceof ParameterizedType,
-        "supertype of %s is not parameterized: %s",
-        typeLiteral,
-        supertypeLiteral);
-    return ((ParameterizedType) supertype).getActualTypeArguments()[1];
-  }
-
-  private Object parseRequest(HttpServletRequest req, Type type)
-      throws IOException, BadRequestException, SecurityException, IllegalArgumentException,
-          NoSuchMethodException, IllegalAccessException, InstantiationException,
-          InvocationTargetException, MethodNotAllowedException {
-    // HTTP/1.1 requires consuming the request body before writing non-error response (less than
-    // 400). Consume the request body for all but raw input request types here.
-    if (isType(JSON_TYPE, req.getContentType())) {
-      try (BufferedReader br = req.getReader();
-          JsonReader json = new JsonReader(br)) {
-        try {
-          json.setLenient(true);
-
-          JsonToken first;
-          try {
-            first = json.peek();
-          } catch (EOFException e) {
-            throw new BadRequestException("Expected JSON object");
-          }
-          if (first == JsonToken.STRING) {
-            return parseString(json.nextString(), type);
-          }
-          return OutputFormat.JSON.newGson().fromJson(json, type);
-        } finally {
-          // Reader.close won't consume the rest of the input. Explicitly consume the request body.
-          br.skip(Long.MAX_VALUE);
-        }
-      }
-    }
-    String method = req.getMethod();
-    if (("PUT".equals(method) || "POST".equals(method)) && acceptsRawInput(type)) {
-      return parseRawInput(req, type);
-    } else if ("DELETE".equals(req.getMethod()) && hasNoBody(req)) {
-      return null;
-    } else if (hasNoBody(req)) {
-      return createInstance(type);
-    } else if (isType("text/plain", req.getContentType())) {
-      try (BufferedReader br = req.getReader()) {
-        char[] tmp = new char[256];
-        StringBuilder sb = new StringBuilder();
-        int n;
-        while (0 < (n = br.read(tmp))) {
-          sb.append(tmp, 0, n);
-        }
-        return parseString(sb.toString(), type);
-      }
-    } else if ("POST".equals(req.getMethod()) && isType(FORM_TYPE, req.getContentType())) {
-      return OutputFormat.JSON.newGson().fromJson(ParameterParser.formToJson(req), type);
-    } else {
-      throw new BadRequestException("Expected Content-Type: " + JSON_TYPE);
-    }
-  }
-
-  private static boolean hasNoBody(HttpServletRequest req) {
-    int len = req.getContentLength();
-    String type = req.getContentType();
-    return (len <= 0 && type == null) || (len == 0 && isType(FORM_TYPE, type));
-  }
-
-  @SuppressWarnings("rawtypes")
-  private static boolean acceptsRawInput(Type type) {
-    if (type instanceof Class) {
-      for (Field f : ((Class) type).getDeclaredFields()) {
-        if (f.getType() == RawInput.class) {
-          return true;
-        }
-      }
-    }
-    return false;
-  }
-
-  private Object parseRawInput(HttpServletRequest req, Type type)
-      throws SecurityException, NoSuchMethodException, IllegalArgumentException,
-          InstantiationException, IllegalAccessException, InvocationTargetException,
-          MethodNotAllowedException {
-    Object obj = createInstance(type);
-    for (Field f : obj.getClass().getDeclaredFields()) {
-      if (f.getType() == RawInput.class) {
-        f.setAccessible(true);
-        f.set(obj, RawInputUtil.create(req));
-        return obj;
-      }
-    }
-    throw new MethodNotAllowedException();
-  }
-
-  private Object parseString(String value, Type type)
-      throws BadRequestException, SecurityException, NoSuchMethodException,
-          IllegalArgumentException, IllegalAccessException, InstantiationException,
-          InvocationTargetException {
-    if (type == String.class) {
-      return value;
-    }
-
-    Object obj = createInstance(type);
-    Field[] fields = obj.getClass().getDeclaredFields();
-    if (fields.length == 0 && Strings.isNullOrEmpty(value)) {
-      return obj;
-    }
-    for (Field f : fields) {
-      if (f.getAnnotation(DefaultInput.class) != null && f.getType() == String.class) {
-        f.setAccessible(true);
-        f.set(obj, value);
-        return obj;
-      }
-    }
-    throw new BadRequestException("Expected JSON object");
-  }
-
-  private static Object createInstance(Type type)
-      throws NoSuchMethodException, InstantiationException, IllegalAccessException,
-          InvocationTargetException {
-    if (type instanceof Class) {
-      @SuppressWarnings("unchecked")
-      Class<Object> clazz = (Class<Object>) type;
-      Constructor<Object> c = clazz.getDeclaredConstructor();
-      c.setAccessible(true);
-      return c.newInstance();
-    }
-    throw new InstantiationException("Cannot make " + type);
-  }
-
-  public static long replyJson(
-      @Nullable HttpServletRequest req,
-      HttpServletResponse res,
-      ListMultimap<String, String> config,
-      Object result)
-      throws IOException {
-    TemporaryBuffer.Heap buf = heap(HEAP_EST_SIZE, Integer.MAX_VALUE);
-    buf.write(JSON_MAGIC);
-    Writer w = new BufferedWriter(new OutputStreamWriter(buf, UTF_8));
-    Gson gson = newGson(config, req);
-    if (result instanceof JsonElement) {
-      gson.toJson((JsonElement) result, w);
-    } else {
-      gson.toJson(result, w);
-    }
-    w.write('\n');
-    w.flush();
-    return replyBinaryResult(
-        req, res, asBinaryResult(buf).setContentType(JSON_TYPE).setCharacterEncoding(UTF_8));
-  }
-
-  private static Gson newGson(
-      ListMultimap<String, String> config, @Nullable HttpServletRequest req) {
-    GsonBuilder gb = OutputFormat.JSON_COMPACT.newGsonBuilder();
-
-    enablePrettyPrint(gb, config, req);
-    enablePartialGetFields(gb, config);
-
-    return gb.create();
-  }
-
-  private static void enablePrettyPrint(
-      GsonBuilder gb, ListMultimap<String, String> config, @Nullable HttpServletRequest req) {
-    String pp = Iterables.getFirst(config.get("pp"), null);
-    if (pp == null) {
-      pp = Iterables.getFirst(config.get("prettyPrint"), null);
-      if (pp == null && req != null) {
-        pp = acceptsJson(req) ? "0" : "1";
-      }
-    }
-    if ("1".equals(pp) || "true".equals(pp)) {
-      gb.setPrettyPrinting();
-    }
-  }
-
-  private static void enablePartialGetFields(GsonBuilder gb, ListMultimap<String, String> config) {
-    final Set<String> want = new HashSet<>();
-    for (String p : config.get("fields")) {
-      Iterables.addAll(want, OptionUtil.splitOptionValue(p));
-    }
-    if (!want.isEmpty()) {
-      gb.addSerializationExclusionStrategy(
-          new ExclusionStrategy() {
-            private final Map<String, String> names = new HashMap<>();
-
-            @Override
-            public boolean shouldSkipField(FieldAttributes field) {
-              String name = names.get(field.getName());
-              if (name == null) {
-                // Names are supplied by Gson in terms of Java source.
-                // Translate and cache the JSON lower_case_style used.
-                try {
-                  name =
-                      FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES.translateName( //
-                          field.getDeclaringClass().getDeclaredField(field.getName()));
-                  names.put(field.getName(), name);
-                } catch (SecurityException e) {
-                  return true;
-                } catch (NoSuchFieldException e) {
-                  return true;
-                }
-              }
-              return !want.contains(name);
-            }
-
-            @Override
-            public boolean shouldSkipClass(Class<?> clazz) {
-              return false;
-            }
-          });
-    }
-  }
-
-  @SuppressWarnings("resource")
-  static long replyBinaryResult(
-      @Nullable HttpServletRequest req, HttpServletResponse res, BinaryResult bin)
-      throws IOException {
-    final BinaryResult appResult = bin;
-    try {
-      if (bin.getAttachmentName() != null) {
-        res.setHeader(
-            "Content-Disposition", "attachment; filename=\"" + bin.getAttachmentName() + "\"");
-      }
-      if (bin.isBase64()) {
-        if (req != null && JSON_TYPE.equals(req.getHeader(HttpHeaders.ACCEPT))) {
-          bin = stackJsonString(res, bin);
-        } else {
-          bin = stackBase64(res, bin);
-        }
-      }
-      if (bin.canGzip() && acceptsGzip(req)) {
-        bin = stackGzip(res, bin);
-      }
-
-      res.setContentType(bin.getContentType());
-      long len = bin.getContentLength();
-      if (0 <= len && len < Integer.MAX_VALUE) {
-        res.setContentLength((int) len);
-      } else if (0 <= len) {
-        res.setHeader("Content-Length", Long.toString(len));
-      }
-
-      if (req == null || !"HEAD".equals(req.getMethod())) {
-        try (CountingOutputStream dst = new CountingOutputStream(res.getOutputStream())) {
-          bin.writeTo(dst);
-          return dst.getCount();
-        }
-      }
-      return 0;
-    } finally {
-      appResult.close();
-    }
-  }
-
-  private static BinaryResult stackJsonString(HttpServletResponse res, BinaryResult src)
-      throws IOException {
-    TemporaryBuffer.Heap buf = heap(HEAP_EST_SIZE, Integer.MAX_VALUE);
-    buf.write(JSON_MAGIC);
-    try (Writer w = new BufferedWriter(new OutputStreamWriter(buf, UTF_8));
-        JsonWriter json = new JsonWriter(w)) {
-      json.setLenient(true);
-      json.setHtmlSafe(true);
-      json.value(src.asString());
-      w.write('\n');
-    }
-    res.setHeader("X-FYI-Content-Encoding", "json");
-    res.setHeader("X-FYI-Content-Type", src.getContentType());
-    return asBinaryResult(buf).setContentType(JSON_TYPE).setCharacterEncoding(UTF_8);
-  }
-
-  private static BinaryResult stackBase64(HttpServletResponse res, BinaryResult src)
-      throws IOException {
-    BinaryResult b64;
-    long len = src.getContentLength();
-    if (0 <= len && len <= (7 << 20)) {
-      b64 = base64(src);
-    } else {
-      b64 =
-          new BinaryResult() {
-            @Override
-            public void writeTo(OutputStream out) throws IOException {
-              try (OutputStreamWriter w =
-                      new OutputStreamWriter(
-                          new FilterOutputStream(out) {
-                            @Override
-                            public void close() {
-                              // Do not close out, but only w and e.
-                            }
-                          },
-                          ISO_8859_1);
-                  OutputStream e = BaseEncoding.base64().encodingStream(w)) {
-                src.writeTo(e);
-              }
-            }
-          };
-    }
-    res.setHeader("X-FYI-Content-Encoding", "base64");
-    res.setHeader("X-FYI-Content-Type", src.getContentType());
-    return b64.setContentType("text/plain").setCharacterEncoding(ISO_8859_1);
-  }
-
-  private static BinaryResult stackGzip(HttpServletResponse res, BinaryResult src)
-      throws IOException {
-    BinaryResult gz;
-    long len = src.getContentLength();
-    if (len < 256) {
-      return src; // Do not compress very small payloads.
-    } else if (len <= (10 << 20)) {
-      gz = compress(src);
-      if (len <= gz.getContentLength()) {
-        return src;
-      }
-    } else {
-      gz =
-          new BinaryResult() {
-            @Override
-            public void writeTo(OutputStream out) throws IOException {
-              GZIPOutputStream gz = new GZIPOutputStream(out);
-              src.writeTo(gz);
-              gz.finish();
-              gz.flush();
-            }
-          };
-    }
-    res.setHeader("Content-Encoding", "gzip");
-    return gz.setContentType(src.getContentType());
-  }
-
-  private ViewData view(
-      RestResource rsrc,
-      RestCollection<RestResource, RestResource> rc,
-      String method,
-      List<IdString> path)
-      throws AmbiguousViewException, RestApiException {
-    DynamicMap<RestView<RestResource>> views = rc.views();
-    final IdString projection = path.isEmpty() ? IdString.fromUrl("/") : path.remove(0);
-    if (!path.isEmpty()) {
-      // If there are path components still remaining after this projection
-      // is chosen, look for the projection based upon GET as the method as
-      // the client thinks it is a nested collection.
-      method = "GET";
-    } else if ("HEAD".equals(method)) {
-      method = "GET";
-    }
-
-    List<String> p = splitProjection(projection);
-    if (p.size() == 2) {
-      String viewname = p.get(1);
-      if (Strings.isNullOrEmpty(viewname)) {
-        viewname = "/";
-      }
-      RestView<RestResource> view = views.get(p.get(0), method + "." + viewname);
-      if (view != null) {
-        return new ViewData(p.get(0), view);
-      }
-      view = views.get(p.get(0), "GET." + viewname);
-      if (view != null) {
-        if (view instanceof AcceptsPost && "POST".equals(method)) {
-          @SuppressWarnings("unchecked")
-          AcceptsPost<RestResource> ap = (AcceptsPost<RestResource>) view;
-          return new ViewData(p.get(0), ap.post(rsrc));
-        }
-      }
-      throw new ResourceNotFoundException(projection);
-    }
-
-    String name = method + "." + p.get(0);
-    RestView<RestResource> core = views.get("gerrit", name);
-    if (core != null) {
-      return new ViewData(null, core);
-    }
-    core = views.get("gerrit", "GET." + p.get(0));
-    if (core instanceof AcceptsPost && "POST".equals(method)) {
-      @SuppressWarnings("unchecked")
-      AcceptsPost<RestResource> ap = (AcceptsPost<RestResource>) core;
-      return new ViewData(null, ap.post(rsrc));
-    }
-
-    Map<String, RestView<RestResource>> r = new TreeMap<>();
-    for (String plugin : views.plugins()) {
-      RestView<RestResource> action = views.get(plugin, name);
-      if (action != null) {
-        r.put(plugin, action);
-      }
-    }
-
-    if (r.size() == 1) {
-      Map.Entry<String, RestView<RestResource>> entry = Iterables.getOnlyElement(r.entrySet());
-      return new ViewData(entry.getKey(), entry.getValue());
-    } else if (r.isEmpty()) {
-      throw new ResourceNotFoundException(projection);
-    } else {
-      throw new AmbiguousViewException(
-          String.format(
-              "Projection %s is ambiguous: %s",
-              name, r.keySet().stream().map(in -> in + "~" + projection).collect(joining(", "))));
-    }
-  }
-
-  private static List<IdString> splitPath(HttpServletRequest req) {
-    String path = RequestUtil.getEncodedPathInfo(req);
-    if (Strings.isNullOrEmpty(path)) {
-      return Collections.emptyList();
-    }
-    List<IdString> out = new ArrayList<>();
-    for (String p : Splitter.on('/').split(path)) {
-      out.add(IdString.fromUrl(p));
-    }
-    if (out.size() > 0 && out.get(out.size() - 1).isEmpty()) {
-      out.remove(out.size() - 1);
-    }
-    return out;
-  }
-
-  private static List<String> splitProjection(IdString projection) {
-    List<String> p = Lists.newArrayListWithCapacity(2);
-    Iterables.addAll(p, Splitter.on('~').limit(2).split(projection.get()));
-    return p;
-  }
-
-  private void checkUserSession(HttpServletRequest req) throws AuthException {
-    CurrentUser user = globals.currentUser.get();
-    if (isRead(req)) {
-      user.setAccessPath(AccessPath.REST_API);
-    } else if (user instanceof AnonymousUser) {
-      throw new AuthException("Authentication required");
-    } else if (!globals.webSession.get().isAccessPathOk(AccessPath.REST_API)) {
-      throw new AuthException(
-          "Invalid authentication method. In order to authenticate, "
-              + "prefix the REST endpoint URL with /a/ (e.g. http://example.com/a/projects/).");
-    }
-    if (user.isIdentifiedUser()) {
-      user.setLastLoginExternalIdKey(globals.webSession.get().getLastLoginExternalId());
-    }
-  }
-
-  private static boolean isRead(HttpServletRequest req) {
-    return "GET".equals(req.getMethod()) || "HEAD".equals(req.getMethod());
-  }
-
-  private void checkRequiresCapability(ViewData d)
-      throws AuthException, PermissionBackendException {
-    try {
-      globals
-          .permissionBackend
-          .user(globals.currentUser)
-          .check(GlobalPermission.ADMINISTRATE_SERVER);
-    } catch (AuthException e) {
-      // Skiping
-      globals
-          .permissionBackend
-          .user(globals.currentUser)
-          .checkAny(GlobalPermission.fromAnnotation(d.pluginName, d.view.getClass()));
-    }
-  }
-
-  private static long handleException(
-      Throwable err, HttpServletRequest req, HttpServletResponse res) throws IOException {
-    String uri = req.getRequestURI();
-    if (!Strings.isNullOrEmpty(req.getQueryString())) {
-      uri += "?" + req.getQueryString();
-    }
-    log.error("Error in {} {}", req.getMethod(), uri, err);
-
-    if (!res.isCommitted()) {
-      res.reset();
-      return replyError(req, res, SC_INTERNAL_SERVER_ERROR, "Internal server error", err);
-    }
-    return 0;
-  }
-
-  public static long replyError(
-      HttpServletRequest req,
-      HttpServletResponse res,
-      int statusCode,
-      String msg,
-      @Nullable Throwable err)
-      throws IOException {
-    return replyError(req, res, statusCode, msg, CacheControl.NONE, err);
-  }
-
-  public static long replyError(
-      HttpServletRequest req,
-      HttpServletResponse res,
-      int statusCode,
-      String msg,
-      CacheControl c,
-      @Nullable Throwable err)
-      throws IOException {
-    if (err != null) {
-      RequestUtil.setErrorTraceAttribute(req, err);
-    }
-    configureCaching(req, res, null, null, c);
-    res.setStatus(statusCode);
-    return replyText(req, res, msg);
-  }
-
-  static long replyText(@Nullable HttpServletRequest req, HttpServletResponse res, String text)
-      throws IOException {
-    if ((req == null || isRead(req)) && isMaybeHTML(text)) {
-      return replyJson(req, res, ImmutableListMultimap.of("pp", "0"), new JsonPrimitive(text));
-    }
-    if (!text.endsWith("\n")) {
-      text += "\n";
-    }
-    return replyBinaryResult(req, res, BinaryResult.create(text).setContentType("text/plain"));
-  }
-
-  private static boolean isMaybeHTML(String text) {
-    return CharMatcher.anyOf("<&").matchesAnyOf(text);
-  }
-
-  private static boolean acceptsJson(HttpServletRequest req) {
-    return req != null && isType(JSON_TYPE, req.getHeader(HttpHeaders.ACCEPT));
-  }
-
-  private static boolean acceptsGzip(HttpServletRequest req) {
-    if (req != null) {
-      String accepts = req.getHeader(HttpHeaders.ACCEPT_ENCODING);
-      return accepts != null && accepts.contains("gzip");
-    }
-    return false;
-  }
-
-  private static boolean isType(String expect, String given) {
-    if (given == null) {
-      return false;
-    } else if (expect.equals(given)) {
-      return true;
-    } else if (given.startsWith(expect + ",")) {
-      return true;
-    }
-    for (String p : given.split("[ ,;][ ,;]*")) {
-      if (expect.equals(p)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  private static int base64MaxSize(long n) {
-    return 4 * IntMath.divide((int) n, 3, CEILING);
-  }
-
-  private static BinaryResult base64(BinaryResult bin) throws IOException {
-    int maxSize = base64MaxSize(bin.getContentLength());
-    int estSize = Math.min(base64MaxSize(HEAP_EST_SIZE), maxSize);
-    TemporaryBuffer.Heap buf = heap(estSize, maxSize);
-    try (OutputStream encoded =
-        BaseEncoding.base64().encodingStream(new OutputStreamWriter(buf, ISO_8859_1))) {
-      bin.writeTo(encoded);
-    }
-    return asBinaryResult(buf);
-  }
-
-  private static BinaryResult compress(BinaryResult bin) throws IOException {
-    TemporaryBuffer.Heap buf = heap(HEAP_EST_SIZE, 20 << 20);
-    try (GZIPOutputStream gz = new GZIPOutputStream(buf)) {
-      bin.writeTo(gz);
-    }
-    return asBinaryResult(buf).setContentType(bin.getContentType());
-  }
-
-  @SuppressWarnings("resource")
-  private static BinaryResult asBinaryResult(TemporaryBuffer.Heap buf) {
-    return new BinaryResult() {
-      @Override
-      public void writeTo(OutputStream os) throws IOException {
-        buf.writeTo(os, null);
-      }
-    }.setContentLength(buf.length());
-  }
-
-  private static Heap heap(int est, int max) {
-    return new TemporaryBuffer.Heap(est, max);
-  }
-
-  private static class AmbiguousViewException extends Exception {
-    private static final long serialVersionUID = 1L;
-
-    AmbiguousViewException(String message) {
-      super(message);
-    }
-  }
-
-  static class ViewData {
-    String pluginName;
-    RestView<RestResource> view;
-
-    ViewData(String pluginName, RestView<RestResource> view) {
-      this.pluginName = pluginName;
-      this.view = view;
-    }
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/BaseServiceImplementation.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/BaseServiceImplementation.java
deleted file mode 100644
index 9e0e8f6..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/BaseServiceImplementation.java
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.httpd.rpc;
-
-import com.google.gerrit.common.errors.InvalidQueryException;
-import com.google.gerrit.common.errors.NoSuchEntityException;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gwtjsonrpc.common.AsyncCallback;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.OrmRuntimeException;
-import com.google.inject.Provider;
-import java.io.IOException;
-
-/** Support for services which require a {@link ReviewDb} instance. */
-public class BaseServiceImplementation {
-  private final Provider<ReviewDb> schema;
-  private final Provider<? extends CurrentUser> currentUser;
-
-  protected BaseServiceImplementation(
-      final Provider<ReviewDb> schema, Provider<? extends CurrentUser> currentUser) {
-    this.schema = schema;
-    this.currentUser = currentUser;
-  }
-
-  protected Account.Id getAccountId() {
-    CurrentUser u = currentUser.get();
-    return u.isIdentifiedUser() ? u.getAccountId() : null;
-  }
-
-  protected CurrentUser getUser() {
-    return currentUser.get();
-  }
-
-  protected ReviewDb getDb() {
-    return schema.get();
-  }
-
-  /**
-   * Executes {@code action.run} with an active ReviewDb connection.
-   *
-   * <p>A database handle is automatically opened and closed around the action's {@link
-   * Action#run(ReviewDb)} method. OrmExceptions are caught and passed into the onFailure method of
-   * the callback.
-   *
-   * @param <T> type of result the callback expects.
-   * @param callback the callback that will receive the result.
-   * @param action the action logic to perform.
-   */
-  protected <T> void run(AsyncCallback<T> callback, Action<T> action) {
-    try {
-      final T r = action.run(schema.get());
-      if (r != null) {
-        callback.onSuccess(r);
-      }
-    } catch (InvalidQueryException e) {
-      callback.onFailure(e);
-    } catch (NoSuchProjectException e) {
-      if (e.getMessage() != null) {
-        callback.onFailure(new NoSuchEntityException(e.getMessage()));
-      } else {
-        callback.onFailure(new NoSuchEntityException());
-      }
-    } catch (NoSuchGroupException e) {
-      callback.onFailure(new NoSuchEntityException());
-    } catch (OrmRuntimeException e) {
-      Exception ex = e;
-      if (e.getCause() instanceof OrmException) {
-        ex = (OrmException) e.getCause();
-      }
-      handleOrmException(callback, ex);
-    } catch (OrmException e) {
-      handleOrmException(callback, e);
-    } catch (IOException e) {
-      callback.onFailure(e);
-    } catch (Failure e) {
-      if (e.getCause() instanceof NoSuchProjectException
-          || e.getCause() instanceof NoSuchChangeException) {
-        callback.onFailure(new NoSuchEntityException());
-
-      } else {
-        callback.onFailure(e.getCause());
-      }
-    }
-  }
-
-  private static <T> void handleOrmException(AsyncCallback<T> callback, Exception e) {
-    if (e.getCause() instanceof Failure) {
-      callback.onFailure(e.getCause().getCause());
-    } else if (e.getCause() instanceof NoSuchEntityException) {
-      callback.onFailure(e.getCause());
-    } else {
-      callback.onFailure(e);
-    }
-  }
-
-  /** Exception whose cause is passed into onFailure. */
-  public static class Failure extends Exception {
-    private static final long serialVersionUID = 1L;
-
-    public Failure(Throwable why) {
-      super(why);
-    }
-  }
-
-  /** Arbitrary action to run with a database connection. */
-  public interface Action<T> {
-    /**
-     * Perform this action, returning the onSuccess value.
-     *
-     * @param db an open database handle to be used by this connection.
-     * @return he value to pass to {@link AsyncCallback#onSuccess(Object)}.
-     * @throws OrmException any schema based action failed.
-     * @throws Failure cause is given to {@link AsyncCallback#onFailure(Throwable)}.
-     * @throws NoSuchProjectException
-     * @throws NoSuchGroupException
-     * @throws InvalidQueryException
-     */
-    T run(ReviewDb db)
-        throws OrmException, Failure, NoSuchProjectException, NoSuchGroupException,
-            InvalidQueryException, IOException;
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/GerritJsonServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/GerritJsonServlet.java
deleted file mode 100644
index d3d49cb..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/GerritJsonServlet.java
+++ /dev/null
@@ -1,289 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.httpd.rpc;
-
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.MultimapBuilder;
-import com.google.gerrit.audit.AuditService;
-import com.google.gerrit.audit.RpcAuditEvent;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.common.audit.Audit;
-import com.google.gerrit.common.auth.SignInRequired;
-import com.google.gerrit.common.errors.NotSignedInException;
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.httpd.WebSession;
-import com.google.gerrit.server.AccessPath;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gson.GsonBuilder;
-import com.google.gwtjsonrpc.common.RemoteJsonService;
-import com.google.gwtjsonrpc.server.ActiveCall;
-import com.google.gwtjsonrpc.server.JsonServlet;
-import com.google.gwtjsonrpc.server.MethodHandle;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Base JSON servlet to ensure the current user is not forged. */
-final class GerritJsonServlet extends JsonServlet<GerritJsonServlet.GerritCall> {
-  private static final long serialVersionUID = 1L;
-
-  private static final Logger log = LoggerFactory.getLogger(GerritJsonServlet.class);
-  private static final ThreadLocal<GerritCall> currentCall = new ThreadLocal<>();
-  private static final ThreadLocal<MethodHandle> currentMethod = new ThreadLocal<>();
-  private final DynamicItem<WebSession> session;
-  private final RemoteJsonService service;
-  private final AuditService audit;
-
-  @Inject
-  GerritJsonServlet(final DynamicItem<WebSession> w, RemoteJsonService s, AuditService a) {
-    session = w;
-    service = s;
-    audit = a;
-  }
-
-  @Override
-  protected GerritCall createActiveCall(final HttpServletRequest req, HttpServletResponse rsp) {
-    final GerritCall call = new GerritCall(session.get(), req, new AuditedHttpServletResponse(rsp));
-    currentCall.set(call);
-    return call;
-  }
-
-  @Override
-  protected GsonBuilder createGsonBuilder() {
-    return gerritDefaultGsonBuilder();
-  }
-
-  private static GsonBuilder gerritDefaultGsonBuilder() {
-    final GsonBuilder g = defaultGsonBuilder();
-
-    g.registerTypeAdapter(
-        org.eclipse.jgit.diff.Edit.class, new org.eclipse.jgit.diff.EditDeserializer());
-
-    return g;
-  }
-
-  @Override
-  protected void preInvoke(GerritCall call) {
-    super.preInvoke(call);
-
-    if (call.isComplete()) {
-      return;
-    }
-
-    if (call.getMethod().getAnnotation(SignInRequired.class) != null) {
-      // If SignInRequired is set on this method we must have both a
-      // valid XSRF token *and* have the user signed in. Doing these
-      // checks also validates that they agree on the user identity.
-      //
-      if (!call.requireXsrfValid() || !session.get().isSignedIn()) {
-        call.onFailure(new NotSignedInException());
-      }
-    }
-  }
-
-  @Override
-  protected Object createServiceHandle() {
-    return service;
-  }
-
-  @Override
-  protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {
-    try {
-      super.service(req, resp);
-    } finally {
-      audit();
-      currentCall.set(null);
-    }
-  }
-
-  private void audit() {
-    try {
-      GerritCall call = currentCall.get();
-      MethodHandle method = call.getMethod();
-      if (method == null) {
-        return;
-      }
-      Audit note = method.getAnnotation(Audit.class);
-      if (note != null) {
-        String sid = call.getWebSession().getSessionId();
-        CurrentUser username = call.getWebSession().getUser();
-        ListMultimap<String, ?> args = extractParams(note, call);
-        String what = extractWhat(note, call);
-        Object result = call.getResult();
-
-        audit.dispatch(
-            new RpcAuditEvent(
-                sid,
-                username,
-                what,
-                call.getWhen(),
-                args,
-                call.getHttpServletRequest().getMethod(),
-                call.getHttpServletRequest().getMethod(),
-                ((AuditedHttpServletResponse) (call.getHttpServletResponse())).getStatus(),
-                result));
-      }
-    } catch (Throwable all) {
-      log.error("Unable to log the call", all);
-    }
-  }
-
-  private ListMultimap<String, ?> extractParams(Audit note, GerritCall call) {
-    ListMultimap<String, Object> args = MultimapBuilder.hashKeys().arrayListValues().build();
-
-    Object[] params = call.getParams();
-    for (int i = 0; i < params.length; i++) {
-      args.put("$" + i, params[i]);
-    }
-
-    for (int idx : note.obfuscate()) {
-      args.removeAll("$" + idx);
-      args.put("$" + idx, "*****");
-    }
-    return args;
-  }
-
-  private String extractWhat(Audit note, GerritCall call) {
-    Class<?> methodClass = call.getMethodClass();
-    String methodClassName = methodClass != null ? methodClass.getName() : "<UNKNOWN_CLASS>";
-    methodClassName = methodClassName.substring(methodClassName.lastIndexOf(".") + 1);
-    String what = note.action();
-    if (what.length() == 0) {
-      what = call.getMethod().getName();
-    }
-
-    return methodClassName + "." + what;
-  }
-
-  static class GerritCall extends ActiveCall {
-    private final WebSession session;
-    private final long when;
-    private static final Field resultField;
-    private static final Field methodField;
-
-    // Needed to allow access to non-public result field in GWT/JSON-RPC
-    static {
-      resultField = getPrivateField(ActiveCall.class, "result");
-      methodField = getPrivateField(MethodHandle.class, "method");
-    }
-
-    private static Field getPrivateField(Class<?> clazz, String fieldName) {
-      Field declaredField = null;
-      try {
-        declaredField = clazz.getDeclaredField(fieldName);
-        declaredField.setAccessible(true);
-      } catch (Exception e) {
-        log.error("Unable to expose RPS/JSON result field");
-      }
-      return declaredField;
-    }
-
-    // Surrogate of the missing getMethodClass() in GWT/JSON-RPC
-    public Class<?> getMethodClass() {
-      if (methodField == null) {
-        return null;
-      }
-
-      try {
-        Method method = (Method) methodField.get(this.getMethod());
-        return method.getDeclaringClass();
-      } catch (IllegalArgumentException e) {
-        log.error("Cannot access result field");
-      } catch (IllegalAccessException e) {
-        log.error("No permissions to access result field");
-      }
-
-      return null;
-    }
-
-    // Surrogate of the missing getResult() in GWT/JSON-RPC
-    public Object getResult() {
-      if (resultField == null) {
-        return null;
-      }
-
-      try {
-        return resultField.get(this);
-      } catch (IllegalArgumentException e) {
-        log.error("Cannot access result field");
-      } catch (IllegalAccessException e) {
-        log.error("No permissions to access result field");
-      }
-
-      return null;
-    }
-
-    GerritCall(WebSession session, HttpServletRequest i, HttpServletResponse o) {
-      super(i, o);
-      this.session = session;
-      this.when = TimeUtil.nowMs();
-    }
-
-    @Override
-    public MethodHandle getMethod() {
-      if (currentMethod.get() == null) {
-        return super.getMethod();
-      }
-      return currentMethod.get();
-    }
-
-    @Override
-    public void onFailure(Throwable error) {
-      if (error instanceof IllegalArgumentException || error instanceof IllegalStateException) {
-        super.onFailure(error);
-      } else if (error instanceof OrmException || error instanceof RuntimeException) {
-        onInternalFailure(error);
-      } else {
-        super.onFailure(error);
-      }
-    }
-
-    @Override
-    public boolean xsrfValidate() {
-      final String keyIn = getXsrfKeyIn();
-      if (keyIn == null || "".equals(keyIn)) {
-        // Anonymous requests don't need XSRF protection, they shouldn't
-        // be able to cause critical state changes.
-        //
-        return !session.isSignedIn();
-
-      } else if (session.isSignedIn() && session.isValidXGerritAuth(keyIn)) {
-        // The session must exist, and must be using this token.
-        //
-        session.getUser().setAccessPath(AccessPath.JSON_RPC);
-        return true;
-      }
-      return false;
-    }
-
-    public WebSession getWebSession() {
-      return session;
-    }
-
-    public long getWhen() {
-      return when;
-    }
-
-    public long getElapsed() {
-      return TimeUtil.nowMs() - when;
-    }
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/Handler.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/Handler.java
deleted file mode 100644
index b932169..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/Handler.java
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.httpd.rpc;
-
-import com.google.gerrit.common.errors.NoSuchEntityException;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.NoSuchRefException;
-import com.google.gwtjsonrpc.common.AsyncCallback;
-import com.google.gwtjsonrpc.common.VoidResult;
-import com.google.gwtorm.server.OrmException;
-import java.util.concurrent.Callable;
-
-/**
- * Base class for RPC service implementations.
- *
- * <p>Typically an RPC service implementation will extend this class and use Guice injection to
- * manage its state. For example:
- *
- * <pre>
- *   class Foo extends Handler&lt;Result&gt; {
- *     interface Factory {
- *       Foo create(... args ...);
- *     }
- *     &#064;Inject
- *     Foo(state, @Assisted args) { ... }
- *     Result get() throws Exception { ... }
- *   }
- * </pre>
- *
- * @param <T> type of result for {@link AsyncCallback#onSuccess(Object)} if the operation completed
- *     successfully.
- */
-public abstract class Handler<T> implements Callable<T> {
-  public static <T> Handler<T> wrap(Callable<T> r) {
-    return new Handler<T>() {
-      @Override
-      public T call() throws Exception {
-        return r.call();
-      }
-    };
-  }
-
-  /**
-   * Run the operation and pass the result to the callback.
-   *
-   * @param callback callback to receive the result of {@link #call()}.
-   */
-  public final void to(AsyncCallback<T> callback) {
-    try {
-      final T r = call();
-      if (r != null) {
-        callback.onSuccess(r);
-      }
-    } catch (NoSuchProjectException | NoSuchChangeException | NoSuchRefException e) {
-      callback.onFailure(new NoSuchEntityException());
-
-    } catch (OrmException e) {
-      if (e.getCause() instanceof BaseServiceImplementation.Failure) {
-        callback.onFailure(e.getCause().getCause());
-
-      } else if (e.getCause() instanceof NoSuchEntityException) {
-        callback.onFailure(e.getCause());
-
-      } else {
-        callback.onFailure(e);
-      }
-    } catch (BaseServiceImplementation.Failure e) {
-      callback.onFailure(e.getCause());
-    } catch (Exception e) {
-      callback.onFailure(e);
-    }
-  }
-
-  /**
-   * Compute the operation result.
-   *
-   * @return the result of the operation. Return {@link VoidResult#INSTANCE} if there is no
-   *     meaningful return value for the operation.
-   * @throws Exception the operation failed. The caller will log the exception and the stack trace,
-   *     if it is worth logging on the server side.
-   */
-  @Override
-  public abstract T call() throws Exception;
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/SystemInfoServiceImpl.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/SystemInfoServiceImpl.java
deleted file mode 100644
index 7a7713d..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/SystemInfoServiceImpl.java
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.httpd.rpc;
-
-import com.google.gerrit.common.data.SshHostKey;
-import com.google.gerrit.common.data.SystemInfoService;
-import com.google.gerrit.server.ssh.SshInfo;
-import com.google.gwtjsonrpc.common.AsyncCallback;
-import com.google.gwtjsonrpc.common.VoidResult;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.jcraft.jsch.HostKey;
-import com.jcraft.jsch.JSch;
-import java.util.ArrayList;
-import java.util.List;
-import javax.servlet.http.HttpServletRequest;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-class SystemInfoServiceImpl implements SystemInfoService {
-  private static final Logger log = LoggerFactory.getLogger(SystemInfoServiceImpl.class);
-
-  private static final JSch JSCH = new JSch();
-
-  private final List<HostKey> hostKeys;
-  private final Provider<HttpServletRequest> httpRequest;
-
-  @Inject
-  SystemInfoServiceImpl(SshInfo daemon, Provider<HttpServletRequest> hsr) {
-    hostKeys = daemon.getHostKeys();
-    httpRequest = hsr;
-  }
-
-  @Override
-  public void daemonHostKeys(AsyncCallback<List<SshHostKey>> callback) {
-    final ArrayList<SshHostKey> r = new ArrayList<>(hostKeys.size());
-    for (HostKey hk : hostKeys) {
-      String host = hk.getHost();
-      if (host.startsWith("*:")) {
-        final String port = host.substring(2);
-        host = "[" + httpRequest.get().getServerName() + "]:" + port;
-      }
-      final String fp = hk.getFingerPrint(JSCH);
-      r.add(new SshHostKey(host, hk.getType() + " " + hk.getKey(), fp));
-    }
-    callback.onSuccess(r);
-  }
-
-  @Override
-  public void clientError(String message, AsyncCallback<VoidResult> callback) {
-    HttpServletRequest r = httpRequest.get();
-    String ua = r.getHeader("User-Agent");
-    message = message.replaceAll("\n", "\n  ");
-    log.error("Client UI JavaScript error: User-Agent=" + ua + ": " + message);
-    callback.onSuccess(VoidResult.INSTANCE);
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ChangeProjectAccess.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ChangeProjectAccess.java
deleted file mode 100644
index 2adf029..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ChangeProjectAccess.java
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.httpd.rpc.project;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.data.AccessSection;
-import com.google.gerrit.common.data.ProjectAccess;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.ContributorAgreementsChecker;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.server.project.SetParent;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.util.List;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.revwalk.RevCommit;
-
-class ChangeProjectAccess extends ProjectAccessHandler<ProjectAccess> {
-  interface Factory {
-    ChangeProjectAccess create(
-        @Assisted("projectName") Project.NameKey projectName,
-        @Nullable @Assisted ObjectId base,
-        @Assisted List<AccessSection> sectionList,
-        @Nullable @Assisted("parentProjectName") Project.NameKey parentProjectName,
-        @Nullable @Assisted String message);
-  }
-
-  private final GitReferenceUpdated gitRefUpdated;
-  private final ProjectAccessFactory.Factory projectAccessFactory;
-  private final ProjectCache projectCache;
-
-  @Inject
-  ChangeProjectAccess(
-      ProjectAccessFactory.Factory projectAccessFactory,
-      ProjectControl.Factory projectControlFactory,
-      ProjectCache projectCache,
-      GroupBackend groupBackend,
-      MetaDataUpdate.User metaDataUpdateFactory,
-      AllProjectsName allProjects,
-      Provider<SetParent> setParent,
-      GitReferenceUpdated gitRefUpdated,
-      ContributorAgreementsChecker contributorAgreements,
-      @Assisted("projectName") Project.NameKey projectName,
-      @Nullable @Assisted ObjectId base,
-      @Assisted List<AccessSection> sectionList,
-      @Nullable @Assisted("parentProjectName") Project.NameKey parentProjectName,
-      @Nullable @Assisted String message) {
-    super(
-        projectControlFactory,
-        groupBackend,
-        metaDataUpdateFactory,
-        allProjects,
-        setParent,
-        projectName,
-        base,
-        sectionList,
-        parentProjectName,
-        message,
-        contributorAgreements,
-        true);
-    this.projectAccessFactory = projectAccessFactory;
-    this.projectCache = projectCache;
-    this.gitRefUpdated = gitRefUpdated;
-  }
-
-  @Override
-  protected ProjectAccess updateProjectConfig(
-      ProjectControl projectControl,
-      ProjectConfig config,
-      MetaDataUpdate md,
-      boolean parentProjectUpdate)
-      throws IOException, NoSuchProjectException, ConfigInvalidException,
-          PermissionBackendException {
-    RevCommit commit = config.commit(md);
-
-    gitRefUpdated.fire(
-        config.getProject().getNameKey(),
-        RefNames.REFS_CONFIG,
-        base,
-        commit.getId(),
-        projectControl.getUser().asIdentifiedUser().getAccount());
-
-    projectCache.evict(config.getProject());
-    return projectAccessFactory.create(projectName).call();
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAccessFactory.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAccessFactory.java
deleted file mode 100644
index 4cd6fa0..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAccessFactory.java
+++ /dev/null
@@ -1,283 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.httpd.rpc.project;
-
-import static com.google.gerrit.server.permissions.GlobalPermission.ADMINISTRATE_SERVER;
-import static com.google.gerrit.server.permissions.RefPermission.CREATE_CHANGE;
-import static com.google.gerrit.server.permissions.RefPermission.READ;
-
-import com.google.common.collect.Maps;
-import com.google.gerrit.common.data.AccessSection;
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.common.data.GroupInfo;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.common.data.PermissionRule;
-import com.google.gerrit.common.data.ProjectAccess;
-import com.google.gerrit.common.data.RefConfigSection;
-import com.google.gerrit.common.data.WebLinkInfoCommon;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.httpd.rpc.Handler;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.WebLinks;
-import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.GroupControl;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.ProjectPermission;
-import com.google.gerrit.server.permissions.RefPermission;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-class ProjectAccessFactory extends Handler<ProjectAccess> {
-  interface Factory {
-    ProjectAccessFactory create(@Assisted Project.NameKey name);
-  }
-
-  private final GroupBackend groupBackend;
-  private final ProjectCache projectCache;
-  private final PermissionBackend permissionBackend;
-  private final Provider<CurrentUser> user;
-  private final ProjectControl.GenericFactory projectControlFactory;
-  private final GroupControl.Factory groupControlFactory;
-  private final MetaDataUpdate.Server metaDataUpdateFactory;
-  private final AllProjectsName allProjectsName;
-
-  private final Project.NameKey projectName;
-  private WebLinks webLinks;
-
-  @Inject
-  ProjectAccessFactory(
-      GroupBackend groupBackend,
-      ProjectCache projectCache,
-      PermissionBackend permissionBackend,
-      Provider<CurrentUser> user,
-      ProjectControl.GenericFactory projectControlFactory,
-      GroupControl.Factory groupControlFactory,
-      MetaDataUpdate.Server metaDataUpdateFactory,
-      AllProjectsName allProjectsName,
-      WebLinks webLinks,
-      @Assisted final Project.NameKey name) {
-    this.groupBackend = groupBackend;
-    this.projectCache = projectCache;
-    this.permissionBackend = permissionBackend;
-    this.user = user;
-    this.projectControlFactory = projectControlFactory;
-    this.groupControlFactory = groupControlFactory;
-    this.metaDataUpdateFactory = metaDataUpdateFactory;
-    this.allProjectsName = allProjectsName;
-    this.webLinks = webLinks;
-
-    this.projectName = name;
-  }
-
-  @Override
-  public ProjectAccess call()
-      throws NoSuchProjectException, IOException, ConfigInvalidException,
-          PermissionBackendException {
-    ProjectControl pc = checkProjectControl();
-
-    // Load the current configuration from the repository, ensuring its the most
-    // recent version available. If it differs from what was in the project
-    // state, force a cache flush now.
-    //
-    ProjectConfig config;
-    try (MetaDataUpdate md = metaDataUpdateFactory.create(projectName)) {
-      config = ProjectConfig.read(md);
-      if (config.updateGroupNames(groupBackend)) {
-        md.setMessage("Update group names\n");
-        config.commit(md);
-        projectCache.evict(config.getProject());
-        pc = checkProjectControl();
-      } else if (config.getRevision() != null
-          && !config.getRevision().equals(pc.getProjectState().getConfig().getRevision())) {
-        projectCache.evict(config.getProject());
-        pc = checkProjectControl();
-      }
-    }
-
-    List<AccessSection> local = new ArrayList<>();
-    Set<String> ownerOf = new HashSet<>();
-    Map<AccountGroup.UUID, Boolean> visibleGroups = new HashMap<>();
-    PermissionBackend.ForProject perm = permissionBackend.user(user).project(projectName);
-    boolean checkReadConfig = check(perm, RefNames.REFS_CONFIG, READ);
-
-    for (AccessSection section : config.getAccessSections()) {
-      String name = section.getName();
-      if (AccessSection.GLOBAL_CAPABILITIES.equals(name)) {
-        if (pc.isOwner()) {
-          local.add(section);
-          ownerOf.add(name);
-
-        } else if (checkReadConfig) {
-          local.add(section);
-        }
-
-      } else if (RefConfigSection.isValid(name)) {
-        if (pc.controlForRef(name).isOwner()) {
-          local.add(section);
-          ownerOf.add(name);
-
-        } else if (checkReadConfig) {
-          local.add(section);
-
-        } else if (check(perm, name, READ)) {
-          // Filter the section to only add rules describing groups that
-          // are visible to the current-user. This includes any group the
-          // user is a member of, as well as groups they own or that
-          // are visible to all users.
-
-          AccessSection dst = null;
-          for (Permission srcPerm : section.getPermissions()) {
-            Permission dstPerm = null;
-
-            for (PermissionRule srcRule : srcPerm.getRules()) {
-              AccountGroup.UUID group = srcRule.getGroup().getUUID();
-              if (group == null) {
-                continue;
-              }
-
-              Boolean canSeeGroup = visibleGroups.get(group);
-              if (canSeeGroup == null) {
-                try {
-                  canSeeGroup = groupControlFactory.controlFor(group).isVisible();
-                } catch (NoSuchGroupException e) {
-                  canSeeGroup = Boolean.FALSE;
-                }
-                visibleGroups.put(group, canSeeGroup);
-              }
-
-              if (canSeeGroup) {
-                if (dstPerm == null) {
-                  if (dst == null) {
-                    dst = new AccessSection(name);
-                    local.add(dst);
-                  }
-                  dstPerm = dst.getPermission(srcPerm.getName(), true);
-                }
-                dstPerm.add(srcRule);
-              }
-            }
-          }
-        }
-      }
-    }
-
-    if (ownerOf.isEmpty() && isAdmin()) {
-      // Special case: If the section list is empty, this project has no current
-      // access control information. Fall back to site administrators.
-      ownerOf.add(AccessSection.ALL);
-    }
-
-    final ProjectAccess detail = new ProjectAccess();
-    detail.setProjectName(projectName);
-
-    if (config.getRevision() != null) {
-      detail.setRevision(config.getRevision().name());
-    }
-
-    detail.setInheritsFrom(config.getProject().getParent(allProjectsName));
-
-    if (projectName.equals(allProjectsName)
-        && permissionBackend.user(user).testOrFalse(ADMINISTRATE_SERVER)) {
-      ownerOf.add(AccessSection.GLOBAL_CAPABILITIES);
-    }
-
-    detail.setLocal(local);
-    detail.setOwnerOf(ownerOf);
-    detail.setCanUpload(
-        pc.isOwner()
-            || (checkReadConfig && perm.ref(RefNames.REFS_CONFIG).testOrFalse(CREATE_CHANGE)));
-    detail.setConfigVisible(pc.isOwner() || checkReadConfig);
-    detail.setGroupInfo(buildGroupInfo(local));
-    detail.setLabelTypes(pc.getProjectState().getLabelTypes());
-    detail.setFileHistoryLinks(getConfigFileLogLinks(projectName.get()));
-    return detail;
-  }
-
-  private List<WebLinkInfoCommon> getConfigFileLogLinks(String projectName) {
-    List<WebLinkInfoCommon> links =
-        webLinks.getFileHistoryLinks(
-            projectName, RefNames.REFS_CONFIG, ProjectConfig.PROJECT_CONFIG);
-    return links.isEmpty() ? null : links;
-  }
-
-  private Map<AccountGroup.UUID, GroupInfo> buildGroupInfo(List<AccessSection> local) {
-    Map<AccountGroup.UUID, GroupInfo> infos = new HashMap<>();
-    for (AccessSection section : local) {
-      for (Permission permission : section.getPermissions()) {
-        for (PermissionRule rule : permission.getRules()) {
-          if (rule.getGroup() != null) {
-            AccountGroup.UUID uuid = rule.getGroup().getUUID();
-            if (uuid != null && !infos.containsKey(uuid)) {
-              GroupDescription.Basic group = groupBackend.get(uuid);
-              infos.put(uuid, group != null ? new GroupInfo(group) : null);
-            }
-          }
-        }
-      }
-    }
-    return Maps.filterEntries(infos, in -> in.getValue() != null);
-  }
-
-  private ProjectControl checkProjectControl()
-      throws NoSuchProjectException, IOException, PermissionBackendException {
-    ProjectControl pc = projectControlFactory.controlFor(projectName, user.get());
-    try {
-      permissionBackend.user(user).project(projectName).check(ProjectPermission.ACCESS);
-    } catch (AuthException e) {
-      throw new NoSuchProjectException(projectName);
-    }
-    return pc;
-  }
-
-  private static boolean check(PermissionBackend.ForProject ctx, String ref, RefPermission perm)
-      throws PermissionBackendException {
-    try {
-      ctx.ref(ref).check(perm);
-      return true;
-    } catch (AuthException denied) {
-      return false;
-    }
-  }
-
-  private boolean isAdmin() throws PermissionBackendException {
-    try {
-      permissionBackend.user(user).check(GlobalPermission.ADMINISTRATE_SERVER);
-      return true;
-    } catch (AuthException e) {
-      return false;
-    }
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAccessHandler.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAccessHandler.java
deleted file mode 100644
index 3fa05ab..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAccessHandler.java
+++ /dev/null
@@ -1,222 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.httpd.rpc.project;
-
-import static com.google.gerrit.common.ProjectAccessUtil.mergeSections;
-
-import com.google.common.base.MoreObjects;
-import com.google.gerrit.common.data.AccessSection;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.common.data.PermissionRule;
-import com.google.gerrit.common.errors.InvalidNameException;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.common.errors.PermissionDeniedException;
-import com.google.gerrit.common.errors.UpdateParentFailedException;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.httpd.rpc.Handler;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.GroupBackends;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.ContributorAgreementsChecker;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.server.project.RefPattern;
-import com.google.gerrit.server.project.SetParent;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.ObjectId;
-
-public abstract class ProjectAccessHandler<T> extends Handler<T> {
-
-  private final ProjectControl.Factory projectControlFactory;
-  protected final GroupBackend groupBackend;
-  private final MetaDataUpdate.User metaDataUpdateFactory;
-  private final AllProjectsName allProjects;
-  private final Provider<SetParent> setParent;
-  private final ContributorAgreementsChecker contributorAgreements;
-
-  protected final Project.NameKey projectName;
-  protected final ObjectId base;
-  private List<AccessSection> sectionList;
-  private final Project.NameKey parentProjectName;
-  protected String message;
-  private boolean checkIfOwner;
-
-  protected ProjectAccessHandler(
-      ProjectControl.Factory projectControlFactory,
-      GroupBackend groupBackend,
-      MetaDataUpdate.User metaDataUpdateFactory,
-      AllProjectsName allProjects,
-      Provider<SetParent> setParent,
-      Project.NameKey projectName,
-      ObjectId base,
-      List<AccessSection> sectionList,
-      Project.NameKey parentProjectName,
-      String message,
-      ContributorAgreementsChecker contributorAgreements,
-      boolean checkIfOwner) {
-    this.projectControlFactory = projectControlFactory;
-    this.groupBackend = groupBackend;
-    this.metaDataUpdateFactory = metaDataUpdateFactory;
-    this.allProjects = allProjects;
-    this.setParent = setParent;
-
-    this.projectName = projectName;
-    this.base = base;
-    this.sectionList = sectionList;
-    this.parentProjectName = parentProjectName;
-    this.message = message;
-    this.contributorAgreements = contributorAgreements;
-    this.checkIfOwner = checkIfOwner;
-  }
-
-  @Override
-  public final T call()
-      throws NoSuchProjectException, IOException, ConfigInvalidException, InvalidNameException,
-          NoSuchGroupException, OrmException, UpdateParentFailedException,
-          PermissionDeniedException, PermissionBackendException {
-    final ProjectControl projectControl = projectControlFactory.controlFor(projectName);
-
-    try {
-      contributorAgreements.check(projectName, projectControl.getUser());
-    } catch (AuthException e) {
-      throw new PermissionDeniedException(e.getMessage());
-    }
-
-    try (MetaDataUpdate md = metaDataUpdateFactory.create(projectName)) {
-      ProjectConfig config = ProjectConfig.read(md, base);
-      Set<String> toDelete = scanSectionNames(config);
-
-      for (AccessSection section : mergeSections(sectionList)) {
-        String name = section.getName();
-
-        if (AccessSection.GLOBAL_CAPABILITIES.equals(name)) {
-          if (checkIfOwner && !projectControl.isOwner()) {
-            continue;
-          }
-          replace(config, toDelete, section);
-
-        } else if (AccessSection.isValid(name)) {
-          if (checkIfOwner && !projectControl.controlForRef(name).isOwner()) {
-            continue;
-          }
-
-          RefPattern.validate(name);
-
-          replace(config, toDelete, section);
-        }
-      }
-
-      for (String name : toDelete) {
-        if (AccessSection.GLOBAL_CAPABILITIES.equals(name)) {
-          if (!checkIfOwner || projectControl.isOwner()) {
-            config.remove(config.getAccessSection(name));
-          }
-
-        } else if (!checkIfOwner || projectControl.controlForRef(name).isOwner()) {
-          config.remove(config.getAccessSection(name));
-        }
-      }
-
-      boolean parentProjectUpdate = false;
-      if (!config.getProject().getNameKey().equals(allProjects)
-          && !config.getProject().getParent(allProjects).equals(parentProjectName)) {
-        parentProjectUpdate = true;
-        try {
-          setParent
-              .get()
-              .validateParentUpdate(
-                  projectControl.getProject().getNameKey(),
-                  projectControl.getUser().asIdentifiedUser(),
-                  MoreObjects.firstNonNull(parentProjectName, allProjects).get(),
-                  checkIfOwner);
-        } catch (AuthException e) {
-          throw new UpdateParentFailedException(
-              "You are not allowed to change the parent project since you are "
-                  + "not an administrator. You may save the modifications for review "
-                  + "so that an administrator can approve them.",
-              e);
-        } catch (ResourceConflictException | UnprocessableEntityException e) {
-          throw new UpdateParentFailedException(e.getMessage(), e);
-        }
-        config.getProject().setParentName(parentProjectName);
-      }
-
-      if (message != null && !message.isEmpty()) {
-        if (!message.endsWith("\n")) {
-          message += "\n";
-        }
-        md.setMessage(message);
-      } else {
-        md.setMessage("Modify access rules\n");
-      }
-
-      return updateProjectConfig(projectControl, config, md, parentProjectUpdate);
-    } catch (RepositoryNotFoundException notFound) {
-      throw new NoSuchProjectException(projectName);
-    }
-  }
-
-  protected abstract T updateProjectConfig(
-      ProjectControl projectControl,
-      ProjectConfig config,
-      MetaDataUpdate md,
-      boolean parentProjectUpdate)
-      throws IOException, NoSuchProjectException, ConfigInvalidException, OrmException,
-          PermissionDeniedException, PermissionBackendException;
-
-  private void replace(ProjectConfig config, Set<String> toDelete, AccessSection section)
-      throws NoSuchGroupException {
-    for (Permission permission : section.getPermissions()) {
-      for (PermissionRule rule : permission.getRules()) {
-        lookupGroup(rule);
-      }
-    }
-    config.replace(section);
-    toDelete.remove(section.getName());
-  }
-
-  private static Set<String> scanSectionNames(ProjectConfig config) {
-    Set<String> names = new HashSet<>();
-    for (AccessSection section : config.getAccessSections()) {
-      names.add(section.getName());
-    }
-    return names;
-  }
-
-  private void lookupGroup(PermissionRule rule) throws NoSuchGroupException {
-    GroupReference ref = rule.getGroup();
-    if (ref.getUUID() == null) {
-      final GroupReference group = GroupBackends.findBestSuggestion(groupBackend, ref.getName());
-      if (group == null) {
-        throw new NoSuchGroupException(ref.getName());
-      }
-      ref.setUUID(group.getUUID());
-    }
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ReviewProjectAccess.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ReviewProjectAccess.java
deleted file mode 100644
index f27b9d3..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ReviewProjectAccess.java
+++ /dev/null
@@ -1,226 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.httpd.rpc.project;
-
-import com.google.common.base.Throwables;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.common.data.AccessSection;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.common.data.PermissionRule;
-import com.google.gerrit.common.errors.PermissionDeniedException;
-import com.google.gerrit.extensions.api.changes.AddReviewerInput;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.Sequences;
-import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.change.ChangeInserter;
-import com.google.gerrit.server.change.ChangeResource;
-import com.google.gerrit.server.change.ChangesCollection;
-import com.google.gerrit.server.change.PostReviewers;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.group.SystemGroupBackend;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.RefPermission;
-import com.google.gerrit.server.project.ContributorAgreementsChecker;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.server.project.SetParent;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.util.List;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-public class ReviewProjectAccess extends ProjectAccessHandler<Change.Id> {
-  interface Factory {
-    ReviewProjectAccess create(
-        @Assisted("projectName") Project.NameKey projectName,
-        @Nullable @Assisted ObjectId base,
-        @Assisted List<AccessSection> sectionList,
-        @Nullable @Assisted("parentProjectName") Project.NameKey parentProjectName,
-        @Nullable @Assisted String message);
-  }
-
-  private final ReviewDb db;
-  private final PermissionBackend permissionBackend;
-  private final Sequences seq;
-  private final Provider<PostReviewers> reviewersProvider;
-  private final ProjectCache projectCache;
-  private final ChangesCollection changes;
-  private final ChangeInserter.Factory changeInserterFactory;
-  private final BatchUpdate.Factory updateFactory;
-
-  @Inject
-  ReviewProjectAccess(
-      final ProjectControl.Factory projectControlFactory,
-      PermissionBackend permissionBackend,
-      GroupBackend groupBackend,
-      MetaDataUpdate.User metaDataUpdateFactory,
-      ReviewDb db,
-      Provider<PostReviewers> reviewersProvider,
-      ProjectCache projectCache,
-      AllProjectsName allProjects,
-      ChangesCollection changes,
-      ChangeInserter.Factory changeInserterFactory,
-      BatchUpdate.Factory updateFactory,
-      Provider<SetParent> setParent,
-      Sequences seq,
-      ContributorAgreementsChecker contributorAgreements,
-      @Assisted("projectName") Project.NameKey projectName,
-      @Nullable @Assisted ObjectId base,
-      @Assisted List<AccessSection> sectionList,
-      @Nullable @Assisted("parentProjectName") Project.NameKey parentProjectName,
-      @Nullable @Assisted String message) {
-    super(
-        projectControlFactory,
-        groupBackend,
-        metaDataUpdateFactory,
-        allProjects,
-        setParent,
-        projectName,
-        base,
-        sectionList,
-        parentProjectName,
-        message,
-        contributorAgreements,
-        false);
-    this.db = db;
-    this.permissionBackend = permissionBackend;
-    this.seq = seq;
-    this.reviewersProvider = reviewersProvider;
-    this.projectCache = projectCache;
-    this.changes = changes;
-    this.changeInserterFactory = changeInserterFactory;
-    this.updateFactory = updateFactory;
-  }
-
-  // TODO(dborowitz): Hack MetaDataUpdate so it can be created within a BatchUpdate and we can avoid
-  // calling setUpdateRef(false).
-  @SuppressWarnings("deprecation")
-  @Override
-  protected Change.Id updateProjectConfig(
-      ProjectControl projectControl,
-      ProjectConfig config,
-      MetaDataUpdate md,
-      boolean parentProjectUpdate)
-      throws IOException, OrmException, PermissionDeniedException, PermissionBackendException {
-    PermissionBackend.ForRef metaRef =
-        permissionBackend
-            .user(projectControl.getUser())
-            .project(projectControl.getProject().getNameKey())
-            .ref(RefNames.REFS_CONFIG);
-    try {
-      metaRef.check(RefPermission.READ);
-    } catch (AuthException denied) {
-      throw new PermissionDeniedException(RefNames.REFS_CONFIG + " not visible");
-    }
-    if (!projectControl.isOwner()) {
-      try {
-        metaRef.check(RefPermission.CREATE_CHANGE);
-      } catch (AuthException denied) {
-        throw new PermissionDeniedException("cannot create change for " + RefNames.REFS_CONFIG);
-      }
-    }
-
-    md.setInsertChangeId(true);
-    Change.Id changeId = new Change.Id(seq.nextChangeId());
-    RevCommit commit =
-        config.commitToNewRef(
-            md, new PatchSet.Id(changeId, Change.INITIAL_PATCH_SET_ID).toRefName());
-    if (commit.getId().equals(base)) {
-      return null;
-    }
-
-    try (ObjectInserter objInserter = md.getRepository().newObjectInserter();
-        ObjectReader objReader = objInserter.newReader();
-        RevWalk rw = new RevWalk(objReader);
-        BatchUpdate bu =
-            updateFactory.create(
-                db, config.getProject().getNameKey(), projectControl.getUser(), TimeUtil.nowTs())) {
-      bu.setRepository(md.getRepository(), rw, objInserter);
-      bu.insertChange(
-          changeInserterFactory
-              .create(changeId, commit, RefNames.REFS_CONFIG)
-              .setValidate(false)
-              .setUpdateRef(false)); // Created by commitToNewRef.
-      bu.execute();
-    } catch (UpdateException | RestApiException e) {
-      throw new IOException(e);
-    }
-
-    ChangeResource rsrc;
-    try {
-      rsrc = changes.parse(changeId);
-    } catch (ResourceNotFoundException e) {
-      throw new IOException(e);
-    }
-    addProjectOwnersAsReviewers(rsrc);
-    if (parentProjectUpdate) {
-      addAdministratorsAsReviewers(rsrc);
-    }
-    return changeId;
-  }
-
-  private void addProjectOwnersAsReviewers(ChangeResource rsrc) {
-    final String projectOwners = groupBackend.get(SystemGroupBackend.PROJECT_OWNERS).getName();
-    try {
-      AddReviewerInput input = new AddReviewerInput();
-      input.reviewer = projectOwners;
-      reviewersProvider.get().apply(rsrc, input);
-    } catch (Exception e) {
-      // one of the owner groups is not visible to the user and this it why it
-      // can't be added as reviewer
-      Throwables.throwIfUnchecked(e);
-    }
-  }
-
-  private void addAdministratorsAsReviewers(ChangeResource rsrc) {
-    List<PermissionRule> adminRules =
-        projectCache
-            .getAllProjects()
-            .getConfig()
-            .getAccessSection(AccessSection.GLOBAL_CAPABILITIES)
-            .getPermission(GlobalCapability.ADMINISTRATE_SERVER)
-            .getRules();
-    for (PermissionRule r : adminRules) {
-      try {
-        AddReviewerInput input = new AddReviewerInput();
-        input.reviewer = r.getGroup().getUUID().get();
-        reviewersProvider.get().apply(rsrc, input);
-      } catch (Exception e) {
-        // ignore
-        Throwables.throwIfUnchecked(e);
-      }
-    }
-  }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/template/SiteHeaderFooter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/template/SiteHeaderFooter.java
deleted file mode 100644
index dca4d0f..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/template/SiteHeaderFooter.java
+++ /dev/null
@@ -1,148 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.httpd.template;
-
-import static com.google.gerrit.common.FileUtil.lastModified;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.httpd.HtmlDomUtil;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.nio.file.Path;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-@Singleton
-public class SiteHeaderFooter {
-  private static final Logger log = LoggerFactory.getLogger(SiteHeaderFooter.class);
-
-  private final boolean refreshHeaderFooter;
-  private final SitePaths sitePaths;
-  private volatile Template template;
-
-  @Inject
-  SiteHeaderFooter(@GerritServerConfig Config cfg, SitePaths sitePaths) {
-    this.refreshHeaderFooter = cfg.getBoolean("site", "refreshHeaderFooter", true);
-    this.sitePaths = sitePaths;
-
-    try {
-      Template t = new Template(sitePaths);
-      t.load();
-      template = t;
-    } catch (IOException e) {
-      log.warn("Cannot load site header or footer", e);
-    }
-  }
-
-  public Document parse(Class<?> clazz, String name) throws IOException {
-    Template t = template;
-    if (refreshHeaderFooter && t.isStale()) {
-      t = new Template(sitePaths);
-      try {
-        t.load();
-        template = t;
-      } catch (IOException e) {
-        log.warn("Cannot refresh site header or footer", e);
-        t = template;
-      }
-    }
-
-    Document doc = HtmlDomUtil.parseFile(clazz, name);
-    injectCss(doc, "gerrit_sitecss", t.css);
-    injectXml(doc, "gerrit_header", t.header);
-    injectXml(doc, "gerrit_footer", t.footer);
-    return doc;
-  }
-
-  private void injectCss(Document doc, String id, String content) {
-    Element e = HtmlDomUtil.find(doc, id);
-    if (e != null) {
-      if (!Strings.isNullOrEmpty(content)) {
-        while (e.getFirstChild() != null) {
-          e.removeChild(e.getFirstChild());
-        }
-        e.removeAttribute("id");
-        e.appendChild(doc.createCDATASection("\n" + content + "\n"));
-      } else {
-        e.getParentNode().removeChild(e);
-      }
-    }
-  }
-
-  private void injectXml(Document doc, String id, Element d) {
-    Element e = HtmlDomUtil.find(doc, id);
-    if (e != null) {
-      if (d != null) {
-        while (e.getFirstChild() != null) {
-          e.removeChild(e.getFirstChild());
-        }
-        e.appendChild(doc.importNode(d, true));
-      } else {
-        e.getParentNode().removeChild(e);
-      }
-    }
-  }
-
-  private static class Template {
-    private final FileInfo cssFile;
-    private final FileInfo headerFile;
-    private final FileInfo footerFile;
-
-    String css;
-    Element header;
-    Element footer;
-
-    Template(SitePaths site) {
-      cssFile = new FileInfo(site.site_css);
-      headerFile = new FileInfo(site.site_header);
-      footerFile = new FileInfo(site.site_footer);
-    }
-
-    void load() throws IOException {
-      css = HtmlDomUtil.readFile(cssFile.path.getParent(), cssFile.path.getFileName().toString());
-      header = readXml(headerFile);
-      footer = readXml(footerFile);
-    }
-
-    boolean isStale() {
-      return cssFile.isStale() || headerFile.isStale() || footerFile.isStale();
-    }
-
-    private static Element readXml(FileInfo src) throws IOException {
-      Document d = HtmlDomUtil.parseFile(src.path);
-      return d != null ? d.getDocumentElement() : null;
-    }
-  }
-
-  private static class FileInfo {
-    final Path path;
-    final long time;
-
-    FileInfo(Path p) {
-      path = p;
-      time = lastModified(p);
-    }
-
-    boolean isStale() {
-      return time != lastModified(path);
-    }
-  }
-}
diff --git a/gerrit-httpd/src/main/resources/com/google/gerrit/httpd/raw/PolyGerritIndexHtml.soy b/gerrit-httpd/src/main/resources/com/google/gerrit/httpd/raw/PolyGerritIndexHtml.soy
deleted file mode 100644
index 497039d..0000000
--- a/gerrit-httpd/src/main/resources/com/google/gerrit/httpd/raw/PolyGerritIndexHtml.soy
+++ /dev/null
@@ -1,65 +0,0 @@
-/**
- * Copyright (C) 2017 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.
- */
-
-{namespace com.google.gerrit.httpd.raw}
-
-/**
- * @param canonicalPath
- * @param staticResourcePath
- * @param? versionInfo
- */
-{template .Index autoescape="strict" kind="html"}
-  <!DOCTYPE html>{\n}
-  <html lang="en">{\n}
-  <meta charset="utf-8">{\n}
-  <meta name="description" content="Gerrit Code Review">{\n}
-  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">{\n}
-
-  <noscript>
-    To use PolyGerrit, please enable JavaScript in your browser settings, and then refresh this page.
-  </noscript>
-
-  <script>
-    window.CLOSURE_NO_DEPS = true;
-    {if $canonicalPath != ''}window.CANONICAL_PATH = '{$canonicalPath}';{/if}
-    {if $versionInfo}window.VERSION_INFO = '{$versionInfo}';{/if}
-  </script>{\n}
-
-  <link rel="icon" type="image/x-icon" href="{$canonicalPath}/favicon.ico">{\n}
-
-  // RobotoMono fonts are used in styles/fonts.css
-  // @see https://github.com/w3c/preload/issues/32 regarding crossorigin
-  <link rel="preload" href="{$staticResourcePath}/fonts/RobotoMono-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous">{\n}
-  <link rel="preload" href="{$staticResourcePath}/fonts/RobotoMono-Regular.woff" as="font" type="font/woff" crossorigin="anonymous">{\n}
-  <link rel="preload" href="{$staticResourcePath}/fonts/Roboto-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous">{\n}
-  <link rel="preload" href="{$staticResourcePath}/fonts/Roboto-Regular.woff" as="font" type="font/woff" crossorigin="anonymous">{\n}
-  <link rel="preload" href="{$staticResourcePath}/fonts/Roboto-Medium.woff2" as="font" type="font/woff2" crossorigin="anonymous">{\n}
-  <link rel="preload" href="{$staticResourcePath}/fonts/Roboto-Medium.woff" as="font" type="font/woff" crossorigin="anonymous">{\n}
-  <link rel="stylesheet" href="{$staticResourcePath}/styles/fonts.css">{\n}
-  <link rel="stylesheet" href="{$staticResourcePath}/styles/main.css">{\n}
-  <script src="{$staticResourcePath}/bower_components/webcomponentsjs/webcomponents-lite.js"></script>{\n}
-  // Content between webcomponents-lite and the load of the main app element
-  // run before polymer-resin is installed so may have security consequences.
-  // Contact your local security engineer if you have any questions, and
-  // CC them on any changes that load content before gr-app.html.
-  //
-  // github.com/Polymer/polymer-resin/blob/master/getting-started.md#integrating
-  <link rel="preload" href="{$staticResourcePath}/elements/gr-app.js" as="script" crossorigin="anonymous">{\n}
-  <link rel="import" href="{$staticResourcePath}/elements/gr-app.html">{\n}
-
-  <body unresolved>{\n}
-  <gr-app id="app"></gr-app>{\n}
-{/template}
diff --git a/gerrit-httpd/src/test/java/com/google/gerrit/httpd/AllRequestFilterFilterProxyTest.java b/gerrit-httpd/src/test/java/com/google/gerrit/httpd/AllRequestFilterFilterProxyTest.java
deleted file mode 100644
index 086dcc2..0000000
--- a/gerrit-httpd/src/test/java/com/google/gerrit/httpd/AllRequestFilterFilterProxyTest.java
+++ /dev/null
@@ -1,360 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.httpd;
-
-import static org.easymock.EasyMock.anyObject;
-import static org.easymock.EasyMock.capture;
-import static org.easymock.EasyMock.eq;
-
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.registration.ReloadableRegistrationHandle;
-import com.google.gerrit.server.plugins.Plugin;
-import com.google.gerrit.util.http.testutil.FakeHttpServletRequest;
-import com.google.gerrit.util.http.testutil.FakeHttpServletResponse;
-import com.google.inject.Key;
-import com.google.inject.util.Providers;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.easymock.Capture;
-import org.easymock.EasyMockSupport;
-import org.easymock.IMocksControl;
-import org.junit.Before;
-import org.junit.Test;
-
-public class AllRequestFilterFilterProxyTest {
-  /**
-   * Set of filters for FilterProxy
-   *
-   * <p>This set is used to as set of filters when fetching an {@link AllRequestFilter.FilterProxy}
-   * instance through {@link #getFilterProxy()}.
-   */
-  private DynamicSet<AllRequestFilter> filters;
-
-  @Before
-  public void setUp() throws Exception {
-    // Force starting each test with an initially empty set of filters.
-    // Filters get added by the tests themselves.
-    filters = new DynamicSet<>();
-  }
-
-  // The wrapping of {@link #getFilterProxy()} and
-  // {@link #addFilter(AllRequestFilter)} into separate methods may seem
-  // overengineered at this point. However, if in the future we decide to not
-  // test the inner class directly, but rather test from the outside using
-  // Guice Injectors, it is now sufficient to change only those two methods,
-  // and we need not mess with the individual tests.
-
-  /**
-   * Obtain a FilterProxy with a known DynamicSet of filters
-   *
-   * <p>The returned {@link AllRequestFilter.FilterProxy} can have new filters added dynamically by
-   * calling {@link #addFilter(AllRequestFilter)}.
-   */
-  private AllRequestFilter.FilterProxy getFilterProxy() {
-    return new AllRequestFilter.FilterProxy(filters);
-  }
-
-  /**
-   * Add a filter to created FilterProxy instances
-   *
-   * <p>This method adds the given filter to all {@link AllRequestFilter.FilterProxy} instances
-   * created by {@link #getFilterProxy()}.
-   */
-  private ReloadableRegistrationHandle<AllRequestFilter> addFilter(AllRequestFilter filter) {
-    Key<AllRequestFilter> key = Key.get(AllRequestFilter.class);
-    return filters.add(key, Providers.of(filter));
-  }
-
-  @Test
-  public void noFilters() throws Exception {
-    EasyMockSupport ems = new EasyMockSupport();
-
-    FilterConfig config = ems.createMock(FilterConfig.class);
-    HttpServletRequest req = new FakeHttpServletRequest();
-    HttpServletResponse res = new FakeHttpServletResponse();
-
-    FilterChain chain = ems.createMock(FilterChain.class);
-    chain.doFilter(req, res);
-
-    ems.replayAll();
-
-    AllRequestFilter.FilterProxy filterProxy = getFilterProxy();
-
-    filterProxy.init(config);
-    filterProxy.doFilter(req, res, chain);
-    filterProxy.destroy();
-
-    ems.verifyAll();
-  }
-
-  @Test
-  public void singleFilterNoBubbling() throws Exception {
-    EasyMockSupport ems = new EasyMockSupport();
-
-    FilterConfig config = ems.createMock("config", FilterConfig.class);
-    HttpServletRequest req = new FakeHttpServletRequest();
-    HttpServletResponse res = new FakeHttpServletResponse();
-
-    FilterChain chain = ems.createMock("chain", FilterChain.class);
-
-    AllRequestFilter filter = ems.createStrictMock("filter", AllRequestFilter.class);
-    filter.init(config);
-    filter.doFilter(eq(req), eq(res), anyObject(FilterChain.class));
-    filter.destroy();
-
-    ems.replayAll();
-
-    AllRequestFilter.FilterProxy filterProxy = getFilterProxy();
-    addFilter(filter);
-
-    filterProxy.init(config);
-    filterProxy.doFilter(req, res, chain);
-    filterProxy.destroy();
-
-    ems.verifyAll();
-  }
-
-  @Test
-  public void singleFilterBubbling() throws Exception {
-    EasyMockSupport ems = new EasyMockSupport();
-
-    FilterConfig config = ems.createMock(FilterConfig.class);
-    HttpServletRequest req = new FakeHttpServletRequest();
-    HttpServletResponse res = new FakeHttpServletResponse();
-
-    IMocksControl mockControl = ems.createStrictControl();
-    FilterChain chain = mockControl.createMock(FilterChain.class);
-
-    Capture<FilterChain> capturedChain = new Capture<>();
-
-    AllRequestFilter filter = mockControl.createMock(AllRequestFilter.class);
-    filter.init(config);
-    filter.doFilter(eq(req), eq(res), capture(capturedChain));
-    chain.doFilter(req, res);
-    filter.destroy();
-
-    ems.replayAll();
-
-    AllRequestFilter.FilterProxy filterProxy = getFilterProxy();
-    addFilter(filter);
-
-    filterProxy.init(config);
-    filterProxy.doFilter(req, res, chain);
-    capturedChain.getValue().doFilter(req, res);
-    filterProxy.destroy();
-
-    ems.verifyAll();
-  }
-
-  @Test
-  public void twoFiltersNoBubbling() throws Exception {
-    EasyMockSupport ems = new EasyMockSupport();
-
-    FilterConfig config = ems.createMock(FilterConfig.class);
-    HttpServletRequest req = new FakeHttpServletRequest();
-    HttpServletResponse res = new FakeHttpServletResponse();
-
-    IMocksControl mockControl = ems.createStrictControl();
-    FilterChain chain = mockControl.createMock(FilterChain.class);
-
-    AllRequestFilter filterA = mockControl.createMock(AllRequestFilter.class);
-
-    AllRequestFilter filterB = mockControl.createMock(AllRequestFilter.class);
-    filterA.init(config);
-    filterB.init(config);
-    filterA.doFilter(eq(req), eq(res), anyObject(FilterChain.class));
-    filterA.destroy();
-    filterB.destroy();
-
-    ems.replayAll();
-
-    AllRequestFilter.FilterProxy filterProxy = getFilterProxy();
-    addFilter(filterA);
-    addFilter(filterB);
-
-    filterProxy.init(config);
-    filterProxy.doFilter(req, res, chain);
-    filterProxy.destroy();
-
-    ems.verifyAll();
-  }
-
-  @Test
-  public void twoFiltersBubbling() throws Exception {
-    EasyMockSupport ems = new EasyMockSupport();
-
-    FilterConfig config = ems.createMock(FilterConfig.class);
-    HttpServletRequest req = new FakeHttpServletRequest();
-    HttpServletResponse res = new FakeHttpServletResponse();
-
-    IMocksControl mockControl = ems.createStrictControl();
-    FilterChain chain = mockControl.createMock(FilterChain.class);
-
-    Capture<FilterChain> capturedChainA = new Capture<>();
-    Capture<FilterChain> capturedChainB = new Capture<>();
-
-    AllRequestFilter filterA = mockControl.createMock(AllRequestFilter.class);
-    AllRequestFilter filterB = mockControl.createMock(AllRequestFilter.class);
-
-    filterA.init(config);
-    filterB.init(config);
-    filterA.doFilter(eq(req), eq(res), capture(capturedChainA));
-    filterB.doFilter(eq(req), eq(res), capture(capturedChainB));
-    chain.doFilter(req, res);
-    filterA.destroy();
-    filterB.destroy();
-
-    ems.replayAll();
-
-    AllRequestFilter.FilterProxy filterProxy = getFilterProxy();
-    addFilter(filterA);
-    addFilter(filterB);
-
-    filterProxy.init(config);
-    filterProxy.doFilter(req, res, chain);
-    capturedChainA.getValue().doFilter(req, res);
-    capturedChainB.getValue().doFilter(req, res);
-    filterProxy.destroy();
-
-    ems.verifyAll();
-  }
-
-  @Test
-  public void postponedLoading() throws Exception {
-    EasyMockSupport ems = new EasyMockSupport();
-
-    FilterConfig config = ems.createMock(FilterConfig.class);
-    HttpServletRequest req1 = new FakeHttpServletRequest();
-    HttpServletRequest req2 = new FakeHttpServletRequest();
-    HttpServletResponse res1 = new FakeHttpServletResponse();
-    HttpServletResponse res2 = new FakeHttpServletResponse();
-
-    IMocksControl mockControl = ems.createStrictControl();
-    FilterChain chain = mockControl.createMock("chain", FilterChain.class);
-
-    Capture<FilterChain> capturedChainA1 = new Capture<>();
-    Capture<FilterChain> capturedChainA2 = new Capture<>();
-    Capture<FilterChain> capturedChainB = new Capture<>();
-
-    AllRequestFilter filterA = mockControl.createMock("filterA", AllRequestFilter.class);
-    AllRequestFilter filterB = mockControl.createMock("filterB", AllRequestFilter.class);
-
-    filterA.init(config);
-    filterA.doFilter(eq(req1), eq(res1), capture(capturedChainA1));
-    chain.doFilter(req1, res1);
-
-    filterA.doFilter(eq(req2), eq(res2), capture(capturedChainA2));
-    filterB.init(config); // <-- This is crucial part. filterB got loaded
-    // after filterProxy's init finished. Nonetheless filterB gets initialized.
-    filterB.doFilter(eq(req2), eq(res2), capture(capturedChainB));
-    chain.doFilter(req2, res2);
-
-    filterA.destroy();
-    filterB.destroy();
-
-    ems.replayAll();
-
-    AllRequestFilter.FilterProxy filterProxy = getFilterProxy();
-    addFilter(filterA);
-
-    filterProxy.init(config);
-    filterProxy.doFilter(req1, res1, chain);
-    capturedChainA1.getValue().doFilter(req1, res1);
-
-    addFilter(filterB); // <-- Adds filter after filterProxy's init got called.
-    filterProxy.doFilter(req2, res2, chain);
-    capturedChainA2.getValue().doFilter(req2, res2);
-    capturedChainB.getValue().doFilter(req2, res2);
-
-    filterProxy.destroy();
-
-    ems.verifyAll();
-  }
-
-  @Test
-  public void dynamicUnloading() throws Exception {
-    EasyMockSupport ems = new EasyMockSupport();
-
-    FilterConfig config = ems.createMock(FilterConfig.class);
-    HttpServletRequest req1 = new FakeHttpServletRequest();
-    HttpServletRequest req2 = new FakeHttpServletRequest();
-    HttpServletRequest req3 = new FakeHttpServletRequest();
-    HttpServletResponse res1 = new FakeHttpServletResponse();
-    HttpServletResponse res2 = new FakeHttpServletResponse();
-    HttpServletResponse res3 = new FakeHttpServletResponse();
-
-    Plugin plugin = ems.createMock(Plugin.class);
-
-    IMocksControl mockControl = ems.createStrictControl();
-    FilterChain chain = mockControl.createMock("chain", FilterChain.class);
-
-    Capture<FilterChain> capturedChainA1 = new Capture<>();
-    Capture<FilterChain> capturedChainB1 = new Capture<>();
-    Capture<FilterChain> capturedChainB2 = new Capture<>();
-
-    AllRequestFilter filterA = mockControl.createMock("filterA", AllRequestFilter.class);
-    AllRequestFilter filterB = mockControl.createMock("filterB", AllRequestFilter.class);
-
-    filterA.init(config);
-    filterB.init(config);
-
-    filterA.doFilter(eq(req1), eq(res1), capture(capturedChainA1));
-    filterB.doFilter(eq(req1), eq(res1), capture(capturedChainB1));
-    chain.doFilter(req1, res1);
-
-    filterA.destroy(); // Cleaning up of filterA after it got unloaded
-
-    filterB.doFilter(eq(req2), eq(res2), capture(capturedChainB2));
-    chain.doFilter(req2, res2);
-
-    filterB.destroy(); // Cleaning up of filterA after it got unloaded
-
-    chain.doFilter(req3, res3);
-
-    ems.replayAll();
-
-    AllRequestFilter.FilterProxy filterProxy = getFilterProxy();
-    ReloadableRegistrationHandle<AllRequestFilter> handleFilterA = addFilter(filterA);
-    ReloadableRegistrationHandle<AllRequestFilter> handleFilterB = addFilter(filterB);
-
-    filterProxy.init(config);
-
-    // Request #1 with filterA and filterB
-    filterProxy.doFilter(req1, res1, chain);
-    capturedChainA1.getValue().doFilter(req1, res1);
-    capturedChainB1.getValue().doFilter(req1, res1);
-
-    // Unloading filterA
-    handleFilterA.remove();
-    filterProxy.onStopPlugin(plugin);
-
-    // Request #1 only with filterB
-    filterProxy.doFilter(req2, res2, chain);
-    capturedChainA1.getValue().doFilter(req2, res2);
-
-    // Unloading filterB
-    handleFilterB.remove();
-    filterProxy.onStopPlugin(plugin);
-
-    // Request #1 with no additional filters
-    filterProxy.doFilter(req3, res3, chain);
-
-    filterProxy.destroy();
-
-    ems.verifyAll();
-  }
-}
diff --git a/gerrit-httpd/src/test/java/com/google/gerrit/httpd/raw/IndexServletTest.java b/gerrit-httpd/src/test/java/com/google/gerrit/httpd/raw/IndexServletTest.java
deleted file mode 100644
index abf890e..0000000
--- a/gerrit-httpd/src/test/java/com/google/gerrit/httpd/raw/IndexServletTest.java
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.httpd.raw;
-
-import static com.google.common.truth.Truth.assertThat;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.template.soy.data.SoyMapData;
-import java.net.URISyntaxException;
-import org.junit.Test;
-
-public class IndexServletTest {
-  static class TestIndexServlet extends IndexServlet {
-    private static final long serialVersionUID = 1L;
-
-    TestIndexServlet(String canonicalURL, String cdnPath) throws URISyntaxException {
-      super(canonicalURL, cdnPath);
-    }
-
-    String getIndexSource() {
-      return new String(indexSource, UTF_8);
-    }
-  }
-
-  @Test
-  public void noPathAndNoCDN() throws URISyntaxException {
-    SoyMapData data = IndexServlet.getTemplateData("http://example.com/", null);
-    assertThat(data.getSingle("canonicalPath").stringValue()).isEqualTo("");
-    assertThat(data.getSingle("staticResourcePath").stringValue()).isEqualTo("");
-  }
-
-  @Test
-  public void pathAndNoCDN() throws URISyntaxException {
-    SoyMapData data = IndexServlet.getTemplateData("http://example.com/gerrit/", null);
-    assertThat(data.getSingle("canonicalPath").stringValue()).isEqualTo("/gerrit");
-    assertThat(data.getSingle("staticResourcePath").stringValue()).isEqualTo("/gerrit");
-  }
-
-  @Test
-  public void noPathAndCDN() throws URISyntaxException {
-    SoyMapData data =
-        IndexServlet.getTemplateData("http://example.com/", "http://my-cdn.com/foo/bar/");
-    assertThat(data.getSingle("canonicalPath").stringValue()).isEqualTo("");
-    assertThat(data.getSingle("staticResourcePath").stringValue())
-        .isEqualTo("http://my-cdn.com/foo/bar/");
-  }
-
-  @Test
-  public void pathAndCDN() throws URISyntaxException {
-    SoyMapData data =
-        IndexServlet.getTemplateData("http://example.com/gerrit", "http://my-cdn.com/foo/bar/");
-    assertThat(data.getSingle("canonicalPath").stringValue()).isEqualTo("/gerrit");
-    assertThat(data.getSingle("staticResourcePath").stringValue())
-        .isEqualTo("http://my-cdn.com/foo/bar/");
-  }
-
-  @Test
-  public void renderTemplate() throws URISyntaxException {
-    String testCanonicalUrl = "foo-url";
-    String testCdnPath = "bar-cdn";
-    TestIndexServlet servlet = new TestIndexServlet(testCanonicalUrl, testCdnPath);
-    String output = servlet.getIndexSource();
-    assertThat(output).contains("<!DOCTYPE html>");
-    assertThat(output).contains("window.CANONICAL_PATH = '" + testCanonicalUrl);
-    assertThat(output).contains("<link rel=\"preload\" href=\"" + testCdnPath);
-  }
-}
diff --git a/gerrit-httpd/src/test/java/com/google/gerrit/httpd/raw/ResourceServletTest.java b/gerrit-httpd/src/test/java/com/google/gerrit/httpd/raw/ResourceServletTest.java
deleted file mode 100644
index 18256c6..0000000
--- a/gerrit-httpd/src/test/java/com/google/gerrit/httpd/raw/ResourceServletTest.java
+++ /dev/null
@@ -1,370 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.httpd.raw;
-
-import static com.google.common.truth.Truth.assertThat;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND;
-import static javax.servlet.http.HttpServletResponse.SC_OK;
-
-import com.google.common.base.CharMatcher;
-import com.google.common.base.Strings;
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.collect.Lists;
-import com.google.common.io.ByteStreams;
-import com.google.common.jimfs.Configuration;
-import com.google.common.jimfs.Jimfs;
-import com.google.gerrit.httpd.raw.ResourceServlet.Resource;
-import com.google.gerrit.util.http.testutil.FakeHttpServletRequest;
-import com.google.gerrit.util.http.testutil.FakeHttpServletResponse;
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-import java.nio.file.FileSystem;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.attribute.FileTime;
-import java.util.concurrent.atomic.AtomicLong;
-import java.util.zip.GZIPInputStream;
-import org.joda.time.format.ISODateTimeFormat;
-import org.junit.Before;
-import org.junit.Test;
-
-public class ResourceServletTest {
-  private static Cache<Path, Resource> newCache(int size) {
-    return CacheBuilder.newBuilder().maximumSize(size).recordStats().build();
-  }
-
-  private static class Servlet extends ResourceServlet {
-    private static final long serialVersionUID = 1L;
-
-    private final FileSystem fs;
-
-    private Servlet(FileSystem fs, Cache<Path, Resource> cache, boolean refresh) {
-      super(cache, refresh);
-      this.fs = fs;
-    }
-
-    private Servlet(
-        FileSystem fs, Cache<Path, Resource> cache, boolean refresh, boolean cacheOnClient) {
-      super(cache, refresh, cacheOnClient);
-      this.fs = fs;
-    }
-
-    private Servlet(
-        FileSystem fs, Cache<Path, Resource> cache, boolean refresh, int cacheFileSizeLimitBytes) {
-      super(cache, refresh, true, cacheFileSizeLimitBytes);
-      this.fs = fs;
-    }
-
-    private Servlet(
-        FileSystem fs,
-        Cache<Path, Resource> cache,
-        boolean refresh,
-        boolean cacheOnClient,
-        int cacheFileSizeLimitBytes) {
-      super(cache, refresh, cacheOnClient, cacheFileSizeLimitBytes);
-      this.fs = fs;
-    }
-
-    @Override
-    protected Path getResourcePath(String pathInfo) {
-      return fs.getPath("/" + CharMatcher.is('/').trimLeadingFrom(pathInfo));
-    }
-  }
-
-  private FileSystem fs;
-  private AtomicLong ts;
-
-  @Before
-  public void setUp() {
-    fs = Jimfs.newFileSystem(Configuration.unix());
-    ts = new AtomicLong(ISODateTimeFormat.dateTime().parseMillis("2010-01-30T12:00:00.000-08:00"));
-  }
-
-  @Test
-  public void notFoundWithoutRefresh() throws Exception {
-    Cache<Path, Resource> cache = newCache(1);
-    Servlet servlet = new Servlet(fs, cache, false);
-
-    FakeHttpServletResponse res = new FakeHttpServletResponse();
-    servlet.doGet(request("/notfound"), res);
-    assertThat(res.getStatus()).isEqualTo(SC_NOT_FOUND);
-    assertNotCacheable(res);
-    assertCacheHits(cache, 0, 1);
-
-    res = new FakeHttpServletResponse();
-    servlet.doGet(request("/notfound"), res);
-    assertThat(res.getStatus()).isEqualTo(SC_NOT_FOUND);
-    assertNotCacheable(res);
-    assertCacheHits(cache, 1, 1);
-  }
-
-  @Test
-  public void notFoundWithRefresh() throws Exception {
-    Cache<Path, Resource> cache = newCache(1);
-    Servlet servlet = new Servlet(fs, cache, true);
-
-    FakeHttpServletResponse res = new FakeHttpServletResponse();
-    servlet.doGet(request("/notfound"), res);
-    assertThat(res.getStatus()).isEqualTo(SC_NOT_FOUND);
-    assertNotCacheable(res);
-    assertCacheHits(cache, 0, 1);
-
-    res = new FakeHttpServletResponse();
-    servlet.doGet(request("/notfound"), res);
-    assertThat(res.getStatus()).isEqualTo(SC_NOT_FOUND);
-    assertNotCacheable(res);
-    assertCacheHits(cache, 1, 1);
-  }
-
-  @Test
-  public void smallFileWithRefresh() throws Exception {
-    Cache<Path, Resource> cache = newCache(1);
-    Servlet servlet = new Servlet(fs, cache, true);
-
-    writeFile("/foo", "foo1");
-    FakeHttpServletResponse res = new FakeHttpServletResponse();
-    servlet.doGet(request("/foo"), res);
-    assertThat(res.getStatus()).isEqualTo(SC_OK);
-    assertThat(res.getActualBodyString()).isEqualTo("foo1");
-    assertCacheable(res, true);
-    assertHasETag(res);
-    // Miss on getIfPresent, miss on get.
-    assertCacheHits(cache, 0, 2);
-
-    res = new FakeHttpServletResponse();
-    servlet.doGet(request("/foo"), res);
-    assertThat(res.getStatus()).isEqualTo(SC_OK);
-    assertThat(res.getActualBodyString()).isEqualTo("foo1");
-    assertCacheable(res, true);
-    assertHasETag(res);
-    assertCacheHits(cache, 1, 2);
-
-    writeFile("/foo", "foo2");
-    res = new FakeHttpServletResponse();
-    servlet.doGet(request("/foo"), res);
-    assertThat(res.getStatus()).isEqualTo(SC_OK);
-    assertThat(res.getActualBodyString()).isEqualTo("foo2");
-    assertCacheable(res, true);
-    assertHasETag(res);
-    // Hit, invalidate, miss.
-    assertCacheHits(cache, 2, 3);
-  }
-
-  @Test
-  public void smallFileWithoutClientCache() throws Exception {
-    Cache<Path, Resource> cache = newCache(1);
-    Servlet servlet = new Servlet(fs, cache, false, false);
-
-    writeFile("/foo", "foo1");
-    FakeHttpServletResponse res = new FakeHttpServletResponse();
-    servlet.doGet(request("/foo"), res);
-    assertThat(res.getStatus()).isEqualTo(SC_OK);
-    assertThat(res.getActualBodyString()).isEqualTo("foo1");
-    assertNotCacheable(res);
-
-    // Miss on getIfPresent, miss on get.
-    assertCacheHits(cache, 0, 2);
-
-    res = new FakeHttpServletResponse();
-    servlet.doGet(request("/foo"), res);
-    assertThat(res.getStatus()).isEqualTo(SC_OK);
-    assertThat(res.getActualBodyString()).isEqualTo("foo1");
-    assertNotCacheable(res);
-    assertCacheHits(cache, 1, 2);
-
-    writeFile("/foo", "foo2");
-    res = new FakeHttpServletResponse();
-    servlet.doGet(request("/foo"), res);
-    assertThat(res.getStatus()).isEqualTo(SC_OK);
-    assertThat(res.getActualBodyString()).isEqualTo("foo1");
-    assertNotCacheable(res);
-    assertCacheHits(cache, 2, 2);
-  }
-
-  @Test
-  public void smallFileWithoutRefresh() throws Exception {
-    Cache<Path, Resource> cache = newCache(1);
-    Servlet servlet = new Servlet(fs, cache, false);
-
-    writeFile("/foo", "foo1");
-    FakeHttpServletResponse res = new FakeHttpServletResponse();
-    servlet.doGet(request("/foo"), res);
-    assertThat(res.getStatus()).isEqualTo(SC_OK);
-    assertThat(res.getActualBodyString()).isEqualTo("foo1");
-    assertCacheable(res, false);
-    assertHasETag(res);
-    // Miss on getIfPresent, miss on get.
-    assertCacheHits(cache, 0, 2);
-
-    res = new FakeHttpServletResponse();
-    servlet.doGet(request("/foo"), res);
-    assertThat(res.getStatus()).isEqualTo(SC_OK);
-    assertThat(res.getActualBodyString()).isEqualTo("foo1");
-    assertCacheable(res, false);
-    assertHasETag(res);
-    assertCacheHits(cache, 1, 2);
-
-    writeFile("/foo", "foo2");
-    res = new FakeHttpServletResponse();
-    servlet.doGet(request("/foo"), res);
-    assertThat(res.getStatus()).isEqualTo(SC_OK);
-    assertThat(res.getActualBodyString()).isEqualTo("foo1");
-    assertCacheable(res, false);
-    assertHasETag(res);
-    assertCacheHits(cache, 2, 2);
-  }
-
-  @Test
-  public void verySmallFileDoesntBotherWithGzip() throws Exception {
-    Cache<Path, Resource> cache = newCache(1);
-    Servlet servlet = new Servlet(fs, cache, true);
-    writeFile("/foo", "foo1");
-
-    FakeHttpServletRequest req = request("/foo").addHeader("Accept-Encoding", "gzip");
-    FakeHttpServletResponse res = new FakeHttpServletResponse();
-    servlet.doGet(req, res);
-    assertThat(res.getStatus()).isEqualTo(SC_OK);
-    assertThat(res.getHeader("Content-Encoding")).isNull();
-    assertThat(res.getActualBodyString()).isEqualTo("foo1");
-    assertHasETag(res);
-    assertCacheable(res, true);
-  }
-
-  @Test
-  public void smallFileWithGzip() throws Exception {
-    Cache<Path, Resource> cache = newCache(1);
-    Servlet servlet = new Servlet(fs, cache, true);
-    String content = Strings.repeat("a", 100);
-    writeFile("/foo", content);
-
-    FakeHttpServletRequest req = request("/foo").addHeader("Accept-Encoding", "gzip");
-    FakeHttpServletResponse res = new FakeHttpServletResponse();
-    servlet.doGet(req, res);
-    assertThat(res.getStatus()).isEqualTo(SC_OK);
-    assertThat(res.getHeader("Content-Encoding")).isEqualTo("gzip");
-    assertThat(gunzip(res.getActualBody())).isEqualTo(content);
-    assertHasETag(res);
-    assertCacheable(res, true);
-  }
-
-  @Test
-  public void largeFileBypassesCacheRegardlessOfRefreshParamter() throws Exception {
-    for (boolean refresh : Lists.newArrayList(true, false)) {
-      Cache<Path, Resource> cache = newCache(1);
-      Servlet servlet = new Servlet(fs, cache, refresh, 3);
-
-      writeFile("/foo", "foo1");
-      FakeHttpServletResponse res = new FakeHttpServletResponse();
-      servlet.doGet(request("/foo"), res);
-      assertThat(res.getStatus()).isEqualTo(SC_OK);
-      assertThat(res.getActualBodyString()).isEqualTo("foo1");
-      assertThat(res.getHeader("Last-Modified")).isNotNull();
-      assertCacheable(res, refresh);
-      assertHasLastModified(res);
-      assertCacheHits(cache, 0, 1);
-
-      writeFile("/foo", "foo1");
-      res = new FakeHttpServletResponse();
-      servlet.doGet(request("/foo"), res);
-      assertThat(res.getStatus()).isEqualTo(SC_OK);
-      assertThat(res.getActualBodyString()).isEqualTo("foo1");
-      assertThat(res.getHeader("Last-Modified")).isNotNull();
-      assertCacheable(res, refresh);
-      assertHasLastModified(res);
-      assertCacheHits(cache, 0, 2);
-
-      writeFile("/foo", "foo2");
-      res = new FakeHttpServletResponse();
-      servlet.doGet(request("/foo"), res);
-      assertThat(res.getStatus()).isEqualTo(SC_OK);
-      assertThat(res.getActualBodyString()).isEqualTo("foo2");
-      assertThat(res.getHeader("Last-Modified")).isNotNull();
-      assertCacheable(res, refresh);
-      assertHasLastModified(res);
-      assertCacheHits(cache, 0, 3);
-    }
-  }
-
-  @Test
-  public void largeFileWithGzip() throws Exception {
-    Cache<Path, Resource> cache = newCache(1);
-    Servlet servlet = new Servlet(fs, cache, true, 3);
-    String content = Strings.repeat("a", 100);
-    writeFile("/foo", content);
-
-    FakeHttpServletRequest req = request("/foo").addHeader("Accept-Encoding", "gzip");
-    FakeHttpServletResponse res = new FakeHttpServletResponse();
-    servlet.doGet(req, res);
-    assertThat(res.getStatus()).isEqualTo(SC_OK);
-    assertThat(res.getHeader("Content-Encoding")).isEqualTo("gzip");
-    assertThat(gunzip(res.getActualBody())).isEqualTo(content);
-    assertHasLastModified(res);
-    assertCacheable(res, true);
-  }
-
-  // TODO(dborowitz): Check MIME type.
-  // TODO(dborowitz): Test that JS is not gzipped.
-  // TODO(dborowitz): Test ?e parameter.
-  // TODO(dborowitz): Test If-None-Match behavior.
-  // TODO(dborowitz): Test If-Modified-Since behavior.
-
-  private void writeFile(String path, String content) throws Exception {
-    Files.write(fs.getPath(path), content.getBytes(UTF_8));
-    Files.setLastModifiedTime(fs.getPath(path), FileTime.fromMillis(ts.getAndIncrement()));
-  }
-
-  private static void assertCacheHits(Cache<?, ?> cache, int hits, int misses) {
-    assertThat(cache.stats().hitCount()).named("hits").isEqualTo(hits);
-    assertThat(cache.stats().missCount()).named("misses").isEqualTo(misses);
-  }
-
-  private static void assertCacheable(FakeHttpServletResponse res, boolean revalidate) {
-    String header = res.getHeader("Cache-Control").toLowerCase();
-    assertThat(header).contains("public");
-    if (revalidate) {
-      assertThat(header).contains("must-revalidate");
-    } else {
-      assertThat(header).doesNotContain("must-revalidate");
-    }
-  }
-
-  private static void assertHasLastModified(FakeHttpServletResponse res) {
-    assertThat(res.getHeader("Last-Modified")).isNotNull();
-    assertThat(res.getHeader("ETag")).isNull();
-  }
-
-  private static void assertHasETag(FakeHttpServletResponse res) {
-    assertThat(res.getHeader("ETag")).isNotNull();
-    assertThat(res.getHeader("Last-Modified")).isNull();
-  }
-
-  private static void assertNotCacheable(FakeHttpServletResponse res) {
-    assertThat(res.getHeader("Cache-Control")).contains("no-cache");
-    assertThat(res.getHeader("ETag")).isNull();
-    assertThat(res.getHeader("Last-Modified")).isNull();
-  }
-
-  private static FakeHttpServletRequest request(String path) {
-    return new FakeHttpServletRequest().setPathInfo(path);
-  }
-
-  private static String gunzip(byte[] data) throws Exception {
-    try (InputStream in = new GZIPInputStream(new ByteArrayInputStream(data))) {
-      return new String(ByteStreams.toByteArray(in), UTF_8);
-    }
-  }
-}
diff --git a/gerrit-index/BUILD b/gerrit-index/BUILD
deleted file mode 100644
index a55f7c4..0000000
--- a/gerrit-index/BUILD
+++ /dev/null
@@ -1,78 +0,0 @@
-load("//tools/bzl:genrule2.bzl", "genrule2")
-load("//tools/bzl:junit.bzl", "junit_tests")
-
-QUERY_PARSE_EXCEPTION_SRCS = [
-    "src/main/java/com/google/gerrit/index/query/QueryParseException.java",
-    "src/main/java/com/google/gerrit/index/query/QueryRequiresAuthException.java",
-]
-
-java_library(
-    name = "query_exception",
-    srcs = QUERY_PARSE_EXCEPTION_SRCS,
-    visibility = ["//visibility:public"],
-)
-
-genrule2(
-    name = "query_antlr",
-    srcs = ["src/main/antlr3/com/google/gerrit/index/query/Query.g"],
-    outs = ["query_antlr.srcjar"],
-    cmd = " && ".join([
-        "$(location //lib/antlr:antlr-tool) -o $$TMP $<",
-        "cd $$TMP",
-        "zip -q $$ROOT/$@ $$(find . -type f )",
-    ]),
-    tools = [
-        "//lib/antlr:antlr-tool",
-        "@bazel_tools//tools/zip:zipper",
-    ],
-)
-
-java_library(
-    name = "query_parser",
-    srcs = [":query_antlr"],
-    visibility = ["//gerrit-plugin-api:__pkg__"],
-    deps = [
-        ":query_exception",
-        "//lib/antlr:java-runtime",
-    ],
-)
-
-java_library(
-    name = "index",
-    srcs = glob(
-        ["src/main/java/**/*.java"],
-        exclude = QUERY_PARSE_EXCEPTION_SRCS,
-    ),
-    visibility = ["//visibility:public"],
-    deps = [
-        ":query_exception",
-        ":query_parser",
-        "//gerrit-common:annotations",
-        "//gerrit-extension-api:api",
-        "//gerrit-server:metrics",
-        "//lib:guava",
-        "//lib:gwtjsonrpc",
-        "//lib:gwtorm",
-        "//lib/antlr:java-runtime",
-        "//lib/auto:auto-value",
-        "//lib/auto:auto-value-annotations",
-        "//lib/jgit/org.eclipse.jgit:jgit",
-        "//lib/log:api",
-    ],
-)
-
-junit_tests(
-    name = "index_tests",
-    size = "small",
-    srcs = glob(["src/test/java/**/*.java"]),
-    visibility = ["//visibility:public"],
-    deps = [
-        ":index",
-        ":query_exception",
-        ":query_parser",
-        "//lib:junit",
-        "//lib:truth",
-        "//lib/antlr:java-runtime",
-        "//lib/jgit/org.eclipse.jgit:jgit",
-    ],
-)
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/FieldDef.java b/gerrit-index/src/main/java/com/google/gerrit/index/FieldDef.java
deleted file mode 100644
index b1ffac1..0000000
--- a/gerrit-index/src/main/java/com/google/gerrit/index/FieldDef.java
+++ /dev/null
@@ -1,148 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.index;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.common.base.CharMatcher;
-import com.google.gwtorm.server.OrmException;
-import java.io.IOException;
-import java.sql.Timestamp;
-
-/**
- * Definition of a field stored in the secondary index.
- *
- * @param <I> input type from which documents are created and search results are returned.
- * @param <T> type that should be extracted from the input object when converting to an index
- *     document.
- */
-public final class FieldDef<I, T> {
-  public static FieldDef.Builder<String> exact(String name) {
-    return new FieldDef.Builder<>(FieldType.EXACT, name);
-  }
-
-  public static FieldDef.Builder<String> fullText(String name) {
-    return new FieldDef.Builder<>(FieldType.FULL_TEXT, name);
-  }
-
-  public static FieldDef.Builder<Integer> intRange(String name) {
-    return new FieldDef.Builder<>(FieldType.INTEGER_RANGE, name).stored();
-  }
-
-  public static FieldDef.Builder<Integer> integer(String name) {
-    return new FieldDef.Builder<>(FieldType.INTEGER, name);
-  }
-
-  public static FieldDef.Builder<String> prefix(String name) {
-    return new FieldDef.Builder<>(FieldType.PREFIX, name);
-  }
-
-  public static FieldDef.Builder<byte[]> storedOnly(String name) {
-    return new FieldDef.Builder<>(FieldType.STORED_ONLY, name).stored();
-  }
-
-  public static FieldDef.Builder<Timestamp> timestamp(String name) {
-    return new FieldDef.Builder<>(FieldType.TIMESTAMP, name);
-  }
-
-  @FunctionalInterface
-  public interface Getter<I, T> {
-    T get(I input) throws OrmException, IOException;
-  }
-
-  public static class Builder<T> {
-    private final FieldType<T> type;
-    private final String name;
-    private boolean stored;
-
-    public Builder(FieldType<T> type, String name) {
-      this.type = checkNotNull(type);
-      this.name = checkNotNull(name);
-    }
-
-    public Builder<T> stored() {
-      this.stored = true;
-      return this;
-    }
-
-    public <I> FieldDef<I, T> build(Getter<I, T> getter) {
-      return new FieldDef<>(name, type, stored, false, getter);
-    }
-
-    public <I> FieldDef<I, Iterable<T>> buildRepeatable(Getter<I, Iterable<T>> getter) {
-      return new FieldDef<>(name, type, stored, true, getter);
-    }
-  }
-
-  private final String name;
-  private final FieldType<?> type;
-  private final boolean stored;
-  private final boolean repeatable;
-  private final Getter<I, T> getter;
-
-  private FieldDef(
-      String name, FieldType<?> type, boolean stored, boolean repeatable, Getter<I, T> getter) {
-    checkArgument(
-        !(repeatable && type == FieldType.INTEGER_RANGE),
-        "Range queries against repeated fields are unsupported");
-    this.name = checkName(name);
-    this.type = checkNotNull(type);
-    this.stored = stored;
-    this.repeatable = repeatable;
-    this.getter = checkNotNull(getter);
-  }
-
-  private static String checkName(String name) {
-    CharMatcher m = CharMatcher.anyOf("abcdefghijklmnopqrstuvwxyz0123456789_");
-    checkArgument(name != null && m.matchesAllOf(name), "illegal field name: %s", name);
-    return name;
-  }
-
-  /** @return name of the field. */
-  public String getName() {
-    return name;
-  }
-
-  /** @return type of the field; for repeatable fields, the inner type, not the iterable type. */
-  public FieldType<?> getType() {
-    return type;
-  }
-
-  /** @return whether the field should be stored in the index. */
-  public boolean isStored() {
-    return stored;
-  }
-
-  /**
-   * Get the field contents from the input object.
-   *
-   * @param input input object.
-   * @return the field value(s) to index.
-   * @throws OrmException
-   */
-  public T get(I input) throws OrmException {
-    try {
-      return getter.get(input);
-    } catch (IOException e) {
-      throw new OrmException(e);
-    }
-  }
-
-  /** @return whether the field is repeatable. */
-  public boolean isRepeatable() {
-    return repeatable;
-  }
-}
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/Index.java b/gerrit-index/src/main/java/com/google/gerrit/index/Index.java
deleted file mode 100644
index 34f7d33..0000000
--- a/gerrit-index/src/main/java/com/google/gerrit/index/Index.java
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.index;
-
-import com.google.gerrit.index.query.DataSource;
-import com.google.gerrit.index.query.IndexPredicate;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.index.query.QueryParseException;
-import com.google.gwtorm.server.OrmException;
-import java.io.IOException;
-import java.util.List;
-import java.util.Optional;
-
-/**
- * Secondary index implementation for arbitrary documents.
- *
- * <p>Documents are inserted into the index and are queried by converting special {@link
- * com.google.gerrit.index.query.Predicate} instances into index-aware predicates that use the index
- * search results as a source.
- *
- * <p>Implementations must be thread-safe and should batch inserts/updates where appropriate.
- */
-public interface Index<K, V> {
-  /** @return the schema version used by this index. */
-  Schema<V> getSchema();
-
-  /** Close this index. */
-  void close();
-
-  /**
-   * Update a document in the index.
-   *
-   * <p>Semantically equivalent to deleting the document and reinserting it with new field values. A
-   * document that does not already exist is created. Results may not be immediately visible to
-   * searchers, but should be visible within a reasonable amount of time.
-   *
-   * @param obj document object
-   * @throws IOException
-   */
-  void replace(V obj) throws IOException;
-
-  /**
-   * Delete a document from the index by key.
-   *
-   * @param key document key
-   * @throws IOException
-   */
-  void delete(K key) throws IOException;
-
-  /**
-   * Delete all documents from the index.
-   *
-   * @throws IOException
-   */
-  void deleteAll() throws IOException;
-
-  /**
-   * Convert the given operator predicate into a source searching the index and returning only the
-   * documents matching that predicate.
-   *
-   * <p>This method may be called multiple times for variations on the same predicate or multiple
-   * predicate subtrees in the course of processing a single query, so it should not have any side
-   * effects (e.g. starting a search in the background).
-   *
-   * @param p the predicate to match. Must be a tree containing only AND, OR, or NOT predicates as
-   *     internal nodes, and {@link IndexPredicate}s as leaves.
-   * @param opts query options not implied by the predicate, such as start and limit.
-   * @return a source of documents matching the predicate, returned in a defined order depending on
-   *     the type of documents.
-   * @throws QueryParseException if the predicate could not be converted to an indexed data source.
-   */
-  DataSource<V> getSource(Predicate<V> p, QueryOptions opts) throws QueryParseException;
-
-  /**
-   * Get a single document from the index.
-   *
-   * @param key document key.
-   * @param opts query options. Options that do not make sense in the context of a single document,
-   *     such as start, will be ignored.
-   * @return a single document if present.
-   * @throws IOException
-   */
-  default Optional<V> get(K key, QueryOptions opts) throws IOException {
-    opts = opts.withStart(0).withLimit(2);
-    List<V> results;
-    try {
-      results = getSource(keyPredicate(key), opts).read().toList();
-    } catch (QueryParseException e) {
-      throw new IOException("Unexpected QueryParseException during get()", e);
-    } catch (OrmException e) {
-      throw new IOException(e);
-    }
-    switch (results.size()) {
-      case 0:
-        return Optional.empty();
-      case 1:
-        return Optional.of(results.get(0));
-      default:
-        throw new IOException("Multiple results found in index for key " + key + ": " + results);
-    }
-  }
-
-  /**
-   * Get a predicate that looks up a single document by key.
-   *
-   * @param key document key.
-   * @return a single predicate.
-   */
-  Predicate<V> keyPredicate(K key);
-
-  /**
-   * Mark whether this index is up-to-date and ready to serve reads.
-   *
-   * @param ready whether the index is ready
-   * @throws IOException
-   */
-  void markReady(boolean ready) throws IOException;
-}
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/IndexCollection.java b/gerrit-index/src/main/java/com/google/gerrit/index/IndexCollection.java
deleted file mode 100644
index 2837f7e..0000000
--- a/gerrit-index/src/main/java/com/google/gerrit/index/IndexCollection.java
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.index;
-
-import com.google.common.collect.Lists;
-import com.google.gerrit.extensions.events.LifecycleListener;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.atomic.AtomicReference;
-
-/** Dynamic pointers to the index versions used for searching and writing. */
-public abstract class IndexCollection<K, V, I extends Index<K, V>> implements LifecycleListener {
-  private final CopyOnWriteArrayList<I> writeIndexes;
-  private final AtomicReference<I> searchIndex;
-
-  protected IndexCollection() {
-    this.writeIndexes = Lists.newCopyOnWriteArrayList();
-    this.searchIndex = new AtomicReference<>();
-  }
-
-  /** @return the current search index version. */
-  public I getSearchIndex() {
-    return searchIndex.get();
-  }
-
-  public void setSearchIndex(I index) {
-    I old = searchIndex.getAndSet(index);
-    if (old != null && old != index && !writeIndexes.contains(old)) {
-      old.close();
-    }
-  }
-
-  public Collection<I> getWriteIndexes() {
-    return Collections.unmodifiableCollection(writeIndexes);
-  }
-
-  public synchronized I addWriteIndex(I index) {
-    int version = index.getSchema().getVersion();
-    for (int i = 0; i < writeIndexes.size(); i++) {
-      if (writeIndexes.get(i).getSchema().getVersion() == version) {
-        return writeIndexes.set(i, index);
-      }
-    }
-    writeIndexes.add(index);
-    return null;
-  }
-
-  public synchronized void removeWriteIndex(int version) {
-    int removeIndex = -1;
-    for (int i = 0; i < writeIndexes.size(); i++) {
-      if (writeIndexes.get(i).getSchema().getVersion() == version) {
-        removeIndex = i;
-        break;
-      }
-    }
-    if (removeIndex >= 0) {
-      try {
-        writeIndexes.get(removeIndex).close();
-      } finally {
-        writeIndexes.remove(removeIndex);
-      }
-    }
-  }
-
-  public I getWriteIndex(int version) {
-    for (I i : writeIndexes) {
-      if (i.getSchema().getVersion() == version) {
-        return i;
-      }
-    }
-    return null;
-  }
-
-  @Override
-  public void start() {}
-
-  @Override
-  public void stop() {
-    I read = searchIndex.get();
-    if (read != null) {
-      read.close();
-    }
-    for (I write : writeIndexes) {
-      if (write != read) {
-        write.close();
-      }
-    }
-  }
-}
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/IndexConfig.java b/gerrit-index/src/main/java/com/google/gerrit/index/IndexConfig.java
deleted file mode 100644
index b53b59b..0000000
--- a/gerrit-index/src/main/java/com/google/gerrit/index/IndexConfig.java
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.index;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import com.google.auto.value.AutoValue;
-import java.util.function.IntConsumer;
-import org.eclipse.jgit.lib.Config;
-
-/**
- * Implementation-specific configuration for secondary indexes.
- *
- * <p>Contains configuration that is tied to a specific index implementation but is otherwise
- * global, i.e. not tied to a specific {@link Index} and schema version.
- */
-@AutoValue
-public abstract class IndexConfig {
-  private static final int DEFAULT_MAX_TERMS = 1024;
-
-  public static IndexConfig createDefault() {
-    return builder().build();
-  }
-
-  public static Builder fromConfig(Config cfg) {
-    Builder b = builder();
-    setIfPresent(cfg, "maxLimit", b::maxLimit);
-    setIfPresent(cfg, "maxPages", b::maxPages);
-    setIfPresent(cfg, "maxTerms", b::maxTerms);
-    return b;
-  }
-
-  private static void setIfPresent(Config cfg, String name, IntConsumer setter) {
-    int n = cfg.getInt("index", null, name, 0);
-    if (n != 0) {
-      setter.accept(n);
-    }
-  }
-
-  public static Builder builder() {
-    return new AutoValue_IndexConfig.Builder()
-        .maxLimit(Integer.MAX_VALUE)
-        .maxPages(Integer.MAX_VALUE)
-        .maxTerms(DEFAULT_MAX_TERMS)
-        .separateChangeSubIndexes(false);
-  }
-
-  @AutoValue.Builder
-  public abstract static class Builder {
-    public abstract Builder maxLimit(int maxLimit);
-
-    abstract int maxLimit();
-
-    public abstract Builder maxPages(int maxPages);
-
-    abstract int maxPages();
-
-    public abstract Builder maxTerms(int maxTerms);
-
-    abstract int maxTerms();
-
-    public abstract Builder separateChangeSubIndexes(boolean separate);
-
-    abstract IndexConfig autoBuild();
-
-    public IndexConfig build() {
-      IndexConfig cfg = autoBuild();
-      checkLimit(cfg.maxLimit(), "maxLimit");
-      checkLimit(cfg.maxPages(), "maxPages");
-      checkLimit(cfg.maxTerms(), "maxTerms");
-      return cfg;
-    }
-  }
-
-  private static void checkLimit(int limit, String name) {
-    checkArgument(limit > 0, "%s must be positive: %s", name, limit);
-  }
-
-  /**
-   * @return maximum limit supported by the underlying index, or limited for performance reasons.
-   */
-  public abstract int maxLimit();
-
-  /**
-   * @return maximum number of pages (limit / start) supported by the underlying index, or limited
-   *     for performance reasons.
-   */
-  public abstract int maxPages();
-
-  /**
-   * @return maximum number of total index query terms supported by the underlying index, or limited
-   *     for performance reasons.
-   */
-  public abstract int maxTerms();
-
-  /**
-   * @return whether different subsets of changes may be stored in different physical sub-indexes.
-   */
-  public abstract boolean separateChangeSubIndexes();
-}
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/IndexedQuery.java b/gerrit-index/src/main/java/com/google/gerrit/index/IndexedQuery.java
deleted file mode 100644
index 050b4a9..0000000
--- a/gerrit-index/src/main/java/com/google/gerrit/index/IndexedQuery.java
+++ /dev/null
@@ -1,127 +0,0 @@
-// 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.
-
-package com.google.gerrit.index;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.index.query.DataSource;
-import com.google.gerrit.index.query.IndexPredicate;
-import com.google.gerrit.index.query.Paginated;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.index.query.QueryParseException;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.ResultSet;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * Wrapper combining an {@link IndexPredicate} together with a {@link DataSource} that returns
- * matching results from the index.
- *
- * <p>Appropriate to return as the rootmost predicate that can be processed using the secondary
- * index; such predicates must also implement {@link DataSource} to be chosen by the query
- * processor.
- *
- * @param <I> The type of the IDs by which the entities are stored in the index.
- * @param <T> The type of the entities that are stored in the index.
- */
-public class IndexedQuery<I, T> extends Predicate<T> implements DataSource<T>, Paginated<T> {
-  protected final Index<I, T> index;
-
-  private QueryOptions opts;
-  private final Predicate<T> pred;
-  protected DataSource<T> source;
-
-  public IndexedQuery(Index<I, T> index, Predicate<T> pred, QueryOptions opts)
-      throws QueryParseException {
-    this.index = index;
-    this.opts = opts;
-    this.pred = pred;
-    this.source = index.getSource(pred, this.opts);
-  }
-
-  @Override
-  public int getChildCount() {
-    return 1;
-  }
-
-  @Override
-  public Predicate<T> getChild(int i) {
-    if (i == 0) {
-      return pred;
-    }
-    throw new ArrayIndexOutOfBoundsException(i);
-  }
-
-  @Override
-  public List<Predicate<T>> getChildren() {
-    return ImmutableList.of(pred);
-  }
-
-  @Override
-  public QueryOptions getOptions() {
-    return opts;
-  }
-
-  @Override
-  public int getCardinality() {
-    return source != null ? source.getCardinality() : opts.limit();
-  }
-
-  @Override
-  public ResultSet<T> read() throws OrmException {
-    return source.read();
-  }
-
-  @Override
-  public ResultSet<T> restart(int start) throws OrmException {
-    opts = opts.withStart(start);
-    try {
-      source = index.getSource(pred, opts);
-    } catch (QueryParseException e) {
-      // Don't need to show this exception to the user; the only thing that
-      // changed about pred was its start, and any other QPEs that might happen
-      // should have already thrown from the constructor.
-      throw new OrmException(e);
-    }
-    // Don't convert start to a limit, since the caller of this method (see
-    // AndSource) has calculated the actual number to skip.
-    return read();
-  }
-
-  @Override
-  public Predicate<T> copy(Collection<? extends Predicate<T>> children) {
-    return this;
-  }
-
-  @Override
-  public int hashCode() {
-    return pred.hashCode();
-  }
-
-  @Override
-  public boolean equals(Object other) {
-    if (other == null || getClass() != other.getClass()) {
-      return false;
-    }
-    IndexedQuery<?, ?> o = (IndexedQuery<?, ?>) other;
-    return pred.equals(o.pred) && opts.equals(o.opts);
-  }
-
-  @Override
-  public String toString() {
-    return MoreObjects.toStringHelper("index").add("p", pred).add("opts", opts).toString();
-  }
-}
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/QueryOptions.java b/gerrit-index/src/main/java/com/google/gerrit/index/QueryOptions.java
deleted file mode 100644
index b57fb5f..0000000
--- a/gerrit-index/src/main/java/com/google/gerrit/index/QueryOptions.java
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.index;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.primitives.Ints;
-import java.util.Set;
-
-@AutoValue
-public abstract class QueryOptions {
-  public static QueryOptions create(IndexConfig config, int start, int limit, Set<String> fields) {
-    checkArgument(start >= 0, "start must be nonnegative: %s", start);
-    checkArgument(limit > 0, "limit must be positive: %s", limit);
-    return new AutoValue_QueryOptions(config, start, limit, ImmutableSet.copyOf(fields));
-  }
-
-  public QueryOptions convertForBackend() {
-    // Increase the limit rather than skipping, since we don't know how many
-    // skipped results would have been filtered out by the enclosing AndSource.
-    int backendLimit = config().maxLimit();
-    int limit = Ints.saturatedCast((long) limit() + start());
-    limit = Math.min(limit, backendLimit);
-    return create(config(), 0, limit, fields());
-  }
-
-  public abstract IndexConfig config();
-
-  public abstract int start();
-
-  public abstract int limit();
-
-  public abstract ImmutableSet<String> fields();
-
-  public QueryOptions withLimit(int newLimit) {
-    return create(config(), start(), newLimit, fields());
-  }
-
-  public QueryOptions withStart(int newStart) {
-    return create(config(), newStart, limit(), fields());
-  }
-}
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/Schema.java b/gerrit-index/src/main/java/com/google/gerrit/index/Schema.java
deleted file mode 100644
index d20aed1..0000000
--- a/gerrit-index/src/main/java/com/google/gerrit/index/Schema.java
+++ /dev/null
@@ -1,210 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.index;
-
-import static com.google.common.base.Preconditions.checkState;
-
-import com.google.common.base.Function;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Predicates;
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.gwtorm.server.OrmException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Optional;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Specific version of a secondary index schema. */
-public class Schema<T> {
-  public static class Builder<T> {
-    private final List<FieldDef<T, ?>> fields = new ArrayList<>();
-
-    public Builder<T> add(Schema<T> schema) {
-      this.fields.addAll(schema.getFields().values());
-      return this;
-    }
-
-    @SafeVarargs
-    public final Builder<T> add(FieldDef<T, ?>... fields) {
-      this.fields.addAll(Arrays.asList(fields));
-      return this;
-    }
-
-    @SafeVarargs
-    public final Builder<T> remove(FieldDef<T, ?>... fields) {
-      this.fields.removeAll(Arrays.asList(fields));
-      return this;
-    }
-
-    public Schema<T> build() {
-      return new Schema<>(ImmutableList.copyOf(fields));
-    }
-  }
-
-  private static final Logger log = LoggerFactory.getLogger(Schema.class);
-
-  public static class Values<T> {
-    private final FieldDef<T, ?> field;
-    private final Iterable<?> values;
-
-    private Values(FieldDef<T, ?> field, Iterable<?> values) {
-      this.field = field;
-      this.values = values;
-    }
-
-    public FieldDef<T, ?> getField() {
-      return field;
-    }
-
-    public Iterable<?> getValues() {
-      return values;
-    }
-  }
-
-  private static <T> FieldDef<T, ?> checkSame(FieldDef<T, ?> f1, FieldDef<T, ?> f2) {
-    checkState(f1 == f2, "Mismatched %s fields: %s != %s", f1.getName(), f1, f2);
-    return f1;
-  }
-
-  private final ImmutableMap<String, FieldDef<T, ?>> fields;
-  private final ImmutableMap<String, FieldDef<T, ?>> storedFields;
-
-  private int version;
-
-  public Schema(Iterable<FieldDef<T, ?>> fields) {
-    this(0, fields);
-  }
-
-  public Schema(int version, Iterable<FieldDef<T, ?>> fields) {
-    this.version = version;
-    ImmutableMap.Builder<String, FieldDef<T, ?>> b = ImmutableMap.builder();
-    ImmutableMap.Builder<String, FieldDef<T, ?>> sb = ImmutableMap.builder();
-    for (FieldDef<T, ?> f : fields) {
-      b.put(f.getName(), f);
-      if (f.isStored()) {
-        sb.put(f.getName(), f);
-      }
-    }
-    this.fields = b.build();
-    this.storedFields = sb.build();
-  }
-
-  public final int getVersion() {
-    return version;
-  }
-
-  /**
-   * Get all fields in this schema.
-   *
-   * <p>This is primarily useful for iteration. Most callers should prefer one of the helper methods
-   * {@link #getField(FieldDef, FieldDef...)} or {@link #hasField(FieldDef)} to looking up fields by
-   * name
-   *
-   * @return all fields in this schema indexed by name.
-   */
-  public final ImmutableMap<String, FieldDef<T, ?>> getFields() {
-    return fields;
-  }
-
-  /** @return all fields in this schema where {@link FieldDef#isStored()} is true. */
-  public final ImmutableMap<String, FieldDef<T, ?>> getStoredFields() {
-    return storedFields;
-  }
-
-  /**
-   * Look up fields in this schema.
-   *
-   * @param first the preferred field to look up.
-   * @param rest additional fields to look up.
-   * @return the first field in the schema matching {@code first} or {@code rest}, in order, or
-   *     absent if no field matches.
-   */
-  @SafeVarargs
-  public final Optional<FieldDef<T, ?>> getField(FieldDef<T, ?> first, FieldDef<T, ?>... rest) {
-    FieldDef<T, ?> field = fields.get(first.getName());
-    if (field != null) {
-      return Optional.of(checkSame(field, first));
-    }
-    for (FieldDef<T, ?> f : rest) {
-      field = fields.get(f.getName());
-      if (field != null) {
-        return Optional.of(checkSame(field, f));
-      }
-    }
-    return Optional.empty();
-  }
-
-  /**
-   * Check whether a field is present in this schema.
-   *
-   * @param field field to look up.
-   * @return whether the field is present.
-   */
-  public final boolean hasField(FieldDef<T, ?> field) {
-    FieldDef<T, ?> f = fields.get(field.getName());
-    if (f == null) {
-      return false;
-    }
-    checkSame(f, field);
-    return true;
-  }
-
-  /**
-   * Build all fields in the schema from an input object.
-   *
-   * <p>Null values are omitted, as are fields which cause errors, which are logged.
-   *
-   * @param obj input object.
-   * @return all non-null field values from the object.
-   */
-  public final Iterable<Values<T>> buildFields(T obj) {
-    return FluentIterable.from(fields.values())
-        .transform(
-            new Function<FieldDef<T, ?>, Values<T>>() {
-              @Override
-              public Values<T> apply(FieldDef<T, ?> f) {
-                Object v;
-                try {
-                  v = f.get(obj);
-                } catch (OrmException e) {
-                  log.error("error getting field {} of {}", f.getName(), obj, e);
-                  return null;
-                }
-                if (v == null) {
-                  return null;
-                } else if (f.isRepeatable()) {
-                  return new Values<>(f, (Iterable<?>) v);
-                } else {
-                  return new Values<>(f, Collections.singleton(v));
-                }
-              }
-            })
-        .filter(Predicates.notNull());
-  }
-
-  @Override
-  public String toString() {
-    return MoreObjects.toStringHelper(this).addValue(fields.keySet()).toString();
-  }
-
-  public void setVersion(int version) {
-    this.version = version;
-  }
-}
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/SchemaDefinitions.java b/gerrit-index/src/main/java/com/google/gerrit/index/SchemaDefinitions.java
deleted file mode 100644
index f9c690c..0000000
--- a/gerrit-index/src/main/java/com/google/gerrit/index/SchemaDefinitions.java
+++ /dev/null
@@ -1,66 +0,0 @@
-// 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.
-
-package com.google.gerrit.index;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.common.collect.ImmutableSortedMap;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.common.Nullable;
-
-/**
- * Definitions of the various schema versions over a given Gerrit data type.
- *
- * <p>A <em>schema</em> is a description of the fields that are indexed over the given data type.
- * This class contains all the versions of a schema defined over its data type, exposed as a map of
- * version number to schema definition. If you are interested in the classes responsible for
- * backend-specific runtime implementations, see the implementations of {@link IndexDefinition}.
- */
-public abstract class SchemaDefinitions<V> {
-  private final String name;
-  private final ImmutableSortedMap<Integer, Schema<V>> schemas;
-
-  protected SchemaDefinitions(String name, Class<V> valueClass) {
-    this.name = checkNotNull(name);
-    this.schemas = SchemaUtil.schemasFromClass(getClass(), valueClass);
-  }
-
-  public final String getName() {
-    return name;
-  }
-
-  public final ImmutableSortedMap<Integer, Schema<V>> getSchemas() {
-    return schemas;
-  }
-
-  public final Schema<V> get(int version) {
-    Schema<V> schema = schemas.get(version);
-    checkArgument(schema != null, "Unrecognized %s schema version: %s", name, version);
-    return schema;
-  }
-
-  public final Schema<V> getLatest() {
-    return schemas.lastEntry().getValue();
-  }
-
-  @Nullable
-  public final Schema<V> getPrevious() {
-    if (schemas.size() <= 1) {
-      return null;
-    }
-    return Iterables.get(schemas.descendingMap().values(), 1);
-  }
-}
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/SiteIndexer.java b/gerrit-index/src/main/java/com/google/gerrit/index/SiteIndexer.java
deleted file mode 100644
index 9e41262..0000000
--- a/gerrit-index/src/main/java/com/google/gerrit/index/SiteIndexer.java
+++ /dev/null
@@ -1,151 +0,0 @@
-// 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.
-
-package com.google.gerrit.index;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.base.Stopwatch;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.MoreExecutors;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.RejectedExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-import org.eclipse.jgit.lib.ProgressMonitor;
-import org.eclipse.jgit.util.io.NullOutputStream;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public abstract class SiteIndexer<K, V, I extends Index<K, V>> {
-  private static final Logger log = LoggerFactory.getLogger(SiteIndexer.class);
-
-  public static class Result {
-    private final long elapsedNanos;
-    private final boolean success;
-    private final int done;
-    private final int failed;
-
-    public Result(Stopwatch sw, boolean success, int done, int failed) {
-      this.elapsedNanos = sw.elapsed(TimeUnit.NANOSECONDS);
-      this.success = success;
-      this.done = done;
-      this.failed = failed;
-    }
-
-    public boolean success() {
-      return success;
-    }
-
-    public int doneCount() {
-      return done;
-    }
-
-    public int failedCount() {
-      return failed;
-    }
-
-    public long elapsed(TimeUnit timeUnit) {
-      return timeUnit.convert(elapsedNanos, TimeUnit.NANOSECONDS);
-    }
-  }
-
-  protected int totalWork = -1;
-  protected OutputStream progressOut = NullOutputStream.INSTANCE;
-  protected PrintWriter verboseWriter = newPrintWriter(NullOutputStream.INSTANCE);
-
-  public void setTotalWork(int num) {
-    totalWork = num;
-  }
-
-  public void setProgressOut(OutputStream out) {
-    progressOut = checkNotNull(out);
-  }
-
-  public void setVerboseOut(OutputStream out) {
-    verboseWriter = newPrintWriter(checkNotNull(out));
-  }
-
-  public abstract Result indexAll(I index);
-
-  protected final void addErrorListener(
-      ListenableFuture<?> future, String desc, ProgressMonitor progress, AtomicBoolean ok) {
-    future.addListener(
-        new ErrorListener(future, desc, progress, ok), MoreExecutors.directExecutor());
-  }
-
-  protected PrintWriter newPrintWriter(OutputStream out) {
-    return new PrintWriter(new OutputStreamWriter(out, UTF_8));
-  }
-
-  private static class ErrorListener implements Runnable {
-    private final ListenableFuture<?> future;
-    private final String desc;
-    private final ProgressMonitor progress;
-    private final AtomicBoolean ok;
-
-    private ErrorListener(
-        ListenableFuture<?> future, String desc, ProgressMonitor progress, AtomicBoolean ok) {
-      this.future = future;
-      this.desc = desc;
-      this.progress = progress;
-      this.ok = ok;
-    }
-
-    @Override
-    public void run() {
-      try {
-        future.get();
-      } catch (RejectedExecutionException e) {
-        // Server shutdown, don't spam the logs.
-        failSilently();
-      } catch (ExecutionException | InterruptedException e) {
-        fail(e);
-      } catch (RuntimeException e) {
-        failAndThrow(e);
-      } catch (Error e) {
-        // Can't join with RuntimeException because "RuntimeException |
-        // Error" becomes Throwable, which messes with signatures.
-        failAndThrow(e);
-      } finally {
-        synchronized (progress) {
-          progress.update(1);
-        }
-      }
-    }
-
-    private void failSilently() {
-      ok.set(false);
-    }
-
-    private void fail(Throwable t) {
-      log.error("Failed to index " + desc, t);
-      ok.set(false);
-    }
-
-    private void failAndThrow(RuntimeException e) {
-      fail(e);
-      throw e;
-    }
-
-    private void failAndThrow(Error e) {
-      fail(e);
-      throw e;
-    }
-  }
-}
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/query/AndSource.java b/gerrit-index/src/main/java/com/google/gerrit/index/query/AndSource.java
deleted file mode 100644
index 16620b3..0000000
--- a/gerrit-index/src/main/java/com/google/gerrit/index/query/AndSource.java
+++ /dev/null
@@ -1,200 +0,0 @@
-// 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.
-
-package com.google.gerrit.index.query;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import com.google.common.base.Throwables;
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.gwtorm.server.ListResultSet;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.OrmRuntimeException;
-import com.google.gwtorm.server.ResultSet;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-public class AndSource<T> extends AndPredicate<T>
-    implements DataSource<T>, Comparator<Predicate<T>> {
-  protected final DataSource<T> source;
-
-  private final IsVisibleToPredicate<T> isVisibleToPredicate;
-  private final int start;
-  private final int cardinality;
-
-  public AndSource(Collection<? extends Predicate<T>> that) {
-    this(that, null, 0);
-  }
-
-  public AndSource(Predicate<T> that, IsVisibleToPredicate<T> isVisibleToPredicate) {
-    this(that, isVisibleToPredicate, 0);
-  }
-
-  public AndSource(Predicate<T> that, IsVisibleToPredicate<T> isVisibleToPredicate, int start) {
-    this(ImmutableList.of(that), isVisibleToPredicate, start);
-  }
-
-  public AndSource(
-      Collection<? extends Predicate<T>> that,
-      IsVisibleToPredicate<T> isVisibleToPredicate,
-      int start) {
-    super(that);
-    checkArgument(start >= 0, "negative start: %s", start);
-    this.isVisibleToPredicate = isVisibleToPredicate;
-    this.start = start;
-
-    int c = Integer.MAX_VALUE;
-    DataSource<T> s = null;
-    int minCost = Integer.MAX_VALUE;
-    for (Predicate<T> p : sort(getChildren())) {
-      if (p instanceof DataSource) {
-        c = Math.min(c, ((DataSource<?>) p).getCardinality());
-
-        int cost = p.estimateCost();
-        if (cost < minCost) {
-          s = toDataSource(p);
-          minCost = cost;
-        }
-      }
-    }
-    this.source = s;
-    this.cardinality = c;
-  }
-
-  @Override
-  public ResultSet<T> read() throws OrmException {
-    try {
-      return readImpl();
-    } catch (OrmRuntimeException err) {
-      if (err.getCause() != null) {
-        Throwables.throwIfInstanceOf(err.getCause(), OrmException.class);
-      }
-      throw new OrmException(err);
-    }
-  }
-
-  private ResultSet<T> readImpl() throws OrmException {
-    if (source == null) {
-      throw new OrmException("No DataSource: " + this);
-    }
-    List<T> r = new ArrayList<>();
-    T last = null;
-    int nextStart = 0;
-    boolean skipped = false;
-    for (T data : buffer(source.read())) {
-      if (!isMatchable() || match(data)) {
-        r.add(data);
-      } else {
-        skipped = true;
-      }
-      last = data;
-      nextStart++;
-    }
-
-    if (skipped && last != null && source instanceof Paginated) {
-      // If our source is a paginated source and we skipped at
-      // least one of its results, we may not have filled the full
-      // limit the caller wants.  Restart the source and continue.
-      //
-      @SuppressWarnings("unchecked")
-      Paginated<T> p = (Paginated<T>) source;
-      while (skipped && r.size() < p.getOptions().limit() + start) {
-        skipped = false;
-        ResultSet<T> next = p.restart(nextStart);
-
-        for (T data : buffer(next)) {
-          if (match(data)) {
-            r.add(data);
-          } else {
-            skipped = true;
-          }
-          nextStart++;
-        }
-      }
-    }
-
-    if (start >= r.size()) {
-      r = ImmutableList.of();
-    } else if (start > 0) {
-      r = ImmutableList.copyOf(r.subList(start, r.size()));
-    }
-    return new ListResultSet<>(r);
-  }
-
-  @Override
-  public boolean isMatchable() {
-    return isVisibleToPredicate != null || super.isMatchable();
-  }
-
-  @Override
-  public boolean match(T object) throws OrmException {
-    if (isVisibleToPredicate != null && !isVisibleToPredicate.match(object)) {
-      return false;
-    }
-
-    if (super.isMatchable() && !super.match(object)) {
-      return false;
-    }
-
-    return true;
-  }
-
-  private Iterable<T> buffer(ResultSet<T> scanner) {
-    return FluentIterable.from(Iterables.partition(scanner, 50))
-        .transformAndConcat(this::transformBuffer);
-  }
-
-  protected List<T> transformBuffer(List<T> buffer) throws OrmRuntimeException {
-    return buffer;
-  }
-
-  @Override
-  public int getCardinality() {
-    return cardinality;
-  }
-
-  private List<Predicate<T>> sort(Collection<? extends Predicate<T>> that) {
-    List<Predicate<T>> r = new ArrayList<>(that);
-    Collections.sort(r, this);
-    return r;
-  }
-
-  @Override
-  public int compare(Predicate<T> a, Predicate<T> b) {
-    int ai = a instanceof DataSource ? 0 : 1;
-    int bi = b instanceof DataSource ? 0 : 1;
-    int cmp = ai - bi;
-
-    if (cmp == 0) {
-      cmp = a.estimateCost() - b.estimateCost();
-    }
-
-    if (cmp == 0 && a instanceof DataSource && b instanceof DataSource) {
-      DataSource<?> as = (DataSource<?>) a;
-      DataSource<?> bs = (DataSource<?>) b;
-      cmp = as.getCardinality() - bs.getCardinality();
-    }
-    return cmp;
-  }
-
-  @SuppressWarnings("unchecked")
-  private DataSource<T> toDataSource(Predicate<T> pred) {
-    return (DataSource<T>) pred;
-  }
-}
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/query/DataSource.java b/gerrit-index/src/main/java/com/google/gerrit/index/query/DataSource.java
deleted file mode 100644
index 77dcca2..0000000
--- a/gerrit-index/src/main/java/com/google/gerrit/index/query/DataSource.java
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.index.query;
-
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.ResultSet;
-
-public interface DataSource<T> {
-  /** @return an estimate of the number of results from {@link #read()}. */
-  int getCardinality();
-
-  /** @return read from the database and return the results. */
-  ResultSet<T> read() throws OrmException;
-}
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/query/InternalQuery.java b/gerrit-index/src/main/java/com/google/gerrit/index/query/InternalQuery.java
deleted file mode 100644
index 0f8948b..0000000
--- a/gerrit-index/src/main/java/com/google/gerrit/index/query/InternalQuery.java
+++ /dev/null
@@ -1,102 +0,0 @@
-// 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.
-
-package com.google.gerrit.index.query;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Lists;
-import com.google.gerrit.index.Index;
-import com.google.gerrit.index.IndexCollection;
-import com.google.gerrit.index.IndexConfig;
-import com.google.gerrit.index.Schema;
-import com.google.gwtorm.server.OrmException;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Execute a single query over a secondary index, for use by Gerrit internals.
- *
- * <p>By default, visibility of returned entities is not enforced (unlike in {@link
- * QueryProcessor}). The methods in this class are not typically used by user-facing paths, but
- * rather by internal callers that need to process all matching results.
- *
- * <p>Instances are one-time-use. Other singleton classes should inject a Provider rather than
- * holding on to a single instance.
- */
-public class InternalQuery<T> {
-  private final QueryProcessor<T> queryProcessor;
-  private final IndexCollection<?, T, ? extends Index<?, T>> indexes;
-
-  protected final IndexConfig indexConfig;
-
-  protected InternalQuery(
-      QueryProcessor<T> queryProcessor,
-      IndexCollection<?, T, ? extends Index<?, T>> indexes,
-      IndexConfig indexConfig) {
-    this.queryProcessor = queryProcessor.enforceVisibility(false);
-    this.indexes = indexes;
-    this.indexConfig = indexConfig;
-  }
-
-  public InternalQuery<T> setLimit(int n) {
-    queryProcessor.setUserProvidedLimit(n);
-    return this;
-  }
-
-  public InternalQuery<T> enforceVisibility(boolean enforce) {
-    queryProcessor.enforceVisibility(enforce);
-    return this;
-  }
-
-  public InternalQuery<T> setRequestedFields(Set<String> fields) {
-    queryProcessor.setRequestedFields(fields);
-    return this;
-  }
-
-  public InternalQuery<T> noFields() {
-    queryProcessor.setRequestedFields(ImmutableSet.<String>of());
-    return this;
-  }
-
-  public List<T> query(Predicate<T> p) throws OrmException {
-    try {
-      return queryProcessor.query(p).entities();
-    } catch (QueryParseException e) {
-      throw new OrmException(e);
-    }
-  }
-
-  /**
-   * Run multiple queries in parallel.
-   *
-   * <p>If a limit was specified using {@link #setLimit(int)}, that limit is applied to each query
-   * independently.
-   *
-   * @param queries list of queries.
-   * @return results of the queries, one list of results per input query, in the same order as the
-   *     input.
-   */
-  public List<List<T>> query(List<Predicate<T>> queries) throws OrmException {
-    try {
-      return Lists.transform(queryProcessor.query(queries), QueryResult::entities);
-    } catch (QueryParseException e) {
-      throw new OrmException(e);
-    }
-  }
-
-  protected Schema<T> schema() {
-    Index<?, T> index = indexes != null ? indexes.getSearchIndex() : null;
-    return index != null ? index.getSchema() : null;
-  }
-}
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/query/PostFilterPredicate.java b/gerrit-index/src/main/java/com/google/gerrit/index/query/PostFilterPredicate.java
deleted file mode 100644
index 3e780bf..0000000
--- a/gerrit-index/src/main/java/com/google/gerrit/index/query/PostFilterPredicate.java
+++ /dev/null
@@ -1,21 +0,0 @@
-// 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.
-
-package com.google.gerrit.index.query;
-
-/**
- * Matches all documents in the index, with additional filtering done in the subclass's {@code
- * match} method.
- */
-public abstract class PostFilterPredicate<T> extends Predicate<T> implements Matchable<T> {}
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/query/Predicate.java b/gerrit-index/src/main/java/com/google/gerrit/index/query/Predicate.java
deleted file mode 100644
index ca74a52..0000000
--- a/gerrit-index/src/main/java/com/google/gerrit/index/query/Predicate.java
+++ /dev/null
@@ -1,165 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.index.query;
-
-import static com.google.common.base.Preconditions.checkState;
-
-import com.google.common.collect.Iterables;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * An abstract predicate tree for any form of query.
- *
- * <p>Implementations should be immutable, such that the meaning of a predicate never changes once
- * constructed. They should ensure their immutable promise by defensively copying any structures
- * which might be modified externally, but was passed into the object's constructor.
- *
- * <p>However, implementations <i>may</i> retain non-thread-safe caches internally, to speed up
- * evaluation operations within the context of one thread's evaluation of the predicate. As a
- * result, callers should assume predicates are not thread-safe, but that two predicate graphs
- * produce the same results given the same inputs if they are {@link #equals(Object)}.
- *
- * <p>Predicates should support deep inspection whenever possible, so that generic algorithms can be
- * written to operate against them. Predicates which contain other predicates should override {@link
- * #getChildren()} to return the list of children nested within the predicate.
- *
- * @param <T> type of object the predicate can evaluate in memory.
- */
-public abstract class Predicate<T> {
-  /** A predicate that matches any input, always, with no cost. */
-  @SuppressWarnings("unchecked")
-  public static <T> Predicate<T> any() {
-    return (Predicate<T>) Any.INSTANCE;
-  }
-
-  /** Combine the passed predicates into a single AND node. */
-  @SafeVarargs
-  public static <T> Predicate<T> and(Predicate<T>... that) {
-    if (that.length == 1) {
-      return that[0];
-    }
-    return new AndPredicate<>(that);
-  }
-
-  /** Combine the passed predicates into a single AND node. */
-  public static <T> Predicate<T> and(Collection<? extends Predicate<T>> that) {
-    if (that.size() == 1) {
-      return Iterables.getOnlyElement(that);
-    }
-    return new AndPredicate<>(that);
-  }
-
-  /** Combine the passed predicates into a single OR node. */
-  @SafeVarargs
-  public static <T> Predicate<T> or(Predicate<T>... that) {
-    if (that.length == 1) {
-      return that[0];
-    }
-    return new OrPredicate<>(that);
-  }
-
-  /** Combine the passed predicates into a single OR node. */
-  public static <T> Predicate<T> or(Collection<? extends Predicate<T>> that) {
-    if (that.size() == 1) {
-      return Iterables.getOnlyElement(that);
-    }
-    return new OrPredicate<>(that);
-  }
-
-  /** Invert the passed node. */
-  public static <T> Predicate<T> not(Predicate<T> that) {
-    if (that instanceof NotPredicate) {
-      // Negate of a negate is the original predicate.
-      //
-      return that.getChild(0);
-    }
-    return new NotPredicate<>(that);
-  }
-
-  /** Get the children of this predicate, if any. */
-  public List<Predicate<T>> getChildren() {
-    return Collections.emptyList();
-  }
-
-  /** Same as {@code getChildren().size()} */
-  public int getChildCount() {
-    return getChildren().size();
-  }
-
-  /** Same as {@code getChildren().get(i)} */
-  public Predicate<T> getChild(int i) {
-    return getChildren().get(i);
-  }
-
-  /** Create a copy of this predicate, with new children. */
-  public abstract Predicate<T> copy(Collection<? extends Predicate<T>> children);
-
-  public boolean isMatchable() {
-    return this instanceof Matchable;
-  }
-
-  @SuppressWarnings("unchecked")
-  public Matchable<T> asMatchable() {
-    checkState(isMatchable(), "not matchable");
-    return (Matchable<T>) this;
-  }
-
-  /** @return a cost estimate to run this predicate, higher figures cost more. */
-  public int estimateCost() {
-    if (!isMatchable()) {
-      return 1;
-    }
-    return asMatchable().getCost();
-  }
-
-  @Override
-  public abstract int hashCode();
-
-  @Override
-  public abstract boolean equals(Object other);
-
-  private static class Any<T> extends Predicate<T> implements Matchable<T> {
-    private static final Any<Object> INSTANCE = new Any<>();
-
-    private Any() {}
-
-    @Override
-    public Predicate<T> copy(Collection<? extends Predicate<T>> children) {
-      return this;
-    }
-
-    @Override
-    public boolean match(T object) {
-      return true;
-    }
-
-    @Override
-    public int getCost() {
-      return 0;
-    }
-
-    @Override
-    public int hashCode() {
-      return System.identityHashCode(this);
-    }
-
-    @Override
-    public boolean equals(Object other) {
-      return other == this;
-    }
-  }
-}
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/query/QueryProcessor.java b/gerrit-index/src/main/java/com/google/gerrit/index/query/QueryProcessor.java
deleted file mode 100644
index b318199..0000000
--- a/gerrit-index/src/main/java/com/google/gerrit/index/query/QueryProcessor.java
+++ /dev/null
@@ -1,335 +0,0 @@
-// 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.
-
-package com.google.gerrit.index.query;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.common.collect.ImmutableList.toImmutableList;
-
-import com.google.common.base.Throwables;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Ordering;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.index.Index;
-import com.google.gerrit.index.IndexCollection;
-import com.google.gerrit.index.IndexConfig;
-import com.google.gerrit.index.IndexRewriter;
-import com.google.gerrit.index.QueryOptions;
-import com.google.gerrit.index.SchemaDefinitions;
-import com.google.gerrit.metrics.Description;
-import com.google.gerrit.metrics.Field;
-import com.google.gerrit.metrics.MetricMaker;
-import com.google.gerrit.metrics.Timer1;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.OrmRuntimeException;
-import com.google.gwtorm.server.ResultSet;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.function.IntSupplier;
-import java.util.stream.IntStream;
-
-/**
- * Lower-level implementation for executing a single query over a secondary index.
- *
- * <p>Instances are one-time-use. Other singleton classes should inject a Provider rather than
- * holding on to a single instance.
- */
-public abstract class QueryProcessor<T> {
-  protected static class Metrics {
-    final Timer1<String> executionTime;
-
-    Metrics(MetricMaker metricMaker) {
-      Field<String> index = Field.ofString("index", "index name");
-      executionTime =
-          metricMaker.newTimer(
-              "query/query_latency",
-              new Description("Successful query latency, accumulated over the life of the process")
-                  .setCumulative()
-                  .setUnit(Description.Units.MILLISECONDS),
-              index);
-    }
-  }
-
-  private final Metrics metrics;
-  private final SchemaDefinitions<T> schemaDef;
-  private final IndexConfig indexConfig;
-  private final IndexCollection<?, T, ? extends Index<?, T>> indexes;
-  private final IndexRewriter<T> rewriter;
-  private final String limitField;
-  private final IntSupplier permittedLimit;
-
-  // This class is not generally thread-safe, but programmer error may result in it being shared
-  // across threads. At least ensure the bit for checking if it's been used is threadsafe.
-  private final AtomicBoolean used;
-
-  protected int start;
-
-  private boolean enforceVisibility = true;
-  private int userProvidedLimit;
-  private Set<String> requestedFields;
-
-  protected QueryProcessor(
-      MetricMaker metricMaker,
-      SchemaDefinitions<T> schemaDef,
-      IndexConfig indexConfig,
-      IndexCollection<?, T, ? extends Index<?, T>> indexes,
-      IndexRewriter<T> rewriter,
-      String limitField,
-      IntSupplier permittedLimit) {
-    this.metrics = new Metrics(metricMaker);
-    this.schemaDef = schemaDef;
-    this.indexConfig = indexConfig;
-    this.indexes = indexes;
-    this.rewriter = rewriter;
-    this.limitField = limitField;
-    this.permittedLimit = permittedLimit;
-    this.used = new AtomicBoolean(false);
-  }
-
-  public QueryProcessor<T> setStart(int n) {
-    start = n;
-    return this;
-  }
-
-  /**
-   * Specify whether to enforce visibility by filtering out results that are not visible to the
-   * user.
-   *
-   * <p>Enforcing visibility may have performance consequences, as the index system may need to
-   * post-filter a large number of results to fill even a modest limit.
-   *
-   * <p>If visibility is enforced, the user's {@code queryLimit} global capability is also used to
-   * bound the total number of results. If this capability is non-positive, this results in the
-   * entire query processor being {@link #isDisabled() disabled}.
-   *
-   * @param enforce whether to enforce visibility.
-   * @return this.
-   */
-  public QueryProcessor<T> enforceVisibility(boolean enforce) {
-    enforceVisibility = enforce;
-    return this;
-  }
-
-  /**
-   * Set an end-user-provided limit on the number of results returned.
-   *
-   * <p>Since this limit is provided by an end user, it may exceed the limit that they are
-   * authorized to use. This is allowed; the processor will take multiple possible limits into
-   * account and choose the one that makes the most sense.
-   *
-   * @param n limit; zero or negative means no limit.
-   * @return this.
-   */
-  public QueryProcessor<T> setUserProvidedLimit(int n) {
-    userProvidedLimit = n;
-    return this;
-  }
-
-  public QueryProcessor<T> setRequestedFields(Set<String> fields) {
-    requestedFields = fields;
-    return this;
-  }
-
-  /**
-   * Query for entities that match a structured query.
-   *
-   * @see #query(List)
-   * @param query the query.
-   * @return results of the query.
-   */
-  public QueryResult<T> query(Predicate<T> query) throws OrmException, QueryParseException {
-    return query(ImmutableList.of(query)).get(0);
-  }
-
-  /**
-   * Perform multiple queries in parallel.
-   *
-   * <p>If querying is disabled, short-circuits the index and returns empty results. Callers that
-   * wish to distinguish this case from a query returning no results from the index may call {@link
-   * #isDisabled()} themselves.
-   *
-   * @param queries list of queries.
-   * @return results of the queries, one QueryResult per input query, in the same order as the
-   *     input.
-   */
-  public List<QueryResult<T>> query(List<Predicate<T>> queries)
-      throws OrmException, QueryParseException {
-    try {
-      return query(null, queries);
-    } catch (OrmRuntimeException e) {
-      throw new OrmException(e.getMessage(), e);
-    } catch (OrmException e) {
-      if (e.getCause() != null) {
-        Throwables.throwIfInstanceOf(e.getCause(), QueryParseException.class);
-      }
-      throw e;
-    }
-  }
-
-  private List<QueryResult<T>> query(
-      @Nullable List<String> queryStrings, List<Predicate<T>> queries)
-      throws OrmException, QueryParseException {
-    long startNanos = System.nanoTime();
-    checkState(!used.getAndSet(true), "%s has already been used", getClass().getSimpleName());
-    int cnt = queries.size();
-    if (queryStrings != null) {
-      int qs = queryStrings.size();
-      checkArgument(qs == cnt, "got %s query strings but %s predicates", qs, cnt);
-    }
-    if (cnt == 0) {
-      return ImmutableList.of();
-    }
-    if (isDisabled()) {
-      return disabledResults(queryStrings, queries);
-    }
-
-    // Parse and rewrite all queries.
-    List<Integer> limits = new ArrayList<>(cnt);
-    List<Predicate<T>> predicates = new ArrayList<>(cnt);
-    List<DataSource<T>> sources = new ArrayList<>(cnt);
-    for (Predicate<T> q : queries) {
-      int limit = getEffectiveLimit(q);
-      limits.add(limit);
-
-      if (limit == getBackendSupportedLimit()) {
-        limit--;
-      }
-
-      int page = (start / limit) + 1;
-      if (page > indexConfig.maxPages()) {
-        throw new QueryParseException(
-            "Cannot go beyond page " + indexConfig.maxPages() + " of results");
-      }
-
-      // Always bump limit by 1, even if this results in exceeding the permitted
-      // max for this user. The only way to see if there are more entities is to
-      // ask for one more result from the query.
-      QueryOptions opts = createOptions(indexConfig, start, limit + 1, getRequestedFields());
-      Predicate<T> pred = rewriter.rewrite(q, opts);
-      if (enforceVisibility) {
-        pred = enforceVisibility(pred);
-      }
-      predicates.add(pred);
-
-      @SuppressWarnings("unchecked")
-      DataSource<T> s = (DataSource<T>) pred;
-      sources.add(s);
-    }
-
-    // Run each query asynchronously, if supported.
-    List<ResultSet<T>> matches = new ArrayList<>(cnt);
-    for (DataSource<T> s : sources) {
-      matches.add(s.read());
-    }
-
-    List<QueryResult<T>> out = new ArrayList<>(cnt);
-    for (int i = 0; i < cnt; i++) {
-      out.add(
-          QueryResult.create(
-              queryStrings != null ? queryStrings.get(i) : null,
-              predicates.get(i),
-              limits.get(i),
-              matches.get(i).toList()));
-    }
-
-    // Only measure successful queries that actually touched the index.
-    metrics.executionTime.record(
-        schemaDef.getName(), System.nanoTime() - startNanos, TimeUnit.NANOSECONDS);
-    return out;
-  }
-
-  private static <T> ImmutableList<QueryResult<T>> disabledResults(
-      List<String> queryStrings, List<Predicate<T>> queries) {
-    return IntStream.range(0, queries.size())
-        .mapToObj(
-            i ->
-                QueryResult.create(
-                    queryStrings != null ? queryStrings.get(i) : null,
-                    queries.get(i),
-                    0,
-                    ImmutableList.of()))
-        .collect(toImmutableList());
-  }
-
-  protected QueryOptions createOptions(
-      IndexConfig indexConfig, int start, int limit, Set<String> requestedFields) {
-    return QueryOptions.create(indexConfig, start, limit, requestedFields);
-  }
-
-  /**
-   * Invoked after the query was rewritten. Subclasses must overwrite this method to filter out
-   * results that are not visible to the calling user.
-   *
-   * @param pred the query
-   * @return the modified query
-   */
-  protected abstract Predicate<T> enforceVisibility(Predicate<T> pred);
-
-  private Set<String> getRequestedFields() {
-    if (requestedFields != null) {
-      return requestedFields;
-    }
-    Index<?, T> index = indexes.getSearchIndex();
-    return index != null ? index.getSchema().getStoredFields().keySet() : ImmutableSet.<String>of();
-  }
-
-  /**
-   * Check whether querying should be disabled.
-   *
-   * <p>Currently, the only condition that can disable the whole query processor is if both {@link
-   * #enforceVisibility(boolean) visibility is enforced} and the user has a non-positive maximum
-   * value for the {@code queryLimit} capability.
-   *
-   * <p>If querying is disabled, all calls to {@link #query(Predicate)} and {@link #query(List)}
-   * will return empty results. This method can be used if callers wish to distinguish this case
-   * from a query returning no results from the index.
-   *
-   * @return true if querying should be disabled.
-   */
-  public boolean isDisabled() {
-    return enforceVisibility && getPermittedLimit() <= 0;
-  }
-
-  private int getPermittedLimit() {
-    return enforceVisibility ? permittedLimit.getAsInt() : Integer.MAX_VALUE;
-  }
-
-  private int getBackendSupportedLimit() {
-    return indexConfig.maxLimit();
-  }
-
-  private int getEffectiveLimit(Predicate<T> p) {
-    List<Integer> possibleLimits = new ArrayList<>(4);
-    possibleLimits.add(getBackendSupportedLimit());
-    possibleLimits.add(getPermittedLimit());
-    if (userProvidedLimit > 0) {
-      possibleLimits.add(userProvidedLimit);
-    }
-    if (limitField != null) {
-      Integer limitFromPredicate = LimitPredicate.getLimit(limitField, p);
-      if (limitFromPredicate != null) {
-        possibleLimits.add(limitFromPredicate);
-      }
-    }
-    int result = Ordering.natural().min(possibleLimits);
-    // Should have short-circuited from #query or thrown some other exception before getting here.
-    checkState(result > 0, "effective limit should be positive");
-    return result;
-  }
-}
diff --git a/gerrit-launcher/BUILD b/gerrit-launcher/BUILD
deleted file mode 100644
index 33b779e..0000000
--- a/gerrit-launcher/BUILD
+++ /dev/null
@@ -1,19 +0,0 @@
-# NOTE: GerritLauncher must be a single, self-contained class. Do not add any
-# additional srcs or deps to this rule.
-java_library(
-    name = "launcher",
-    srcs = ["src/main/java/com/google/gerrit/launcher/GerritLauncher.java"],
-    resources = [":workspace-root.txt"],
-    visibility = ["//visibility:public"],
-)
-
-# The root of the workspace is non-hermetic, but we need it for
-# on-the-fly GWT recompiles and PolyGerrit updates.
-genrule(
-    name = "gen_root",
-    outs = ["workspace-root.txt"],
-    cmd = ("cat bazel-out/stable-status.txt | " +
-           "grep STABLE_WORKSPACE_ROOT | cut -d ' ' -f 2 > $@"),
-    stamp = 1,
-    visibility = ["//visibility:public"],
-)
diff --git a/gerrit-launcher/src/main/java/com/google/gerrit/launcher/GerritLauncher.java b/gerrit-launcher/src/main/java/com/google/gerrit/launcher/GerritLauncher.java
deleted file mode 100644
index a592b7e..0000000
--- a/gerrit-launcher/src/main/java/com/google/gerrit/launcher/GerritLauncher.java
+++ /dev/null
@@ -1,713 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.launcher;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.concurrent.TimeUnit.DAYS;
-import static java.util.concurrent.TimeUnit.MILLISECONDS;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.net.JarURLConnection;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.nio.file.FileSystem;
-import java.nio.file.FileSystems;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.security.CodeSource;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Scanner;
-import java.util.SortedMap;
-import java.util.TreeMap;
-import java.util.jar.Attributes;
-import java.util.jar.JarFile;
-import java.util.jar.Manifest;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-
-/** Main class for a JAR file to run code from "WEB-INF/lib". */
-public final class GerritLauncher {
-  private static final String PKG = "com.google.gerrit.pgm";
-  public static final String NOT_ARCHIVED = "NOT_ARCHIVED";
-
-  private static ClassLoader daemonClassLoader;
-
-  public static void main(String[] argv) throws Exception {
-    System.exit(mainImpl(argv));
-  }
-
-  /**
-   * Invokes a proram.
-   *
-   * <p>Creates a new classloader to load and run the program class. To reuse a classloader across
-   * calls (e.g. from tests), use {@link #invokeProgram(ClassLoader, String[])}.
-   *
-   * @param argv arguments, as would be passed to {@code gerrit.war}. The first argument is the
-   *     program name.
-   * @return program return code.
-   * @throws Exception if any error occurs.
-   */
-  public static int mainImpl(String[] argv) throws Exception {
-    if (argv.length == 0) {
-      File me;
-      try {
-        me = getDistributionArchive();
-      } catch (FileNotFoundException e) {
-        me = null;
-      }
-
-      String jar = me != null ? me.getName() : "gerrit.war";
-      System.err.println("Gerrit Code Review " + getVersion(me));
-      System.err.println("usage: java -jar " + jar + " command [ARG ...]");
-      System.err.println();
-      System.err.println("The most commonly used commands are:");
-      System.err.println("  init            Initialize a Gerrit installation");
-      System.err.println("  reindex         Rebuild the secondary index");
-      System.err.println("  daemon          Run the Gerrit network daemons");
-      System.err.println("  gsql            Run the interactive query console");
-      System.err.println("  version         Display the build version number");
-      System.err.println("  passwd          Set or change password in secure.config");
-
-      System.err.println();
-      System.err.println("  ls              List files available for cat");
-      System.err.println("  cat FILE        Display a file from the archive");
-      System.err.println();
-      return 1;
-    }
-
-    // Special cases, a few global options actually are programs.
-    //
-    if ("-v".equals(argv[0]) || "--version".equals(argv[0])) {
-      argv[0] = "version";
-    } else if ("-p".equals(argv[0]) || "--cat".equals(argv[0])) {
-      argv[0] = "cat";
-    } else if ("-l".equals(argv[0]) || "--ls".equals(argv[0])) {
-      argv[0] = "ls";
-    }
-
-    // Run the application class
-    //
-    final ClassLoader cl = libClassLoader(isProlog(programClassName(argv[0])));
-    Thread.currentThread().setContextClassLoader(cl);
-    return invokeProgram(cl, argv);
-  }
-
-  public static void daemonStart(String[] argv) throws Exception {
-    if (daemonClassLoader != null) {
-      throw new IllegalStateException("daemonStart can be called only once per JVM instance");
-    }
-    final ClassLoader cl = libClassLoader(false);
-    Thread.currentThread().setContextClassLoader(cl);
-
-    daemonClassLoader = cl;
-
-    String[] daemonArgv = new String[argv.length + 1];
-    daemonArgv[0] = "daemon";
-    for (int i = 0; i < argv.length; i++) {
-      daemonArgv[i + 1] = argv[i];
-    }
-    int res = invokeProgram(cl, daemonArgv);
-    if (res != 0) {
-      throw new Exception("Unexpected return value: " + res);
-    }
-  }
-
-  public static void daemonStop(String[] argv) throws Exception {
-    if (daemonClassLoader == null) {
-      throw new IllegalStateException("daemonStop can be called only after call to daemonStop");
-    }
-    String[] daemonArgv = new String[argv.length + 2];
-    daemonArgv[0] = "daemon";
-    daemonArgv[1] = "--stop-only";
-    for (int i = 0; i < argv.length; i++) {
-      daemonArgv[i + 2] = argv[i];
-    }
-    int res = invokeProgram(daemonClassLoader, daemonArgv);
-    if (res != 0) {
-      throw new Exception("Unexpected return value: " + res);
-    }
-  }
-
-  private static boolean isProlog(String cn) {
-    return "PrologShell".equals(cn) || "Rulec".equals(cn);
-  }
-
-  private static String getVersion(File me) {
-    if (me == null) {
-      return "";
-    }
-
-    try (JarFile jar = new JarFile(me)) {
-      Manifest mf = jar.getManifest();
-      Attributes att = mf.getMainAttributes();
-      String val = att.getValue(Attributes.Name.IMPLEMENTATION_VERSION);
-      return val != null ? val : "";
-    } catch (IOException e) {
-      return "";
-    }
-  }
-
-  /**
-   * Invokes a proram in the provided {@code ClassLoader}.
-   *
-   * @param loader classloader to load program class from.
-   * @param origArgv arguments, as would be passed to {@code gerrit.war}. The first argument is the
-   *     program name.
-   * @return program return code.
-   * @throws Exception if any error occurs.
-   */
-  public static int invokeProgram(ClassLoader loader, String[] origArgv) throws Exception {
-    String name = origArgv[0];
-    final String[] argv = new String[origArgv.length - 1];
-    System.arraycopy(origArgv, 1, argv, 0, argv.length);
-
-    Class<?> clazz;
-    try {
-      try {
-        String cn = programClassName(name);
-        clazz = Class.forName(PKG + "." + cn, true, loader);
-      } catch (ClassNotFoundException cnfe) {
-        if (name.equals(name.toLowerCase())) {
-          clazz = Class.forName(PKG + "." + name, true, loader);
-        } else {
-          throw cnfe;
-        }
-      }
-    } catch (ClassNotFoundException cnfe) {
-      System.err.println("fatal: unknown command " + name);
-      System.err.println("      (no " + PKG + "." + name + ")");
-      return 1;
-    }
-
-    final Method main;
-    try {
-      main = clazz.getMethod("main", argv.getClass());
-    } catch (SecurityException | NoSuchMethodException e) {
-      System.err.println("fatal: unknown command " + name);
-      return 1;
-    }
-
-    final Object res;
-    try {
-      if ((main.getModifiers() & Modifier.STATIC) == Modifier.STATIC) {
-        res = main.invoke(null, new Object[] {argv});
-      } else {
-        res =
-            main.invoke(clazz.getConstructor(new Class<?>[] {}).newInstance(), new Object[] {argv});
-      }
-    } catch (InvocationTargetException ite) {
-      if (ite.getCause() instanceof Exception) {
-        throw (Exception) ite.getCause();
-      } else if (ite.getCause() instanceof Error) {
-        throw (Error) ite.getCause();
-      } else {
-        throw ite;
-      }
-    }
-    if (res instanceof Number) {
-      return ((Number) res).intValue();
-    }
-    return 0;
-  }
-
-  private static String programClassName(String cn) {
-    if (cn.equals(cn.toLowerCase())) {
-      StringBuilder buf = new StringBuilder();
-      buf.append(Character.toUpperCase(cn.charAt(0)));
-      for (int i = 1; i < cn.length(); i++) {
-        if (cn.charAt(i) == '-' && i + 1 < cn.length()) {
-          i++;
-          buf.append(Character.toUpperCase(cn.charAt(i)));
-        } else {
-          buf.append(cn.charAt(i));
-        }
-      }
-      return buf.toString();
-    }
-    return cn;
-  }
-
-  private static ClassLoader libClassLoader(boolean prologCompiler) throws IOException {
-    final File path;
-    try {
-      path = getDistributionArchive();
-    } catch (FileNotFoundException e) {
-      if (NOT_ARCHIVED.equals(e.getMessage())) {
-        return useDevClasspath();
-      }
-      throw e;
-    }
-
-    final SortedMap<String, URL> jars = new TreeMap<>();
-    try (ZipFile zf = new ZipFile(path)) {
-      final Enumeration<? extends ZipEntry> e = zf.entries();
-      while (e.hasMoreElements()) {
-        final ZipEntry ze = e.nextElement();
-        if (ze.isDirectory()) {
-          continue;
-        }
-
-        String name = ze.getName();
-        if (name.startsWith("WEB-INF/lib/")) {
-          extractJar(zf, ze, jars);
-        } else if (name.startsWith("WEB-INF/pgm-lib/")) {
-          // Some Prolog tools are restricted.
-          if (prologCompiler || !name.startsWith("WEB-INF/pgm-lib/prolog-")) {
-            extractJar(zf, ze, jars);
-          }
-        }
-      }
-    } catch (IOException e) {
-      throw new IOException("Cannot obtain libraries from " + path, e);
-    }
-
-    if (jars.isEmpty()) {
-      return GerritLauncher.class.getClassLoader();
-    }
-
-    // The extension API needs to be its own ClassLoader, along
-    // with a few of its dependencies. Try to construct this first.
-    List<URL> extapi = new ArrayList<>();
-    move(jars, "gerrit-extension-api-", extapi);
-    move(jars, "guice-", extapi);
-    move(jars, "javax.inject-1.jar", extapi);
-    move(jars, "aopalliance-1.0.jar", extapi);
-    move(jars, "guice-servlet-", extapi);
-    move(jars, "tomcat-servlet-api-", extapi);
-
-    ClassLoader parent = ClassLoader.getSystemClassLoader();
-    if (!extapi.isEmpty()) {
-      parent = new URLClassLoader(extapi.toArray(new URL[extapi.size()]), parent);
-    }
-    return new URLClassLoader(jars.values().toArray(new URL[jars.size()]), parent);
-  }
-
-  private static void extractJar(ZipFile zf, ZipEntry ze, SortedMap<String, URL> jars)
-      throws IOException {
-    File tmp = createTempFile(safeName(ze), ".jar");
-    try (OutputStream out = Files.newOutputStream(tmp.toPath());
-        InputStream in = zf.getInputStream(ze)) {
-      byte[] buf = new byte[4096];
-      int n;
-      while ((n = in.read(buf, 0, buf.length)) > 0) {
-        out.write(buf, 0, n);
-      }
-    }
-
-    String name = ze.getName();
-    jars.put(name.substring(name.lastIndexOf('/'), name.length()), tmp.toURI().toURL());
-  }
-
-  private static void move(SortedMap<String, URL> jars, String prefix, List<URL> extapi) {
-    SortedMap<String, URL> matches = jars.tailMap(prefix);
-    if (!matches.isEmpty()) {
-      String first = matches.firstKey();
-      if (first.startsWith(prefix)) {
-        extapi.add(jars.remove(first));
-      }
-    }
-  }
-
-  private static String safeName(ZipEntry ze) {
-    // Try to derive the name of the temporary file so it
-    // doesn't completely suck. Best if we can make it
-    // match the name it was in the archive.
-    //
-    String name = ze.getName();
-    if (name.contains("/")) {
-      name = name.substring(name.lastIndexOf('/') + 1);
-    }
-    if (name.contains(".")) {
-      name = name.substring(0, name.lastIndexOf('.'));
-    }
-    if (name.isEmpty()) {
-      name = "code";
-    }
-    return name;
-  }
-
-  private static volatile File myArchive;
-  private static volatile File myHome;
-
-  private static final Map<Path, FileSystem> zipFileSystems = new HashMap<>();
-
-  /**
-   * Locate the JAR/WAR file we were launched from.
-   *
-   * @return local path of the Gerrit WAR file.
-   * @throws FileNotFoundException if the code cannot guess the location.
-   */
-  public static File getDistributionArchive() throws FileNotFoundException, IOException {
-    File result = myArchive;
-    if (result == null) {
-      synchronized (GerritLauncher.class) {
-        result = myArchive;
-        if (result != null) {
-          return result;
-        }
-        result = locateMyArchive();
-        myArchive = result;
-      }
-    }
-    return result;
-  }
-
-  public static synchronized FileSystem getZipFileSystem(Path zip) throws IOException {
-    // FileSystems canonicalizes the path, so we should too.
-    zip = zip.toRealPath();
-    FileSystem zipFs = zipFileSystems.get(zip);
-    if (zipFs == null) {
-      zipFs = newZipFileSystem(zip);
-      zipFileSystems.put(zip, zipFs);
-    }
-    return zipFs;
-  }
-
-  public static FileSystem newZipFileSystem(Path zip) throws IOException {
-    return FileSystems.newFileSystem(
-        URI.create("jar:" + zip.toUri()), Collections.<String, String>emptyMap());
-  }
-
-  private static File locateMyArchive() throws FileNotFoundException {
-    final ClassLoader myCL = GerritLauncher.class.getClassLoader();
-    final String myName = GerritLauncher.class.getName().replace('.', '/') + ".class";
-
-    final URL myClazz = myCL.getResource(myName);
-    if (myClazz == null) {
-      throw new FileNotFoundException("Cannot find JAR: no " + myName);
-    }
-
-    // ZipFile may have the path of our JAR hiding within itself.
-    //
-    try {
-      JarFile jar = ((JarURLConnection) myClazz.openConnection()).getJarFile();
-      File path = new File(jar.getName());
-      if (path.isFile()) {
-        return path;
-      }
-    } catch (Exception e) {
-      // Nope, that didn't work. Try a different method.
-      //
-    }
-
-    // Maybe this is a local class file, running under a debugger?
-    //
-    if ("file".equals(myClazz.getProtocol())) {
-      final File path = new File(myClazz.getPath());
-      if (path.isFile() && path.getParentFile().isDirectory()) {
-        throw new FileNotFoundException(NOT_ARCHIVED);
-      }
-    }
-
-    // The CodeSource might be able to give us the source as a stream.
-    // If so, copy it to a local file so we have random access to it.
-    //
-    final CodeSource src = GerritLauncher.class.getProtectionDomain().getCodeSource();
-    if (src != null) {
-      try (InputStream in = src.getLocation().openStream()) {
-        final File tmp = createTempFile("gerrit_", ".zip");
-        try (OutputStream out = Files.newOutputStream(tmp.toPath())) {
-          final byte[] buf = new byte[4096];
-          int n;
-          while ((n = in.read(buf, 0, buf.length)) > 0) {
-            out.write(buf, 0, n);
-          }
-        }
-        return tmp;
-      } catch (IOException e) {
-        // Nope, that didn't work.
-        //
-      }
-    }
-
-    throw new FileNotFoundException("Cannot find local copy of JAR");
-  }
-
-  private static boolean temporaryDirectoryFound;
-  private static File temporaryDirectory;
-
-  /**
-   * Creates a temporary file within the application's unpack location.
-   *
-   * <p>The launcher unpacks the nested JAR files into a temporary directory, allowing the classes
-   * to be loaded from local disk with standard Java APIs. This method constructs a new temporary
-   * file in the same directory.
-   *
-   * <p>The method first tries to create {@code prefix + suffix} within the directory under the
-   * assumption that a given {@code prefix + suffix} combination is made at most once per JVM
-   * execution. If this fails (e.g. the named file already exists) a mangled unique name is used and
-   * returned instead, with the unique string appearing between the prefix and suffix.
-   *
-   * <p>Files created by this method will be automatically deleted by the JVM when it terminates. If
-   * the returned file is converted into a directory by the caller, the caller must arrange for the
-   * contents to be deleted before the directory is.
-   *
-   * <p>If supported by the underlying operating system, the temporary directory which contains
-   * these temporary files is accessible only by the user running the JVM.
-   *
-   * @param prefix prefix of the file name.
-   * @param suffix suffix of the file name.
-   * @return the path of the temporary file. The returned object exists in the filesystem as a file;
-   *     caller may need to delete and recreate as a directory if a directory was preferred.
-   * @throws IOException the file could not be created.
-   */
-  public static synchronized File createTempFile(String prefix, String suffix) throws IOException {
-    if (!temporaryDirectoryFound) {
-      final File d = File.createTempFile("gerrit_", "_app", tmproot());
-      if (d.delete() && d.mkdir()) {
-        // Try to lock the directory down to be accessible by us.
-        // We first have to remove all permissions, then add back
-        // only the owner permissions.
-        //
-        d.setWritable(false, false /* all */);
-        d.setReadable(false, false /* all */);
-        d.setExecutable(false, false /* all */);
-
-        d.setWritable(true, true /* owner only */);
-        d.setReadable(true, true /* owner only */);
-        d.setExecutable(true, true /* owner only */);
-
-        d.deleteOnExit();
-        temporaryDirectory = d;
-      }
-      temporaryDirectoryFound = true;
-    }
-
-    if (temporaryDirectory != null) {
-      // If we have a private directory and this name has not yet
-      // been used within the private directory, create it as-is.
-      //
-      final File tmp = new File(temporaryDirectory, prefix + suffix);
-      if (tmp.createNewFile()) {
-        tmp.deleteOnExit();
-        return tmp;
-      }
-    }
-
-    if (!prefix.endsWith("_")) {
-      prefix += "_";
-    }
-
-    final File tmp = File.createTempFile(prefix, suffix, temporaryDirectory);
-    tmp.deleteOnExit();
-    return tmp;
-  }
-
-  /**
-   * Provide path to a working directory
-   *
-   * @return local path of the working directory or null if cannot be determined
-   */
-  public static File getHomeDirectory() {
-    if (myHome == null) {
-      myHome = locateHomeDirectory();
-    }
-    return myHome;
-  }
-
-  private static File tmproot() {
-    File tmp;
-    String gerritTemp = System.getenv("GERRIT_TMP");
-    if (gerritTemp != null && gerritTemp.length() > 0) {
-      tmp = new File(gerritTemp);
-    } else {
-      tmp = new File(getHomeDirectory(), "tmp");
-    }
-    if (!tmp.exists() && !tmp.mkdirs()) {
-      System.err.println("warning: cannot create " + tmp.getAbsolutePath());
-      System.err.println("warning: using system temporary directory instead");
-      return null;
-    }
-
-    // Try to clean up any stale empty directories. Assume any empty
-    // directory that is older than 7 days is one of these dead ones
-    // that we can clean up.
-    //
-    final File[] tmpEntries = tmp.listFiles();
-    if (tmpEntries != null) {
-      final long now = System.currentTimeMillis();
-      final long expired = now - MILLISECONDS.convert(7, DAYS);
-      for (File tmpEntry : tmpEntries) {
-        if (tmpEntry.isDirectory() && tmpEntry.lastModified() < expired) {
-          final String[] all = tmpEntry.list();
-          if (all == null || all.length == 0) {
-            tmpEntry.delete();
-          }
-        }
-      }
-    }
-
-    try {
-      return tmp.getCanonicalFile();
-    } catch (IOException e) {
-      return tmp;
-    }
-  }
-
-  private static File locateHomeDirectory() {
-    // Try to find the user's home directory. If we can't find it
-    // return null so the JVM's default temporary directory is used
-    // instead. This is probably /tmp or /var/tmp.
-    //
-    String userHome = System.getProperty("user.home");
-    if (userHome == null || "".equals(userHome)) {
-      userHome = System.getenv("HOME");
-      if (userHome == null || "".equals(userHome)) {
-        System.err.println("warning: cannot determine home directory");
-        System.err.println("warning: using system temporary directory instead");
-        return null;
-      }
-    }
-
-    // Ensure the home directory exists. If it doesn't, try to make it.
-    //
-    final File home = new File(userHome);
-    if (!home.exists()) {
-      if (home.mkdirs()) {
-        System.err.println("warning: created " + home.getAbsolutePath());
-      } else {
-        System.err.println("warning: " + home.getAbsolutePath() + " not found");
-        System.err.println("warning: using system temporary directory instead");
-        return null;
-      }
-    }
-
-    // Use $HOME/.gerritcodereview/tmp for our temporary file area.
-    //
-    final File gerrithome = new File(home, ".gerritcodereview");
-    if (!gerrithome.exists() && !gerrithome.mkdirs()) {
-      System.err.println("warning: cannot create " + gerrithome.getAbsolutePath());
-      System.err.println("warning: using system temporary directory instead");
-      return null;
-    }
-    try {
-      return gerrithome.getCanonicalFile();
-    } catch (IOException e) {
-      return gerrithome;
-    }
-  }
-
-  /**
-   * Locate the path of the {@code eclipse-out} directory in a source tree.
-   *
-   * @return local path of the {@code eclipse-out} directory in a source tree.
-   * @throws FileNotFoundException if the directory cannot be found.
-   */
-  public static Path getDeveloperEclipseOut() throws FileNotFoundException {
-    return resolveInSourceRoot("eclipse-out");
-  }
-
-  static final String SOURCE_ROOT_RESOURCE = "/gerrit-launcher/workspace-root.txt";
-
-  /**
-   * Locate a path in the source tree.
-   *
-   * @return local path of the {@code name} directory in a source tree.
-   * @throws FileNotFoundException if the directory cannot be found.
-   */
-  public static Path resolveInSourceRoot(String name) throws FileNotFoundException {
-
-    // Find ourselves in the classpath, as a loose class file or jar.
-    Class<GerritLauncher> self = GerritLauncher.class;
-
-    // If the build system provides us with a source root, use that.
-    try (InputStream stream = self.getResourceAsStream(SOURCE_ROOT_RESOURCE)) {
-      if (stream != null) {
-        try (Scanner scan = new Scanner(stream, UTF_8.name()).useDelimiter("\n")) {
-          if (scan.hasNext()) {
-            Path p = Paths.get(scan.next());
-            if (!Files.exists(p)) {
-              throw new FileNotFoundException("source root not found: " + p);
-            }
-            return p;
-          }
-        }
-      }
-    } catch (IOException e) {
-      // not Bazel, then.
-    }
-
-    URL u = self.getResource(self.getSimpleName() + ".class");
-    if (u == null) {
-      throw new FileNotFoundException("Cannot find class " + self.getName());
-    } else if ("jar".equals(u.getProtocol())) {
-      String p = u.getPath();
-      try {
-        u = new URL(p.substring(0, p.indexOf('!')));
-      } catch (MalformedURLException e) {
-        FileNotFoundException fnfe = new FileNotFoundException("Not a valid jar file: " + u);
-        fnfe.initCause(e);
-        throw fnfe;
-      }
-    }
-    if (!"file".equals(u.getProtocol())) {
-      throw new FileNotFoundException("Cannot extract path from " + u);
-    }
-
-    // Pop up to the top-level source folder by looking for .buckconfig.
-    Path dir = Paths.get(u.getPath());
-    while (!Files.isRegularFile(dir.resolve("WORKSPACE"))) {
-      Path parent = dir.getParent();
-      if (parent == null) {
-        throw new FileNotFoundException("Cannot find source root from " + u);
-      }
-      dir = parent;
-    }
-
-    Path ret = dir.resolve(name);
-    if (!Files.exists(ret)) {
-      throw new FileNotFoundException(name + " not found in source root " + dir);
-    }
-    return ret;
-  }
-
-  private static ClassLoader useDevClasspath() throws MalformedURLException, FileNotFoundException {
-    Path out = resolveInSourceRoot("eclipse-out");
-    List<URL> dirs = new ArrayList<>();
-    dirs.add(out.resolve("classes").toUri().toURL());
-    ClassLoader cl = GerritLauncher.class.getClassLoader();
-    for (URL u : ((URLClassLoader) cl).getURLs()) {
-      if (includeJar(u)) {
-        dirs.add(u);
-      }
-    }
-    return new URLClassLoader(
-        dirs.toArray(new URL[dirs.size()]), ClassLoader.getSystemClassLoader().getParent());
-  }
-
-  private static boolean includeJar(URL u) {
-    String path = u.getPath();
-    return path.endsWith(".jar")
-        && !path.endsWith("-src.jar")
-        && !path.contains("/buck-out/gen/lib/gwt/");
-  }
-
-  private GerritLauncher() {}
-}
diff --git a/gerrit-lucene/BUILD b/gerrit-lucene/BUILD
deleted file mode 100644
index aae5000..0000000
--- a/gerrit-lucene/BUILD
+++ /dev/null
@@ -1,46 +0,0 @@
-QUERY_BUILDER = [
-    "src/main/java/com/google/gerrit/lucene/QueryBuilder.java",
-]
-
-java_library(
-    name = "query_builder",
-    srcs = QUERY_BUILDER,
-    visibility = ["//visibility:public"],
-    deps = [
-        "//gerrit-index:index",
-        "//gerrit-index:query_exception",
-        "//gerrit-reviewdb:server",
-        "//gerrit-server:server",
-        "//lib:guava",
-        "//lib:gwtorm",
-        "//lib/lucene:lucene-core-and-backward-codecs",
-    ],
-)
-
-java_library(
-    name = "lucene",
-    srcs = glob(
-        ["src/main/java/**/*.java"],
-        exclude = QUERY_BUILDER,
-    ),
-    visibility = ["//visibility:public"],
-    deps = [
-        ":query_builder",
-        "//gerrit-common:annotations",
-        "//gerrit-common:server",
-        "//gerrit-extension-api:api",
-        "//gerrit-index:index",
-        "//gerrit-index:query_exception",
-        "//gerrit-reviewdb:server",
-        "//gerrit-server:server",
-        "//lib:guava",
-        "//lib:gwtorm",
-        "//lib/guice",
-        "//lib/guice:guice-assistedinject",
-        "//lib/jgit/org.eclipse.jgit:jgit",
-        "//lib/log:api",
-        "//lib/lucene:lucene-analyzers-common",
-        "//lib/lucene:lucene-core-and-backward-codecs",
-        "//lib/lucene:lucene-misc",
-    ],
-)
diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/AbstractLuceneIndex.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/AbstractLuceneIndex.java
deleted file mode 100644
index 9d474dd..0000000
--- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/AbstractLuceneIndex.java
+++ /dev/null
@@ -1,419 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.lucene;
-
-import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
-import static java.util.concurrent.TimeUnit.MILLISECONDS;
-
-import com.google.common.base.Joiner;
-import com.google.common.collect.Sets;
-import com.google.common.util.concurrent.AbstractFuture;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.ListeningExecutorService;
-import com.google.common.util.concurrent.MoreExecutors;
-import com.google.common.util.concurrent.ThreadFactoryBuilder;
-import com.google.gerrit.index.FieldDef;
-import com.google.gerrit.index.FieldType;
-import com.google.gerrit.index.Index;
-import com.google.gerrit.index.Schema;
-import com.google.gerrit.index.Schema.Values;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.index.IndexUtils;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.Set;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.ScheduledThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import org.apache.lucene.document.Document;
-import org.apache.lucene.document.Field;
-import org.apache.lucene.document.Field.Store;
-import org.apache.lucene.document.IntField;
-import org.apache.lucene.document.LongField;
-import org.apache.lucene.document.StoredField;
-import org.apache.lucene.document.StringField;
-import org.apache.lucene.document.TextField;
-import org.apache.lucene.index.IndexWriter;
-import org.apache.lucene.index.Term;
-import org.apache.lucene.index.TrackingIndexWriter;
-import org.apache.lucene.search.ControlledRealTimeReopenThread;
-import org.apache.lucene.search.IndexSearcher;
-import org.apache.lucene.search.ReferenceManager;
-import org.apache.lucene.search.ReferenceManager.RefreshListener;
-import org.apache.lucene.search.SearcherFactory;
-import org.apache.lucene.store.AlreadyClosedException;
-import org.apache.lucene.store.Directory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Basic Lucene index implementation. */
-public abstract class AbstractLuceneIndex<K, V> implements Index<K, V> {
-  private static final Logger log = LoggerFactory.getLogger(AbstractLuceneIndex.class);
-
-  static String sortFieldName(FieldDef<?, ?> f) {
-    return f.getName() + "_SORT";
-  }
-
-  private final Schema<V> schema;
-  private final SitePaths sitePaths;
-  private final Directory dir;
-  private final String name;
-  private final ListeningExecutorService writerThread;
-  private final TrackingIndexWriter writer;
-  private final ReferenceManager<IndexSearcher> searcherManager;
-  private final ControlledRealTimeReopenThread<IndexSearcher> reopenThread;
-  private final Set<NrtFuture> notDoneNrtFutures;
-  private ScheduledThreadPoolExecutor autoCommitExecutor;
-
-  AbstractLuceneIndex(
-      Schema<V> schema,
-      SitePaths sitePaths,
-      Directory dir,
-      String name,
-      String subIndex,
-      GerritIndexWriterConfig writerConfig,
-      SearcherFactory searcherFactory)
-      throws IOException {
-    this.schema = schema;
-    this.sitePaths = sitePaths;
-    this.dir = dir;
-    this.name = name;
-    String index = Joiner.on('_').skipNulls().join(name, subIndex);
-    IndexWriter delegateWriter;
-    long commitPeriod = writerConfig.getCommitWithinMs();
-
-    if (commitPeriod < 0) {
-      delegateWriter = new AutoCommitWriter(dir, writerConfig.getLuceneConfig());
-    } else if (commitPeriod == 0) {
-      delegateWriter = new AutoCommitWriter(dir, writerConfig.getLuceneConfig(), true);
-    } else {
-      final AutoCommitWriter autoCommitWriter =
-          new AutoCommitWriter(dir, writerConfig.getLuceneConfig());
-      delegateWriter = autoCommitWriter;
-
-      autoCommitExecutor =
-          new ScheduledThreadPoolExecutor(
-              1,
-              new ThreadFactoryBuilder()
-                  .setNameFormat(index + " Commit-%d")
-                  .setDaemon(true)
-                  .build());
-      @SuppressWarnings("unused") // Error handling within Runnable.
-      Future<?> possiblyIgnoredError =
-          autoCommitExecutor.scheduleAtFixedRate(
-              () -> {
-                try {
-                  if (autoCommitWriter.hasUncommittedChanges()) {
-                    autoCommitWriter.manualFlush();
-                    autoCommitWriter.commit();
-                  }
-                } catch (IOException e) {
-                  log.error("Error committing " + index + " Lucene index", e);
-                } catch (OutOfMemoryError e) {
-                  log.error("Error committing " + index + " Lucene index", e);
-                  try {
-                    autoCommitWriter.close();
-                  } catch (IOException e2) {
-                    log.error(
-                        "SEVERE: Error closing "
-                            + index
-                            + " Lucene index after OOM;"
-                            + " index may be corrupted.",
-                        e);
-                  }
-                }
-              },
-              commitPeriod,
-              commitPeriod,
-              MILLISECONDS);
-    }
-    writer = new TrackingIndexWriter(delegateWriter);
-    searcherManager = new WrappableSearcherManager(writer.getIndexWriter(), true, searcherFactory);
-
-    notDoneNrtFutures = Sets.newConcurrentHashSet();
-
-    writerThread =
-        MoreExecutors.listeningDecorator(
-            Executors.newFixedThreadPool(
-                1,
-                new ThreadFactoryBuilder()
-                    .setNameFormat(index + " Write-%d")
-                    .setDaemon(true)
-                    .build()));
-
-    reopenThread =
-        new ControlledRealTimeReopenThread<>(
-            writer,
-            searcherManager,
-            0.500 /* maximum stale age (seconds) */,
-            0.010 /* minimum stale age (seconds) */);
-    reopenThread.setName(index + " NRT");
-    reopenThread.setPriority(
-        Math.min(Thread.currentThread().getPriority() + 2, Thread.MAX_PRIORITY));
-    reopenThread.setDaemon(true);
-
-    // This must be added after the reopen thread is created. The reopen thread
-    // adds its own listener which copies its internally last-refreshed
-    // generation to the searching generation. removeIfDone() depends on the
-    // searching generation being up to date when calling
-    // reopenThread.waitForGeneration(gen, 0), therefore the reopen thread's
-    // internal listener needs to be called first.
-    // TODO(dborowitz): This may have been fixed by
-    // http://issues.apache.org/jira/browse/LUCENE-5461
-    searcherManager.addListener(
-        new RefreshListener() {
-          @Override
-          public void beforeRefresh() throws IOException {}
-
-          @Override
-          public void afterRefresh(boolean didRefresh) throws IOException {
-            for (NrtFuture f : notDoneNrtFutures) {
-              f.removeIfDone();
-            }
-          }
-        });
-
-    reopenThread.start();
-  }
-
-  @Override
-  public void markReady(boolean ready) throws IOException {
-    IndexUtils.setReady(sitePaths, name, schema.getVersion(), ready);
-  }
-
-  @Override
-  public void close() {
-    if (autoCommitExecutor != null) {
-      autoCommitExecutor.shutdown();
-    }
-
-    writerThread.shutdown();
-    try {
-      if (!writerThread.awaitTermination(5, TimeUnit.SECONDS)) {
-        log.warn("shutting down " + name + " index with pending Lucene writes");
-      }
-    } catch (InterruptedException e) {
-      log.warn("interrupted waiting for pending Lucene writes of " + name + " index", e);
-    }
-    reopenThread.close();
-
-    // Closing the reopen thread sets its generation to Long.MAX_VALUE, but we
-    // still need to refresh the searcher manager to let pending NrtFutures
-    // know.
-    //
-    // Any futures created after this method (which may happen due to undefined
-    // shutdown ordering behavior) will finish immediately, even though they may
-    // not have flushed.
-    try {
-      searcherManager.maybeRefreshBlocking();
-    } catch (IOException e) {
-      log.warn("error finishing pending Lucene writes", e);
-    }
-
-    try {
-      writer.getIndexWriter().close();
-    } catch (AlreadyClosedException e) {
-      // Ignore.
-    } catch (IOException e) {
-      log.warn("error closing Lucene writer", e);
-    }
-    try {
-      dir.close();
-    } catch (IOException e) {
-      log.warn("error closing Lucene directory", e);
-    }
-  }
-
-  ListenableFuture<?> insert(Document doc) {
-    return submit(() -> writer.addDocument(doc));
-  }
-
-  ListenableFuture<?> replace(Term term, Document doc) {
-    return submit(() -> writer.updateDocument(term, doc));
-  }
-
-  ListenableFuture<?> delete(Term term) {
-    return submit(() -> writer.deleteDocuments(term));
-  }
-
-  private ListenableFuture<?> submit(Callable<Long> task) {
-    ListenableFuture<Long> future = Futures.nonCancellationPropagating(writerThread.submit(task));
-    return Futures.transformAsync(
-        future,
-        gen -> {
-          // Tell the reopen thread a future is waiting on this
-          // generation so it uses the min stale time when refreshing.
-          reopenThread.waitForGeneration(gen, 0);
-          return new NrtFuture(gen);
-        },
-        directExecutor());
-  }
-
-  @Override
-  public void deleteAll() throws IOException {
-    writer.deleteAll();
-  }
-
-  public TrackingIndexWriter getWriter() {
-    return writer;
-  }
-
-  IndexSearcher acquire() throws IOException {
-    return searcherManager.acquire();
-  }
-
-  void release(IndexSearcher searcher) throws IOException {
-    searcherManager.release(searcher);
-  }
-
-  Document toDocument(V obj) {
-    Document result = new Document();
-    for (Values<V> vs : schema.buildFields(obj)) {
-      if (vs.getValues() != null) {
-        add(result, vs);
-      }
-    }
-    return result;
-  }
-
-  void add(Document doc, Values<V> values) {
-    String name = values.getField().getName();
-    FieldType<?> type = values.getField().getType();
-    Store store = store(values.getField());
-
-    if (type == FieldType.INTEGER || type == FieldType.INTEGER_RANGE) {
-      for (Object value : values.getValues()) {
-        doc.add(new IntField(name, (Integer) value, store));
-      }
-    } else if (type == FieldType.LONG) {
-      for (Object value : values.getValues()) {
-        doc.add(new LongField(name, (Long) value, store));
-      }
-    } else if (type == FieldType.TIMESTAMP) {
-      for (Object value : values.getValues()) {
-        doc.add(new LongField(name, ((Timestamp) value).getTime(), store));
-      }
-    } else if (type == FieldType.EXACT || type == FieldType.PREFIX) {
-      for (Object value : values.getValues()) {
-        doc.add(new StringField(name, (String) value, store));
-      }
-    } else if (type == FieldType.FULL_TEXT) {
-      for (Object value : values.getValues()) {
-        doc.add(new TextField(name, (String) value, store));
-      }
-    } else if (type == FieldType.STORED_ONLY) {
-      for (Object value : values.getValues()) {
-        doc.add(new StoredField(name, (byte[]) value));
-      }
-    } else {
-      throw FieldType.badFieldType(type);
-    }
-  }
-
-  private static Field.Store store(FieldDef<?, ?> f) {
-    return f.isStored() ? Field.Store.YES : Field.Store.NO;
-  }
-
-  private final class NrtFuture extends AbstractFuture<Void> {
-    private final long gen;
-
-    NrtFuture(long gen) {
-      this.gen = gen;
-    }
-
-    @Override
-    public Void get() throws InterruptedException, ExecutionException {
-      if (!isDone()) {
-        reopenThread.waitForGeneration(gen);
-        set(null);
-      }
-      return super.get();
-    }
-
-    @Override
-    public Void get(long timeout, TimeUnit unit)
-        throws InterruptedException, TimeoutException, ExecutionException {
-      if (!isDone()) {
-        if (!reopenThread.waitForGeneration(gen, (int) unit.toMillis(timeout))) {
-          throw new TimeoutException();
-        }
-        set(null);
-      }
-      return super.get(timeout, unit);
-    }
-
-    @Override
-    public boolean isDone() {
-      if (super.isDone()) {
-        return true;
-      } else if (isGenAvailableNowForCurrentSearcher()) {
-        set(null);
-        return true;
-      } else if (!reopenThread.isAlive()) {
-        setException(new IllegalStateException("NRT thread is dead"));
-        return true;
-      }
-      return false;
-    }
-
-    @Override
-    public void addListener(Runnable listener, Executor executor) {
-      if (isGenAvailableNowForCurrentSearcher() && !isCancelled()) {
-        set(null);
-      } else if (!isDone()) {
-        notDoneNrtFutures.add(this);
-      }
-      super.addListener(listener, executor);
-    }
-
-    @Override
-    public boolean cancel(boolean mayInterruptIfRunning) {
-      boolean result = super.cancel(mayInterruptIfRunning);
-      if (result) {
-        notDoneNrtFutures.remove(this);
-      }
-      return result;
-    }
-
-    void removeIfDone() {
-      if (isGenAvailableNowForCurrentSearcher()) {
-        notDoneNrtFutures.remove(this);
-        if (!isCancelled()) {
-          set(null);
-        }
-      }
-    }
-
-    private boolean isGenAvailableNowForCurrentSearcher() {
-      try {
-        return reopenThread.waitForGeneration(gen, 0);
-      } catch (InterruptedException e) {
-        log.warn("Interrupted waiting for searcher generation", e);
-        return false;
-      }
-    }
-  }
-
-  @Override
-  public Schema<V> getSchema() {
-    return schema;
-  }
-}
diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/AutoCommitWriter.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/AutoCommitWriter.java
deleted file mode 100644
index 7a418aa..0000000
--- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/AutoCommitWriter.java
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.lucene;
-
-import java.io.IOException;
-import org.apache.lucene.index.IndexReader;
-import org.apache.lucene.index.IndexWriter;
-import org.apache.lucene.index.IndexWriterConfig;
-import org.apache.lucene.index.IndexableField;
-import org.apache.lucene.index.Term;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.store.Directory;
-
-/** Writer that optionally flushes/commits after every write. */
-public class AutoCommitWriter extends IndexWriter {
-  private boolean autoCommit;
-
-  AutoCommitWriter(Directory dir, IndexWriterConfig config) throws IOException {
-    this(dir, config, false);
-  }
-
-  AutoCommitWriter(Directory dir, IndexWriterConfig config, boolean autoCommit) throws IOException {
-    super(dir, config);
-    setAutoCommit(autoCommit);
-  }
-
-  /**
-   * This method will override Gerrit configuration index.name.commitWithin until next Gerrit
-   * restart (or reconfiguration through this method).
-   *
-   * @param enable auto commit
-   */
-  public void setAutoCommit(boolean enable) {
-    this.autoCommit = enable;
-  }
-
-  @Override
-  public void addDocument(Iterable<? extends IndexableField> doc) throws IOException {
-    super.addDocument(doc);
-    autoFlush();
-  }
-
-  @Override
-  public void addDocuments(Iterable<? extends Iterable<? extends IndexableField>> docs)
-      throws IOException {
-    super.addDocuments(docs);
-    autoFlush();
-  }
-
-  @Override
-  public void updateDocuments(
-      Term delTerm, Iterable<? extends Iterable<? extends IndexableField>> docs)
-      throws IOException {
-    super.updateDocuments(delTerm, docs);
-    autoFlush();
-  }
-
-  @Override
-  public void deleteDocuments(Term... term) throws IOException {
-    super.deleteDocuments(term);
-    autoFlush();
-  }
-
-  @Override
-  public synchronized boolean tryDeleteDocument(IndexReader readerIn, int docID)
-      throws IOException {
-    boolean ret = super.tryDeleteDocument(readerIn, docID);
-    if (ret) {
-      autoFlush();
-    }
-    return ret;
-  }
-
-  @Override
-  public void deleteDocuments(Query... queries) throws IOException {
-    super.deleteDocuments(queries);
-    autoFlush();
-  }
-
-  @Override
-  public void updateDocument(Term term, Iterable<? extends IndexableField> doc) throws IOException {
-    super.updateDocument(term, doc);
-    autoFlush();
-  }
-
-  @Override
-  public void deleteAll() throws IOException {
-    super.deleteAll();
-    autoFlush();
-  }
-
-  void manualFlush() throws IOException {
-    flush();
-    if (autoCommit) {
-      commit();
-    }
-  }
-
-  public void autoFlush() throws IOException {
-    if (autoCommit) {
-      manualFlush();
-    }
-  }
-}
diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/ChangeSubIndex.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/ChangeSubIndex.java
deleted file mode 100644
index 126c79f..0000000
--- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/ChangeSubIndex.java
+++ /dev/null
@@ -1,101 +0,0 @@
-// 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.
-
-package com.google.gerrit.lucene;
-
-import static com.google.common.collect.Iterables.getOnlyElement;
-import static com.google.gerrit.lucene.LuceneChangeIndex.ID_SORT_FIELD;
-import static com.google.gerrit.lucene.LuceneChangeIndex.UPDATED_SORT_FIELD;
-import static com.google.gerrit.server.index.change.ChangeSchemaDefinitions.NAME;
-
-import com.google.gerrit.index.FieldDef;
-import com.google.gerrit.index.QueryOptions;
-import com.google.gerrit.index.Schema;
-import com.google.gerrit.index.Schema.Values;
-import com.google.gerrit.index.query.DataSource;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.index.query.QueryParseException;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.index.change.ChangeField;
-import com.google.gerrit.server.index.change.ChangeIndex;
-import com.google.gerrit.server.query.change.ChangeData;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.sql.Timestamp;
-import org.apache.lucene.document.Document;
-import org.apache.lucene.document.NumericDocValuesField;
-import org.apache.lucene.search.SearcherFactory;
-import org.apache.lucene.store.Directory;
-import org.apache.lucene.store.FSDirectory;
-
-public class ChangeSubIndex extends AbstractLuceneIndex<Change.Id, ChangeData>
-    implements ChangeIndex {
-  ChangeSubIndex(
-      Schema<ChangeData> schema,
-      SitePaths sitePaths,
-      Path path,
-      GerritIndexWriterConfig writerConfig,
-      SearcherFactory searcherFactory)
-      throws IOException {
-    this(
-        schema,
-        sitePaths,
-        FSDirectory.open(path),
-        path.getFileName().toString(),
-        writerConfig,
-        searcherFactory);
-  }
-
-  ChangeSubIndex(
-      Schema<ChangeData> schema,
-      SitePaths sitePaths,
-      Directory dir,
-      String subIndex,
-      GerritIndexWriterConfig writerConfig,
-      SearcherFactory searcherFactory)
-      throws IOException {
-    super(schema, sitePaths, dir, NAME, subIndex, writerConfig, searcherFactory);
-  }
-
-  @Override
-  public void replace(ChangeData obj) throws IOException {
-    throw new UnsupportedOperationException("don't use ChangeSubIndex directly");
-  }
-
-  @Override
-  public void delete(Change.Id key) throws IOException {
-    throw new UnsupportedOperationException("don't use ChangeSubIndex directly");
-  }
-
-  @Override
-  public DataSource<ChangeData> getSource(Predicate<ChangeData> p, QueryOptions opts)
-      throws QueryParseException {
-    throw new UnsupportedOperationException("don't use ChangeSubIndex directly");
-  }
-
-  @Override
-  void add(Document doc, Values<ChangeData> values) {
-    // Add separate DocValues fields for those fields needed for sorting.
-    FieldDef<ChangeData, ?> f = values.getField();
-    if (f == ChangeField.LEGACY_ID) {
-      int v = (Integer) getOnlyElement(values.getValues());
-      doc.add(new NumericDocValuesField(ID_SORT_FIELD, v));
-    } else if (f == ChangeField.UPDATED) {
-      long t = ((Timestamp) getOnlyElement(values.getValues())).getTime();
-      doc.add(new NumericDocValuesField(UPDATED_SORT_FIELD, t));
-    }
-    super.add(doc, values);
-  }
-}
diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/GerritIndexWriterConfig.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/GerritIndexWriterConfig.java
deleted file mode 100644
index ada3220..0000000
--- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/GerritIndexWriterConfig.java
+++ /dev/null
@@ -1,75 +0,0 @@
-// 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.
-
-package com.google.gerrit.lucene;
-
-import static java.util.concurrent.TimeUnit.MILLISECONDS;
-import static java.util.concurrent.TimeUnit.MINUTES;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.gerrit.server.config.ConfigUtil;
-import org.apache.lucene.analysis.standard.StandardAnalyzer;
-import org.apache.lucene.analysis.util.CharArraySet;
-import org.apache.lucene.index.IndexWriterConfig;
-import org.apache.lucene.index.IndexWriterConfig.OpenMode;
-import org.eclipse.jgit.lib.Config;
-
-/** Combination of Lucene {@link IndexWriterConfig} with additional Gerrit-specific options. */
-class GerritIndexWriterConfig {
-  private static final ImmutableMap<String, String> CUSTOM_CHAR_MAPPING =
-      ImmutableMap.of("_", " ", ".", " ");
-
-  private final IndexWriterConfig luceneConfig;
-  private long commitWithinMs;
-  private final CustomMappingAnalyzer analyzer;
-
-  GerritIndexWriterConfig(Config cfg, String name) {
-    analyzer =
-        new CustomMappingAnalyzer(
-            new StandardAnalyzer(CharArraySet.EMPTY_SET), CUSTOM_CHAR_MAPPING);
-    luceneConfig =
-        new IndexWriterConfig(analyzer)
-            .setOpenMode(OpenMode.CREATE_OR_APPEND)
-            .setCommitOnClose(true);
-    double m = 1 << 20;
-    luceneConfig.setRAMBufferSizeMB(
-        cfg.getLong(
-                "index",
-                name,
-                "ramBufferSize",
-                (long) (IndexWriterConfig.DEFAULT_RAM_BUFFER_SIZE_MB * m))
-            / m);
-    luceneConfig.setMaxBufferedDocs(
-        cfg.getInt("index", name, "maxBufferedDocs", IndexWriterConfig.DEFAULT_MAX_BUFFERED_DOCS));
-    try {
-      commitWithinMs =
-          ConfigUtil.getTimeUnit(
-              cfg, "index", name, "commitWithin", MILLISECONDS.convert(5, MINUTES), MILLISECONDS);
-    } catch (IllegalArgumentException e) {
-      commitWithinMs = cfg.getLong("index", name, "commitWithin", 0);
-    }
-  }
-
-  CustomMappingAnalyzer getAnalyzer() {
-    return analyzer;
-  }
-
-  IndexWriterConfig getLuceneConfig() {
-    return luceneConfig;
-  }
-
-  long getCommitWithinMs() {
-    return commitWithinMs;
-  }
-}
diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneAccountIndex.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneAccountIndex.java
deleted file mode 100644
index 7a4cd40..0000000
--- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneAccountIndex.java
+++ /dev/null
@@ -1,207 +0,0 @@
-// 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.
-
-package com.google.gerrit.lucene;
-
-import static com.google.gerrit.server.index.account.AccountField.ID;
-
-import com.google.gerrit.index.QueryOptions;
-import com.google.gerrit.index.Schema;
-import com.google.gerrit.index.query.DataSource;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.index.query.QueryParseException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.index.IndexUtils;
-import com.google.gerrit.server.index.account.AccountIndex;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.ResultSet;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.concurrent.ExecutionException;
-import org.apache.lucene.document.Document;
-import org.apache.lucene.index.Term;
-import org.apache.lucene.search.IndexSearcher;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.search.ScoreDoc;
-import org.apache.lucene.search.SearcherFactory;
-import org.apache.lucene.search.Sort;
-import org.apache.lucene.search.SortField;
-import org.apache.lucene.search.TopFieldDocs;
-import org.apache.lucene.store.Directory;
-import org.apache.lucene.store.FSDirectory;
-import org.apache.lucene.store.RAMDirectory;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class LuceneAccountIndex extends AbstractLuceneIndex<Account.Id, AccountState>
-    implements AccountIndex {
-  private static final Logger log = LoggerFactory.getLogger(LuceneAccountIndex.class);
-
-  private static final String ACCOUNTS = "accounts";
-
-  private static final String ID_SORT_FIELD = sortFieldName(ID);
-
-  private static Term idTerm(AccountState as) {
-    return idTerm(as.getAccount().getId());
-  }
-
-  private static Term idTerm(Account.Id id) {
-    return QueryBuilder.intTerm(ID.getName(), id.get());
-  }
-
-  private final GerritIndexWriterConfig indexWriterConfig;
-  private final QueryBuilder<AccountState> queryBuilder;
-  private final Provider<AccountCache> accountCache;
-
-  private static Directory dir(Schema<AccountState> schema, Config cfg, SitePaths sitePaths)
-      throws IOException {
-    if (LuceneIndexModule.isInMemoryTest(cfg)) {
-      return new RAMDirectory();
-    }
-    Path indexDir = LuceneVersionManager.getDir(sitePaths, ACCOUNTS, schema);
-    return FSDirectory.open(indexDir);
-  }
-
-  @Inject
-  LuceneAccountIndex(
-      @GerritServerConfig Config cfg,
-      SitePaths sitePaths,
-      Provider<AccountCache> accountCache,
-      @Assisted Schema<AccountState> schema)
-      throws IOException {
-    super(
-        schema,
-        sitePaths,
-        dir(schema, cfg, sitePaths),
-        ACCOUNTS,
-        null,
-        new GerritIndexWriterConfig(cfg, ACCOUNTS),
-        new SearcherFactory());
-    this.accountCache = accountCache;
-
-    indexWriterConfig = new GerritIndexWriterConfig(cfg, ACCOUNTS);
-    queryBuilder = new QueryBuilder<>(schema, indexWriterConfig.getAnalyzer());
-  }
-
-  @Override
-  public void replace(AccountState as) throws IOException {
-    try {
-      replace(idTerm(as), toDocument(as)).get();
-    } catch (ExecutionException | InterruptedException e) {
-      throw new IOException(e);
-    }
-  }
-
-  @Override
-  public void delete(Account.Id key) throws IOException {
-    try {
-      delete(idTerm(key)).get();
-    } catch (ExecutionException | InterruptedException e) {
-      throw new IOException(e);
-    }
-  }
-
-  @Override
-  public DataSource<AccountState> getSource(Predicate<AccountState> p, QueryOptions opts)
-      throws QueryParseException {
-    return new QuerySource(
-        opts,
-        queryBuilder.toQuery(p),
-        new Sort(new SortField(ID_SORT_FIELD, SortField.Type.LONG, true)));
-  }
-
-  private class QuerySource implements DataSource<AccountState> {
-    private final QueryOptions opts;
-    private final Query query;
-    private final Sort sort;
-
-    private QuerySource(QueryOptions opts, Query query, Sort sort) {
-      this.opts = opts;
-      this.query = query;
-      this.sort = sort;
-    }
-
-    @Override
-    public int getCardinality() {
-      // TODO(dborowitz): In contrast to the comment in
-      // LuceneChangeIndex.QuerySource#getCardinality, at this point I actually
-      // think we might just want to remove getCardinality.
-      return 10;
-    }
-
-    @Override
-    public ResultSet<AccountState> read() throws OrmException {
-      IndexSearcher searcher = null;
-      try {
-        searcher = acquire();
-        int realLimit = opts.start() + opts.limit();
-        TopFieldDocs docs = searcher.search(query, realLimit, sort);
-        List<AccountState> result = new ArrayList<>(docs.scoreDocs.length);
-        for (int i = opts.start(); i < docs.scoreDocs.length; i++) {
-          ScoreDoc sd = docs.scoreDocs[i];
-          Document doc = searcher.doc(sd.doc, IndexUtils.accountFields(opts));
-          result.add(toAccountState(doc));
-        }
-        final List<AccountState> r = Collections.unmodifiableList(result);
-        return new ResultSet<AccountState>() {
-          @Override
-          public Iterator<AccountState> iterator() {
-            return r.iterator();
-          }
-
-          @Override
-          public List<AccountState> toList() {
-            return r;
-          }
-
-          @Override
-          public void close() {
-            // Do nothing.
-          }
-        };
-      } catch (IOException e) {
-        throw new OrmException(e);
-      } finally {
-        if (searcher != null) {
-          try {
-            release(searcher);
-          } catch (IOException e) {
-            log.warn("cannot release Lucene searcher", e);
-          }
-        }
-      }
-    }
-  }
-
-  private AccountState toAccountState(Document doc) {
-    Account.Id id = new Account.Id(doc.getField(ID.getName()).numericValue().intValue());
-    // Use the AccountCache rather than depending on any stored fields in the
-    // document (of which there shouldn't be any). The most expensive part to
-    // compute anyway is the effective group IDs, and we don't have a good way
-    // to reindex when those change.
-    return accountCache.get().get(id);
-  }
-}
diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneChangeIndex.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneChangeIndex.java
deleted file mode 100644
index 6190864..0000000
--- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneChangeIndex.java
+++ /dev/null
@@ -1,628 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.lucene;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.gerrit.lucene.AbstractLuceneIndex.sortFieldName;
-import static com.google.gerrit.server.git.QueueProvider.QueueType.INTERACTIVE;
-import static com.google.gerrit.server.index.change.ChangeField.APPROVAL_CODEC;
-import static com.google.gerrit.server.index.change.ChangeField.CHANGE_CODEC;
-import static com.google.gerrit.server.index.change.ChangeField.LEGACY_ID;
-import static com.google.gerrit.server.index.change.ChangeField.PATCH_SET_CODEC;
-import static com.google.gerrit.server.index.change.ChangeField.PROJECT;
-import static com.google.gerrit.server.index.change.ChangeIndexRewriter.CLOSED_STATUSES;
-import static com.google.gerrit.server.index.change.ChangeIndexRewriter.OPEN_STATUSES;
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.base.Throwables;
-import com.google.common.collect.Collections2;
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.MultimapBuilder;
-import com.google.common.collect.Sets;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListeningExecutorService;
-import com.google.gerrit.index.QueryOptions;
-import com.google.gerrit.index.Schema;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.index.query.QueryParseException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.StarredChangesUtil;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.index.IndexExecutor;
-import com.google.gerrit.server.index.IndexUtils;
-import com.google.gerrit.server.index.change.ChangeField;
-import com.google.gerrit.server.index.change.ChangeIndex;
-import com.google.gerrit.server.index.change.ChangeIndexRewriter;
-import com.google.gerrit.server.project.SubmitRuleOptions;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.ChangeDataSource;
-import com.google.gwtorm.protobuf.ProtobufCodec;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.OrmRuntimeException;
-import com.google.gwtorm.server.ResultSet;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import org.apache.lucene.document.Document;
-import org.apache.lucene.index.IndexWriter;
-import org.apache.lucene.index.IndexableField;
-import org.apache.lucene.index.Term;
-import org.apache.lucene.search.IndexSearcher;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.search.ScoreDoc;
-import org.apache.lucene.search.SearcherFactory;
-import org.apache.lucene.search.SearcherManager;
-import org.apache.lucene.search.Sort;
-import org.apache.lucene.search.SortField;
-import org.apache.lucene.search.TopDocs;
-import org.apache.lucene.search.TopFieldDocs;
-import org.apache.lucene.store.RAMDirectory;
-import org.apache.lucene.util.BytesRef;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Secondary index implementation using Apache Lucene.
- *
- * <p>Writes are managed using a single {@link IndexWriter} per process, committed aggressively.
- * Reads use {@link SearcherManager} and periodically refresh, though there may be some lag between
- * a committed write and it showing up to other threads' searchers.
- */
-public class LuceneChangeIndex implements ChangeIndex {
-  private static final Logger log = LoggerFactory.getLogger(LuceneChangeIndex.class);
-
-  static final String UPDATED_SORT_FIELD = sortFieldName(ChangeField.UPDATED);
-  static final String ID_SORT_FIELD = sortFieldName(ChangeField.LEGACY_ID);
-
-  private static final String CHANGES = "changes";
-  private static final String CHANGES_OPEN = "open";
-  private static final String CHANGES_CLOSED = "closed";
-  private static final String ADDED_FIELD = ChangeField.ADDED.getName();
-  private static final String APPROVAL_FIELD = ChangeField.APPROVAL.getName();
-  private static final String CHANGE_FIELD = ChangeField.CHANGE.getName();
-  private static final String DELETED_FIELD = ChangeField.DELETED.getName();
-  private static final String MERGEABLE_FIELD = ChangeField.MERGEABLE.getName();
-  private static final String PATCH_SET_FIELD = ChangeField.PATCH_SET.getName();
-  private static final String PENDING_REVIEWER_FIELD = ChangeField.PENDING_REVIEWER.getName();
-  private static final String PENDING_REVIEWER_BY_EMAIL_FIELD =
-      ChangeField.PENDING_REVIEWER_BY_EMAIL.getName();
-  private static final String REF_STATE_FIELD = ChangeField.REF_STATE.getName();
-  private static final String REF_STATE_PATTERN_FIELD = ChangeField.REF_STATE_PATTERN.getName();
-  private static final String REVIEWEDBY_FIELD = ChangeField.REVIEWEDBY.getName();
-  private static final String REVIEWER_FIELD = ChangeField.REVIEWER.getName();
-  private static final String REVIEWER_BY_EMAIL_FIELD = ChangeField.REVIEWER_BY_EMAIL.getName();
-  private static final String HASHTAG_FIELD = ChangeField.HASHTAG_CASE_AWARE.getName();
-  private static final String STAR_FIELD = ChangeField.STAR.getName();
-  private static final String SUBMIT_RECORD_LENIENT_FIELD =
-      ChangeField.STORED_SUBMIT_RECORD_LENIENT.getName();
-  private static final String SUBMIT_RECORD_STRICT_FIELD =
-      ChangeField.STORED_SUBMIT_RECORD_STRICT.getName();
-  private static final String UNRESOLVED_COMMENT_COUNT_FIELD =
-      ChangeField.UNRESOLVED_COMMENT_COUNT.getName();
-
-  static Term idTerm(ChangeData cd) {
-    return QueryBuilder.intTerm(LEGACY_ID.getName(), cd.getId().get());
-  }
-
-  static Term idTerm(Change.Id id) {
-    return QueryBuilder.intTerm(LEGACY_ID.getName(), id.get());
-  }
-
-  private final ListeningExecutorService executor;
-  private final Provider<ReviewDb> db;
-  private final ChangeData.Factory changeDataFactory;
-  private final Schema<ChangeData> schema;
-  private final QueryBuilder<ChangeData> queryBuilder;
-  private final ChangeSubIndex openIndex;
-  private final ChangeSubIndex closedIndex;
-
-  @Inject
-  LuceneChangeIndex(
-      @GerritServerConfig Config cfg,
-      SitePaths sitePaths,
-      @IndexExecutor(INTERACTIVE) ListeningExecutorService executor,
-      Provider<ReviewDb> db,
-      ChangeData.Factory changeDataFactory,
-      @Assisted Schema<ChangeData> schema)
-      throws IOException {
-    this.executor = executor;
-    this.db = db;
-    this.changeDataFactory = changeDataFactory;
-    this.schema = schema;
-
-    GerritIndexWriterConfig openConfig = new GerritIndexWriterConfig(cfg, "changes_open");
-    GerritIndexWriterConfig closedConfig = new GerritIndexWriterConfig(cfg, "changes_closed");
-
-    queryBuilder = new QueryBuilder<>(schema, openConfig.getAnalyzer());
-
-    SearcherFactory searcherFactory = new SearcherFactory();
-    if (LuceneIndexModule.isInMemoryTest(cfg)) {
-      openIndex =
-          new ChangeSubIndex(
-              schema, sitePaths, new RAMDirectory(), "ramOpen", openConfig, searcherFactory);
-      closedIndex =
-          new ChangeSubIndex(
-              schema, sitePaths, new RAMDirectory(), "ramClosed", closedConfig, searcherFactory);
-    } else {
-      Path dir = LuceneVersionManager.getDir(sitePaths, CHANGES, schema);
-      openIndex =
-          new ChangeSubIndex(
-              schema, sitePaths, dir.resolve(CHANGES_OPEN), openConfig, searcherFactory);
-      closedIndex =
-          new ChangeSubIndex(
-              schema, sitePaths, dir.resolve(CHANGES_CLOSED), closedConfig, searcherFactory);
-    }
-  }
-
-  @Override
-  public void close() {
-    try {
-      openIndex.close();
-    } finally {
-      closedIndex.close();
-    }
-  }
-
-  @Override
-  public Schema<ChangeData> getSchema() {
-    return schema;
-  }
-
-  @Override
-  public void replace(ChangeData cd) throws IOException {
-    Term id = LuceneChangeIndex.idTerm(cd);
-    // toDocument is essentially static and doesn't depend on the specific
-    // sub-index, so just pick one.
-    Document doc = openIndex.toDocument(cd);
-    try {
-      if (cd.change().getStatus().isOpen()) {
-        Futures.allAsList(closedIndex.delete(id), openIndex.replace(id, doc)).get();
-      } else {
-        Futures.allAsList(openIndex.delete(id), closedIndex.replace(id, doc)).get();
-      }
-    } catch (OrmException | ExecutionException | InterruptedException e) {
-      throw new IOException(e);
-    }
-  }
-
-  @Override
-  public void delete(Change.Id id) throws IOException {
-    Term idTerm = LuceneChangeIndex.idTerm(id);
-    try {
-      Futures.allAsList(openIndex.delete(idTerm), closedIndex.delete(idTerm)).get();
-    } catch (ExecutionException | InterruptedException e) {
-      throw new IOException(e);
-    }
-  }
-
-  @Override
-  public void deleteAll() throws IOException {
-    openIndex.deleteAll();
-    closedIndex.deleteAll();
-  }
-
-  @Override
-  public ChangeDataSource getSource(Predicate<ChangeData> p, QueryOptions opts)
-      throws QueryParseException {
-    Set<Change.Status> statuses = ChangeIndexRewriter.getPossibleStatus(p);
-    List<ChangeSubIndex> indexes = new ArrayList<>(2);
-    if (!Sets.intersection(statuses, OPEN_STATUSES).isEmpty()) {
-      indexes.add(openIndex);
-    }
-    if (!Sets.intersection(statuses, CLOSED_STATUSES).isEmpty()) {
-      indexes.add(closedIndex);
-    }
-    return new QuerySource(indexes, p, opts, getSort());
-  }
-
-  @Override
-  public void markReady(boolean ready) throws IOException {
-    // Arbitrary done on open index, as ready bit is set
-    // per index and not sub index
-    openIndex.markReady(ready);
-  }
-
-  private Sort getSort() {
-    return new Sort(
-        new SortField(UPDATED_SORT_FIELD, SortField.Type.LONG, true),
-        new SortField(ID_SORT_FIELD, SortField.Type.LONG, true));
-  }
-
-  public ChangeSubIndex getClosedChangesIndex() {
-    return closedIndex;
-  }
-
-  private class QuerySource implements ChangeDataSource {
-    private final List<ChangeSubIndex> indexes;
-    private final Predicate<ChangeData> predicate;
-    private final Query query;
-    private final QueryOptions opts;
-    private final Sort sort;
-
-    private QuerySource(
-        List<ChangeSubIndex> indexes, Predicate<ChangeData> predicate, QueryOptions opts, Sort sort)
-        throws QueryParseException {
-      this.indexes = indexes;
-      this.predicate = predicate;
-      this.query = checkNotNull(queryBuilder.toQuery(predicate), "null query from Lucene");
-      this.opts = opts;
-      this.sort = sort;
-    }
-
-    @Override
-    public int getCardinality() {
-      return 10; // TODO(dborowitz): estimate from Lucene?
-    }
-
-    @Override
-    public boolean hasChange() {
-      return false;
-    }
-
-    @Override
-    public String toString() {
-      return predicate.toString();
-    }
-
-    @Override
-    public ResultSet<ChangeData> read() throws OrmException {
-      if (Thread.interrupted()) {
-        Thread.currentThread().interrupt();
-        throw new OrmException("interrupted");
-      }
-
-      final Set<String> fields = IndexUtils.changeFields(opts);
-      return new ChangeDataResults(
-          executor.submit(
-              new Callable<List<Document>>() {
-                @Override
-                public List<Document> call() throws IOException {
-                  return doRead(fields);
-                }
-
-                @Override
-                public String toString() {
-                  return predicate.toString();
-                }
-              }),
-          fields);
-    }
-
-    private List<Document> doRead(Set<String> fields) throws IOException {
-      IndexSearcher[] searchers = new IndexSearcher[indexes.size()];
-      try {
-        int realLimit = opts.start() + opts.limit();
-        if (Integer.MAX_VALUE - opts.limit() < opts.start()) {
-          realLimit = Integer.MAX_VALUE;
-        }
-        TopFieldDocs[] hits = new TopFieldDocs[indexes.size()];
-        for (int i = 0; i < indexes.size(); i++) {
-          searchers[i] = indexes.get(i).acquire();
-          hits[i] = searchers[i].search(query, realLimit, sort);
-        }
-        TopDocs docs = TopDocs.merge(sort, realLimit, hits);
-
-        List<Document> result = new ArrayList<>(docs.scoreDocs.length);
-        for (int i = opts.start(); i < docs.scoreDocs.length; i++) {
-          ScoreDoc sd = docs.scoreDocs[i];
-          result.add(searchers[sd.shardIndex].doc(sd.doc, fields));
-        }
-        return result;
-      } finally {
-        for (int i = 0; i < indexes.size(); i++) {
-          if (searchers[i] != null) {
-            try {
-              indexes.get(i).release(searchers[i]);
-            } catch (IOException e) {
-              log.warn("cannot release Lucene searcher", e);
-            }
-          }
-        }
-      }
-    }
-  }
-
-  private class ChangeDataResults implements ResultSet<ChangeData> {
-    private final Future<List<Document>> future;
-    private final Set<String> fields;
-
-    ChangeDataResults(Future<List<Document>> future, Set<String> fields) {
-      this.future = future;
-      this.fields = fields;
-    }
-
-    @Override
-    public Iterator<ChangeData> iterator() {
-      return toList().iterator();
-    }
-
-    @Override
-    public List<ChangeData> toList() {
-      try {
-        List<Document> docs = future.get();
-        List<ChangeData> result = new ArrayList<>(docs.size());
-        String idFieldName = LEGACY_ID.getName();
-        for (Document doc : docs) {
-          result.add(toChangeData(fields(doc, fields), fields, idFieldName));
-        }
-        return result;
-      } catch (InterruptedException e) {
-        close();
-        throw new OrmRuntimeException(e);
-      } catch (ExecutionException e) {
-        Throwables.throwIfUnchecked(e.getCause());
-        throw new OrmRuntimeException(e.getCause());
-      }
-    }
-
-    @Override
-    public void close() {
-      future.cancel(false /* do not interrupt Lucene */);
-    }
-  }
-
-  private static ListMultimap<String, IndexableField> fields(Document doc, Set<String> fields) {
-    ListMultimap<String, IndexableField> stored =
-        MultimapBuilder.hashKeys(fields.size()).arrayListValues(4).build();
-    for (IndexableField f : doc) {
-      String name = f.name();
-      if (fields.contains(name)) {
-        stored.put(name, f);
-      }
-    }
-    return stored;
-  }
-
-  private ChangeData toChangeData(
-      ListMultimap<String, IndexableField> doc, Set<String> fields, String idFieldName) {
-    ChangeData cd;
-    // Either change or the ID field was guaranteed to be included in the call
-    // to fields() above.
-    IndexableField cb = Iterables.getFirst(doc.get(CHANGE_FIELD), null);
-    if (cb != null) {
-      BytesRef proto = cb.binaryValue();
-      cd =
-          changeDataFactory.create(
-              db.get(), CHANGE_CODEC.decode(proto.bytes, proto.offset, proto.length));
-    } else {
-      IndexableField f = Iterables.getFirst(doc.get(idFieldName), null);
-      Change.Id id = new Change.Id(f.numericValue().intValue());
-      // IndexUtils#changeFields ensures either CHANGE or PROJECT is always present.
-      IndexableField project = doc.get(PROJECT.getName()).iterator().next();
-      cd = changeDataFactory.create(db.get(), new Project.NameKey(project.stringValue()), id);
-    }
-
-    if (fields.contains(PATCH_SET_FIELD)) {
-      decodePatchSets(doc, cd);
-    }
-    if (fields.contains(APPROVAL_FIELD)) {
-      decodeApprovals(doc, cd);
-    }
-    if (fields.contains(ADDED_FIELD) && fields.contains(DELETED_FIELD)) {
-      decodeChangedLines(doc, cd);
-    }
-    if (fields.contains(MERGEABLE_FIELD)) {
-      decodeMergeable(doc, cd);
-    }
-    if (fields.contains(REVIEWEDBY_FIELD)) {
-      decodeReviewedBy(doc, cd);
-    }
-    if (fields.contains(HASHTAG_FIELD)) {
-      decodeHashtags(doc, cd);
-    }
-    if (fields.contains(STAR_FIELD)) {
-      decodeStar(doc, cd);
-    }
-    if (fields.contains(REVIEWER_FIELD)) {
-      decodeReviewers(doc, cd);
-    }
-    if (fields.contains(REVIEWER_BY_EMAIL_FIELD)) {
-      decodeReviewersByEmail(doc, cd);
-    }
-    if (fields.contains(PENDING_REVIEWER_FIELD)) {
-      decodePendingReviewers(doc, cd);
-    }
-    if (fields.contains(PENDING_REVIEWER_BY_EMAIL_FIELD)) {
-      decodePendingReviewersByEmail(doc, cd);
-    }
-    decodeSubmitRecords(
-        doc, SUBMIT_RECORD_STRICT_FIELD, ChangeField.SUBMIT_RULE_OPTIONS_STRICT, cd);
-    decodeSubmitRecords(
-        doc, SUBMIT_RECORD_LENIENT_FIELD, ChangeField.SUBMIT_RULE_OPTIONS_LENIENT, cd);
-    if (fields.contains(REF_STATE_FIELD)) {
-      decodeRefStates(doc, cd);
-    }
-    if (fields.contains(REF_STATE_PATTERN_FIELD)) {
-      decodeRefStatePatterns(doc, cd);
-    }
-
-    decodeUnresolvedCommentCount(doc, cd);
-    return cd;
-  }
-
-  private void decodePatchSets(ListMultimap<String, IndexableField> doc, ChangeData cd) {
-    List<PatchSet> patchSets = decodeProtos(doc, PATCH_SET_FIELD, PATCH_SET_CODEC);
-    if (!patchSets.isEmpty()) {
-      // Will be an empty list for schemas prior to when this field was stored;
-      // this cannot be valid since a change needs at least one patch set.
-      cd.setPatchSets(patchSets);
-    }
-  }
-
-  private void decodeApprovals(ListMultimap<String, IndexableField> doc, ChangeData cd) {
-    cd.setCurrentApprovals(decodeProtos(doc, APPROVAL_FIELD, APPROVAL_CODEC));
-  }
-
-  private void decodeChangedLines(ListMultimap<String, IndexableField> doc, ChangeData cd) {
-    IndexableField added = Iterables.getFirst(doc.get(ADDED_FIELD), null);
-    IndexableField deleted = Iterables.getFirst(doc.get(DELETED_FIELD), null);
-    if (added != null && deleted != null) {
-      cd.setChangedLines(added.numericValue().intValue(), deleted.numericValue().intValue());
-    } else {
-      // No ChangedLines stored, likely due to failure during reindexing, for
-      // example due to LargeObjectException. But we know the field was
-      // requested, so update ChangeData to prevent callers from trying to
-      // lazily load it, as that would probably also fail.
-      cd.setNoChangedLines();
-    }
-  }
-
-  private void decodeMergeable(ListMultimap<String, IndexableField> doc, ChangeData cd) {
-    IndexableField f = Iterables.getFirst(doc.get(MERGEABLE_FIELD), null);
-    if (f != null) {
-      String mergeable = f.stringValue();
-      if ("1".equals(mergeable)) {
-        cd.setMergeable(true);
-      } else if ("0".equals(mergeable)) {
-        cd.setMergeable(false);
-      }
-    }
-  }
-
-  private void decodeReviewedBy(ListMultimap<String, IndexableField> doc, ChangeData cd) {
-    Collection<IndexableField> reviewedBy = doc.get(REVIEWEDBY_FIELD);
-    if (reviewedBy.size() > 0) {
-      Set<Account.Id> accounts = Sets.newHashSetWithExpectedSize(reviewedBy.size());
-      for (IndexableField r : reviewedBy) {
-        int id = r.numericValue().intValue();
-        if (reviewedBy.size() == 1 && id == ChangeField.NOT_REVIEWED) {
-          break;
-        }
-        accounts.add(new Account.Id(id));
-      }
-      cd.setReviewedBy(accounts);
-    }
-  }
-
-  private void decodeHashtags(ListMultimap<String, IndexableField> doc, ChangeData cd) {
-    Collection<IndexableField> hashtag = doc.get(HASHTAG_FIELD);
-    Set<String> hashtags = Sets.newHashSetWithExpectedSize(hashtag.size());
-    for (IndexableField r : hashtag) {
-      hashtags.add(r.binaryValue().utf8ToString());
-    }
-    cd.setHashtags(hashtags);
-  }
-
-  private void decodeStar(ListMultimap<String, IndexableField> doc, ChangeData cd) {
-    Collection<IndexableField> star = doc.get(STAR_FIELD);
-    ListMultimap<Account.Id, String> stars = MultimapBuilder.hashKeys().arrayListValues().build();
-    for (IndexableField r : star) {
-      StarredChangesUtil.StarField starField = StarredChangesUtil.StarField.parse(r.stringValue());
-      if (starField != null) {
-        stars.put(starField.accountId(), starField.label());
-      }
-    }
-    cd.setStars(stars);
-  }
-
-  private void decodeReviewers(ListMultimap<String, IndexableField> doc, ChangeData cd) {
-    cd.setReviewers(
-        ChangeField.parseReviewerFieldValues(
-            FluentIterable.from(doc.get(REVIEWER_FIELD)).transform(IndexableField::stringValue)));
-  }
-
-  private void decodeReviewersByEmail(ListMultimap<String, IndexableField> doc, ChangeData cd) {
-    cd.setReviewersByEmail(
-        ChangeField.parseReviewerByEmailFieldValues(
-            FluentIterable.from(doc.get(REVIEWER_BY_EMAIL_FIELD))
-                .transform(IndexableField::stringValue)));
-  }
-
-  private void decodePendingReviewers(ListMultimap<String, IndexableField> doc, ChangeData cd) {
-    cd.setPendingReviewers(
-        ChangeField.parseReviewerFieldValues(
-            FluentIterable.from(doc.get(PENDING_REVIEWER_FIELD))
-                .transform(IndexableField::stringValue)));
-  }
-
-  private void decodePendingReviewersByEmail(
-      ListMultimap<String, IndexableField> doc, ChangeData cd) {
-    cd.setPendingReviewersByEmail(
-        ChangeField.parseReviewerByEmailFieldValues(
-            FluentIterable.from(doc.get(PENDING_REVIEWER_BY_EMAIL_FIELD))
-                .transform(IndexableField::stringValue)));
-  }
-
-  private void decodeSubmitRecords(
-      ListMultimap<String, IndexableField> doc,
-      String field,
-      SubmitRuleOptions opts,
-      ChangeData cd) {
-    ChangeField.parseSubmitRecords(
-        Collections2.transform(doc.get(field), f -> f.binaryValue().utf8ToString()), opts, cd);
-  }
-
-  private void decodeRefStates(ListMultimap<String, IndexableField> doc, ChangeData cd) {
-    cd.setRefStates(copyAsBytes(doc.get(REF_STATE_FIELD)));
-  }
-
-  private void decodeRefStatePatterns(ListMultimap<String, IndexableField> doc, ChangeData cd) {
-    cd.setRefStatePatterns(copyAsBytes(doc.get(REF_STATE_PATTERN_FIELD)));
-  }
-
-  private void decodeUnresolvedCommentCount(
-      ListMultimap<String, IndexableField> doc, ChangeData cd) {
-    IndexableField f = Iterables.getFirst(doc.get(UNRESOLVED_COMMENT_COUNT_FIELD), null);
-    if (f != null && f.numericValue() != null) {
-      cd.setUnresolvedCommentCount(f.numericValue().intValue());
-    }
-  }
-
-  private static <T> List<T> decodeProtos(
-      ListMultimap<String, IndexableField> doc, String fieldName, ProtobufCodec<T> codec) {
-    Collection<IndexableField> fields = doc.get(fieldName);
-    if (fields.isEmpty()) {
-      return Collections.emptyList();
-    }
-
-    List<T> result = new ArrayList<>(fields.size());
-    for (IndexableField f : fields) {
-      BytesRef r = f.binaryValue();
-      result.add(codec.decode(r.bytes, r.offset, r.length));
-    }
-    return result;
-  }
-
-  private static List<byte[]> copyAsBytes(Collection<IndexableField> fields) {
-    return fields.stream()
-        .map(
-            f -> {
-              BytesRef ref = f.binaryValue();
-              byte[] b = new byte[ref.length];
-              System.arraycopy(ref.bytes, ref.offset, b, 0, ref.length);
-              return b;
-            })
-        .collect(toList());
-  }
-}
diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneGroupIndex.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneGroupIndex.java
deleted file mode 100644
index 32870cb..0000000
--- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneGroupIndex.java
+++ /dev/null
@@ -1,204 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.lucene;
-
-import static com.google.gerrit.server.index.group.GroupField.UUID;
-
-import com.google.gerrit.index.QueryOptions;
-import com.google.gerrit.index.Schema;
-import com.google.gerrit.index.query.DataSource;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.index.query.QueryParseException;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.account.GroupCache;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.group.InternalGroup;
-import com.google.gerrit.server.index.IndexUtils;
-import com.google.gerrit.server.index.group.GroupIndex;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.ResultSet;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Optional;
-import java.util.concurrent.ExecutionException;
-import org.apache.lucene.document.Document;
-import org.apache.lucene.index.Term;
-import org.apache.lucene.search.IndexSearcher;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.search.ScoreDoc;
-import org.apache.lucene.search.SearcherFactory;
-import org.apache.lucene.search.Sort;
-import org.apache.lucene.search.SortField;
-import org.apache.lucene.search.TopFieldDocs;
-import org.apache.lucene.store.Directory;
-import org.apache.lucene.store.FSDirectory;
-import org.apache.lucene.store.RAMDirectory;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class LuceneGroupIndex extends AbstractLuceneIndex<AccountGroup.UUID, InternalGroup>
-    implements GroupIndex {
-  private static final Logger log = LoggerFactory.getLogger(LuceneGroupIndex.class);
-
-  private static final String GROUPS = "groups";
-
-  private static final String UUID_SORT_FIELD = sortFieldName(UUID);
-
-  private static Term idTerm(InternalGroup group) {
-    return idTerm(group.getGroupUUID());
-  }
-
-  private static Term idTerm(AccountGroup.UUID uuid) {
-    return QueryBuilder.stringTerm(UUID.getName(), uuid.get());
-  }
-
-  private final GerritIndexWriterConfig indexWriterConfig;
-  private final QueryBuilder<InternalGroup> queryBuilder;
-  private final Provider<GroupCache> groupCache;
-
-  private static Directory dir(Schema<?> schema, Config cfg, SitePaths sitePaths)
-      throws IOException {
-    if (LuceneIndexModule.isInMemoryTest(cfg)) {
-      return new RAMDirectory();
-    }
-    Path indexDir = LuceneVersionManager.getDir(sitePaths, GROUPS, schema);
-    return FSDirectory.open(indexDir);
-  }
-
-  @Inject
-  LuceneGroupIndex(
-      @GerritServerConfig Config cfg,
-      SitePaths sitePaths,
-      Provider<GroupCache> groupCache,
-      @Assisted Schema<InternalGroup> schema)
-      throws IOException {
-    super(
-        schema,
-        sitePaths,
-        dir(schema, cfg, sitePaths),
-        GROUPS,
-        null,
-        new GerritIndexWriterConfig(cfg, GROUPS),
-        new SearcherFactory());
-    this.groupCache = groupCache;
-
-    indexWriterConfig = new GerritIndexWriterConfig(cfg, GROUPS);
-    queryBuilder = new QueryBuilder<>(schema, indexWriterConfig.getAnalyzer());
-  }
-
-  @Override
-  public void replace(InternalGroup group) throws IOException {
-    try {
-      replace(idTerm(group), toDocument(group)).get();
-    } catch (ExecutionException | InterruptedException e) {
-      throw new IOException(e);
-    }
-  }
-
-  @Override
-  public void delete(AccountGroup.UUID key) throws IOException {
-    try {
-      delete(idTerm(key)).get();
-    } catch (ExecutionException | InterruptedException e) {
-      throw new IOException(e);
-    }
-  }
-
-  @Override
-  public DataSource<InternalGroup> getSource(Predicate<InternalGroup> p, QueryOptions opts)
-      throws QueryParseException {
-    return new QuerySource(
-        opts,
-        queryBuilder.toQuery(p),
-        new Sort(new SortField(UUID_SORT_FIELD, SortField.Type.STRING, false)));
-  }
-
-  private class QuerySource implements DataSource<InternalGroup> {
-    private final QueryOptions opts;
-    private final Query query;
-    private final Sort sort;
-
-    private QuerySource(QueryOptions opts, Query query, Sort sort) {
-      this.opts = opts;
-      this.query = query;
-      this.sort = sort;
-    }
-
-    @Override
-    public int getCardinality() {
-      return 10;
-    }
-
-    @Override
-    public ResultSet<InternalGroup> read() throws OrmException {
-      IndexSearcher searcher = null;
-      try {
-        searcher = acquire();
-        int realLimit = opts.start() + opts.limit();
-        TopFieldDocs docs = searcher.search(query, realLimit, sort);
-        List<InternalGroup> result = new ArrayList<>(docs.scoreDocs.length);
-        for (int i = opts.start(); i < docs.scoreDocs.length; i++) {
-          ScoreDoc sd = docs.scoreDocs[i];
-          Document doc = searcher.doc(sd.doc, IndexUtils.groupFields(opts));
-          Optional<InternalGroup> internalGroup = toInternalGroup(doc);
-          internalGroup.ifPresent(result::add);
-        }
-        final List<InternalGroup> r = Collections.unmodifiableList(result);
-        return new ResultSet<InternalGroup>() {
-          @Override
-          public Iterator<InternalGroup> iterator() {
-            return r.iterator();
-          }
-
-          @Override
-          public List<InternalGroup> toList() {
-            return r;
-          }
-
-          @Override
-          public void close() {
-            // Do nothing.
-          }
-        };
-      } catch (IOException e) {
-        throw new OrmException(e);
-      } finally {
-        if (searcher != null) {
-          try {
-            release(searcher);
-          } catch (IOException e) {
-            log.warn("cannot release Lucene searcher", e);
-          }
-        }
-      }
-    }
-  }
-
-  private Optional<InternalGroup> toInternalGroup(Document doc) {
-    AccountGroup.UUID uuid = new AccountGroup.UUID(doc.getField(UUID.getName()).stringValue());
-    // Use the GroupCache rather than depending on any stored fields in the
-    // document (of which there shouldn't be any).
-    return groupCache.get().get(uuid);
-  }
-}
diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneIndexModule.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneIndexModule.java
deleted file mode 100644
index c159962..0000000
--- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneIndexModule.java
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.lucene;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.gerrit.index.IndexConfig;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.index.AbstractIndexModule;
-import com.google.gerrit.server.index.VersionManager;
-import com.google.gerrit.server.index.account.AccountIndex;
-import com.google.gerrit.server.index.change.ChangeIndex;
-import com.google.gerrit.server.index.group.GroupIndex;
-import java.util.Map;
-import org.apache.lucene.search.BooleanQuery;
-import org.eclipse.jgit.lib.Config;
-
-public class LuceneIndexModule extends AbstractIndexModule {
-  public static LuceneIndexModule singleVersionAllLatest(int threads) {
-    return new LuceneIndexModule(ImmutableMap.<String, Integer>of(), threads);
-  }
-
-  public static LuceneIndexModule singleVersionWithExplicitVersions(
-      Map<String, Integer> versions, int threads) {
-    return new LuceneIndexModule(versions, threads);
-  }
-
-  public static LuceneIndexModule latestVersion() {
-    return new LuceneIndexModule(null, 0);
-  }
-
-  static boolean isInMemoryTest(Config cfg) {
-    return cfg.getBoolean("index", "lucene", "testInmemory", false);
-  }
-
-  private LuceneIndexModule(Map<String, Integer> singleVersions, int threads) {
-    super(singleVersions, threads);
-  }
-
-  @Override
-  protected Class<? extends AccountIndex> getAccountIndex() {
-    return LuceneAccountIndex.class;
-  }
-
-  @Override
-  protected Class<? extends ChangeIndex> getChangeIndex() {
-    return LuceneChangeIndex.class;
-  }
-
-  @Override
-  protected Class<? extends GroupIndex> getGroupIndex() {
-    return LuceneGroupIndex.class;
-  }
-
-  @Override
-  protected Class<? extends VersionManager> getVersionManager() {
-    return LuceneVersionManager.class;
-  }
-
-  @Override
-  protected IndexConfig getIndexConfig(@GerritServerConfig Config cfg) {
-    BooleanQuery.setMaxClauseCount(
-        cfg.getInt("index", "maxTerms", BooleanQuery.getMaxClauseCount()));
-    return super.getIndexConfig(cfg);
-  }
-}
diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneVersionManager.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneVersionManager.java
deleted file mode 100644
index aabce35..0000000
--- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneVersionManager.java
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.lucene;
-
-import com.google.common.primitives.Ints;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.index.Index;
-import com.google.gerrit.index.IndexDefinition;
-import com.google.gerrit.index.Schema;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.index.GerritIndexStatus;
-import com.google.gerrit.server.index.OnlineUpgradeListener;
-import com.google.gerrit.server.index.VersionManager;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.nio.file.DirectoryStream;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.Collection;
-import java.util.TreeMap;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class LuceneVersionManager extends VersionManager {
-  private static final Logger log = LoggerFactory.getLogger(LuceneVersionManager.class);
-
-  static Path getDir(SitePaths sitePaths, String name, Schema<?> schema) {
-    return sitePaths.index_dir.resolve(String.format("%s_%04d", name, schema.getVersion()));
-  }
-
-  @Inject
-  LuceneVersionManager(
-      @GerritServerConfig Config cfg,
-      SitePaths sitePaths,
-      DynamicSet<OnlineUpgradeListener> listeners,
-      Collection<IndexDefinition<?, ?, ?>> defs) {
-    super(sitePaths, listeners, defs, VersionManager.getOnlineUpgrade(cfg));
-  }
-
-  @Override
-  protected <K, V, I extends Index<K, V>> TreeMap<Integer, VersionManager.Version<V>> scanVersions(
-      IndexDefinition<K, V, I> def, GerritIndexStatus cfg) {
-    TreeMap<Integer, VersionManager.Version<V>> versions = new TreeMap<>();
-    for (Schema<V> schema : def.getSchemas().values()) {
-      // This part is Lucene-specific.
-      Path p = getDir(sitePaths, def.getName(), schema);
-      boolean isDir = Files.isDirectory(p);
-      if (Files.exists(p) && !isDir) {
-        log.warn("Not a directory: {}", p.toAbsolutePath());
-      }
-      int v = schema.getVersion();
-      versions.put(v, new Version<>(schema, v, isDir, cfg.getReady(def.getName(), v)));
-    }
-
-    String prefix = def.getName() + "_";
-    try (DirectoryStream<Path> paths = Files.newDirectoryStream(sitePaths.index_dir)) {
-      for (Path p : paths) {
-        String n = p.getFileName().toString();
-        if (!n.startsWith(prefix)) {
-          continue;
-        }
-        String versionStr = n.substring(prefix.length());
-        Integer v = Ints.tryParse(versionStr);
-        if (v == null || versionStr.length() != 4) {
-          log.warn("Unrecognized version in index directory: {}", p.toAbsolutePath());
-          continue;
-        }
-        if (!versions.containsKey(v)) {
-          versions.put(v, new Version<V>(null, v, true, cfg.getReady(def.getName(), v)));
-        }
-      }
-    } catch (IOException e) {
-      log.error("Error scanning index directory: " + sitePaths.index_dir, e);
-    }
-    return versions;
-  }
-}
diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/QueryBuilder.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/QueryBuilder.java
deleted file mode 100644
index 6aab7c7..0000000
--- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/QueryBuilder.java
+++ /dev/null
@@ -1,246 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.lucene;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.apache.lucene.search.BooleanClause.Occur.MUST;
-import static org.apache.lucene.search.BooleanClause.Occur.MUST_NOT;
-import static org.apache.lucene.search.BooleanClause.Occur.SHOULD;
-
-import com.google.common.collect.Lists;
-import com.google.gerrit.index.FieldType;
-import com.google.gerrit.index.Schema;
-import com.google.gerrit.index.query.AndPredicate;
-import com.google.gerrit.index.query.IndexPredicate;
-import com.google.gerrit.index.query.IntegerRangePredicate;
-import com.google.gerrit.index.query.NotPredicate;
-import com.google.gerrit.index.query.OrPredicate;
-import com.google.gerrit.index.query.PostFilterPredicate;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.index.query.QueryParseException;
-import com.google.gerrit.index.query.RegexPredicate;
-import com.google.gerrit.index.query.TimestampRangePredicate;
-import java.util.Date;
-import java.util.List;
-import org.apache.lucene.analysis.Analyzer;
-import org.apache.lucene.index.Term;
-import org.apache.lucene.search.BooleanQuery;
-import org.apache.lucene.search.MatchAllDocsQuery;
-import org.apache.lucene.search.NumericRangeQuery;
-import org.apache.lucene.search.PrefixQuery;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.search.RegexpQuery;
-import org.apache.lucene.search.TermQuery;
-import org.apache.lucene.util.BytesRefBuilder;
-import org.apache.lucene.util.NumericUtils;
-
-public class QueryBuilder<V> {
-  static Term intTerm(String name, int value) {
-    BytesRefBuilder builder = new BytesRefBuilder();
-    NumericUtils.intToPrefixCoded(value, 0, builder);
-    return new Term(name, builder.get());
-  }
-
-  static Term stringTerm(String name, String value) {
-    BytesRefBuilder builder = new BytesRefBuilder();
-    builder.append(value.getBytes(UTF_8), 0, value.length());
-    return new Term(name, builder.get());
-  }
-
-  private final Schema<V> schema;
-  private final org.apache.lucene.util.QueryBuilder queryBuilder;
-
-  public QueryBuilder(Schema<V> schema, Analyzer analyzer) {
-    this.schema = schema;
-    queryBuilder = new org.apache.lucene.util.QueryBuilder(analyzer);
-  }
-
-  public Query toQuery(Predicate<V> p) throws QueryParseException {
-    if (p instanceof AndPredicate) {
-      return and(p);
-    } else if (p instanceof OrPredicate) {
-      return or(p);
-    } else if (p instanceof NotPredicate) {
-      return not(p);
-    } else if (p instanceof IndexPredicate) {
-      return fieldQuery((IndexPredicate<V>) p);
-    } else if (p instanceof PostFilterPredicate) {
-      return new MatchAllDocsQuery();
-    } else {
-      throw new QueryParseException("cannot create query for index: " + p);
-    }
-  }
-
-  private Query or(Predicate<V> p) throws QueryParseException {
-    try {
-      BooleanQuery.Builder q = new BooleanQuery.Builder();
-      for (int i = 0; i < p.getChildCount(); i++) {
-        q.add(toQuery(p.getChild(i)), SHOULD);
-      }
-      return q.build();
-    } catch (BooleanQuery.TooManyClauses e) {
-      throw new QueryParseException("cannot create query for index: " + p, e);
-    }
-  }
-
-  private Query and(Predicate<V> p) throws QueryParseException {
-    try {
-      BooleanQuery.Builder b = new BooleanQuery.Builder();
-      List<Query> not = Lists.newArrayListWithCapacity(p.getChildCount());
-      for (int i = 0; i < p.getChildCount(); i++) {
-        Predicate<V> c = p.getChild(i);
-        if (c instanceof NotPredicate) {
-          Predicate<V> n = c.getChild(0);
-          if (n instanceof TimestampRangePredicate) {
-            b.add(notTimestamp((TimestampRangePredicate<V>) n), MUST);
-          } else {
-            not.add(toQuery(n));
-          }
-        } else {
-          b.add(toQuery(c), MUST);
-        }
-      }
-      for (Query q : not) {
-        b.add(q, MUST_NOT);
-      }
-      return b.build();
-    } catch (BooleanQuery.TooManyClauses e) {
-      throw new QueryParseException("cannot create query for index: " + p, e);
-    }
-  }
-
-  private Query not(Predicate<V> p) throws QueryParseException {
-    Predicate<V> n = p.getChild(0);
-    if (n instanceof TimestampRangePredicate) {
-      return notTimestamp((TimestampRangePredicate<V>) n);
-    }
-
-    // Lucene does not support negation, start with all and subtract.
-    return new BooleanQuery.Builder()
-        .add(new MatchAllDocsQuery(), MUST)
-        .add(toQuery(n), MUST_NOT)
-        .build();
-  }
-
-  private Query fieldQuery(IndexPredicate<V> p) throws QueryParseException {
-    checkArgument(
-        schema.hasField(p.getField()),
-        "field not in schema v%s: %s",
-        schema.getVersion(),
-        p.getField().getName());
-    FieldType<?> type = p.getType();
-    if (type == FieldType.INTEGER) {
-      return intQuery(p);
-    } else if (type == FieldType.INTEGER_RANGE) {
-      return intRangeQuery(p);
-    } else if (type == FieldType.TIMESTAMP) {
-      return timestampQuery(p);
-    } else if (type == FieldType.EXACT) {
-      return exactQuery(p);
-    } else if (type == FieldType.PREFIX) {
-      return prefixQuery(p);
-    } else if (type == FieldType.FULL_TEXT) {
-      return fullTextQuery(p);
-    } else {
-      throw FieldType.badFieldType(type);
-    }
-  }
-
-  private Query intQuery(IndexPredicate<V> p) throws QueryParseException {
-    int value;
-    try {
-      // Can't use IntPredicate because it and IndexPredicate are different
-      // subclasses of OperatorPredicate.
-      value = Integer.parseInt(p.getValue());
-    } catch (NumberFormatException e) {
-      throw new QueryParseException("not an integer: " + p.getValue());
-    }
-    return new TermQuery(intTerm(p.getField().getName(), value));
-  }
-
-  private Query intRangeQuery(IndexPredicate<V> p) throws QueryParseException {
-    if (p instanceof IntegerRangePredicate) {
-      IntegerRangePredicate<V> r = (IntegerRangePredicate<V>) p;
-      int minimum = r.getMinimumValue();
-      int maximum = r.getMaximumValue();
-      if (minimum == maximum) {
-        // Just fall back to a standard integer query.
-        return new TermQuery(intTerm(p.getField().getName(), minimum));
-      }
-      return NumericRangeQuery.newIntRange(r.getField().getName(), minimum, maximum, true, true);
-    }
-    throw new QueryParseException("not an integer range: " + p);
-  }
-
-  private Query timestampQuery(IndexPredicate<V> p) throws QueryParseException {
-    if (p instanceof TimestampRangePredicate) {
-      TimestampRangePredicate<V> r = (TimestampRangePredicate<V>) p;
-      return NumericRangeQuery.newLongRange(
-          r.getField().getName(),
-          r.getMinTimestamp().getTime(),
-          r.getMaxTimestamp().getTime(),
-          true,
-          true);
-    }
-    throw new QueryParseException("not a timestamp: " + p);
-  }
-
-  private Query notTimestamp(TimestampRangePredicate<V> r) throws QueryParseException {
-    if (r.getMinTimestamp().getTime() == 0) {
-      return NumericRangeQuery.newLongRange(
-          r.getField().getName(), r.getMaxTimestamp().getTime(), null, true, true);
-    }
-    throw new QueryParseException("cannot negate: " + r);
-  }
-
-  private Query exactQuery(IndexPredicate<V> p) {
-    if (p instanceof RegexPredicate<?>) {
-      return regexQuery(p);
-    }
-    return new TermQuery(new Term(p.getField().getName(), p.getValue()));
-  }
-
-  private Query regexQuery(IndexPredicate<V> p) {
-    String re = p.getValue();
-    if (re.startsWith("^")) {
-      re = re.substring(1);
-    }
-    if (re.endsWith("$") && !re.endsWith("\\$")) {
-      re = re.substring(0, re.length() - 1);
-    }
-    return new RegexpQuery(new Term(p.getField().getName(), re));
-  }
-
-  private Query prefixQuery(IndexPredicate<V> p) {
-    return new PrefixQuery(new Term(p.getField().getName(), p.getValue()));
-  }
-
-  private Query fullTextQuery(IndexPredicate<V> p) throws QueryParseException {
-    String value = p.getValue();
-    if (value == null) {
-      throw new QueryParseException("Full-text search over empty string not supported");
-    }
-    Query query = queryBuilder.createPhraseQuery(p.getField().getName(), value);
-    if (query == null) {
-      throw new QueryParseException("Cannot create full-text query with value: " + value);
-    }
-    return query;
-  }
-
-  public int toIndexTimeInMinutes(Date ts) {
-    return (int) (ts.getTime() / 60000);
-  }
-}
diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/WrappableSearcherManager.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/WrappableSearcherManager.java
deleted file mode 100644
index f9ecac3..0000000
--- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/WrappableSearcherManager.java
+++ /dev/null
@@ -1,212 +0,0 @@
-package com.google.gerrit.lucene;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-
-import java.io.IOException;
-import org.apache.lucene.index.DirectoryReader;
-import org.apache.lucene.index.FilterDirectoryReader;
-import org.apache.lucene.index.FilterLeafReader;
-import org.apache.lucene.index.IndexReader;
-import org.apache.lucene.index.IndexWriter;
-import org.apache.lucene.search.IndexSearcher;
-import org.apache.lucene.search.ReferenceManager;
-import org.apache.lucene.search.SearcherFactory;
-import org.apache.lucene.store.Directory;
-
-/**
- * Utility class to safely share {@link IndexSearcher} instances across multiple threads, while
- * periodically reopening. This class ensures each searcher is closed only once all threads have
- * finished using it.
- *
- * <p>Use {@link #acquire} to obtain the current searcher, and {@link #release} to release it, like
- * this:
- *
- * <pre class="prettyprint">
- * IndexSearcher s = manager.acquire();
- * try {
- *   // Do searching, doc retrieval, etc. with s
- * } finally {
- *   manager.release(s);
- * }
- * // Do not use s after this!
- * s = null;
- * </pre>
- *
- * <p>In addition you should periodically call {@link #maybeRefresh}. While it's possible to call
- * this just before running each query, this is discouraged since it penalizes the unlucky queries
- * that need to refresh. It's better to use a separate background thread, that periodically calls
- * {@link #maybeRefresh}. Finally, be sure to call {@link #close} once you are done.
- *
- * @see SearcherFactory
- * @lucene.experimental
- */
-// This file was copied from:
-// https://github.com/apache/lucene-solr/blob/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/SearcherManager.java
-// The only change (other than class name and import fixes)
-// is to skip the check in getSearcher that searcherFactory.newSearcher wraps
-// the provided searcher exactly.
-final class WrappableSearcherManager extends ReferenceManager<IndexSearcher> {
-
-  private final SearcherFactory searcherFactory;
-
-  /**
-   * Creates and returns a new SearcherManager from the given {@link IndexWriter}.
-   *
-   * @param writer the IndexWriter to open the IndexReader from.
-   * @param applyAllDeletes If <code>true</code>, all buffered deletes will be applied (made
-   *     visible) in the {@link IndexSearcher} / {@link DirectoryReader}. If <code>false</code>, the
-   *     deletes may or may not be applied, but remain buffered (in IndexWriter) so that they will
-   *     be applied in the future. Applying deletes can be costly, so if your app can tolerate
-   *     deleted documents being returned you might gain some performance by passing <code>false
-   *     </code>. See {@link DirectoryReader#openIfChanged(DirectoryReader, IndexWriter, boolean)}.
-   * @param searcherFactory An optional {@link SearcherFactory}. Pass <code>null</code> if you don't
-   *     require the searcher to be warmed before going live or other custom behavior.
-   * @throws IOException if there is a low-level I/O error
-   */
-  WrappableSearcherManager(
-      IndexWriter writer, boolean applyAllDeletes, SearcherFactory searcherFactory)
-      throws IOException {
-    if (searcherFactory == null) {
-      searcherFactory = new SearcherFactory();
-    }
-    this.searcherFactory = searcherFactory;
-    current = getSearcher(searcherFactory, DirectoryReader.open(writer, applyAllDeletes));
-  }
-
-  /**
-   * Creates and returns a new SearcherManager from the given {@link Directory}.
-   *
-   * @param dir the directory to open the DirectoryReader on.
-   * @param searcherFactory An optional {@link SearcherFactory}. Pass <code>null</code> if you don't
-   *     require the searcher to be warmed before going live or other custom behavior.
-   * @throws IOException if there is a low-level I/O error
-   */
-  WrappableSearcherManager(Directory dir, SearcherFactory searcherFactory) throws IOException {
-    if (searcherFactory == null) {
-      searcherFactory = new SearcherFactory();
-    }
-    this.searcherFactory = searcherFactory;
-    current = getSearcher(searcherFactory, DirectoryReader.open(dir));
-  }
-
-  /**
-   * Creates and returns a new SearcherManager from an existing {@link DirectoryReader}. Note that
-   * this steals the incoming reference.
-   *
-   * @param reader the DirectoryReader.
-   * @param searcherFactory An optional {@link SearcherFactory}. Pass <code>null</code> if you don't
-   *     require the searcher to be warmed before going live or other custom behavior.
-   * @throws IOException if there is a low-level I/O error
-   */
-  WrappableSearcherManager(DirectoryReader reader, SearcherFactory searcherFactory)
-      throws IOException {
-    if (searcherFactory == null) {
-      searcherFactory = new SearcherFactory();
-    }
-    this.searcherFactory = searcherFactory;
-    this.current = getSearcher(searcherFactory, reader);
-  }
-
-  @Override
-  protected void decRef(IndexSearcher reference) throws IOException {
-    reference.getIndexReader().decRef();
-  }
-
-  @Override
-  protected IndexSearcher refreshIfNeeded(IndexSearcher referenceToRefresh) throws IOException {
-    final IndexReader r = referenceToRefresh.getIndexReader();
-    assert r instanceof DirectoryReader
-        : "searcher's IndexReader should be a DirectoryReader, but got " + r;
-    final IndexReader newReader = DirectoryReader.openIfChanged((DirectoryReader) r);
-    if (newReader == null) {
-      return null;
-    }
-    return getSearcher(searcherFactory, newReader);
-  }
-
-  @Override
-  protected boolean tryIncRef(IndexSearcher reference) {
-    return reference.getIndexReader().tryIncRef();
-  }
-
-  @Override
-  protected int getRefCount(IndexSearcher reference) {
-    return reference.getIndexReader().getRefCount();
-  }
-
-  /**
-   * Returns <code>true</code> if no changes have occured since this searcher ie. reader was opened,
-   * otherwise <code>false</code>.
-   *
-   * @see DirectoryReader#isCurrent()
-   */
-  public boolean isSearcherCurrent() throws IOException {
-    final IndexSearcher searcher = acquire();
-    try {
-      final IndexReader r = searcher.getIndexReader();
-      assert r instanceof DirectoryReader
-          : "searcher's IndexReader should be a DirectoryReader, but got " + r;
-      return ((DirectoryReader) r).isCurrent();
-    } finally {
-      release(searcher);
-    }
-  }
-
-  /**
-   * Expert: creates a searcher from the provided {@link IndexReader} using the provided {@link
-   * SearcherFactory}. NOTE: this decRefs incoming reader on throwing an exception.
-   */
-  @SuppressWarnings("resource")
-  public static IndexSearcher getSearcher(SearcherFactory searcherFactory, IndexReader reader)
-      throws IOException {
-    boolean success = false;
-    final IndexSearcher searcher;
-    try {
-      searcher = searcherFactory.newSearcher(reader, null);
-      // Modification for Gerrit: Allow searcherFactory to transitively wrap the
-      // provided reader.
-      IndexReader unwrapped = searcher.getIndexReader();
-      while (true) {
-        if (unwrapped == reader) {
-          break;
-        } else if (unwrapped instanceof FilterDirectoryReader) {
-          unwrapped = ((FilterDirectoryReader) unwrapped).getDelegate();
-        } else if (unwrapped instanceof FilterLeafReader) {
-          unwrapped = ((FilterLeafReader) unwrapped).getDelegate();
-        } else {
-          break;
-        }
-      }
-
-      if (unwrapped != reader) {
-        throw new IllegalStateException(
-            "SearcherFactory must wrap the provided reader (got "
-                + searcher.getIndexReader()
-                + " but expected "
-                + reader
-                + ")");
-      }
-      success = true;
-    } finally {
-      if (!success) {
-        reader.decRef();
-      }
-    }
-    return searcher;
-  }
-}
diff --git a/gerrit-main/BUILD b/gerrit-main/BUILD
deleted file mode 100644
index 243a70b..0000000
--- a/gerrit-main/BUILD
+++ /dev/null
@@ -1,13 +0,0 @@
-java_binary(
-    name = "main_bin",
-    main_class = "Main",
-    visibility = ["//visibility:public"],
-    runtime_deps = [":main_lib"],
-)
-
-java_library(
-    name = "main_lib",
-    srcs = ["src/main/java/Main.java"],
-    visibility = ["//visibility:public"],
-    deps = ["//gerrit-launcher:launcher"],
-)
diff --git a/gerrit-main/src/main/java/Main.java b/gerrit-main/src/main/java/Main.java
deleted file mode 100644
index 0eca665..0000000
--- a/gerrit-main/src/main/java/Main.java
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright (C) 2009 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.
-
-public final class Main {
-  // We don't do any real work here because we need to import
-  // the archive lookup code and we cannot import a class in
-  // the default package. So this is just a tiny springboard
-  // to jump into the real main code.
-  //
-
-  public static void main(String[] argv) throws Exception {
-    if (onSupportedJavaVersion()) {
-      com.google.gerrit.launcher.GerritLauncher.main(argv);
-
-    } else {
-      System.exit(1);
-    }
-  }
-
-  private static boolean onSupportedJavaVersion() {
-    final String version = System.getProperty("java.specification.version");
-    if (1.8 <= parse(version)) {
-      return true;
-    }
-    System.err.println("fatal: Gerrit Code Review requires Java 8 or later");
-    System.err.println("       (trying to run on Java " + version + ")");
-    return false;
-  }
-
-  private static double parse(String version) {
-    if (version == null || version.length() == 0) {
-      return 0.0;
-    }
-
-    try {
-      final int fd = version.indexOf('.');
-      final int sd = version.indexOf('.', fd + 1);
-      if (0 < sd) {
-        version = version.substring(0, sd);
-      }
-      return Double.parseDouble(version);
-    } catch (NumberFormatException e) {
-      return 0.0;
-    }
-  }
-
-  private Main() {}
-}
diff --git a/gerrit-oauth/BUILD b/gerrit-oauth/BUILD
deleted file mode 100644
index 0ef89c0..0000000
--- a/gerrit-oauth/BUILD
+++ /dev/null
@@ -1,28 +0,0 @@
-SRCS = glob(
-    ["src/main/java/**/*.java"],
-)
-
-RESOURCES = glob(["src/main/resources/**/*"])
-
-java_library(
-    name = "oauth",
-    srcs = SRCS,
-    resources = RESOURCES,
-    visibility = ["//visibility:public"],
-    deps = [
-        "//gerrit-common:annotations",
-        "//gerrit-extension-api:api",
-        "//gerrit-httpd:httpd",
-        "//gerrit-reviewdb:server",
-        "//gerrit-server:server",
-        "//lib:gson",
-        "//lib:guava",
-        "//lib:gwtorm",
-        "//lib:servlet-api-3_1",
-        "//lib/commons:codec",
-        "//lib/guice",
-        "//lib/guice:guice-servlet",
-        "//lib/jgit/org.eclipse.jgit:jgit",
-        "//lib/log:api",
-    ],
-)
diff --git a/gerrit-oauth/src/main/java/com/google/gerrit/httpd/auth/oauth/OAuthLogoutServlet.java b/gerrit-oauth/src/main/java/com/google/gerrit/httpd/auth/oauth/OAuthLogoutServlet.java
deleted file mode 100644
index 126a1d7..0000000
--- a/gerrit-oauth/src/main/java/com/google/gerrit/httpd/auth/oauth/OAuthLogoutServlet.java
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.httpd.auth.oauth;
-
-import com.google.gerrit.audit.AuditService;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.httpd.HttpLogoutServlet;
-import com.google.gerrit.httpd.WebSession;
-import com.google.gerrit.server.config.AuthConfig;
-import com.google.gerrit.server.config.CanonicalWebUrl;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-@Singleton
-class OAuthLogoutServlet extends HttpLogoutServlet {
-  private static final long serialVersionUID = 1L;
-
-  private final Provider<OAuthSession> oauthSession;
-
-  @Inject
-  OAuthLogoutServlet(
-      AuthConfig authConfig,
-      DynamicItem<WebSession> webSession,
-      @CanonicalWebUrl @Nullable Provider<String> urlProvider,
-      AuditService audit,
-      Provider<OAuthSession> oauthSession) {
-    super(authConfig, webSession, urlProvider, audit);
-    this.oauthSession = oauthSession;
-  }
-
-  @Override
-  protected void doLogout(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
-    super.doLogout(req, rsp);
-    if (req.getSession(false) != null) {
-      oauthSession.get().logout();
-    }
-  }
-}
diff --git a/gerrit-oauth/src/main/java/com/google/gerrit/httpd/auth/oauth/OAuthSession.java b/gerrit-oauth/src/main/java/com/google/gerrit/httpd/auth/oauth/OAuthSession.java
deleted file mode 100644
index 68b28a9d..0000000
--- a/gerrit-oauth/src/main/java/com/google/gerrit/httpd/auth/oauth/OAuthSession.java
+++ /dev/null
@@ -1,284 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.httpd.auth.oauth;
-
-import static javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED;
-
-import com.google.common.base.CharMatcher;
-import com.google.common.base.Strings;
-import com.google.gerrit.extensions.auth.oauth.OAuthServiceProvider;
-import com.google.gerrit.extensions.auth.oauth.OAuthToken;
-import com.google.gerrit.extensions.auth.oauth.OAuthUserInfo;
-import com.google.gerrit.extensions.auth.oauth.OAuthVerifier;
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.extensions.restapi.Url;
-import com.google.gerrit.httpd.CanonicalWebUrl;
-import com.google.gerrit.httpd.WebSession;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountException;
-import com.google.gerrit.server.account.AccountManager;
-import com.google.gerrit.server.account.AuthRequest;
-import com.google.gerrit.server.account.AuthResult;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.auth.oauth.OAuthTokenCache;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.servlet.SessionScoped;
-import java.io.IOException;
-import java.security.NoSuchAlgorithmException;
-import java.security.SecureRandom;
-import java.util.Optional;
-import javax.servlet.ServletRequest;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.apache.commons.codec.binary.Base64;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@SessionScoped
-/* OAuth protocol implementation */
-class OAuthSession {
-  private static final Logger log = LoggerFactory.getLogger(OAuthSession.class);
-  private static final SecureRandom randomState = newRandomGenerator();
-  private final String state;
-  private final DynamicItem<WebSession> webSession;
-  private final Provider<IdentifiedUser> identifiedUser;
-  private final AccountManager accountManager;
-  private final CanonicalWebUrl urlProvider;
-  private final OAuthTokenCache tokenCache;
-  private OAuthServiceProvider serviceProvider;
-  private OAuthUserInfo user;
-  private Account.Id accountId;
-  private String redirectToken;
-  private boolean linkMode;
-
-  @Inject
-  OAuthSession(
-      DynamicItem<WebSession> webSession,
-      Provider<IdentifiedUser> identifiedUser,
-      AccountManager accountManager,
-      CanonicalWebUrl urlProvider,
-      OAuthTokenCache tokenCache) {
-    this.state = generateRandomState();
-    this.identifiedUser = identifiedUser;
-    this.webSession = webSession;
-    this.accountManager = accountManager;
-    this.urlProvider = urlProvider;
-    this.tokenCache = tokenCache;
-  }
-
-  boolean isLoggedIn() {
-    return user != null;
-  }
-
-  boolean isOAuthFinal(HttpServletRequest request) {
-    return Strings.emptyToNull(request.getParameter("code")) != null;
-  }
-
-  boolean login(
-      HttpServletRequest request, HttpServletResponse response, OAuthServiceProvider oauth)
-      throws IOException {
-    log.debug("Login " + this);
-
-    if (isOAuthFinal(request)) {
-      if (!checkState(request)) {
-        response.sendError(HttpServletResponse.SC_NOT_FOUND);
-        return false;
-      }
-
-      log.debug("Login-Retrieve-User " + this);
-      OAuthToken token = oauth.getAccessToken(new OAuthVerifier(request.getParameter("code")));
-      user = oauth.getUserInfo(token);
-
-      if (isLoggedIn()) {
-        log.debug("Login-SUCCESS " + this);
-        authenticateAndRedirect(request, response, token);
-        return true;
-      }
-      response.sendError(SC_UNAUTHORIZED);
-      return false;
-    }
-    log.debug("Login-PHASE1 " + this);
-    redirectToken = request.getRequestURI();
-    // We are here in content of filter.
-    // Due to this Jetty limitation:
-    // https://bz.apache.org/bugzilla/show_bug.cgi?id=28323
-    // we cannot use LoginUrlToken.getToken() method,
-    // because it relies on getPathInfo() and it is always null here.
-    redirectToken = redirectToken.substring(request.getContextPath().length());
-    response.sendRedirect(oauth.getAuthorizationUrl() + "&state=" + state);
-    return false;
-  }
-
-  private void authenticateAndRedirect(
-      HttpServletRequest req, HttpServletResponse rsp, OAuthToken token) throws IOException {
-    AuthRequest areq = new AuthRequest(ExternalId.Key.parse(user.getExternalId()));
-    AuthResult arsp;
-    try {
-      String claimedIdentifier = user.getClaimedIdentity();
-      if (!Strings.isNullOrEmpty(claimedIdentifier)) {
-        if (!authenticateWithIdentityClaimedDuringHandshake(areq, rsp, claimedIdentifier)) {
-          return;
-        }
-      } else if (linkMode) {
-        if (!authenticateWithLinkedIdentity(areq, rsp)) {
-          return;
-        }
-      }
-      areq.setUserName(user.getUserName());
-      areq.setEmailAddress(user.getEmailAddress());
-      areq.setDisplayName(user.getDisplayName());
-      arsp = accountManager.authenticate(areq);
-
-      accountId = arsp.getAccountId();
-      tokenCache.put(accountId, token);
-    } catch (AccountException e) {
-      log.error("Unable to authenticate user \"" + user + "\"", e);
-      rsp.sendError(HttpServletResponse.SC_FORBIDDEN);
-      return;
-    }
-
-    webSession.get().login(arsp, true);
-    String suffix = redirectToken.substring(OAuthWebFilter.GERRIT_LOGIN.length() + 1);
-    suffix = CharMatcher.anyOf("/").trimLeadingFrom(Url.decode(suffix));
-    StringBuilder rdr = new StringBuilder(urlProvider.get(req));
-    rdr.append(suffix);
-    rsp.sendRedirect(rdr.toString());
-  }
-
-  private boolean authenticateWithIdentityClaimedDuringHandshake(
-      AuthRequest req, HttpServletResponse rsp, String claimedIdentifier)
-      throws AccountException, IOException {
-    Optional<Account.Id> claimedId = accountManager.lookup(claimedIdentifier);
-    Optional<Account.Id> actualId = accountManager.lookup(user.getExternalId());
-    if (claimedId.isPresent() && actualId.isPresent()) {
-      if (claimedId.get().equals(actualId.get())) {
-        // Both link to the same account, that's what we expected.
-        log.debug("OAuth2: claimed identity equals current id");
-      } else {
-        // This is (for now) a fatal error. There are two records
-        // for what might be the same user.
-        //
-        log.error(
-            "OAuth accounts disagree over user identity:\n"
-                + "  Claimed ID: "
-                + claimedId.get()
-                + " is "
-                + claimedIdentifier
-                + "\n"
-                + "  Delgate ID: "
-                + actualId.get()
-                + " is "
-                + user.getExternalId());
-        rsp.sendError(HttpServletResponse.SC_FORBIDDEN);
-        return false;
-      }
-    } else if (claimedId.isPresent() && !actualId.isPresent()) {
-      // Claimed account already exists: link to it.
-      //
-      log.info("OAuth2: linking claimed identity to {}", claimedId.get().toString());
-      try {
-        accountManager.link(claimedId.get(), req);
-      } catch (OrmException | ConfigInvalidException e) {
-        log.error(
-            "Cannot link: "
-                + user.getExternalId()
-                + " to user identity:\n"
-                + "  Claimed ID: "
-                + claimedId.get()
-                + " is "
-                + claimedIdentifier);
-        rsp.sendError(HttpServletResponse.SC_FORBIDDEN);
-        return false;
-      }
-    }
-    return true;
-  }
-
-  private boolean authenticateWithLinkedIdentity(AuthRequest areq, HttpServletResponse rsp)
-      throws AccountException, IOException {
-    try {
-      accountManager.link(identifiedUser.get().getAccountId(), areq);
-    } catch (OrmException | ConfigInvalidException e) {
-      log.error(
-          "Cannot link: "
-              + user.getExternalId()
-              + " to user identity: "
-              + identifiedUser.get().getAccountId());
-      rsp.sendError(HttpServletResponse.SC_FORBIDDEN);
-      return false;
-    } finally {
-      linkMode = false;
-    }
-    return true;
-  }
-
-  void logout() {
-    if (accountId != null) {
-      tokenCache.remove(accountId);
-      accountId = null;
-    }
-    user = null;
-    redirectToken = null;
-    serviceProvider = null;
-  }
-
-  private boolean checkState(ServletRequest request) {
-    String s = Strings.nullToEmpty(request.getParameter("state"));
-    if (!s.equals(state)) {
-      log.error("Illegal request state '" + s + "' on OAuthProtocol " + this);
-      return false;
-    }
-    return true;
-  }
-
-  private static SecureRandom newRandomGenerator() {
-    try {
-      return SecureRandom.getInstance("SHA1PRNG");
-    } catch (NoSuchAlgorithmException e) {
-      throw new IllegalArgumentException("No SecureRandom available for GitHub authentication", e);
-    }
-  }
-
-  private static String generateRandomState() {
-    byte[] state = new byte[32];
-    randomState.nextBytes(state);
-    return Base64.encodeBase64URLSafeString(state);
-  }
-
-  @Override
-  public String toString() {
-    return "OAuthSession [token=" + tokenCache.get(accountId) + ", user=" + user + "]";
-  }
-
-  public void setServiceProvider(OAuthServiceProvider provider) {
-    this.serviceProvider = provider;
-  }
-
-  public OAuthServiceProvider getServiceProvider() {
-    return serviceProvider;
-  }
-
-  public void setLinkMode(boolean linkMode) {
-    this.linkMode = linkMode;
-  }
-
-  public boolean isLinkMode() {
-    return linkMode;
-  }
-}
diff --git a/gerrit-oauth/src/main/java/com/google/gerrit/httpd/auth/oauth/OAuthWebFilter.java b/gerrit-oauth/src/main/java/com/google/gerrit/httpd/auth/oauth/OAuthWebFilter.java
deleted file mode 100644
index 6ec5f3b..0000000
--- a/gerrit-oauth/src/main/java/com/google/gerrit/httpd/auth/oauth/OAuthWebFilter.java
+++ /dev/null
@@ -1,194 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.httpd.auth.oauth;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Strings;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.auth.oauth.OAuthServiceProvider;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.httpd.HtmlDomUtil;
-import com.google.gerrit.httpd.LoginUrlToken;
-import com.google.gerrit.httpd.template.SiteHeaderFooter;
-import com.google.gerrit.server.config.CanonicalWebUrl;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.Map;
-import java.util.Set;
-import java.util.SortedMap;
-import java.util.SortedSet;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-@Singleton
-/* OAuth web filter uses active OAuth session to perform OAuth requests */
-class OAuthWebFilter implements Filter {
-  static final String GERRIT_LOGIN = "/login";
-
-  private final Provider<String> urlProvider;
-  private final Provider<OAuthSession> oauthSessionProvider;
-  private final DynamicMap<OAuthServiceProvider> oauthServiceProviders;
-  private final SiteHeaderFooter header;
-  private OAuthServiceProvider ssoProvider;
-
-  @Inject
-  OAuthWebFilter(
-      @CanonicalWebUrl @Nullable Provider<String> urlProvider,
-      DynamicMap<OAuthServiceProvider> oauthServiceProviders,
-      Provider<OAuthSession> oauthSessionProvider,
-      SiteHeaderFooter header) {
-    this.urlProvider = urlProvider;
-    this.oauthServiceProviders = oauthServiceProviders;
-    this.oauthSessionProvider = oauthSessionProvider;
-    this.header = header;
-  }
-
-  @Override
-  public void init(FilterConfig filterConfig) throws ServletException {
-    pickSSOServiceProvider();
-  }
-
-  @Override
-  public void destroy() {}
-
-  @Override
-  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
-      throws IOException, ServletException {
-    HttpServletRequest httpRequest = (HttpServletRequest) request;
-    HttpServletResponse httpResponse = (HttpServletResponse) response;
-
-    OAuthSession oauthSession = oauthSessionProvider.get();
-    if (request.getParameter("link") != null) {
-      oauthSession.setLinkMode(true);
-      oauthSession.setServiceProvider(null);
-    }
-
-    String provider = httpRequest.getParameter("provider");
-    OAuthServiceProvider service =
-        ssoProvider == null ? oauthSession.getServiceProvider() : ssoProvider;
-
-    if (isGerritLogin(httpRequest) || oauthSession.isOAuthFinal(httpRequest)) {
-      if (service == null && Strings.isNullOrEmpty(provider)) {
-        selectProvider(httpRequest, httpResponse, null);
-        return;
-      }
-      if (service == null) {
-        service = findService(provider);
-      }
-      oauthSession.setServiceProvider(service);
-      oauthSession.login(httpRequest, httpResponse, service);
-    } else {
-      chain.doFilter(httpRequest, response);
-    }
-  }
-
-  private OAuthServiceProvider findService(String providerId) throws ServletException {
-    Set<String> plugins = oauthServiceProviders.plugins();
-    for (String pluginName : plugins) {
-      Map<String, Provider<OAuthServiceProvider>> m = oauthServiceProviders.byPlugin(pluginName);
-      for (Map.Entry<String, Provider<OAuthServiceProvider>> e : m.entrySet()) {
-        if (providerId.equals(String.format("%s_%s", pluginName, e.getKey()))) {
-          return e.getValue().get();
-        }
-      }
-    }
-    throw new ServletException("No provider found for: " + providerId);
-  }
-
-  private void selectProvider(
-      HttpServletRequest req, HttpServletResponse res, @Nullable String errorMessage)
-      throws IOException {
-    String self = req.getRequestURI();
-    String cancel = MoreObjects.firstNonNull(urlProvider != null ? urlProvider.get() : "/", "/");
-    cancel += LoginUrlToken.getToken(req);
-
-    Document doc = header.parse(OAuthWebFilter.class, "LoginForm.html");
-    HtmlDomUtil.find(doc, "hostName").setTextContent(req.getServerName());
-    HtmlDomUtil.find(doc, "login_form").setAttribute("action", self);
-    HtmlDomUtil.find(doc, "cancel_link").setAttribute("href", cancel);
-
-    Element emsg = HtmlDomUtil.find(doc, "error_message");
-    if (Strings.isNullOrEmpty(errorMessage)) {
-      emsg.getParentNode().removeChild(emsg);
-    } else {
-      emsg.setTextContent(errorMessage);
-    }
-
-    Element providers = HtmlDomUtil.find(doc, "providers");
-
-    Set<String> plugins = oauthServiceProviders.plugins();
-    for (String pluginName : plugins) {
-      Map<String, Provider<OAuthServiceProvider>> m = oauthServiceProviders.byPlugin(pluginName);
-      for (Map.Entry<String, Provider<OAuthServiceProvider>> e : m.entrySet()) {
-        addProvider(providers, pluginName, e.getKey(), e.getValue().get().getName());
-      }
-    }
-
-    sendHtml(res, doc);
-  }
-
-  private static void addProvider(Element form, String pluginName, String id, String serviceName) {
-    Element div = form.getOwnerDocument().createElement("div");
-    div.setAttribute("id", id);
-    Element hyperlink = form.getOwnerDocument().createElement("a");
-    hyperlink.setAttribute("href", String.format("?provider=%s_%s", pluginName, id));
-    hyperlink.setTextContent(serviceName + " (" + pluginName + " plugin)");
-    div.appendChild(hyperlink);
-    form.appendChild(div);
-  }
-
-  private static void sendHtml(HttpServletResponse res, Document doc) throws IOException {
-    byte[] bin = HtmlDomUtil.toUTF8(doc);
-    res.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
-    res.setContentType("text/html");
-    res.setCharacterEncoding(UTF_8.name());
-    res.setContentLength(bin.length);
-    try (ServletOutputStream out = res.getOutputStream()) {
-      out.write(bin);
-    }
-  }
-
-  private void pickSSOServiceProvider() throws ServletException {
-    SortedSet<String> plugins = oauthServiceProviders.plugins();
-    if (plugins.isEmpty()) {
-      throw new ServletException("OAuth service provider wasn't installed");
-    }
-    if (plugins.size() == 1) {
-      SortedMap<String, Provider<OAuthServiceProvider>> services =
-          oauthServiceProviders.byPlugin(Iterables.getOnlyElement(plugins));
-      if (services.size() == 1) {
-        ssoProvider = Iterables.getOnlyElement(services.values()).get();
-      }
-    }
-  }
-
-  private static boolean isGerritLogin(HttpServletRequest request) {
-    return request.getRequestURI().indexOf(GERRIT_LOGIN) >= 0;
-  }
-}
diff --git a/gerrit-openid/BUILD b/gerrit-openid/BUILD
deleted file mode 100644
index 7b0d2b1..0000000
--- a/gerrit-openid/BUILD
+++ /dev/null
@@ -1,25 +0,0 @@
-java_library(
-    name = "openid",
-    srcs = glob(["src/main/java/**/*.java"]),
-    resources = glob(["src/main/resources/**/*"]),
-    visibility = ["//visibility:public"],
-    deps = [
-        # We want all these deps to be provided_deps
-        "//gerrit-common:annotations",
-        "//gerrit-common:server",
-        "//gerrit-extension-api:api",
-        "//gerrit-gwtexpui:server",
-        "//gerrit-httpd:httpd",
-        "//gerrit-reviewdb:server",
-        "//gerrit-server:server",
-        "//lib:guava",
-        "//lib:gwtorm",
-        "//lib:servlet-api-3_1",
-        "//lib/commons:codec",
-        "//lib/guice",
-        "//lib/guice:guice-servlet",
-        "//lib/jgit/org.eclipse.jgit:jgit",
-        "//lib/log:api",
-        "//lib/openid:consumer",
-    ],
-)
diff --git a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/LoginForm.java b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/LoginForm.java
deleted file mode 100644
index b083d01..0000000
--- a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/LoginForm.java
+++ /dev/null
@@ -1,370 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.httpd.auth.openid;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.PageLinks;
-import com.google.gerrit.common.auth.openid.OpenIdUrls;
-import com.google.gerrit.extensions.auth.oauth.OAuthServiceProvider;
-import com.google.gerrit.extensions.client.AuthType;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.Url;
-import com.google.gerrit.httpd.HtmlDomUtil;
-import com.google.gerrit.httpd.LoginUrlToken;
-import com.google.gerrit.httpd.template.SiteHeaderFooter;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.config.AuthConfig;
-import com.google.gerrit.server.config.CanonicalWebUrl;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-/** Handles OpenID based login flow. */
-@Singleton
-class LoginForm extends HttpServlet {
-  private static final long serialVersionUID = 1L;
-
-  private static final Logger log = LoggerFactory.getLogger(LoginForm.class);
-  private static final ImmutableMap<String, String> ALL_PROVIDERS =
-      ImmutableMap.of(
-          "launchpad", OpenIdUrls.URL_LAUNCHPAD,
-          "yahoo", OpenIdUrls.URL_YAHOO);
-
-  private final ImmutableSet<String> suggestProviders;
-  private final Provider<String> urlProvider;
-  private final Provider<OAuthSessionOverOpenID> oauthSessionProvider;
-  private final OpenIdServiceImpl impl;
-  private final int maxRedirectUrlLength;
-  private final String ssoUrl;
-  private final SiteHeaderFooter header;
-  private final Provider<CurrentUser> currentUserProvider;
-  private final DynamicMap<OAuthServiceProvider> oauthServiceProviders;
-
-  @Inject
-  LoginForm(
-      @CanonicalWebUrl @Nullable Provider<String> urlProvider,
-      @GerritServerConfig Config config,
-      AuthConfig authConfig,
-      OpenIdServiceImpl impl,
-      SiteHeaderFooter header,
-      Provider<OAuthSessionOverOpenID> oauthSessionProvider,
-      Provider<CurrentUser> currentUserProvider,
-      DynamicMap<OAuthServiceProvider> oauthServiceProviders) {
-    this.urlProvider = urlProvider;
-    this.impl = impl;
-    this.header = header;
-    this.maxRedirectUrlLength = config.getInt("openid", "maxRedirectUrlLength", 10);
-    this.oauthSessionProvider = oauthSessionProvider;
-    this.currentUserProvider = currentUserProvider;
-    this.oauthServiceProviders = oauthServiceProviders;
-
-    if (urlProvider == null || Strings.isNullOrEmpty(urlProvider.get())) {
-      log.error("gerrit.canonicalWebUrl must be set in gerrit.config");
-    }
-
-    if (authConfig.getAuthType() == AuthType.OPENID_SSO) {
-      suggestProviders = ImmutableSet.of();
-      ssoUrl = authConfig.getOpenIdSsoUrl();
-    } else {
-      Set<String> providers = new HashSet<>();
-      for (Map.Entry<String, String> e : ALL_PROVIDERS.entrySet()) {
-        if (impl.isAllowedOpenID(e.getValue())) {
-          providers.add(e.getKey());
-        }
-      }
-      suggestProviders = ImmutableSet.copyOf(providers);
-      ssoUrl = null;
-    }
-  }
-
-  @Override
-  protected void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
-    if (ssoUrl != null) {
-      String token = LoginUrlToken.getToken(req);
-      SignInMode mode;
-      if (PageLinks.REGISTER.equals(token)) {
-        mode = SignInMode.REGISTER;
-        token = PageLinks.MINE;
-      } else {
-        mode = SignInMode.SIGN_IN;
-      }
-      discover(req, res, false, ssoUrl, false, token, mode);
-    } else {
-      String id = Strings.nullToEmpty(req.getParameter("id")).trim();
-      if (!id.isEmpty()) {
-        doPost(req, res);
-      } else {
-        boolean link = req.getParameter("link") != null;
-        sendForm(req, res, link, null);
-      }
-    }
-  }
-
-  @Override
-  protected void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException {
-    boolean link = req.getParameter("link") != null;
-    String id = Strings.nullToEmpty(req.getParameter("id")).trim();
-    if (id.isEmpty()) {
-      sendForm(req, res, link, null);
-      return;
-    }
-    if (!id.startsWith("http://") && !id.startsWith("https://")) {
-      id = "http://" + id;
-    }
-    if ((ssoUrl != null && !ssoUrl.equals(id)) || !impl.isAllowedOpenID(id)) {
-      sendForm(req, res, link, "OpenID provider not permitted by site policy.");
-      return;
-    }
-
-    boolean remember = "1".equals(req.getParameter("rememberme"));
-    String token = LoginUrlToken.getToken(req);
-    SignInMode mode;
-    if (link) {
-      mode = SignInMode.LINK_IDENTIY;
-    } else if (PageLinks.REGISTER.equals(token)) {
-      mode = SignInMode.REGISTER;
-      token = PageLinks.MINE;
-    } else {
-      mode = SignInMode.SIGN_IN;
-    }
-
-    log.debug("mode \"{}\"", mode);
-    OAuthServiceProvider oauthProvider = lookupOAuthServiceProvider(id);
-
-    if (oauthProvider == null) {
-      log.debug("OpenId provider \"{}\"", id);
-      discover(req, res, link, id, remember, token, mode);
-    } else {
-      log.debug("OAuth provider \"{}\"", id);
-      OAuthSessionOverOpenID oauthSession = oauthSessionProvider.get();
-      if (!currentUserProvider.get().isIdentifiedUser() && oauthSession.isLoggedIn()) {
-        oauthSession.logout();
-      }
-      if ((isGerritLogin(req) || oauthSession.isOAuthFinal(req))) {
-        oauthSession.setServiceProvider(oauthProvider);
-        oauthSession.setLinkMode(link);
-        oauthSession.login(req, res, oauthProvider);
-      }
-    }
-  }
-
-  private void discover(
-      HttpServletRequest req,
-      HttpServletResponse res,
-      boolean link,
-      String id,
-      boolean remember,
-      String token,
-      SignInMode mode)
-      throws IOException {
-    if (ssoUrl != null) {
-      remember = false;
-    }
-
-    DiscoveryResult r = impl.discover(req, id, mode, remember, token);
-    switch (r.status) {
-      case VALID:
-        redirect(r, res);
-        break;
-
-      case NO_PROVIDER:
-        sendForm(req, res, link, "Provider is not supported, or was incorrectly entered.");
-        break;
-
-      case ERROR:
-        sendForm(req, res, link, "Unable to connect with OpenID provider.");
-        break;
-    }
-  }
-
-  private void redirect(DiscoveryResult r, HttpServletResponse res) throws IOException {
-    StringBuilder url = new StringBuilder();
-    url.append(r.providerUrl);
-    if (r.providerArgs != null && !r.providerArgs.isEmpty()) {
-      boolean first = true;
-      for (Map.Entry<String, String> arg : r.providerArgs.entrySet()) {
-        if (first) {
-          url.append('?');
-          first = false;
-        } else {
-          url.append('&');
-        }
-        url.append(Url.encode(arg.getKey())).append('=').append(Url.encode(arg.getValue()));
-      }
-    }
-    if (url.length() <= maxRedirectUrlLength) {
-      res.sendRedirect(url.toString());
-      return;
-    }
-
-    Document doc = HtmlDomUtil.parseFile(LoginForm.class, "RedirectForm.html");
-    Element form = HtmlDomUtil.find(doc, "redirect_form");
-    form.setAttribute("action", r.providerUrl);
-    if (r.providerArgs != null && !r.providerArgs.isEmpty()) {
-      for (Map.Entry<String, String> arg : r.providerArgs.entrySet()) {
-        Element in = doc.createElement("input");
-        in.setAttribute("type", "hidden");
-        in.setAttribute("name", arg.getKey());
-        in.setAttribute("value", arg.getValue());
-        form.appendChild(in);
-      }
-    }
-    sendHtml(res, doc);
-  }
-
-  private void sendForm(
-      HttpServletRequest req, HttpServletResponse res, boolean link, @Nullable String errorMessage)
-      throws IOException {
-    String self = req.getRequestURI();
-    String cancel = MoreObjects.firstNonNull(urlProvider != null ? urlProvider.get() : "/", "/");
-    cancel += LoginUrlToken.getToken(req);
-
-    Document doc = header.parse(LoginForm.class, "LoginForm.html");
-    HtmlDomUtil.find(doc, "hostName").setTextContent(req.getServerName());
-    HtmlDomUtil.find(doc, "login_form").setAttribute("action", self);
-    HtmlDomUtil.find(doc, "cancel_link").setAttribute("href", cancel);
-
-    if (!link || ssoUrl != null) {
-      Element input = HtmlDomUtil.find(doc, "f_link");
-      input.getParentNode().removeChild(input);
-    }
-
-    String last = getLastId(req);
-    if (last != null) {
-      HtmlDomUtil.find(doc, "f_openid").setAttribute("value", last);
-    }
-
-    Element emsg = HtmlDomUtil.find(doc, "error_message");
-    if (Strings.isNullOrEmpty(errorMessage)) {
-      emsg.getParentNode().removeChild(emsg);
-    } else {
-      emsg.setTextContent(errorMessage);
-    }
-
-    for (String name : ALL_PROVIDERS.keySet()) {
-      Element div = HtmlDomUtil.find(doc, "provider_" + name);
-      if (div == null) {
-        continue;
-      }
-      if (!suggestProviders.contains(name)) {
-        div.getParentNode().removeChild(div);
-        continue;
-      }
-      Element a = HtmlDomUtil.find(div, "id_" + name);
-      if (a == null) {
-        div.getParentNode().removeChild(div);
-        continue;
-      }
-      StringBuilder u = new StringBuilder();
-      u.append(self).append(a.getAttribute("href"));
-      if (link) {
-        u.append("&link");
-      }
-      a.setAttribute("href", u.toString());
-    }
-
-    // OAuth: Add plugin based providers
-    Element providers = HtmlDomUtil.find(doc, "providers");
-    Set<String> plugins = oauthServiceProviders.plugins();
-    for (String pluginName : plugins) {
-      Map<String, Provider<OAuthServiceProvider>> m = oauthServiceProviders.byPlugin(pluginName);
-      for (Map.Entry<String, Provider<OAuthServiceProvider>> e : m.entrySet()) {
-        addProvider(providers, link, pluginName, e.getKey(), e.getValue().get().getName());
-      }
-    }
-
-    sendHtml(res, doc);
-  }
-
-  private void sendHtml(HttpServletResponse res, Document doc) throws IOException {
-    byte[] bin = HtmlDomUtil.toUTF8(doc);
-    res.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
-    res.setContentType("text/html");
-    res.setCharacterEncoding(UTF_8.name());
-    res.setContentLength(bin.length);
-    try (ServletOutputStream out = res.getOutputStream()) {
-      out.write(bin);
-    }
-  }
-
-  private static void addProvider(
-      Element form, boolean link, String pluginName, String id, String serviceName) {
-    Element div = form.getOwnerDocument().createElement("div");
-    div.setAttribute("id", id);
-    Element hyperlink = form.getOwnerDocument().createElement("a");
-    StringBuilder u = new StringBuilder(String.format("?id=%s_%s", pluginName, id));
-    if (link) {
-      u.append("&link");
-    }
-    hyperlink.setAttribute("href", u.toString());
-
-    hyperlink.setTextContent(serviceName + " (" + pluginName + " plugin)");
-    div.appendChild(hyperlink);
-    form.appendChild(div);
-  }
-
-  private OAuthServiceProvider lookupOAuthServiceProvider(String providerId) {
-    if (providerId.startsWith("http://")) {
-      providerId = providerId.substring("http://".length());
-    }
-    Set<String> plugins = oauthServiceProviders.plugins();
-    for (String pluginName : plugins) {
-      Map<String, Provider<OAuthServiceProvider>> m = oauthServiceProviders.byPlugin(pluginName);
-      for (Map.Entry<String, Provider<OAuthServiceProvider>> e : m.entrySet()) {
-        if (providerId.equals(String.format("%s_%s", pluginName, e.getKey()))) {
-          return e.getValue().get();
-        }
-      }
-    }
-    return null;
-  }
-
-  private static String getLastId(HttpServletRequest req) {
-    Cookie[] cookies = req.getCookies();
-    if (cookies != null) {
-      for (Cookie c : cookies) {
-        if (OpenIdUrls.LASTID_COOKIE.equals(c.getName())) {
-          return c.getValue();
-        }
-      }
-    }
-    return null;
-  }
-
-  private static boolean isGerritLogin(HttpServletRequest request) {
-    return request.getRequestURI().indexOf(OAuthSessionOverOpenID.GERRIT_LOGIN) >= 0;
-  }
-}
diff --git a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OAuthOverOpenIDLogoutServlet.java b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OAuthOverOpenIDLogoutServlet.java
deleted file mode 100644
index eecfb7f..0000000
--- a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OAuthOverOpenIDLogoutServlet.java
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.httpd.auth.openid;
-
-import com.google.gerrit.audit.AuditService;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.httpd.HttpLogoutServlet;
-import com.google.gerrit.httpd.WebSession;
-import com.google.gerrit.server.config.AuthConfig;
-import com.google.gerrit.server.config.CanonicalWebUrl;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-@Singleton
-class OAuthOverOpenIDLogoutServlet extends HttpLogoutServlet {
-  private static final long serialVersionUID = 1L;
-
-  private final Provider<OAuthSessionOverOpenID> oauthSession;
-
-  @Inject
-  OAuthOverOpenIDLogoutServlet(
-      AuthConfig authConfig,
-      DynamicItem<WebSession> webSession,
-      @CanonicalWebUrl @Nullable Provider<String> urlProvider,
-      AuditService audit,
-      Provider<OAuthSessionOverOpenID> oauthSession) {
-    super(authConfig, webSession, urlProvider, audit);
-    this.oauthSession = oauthSession;
-  }
-
-  @Override
-  protected void doLogout(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
-    super.doLogout(req, rsp);
-    if (req.getSession(false) != null) {
-      oauthSession.get().logout();
-    }
-  }
-}
diff --git a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OAuthSessionOverOpenID.java b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OAuthSessionOverOpenID.java
deleted file mode 100644
index 878f9ee..0000000
--- a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OAuthSessionOverOpenID.java
+++ /dev/null
@@ -1,266 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.httpd.auth.openid;
-
-import static javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.extensions.auth.oauth.OAuthServiceProvider;
-import com.google.gerrit.extensions.auth.oauth.OAuthToken;
-import com.google.gerrit.extensions.auth.oauth.OAuthUserInfo;
-import com.google.gerrit.extensions.auth.oauth.OAuthVerifier;
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.extensions.restapi.Url;
-import com.google.gerrit.httpd.CanonicalWebUrl;
-import com.google.gerrit.httpd.LoginUrlToken;
-import com.google.gerrit.httpd.WebSession;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountException;
-import com.google.gerrit.server.account.AccountManager;
-import com.google.gerrit.server.account.AuthResult;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.servlet.SessionScoped;
-import java.io.IOException;
-import java.security.NoSuchAlgorithmException;
-import java.security.SecureRandom;
-import java.util.Optional;
-import javax.servlet.ServletRequest;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.apache.commons.codec.binary.Base64;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** OAuth protocol implementation */
-@SessionScoped
-class OAuthSessionOverOpenID {
-  static final String GERRIT_LOGIN = "/login";
-  private static final Logger log = LoggerFactory.getLogger(OAuthSessionOverOpenID.class);
-  private static final SecureRandom randomState = newRandomGenerator();
-  private final String state;
-  private final DynamicItem<WebSession> webSession;
-  private final Provider<IdentifiedUser> identifiedUser;
-  private final AccountManager accountManager;
-  private final CanonicalWebUrl urlProvider;
-  private OAuthServiceProvider serviceProvider;
-  private OAuthToken token;
-  private OAuthUserInfo user;
-  private String redirectToken;
-  private boolean linkMode;
-
-  @Inject
-  OAuthSessionOverOpenID(
-      DynamicItem<WebSession> webSession,
-      Provider<IdentifiedUser> identifiedUser,
-      AccountManager accountManager,
-      CanonicalWebUrl urlProvider) {
-    this.state = generateRandomState();
-    this.webSession = webSession;
-    this.identifiedUser = identifiedUser;
-    this.accountManager = accountManager;
-    this.urlProvider = urlProvider;
-  }
-
-  boolean isLoggedIn() {
-    return token != null && user != null;
-  }
-
-  boolean isOAuthFinal(HttpServletRequest request) {
-    return Strings.emptyToNull(request.getParameter("code")) != null;
-  }
-
-  boolean login(
-      HttpServletRequest request, HttpServletResponse response, OAuthServiceProvider oauth)
-      throws IOException {
-    log.debug("Login " + this);
-
-    if (isOAuthFinal(request)) {
-      if (!checkState(request)) {
-        response.sendError(HttpServletResponse.SC_NOT_FOUND);
-        return false;
-      }
-
-      log.debug("Login-Retrieve-User " + this);
-      token = oauth.getAccessToken(new OAuthVerifier(request.getParameter("code")));
-      user = oauth.getUserInfo(token);
-
-      if (isLoggedIn()) {
-        log.debug("Login-SUCCESS " + this);
-        authenticateAndRedirect(request, response);
-        return true;
-      }
-      response.sendError(SC_UNAUTHORIZED);
-      return false;
-    }
-    log.debug("Login-PHASE1 " + this);
-    redirectToken = LoginUrlToken.getToken(request);
-    response.sendRedirect(oauth.getAuthorizationUrl() + "&state=" + state);
-    return false;
-  }
-
-  private void authenticateAndRedirect(HttpServletRequest req, HttpServletResponse rsp)
-      throws IOException {
-    com.google.gerrit.server.account.AuthRequest areq =
-        new com.google.gerrit.server.account.AuthRequest(
-            ExternalId.Key.parse(user.getExternalId()));
-    AuthResult arsp = null;
-    try {
-      String claimedIdentifier = user.getClaimedIdentity();
-      Optional<Account.Id> actualId = accountManager.lookup(user.getExternalId());
-      Optional<Account.Id> claimedId = Optional.empty();
-
-      // We try to retrieve claimed identity.
-      // For some reason, for example staging instance
-      // it may deviate from the really old OpenID identity.
-      // What we want to avoid in any event is to create new
-      // account instead of linking to the existing one.
-      // That why we query it here, not to lose linking mode.
-      if (!Strings.isNullOrEmpty(claimedIdentifier)) {
-        claimedId = accountManager.lookup(claimedIdentifier);
-        if (!claimedId.isPresent()) {
-          log.debug("Claimed identity is unknown");
-        }
-      }
-
-      // Use case 1: claimed identity was provided during handshake phase
-      // and user account exists for this identity
-      if (claimedId.isPresent()) {
-        log.debug("Claimed identity is set and is known");
-        if (actualId.isPresent()) {
-          if (claimedId.get().equals(actualId.get())) {
-            // Both link to the same account, that's what we expected.
-            log.debug("Both link to the same account. All is fine.");
-          } else {
-            // This is (for now) a fatal error. There are two records
-            // for what might be the same user. The admin would have to
-            // link the accounts manually.
-            log.error(
-                "OAuth accounts disagree over user identity:\n"
-                    + "  Claimed ID: "
-                    + claimedId.get()
-                    + " is "
-                    + claimedIdentifier
-                    + "\n"
-                    + "  Delgate ID: "
-                    + actualId.get()
-                    + " is "
-                    + user.getExternalId());
-            rsp.sendError(HttpServletResponse.SC_FORBIDDEN);
-            return;
-          }
-        } else {
-          // Claimed account already exists: link to it.
-          log.debug("Claimed account already exists: link to it.");
-          try {
-            accountManager.link(claimedId.get(), areq);
-          } catch (OrmException | ConfigInvalidException e) {
-            log.error(
-                "Cannot link: "
-                    + user.getExternalId()
-                    + " to user identity:\n"
-                    + "  Claimed ID: "
-                    + claimedId.get()
-                    + " is "
-                    + claimedIdentifier);
-            rsp.sendError(HttpServletResponse.SC_FORBIDDEN);
-            return;
-          }
-        }
-      } else if (linkMode) {
-        // Use case 2: link mode activated from the UI
-        Account.Id accountId = identifiedUser.get().getAccountId();
-        try {
-          log.debug("Linking \"{}\" to \"{}\"", user.getExternalId(), accountId);
-          accountManager.link(accountId, areq);
-        } catch (OrmException | ConfigInvalidException e) {
-          log.error("Cannot link: " + user.getExternalId() + " to user identity: " + accountId);
-          rsp.sendError(HttpServletResponse.SC_FORBIDDEN);
-          return;
-        } finally {
-          linkMode = false;
-        }
-      }
-      areq.setUserName(user.getUserName());
-      areq.setEmailAddress(user.getEmailAddress());
-      areq.setDisplayName(user.getDisplayName());
-      arsp = accountManager.authenticate(areq);
-    } catch (AccountException e) {
-      log.error("Unable to authenticate user \"" + user + "\"", e);
-      rsp.sendError(HttpServletResponse.SC_FORBIDDEN);
-      return;
-    }
-
-    webSession.get().login(arsp, true);
-    StringBuilder rdr = new StringBuilder(urlProvider.get(req));
-    rdr.append(Url.decode(redirectToken));
-    rsp.sendRedirect(rdr.toString());
-  }
-
-  void logout() {
-    token = null;
-    user = null;
-    redirectToken = null;
-    serviceProvider = null;
-  }
-
-  private boolean checkState(ServletRequest request) {
-    String s = Strings.nullToEmpty(request.getParameter("state"));
-    if (!s.equals(state)) {
-      log.error("Illegal request state '" + s + "' on OAuthProtocol " + this);
-      return false;
-    }
-    return true;
-  }
-
-  private static SecureRandom newRandomGenerator() {
-    try {
-      return SecureRandom.getInstance("SHA1PRNG");
-    } catch (NoSuchAlgorithmException e) {
-      throw new IllegalArgumentException("No SecureRandom available for GitHub authentication", e);
-    }
-  }
-
-  private static String generateRandomState() {
-    byte[] state = new byte[32];
-    randomState.nextBytes(state);
-    return Base64.encodeBase64URLSafeString(state);
-  }
-
-  @Override
-  public String toString() {
-    return "OAuthSession [token=" + token + ", user=" + user + "]";
-  }
-
-  public void setServiceProvider(OAuthServiceProvider provider) {
-    this.serviceProvider = provider;
-  }
-
-  public OAuthServiceProvider getServiceProvider() {
-    return serviceProvider;
-  }
-
-  public void setLinkMode(boolean linkMode) {
-    this.linkMode = linkMode;
-  }
-
-  public boolean isLinkMode() {
-    return linkMode;
-  }
-}
diff --git a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OAuthWebFilterOverOpenID.java b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OAuthWebFilterOverOpenID.java
deleted file mode 100644
index fe3d9ee..0000000
--- a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OAuthWebFilterOverOpenID.java
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.httpd.auth.openid;
-
-import com.google.common.collect.Iterables;
-import com.google.gerrit.extensions.auth.oauth.OAuthServiceProvider;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.SortedMap;
-import java.util.SortedSet;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/** OAuth web filter uses active OAuth session to perform OAuth requests */
-@Singleton
-class OAuthWebFilterOverOpenID implements Filter {
-  static final String GERRIT_LOGIN = "/login";
-
-  private final Provider<OAuthSessionOverOpenID> oauthSessionProvider;
-  private final DynamicMap<OAuthServiceProvider> oauthServiceProviders;
-  private OAuthServiceProvider ssoProvider;
-
-  @Inject
-  OAuthWebFilterOverOpenID(
-      DynamicMap<OAuthServiceProvider> oauthServiceProviders,
-      Provider<OAuthSessionOverOpenID> oauthSessionProvider) {
-    this.oauthServiceProviders = oauthServiceProviders;
-    this.oauthSessionProvider = oauthSessionProvider;
-  }
-
-  @Override
-  public void init(FilterConfig filterConfig) throws ServletException {
-    pickSSOServiceProvider();
-  }
-
-  @Override
-  public void destroy() {}
-
-  @Override
-  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
-      throws IOException, ServletException {
-    HttpServletRequest httpRequest = (HttpServletRequest) request;
-    HttpServletResponse httpResponse = (HttpServletResponse) response;
-
-    OAuthSessionOverOpenID oauthSession = oauthSessionProvider.get();
-    OAuthServiceProvider service =
-        ssoProvider == null ? oauthSession.getServiceProvider() : ssoProvider;
-
-    if (isGerritLogin(httpRequest) || oauthSession.isOAuthFinal(httpRequest)) {
-      if (service == null) {
-        throw new IllegalStateException("service is unknown");
-      }
-      oauthSession.setServiceProvider(service);
-      oauthSession.login(httpRequest, httpResponse, service);
-    } else {
-      chain.doFilter(httpRequest, response);
-    }
-  }
-
-  private void pickSSOServiceProvider() {
-    SortedSet<String> plugins = oauthServiceProviders.plugins();
-    if (plugins.size() == 1) {
-      SortedMap<String, Provider<OAuthServiceProvider>> services =
-          oauthServiceProviders.byPlugin(Iterables.getOnlyElement(plugins));
-      if (services.size() == 1) {
-        ssoProvider = Iterables.getOnlyElement(services.values()).get();
-      }
-    }
-  }
-
-  private static boolean isGerritLogin(HttpServletRequest request) {
-    return request.getRequestURI().indexOf(GERRIT_LOGIN) >= 0;
-  }
-}
diff --git a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OpenIdLoginServlet.java b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OpenIdLoginServlet.java
deleted file mode 100644
index 1b0fe9e..0000000
--- a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OpenIdLoginServlet.java
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.httpd.auth.openid;
-
-import com.google.gwtexpui.server.CacheHeaders;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/** Handles the {@code /OpenID} URL for web based single-sign-on. */
-@Singleton
-class OpenIdLoginServlet extends HttpServlet {
-  private static final long serialVersionUID = 1L;
-
-  private final OpenIdServiceImpl impl;
-
-  @Inject
-  OpenIdLoginServlet(OpenIdServiceImpl i) {
-    impl = i;
-  }
-
-  @Override
-  public void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
-    doPost(req, rsp);
-  }
-
-  @Override
-  public void doPost(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
-    try {
-      CacheHeaders.setNotCacheable(rsp);
-      impl.doAuth(req, rsp);
-    } catch (Exception e) {
-      getServletContext().log("Unexpected error during authentication", e);
-      rsp.reset();
-      rsp.sendError(500);
-    }
-  }
-}
diff --git a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OpenIdServiceImpl.java b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OpenIdServiceImpl.java
deleted file mode 100644
index fd42e82..0000000
--- a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OpenIdServiceImpl.java
+++ /dev/null
@@ -1,580 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.httpd.auth.openid;
-
-import com.google.gerrit.common.PageLinks;
-import com.google.gerrit.common.auth.openid.OpenIdUrls;
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.extensions.restapi.Url;
-import com.google.gerrit.httpd.CanonicalWebUrl;
-import com.google.gerrit.httpd.ProxyProperties;
-import com.google.gerrit.httpd.WebSession;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.UrlEncoded;
-import com.google.gerrit.server.account.AccountException;
-import com.google.gerrit.server.account.AccountManager;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.auth.openid.OpenIdProviderPattern;
-import com.google.gerrit.server.config.AuthConfig;
-import com.google.gerrit.server.config.ConfigUtil;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gwtorm.client.KeyUtil;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.net.URL;
-import java.util.List;
-import java.util.Optional;
-import java.util.concurrent.TimeUnit;
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.eclipse.jgit.lib.Config;
-import org.openid4java.consumer.ConsumerException;
-import org.openid4java.consumer.ConsumerManager;
-import org.openid4java.consumer.VerificationResult;
-import org.openid4java.discovery.DiscoveryException;
-import org.openid4java.discovery.DiscoveryInformation;
-import org.openid4java.message.AuthRequest;
-import org.openid4java.message.Message;
-import org.openid4java.message.MessageException;
-import org.openid4java.message.MessageExtension;
-import org.openid4java.message.ParameterList;
-import org.openid4java.message.ax.AxMessage;
-import org.openid4java.message.ax.FetchRequest;
-import org.openid4java.message.ax.FetchResponse;
-import org.openid4java.message.pape.PapeMessage;
-import org.openid4java.message.pape.PapeRequest;
-import org.openid4java.message.pape.PapeResponse;
-import org.openid4java.message.sreg.SRegMessage;
-import org.openid4java.message.sreg.SRegRequest;
-import org.openid4java.message.sreg.SRegResponse;
-import org.openid4java.util.HttpClientFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-class OpenIdServiceImpl {
-  private static final Logger log = LoggerFactory.getLogger(OpenIdServiceImpl.class);
-
-  static final String RETURN_URL = "OpenID";
-
-  private static final String P_MODE = "gerrit.mode";
-  private static final String P_TOKEN = "gerrit.token";
-  private static final String P_REMEMBER = "gerrit.remember";
-  private static final String P_CLAIMED = "gerrit.claimed";
-  private static final int LASTID_AGE = 365 * 24 * 60 * 60; // seconds
-
-  private static final String OPENID_MODE = "openid.mode";
-  private static final String OMODE_CANCEL = "cancel";
-
-  private static final String SCHEMA_EMAIL = "http://schema.openid.net/contact/email";
-  private static final String SCHEMA_FIRSTNAME = "http://schema.openid.net/namePerson/first";
-  private static final String SCHEMA_LASTNAME = "http://schema.openid.net/namePerson/last";
-
-  private final DynamicItem<WebSession> webSession;
-  private final Provider<IdentifiedUser> identifiedUser;
-  private final CanonicalWebUrl urlProvider;
-  private final AccountManager accountManager;
-  private final ConsumerManager manager;
-  private final List<OpenIdProviderPattern> allowedOpenIDs;
-  private final List<String> openIdDomains;
-
-  /** Maximum age, in seconds, before forcing re-authentication of account. */
-  private final int papeMaxAuthAge;
-
-  @Inject
-  OpenIdServiceImpl(
-      DynamicItem<WebSession> cf,
-      Provider<IdentifiedUser> iu,
-      CanonicalWebUrl up,
-      @GerritServerConfig Config config,
-      AuthConfig ac,
-      AccountManager am,
-      ProxyProperties proxyProperties) {
-
-    if (proxyProperties.getProxyUrl() != null) {
-      final org.openid4java.util.ProxyProperties proxy = new org.openid4java.util.ProxyProperties();
-      URL url = proxyProperties.getProxyUrl();
-      proxy.setProxyHostName(url.getHost());
-      proxy.setProxyPort(url.getPort());
-      proxy.setUserName(proxyProperties.getUsername());
-      proxy.setPassword(proxyProperties.getPassword());
-      HttpClientFactory.setProxyProperties(proxy);
-    }
-
-    webSession = cf;
-    identifiedUser = iu;
-    urlProvider = up;
-    accountManager = am;
-    manager = new ConsumerManager();
-    allowedOpenIDs = ac.getAllowedOpenIDs();
-    openIdDomains = ac.getOpenIdDomains();
-    papeMaxAuthAge =
-        (int)
-            ConfigUtil.getTimeUnit(
-                config, //
-                "auth",
-                null,
-                "maxOpenIdSessionAge",
-                -1,
-                TimeUnit.SECONDS);
-  }
-
-  @SuppressWarnings("unchecked")
-  DiscoveryResult discover(
-      HttpServletRequest req,
-      String openidIdentifier,
-      SignInMode mode,
-      boolean remember,
-      String returnToken) {
-    final State state;
-    state = init(req, openidIdentifier, mode, remember, returnToken);
-    if (state == null) {
-      return new DiscoveryResult(DiscoveryResult.Status.NO_PROVIDER);
-    }
-
-    final AuthRequest aReq;
-    try {
-      aReq = manager.authenticate(state.discovered, state.retTo.toString());
-      log.debug("OpenID: openid-realm={}", state.contextUrl);
-      aReq.setRealm(state.contextUrl);
-
-      if (requestRegistration(aReq)) {
-        final SRegRequest sregReq = SRegRequest.createFetchRequest();
-        sregReq.addAttribute("fullname", true);
-        sregReq.addAttribute("email", true);
-        aReq.addExtension(sregReq);
-
-        final FetchRequest fetch = FetchRequest.createFetchRequest();
-        fetch.addAttribute("FirstName", SCHEMA_FIRSTNAME, true);
-        fetch.addAttribute("LastName", SCHEMA_LASTNAME, true);
-        fetch.addAttribute("Email", SCHEMA_EMAIL, true);
-        aReq.addExtension(fetch);
-      }
-
-      if (0 <= papeMaxAuthAge) {
-        final PapeRequest pape = PapeRequest.createPapeRequest();
-        pape.setMaxAuthAge(papeMaxAuthAge);
-        aReq.addExtension(pape);
-      }
-    } catch (MessageException e) {
-      log.error("Cannot create OpenID redirect for " + openidIdentifier, e);
-      return new DiscoveryResult(DiscoveryResult.Status.ERROR);
-    } catch (ConsumerException e) {
-      log.error("Cannot create OpenID redirect for " + openidIdentifier, e);
-      return new DiscoveryResult(DiscoveryResult.Status.ERROR);
-    }
-
-    return new DiscoveryResult(aReq.getDestinationUrl(false), aReq.getParameterMap());
-  }
-
-  private boolean requestRegistration(AuthRequest aReq) {
-    if (AuthRequest.SELECT_ID.equals(aReq.getIdentity())) {
-      // We don't know anything about the identity, as the provider
-      // will offer the user a way to indicate their identity. Skip
-      // any database query operation and assume we must ask for the
-      // registration information, in case the identity is new to us.
-      //
-      return true;
-    }
-
-    // We might already have this account on file. Look for it.
-    //
-    try {
-      return accountManager.lookup(aReq.getIdentity()) == null;
-    } catch (AccountException e) {
-      log.warn("Cannot determine if user account exists", e);
-      return true;
-    }
-  }
-
-  /** Called by {@link OpenIdLoginServlet} doGet, doPost */
-  void doAuth(HttpServletRequest req, HttpServletResponse rsp) throws Exception {
-    if (OMODE_CANCEL.equals(req.getParameter(OPENID_MODE))) {
-      cancel(req, rsp);
-      return;
-    }
-
-    // Process the authentication response.
-    //
-    final SignInMode mode = signInMode(req);
-    final String openidIdentifier = req.getParameter("openid.identity");
-    final String claimedIdentifier = req.getParameter(P_CLAIMED);
-    final String returnToken = req.getParameter(P_TOKEN);
-    final boolean remember = "1".equals(req.getParameter(P_REMEMBER));
-    final String rediscoverIdentifier =
-        claimedIdentifier != null ? claimedIdentifier : openidIdentifier;
-    final State state;
-
-    if (!isAllowedOpenID(rediscoverIdentifier)
-        || !isAllowedOpenID(openidIdentifier)
-        || (claimedIdentifier != null && !isAllowedOpenID(claimedIdentifier))) {
-      cancelWithError(req, rsp, "Provider not allowed");
-      return;
-    }
-
-    state = init(req, rediscoverIdentifier, mode, remember, returnToken);
-    if (state == null) {
-      // Re-discovery must have failed, we can't run a login.
-      //
-      cancel(req, rsp);
-      return;
-    }
-
-    final String returnTo = req.getParameter("openid.return_to");
-    if (returnTo != null && returnTo.contains("openid.rpnonce=")) {
-      // Some providers (claimid.com) seem to embed these request
-      // parameters into our return_to URL, and then give us them
-      // in the return_to request parameter. But not all.
-      //
-      state.retTo.put("openid.rpnonce", req.getParameter("openid.rpnonce"));
-      state.retTo.put("openid.rpsig", req.getParameter("openid.rpsig"));
-    }
-
-    final VerificationResult result =
-        manager.verify(
-            state.retTo.toString(), new ParameterList(req.getParameterMap()), state.discovered);
-    if (result.getVerifiedId() == null /* authentication failure */) {
-      if ("Nonce verification failed.".equals(result.getStatusMsg())) {
-        // We might be suffering from clock skew on this system.
-        //
-        log.error(
-            "OpenID failure: "
-                + result.getStatusMsg()
-                + "  Likely caused by clock skew on this server,"
-                + " install/configure NTP.");
-        cancelWithError(req, rsp, result.getStatusMsg());
-
-      } else if (result.getStatusMsg() != null) {
-        // Authentication failed.
-        //
-        log.error("OpenID failure: " + result.getStatusMsg());
-        cancelWithError(req, rsp, result.getStatusMsg());
-
-      } else {
-        // Assume authentication was canceled.
-        //
-        cancel(req, rsp);
-      }
-      return;
-    }
-
-    final Message authRsp = result.getAuthResponse();
-    SRegResponse sregRsp = null;
-    FetchResponse fetchRsp = null;
-
-    if (0 <= papeMaxAuthAge) {
-      PapeResponse ext;
-      boolean unsupported = false;
-
-      try {
-        ext = (PapeResponse) authRsp.getExtension(PapeMessage.OPENID_NS_PAPE);
-      } catch (MessageException err) {
-        // Far too many providers are unable to provide PAPE extensions
-        // right now. Instead of blocking all of them log the error and
-        // let the authentication complete anyway.
-        //
-        log.error("Invalid PAPE response " + openidIdentifier + ": " + err);
-        unsupported = true;
-        ext = null;
-      }
-      if (!unsupported && ext == null) {
-        log.error("No PAPE extension response from " + openidIdentifier);
-        cancelWithError(req, rsp, "OpenID provider does not support PAPE.");
-        return;
-      }
-    }
-
-    if (authRsp.hasExtension(SRegMessage.OPENID_NS_SREG)) {
-      final MessageExtension ext = authRsp.getExtension(SRegMessage.OPENID_NS_SREG);
-      if (ext instanceof SRegResponse) {
-        sregRsp = (SRegResponse) ext;
-      }
-    }
-
-    if (authRsp.hasExtension(AxMessage.OPENID_NS_AX)) {
-      final MessageExtension ext = authRsp.getExtension(AxMessage.OPENID_NS_AX);
-      if (ext instanceof FetchResponse) {
-        fetchRsp = (FetchResponse) ext;
-      }
-    }
-
-    final com.google.gerrit.server.account.AuthRequest areq =
-        new com.google.gerrit.server.account.AuthRequest(ExternalId.Key.parse(openidIdentifier));
-
-    if (sregRsp != null) {
-      areq.setDisplayName(sregRsp.getAttributeValue("fullname"));
-      areq.setEmailAddress(sregRsp.getAttributeValue("email"));
-
-    } else if (fetchRsp != null) {
-      final String firstName = fetchRsp.getAttributeValue("FirstName");
-      final String lastName = fetchRsp.getAttributeValue("LastName");
-      final StringBuilder n = new StringBuilder();
-      if (firstName != null && firstName.length() > 0) {
-        n.append(firstName);
-      }
-      if (lastName != null && lastName.length() > 0) {
-        if (n.length() > 0) {
-          n.append(' ');
-        }
-        n.append(lastName);
-      }
-      areq.setDisplayName(n.length() > 0 ? n.toString() : null);
-      areq.setEmailAddress(fetchRsp.getAttributeValue("Email"));
-    }
-
-    if (openIdDomains != null && openIdDomains.size() > 0) {
-      // Administrator limited email domains, which can be used for OpenID.
-      // Login process will only work if the passed email matches one
-      // of these domains.
-      //
-      final String email = areq.getEmailAddress();
-      int emailAtIndex = email.lastIndexOf("@");
-      if (emailAtIndex >= 0 && emailAtIndex < email.length() - 1) {
-        final String emailDomain = email.substring(emailAtIndex);
-
-        boolean match = false;
-        for (String domain : openIdDomains) {
-          if (emailDomain.equalsIgnoreCase(domain)) {
-            match = true;
-            break;
-          }
-        }
-
-        if (!match) {
-          log.error("Domain disallowed: " + emailDomain);
-          cancelWithError(req, rsp, "Domain disallowed");
-          return;
-        }
-      }
-    }
-
-    if (claimedIdentifier != null) {
-      // The user used a claimed identity which has delegated to the verified
-      // identity we have in our AuthRequest above. We still should have a
-      // link between the two, so set one up if not present.
-      //
-      Optional<Account.Id> claimedId = accountManager.lookup(claimedIdentifier);
-      Optional<Account.Id> actualId = accountManager.lookup(areq.getExternalIdKey().get());
-
-      if (claimedId.isPresent() && actualId.isPresent()) {
-        if (claimedId.get().equals(actualId.get())) {
-          // Both link to the same account, that's what we expected.
-        } else {
-          // This is (for now) a fatal error. There are two records
-          // for what might be the same user.
-          //
-          log.error(
-              "OpenID accounts disagree over user identity:\n"
-                  + "  Claimed ID: "
-                  + claimedId.get()
-                  + " is "
-                  + claimedIdentifier
-                  + "\n"
-                  + "  Delgate ID: "
-                  + actualId.get()
-                  + " is "
-                  + areq.getExternalIdKey());
-          cancelWithError(req, rsp, "Contact site administrator");
-          return;
-        }
-
-      } else if (!claimedId.isPresent() && actualId.isPresent()) {
-        // Older account, the actual was already created but the claimed
-        // was missing due to a bug in Gerrit. Link the claimed.
-        //
-        final com.google.gerrit.server.account.AuthRequest linkReq =
-            new com.google.gerrit.server.account.AuthRequest(
-                ExternalId.Key.parse(claimedIdentifier));
-        linkReq.setDisplayName(areq.getDisplayName());
-        linkReq.setEmailAddress(areq.getEmailAddress());
-        accountManager.link(actualId.get(), linkReq);
-
-      } else if (claimedId.isPresent() && !actualId.isPresent()) {
-        // Claimed account already exists, but it smells like the user has
-        // changed their delegate to point to a different provider. Link
-        // the new provider.
-        //
-        accountManager.link(claimedId.get(), areq);
-
-      } else {
-        // Both are null, we are going to create a new account below.
-      }
-    }
-
-    try {
-      final com.google.gerrit.server.account.AuthResult arsp;
-      switch (mode) {
-        case REGISTER:
-        case SIGN_IN:
-          arsp = accountManager.authenticate(areq);
-
-          final Cookie lastId = new Cookie(OpenIdUrls.LASTID_COOKIE, "");
-          lastId.setPath(req.getContextPath() + "/login/");
-          if (remember) {
-            lastId.setValue(rediscoverIdentifier);
-            lastId.setMaxAge(LASTID_AGE);
-          } else {
-            lastId.setMaxAge(0);
-          }
-          rsp.addCookie(lastId);
-          webSession.get().login(arsp, remember);
-          if (arsp.isNew() && claimedIdentifier != null) {
-            final com.google.gerrit.server.account.AuthRequest linkReq =
-                new com.google.gerrit.server.account.AuthRequest(
-                    ExternalId.Key.parse(claimedIdentifier));
-            linkReq.setDisplayName(areq.getDisplayName());
-            linkReq.setEmailAddress(areq.getEmailAddress());
-            accountManager.link(arsp.getAccountId(), linkReq);
-          }
-          callback(arsp.isNew(), req, rsp);
-          break;
-
-        case LINK_IDENTIY:
-          {
-            arsp = accountManager.link(identifiedUser.get().getAccountId(), areq);
-            webSession.get().login(arsp, remember);
-            callback(false, req, rsp);
-            break;
-          }
-      }
-    } catch (AccountException e) {
-      log.error("OpenID authentication failure", e);
-      cancelWithError(req, rsp, "Contact site administrator");
-    }
-  }
-
-  private boolean isSignIn(SignInMode mode) {
-    switch (mode) {
-      case SIGN_IN:
-      case REGISTER:
-        return true;
-      case LINK_IDENTIY:
-      default:
-        return false;
-    }
-  }
-
-  private static SignInMode signInMode(HttpServletRequest req) {
-    try {
-      return SignInMode.valueOf(req.getParameter(P_MODE));
-    } catch (RuntimeException e) {
-      return SignInMode.SIGN_IN;
-    }
-  }
-
-  private void callback(final boolean isNew, HttpServletRequest req, HttpServletResponse rsp)
-      throws IOException {
-    String token = req.getParameter(P_TOKEN);
-    if (token == null || token.isEmpty() || token.startsWith("/SignInFailure,")) {
-      token = PageLinks.MINE;
-    }
-
-    final StringBuilder rdr = new StringBuilder();
-    rdr.append(urlProvider.get(req));
-    String nextToken = Url.decode(token);
-    if (isNew && !token.startsWith(PageLinks.REGISTER + "/")) {
-      rdr.append('#' + PageLinks.REGISTER);
-      if (nextToken.startsWith("#")) {
-        // Need to strip the leading # off the token to fix registration page redirect
-        nextToken = nextToken.substring(1);
-      }
-    }
-    rdr.append(nextToken);
-    rsp.sendRedirect(rdr.toString());
-  }
-
-  private void cancel(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
-    if (isSignIn(signInMode(req))) {
-      webSession.get().logout();
-    }
-    callback(false, req, rsp);
-  }
-
-  private void cancelWithError(
-      final HttpServletRequest req, HttpServletResponse rsp, String errorDetail)
-      throws IOException {
-    final SignInMode mode = signInMode(req);
-    if (isSignIn(mode)) {
-      webSession.get().logout();
-    }
-    final StringBuilder rdr = new StringBuilder();
-    rdr.append(urlProvider.get(req));
-    rdr.append('#');
-    rdr.append("SignInFailure");
-    rdr.append(',');
-    rdr.append(mode.name());
-    rdr.append(',');
-    rdr.append(errorDetail != null ? KeyUtil.encode(errorDetail) : "");
-    rsp.sendRedirect(rdr.toString());
-  }
-
-  private State init(
-      HttpServletRequest req,
-      final String openidIdentifier,
-      final SignInMode mode,
-      final boolean remember,
-      final String returnToken) {
-    final List<?> list;
-    try {
-      list = manager.discover(openidIdentifier);
-    } catch (DiscoveryException e) {
-      log.error("Cannot discover OpenID " + openidIdentifier, e);
-      return null;
-    }
-    if (list == null || list.isEmpty()) {
-      return null;
-    }
-
-    final String contextUrl = urlProvider.get(req);
-    final DiscoveryInformation discovered = manager.associate(list);
-    final UrlEncoded retTo = new UrlEncoded(contextUrl + RETURN_URL);
-    retTo.put(P_MODE, mode.name());
-    if (returnToken != null && returnToken.length() > 0) {
-      retTo.put(P_TOKEN, returnToken);
-    }
-    if (remember) {
-      retTo.put(P_REMEMBER, "1");
-    }
-    if (discovered.hasClaimedIdentifier()) {
-      retTo.put(P_CLAIMED, discovered.getClaimedIdentifier().getIdentifier());
-    }
-    return new State(discovered, retTo, contextUrl);
-  }
-
-  boolean isAllowedOpenID(String id) {
-    for (OpenIdProviderPattern pattern : allowedOpenIDs) {
-      if (pattern.matches(id)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  private static class State {
-    final DiscoveryInformation discovered;
-    final UrlEncoded retTo;
-    final String contextUrl;
-
-    State(DiscoveryInformation d, UrlEncoded r, String c) {
-      discovered = d;
-      retTo = r;
-      contextUrl = c;
-    }
-  }
-}
diff --git a/gerrit-patch-commonsnet/BUILD b/gerrit-patch-commonsnet/BUILD
deleted file mode 100644
index 7524bfe..0000000
--- a/gerrit-patch-commonsnet/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "commons-net",
-    srcs = glob(["src/main/java/org/apache/commons/net/**/*.java"]),
-    visibility = ["//visibility:public"],
-    deps = [
-        "//gerrit-util-ssl:ssl",
-        "//lib/commons:codec",
-        "//lib/commons:net",
-        "//lib/log:api",
-    ],
-)
diff --git a/gerrit-patch-jgit/BUILD b/gerrit-patch-jgit/BUILD
deleted file mode 100644
index 1a8fcd4..0000000
--- a/gerrit-patch-jgit/BUILD
+++ /dev/null
@@ -1,67 +0,0 @@
-load("//tools/bzl:genrule2.bzl", "genrule2")
-load("//tools/bzl:gwt.bzl", "gwt_module")
-
-SRC = "src/main/java/org/eclipse/jgit/"
-
-gwt_module(
-    name = "client",
-    srcs = [
-        SRC + "diff/Edit_JsonSerializer.java",
-        SRC + "diff/ReplaceEdit.java",
-    ],
-    gwt_xml = SRC + "JGit.gwt.xml",
-    visibility = ["//visibility:public"],
-    deps = [
-        ":Edit",
-        "//lib:gwtjsonrpc",
-        "//lib/gwt:user",
-    ],
-)
-
-gwt_module(
-    name = "Edit",
-    srcs = [":jgit_edit_src"],
-    visibility = ["//visibility:public"],
-)
-
-genrule2(
-    name = "jgit_edit_src",
-    outs = ["edit.srcjar"],
-    cmd = " && ".join([
-        "unzip -qd $$TMP $(location //lib/jgit/org.eclipse.jgit:jgit-source) " +
-        "org/eclipse/jgit/diff/Edit.java",
-        "cd $$TMP",
-        "zip -Dq $$ROOT/$@ org/eclipse/jgit/diff/Edit.java",
-    ]),
-    tools = ["//lib/jgit/org.eclipse.jgit:jgit-source"],
-)
-
-java_library(
-    name = "server",
-    srcs = [
-        SRC + x
-        for x in [
-            "diff/EditDeserializer.java",
-            "diff/ReplaceEdit.java",
-            "internal/storage/file/WindowCacheStatAccessor.java",
-            "lib/ObjectIdSerialization.java",
-        ]
-    ],
-    visibility = ["//visibility:public"],
-    deps = [
-        "//lib:gson",
-        "//lib/jgit/org.eclipse.jgit:jgit",
-    ],
-)
-
-java_test(
-    name = "jgit_patch_tests",
-    srcs = glob(["src/test/java/**/*.java"]),
-    test_class = "org.eclipse.jgit.diff.EditDeserializerTest",
-    visibility = ["//visibility:public"],
-    deps = [
-        ":server",
-        "//lib:junit",
-        "//lib/jgit/org.eclipse.jgit:jgit",
-    ],
-)
diff --git a/gerrit-patch-jgit/src/main/java/org/eclipse/jgit/internal/storage/file/WindowCacheStatAccessor.java b/gerrit-patch-jgit/src/main/java/org/eclipse/jgit/internal/storage/file/WindowCacheStatAccessor.java
deleted file mode 100644
index f8c4340..0000000
--- a/gerrit-patch-jgit/src/main/java/org/eclipse/jgit/internal/storage/file/WindowCacheStatAccessor.java
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (C) 2009 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 org.eclipse.jgit.internal.storage.file;
-
-// Hack to obtain visibility to package level methods only.
-// These aren't yet part of the public JGit API.
-
-public class WindowCacheStatAccessor {
-  public static int getOpenFiles() {
-    return WindowCache.getInstance().getOpenFiles();
-  }
-
-  public static long getOpenBytes() {
-    return WindowCache.getInstance().getOpenBytes();
-  }
-
-  private WindowCacheStatAccessor() {}
-}
diff --git a/gerrit-patch-jgit/src/main/java/org/eclipse/jgit/lib/ObjectIdSerialization.java b/gerrit-patch-jgit/src/main/java/org/eclipse/jgit/lib/ObjectIdSerialization.java
deleted file mode 100644
index c98da64..0000000
--- a/gerrit-patch-jgit/src/main/java/org/eclipse/jgit/lib/ObjectIdSerialization.java
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright (C) 2009 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 org.eclipse.jgit.lib;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import org.eclipse.jgit.util.IO;
-
-public class ObjectIdSerialization {
-  public static void writeCanBeNull(OutputStream out, AnyObjectId id) throws IOException {
-    if (id != null) {
-      out.write((byte) 1);
-      writeNotNull(out, id);
-    } else {
-      out.write((byte) 0);
-    }
-  }
-
-  public static void writeNotNull(OutputStream out, AnyObjectId id) throws IOException {
-    id.copyRawTo(out);
-  }
-
-  public static ObjectId readCanBeNull(InputStream in) throws IOException {
-    switch (in.read()) {
-      case 0:
-        return null;
-      case 1:
-        return readNotNull(in);
-      default:
-        throw new IOException("Invalid flag before ObjectId");
-    }
-  }
-
-  public static ObjectId readNotNull(InputStream in) throws IOException {
-    final byte[] b = new byte[20];
-    IO.readFully(in, b, 0, 20);
-    return ObjectId.fromRaw(b);
-  }
-
-  private ObjectIdSerialization() {}
-}
diff --git a/gerrit-pgm/BUILD b/gerrit-pgm/BUILD
deleted file mode 100644
index 71ea5bd..0000000
--- a/gerrit-pgm/BUILD
+++ /dev/null
@@ -1,183 +0,0 @@
-load("//tools/bzl:junit.bzl", "junit_tests")
-load("//tools/bzl:license.bzl", "license_test")
-
-SRCS = "src/main/java/com/google/gerrit/pgm/"
-
-RSRCS = "src/main/resources/com/google/gerrit/pgm/"
-
-INIT_API_SRCS = glob([SRCS + "init/api/*.java"])
-
-BASE_JETTY_DEPS = [
-    "//gerrit-common:annotations",
-    "//gerrit-common:server",
-    "//gerrit-extension-api:api",
-    "//gerrit-gwtexpui:linker_server",
-    "//gerrit-gwtexpui:server",
-    "//gerrit-httpd:httpd",
-    "//gerrit-server:server",
-    "//gerrit-sshd:sshd",
-    "//lib:guava",
-    "//lib/guice:guice",
-    "//lib/guice:guice-assistedinject",
-    "//lib/guice:guice-servlet",
-    "//lib/jgit/org.eclipse.jgit:jgit",
-    "//lib/joda:joda-time",
-    "//lib/log:api",
-    "//lib/log:log4j",
-]
-
-DEPS = BASE_JETTY_DEPS + [
-    "//gerrit-reviewdb:server",
-    "//gerrit-server:metrics",
-    "//gerrit-server:module",
-    "//gerrit-server:receive",
-    "//lib:gwtorm",
-    "//lib/log:jsonevent-layout",
-]
-
-java_library(
-    name = "init-api",
-    srcs = INIT_API_SRCS,
-    visibility = ["//visibility:public"],
-    deps = DEPS,
-)
-
-java_library(
-    name = "init",
-    srcs = glob([SRCS + "init/**/*.java"]),
-    resources = glob([RSRCS + "init/*"]),
-    visibility = ["//visibility:public"],
-    deps = DEPS + [
-        ":init-api",
-        ":util",
-        "//gerrit-index:index",
-        "//gerrit-elasticsearch:elasticsearch",
-        "//gerrit-launcher:launcher",  # We want this dep to be provided_deps
-        "//gerrit-lucene:lucene",
-        "//lib:args4j",
-        "//lib:derby",
-        "//lib:gwtjsonrpc",
-        "//lib:h2",
-        "//lib/commons:validator",
-        "//lib/mina:sshd",
-    ],
-)
-
-REST_UTIL_DEPS = [
-    "//gerrit-cache-h2:cache-h2",
-    "//gerrit-cache-mem:mem",
-    "//gerrit-util-cli:cli",
-    "//lib:args4j",
-    "//lib/commons:dbcp",
-]
-
-java_library(
-    name = "util",
-    visibility = ["//visibility:public"],
-    exports = [":util-nodep"],
-    runtime_deps = DEPS + REST_UTIL_DEPS,
-)
-
-java_library(
-    name = "util-nodep",
-    srcs = glob([SRCS + "util/*.java"]),
-    visibility = ["//visibility:public"],
-    deps = DEPS + REST_UTIL_DEPS,  #  We want all these deps to be provided_deps
-)
-
-JETTY_DEPS = [
-    "//lib/jetty:jmx",
-    "//lib/jetty:server",
-    "//lib/jetty:servlet",
-]
-
-java_library(
-    name = "http",
-    visibility = ["//visibility:public"],
-    exports = [":http-jetty"],
-    runtime_deps = DEPS + JETTY_DEPS,
-)
-
-java_library(
-    name = "http-jetty",
-    srcs = glob([SRCS + "http/jetty/*.java"]),
-    visibility = ["//visibility:public"],
-    deps = JETTY_DEPS + BASE_JETTY_DEPS + [
-        # We want all these deps to be provided_deps
-        "//gerrit-launcher:launcher",
-        "//gerrit-reviewdb:client",
-        "//lib:servlet-api-3_1",
-    ],
-)
-
-REST_PGM_DEPS = [
-    ":http",
-    ":init",
-    ":init-api",
-    ":util",
-    "//gerrit-cache-h2:cache-h2",
-    "//gerrit-cache-mem:mem",
-    "//gerrit-elasticsearch:elasticsearch",
-    "//gerrit-gpg:gpg",
-    "//gerrit-index:index",
-    "//gerrit-lucene:lucene",
-    "//gerrit-oauth:oauth",
-    "//gerrit-openid:openid",
-    "//lib:args4j",
-    "//lib:protobuf",
-    "//lib:servlet-api-3_1-without-neverlink",
-    "//lib/prolog:cafeteria",
-    "//lib/prolog:compiler",
-    "//lib/prolog:runtime",
-]
-
-java_library(
-    name = "pgm",
-    resources = glob([RSRCS + "*"]),
-    visibility = ["//visibility:public"],
-    runtime_deps = DEPS + REST_PGM_DEPS + [
-        ":daemon",
-    ],
-)
-
-# no transitive deps, used for gerrit-acceptance-framework
-java_library(
-    name = "daemon",
-    srcs = glob([
-        SRCS + "*.java",
-        SRCS + "rules/*.java",
-    ]),
-    resources = glob([RSRCS + "*"]),
-    visibility = ["//visibility:public"],
-    deps = DEPS + REST_PGM_DEPS + [
-        # We want all these deps to be provided_deps
-        "//gerrit-launcher:launcher",
-        "//lib/auto:auto-value",
-        "//lib/auto:auto-value-annotations",
-    ],
-)
-
-junit_tests(
-    name = "pgm_tests",
-    srcs = glob(["src/test/java/**/*.java"]),
-    deps = [
-        ":http-jetty",
-        ":init",
-        ":init-api",
-        ":pgm",
-        "//gerrit-common:server",
-        "//gerrit-server:server",
-        "//lib:guava",
-        "//lib:junit",
-        "//lib:truth",
-        "//lib/easymock",
-        "//lib/guice",
-        "//lib/jgit/org.eclipse.jgit:jgit",
-        "//lib/jgit/org.eclipse.jgit.junit:junit",
-    ],
-)
-
-license_test(
-    name = "pgm_license_test",
-    target = ":pgm",
-)
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Daemon.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Daemon.java
deleted file mode 100644
index 4dd54ad..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Daemon.java
+++ /dev/null
@@ -1,596 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.pgm;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.gerrit.common.Version.getVersion;
-import static com.google.gerrit.server.schema.DataSourceProvider.Context.MULTI_USER;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Joiner;
-import com.google.common.base.MoreObjects;
-import com.google.gerrit.audit.AuditModule;
-import com.google.gerrit.common.EventBroker;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.elasticsearch.ElasticIndexModule;
-import com.google.gerrit.extensions.client.AuthType;
-import com.google.gerrit.gpg.GpgModule;
-import com.google.gerrit.httpd.AllRequestFilter;
-import com.google.gerrit.httpd.GerritAuthModule;
-import com.google.gerrit.httpd.GetUserFilter;
-import com.google.gerrit.httpd.GitOverHttpModule;
-import com.google.gerrit.httpd.H2CacheBasedWebSession;
-import com.google.gerrit.httpd.HttpCanonicalWebUrlProvider;
-import com.google.gerrit.httpd.RequestContextFilter;
-import com.google.gerrit.httpd.RequestMetricsFilter;
-import com.google.gerrit.httpd.RequireSslFilter;
-import com.google.gerrit.httpd.WebModule;
-import com.google.gerrit.httpd.WebSshGlueModule;
-import com.google.gerrit.httpd.auth.oauth.OAuthModule;
-import com.google.gerrit.httpd.auth.openid.OpenIdModule;
-import com.google.gerrit.httpd.plugins.HttpPluginModule;
-import com.google.gerrit.httpd.raw.StaticModule;
-import com.google.gerrit.lifecycle.LifecycleManager;
-import com.google.gerrit.lucene.LuceneIndexModule;
-import com.google.gerrit.metrics.dropwizard.DropWizardMetricMaker;
-import com.google.gerrit.pgm.http.jetty.JettyEnv;
-import com.google.gerrit.pgm.http.jetty.JettyModule;
-import com.google.gerrit.pgm.http.jetty.ProjectQoSFilter;
-import com.google.gerrit.pgm.util.ErrorLogFile;
-import com.google.gerrit.pgm.util.LogFileCompressor;
-import com.google.gerrit.pgm.util.RuntimeShutdown;
-import com.google.gerrit.pgm.util.SiteProgram;
-import com.google.gerrit.server.LibModuleLoader;
-import com.google.gerrit.server.ModuleOverloader;
-import com.google.gerrit.server.StartupChecks;
-import com.google.gerrit.server.account.AccountDeactivator;
-import com.google.gerrit.server.account.InternalAccountDirectory;
-import com.google.gerrit.server.cache.h2.H2CacheModule;
-import com.google.gerrit.server.cache.mem.DefaultMemoryCacheModule;
-import com.google.gerrit.server.change.ChangeCleanupRunner;
-import com.google.gerrit.server.config.AuthConfig;
-import com.google.gerrit.server.config.AuthConfigModule;
-import com.google.gerrit.server.config.CanonicalWebUrlModule;
-import com.google.gerrit.server.config.CanonicalWebUrlProvider;
-import com.google.gerrit.server.config.DownloadConfig;
-import com.google.gerrit.server.config.GerritGlobalModule;
-import com.google.gerrit.server.config.GerritOptions;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.RestCacheAdminModule;
-import com.google.gerrit.server.events.StreamEventsApiListener;
-import com.google.gerrit.server.git.GarbageCollectionModule;
-import com.google.gerrit.server.git.SearchingChangeCacheImpl;
-import com.google.gerrit.server.git.WorkQueue;
-import com.google.gerrit.server.git.receive.ReceiveCommitsExecutorModule;
-import com.google.gerrit.server.index.DummyIndexModule;
-import com.google.gerrit.server.index.IndexModule;
-import com.google.gerrit.server.index.IndexModule.IndexType;
-import com.google.gerrit.server.index.OnlineUpgrader;
-import com.google.gerrit.server.index.VersionManager;
-import com.google.gerrit.server.mail.SignedTokenEmailTokenVerifier;
-import com.google.gerrit.server.mail.receive.MailReceiver;
-import com.google.gerrit.server.mail.send.SmtpEmailSender;
-import com.google.gerrit.server.mime.MimeUtil2Module;
-import com.google.gerrit.server.notedb.rebuild.NoteDbMigrator;
-import com.google.gerrit.server.notedb.rebuild.OnlineNoteDbMigrator;
-import com.google.gerrit.server.patch.DiffExecutorModule;
-import com.google.gerrit.server.plugins.PluginGuiceEnvironment;
-import com.google.gerrit.server.plugins.PluginModule;
-import com.google.gerrit.server.plugins.PluginRestApiModule;
-import com.google.gerrit.server.project.DefaultPermissionBackendModule;
-import com.google.gerrit.server.schema.DataSourceProvider;
-import com.google.gerrit.server.schema.InMemoryAccountPatchReviewStore;
-import com.google.gerrit.server.schema.JdbcAccountPatchReviewStore;
-import com.google.gerrit.server.schema.SchemaVersionCheck;
-import com.google.gerrit.server.securestore.DefaultSecureStore;
-import com.google.gerrit.server.securestore.SecureStore;
-import com.google.gerrit.server.securestore.SecureStoreClassName;
-import com.google.gerrit.server.securestore.SecureStoreProvider;
-import com.google.gerrit.server.ssh.NoSshKeyCache;
-import com.google.gerrit.server.ssh.NoSshModule;
-import com.google.gerrit.server.ssh.SshAddressesModule;
-import com.google.gerrit.sshd.SshHostKeyModule;
-import com.google.gerrit.sshd.SshKeyCacheImpl;
-import com.google.gerrit.sshd.SshModule;
-import com.google.gerrit.sshd.commands.DefaultCommandModule;
-import com.google.gerrit.sshd.commands.IndexCommandsModule;
-import com.google.gerrit.sshd.plugin.LfsPluginAuthCommand;
-import com.google.inject.AbstractModule;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import com.google.inject.Key;
-import com.google.inject.Module;
-import com.google.inject.Provider;
-import com.google.inject.Stage;
-import java.io.IOException;
-import java.lang.Thread.UncaughtExceptionHandler;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.List;
-import javax.servlet.http.HttpServletRequest;
-import org.eclipse.jgit.lib.Config;
-import org.kohsuke.args4j.Option;
-import org.kohsuke.args4j.spi.ExplicitBooleanOptionHandler;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Run SSH daemon portions of Gerrit. */
-public class Daemon extends SiteProgram {
-  private static final Logger log = LoggerFactory.getLogger(Daemon.class);
-
-  @Option(name = "--enable-httpd", usage = "Enable the internal HTTP daemon")
-  private Boolean httpd;
-
-  @Option(name = "--disable-httpd", usage = "Disable the internal HTTP daemon")
-  void setDisableHttpd(@SuppressWarnings("unused") boolean arg) {
-    httpd = false;
-  }
-
-  @Option(name = "--enable-sshd", usage = "Enable the internal SSH daemon")
-  private boolean sshd = true;
-
-  @Option(name = "--disable-sshd", usage = "Disable the internal SSH daemon")
-  void setDisableSshd(@SuppressWarnings("unused") boolean arg) {
-    sshd = false;
-  }
-
-  @Option(name = "--slave", usage = "Support fetch only")
-  private boolean slave;
-
-  @Option(name = "--console-log", usage = "Log to console (not $site_path/logs)")
-  private boolean consoleLog;
-
-  @Option(name = "-s", usage = "Start interactive shell")
-  private boolean inspector;
-
-  @Option(name = "--run-id", usage = "Cookie to store in $site_path/logs/gerrit.run")
-  private String runId;
-
-  @Option(name = "--headless", usage = "Don't start the UI frontend")
-  private boolean headless;
-
-  @Option(name = "--polygerrit-dev", usage = "Force PolyGerrit UI for development")
-  private boolean polyGerritDev;
-
-  @Option(
-      name = "--init",
-      aliases = {"-i"},
-      usage = "Init site before starting the daemon")
-  private boolean doInit;
-
-  @Option(name = "--stop-only", usage = "Stop the daemon", hidden = true)
-  private boolean stopOnly;
-
-  @Option(
-      name = "--migrate-to-note-db",
-      usage = "Automatically migrate changes to NoteDb",
-      handler = ExplicitBooleanOptionHandler.class)
-  private boolean migrateToNoteDb;
-
-  @Option(name = "--trial", usage = "(With --migrate-to-note-db) " + MigrateToNoteDb.TRIAL_USAGE)
-  private boolean trial;
-
-  private final LifecycleManager manager = new LifecycleManager();
-  private Injector dbInjector;
-  private Injector cfgInjector;
-  private Config config;
-  private Injector sysInjector;
-  private Injector sshInjector;
-  private Injector webInjector;
-  private Injector httpdInjector;
-  private Path runFile;
-  private boolean inMemoryTest;
-  private AbstractModule luceneModule;
-  private Module emailModule;
-  private Module testSysModule;
-
-  private Runnable serverStarted;
-  private IndexType indexType;
-
-  public Daemon() {}
-
-  @VisibleForTesting
-  public Daemon(Runnable serverStarted, Path sitePath) {
-    super(sitePath);
-    this.serverStarted = serverStarted;
-  }
-
-  @VisibleForTesting
-  public void setEnableSshd(boolean enable) {
-    sshd = enable;
-  }
-
-  @VisibleForTesting
-  public boolean getEnableSshd() {
-    return sshd;
-  }
-
-  public void setEnableHttpd(boolean enable) {
-    httpd = enable;
-  }
-
-  @Override
-  public int run() throws Exception {
-    if (stopOnly) {
-      RuntimeShutdown.manualShutdown();
-      return 0;
-    }
-    if (doInit) {
-      try {
-        new Init(getSitePath()).run();
-      } catch (Exception e) {
-        throw die("Init failed", e);
-      }
-    }
-    mustHaveValidSite();
-    Thread.setDefaultUncaughtExceptionHandler(
-        new UncaughtExceptionHandler() {
-          @Override
-          public void uncaughtException(Thread t, Throwable e) {
-            log.error("Thread " + t.getName() + " threw exception", e);
-          }
-        });
-
-    if (runId != null) {
-      runFile = getSitePath().resolve("logs").resolve("gerrit.run");
-    }
-
-    if (httpd == null) {
-      httpd = !slave;
-    }
-
-    if (!httpd && !sshd) {
-      throw die("No services enabled, nothing to do");
-    }
-
-    try {
-      start();
-      RuntimeShutdown.add(
-          () -> {
-            log.info("caught shutdown, cleaning up");
-            stop();
-          });
-
-      log.info("Gerrit Code Review " + myVersion() + " ready");
-      if (runId != null) {
-        try {
-          Files.write(runFile, (runId + "\n").getBytes(UTF_8));
-          runFile.toFile().setReadable(true, false);
-        } catch (IOException err) {
-          log.warn("Cannot write --run-id to " + runFile, err);
-        }
-      }
-
-      if (serverStarted != null) {
-        serverStarted.run();
-      }
-
-      if (inspector) {
-        JythonShell shell = new JythonShell();
-        shell.set("m", manager);
-        shell.set("ds", dbInjector.getInstance(DataSourceProvider.class));
-        shell.set("schk", dbInjector.getInstance(SchemaVersionCheck.class));
-        shell.set("d", this);
-        shell.run();
-      } else {
-        RuntimeShutdown.waitFor();
-      }
-      return 0;
-    } catch (Throwable err) {
-      log.error("Unable to start daemon", err);
-      return 1;
-    }
-  }
-
-  @VisibleForTesting
-  public LifecycleManager getLifecycleManager() {
-    return manager;
-  }
-
-  @VisibleForTesting
-  public void setDatabaseForTesting(List<Module> modules) {
-    dbInjector = Guice.createInjector(Stage.PRODUCTION, modules);
-    inMemoryTest = true;
-    headless = true;
-  }
-
-  @VisibleForTesting
-  public void setEmailModuleForTesting(Module module) {
-    emailModule = module;
-  }
-
-  @VisibleForTesting
-  public void setLuceneModule(LuceneIndexModule m) {
-    luceneModule = m;
-    inMemoryTest = true;
-  }
-
-  @VisibleForTesting
-  public void setAdditionalSysModuleForTesting(@Nullable Module m) {
-    testSysModule = m;
-  }
-
-  @VisibleForTesting
-  public void start() throws IOException {
-    if (dbInjector == null) {
-      dbInjector = createDbInjector(true /* enableMetrics */, MULTI_USER);
-    }
-    cfgInjector = createCfgInjector();
-    config = cfgInjector.getInstance(Key.get(Config.class, GerritServerConfig.class));
-    if (!slave) {
-      initIndexType();
-    }
-    sysInjector = createSysInjector();
-    sysInjector.getInstance(PluginGuiceEnvironment.class).setDbCfgInjector(dbInjector, cfgInjector);
-    manager.add(dbInjector, cfgInjector, sysInjector);
-
-    if (!consoleLog) {
-      manager.add(ErrorLogFile.start(getSitePath(), config));
-    }
-
-    sshd &= !sshdOff();
-    if (sshd) {
-      initSshd();
-    }
-
-    if (MoreObjects.firstNonNull(httpd, true)) {
-      initHttpd();
-    }
-
-    manager.start();
-  }
-
-  @VisibleForTesting
-  public void stop() {
-    if (runId != null) {
-      try {
-        Files.delete(runFile);
-      } catch (IOException err) {
-        log.warn("failed to delete " + runFile, err);
-      }
-    }
-    manager.stop();
-  }
-
-  private boolean sshdOff() {
-    return new SshAddressesModule().getListenAddresses(config).isEmpty();
-  }
-
-  private String myVersion() {
-    List<String> versionParts = new ArrayList<>();
-    if (slave) {
-      versionParts.add("[slave]");
-    }
-    if (headless) {
-      versionParts.add("[headless]");
-    }
-    versionParts.add(getVersion());
-    return Joiner.on(" ").join(versionParts);
-  }
-
-  private Injector createCfgInjector() {
-    final List<Module> modules = new ArrayList<>();
-    modules.add(new AuthConfigModule());
-    return dbInjector.createChildInjector(modules);
-  }
-
-  private Injector createSysInjector() {
-    final List<Module> modules = new ArrayList<>();
-    modules.add(SchemaVersionCheck.module());
-    modules.add(new DropWizardMetricMaker.RestModule());
-    modules.add(new LogFileCompressor.Module());
-
-    // Index module shutdown must happen before work queue shutdown, otherwise
-    // work queue can get stuck waiting on index futures that will never return.
-    modules.add(createIndexModule());
-
-    modules.add(new WorkQueue.Module());
-    modules.add(new StreamEventsApiListener.Module());
-    modules.add(new EventBroker.Module());
-    modules.add(
-        inMemoryTest
-            ? new InMemoryAccountPatchReviewStore.Module()
-            : new JdbcAccountPatchReviewStore.Module(config));
-    modules.add(new ReceiveCommitsExecutorModule());
-    modules.add(new DiffExecutorModule());
-    modules.add(new MimeUtil2Module());
-    modules.add(cfgInjector.getInstance(GerritGlobalModule.class));
-    modules.add(new SearchingChangeCacheImpl.Module(slave));
-    modules.add(new InternalAccountDirectory.Module());
-    modules.add(new DefaultPermissionBackendModule());
-    modules.add(new DefaultMemoryCacheModule());
-    modules.add(new H2CacheModule());
-    modules.add(cfgInjector.getInstance(MailReceiver.Module.class));
-    if (emailModule != null) {
-      modules.add(emailModule);
-    } else {
-      modules.add(new SmtpEmailSender.Module());
-    }
-    modules.add(new AuditModule());
-    modules.add(new SignedTokenEmailTokenVerifier.Module());
-    modules.add(new PluginModule());
-    if (!slave
-        && VersionManager.getOnlineUpgrade(config)
-        // Schema upgrade is handled by OnlineNoteDbMigrator in this case.
-        && !migrateToNoteDb()) {
-      modules.add(new OnlineUpgrader.Module());
-    }
-    modules.add(new PluginRestApiModule());
-    modules.add(new RestCacheAdminModule());
-    modules.add(new GpgModule(config));
-    modules.add(new StartupChecks.Module());
-    if (MoreObjects.firstNonNull(httpd, true)) {
-      modules.add(
-          new CanonicalWebUrlModule() {
-            @Override
-            protected Class<? extends Provider<String>> provider() {
-              return HttpCanonicalWebUrlProvider.class;
-            }
-          });
-    } else {
-      modules.add(
-          new CanonicalWebUrlModule() {
-            @Override
-            protected Class<? extends Provider<String>> provider() {
-              return CanonicalWebUrlProvider.class;
-            }
-          });
-    }
-    if (sshd) {
-      modules.add(SshKeyCacheImpl.module());
-    } else {
-      modules.add(NoSshKeyCache.module());
-    }
-    modules.add(
-        new AbstractModule() {
-          @Override
-          protected void configure() {
-            bind(GerritOptions.class)
-                .toInstance(new GerritOptions(config, headless, slave, polyGerritDev));
-            if (inMemoryTest) {
-              bind(String.class)
-                  .annotatedWith(SecureStoreClassName.class)
-                  .toInstance(DefaultSecureStore.class.getName());
-              bind(SecureStore.class).toProvider(SecureStoreProvider.class);
-            }
-          }
-        });
-    modules.add(new GarbageCollectionModule());
-    if (!slave) {
-      modules.add(new AccountDeactivator.Module());
-      modules.add(new ChangeCleanupRunner.Module());
-    }
-    modules.addAll(LibModuleLoader.loadModules(cfgInjector));
-    if (migrateToNoteDb()) {
-      modules.add(new OnlineNoteDbMigrator.Module(trial));
-    }
-    if (testSysModule != null) {
-      modules.add(testSysModule);
-    }
-    return cfgInjector.createChildInjector(
-        ModuleOverloader.override(modules, LibModuleLoader.loadModules(cfgInjector)));
-  }
-
-  private boolean migrateToNoteDb() {
-    return migrateToNoteDb || NoteDbMigrator.getAutoMigrate(checkNotNull(config));
-  }
-
-  private Module createIndexModule() {
-    if (slave) {
-      return new DummyIndexModule();
-    }
-    if (luceneModule != null) {
-      return luceneModule;
-    }
-    switch (indexType) {
-      case LUCENE:
-        return LuceneIndexModule.latestVersion();
-      case ELASTICSEARCH:
-        return ElasticIndexModule.latestVersion();
-      default:
-        throw new IllegalStateException("unsupported index.type = " + indexType);
-    }
-  }
-
-  private void initIndexType() {
-    indexType = IndexModule.getIndexType(cfgInjector);
-    switch (indexType) {
-      case LUCENE:
-      case ELASTICSEARCH:
-        break;
-      default:
-        throw new IllegalStateException("unsupported index.type = " + indexType);
-    }
-  }
-
-  private void initSshd() {
-    sshInjector = createSshInjector();
-    sysInjector.getInstance(PluginGuiceEnvironment.class).setSshInjector(sshInjector);
-    manager.add(sshInjector);
-  }
-
-  private Injector createSshInjector() {
-    final List<Module> modules = new ArrayList<>();
-    modules.add(sysInjector.getInstance(SshModule.class));
-    if (!inMemoryTest) {
-      modules.add(new SshHostKeyModule());
-    }
-    modules.add(
-        new DefaultCommandModule(
-            slave,
-            sysInjector.getInstance(DownloadConfig.class),
-            sysInjector.getInstance(LfsPluginAuthCommand.Module.class)));
-    if (!slave) {
-      modules.add(new IndexCommandsModule(sysInjector));
-    }
-    return sysInjector.createChildInjector(modules);
-  }
-
-  private void initHttpd() {
-    webInjector = createWebInjector();
-
-    sysInjector.getInstance(PluginGuiceEnvironment.class).setHttpInjector(webInjector);
-
-    sysInjector
-        .getInstance(HttpCanonicalWebUrlProvider.class)
-        .setHttpServletRequest(webInjector.getProvider(HttpServletRequest.class));
-
-    httpdInjector = createHttpdInjector();
-    manager.add(webInjector, httpdInjector);
-  }
-
-  private Injector createWebInjector() {
-    final List<Module> modules = new ArrayList<>();
-    if (sshd) {
-      modules.add(new ProjectQoSFilter.Module());
-    }
-    modules.add(RequestContextFilter.module());
-    modules.add(RequestMetricsFilter.module());
-    modules.add(H2CacheBasedWebSession.module());
-    modules.add(sysInjector.getInstance(GerritAuthModule.class));
-    modules.add(sysInjector.getInstance(GitOverHttpModule.class));
-    modules.add(AllRequestFilter.module());
-    modules.add(sysInjector.getInstance(WebModule.class));
-    modules.add(sysInjector.getInstance(RequireSslFilter.Module.class));
-    modules.add(new HttpPluginModule());
-    if (sshd) {
-      modules.add(sshInjector.getInstance(WebSshGlueModule.class));
-    } else {
-      modules.add(new NoSshModule());
-    }
-
-    AuthConfig authConfig = cfgInjector.getInstance(AuthConfig.class);
-    if (authConfig.getAuthType() == AuthType.OPENID
-        || authConfig.getAuthType() == AuthType.OPENID_SSO) {
-      modules.add(new OpenIdModule());
-    } else if (authConfig.getAuthType() == AuthType.OAUTH) {
-      modules.add(new OAuthModule());
-    }
-    modules.add(sysInjector.getInstance(GetUserFilter.Module.class));
-
-    // StaticModule contains a "/*" wildcard, place it last.
-    modules.add(sysInjector.getInstance(StaticModule.class));
-
-    return sysInjector.createChildInjector(modules);
-  }
-
-  private Injector createHttpdInjector() {
-    final List<Module> modules = new ArrayList<>();
-    modules.add(new JettyModule(new JettyEnv(webInjector)));
-    return webInjector.createChildInjector(modules);
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Init.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Init.java
deleted file mode 100644
index b9c7068..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Init.java
+++ /dev/null
@@ -1,255 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.pgm;
-
-import com.google.common.base.Joiner;
-import com.google.common.collect.Sets;
-import com.google.gerrit.common.IoUtil;
-import com.google.gerrit.common.PageLinks;
-import com.google.gerrit.common.PluginData;
-import com.google.gerrit.pgm.init.BaseInit;
-import com.google.gerrit.pgm.init.Browser;
-import com.google.gerrit.pgm.init.InitPlugins;
-import com.google.gerrit.pgm.init.api.ConsoleUI;
-import com.google.gerrit.pgm.util.ErrorLogFile;
-import com.google.gerrit.server.config.GerritServerConfigModule;
-import com.google.gerrit.server.config.SitePath;
-import com.google.gerrit.server.securestore.SecureStoreClassName;
-import com.google.gerrit.server.util.HostPlatform;
-import com.google.inject.AbstractModule;
-import com.google.inject.Guice;
-import com.google.inject.Inject;
-import com.google.inject.Module;
-import com.google.inject.util.Providers;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-import org.kohsuke.args4j.Option;
-
-/** Initialize a new Gerrit installation. */
-public class Init extends BaseInit {
-  @Option(
-      name = "--batch",
-      aliases = {"-b"},
-      usage = "Batch mode; skip interactive prompting")
-  private boolean batchMode;
-
-  @Option(name = "--delete-caches", usage = "Delete all persistent caches without asking")
-  private boolean deleteCaches;
-
-  @Option(name = "--no-auto-start", usage = "Don't automatically start daemon after init")
-  private boolean noAutoStart;
-
-  @Option(name = "--skip-plugins", usage = "Don't install plugins")
-  private boolean skipPlugins;
-
-  @Option(name = "--list-plugins", usage = "List available plugins")
-  private boolean listPlugins;
-
-  @Option(name = "--install-plugin", usage = "Install given plugin without asking")
-  private List<String> installPlugins;
-
-  @Option(name = "--install-all-plugins", usage = "Install all plugins from war without asking")
-  private boolean installAllPlugins;
-
-  @Option(
-      name = "--secure-store-lib",
-      usage = "Path to jar providing SecureStore implementation class")
-  private String secureStoreLib;
-
-  @Option(name = "--dev", usage = "Setup site with default options suitable for developers")
-  private boolean dev;
-
-  @Option(name = "--skip-all-downloads", usage = "Don't download libraries")
-  private boolean skipAllDownloads;
-
-  @Option(name = "--skip-download", usage = "Don't download given library")
-  private List<String> skippedDownloads;
-
-  @Inject Browser browser;
-
-  public Init() {
-    super(new WarDistribution(), null);
-  }
-
-  public Init(Path sitePath) {
-    super(sitePath, true, true, new WarDistribution(), null);
-    batchMode = true;
-    noAutoStart = true;
-  }
-
-  @Override
-  protected boolean beforeInit(SiteInit init) throws Exception {
-    ErrorLogFile.errorOnlyConsole();
-
-    if (!skipPlugins) {
-      final List<PluginData> plugins =
-          InitPlugins.listPluginsAndRemoveTempFiles(init.site, pluginsDistribution);
-      ConsoleUI ui = ConsoleUI.getInstance(false);
-      if (installAllPlugins && !nullOrEmpty(installPlugins)) {
-        ui.message("Cannot use --install-plugin together with --install-all-plugins.\n");
-        return true;
-      }
-      verifyInstallPluginList(ui, plugins);
-      if (listPlugins) {
-        if (!plugins.isEmpty()) {
-          ui.message("Available plugins:\n");
-          for (PluginData plugin : plugins) {
-            ui.message(" * %s version %s\n", plugin.name, plugin.version);
-          }
-        } else {
-          ui.message("No plugins found.\n");
-        }
-        return true;
-      }
-    }
-    return false;
-  }
-
-  @Override
-  protected void afterInit(SiteRun run) throws Exception {
-    List<Module> modules = new ArrayList<>();
-    modules.add(
-        new AbstractModule() {
-          @Override
-          protected void configure() {
-            bind(Path.class).annotatedWith(SitePath.class).toInstance(getSitePath());
-            bind(Browser.class);
-            bind(String.class)
-                .annotatedWith(SecureStoreClassName.class)
-                .toProvider(Providers.of(getConfiguredSecureStoreClass()));
-          }
-        });
-    modules.add(new GerritServerConfigModule());
-    Guice.createInjector(modules).injectMembers(this);
-    start(run);
-  }
-
-  @Override
-  protected List<String> getInstallPlugins() {
-    return installPlugins;
-  }
-
-  @Override
-  protected boolean installAllPlugins() {
-    return installAllPlugins;
-  }
-
-  @Override
-  protected ConsoleUI getConsoleUI() {
-    return ConsoleUI.getInstance(batchMode);
-  }
-
-  @Override
-  protected boolean getAutoStart() {
-    return !noAutoStart;
-  }
-
-  @Override
-  protected boolean getDeleteCaches() {
-    return deleteCaches;
-  }
-
-  @Override
-  protected boolean skipPlugins() {
-    return skipPlugins;
-  }
-
-  @Override
-  protected boolean isDev() {
-    return dev;
-  }
-
-  @Override
-  protected boolean skipAllDownloads() {
-    return skipAllDownloads;
-  }
-
-  @Override
-  protected List<String> getSkippedDownloads() {
-    return skippedDownloads != null ? skippedDownloads : Collections.<String>emptyList();
-  }
-
-  @Override
-  protected String getSecureStoreLib() {
-    return secureStoreLib;
-  }
-
-  void start(SiteRun run) throws Exception {
-    if (run.flags.autoStart) {
-      if (HostPlatform.isWin32()) {
-        System.err.println("Automatic startup not supported on Win32.");
-
-      } else {
-        startDaemon(run);
-        if (!run.ui.isBatch()) {
-          browser.open(PageLinks.ADMIN_PROJECTS);
-        }
-      }
-    }
-  }
-
-  void startDaemon(SiteRun run) {
-    String[] argv = {run.site.gerrit_sh.toAbsolutePath().toString(), "start"};
-    Process proc;
-    try {
-      System.err.println("Executing " + argv[0] + " " + argv[1]);
-      proc = Runtime.getRuntime().exec(argv);
-    } catch (IOException e) {
-      System.err.println("error: cannot start Gerrit: " + e.getMessage());
-      return;
-    }
-
-    try {
-      proc.getOutputStream().close();
-    } catch (IOException e) {
-      // Ignored
-    }
-
-    IoUtil.copyWithThread(proc.getInputStream(), System.err);
-    IoUtil.copyWithThread(proc.getErrorStream(), System.err);
-
-    for (; ; ) {
-      try {
-        int rc = proc.waitFor();
-        if (rc != 0) {
-          System.err.println("error: cannot start Gerrit: exit status " + rc);
-        }
-        break;
-      } catch (InterruptedException e) {
-        // retry
-      }
-    }
-  }
-
-  private void verifyInstallPluginList(ConsoleUI ui, List<PluginData> plugins) {
-    if (nullOrEmpty(installPlugins) || nullOrEmpty(plugins)) {
-      return;
-    }
-    Set<String> missing = Sets.newHashSet(installPlugins);
-    plugins.stream().forEach(p -> missing.remove(p.name));
-    if (!missing.isEmpty()) {
-      ui.message("Cannot find plugin(s): %s\n", Joiner.on(", ").join(missing));
-      listPlugins = true;
-    }
-  }
-
-  private static boolean nullOrEmpty(List<?> list) {
-    return list == null || list.isEmpty();
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/JythonShell.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/JythonShell.java
deleted file mode 100644
index e1a7bd4..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/JythonShell.java
+++ /dev/null
@@ -1,231 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.pgm;
-
-import com.google.gerrit.launcher.GerritLauncher;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.ArrayList;
-import java.util.Properties;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class JythonShell {
-  private static final Logger log = LoggerFactory.getLogger(JythonShell.class);
-  private static final String STARTUP_RESOURCE = "com/google/gerrit/pgm/Startup.py";
-  private static final String STARTUP_FILE = "Startup.py";
-
-  private Class<?> console;
-  private Class<?> pyObject;
-  private Class<?> pySystemState;
-  private Object shell;
-  private ArrayList<String> injectedVariables;
-
-  public JythonShell() {
-    Properties env = new Properties();
-    // Let us inspect private class members
-    env.setProperty("python.security.respectJavaAccessibility", "false");
-
-    File home = GerritLauncher.getHomeDirectory();
-    if (home != null) {
-      env.setProperty("python.cachedir", new File(home, "jythoncache").getPath());
-    }
-
-    // For package introspection and "import com.google" to work,
-    // Jython needs to inspect actual .jar files (not just classloader)
-    StringBuilder classPath = new StringBuilder();
-    final ClassLoader cl = getClass().getClassLoader();
-    if (cl instanceof java.net.URLClassLoader) {
-      @SuppressWarnings("resource")
-      URLClassLoader ucl = (URLClassLoader) cl;
-      for (URL u : ucl.getURLs()) {
-        if ("file".equals(u.getProtocol())) {
-          if (classPath.length() > 0) {
-            classPath.append(java.io.File.pathSeparatorChar);
-          }
-          classPath.append(u.getFile());
-        }
-      }
-    }
-    env.setProperty("java.class.path", classPath.toString());
-
-    console = findClass("org.python.util.InteractiveConsole");
-    pyObject = findClass("org.python.core.PyObject");
-    pySystemState = findClass("org.python.core.PySystemState");
-
-    runMethod(
-        pySystemState,
-        pySystemState,
-        "initialize",
-        new Class<?>[] {Properties.class, Properties.class},
-        new Object[] {null, env});
-
-    try {
-      shell = console.getConstructor(new Class<?>[] {}).newInstance();
-      log.info("Jython shell instance created.");
-    } catch (InstantiationException
-        | IllegalAccessException
-        | IllegalArgumentException
-        | InvocationTargetException
-        | NoSuchMethodException
-        | SecurityException e) {
-      throw noInterpreter(e);
-    }
-    injectedVariables = new ArrayList<>();
-    set("Shell", this);
-  }
-
-  protected Object runMethod0(
-      Class<?> klazz, Object instance, String name, Class<?>[] sig, Object[] args)
-      throws InvocationTargetException {
-    try {
-      Method m;
-      m = klazz.getMethod(name, sig);
-      return m.invoke(instance, args);
-    } catch (NoSuchMethodException
-        | IllegalAccessException
-        | IllegalArgumentException
-        | SecurityException e) {
-      throw cannotStart(e);
-    }
-  }
-
-  protected Object runMethod(
-      Class<?> klazz, Object instance, String name, Class<?>[] sig, Object[] args) {
-    try {
-      return runMethod0(klazz, instance, name, sig, args);
-    } catch (InvocationTargetException e) {
-      throw cannotStart(e);
-    }
-  }
-
-  protected Object runInterpreter(String name, Class<?>[] sig, Object[] args) {
-    return runMethod(console, shell, name, sig, args);
-  }
-
-  protected String getDefaultBanner() {
-    return (String) runInterpreter("getDefaultBanner", new Class<?>[] {}, new Object[] {});
-  }
-
-  protected void printInjectedVariable(String id) {
-    runInterpreter(
-        "exec",
-        new Class<?>[] {String.class},
-        new Object[] {"print '\"%s\" is \"%s\"' % (\"" + id + "\", " + id + ")"});
-  }
-
-  public void run() {
-    for (String key : injectedVariables) {
-      printInjectedVariable(key);
-    }
-    reload();
-    runInterpreter(
-        "interact",
-        new Class<?>[] {String.class, pyObject},
-        new Object[] {
-          getDefaultBanner()
-              + " running for Gerrit "
-              + com.google.gerrit.common.Version.getVersion(),
-          null,
-        });
-  }
-
-  public void set(String key, Object content) {
-    runInterpreter("set", new Class<?>[] {String.class, Object.class}, new Object[] {key, content});
-    injectedVariables.add(key);
-  }
-
-  private static Class<?> findClass(String klazzname) {
-    try {
-      return Class.forName(klazzname);
-    } catch (ClassNotFoundException e) {
-      throw noShell("Class " + klazzname + " not found", e);
-    }
-  }
-
-  public void reload() {
-    execResource(STARTUP_RESOURCE);
-    execFile(GerritLauncher.getHomeDirectory(), STARTUP_FILE);
-  }
-
-  protected void execResource(String p) {
-    try (InputStream in = JythonShell.class.getClassLoader().getResourceAsStream(p)) {
-      if (in != null) {
-        execStream(in, "resource " + p);
-      } else {
-        log.error("Cannot load resource " + p);
-      }
-    } catch (IOException e) {
-      log.error(e.getMessage(), e);
-    }
-  }
-
-  protected void execFile(File parent, String p) {
-    try {
-      File script = new File(parent, p);
-      if (script.canExecute()) {
-        runMethod0(
-            console,
-            shell,
-            "execfile",
-            new Class<?>[] {String.class},
-            new Object[] {script.getAbsolutePath()});
-      } else {
-        log.info(
-            "User initialization file "
-                + script.getAbsolutePath()
-                + " is not found or not executable");
-      }
-    } catch (InvocationTargetException e) {
-      log.error("Exception occurred while loading file " + p + " : ", e);
-    } catch (SecurityException e) {
-      log.error("SecurityException occurred while loading file " + p + " : ", e);
-    }
-  }
-
-  protected void execStream(InputStream in, String p) {
-    try {
-      runMethod0(
-          console,
-          shell,
-          "execfile",
-          new Class<?>[] {InputStream.class, String.class},
-          new Object[] {in, p});
-    } catch (InvocationTargetException e) {
-      log.error("Exception occurred while loading " + p + " : ", e);
-    }
-  }
-
-  private static UnsupportedOperationException noShell(String m, Throwable why) {
-    final String prefix = "Cannot create Jython shell: ";
-    final String postfix = "\n     (You might need to install jython.jar in the lib directory)";
-    return new UnsupportedOperationException(prefix + m + postfix, why);
-  }
-
-  private static UnsupportedOperationException noInterpreter(Throwable why) {
-    final String msg = "Cannot create Python interpreter";
-    return noShell(msg, why);
-  }
-
-  private static UnsupportedOperationException cannotStart(Throwable why) {
-    final String msg = "Cannot start Jython shell";
-    return new UnsupportedOperationException(msg, why);
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/LocalUsernamesToLowerCase.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/LocalUsernamesToLowerCase.java
deleted file mode 100644
index f693f30..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/LocalUsernamesToLowerCase.java
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.pgm;
-
-import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_GERRIT;
-import static com.google.gerrit.server.schema.DataSourceProvider.Context.MULTI_USER;
-
-import com.google.gerrit.extensions.config.FactoryModule;
-import com.google.gerrit.lifecycle.LifecycleManager;
-import com.google.gerrit.pgm.util.SiteProgram;
-import com.google.gerrit.server.account.externalids.DisabledExternalIdCache;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.account.externalids.ExternalIds;
-import com.google.gerrit.server.account.externalids.ExternalIdsBatchUpdate;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.index.account.AccountSchemaDefinitions;
-import com.google.gerrit.server.schema.SchemaVersionCheck;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import java.util.Collection;
-import java.util.Locale;
-import org.eclipse.jgit.lib.ProgressMonitor;
-import org.eclipse.jgit.lib.TextProgressMonitor;
-
-/** Converts the local username for all accounts to lower case */
-public class LocalUsernamesToLowerCase extends SiteProgram {
-  private final LifecycleManager manager = new LifecycleManager();
-  private final TextProgressMonitor monitor = new TextProgressMonitor();
-
-  @Inject private ExternalIds externalIds;
-
-  @Inject private ExternalIdsBatchUpdate externalIdsBatchUpdate;
-
-  @Override
-  public int run() throws Exception {
-    Injector dbInjector = createDbInjector(MULTI_USER);
-    manager.add(dbInjector, dbInjector.createChildInjector(SchemaVersionCheck.module()));
-    manager.start();
-    dbInjector
-        .createChildInjector(
-            new FactoryModule() {
-              @Override
-              protected void configure() {
-                bind(GitReferenceUpdated.class).toInstance(GitReferenceUpdated.DISABLED);
-
-                // The LocalUsernamesToLowerCase program needs to access all external IDs only
-                // once to update them. After the update they are not accessed again. Hence the
-                // LocalUsernamesToLowerCase program doesn't benefit from caching external IDs and
-                // the external ID cache can be disabled.
-                install(DisabledExternalIdCache.module());
-              }
-            })
-        .injectMembers(this);
-
-    Collection<ExternalId> todo = externalIds.all();
-    monitor.beginTask("Converting local usernames", todo.size());
-
-    for (ExternalId extId : todo) {
-      convertLocalUserToLowerCase(extId);
-      monitor.update(1);
-    }
-
-    externalIdsBatchUpdate.commit("Convert local usernames to lower case");
-    monitor.endTask();
-
-    int exitCode = reindexAccounts();
-    manager.stop();
-    return exitCode;
-  }
-
-  private void convertLocalUserToLowerCase(ExternalId extId) {
-    if (extId.isScheme(SCHEME_GERRIT)) {
-      String localUser = extId.key().id();
-      String localUserLowerCase = localUser.toLowerCase(Locale.US);
-      if (!localUser.equals(localUserLowerCase)) {
-        ExternalId extIdLowerCase =
-            ExternalId.create(
-                SCHEME_GERRIT,
-                localUserLowerCase,
-                extId.accountId(),
-                extId.email(),
-                extId.password());
-        externalIdsBatchUpdate.replace(extId, extIdLowerCase);
-      }
-    }
-  }
-
-  private int reindexAccounts() throws Exception {
-    monitor.beginTask("Reindex accounts", ProgressMonitor.UNKNOWN);
-    String[] reindexArgs = {
-      "--site-path", getSitePath().toString(), "--index", AccountSchemaDefinitions.NAME
-    };
-    System.out.println("Migration complete, reindexing accounts with:");
-    System.out.println("  reindex " + String.join(" ", reindexArgs));
-    Reindex reindexPgm = new Reindex();
-    int exitCode = reindexPgm.main(reindexArgs);
-    monitor.endTask();
-    return exitCode;
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/MigrateToNoteDb.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/MigrateToNoteDb.java
deleted file mode 100644
index a707c33..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/MigrateToNoteDb.java
+++ /dev/null
@@ -1,224 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.pgm;
-
-import static com.google.common.base.MoreObjects.firstNonNull;
-import static com.google.gerrit.server.schema.DataSourceProvider.Context.MULTI_USER;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.stream.Collectors.joining;
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.extensions.config.FactoryModule;
-import com.google.gerrit.lifecycle.LifecycleManager;
-import com.google.gerrit.pgm.util.BatchProgramModule;
-import com.google.gerrit.pgm.util.RuntimeShutdown;
-import com.google.gerrit.pgm.util.SiteProgram;
-import com.google.gerrit.pgm.util.ThreadLimiter;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.change.ChangeResource;
-import com.google.gerrit.server.git.GarbageCollection;
-import com.google.gerrit.server.index.DummyIndexModule;
-import com.google.gerrit.server.index.change.ChangeSchemaDefinitions;
-import com.google.gerrit.server.notedb.rebuild.GcAllUsers;
-import com.google.gerrit.server.notedb.rebuild.NoteDbMigrator;
-import com.google.gerrit.server.schema.DataSourceType;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.Provider;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.List;
-import org.kohsuke.args4j.Option;
-import org.kohsuke.args4j.spi.ExplicitBooleanOptionHandler;
-
-public class MigrateToNoteDb extends SiteProgram {
-  static final String TRIAL_USAGE =
-      "Trial mode: migrate changes and turn on reading from NoteDb, but leave ReviewDb as the"
-          + " source of truth";
-
-  private static final int ISSUE_8022_THREAD_LIMIT = 4;
-
-  @Option(name = "--threads", usage = "Number of threads to use for rebuilding NoteDb")
-  private Integer threads;
-
-  @Option(
-      name = "--project",
-      usage =
-          "Only rebuild these projects, do no other migration; incompatible with --change"
-              + " and --skip-project; recommended for debugging only")
-  private List<String> projects = new ArrayList<>();
-
-  @Option(
-      name = "--skip-project",
-      usage = "Rebuild all projects except these; incompatible with the --project and --change")
-  private List<String> skipProjects = new ArrayList<>();
-
-  @Option(
-      name = "--change",
-      usage =
-          "Only rebuild these changes, do no other migration; incompatible with --project and"
-              + " --skip-project; recommended for debugging only")
-  private List<Integer> changes = new ArrayList<>();
-
-  @Option(
-      name = "--force",
-      usage =
-          "Force rebuilding changes where ReviewDb is still the source of truth, even if they"
-              + " were previously migrated")
-  private boolean force;
-
-  @Option(name = "--trial", usage = TRIAL_USAGE)
-  private boolean trial;
-
-  @Option(
-      name = "--sequence-gap",
-      usage =
-          "gap in change sequence numbers between last ReviewDb number and first NoteDb number;"
-              + " negative indicates using the value of noteDb.changes.initialSequenceGap (default"
-              + " 1000)")
-  private int sequenceGap;
-
-  @Option(
-      name = "--reindex",
-      usage =
-          "Reindex all changes after migration; defaults to false in trial mode, true otherwise",
-      handler = ExplicitBooleanOptionHandler.class)
-  private Boolean reindex;
-
-  private Injector dbInjector;
-  private Injector sysInjector;
-  private LifecycleManager dbManager;
-  private LifecycleManager sysManager;
-
-  @Inject private GcAllUsers gcAllUsers;
-  @Inject private Provider<NoteDbMigrator.Builder> migratorBuilderProvider;
-
-  @Override
-  public int run() throws Exception {
-    RuntimeShutdown.add(this::stop);
-    try {
-      mustHaveValidSite();
-      dbInjector = createDbInjector(MULTI_USER);
-
-      dbManager = new LifecycleManager();
-      dbManager.add(dbInjector);
-      dbManager.start();
-
-      threads = limitThreads();
-
-      sysInjector = createSysInjector();
-      sysInjector.injectMembers(this);
-      sysManager = new LifecycleManager();
-      sysManager.add(sysInjector);
-      sysManager.start();
-
-      try (NoteDbMigrator migrator =
-          migratorBuilderProvider
-              .get()
-              .setThreads(threads)
-              .setProgressOut(System.err)
-              .setProjects(projects.stream().map(Project.NameKey::new).collect(toList()))
-              .setSkipProjects(skipProjects.stream().map(Project.NameKey::new).collect(toList()))
-              .setChanges(changes.stream().map(Change.Id::new).collect(toList()))
-              .setTrialMode(trial)
-              .setForceRebuild(force)
-              .setSequenceGap(sequenceGap)
-              .build()) {
-        if (!projects.isEmpty() || !changes.isEmpty() || !skipProjects.isEmpty()) {
-          migrator.rebuild();
-        } else {
-          migrator.migrate();
-        }
-      }
-      try (PrintWriter w = new PrintWriter(new OutputStreamWriter(System.out, UTF_8), true)) {
-        gcAllUsers.run(w);
-      }
-    } finally {
-      stop();
-    }
-
-    boolean reindex = firstNonNull(this.reindex, !trial);
-    if (!reindex) {
-      return 0;
-    }
-    // Reindex all indices, to save the user from having to run yet another program by hand while
-    // their server is offline.
-    List<String> reindexArgs =
-        ImmutableList.of(
-            "--site-path",
-            getSitePath().toString(),
-            "--threads",
-            Integer.toString(threads),
-            "--index",
-            ChangeSchemaDefinitions.NAME);
-    System.out.println("Migration complete, reindexing changes with:");
-    System.out.println("  reindex " + reindexArgs.stream().collect(joining(" ")));
-    Reindex reindexPgm = new Reindex();
-    return reindexPgm.main(reindexArgs.stream().toArray(String[]::new));
-  }
-
-  private int limitThreads() {
-    if (threads != null) {
-      return threads;
-    }
-    int actualThreads;
-    int procs = Runtime.getRuntime().availableProcessors();
-    DataSourceType dsType = dbInjector.getInstance(DataSourceType.class);
-    if (dsType.getDriver().equals("org.h2.Driver") && procs > ISSUE_8022_THREAD_LIMIT) {
-      System.out.println(
-          "Not using more than "
-              + ISSUE_8022_THREAD_LIMIT
-              + " threads due to http://crbug.com/gerrit/8022");
-      System.out.println("Can be increased by passing --threads, but may cause errors");
-      actualThreads = ISSUE_8022_THREAD_LIMIT;
-    } else {
-      actualThreads = procs;
-    }
-    actualThreads = ThreadLimiter.limitThreads(dbInjector, actualThreads);
-    return actualThreads;
-  }
-
-  private Injector createSysInjector() {
-    return dbInjector.createChildInjector(
-        new FactoryModule() {
-          @Override
-          public void configure() {
-            install(dbInjector.getInstance(BatchProgramModule.class));
-            install(new DummyIndexModule());
-            factory(ChangeResource.Factory.class);
-            factory(GarbageCollection.Factory.class);
-          }
-        });
-  }
-
-  private void stop() {
-    try {
-      LifecycleManager m = sysManager;
-      sysManager = null;
-      if (m != null) {
-        m.stop();
-      }
-    } finally {
-      LifecycleManager m = dbManager;
-      dbManager = null;
-      if (m != null) {
-        m.stop();
-      }
-    }
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Passwd.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Passwd.java
deleted file mode 100644
index 457cae3..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Passwd.java
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.pgm;
-
-import com.google.gerrit.extensions.config.FactoryModule;
-import com.google.gerrit.pgm.init.api.ConsoleUI;
-import com.google.gerrit.pgm.init.api.InstallAllPlugins;
-import com.google.gerrit.pgm.init.api.InstallPlugins;
-import com.google.gerrit.pgm.init.api.Section;
-import com.google.gerrit.pgm.util.SiteProgram;
-import com.google.gerrit.server.config.GerritServerConfigModule;
-import com.google.gerrit.server.config.SitePath;
-import com.google.gerrit.server.securestore.SecureStoreClassName;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import com.google.inject.Module;
-import com.google.inject.TypeLiteral;
-import com.google.inject.util.Providers;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.List;
-import org.kohsuke.args4j.Argument;
-
-public class Passwd extends SiteProgram {
-  private String section;
-  private String key;
-
-  @Argument(
-      metaVar = "SECTION.KEY",
-      index = 0,
-      required = true,
-      usage = "Section and key separated by a dot of the password to set")
-  private String sectionAndKey;
-
-  @Argument(metaVar = "PASSWORD", index = 1, required = false, usage = "Password to set")
-  private String password;
-
-  private void init() {
-    String[] varParts = sectionAndKey.split("\\.");
-    if (varParts.length != 2) {
-      throw new IllegalArgumentException(
-          "Invalid name '" + sectionAndKey + "': expected section.key format");
-    }
-    section = varParts[0];
-    key = varParts[1];
-  }
-
-  @Override
-  public int run() throws Exception {
-    init();
-    SetPasswd setPasswd = getSysInjector().getInstance(SetPasswd.class);
-    setPasswd.run(section, key, password);
-    return 0;
-  }
-
-  private Injector getSysInjector() {
-    List<Module> modules = new ArrayList<>();
-    modules.add(
-        new FactoryModule() {
-          @Override
-          protected void configure() {
-            bind(Path.class).annotatedWith(SitePath.class).toInstance(getSitePath());
-            bind(ConsoleUI.class).toInstance(ConsoleUI.getInstance(password != null));
-            factory(Section.Factory.class);
-            bind(Boolean.class).annotatedWith(InstallAllPlugins.class).toInstance(Boolean.FALSE);
-            bind(new TypeLiteral<List<String>>() {})
-                .annotatedWith(InstallPlugins.class)
-                .toInstance(new ArrayList<String>());
-            bind(String.class)
-                .annotatedWith(SecureStoreClassName.class)
-                .toProvider(Providers.of(getConfiguredSecureStoreClass()));
-          }
-        });
-    modules.add(new GerritServerConfigModule());
-    return Guice.createInjector(modules);
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/ProtoGen.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/ProtoGen.java
deleted file mode 100644
index 4fe6cf6..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/ProtoGen.java
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.pgm;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.gerrit.pgm.util.AbstractProgram;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gwtorm.schema.java.JavaSchemaModel;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.nio.ByteBuffer;
-import org.eclipse.jgit.internal.storage.file.LockFile;
-import org.eclipse.jgit.util.IO;
-import org.kohsuke.args4j.Option;
-
-public class ProtoGen extends AbstractProgram {
-  @Option(
-      name = "--output",
-      aliases = {"-o"},
-      required = true,
-      metaVar = "FILE",
-      usage = "File to write .proto into")
-  private File file;
-
-  @Override
-  public int run() throws Exception {
-    LockFile lock = new LockFile(file.getAbsoluteFile());
-    if (!lock.lock()) {
-      throw die("Cannot lock " + file);
-    }
-    try {
-      JavaSchemaModel jsm = new JavaSchemaModel(ReviewDb.class);
-      try (OutputStream o = lock.getOutputStream();
-          PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(o, UTF_8)))) {
-        String header;
-        try (InputStream in = getClass().getResourceAsStream("ProtoGenHeader.txt")) {
-          ByteBuffer buf = IO.readWholeStream(in, 1024);
-          int ptr = buf.arrayOffset() + buf.position();
-          int len = buf.remaining();
-          header = new String(buf.array(), ptr, len, UTF_8);
-        }
-
-        String version = com.google.gerrit.common.Version.getVersion();
-        out.write(header.replace("@@VERSION@@", version));
-        jsm.generateProto(out);
-        out.flush();
-      }
-      if (!lock.commit()) {
-        throw die("Could not write to " + file);
-      }
-    } finally {
-      lock.unlock();
-    }
-    System.out.println("Created " + file.getPath());
-    return 0;
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/ProtobufImport.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/ProtobufImport.java
deleted file mode 100644
index 0732b28..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/ProtobufImport.java
+++ /dev/null
@@ -1,148 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.pgm;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.gerrit.server.schema.DataSourceProvider.Context.SINGLE_USER;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.lifecycle.LifecycleManager;
-import com.google.gerrit.pgm.util.RuntimeShutdown;
-import com.google.gerrit.pgm.util.SiteProgram;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gwtorm.protobuf.CodecFactory;
-import com.google.gwtorm.protobuf.ProtobufCodec;
-import com.google.gwtorm.schema.RelationModel;
-import com.google.gwtorm.schema.java.JavaSchemaModel;
-import com.google.gwtorm.server.Access;
-import com.google.gwtorm.server.OrmDuplicateKeyException;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.protobuf.ByteString;
-import com.google.protobuf.Parser;
-import com.google.protobuf.UnknownFieldSet;
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.InputStream;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.nio.file.Files;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.eclipse.jgit.lib.ProgressMonitor;
-import org.eclipse.jgit.lib.TextProgressMonitor;
-import org.kohsuke.args4j.Option;
-
-/**
- * Import data from a protocol buffer dump into the database.
- *
- * <p>Takes as input a file containing protocol buffers concatenated together with varint length
- * encoding, as in {@link Parser#parseDelimitedFrom(InputStream)}. Each message contains a single
- * field with a tag corresponding to the relation ID in the {@link
- * com.google.gwtorm.server.Relation} annotation.
- *
- * <p><strong>Warning</strong>: This method blindly upserts data into the database. It should only
- * be used to restore a protobuf-formatted backup into a new, empty site.
- */
-public class ProtobufImport extends SiteProgram {
-  @Option(
-      name = "--file",
-      aliases = {"-f"},
-      required = true,
-      metaVar = "FILE",
-      usage = "File to import from")
-  private File file;
-
-  private final LifecycleManager manager = new LifecycleManager();
-  private final Map<Integer, Relation> relations = new HashMap<>();
-
-  @Inject private SchemaFactory<ReviewDb> schemaFactory;
-
-  @Override
-  public int run() throws Exception {
-    mustHaveValidSite();
-
-    Injector dbInjector = createDbInjector(SINGLE_USER);
-    manager.add(dbInjector);
-    manager.start();
-    RuntimeShutdown.add(manager::stop);
-    dbInjector.injectMembers(this);
-
-    ProgressMonitor progress = new TextProgressMonitor();
-    progress.beginTask("Importing entities", ProgressMonitor.UNKNOWN);
-    try (ReviewDb db = schemaFactory.open()) {
-      for (RelationModel model : new JavaSchemaModel(ReviewDb.class).getRelations()) {
-        relations.put(model.getRelationID(), Relation.create(model, db));
-      }
-
-      Parser<UnknownFieldSet> parser = UnknownFieldSet.getDefaultInstance().getParserForType();
-      try (InputStream in = new BufferedInputStream(Files.newInputStream(file.toPath()))) {
-        UnknownFieldSet msg;
-        while ((msg = parser.parseDelimitedFrom(in)) != null) {
-          Map.Entry<Integer, UnknownFieldSet.Field> e =
-              Iterables.getOnlyElement(msg.asMap().entrySet());
-          Relation rel =
-              checkNotNull(
-                  relations.get(e.getKey()),
-                  "unknown relation ID %s in message: %s",
-                  e.getKey(),
-                  msg);
-          List<ByteString> values = e.getValue().getLengthDelimitedList();
-          checkState(values.size() == 1, "expected one string field in message: %s", msg);
-          upsert(rel, values.get(0));
-          progress.update(1);
-        }
-      }
-      progress.endTask();
-    }
-
-    return 0;
-  }
-
-  @SuppressWarnings({"rawtypes", "unchecked"})
-  private static void upsert(Relation rel, ByteString s) throws OrmException {
-    Collection ents = Collections.singleton(rel.codec().decode(s));
-    try {
-      // Not all relations support update; fall back manually.
-      rel.access().insert(ents);
-    } catch (OrmDuplicateKeyException e) {
-      rel.access().delete(ents);
-      rel.access().insert(ents);
-    }
-  }
-
-  @AutoValue
-  abstract static class Relation {
-    private static Relation create(RelationModel model, ReviewDb db)
-        throws IllegalAccessException, InvocationTargetException, NoSuchMethodException,
-            ClassNotFoundException {
-      Method m = db.getClass().getMethod(model.getMethodName());
-      Class<?> clazz = Class.forName(model.getEntityTypeClassName());
-      return new AutoValue_ProtobufImport_Relation(
-          (Access<?, ?>) m.invoke(db), CodecFactory.encoder(clazz));
-    }
-
-    abstract Access<?, ?> access();
-
-    abstract ProtobufCodec<?> codec();
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Reindex.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Reindex.java
deleted file mode 100644
index cdaaf17..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Reindex.java
+++ /dev/null
@@ -1,212 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.pgm;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.gerrit.server.schema.DataSourceProvider.Context.MULTI_USER;
-import static java.util.stream.Collectors.toSet;
-
-import com.google.common.collect.Sets;
-import com.google.gerrit.common.Die;
-import com.google.gerrit.elasticsearch.ElasticIndexModule;
-import com.google.gerrit.extensions.config.FactoryModule;
-import com.google.gerrit.index.Index;
-import com.google.gerrit.index.IndexDefinition;
-import com.google.gerrit.index.SiteIndexer;
-import com.google.gerrit.lifecycle.LifecycleManager;
-import com.google.gerrit.lucene.LuceneIndexModule;
-import com.google.gerrit.pgm.util.BatchProgramModule;
-import com.google.gerrit.pgm.util.SiteProgram;
-import com.google.gerrit.pgm.util.ThreadLimiter;
-import com.google.gerrit.server.change.ChangeResource;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.index.IndexModule;
-import com.google.gerrit.server.index.IndexModule.IndexType;
-import com.google.gerrit.server.index.change.ChangeSchemaDefinitions;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.Key;
-import com.google.inject.Module;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.concurrent.TimeUnit;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.util.io.NullOutputStream;
-import org.kohsuke.args4j.Option;
-
-public class Reindex extends SiteProgram {
-  @Option(name = "--threads", usage = "Number of threads to use for indexing")
-  private int threads = Runtime.getRuntime().availableProcessors();
-
-  @Option(
-      name = "--changes-schema-version",
-      usage = "Schema version to reindex, for changes; default is most recent version")
-  private Integer changesVersion;
-
-  @Option(name = "--verbose", usage = "Output debug information for each change")
-  private boolean verbose;
-
-  @Option(name = "--list", usage = "List supported indices and exit")
-  private boolean list;
-
-  @Option(name = "--index", usage = "Only reindex specified indices")
-  private List<String> indices = new ArrayList<>();
-
-  private Injector dbInjector;
-  private Injector sysInjector;
-  private Config globalConfig;
-
-  @Inject private Collection<IndexDefinition<?, ?, ?>> indexDefs;
-
-  @Override
-  public int run() throws Exception {
-    mustHaveValidSite();
-    dbInjector = createDbInjector(MULTI_USER);
-    globalConfig = dbInjector.getInstance(Key.get(Config.class, GerritServerConfig.class));
-    threads = ThreadLimiter.limitThreads(dbInjector, threads);
-    checkNotSlaveMode();
-    overrideConfig();
-    LifecycleManager dbManager = new LifecycleManager();
-    dbManager.add(dbInjector);
-    dbManager.start();
-
-    sysInjector = createSysInjector();
-    LifecycleManager sysManager = new LifecycleManager();
-    sysManager.add(sysInjector);
-    sysManager.start();
-    sysInjector.injectMembers(this);
-    checkIndicesOption();
-
-    try {
-      boolean ok = list ? list() : reindex();
-      return ok ? 0 : 1;
-    } catch (Exception e) {
-      throw die(e.getMessage(), e);
-    } finally {
-      sysManager.stop();
-      dbManager.stop();
-    }
-  }
-
-  private boolean list() {
-    for (IndexDefinition<?, ?, ?> def : indexDefs) {
-      System.out.format("%s\n", def.getName());
-    }
-    return true;
-  }
-
-  private boolean reindex() throws IOException {
-    boolean ok = true;
-    for (IndexDefinition<?, ?, ?> def : indexDefs) {
-      if (indices.isEmpty() || indices.contains(def.getName())) {
-        ok &= reindex(def);
-      }
-    }
-    return ok;
-  }
-
-  private void checkIndicesOption() throws Die {
-    if (indices.isEmpty()) {
-      return;
-    }
-
-    checkNotNull(indexDefs, "Called this method before injectMembers?");
-    Set<String> valid = indexDefs.stream().map(IndexDefinition::getName).sorted().collect(toSet());
-    Set<String> invalid = Sets.difference(Sets.newHashSet(indices), valid);
-    if (invalid.isEmpty()) {
-      return;
-    }
-
-    throw die(
-        "invalid index name(s): " + new TreeSet<>(invalid) + " available indices are: " + valid);
-  }
-
-  private void checkNotSlaveMode() throws Die {
-    if (globalConfig.getBoolean("container", "slave", false)) {
-      throw die("Cannot run reindex in slave mode");
-    }
-  }
-
-  private Injector createSysInjector() {
-    Map<String, Integer> versions = new HashMap<>();
-    if (changesVersion != null) {
-      versions.put(ChangeSchemaDefinitions.INSTANCE.getName(), changesVersion);
-    }
-    List<Module> modules = new ArrayList<>();
-    Module indexModule;
-    switch (IndexModule.getIndexType(dbInjector)) {
-      case LUCENE:
-        indexModule = LuceneIndexModule.singleVersionWithExplicitVersions(versions, threads);
-        break;
-      case ELASTICSEARCH:
-        indexModule = ElasticIndexModule.singleVersionWithExplicitVersions(versions, threads);
-        break;
-      default:
-        throw new IllegalStateException("unsupported index.type");
-    }
-    modules.add(indexModule);
-    modules.add(dbInjector.getInstance(BatchProgramModule.class));
-    modules.add(
-        new FactoryModule() {
-          @Override
-          protected void configure() {
-            factory(ChangeResource.Factory.class);
-          }
-        });
-
-    return dbInjector.createChildInjector(modules);
-  }
-
-  private void overrideConfig() {
-    // Disable auto-commit for speed; committing will happen at the end of the process.
-    if (IndexModule.getIndexType(dbInjector) == IndexType.LUCENE) {
-      globalConfig.setLong("index", "changes_open", "commitWithin", -1);
-      globalConfig.setLong("index", "changes_closed", "commitWithin", -1);
-    }
-
-    // Disable change cache.
-    globalConfig.setLong("cache", "changes", "maximumWeight", 0);
-
-    // Disable auto-reindexing if stale, since there are no concurrent writes to race with.
-    globalConfig.setBoolean("index", null, "autoReindexIfStale", false);
-  }
-
-  private <K, V, I extends Index<K, V>> boolean reindex(IndexDefinition<K, V, I> def)
-      throws IOException {
-    I index = def.getIndexCollection().getSearchIndex();
-    checkNotNull(index, "no active search index configured for %s", def.getName());
-    index.markReady(false);
-    index.deleteAll();
-
-    SiteIndexer<K, V, I> siteIndexer = def.getSiteIndexer();
-    siteIndexer.setProgressOut(System.err);
-    siteIndexer.setVerboseOut(verbose ? System.out : NullOutputStream.INSTANCE);
-    SiteIndexer.Result result = siteIndexer.indexAll(index);
-    int n = result.doneCount() + result.failedCount();
-    double t = result.elapsed(TimeUnit.MILLISECONDS) / 1000d;
-    System.out.format(
-        "Reindexed %d documents in %s index in %.01fs (%.01f/s)\n", n, def.getName(), t, n / t);
-    if (result.success()) {
-      index.markReady(true);
-    }
-    return result.success();
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/SwitchSecureStore.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/SwitchSecureStore.java
deleted file mode 100644
index 1cdd8a8..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/SwitchSecureStore.java
+++ /dev/null
@@ -1,204 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.pgm;
-
-import static com.google.gerrit.server.schema.DataSourceProvider.Context.SINGLE_USER;
-
-import com.google.common.base.Joiner;
-import com.google.common.base.Strings;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.common.IoUtil;
-import com.google.gerrit.common.SiteLibraryLoaderUtil;
-import com.google.gerrit.pgm.util.SiteProgram;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.plugins.JarScanner;
-import com.google.gerrit.server.securestore.DefaultSecureStore;
-import com.google.gerrit.server.securestore.SecureStore;
-import com.google.gerrit.server.securestore.SecureStore.EntryKey;
-import com.google.inject.Injector;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.Arrays;
-import java.util.List;
-import java.util.jar.JarFile;
-import java.util.zip.ZipEntry;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.storage.file.FileBasedConfig;
-import org.eclipse.jgit.util.FS;
-import org.kohsuke.args4j.Option;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class SwitchSecureStore extends SiteProgram {
-  private static String getSecureStoreClassFromGerritConfig(SitePaths sitePaths) {
-    FileBasedConfig cfg = new FileBasedConfig(sitePaths.gerrit_config.toFile(), FS.DETECTED);
-    try {
-      cfg.load();
-    } catch (IOException | ConfigInvalidException e) {
-      throw new RuntimeException("Cannot read gerrit.config file", e);
-    }
-    return cfg.getString("gerrit", null, "secureStoreClass");
-  }
-
-  private static final Logger log = LoggerFactory.getLogger(SwitchSecureStore.class);
-
-  @Option(
-      name = "--new-secure-store-lib",
-      usage = "Path to new SecureStore implementation",
-      required = true)
-  private String newSecureStoreLib;
-
-  @Override
-  public int run() throws Exception {
-    SitePaths sitePaths = new SitePaths(getSitePath());
-    Path newSecureStorePath = Paths.get(newSecureStoreLib);
-    if (!Files.exists(newSecureStorePath)) {
-      log.error("File {} doesn't exist", newSecureStorePath.toAbsolutePath());
-      return -1;
-    }
-
-    String newSecureStore = getNewSecureStoreClassName(newSecureStorePath);
-    String currentSecureStoreName = getCurrentSecureStoreClassName(sitePaths);
-
-    if (currentSecureStoreName.equals(newSecureStore)) {
-      log.error(
-          "Old and new SecureStore implementation names are the same. Migration will not work");
-      return -1;
-    }
-
-    IoUtil.loadJARs(newSecureStorePath);
-    SiteLibraryLoaderUtil.loadSiteLib(sitePaths.lib_dir);
-
-    log.info(
-        "Current secureStoreClass property ({}) will be replaced with {}",
-        currentSecureStoreName,
-        newSecureStore);
-    Injector dbInjector = createDbInjector(SINGLE_USER);
-    SecureStore currentStore = getSecureStore(currentSecureStoreName, dbInjector);
-    SecureStore newStore = getSecureStore(newSecureStore, dbInjector);
-
-    migrateProperties(currentStore, newStore);
-
-    removeOldLib(sitePaths, currentSecureStoreName);
-    copyNewLib(sitePaths, newSecureStorePath);
-
-    updateGerritConfig(sitePaths, newSecureStore);
-
-    return 0;
-  }
-
-  private void migrateProperties(SecureStore currentStore, SecureStore newStore) {
-    log.info("Migrate entries");
-    for (EntryKey key : currentStore.list()) {
-      String[] value = currentStore.getList(key.section, key.subsection, key.name);
-      if (value != null) {
-        newStore.setList(key.section, key.subsection, key.name, Arrays.asList(value));
-      } else {
-        String msg = String.format("Cannot migrate entry for %s", key.section);
-        if (key.subsection != null) {
-          msg = msg + String.format(".%s", key.subsection);
-        }
-        msg = msg + String.format(".%s", key.name);
-        throw new RuntimeException(msg);
-      }
-    }
-  }
-
-  private void removeOldLib(SitePaths sitePaths, String currentSecureStoreName) throws IOException {
-    Path oldSecureStore = findJarWithSecureStore(sitePaths, currentSecureStoreName);
-    if (oldSecureStore != null) {
-      log.info("Removing old SecureStore ({}) from lib/ directory", oldSecureStore.getFileName());
-      try {
-        Files.delete(oldSecureStore);
-      } catch (IOException e) {
-        log.error("Cannot remove {}", oldSecureStore.toAbsolutePath(), e);
-      }
-    } else {
-      log.info(
-          "Cannot find jar with old SecureStore ({}) in lib/ directory", currentSecureStoreName);
-    }
-  }
-
-  private void copyNewLib(SitePaths sitePaths, Path newSecureStorePath) throws IOException {
-    log.info("Copy new SecureStore ({}) into lib/ directory", newSecureStorePath.getFileName());
-    Files.copy(newSecureStorePath, sitePaths.lib_dir.resolve(newSecureStorePath.getFileName()));
-  }
-
-  private void updateGerritConfig(SitePaths sitePaths, String newSecureStore)
-      throws IOException, ConfigInvalidException {
-    log.info("Set gerrit.secureStoreClass property of gerrit.config to {}", newSecureStore);
-    FileBasedConfig config = new FileBasedConfig(sitePaths.gerrit_config.toFile(), FS.DETECTED);
-    config.load();
-    config.setString("gerrit", null, "secureStoreClass", newSecureStore);
-    config.save();
-  }
-
-  private String getNewSecureStoreClassName(Path secureStore) throws IOException {
-    try (JarScanner scanner = new JarScanner(secureStore)) {
-      List<String> newSecureStores = scanner.findSubClassesOf(SecureStore.class);
-      if (newSecureStores.isEmpty()) {
-        throw new RuntimeException(
-            String.format(
-                "Cannot find implementation of SecureStore interface in %s",
-                secureStore.toAbsolutePath()));
-      }
-      if (newSecureStores.size() > 1) {
-        throw new RuntimeException(
-            String.format(
-                "Found too many implementations of SecureStore:\n%s\nin %s",
-                Joiner.on("\n").join(newSecureStores), secureStore.toAbsolutePath()));
-      }
-      return Iterables.getOnlyElement(newSecureStores);
-    }
-  }
-
-  private String getCurrentSecureStoreClassName(SitePaths sitePaths) {
-    String current = getSecureStoreClassFromGerritConfig(sitePaths);
-    if (!Strings.isNullOrEmpty(current)) {
-      return current;
-    }
-    return DefaultSecureStore.class.getName();
-  }
-
-  private SecureStore getSecureStore(String className, Injector injector) {
-    try {
-      @SuppressWarnings("unchecked")
-      Class<? extends SecureStore> clazz = (Class<? extends SecureStore>) Class.forName(className);
-      return injector.getInstance(clazz);
-    } catch (ClassNotFoundException e) {
-      throw new RuntimeException(
-          String.format("Cannot load SecureStore implementation: %s", className), e);
-    }
-  }
-
-  private Path findJarWithSecureStore(SitePaths sitePaths, String secureStoreClass)
-      throws IOException {
-    List<Path> jars = SiteLibraryLoaderUtil.listJars(sitePaths.lib_dir);
-    String secureStoreClassPath = secureStoreClass.replace('.', '/') + ".class";
-    for (Path jar : jars) {
-      try (JarFile jarFile = new JarFile(jar.toFile())) {
-        ZipEntry entry = jarFile.getEntry(secureStoreClassPath);
-        if (entry != null) {
-          return jar;
-        }
-      } catch (IOException e) {
-        log.error(e.getMessage(), e);
-      }
-    }
-    return null;
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/WarDistribution.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/WarDistribution.java
deleted file mode 100644
index d3df9d3..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/WarDistribution.java
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.pgm;
-
-import static com.google.gerrit.pgm.init.InitPlugins.JAR;
-import static com.google.gerrit.pgm.init.InitPlugins.PLUGIN_DIR;
-
-import com.google.gerrit.launcher.GerritLauncher;
-import com.google.gerrit.pgm.init.PluginsDistribution;
-import com.google.inject.Singleton;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class WarDistribution implements PluginsDistribution {
-  private static final Logger log = LoggerFactory.getLogger(WarDistribution.class);
-
-  @Override
-  public void foreach(Processor processor) throws IOException {
-    File myWar = GerritLauncher.getDistributionArchive();
-    if (myWar.isFile()) {
-      try (ZipFile zf = new ZipFile(myWar)) {
-        Enumeration<? extends ZipEntry> e = zf.entries();
-        while (e.hasMoreElements()) {
-          ZipEntry ze = e.nextElement();
-          if (ze.isDirectory()) {
-            continue;
-          }
-
-          if (ze.getName().startsWith(PLUGIN_DIR) && ze.getName().endsWith(JAR)) {
-            String pluginJarName = new File(ze.getName()).getName();
-            String pluginName = pluginJarName.substring(0, pluginJarName.length() - JAR.length());
-            try (InputStream in = zf.getInputStream(ze)) {
-              processor.process(pluginName, in);
-            } catch (IOException ioe) {
-              log.error("Error opening plugin {}: {}", ze.getName(), ioe.getMessage());
-            }
-          }
-        }
-      }
-    }
-  }
-
-  @Override
-  public List<String> listPluginNames() throws FileNotFoundException {
-    // not yet used
-    throw new UnsupportedOperationException();
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HiddenErrorHandler.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HiddenErrorHandler.java
deleted file mode 100644
index 2fbbb97..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HiddenErrorHandler.java
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.pgm.http.jetty;
-
-import static java.nio.charset.StandardCharsets.ISO_8859_1;
-
-import com.google.common.base.Strings;
-import com.google.gwtexpui.server.CacheHeaders;
-import java.io.IOException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.eclipse.jetty.http.HttpHeader;
-import org.eclipse.jetty.http.HttpStatus;
-import org.eclipse.jetty.server.HttpConnection;
-import org.eclipse.jetty.server.Request;
-import org.eclipse.jetty.server.handler.ErrorHandler;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-class HiddenErrorHandler extends ErrorHandler {
-  private static final Logger log = LoggerFactory.getLogger(HiddenErrorHandler.class);
-
-  @Override
-  public void handle(
-      String target, Request baseRequest, HttpServletRequest req, HttpServletResponse res)
-      throws IOException {
-    HttpConnection conn = HttpConnection.getCurrentConnection();
-    baseRequest.setHandled(true);
-    try {
-      log(req);
-    } finally {
-      reply(conn, res);
-    }
-  }
-
-  private void reply(HttpConnection conn, HttpServletResponse res) throws IOException {
-    byte[] msg = message(conn);
-    res.setHeader(HttpHeader.CONTENT_TYPE.asString(), "text/plain; charset=ISO-8859-1");
-    res.setContentLength(msg.length);
-    try {
-      CacheHeaders.setNotCacheable(res);
-    } finally {
-      try (ServletOutputStream out = res.getOutputStream()) {
-        out.write(msg);
-      }
-    }
-  }
-
-  private static byte[] message(HttpConnection conn) {
-    String msg;
-    if (conn == null) {
-      msg = "";
-    } else {
-      msg = conn.getHttpChannel().getResponse().getReason();
-      if (msg == null) {
-        msg = HttpStatus.getMessage(conn.getHttpChannel().getResponse().getStatus());
-      }
-    }
-    return msg.getBytes(ISO_8859_1);
-  }
-
-  private static void log(HttpServletRequest req) {
-    Throwable err = (Throwable) req.getAttribute("javax.servlet.error.exception");
-    if (err != null) {
-      String uri = req.getRequestURI();
-      if (!Strings.isNullOrEmpty(req.getQueryString())) {
-        uri += "?" + req.getQueryString();
-      }
-      log.error("Error in {} {}", req.getMethod(), uri, err);
-    }
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HttpLog.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HttpLog.java
deleted file mode 100644
index d7bc720..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HttpLog.java
+++ /dev/null
@@ -1,145 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.pgm.http.jetty;
-
-import static com.google.gerrit.httpd.restapi.RestApiServlet.XD_AUTHORIZATION;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Splitter;
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.restapi.Url;
-import com.google.gerrit.httpd.GetUserFilter;
-import com.google.gerrit.server.util.SystemLog;
-import com.google.inject.Inject;
-import java.util.Iterator;
-import org.apache.log4j.AsyncAppender;
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
-import org.apache.log4j.spi.LoggingEvent;
-import org.eclipse.jetty.server.Request;
-import org.eclipse.jetty.server.RequestLog;
-import org.eclipse.jetty.server.Response;
-import org.eclipse.jetty.util.component.AbstractLifeCycle;
-
-/** Writes the {@code httpd_log} file with per-request data. */
-class HttpLog extends AbstractLifeCycle implements RequestLog {
-  private static final Logger log = Logger.getLogger(HttpLog.class);
-  private static final String LOG_NAME = "httpd_log";
-  private static final ImmutableSet<String> REDACT_PARAM = ImmutableSet.of(XD_AUTHORIZATION);
-
-  interface HttpLogFactory {
-    HttpLog get();
-  }
-
-  protected static final String P_HOST = "Host";
-  protected static final String P_USER = "User";
-  protected static final String P_METHOD = "Method";
-  protected static final String P_RESOURCE = "Resource";
-  protected static final String P_PROTOCOL = "Version";
-  protected static final String P_STATUS = "Status";
-  protected static final String P_CONTENT_LENGTH = "Content-Length";
-  protected static final String P_REFERER = "Referer";
-  protected static final String P_USER_AGENT = "User-Agent";
-
-  private final AsyncAppender async;
-
-  @Inject
-  HttpLog(SystemLog systemLog) {
-    async = systemLog.createAsyncAppender(LOG_NAME, new HttpLogLayout());
-  }
-
-  @Override
-  protected void doStart() throws Exception {}
-
-  @Override
-  protected void doStop() throws Exception {
-    async.close();
-  }
-
-  @Override
-  public void log(Request req, Response rsp) {
-    final LoggingEvent event =
-        new LoggingEvent( //
-            Logger.class.getName(), // fqnOfCategoryClass
-            log, // logger
-            TimeUtil.nowMs(), // when
-            Level.INFO, // level
-            "", // message text
-            "HTTPD", // thread name
-            null, // exception information
-            null, // current NDC string
-            null, // caller location
-            null // MDC properties
-            );
-
-    String uri = req.getRequestURI();
-    uri = redactQueryString(uri, req.getQueryString());
-
-    String user = (String) req.getAttribute(GetUserFilter.USER_ATTR_KEY);
-    if (user != null) {
-      event.setProperty(P_USER, user);
-    }
-
-    set(event, P_HOST, req.getRemoteAddr());
-    set(event, P_METHOD, req.getMethod());
-    set(event, P_RESOURCE, uri);
-    set(event, P_PROTOCOL, req.getProtocol());
-    set(event, P_STATUS, rsp.getStatus());
-    set(event, P_CONTENT_LENGTH, rsp.getContentCount());
-    set(event, P_REFERER, req.getHeader("Referer"));
-    set(event, P_USER_AGENT, req.getHeader("User-Agent"));
-
-    async.append(event);
-  }
-
-  @VisibleForTesting
-  static String redactQueryString(String uri, String qs) {
-    if (Strings.isNullOrEmpty(qs)) {
-      return uri;
-    }
-
-    StringBuilder b = new StringBuilder(uri);
-    boolean first = true;
-    for (String kvPair : Splitter.on('&').split(qs)) {
-      Iterator<String> i = Splitter.on('=').limit(2).split(kvPair).iterator();
-      String key = i.next();
-      b.append(first ? '?' : '&').append(key);
-      first = false;
-      if (i.hasNext()) {
-        b.append('=');
-        if (REDACT_PARAM.contains(Url.decode(key))) {
-          b.append('*');
-        } else {
-          b.append(i.next());
-        }
-      }
-    }
-    return b.toString();
-  }
-
-  private static void set(LoggingEvent event, String key, String val) {
-    if (val != null && !val.isEmpty()) {
-      event.setProperty(key, val);
-    }
-  }
-
-  private static void set(LoggingEvent event, String key, long val) {
-    if (0 < val) {
-      event.setProperty(key, String.valueOf(val));
-    }
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/ProjectQoSFilter.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/ProjectQoSFilter.java
deleted file mode 100644
index 4d2bb41..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/ProjectQoSFilter.java
+++ /dev/null
@@ -1,244 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.pgm.http.jetty;
-
-import static com.google.gerrit.server.config.ConfigUtil.getTimeUnit;
-import static java.util.concurrent.TimeUnit.MINUTES;
-import static javax.servlet.http.HttpServletResponse.SC_SERVICE_UNAVAILABLE;
-
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.account.AccountLimits;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.git.QueueProvider;
-import com.google.gerrit.server.git.WorkQueue.CancelableRunnable;
-import com.google.gerrit.sshd.CommandExecutorQueueProvider;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import com.google.inject.servlet.ServletModule;
-import java.io.IOException;
-import java.util.concurrent.Future;
-import java.util.concurrent.ScheduledThreadPoolExecutor;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.eclipse.jetty.continuation.Continuation;
-import org.eclipse.jetty.continuation.ContinuationListener;
-import org.eclipse.jetty.continuation.ContinuationSupport;
-import org.eclipse.jgit.lib.Config;
-
-/**
- * Use Jetty continuations to defer execution until threads are available.
- *
- * <p>We actually schedule a task into the same execution queue as the SSH daemon uses for command
- * execution, and then park the web request in a continuation until an execution thread is
- * available. This ensures that the overall JVM process doesn't exceed the configured limit on
- * concurrent Git requests.
- *
- * <p>During Git request execution however we have to use the Jetty service thread, not the thread
- * from the SSH execution queue. Trying to complete the request on the SSH execution queue caused
- * Jetty's HTTP parser to crash, so we instead block the SSH execution queue thread and ask Jetty to
- * resume processing on the web service thread.
- */
-@Singleton
-public class ProjectQoSFilter implements Filter {
-  private static final String ATT_SPACE = ProjectQoSFilter.class.getName();
-  private static final String TASK = ATT_SPACE + "/TASK";
-  private static final String CANCEL = ATT_SPACE + "/CANCEL";
-
-  private static final String FILTER_RE = "^/(.*)/(git-upload-pack|git-receive-pack)$";
-  private static final Pattern URI_PATTERN = Pattern.compile(FILTER_RE);
-
-  public static class Module extends ServletModule {
-    @Override
-    protected void configureServlets() {
-      bind(QueueProvider.class).to(CommandExecutorQueueProvider.class);
-      filterRegex(FILTER_RE).through(ProjectQoSFilter.class);
-    }
-  }
-
-  private final AccountLimits.Factory limitsFactory;
-  private final Provider<CurrentUser> user;
-  private final QueueProvider queue;
-  private final ServletContext context;
-  private final long maxWait;
-
-  @Inject
-  ProjectQoSFilter(
-      AccountLimits.Factory limitsFactory,
-      Provider<CurrentUser> user,
-      QueueProvider queue,
-      ServletContext context,
-      @GerritServerConfig Config cfg) {
-    this.limitsFactory = limitsFactory;
-    this.user = user;
-    this.queue = queue;
-    this.context = context;
-    this.maxWait = MINUTES.toMillis(getTimeUnit(cfg, "httpd", null, "maxwait", 5, MINUTES));
-  }
-
-  @Override
-  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
-      throws IOException, ServletException {
-    final HttpServletRequest req = (HttpServletRequest) request;
-    final HttpServletResponse rsp = (HttpServletResponse) response;
-    final Continuation cont = ContinuationSupport.getContinuation(req);
-
-    if (cont.isInitial()) {
-      TaskThunk task = new TaskThunk(cont, req);
-      if (maxWait > 0) {
-        cont.setTimeout(maxWait);
-      }
-      cont.suspend(rsp);
-      cont.setAttribute(TASK, task);
-
-      Future<?> f = getExecutor().submit(task);
-      cont.addContinuationListener(new Listener(f));
-    } else if (cont.isExpired()) {
-      rsp.sendError(SC_SERVICE_UNAVAILABLE);
-
-    } else if (cont.isResumed() && cont.getAttribute(CANCEL) == Boolean.TRUE) {
-      rsp.sendError(SC_SERVICE_UNAVAILABLE);
-
-    } else if (cont.isResumed()) {
-      TaskThunk task = (TaskThunk) cont.getAttribute(TASK);
-      try {
-        task.begin(Thread.currentThread());
-        chain.doFilter(req, rsp);
-      } finally {
-        task.end();
-        Thread.interrupted();
-      }
-
-    } else {
-      context.log("Unexpected QoS continuation state, aborting request");
-      rsp.sendError(SC_SERVICE_UNAVAILABLE);
-    }
-  }
-
-  private ScheduledThreadPoolExecutor getExecutor() {
-    QueueProvider.QueueType qt = limitsFactory.create(user.get()).getQueueType();
-    return queue.getQueue(qt);
-  }
-
-  @Override
-  public void init(FilterConfig config) {}
-
-  @Override
-  public void destroy() {}
-
-  private static final class Listener implements ContinuationListener {
-    final Future<?> future;
-
-    Listener(Future<?> future) {
-      this.future = future;
-    }
-
-    @Override
-    public void onComplete(Continuation self) {}
-
-    @Override
-    public void onTimeout(Continuation self) {
-      future.cancel(true);
-    }
-  }
-
-  private final class TaskThunk implements CancelableRunnable {
-    private final Continuation cont;
-    private final String name;
-    private final Object lock = new Object();
-    private boolean done;
-    private Thread worker;
-
-    TaskThunk(Continuation cont, HttpServletRequest req) {
-      this.cont = cont;
-      this.name = generateName(req);
-    }
-
-    @Override
-    public void run() {
-      cont.resume();
-
-      synchronized (lock) {
-        while (!done) {
-          try {
-            lock.wait();
-          } catch (InterruptedException e) {
-            if (worker != null) {
-              worker.interrupt();
-            } else {
-              break;
-            }
-          }
-        }
-      }
-    }
-
-    void begin(Thread thread) {
-      synchronized (lock) {
-        worker = thread;
-      }
-    }
-
-    void end() {
-      synchronized (lock) {
-        worker = null;
-        done = true;
-        lock.notifyAll();
-      }
-    }
-
-    @Override
-    public void cancel() {
-      cont.setAttribute(CANCEL, Boolean.TRUE);
-      cont.resume();
-    }
-
-    @Override
-    public String toString() {
-      return name;
-    }
-
-    private String generateName(HttpServletRequest req) {
-      String userName = "";
-
-      CurrentUser who = user.get();
-      if (who.isIdentifiedUser()) {
-        String name = who.asIdentifiedUser().getUserName();
-        if (name != null && !name.isEmpty()) {
-          userName = " (" + name + ")";
-        }
-      }
-
-      String uri = req.getServletPath();
-      Matcher m = URI_PATTERN.matcher(uri);
-      if (m.matches()) {
-        String path = m.group(1);
-        String cmd = m.group(2);
-        return cmd + " " + path + userName;
-      }
-
-      return req.getMethod() + " " + uri + userName;
-    }
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/AccountsOnInit.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/AccountsOnInit.java
deleted file mode 100644
index 2beb50a..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/AccountsOnInit.java
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.pgm.init;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.gerrit.pgm.init.api.AllUsersNameOnInitProvider;
-import com.google.gerrit.pgm.init.api.InitFlags;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.GerritPersonIdentProvider;
-import com.google.gerrit.server.account.AccountConfig;
-import com.google.gerrit.server.account.Accounts;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.inject.Inject;
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Path;
-import org.eclipse.jgit.dircache.DirCache;
-import org.eclipse.jgit.dircache.DirCacheEditor;
-import org.eclipse.jgit.dircache.DirCacheEditor.PathEdit;
-import org.eclipse.jgit.dircache.DirCacheEntry;
-import org.eclipse.jgit.internal.storage.file.FileRepository;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.FileMode;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.RefUpdate.Result;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.lib.RepositoryCache.FileKey;
-import org.eclipse.jgit.util.FS;
-
-public class AccountsOnInit {
-  private final InitFlags flags;
-  private final SitePaths site;
-  private final String allUsers;
-
-  @Inject
-  public AccountsOnInit(InitFlags flags, SitePaths site, AllUsersNameOnInitProvider allUsers) {
-    this.flags = flags;
-    this.site = site;
-    this.allUsers = allUsers.get();
-  }
-
-  public void insert(Account account) throws IOException {
-    File path = getPath();
-    if (path != null) {
-      try (Repository repo = new FileRepository(path);
-          ObjectInserter oi = repo.newObjectInserter()) {
-        PersonIdent ident =
-            new PersonIdent(
-                new GerritPersonIdentProvider(flags.cfg).get(), account.getRegisteredOn());
-
-        Config accountConfig = new Config();
-        AccountConfig.writeToConfig(account, accountConfig);
-
-        DirCache newTree = DirCache.newInCore();
-        DirCacheEditor editor = newTree.editor();
-        final ObjectId blobId =
-            oi.insert(Constants.OBJ_BLOB, accountConfig.toText().getBytes(UTF_8));
-        editor.add(
-            new PathEdit(AccountConfig.ACCOUNT_CONFIG) {
-              @Override
-              public void apply(DirCacheEntry ent) {
-                ent.setFileMode(FileMode.REGULAR_FILE);
-                ent.setObjectId(blobId);
-              }
-            });
-        editor.finish();
-
-        ObjectId treeId = newTree.writeTree(oi);
-
-        CommitBuilder cb = new CommitBuilder();
-        cb.setTreeId(treeId);
-        cb.setCommitter(ident);
-        cb.setAuthor(ident);
-        cb.setMessage("Create Account");
-        ObjectId id = oi.insert(cb);
-        oi.flush();
-
-        String refName = RefNames.refsUsers(account.getId());
-        RefUpdate ru = repo.updateRef(refName);
-        ru.setExpectedOldObjectId(ObjectId.zeroId());
-        ru.setNewObjectId(id);
-        ru.setRefLogIdent(ident);
-        ru.setRefLogMessage("Create Account", false);
-        Result result = ru.update();
-        if (result != Result.NEW) {
-          throw new IOException(
-              String.format("Failed to update ref %s: %s", refName, result.name()));
-        }
-        account.setMetaId(id.name());
-      }
-    }
-  }
-
-  public boolean hasAnyAccount() throws IOException {
-    File path = getPath();
-    if (path == null) {
-      return false;
-    }
-
-    try (Repository repo = new FileRepository(path)) {
-      return Accounts.hasAnyAccount(repo);
-    }
-  }
-
-  private File getPath() {
-    Path basePath = site.resolve(flags.cfg.getString("gerrit", null, "basePath"));
-    checkArgument(basePath != null, "gerrit.basePath must be configured");
-    return FileKey.resolve(basePath.resolve(allUsers).toFile(), FS.DETECTED);
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/BaseInit.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/BaseInit.java
deleted file mode 100644
index a5b4f46..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/BaseInit.java
+++ /dev/null
@@ -1,531 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.pgm.init;
-
-import static com.google.gerrit.reviewdb.server.ReviewDbUtil.unwrapDb;
-import static com.google.gerrit.server.schema.DataSourceProvider.Context.SINGLE_USER;
-import static com.google.inject.Scopes.SINGLETON;
-import static com.google.inject.Stage.PRODUCTION;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Strings;
-import com.google.gerrit.common.Die;
-import com.google.gerrit.common.IoUtil;
-import com.google.gerrit.metrics.DisabledMetricMaker;
-import com.google.gerrit.metrics.MetricMaker;
-import com.google.gerrit.pgm.init.api.ConsoleUI;
-import com.google.gerrit.pgm.init.api.InitFlags;
-import com.google.gerrit.pgm.init.api.InstallAllPlugins;
-import com.google.gerrit.pgm.init.api.InstallPlugins;
-import com.google.gerrit.pgm.init.api.LibraryDownload;
-import com.google.gerrit.pgm.init.index.IndexManagerOnInit;
-import com.google.gerrit.pgm.init.index.elasticsearch.ElasticIndexModuleOnInit;
-import com.google.gerrit.pgm.init.index.lucene.LuceneIndexModuleOnInit;
-import com.google.gerrit.pgm.util.SiteProgram;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.config.GerritServerConfigModule;
-import com.google.gerrit.server.config.SitePath;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.index.IndexModule;
-import com.google.gerrit.server.plugins.JarScanner;
-import com.google.gerrit.server.schema.ReviewDbFactory;
-import com.google.gerrit.server.schema.SchemaUpdater;
-import com.google.gerrit.server.schema.UpdateUI;
-import com.google.gerrit.server.securestore.SecureStore;
-import com.google.gerrit.server.securestore.SecureStoreClassName;
-import com.google.gerrit.server.securestore.SecureStoreProvider;
-import com.google.gwtorm.jdbc.JdbcExecutor;
-import com.google.gwtorm.jdbc.JdbcSchema;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.gwtorm.server.StatementExecutor;
-import com.google.inject.AbstractModule;
-import com.google.inject.CreationException;
-import com.google.inject.Guice;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.Module;
-import com.google.inject.Provider;
-import com.google.inject.TypeLiteral;
-import com.google.inject.spi.Message;
-import com.google.inject.util.Providers;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.nio.file.FileVisitResult;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.SimpleFileVisitor;
-import java.nio.file.attribute.BasicFileAttributes;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import javax.sql.DataSource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Initialize a new Gerrit installation. */
-public class BaseInit extends SiteProgram {
-  private static final Logger log = LoggerFactory.getLogger(BaseInit.class);
-
-  private final boolean standalone;
-  private final boolean initDb;
-  protected final PluginsDistribution pluginsDistribution;
-  private final List<String> pluginsToInstall;
-
-  private Injector sysInjector;
-
-  protected BaseInit(PluginsDistribution pluginsDistribution, List<String> pluginsToInstall) {
-    this.standalone = true;
-    this.initDb = true;
-    this.pluginsDistribution = pluginsDistribution;
-    this.pluginsToInstall = pluginsToInstall;
-  }
-
-  public BaseInit(
-      Path sitePath,
-      boolean standalone,
-      boolean initDb,
-      PluginsDistribution pluginsDistribution,
-      List<String> pluginsToInstall) {
-    this(sitePath, null, standalone, initDb, pluginsDistribution, pluginsToInstall);
-  }
-
-  public BaseInit(
-      Path sitePath,
-      final Provider<DataSource> dsProvider,
-      boolean standalone,
-      boolean initDb,
-      PluginsDistribution pluginsDistribution,
-      List<String> pluginsToInstall) {
-    super(sitePath, dsProvider);
-    this.standalone = standalone;
-    this.initDb = initDb;
-    this.pluginsDistribution = pluginsDistribution;
-    this.pluginsToInstall = pluginsToInstall;
-  }
-
-  @Override
-  public int run() throws Exception {
-    final SiteInit init = createSiteInit();
-    if (beforeInit(init)) {
-      return 0;
-    }
-
-    init.flags.autoStart = getAutoStart() && init.site.isNew;
-    init.flags.dev = isDev() && init.site.isNew;
-    init.flags.skipPlugins = skipPlugins();
-    init.flags.deleteCaches = getDeleteCaches();
-    init.flags.isNew = init.site.isNew;
-
-    final SiteRun run;
-    try {
-      init.initializer.run();
-      init.flags.deleteOnFailure = false;
-
-      Injector sysInjector = createSysInjector(init);
-      IndexManagerOnInit indexManager = sysInjector.getInstance(IndexManagerOnInit.class);
-      try {
-        indexManager.start();
-        run = createSiteRun(init);
-        run.upgradeSchema();
-
-        init.initializer.postRun(sysInjector);
-      } finally {
-        indexManager.stop();
-      }
-    } catch (Exception | Error failure) {
-      if (init.flags.deleteOnFailure) {
-        recursiveDelete(getSitePath());
-      }
-      throw failure;
-    }
-
-    System.err.println("Initialized " + getSitePath().toRealPath().normalize());
-    afterInit(run);
-    return 0;
-  }
-
-  protected boolean skipPlugins() {
-    return false;
-  }
-
-  protected String getSecureStoreLib() {
-    return null;
-  }
-
-  protected boolean skipAllDownloads() {
-    return false;
-  }
-
-  protected List<String> getSkippedDownloads() {
-    return Collections.emptyList();
-  }
-
-  /**
-   * Invoked before site init is called.
-   *
-   * @param init initializer instance.
-   * @throws Exception
-   */
-  protected boolean beforeInit(SiteInit init) throws Exception {
-    return false;
-  }
-
-  /**
-   * Invoked after site init is called.
-   *
-   * @param run completed run instance.
-   * @throws Exception
-   */
-  protected void afterInit(SiteRun run) throws Exception {}
-
-  protected List<String> getInstallPlugins() {
-    try {
-      if (pluginsToInstall != null && pluginsToInstall.isEmpty()) {
-        return Collections.emptyList();
-      }
-      List<String> names = pluginsDistribution.listPluginNames();
-      if (pluginsToInstall != null) {
-        for (Iterator<String> i = names.iterator(); i.hasNext(); ) {
-          String n = i.next();
-          if (!pluginsToInstall.contains(n)) {
-            i.remove();
-          }
-        }
-      }
-      return names;
-    } catch (FileNotFoundException e) {
-      log.warn("Couldn't find distribution archive location. No plugin will be installed");
-      return null;
-    }
-  }
-
-  protected boolean installAllPlugins() {
-    return false;
-  }
-
-  protected boolean getAutoStart() {
-    return false;
-  }
-
-  public static class SiteInit {
-    public final SitePaths site;
-    final InitFlags flags;
-    final ConsoleUI ui;
-    final SitePathInitializer initializer;
-
-    @Inject
-    SiteInit(
-        final SitePaths site,
-        final InitFlags flags,
-        final ConsoleUI ui,
-        final SitePathInitializer initializer) {
-      this.site = site;
-      this.flags = flags;
-      this.ui = ui;
-      this.initializer = initializer;
-    }
-  }
-
-  private SiteInit createSiteInit() {
-    final ConsoleUI ui = getConsoleUI();
-    final Path sitePath = getSitePath();
-    final List<Module> m = new ArrayList<>();
-    final SecureStoreInitData secureStoreInitData = discoverSecureStoreClass();
-    final String currentSecureStoreClassName = getConfiguredSecureStoreClass();
-
-    if (secureStoreInitData != null
-        && currentSecureStoreClassName != null
-        && !currentSecureStoreClassName.equals(secureStoreInitData.className)) {
-      String err =
-          String.format(
-              "Different secure store was previously configured: %s. "
-                  + "Use SwitchSecureStore program to switch between implementations.",
-              currentSecureStoreClassName);
-      throw die(err);
-    }
-
-    m.add(new GerritServerConfigModule());
-    m.add(new InitModule(standalone, initDb));
-    m.add(
-        new AbstractModule() {
-          @Override
-          protected void configure() {
-            bind(ConsoleUI.class).toInstance(ui);
-            bind(Path.class).annotatedWith(SitePath.class).toInstance(sitePath);
-            List<String> plugins =
-                MoreObjects.firstNonNull(getInstallPlugins(), new ArrayList<String>());
-            bind(new TypeLiteral<List<String>>() {})
-                .annotatedWith(InstallPlugins.class)
-                .toInstance(plugins);
-            bind(new TypeLiteral<Boolean>() {})
-                .annotatedWith(InstallAllPlugins.class)
-                .toInstance(installAllPlugins());
-            bind(PluginsDistribution.class).toInstance(pluginsDistribution);
-
-            String secureStoreClassName;
-            if (secureStoreInitData != null) {
-              secureStoreClassName = secureStoreInitData.className;
-            } else {
-              secureStoreClassName = currentSecureStoreClassName;
-            }
-            if (secureStoreClassName != null) {
-              ui.message("Using secure store: %s\n", secureStoreClassName);
-            }
-            bind(SecureStoreInitData.class).toProvider(Providers.of(secureStoreInitData));
-            bind(String.class)
-                .annotatedWith(SecureStoreClassName.class)
-                .toProvider(Providers.of(secureStoreClassName));
-            bind(SecureStore.class).toProvider(SecureStoreProvider.class).in(SINGLETON);
-            bind(new TypeLiteral<List<String>>() {})
-                .annotatedWith(LibraryDownload.class)
-                .toInstance(getSkippedDownloads());
-            bind(Boolean.class).annotatedWith(LibraryDownload.class).toInstance(skipAllDownloads());
-
-            bind(MetricMaker.class).to(DisabledMetricMaker.class);
-          }
-        });
-
-    try {
-      return Guice.createInjector(PRODUCTION, m).getInstance(SiteInit.class);
-    } catch (CreationException ce) {
-      final Message first = ce.getErrorMessages().iterator().next();
-      Throwable why = first.getCause();
-
-      if (why instanceof Die) {
-        throw (Die) why;
-      }
-
-      final StringBuilder buf = new StringBuilder(ce.getMessage());
-      while (why != null) {
-        buf.append("\n");
-        buf.append(why.getMessage());
-        why = why.getCause();
-        if (why != null) {
-          buf.append("\n  caused by ");
-        }
-      }
-      throw die(buf.toString(), new RuntimeException("InitInjector failed", ce));
-    }
-  }
-
-  protected ConsoleUI getConsoleUI() {
-    return ConsoleUI.getInstance(false);
-  }
-
-  private SecureStoreInitData discoverSecureStoreClass() {
-    String secureStore = getSecureStoreLib();
-    if (Strings.isNullOrEmpty(secureStore)) {
-      return null;
-    }
-
-    Path secureStoreLib = Paths.get(secureStore);
-    if (!Files.exists(secureStoreLib)) {
-      throw new InvalidSecureStoreException(String.format("File %s doesn't exist", secureStore));
-    }
-    try (JarScanner scanner = new JarScanner(secureStoreLib)) {
-      List<String> secureStores = scanner.findSubClassesOf(SecureStore.class);
-      if (secureStores.isEmpty()) {
-        throw new InvalidSecureStoreException(
-            String.format(
-                "Cannot find class implementing %s interface in %s",
-                SecureStore.class.getName(), secureStore));
-      }
-      if (secureStores.size() > 1) {
-        throw new InvalidSecureStoreException(
-            String.format(
-                "%s has more that one implementation of %s interface",
-                secureStore, SecureStore.class.getName()));
-      }
-      IoUtil.loadJARs(secureStoreLib);
-      return new SecureStoreInitData(secureStoreLib, secureStores.get(0));
-    } catch (IOException e) {
-      throw new InvalidSecureStoreException(String.format("%s is not a valid jar", secureStore));
-    }
-  }
-
-  public static class SiteRun {
-    public final ConsoleUI ui;
-    public final SitePaths site;
-    public final InitFlags flags;
-    final SchemaUpdater schemaUpdater;
-    final SchemaFactory<ReviewDb> schema;
-    final GitRepositoryManager repositoryManager;
-
-    @Inject
-    SiteRun(
-        ConsoleUI ui,
-        SitePaths site,
-        InitFlags flags,
-        SchemaUpdater schemaUpdater,
-        @ReviewDbFactory SchemaFactory<ReviewDb> schema,
-        GitRepositoryManager repositoryManager) {
-      this.ui = ui;
-      this.site = site;
-      this.flags = flags;
-      this.schemaUpdater = schemaUpdater;
-      this.schema = schema;
-      this.repositoryManager = repositoryManager;
-    }
-
-    void upgradeSchema() throws OrmException {
-      final List<String> pruneList = new ArrayList<>();
-      schemaUpdater.update(
-          new UpdateUI() {
-            @Override
-            public void message(String message) {
-              System.err.println(message);
-              System.err.flush();
-            }
-
-            @Override
-            public boolean yesno(boolean defaultValue, String message) {
-              return ui.yesno(defaultValue, message);
-            }
-
-            @Override
-            public void waitForUser() {
-              ui.waitForUser();
-            }
-
-            @Override
-            public String readString(
-                String defaultValue, Set<String> allowedValues, String message) {
-              return ui.readString(defaultValue, allowedValues, message);
-            }
-
-            @Override
-            public boolean isBatch() {
-              return ui.isBatch();
-            }
-
-            @Override
-            public void pruneSchema(StatementExecutor e, List<String> prune) {
-              for (String p : prune) {
-                if (!pruneList.contains(p)) {
-                  pruneList.add(p);
-                }
-              }
-            }
-          });
-
-      if (!pruneList.isEmpty()) {
-        StringBuilder msg = new StringBuilder();
-        msg.append("Execute the following SQL to drop unused objects:\n");
-        msg.append("\n");
-        for (String sql : pruneList) {
-          msg.append("  ");
-          msg.append(sql);
-          msg.append(";\n");
-        }
-
-        if (ui.isBatch()) {
-          System.err.print(msg);
-          System.err.flush();
-
-        } else if (ui.yesno(true, "%s\nExecute now", msg)) {
-          try (JdbcSchema db = (JdbcSchema) unwrapDb(schema.open());
-              JdbcExecutor e = new JdbcExecutor(db)) {
-            for (String sql : pruneList) {
-              e.execute(sql);
-            }
-          }
-        }
-      }
-    }
-  }
-
-  private SiteRun createSiteRun(SiteInit init) {
-    return createSysInjector(init).getInstance(SiteRun.class);
-  }
-
-  private Injector createSysInjector(SiteInit init) {
-    if (sysInjector == null) {
-      final List<Module> modules = new ArrayList<>();
-      modules.add(
-          new AbstractModule() {
-            @Override
-            protected void configure() {
-              bind(ConsoleUI.class).toInstance(init.ui);
-              bind(InitFlags.class).toInstance(init.flags);
-            }
-          });
-      Injector dbInjector = createDbInjector(SINGLE_USER);
-      switch (IndexModule.getIndexType(dbInjector)) {
-        case LUCENE:
-          modules.add(new LuceneIndexModuleOnInit());
-          break;
-        case ELASTICSEARCH:
-          modules.add(new ElasticIndexModuleOnInit());
-          break;
-        default:
-          throw new IllegalStateException("unsupported index.type");
-      }
-      sysInjector = dbInjector.createChildInjector(modules);
-    }
-    return sysInjector;
-  }
-
-  private static void recursiveDelete(Path path) {
-    final String msg = "warn: Cannot remove ";
-    try {
-      Files.walkFileTree(
-          path,
-          new SimpleFileVisitor<Path>() {
-            @Override
-            public FileVisitResult visitFile(Path f, BasicFileAttributes attrs) throws IOException {
-              try {
-                Files.delete(f);
-              } catch (IOException e) {
-                System.err.println(msg + f);
-              }
-              return FileVisitResult.CONTINUE;
-            }
-
-            @Override
-            public FileVisitResult postVisitDirectory(Path dir, IOException err) {
-              try {
-                // Previously warned if err was not null; if dir is not empty as a
-                // result, will cause an error that will be logged below.
-                Files.delete(dir);
-              } catch (IOException e) {
-                System.err.println(msg + dir);
-              }
-              return FileVisitResult.CONTINUE;
-            }
-
-            @Override
-            public FileVisitResult visitFileFailed(Path f, IOException e) {
-              System.err.println(msg + f);
-              return FileVisitResult.CONTINUE;
-            }
-          });
-    } catch (IOException e) {
-      System.err.println(msg + path);
-    }
-  }
-
-  protected boolean isDev() {
-    return false;
-  }
-
-  protected boolean getDeleteCaches() {
-    return false;
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/ExternalIdsOnInit.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/ExternalIdsOnInit.java
deleted file mode 100644
index ab491f7c..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/ExternalIdsOnInit.java
+++ /dev/null
@@ -1,94 +0,0 @@
-// 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.
-
-package com.google.gerrit.pgm.init;
-
-import com.google.gerrit.pgm.init.api.AllUsersNameOnInitProvider;
-import com.google.gerrit.pgm.init.api.InitFlags;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.GerritPersonIdentProvider;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.account.externalids.ExternalIdReader;
-import com.google.gerrit.server.account.externalids.ExternalIdsUpdate;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.util.Collection;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.internal.storage.file.FileRepository;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.lib.RepositoryCache.FileKey;
-import org.eclipse.jgit.notes.NoteMap;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.util.FS;
-
-public class ExternalIdsOnInit {
-  private final InitFlags flags;
-  private final SitePaths site;
-  private final String allUsers;
-
-  @Inject
-  public ExternalIdsOnInit(InitFlags flags, SitePaths site, AllUsersNameOnInitProvider allUsers) {
-    this.flags = flags;
-    this.site = site;
-    this.allUsers = allUsers.get();
-  }
-
-  public synchronized void insert(String commitMessage, Collection<ExternalId> extIds)
-      throws OrmException, IOException, ConfigInvalidException {
-
-    File path = getPath();
-    if (path != null) {
-      try (Repository repo = new FileRepository(path);
-          RevWalk rw = new RevWalk(repo);
-          ObjectInserter ins = repo.newObjectInserter()) {
-        ObjectId rev = ExternalIdReader.readRevision(repo);
-
-        NoteMap noteMap = ExternalIdReader.readNoteMap(rw, rev);
-        for (ExternalId extId : extIds) {
-          ExternalIdsUpdate.insert(rw, ins, noteMap, extId);
-        }
-
-        PersonIdent serverIdent = new GerritPersonIdentProvider(flags.cfg).get();
-        ExternalIdsUpdate.commit(
-            new Project.NameKey(allUsers),
-            repo,
-            rw,
-            ins,
-            rev,
-            noteMap,
-            commitMessage,
-            serverIdent,
-            serverIdent,
-            null,
-            GitReferenceUpdated.DISABLED);
-      }
-    }
-  }
-
-  private File getPath() {
-    Path basePath = site.resolve(flags.cfg.getString("gerrit", null, "basePath"));
-    if (basePath == null) {
-      throw new IllegalStateException("gerrit.basePath must be configured");
-    }
-    return FileKey.resolve(basePath.resolve(allUsers).toFile(), FS.DETECTED);
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/GroupsOnInit.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/GroupsOnInit.java
deleted file mode 100644
index 4923fab..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/GroupsOnInit.java
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.pgm.init;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.AccountGroupMember;
-import com.google.gerrit.reviewdb.client.AccountGroupName;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gwtorm.server.OrmDuplicateKeyException;
-import com.google.gwtorm.server.OrmException;
-import java.util.List;
-
-/**
- * A database accessor for calls related to groups.
- *
- * <p>All calls which read or write group related details to the database <strong>during
- * init</strong> (either ReviewDb or NoteDb) are gathered here. For non-init cases, use {@code
- * Groups} or {@code GroupsUpdate} instead.
- *
- * <p>All methods of this class refer to <em>internal</em> groups.
- */
-public class GroupsOnInit {
-
-  /**
-   * Returns the {@code AccountGroup} for the specified name.
-   *
-   * @param db the {@code ReviewDb} instance to use for lookups
-   * @param groupName the name of the group
-   * @return the {@code AccountGroup} which has the specified name
-   * @throws OrmException if the group couldn't be retrieved from ReviewDb
-   * @throws NoSuchGroupException if a group with such a name doesn't exist
-   */
-  public AccountGroup getExistingGroup(ReviewDb db, AccountGroup.NameKey groupName)
-      throws OrmException, NoSuchGroupException {
-    AccountGroupName accountGroupName = db.accountGroupNames().get(groupName);
-    if (accountGroupName == null) {
-      throw new NoSuchGroupException(groupName.toString());
-    }
-
-    AccountGroup.Id groupId = accountGroupName.getId();
-    AccountGroup group = db.accountGroups().get(groupId);
-    if (group == null) {
-      throw new NoSuchGroupException(groupName.toString());
-    }
-    return group;
-  }
-
-  /**
-   * Adds an account as member to a group. The account is only added as a new member if it isn't
-   * already a member of the group.
-   *
-   * <p><strong>Note</strong>: This method doesn't check whether the account exists! It also doesn't
-   * update the account index!
-   *
-   * @param db the {@code ReviewDb} instance to update
-   * @param groupUuid the UUID of the group
-   * @param accountId the ID of the account to add
-   * @throws OrmException if an error occurs while reading/writing from/to ReviewDb
-   * @throws NoSuchGroupException if the specified group doesn't exist
-   */
-  public void addGroupMember(ReviewDb db, AccountGroup.UUID groupUuid, Account.Id accountId)
-      throws OrmException, NoSuchGroupException {
-    AccountGroup group = getExistingGroup(db, groupUuid);
-    AccountGroup.Id groupId = group.getId();
-
-    if (isMember(db, groupId, accountId)) {
-      return;
-    }
-
-    db.accountGroupMembers()
-        .insert(
-            ImmutableList.of(
-                new AccountGroupMember(new AccountGroupMember.Key(accountId, groupId))));
-  }
-
-  private static AccountGroup getExistingGroup(ReviewDb db, AccountGroup.UUID groupUuid)
-      throws OrmException, NoSuchGroupException {
-    List<AccountGroup> accountGroups = db.accountGroups().byUUID(groupUuid).toList();
-    if (accountGroups.size() == 1) {
-      return Iterables.getOnlyElement(accountGroups);
-    } else if (accountGroups.isEmpty()) {
-      throw new NoSuchGroupException(groupUuid);
-    } else {
-      throw new OrmDuplicateKeyException("Duplicate group UUID " + groupUuid);
-    }
-  }
-
-  private static boolean isMember(ReviewDb db, AccountGroup.Id groupId, Account.Id accountId)
-      throws OrmException {
-    AccountGroupMember.Key key = new AccountGroupMember.Key(accountId, groupId);
-    return db.accountGroupMembers().get(key) != null;
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitAdminUser.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitAdminUser.java
deleted file mode 100644
index d02de6c..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitAdminUser.java
+++ /dev/null
@@ -1,197 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.pgm.init;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.client.AuthType;
-import com.google.gerrit.pgm.init.api.AllUsersNameOnInitProvider;
-import com.google.gerrit.pgm.init.api.ConsoleUI;
-import com.google.gerrit.pgm.init.api.InitFlags;
-import com.google.gerrit.pgm.init.api.InitStep;
-import com.google.gerrit.pgm.init.api.SequencesOnInit;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.AccountSshKey;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.group.InternalGroup;
-import com.google.gerrit.server.index.account.AccountIndex;
-import com.google.gerrit.server.index.account.AccountIndexCollection;
-import com.google.gerrit.server.index.group.GroupIndex;
-import com.google.gerrit.server.index.group.GroupIndexCollection;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import org.apache.commons.validator.routines.EmailValidator;
-
-public class InitAdminUser implements InitStep {
-  private final InitFlags flags;
-  private final ConsoleUI ui;
-  private final AllUsersNameOnInitProvider allUsers;
-  private final AccountsOnInit accounts;
-  private final VersionedAuthorizedKeysOnInit.Factory authorizedKeysFactory;
-  private final ExternalIdsOnInit externalIds;
-  private final SequencesOnInit sequencesOnInit;
-  private final GroupsOnInit groupsOnInit;
-  private SchemaFactory<ReviewDb> dbFactory;
-  private AccountIndexCollection accountIndexCollection;
-  private GroupIndexCollection groupIndexCollection;
-
-  @Inject
-  InitAdminUser(
-      InitFlags flags,
-      ConsoleUI ui,
-      AllUsersNameOnInitProvider allUsers,
-      AccountsOnInit accounts,
-      VersionedAuthorizedKeysOnInit.Factory authorizedKeysFactory,
-      ExternalIdsOnInit externalIds,
-      SequencesOnInit sequencesOnInit,
-      GroupsOnInit groupsOnInit) {
-    this.flags = flags;
-    this.ui = ui;
-    this.allUsers = allUsers;
-    this.accounts = accounts;
-    this.authorizedKeysFactory = authorizedKeysFactory;
-    this.externalIds = externalIds;
-    this.sequencesOnInit = sequencesOnInit;
-    this.groupsOnInit = groupsOnInit;
-  }
-
-  @Override
-  public void run() {}
-
-  @Inject(optional = true)
-  void set(SchemaFactory<ReviewDb> dbFactory) {
-    this.dbFactory = dbFactory;
-  }
-
-  @Inject(optional = true)
-  void set(AccountIndexCollection accountIndexCollection) {
-    this.accountIndexCollection = accountIndexCollection;
-  }
-
-  @Inject(optional = true)
-  void set(GroupIndexCollection groupIndexCollection) {
-    this.groupIndexCollection = groupIndexCollection;
-  }
-
-  @Override
-  public void postRun() throws Exception {
-    AuthType authType = flags.cfg.getEnum(AuthType.values(), "auth", null, "type", null);
-    if (authType != AuthType.DEVELOPMENT_BECOME_ANY_ACCOUNT) {
-      return;
-    }
-
-    try (ReviewDb db = dbFactory.open()) {
-      if (!accounts.hasAnyAccount()) {
-        ui.header("Gerrit Administrator");
-        if (ui.yesno(true, "Create administrator user")) {
-          Account.Id id = new Account.Id(sequencesOnInit.nextAccountId(db));
-          String username = ui.readString("admin", "username");
-          String name = ui.readString("Administrator", "name");
-          String httpPassword = ui.readString("secret", "HTTP password");
-          AccountSshKey sshKey = readSshKey(id);
-          String email = readEmail(sshKey);
-
-          List<ExternalId> extIds = new ArrayList<>(2);
-          extIds.add(ExternalId.createUsername(username, id, httpPassword));
-
-          if (email != null) {
-            extIds.add(ExternalId.createEmail(id, email));
-          }
-          externalIds.insert("Add external IDs for initial admin user", extIds);
-
-          Account a = new Account(id, TimeUtil.nowTs());
-          a.setFullName(name);
-          a.setPreferredEmail(email);
-          accounts.insert(a);
-
-          AccountGroup adminGroup =
-              groupsOnInit.getExistingGroup(db, new AccountGroup.NameKey("Administrators"));
-          groupsOnInit.addGroupMember(db, adminGroup.getGroupUUID(), id);
-
-          if (sshKey != null) {
-            VersionedAuthorizedKeysOnInit authorizedKeys = authorizedKeysFactory.create(id).load();
-            authorizedKeys.addKey(sshKey.getSshPublicKey());
-            authorizedKeys.save("Add SSH key for initial admin user\n");
-          }
-
-          AccountState as =
-              new AccountState(new AllUsersName(allUsers.get()), a, extIds, new HashMap<>());
-          for (AccountIndex accountIndex : accountIndexCollection.getWriteIndexes()) {
-            accountIndex.replace(as);
-          }
-
-          InternalGroup adminInternalGroup =
-              InternalGroup.create(adminGroup, ImmutableSet.of(id), ImmutableSet.of());
-          for (GroupIndex groupIndex : groupIndexCollection.getWriteIndexes()) {
-            groupIndex.replace(adminInternalGroup);
-          }
-        }
-      }
-    }
-  }
-
-  private String readEmail(AccountSshKey sshKey) {
-    String defaultEmail = "admin@example.com";
-    if (sshKey != null && sshKey.getComment() != null) {
-      String c = sshKey.getComment().trim();
-      if (EmailValidator.getInstance().isValid(c)) {
-        defaultEmail = c;
-      }
-    }
-    return readEmail(defaultEmail);
-  }
-
-  private String readEmail(String defaultEmail) {
-    String email = ui.readString(defaultEmail, "email");
-    if (email != null && !EmailValidator.getInstance().isValid(email)) {
-      ui.message("error: invalid email address\n");
-      return readEmail(defaultEmail);
-    }
-    return email;
-  }
-
-  private AccountSshKey readSshKey(Account.Id id) throws IOException {
-    String defaultPublicSshKeyFile = "";
-    Path defaultPublicSshKeyPath = Paths.get(System.getProperty("user.home"), ".ssh", "id_rsa.pub");
-    if (Files.exists(defaultPublicSshKeyPath)) {
-      defaultPublicSshKeyFile = defaultPublicSshKeyPath.toString();
-    }
-    String publicSshKeyFile = ui.readString(defaultPublicSshKeyFile, "public SSH key file");
-    return !Strings.isNullOrEmpty(publicSshKeyFile) ? createSshKey(id, publicSshKeyFile) : null;
-  }
-
-  private AccountSshKey createSshKey(Account.Id id, String keyFile) throws IOException {
-    Path p = Paths.get(keyFile);
-    if (!Files.exists(p)) {
-      throw new IOException(String.format("Cannot add public SSH key: %s is not a file", keyFile));
-    }
-    String content = new String(Files.readAllBytes(p), UTF_8);
-    return new AccountSshKey(new AccountSshKey.Id(id, 1), content);
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitExperimental.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitExperimental.java
deleted file mode 100644
index b2cced9..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitExperimental.java
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.pgm.init;
-
-import com.google.gerrit.extensions.client.UiType;
-import com.google.gerrit.pgm.init.api.ConsoleUI;
-import com.google.gerrit.pgm.init.api.InitStep;
-import com.google.gerrit.pgm.init.api.Section;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.Locale;
-
-@Singleton
-class InitExperimental implements InitStep {
-  private final ConsoleUI ui;
-  private final Section gerrit;
-
-  @Inject
-  InitExperimental(ConsoleUI ui, Section.Factory sections) {
-    this.ui = ui;
-    this.gerrit = sections.get("gerrit", null);
-  }
-
-  @Override
-  public void run() {
-    ui.header("Experimental features");
-    if (!ui.yesno(false, "Enable any experimental features")) {
-      return;
-    }
-
-    initUis();
-  }
-
-  private void initUis() {
-    boolean pg = ui.yesno(true, "Default to PolyGerrit UI");
-    UiType uiType = pg ? UiType.POLYGERRIT : UiType.GWT;
-    gerrit.set("ui", uiType.name().toLowerCase(Locale.US));
-    if (pg) {
-      gerrit.set("enableGwtUi", Boolean.toString(ui.yesno(true, "Enable GWT UI")));
-    }
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitLabels.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitLabels.java
deleted file mode 100644
index c7309f8..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitLabels.java
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.pgm.init;
-
-import static com.google.gerrit.common.data.LabelFunction.MAX_WITH_BLOCK;
-
-import com.google.gerrit.pgm.init.api.AllProjectsConfig;
-import com.google.gerrit.pgm.init.api.ConsoleUI;
-import com.google.gerrit.pgm.init.api.InitStep;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.Arrays;
-import org.eclipse.jgit.lib.Config;
-
-@Singleton
-public class InitLabels implements InitStep {
-  private static final String KEY_COPY_ALL_SCORES_IF_NO_CODE_CHANGE = "copyAllScoresIfNoCodeChange";
-  private static final String KEY_LABEL = "label";
-  private static final String KEY_FUNCTION = "function";
-  private static final String KEY_VALUE = "value";
-  private static final String LABEL_VERIFIED = "Verified";
-
-  private final ConsoleUI ui;
-  private final AllProjectsConfig allProjectsConfig;
-
-  private boolean installVerified;
-
-  @Inject
-  InitLabels(ConsoleUI ui, AllProjectsConfig allProjectsConfig) {
-    this.ui = ui;
-    this.allProjectsConfig = allProjectsConfig;
-  }
-
-  @Override
-  public void run() throws Exception {
-    Config cfg = allProjectsConfig.load().getConfig();
-    if (cfg == null || !cfg.getSubsections(KEY_LABEL).contains(LABEL_VERIFIED)) {
-      ui.header("Review Labels");
-      installVerified = ui.yesno(false, "Install Verified label");
-    }
-  }
-
-  @Override
-  public void postRun() throws Exception {
-    Config cfg = allProjectsConfig.load().getConfig();
-    if (installVerified) {
-      cfg.setString(KEY_LABEL, LABEL_VERIFIED, KEY_FUNCTION, MAX_WITH_BLOCK.getFunctionName());
-      cfg.setStringList(
-          KEY_LABEL,
-          LABEL_VERIFIED,
-          KEY_VALUE,
-          Arrays.asList(new String[] {"-1 Fails", " 0 No score", "+1 Verified"}));
-      cfg.setBoolean(KEY_LABEL, LABEL_VERIFIED, KEY_COPY_ALL_SCORES_IF_NO_CODE_CHANGE, true);
-      allProjectsConfig.save("Configure 'Verified' label");
-    }
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitModule.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitModule.java
deleted file mode 100644
index f75d2dc..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitModule.java
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.pgm.init;
-
-import com.google.gerrit.extensions.config.FactoryModule;
-import com.google.gerrit.pgm.init.api.InitStep;
-import com.google.gerrit.pgm.init.api.Section;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.inject.binder.LinkedBindingBuilder;
-import com.google.inject.internal.UniqueAnnotations;
-import java.lang.annotation.Annotation;
-
-/** Injection configuration for the site initialization process. */
-public class InitModule extends FactoryModule {
-
-  private final boolean standalone;
-  private final boolean initDb;
-
-  public InitModule(boolean standalone, boolean initDb) {
-    this.standalone = standalone;
-    this.initDb = initDb;
-  }
-
-  @Override
-  protected void configure() {
-    bind(SitePaths.class);
-    bind(Libraries.class);
-    bind(LibraryDownloader.class);
-    factory(Section.Factory.class);
-    factory(VersionedAuthorizedKeysOnInit.Factory.class);
-
-    // Steps are executed in the order listed here.
-    //
-    step().to(UpgradeFrom2_0_x.class);
-
-    step().to(InitGitManager.class);
-    if (initDb) {
-      step().to(InitDatabase.class);
-    }
-    step().to(InitIndex.class);
-    step().to(InitAuth.class);
-    step().to(InitAdminUser.class);
-    step().to(InitLabels.class);
-    step().to(InitSendEmail.class);
-    if (standalone) {
-      step().to(InitContainer.class);
-    }
-    step().to(InitSshd.class);
-    step().to(InitHttpd.class);
-    step().to(InitCache.class);
-    step().to(InitPlugins.class);
-    step().to(InitDev.class);
-    step().to(InitExperimental.class);
-  }
-
-  protected LinkedBindingBuilder<InitStep> step() {
-    final Annotation id = UniqueAnnotations.create();
-    return bind(InitStep.class).annotatedWith(id);
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPluginStepsLoader.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPluginStepsLoader.java
deleted file mode 100644
index c1d142b..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPluginStepsLoader.java
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.pgm.init;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.extensions.annotations.PluginName;
-import com.google.gerrit.pgm.init.api.ConsoleUI;
-import com.google.gerrit.pgm.init.api.InitStep;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.plugins.JarPluginProvider;
-import com.google.gerrit.server.plugins.PluginUtil;
-import com.google.inject.AbstractModule;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.jar.Attributes;
-import java.util.jar.JarFile;
-
-@Singleton
-public class InitPluginStepsLoader {
-  private final Path pluginsDir;
-  private final Injector initInjector;
-  final ConsoleUI ui;
-
-  @Inject
-  public InitPluginStepsLoader(final ConsoleUI ui, SitePaths sitePaths, Injector initInjector) {
-    this.pluginsDir = sitePaths.plugins_dir;
-    this.initInjector = initInjector;
-    this.ui = ui;
-  }
-
-  public Collection<InitStep> getInitSteps() {
-    List<Path> jars = scanJarsInPluginsDirectory();
-    ArrayList<InitStep> pluginsInitSteps = new ArrayList<>();
-
-    for (Path jar : jars) {
-      InitStep init = loadInitStep(jar);
-      if (init != null) {
-        pluginsInitSteps.add(init);
-      }
-    }
-    return pluginsInitSteps;
-  }
-
-  @SuppressWarnings("resource")
-  private InitStep loadInitStep(Path jar) {
-    try {
-      URLClassLoader pluginLoader =
-          new URLClassLoader(
-              new URL[] {jar.toUri().toURL()}, InitPluginStepsLoader.class.getClassLoader());
-      try (JarFile jarFile = new JarFile(jar.toFile())) {
-        Attributes jarFileAttributes = jarFile.getManifest().getMainAttributes();
-        String initClassName = jarFileAttributes.getValue("Gerrit-InitStep");
-        if (initClassName == null) {
-          return null;
-        }
-        @SuppressWarnings("unchecked")
-        Class<? extends InitStep> initStepClass =
-            (Class<? extends InitStep>) pluginLoader.loadClass(initClassName);
-        return getPluginInjector(jar).getInstance(initStepClass);
-      } catch (ClassCastException e) {
-        ui.message(
-            "WARN: InitStep from plugin %s does not implement %s (Exception: %s)\n",
-            jar.getFileName(), InitStep.class.getName(), e.getMessage());
-        return null;
-      } catch (NoClassDefFoundError e) {
-        ui.message(
-            "WARN: Failed to run InitStep from plugin %s (Missing class: %s)\n",
-            jar.getFileName(), e.getMessage());
-        return null;
-      }
-    } catch (Exception e) {
-      ui.message(
-          "WARN: Cannot load and get plugin init step for %s (Exception: %s)\n",
-          jar, e.getMessage());
-      return null;
-    }
-  }
-
-  private Injector getPluginInjector(Path jarPath) throws IOException {
-    final String pluginName =
-        MoreObjects.firstNonNull(
-            JarPluginProvider.getJarPluginName(jarPath), PluginUtil.nameOf(jarPath));
-    return initInjector.createChildInjector(
-        new AbstractModule() {
-          @Override
-          protected void configure() {
-            bind(String.class).annotatedWith(PluginName.class).toInstance(pluginName);
-          }
-        });
-  }
-
-  private List<Path> scanJarsInPluginsDirectory() {
-    try {
-      return PluginUtil.listPlugins(pluginsDir, ".jar");
-    } catch (IOException e) {
-      ui.message("WARN: Cannot list %s: %s", pluginsDir.toAbsolutePath(), e.getMessage());
-      return ImmutableList.of();
-    }
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPlugins.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPlugins.java
deleted file mode 100644
index 385d20c..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPlugins.java
+++ /dev/null
@@ -1,209 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.pgm.init;
-
-import com.google.common.collect.FluentIterable;
-import com.google.gerrit.common.PluginData;
-import com.google.gerrit.pgm.init.api.ConsoleUI;
-import com.google.gerrit.pgm.init.api.InitFlags;
-import com.google.gerrit.pgm.init.api.InitStep;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.plugins.JarPluginProvider;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.List;
-import java.util.jar.Attributes;
-import java.util.jar.JarFile;
-import java.util.jar.Manifest;
-
-@Singleton
-public class InitPlugins implements InitStep {
-  public static final String PLUGIN_DIR = "WEB-INF/plugins/";
-  public static final String JAR = ".jar";
-
-  public static List<PluginData> listPlugins(
-      SitePaths site, PluginsDistribution pluginsDistribution) throws IOException {
-    return listPlugins(site, false, pluginsDistribution);
-  }
-
-  public static List<PluginData> listPluginsAndRemoveTempFiles(
-      SitePaths site, PluginsDistribution pluginsDistribution) throws IOException {
-    return listPlugins(site, true, pluginsDistribution);
-  }
-
-  private static List<PluginData> listPlugins(
-      final SitePaths site,
-      final boolean deleteTempPluginFile,
-      PluginsDistribution pluginsDistribution)
-      throws IOException {
-    final List<PluginData> result = new ArrayList<>();
-    pluginsDistribution.foreach(
-        new PluginsDistribution.Processor() {
-          @Override
-          public void process(String pluginName, InputStream in) throws IOException {
-            Path tmpPlugin = JarPluginProvider.storeInTemp(pluginName, in, site);
-            String pluginVersion = getVersion(tmpPlugin);
-            if (deleteTempPluginFile) {
-              Files.delete(tmpPlugin);
-            }
-            result.add(new PluginData(pluginName, pluginVersion, tmpPlugin));
-          }
-        });
-    return FluentIterable.from(result)
-        .toSortedList(
-            new Comparator<PluginData>() {
-              @Override
-              public int compare(PluginData a, PluginData b) {
-                return a.name.compareTo(b.name);
-              }
-            });
-  }
-
-  private final ConsoleUI ui;
-  private final SitePaths site;
-  private final InitFlags initFlags;
-  private final InitPluginStepsLoader pluginLoader;
-  private final PluginsDistribution pluginsDistribution;
-
-  private Injector postRunInjector;
-
-  @Inject
-  InitPlugins(
-      final ConsoleUI ui,
-      final SitePaths site,
-      InitFlags initFlags,
-      InitPluginStepsLoader pluginLoader,
-      PluginsDistribution pluginsDistribution) {
-    this.ui = ui;
-    this.site = site;
-    this.initFlags = initFlags;
-    this.pluginLoader = pluginLoader;
-    this.pluginsDistribution = pluginsDistribution;
-  }
-
-  @Override
-  public void run() throws Exception {
-    ui.header("Plugins");
-
-    installPlugins();
-    initPlugins();
-  }
-
-  @Override
-  public void postRun() throws Exception {
-    postInitPlugins();
-  }
-
-  @Inject(optional = true)
-  void setPostRunInjector(Injector injector) {
-    postRunInjector = injector;
-  }
-
-  private void installPlugins() throws IOException {
-    ui.message("Installing plugins.\n");
-    List<PluginData> plugins = listPlugins(site, pluginsDistribution);
-    for (PluginData plugin : plugins) {
-      String pluginName = plugin.name;
-      try {
-        final Path tmpPlugin = plugin.pluginPath;
-        Path p = site.plugins_dir.resolve(plugin.name + ".jar");
-        boolean upgrade = Files.exists(p);
-
-        if (!(initFlags.installPlugins.contains(pluginName)
-            || initFlags.installAllPlugins
-            || ui.yesno(upgrade, "Install plugin %s version %s", pluginName, plugin.version))) {
-          Files.deleteIfExists(tmpPlugin);
-          continue;
-        }
-
-        if (upgrade) {
-          final String installedPluginVersion = getVersion(p);
-          if (!ui.yesno(
-              upgrade,
-              "%s %s is already installed, overwrite it",
-              plugin.name,
-              installedPluginVersion)) {
-            Files.deleteIfExists(tmpPlugin);
-            continue;
-          }
-          try {
-            Files.delete(p);
-          } catch (IOException e) {
-            throw new IOException(
-                "Failed to delete plugin " + pluginName + ": " + p.toAbsolutePath(), e);
-          }
-        }
-        try {
-          Files.move(tmpPlugin, p);
-          if (upgrade) {
-            // or update that is not an upgrade
-            ui.message("Updated %s to %s\n", plugin.name, plugin.version);
-          } else {
-            ui.message("Installed %s %s\n", plugin.name, plugin.version);
-          }
-        } catch (IOException e) {
-          throw new IOException(
-              "Failed to install plugin "
-                  + pluginName
-                  + ": "
-                  + tmpPlugin.toAbsolutePath()
-                  + " -> "
-                  + p.toAbsolutePath(),
-              e);
-        }
-      } finally {
-        Files.deleteIfExists(plugin.pluginPath);
-      }
-    }
-    if (plugins.isEmpty()) {
-      ui.message("No plugins found to install.\n");
-    }
-  }
-
-  private void initPlugins() throws Exception {
-    ui.message("Initializing plugins.\n");
-    Collection<InitStep> initSteps = pluginLoader.getInitSteps();
-    if (initSteps.isEmpty()) {
-      ui.message("No plugins found with init steps.\n");
-    } else {
-      for (InitStep initStep : initSteps) {
-        initStep.run();
-      }
-    }
-  }
-
-  private void postInitPlugins() throws Exception {
-    for (InitStep initStep : pluginLoader.getInitSteps()) {
-      postRunInjector.injectMembers(initStep);
-      initStep.postRun();
-    }
-  }
-
-  private static String getVersion(Path plugin) throws IOException {
-    try (JarFile jarFile = new JarFile(plugin.toFile())) {
-      Manifest manifest = jarFile.getManifest();
-      Attributes main = manifest.getMainAttributes();
-      return main.getValue(Attributes.Name.IMPLEMENTATION_VERSION);
-    }
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitSshd.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitSshd.java
deleted file mode 100644
index d963cbb..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitSshd.java
+++ /dev/null
@@ -1,251 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.pgm.init;
-
-import static com.google.gerrit.pgm.init.api.InitUtil.hostname;
-import static java.nio.file.Files.exists;
-
-import com.google.gerrit.pgm.init.api.ConsoleUI;
-import com.google.gerrit.pgm.init.api.InitStep;
-import com.google.gerrit.pgm.init.api.Section;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.util.HostPlatform;
-import com.google.gerrit.server.util.SocketUtil;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.lang.ProcessBuilder.Redirect;
-import java.net.InetSocketAddress;
-
-/** Initialize the {@code sshd} configuration section. */
-@Singleton
-class InitSshd implements InitStep {
-  private final ConsoleUI ui;
-  private final SitePaths site;
-  private final Section sshd;
-  private final StaleLibraryRemover remover;
-
-  @Inject
-  InitSshd(ConsoleUI ui, SitePaths site, Section.Factory sections, StaleLibraryRemover remover) {
-    this.ui = ui;
-    this.site = site;
-    this.sshd = sections.get("sshd", null);
-    this.remover = remover;
-  }
-
-  @Override
-  public void run() throws Exception {
-    ui.header("SSH Daemon");
-
-    String hostname = "*";
-    int port = 29418;
-    String listenAddress = sshd.get("listenAddress");
-    if (isOff(listenAddress)) {
-      hostname = "off";
-    } else if (listenAddress != null && !listenAddress.isEmpty()) {
-      final InetSocketAddress addr = SocketUtil.parse(listenAddress, port);
-      hostname = SocketUtil.hostname(addr);
-      port = addr.getPort();
-    }
-
-    hostname = ui.readString(hostname, "Listen on address");
-    if (isOff(hostname)) {
-      sshd.set("listenAddress", "off");
-      return;
-    }
-
-    port = ui.readInt(port, "Listen on port");
-    sshd.set("listenAddress", SocketUtil.format(hostname, port));
-
-    generateSshHostKeys();
-    remover.remove("bc(pg|pkix|prov)-.*[.]jar");
-  }
-
-  private static boolean isOff(String listenHostname) {
-    return "off".equalsIgnoreCase(listenHostname)
-        || "none".equalsIgnoreCase(listenHostname)
-        || "no".equalsIgnoreCase(listenHostname);
-  }
-
-  private void generateSshHostKeys() throws InterruptedException, IOException {
-    if (!exists(site.ssh_key)
-        && (!exists(site.ssh_rsa)
-            || !exists(site.ssh_dsa)
-            || !exists(site.ssh_ed25519)
-            || !exists(site.ssh_ecdsa_256)
-            || !exists(site.ssh_ecdsa_384)
-            || !exists(site.ssh_ecdsa_521))) {
-      System.err.print("Generating SSH host key ...");
-      System.err.flush();
-
-      // Generate the SSH daemon host key using ssh-keygen.
-      //
-      final String comment = "gerrit-code-review@" + hostname();
-
-      // Workaround for JDK-6518827 - zero-length argument ignored on Win32
-      String emptyPassphraseArg = HostPlatform.isWin32() ? "\"\"" : "";
-      if (!exists(site.ssh_rsa)) {
-        System.err.print(" rsa...");
-        System.err.flush();
-        new ProcessBuilder(
-                "ssh-keygen",
-                "-q" /* quiet */,
-                "-t",
-                "rsa",
-                "-N",
-                emptyPassphraseArg,
-                "-C",
-                comment,
-                "-f",
-                site.ssh_rsa.toAbsolutePath().toString())
-            .redirectError(Redirect.INHERIT)
-            .redirectOutput(Redirect.INHERIT)
-            .start()
-            .waitFor();
-      }
-
-      if (!exists(site.ssh_dsa)) {
-        System.err.print(" dsa...");
-        System.err.flush();
-        new ProcessBuilder(
-                "ssh-keygen",
-                "-q" /* quiet */,
-                "-t",
-                "dsa",
-                "-P",
-                emptyPassphraseArg,
-                "-C",
-                comment,
-                "-f",
-                site.ssh_dsa.toAbsolutePath().toString())
-            .redirectError(Redirect.INHERIT)
-            .redirectOutput(Redirect.INHERIT)
-            .start()
-            .waitFor();
-      }
-
-      if (!exists(site.ssh_ed25519)) {
-        System.err.print(" ed25519...");
-        System.err.flush();
-        try {
-          new ProcessBuilder(
-                  "ssh-keygen",
-                  "-q" /* quiet */,
-                  "-t",
-                  "ed25519",
-                  "-P",
-                  emptyPassphraseArg,
-                  "-C",
-                  comment,
-                  "-f",
-                  site.ssh_ed25519.toAbsolutePath().toString())
-              .redirectError(Redirect.INHERIT)
-              .redirectOutput(Redirect.INHERIT)
-              .start()
-              .waitFor();
-        } catch (Exception e) {
-          // continue since older hosts won't be able to generate ed25519 keys.
-          System.err.print(" Failed to generate ed25519 key, continuing...");
-          System.err.flush();
-        }
-      }
-
-      if (!exists(site.ssh_ecdsa_256)) {
-        System.err.print(" ecdsa 256...");
-        System.err.flush();
-        try {
-          new ProcessBuilder(
-                  "ssh-keygen",
-                  "-q" /* quiet */,
-                  "-t",
-                  "ecdsa",
-                  "-b",
-                  "256",
-                  "-P",
-                  emptyPassphraseArg,
-                  "-C",
-                  comment,
-                  "-f",
-                  site.ssh_ecdsa_256.toAbsolutePath().toString())
-              .redirectError(Redirect.INHERIT)
-              .redirectOutput(Redirect.INHERIT)
-              .start()
-              .waitFor();
-        } catch (Exception e) {
-          // continue since older hosts won't be able to generate ecdsa keys.
-          System.err.print(" Failed to generate ecdsa 256 key, continuing...");
-          System.err.flush();
-        }
-      }
-
-      if (!exists(site.ssh_ecdsa_384)) {
-        System.err.print(" ecdsa 384...");
-        System.err.flush();
-        try {
-          new ProcessBuilder(
-                  "ssh-keygen",
-                  "-q" /* quiet */,
-                  "-t",
-                  "ecdsa",
-                  "-b",
-                  "384",
-                  "-P",
-                  emptyPassphraseArg,
-                  "-C",
-                  comment,
-                  "-f",
-                  site.ssh_ecdsa_384.toAbsolutePath().toString())
-              .redirectError(Redirect.INHERIT)
-              .redirectOutput(Redirect.INHERIT)
-              .start()
-              .waitFor();
-        } catch (Exception e) {
-          // continue since older hosts won't be able to generate ecdsa keys.
-          System.err.print(" Failed to generate ecdsa 384 key, continuing...");
-          System.err.flush();
-        }
-      }
-
-      if (!exists(site.ssh_ecdsa_521)) {
-        System.err.print(" ecdsa 521...");
-        System.err.flush();
-        try {
-          new ProcessBuilder(
-                  "ssh-keygen",
-                  "-q" /* quiet */,
-                  "-t",
-                  "ecdsa",
-                  "-b",
-                  "521",
-                  "-P",
-                  emptyPassphraseArg,
-                  "-C",
-                  comment,
-                  "-f",
-                  site.ssh_ecdsa_521.toAbsolutePath().toString())
-              .redirectError(Redirect.INHERIT)
-              .redirectOutput(Redirect.INHERIT)
-              .start()
-              .waitFor();
-        } catch (Exception e) {
-          // continue since older hosts won't be able to generate ecdsa keys.
-          System.err.print(" Failed to generate ecdsa 521 key, continuing...");
-          System.err.flush();
-        }
-      }
-      System.err.println(" done");
-    }
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/SitePathInitializer.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/SitePathInitializer.java
deleted file mode 100644
index be61061..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/SitePathInitializer.java
+++ /dev/null
@@ -1,179 +0,0 @@
-// 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.
-
-package com.google.gerrit.pgm.init;
-
-import static com.google.gerrit.common.FileUtil.chmod;
-import static com.google.gerrit.pgm.init.api.InitUtil.die;
-import static com.google.gerrit.pgm.init.api.InitUtil.extract;
-import static com.google.gerrit.pgm.init.api.InitUtil.mkdir;
-import static com.google.gerrit.pgm.init.api.InitUtil.savePublic;
-import static com.google.gerrit.pgm.init.api.InitUtil.version;
-
-import com.google.gerrit.common.FileUtil;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.pgm.init.api.ConsoleUI;
-import com.google.gerrit.pgm.init.api.InitFlags;
-import com.google.gerrit.pgm.init.api.InitStep;
-import com.google.gerrit.pgm.init.api.Section;
-import com.google.gerrit.pgm.init.api.Section.Factory;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.mail.EmailModule;
-import com.google.inject.Binding;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.TypeLiteral;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.List;
-
-/** Initialize (or upgrade) an existing site. */
-public class SitePathInitializer {
-  private final ConsoleUI ui;
-  private final InitFlags flags;
-  private final SitePaths site;
-  private final List<InitStep> steps;
-  private final Factory sectionFactory;
-  private final SecureStoreInitData secureStoreInitData;
-
-  @Inject
-  public SitePathInitializer(
-      final Injector injector,
-      final ConsoleUI ui,
-      final InitFlags flags,
-      final SitePaths site,
-      final Section.Factory sectionFactory,
-      @Nullable final SecureStoreInitData secureStoreInitData) {
-    this.ui = ui;
-    this.flags = flags;
-    this.site = site;
-    this.sectionFactory = sectionFactory;
-    this.secureStoreInitData = secureStoreInitData;
-    this.steps = stepsOf(injector);
-  }
-
-  public void run() throws Exception {
-    ui.header("Gerrit Code Review %s", version());
-
-    if (site.isNew) {
-      if (!ui.yesno(true, "Create '%s'", site.site_path.toAbsolutePath())) {
-        throw die("aborted by user");
-      }
-      FileUtil.mkdirsOrDie(site.site_path, "Cannot make directory");
-      flags.deleteOnFailure = true;
-    }
-
-    mkdir(site.bin_dir);
-    mkdir(site.etc_dir);
-    mkdir(site.lib_dir);
-    mkdir(site.tmp_dir);
-    mkdir(site.logs_dir);
-    mkdir(site.mail_dir);
-    mkdir(site.static_dir);
-    mkdir(site.plugins_dir);
-    mkdir(site.data_dir);
-
-    for (InitStep step : steps) {
-      if (step instanceof InitPlugins && flags.skipPlugins) {
-        continue;
-      }
-      step.run();
-    }
-
-    saveSecureStore();
-    savePublic(flags.cfg);
-
-    extract(site.gerrit_sh, getClass(), "gerrit.sh");
-    chmod(0755, site.gerrit_sh);
-    extract(site.gerrit_service, getClass(), "gerrit.service");
-    chmod(0755, site.gerrit_service);
-    extract(site.gerrit_socket, getClass(), "gerrit.socket");
-    chmod(0755, site.gerrit_socket);
-    chmod(0700, site.tmp_dir);
-
-    extractMailExample("Abandoned.soy");
-    extractMailExample("AbandonedHtml.soy");
-    extractMailExample("AddKey.soy");
-    extractMailExample("ChangeFooter.soy");
-    extractMailExample("ChangeFooterHtml.soy");
-    extractMailExample("ChangeSubject.soy");
-    extractMailExample("Comment.soy");
-    extractMailExample("CommentHtml.soy");
-    extractMailExample("CommentFooter.soy");
-    extractMailExample("CommentFooterHtml.soy");
-    extractMailExample("DeleteReviewer.soy");
-    extractMailExample("DeleteReviewerHtml.soy");
-    extractMailExample("DeleteVote.soy");
-    extractMailExample("DeleteVoteHtml.soy");
-    extractMailExample("Footer.soy");
-    extractMailExample("FooterHtml.soy");
-    extractMailExample("HeaderHtml.soy");
-    extractMailExample("Merged.soy");
-    extractMailExample("MergedHtml.soy");
-    extractMailExample("NewChange.soy");
-    extractMailExample("NewChangeHtml.soy");
-    extractMailExample("RegisterNewEmail.soy");
-    extractMailExample("ReplacePatchSet.soy");
-    extractMailExample("ReplacePatchSetHtml.soy");
-    extractMailExample("Restored.soy");
-    extractMailExample("RestoredHtml.soy");
-    extractMailExample("Reverted.soy");
-    extractMailExample("RevertedHtml.soy");
-    extractMailExample("SetAssignee.soy");
-    extractMailExample("SetAssigneeHtml.soy");
-
-    if (!ui.isBatch()) {
-      System.err.println();
-    }
-  }
-
-  public void postRun(Injector injector) throws Exception {
-    for (InitStep step : steps) {
-      if (step instanceof InitPlugins && flags.skipPlugins) {
-        continue;
-      }
-      injector.injectMembers(step);
-      step.postRun();
-    }
-  }
-
-  private void saveSecureStore() throws IOException {
-    if (secureStoreInitData != null) {
-      Path dst = site.lib_dir.resolve(secureStoreInitData.jarFile.getFileName());
-      Files.copy(secureStoreInitData.jarFile, dst);
-      Section gerritSection = sectionFactory.get("gerrit", null);
-      gerritSection.set("secureStoreClass", secureStoreInitData.className);
-    }
-  }
-
-  private void extractMailExample(String orig) throws Exception {
-    Path ex = site.mail_dir.resolve(orig + ".example");
-    extract(ex, EmailModule.class, orig);
-    chmod(0444, ex);
-  }
-
-  private static List<InitStep> stepsOf(Injector injector) {
-    final ArrayList<InitStep> r = new ArrayList<>();
-    for (Binding<InitStep> b : all(injector)) {
-      r.add(b.getProvider().get());
-    }
-    return r;
-  }
-
-  private static List<Binding<InitStep>> all(Injector injector) {
-    return injector.findBindingsByType(new TypeLiteral<InitStep>() {});
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_x.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_x.java
deleted file mode 100644
index f994432..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_x.java
+++ /dev/null
@@ -1,290 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.pgm.init;
-
-import static com.google.gerrit.pgm.init.api.InitUtil.die;
-import static com.google.gerrit.pgm.init.api.InitUtil.savePublic;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.gerrit.pgm.init.api.ConsoleUI;
-import com.google.gerrit.pgm.init.api.InitFlags;
-import com.google.gerrit.pgm.init.api.InitStep;
-import com.google.gerrit.pgm.init.api.Section;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.securestore.SecureStore;
-import com.google.gerrit.server.util.SocketUtil;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.net.InetSocketAddress;
-import java.net.URLDecoder;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.Arrays;
-import java.util.Map;
-import java.util.Properties;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.storage.file.FileBasedConfig;
-
-/** Upgrade from a 2.0.x site to a 2.1 site. */
-@Singleton
-class UpgradeFrom2_0_x implements InitStep {
-  static final String[] etcFiles = {
-    "gerrit.config", //
-    "secure.config", //
-    "replication.config", //
-    "ssh_host_rsa_key", //
-    "ssh_host_rsa_key.pub", //
-    "ssh_host_dsa_key", //
-    "ssh_host_dsa_key.pub", //
-    "ssh_host_key", //
-    "contact_information.pub", //
-    "gitweb_config.perl", //
-    "keystore", //
-    "GerritSite.css", //
-    "GerritSiteFooter.html", //
-    "GerritSiteHeader.html", //
-  };
-
-  private final ConsoleUI ui;
-
-  private final FileBasedConfig cfg;
-  private final SecureStore sec;
-  private final Path site_path;
-  private final Path etc_dir;
-  private final Section.Factory sections;
-
-  @Inject
-  UpgradeFrom2_0_x(
-      final SitePaths site,
-      final InitFlags flags,
-      final ConsoleUI ui,
-      final Section.Factory sections) {
-    this.ui = ui;
-    this.sections = sections;
-
-    this.cfg = flags.cfg;
-    this.sec = flags.sec;
-    this.site_path = site.site_path;
-    this.etc_dir = site.etc_dir;
-  }
-
-  boolean isNeedUpgrade() {
-    for (String name : etcFiles) {
-      if (Files.exists(site_path.resolve(name))) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  @Override
-  public void run() throws IOException, ConfigInvalidException {
-    if (!isNeedUpgrade()) {
-      return;
-    }
-
-    if (!ui.yesno(true, "Upgrade '%s'", site_path.toAbsolutePath())) {
-      throw die("aborted by user");
-    }
-
-    for (String name : etcFiles) {
-      Path src = site_path.resolve(name);
-      Path dst = etc_dir.resolve(name);
-      if (Files.exists(src)) {
-        if (Files.exists(dst)) {
-          throw die("File " + src + " would overwrite " + dst);
-        }
-        try {
-          Files.move(src, dst);
-        } catch (IOException e) {
-          throw die("Cannot rename " + src + " to " + dst, e);
-        }
-      }
-    }
-
-    // We have to reload the configuration after the rename as
-    // the initial load pulled up an non-existent (and thus
-    // believed to be empty) file.
-    //
-    cfg.load();
-
-    final Properties oldprop = readGerritServerProperties();
-    if (oldprop != null) {
-      final Section database = sections.get("database", null);
-
-      String url = oldprop.getProperty("url");
-      if (url != null && !convertUrl(database, url)) {
-        database.set("type", "jdbc");
-        database.set("driver", oldprop.getProperty("driver"));
-        database.set("url", url);
-      }
-
-      String username = oldprop.getProperty("user");
-      if (username == null || username.isEmpty()) {
-        username = oldprop.getProperty("username");
-      }
-      if (username != null && !username.isEmpty()) {
-        cfg.setString("database", null, "username", username);
-      }
-
-      String password = oldprop.getProperty("password");
-      if (password != null && !password.isEmpty()) {
-        sec.set("database", null, "password", password);
-      }
-    }
-
-    String[] values;
-
-    values = cfg.getStringList("ldap", null, "password");
-    cfg.unset("ldap", null, "password");
-    sec.setList("ldap", null, "password", Arrays.asList(values));
-
-    values = cfg.getStringList("sendemail", null, "smtpPass");
-    cfg.unset("sendemail", null, "smtpPass");
-    sec.setList("sendemail", null, "smtpPass", Arrays.asList(values));
-
-    savePublic(cfg);
-  }
-
-  private boolean convertUrl(Section database, String url) throws UnsupportedEncodingException {
-    String username = null;
-    String password = null;
-
-    if (url.contains("?")) {
-      final int q = url.indexOf('?');
-      for (String pair : url.substring(q + 1).split("&")) {
-        final int eq = pair.indexOf('=');
-        if (0 < eq) {
-          return false;
-        }
-
-        String n = URLDecoder.decode(pair.substring(0, eq), UTF_8.name());
-        String v = URLDecoder.decode(pair.substring(eq + 1), UTF_8.name());
-
-        if ("user".equals(n) || "username".equals(n)) {
-          username = v;
-
-        } else if ("password".equals(n)) {
-          password = v;
-
-        } else {
-          // There is a parameter setting we don't recognize, use the
-          // JDBC URL format instead to preserve the configuration.
-          //
-          return false;
-        }
-      }
-      url = url.substring(0, q);
-    }
-
-    if (url.startsWith("jdbc:h2:file:")) {
-      url = url.substring("jdbc:h2:file:".length());
-      database.set("type", "h2");
-      database.set("database", url);
-      return true;
-    }
-
-    if (url.startsWith("jdbc:postgresql://")) {
-      url = url.substring("jdbc:postgresql://".length());
-      final int sl = url.indexOf('/');
-      if (sl < 0) {
-        return false;
-      }
-
-      final InetSocketAddress addr = SocketUtil.parse(url.substring(0, sl), 0);
-      database.set("type", "postgresql");
-      sethost(database, addr);
-      database.set("database", url.substring(sl + 1));
-      setuser(database, username, password);
-      return true;
-    }
-
-    if (url.startsWith("jdbc:postgresql:")) {
-      url = url.substring("jdbc:postgresql:".length());
-      database.set("type", "postgresql");
-      database.set("hostname", "localhost");
-      database.set("database", url);
-      setuser(database, username, password);
-      return true;
-    }
-
-    if (url.startsWith("jdbc:mysql://")) {
-      url = url.substring("jdbc:mysql://".length());
-      final int sl = url.indexOf('/');
-      if (sl < 0) {
-        return false;
-      }
-
-      final InetSocketAddress addr = SocketUtil.parse(url.substring(0, sl), 0);
-      database.set("type", "mysql");
-      sethost(database, addr);
-      database.set("database", url.substring(sl + 1));
-      setuser(database, username, password);
-      return true;
-    }
-
-    return false;
-  }
-
-  private void sethost(Section database, InetSocketAddress addr) {
-    database.set("hostname", SocketUtil.hostname(addr));
-    if (0 < addr.getPort()) {
-      database.set("port", String.valueOf(addr.getPort()));
-    }
-  }
-
-  private void setuser(Section database, String username, String password) {
-    if (username != null && !username.isEmpty()) {
-      database.set("username", username);
-    }
-    if (password != null && !password.isEmpty()) {
-      sec.set("database", null, "password", password);
-    }
-  }
-
-  private Properties readGerritServerProperties() throws IOException {
-    final Properties srvprop = new Properties();
-    final String name = System.getProperty("GerritServer");
-    Path path;
-    if (name != null) {
-      path = Paths.get(name);
-    } else {
-      path = site_path.resolve("GerritServer.properties");
-      if (!Files.exists(path)) {
-        path = Paths.get("GerritServer.properties");
-      }
-    }
-    if (Files.exists(path)) {
-      try (InputStream in = Files.newInputStream(path)) {
-        srvprop.load(in);
-      } catch (IOException e) {
-        throw new IOException("Cannot read " + name, e);
-      }
-      final Properties dbprop = new Properties();
-      for (Map.Entry<Object, Object> e : srvprop.entrySet()) {
-        final String key = (String) e.getKey();
-        if (key.startsWith("database.")) {
-          dbprop.put(key.substring("database.".length()), e.getValue());
-        }
-      }
-      return dbprop;
-    }
-    return null;
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/VersionedAuthorizedKeysOnInit.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/VersionedAuthorizedKeysOnInit.java
deleted file mode 100644
index 8a1a5fa..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/VersionedAuthorizedKeysOnInit.java
+++ /dev/null
@@ -1,84 +0,0 @@
-// 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.
-
-package com.google.gerrit.pgm.init;
-
-import static com.google.common.base.Preconditions.checkState;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.pgm.init.api.AllUsersNameOnInitProvider;
-import com.google.gerrit.pgm.init.api.InitFlags;
-import com.google.gerrit.pgm.init.api.VersionedMetaDataOnInit;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountSshKey;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.account.AuthorizedKeys;
-import com.google.gerrit.server.account.VersionedAuthorizedKeys;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.util.List;
-import java.util.Optional;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.CommitBuilder;
-
-public class VersionedAuthorizedKeysOnInit extends VersionedMetaDataOnInit {
-  public interface Factory {
-    VersionedAuthorizedKeysOnInit create(Account.Id accountId);
-  }
-
-  private final Account.Id accountId;
-  private List<Optional<AccountSshKey>> keys;
-
-  @Inject
-  public VersionedAuthorizedKeysOnInit(
-      AllUsersNameOnInitProvider allUsers,
-      SitePaths site,
-      InitFlags flags,
-      @Assisted Account.Id accountId) {
-    super(flags, site, allUsers.get(), RefNames.refsUsers(accountId));
-    this.accountId = accountId;
-  }
-
-  @Override
-  public VersionedAuthorizedKeysOnInit load() throws IOException, ConfigInvalidException {
-    super.load();
-    return this;
-  }
-
-  @Override
-  protected void onLoad() throws IOException, ConfigInvalidException {
-    keys = AuthorizedKeys.parse(accountId, readUTF8(AuthorizedKeys.FILE_NAME));
-  }
-
-  public AccountSshKey addKey(String pub) {
-    checkState(keys != null, "SSH keys not loaded yet");
-    int seq = keys.isEmpty() ? 1 : keys.size() + 1;
-    AccountSshKey.Id keyId = new AccountSshKey.Id(accountId, seq);
-    AccountSshKey key = new VersionedAuthorizedKeys.SimpleSshKeyCreator().create(keyId, pub);
-    keys.add(Optional.of(key));
-    return key;
-  }
-
-  @Override
-  protected boolean onSave(CommitBuilder commit) throws IOException {
-    if (Strings.isNullOrEmpty(commit.getMessage())) {
-      commit.setMessage("Updated SSH keys\n");
-    }
-
-    saveUTF8(AuthorizedKeys.FILE_NAME, AuthorizedKeys.serialize(keys));
-    return true;
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/AllProjectsConfig.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/AllProjectsConfig.java
deleted file mode 100644
index 8c013ed..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/AllProjectsConfig.java
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.pgm.init.api;
-
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.git.GroupList;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.inject.Inject;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.RepositoryCache;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class AllProjectsConfig extends VersionedMetaDataOnInit {
-  private static final Logger log = LoggerFactory.getLogger(AllProjectsConfig.class);
-
-  private Config cfg;
-  private GroupList groupList;
-
-  @Inject
-  AllProjectsConfig(AllProjectsNameOnInitProvider allProjects, SitePaths site, InitFlags flags) {
-    super(flags, site, allProjects.get(), RefNames.REFS_CONFIG);
-  }
-
-  public Config getConfig() {
-    return cfg;
-  }
-
-  public GroupList getGroups() {
-    return groupList;
-  }
-
-  @Override
-  public AllProjectsConfig load() throws IOException, ConfigInvalidException {
-    super.load();
-    return this;
-  }
-
-  @Override
-  protected void onLoad() throws IOException, ConfigInvalidException {
-    groupList = readGroupList();
-    cfg = readConfig(ProjectConfig.PROJECT_CONFIG);
-  }
-
-  private GroupList readGroupList() throws IOException {
-    return GroupList.parse(
-        new Project.NameKey(project),
-        readUTF8(GroupList.FILE_NAME),
-        error -> log.error("Error parsing file {}: {}", GroupList.FILE_NAME, error.getMessage()));
-  }
-
-  public void save(String pluginName, String message) throws IOException, ConfigInvalidException {
-    save(
-        new PersonIdent(pluginName, pluginName + "@gerrit"),
-        "Update from plugin " + pluginName + ": " + message);
-  }
-
-  @Override
-  protected void save(PersonIdent ident, String msg) throws IOException, ConfigInvalidException {
-    super.save(ident, msg);
-
-    // we need to invalidate the JGit cache if the group list is invalidated in
-    // an unattended init step
-    RepositoryCache.clear();
-  }
-
-  @Override
-  protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException {
-    saveConfig(ProjectConfig.PROJECT_CONFIG, cfg);
-    saveGroupList();
-    return true;
-  }
-
-  private void saveGroupList() throws IOException {
-    saveUTF8(GroupList.FILE_NAME, groupList.asText());
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/Section.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/Section.java
deleted file mode 100644
index c1c8745..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/Section.java
+++ /dev/null
@@ -1,226 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.pgm.init.api;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.securestore.SecureStore;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.EnumSet;
-import java.util.Set;
-
-/** Helper to edit a section of the configuration files. */
-public class Section {
-  public interface Factory {
-    Section get(@Assisted("section") String section, @Assisted("subsection") String subsection);
-  }
-
-  private final InitFlags flags;
-  private final SitePaths site;
-  private final ConsoleUI ui;
-  private final String section;
-  private final String subsection;
-  private final SecureStore secureStore;
-
-  @Inject
-  public Section(
-      final InitFlags flags,
-      final SitePaths site,
-      final SecureStore secureStore,
-      final ConsoleUI ui,
-      @Assisted("section") final String section,
-      @Assisted("subsection") @Nullable final String subsection) {
-    this.flags = flags;
-    this.site = site;
-    this.ui = ui;
-    this.section = section;
-    this.subsection = subsection;
-    this.secureStore = secureStore;
-  }
-
-  public String get(String name) {
-    return flags.cfg.getString(section, subsection, name);
-  }
-
-  public void set(String name, String value) {
-    final ArrayList<String> all = new ArrayList<>();
-    all.addAll(Arrays.asList(flags.cfg.getStringList(section, subsection, name)));
-
-    if (value != null) {
-      if (all.size() == 0 || all.size() == 1) {
-        flags.cfg.setString(section, subsection, name, value);
-      } else {
-        all.set(0, value);
-        flags.cfg.setStringList(section, subsection, name, all);
-      }
-
-    } else if (all.size() == 1) {
-      flags.cfg.unset(section, subsection, name);
-    } else if (all.size() != 0) {
-      all.remove(0);
-      flags.cfg.setStringList(section, subsection, name, all);
-    }
-  }
-
-  public <T extends Enum<?>> void set(String name, T value) {
-    if (value != null) {
-      set(name, value.name());
-    } else {
-      unset(name);
-    }
-  }
-
-  public void unset(String name) {
-    set(name, (String) null);
-  }
-
-  public String string(String title, String name, String dv) {
-    return string(title, name, dv, false);
-  }
-
-  public String string(final String title, String name, String dv, boolean nullIfDefault) {
-    final String ov = get(name);
-    String nv = ui.readString(ov != null ? ov : dv, "%s", title);
-    if (nullIfDefault && nv.equals(dv)) {
-      nv = null;
-    }
-    if (!eq(ov, nv)) {
-      set(name, nv);
-    }
-    return nv;
-  }
-
-  public Path path(String title, String name, String defValue) {
-    return site.resolve(string(title, name, defValue));
-  }
-
-  public <T extends Enum<?>, E extends EnumSet<? extends T>> T select(
-      String title, String name, T defValue) {
-    return select(title, name, defValue, false);
-  }
-
-  public <T extends Enum<?>, E extends EnumSet<? extends T>> T select(
-      String title, String name, T defValue, boolean nullIfDefault) {
-    @SuppressWarnings("unchecked")
-    E allowedValues = (E) EnumSet.allOf(defValue.getClass());
-    return select(title, name, defValue, allowedValues, nullIfDefault);
-  }
-
-  public <T extends Enum<?>, E extends EnumSet<? extends T>> T select(
-      String title, String name, T defValue, E allowedValues) {
-    return select(title, name, defValue, allowedValues, false);
-  }
-
-  public <T extends Enum<?>, A extends EnumSet<? extends T>> T select(
-      String title, String name, T defValue, A allowedValues, boolean nullIfDefault) {
-    final boolean set = get(name) != null;
-    T oldValue = flags.cfg.getEnum(section, subsection, name, defValue);
-    T newValue = ui.readEnum(oldValue, allowedValues, "%s", title);
-    if (nullIfDefault && newValue == defValue) {
-      newValue = null;
-    }
-    if (!set || oldValue != newValue) {
-      if (newValue != null) {
-        set(name, newValue);
-      } else {
-        unset(name);
-      }
-    }
-    return newValue;
-  }
-
-  public String select(final String title, String name, String dv, Set<String> allowedValues) {
-    final String ov = get(name);
-    String nv = ui.readString(ov != null ? ov : dv, allowedValues, "%s", title);
-    if (!eq(ov, nv)) {
-      set(name, nv);
-    }
-    return nv;
-  }
-
-  public String password(String username, String password) {
-    final String ov = getSecure(password);
-
-    String user = flags.sec.get(section, subsection, username);
-    if (user == null) {
-      user = get(username);
-    }
-
-    if (user == null) {
-      flags.sec.unset(section, subsection, password);
-      return null;
-    }
-
-    if (ov != null) {
-      // If the user already has a password stored, try to reuse it
-      // rather than prompting for a whole new one.
-      //
-      if (ui.isBatch() || !ui.yesno(false, "Change %s's password", user)) {
-        return ov;
-      }
-    }
-
-    final String nv = ui.password("%s's password", user);
-    if (!eq(ov, nv)) {
-      setSecure(password, nv);
-    }
-    return nv;
-  }
-
-  public String passwordForKey(String prompt, String passwordKey) {
-    String ov = getSecure(passwordKey);
-    if (ov != null) {
-      // If the password is already stored, try to reuse it
-      // rather than prompting for a whole new one.
-      //
-      if (ui.isBatch() || !ui.yesno(false, "Change %s", passwordKey)) {
-        return ov;
-      }
-    }
-
-    final String nv = ui.password("%s", prompt);
-    if (!eq(ov, nv)) {
-      setSecure(passwordKey, nv);
-    }
-    return nv;
-  }
-
-  public String getSecure(String name) {
-    return flags.sec.get(section, subsection, name);
-  }
-
-  public void setSecure(String name, String value) {
-    if (value != null) {
-      secureStore.set(section, subsection, name, value);
-    } else {
-      secureStore.unset(section, subsection, name);
-    }
-  }
-
-  String getName() {
-    return section;
-  }
-
-  private static boolean eq(String a, String b) {
-    if (a == null && b == null) {
-      return true;
-    }
-    return a != null && a.equals(b);
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/SequencesOnInit.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/SequencesOnInit.java
deleted file mode 100644
index e1cef62..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/SequencesOnInit.java
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.pgm.init.api;
-
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.Sequences;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.notedb.RepoSequence;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-@Singleton
-public class SequencesOnInit {
-  private final GitRepositoryManager repoManager;
-  private final AllUsersNameOnInitProvider allUsersName;
-
-  @Inject
-  SequencesOnInit(GitRepositoryManagerOnInit repoManager, AllUsersNameOnInitProvider allUsersName) {
-    this.repoManager = repoManager;
-    this.allUsersName = allUsersName;
-  }
-
-  public int nextAccountId(ReviewDb db) throws OrmException {
-    @SuppressWarnings("deprecation")
-    RepoSequence.Seed accountSeed = () -> db.nextAccountId();
-    RepoSequence accountSeq =
-        new RepoSequence(
-            repoManager,
-            GitReferenceUpdated.DISABLED,
-            new Project.NameKey(allUsersName.get()),
-            Sequences.NAME_ACCOUNTS,
-            accountSeed,
-            1);
-    return accountSeq.next();
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/VersionedMetaDataOnInit.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/VersionedMetaDataOnInit.java
deleted file mode 100644
index c34b423..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/VersionedMetaDataOnInit.java
+++ /dev/null
@@ -1,146 +0,0 @@
-// 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.
-
-package com.google.gerrit.pgm.init.api;
-
-import com.google.gerrit.server.GerritPersonIdentProvider;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.git.VersionedMetaData;
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Path;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.internal.storage.file.FileRepository;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.lib.RepositoryCache.FileKey;
-import org.eclipse.jgit.revwalk.RevTree;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.util.FS;
-
-public abstract class VersionedMetaDataOnInit extends VersionedMetaData {
-
-  protected final String project;
-  private final InitFlags flags;
-  private final SitePaths site;
-  private final String ref;
-
-  protected VersionedMetaDataOnInit(InitFlags flags, SitePaths site, String project, String ref) {
-    this.flags = flags;
-    this.site = site;
-    this.project = project;
-    this.ref = ref;
-  }
-
-  @Override
-  protected String getRefName() {
-    return ref;
-  }
-
-  public VersionedMetaDataOnInit load() throws IOException, ConfigInvalidException {
-    File path = getPath();
-    if (path != null) {
-      try (Repository repo = new FileRepository(path)) {
-        load(repo);
-      }
-    }
-    return this;
-  }
-
-  public void save(String message) throws IOException, ConfigInvalidException {
-    save(new GerritPersonIdentProvider(flags.cfg).get(), message);
-  }
-
-  protected void save(PersonIdent ident, String msg) throws IOException, ConfigInvalidException {
-    File path = getPath();
-    if (path == null) {
-      throw new IOException(project + " does not exist.");
-    }
-
-    try (Repository repo = new FileRepository(path);
-        ObjectInserter i = repo.newObjectInserter();
-        ObjectReader r = repo.newObjectReader();
-        RevWalk rw = new RevWalk(r)) {
-      inserter = i;
-      reader = r;
-
-      RevTree srcTree = revision != null ? rw.parseTree(revision) : null;
-      newTree = readTree(srcTree);
-
-      CommitBuilder commit = new CommitBuilder();
-      commit.setAuthor(ident);
-      commit.setCommitter(ident);
-      commit.setMessage(msg);
-
-      onSave(commit);
-
-      ObjectId res = newTree.writeTree(inserter);
-      if (res.equals(srcTree)) {
-        return;
-      }
-      commit.setTreeId(res);
-
-      if (revision != null) {
-        commit.addParentId(revision);
-      }
-      ObjectId newRevision = inserter.insert(commit);
-      updateRef(repo, ident, newRevision, "commit: " + msg);
-      revision = rw.parseCommit(newRevision);
-    } finally {
-      inserter = null;
-      reader = null;
-    }
-  }
-
-  private void updateRef(Repository repo, PersonIdent ident, ObjectId newRevision, String refLogMsg)
-      throws IOException {
-    RefUpdate ru = repo.updateRef(getRefName());
-    ru.setRefLogIdent(ident);
-    ru.setNewObjectId(newRevision);
-    ru.setExpectedOldObjectId(revision);
-    ru.setRefLogMessage(refLogMsg, false);
-    RefUpdate.Result r = ru.update();
-    switch (r) {
-      case FAST_FORWARD:
-      case NEW:
-      case NO_CHANGE:
-        break;
-      case FORCED:
-      case IO_FAILURE:
-      case LOCK_FAILURE:
-      case NOT_ATTEMPTED:
-      case REJECTED:
-      case REJECTED_CURRENT_BRANCH:
-      case RENAMED:
-      case REJECTED_MISSING_OBJECT:
-      case REJECTED_OTHER_REASON:
-      default:
-        throw new IOException(
-            "Failed to update " + getRefName() + " of " + project + ": " + r.name());
-    }
-  }
-
-  private File getPath() {
-    Path basePath = site.resolve(flags.cfg.getString("gerrit", null, "basePath"));
-    if (basePath == null) {
-      throw new IllegalStateException("gerrit.basePath must be configured");
-    }
-    return FileKey.resolve(basePath.resolve(project).toFile(), FS.DETECTED);
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/rules/PrologCompiler.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/rules/PrologCompiler.java
deleted file mode 100644
index 4ad7701..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/rules/PrologCompiler.java
+++ /dev/null
@@ -1,306 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.pgm.rules;
-
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.common.Version;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import com.googlecode.prolog_cafe.compiler.Compiler;
-import com.googlecode.prolog_cafe.exceptions.CompileException;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-import java.util.concurrent.Callable;
-import java.util.jar.Attributes;
-import java.util.jar.JarEntry;
-import java.util.jar.JarOutputStream;
-import java.util.jar.Manifest;
-import javax.tools.Diagnostic;
-import javax.tools.DiagnosticCollector;
-import javax.tools.JavaCompiler;
-import javax.tools.JavaFileObject;
-import javax.tools.StandardJavaFileManager;
-import javax.tools.ToolProvider;
-import org.eclipse.jgit.errors.MissingObjectException;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-
-/**
- * Helper class for Rulec: does the actual prolog -> java src -> class -> jar work Finds rules.pl in
- * refs/meta/config branch Creates rules-(sha1 of rules.pl).jar in (site-path)/cache/rules
- */
-public class PrologCompiler implements Callable<PrologCompiler.Status> {
-  public interface Factory {
-    PrologCompiler create(Repository git);
-  }
-
-  public enum Status {
-    NO_RULES,
-    COMPILED
-  }
-
-  private final Path ruleDir;
-  private final Repository git;
-
-  @Inject
-  PrologCompiler(
-      @GerritServerConfig Config config, SitePaths site, @Assisted Repository gitRepository) {
-    Path cacheDir = site.resolve(config.getString("cache", null, "directory"));
-    ruleDir = cacheDir != null ? cacheDir.resolve("rules") : null;
-    git = gitRepository;
-  }
-
-  @Override
-  public Status call() throws IOException, CompileException {
-    ObjectId metaConfig = git.resolve(RefNames.REFS_CONFIG);
-    if (metaConfig == null) {
-      return Status.NO_RULES;
-    }
-
-    ObjectId rulesId = git.resolve(metaConfig.name() + ":rules.pl");
-    if (rulesId == null) {
-      return Status.NO_RULES;
-    }
-
-    if (ruleDir == null) {
-      throw new CompileException("Caching not enabled");
-    }
-    Files.createDirectories(ruleDir);
-
-    File tempDir = File.createTempFile("GerritCodeReview_", ".rulec");
-    if (!tempDir.delete() || !tempDir.mkdir()) {
-      throw new IOException("Cannot create " + tempDir);
-    }
-    try {
-      // Try to make the directory accessible only by this process.
-      // This may help to prevent leaking rule data to outsiders.
-      tempDir.setReadable(true, true);
-      tempDir.setWritable(true, true);
-      tempDir.setExecutable(true, true);
-
-      compileProlog(rulesId, tempDir);
-      compileJava(tempDir);
-
-      Path jarPath = ruleDir.resolve("rules-" + rulesId.getName() + ".jar");
-      List<String> classFiles = getRelativePaths(tempDir, ".class");
-      createJar(jarPath, classFiles, tempDir, metaConfig, rulesId);
-
-      return Status.COMPILED;
-    } finally {
-      deleteAllFiles(tempDir);
-    }
-  }
-
-  /** Creates a copy of rules.pl and compiles it into Java sources. */
-  private void compileProlog(ObjectId prolog, File tempDir) throws IOException, CompileException {
-    File tempRules = copyToTempFile(prolog, tempDir);
-    try {
-      Compiler comp = new Compiler();
-      comp.prologToJavaSource(tempRules.getPath(), tempDir.getPath());
-    } finally {
-      tempRules.delete();
-    }
-  }
-
-  private File copyToTempFile(ObjectId blobId, File tempDir)
-      throws IOException, FileNotFoundException, MissingObjectException {
-    // Any leak of tmp caused by this method failing will be cleaned
-    // up by our caller when tempDir is recursively deleted.
-    File tmp = File.createTempFile("rules", ".pl", tempDir);
-    try (OutputStream out = Files.newOutputStream(tmp.toPath())) {
-      git.open(blobId).copyTo(out);
-    }
-    return tmp;
-  }
-
-  /** Compile java src into java .class files */
-  private void compileJava(File tempDir) throws IOException, CompileException {
-    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
-    if (compiler == null) {
-      throw new CompileException("JDK required (running inside of JRE)");
-    }
-
-    DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>();
-    try (StandardJavaFileManager fileManager =
-        compiler.getStandardFileManager(diagnostics, null, null)) {
-      Iterable<? extends JavaFileObject> compilationUnits =
-          fileManager.getJavaFileObjectsFromFiles(getAllFiles(tempDir, ".java"));
-      ArrayList<String> options = new ArrayList<>();
-      String classpath = getMyClasspath();
-      if (classpath != null) {
-        options.add("-classpath");
-        options.add(classpath);
-      }
-      options.add("-d");
-      options.add(tempDir.getPath());
-      JavaCompiler.CompilationTask task =
-          compiler.getTask(null, fileManager, diagnostics, options, null, compilationUnits);
-      if (!task.call()) {
-        Locale myLocale = Locale.getDefault();
-        StringBuilder msg = new StringBuilder();
-        msg.append("Cannot compile to Java bytecode:");
-        for (Diagnostic<? extends JavaFileObject> err : diagnostics.getDiagnostics()) {
-          msg.append('\n');
-          msg.append(err.getKind());
-          msg.append(": ");
-          if (err.getSource() != null) {
-            msg.append(err.getSource().getName());
-          }
-          msg.append(':');
-          msg.append(err.getLineNumber());
-          msg.append(": ");
-          msg.append(err.getMessage(myLocale));
-        }
-        throw new CompileException(msg.toString());
-      }
-    }
-  }
-
-  private String getMyClasspath() {
-    StringBuilder cp = new StringBuilder();
-    appendClasspath(cp, getClass().getClassLoader());
-    return 0 < cp.length() ? cp.toString() : null;
-  }
-
-  private void appendClasspath(StringBuilder cp, ClassLoader classLoader) {
-    if (classLoader.getParent() != null) {
-      appendClasspath(cp, classLoader.getParent());
-    }
-    if (classLoader instanceof URLClassLoader) {
-      for (URL url : ((URLClassLoader) classLoader).getURLs()) {
-        if ("file".equals(url.getProtocol())) {
-          if (0 < cp.length()) {
-            cp.append(File.pathSeparatorChar);
-          }
-          cp.append(url.getPath());
-        }
-      }
-    }
-  }
-
-  /** Takes compiled prolog .class files, puts them into the jar file. */
-  private void createJar(
-      Path archiveFile, List<String> toBeJared, File tempDir, ObjectId metaConfig, ObjectId rulesId)
-      throws IOException {
-    long now = TimeUtil.nowMs();
-    Manifest mf = new Manifest();
-    mf.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
-    mf.getMainAttributes().putValue("Built-by", "Gerrit Code Review " + Version.getVersion());
-    if (git.getDirectory() != null) {
-      mf.getMainAttributes().putValue("Source-Repository", git.getDirectory().getPath());
-    }
-    mf.getMainAttributes().putValue("Source-Commit", metaConfig.name());
-    mf.getMainAttributes().putValue("Source-Blob", rulesId.name());
-
-    Path tmpjar = Files.createTempFile(archiveFile.getParent(), ".rulec_", ".jar");
-    try (OutputStream stream = Files.newOutputStream(tmpjar);
-        JarOutputStream out = new JarOutputStream(stream, mf)) {
-      byte[] buffer = new byte[10240];
-      // TODO: fixify this loop
-      for (String path : toBeJared) {
-        JarEntry jarAdd = new JarEntry(path);
-        File f = new File(tempDir, path);
-        jarAdd.setTime(now);
-        out.putNextEntry(jarAdd);
-        if (f.isFile()) {
-          try (InputStream in = Files.newInputStream(f.toPath())) {
-            while (true) {
-              int nRead = in.read(buffer, 0, buffer.length);
-              if (nRead <= 0) {
-                break;
-              }
-              out.write(buffer, 0, nRead);
-            }
-          }
-        }
-        out.closeEntry();
-      }
-    }
-
-    try {
-      Files.move(tmpjar, archiveFile);
-    } catch (IOException e) {
-      throw new IOException("Cannot replace " + archiveFile, e);
-    }
-  }
-
-  private List<File> getAllFiles(File dir, String extension) throws IOException {
-    ArrayList<File> fileList = new ArrayList<>();
-    getAllFiles(dir, extension, fileList);
-    return fileList;
-  }
-
-  private void getAllFiles(File dir, String extension, List<File> fileList) throws IOException {
-    for (File f : listFiles(dir)) {
-      if (f.getName().endsWith(extension)) {
-        fileList.add(f);
-      }
-      if (f.isDirectory()) {
-        getAllFiles(f, extension, fileList);
-      }
-    }
-  }
-
-  private List<String> getRelativePaths(File dir, String extension) throws IOException {
-    ArrayList<String> pathList = new ArrayList<>();
-    getRelativePaths(dir, extension, "", pathList);
-    return pathList;
-  }
-
-  private static void getRelativePaths(
-      File dir, String extension, String path, List<String> pathList) throws IOException {
-    for (File f : listFiles(dir)) {
-      if (f.getName().endsWith(extension)) {
-        pathList.add(path + f.getName());
-      }
-      if (f.isDirectory()) {
-        getRelativePaths(f, extension, path + f.getName() + "/", pathList);
-      }
-    }
-  }
-
-  private static void deleteAllFiles(File dir) throws IOException {
-    for (File f : listFiles(dir)) {
-      if (f.isDirectory()) {
-        deleteAllFiles(f);
-      } else {
-        f.delete();
-      }
-    }
-    dir.delete();
-  }
-
-  private static File[] listFiles(File dir) throws IOException {
-    File[] files = dir.listFiles();
-    if (files == null) {
-      throw new IOException("Failed to list directory: " + dir);
-    }
-    return files;
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/BatchProgramModule.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/BatchProgramModule.java
deleted file mode 100644
index 13f120a..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/BatchProgramModule.java
+++ /dev/null
@@ -1,184 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.pgm.util;
-
-import static com.google.inject.Scopes.SINGLETON;
-
-import com.google.common.cache.Cache;
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.extensions.api.projects.CommentLinkInfo;
-import com.google.gerrit.extensions.common.AccountVisibility;
-import com.google.gerrit.extensions.config.FactoryModule;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.rules.PrologModule;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountCacheImpl;
-import com.google.gerrit.server.account.AccountVisibilityProvider;
-import com.google.gerrit.server.account.CapabilityCollection;
-import com.google.gerrit.server.account.FakeRealm;
-import com.google.gerrit.server.account.GroupCacheImpl;
-import com.google.gerrit.server.account.GroupIncludeCacheImpl;
-import com.google.gerrit.server.account.Realm;
-import com.google.gerrit.server.account.externalids.ExternalIdModule;
-import com.google.gerrit.server.cache.CacheRemovalListener;
-import com.google.gerrit.server.cache.h2.H2CacheModule;
-import com.google.gerrit.server.cache.mem.DefaultMemoryCacheModule;
-import com.google.gerrit.server.change.ChangeJson;
-import com.google.gerrit.server.change.ChangeKindCacheImpl;
-import com.google.gerrit.server.change.MergeabilityCacheImpl;
-import com.google.gerrit.server.change.PatchSetInserter;
-import com.google.gerrit.server.change.RebaseChangeOp;
-import com.google.gerrit.server.config.AdministrateServerGroups;
-import com.google.gerrit.server.config.CanonicalWebUrl;
-import com.google.gerrit.server.config.CanonicalWebUrlProvider;
-import com.google.gerrit.server.config.DisableReverseDnsLookup;
-import com.google.gerrit.server.config.DisableReverseDnsLookupProvider;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.GitReceivePackGroups;
-import com.google.gerrit.server.config.GitUploadPackGroups;
-import com.google.gerrit.server.extensions.events.EventUtil;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.extensions.events.RevisionCreated;
-import com.google.gerrit.server.git.MergeUtil;
-import com.google.gerrit.server.git.SearchingChangeCacheImpl;
-import com.google.gerrit.server.git.TagCache;
-import com.google.gerrit.server.git.VisibleRefFilter;
-import com.google.gerrit.server.git.receive.ReceiveCommitsExecutorModule;
-import com.google.gerrit.server.group.GroupModule;
-import com.google.gerrit.server.mail.send.ReplacePatchSetSender;
-import com.google.gerrit.server.notedb.NoteDbModule;
-import com.google.gerrit.server.patch.DiffExecutorModule;
-import com.google.gerrit.server.patch.PatchListCacheImpl;
-import com.google.gerrit.server.project.CommentLinkProvider;
-import com.google.gerrit.server.project.CommitResource;
-import com.google.gerrit.server.project.DefaultPermissionBackendModule;
-import com.google.gerrit.server.project.ProjectCacheImpl;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.project.SectionSortCache;
-import com.google.gerrit.server.project.SubmitRuleEvaluator;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.ChangeQueryProcessor;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.inject.Inject;
-import com.google.inject.Module;
-import com.google.inject.TypeLiteral;
-import com.google.inject.util.Providers;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-import org.eclipse.jgit.lib.Config;
-
-/**
- * Module for programs that perform batch operations on a site.
- *
- * <p>Any program that requires this module likely also requires using {@link ThreadLimiter} to
- * limit the number of threads accessing the database concurrently.
- */
-public class BatchProgramModule extends FactoryModule {
-  private final Config cfg;
-  private final Module reviewDbModule;
-
-  @Inject
-  BatchProgramModule(@GerritServerConfig Config cfg, PerThreadReviewDbModule reviewDbModule) {
-    this.cfg = cfg;
-    this.reviewDbModule = reviewDbModule;
-  }
-
-  @SuppressWarnings("rawtypes")
-  @Override
-  protected void configure() {
-    install(reviewDbModule);
-    install(new DiffExecutorModule());
-    install(new ReceiveCommitsExecutorModule());
-    install(BatchUpdate.module());
-    install(PatchListCacheImpl.module());
-
-    // Plugins are not loaded and we're just running through each change
-    // once, so don't worry about cache removal.
-    bind(new TypeLiteral<DynamicSet<CacheRemovalListener>>() {})
-        .toInstance(DynamicSet.<CacheRemovalListener>emptySet());
-    bind(new TypeLiteral<DynamicMap<Cache<?, ?>>>() {})
-        .toInstance(DynamicMap.<Cache<?, ?>>emptyMap());
-    bind(new TypeLiteral<List<CommentLinkInfo>>() {})
-        .toProvider(CommentLinkProvider.class)
-        .in(SINGLETON);
-    bind(new TypeLiteral<DynamicMap<ChangeQueryProcessor.ChangeAttributeFactory>>() {})
-        .toInstance(DynamicMap.<ChangeQueryProcessor.ChangeAttributeFactory>emptyMap());
-    bind(new TypeLiteral<DynamicMap<RestView<CommitResource>>>() {})
-        .toInstance(DynamicMap.<RestView<CommitResource>>emptyMap());
-    bind(String.class)
-        .annotatedWith(CanonicalWebUrl.class)
-        .toProvider(CanonicalWebUrlProvider.class);
-    bind(Boolean.class)
-        .annotatedWith(DisableReverseDnsLookup.class)
-        .toProvider(DisableReverseDnsLookupProvider.class)
-        .in(SINGLETON);
-    bind(Realm.class).to(FakeRealm.class);
-    bind(IdentifiedUser.class).toProvider(Providers.<IdentifiedUser>of(null));
-    bind(ReplacePatchSetSender.Factory.class)
-        .toProvider(Providers.<ReplacePatchSetSender.Factory>of(null));
-    bind(CurrentUser.class).to(IdentifiedUser.class);
-    factory(MergeUtil.Factory.class);
-    factory(PatchSetInserter.Factory.class);
-    factory(RebaseChangeOp.Factory.class);
-    factory(VisibleRefFilter.Factory.class);
-
-    // As Reindex is a batch program, don't assume the index is available for
-    // the change cache.
-    bind(SearchingChangeCacheImpl.class).toProvider(Providers.<SearchingChangeCacheImpl>of(null));
-
-    bind(new TypeLiteral<ImmutableSet<GroupReference>>() {})
-        .annotatedWith(AdministrateServerGroups.class)
-        .toInstance(ImmutableSet.<GroupReference>of());
-    bind(new TypeLiteral<Set<AccountGroup.UUID>>() {})
-        .annotatedWith(GitUploadPackGroups.class)
-        .toInstance(Collections.<AccountGroup.UUID>emptySet());
-    bind(new TypeLiteral<Set<AccountGroup.UUID>>() {})
-        .annotatedWith(GitReceivePackGroups.class)
-        .toInstance(Collections.<AccountGroup.UUID>emptySet());
-
-    install(new BatchGitModule());
-    install(new DefaultPermissionBackendModule());
-    install(new DefaultMemoryCacheModule());
-    install(new H2CacheModule());
-    install(new ExternalIdModule());
-    install(new GroupModule());
-    install(new NoteDbModule(cfg));
-    install(new PrologModule());
-    install(AccountCacheImpl.module());
-    install(GroupCacheImpl.module());
-    install(GroupIncludeCacheImpl.module());
-    install(ProjectCacheImpl.module());
-    install(SectionSortCache.module());
-    install(ChangeKindCacheImpl.module());
-    install(MergeabilityCacheImpl.module());
-    install(TagCache.module());
-    factory(CapabilityCollection.Factory.class);
-    factory(ChangeData.AssistedFactory.class);
-    factory(ProjectState.Factory.class);
-    factory(SubmitRuleEvaluator.Factory.class);
-
-    bind(ChangeJson.Factory.class).toProvider(Providers.<ChangeJson.Factory>of(null));
-    bind(EventUtil.class).toProvider(Providers.<EventUtil>of(null));
-    bind(GitReferenceUpdated.class).toInstance(GitReferenceUpdated.DISABLED);
-    bind(RevisionCreated.class).toInstance(RevisionCreated.DISABLED);
-    bind(AccountVisibility.class).toProvider(AccountVisibilityProvider.class).in(SINGLETON);
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ErrorLogFile.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ErrorLogFile.java
deleted file mode 100644
index afb2fb4..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ErrorLogFile.java
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.pgm.util;
-
-import com.google.gerrit.common.FileUtil;
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.util.SystemLog;
-import java.io.IOException;
-import java.nio.file.Path;
-import net.logstash.log4j.JSONEventLayoutV1;
-import org.apache.log4j.ConsoleAppender;
-import org.apache.log4j.Level;
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
-import org.apache.log4j.PatternLayout;
-import org.eclipse.jgit.lib.Config;
-
-public class ErrorLogFile {
-  static final String LOG_NAME = "error_log";
-  static final String JSON_SUFFIX = ".json";
-
-  public static void errorOnlyConsole() {
-    LogManager.resetConfiguration();
-
-    final PatternLayout layout = new PatternLayout();
-    layout.setConversionPattern("%-5p %c %x: %m%n");
-
-    final ConsoleAppender dst = new ConsoleAppender();
-    dst.setLayout(layout);
-    dst.setTarget("System.err");
-    dst.setThreshold(Level.ERROR);
-    dst.activateOptions();
-
-    final Logger root = LogManager.getRootLogger();
-    root.removeAllAppenders();
-    root.addAppender(dst);
-  }
-
-  public static LifecycleListener start(Path sitePath, Config config) throws IOException {
-    Path logdir =
-        FileUtil.mkdirsOrDie(new SitePaths(sitePath).logs_dir, "Cannot create log directory");
-    if (SystemLog.shouldConfigure()) {
-      initLogSystem(logdir, config);
-    }
-
-    return new LifecycleListener() {
-      @Override
-      public void start() {}
-
-      @Override
-      public void stop() {
-        LogManager.shutdown();
-      }
-    };
-  }
-
-  private static void initLogSystem(Path logdir, Config config) {
-    final Logger root = LogManager.getRootLogger();
-    root.removeAllAppenders();
-
-    boolean json = config.getBoolean("log", "jsonLogging", false);
-    boolean text = config.getBoolean("log", "textLogging", true) || !json;
-
-    if (text) {
-      root.addAppender(
-          SystemLog.createAppender(
-              logdir, LOG_NAME, new PatternLayout("[%d] [%t] %-5p %c %x: %m%n")));
-    }
-
-    if (json) {
-      root.addAppender(
-          SystemLog.createAppender(logdir, LOG_NAME + JSON_SUFFIX, new JSONEventLayoutV1()));
-    }
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/LogFileCompressor.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/LogFileCompressor.java
deleted file mode 100644
index 853a43f..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/LogFileCompressor.java
+++ /dev/null
@@ -1,165 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.pgm.util;
-
-import static java.util.concurrent.TimeUnit.HOURS;
-import static java.util.concurrent.TimeUnit.MILLISECONDS;
-
-import com.google.common.io.ByteStreams;
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.gerrit.lifecycle.LifecycleModule;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.git.WorkQueue;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.nio.file.DirectoryStream;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.time.LocalDateTime;
-import java.time.ZoneId;
-import java.time.temporal.ChronoUnit;
-import java.util.concurrent.Future;
-import java.util.zip.GZIPOutputStream;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Compresses the old error logs. */
-public class LogFileCompressor implements Runnable {
-  private static final Logger log = LoggerFactory.getLogger(LogFileCompressor.class);
-
-  public static class Module extends LifecycleModule {
-    @Override
-    protected void configure() {
-      listener().to(Lifecycle.class);
-    }
-  }
-
-  static class Lifecycle implements LifecycleListener {
-    private final WorkQueue queue;
-    private final LogFileCompressor compressor;
-
-    @Inject
-    Lifecycle(WorkQueue queue, LogFileCompressor compressor) {
-      this.queue = queue;
-      this.compressor = compressor;
-    }
-
-    @Override
-    public void start() {
-      // compress log once and then schedule compression every day at 11:00pm
-      queue.getDefaultQueue().execute(compressor);
-      ZoneId zone = ZoneId.systemDefault();
-      LocalDateTime now = LocalDateTime.now(zone);
-      long milliSecondsUntil11pm =
-          now.until(now.withHour(23).withMinute(0).withSecond(0).withNano(0), ChronoUnit.MILLIS);
-      @SuppressWarnings("unused")
-      Future<?> possiblyIgnoredError =
-          queue
-              .getDefaultQueue()
-              .scheduleAtFixedRate(
-                  compressor, milliSecondsUntil11pm, HOURS.toMillis(24), MILLISECONDS);
-    }
-
-    @Override
-    public void stop() {}
-  }
-
-  private final Path logs_dir;
-
-  @Inject
-  LogFileCompressor(SitePaths site) {
-    logs_dir = resolve(site.logs_dir);
-  }
-
-  private static Path resolve(Path p) {
-    try {
-      return p.toRealPath().normalize();
-    } catch (IOException e) {
-      return p.toAbsolutePath().normalize();
-    }
-  }
-
-  @Override
-  public void run() {
-    try {
-      if (!Files.isDirectory(logs_dir)) {
-        return;
-      }
-      try (DirectoryStream<Path> list = Files.newDirectoryStream(logs_dir)) {
-        for (Path entry : list) {
-          if (!isLive(entry) && !isCompressed(entry) && isLogFile(entry)) {
-            compress(entry);
-          }
-        }
-      } catch (IOException e) {
-        log.error("Error listing logs to compress in " + logs_dir, e);
-      }
-    } catch (Exception e) {
-      log.error("Failed to compress log files: " + e.getMessage(), e);
-    }
-  }
-
-  private boolean isLive(Path entry) {
-    String name = entry.getFileName().toString();
-    return name.endsWith("_log")
-        || name.endsWith(".log")
-        || name.endsWith(".run")
-        || name.endsWith(".pid")
-        || name.endsWith(".json");
-  }
-
-  private boolean isCompressed(Path entry) {
-    String name = entry.getFileName().toString();
-    return name.endsWith(".gz") //
-        || name.endsWith(".zip") //
-        || name.endsWith(".bz2");
-  }
-
-  private boolean isLogFile(Path entry) {
-    return Files.isRegularFile(entry);
-  }
-
-  private void compress(Path src) {
-    Path dst = src.resolveSibling(src.getFileName() + ".gz");
-    Path tmp = src.resolveSibling(".tmp." + src.getFileName());
-    try {
-      try (InputStream in = Files.newInputStream(src);
-          OutputStream out = new GZIPOutputStream(Files.newOutputStream(tmp))) {
-        ByteStreams.copy(in, out);
-      }
-      tmp.toFile().setReadOnly();
-      try {
-        Files.move(tmp, dst);
-      } catch (IOException e) {
-        throw new IOException("Cannot rename " + tmp + " to " + dst, e);
-      }
-      Files.delete(src);
-    } catch (IOException e) {
-      log.error("Cannot compress " + src, e);
-      try {
-        Files.deleteIfExists(tmp);
-      } catch (IOException e2) {
-        log.warn("Failed to delete temporary log file " + tmp, e2);
-      }
-    }
-  }
-
-  @Override
-  public String toString() {
-    return "Log File Compressor";
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/RuntimeShutdown.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/RuntimeShutdown.java
deleted file mode 100644
index c9df7e7..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/RuntimeShutdown.java
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.pgm.util;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class RuntimeShutdown {
-  private static final ShutdownCallback cb = new ShutdownCallback();
-
-  /** Add a task to be performed when graceful shutdown is requested. */
-  public static void add(Runnable task) {
-    if (!cb.add(task)) {
-      // If the shutdown has already begun we cannot enqueue a new
-      // task. Instead trigger the task in the caller, without any
-      // of our locks held.
-      //
-      task.run();
-    }
-  }
-
-  /** Wait for the JVM shutdown to occur. */
-  public static void waitFor() {
-    cb.waitForShutdown();
-  }
-
-  public static void manualShutdown() {
-    cb.manualShutdown();
-  }
-
-  private RuntimeShutdown() {}
-
-  private static class ShutdownCallback extends Thread {
-    private static final Logger log = LoggerFactory.getLogger(ShutdownCallback.class);
-
-    private final List<Runnable> tasks = new ArrayList<>();
-    private boolean shutdownStarted;
-    private boolean shutdownComplete;
-
-    ShutdownCallback() {
-      setName("ShutdownCallback");
-    }
-
-    boolean add(Runnable newTask) {
-      synchronized (this) {
-        if (!shutdownStarted && !shutdownComplete) {
-          if (tasks.isEmpty()) {
-            Runtime.getRuntime().addShutdownHook(this);
-          }
-          tasks.add(newTask);
-          return true;
-        }
-        // We don't permit adding a task once shutdown has started.
-        //
-        return false;
-      }
-    }
-
-    @Override
-    public void run() {
-      log.debug("Graceful shutdown requested");
-
-      List<Runnable> taskList;
-      synchronized (this) {
-        shutdownStarted = true;
-        taskList = tasks;
-      }
-
-      for (Runnable task : taskList) {
-        try {
-          task.run();
-        } catch (Exception err) {
-          log.error("Cleanup task failed", err);
-        }
-      }
-
-      log.debug("Shutdown complete");
-
-      synchronized (this) {
-        shutdownComplete = true;
-        notifyAll();
-      }
-    }
-
-    void manualShutdown() {
-      Runtime.getRuntime().removeShutdownHook(this);
-      run();
-    }
-
-    void waitForShutdown() {
-      synchronized (this) {
-        while (!shutdownComplete) {
-          try {
-            wait();
-          } catch (InterruptedException e) {
-            return;
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteProgram.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteProgram.java
deleted file mode 100644
index b9e2ae6..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteProgram.java
+++ /dev/null
@@ -1,267 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.pgm.util;
-
-import static com.google.gerrit.server.config.GerritServerConfigModule.getSecureStoreClassName;
-import static com.google.inject.Scopes.SINGLETON;
-import static com.google.inject.Stage.PRODUCTION;
-
-import com.google.gerrit.common.Die;
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.gerrit.lifecycle.LifecycleModule;
-import com.google.gerrit.metrics.DisabledMetricMaker;
-import com.google.gerrit.metrics.MetricMaker;
-import com.google.gerrit.metrics.dropwizard.DropWizardMetricMaker;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.GerritServerConfigModule;
-import com.google.gerrit.server.config.SitePath;
-import com.google.gerrit.server.git.GitRepositoryManagerModule;
-import com.google.gerrit.server.notedb.NotesMigration;
-import com.google.gerrit.server.schema.DataSourceModule;
-import com.google.gerrit.server.schema.DataSourceProvider;
-import com.google.gerrit.server.schema.DataSourceType;
-import com.google.gerrit.server.schema.DatabaseModule;
-import com.google.gerrit.server.schema.SchemaModule;
-import com.google.gerrit.server.securestore.SecureStoreClassName;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.AbstractModule;
-import com.google.inject.Binding;
-import com.google.inject.CreationException;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import com.google.inject.Key;
-import com.google.inject.Module;
-import com.google.inject.Provider;
-import com.google.inject.ProvisionException;
-import com.google.inject.TypeLiteral;
-import com.google.inject.name.Named;
-import com.google.inject.name.Names;
-import com.google.inject.spi.Message;
-import com.google.inject.util.Providers;
-import java.lang.annotation.Annotation;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.List;
-import javax.sql.DataSource;
-import org.eclipse.jgit.lib.Config;
-import org.kohsuke.args4j.Option;
-
-public abstract class SiteProgram extends AbstractProgram {
-  private static final String CONNECTION_ERROR = "Cannot connect to SQL database";
-
-  @Option(
-      name = "--site-path",
-      aliases = {"-d"},
-      usage = "Local directory containing site data")
-  private void setSitePath(String path) {
-    sitePath = Paths.get(path);
-  }
-
-  protected Provider<DataSource> dsProvider;
-
-  private Path sitePath = Paths.get(".");
-
-  protected SiteProgram() {}
-
-  protected SiteProgram(Path sitePath) {
-    this.sitePath = sitePath;
-  }
-
-  protected SiteProgram(Path sitePath, Provider<DataSource> dsProvider) {
-    this.sitePath = sitePath;
-    this.dsProvider = dsProvider;
-  }
-
-  /** @return the site path specified on the command line. */
-  protected Path getSitePath() {
-    return sitePath;
-  }
-
-  /** Ensures we are running inside of a valid site, otherwise throws a Die. */
-  protected void mustHaveValidSite() throws Die {
-    if (!Files.exists(sitePath.resolve("etc").resolve("gerrit.config"))) {
-      throw die("not a Gerrit site: '" + getSitePath() + "'\nPerhaps you need to run init first?");
-    }
-  }
-
-  /** @return provides database connectivity and site path. */
-  protected Injector createDbInjector(DataSourceProvider.Context context) {
-    return createDbInjector(false, context);
-  }
-
-  /** @return provides database connectivity and site path. */
-  protected Injector createDbInjector(boolean enableMetrics, DataSourceProvider.Context context) {
-    List<Module> modules = new ArrayList<>();
-
-    Module sitePathModule =
-        new AbstractModule() {
-          @Override
-          protected void configure() {
-            bind(Path.class).annotatedWith(SitePath.class).toInstance(getSitePath());
-            bind(String.class)
-                .annotatedWith(SecureStoreClassName.class)
-                .toProvider(Providers.of(getConfiguredSecureStoreClass()));
-          }
-        };
-    modules.add(sitePathModule);
-
-    if (enableMetrics) {
-      modules.add(new DropWizardMetricMaker.ApiModule());
-    } else {
-      modules.add(
-          new AbstractModule() {
-            @Override
-            protected void configure() {
-              bind(MetricMaker.class).to(DisabledMetricMaker.class);
-            }
-          });
-    }
-
-    modules.add(
-        new LifecycleModule() {
-          @Override
-          protected void configure() {
-            bind(DataSourceProvider.Context.class).toInstance(context);
-            if (dsProvider != null) {
-              bind(Key.get(DataSource.class, Names.named("ReviewDb")))
-                  .toProvider(dsProvider)
-                  .in(SINGLETON);
-              if (LifecycleListener.class.isAssignableFrom(dsProvider.getClass())) {
-                listener().toInstance((LifecycleListener) dsProvider);
-              }
-            } else {
-              bind(Key.get(DataSource.class, Names.named("ReviewDb")))
-                  .toProvider(SiteLibraryBasedDataSourceProvider.class)
-                  .in(SINGLETON);
-              listener().to(SiteLibraryBasedDataSourceProvider.class);
-            }
-          }
-        });
-    Module configModule = new GerritServerConfigModule();
-    modules.add(configModule);
-    Injector cfgInjector = Guice.createInjector(sitePathModule, configModule);
-    Config cfg = cfgInjector.getInstance(Key.get(Config.class, GerritServerConfig.class));
-    String dbType;
-    if (dsProvider != null) {
-      dbType = getDbType(dsProvider);
-    } else {
-      dbType = cfg.getString("database", null, "type");
-    }
-
-    if (dbType == null) {
-      throw new ProvisionException("database.type must be defined");
-    }
-
-    DataSourceType dst =
-        Guice.createInjector(new DataSourceModule(), configModule, sitePathModule)
-            .getInstance(Key.get(DataSourceType.class, Names.named(dbType.toLowerCase())));
-
-    modules.add(
-        new AbstractModule() {
-          @Override
-          protected void configure() {
-            bind(DataSourceType.class).toInstance(dst);
-          }
-        });
-    modules.add(new DatabaseModule());
-    modules.add(new SchemaModule());
-    modules.add(cfgInjector.getInstance(GitRepositoryManagerModule.class));
-    modules.add(new NotesMigration.Module());
-
-    try {
-      return Guice.createInjector(PRODUCTION, modules);
-    } catch (CreationException ce) {
-      Message first = ce.getErrorMessages().iterator().next();
-      Throwable why = first.getCause();
-
-      if (why instanceof SQLException) {
-        throw die(CONNECTION_ERROR, why);
-      }
-      if (why instanceof OrmException
-          && why.getCause() != null
-          && "Unable to determine driver URL".equals(why.getMessage())) {
-        why = why.getCause();
-        if (isCannotCreatePoolException(why)) {
-          throw die(CONNECTION_ERROR, why.getCause());
-        }
-        throw die(CONNECTION_ERROR, why);
-      }
-
-      StringBuilder buf = new StringBuilder();
-      if (why != null) {
-        buf.append(why.getMessage());
-        why = why.getCause();
-      } else {
-        buf.append(first.getMessage());
-      }
-      while (why != null) {
-        buf.append("\n  caused by ");
-        buf.append(why.toString());
-        why = why.getCause();
-      }
-      throw die(buf.toString(), new RuntimeException("DbInjector failed", ce));
-    }
-  }
-
-  protected final String getConfiguredSecureStoreClass() {
-    return getSecureStoreClassName(sitePath);
-  }
-
-  private String getDbType(Provider<DataSource> dsProvider) {
-    String dbProductName;
-    try (Connection conn = dsProvider.get().getConnection()) {
-      dbProductName = conn.getMetaData().getDatabaseProductName().toLowerCase();
-    } catch (SQLException e) {
-      throw new RuntimeException(e);
-    }
-
-    List<Module> modules = new ArrayList<>();
-    modules.add(
-        new AbstractModule() {
-          @Override
-          protected void configure() {
-            bind(Path.class).annotatedWith(SitePath.class).toInstance(getSitePath());
-          }
-        });
-    modules.add(new GerritServerConfigModule());
-    modules.add(new DataSourceModule());
-    Injector i = Guice.createInjector(modules);
-    List<Binding<DataSourceType>> dsTypeBindings =
-        i.findBindingsByType(new TypeLiteral<DataSourceType>() {});
-    for (Binding<DataSourceType> binding : dsTypeBindings) {
-      Annotation annotation = binding.getKey().getAnnotation();
-      if (annotation instanceof Named) {
-        Named named = (Named) annotation;
-        if (named.value().toLowerCase().contains(dbProductName)) {
-          return named.value();
-        }
-      }
-    }
-    throw new IllegalStateException(
-        String.format(
-            "Cannot guess database type from the database product name '%s'", dbProductName));
-  }
-
-  @SuppressWarnings("deprecation")
-  private static boolean isCannotCreatePoolException(Throwable why) {
-    return why instanceof org.apache.commons.dbcp.SQLNestedException
-        && why.getCause() != null
-        && why.getMessage().startsWith("Cannot create PoolableConnectionFactory");
-  }
-}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ThreadLimiter.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ThreadLimiter.java
deleted file mode 100644
index d609c34..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ThreadLimiter.java
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.pgm.util;
-
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.ThreadSettingsConfig;
-import com.google.gerrit.server.schema.DataSourceType;
-import com.google.inject.Injector;
-import com.google.inject.Key;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-// TODO(dborowitz): Not necessary once we switch to NoteDb.
-/** Utility to limit threads used by a batch program. */
-public class ThreadLimiter {
-  private static final Logger log = LoggerFactory.getLogger(ThreadLimiter.class);
-
-  public static int limitThreads(Injector dbInjector, int threads) {
-    return limitThreads(
-        dbInjector.getInstance(Key.get(Config.class, GerritServerConfig.class)),
-        dbInjector.getInstance(DataSourceType.class),
-        dbInjector.getInstance(ThreadSettingsConfig.class),
-        threads);
-  }
-
-  private static int limitThreads(
-      Config cfg, DataSourceType dst, ThreadSettingsConfig threadSettingsConfig, int threads) {
-    boolean usePool = cfg.getBoolean("database", "connectionpool", dst.usePool());
-    int poolLimit = threadSettingsConfig.getDatabasePoolLimit();
-    if (usePool && threads > poolLimit) {
-      log.warn("Limiting program to " + poolLimit + " threads due to database.poolLimit");
-      return poolLimit;
-    }
-    return threads;
-  }
-
-  private ThreadLimiter() {}
-}
diff --git a/gerrit-pgm/src/main/resources/com/google/gerrit/pgm/ProtoGenHeader.txt b/gerrit-pgm/src/main/resources/com/google/gerrit/pgm/ProtoGenHeader.txt
deleted file mode 100644
index 757e8e2..0000000
--- a/gerrit-pgm/src/main/resources/com/google/gerrit/pgm/ProtoGenHeader.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (C) 2011 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.
-//
-// Gerrit Code Review (version @@VERSION@@)
-
-syntax = "proto2";
-
-option java_api_version = 2;
-option java_package = "com.google.gerrit.proto.reviewdb";
-
-package devtools.gerritcodereview;
diff --git a/gerrit-pgm/src/main/resources/com/google/gerrit/pgm/Startup.py b/gerrit-pgm/src/main/resources/com/google/gerrit/pgm/Startup.py
deleted file mode 100644
index cf6fac9..0000000
--- a/gerrit-pgm/src/main/resources/com/google/gerrit/pgm/Startup.py
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright (C) 2013 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.
-
-# -----------------------------------------------------------------------
-# Startup script for Gerrit Inspector - a Jython introspector
-# -----------------------------------------------------------------------
-
-import sys
-
-def print_help():
-  for (n, v) in vars(sys.modules['__main__']).items():
-    if not n.startswith("__") and not n in ['help', 'reload'] \
-       and str(type(v)) != "<type 'javapackage'>"             \
-       and not str(v).startswith("<module"):
-       print "\"%s\" is \"%s\"" % (n, v)
-  print
-  print "Welcome to the Gerrit Inspector"
-  print "Enter help() to see the above again, EOF to quit and stop Gerrit"
-
-print_help()
diff --git a/gerrit-pgm/src/main/resources/com/google/gerrit/pgm/init/gerrit.sh b/gerrit-pgm/src/main/resources/com/google/gerrit/pgm/init/gerrit.sh
deleted file mode 100755
index 1425766..0000000
--- a/gerrit-pgm/src/main/resources/com/google/gerrit/pgm/init/gerrit.sh
+++ /dev/null
@@ -1,583 +0,0 @@
-#!/bin/sh
-#
-# Launch Gerrit Code Review as a daemon process.
-
-# To get the service to restart correctly on reboot, uncomment below (3 lines):
-# ========================
-# chkconfig: 3 99 99
-# description: Gerrit Code Review
-# processname: gerrit
-# ========================
-
-### BEGIN INIT INFO
-# Provides:          gerrit
-# Required-Start:    $named $remote_fs $syslog
-# Required-Stop:     $named $remote_fs $syslog
-# Default-Start:     2 3 4 5
-# Default-Stop:      0 1 6
-# Short-Description: Start/stop Gerrit Code Review
-# Description:       Gerrit is a web based code review system, facilitating online code reviews
-#                    for projects using the Git version control system.
-### END INIT INFO
-
-# Configuration files:
-#
-# /etc/default/gerritcodereview
-#   If it exists, sourced at the start of this script. It may perform any
-#   sequence of shell commands, like setting relevant environment variables.
-#
-# The files will be checked for existence before being sourced.
-
-# Configuration variables.  These may be set in /etc/default/gerritcodereview.
-#
-# GERRIT_SITE
-#   Path of the Gerrit site to run.  $GERRIT_SITE/etc/gerrit.config
-#   will be used to configure the process.
-#
-# GERRIT_WAR
-#   Location of the gerrit.war download that we will execute.  Defaults to
-#   container.war property in $GERRIT_SITE/etc/gerrit.config.
-#
-# NO_START
-#   If set to "1" disables Gerrit from starting.
-#
-# START_STOP_DAEMON
-#   If set to "0" disables using start-stop-daemon.  This may need to
-#   be set on SuSE systems.
-
-if test -f /lib/lsb/init-functions ; then
-  . /lib/lsb/init-functions
-fi
-
-usage() {
-    me=`basename "$0"`
-    echo >&2 "Usage: $me {start|stop|restart|check|status|run|supervise|threads} [-d site]"
-    exit 1
-}
-
-test $# -gt 0 || usage
-
-##################################################
-# Some utility functions
-##################################################
-running() {
-  test -f $1 || return 1
-  PID=`cat $1`
-  ps -p $PID >/dev/null 2>/dev/null || return 1
-  return 0
-}
-
-thread_dump() {
-  test -f $1 || return 1
-  PID=`cat $1`
-  $JSTACK $PID || return 1
-  return 0;
-}
-
-get_config() {
-  if test -f "$GERRIT_CONFIG" ; then
-    if test "x$1" = x--int ; then
-      # Git might not be able to expand "8g" properly.  If it gives
-      # us 0 back retry for the raw string and expand ourselves.
-      #
-      n=`git config --file "$GERRIT_CONFIG" --int "$2"`
-      if test x0 = "x$n" ; then
-        n=`git config --file "$GERRIT_CONFIG" --get "$2"`
-        case "$n" in
-        *g) n=`expr ${n%%g} \* 1024`m ;;
-        *k) n=`expr ${n%%k} \* 1024` ;;
-        *)  : ;;
-        esac
-      fi
-      echo "$n"
-    else
-      git config --file "$GERRIT_CONFIG" $1 "$2"
-    fi
-  fi
-}
-
-##################################################
-# Get the action and options
-##################################################
-
-ACTION=$1
-shift
-
-while test $# -gt 0 ; do
-  case "$1" in
-  -d|--site-path)
-    shift
-    GERRIT_SITE=$1
-    shift
-    ;;
-  -d=*)
-    GERRIT_SITE=${1##-d=}
-    shift
-    ;;
-  --site-path=*)
-    GERRIT_SITE=${1##--site-path=}
-    shift
-    ;;
-
-  *)
-    usage
-  esac
-done
-
-test -z "$NO_START" && NO_START=0
-test -z "$START_STOP_DAEMON" && START_STOP_DAEMON=1
-
-##################################################
-# See if there's a default configuration file
-##################################################
-if test -f /etc/default/gerritcodereview ; then
-  . /etc/default/gerritcodereview
-fi
-
-##################################################
-# Set tmp if not already set.
-##################################################
-if test -z "$TMP" ; then
-  TMP=/tmp
-fi
-TMPJ=$TMP/j$$
-
-##################################################
-# Reasonable guess marker for a Gerrit site path.
-##################################################
-GERRIT_INSTALL_TRACE_FILE=etc/gerrit.config
-
-##################################################
-# No git in PATH? Needed for gerrit.config parsing
-##################################################
-if type git >/dev/null 2>&1 ; then
-  : OK
-else
-  echo >&2 "** ERROR: Cannot find git in PATH"
-  exit 1
-fi
-
-##################################################
-# Try to determine GERRIT_SITE if not set
-##################################################
-if test -z "$GERRIT_SITE" ; then
-  GERRIT_SITE_1=`dirname "$0"`/..
-  if test -f "${GERRIT_SITE_1}/${GERRIT_INSTALL_TRACE_FILE}" ; then
-    GERRIT_SITE=${GERRIT_SITE_1}
-  fi
-fi
-
-##################################################
-# No GERRIT_SITE yet? We're out of luck!
-##################################################
-if test -z "$GERRIT_SITE" ; then
-    echo >&2 "** ERROR: GERRIT_SITE not set"
-    exit 1
-fi
-
-INITIAL_DIR=`pwd`
-if cd "$GERRIT_SITE" ; then
-  GERRIT_SITE=`pwd`
-else
-  echo >&2 "** ERROR: Gerrit site $GERRIT_SITE not found"
-  exit 1
-fi
-
-#####################################################
-# Check that Gerrit is where we think it is
-#####################################################
-GERRIT_CONFIG="$GERRIT_SITE/$GERRIT_INSTALL_TRACE_FILE"
-test -f "$GERRIT_CONFIG" || {
-   echo "** ERROR: Gerrit is not initialized in $GERRIT_SITE"
-   exit 1
-}
-test -r "$GERRIT_CONFIG" || {
-   echo "** ERROR: $GERRIT_CONFIG is not readable!"
-   exit 1
-}
-
-GERRIT_PID="$GERRIT_SITE/logs/gerrit.pid"
-GERRIT_RUN="$GERRIT_SITE/logs/gerrit.run"
-GERRIT_TMP="$GERRIT_SITE/tmp"
-export GERRIT_TMP
-
-##################################################
-# Check for JAVA_HOME
-##################################################
-JAVA_HOME_OLD="$JAVA_HOME"
-JAVA_HOME=`get_config --get container.javaHome`
-if test -z "$JAVA_HOME" ; then
-  JAVA_HOME="$JAVA_HOME_OLD"
-fi
-if test -z "$JAVA_HOME" ; then
-    # If a java runtime is not defined, search the following
-    # directories for a JVM and sort by version. Use the highest
-    # version number.
-
-    JAVA_LOCATIONS="\
-        /usr/java \
-        /usr/bin \
-        /usr/local/bin \
-        /usr/local/java \
-        /usr/local/jdk \
-        /usr/local/jre \
-        /usr/lib/jvm \
-        /opt/java \
-        /opt/jdk \
-        /opt/jre \
-    "
-    for N in java jdk jre ; do
-      for L in $JAVA_LOCATIONS ; do
-        test -d "$L" || continue
-        find $L -name "$N" ! -type d | grep -v threads | while read J ; do
-          test -x "$J" || continue
-          VERSION=`eval "$J" -version 2>&1`
-          test $? = 0 || continue
-          VERSION=`expr "$VERSION" : '.*"\(1.[0-9\.]*\)["_]'`
-          test -z "$VERSION" && continue
-          expr "$VERSION" \< 1.2 >/dev/null && continue
-          echo "$VERSION:$J"
-        done
-      done
-    done | sort | tail -1 >"$TMPJ"
-    JAVA=`cat "$TMPJ" | cut -d: -f2`
-    JVERSION=`cat "$TMPJ" | cut -d: -f1`
-    rm -f "$TMPJ"
-
-    JAVA_HOME=`dirname "$JAVA"`
-    while test -n "$JAVA_HOME" \
-               -a "$JAVA_HOME" != "/" \
-               -a ! -f "$JAVA_HOME/lib/tools.jar" ; do
-      JAVA_HOME=`dirname "$JAVA_HOME"`
-    done
-    test -z "$JAVA_HOME" && JAVA_HOME=
-
-    echo "** INFO: Using $JAVA"
-fi
-
-if test -z "$JAVA" \
-     -a -n "$JAVA_HOME" \
-     -a -x "$JAVA_HOME/bin/java" \
-     -a ! -d "$JAVA_HOME/bin/java" ; then
-  JAVA="$JAVA_HOME/bin/java"
-fi
-
-if test -z "$JAVA" ; then
-  echo >&2 "Cannot find a JRE or JDK. Please ensure that the JAVA_HOME environment"
-  echo >&2 "variable or container.javaHome in $GERRIT_SITE/etc/gerrit.config is"
-  echo >&2 "set to a valid >=1.7 JRE location"
-  exit 1
-fi
-
-if test -z "$JSTACK"; then
-  JSTACK="$JAVA_HOME/bin/jstack"
-fi
-
-#####################################################
-# Add Gerrit properties to Java VM options.
-#####################################################
-
-GERRIT_OPTIONS=`get_config --get-all container.javaOptions | tr '\n' ' '`
-if test -n "$GERRIT_OPTIONS" ; then
-  JAVA_OPTIONS="$JAVA_OPTIONS $GERRIT_OPTIONS"
-fi
-
-GERRIT_MEMORY=`get_config --get container.heapLimit`
-if test -n "$GERRIT_MEMORY" ; then
-  JAVA_OPTIONS="$JAVA_OPTIONS -Xmx$GERRIT_MEMORY"
-fi
-
-GERRIT_FDS=`get_config --int core.packedGitOpenFiles`
-test -z "$GERRIT_FDS" && GERRIT_FDS=128
-FDS_MULTIPLIER=2
-USE_LFS=`get_config --get lfs.plugin`
-test -n "$USE_LFS" && FDS_MULTIPLIER=3
-
-GERRIT_FDS=`expr $FDS_MULTIPLIER \* $GERRIT_FDS`
-test $GERRIT_FDS -lt 1024 && GERRIT_FDS=1024
-
-GERRIT_STARTUP_TIMEOUT=`get_config --get container.startupTimeout`
-test -z "$GERRIT_STARTUP_TIMEOUT" && GERRIT_STARTUP_TIMEOUT=90  # seconds
-
-GERRIT_USER=`get_config --get container.user`
-
-#####################################################
-# Configure sane ulimits for a daemon of our size.
-#####################################################
-
-ulimit -c 0            ; # core file size
-ulimit -d unlimited    ; # data seg size
-ulimit -f unlimited    ; # file size
-ulimit -m >/dev/null 2>&1 && ulimit -m unlimited  ; # max memory size
-ulimit -n $GERRIT_FDS  ; # open files
-ulimit -t unlimited    ; # cpu time
-ulimit -v unlimited    ; # virtual memory
-
-ulimit -x >/dev/null 2>&1 && ulimit -x unlimited  ; # file locks
-
-#####################################################
-# This is how the Gerrit server will be started
-#####################################################
-
-if test -z "$GERRIT_WAR" ; then
-  GERRIT_WAR=`get_config --get container.war`
-fi
-if test -z "$GERRIT_WAR" ; then
-  GERRIT_WAR="$GERRIT_SITE/bin/gerrit.war"
-  test -f "$GERRIT_WAR" || GERRIT_WAR=
-fi
-if test -z "$GERRIT_WAR" -a -n "$GERRIT_USER" ; then
-  for homedirs in /home /Users ; do
-    if test -d "$homedirs/$GERRIT_USER" ; then
-      GERRIT_WAR="$homedirs/$GERRIT_USER/gerrit.war"
-      if test -f "$GERRIT_WAR" ; then
-        break
-      else
-        GERRIT_WAR=
-      fi
-    fi
-  done
-fi
-if test -z "$GERRIT_WAR" ; then
-  echo >&2 "** ERROR: Cannot find gerrit.war (try setting \$GERRIT_WAR)"
-  exit 1
-fi
-
-test -z "$GERRIT_USER" && GERRIT_USER=`whoami`
-RUN_ARGS="-jar $GERRIT_WAR daemon -d $GERRIT_SITE"
-if test "`get_config --bool container.slave`" = "true" ; then
-  RUN_ARGS="$RUN_ARGS --slave"
-fi
-DAEMON_OPTS=`get_config --get-all container.daemonOpt`
-if test -n "$DAEMON_OPTS" ; then
-  RUN_ARGS="$RUN_ARGS $DAEMON_OPTS"
-fi
-
-if test -n "$JAVA_OPTIONS" ; then
-  RUN_ARGS="$JAVA_OPTIONS $RUN_ARGS"
-fi
-
-if test -x /usr/bin/perl ; then
-  # If possible, use Perl to mask the name of the process so its
-  # something specific to us rather than the generic 'java' name.
-  #
-  export JAVA
-  RUN_EXEC=/usr/bin/perl
-  RUN_Arg1=-e
-  RUN_Arg2='$x=$ENV{JAVA};exec $x @ARGV;die $!'
-  RUN_Arg3='-- GerritCodeReview'
-else
-  RUN_EXEC=$JAVA
-  RUN_Arg1=
-  RUN_Arg2='-DGerritCodeReview=1'
-  RUN_Arg3=
-fi
-
-##################################################
-# Do the action
-##################################################
-case "$ACTION" in
-  start)
-    printf '%s' "Starting Gerrit Code Review: "
-
-    if test 1 = "$NO_START" ; then
-      echo "Not starting gerrit - NO_START=1 in /etc/default/gerritcodereview"
-      exit 0
-    fi
-
-    test -z "$UID" && UID=`id | sed -e 's/^[^=]*=\([0-9]*\).*/\1/'`
-
-    RUN_ID=`date +%s`.$$
-    RUN_ARGS="$RUN_ARGS --run-id=$RUN_ID"
-
-    if test 1 = "$START_STOP_DAEMON" && type start-stop-daemon >/dev/null 2>&1
-    then
-      test $UID = 0 && CH_USER="-c $GERRIT_USER"
-      if start-stop-daemon -S -b $CH_USER \
-         -p "$GERRIT_PID" -m \
-         -d "$GERRIT_SITE" \
-         -a "$RUN_EXEC" -- $RUN_Arg1 "$RUN_Arg2" $RUN_Arg3 $RUN_ARGS
-      then
-        : OK
-      else
-        rc=$?
-        if test $rc = 127; then
-          echo >&2 "fatal: start-stop-daemon failed"
-          rc=1
-        fi
-        exit $rc
-      fi
-    else
-      if test -f "$GERRIT_PID" ; then
-        if running "$GERRIT_PID" ; then
-          echo "Already Running!!"
-          exit 0
-        else
-          rm -f "$GERRIT_PID" "$GERRIT_RUN"
-        fi
-      fi
-
-      if test $UID = 0 -a -n "$GERRIT_USER" ; then
-        touch "$GERRIT_PID"
-        chown $GERRIT_USER "$GERRIT_PID"
-        su - $GERRIT_USER -s /bin/sh -c "
-          JAVA='$JAVA' ; export JAVA ;
-          $RUN_EXEC $RUN_Arg1 '$RUN_Arg2' $RUN_Arg3 $RUN_ARGS </dev/null >/dev/null 2>&1 &
-          PID=\$! ;
-          disown ;
-          echo \$PID >\"$GERRIT_PID\""
-      else
-        $RUN_EXEC $RUN_Arg1 "$RUN_Arg2" $RUN_Arg3 $RUN_ARGS </dev/null >/dev/null 2>&1 &
-        PID=$!
-        type disown >/dev/null 2>&1 && disown
-        echo $PID >"$GERRIT_PID"
-      fi
-    fi
-
-    if test $UID = 0; then
-        PID=`cat "$GERRIT_PID"`
-        if test -f "/proc/${PID}/oom_score_adj" ; then
-            echo -1000 > "/proc/${PID}/oom_score_adj"
-        else
-            if test -f "/proc/${PID}/oom_adj" ; then
-                echo -16 > "/proc/${PID}/oom_adj"
-            fi
-        fi
-    elif [ "$(uname -s)"=="Linux" ] && test -d "/proc/${PID}"; then
-        echo "WARNING: Could not adjust Gerrit's process for the kernel's out-of-memory killer."
-        echo "         This may be caused by ${0} not being run as root."
-        echo "         Consider changing the OOM score adjustment manually for Gerrit's PID=${PID} with e.g.:"
-        echo "         echo '-1000' | sudo tee /proc/${PID}/oom_score_adj"
-    fi
-
-    TIMEOUT="$GERRIT_STARTUP_TIMEOUT"
-    sleep 1
-    while running "$GERRIT_PID" && test $TIMEOUT -gt 0 ; do
-      if test "x$RUN_ID" = "x`cat $GERRIT_RUN 2>/dev/null`" ; then
-        echo OK
-        exit 0
-      fi
-
-      sleep 2
-      TIMEOUT=`expr $TIMEOUT - 2`
-    done
-
-    echo FAILED
-    exit 1
-  ;;
-
-  stop)
-    printf '%s' "Stopping Gerrit Code Review: "
-
-    if test 1 = "$START_STOP_DAEMON" && type start-stop-daemon >/dev/null 2>&1
-    then
-      start-stop-daemon -K -p "$GERRIT_PID" -s HUP
-      sleep 1
-      if running "$GERRIT_PID" ; then
-        sleep 3
-        if running "$GERRIT_PID" ; then
-          sleep 30
-          if running "$GERRIT_PID" ; then
-            start-stop-daemon -K -p "$GERRIT_PID" -s KILL
-          fi
-        fi
-      fi
-      rm -f "$GERRIT_PID" "$GERRIT_RUN"
-      echo OK
-    else
-      PID=`cat "$GERRIT_PID" 2>/dev/null`
-      TIMEOUT=30
-      while running "$GERRIT_PID" && test $TIMEOUT -gt 0 ; do
-        kill $PID 2>/dev/null
-        sleep 1
-        TIMEOUT=`expr $TIMEOUT - 1`
-      done
-      test $TIMEOUT -gt 0 || kill -9 $PID 2>/dev/null
-      rm -f "$GERRIT_PID" "$GERRIT_RUN"
-      echo OK
-    fi
-  ;;
-
-  restart)
-    GERRIT_SH=$0
-    if test -f "$GERRIT_SH" ; then
-      : OK
-    else
-      GERRIT_SH="$INITIAL_DIR/$GERRIT_SH"
-      if test -f "$GERRIT_SH" ; then
-        : OK
-      else
-        echo >&2 "** ERROR: Cannot locate gerrit.sh"
-        exit 1
-      fi
-    fi
-    $GERRIT_SH stop $*
-    sleep 5
-    $GERRIT_SH start $*
-    exit $?
-  ;;
-
-  supervise)
-    #
-    # Under control of daemontools supervise monitor which
-    # handles restarts and shutdowns via the svc program.
-    #
-    exec "$RUN_EXEC" $RUN_Arg1 "$RUN_Arg2" $RUN_Arg3 $RUN_ARGS
-    ;;
-
-  run|daemon)
-    echo "Running Gerrit Code Review:"
-
-    if test -f "$GERRIT_PID" ; then
-        if running "$GERRIT_PID" ; then
-          echo "Already Running!!"
-          exit 0
-        else
-          rm -f "$GERRIT_PID"
-        fi
-    fi
-
-    exec "$RUN_EXEC" $RUN_Arg1 "$RUN_Arg2" $RUN_Arg3 $RUN_ARGS --console-log
-  ;;
-
-  check|status)
-    echo "Checking arguments to Gerrit Code Review:"
-    echo "  GERRIT_SITE            =  $GERRIT_SITE"
-    echo "  GERRIT_CONFIG          =  $GERRIT_CONFIG"
-    echo "  GERRIT_PID             =  $GERRIT_PID"
-    echo "  GERRIT_TMP             =  $GERRIT_TMP"
-    echo "  GERRIT_WAR             =  $GERRIT_WAR"
-    echo "  GERRIT_FDS             =  $GERRIT_FDS"
-    echo "  GERRIT_USER            =  $GERRIT_USER"
-    echo "  GERRIT_STARTUP_TIMEOUT =  $GERRIT_STARTUP_TIMEOUT"
-    echo "  JAVA                   =  $JAVA"
-    echo "  JAVA_OPTIONS           =  $JAVA_OPTIONS"
-    echo "  RUN_EXEC               =  $RUN_EXEC $RUN_Arg1 '$RUN_Arg2' $RUN_Arg3"
-    echo "  RUN_ARGS               =  $RUN_ARGS"
-    echo
-
-    if test -f "$GERRIT_PID" ; then
-        if running "$GERRIT_PID" ; then
-            echo "Gerrit running pid="`cat "$GERRIT_PID"`
-            exit 0
-        fi
-    fi
-    exit 3
-  ;;
-
-  threads)
-    if running "$GERRIT_PID" ; then
-      thread_dump "$GERRIT_PID"
-      exit 0
-    else
-      echo "Gerrit not running?"
-    fi
-    exit 3
-  ;;
-
-  *)
-    usage
-  ;;
-esac
-
-exit 0
diff --git a/gerrit-pgm/src/test/java/com/google/gerrit/pgm/http/jetty/HttpLogRedactTest.java b/gerrit-pgm/src/test/java/com/google/gerrit/pgm/http/jetty/HttpLogRedactTest.java
deleted file mode 100644
index 7ed7f81..0000000
--- a/gerrit-pgm/src/test/java/com/google/gerrit/pgm/http/jetty/HttpLogRedactTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.pgm.http.jetty;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import org.junit.Test;
-
-public class HttpLogRedactTest {
-  @Test
-  public void includeQueryString() {
-    assertThat(HttpLog.redactQueryString("/changes/", null)).isEqualTo("/changes/");
-    assertThat(HttpLog.redactQueryString("/changes/", "")).isEqualTo("/changes/");
-    assertThat(HttpLog.redactQueryString("/changes/", "x")).isEqualTo("/changes/?x");
-    assertThat(HttpLog.redactQueryString("/changes/", "x=y")).isEqualTo("/changes/?x=y");
-  }
-
-  @Test
-  public void redactAuth() {
-    assertThat(HttpLog.redactQueryString("/changes/", "query=status:open"))
-        .isEqualTo("/changes/?query=status:open");
-
-    assertThat(HttpLog.redactQueryString("/changes/", "query=status:open&access_token=foo"))
-        .isEqualTo("/changes/?query=status:open&access_token=*");
-
-    assertThat(HttpLog.redactQueryString("/changes/", "access_token=foo"))
-        .isEqualTo("/changes/?access_token=*");
-
-    assertThat(
-            HttpLog.redactQueryString(
-                "/changes/", "query=status:open&access_token=foo&access_token=bar"))
-        .isEqualTo("/changes/?query=status:open&access_token=*&access_token=*");
-  }
-}
diff --git a/gerrit-plugin-api/BUILD b/gerrit-plugin-api/BUILD
deleted file mode 100644
index 5d9ac72..0000000
--- a/gerrit-plugin-api/BUILD
+++ /dev/null
@@ -1,109 +0,0 @@
-load("//tools/bzl:javadoc.bzl", "java_doc")
-
-PLUGIN_API = [
-    "//gerrit-httpd:httpd",
-    "//gerrit-pgm:init-api",
-    "//gerrit-server:server",
-    "//gerrit-sshd:sshd",
-]
-
-EXPORTS = [
-    "//gerrit-index:index",
-    "//gerrit-index:query_exception",
-    "//gerrit-index:query_parser",
-    "//gerrit-common:annotations",
-    "//gerrit-common:server",
-    "//gerrit-extension-api:api",
-    "//gerrit-gwtexpui:server",
-    "//gerrit-server:metrics",
-    "//gerrit-reviewdb:server",
-    "//gerrit-server:prolog-common",
-    "//gerrit-util-cli:cli",
-    "//lib/commons:compress",
-    "//lib/commons:dbcp",
-    "//lib/commons:lang",
-    "//lib/dropwizard:dropwizard-core",
-    "//lib/guice:guice",
-    "//lib/guice:guice-assistedinject",
-    "//lib/guice:guice-servlet",
-    "//lib/guice:javax-inject",
-    "//lib/httpcomponents:httpclient",
-    "//lib/httpcomponents:httpcore",
-    "//lib/jgit/org.eclipse.jgit.http.server:jgit-servlet",
-    "//lib/jgit/org.eclipse.jgit:jgit",
-    "//lib/joda:joda-time",
-    "//lib/log:api",
-    "//lib/log:log4j",
-    "//lib/mina:sshd",
-    "//lib/ow2:ow2-asm",
-    "//lib/ow2:ow2-asm-analysis",
-    "//lib/ow2:ow2-asm-commons",
-    "//lib/ow2:ow2-asm-util",
-    "//lib:args4j",
-    "//lib:blame-cache",
-    "//lib:guava",
-    "//lib:guava-retrying",
-    "//lib:gson",
-    "//lib:gwtorm",
-    "//lib:icu4j",
-    "//lib:jsch",
-    "//lib:mime-util",
-    "//lib:protobuf",
-    "//lib:servlet-api-3_1-without-neverlink",
-    "//lib:soy",
-    "//lib:velocity",
-]
-
-java_binary(
-    name = "plugin-api",
-    main_class = "Dummy",
-    visibility = ["//visibility:public"],
-    runtime_deps = [":lib"],
-)
-
-java_library(
-    name = "lib",
-    visibility = ["//visibility:public"],
-    exports = PLUGIN_API + EXPORTS,
-)
-
-java_library(
-    name = "lib-neverlink",
-    neverlink = 1,
-    visibility = ["//visibility:public"],
-    exports = PLUGIN_API + EXPORTS,
-)
-
-java_binary(
-    name = "plugin-api-sources",
-    main_class = "Dummy",
-    visibility = ["//visibility:public"],
-    runtime_deps = [
-        "//gerrit-common:libannotations-src.jar",
-        "//gerrit-extension-api:libapi-src.jar",
-        "//gerrit-gwtexpui:libserver-src.jar",
-        "//gerrit-httpd:libhttpd-src.jar",
-        "//gerrit-index:libquery_exception-src.jar",
-        "//gerrit-index:libquery_parser-src.jar",
-        "//gerrit-pgm:libinit-api-src.jar",
-        "//gerrit-reviewdb:libserver-src.jar",
-        "//gerrit-server:libserver-src.jar",
-        "//gerrit-sshd:libsshd-src.jar",
-    ],
-)
-
-java_doc(
-    name = "plugin-api-javadoc",
-    libs = PLUGIN_API + [
-        "//gerrit-index:query_exception",
-        "//gerrit-index:query_parser",
-        "//gerrit-common:annotations",
-        "//gerrit-common:server",
-        "//gerrit-extension-api:api",
-        "//gerrit-gwtexpui:server",
-        "//gerrit-reviewdb:server",
-    ],
-    pkgs = ["com.google.gerrit"],
-    title = "Gerrit Review Plugin API Documentation",
-    visibility = ["//visibility:public"],
-)
diff --git a/gerrit-plugin-api/pom.xml b/gerrit-plugin-api/pom.xml
deleted file mode 100644
index 008aab8..0000000
--- a/gerrit-plugin-api/pom.xml
+++ /dev/null
@@ -1,83 +0,0 @@
-<project>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>com.google.gerrit</groupId>
-  <artifactId>gerrit-plugin-api</artifactId>
-  <version>2.15.12-SNAPSHOT</version>
-  <packaging>jar</packaging>
-  <name>Gerrit Code Review - Plugin API</name>
-  <description>API for Gerrit Plugins</description>
-  <url>https://www.gerritcodereview.com/</url>
-
-  <licenses>
-    <license>
-      <name>The Apache Software License, Version 2.0</name>
-      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
-      <distribution>repo</distribution>
-    </license>
-  </licenses>
-
-  <scm>
-    <url>https://gerrit.googlesource.com/gerrit</url>
-    <connection>https://gerrit.googlesource.com/gerrit</connection>
-  </scm>
-
-  <developers>
-    <developer>
-      <name>Alice Kober-Sotzek</name>
-    </developer>
-    <developer>
-      <name>Ben Rohlfs</name>
-    </developer>
-    <developer>
-      <name>Dave Borowitz</name>
-    </developer>
-    <developer>
-      <name>David Ostrovsky</name>
-    </developer>
-    <developer>
-      <name>David Pursehouse</name>
-    </developer>
-    <developer>
-      <name>Edwin Kempin</name>
-    </developer>
-    <developer>
-      <name>Han-Wen Nienhuys</name>
-    </developer>
-    <developer>
-      <name>Hugo Arès</name>
-    </developer>
-    <developer>
-      <name>Luca Milanesio</name>
-    </developer>
-    <developer>
-      <name>Marco Miller</name>
-    </developer>
-    <developer>
-      <name>Martin Fick</name>
-    </developer>
-    <developer>
-      <name>Ole Rehmsen</name>
-    </developer>
-    <developer>
-      <name>Patrick Hiesel</name>
-    </developer>
-    <developer>
-      <name>Saša Živkov</name>
-    </developer>
-  </developers>
-
-  <mailingLists>
-    <mailingList>
-      <name>Repo and Gerrit Discussion</name>
-      <post>repo-discuss@googlegroups.com</post>
-      <subscribe>https://groups.google.com/forum/#!forum/repo-discuss</subscribe>
-      <unsubscribe>https://groups.google.com/forum/#!forum/repo-discuss</unsubscribe>
-      <archive>https://groups.google.com/forum/#!forum/repo-discuss</archive>
-    </mailingList>
-  </mailingLists>
-
-  <issueManagement>
-    <url>https://bugs.chromium.org/p/gerrit/issues/list</url>
-    <system>Gerrit Issue Tracker</system>
-  </issueManagement>
-</project>
diff --git a/gerrit-plugin-gwtui/BUILD b/gerrit-plugin-gwtui/BUILD
index 8cc05b6..63b1ce2 100644
--- a/gerrit-plugin-gwtui/BUILD
+++ b/gerrit-plugin-gwtui/BUILD
@@ -22,18 +22,18 @@
     exported_deps = ["//gerrit-gwtui-common:client-lib"],
     resources = glob(["src/main/**/*"]),
     deps = DEPS + [
-        "//gerrit-common:libclient-src.jar",
-        "//gerrit-extension-api:libclient-src.jar",
-        "//gerrit-gwtexpui:libClippy-src.jar",
-        "//gerrit-gwtexpui:libGlobalKey-src.jar",
-        "//gerrit-gwtexpui:libProgress-src.jar",
-        "//gerrit-gwtexpui:libSafeHtml-src.jar",
-        "//gerrit-gwtexpui:libUserAgent-src.jar",
+        "//java/org/eclipse/jgit:libclient-src.jar",
+        "//java/org/eclipse/jgit:libEdit-src.jar",
+        "//java/com/google/gerrit/common:libclient-src.jar",
+        "//java/com/google/gerrit/extensions:libapi-src.jar",
+        "//java/com/google/gwtexpui/clippy:libclippy-src.jar",
+        "//java/com/google/gwtexpui/globalkey:libglobalkey-src.jar",
+        "//java/com/google/gwtexpui/progress:libprogress-src.jar",
+        "//java/com/google/gwtexpui/safehtml:libsafehtml-src.jar",
+        "//java/com/google/gwtexpui/user:libagent-src.jar",
         "//gerrit-gwtui-common:libclient-src.jar",
-        "//gerrit-patch-jgit:libclient-src.jar",
-        "//gerrit-patch-jgit:libEdit-src.jar",
-        "//gerrit-prettify:libclient-src.jar",
-        "//gerrit-reviewdb:libclient-src.jar",
+        "//java/com/google/gerrit/prettify:libclient-src.jar",
+        "//java/com/google/gerrit/reviewdb:libclient-src.jar",
         "//lib/gwt:dev-neverlink",
     ],
 )
@@ -52,8 +52,12 @@
     main_class = "Dummy",
     runtime_deps = [
         ":libgwtui-api-lib-src.jar",
-        "//gerrit-gwtexpui:client-src-lib",
         "//gerrit-gwtui-common:libclient-lib-src.jar",
+        "//java/com/google/gwtexpui/clippy:libclippy-src.jar",
+        "//java/com/google/gwtexpui/globalkey:libglobalkey-src.jar",
+        "//java/com/google/gwtexpui/progress:libprogress-src.jar",
+        "//java/com/google/gwtexpui/safehtml:libsafehtml-src.jar",
+        "//java/com/google/gwtexpui/user:libagent-src.jar",
     ],
 )
 
@@ -65,8 +69,8 @@
         "//lib:gwtorm-client",
         "//lib/gwt:dev",
         "//gerrit-gwtui-common:client-lib",
-        "//gerrit-common:client",
-        "//gerrit-reviewdb:client",
+        "//java/com/google/gerrit/common:client",
+        "//java/com/google/gerrit/reviewdb:client",
     ],
     pkgs = [
         "com.google.gerrit.plugin",
diff --git a/gerrit-plugin-gwtui/pom.xml b/gerrit-plugin-gwtui/pom.xml
deleted file mode 100644
index 3f12651..0000000
--- a/gerrit-plugin-gwtui/pom.xml
+++ /dev/null
@@ -1,83 +0,0 @@
-<project>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>com.google.gerrit</groupId>
-  <artifactId>gerrit-plugin-gwtui</artifactId>
-  <version>2.15.12-SNAPSHOT</version>
-  <packaging>jar</packaging>
-  <name>Gerrit Code Review - Plugin GWT UI</name>
-  <description>Common Classes for Gerrit GWT UI Plugins</description>
-  <url>https://www.gerritcodereview.com/</url>
-
-  <licenses>
-    <license>
-      <name>The Apache Software License, Version 2.0</name>
-      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
-      <distribution>repo</distribution>
-    </license>
-  </licenses>
-
-  <scm>
-    <url>https://gerrit.googlesource.com/gerrit</url>
-    <connection>https://gerrit.googlesource.com/gerrit</connection>
-  </scm>
-
-  <developers>
-    <developer>
-      <name>Alice Kober-Sotzek</name>
-    </developer>
-    <developer>
-      <name>Ben Rohlfs</name>
-    </developer>
-    <developer>
-      <name>Dave Borowitz</name>
-    </developer>
-    <developer>
-      <name>David Ostrovsky</name>
-    </developer>
-    <developer>
-      <name>David Pursehouse</name>
-    </developer>
-    <developer>
-      <name>Edwin Kempin</name>
-    </developer>
-    <developer>
-      <name>Han-Wen Nienhuys</name>
-    </developer>
-    <developer>
-      <name>Hugo Arès</name>
-    </developer>
-    <developer>
-      <name>Luca Milanesio</name>
-    </developer>
-    <developer>
-      <name>Marco Miller</name>
-    </developer>
-    <developer>
-      <name>Martin Fick</name>
-    </developer>
-    <developer>
-      <name>Ole Rehmsen</name>
-    </developer>
-    <developer>
-      <name>Patrick Hiesel</name>
-    </developer>
-    <developer>
-      <name>Saša Živkov</name>
-    </developer>
-  </developers>
-
-  <mailingLists>
-    <mailingList>
-      <name>Repo and Gerrit Discussion</name>
-      <post>repo-discuss@googlegroups.com</post>
-      <subscribe>https://groups.google.com/forum/#!forum/repo-discuss</subscribe>
-      <unsubscribe>https://groups.google.com/forum/#!forum/repo-discuss</unsubscribe>
-      <archive>https://groups.google.com/forum/#!forum/repo-discuss</archive>
-    </mailingList>
-  </mailingLists>
-
-  <issueManagement>
-    <url>https://bugs.chromium.org/p/gerrit/issues/list</url>
-    <system>Gerrit Issue Tracker</system>
-  </issueManagement>
-</project>
diff --git a/gerrit-prettify/BUILD b/gerrit-prettify/BUILD
deleted file mode 100644
index 18180b3..0000000
--- a/gerrit-prettify/BUILD
+++ /dev/null
@@ -1,40 +0,0 @@
-load("//tools/bzl:gwt.bzl", "gwt_module")
-
-SRC = "src/main/java/com/google/gerrit/prettify/"
-
-gwt_module(
-    name = "client",
-    srcs = glob([
-        SRC + "common/**/*.java",
-    ]),
-    exported_deps = [
-        "//gerrit-extension-api:client",
-        "//gerrit-gwtexpui:SafeHtml",
-        "//gerrit-patch-jgit:Edit",
-        "//gerrit-patch-jgit:client",
-        "//gerrit-reviewdb:client",
-        "//lib:gwtjsonrpc",
-        "//lib:gwtjsonrpc_src",
-    ],
-    gwt_xml = SRC + "PrettyFormatter.gwt.xml",
-    visibility = ["//visibility:public"],
-    deps = ["//lib/gwt:user-neverlink"],
-)
-
-java_library(
-    name = "server",
-    srcs = glob([SRC + "common/**/*.java"]),
-    visibility = ["//visibility:public"],
-    deps = [
-        "//gerrit-patch-jgit:server",
-        "//gerrit-reviewdb:server",
-        "//lib:guava",
-        "//lib:gwtjsonrpc",
-        "//lib/jgit/org.eclipse.jgit:jgit",
-    ],
-)
-
-exports_files([
-    "src/main/resources/com/google/gerrit/prettify/client/prettify.css",
-    "src/main/resources/com/google/gerrit/prettify/client/prettify.js",
-])
diff --git a/gerrit-reviewdb/BUILD b/gerrit-reviewdb/BUILD
deleted file mode 100644
index 9885c54..0000000
--- a/gerrit-reviewdb/BUILD
+++ /dev/null
@@ -1,41 +0,0 @@
-load("//tools/bzl:gwt.bzl", "gwt_module")
-load("//tools/bzl:junit.bzl", "junit_tests")
-
-package(default_visibility = ["//visibility:public"])
-
-SRC = "src/main/java/com/google/gerrit/reviewdb/"
-
-TESTS = "src/test/java/com/google/gerrit/reviewdb/"
-
-gwt_module(
-    name = "client",
-    srcs = glob([SRC + "client/**/*.java"]),
-    gwt_xml = SRC + "ReviewDB.gwt.xml",
-    deps = [
-        "//gerrit-extension-api:client",
-        "//lib:gwtorm-client",
-        "//lib:gwtorm-client_src",
-    ],
-)
-
-java_library(
-    name = "server",
-    srcs = glob([SRC + "**/*.java"]),
-    resources = glob(["src/main/resources/**/*"]),
-    deps = [
-        "//gerrit-extension-api:api",
-        "//lib:guava",
-        "//lib:gwtorm",
-    ],
-)
-
-junit_tests(
-    name = "client_tests",
-    srcs = glob([TESTS + "client/**/*.java"]),
-    deps = [
-        ":client",
-        "//gerrit-server:testutil",
-        "//lib:gwtorm",
-        "//lib:truth",
-    ],
-)
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Account.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Account.java
deleted file mode 100644
index a1c16e1..0000000
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Account.java
+++ /dev/null
@@ -1,309 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.reviewdb.client;
-
-import static com.google.gerrit.reviewdb.client.RefNames.REFS_DRAFT_COMMENTS;
-import static com.google.gerrit.reviewdb.client.RefNames.REFS_STARRED_CHANGES;
-import static com.google.gerrit.reviewdb.client.RefNames.REFS_USERS;
-
-import com.google.gerrit.extensions.client.DiffPreferencesInfo;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
-import com.google.gwtorm.client.Column;
-import com.google.gwtorm.client.IntKey;
-import java.sql.Timestamp;
-
-/**
- * Information about a single user.
- *
- * <p>A user may have multiple identities they can use to login to Gerrit (see ExternalId), but in
- * such cases they always map back to a single Account entity.
- *
- * <p>Entities "owned" by an Account (that is, their primary key contains the {@link Account.Id} key
- * as part of their key structure):
- *
- * <ul>
- *   <li>ExternalId: OpenID identities and email addresses known to be registered to this user.
- *       Multiple records can exist when the user has more than one public identity, such as a work
- *       and a personal email address.
- *   <li>{@link AccountGroupMember}: membership of the user in a specific human managed {@link
- *       AccountGroup}. Multiple records can exist when the user is a member of more than one group.
- *   <li>{@link AccountSshKey}: user's public SSH keys, for authentication through the internal SSH
- *       daemon. One record per SSH key uploaded by the user, keys are checked in random order until
- *       a match is found.
- *   <li>{@link DiffPreferencesInfo}: user's preferences for rendering side-to-side and unified diff
- * </ul>
- */
-public final class Account {
-  /** Key local to Gerrit to identify a user. */
-  public static class Id extends IntKey<com.google.gwtorm.client.Key<?>> {
-    private static final long serialVersionUID = 1L;
-
-    @Column(id = 1)
-    protected int id;
-
-    protected Id() {}
-
-    public Id(int id) {
-      this.id = id;
-    }
-
-    @Override
-    public int get() {
-      return id;
-    }
-
-    @Override
-    protected void set(int newValue) {
-      id = newValue;
-    }
-
-    /** Parse an Account.Id out of a string representation. */
-    public static Id parse(String str) {
-      Id r = new Id();
-      r.fromString(str);
-      return r;
-    }
-
-    public static Id fromRef(String name) {
-      if (name == null) {
-        return null;
-      }
-      if (name.startsWith(REFS_USERS)) {
-        return fromRefPart(name.substring(REFS_USERS.length()));
-      } else if (name.startsWith(REFS_DRAFT_COMMENTS)) {
-        return parseAfterShardedRefPart(name.substring(REFS_DRAFT_COMMENTS.length()));
-      } else if (name.startsWith(REFS_STARRED_CHANGES)) {
-        return parseAfterShardedRefPart(name.substring(REFS_STARRED_CHANGES.length()));
-      }
-      return null;
-    }
-
-    /**
-     * Parse an Account.Id out of a part of a ref-name.
-     *
-     * @param name a ref name with the following syntax: {@code "34/1234..."}. We assume that the
-     *     caller has trimmed any prefix.
-     */
-    public static Id fromRefPart(String name) {
-      Integer id = RefNames.parseShardedRefPart(name);
-      return id != null ? new Account.Id(id) : null;
-    }
-
-    public static Id parseAfterShardedRefPart(String name) {
-      Integer id = RefNames.parseAfterShardedRefPart(name);
-      return id != null ? new Account.Id(id) : null;
-    }
-
-    /**
-     * Parse an Account.Id out of the last part of a ref name.
-     *
-     * <p>The input is a ref name of the form {@code ".../1234"}, where the suffix is a non-sharded
-     * account ID. Ref names using a sharded ID should use {@link #fromRefPart(String)} instead for
-     * greater safety.
-     *
-     * @param name ref name
-     * @return account ID, or null if not numeric.
-     */
-    public static Id fromRefSuffix(String name) {
-      Integer id = RefNames.parseRefSuffix(name);
-      return id != null ? new Account.Id(id) : null;
-    }
-  }
-
-  @Column(id = 1)
-  protected Id accountId;
-
-  /** Date and time the user registered with the review server. */
-  @Column(id = 2)
-  protected Timestamp registeredOn;
-
-  /** Full name of the user ("Given-name Surname" style). */
-  @Column(id = 3, notNull = false)
-  protected String fullName;
-
-  /** Email address the user prefers to be contacted through. */
-  @Column(id = 4, notNull = false)
-  protected String preferredEmail;
-
-  // DELETED: id = 5 (contactFiledOn)
-
-  // DELETED: id = 6 (generalPreferences)
-
-  /**
-   * Is this user inactive? This is used to avoid showing some users (eg. former employees) in
-   * auto-suggest.
-   */
-  @Column(id = 7)
-  protected boolean inactive;
-
-  /** The user-settable status of this account (e.g. busy, OOO, available) */
-  @Column(id = 8, notNull = false)
-  protected String status;
-
-  /** <i>computed</i> the username selected from the identities. */
-  protected String userName;
-
-  /** <i>stored in git, used for caching</i> the user's preferences. */
-  private GeneralPreferencesInfo generalPreferences;
-
-  /**
-   * ID of the user branch from which the account was read, {@code null} if the account was read
-   * from ReviewDb.
-   */
-  private String metaId;
-
-  protected Account() {}
-
-  /**
-   * Create a new account.
-   *
-   * @param newId unique id, see {@link com.google.gerrit.server.Sequences#nextAccountId()}.
-   * @param registeredOn when the account was registered.
-   */
-  public Account(Account.Id newId, Timestamp registeredOn) {
-    this.accountId = newId;
-    this.registeredOn = registeredOn;
-  }
-
-  /** Get local id of this account, to link with in other entities */
-  public Account.Id getId() {
-    return accountId;
-  }
-
-  /** Get the full name of the user ("Given-name Surname" style). */
-  public String getFullName() {
-    return fullName;
-  }
-
-  /** Set the full name of the user ("Given-name Surname" style). */
-  public void setFullName(String name) {
-    if (name != null && !name.trim().isEmpty()) {
-      fullName = name.trim();
-    } else {
-      fullName = null;
-    }
-  }
-
-  /** Email address the user prefers to be contacted through. */
-  public String getPreferredEmail() {
-    return preferredEmail;
-  }
-
-  /** Set the email address the user prefers to be contacted through. */
-  public void setPreferredEmail(String addr) {
-    preferredEmail = addr;
-  }
-
-  /**
-   * Formats an account name.
-   *
-   * <p>If the account has a full name, it returns only the full name. Otherwise it returns a longer
-   * form that includes the email address.
-   */
-  public String getName(String anonymousCowardName) {
-    if (fullName != null) {
-      return fullName;
-    }
-    if (preferredEmail != null) {
-      return preferredEmail;
-    }
-    return getNameEmail(anonymousCowardName);
-  }
-
-  /**
-   * Get the name and email address.
-   *
-   * <p>Example output:
-   *
-   * <ul>
-   *   <li>{@code A U. Thor &lt;author@example.com&gt;}: full populated
-   *   <li>{@code A U. Thor (12)}: missing email address
-   *   <li>{@code Anonymous Coward &lt;author@example.com&gt;}: missing name
-   *   <li>{@code Anonymous Coward (12)}: missing name and email address
-   * </ul>
-   */
-  public String getNameEmail(String anonymousCowardName) {
-    String name = fullName != null ? fullName : anonymousCowardName;
-    StringBuilder b = new StringBuilder();
-    b.append(name);
-    if (preferredEmail != null) {
-      b.append(" <");
-      b.append(preferredEmail);
-      b.append(">");
-    } else if (accountId != null) {
-      b.append(" (");
-      b.append(accountId.get());
-      b.append(")");
-    }
-    return b.toString();
-  }
-
-  /** Get the date and time the user first registered. */
-  public Timestamp getRegisteredOn() {
-    return registeredOn;
-  }
-
-  public GeneralPreferencesInfo getGeneralPreferencesInfo() {
-    return generalPreferences;
-  }
-
-  public void setGeneralPreferences(GeneralPreferencesInfo p) {
-    generalPreferences = p;
-  }
-
-  public String getMetaId() {
-    return metaId;
-  }
-
-  public void setMetaId(String metaId) {
-    this.metaId = metaId;
-  }
-
-  public boolean isActive() {
-    return !inactive;
-  }
-
-  public void setActive(boolean active) {
-    inactive = !active;
-  }
-
-  public String getStatus() {
-    return status;
-  }
-
-  public void setStatus(String status) {
-    this.status = status;
-  }
-
-  /** @return the computed user name for this account */
-  public String getUserName() {
-    return userName;
-  }
-
-  /** Update the computed user name property. */
-  public void setUserName(String userName) {
-    this.userName = userName;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    return o instanceof Account && ((Account) o).getId().equals(getId());
-  }
-
-  @Override
-  public int hashCode() {
-    return getId().get();
-  }
-}
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroup.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroup.java
deleted file mode 100644
index 74dadc5..0000000
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroup.java
+++ /dev/null
@@ -1,234 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.reviewdb.client;
-
-import com.google.gwtorm.client.Column;
-import com.google.gwtorm.client.IntKey;
-import com.google.gwtorm.client.StringKey;
-import java.sql.Timestamp;
-
-/** Named group of one or more accounts, typically used for access controls. */
-public final class AccountGroup {
-  /**
-   * Time when the audit subsystem was implemented, used as the default value for {@link #createdOn}
-   * when one couldn't be determined from the audit log.
-   */
-  // Can't use Instant here because GWT. This is verified against a readable time in the tests,
-  // which don't need to compile under GWT.
-  private static final long AUDIT_CREATION_INSTANT_MS = 1244489460000L;
-
-  public static Timestamp auditCreationInstantTs() {
-    return new Timestamp(AUDIT_CREATION_INSTANT_MS);
-  }
-
-  /** Group name key */
-  public static class NameKey extends StringKey<com.google.gwtorm.client.Key<?>> {
-    private static final long serialVersionUID = 1L;
-
-    @Column(id = 1)
-    protected String name;
-
-    protected NameKey() {}
-
-    public NameKey(String n) {
-      name = n;
-    }
-
-    @Override
-    public String get() {
-      return name;
-    }
-
-    @Override
-    protected void set(String newValue) {
-      name = newValue;
-    }
-  }
-
-  /** Globally unique identifier. */
-  public static class UUID extends StringKey<com.google.gwtorm.client.Key<?>> {
-    private static final long serialVersionUID = 1L;
-
-    @Column(id = 1)
-    protected String uuid;
-
-    protected UUID() {}
-
-    public UUID(String n) {
-      uuid = n;
-    }
-
-    @Override
-    public String get() {
-      return uuid;
-    }
-
-    @Override
-    protected void set(String newValue) {
-      uuid = newValue;
-    }
-
-    /** Parse an AccountGroup.UUID out of a string representation. */
-    public static UUID parse(String str) {
-      final UUID r = new UUID();
-      r.fromString(str);
-      return r;
-    }
-  }
-
-  /** @return true if the UUID is for a group managed within Gerrit. */
-  public static boolean isInternalGroup(AccountGroup.UUID uuid) {
-    return uuid.get().matches("^[0-9a-f]{40}$");
-  }
-
-  /** Synthetic key to link to within the database */
-  public static class Id extends IntKey<com.google.gwtorm.client.Key<?>> {
-    private static final long serialVersionUID = 1L;
-
-    @Column(id = 1)
-    protected int id;
-
-    protected Id() {}
-
-    public Id(int id) {
-      this.id = id;
-    }
-
-    @Override
-    public int get() {
-      return id;
-    }
-
-    @Override
-    protected void set(int newValue) {
-      id = newValue;
-    }
-
-    /** Parse an AccountGroup.Id out of a string representation. */
-    public static Id parse(String str) {
-      final Id r = new Id();
-      r.fromString(str);
-      return r;
-    }
-  }
-
-  /** Unique name of this group within the system. */
-  @Column(id = 1)
-  protected NameKey name;
-
-  /** Unique identity, to link entities as {@link #name} can change. */
-  @Column(id = 2)
-  protected Id groupId;
-
-  // DELETED: id = 3 (ownerGroupId)
-
-  /** A textual description of the group's purpose. */
-  @Column(id = 4, length = Integer.MAX_VALUE, notNull = false)
-  protected String description;
-
-  // DELETED: id = 5 (groupType)
-  // DELETED: id = 6 (externalName)
-
-  @Column(id = 7)
-  protected boolean visibleToAll;
-
-  // DELETED: id = 8 (emailOnlyAuthors)
-
-  /** Globally unique identifier name for this group. */
-  @Column(id = 9)
-  protected UUID groupUUID;
-
-  /**
-   * Identity of the group whose members can manage this group.
-   *
-   * <p>This can be a self-reference to indicate the group's members manage itself.
-   */
-  @Column(id = 10)
-  protected UUID ownerGroupUUID;
-
-  @Column(id = 11, notNull = false)
-  protected Timestamp createdOn;
-
-  protected AccountGroup() {}
-
-  public AccountGroup(
-      AccountGroup.NameKey newName,
-      AccountGroup.Id newId,
-      AccountGroup.UUID uuid,
-      Timestamp createdOn) {
-    name = newName;
-    groupId = newId;
-    visibleToAll = false;
-    groupUUID = uuid;
-    ownerGroupUUID = groupUUID;
-    this.createdOn = createdOn;
-  }
-
-  public AccountGroup.Id getId() {
-    return groupId;
-  }
-
-  public String getName() {
-    return name.get();
-  }
-
-  public AccountGroup.NameKey getNameKey() {
-    return name;
-  }
-
-  public void setNameKey(AccountGroup.NameKey nameKey) {
-    name = nameKey;
-  }
-
-  public String getDescription() {
-    return description;
-  }
-
-  public void setDescription(String d) {
-    description = d;
-  }
-
-  public AccountGroup.UUID getOwnerGroupUUID() {
-    return ownerGroupUUID;
-  }
-
-  public void setOwnerGroupUUID(AccountGroup.UUID uuid) {
-    ownerGroupUUID = uuid;
-  }
-
-  public void setVisibleToAll(boolean visibleToAll) {
-    this.visibleToAll = visibleToAll;
-  }
-
-  public boolean isVisibleToAll() {
-    return visibleToAll;
-  }
-
-  public AccountGroup.UUID getGroupUUID() {
-    return groupUUID;
-  }
-
-  public void setGroupUUID(AccountGroup.UUID uuid) {
-    groupUUID = uuid;
-  }
-
-  public Timestamp getCreatedOn() {
-    return createdOn != null ? createdOn : auditCreationInstantTs();
-  }
-
-  public void setCreatedOn(Timestamp createdOn) {
-    this.createdOn = createdOn;
-  }
-}
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupById.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupById.java
deleted file mode 100644
index 99ff35be..0000000
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupById.java
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.reviewdb.client;
-
-import com.google.gwtorm.client.Column;
-import com.google.gwtorm.client.CompoundKey;
-
-/** Membership of an {@link AccountGroup} in an {@link AccountGroup}. */
-public final class AccountGroupById {
-  public static class Key extends CompoundKey<AccountGroup.Id> {
-    private static final long serialVersionUID = 1L;
-
-    @Column(id = 1)
-    protected AccountGroup.Id groupId;
-
-    @Column(id = 2)
-    protected AccountGroup.UUID includeUUID;
-
-    protected Key() {
-      groupId = new AccountGroup.Id();
-      includeUUID = new AccountGroup.UUID();
-    }
-
-    public Key(AccountGroup.Id g, AccountGroup.UUID u) {
-      groupId = g;
-      includeUUID = u;
-    }
-
-    @Override
-    public AccountGroup.Id getParentKey() {
-      return groupId;
-    }
-
-    public AccountGroup.Id getGroupId() {
-      return groupId;
-    }
-
-    public AccountGroup.UUID getIncludeUUID() {
-      return includeUUID;
-    }
-
-    @Override
-    public com.google.gwtorm.client.Key<?>[] members() {
-      return new com.google.gwtorm.client.Key<?>[] {includeUUID};
-    }
-  }
-
-  @Column(id = 1, name = Column.NONE)
-  protected Key key;
-
-  protected AccountGroupById() {}
-
-  public AccountGroupById(AccountGroupById.Key k) {
-    key = k;
-  }
-
-  public AccountGroupById.Key getKey() {
-    return key;
-  }
-
-  public AccountGroup.Id getGroupId() {
-    return key.groupId;
-  }
-
-  public AccountGroup.UUID getIncludeUUID() {
-    return key.includeUUID;
-  }
-}
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupByIdAud.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupByIdAud.java
deleted file mode 100644
index a127a70..0000000
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupByIdAud.java
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.reviewdb.client;
-
-import com.google.gwtorm.client.Column;
-import com.google.gwtorm.client.CompoundKey;
-import java.sql.Timestamp;
-
-/** Inclusion of an {@link AccountGroup} in another {@link AccountGroup}. */
-public final class AccountGroupByIdAud {
-  public static class Key extends CompoundKey<AccountGroup.Id> {
-    private static final long serialVersionUID = 1L;
-
-    @Column(id = 1)
-    protected AccountGroup.Id groupId;
-
-    @Column(id = 2)
-    protected AccountGroup.UUID includeUUID;
-
-    @Column(id = 3)
-    protected Timestamp addedOn;
-
-    protected Key() {
-      groupId = new AccountGroup.Id();
-      includeUUID = new AccountGroup.UUID();
-    }
-
-    public Key(AccountGroup.Id g, AccountGroup.UUID u, Timestamp t) {
-      groupId = g;
-      includeUUID = u;
-      addedOn = t;
-    }
-
-    @Override
-    public AccountGroup.Id getParentKey() {
-      return groupId;
-    }
-
-    public AccountGroup.UUID getIncludeUUID() {
-      return includeUUID;
-    }
-
-    public Timestamp getAddedOn() {
-      return addedOn;
-    }
-
-    @Override
-    public com.google.gwtorm.client.Key<?>[] members() {
-      return new com.google.gwtorm.client.Key<?>[] {includeUUID};
-    }
-  }
-
-  @Column(id = 1, name = Column.NONE)
-  protected Key key;
-
-  @Column(id = 2)
-  protected Account.Id addedBy;
-
-  @Column(id = 3, notNull = false)
-  protected Account.Id removedBy;
-
-  @Column(id = 4, notNull = false)
-  protected Timestamp removedOn;
-
-  protected AccountGroupByIdAud() {}
-
-  public AccountGroupByIdAud(final AccountGroupById m, Account.Id adder, Timestamp when) {
-    final AccountGroup.Id group = m.getGroupId();
-    final AccountGroup.UUID include = m.getIncludeUUID();
-    key = new AccountGroupByIdAud.Key(group, include, when);
-    addedBy = adder;
-  }
-
-  public AccountGroupByIdAud.Key getKey() {
-    return key;
-  }
-
-  public boolean isActive() {
-    return removedOn == null;
-  }
-
-  public void removed(Account.Id deleter, Timestamp when) {
-    removedBy = deleter;
-    removedOn = when;
-  }
-
-  public Account.Id getAddedBy() {
-    return addedBy;
-  }
-
-  public Account.Id getRemovedBy() {
-    return removedBy;
-  }
-
-  public Timestamp getRemovedOn() {
-    return removedOn;
-  }
-}
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupMember.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupMember.java
deleted file mode 100644
index ce5b347..0000000
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupMember.java
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.reviewdb.client;
-
-import com.google.gwtorm.client.Column;
-import com.google.gwtorm.client.CompoundKey;
-
-/** Membership of an {@link Account} in an {@link AccountGroup}. */
-public final class AccountGroupMember {
-  public static class Key extends CompoundKey<Account.Id> {
-    private static final long serialVersionUID = 1L;
-
-    @Column(id = 1)
-    protected Account.Id accountId;
-
-    @Column(id = 2)
-    protected AccountGroup.Id groupId;
-
-    protected Key() {
-      accountId = new Account.Id();
-      groupId = new AccountGroup.Id();
-    }
-
-    public Key(Account.Id a, AccountGroup.Id g) {
-      accountId = a;
-      groupId = g;
-    }
-
-    @Override
-    public Account.Id getParentKey() {
-      return accountId;
-    }
-
-    public AccountGroup.Id getAccountGroupId() {
-      return groupId;
-    }
-
-    @Override
-    public com.google.gwtorm.client.Key<?>[] members() {
-      return new com.google.gwtorm.client.Key<?>[] {groupId};
-    }
-  }
-
-  @Column(id = 1, name = Column.NONE)
-  protected Key key;
-
-  protected AccountGroupMember() {}
-
-  public AccountGroupMember(AccountGroupMember.Key k) {
-    key = k;
-  }
-
-  public AccountGroupMember.Key getKey() {
-    return key;
-  }
-
-  public Account.Id getAccountId() {
-    return key.accountId;
-  }
-
-  public AccountGroup.Id getAccountGroupId() {
-    return key.groupId;
-  }
-}
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupMemberAudit.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupMemberAudit.java
deleted file mode 100644
index da19351..0000000
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupMemberAudit.java
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.reviewdb.client;
-
-import com.google.gwtorm.client.Column;
-import com.google.gwtorm.client.CompoundKey;
-import java.sql.Timestamp;
-
-/** Membership of an {@link Account} in an {@link AccountGroup}. */
-public final class AccountGroupMemberAudit {
-  public static class Key extends CompoundKey<Account.Id> {
-    private static final long serialVersionUID = 1L;
-
-    @Column(id = 1)
-    protected Account.Id accountId;
-
-    @Column(id = 2)
-    protected AccountGroup.Id groupId;
-
-    @Column(id = 3)
-    protected Timestamp addedOn;
-
-    protected Key() {
-      accountId = new Account.Id();
-      groupId = new AccountGroup.Id();
-    }
-
-    public Key(Account.Id a, AccountGroup.Id g, Timestamp t) {
-      accountId = a;
-      groupId = g;
-      addedOn = t;
-    }
-
-    @Override
-    public Account.Id getParentKey() {
-      return accountId;
-    }
-
-    public AccountGroup.Id getGroupId() {
-      return groupId;
-    }
-
-    public Timestamp getAddedOn() {
-      return addedOn;
-    }
-
-    @Override
-    public com.google.gwtorm.client.Key<?>[] members() {
-      return new com.google.gwtorm.client.Key<?>[] {groupId};
-    }
-  }
-
-  @Column(id = 1, name = Column.NONE)
-  protected Key key;
-
-  @Column(id = 2)
-  protected Account.Id addedBy;
-
-  @Column(id = 3, notNull = false)
-  protected Account.Id removedBy;
-
-  @Column(id = 4, notNull = false)
-  protected Timestamp removedOn;
-
-  protected AccountGroupMemberAudit() {}
-
-  public AccountGroupMemberAudit(final AccountGroupMember m, Account.Id adder, Timestamp addedOn) {
-    final Account.Id who = m.getAccountId();
-    final AccountGroup.Id group = m.getAccountGroupId();
-    key = new AccountGroupMemberAudit.Key(who, group, addedOn);
-    addedBy = adder;
-  }
-
-  public AccountGroupMemberAudit.Key getKey() {
-    return key;
-  }
-
-  public boolean isActive() {
-    return removedOn == null;
-  }
-
-  public void removed(Account.Id deleter, Timestamp when) {
-    removedBy = deleter;
-    removedOn = when;
-  }
-
-  public void removedLegacy() {
-    removedBy = addedBy;
-    removedOn = key.addedOn;
-  }
-
-  public Account.Id getAddedBy() {
-    return addedBy;
-  }
-
-  public Account.Id getRemovedBy() {
-    return removedBy;
-  }
-
-  public Timestamp getRemovedOn() {
-    return removedOn;
-  }
-}
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountSshKey.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountSshKey.java
deleted file mode 100644
index 372d644..0000000
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountSshKey.java
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.reviewdb.client;
-
-import com.google.gwtorm.client.IntKey;
-import java.util.Objects;
-
-/** An SSH key approved for use by an {@link Account}. */
-public final class AccountSshKey {
-  public static class Id extends IntKey<Account.Id> {
-    private static final long serialVersionUID = 1L;
-
-    protected Account.Id accountId;
-
-    protected int seq;
-
-    protected Id() {
-      accountId = new Account.Id();
-    }
-
-    public Id(Account.Id a, int s) {
-      accountId = a;
-      seq = s;
-    }
-
-    @Override
-    public Account.Id getParentKey() {
-      return accountId;
-    }
-
-    @Override
-    public int get() {
-      return seq;
-    }
-
-    @Override
-    protected void set(int newValue) {
-      seq = newValue;
-    }
-
-    public boolean isValid() {
-      return seq > 0;
-    }
-  }
-
-  protected AccountSshKey.Id id;
-
-  protected String sshPublicKey;
-
-  protected boolean valid;
-
-  protected AccountSshKey() {}
-
-  public AccountSshKey(AccountSshKey.Id i, String pub) {
-    id = i;
-    sshPublicKey = pub.replace("\n", "").replace("\r", "");
-    valid = id.isValid();
-  }
-
-  public Account.Id getAccount() {
-    return id.accountId;
-  }
-
-  public AccountSshKey.Id getKey() {
-    return id;
-  }
-
-  public String getSshPublicKey() {
-    return sshPublicKey;
-  }
-
-  private String getPublicKeyPart(int index, String defaultValue) {
-    String s = getSshPublicKey();
-    if (s != null && s.length() > 0) {
-      String[] parts = s.split(" ");
-      if (parts.length > index) {
-        return parts[index];
-      }
-    }
-    return defaultValue;
-  }
-
-  public String getAlgorithm() {
-    return getPublicKeyPart(0, "none");
-  }
-
-  public String getEncodedKey() {
-    return getPublicKeyPart(1, null);
-  }
-
-  public String getComment() {
-    return getPublicKeyPart(2, "");
-  }
-
-  public boolean isValid() {
-    return valid && id.isValid();
-  }
-
-  public void setInvalid() {
-    valid = false;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (o instanceof AccountSshKey) {
-      AccountSshKey other = (AccountSshKey) o;
-      return Objects.equals(id, other.id)
-          && Objects.equals(sshPublicKey, other.sshPublicKey)
-          && Objects.equals(valid, other.valid);
-    }
-    return false;
-  }
-
-  @Override
-  public int hashCode() {
-    return Objects.hash(id, sshPublicKey, valid);
-  }
-}
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Change.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Change.java
deleted file mode 100644
index 201315e..0000000
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Change.java
+++ /dev/null
@@ -1,762 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.reviewdb.client;
-
-import static com.google.gerrit.reviewdb.client.RefNames.REFS_CHANGES;
-
-import com.google.gerrit.extensions.client.ChangeStatus;
-import com.google.gwtorm.client.Column;
-import com.google.gwtorm.client.IntKey;
-import com.google.gwtorm.client.RowVersion;
-import com.google.gwtorm.client.StringKey;
-import java.sql.Timestamp;
-import java.util.Arrays;
-
-/**
- * A change proposed to be merged into a {@link Branch}.
- *
- * <p>The data graph rooted below a Change can be quite complex:
- *
- * <pre>
- *   {@link Change}
- *     |
- *     +- {@link ChangeMessage}: &quot;cover letter&quot; or general comment.
- *     |
- *     +- {@link PatchSet}: a single variant of this change.
- *          |
- *          +- {@link PatchSetApproval}: a +/- vote on the change's current state.
- *          |
- *          +- {@link PatchLineComment}: comment about a specific line
- * </pre>
- *
- * <p>
- *
- * <h5>PatchSets</h5>
- *
- * <p>Every change has at least one PatchSet. A change starts out with one PatchSet, the initial
- * proposal put forth by the change owner. This {@link Account} is usually also listed as the author
- * and committer in the PatchSetInfo.
- *
- * <p>Each PatchSet contains zero or more Patch records, detailing the file paths impacted by the
- * change (otherwise known as, the file paths the author added/deleted/modified). Sometimes a merge
- * commit can contain zero patches, if the merge has no conflicts, or has no impact other than to
- * cut off a line of development.
- *
- * <p>Each PatchLineComment is a draft or a published comment about a single line of the associated
- * file. These are the inline comment entities created by users as they perform a review.
- *
- * <p>When additional PatchSets appear under a change, these PatchSets reference <i>replacement</i>
- * commits; alternative commits that could be made to the project instead of the original commit
- * referenced by the first PatchSet.
- *
- * <p>A change has at most one current PatchSet. The current PatchSet is updated when a new
- * replacement PatchSet is uploaded. When a change is submitted, the current patch set is what is
- * merged into the destination branch.
- *
- * <p>
- *
- * <h5>ChangeMessage</h5>
- *
- * <p>The ChangeMessage entity is a general free-form comment about the whole change, rather than
- * PatchLineComment's file and line specific context. The ChangeMessage appears at the start of any
- * email generated by Gerrit, and is shown on the change overview page, rather than in a
- * file-specific context. Users often use this entity to describe general remarks about the overall
- * concept proposed by the change.
- *
- * <p>
- *
- * <h5>PatchSetApproval</h5>
- *
- * <p>PatchSetApproval entities exist to fill in the <i>cells</i> of the approvals table in the web
- * UI. That is, a single PatchSetApproval record's key is the tuple {@code
- * (PatchSet,Account,ApprovalCategory)}. Each PatchSetApproval carries with it a small score value,
- * typically within the range -2..+2.
- *
- * <p>If an Account has created only PatchSetApprovals with a score value of 0, the Change shows in
- * their dashboard, and they are said to be CC'd (carbon copied) on the Change, but are not a direct
- * reviewer. This often happens when an account was specified at upload time with the {@code --cc}
- * command line flag, or have published comments, but left the approval scores at 0 ("No Score").
- *
- * <p>If an Account has one or more PatchSetApprovals with a score != 0, the Change shows in their
- * dashboard, and they are said to be an active reviewer. Such individuals are highlighted when
- * notice of a replacement patch set is sent, or when notice of the change submission occurs.
- */
-public final class Change {
-  public static class Id extends IntKey<com.google.gwtorm.client.Key<?>> {
-    private static final long serialVersionUID = 1L;
-
-    @Column(id = 1)
-    public int id;
-
-    protected Id() {}
-
-    public Id(int id) {
-      this.id = id;
-    }
-
-    @Override
-    public int get() {
-      return id;
-    }
-
-    @Override
-    protected void set(int newValue) {
-      id = newValue;
-    }
-
-    public String toRefPrefix() {
-      return refPrefixBuilder().toString();
-    }
-
-    StringBuilder refPrefixBuilder() {
-      StringBuilder r = new StringBuilder(32).append(REFS_CHANGES);
-      int m = id % 100;
-      if (m < 10) {
-        r.append('0');
-      }
-      return r.append(m).append('/').append(id).append('/');
-    }
-
-    /** Parse a Change.Id out of a string representation. */
-    public static Id parse(String str) {
-      final Id r = new Id();
-      r.fromString(str);
-      return r;
-    }
-
-    public static Id fromRef(String ref) {
-      if (RefNames.isRefsEdit(ref)) {
-        return fromEditRefPart(ref);
-      }
-      int cs = startIndex(ref);
-      if (cs < 0) {
-        return null;
-      }
-      int ce = nextNonDigit(ref, cs);
-      if (ref.substring(ce).equals(RefNames.META_SUFFIX)
-          || ref.substring(ce).equals(RefNames.ROBOT_COMMENTS_SUFFIX)
-          || PatchSet.Id.fromRef(ref, ce) >= 0) {
-        return new Change.Id(Integer.parseInt(ref.substring(cs, ce)));
-      }
-      return null;
-    }
-
-    public static Id fromAllUsersRef(String ref) {
-      if (ref == null) {
-        return null;
-      }
-      String prefix;
-      if (ref.startsWith(RefNames.REFS_STARRED_CHANGES)) {
-        prefix = RefNames.REFS_STARRED_CHANGES;
-      } else if (ref.startsWith(RefNames.REFS_DRAFT_COMMENTS)) {
-        prefix = RefNames.REFS_DRAFT_COMMENTS;
-      } else {
-        return null;
-      }
-      int cs = startIndex(ref, prefix);
-      if (cs < 0) {
-        return null;
-      }
-      int ce = nextNonDigit(ref, cs);
-      if (ce < ref.length() && ref.charAt(ce) == '/' && isNumeric(ref, ce + 1)) {
-        return new Change.Id(Integer.parseInt(ref.substring(cs, ce)));
-      }
-      return null;
-    }
-
-    private static boolean isNumeric(String s, int off) {
-      if (off >= s.length()) {
-        return false;
-      }
-      for (int i = off; i < s.length(); i++) {
-        if (!Character.isDigit(s.charAt(i))) {
-          return false;
-        }
-      }
-      return true;
-    }
-
-    public static Id fromEditRefPart(String ref) {
-      int startChangeId = ref.indexOf(RefNames.EDIT_PREFIX) + RefNames.EDIT_PREFIX.length();
-      int endChangeId = nextNonDigit(ref, startChangeId);
-      String id = ref.substring(startChangeId, endChangeId);
-      if (id != null && !id.isEmpty()) {
-        return new Change.Id(Integer.parseInt(id));
-      }
-      return null;
-    }
-
-    public static Id fromRefPart(String ref) {
-      Integer id = RefNames.parseShardedRefPart(ref);
-      return id != null ? new Change.Id(id) : null;
-    }
-
-    static int startIndex(String ref) {
-      return startIndex(ref, REFS_CHANGES);
-    }
-
-    static int startIndex(String ref, String expectedPrefix) {
-      if (ref == null || !ref.startsWith(expectedPrefix)) {
-        return -1;
-      }
-
-      // Last 2 digits.
-      int ls = expectedPrefix.length();
-      int le = nextNonDigit(ref, ls);
-      if (le - ls != 2 || le >= ref.length() || ref.charAt(le) != '/') {
-        return -1;
-      }
-
-      // Change ID.
-      int cs = le + 1;
-      if (cs >= ref.length() || ref.charAt(cs) == '0') {
-        return -1;
-      }
-      int ce = nextNonDigit(ref, cs);
-      if (ce >= ref.length() || ref.charAt(ce) != '/') {
-        return -1;
-      }
-      switch (ce - cs) {
-        case 0:
-          return -1;
-        case 1:
-          if (ref.charAt(ls) != '0' || ref.charAt(ls + 1) != ref.charAt(cs)) {
-            return -1;
-          }
-          break;
-        default:
-          if (ref.charAt(ls) != ref.charAt(ce - 2) || ref.charAt(ls + 1) != ref.charAt(ce - 1)) {
-            return -1;
-          }
-          break;
-      }
-      return cs;
-    }
-
-    static int nextNonDigit(String s, int i) {
-      while (i < s.length() && s.charAt(i) >= '0' && s.charAt(i) <= '9') {
-        i++;
-      }
-      return i;
-    }
-  }
-
-  /** Globally unique identification of this change. */
-  public static class Key extends StringKey<com.google.gwtorm.client.Key<?>> {
-    private static final long serialVersionUID = 1L;
-
-    @Column(id = 1, length = 60)
-    protected String id;
-
-    protected Key() {}
-
-    public Key(String id) {
-      this.id = id;
-    }
-
-    @Override
-    public String get() {
-      return id;
-    }
-
-    @Override
-    protected void set(String newValue) {
-      id = newValue;
-    }
-
-    /** Construct a key that is after all keys prefixed by this key. */
-    public Key max() {
-      final StringBuilder revEnd = new StringBuilder(get().length() + 1);
-      revEnd.append(get());
-      revEnd.append('\u9fa5');
-      return new Key(revEnd.toString());
-    }
-
-    /** Obtain a shorter version of this key string, using a leading prefix. */
-    public String abbreviate() {
-      final String s = get();
-      return s.substring(0, Math.min(s.length(), 9));
-    }
-
-    /** Parse a Change.Key out of a string representation. */
-    public static Key parse(String str) {
-      final Key r = new Key();
-      r.fromString(str);
-      return r;
-    }
-  }
-
-  /** Minimum database status constant for an open change. */
-  private static final char MIN_OPEN = 'a';
-  /** Database constant for {@link Status#NEW}. */
-  public static final char STATUS_NEW = 'n';
-  /** Maximum database status constant for an open change. */
-  private static final char MAX_OPEN = 'z';
-
-  /** Database constant for {@link Status#MERGED}. */
-  public static final char STATUS_MERGED = 'M';
-
-  /** ID number of the first patch set in a change. */
-  public static final int INITIAL_PATCH_SET_ID = 1;
-
-  /** Change-Id pattern. */
-  public static final String CHANGE_ID_PATTERN = "^[iI][0-9a-f]{4,}.*$";
-
-  /**
-   * Current state within the basic workflow of the change.
-   *
-   * <p>Within the database, lower case codes ('a'..'z') indicate a change that is still open, and
-   * that can be modified/refined further, while upper case codes ('A'..'Z') indicate a change that
-   * is closed and cannot be further modified.
-   */
-  public enum Status {
-    /**
-     * Change is open and pending review, or review is in progress.
-     *
-     * <p>This is the default state assigned to a change when it is first created in the database. A
-     * change stays in the NEW state throughout its review cycle, until the change is submitted or
-     * abandoned.
-     *
-     * <p>Changes in the NEW state can be moved to:
-     *
-     * <ul>
-     *   <li>{@link #MERGED} - when the Submit Patch Set action is used;
-     *   <li>{@link #ABANDONED} - when the Abandon action is used.
-     * </ul>
-     */
-    NEW(STATUS_NEW, ChangeStatus.NEW),
-
-    /**
-     * Change is closed, and submitted to its destination branch.
-     *
-     * <p>Once a change has been merged, it cannot be further modified by adding a replacement patch
-     */
-    MERGED(STATUS_MERGED, ChangeStatus.MERGED),
-
-    /**
-     * Change is closed, but was not submitted to its destination branch.
-     *
-     * <p>Once a change has been abandoned, it cannot be further modified by adding a replacement
-     * patch set, and it cannot be merged. Draft comments however may be published, permitting
-     * reviewers to send constructive feedback.
-     */
-    ABANDONED('A', ChangeStatus.ABANDONED);
-
-    static {
-      boolean ok = true;
-      if (Status.values().length != ChangeStatus.values().length) {
-        ok = false;
-      }
-      for (Status s : Status.values()) {
-        ok &= s.name().equals(s.changeStatus.name());
-      }
-      if (!ok) {
-        throw new IllegalStateException(
-            "Mismatched status mapping: "
-                + Arrays.asList(Status.values())
-                + " != "
-                + Arrays.asList(ChangeStatus.values()));
-      }
-    }
-
-    private final char code;
-    private final boolean closed;
-    private final ChangeStatus changeStatus;
-
-    Status(char c, ChangeStatus cs) {
-      code = c;
-      closed = !(MIN_OPEN <= c && c <= MAX_OPEN);
-      changeStatus = cs;
-    }
-
-    public char getCode() {
-      return code;
-    }
-
-    public boolean isOpen() {
-      return !closed;
-    }
-
-    public boolean isClosed() {
-      return closed;
-    }
-
-    public ChangeStatus asChangeStatus() {
-      return changeStatus;
-    }
-
-    public static Status forCode(char c) {
-      for (Status s : Status.values()) {
-        if (s.code == c) {
-          return s;
-        }
-      }
-
-      // TODO(davido): Remove in 3.0, after all sites upgraded to version,
-      // where DRAFT status was removed. This code path is still needed,
-      // when changes are deserialized from the secondary index, during
-      // the online migration to the new schema version wasn't completed.
-      if (c == 'd') {
-        return Status.NEW;
-      }
-      return null;
-    }
-
-    public static Status forChangeStatus(ChangeStatus cs) {
-      for (Status s : Status.values()) {
-        if (s.changeStatus == cs) {
-          return s;
-        }
-      }
-      return null;
-    }
-  }
-
-  /** Locally assigned unique identifier of the change */
-  @Column(id = 1)
-  protected Id changeId;
-
-  /** Globally assigned unique identifier of the change */
-  @Column(id = 2)
-  protected Key changeKey;
-
-  /** optimistic locking */
-  @Column(id = 3)
-  @RowVersion
-  protected int rowVersion;
-
-  /** When this change was first introduced into the database. */
-  @Column(id = 4)
-  protected Timestamp createdOn;
-
-  /**
-   * When was a meaningful modification last made to this record's data
-   *
-   * <p>Note, this update timestamp includes its children.
-   */
-  @Column(id = 5)
-  protected Timestamp lastUpdatedOn;
-
-  // DELETED: id = 6 (sortkey)
-
-  @Column(id = 7, name = "owner_account_id")
-  protected Account.Id owner;
-
-  /** The branch (and project) this change merges into. */
-  @Column(id = 8)
-  protected Branch.NameKey dest;
-
-  // DELETED: id = 9 (open)
-
-  /** Current state code; see {@link Status}. */
-  @Column(id = 10)
-  protected char status;
-
-  // DELETED: id = 11 (nbrPatchSets)
-
-  /** The current patch set. */
-  @Column(id = 12)
-  protected int currentPatchSetId;
-
-  /** Subject from the current patch set. */
-  @Column(id = 13)
-  protected String subject;
-
-  /** Topic name assigned by the user, if any. */
-  @Column(id = 14, notNull = false)
-  protected String topic;
-
-  // DELETED: id = 15 (lastSha1MergeTested)
-  // DELETED: id = 16 (mergeable)
-
-  /**
-   * First line of first patch set's commit message.
-   *
-   * <p>Unlike {@link #subject}, this string does not change if future patch sets change the first
-   * line.
-   */
-  @Column(id = 17, notNull = false)
-  protected String originalSubject;
-
-  /**
-   * Unique id for the changes submitted together assigned during merging. Only set if the status is
-   * MERGED.
-   */
-  @Column(id = 18, notNull = false)
-  protected String submissionId;
-
-  /** Allows assigning a change to a user. */
-  @Column(id = 19, notNull = false)
-  protected Account.Id assignee;
-
-  /** Whether the change is private. */
-  @Column(id = 20)
-  protected boolean isPrivate;
-
-  /** Whether the change is work in progress. */
-  @Column(id = 21)
-  protected boolean workInProgress;
-
-  /** Whether the change has started review. */
-  @Column(id = 22)
-  protected boolean reviewStarted;
-
-  /** References a change that this change reverts. */
-  @Column(id = 23, notNull = false)
-  protected Id revertOf;
-
-  /** @see com.google.gerrit.server.notedb.NoteDbChangeState */
-  @Column(id = 101, notNull = false, length = Integer.MAX_VALUE)
-  protected String noteDbState;
-
-  protected Change() {}
-
-  public Change(
-      Change.Key newKey,
-      Change.Id newId,
-      Account.Id ownedBy,
-      Branch.NameKey forBranch,
-      Timestamp ts) {
-    changeKey = newKey;
-    changeId = newId;
-    createdOn = ts;
-    lastUpdatedOn = createdOn;
-    owner = ownedBy;
-    dest = forBranch;
-    setStatus(Status.NEW);
-  }
-
-  public Change(Change other) {
-    assignee = other.assignee;
-    changeId = other.changeId;
-    changeKey = other.changeKey;
-    rowVersion = other.rowVersion;
-    createdOn = other.createdOn;
-    lastUpdatedOn = other.lastUpdatedOn;
-    owner = other.owner;
-    dest = other.dest;
-    status = other.status;
-    currentPatchSetId = other.currentPatchSetId;
-    subject = other.subject;
-    originalSubject = other.originalSubject;
-    submissionId = other.submissionId;
-    topic = other.topic;
-    isPrivate = other.isPrivate;
-    workInProgress = other.workInProgress;
-    reviewStarted = other.reviewStarted;
-    noteDbState = other.noteDbState;
-    revertOf = other.revertOf;
-  }
-
-  /** Legacy 32 bit integer identity for a change. */
-  public Change.Id getId() {
-    return changeId;
-  }
-
-  /** Legacy 32 bit integer identity for a change. */
-  public int getChangeId() {
-    return changeId.get();
-  }
-
-  /** The Change-Id tag out of the initial commit, or a natural key. */
-  public Change.Key getKey() {
-    return changeKey;
-  }
-
-  public void setKey(Change.Key k) {
-    changeKey = k;
-  }
-
-  public Account.Id getAssignee() {
-    return assignee;
-  }
-
-  public void setAssignee(Account.Id a) {
-    assignee = a;
-  }
-
-  public Timestamp getCreatedOn() {
-    return createdOn;
-  }
-
-  public void setCreatedOn(Timestamp ts) {
-    createdOn = ts;
-  }
-
-  public Timestamp getLastUpdatedOn() {
-    return lastUpdatedOn;
-  }
-
-  public void setLastUpdatedOn(Timestamp now) {
-    lastUpdatedOn = now;
-  }
-
-  public int getRowVersion() {
-    return rowVersion;
-  }
-
-  public Account.Id getOwner() {
-    return owner;
-  }
-
-  public void setOwner(Account.Id owner) {
-    this.owner = owner;
-  }
-
-  public Branch.NameKey getDest() {
-    return dest;
-  }
-
-  public void setDest(Branch.NameKey dest) {
-    this.dest = dest;
-  }
-
-  public Project.NameKey getProject() {
-    return dest.getParentKey();
-  }
-
-  public String getSubject() {
-    return subject;
-  }
-
-  public String getOriginalSubject() {
-    return originalSubject != null ? originalSubject : subject;
-  }
-
-  public String getOriginalSubjectOrNull() {
-    return originalSubject;
-  }
-
-  /** Get the id of the most current {@link PatchSet} in this change. */
-  public PatchSet.Id currentPatchSetId() {
-    if (currentPatchSetId > 0) {
-      return new PatchSet.Id(changeId, currentPatchSetId);
-    }
-    return null;
-  }
-
-  public void setCurrentPatchSet(PatchSetInfo ps) {
-    if (originalSubject == null && subject != null) {
-      // Change was created before schema upgrade. Use the last subject
-      // associated with this change, as the most recent discussion will
-      // be under that thread in an email client such as GMail.
-      originalSubject = subject;
-    }
-
-    currentPatchSetId = ps.getKey().get();
-    subject = ps.getSubject();
-
-    if (originalSubject == null) {
-      // Newly created changes remember the first commit's subject.
-      originalSubject = subject;
-    }
-  }
-
-  public void setCurrentPatchSet(PatchSet.Id psId, String subject, String originalSubject) {
-    if (!psId.getParentKey().equals(changeId)) {
-      throw new IllegalArgumentException("patch set ID " + psId + " is not for change " + changeId);
-    }
-    currentPatchSetId = psId.get();
-    this.subject = subject;
-    this.originalSubject = originalSubject;
-  }
-
-  public void clearCurrentPatchSet() {
-    currentPatchSetId = 0;
-    subject = null;
-    originalSubject = null;
-  }
-
-  public String getSubmissionId() {
-    return submissionId;
-  }
-
-  public void setSubmissionId(String id) {
-    this.submissionId = id;
-  }
-
-  public Status getStatus() {
-    return Status.forCode(status);
-  }
-
-  public void setStatus(Status newStatus) {
-    status = newStatus.getCode();
-  }
-
-  public String getTopic() {
-    return topic;
-  }
-
-  public void setTopic(String topic) {
-    this.topic = topic;
-  }
-
-  public boolean isPrivate() {
-    return isPrivate;
-  }
-
-  public void setPrivate(boolean isPrivate) {
-    this.isPrivate = isPrivate;
-  }
-
-  public boolean isWorkInProgress() {
-    return workInProgress;
-  }
-
-  public void setWorkInProgress(boolean workInProgress) {
-    this.workInProgress = workInProgress;
-  }
-
-  public boolean hasReviewStarted() {
-    return reviewStarted;
-  }
-
-  public void setReviewStarted(boolean reviewStarted) {
-    this.reviewStarted = reviewStarted;
-  }
-
-  public void setRevertOf(Id revertOf) {
-    this.revertOf = revertOf;
-  }
-
-  public Id getRevertOf() {
-    return this.revertOf;
-  }
-
-  public String getNoteDbState() {
-    return noteDbState;
-  }
-
-  public void setNoteDbState(String state) {
-    noteDbState = state;
-  }
-
-  @Override
-  public String toString() {
-    return new StringBuilder(getClass().getSimpleName())
-        .append('{')
-        .append(changeId)
-        .append(" (")
-        .append(changeKey)
-        .append("), ")
-        .append("dest=")
-        .append(dest)
-        .append(", ")
-        .append("status=")
-        .append(status)
-        .append('}')
-        .toString();
-  }
-}
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/ChangeMessage.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/ChangeMessage.java
deleted file mode 100644
index edc022f..0000000
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/ChangeMessage.java
+++ /dev/null
@@ -1,170 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.reviewdb.client;
-
-import com.google.gwtorm.client.Column;
-import com.google.gwtorm.client.StringKey;
-import java.sql.Timestamp;
-import java.util.Objects;
-
-/** A message attached to a {@link Change}. */
-public final class ChangeMessage {
-  public static class Key extends StringKey<Change.Id> {
-    private static final long serialVersionUID = 1L;
-
-    @Column(id = 1)
-    protected Change.Id changeId;
-
-    @Column(id = 2, length = 40)
-    protected String uuid;
-
-    protected Key() {
-      changeId = new Change.Id();
-    }
-
-    public Key(Change.Id change, String uuid) {
-      this.changeId = change;
-      this.uuid = uuid;
-    }
-
-    @Override
-    public Change.Id getParentKey() {
-      return changeId;
-    }
-
-    @Override
-    public String get() {
-      return uuid;
-    }
-
-    @Override
-    public void set(String newValue) {
-      uuid = newValue;
-    }
-  }
-
-  @Column(id = 1, name = Column.NONE)
-  protected Key key;
-
-  /** Who wrote this comment; null if it was written by the Gerrit system. */
-  @Column(id = 2, name = "author_id", notNull = false)
-  protected Account.Id author;
-
-  /** When this comment was drafted. */
-  @Column(id = 3)
-  protected Timestamp writtenOn;
-
-  /** The text left by the user. */
-  @Column(id = 4, notNull = false, length = Integer.MAX_VALUE)
-  protected String message;
-
-  /** Which patchset (if any) was this message generated from? */
-  @Column(id = 5, notNull = false)
-  protected PatchSet.Id patchset;
-
-  /** Tag associated with change message */
-  @Column(id = 6, notNull = false)
-  protected String tag;
-
-  /** Real user that added this message on behalf of the user recorded in {@link #author}. */
-  @Column(id = 7, notNull = false)
-  protected Account.Id realAuthor;
-
-  protected ChangeMessage() {}
-
-  public ChangeMessage(final ChangeMessage.Key k, Account.Id a, Timestamp wo, PatchSet.Id psid) {
-    key = k;
-    author = a;
-    writtenOn = wo;
-    patchset = psid;
-  }
-
-  public ChangeMessage.Key getKey() {
-    return key;
-  }
-
-  /** If null, the message was written 'by the Gerrit system'. */
-  public Account.Id getAuthor() {
-    return author;
-  }
-
-  public void setAuthor(Account.Id accountId) {
-    if (author != null) {
-      throw new IllegalStateException("Cannot modify author once assigned");
-    }
-    author = accountId;
-  }
-
-  public Account.Id getRealAuthor() {
-    return realAuthor != null ? realAuthor : getAuthor();
-  }
-
-  public void setRealAuthor(Account.Id id) {
-    // Use null for same real author, as before the column was added.
-    realAuthor = Objects.equals(getAuthor(), id) ? null : id;
-  }
-
-  public Timestamp getWrittenOn() {
-    return writtenOn;
-  }
-
-  public void setWrittenOn(Timestamp ts) {
-    writtenOn = ts;
-  }
-
-  public String getMessage() {
-    return message;
-  }
-
-  public void setMessage(String s) {
-    message = s;
-  }
-
-  public String getTag() {
-    return tag;
-  }
-
-  public void setTag(String tag) {
-    this.tag = tag;
-  }
-
-  public PatchSet.Id getPatchSetId() {
-    return patchset;
-  }
-
-  public void setPatchSetId(PatchSet.Id id) {
-    patchset = id;
-  }
-
-  @Override
-  public String toString() {
-    return "ChangeMessage{"
-        + "key="
-        + key
-        + ", author="
-        + author
-        + ", realAuthor="
-        + realAuthor
-        + ", writtenOn="
-        + writtenOn
-        + ", patchset="
-        + patchset
-        + ", tag="
-        + tag
-        + ", message=["
-        + message
-        + "]}";
-  }
-}
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Comment.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Comment.java
deleted file mode 100644
index 4b3c652..0000000
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Comment.java
+++ /dev/null
@@ -1,331 +0,0 @@
-// 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.
-
-package com.google.gerrit.reviewdb.client;
-
-import java.sql.Timestamp;
-import java.util.Comparator;
-import java.util.Objects;
-
-/**
- * This class represents inline comments in NoteDb. This means it determines the JSON format for
- * inline comments in the revision notes that NoteDb uses to persist inline comments.
- *
- * <p>Changing fields in this class changes the storage format of inline comments in NoteDb and may
- * require a corresponding data migration (adding new optional fields is generally okay).
- *
- * <p>{@link PatchLineComment} also represents inline comments, but in ReviewDb. There are a few
- * notable differences:
- *
- * <ul>
- *   <li>PatchLineComment knows the comment status (published or draft). For comments in NoteDb the
- *       status is determined by the branch in which they are stored (published comments are stored
- *       in the change meta ref; draft comments are store in refs/draft-comments branches in
- *       All-Users). Hence Comment doesn't need to contain the status, but the status is implicitly
- *       known by where the comments are read from.
- *   <li>PatchLineComment knows the change ID. For comments in NoteDb, the change ID is determined
- *       by the branch in which they are stored (the ref name contains the change ID). Hence Comment
- *       doesn't need to contain the change ID, but the change ID is implicitly known by where the
- *       comments are read from.
- * </ul>
- *
- * <p>For all utility classes and middle layer functionality using Comment over PatchLineComment is
- * preferred, as PatchLineComment will go away together with ReviewDb. This means Comment should be
- * used everywhere and only for storing inline comment in ReviewDb a conversion to PatchLineComment
- * is done. Converting Comments to PatchLineComments and vice verse is done by
- * CommentsUtil#toPatchLineComments(Change.Id, PatchLineComment.Status, Iterable) and
- * CommentsUtil#toComments(String, Iterable).
- */
-public class Comment {
-  public static class Key {
-    public String uuid;
-    public String filename;
-    public int patchSetId;
-
-    public Key(Key k) {
-      this(k.uuid, k.filename, k.patchSetId);
-    }
-
-    public Key(String uuid, String filename, int patchSetId) {
-      this.uuid = uuid;
-      this.filename = filename;
-      this.patchSetId = patchSetId;
-    }
-
-    @Override
-    public String toString() {
-      return new StringBuilder()
-          .append("Comment.Key{")
-          .append("uuid=")
-          .append(uuid)
-          .append(',')
-          .append("filename=")
-          .append(filename)
-          .append(',')
-          .append("patchSetId=")
-          .append(patchSetId)
-          .append('}')
-          .toString();
-    }
-
-    @Override
-    public boolean equals(Object o) {
-      if (o instanceof Key) {
-        Key k = (Key) o;
-        return Objects.equals(uuid, k.uuid)
-            && Objects.equals(filename, k.filename)
-            && Objects.equals(patchSetId, k.patchSetId);
-      }
-      return false;
-    }
-
-    @Override
-    public int hashCode() {
-      return Objects.hash(uuid, filename, patchSetId);
-    }
-  }
-
-  public static class Identity {
-    int id;
-
-    public Identity(Account.Id id) {
-      this.id = id.get();
-    }
-
-    public Account.Id getId() {
-      return new Account.Id(id);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-      if (o instanceof Identity) {
-        return Objects.equals(id, ((Identity) o).id);
-      }
-      return false;
-    }
-
-    @Override
-    public int hashCode() {
-      return Objects.hash(id);
-    }
-
-    @Override
-    public String toString() {
-      return new StringBuilder()
-          .append("Comment.Identity{")
-          .append("id=")
-          .append(id)
-          .append('}')
-          .toString();
-    }
-  }
-
-  public static class Range implements Comparable<Range> {
-    private static final Comparator<Range> RANGE_COMPARATOR =
-        Comparator.<Range>comparingInt(range -> range.startLine)
-            .thenComparingInt(range -> range.startChar)
-            .thenComparingInt(range -> range.endLine)
-            .thenComparingInt(range -> range.endChar);
-
-    public int startLine; // 1-based, inclusive
-    public int startChar; // 0-based, inclusive
-    public int endLine; // 1-based, exclusive
-    public int endChar; // 0-based, exclusive
-
-    public Range(Range r) {
-      this(r.startLine, r.startChar, r.endLine, r.endChar);
-    }
-
-    public Range(com.google.gerrit.extensions.client.Comment.Range r) {
-      this(r.startLine, r.startCharacter, r.endLine, r.endCharacter);
-    }
-
-    public Range(int startLine, int startChar, int endLine, int endChar) {
-      this.startLine = startLine;
-      this.startChar = startChar;
-      this.endLine = endLine;
-      this.endChar = endChar;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-      if (o instanceof Range) {
-        Range r = (Range) o;
-        return Objects.equals(startLine, r.startLine)
-            && Objects.equals(startChar, r.startChar)
-            && Objects.equals(endLine, r.endLine)
-            && Objects.equals(endChar, r.endChar);
-      }
-      return false;
-    }
-
-    @Override
-    public int hashCode() {
-      return Objects.hash(startLine, startChar, endLine, endChar);
-    }
-
-    @Override
-    public String toString() {
-      return new StringBuilder()
-          .append("Comment.Range{")
-          .append("startLine=")
-          .append(startLine)
-          .append(',')
-          .append("startChar=")
-          .append(startChar)
-          .append(',')
-          .append("endLine=")
-          .append(endLine)
-          .append(',')
-          .append("endChar=")
-          .append(endChar)
-          .append('}')
-          .toString();
-    }
-
-    @Override
-    public int compareTo(Range otherRange) {
-      return RANGE_COMPARATOR.compare(this, otherRange);
-    }
-  }
-
-  public Key key;
-  public int lineNbr;
-  public Identity author;
-  protected Identity realAuthor;
-  public Timestamp writtenOn;
-  public short side;
-  public String message;
-  public String parentUuid;
-  public Range range;
-  public String tag;
-  public String revId;
-  public String serverId;
-  public boolean unresolved;
-
-  public Comment(Comment c) {
-    this(
-        new Key(c.key),
-        c.author.getId(),
-        new Timestamp(c.writtenOn.getTime()),
-        c.side,
-        c.message,
-        c.serverId,
-        c.unresolved);
-    this.lineNbr = c.lineNbr;
-    this.realAuthor = c.realAuthor;
-    this.range = c.range != null ? new Range(c.range) : null;
-    this.tag = c.tag;
-    this.revId = c.revId;
-    this.unresolved = c.unresolved;
-  }
-
-  public Comment(
-      Key key,
-      Account.Id author,
-      Timestamp writtenOn,
-      short side,
-      String message,
-      String serverId,
-      boolean unresolved) {
-    this.key = key;
-    this.author = new Comment.Identity(author);
-    this.realAuthor = this.author;
-    this.writtenOn = writtenOn;
-    this.side = side;
-    this.message = message;
-    this.serverId = serverId;
-    this.unresolved = unresolved;
-  }
-
-  public void setLineNbrAndRange(
-      Integer lineNbr, com.google.gerrit.extensions.client.Comment.Range range) {
-    this.lineNbr = lineNbr != null ? lineNbr : range != null ? range.endLine : 0;
-    if (range != null) {
-      this.range = new Comment.Range(range);
-    }
-  }
-
-  public void setRange(CommentRange range) {
-    this.range = range != null ? range.asCommentRange() : null;
-  }
-
-  public void setRevId(RevId revId) {
-    this.revId = revId != null ? revId.get() : null;
-  }
-
-  public void setRealAuthor(Account.Id id) {
-    realAuthor = id != null && id.get() != author.id ? new Comment.Identity(id) : null;
-  }
-
-  public Identity getRealAuthor() {
-    return realAuthor != null ? realAuthor : author;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (o instanceof Comment) {
-      return Objects.equals(key, ((Comment) o).key);
-    }
-    return false;
-  }
-
-  @Override
-  public int hashCode() {
-    return key.hashCode();
-  }
-
-  @Override
-  public String toString() {
-    return new StringBuilder()
-        .append("Comment{")
-        .append("key=")
-        .append(key)
-        .append(',')
-        .append("lineNbr=")
-        .append(lineNbr)
-        .append(',')
-        .append("author=")
-        .append(author.getId().get())
-        .append(',')
-        .append("realAuthor=")
-        .append(realAuthor != null ? realAuthor.getId().get() : "")
-        .append(',')
-        .append("writtenOn=")
-        .append(writtenOn.toString())
-        .append(',')
-        .append("side=")
-        .append(side)
-        .append(',')
-        .append("message=")
-        .append(Objects.toString(message, ""))
-        .append(',')
-        .append("parentUuid=")
-        .append(Objects.toString(parentUuid, ""))
-        .append(',')
-        .append("range=")
-        .append(Objects.toString(range, ""))
-        .append(',')
-        .append("revId=")
-        .append(revId != null ? revId : "")
-        .append(',')
-        .append("tag=")
-        .append(Objects.toString(tag, ""))
-        .append(',')
-        .append("unresolved=")
-        .append(unresolved)
-        .append('}')
-        .toString();
-  }
-}
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/CommentRange.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/CommentRange.java
deleted file mode 100644
index b9da8d5..0000000
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/CommentRange.java
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.reviewdb.client;
-
-import com.google.gwtorm.client.Column;
-
-public class CommentRange {
-
-  @Column(id = 1)
-  protected int startLine;
-
-  @Column(id = 2)
-  protected int startCharacter;
-
-  @Column(id = 3)
-  protected int endLine;
-
-  @Column(id = 4)
-  protected int endCharacter;
-
-  protected CommentRange() {}
-
-  public CommentRange(int sl, int sc, int el, int ec) {
-    startLine = sl;
-    startCharacter = sc;
-    endLine = el;
-    endCharacter = ec;
-  }
-
-  public int getStartLine() {
-    return startLine;
-  }
-
-  public int getStartCharacter() {
-    return startCharacter;
-  }
-
-  public int getEndLine() {
-    return endLine;
-  }
-
-  public int getEndCharacter() {
-    return endCharacter;
-  }
-
-  public void setStartLine(int sl) {
-    startLine = sl;
-  }
-
-  public void setStartCharacter(int sc) {
-    startCharacter = sc;
-  }
-
-  public void setEndLine(int el) {
-    endLine = el;
-  }
-
-  public void setEndCharacter(int ec) {
-    endCharacter = ec;
-  }
-
-  public Comment.Range asCommentRange() {
-    return new Comment.Range(startLine, startCharacter, endLine, endCharacter);
-  }
-
-  @Override
-  public boolean equals(Object obj) {
-    if (obj instanceof CommentRange) {
-      CommentRange other = (CommentRange) obj;
-      return startLine == other.startLine
-          && startCharacter == other.startCharacter
-          && endLine == other.endLine
-          && endCharacter == other.endCharacter;
-    }
-    return false;
-  }
-
-  @Override
-  public int hashCode() {
-    int h = startLine;
-    h = h * 31 + startCharacter;
-    h = h * 31 + endLine;
-    h = h * 31 + endCharacter;
-    return h;
-  }
-
-  @Override
-  public String toString() {
-    return "Range[startLine="
-        + startLine
-        + ", startCharacter="
-        + startCharacter
-        + ", endLine="
-        + endLine
-        + ", endCharacter="
-        + endCharacter
-        + "]";
-  }
-}
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/PatchSet.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/PatchSet.java
deleted file mode 100644
index 4536b67..0000000
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/PatchSet.java
+++ /dev/null
@@ -1,286 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.reviewdb.client;
-
-import com.google.gwtorm.client.Column;
-import com.google.gwtorm.client.IntKey;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/** A single revision of a {@link Change}. */
-public final class PatchSet {
-  /** Is the reference name a change reference? */
-  public static boolean isChangeRef(String name) {
-    return Id.fromRef(name) != null;
-  }
-
-  /**
-   * Is the reference name a change reference?
-   *
-   * @deprecated use isChangeRef instead.
-   */
-  @Deprecated
-  public static boolean isRef(String name) {
-    return isChangeRef(name);
-  }
-
-  static String joinGroups(List<String> groups) {
-    if (groups == null) {
-      throw new IllegalArgumentException("groups may not be null");
-    }
-    StringBuilder sb = new StringBuilder();
-    boolean first = true;
-    for (String g : groups) {
-      if (!first) {
-        sb.append(',');
-      } else {
-        first = false;
-      }
-      sb.append(g);
-    }
-    return sb.toString();
-  }
-
-  public static List<String> splitGroups(String joinedGroups) {
-    if (joinedGroups == null) {
-      throw new IllegalArgumentException("groups may not be null");
-    }
-    List<String> groups = new ArrayList<>();
-    int i = 0;
-    while (true) {
-      int idx = joinedGroups.indexOf(',', i);
-      if (idx < 0) {
-        groups.add(joinedGroups.substring(i, joinedGroups.length()));
-        break;
-      }
-      groups.add(joinedGroups.substring(i, idx));
-      i = idx + 1;
-    }
-    return groups;
-  }
-
-  public static class Id extends IntKey<Change.Id> {
-    private static final long serialVersionUID = 1L;
-
-    @Column(id = 1)
-    public Change.Id changeId;
-
-    @Column(id = 2)
-    public int patchSetId;
-
-    public Id() {
-      changeId = new Change.Id();
-    }
-
-    public Id(Change.Id change, int id) {
-      this.changeId = change;
-      this.patchSetId = id;
-    }
-
-    @Override
-    public Change.Id getParentKey() {
-      return changeId;
-    }
-
-    @Override
-    public int get() {
-      return patchSetId;
-    }
-
-    @Override
-    protected void set(int newValue) {
-      patchSetId = newValue;
-    }
-
-    public String toRefName() {
-      return changeId.refPrefixBuilder().append(patchSetId).toString();
-    }
-
-    /** Parse a PatchSet.Id out of a string representation. */
-    public static Id parse(String str) {
-      final Id r = new Id();
-      r.fromString(str);
-      return r;
-    }
-
-    /** Parse a PatchSet.Id from a {@link PatchSet#getRefName()} result. */
-    public static Id fromRef(String ref) {
-      int cs = Change.Id.startIndex(ref);
-      if (cs < 0) {
-        return null;
-      }
-      int ce = Change.Id.nextNonDigit(ref, cs);
-      int patchSetId = fromRef(ref, ce);
-      if (patchSetId < 0) {
-        return null;
-      }
-      int changeId = Integer.parseInt(ref.substring(cs, ce));
-      return new PatchSet.Id(new Change.Id(changeId), patchSetId);
-    }
-
-    static int fromRef(String ref, int changeIdEnd) {
-      // Patch set ID.
-      int ps = changeIdEnd + 1;
-      if (ps >= ref.length() || ref.charAt(ps) == '0') {
-        return -1;
-      }
-      for (int i = ps; i < ref.length(); i++) {
-        if (ref.charAt(i) < '0' || ref.charAt(i) > '9') {
-          return -1;
-        }
-      }
-      return Integer.parseInt(ref.substring(ps));
-    }
-
-    public String getId() {
-      return toId(patchSetId);
-    }
-
-    public static String toId(int number) {
-      return number == 0 ? "edit" : String.valueOf(number);
-    }
-  }
-
-  @Column(id = 1, name = Column.NONE)
-  protected Id id;
-
-  @Column(id = 2, notNull = false)
-  protected RevId revision;
-
-  @Column(id = 3, name = "uploader_account_id")
-  protected Account.Id uploader;
-
-  /** When this patch set was first introduced onto the change. */
-  @Column(id = 4)
-  protected Timestamp createdOn;
-
-  // @Column(id = 5)
-
-  /**
-   * Opaque group identifier, usually assigned during creation.
-   *
-   * <p>This field is actually a comma-separated list of values, as in rare cases involving merge
-   * commits a patch set may belong to multiple groups.
-   *
-   * <p>Changes on the same branch having patch sets with intersecting groups are considered
-   * related, as in the "Related Changes" tab.
-   */
-  @Column(id = 6, notNull = false, length = Integer.MAX_VALUE)
-  protected String groups;
-
-  // DELETED id = 7 (pushCertficate)
-
-  /** Certificate sent with a push that created this patch set. */
-  @Column(id = 8, notNull = false, length = Integer.MAX_VALUE)
-  protected String pushCertificate;
-
-  /**
-   * Optional user-supplied description for this patch set.
-   *
-   * <p>When this field is null, the description was never set on the patch set. When this field is
-   * an empty string, the description was set and later cleared.
-   */
-  @Column(id = 9, notNull = false, length = Integer.MAX_VALUE)
-  protected String description;
-
-  protected PatchSet() {}
-
-  public PatchSet(PatchSet.Id k) {
-    id = k;
-  }
-
-  public PatchSet(PatchSet src) {
-    this.id = src.id;
-    this.revision = src.revision;
-    this.uploader = src.uploader;
-    this.createdOn = src.createdOn;
-    this.groups = src.groups;
-    this.pushCertificate = src.pushCertificate;
-    this.description = src.description;
-  }
-
-  public PatchSet.Id getId() {
-    return id;
-  }
-
-  public int getPatchSetId() {
-    return id.get();
-  }
-
-  public RevId getRevision() {
-    return revision;
-  }
-
-  public void setRevision(RevId i) {
-    revision = i;
-  }
-
-  public Account.Id getUploader() {
-    return uploader;
-  }
-
-  public void setUploader(Account.Id who) {
-    uploader = who;
-  }
-
-  public Timestamp getCreatedOn() {
-    return createdOn;
-  }
-
-  public void setCreatedOn(Timestamp ts) {
-    createdOn = ts;
-  }
-
-  public List<String> getGroups() {
-    if (groups == null) {
-      return Collections.emptyList();
-    }
-    return splitGroups(groups);
-  }
-
-  public void setGroups(List<String> groups) {
-    if (groups == null) {
-      groups = Collections.emptyList();
-    }
-    this.groups = joinGroups(groups);
-  }
-
-  public String getRefName() {
-    return id.toRefName();
-  }
-
-  public String getPushCertificate() {
-    return pushCertificate;
-  }
-
-  public void setPushCertificate(String cert) {
-    pushCertificate = cert;
-  }
-
-  public String getDescription() {
-    return description;
-  }
-
-  public void setDescription(String description) {
-    this.description = description;
-  }
-
-  @Override
-  public String toString() {
-    return "[PatchSet " + getId().toString() + "]";
-  }
-}
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/PatchSetApproval.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/PatchSetApproval.java
deleted file mode 100644
index 0f3e4e1..0000000
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/PatchSetApproval.java
+++ /dev/null
@@ -1,231 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.reviewdb.client;
-
-import com.google.gwtorm.client.Column;
-import com.google.gwtorm.client.CompoundKey;
-import java.sql.Timestamp;
-import java.util.Date;
-import java.util.Objects;
-
-/** An approval (or negative approval) on a patch set. */
-public final class PatchSetApproval {
-  public static class Key extends CompoundKey<PatchSet.Id> {
-    private static final long serialVersionUID = 1L;
-
-    @Column(id = 1, name = Column.NONE)
-    protected PatchSet.Id patchSetId;
-
-    @Column(id = 2)
-    protected Account.Id accountId;
-
-    @Column(id = 3)
-    protected LabelId categoryId;
-
-    protected Key() {
-      patchSetId = new PatchSet.Id();
-      accountId = new Account.Id();
-      categoryId = new LabelId();
-    }
-
-    public Key(PatchSet.Id ps, Account.Id a, LabelId c) {
-      this.patchSetId = ps;
-      this.accountId = a;
-      this.categoryId = c;
-    }
-
-    @Override
-    public PatchSet.Id getParentKey() {
-      return patchSetId;
-    }
-
-    public Account.Id getAccountId() {
-      return accountId;
-    }
-
-    public LabelId getLabelId() {
-      return categoryId;
-    }
-
-    @Override
-    public com.google.gwtorm.client.Key<?>[] members() {
-      return new com.google.gwtorm.client.Key<?>[] {accountId, categoryId};
-    }
-  }
-
-  @Column(id = 1, name = Column.NONE)
-  protected Key key;
-
-  /**
-   * Value assigned by the user.
-   *
-   * <p>The precise meaning of "value" is up to each category.
-   *
-   * <p>In general:
-   *
-   * <ul>
-   *   <li><b>&lt; 0:</b> The approval is rejected/revoked.
-   *   <li><b>= 0:</b> No indication either way is provided.
-   *   <li><b>&gt; 0:</b> The approval is approved/positive.
-   * </ul>
-   *
-   * and in the negative and positive direction a magnitude can be assumed.The further from 0 the
-   * more assertive the approval.
-   */
-  @Column(id = 2)
-  protected short value;
-
-  @Column(id = 3)
-  protected Timestamp granted;
-
-  @Column(id = 6, notNull = false)
-  protected String tag;
-
-  /** Real user that made this approval on behalf of the user recorded in {@link Key#accountId}. */
-  @Column(id = 7, notNull = false)
-  protected Account.Id realAccountId;
-
-  @Column(id = 8)
-  protected boolean postSubmit;
-
-  // DELETED: id = 4 (changeOpen)
-  // DELETED: id = 5 (changeSortKey)
-
-  protected PatchSetApproval() {}
-
-  public PatchSetApproval(PatchSetApproval.Key k, short v, Date ts) {
-    key = k;
-    setValue(v);
-    setGranted(ts);
-  }
-
-  public PatchSetApproval(PatchSet.Id psId, PatchSetApproval src) {
-    key = new PatchSetApproval.Key(psId, src.getAccountId(), src.getLabelId());
-    value = src.getValue();
-    granted = src.granted;
-    realAccountId = src.realAccountId;
-    tag = src.tag;
-    postSubmit = src.postSubmit;
-  }
-
-  public PatchSetApproval(PatchSetApproval src) {
-    this(src.getPatchSetId(), src);
-  }
-
-  public PatchSetApproval.Key getKey() {
-    return key;
-  }
-
-  public PatchSet.Id getPatchSetId() {
-    return key.patchSetId;
-  }
-
-  public Account.Id getAccountId() {
-    return key.accountId;
-  }
-
-  public Account.Id getRealAccountId() {
-    return realAccountId != null ? realAccountId : getAccountId();
-  }
-
-  public void setRealAccountId(Account.Id id) {
-    // Use null for same real author, as before the column was added.
-    realAccountId = Objects.equals(getAccountId(), id) ? null : id;
-  }
-
-  public LabelId getLabelId() {
-    return key.categoryId;
-  }
-
-  public short getValue() {
-    return value;
-  }
-
-  public void setValue(short v) {
-    value = v;
-  }
-
-  public Timestamp getGranted() {
-    return granted;
-  }
-
-  public void setGranted(Date when) {
-    if (when instanceof Timestamp) {
-      granted = (Timestamp) when;
-    } else {
-      granted = new Timestamp(when.getTime());
-    }
-  }
-
-  public void setTag(String t) {
-    tag = t;
-  }
-
-  public String getLabel() {
-    return getLabelId().get();
-  }
-
-  public boolean isLegacySubmit() {
-    return LabelId.LEGACY_SUBMIT_NAME.equals(getLabel());
-  }
-
-  public String getTag() {
-    return tag;
-  }
-
-  public void setPostSubmit(boolean postSubmit) {
-    this.postSubmit = postSubmit;
-  }
-
-  public boolean isPostSubmit() {
-    return postSubmit;
-  }
-
-  @Override
-  public String toString() {
-    StringBuilder sb =
-        new StringBuilder("[")
-            .append(key)
-            .append(": ")
-            .append(value)
-            .append(",tag:")
-            .append(tag)
-            .append(",realAccountId:")
-            .append(realAccountId);
-    if (postSubmit) {
-      sb.append(",postSubmit");
-    }
-    return sb.append(']').toString();
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (o instanceof PatchSetApproval) {
-      PatchSetApproval p = (PatchSetApproval) o;
-      return Objects.equals(key, p.key)
-          && Objects.equals(value, p.value)
-          && Objects.equals(granted, p.granted)
-          && Objects.equals(tag, p.tag)
-          && Objects.equals(realAccountId, p.realAccountId)
-          && postSubmit == p.postSubmit;
-    }
-    return false;
-  }
-
-  @Override
-  public int hashCode() {
-    return Objects.hash(key, value, granted, tag);
-  }
-}
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Project.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Project.java
deleted file mode 100644
index b98359f..0000000
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Project.java
+++ /dev/null
@@ -1,343 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.reviewdb.client;
-
-import com.google.gerrit.extensions.client.InheritableBoolean;
-import com.google.gerrit.extensions.client.ProjectState;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gwtorm.client.Column;
-import com.google.gwtorm.client.StringKey;
-
-/** Projects match a source code repository managed by Gerrit */
-public final class Project {
-  /** Project name key */
-  public static class NameKey extends StringKey<com.google.gwtorm.client.Key<?>> {
-    private static final long serialVersionUID = 1L;
-
-    @Column(id = 1)
-    protected String name;
-
-    protected NameKey() {}
-
-    public NameKey(String n) {
-      name = n;
-    }
-
-    @Override
-    public String get() {
-      return name;
-    }
-
-    @Override
-    protected void set(String newValue) {
-      name = newValue;
-    }
-
-    @Override
-    public int hashCode() {
-      return get().hashCode();
-    }
-
-    @Override
-    public boolean equals(Object b) {
-      if (b instanceof NameKey) {
-        return get().equals(((NameKey) b).get());
-      }
-      return false;
-    }
-
-    /** Parse a Project.NameKey out of a string representation. */
-    public static NameKey parse(String str) {
-      final NameKey r = new NameKey();
-      r.fromString(str);
-      return r;
-    }
-
-    public static String asStringOrNull(NameKey key) {
-      return key == null ? null : key.get();
-    }
-  }
-
-  protected NameKey name;
-
-  protected String description;
-
-  protected InheritableBoolean useContributorAgreements;
-
-  protected InheritableBoolean useSignedOffBy;
-
-  protected SubmitType submitType;
-
-  protected ProjectState state;
-
-  protected NameKey parent;
-
-  protected InheritableBoolean requireChangeID;
-
-  protected String maxObjectSizeLimit;
-
-  protected InheritableBoolean useContentMerge;
-
-  protected String defaultDashboardId;
-
-  protected String localDefaultDashboardId;
-
-  protected String themeName;
-
-  protected InheritableBoolean createNewChangeForAllNotInTarget;
-
-  protected InheritableBoolean enableSignedPush;
-  protected InheritableBoolean requireSignedPush;
-
-  protected InheritableBoolean rejectImplicitMerges;
-  protected InheritableBoolean privateByDefault;
-  protected InheritableBoolean workInProgressByDefault;
-
-  protected InheritableBoolean enableReviewerByEmail;
-
-  protected InheritableBoolean matchAuthorToCommitterDate;
-
-  protected Project() {}
-
-  public Project(Project.NameKey nameKey) {
-    name = nameKey;
-    submitType = SubmitType.MERGE_IF_NECESSARY;
-    state = ProjectState.ACTIVE;
-    useContributorAgreements = InheritableBoolean.INHERIT;
-    useSignedOffBy = InheritableBoolean.INHERIT;
-    requireChangeID = InheritableBoolean.INHERIT;
-    useContentMerge = InheritableBoolean.INHERIT;
-    createNewChangeForAllNotInTarget = InheritableBoolean.INHERIT;
-    enableSignedPush = InheritableBoolean.INHERIT;
-    requireSignedPush = InheritableBoolean.INHERIT;
-    privateByDefault = InheritableBoolean.INHERIT;
-    workInProgressByDefault = InheritableBoolean.INHERIT;
-    enableReviewerByEmail = InheritableBoolean.INHERIT;
-    matchAuthorToCommitterDate = InheritableBoolean.INHERIT;
-  }
-
-  public Project.NameKey getNameKey() {
-    return name;
-  }
-
-  public String getName() {
-    return name != null ? name.get() : null;
-  }
-
-  public String getDescription() {
-    return description;
-  }
-
-  public void setDescription(String d) {
-    description = d;
-  }
-
-  public InheritableBoolean getUseContributorAgreements() {
-    return useContributorAgreements;
-  }
-
-  public InheritableBoolean getUseSignedOffBy() {
-    return useSignedOffBy;
-  }
-
-  public InheritableBoolean getUseContentMerge() {
-    return useContentMerge;
-  }
-
-  public InheritableBoolean getRequireChangeID() {
-    return requireChangeID;
-  }
-
-  public String getMaxObjectSizeLimit() {
-    return maxObjectSizeLimit;
-  }
-
-  public InheritableBoolean getRejectImplicitMerges() {
-    return rejectImplicitMerges;
-  }
-
-  public InheritableBoolean getPrivateByDefault() {
-    return privateByDefault;
-  }
-
-  public void setPrivateByDefault(InheritableBoolean privateByDefault) {
-    this.privateByDefault = privateByDefault;
-  }
-
-  public InheritableBoolean getWorkInProgressByDefault() {
-    return workInProgressByDefault;
-  }
-
-  public void setWorkInProgressByDefault(InheritableBoolean workInProgressByDefault) {
-    this.workInProgressByDefault = workInProgressByDefault;
-  }
-
-  public InheritableBoolean getEnableReviewerByEmail() {
-    return enableReviewerByEmail;
-  }
-
-  public void setEnableReviewerByEmail(InheritableBoolean enable) {
-    enableReviewerByEmail = enable;
-  }
-
-  public InheritableBoolean getMatchAuthorToCommitterDate() {
-    return matchAuthorToCommitterDate;
-  }
-
-  public void setMatchAuthorToCommitterDate(InheritableBoolean match) {
-    matchAuthorToCommitterDate = match;
-  }
-
-  public void setUseContributorAgreements(InheritableBoolean u) {
-    useContributorAgreements = u;
-  }
-
-  public void setUseSignedOffBy(InheritableBoolean sbo) {
-    useSignedOffBy = sbo;
-  }
-
-  public void setUseContentMerge(InheritableBoolean cm) {
-    useContentMerge = cm;
-  }
-
-  public void setRequireChangeID(InheritableBoolean cid) {
-    requireChangeID = cid;
-  }
-
-  public InheritableBoolean getCreateNewChangeForAllNotInTarget() {
-    return createNewChangeForAllNotInTarget;
-  }
-
-  public void setCreateNewChangeForAllNotInTarget(InheritableBoolean useAllNotInTarget) {
-    this.createNewChangeForAllNotInTarget = useAllNotInTarget;
-  }
-
-  public InheritableBoolean getEnableSignedPush() {
-    return enableSignedPush;
-  }
-
-  public void setEnableSignedPush(InheritableBoolean enable) {
-    enableSignedPush = enable;
-  }
-
-  public InheritableBoolean getRequireSignedPush() {
-    return requireSignedPush;
-  }
-
-  public void setRequireSignedPush(InheritableBoolean require) {
-    requireSignedPush = require;
-  }
-
-  public void setMaxObjectSizeLimit(String limit) {
-    maxObjectSizeLimit = limit;
-  }
-
-  public void setRejectImplicitMerges(InheritableBoolean check) {
-    rejectImplicitMerges = check;
-  }
-
-  public SubmitType getSubmitType() {
-    return submitType;
-  }
-
-  public void setSubmitType(SubmitType type) {
-    submitType = type;
-  }
-
-  public ProjectState getState() {
-    return state;
-  }
-
-  public void setState(ProjectState newState) {
-    state = newState;
-  }
-
-  public String getDefaultDashboard() {
-    return defaultDashboardId;
-  }
-
-  public void setDefaultDashboard(String defaultDashboardId) {
-    this.defaultDashboardId = defaultDashboardId;
-  }
-
-  public String getLocalDefaultDashboard() {
-    return localDefaultDashboardId;
-  }
-
-  public void setLocalDefaultDashboard(String localDefaultDashboardId) {
-    this.localDefaultDashboardId = localDefaultDashboardId;
-  }
-
-  public String getThemeName() {
-    return themeName;
-  }
-
-  public void setThemeName(String themeName) {
-    this.themeName = themeName;
-  }
-
-  public void copySettingsFrom(Project update) {
-    description = update.description;
-    useContributorAgreements = update.useContributorAgreements;
-    useSignedOffBy = update.useSignedOffBy;
-    useContentMerge = update.useContentMerge;
-    requireChangeID = update.requireChangeID;
-    submitType = update.submitType;
-    state = update.state;
-    maxObjectSizeLimit = update.maxObjectSizeLimit;
-    createNewChangeForAllNotInTarget = update.createNewChangeForAllNotInTarget;
-  }
-
-  /**
-   * Returns the name key of the parent project.
-   *
-   * @return name key of the parent project, {@code null} if this project is the wild project,
-   *     {@code null} or the name key of the wild project if this project is a direct child of the
-   *     wild project
-   */
-  public Project.NameKey getParent() {
-    return parent;
-  }
-
-  /**
-   * Returns the name key of the parent project.
-   *
-   * @param allProjectsName name key of the wild project
-   * @return name key of the parent project, {@code null} if this project is the wild project
-   */
-  public Project.NameKey getParent(Project.NameKey allProjectsName) {
-    if (parent != null) {
-      return parent;
-    }
-
-    if (name.equals(allProjectsName)) {
-      return null;
-    }
-
-    return allProjectsName;
-  }
-
-  public String getParentName() {
-    return parent != null ? parent.get() : null;
-  }
-
-  public void setParentName(String n) {
-    parent = n != null ? new NameKey(n) : null;
-  }
-
-  public void setParentName(NameKey n) {
-    parent = n;
-  }
-}
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/RefNames.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/RefNames.java
deleted file mode 100644
index 89de9dc..0000000
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/RefNames.java
+++ /dev/null
@@ -1,362 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.reviewdb.client;
-
-/** Constants and utilities for Gerrit-specific ref names. */
-public class RefNames {
-  public static final String HEAD = "HEAD";
-
-  public static final String REFS = "refs/";
-
-  public static final String REFS_HEADS = "refs/heads/";
-
-  public static final String REFS_TAGS = "refs/tags/";
-
-  public static final String REFS_CHANGES = "refs/changes/";
-
-  public static final String REFS_META = "refs/meta/";
-
-  /** Note tree listing commits we refuse {@code refs/meta/reject-commits} */
-  public static final String REFS_REJECT_COMMITS = "refs/meta/reject-commits";
-
-  /** Configuration settings for a project {@code refs/meta/config} */
-  public static final String REFS_CONFIG = "refs/meta/config";
-
-  /** Note tree listing external IDs */
-  public static final String REFS_EXTERNAL_IDS = "refs/meta/external-ids";
-
-  /** Magic user branch in All-Users {@code refs/users/self} */
-  public static final String REFS_USERS_SELF = "refs/users/self";
-
-  /** Default user preference settings */
-  public static final String REFS_USERS_DEFAULT = RefNames.REFS_USERS + "default";
-
-  /** Configurations of project-specific dashboards (canned search queries). */
-  public static final String REFS_DASHBOARDS = "refs/meta/dashboards/";
-
-  /** Sequence counters in NoteDb. */
-  public static final String REFS_SEQUENCES = "refs/sequences/";
-
-  /**
-   * Prefix applied to merge commit base nodes.
-   *
-   * <p>References in this directory should take the form {@code refs/cache-automerge/xx/yyyy...}
-   * where xx is the first two digits of the merge commit's object name, and yyyyy... is the
-   * remaining 38. The reference should point to a treeish that is the automatic merge result of the
-   * merge commit's parents.
-   */
-  public static final String REFS_CACHE_AUTOMERGE = "refs/cache-automerge/";
-
-  /** Suffix of a meta ref in the NoteDb. */
-  public static final String META_SUFFIX = "/meta";
-
-  /** Suffix of a ref that stores robot comments in the NoteDb. */
-  public static final String ROBOT_COMMENTS_SUFFIX = "/robot-comments";
-
-  public static final String EDIT_PREFIX = "edit-";
-
-  /*
-   * The following refs contain an account ID and should be visible only to that account.
-   *
-   * Parsing the account ID from the ref is implemented in Account.Id#fromRef(String). This ensures
-   * that VisibleRefFilter hides those refs from other users.
-   *
-   * This applies to:
-   * - User branches (e.g. 'refs/users/23/1011123')
-   * - Draft comment refs (e.g. 'refs/draft-comments/73/67473/1011123')
-   * - Starred changes refs (e.g. 'refs/starred-changes/73/67473/1011123')
-   */
-
-  /** Preference settings for a user {@code refs/users} */
-  public static final String REFS_USERS = "refs/users/";
-
-  /** Draft inline comments of a user on a change */
-  public static final String REFS_DRAFT_COMMENTS = "refs/draft-comments/";
-
-  /** A change starred by a user */
-  public static final String REFS_STARRED_CHANGES = "refs/starred-changes/";
-
-  public static String fullName(String ref) {
-    return (ref.startsWith(REFS) || ref.equals(HEAD)) ? ref : REFS_HEADS + ref;
-  }
-
-  public static final String shortName(String ref) {
-    if (ref.startsWith(REFS_HEADS)) {
-      return ref.substring(REFS_HEADS.length());
-    } else if (ref.startsWith(REFS_TAGS)) {
-      return ref.substring(REFS_TAGS.length());
-    }
-    return ref;
-  }
-
-  public static String changeMetaRef(Change.Id id) {
-    StringBuilder r = newStringBuilder().append(REFS_CHANGES);
-    return shard(id.get(), r).append(META_SUFFIX).toString();
-  }
-
-  public static String robotCommentsRef(Change.Id id) {
-    StringBuilder r = newStringBuilder().append(REFS_CHANGES);
-    return shard(id.get(), r).append(ROBOT_COMMENTS_SUFFIX).toString();
-  }
-
-  public static boolean isNoteDbMetaRef(String ref) {
-    if (ref.startsWith(REFS_CHANGES)
-        && (ref.endsWith(META_SUFFIX) || ref.endsWith(ROBOT_COMMENTS_SUFFIX))) {
-      return true;
-    }
-    if (ref.startsWith(REFS_DRAFT_COMMENTS) || ref.startsWith(REFS_STARRED_CHANGES)) {
-      return true;
-    }
-    return false;
-  }
-
-  public static String refsUsers(Account.Id accountId) {
-    StringBuilder r = newStringBuilder().append(REFS_USERS);
-    return shard(accountId.get(), r).toString();
-  }
-
-  public static String refsDraftComments(Change.Id changeId, Account.Id accountId) {
-    return buildRefsPrefix(REFS_DRAFT_COMMENTS, changeId.get()).append(accountId.get()).toString();
-  }
-
-  public static String refsDraftCommentsPrefix(Change.Id changeId) {
-    return buildRefsPrefix(REFS_DRAFT_COMMENTS, changeId.get()).toString();
-  }
-
-  public static String refsStarredChanges(Change.Id changeId, Account.Id accountId) {
-    return buildRefsPrefix(REFS_STARRED_CHANGES, changeId.get()).append(accountId.get()).toString();
-  }
-
-  public static String refsStarredChangesPrefix(Change.Id changeId) {
-    return buildRefsPrefix(REFS_STARRED_CHANGES, changeId.get()).toString();
-  }
-
-  private static StringBuilder buildRefsPrefix(String prefix, int id) {
-    StringBuilder r = newStringBuilder().append(prefix);
-    return shard(id, r).append('/');
-  }
-
-  public static String refsCacheAutomerge(String hash) {
-    return REFS_CACHE_AUTOMERGE + hash.substring(0, 2) + '/' + hash.substring(2);
-  }
-
-  public static String shard(int id) {
-    if (id < 0) {
-      return null;
-    }
-    return shard(id, newStringBuilder()).toString();
-  }
-
-  private static StringBuilder shard(int id, StringBuilder sb) {
-    int n = id % 100;
-    if (n < 10) {
-      sb.append('0');
-    }
-    sb.append(n);
-    sb.append('/');
-    sb.append(id);
-    return sb;
-  }
-
-  /**
-   * Returns reference for this change edit with sharded user and change number:
-   * refs/users/UU/UUUU/edit-CCCC/P.
-   *
-   * @param accountId account id
-   * @param changeId change number
-   * @param psId patch set number
-   * @return reference for this change edit
-   */
-  public static String refsEdit(Account.Id accountId, Change.Id changeId, PatchSet.Id psId) {
-    return refsEditPrefix(accountId, changeId) + psId.get();
-  }
-
-  /**
-   * Returns reference prefix for this change edit with sharded user and change number:
-   * refs/users/UU/UUUU/edit-CCCC/.
-   *
-   * @param accountId account id
-   * @param changeId change number
-   * @return reference prefix for this change edit
-   */
-  public static String refsEditPrefix(Account.Id accountId, Change.Id changeId) {
-    return refsEditPrefix(accountId) + changeId.get() + '/';
-  }
-
-  public static String refsEditPrefix(Account.Id accountId) {
-    return refsUsers(accountId) + '/' + EDIT_PREFIX;
-  }
-
-  public static boolean isRefsEdit(String ref) {
-    return ref != null && ref.startsWith(REFS_USERS) && ref.contains(EDIT_PREFIX);
-  }
-
-  public static boolean isRefsUsers(String ref) {
-    return ref.startsWith(REFS_USERS);
-  }
-
-  static Integer parseShardedRefPart(String name) {
-    if (name == null) {
-      return null;
-    }
-
-    String[] parts = name.split("/");
-    int n = parts.length;
-    if (n < 2) {
-      return null;
-    }
-
-    // Last 2 digits.
-    int le;
-    for (le = 0; le < parts[0].length(); le++) {
-      if (!Character.isDigit(parts[0].charAt(le))) {
-        return null;
-      }
-    }
-    if (le != 2) {
-      return null;
-    }
-
-    // Full ID.
-    int ie;
-    for (ie = 0; ie < parts[1].length(); ie++) {
-      if (!Character.isDigit(parts[1].charAt(ie))) {
-        if (ie == 0) {
-          return null;
-        }
-        break;
-      }
-    }
-
-    int shard = Integer.parseInt(parts[0]);
-    int id = Integer.parseInt(parts[1].substring(0, ie));
-
-    if (id % 100 != shard) {
-      return null;
-    }
-    return id;
-  }
-
-  /**
-   * Skips a sharded ref part at the beginning of the name.
-   *
-   * <p>E.g.: "01/1" -> "", "01/1/" -> "/", "01/1/2" -> "/2", "01/1-edit" -> "-edit"
-   *
-   * @param name ref part name
-   * @return the rest of the name, {@code null} if the ref name part doesn't start with a valid
-   *     sharded ID
-   */
-  static String skipShardedRefPart(String name) {
-    if (name == null) {
-      return null;
-    }
-
-    String[] parts = name.split("/");
-    int n = parts.length;
-    if (n < 2) {
-      return null;
-    }
-
-    // Last 2 digits.
-    int le;
-    for (le = 0; le < parts[0].length(); le++) {
-      if (!Character.isDigit(parts[0].charAt(le))) {
-        return null;
-      }
-    }
-    if (le != 2) {
-      return null;
-    }
-
-    // Full ID.
-    int ie;
-    for (ie = 0; ie < parts[1].length(); ie++) {
-      if (!Character.isDigit(parts[1].charAt(ie))) {
-        if (ie == 0) {
-          return null;
-        }
-        break;
-      }
-    }
-
-    int shard = Integer.parseInt(parts[0]);
-    int id = Integer.parseInt(parts[1].substring(0, ie));
-
-    if (id % 100 != shard) {
-      return null;
-    }
-
-    return name.substring(2 + 1 + ie); // 2 for the length of the shard, 1 for the '/'
-  }
-
-  /**
-   * Parses an ID that follows a sharded ref part at the beginning of the name.
-   *
-   * <p>E.g.: "01/1/2" -> 2, "01/1/2/4" -> 2, ""01/1/2-edit" -> 2
-   *
-   * @param name ref part name
-   * @return ID that follows the sharded ref part at the beginning of the name, {@code null} if the
-   *     ref name part doesn't start with a valid sharded ID or if no valid ID follows the sharded
-   *     ref part
-   */
-  static Integer parseAfterShardedRefPart(String name) {
-    String rest = skipShardedRefPart(name);
-    if (rest == null || !rest.startsWith("/")) {
-      return null;
-    }
-
-    rest = rest.substring(1);
-
-    int ie;
-    for (ie = 0; ie < rest.length(); ie++) {
-      if (!Character.isDigit(rest.charAt(ie))) {
-        break;
-      }
-    }
-    if (ie == 0) {
-      return null;
-    }
-    return Integer.parseInt(rest.substring(0, ie));
-  }
-
-  static Integer parseRefSuffix(String name) {
-    if (name == null) {
-      return null;
-    }
-    int i = name.length();
-    while (i > 0) {
-      char c = name.charAt(i - 1);
-      if (c == '/') {
-        break;
-      } else if (!Character.isDigit(c)) {
-        return null;
-      }
-      i--;
-    }
-    if (i == 0) {
-      return null;
-    }
-    return Integer.valueOf(name.substring(i, name.length()));
-  }
-
-  private static StringBuilder newStringBuilder() {
-    // Many refname types in this file are always are longer than the default of 16 chars, so
-    // presize StringBuilders larger by default. This hurts readability less than accurate
-    // calculations would, at a negligible cost to memory overhead.
-    return new StringBuilder(64);
-  }
-
-  private RefNames() {}
-}
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/SystemConfig.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/SystemConfig.java
deleted file mode 100644
index cd42dd1..0000000
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/SystemConfig.java
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.reviewdb.client;
-
-import com.google.gwtorm.client.Column;
-import com.google.gwtorm.client.StringKey;
-
-/** Global configuration needed to serve web requests. */
-public final class SystemConfig {
-  public static final class Key extends StringKey<com.google.gwtorm.client.Key<?>> {
-    private static final long serialVersionUID = 1L;
-
-    private static final String VALUE = "X";
-
-    @Column(id = 1, length = 1)
-    protected String one = VALUE;
-
-    public Key() {}
-
-    @Override
-    public String get() {
-      return VALUE;
-    }
-
-    @Override
-    protected void set(String newValue) {
-      assert get().equals(newValue);
-    }
-  }
-
-  /** Construct a new, unconfigured instance. */
-  public static SystemConfig create() {
-    final SystemConfig r = new SystemConfig();
-    r.singleton = new SystemConfig.Key();
-    return r;
-  }
-
-  @Column(id = 1)
-  protected Key singleton;
-
-  /** Local filesystem location of header/footer/CSS configuration files */
-  @Column(id = 3, notNull = false, length = Integer.MAX_VALUE)
-  public transient String sitePath;
-
-  // DO NOT LOOK BELOW THIS LINE. These fields have all been deleted,
-  // but survive to support schema upgrade code.
-
-  /** DEPRECATED DO NOT USE */
-  @Column(id = 2, length = 36, notNull = false)
-  public transient String registerEmailPrivateKey;
-  /** DEPRECATED DO NOT USE */
-  @Column(id = 4, notNull = false)
-  public AccountGroup.Id adminGroupId;
-  /** DEPRECATED DO NOT USE */
-  @Column(id = 10, notNull = false)
-  public AccountGroup.UUID adminGroupUUID;
-  /** DEPRECATED DO NOT USE */
-  @Column(id = 5, notNull = false)
-  public AccountGroup.Id anonymousGroupId;
-  /** DEPRECATED DO NOT USE */
-  @Column(id = 6, notNull = false)
-  public AccountGroup.Id registeredGroupId;
-  /** DEPRECATED DO NOT USE */
-  @Column(id = 7, notNull = false)
-  public Project.NameKey wildProjectName;
-  /** DEPRECATED DO NOT USE */
-  @Column(id = 9, notNull = false)
-  public AccountGroup.Id ownerGroupId;
-  /** DEPRECATED DO NOT USE */
-  @Column(id = 8, notNull = false)
-  public AccountGroup.Id batchUsersGroupId;
-  /** DEPRECATED DO NOT USE */
-  @Column(id = 11, notNull = false)
-  public AccountGroup.UUID batchUsersGroupUUID;
-
-  protected SystemConfig() {}
-}
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/DisallowReadFromChangesReviewDbWrapper.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/DisallowReadFromChangesReviewDbWrapper.java
deleted file mode 100644
index d4c6354..0000000
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/DisallowReadFromChangesReviewDbWrapper.java
+++ /dev/null
@@ -1,285 +0,0 @@
-// 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.
-
-package com.google.gerrit.reviewdb.server;
-
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.PatchLineComment;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.ResultSet;
-
-public class DisallowReadFromChangesReviewDbWrapper extends ReviewDbWrapper {
-  private static final String MSG = "This table has been migrated to NoteDb";
-
-  private final Changes changes;
-  private final PatchSetApprovals patchSetApprovals;
-  private final ChangeMessages changeMessages;
-  private final PatchSets patchSets;
-  private final PatchLineComments patchComments;
-
-  public DisallowReadFromChangesReviewDbWrapper(ReviewDb db) {
-    super(db);
-    changes = new Changes(delegate.changes());
-    patchSetApprovals = new PatchSetApprovals(delegate.patchSetApprovals());
-    changeMessages = new ChangeMessages(delegate.changeMessages());
-    patchSets = new PatchSets(delegate.patchSets());
-    patchComments = new PatchLineComments(delegate.patchComments());
-  }
-
-  public ReviewDb unsafeGetDelegate() {
-    return delegate;
-  }
-
-  @Override
-  public ChangeAccess changes() {
-    return changes;
-  }
-
-  @Override
-  public PatchSetApprovalAccess patchSetApprovals() {
-    return patchSetApprovals;
-  }
-
-  @Override
-  public ChangeMessageAccess changeMessages() {
-    return changeMessages;
-  }
-
-  @Override
-  public PatchSetAccess patchSets() {
-    return patchSets;
-  }
-
-  @Override
-  public PatchLineCommentAccess patchComments() {
-    return patchComments;
-  }
-
-  private static class Changes extends ChangeAccessWrapper {
-
-    protected Changes(ChangeAccess delegate) {
-      super(delegate);
-    }
-
-    @Override
-    public ResultSet<Change> iterateAllEntities() {
-      throw new UnsupportedOperationException(MSG);
-    }
-
-    @SuppressWarnings("deprecation")
-    @Override
-    public com.google.common.util.concurrent.CheckedFuture<Change, OrmException> getAsync(
-        Change.Id key) {
-      throw new UnsupportedOperationException(MSG);
-    }
-
-    @Override
-    public ResultSet<Change> get(Iterable<Change.Id> keys) {
-      throw new UnsupportedOperationException(MSG);
-    }
-
-    @Override
-    public Change get(Change.Id id) throws OrmException {
-      throw new UnsupportedOperationException(MSG);
-    }
-
-    @Override
-    public ResultSet<Change> all() throws OrmException {
-      throw new UnsupportedOperationException(MSG);
-    }
-  }
-
-  private static class PatchSetApprovals extends PatchSetApprovalAccessWrapper {
-    PatchSetApprovals(PatchSetApprovalAccess delegate) {
-      super(delegate);
-    }
-
-    @Override
-    public ResultSet<PatchSetApproval> iterateAllEntities() {
-      throw new UnsupportedOperationException(MSG);
-    }
-
-    @SuppressWarnings("deprecation")
-    @Override
-    public com.google.common.util.concurrent.CheckedFuture<PatchSetApproval, OrmException> getAsync(
-        PatchSetApproval.Key key) {
-      throw new UnsupportedOperationException(MSG);
-    }
-
-    @Override
-    public ResultSet<PatchSetApproval> get(Iterable<PatchSetApproval.Key> keys) {
-      throw new UnsupportedOperationException(MSG);
-    }
-
-    @Override
-    public PatchSetApproval get(PatchSetApproval.Key key) {
-      throw new UnsupportedOperationException(MSG);
-    }
-
-    @Override
-    public ResultSet<PatchSetApproval> byChange(Change.Id id) {
-      throw new UnsupportedOperationException(MSG);
-    }
-
-    @Override
-    public ResultSet<PatchSetApproval> byPatchSet(PatchSet.Id id) {
-      throw new UnsupportedOperationException(MSG);
-    }
-  }
-
-  private static class ChangeMessages extends ChangeMessageAccessWrapper {
-    ChangeMessages(ChangeMessageAccess delegate) {
-      super(delegate);
-    }
-
-    @Override
-    public ResultSet<ChangeMessage> iterateAllEntities() {
-      throw new UnsupportedOperationException(MSG);
-    }
-
-    @SuppressWarnings("deprecation")
-    @Override
-    public com.google.common.util.concurrent.CheckedFuture<ChangeMessage, OrmException> getAsync(
-        ChangeMessage.Key key) {
-      throw new UnsupportedOperationException(MSG);
-    }
-
-    @Override
-    public ResultSet<ChangeMessage> get(Iterable<ChangeMessage.Key> keys) {
-      throw new UnsupportedOperationException(MSG);
-    }
-
-    @Override
-    public ChangeMessage get(ChangeMessage.Key id) {
-      throw new UnsupportedOperationException(MSG);
-    }
-
-    @Override
-    public ResultSet<ChangeMessage> byChange(Change.Id id) {
-      throw new UnsupportedOperationException(MSG);
-    }
-
-    @Override
-    public ResultSet<ChangeMessage> byPatchSet(PatchSet.Id id) {
-      throw new UnsupportedOperationException(MSG);
-    }
-
-    @Override
-    public ResultSet<ChangeMessage> all() {
-      throw new UnsupportedOperationException(MSG);
-    }
-  }
-
-  private static class PatchSets extends PatchSetAccessWrapper {
-    PatchSets(PatchSetAccess delegate) {
-      super(delegate);
-    }
-
-    @Override
-    public ResultSet<PatchSet> iterateAllEntities() {
-      throw new UnsupportedOperationException(MSG);
-    }
-
-    @SuppressWarnings("deprecation")
-    @Override
-    public com.google.common.util.concurrent.CheckedFuture<PatchSet, OrmException> getAsync(
-        PatchSet.Id key) {
-      throw new UnsupportedOperationException(MSG);
-    }
-
-    @Override
-    public ResultSet<PatchSet> get(Iterable<PatchSet.Id> keys) {
-      throw new UnsupportedOperationException(MSG);
-    }
-
-    @Override
-    public PatchSet get(PatchSet.Id id) {
-      throw new UnsupportedOperationException(MSG);
-    }
-
-    @Override
-    public ResultSet<PatchSet> byChange(Change.Id id) {
-      throw new UnsupportedOperationException(MSG);
-    }
-  }
-
-  private static class PatchLineComments extends PatchLineCommentAccessWrapper {
-    PatchLineComments(PatchLineCommentAccess delegate) {
-      super(delegate);
-    }
-
-    @Override
-    public ResultSet<PatchLineComment> iterateAllEntities() {
-      throw new UnsupportedOperationException(MSG);
-    }
-
-    @SuppressWarnings("deprecation")
-    @Override
-    public com.google.common.util.concurrent.CheckedFuture<PatchLineComment, OrmException> getAsync(
-        PatchLineComment.Key key) {
-      throw new UnsupportedOperationException(MSG);
-    }
-
-    @Override
-    public ResultSet<PatchLineComment> get(Iterable<PatchLineComment.Key> keys) {
-      throw new UnsupportedOperationException(MSG);
-    }
-
-    @Override
-    public PatchLineComment get(PatchLineComment.Key id) {
-      throw new UnsupportedOperationException(MSG);
-    }
-
-    @Override
-    public ResultSet<PatchLineComment> byChange(Change.Id id) {
-      throw new UnsupportedOperationException(MSG);
-    }
-
-    @Override
-    public ResultSet<PatchLineComment> byPatchSet(PatchSet.Id id) {
-      throw new UnsupportedOperationException(MSG);
-    }
-
-    @Override
-    public ResultSet<PatchLineComment> publishedByChangeFile(Change.Id id, String file) {
-      throw new UnsupportedOperationException(MSG);
-    }
-
-    @Override
-    public ResultSet<PatchLineComment> publishedByPatchSet(PatchSet.Id patchset) {
-      throw new UnsupportedOperationException(MSG);
-    }
-
-    @Override
-    public ResultSet<PatchLineComment> draftByPatchSetAuthor(
-        PatchSet.Id patchset, Account.Id author) {
-      throw new UnsupportedOperationException(MSG);
-    }
-
-    @Override
-    public ResultSet<PatchLineComment> draftByChangeFileAuthor(
-        Change.Id id, String file, Account.Id author) {
-      throw new UnsupportedOperationException(MSG);
-    }
-
-    @Override
-    public ResultSet<PatchLineComment> draftByAuthor(Account.Id author) {
-      throw new UnsupportedOperationException(MSG);
-    }
-  }
-}
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ReviewDb.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ReviewDb.java
deleted file mode 100644
index 04567bc..0000000
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ReviewDb.java
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.reviewdb.server;
-
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.SystemConfig;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.Relation;
-import com.google.gwtorm.server.Schema;
-import com.google.gwtorm.server.Sequence;
-
-/**
- * The review service database schema.
- *
- * <p>Root entities that are at the top level of some important data graph:
- *
- * <ul>
- *   <li>{@link Account}: Per-user account registration, preferences, identity.
- *   <li>{@link Change}: All review information about a single proposed change.
- *   <li>{@link SystemConfig}: Server-wide settings, managed by administrator.
- * </ul>
- */
-public interface ReviewDb extends Schema {
-  /* If you change anything, update SchemaVersion.C to use a new version. */
-
-  @Relation(id = 1)
-  SchemaVersionAccess schemaVersion();
-
-  @Relation(id = 2)
-  SystemConfigAccess systemConfig();
-
-  // Deleted @Relation(id = 3)
-
-  // Deleted @Relation(id = 4)
-
-  // Deleted @Relation(id = 6)
-
-  // Deleted @Relation(id = 7)
-
-  // Deleted @Relation(id = 8)
-
-  @Relation(id = 10)
-  AccountGroupAccess accountGroups();
-
-  @Relation(id = 11)
-  AccountGroupNameAccess accountGroupNames();
-
-  @Relation(id = 12)
-  AccountGroupMemberAccess accountGroupMembers();
-
-  @Relation(id = 13)
-  AccountGroupMemberAuditAccess accountGroupMembersAudit();
-
-  // Deleted @Relation(id = 17)
-
-  // Deleted @Relation(id = 18)
-
-  // Deleted @Relation(id = 19)
-
-  // Deleted @Relation(id = 20)
-
-  @Relation(id = 21)
-  ChangeAccess changes();
-
-  @Relation(id = 22)
-  PatchSetApprovalAccess patchSetApprovals();
-
-  @Relation(id = 23)
-  ChangeMessageAccess changeMessages();
-
-  @Relation(id = 24)
-  PatchSetAccess patchSets();
-
-  // Deleted @Relation(id = 25)
-
-  @Relation(id = 26)
-  PatchLineCommentAccess patchComments();
-
-  // Deleted @Relation(id = 28)
-
-  @Relation(id = 29)
-  AccountGroupByIdAccess accountGroupById();
-
-  @Relation(id = 30)
-  AccountGroupByIdAudAccess accountGroupByIdAud();
-
-  int FIRST_ACCOUNT_ID = 1000000;
-
-  /**
-   * Next unique id for a {@link Account}.
-   *
-   * @deprecated use {@link com.google.gerrit.server.Sequences#nextAccountId()}.
-   */
-  @Sequence(startWith = FIRST_ACCOUNT_ID)
-  @Deprecated
-  int nextAccountId() throws OrmException;
-
-  /** Next unique id for a {@link AccountGroup}. */
-  @Sequence
-  int nextAccountGroupId() throws OrmException;
-
-  int FIRST_CHANGE_ID = 1;
-
-  /**
-   * Next unique id for a {@link Change}.
-   *
-   * @deprecated use {@link com.google.gerrit.server.Sequences#nextChangeId()}.
-   */
-  @Sequence(startWith = FIRST_CHANGE_ID)
-  @Deprecated
-  int nextChangeId() throws OrmException;
-
-  default boolean changesTablesEnabled() {
-    return true;
-  }
-}
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ReviewDbUtil.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ReviewDbUtil.java
deleted file mode 100644
index bb31b1c..0000000
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ReviewDbUtil.java
+++ /dev/null
@@ -1,52 +0,0 @@
-// 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.
-
-package com.google.gerrit.reviewdb.server;
-
-import com.google.common.collect.Ordering;
-import com.google.gwtorm.client.IntKey;
-
-/** Static utilities for ReviewDb types. */
-public class ReviewDbUtil {
-  private static final Ordering<? extends IntKey<?>> INT_KEY_ORDERING =
-      Ordering.natural().nullsFirst().<IntKey<?>>onResultOf(IntKey::get).nullsFirst();
-
-  /**
-   * Null-safe ordering over arbitrary subclass of {@code IntKey}.
-   *
-   * <p>In some cases, {@code Comparator.comparing(Change.Id::get)} may be shorter and cleaner.
-   * However, this method may be preferable in some cases:
-   *
-   * <ul>
-   *   <li>This ordering is null-safe over both input and the result of {@link IntKey#get()}; {@code
-   *       comparing} is only a good idea if all inputs are obviously non-null.
-   *   <li>{@code intKeyOrdering().sortedCopy(iterable)} is shorter than the stream equivalent.
-   *   <li>Creating derived comparators may be more readable with {@link Ordering} method chaining
-   *       rather than static {@code Comparator} methods.
-   * </ul>
-   */
-  @SuppressWarnings("unchecked")
-  public static <K extends IntKey<?>> Ordering<K> intKeyOrdering() {
-    return (Ordering<K>) INT_KEY_ORDERING;
-  }
-
-  public static ReviewDb unwrapDb(ReviewDb db) {
-    if (db instanceof DisallowReadFromChangesReviewDbWrapper) {
-      return ((DisallowReadFromChangesReviewDbWrapper) db).unsafeGetDelegate();
-    }
-    return db;
-  }
-
-  private ReviewDbUtil() {}
-}
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ReviewDbWrapper.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ReviewDbWrapper.java
deleted file mode 100644
index 29b4be3..0000000
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ReviewDbWrapper.java
+++ /dev/null
@@ -1,681 +0,0 @@
-// 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.
-
-package com.google.gerrit.reviewdb.server;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.PatchLineComment;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gwtorm.server.Access;
-import com.google.gwtorm.server.AtomicUpdate;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.ResultSet;
-import com.google.gwtorm.server.StatementExecutor;
-import java.util.Map;
-
-public class ReviewDbWrapper implements ReviewDb {
-  protected final ReviewDb delegate;
-
-  protected ReviewDbWrapper(ReviewDb delegate) {
-    this.delegate = checkNotNull(delegate);
-  }
-
-  @Override
-  public void commit() throws OrmException {
-    delegate.commit();
-  }
-
-  @Override
-  public void rollback() throws OrmException {
-    delegate.rollback();
-  }
-
-  @Override
-  public void updateSchema(StatementExecutor e) throws OrmException {
-    delegate.updateSchema(e);
-  }
-
-  @Override
-  public void pruneSchema(StatementExecutor e) throws OrmException {
-    delegate.pruneSchema(e);
-  }
-
-  @Override
-  public Access<?, ?>[] allRelations() {
-    return delegate.allRelations();
-  }
-
-  @Override
-  public void close() {
-    delegate.close();
-  }
-
-  @Override
-  public SchemaVersionAccess schemaVersion() {
-    return delegate.schemaVersion();
-  }
-
-  @Override
-  public SystemConfigAccess systemConfig() {
-    return delegate.systemConfig();
-  }
-
-  @Override
-  public AccountGroupAccess accountGroups() {
-    return delegate.accountGroups();
-  }
-
-  @Override
-  public AccountGroupNameAccess accountGroupNames() {
-    return delegate.accountGroupNames();
-  }
-
-  @Override
-  public AccountGroupMemberAccess accountGroupMembers() {
-    return delegate.accountGroupMembers();
-  }
-
-  @Override
-  public AccountGroupMemberAuditAccess accountGroupMembersAudit() {
-    return delegate.accountGroupMembersAudit();
-  }
-
-  @Override
-  public ChangeAccess changes() {
-    return delegate.changes();
-  }
-
-  @Override
-  public PatchSetApprovalAccess patchSetApprovals() {
-    return delegate.patchSetApprovals();
-  }
-
-  @Override
-  public ChangeMessageAccess changeMessages() {
-    return delegate.changeMessages();
-  }
-
-  @Override
-  public PatchSetAccess patchSets() {
-    return delegate.patchSets();
-  }
-
-  @Override
-  public PatchLineCommentAccess patchComments() {
-    return delegate.patchComments();
-  }
-
-  @Override
-  public AccountGroupByIdAccess accountGroupById() {
-    return delegate.accountGroupById();
-  }
-
-  @Override
-  public AccountGroupByIdAudAccess accountGroupByIdAud() {
-    return delegate.accountGroupByIdAud();
-  }
-
-  @Override
-  @SuppressWarnings("deprecation")
-  public int nextAccountId() throws OrmException {
-    return delegate.nextAccountId();
-  }
-
-  @Override
-  public int nextAccountGroupId() throws OrmException {
-    return delegate.nextAccountGroupId();
-  }
-
-  @Override
-  @SuppressWarnings("deprecation")
-  public int nextChangeId() throws OrmException {
-    return delegate.nextChangeId();
-  }
-
-  @Override
-  public boolean changesTablesEnabled() {
-    return delegate.changesTablesEnabled();
-  }
-
-  public static class ChangeAccessWrapper implements ChangeAccess {
-    protected final ChangeAccess delegate;
-
-    protected ChangeAccessWrapper(ChangeAccess delegate) {
-      this.delegate = checkNotNull(delegate);
-    }
-
-    @Override
-    public String getRelationName() {
-      return delegate.getRelationName();
-    }
-
-    @Override
-    public int getRelationID() {
-      return delegate.getRelationID();
-    }
-
-    @Override
-    public ResultSet<Change> iterateAllEntities() throws OrmException {
-      return delegate.iterateAllEntities();
-    }
-
-    @Override
-    public Change.Id primaryKey(Change entity) {
-      return delegate.primaryKey(entity);
-    }
-
-    @Override
-    public Map<Change.Id, Change> toMap(Iterable<Change> c) {
-      return delegate.toMap(c);
-    }
-
-    @SuppressWarnings("deprecation")
-    @Override
-    public com.google.common.util.concurrent.CheckedFuture<Change, OrmException> getAsync(
-        Change.Id key) {
-      return delegate.getAsync(key);
-    }
-
-    @Override
-    public ResultSet<Change> get(Iterable<Change.Id> keys) throws OrmException {
-      return delegate.get(keys);
-    }
-
-    @Override
-    public void insert(Iterable<Change> instances) throws OrmException {
-      delegate.insert(instances);
-    }
-
-    @Override
-    public void update(Iterable<Change> instances) throws OrmException {
-      delegate.update(instances);
-    }
-
-    @Override
-    public void upsert(Iterable<Change> instances) throws OrmException {
-      delegate.upsert(instances);
-    }
-
-    @Override
-    public void deleteKeys(Iterable<Change.Id> keys) throws OrmException {
-      delegate.deleteKeys(keys);
-    }
-
-    @Override
-    public void delete(Iterable<Change> instances) throws OrmException {
-      delegate.delete(instances);
-    }
-
-    @Override
-    public void beginTransaction(Change.Id key) throws OrmException {
-      delegate.beginTransaction(key);
-    }
-
-    @Override
-    public Change atomicUpdate(Change.Id key, AtomicUpdate<Change> update) throws OrmException {
-      return delegate.atomicUpdate(key, update);
-    }
-
-    @Override
-    public Change get(Change.Id id) throws OrmException {
-      return delegate.get(id);
-    }
-
-    @Override
-    public ResultSet<Change> all() throws OrmException {
-      return delegate.all();
-    }
-  }
-
-  public static class PatchSetApprovalAccessWrapper implements PatchSetApprovalAccess {
-    protected final PatchSetApprovalAccess delegate;
-
-    protected PatchSetApprovalAccessWrapper(PatchSetApprovalAccess delegate) {
-      this.delegate = delegate;
-    }
-
-    @Override
-    public String getRelationName() {
-      return delegate.getRelationName();
-    }
-
-    @Override
-    public int getRelationID() {
-      return delegate.getRelationID();
-    }
-
-    @Override
-    public ResultSet<PatchSetApproval> iterateAllEntities() throws OrmException {
-      return delegate.iterateAllEntities();
-    }
-
-    @Override
-    public PatchSetApproval.Key primaryKey(PatchSetApproval entity) {
-      return delegate.primaryKey(entity);
-    }
-
-    @Override
-    public Map<PatchSetApproval.Key, PatchSetApproval> toMap(Iterable<PatchSetApproval> c) {
-      return delegate.toMap(c);
-    }
-
-    @SuppressWarnings("deprecation")
-    @Override
-    public com.google.common.util.concurrent.CheckedFuture<PatchSetApproval, OrmException> getAsync(
-        PatchSetApproval.Key key) {
-      return delegate.getAsync(key);
-    }
-
-    @Override
-    public ResultSet<PatchSetApproval> get(Iterable<PatchSetApproval.Key> keys)
-        throws OrmException {
-      return delegate.get(keys);
-    }
-
-    @Override
-    public void insert(Iterable<PatchSetApproval> instances) throws OrmException {
-      delegate.insert(instances);
-    }
-
-    @Override
-    public void update(Iterable<PatchSetApproval> instances) throws OrmException {
-      delegate.update(instances);
-    }
-
-    @Override
-    public void upsert(Iterable<PatchSetApproval> instances) throws OrmException {
-      delegate.upsert(instances);
-    }
-
-    @Override
-    public void deleteKeys(Iterable<PatchSetApproval.Key> keys) throws OrmException {
-      delegate.deleteKeys(keys);
-    }
-
-    @Override
-    public void delete(Iterable<PatchSetApproval> instances) throws OrmException {
-      delegate.delete(instances);
-    }
-
-    @Override
-    public void beginTransaction(PatchSetApproval.Key key) throws OrmException {
-      delegate.beginTransaction(key);
-    }
-
-    @Override
-    public PatchSetApproval atomicUpdate(
-        PatchSetApproval.Key key, AtomicUpdate<PatchSetApproval> update) throws OrmException {
-      return delegate.atomicUpdate(key, update);
-    }
-
-    @Override
-    public PatchSetApproval get(PatchSetApproval.Key key) throws OrmException {
-      return delegate.get(key);
-    }
-
-    @Override
-    public ResultSet<PatchSetApproval> byChange(Change.Id id) throws OrmException {
-      return delegate.byChange(id);
-    }
-
-    @Override
-    public ResultSet<PatchSetApproval> byPatchSet(PatchSet.Id id) throws OrmException {
-      return delegate.byPatchSet(id);
-    }
-
-    @Override
-    public ResultSet<PatchSetApproval> byPatchSetUser(PatchSet.Id patchSet, Account.Id account)
-        throws OrmException {
-      return delegate.byPatchSetUser(patchSet, account);
-    }
-
-    @Override
-    public ResultSet<PatchSetApproval> all() throws OrmException {
-      return delegate.all();
-    }
-  }
-
-  public static class ChangeMessageAccessWrapper implements ChangeMessageAccess {
-    protected final ChangeMessageAccess delegate;
-
-    protected ChangeMessageAccessWrapper(ChangeMessageAccess delegate) {
-      this.delegate = delegate;
-    }
-
-    @Override
-    public String getRelationName() {
-      return delegate.getRelationName();
-    }
-
-    @Override
-    public int getRelationID() {
-      return delegate.getRelationID();
-    }
-
-    @Override
-    public ResultSet<ChangeMessage> iterateAllEntities() throws OrmException {
-      return delegate.iterateAllEntities();
-    }
-
-    @Override
-    public ChangeMessage.Key primaryKey(ChangeMessage entity) {
-      return delegate.primaryKey(entity);
-    }
-
-    @Override
-    public Map<ChangeMessage.Key, ChangeMessage> toMap(Iterable<ChangeMessage> c) {
-      return delegate.toMap(c);
-    }
-
-    @SuppressWarnings("deprecation")
-    @Override
-    public com.google.common.util.concurrent.CheckedFuture<ChangeMessage, OrmException> getAsync(
-        ChangeMessage.Key key) {
-      return delegate.getAsync(key);
-    }
-
-    @Override
-    public ResultSet<ChangeMessage> get(Iterable<ChangeMessage.Key> keys) throws OrmException {
-      return delegate.get(keys);
-    }
-
-    @Override
-    public void insert(Iterable<ChangeMessage> instances) throws OrmException {
-      delegate.insert(instances);
-    }
-
-    @Override
-    public void update(Iterable<ChangeMessage> instances) throws OrmException {
-      delegate.update(instances);
-    }
-
-    @Override
-    public void upsert(Iterable<ChangeMessage> instances) throws OrmException {
-      delegate.upsert(instances);
-    }
-
-    @Override
-    public void deleteKeys(Iterable<ChangeMessage.Key> keys) throws OrmException {
-      delegate.deleteKeys(keys);
-    }
-
-    @Override
-    public void delete(Iterable<ChangeMessage> instances) throws OrmException {
-      delegate.delete(instances);
-    }
-
-    @Override
-    public void beginTransaction(ChangeMessage.Key key) throws OrmException {
-      delegate.beginTransaction(key);
-    }
-
-    @Override
-    public ChangeMessage atomicUpdate(ChangeMessage.Key key, AtomicUpdate<ChangeMessage> update)
-        throws OrmException {
-      return delegate.atomicUpdate(key, update);
-    }
-
-    @Override
-    public ChangeMessage get(ChangeMessage.Key id) throws OrmException {
-      return delegate.get(id);
-    }
-
-    @Override
-    public ResultSet<ChangeMessage> byChange(Change.Id id) throws OrmException {
-      return delegate.byChange(id);
-    }
-
-    @Override
-    public ResultSet<ChangeMessage> byPatchSet(PatchSet.Id id) throws OrmException {
-      return delegate.byPatchSet(id);
-    }
-
-    @Override
-    public ResultSet<ChangeMessage> all() throws OrmException {
-      return delegate.all();
-    }
-  }
-
-  public static class PatchSetAccessWrapper implements PatchSetAccess {
-    protected final PatchSetAccess delegate;
-
-    protected PatchSetAccessWrapper(PatchSetAccess delegate) {
-      this.delegate = delegate;
-    }
-
-    @Override
-    public String getRelationName() {
-      return delegate.getRelationName();
-    }
-
-    @Override
-    public int getRelationID() {
-      return delegate.getRelationID();
-    }
-
-    @Override
-    public ResultSet<PatchSet> iterateAllEntities() throws OrmException {
-      return delegate.iterateAllEntities();
-    }
-
-    @Override
-    public PatchSet.Id primaryKey(PatchSet entity) {
-      return delegate.primaryKey(entity);
-    }
-
-    @Override
-    public Map<PatchSet.Id, PatchSet> toMap(Iterable<PatchSet> c) {
-      return delegate.toMap(c);
-    }
-
-    @SuppressWarnings("deprecation")
-    @Override
-    public com.google.common.util.concurrent.CheckedFuture<PatchSet, OrmException> getAsync(
-        PatchSet.Id key) {
-      return delegate.getAsync(key);
-    }
-
-    @Override
-    public ResultSet<PatchSet> get(Iterable<PatchSet.Id> keys) throws OrmException {
-      return delegate.get(keys);
-    }
-
-    @Override
-    public void insert(Iterable<PatchSet> instances) throws OrmException {
-      delegate.insert(instances);
-    }
-
-    @Override
-    public void update(Iterable<PatchSet> instances) throws OrmException {
-      delegate.update(instances);
-    }
-
-    @Override
-    public void upsert(Iterable<PatchSet> instances) throws OrmException {
-      delegate.upsert(instances);
-    }
-
-    @Override
-    public void deleteKeys(Iterable<PatchSet.Id> keys) throws OrmException {
-      delegate.deleteKeys(keys);
-    }
-
-    @Override
-    public void delete(Iterable<PatchSet> instances) throws OrmException {
-      delegate.delete(instances);
-    }
-
-    @Override
-    public void beginTransaction(PatchSet.Id key) throws OrmException {
-      delegate.beginTransaction(key);
-    }
-
-    @Override
-    public PatchSet atomicUpdate(PatchSet.Id key, AtomicUpdate<PatchSet> update)
-        throws OrmException {
-      return delegate.atomicUpdate(key, update);
-    }
-
-    @Override
-    public PatchSet get(PatchSet.Id id) throws OrmException {
-      return delegate.get(id);
-    }
-
-    @Override
-    public ResultSet<PatchSet> byChange(Change.Id id) throws OrmException {
-      return delegate.byChange(id);
-    }
-
-    @Override
-    public ResultSet<PatchSet> all() throws OrmException {
-      return delegate.all();
-    }
-  }
-
-  public static class PatchLineCommentAccessWrapper implements PatchLineCommentAccess {
-    protected PatchLineCommentAccess delegate;
-
-    protected PatchLineCommentAccessWrapper(PatchLineCommentAccess delegate) {
-      this.delegate = delegate;
-    }
-
-    @Override
-    public String getRelationName() {
-      return delegate.getRelationName();
-    }
-
-    @Override
-    public int getRelationID() {
-      return delegate.getRelationID();
-    }
-
-    @Override
-    public ResultSet<PatchLineComment> iterateAllEntities() throws OrmException {
-      return delegate.iterateAllEntities();
-    }
-
-    @Override
-    public PatchLineComment.Key primaryKey(PatchLineComment entity) {
-      return delegate.primaryKey(entity);
-    }
-
-    @Override
-    public Map<PatchLineComment.Key, PatchLineComment> toMap(Iterable<PatchLineComment> c) {
-      return delegate.toMap(c);
-    }
-
-    @SuppressWarnings("deprecation")
-    @Override
-    public com.google.common.util.concurrent.CheckedFuture<PatchLineComment, OrmException> getAsync(
-        PatchLineComment.Key key) {
-      return delegate.getAsync(key);
-    }
-
-    @Override
-    public ResultSet<PatchLineComment> get(Iterable<PatchLineComment.Key> keys)
-        throws OrmException {
-      return delegate.get(keys);
-    }
-
-    @Override
-    public void insert(Iterable<PatchLineComment> instances) throws OrmException {
-      delegate.insert(instances);
-    }
-
-    @Override
-    public void update(Iterable<PatchLineComment> instances) throws OrmException {
-      delegate.update(instances);
-    }
-
-    @Override
-    public void upsert(Iterable<PatchLineComment> instances) throws OrmException {
-      delegate.upsert(instances);
-    }
-
-    @Override
-    public void deleteKeys(Iterable<PatchLineComment.Key> keys) throws OrmException {
-      delegate.deleteKeys(keys);
-    }
-
-    @Override
-    public void delete(Iterable<PatchLineComment> instances) throws OrmException {
-      delegate.delete(instances);
-    }
-
-    @Override
-    public void beginTransaction(PatchLineComment.Key key) throws OrmException {
-      delegate.beginTransaction(key);
-    }
-
-    @Override
-    public PatchLineComment atomicUpdate(
-        PatchLineComment.Key key, AtomicUpdate<PatchLineComment> update) throws OrmException {
-      return delegate.atomicUpdate(key, update);
-    }
-
-    @Override
-    public PatchLineComment get(PatchLineComment.Key id) throws OrmException {
-      return delegate.get(id);
-    }
-
-    @Override
-    public ResultSet<PatchLineComment> byChange(Change.Id id) throws OrmException {
-      return delegate.byChange(id);
-    }
-
-    @Override
-    public ResultSet<PatchLineComment> byPatchSet(PatchSet.Id id) throws OrmException {
-      return delegate.byPatchSet(id);
-    }
-
-    @Override
-    public ResultSet<PatchLineComment> publishedByChangeFile(Change.Id id, String file)
-        throws OrmException {
-      return delegate.publishedByChangeFile(id, file);
-    }
-
-    @Override
-    public ResultSet<PatchLineComment> publishedByPatchSet(PatchSet.Id patchset)
-        throws OrmException {
-      return delegate.publishedByPatchSet(patchset);
-    }
-
-    @Override
-    public ResultSet<PatchLineComment> draftByPatchSetAuthor(
-        PatchSet.Id patchset, Account.Id author) throws OrmException {
-      return delegate.draftByPatchSetAuthor(patchset, author);
-    }
-
-    @Override
-    public ResultSet<PatchLineComment> draftByChangeFileAuthor(
-        Change.Id id, String file, Account.Id author) throws OrmException {
-      return delegate.draftByChangeFileAuthor(id, file, author);
-    }
-
-    @Override
-    public ResultSet<PatchLineComment> draftByAuthor(Account.Id author) throws OrmException {
-      return delegate.draftByAuthor(author);
-    }
-
-    @Override
-    public ResultSet<PatchLineComment> all() throws OrmException {
-      return delegate.all();
-    }
-  }
-}
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/SystemConfigAccess.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/SystemConfigAccess.java
deleted file mode 100644
index a2177fd..0000000
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/SystemConfigAccess.java
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.reviewdb.server;
-
-import com.google.gerrit.reviewdb.client.SystemConfig;
-import com.google.gwtorm.server.Access;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.PrimaryKey;
-import com.google.gwtorm.server.Query;
-import com.google.gwtorm.server.ResultSet;
-
-/** Access interface for {@link SystemConfig}. */
-public interface SystemConfigAccess extends Access<SystemConfig, SystemConfig.Key> {
-  @Override
-  @PrimaryKey("singleton")
-  SystemConfig get(SystemConfig.Key key) throws OrmException;
-
-  @Query
-  ResultSet<SystemConfig> all() throws OrmException;
-}
diff --git a/gerrit-reviewdb/src/main/resources/com/google/gerrit/reviewdb/server/index_generic.sql b/gerrit-reviewdb/src/main/resources/com/google/gerrit/reviewdb/server/index_generic.sql
deleted file mode 100644
index 8f87503..0000000
--- a/gerrit-reviewdb/src/main/resources/com/google/gerrit/reviewdb/server/index_generic.sql
+++ /dev/null
@@ -1,54 +0,0 @@
--- Gerrit 2 : Generic
---
-
--- Indexes to support @Query
---
-
--- *********************************************************************
--- AccountGroupMemberAccess
---    @PrimaryKey covers: byAccount
-CREATE INDEX account_group_members_byGroup
-ON account_group_members (group_id);
-
-
--- *********************************************************************
--- AccountGroupByIdAccess
---    @PrimaryKey covers: byGroup
-CREATE INDEX account_group_id_byInclude
-ON account_group_by_id (include_uuid);
-
-
--- *********************************************************************
--- ApprovalCategoryAccess
---    too small to bother indexing
-
-
--- *********************************************************************
--- ApprovalCategoryValueAccess
---     @PrimaryKey covers: byCategory
-
-
--- *********************************************************************
--- BranchAccess
---    @PrimaryKey covers: byProject
-
-
--- *********************************************************************
--- ChangeMessageAccess
---    @PrimaryKey covers: byChange
-
---    covers:             byPatchSet
-CREATE INDEX change_messages_byPatchset
-ON change_messages (patchset_change_id, patchset_patch_set_id);
-
--- *********************************************************************
--- PatchLineCommentAccess
---    @PrimaryKey covers: published, draft
-CREATE INDEX patch_comment_drafts
-ON patch_comments (status, author_id);
-
-
--- *********************************************************************
--- PatchSetAccess
-CREATE INDEX patch_sets_byRevision
-ON patch_sets (revision);
diff --git a/gerrit-reviewdb/src/main/resources/com/google/gerrit/reviewdb/server/index_maxdb.sql b/gerrit-reviewdb/src/main/resources/com/google/gerrit/reviewdb/server/index_maxdb.sql
deleted file mode 100644
index 57b1a4a..0000000
--- a/gerrit-reviewdb/src/main/resources/com/google/gerrit/reviewdb/server/index_maxdb.sql
+++ /dev/null
@@ -1,58 +0,0 @@
-delimiter #
--- Gerrit 2 : MaxDB
---
-
--- Indexes to support @Query
---
-
--- *********************************************************************
--- AccountGroupMemberAccess
---    @PrimaryKey covers: byAccount
-CREATE INDEX account_group_members_byGroup
-ON account_group_members (group_id)
-#
-
--- *********************************************************************
--- AccountGroupIncludeByUuidAccess
---    @PrimaryKey covers: byGroup
-CREATE INDEX acc_gr_incl_by_uuid_byInclude
-ON account_group_by_id (include_uuid)
-#
-
-
--- *********************************************************************
--- ApprovalCategoryAccess
---    too small to bother indexing
-
-
--- *********************************************************************
--- ApprovalCategoryValueAccess
---     @PrimaryKey covers: byCategory
-
-
--- *********************************************************************
--- BranchAccess
---    @PrimaryKey covers: byProject
-
-
--- *********************************************************************
--- ChangeMessageAccess
---    @PrimaryKey covers: byChange
-
---    covers:             byPatchSet
-CREATE INDEX change_messages_byPatchset
-ON change_messages (patchset_change_id, patchset_patch_set_id)
-#
-
--- *********************************************************************
--- PatchLineCommentAccess
---    @PrimaryKey covers: published, draft
-CREATE INDEX patch_comment_drafts
-ON patch_comments (status, author_id)
-#
-
--- *********************************************************************
--- PatchSetAccess
-CREATE INDEX patch_sets_byRevision
-ON patch_sets (revision)
-#
diff --git a/gerrit-reviewdb/src/main/resources/com/google/gerrit/reviewdb/server/index_postgres.sql b/gerrit-reviewdb/src/main/resources/com/google/gerrit/reviewdb/server/index_postgres.sql
deleted file mode 100644
index e1d88ef..0000000
--- a/gerrit-reviewdb/src/main/resources/com/google/gerrit/reviewdb/server/index_postgres.sql
+++ /dev/null
@@ -1,102 +0,0 @@
--- Gerrit 2 : PostgreSQL
---
-
--- Cluster hot tables by their primary method of access
---
-ALTER TABLE patch_sets CLUSTER ON patch_sets_pkey;
-ALTER TABLE change_messages CLUSTER ON change_messages_pkey;
-ALTER TABLE patch_comments CLUSTER ON patch_comments_pkey;
-ALTER TABLE patch_set_approvals CLUSTER ON patch_set_approvals_pkey;
-
-ALTER TABLE account_group_members CLUSTER ON account_group_members_pkey;
-CLUSTER;
-
-
--- Define function for conditional installation of PL/pgSQL.
--- This is required, because starting with PostgreSQL 9.0, PL/pgSQL
--- language is installed by default and database returns error when
--- we try to install it again.
---
--- Source: http://wiki.postgresql.org/wiki/CREATE_OR_REPLACE_LANGUAGE
--- Author: David Fetter
---
-
-delimiter //
-
-CREATE OR REPLACE FUNCTION make_plpgsql()
-RETURNS VOID
-LANGUAGE SQL
-AS $$
-CREATE LANGUAGE plpgsql;
-$$;
-
-//
-
-delimiter ;
-
-SELECT
-    CASE
-    WHEN EXISTS(
-        SELECT 1
-        FROM pg_catalog.pg_language
-        WHERE lanname='plpgsql'
-    )
-    THEN NULL
-    ELSE make_plpgsql() END;
-
-DROP FUNCTION make_plpgsql();
-
-delimiter ;
-
--- Indexes to support @Query
---
-
--- *********************************************************************
--- AccountGroupMemberAccess
---    @PrimaryKey covers: byAccount
-CREATE INDEX account_group_members_byGroup
-ON account_group_members (group_id);
-
-
--- *********************************************************************
--- AccountGroupByIdAccess
---    @PrimaryKey covers: byGroup
-CREATE INDEX account_group_id_byInclude
-ON account_group_by_id (include_uuid);
-
-
--- *********************************************************************
--- ApprovalCategoryAccess
---    too small to bother indexing
-
-
--- *********************************************************************
--- ApprovalCategoryValueAccess
---     @PrimaryKey covers: byCategory
-
-
--- *********************************************************************
--- BranchAccess
---    @PrimaryKey covers: byProject
-
-
--- *********************************************************************
--- ChangeMessageAccess
---    @PrimaryKey covers: byChange
-
---    covers:             byPatchSet
-CREATE INDEX change_messages_byPatchset
-ON change_messages (patchset_change_id, patchset_patch_set_id);
-
--- *********************************************************************
--- PatchLineCommentAccess
---    @PrimaryKey covers: published, draft
-CREATE INDEX patch_comment_drafts
-ON patch_comments (author_id)
-WHERE status = 'd';
-
-
--- *********************************************************************
--- PatchSetAccess
-CREATE INDEX patch_sets_byRevision
-ON patch_sets (revision);
diff --git a/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/AccountGroupTest.java b/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/AccountGroupTest.java
deleted file mode 100644
index 02b6dd8..0000000
--- a/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/AccountGroupTest.java
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.reviewdb.client;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import java.sql.Timestamp;
-import java.time.Instant;
-import java.time.LocalDateTime;
-import java.time.Month;
-import java.time.ZoneOffset;
-import org.junit.Test;
-
-public class AccountGroupTest {
-  @Test
-  public void auditCreationInstant() {
-    Instant instant = LocalDateTime.of(2009, Month.JUNE, 8, 19, 31).toInstant(ZoneOffset.UTC);
-    assertThat(AccountGroup.auditCreationInstantTs()).isEqualTo(Timestamp.from(instant));
-  }
-}
diff --git a/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/AccountSshKeyTest.java b/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/AccountSshKeyTest.java
deleted file mode 100644
index ed378e4..0000000
--- a/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/AccountSshKeyTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-// 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.
-
-package com.google.gerrit.reviewdb.client;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import org.junit.Test;
-
-public class AccountSshKeyTest {
-  private static final String KEY =
-      "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCgug5VyMXQGnem2H1KVC4/HcRcD4zzBqS"
-          + "uJBRWVonSSoz3RoAZ7bWXCVVGwchtXwUURD689wFYdiPecOrWOUgeeyRq754YWRhU+W28"
-          + "vf8IZixgjCmiBhaL2gt3wff6pP+NXJpTSA4aeWE5DfNK5tZlxlSxqkKOS8JRSUeNQov5T"
-          + "w== john.doe@example.com";
-
-  private static final String KEY_WITH_NEWLINES =
-      "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCgug5VyMXQGnem2H1KVC4/HcRcD4zzBqS\n"
-          + "uJBRWVonSSoz3RoAZ7bWXCVVGwchtXwUURD689wFYdiPecOrWOUgeeyRq754YWRhU+W28\n"
-          + "vf8IZixgjCmiBhaL2gt3wff6pP+NXJpTSA4aeWE5DfNK5tZlxlSxqkKOS8JRSUeNQov5T\n"
-          + "w== john.doe@example.com";
-
-  private final Account.Id accountId = new Account.Id(1);
-
-  @Test
-  public void validity() throws Exception {
-    AccountSshKey key = new AccountSshKey(new AccountSshKey.Id(accountId, -1), KEY);
-    assertThat(key.isValid()).isFalse();
-    key = new AccountSshKey(new AccountSshKey.Id(accountId, 0), KEY);
-    assertThat(key.isValid()).isFalse();
-    key = new AccountSshKey(new AccountSshKey.Id(accountId, 1), KEY);
-    assertThat(key.isValid()).isTrue();
-  }
-
-  @Test
-  public void getters() throws Exception {
-    AccountSshKey key = new AccountSshKey(new AccountSshKey.Id(accountId, 1), KEY);
-    assertThat(key.getSshPublicKey()).isEqualTo(KEY);
-    assertThat(key.getAlgorithm()).isEqualTo(KEY.split(" ")[0]);
-    assertThat(key.getEncodedKey()).isEqualTo(KEY.split(" ")[1]);
-    assertThat(key.getComment()).isEqualTo(KEY.split(" ")[2]);
-  }
-
-  @Test
-  public void keyWithNewLines() throws Exception {
-    AccountSshKey key = new AccountSshKey(new AccountSshKey.Id(accountId, 1), KEY_WITH_NEWLINES);
-    assertThat(key.getSshPublicKey()).isEqualTo(KEY);
-    assertThat(key.getAlgorithm()).isEqualTo(KEY.split(" ")[0]);
-    assertThat(key.getEncodedKey()).isEqualTo(KEY.split(" ")[1]);
-    assertThat(key.getComment()).isEqualTo(KEY.split(" ")[2]);
-  }
-}
diff --git a/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/PatchSetApprovalTest.java b/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/PatchSetApprovalTest.java
deleted file mode 100644
index a0a806f..0000000
--- a/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/PatchSetApprovalTest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.reviewdb.client;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.gerrit.testutil.GerritBaseTests;
-import java.util.HashMap;
-import java.util.Map;
-import org.junit.Test;
-
-public class PatchSetApprovalTest extends GerritBaseTests {
-  @Test
-  public void keyEquality() {
-    PatchSetApproval.Key k1 =
-        new PatchSetApproval.Key(
-            new PatchSet.Id(new Change.Id(1), 2), new Account.Id(3), new LabelId("My-Label"));
-    PatchSetApproval.Key k2 =
-        new PatchSetApproval.Key(
-            new PatchSet.Id(new Change.Id(1), 2), new Account.Id(3), new LabelId("My-Label"));
-    PatchSetApproval.Key k3 =
-        new PatchSetApproval.Key(
-            new PatchSet.Id(new Change.Id(1), 2), new Account.Id(3), new LabelId("Other-Label"));
-
-    assertThat(k2).isEqualTo(k1);
-    assertThat(k3).isNotEqualTo(k1);
-    assertThat(k2.hashCode()).isEqualTo(k1.hashCode());
-    assertThat(k3.hashCode()).isNotEqualTo(k1.hashCode());
-
-    Map<PatchSetApproval.Key, String> map = new HashMap<>();
-    map.put(k1, "k1");
-    map.put(k2, "k2");
-    map.put(k3, "k3");
-    assertThat(map).containsKey(k1);
-    assertThat(map).containsKey(k2);
-    assertThat(map).containsKey(k3);
-    assertThat(map).containsEntry(k1, "k2");
-    assertThat(map).containsEntry(k2, "k2");
-    assertThat(map).containsEntry(k3, "k3");
-  }
-}
diff --git a/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/RefNamesTest.java b/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/RefNamesTest.java
deleted file mode 100644
index 7044547..0000000
--- a/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/RefNamesTest.java
+++ /dev/null
@@ -1,204 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.reviewdb.client;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.reviewdb.client.RefNames.parseAfterShardedRefPart;
-import static com.google.gerrit.reviewdb.client.RefNames.parseRefSuffix;
-import static com.google.gerrit.reviewdb.client.RefNames.parseShardedRefPart;
-import static com.google.gerrit.reviewdb.client.RefNames.skipShardedRefPart;
-
-import org.junit.Test;
-
-public class RefNamesTest {
-  private final Account.Id accountId = new Account.Id(1011123);
-  private final Change.Id changeId = new Change.Id(67473);
-  private final PatchSet.Id psId = new PatchSet.Id(changeId, 42);
-
-  @Test
-  public void fullName() throws Exception {
-    assertThat(RefNames.fullName(RefNames.REFS_CONFIG)).isEqualTo(RefNames.REFS_CONFIG);
-    assertThat(RefNames.fullName("refs/heads/master")).isEqualTo("refs/heads/master");
-    assertThat(RefNames.fullName("master")).isEqualTo("refs/heads/master");
-    assertThat(RefNames.fullName("refs/tags/v1.0")).isEqualTo("refs/tags/v1.0");
-    assertThat(RefNames.fullName("HEAD")).isEqualTo("HEAD");
-  }
-
-  @Test
-  public void changeRefs() throws Exception {
-    String changeMetaRef = RefNames.changeMetaRef(changeId);
-    assertThat(changeMetaRef).isEqualTo("refs/changes/73/67473/meta");
-    assertThat(RefNames.isNoteDbMetaRef(changeMetaRef)).isTrue();
-
-    String robotCommentsRef = RefNames.robotCommentsRef(changeId);
-    assertThat(robotCommentsRef).isEqualTo("refs/changes/73/67473/robot-comments");
-    assertThat(RefNames.isNoteDbMetaRef(robotCommentsRef)).isTrue();
-  }
-
-  @Test
-  public void refsUsers() throws Exception {
-    assertThat(RefNames.refsUsers(accountId)).isEqualTo("refs/users/23/1011123");
-  }
-
-  @Test
-  public void refsDraftComments() throws Exception {
-    assertThat(RefNames.refsDraftComments(changeId, accountId))
-        .isEqualTo("refs/draft-comments/73/67473/1011123");
-  }
-
-  @Test
-  public void refsDraftCommentsPrefix() throws Exception {
-    assertThat(RefNames.refsDraftCommentsPrefix(changeId))
-        .isEqualTo("refs/draft-comments/73/67473/");
-  }
-
-  @Test
-  public void refsStarredChanges() throws Exception {
-    assertThat(RefNames.refsStarredChanges(changeId, accountId))
-        .isEqualTo("refs/starred-changes/73/67473/1011123");
-  }
-
-  @Test
-  public void refsStarredChangesPrefix() throws Exception {
-    assertThat(RefNames.refsStarredChangesPrefix(changeId))
-        .isEqualTo("refs/starred-changes/73/67473/");
-  }
-
-  @Test
-  public void refsEdit() throws Exception {
-    assertThat(RefNames.refsEdit(accountId, changeId, psId))
-        .isEqualTo("refs/users/23/1011123/edit-67473/42");
-  }
-
-  @Test
-  public void isRefsEdit() throws Exception {
-    assertThat(RefNames.isRefsEdit("refs/users/23/1011123/edit-67473/42")).isTrue();
-
-    // user ref, but no edit ref
-    assertThat(RefNames.isRefsEdit("refs/users/23/1011123")).isFalse();
-
-    // other ref
-    assertThat(RefNames.isRefsEdit("refs/heads/master")).isFalse();
-  }
-
-  @Test
-  public void isRefsUsers() throws Exception {
-    assertThat(RefNames.isRefsUsers("refs/users/23/1011123")).isTrue();
-    assertThat(RefNames.isRefsUsers("refs/users/default")).isTrue();
-    assertThat(RefNames.isRefsUsers("refs/users/23/1011123/edit-67473/42")).isTrue();
-
-    assertThat(RefNames.isRefsUsers("refs/heads/master")).isFalse();
-  }
-
-  @Test
-  public void parseShardedRefsPart() throws Exception {
-    assertThat(parseShardedRefPart("01/1")).isEqualTo(1);
-    assertThat(parseShardedRefPart("01/1-drafts")).isEqualTo(1);
-    assertThat(parseShardedRefPart("01/1-drafts/2")).isEqualTo(1);
-
-    assertThat(parseShardedRefPart(null)).isNull();
-    assertThat(parseShardedRefPart("")).isNull();
-
-    // Prefix not stripped.
-    assertThat(parseShardedRefPart("refs/users/01/1")).isNull();
-
-    // Invalid characters.
-    assertThat(parseShardedRefPart("01a/1")).isNull();
-    assertThat(parseShardedRefPart("01/a1")).isNull();
-
-    // Mismatched shard.
-    assertThat(parseShardedRefPart("01/23")).isNull();
-
-    // Shard too short.
-    assertThat(parseShardedRefPart("1/1")).isNull();
-  }
-
-  @Test
-  public void skipShardedRefsPart() throws Exception {
-    assertThat(skipShardedRefPart("01/1")).isEqualTo("");
-    assertThat(skipShardedRefPart("01/1/")).isEqualTo("/");
-    assertThat(skipShardedRefPart("01/1/2")).isEqualTo("/2");
-    assertThat(skipShardedRefPart("01/1-edit")).isEqualTo("-edit");
-
-    assertThat(skipShardedRefPart(null)).isNull();
-    assertThat(skipShardedRefPart("")).isNull();
-
-    // Prefix not stripped.
-    assertThat(skipShardedRefPart("refs/draft-comments/01/1/2")).isNull();
-
-    // Invalid characters.
-    assertThat(skipShardedRefPart("01a/1/2")).isNull();
-    assertThat(skipShardedRefPart("01a/a1/2")).isNull();
-
-    // Mismatched shard.
-    assertThat(skipShardedRefPart("01/23/2")).isNull();
-
-    // Shard too short.
-    assertThat(skipShardedRefPart("1/1")).isNull();
-  }
-
-  @Test
-  public void parseAfterShardedRefsPart() throws Exception {
-    assertThat(parseAfterShardedRefPart("01/1/2")).isEqualTo(2);
-    assertThat(parseAfterShardedRefPart("01/1/2/4")).isEqualTo(2);
-    assertThat(parseAfterShardedRefPart("01/1/2-edit")).isEqualTo(2);
-
-    assertThat(parseAfterShardedRefPart(null)).isNull();
-    assertThat(parseAfterShardedRefPart("")).isNull();
-
-    // No ID after sharded ref part
-    assertThat(parseAfterShardedRefPart("01/1")).isNull();
-    assertThat(parseAfterShardedRefPart("01/1/")).isNull();
-    assertThat(parseAfterShardedRefPart("01/1/a")).isNull();
-
-    // Prefix not stripped.
-    assertThat(parseAfterShardedRefPart("refs/draft-comments/01/1/2")).isNull();
-
-    // Invalid characters.
-    assertThat(parseAfterShardedRefPart("01a/1/2")).isNull();
-    assertThat(parseAfterShardedRefPart("01a/a1/2")).isNull();
-
-    // Mismatched shard.
-    assertThat(parseAfterShardedRefPart("01/23/2")).isNull();
-
-    // Shard too short.
-    assertThat(parseAfterShardedRefPart("1/1")).isNull();
-  }
-
-  @Test
-  public void testParseRefSuffix() throws Exception {
-    assertThat(parseRefSuffix("1/2/34")).isEqualTo(34);
-    assertThat(parseRefSuffix("/34")).isEqualTo(34);
-
-    assertThat(parseRefSuffix(null)).isNull();
-    assertThat(parseRefSuffix("")).isNull();
-    assertThat(parseRefSuffix("34")).isNull();
-    assertThat(parseRefSuffix("12/ab")).isNull();
-    assertThat(parseRefSuffix("12/a4")).isNull();
-    assertThat(parseRefSuffix("12/4a")).isNull();
-    assertThat(parseRefSuffix("a4")).isNull();
-    assertThat(parseRefSuffix("4a")).isNull();
-  }
-
-  @Test
-  public void shard() throws Exception {
-    assertThat(RefNames.shard(1011123)).isEqualTo("23/1011123");
-    assertThat(RefNames.shard(537)).isEqualTo("37/537");
-    assertThat(RefNames.shard(12)).isEqualTo("12/12");
-    assertThat(RefNames.shard(0)).isEqualTo("00/0");
-    assertThat(RefNames.shard(1)).isEqualTo("01/1");
-    assertThat(RefNames.shard(-1)).isNull();
-  }
-}
diff --git a/gerrit-server/BUILD b/gerrit-server/BUILD
deleted file mode 100644
index fc0fb0d..0000000
--- a/gerrit-server/BUILD
+++ /dev/null
@@ -1,355 +0,0 @@
-load("//lib/prolog:prolog.bzl", "prolog_cafe_library")
-load("//tools/bzl:javadoc.bzl", "java_doc")
-load("//tools/bzl:junit.bzl", "junit_tests")
-
-CONSTANTS_SRC = [
-    "src/main/java/com/google/gerrit/server/documentation/Constants.java",
-]
-
-GERRIT_GLOBAL_MODULE_SRC = [
-    "src/main/java/com/google/gerrit/server/config/GerritGlobalModule.java",
-]
-
-# Non-recursive glob; dropwizard implementation is in a subpackage.
-METRICS_SRCS = glob(["src/main/java/com/google/gerrit/metrics/*.java"])
-
-RECEIVE_SRCS = glob(["src/main/java/com/google/gerrit/server/git/receive/**/*.java"])
-
-SRCS = glob(
-    ["src/main/java/**/*.java"],
-    exclude = CONSTANTS_SRC + GERRIT_GLOBAL_MODULE_SRC + METRICS_SRCS + RECEIVE_SRCS,
-)
-
-RESOURCES = glob(["src/main/resources/**/*"])
-
-java_library(
-    name = "constants",
-    srcs = CONSTANTS_SRC,
-    visibility = ["//visibility:public"],
-)
-
-prolog_cafe_library(
-    name = "prolog-common",
-    srcs = ["src/main/prolog/gerrit_common.pl"],
-    visibility = ["//visibility:public"],
-    deps = [":server"],
-)
-
-# Giant kitchen-sink target.
-#
-# The only reason this hasn't been split up further is because we have too many
-# tangled dependencies (and Guice unfortunately makes it quite easy to get into
-# this state). Which means if you see an opportunity to split something off, you
-# should seize it.
-java_library(
-    name = "server",
-    srcs = SRCS,
-    resources = RESOURCES,
-    visibility = ["//visibility:public"],
-    deps = [
-        ":constants",
-        ":metrics",
-        "//gerrit-common:annotations",
-        "//gerrit-common:server",
-        "//gerrit-extension-api:api",
-        "//gerrit-index:index",
-        "//gerrit-index:query_exception",
-        "//gerrit-patch-commonsnet:commons-net",
-        "//gerrit-patch-jgit:server",
-        "//gerrit-prettify:server",
-        "//gerrit-reviewdb:server",
-        "//gerrit-util-cli:cli",
-        "//gerrit-util-ssl:ssl",
-        "//lib:args4j",
-        "//lib:automaton",
-        "//lib:blame-cache",
-        "//lib:grappa",
-        "//lib:gson",
-        "//lib:guava",
-        "//lib:guava-retrying",
-        "//lib:gwtjsonrpc",
-        "//lib:gwtorm",
-        "//lib:jsch",
-        "//lib:juniversalchardet",
-        "//lib:mime-util",
-        "//lib:pegdown",
-        "//lib:protobuf",
-        "//lib:servlet-api-3_1",
-        "//lib:soy",
-        "//lib:tukaani-xz",
-        "//lib:velocity",
-        "//lib/auto:auto-value",
-        "//lib/auto:auto-value-annotations",
-        "//lib/bouncycastle:bcpkix-neverlink",
-        "//lib/bouncycastle:bcprov-neverlink",
-        "//lib/commons:codec",
-        "//lib/commons:compress",
-        "//lib/commons:dbcp",
-        "//lib/commons:lang",
-        "//lib/commons:net",
-        "//lib/commons:validator",
-        "//lib/dropwizard:dropwizard-core",
-        "//lib/guice",
-        "//lib/guice:guice-assistedinject",
-        "//lib/guice:guice-servlet",
-        "//lib/jgit/org.eclipse.jgit.archive:jgit-archive",
-        "//lib/jgit/org.eclipse.jgit:jgit",
-        "//lib/joda:joda-time",
-        "//lib/jsoup",
-        "//lib/log:api",
-        "//lib/log:jsonevent-layout",
-        "//lib/log:log4j",
-        "//lib/lucene:lucene-analyzers-common",
-        "//lib/lucene:lucene-core-and-backward-codecs",
-        "//lib/lucene:lucene-queryparser",
-        "//lib/mime4j:core",
-        "//lib/mime4j:dom",
-        "//lib/ow2:ow2-asm",
-        "//lib/ow2:ow2-asm-tree",
-        "//lib/ow2:ow2-asm-util",
-        "//lib/prolog:runtime",
-    ],
-)
-
-# Large modules that import things from all across the server package
-# hierarchy, so they need lots of dependencies.
-java_library(
-    name = "module",
-    srcs = GERRIT_GLOBAL_MODULE_SRC,
-    visibility = ["//visibility:public"],
-    deps = [
-        ":receive",
-        ":server",
-        "//gerrit-extension-api:api",
-        "//lib:blame-cache",
-        "//lib:guava",
-        "//lib:soy",
-        "//lib:velocity",
-        "//lib/guice",
-        "//lib/jgit/org.eclipse.jgit:jgit",
-    ],
-)
-
-java_library(
-    name = "receive",
-    srcs = RECEIVE_SRCS,
-    visibility = ["//visibility:public"],
-    deps = [
-        ":server",
-        "//gerrit-common:annotations",
-        "//gerrit-common:server",
-        "//gerrit-extension-api:api",
-        "//gerrit-reviewdb:server",
-        "//gerrit-util-cli:cli",
-        "//lib:args4j",
-        "//lib:guava",
-        "//lib:gwtorm",
-        "//lib/auto:auto-value",
-        "//lib/auto:auto-value-annotations",
-        "//lib/guice",
-        "//lib/guice:guice-assistedinject",
-        "//lib/jgit/org.eclipse.jgit:jgit",
-        "//lib/log:api",
-    ],
-)
-
-# TODO(dborowitz): Move to a different top-level directory to avoid inbound
-# dependencies on gerrit-server.
-java_library(
-    name = "metrics",
-    srcs = METRICS_SRCS,
-    visibility = ["//visibility:public"],
-    deps = [
-        "//gerrit-extension-api:api",
-        "//lib:guava",
-    ],
-)
-
-TESTUTIL_DEPS = [
-    ":metrics",
-    ":module",
-    ":server",
-    "//gerrit-common:annotations",
-    "//gerrit-common:server",
-    "//gerrit-cache-h2:cache-h2",
-    "//gerrit-cache-mem:mem",
-    "//gerrit-extension-api:api",
-    "//gerrit-gpg:gpg",
-    "//gerrit-index:index",
-    "//gerrit-lucene:lucene",
-    "//gerrit-reviewdb:server",
-    "//lib:gwtorm",
-    "//lib:h2",
-    "//lib:truth",
-    "//lib/guice:guice",
-    "//lib/guice:guice-servlet",
-    "//lib/jgit/org.eclipse.jgit:jgit",
-    "//lib/jgit/org.eclipse.jgit.junit:junit",
-    "//lib/joda:joda-time",
-    "//lib/log:api",
-    "//lib/log:impl-log4j",
-    "//lib/log:log4j",
-]
-
-TESTUTIL = glob([
-    "src/test/java/com/google/gerrit/testutil/**/*.java",
-]) + [
-    "src/test/java/com/google/gerrit/server/project/Util.java",
-]
-
-java_library(
-    name = "testutil",
-    testonly = 1,
-    srcs = TESTUTIL,
-    visibility = ["//visibility:public"],
-    exports = [
-        "//lib/easymock",
-        "//lib/powermock:powermock-api-easymock",
-        "//lib/powermock:powermock-api-support",
-        "//lib/powermock:powermock-core",
-        "//lib/powermock:powermock-module-junit4",
-        "//lib/powermock:powermock-module-junit4-common",
-    ],
-    deps = TESTUTIL_DEPS + [
-        "//gerrit-pgm:init",
-        "//lib/auto:auto-value",
-        "//lib/auto:auto-value-annotations",
-        "//lib/easymock:easymock",
-        "//lib/powermock:powermock-api-easymock",
-        "//lib/powermock:powermock-api-support",
-        "//lib/powermock:powermock-core",
-        "//lib/powermock:powermock-module-junit4",
-        "//lib/powermock:powermock-module-junit4-common",
-    ],
-)
-
-CUSTOM_TRUTH_SUBJECTS = glob([
-    "src/test/java/com/google/gerrit/server/**/*Subject.java",
-])
-
-java_library(
-    name = "custom-truth-subjects",
-    testonly = 1,
-    srcs = CUSTOM_TRUTH_SUBJECTS,
-    deps = [
-        ":server",
-        "//gerrit-extension-api:api",
-        "//gerrit-test-util:test_util",
-        "//lib:truth",
-    ],
-)
-
-PROLOG_TEST_CASE = [
-    "src/test/java/com/google/gerrit/rules/PrologTestCase.java",
-]
-
-PROLOG_TESTS = glob(
-    ["src/test/java/com/google/gerrit/rules/**/*.java"],
-    exclude = PROLOG_TEST_CASE,
-)
-
-java_library(
-    name = "prolog_test_case",
-    testonly = 1,
-    srcs = PROLOG_TEST_CASE,
-    deps = [
-        ":server",
-        ":testutil",
-        "//gerrit-common:server",
-        "//gerrit-extension-api:api",
-        "//lib:guava",
-        "//lib:junit",
-        "//lib:truth",
-        "//lib/guice",
-        "//lib/prolog:runtime",
-    ],
-)
-
-junit_tests(
-    name = "prolog_tests",
-    srcs = PROLOG_TESTS,
-    resources = glob(["src/test/resources/com/google/gerrit/rules/**/*"]),
-    deps = TESTUTIL_DEPS + [
-        ":prolog-common",
-        ":prolog_test_case",
-        ":testutil",
-        "//lib/prolog:runtime",
-    ],
-)
-
-QUERY_TESTS = glob(
-    ["src/test/java/com/google/gerrit/server/query/**/*.java"],
-)
-
-java_library(
-    name = "query_tests_code",
-    testonly = 1,
-    srcs = QUERY_TESTS,
-    visibility = ["//visibility:public"],
-    deps = TESTUTIL_DEPS + [
-        ":prolog-common",
-        ":testutil",
-    ],
-)
-
-junit_tests(
-    name = "query_tests",
-    size = "large",
-    srcs = QUERY_TESTS,
-    visibility = ["//visibility:public"],
-    deps = TESTUTIL_DEPS + [
-        ":prolog-common",
-        ":testutil",
-    ],
-)
-
-junit_tests(
-    name = "server_tests",
-    size = "large",
-    srcs = glob(
-        ["src/test/java/**/*.java"],
-        exclude = TESTUTIL + CUSTOM_TRUTH_SUBJECTS + PROLOG_TESTS + PROLOG_TEST_CASE + QUERY_TESTS,
-    ),
-    resources = glob(["src/test/resources/com/google/gerrit/server/**/*"]),
-    visibility = ["//visibility:public"],
-    deps = TESTUTIL_DEPS + [
-        ":custom-truth-subjects",
-        ":prolog-common",
-        ":testutil",
-        "//gerrit-index:query_exception",
-        "//gerrit-patch-jgit:server",
-        "//gerrit-test-util:test_util",
-        "//lib:args4j",
-        "//lib:grappa",
-        "//lib:gson",
-        "//lib:guava",
-        "//lib:guava-retrying",
-        "//lib:protobuf",
-        "//lib:truth-java8-extension",
-        "//lib/bouncycastle:bcprov",
-        "//lib/bouncycastle:bcpkix",
-        "//lib/dropwizard:dropwizard-core",
-        "//lib/guice:guice-assistedinject",
-        "//lib/prolog:runtime",
-        "//lib/commons:codec",
-    ],
-)
-
-junit_tests(
-    name = "testutil_test",
-    size = "small",
-    srcs = [
-        "src/test/java/com/google/gerrit/testutil/IndexVersionsTest.java",
-    ],
-    visibility = ["//visibility:public"],
-    deps = TESTUTIL_DEPS + [
-        ":testutil",
-    ],
-)
-
-java_doc(
-    name = "doc",
-    libs = [":server"],
-    pkgs = ["com.google.gerrit"],
-    title = "Gerrit Review Server Documentation",
-)
diff --git a/gerrit-server/src/main/java/com/google/gerrit/audit/AuditEvent.java b/gerrit-server/src/main/java/com/google/gerrit/audit/AuditEvent.java
deleted file mode 100644
index 7a4e683..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/audit/AuditEvent.java
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.audit;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableListMultimap;
-import com.google.common.collect.ListMultimap;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.server.CurrentUser;
-
-public class AuditEvent {
-
-  public static final String UNKNOWN_SESSION_ID = "000000000000000000000000000";
-  protected static final ImmutableListMultimap<String, ?> EMPTY_PARAMS = ImmutableListMultimap.of();
-
-  public final String sessionId;
-  public final CurrentUser who;
-  public final long when;
-  public final String what;
-  public final ListMultimap<String, ?> params;
-  public final Object result;
-  public final long timeAtStart;
-  public final long elapsed;
-  public final UUID uuid;
-
-  @AutoValue
-  public abstract static class UUID {
-    private static UUID create() {
-      return new AutoValue_AuditEvent_UUID(
-          String.format("audit:%s", java.util.UUID.randomUUID().toString()));
-    }
-
-    public abstract String uuid();
-  }
-
-  /**
-   * Creates a new audit event with results
-   *
-   * @param sessionId session id the event belongs to
-   * @param who principal that has generated the event
-   * @param what object of the event
-   * @param when time-stamp of when the event started
-   * @param params parameters of the event
-   * @param result result of the event
-   */
-  public AuditEvent(
-      String sessionId,
-      CurrentUser who,
-      String what,
-      long when,
-      ListMultimap<String, ?> params,
-      Object result) {
-    Preconditions.checkNotNull(what, "what is a mandatory not null param !");
-
-    this.sessionId = MoreObjects.firstNonNull(sessionId, UNKNOWN_SESSION_ID);
-    this.who = who;
-    this.what = what;
-    this.when = when;
-    this.timeAtStart = this.when;
-    this.params = MoreObjects.firstNonNull(params, EMPTY_PARAMS);
-    this.uuid = UUID.create();
-    this.result = result;
-    this.elapsed = TimeUtil.nowMs() - timeAtStart;
-  }
-
-  @Override
-  public int hashCode() {
-    return uuid.hashCode();
-  }
-
-  @Override
-  public boolean equals(Object obj) {
-    if (this == obj) {
-      return true;
-    }
-    if (obj == null) {
-      return false;
-    }
-    if (getClass() != obj.getClass()) {
-      return false;
-    }
-
-    AuditEvent other = (AuditEvent) obj;
-    return this.uuid.equals(other.uuid);
-  }
-
-  @Override
-  public String toString() {
-    return String.format(
-        "AuditEvent UUID:%s, SID:%s, TS:%d, who:%s, what:%s",
-        uuid.uuid(), sessionId, when, who, what);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/audit/AuditListener.java b/gerrit-server/src/main/java/com/google/gerrit/audit/AuditListener.java
deleted file mode 100644
index 8eb8ed4..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/audit/AuditListener.java
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.audit;
-
-import com.google.gerrit.extensions.annotations.ExtensionPoint;
-
-@ExtensionPoint
-public interface AuditListener {
-
-  void onAuditableAction(AuditEvent action);
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/audit/AuditModule.java b/gerrit-server/src/main/java/com/google/gerrit/audit/AuditModule.java
deleted file mode 100644
index 404b8d3..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/audit/AuditModule.java
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.audit;
-
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.inject.AbstractModule;
-
-public class AuditModule extends AbstractModule {
-
-  @Override
-  protected void configure() {
-    DynamicSet.setOf(binder(), AuditListener.class);
-    DynamicSet.setOf(binder(), GroupMemberAuditListener.class);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/audit/AuditService.java b/gerrit-server/src/main/java/com/google/gerrit/audit/AuditService.java
deleted file mode 100644
index 0c62d11..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/audit/AuditService.java
+++ /dev/null
@@ -1,34 +0,0 @@
-// 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.
-
-package com.google.gerrit.audit;
-
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroupById;
-import com.google.gerrit.reviewdb.client.AccountGroupMember;
-import com.google.inject.ImplementedBy;
-import java.util.Collection;
-
-@ImplementedBy(AuditServiceImpl.class)
-public interface AuditService {
-  void dispatch(AuditEvent action);
-
-  void dispatchAddAccountsToGroup(Account.Id actor, Collection<AccountGroupMember> added);
-
-  void dispatchDeleteAccountsFromGroup(Account.Id actor, Collection<AccountGroupMember> removed);
-
-  void dispatchAddGroupsToGroup(Account.Id actor, Collection<AccountGroupById> added);
-
-  void dispatchDeleteGroupsFromGroup(Account.Id actor, Collection<AccountGroupById> removed);
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/audit/AuditServiceImpl.java b/gerrit-server/src/main/java/com/google/gerrit/audit/AuditServiceImpl.java
deleted file mode 100644
index 940742f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/audit/AuditServiceImpl.java
+++ /dev/null
@@ -1,94 +0,0 @@
-// 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.
-
-package com.google.gerrit.audit;
-
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroupById;
-import com.google.gerrit.reviewdb.client.AccountGroupMember;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.Collection;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class AuditServiceImpl implements AuditService {
-  private static final Logger log = LoggerFactory.getLogger(AuditServiceImpl.class);
-
-  private final DynamicSet<AuditListener> auditListeners;
-  private final DynamicSet<GroupMemberAuditListener> groupMemberAuditListeners;
-
-  @Inject
-  public AuditServiceImpl(
-      DynamicSet<AuditListener> auditListeners,
-      DynamicSet<GroupMemberAuditListener> groupMemberAuditListeners) {
-    this.auditListeners = auditListeners;
-    this.groupMemberAuditListeners = groupMemberAuditListeners;
-  }
-
-  @Override
-  public void dispatch(AuditEvent action) {
-    for (AuditListener auditListener : auditListeners) {
-      auditListener.onAuditableAction(action);
-    }
-  }
-
-  @Override
-  public void dispatchAddAccountsToGroup(Account.Id actor, Collection<AccountGroupMember> added) {
-    for (GroupMemberAuditListener auditListener : groupMemberAuditListeners) {
-      try {
-        auditListener.onAddAccountsToGroup(actor, added);
-      } catch (RuntimeException e) {
-        log.error("failed to log add accounts to group event", e);
-      }
-    }
-  }
-
-  @Override
-  public void dispatchDeleteAccountsFromGroup(
-      Account.Id actor, Collection<AccountGroupMember> removed) {
-    for (GroupMemberAuditListener auditListener : groupMemberAuditListeners) {
-      try {
-        auditListener.onDeleteAccountsFromGroup(actor, removed);
-      } catch (RuntimeException e) {
-        log.error("failed to log delete accounts from group event", e);
-      }
-    }
-  }
-
-  @Override
-  public void dispatchAddGroupsToGroup(Account.Id actor, Collection<AccountGroupById> added) {
-    for (GroupMemberAuditListener auditListener : groupMemberAuditListeners) {
-      try {
-        auditListener.onAddGroupsToGroup(actor, added);
-      } catch (RuntimeException e) {
-        log.error("failed to log add groups to group event", e);
-      }
-    }
-  }
-
-  @Override
-  public void dispatchDeleteGroupsFromGroup(
-      Account.Id actor, Collection<AccountGroupById> removed) {
-    for (GroupMemberAuditListener auditListener : groupMemberAuditListeners) {
-      try {
-        auditListener.onDeleteGroupsFromGroup(actor, removed);
-      } catch (RuntimeException e) {
-        log.error("failed to log delete groups from group event", e);
-      }
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/audit/ExtendedHttpAuditEvent.java b/gerrit-server/src/main/java/com/google/gerrit/audit/ExtendedHttpAuditEvent.java
deleted file mode 100644
index 4db8a51..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/audit/ExtendedHttpAuditEvent.java
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.audit;
-
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ListMultimap;
-import com.google.gerrit.extensions.restapi.RestResource;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.server.CurrentUser;
-import javax.servlet.http.HttpServletRequest;
-
-/** Extended audit event. Adds request, resource and view data to HttpAuditEvent. */
-public class ExtendedHttpAuditEvent extends HttpAuditEvent {
-  public final HttpServletRequest httpRequest;
-  public final RestResource resource;
-  public final RestView<? extends RestResource> view;
-
-  /**
-   * Creates a new audit event with results
-   *
-   * @param sessionId session id the event belongs to
-   * @param who principal that has generated the event
-   * @param httpRequest the HttpServletRequest
-   * @param when time-stamp of when the event started
-   * @param params parameters of the event
-   * @param input input
-   * @param status HTTP status
-   * @param result result of the event
-   * @param resource REST resource data
-   * @param view view rendering object
-   */
-  public ExtendedHttpAuditEvent(
-      String sessionId,
-      CurrentUser who,
-      HttpServletRequest httpRequest,
-      long when,
-      ListMultimap<String, ?> params,
-      Object input,
-      int status,
-      Object result,
-      RestResource resource,
-      RestView<RestResource> view) {
-    super(
-        sessionId,
-        who,
-        httpRequest.getRequestURI(),
-        when,
-        params,
-        httpRequest.getMethod(),
-        input,
-        status,
-        result);
-    this.httpRequest = Preconditions.checkNotNull(httpRequest);
-    this.resource = resource;
-    this.view = view;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/audit/GroupMemberAuditListener.java b/gerrit-server/src/main/java/com/google/gerrit/audit/GroupMemberAuditListener.java
deleted file mode 100644
index 0878499..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/audit/GroupMemberAuditListener.java
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.audit;
-
-import com.google.gerrit.extensions.annotations.ExtensionPoint;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroupById;
-import com.google.gerrit.reviewdb.client.AccountGroupMember;
-import java.util.Collection;
-
-@ExtensionPoint
-public interface GroupMemberAuditListener {
-
-  void onAddAccountsToGroup(Account.Id actor, Collection<AccountGroupMember> added);
-
-  void onDeleteAccountsFromGroup(Account.Id actor, Collection<AccountGroupMember> removed);
-
-  void onAddGroupsToGroup(Account.Id actor, Collection<AccountGroupById> added);
-
-  void onDeleteGroupsFromGroup(Account.Id actor, Collection<AccountGroupById> deleted);
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/audit/HttpAuditEvent.java b/gerrit-server/src/main/java/com/google/gerrit/audit/HttpAuditEvent.java
deleted file mode 100644
index cd19606..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/audit/HttpAuditEvent.java
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.audit;
-
-import com.google.common.collect.ListMultimap;
-import com.google.gerrit.server.CurrentUser;
-
-public class HttpAuditEvent extends AuditEvent {
-  public final String httpMethod;
-  public final int httpStatus;
-  public final Object input;
-
-  /**
-   * Creates a new audit event with results
-   *
-   * @param sessionId session id the event belongs to
-   * @param who principal that has generated the event
-   * @param what object of the event
-   * @param when time-stamp of when the event started
-   * @param params parameters of the event
-   * @param httpMethod HTTP method
-   * @param input input
-   * @param status HTTP status
-   * @param result result of the event
-   */
-  public HttpAuditEvent(
-      String sessionId,
-      CurrentUser who,
-      String what,
-      long when,
-      ListMultimap<String, ?> params,
-      String httpMethod,
-      Object input,
-      int status,
-      Object result) {
-    super(sessionId, who, what, when, params, result);
-    this.httpMethod = httpMethod;
-    this.input = input;
-    this.httpStatus = status;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/audit/RpcAuditEvent.java b/gerrit-server/src/main/java/com/google/gerrit/audit/RpcAuditEvent.java
deleted file mode 100644
index f6b955c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/audit/RpcAuditEvent.java
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.audit;
-
-import com.google.common.collect.ListMultimap;
-import com.google.gerrit.server.CurrentUser;
-
-public class RpcAuditEvent extends HttpAuditEvent {
-
-  /**
-   * Creates a new audit event with results
-   *
-   * @param sessionId session id the event belongs to
-   * @param who principal that has generated the event
-   * @param what object of the event
-   * @param when time-stamp of when the event started
-   * @param params parameters of the event
-   * @param httpMethod HTTP method
-   * @param input input
-   * @param status HTTP status
-   * @param result result of the event
-   */
-  public RpcAuditEvent(
-      String sessionId,
-      CurrentUser who,
-      String what,
-      long when,
-      ListMultimap<String, ?> params,
-      String httpMethod,
-      Object input,
-      int status,
-      Object result) {
-    super(sessionId, who, what, when, params, httpMethod, input, status, result);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/audit/SshAuditEvent.java b/gerrit-server/src/main/java/com/google/gerrit/audit/SshAuditEvent.java
deleted file mode 100644
index 98cba09..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/audit/SshAuditEvent.java
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.audit;
-
-import com.google.common.collect.ListMultimap;
-import com.google.gerrit.server.CurrentUser;
-
-public class SshAuditEvent extends AuditEvent {
-
-  public SshAuditEvent(
-      String sessionId,
-      CurrentUser who,
-      String what,
-      long when,
-      ListMultimap<String, ?> params,
-      Object result) {
-    super(sessionId, who, what, when, params, result);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/common/EventBroker.java b/gerrit-server/src/main/java/com/google/gerrit/common/EventBroker.java
deleted file mode 100644
index c58b723..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/common/EventBroker.java
+++ /dev/null
@@ -1,213 +0,0 @@
-// 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.
-
-package com.google.gerrit.common;
-
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.lifecycle.LifecycleModule;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.events.ChangeEvent;
-import com.google.gerrit.server.events.Event;
-import com.google.gerrit.server.events.ProjectEvent;
-import com.google.gerrit.server.events.RefEvent;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.ProjectPermission;
-import com.google.gerrit.server.permissions.RefPermission;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Distributes Events to listeners if they are allowed to see them */
-@Singleton
-public class EventBroker implements EventDispatcher {
-  private static final Logger log = LoggerFactory.getLogger(EventBroker.class);
-
-  public static class Module extends LifecycleModule {
-    @Override
-    protected void configure() {
-      DynamicItem.itemOf(binder(), EventDispatcher.class);
-      DynamicItem.bind(binder(), EventDispatcher.class).to(EventBroker.class);
-    }
-  }
-
-  /** Listeners to receive changes as they happen (limited by visibility of user). */
-  protected final DynamicSet<UserScopedEventListener> listeners;
-
-  /** Listeners to receive all changes as they happen. */
-  protected final DynamicSet<EventListener> unrestrictedListeners;
-
-  private final PermissionBackend permissionBackend;
-  protected final ProjectCache projectCache;
-
-  protected final ChangeNotes.Factory notesFactory;
-
-  protected final Provider<ReviewDb> dbProvider;
-
-  @Inject
-  public EventBroker(
-      DynamicSet<UserScopedEventListener> listeners,
-      DynamicSet<EventListener> unrestrictedListeners,
-      PermissionBackend permissionBackend,
-      ProjectCache projectCache,
-      ChangeNotes.Factory notesFactory,
-      Provider<ReviewDb> dbProvider) {
-    this.listeners = listeners;
-    this.unrestrictedListeners = unrestrictedListeners;
-    this.permissionBackend = permissionBackend;
-    this.projectCache = projectCache;
-    this.notesFactory = notesFactory;
-    this.dbProvider = dbProvider;
-  }
-
-  @Override
-  public void postEvent(Change change, ChangeEvent event)
-      throws OrmException, PermissionBackendException {
-    fireEvent(change, event);
-  }
-
-  @Override
-  public void postEvent(Branch.NameKey branchName, RefEvent event)
-      throws PermissionBackendException {
-    fireEvent(branchName, event);
-  }
-
-  @Override
-  public void postEvent(Project.NameKey projectName, ProjectEvent event) {
-    fireEvent(projectName, event);
-  }
-
-  @Override
-  public void postEvent(Event event) throws OrmException, PermissionBackendException {
-    fireEvent(event);
-  }
-
-  protected void fireEventForUnrestrictedListeners(Event event) {
-    for (EventListener listener : unrestrictedListeners) {
-      listener.onEvent(event);
-    }
-  }
-
-  protected void fireEvent(Change change, ChangeEvent event)
-      throws OrmException, PermissionBackendException {
-    for (UserScopedEventListener listener : listeners) {
-      if (isVisibleTo(change, listener.getUser())) {
-        listener.onEvent(event);
-      }
-    }
-    fireEventForUnrestrictedListeners(event);
-  }
-
-  protected void fireEvent(Project.NameKey project, ProjectEvent event) {
-    for (UserScopedEventListener listener : listeners) {
-      if (isVisibleTo(project, listener.getUser())) {
-        listener.onEvent(event);
-      }
-    }
-    fireEventForUnrestrictedListeners(event);
-  }
-
-  protected void fireEvent(Branch.NameKey branchName, RefEvent event)
-      throws PermissionBackendException {
-    for (UserScopedEventListener listener : listeners) {
-      if (isVisibleTo(branchName, listener.getUser())) {
-        listener.onEvent(event);
-      }
-    }
-    fireEventForUnrestrictedListeners(event);
-  }
-
-  protected void fireEvent(Event event) throws OrmException, PermissionBackendException {
-    for (UserScopedEventListener listener : listeners) {
-      if (isVisibleTo(event, listener.getUser())) {
-        listener.onEvent(event);
-      }
-    }
-    fireEventForUnrestrictedListeners(event);
-  }
-
-  protected boolean isVisibleTo(Project.NameKey project, CurrentUser user) {
-    try {
-      permissionBackend.user(user).project(project).check(ProjectPermission.ACCESS);
-      return true;
-    } catch (AuthException | PermissionBackendException e) {
-      return false;
-    }
-  }
-
-  protected boolean isVisibleTo(Change change, CurrentUser user)
-      throws OrmException, PermissionBackendException {
-    if (change == null) {
-      return false;
-    }
-    ProjectState pe = projectCache.get(change.getProject());
-    if (pe == null) {
-      return false;
-    }
-    ReviewDb db = dbProvider.get();
-    return permissionBackend
-        .user(user)
-        .change(notesFactory.createChecked(db, change))
-        .database(db)
-        .test(ChangePermission.READ);
-  }
-
-  protected boolean isVisibleTo(Branch.NameKey branchName, CurrentUser user)
-      throws PermissionBackendException {
-    ProjectState pe = projectCache.get(branchName.getParentKey());
-    if (pe == null) {
-      return false;
-    }
-    return permissionBackend.user(user).ref(branchName).test(RefPermission.READ);
-  }
-
-  protected boolean isVisibleTo(Event event, CurrentUser user)
-      throws OrmException, PermissionBackendException {
-    if (event instanceof RefEvent) {
-      RefEvent refEvent = (RefEvent) event;
-      String ref = refEvent.getRefName();
-      if (PatchSet.isChangeRef(ref)) {
-        Change.Id cid = PatchSet.Id.fromRef(ref).getParentKey();
-        try {
-          Change change =
-              notesFactory
-                  .createChecked(dbProvider.get(), refEvent.getProjectNameKey(), cid)
-                  .getChange();
-          return isVisibleTo(change, user);
-        } catch (NoSuchChangeException e) {
-          log.debug("Change {} cannot be found, falling back on ref visibility check", cid.id);
-        }
-      }
-      return isVisibleTo(refEvent.getBranchNameKey(), user);
-    } else if (event instanceof ProjectEvent) {
-      return isVisibleTo(((ProjectEvent) event).getProjectNameKey(), user);
-    }
-    return true;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/common/EventDispatcher.java b/gerrit-server/src/main/java/com/google/gerrit/common/EventDispatcher.java
deleted file mode 100644
index bfc7973..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/common/EventDispatcher.java
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.common;
-
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.events.ChangeEvent;
-import com.google.gerrit.server.events.Event;
-import com.google.gerrit.server.events.ProjectEvent;
-import com.google.gerrit.server.events.RefEvent;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-
-/** Interface for posting (dispatching) Events */
-public interface EventDispatcher {
-  /**
-   * Post a stream event that is related to a change
-   *
-   * @param change The change that the event is related to
-   * @param event The event to post
-   * @throws OrmException on failure to post the event due to DB error
-   * @throws PermissionBackendException on failure of permission checks
-   */
-  void postEvent(Change change, ChangeEvent event) throws OrmException, PermissionBackendException;
-
-  /**
-   * Post a stream event that is related to a branch
-   *
-   * @param branchName The branch that the event is related to
-   * @param event The event to post
-   * @throws PermissionBackendException on failure of permission checks
-   */
-  void postEvent(Branch.NameKey branchName, RefEvent event) throws PermissionBackendException;
-
-  /**
-   * Post a stream event that is related to a project.
-   *
-   * @param projectName The project that the event is related to.
-   * @param event The event to post.
-   */
-  void postEvent(Project.NameKey projectName, ProjectEvent event);
-
-  /**
-   * Post a stream event generically.
-   *
-   * <p>If you are creating a RefEvent or ChangeEvent from scratch, it is more efficient to use the
-   * specific postEvent methods for those use cases.
-   *
-   * @param event The event to post.
-   * @throws OrmException on failure to post the event due to DB error
-   * @throws PermissionBackendException on failure of permission checks
-   */
-  void postEvent(Event event) throws OrmException, PermissionBackendException;
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/common/EventListener.java b/gerrit-server/src/main/java/com/google/gerrit/common/EventListener.java
deleted file mode 100644
index 6cfc5eb..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/common/EventListener.java
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.common;
-
-import com.google.gerrit.extensions.annotations.ExtensionPoint;
-import com.google.gerrit.server.events.Event;
-
-/**
- * Allows to listen to events without user visibility restrictions. To listen to events visible to a
- * specific user, use {@link UserScopedEventListener}.
- */
-@ExtensionPoint
-public interface EventListener {
-  void onEvent(Event event);
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/common/FooterConstants.java b/gerrit-server/src/main/java/com/google/gerrit/common/FooterConstants.java
deleted file mode 100644
index 3ec809c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/common/FooterConstants.java
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.common;
-
-import org.eclipse.jgit.revwalk.FooterKey;
-
-public class FooterConstants {
-  /** The change ID as used to track patch sets. */
-  public static final FooterKey CHANGE_ID = new FooterKey("Change-Id");
-
-  /** The footer telling us who reviewed the change. */
-  public static final FooterKey REVIEWED_BY = new FooterKey("Reviewed-by");
-
-  /** The footer telling us the URL where the review took place. */
-  public static final FooterKey REVIEWED_ON = new FooterKey("Reviewed-on");
-
-  /** The footer telling us who tested the change. */
-  public static final FooterKey TESTED_BY = new FooterKey("Tested-by");
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/common/UserScopedEventListener.java b/gerrit-server/src/main/java/com/google/gerrit/common/UserScopedEventListener.java
deleted file mode 100644
index 3216bac..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/common/UserScopedEventListener.java
+++ /dev/null
@@ -1,26 +0,0 @@
-// 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.
-package com.google.gerrit.common;
-
-import com.google.gerrit.extensions.annotations.ExtensionPoint;
-import com.google.gerrit.server.CurrentUser;
-
-/**
- * Allows to listen to events visible to the specified user. To listen to events without user
- * visibility restrictions, use {@link EventListener}.
- */
-@ExtensionPoint
-public interface UserScopedEventListener extends EventListener {
-  CurrentUser getUser();
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/common/Version.java b/gerrit-server/src/main/java/com/google/gerrit/common/Version.java
deleted file mode 100644
index f5a63af..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/common/Version.java
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.common;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class Version {
-  private static final Logger log = LoggerFactory.getLogger(Version.class);
-  private static final String version;
-
-  public static String getVersion() {
-    return version;
-  }
-
-  static {
-    version = loadVersion();
-  }
-
-  private static String loadVersion() {
-    try (InputStream in = Version.class.getResourceAsStream("Version")) {
-      if (in == null) {
-        return "(dev)";
-      }
-      try (BufferedReader r = new BufferedReader(new InputStreamReader(in, UTF_8))) {
-        String vs = r.readLine();
-        if (vs != null && vs.startsWith("v")) {
-          vs = vs.substring(1);
-        }
-        if (vs != null && vs.isEmpty()) {
-          vs = null;
-        }
-        return vs;
-      }
-    } catch (IOException e) {
-      log.error(e.getMessage(), e);
-      return "(unknown version)";
-    }
-  }
-
-  private Version() {}
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/lifecycle/LifecycleManager.java b/gerrit-server/src/main/java/com/google/gerrit/lifecycle/LifecycleManager.java
deleted file mode 100644
index bbffd49..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/lifecycle/LifecycleManager.java
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.lifecycle;
-
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Lists;
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.gerrit.extensions.registration.RegistrationHandle;
-import com.google.inject.Binding;
-import com.google.inject.Injector;
-import com.google.inject.Provider;
-import com.google.inject.TypeLiteral;
-import com.google.inject.util.Providers;
-import java.util.List;
-import org.slf4j.LoggerFactory;
-
-/** Tracks and executes registered {@link LifecycleListener}s. */
-public class LifecycleManager {
-  private final List<Provider<LifecycleListener>> listeners = newList();
-  private final List<RegistrationHandle> handles = newList();
-
-  /** Index of the last listener to start successfully; -1 when not started. */
-  private int startedIndex = -1;
-
-  /**
-   * Add a handle that must be cleared during stop.
-   *
-   * @param handle the handle to add.
-   */
-  public void add(RegistrationHandle handle) {
-    handles.add(handle);
-  }
-
-  /**
-   * Add a single listener.
-   *
-   * @param listener the listener to add.
-   */
-  public void add(LifecycleListener listener) {
-    listeners.add(Providers.of(listener));
-  }
-
-  /**
-   * Add a single listener.
-   *
-   * @param listener the listener to add.
-   */
-  public void add(Provider<LifecycleListener> listener) {
-    listeners.add(listener);
-  }
-
-  /**
-   * Add all {@link LifecycleListener}s registered in the Injector.
-   *
-   * @param injector the injector to add.
-   */
-  public void add(Injector injector) {
-    Preconditions.checkState(startedIndex < 0, "Already started");
-    for (Binding<LifecycleListener> binding : get(injector)) {
-      add(binding.getProvider());
-    }
-  }
-
-  /**
-   * Add all {@link LifecycleListener}s registered in the Injectors.
-   *
-   * @param injectors the injectors to add.
-   */
-  public void add(Injector... injectors) {
-    for (Injector i : injectors) {
-      add(i);
-    }
-  }
-
-  /** Start all listeners, in the order they were registered. */
-  public void start() {
-    for (int i = startedIndex + 1; i < listeners.size(); i++) {
-      LifecycleListener listener = listeners.get(i).get();
-      startedIndex = i;
-      listener.start();
-    }
-  }
-
-  /** Stop all listeners, in the reverse order they were registered. */
-  public void stop() {
-    for (int i = handles.size() - 1; 0 <= i; i--) {
-      handles.get(i).remove();
-    }
-    handles.clear();
-
-    for (int i = startedIndex; 0 <= i; i--) {
-      LifecycleListener obj = listeners.get(i).get();
-      try {
-        obj.stop();
-      } catch (Throwable err) {
-        LoggerFactory.getLogger(obj.getClass()).warn("Failed to stop", err);
-      }
-      startedIndex = i - 1;
-    }
-  }
-
-  private static List<Binding<LifecycleListener>> get(Injector i) {
-    return i.findBindingsByType(new TypeLiteral<LifecycleListener>() {});
-  }
-
-  private static <T> List<T> newList() {
-    return Lists.newArrayListWithCapacity(4);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/DisabledMetricMaker.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/DisabledMetricMaker.java
deleted file mode 100644
index ea408e2..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/metrics/DisabledMetricMaker.java
+++ /dev/null
@@ -1,195 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.metrics;
-
-import com.google.gerrit.extensions.registration.RegistrationHandle;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-
-/** Exports no metrics, useful for running batch programs. */
-public class DisabledMetricMaker extends MetricMaker {
-  @Override
-  public Counter0 newCounter(String name, Description desc) {
-    return new Counter0() {
-      @Override
-      public void incrementBy(long value) {}
-
-      @Override
-      public void remove() {}
-    };
-  }
-
-  @Override
-  public <F1> Counter1<F1> newCounter(String name, Description desc, Field<F1> field1) {
-    return new Counter1<F1>() {
-      @Override
-      public void incrementBy(F1 field1, long value) {}
-
-      @Override
-      public void remove() {}
-    };
-  }
-
-  @Override
-  public <F1, F2> Counter2<F1, F2> newCounter(
-      String name, Description desc, Field<F1> field1, Field<F2> field2) {
-    return new Counter2<F1, F2>() {
-      @Override
-      public void incrementBy(F1 field1, F2 field2, long value) {}
-
-      @Override
-      public void remove() {}
-    };
-  }
-
-  @Override
-  public <F1, F2, F3> Counter3<F1, F2, F3> newCounter(
-      String name, Description desc, Field<F1> field1, Field<F2> field2, Field<F3> field3) {
-    return new Counter3<F1, F2, F3>() {
-      @Override
-      public void incrementBy(F1 field1, F2 field2, F3 field3, long value) {}
-
-      @Override
-      public void remove() {}
-    };
-  }
-
-  @Override
-  public Timer0 newTimer(String name, Description desc) {
-    return new Timer0() {
-      @Override
-      public void record(long value, TimeUnit unit) {}
-
-      @Override
-      public void remove() {}
-    };
-  }
-
-  @Override
-  public <F1> Timer1<F1> newTimer(String name, Description desc, Field<F1> field1) {
-    return new Timer1<F1>() {
-      @Override
-      public void record(F1 field1, long value, TimeUnit unit) {}
-
-      @Override
-      public void remove() {}
-    };
-  }
-
-  @Override
-  public <F1, F2> Timer2<F1, F2> newTimer(
-      String name, Description desc, Field<F1> field1, Field<F2> field2) {
-    return new Timer2<F1, F2>() {
-      @Override
-      public void record(F1 field1, F2 field2, long value, TimeUnit unit) {}
-
-      @Override
-      public void remove() {}
-    };
-  }
-
-  @Override
-  public <F1, F2, F3> Timer3<F1, F2, F3> newTimer(
-      String name, Description desc, Field<F1> field1, Field<F2> field2, Field<F3> field3) {
-    return new Timer3<F1, F2, F3>() {
-      @Override
-      public void record(F1 field1, F2 field2, F3 field3, long value, TimeUnit unit) {}
-
-      @Override
-      public void remove() {}
-    };
-  }
-
-  @Override
-  public Histogram0 newHistogram(String name, Description desc) {
-    return new Histogram0() {
-      @Override
-      public void record(long value) {}
-
-      @Override
-      public void remove() {}
-    };
-  }
-
-  @Override
-  public <F1> Histogram1<F1> newHistogram(String name, Description desc, Field<F1> field1) {
-    return new Histogram1<F1>() {
-      @Override
-      public void record(F1 field1, long value) {}
-
-      @Override
-      public void remove() {}
-    };
-  }
-
-  @Override
-  public <F1, F2> Histogram2<F1, F2> newHistogram(
-      String name, Description desc, Field<F1> field1, Field<F2> field2) {
-    return new Histogram2<F1, F2>() {
-      @Override
-      public void record(F1 field1, F2 field2, long value) {}
-
-      @Override
-      public void remove() {}
-    };
-  }
-
-  @Override
-  public <F1, F2, F3> Histogram3<F1, F2, F3> newHistogram(
-      String name, Description desc, Field<F1> field1, Field<F2> field2, Field<F3> field3) {
-    return new Histogram3<F1, F2, F3>() {
-      @Override
-      public void record(F1 field1, F2 field2, F3 field3, long value) {}
-
-      @Override
-      public void remove() {}
-    };
-  }
-
-  @Override
-  public <V> CallbackMetric0<V> newCallbackMetric(
-      String name, Class<V> valueClass, Description desc) {
-    return new CallbackMetric0<V>() {
-      @Override
-      public void set(V value) {}
-
-      @Override
-      public void remove() {}
-    };
-  }
-
-  @Override
-  public <F1, V> CallbackMetric1<F1, V> newCallbackMetric(
-      String name, Class<V> valueClass, Description desc, Field<F1> field1) {
-    return new CallbackMetric1<F1, V>() {
-      @Override
-      public void set(F1 field1, V value) {}
-
-      @Override
-      public void forceCreate(F1 field1) {}
-
-      @Override
-      public void remove() {}
-    };
-  }
-
-  @Override
-  public RegistrationHandle newTrigger(Set<CallbackMetric<?>> metrics, Runnable trigger) {
-    return new RegistrationHandle() {
-      @Override
-      public void remove() {}
-    };
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/Timer0.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/Timer0.java
deleted file mode 100644
index 55d1ddf..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/metrics/Timer0.java
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.metrics;
-
-import static java.util.concurrent.TimeUnit.NANOSECONDS;
-
-import com.google.gerrit.extensions.registration.RegistrationHandle;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Records elapsed time for an operation or span.
- *
- * <p>Typical usage in a try-with-resources block:
- *
- * <pre>
- * try (Timer0.Context ctx = timer.start()) {
- * }
- * </pre>
- */
-public abstract class Timer0 implements RegistrationHandle {
-  public static class Context extends TimerContext {
-    private final Timer0 timer;
-
-    Context(Timer0 timer) {
-      this.timer = timer;
-    }
-
-    @Override
-    public void record(long elapsed) {
-      timer.record(elapsed, NANOSECONDS);
-    }
-  }
-
-  /**
-   * Begin a timer for the current block, value will be recorded when closed.
-   *
-   * @return timer context
-   */
-  public Context start() {
-    return new Context(this);
-  }
-
-  /**
-   * Record a value in the distribution.
-   *
-   * @param value value to record
-   * @param unit time unit of the value
-   */
-  public abstract void record(long value, TimeUnit unit);
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/Timer1.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/Timer1.java
deleted file mode 100644
index f623841..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/metrics/Timer1.java
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.metrics;
-
-import static java.util.concurrent.TimeUnit.NANOSECONDS;
-
-import com.google.gerrit.extensions.registration.RegistrationHandle;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Records elapsed time for an operation or span.
- *
- * <p>Typical usage in a try-with-resources block:
- *
- * <pre>
- * try (Timer1.Context ctx = timer.start(field)) {
- * }
- * </pre>
- *
- * @param <F1> type of the field.
- */
-public abstract class Timer1<F1> implements RegistrationHandle {
-  public static class Context extends TimerContext {
-    private final Timer1<Object> timer;
-    private final Object field1;
-
-    @SuppressWarnings("unchecked")
-    <F1> Context(Timer1<F1> timer, F1 field1) {
-      this.timer = (Timer1<Object>) timer;
-      this.field1 = field1;
-    }
-
-    @Override
-    public void record(long elapsed) {
-      timer.record(field1, elapsed, NANOSECONDS);
-    }
-  }
-
-  /**
-   * Begin a timer for the current block, value will be recorded when closed.
-   *
-   * @param field1 bucket to record the timer
-   * @return timer context
-   */
-  public Context start(F1 field1) {
-    return new Context(this, field1);
-  }
-
-  /**
-   * Record a value in the distribution.
-   *
-   * @param field1 bucket to record the timer
-   * @param value value to record
-   * @param unit time unit of the value
-   */
-  public abstract void record(F1 field1, long value, TimeUnit unit);
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/Timer2.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/Timer2.java
deleted file mode 100644
index b03ff83..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/metrics/Timer2.java
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.metrics;
-
-import static java.util.concurrent.TimeUnit.NANOSECONDS;
-
-import com.google.gerrit.extensions.registration.RegistrationHandle;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Records elapsed time for an operation or span.
- *
- * <p>Typical usage in a try-with-resources block:
- *
- * <pre>
- * try (Timer2.Context ctx = timer.start(field)) {
- * }
- * </pre>
- *
- * @param <F1> type of the field.
- * @param <F2> type of the field.
- */
-public abstract class Timer2<F1, F2> implements RegistrationHandle {
-  public static class Context extends TimerContext {
-    private final Timer2<Object, Object> timer;
-    private final Object field1;
-    private final Object field2;
-
-    @SuppressWarnings("unchecked")
-    <F1, F2> Context(Timer2<F1, F2> timer, F1 field1, F2 field2) {
-      this.timer = (Timer2<Object, Object>) timer;
-      this.field1 = field1;
-      this.field2 = field2;
-    }
-
-    @Override
-    public void record(long elapsed) {
-      timer.record(field1, field2, elapsed, NANOSECONDS);
-    }
-  }
-
-  /**
-   * Begin a timer for the current block, value will be recorded when closed.
-   *
-   * @param field1 bucket to record the timer
-   * @param field2 bucket to record the timer
-   * @return timer context
-   */
-  public Context start(F1 field1, F2 field2) {
-    return new Context(this, field1, field2);
-  }
-
-  /**
-   * Record a value in the distribution.
-   *
-   * @param field1 bucket to record the timer
-   * @param field2 bucket to record the timer
-   * @param value value to record
-   * @param unit time unit of the value
-   */
-  public abstract void record(F1 field1, F2 field2, long value, TimeUnit unit);
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/Timer3.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/Timer3.java
deleted file mode 100644
index 91af42c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/metrics/Timer3.java
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.metrics;
-
-import static java.util.concurrent.TimeUnit.NANOSECONDS;
-
-import com.google.gerrit.extensions.registration.RegistrationHandle;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Records elapsed time for an operation or span.
- *
- * <p>Typical usage in a try-with-resources block:
- *
- * <pre>
- * try (Timer3.Context ctx = timer.start(field)) {
- * }
- * </pre>
- *
- * @param <F1> type of the field.
- * @param <F2> type of the field.
- * @param <F3> type of the field.
- */
-public abstract class Timer3<F1, F2, F3> implements RegistrationHandle {
-  public static class Context extends TimerContext {
-    private final Timer3<Object, Object, Object> timer;
-    private final Object field1;
-    private final Object field2;
-    private final Object field3;
-
-    @SuppressWarnings("unchecked")
-    <F1, F2, F3> Context(Timer3<F1, F2, F3> timer, F1 f1, F2 f2, F3 f3) {
-      this.timer = (Timer3<Object, Object, Object>) timer;
-      this.field1 = f1;
-      this.field2 = f2;
-      this.field3 = f3;
-    }
-
-    @Override
-    public void record(long elapsed) {
-      timer.record(field1, field2, field3, elapsed, NANOSECONDS);
-    }
-  }
-
-  /**
-   * Begin a timer for the current block, value will be recorded when closed.
-   *
-   * @param field1 bucket to record the timer
-   * @param field2 bucket to record the timer
-   * @param field3 bucket to record the timer
-   * @return timer context
-   */
-  public Context start(F1 field1, F2 field2, F3 field3) {
-    return new Context(this, field1, field2, field3);
-  }
-
-  /**
-   * Record a value in the distribution.
-   *
-   * @param field1 bucket to record the timer
-   * @param field2 bucket to record the timer
-   * @param field3 bucket to record the timer
-   * @param value value to record
-   * @param unit time unit of the value
-   */
-  public abstract void record(F1 field1, F2 field2, F3 field3, long value, TimeUnit unit);
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedCallback.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedCallback.java
deleted file mode 100644
index c7a92a3..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedCallback.java
+++ /dev/null
@@ -1,145 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.metrics.dropwizard;
-
-import com.codahale.metrics.Gauge;
-import com.codahale.metrics.Metric;
-import com.codahale.metrics.MetricRegistry;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Maps;
-import com.google.gerrit.metrics.Description;
-import com.google.gerrit.metrics.Field;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-/** Abstract callback metric broken down into buckets. */
-abstract class BucketedCallback<V> implements BucketedMetric {
-  private final DropWizardMetricMaker metrics;
-  private final MetricRegistry registry;
-  private final String name;
-  private final Description.FieldOrdering ordering;
-  protected final Field<?>[] fields;
-  private final V zero;
-  private final Map<Object, ValueGauge> cells;
-  protected volatile Runnable trigger;
-  private final Object lock = new Object();
-
-  BucketedCallback(
-      DropWizardMetricMaker metrics,
-      MetricRegistry registry,
-      String name,
-      Class<V> valueType,
-      Description desc,
-      Field<?>... fields) {
-    this.metrics = metrics;
-    this.registry = registry;
-    this.name = name;
-    this.ordering = desc.getFieldOrdering();
-    this.fields = fields;
-    this.zero = CallbackMetricImpl0.zeroFor(valueType);
-    this.cells = new ConcurrentHashMap<>();
-  }
-
-  void doRemove() {
-    for (Object key : cells.keySet()) {
-      registry.remove(submetric(key));
-    }
-    metrics.remove(name);
-  }
-
-  void doBeginSet() {
-    for (ValueGauge g : cells.values()) {
-      g.set = false;
-    }
-  }
-
-  void doPrune() {
-    Iterator<Map.Entry<Object, ValueGauge>> i = cells.entrySet().iterator();
-    while (i.hasNext()) {
-      if (!i.next().getValue().set) {
-        i.remove();
-      }
-    }
-  }
-
-  void doEndSet() {
-    for (ValueGauge g : cells.values()) {
-      if (!g.set) {
-        g.value = zero;
-      }
-    }
-  }
-
-  ValueGauge getOrCreate(Object f1, Object f2) {
-    return getOrCreate(ImmutableList.of(f1, f2));
-  }
-
-  ValueGauge getOrCreate(Object f1, Object f2, Object f3) {
-    return getOrCreate(ImmutableList.of(f1, f2, f3));
-  }
-
-  ValueGauge getOrCreate(Object key) {
-    ValueGauge c = cells.get(key);
-    if (c != null) {
-      return c;
-    }
-
-    synchronized (lock) {
-      c = cells.get(key);
-      if (c == null) {
-        c = new ValueGauge();
-        registry.register(submetric(key), c);
-        cells.put(key, c);
-      }
-      return c;
-    }
-  }
-
-  private String submetric(Object key) {
-    return DropWizardMetricMaker.name(ordering, name, name(key));
-  }
-
-  abstract String name(Object key);
-
-  @Override
-  public Metric getTotal() {
-    return null;
-  }
-
-  @Override
-  public Field<?>[] getFields() {
-    return fields;
-  }
-
-  @Override
-  public Map<Object, Metric> getCells() {
-    return Maps.transformValues(cells, in -> (Metric) in);
-  }
-
-  final class ValueGauge implements Gauge<V> {
-    volatile V value = zero;
-    boolean set;
-
-    @Override
-    public V getValue() {
-      Runnable t = trigger;
-      if (t != null) {
-        t.run();
-      }
-      return value;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedTimer.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedTimer.java
deleted file mode 100644
index 3b19a62..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedTimer.java
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.metrics.dropwizard;
-
-import com.codahale.metrics.Metric;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Maps;
-import com.google.gerrit.metrics.Description;
-import com.google.gerrit.metrics.Field;
-import com.google.gerrit.metrics.dropwizard.DropWizardMetricMaker.TimerImpl;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-/** Abstract timer broken down into buckets by {@link Field} values. */
-abstract class BucketedTimer implements BucketedMetric {
-  private final DropWizardMetricMaker metrics;
-  private final String name;
-  private final Description.FieldOrdering ordering;
-  protected final Field<?>[] fields;
-  protected final TimerImpl total;
-  private final Map<Object, TimerImpl> cells;
-  private final Object lock = new Object();
-
-  BucketedTimer(DropWizardMetricMaker metrics, String name, Description desc, Field<?>... fields) {
-    this.metrics = metrics;
-    this.name = name;
-    this.ordering = desc.getFieldOrdering();
-    this.fields = fields;
-    this.total = metrics.newTimerImpl(name + "_total");
-    this.cells = new ConcurrentHashMap<>();
-  }
-
-  void doRemove() {
-    for (TimerImpl c : cells.values()) {
-      c.remove();
-    }
-    total.remove();
-    metrics.remove(name);
-  }
-
-  TimerImpl forceCreate(Object f1, Object f2) {
-    return forceCreate(ImmutableList.of(f1, f2));
-  }
-
-  TimerImpl forceCreate(Object f1, Object f2, Object f3) {
-    return forceCreate(ImmutableList.of(f1, f2, f3));
-  }
-
-  TimerImpl forceCreate(Object key) {
-    TimerImpl c = cells.get(key);
-    if (c != null) {
-      return c;
-    }
-
-    synchronized (lock) {
-      c = cells.get(key);
-      if (c == null) {
-        c = metrics.newTimerImpl(submetric(key));
-        cells.put(key, c);
-      }
-      return c;
-    }
-  }
-
-  private String submetric(Object key) {
-    return DropWizardMetricMaker.name(ordering, name, name(key));
-  }
-
-  abstract String name(Object key);
-
-  @Override
-  public Metric getTotal() {
-    return total.metric;
-  }
-
-  @Override
-  public Field<?>[] getFields() {
-    return fields;
-  }
-
-  @Override
-  public Map<Object, Metric> getCells() {
-    return Maps.transformValues(cells, t -> t.metric);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/DropWizardMetricMaker.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/DropWizardMetricMaker.java
deleted file mode 100644
index fc53ee7..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/DropWizardMetricMaker.java
+++ /dev/null
@@ -1,437 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.metrics.dropwizard;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.gerrit.metrics.dropwizard.MetricResource.METRIC_KIND;
-import static com.google.gerrit.server.config.ConfigResource.CONFIG_KIND;
-
-import com.codahale.metrics.Metric;
-import com.codahale.metrics.MetricRegistry;
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.registration.RegistrationHandle;
-import com.google.gerrit.extensions.restapi.RestApiModule;
-import com.google.gerrit.metrics.CallbackMetric;
-import com.google.gerrit.metrics.CallbackMetric0;
-import com.google.gerrit.metrics.CallbackMetric1;
-import com.google.gerrit.metrics.Counter0;
-import com.google.gerrit.metrics.Counter1;
-import com.google.gerrit.metrics.Counter2;
-import com.google.gerrit.metrics.Counter3;
-import com.google.gerrit.metrics.Description;
-import com.google.gerrit.metrics.Description.FieldOrdering;
-import com.google.gerrit.metrics.Field;
-import com.google.gerrit.metrics.Histogram0;
-import com.google.gerrit.metrics.Histogram1;
-import com.google.gerrit.metrics.Histogram2;
-import com.google.gerrit.metrics.Histogram3;
-import com.google.gerrit.metrics.MetricMaker;
-import com.google.gerrit.metrics.Timer0;
-import com.google.gerrit.metrics.Timer1;
-import com.google.gerrit.metrics.Timer2;
-import com.google.gerrit.metrics.Timer3;
-import com.google.gerrit.metrics.proc.JGitMetricModule;
-import com.google.gerrit.metrics.proc.ProcMetricModule;
-import com.google.gerrit.server.cache.CacheMetrics;
-import com.google.inject.Inject;
-import com.google.inject.Scopes;
-import com.google.inject.Singleton;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.TimeUnit;
-import java.util.regex.Pattern;
-
-/**
- * Connects Gerrit metric package onto DropWizard.
- *
- * @see <a href="http://www.dropwizard.io/">DropWizard</a>
- */
-@Singleton
-public class DropWizardMetricMaker extends MetricMaker {
-  public static class ApiModule extends RestApiModule {
-    @Override
-    protected void configure() {
-      bind(MetricRegistry.class).in(Scopes.SINGLETON);
-      bind(DropWizardMetricMaker.class).in(Scopes.SINGLETON);
-      bind(MetricMaker.class).to(DropWizardMetricMaker.class);
-
-      install(new ProcMetricModule());
-      install(new JGitMetricModule());
-    }
-  }
-
-  public static class RestModule extends RestApiModule {
-    @Override
-    protected void configure() {
-      DynamicMap.mapOf(binder(), METRIC_KIND);
-      child(CONFIG_KIND, "metrics").to(MetricsCollection.class);
-      get(METRIC_KIND).to(GetMetric.class);
-      bind(CacheMetrics.class);
-    }
-  }
-
-  private final MetricRegistry registry;
-  private final Map<String, BucketedMetric> bucketed;
-  private final Map<String, ImmutableMap<String, String>> descriptions;
-
-  @Inject
-  DropWizardMetricMaker(MetricRegistry registry) {
-    this.registry = registry;
-    this.bucketed = new ConcurrentHashMap<>();
-    this.descriptions = new ConcurrentHashMap<>();
-  }
-
-  Iterable<String> getMetricNames() {
-    return descriptions.keySet();
-  }
-
-  /** Get the underlying metric implementation. */
-  public Metric getMetric(String name) {
-    Metric m = bucketed.get(name);
-    return m != null ? m : registry.getMetrics().get(name);
-  }
-
-  /** Lookup annotations from a metric's {@link Description}. */
-  public ImmutableMap<String, String> getAnnotations(String name) {
-    return descriptions.get(name);
-  }
-
-  @Override
-  public synchronized Counter0 newCounter(String name, Description desc) {
-    checkCounterDescription(name, desc);
-    define(name, desc);
-    return newCounterImpl(name, desc.isRate());
-  }
-
-  @Override
-  public synchronized <F1> Counter1<F1> newCounter(
-      String name, Description desc, Field<F1> field1) {
-    checkCounterDescription(name, desc);
-    CounterImpl1<F1> m = new CounterImpl1<>(this, name, desc, field1);
-    define(name, desc);
-    bucketed.put(name, m);
-    return m.counter();
-  }
-
-  @Override
-  public synchronized <F1, F2> Counter2<F1, F2> newCounter(
-      String name, Description desc, Field<F1> field1, Field<F2> field2) {
-    checkCounterDescription(name, desc);
-    CounterImplN m = new CounterImplN(this, name, desc, field1, field2);
-    define(name, desc);
-    bucketed.put(name, m);
-    return m.counter2();
-  }
-
-  @Override
-  public synchronized <F1, F2, F3> Counter3<F1, F2, F3> newCounter(
-      String name, Description desc, Field<F1> field1, Field<F2> field2, Field<F3> field3) {
-    checkCounterDescription(name, desc);
-    CounterImplN m = new CounterImplN(this, name, desc, field1, field2, field3);
-    define(name, desc);
-    bucketed.put(name, m);
-    return m.counter3();
-  }
-
-  private static void checkCounterDescription(String name, Description desc) {
-    checkMetricName(name);
-    checkArgument(!desc.isConstant(), "counter must not be constant");
-    checkArgument(!desc.isGauge(), "counter must not be gauge");
-  }
-
-  CounterImpl newCounterImpl(String name, boolean isRate) {
-    if (isRate) {
-      final com.codahale.metrics.Meter m = registry.meter(name);
-      return new CounterImpl(name, m) {
-        @Override
-        public void incrementBy(long delta) {
-          checkArgument(delta >= 0, "counter delta must be >= 0");
-          m.mark(delta);
-        }
-      };
-    }
-    final com.codahale.metrics.Counter m = registry.counter(name);
-    return new CounterImpl(name, m) {
-      @Override
-      public void incrementBy(long delta) {
-        checkArgument(delta >= 0, "counter delta must be >= 0");
-        m.inc(delta);
-      }
-    };
-  }
-
-  @Override
-  public synchronized Timer0 newTimer(String name, Description desc) {
-    checkTimerDescription(name, desc);
-    define(name, desc);
-    return newTimerImpl(name);
-  }
-
-  @Override
-  public synchronized <F1> Timer1<F1> newTimer(String name, Description desc, Field<F1> field1) {
-    checkTimerDescription(name, desc);
-    TimerImpl1<F1> m = new TimerImpl1<>(this, name, desc, field1);
-    define(name, desc);
-    bucketed.put(name, m);
-    return m.timer();
-  }
-
-  @Override
-  public synchronized <F1, F2> Timer2<F1, F2> newTimer(
-      String name, Description desc, Field<F1> field1, Field<F2> field2) {
-    checkTimerDescription(name, desc);
-    TimerImplN m = new TimerImplN(this, name, desc, field1, field2);
-    define(name, desc);
-    bucketed.put(name, m);
-    return m.timer2();
-  }
-
-  @Override
-  public synchronized <F1, F2, F3> Timer3<F1, F2, F3> newTimer(
-      String name, Description desc, Field<F1> field1, Field<F2> field2, Field<F3> field3) {
-    checkTimerDescription(name, desc);
-    TimerImplN m = new TimerImplN(this, name, desc, field1, field2, field3);
-    define(name, desc);
-    bucketed.put(name, m);
-    return m.timer3();
-  }
-
-  private static void checkTimerDescription(String name, Description desc) {
-    checkMetricName(name);
-    checkArgument(!desc.isConstant(), "timer must not be constant");
-    checkArgument(!desc.isGauge(), "timer must not be a gauge");
-    checkArgument(!desc.isRate(), "timer must not be a rate");
-    checkArgument(desc.isCumulative(), "timer must be cumulative");
-    checkArgument(desc.getTimeUnit() != null, "timer must have a unit");
-  }
-
-  TimerImpl newTimerImpl(String name) {
-    return new TimerImpl(name, registry.timer(name));
-  }
-
-  @Override
-  public synchronized Histogram0 newHistogram(String name, Description desc) {
-    checkHistogramDescription(name, desc);
-    define(name, desc);
-    return newHistogramImpl(name);
-  }
-
-  @Override
-  public synchronized <F1> Histogram1<F1> newHistogram(
-      String name, Description desc, Field<F1> field1) {
-    checkHistogramDescription(name, desc);
-    HistogramImpl1<F1> m = new HistogramImpl1<>(this, name, desc, field1);
-    define(name, desc);
-    bucketed.put(name, m);
-    return m.histogram1();
-  }
-
-  @Override
-  public synchronized <F1, F2> Histogram2<F1, F2> newHistogram(
-      String name, Description desc, Field<F1> field1, Field<F2> field2) {
-    checkHistogramDescription(name, desc);
-    HistogramImplN m = new HistogramImplN(this, name, desc, field1, field2);
-    define(name, desc);
-    bucketed.put(name, m);
-    return m.histogram2();
-  }
-
-  @Override
-  public synchronized <F1, F2, F3> Histogram3<F1, F2, F3> newHistogram(
-      String name, Description desc, Field<F1> field1, Field<F2> field2, Field<F3> field3) {
-    checkHistogramDescription(name, desc);
-    HistogramImplN m = new HistogramImplN(this, name, desc, field1, field2, field3);
-    define(name, desc);
-    bucketed.put(name, m);
-    return m.histogram3();
-  }
-
-  private static void checkHistogramDescription(String name, Description desc) {
-    checkMetricName(name);
-    checkArgument(!desc.isConstant(), "histogram must not be constant");
-    checkArgument(!desc.isGauge(), "histogram must not be a gauge");
-    checkArgument(!desc.isRate(), "histogram must not be a rate");
-    checkArgument(desc.isCumulative(), "histogram must be cumulative");
-  }
-
-  HistogramImpl newHistogramImpl(String name) {
-    return new HistogramImpl(name, registry.histogram(name));
-  }
-
-  @Override
-  public <V> CallbackMetric0<V> newCallbackMetric(
-      String name, Class<V> valueClass, Description desc) {
-    checkMetricName(name);
-    define(name, desc);
-    return new CallbackMetricImpl0<>(this, registry, name, valueClass);
-  }
-
-  @Override
-  public <F1, V> CallbackMetric1<F1, V> newCallbackMetric(
-      String name, Class<V> valueClass, Description desc, Field<F1> field1) {
-    checkMetricName(name);
-    CallbackMetricImpl1<F1, V> m =
-        new CallbackMetricImpl1<>(this, registry, name, valueClass, desc, field1);
-    define(name, desc);
-    bucketed.put(name, m);
-    return m.create();
-  }
-
-  @Override
-  public synchronized RegistrationHandle newTrigger(
-      Set<CallbackMetric<?>> metrics, Runnable trigger) {
-    ImmutableSet<CallbackMetricGlue> all =
-        FluentIterable.from(metrics).transform(m -> (CallbackMetricGlue) m).toSet();
-
-    trigger = new CallbackGroup(trigger, all);
-    for (CallbackMetricGlue m : all) {
-      m.register(trigger);
-    }
-    trigger.run();
-
-    return new RegistrationHandle() {
-      @Override
-      public void remove() {
-        for (CallbackMetricGlue m : all) {
-          m.remove();
-        }
-      }
-    };
-  }
-
-  synchronized void remove(String name) {
-    bucketed.remove(name);
-    descriptions.remove(name);
-  }
-
-  private synchronized void define(String name, Description desc) {
-    if (descriptions.containsKey(name)) {
-      ImmutableMap<String, String> annotations = descriptions.get(name);
-      if (!desc.getAnnotations()
-          .get(Description.DESCRIPTION)
-          .equals(annotations.get(Description.DESCRIPTION))) {
-        throw new IllegalStateException(String.format("metric '%s' already defined", name));
-      }
-    } else {
-      descriptions.put(name, desc.getAnnotations());
-    }
-  }
-
-  private static final Pattern METRIC_NAME_PATTERN =
-      Pattern.compile("[a-zA-Z0-9_-]+(/[a-zA-Z0-9_-]+)*");
-
-  private static void checkMetricName(String name) {
-    checkArgument(
-        METRIC_NAME_PATTERN.matcher(name).matches(),
-        "invalid metric name '%s': must match pattern '%s'",
-        name,
-        METRIC_NAME_PATTERN.pattern());
-  }
-
-  @Override
-  public String sanitizeMetricName(String name) {
-    if (METRIC_NAME_PATTERN.matcher(name).matches()) {
-      return name;
-    }
-
-    String first = name.substring(0, 1).replaceFirst("[^\\w-]", "_");
-    if (name.length() == 1) {
-      return first;
-    }
-
-    String result = first + name.substring(1).replaceAll("/[/]+", "/").replaceAll("[^\\w-/]", "_");
-
-    if (result.endsWith("/")) {
-      result = result.substring(0, result.length() - 1);
-    }
-
-    return result;
-  }
-
-  static String name(Description.FieldOrdering ordering, String codeName, String fieldValues) {
-    if (ordering == FieldOrdering.PREFIX_FIELDS_BASENAME) {
-      int s = codeName.lastIndexOf('/');
-      if (s > 0) {
-        String prefix = codeName.substring(0, s);
-        String metric = codeName.substring(s + 1);
-        return prefix + '/' + fieldValues + '/' + metric;
-      }
-    }
-    return codeName + '/' + fieldValues;
-  }
-
-  abstract class CounterImpl extends Counter0 {
-    private final String name;
-    final Metric metric;
-
-    CounterImpl(String name, Metric metric) {
-      this.name = name;
-      this.metric = metric;
-    }
-
-    @Override
-    public void remove() {
-      descriptions.remove(name);
-      registry.remove(name);
-    }
-  }
-
-  class TimerImpl extends Timer0 {
-    private final String name;
-    final com.codahale.metrics.Timer metric;
-
-    private TimerImpl(String name, com.codahale.metrics.Timer metric) {
-      this.name = name;
-      this.metric = metric;
-    }
-
-    @Override
-    public void record(long value, TimeUnit unit) {
-      checkArgument(value >= 0, "timer delta must be >= 0");
-      metric.update(value, unit);
-    }
-
-    @Override
-    public void remove() {
-      descriptions.remove(name);
-      registry.remove(name);
-    }
-  }
-
-  class HistogramImpl extends Histogram0 {
-    private final String name;
-    final com.codahale.metrics.Histogram metric;
-
-    private HistogramImpl(String name, com.codahale.metrics.Histogram metric) {
-      this.name = name;
-      this.metric = metric;
-    }
-
-    @Override
-    public void record(long value) {
-      metric.update(value);
-    }
-
-    @Override
-    public void remove() {
-      descriptions.remove(name);
-      registry.remove(name);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/GetMetric.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/GetMetric.java
deleted file mode 100644
index f0ae97e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/GetMetric.java
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.metrics.dropwizard;
-
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.inject.Inject;
-import org.kohsuke.args4j.Option;
-
-class GetMetric implements RestReadView<MetricResource> {
-  private final PermissionBackend permissionBackend;
-  private final CurrentUser user;
-  private final DropWizardMetricMaker metrics;
-
-  @Option(name = "--data-only", usage = "return only values")
-  boolean dataOnly;
-
-  @Inject
-  GetMetric(PermissionBackend permissionBackend, CurrentUser user, DropWizardMetricMaker metrics) {
-    this.permissionBackend = permissionBackend;
-    this.user = user;
-    this.metrics = metrics;
-  }
-
-  @Override
-  public MetricJson apply(MetricResource resource)
-      throws AuthException, PermissionBackendException {
-    permissionBackend.user(user).check(GlobalPermission.VIEW_CACHES);
-    return new MetricJson(
-        resource.getMetric(), metrics.getAnnotations(resource.getName()), dataOnly);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/ListMetrics.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/ListMetrics.java
deleted file mode 100644
index 012894d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/ListMetrics.java
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.metrics.dropwizard;
-
-import com.codahale.metrics.Metric;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.config.ConfigResource;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.inject.Inject;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.SortedMap;
-import java.util.TreeMap;
-import org.kohsuke.args4j.Option;
-
-class ListMetrics implements RestReadView<ConfigResource> {
-  private final PermissionBackend permissionBackend;
-  private final CurrentUser user;
-  private final DropWizardMetricMaker metrics;
-
-  @Option(name = "--data-only", usage = "return only values")
-  boolean dataOnly;
-
-  @Option(
-      name = "--prefix",
-      aliases = {"-p"},
-      metaVar = "PREFIX",
-      usage = "match metric by exact match or prefix")
-  List<String> query = new ArrayList<>();
-
-  @Inject
-  ListMetrics(
-      PermissionBackend permissionBackend, CurrentUser user, DropWizardMetricMaker metrics) {
-    this.permissionBackend = permissionBackend;
-    this.user = user;
-    this.metrics = metrics;
-  }
-
-  @Override
-  public Map<String, MetricJson> apply(ConfigResource resource)
-      throws AuthException, PermissionBackendException {
-    permissionBackend.user(user).check(GlobalPermission.VIEW_CACHES);
-
-    SortedMap<String, MetricJson> out = new TreeMap<>();
-    List<String> prefixes = new ArrayList<>(query.size());
-    for (String q : query) {
-      if (q.endsWith("/")) {
-        prefixes.add(q);
-      } else {
-        Metric m = metrics.getMetric(q);
-        if (m != null) {
-          out.put(q, toJson(q, m));
-        }
-      }
-    }
-
-    if (query.isEmpty() || !prefixes.isEmpty()) {
-      for (String name : metrics.getMetricNames()) {
-        if (include(prefixes, name)) {
-          out.put(name, toJson(name, metrics.getMetric(name)));
-        }
-      }
-    }
-
-    return out;
-  }
-
-  private MetricJson toJson(String q, Metric m) {
-    return new MetricJson(m, metrics.getAnnotations(q), dataOnly);
-  }
-
-  private static boolean include(List<String> prefixes, String name) {
-    if (prefixes.isEmpty()) {
-      return true;
-    }
-    for (String p : prefixes) {
-      if (name.startsWith(p)) {
-        return true;
-      }
-    }
-    return false;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/MetricsCollection.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/MetricsCollection.java
deleted file mode 100644
index 6abf17c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/MetricsCollection.java
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.metrics.dropwizard;
-
-import com.codahale.metrics.Metric;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ChildCollection;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.config.ConfigResource;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-
-@Singleton
-class MetricsCollection implements ChildCollection<ConfigResource, MetricResource> {
-  private final DynamicMap<RestView<MetricResource>> views;
-  private final Provider<ListMetrics> list;
-  private final PermissionBackend permissionBackend;
-  private final Provider<CurrentUser> user;
-  private final DropWizardMetricMaker metrics;
-
-  @Inject
-  MetricsCollection(
-      DynamicMap<RestView<MetricResource>> views,
-      Provider<ListMetrics> list,
-      PermissionBackend permissionBackend,
-      Provider<CurrentUser> user,
-      DropWizardMetricMaker metrics) {
-    this.views = views;
-    this.list = list;
-    this.permissionBackend = permissionBackend;
-    this.user = user;
-    this.metrics = metrics;
-  }
-
-  @Override
-  public DynamicMap<RestView<MetricResource>> views() {
-    return views;
-  }
-
-  @Override
-  public RestView<ConfigResource> list() {
-    return list.get();
-  }
-
-  @Override
-  public MetricResource parse(ConfigResource parent, IdString id)
-      throws ResourceNotFoundException, AuthException, PermissionBackendException {
-    permissionBackend.user(user).check(GlobalPermission.VIEW_CACHES);
-
-    Metric metric = metrics.getMetric(id.get());
-    if (metric == null) {
-      throw new ResourceNotFoundException(id.get());
-    }
-    return new MetricResource(id.get(), metric);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/TimerImpl1.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/TimerImpl1.java
deleted file mode 100644
index fe6f70e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/TimerImpl1.java
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.metrics.dropwizard;
-
-import com.google.common.base.Function;
-import com.google.gerrit.metrics.Description;
-import com.google.gerrit.metrics.Field;
-import com.google.gerrit.metrics.Timer1;
-import java.util.concurrent.TimeUnit;
-
-/** Optimized version of {@link BucketedTimer} for single dimension. */
-class TimerImpl1<F1> extends BucketedTimer implements BucketedMetric {
-  TimerImpl1(DropWizardMetricMaker metrics, String name, Description desc, Field<F1> field1) {
-    super(metrics, name, desc, field1);
-  }
-
-  Timer1<F1> timer() {
-    return new Timer1<F1>() {
-      @Override
-      public void record(F1 field1, long value, TimeUnit unit) {
-        total.record(value, unit);
-        forceCreate(field1).record(value, unit);
-      }
-
-      @Override
-      public void remove() {
-        doRemove();
-      }
-    };
-  }
-
-  @Override
-  String name(Object field1) {
-    @SuppressWarnings("unchecked")
-    Function<Object, String> fmt = (Function<Object, String>) fields[0].formatter();
-
-    return fmt.apply(field1).replace('/', '-');
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/TimerImplN.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/TimerImplN.java
deleted file mode 100644
index 43cc290..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/TimerImplN.java
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.metrics.dropwizard;
-
-import com.google.common.base.Function;
-import com.google.common.base.Joiner;
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.metrics.Description;
-import com.google.gerrit.metrics.Field;
-import com.google.gerrit.metrics.Timer2;
-import com.google.gerrit.metrics.Timer3;
-import java.util.concurrent.TimeUnit;
-
-/** Generalized implementation of N-dimensional timer metrics. */
-class TimerImplN extends BucketedTimer implements BucketedMetric {
-  TimerImplN(DropWizardMetricMaker metrics, String name, Description desc, Field<?>... fields) {
-    super(metrics, name, desc, fields);
-  }
-
-  <F1, F2> Timer2<F1, F2> timer2() {
-    return new Timer2<F1, F2>() {
-      @Override
-      public void record(F1 field1, F2 field2, long value, TimeUnit unit) {
-        total.record(value, unit);
-        forceCreate(field1, field2).record(value, unit);
-      }
-
-      @Override
-      public void remove() {
-        doRemove();
-      }
-    };
-  }
-
-  <F1, F2, F3> Timer3<F1, F2, F3> timer3() {
-    return new Timer3<F1, F2, F3>() {
-      @Override
-      public void record(F1 field1, F2 field2, F3 field3, long value, TimeUnit unit) {
-        total.record(value, unit);
-        forceCreate(field1, field2, field3).record(value, unit);
-      }
-
-      @Override
-      public void remove() {
-        doRemove();
-      }
-    };
-  }
-
-  @SuppressWarnings("unchecked")
-  @Override
-  String name(Object key) {
-    ImmutableList<Object> keyList = (ImmutableList<Object>) key;
-    String[] parts = new String[fields.length];
-    for (int i = 0; i < fields.length; i++) {
-      Function<Object, String> fmt = (Function<Object, String>) fields[i].formatter();
-
-      parts[i] = fmt.apply(keyList.get(i)).replace('/', '-');
-    }
-    return Joiner.on('/').join(parts);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/proc/JGitMetricModule.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/proc/JGitMetricModule.java
deleted file mode 100644
index c3eb39f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/metrics/proc/JGitMetricModule.java
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.metrics.proc;
-
-import com.google.common.base.Supplier;
-import com.google.gerrit.metrics.Description;
-import com.google.gerrit.metrics.Description.Units;
-import com.google.gerrit.metrics.MetricMaker;
-import org.eclipse.jgit.internal.storage.file.WindowCacheStatAccessor;
-
-public class JGitMetricModule extends MetricModule {
-  @Override
-  protected void configure(MetricMaker metrics) {
-    metrics.newCallbackMetric(
-        "jgit/block_cache/cache_used",
-        Long.class,
-        new Description("Bytes of memory retained in JGit block cache.")
-            .setGauge()
-            .setUnit(Units.BYTES),
-        new Supplier<Long>() {
-          @Override
-          public Long get() {
-            return WindowCacheStatAccessor.getOpenBytes();
-          }
-        });
-
-    metrics.newCallbackMetric(
-        "jgit/block_cache/open_files",
-        Integer.class,
-        new Description("File handles held open by JGit block cache.").setGauge().setUnit("fds"),
-        new Supplier<Integer>() {
-          @Override
-          public Integer get() {
-            return WindowCacheStatAccessor.getOpenFiles();
-          }
-        });
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/proc/OperatingSystemMXBeanProvider.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/proc/OperatingSystemMXBeanProvider.java
deleted file mode 100644
index bc2846a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/metrics/proc/OperatingSystemMXBeanProvider.java
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.metrics.proc;
-
-import java.lang.management.ManagementFactory;
-import java.lang.management.OperatingSystemMXBean;
-import java.lang.reflect.Method;
-import java.util.Arrays;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-class OperatingSystemMXBeanProvider {
-  private static final Logger log = LoggerFactory.getLogger(OperatingSystemMXBeanProvider.class);
-
-  private final OperatingSystemMXBean sys;
-  private final Method getProcessCpuTime;
-  private final Method getOpenFileDescriptorCount;
-
-  static class Factory {
-    static OperatingSystemMXBeanProvider create() {
-      OperatingSystemMXBean sys = ManagementFactory.getOperatingSystemMXBean();
-      for (String name :
-          Arrays.asList(
-              "com.sun.management.UnixOperatingSystemMXBean",
-              "com.ibm.lang.management.UnixOperatingSystemMXBean")) {
-        try {
-          Class<?> impl = Class.forName(name);
-          if (impl.isInstance(sys)) {
-            return new OperatingSystemMXBeanProvider(sys);
-          }
-        } catch (ReflectiveOperationException e) {
-          log.debug("No implementation for {}", name, e);
-        }
-      }
-      log.warn("No implementation of UnixOperatingSystemMXBean found");
-      return null;
-    }
-  }
-
-  private OperatingSystemMXBeanProvider(OperatingSystemMXBean sys)
-      throws ReflectiveOperationException {
-    this.sys = sys;
-    getProcessCpuTime = sys.getClass().getMethod("getProcessCpuTime", new Class<?>[] {});
-    getProcessCpuTime.setAccessible(true);
-    getOpenFileDescriptorCount =
-        sys.getClass().getMethod("getOpenFileDescriptorCount", new Class<?>[] {});
-    getOpenFileDescriptorCount.setAccessible(true);
-  }
-
-  public long getProcessCpuTime() {
-    try {
-      return (long) getProcessCpuTime.invoke(sys, new Object[] {});
-    } catch (ReflectiveOperationException e) {
-      return -1;
-    }
-  }
-
-  public long getOpenFileDescriptorCount() {
-    try {
-      return (long) getOpenFileDescriptorCount.invoke(sys, new Object[] {});
-    } catch (ReflectiveOperationException e) {
-      return -1;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/proc/ProcMetricModule.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/proc/ProcMetricModule.java
deleted file mode 100644
index 8978e99..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/metrics/proc/ProcMetricModule.java
+++ /dev/null
@@ -1,209 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.metrics.proc;
-
-import com.google.common.base.Strings;
-import com.google.common.base.Supplier;
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.common.Version;
-import com.google.gerrit.metrics.CallbackMetric;
-import com.google.gerrit.metrics.CallbackMetric0;
-import com.google.gerrit.metrics.CallbackMetric1;
-import com.google.gerrit.metrics.Description;
-import com.google.gerrit.metrics.Description.Units;
-import com.google.gerrit.metrics.Field;
-import com.google.gerrit.metrics.MetricMaker;
-import java.lang.management.GarbageCollectorMXBean;
-import java.lang.management.ManagementFactory;
-import java.lang.management.MemoryMXBean;
-import java.lang.management.MemoryUsage;
-import java.lang.management.ThreadMXBean;
-import java.util.concurrent.TimeUnit;
-
-public class ProcMetricModule extends MetricModule {
-  @Override
-  protected void configure(MetricMaker metrics) {
-    buildLabel(metrics);
-    procUptime(metrics);
-    procCpuUsage(metrics);
-    procJvmGc(metrics);
-    procJvmMemory(metrics);
-    procJvmThread(metrics);
-  }
-
-  private void buildLabel(MetricMaker metrics) {
-    metrics.newConstantMetric(
-        "build/label",
-        Strings.nullToEmpty(Version.getVersion()),
-        new Description("Version of Gerrit server software"));
-  }
-
-  private void procUptime(MetricMaker metrics) {
-    metrics.newConstantMetric(
-        "proc/birth_timestamp",
-        Long.valueOf(TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis())),
-        new Description("Time at which the process started").setUnit(Units.MICROSECONDS));
-
-    metrics.newCallbackMetric(
-        "proc/uptime",
-        Long.class,
-        new Description("Uptime of this process").setUnit(Units.MILLISECONDS),
-        new Supplier<Long>() {
-          @Override
-          public Long get() {
-            return ManagementFactory.getRuntimeMXBean().getUptime();
-          }
-        });
-  }
-
-  private void procCpuUsage(MetricMaker metrics) {
-    final OperatingSystemMXBeanProvider provider = OperatingSystemMXBeanProvider.Factory.create();
-
-    if (provider == null) {
-      return;
-    }
-
-    if (provider.getProcessCpuTime() != -1) {
-      metrics.newCallbackMetric(
-          "proc/cpu/usage",
-          Double.class,
-          new Description("CPU time used by the process").setCumulative().setUnit(Units.SECONDS),
-          new Supplier<Double>() {
-            @Override
-            public Double get() {
-              return provider.getProcessCpuTime() / 1e9;
-            }
-          });
-    }
-
-    if (provider.getOpenFileDescriptorCount() != -1) {
-      metrics.newCallbackMetric(
-          "proc/num_open_fds",
-          Long.class,
-          new Description("Number of open file descriptors").setGauge().setUnit("fds"),
-          new Supplier<Long>() {
-            @Override
-            public Long get() {
-              return provider.getOpenFileDescriptorCount();
-            }
-          });
-    }
-  }
-
-  private void procJvmMemory(MetricMaker metrics) {
-    CallbackMetric0<Long> heapCommitted =
-        metrics.newCallbackMetric(
-            "proc/jvm/memory/heap_committed",
-            Long.class,
-            new Description("Amount of memory guaranteed for user objects.")
-                .setGauge()
-                .setUnit(Units.BYTES));
-
-    CallbackMetric0<Long> heapUsed =
-        metrics.newCallbackMetric(
-            "proc/jvm/memory/heap_used",
-            Long.class,
-            new Description("Amount of memory holding user objects.")
-                .setGauge()
-                .setUnit(Units.BYTES));
-
-    CallbackMetric0<Long> nonHeapCommitted =
-        metrics.newCallbackMetric(
-            "proc/jvm/memory/non_heap_committed",
-            Long.class,
-            new Description("Amount of memory guaranteed for classes, etc.")
-                .setGauge()
-                .setUnit(Units.BYTES));
-
-    CallbackMetric0<Long> nonHeapUsed =
-        metrics.newCallbackMetric(
-            "proc/jvm/memory/non_heap_used",
-            Long.class,
-            new Description("Amount of memory holding classes, etc.")
-                .setGauge()
-                .setUnit(Units.BYTES));
-
-    CallbackMetric0<Integer> objectPendingFinalizationCount =
-        metrics.newCallbackMetric(
-            "proc/jvm/memory/object_pending_finalization_count",
-            Integer.class,
-            new Description("Approximate number of objects needing finalization.")
-                .setGauge()
-                .setUnit("objects"));
-
-    MemoryMXBean memory = ManagementFactory.getMemoryMXBean();
-    metrics.newTrigger(
-        ImmutableSet.<CallbackMetric<?>>of(
-            heapCommitted, heapUsed, nonHeapCommitted, nonHeapUsed, objectPendingFinalizationCount),
-        () -> {
-          try {
-            MemoryUsage stats = memory.getHeapMemoryUsage();
-            heapCommitted.set(stats.getCommitted());
-            heapUsed.set(stats.getUsed());
-          } catch (IllegalArgumentException e) {
-            // MXBean may throw due to a bug in Java 7; ignore.
-          }
-
-          MemoryUsage stats = memory.getNonHeapMemoryUsage();
-          nonHeapCommitted.set(stats.getCommitted());
-          nonHeapUsed.set(stats.getUsed());
-
-          objectPendingFinalizationCount.set(memory.getObjectPendingFinalizationCount());
-        });
-  }
-
-  private void procJvmGc(MetricMaker metrics) {
-    CallbackMetric1<String, Long> gcCount =
-        metrics.newCallbackMetric(
-            "proc/jvm/gc/count",
-            Long.class,
-            new Description("Number of GCs").setCumulative(),
-            Field.ofString("gc_name", "The name of the garbage collector"));
-
-    CallbackMetric1<String, Long> gcTime =
-        metrics.newCallbackMetric(
-            "proc/jvm/gc/time",
-            Long.class,
-            new Description("Approximate accumulated GC elapsed time")
-                .setCumulative()
-                .setUnit(Units.MILLISECONDS),
-            Field.ofString("gc_name", "The name of the garbage collector"));
-
-    metrics.newTrigger(
-        gcCount,
-        gcTime,
-        () -> {
-          for (GarbageCollectorMXBean gc : ManagementFactory.getGarbageCollectorMXBeans()) {
-            long count = gc.getCollectionCount();
-            if (count != -1) {
-              gcCount.set(gc.getName(), count);
-            }
-            long time = gc.getCollectionTime();
-            if (time != -1) {
-              gcTime.set(gc.getName(), time);
-            }
-          }
-        });
-  }
-
-  private void procJvmThread(MetricMaker metrics) {
-    ThreadMXBean thread = ManagementFactory.getThreadMXBean();
-    metrics.newCallbackMetric(
-        "proc/jvm/thread/num_live",
-        Integer.class,
-        new Description("Current live thread count").setGauge().setUnit("threads"),
-        () -> thread.getThreadCount());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/rules/PredicateClassLoader.java b/gerrit-server/src/main/java/com/google/gerrit/rules/PredicateClassLoader.java
deleted file mode 100644
index 3478694..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/rules/PredicateClassLoader.java
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.rules;
-
-import com.google.common.collect.LinkedHashMultimap;
-import com.google.common.collect.SetMultimap;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import java.util.Collection;
-
-/** Loads the classes for Prolog predicates. */
-public class PredicateClassLoader extends ClassLoader {
-
-  private final SetMultimap<String, ClassLoader> packageClassLoaderMap =
-      LinkedHashMultimap.create();
-
-  public PredicateClassLoader(
-      final DynamicSet<PredicateProvider> predicateProviders, ClassLoader parent) {
-    super(parent);
-
-    for (PredicateProvider predicateProvider : predicateProviders) {
-      for (String pkg : predicateProvider.getPackages()) {
-        packageClassLoaderMap.put(pkg, predicateProvider.getClass().getClassLoader());
-      }
-    }
-  }
-
-  @Override
-  protected Class<?> findClass(String className) throws ClassNotFoundException {
-    final Collection<ClassLoader> classLoaders =
-        packageClassLoaderMap.get(getPackageName(className));
-    for (ClassLoader cl : classLoaders) {
-      try {
-        return Class.forName(className, true, cl);
-      } catch (ClassNotFoundException e) {
-        // ignore
-      }
-    }
-    throw new ClassNotFoundException(className);
-  }
-
-  private static String getPackageName(String className) {
-    final int pos = className.lastIndexOf('.');
-    if (pos < 0) {
-      return "";
-    }
-    return className.substring(0, pos);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/rules/PredicateProvider.java b/gerrit-server/src/main/java/com/google/gerrit/rules/PredicateProvider.java
deleted file mode 100644
index c64bc92..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/rules/PredicateProvider.java
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.rules;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.extensions.annotations.ExtensionPoint;
-import com.googlecode.prolog_cafe.lang.Predicate;
-
-/**
- * Provides additional packages that contain Prolog predicates that should be made available in the
- * Prolog environment. The predicates can e.g. be used in the project submit rules.
- *
- * <p>Each Java class defining a Prolog predicate must be in one of the provided packages and its
- * name must apply to the 'PRED_[functor]_[arity]' format. In addition it must extend {@link
- * Predicate}.
- */
-@ExtensionPoint
-public interface PredicateProvider {
-  /** Return set of packages that contain Prolog predicates */
-  ImmutableSet<String> getPackages();
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/rules/PrologEnvironment.java b/gerrit-server/src/main/java/com/google/gerrit/rules/PrologEnvironment.java
deleted file mode 100644
index e98e480..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/rules/PrologEnvironment.java
+++ /dev/null
@@ -1,248 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.rules;
-
-import com.google.gerrit.server.AnonymousUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.patch.PatchListCache;
-import com.google.gerrit.server.patch.PatchSetInfoFactory;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import com.google.inject.assistedinject.Assisted;
-import com.googlecode.prolog_cafe.lang.BufferingPrologControl;
-import com.googlecode.prolog_cafe.lang.Predicate;
-import com.googlecode.prolog_cafe.lang.PredicateEncoder;
-import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.PrologMachineCopy;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Per-thread Prolog interpreter.
- *
- * <p>This class is not thread safe.
- *
- * <p>A single copy of the Prolog interpreter, for the current thread.
- */
-public class PrologEnvironment extends BufferingPrologControl {
-  private static final Logger log = LoggerFactory.getLogger(PrologEnvironment.class);
-
-  public interface Factory {
-    /**
-     * Construct a new Prolog interpreter.
-     *
-     * @param src the machine to template the new environment from.
-     * @return the new interpreter.
-     */
-    PrologEnvironment create(PrologMachineCopy src);
-  }
-
-  private final Args args;
-  private final Map<StoredValue<Object>, Object> storedValues;
-  private List<Runnable> cleanup;
-
-  @Inject
-  PrologEnvironment(Args a, @Assisted PrologMachineCopy src) {
-    super(src);
-    setEnabled(EnumSet.allOf(Prolog.Feature.class), false);
-    args = a;
-    storedValues = new HashMap<>();
-    cleanup = new LinkedList<>();
-  }
-
-  public Args getArgs() {
-    return args;
-  }
-
-  @Override
-  public void setPredicate(Predicate goal) {
-    super.setPredicate(goal);
-    int reductionLimit = args.reductionLimit(goal);
-    log.debug("setting reductionLimit {}", reductionLimit);
-    setReductionLimit(reductionLimit);
-  }
-
-  /**
-   * Lookup a stored value in the interpreter's hash manager.
-   *
-   * @param <T> type of stored Java object.
-   * @param sv unique key.
-   * @return the value; null if not stored.
-   */
-  @SuppressWarnings("unchecked")
-  public <T> T get(StoredValue<T> sv) {
-    return (T) storedValues.get(sv);
-  }
-
-  /**
-   * Set a stored value on the interpreter's hash manager.
-   *
-   * @param <T> type of stored Java object.
-   * @param sv unique key.
-   * @param obj the value to store under {@code sv}.
-   */
-  @SuppressWarnings("unchecked")
-  public <T> void set(StoredValue<T> sv, T obj) {
-    storedValues.put((StoredValue<Object>) sv, obj);
-  }
-
-  /**
-   * Copy the stored values from another interpreter to this one. Also gets the cleanup from the
-   * child interpreter
-   */
-  public void copyStoredValues(PrologEnvironment child) {
-    storedValues.putAll(child.storedValues);
-    setCleanup(child.cleanup);
-  }
-
-  /**
-   * Assign the environment a cleanup list (in order to use a centralized list) If this
-   * enivronment's list is non-empty, append its cleanup tasks to the assigning list.
-   */
-  public void setCleanup(List<Runnable> newCleanupList) {
-    newCleanupList.addAll(cleanup);
-    cleanup = newCleanupList;
-  }
-
-  /**
-   * Adds cleanup task to run when close() is called
-   *
-   * @param task is run when close() is called
-   */
-  public void addToCleanup(Runnable task) {
-    cleanup.add(task);
-  }
-
-  /** Release resources stored in interpreter's hash manager. */
-  public void close() {
-    for (Iterator<Runnable> i = cleanup.iterator(); i.hasNext(); ) {
-      try {
-        i.next().run();
-      } catch (Throwable err) {
-        log.error("Failed to execute cleanup for PrologEnvironment", err);
-      }
-      i.remove();
-    }
-  }
-
-  @Singleton
-  public static class Args {
-    private static final Class<Predicate> CONSULT_STREAM_2;
-
-    static {
-      try {
-        @SuppressWarnings("unchecked")
-        Class<Predicate> c =
-            (Class<Predicate>)
-                Class.forName(
-                    PredicateEncoder.encode(Prolog.BUILTIN, "consult_stream", 2),
-                    false,
-                    RulesCache.class.getClassLoader());
-        CONSULT_STREAM_2 = c;
-      } catch (ClassNotFoundException e) {
-        throw new LinkageError("cannot find predicate consult_stream", e);
-      }
-    }
-
-    private final ProjectCache projectCache;
-    private final PermissionBackend permissionBackend;
-    private final GitRepositoryManager repositoryManager;
-    private final PatchListCache patchListCache;
-    private final PatchSetInfoFactory patchSetInfoFactory;
-    private final IdentifiedUser.GenericFactory userFactory;
-    private final Provider<AnonymousUser> anonymousUser;
-    private final int reductionLimit;
-    private final int compileLimit;
-
-    @Inject
-    Args(
-        ProjectCache projectCache,
-        PermissionBackend permissionBackend,
-        GitRepositoryManager repositoryManager,
-        PatchListCache patchListCache,
-        PatchSetInfoFactory patchSetInfoFactory,
-        IdentifiedUser.GenericFactory userFactory,
-        Provider<AnonymousUser> anonymousUser,
-        @GerritServerConfig Config config) {
-      this.projectCache = projectCache;
-      this.permissionBackend = permissionBackend;
-      this.repositoryManager = repositoryManager;
-      this.patchListCache = patchListCache;
-      this.patchSetInfoFactory = patchSetInfoFactory;
-      this.userFactory = userFactory;
-      this.anonymousUser = anonymousUser;
-
-      int limit = config.getInt("rules", null, "reductionLimit", 100000);
-      reductionLimit = limit <= 0 ? Integer.MAX_VALUE : limit;
-
-      limit =
-          config.getInt(
-              "rules",
-              null,
-              "compileReductionLimit",
-              (int) Math.min(10L * limit, Integer.MAX_VALUE));
-      compileLimit = limit <= 0 ? Integer.MAX_VALUE : limit;
-
-      log.info("reductionLimit: {}, compileLimit: {}", reductionLimit, compileLimit);
-    }
-
-    private int reductionLimit(Predicate goal) {
-      if (goal.getClass() == CONSULT_STREAM_2) {
-        return compileLimit;
-      }
-      return reductionLimit;
-    }
-
-    public ProjectCache getProjectCache() {
-      return projectCache;
-    }
-
-    public PermissionBackend getPermissionBackend() {
-      return permissionBackend;
-    }
-
-    public GitRepositoryManager getGitRepositoryManager() {
-      return repositoryManager;
-    }
-
-    public PatchListCache getPatchListCache() {
-      return patchListCache;
-    }
-
-    public PatchSetInfoFactory getPatchSetInfoFactory() {
-      return patchSetInfoFactory;
-    }
-
-    public IdentifiedUser.GenericFactory getUserFactory() {
-      return userFactory;
-    }
-
-    public AnonymousUser getAnonymousUser() {
-      return anonymousUser.get();
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/rules/PrologModule.java b/gerrit-server/src/main/java/com/google/gerrit/rules/PrologModule.java
deleted file mode 100644
index 7ed048b..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/rules/PrologModule.java
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.rules;
-
-import com.google.gerrit.extensions.config.FactoryModule;
-import com.google.gerrit.extensions.registration.DynamicSet;
-
-public class PrologModule extends FactoryModule {
-  @Override
-  protected void configure() {
-    install(new EnvironmentModule());
-    bind(PrologEnvironment.Args.class);
-  }
-
-  static class EnvironmentModule extends FactoryModule {
-    @Override
-    protected void configure() {
-      DynamicSet.setOf(binder(), PredicateProvider.class);
-      factory(PrologEnvironment.Factory.class);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/rules/RulesCache.java b/gerrit-server/src/main/java/com/google/gerrit/rules/RulesCache.java
deleted file mode 100644
index 9ab0dd6..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/rules/RulesCache.java
+++ /dev/null
@@ -1,293 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.rules;
-
-import static com.googlecode.prolog_cafe.lang.PrologMachineCopy.save;
-
-import com.google.common.base.Joiner;
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.googlecode.prolog_cafe.exceptions.CompileException;
-import com.googlecode.prolog_cafe.exceptions.SyntaxException;
-import com.googlecode.prolog_cafe.exceptions.TermException;
-import com.googlecode.prolog_cafe.lang.BufferingPrologControl;
-import com.googlecode.prolog_cafe.lang.JavaObjectTerm;
-import com.googlecode.prolog_cafe.lang.ListTerm;
-import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.PrologClassLoader;
-import com.googlecode.prolog_cafe.lang.PrologMachineCopy;
-import com.googlecode.prolog_cafe.lang.StructureTerm;
-import com.googlecode.prolog_cafe.lang.SymbolTerm;
-import com.googlecode.prolog_cafe.lang.Term;
-import java.io.IOException;
-import java.io.PushbackReader;
-import java.io.Reader;
-import java.io.StringReader;
-import java.lang.ref.Reference;
-import java.lang.ref.ReferenceQueue;
-import java.lang.ref.WeakReference;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.eclipse.jgit.errors.LargeObjectException;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectLoader;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.util.RawParseUtils;
-
-/**
- * Manages a cache of compiled Prolog rules.
- *
- * <p>Rules are loaded from the {@code site_path/cache/rules/rules-SHA1.jar}, where {@code SHA1} is
- * the SHA1 of the Prolog {@code rules.pl} in a project's {@link RefNames#REFS_CONFIG} branch.
- */
-@Singleton
-public class RulesCache {
-  private static final ImmutableList<String> PACKAGE_LIST =
-      ImmutableList.of(Prolog.BUILTIN, "gerrit");
-
-  private static final class MachineRef extends WeakReference<PrologMachineCopy> {
-    final ObjectId key;
-
-    MachineRef(ObjectId key, PrologMachineCopy pcm, ReferenceQueue<PrologMachineCopy> queue) {
-      super(pcm, queue);
-      this.key = key;
-    }
-  }
-
-  private final boolean enableProjectRules;
-  private final int maxDbSize;
-  private final int maxSrcBytes;
-  private final Path cacheDir;
-  private final Path rulesDir;
-  private final GitRepositoryManager gitMgr;
-  private final DynamicSet<PredicateProvider> predicateProviders;
-  private final ClassLoader systemLoader;
-  private final PrologMachineCopy defaultMachine;
-  private final Map<ObjectId, MachineRef> machineCache = new HashMap<>();
-  private final ReferenceQueue<PrologMachineCopy> dead = new ReferenceQueue<>();
-
-  @Inject
-  protected RulesCache(
-      @GerritServerConfig Config config,
-      SitePaths site,
-      GitRepositoryManager gm,
-      DynamicSet<PredicateProvider> predicateProviders) {
-    maxDbSize = config.getInt("rules", null, "maxPrologDatabaseSize", 256);
-    maxSrcBytes = config.getInt("rules", null, "maxSourceBytes", 128 << 10);
-    enableProjectRules = config.getBoolean("rules", null, "enable", true) && maxSrcBytes > 0;
-    cacheDir = site.resolve(config.getString("cache", null, "directory"));
-    rulesDir = cacheDir != null ? cacheDir.resolve("rules") : null;
-    gitMgr = gm;
-    this.predicateProviders = predicateProviders;
-
-    systemLoader = getClass().getClassLoader();
-    defaultMachine = save(newEmptyMachine(systemLoader));
-  }
-
-  public boolean isProjectRulesEnabled() {
-    return enableProjectRules;
-  }
-
-  /**
-   * Locate a cached Prolog machine state, or create one if not available.
-   *
-   * @return a Prolog machine, after loading the specified rules.
-   * @throws CompileException the machine cannot be created.
-   */
-  public synchronized PrologMachineCopy loadMachine(Project.NameKey project, ObjectId rulesId)
-      throws CompileException {
-    if (!enableProjectRules || project == null || rulesId == null) {
-      return defaultMachine;
-    }
-
-    Reference<? extends PrologMachineCopy> ref = machineCache.get(rulesId);
-    if (ref != null) {
-      PrologMachineCopy pmc = ref.get();
-      if (pmc != null) {
-        return pmc;
-      }
-
-      machineCache.remove(rulesId);
-      ref.enqueue();
-    }
-
-    gc();
-
-    PrologMachineCopy pcm = createMachine(project, rulesId);
-    MachineRef newRef = new MachineRef(rulesId, pcm, dead);
-    machineCache.put(rulesId, newRef);
-    return pcm;
-  }
-
-  public PrologMachineCopy loadMachine(String name, Reader in) throws CompileException {
-    PrologMachineCopy pmc = consultRules(name, in);
-    if (pmc == null) {
-      throw new CompileException("Cannot consult rules from the stream " + name);
-    }
-    return pmc;
-  }
-
-  private void gc() {
-    Reference<?> ref;
-    while ((ref = dead.poll()) != null) {
-      ObjectId key = ((MachineRef) ref).key;
-      if (machineCache.get(key) == ref) {
-        machineCache.remove(key);
-      }
-    }
-  }
-
-  private PrologMachineCopy createMachine(Project.NameKey project, ObjectId rulesId)
-      throws CompileException {
-    // If the rules are available as a complied JAR on local disk, prefer
-    // that over dynamic consult as the bytecode will be faster.
-    //
-    if (rulesDir != null) {
-      Path jarPath = rulesDir.resolve("rules-" + rulesId.getName() + ".jar");
-      if (Files.isRegularFile(jarPath)) {
-        URL[] cp = new URL[] {toURL(jarPath)};
-        return save(newEmptyMachine(new URLClassLoader(cp, systemLoader)));
-      }
-    }
-
-    // Dynamically consult the rules into the machine's internal database.
-    //
-    String rules = read(project, rulesId);
-    PrologMachineCopy pmc = consultRules("rules.pl", new StringReader(rules));
-    if (pmc == null) {
-      throw new CompileException("Cannot consult rules of " + project);
-    }
-    return pmc;
-  }
-
-  private PrologMachineCopy consultRules(String name, Reader rules) throws CompileException {
-    BufferingPrologControl ctl = newEmptyMachine(systemLoader);
-    PushbackReader in = new PushbackReader(rules, Prolog.PUSHBACK_SIZE);
-    try {
-      if (!ctl.execute(
-          Prolog.BUILTIN, "consult_stream", SymbolTerm.intern(name), new JavaObjectTerm(in))) {
-        return null;
-      }
-    } catch (SyntaxException e) {
-      throw new CompileException(e.toString(), e);
-    } catch (TermException e) {
-      Term m = e.getMessageTerm();
-      if (m instanceof StructureTerm && "syntax_error".equals(m.name()) && m.arity() >= 1) {
-        StringBuilder msg = new StringBuilder();
-        if (m.arg(0) instanceof ListTerm) {
-          msg.append(Joiner.on(' ').join(((ListTerm) m.arg(0)).toJava()));
-        } else {
-          msg.append(m.arg(0).toString());
-        }
-        if (m.arity() == 2 && m.arg(1) instanceof StructureTerm && "at".equals(m.arg(1).name())) {
-          Term at = m.arg(1).arg(0).dereference();
-          if (at instanceof ListTerm) {
-            msg.append(" at: ");
-            msg.append(prettyProlog(at));
-          }
-        }
-        throw new CompileException(msg.toString(), e);
-      }
-      throw new CompileException("Error while consulting rules from " + name, e);
-    } catch (RuntimeException e) {
-      throw new CompileException("Error while consulting rules from " + name, e);
-    }
-    return save(ctl);
-  }
-
-  private static String prettyProlog(Term at) {
-    StringBuilder b = new StringBuilder();
-    for (Object o : ((ListTerm) at).toJava()) {
-      if (o instanceof Term) {
-        Term t = (Term) o;
-        if (!(t instanceof StructureTerm)) {
-          b.append(t.toString()).append(' ');
-          continue;
-        }
-        switch (t.name()) {
-          case "atom":
-            SymbolTerm atom = (SymbolTerm) t.arg(0);
-            b.append(atom.toString());
-            break;
-          case "var":
-            b.append(t.arg(0).toString());
-            break;
-        }
-      } else {
-        b.append(o);
-      }
-    }
-    return b.toString().trim();
-  }
-
-  private String read(Project.NameKey project, ObjectId rulesId) throws CompileException {
-    try (Repository git = gitMgr.openRepository(project)) {
-      try {
-        ObjectLoader ldr = git.open(rulesId, Constants.OBJ_BLOB);
-        byte[] raw = ldr.getCachedBytes(maxSrcBytes);
-        return RawParseUtils.decode(raw);
-      } catch (LargeObjectException e) {
-        throw new CompileException("rules of " + project + " are too large", e);
-      } catch (RuntimeException | IOException e) {
-        throw new CompileException("Cannot load rules of " + project, e);
-      }
-    } catch (IOException e) {
-      throw new CompileException("Cannot open repository " + project, e);
-    }
-  }
-
-  private BufferingPrologControl newEmptyMachine(ClassLoader cl) {
-    BufferingPrologControl ctl = new BufferingPrologControl();
-    ctl.setMaxDatabaseSize(maxDbSize);
-    ctl.setPrologClassLoader(
-        new PrologClassLoader(new PredicateClassLoader(predicateProviders, cl)));
-    ctl.setEnabled(EnumSet.allOf(Prolog.Feature.class), false);
-
-    List<String> packages = new ArrayList<>();
-    packages.addAll(PACKAGE_LIST);
-    for (PredicateProvider predicateProvider : predicateProviders) {
-      packages.addAll(predicateProvider.getPackages());
-    }
-
-    // Bootstrap the interpreter and ensure there is clean state.
-    ctl.initialize(packages.toArray(new String[packages.size()]));
-    return ctl;
-  }
-
-  private static URL toURL(Path jarPath) throws CompileException {
-    try {
-      return jarPath.toUri().toURL();
-    } catch (MalformedURLException e) {
-      throw new CompileException("Cannot create URL for " + jarPath, e);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/rules/StoredValue.java b/gerrit-server/src/main/java/com/google/gerrit/rules/StoredValue.java
deleted file mode 100644
index 4892fc1..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/rules/StoredValue.java
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.rules;
-
-import com.googlecode.prolog_cafe.exceptions.SystemException;
-import com.googlecode.prolog_cafe.lang.Prolog;
-
-/**
- * Defines a value cached in a {@link PrologEnvironment}.
- *
- * @see StoredValues
- */
-public class StoredValue<T> {
-  /** Construct a new unique key that does not match any other key. */
-  public static <T> StoredValue<T> create() {
-    return new StoredValue<>();
-  }
-
-  /** Construct a key based on a Java Class object, useful for singletons. */
-  public static <T> StoredValue<T> create(Class<T> clazz) {
-    return new StoredValue<>(clazz);
-  }
-
-  private final Object key;
-
-  /**
-   * Initialize a stored value key using any Java Object.
-   *
-   * @param key unique identity of the stored value. This will be the hash key in the Prolog
-   *     Environments's hash map.
-   */
-  public StoredValue(Object key) {
-    this.key = key;
-  }
-
-  /** Initializes a stored value key with a new unique key. */
-  public StoredValue() {
-    key = this;
-  }
-
-  /** Look up the value in the engine, or return null. */
-  public T getOrNull(Prolog engine) {
-    return get((PrologEnvironment) engine.control);
-  }
-  /** Get the value from the engine, or throw SystemException. */
-  public T get(Prolog engine) {
-    T obj = getOrNull(engine);
-    if (obj == null) {
-      // unless createValue() is overridden, will return null
-      obj = createValue(engine);
-      if (obj == null) {
-        throw new SystemException("No " + key + " available");
-      }
-      set(engine, obj);
-    }
-    return obj;
-  }
-
-  public void set(Prolog engine, T obj) {
-    set((PrologEnvironment) engine.control, obj);
-  }
-
-  /** Perform {@link #getOrNull(Prolog)} on the environment's interpreter. */
-  public T get(PrologEnvironment env) {
-    return env.get(this);
-  }
-
-  /** Set the value into the environment's interpreter. */
-  public void set(PrologEnvironment env, T obj) {
-    env.set(this, obj);
-  }
-
-  /**
-   * Creates a value to store, returns null by default.
-   *
-   * @param engine Prolog engine.
-   * @return new value.
-   */
-  protected T createValue(Prolog engine) {
-    return null;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/rules/StoredValues.java b/gerrit-server/src/main/java/com/google/gerrit/rules/StoredValues.java
deleted file mode 100644
index 89fedda..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/rules/StoredValues.java
+++ /dev/null
@@ -1,162 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.rules;
-
-import static com.google.gerrit.rules.StoredValue.create;
-
-import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetInfo;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.AnonymousUser;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.Accounts;
-import com.google.gerrit.server.account.Emails;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.patch.PatchList;
-import com.google.gerrit.server.patch.PatchListCache;
-import com.google.gerrit.server.patch.PatchListKey;
-import com.google.gerrit.server.patch.PatchListNotAvailableException;
-import com.google.gerrit.server.patch.PatchSetInfoFactory;
-import com.google.gerrit.server.patch.PatchSetInfoNotAvailableException;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gwtorm.server.OrmException;
-import com.googlecode.prolog_cafe.exceptions.SystemException;
-import com.googlecode.prolog_cafe.lang.Prolog;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-
-public final class StoredValues {
-  public static final StoredValue<Accounts> ACCOUNTS = create(Accounts.class);
-  public static final StoredValue<AccountCache> ACCOUNT_CACHE = create(AccountCache.class);
-  public static final StoredValue<Emails> EMAILS = create(Emails.class);
-  public static final StoredValue<ReviewDb> REVIEW_DB = create(ReviewDb.class);
-  public static final StoredValue<ChangeData> CHANGE_DATA = create(ChangeData.class);
-  public static final StoredValue<CurrentUser> CURRENT_USER = create(CurrentUser.class);
-  public static final StoredValue<ProjectState> PROJECT_STATE = create(ProjectState.class);
-
-  public static Change getChange(Prolog engine) throws SystemException {
-    ChangeData cd = CHANGE_DATA.get(engine);
-    try {
-      return cd.change();
-    } catch (OrmException e) {
-      throw new SystemException("Cannot load change " + cd.getId());
-    }
-  }
-
-  public static PatchSet getPatchSet(Prolog engine) throws SystemException {
-    ChangeData cd = CHANGE_DATA.get(engine);
-    try {
-      return cd.currentPatchSet();
-    } catch (OrmException e) {
-      throw new SystemException(e.getMessage());
-    }
-  }
-
-  public static final StoredValue<PatchSetInfo> PATCH_SET_INFO =
-      new StoredValue<PatchSetInfo>() {
-        @Override
-        public PatchSetInfo createValue(Prolog engine) {
-          Change change = getChange(engine);
-          PatchSet ps = getPatchSet(engine);
-          PrologEnvironment env = (PrologEnvironment) engine.control;
-          PatchSetInfoFactory patchInfoFactory = env.getArgs().getPatchSetInfoFactory();
-          try {
-            return patchInfoFactory.get(change.getProject(), ps);
-          } catch (PatchSetInfoNotAvailableException e) {
-            throw new SystemException(e.getMessage());
-          }
-        }
-      };
-
-  public static final StoredValue<PatchList> PATCH_LIST =
-      new StoredValue<PatchList>() {
-        @Override
-        public PatchList createValue(Prolog engine) {
-          PrologEnvironment env = (PrologEnvironment) engine.control;
-          PatchSet ps = getPatchSet(engine);
-          PatchListCache plCache = env.getArgs().getPatchListCache();
-          Change change = getChange(engine);
-          Project.NameKey project = change.getProject();
-          ObjectId b = ObjectId.fromString(ps.getRevision().get());
-          Whitespace ws = Whitespace.IGNORE_NONE;
-          PatchListKey plKey = PatchListKey.againstDefaultBase(b, ws);
-          PatchList patchList;
-          try {
-            patchList = plCache.get(plKey, project);
-          } catch (PatchListNotAvailableException e) {
-            throw new SystemException("Cannot create " + plKey);
-          }
-          return patchList;
-        }
-      };
-
-  public static final StoredValue<Repository> REPOSITORY =
-      new StoredValue<Repository>() {
-        @Override
-        public Repository createValue(Prolog engine) {
-          PrologEnvironment env = (PrologEnvironment) engine.control;
-          GitRepositoryManager gitMgr = env.getArgs().getGitRepositoryManager();
-          Change change = getChange(engine);
-          Project.NameKey projectKey = change.getProject();
-          Repository repo;
-          try {
-            repo = gitMgr.openRepository(projectKey);
-          } catch (IOException e) {
-            throw new SystemException(e.getMessage());
-          }
-          env.addToCleanup(repo::close);
-          return repo;
-        }
-      };
-
-  public static final StoredValue<PermissionBackend> PERMISSION_BACKEND =
-      new StoredValue<PermissionBackend>() {
-        @Override
-        protected PermissionBackend createValue(Prolog engine) {
-          PrologEnvironment env = (PrologEnvironment) engine.control;
-          return env.getArgs().getPermissionBackend();
-        }
-      };
-
-  public static final StoredValue<AnonymousUser> ANONYMOUS_USER =
-      new StoredValue<AnonymousUser>() {
-        @Override
-        protected AnonymousUser createValue(Prolog engine) {
-          PrologEnvironment env = (PrologEnvironment) engine.control;
-          return env.getArgs().getAnonymousUser();
-        }
-      };
-
-  public static final StoredValue<Map<Account.Id, IdentifiedUser>> USERS =
-      new StoredValue<Map<Account.Id, IdentifiedUser>>() {
-        @Override
-        protected Map<Account.Id, IdentifiedUser> createValue(Prolog engine) {
-          return new HashMap<>();
-        }
-      };
-
-  private StoredValues() {}
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/AnonymousUser.java b/gerrit-server/src/main/java/com/google/gerrit/server/AnonymousUser.java
deleted file mode 100644
index c96d61a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/AnonymousUser.java
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server;
-
-import com.google.gerrit.server.account.GroupMembership;
-import com.google.gerrit.server.account.ListGroupMembership;
-import com.google.gerrit.server.group.SystemGroupBackend;
-import java.util.Collections;
-
-/** An anonymous user who has not yet authenticated. */
-public class AnonymousUser extends CurrentUser {
-  @Override
-  public GroupMembership getEffectiveGroups() {
-    return new ListGroupMembership(Collections.singleton(SystemGroupBackend.ANONYMOUS_USERS));
-  }
-
-  @Override
-  public String toString() {
-    return "ANONYMOUS";
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ApprovalCopier.java b/gerrit-server/src/main/java/com/google/gerrit/server/ApprovalCopier.java
deleted file mode 100644
index c1f89e2..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/ApprovalCopier.java
+++ /dev/null
@@ -1,264 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.common.collect.HashBasedTable;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.Table;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.extensions.client.ChangeKind;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.change.ChangeKindCache;
-import com.google.gerrit.server.git.LabelNormalizer;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.TreeMap;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-/**
- * Copies approvals between patch sets.
- *
- * <p>The result of a copy may either be stored, as when stamping approvals in the database at
- * submit time, or refreshed on demand, as when reading approvals from the NoteDb.
- */
-@Singleton
-public class ApprovalCopier {
-  private final ProjectCache projectCache;
-  private final ChangeKindCache changeKindCache;
-  private final LabelNormalizer labelNormalizer;
-  private final ChangeData.Factory changeDataFactory;
-  private final PatchSetUtil psUtil;
-
-  @Inject
-  ApprovalCopier(
-      ProjectCache projectCache,
-      ChangeKindCache changeKindCache,
-      LabelNormalizer labelNormalizer,
-      ChangeData.Factory changeDataFactory,
-      PatchSetUtil psUtil) {
-    this.projectCache = projectCache;
-    this.changeKindCache = changeKindCache;
-    this.labelNormalizer = labelNormalizer;
-    this.changeDataFactory = changeDataFactory;
-    this.psUtil = psUtil;
-  }
-
-  /**
-   * Apply approval copy settings from prior PatchSets to a new PatchSet.
-   *
-   * @param db review database.
-   * @param notes change notes for user uploading PatchSet
-   * @param user user uploading PatchSet
-   * @param ps new PatchSet
-   * @param rw open walk that can read the patch set commit; null to open the repo on demand.
-   * @param repoConfig repo config used for change kind detection; null to read from repo on demand.
-   * @throws OrmException
-   */
-  public void copyInReviewDb(
-      ReviewDb db,
-      ChangeNotes notes,
-      CurrentUser user,
-      PatchSet ps,
-      @Nullable RevWalk rw,
-      @Nullable Config repoConfig)
-      throws OrmException {
-    copyInReviewDb(db, notes, user, ps, rw, repoConfig, Collections.emptyList());
-  }
-
-  /**
-   * Apply approval copy settings from prior PatchSets to a new PatchSet.
-   *
-   * @param db review database.
-   * @param notes change notes for user uploading PatchSet
-   * @param user user uploading PatchSet
-   * @param ps new PatchSet
-   * @param rw open walk that can read the patch set commit; null to open the repo on demand.
-   * @param repoConfig repo config used for change kind detection; null to read from repo on demand.
-   * @param dontCopy PatchSetApprovals indicating which (account, label) pairs should not be copied
-   * @throws OrmException
-   */
-  public void copyInReviewDb(
-      ReviewDb db,
-      ChangeNotes notes,
-      CurrentUser user,
-      PatchSet ps,
-      @Nullable RevWalk rw,
-      @Nullable Config repoConfig,
-      Iterable<PatchSetApproval> dontCopy)
-      throws OrmException {
-    if (PrimaryStorage.of(notes.getChange()) == PrimaryStorage.REVIEW_DB) {
-      db.patchSetApprovals().insert(getForPatchSet(db, notes, user, ps, rw, repoConfig, dontCopy));
-    }
-  }
-
-  Iterable<PatchSetApproval> getForPatchSet(
-      ReviewDb db,
-      ChangeNotes notes,
-      CurrentUser user,
-      PatchSet.Id psId,
-      @Nullable RevWalk rw,
-      @Nullable Config repoConfig)
-      throws OrmException {
-    return getForPatchSet(
-        db, notes, user, psId, rw, repoConfig, Collections.<PatchSetApproval>emptyList());
-  }
-
-  Iterable<PatchSetApproval> getForPatchSet(
-      ReviewDb db,
-      ChangeNotes notes,
-      CurrentUser user,
-      PatchSet.Id psId,
-      @Nullable RevWalk rw,
-      @Nullable Config repoConfig,
-      Iterable<PatchSetApproval> dontCopy)
-      throws OrmException {
-    PatchSet ps = psUtil.get(db, notes, psId);
-    if (ps == null) {
-      return Collections.emptyList();
-    }
-    return getForPatchSet(db, notes, user, ps, rw, repoConfig, dontCopy);
-  }
-
-  private Iterable<PatchSetApproval> getForPatchSet(
-      ReviewDb db,
-      ChangeNotes notes,
-      CurrentUser user,
-      PatchSet ps,
-      @Nullable RevWalk rw,
-      @Nullable Config repoConfig,
-      Iterable<PatchSetApproval> dontCopy)
-      throws OrmException {
-    checkNotNull(ps, "ps should not be null");
-    ChangeData cd = changeDataFactory.create(db, notes);
-    try {
-      ProjectState project = projectCache.checkedGet(cd.change().getDest().getParentKey());
-      ListMultimap<PatchSet.Id, PatchSetApproval> all = cd.approvals();
-      checkNotNull(all, "all should not be null");
-
-      Table<String, Account.Id, PatchSetApproval> wontCopy = HashBasedTable.create();
-      for (PatchSetApproval psa : dontCopy) {
-        wontCopy.put(psa.getLabel(), psa.getAccountId(), psa);
-      }
-
-      Table<String, Account.Id, PatchSetApproval> byUser = HashBasedTable.create();
-      for (PatchSetApproval psa : all.get(ps.getId())) {
-        if (!wontCopy.contains(psa.getLabel(), psa.getAccountId())) {
-          byUser.put(psa.getLabel(), psa.getAccountId(), psa);
-        }
-      }
-
-      TreeMap<Integer, PatchSet> patchSets = getPatchSets(cd);
-
-      // Walk patch sets strictly less than current in descending order.
-      Collection<PatchSet> allPrior =
-          patchSets.descendingMap().tailMap(ps.getId().get(), false).values();
-      for (PatchSet priorPs : allPrior) {
-        List<PatchSetApproval> priorApprovals = all.get(priorPs.getId());
-        if (priorApprovals.isEmpty()) {
-          continue;
-        }
-
-        ChangeKind kind =
-            changeKindCache.getChangeKind(
-                project.getNameKey(),
-                rw,
-                repoConfig,
-                ObjectId.fromString(priorPs.getRevision().get()),
-                ObjectId.fromString(ps.getRevision().get()));
-
-        for (PatchSetApproval psa : priorApprovals) {
-          if (wontCopy.contains(psa.getLabel(), psa.getAccountId())) {
-            continue;
-          }
-          if (byUser.contains(psa.getLabel(), psa.getAccountId())) {
-            continue;
-          }
-          if (!canCopy(project, psa, ps.getId(), kind)) {
-            wontCopy.put(psa.getLabel(), psa.getAccountId(), psa);
-            continue;
-          }
-          byUser.put(psa.getLabel(), psa.getAccountId(), copy(psa, ps.getId()));
-        }
-      }
-      return labelNormalizer.normalize(notes, user, byUser.values()).getNormalized();
-    } catch (IOException e) {
-      throw new OrmException(e);
-    }
-  }
-
-  private static TreeMap<Integer, PatchSet> getPatchSets(ChangeData cd) throws OrmException {
-    Collection<PatchSet> patchSets = cd.patchSets();
-    TreeMap<Integer, PatchSet> result = new TreeMap<>();
-    for (PatchSet ps : patchSets) {
-      result.put(ps.getId().get(), ps);
-    }
-    return result;
-  }
-
-  private static boolean canCopy(
-      ProjectState project, PatchSetApproval psa, PatchSet.Id psId, ChangeKind kind) {
-    int n = psa.getKey().getParentKey().get();
-    checkArgument(n != psId.get());
-    LabelType type = project.getLabelTypes().byLabel(psa.getLabelId());
-    if (type == null) {
-      return false;
-    } else if ((type.isCopyMinScore() && type.isMaxNegative(psa))
-        || (type.isCopyMaxScore() && type.isMaxPositive(psa))) {
-      return true;
-    }
-    switch (kind) {
-      case MERGE_FIRST_PARENT_UPDATE:
-        return type.isCopyAllScoresOnMergeFirstParentUpdate();
-      case NO_CODE_CHANGE:
-        return type.isCopyAllScoresIfNoCodeChange();
-      case TRIVIAL_REBASE:
-        return type.isCopyAllScoresOnTrivialRebase();
-      case NO_CHANGE:
-        return type.isCopyAllScoresIfNoChange()
-            || type.isCopyAllScoresOnTrivialRebase()
-            || type.isCopyAllScoresOnMergeFirstParentUpdate()
-            || type.isCopyAllScoresIfNoCodeChange();
-      case REWORK:
-      default:
-        return false;
-    }
-  }
-
-  private static PatchSetApproval copy(PatchSetApproval src, PatchSet.Id psId) {
-    if (src.getKey().getParentKey().equals(psId)) {
-      return src;
-    }
-    return new PatchSetApproval(psId, src);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ApprovalsUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/ApprovalsUtil.java
deleted file mode 100644
index 82fa3f6..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/ApprovalsUtil.java
+++ /dev/null
@@ -1,459 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.gerrit.server.notedb.ReviewerStateInternal.CC;
-import static com.google.gerrit.server.notedb.ReviewerStateInternal.REVIEWER;
-import static java.util.Comparator.comparing;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableListMultimap;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Ordering;
-import com.google.common.collect.Sets;
-import com.google.common.primitives.Shorts;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.LabelTypes;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.LabelId;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.client.PatchSetInfo;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.ChangeUpdate;
-import com.google.gerrit.server.notedb.NotesMigration;
-import com.google.gerrit.server.notedb.ReviewerStateInternal;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.LabelPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.util.LabelVote;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Date;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Utility functions to manipulate patchset approvals.
- *
- * <p>Approvals are overloaded, they represent both approvals and reviewers which should be CCed on
- * a change. To ensure that reviewers are not lost there must always be an approval on each patchset
- * for each reviewer, even if the reviewer hasn't actually given a score to the change. To mark the
- * "no score" case, a dummy approval, which may live in any of the available categories, with a
- * score of 0 is used.
- *
- * <p>The methods in this class only modify the gwtorm database.
- */
-@Singleton
-public class ApprovalsUtil {
-  private static final Logger log = LoggerFactory.getLogger(ApprovalsUtil.class);
-
-  private static final Ordering<PatchSetApproval> SORT_APPROVALS =
-      Ordering.from(comparing(PatchSetApproval::getGranted));
-
-  public static List<PatchSetApproval> sortApprovals(Iterable<PatchSetApproval> approvals) {
-    return SORT_APPROVALS.sortedCopy(approvals);
-  }
-
-  public static PatchSetApproval newApproval(
-      PatchSet.Id psId, CurrentUser user, LabelId labelId, int value, Date when) {
-    PatchSetApproval psa =
-        new PatchSetApproval(
-            new PatchSetApproval.Key(psId, user.getAccountId(), labelId),
-            Shorts.checkedCast(value),
-            when);
-    user.updateRealAccountId(psa::setRealAccountId);
-    return psa;
-  }
-
-  private static Iterable<PatchSetApproval> filterApprovals(
-      Iterable<PatchSetApproval> psas, Account.Id accountId) {
-    return Iterables.filter(psas, a -> Objects.equals(a.getAccountId(), accountId));
-  }
-
-  private final NotesMigration migration;
-  private final IdentifiedUser.GenericFactory userFactory;
-  private final ApprovalCopier copier;
-  private final PermissionBackend permissionBackend;
-
-  @VisibleForTesting
-  @Inject
-  public ApprovalsUtil(
-      NotesMigration migration,
-      IdentifiedUser.GenericFactory userFactory,
-      ApprovalCopier copier,
-      PermissionBackend permissionBackend) {
-    this.migration = migration;
-    this.userFactory = userFactory;
-    this.copier = copier;
-    this.permissionBackend = permissionBackend;
-  }
-
-  /**
-   * Get all reviewers for a change.
-   *
-   * @param db review database.
-   * @param notes change notes.
-   * @return reviewers for the change.
-   * @throws OrmException if reviewers for the change could not be read.
-   */
-  public ReviewerSet getReviewers(ReviewDb db, ChangeNotes notes) throws OrmException {
-    if (!migration.readChanges()) {
-      return ReviewerSet.fromApprovals(db.patchSetApprovals().byChange(notes.getChangeId()));
-    }
-    return notes.load().getReviewers();
-  }
-
-  /**
-   * Get all reviewers and CCed accounts for a change.
-   *
-   * @param allApprovals all approvals to consider; must all belong to the same change.
-   * @return reviewers for the change.
-   * @throws OrmException if reviewers for the change could not be read.
-   */
-  public ReviewerSet getReviewers(ChangeNotes notes, Iterable<PatchSetApproval> allApprovals)
-      throws OrmException {
-    if (!migration.readChanges()) {
-      return ReviewerSet.fromApprovals(allApprovals);
-    }
-    return notes.load().getReviewers();
-  }
-
-  /**
-   * Get updates to reviewer set. Always returns empty list for ReviewDb.
-   *
-   * @param notes change notes.
-   * @return reviewer updates for the change.
-   * @throws OrmException if reviewer updates for the change could not be read.
-   */
-  public List<ReviewerStatusUpdate> getReviewerUpdates(ChangeNotes notes) throws OrmException {
-    if (!migration.readChanges()) {
-      return ImmutableList.of();
-    }
-    return notes.load().getReviewerUpdates();
-  }
-
-  public List<PatchSetApproval> addReviewers(
-      ReviewDb db,
-      ChangeUpdate update,
-      LabelTypes labelTypes,
-      Change change,
-      PatchSet ps,
-      PatchSetInfo info,
-      Iterable<Account.Id> wantReviewers,
-      Collection<Account.Id> existingReviewers)
-      throws OrmException {
-    return addReviewers(
-        db,
-        update,
-        labelTypes,
-        change,
-        ps.getId(),
-        info.getAuthor().getAccount(),
-        info.getCommitter().getAccount(),
-        wantReviewers,
-        existingReviewers);
-  }
-
-  public List<PatchSetApproval> addReviewers(
-      ReviewDb db,
-      ChangeNotes notes,
-      ChangeUpdate update,
-      LabelTypes labelTypes,
-      Change change,
-      Iterable<Account.Id> wantReviewers)
-      throws OrmException {
-    PatchSet.Id psId = change.currentPatchSetId();
-    Collection<Account.Id> existingReviewers;
-    if (migration.readChanges()) {
-      // If using NoteDB, we only want reviewers in the REVIEWER state.
-      existingReviewers = notes.load().getReviewers().byState(REVIEWER);
-    } else {
-      // Prior to NoteDB, we gather all reviewers regardless of state.
-      existingReviewers = getReviewers(db, notes).all();
-    }
-    // Existing reviewers should include pending additions in the REVIEWER
-    // state, taken from ChangeUpdate.
-    existingReviewers = Lists.newArrayList(existingReviewers);
-    for (Map.Entry<Account.Id, ReviewerStateInternal> entry : update.getReviewers().entrySet()) {
-      if (entry.getValue() == REVIEWER) {
-        existingReviewers.add(entry.getKey());
-      }
-    }
-    return addReviewers(
-        db, update, labelTypes, change, psId, null, null, wantReviewers, existingReviewers);
-  }
-
-  private List<PatchSetApproval> addReviewers(
-      ReviewDb db,
-      ChangeUpdate update,
-      LabelTypes labelTypes,
-      Change change,
-      PatchSet.Id psId,
-      Account.Id authorId,
-      Account.Id committerId,
-      Iterable<Account.Id> wantReviewers,
-      Collection<Account.Id> existingReviewers)
-      throws OrmException {
-    List<LabelType> allTypes = labelTypes.getLabelTypes();
-    if (allTypes.isEmpty()) {
-      return ImmutableList.of();
-    }
-
-    Set<Account.Id> need = Sets.newLinkedHashSet(wantReviewers);
-    if (authorId != null && canSee(db, update.getNotes(), authorId)) {
-      need.add(authorId);
-    }
-
-    if (committerId != null && canSee(db, update.getNotes(), committerId)) {
-      need.add(committerId);
-    }
-    need.remove(change.getOwner());
-    need.removeAll(existingReviewers);
-    if (need.isEmpty()) {
-      return ImmutableList.of();
-    }
-
-    List<PatchSetApproval> cells = Lists.newArrayListWithCapacity(need.size());
-    LabelId labelId = Iterables.getLast(allTypes).getLabelId();
-    for (Account.Id account : need) {
-      cells.add(
-          new PatchSetApproval(
-              new PatchSetApproval.Key(psId, account, labelId), (short) 0, update.getWhen()));
-      update.putReviewer(account, REVIEWER);
-    }
-    db.patchSetApprovals().upsert(cells);
-    return Collections.unmodifiableList(cells);
-  }
-
-  private boolean canSee(ReviewDb db, ChangeNotes notes, Account.Id accountId) {
-    try {
-      IdentifiedUser user = userFactory.create(accountId);
-      return permissionBackend.user(user).change(notes).database(db).test(ChangePermission.READ);
-    } catch (PermissionBackendException e) {
-      log.warn(
-          "Failed to check if account {} can see change {}",
-          accountId.get(),
-          notes.getChangeId().get(),
-          e);
-      return false;
-    }
-  }
-
-  /**
-   * Adds accounts to a change as reviewers in the CC state.
-   *
-   * @param notes change notes.
-   * @param update change update.
-   * @param wantCCs accounts to CC.
-   * @return whether a change was made.
-   * @throws OrmException
-   */
-  public Collection<Account.Id> addCcs(
-      ChangeNotes notes, ChangeUpdate update, Collection<Account.Id> wantCCs) throws OrmException {
-    return addCcs(update, wantCCs, notes.load().getReviewers());
-  }
-
-  private Collection<Account.Id> addCcs(
-      ChangeUpdate update, Collection<Account.Id> wantCCs, ReviewerSet existingReviewers) {
-    Set<Account.Id> need = new LinkedHashSet<>(wantCCs);
-    need.removeAll(existingReviewers.all());
-    need.removeAll(update.getReviewers().keySet());
-    for (Account.Id account : need) {
-      update.putReviewer(account, CC);
-    }
-    return need;
-  }
-
-  /**
-   * Adds approvals to ChangeUpdate for a new patch set, and writes to ReviewDb.
-   *
-   * @param db review database.
-   * @param update change update.
-   * @param labelTypes label types for the containing project.
-   * @param ps patch set being approved.
-   * @param user user adding approvals.
-   * @param approvals approvals to add.
-   * @throws RestApiException
-   * @throws OrmException
-   */
-  public Iterable<PatchSetApproval> addApprovalsForNewPatchSet(
-      ReviewDb db,
-      ChangeUpdate update,
-      LabelTypes labelTypes,
-      PatchSet ps,
-      CurrentUser user,
-      Map<String, Short> approvals)
-      throws RestApiException, OrmException, PermissionBackendException {
-    Account.Id accountId = user.getAccountId();
-    checkArgument(
-        accountId.equals(ps.getUploader()),
-        "expected user %s to match patch set uploader %s",
-        accountId,
-        ps.getUploader());
-    if (approvals.isEmpty()) {
-      return ImmutableList.of();
-    }
-    checkApprovals(approvals, permissionBackend.user(user).database(db).change(update.getNotes()));
-    List<PatchSetApproval> cells = new ArrayList<>(approvals.size());
-    Date ts = update.getWhen();
-    for (Map.Entry<String, Short> vote : approvals.entrySet()) {
-      LabelType lt = labelTypes.byLabel(vote.getKey());
-      cells.add(newApproval(ps.getId(), user, lt.getLabelId(), vote.getValue(), ts));
-    }
-    for (PatchSetApproval psa : cells) {
-      update.putApproval(psa.getLabel(), psa.getValue());
-    }
-    db.patchSetApprovals().insert(cells);
-    return cells;
-  }
-
-  public static void checkLabel(LabelTypes labelTypes, String name, Short value)
-      throws BadRequestException {
-    LabelType label = labelTypes.byLabel(name);
-    if (label == null) {
-      throw new BadRequestException(String.format("label \"%s\" is not a configured label", name));
-    }
-    if (label.getValue(value) == null) {
-      throw new BadRequestException(
-          String.format("label \"%s\": %d is not a valid value", name, value));
-    }
-  }
-
-  private static void checkApprovals(
-      Map<String, Short> approvals, PermissionBackend.ForChange forChange)
-      throws AuthException, PermissionBackendException {
-    for (Map.Entry<String, Short> vote : approvals.entrySet()) {
-      String name = vote.getKey();
-      Short value = vote.getValue();
-      try {
-        forChange.check(new LabelPermission.WithValue(name, value));
-      } catch (AuthException e) {
-        throw new AuthException(
-            String.format("applying label \"%s\": %d is restricted", name, value));
-      }
-    }
-  }
-
-  public ListMultimap<PatchSet.Id, PatchSetApproval> byChange(ReviewDb db, ChangeNotes notes)
-      throws OrmException {
-    if (!migration.readChanges()) {
-      ImmutableListMultimap.Builder<PatchSet.Id, PatchSetApproval> result =
-          ImmutableListMultimap.builder();
-      for (PatchSetApproval psa : db.patchSetApprovals().byChange(notes.getChangeId())) {
-        result.put(psa.getPatchSetId(), psa);
-      }
-      return result.build();
-    }
-    return notes.load().getApprovals();
-  }
-
-  public Iterable<PatchSetApproval> byPatchSet(
-      ReviewDb db,
-      ChangeNotes notes,
-      CurrentUser user,
-      PatchSet.Id psId,
-      @Nullable RevWalk rw,
-      @Nullable Config repoConfig)
-      throws OrmException {
-    if (!migration.readChanges()) {
-      return sortApprovals(db.patchSetApprovals().byPatchSet(psId));
-    }
-    return copier.getForPatchSet(db, notes, user, psId, rw, repoConfig);
-  }
-
-  public Iterable<PatchSetApproval> byPatchSetUser(
-      ReviewDb db,
-      ChangeNotes notes,
-      CurrentUser user,
-      PatchSet.Id psId,
-      Account.Id accountId,
-      @Nullable RevWalk rw,
-      @Nullable Config repoConfig)
-      throws OrmException {
-    if (!migration.readChanges()) {
-      return sortApprovals(db.patchSetApprovals().byPatchSetUser(psId, accountId));
-    }
-    return filterApprovals(byPatchSet(db, notes, user, psId, rw, repoConfig), accountId);
-  }
-
-  public PatchSetApproval getSubmitter(ReviewDb db, ChangeNotes notes, PatchSet.Id c) {
-    if (c == null) {
-      return null;
-    }
-    try {
-      // Submit approval is never copied, so bypass expensive byPatchSet call.
-      return getSubmitter(c, byChange(db, notes).get(c));
-    } catch (OrmException e) {
-      return null;
-    }
-  }
-
-  public static PatchSetApproval getSubmitter(PatchSet.Id c, Iterable<PatchSetApproval> approvals) {
-    if (c == null) {
-      return null;
-    }
-    PatchSetApproval submitter = null;
-    for (PatchSetApproval a : approvals) {
-      if (a.getPatchSetId().equals(c) && a.getValue() > 0 && a.isLegacySubmit()) {
-        if (submitter == null || a.getGranted().compareTo(submitter.getGranted()) > 0) {
-          submitter = a;
-        }
-      }
-    }
-    return submitter;
-  }
-
-  public static String renderMessageWithApprovals(
-      int patchSetId, Map<String, Short> n, Map<String, PatchSetApproval> c) {
-    StringBuilder msgs = new StringBuilder("Uploaded patch set " + patchSetId);
-    if (!n.isEmpty()) {
-      boolean first = true;
-      for (Map.Entry<String, Short> e : n.entrySet()) {
-        if (c.containsKey(e.getKey()) && c.get(e.getKey()).getValue() == e.getValue()) {
-          continue;
-        }
-        if (first) {
-          msgs.append(":");
-          first = false;
-        }
-        msgs.append(" ").append(LabelVote.create(e.getKey(), e.getValue()).format());
-      }
-    }
-    return msgs.toString();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ChangeFinder.java b/gerrit-server/src/main/java/com/google/gerrit/server/ChangeFinder.java
deleted file mode 100644
index 46016c9..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/ChangeFinder.java
+++ /dev/null
@@ -1,205 +0,0 @@
-// 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.
-
-package com.google.gerrit.server;
-
-import com.google.common.base.Throwables;
-import com.google.common.cache.Cache;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Sets;
-import com.google.common.primitives.Ints;
-import com.google.gerrit.extensions.restapi.Url;
-import com.google.gerrit.index.IndexConfig;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RevId;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.cache.CacheModule;
-import com.google.gerrit.server.change.ChangeTriplet;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.InternalChangeQuery;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Module;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import com.google.inject.name.Named;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-
-@Singleton
-public class ChangeFinder {
-  private static final String CACHE_NAME = "changeid_project";
-
-  public static Module module() {
-    return new CacheModule() {
-      @Override
-      protected void configure() {
-        cache(CACHE_NAME, Change.Id.class, String.class).maximumWeight(1024);
-      }
-    };
-  }
-
-  private final IndexConfig indexConfig;
-  private final Cache<Change.Id, String> changeIdProjectCache;
-  private final Provider<InternalChangeQuery> queryProvider;
-  private final Provider<ReviewDb> reviewDb;
-  private final ChangeNotes.Factory changeNotesFactory;
-
-  @Inject
-  ChangeFinder(
-      IndexConfig indexConfig,
-      @Named(CACHE_NAME) Cache<Change.Id, String> changeIdProjectCache,
-      Provider<InternalChangeQuery> queryProvider,
-      Provider<ReviewDb> reviewDb,
-      ChangeNotes.Factory changeNotesFactory) {
-    this.indexConfig = indexConfig;
-    this.changeIdProjectCache = changeIdProjectCache;
-    this.queryProvider = queryProvider;
-    this.reviewDb = reviewDb;
-    this.changeNotesFactory = changeNotesFactory;
-  }
-
-  public ChangeNotes findOne(String id) throws OrmException {
-    List<ChangeNotes> ctls = find(id);
-    if (ctls.size() != 1) {
-      return null;
-    }
-    return ctls.get(0);
-  }
-
-  /**
-   * Find changes matching the given identifier.
-   *
-   * @param id change identifier, either a numeric ID, a Change-Id, or project~branch~id triplet.
-   * @return possibly-empty list of notes for all matching changes; may or may not be visible.
-   * @throws OrmException if an error occurred querying the database.
-   */
-  public List<ChangeNotes> find(String id) throws OrmException {
-    if (id.isEmpty()) {
-      return Collections.emptyList();
-    }
-
-    int z = id.lastIndexOf('~');
-    int y = id.lastIndexOf('~', z - 1);
-    if (y < 0 && z > 0) {
-      // Try project~numericChangeId
-      Integer n = Ints.tryParse(id.substring(z + 1));
-      if (n != null) {
-        return fromProjectNumber(id.substring(0, z), n.intValue());
-      }
-    }
-
-    if (y < 0 && z < 0) {
-      // Try numeric changeId
-      Integer n = Ints.tryParse(id);
-      if (n != null) {
-        return find(new Change.Id(n));
-      }
-    }
-
-    // Use the index to search for changes, but don't return any stored fields,
-    // to force rereading in case the index is stale.
-    InternalChangeQuery query = queryProvider.get().noFields();
-
-    // Try commit hash
-    if (id.matches("^([0-9a-fA-F]{" + RevId.ABBREV_LEN + "," + RevId.LEN + "})$")) {
-      return asChangeNotes(query.byCommit(id));
-    }
-
-    if (y > 0 && z > 0) {
-      // Try change triplet (project~branch~Ihash...)
-      Optional<ChangeTriplet> triplet = ChangeTriplet.parse(id, y, z);
-      if (triplet.isPresent()) {
-        ChangeTriplet t = triplet.get();
-        return asChangeNotes(query.byBranchKey(t.branch(), t.id()));
-      }
-    }
-
-    // Try isolated Ihash... format ("Change-Id: Ihash").
-    return asChangeNotes(query.byKeyPrefix(id));
-  }
-
-  private List<ChangeNotes> fromProjectNumber(String project, int changeNumber)
-      throws OrmException {
-    Change.Id cId = new Change.Id(changeNumber);
-    try {
-      return ImmutableList.of(
-          changeNotesFactory.createChecked(reviewDb.get(), Project.NameKey.parse(project), cId));
-    } catch (NoSuchChangeException e) {
-      return Collections.emptyList();
-    } catch (OrmException e) {
-      // Distinguish between a RepositoryNotFoundException (project argument invalid) and
-      // other OrmExceptions (failure in the persistence layer).
-      if (Throwables.getRootCause(e) instanceof RepositoryNotFoundException) {
-        return Collections.emptyList();
-      }
-      throw e;
-    }
-  }
-
-  public ChangeNotes findOne(Change.Id id) throws OrmException {
-    List<ChangeNotes> notes = find(id);
-    if (notes.size() != 1) {
-      throw new NoSuchChangeException(id);
-    }
-    return notes.get(0);
-  }
-
-  public List<ChangeNotes> find(Change.Id id) throws OrmException {
-    String project = changeIdProjectCache.getIfPresent(id);
-    if (project != null) {
-      return fromProjectNumber(project, id.get());
-    }
-
-    // Use the index to search for changes, but don't return any stored fields,
-    // to force rereading in case the index is stale.
-    InternalChangeQuery query = queryProvider.get().noFields();
-    List<ChangeData> r = query.byLegacyChangeId(id);
-    if (r.size() == 1) {
-      changeIdProjectCache.put(id, Url.encode(r.get(0).project().get()));
-    }
-    return asChangeNotes(r);
-  }
-
-  private List<ChangeNotes> asChangeNotes(List<ChangeData> cds) throws OrmException {
-    List<ChangeNotes> notes = new ArrayList<>(cds.size());
-    if (!indexConfig.separateChangeSubIndexes()) {
-      for (ChangeData cd : cds) {
-        notes.add(cd.notes());
-      }
-      return notes;
-    }
-
-    // If an index implementation uses separate non-atomic subindexes, it's possible to temporarily
-    // observe a change as present in both subindexes, if this search is concurrent with a write.
-    // Dedup to avoid confusing the caller. We can choose an arbitrary ChangeData instance because
-    // the index results have no stored fields, so the data is already reloaded. (It's also possible
-    // that a change might appear in zero subindexes, but there's nothing we can do here to help
-    // this case.)
-    Set<Change.Id> seen = Sets.newHashSetWithExpectedSize(cds.size());
-    for (ChangeData cd : cds) {
-      if (seen.add(cd.getId())) {
-        notes.add(cd.notes());
-      }
-    }
-    return notes;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ChangeMessagesUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/ChangeMessagesUtil.java
deleted file mode 100644
index 9aae00b..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/ChangeMessagesUtil.java
+++ /dev/null
@@ -1,144 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.ChangeUpdate;
-import com.google.gerrit.server.notedb.NotesMigration;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.sql.Timestamp;
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-
-/**
- * Utility functions to manipulate ChangeMessages.
- *
- * <p>These methods either query for and update ChangeMessages in the NoteDb or ReviewDb, depending
- * on the state of the NotesMigration.
- */
-@Singleton
-public class ChangeMessagesUtil {
-  public static final String AUTOGENERATED_TAG_PREFIX = "autogenerated:";
-
-  public static final String TAG_ABANDON = AUTOGENERATED_TAG_PREFIX + "gerrit:abandon";
-  public static final String TAG_CHERRY_PICK_CHANGE =
-      AUTOGENERATED_TAG_PREFIX + "gerrit:cherryPickChange";
-  public static final String TAG_DELETE_ASSIGNEE =
-      AUTOGENERATED_TAG_PREFIX + "gerrit:deleteAssignee";
-  public static final String TAG_DELETE_REVIEWER =
-      AUTOGENERATED_TAG_PREFIX + "gerrit:deleteReviewer";
-  public static final String TAG_DELETE_VOTE = AUTOGENERATED_TAG_PREFIX + "gerrit:deleteVote";
-  public static final String TAG_MERGED = AUTOGENERATED_TAG_PREFIX + "gerrit:merged";
-  public static final String TAG_MOVE = AUTOGENERATED_TAG_PREFIX + "gerrit:move";
-  public static final String TAG_RESTORE = AUTOGENERATED_TAG_PREFIX + "gerrit:restore";
-  public static final String TAG_REVERT = AUTOGENERATED_TAG_PREFIX + "gerrit:revert";
-  public static final String TAG_SET_ASSIGNEE = AUTOGENERATED_TAG_PREFIX + "gerrit:setAssignee";
-  public static final String TAG_SET_DESCRIPTION =
-      AUTOGENERATED_TAG_PREFIX + "gerrit:setPsDescription";
-  public static final String TAG_SET_HASHTAGS = AUTOGENERATED_TAG_PREFIX + "gerrit:setHashtag";
-  public static final String TAG_SET_PRIVATE = AUTOGENERATED_TAG_PREFIX + "gerrit:setPrivate";
-  public static final String TAG_SET_READY = AUTOGENERATED_TAG_PREFIX + "gerrit:setReadyForReview";
-  public static final String TAG_SET_TOPIC = AUTOGENERATED_TAG_PREFIX + "gerrit:setTopic";
-  public static final String TAG_SET_WIP = AUTOGENERATED_TAG_PREFIX + "gerrit:setWorkInProgress";
-  public static final String TAG_UNSET_PRIVATE = AUTOGENERATED_TAG_PREFIX + "gerrit:unsetPrivate";
-  public static final String TAG_UPLOADED_PATCH_SET =
-      AUTOGENERATED_TAG_PREFIX + "gerrit:newPatchSet";
-  public static final String TAG_UPLOADED_WIP_PATCH_SET =
-      AUTOGENERATED_TAG_PREFIX + "gerrit:newWipPatchSet";
-
-  public static ChangeMessage newMessage(ChangeContext ctx, String body, @Nullable String tag) {
-    return newMessage(ctx.getChange().currentPatchSetId(), ctx.getUser(), ctx.getWhen(), body, tag);
-  }
-
-  public static ChangeMessage newMessage(
-      PatchSet.Id psId, CurrentUser user, Timestamp when, String body, @Nullable String tag) {
-    checkNotNull(psId);
-    Account.Id accountId = user.isInternalUser() ? null : user.getAccountId();
-    ChangeMessage m =
-        new ChangeMessage(
-            new ChangeMessage.Key(psId.getParentKey(), ChangeUtil.messageUuid()),
-            accountId,
-            when,
-            psId);
-    m.setMessage(body);
-    m.setTag(tag);
-    user.updateRealAccountId(m::setRealAuthor);
-    return m;
-  }
-
-  public static String uploadedPatchSetTag(boolean workInProgress) {
-    return workInProgress ? TAG_UPLOADED_WIP_PATCH_SET : TAG_UPLOADED_PATCH_SET;
-  }
-
-  private static List<ChangeMessage> sortChangeMessages(Iterable<ChangeMessage> changeMessage) {
-    return ChangeNotes.MESSAGE_BY_TIME.sortedCopy(changeMessage);
-  }
-
-  private final NotesMigration migration;
-
-  @VisibleForTesting
-  @Inject
-  public ChangeMessagesUtil(NotesMigration migration) {
-    this.migration = migration;
-  }
-
-  public List<ChangeMessage> byChange(ReviewDb db, ChangeNotes notes) throws OrmException {
-    if (!migration.readChanges()) {
-      return sortChangeMessages(db.changeMessages().byChange(notes.getChangeId()));
-    }
-    return notes.load().getChangeMessages();
-  }
-
-  public Iterable<ChangeMessage> byPatchSet(ReviewDb db, ChangeNotes notes, PatchSet.Id psId)
-      throws OrmException {
-    if (!migration.readChanges()) {
-      return db.changeMessages().byPatchSet(psId);
-    }
-    return notes.load().getChangeMessagesByPatchSet().get(psId);
-  }
-
-  public void addChangeMessage(ReviewDb db, ChangeUpdate update, ChangeMessage changeMessage)
-      throws OrmException {
-    checkState(
-        Objects.equals(changeMessage.getAuthor(), update.getNullableAccountId()),
-        "cannot store change message by %s in update by %s",
-        changeMessage.getAuthor(),
-        update.getNullableAccountId());
-    update.setChangeMessage(changeMessage.getMessage());
-    update.setTag(changeMessage.getTag());
-    db.changeMessages().insert(Collections.singleton(changeMessage));
-  }
-
-  /**
-   * @param tag value of a tag, or null.
-   * @return whether the tag starts with the autogenerated prefix.
-   */
-  public static boolean isAutogenerated(@Nullable String tag) {
-    return tag != null && tag.startsWith(AUTOGENERATED_TAG_PREFIX);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java
deleted file mode 100644
index 56359ce..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server;
-
-import static java.util.Comparator.comparingInt;
-
-import com.google.common.collect.Maps;
-import com.google.common.collect.Ordering;
-import com.google.common.io.BaseEncoding;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.security.SecureRandom;
-import java.util.Map;
-import java.util.Random;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-
-@Singleton
-public class ChangeUtil {
-  public static final int TOPIC_MAX_LENGTH = 2048;
-
-  private static final Random UUID_RANDOM = new SecureRandom();
-  private static final BaseEncoding UUID_ENCODING = BaseEncoding.base16().lowerCase();
-
-  private static final int SUBJECT_MAX_LENGTH = 80;
-  private static final String SUBJECT_CROP_APPENDIX = "...";
-  private static final int SUBJECT_CROP_RANGE = 10;
-
-  public static final Ordering<PatchSet> PS_ID_ORDER =
-      Ordering.from(comparingInt(PatchSet::getPatchSetId));
-
-  public static String formatChangeUrl(String canonicalWebUrl, Change change) {
-    return canonicalWebUrl + "#/c/" + change.getProject().get() + "/+/" + change.getChangeId();
-  }
-
-  /** @return a new unique identifier for change message entities. */
-  public static String messageUuid() {
-    byte[] buf = new byte[8];
-    UUID_RANDOM.nextBytes(buf);
-    return UUID_ENCODING.encode(buf, 0, 4) + '_' + UUID_ENCODING.encode(buf, 4, 4);
-  }
-
-  /**
-   * Get the next patch set ID from a previously-read map of all refs.
-   *
-   * @param allRefs map of full ref name to ref, in the same format returned by {@link
-   *     org.eclipse.jgit.lib.RefDatabase#getRefs(String)} when passing {@code ""}.
-   * @param id previous patch set ID.
-   * @return next unused patch set ID for the same change, skipping any IDs whose corresponding ref
-   *     names appear in the {@code allRefs} map.
-   */
-  public static PatchSet.Id nextPatchSetIdFromAllRefsMap(Map<String, Ref> allRefs, PatchSet.Id id) {
-    PatchSet.Id next = nextPatchSetId(id);
-    while (allRefs.containsKey(next.toRefName())) {
-      next = nextPatchSetId(next);
-    }
-    return next;
-  }
-
-  /**
-   * Get the next patch set ID from a previously-read map of refs below the change prefix.
-   *
-   * @param changeRefs map of ref suffix to SHA-1, where the keys are ref names with the {@code
-   *     refs/changes/CD/ABCD/} prefix stripped. All refs should be under {@code id}'s change ref
-   *     prefix. The keys match the format returned by {@link
-   *     org.eclipse.jgit.lib.RefDatabase#getRefs(String)} when passing the appropriate {@code
-   *     refs/changes/CD/ABCD}.
-   * @param id previous patch set ID.
-   * @return next unused patch set ID for the same change, skipping any IDs whose corresponding ref
-   *     names appear in the {@code changeRefs} map.
-   */
-  public static PatchSet.Id nextPatchSetIdFromChangeRefsMap(
-      Map<String, ObjectId> changeRefs, PatchSet.Id id) {
-    int prefixLen = id.getParentKey().toRefPrefix().length();
-    PatchSet.Id next = nextPatchSetId(id);
-    while (changeRefs.containsKey(next.toRefName().substring(prefixLen))) {
-      next = nextPatchSetId(next);
-    }
-    return next;
-  }
-
-  /**
-   * Get the next patch set ID just looking at a single previous patch set ID.
-   *
-   * <p>This patch set ID may or may not be available in the database; callers that want a
-   * previously-unused ID should use {@link #nextPatchSetIdFromAllRefsMap} or {@link
-   * #nextPatchSetIdFromChangeRefsMap}.
-   *
-   * @param id previous patch set ID.
-   * @return next patch set ID for the same change, incrementing by 1.
-   */
-  public static PatchSet.Id nextPatchSetId(PatchSet.Id id) {
-    return new PatchSet.Id(id.getParentKey(), id.get() + 1);
-  }
-
-  /**
-   * Get the next patch set ID from scanning refs in the repo.
-   *
-   * @param git repository to scan for patch set refs.
-   * @param id previous patch set ID.
-   * @return next unused patch set ID for the same change, skipping any IDs whose corresponding ref
-   *     names appear in the repository.
-   */
-  public static PatchSet.Id nextPatchSetId(Repository git, PatchSet.Id id) throws IOException {
-    return nextPatchSetIdFromChangeRefsMap(
-        Maps.transformValues(
-            git.getRefDatabase().getRefs(id.getParentKey().toRefPrefix()), Ref::getObjectId),
-        id);
-  }
-
-  public static String cropSubject(String subject) {
-    if (subject.length() > SUBJECT_MAX_LENGTH) {
-      int maxLength = SUBJECT_MAX_LENGTH - SUBJECT_CROP_APPENDIX.length();
-      for (int cropPosition = maxLength;
-          cropPosition > maxLength - SUBJECT_CROP_RANGE;
-          cropPosition--) {
-        if (Character.isWhitespace(subject.charAt(cropPosition - 1))) {
-          return subject.substring(0, cropPosition) + SUBJECT_CROP_APPENDIX;
-        }
-      }
-      return subject.substring(0, maxLength) + SUBJECT_CROP_APPENDIX;
-    }
-    return subject;
-  }
-
-  public static String status(Change c) {
-    return c != null ? c.getStatus().name().toLowerCase() : "deleted";
-  }
-
-  private ChangeUtil() {}
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/CmdLineParserModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/CmdLineParserModule.java
deleted file mode 100644
index 63f7202..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/CmdLineParserModule.java
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server;
-
-import com.google.gerrit.extensions.config.FactoryModule;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.server.args4j.AccountGroupIdHandler;
-import com.google.gerrit.server.args4j.AccountGroupUUIDHandler;
-import com.google.gerrit.server.args4j.AccountIdHandler;
-import com.google.gerrit.server.args4j.ChangeIdHandler;
-import com.google.gerrit.server.args4j.ObjectIdHandler;
-import com.google.gerrit.server.args4j.PatchSetIdHandler;
-import com.google.gerrit.server.args4j.ProjectControlHandler;
-import com.google.gerrit.server.args4j.SocketAddressHandler;
-import com.google.gerrit.server.args4j.TimestampHandler;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.util.cli.CmdLineParser;
-import com.google.gerrit.util.cli.OptionHandlerUtil;
-import com.google.gerrit.util.cli.OptionHandlers;
-import java.net.SocketAddress;
-import java.sql.Timestamp;
-import org.eclipse.jgit.lib.ObjectId;
-import org.kohsuke.args4j.spi.OptionHandler;
-
-public class CmdLineParserModule extends FactoryModule {
-  public CmdLineParserModule() {}
-
-  @Override
-  protected void configure() {
-    factory(CmdLineParser.Factory.class);
-    bind(OptionHandlers.class);
-
-    registerOptionHandler(Account.Id.class, AccountIdHandler.class);
-    registerOptionHandler(AccountGroup.Id.class, AccountGroupIdHandler.class);
-    registerOptionHandler(AccountGroup.UUID.class, AccountGroupUUIDHandler.class);
-    registerOptionHandler(Change.Id.class, ChangeIdHandler.class);
-    registerOptionHandler(ObjectId.class, ObjectIdHandler.class);
-    registerOptionHandler(PatchSet.Id.class, PatchSetIdHandler.class);
-    registerOptionHandler(ProjectControl.class, ProjectControlHandler.class);
-    registerOptionHandler(SocketAddress.class, SocketAddressHandler.class);
-    registerOptionHandler(Timestamp.class, TimestampHandler.class);
-  }
-
-  private <T> void registerOptionHandler(Class<T> type, Class<? extends OptionHandler<T>> impl) {
-    install(OptionHandlerUtil.moduleFor(type, impl));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/CommentsUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/CommentsUtil.java
deleted file mode 100644
index 1e6f301..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/CommentsUtil.java
+++ /dev/null
@@ -1,586 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server;
-
-import static com.google.common.base.MoreObjects.firstNonNull;
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.gerrit.reviewdb.client.PatchLineComment.Status.PUBLISHED;
-import static java.util.stream.Collectors.toList;
-import static java.util.stream.Collectors.toSet;
-
-import com.google.common.collect.ComparisonChain;
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Ordering;
-import com.google.common.collect.Streams;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.client.Side;
-import com.google.gerrit.extensions.common.CommentInfo;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.Patch;
-import com.google.gerrit.reviewdb.client.PatchLineComment;
-import com.google.gerrit.reviewdb.client.PatchLineComment.Status;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.client.RobotComment;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.reviewdb.server.ReviewDbUtil;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.config.GerritServerId;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.ChangeUpdate;
-import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
-import com.google.gerrit.server.notedb.NotesMigration;
-import com.google.gerrit.server.patch.PatchListCache;
-import com.google.gerrit.server.patch.PatchListNotAvailableException;
-import com.google.gerrit.server.update.BatchUpdateReviewDb;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.ResultSet;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import org.eclipse.jgit.lib.BatchRefUpdate;
-import org.eclipse.jgit.lib.NullProgressMonitor;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.ReceiveCommand;
-
-/**
- * Utility functions to manipulate Comments.
- *
- * <p>These methods either query for and update Comments in the NoteDb or ReviewDb, depending on the
- * state of the NotesMigration.
- */
-@Singleton
-public class CommentsUtil {
-  public static final Ordering<Comment> COMMENT_ORDER =
-      new Ordering<Comment>() {
-        @Override
-        public int compare(Comment c1, Comment c2) {
-          return ComparisonChain.start()
-              .compare(c1.key.filename, c2.key.filename)
-              .compare(c1.key.patchSetId, c2.key.patchSetId)
-              .compare(c1.side, c2.side)
-              .compare(c1.lineNbr, c2.lineNbr)
-              .compare(c1.writtenOn, c2.writtenOn)
-              .result();
-        }
-      };
-
-  public static final Ordering<CommentInfo> COMMENT_INFO_ORDER =
-      new Ordering<CommentInfo>() {
-        @Override
-        public int compare(CommentInfo a, CommentInfo b) {
-          return ComparisonChain.start()
-              .compare(a.path, b.path, NULLS_FIRST)
-              .compare(a.patchSet, b.patchSet, NULLS_FIRST)
-              .compare(side(a), side(b))
-              .compare(a.line, b.line, NULLS_FIRST)
-              .compare(a.inReplyTo, b.inReplyTo, NULLS_FIRST)
-              .compare(a.message, b.message)
-              .compare(a.id, b.id)
-              .result();
-        }
-
-        private int side(CommentInfo c) {
-          return firstNonNull(c.side, Side.REVISION).ordinal();
-        }
-      };
-
-  public static PatchSet.Id getCommentPsId(Change.Id changeId, Comment comment) {
-    return new PatchSet.Id(changeId, comment.key.patchSetId);
-  }
-
-  public static String extractMessageId(@Nullable String tag) {
-    if (tag == null || !tag.startsWith("mailMessageId=")) {
-      return null;
-    }
-    return tag.substring("mailMessageId=".length());
-  }
-
-  private static final Ordering<Comparable<?>> NULLS_FIRST = Ordering.natural().nullsFirst();
-
-  private final GitRepositoryManager repoManager;
-  private final AllUsersName allUsers;
-  private final NotesMigration migration;
-  private final PatchListCache patchListCache;
-  private final PatchSetUtil psUtil;
-  private final String serverId;
-
-  @Inject
-  CommentsUtil(
-      GitRepositoryManager repoManager,
-      AllUsersName allUsers,
-      NotesMigration migration,
-      PatchListCache patchListCache,
-      PatchSetUtil psUtil,
-      @GerritServerId String serverId) {
-    this.repoManager = repoManager;
-    this.allUsers = allUsers;
-    this.migration = migration;
-    this.patchListCache = patchListCache;
-    this.psUtil = psUtil;
-    this.serverId = serverId;
-  }
-
-  public Comment newComment(
-      ChangeContext ctx,
-      String path,
-      PatchSet.Id psId,
-      short side,
-      String message,
-      @Nullable Boolean unresolved,
-      @Nullable String parentUuid)
-      throws OrmException, UnprocessableEntityException {
-    if (unresolved == null) {
-      if (parentUuid == null) {
-        // Default to false if comment is not descended from another.
-        unresolved = false;
-      } else {
-        // Inherit unresolved value from inReplyTo comment if not specified.
-        Comment.Key key = new Comment.Key(parentUuid, path, psId.patchSetId);
-        Optional<Comment> parent = getPublished(ctx.getDb(), ctx.getNotes(), key);
-        if (!parent.isPresent()) {
-          throw new UnprocessableEntityException("Invalid parentUuid supplied for comment");
-        }
-        unresolved = parent.get().unresolved;
-      }
-    }
-    Comment c =
-        new Comment(
-            new Comment.Key(ChangeUtil.messageUuid(), path, psId.get()),
-            ctx.getUser().getAccountId(),
-            ctx.getWhen(),
-            side,
-            message,
-            serverId,
-            unresolved);
-    c.parentUuid = parentUuid;
-    ctx.getUser().updateRealAccountId(c::setRealAuthor);
-    return c;
-  }
-
-  public RobotComment newRobotComment(
-      ChangeContext ctx,
-      String path,
-      PatchSet.Id psId,
-      short side,
-      String message,
-      String robotId,
-      String robotRunId) {
-    RobotComment c =
-        new RobotComment(
-            new Comment.Key(ChangeUtil.messageUuid(), path, psId.get()),
-            ctx.getUser().getAccountId(),
-            ctx.getWhen(),
-            side,
-            message,
-            serverId,
-            robotId,
-            robotRunId);
-    ctx.getUser().updateRealAccountId(c::setRealAuthor);
-    return c;
-  }
-
-  public Optional<Comment> getPublished(ReviewDb db, ChangeNotes notes, Comment.Key key)
-      throws OrmException {
-    if (!migration.readChanges()) {
-      return getReviewDb(db, notes, key);
-    }
-    return publishedByChange(db, notes).stream().filter(c -> key.equals(c.key)).findFirst();
-  }
-
-  public Optional<Comment> getDraft(
-      ReviewDb db, ChangeNotes notes, IdentifiedUser user, Comment.Key key) throws OrmException {
-    if (!migration.readChanges()) {
-      Optional<Comment> c = getReviewDb(db, notes, key);
-      if (c.isPresent() && !c.get().author.getId().equals(user.getAccountId())) {
-        throw new OrmException(
-            String.format(
-                "Expected draft %s to belong to account %s, but it belongs to %s",
-                key, user.getAccountId(), c.get().author.getId()));
-      }
-      return c;
-    }
-    return draftByChangeAuthor(db, notes, user.getAccountId()).stream()
-        .filter(c -> key.equals(c.key))
-        .findFirst();
-  }
-
-  private Optional<Comment> getReviewDb(ReviewDb db, ChangeNotes notes, Comment.Key key)
-      throws OrmException {
-    return Optional.ofNullable(
-            db.patchComments().get(PatchLineComment.Key.from(notes.getChangeId(), key)))
-        .map(plc -> plc.asComment(serverId));
-  }
-
-  public List<Comment> publishedByChange(ReviewDb db, ChangeNotes notes) throws OrmException {
-    if (!migration.readChanges()) {
-      return sort(byCommentStatus(db.patchComments().byChange(notes.getChangeId()), PUBLISHED));
-    }
-
-    notes.load();
-    return sort(Lists.newArrayList(notes.getComments().values()));
-  }
-
-  public List<RobotComment> robotCommentsByChange(ChangeNotes notes) throws OrmException {
-    if (!migration.readChanges()) {
-      return ImmutableList.of();
-    }
-
-    notes.load();
-    return sort(Lists.newArrayList(notes.getRobotComments().values()));
-  }
-
-  public List<Comment> draftByChange(ReviewDb db, ChangeNotes notes) throws OrmException {
-    if (!migration.readChanges()) {
-      return sort(byCommentStatus(db.patchComments().byChange(notes.getChangeId()), Status.DRAFT));
-    }
-
-    List<Comment> comments = new ArrayList<>();
-    for (Ref ref : getDraftRefs(notes.getChangeId())) {
-      Account.Id account = Account.Id.fromRefSuffix(ref.getName());
-      if (account != null) {
-        comments.addAll(draftByChangeAuthor(db, notes, account));
-      }
-    }
-    return sort(comments);
-  }
-
-  private List<Comment> byCommentStatus(
-      ResultSet<PatchLineComment> comments, PatchLineComment.Status status) {
-    return toComments(
-        serverId, Lists.newArrayList(Iterables.filter(comments, c -> c.getStatus() == status)));
-  }
-
-  public List<Comment> byPatchSet(ReviewDb db, ChangeNotes notes, PatchSet.Id psId)
-      throws OrmException {
-    if (!migration.readChanges()) {
-      return sort(toComments(serverId, db.patchComments().byPatchSet(psId).toList()));
-    }
-    List<Comment> comments = new ArrayList<>();
-    comments.addAll(publishedByPatchSet(db, notes, psId));
-
-    for (Ref ref : getDraftRefs(notes.getChangeId())) {
-      Account.Id account = Account.Id.fromRefSuffix(ref.getName());
-      if (account != null) {
-        comments.addAll(draftByPatchSetAuthor(db, psId, account, notes));
-      }
-    }
-    return sort(comments);
-  }
-
-  public List<Comment> publishedByChangeFile(
-      ReviewDb db, ChangeNotes notes, Change.Id changeId, String file) throws OrmException {
-    if (!migration.readChanges()) {
-      return sort(
-          toComments(serverId, db.patchComments().publishedByChangeFile(changeId, file).toList()));
-    }
-    return commentsOnFile(notes.load().getComments().values(), file);
-  }
-
-  public List<Comment> publishedByPatchSet(ReviewDb db, ChangeNotes notes, PatchSet.Id psId)
-      throws OrmException {
-    if (!migration.readChanges()) {
-      return removeCommentsOnAncestorOfCommitMessage(
-          sort(toComments(serverId, db.patchComments().publishedByPatchSet(psId).toList())));
-    }
-    return removeCommentsOnAncestorOfCommitMessage(
-        commentsOnPatchSet(notes.load().getComments().values(), psId));
-  }
-
-  public List<RobotComment> robotCommentsByPatchSet(ChangeNotes notes, PatchSet.Id psId)
-      throws OrmException {
-    if (!migration.readChanges()) {
-      return ImmutableList.of();
-    }
-    return commentsOnPatchSet(notes.load().getRobotComments().values(), psId);
-  }
-
-  /**
-   * For the commit message the A side in a diff view is always empty when a comparison against an
-   * ancestor is done, so there can't be any comments on this ancestor. However earlier we showed
-   * the auto-merge commit message on side A when for a merge commit a comparison against the
-   * auto-merge was done. From that time there may still be comments on the auto-merge commit
-   * message and those we want to filter out.
-   */
-  private List<Comment> removeCommentsOnAncestorOfCommitMessage(List<Comment> list) {
-    return list.stream()
-        .filter(c -> c.side != 0 || !Patch.COMMIT_MSG.equals(c.key.filename))
-        .collect(toList());
-  }
-
-  public List<Comment> draftByPatchSetAuthor(
-      ReviewDb db, PatchSet.Id psId, Account.Id author, ChangeNotes notes) throws OrmException {
-    if (!migration.readChanges()) {
-      return sort(
-          toComments(serverId, db.patchComments().draftByPatchSetAuthor(psId, author).toList()));
-    }
-    return commentsOnPatchSet(notes.load().getDraftComments(author).values(), psId);
-  }
-
-  public List<Comment> draftByChangeFileAuthor(
-      ReviewDb db, ChangeNotes notes, String file, Account.Id author) throws OrmException {
-    if (!migration.readChanges()) {
-      return sort(
-          toComments(
-              serverId,
-              db.patchComments()
-                  .draftByChangeFileAuthor(notes.getChangeId(), file, author)
-                  .toList()));
-    }
-    return commentsOnFile(notes.load().getDraftComments(author).values(), file);
-  }
-
-  public List<Comment> draftByChangeAuthor(ReviewDb db, ChangeNotes notes, Account.Id author)
-      throws OrmException {
-    if (!migration.readChanges()) {
-      return Streams.stream(db.patchComments().draftByAuthor(author))
-          .filter(c -> c.getPatchSetId().getParentKey().equals(notes.getChangeId()))
-          .map(plc -> plc.asComment(serverId))
-          .sorted(COMMENT_ORDER)
-          .collect(toList());
-    }
-    List<Comment> comments = new ArrayList<>();
-    comments.addAll(notes.getDraftComments(author).values());
-    return sort(comments);
-  }
-
-  @Deprecated // To be used only by HasDraftByLegacyPredicate.
-  public List<Change.Id> changesWithDraftsByAuthor(ReviewDb db, Account.Id author)
-      throws OrmException {
-    if (!migration.readChanges()) {
-      return FluentIterable.from(db.patchComments().draftByAuthor(author))
-          .transform(plc -> plc.getPatchSetId().getParentKey())
-          .toList();
-    }
-
-    List<Change.Id> changes = new ArrayList<>();
-    try (Repository repo = repoManager.openRepository(allUsers)) {
-      for (String refName : repo.getRefDatabase().getRefs(RefNames.REFS_DRAFT_COMMENTS).keySet()) {
-        Account.Id accountId = Account.Id.fromRefSuffix(refName);
-        Change.Id changeId = Change.Id.fromRefPart(refName);
-        if (accountId == null || changeId == null) {
-          continue;
-        }
-        changes.add(changeId);
-      }
-    } catch (IOException e) {
-      throw new OrmException(e);
-    }
-    return changes;
-  }
-
-  public void putComments(
-      ReviewDb db, ChangeUpdate update, PatchLineComment.Status status, Iterable<Comment> comments)
-      throws OrmException {
-    for (Comment c : comments) {
-      update.putComment(status, c);
-    }
-    db.patchComments().upsert(toPatchLineComments(update.getId(), status, comments));
-  }
-
-  public void putRobotComments(ChangeUpdate update, Iterable<RobotComment> comments) {
-    for (RobotComment c : comments) {
-      update.putRobotComment(c);
-    }
-  }
-
-  public void deleteComments(ReviewDb db, ChangeUpdate update, Iterable<Comment> comments)
-      throws OrmException {
-    for (Comment c : comments) {
-      update.deleteComment(c);
-    }
-    db.patchComments()
-        .delete(toPatchLineComments(update.getId(), PatchLineComment.Status.DRAFT, comments));
-  }
-
-  public void deleteCommentByRewritingHistory(
-      ReviewDb db, ChangeUpdate update, Comment.Key commentKey, PatchSet.Id psId, String newMessage)
-      throws OrmException {
-    if (PrimaryStorage.of(update.getChange()).equals(PrimaryStorage.REVIEW_DB)) {
-      PatchLineComment.Key key =
-          new PatchLineComment.Key(new Patch.Key(psId, commentKey.filename), commentKey.uuid);
-
-      if (db instanceof BatchUpdateReviewDb) {
-        db = ((BatchUpdateReviewDb) db).unsafeGetDelegate();
-      }
-      db = ReviewDbUtil.unwrapDb(db);
-
-      PatchLineComment patchLineComment = db.patchComments().get(key);
-
-      if (!patchLineComment.getStatus().equals(PUBLISHED)) {
-        throw new OrmException(String.format("comment %s is not published", key));
-      }
-
-      patchLineComment.setMessage(newMessage);
-      db.patchComments().upsert(Collections.singleton(patchLineComment));
-    }
-
-    update.deleteCommentByRewritingHistory(commentKey.uuid, newMessage);
-  }
-
-  public void deleteAllDraftsFromAllUsers(Change.Id changeId) throws IOException {
-    try (Repository repo = repoManager.openRepository(allUsers);
-        RevWalk rw = new RevWalk(repo)) {
-      BatchRefUpdate bru = repo.getRefDatabase().newBatchUpdate();
-      for (Ref ref : getDraftRefs(repo, changeId)) {
-        bru.addCommand(new ReceiveCommand(ref.getObjectId(), ObjectId.zeroId(), ref.getName()));
-      }
-      bru.setRefLogMessage("Delete drafts from NoteDb", false);
-      bru.execute(rw, NullProgressMonitor.INSTANCE);
-      for (ReceiveCommand cmd : bru.getCommands()) {
-        if (cmd.getResult() != ReceiveCommand.Result.OK) {
-          throw new IOException(
-              String.format(
-                  "Failed to delete draft comment ref %s at %s: %s (%s)",
-                  cmd.getRefName(), cmd.getOldId(), cmd.getResult(), cmd.getMessage()));
-        }
-      }
-    }
-  }
-
-  private static List<Comment> commentsOnFile(Collection<Comment> allComments, String file) {
-    List<Comment> result = new ArrayList<>(allComments.size());
-    for (Comment c : allComments) {
-      String currentFilename = c.key.filename;
-      if (currentFilename.equals(file)) {
-        result.add(c);
-      }
-    }
-    return sort(result);
-  }
-
-  private static <T extends Comment> List<T> commentsOnPatchSet(
-      Collection<T> allComments, PatchSet.Id psId) {
-    List<T> result = new ArrayList<>(allComments.size());
-    for (T c : allComments) {
-      if (c.key.patchSetId == psId.get()) {
-        result.add(c);
-      }
-    }
-    return sort(result);
-  }
-
-  public static void setCommentRevId(Comment c, PatchListCache cache, Change change, PatchSet ps)
-      throws PatchListNotAvailableException {
-    checkArgument(
-        c.key.patchSetId == ps.getId().get(),
-        "cannot set RevId for patch set %s on comment %s",
-        ps.getId(),
-        c);
-    if (c.revId == null) {
-      if (Side.fromShort(c.side) == Side.PARENT) {
-        if (c.side < 0) {
-          c.revId = ObjectId.toString(cache.getOldId(change, ps, -c.side));
-        } else {
-          c.revId = ObjectId.toString(cache.getOldId(change, ps, null));
-        }
-      } else {
-        c.revId = ps.getRevision().get();
-      }
-    }
-  }
-
-  /**
-   * Get NoteDb draft refs for a change.
-   *
-   * <p>Works if NoteDb is not enabled, but the results are not meaningful.
-   *
-   * <p>This is just a simple ref scan, so the results may potentially include refs for zombie draft
-   * comments. A zombie draft is one which has been published but the write to delete the draft ref
-   * from All-Users failed.
-   *
-   * @param changeId change ID.
-   * @return raw refs from All-Users repo.
-   */
-  public Collection<Ref> getDraftRefs(Change.Id changeId) throws OrmException {
-    try (Repository repo = repoManager.openRepository(allUsers)) {
-      return getDraftRefs(repo, changeId);
-    } catch (IOException e) {
-      throw new OrmException(e);
-    }
-  }
-
-  private Collection<Ref> getDraftRefs(Repository repo, Change.Id changeId) throws IOException {
-    return repo.getRefDatabase().getRefs(RefNames.refsDraftCommentsPrefix(changeId)).values();
-  }
-
-  private static <T extends Comment> List<T> sort(List<T> comments) {
-    Collections.sort(comments, COMMENT_ORDER);
-    return comments;
-  }
-
-  public static Iterable<PatchLineComment> toPatchLineComments(
-      Change.Id changeId, PatchLineComment.Status status, Iterable<Comment> comments) {
-    return FluentIterable.from(comments).transform(c -> PatchLineComment.from(changeId, status, c));
-  }
-
-  public static List<Comment> toComments(
-      final String serverId, Iterable<PatchLineComment> comments) {
-    return COMMENT_ORDER.sortedCopy(
-        FluentIterable.from(comments).transform(plc -> plc.asComment(serverId)));
-  }
-
-  public void publish(
-      ChangeContext ctx, PatchSet.Id psId, Collection<Comment> drafts, @Nullable String tag)
-      throws OrmException {
-    ChangeNotes notes = ctx.getNotes();
-    checkArgument(notes != null);
-    if (drafts.isEmpty()) {
-      return;
-    }
-
-    Map<PatchSet.Id, PatchSet> patchSets =
-        psUtil.getAsMap(
-            ctx.getDb(), notes, drafts.stream().map(d -> psId(notes, d)).collect(toSet()));
-    for (Comment d : drafts) {
-      PatchSet ps = patchSets.get(psId(notes, d));
-      if (ps == null) {
-        throw new OrmException("patch set " + ps + " not found");
-      }
-      d.writtenOn = ctx.getWhen();
-      d.tag = tag;
-      // Draft may have been created by a different real user; copy the current real user. (Only
-      // applies to X-Gerrit-RunAs, since modifying drafts via on_behalf_of is not allowed.)
-      ctx.getUser().updateRealAccountId(d::setRealAuthor);
-      try {
-        setCommentRevId(d, patchListCache, notes.getChange(), ps);
-      } catch (PatchListNotAvailableException e) {
-        throw new OrmException(e);
-      }
-    }
-    putComments(ctx.getDb(), ctx.getUpdate(psId), PUBLISHED, drafts);
-  }
-
-  private static PatchSet.Id psId(ChangeNotes notes, Comment c) {
-    return new PatchSet.Id(notes.getChangeId(), c.key.patchSetId);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/CurrentUser.java b/gerrit-server/src/main/java/com/google/gerrit/server/CurrentUser.java
deleted file mode 100644
index 0959e04..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/CurrentUser.java
+++ /dev/null
@@ -1,162 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.account.GroupMembership;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.inject.servlet.RequestScoped;
-import java.util.function.Consumer;
-
-/**
- * Information about the currently logged in user.
- *
- * <p>This is a {@link RequestScoped} property managed by Guice.
- *
- * @see AnonymousUser
- * @see IdentifiedUser
- */
-public abstract class CurrentUser {
-  /** Unique key for plugin/extension specific data on a CurrentUser. */
-  public static final class PropertyKey<T> {
-    public static <T> PropertyKey<T> create() {
-      return new PropertyKey<>();
-    }
-
-    private PropertyKey() {}
-  }
-
-  private AccessPath accessPath = AccessPath.UNKNOWN;
-  private PropertyKey<ExternalId.Key> lastLoginExternalIdPropertyKey = PropertyKey.create();
-
-  /** How this user is accessing the Gerrit Code Review application. */
-  public final AccessPath getAccessPath() {
-    return accessPath;
-  }
-
-  public void setAccessPath(AccessPath path) {
-    accessPath = path;
-  }
-
-  /**
-   * Identity of the authenticated user.
-   *
-   * <p>In the normal case where a user authenticates as themselves {@code getRealUser() == this}.
-   *
-   * <p>If {@code X-Gerrit-RunAs} or {@code suexec} was used this method returns the identity of the
-   * account that has permission to act on behalf of this user.
-   */
-  public CurrentUser getRealUser() {
-    return this;
-  }
-
-  public boolean isImpersonating() {
-    return false;
-  }
-
-  /**
-   * If the {@link #getRealUser()} has an account ID associated with it, call the given setter with
-   * that ID.
-   */
-  public void updateRealAccountId(Consumer<Account.Id> setter) {
-    if (getRealUser().isIdentifiedUser()) {
-      setter.accept(getRealUser().getAccountId());
-    }
-  }
-
-  /**
-   * Get the set of groups the user is currently a member of.
-   *
-   * <p>The returned set may be a subset of the user's actual groups; if the user's account is
-   * currently deemed to be untrusted then the effective group set is only the anonymous and
-   * registered user groups. To enable additional groups (and gain their granted permissions) the
-   * user must update their account to use only trusted authentication providers.
-   *
-   * @return active groups for this user.
-   */
-  public abstract GroupMembership getEffectiveGroups();
-
-  /** Unique name of the user on this server, if one has been assigned. */
-  public String getUserName() {
-    return null;
-  }
-
-  /** Check if user is the IdentifiedUser */
-  public boolean isIdentifiedUser() {
-    return false;
-  }
-
-  /** Cast to IdentifiedUser if possible. */
-  public IdentifiedUser asIdentifiedUser() {
-    throw new UnsupportedOperationException(
-        getClass().getSimpleName() + " is not an IdentifiedUser");
-  }
-
-  /**
-   * Return account ID if {@link #isIdentifiedUser} is true.
-   *
-   * @throws UnsupportedOperationException if the user is not logged in.
-   */
-  public Account.Id getAccountId() {
-    throw new UnsupportedOperationException(
-        getClass().getSimpleName() + " is not an IdentifiedUser");
-  }
-
-  /** Check if the CurrentUser is an InternalUser. */
-  public boolean isInternalUser() {
-    return false;
-  }
-
-  /**
-   * Lookup a previously stored property.
-   *
-   * @param key unique property key.
-   * @return previously stored value, or {@code null}.
-   */
-  @Nullable
-  public <T> T get(PropertyKey<T> key) {
-    return null;
-  }
-
-  /**
-   * Store a property for later retrieval.
-   *
-   * @param key unique property key.
-   * @param value value to store; or {@code null} to clear the value.
-   */
-  public <T> void put(PropertyKey<T> key, @Nullable T value) {}
-
-  public void setLastLoginExternalIdKey(ExternalId.Key externalIdKey) {
-    put(lastLoginExternalIdPropertyKey, externalIdKey);
-  }
-
-  public ExternalId.Key getLastLoginExternalIdKey() {
-    return get(lastLoginExternalIdPropertyKey);
-  }
-
-  /**
-   * Checks if the current user has the same account id of another.
-   *
-   * <p>Provide a generic interface for allowing subclasses to define whether two accounts represent
-   * the same account id.
-   *
-   * @param other user to compare
-   * @return true if the two users have the same account id
-   */
-  public boolean hasSameAccountId(CurrentUser other) {
-    return false;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/GerritPersonIdent.java b/gerrit-server/src/main/java/com/google/gerrit/server/GerritPersonIdent.java
deleted file mode 100644
index 5d259b3..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/GerritPersonIdent.java
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server;
-
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-import com.google.inject.BindingAnnotation;
-import java.lang.annotation.Retention;
-
-/**
- * Marker on a {@link org.eclipse.jgit.lib.PersonIdent} pointing to the identity representing Gerrit
- * server itself.
- */
-@Retention(RUNTIME)
-@BindingAnnotation
-public @interface GerritPersonIdent {}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/IdentifiedUser.java b/gerrit-server/src/main/java/com/google/gerrit/server/IdentifiedUser.java
deleted file mode 100644
index 37f43a0..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/IdentifiedUser.java
+++ /dev/null
@@ -1,522 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Sets;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.GroupMembership;
-import com.google.gerrit.server.account.ListGroupMembership;
-import com.google.gerrit.server.account.Realm;
-import com.google.gerrit.server.config.AnonymousCowardName;
-import com.google.gerrit.server.config.AuthConfig;
-import com.google.gerrit.server.config.CanonicalWebUrl;
-import com.google.gerrit.server.config.DisableReverseDnsLookup;
-import com.google.gerrit.server.group.SystemGroupBackend;
-import com.google.inject.Inject;
-import com.google.inject.OutOfScopeException;
-import com.google.inject.Provider;
-import com.google.inject.ProvisionException;
-import com.google.inject.Singleton;
-import com.google.inject.util.Providers;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.MalformedURLException;
-import java.net.SocketAddress;
-import java.net.URL;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-import java.util.TimeZone;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.util.SystemReader;
-
-/** An authenticated user. */
-public class IdentifiedUser extends CurrentUser {
-  /** Create an IdentifiedUser, ignoring any per-request state. */
-  @Singleton
-  public static class GenericFactory {
-    private final AuthConfig authConfig;
-    private final Realm realm;
-    private final String anonymousCowardName;
-    private final Provider<String> canonicalUrl;
-    private final AccountCache accountCache;
-    private final GroupBackend groupBackend;
-    private final Boolean disableReverseDnsLookup;
-
-    @Inject
-    public GenericFactory(
-        AuthConfig authConfig,
-        Realm realm,
-        @AnonymousCowardName String anonymousCowardName,
-        @CanonicalWebUrl Provider<String> canonicalUrl,
-        @DisableReverseDnsLookup Boolean disableReverseDnsLookup,
-        AccountCache accountCache,
-        GroupBackend groupBackend) {
-      this.authConfig = authConfig;
-      this.realm = realm;
-      this.anonymousCowardName = anonymousCowardName;
-      this.canonicalUrl = canonicalUrl;
-      this.accountCache = accountCache;
-      this.groupBackend = groupBackend;
-      this.disableReverseDnsLookup = disableReverseDnsLookup;
-    }
-
-    public IdentifiedUser create(AccountState state) {
-      return new IdentifiedUser(
-          authConfig,
-          realm,
-          anonymousCowardName,
-          canonicalUrl,
-          accountCache,
-          groupBackend,
-          disableReverseDnsLookup,
-          Providers.of((SocketAddress) null),
-          state,
-          null);
-    }
-
-    public IdentifiedUser create(Account.Id id) {
-      return create((SocketAddress) null, id);
-    }
-
-    public IdentifiedUser create(SocketAddress remotePeer, Account.Id id) {
-      return runAs(remotePeer, id, null);
-    }
-
-    public IdentifiedUser runAs(
-        SocketAddress remotePeer, Account.Id id, @Nullable CurrentUser caller) {
-      return new IdentifiedUser(
-          authConfig,
-          realm,
-          anonymousCowardName,
-          canonicalUrl,
-          accountCache,
-          groupBackend,
-          disableReverseDnsLookup,
-          Providers.of(remotePeer),
-          id,
-          caller);
-    }
-  }
-
-  /**
-   * Create an IdentifiedUser, relying on current request state.
-   *
-   * <p>Can only be used from within a module that has defined request scoped {@code @RemotePeer
-   * SocketAddress} and {@code ReviewDb} providers.
-   */
-  @Singleton
-  public static class RequestFactory {
-    private final AuthConfig authConfig;
-    private final Realm realm;
-    private final String anonymousCowardName;
-    private final Provider<String> canonicalUrl;
-    private final AccountCache accountCache;
-    private final GroupBackend groupBackend;
-    private final Boolean disableReverseDnsLookup;
-    private final Provider<SocketAddress> remotePeerProvider;
-
-    @Inject
-    RequestFactory(
-        AuthConfig authConfig,
-        Realm realm,
-        @AnonymousCowardName String anonymousCowardName,
-        @CanonicalWebUrl Provider<String> canonicalUrl,
-        AccountCache accountCache,
-        GroupBackend groupBackend,
-        @DisableReverseDnsLookup Boolean disableReverseDnsLookup,
-        @RemotePeer Provider<SocketAddress> remotePeerProvider) {
-      this.authConfig = authConfig;
-      this.realm = realm;
-      this.anonymousCowardName = anonymousCowardName;
-      this.canonicalUrl = canonicalUrl;
-      this.accountCache = accountCache;
-      this.groupBackend = groupBackend;
-      this.disableReverseDnsLookup = disableReverseDnsLookup;
-      this.remotePeerProvider = remotePeerProvider;
-    }
-
-    public IdentifiedUser create(Account.Id id) {
-      return new IdentifiedUser(
-          authConfig,
-          realm,
-          anonymousCowardName,
-          canonicalUrl,
-          accountCache,
-          groupBackend,
-          disableReverseDnsLookup,
-          remotePeerProvider,
-          id,
-          null);
-    }
-
-    public IdentifiedUser runAs(Account.Id id, CurrentUser caller) {
-      return new IdentifiedUser(
-          authConfig,
-          realm,
-          anonymousCowardName,
-          canonicalUrl,
-          accountCache,
-          groupBackend,
-          disableReverseDnsLookup,
-          remotePeerProvider,
-          id,
-          caller);
-    }
-  }
-
-  private static final GroupMembership registeredGroups =
-      new ListGroupMembership(
-          ImmutableSet.of(SystemGroupBackend.ANONYMOUS_USERS, SystemGroupBackend.REGISTERED_USERS));
-
-  private final Provider<String> canonicalUrl;
-  private final AccountCache accountCache;
-  private final AuthConfig authConfig;
-  private final Realm realm;
-  private final GroupBackend groupBackend;
-  private final String anonymousCowardName;
-  private final Boolean disableReverseDnsLookup;
-  private final Set<String> validEmails = Sets.newTreeSet(String.CASE_INSENSITIVE_ORDER);
-
-  private final Provider<SocketAddress> remotePeerProvider;
-  private final Account.Id accountId;
-
-  private AccountState state;
-  private boolean loadedAllEmails;
-  private Set<String> invalidEmails;
-  private GroupMembership effectiveGroups;
-  private CurrentUser realUser;
-  private Map<PropertyKey<Object>, Object> properties;
-
-  private IdentifiedUser(
-      AuthConfig authConfig,
-      Realm realm,
-      String anonymousCowardName,
-      Provider<String> canonicalUrl,
-      AccountCache accountCache,
-      GroupBackend groupBackend,
-      Boolean disableReverseDnsLookup,
-      @Nullable Provider<SocketAddress> remotePeerProvider,
-      AccountState state,
-      @Nullable CurrentUser realUser) {
-    this(
-        authConfig,
-        realm,
-        anonymousCowardName,
-        canonicalUrl,
-        accountCache,
-        groupBackend,
-        disableReverseDnsLookup,
-        remotePeerProvider,
-        state.getAccount().getId(),
-        realUser);
-    this.state = state;
-  }
-
-  private IdentifiedUser(
-      AuthConfig authConfig,
-      Realm realm,
-      String anonymousCowardName,
-      Provider<String> canonicalUrl,
-      AccountCache accountCache,
-      GroupBackend groupBackend,
-      Boolean disableReverseDnsLookup,
-      @Nullable Provider<SocketAddress> remotePeerProvider,
-      Account.Id id,
-      @Nullable CurrentUser realUser) {
-    this.canonicalUrl = canonicalUrl;
-    this.accountCache = accountCache;
-    this.groupBackend = groupBackend;
-    this.authConfig = authConfig;
-    this.realm = realm;
-    this.anonymousCowardName = anonymousCowardName;
-    this.disableReverseDnsLookup = disableReverseDnsLookup;
-    this.remotePeerProvider = remotePeerProvider;
-    this.accountId = id;
-    this.realUser = realUser != null ? realUser : this;
-  }
-
-  @Override
-  public CurrentUser getRealUser() {
-    return realUser;
-  }
-
-  @Override
-  public boolean isImpersonating() {
-    if (realUser == this) {
-      return false;
-    }
-    if (realUser.isIdentifiedUser()) {
-      if (realUser.getAccountId().equals(getAccountId())) {
-        // Impersonating another copy of this user is allowed.
-        return false;
-      }
-    }
-    return true;
-  }
-
-  public AccountState state() {
-    if (state == null) {
-      state = accountCache.get(getAccountId());
-    }
-    return state;
-  }
-
-  @Override
-  public IdentifiedUser asIdentifiedUser() {
-    return this;
-  }
-
-  @Override
-  public Account.Id getAccountId() {
-    return accountId;
-  }
-
-  /** @return the user's user name; null if one has not been selected/assigned. */
-  @Override
-  public String getUserName() {
-    return state().getUserName();
-  }
-
-  public Account getAccount() {
-    return state().getAccount();
-  }
-
-  public boolean hasEmailAddress(String email) {
-    if (validEmails.contains(email)) {
-      return true;
-    } else if (invalidEmails != null && invalidEmails.contains(email)) {
-      return false;
-    } else if (realm.hasEmailAddress(this, email)) {
-      validEmails.add(email);
-      return true;
-    } else if (invalidEmails == null) {
-      invalidEmails = Sets.newTreeSet(String.CASE_INSENSITIVE_ORDER);
-    }
-    invalidEmails.add(email);
-    return false;
-  }
-
-  public Set<String> getEmailAddresses() {
-    if (!loadedAllEmails) {
-      validEmails.addAll(realm.getEmailAddresses(this));
-      loadedAllEmails = true;
-    }
-    return validEmails;
-  }
-
-  public String getName() {
-    return getAccount().getName(anonymousCowardName);
-  }
-
-  public String getNameEmail() {
-    return getAccount().getNameEmail(anonymousCowardName);
-  }
-
-  @Override
-  public GroupMembership getEffectiveGroups() {
-    if (effectiveGroups == null) {
-      if (authConfig.isIdentityTrustable(state().getExternalIds())) {
-        effectiveGroups = groupBackend.membershipsOf(this);
-      } else {
-        effectiveGroups = registeredGroups;
-      }
-    }
-    return effectiveGroups;
-  }
-
-  public PersonIdent newRefLogIdent() {
-    return newRefLogIdent(new Date(), TimeZone.getDefault());
-  }
-
-  public PersonIdent newRefLogIdent(Date when, TimeZone tz) {
-    final Account ua = getAccount();
-
-    String name = ua.getFullName();
-    if (name == null || name.isEmpty()) {
-      name = ua.getPreferredEmail();
-    }
-    if (name == null || name.isEmpty()) {
-      name = anonymousCowardName;
-    }
-
-    String user = getUserName();
-    if (user == null) {
-      user = "";
-    }
-    user = user + "|account-" + ua.getId().toString();
-
-    return new PersonIdent(name, user + "@" + guessHost(), when, tz);
-  }
-
-  public PersonIdent newCommitterIdent(Date when, TimeZone tz) {
-    final Account ua = getAccount();
-    String name = ua.getFullName();
-    String email = ua.getPreferredEmail();
-
-    if (email == null || email.isEmpty()) {
-      // No preferred email is configured. Use a generic identity so we
-      // don't leak an address the user may have given us, but doesn't
-      // necessarily want to publish through Git records.
-      //
-      String user = getUserName();
-      if (user == null || user.isEmpty()) {
-        user = "account-" + ua.getId().toString();
-      }
-
-      String host;
-      if (canonicalUrl.get() != null) {
-        try {
-          host = new URL(canonicalUrl.get()).getHost();
-        } catch (MalformedURLException e) {
-          host = SystemReader.getInstance().getHostname();
-        }
-      } else {
-        host = SystemReader.getInstance().getHostname();
-      }
-
-      email = user + "@" + host;
-    }
-
-    if (name == null || name.isEmpty()) {
-      final int at = email.indexOf('@');
-      if (0 < at) {
-        name = email.substring(0, at);
-      } else {
-        name = anonymousCowardName;
-      }
-    }
-
-    return new PersonIdent(name, email, when, tz);
-  }
-
-  @Override
-  public String toString() {
-    return "IdentifiedUser[account " + getAccountId() + "]";
-  }
-
-  /** Check if user is the IdentifiedUser */
-  @Override
-  public boolean isIdentifiedUser() {
-    return true;
-  }
-
-  @Override
-  @Nullable
-  public synchronized <T> T get(PropertyKey<T> key) {
-    if (properties != null) {
-      @SuppressWarnings("unchecked")
-      T value = (T) properties.get(key);
-      return value;
-    }
-    return null;
-  }
-
-  /**
-   * Store a property for later retrieval.
-   *
-   * @param key unique property key.
-   * @param value value to store; or {@code null} to clear the value.
-   */
-  @Override
-  public synchronized <T> void put(PropertyKey<T> key, @Nullable T value) {
-    if (properties == null) {
-      if (value == null) {
-        return;
-      }
-      properties = new HashMap<>();
-    }
-
-    @SuppressWarnings("unchecked")
-    PropertyKey<Object> k = (PropertyKey<Object>) key;
-    if (value != null) {
-      properties.put(k, value);
-    } else {
-      properties.remove(k);
-    }
-  }
-
-  /**
-   * Returns a materialized copy of the user with all dependencies.
-   *
-   * <p>Invoke all providers and factories of dependent objects and store the references to a copy
-   * of the current identified user.
-   *
-   * @return copy of the identified user
-   */
-  public IdentifiedUser materializedCopy() {
-    Provider<SocketAddress> remotePeer;
-    try {
-      remotePeer = Providers.of(remotePeerProvider.get());
-    } catch (OutOfScopeException | ProvisionException e) {
-      remotePeer =
-          new Provider<SocketAddress>() {
-            @Override
-            public SocketAddress get() {
-              throw e;
-            }
-          };
-    }
-    return new IdentifiedUser(
-        authConfig,
-        realm,
-        anonymousCowardName,
-        Providers.of(canonicalUrl.get()),
-        accountCache,
-        groupBackend,
-        disableReverseDnsLookup,
-        remotePeer,
-        state,
-        realUser);
-  }
-
-  @Override
-  public boolean hasSameAccountId(CurrentUser other) {
-    return getAccountId().get() == other.getAccountId().get();
-  }
-
-  private String guessHost() {
-    String host = null;
-    SocketAddress remotePeer = null;
-    try {
-      remotePeer = remotePeerProvider.get();
-    } catch (OutOfScopeException | ProvisionException e) {
-      // Leave null.
-    }
-    if (remotePeer instanceof InetSocketAddress) {
-      InetSocketAddress sa = (InetSocketAddress) remotePeer;
-      InetAddress in = sa.getAddress();
-      host = in != null ? getHost(in) : sa.getHostName();
-    }
-    if (Strings.isNullOrEmpty(host)) {
-      return "unknown";
-    }
-    return host;
-  }
-
-  private String getHost(InetAddress in) {
-    if (Boolean.FALSE.equals(disableReverseDnsLookup)) {
-      return in.getCanonicalHostName();
-    }
-    return in.getHostAddress();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/InternalUser.java b/gerrit-server/src/main/java/com/google/gerrit/server/InternalUser.java
deleted file mode 100644
index 821a0c6..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/InternalUser.java
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server;
-
-import com.google.gerrit.server.account.GroupMembership;
-
-/**
- * User identity for plugin code that needs an identity.
- *
- * <p>An InternalUser has no real identity, it acts as the server and can access anything it wants,
- * anytime it wants, given the JVM's own direct access to data. Plugins may use this when they need
- * to have a CurrentUser with read permission on anything.
- *
- * @see PluginUser
- */
-public class InternalUser extends CurrentUser {
-  public interface Factory {
-    InternalUser create();
-  }
-
-  @Override
-  public GroupMembership getEffectiveGroups() {
-    return GroupMembership.EMPTY;
-  }
-
-  @Override
-  public boolean isInternalUser() {
-    return true;
-  }
-
-  @Override
-  public String toString() {
-    return "InternalUser";
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/LibModuleLoader.java b/gerrit-server/src/main/java/com/google/gerrit/server/LibModuleLoader.java
deleted file mode 100644
index 4ec7d2d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/LibModuleLoader.java
+++ /dev/null
@@ -1,61 +0,0 @@
-// 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.
-
-package com.google.gerrit.server;
-
-import static java.util.stream.Collectors.toList;
-
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.inject.Injector;
-import com.google.inject.Key;
-import com.google.inject.Module;
-import com.google.inject.ProvisionException;
-import java.util.Arrays;
-import java.util.List;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Loads configured Guice modules from {@code gerrit.installModule}. */
-public class LibModuleLoader {
-  private static final Logger log = LoggerFactory.getLogger(LibModuleLoader.class);
-
-  public static List<Module> loadModules(Injector parent) {
-    Config cfg = getConfig(parent);
-    return Arrays.stream(cfg.getStringList("gerrit", null, "installModule"))
-        .map(m -> createModule(parent, m))
-        .collect(toList());
-  }
-
-  private static Config getConfig(Injector i) {
-    return i.getInstance(Key.get(Config.class, GerritServerConfig.class));
-  }
-
-  private static Module createModule(Injector injector, String className) {
-    Module m = injector.getInstance(loadModule(className));
-    log.info("Installed module {}", className);
-    return m;
-  }
-
-  @SuppressWarnings("unchecked")
-  private static Class<Module> loadModule(String className) {
-    try {
-      return (Class<Module>) Class.forName(className);
-    } catch (ClassNotFoundException | LinkageError e) {
-      String msg = "Cannot load LibModule " + className;
-      log.error(msg, e);
-      throw new ProvisionException(msg, e);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/PatchSetUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/PatchSetUtil.java
deleted file mode 100644
index 82ca8d2..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/PatchSetUtil.java
+++ /dev/null
@@ -1,158 +0,0 @@
-// 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.
-
-package com.google.gerrit.server;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.collect.ImmutableMap.toImmutableMap;
-import static com.google.gerrit.server.ChangeUtil.PS_ID_ORDER;
-import static com.google.gerrit.server.notedb.PatchSetState.PUBLISHED;
-import static java.util.function.Function.identity;
-
-import com.google.common.collect.ImmutableCollection;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import com.google.common.collect.Streams;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.RevId;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.ChangeUpdate;
-import com.google.gerrit.server.notedb.NotesMigration;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-/** Utilities for manipulating patch sets. */
-@Singleton
-public class PatchSetUtil {
-  private final NotesMigration migration;
-
-  @Inject
-  PatchSetUtil(NotesMigration migration) {
-    this.migration = migration;
-  }
-
-  public PatchSet current(ReviewDb db, ChangeNotes notes) throws OrmException {
-    return get(db, notes, notes.getChange().currentPatchSetId());
-  }
-
-  public PatchSet get(ReviewDb db, ChangeNotes notes, PatchSet.Id psId) throws OrmException {
-    if (!migration.readChanges()) {
-      return db.patchSets().get(psId);
-    }
-    return notes.load().getPatchSets().get(psId);
-  }
-
-  public ImmutableCollection<PatchSet> byChange(ReviewDb db, ChangeNotes notes)
-      throws OrmException {
-    if (!migration.readChanges()) {
-      return PS_ID_ORDER.immutableSortedCopy(db.patchSets().byChange(notes.getChangeId()));
-    }
-    return notes.load().getPatchSets().values();
-  }
-
-  public ImmutableMap<PatchSet.Id, PatchSet> byChangeAsMap(ReviewDb db, ChangeNotes notes)
-      throws OrmException {
-    if (!migration.readChanges()) {
-      ImmutableMap.Builder<PatchSet.Id, PatchSet> result = ImmutableMap.builder();
-      for (PatchSet ps : PS_ID_ORDER.sortedCopy(db.patchSets().byChange(notes.getChangeId()))) {
-        result.put(ps.getId(), ps);
-      }
-      return result.build();
-    }
-    return notes.load().getPatchSets();
-  }
-
-  public ImmutableMap<PatchSet.Id, PatchSet> getAsMap(
-      ReviewDb db, ChangeNotes notes, Set<PatchSet.Id> patchSetIds) throws OrmException {
-    if (!migration.readChanges()) {
-      patchSetIds = Sets.filter(patchSetIds, p -> p.getParentKey().equals(notes.getChangeId()));
-      return Streams.stream(db.patchSets().get(patchSetIds))
-          .sorted(PS_ID_ORDER)
-          .collect(toImmutableMap(PatchSet::getId, identity()));
-    }
-    return ImmutableMap.copyOf(Maps.filterKeys(notes.load().getPatchSets(), patchSetIds::contains));
-  }
-
-  public PatchSet insert(
-      ReviewDb db,
-      RevWalk rw,
-      ChangeUpdate update,
-      PatchSet.Id psId,
-      ObjectId commit,
-      List<String> groups,
-      String pushCertificate,
-      String description)
-      throws OrmException, IOException {
-    checkNotNull(groups, "groups may not be null");
-    ensurePatchSetMatches(psId, update);
-
-    PatchSet ps = new PatchSet(psId);
-    ps.setRevision(new RevId(commit.name()));
-    ps.setUploader(update.getAccountId());
-    ps.setCreatedOn(new Timestamp(update.getWhen().getTime()));
-    ps.setGroups(groups);
-    ps.setPushCertificate(pushCertificate);
-    ps.setDescription(description);
-    db.patchSets().insert(Collections.singleton(ps));
-
-    update.setCommit(rw, commit, pushCertificate);
-    update.setPsDescription(description);
-    update.setGroups(groups);
-
-    return ps;
-  }
-
-  public void publish(ReviewDb db, ChangeUpdate update, PatchSet ps) throws OrmException {
-    ensurePatchSetMatches(ps.getId(), update);
-    update.setPatchSetState(PUBLISHED);
-    db.patchSets().update(Collections.singleton(ps));
-  }
-
-  private void ensurePatchSetMatches(PatchSet.Id psId, ChangeUpdate update) {
-    Change.Id changeId = update.getChange().getId();
-    checkArgument(
-        psId.getParentKey().equals(changeId),
-        "cannot modify patch set %s on update for change %s",
-        psId,
-        changeId);
-    if (update.getPatchSetId() != null) {
-      checkArgument(
-          update.getPatchSetId().equals(psId),
-          "cannot modify patch set %s on update for %s",
-          psId,
-          update.getPatchSetId());
-    } else {
-      update.setPatchSetId(psId);
-    }
-  }
-
-  public void setGroups(ReviewDb db, ChangeUpdate update, PatchSet ps, List<String> groups)
-      throws OrmException {
-    ps.setGroups(groups);
-    update.setGroups(groups);
-    db.patchSets().update(Collections.singleton(ps));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/PeerDaemonUser.java b/gerrit-server/src/main/java/com/google/gerrit/server/PeerDaemonUser.java
deleted file mode 100644
index 8a8b67a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/PeerDaemonUser.java
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.server;
-
-import com.google.gerrit.server.account.GroupMembership;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.net.SocketAddress;
-
-/** Identity of a peer daemon process that isn't this JVM. */
-public class PeerDaemonUser extends CurrentUser {
-  /** Magic username used by peers when they authenticate. */
-  public static final String USER_NAME = "Gerrit Code Review";
-
-  public interface Factory {
-    PeerDaemonUser create(@Assisted SocketAddress peer);
-  }
-
-  private final SocketAddress peer;
-
-  @Inject
-  protected PeerDaemonUser(@Assisted SocketAddress peer) {
-    this.peer = peer;
-  }
-
-  @Override
-  public GroupMembership getEffectiveGroups() {
-    return GroupMembership.EMPTY;
-  }
-
-  public SocketAddress getRemoteAddress() {
-    return peer;
-  }
-
-  @Override
-  public String toString() {
-    return "PeerDaemon[address " + getRemoteAddress() + "]";
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/PluginUser.java b/gerrit-server/src/main/java/com/google/gerrit/server/PluginUser.java
deleted file mode 100644
index 09f5043..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/PluginUser.java
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server;
-
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-
-/** User identity for plugin code that needs an identity. */
-public class PluginUser extends InternalUser {
-  public interface Factory {
-    PluginUser create(String pluginName);
-  }
-
-  private final String pluginName;
-
-  @Inject
-  protected PluginUser(@Assisted String pluginName) {
-    this.pluginName = pluginName;
-  }
-
-  @Override
-  public String getUserName() {
-    return "plugin " + pluginName;
-  }
-
-  @Override
-  public String toString() {
-    return "PluginUser[" + pluginName + "]";
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/RequestCleanup.java b/gerrit-server/src/main/java/com/google/gerrit/server/RequestCleanup.java
deleted file mode 100644
index ea60682..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/RequestCleanup.java
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server;
-
-import com.google.inject.servlet.RequestScoped;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Registers cleanup activities to be completed when a scope ends. */
-@RequestScoped
-public class RequestCleanup implements Runnable {
-  private static final Logger log = LoggerFactory.getLogger(RequestCleanup.class);
-
-  private final List<Runnable> cleanup = new LinkedList<>();
-  private boolean ran;
-
-  /** Register a task to be completed after the request ends. */
-  public void add(Runnable task) {
-    synchronized (cleanup) {
-      if (ran) {
-        throw new IllegalStateException("Request has already been cleaned up");
-      }
-      cleanup.add(task);
-    }
-  }
-
-  @Override
-  public void run() {
-    synchronized (cleanup) {
-      ran = true;
-      for (Iterator<Runnable> i = cleanup.iterator(); i.hasNext(); ) {
-        try {
-          i.next().run();
-        } catch (Throwable err) {
-          log.error("Failed to execute per-request cleanup", err);
-        }
-        i.remove();
-      }
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ReviewerByEmailSet.java b/gerrit-server/src/main/java/com/google/gerrit/server/ReviewerByEmailSet.java
deleted file mode 100644
index c16c9c8..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/ReviewerByEmailSet.java
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ImmutableTable;
-import com.google.common.collect.Table;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.notedb.ReviewerStateInternal;
-import java.sql.Timestamp;
-
-/**
- * Set of reviewers on a change that do not have a Gerrit account and were added by email instead.
- *
- * <p>A given account may appear in multiple states and at different timestamps. No reviewers with
- * state {@link ReviewerStateInternal#REMOVED} are ever exposed by this interface.
- */
-public class ReviewerByEmailSet {
-  private static final ReviewerByEmailSet EMPTY = new ReviewerByEmailSet(ImmutableTable.of());
-
-  public static ReviewerByEmailSet fromTable(
-      Table<ReviewerStateInternal, Address, Timestamp> table) {
-    return new ReviewerByEmailSet(table);
-  }
-
-  public static ReviewerByEmailSet empty() {
-    return EMPTY;
-  }
-
-  private final ImmutableTable<ReviewerStateInternal, Address, Timestamp> table;
-  private ImmutableSet<Address> users;
-
-  private ReviewerByEmailSet(Table<ReviewerStateInternal, Address, Timestamp> table) {
-    this.table = ImmutableTable.copyOf(table);
-  }
-
-  public ImmutableSet<Address> all() {
-    if (users == null) {
-      // Idempotent and immutable, don't bother locking.
-      users = ImmutableSet.copyOf(table.columnKeySet());
-    }
-    return users;
-  }
-
-  public ImmutableSet<Address> byState(ReviewerStateInternal state) {
-    return table.row(state).keySet();
-  }
-
-  public ImmutableTable<ReviewerStateInternal, Address, Timestamp> asTable() {
-    return table;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    return (o instanceof ReviewerByEmailSet) && table.equals(((ReviewerByEmailSet) o).table);
-  }
-
-  @Override
-  public int hashCode() {
-    return table.hashCode();
-  }
-
-  @Override
-  public String toString() {
-    return getClass().getSimpleName() + table;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ReviewerRecommender.java b/gerrit-server/src/main/java/com/google/gerrit/server/ReviewerRecommender.java
deleted file mode 100644
index e9e68b6..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/ReviewerRecommender.java
+++ /dev/null
@@ -1,282 +0,0 @@
-// 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.
-
-package com.google.gerrit.server;
-
-import static com.google.gerrit.server.notedb.ReviewerStateInternal.REVIEWER;
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.index.query.QueryParseException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.account.AccountDirectory.FillOptions;
-import com.google.gerrit.server.account.AccountLoader;
-import com.google.gerrit.server.change.ReviewerSuggestion;
-import com.google.gerrit.server.change.SuggestReviewers;
-import com.google.gerrit.server.change.SuggestedReviewer;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.git.WorkQueue;
-import com.google.gerrit.server.index.change.ChangeField;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.ChangeQueryBuilder;
-import com.google.gerrit.server.query.change.InternalChangeQuery;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Stream;
-import org.apache.commons.lang.mutable.MutableDouble;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ReviewerRecommender {
-  private static final Logger log = LoggerFactory.getLogger(ReviewerRecommender.class);
-  private static final double BASE_REVIEWER_WEIGHT = 10;
-  private static final double BASE_OWNER_WEIGHT = 1;
-  private static final double BASE_COMMENT_WEIGHT = 0.5;
-  private static final double[] WEIGHTS =
-      new double[] {
-        BASE_REVIEWER_WEIGHT, BASE_OWNER_WEIGHT, BASE_COMMENT_WEIGHT,
-      };
-  private static final long PLUGIN_QUERY_TIMEOUT = 500; // ms
-
-  private final ChangeQueryBuilder changeQueryBuilder;
-  private final Config config;
-  private final DynamicMap<ReviewerSuggestion> reviewerSuggestionPluginMap;
-  private final Provider<InternalChangeQuery> queryProvider;
-  private final WorkQueue workQueue;
-  private final Provider<ReviewDb> dbProvider;
-  private final ApprovalsUtil approvalsUtil;
-
-  @Inject
-  ReviewerRecommender(
-      ChangeQueryBuilder changeQueryBuilder,
-      DynamicMap<ReviewerSuggestion> reviewerSuggestionPluginMap,
-      Provider<InternalChangeQuery> queryProvider,
-      WorkQueue workQueue,
-      Provider<ReviewDb> dbProvider,
-      ApprovalsUtil approvalsUtil,
-      @GerritServerConfig Config config) {
-    Set<FillOptions> fillOptions = EnumSet.of(FillOptions.SECONDARY_EMAILS);
-    fillOptions.addAll(AccountLoader.DETAILED_OPTIONS);
-    this.changeQueryBuilder = changeQueryBuilder;
-    this.config = config;
-    this.queryProvider = queryProvider;
-    this.reviewerSuggestionPluginMap = reviewerSuggestionPluginMap;
-    this.workQueue = workQueue;
-    this.dbProvider = dbProvider;
-    this.approvalsUtil = approvalsUtil;
-  }
-
-  public List<Account.Id> suggestReviewers(
-      ChangeNotes changeNotes,
-      SuggestReviewers suggestReviewers,
-      ProjectState projectState,
-      List<Account.Id> candidateList)
-      throws OrmException, IOException, ConfigInvalidException {
-    String query = suggestReviewers.getQuery();
-    double baseWeight = config.getInt("addReviewer", "baseWeight", 1);
-
-    Map<Account.Id, MutableDouble> reviewerScores;
-    if (Strings.isNullOrEmpty(query)) {
-      reviewerScores = baseRankingForEmptyQuery(baseWeight);
-    } else {
-      reviewerScores = baseRankingForCandidateList(candidateList, projectState, baseWeight);
-    }
-
-    // Send the query along with a candidate list to all plugins and merge the
-    // results. Plugins don't necessarily need to use the candidates list, they
-    // can also return non-candidate account ids.
-    List<Callable<Set<SuggestedReviewer>>> tasks =
-        new ArrayList<>(reviewerSuggestionPluginMap.plugins().size());
-    List<Double> weights = new ArrayList<>(reviewerSuggestionPluginMap.plugins().size());
-
-    for (DynamicMap.Entry<ReviewerSuggestion> plugin : reviewerSuggestionPluginMap) {
-      tasks.add(
-          () ->
-              plugin
-                  .getProvider()
-                  .get()
-                  .suggestReviewers(
-                      projectState.getNameKey(),
-                      changeNotes != null ? changeNotes.getChangeId() : null,
-                      query,
-                      reviewerScores.keySet()));
-      String key = plugin.getPluginName() + "-" + plugin.getExportName();
-      String pluginWeight = config.getString("addReviewer", key, "weight");
-      if (Strings.isNullOrEmpty(pluginWeight)) {
-        pluginWeight = "1";
-      }
-      log.debug("weight for {}: {}", key, pluginWeight);
-      try {
-        weights.add(Double.parseDouble(pluginWeight));
-      } catch (NumberFormatException e) {
-        log.error("Exception while parsing weight for {}", key, e);
-        weights.add(1d);
-      }
-    }
-
-    try {
-      List<Future<Set<SuggestedReviewer>>> futures =
-          workQueue.getDefaultQueue().invokeAll(tasks, PLUGIN_QUERY_TIMEOUT, TimeUnit.MILLISECONDS);
-      Iterator<Double> weightIterator = weights.iterator();
-      for (Future<Set<SuggestedReviewer>> f : futures) {
-        double weight = weightIterator.next();
-        for (SuggestedReviewer s : f.get()) {
-          if (reviewerScores.containsKey(s.account)) {
-            reviewerScores.get(s.account).add(s.score * weight);
-          } else {
-            reviewerScores.put(s.account, new MutableDouble(s.score * weight));
-          }
-        }
-      }
-    } catch (ExecutionException | InterruptedException e) {
-      log.error("Exception while suggesting reviewers", e);
-      return ImmutableList.of();
-    }
-
-    if (changeNotes != null) {
-      // Remove change owner
-      reviewerScores.remove(changeNotes.getChange().getOwner());
-
-      // Remove existing reviewers
-      reviewerScores
-          .keySet()
-          .removeAll(approvalsUtil.getReviewers(dbProvider.get(), changeNotes).byState(REVIEWER));
-    }
-
-    // Sort results
-    Stream<Entry<Account.Id, MutableDouble>> sorted =
-        reviewerScores.entrySet().stream()
-            .sorted(Collections.reverseOrder(Map.Entry.comparingByValue()));
-    List<Account.Id> sortedSuggestions = sorted.map(Map.Entry::getKey).collect(toList());
-    return sortedSuggestions;
-  }
-
-  private Map<Account.Id, MutableDouble> baseRankingForEmptyQuery(double baseWeight)
-      throws OrmException, IOException, ConfigInvalidException {
-    // Get the user's last 25 changes, check approvals
-    try {
-      List<ChangeData> result =
-          queryProvider
-              .get()
-              .setLimit(25)
-              .setRequestedFields(ImmutableSet.of(ChangeField.APPROVAL.getName()))
-              .query(changeQueryBuilder.owner("self"));
-      Map<Account.Id, MutableDouble> suggestions = new HashMap<>();
-      for (ChangeData cd : result) {
-        for (PatchSetApproval approval : cd.currentApprovals()) {
-          Account.Id id = approval.getAccountId();
-          if (suggestions.containsKey(id)) {
-            suggestions.get(id).add(baseWeight);
-          } else {
-            suggestions.put(id, new MutableDouble(baseWeight));
-          }
-        }
-      }
-      return suggestions;
-    } catch (QueryParseException e) {
-      // Unhandled, because owner:self will never provoke a QueryParseException
-      log.error("Exception while suggesting reviewers", e);
-      return ImmutableMap.of();
-    }
-  }
-
-  private Map<Account.Id, MutableDouble> baseRankingForCandidateList(
-      List<Account.Id> candidates, ProjectState projectState, double baseWeight)
-      throws OrmException, IOException, ConfigInvalidException {
-    // Get each reviewer's activity based on number of applied labels
-    // (weighted 10d), number of comments (weighted 0.5d) and number of owned
-    // changes (weighted 1d).
-    Map<Account.Id, MutableDouble> reviewers = new LinkedHashMap<>();
-    if (candidates.size() == 0) {
-      return reviewers;
-    }
-    List<Predicate<ChangeData>> predicates = new ArrayList<>();
-    for (Account.Id id : candidates) {
-      try {
-        Predicate<ChangeData> projectQuery = changeQueryBuilder.project(projectState.getName());
-
-        // Get all labels for this project and create a compound OR query to
-        // fetch all changes where users have applied one of these labels
-        List<LabelType> labelTypes = projectState.getLabelTypes().getLabelTypes();
-        List<Predicate<ChangeData>> labelPredicates = new ArrayList<>(labelTypes.size());
-        for (LabelType type : labelTypes) {
-          labelPredicates.add(changeQueryBuilder.label(type.getName() + ",user=" + id));
-        }
-        Predicate<ChangeData> reviewerQuery =
-            Predicate.and(projectQuery, Predicate.or(labelPredicates));
-
-        Predicate<ChangeData> ownerQuery =
-            Predicate.and(projectQuery, changeQueryBuilder.owner(id.toString()));
-        Predicate<ChangeData> commentedByQuery =
-            Predicate.and(projectQuery, changeQueryBuilder.commentby(id.toString()));
-
-        predicates.add(reviewerQuery);
-        predicates.add(ownerQuery);
-        predicates.add(commentedByQuery);
-        reviewers.put(id, new MutableDouble());
-      } catch (QueryParseException e) {
-        // Unhandled: If an exception is thrown, we won't increase the
-        // candidates's score
-        log.error("Exception while suggesting reviewers", e);
-      }
-    }
-
-    List<List<ChangeData>> result =
-        queryProvider.get().setLimit(25).setRequestedFields(ImmutableSet.of()).query(predicates);
-
-    Iterator<List<ChangeData>> queryResultIterator = result.iterator();
-    Iterator<Account.Id> reviewersIterator = reviewers.keySet().iterator();
-
-    int i = 0;
-    Account.Id currentId = null;
-    while (queryResultIterator.hasNext()) {
-      List<ChangeData> currentResult = queryResultIterator.next();
-      if (i % WEIGHTS.length == 0) {
-        currentId = reviewersIterator.next();
-      }
-
-      reviewers.get(currentId).add(WEIGHTS[i % WEIGHTS.length] * baseWeight * currentResult.size());
-      i++;
-    }
-    return reviewers;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ReviewersUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/ReviewersUtil.java
deleted file mode 100644
index dadef31..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/ReviewersUtil.java
+++ /dev/null
@@ -1,340 +0,0 @@
-// 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.
-
-package com.google.gerrit.server;
-
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.extensions.common.GroupBaseInfo;
-import com.google.gerrit.extensions.common.SuggestedReviewerInfo;
-import com.google.gerrit.extensions.restapi.Url;
-import com.google.gerrit.index.query.QueryParseException;
-import com.google.gerrit.index.query.QueryResult;
-import com.google.gerrit.metrics.Description;
-import com.google.gerrit.metrics.Description.Units;
-import com.google.gerrit.metrics.MetricMaker;
-import com.google.gerrit.metrics.Timer0;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.account.AccountDirectory.FillOptions;
-import com.google.gerrit.server.account.AccountLoader;
-import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.GroupMembers;
-import com.google.gerrit.server.change.PostReviewers;
-import com.google.gerrit.server.change.SuggestReviewers;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.query.account.AccountPredicates;
-import com.google.gerrit.server.query.account.AccountQueryBuilder;
-import com.google.gerrit.server.query.account.AccountQueryProcessor;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.List;
-import java.util.Objects;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-public class ReviewersUtil {
-  @Singleton
-  private static class Metrics {
-    final Timer0 queryAccountsLatency;
-    final Timer0 recommendAccountsLatency;
-    final Timer0 loadAccountsLatency;
-    final Timer0 queryGroupsLatency;
-    final Timer0 filterVisibility;
-
-    @Inject
-    Metrics(MetricMaker metricMaker) {
-      queryAccountsLatency =
-          metricMaker.newTimer(
-              "reviewer_suggestion/query_accounts",
-              new Description("Latency for querying accounts for reviewer suggestion")
-                  .setCumulative()
-                  .setUnit(Units.MILLISECONDS));
-      recommendAccountsLatency =
-          metricMaker.newTimer(
-              "reviewer_suggestion/recommend_accounts",
-              new Description("Latency for recommending accounts for reviewer suggestion")
-                  .setCumulative()
-                  .setUnit(Units.MILLISECONDS));
-      loadAccountsLatency =
-          metricMaker.newTimer(
-              "reviewer_suggestion/load_accounts",
-              new Description("Latency for loading accounts for reviewer suggestion")
-                  .setCumulative()
-                  .setUnit(Units.MILLISECONDS));
-      queryGroupsLatency =
-          metricMaker.newTimer(
-              "reviewer_suggestion/query_groups",
-              new Description("Latency for querying groups for reviewer suggestion")
-                  .setCumulative()
-                  .setUnit(Units.MILLISECONDS));
-      filterVisibility =
-          metricMaker.newTimer(
-              "reviewer_suggestion/filter_visibility",
-              new Description("Latency for removing users that can't see the change")
-                  .setCumulative()
-                  .setUnit(Units.MILLISECONDS));
-    }
-  }
-
-  // Generate a candidate list at 2x the size of what the user wants to see to
-  // give the ranking algorithm a good set of candidates it can work with
-  private static final int CANDIDATE_LIST_MULTIPLIER = 2;
-
-  private final AccountLoader accountLoader;
-  private final AccountQueryBuilder accountQueryBuilder;
-  private final Provider<AccountQueryProcessor> queryProvider;
-  private final GroupBackend groupBackend;
-  private final GroupMembers.Factory groupMembersFactory;
-  private final Provider<CurrentUser> currentUser;
-  private final ReviewerRecommender reviewerRecommender;
-  private final Metrics metrics;
-
-  @Inject
-  ReviewersUtil(
-      AccountLoader.Factory accountLoaderFactory,
-      AccountQueryBuilder accountQueryBuilder,
-      Provider<AccountQueryProcessor> queryProvider,
-      GroupBackend groupBackend,
-      GroupMembers.Factory groupMembersFactory,
-      Provider<CurrentUser> currentUser,
-      ReviewerRecommender reviewerRecommender,
-      Metrics metrics) {
-    Set<FillOptions> fillOptions = EnumSet.of(FillOptions.SECONDARY_EMAILS);
-    fillOptions.addAll(AccountLoader.DETAILED_OPTIONS);
-    this.accountLoader = accountLoaderFactory.create(fillOptions);
-    this.accountQueryBuilder = accountQueryBuilder;
-    this.queryProvider = queryProvider;
-    this.currentUser = currentUser;
-    this.groupBackend = groupBackend;
-    this.groupMembersFactory = groupMembersFactory;
-    this.reviewerRecommender = reviewerRecommender;
-    this.metrics = metrics;
-  }
-
-  public interface VisibilityControl {
-    boolean isVisibleTo(Account.Id account) throws OrmException;
-  }
-
-  public List<SuggestedReviewerInfo> suggestReviewers(
-      ChangeNotes changeNotes,
-      SuggestReviewers suggestReviewers,
-      ProjectState projectState,
-      VisibilityControl visibilityControl,
-      boolean excludeGroups)
-      throws IOException, OrmException, ConfigInvalidException {
-    String query = suggestReviewers.getQuery();
-    int limit = suggestReviewers.getLimit();
-
-    if (!suggestReviewers.getSuggestAccounts()) {
-      return Collections.emptyList();
-    }
-
-    List<Account.Id> candidateList = new ArrayList<>();
-    if (!Strings.isNullOrEmpty(query)) {
-      candidateList = suggestAccounts(suggestReviewers);
-    }
-
-    List<Account.Id> sortedRecommendations =
-        recommendAccounts(changeNotes, suggestReviewers, projectState, candidateList);
-
-    // Filter accounts by visibility and enforce limit
-    List<Account.Id> filteredRecommendations = new ArrayList<>();
-    try (Timer0.Context ctx = metrics.filterVisibility.start()) {
-      for (Account.Id reviewer : sortedRecommendations) {
-        if (filteredRecommendations.size() >= limit) {
-          break;
-        }
-        if (visibilityControl.isVisibleTo(reviewer)) {
-          filteredRecommendations.add(reviewer);
-        }
-      }
-    }
-
-    List<SuggestedReviewerInfo> suggestedReviewer = loadAccounts(filteredRecommendations);
-    if (!excludeGroups && suggestedReviewer.size() < limit && !Strings.isNullOrEmpty(query)) {
-      // Add groups at the end as individual accounts are usually more
-      // important.
-      suggestedReviewer.addAll(
-          suggestAccountGroups(
-              suggestReviewers, projectState, visibilityControl, limit - suggestedReviewer.size()));
-    }
-
-    if (suggestedReviewer.size() <= limit) {
-      return suggestedReviewer;
-    }
-    return suggestedReviewer.subList(0, limit);
-  }
-
-  private List<Account.Id> suggestAccounts(SuggestReviewers suggestReviewers) throws OrmException {
-    try (Timer0.Context ctx = metrics.queryAccountsLatency.start()) {
-      try {
-        QueryResult<AccountState> result =
-            queryProvider
-                .get()
-                .setUserProvidedLimit(suggestReviewers.getLimit() * CANDIDATE_LIST_MULTIPLIER)
-                .query(
-                    AccountPredicates.andActive(
-                        accountQueryBuilder.defaultQuery(suggestReviewers.getQuery())));
-        return result.entities().stream().map(a -> a.getAccount().getId()).collect(toList());
-      } catch (QueryParseException e) {
-        return ImmutableList.of();
-      }
-    }
-  }
-
-  private List<Account.Id> recommendAccounts(
-      ChangeNotes changeNotes,
-      SuggestReviewers suggestReviewers,
-      ProjectState projectState,
-      List<Account.Id> candidateList)
-      throws OrmException, IOException, ConfigInvalidException {
-    try (Timer0.Context ctx = metrics.recommendAccountsLatency.start()) {
-      return reviewerRecommender.suggestReviewers(
-          changeNotes, suggestReviewers, projectState, candidateList);
-    }
-  }
-
-  private List<SuggestedReviewerInfo> loadAccounts(List<Account.Id> accountIds)
-      throws OrmException {
-    try (Timer0.Context ctx = metrics.loadAccountsLatency.start()) {
-      List<SuggestedReviewerInfo> reviewer =
-          accountIds.stream()
-              .map(accountLoader::get)
-              .filter(Objects::nonNull)
-              .map(
-                  a -> {
-                    SuggestedReviewerInfo info = new SuggestedReviewerInfo();
-                    info.account = a;
-                    info.count = 1;
-                    return info;
-                  })
-              .collect(toList());
-      accountLoader.fill();
-      return reviewer;
-    }
-  }
-
-  private List<SuggestedReviewerInfo> suggestAccountGroups(
-      SuggestReviewers suggestReviewers,
-      ProjectState projectState,
-      VisibilityControl visibilityControl,
-      int limit)
-      throws OrmException, IOException {
-    try (Timer0.Context ctx = metrics.queryGroupsLatency.start()) {
-      List<SuggestedReviewerInfo> groups = new ArrayList<>();
-      for (GroupReference g : suggestAccountGroups(suggestReviewers, projectState)) {
-        GroupAsReviewer result =
-            suggestGroupAsReviewer(
-                suggestReviewers, projectState.getProject(), g, visibilityControl);
-        if (result.allowed || result.allowedWithConfirmation) {
-          GroupBaseInfo info = new GroupBaseInfo();
-          info.id = Url.encode(g.getUUID().get());
-          info.name = g.getName();
-          SuggestedReviewerInfo suggestedReviewerInfo = new SuggestedReviewerInfo();
-          suggestedReviewerInfo.group = info;
-          suggestedReviewerInfo.count = result.size;
-          if (result.allowedWithConfirmation) {
-            suggestedReviewerInfo.confirm = true;
-          }
-          groups.add(suggestedReviewerInfo);
-          if (groups.size() >= limit) {
-            break;
-          }
-        }
-      }
-      return groups;
-    }
-  }
-
-  private List<GroupReference> suggestAccountGroups(
-      SuggestReviewers suggestReviewers, ProjectState projectState) {
-    return Lists.newArrayList(
-        Iterables.limit(
-            groupBackend.suggest(suggestReviewers.getQuery(), projectState),
-            suggestReviewers.getLimit()));
-  }
-
-  private static class GroupAsReviewer {
-    boolean allowed;
-    boolean allowedWithConfirmation;
-    int size;
-  }
-
-  private GroupAsReviewer suggestGroupAsReviewer(
-      SuggestReviewers suggestReviewers,
-      Project project,
-      GroupReference group,
-      VisibilityControl visibilityControl)
-      throws OrmException, IOException {
-    GroupAsReviewer result = new GroupAsReviewer();
-    int maxAllowed = suggestReviewers.getMaxAllowed();
-    int maxAllowedWithoutConfirmation = suggestReviewers.getMaxAllowedWithoutConfirmation();
-
-    if (!PostReviewers.isLegalReviewerGroup(group.getUUID())) {
-      return result;
-    }
-
-    try {
-      Set<Account> members =
-          groupMembersFactory
-              .create(currentUser.get())
-              .listAccounts(group.getUUID(), project.getNameKey());
-
-      if (members.isEmpty()) {
-        return result;
-      }
-
-      result.size = members.size();
-      if (maxAllowed > 0 && result.size > maxAllowed) {
-        return result;
-      }
-
-      boolean needsConfirmation = result.size > maxAllowedWithoutConfirmation;
-
-      // require that at least one member in the group can see the change
-      for (Account account : members) {
-        if (visibilityControl.isVisibleTo(account.getId())) {
-          if (needsConfirmation) {
-            result.allowedWithConfirmation = true;
-          } else {
-            result.allowed = true;
-          }
-          return result;
-        }
-      }
-    } catch (NoSuchGroupException e) {
-      return result;
-    } catch (NoSuchProjectException e) {
-      return result;
-    }
-
-    return result;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/Sequences.java b/gerrit-server/src/main/java/com/google/gerrit/server/Sequences.java
deleted file mode 100644
index 930f3f3..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/Sequences.java
+++ /dev/null
@@ -1,146 +0,0 @@
-// 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.
-
-package com.google.gerrit.server;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.metrics.Description;
-import com.google.gerrit.metrics.Description.Units;
-import com.google.gerrit.metrics.Field;
-import com.google.gerrit.metrics.MetricMaker;
-import com.google.gerrit.metrics.Timer2;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.notedb.NotesMigration;
-import com.google.gerrit.server.notedb.RepoSequence;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.ArrayList;
-import java.util.List;
-import org.eclipse.jgit.lib.Config;
-
-@Singleton
-public class Sequences {
-  public static final String NAME_ACCOUNTS = "accounts";
-  public static final String NAME_CHANGES = "changes";
-
-  public static int getChangeSequenceGap(Config cfg) {
-    return cfg.getInt("noteDb", "changes", "initialSequenceGap", 1000);
-  }
-
-  private enum SequenceType {
-    ACCOUNTS,
-    CHANGES;
-  }
-
-  private final Provider<ReviewDb> db;
-  private final NotesMigration migration;
-  private final RepoSequence accountSeq;
-  private final RepoSequence changeSeq;
-  private final Timer2<SequenceType, Boolean> nextIdLatency;
-
-  @Inject
-  Sequences(
-      @GerritServerConfig Config cfg,
-      Provider<ReviewDb> db,
-      NotesMigration migration,
-      GitRepositoryManager repoManager,
-      GitReferenceUpdated gitRefUpdated,
-      AllProjectsName allProjects,
-      AllUsersName allUsers,
-      MetricMaker metrics) {
-    this.db = db;
-    this.migration = migration;
-
-    int accountBatchSize = cfg.getInt("noteDb", "accounts", "sequenceBatchSize", 1);
-    accountSeq =
-        new RepoSequence(
-            repoManager,
-            gitRefUpdated,
-            allUsers,
-            NAME_ACCOUNTS,
-            () -> ReviewDb.FIRST_ACCOUNT_ID,
-            accountBatchSize);
-
-    int gap = getChangeSequenceGap(cfg);
-    @SuppressWarnings("deprecation")
-    RepoSequence.Seed changeSeed = () -> db.get().nextChangeId() + gap;
-    int changeBatchSize = cfg.getInt("noteDb", "changes", "sequenceBatchSize", 20);
-    changeSeq =
-        new RepoSequence(
-            repoManager, gitRefUpdated, allProjects, NAME_CHANGES, changeSeed, changeBatchSize);
-
-    nextIdLatency =
-        metrics.newTimer(
-            "sequence/next_id_latency",
-            new Description("Latency of requesting IDs from repo sequences")
-                .setCumulative()
-                .setUnit(Units.MILLISECONDS),
-            Field.ofEnum(SequenceType.class, "sequence"),
-            Field.ofBoolean("multiple"));
-  }
-
-  public int nextAccountId() throws OrmException {
-    try (Timer2.Context timer = nextIdLatency.start(SequenceType.ACCOUNTS, false)) {
-      return accountSeq.next();
-    }
-  }
-
-  public int nextChangeId() throws OrmException {
-    if (!migration.readChangeSequence()) {
-      return nextChangeId(db.get());
-    }
-    try (Timer2.Context timer = nextIdLatency.start(SequenceType.CHANGES, false)) {
-      return changeSeq.next();
-    }
-  }
-
-  public ImmutableList<Integer> nextChangeIds(int count) throws OrmException {
-    if (migration.readChangeSequence()) {
-      try (Timer2.Context timer = nextIdLatency.start(SequenceType.CHANGES, count > 1)) {
-        return changeSeq.next(count);
-      }
-    }
-
-    if (count == 0) {
-      return ImmutableList.of();
-    }
-    checkArgument(count > 0, "count is negative: %s", count);
-    List<Integer> ids = new ArrayList<>(count);
-    ReviewDb db = this.db.get();
-    for (int i = 0; i < count; i++) {
-      ids.add(nextChangeId(db));
-    }
-    return ImmutableList.copyOf(ids);
-  }
-
-  @VisibleForTesting
-  public RepoSequence getChangeIdRepoSequence() {
-    return changeSeq;
-  }
-
-  @SuppressWarnings("deprecation")
-  private static int nextChangeId(ReviewDb db) throws OrmException {
-    return db.nextChangeId();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/StarredChangesUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/StarredChangesUtil.java
deleted file mode 100644
index d4fa3a8..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/StarredChangesUtil.java
+++ /dev/null
@@ -1,510 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.stream.Collectors.joining;
-import static java.util.stream.Collectors.toSet;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.base.CharMatcher;
-import com.google.common.base.Joiner;
-import com.google.common.base.Splitter;
-import com.google.common.collect.ImmutableListMultimap;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ImmutableSortedSet;
-import com.google.common.collect.Sets;
-import com.google.common.primitives.Ints;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.change.ChangeResource;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.index.change.ChangeField;
-import com.google.gerrit.server.index.change.ChangeIndexer;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.InternalChangeQuery;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
-import java.util.SortedSet;
-import java.util.TreeSet;
-import org.eclipse.jgit.lib.BatchRefUpdate;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.NullProgressMonitor;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.ObjectLoader;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.RefDatabase;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.ReceiveCommand;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class StarredChangesUtil {
-  @AutoValue
-  public abstract static class StarField {
-    private static final String SEPARATOR = ":";
-
-    public static StarField parse(String s) {
-      int p = s.indexOf(SEPARATOR);
-      if (p >= 0) {
-        Integer id = Ints.tryParse(s.substring(0, p));
-        if (id == null) {
-          return null;
-        }
-        Account.Id accountId = new Account.Id(id);
-        String label = s.substring(p + 1);
-        return create(accountId, label);
-      }
-      return null;
-    }
-
-    public static StarField create(Account.Id accountId, String label) {
-      return new AutoValue_StarredChangesUtil_StarField(accountId, label);
-    }
-
-    public abstract Account.Id accountId();
-
-    public abstract String label();
-
-    @Override
-    public String toString() {
-      return accountId() + SEPARATOR + label();
-    }
-  }
-
-  @AutoValue
-  public abstract static class StarRef {
-    private static final StarRef MISSING =
-        new AutoValue_StarredChangesUtil_StarRef(null, ImmutableSortedSet.of());
-
-    private static StarRef create(Ref ref, Iterable<String> labels) {
-      return new AutoValue_StarredChangesUtil_StarRef(
-          checkNotNull(ref), ImmutableSortedSet.copyOf(labels));
-    }
-
-    @Nullable
-    public abstract Ref ref();
-
-    public abstract ImmutableSortedSet<String> labels();
-
-    public ObjectId objectId() {
-      return ref() != null ? ref().getObjectId() : ObjectId.zeroId();
-    }
-  }
-
-  public static class IllegalLabelException extends Exception {
-    private static final long serialVersionUID = 1L;
-
-    IllegalLabelException(String message) {
-      super(message);
-    }
-  }
-
-  public static class InvalidLabelsException extends IllegalLabelException {
-    private static final long serialVersionUID = 1L;
-
-    InvalidLabelsException(Set<String> invalidLabels) {
-      super(String.format("invalid labels: %s", Joiner.on(", ").join(invalidLabels)));
-    }
-  }
-
-  public static class MutuallyExclusiveLabelsException extends IllegalLabelException {
-    private static final long serialVersionUID = 1L;
-
-    MutuallyExclusiveLabelsException(String label1, String label2) {
-      super(
-          String.format(
-              "The labels %s and %s are mutually exclusive. Only one of them can be set.",
-              label1, label2));
-    }
-  }
-
-  private static final Logger log = LoggerFactory.getLogger(StarredChangesUtil.class);
-
-  public static final String DEFAULT_LABEL = "star";
-  public static final String IGNORE_LABEL = "ignore";
-  public static final String REVIEWED_LABEL = "reviewed";
-  public static final String UNREVIEWED_LABEL = "unreviewed";
-  public static final ImmutableSortedSet<String> DEFAULT_LABELS =
-      ImmutableSortedSet.of(DEFAULT_LABEL);
-
-  private final GitRepositoryManager repoManager;
-  private final GitReferenceUpdated gitRefUpdated;
-  private final AllUsersName allUsers;
-  private final Provider<ReviewDb> dbProvider;
-  private final PersonIdent serverIdent;
-  private final ChangeIndexer indexer;
-  private final Provider<InternalChangeQuery> queryProvider;
-
-  @Inject
-  StarredChangesUtil(
-      GitRepositoryManager repoManager,
-      GitReferenceUpdated gitRefUpdated,
-      AllUsersName allUsers,
-      Provider<ReviewDb> dbProvider,
-      @GerritPersonIdent PersonIdent serverIdent,
-      ChangeIndexer indexer,
-      Provider<InternalChangeQuery> queryProvider) {
-    this.repoManager = repoManager;
-    this.gitRefUpdated = gitRefUpdated;
-    this.allUsers = allUsers;
-    this.dbProvider = dbProvider;
-    this.serverIdent = serverIdent;
-    this.indexer = indexer;
-    this.queryProvider = queryProvider;
-  }
-
-  public ImmutableSortedSet<String> getLabels(Account.Id accountId, Change.Id changeId)
-      throws OrmException {
-    try (Repository repo = repoManager.openRepository(allUsers)) {
-      return readLabels(repo, RefNames.refsStarredChanges(changeId, accountId)).labels();
-    } catch (IOException e) {
-      throw new OrmException(
-          String.format(
-              "Reading stars from change %d for account %d failed",
-              changeId.get(), accountId.get()),
-          e);
-    }
-  }
-
-  public ImmutableSortedSet<String> star(
-      Account.Id accountId,
-      Project.NameKey project,
-      Change.Id changeId,
-      Set<String> labelsToAdd,
-      Set<String> labelsToRemove)
-      throws OrmException, IllegalLabelException {
-    try (Repository repo = repoManager.openRepository(allUsers)) {
-      String refName = RefNames.refsStarredChanges(changeId, accountId);
-      StarRef old = readLabels(repo, refName);
-
-      Set<String> labels = new HashSet<>(old.labels());
-      if (labelsToAdd != null) {
-        labels.addAll(labelsToAdd);
-      }
-      if (labelsToRemove != null) {
-        labels.removeAll(labelsToRemove);
-      }
-
-      if (labels.isEmpty()) {
-        deleteRef(repo, refName, old.objectId());
-      } else {
-        checkMutuallyExclusiveLabels(labels);
-        updateLabels(repo, refName, old.objectId(), labels);
-      }
-
-      indexer.index(dbProvider.get(), project, changeId);
-      return ImmutableSortedSet.copyOf(labels);
-    } catch (IOException e) {
-      throw new OrmException(
-          String.format("Star change %d for account %d failed", changeId.get(), accountId.get()),
-          e);
-    }
-  }
-
-  public void unstarAll(Project.NameKey project, Change.Id changeId) throws OrmException {
-    try (Repository repo = repoManager.openRepository(allUsers);
-        RevWalk rw = new RevWalk(repo)) {
-      BatchRefUpdate batchUpdate = repo.getRefDatabase().newBatchUpdate();
-      batchUpdate.setAllowNonFastForwards(true);
-      batchUpdate.setRefLogIdent(serverIdent);
-      batchUpdate.setRefLogMessage("Unstar change " + changeId.get(), true);
-      for (Account.Id accountId : byChangeFromIndex(changeId).keySet()) {
-        String refName = RefNames.refsStarredChanges(changeId, accountId);
-        Ref ref = repo.getRefDatabase().getRef(refName);
-        batchUpdate.addCommand(new ReceiveCommand(ref.getObjectId(), ObjectId.zeroId(), refName));
-      }
-      batchUpdate.execute(rw, NullProgressMonitor.INSTANCE);
-      for (ReceiveCommand command : batchUpdate.getCommands()) {
-        if (command.getResult() != ReceiveCommand.Result.OK) {
-          throw new IOException(
-              String.format(
-                  "Unstar change %d failed, ref %s could not be deleted: %s",
-                  changeId.get(), command.getRefName(), command.getResult()));
-        }
-      }
-      indexer.index(dbProvider.get(), project, changeId);
-    } catch (IOException e) {
-      throw new OrmException(String.format("Unstar change %d failed", changeId.get()), e);
-    }
-  }
-
-  public ImmutableMap<Account.Id, StarRef> byChange(Change.Id changeId) throws OrmException {
-    try (Repository repo = repoManager.openRepository(allUsers)) {
-      ImmutableMap.Builder<Account.Id, StarRef> builder = ImmutableMap.builder();
-      for (String refPart : getRefNames(repo, RefNames.refsStarredChangesPrefix(changeId))) {
-        Integer id = Ints.tryParse(refPart);
-        if (id == null) {
-          continue;
-        }
-        Account.Id accountId = new Account.Id(id);
-        builder.put(accountId, readLabels(repo, RefNames.refsStarredChanges(changeId, accountId)));
-      }
-      return builder.build();
-    } catch (IOException e) {
-      throw new OrmException(
-          String.format("Get accounts that starred change %d failed", changeId.get()), e);
-    }
-  }
-
-  public ImmutableListMultimap<Account.Id, String> byChangeFromIndex(Change.Id changeId)
-      throws OrmException {
-    Set<String> fields = ImmutableSet.of(ChangeField.ID.getName(), ChangeField.STAR.getName());
-    List<ChangeData> changeData =
-        queryProvider.get().setRequestedFields(fields).byLegacyChangeId(changeId);
-    if (changeData.size() != 1) {
-      throw new NoSuchChangeException(changeId);
-    }
-    return changeData.get(0).stars();
-  }
-
-  private static Set<String> getRefNames(Repository repo, String prefix) throws IOException {
-    RefDatabase refDb = repo.getRefDatabase();
-    return refDb.getRefs(prefix).keySet();
-  }
-
-  public ObjectId getObjectId(Account.Id accountId, Change.Id changeId) {
-    try (Repository repo = repoManager.openRepository(allUsers)) {
-      Ref ref = repo.exactRef(RefNames.refsStarredChanges(changeId, accountId));
-      return ref != null ? ref.getObjectId() : ObjectId.zeroId();
-    } catch (IOException e) {
-      log.error(
-          "Getting star object ID for account {} on change {} failed",
-          accountId.get(),
-          changeId.get(),
-          e);
-      return ObjectId.zeroId();
-    }
-  }
-
-  public void ignore(ChangeResource rsrc) throws OrmException, IllegalLabelException {
-    star(
-        rsrc.getUser().asIdentifiedUser().getAccountId(),
-        rsrc.getProject(),
-        rsrc.getChange().getId(),
-        ImmutableSet.of(IGNORE_LABEL),
-        ImmutableSet.of());
-  }
-
-  public void unignore(ChangeResource rsrc) throws OrmException, IllegalLabelException {
-    star(
-        rsrc.getUser().asIdentifiedUser().getAccountId(),
-        rsrc.getProject(),
-        rsrc.getChange().getId(),
-        ImmutableSet.of(),
-        ImmutableSet.of(IGNORE_LABEL));
-  }
-
-  public boolean isIgnoredBy(Change.Id changeId, Account.Id accountId) throws OrmException {
-    return getLabels(accountId, changeId).contains(IGNORE_LABEL);
-  }
-
-  public boolean isIgnored(ChangeResource rsrc) throws OrmException {
-    return isIgnoredBy(rsrc.getChange().getId(), rsrc.getUser().asIdentifiedUser().getAccountId());
-  }
-
-  private static String getReviewedLabel(Change change) {
-    return getReviewedLabel(change.currentPatchSetId().get());
-  }
-
-  private static String getReviewedLabel(int ps) {
-    return REVIEWED_LABEL + "/" + ps;
-  }
-
-  private static String getUnreviewedLabel(Change change) {
-    return getUnreviewedLabel(change.currentPatchSetId().get());
-  }
-
-  private static String getUnreviewedLabel(int ps) {
-    return UNREVIEWED_LABEL + "/" + ps;
-  }
-
-  public void markAsReviewed(ChangeResource rsrc) throws OrmException, IllegalLabelException {
-    star(
-        rsrc.getUser().asIdentifiedUser().getAccountId(),
-        rsrc.getProject(),
-        rsrc.getChange().getId(),
-        ImmutableSet.of(getReviewedLabel(rsrc.getChange())),
-        ImmutableSet.of(getUnreviewedLabel(rsrc.getChange())));
-  }
-
-  public void markAsUnreviewed(ChangeResource rsrc) throws OrmException, IllegalLabelException {
-    star(
-        rsrc.getUser().asIdentifiedUser().getAccountId(),
-        rsrc.getProject(),
-        rsrc.getChange().getId(),
-        ImmutableSet.of(getUnreviewedLabel(rsrc.getChange())),
-        ImmutableSet.of(getReviewedLabel(rsrc.getChange())));
-  }
-
-  public static StarRef readLabels(Repository repo, String refName) throws IOException {
-    Ref ref = repo.exactRef(refName);
-    if (ref == null) {
-      return StarRef.MISSING;
-    }
-
-    try (ObjectReader reader = repo.newObjectReader()) {
-      ObjectLoader obj = reader.open(ref.getObjectId(), Constants.OBJ_BLOB);
-      return StarRef.create(
-          ref,
-          Splitter.on(CharMatcher.whitespace())
-              .omitEmptyStrings()
-              .split(new String(obj.getCachedBytes(Integer.MAX_VALUE), UTF_8)));
-    }
-  }
-
-  public static ObjectId writeLabels(Repository repo, Collection<String> labels)
-      throws IOException, InvalidLabelsException {
-    validateLabels(labels);
-    try (ObjectInserter oi = repo.newObjectInserter()) {
-      ObjectId id =
-          oi.insert(
-              Constants.OBJ_BLOB,
-              labels.stream().sorted().distinct().collect(joining("\n")).getBytes(UTF_8));
-      oi.flush();
-      return id;
-    }
-  }
-
-  private static void checkMutuallyExclusiveLabels(Set<String> labels)
-      throws MutuallyExclusiveLabelsException {
-    if (labels.containsAll(ImmutableSet.of(DEFAULT_LABEL, IGNORE_LABEL))) {
-      throw new MutuallyExclusiveLabelsException(DEFAULT_LABEL, IGNORE_LABEL);
-    }
-
-    Set<Integer> reviewedPatchSets = getStarredPatchSets(labels, REVIEWED_LABEL);
-    Set<Integer> unreviewedPatchSets = getStarredPatchSets(labels, UNREVIEWED_LABEL);
-    Optional<Integer> ps =
-        Sets.intersection(reviewedPatchSets, unreviewedPatchSets).stream().findFirst();
-    if (ps.isPresent()) {
-      throw new MutuallyExclusiveLabelsException(
-          getReviewedLabel(ps.get()), getUnreviewedLabel(ps.get()));
-    }
-  }
-
-  public static Set<Integer> getStarredPatchSets(Set<String> labels, String label) {
-    return labels.stream()
-        .filter(l -> l.startsWith(label))
-        .filter(l -> Ints.tryParse(l.substring(label.length() + 1)) != null)
-        .map(l -> Integer.valueOf(l.substring(label.length() + 1)))
-        .collect(toSet());
-  }
-
-  private static void validateLabels(Collection<String> labels) throws InvalidLabelsException {
-    if (labels == null) {
-      return;
-    }
-
-    SortedSet<String> invalidLabels = new TreeSet<>();
-    for (String label : labels) {
-      if (CharMatcher.whitespace().matchesAnyOf(label)) {
-        invalidLabels.add(label);
-      }
-    }
-    if (!invalidLabels.isEmpty()) {
-      throw new InvalidLabelsException(invalidLabels);
-    }
-  }
-
-  private void updateLabels(
-      Repository repo, String refName, ObjectId oldObjectId, Collection<String> labels)
-      throws IOException, OrmException, InvalidLabelsException {
-    try (RevWalk rw = new RevWalk(repo)) {
-      RefUpdate u = repo.updateRef(refName);
-      u.setExpectedOldObjectId(oldObjectId);
-      u.setForceUpdate(true);
-      u.setNewObjectId(writeLabels(repo, labels));
-      u.setRefLogIdent(serverIdent);
-      u.setRefLogMessage("Update star labels", true);
-      RefUpdate.Result result = u.update(rw);
-      switch (result) {
-        case NEW:
-        case FORCED:
-        case NO_CHANGE:
-        case FAST_FORWARD:
-          gitRefUpdated.fire(allUsers, u, null);
-          return;
-        case IO_FAILURE:
-        case LOCK_FAILURE:
-        case NOT_ATTEMPTED:
-        case REJECTED:
-        case REJECTED_CURRENT_BRANCH:
-        case RENAMED:
-        case REJECTED_MISSING_OBJECT:
-        case REJECTED_OTHER_REASON:
-        default:
-          throw new OrmException(
-              String.format("Update star labels on ref %s failed: %s", refName, result.name()));
-      }
-    }
-  }
-
-  private void deleteRef(Repository repo, String refName, ObjectId oldObjectId)
-      throws IOException, OrmException {
-    if (ObjectId.zeroId().equals(oldObjectId)) {
-      // ref doesn't exist
-      return;
-    }
-
-    RefUpdate u = repo.updateRef(refName);
-    u.setForceUpdate(true);
-    u.setExpectedOldObjectId(oldObjectId);
-    u.setRefLogIdent(serverIdent);
-    u.setRefLogMessage("Unstar change", true);
-    RefUpdate.Result result = u.delete();
-    switch (result) {
-      case FORCED:
-        gitRefUpdated.fire(allUsers, u, null);
-        return;
-      case NEW:
-      case NO_CHANGE:
-      case FAST_FORWARD:
-      case IO_FAILURE:
-      case LOCK_FAILURE:
-      case NOT_ATTEMPTED:
-      case REJECTED:
-      case REJECTED_CURRENT_BRANCH:
-      case RENAMED:
-      case REJECTED_MISSING_OBJECT:
-      case REJECTED_OTHER_REASON:
-      default:
-        throw new OrmException(
-            String.format("Delete star ref %s failed: %s", refName, result.name()));
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/StartupChecks.java b/gerrit-server/src/main/java/com/google/gerrit/server/StartupChecks.java
deleted file mode 100644
index 9df2604..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/StartupChecks.java
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server;
-
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.lifecycle.LifecycleModule;
-import com.google.gerrit.server.account.UniversalGroupBackend;
-import com.google.gerrit.server.group.SystemGroupBackend;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-@Singleton
-public class StartupChecks implements LifecycleListener {
-  public static class Module extends LifecycleModule {
-    @Override
-    protected void configure() {
-      DynamicSet.setOf(binder(), StartupCheck.class);
-      listener().to(StartupChecks.class);
-      DynamicSet.bind(binder(), StartupCheck.class).to(UniversalGroupBackend.ConfigCheck.class);
-      DynamicSet.bind(binder(), StartupCheck.class).to(SystemGroupBackend.NameCheck.class);
-    }
-  }
-
-  private final DynamicSet<StartupCheck> startupChecks;
-
-  @Inject
-  StartupChecks(DynamicSet<StartupCheck> startupChecks) {
-    this.startupChecks = startupChecks;
-  }
-
-  @Override
-  public void start() throws StartupException {
-    for (StartupCheck startupCheck : startupChecks) {
-      startupCheck.check();
-    }
-  }
-
-  @Override
-  public void stop() {}
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/StringUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/StringUtil.java
deleted file mode 100644
index 891dec2..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/StringUtil.java
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server;
-
-public class StringUtil {
-  /**
-   * An array of the string representations that should be used in place of the non-printable
-   * characters in the beginning of the ASCII table when escaping a string. The index of each
-   * element in the array corresponds to its ASCII value, i.e. the string representation of ASCII 0
-   * is found in the first element of this array.
-   */
-  private static final String[] NON_PRINTABLE_CHARS = {
-    "\\x00", "\\x01", "\\x02", "\\x03", "\\x04", "\\x05", "\\x06", "\\a",
-    "\\b", "\\t", "\\n", "\\v", "\\f", "\\r", "\\x0e", "\\x0f",
-    "\\x10", "\\x11", "\\x12", "\\x13", "\\x14", "\\x15", "\\x16", "\\x17",
-    "\\x18", "\\x19", "\\x1a", "\\x1b", "\\x1c", "\\x1d", "\\x1e", "\\x1f",
-  };
-
-  /**
-   * Escapes the input string so that all non-printable characters (0x00-0x1f) are represented as a
-   * hex escape (\x00, \x01, ...) or as a C-style escape sequence (\a, \b, \t, \n, \v, \f, or \r).
-   * Backslashes in the input string are doubled (\\).
-   */
-  public static String escapeString(String str) {
-    // Allocate a buffer big enough to cover the case with a string needed
-    // very excessive escaping without having to reallocate the buffer.
-    final StringBuilder result = new StringBuilder(3 * str.length());
-
-    for (int i = 0; i < str.length(); i++) {
-      char c = str.charAt(i);
-      if (c < NON_PRINTABLE_CHARS.length) {
-        result.append(NON_PRINTABLE_CHARS[c]);
-      } else if (c == '\\') {
-        result.append("\\\\");
-      } else {
-        result.append(c);
-      }
-    }
-    return result.toString();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/WebLinks.java b/gerrit-server/src/main/java/com/google/gerrit/server/WebLinks.java
deleted file mode 100644
index dacbe37..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/WebLinks.java
+++ /dev/null
@@ -1,224 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server;
-
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-import com.google.common.base.Strings;
-import com.google.common.collect.FluentIterable;
-import com.google.gerrit.common.data.WebLinkInfoCommon;
-import com.google.gerrit.extensions.common.DiffWebLinkInfo;
-import com.google.gerrit.extensions.common.WebLinkInfo;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.webui.BranchWebLink;
-import com.google.gerrit.extensions.webui.DiffWebLink;
-import com.google.gerrit.extensions.webui.FileHistoryWebLink;
-import com.google.gerrit.extensions.webui.FileWebLink;
-import com.google.gerrit.extensions.webui.ParentWebLink;
-import com.google.gerrit.extensions.webui.PatchSetWebLink;
-import com.google.gerrit.extensions.webui.ProjectWebLink;
-import com.google.gerrit.extensions.webui.TagWebLink;
-import com.google.gerrit.extensions.webui.WebLink;
-import com.google.gerrit.reviewdb.client.Patch;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.Collections;
-import java.util.List;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class WebLinks {
-  private static final Logger log = LoggerFactory.getLogger(WebLinks.class);
-
-  private static final Predicate<WebLinkInfo> INVALID_WEBLINK =
-      link -> {
-        if (link == null) {
-          return false;
-        } else if (Strings.isNullOrEmpty(link.name) || Strings.isNullOrEmpty(link.url)) {
-          log.warn("{} is missing name and/or url", link.getClass().getName());
-          return false;
-        }
-        return true;
-      };
-
-  private static final Predicate<WebLinkInfoCommon> INVALID_WEBLINK_COMMON =
-      link -> {
-        if (link == null) {
-          return false;
-        } else if (Strings.isNullOrEmpty(link.name) || Strings.isNullOrEmpty(link.url)) {
-          log.warn("{} is missing name and/or url", link.getClass().getName());
-          return false;
-        }
-        return true;
-      };
-
-  private final DynamicSet<PatchSetWebLink> patchSetLinks;
-  private final DynamicSet<ParentWebLink> parentLinks;
-  private final DynamicSet<FileWebLink> fileLinks;
-  private final DynamicSet<FileHistoryWebLink> fileHistoryLinks;
-  private final DynamicSet<DiffWebLink> diffLinks;
-  private final DynamicSet<ProjectWebLink> projectLinks;
-  private final DynamicSet<BranchWebLink> branchLinks;
-  private final DynamicSet<TagWebLink> tagLinks;
-
-  @Inject
-  public WebLinks(
-      DynamicSet<PatchSetWebLink> patchSetLinks,
-      DynamicSet<ParentWebLink> parentLinks,
-      DynamicSet<FileWebLink> fileLinks,
-      DynamicSet<FileHistoryWebLink> fileLogLinks,
-      DynamicSet<DiffWebLink> diffLinks,
-      DynamicSet<ProjectWebLink> projectLinks,
-      DynamicSet<BranchWebLink> branchLinks,
-      DynamicSet<TagWebLink> tagLinks) {
-    this.patchSetLinks = patchSetLinks;
-    this.parentLinks = parentLinks;
-    this.fileLinks = fileLinks;
-    this.fileHistoryLinks = fileLogLinks;
-    this.diffLinks = diffLinks;
-    this.projectLinks = projectLinks;
-    this.branchLinks = branchLinks;
-    this.tagLinks = tagLinks;
-  }
-
-  /**
-   * @param project Project name.
-   * @param commit SHA1 of commit.
-   * @return Links for patch sets.
-   */
-  public List<WebLinkInfo> getPatchSetLinks(Project.NameKey project, String commit) {
-    return filterLinks(patchSetLinks, webLink -> webLink.getPatchSetWebLink(project.get(), commit));
-  }
-
-  /**
-   * @param project Project name.
-   * @param revision SHA1 of the parent revision.
-   * @return Links for patch sets.
-   */
-  public List<WebLinkInfo> getParentLinks(Project.NameKey project, String revision) {
-    return filterLinks(parentLinks, webLink -> webLink.getParentWebLink(project.get(), revision));
-  }
-
-  /**
-   * @param project Project name.
-   * @param revision SHA1 of revision.
-   * @param file File name.
-   * @return Links for files.
-   */
-  public List<WebLinkInfo> getFileLinks(String project, String revision, String file) {
-    return Patch.isMagic(file)
-        ? Collections.emptyList()
-        : filterLinks(fileLinks, webLink -> webLink.getFileWebLink(project, revision, file));
-  }
-
-  /**
-   * @param project Project name.
-   * @param revision SHA1 of revision.
-   * @param file File name.
-   * @return Links for file history
-   */
-  public List<WebLinkInfoCommon> getFileHistoryLinks(String project, String revision, String file) {
-    if (Patch.isMagic(file)) {
-      return Collections.emptyList();
-    }
-    return FluentIterable.from(fileHistoryLinks)
-        .transform(
-            webLink -> {
-              WebLinkInfo info = webLink.getFileHistoryWebLink(project, revision, file);
-              if (info == null) {
-                return null;
-              }
-              WebLinkInfoCommon commonInfo = new WebLinkInfoCommon();
-              commonInfo.name = info.name;
-              commonInfo.imageUrl = info.imageUrl;
-              commonInfo.url = info.url;
-              commonInfo.target = info.target;
-              return commonInfo;
-            })
-        .filter(INVALID_WEBLINK_COMMON)
-        .toList();
-  }
-
-  /**
-   * @param project Project name.
-   * @param patchSetIdA Patch set ID of side A, <code>null</code> if no base patch set was selected.
-   * @param revisionA SHA1 of revision of side A.
-   * @param fileA File name of side A.
-   * @param patchSetIdB Patch set ID of side B.
-   * @param revisionB SHA1 of revision of side B.
-   * @param fileB File name of side B.
-   * @return Links for file diffs.
-   */
-  public List<DiffWebLinkInfo> getDiffLinks(
-      final String project,
-      final int changeId,
-      final Integer patchSetIdA,
-      final String revisionA,
-      final String fileA,
-      final int patchSetIdB,
-      final String revisionB,
-      final String fileB) {
-    if (Patch.isMagic(fileA) || Patch.isMagic(fileB)) {
-      return Collections.emptyList();
-    }
-    return FluentIterable.from(diffLinks)
-        .transform(
-            webLink ->
-                webLink.getDiffLink(
-                    project,
-                    changeId,
-                    patchSetIdA,
-                    revisionA,
-                    fileA,
-                    patchSetIdB,
-                    revisionB,
-                    fileB))
-        .filter(INVALID_WEBLINK)
-        .toList();
-  }
-
-  /**
-   * @param project Project name.
-   * @return Links for projects.
-   */
-  public List<WebLinkInfo> getProjectLinks(String project) {
-    return filterLinks(projectLinks, webLink -> webLink.getProjectWeblink(project));
-  }
-
-  /**
-   * @param project Project name
-   * @param branch Branch name
-   * @return Links for branches.
-   */
-  public List<WebLinkInfo> getBranchLinks(String project, String branch) {
-    return filterLinks(branchLinks, webLink -> webLink.getBranchWebLink(project, branch));
-  }
-
-  /**
-   * @param project Project name
-   * @param tag Tag name
-   * @return Links for tags.
-   */
-  public List<WebLinkInfo> getTagLinks(String project, String tag) {
-    return filterLinks(tagLinks, webLink -> webLink.getTagWebLink(project, tag));
-  }
-
-  private <T extends WebLink> List<WebLinkInfo> filterLinks(
-      DynamicSet<T> links, Function<T, WebLinkInfo> transformer) {
-    return FluentIterable.from(links).transform(transformer).filter(INVALID_WEBLINK).toList();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/access/AccessCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/access/AccessCollection.java
deleted file mode 100644
index 2e90889..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/access/AccessCollection.java
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.access;
-
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestCollection;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-
-@Singleton
-public class AccessCollection implements RestCollection<TopLevelResource, AccessResource> {
-  private final Provider<ListAccess> list;
-  private final DynamicMap<RestView<AccessResource>> views;
-
-  @Inject
-  AccessCollection(Provider<ListAccess> list, DynamicMap<RestView<AccessResource>> views) {
-    this.list = list;
-    this.views = views;
-  }
-
-  @Override
-  public RestView<TopLevelResource> list() {
-    return list.get();
-  }
-
-  @Override
-  public AccessResource parse(TopLevelResource parent, IdString id)
-      throws ResourceNotFoundException {
-    throw new ResourceNotFoundException(id);
-  }
-
-  @Override
-  public DynamicMap<RestView<AccessResource>> views() {
-    return views;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/access/AccessResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/access/AccessResource.java
deleted file mode 100644
index 22888b8..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/access/AccessResource.java
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.access;
-
-import com.google.gerrit.extensions.restapi.RestResource;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.inject.TypeLiteral;
-
-public class AccessResource implements RestResource {
-  public static final TypeLiteral<RestView<AccessResource>> ACCESS_KIND =
-      new TypeLiteral<RestView<AccessResource>>() {};
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/access/ListAccess.java b/gerrit-server/src/main/java/com/google/gerrit/server/access/ListAccess.java
deleted file mode 100644
index a2cedbf..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/access/ListAccess.java
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.access;
-
-import com.google.gerrit.extensions.api.access.ProjectAccessInfo;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.GetAccess;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-import org.kohsuke.args4j.Option;
-
-public class ListAccess implements RestReadView<TopLevelResource> {
-
-  @Option(
-      name = "--project",
-      aliases = {"-p"},
-      metaVar = "PROJECT",
-      usage = "projects for which the access rights should be returned")
-  private List<String> projects = new ArrayList<>();
-
-  private final GetAccess getAccess;
-
-  @Inject
-  public ListAccess(GetAccess getAccess) {
-    this.getAccess = getAccess;
-  }
-
-  @Override
-  public Map<String, ProjectAccessInfo> apply(TopLevelResource resource)
-      throws ResourceNotFoundException, ResourceConflictException, IOException,
-          PermissionBackendException, OrmException {
-    Map<String, ProjectAccessInfo> access = new TreeMap<>();
-    for (String p : projects) {
-      access.put(p, getAccess.apply(new Project.NameKey(p)));
-    }
-    return access;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/access/Module.java b/gerrit-server/src/main/java/com/google/gerrit/server/access/Module.java
deleted file mode 100644
index cd0d334..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/access/Module.java
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.access;
-
-import static com.google.gerrit.server.access.AccessResource.ACCESS_KIND;
-
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.RestApiModule;
-
-public class Module extends RestApiModule {
-  @Override
-  protected void configure() {
-    bind(AccessCollection.class);
-
-    DynamicMap.mapOf(binder(), ACCESS_KIND);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountCache.java
deleted file mode 100644
index bbc4f5f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountCache.java
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.account;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.reviewdb.client.Account;
-import java.io.IOException;
-
-/** Caches important (but small) account state to avoid database hits. */
-public interface AccountCache {
-  /**
-   * Returns an {@code AccountState} instance for the given account ID. If not cached yet the
-   * account is loaded. Returns an empty {@code AccountState} instance to represent a missing
-   * account.
-   *
-   * @param accountId ID of the account that should be retrieved
-   * @return {@code AccountState} instance for the given account ID, if no account with this ID
-   *     exists an empty {@code AccountState} instance is returned to represent the missing account
-   */
-  AccountState get(Account.Id accountId);
-
-  /**
-   * Returns an {@code AccountState} instance for the given account ID. If not cached yet the
-   * account is loaded. Returns {@code null} if the account is missing.
-   *
-   * @param accountId ID of the account that should be retrieved
-   * @return {@code AccountState} instance for the given account ID, if no account with this ID
-   *     exists {@code null} is returned
-   */
-  @Nullable
-  AccountState getOrNull(Account.Id accountId);
-
-  /**
-   * Returns an {@code AccountState} instance for the given username.
-   *
-   * <p>This method first loads the external ID for the username and then uses the account ID of the
-   * external ID to lookup the account from the cache.
-   *
-   * @param username username of the account that should be retrieved
-   * @return {@code AccountState} instance for the given username, if no account with this username
-   *     exists or if loading the external ID fails {@code null} is returned
-   */
-  AccountState getByUsername(String username);
-
-  /**
-   * Evicts the account from the cache and triggers a reindex for it.
-   *
-   * @param accountId account ID of the account that should be evicted
-   * @throws IOException thrown if reindexing fails
-   */
-  void evict(Account.Id accountId) throws IOException;
-
-  /** Evict all accounts from the cache, but doesn't trigger reindex of all accounts. */
-  void evictAllNoReindex();
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountCacheImpl.java
deleted file mode 100644
index 9894751..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountCacheImpl.java
+++ /dev/null
@@ -1,179 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.account;
-
-import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_USERNAME;
-
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.account.externalids.ExternalIds;
-import com.google.gerrit.server.cache.CacheModule;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.index.account.AccountIndexer;
-import com.google.inject.Inject;
-import com.google.inject.Module;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import com.google.inject.TypeLiteral;
-import com.google.inject.name.Named;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Optional;
-import java.util.concurrent.ExecutionException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Caches important (but small) account state to avoid database hits. */
-@Singleton
-public class AccountCacheImpl implements AccountCache {
-  private static final Logger log = LoggerFactory.getLogger(AccountCacheImpl.class);
-
-  private static final String BYID_NAME = "accounts";
-
-  public static Module module() {
-    return new CacheModule() {
-      @Override
-      protected void configure() {
-        cache(BYID_NAME, Account.Id.class, new TypeLiteral<Optional<AccountState>>() {})
-            .loader(ByIdLoader.class);
-
-        bind(AccountCacheImpl.class);
-        bind(AccountCache.class).to(AccountCacheImpl.class);
-      }
-    };
-  }
-
-  private final AllUsersName allUsersName;
-  private final ExternalIds externalIds;
-  private final LoadingCache<Account.Id, Optional<AccountState>> byId;
-  private final Provider<AccountIndexer> indexer;
-
-  @Inject
-  AccountCacheImpl(
-      AllUsersName allUsersName,
-      ExternalIds externalIds,
-      @Named(BYID_NAME) LoadingCache<Account.Id, Optional<AccountState>> byId,
-      Provider<AccountIndexer> indexer) {
-    this.allUsersName = allUsersName;
-    this.externalIds = externalIds;
-    this.byId = byId;
-    this.indexer = indexer;
-  }
-
-  @Override
-  public AccountState get(Account.Id accountId) {
-    try {
-      return byId.get(accountId).orElse(missing(accountId));
-    } catch (ExecutionException e) {
-      log.warn("Cannot load AccountState for " + accountId, e);
-      return missing(accountId);
-    }
-  }
-
-  @Override
-  @Nullable
-  public AccountState getOrNull(Account.Id accountId) {
-    try {
-      return byId.get(accountId).orElse(null);
-    } catch (ExecutionException e) {
-      log.warn("Cannot load AccountState for ID " + accountId, e);
-      return null;
-    }
-  }
-
-  @Override
-  public AccountState getByUsername(String username) {
-    try {
-      ExternalId extId = externalIds.get(ExternalId.Key.create(SCHEME_USERNAME, username));
-      if (extId == null) {
-        return null;
-      }
-      return getOrNull(extId.accountId());
-    } catch (IOException | ConfigInvalidException e) {
-      log.warn("Cannot load AccountState for username " + username, e);
-      return null;
-    }
-  }
-
-  @Override
-  public void evict(Account.Id accountId) throws IOException {
-    if (accountId != null) {
-      byId.invalidate(accountId);
-      indexer.get().index(accountId);
-    }
-  }
-
-  @Override
-  public void evictAllNoReindex() {
-    byId.invalidateAll();
-  }
-
-  private AccountState missing(Account.Id accountId) {
-    Account account = new Account(accountId, TimeUtil.nowTs());
-    account.setActive(false);
-    return new AccountState(allUsersName, account, Collections.emptySet(), new HashMap<>());
-  }
-
-  static class ByIdLoader extends CacheLoader<Account.Id, Optional<AccountState>> {
-    private final AllUsersName allUsersName;
-    private final Accounts accounts;
-    private final GeneralPreferencesLoader loader;
-    private final Provider<WatchConfig.Accessor> watchConfig;
-    private final ExternalIds externalIds;
-
-    @Inject
-    ByIdLoader(
-        AllUsersName allUsersName,
-        Accounts accounts,
-        GeneralPreferencesLoader loader,
-        Provider<WatchConfig.Accessor> watchConfig,
-        ExternalIds externalIds) {
-      this.allUsersName = allUsersName;
-      this.accounts = accounts;
-      this.loader = loader;
-      this.watchConfig = watchConfig;
-      this.externalIds = externalIds;
-    }
-
-    @Override
-    public Optional<AccountState> load(Account.Id who) throws Exception {
-      Account account = accounts.get(who);
-      if (account == null) {
-        return Optional.empty();
-      }
-
-      try {
-        account.setGeneralPreferences(loader.load(who));
-      } catch (IOException | ConfigInvalidException e) {
-        log.warn("Cannot load GeneralPreferences for " + who + " (using default)", e);
-        account.setGeneralPreferences(GeneralPreferencesInfo.defaults());
-      }
-
-      return Optional.of(
-          new AccountState(
-              allUsersName,
-              account,
-              externalIds.byAccount(who),
-              watchConfig.get().getProjectWatches(who)));
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountConfig.java
deleted file mode 100644
index f44aa0e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountConfig.java
+++ /dev/null
@@ -1,274 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.account;
-
-import static com.google.common.base.Preconditions.checkState;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.ValidationError;
-import com.google.gerrit.server.git.VersionedMetaData;
-import com.google.gerrit.server.mail.send.OutgoingEmailValidator;
-import com.google.gwtorm.server.OrmDuplicateKeyException;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.List;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevSort;
-
-/**
- * ‘account.config’ file in the user branch in the All-Users repository that contains the properties
- * of the account.
- *
- * <p>The 'account.config' file is a git config file that has one 'account' section with the
- * properties of the account:
- *
- * <pre>
- *   [account]
- *     active = false
- *     fullName = John Doe
- *     preferredEmail = john.doe@foo.com
- *     status = Overloaded with reviews
- * </pre>
- *
- * <p>All keys are optional. This means 'account.config' may not exist on the user branch if no
- * properties are set.
- *
- * <p>Not setting a key and setting a key to an empty string are treated the same way and result in
- * a {@code null} value.
- *
- * <p>If no value for 'active' is specified, by default the account is considered as active.
- *
- * <p>The commit date of the first commit on the user branch is used as registration date of the
- * account. The first commit may be an empty commit (if no properties were set and 'account.config'
- * doesn't exist).
- */
-public class AccountConfig extends VersionedMetaData implements ValidationError.Sink {
-  public static final String ACCOUNT_CONFIG = "account.config";
-  public static final String ACCOUNT = "account";
-  public static final String KEY_ACTIVE = "active";
-  public static final String KEY_FULL_NAME = "fullName";
-  public static final String KEY_PREFERRED_EMAIL = "preferredEmail";
-  public static final String KEY_STATUS = "status";
-
-  @Nullable private final OutgoingEmailValidator emailValidator;
-  private final Account.Id accountId;
-  private final String ref;
-
-  private boolean isLoaded;
-  private Account account;
-  private Timestamp registeredOn;
-  private List<ValidationError> validationErrors;
-
-  public AccountConfig(@Nullable OutgoingEmailValidator emailValidator, Account.Id accountId) {
-    this.emailValidator = emailValidator;
-    this.accountId = accountId;
-    this.ref = RefNames.refsUsers(accountId);
-  }
-
-  @Override
-  protected String getRefName() {
-    return ref;
-  }
-
-  /**
-   * Get the loaded account.
-   *
-   * @return loaded account.
-   * @throws IllegalStateException if the account was not loaded yet
-   */
-  public Account getAccount() {
-    checkLoaded();
-    return account;
-  }
-
-  /**
-   * Sets the account. This means the loaded account will be overwritten with the given account.
-   *
-   * <p>Changing the registration date of an account is not supported.
-   *
-   * @param account account that should be set
-   * @throws IllegalStateException if the account was not loaded yet
-   */
-  public void setAccount(Account account) {
-    checkLoaded();
-    this.account = account;
-    this.registeredOn = account.getRegisteredOn();
-  }
-
-  /**
-   * Creates a new account.
-   *
-   * @return the new account
-   * @throws OrmDuplicateKeyException if the user branch already exists
-   */
-  public Account getNewAccount() throws OrmDuplicateKeyException {
-    checkLoaded();
-    if (revision != null) {
-      throw new OrmDuplicateKeyException(String.format("account %s already exists", accountId));
-    }
-    this.registeredOn = TimeUtil.nowTs();
-    this.account = new Account(accountId, registeredOn);
-    return account;
-  }
-
-  @Override
-  protected void onLoad() throws IOException, ConfigInvalidException {
-    if (revision != null) {
-      rw.markStart(revision);
-      rw.sort(RevSort.REVERSE);
-      registeredOn = new Timestamp(rw.next().getCommitTime() * 1000L);
-
-      Config cfg = readConfig(ACCOUNT_CONFIG);
-
-      account = parse(cfg);
-      account.setMetaId(revision.name());
-    }
-
-    isLoaded = true;
-  }
-
-  private Account parse(Config cfg) {
-    Account account = new Account(accountId, registeredOn);
-    account.setActive(cfg.getBoolean(ACCOUNT, null, KEY_ACTIVE, true));
-    account.setFullName(get(cfg, KEY_FULL_NAME));
-
-    String preferredEmail = get(cfg, KEY_PREFERRED_EMAIL);
-    account.setPreferredEmail(preferredEmail);
-    if (emailValidator != null && !emailValidator.isValid(preferredEmail)) {
-      error(
-          new ValidationError(
-              ACCOUNT_CONFIG, String.format("Invalid preferred email: %s", preferredEmail)));
-    }
-
-    account.setStatus(get(cfg, KEY_STATUS));
-    return account;
-  }
-
-  @Override
-  public RevCommit commit(MetaDataUpdate update) throws IOException {
-    RevCommit c = super.commit(update);
-    account.setMetaId(c.name());
-    return c;
-  }
-
-  @Override
-  protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException {
-    checkLoaded();
-
-    if (revision != null) {
-      commit.setMessage("Update account\n");
-    } else if (account != null) {
-      commit.setMessage("Create account\n");
-      commit.setAuthor(new PersonIdent(commit.getAuthor(), registeredOn));
-      commit.setCommitter(new PersonIdent(commit.getCommitter(), registeredOn));
-    }
-
-    Config cfg = readConfig(ACCOUNT_CONFIG);
-    writeToConfig(account, cfg);
-    saveConfig(ACCOUNT_CONFIG, cfg);
-    return true;
-  }
-
-  public static void writeToConfig(Account account, Config cfg) {
-    setActive(cfg, account.isActive());
-    set(cfg, KEY_FULL_NAME, account.getFullName());
-    set(cfg, KEY_PREFERRED_EMAIL, account.getPreferredEmail());
-    set(cfg, KEY_STATUS, account.getStatus());
-  }
-
-  /**
-   * Sets/Unsets {@code account.active} in the given config.
-   *
-   * <p>{@code account.active} is set to {@code false} if the account is inactive.
-   *
-   * <p>If the account is active {@code account.active} is unset since {@code true} is the default
-   * if this field is missing.
-   *
-   * @param cfg the config
-   * @param value whether the account is active
-   */
-  private static void setActive(Config cfg, boolean value) {
-    if (!value) {
-      cfg.setBoolean(ACCOUNT, null, KEY_ACTIVE, false);
-    } else {
-      cfg.unset(ACCOUNT, null, KEY_ACTIVE);
-    }
-  }
-
-  /**
-   * Sets/Unsets the given key in the given config.
-   *
-   * <p>The key unset if the value is {@code null}.
-   *
-   * @param cfg the config
-   * @param key the key
-   * @param value the value
-   */
-  private static void set(Config cfg, String key, String value) {
-    if (!Strings.isNullOrEmpty(value)) {
-      cfg.setString(ACCOUNT, null, key, value);
-    } else {
-      cfg.unset(ACCOUNT, null, key);
-    }
-  }
-
-  /**
-   * Gets the given key from the given config.
-   *
-   * <p>Empty values are returned as {@code null}
-   *
-   * @param cfg the config
-   * @param key the key
-   * @return the value, {@code null} if key was not set or key was set to empty string
-   */
-  private static String get(Config cfg, String key) {
-    return Strings.emptyToNull(cfg.getString(ACCOUNT, null, key));
-  }
-
-  private void checkLoaded() {
-    checkState(isLoaded, "account not loaded yet");
-  }
-
-  /**
-   * Get the validation errors, if any were discovered during load.
-   *
-   * @return list of errors; empty list if there are no errors.
-   */
-  public List<ValidationError> getValidationErrors() {
-    if (validationErrors != null) {
-      return ImmutableList.copyOf(validationErrors);
-    }
-    return ImmutableList.of();
-  }
-
-  @Override
-  public void error(ValidationError error) {
-    if (validationErrors == null) {
-      validationErrors = new ArrayList<>(4);
-    }
-    validationErrors.add(error);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountControl.java
deleted file mode 100644
index 70b2967..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountControl.java
+++ /dev/null
@@ -1,237 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.account;
-
-import static java.util.stream.Collectors.toSet;
-
-import com.google.gerrit.common.data.PermissionRule;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.extensions.common.AccountVisibility;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.git.AccountsSection;
-import com.google.gerrit.server.group.SystemGroupBackend;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.util.Set;
-
-/** Access control management for one account's access to other accounts. */
-public class AccountControl {
-  public static class Factory {
-    private final PermissionBackend permissionBackend;
-    private final ProjectCache projectCache;
-    private final GroupControl.Factory groupControlFactory;
-    private final Provider<CurrentUser> user;
-    private final IdentifiedUser.GenericFactory userFactory;
-    private final AccountVisibility accountVisibility;
-
-    @Inject
-    Factory(
-        PermissionBackend permissionBackend,
-        ProjectCache projectCache,
-        GroupControl.Factory groupControlFactory,
-        Provider<CurrentUser> user,
-        IdentifiedUser.GenericFactory userFactory,
-        AccountVisibility accountVisibility) {
-      this.permissionBackend = permissionBackend;
-      this.projectCache = projectCache;
-      this.groupControlFactory = groupControlFactory;
-      this.user = user;
-      this.userFactory = userFactory;
-      this.accountVisibility = accountVisibility;
-    }
-
-    public AccountControl get() {
-      return new AccountControl(
-          permissionBackend,
-          projectCache,
-          groupControlFactory,
-          user.get(),
-          userFactory,
-          accountVisibility);
-    }
-  }
-
-  private final AccountsSection accountsSection;
-  private final GroupControl.Factory groupControlFactory;
-  private final PermissionBackend.WithUser perm;
-  private final CurrentUser user;
-  private final IdentifiedUser.GenericFactory userFactory;
-  private final AccountVisibility accountVisibility;
-
-  private Boolean viewAll;
-
-  AccountControl(
-      PermissionBackend permissionBackend,
-      ProjectCache projectCache,
-      GroupControl.Factory groupControlFactory,
-      CurrentUser user,
-      IdentifiedUser.GenericFactory userFactory,
-      AccountVisibility accountVisibility) {
-    this.accountsSection = projectCache.getAllProjects().getConfig().getAccountsSection();
-    this.groupControlFactory = groupControlFactory;
-    this.perm = permissionBackend.user(user);
-    this.user = user;
-    this.userFactory = userFactory;
-    this.accountVisibility = accountVisibility;
-  }
-
-  public CurrentUser getUser() {
-    return user;
-  }
-
-  /**
-   * Returns true if the current user is allowed to see the otherUser, based on the account
-   * visibility policy. Depending on the group membership realms supported, this may not be able to
-   * determine SAME_GROUP or VISIBLE_GROUP correctly (defaulting to not being visible). This is
-   * because {@link GroupMembership#getKnownGroups()} may only return a subset of the effective
-   * groups.
-   */
-  public boolean canSee(Account otherUser) {
-    return canSee(otherUser.getId());
-  }
-
-  /**
-   * Returns true if the current user is allowed to see the otherUser, based on the account
-   * visibility policy. Depending on the group membership realms supported, this may not be able to
-   * determine SAME_GROUP or VISIBLE_GROUP correctly (defaulting to not being visible). This is
-   * because {@link GroupMembership#getKnownGroups()} may only return a subset of the effective
-   * groups.
-   */
-  public boolean canSee(Account.Id otherUser) {
-    return canSee(
-        new OtherUser() {
-          @Override
-          Account.Id getId() {
-            return otherUser;
-          }
-
-          @Override
-          IdentifiedUser createUser() {
-            return userFactory.create(otherUser);
-          }
-        });
-  }
-
-  /**
-   * Returns true if the current user is allowed to see the otherUser, based on the account
-   * visibility policy. Depending on the group membership realms supported, this may not be able to
-   * determine SAME_GROUP or VISIBLE_GROUP correctly (defaulting to not being visible). This is
-   * because {@link GroupMembership#getKnownGroups()} may only return a subset of the effective
-   * groups.
-   */
-  public boolean canSee(AccountState otherUser) {
-    return canSee(
-        new OtherUser() {
-          @Override
-          Account.Id getId() {
-            return otherUser.getAccount().getId();
-          }
-
-          @Override
-          IdentifiedUser createUser() {
-            return userFactory.create(otherUser);
-          }
-        });
-  }
-
-  private boolean canSee(OtherUser otherUser) {
-    if (accountVisibility == AccountVisibility.ALL) {
-      return true;
-    } else if (user.isIdentifiedUser() && user.getAccountId().equals(otherUser.getId())) {
-      // I can always see myself.
-      return true;
-    } else if (viewAll()) {
-      return true;
-    }
-
-    switch (accountVisibility) {
-      case SAME_GROUP:
-        {
-          Set<AccountGroup.UUID> usersGroups = groupsOf(otherUser.getUser());
-          for (PermissionRule rule : accountsSection.getSameGroupVisibility()) {
-            if (rule.isBlock() || rule.isDeny()) {
-              usersGroups.remove(rule.getGroup().getUUID());
-            }
-          }
-
-          if (user.getEffectiveGroups().containsAnyOf(usersGroups)) {
-            return true;
-          }
-          break;
-        }
-      case VISIBLE_GROUP:
-        {
-          Set<AccountGroup.UUID> usersGroups = groupsOf(otherUser.getUser());
-          for (AccountGroup.UUID usersGroup : usersGroups) {
-            try {
-              if (groupControlFactory.controlFor(usersGroup).isVisible()) {
-                return true;
-              }
-            } catch (NoSuchGroupException e) {
-              continue;
-            }
-          }
-          break;
-        }
-      case NONE:
-        break;
-      case ALL:
-      default:
-        throw new IllegalStateException("Bad AccountVisibility " + accountVisibility);
-    }
-    return false;
-  }
-
-  private boolean viewAll() {
-    if (viewAll == null) {
-      try {
-        perm.check(GlobalPermission.VIEW_ALL_ACCOUNTS);
-        viewAll = true;
-      } catch (AuthException | PermissionBackendException e) {
-        viewAll = false;
-      }
-    }
-    return viewAll;
-  }
-
-  private Set<AccountGroup.UUID> groupsOf(IdentifiedUser user) {
-    return user.getEffectiveGroups().getKnownGroups().stream()
-        .filter(a -> !SystemGroupBackend.isSystemGroup(a))
-        .collect(toSet());
-  }
-
-  private abstract static class OtherUser {
-    IdentifiedUser user;
-
-    IdentifiedUser getUser() {
-      if (user == null) {
-        user = createUser();
-      }
-      return user;
-    }
-
-    abstract IdentifiedUser createUser();
-
-    abstract Account.Id getId();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountDeactivator.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountDeactivator.java
deleted file mode 100644
index a2c5fdd..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountDeactivator.java
+++ /dev/null
@@ -1,140 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.account;
-
-import static com.google.gerrit.server.config.ScheduleConfig.MISSING_CONFIG;
-
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.lifecycle.LifecycleModule;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.ScheduleConfig;
-import com.google.gerrit.server.git.WorkQueue;
-import com.google.gerrit.server.query.account.AccountPredicates;
-import com.google.gerrit.server.query.account.InternalAccountQuery;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.util.concurrent.TimeUnit;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Runnable to enable scheduling account deactivations to run periodically */
-public class AccountDeactivator implements Runnable {
-  private static final Logger log = LoggerFactory.getLogger(AccountDeactivator.class);
-
-  public static class Module extends LifecycleModule {
-    @Override
-    protected void configure() {
-      listener().to(Lifecycle.class);
-    }
-  }
-
-  static class Lifecycle implements LifecycleListener {
-    private final WorkQueue queue;
-    private final AccountDeactivator deactivator;
-    private final boolean supportAutomaticAccountActivityUpdate;
-    private final ScheduleConfig scheduleConfig;
-
-    @Inject
-    Lifecycle(WorkQueue queue, AccountDeactivator deactivator, @GerritServerConfig Config cfg) {
-      this.queue = queue;
-      this.deactivator = deactivator;
-      scheduleConfig = new ScheduleConfig(cfg, "accountDeactivation");
-      supportAutomaticAccountActivityUpdate =
-          cfg.getBoolean("auth", "autoUpdateAccountActiveStatus", false);
-    }
-
-    @Override
-    public void start() {
-      if (!supportAutomaticAccountActivityUpdate) {
-        return;
-      }
-      long interval = scheduleConfig.getInterval();
-      long delay = scheduleConfig.getInitialDelay();
-      if (delay == MISSING_CONFIG && interval == MISSING_CONFIG) {
-        log.info("Ignoring missing accountDeactivator schedule configuration");
-      } else if (delay < 0 || interval <= 0) {
-        log.warn("Ignoring invalid accountDeactivator schedule configuration: {}", scheduleConfig);
-      } else {
-        queue
-            .getDefaultQueue()
-            .scheduleAtFixedRate(deactivator, delay, interval, TimeUnit.MILLISECONDS);
-      }
-    }
-
-    @Override
-    public void stop() {
-      // handled by WorkQueue.stop() already
-    }
-  }
-
-  private final Provider<InternalAccountQuery> accountQueryProvider;
-  private final Realm realm;
-  private final SetInactiveFlag sif;
-
-  @Inject
-  AccountDeactivator(
-      Provider<InternalAccountQuery> accountQueryProvider, SetInactiveFlag sif, Realm realm) {
-    this.accountQueryProvider = accountQueryProvider;
-    this.sif = sif;
-    this.realm = realm;
-  }
-
-  @Override
-  public void run() {
-    log.info("Running account deactivations");
-    try {
-      int numberOfAccountsDeactivated = 0;
-      for (AccountState acc : accountQueryProvider.get().query(AccountPredicates.isActive())) {
-        if (processAccount(acc)) {
-          numberOfAccountsDeactivated++;
-        }
-      }
-      log.info(
-          "Deactivations complete, {} account(s) were deactivated", numberOfAccountsDeactivated);
-    } catch (Exception e) {
-      log.error("Failed to complete deactivation of accounts: " + e.getMessage(), e);
-    }
-  }
-
-  private boolean processAccount(AccountState account) {
-    log.debug("processing account " + account.getUserName());
-    try {
-      if (account.getUserName() != null
-          && realm.accountBelongsToRealm(account.getExternalIds())
-          && !realm.isActive(account.getUserName())) {
-        sif.deactivate(account.getAccount().getId());
-        log.info("deactivated account " + account.getUserName());
-        return true;
-      }
-    } catch (ResourceConflictException e) {
-      log.info("Account {} already deactivated, continuing...", account.getUserName());
-    } catch (Exception e) {
-      log.error(
-          "Error deactivating account: {} ({}) {}",
-          account.getUserName(),
-          account.getAccount().getId(),
-          e.getMessage(),
-          e);
-    }
-    return false;
-  }
-
-  @Override
-  public String toString() {
-    return "account deactivator";
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountDirectory.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountDirectory.java
deleted file mode 100644
index 6e5b42e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountDirectory.java
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.account;
-
-import com.google.gerrit.extensions.common.AccountInfo;
-import java.util.Set;
-
-/**
- * Directory of user account information.
- *
- * <p>Implementations supply data to Gerrit about user accounts.
- */
-public abstract class AccountDirectory {
-  /** Fields to be populated for a REST API response. */
-  public enum FillOptions {
-    /** Human friendly display name presented in the web interface. */
-    NAME,
-
-    /** Preferred email address to contact the user at. */
-    EMAIL,
-
-    /** All secondary email addresses of the user. */
-    SECONDARY_EMAILS,
-
-    /** User profile images. */
-    AVATARS,
-
-    /** Unique user identity to login to Gerrit, may be deprecated. */
-    USERNAME,
-
-    /** Numeric account ID, may be deprecated. */
-    ID,
-
-    /** The user-settable status of this account (e.g. busy, OOO, available) */
-    STATUS
-  }
-
-  public abstract void fillAccountInfo(Iterable<? extends AccountInfo> in, Set<FillOptions> options)
-      throws DirectoryException;
-
-  public static class DirectoryException extends Exception {
-    private static final long serialVersionUID = 1L;
-
-    public DirectoryException(String message, Throwable why) {
-      super(message, why);
-    }
-
-    public DirectoryException(Throwable why) {
-      super(why);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountLoader.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountLoader.java
deleted file mode 100644
index a137256b..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountLoader.java
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.account;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import com.google.common.base.Throwables;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.account.AccountDirectory.DirectoryException;
-import com.google.gerrit.server.account.AccountDirectory.FillOptions;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.assistedinject.Assisted;
-import com.google.inject.assistedinject.AssistedInject;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-public class AccountLoader {
-  public static final Set<FillOptions> DETAILED_OPTIONS =
-      Collections.unmodifiableSet(
-          EnumSet.of(
-              FillOptions.ID,
-              FillOptions.NAME,
-              FillOptions.EMAIL,
-              FillOptions.USERNAME,
-              FillOptions.STATUS,
-              FillOptions.AVATARS));
-
-  public interface Factory {
-    AccountLoader create(boolean detailed);
-
-    AccountLoader create(Set<FillOptions> options);
-  }
-
-  private final InternalAccountDirectory directory;
-  private final Set<FillOptions> options;
-  private final Map<Account.Id, AccountInfo> created;
-  private final List<AccountInfo> provided;
-
-  @AssistedInject
-  AccountLoader(InternalAccountDirectory directory, @Assisted boolean detailed) {
-    this(directory, detailed ? DETAILED_OPTIONS : InternalAccountDirectory.ID_ONLY);
-  }
-
-  @AssistedInject
-  AccountLoader(InternalAccountDirectory directory, @Assisted Set<FillOptions> options) {
-    this.directory = directory;
-    this.options = options;
-    created = new HashMap<>();
-    provided = new ArrayList<>();
-  }
-
-  public AccountInfo get(Account.Id id) {
-    if (id == null) {
-      return null;
-    }
-    AccountInfo info = created.get(id);
-    if (info == null) {
-      info = new AccountInfo(id.get());
-      created.put(id, info);
-    }
-    return info;
-  }
-
-  public void put(AccountInfo info) {
-    checkArgument(info._accountId != null, "_accountId field required");
-    provided.add(info);
-  }
-
-  public void fill() throws OrmException {
-    try {
-      directory.fillAccountInfo(Iterables.concat(created.values(), provided), options);
-    } catch (DirectoryException e) {
-      Throwables.throwIfInstanceOf(e.getCause(), OrmException.class);
-      throw new OrmException(e);
-    }
-  }
-
-  public void fill(Collection<? extends AccountInfo> infos) throws OrmException {
-    for (AccountInfo info : infos) {
-      put(info);
-    }
-    fill();
-  }
-
-  public AccountInfo fillOne(Account.Id id) throws OrmException {
-    AccountInfo info = get(id);
-    fill();
-    return info;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountManager.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountManager.java
deleted file mode 100644
index 0f3b481..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountManager.java
+++ /dev/null
@@ -1,514 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.account;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.common.data.AccessSection;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.common.errors.NameAlreadyUsedException;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.extensions.client.AccountFieldName;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.Sequences;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.account.externalids.ExternalIds;
-import com.google.gerrit.server.account.externalids.ExternalIdsUpdate;
-import com.google.gerrit.server.auth.NoSuchUserException;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.group.GroupsUpdate;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Optional;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.function.Consumer;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Tracks authentication related details for user accounts. */
-@Singleton
-public class AccountManager {
-  private static final Logger log = LoggerFactory.getLogger(AccountManager.class);
-
-  private final SchemaFactory<ReviewDb> schema;
-  private final Sequences sequences;
-  private final Accounts accounts;
-  private final AccountsUpdate.Server accountsUpdateFactory;
-  private final AccountCache byIdCache;
-  private final Realm realm;
-  private final IdentifiedUser.GenericFactory userFactory;
-  private final ChangeUserName.Factory changeUserNameFactory;
-  private final ProjectCache projectCache;
-  private final AtomicBoolean awaitsFirstAccountCheck;
-  private final ExternalIds externalIds;
-  private final ExternalIdsUpdate.Server externalIdsUpdateFactory;
-  private final GroupsUpdate.Factory groupsUpdateFactory;
-  private final boolean autoUpdateAccountActiveStatus;
-  private final SetInactiveFlag setInactiveFlag;
-
-  @Inject
-  AccountManager(
-      SchemaFactory<ReviewDb> schema,
-      Sequences sequences,
-      @GerritServerConfig Config cfg,
-      Accounts accounts,
-      AccountsUpdate.Server accountsUpdateFactory,
-      AccountCache byIdCache,
-      Realm accountMapper,
-      IdentifiedUser.GenericFactory userFactory,
-      ChangeUserName.Factory changeUserNameFactory,
-      ProjectCache projectCache,
-      ExternalIds externalIds,
-      ExternalIdsUpdate.Server externalIdsUpdateFactory,
-      GroupsUpdate.Factory groupsUpdateFactory,
-      SetInactiveFlag setInactiveFlag) {
-    this.schema = schema;
-    this.sequences = sequences;
-    this.accounts = accounts;
-    this.accountsUpdateFactory = accountsUpdateFactory;
-    this.byIdCache = byIdCache;
-    this.realm = accountMapper;
-    this.userFactory = userFactory;
-    this.changeUserNameFactory = changeUserNameFactory;
-    this.projectCache = projectCache;
-    this.awaitsFirstAccountCheck =
-        new AtomicBoolean(cfg.getBoolean("capability", "makeFirstUserAdmin", true));
-    this.externalIds = externalIds;
-    this.externalIdsUpdateFactory = externalIdsUpdateFactory;
-    this.groupsUpdateFactory = groupsUpdateFactory;
-    this.autoUpdateAccountActiveStatus =
-        cfg.getBoolean("auth", "autoUpdateAccountActiveStatus", false);
-    this.setInactiveFlag = setInactiveFlag;
-  }
-
-  /** @return user identified by this external identity string */
-  public Optional<Account.Id> lookup(String externalId) throws AccountException {
-    try {
-      ExternalId extId = externalIds.get(ExternalId.Key.parse(externalId));
-      return extId != null ? Optional.of(extId.accountId()) : Optional.empty();
-    } catch (IOException | ConfigInvalidException e) {
-      throw new AccountException("Cannot lookup account " + externalId, e);
-    }
-  }
-
-  /**
-   * Authenticate the user, potentially creating a new account if they are new.
-   *
-   * @param who identity of the user, with any details we received about them.
-   * @return the result of authenticating the user.
-   * @throws AccountException the account does not exist, and cannot be created, or exists, but
-   *     cannot be located, is unable to be activated or deactivated, or is inactive, or cannot be
-   *     added to the admin group (only for the first account).
-   */
-  public AuthResult authenticate(AuthRequest who) throws AccountException, IOException {
-    try {
-      who = realm.authenticate(who);
-    } catch (NoSuchUserException e) {
-      deactivateAccountIfItExists(who);
-      throw e;
-    }
-    try {
-      try (ReviewDb db = schema.open()) {
-        ExternalId id = externalIds.get(who.getExternalIdKey());
-        if (id == null) {
-          // New account, automatically create and return.
-          //
-          return create(db, who);
-        }
-
-        // Account exists
-        Account act = updateAccountActiveStatus(who, byIdCache.get(id.accountId()).getAccount());
-        if (!act.isActive()) {
-          throw new AccountException("Authentication error, account inactive");
-        }
-
-        // return the identity to the caller.
-        update(who, id);
-        return new AuthResult(id.accountId(), who.getExternalIdKey(), false);
-      }
-    } catch (OrmException | ConfigInvalidException e) {
-      throw new AccountException("Authentication error", e);
-    }
-  }
-
-  private void deactivateAccountIfItExists(AuthRequest authRequest) {
-    if (!shouldUpdateActiveStatus(authRequest)) {
-      return;
-    }
-    try {
-      ExternalId id = externalIds.get(authRequest.getExternalIdKey());
-      if (id == null) {
-        return;
-      }
-      setInactiveFlag.deactivate(id.accountId());
-    } catch (Exception e) {
-      log.error("Unable to deactivate account " + authRequest.getUserName(), e);
-    }
-  }
-
-  private Account updateAccountActiveStatus(AuthRequest authRequest, Account account)
-      throws AccountException {
-    if (!shouldUpdateActiveStatus(authRequest) || authRequest.isActive() == account.isActive()) {
-      return account;
-    }
-
-    if (authRequest.isActive()) {
-      try {
-        setInactiveFlag.activate(account.getId());
-      } catch (Exception e) {
-        throw new AccountException("Unable to activate account " + account.getId(), e);
-      }
-    } else {
-      try {
-        setInactiveFlag.deactivate(account.getId());
-      } catch (Exception e) {
-        throw new AccountException("Unable to deactivate account " + account.getId(), e);
-      }
-    }
-    return byIdCache.get(account.getId()).getAccount();
-  }
-
-  private boolean shouldUpdateActiveStatus(AuthRequest authRequest) {
-    return autoUpdateAccountActiveStatus && authRequest.authProvidesAccountActiveStatus();
-  }
-
-  private void update(AuthRequest who, ExternalId extId)
-      throws OrmException, IOException, ConfigInvalidException {
-    IdentifiedUser user = userFactory.create(extId.accountId());
-    List<Consumer<Account>> accountUpdates = new ArrayList<>();
-
-    // If the email address was modified by the authentication provider,
-    // update our records to match the changed email.
-    //
-    String newEmail = who.getEmailAddress();
-    String oldEmail = extId.email();
-    if (newEmail != null && !newEmail.equals(oldEmail)) {
-      if (oldEmail != null && oldEmail.equals(user.getAccount().getPreferredEmail())) {
-        accountUpdates.add(a -> a.setPreferredEmail(newEmail));
-      }
-
-      externalIdsUpdateFactory
-          .create()
-          .replace(
-              extId, ExternalId.create(extId.key(), extId.accountId(), newEmail, extId.password()));
-    }
-
-    if (!Strings.isNullOrEmpty(who.getDisplayName())
-        && !eq(user.getAccount().getFullName(), who.getDisplayName())) {
-      if (realm.allowsEdit(AccountFieldName.FULL_NAME)) {
-        accountUpdates.add(a -> a.setFullName(who.getDisplayName()));
-      } else {
-        log.warn(
-            "Not changing already set display name '{}' to '{}'",
-            user.getAccount().getFullName(),
-            who.getDisplayName());
-      }
-    }
-
-    if (!realm.allowsEdit(AccountFieldName.USER_NAME)
-        && who.getUserName() != null
-        && !eq(user.getUserName(), who.getUserName())) {
-      log.warn("Not changing already set username {} to {}", user.getUserName(), who.getUserName());
-    }
-
-    if (!accountUpdates.isEmpty()) {
-      Account account = accountsUpdateFactory.create().update(user.getAccountId(), accountUpdates);
-      if (account == null) {
-        throw new OrmException("Account " + user.getAccountId() + " has been deleted");
-      }
-    }
-  }
-
-  private static boolean eq(String a, String b) {
-    return (a == null && b == null) || (a != null && a.equals(b));
-  }
-
-  private AuthResult create(ReviewDb db, AuthRequest who)
-      throws OrmException, AccountException, IOException, ConfigInvalidException {
-    Account.Id newId = new Account.Id(sequences.nextAccountId());
-    log.debug("Assigning new Id {} to account", newId);
-
-    ExternalId extId =
-        ExternalId.createWithEmail(who.getExternalIdKey(), newId, who.getEmailAddress());
-    log.debug("Created external Id: {}", extId);
-
-    boolean isFirstAccount = awaitsFirstAccountCheck.getAndSet(false) && !accounts.hasAnyAccount();
-
-    Account account;
-    try {
-      AccountsUpdate accountsUpdate = accountsUpdateFactory.create();
-      account =
-          accountsUpdate.insert(
-              newId,
-              a -> {
-                a.setFullName(who.getDisplayName());
-                a.setPreferredEmail(extId.email());
-              });
-
-      ExternalId existingExtId = externalIds.get(extId.key());
-      if (existingExtId != null && !existingExtId.accountId().equals(extId.accountId())) {
-        // external ID is assigned to another account, do not overwrite
-        accountsUpdate.delete(account);
-        throw new AccountException(
-            "Cannot assign external ID \""
-                + extId.key().get()
-                + "\" to account "
-                + newId
-                + "; external ID already in use.");
-      }
-      externalIdsUpdateFactory.create().upsert(extId);
-    } finally {
-      // If adding the account failed, it may be that it actually was the
-      // first account. So we reset the 'check for first account'-guard, as
-      // otherwise the first account would not get administration permissions.
-      awaitsFirstAccountCheck.set(isFirstAccount);
-    }
-
-    IdentifiedUser user = userFactory.create(newId);
-
-    if (isFirstAccount) {
-      // This is the first user account on our site. Assume this user
-      // is going to be the site's administrator and just make them that
-      // to bootstrap the authentication database.
-      //
-      Permission admin =
-          projectCache
-              .getAllProjects()
-              .getConfig()
-              .getAccessSection(AccessSection.GLOBAL_CAPABILITIES)
-              .getPermission(GlobalCapability.ADMINISTRATE_SERVER);
-
-      AccountGroup.UUID uuid = admin.getRules().get(0).getGroup().getUUID();
-      // The user initiated this request by logging in. -> Attribute all modifications to that user.
-      GroupsUpdate groupsUpdate = groupsUpdateFactory.create(user);
-      try {
-        groupsUpdate.addGroupMember(db, uuid, newId);
-      } catch (NoSuchGroupException e) {
-        throw new AccountException(String.format("Group %s not found", uuid));
-      }
-    }
-
-    log.debug("Username from AuthRequest: {}", who.getUserName());
-    if (who.getUserName() != null) {
-      log.debug("Setting username for: {}", who.getUserName());
-      // Only set if the name hasn't been used yet, but was given to us.
-      //
-      try {
-        changeUserNameFactory.create(user, who.getUserName()).call();
-        log.debug("Identified user {} was created from {}", user, who.getUserName());
-      } catch (NameAlreadyUsedException e) {
-        String message =
-            "Cannot assign user name \""
-                + who.getUserName()
-                + "\" to account "
-                + newId
-                + "; name already in use.";
-        handleSettingUserNameFailure(account, extId, message, e, false);
-      } catch (InvalidUserNameException e) {
-        String message =
-            "Cannot assign user name \""
-                + who.getUserName()
-                + "\" to account "
-                + newId
-                + "; name does not conform.";
-        handleSettingUserNameFailure(account, extId, message, e, false);
-      } catch (OrmException e) {
-        String message = "Cannot assign user name";
-        handleSettingUserNameFailure(account, extId, message, e, true);
-      }
-    }
-
-    realm.onCreateAccount(who, account);
-    return new AuthResult(newId, extId.key(), true);
-  }
-
-  /**
-   * This method handles an exception that occurred during the setting of the user name for a newly
-   * created account. If the realm does not allow the user to set a user name manually this method
-   * deletes the newly created account and throws an {@link AccountUserNameException}. In any case
-   * the error message is logged.
-   *
-   * @param account the newly created account
-   * @param extId the newly created external id
-   * @param errorMessage the error message
-   * @param e the exception that occurred during the setting of the user name for the new account
-   * @param logException flag that decides whether the exception should be included into the log
-   * @throws AccountUserNameException thrown if the realm does not allow the user to manually set
-   *     the user name
-   * @throws OrmException thrown if cleaning the database failed
-   */
-  private void handleSettingUserNameFailure(
-      Account account, ExternalId extId, String errorMessage, Exception e, boolean logException)
-      throws AccountUserNameException, OrmException, IOException, ConfigInvalidException {
-    if (logException) {
-      log.error(errorMessage, e);
-    } else {
-      log.error(errorMessage);
-    }
-    if (!realm.allowsEdit(AccountFieldName.USER_NAME)) {
-      // setting the given user name has failed, but the realm does not
-      // allow the user to manually set a user name,
-      // this means we would end with an account without user name
-      // (without 'username:<USERNAME>' external ID),
-      // such an account cannot be used for uploading changes,
-      // this is why the best we can do here is to fail early and cleanup
-      // the database
-      accountsUpdateFactory.create().delete(account);
-      externalIdsUpdateFactory.create().delete(extId);
-      throw new AccountUserNameException(errorMessage, e);
-    }
-  }
-
-  /**
-   * Link another authentication identity to an existing account.
-   *
-   * @param to account to link the identity onto.
-   * @param who the additional identity.
-   * @return the result of linking the identity to the user.
-   * @throws AccountException the identity belongs to a different account, or it cannot be linked at
-   *     this time.
-   */
-  public AuthResult link(Account.Id to, AuthRequest who)
-      throws AccountException, OrmException, IOException, ConfigInvalidException {
-    ExternalId extId = externalIds.get(who.getExternalIdKey());
-    if (extId != null) {
-      if (!extId.accountId().equals(to)) {
-        throw new AccountException(
-            "Identity '" + extId.key().get() + "' in use by another account");
-      }
-      update(who, extId);
-    } else {
-      externalIdsUpdateFactory
-          .create()
-          .insert(ExternalId.createWithEmail(who.getExternalIdKey(), to, who.getEmailAddress()));
-
-      if (who.getEmailAddress() != null) {
-        accountsUpdateFactory
-            .create()
-            .update(
-                to,
-                a -> {
-                  if (a.getPreferredEmail() == null) {
-                    a.setPreferredEmail(who.getEmailAddress());
-                  }
-                });
-      }
-    }
-
-    return new AuthResult(to, who.getExternalIdKey(), false);
-  }
-
-  /**
-   * Update the link to another unique authentication identity to an existing account.
-   *
-   * <p>Existing external identities with the same scheme will be removed and replaced with the new
-   * one.
-   *
-   * @param to account to link the identity onto.
-   * @param who the additional identity.
-   * @return the result of linking the identity to the user.
-   * @throws OrmException
-   * @throws AccountException the identity belongs to a different account, or it cannot be linked at
-   *     this time.
-   */
-  public AuthResult updateLink(Account.Id to, AuthRequest who)
-      throws OrmException, AccountException, IOException, ConfigInvalidException {
-    Collection<ExternalId> filteredExtIdsByScheme =
-        externalIds.byAccount(to, who.getExternalIdKey().scheme());
-
-    if (!filteredExtIdsByScheme.isEmpty()
-        && (filteredExtIdsByScheme.size() > 1
-            || !filteredExtIdsByScheme.stream()
-                .filter(e -> e.key().equals(who.getExternalIdKey()))
-                .findAny()
-                .isPresent())) {
-      externalIdsUpdateFactory.create().delete(filteredExtIdsByScheme);
-    }
-    return link(to, who);
-  }
-
-  /**
-   * Unlink an external identity from an existing account.
-   *
-   * @param from account to unlink the external identity from
-   * @param extIdKey the key of the external ID that should be deleted
-   * @throws AccountException the identity belongs to a different account, or the identity was not
-   *     found
-   */
-  public void unlink(Account.Id from, ExternalId.Key extIdKey)
-      throws AccountException, OrmException, IOException, ConfigInvalidException {
-    unlink(from, ImmutableList.of(extIdKey));
-  }
-
-  /**
-   * Unlink an external identities from an existing account.
-   *
-   * @param from account to unlink the external identity from
-   * @param extIdKeys the keys of the external IDs that should be deleted
-   * @throws AccountException any of the identity belongs to a different account, or any of the
-   *     identity was not found
-   */
-  public void unlink(Account.Id from, Collection<ExternalId.Key> extIdKeys)
-      throws AccountException, OrmException, IOException, ConfigInvalidException {
-    if (extIdKeys.isEmpty()) {
-      return;
-    }
-
-    List<ExternalId> extIds = new ArrayList<>(extIdKeys.size());
-    for (ExternalId.Key extIdKey : extIdKeys) {
-      ExternalId extId = externalIds.get(extIdKey);
-      if (extId != null) {
-        if (!extId.accountId().equals(from)) {
-          throw new AccountException("Identity '" + extIdKey.get() + "' in use by another account");
-        }
-        extIds.add(extId);
-      } else {
-        throw new AccountException("Identity '" + extIdKey.get() + "' not found");
-      }
-    }
-
-    externalIdsUpdateFactory.create().delete(extIds);
-
-    if (extIds.stream().anyMatch(e -> e.email() != null)) {
-      accountsUpdateFactory
-          .create()
-          .update(
-              from,
-              a -> {
-                if (a.getPreferredEmail() != null) {
-                  for (ExternalId extId : extIds) {
-                    if (a.getPreferredEmail().equals(extId.email())) {
-                      a.setPreferredEmail(null);
-                      break;
-                    }
-                  }
-                }
-              });
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountResolver.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountResolver.java
deleted file mode 100644
index 5344d46..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountResolver.java
+++ /dev/null
@@ -1,184 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.account;
-
-import static java.util.stream.Collectors.toSet;
-
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.query.account.InternalAccountQuery;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-@Singleton
-public class AccountResolver {
-  private final Realm realm;
-  private final Accounts accounts;
-  private final AccountCache byId;
-  private final Provider<InternalAccountQuery> accountQueryProvider;
-  private final Emails emails;
-
-  @Inject
-  AccountResolver(
-      Realm realm,
-      Accounts accounts,
-      AccountCache byId,
-      Provider<InternalAccountQuery> accountQueryProvider,
-      Emails emails) {
-    this.realm = realm;
-    this.accounts = accounts;
-    this.byId = byId;
-    this.accountQueryProvider = accountQueryProvider;
-    this.emails = emails;
-  }
-
-  /**
-   * Locate exactly one account matching the name or name/email string.
-   *
-   * @param nameOrEmail a string of the format "Full Name &lt;email@example&gt;", just the email
-   *     address ("email@example"), a full name ("Full Name"), an account id ("18419") or an user
-   *     name ("username").
-   * @return the single account that matches; null if no account matches or there are multiple
-   *     candidates.
-   */
-  public Account find(String nameOrEmail) throws OrmException, IOException, ConfigInvalidException {
-    Set<Account.Id> r = findAll(nameOrEmail);
-    if (r.size() == 1) {
-      return byId.get(r.iterator().next()).getAccount();
-    }
-
-    Account match = null;
-    for (Account.Id id : r) {
-      Account account = byId.get(id).getAccount();
-      if (!account.isActive()) {
-        continue;
-      }
-      if (match != null) {
-        return null;
-      }
-      match = account;
-    }
-    return match;
-  }
-
-  /**
-   * Find all accounts matching the name or name/email string.
-   *
-   * @param nameOrEmail a string of the format "Full Name &lt;email@example&gt;", just the email
-   *     address ("email@example"), a full name ("Full Name"), an account id ("18419") or an user
-   *     name ("username").
-   * @return the accounts that match, empty collection if none. Never null.
-   */
-  public Set<Account.Id> findAll(String nameOrEmail)
-      throws OrmException, IOException, ConfigInvalidException {
-    Matcher m = Pattern.compile("^.* \\(([1-9][0-9]*)\\)$").matcher(nameOrEmail);
-    if (m.matches()) {
-      Account.Id id = Account.Id.parse(m.group(1));
-      if (accounts.get(id) != null) {
-        return Collections.singleton(id);
-      }
-      return Collections.emptySet();
-    }
-
-    if (nameOrEmail.matches("^[1-9][0-9]*$")) {
-      Account.Id id = Account.Id.parse(nameOrEmail);
-      if (accounts.get(id) != null) {
-        return Collections.singleton(id);
-      }
-      return Collections.emptySet();
-    }
-
-    if (ExternalId.isValidUsername(nameOrEmail)) {
-      AccountState who = byId.getByUsername(nameOrEmail);
-      if (who != null) {
-        return Collections.singleton(who.getAccount().getId());
-      }
-    }
-
-    return findAllByNameOrEmail(nameOrEmail);
-  }
-
-  /**
-   * Locate exactly one account matching the name or name/email string.
-   *
-   * @param nameOrEmail a string of the format "Full Name &lt;email@example&gt;", just the email
-   *     address ("email@example"), a full name ("Full Name").
-   * @return the single account that matches; null if no account matches or there are multiple
-   *     candidates.
-   */
-  public Account findByNameOrEmail(String nameOrEmail) throws OrmException, IOException {
-    Set<Account.Id> r = findAllByNameOrEmail(nameOrEmail);
-    return r.size() == 1 ? byId.get(r.iterator().next()).getAccount() : null;
-  }
-
-  /**
-   * Locate exactly one account matching the name or name/email string.
-   *
-   * @param nameOrEmail a string of the format "Full Name &lt;email@example&gt;", just the email
-   *     address ("email@example"), a full name ("Full Name").
-   * @return the accounts that match, empty collection if none. Never null.
-   */
-  public Set<Account.Id> findAllByNameOrEmail(String nameOrEmail) throws OrmException, IOException {
-    int lt = nameOrEmail.indexOf('<');
-    int gt = nameOrEmail.indexOf('>');
-    if (lt >= 0 && gt > lt && nameOrEmail.contains("@")) {
-      Set<Account.Id> ids = emails.getAccountFor(nameOrEmail.substring(lt + 1, gt));
-      if (ids.isEmpty() || ids.size() == 1) {
-        return ids;
-      }
-
-      // more than one match, try to return the best one
-      String name = nameOrEmail.substring(0, lt - 1);
-      Set<Account.Id> nameMatches = new HashSet<>();
-      for (Account.Id id : ids) {
-        Account a = byId.get(id).getAccount();
-        if (name.equals(a.getFullName())) {
-          nameMatches.add(id);
-        }
-      }
-      return nameMatches.isEmpty() ? ids : nameMatches;
-    }
-
-    if (nameOrEmail.contains("@")) {
-      return emails.getAccountFor(nameOrEmail);
-    }
-
-    Account.Id id = realm.lookup(nameOrEmail);
-    if (id != null) {
-      return Collections.singleton(id);
-    }
-
-    List<AccountState> m = accountQueryProvider.get().byFullName(nameOrEmail);
-    if (m.size() == 1) {
-      return Collections.singleton(m.get(0).getAccount().getId());
-    }
-
-    // At this point we have no clue. Just perform a whole bunch of suggestions
-    // and pray we come up with a reasonable result list.
-    return accountQueryProvider.get().byDefault(nameOrEmail).stream()
-        .map(a -> a.getAccount().getId())
-        .collect(toSet());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountResource.java
deleted file mode 100644
index 27e713f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountResource.java
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.account;
-
-import com.google.gerrit.extensions.restapi.RestResource;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.reviewdb.client.AccountSshKey;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.change.ChangeResource;
-import com.google.inject.TypeLiteral;
-import java.util.Set;
-
-public class AccountResource implements RestResource {
-  public static final TypeLiteral<RestView<AccountResource>> ACCOUNT_KIND =
-      new TypeLiteral<RestView<AccountResource>>() {};
-
-  public static final TypeLiteral<RestView<Capability>> CAPABILITY_KIND =
-      new TypeLiteral<RestView<Capability>>() {};
-
-  public static final TypeLiteral<RestView<Email>> EMAIL_KIND =
-      new TypeLiteral<RestView<Email>>() {};
-
-  public static final TypeLiteral<RestView<SshKey>> SSH_KEY_KIND =
-      new TypeLiteral<RestView<SshKey>>() {};
-
-  public static final TypeLiteral<RestView<StarredChange>> STARRED_CHANGE_KIND =
-      new TypeLiteral<RestView<StarredChange>>() {};
-
-  private final IdentifiedUser user;
-
-  public AccountResource(IdentifiedUser user) {
-    this.user = user;
-  }
-
-  public IdentifiedUser getUser() {
-    return user;
-  }
-
-  public static class Capability implements RestResource {
-    private final IdentifiedUser user;
-    private final String capability;
-
-    public Capability(IdentifiedUser user, String capability) {
-      this.user = user;
-      this.capability = capability;
-    }
-
-    public IdentifiedUser getUser() {
-      return user;
-    }
-
-    public String getCapability() {
-      return capability;
-    }
-  }
-
-  public static class Email extends AccountResource {
-    private final String email;
-
-    public Email(IdentifiedUser user, String email) {
-      super(user);
-      this.email = email;
-    }
-
-    public String getEmail() {
-      return email;
-    }
-  }
-
-  public static class SshKey extends AccountResource {
-    private final AccountSshKey sshKey;
-
-    public SshKey(IdentifiedUser user, AccountSshKey sshKey) {
-      super(user);
-      this.sshKey = sshKey;
-    }
-
-    public AccountSshKey getSshKey() {
-      return sshKey;
-    }
-  }
-
-  public static class StarredChange extends AccountResource {
-    private final ChangeResource change;
-
-    public StarredChange(IdentifiedUser user, ChangeResource change) {
-      super(user);
-      this.change = change;
-    }
-
-    public Change getChange() {
-      return change.getChange();
-    }
-  }
-
-  public static class Star implements RestResource {
-    public static final TypeLiteral<RestView<Star>> STAR_KIND =
-        new TypeLiteral<RestView<Star>>() {};
-
-    private final IdentifiedUser user;
-    private final ChangeResource change;
-    private final Set<String> labels;
-
-    public Star(IdentifiedUser user, ChangeResource change, Set<String> labels) {
-      this.user = user;
-      this.change = change;
-      this.labels = labels;
-    }
-
-    public IdentifiedUser getUser() {
-      return user;
-    }
-
-    public Change getChange() {
-      return change.getChange();
-    }
-
-    public Set<String> getLabels() {
-      return labels;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountState.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountState.java
deleted file mode 100644
index 770ecf5..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountState.java
+++ /dev/null
@@ -1,188 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.account;
-
-import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_MAILTO;
-import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_USERNAME;
-
-import com.google.common.base.Function;
-import com.google.common.base.Strings;
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheBuilder;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.CurrentUser.PropertyKey;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.WatchConfig.NotifyType;
-import com.google.gerrit.server.account.WatchConfig.ProjectWatchKey;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.config.AllUsersName;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import org.apache.commons.codec.DecoderException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class AccountState {
-  private static final Logger logger = LoggerFactory.getLogger(AccountState.class);
-
-  public static final Function<AccountState, Account.Id> ACCOUNT_ID_FUNCTION =
-      a -> a.getAccount().getId();
-
-  private final AllUsersName allUsersName;
-  private final Account account;
-  private final Collection<ExternalId> externalIds;
-  private final Map<ProjectWatchKey, Set<NotifyType>> projectWatches;
-  private Cache<IdentifiedUser.PropertyKey<Object>, Object> properties;
-
-  public AccountState(
-      AllUsersName allUsersName,
-      Account account,
-      Collection<ExternalId> externalIds,
-      Map<ProjectWatchKey, Set<NotifyType>> projectWatches) {
-    this.allUsersName = allUsersName;
-    this.account = account;
-    this.externalIds = externalIds;
-    this.projectWatches = projectWatches;
-    this.account.setUserName(getUserName(externalIds));
-  }
-
-  public AllUsersName getAllUsersNameForIndexing() {
-    return allUsersName;
-  }
-
-  /** Get the cached account metadata. */
-  public Account getAccount() {
-    return account;
-  }
-
-  /**
-   * Get the username, if one has been declared for this user.
-   *
-   * <p>The username is the {@link ExternalId} using the scheme {@link ExternalId#SCHEME_USERNAME}.
-   */
-  public String getUserName() {
-    return account.getUserName();
-  }
-
-  public boolean checkPassword(String password, String username) {
-    if (password == null) {
-      return false;
-    }
-    for (ExternalId id : getExternalIds()) {
-      // Only process the "username:$USER" entry, which is unique.
-      if (!id.isScheme(SCHEME_USERNAME) || !username.equals(id.key().id())) {
-        continue;
-      }
-
-      String hashedStr = id.password();
-      if (!Strings.isNullOrEmpty(hashedStr)) {
-        try {
-          return HashedPassword.decode(hashedStr).checkPassword(password);
-        } catch (DecoderException e) {
-          logger.error("DecoderException for user {}: {}", username, e.getMessage());
-          return false;
-        }
-      }
-    }
-    return false;
-  }
-
-  /** The external identities that identify the account holder. */
-  public Collection<ExternalId> getExternalIds() {
-    return externalIds;
-  }
-
-  /** The project watches of the account. */
-  public Map<ProjectWatchKey, Set<NotifyType>> getProjectWatches() {
-    return projectWatches;
-  }
-
-  public static String getUserName(Collection<ExternalId> ids) {
-    for (ExternalId extId : ids) {
-      if (extId.isScheme(SCHEME_USERNAME)) {
-        return extId.key().id();
-      }
-    }
-    return null;
-  }
-
-  public static Set<String> getEmails(Collection<ExternalId> ids) {
-    Set<String> emails = new HashSet<>();
-    for (ExternalId extId : ids) {
-      if (extId.isScheme(SCHEME_MAILTO)) {
-        emails.add(extId.key().id());
-      }
-    }
-    return emails;
-  }
-
-  /**
-   * Lookup a previously stored property.
-   *
-   * <p>All properties are automatically cleared when the account cache invalidates the {@code
-   * AccountState}. This method is thread-safe.
-   *
-   * @param key unique property key.
-   * @return previously stored value, or {@code null}.
-   */
-  @Nullable
-  public <T> T get(PropertyKey<T> key) {
-    Cache<PropertyKey<Object>, Object> p = properties(false);
-    if (p != null) {
-      @SuppressWarnings("unchecked")
-      T value = (T) p.getIfPresent(key);
-      return value;
-    }
-    return null;
-  }
-
-  /**
-   * Store a property for later retrieval.
-   *
-   * <p>This method is thread-safe.
-   *
-   * @param key unique property key.
-   * @param value value to store; or {@code null} to clear the value.
-   */
-  public <T> void put(PropertyKey<T> key, @Nullable T value) {
-    Cache<PropertyKey<Object>, Object> p = properties(value != null);
-    if (p != null) {
-      @SuppressWarnings("unchecked")
-      PropertyKey<Object> k = (PropertyKey<Object>) key;
-      if (value != null) {
-        p.put(k, value);
-      } else {
-        p.invalidate(k);
-      }
-    }
-  }
-
-  private synchronized Cache<PropertyKey<Object>, Object> properties(boolean allocate) {
-    if (properties == null && allocate) {
-      properties =
-          CacheBuilder.newBuilder()
-              .concurrencyLevel(1)
-              .initialCapacity(16)
-              // Use weakKeys to ensure plugins that garbage collect will also
-              // eventually release data held in any still live AccountState.
-              .weakKeys()
-              .build();
-    }
-    return properties;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountUserNameException.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountUserNameException.java
deleted file mode 100644
index f1a2555..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountUserNameException.java
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.server.account;
-
-/**
- * Thrown by {@link AccountManager} if the user name for a newly created account could not be set
- * and the realm does not allow the user to set a user name manually.
- */
-public class AccountUserNameException extends AccountException {
-  private static final long serialVersionUID = 1L;
-
-  public AccountUserNameException(String message, Throwable why) {
-    super(message, why);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/Accounts.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/Accounts.java
deleted file mode 100644
index c384e49..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/Accounts.java
+++ /dev/null
@@ -1,148 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.account;
-
-import static java.util.Comparator.comparing;
-import static java.util.stream.Collectors.toList;
-import static java.util.stream.Collectors.toSet;
-
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.mail.send.OutgoingEmailValidator;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Objects;
-import java.util.Set;
-import java.util.stream.Stream;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.Repository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Class to access accounts. */
-@Singleton
-public class Accounts {
-  private static final Logger log = LoggerFactory.getLogger(Accounts.class);
-
-  private final GitRepositoryManager repoManager;
-  private final AllUsersName allUsersName;
-  private final OutgoingEmailValidator emailValidator;
-
-  @Inject
-  Accounts(
-      GitRepositoryManager repoManager,
-      AllUsersName allUsersName,
-      OutgoingEmailValidator emailValidator) {
-    this.repoManager = repoManager;
-    this.allUsersName = allUsersName;
-    this.emailValidator = emailValidator;
-  }
-
-  public Account get(Account.Id accountId) throws IOException, ConfigInvalidException {
-    try (Repository repo = repoManager.openRepository(allUsersName)) {
-      return read(repo, accountId);
-    }
-  }
-
-  public List<Account> get(Collection<Account.Id> accountIds)
-      throws IOException, ConfigInvalidException {
-    List<Account> accounts = new ArrayList<>(accountIds.size());
-    try (Repository repo = repoManager.openRepository(allUsersName)) {
-      for (Account.Id accountId : accountIds) {
-        accounts.add(read(repo, accountId));
-      }
-    }
-    return accounts;
-  }
-
-  /**
-   * Returns all accounts.
-   *
-   * @return all accounts
-   */
-  public List<Account> all() throws IOException {
-    Set<Account.Id> accountIds = allIds();
-    List<Account> accounts = new ArrayList<>(accountIds.size());
-    try (Repository repo = repoManager.openRepository(allUsersName)) {
-      for (Account.Id accountId : accountIds) {
-        try {
-          accounts.add(read(repo, accountId));
-        } catch (Exception e) {
-          log.error("Ignoring invalid account {}", accountId.get(), e);
-        }
-      }
-    }
-    return accounts;
-  }
-
-  /**
-   * Returns all account IDs.
-   *
-   * @return all account IDs
-   */
-  public Set<Account.Id> allIds() throws IOException {
-    return readUserRefs().collect(toSet());
-  }
-
-  /**
-   * Returns the first n account IDs.
-   *
-   * @param n the number of account IDs that should be returned
-   * @return first n account IDs
-   */
-  public List<Account.Id> firstNIds(int n) throws IOException {
-    return readUserRefs().sorted(comparing(id -> id.get())).limit(n).collect(toList());
-  }
-
-  /**
-   * Checks if any account exists.
-   *
-   * @return {@code true} if at least one account exists, otherwise {@code false}
-   */
-  public boolean hasAnyAccount() throws IOException {
-    try (Repository repo = repoManager.openRepository(allUsersName)) {
-      return hasAnyAccount(repo);
-    }
-  }
-
-  public static boolean hasAnyAccount(Repository repo) throws IOException {
-    return readUserRefs(repo).findAny().isPresent();
-  }
-
-  private Stream<Account.Id> readUserRefs() throws IOException {
-    try (Repository repo = repoManager.openRepository(allUsersName)) {
-      return readUserRefs(repo);
-    }
-  }
-
-  private Account read(Repository allUsersRepository, Account.Id accountId)
-      throws IOException, ConfigInvalidException {
-    AccountConfig accountConfig = new AccountConfig(emailValidator, accountId);
-    accountConfig.load(allUsersRepository);
-    return accountConfig.getAccount();
-  }
-
-  public static Stream<Account.Id> readUserRefs(Repository repo) throws IOException {
-    return repo.getRefDatabase().getRefs(RefNames.REFS_USERS).values().stream()
-        .map(r -> Account.Id.fromRef(r.getName()))
-        .filter(Objects::nonNull);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountsCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountsCollection.java
deleted file mode 100644
index 19a8259..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountsCollection.java
+++ /dev/null
@@ -1,165 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.account;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AcceptsCreate;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestCollection;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.AnonymousUser;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-@Singleton
-public class AccountsCollection
-    implements RestCollection<TopLevelResource, AccountResource>, AcceptsCreate<TopLevelResource> {
-  private final Provider<CurrentUser> self;
-  private final AccountResolver resolver;
-  private final AccountControl.Factory accountControlFactory;
-  private final IdentifiedUser.GenericFactory userFactory;
-  private final Provider<QueryAccounts> list;
-  private final DynamicMap<RestView<AccountResource>> views;
-  private final CreateAccount.Factory createAccountFactory;
-
-  @Inject
-  AccountsCollection(
-      Provider<CurrentUser> self,
-      AccountResolver resolver,
-      AccountControl.Factory accountControlFactory,
-      IdentifiedUser.GenericFactory userFactory,
-      Provider<QueryAccounts> list,
-      DynamicMap<RestView<AccountResource>> views,
-      CreateAccount.Factory createAccountFactory) {
-    this.self = self;
-    this.resolver = resolver;
-    this.accountControlFactory = accountControlFactory;
-    this.userFactory = userFactory;
-    this.list = list;
-    this.views = views;
-    this.createAccountFactory = createAccountFactory;
-  }
-
-  @Override
-  public AccountResource parse(TopLevelResource root, IdString id)
-      throws ResourceNotFoundException, AuthException, OrmException, IOException,
-          ConfigInvalidException {
-    IdentifiedUser user = parseId(id.get());
-    if (user == null) {
-      throw new ResourceNotFoundException(id);
-    } else if (!accountControlFactory.get().canSee(user.getAccount())) {
-      throw new ResourceNotFoundException(id);
-    }
-    return new AccountResource(user);
-  }
-
-  /**
-   * Parses a account ID from a request body and returns the user.
-   *
-   * @param id ID of the account, can be a string of the format "{@code Full Name
-   *     <email@example.com>}", just the email address, a full name if it is unique, an account ID,
-   *     a user name or "{@code self}" for the calling user
-   * @return the user, never null.
-   * @throws UnprocessableEntityException thrown if the account ID cannot be resolved or if the
-   *     account is not visible to the calling user
-   */
-  public IdentifiedUser parse(String id)
-      throws AuthException, UnprocessableEntityException, OrmException, IOException,
-          ConfigInvalidException {
-    return parseOnBehalfOf(null, id);
-  }
-
-  /**
-   * Parses an account ID and returns the user without making any permission check whether the
-   * current user can see the account.
-   *
-   * @param id ID of the account, can be a string of the format "{@code Full Name
-   *     <email@example.com>}", just the email address, a full name if it is unique, an account ID,
-   *     a user name or "{@code self}" for the calling user
-   * @return the user, null if no user is found for the given account ID
-   * @throws AuthException thrown if 'self' is used as account ID and the current user is not
-   *     authenticated
-   * @throws OrmException
-   * @throws ConfigInvalidException
-   * @throws IOException
-   */
-  public IdentifiedUser parseId(String id)
-      throws AuthException, OrmException, IOException, ConfigInvalidException {
-    return parseIdOnBehalfOf(null, id);
-  }
-
-  /**
-   * Like {@link #parse(String)}, but also sets the {@link CurrentUser#getRealUser()} on the result.
-   */
-  public IdentifiedUser parseOnBehalfOf(@Nullable CurrentUser caller, String id)
-      throws AuthException, UnprocessableEntityException, OrmException, IOException,
-          ConfigInvalidException {
-    IdentifiedUser user = parseIdOnBehalfOf(caller, id);
-    if (user == null) {
-      throw new UnprocessableEntityException(String.format("Account Not Found: %s", id));
-    } else if (!accountControlFactory.get().canSee(user.getAccount())) {
-      throw new UnprocessableEntityException(String.format("Account Not Found: %s", id));
-    }
-    return user;
-  }
-
-  private IdentifiedUser parseIdOnBehalfOf(@Nullable CurrentUser caller, String id)
-      throws AuthException, OrmException, IOException, ConfigInvalidException {
-    if (id.equals("self")) {
-      CurrentUser user = self.get();
-      if (user.isIdentifiedUser()) {
-        return user.asIdentifiedUser();
-      } else if (user instanceof AnonymousUser) {
-        throw new AuthException("Authentication required");
-      } else {
-        return null;
-      }
-    }
-
-    Account match = resolver.find(id);
-    if (match == null) {
-      return null;
-    }
-    CurrentUser realUser = caller != null ? caller.getRealUser() : null;
-    return userFactory.runAs(null, match.getId(), realUser);
-  }
-
-  @Override
-  public RestView<TopLevelResource> list() throws ResourceNotFoundException {
-    return list.get();
-  }
-
-  @Override
-  public DynamicMap<RestView<AccountResource>> views() {
-    return views;
-  }
-
-  @Override
-  public CreateAccount create(TopLevelResource parent, IdString username) {
-    return createAccountFactory.create(username.get());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountsConsistencyChecker.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountsConsistencyChecker.java
deleted file mode 100644
index b53a926..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountsConsistencyChecker.java
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.account;
-
-import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo.ConsistencyProblemInfo;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.account.externalids.ExternalIds;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-@Singleton
-public class AccountsConsistencyChecker {
-  private final Accounts accounts;
-  private final ExternalIds externalIds;
-
-  @Inject
-  AccountsConsistencyChecker(Accounts accounts, ExternalIds externalIds) {
-    this.accounts = accounts;
-    this.externalIds = externalIds;
-  }
-
-  public List<ConsistencyProblemInfo> check() throws IOException {
-    List<ConsistencyProblemInfo> problems = new ArrayList<>();
-
-    for (Account account : accounts.all()) {
-      if (account.getPreferredEmail() != null) {
-        if (!externalIds.byAccount(account.getId()).stream()
-            .anyMatch(e -> account.getPreferredEmail().equals(e.email()))) {
-          addError(
-              String.format(
-                  "Account '%s' has no external ID for its preferred email '%s'",
-                  account.getId().get(), account.getPreferredEmail()),
-              problems);
-        }
-      }
-    }
-
-    return problems;
-  }
-
-  private static void addError(String error, List<ConsistencyProblemInfo> problems) {
-    problems.add(new ConsistencyProblemInfo(ConsistencyProblemInfo.Status.ERROR, error));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountsUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountsUpdate.java
deleted file mode 100644
index 6f11015..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountsUpdate.java
+++ /dev/null
@@ -1,356 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.account;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.index.change.ReindexAfterRefUpdate;
-import com.google.gerrit.server.mail.send.OutgoingEmailValidator;
-import com.google.gwtorm.server.OrmDuplicateKeyException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.List;
-import java.util.function.Consumer;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.RefUpdate.Result;
-import org.eclipse.jgit.lib.Repository;
-
-/**
- * Updates accounts.
- *
- * <p>The account updates are written to NoteDb.
- *
- * <p>In NoteDb accounts are represented as user branches in the All-Users repository. Optionally a
- * user branch can contain a 'account.config' file that stores account properties, such as full
- * name, preferred email, status and the active flag. The timestamp of the first commit on a user
- * branch denotes the registration date. The initial commit on the user branch may be empty (since
- * having an 'account.config' is optional). See {@link AccountConfig} for details of the
- * 'account.config' file format.
- *
- * <p>On updating accounts the accounts are evicted from the account cache and thus reindexed. The
- * eviction from the account cache is done by the {@link ReindexAfterRefUpdate} class which receives
- * the event about updating the user branch that is triggered by this class.
- */
-@Singleton
-public class AccountsUpdate {
-  /**
-   * Factory to create an AccountsUpdate instance for updating accounts by the Gerrit server.
-   *
-   * <p>The Gerrit server identity will be used as author and committer for all commits that update
-   * the accounts.
-   */
-  @Singleton
-  public static class Server {
-    private final GitRepositoryManager repoManager;
-    private final GitReferenceUpdated gitRefUpdated;
-    private final AllUsersName allUsersName;
-    private final OutgoingEmailValidator emailValidator;
-    private final Provider<PersonIdent> serverIdent;
-    private final Provider<MetaDataUpdate.Server> metaDataUpdateServerFactory;
-
-    @Inject
-    public Server(
-        GitRepositoryManager repoManager,
-        GitReferenceUpdated gitRefUpdated,
-        AllUsersName allUsersName,
-        OutgoingEmailValidator emailValidator,
-        @GerritPersonIdent Provider<PersonIdent> serverIdent,
-        Provider<MetaDataUpdate.Server> metaDataUpdateServerFactory) {
-      this.repoManager = repoManager;
-      this.gitRefUpdated = gitRefUpdated;
-      this.allUsersName = allUsersName;
-      this.emailValidator = emailValidator;
-      this.serverIdent = serverIdent;
-      this.metaDataUpdateServerFactory = metaDataUpdateServerFactory;
-    }
-
-    public AccountsUpdate create() {
-      PersonIdent i = serverIdent.get();
-      return new AccountsUpdate(
-          repoManager,
-          gitRefUpdated,
-          null,
-          allUsersName,
-          emailValidator,
-          i,
-          () -> metaDataUpdateServerFactory.get().create(allUsersName));
-    }
-  }
-
-  /**
-   * Factory to create an AccountsUpdate instance for updating accounts by the current user.
-   *
-   * <p>The identity of the current user will be used as author for all commits that update the
-   * accounts. The Gerrit server identity will be used as committer.
-   */
-  @Singleton
-  public static class User {
-    private final GitRepositoryManager repoManager;
-    private final GitReferenceUpdated gitRefUpdated;
-    private final AllUsersName allUsersName;
-    private final OutgoingEmailValidator emailValidator;
-    private final Provider<PersonIdent> serverIdent;
-    private final Provider<IdentifiedUser> identifiedUser;
-    private final Provider<MetaDataUpdate.User> metaDataUpdateUserFactory;
-
-    @Inject
-    public User(
-        GitRepositoryManager repoManager,
-        GitReferenceUpdated gitRefUpdated,
-        AllUsersName allUsersName,
-        OutgoingEmailValidator emailValidator,
-        @GerritPersonIdent Provider<PersonIdent> serverIdent,
-        Provider<IdentifiedUser> identifiedUser,
-        Provider<MetaDataUpdate.User> metaDataUpdateUserFactory) {
-      this.repoManager = repoManager;
-      this.gitRefUpdated = gitRefUpdated;
-      this.allUsersName = allUsersName;
-      this.serverIdent = serverIdent;
-      this.emailValidator = emailValidator;
-      this.identifiedUser = identifiedUser;
-      this.metaDataUpdateUserFactory = metaDataUpdateUserFactory;
-    }
-
-    public AccountsUpdate create() {
-      IdentifiedUser user = identifiedUser.get();
-      PersonIdent i = serverIdent.get();
-      return new AccountsUpdate(
-          repoManager,
-          gitRefUpdated,
-          user,
-          allUsersName,
-          emailValidator,
-          createPersonIdent(i, user),
-          () -> metaDataUpdateUserFactory.get().create(allUsersName));
-    }
-
-    private PersonIdent createPersonIdent(PersonIdent ident, IdentifiedUser user) {
-      return user.newCommitterIdent(ident.getWhen(), ident.getTimeZone());
-    }
-  }
-
-  private final GitRepositoryManager repoManager;
-  private final GitReferenceUpdated gitRefUpdated;
-  @Nullable private final IdentifiedUser currentUser;
-  private final AllUsersName allUsersName;
-  private final OutgoingEmailValidator emailValidator;
-  private final PersonIdent committerIdent;
-  private final MetaDataUpdateFactory metaDataUpdateFactory;
-
-  private AccountsUpdate(
-      GitRepositoryManager repoManager,
-      GitReferenceUpdated gitRefUpdated,
-      @Nullable IdentifiedUser currentUser,
-      AllUsersName allUsersName,
-      OutgoingEmailValidator emailValidator,
-      PersonIdent committerIdent,
-      MetaDataUpdateFactory metaDataUpdateFactory) {
-    this.repoManager = checkNotNull(repoManager, "repoManager");
-    this.gitRefUpdated = checkNotNull(gitRefUpdated, "gitRefUpdated");
-    this.currentUser = currentUser;
-    this.allUsersName = checkNotNull(allUsersName, "allUsersName");
-    this.emailValidator = checkNotNull(emailValidator, "emailValidator");
-    this.committerIdent = checkNotNull(committerIdent, "committerIdent");
-    this.metaDataUpdateFactory = checkNotNull(metaDataUpdateFactory, "metaDataUpdateFactory");
-  }
-
-  /**
-   * Inserts a new account.
-   *
-   * @param accountId ID of the new account
-   * @param init consumer to populate the new account
-   * @return the newly created account
-   * @throws OrmDuplicateKeyException if the account already exists
-   * @throws IOException if updating the user branch fails
-   * @throws ConfigInvalidException if any of the account fields has an invalid value
-   */
-  public Account insert(Account.Id accountId, Consumer<Account> init)
-      throws OrmDuplicateKeyException, IOException, ConfigInvalidException {
-    AccountConfig accountConfig = read(accountId);
-    Account account = accountConfig.getNewAccount();
-    init.accept(account);
-
-    // Create in NoteDb
-    commitNew(accountConfig);
-    return account;
-  }
-
-  /**
-   * Gets the account and updates it atomically.
-   *
-   * <p>Changing the registration date of an account is not supported.
-   *
-   * @param accountId ID of the account
-   * @param consumer consumer to update the account, only invoked if the account exists
-   * @return the updated account, {@code null} if the account doesn't exist
-   * @throws IOException if updating the user branch fails
-   * @throws ConfigInvalidException if any of the account fields has an invalid value
-   */
-  public Account update(Account.Id accountId, Consumer<Account> consumer)
-      throws IOException, ConfigInvalidException {
-    return update(accountId, ImmutableList.of(consumer));
-  }
-
-  /**
-   * Gets the account and updates it atomically.
-   *
-   * <p>Changing the registration date of an account is not supported.
-   *
-   * @param accountId ID of the account
-   * @param consumers consumers to update the account, only invoked if the account exists
-   * @return the updated account, {@code null} if the account doesn't exist
-   * @throws IOException if updating the user branch fails
-   * @throws ConfigInvalidException if any of the account fields has an invalid value
-   */
-  public Account update(Account.Id accountId, List<Consumer<Account>> consumers)
-      throws IOException, ConfigInvalidException {
-    if (consumers.isEmpty()) {
-      return null;
-    }
-
-    AccountConfig accountConfig = read(accountId);
-    Account account = accountConfig.getAccount();
-    if (account != null) {
-      consumers.stream().forEach(c -> c.accept(account));
-      commit(accountConfig);
-    }
-
-    return account;
-  }
-
-  /**
-   * Replaces the account.
-   *
-   * <p>The existing account with the same account ID is overwritten by the given account. Choosing
-   * to overwrite an account means that any updates that were done to the account by a racing
-   * request after the account was read are lost. Updates are also lost if the account was read from
-   * a stale account index. This is why using {@link
-   * #update(com.google.gerrit.reviewdb.client.Account.Id, Consumer)} to do an atomic update is
-   * always preferred.
-   *
-   * <p>Changing the registration date of an account is not supported.
-   *
-   * @param account the new account
-   * @throws IOException if updating the user branch fails
-   * @throws ConfigInvalidException if any of the account fields has an invalid value
-   * @see #update(com.google.gerrit.reviewdb.client.Account.Id, Consumer)
-   */
-  public void replace(Account account) throws IOException, ConfigInvalidException {
-    AccountConfig accountConfig = read(account.getId());
-    accountConfig.setAccount(account);
-    commit(accountConfig);
-  }
-
-  /**
-   * Deletes the account.
-   *
-   * @param account the account that should be deleted
-   * @throws IOException if updating the user branch fails
-   */
-  public void delete(Account account) throws IOException {
-    deleteByKey(account.getId());
-  }
-
-  /**
-   * Deletes the account.
-   *
-   * @param accountId the ID of the account that should be deleted
-   * @throws IOException if updating the user branch fails
-   */
-  public void deleteByKey(Account.Id accountId) throws IOException {
-    deleteUserBranch(accountId);
-  }
-
-  private void deleteUserBranch(Account.Id accountId) throws IOException {
-    try (Repository repo = repoManager.openRepository(allUsersName)) {
-      deleteUserBranch(repo, allUsersName, gitRefUpdated, currentUser, committerIdent, accountId);
-    }
-  }
-
-  public static void deleteUserBranch(
-      Repository repo,
-      Project.NameKey project,
-      GitReferenceUpdated gitRefUpdated,
-      @Nullable IdentifiedUser user,
-      PersonIdent refLogIdent,
-      Account.Id accountId)
-      throws IOException {
-    String refName = RefNames.refsUsers(accountId);
-    Ref ref = repo.exactRef(refName);
-    if (ref == null) {
-      return;
-    }
-
-    RefUpdate ru = repo.updateRef(refName);
-    ru.setExpectedOldObjectId(ref.getObjectId());
-    ru.setNewObjectId(ObjectId.zeroId());
-    ru.setForceUpdate(true);
-    ru.setRefLogIdent(refLogIdent);
-    ru.setRefLogMessage("Delete Account", true);
-    Result result = ru.delete();
-    if (result != Result.FORCED) {
-      throw new IOException(String.format("Failed to delete ref %s: %s", refName, result.name()));
-    }
-    gitRefUpdated.fire(project, ru, user != null ? user.getAccount() : null);
-  }
-
-  private AccountConfig read(Account.Id accountId) throws IOException, ConfigInvalidException {
-    try (Repository repo = repoManager.openRepository(allUsersName)) {
-      AccountConfig accountConfig = new AccountConfig(emailValidator, accountId);
-      accountConfig.load(repo);
-      return accountConfig;
-    }
-  }
-
-  private void commitNew(AccountConfig accountConfig) throws IOException {
-    // When creating a new account we must allow empty commits so that the user branch gets created
-    // with an empty commit when no account properties are set and hence no 'account.config' file
-    // will be created.
-    commit(accountConfig, true);
-  }
-
-  private void commit(AccountConfig accountConfig) throws IOException {
-    commit(accountConfig, false);
-  }
-
-  private void commit(AccountConfig accountConfig, boolean allowEmptyCommit) throws IOException {
-    try (MetaDataUpdate md = metaDataUpdateFactory.create()) {
-      md.setAllowEmpty(allowEmptyCommit);
-      accountConfig.commit(md);
-    }
-  }
-
-  @FunctionalInterface
-  private static interface MetaDataUpdateFactory {
-    MetaDataUpdate create() throws IOException;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AddSshKey.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AddSshKey.java
deleted file mode 100644
index ad9cd68..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AddSshKey.java
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.account;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.io.ByteSource;
-import com.google.gerrit.common.errors.EmailException;
-import com.google.gerrit.common.errors.InvalidSshKeyException;
-import com.google.gerrit.extensions.common.SshKeyInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.RawInput;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.reviewdb.client.AccountSshKey;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AddSshKey.Input;
-import com.google.gerrit.server.mail.send.AddKeySender;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.ssh.SshKeyCache;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.io.InputStream;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class AddSshKey implements RestModifyView<AccountResource, Input> {
-  private static final Logger log = LoggerFactory.getLogger(AddSshKey.class);
-
-  public static class Input {
-    public RawInput raw;
-  }
-
-  private final Provider<CurrentUser> self;
-  private final PermissionBackend permissionBackend;
-  private final VersionedAuthorizedKeys.Accessor authorizedKeys;
-  private final SshKeyCache sshKeyCache;
-  private final AddKeySender.Factory addKeyFactory;
-
-  @Inject
-  AddSshKey(
-      Provider<CurrentUser> self,
-      PermissionBackend permissionBackend,
-      VersionedAuthorizedKeys.Accessor authorizedKeys,
-      SshKeyCache sshKeyCache,
-      AddKeySender.Factory addKeyFactory) {
-    this.self = self;
-    this.permissionBackend = permissionBackend;
-    this.authorizedKeys = authorizedKeys;
-    this.sshKeyCache = sshKeyCache;
-    this.addKeyFactory = addKeyFactory;
-  }
-
-  @Override
-  public Response<SshKeyInfo> apply(AccountResource rsrc, Input input)
-      throws AuthException, BadRequestException, OrmException, IOException, ConfigInvalidException,
-          PermissionBackendException {
-    if (!self.get().hasSameAccountId(rsrc.getUser())) {
-      permissionBackend.user(self).check(GlobalPermission.ADMINISTRATE_SERVER);
-    }
-    return apply(rsrc.getUser(), input);
-  }
-
-  public Response<SshKeyInfo> apply(IdentifiedUser user, Input input)
-      throws BadRequestException, IOException, ConfigInvalidException {
-    if (input == null) {
-      input = new Input();
-    }
-    if (input.raw == null) {
-      throw new BadRequestException("SSH public key missing");
-    }
-
-    final RawInput rawKey = input.raw;
-    String sshPublicKey =
-        new ByteSource() {
-          @Override
-          public InputStream openStream() throws IOException {
-            return rawKey.getInputStream();
-          }
-        }.asCharSource(UTF_8).read();
-
-    try {
-      AccountSshKey sshKey = authorizedKeys.addKey(user.getAccountId(), sshPublicKey);
-
-      try {
-        addKeyFactory.create(user, sshKey).send();
-      } catch (EmailException e) {
-        log.error(
-            "Cannot send SSH key added message to " + user.getAccount().getPreferredEmail(), e);
-      }
-
-      sshKeyCache.evict(user.getUserName());
-      return Response.<SshKeyInfo>created(GetSshKeys.newSshKeyInfo(sshKey));
-    } catch (InvalidSshKeyException e) {
-      throw new BadRequestException(e.getMessage());
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AuthRequest.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AuthRequest.java
deleted file mode 100644
index 6647ca4..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AuthRequest.java
+++ /dev/null
@@ -1,161 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.account;
-
-import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_EXTERNAL;
-import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_GERRIT;
-import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_MAILTO;
-
-import com.google.gerrit.server.account.externalids.ExternalId;
-
-/**
- * Information for {@link AccountManager#authenticate(AuthRequest)}.
- *
- * <p>Callers should populate this object with as much information as possible about the user
- * account. For example, OpenID authentication might return registration information including a
- * display name for the user, and an email address for them. These fields however are optional, as
- * not all OpenID providers return them, and not all non-OpenID systems can use them.
- */
-public class AuthRequest {
-  /** Create a request for a local username, such as from LDAP. */
-  public static AuthRequest forUser(String username) {
-    AuthRequest r = new AuthRequest(ExternalId.Key.create(SCHEME_GERRIT, username));
-    r.setUserName(username);
-    return r;
-  }
-
-  /** Create a request for an external username. */
-  public static AuthRequest forExternalUser(String username) {
-    AuthRequest r = new AuthRequest(ExternalId.Key.create(SCHEME_EXTERNAL, username));
-    r.setUserName(username);
-    return r;
-  }
-
-  /**
-   * Create a request for an email address registration.
-   *
-   * <p>This type of request should be used only to attach a new email address to an existing user
-   * account.
-   */
-  public static AuthRequest forEmail(String email) {
-    AuthRequest r = new AuthRequest(ExternalId.Key.create(SCHEME_MAILTO, email));
-    r.setEmailAddress(email);
-    return r;
-  }
-
-  private ExternalId.Key externalId;
-  private String password;
-  private String displayName;
-  private String emailAddress;
-  private String userName;
-  private boolean skipAuthentication;
-  private String authPlugin;
-  private String authProvider;
-  private boolean authProvidesAccountActiveStatus;
-  private boolean active;
-
-  public AuthRequest(ExternalId.Key externalId) {
-    this.externalId = externalId;
-  }
-
-  public ExternalId.Key getExternalIdKey() {
-    return externalId;
-  }
-
-  public String getLocalUser() {
-    if (externalId.isScheme(SCHEME_GERRIT)) {
-      return externalId.id();
-    }
-    return null;
-  }
-
-  public void setLocalUser(String localUser) {
-    if (externalId.isScheme(SCHEME_GERRIT)) {
-      externalId = ExternalId.Key.create(SCHEME_GERRIT, localUser);
-    }
-  }
-
-  public String getPassword() {
-    return password;
-  }
-
-  public void setPassword(String pass) {
-    password = pass;
-  }
-
-  public String getDisplayName() {
-    return displayName;
-  }
-
-  public void setDisplayName(String name) {
-    displayName = name != null && name.length() > 0 ? name : null;
-  }
-
-  public String getEmailAddress() {
-    return emailAddress;
-  }
-
-  public void setEmailAddress(String email) {
-    emailAddress = email != null && email.length() > 0 ? email : null;
-  }
-
-  public String getUserName() {
-    return userName;
-  }
-
-  public void setUserName(String user) {
-    userName = user;
-  }
-
-  public boolean isSkipAuthentication() {
-    return skipAuthentication;
-  }
-
-  public void setSkipAuthentication(boolean skip) {
-    skipAuthentication = skip;
-  }
-
-  public String getAuthPlugin() {
-    return authPlugin;
-  }
-
-  public void setAuthPlugin(String authPlugin) {
-    this.authPlugin = authPlugin;
-  }
-
-  public String getAuthProvider() {
-    return authProvider;
-  }
-
-  public void setAuthProvider(String authProvider) {
-    this.authProvider = authProvider;
-  }
-
-  public boolean authProvidesAccountActiveStatus() {
-    return authProvidesAccountActiveStatus;
-  }
-
-  public void setAuthProvidesAccountActiveStatus(boolean authProvidesAccountActiveStatus) {
-    this.authProvidesAccountActiveStatus = authProvidesAccountActiveStatus;
-  }
-
-  public boolean isActive() {
-    return active;
-  }
-
-  public void setActive(Boolean isActive) {
-    this.active = isActive;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AuthorizedKeys.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AuthorizedKeys.java
deleted file mode 100644
index 4d86ab2..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AuthorizedKeys.java
+++ /dev/null
@@ -1,72 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.account;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountSshKey;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Optional;
-
-public class AuthorizedKeys {
-  public static final String FILE_NAME = "authorized_keys";
-
-  @VisibleForTesting public static final String INVALID_KEY_COMMENT_PREFIX = "# INVALID ";
-
-  @VisibleForTesting public static final String DELETED_KEY_COMMENT = "# DELETED";
-
-  public static List<Optional<AccountSshKey>> parse(Account.Id accountId, String s) {
-    List<Optional<AccountSshKey>> keys = new ArrayList<>();
-    int seq = 1;
-    for (String line : s.split("\\r?\\n")) {
-      line = line.trim();
-      if (line.isEmpty()) {
-        continue;
-      } else if (line.startsWith(INVALID_KEY_COMMENT_PREFIX)) {
-        String pub = line.substring(INVALID_KEY_COMMENT_PREFIX.length());
-        AccountSshKey key = new AccountSshKey(new AccountSshKey.Id(accountId, seq++), pub);
-        key.setInvalid();
-        keys.add(Optional.of(key));
-      } else if (line.startsWith(DELETED_KEY_COMMENT)) {
-        keys.add(Optional.empty());
-        seq++;
-      } else if (line.startsWith("#")) {
-        continue;
-      } else {
-        AccountSshKey key = new AccountSshKey(new AccountSshKey.Id(accountId, seq++), line);
-        keys.add(Optional.of(key));
-      }
-    }
-    return keys;
-  }
-
-  public static String serialize(Collection<Optional<AccountSshKey>> keys) {
-    StringBuilder b = new StringBuilder();
-    for (Optional<AccountSshKey> key : keys) {
-      if (key.isPresent()) {
-        if (!key.get().isValid()) {
-          b.append(INVALID_KEY_COMMENT_PREFIX);
-        }
-        b.append(key.get().getSshPublicKey().trim());
-      } else {
-        b.append(DELETED_KEY_COMMENT);
-      }
-      b.append("\n");
-    }
-    return b.toString();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/Capabilities.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/Capabilities.java
deleted file mode 100644
index 8c97e17..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/Capabilities.java
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.account;
-
-import com.google.gerrit.extensions.api.access.GlobalOrPluginPermission;
-import com.google.gerrit.extensions.api.access.PluginPermission;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ChildCollection;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountResource.Capability;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-
-@Singleton
-class Capabilities implements ChildCollection<AccountResource, AccountResource.Capability> {
-  private final Provider<CurrentUser> self;
-  private final PermissionBackend permissionBackend;
-  private final DynamicMap<RestView<AccountResource.Capability>> views;
-  private final Provider<GetCapabilities> get;
-
-  @Inject
-  Capabilities(
-      Provider<CurrentUser> self,
-      PermissionBackend permissionBackend,
-      DynamicMap<RestView<AccountResource.Capability>> views,
-      Provider<GetCapabilities> get) {
-    this.self = self;
-    this.permissionBackend = permissionBackend;
-    this.views = views;
-    this.get = get;
-  }
-
-  @Override
-  public GetCapabilities list() throws ResourceNotFoundException {
-    return get.get();
-  }
-
-  @Override
-  public Capability parse(AccountResource parent, IdString id)
-      throws ResourceNotFoundException, AuthException, PermissionBackendException {
-    IdentifiedUser target = parent.getUser();
-    if (!self.get().hasSameAccountId(target)) {
-      permissionBackend.user(self).check(GlobalPermission.ADMINISTRATE_SERVER);
-    }
-
-    GlobalOrPluginPermission perm = parse(id);
-    if (permissionBackend.user(target).test(perm)) {
-      return new AccountResource.Capability(target, perm.permissionName());
-    }
-    throw new ResourceNotFoundException(id);
-  }
-
-  private GlobalOrPluginPermission parse(IdString id) throws ResourceNotFoundException {
-    String name = id.get();
-    GlobalOrPluginPermission perm = GlobalPermission.byName(name);
-    if (perm != null) {
-      return perm;
-    }
-
-    int dash = name.lastIndexOf('-');
-    if (dash < 0) {
-      throw new ResourceNotFoundException(id);
-    }
-
-    String pluginName = name.substring(0, dash);
-    String capability = name.substring(dash + 1);
-    if (pluginName.isEmpty() || capability.isEmpty()) {
-      throw new ResourceNotFoundException(id);
-    }
-    return new PluginPermission(pluginName, capability);
-  }
-
-  @Override
-  public DynamicMap<RestView<Capability>> views() {
-    return views;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/CapabilityCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/CapabilityCollection.java
deleted file mode 100644
index 05d771e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/CapabilityCollection.java
+++ /dev/null
@@ -1,151 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.server.account;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.data.AccessSection;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.common.data.PermissionRange;
-import com.google.gerrit.common.data.PermissionRule;
-import com.google.gerrit.server.config.AdministrateServerGroups;
-import com.google.gerrit.server.group.SystemGroupBackend;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/** Caches active {@link GlobalCapability} set for a site. */
-public class CapabilityCollection {
-  public interface Factory {
-    CapabilityCollection create(@Nullable AccessSection section);
-  }
-
-  private final SystemGroupBackend systemGroupBackend;
-  private final ImmutableMap<String, ImmutableList<PermissionRule>> permissions;
-
-  public final ImmutableList<PermissionRule> administrateServer;
-  public final ImmutableList<PermissionRule> batchChangesLimit;
-  public final ImmutableList<PermissionRule> emailReviewers;
-  public final ImmutableList<PermissionRule> priority;
-  public final ImmutableList<PermissionRule> queryLimit;
-
-  @Inject
-  CapabilityCollection(
-      SystemGroupBackend systemGroupBackend,
-      @AdministrateServerGroups ImmutableSet<GroupReference> admins,
-      @Assisted @Nullable AccessSection section) {
-    this.systemGroupBackend = systemGroupBackend;
-
-    if (section == null) {
-      section = new AccessSection(AccessSection.GLOBAL_CAPABILITIES);
-    }
-
-    Map<String, List<PermissionRule>> tmp = new HashMap<>();
-    for (Permission permission : section.getPermissions()) {
-      for (PermissionRule rule : permission.getRules()) {
-        if (!permission.getName().equals(GlobalCapability.EMAIL_REVIEWERS)
-            && rule.getAction() == PermissionRule.Action.DENY) {
-          continue;
-        }
-
-        List<PermissionRule> r = tmp.get(permission.getName());
-        if (r == null) {
-          r = new ArrayList<>(2);
-          tmp.put(permission.getName(), r);
-        }
-        r.add(rule);
-      }
-    }
-    configureDefaults(tmp, section);
-    if (!tmp.containsKey(GlobalCapability.ADMINISTRATE_SERVER) && !admins.isEmpty()) {
-      tmp.put(GlobalCapability.ADMINISTRATE_SERVER, ImmutableList.<PermissionRule>of());
-    }
-
-    ImmutableMap.Builder<String, ImmutableList<PermissionRule>> m = ImmutableMap.builder();
-    for (Map.Entry<String, List<PermissionRule>> e : tmp.entrySet()) {
-      List<PermissionRule> rules = e.getValue();
-      if (GlobalCapability.ADMINISTRATE_SERVER.equals(e.getKey())) {
-        rules = mergeAdmin(admins, rules);
-      }
-      m.put(e.getKey(), ImmutableList.copyOf(rules));
-    }
-    permissions = m.build();
-
-    administrateServer = getPermission(GlobalCapability.ADMINISTRATE_SERVER);
-    batchChangesLimit = getPermission(GlobalCapability.BATCH_CHANGES_LIMIT);
-    emailReviewers = getPermission(GlobalCapability.EMAIL_REVIEWERS);
-    priority = getPermission(GlobalCapability.PRIORITY);
-    queryLimit = getPermission(GlobalCapability.QUERY_LIMIT);
-  }
-
-  private static List<PermissionRule> mergeAdmin(
-      Set<GroupReference> admins, List<PermissionRule> rules) {
-    if (admins.isEmpty()) {
-      return rules;
-    }
-
-    List<PermissionRule> r = new ArrayList<>(admins.size() + rules.size());
-    for (GroupReference g : admins) {
-      r.add(new PermissionRule(g));
-    }
-    for (PermissionRule rule : rules) {
-      if (!admins.contains(rule.getGroup())) {
-        r.add(rule);
-      }
-    }
-    return r;
-  }
-
-  public ImmutableList<PermissionRule> getPermission(String permissionName) {
-    ImmutableList<PermissionRule> r = permissions.get(permissionName);
-    return r != null ? r : ImmutableList.<PermissionRule>of();
-  }
-
-  private void configureDefaults(Map<String, List<PermissionRule>> out, AccessSection section) {
-    configureDefault(
-        out,
-        section,
-        GlobalCapability.QUERY_LIMIT,
-        systemGroupBackend.getGroup(SystemGroupBackend.ANONYMOUS_USERS));
-  }
-
-  private static void configureDefault(
-      Map<String, List<PermissionRule>> out,
-      AccessSection section,
-      String capName,
-      GroupReference group) {
-    if (doesNotDeclare(section, capName)) {
-      PermissionRange.WithDefaults range = GlobalCapability.getRange(capName);
-      if (range != null) {
-        PermissionRule rule = new PermissionRule(group);
-        rule.setRange(range.getDefaultMin(), range.getDefaultMax());
-        out.put(capName, Collections.singletonList(rule));
-      }
-    }
-  }
-
-  private static boolean doesNotDeclare(AccessSection section, String capName) {
-    return section.getPermission(capName) == null;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/ChangeUserName.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/ChangeUserName.java
deleted file mode 100644
index aa6baa1..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/ChangeUserName.java
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.account;
-
-import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_USERNAME;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.errors.NameAlreadyUsedException;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.account.externalids.ExternalIds;
-import com.google.gerrit.server.account.externalids.ExternalIdsUpdate;
-import com.google.gerrit.server.ssh.SshKeyCache;
-import com.google.gwtjsonrpc.common.VoidResult;
-import com.google.gwtorm.server.OrmDuplicateKeyException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.concurrent.Callable;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Operation to change the username of an account. */
-public class ChangeUserName implements Callable<VoidResult> {
-  private static final Logger log = LoggerFactory.getLogger(ChangeUserName.class);
-
-  public static final String USERNAME_CANNOT_BE_CHANGED = "Username cannot be changed.";
-
-  /** Generic factory to change any user's username. */
-  public interface Factory {
-    ChangeUserName create(IdentifiedUser user, String newUsername);
-  }
-
-  private final SshKeyCache sshKeyCache;
-  private final ExternalIds externalIds;
-  private final ExternalIdsUpdate.Server externalIdsUpdateFactory;
-
-  private final IdentifiedUser user;
-  private final String newUsername;
-
-  @Inject
-  ChangeUserName(
-      SshKeyCache sshKeyCache,
-      ExternalIds externalIds,
-      ExternalIdsUpdate.Server externalIdsUpdateFactory,
-      @Assisted IdentifiedUser user,
-      @Nullable @Assisted String newUsername) {
-    this.sshKeyCache = sshKeyCache;
-    this.externalIds = externalIds;
-    this.externalIdsUpdateFactory = externalIdsUpdateFactory;
-    this.user = user;
-    this.newUsername = newUsername;
-  }
-
-  @Override
-  public VoidResult call()
-      throws OrmException, NameAlreadyUsedException, InvalidUserNameException, IOException,
-          ConfigInvalidException {
-    Collection<ExternalId> old = externalIds.byAccount(user.getAccountId(), SCHEME_USERNAME);
-    if (!old.isEmpty()) {
-      log.error(
-          "External id with scheme \"username:\" already exists for the user {}",
-          user.getAccountId());
-      throw new IllegalStateException(USERNAME_CANNOT_BE_CHANGED);
-    }
-
-    ExternalIdsUpdate externalIdsUpdate = externalIdsUpdateFactory.create();
-    if (newUsername != null && !newUsername.isEmpty()) {
-      if (!ExternalId.isValidUsername(newUsername)) {
-        throw new InvalidUserNameException();
-      }
-
-      ExternalId.Key key = ExternalId.Key.create(SCHEME_USERNAME, newUsername);
-      try {
-        String password = null;
-        for (ExternalId i : old) {
-          if (i.password() != null) {
-            password = i.password();
-          }
-        }
-        externalIdsUpdate.insert(ExternalId.create(key, user.getAccountId(), null, password));
-        log.info("Created the new external Id with key: {}", key);
-      } catch (OrmDuplicateKeyException dupeErr) {
-        // If we are using this identity, don't report the exception.
-        //
-        ExternalId other = externalIds.get(key);
-        if (other != null && other.accountId().equals(user.getAccountId())) {
-          return VoidResult.INSTANCE;
-        }
-
-        // Otherwise, someone else has this identity.
-        //
-        throw new NameAlreadyUsedException(newUsername);
-      }
-    }
-
-    // If we have any older user names, remove them.
-    //
-    externalIdsUpdate.delete(old);
-    for (ExternalId extId : old) {
-      sshKeyCache.evict(extId.key().id());
-    }
-
-    sshKeyCache.evict(newUsername);
-    return VoidResult.INSTANCE;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateAccount.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateAccount.java
deleted file mode 100644
index ef1e8cc..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateAccount.java
+++ /dev/null
@@ -1,213 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.account;
-
-import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_MAILTO;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.common.errors.InvalidSshKeyException;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
-import com.google.gerrit.extensions.api.accounts.AccountInput;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.Sequences;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.account.externalids.ExternalIds;
-import com.google.gerrit.server.account.externalids.ExternalIdsUpdate;
-import com.google.gerrit.server.api.accounts.AccountExternalIdCreator;
-import com.google.gerrit.server.group.GroupsCollection;
-import com.google.gerrit.server.group.GroupsUpdate;
-import com.google.gerrit.server.group.UserInitiated;
-import com.google.gerrit.server.mail.send.OutgoingEmailValidator;
-import com.google.gerrit.server.ssh.SshKeyCache;
-import com.google.gwtorm.server.OrmDuplicateKeyException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-@RequiresCapability(GlobalCapability.CREATE_ACCOUNT)
-public class CreateAccount implements RestModifyView<TopLevelResource, AccountInput> {
-  public interface Factory {
-    CreateAccount create(String username);
-  }
-
-  private final ReviewDb db;
-  private final Sequences seq;
-  private final GroupsCollection groupsCollection;
-  private final VersionedAuthorizedKeys.Accessor authorizedKeys;
-  private final SshKeyCache sshKeyCache;
-  private final AccountsUpdate.User accountsUpdate;
-  private final AccountLoader.Factory infoLoader;
-  private final DynamicSet<AccountExternalIdCreator> externalIdCreators;
-  private final ExternalIds externalIds;
-  private final ExternalIdsUpdate.User externalIdsUpdateFactory;
-  private final Provider<GroupsUpdate> groupsUpdate;
-  private final OutgoingEmailValidator validator;
-  private final String username;
-
-  @Inject
-  CreateAccount(
-      ReviewDb db,
-      Sequences seq,
-      GroupsCollection groupsCollection,
-      VersionedAuthorizedKeys.Accessor authorizedKeys,
-      SshKeyCache sshKeyCache,
-      AccountsUpdate.User accountsUpdate,
-      AccountLoader.Factory infoLoader,
-      DynamicSet<AccountExternalIdCreator> externalIdCreators,
-      ExternalIds externalIds,
-      ExternalIdsUpdate.User externalIdsUpdateFactory,
-      @UserInitiated Provider<GroupsUpdate> groupsUpdate,
-      OutgoingEmailValidator validator,
-      @Assisted String username) {
-    this.db = db;
-    this.seq = seq;
-    this.groupsCollection = groupsCollection;
-    this.authorizedKeys = authorizedKeys;
-    this.sshKeyCache = sshKeyCache;
-    this.accountsUpdate = accountsUpdate;
-    this.infoLoader = infoLoader;
-    this.externalIdCreators = externalIdCreators;
-    this.externalIds = externalIds;
-    this.externalIdsUpdateFactory = externalIdsUpdateFactory;
-    this.groupsUpdate = groupsUpdate;
-    this.validator = validator;
-    this.username = username;
-  }
-
-  @Override
-  public Response<AccountInfo> apply(TopLevelResource rsrc, @Nullable AccountInput input)
-      throws BadRequestException, ResourceConflictException, UnprocessableEntityException,
-          OrmException, IOException, ConfigInvalidException {
-    return apply(input != null ? input : new AccountInput());
-  }
-
-  public Response<AccountInfo> apply(AccountInput input)
-      throws BadRequestException, ResourceConflictException, UnprocessableEntityException,
-          OrmException, IOException, ConfigInvalidException {
-    if (input.username != null && !username.equals(input.username)) {
-      throw new BadRequestException("username must match URL");
-    }
-
-    if (!ExternalId.isValidUsername(username)) {
-      throw new BadRequestException("Invalid username '" + username + "'");
-    }
-
-    Set<AccountGroup.UUID> groups = parseGroups(input.groups);
-
-    Account.Id id = new Account.Id(seq.nextAccountId());
-
-    ExternalId extUser = ExternalId.createUsername(username, id, input.httpPassword);
-    if (externalIds.get(extUser.key()) != null) {
-      throw new ResourceConflictException("username '" + username + "' already exists");
-    }
-    if (input.email != null) {
-      if (externalIds.get(ExternalId.Key.create(SCHEME_MAILTO, input.email)) != null) {
-        throw new UnprocessableEntityException("email '" + input.email + "' already exists");
-      }
-      if (!validator.isValid(input.email)) {
-        throw new BadRequestException("invalid email address");
-      }
-    }
-
-    List<ExternalId> extIds = new ArrayList<>();
-    extIds.add(extUser);
-    for (AccountExternalIdCreator c : externalIdCreators) {
-      extIds.addAll(c.create(id, username, input.email));
-    }
-
-    ExternalIdsUpdate externalIdsUpdate = externalIdsUpdateFactory.create();
-    try {
-      externalIdsUpdate.insert(extIds);
-    } catch (OrmDuplicateKeyException duplicateKey) {
-      throw new ResourceConflictException("username '" + username + "' already exists");
-    }
-
-    if (input.email != null) {
-      try {
-        externalIdsUpdate.insert(ExternalId.createEmail(id, input.email));
-      } catch (OrmDuplicateKeyException duplicateKey) {
-        try {
-          externalIdsUpdate.delete(extUser);
-        } catch (IOException | ConfigInvalidException cleanupError) {
-          // Ignored
-        }
-        throw new UnprocessableEntityException("email '" + input.email + "' already exists");
-      }
-    }
-
-    accountsUpdate
-        .create()
-        .insert(
-            id,
-            a -> {
-              a.setFullName(input.name);
-              a.setPreferredEmail(input.email);
-            });
-
-    for (AccountGroup.UUID groupUuid : groups) {
-      try {
-        groupsUpdate.get().addGroupMember(db, groupUuid, id);
-      } catch (NoSuchGroupException e) {
-        throw new UnprocessableEntityException(String.format("Group %s not found", groupUuid));
-      }
-    }
-
-    if (input.sshKey != null) {
-      try {
-        authorizedKeys.addKey(id, input.sshKey);
-        sshKeyCache.evict(username);
-      } catch (InvalidSshKeyException e) {
-        throw new BadRequestException(e.getMessage());
-      }
-    }
-
-    AccountLoader loader = infoLoader.create(true);
-    AccountInfo info = loader.get(id);
-    loader.fill();
-    return Response.created(info);
-  }
-
-  private Set<AccountGroup.UUID> parseGroups(List<String> groups)
-      throws UnprocessableEntityException {
-    Set<AccountGroup.UUID> groupUuids = new HashSet<>();
-    if (groups != null) {
-      for (String g : groups) {
-        GroupDescription.Internal internalGroup = groupsCollection.parseInternal(g);
-        groupUuids.add(internalGroup.getGroupUUID());
-      }
-    }
-    return groupUuids;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateEmail.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateEmail.java
deleted file mode 100644
index 9189134..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateEmail.java
+++ /dev/null
@@ -1,153 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.account;
-
-import static com.google.gerrit.extensions.client.AuthType.DEVELOPMENT_BECOME_ANY_ACCOUNT;
-
-import com.google.gerrit.common.errors.EmailException;
-import com.google.gerrit.extensions.api.accounts.EmailInput;
-import com.google.gerrit.extensions.client.AccountFieldName;
-import com.google.gerrit.extensions.common.EmailInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.config.AuthConfig;
-import com.google.gerrit.server.mail.send.OutgoingEmailValidator;
-import com.google.gerrit.server.mail.send.RegisterNewEmailSender;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class CreateEmail implements RestModifyView<AccountResource, EmailInput> {
-  private static final Logger log = LoggerFactory.getLogger(CreateEmail.class);
-
-  public interface Factory {
-    CreateEmail create(String email);
-  }
-
-  private final Provider<CurrentUser> self;
-  private final Realm realm;
-  private final PermissionBackend permissionBackend;
-  private final AccountManager accountManager;
-  private final RegisterNewEmailSender.Factory registerNewEmailFactory;
-  private final PutPreferred putPreferred;
-  private final OutgoingEmailValidator validator;
-  private final String email;
-  private final boolean isDevMode;
-
-  @Inject
-  CreateEmail(
-      Provider<CurrentUser> self,
-      Realm realm,
-      PermissionBackend permissionBackend,
-      AuthConfig authConfig,
-      AccountManager accountManager,
-      RegisterNewEmailSender.Factory registerNewEmailFactory,
-      PutPreferred putPreferred,
-      OutgoingEmailValidator validator,
-      @Assisted String email) {
-    this.self = self;
-    this.realm = realm;
-    this.permissionBackend = permissionBackend;
-    this.accountManager = accountManager;
-    this.registerNewEmailFactory = registerNewEmailFactory;
-    this.putPreferred = putPreferred;
-    this.validator = validator;
-    this.email = email != null ? email.trim() : null;
-    this.isDevMode = authConfig.getAuthType() == DEVELOPMENT_BECOME_ANY_ACCOUNT;
-  }
-
-  @Override
-  public Response<EmailInfo> apply(AccountResource rsrc, EmailInput input)
-      throws AuthException, BadRequestException, ResourceConflictException,
-          ResourceNotFoundException, OrmException, EmailException, MethodNotAllowedException,
-          IOException, ConfigInvalidException, PermissionBackendException {
-    if (input == null) {
-      input = new EmailInput();
-    }
-
-    if (!self.get().hasSameAccountId(rsrc.getUser()) || input.noConfirmation) {
-      permissionBackend.user(self).check(GlobalPermission.MODIFY_ACCOUNT);
-    }
-
-    if (!realm.allowsEdit(AccountFieldName.REGISTER_NEW_EMAIL)) {
-      throw new MethodNotAllowedException("realm does not allow adding emails");
-    }
-
-    return apply(rsrc.getUser(), input);
-  }
-
-  /** To be used from plugins that want to create emails without permission checks. */
-  public Response<EmailInfo> apply(IdentifiedUser user, EmailInput input)
-      throws AuthException, BadRequestException, ResourceConflictException,
-          ResourceNotFoundException, OrmException, EmailException, MethodNotAllowedException,
-          IOException, ConfigInvalidException, PermissionBackendException {
-    if (input == null) {
-      input = new EmailInput();
-    }
-
-    if (input.email != null && !email.equals(input.email)) {
-      throw new BadRequestException("email address must match URL");
-    }
-
-    if (!validator.isValid(email)) {
-      throw new BadRequestException("invalid email address");
-    }
-
-    EmailInfo info = new EmailInfo();
-    info.email = email;
-    if (input.noConfirmation || isDevMode) {
-      if (isDevMode) {
-        log.warn("skipping email validation in developer mode");
-      }
-      try {
-        accountManager.link(user.getAccountId(), AuthRequest.forEmail(email));
-      } catch (AccountException e) {
-        throw new ResourceConflictException(e.getMessage());
-      }
-      if (input.preferred) {
-        putPreferred.apply(new AccountResource.Email(user, email), null);
-        info.preferred = true;
-      }
-    } else {
-      try {
-        RegisterNewEmailSender sender = registerNewEmailFactory.create(email);
-        if (!sender.isAllowed()) {
-          throw new MethodNotAllowedException("Not allowed to add email address " + email);
-        }
-        sender.send();
-        info.pendingConfirmation = true;
-      } catch (EmailException | RuntimeException e) {
-        log.error("Cannot send email verification message to " + email, e);
-        throw e;
-      }
-    }
-    return Response.created(info);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateGroupArgs.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateGroupArgs.java
deleted file mode 100644
index 0c0778c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateGroupArgs.java
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.account;
-
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import java.util.Collection;
-
-public class CreateGroupArgs {
-  private AccountGroup.NameKey groupName;
-  public String groupDescription;
-  public boolean visibleToAll;
-  public AccountGroup.Id ownerGroupId;
-  public Collection<? extends Account.Id> initialMembers;
-
-  public AccountGroup.NameKey getGroup() {
-    return groupName;
-  }
-
-  public String getGroupName() {
-    return groupName != null ? groupName.get() : null;
-  }
-
-  public void setGroupName(String n) {
-    groupName = n != null ? new AccountGroup.NameKey(n) : null;
-  }
-
-  public void setGroupName(AccountGroup.NameKey n) {
-    groupName = n;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/DefaultRealm.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/DefaultRealm.java
deleted file mode 100644
index 9d9cf23..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/DefaultRealm.java
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.account;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.extensions.client.AccountFieldName;
-import com.google.gerrit.extensions.client.AuthType;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.config.AuthConfig;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.Set;
-
-@Singleton
-public class DefaultRealm extends AbstractRealm {
-  private final EmailExpander emailExpander;
-  private final Provider<Emails> emails;
-  private final AuthConfig authConfig;
-
-  @Inject
-  DefaultRealm(EmailExpander emailExpander, Provider<Emails> emails, AuthConfig authConfig) {
-    this.emailExpander = emailExpander;
-    this.emails = emails;
-    this.authConfig = authConfig;
-  }
-
-  @Override
-  public boolean allowsEdit(AccountFieldName field) {
-    if (authConfig.getAuthType() == AuthType.HTTP) {
-      switch (field) {
-        case USER_NAME:
-          return false;
-        case FULL_NAME:
-          return Strings.emptyToNull(authConfig.getHttpDisplaynameHeader()) == null;
-        case REGISTER_NEW_EMAIL:
-          return authConfig.isAllowRegisterNewEmail()
-              && Strings.emptyToNull(authConfig.getHttpEmailHeader()) == null;
-        default:
-          return true;
-      }
-    }
-    switch (field) {
-      case REGISTER_NEW_EMAIL:
-        return authConfig.isAllowRegisterNewEmail();
-      case FULL_NAME:
-      case USER_NAME:
-      default:
-        return true;
-    }
-  }
-
-  @Override
-  public AuthRequest authenticate(AuthRequest who) {
-    if (who.getEmailAddress() == null
-        && who.getLocalUser() != null
-        && emailExpander.canExpand(who.getLocalUser())) {
-      who.setEmailAddress(emailExpander.expand(who.getLocalUser()));
-    }
-    return who;
-  }
-
-  @Override
-  public void onCreateAccount(AuthRequest who, Account account) {}
-
-  @Override
-  public Account.Id lookup(String accountName) throws IOException {
-    if (emailExpander.canExpand(accountName)) {
-      try {
-        Set<Account.Id> c = emails.get().getAccountFor(emailExpander.expand(accountName));
-        if (1 == c.size()) {
-          return c.iterator().next();
-        }
-      } catch (OrmException e) {
-        throw new IOException("Failed to query accounts by email", e);
-      }
-    }
-    return null;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteActive.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteActive.java
deleted file mode 100644
index 6f474b4..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteActive.java
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.account;
-
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.DeleteActive.Input;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-@RequiresCapability(GlobalCapability.MODIFY_ACCOUNT)
-@Singleton
-public class DeleteActive implements RestModifyView<AccountResource, Input> {
-  public static class Input {}
-
-  private final Provider<IdentifiedUser> self;
-  private final SetInactiveFlag setInactiveFlag;
-
-  @Inject
-  DeleteActive(SetInactiveFlag setInactiveFlag, Provider<IdentifiedUser> self) {
-    this.setInactiveFlag = setInactiveFlag;
-    this.self = self;
-  }
-
-  @Override
-  public Response<?> apply(AccountResource rsrc, Input input)
-      throws RestApiException, OrmException, IOException, ConfigInvalidException {
-    if (self.get().hasSameAccountId(rsrc.getUser())) {
-      throw new ResourceConflictException("cannot deactivate own account");
-    }
-    return setInactiveFlag.deactivate(rsrc.getUser().getAccountId());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteEmail.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteEmail.java
deleted file mode 100644
index bd7017e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteEmail.java
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.account;
-
-import static java.util.stream.Collectors.toSet;
-
-import com.google.gerrit.extensions.client.AccountFieldName;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.DeleteEmail.Input;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.account.externalids.ExternalIds;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-@Singleton
-public class DeleteEmail implements RestModifyView<AccountResource.Email, Input> {
-  public static class Input {}
-
-  private final Provider<CurrentUser> self;
-  private final Realm realm;
-  private final PermissionBackend permissionBackend;
-  private final AccountManager accountManager;
-  private final ExternalIds externalIds;
-
-  @Inject
-  DeleteEmail(
-      Provider<CurrentUser> self,
-      Realm realm,
-      PermissionBackend permissionBackend,
-      AccountManager accountManager,
-      ExternalIds externalIds) {
-    this.self = self;
-    this.realm = realm;
-    this.permissionBackend = permissionBackend;
-    this.accountManager = accountManager;
-    this.externalIds = externalIds;
-  }
-
-  @Override
-  public Response<?> apply(AccountResource.Email rsrc, Input input)
-      throws AuthException, ResourceNotFoundException, ResourceConflictException,
-          MethodNotAllowedException, OrmException, IOException, ConfigInvalidException,
-          PermissionBackendException {
-    if (!self.get().hasSameAccountId(rsrc.getUser())) {
-      permissionBackend.user(self).check(GlobalPermission.MODIFY_ACCOUNT);
-    }
-    return apply(rsrc.getUser(), rsrc.getEmail());
-  }
-
-  public Response<?> apply(IdentifiedUser user, String email)
-      throws ResourceNotFoundException, ResourceConflictException, MethodNotAllowedException,
-          OrmException, IOException, ConfigInvalidException {
-    if (!realm.allowsEdit(AccountFieldName.REGISTER_NEW_EMAIL)) {
-      throw new MethodNotAllowedException("realm does not allow deleting emails");
-    }
-
-    Set<ExternalId> extIds =
-        externalIds.byAccount(user.getAccountId()).stream()
-            .filter(e -> email.equals(e.email()))
-            .collect(toSet());
-    if (extIds.isEmpty()) {
-      throw new ResourceNotFoundException(email);
-    }
-
-    try {
-      accountManager.unlink(
-          user.getAccountId(), extIds.stream().map(e -> e.key()).collect(toSet()));
-    } catch (AccountException e) {
-      throw new ResourceConflictException(e.getMessage());
-    }
-    return Response.none();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteExternalIds.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteExternalIds.java
deleted file mode 100644
index 2c59156..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteExternalIds.java
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.account;
-
-import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_USERNAME;
-import static java.util.stream.Collectors.toMap;
-import static java.util.stream.Collectors.toSet;
-
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.account.externalids.ExternalIds;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-@Singleton
-public class DeleteExternalIds implements RestModifyView<AccountResource, List<String>> {
-  private final PermissionBackend permissionBackend;
-  private final AccountManager accountManager;
-  private final ExternalIds externalIds;
-  private final Provider<CurrentUser> self;
-
-  @Inject
-  DeleteExternalIds(
-      PermissionBackend permissionBackend,
-      AccountManager accountManager,
-      ExternalIds externalIds,
-      Provider<CurrentUser> self) {
-    this.permissionBackend = permissionBackend;
-    this.accountManager = accountManager;
-    this.externalIds = externalIds;
-    this.self = self;
-  }
-
-  @Override
-  public Response<?> apply(AccountResource resource, List<String> extIds)
-      throws RestApiException, IOException, OrmException, ConfigInvalidException,
-          PermissionBackendException {
-    if (!self.get().hasSameAccountId(resource.getUser())) {
-      permissionBackend.user(self).check(GlobalPermission.ACCESS_DATABASE);
-    }
-
-    if (extIds == null || extIds.size() == 0) {
-      throw new BadRequestException("external IDs are required");
-    }
-
-    Map<ExternalId.Key, ExternalId> externalIdMap =
-        externalIds.byAccount(resource.getUser().getAccountId()).stream()
-            .collect(toMap(i -> i.key(), i -> i));
-
-    List<ExternalId> toDelete = new ArrayList<>();
-    ExternalId.Key last = resource.getUser().getLastLoginExternalIdKey();
-    for (String externalIdStr : extIds) {
-      ExternalId id = externalIdMap.get(ExternalId.Key.parse(externalIdStr));
-
-      if (id == null) {
-        throw new UnprocessableEntityException(
-            String.format("External id %s does not exist", externalIdStr));
-      }
-
-      if ((!id.isScheme(SCHEME_USERNAME))
-          && ((last == null) || (!last.get().equals(id.key().get())))) {
-        toDelete.add(id);
-      } else {
-        throw new ResourceConflictException(
-            String.format("External id %s cannot be deleted", externalIdStr));
-      }
-    }
-
-    try {
-      accountManager.unlink(
-          resource.getUser().getAccountId(), toDelete.stream().map(e -> e.key()).collect(toSet()));
-    } catch (AccountException e) {
-      throw new ResourceConflictException(e.getMessage());
-    }
-
-    return Response.none();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteSshKey.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteSshKey.java
deleted file mode 100644
index 74616bf..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteSshKey.java
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.account;
-
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.account.DeleteSshKey.Input;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.ssh.SshKeyCache;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-
-@Singleton
-public class DeleteSshKey implements RestModifyView<AccountResource.SshKey, Input> {
-  public static class Input {}
-
-  private final Provider<CurrentUser> self;
-  private final PermissionBackend permissionBackend;
-  private final VersionedAuthorizedKeys.Accessor authorizedKeys;
-  private final SshKeyCache sshKeyCache;
-
-  @Inject
-  DeleteSshKey(
-      Provider<CurrentUser> self,
-      PermissionBackend permissionBackend,
-      VersionedAuthorizedKeys.Accessor authorizedKeys,
-      SshKeyCache sshKeyCache) {
-    this.self = self;
-    this.permissionBackend = permissionBackend;
-    this.authorizedKeys = authorizedKeys;
-    this.sshKeyCache = sshKeyCache;
-  }
-
-  @Override
-  public Response<?> apply(AccountResource.SshKey rsrc, Input input)
-      throws AuthException, OrmException, RepositoryNotFoundException, IOException,
-          ConfigInvalidException, PermissionBackendException {
-    if (!self.get().hasSameAccountId(rsrc.getUser())) {
-      permissionBackend.user(self).check(GlobalPermission.ADMINISTRATE_SERVER);
-    }
-
-    authorizedKeys.deleteKey(rsrc.getUser().getAccountId(), rsrc.getSshKey().getKey().get());
-    sshKeyCache.evict(rsrc.getUser().getUserName());
-
-    return Response.none();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteWatchedProjects.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteWatchedProjects.java
deleted file mode 100644
index 6af3833..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteWatchedProjects.java
+++ /dev/null
@@ -1,81 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.account;
-
-import static java.util.stream.Collectors.toList;
-
-import com.google.gerrit.extensions.client.ProjectWatchInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.WatchConfig.ProjectWatchKey;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.List;
-import java.util.Objects;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-@Singleton
-public class DeleteWatchedProjects
-    implements RestModifyView<AccountResource, List<ProjectWatchInfo>> {
-  private final Provider<IdentifiedUser> self;
-  private final PermissionBackend permissionBackend;
-  private final AccountCache accountCache;
-  private final WatchConfig.Accessor watchConfig;
-
-  @Inject
-  DeleteWatchedProjects(
-      Provider<IdentifiedUser> self,
-      PermissionBackend permissionBackend,
-      AccountCache accountCache,
-      WatchConfig.Accessor watchConfig) {
-    this.self = self;
-    this.permissionBackend = permissionBackend;
-    this.accountCache = accountCache;
-    this.watchConfig = watchConfig;
-  }
-
-  @Override
-  public Response<?> apply(AccountResource rsrc, List<ProjectWatchInfo> input)
-      throws AuthException, UnprocessableEntityException, OrmException, IOException,
-          ConfigInvalidException, PermissionBackendException {
-    if (!self.get().hasSameAccountId(rsrc.getUser())) {
-      permissionBackend.user(self).check(GlobalPermission.ADMINISTRATE_SERVER);
-    }
-    if (input == null) {
-      return Response.none();
-    }
-
-    Account.Id accountId = rsrc.getUser().getAccountId();
-    watchConfig.deleteProjectWatches(
-        accountId,
-        input.stream()
-            .filter(Objects::nonNull)
-            .map(w -> ProjectWatchKey.create(new Project.NameKey(w.project), w.filter))
-            .collect(toList()));
-    accountCache.evict(accountId);
-    return Response.none();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/Emails.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/Emails.java
deleted file mode 100644
index f18f769..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/Emails.java
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.account;
-
-import static com.google.common.collect.ImmutableSet.toImmutableSet;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ImmutableSetMultimap;
-import com.google.common.collect.Streams;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.account.externalids.ExternalIds;
-import com.google.gerrit.server.query.account.InternalAccountQuery;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-
-/** Class to access accounts by email. */
-@Singleton
-public class Emails {
-  private final ExternalIds externalIds;
-  private final Provider<InternalAccountQuery> queryProvider;
-
-  @Inject
-  public Emails(ExternalIds externalIds, Provider<InternalAccountQuery> queryProvider) {
-    this.externalIds = externalIds;
-    this.queryProvider = queryProvider;
-  }
-
-  /**
-   * Returns the accounts with the given email.
-   *
-   * <p>Each email should belong to a single account only. This means if more than one account is
-   * returned there is an inconsistency in the external IDs.
-   *
-   * <p>The accounts are retrieved via the external ID cache. Each access to the external ID cache
-   * requires reading the SHA1 of the refs/meta/external-ids branch. If accounts for multiple emails
-   * are needed it is more efficient to use {@link #getAccountsFor(String...)} as this method reads
-   * the SHA1 of the refs/meta/external-ids branch only once (and not once per email).
-   *
-   * <p>In addition accounts are included that have the given email as preferred email even if they
-   * have no external ID for the preferred email. Having accounts with a preferred email that does
-   * not exist as external ID is an inconsistency, but existing functionality relies on still
-   * getting those accounts, which is why they are included. Accounts by preferred email are fetched
-   * from the account index.
-   *
-   * @see #getAccountsFor(String...)
-   */
-  public ImmutableSet<Account.Id> getAccountFor(String email) throws IOException, OrmException {
-    return Streams.concat(
-            externalIds.byEmail(email).stream().map(e -> e.accountId()),
-            queryProvider.get().byPreferredEmail(email).stream().map(a -> a.getAccount().getId()))
-        .collect(toImmutableSet());
-  }
-
-  /**
-   * Returns the accounts for the given emails.
-   *
-   * @see #getAccountFor(String)
-   */
-  public ImmutableSetMultimap<String, Account.Id> getAccountsFor(String... emails)
-      throws IOException, OrmException {
-    ImmutableSetMultimap.Builder<String, Account.Id> builder = ImmutableSetMultimap.builder();
-    externalIds.byEmails(emails).entries().stream()
-        .forEach(e -> builder.put(e.getKey(), e.getValue().accountId()));
-    queryProvider.get().byPreferredEmail(emails).entries().stream()
-        .forEach(e -> builder.put(e.getKey(), e.getValue().getAccount().getId()));
-    return builder.build();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/EmailsCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/EmailsCollection.java
deleted file mode 100644
index b1a50c0..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/EmailsCollection.java
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.account;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AcceptsCreate;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ChildCollection;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.account.AccountResource.Email;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-
-@Singleton
-public class EmailsCollection
-    implements ChildCollection<AccountResource, AccountResource.Email>,
-        AcceptsCreate<AccountResource> {
-  private final DynamicMap<RestView<AccountResource.Email>> views;
-  private final GetEmails list;
-  private final Provider<CurrentUser> self;
-  private final PermissionBackend permissionBackend;
-  private final CreateEmail.Factory createEmailFactory;
-
-  @Inject
-  EmailsCollection(
-      DynamicMap<RestView<AccountResource.Email>> views,
-      GetEmails list,
-      Provider<CurrentUser> self,
-      PermissionBackend permissionBackend,
-      CreateEmail.Factory createEmailFactory) {
-    this.views = views;
-    this.list = list;
-    this.self = self;
-    this.permissionBackend = permissionBackend;
-    this.createEmailFactory = createEmailFactory;
-  }
-
-  @Override
-  public RestView<AccountResource> list() {
-    return list;
-  }
-
-  @Override
-  public AccountResource.Email parse(AccountResource rsrc, IdString id)
-      throws ResourceNotFoundException, PermissionBackendException, AuthException {
-    if (!self.get().hasSameAccountId(rsrc.getUser())) {
-      permissionBackend.user(self).check(GlobalPermission.ADMINISTRATE_SERVER);
-    }
-
-    if ("preferred".equals(id.get())) {
-      String email = rsrc.getUser().getAccount().getPreferredEmail();
-      if (Strings.isNullOrEmpty(email)) {
-        throw new ResourceNotFoundException(id);
-      }
-      return new AccountResource.Email(rsrc.getUser(), email);
-    } else if (rsrc.getUser().hasEmailAddress(id.get())) {
-      return new AccountResource.Email(rsrc.getUser(), id.get());
-    } else {
-      throw new ResourceNotFoundException(id);
-    }
-  }
-
-  @Override
-  public DynamicMap<RestView<Email>> views() {
-    return views;
-  }
-
-  @Override
-  public CreateEmail create(AccountResource parent, IdString email) {
-    return createEmailFactory.create(email.get());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GeneralPreferencesLoader.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GeneralPreferencesLoader.java
deleted file mode 100644
index 8043773..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GeneralPreferencesLoader.java
+++ /dev/null
@@ -1,198 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.account;
-
-import static com.google.gerrit.server.config.ConfigUtil.loadSection;
-import static com.google.gerrit.server.config.ConfigUtil.skipField;
-import static com.google.gerrit.server.git.UserConfigSections.CHANGE_TABLE;
-import static com.google.gerrit.server.git.UserConfigSections.CHANGE_TABLE_COLUMN;
-import static com.google.gerrit.server.git.UserConfigSections.KEY_ID;
-import static com.google.gerrit.server.git.UserConfigSections.KEY_MATCH;
-import static com.google.gerrit.server.git.UserConfigSections.KEY_TARGET;
-import static com.google.gerrit.server.git.UserConfigSections.KEY_TOKEN;
-import static com.google.gerrit.server.git.UserConfigSections.KEY_URL;
-import static com.google.gerrit.server.git.UserConfigSections.URL_ALIAS;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.Lists;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
-import com.google.gerrit.extensions.client.MenuItem;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.UserConfigSections;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.Repository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class GeneralPreferencesLoader {
-  private static final Logger log = LoggerFactory.getLogger(GeneralPreferencesLoader.class);
-
-  private final GitRepositoryManager gitMgr;
-  private final AllUsersName allUsersName;
-
-  @Inject
-  public GeneralPreferencesLoader(GitRepositoryManager gitMgr, AllUsersName allUsersName) {
-    this.gitMgr = gitMgr;
-    this.allUsersName = allUsersName;
-  }
-
-  public GeneralPreferencesInfo load(Account.Id id)
-      throws IOException, ConfigInvalidException, RepositoryNotFoundException {
-    return read(id, null);
-  }
-
-  public GeneralPreferencesInfo merge(Account.Id id, GeneralPreferencesInfo in)
-      throws IOException, ConfigInvalidException, RepositoryNotFoundException {
-    return read(id, in);
-  }
-
-  private GeneralPreferencesInfo read(Account.Id id, GeneralPreferencesInfo in)
-      throws IOException, ConfigInvalidException, RepositoryNotFoundException {
-    try (Repository allUsers = gitMgr.openRepository(allUsersName)) {
-      // Load all users default prefs
-      VersionedAccountPreferences dp = VersionedAccountPreferences.forDefault();
-      dp.load(allUsers);
-
-      // Load user prefs
-      VersionedAccountPreferences p = VersionedAccountPreferences.forUser(id);
-      p.load(allUsers);
-      GeneralPreferencesInfo r =
-          loadSection(
-              p.getConfig(),
-              UserConfigSections.GENERAL,
-              null,
-              new GeneralPreferencesInfo(),
-              readDefaultsFromGit(dp.getConfig(), in),
-              in);
-      loadChangeTableColumns(r, p, dp);
-      return loadMyMenusAndUrlAliases(r, p, dp);
-    }
-  }
-
-  public GeneralPreferencesInfo readDefaultsFromGit(Repository git, GeneralPreferencesInfo in)
-      throws ConfigInvalidException, IOException {
-    VersionedAccountPreferences dp = VersionedAccountPreferences.forDefault();
-    dp.load(git);
-    return readDefaultsFromGit(dp.getConfig(), in);
-  }
-
-  private GeneralPreferencesInfo readDefaultsFromGit(Config config, GeneralPreferencesInfo in)
-      throws ConfigInvalidException {
-    GeneralPreferencesInfo allUserPrefs = new GeneralPreferencesInfo();
-    loadSection(
-        config,
-        UserConfigSections.GENERAL,
-        null,
-        allUserPrefs,
-        GeneralPreferencesInfo.defaults(),
-        in);
-    return updateDefaults(allUserPrefs);
-  }
-
-  private GeneralPreferencesInfo updateDefaults(GeneralPreferencesInfo input) {
-    GeneralPreferencesInfo result = GeneralPreferencesInfo.defaults();
-    try {
-      for (Field field : input.getClass().getDeclaredFields()) {
-        if (skipField(field)) {
-          continue;
-        }
-        Object newVal = field.get(input);
-        if (newVal != null) {
-          field.set(result, newVal);
-        }
-      }
-    } catch (IllegalAccessException e) {
-      log.error("Cannot get default general preferences from " + allUsersName.get(), e);
-      return GeneralPreferencesInfo.defaults();
-    }
-    return result;
-  }
-
-  public GeneralPreferencesInfo loadMyMenusAndUrlAliases(
-      GeneralPreferencesInfo r, VersionedAccountPreferences v, VersionedAccountPreferences d) {
-    r.my = my(v);
-    if (r.my.isEmpty() && !v.isDefaults()) {
-      r.my = my(d);
-    }
-    if (r.my.isEmpty()) {
-      r.my.add(new MenuItem("Changes", "#/dashboard/self", null));
-      r.my.add(new MenuItem("Draft Comments", "#/q/has:draft", null));
-      r.my.add(new MenuItem("Edits", "#/q/has:edit", null));
-      r.my.add(new MenuItem("Watched Changes", "#/q/is:watched+is:open", null));
-      r.my.add(new MenuItem("Starred Changes", "#/q/is:starred", null));
-      r.my.add(new MenuItem("Groups", "#/groups/self", null));
-    }
-
-    r.urlAliases = urlAliases(v);
-    if (r.urlAliases == null && !v.isDefaults()) {
-      r.urlAliases = urlAliases(d);
-    }
-    return r;
-  }
-
-  private static List<MenuItem> my(VersionedAccountPreferences v) {
-    List<MenuItem> my = new ArrayList<>();
-    Config cfg = v.getConfig();
-    for (String subsection : cfg.getSubsections(UserConfigSections.MY)) {
-      String url = my(cfg, subsection, KEY_URL, "#/");
-      String target = my(cfg, subsection, KEY_TARGET, url.startsWith("#") ? null : "_blank");
-      my.add(new MenuItem(subsection, url, target, my(cfg, subsection, KEY_ID, null)));
-    }
-    return my;
-  }
-
-  private static String my(Config cfg, String subsection, String key, String defaultValue) {
-    String val = cfg.getString(UserConfigSections.MY, subsection, key);
-    return !Strings.isNullOrEmpty(val) ? val : defaultValue;
-  }
-
-  public GeneralPreferencesInfo loadChangeTableColumns(
-      GeneralPreferencesInfo r, VersionedAccountPreferences v, VersionedAccountPreferences d) {
-    r.changeTable = changeTable(v);
-
-    if (r.changeTable.isEmpty() && !v.isDefaults()) {
-      r.changeTable = changeTable(d);
-    }
-    return r;
-  }
-
-  private static List<String> changeTable(VersionedAccountPreferences v) {
-    return Lists.newArrayList(v.getConfig().getStringList(CHANGE_TABLE, null, CHANGE_TABLE_COLUMN));
-  }
-
-  private static Map<String, String> urlAliases(VersionedAccountPreferences v) {
-    HashMap<String, String> urlAliases = new HashMap<>();
-    Config cfg = v.getConfig();
-    for (String subsection : cfg.getSubsections(URL_ALIAS)) {
-      urlAliases.put(
-          cfg.getString(URL_ALIAS, subsection, KEY_MATCH),
-          cfg.getString(URL_ALIAS, subsection, KEY_TOKEN));
-    }
-    return !urlAliases.isEmpty() ? urlAliases : null;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetAccount.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetAccount.java
deleted file mode 100644
index 05f8300..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetAccount.java
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.account;
-
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-@Singleton
-public class GetAccount implements RestReadView<AccountResource> {
-  private final AccountLoader.Factory infoFactory;
-
-  @Inject
-  GetAccount(AccountLoader.Factory infoFactory) {
-    this.infoFactory = infoFactory;
-  }
-
-  @Override
-  public AccountInfo apply(AccountResource rsrc) throws OrmException {
-    AccountLoader loader = infoFactory.create(true);
-    AccountInfo info = loader.get(rsrc.getUser().getAccountId());
-    loader.fill();
-    return info;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetActive.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetActive.java
deleted file mode 100644
index 9864b45..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetActive.java
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.account;
-
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.inject.Singleton;
-
-@Singleton
-public class GetActive implements RestReadView<AccountResource> {
-  @Override
-  public Response<String> apply(AccountResource rsrc) {
-    if (rsrc.getUser().getAccount().isActive()) {
-      return Response.ok("ok");
-    }
-    return Response.none();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetAgreements.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetAgreements.java
deleted file mode 100644
index dfbde96..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetAgreements.java
+++ /dev/null
@@ -1,104 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.account;
-
-import com.google.gerrit.common.data.ContributorAgreement;
-import com.google.gerrit.common.data.PermissionRule;
-import com.google.gerrit.common.data.PermissionRule.Action;
-import com.google.gerrit.extensions.common.AgreementInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.config.AgreementJson;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class GetAgreements implements RestReadView<AccountResource> {
-  private static final Logger log = LoggerFactory.getLogger(GetAgreements.class);
-
-  private final Provider<CurrentUser> self;
-  private final ProjectCache projectCache;
-  private final AgreementJson agreementJson;
-  private final boolean agreementsEnabled;
-
-  @Inject
-  GetAgreements(
-      Provider<CurrentUser> self,
-      ProjectCache projectCache,
-      AgreementJson agreementJson,
-      @GerritServerConfig Config config) {
-    this.self = self;
-    this.projectCache = projectCache;
-    this.agreementJson = agreementJson;
-    this.agreementsEnabled = config.getBoolean("auth", "contributorAgreements", false);
-  }
-
-  @Override
-  public List<AgreementInfo> apply(AccountResource resource) throws RestApiException {
-    if (!agreementsEnabled) {
-      throw new MethodNotAllowedException("contributor agreements disabled");
-    }
-
-    if (!self.get().isIdentifiedUser()) {
-      throw new AuthException("not allowed to get contributor agreements");
-    }
-
-    IdentifiedUser user = self.get().asIdentifiedUser();
-    if (user != resource.getUser()) {
-      throw new AuthException("not allowed to get contributor agreements");
-    }
-
-    List<AgreementInfo> results = new ArrayList<>();
-    Collection<ContributorAgreement> cas =
-        projectCache.getAllProjects().getConfig().getContributorAgreements();
-    for (ContributorAgreement ca : cas) {
-      List<AccountGroup.UUID> groupIds = new ArrayList<>();
-      for (PermissionRule rule : ca.getAccepted()) {
-        if ((rule.getAction() == Action.ALLOW) && (rule.getGroup() != null)) {
-          if (rule.getGroup().getUUID() != null) {
-            groupIds.add(rule.getGroup().getUUID());
-          } else {
-            log.warn(
-                "group \""
-                    + rule.getGroup().getName()
-                    + "\" does not "
-                    + "exist, referenced in CLA \""
-                    + ca.getName()
-                    + "\"");
-          }
-        }
-      }
-
-      if (user.getEffectiveGroups().containsAnyOf(groupIds)) {
-        results.add(agreementJson.format(ca));
-      }
-    }
-    return results;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetAvatar.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetAvatar.java
deleted file mode 100644
index 7ee9112..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetAvatar.java
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.account;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.extensions.restapi.CacheControl;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.server.avatar.AvatarProvider;
-import com.google.inject.Inject;
-import java.util.concurrent.TimeUnit;
-import org.kohsuke.args4j.Option;
-
-public class GetAvatar implements RestReadView<AccountResource> {
-  private final DynamicItem<AvatarProvider> avatarProvider;
-
-  private int size;
-
-  @Option(
-      name = "--size",
-      aliases = {"-s"},
-      usage = "recommended size in pixels, height and width")
-  public void setSize(int s) {
-    size = s;
-  }
-
-  @Inject
-  GetAvatar(DynamicItem<AvatarProvider> avatarProvider) {
-    this.avatarProvider = avatarProvider;
-  }
-
-  @Override
-  public Response.Redirect apply(AccountResource rsrc) throws ResourceNotFoundException {
-    AvatarProvider impl = avatarProvider.get();
-    if (impl == null) {
-      throw (new ResourceNotFoundException()).caching(CacheControl.PUBLIC(1, TimeUnit.DAYS));
-    }
-
-    String url = impl.getUrl(rsrc.getUser(), size);
-    if (Strings.isNullOrEmpty(url)) {
-      throw (new ResourceNotFoundException()).caching(CacheControl.PUBLIC(1, TimeUnit.HOURS));
-    }
-    return Response.redirect(url);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetAvatarChangeUrl.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetAvatarChangeUrl.java
deleted file mode 100644
index d340772..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetAvatarChangeUrl.java
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.account;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.server.avatar.AvatarProvider;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-@Singleton
-public class GetAvatarChangeUrl implements RestReadView<AccountResource> {
-  private final DynamicItem<AvatarProvider> avatarProvider;
-
-  @Inject
-  GetAvatarChangeUrl(DynamicItem<AvatarProvider> avatarProvider) {
-    this.avatarProvider = avatarProvider;
-  }
-
-  @Override
-  public String apply(AccountResource rsrc) throws ResourceNotFoundException {
-    AvatarProvider impl = avatarProvider.get();
-    if (impl == null) {
-      throw new ResourceNotFoundException();
-    }
-
-    String url = impl.getChangeAvatarUrl(rsrc.getUser());
-    if (Strings.isNullOrEmpty(url)) {
-      throw new ResourceNotFoundException();
-    }
-    return url;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetCapabilities.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetCapabilities.java
deleted file mode 100644
index 4058a16..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetCapabilities.java
+++ /dev/null
@@ -1,164 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.account;
-
-import static com.google.gerrit.common.data.GlobalCapability.PRIORITY;
-
-import com.google.common.collect.Iterables;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.common.data.PermissionRange;
-import com.google.gerrit.extensions.api.access.GlobalOrPluginPermission;
-import com.google.gerrit.extensions.api.access.PluginPermission;
-import com.google.gerrit.extensions.config.CapabilityDefinition;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BinaryResult;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.OptionUtil;
-import com.google.gerrit.server.OutputFormat;
-import com.google.gerrit.server.account.AccountResource.Capability;
-import com.google.gerrit.server.git.QueueProvider;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gson.reflect.TypeToken;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Set;
-import org.kohsuke.args4j.Option;
-
-class GetCapabilities implements RestReadView<AccountResource> {
-  @Option(name = "-q", metaVar = "CAP", usage = "Capability to inspect")
-  void addQuery(String name) {
-    if (query == null) {
-      query = new HashSet<>();
-    }
-    Iterables.addAll(query, OptionUtil.splitOptionValue(name));
-  }
-
-  private Set<String> query;
-
-  private final PermissionBackend permissionBackend;
-  private final AccountLimits.Factory limitsFactory;
-  private final Provider<CurrentUser> self;
-  private final DynamicMap<CapabilityDefinition> pluginCapabilities;
-
-  @Inject
-  GetCapabilities(
-      PermissionBackend permissionBackend,
-      AccountLimits.Factory limitsFactory,
-      Provider<CurrentUser> self,
-      DynamicMap<CapabilityDefinition> pluginCapabilities) {
-    this.permissionBackend = permissionBackend;
-    this.limitsFactory = limitsFactory;
-    this.self = self;
-    this.pluginCapabilities = pluginCapabilities;
-  }
-
-  @Override
-  public Object apply(AccountResource resource) throws AuthException, PermissionBackendException {
-    PermissionBackend.WithUser perm = permissionBackend.user(self);
-    if (!self.get().hasSameAccountId(resource.getUser())) {
-      perm.check(GlobalPermission.ADMINISTRATE_SERVER);
-      perm = permissionBackend.user(resource.getUser());
-    }
-
-    Map<String, Object> have = new LinkedHashMap<>();
-    for (GlobalOrPluginPermission p : perm.test(permissionsToTest())) {
-      have.put(p.permissionName(), true);
-    }
-
-    AccountLimits limits = limitsFactory.create(resource.getUser());
-    addRanges(have, limits);
-    addPriority(have, limits);
-
-    return OutputFormat.JSON
-        .newGson()
-        .toJsonTree(have, new TypeToken<Map<String, Object>>() {}.getType());
-  }
-
-  private Set<GlobalOrPluginPermission> permissionsToTest() {
-    Set<GlobalOrPluginPermission> toTest = new HashSet<>();
-    for (GlobalPermission p : GlobalPermission.values()) {
-      if (want(p.permissionName())) {
-        toTest.add(p);
-      }
-    }
-
-    for (String pluginName : pluginCapabilities.plugins()) {
-      for (String capability : pluginCapabilities.byPlugin(pluginName).keySet()) {
-        PluginPermission p = new PluginPermission(pluginName, capability);
-        if (want(p.permissionName())) {
-          toTest.add(p);
-        }
-      }
-    }
-    return toTest;
-  }
-
-  private boolean want(String name) {
-    return query == null || query.contains(name.toLowerCase());
-  }
-
-  private void addRanges(Map<String, Object> have, AccountLimits limits) {
-    for (String name : GlobalCapability.getRangeNames()) {
-      if (want(name) && limits.hasExplicitRange(name)) {
-        have.put(name, new Range(limits.getRange(name)));
-      }
-    }
-  }
-
-  private void addPriority(Map<String, Object> have, AccountLimits limits) {
-    QueueProvider.QueueType queue = limits.getQueueType();
-    if (queue != QueueProvider.QueueType.INTERACTIVE
-        || (query != null && query.contains(PRIORITY))) {
-      have.put(PRIORITY, queue);
-    }
-  }
-
-  private static class Range {
-    private transient PermissionRange range;
-
-    @SuppressWarnings("unused")
-    private int min;
-
-    @SuppressWarnings("unused")
-    private int max;
-
-    Range(PermissionRange r) {
-      range = r;
-      min = r.getMin();
-      max = r.getMax();
-    }
-
-    @Override
-    public String toString() {
-      return range.toString();
-    }
-  }
-
-  @Singleton
-  static class CheckOne implements RestReadView<AccountResource.Capability> {
-    @Override
-    public BinaryResult apply(Capability resource) {
-      return BinaryResult.create("ok\n");
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetDetail.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetDetail.java
deleted file mode 100644
index 30eb377..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetDetail.java
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.account;
-
-import com.google.common.base.Throwables;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.account.AccountDirectory.DirectoryException;
-import com.google.gerrit.server.account.AccountDirectory.FillOptions;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.sql.Timestamp;
-import java.util.Collections;
-import java.util.EnumSet;
-
-@Singleton
-public class GetDetail implements RestReadView<AccountResource> {
-
-  private final InternalAccountDirectory directory;
-
-  @Inject
-  public GetDetail(InternalAccountDirectory directory) {
-    this.directory = directory;
-  }
-
-  @Override
-  public AccountDetailInfo apply(AccountResource rsrc) throws OrmException {
-    Account a = rsrc.getUser().getAccount();
-    AccountDetailInfo info = new AccountDetailInfo(a.getId().get());
-    info.registeredOn = a.getRegisteredOn();
-    info.inactive = !a.isActive() ? true : null;
-    try {
-      directory.fillAccountInfo(Collections.singleton(info), EnumSet.allOf(FillOptions.class));
-    } catch (DirectoryException e) {
-      Throwables.throwIfInstanceOf(e.getCause(), OrmException.class);
-      throw new OrmException(e);
-    }
-    return info;
-  }
-
-  public static class AccountDetailInfo extends AccountInfo {
-    public Timestamp registeredOn;
-    public Boolean inactive;
-
-    public AccountDetailInfo(Integer id) {
-      super(id);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetDiffPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetDiffPreferences.java
deleted file mode 100644
index 5a68732..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetDiffPreferences.java
+++ /dev/null
@@ -1,120 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.account;
-
-import static com.google.gerrit.server.config.ConfigUtil.loadSection;
-import static com.google.gerrit.server.config.ConfigUtil.skipField;
-
-import com.google.gerrit.extensions.client.DiffPreferencesInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.UserConfigSections;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.lang.reflect.Field;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.Repository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class GetDiffPreferences implements RestReadView<AccountResource> {
-  private static final Logger log = LoggerFactory.getLogger(GetDiffPreferences.class);
-
-  private final Provider<CurrentUser> self;
-  private final Provider<AllUsersName> allUsersName;
-  private final PermissionBackend permissionBackend;
-  private final GitRepositoryManager gitMgr;
-
-  @Inject
-  GetDiffPreferences(
-      Provider<CurrentUser> self,
-      Provider<AllUsersName> allUsersName,
-      PermissionBackend permissionBackend,
-      GitRepositoryManager gitMgr) {
-    this.self = self;
-    this.allUsersName = allUsersName;
-    this.permissionBackend = permissionBackend;
-    this.gitMgr = gitMgr;
-  }
-
-  @Override
-  public DiffPreferencesInfo apply(AccountResource rsrc)
-      throws AuthException, ConfigInvalidException, IOException, PermissionBackendException {
-    if (!self.get().hasSameAccountId(rsrc.getUser())) {
-      permissionBackend.user(self).check(GlobalPermission.ADMINISTRATE_SERVER);
-    }
-
-    Account.Id id = rsrc.getUser().getAccountId();
-    return readFromGit(id, gitMgr, allUsersName.get(), null);
-  }
-
-  static DiffPreferencesInfo readFromGit(
-      Account.Id id, GitRepositoryManager gitMgr, AllUsersName allUsersName, DiffPreferencesInfo in)
-      throws IOException, ConfigInvalidException, RepositoryNotFoundException {
-    try (Repository git = gitMgr.openRepository(allUsersName)) {
-      VersionedAccountPreferences p = VersionedAccountPreferences.forUser(id);
-      p.load(git);
-      DiffPreferencesInfo prefs = new DiffPreferencesInfo();
-      loadSection(
-          p.getConfig(), UserConfigSections.DIFF, null, prefs, readDefaultsFromGit(git, in), in);
-      return prefs;
-    }
-  }
-
-  static DiffPreferencesInfo readDefaultsFromGit(Repository git, DiffPreferencesInfo in)
-      throws ConfigInvalidException, IOException {
-    VersionedAccountPreferences dp = VersionedAccountPreferences.forDefault();
-    dp.load(git);
-    DiffPreferencesInfo allUserPrefs = new DiffPreferencesInfo();
-    loadSection(
-        dp.getConfig(),
-        UserConfigSections.DIFF,
-        null,
-        allUserPrefs,
-        DiffPreferencesInfo.defaults(),
-        in);
-    return updateDefaults(allUserPrefs);
-  }
-
-  private static DiffPreferencesInfo updateDefaults(DiffPreferencesInfo input) {
-    DiffPreferencesInfo result = DiffPreferencesInfo.defaults();
-    try {
-      for (Field field : input.getClass().getDeclaredFields()) {
-        if (skipField(field)) {
-          continue;
-        }
-        Object newVal = field.get(input);
-        if (newVal != null) {
-          field.set(result, newVal);
-        }
-      }
-    } catch (IllegalAccessException e) {
-      log.warn("Cannot get default diff preferences from All-Users", e);
-      return DiffPreferencesInfo.defaults();
-    }
-    return result;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetEditPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetEditPreferences.java
deleted file mode 100644
index e321ca4..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetEditPreferences.java
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.account;
-
-import static com.google.gerrit.server.config.ConfigUtil.loadSection;
-
-import com.google.gerrit.extensions.client.EditPreferencesInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.UserConfigSections;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.Repository;
-
-@Singleton
-public class GetEditPreferences implements RestReadView<AccountResource> {
-  private final Provider<CurrentUser> self;
-  private final PermissionBackend permissionBackend;
-  private final AllUsersName allUsersName;
-  private final GitRepositoryManager gitMgr;
-
-  @Inject
-  GetEditPreferences(
-      Provider<CurrentUser> self,
-      PermissionBackend permissionBackend,
-      AllUsersName allUsersName,
-      GitRepositoryManager gitMgr) {
-    this.self = self;
-    this.permissionBackend = permissionBackend;
-    this.allUsersName = allUsersName;
-    this.gitMgr = gitMgr;
-  }
-
-  @Override
-  public EditPreferencesInfo apply(AccountResource rsrc)
-      throws AuthException, IOException, ConfigInvalidException, PermissionBackendException {
-    if (!self.get().hasSameAccountId(rsrc.getUser())) {
-      permissionBackend.user(self).check(GlobalPermission.MODIFY_ACCOUNT);
-    }
-
-    return readFromGit(rsrc.getUser().getAccountId(), gitMgr, allUsersName, null);
-  }
-
-  static EditPreferencesInfo readFromGit(
-      Account.Id id, GitRepositoryManager gitMgr, AllUsersName allUsersName, EditPreferencesInfo in)
-      throws IOException, ConfigInvalidException, RepositoryNotFoundException {
-    try (Repository git = gitMgr.openRepository(allUsersName)) {
-      VersionedAccountPreferences p = VersionedAccountPreferences.forUser(id);
-      p.load(git);
-
-      return loadSection(
-          p.getConfig(),
-          UserConfigSections.EDIT,
-          null,
-          new EditPreferencesInfo(),
-          EditPreferencesInfo.defaults(),
-          in);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetEmail.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetEmail.java
deleted file mode 100644
index 82e0944..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetEmail.java
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.account;
-
-import com.google.gerrit.extensions.common.EmailInfo;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-@Singleton
-public class GetEmail implements RestReadView<AccountResource.Email> {
-  @Inject
-  public GetEmail() {}
-
-  @Override
-  public EmailInfo apply(AccountResource.Email rsrc) {
-    EmailInfo e = new EmailInfo();
-    e.email = rsrc.getEmail();
-    e.preferred(rsrc.getUser().getAccount().getPreferredEmail());
-    return e;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetEmails.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetEmails.java
deleted file mode 100644
index 184780f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetEmails.java
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.account;
-
-import com.google.gerrit.extensions.common.EmailInfo;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.inject.Singleton;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-@Singleton
-public class GetEmails implements RestReadView<AccountResource> {
-
-  @Override
-  public List<EmailInfo> apply(AccountResource rsrc) {
-    List<EmailInfo> emails = new ArrayList<>();
-    for (String email : rsrc.getUser().getEmailAddresses()) {
-      if (email != null) {
-        EmailInfo e = new EmailInfo();
-        e.email = email;
-        e.preferred(rsrc.getUser().getAccount().getPreferredEmail());
-        emails.add(e);
-      }
-    }
-    Collections.sort(
-        emails,
-        new Comparator<EmailInfo>() {
-          @Override
-          public int compare(EmailInfo a, EmailInfo b) {
-            return a.email.compareTo(b.email);
-          }
-        });
-    return emails;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetExternalIds.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetExternalIds.java
deleted file mode 100644
index 3e2d459..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetExternalIds.java
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.account;
-
-import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_USERNAME;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-import com.google.gerrit.extensions.common.AccountExternalIdInfo;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.account.externalids.ExternalIds;
-import com.google.gerrit.server.config.AuthConfig;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-@Singleton
-public class GetExternalIds implements RestReadView<AccountResource> {
-  private final PermissionBackend permissionBackend;
-  private final ExternalIds externalIds;
-  private final Provider<CurrentUser> self;
-  private final AuthConfig authConfig;
-
-  @Inject
-  GetExternalIds(
-      PermissionBackend permissionBackend,
-      ExternalIds externalIds,
-      Provider<CurrentUser> self,
-      AuthConfig authConfig) {
-    this.permissionBackend = permissionBackend;
-    this.externalIds = externalIds;
-    this.self = self;
-    this.authConfig = authConfig;
-  }
-
-  @Override
-  public List<AccountExternalIdInfo> apply(AccountResource resource)
-      throws RestApiException, IOException, OrmException, PermissionBackendException {
-    if (!self.get().hasSameAccountId(resource.getUser())) {
-      permissionBackend.user(self).check(GlobalPermission.ACCESS_DATABASE);
-    }
-
-    Collection<ExternalId> ids = externalIds.byAccount(resource.getUser().getAccountId());
-    if (ids.isEmpty()) {
-      return ImmutableList.of();
-    }
-    List<AccountExternalIdInfo> result = Lists.newArrayListWithCapacity(ids.size());
-    for (ExternalId id : ids) {
-      AccountExternalIdInfo info = new AccountExternalIdInfo();
-      info.identity = id.key().get();
-      info.emailAddress = id.email();
-      info.trusted = toBoolean(authConfig.isIdentityTrustable(Collections.singleton(id)));
-      // The identity can be deleted only if its not the one used to
-      // establish this web session, and if only if an identity was
-      // actually used to establish this web session.
-      if (!id.isScheme(SCHEME_USERNAME)) {
-        ExternalId.Key last = resource.getUser().getLastLoginExternalIdKey();
-        info.canDelete = toBoolean(last == null || !last.get().equals(info.identity));
-      }
-      result.add(info);
-    }
-    return result;
-  }
-
-  private static Boolean toBoolean(boolean v) {
-    return v ? v : null;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetGroups.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetGroups.java
deleted file mode 100644
index 757cb44d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetGroups.java
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.account;
-
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.extensions.common.GroupInfo;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.group.GroupJson;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.ArrayList;
-import java.util.List;
-
-@Singleton
-public class GetGroups implements RestReadView<AccountResource> {
-  private final GroupControl.Factory groupControlFactory;
-  private final GroupJson json;
-
-  @Inject
-  GetGroups(GroupControl.Factory groupControlFactory, GroupJson json) {
-    this.groupControlFactory = groupControlFactory;
-    this.json = json;
-  }
-
-  @Override
-  public List<GroupInfo> apply(AccountResource resource) throws OrmException {
-    IdentifiedUser user = resource.getUser();
-    Account.Id userId = user.getAccountId();
-    List<GroupInfo> groups = new ArrayList<>();
-    for (AccountGroup.UUID uuid : user.getEffectiveGroups().getKnownGroups()) {
-      GroupControl ctl;
-      try {
-        ctl = groupControlFactory.controlFor(uuid);
-      } catch (NoSuchGroupException e) {
-        continue;
-      }
-      if (ctl.isVisible() && ctl.canSeeMember(userId)) {
-        groups.add(json.format(ctl.getGroup()));
-      }
-    }
-    return groups;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetName.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetName.java
deleted file mode 100644
index 7add77a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetName.java
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.account;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.inject.Singleton;
-
-@Singleton
-public class GetName implements RestReadView<AccountResource> {
-  @Override
-  public String apply(AccountResource rsrc) {
-    return Strings.nullToEmpty(rsrc.getUser().getAccount().getFullName());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetOAuthToken.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetOAuthToken.java
deleted file mode 100644
index d3394f5..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetOAuthToken.java
+++ /dev/null
@@ -1,96 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.account;
-
-import com.google.gerrit.extensions.auth.oauth.OAuthToken;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.auth.oauth.OAuthTokenCache;
-import com.google.gerrit.server.config.CanonicalWebUrl;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.net.URI;
-import java.net.URISyntaxException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-class GetOAuthToken implements RestReadView<AccountResource> {
-
-  private static final String BEARER_TYPE = "bearer";
-  private static final Logger log = LoggerFactory.getLogger(GetOAuthToken.class);
-
-  private final Provider<CurrentUser> self;
-  private final OAuthTokenCache tokenCache;
-  private final Provider<String> canonicalWebUrlProvider;
-
-  @Inject
-  GetOAuthToken(
-      Provider<CurrentUser> self,
-      OAuthTokenCache tokenCache,
-      @CanonicalWebUrl Provider<String> urlProvider) {
-    this.self = self;
-    this.tokenCache = tokenCache;
-    this.canonicalWebUrlProvider = urlProvider;
-  }
-
-  @Override
-  public OAuthTokenInfo apply(AccountResource rsrc)
-      throws AuthException, ResourceNotFoundException {
-    if (!self.get().hasSameAccountId(rsrc.getUser())) {
-      throw new AuthException("not allowed to get access token");
-    }
-    Account a = rsrc.getUser().getAccount();
-    OAuthToken accessToken = tokenCache.get(a.getId());
-    if (accessToken == null) {
-      throw new ResourceNotFoundException();
-    }
-    OAuthTokenInfo accessTokenInfo = new OAuthTokenInfo();
-    accessTokenInfo.username = a.getUserName();
-    accessTokenInfo.resourceHost = getHostName(canonicalWebUrlProvider.get());
-    accessTokenInfo.accessToken = accessToken.getToken();
-    accessTokenInfo.providerId = accessToken.getProviderId();
-    accessTokenInfo.expiresAt = Long.toString(accessToken.getExpiresAt());
-    accessTokenInfo.type = BEARER_TYPE;
-    return accessTokenInfo;
-  }
-
-  private static String getHostName(String canonicalWebUrl) {
-    if (canonicalWebUrl == null) {
-      log.error("No canonicalWebUrl defined in gerrit.config, OAuth may not work properly");
-      return null;
-    }
-
-    try {
-      return new URI(canonicalWebUrl).getHost();
-    } catch (URISyntaxException e) {
-      log.error("Invalid canonicalWebUrl '" + canonicalWebUrl + "'", e);
-      return null;
-    }
-  }
-
-  public static class OAuthTokenInfo {
-    public String username;
-    public String resourceHost;
-    public String accessToken;
-    public String providerId;
-    public String expiresAt;
-    public String type;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetPreferences.java
deleted file mode 100644
index e79cdbd..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetPreferences.java
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.account;
-
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-
-@Singleton
-public class GetPreferences implements RestReadView<AccountResource> {
-  private final Provider<CurrentUser> self;
-  private final PermissionBackend permissionBackend;
-  private final AccountCache accountCache;
-
-  @Inject
-  GetPreferences(
-      Provider<CurrentUser> self, PermissionBackend permissionBackend, AccountCache accountCache) {
-    this.self = self;
-    this.permissionBackend = permissionBackend;
-    this.accountCache = accountCache;
-  }
-
-  @Override
-  public GeneralPreferencesInfo apply(AccountResource rsrc)
-      throws AuthException, PermissionBackendException {
-    if (!self.get().hasSameAccountId(rsrc.getUser())) {
-      permissionBackend.user(self).check(GlobalPermission.MODIFY_ACCOUNT);
-    }
-
-    Account.Id id = rsrc.getUser().getAccountId();
-    return accountCache.get(id).getAccount().getGeneralPreferencesInfo();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetSshKey.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetSshKey.java
deleted file mode 100644
index ee75432..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetSshKey.java
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.account;
-
-import com.google.gerrit.extensions.common.SshKeyInfo;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.server.account.AccountResource.SshKey;
-import com.google.inject.Singleton;
-
-@Singleton
-public class GetSshKey implements RestReadView<AccountResource.SshKey> {
-
-  @Override
-  public SshKeyInfo apply(SshKey rsrc) {
-    return GetSshKeys.newSshKeyInfo(rsrc.getSshKey());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetSshKeys.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetSshKeys.java
deleted file mode 100644
index 66a8bf3..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetSshKeys.java
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.account;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.Lists;
-import com.google.gerrit.extensions.common.SshKeyInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.AccountSshKey;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.List;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-
-@Singleton
-public class GetSshKeys implements RestReadView<AccountResource> {
-
-  private final Provider<CurrentUser> self;
-  private final PermissionBackend permissionBackend;
-  private final VersionedAuthorizedKeys.Accessor authorizedKeys;
-
-  @Inject
-  GetSshKeys(
-      Provider<CurrentUser> self,
-      PermissionBackend permissionBackend,
-      VersionedAuthorizedKeys.Accessor authorizedKeys) {
-    this.self = self;
-    this.permissionBackend = permissionBackend;
-    this.authorizedKeys = authorizedKeys;
-  }
-
-  @Override
-  public List<SshKeyInfo> apply(AccountResource rsrc)
-      throws AuthException, OrmException, RepositoryNotFoundException, IOException,
-          ConfigInvalidException, PermissionBackendException {
-    if (!self.get().hasSameAccountId(rsrc.getUser())) {
-      permissionBackend.user(self).check(GlobalPermission.MODIFY_ACCOUNT);
-    }
-    return apply(rsrc.getUser());
-  }
-
-  public List<SshKeyInfo> apply(IdentifiedUser user)
-      throws RepositoryNotFoundException, IOException, ConfigInvalidException {
-    return Lists.transform(authorizedKeys.getKeys(user.getAccountId()), GetSshKeys::newSshKeyInfo);
-  }
-
-  public static SshKeyInfo newSshKeyInfo(AccountSshKey sshKey) {
-    SshKeyInfo info = new SshKeyInfo();
-    info.seq = sshKey.getKey().get();
-    info.sshPublicKey = sshKey.getSshPublicKey();
-    info.encodedKey = sshKey.getEncodedKey();
-    info.algorithm = sshKey.getAlgorithm();
-    info.comment = Strings.emptyToNull(sshKey.getComment());
-    info.valid = sshKey.isValid();
-    return info;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetStatus.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetStatus.java
deleted file mode 100644
index 5d57c4c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetStatus.java
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.account;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.inject.Singleton;
-
-@Singleton
-public class GetStatus implements RestReadView<AccountResource> {
-  @Override
-  public String apply(AccountResource rsrc) {
-    return Strings.nullToEmpty(rsrc.getUser().getAccount().getStatus());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetUsername.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetUsername.java
deleted file mode 100644
index 6541f55..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetUsername.java
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.account;
-
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-@Singleton
-public class GetUsername implements RestReadView<AccountResource> {
-  @Inject
-  public GetUsername() {}
-
-  @Override
-  public String apply(AccountResource rsrc) throws AuthException, ResourceNotFoundException {
-    String username = rsrc.getUser().getAccount().getUserName();
-    if (username == null) {
-      throw new ResourceNotFoundException();
-    }
-    return username;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetWatchedProjects.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetWatchedProjects.java
deleted file mode 100644
index cb12a36..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetWatchedProjects.java
+++ /dev/null
@@ -1,97 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.account;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.ComparisonChain;
-import com.google.gerrit.extensions.client.ProjectWatchInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.WatchConfig.NotifyType;
-import com.google.gerrit.server.account.WatchConfig.ProjectWatchKey;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-@Singleton
-public class GetWatchedProjects implements RestReadView<AccountResource> {
-  private final PermissionBackend permissionBackend;
-  private final Provider<IdentifiedUser> self;
-  private final WatchConfig.Accessor watchConfig;
-
-  @Inject
-  public GetWatchedProjects(
-      PermissionBackend permissionBackend,
-      Provider<IdentifiedUser> self,
-      WatchConfig.Accessor watchConfig) {
-    this.permissionBackend = permissionBackend;
-    this.self = self;
-    this.watchConfig = watchConfig;
-  }
-
-  @Override
-  public List<ProjectWatchInfo> apply(AccountResource rsrc)
-      throws OrmException, AuthException, IOException, ConfigInvalidException,
-          PermissionBackendException {
-    if (!self.get().hasSameAccountId(rsrc.getUser())) {
-      permissionBackend.user(self).check(GlobalPermission.ADMINISTRATE_SERVER);
-    }
-
-    Account.Id accountId = rsrc.getUser().getAccountId();
-    List<ProjectWatchInfo> projectWatchInfos = new ArrayList<>();
-    for (Map.Entry<ProjectWatchKey, Set<NotifyType>> e :
-        watchConfig.getProjectWatches(accountId).entrySet()) {
-      ProjectWatchInfo pwi = new ProjectWatchInfo();
-      pwi.filter = e.getKey().filter();
-      pwi.project = e.getKey().project().get();
-      pwi.notifyAbandonedChanges = toBoolean(e.getValue().contains(NotifyType.ABANDONED_CHANGES));
-      pwi.notifyNewChanges = toBoolean(e.getValue().contains(NotifyType.NEW_CHANGES));
-      pwi.notifyNewPatchSets = toBoolean(e.getValue().contains(NotifyType.NEW_PATCHSETS));
-      pwi.notifySubmittedChanges = toBoolean(e.getValue().contains(NotifyType.SUBMITTED_CHANGES));
-      pwi.notifyAllComments = toBoolean(e.getValue().contains(NotifyType.ALL_COMMENTS));
-      projectWatchInfos.add(pwi);
-    }
-    Collections.sort(
-        projectWatchInfos,
-        new Comparator<ProjectWatchInfo>() {
-          @Override
-          public int compare(ProjectWatchInfo pwi1, ProjectWatchInfo pwi2) {
-            return ComparisonChain.start()
-                .compare(pwi1.project, pwi2.project)
-                .compare(Strings.nullToEmpty(pwi1.filter), Strings.nullToEmpty(pwi2.filter))
-                .result();
-          }
-        });
-    return projectWatchInfos;
-  }
-
-  private static Boolean toBoolean(boolean value) {
-    return value ? true : null;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupBackends.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupBackends.java
deleted file mode 100644
index 803d491..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupBackends.java
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.account;
-
-import com.google.common.collect.Iterables;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.server.project.ProjectState;
-import java.util.Collection;
-import java.util.Comparator;
-
-/** Utility class for dealing with a GroupBackend. */
-public class GroupBackends {
-
-  public static final Comparator<GroupReference> GROUP_REF_NAME_COMPARATOR =
-      new Comparator<GroupReference>() {
-        @Override
-        public int compare(GroupReference a, GroupReference b) {
-          return a.getName().compareTo(b.getName());
-        }
-      };
-
-  /**
-   * Runs {@link GroupBackend#suggest(String, ProjectState)} and filters the result to return the
-   * best suggestion, or null if one does not exist.
-   *
-   * @param groupBackend the group backend
-   * @param name the name for which to suggest groups
-   * @return the best single GroupReference suggestion
-   */
-  @Nullable
-  public static GroupReference findBestSuggestion(GroupBackend groupBackend, String name) {
-    return findBestSuggestion(groupBackend, name, null);
-  }
-
-  /**
-   * Runs {@link GroupBackend#suggest(String, ProjectState)} and filters the result to return the
-   * best suggestion, or null if one does not exist.
-   *
-   * @param groupBackend the group backend
-   * @param name the name for which to suggest groups
-   * @param project the project for which to suggest groups
-   * @return the best single GroupReference suggestion
-   */
-  @Nullable
-  public static GroupReference findBestSuggestion(
-      GroupBackend groupBackend, String name, @Nullable ProjectState project) {
-    Collection<GroupReference> refs = groupBackend.suggest(name, project);
-    if (refs.size() == 1) {
-      return Iterables.getOnlyElement(refs);
-    }
-
-    for (GroupReference ref : refs) {
-      if (isExactSuggestion(ref, name)) {
-        return ref;
-      }
-    }
-    return null;
-  }
-
-  /**
-   * Runs {@link GroupBackend#suggest(String, ProjectState)} and filters the result to return the
-   * exact suggestion, or null if one does not exist.
-   *
-   * @param groupBackend the group backend
-   * @param name the name for which to suggest groups
-   * @return the exact single GroupReference suggestion
-   */
-  @Nullable
-  public static GroupReference findExactSuggestion(GroupBackend groupBackend, String name) {
-    return findExactSuggestion(groupBackend, name, null);
-  }
-
-  /**
-   * Runs {@link GroupBackend#suggest(String, ProjectState)} and filters the result to return the
-   * exact suggestion, or null if one does not exist.
-   *
-   * @param groupBackend the group backend
-   * @param name the name for which to suggest groups
-   * @param project the project for which to suggest groups
-   * @return the exact single GroupReference suggestion
-   */
-  @Nullable
-  public static GroupReference findExactSuggestion(
-      GroupBackend groupBackend, String name, ProjectState project) {
-    Collection<GroupReference> refs = groupBackend.suggest(name, project);
-    for (GroupReference ref : refs) {
-      if (isExactSuggestion(ref, name)) {
-        return ref;
-      }
-    }
-    return null;
-  }
-
-  /** Returns whether the GroupReference is an exact suggestion for the name. */
-  public static boolean isExactSuggestion(GroupReference ref, String name) {
-    return ref.getName().equalsIgnoreCase(name) || ref.getUUID().get().equals(name);
-  }
-
-  private GroupBackends() {}
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCache.java
deleted file mode 100644
index d985426..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCache.java
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.account;
-
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.group.InternalGroup;
-import java.io.IOException;
-import java.util.Optional;
-
-/** Tracks group objects in memory for efficient access. */
-public interface GroupCache {
-  /**
-   * Looks up an internal group by its ID.
-   *
-   * @param groupId the ID of the internal group
-   * @return an {@code Optional} of the internal group, or an empty {@code Optional} if no internal
-   *     group with this ID exists on this server or an error occurred during lookup
-   */
-  Optional<InternalGroup> get(AccountGroup.Id groupId);
-
-  /**
-   * Looks up an internal group by its name.
-   *
-   * @param name the name of the internal group
-   * @return an {@code Optional} of the internal group, or an empty {@code Optional} if no internal
-   *     group with this name exists on this server or an error occurred during lookup
-   */
-  Optional<InternalGroup> get(AccountGroup.NameKey name);
-
-  /**
-   * Looks up an internal group by its UUID.
-   *
-   * @param groupUuid the UUID of the internal group
-   * @return an {@code Optional} of the internal group, or an empty {@code Optional} if no internal
-   *     group with this UUID exists on this server or an error occurred during lookup
-   */
-  Optional<InternalGroup> get(AccountGroup.UUID groupUuid);
-
-  /** Notify the cache that a new group was constructed. */
-  void onCreateGroup(AccountGroup group) throws IOException;
-
-  void evict(AccountGroup.UUID groupUuid, AccountGroup.Id groupId, AccountGroup.NameKey groupName)
-      throws IOException;
-
-  void evictAfterRename(AccountGroup.NameKey oldName) throws IOException;
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCacheImpl.java
deleted file mode 100644
index 393d49a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCacheImpl.java
+++ /dev/null
@@ -1,212 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.account;
-
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.cache.CacheModule;
-import com.google.gerrit.server.group.Groups;
-import com.google.gerrit.server.group.InternalGroup;
-import com.google.gerrit.server.index.group.GroupIndexCollection;
-import com.google.gerrit.server.index.group.GroupIndexer;
-import com.google.gerrit.server.query.group.InternalGroupQuery;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Inject;
-import com.google.inject.Module;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import com.google.inject.TypeLiteral;
-import com.google.inject.name.Named;
-import java.io.IOException;
-import java.util.Optional;
-import java.util.concurrent.ExecutionException;
-import java.util.function.BooleanSupplier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Tracks group objects in memory for efficient access. */
-@Singleton
-public class GroupCacheImpl implements GroupCache {
-  private static final Logger log = LoggerFactory.getLogger(GroupCacheImpl.class);
-
-  private static final String BYID_NAME = "groups";
-  private static final String BYNAME_NAME = "groups_byname";
-  private static final String BYUUID_NAME = "groups_byuuid";
-
-  public static Module module() {
-    return new CacheModule() {
-      @Override
-      protected void configure() {
-        cache(BYID_NAME, AccountGroup.Id.class, new TypeLiteral<Optional<InternalGroup>>() {})
-            .loader(ByIdLoader.class);
-
-        cache(BYNAME_NAME, String.class, new TypeLiteral<Optional<InternalGroup>>() {})
-            .loader(ByNameLoader.class);
-
-        cache(BYUUID_NAME, String.class, new TypeLiteral<Optional<InternalGroup>>() {})
-            .loader(ByUUIDLoader.class);
-
-        bind(GroupCacheImpl.class);
-        bind(GroupCache.class).to(GroupCacheImpl.class);
-      }
-    };
-  }
-
-  private final LoadingCache<AccountGroup.Id, Optional<InternalGroup>> byId;
-  private final LoadingCache<String, Optional<InternalGroup>> byName;
-  private final LoadingCache<String, Optional<InternalGroup>> byUUID;
-  private final Provider<GroupIndexer> indexer;
-
-  @Inject
-  GroupCacheImpl(
-      @Named(BYID_NAME) LoadingCache<AccountGroup.Id, Optional<InternalGroup>> byId,
-      @Named(BYNAME_NAME) LoadingCache<String, Optional<InternalGroup>> byName,
-      @Named(BYUUID_NAME) LoadingCache<String, Optional<InternalGroup>> byUUID,
-      Provider<GroupIndexer> indexer) {
-    this.byId = byId;
-    this.byName = byName;
-    this.byUUID = byUUID;
-    this.indexer = indexer;
-  }
-
-  @Override
-  public Optional<InternalGroup> get(AccountGroup.Id groupId) {
-    try {
-      return byId.get(groupId);
-    } catch (ExecutionException e) {
-      log.warn("Cannot load group {}", groupId, e);
-      return Optional.empty();
-    }
-  }
-
-  @Override
-  public void evict(
-      AccountGroup.UUID groupUuid, AccountGroup.Id groupId, AccountGroup.NameKey groupName)
-      throws IOException {
-    if (groupId != null) {
-      byId.invalidate(groupId);
-    }
-    if (groupName != null) {
-      byName.invalidate(groupName.get());
-    }
-    if (groupUuid != null) {
-      byUUID.invalidate(groupUuid.get());
-    }
-    indexer.get().index(groupUuid);
-  }
-
-  @Override
-  public void evictAfterRename(AccountGroup.NameKey oldName) throws IOException {
-    if (oldName != null) {
-      byName.invalidate(oldName.get());
-    }
-  }
-
-  @Override
-  public Optional<InternalGroup> get(AccountGroup.NameKey name) {
-    if (name == null) {
-      return Optional.empty();
-    }
-    try {
-      return byName.get(name.get());
-    } catch (ExecutionException e) {
-      log.warn("Cannot look up group {} by name", name.get(), e);
-      return Optional.empty();
-    }
-  }
-
-  @Override
-  public Optional<InternalGroup> get(AccountGroup.UUID groupUuid) {
-    if (groupUuid == null) {
-      return Optional.empty();
-    }
-
-    try {
-      return byUUID.get(groupUuid.get());
-    } catch (ExecutionException e) {
-      log.warn("Cannot look up group {} by uuid", groupUuid.get(), e);
-      return Optional.empty();
-    }
-  }
-
-  @Override
-  public void onCreateGroup(AccountGroup group) throws IOException {
-    indexer.get().index(group.getGroupUUID());
-  }
-
-  static class ByIdLoader extends CacheLoader<AccountGroup.Id, Optional<InternalGroup>> {
-    private final SchemaFactory<ReviewDb> schema;
-    private final Groups groups;
-    private final BooleanSupplier hasGroupIndex;
-    private final Provider<InternalGroupQuery> groupQueryProvider;
-
-    @Inject
-    ByIdLoader(
-        SchemaFactory<ReviewDb> schema,
-        Groups groups,
-        GroupIndexCollection groupIndexCollection,
-        Provider<InternalGroupQuery> groupQueryProvider) {
-      this.schema = schema;
-      this.groups = groups;
-      hasGroupIndex = () -> groupIndexCollection.getSearchIndex() != null;
-      this.groupQueryProvider = groupQueryProvider;
-    }
-
-    @Override
-    public Optional<InternalGroup> load(AccountGroup.Id key) throws Exception {
-      if (hasGroupIndex.getAsBoolean()) {
-        return groupQueryProvider.get().byId(key);
-      }
-
-      try (ReviewDb db = schema.open()) {
-        return groups.getGroup(db, key);
-      }
-    }
-  }
-
-  static class ByNameLoader extends CacheLoader<String, Optional<InternalGroup>> {
-    private final Provider<InternalGroupQuery> groupQueryProvider;
-
-    @Inject
-    ByNameLoader(Provider<InternalGroupQuery> groupQueryProvider) {
-      this.groupQueryProvider = groupQueryProvider;
-    }
-
-    @Override
-    public Optional<InternalGroup> load(String name) throws Exception {
-      return groupQueryProvider.get().byName(new AccountGroup.NameKey(name));
-    }
-  }
-
-  static class ByUUIDLoader extends CacheLoader<String, Optional<InternalGroup>> {
-    private final SchemaFactory<ReviewDb> schema;
-    private final Groups groups;
-
-    @Inject
-    ByUUIDLoader(SchemaFactory<ReviewDb> sf, Groups groups) {
-      schema = sf;
-      this.groups = groups;
-    }
-
-    @Override
-    public Optional<InternalGroup> load(String uuid) throws Exception {
-      try (ReviewDb db = schema.open()) {
-        return groups.getGroup(db, new AccountGroup.UUID(uuid));
-      }
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupControl.java
deleted file mode 100644
index 020a04d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupControl.java
+++ /dev/null
@@ -1,203 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.account;
-
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.common.data.GroupDescriptions;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.group.InternalGroup;
-import com.google.gerrit.server.group.InternalGroupDescription;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.Optional;
-
-/** Access control management for a group of accounts managed in Gerrit. */
-public class GroupControl {
-
-  @Singleton
-  public static class GenericFactory {
-    private final PermissionBackend permissionBackend;
-    private final GroupBackend groupBackend;
-
-    @Inject
-    GenericFactory(PermissionBackend permissionBackend, GroupBackend gb) {
-      this.permissionBackend = permissionBackend;
-      groupBackend = gb;
-    }
-
-    public GroupControl controlFor(CurrentUser who, AccountGroup.UUID groupId)
-        throws NoSuchGroupException {
-      GroupDescription.Basic group = groupBackend.get(groupId);
-      if (group == null) {
-        throw new NoSuchGroupException(groupId);
-      }
-      return new GroupControl(who, group, permissionBackend, groupBackend);
-    }
-  }
-
-  public static class Factory {
-    private final PermissionBackend permissionBackend;
-    private final GroupCache groupCache;
-    private final Provider<CurrentUser> user;
-    private final GroupBackend groupBackend;
-
-    @Inject
-    Factory(
-        PermissionBackend permissionBackend,
-        GroupCache gc,
-        Provider<CurrentUser> cu,
-        GroupBackend gb) {
-      this.permissionBackend = permissionBackend;
-      groupCache = gc;
-      user = cu;
-      groupBackend = gb;
-    }
-
-    public GroupControl controlFor(AccountGroup.Id groupId) throws NoSuchGroupException {
-      Optional<InternalGroup> group = groupCache.get(groupId);
-      return group
-          .map(InternalGroupDescription::new)
-          .map(this::controlFor)
-          .orElseThrow(() -> new NoSuchGroupException(groupId));
-    }
-
-    public GroupControl controlFor(AccountGroup.UUID groupId) throws NoSuchGroupException {
-      final GroupDescription.Basic group = groupBackend.get(groupId);
-      if (group == null) {
-        throw new NoSuchGroupException(groupId);
-      }
-      return controlFor(group);
-    }
-
-    public GroupControl controlFor(AccountGroup group) {
-      return controlFor(GroupDescriptions.forAccountGroup(group));
-    }
-
-    public GroupControl controlFor(GroupDescription.Basic group) {
-      return new GroupControl(user.get(), group, permissionBackend, groupBackend);
-    }
-
-    public GroupControl validateFor(AccountGroup.UUID groupUUID) throws NoSuchGroupException {
-      final GroupControl c = controlFor(groupUUID);
-      if (!c.isVisible()) {
-        throw new NoSuchGroupException(groupUUID);
-      }
-      return c;
-    }
-  }
-
-  private final CurrentUser user;
-  private final GroupDescription.Basic group;
-  private Boolean isOwner;
-  private final PermissionBackend.WithUser perm;
-  private final GroupBackend groupBackend;
-
-  GroupControl(
-      CurrentUser who,
-      GroupDescription.Basic gd,
-      PermissionBackend permissionBackend,
-      GroupBackend gb) {
-    user = who;
-    group = gd;
-    this.perm = permissionBackend.user(user);
-    groupBackend = gb;
-  }
-
-  public GroupDescription.Basic getGroup() {
-    return group;
-  }
-
-  public CurrentUser getUser() {
-    return user;
-  }
-
-  /** Can this user see this group exists? */
-  public boolean isVisible() {
-    /* Check for canAdministrateServer may seem redundant, but allows
-     * for visibility of all groups that are not an internal group to
-     * server administrators.
-     */
-    return user.isInternalUser()
-        || groupBackend.isVisibleToAll(group.getGroupUUID())
-        || user.getEffectiveGroups().contains(group.getGroupUUID())
-        || isOwner()
-        || canAdministrateServer();
-  }
-
-  public boolean isOwner() {
-    if (isOwner != null) {
-      return isOwner;
-    }
-
-    if (group instanceof GroupDescription.Internal) {
-      AccountGroup.UUID ownerUUID = ((GroupDescription.Internal) group).getOwnerGroupUUID();
-      isOwner = getUser().getEffectiveGroups().contains(ownerUUID) || canAdministrateServer();
-    } else {
-      isOwner = false;
-    }
-    return isOwner;
-  }
-
-  private boolean canAdministrateServer() {
-    try {
-      perm.check(GlobalPermission.ADMINISTRATE_SERVER);
-      return true;
-    } catch (AuthException | PermissionBackendException denied) {
-      return false;
-    }
-  }
-
-  public boolean canAddMember() {
-    return isOwner();
-  }
-
-  public boolean canRemoveMember() {
-    return isOwner();
-  }
-
-  public boolean canSeeMember(Account.Id id) {
-    if (user.isIdentifiedUser() && user.getAccountId().equals(id)) {
-      return true;
-    }
-    return canSeeMembers();
-  }
-
-  public boolean canAddGroup() {
-    return isOwner();
-  }
-
-  public boolean canRemoveGroup() {
-    return isOwner();
-  }
-
-  public boolean canSeeGroup() {
-    return canSeeMembers();
-  }
-
-  private boolean canSeeMembers() {
-    if (group instanceof GroupDescription.Internal) {
-      return ((GroupDescription.Internal) group).isVisibleToAll() || isOwner();
-    }
-    return false;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupIncludeCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupIncludeCache.java
deleted file mode 100644
index 157afb8..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupIncludeCache.java
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.server.account;
-
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import java.util.Collection;
-
-/** Tracks group inclusions in memory for efficient access. */
-public interface GroupIncludeCache {
-
-  /**
-   * Returns the UUIDs of all groups of which the specified account is a direct member.
-   *
-   * @param memberId the ID of the account
-   * @return the UUIDs of all groups having the account as member
-   */
-  Collection<AccountGroup.UUID> getGroupsWithMember(Account.Id memberId);
-
-  /**
-   * Returns the subgroups of a group.
-   *
-   * @param group the UUID of the group
-   * @return the UUIDs of all direct subgroups
-   */
-  Collection<AccountGroup.UUID> subgroupsOf(AccountGroup.UUID group);
-
-  /**
-   * Returns the parent groups of a subgroup.
-   *
-   * @param groupId the UUID of the subgroup
-   * @return the UUIDs of all direct parent groups
-   */
-  Collection<AccountGroup.UUID> parentGroupsOf(AccountGroup.UUID groupId);
-
-  /** @return set of any UUIDs that are not internal groups. */
-  Collection<AccountGroup.UUID> allExternalMembers();
-
-  void evictGroupsWithMember(Account.Id memberId);
-
-  void evictSubgroupsOf(AccountGroup.UUID groupId);
-
-  void evictParentGroupsOf(AccountGroup.UUID groupId);
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupIncludeCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupIncludeCacheImpl.java
deleted file mode 100644
index 3bc663a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupIncludeCacheImpl.java
+++ /dev/null
@@ -1,287 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.server.account;
-
-import static com.google.common.collect.ImmutableList.toImmutableList;
-import static com.google.common.collect.ImmutableSet.toImmutableSet;
-
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Streams;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.cache.CacheModule;
-import com.google.gerrit.server.group.Groups;
-import com.google.gerrit.server.group.InternalGroup;
-import com.google.gerrit.server.index.group.GroupField;
-import com.google.gerrit.server.index.group.GroupIndex;
-import com.google.gerrit.server.index.group.GroupIndexCollection;
-import com.google.gerrit.server.query.group.InternalGroupQuery;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Inject;
-import com.google.inject.Module;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import com.google.inject.TypeLiteral;
-import com.google.inject.name.Named;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.concurrent.ExecutionException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Tracks group inclusions in memory for efficient access. */
-@Singleton
-public class GroupIncludeCacheImpl implements GroupIncludeCache {
-  private static final Logger log = LoggerFactory.getLogger(GroupIncludeCacheImpl.class);
-  private static final String PARENT_GROUPS_NAME = "groups_bysubgroup";
-  private static final String SUBGROUPS_NAME = "groups_subgroups";
-  private static final String GROUPS_WITH_MEMBER_NAME = "groups_bymember";
-  private static final String EXTERNAL_NAME = "groups_external";
-
-  public static Module module() {
-    return new CacheModule() {
-      @Override
-      protected void configure() {
-        cache(
-                GROUPS_WITH_MEMBER_NAME,
-                Account.Id.class,
-                new TypeLiteral<ImmutableSet<AccountGroup.UUID>>() {})
-            .loader(GroupsWithMemberLoader.class);
-
-        cache(
-                PARENT_GROUPS_NAME,
-                AccountGroup.UUID.class,
-                new TypeLiteral<ImmutableList<AccountGroup.UUID>>() {})
-            .loader(ParentGroupsLoader.class);
-
-        cache(
-                SUBGROUPS_NAME,
-                AccountGroup.UUID.class,
-                new TypeLiteral<ImmutableList<AccountGroup.UUID>>() {})
-            .loader(SubgroupsLoader.class);
-
-        cache(EXTERNAL_NAME, String.class, new TypeLiteral<ImmutableList<AccountGroup.UUID>>() {})
-            .loader(AllExternalLoader.class);
-
-        bind(GroupIncludeCacheImpl.class);
-        bind(GroupIncludeCache.class).to(GroupIncludeCacheImpl.class);
-      }
-    };
-  }
-
-  private final LoadingCache<Account.Id, ImmutableSet<AccountGroup.UUID>> groupsWithMember;
-  private final LoadingCache<AccountGroup.UUID, ImmutableList<AccountGroup.UUID>> subgroups;
-  private final LoadingCache<AccountGroup.UUID, ImmutableList<AccountGroup.UUID>> parentGroups;
-  private final LoadingCache<String, ImmutableList<AccountGroup.UUID>> external;
-
-  @Inject
-  GroupIncludeCacheImpl(
-      @Named(GROUPS_WITH_MEMBER_NAME)
-          LoadingCache<Account.Id, ImmutableSet<AccountGroup.UUID>> groupsWithMember,
-      @Named(SUBGROUPS_NAME)
-          LoadingCache<AccountGroup.UUID, ImmutableList<AccountGroup.UUID>> subgroups,
-      @Named(PARENT_GROUPS_NAME)
-          LoadingCache<AccountGroup.UUID, ImmutableList<AccountGroup.UUID>> parentGroups,
-      @Named(EXTERNAL_NAME) LoadingCache<String, ImmutableList<AccountGroup.UUID>> external) {
-    this.groupsWithMember = groupsWithMember;
-    this.subgroups = subgroups;
-    this.parentGroups = parentGroups;
-    this.external = external;
-  }
-
-  @Override
-  public Collection<AccountGroup.UUID> getGroupsWithMember(Account.Id memberId) {
-    try {
-      return groupsWithMember.get(memberId);
-    } catch (ExecutionException e) {
-      log.warn("Cannot load groups containing {} as member", memberId.get());
-      return ImmutableSet.of();
-    }
-  }
-
-  @Override
-  public Collection<AccountGroup.UUID> subgroupsOf(AccountGroup.UUID groupId) {
-    try {
-      return subgroups.get(groupId);
-    } catch (ExecutionException e) {
-      log.warn("Cannot load members of group", e);
-      return Collections.emptySet();
-    }
-  }
-
-  @Override
-  public Collection<AccountGroup.UUID> parentGroupsOf(AccountGroup.UUID groupId) {
-    try {
-      return parentGroups.get(groupId);
-    } catch (ExecutionException e) {
-      log.warn("Cannot load included groups", e);
-      return Collections.emptySet();
-    }
-  }
-
-  @Override
-  public void evictGroupsWithMember(Account.Id memberId) {
-    if (memberId != null) {
-      groupsWithMember.invalidate(memberId);
-    }
-  }
-
-  @Override
-  public void evictSubgroupsOf(AccountGroup.UUID groupId) {
-    if (groupId != null) {
-      subgroups.invalidate(groupId);
-    }
-  }
-
-  @Override
-  public void evictParentGroupsOf(AccountGroup.UUID groupId) {
-    if (groupId != null) {
-      parentGroups.invalidate(groupId);
-
-      if (!AccountGroup.isInternalGroup(groupId)) {
-        external.invalidate(EXTERNAL_NAME);
-      }
-    }
-  }
-
-  @Override
-  public Collection<AccountGroup.UUID> allExternalMembers() {
-    try {
-      return external.get(EXTERNAL_NAME);
-    } catch (ExecutionException e) {
-      log.warn("Cannot load set of non-internal groups", e);
-      return ImmutableList.of();
-    }
-  }
-
-  static class GroupsWithMemberLoader
-      extends CacheLoader<Account.Id, ImmutableSet<AccountGroup.UUID>> {
-    private final SchemaFactory<ReviewDb> schema;
-    private final Provider<GroupIndex> groupIndexProvider;
-    private final Provider<InternalGroupQuery> groupQueryProvider;
-    private final GroupCache groupCache;
-
-    @Inject
-    GroupsWithMemberLoader(
-        SchemaFactory<ReviewDb> schema,
-        GroupIndexCollection groupIndexCollection,
-        Provider<InternalGroupQuery> groupQueryProvider,
-        GroupCache groupCache) {
-      this.schema = schema;
-      groupIndexProvider = groupIndexCollection::getSearchIndex;
-      this.groupQueryProvider = groupQueryProvider;
-      this.groupCache = groupCache;
-    }
-
-    @Override
-    public ImmutableSet<AccountGroup.UUID> load(Account.Id memberId)
-        throws OrmException, NoSuchGroupException {
-      GroupIndex groupIndex = groupIndexProvider.get();
-      if (groupIndex != null && groupIndex.getSchema().hasField(GroupField.MEMBER)) {
-        return groupQueryProvider.get().byMember(memberId).stream()
-            .map(InternalGroup::getGroupUUID)
-            .collect(toImmutableSet());
-      }
-      try (ReviewDb db = schema.open()) {
-        return Groups.getGroupsWithMemberFromReviewDb(db, memberId)
-            .map(groupCache::get)
-            .flatMap(Streams::stream)
-            .map(InternalGroup::getGroupUUID)
-            .collect(toImmutableSet());
-      }
-    }
-  }
-
-  static class SubgroupsLoader
-      extends CacheLoader<AccountGroup.UUID, ImmutableList<AccountGroup.UUID>> {
-    private final SchemaFactory<ReviewDb> schema;
-    private final Groups groups;
-
-    @Inject
-    SubgroupsLoader(SchemaFactory<ReviewDb> sf, Groups groups) {
-      schema = sf;
-      this.groups = groups;
-    }
-
-    @Override
-    public ImmutableList<AccountGroup.UUID> load(AccountGroup.UUID key)
-        throws OrmException, NoSuchGroupException {
-      try (ReviewDb db = schema.open()) {
-        return groups.getSubgroups(db, key).collect(toImmutableList());
-      }
-    }
-  }
-
-  static class ParentGroupsLoader
-      extends CacheLoader<AccountGroup.UUID, ImmutableList<AccountGroup.UUID>> {
-    private final SchemaFactory<ReviewDb> schema;
-    private final Provider<GroupIndex> groupIndexProvider;
-    private final Provider<InternalGroupQuery> groupQueryProvider;
-    private final GroupCache groupCache;
-
-    @Inject
-    ParentGroupsLoader(
-        SchemaFactory<ReviewDb> sf,
-        GroupIndexCollection groupIndexCollection,
-        Provider<InternalGroupQuery> groupQueryProvider,
-        GroupCache groupCache) {
-      schema = sf;
-      this.groupIndexProvider = groupIndexCollection::getSearchIndex;
-      this.groupQueryProvider = groupQueryProvider;
-      this.groupCache = groupCache;
-    }
-
-    @Override
-    public ImmutableList<AccountGroup.UUID> load(AccountGroup.UUID key) throws OrmException {
-      GroupIndex groupIndex = groupIndexProvider.get();
-      if (groupIndex != null && groupIndex.getSchema().hasField(GroupField.SUBGROUP)) {
-        return groupQueryProvider.get().bySubgroup(key).stream()
-            .map(InternalGroup::getGroupUUID)
-            .collect(toImmutableList());
-      }
-      try (ReviewDb db = schema.open()) {
-        return Groups.getParentGroupsFromReviewDb(db, key)
-            .map(groupCache::get)
-            .flatMap(Streams::stream)
-            .map(InternalGroup::getGroupUUID)
-            .collect(toImmutableList());
-      }
-    }
-  }
-
-  static class AllExternalLoader extends CacheLoader<String, ImmutableList<AccountGroup.UUID>> {
-    private final SchemaFactory<ReviewDb> schema;
-    private final Groups groups;
-
-    @Inject
-    AllExternalLoader(SchemaFactory<ReviewDb> sf, Groups groups) {
-      schema = sf;
-      this.groups = groups;
-    }
-
-    @Override
-    public ImmutableList<AccountGroup.UUID> load(String key) throws Exception {
-      try (ReviewDb db = schema.open()) {
-        return groups.getExternalGroups(db).collect(toImmutableList());
-      }
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupMembers.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupMembers.java
deleted file mode 100644
index 78e75af..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupMembers.java
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.server.account;
-
-import static com.google.common.collect.ImmutableSet.toImmutableSet;
-
-import com.google.common.collect.Sets;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.group.InternalGroup;
-import com.google.gerrit.server.group.InternalGroupDescription;
-import com.google.gerrit.server.group.SystemGroupBackend;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Optional;
-import java.util.Set;
-
-public class GroupMembers {
-  public interface Factory {
-    GroupMembers create(CurrentUser currentUser);
-  }
-
-  private final GroupCache groupCache;
-  private final GroupControl.Factory groupControlFactory;
-  private final AccountCache accountCache;
-  private final ProjectControl.GenericFactory projectControl;
-  private final CurrentUser currentUser;
-
-  @Inject
-  GroupMembers(
-      GroupCache groupCache,
-      GroupControl.Factory groupControlFactory,
-      AccountCache accountCache,
-      ProjectControl.GenericFactory projectControl,
-      @Assisted CurrentUser currentUser) {
-    this.groupCache = groupCache;
-    this.groupControlFactory = groupControlFactory;
-    this.accountCache = accountCache;
-    this.projectControl = projectControl;
-    this.currentUser = currentUser;
-  }
-
-  public Set<Account> listAccounts(AccountGroup.UUID groupUUID, Project.NameKey project)
-      throws NoSuchGroupException, NoSuchProjectException, OrmException, IOException {
-    return listAccounts(groupUUID, project, new HashSet<AccountGroup.UUID>());
-  }
-
-  private Set<Account> listAccounts(
-      final AccountGroup.UUID groupUUID,
-      final Project.NameKey project,
-      final Set<AccountGroup.UUID> seen)
-      throws NoSuchGroupException, OrmException, NoSuchProjectException, IOException {
-    if (SystemGroupBackend.PROJECT_OWNERS.equals(groupUUID)) {
-      return getProjectOwners(project, seen);
-    }
-    Optional<InternalGroup> group = groupCache.get(groupUUID);
-    if (group.isPresent()) {
-      return getGroupMembers(group.get(), project, seen);
-    }
-    return Collections.emptySet();
-  }
-
-  private Set<Account> getProjectOwners(final Project.NameKey project, Set<AccountGroup.UUID> seen)
-      throws NoSuchProjectException, NoSuchGroupException, OrmException, IOException {
-    seen.add(SystemGroupBackend.PROJECT_OWNERS);
-    if (project == null) {
-      return Collections.emptySet();
-    }
-
-    final Iterable<AccountGroup.UUID> ownerGroups =
-        projectControl.controlFor(project, currentUser).getProjectState().getAllOwners();
-
-    final HashSet<Account> projectOwners = new HashSet<>();
-    for (AccountGroup.UUID ownerGroup : ownerGroups) {
-      if (!seen.contains(ownerGroup)) {
-        projectOwners.addAll(listAccounts(ownerGroup, project, seen));
-      }
-    }
-    return projectOwners;
-  }
-
-  private Set<Account> getGroupMembers(
-      InternalGroup group, Project.NameKey project, Set<AccountGroup.UUID> seen)
-      throws NoSuchGroupException, OrmException, NoSuchProjectException, IOException {
-    seen.add(group.getGroupUUID());
-    GroupControl groupControl = groupControlFactory.controlFor(new InternalGroupDescription(group));
-
-    Set<Account> directMembers =
-        group.getMembers().stream()
-            .filter(groupControl::canSeeMember)
-            .map(accountCache::get)
-            .map(AccountState::getAccount)
-            .collect(toImmutableSet());
-
-    Set<Account> indirectMembers = new HashSet<>();
-    if (groupControl.canSeeGroup()) {
-      for (AccountGroup.UUID subgroupUuid : group.getSubgroups()) {
-        if (!seen.contains(subgroupUuid)) {
-          indirectMembers.addAll(listAccounts(subgroupUuid, project, seen));
-        }
-      }
-    }
-
-    return Sets.union(directMembers, indirectMembers);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupMembership.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupMembership.java
deleted file mode 100644
index 59b992a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupMembership.java
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.account;
-
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * Implementations of GroupMembership provide methods to test the presence of a user in a particular
- * group.
- */
-public interface GroupMembership {
-  GroupMembership EMPTY = new ListGroupMembership(Collections.<AccountGroup.UUID>emptySet());
-
-  /**
-   * Returns {@code true} when the user this object was created for is a member of the specified
-   * group.
-   */
-  boolean contains(AccountGroup.UUID groupId);
-
-  /**
-   * Returns {@code true} when the user this object was created for is a member of any of the
-   * specified group.
-   */
-  boolean containsAnyOf(Iterable<AccountGroup.UUID> groupIds);
-
-  /**
-   * Returns a set containing an input member of {@code contains(id)} is true.
-   *
-   * <p>This is batch form of contains that returns specific group information. Implementors may
-   * implement the method as:
-   *
-   * <pre>
-   * Set&lt;AccountGroup.UUID&gt; r = new HashSet&lt;&gt;();
-   * for (AccountGroup.UUID id : groupIds)
-   *   if (contains(id)) r.add(id);
-   * </pre>
-   */
-  Set<AccountGroup.UUID> intersection(Iterable<AccountGroup.UUID> groupIds);
-
-  /**
-   * Returns the set of groups that can be determined by the implementation. This may not return all
-   * groups the {@link #contains(AccountGroup.UUID)} would return {@code true} for, but will at
-   * least contain all top level groups. This restriction stems from the API of some group systems,
-   * which make it expensive to enumerate the members of a group.
-   */
-  Set<AccountGroup.UUID> getKnownGroups();
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupUUID.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupUUID.java
deleted file mode 100644
index 45c7052..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupUUID.java
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.server.account;
-
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import java.security.MessageDigest;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.PersonIdent;
-
-public class GroupUUID {
-  public static AccountGroup.UUID make(String groupName, PersonIdent creator) {
-    MessageDigest md = Constants.newMessageDigest();
-    md.update(Constants.encode("group " + groupName + "\n"));
-    md.update(Constants.encode("creator " + creator.toExternalString() + "\n"));
-    return new AccountGroup.UUID(ObjectId.fromRaw(md.digest()).name());
-  }
-
-  private GroupUUID() {}
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/HashedPassword.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/HashedPassword.java
deleted file mode 100644
index 0323f4e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/HashedPassword.java
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.account;
-
-import com.google.common.base.Preconditions;
-import com.google.common.io.BaseEncoding;
-import com.google.common.primitives.Ints;
-import java.nio.charset.StandardCharsets;
-import java.security.SecureRandom;
-import org.apache.commons.codec.DecoderException;
-import org.bouncycastle.crypto.generators.BCrypt;
-import org.bouncycastle.util.Arrays;
-
-/**
- * Holds logic for salted, hashed passwords. It uses BCrypt from BouncyCastle, which truncates
- * passwords at 72 bytes.
- */
-public class HashedPassword {
-  private static final String ALGORITHM_PREFIX = "bcrypt:";
-  private static final SecureRandom secureRandom = new SecureRandom();
-  private static final BaseEncoding codec = BaseEncoding.base64();
-
-  // bcrypt uses 2^cost rounds. Since we use a generated random password, no need
-  // for a high cost.
-  private static final int DEFAULT_COST = 4;
-
-  /**
-   * decodes a hashed password encoded with {@link #encode}.
-   *
-   * @throws DecoderException if input is malformed.
-   */
-  public static HashedPassword decode(String encoded) throws DecoderException {
-    if (!encoded.startsWith(ALGORITHM_PREFIX)) {
-      throw new DecoderException("unrecognized algorithm");
-    }
-
-    String[] fields = encoded.split(":");
-    if (fields.length != 4) {
-      throw new DecoderException("want 4 fields");
-    }
-
-    Integer cost = Ints.tryParse(fields[1]);
-    if (cost == null) {
-      throw new DecoderException("cost parse failed");
-    }
-
-    if (!(cost >= 4 && cost < 32)) {
-      throw new DecoderException("cost should be 4..31 inclusive, got " + cost);
-    }
-
-    byte[] salt = codec.decode(fields[2]);
-    if (salt.length != 16) {
-      throw new DecoderException("salt should be 16 bytes, got " + salt.length);
-    }
-    return new HashedPassword(codec.decode(fields[3]), salt, cost);
-  }
-
-  private static byte[] hashPassword(String password, byte[] salt, int cost) {
-    byte[] pwBytes = password.getBytes(StandardCharsets.UTF_8);
-
-    return BCrypt.generate(pwBytes, salt, cost);
-  }
-
-  public static HashedPassword fromPassword(String password) {
-    byte[] salt = newSalt();
-
-    return new HashedPassword(hashPassword(password, salt, DEFAULT_COST), salt, DEFAULT_COST);
-  }
-
-  private static byte[] newSalt() {
-    byte[] bytes = new byte[16];
-    secureRandom.nextBytes(bytes);
-    return bytes;
-  }
-
-  private byte[] salt;
-  private byte[] hashed;
-  private int cost;
-
-  private HashedPassword(byte[] hashed, byte[] salt, int cost) {
-    this.salt = salt;
-    this.hashed = hashed;
-    this.cost = cost;
-
-    Preconditions.checkState(cost >= 4 && cost < 32);
-
-    // salt must be 128 bit.
-    Preconditions.checkState(salt.length == 16);
-  }
-
-  /**
-   * Serialize the hashed password and its parameters for persistent storage.
-   *
-   * @return one-line string encoding the hash and salt.
-   */
-  public String encode() {
-    return ALGORITHM_PREFIX + cost + ":" + codec.encode(salt) + ":" + codec.encode(hashed);
-  }
-
-  public boolean checkPassword(String password) {
-    // Constant-time comparison, because we're paranoid.
-    return Arrays.areEqual(hashPassword(password, salt, cost), hashed);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/IncludingGroupMembership.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/IncludingGroupMembership.java
deleted file mode 100644
index a077629..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/IncludingGroupMembership.java
+++ /dev/null
@@ -1,158 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.account;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.group.InternalGroup;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * Group membership checker for the internal group system.
- *
- * <p>Groups the user is directly a member of are pulled from the in-memory AccountCache by way of
- * the IdentifiedUser. Transitive group memberhips are resolved on demand starting from the
- * requested group and looking for a path to a group the user is a member of. Other group backends
- * are supported by recursively invoking the universal GroupMembership.
- */
-public class IncludingGroupMembership implements GroupMembership {
-  public interface Factory {
-    IncludingGroupMembership create(IdentifiedUser user);
-  }
-
-  private final GroupCache groupCache;
-  private final GroupIncludeCache includeCache;
-  private final IdentifiedUser user;
-  private final Map<AccountGroup.UUID, Boolean> memberOf;
-  private Set<AccountGroup.UUID> knownGroups;
-
-  @Inject
-  IncludingGroupMembership(
-      GroupCache groupCache, GroupIncludeCache includeCache, @Assisted IdentifiedUser user) {
-    this.groupCache = groupCache;
-    this.includeCache = includeCache;
-    this.user = user;
-    memberOf = new ConcurrentHashMap<>();
-  }
-
-  @Override
-  public boolean contains(AccountGroup.UUID id) {
-    if (id == null) {
-      return false;
-    }
-
-    Boolean b = memberOf.get(id);
-    return b != null ? b : containsAnyOf(ImmutableSet.of(id));
-  }
-
-  @Override
-  public boolean containsAnyOf(Iterable<AccountGroup.UUID> queryIds) {
-    // Prefer lookup of a cached result over expanding includes.
-    boolean tryExpanding = false;
-    for (AccountGroup.UUID id : queryIds) {
-      Boolean b = memberOf.get(id);
-      if (b == null) {
-        tryExpanding = true;
-      } else if (b) {
-        return true;
-      }
-    }
-
-    if (tryExpanding) {
-      for (AccountGroup.UUID id : queryIds) {
-        if (memberOf.containsKey(id)) {
-          // Membership was earlier proven to be false.
-          continue;
-        }
-
-        memberOf.put(id, false);
-        Optional<InternalGroup> group = groupCache.get(id);
-        if (!group.isPresent()) {
-          continue;
-        }
-        if (group.get().getMembers().contains(user.getAccountId())) {
-          memberOf.put(id, true);
-          return true;
-        }
-        if (search(group.get().getSubgroups())) {
-          memberOf.put(id, true);
-          return true;
-        }
-      }
-    }
-
-    return false;
-  }
-
-  @Override
-  public Set<AccountGroup.UUID> intersection(Iterable<AccountGroup.UUID> groupIds) {
-    Set<AccountGroup.UUID> r = new HashSet<>();
-    for (AccountGroup.UUID id : groupIds) {
-      if (contains(id)) {
-        r.add(id);
-      }
-    }
-    return r;
-  }
-
-  private boolean search(Iterable<AccountGroup.UUID> ids) {
-    return user.getEffectiveGroups().containsAnyOf(ids);
-  }
-
-  private ImmutableSet<AccountGroup.UUID> computeKnownGroups() {
-    GroupMembership membership = user.getEffectiveGroups();
-    Collection<AccountGroup.UUID> direct = includeCache.getGroupsWithMember(user.getAccountId());
-    direct.forEach(groupUuid -> memberOf.put(groupUuid, true));
-    Set<AccountGroup.UUID> r = Sets.newHashSet(direct);
-    r.remove(null);
-
-    List<AccountGroup.UUID> q = Lists.newArrayList(r);
-    for (AccountGroup.UUID g : membership.intersection(includeCache.allExternalMembers())) {
-      if (g != null && r.add(g)) {
-        q.add(g);
-      }
-    }
-
-    while (!q.isEmpty()) {
-      AccountGroup.UUID id = q.remove(q.size() - 1);
-      for (AccountGroup.UUID g : includeCache.parentGroupsOf(id)) {
-        if (g != null && r.add(g)) {
-          q.add(g);
-          memberOf.put(g, true);
-        }
-      }
-    }
-    return ImmutableSet.copyOf(r);
-  }
-
-  @Override
-  public Set<AccountGroup.UUID> getKnownGroups() {
-    if (knownGroups == null) {
-      knownGroups = computeKnownGroups();
-    }
-    return knownGroups;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/Index.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/Index.java
deleted file mode 100644
index 6feb287..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/Index.java
+++ /dev/null
@@ -1,57 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.account;
-
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.account.Index.Input;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-
-@Singleton
-public class Index implements RestModifyView<AccountResource, Input> {
-  public static class Input {}
-
-  private final AccountCache accountCache;
-  private final PermissionBackend permissionBackend;
-  private final Provider<CurrentUser> self;
-
-  @Inject
-  Index(
-      AccountCache accountCache, PermissionBackend permissionBackend, Provider<CurrentUser> self) {
-    this.accountCache = accountCache;
-    this.permissionBackend = permissionBackend;
-    this.self = self;
-  }
-
-  @Override
-  public Response<?> apply(AccountResource rsrc, Input input)
-      throws IOException, AuthException, PermissionBackendException {
-    if (!self.get().hasSameAccountId(rsrc.getUser())) {
-      permissionBackend.user(self).check(GlobalPermission.MODIFY_ACCOUNT);
-    }
-
-    // evicting the account from the cache, reindexes the account
-    accountCache.evict(rsrc.getUser().getAccountId());
-    return Response.none();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/InternalAccountDirectory.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/InternalAccountDirectory.java
deleted file mode 100644
index e7ff314..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/InternalAccountDirectory.java
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.account;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.AvatarInfo;
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.avatar.AvatarProvider;
-import com.google.inject.AbstractModule;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.List;
-import java.util.Set;
-
-@Singleton
-public class InternalAccountDirectory extends AccountDirectory {
-  static final Set<FillOptions> ID_ONLY = Collections.unmodifiableSet(EnumSet.of(FillOptions.ID));
-
-  public static class Module extends AbstractModule {
-    @Override
-    protected void configure() {
-      bind(AccountDirectory.class).to(InternalAccountDirectory.class);
-    }
-  }
-
-  private final AccountCache accountCache;
-  private final DynamicItem<AvatarProvider> avatar;
-  private final IdentifiedUser.GenericFactory userFactory;
-
-  @Inject
-  InternalAccountDirectory(
-      AccountCache accountCache,
-      DynamicItem<AvatarProvider> avatar,
-      IdentifiedUser.GenericFactory userFactory) {
-    this.accountCache = accountCache;
-    this.avatar = avatar;
-    this.userFactory = userFactory;
-  }
-
-  @Override
-  public void fillAccountInfo(Iterable<? extends AccountInfo> in, Set<FillOptions> options)
-      throws DirectoryException {
-    if (options.equals(ID_ONLY)) {
-      return;
-    }
-    for (AccountInfo info : in) {
-      Account.Id id = new Account.Id(info._accountId);
-      AccountState state = accountCache.get(id);
-      fill(info, state.getAccount(), state.getExternalIds(), options);
-    }
-  }
-
-  private void fill(
-      AccountInfo info,
-      Account account,
-      @Nullable Collection<ExternalId> externalIds,
-      Set<FillOptions> options) {
-    if (options.contains(FillOptions.ID)) {
-      info._accountId = account.getId().get();
-    } else {
-      // Was previously set to look up account for filling.
-      info._accountId = null;
-    }
-    if (options.contains(FillOptions.NAME)) {
-      info.name = Strings.emptyToNull(account.getFullName());
-      if (info.name == null) {
-        info.name = account.getUserName();
-      }
-    }
-    if (options.contains(FillOptions.EMAIL)) {
-      info.email = account.getPreferredEmail();
-    }
-    if (options.contains(FillOptions.SECONDARY_EMAILS)) {
-      info.secondaryEmails = externalIds != null ? getSecondaryEmails(account, externalIds) : null;
-    }
-    if (options.contains(FillOptions.USERNAME)) {
-      info.username = externalIds != null ? AccountState.getUserName(externalIds) : null;
-    }
-
-    if (options.contains(FillOptions.STATUS)) {
-      info.status = account.getStatus();
-    }
-
-    if (options.contains(FillOptions.AVATARS)) {
-      AvatarProvider ap = avatar.get();
-      if (ap != null) {
-        info.avatars = new ArrayList<>(3);
-        IdentifiedUser user = userFactory.create(account.getId());
-
-        // GWT UI uses DEFAULT_SIZE (26px).
-        addAvatar(ap, info, user, AvatarInfo.DEFAULT_SIZE);
-
-        // PolyGerrit UI prefers 32px and 100px.
-        if (!info.avatars.isEmpty()) {
-          if (32 != AvatarInfo.DEFAULT_SIZE) {
-            addAvatar(ap, info, user, 32);
-          }
-          if (100 != AvatarInfo.DEFAULT_SIZE) {
-            addAvatar(ap, info, user, 100);
-          }
-        }
-      }
-    }
-  }
-
-  public List<String> getSecondaryEmails(Account account, Collection<ExternalId> externalIds) {
-    List<String> emails = new ArrayList<>(AccountState.getEmails(externalIds));
-    if (account.getPreferredEmail() != null) {
-      emails.remove(account.getPreferredEmail());
-    }
-    Collections.sort(emails);
-    return emails;
-  }
-
-  private static void addAvatar(
-      AvatarProvider provider, AccountInfo account, IdentifiedUser user, int size) {
-    String url = provider.getUrl(user, size);
-    if (url != null) {
-      AvatarInfo avatar = new AvatarInfo();
-      avatar.url = url;
-      avatar.height = size;
-      account.avatars.add(avatar);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/InternalGroupBackend.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/InternalGroupBackend.java
deleted file mode 100644
index 3f4fee9..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/InternalGroupBackend.java
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.account;
-
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.group.Groups;
-import com.google.gerrit.server.group.InternalGroupDescription;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.Collection;
-import org.eclipse.jgit.lib.ObjectId;
-
-/** Implementation of GroupBackend for the internal group system. */
-@Singleton
-public class InternalGroupBackend implements GroupBackend {
-  private final GroupControl.Factory groupControlFactory;
-  private final GroupCache groupCache;
-  private final Groups groups;
-  private final SchemaFactory<ReviewDb> schema;
-  private final IncludingGroupMembership.Factory groupMembershipFactory;
-
-  @Inject
-  InternalGroupBackend(
-      GroupControl.Factory groupControlFactory,
-      GroupCache groupCache,
-      Groups groups,
-      SchemaFactory<ReviewDb> schema,
-      IncludingGroupMembership.Factory groupMembershipFactory) {
-    this.groupControlFactory = groupControlFactory;
-    this.groupCache = groupCache;
-    this.groups = groups;
-    this.schema = schema;
-    this.groupMembershipFactory = groupMembershipFactory;
-  }
-
-  @Override
-  public boolean handles(AccountGroup.UUID uuid) {
-    // See AccountGroup.isInternalGroup
-    return ObjectId.isId(uuid.get()); // [0-9a-f]{40};
-  }
-
-  @Override
-  public GroupDescription.Internal get(AccountGroup.UUID uuid) {
-    if (!handles(uuid)) {
-      return null;
-    }
-
-    return groupCache.get(uuid).map(InternalGroupDescription::new).orElse(null);
-  }
-
-  @Override
-  public Collection<GroupReference> suggest(String name, ProjectState project) {
-    try (ReviewDb db = schema.open()) {
-      return groups
-          .getAll(db)
-          .filter(group -> startsWithIgnoreCase(group, name))
-          .filter(this::isVisible)
-          .map(GroupReference::forGroup)
-          .collect(toList());
-    } catch (OrmException e) {
-      return ImmutableList.of();
-    }
-  }
-
-  private static boolean startsWithIgnoreCase(AccountGroup group, String name) {
-    return group.getName().regionMatches(true, 0, name, 0, name.length());
-  }
-
-  private boolean isVisible(AccountGroup group) {
-    return groupControlFactory.controlFor(group).isVisible();
-  }
-
-  @Override
-  public GroupMembership membershipsOf(IdentifiedUser user) {
-    return groupMembershipFactory.create(user);
-  }
-
-  @Override
-  public boolean isVisibleToAll(AccountGroup.UUID uuid) {
-    GroupDescription.Internal g = get(uuid);
-    return g != null && g.isVisibleToAll();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/InvalidUserNameException.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/InvalidUserNameException.java
deleted file mode 100644
index e8d0df7..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/InvalidUserNameException.java
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.account;
-
-/** Error indicating the SSH user name does not match the expected pattern. */
-public class InvalidUserNameException extends Exception {
-
-  private static final long serialVersionUID = 1L;
-
-  public static final String MESSAGE = "Invalid user name.";
-
-  public InvalidUserNameException() {
-    super(MESSAGE);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/Module.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/Module.java
deleted file mode 100644
index 44060be..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/Module.java
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.account;
-
-import static com.google.gerrit.server.account.AccountResource.ACCOUNT_KIND;
-import static com.google.gerrit.server.account.AccountResource.CAPABILITY_KIND;
-import static com.google.gerrit.server.account.AccountResource.EMAIL_KIND;
-import static com.google.gerrit.server.account.AccountResource.SSH_KEY_KIND;
-import static com.google.gerrit.server.account.AccountResource.STARRED_CHANGE_KIND;
-import static com.google.gerrit.server.account.AccountResource.Star.STAR_KIND;
-
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.RestApiModule;
-
-public class Module extends RestApiModule {
-  @Override
-  protected void configure() {
-    bind(AccountsCollection.class);
-    bind(Capabilities.class);
-
-    DynamicMap.mapOf(binder(), ACCOUNT_KIND);
-    DynamicMap.mapOf(binder(), CAPABILITY_KIND);
-    DynamicMap.mapOf(binder(), EMAIL_KIND);
-    DynamicMap.mapOf(binder(), SSH_KEY_KIND);
-    DynamicMap.mapOf(binder(), STARRED_CHANGE_KIND);
-    DynamicMap.mapOf(binder(), STAR_KIND);
-
-    put(ACCOUNT_KIND).to(PutAccount.class);
-    get(ACCOUNT_KIND).to(GetAccount.class);
-    get(ACCOUNT_KIND, "detail").to(GetDetail.class);
-    post(ACCOUNT_KIND, "index").to(Index.class);
-    get(ACCOUNT_KIND, "name").to(GetName.class);
-    put(ACCOUNT_KIND, "name").to(PutName.class);
-    delete(ACCOUNT_KIND, "name").to(PutName.class);
-    get(ACCOUNT_KIND, "status").to(GetStatus.class);
-    put(ACCOUNT_KIND, "status").to(PutStatus.class);
-    get(ACCOUNT_KIND, "username").to(GetUsername.class);
-    put(ACCOUNT_KIND, "username").to(PutUsername.class);
-    get(ACCOUNT_KIND, "active").to(GetActive.class);
-    put(ACCOUNT_KIND, "active").to(PutActive.class);
-    delete(ACCOUNT_KIND, "active").to(DeleteActive.class);
-    child(ACCOUNT_KIND, "emails").to(EmailsCollection.class);
-    get(EMAIL_KIND).to(GetEmail.class);
-    put(EMAIL_KIND).to(PutEmail.class);
-    delete(EMAIL_KIND).to(DeleteEmail.class);
-    put(EMAIL_KIND, "preferred").to(PutPreferred.class);
-    put(ACCOUNT_KIND, "password.http").to(PutHttpPassword.class);
-    delete(ACCOUNT_KIND, "password.http").to(PutHttpPassword.class);
-    child(ACCOUNT_KIND, "sshkeys").to(SshKeys.class);
-    post(ACCOUNT_KIND, "sshkeys").to(AddSshKey.class);
-    get(ACCOUNT_KIND, "watched.projects").to(GetWatchedProjects.class);
-    post(ACCOUNT_KIND, "watched.projects").to(PostWatchedProjects.class);
-    post(ACCOUNT_KIND, "watched.projects:delete").to(DeleteWatchedProjects.class);
-
-    get(SSH_KEY_KIND).to(GetSshKey.class);
-    delete(SSH_KEY_KIND).to(DeleteSshKey.class);
-
-    get(ACCOUNT_KIND, "oauthtoken").to(GetOAuthToken.class);
-
-    get(ACCOUNT_KIND, "avatar").to(GetAvatar.class);
-    get(ACCOUNT_KIND, "avatar.change.url").to(GetAvatarChangeUrl.class);
-
-    child(ACCOUNT_KIND, "capabilities").to(Capabilities.class);
-
-    get(ACCOUNT_KIND, "groups").to(GetGroups.class);
-    get(ACCOUNT_KIND, "preferences").to(GetPreferences.class);
-    put(ACCOUNT_KIND, "preferences").to(SetPreferences.class);
-    get(ACCOUNT_KIND, "preferences.diff").to(GetDiffPreferences.class);
-    put(ACCOUNT_KIND, "preferences.diff").to(SetDiffPreferences.class);
-    get(ACCOUNT_KIND, "preferences.edit").to(GetEditPreferences.class);
-    put(ACCOUNT_KIND, "preferences.edit").to(SetEditPreferences.class);
-    get(CAPABILITY_KIND).to(GetCapabilities.CheckOne.class);
-
-    get(ACCOUNT_KIND, "agreements").to(GetAgreements.class);
-    put(ACCOUNT_KIND, "agreements").to(PutAgreement.class);
-
-    child(ACCOUNT_KIND, "starred.changes").to(StarredChanges.class);
-    put(STARRED_CHANGE_KIND).to(StarredChanges.Put.class);
-    delete(STARRED_CHANGE_KIND).to(StarredChanges.Delete.class);
-    bind(StarredChanges.Create.class);
-
-    child(ACCOUNT_KIND, "stars.changes").to(Stars.class);
-    get(STAR_KIND).to(Stars.Get.class);
-    post(STAR_KIND).to(Stars.Post.class);
-
-    get(ACCOUNT_KIND, "external.ids").to(GetExternalIds.class);
-    post(ACCOUNT_KIND, "external.ids:delete").to(DeleteExternalIds.class);
-
-    factory(CreateAccount.Factory.class);
-    factory(CreateEmail.Factory.class);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/PostWatchedProjects.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/PostWatchedProjects.java
deleted file mode 100644
index d7f3ba9..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/PostWatchedProjects.java
+++ /dev/null
@@ -1,128 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.account;
-
-import com.google.gerrit.extensions.client.ProjectWatchInfo;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.WatchConfig.NotifyType;
-import com.google.gerrit.server.account.WatchConfig.ProjectWatchKey;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.ProjectsCollection;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-@Singleton
-public class PostWatchedProjects
-    implements RestModifyView<AccountResource, List<ProjectWatchInfo>> {
-  private final Provider<IdentifiedUser> self;
-  private final PermissionBackend permissionBackend;
-  private final GetWatchedProjects getWatchedProjects;
-  private final ProjectsCollection projectsCollection;
-  private final AccountCache accountCache;
-  private final WatchConfig.Accessor watchConfig;
-
-  @Inject
-  public PostWatchedProjects(
-      Provider<IdentifiedUser> self,
-      PermissionBackend permissionBackend,
-      GetWatchedProjects getWatchedProjects,
-      ProjectsCollection projectsCollection,
-      AccountCache accountCache,
-      WatchConfig.Accessor watchConfig) {
-    this.self = self;
-    this.permissionBackend = permissionBackend;
-    this.getWatchedProjects = getWatchedProjects;
-    this.projectsCollection = projectsCollection;
-    this.accountCache = accountCache;
-    this.watchConfig = watchConfig;
-  }
-
-  @Override
-  public List<ProjectWatchInfo> apply(AccountResource rsrc, List<ProjectWatchInfo> input)
-      throws OrmException, RestApiException, IOException, ConfigInvalidException,
-          PermissionBackendException {
-    if (!self.get().hasSameAccountId(rsrc.getUser())) {
-      permissionBackend.user(self).check(GlobalPermission.ADMINISTRATE_SERVER);
-    }
-
-    Account.Id accountId = rsrc.getUser().getAccountId();
-    watchConfig.upsertProjectWatches(accountId, asMap(input));
-    accountCache.evict(accountId);
-    return getWatchedProjects.apply(rsrc);
-  }
-
-  private Map<ProjectWatchKey, Set<NotifyType>> asMap(List<ProjectWatchInfo> input)
-      throws BadRequestException, UnprocessableEntityException, IOException,
-          PermissionBackendException {
-    Map<ProjectWatchKey, Set<NotifyType>> m = new HashMap<>();
-    for (ProjectWatchInfo info : input) {
-      if (info.project == null) {
-        throw new BadRequestException("project name must be specified");
-      }
-
-      ProjectWatchKey key =
-          ProjectWatchKey.create(projectsCollection.parse(info.project).getNameKey(), info.filter);
-      if (m.containsKey(key)) {
-        throw new BadRequestException(
-            "duplicate entry for project " + format(info.project, info.filter));
-      }
-
-      Set<NotifyType> notifyValues = EnumSet.noneOf(NotifyType.class);
-      if (toBoolean(info.notifyAbandonedChanges)) {
-        notifyValues.add(NotifyType.ABANDONED_CHANGES);
-      }
-      if (toBoolean(info.notifyAllComments)) {
-        notifyValues.add(NotifyType.ALL_COMMENTS);
-      }
-      if (toBoolean(info.notifyNewChanges)) {
-        notifyValues.add(NotifyType.NEW_CHANGES);
-      }
-      if (toBoolean(info.notifyNewPatchSets)) {
-        notifyValues.add(NotifyType.NEW_PATCHSETS);
-      }
-      if (toBoolean(info.notifySubmittedChanges)) {
-        notifyValues.add(NotifyType.SUBMITTED_CHANGES);
-      }
-
-      m.put(key, notifyValues);
-    }
-    return m;
-  }
-
-  private boolean toBoolean(Boolean b) {
-    return b == null ? false : b;
-  }
-
-  private static String format(String project, String filter) {
-    return project
-        + (filter != null && !WatchConfig.FILTER_ALL.equals(filter) ? " and filter " + filter : "");
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutAccount.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutAccount.java
deleted file mode 100644
index da5a58f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutAccount.java
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.account;
-
-import com.google.gerrit.extensions.api.accounts.AccountInput;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.inject.Singleton;
-
-@Singleton
-public class PutAccount implements RestModifyView<AccountResource, AccountInput> {
-  @Override
-  public Response<AccountInfo> apply(AccountResource resource, AccountInput input)
-      throws ResourceConflictException {
-    throw new ResourceConflictException("account exists");
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutActive.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutActive.java
deleted file mode 100644
index 7ce2ea8..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutActive.java
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.account;
-
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.server.account.PutActive.Input;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-@RequiresCapability(GlobalCapability.MODIFY_ACCOUNT)
-@Singleton
-public class PutActive implements RestModifyView<AccountResource, Input> {
-  public static class Input {}
-
-  private final SetInactiveFlag setInactiveFlag;
-
-  @Inject
-  PutActive(SetInactiveFlag setInactiveFlag) {
-    this.setInactiveFlag = setInactiveFlag;
-  }
-
-  @Override
-  public Response<String> apply(AccountResource rsrc, Input input)
-      throws ResourceNotFoundException, OrmException, IOException, ConfigInvalidException {
-    return setInactiveFlag.activate(rsrc.getUser().getAccountId());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutAgreement.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutAgreement.java
deleted file mode 100644
index b27ebf4..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutAgreement.java
+++ /dev/null
@@ -1,103 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.account;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.common.data.ContributorAgreement;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.extensions.common.AgreementInput;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.extensions.events.AgreementSignup;
-import com.google.gerrit.server.group.AddMembers;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.eclipse.jgit.lib.Config;
-
-@Singleton
-public class PutAgreement implements RestModifyView<AccountResource, AgreementInput> {
-  private final ProjectCache projectCache;
-  private final Provider<IdentifiedUser> self;
-  private final AgreementSignup agreementSignup;
-  private final AddMembers addMembers;
-  private final boolean agreementsEnabled;
-
-  @Inject
-  PutAgreement(
-      ProjectCache projectCache,
-      Provider<IdentifiedUser> self,
-      AgreementSignup agreementSignup,
-      AddMembers addMembers,
-      @GerritServerConfig Config config) {
-    this.projectCache = projectCache;
-    this.self = self;
-    this.agreementSignup = agreementSignup;
-    this.addMembers = addMembers;
-    this.agreementsEnabled = config.getBoolean("auth", "contributorAgreements", false);
-  }
-
-  @Override
-  public Response<String> apply(AccountResource resource, AgreementInput input)
-      throws IOException, OrmException, RestApiException {
-    if (!agreementsEnabled) {
-      throw new MethodNotAllowedException("contributor agreements disabled");
-    }
-
-    if (!self.get().hasSameAccountId(resource.getUser())) {
-      throw new AuthException("not allowed to enter contributor agreement");
-    }
-
-    String agreementName = Strings.nullToEmpty(input.name);
-    ContributorAgreement ca =
-        projectCache.getAllProjects().getConfig().getContributorAgreement(agreementName);
-    if (ca == null) {
-      throw new UnprocessableEntityException("contributor agreement not found");
-    }
-
-    if (ca.getAutoVerify() == null) {
-      throw new BadRequestException("cannot enter a non-autoVerify agreement");
-    }
-
-    AccountGroup.UUID uuid = ca.getAutoVerify().getUUID();
-    if (uuid == null) {
-      throw new ResourceConflictException("autoverify group uuid not found");
-    }
-
-    Account account = self.get().getAccount();
-    try {
-      addMembers.addMembers(uuid, ImmutableList.of(account.getId()));
-    } catch (NoSuchGroupException e) {
-      throw new ResourceConflictException("autoverify group not found");
-    }
-    agreementSignup.fire(account, agreementName);
-
-    return Response.ok(agreementName);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutEmail.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutEmail.java
deleted file mode 100644
index acdbbf4..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutEmail.java
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.account;
-
-import com.google.gerrit.extensions.api.accounts.EmailInput;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.inject.Singleton;
-
-@Singleton
-public class PutEmail implements RestModifyView<AccountResource.Email, EmailInput> {
-  @Override
-  public Response<?> apply(AccountResource.Email rsrc, EmailInput input)
-      throws ResourceConflictException {
-    throw new ResourceConflictException("email exists");
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutHttpPassword.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutHttpPassword.java
deleted file mode 100644
index deb859a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutHttpPassword.java
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.account;
-
-import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_USERNAME;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.PutHttpPassword.Input;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.account.externalids.ExternalIds;
-import com.google.gerrit.server.account.externalids.ExternalIdsUpdate;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.security.NoSuchAlgorithmException;
-import java.security.SecureRandom;
-import org.apache.commons.codec.binary.Base64;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-public class PutHttpPassword implements RestModifyView<AccountResource, Input> {
-  public static class Input {
-    public String httpPassword;
-    public boolean generate;
-  }
-
-  private static final int LEN = 31;
-  private static final SecureRandom rng;
-
-  static {
-    try {
-      rng = SecureRandom.getInstance("SHA1PRNG");
-    } catch (NoSuchAlgorithmException e) {
-      throw new RuntimeException("Cannot create RNG for password generator", e);
-    }
-  }
-
-  private final Provider<CurrentUser> self;
-  private final PermissionBackend permissionBackend;
-  private final ExternalIds externalIds;
-  private final ExternalIdsUpdate.User externalIdsUpdate;
-
-  @Inject
-  PutHttpPassword(
-      Provider<CurrentUser> self,
-      PermissionBackend permissionBackend,
-      ExternalIds externalIds,
-      ExternalIdsUpdate.User externalIdsUpdate) {
-    this.self = self;
-    this.permissionBackend = permissionBackend;
-    this.externalIds = externalIds;
-    this.externalIdsUpdate = externalIdsUpdate;
-  }
-
-  @Override
-  public Response<String> apply(AccountResource rsrc, Input input)
-      throws AuthException, ResourceNotFoundException, ResourceConflictException, OrmException,
-          IOException, ConfigInvalidException, PermissionBackendException {
-    if (!self.get().hasSameAccountId(rsrc.getUser())) {
-      permissionBackend.user(self).check(GlobalPermission.ADMINISTRATE_SERVER);
-    }
-
-    if (input == null) {
-      input = new Input();
-    }
-    input.httpPassword = Strings.emptyToNull(input.httpPassword);
-
-    String newPassword;
-    if (input.generate) {
-      newPassword = generate();
-    } else if (input.httpPassword == null) {
-      newPassword = null;
-    } else {
-      // Only administrators can explicitly set the password.
-      permissionBackend.user(self).check(GlobalPermission.ADMINISTRATE_SERVER);
-      newPassword = input.httpPassword;
-    }
-    return apply(rsrc.getUser(), newPassword);
-  }
-
-  public Response<String> apply(IdentifiedUser user, String newPassword)
-      throws ResourceNotFoundException, ResourceConflictException, OrmException, IOException,
-          ConfigInvalidException {
-    if (user.getUserName() == null) {
-      throw new ResourceConflictException("username must be set");
-    }
-
-    ExternalId extId = externalIds.get(ExternalId.Key.create(SCHEME_USERNAME, user.getUserName()));
-    if (extId == null) {
-      throw new ResourceNotFoundException();
-    }
-    ExternalId newExtId =
-        ExternalId.createWithPassword(extId.key(), extId.accountId(), extId.email(), newPassword);
-    externalIdsUpdate.create().upsert(newExtId);
-
-    return Strings.isNullOrEmpty(newPassword) ? Response.<String>none() : Response.ok(newPassword);
-  }
-
-  public static String generate() {
-    byte[] rand = new byte[LEN];
-    rng.nextBytes(rand);
-
-    byte[] enc = Base64.encodeBase64(rand, false);
-    StringBuilder r = new StringBuilder(enc.length);
-    for (int i = 0; i < enc.length; i++) {
-      if (enc[i] == '=') {
-        break;
-      }
-      r.append((char) enc[i]);
-    }
-    return r.toString();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutName.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutName.java
deleted file mode 100644
index cf66d68..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutName.java
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.account;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.extensions.client.AccountFieldName;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.DefaultInput;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.PutName.Input;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-@Singleton
-public class PutName implements RestModifyView<AccountResource, Input> {
-  public static class Input {
-    @DefaultInput public String name;
-  }
-
-  private final Provider<CurrentUser> self;
-  private final Realm realm;
-  private final PermissionBackend permissionBackend;
-  private final AccountsUpdate.Server accountsUpdate;
-
-  @Inject
-  PutName(
-      Provider<CurrentUser> self,
-      Realm realm,
-      PermissionBackend permissionBackend,
-      AccountsUpdate.Server accountsUpdate) {
-    this.self = self;
-    this.realm = realm;
-    this.permissionBackend = permissionBackend;
-    this.accountsUpdate = accountsUpdate;
-  }
-
-  @Override
-  public Response<String> apply(AccountResource rsrc, Input input)
-      throws AuthException, MethodNotAllowedException, ResourceNotFoundException, OrmException,
-          IOException, PermissionBackendException, ConfigInvalidException {
-    if (!self.get().hasSameAccountId(rsrc.getUser())) {
-      permissionBackend.user(self).check(GlobalPermission.MODIFY_ACCOUNT);
-    }
-    return apply(rsrc.getUser(), input);
-  }
-
-  public Response<String> apply(IdentifiedUser user, Input input)
-      throws MethodNotAllowedException, ResourceNotFoundException, IOException,
-          ConfigInvalidException {
-    if (input == null) {
-      input = new Input();
-    }
-
-    if (!realm.allowsEdit(AccountFieldName.FULL_NAME)) {
-      throw new MethodNotAllowedException("realm does not allow editing name");
-    }
-
-    String newName = input.name;
-    Account account =
-        accountsUpdate.create().update(user.getAccountId(), a -> a.setFullName(newName));
-    if (account == null) {
-      throw new ResourceNotFoundException("account not found");
-    }
-    return Strings.isNullOrEmpty(account.getFullName())
-        ? Response.none()
-        : Response.ok(account.getFullName());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutPreferred.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutPreferred.java
deleted file mode 100644
index f4ba6d8..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutPreferred.java
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.account;
-
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.PutPreferred.Input;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.concurrent.atomic.AtomicBoolean;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-@Singleton
-public class PutPreferred implements RestModifyView<AccountResource.Email, Input> {
-  static class Input {}
-
-  private final Provider<CurrentUser> self;
-  private final PermissionBackend permissionBackend;
-  private final AccountsUpdate.Server accountsUpdate;
-
-  @Inject
-  PutPreferred(
-      Provider<CurrentUser> self,
-      PermissionBackend permissionBackend,
-      AccountsUpdate.Server accountsUpdate) {
-    this.self = self;
-    this.permissionBackend = permissionBackend;
-    this.accountsUpdate = accountsUpdate;
-  }
-
-  @Override
-  public Response<String> apply(AccountResource.Email rsrc, Input input)
-      throws AuthException, ResourceNotFoundException, OrmException, IOException,
-          PermissionBackendException, ConfigInvalidException {
-    if (!self.get().hasSameAccountId(rsrc.getUser())) {
-      permissionBackend.user(self).check(GlobalPermission.MODIFY_ACCOUNT);
-    }
-    return apply(rsrc.getUser(), rsrc.getEmail());
-  }
-
-  public Response<String> apply(IdentifiedUser user, String email)
-      throws ResourceNotFoundException, IOException, ConfigInvalidException {
-    AtomicBoolean alreadyPreferred = new AtomicBoolean(false);
-    Account account =
-        accountsUpdate
-            .create()
-            .update(
-                user.getAccountId(),
-                a -> {
-                  if (email.equals(a.getPreferredEmail())) {
-                    alreadyPreferred.set(true);
-                  } else {
-                    a.setPreferredEmail(email);
-                  }
-                });
-    if (account == null) {
-      throw new ResourceNotFoundException("account not found");
-    }
-    return alreadyPreferred.get() ? Response.ok("") : Response.created("");
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutStatus.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutStatus.java
deleted file mode 100644
index 3f7c4f1..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutStatus.java
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.account;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.DefaultInput;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.PutStatus.Input;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-@Singleton
-public class PutStatus implements RestModifyView<AccountResource, Input> {
-  public static class Input {
-    @DefaultInput String status;
-
-    public Input(String status) {
-      this.status = status;
-    }
-
-    public Input() {}
-  }
-
-  private final Provider<CurrentUser> self;
-  private final PermissionBackend permissionBackend;
-  private final AccountsUpdate.Server accountsUpdate;
-
-  @Inject
-  PutStatus(
-      Provider<CurrentUser> self,
-      PermissionBackend permissionBackend,
-      AccountsUpdate.Server accountsUpdate) {
-    this.self = self;
-    this.permissionBackend = permissionBackend;
-    this.accountsUpdate = accountsUpdate;
-  }
-
-  @Override
-  public Response<String> apply(AccountResource rsrc, Input input)
-      throws AuthException, ResourceNotFoundException, OrmException, IOException,
-          PermissionBackendException, ConfigInvalidException {
-    if (!self.get().hasSameAccountId(rsrc.getUser())) {
-      permissionBackend.user(self).check(GlobalPermission.MODIFY_ACCOUNT);
-    }
-    return apply(rsrc.getUser(), input);
-  }
-
-  public Response<String> apply(IdentifiedUser user, Input input)
-      throws ResourceNotFoundException, IOException, ConfigInvalidException {
-    if (input == null) {
-      input = new Input();
-    }
-
-    String newStatus = input.status;
-    Account account =
-        accountsUpdate
-            .create()
-            .update(user.getAccountId(), a -> a.setStatus(Strings.nullToEmpty(newStatus)));
-    if (account == null) {
-      throw new ResourceNotFoundException("account not found");
-    }
-    return Strings.isNullOrEmpty(account.getStatus())
-        ? Response.none()
-        : Response.ok(account.getStatus());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutUsername.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutUsername.java
deleted file mode 100644
index 785aa66..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutUsername.java
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.account;
-
-import com.google.gerrit.common.errors.NameAlreadyUsedException;
-import com.google.gerrit.extensions.client.AccountFieldName;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.DefaultInput;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.account.PutUsername.Input;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-@Singleton
-public class PutUsername implements RestModifyView<AccountResource, Input> {
-  public static class Input {
-    @DefaultInput public String username;
-  }
-
-  private final Provider<CurrentUser> self;
-  private final ChangeUserName.Factory changeUserNameFactory;
-  private final PermissionBackend permissionBackend;
-  private final Realm realm;
-
-  @Inject
-  PutUsername(
-      Provider<CurrentUser> self,
-      ChangeUserName.Factory changeUserNameFactory,
-      PermissionBackend permissionBackend,
-      Realm realm) {
-    this.self = self;
-    this.changeUserNameFactory = changeUserNameFactory;
-    this.permissionBackend = permissionBackend;
-    this.realm = realm;
-  }
-
-  @Override
-  public String apply(AccountResource rsrc, Input input)
-      throws AuthException, MethodNotAllowedException, UnprocessableEntityException,
-          ResourceConflictException, OrmException, IOException, ConfigInvalidException,
-          PermissionBackendException {
-    if (!self.get().hasSameAccountId(rsrc.getUser())) {
-      permissionBackend.user(self).check(GlobalPermission.ADMINISTRATE_SERVER);
-    }
-
-    if (!realm.allowsEdit(AccountFieldName.USER_NAME)) {
-      throw new MethodNotAllowedException("realm does not allow editing username");
-    }
-
-    if (input == null) {
-      input = new Input();
-    }
-
-    try {
-      changeUserNameFactory.create(rsrc.getUser(), input.username).call();
-    } catch (IllegalStateException e) {
-      if (ChangeUserName.USERNAME_CANNOT_BE_CHANGED.equals(e.getMessage())) {
-        throw new MethodNotAllowedException(e.getMessage());
-      }
-      throw e;
-    } catch (InvalidUserNameException e) {
-      throw new UnprocessableEntityException("invalid username");
-    } catch (NameAlreadyUsedException e) {
-      throw new ResourceConflictException("username already used");
-    }
-
-    return input.username;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/QueryAccounts.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/QueryAccounts.java
deleted file mode 100644
index c23e16f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/QueryAccounts.java
+++ /dev/null
@@ -1,208 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.account;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.extensions.client.ListAccountsOption;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.AccountVisibility;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.index.query.QueryParseException;
-import com.google.gerrit.index.query.QueryResult;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.account.AccountDirectory.FillOptions;
-import com.google.gerrit.server.api.accounts.AccountInfoComparator;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.query.account.AccountPredicates;
-import com.google.gerrit.server.query.account.AccountQueryBuilder;
-import com.google.gerrit.server.query.account.AccountQueryProcessor;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.eclipse.jgit.lib.Config;
-import org.kohsuke.args4j.Option;
-
-public class QueryAccounts implements RestReadView<TopLevelResource> {
-  private static final int MAX_SUGGEST_RESULTS = 100;
-
-  private final AccountLoader.Factory accountLoaderFactory;
-  private final AccountQueryBuilder queryBuilder;
-  private final AccountQueryProcessor queryProcessor;
-  private final boolean suggestConfig;
-  private final int suggestFrom;
-
-  private AccountLoader accountLoader;
-  private boolean suggest;
-  private int suggestLimit = 10;
-  private String query;
-  private Integer start;
-  private EnumSet<ListAccountsOption> options;
-
-  @Option(name = "--suggest", metaVar = "SUGGEST", usage = "suggest users")
-  public void setSuggest(boolean suggest) {
-    this.suggest = suggest;
-  }
-
-  @Option(
-      name = "--limit",
-      aliases = {"-n"},
-      metaVar = "CNT",
-      usage = "maximum number of users to return")
-  public void setLimit(int n) {
-    queryProcessor.setUserProvidedLimit(n);
-
-    if (n < 0) {
-      suggestLimit = 10;
-    } else if (n == 0) {
-      suggestLimit = MAX_SUGGEST_RESULTS;
-    } else {
-      suggestLimit = Math.min(n, MAX_SUGGEST_RESULTS);
-    }
-  }
-
-  @Option(name = "-o", usage = "Output options per account")
-  public void addOption(ListAccountsOption o) {
-    options.add(o);
-  }
-
-  @Option(name = "-O", usage = "Output option flags, in hex")
-  void setOptionFlagsHex(String hex) {
-    options.addAll(ListAccountsOption.fromBits(Integer.parseInt(hex, 16)));
-  }
-
-  @Option(
-      name = "--query",
-      aliases = {"-q"},
-      metaVar = "QUERY",
-      usage = "match users")
-  public void setQuery(String query) {
-    this.query = query;
-  }
-
-  @Option(
-      name = "--start",
-      aliases = {"-S"},
-      metaVar = "CNT",
-      usage = "Number of accounts to skip")
-  public void setStart(int start) {
-    this.start = start;
-  }
-
-  @Inject
-  QueryAccounts(
-      AccountLoader.Factory accountLoaderFactory,
-      AccountQueryBuilder queryBuilder,
-      AccountQueryProcessor queryProcessor,
-      @GerritServerConfig Config cfg) {
-    this.accountLoaderFactory = accountLoaderFactory;
-    this.queryBuilder = queryBuilder;
-    this.queryProcessor = queryProcessor;
-    this.suggestFrom = cfg.getInt("suggest", null, "from", 0);
-    this.options = EnumSet.noneOf(ListAccountsOption.class);
-
-    if ("off".equalsIgnoreCase(cfg.getString("suggest", null, "accounts"))) {
-      suggestConfig = false;
-    } else {
-      boolean suggest;
-      try {
-        AccountVisibility av = cfg.getEnum("suggest", null, "accounts", AccountVisibility.ALL);
-        suggest = (av != AccountVisibility.NONE);
-      } catch (IllegalArgumentException err) {
-        suggest = cfg.getBoolean("suggest", null, "accounts", true);
-      }
-      this.suggestConfig = suggest;
-    }
-  }
-
-  @Override
-  public List<AccountInfo> apply(TopLevelResource rsrc)
-      throws OrmException, BadRequestException, MethodNotAllowedException {
-    if (Strings.isNullOrEmpty(query)) {
-      throw new BadRequestException("missing query field");
-    }
-
-    if (suggest && (!suggestConfig || query.length() < suggestFrom)) {
-      return Collections.emptyList();
-    }
-
-    Set<FillOptions> fillOptions = EnumSet.of(FillOptions.ID);
-    if (options.contains(ListAccountsOption.DETAILS)) {
-      fillOptions.addAll(AccountLoader.DETAILED_OPTIONS);
-    }
-    if (options.contains(ListAccountsOption.ALL_EMAILS)) {
-      fillOptions.add(FillOptions.EMAIL);
-      fillOptions.add(FillOptions.SECONDARY_EMAILS);
-    }
-    if (suggest) {
-      fillOptions.addAll(AccountLoader.DETAILED_OPTIONS);
-      fillOptions.add(FillOptions.EMAIL);
-      fillOptions.add(FillOptions.SECONDARY_EMAILS);
-    }
-    accountLoader = accountLoaderFactory.create(fillOptions);
-
-    if (queryProcessor.isDisabled()) {
-      throw new MethodNotAllowedException("query disabled");
-    }
-
-    if (start != null) {
-      queryProcessor.setStart(start);
-    }
-
-    Map<Account.Id, AccountInfo> matches = new LinkedHashMap<>();
-    try {
-      Predicate<AccountState> queryPred;
-      if (suggest) {
-        queryPred = queryBuilder.defaultQuery(query);
-        queryProcessor.setUserProvidedLimit(suggestLimit);
-      } else {
-        queryPred = queryBuilder.parse(query);
-      }
-      if (!AccountPredicates.hasActive(queryPred)) {
-        // if neither 'is:active' nor 'is:inactive' appears in the query only
-        // active accounts should be queried
-        queryPred = AccountPredicates.andActive(queryPred);
-      }
-      QueryResult<AccountState> result = queryProcessor.query(queryPred);
-      for (AccountState accountState : result.entities()) {
-        Account.Id id = accountState.getAccount().getId();
-        matches.put(id, accountLoader.get(id));
-      }
-
-      accountLoader.fill();
-
-      List<AccountInfo> sorted =
-          AccountInfoComparator.ORDER_NULLS_LAST.sortedCopy(matches.values());
-      if (!sorted.isEmpty() && result.more()) {
-        sorted.get(sorted.size() - 1)._moreAccounts = true;
-      }
-      return sorted;
-    } catch (QueryParseException e) {
-      if (suggest) {
-        return ImmutableList.of();
-      }
-      throw new BadRequestException(e.getMessage());
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/Realm.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/Realm.java
deleted file mode 100644
index 6174d94..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/Realm.java
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.account;
-
-import com.google.gerrit.extensions.client.AccountFieldName;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Set;
-import javax.naming.NamingException;
-import javax.security.auth.login.LoginException;
-
-public interface Realm {
-  /** Can the end-user modify this field of their own account? */
-  boolean allowsEdit(AccountFieldName field);
-
-  /** Returns the account fields that the end-user can modify. */
-  Set<AccountFieldName> getEditableFields();
-
-  AuthRequest authenticate(AuthRequest who) throws AccountException;
-
-  void onCreateAccount(AuthRequest who, Account account);
-
-  /** @return true if the user has the given email address. */
-  boolean hasEmailAddress(IdentifiedUser who, String email);
-
-  /** @return all known email addresses for the identified user. */
-  Set<String> getEmailAddresses(IdentifiedUser who);
-
-  /**
-   * Locate an account whose local username is the given account name.
-   *
-   * <p>Generally this only works for local realms, such as one backed by an LDAP directory, or
-   * where there is an {@link EmailExpander} configured that knows how to convert the accountName
-   * into an email address, and then locate the user by that email address.
-   */
-  Account.Id lookup(String accountName) throws IOException;
-
-  /**
-   * @return true if the account is active.
-   * @throws NamingException
-   * @throws LoginException
-   * @throws AccountException
-   */
-  default boolean isActive(@SuppressWarnings("unused") String username)
-      throws LoginException, NamingException, AccountException {
-    return true;
-  }
-
-  /** @return true if the account is backed by the realm, false otherwise. */
-  default boolean accountBelongsToRealm(
-      @SuppressWarnings("unused") Collection<ExternalId> externalIds) {
-    return false;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/SetDiffPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/SetDiffPreferences.java
deleted file mode 100644
index 67f276d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/SetDiffPreferences.java
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.account;
-
-import static com.google.gerrit.server.account.GetDiffPreferences.readDefaultsFromGit;
-import static com.google.gerrit.server.account.GetDiffPreferences.readFromGit;
-import static com.google.gerrit.server.config.ConfigUtil.loadSection;
-import static com.google.gerrit.server.config.ConfigUtil.storeSection;
-
-import com.google.gerrit.extensions.client.DiffPreferencesInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.UserConfigSections;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-
-@Singleton
-public class SetDiffPreferences implements RestModifyView<AccountResource, DiffPreferencesInfo> {
-  private final Provider<CurrentUser> self;
-  private final Provider<MetaDataUpdate.User> metaDataUpdateFactory;
-  private final AllUsersName allUsersName;
-  private final PermissionBackend permissionBackend;
-  private final GitRepositoryManager gitMgr;
-
-  @Inject
-  SetDiffPreferences(
-      Provider<CurrentUser> self,
-      Provider<MetaDataUpdate.User> metaDataUpdateFactory,
-      AllUsersName allUsersName,
-      PermissionBackend permissionBackend,
-      GitRepositoryManager gitMgr) {
-    this.self = self;
-    this.metaDataUpdateFactory = metaDataUpdateFactory;
-    this.allUsersName = allUsersName;
-    this.permissionBackend = permissionBackend;
-    this.gitMgr = gitMgr;
-  }
-
-  @Override
-  public DiffPreferencesInfo apply(AccountResource rsrc, DiffPreferencesInfo in)
-      throws AuthException, BadRequestException, ConfigInvalidException,
-          RepositoryNotFoundException, IOException, PermissionBackendException {
-    if (!self.get().hasSameAccountId(rsrc.getUser())) {
-      permissionBackend.user(self).check(GlobalPermission.MODIFY_ACCOUNT);
-    }
-
-    if (in == null) {
-      throw new BadRequestException("input must be provided");
-    }
-
-    Account.Id id = rsrc.getUser().getAccountId();
-    return writeToGit(readFromGit(id, gitMgr, allUsersName, in), id);
-  }
-
-  private DiffPreferencesInfo writeToGit(DiffPreferencesInfo in, Account.Id userId)
-      throws RepositoryNotFoundException, IOException, ConfigInvalidException {
-    DiffPreferencesInfo out = new DiffPreferencesInfo();
-    try (MetaDataUpdate md = metaDataUpdateFactory.get().create(allUsersName)) {
-      DiffPreferencesInfo allUserPrefs = readDefaultsFromGit(md.getRepository(), null);
-      VersionedAccountPreferences prefs = VersionedAccountPreferences.forUser(userId);
-      prefs.load(md);
-      storeSection(prefs.getConfig(), UserConfigSections.DIFF, null, in, allUserPrefs);
-      prefs.commit(md);
-      loadSection(prefs.getConfig(), UserConfigSections.DIFF, null, out, allUserPrefs, null);
-    }
-    return out;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/SetEditPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/SetEditPreferences.java
deleted file mode 100644
index 0142d15..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/SetEditPreferences.java
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.account;
-
-import static com.google.gerrit.server.account.GetEditPreferences.readFromGit;
-import static com.google.gerrit.server.config.ConfigUtil.loadSection;
-import static com.google.gerrit.server.config.ConfigUtil.storeSection;
-
-import com.google.gerrit.extensions.client.EditPreferencesInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.UserConfigSections;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-
-@Singleton
-public class SetEditPreferences implements RestModifyView<AccountResource, EditPreferencesInfo> {
-
-  private final Provider<CurrentUser> self;
-  private final Provider<MetaDataUpdate.User> metaDataUpdateFactory;
-  private final PermissionBackend permissionBackend;
-  private final GitRepositoryManager gitMgr;
-  private final AllUsersName allUsersName;
-
-  @Inject
-  SetEditPreferences(
-      Provider<CurrentUser> self,
-      Provider<MetaDataUpdate.User> metaDataUpdateFactory,
-      PermissionBackend permissionBackend,
-      GitRepositoryManager gitMgr,
-      AllUsersName allUsersName) {
-    this.self = self;
-    this.metaDataUpdateFactory = metaDataUpdateFactory;
-    this.permissionBackend = permissionBackend;
-    this.gitMgr = gitMgr;
-    this.allUsersName = allUsersName;
-  }
-
-  @Override
-  public EditPreferencesInfo apply(AccountResource rsrc, EditPreferencesInfo in)
-      throws AuthException, BadRequestException, RepositoryNotFoundException, IOException,
-          ConfigInvalidException, PermissionBackendException {
-    if (!self.get().hasSameAccountId(rsrc.getUser())) {
-      permissionBackend.user(self).check(GlobalPermission.MODIFY_ACCOUNT);
-    }
-
-    if (in == null) {
-      throw new BadRequestException("input must be provided");
-    }
-
-    Account.Id accountId = rsrc.getUser().getAccountId();
-
-    VersionedAccountPreferences prefs;
-    EditPreferencesInfo out = new EditPreferencesInfo();
-    try (MetaDataUpdate md = metaDataUpdateFactory.get().create(allUsersName)) {
-      prefs = VersionedAccountPreferences.forUser(accountId);
-      prefs.load(md);
-      storeSection(
-          prefs.getConfig(),
-          UserConfigSections.EDIT,
-          null,
-          readFromGit(accountId, gitMgr, allUsersName, in),
-          EditPreferencesInfo.defaults());
-      prefs.commit(md);
-      out =
-          loadSection(
-              prefs.getConfig(),
-              UserConfigSections.EDIT,
-              null,
-              out,
-              EditPreferencesInfo.defaults(),
-              null);
-    }
-
-    return out;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/SetInactiveFlag.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/SetInactiveFlag.java
deleted file mode 100644
index 6e12c3e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/SetInactiveFlag.java
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.account;
-
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.concurrent.atomic.AtomicBoolean;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-@Singleton
-public class SetInactiveFlag {
-
-  private final AccountsUpdate.Server accountsUpdate;
-
-  @Inject
-  SetInactiveFlag(AccountsUpdate.Server accountsUpdate) {
-    this.accountsUpdate = accountsUpdate;
-  }
-
-  public Response<?> deactivate(Account.Id accountId)
-      throws RestApiException, IOException, ConfigInvalidException {
-    AtomicBoolean alreadyInactive = new AtomicBoolean(false);
-    Account account =
-        accountsUpdate
-            .create()
-            .update(
-                accountId,
-                a -> {
-                  if (!a.isActive()) {
-                    alreadyInactive.set(true);
-                  } else {
-                    a.setActive(false);
-                  }
-                });
-    if (account == null) {
-      throw new ResourceNotFoundException("account not found");
-    }
-    if (alreadyInactive.get()) {
-      throw new ResourceConflictException("account not active");
-    }
-    return Response.none();
-  }
-
-  public Response<String> activate(Account.Id accountId)
-      throws ResourceNotFoundException, IOException, ConfigInvalidException {
-    AtomicBoolean alreadyActive = new AtomicBoolean(false);
-    Account account =
-        accountsUpdate
-            .create()
-            .update(
-                accountId,
-                a -> {
-                  if (a.isActive()) {
-                    alreadyActive.set(true);
-                  } else {
-                    a.setActive(true);
-                  }
-                });
-    if (account == null) {
-      throw new ResourceNotFoundException("account not found");
-    }
-    return alreadyActive.get() ? Response.ok("") : Response.created("");
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/SetPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/SetPreferences.java
deleted file mode 100644
index 9657928..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/SetPreferences.java
+++ /dev/null
@@ -1,201 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.account;
-
-import static com.google.gerrit.server.config.ConfigUtil.storeSection;
-import static com.google.gerrit.server.git.UserConfigSections.CHANGE_TABLE_COLUMN;
-import static com.google.gerrit.server.git.UserConfigSections.KEY_ID;
-import static com.google.gerrit.server.git.UserConfigSections.KEY_MATCH;
-import static com.google.gerrit.server.git.UserConfigSections.KEY_TARGET;
-import static com.google.gerrit.server.git.UserConfigSections.KEY_TOKEN;
-import static com.google.gerrit.server.git.UserConfigSections.KEY_URL;
-import static com.google.gerrit.server.git.UserConfigSections.URL_ALIAS;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
-import com.google.gerrit.extensions.client.MenuItem;
-import com.google.gerrit.extensions.config.DownloadScheme;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.UserConfigSections;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.Config;
-
-@Singleton
-public class SetPreferences implements RestModifyView<AccountResource, GeneralPreferencesInfo> {
-  private final Provider<CurrentUser> self;
-  private final AccountCache cache;
-  private final PermissionBackend permissionBackend;
-  private final GeneralPreferencesLoader loader;
-  private final Provider<MetaDataUpdate.User> metaDataUpdateFactory;
-  private final AllUsersName allUsersName;
-  private final DynamicMap<DownloadScheme> downloadSchemes;
-
-  @Inject
-  SetPreferences(
-      Provider<CurrentUser> self,
-      AccountCache cache,
-      PermissionBackend permissionBackend,
-      GeneralPreferencesLoader loader,
-      Provider<MetaDataUpdate.User> metaDataUpdateFactory,
-      AllUsersName allUsersName,
-      DynamicMap<DownloadScheme> downloadSchemes) {
-    this.self = self;
-    this.loader = loader;
-    this.cache = cache;
-    this.permissionBackend = permissionBackend;
-    this.metaDataUpdateFactory = metaDataUpdateFactory;
-    this.allUsersName = allUsersName;
-    this.downloadSchemes = downloadSchemes;
-  }
-
-  @Override
-  public GeneralPreferencesInfo apply(AccountResource rsrc, GeneralPreferencesInfo i)
-      throws AuthException, BadRequestException, IOException, ConfigInvalidException,
-          PermissionBackendException {
-    if (!self.get().hasSameAccountId(rsrc.getUser())) {
-      permissionBackend.user(self).check(GlobalPermission.MODIFY_ACCOUNT);
-    }
-
-    checkDownloadScheme(i.downloadScheme);
-    Account.Id id = rsrc.getUser().getAccountId();
-    GeneralPreferencesInfo n = loader.merge(id, i);
-
-    n.changeTable = i.changeTable;
-    n.my = i.my;
-    n.urlAliases = i.urlAliases;
-
-    writeToGit(id, n);
-
-    return cache.get(id).getAccount().getGeneralPreferencesInfo();
-  }
-
-  private void writeToGit(Account.Id id, GeneralPreferencesInfo i)
-      throws RepositoryNotFoundException, IOException, ConfigInvalidException, BadRequestException {
-    VersionedAccountPreferences prefs;
-    try (MetaDataUpdate md = metaDataUpdateFactory.get().create(allUsersName)) {
-      prefs = VersionedAccountPreferences.forUser(id);
-      prefs.load(md);
-
-      storeSection(
-          prefs.getConfig(),
-          UserConfigSections.GENERAL,
-          null,
-          i,
-          loader.readDefaultsFromGit(md.getRepository(), null));
-
-      storeMyChangeTableColumns(prefs, i.changeTable);
-      storeMyMenus(prefs, i.my);
-      storeUrlAliases(prefs, i.urlAliases);
-      prefs.commit(md);
-      cache.evict(id);
-    }
-  }
-
-  public static void storeMyMenus(VersionedAccountPreferences prefs, List<MenuItem> my)
-      throws BadRequestException {
-    Config cfg = prefs.getConfig();
-    if (my != null) {
-      unsetSection(cfg, UserConfigSections.MY);
-      for (MenuItem item : my) {
-        checkRequiredMenuItemField(item.name, "name");
-        checkRequiredMenuItemField(item.url, "URL");
-
-        set(cfg, item.name, KEY_URL, item.url);
-        set(cfg, item.name, KEY_TARGET, item.target);
-        set(cfg, item.name, KEY_ID, item.id);
-      }
-    }
-  }
-
-  public static void storeMyChangeTableColumns(
-      VersionedAccountPreferences prefs, List<String> changeTable) {
-    Config cfg = prefs.getConfig();
-    if (changeTable != null) {
-      unsetSection(cfg, UserConfigSections.CHANGE_TABLE);
-      cfg.setStringList(UserConfigSections.CHANGE_TABLE, null, CHANGE_TABLE_COLUMN, changeTable);
-    }
-  }
-
-  private static void set(Config cfg, String section, String key, @Nullable String val) {
-    if (val == null || val.trim().isEmpty()) {
-      cfg.unset(UserConfigSections.MY, section.trim(), key);
-    } else {
-      cfg.setString(UserConfigSections.MY, section.trim(), key, val.trim());
-    }
-  }
-
-  private static void unsetSection(Config cfg, String section) {
-    cfg.unsetSection(section, null);
-    for (String subsection : cfg.getSubsections(section)) {
-      cfg.unsetSection(section, subsection);
-    }
-  }
-
-  public static void storeUrlAliases(
-      VersionedAccountPreferences prefs, Map<String, String> urlAliases) {
-    if (urlAliases != null) {
-      Config cfg = prefs.getConfig();
-      for (String subsection : cfg.getSubsections(URL_ALIAS)) {
-        cfg.unsetSection(URL_ALIAS, subsection);
-      }
-
-      int i = 1;
-      for (Entry<String, String> e : urlAliases.entrySet()) {
-        cfg.setString(URL_ALIAS, URL_ALIAS + i, KEY_MATCH, e.getKey());
-        cfg.setString(URL_ALIAS, URL_ALIAS + i, KEY_TOKEN, e.getValue());
-        i++;
-      }
-    }
-  }
-
-  private static void checkRequiredMenuItemField(String value, String name)
-      throws BadRequestException {
-    if (value == null || value.trim().isEmpty()) {
-      throw new BadRequestException(name + " for menu item is required");
-    }
-  }
-
-  private void checkDownloadScheme(String downloadScheme) throws BadRequestException {
-    if (Strings.isNullOrEmpty(downloadScheme)) {
-      return;
-    }
-
-    for (DynamicMap.Entry<DownloadScheme> e : downloadSchemes) {
-      if (e.getExportName().equals(downloadScheme) && e.getProvider().get().isEnabled()) {
-        return;
-      }
-    }
-    throw new BadRequestException("Unsupported download scheme: " + downloadScheme);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/SshKeys.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/SshKeys.java
deleted file mode 100644
index 2c8f273..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/SshKeys.java
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.account;
-
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ChildCollection;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.reviewdb.client.AccountSshKey;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-@Singleton
-public class SshKeys implements ChildCollection<AccountResource, AccountResource.SshKey> {
-  private final DynamicMap<RestView<AccountResource.SshKey>> views;
-  private final GetSshKeys list;
-  private final Provider<CurrentUser> self;
-  private final PermissionBackend permissionBackend;
-  private final VersionedAuthorizedKeys.Accessor authorizedKeys;
-
-  @Inject
-  SshKeys(
-      DynamicMap<RestView<AccountResource.SshKey>> views,
-      GetSshKeys list,
-      Provider<CurrentUser> self,
-      PermissionBackend permissionBackend,
-      VersionedAuthorizedKeys.Accessor authorizedKeys) {
-    this.views = views;
-    this.list = list;
-    this.self = self;
-    this.permissionBackend = permissionBackend;
-    this.authorizedKeys = authorizedKeys;
-  }
-
-  @Override
-  public RestView<AccountResource> list() {
-    return list;
-  }
-
-  @Override
-  public AccountResource.SshKey parse(AccountResource rsrc, IdString id)
-      throws ResourceNotFoundException, OrmException, IOException, ConfigInvalidException,
-          PermissionBackendException {
-    if (!self.get().hasSameAccountId(rsrc.getUser())) {
-      try {
-        permissionBackend.user(self).check(GlobalPermission.MODIFY_ACCOUNT);
-      } catch (AuthException e) {
-        // If lacking MODIFY_ACCOUNT claim the resource does not exist.
-        throw new ResourceNotFoundException();
-      }
-    }
-    return parse(rsrc.getUser(), id);
-  }
-
-  public AccountResource.SshKey parse(IdentifiedUser user, IdString id)
-      throws ResourceNotFoundException, IOException, ConfigInvalidException {
-    try {
-      int seq = Integer.parseInt(id.get(), 10);
-      AccountSshKey sshKey = authorizedKeys.getKey(user.getAccountId(), seq);
-      if (sshKey == null) {
-        throw new ResourceNotFoundException(id);
-      }
-      return new AccountResource.SshKey(user, sshKey);
-    } catch (NumberFormatException e) {
-      throw new ResourceNotFoundException(id);
-    }
-  }
-
-  @Override
-  public DynamicMap<RestView<AccountResource.SshKey>> views() {
-    return views;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/StarredChanges.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/StarredChanges.java
deleted file mode 100644
index 3976d47..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/StarredChanges.java
+++ /dev/null
@@ -1,205 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.account;
-
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AcceptsCreate;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ChildCollection;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.StarredChangesUtil;
-import com.google.gerrit.server.StarredChangesUtil.IllegalLabelException;
-import com.google.gerrit.server.StarredChangesUtil.MutuallyExclusiveLabelsException;
-import com.google.gerrit.server.change.ChangeResource;
-import com.google.gerrit.server.change.ChangesCollection;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.query.change.QueryChanges;
-import com.google.gwtorm.server.OrmDuplicateKeyException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class StarredChanges
-    implements ChildCollection<AccountResource, AccountResource.StarredChange>,
-        AcceptsCreate<AccountResource> {
-  private static final Logger log = LoggerFactory.getLogger(StarredChanges.class);
-
-  private final ChangesCollection changes;
-  private final DynamicMap<RestView<AccountResource.StarredChange>> views;
-  private final Provider<Create> createProvider;
-  private final StarredChangesUtil starredChangesUtil;
-
-  @Inject
-  StarredChanges(
-      ChangesCollection changes,
-      DynamicMap<RestView<AccountResource.StarredChange>> views,
-      Provider<Create> createProvider,
-      StarredChangesUtil starredChangesUtil) {
-    this.changes = changes;
-    this.views = views;
-    this.createProvider = createProvider;
-    this.starredChangesUtil = starredChangesUtil;
-  }
-
-  @Override
-  public AccountResource.StarredChange parse(AccountResource parent, IdString id)
-      throws ResourceNotFoundException, OrmException, PermissionBackendException {
-    IdentifiedUser user = parent.getUser();
-    ChangeResource change = changes.parse(TopLevelResource.INSTANCE, id);
-    if (starredChangesUtil
-        .getLabels(user.getAccountId(), change.getId())
-        .contains(StarredChangesUtil.DEFAULT_LABEL)) {
-      return new AccountResource.StarredChange(user, change);
-    }
-    throw new ResourceNotFoundException(id);
-  }
-
-  @Override
-  public DynamicMap<RestView<AccountResource.StarredChange>> views() {
-    return views;
-  }
-
-  @Override
-  public RestView<AccountResource> list() throws ResourceNotFoundException {
-    return new RestReadView<AccountResource>() {
-      @Override
-      public Object apply(AccountResource self)
-          throws BadRequestException, AuthException, OrmException {
-        QueryChanges query = changes.list();
-        query.addQuery("starredby:" + self.getUser().getAccountId().get());
-        return query.apply(TopLevelResource.INSTANCE);
-      }
-    };
-  }
-
-  @Override
-  public RestModifyView<AccountResource, EmptyInput> create(AccountResource parent, IdString id)
-      throws UnprocessableEntityException {
-    try {
-      return createProvider.get().setChange(changes.parse(TopLevelResource.INSTANCE, id));
-    } catch (ResourceNotFoundException e) {
-      throw new UnprocessableEntityException(String.format("change %s not found", id.get()));
-    } catch (OrmException | PermissionBackendException e) {
-      log.error("cannot resolve change", e);
-      throw new UnprocessableEntityException("internal server error");
-    }
-  }
-
-  @Singleton
-  public static class Create implements RestModifyView<AccountResource, EmptyInput> {
-    private final Provider<CurrentUser> self;
-    private final StarredChangesUtil starredChangesUtil;
-    private ChangeResource change;
-
-    @Inject
-    Create(Provider<CurrentUser> self, StarredChangesUtil starredChangesUtil) {
-      this.self = self;
-      this.starredChangesUtil = starredChangesUtil;
-    }
-
-    public Create setChange(ChangeResource change) {
-      this.change = change;
-      return this;
-    }
-
-    @Override
-    public Response<?> apply(AccountResource rsrc, EmptyInput in)
-        throws RestApiException, OrmException, IOException {
-      if (!self.get().hasSameAccountId(rsrc.getUser())) {
-        throw new AuthException("not allowed to add starred change");
-      }
-      try {
-        starredChangesUtil.star(
-            self.get().getAccountId(),
-            change.getProject(),
-            change.getId(),
-            StarredChangesUtil.DEFAULT_LABELS,
-            null);
-      } catch (MutuallyExclusiveLabelsException e) {
-        throw new ResourceConflictException(e.getMessage());
-      } catch (IllegalLabelException e) {
-        throw new BadRequestException(e.getMessage());
-      } catch (OrmDuplicateKeyException e) {
-        return Response.none();
-      }
-      return Response.none();
-    }
-  }
-
-  @Singleton
-  static class Put implements RestModifyView<AccountResource.StarredChange, EmptyInput> {
-    private final Provider<CurrentUser> self;
-
-    @Inject
-    Put(Provider<CurrentUser> self) {
-      this.self = self;
-    }
-
-    @Override
-    public Response<?> apply(AccountResource.StarredChange rsrc, EmptyInput in)
-        throws AuthException {
-      if (!self.get().hasSameAccountId(rsrc.getUser())) {
-        throw new AuthException("not allowed update starred changes");
-      }
-      return Response.none();
-    }
-  }
-
-  @Singleton
-  public static class Delete implements RestModifyView<AccountResource.StarredChange, EmptyInput> {
-    private final Provider<CurrentUser> self;
-    private final StarredChangesUtil starredChangesUtil;
-
-    @Inject
-    Delete(Provider<CurrentUser> self, StarredChangesUtil starredChangesUtil) {
-      this.self = self;
-      this.starredChangesUtil = starredChangesUtil;
-    }
-
-    @Override
-    public Response<?> apply(AccountResource.StarredChange rsrc, EmptyInput in)
-        throws AuthException, OrmException, IOException, IllegalLabelException {
-      if (!self.get().hasSameAccountId(rsrc.getUser())) {
-        throw new AuthException("not allowed remove starred change");
-      }
-      starredChangesUtil.star(
-          self.get().getAccountId(),
-          rsrc.getChange().getProject(),
-          rsrc.getChange().getId(),
-          null,
-          StarredChangesUtil.DEFAULT_LABELS);
-      return Response.none();
-    }
-  }
-
-  public static class EmptyInput {}
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/Stars.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/Stars.java
deleted file mode 100644
index 2aedfe1..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/Stars.java
+++ /dev/null
@@ -1,159 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.account;
-
-import com.google.gerrit.extensions.api.changes.StarsInput;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ChildCollection;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.StarredChangesUtil;
-import com.google.gerrit.server.StarredChangesUtil.IllegalLabelException;
-import com.google.gerrit.server.account.AccountResource.Star;
-import com.google.gerrit.server.change.ChangeResource;
-import com.google.gerrit.server.change.ChangesCollection;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.query.change.QueryChanges;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-import java.util.SortedSet;
-
-@Singleton
-public class Stars implements ChildCollection<AccountResource, AccountResource.Star> {
-
-  private final ChangesCollection changes;
-  private final ListStarredChanges listStarredChanges;
-  private final StarredChangesUtil starredChangesUtil;
-  private final DynamicMap<RestView<AccountResource.Star>> views;
-
-  @Inject
-  Stars(
-      ChangesCollection changes,
-      ListStarredChanges listStarredChanges,
-      StarredChangesUtil starredChangesUtil,
-      DynamicMap<RestView<AccountResource.Star>> views) {
-    this.changes = changes;
-    this.listStarredChanges = listStarredChanges;
-    this.starredChangesUtil = starredChangesUtil;
-    this.views = views;
-  }
-
-  @Override
-  public Star parse(AccountResource parent, IdString id)
-      throws ResourceNotFoundException, OrmException, PermissionBackendException {
-    IdentifiedUser user = parent.getUser();
-    ChangeResource change = changes.parse(TopLevelResource.INSTANCE, id);
-    Set<String> labels = starredChangesUtil.getLabels(user.getAccountId(), change.getId());
-    return new AccountResource.Star(user, change, labels);
-  }
-
-  @Override
-  public DynamicMap<RestView<Star>> views() {
-    return views;
-  }
-
-  @Override
-  public ListStarredChanges list() {
-    return listStarredChanges;
-  }
-
-  @Singleton
-  public static class ListStarredChanges implements RestReadView<AccountResource> {
-    private final Provider<CurrentUser> self;
-    private final ChangesCollection changes;
-
-    @Inject
-    ListStarredChanges(Provider<CurrentUser> self, ChangesCollection changes) {
-      this.self = self;
-      this.changes = changes;
-    }
-
-    @Override
-    @SuppressWarnings("unchecked")
-    public List<ChangeInfo> apply(AccountResource rsrc)
-        throws BadRequestException, AuthException, OrmException {
-      if (!self.get().hasSameAccountId(rsrc.getUser())) {
-        throw new AuthException("not allowed to list stars of another account");
-      }
-      QueryChanges query = changes.list();
-      query.addQuery("has:stars");
-      return (List<ChangeInfo>) query.apply(TopLevelResource.INSTANCE);
-    }
-  }
-
-  @Singleton
-  public static class Get implements RestReadView<AccountResource.Star> {
-    private final Provider<CurrentUser> self;
-    private final StarredChangesUtil starredChangesUtil;
-
-    @Inject
-    Get(Provider<CurrentUser> self, StarredChangesUtil starredChangesUtil) {
-      this.self = self;
-      this.starredChangesUtil = starredChangesUtil;
-    }
-
-    @Override
-    public SortedSet<String> apply(AccountResource.Star rsrc) throws AuthException, OrmException {
-      if (!self.get().hasSameAccountId(rsrc.getUser())) {
-        throw new AuthException("not allowed to get stars of another account");
-      }
-      return starredChangesUtil.getLabels(self.get().getAccountId(), rsrc.getChange().getId());
-    }
-  }
-
-  @Singleton
-  public static class Post implements RestModifyView<AccountResource.Star, StarsInput> {
-    private final Provider<CurrentUser> self;
-    private final StarredChangesUtil starredChangesUtil;
-
-    @Inject
-    Post(Provider<CurrentUser> self, StarredChangesUtil starredChangesUtil) {
-      this.self = self;
-      this.starredChangesUtil = starredChangesUtil;
-    }
-
-    @Override
-    public Collection<String> apply(AccountResource.Star rsrc, StarsInput in)
-        throws AuthException, BadRequestException, OrmException {
-      if (!self.get().hasSameAccountId(rsrc.getUser())) {
-        throw new AuthException("not allowed to update stars of another account");
-      }
-      try {
-        return starredChangesUtil.star(
-            self.get().getAccountId(),
-            rsrc.getChange().getProject(),
-            rsrc.getChange().getId(),
-            in.add,
-            in.remove);
-      } catch (IllegalLabelException e) {
-        throw new BadRequestException(e.getMessage());
-      }
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/UniversalGroupBackend.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/UniversalGroupBackend.java
deleted file mode 100644
index 0a58858..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/UniversalGroupBackend.java
+++ /dev/null
@@ -1,246 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.account;
-
-import static com.google.gerrit.server.account.GroupBackends.GROUP_REF_NAME_COMPARATOR;
-import static java.util.stream.Collectors.joining;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.MultimapBuilder;
-import com.google.common.collect.Sets;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.StartupCheck;
-import com.google.gerrit.server.StartupException;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Universal implementation of the GroupBackend that works with the injected set of GroupBackends.
- */
-@Singleton
-public class UniversalGroupBackend implements GroupBackend {
-  private static final Logger log = LoggerFactory.getLogger(UniversalGroupBackend.class);
-
-  private final DynamicSet<GroupBackend> backends;
-
-  @Inject
-  UniversalGroupBackend(DynamicSet<GroupBackend> backends) {
-    this.backends = backends;
-  }
-
-  @Nullable
-  private GroupBackend backend(AccountGroup.UUID uuid) {
-    if (uuid != null) {
-      for (GroupBackend g : backends) {
-        if (g.handles(uuid)) {
-          return g;
-        }
-      }
-    }
-    return null;
-  }
-
-  @Override
-  public boolean handles(AccountGroup.UUID uuid) {
-    return backend(uuid) != null;
-  }
-
-  @Override
-  public GroupDescription.Basic get(AccountGroup.UUID uuid) {
-    if (uuid == null) {
-      return null;
-    }
-    GroupBackend b = backend(uuid);
-    if (b == null) {
-      log.debug("Unknown GroupBackend for UUID: " + uuid);
-      return null;
-    }
-    return b.get(uuid);
-  }
-
-  @Override
-  public Collection<GroupReference> suggest(String name, ProjectState project) {
-    Set<GroupReference> groups = Sets.newTreeSet(GROUP_REF_NAME_COMPARATOR);
-    for (GroupBackend g : backends) {
-      groups.addAll(g.suggest(name, project));
-    }
-    return groups;
-  }
-
-  @Override
-  public GroupMembership membershipsOf(IdentifiedUser user) {
-    return new UniversalGroupMembership(user);
-  }
-
-  private class UniversalGroupMembership implements GroupMembership {
-    private final Map<GroupBackend, GroupMembership> memberships;
-
-    private UniversalGroupMembership(IdentifiedUser user) {
-      ImmutableMap.Builder<GroupBackend, GroupMembership> builder = ImmutableMap.builder();
-      for (GroupBackend g : backends) {
-        builder.put(g, g.membershipsOf(user));
-      }
-      this.memberships = builder.build();
-    }
-
-    @Nullable
-    private GroupMembership membership(AccountGroup.UUID uuid) {
-      if (uuid != null) {
-        for (Map.Entry<GroupBackend, GroupMembership> m : memberships.entrySet()) {
-          if (m.getKey().handles(uuid)) {
-            return m.getValue();
-          }
-        }
-      }
-      return null;
-    }
-
-    @Override
-    public boolean contains(AccountGroup.UUID uuid) {
-      if (uuid == null) {
-        return false;
-      }
-      GroupMembership m = membership(uuid);
-      if (m == null) {
-        log.debug("Unknown GroupMembership for UUID: " + uuid);
-        return false;
-      }
-      return m.contains(uuid);
-    }
-
-    @Override
-    public boolean containsAnyOf(Iterable<AccountGroup.UUID> uuids) {
-      ListMultimap<GroupMembership, AccountGroup.UUID> lookups =
-          MultimapBuilder.hashKeys().arrayListValues().build();
-      for (AccountGroup.UUID uuid : uuids) {
-        if (uuid == null) {
-          continue;
-        }
-        GroupMembership m = membership(uuid);
-        if (m == null) {
-          log.debug("Unknown GroupMembership for UUID: " + uuid);
-          continue;
-        }
-        lookups.put(m, uuid);
-      }
-      for (Map.Entry<GroupMembership, Collection<AccountGroup.UUID>> entry :
-          lookups.asMap().entrySet()) {
-        GroupMembership m = entry.getKey();
-        Collection<AccountGroup.UUID> ids = entry.getValue();
-        if (ids.size() == 1) {
-          if (m.contains(Iterables.getOnlyElement(ids))) {
-            return true;
-          }
-        } else if (m.containsAnyOf(ids)) {
-          return true;
-        }
-      }
-      return false;
-    }
-
-    @Override
-    public Set<AccountGroup.UUID> intersection(Iterable<AccountGroup.UUID> uuids) {
-      ListMultimap<GroupMembership, AccountGroup.UUID> lookups =
-          MultimapBuilder.hashKeys().arrayListValues().build();
-      for (AccountGroup.UUID uuid : uuids) {
-        if (uuid == null) {
-          continue;
-        }
-        GroupMembership m = membership(uuid);
-        if (m == null) {
-          log.debug("Unknown GroupMembership for UUID: " + uuid);
-          continue;
-        }
-        lookups.put(m, uuid);
-      }
-      Set<AccountGroup.UUID> groups = new HashSet<>();
-      for (Map.Entry<GroupMembership, Collection<AccountGroup.UUID>> entry :
-          lookups.asMap().entrySet()) {
-        groups.addAll(entry.getKey().intersection(entry.getValue()));
-      }
-      return groups;
-    }
-
-    @Override
-    public Set<AccountGroup.UUID> getKnownGroups() {
-      Set<AccountGroup.UUID> groups = new HashSet<>();
-      for (GroupMembership m : memberships.values()) {
-        groups.addAll(m.getKnownGroups());
-      }
-      return groups;
-    }
-  }
-
-  @Override
-  public boolean isVisibleToAll(AccountGroup.UUID uuid) {
-    for (GroupBackend g : backends) {
-      if (g.handles(uuid)) {
-        return g.isVisibleToAll(uuid);
-      }
-    }
-    return false;
-  }
-
-  public static class ConfigCheck implements StartupCheck {
-    private final Config cfg;
-    private final UniversalGroupBackend universalGroupBackend;
-
-    @Inject
-    ConfigCheck(@GerritServerConfig Config cfg, UniversalGroupBackend groupBackend) {
-      this.cfg = cfg;
-      this.universalGroupBackend = groupBackend;
-    }
-
-    @Override
-    public void check() throws StartupException {
-      String invalid =
-          cfg.getSubsections("groups").stream()
-              .filter(
-                  sub -> {
-                    AccountGroup.UUID uuid = new AccountGroup.UUID(sub);
-                    GroupBackend groupBackend = universalGroupBackend.backend(uuid);
-                    return groupBackend == null || groupBackend.get(uuid) == null;
-                  })
-              .map(u -> "'" + u + "'")
-              .collect(joining(","));
-
-      if (!invalid.isEmpty()) {
-        throw new StartupException(
-            String.format(
-                "Subsections for 'groups' in gerrit.config must be valid group"
-                    + " UUIDs. The following group UUIDs could not be resolved: "
-                    + invalid
-                    + " Please remove/fix these 'groups' subsections in"
-                    + " gerrit.config."));
-      }
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAccountDestinations.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAccountDestinations.java
deleted file mode 100644
index 7808edd..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAccountDestinations.java
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.account;
-
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.git.DestinationList;
-import com.google.gerrit.server.git.VersionedMetaData;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.FileMode;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** User configured named destinations. */
-public class VersionedAccountDestinations extends VersionedMetaData {
-  private static final Logger log = LoggerFactory.getLogger(VersionedAccountDestinations.class);
-
-  public static VersionedAccountDestinations forUser(Account.Id id) {
-    return new VersionedAccountDestinations(RefNames.refsUsers(id));
-  }
-
-  private final String ref;
-  private final DestinationList destinations = new DestinationList();
-
-  private VersionedAccountDestinations(String ref) {
-    this.ref = ref;
-  }
-
-  @Override
-  protected String getRefName() {
-    return ref;
-  }
-
-  public DestinationList getDestinationList() {
-    return destinations;
-  }
-
-  @Override
-  protected void onLoad() throws IOException, ConfigInvalidException {
-    if (revision == null) {
-      return;
-    }
-    String prefix = DestinationList.DIR_NAME + "/";
-    for (PathInfo p : getPathInfos(true)) {
-      if (p.fileMode == FileMode.REGULAR_FILE) {
-        String path = p.path;
-        if (path.startsWith(prefix)) {
-          String label = path.substring(prefix.length());
-          destinations.parseLabel(
-              label,
-              readUTF8(path),
-              error -> log.error("Error parsing file {}: {}", path, error.getMessage()));
-        }
-      }
-    }
-  }
-
-  @Override
-  protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException {
-    throw new UnsupportedOperationException("Cannot yet save destinations");
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAccountPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAccountPreferences.java
deleted file mode 100644
index 612da6e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAccountPreferences.java
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.account;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.git.VersionedMetaData;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.Config;
-
-/** Preferences for user accounts. */
-public class VersionedAccountPreferences extends VersionedMetaData {
-  public static final String PREFERENCES = "preferences.config";
-
-  public static VersionedAccountPreferences forUser(Account.Id id) {
-    return new VersionedAccountPreferences(RefNames.refsUsers(id));
-  }
-
-  public static VersionedAccountPreferences forDefault() {
-    return new VersionedAccountPreferences(RefNames.REFS_USERS_DEFAULT);
-  }
-
-  private final String ref;
-  private Config cfg;
-
-  protected VersionedAccountPreferences(String ref) {
-    this.ref = ref;
-  }
-
-  public boolean isDefaults() {
-    return RefNames.REFS_USERS_DEFAULT.equals(getRefName());
-  }
-
-  @Override
-  protected String getRefName() {
-    return ref;
-  }
-
-  public Config getConfig() {
-    return cfg;
-  }
-
-  @Override
-  protected void onLoad() throws IOException, ConfigInvalidException {
-    cfg = readConfig(PREFERENCES);
-  }
-
-  @Override
-  protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException {
-    if (Strings.isNullOrEmpty(commit.getMessage())) {
-      commit.setMessage("Updated preferences\n");
-    }
-    saveConfig(PREFERENCES, cfg);
-    return true;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAccountQueries.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAccountQueries.java
deleted file mode 100644
index af0463a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAccountQueries.java
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.account;
-
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.git.QueryList;
-import com.google.gerrit.server.git.VersionedMetaData;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Named Queries for user accounts. */
-public class VersionedAccountQueries extends VersionedMetaData {
-  private static final Logger log = LoggerFactory.getLogger(VersionedAccountQueries.class);
-
-  public static VersionedAccountQueries forUser(Account.Id id) {
-    return new VersionedAccountQueries(RefNames.refsUsers(id));
-  }
-
-  private final String ref;
-  private QueryList queryList;
-
-  private VersionedAccountQueries(String ref) {
-    this.ref = ref;
-  }
-
-  @Override
-  protected String getRefName() {
-    return ref;
-  }
-
-  public QueryList getQueryList() {
-    return queryList;
-  }
-
-  @Override
-  protected void onLoad() throws IOException, ConfigInvalidException {
-    queryList =
-        QueryList.parse(
-            readUTF8(QueryList.FILE_NAME),
-            error ->
-                log.error("Error parsing file {}: {}", QueryList.FILE_NAME, error.getMessage()));
-  }
-
-  @Override
-  protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException {
-    throw new UnsupportedOperationException("Cannot yet save named queries");
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAuthorizedKeys.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAuthorizedKeys.java
deleted file mode 100644
index 8cffe92..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAuthorizedKeys.java
+++ /dev/null
@@ -1,279 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.account;
-
-import static com.google.common.base.Preconditions.checkState;
-import static java.util.Comparator.comparing;
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.Ordering;
-import com.google.gerrit.common.errors.InvalidSshKeyException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountSshKey;
-import com.google.gerrit.reviewdb.client.AccountSshKey.Id;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.VersionedMetaData;
-import com.google.gerrit.server.ssh.SshKeyCreator;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Optional;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.Repository;
-
-/**
- * 'authorized_keys' file in the refs/users/CD/ABCD branches of the All-Users repository.
- *
- * <p>The `authorized_keys' files stores the public SSH keys of the user. The file format matches
- * the standard SSH file format, which means that each key is stored on a separate line (see
- * https://en.wikibooks.org/wiki/OpenSSH/Client_Configuration_Files#.7E.2F.ssh.2Fauthorized_keys).
- *
- * <p>The order of the keys in the file determines the sequence numbers of the keys. The first line
- * corresponds to sequence number 1.
- *
- * <p>Invalid keys are marked with the prefix <code># INVALID</code>.
- *
- * <p>To keep the sequence numbers intact when a key is deleted, a <code># DELETED</code> line is
- * inserted at the position where the key was deleted.
- *
- * <p>Other comment lines are ignored on read, and are not written back when the file is modified.
- */
-public class VersionedAuthorizedKeys extends VersionedMetaData {
-  @Singleton
-  public static class Accessor {
-    private final GitRepositoryManager repoManager;
-    private final AllUsersName allUsersName;
-    private final VersionedAuthorizedKeys.Factory authorizedKeysFactory;
-    private final Provider<MetaDataUpdate.User> metaDataUpdateFactory;
-    private final IdentifiedUser.GenericFactory userFactory;
-
-    @Inject
-    Accessor(
-        GitRepositoryManager repoManager,
-        AllUsersName allUsersName,
-        VersionedAuthorizedKeys.Factory authorizedKeysFactory,
-        Provider<MetaDataUpdate.User> metaDataUpdateFactory,
-        IdentifiedUser.GenericFactory userFactory) {
-      this.repoManager = repoManager;
-      this.allUsersName = allUsersName;
-      this.authorizedKeysFactory = authorizedKeysFactory;
-      this.metaDataUpdateFactory = metaDataUpdateFactory;
-      this.userFactory = userFactory;
-    }
-
-    public List<AccountSshKey> getKeys(Account.Id accountId)
-        throws IOException, ConfigInvalidException {
-      return read(accountId).getKeys();
-    }
-
-    public AccountSshKey getKey(Account.Id accountId, int seq)
-        throws IOException, ConfigInvalidException {
-      return read(accountId).getKey(seq);
-    }
-
-    public synchronized AccountSshKey addKey(Account.Id accountId, String pub)
-        throws IOException, ConfigInvalidException, InvalidSshKeyException {
-      VersionedAuthorizedKeys authorizedKeys = read(accountId);
-      AccountSshKey key = authorizedKeys.addKey(pub);
-      commit(authorizedKeys);
-      return key;
-    }
-
-    public synchronized void deleteKey(Account.Id accountId, int seq)
-        throws IOException, ConfigInvalidException {
-      VersionedAuthorizedKeys authorizedKeys = read(accountId);
-      if (authorizedKeys.deleteKey(seq)) {
-        commit(authorizedKeys);
-      }
-    }
-
-    public synchronized void markKeyInvalid(Account.Id accountId, int seq)
-        throws IOException, ConfigInvalidException {
-      VersionedAuthorizedKeys authorizedKeys = read(accountId);
-      if (authorizedKeys.markKeyInvalid(seq)) {
-        commit(authorizedKeys);
-      }
-    }
-
-    private VersionedAuthorizedKeys read(Account.Id accountId)
-        throws IOException, ConfigInvalidException {
-      try (Repository git = repoManager.openRepository(allUsersName)) {
-        VersionedAuthorizedKeys authorizedKeys = authorizedKeysFactory.create(accountId);
-        authorizedKeys.load(git);
-        return authorizedKeys;
-      }
-    }
-
-    private void commit(VersionedAuthorizedKeys authorizedKeys) throws IOException {
-      try (MetaDataUpdate md =
-          metaDataUpdateFactory
-              .get()
-              .create(allUsersName, userFactory.create(authorizedKeys.accountId))) {
-        authorizedKeys.commit(md);
-      }
-    }
-  }
-
-  public static class SimpleSshKeyCreator implements SshKeyCreator {
-    @Override
-    public AccountSshKey create(Id id, String encoded) {
-      return new AccountSshKey(id, encoded);
-    }
-  }
-
-  public interface Factory {
-    VersionedAuthorizedKeys create(Account.Id accountId);
-  }
-
-  private final SshKeyCreator sshKeyCreator;
-  private final Account.Id accountId;
-  private final String ref;
-  private List<Optional<AccountSshKey>> keys;
-
-  @Inject
-  public VersionedAuthorizedKeys(SshKeyCreator sshKeyCreator, @Assisted Account.Id accountId) {
-    this.sshKeyCreator = sshKeyCreator;
-    this.accountId = accountId;
-    this.ref = RefNames.refsUsers(accountId);
-  }
-
-  @Override
-  protected String getRefName() {
-    return ref;
-  }
-
-  @Override
-  protected void onLoad() throws IOException {
-    keys = AuthorizedKeys.parse(accountId, readUTF8(AuthorizedKeys.FILE_NAME));
-  }
-
-  @Override
-  protected boolean onSave(CommitBuilder commit) throws IOException {
-    if (Strings.isNullOrEmpty(commit.getMessage())) {
-      commit.setMessage("Updated SSH keys\n");
-    }
-
-    saveUTF8(AuthorizedKeys.FILE_NAME, AuthorizedKeys.serialize(keys));
-    return true;
-  }
-
-  /** Returns all SSH keys. */
-  private List<AccountSshKey> getKeys() {
-    checkLoaded();
-    return keys.stream().filter(Optional::isPresent).map(Optional::get).collect(toList());
-  }
-
-  /**
-   * Returns the SSH key with the given sequence number.
-   *
-   * @param seq sequence number
-   * @return the SSH key, <code>null</code> if there is no SSH key with this sequence number, or if
-   *     the SSH key with this sequence number has been deleted
-   */
-  private AccountSshKey getKey(int seq) {
-    checkLoaded();
-    return keys.get(seq - 1).orElse(null);
-  }
-
-  /**
-   * Adds a new public SSH key.
-   *
-   * <p>If the specified public key exists already, the existing key is returned.
-   *
-   * @param pub the public SSH key to be added
-   * @return the new SSH key
-   * @throws InvalidSshKeyException
-   */
-  private AccountSshKey addKey(String pub) throws InvalidSshKeyException {
-    checkLoaded();
-
-    for (Optional<AccountSshKey> key : keys) {
-      if (key.isPresent() && key.get().getSshPublicKey().trim().equals(pub.trim())) {
-        return key.get();
-      }
-    }
-
-    int seq = keys.size() + 1;
-    AccountSshKey.Id keyId = new AccountSshKey.Id(accountId, seq);
-    AccountSshKey key = sshKeyCreator.create(keyId, pub);
-    keys.add(Optional.of(key));
-    return key;
-  }
-
-  /**
-   * Deletes the SSH key with the given sequence number.
-   *
-   * @param seq the sequence number
-   * @return <code>true</code> if a key with this sequence number was found and deleted, <code>false
-   *     </code> if no key with the given sequence number exists
-   */
-  private boolean deleteKey(int seq) {
-    checkLoaded();
-    if (seq <= keys.size() && keys.get(seq - 1).isPresent()) {
-      keys.set(seq - 1, Optional.empty());
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * Marks the SSH key with the given sequence number as invalid.
-   *
-   * @param seq the sequence number
-   * @return <code>true</code> if a key with this sequence number was found and marked as invalid,
-   *     <code>false</code> if no key with the given sequence number exists or if the key was
-   *     already marked as invalid
-   */
-  private boolean markKeyInvalid(int seq) {
-    checkLoaded();
-    AccountSshKey key = getKey(seq);
-    if (key != null && key.isValid()) {
-      key.setInvalid();
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * Sets new SSH keys.
-   *
-   * <p>The existing SSH keys are overwritten.
-   *
-   * @param newKeys the new public SSH keys
-   */
-  public void setKeys(Collection<AccountSshKey> newKeys) {
-    Ordering<AccountSshKey> o = Ordering.from(comparing(k -> k.getKey().get()));
-    keys = new ArrayList<>(Collections.nCopies(o.max(newKeys).getKey().get(), Optional.empty()));
-    for (AccountSshKey key : newKeys) {
-      keys.set(key.getKey().get() - 1, Optional.of(key));
-    }
-  }
-
-  private void checkLoaded() {
-    checkState(keys != null, "SSH keys not loaded yet");
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/WatchConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/WatchConfig.java
deleted file mode 100644
index 667ca37..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/WatchConfig.java
+++ /dev/null
@@ -1,378 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.account;
-
-import static com.google.common.base.MoreObjects.firstNonNull;
-import static com.google.common.base.Preconditions.checkState;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Enums;
-import com.google.common.base.Joiner;
-import com.google.common.base.Splitter;
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.MultimapBuilder;
-import com.google.common.collect.Sets;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.ValidationError;
-import com.google.gerrit.server.git.VersionedMetaData;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.Repository;
-
-/**
- * ‘watch.config’ file in the user branch in the All-Users repository that contains the watch
- * configuration of the user.
- *
- * <p>The 'watch.config' file is a git config file that has one 'project' section for all project
- * watches of a project.
- *
- * <p>The project name is used as subsection name and the filters with the notify types that decide
- * for which events email notifications should be sent are represented as 'notify' values in the
- * subsection. A 'notify' value is formatted as {@code <filter>
- * [<comma-separated-list-of-notify-types>]}:
- *
- * <pre>
- *   [project "foo"]
- *     notify = * [ALL_COMMENTS]
- *     notify = branch:master [ALL_COMMENTS, NEW_PATCHSETS]
- *     notify = branch:master owner:self [SUBMITTED_CHANGES]
- * </pre>
- *
- * <p>If two notify values in the same subsection have the same filter they are merged on the next
- * save, taking the union of the notify types.
- *
- * <p>For watch configurations that notify on no event the list of notify types is empty:
- *
- * <pre>
- *   [project "foo"]
- *     notify = branch:master []
- * </pre>
- *
- * <p>Unknown notify types are ignored and removed on save.
- */
-public class WatchConfig extends VersionedMetaData implements ValidationError.Sink {
-  @Singleton
-  public static class Accessor {
-    private final GitRepositoryManager repoManager;
-    private final AllUsersName allUsersName;
-    private final Provider<MetaDataUpdate.User> metaDataUpdateFactory;
-    private final IdentifiedUser.GenericFactory userFactory;
-
-    @Inject
-    Accessor(
-        GitRepositoryManager repoManager,
-        AllUsersName allUsersName,
-        Provider<MetaDataUpdate.User> metaDataUpdateFactory,
-        IdentifiedUser.GenericFactory userFactory) {
-      this.repoManager = repoManager;
-      this.allUsersName = allUsersName;
-      this.metaDataUpdateFactory = metaDataUpdateFactory;
-      this.userFactory = userFactory;
-    }
-
-    public Map<ProjectWatchKey, Set<NotifyType>> getProjectWatches(Account.Id accountId)
-        throws IOException, ConfigInvalidException {
-      try (Repository git = repoManager.openRepository(allUsersName)) {
-        WatchConfig watchConfig = new WatchConfig(accountId);
-        watchConfig.load(git);
-        return watchConfig.getProjectWatches();
-      }
-    }
-
-    public synchronized void upsertProjectWatches(
-        Account.Id accountId, Map<ProjectWatchKey, Set<NotifyType>> newProjectWatches)
-        throws IOException, ConfigInvalidException {
-      WatchConfig watchConfig = read(accountId);
-      Map<ProjectWatchKey, Set<NotifyType>> projectWatches = watchConfig.getProjectWatches();
-      projectWatches.putAll(newProjectWatches);
-      commit(watchConfig);
-    }
-
-    public synchronized void deleteProjectWatches(
-        Account.Id accountId, Collection<ProjectWatchKey> projectWatchKeys)
-        throws IOException, ConfigInvalidException {
-      WatchConfig watchConfig = read(accountId);
-      Map<ProjectWatchKey, Set<NotifyType>> projectWatches = watchConfig.getProjectWatches();
-      boolean commit = false;
-      for (ProjectWatchKey key : projectWatchKeys) {
-        if (projectWatches.remove(key) != null) {
-          commit = true;
-        }
-      }
-      if (commit) {
-        commit(watchConfig);
-      }
-    }
-
-    public synchronized void deleteAllProjectWatches(Account.Id accountId)
-        throws IOException, ConfigInvalidException {
-      WatchConfig watchConfig = read(accountId);
-      boolean commit = false;
-      if (!watchConfig.getProjectWatches().isEmpty()) {
-        watchConfig.getProjectWatches().clear();
-        commit = true;
-      }
-      if (commit) {
-        commit(watchConfig);
-      }
-    }
-
-    private WatchConfig read(Account.Id accountId) throws IOException, ConfigInvalidException {
-      try (Repository git = repoManager.openRepository(allUsersName)) {
-        WatchConfig watchConfig = new WatchConfig(accountId);
-        watchConfig.load(git);
-        return watchConfig;
-      }
-    }
-
-    private void commit(WatchConfig watchConfig) throws IOException {
-      try (MetaDataUpdate md =
-          metaDataUpdateFactory
-              .get()
-              .create(allUsersName, userFactory.create(watchConfig.accountId))) {
-        watchConfig.commit(md);
-      }
-    }
-  }
-
-  @AutoValue
-  public abstract static class ProjectWatchKey {
-    public static ProjectWatchKey create(Project.NameKey project, @Nullable String filter) {
-      return new AutoValue_WatchConfig_ProjectWatchKey(project, Strings.emptyToNull(filter));
-    }
-
-    public abstract Project.NameKey project();
-
-    public abstract @Nullable String filter();
-  }
-
-  public enum NotifyType {
-    // sort by name, except 'ALL' which should stay last
-    ABANDONED_CHANGES,
-    ALL_COMMENTS,
-    NEW_CHANGES,
-    NEW_PATCHSETS,
-    SUBMITTED_CHANGES,
-
-    ALL
-  }
-
-  public static final String FILTER_ALL = "*";
-
-  public static final String WATCH_CONFIG = "watch.config";
-  public static final String PROJECT = "project";
-  public static final String KEY_NOTIFY = "notify";
-
-  private final Account.Id accountId;
-  private final String ref;
-
-  private Map<ProjectWatchKey, Set<NotifyType>> projectWatches;
-  private List<ValidationError> validationErrors;
-
-  public WatchConfig(Account.Id accountId) {
-    this.accountId = accountId;
-    this.ref = RefNames.refsUsers(accountId);
-  }
-
-  @Override
-  protected String getRefName() {
-    return ref;
-  }
-
-  @Override
-  protected void onLoad() throws IOException, ConfigInvalidException {
-    Config cfg = readConfig(WATCH_CONFIG);
-    projectWatches = parse(accountId, cfg, this);
-  }
-
-  @VisibleForTesting
-  public static Map<ProjectWatchKey, Set<NotifyType>> parse(
-      Account.Id accountId, Config cfg, ValidationError.Sink validationErrorSink) {
-    Map<ProjectWatchKey, Set<NotifyType>> projectWatches = new HashMap<>();
-    for (String projectName : cfg.getSubsections(PROJECT)) {
-      String[] notifyValues = cfg.getStringList(PROJECT, projectName, KEY_NOTIFY);
-      for (String nv : notifyValues) {
-        if (Strings.isNullOrEmpty(nv)) {
-          continue;
-        }
-
-        NotifyValue notifyValue =
-            NotifyValue.parse(accountId, projectName, nv, validationErrorSink);
-        if (notifyValue == null) {
-          continue;
-        }
-
-        ProjectWatchKey key =
-            ProjectWatchKey.create(new Project.NameKey(projectName), notifyValue.filter());
-        if (!projectWatches.containsKey(key)) {
-          projectWatches.put(key, EnumSet.noneOf(NotifyType.class));
-        }
-        projectWatches.get(key).addAll(notifyValue.notifyTypes());
-      }
-    }
-    return projectWatches;
-  }
-
-  Map<ProjectWatchKey, Set<NotifyType>> getProjectWatches() {
-    checkLoaded();
-    return projectWatches;
-  }
-
-  public void setProjectWatches(Map<ProjectWatchKey, Set<NotifyType>> projectWatches) {
-    this.projectWatches = projectWatches;
-  }
-
-  @Override
-  protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException {
-    checkLoaded();
-
-    if (Strings.isNullOrEmpty(commit.getMessage())) {
-      commit.setMessage("Updated watch configuration\n");
-    }
-
-    Config cfg = readConfig(WATCH_CONFIG);
-
-    for (String projectName : cfg.getSubsections(PROJECT)) {
-      cfg.unsetSection(PROJECT, projectName);
-    }
-
-    ListMultimap<String, String> notifyValuesByProject =
-        MultimapBuilder.hashKeys().arrayListValues().build();
-    for (Map.Entry<ProjectWatchKey, Set<NotifyType>> e : projectWatches.entrySet()) {
-      NotifyValue notifyValue = NotifyValue.create(e.getKey().filter(), e.getValue());
-      notifyValuesByProject.put(e.getKey().project().get(), notifyValue.toString());
-    }
-
-    for (Map.Entry<String, Collection<String>> e : notifyValuesByProject.asMap().entrySet()) {
-      cfg.setStringList(PROJECT, e.getKey(), KEY_NOTIFY, new ArrayList<>(e.getValue()));
-    }
-
-    saveConfig(WATCH_CONFIG, cfg);
-    return true;
-  }
-
-  private void checkLoaded() {
-    checkState(projectWatches != null, "project watches not loaded yet");
-  }
-
-  @Override
-  public void error(ValidationError error) {
-    if (validationErrors == null) {
-      validationErrors = new ArrayList<>(4);
-    }
-    validationErrors.add(error);
-  }
-
-  /**
-   * Get the validation errors, if any were discovered during load.
-   *
-   * @return list of errors; empty list if there are no errors.
-   */
-  public List<ValidationError> getValidationErrors() {
-    if (validationErrors != null) {
-      return ImmutableList.copyOf(validationErrors);
-    }
-    return ImmutableList.of();
-  }
-
-  @AutoValue
-  public abstract static class NotifyValue {
-    public static NotifyValue parse(
-        Account.Id accountId,
-        String project,
-        String notifyValue,
-        ValidationError.Sink validationErrorSink) {
-      notifyValue = notifyValue.trim();
-      int i = notifyValue.lastIndexOf('[');
-      if (i < 0 || notifyValue.charAt(notifyValue.length() - 1) != ']') {
-        validationErrorSink.error(
-            new ValidationError(
-                WATCH_CONFIG,
-                String.format(
-                    "Invalid project watch of account %d for project %s: %s",
-                    accountId.get(), project, notifyValue)));
-        return null;
-      }
-      String filter = notifyValue.substring(0, i).trim();
-      if (filter.isEmpty() || FILTER_ALL.equals(filter)) {
-        filter = null;
-      }
-
-      Set<NotifyType> notifyTypes = EnumSet.noneOf(NotifyType.class);
-      if (i + 1 < notifyValue.length() - 2) {
-        for (String nt :
-            Splitter.on(',')
-                .trimResults()
-                .splitToList(notifyValue.substring(i + 1, notifyValue.length() - 1))) {
-          NotifyType notifyType = Enums.getIfPresent(NotifyType.class, nt).orNull();
-          if (notifyType == null) {
-            validationErrorSink.error(
-                new ValidationError(
-                    WATCH_CONFIG,
-                    String.format(
-                        "Invalid notify type %s in project watch "
-                            + "of account %d for project %s: %s",
-                        nt, accountId.get(), project, notifyValue)));
-            continue;
-          }
-          notifyTypes.add(notifyType);
-        }
-      }
-      return create(filter, notifyTypes);
-    }
-
-    public static NotifyValue create(@Nullable String filter, Set<NotifyType> notifyTypes) {
-      return new AutoValue_WatchConfig_NotifyValue(
-          Strings.emptyToNull(filter), Sets.immutableEnumSet(notifyTypes));
-    }
-
-    public abstract @Nullable String filter();
-
-    public abstract ImmutableSet<NotifyType> notifyTypes();
-
-    @Override
-    public String toString() {
-      List<NotifyType> notifyTypes = new ArrayList<>(notifyTypes());
-      StringBuilder notifyValue = new StringBuilder();
-      notifyValue.append(firstNonNull(filter(), FILTER_ALL)).append(" [");
-      Joiner.on(", ").appendTo(notifyValue, notifyTypes);
-      notifyValue.append("]");
-      return notifyValue.toString();
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/externalids/DisabledExternalIdCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/externalids/DisabledExternalIdCache.java
deleted file mode 100644
index 1033641..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/externalids/DisabledExternalIdCache.java
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.account.externalids;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ImmutableSetMultimap;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.inject.AbstractModule;
-import com.google.inject.Module;
-import java.io.IOException;
-import java.util.Collection;
-import org.eclipse.jgit.lib.ObjectId;
-
-public class DisabledExternalIdCache implements ExternalIdCache {
-  public static Module module() {
-    return new AbstractModule() {
-
-      @Override
-      protected void configure() {
-        bind(ExternalIdCache.class).to(DisabledExternalIdCache.class);
-      }
-    };
-  }
-
-  @Override
-  public void onCreate(ObjectId oldNotesRev, ObjectId newNotesRev, Collection<ExternalId> extId) {}
-
-  @Override
-  public void onUpdate(ObjectId oldNotesRev, ObjectId newNotesRev, Collection<ExternalId> extId) {}
-
-  @Override
-  public void onReplace(
-      ObjectId oldNotesRev,
-      ObjectId newNotesRev,
-      Account.Id accountId,
-      Collection<ExternalId> toRemove,
-      Collection<ExternalId> toAdd) {}
-
-  @Override
-  public void onReplace(
-      ObjectId oldNotesRev,
-      ObjectId newNotesRev,
-      Collection<ExternalId> toRemove,
-      Collection<ExternalId> toAdd) {}
-
-  @Override
-  public void onRemove(ObjectId oldNotesRev, ObjectId newNotesRev, Collection<ExternalId> extId) {}
-
-  @Override
-  public ImmutableSet<ExternalId> byAccount(Account.Id accountId) {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public ImmutableSetMultimap<Account.Id, ExternalId> allByAccount() throws IOException {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public ImmutableSetMultimap<String, ExternalId> byEmails(String... emails) throws IOException {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public ImmutableSetMultimap<String, ExternalId> allByEmail() throws IOException {
-    throw new UnsupportedOperationException();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/externalids/ExternalId.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/externalids/ExternalId.java
deleted file mode 100644
index 85401c5..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/externalids/ExternalId.java
+++ /dev/null
@@ -1,413 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.account.externalids;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Strings;
-import com.google.common.collect.Iterables;
-import com.google.common.hash.Hashing;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.client.AuthType;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.account.HashedPassword;
-import java.io.Serializable;
-import java.util.Objects;
-import java.util.Set;
-import java.util.regex.Pattern;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.ObjectId;
-
-@AutoValue
-public abstract class ExternalId implements Serializable {
-  // If these regular expressions are modified the same modifications should be done to the
-  // corresponding regular expressions in the
-  // com.google.gerrit.client.account.UsernameField class.
-  private static final String USER_NAME_PATTERN_FIRST_REGEX = "[a-zA-Z0-9]";
-  private static final String USER_NAME_PATTERN_REST_REGEX = "[a-zA-Z0-9.!#$%&’*+=?^_`\\{|\\}~@-]";
-  private static final String USER_NAME_PATTERN_LAST_REGEX = "[a-zA-Z0-9]";
-
-  /** Regular expression that a username must match. */
-  private static final String USER_NAME_PATTERN_REGEX =
-      "^("
-          + //
-          USER_NAME_PATTERN_FIRST_REGEX
-          + //
-          USER_NAME_PATTERN_REST_REGEX
-          + "*"
-          + //
-          USER_NAME_PATTERN_LAST_REGEX
-          + //
-          "|"
-          + //
-          USER_NAME_PATTERN_FIRST_REGEX
-          + //
-          ")$";
-
-  private static final Pattern USER_NAME_PATTERN = Pattern.compile(USER_NAME_PATTERN_REGEX);
-
-  public static boolean isValidUsername(String username) {
-    return USER_NAME_PATTERN.matcher(username).matches();
-  }
-
-  private static final long serialVersionUID = 1L;
-
-  private static final String EXTERNAL_ID_SECTION = "externalId";
-  private static final String ACCOUNT_ID_KEY = "accountId";
-  private static final String EMAIL_KEY = "email";
-  private static final String PASSWORD_KEY = "password";
-
-  /**
-   * Scheme used for {@link AuthType#LDAP}, {@link AuthType#CLIENT_SSL_CERT_LDAP}, {@link
-   * AuthType#HTTP_LDAP}, and {@link AuthType#LDAP_BIND} usernames.
-   *
-   * <p>The name {@code gerrit:} was a very poor choice.
-   */
-  public static final String SCHEME_GERRIT = "gerrit";
-
-  /** Scheme used for randomly created identities constructed by a UUID. */
-  public static final String SCHEME_UUID = "uuid";
-
-  /** Scheme used to represent only an email address. */
-  public static final String SCHEME_MAILTO = "mailto";
-
-  /** Scheme for the username used to authenticate an account, e.g. over SSH. */
-  public static final String SCHEME_USERNAME = "username";
-
-  /** Scheme used for GPG public keys. */
-  public static final String SCHEME_GPGKEY = "gpgkey";
-
-  /** Scheme for external auth used during authentication, e.g. OAuth Token */
-  public static final String SCHEME_EXTERNAL = "external";
-
-  @AutoValue
-  public abstract static class Key implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    public static Key create(@Nullable String scheme, String id) {
-      return new AutoValue_ExternalId_Key(Strings.emptyToNull(scheme), id);
-    }
-
-    /**
-     * Parses an external ID key from a string in the format "scheme:id" or "id".
-     *
-     * @return the parsed external ID key
-     */
-    public static Key parse(String externalId) {
-      int c = externalId.indexOf(':');
-      if (c < 1 || c >= externalId.length() - 1) {
-        return create(null, externalId);
-      }
-      return create(externalId.substring(0, c), externalId.substring(c + 1));
-    }
-
-    public abstract @Nullable String scheme();
-
-    public abstract String id();
-
-    public boolean isScheme(String scheme) {
-      return scheme.equals(scheme());
-    }
-
-    /**
-     * Returns the SHA1 of the external ID that is used as note ID in the refs/meta/external-ids
-     * notes branch.
-     */
-    @SuppressWarnings("deprecation") // Use Hashing.sha1 for compatibility.
-    public ObjectId sha1() {
-      return ObjectId.fromRaw(Hashing.sha1().hashString(get(), UTF_8).asBytes());
-    }
-
-    /**
-     * Exports this external ID key as string with the format "scheme:id", or "id" if scheme is
-     * null.
-     *
-     * <p>This string representation is used as subsection name in the Git config file that stores
-     * the external ID.
-     */
-    public String get() {
-      if (scheme() != null) {
-        return scheme() + ":" + id();
-      }
-      return id();
-    }
-
-    @Override
-    public String toString() {
-      return get();
-    }
-  }
-
-  public static ExternalId create(String scheme, String id, Account.Id accountId) {
-    return create(Key.create(scheme, id), accountId, null, null);
-  }
-
-  public static ExternalId create(
-      String scheme,
-      String id,
-      Account.Id accountId,
-      @Nullable String email,
-      @Nullable String hashedPassword) {
-    return create(Key.create(scheme, id), accountId, email, hashedPassword);
-  }
-
-  public static ExternalId create(Key key, Account.Id accountId) {
-    return create(key, accountId, null, null);
-  }
-
-  public static ExternalId create(
-      Key key, Account.Id accountId, @Nullable String email, @Nullable String hashedPassword) {
-    return create(
-        key, accountId, Strings.emptyToNull(email), Strings.emptyToNull(hashedPassword), null);
-  }
-
-  public static ExternalId createWithPassword(
-      Key key, Account.Id accountId, @Nullable String email, String plainPassword) {
-    plainPassword = Strings.emptyToNull(plainPassword);
-    String hashedPassword =
-        plainPassword != null ? HashedPassword.fromPassword(plainPassword).encode() : null;
-    return create(key, accountId, email, hashedPassword);
-  }
-
-  public static ExternalId createUsername(String id, Account.Id accountId, String plainPassword) {
-    return createWithPassword(Key.create(SCHEME_USERNAME, id), accountId, null, plainPassword);
-  }
-
-  public static ExternalId createWithEmail(
-      String scheme, String id, Account.Id accountId, @Nullable String email) {
-    return createWithEmail(Key.create(scheme, id), accountId, email);
-  }
-
-  public static ExternalId createWithEmail(Key key, Account.Id accountId, @Nullable String email) {
-    return create(key, accountId, Strings.emptyToNull(email), null);
-  }
-
-  public static ExternalId createEmail(Account.Id accountId, String email) {
-    return createWithEmail(SCHEME_MAILTO, email, accountId, checkNotNull(email));
-  }
-
-  static ExternalId create(ExternalId extId, @Nullable ObjectId blobId) {
-    return new AutoValue_ExternalId(
-        extId.key(), extId.accountId(), extId.email(), extId.password(), blobId);
-  }
-
-  @VisibleForTesting
-  public static ExternalId create(
-      Key key,
-      Account.Id accountId,
-      @Nullable String email,
-      @Nullable String hashedPassword,
-      @Nullable ObjectId blobId) {
-    return new AutoValue_ExternalId(
-        key, accountId, Strings.emptyToNull(email), Strings.emptyToNull(hashedPassword), blobId);
-  }
-
-  /**
-   * Parses an external ID from a byte array that contain the external ID as an Git config file
-   * text.
-   *
-   * <p>The Git config must have exactly one externalId subsection with an accountId and optionally
-   * email and password:
-   *
-   * <pre>
-   * [externalId "username:jdoe"]
-   *   accountId = 1003407
-   *   email = jdoe@example.com
-   *   password = bcrypt:4:LCbmSBDivK/hhGVQMfkDpA==:XcWn0pKYSVU/UJgOvhidkEtmqCp6oKB7
-   * </pre>
-   */
-  public static ExternalId parse(String noteId, byte[] raw, ObjectId blobId)
-      throws ConfigInvalidException {
-    checkNotNull(blobId);
-
-    Config externalIdConfig = new Config();
-    try {
-      externalIdConfig.fromText(new String(raw, UTF_8));
-    } catch (ConfigInvalidException e) {
-      throw invalidConfig(noteId, e.getMessage());
-    }
-
-    Set<String> externalIdKeys = externalIdConfig.getSubsections(EXTERNAL_ID_SECTION);
-    if (externalIdKeys.size() != 1) {
-      throw invalidConfig(
-          noteId,
-          String.format(
-              "Expected exactly 1 '%s' section, found %d",
-              EXTERNAL_ID_SECTION, externalIdKeys.size()));
-    }
-
-    String externalIdKeyStr = Iterables.getOnlyElement(externalIdKeys);
-    Key externalIdKey = Key.parse(externalIdKeyStr);
-    if (externalIdKey == null) {
-      throw invalidConfig(noteId, String.format("External ID %s is invalid", externalIdKeyStr));
-    }
-
-    if (!externalIdKey.sha1().getName().equals(noteId)) {
-      throw invalidConfig(
-          noteId,
-          String.format(
-              "SHA1 of external ID '%s' does not match note ID '%s'", externalIdKeyStr, noteId));
-    }
-
-    String email = externalIdConfig.getString(EXTERNAL_ID_SECTION, externalIdKeyStr, EMAIL_KEY);
-    String password =
-        externalIdConfig.getString(EXTERNAL_ID_SECTION, externalIdKeyStr, PASSWORD_KEY);
-    int accountId = readAccountId(noteId, externalIdConfig, externalIdKeyStr);
-
-    return create(
-        externalIdKey,
-        new Account.Id(accountId),
-        Strings.emptyToNull(email),
-        Strings.emptyToNull(password),
-        blobId);
-  }
-
-  private static int readAccountId(String noteId, Config externalIdConfig, String externalIdKeyStr)
-      throws ConfigInvalidException {
-    String accountIdStr =
-        externalIdConfig.getString(EXTERNAL_ID_SECTION, externalIdKeyStr, ACCOUNT_ID_KEY);
-    if (accountIdStr == null) {
-      throw invalidConfig(
-          noteId,
-          String.format(
-              "Value for '%s.%s.%s' is missing, expected account ID",
-              EXTERNAL_ID_SECTION, externalIdKeyStr, ACCOUNT_ID_KEY));
-    }
-
-    try {
-      int accountId =
-          externalIdConfig.getInt(EXTERNAL_ID_SECTION, externalIdKeyStr, ACCOUNT_ID_KEY, -1);
-      if (accountId < 0) {
-        throw invalidConfig(
-            noteId,
-            String.format(
-                "Value %s for '%s.%s.%s' is invalid, expected account ID",
-                accountIdStr, EXTERNAL_ID_SECTION, externalIdKeyStr, ACCOUNT_ID_KEY));
-      }
-      return accountId;
-    } catch (IllegalArgumentException e) {
-      throw invalidConfig(
-          noteId,
-          String.format(
-              "Value %s for '%s.%s.%s' is invalid, expected account ID",
-              accountIdStr, EXTERNAL_ID_SECTION, externalIdKeyStr, ACCOUNT_ID_KEY));
-    }
-  }
-
-  private static ConfigInvalidException invalidConfig(String noteId, String message) {
-    return new ConfigInvalidException(
-        String.format("Invalid external ID config for note '%s': %s", noteId, message));
-  }
-
-  public abstract Key key();
-
-  public abstract Account.Id accountId();
-
-  public abstract @Nullable String email();
-
-  public abstract @Nullable String password();
-
-  /**
-   * ID of the note blob in the external IDs branch that stores this external ID. {@code null} if
-   * the external ID was created in code and is not yet stored in Git.
-   */
-  public abstract @Nullable ObjectId blobId();
-
-  public void checkThatBlobIdIsSet() {
-    checkState(blobId() != null, "No blob ID set for external ID %s", key().get());
-  }
-
-  public boolean isScheme(String scheme) {
-    return key().isScheme(scheme);
-  }
-
-  public byte[] toByteArray() {
-    checkState(blobId() != null, "Missing blobId in external ID %s", key().get());
-    byte[] b = new byte[2 * Constants.OBJECT_ID_STRING_LENGTH + 1];
-    key().sha1().copyTo(b, 0);
-    b[Constants.OBJECT_ID_STRING_LENGTH] = ':';
-    blobId().copyTo(b, Constants.OBJECT_ID_STRING_LENGTH + 1);
-    return b;
-  }
-
-  /**
-   * For checking if two external IDs are equals the blobId is excluded and external IDs that have
-   * different blob IDs but identical other fields are considered equal. This way an external ID
-   * that was loaded from Git can be equal with an external ID that was created from code.
-   */
-  @Override
-  public boolean equals(Object obj) {
-    if (!(obj instanceof ExternalId)) {
-      return false;
-    }
-    ExternalId o = (ExternalId) obj;
-    return Objects.equals(key(), o.key())
-        && Objects.equals(accountId(), o.accountId())
-        && Objects.equals(email(), o.email())
-        && Objects.equals(password(), o.password());
-  }
-
-  @Override
-  public int hashCode() {
-    return Objects.hash(key(), accountId(), email(), password());
-  }
-
-  /**
-   * Exports this external ID as Git config file text.
-   *
-   * <p>The Git config has exactly one externalId subsection with an accountId and optionally email
-   * and password:
-   *
-   * <pre>
-   * [externalId "username:jdoe"]
-   *   accountId = 1003407
-   *   email = jdoe@example.com
-   *   password = bcrypt:4:LCbmSBDivK/hhGVQMfkDpA==:XcWn0pKYSVU/UJgOvhidkEtmqCp6oKB7
-   * </pre>
-   */
-  @Override
-  public String toString() {
-    Config c = new Config();
-    writeToConfig(c);
-    return c.toText();
-  }
-
-  public void writeToConfig(Config c) {
-    String externalIdKey = key().get();
-    // Do not use c.setInt(...) to write the account ID because c.setInt(...) persists integers
-    // that can be expressed in KiB as a unit strings, e.g. "1024000" is stored as "100k". Using
-    // c.setString(...) ensures that account IDs are human readable.
-    c.setString(
-        EXTERNAL_ID_SECTION, externalIdKey, ACCOUNT_ID_KEY, Integer.toString(accountId().get()));
-
-    if (email() != null) {
-      c.setString(EXTERNAL_ID_SECTION, externalIdKey, EMAIL_KEY, email());
-    } else {
-      c.unset(EXTERNAL_ID_SECTION, externalIdKey, EMAIL_KEY);
-    }
-
-    if (password() != null) {
-      c.setString(EXTERNAL_ID_SECTION, externalIdKey, PASSWORD_KEY, password());
-    } else {
-      c.unset(EXTERNAL_ID_SECTION, externalIdKey, PASSWORD_KEY);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/externalids/ExternalIdCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/externalids/ExternalIdCache.java
deleted file mode 100644
index d928e15..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/externalids/ExternalIdCache.java
+++ /dev/null
@@ -1,82 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.account.externalids;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ImmutableSetMultimap;
-import com.google.gerrit.reviewdb.client.Account;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Collections;
-import org.eclipse.jgit.lib.ObjectId;
-
-/**
- * Caches external IDs of all accounts.
- *
- * <p>On each cache access the SHA1 of the refs/meta/external-ids branch is read to verify that the
- * cache is up to date.
- */
-interface ExternalIdCache {
-  void onCreate(ObjectId oldNotesRev, ObjectId newNotesRev, Collection<ExternalId> extId)
-      throws IOException;
-
-  void onUpdate(ObjectId oldNotesRev, ObjectId newNotesRev, Collection<ExternalId> extId)
-      throws IOException;
-
-  void onReplace(
-      ObjectId oldNotesRev,
-      ObjectId newNotesRev,
-      Account.Id accountId,
-      Collection<ExternalId> toRemove,
-      Collection<ExternalId> toAdd)
-      throws IOException;
-
-  void onReplace(
-      ObjectId oldNotesRev,
-      ObjectId newNotesRev,
-      Collection<ExternalId> toRemove,
-      Collection<ExternalId> toAdd)
-      throws IOException;
-
-  void onRemove(ObjectId oldNotesRev, ObjectId newNotesRev, Collection<ExternalId> extId)
-      throws IOException;
-
-  ImmutableSet<ExternalId> byAccount(Account.Id accountId) throws IOException;
-
-  ImmutableSetMultimap<Account.Id, ExternalId> allByAccount() throws IOException;
-
-  ImmutableSetMultimap<String, ExternalId> byEmails(String... emails) throws IOException;
-
-  ImmutableSetMultimap<String, ExternalId> allByEmail() throws IOException;
-
-  default ImmutableSet<ExternalId> byEmail(String email) throws IOException {
-    return byEmails(email).get(email);
-  }
-
-  default void onCreate(ObjectId oldNotesRev, ObjectId newNotesRev, ExternalId extId)
-      throws IOException {
-    onCreate(oldNotesRev, newNotesRev, Collections.singleton(extId));
-  }
-
-  default void onRemove(ObjectId oldNotesRev, ObjectId newNotesRev, ExternalId extId)
-      throws IOException {
-    onRemove(oldNotesRev, newNotesRev, Collections.singleton(extId));
-  }
-
-  default void onUpdate(ObjectId oldNotesRev, ObjectId newNotesRev, ExternalId updatedExtId)
-      throws IOException {
-    onUpdate(oldNotesRev, newNotesRev, Collections.singleton(updatedExtId));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/externalids/ExternalIdCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/externalids/ExternalIdCacheImpl.java
deleted file mode 100644
index 4b4d060..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/externalids/ExternalIdCacheImpl.java
+++ /dev/null
@@ -1,262 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.account.externalids;
-
-import static com.google.common.collect.ImmutableSetMultimap.toImmutableSetMultimap;
-import static java.util.stream.Collectors.toSet;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.base.Strings;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import com.google.common.collect.Collections2;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ImmutableSetMultimap;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.Multimap;
-import com.google.common.collect.MultimapBuilder;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-import java.util.function.Consumer;
-import org.eclipse.jgit.lib.ObjectId;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Caches external IDs of all accounts. The external IDs are always loaded from NoteDb. */
-@Singleton
-class ExternalIdCacheImpl implements ExternalIdCache {
-  private static final Logger log = LoggerFactory.getLogger(ExternalIdCacheImpl.class);
-
-  private final LoadingCache<ObjectId, AllExternalIds> extIdsByAccount;
-  private final ExternalIdReader externalIdReader;
-  private final Lock lock;
-
-  @Inject
-  ExternalIdCacheImpl(ExternalIdReader externalIdReader) {
-    this.extIdsByAccount =
-        CacheBuilder.newBuilder()
-            // The cached data is potentially pretty large and we are always only interested
-            // in the latest value, hence the maximum cache size is set to 1.
-            // This can lead to extra cache loads in case of the following race:
-            // 1. thread 1 reads the notes ref at revision A
-            // 2. thread 2 updates the notes ref to revision B and stores the derived value
-            //    for B in the cache
-            // 3. thread 1 attempts to read the data for revision A from the cache, and misses
-            // 4. later threads attempt to read at B
-            // In this race unneeded reloads are done in step 3 (reload from revision A) and
-            // step 4 (reload from revision B, because the value for revision B was lost when the
-            // reload from revision A was done, since the cache can hold only one entry).
-            // These reloads could be avoided by increasing the cache size to 2. However the race
-            // window between reading the ref and looking it up in the cache is small so that
-            // it's rare that this race happens. Therefore it's not worth to double the memory
-            // usage of this cache, just to avoid this.
-            .maximumSize(1)
-            .build(new Loader(externalIdReader));
-    this.externalIdReader = externalIdReader;
-    this.lock = new ReentrantLock(true /* fair */);
-  }
-
-  @Override
-  public void onCreate(ObjectId oldNotesRev, ObjectId newNotesRev, Collection<ExternalId> extIds)
-      throws IOException {
-    updateCache(
-        oldNotesRev,
-        newNotesRev,
-        m -> {
-          for (ExternalId extId : extIds) {
-            extId.checkThatBlobIdIsSet();
-            m.put(extId.accountId(), extId);
-          }
-        });
-  }
-
-  @Override
-  public void onRemove(ObjectId oldNotesRev, ObjectId newNotesRev, Collection<ExternalId> extIds)
-      throws IOException {
-    updateCache(
-        oldNotesRev,
-        newNotesRev,
-        m -> {
-          for (ExternalId extId : extIds) {
-            m.remove(extId.accountId(), extId);
-          }
-        });
-  }
-
-  @Override
-  public void onUpdate(
-      ObjectId oldNotesRev, ObjectId newNotesRev, Collection<ExternalId> updatedExtIds)
-      throws IOException {
-    updateCache(
-        oldNotesRev,
-        newNotesRev,
-        m -> {
-          removeKeys(m.values(), updatedExtIds.stream().map(e -> e.key()).collect(toSet()));
-          for (ExternalId updatedExtId : updatedExtIds) {
-            updatedExtId.checkThatBlobIdIsSet();
-            m.put(updatedExtId.accountId(), updatedExtId);
-          }
-        });
-  }
-
-  @Override
-  public void onReplace(
-      ObjectId oldNotesRev,
-      ObjectId newNotesRev,
-      Account.Id accountId,
-      Collection<ExternalId> toRemove,
-      Collection<ExternalId> toAdd)
-      throws IOException {
-    ExternalIdsUpdate.checkSameAccount(Iterables.concat(toRemove, toAdd), accountId);
-
-    updateCache(
-        oldNotesRev,
-        newNotesRev,
-        m -> {
-          for (ExternalId extId : toRemove) {
-            m.remove(extId.accountId(), extId);
-          }
-          for (ExternalId extId : toAdd) {
-            extId.checkThatBlobIdIsSet();
-            m.put(extId.accountId(), extId);
-          }
-        });
-  }
-
-  @Override
-  public void onReplace(
-      ObjectId oldNotesRev,
-      ObjectId newNotesRev,
-      Collection<ExternalId> toRemove,
-      Collection<ExternalId> toAdd)
-      throws IOException {
-    updateCache(
-        oldNotesRev,
-        newNotesRev,
-        m -> {
-          for (ExternalId extId : toRemove) {
-            m.remove(extId.accountId(), extId);
-          }
-          for (ExternalId extId : toAdd) {
-            extId.checkThatBlobIdIsSet();
-            m.put(extId.accountId(), extId);
-          }
-        });
-  }
-
-  @Override
-  public ImmutableSet<ExternalId> byAccount(Account.Id accountId) throws IOException {
-    return get().byAccount().get(accountId);
-  }
-
-  @Override
-  public ImmutableSetMultimap<Account.Id, ExternalId> allByAccount() throws IOException {
-    return get().byAccount();
-  }
-
-  @Override
-  public ImmutableSetMultimap<String, ExternalId> byEmails(String... emails) throws IOException {
-    AllExternalIds allExternalIds = get();
-    ImmutableSetMultimap.Builder<String, ExternalId> byEmails = ImmutableSetMultimap.builder();
-    for (String email : emails) {
-      byEmails.putAll(email, allExternalIds.byEmail().get(email));
-    }
-    return byEmails.build();
-  }
-
-  @Override
-  public ImmutableSetMultimap<String, ExternalId> allByEmail() throws IOException {
-    return get().byEmail();
-  }
-
-  private AllExternalIds get() throws IOException {
-    try {
-      return extIdsByAccount.get(externalIdReader.readRevision());
-    } catch (ExecutionException e) {
-      throw new IOException("Cannot load external ids", e);
-    }
-  }
-
-  private void updateCache(
-      ObjectId oldNotesRev,
-      ObjectId newNotesRev,
-      Consumer<Multimap<Account.Id, ExternalId>> update) {
-    lock.lock();
-    try {
-      ListMultimap<Account.Id, ExternalId> m;
-      if (!ObjectId.zeroId().equals(oldNotesRev)) {
-        m =
-            MultimapBuilder.hashKeys()
-                .arrayListValues()
-                .build(extIdsByAccount.get(oldNotesRev).byAccount());
-      } else {
-        m = MultimapBuilder.hashKeys().arrayListValues().build();
-      }
-      update.accept(m);
-      extIdsByAccount.put(newNotesRev, AllExternalIds.create(m));
-    } catch (ExecutionException e) {
-      log.warn("Cannot update external IDs", e);
-    } finally {
-      lock.unlock();
-    }
-  }
-
-  private static void removeKeys(Collection<ExternalId> ids, Collection<ExternalId.Key> toRemove) {
-    Collections2.transform(ids, e -> e.key()).removeAll(toRemove);
-  }
-
-  private static class Loader extends CacheLoader<ObjectId, AllExternalIds> {
-    private final ExternalIdReader externalIdReader;
-
-    Loader(ExternalIdReader externalIdReader) {
-      this.externalIdReader = externalIdReader;
-    }
-
-    @Override
-    public AllExternalIds load(ObjectId notesRev) throws Exception {
-      Multimap<Account.Id, ExternalId> extIdsByAccount =
-          MultimapBuilder.hashKeys().arrayListValues().build();
-      for (ExternalId extId : externalIdReader.all(notesRev)) {
-        extId.checkThatBlobIdIsSet();
-        extIdsByAccount.put(extId.accountId(), extId);
-      }
-      return AllExternalIds.create(extIdsByAccount);
-    }
-  }
-
-  @AutoValue
-  abstract static class AllExternalIds {
-    static AllExternalIds create(Multimap<Account.Id, ExternalId> byAccount) {
-      ImmutableSetMultimap<String, ExternalId> byEmail =
-          byAccount.values().stream()
-              .filter(e -> !Strings.isNullOrEmpty(e.email()))
-              .collect(toImmutableSetMultimap(ExternalId::email, e -> e));
-      return new AutoValue_ExternalIdCacheImpl_AllExternalIds(
-          ImmutableSetMultimap.copyOf(byAccount), byEmail);
-    }
-
-    public abstract ImmutableSetMultimap<Account.Id, ExternalId> byAccount();
-
-    public abstract ImmutableSetMultimap<String, ExternalId> byEmail();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/externalids/ExternalIdModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/externalids/ExternalIdModule.java
deleted file mode 100644
index 8c97144..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/externalids/ExternalIdModule.java
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.account.externalids;
-
-import com.google.inject.AbstractModule;
-
-public class ExternalIdModule extends AbstractModule {
-  @Override
-  protected void configure() {
-    bind(ExternalIdCacheImpl.class);
-    bind(ExternalIdCache.class).to(ExternalIdCacheImpl.class);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/externalids/ExternalIdReader.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/externalids/ExternalIdReader.java
deleted file mode 100644
index 7871607..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/externalids/ExternalIdReader.java
+++ /dev/null
@@ -1,199 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.account.externalids;
-
-import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.metrics.Description;
-import com.google.gerrit.metrics.Description.Units;
-import com.google.gerrit.metrics.MetricMaker;
-import com.google.gerrit.metrics.Timer0;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.HashSet;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.notes.Note;
-import org.eclipse.jgit.notes.NoteMap;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Class to read external IDs from NoteDb.
- *
- * <p>In NoteDb external IDs are stored in the All-Users repository in a Git Notes branch called
- * refs/meta/external-ids where the sha1 of the external ID is used as note name. Each note content
- * is a git config file that contains an external ID. It has exactly one externalId subsection with
- * an accountId and optionally email and password:
- *
- * <pre>
- * [externalId "username:jdoe"]
- *   accountId = 1003407
- *   email = jdoe@example.com
- *   password = bcrypt:4:LCbmSBDivK/hhGVQMfkDpA==:XcWn0pKYSVU/UJgOvhidkEtmqCp6oKB7
- * </pre>
- */
-@Singleton
-public class ExternalIdReader {
-  private static final Logger log = LoggerFactory.getLogger(ExternalIdReader.class);
-
-  public static final int MAX_NOTE_SZ = 1 << 19;
-
-  public static ObjectId readRevision(Repository repo) throws IOException {
-    Ref ref = repo.exactRef(RefNames.REFS_EXTERNAL_IDS);
-    return ref != null ? ref.getObjectId() : ObjectId.zeroId();
-  }
-
-  public static NoteMap readNoteMap(RevWalk rw, ObjectId rev) throws IOException {
-    if (!rev.equals(ObjectId.zeroId())) {
-      return NoteMap.read(rw.getObjectReader(), rw.parseCommit(rev));
-    }
-    return NoteMap.newEmptyMap();
-  }
-
-  private final GitRepositoryManager repoManager;
-  private final AllUsersName allUsersName;
-  private boolean failOnLoad = false;
-  private final Timer0 readAllLatency;
-
-  @Inject
-  ExternalIdReader(
-      GitRepositoryManager repoManager, AllUsersName allUsersName, MetricMaker metricMaker) {
-    this.repoManager = repoManager;
-    this.allUsersName = allUsersName;
-    this.readAllLatency =
-        metricMaker.newTimer(
-            "notedb/read_all_external_ids_latency",
-            new Description("Latency for reading all external IDs from NoteDb.")
-                .setCumulative()
-                .setUnit(Units.MILLISECONDS));
-  }
-
-  @VisibleForTesting
-  public void setFailOnLoad(boolean failOnLoad) {
-    this.failOnLoad = failOnLoad;
-  }
-
-  ObjectId readRevision() throws IOException {
-    try (Repository repo = repoManager.openRepository(allUsersName)) {
-      return readRevision(repo);
-    }
-  }
-
-  /** Reads and returns all external IDs. */
-  Set<ExternalId> all() throws IOException {
-    checkReadEnabled();
-
-    try (Repository repo = repoManager.openRepository(allUsersName)) {
-      return all(repo, readRevision(repo));
-    }
-  }
-
-  /**
-   * Reads and returns all external IDs from the specified revision of the refs/meta/external-ids
-   * branch.
-   */
-  Set<ExternalId> all(ObjectId rev) throws IOException {
-    checkReadEnabled();
-
-    try (Repository repo = repoManager.openRepository(allUsersName)) {
-      return all(repo, rev);
-    }
-  }
-
-  /** Reads and returns all external IDs. */
-  private Set<ExternalId> all(Repository repo, ObjectId rev) throws IOException {
-    if (rev.equals(ObjectId.zeroId())) {
-      return ImmutableSet.of();
-    }
-
-    try (Timer0.Context ctx = readAllLatency.start();
-        RevWalk rw = new RevWalk(repo)) {
-      NoteMap noteMap = readNoteMap(rw, rev);
-      Set<ExternalId> extIds = new HashSet<>();
-      for (Note note : noteMap) {
-        byte[] raw =
-            rw.getObjectReader().open(note.getData(), OBJ_BLOB).getCachedBytes(MAX_NOTE_SZ);
-        try {
-          extIds.add(ExternalId.parse(note.getName(), raw, note.getData()));
-        } catch (Exception e) {
-          log.error("Ignoring invalid external ID note {}", note.getName(), e);
-        }
-      }
-      return extIds;
-    }
-  }
-
-  /** Reads and returns the specified external ID. */
-  @Nullable
-  ExternalId get(ExternalId.Key key) throws IOException, ConfigInvalidException {
-    checkReadEnabled();
-
-    try (Repository repo = repoManager.openRepository(allUsersName);
-        RevWalk rw = new RevWalk(repo)) {
-      ObjectId rev = readRevision(repo);
-      if (rev.equals(ObjectId.zeroId())) {
-        return null;
-      }
-
-      return parse(key, rw, rev);
-    }
-  }
-
-  /** Reads and returns the specified external ID from the given revision. */
-  @Nullable
-  ExternalId get(ExternalId.Key key, ObjectId rev) throws IOException, ConfigInvalidException {
-    checkReadEnabled();
-
-    if (rev.equals(ObjectId.zeroId())) {
-      return null;
-    }
-
-    try (Repository repo = repoManager.openRepository(allUsersName);
-        RevWalk rw = new RevWalk(repo)) {
-      return parse(key, rw, rev);
-    }
-  }
-
-  private static ExternalId parse(ExternalId.Key key, RevWalk rw, ObjectId rev)
-      throws IOException, ConfigInvalidException {
-    NoteMap noteMap = readNoteMap(rw, rev);
-    ObjectId noteId = key.sha1();
-    if (!noteMap.contains(noteId)) {
-      return null;
-    }
-
-    ObjectId noteData = noteMap.get(noteId);
-    byte[] raw = rw.getObjectReader().open(noteData, OBJ_BLOB).getCachedBytes(MAX_NOTE_SZ);
-    return ExternalId.parse(noteId.name(), raw, noteData);
-  }
-
-  private void checkReadEnabled() throws IOException {
-    if (failOnLoad) {
-      throw new IOException("Reading from external IDs is disabled");
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/externalids/ExternalIds.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/externalids/ExternalIds.java
deleted file mode 100644
index 35eb6d4..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/externalids/ExternalIds.java
+++ /dev/null
@@ -1,122 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.account.externalids;
-
-import static java.util.stream.Collectors.toSet;
-
-import com.google.common.collect.ImmutableSetMultimap;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.ObjectId;
-
-/**
- * Class to access external IDs.
- *
- * <p>The external IDs are either read from NoteDb or retrieved from the cache.
- */
-@Singleton
-public class ExternalIds {
-  private final ExternalIdReader externalIdReader;
-  private final ExternalIdCache externalIdCache;
-
-  @Inject
-  public ExternalIds(ExternalIdReader externalIdReader, ExternalIdCache externalIdCache) {
-    this.externalIdReader = externalIdReader;
-    this.externalIdCache = externalIdCache;
-  }
-
-  /** Returns all external IDs. */
-  public Set<ExternalId> all() throws IOException {
-    return externalIdReader.all();
-  }
-
-  /** Returns all external IDs from the specified revision of the refs/meta/external-ids branch. */
-  public Set<ExternalId> all(ObjectId rev) throws IOException {
-    return externalIdReader.all(rev);
-  }
-
-  /** Returns the specified external ID. */
-  @Nullable
-  public ExternalId get(ExternalId.Key key) throws IOException, ConfigInvalidException {
-    return externalIdReader.get(key);
-  }
-
-  /** Returns the specified external ID from the given revision. */
-  @Nullable
-  public ExternalId get(ExternalId.Key key, ObjectId rev)
-      throws IOException, ConfigInvalidException {
-    return externalIdReader.get(key, rev);
-  }
-
-  /** Returns the external IDs of the specified account. */
-  public Set<ExternalId> byAccount(Account.Id accountId) throws IOException {
-    return externalIdCache.byAccount(accountId);
-  }
-
-  /** Returns the external IDs of the specified account that have the given scheme. */
-  public Set<ExternalId> byAccount(Account.Id accountId, String scheme) throws IOException {
-    return byAccount(accountId).stream().filter(e -> e.key().isScheme(scheme)).collect(toSet());
-  }
-
-  /** Returns all external IDs by account. */
-  public ImmutableSetMultimap<Account.Id, ExternalId> allByAccount() throws IOException {
-    return externalIdCache.allByAccount();
-  }
-
-  /**
-   * Returns the external ID with the given email.
-   *
-   * <p>Each email should belong to a single external ID only. This means if more than one external
-   * ID is returned there is an inconsistency in the external IDs.
-   *
-   * <p>The external IDs are retrieved from the external ID cache. Each access to the external ID
-   * cache requires reading the SHA1 of the refs/meta/external-ids branch. If external IDs for
-   * multiple emails are needed it is more efficient to use {@link #byEmails(String...)} as this
-   * method reads the SHA1 of the refs/meta/external-ids branch only once (and not once per email).
-   *
-   * @see #byEmails(String...)
-   */
-  public Set<ExternalId> byEmail(String email) throws IOException {
-    return externalIdCache.byEmail(email);
-  }
-
-  /**
-   * Returns the external IDs for the given emails.
-   *
-   * <p>Each email should belong to a single external ID only. This means if more than one external
-   * ID for an email is returned there is an inconsistency in the external IDs.
-   *
-   * <p>The external IDs are retrieved from the external ID cache. Each access to the external ID
-   * cache requires reading the SHA1 of the refs/meta/external-ids branch. If external IDs for
-   * multiple emails are needed it is more efficient to use this method instead of {@link
-   * #byEmail(String)} as this method reads the SHA1 of the refs/meta/external-ids branch only once
-   * (and not once per email).
-   *
-   * @see #byEmail(String)
-   */
-  public ImmutableSetMultimap<String, ExternalId> byEmails(String... emails) throws IOException {
-    return externalIdCache.byEmails(emails);
-  }
-
-  /** Returns all external IDs by email. */
-  public ImmutableSetMultimap<String, ExternalId> allByEmail() throws IOException {
-    return externalIdCache.allByEmail();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/externalids/ExternalIdsBatchUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/externalids/ExternalIdsBatchUpdate.java
deleted file mode 100644
index 8e5582c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/externalids/ExternalIdsBatchUpdate.java
+++ /dev/null
@@ -1,129 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.account.externalids;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.util.HashSet;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.notes.NoteMap;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-/**
- * This class allows to do batch updates to external IDs.
- *
- * <p>For NoteDb all updates will result in a single commit to the refs/meta/external-ids branch.
- * This means callers can prepare many updates by invoking {@link #replace(ExternalId, ExternalId)}
- * multiple times and when {@link ExternalIdsBatchUpdate#commit(String)} is invoked a single NoteDb
- * commit is created that contains all the prepared updates.
- */
-public class ExternalIdsBatchUpdate {
-  private final GitRepositoryManager repoManager;
-  private final GitReferenceUpdated gitRefUpdated;
-  private final AllUsersName allUsersName;
-  private final PersonIdent serverIdent;
-  private final ExternalIdCache externalIdCache;
-  private final Set<ExternalId> toAdd = new HashSet<>();
-  private final Set<ExternalId> toDelete = new HashSet<>();
-
-  @Inject
-  public ExternalIdsBatchUpdate(
-      GitRepositoryManager repoManager,
-      GitReferenceUpdated gitRefUpdated,
-      AllUsersName allUsersName,
-      @GerritPersonIdent PersonIdent serverIdent,
-      ExternalIdCache externalIdCache) {
-    this.repoManager = repoManager;
-    this.gitRefUpdated = gitRefUpdated;
-    this.allUsersName = allUsersName;
-    this.serverIdent = serverIdent;
-    this.externalIdCache = externalIdCache;
-  }
-
-  /**
-   * Adds an external ID replacement to the batch.
-   *
-   * <p>The actual replacement is only done when {@link #commit(String)} is invoked.
-   */
-  public void replace(ExternalId extIdToDelete, ExternalId extIdToAdd) {
-    ExternalIdsUpdate.checkSameAccount(ImmutableSet.of(extIdToDelete, extIdToAdd));
-    toAdd.add(extIdToAdd);
-    toDelete.add(extIdToDelete);
-  }
-
-  /**
-   * Commits this batch.
-   *
-   * <p>This means external ID replacements which were prepared by invoking {@link
-   * #replace(ExternalId, ExternalId)} are now executed. Deletion of external IDs is done before
-   * adding the new external IDs. This means if an external ID is specified for deletion and an
-   * external ID with the same key is specified to be added, the old external ID with that key is
-   * deleted first and then the new external ID is added (so the external ID for that key is
-   * replaced).
-   *
-   * <p>For NoteDb a single commit is created that contains all the external ID updates.
-   */
-  public void commit(String commitMessage)
-      throws IOException, OrmException, ConfigInvalidException {
-    if (toDelete.isEmpty() && toAdd.isEmpty()) {
-      return;
-    }
-
-    try (Repository repo = repoManager.openRepository(allUsersName);
-        RevWalk rw = new RevWalk(repo);
-        ObjectInserter ins = repo.newObjectInserter()) {
-      ObjectId rev = ExternalIdReader.readRevision(repo);
-
-      NoteMap noteMap = ExternalIdReader.readNoteMap(rw, rev);
-
-      for (ExternalId extId : toDelete) {
-        ExternalIdsUpdate.remove(rw, noteMap, extId);
-      }
-
-      for (ExternalId extId : toAdd) {
-        ExternalIdsUpdate.insert(rw, ins, noteMap, extId);
-      }
-
-      ObjectId newRev =
-          ExternalIdsUpdate.commit(
-              allUsersName,
-              repo,
-              rw,
-              ins,
-              rev,
-              noteMap,
-              commitMessage,
-              serverIdent,
-              serverIdent,
-              null,
-              gitRefUpdated);
-      externalIdCache.onReplace(rev, newRev, toDelete, toAdd);
-    }
-
-    toAdd.clear();
-    toDelete.clear();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/externalids/ExternalIdsConsistencyChecker.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/externalids/ExternalIdsConsistencyChecker.java
deleted file mode 100644
index 3f9c4d5..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/externalids/ExternalIdsConsistencyChecker.java
+++ /dev/null
@@ -1,151 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.account.externalids;
-
-import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_USERNAME;
-import static java.util.stream.Collectors.joining;
-import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
-
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.MultimapBuilder;
-import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo.ConsistencyProblemInfo;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.HashedPassword;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.mail.send.OutgoingEmailValidator;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.commons.codec.DecoderException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.notes.Note;
-import org.eclipse.jgit.notes.NoteMap;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-@Singleton
-public class ExternalIdsConsistencyChecker {
-  private final GitRepositoryManager repoManager;
-  private final AllUsersName allUsers;
-  private final AccountCache accountCache;
-  private final OutgoingEmailValidator validator;
-
-  @Inject
-  ExternalIdsConsistencyChecker(
-      GitRepositoryManager repoManager,
-      AllUsersName allUsers,
-      AccountCache accountCache,
-      OutgoingEmailValidator validator) {
-    this.repoManager = repoManager;
-    this.allUsers = allUsers;
-    this.accountCache = accountCache;
-    this.validator = validator;
-  }
-
-  public List<ConsistencyProblemInfo> check() throws IOException {
-    try (Repository repo = repoManager.openRepository(allUsers)) {
-      return check(repo, ExternalIdReader.readRevision(repo));
-    }
-  }
-
-  public List<ConsistencyProblemInfo> check(ObjectId rev) throws IOException {
-    try (Repository repo = repoManager.openRepository(allUsers)) {
-      return check(repo, rev);
-    }
-  }
-
-  private List<ConsistencyProblemInfo> check(Repository repo, ObjectId commit) throws IOException {
-    List<ConsistencyProblemInfo> problems = new ArrayList<>();
-
-    ListMultimap<String, ExternalId.Key> emails =
-        MultimapBuilder.hashKeys().arrayListValues().build();
-
-    try (RevWalk rw = new RevWalk(repo)) {
-      NoteMap noteMap = ExternalIdReader.readNoteMap(rw, commit);
-      for (Note note : noteMap) {
-        byte[] raw =
-            rw.getObjectReader()
-                .open(note.getData(), OBJ_BLOB)
-                .getCachedBytes(ExternalIdReader.MAX_NOTE_SZ);
-        try {
-          ExternalId extId = ExternalId.parse(note.getName(), raw, note.getData());
-          problems.addAll(validateExternalId(extId));
-
-          if (extId.email() != null) {
-            emails.put(extId.email(), extId.key());
-          }
-        } catch (ConfigInvalidException e) {
-          addError(String.format(e.getMessage()), problems);
-        }
-      }
-    }
-
-    emails.asMap().entrySet().stream()
-        .filter(e -> e.getValue().size() > 1)
-        .forEach(
-            e ->
-                addError(
-                    String.format(
-                        "Email '%s' is not unique, it's used by the following external IDs: %s",
-                        e.getKey(),
-                        e.getValue().stream()
-                            .map(k -> "'" + k.get() + "'")
-                            .sorted()
-                            .collect(joining(", "))),
-                    problems));
-
-    return problems;
-  }
-
-  private List<ConsistencyProblemInfo> validateExternalId(ExternalId extId) {
-    List<ConsistencyProblemInfo> problems = new ArrayList<>();
-
-    if (accountCache.getOrNull(extId.accountId()) == null) {
-      addError(
-          String.format(
-              "External ID '%s' belongs to account that doesn't exist: %s",
-              extId.key().get(), extId.accountId().get()),
-          problems);
-    }
-
-    if (extId.email() != null && !validator.isValid(extId.email())) {
-      addError(
-          String.format(
-              "External ID '%s' has an invalid email: %s", extId.key().get(), extId.email()),
-          problems);
-    }
-
-    if (extId.password() != null && extId.isScheme(SCHEME_USERNAME)) {
-      try {
-        HashedPassword.decode(extId.password());
-      } catch (DecoderException e) {
-        addError(
-            String.format(
-                "External ID '%s' has an invalid password: %s", extId.key().get(), e.getMessage()),
-            problems);
-      }
-    }
-
-    return problems;
-  }
-
-  private static void addError(String error, List<ConsistencyProblemInfo> problems) {
-    problems.add(new ConsistencyProblemInfo(ConsistencyProblemInfo.Status.ERROR, error));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/externalids/ExternalIdsUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/externalids/ExternalIdsUpdate.java
deleted file mode 100644
index db37147..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/externalids/ExternalIdsUpdate.java
+++ /dev/null
@@ -1,940 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.account.externalids;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.gerrit.server.account.externalids.ExternalIdReader.MAX_NOTE_SZ;
-import static com.google.gerrit.server.account.externalids.ExternalIdReader.readNoteMap;
-import static com.google.gerrit.server.account.externalids.ExternalIdReader.readRevision;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.stream.Collectors.toSet;
-import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
-import static org.eclipse.jgit.lib.Constants.OBJ_TREE;
-
-import com.github.rholder.retry.RetryException;
-import com.github.rholder.retry.Retryer;
-import com.github.rholder.retry.RetryerBuilder;
-import com.github.rholder.retry.StopStrategies;
-import com.github.rholder.retry.WaitStrategies;
-import com.google.auto.value.AutoValue;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Throwables;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Streams;
-import com.google.common.util.concurrent.Runnables;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.metrics.Counter0;
-import com.google.gerrit.metrics.Description;
-import com.google.gerrit.metrics.MetricMaker;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.LockFailureException;
-import com.google.gwtorm.server.OrmDuplicateKeyException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Stream;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.notes.NoteMap;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-/**
- * Updates externalIds in ReviewDb and NoteDb.
- *
- * <p>In NoteDb external IDs are stored in the All-Users repository in a Git Notes branch called
- * refs/meta/external-ids where the sha1 of the external ID is used as note name. Each note content
- * is a git config file that contains an external ID. It has exactly one externalId subsection with
- * an accountId and optionally email and password:
- *
- * <pre>
- * [externalId "username:jdoe"]
- *   accountId = 1003407
- *   email = jdoe@example.com
- *   password = bcrypt:4:LCbmSBDivK/hhGVQMfkDpA==:XcWn0pKYSVU/UJgOvhidkEtmqCp6oKB7
- * </pre>
- *
- * For NoteDb each method call results in one commit on refs/meta/external-ids branch.
- *
- * <p>On updating external IDs this class takes care to evict affected accounts from the account
- * cache and thus triggers reindex for them.
- */
-public class ExternalIdsUpdate {
-  private static final String COMMIT_MSG = "Update external IDs";
-
-  /**
-   * Factory to create an ExternalIdsUpdate instance for updating external IDs by the Gerrit server.
-   *
-   * <p>The Gerrit server identity will be used as author and committer for all commits that update
-   * the external IDs.
-   */
-  @Singleton
-  public static class Server {
-    private final GitRepositoryManager repoManager;
-    private final AccountCache accountCache;
-    private final AllUsersName allUsersName;
-    private final MetricMaker metricMaker;
-    private final ExternalIds externalIds;
-    private final ExternalIdCache externalIdCache;
-    private final Provider<PersonIdent> serverIdent;
-    private final GitReferenceUpdated gitRefUpdated;
-
-    @Inject
-    public Server(
-        GitRepositoryManager repoManager,
-        AccountCache accountCache,
-        AllUsersName allUsersName,
-        MetricMaker metricMaker,
-        ExternalIds externalIds,
-        ExternalIdCache externalIdCache,
-        @GerritPersonIdent Provider<PersonIdent> serverIdent,
-        GitReferenceUpdated gitRefUpdated) {
-      this.repoManager = repoManager;
-      this.accountCache = accountCache;
-      this.allUsersName = allUsersName;
-      this.metricMaker = metricMaker;
-      this.externalIds = externalIds;
-      this.externalIdCache = externalIdCache;
-      this.serverIdent = serverIdent;
-      this.gitRefUpdated = gitRefUpdated;
-    }
-
-    public ExternalIdsUpdate create() {
-      PersonIdent i = serverIdent.get();
-      return new ExternalIdsUpdate(
-          repoManager,
-          accountCache,
-          allUsersName,
-          metricMaker,
-          externalIds,
-          externalIdCache,
-          i,
-          i,
-          null,
-          gitRefUpdated);
-    }
-  }
-
-  /**
-   * Factory to create an ExternalIdsUpdate instance for updating external IDs by the Gerrit server.
-   *
-   * <p>Using this class no reindex will be performed for the affected accounts and they will also
-   * not be evicted from the account cache.
-   *
-   * <p>The Gerrit server identity will be used as author and committer for all commits that update
-   * the external IDs.
-   */
-  @Singleton
-  public static class ServerNoReindex {
-    private final GitRepositoryManager repoManager;
-    private final AllUsersName allUsersName;
-    private final MetricMaker metricMaker;
-    private final ExternalIds externalIds;
-    private final ExternalIdCache externalIdCache;
-    private final Provider<PersonIdent> serverIdent;
-    private final GitReferenceUpdated gitRefUpdated;
-
-    @Inject
-    public ServerNoReindex(
-        GitRepositoryManager repoManager,
-        AllUsersName allUsersName,
-        MetricMaker metricMaker,
-        ExternalIds externalIds,
-        ExternalIdCache externalIdCache,
-        @GerritPersonIdent Provider<PersonIdent> serverIdent,
-        GitReferenceUpdated gitRefUpdated) {
-      this.repoManager = repoManager;
-      this.allUsersName = allUsersName;
-      this.metricMaker = metricMaker;
-      this.externalIds = externalIds;
-      this.externalIdCache = externalIdCache;
-      this.serverIdent = serverIdent;
-      this.gitRefUpdated = gitRefUpdated;
-    }
-
-    public ExternalIdsUpdate create() {
-      PersonIdent i = serverIdent.get();
-      return new ExternalIdsUpdate(
-          repoManager,
-          null,
-          allUsersName,
-          metricMaker,
-          externalIds,
-          externalIdCache,
-          i,
-          i,
-          null,
-          gitRefUpdated);
-    }
-  }
-
-  /**
-   * Factory to create an ExternalIdsUpdate instance for updating external IDs by the current user.
-   *
-   * <p>The identity of the current user will be used as author for all commits that update the
-   * external IDs. The Gerrit server identity will be used as committer.
-   */
-  @Singleton
-  public static class User {
-    private final GitRepositoryManager repoManager;
-    private final AccountCache accountCache;
-    private final AllUsersName allUsersName;
-    private final MetricMaker metricMaker;
-    private final ExternalIds externalIds;
-    private final ExternalIdCache externalIdCache;
-    private final Provider<PersonIdent> serverIdent;
-    private final Provider<IdentifiedUser> identifiedUser;
-    private final GitReferenceUpdated gitRefUpdated;
-
-    @Inject
-    public User(
-        GitRepositoryManager repoManager,
-        AccountCache accountCache,
-        AllUsersName allUsersName,
-        MetricMaker metricMaker,
-        ExternalIds externalIds,
-        ExternalIdCache externalIdCache,
-        @GerritPersonIdent Provider<PersonIdent> serverIdent,
-        Provider<IdentifiedUser> identifiedUser,
-        GitReferenceUpdated gitRefUpdated) {
-      this.repoManager = repoManager;
-      this.accountCache = accountCache;
-      this.allUsersName = allUsersName;
-      this.metricMaker = metricMaker;
-      this.externalIds = externalIds;
-      this.externalIdCache = externalIdCache;
-      this.serverIdent = serverIdent;
-      this.identifiedUser = identifiedUser;
-      this.gitRefUpdated = gitRefUpdated;
-    }
-
-    public ExternalIdsUpdate create() {
-      IdentifiedUser user = identifiedUser.get();
-      PersonIdent i = serverIdent.get();
-      return new ExternalIdsUpdate(
-          repoManager,
-          accountCache,
-          allUsersName,
-          metricMaker,
-          externalIds,
-          externalIdCache,
-          createPersonIdent(i, user),
-          i,
-          user,
-          gitRefUpdated);
-    }
-
-    private PersonIdent createPersonIdent(PersonIdent ident, IdentifiedUser user) {
-      return user.newCommitterIdent(ident.getWhen(), ident.getTimeZone());
-    }
-  }
-
-  @VisibleForTesting
-  public static RetryerBuilder<RefsMetaExternalIdsUpdate> retryerBuilder() {
-    return RetryerBuilder.<RefsMetaExternalIdsUpdate>newBuilder()
-        .retryIfException(e -> e instanceof LockFailureException)
-        .withWaitStrategy(
-            WaitStrategies.join(
-                WaitStrategies.exponentialWait(2, TimeUnit.SECONDS),
-                WaitStrategies.randomWait(50, TimeUnit.MILLISECONDS)))
-        .withStopStrategy(StopStrategies.stopAfterDelay(10, TimeUnit.SECONDS));
-  }
-
-  private static final Retryer<RefsMetaExternalIdsUpdate> RETRYER = retryerBuilder().build();
-
-  private final GitRepositoryManager repoManager;
-  @Nullable private final AccountCache accountCache;
-  private final AllUsersName allUsersName;
-  private final ExternalIds externalIds;
-  private final ExternalIdCache externalIdCache;
-  private final PersonIdent committerIdent;
-  private final PersonIdent authorIdent;
-  @Nullable private final IdentifiedUser currentUser;
-  private final GitReferenceUpdated gitRefUpdated;
-  private final Runnable afterReadRevision;
-  private final Retryer<RefsMetaExternalIdsUpdate> retryer;
-  private final Counter0 updateCount;
-
-  private ExternalIdsUpdate(
-      GitRepositoryManager repoManager,
-      @Nullable AccountCache accountCache,
-      AllUsersName allUsersName,
-      MetricMaker metricMaker,
-      ExternalIds externalIds,
-      ExternalIdCache externalIdCache,
-      PersonIdent committerIdent,
-      PersonIdent authorIdent,
-      @Nullable IdentifiedUser currentUser,
-      GitReferenceUpdated gitRefUpdated) {
-    this(
-        repoManager,
-        accountCache,
-        allUsersName,
-        metricMaker,
-        externalIds,
-        externalIdCache,
-        committerIdent,
-        authorIdent,
-        currentUser,
-        gitRefUpdated,
-        Runnables.doNothing(),
-        RETRYER);
-  }
-
-  @VisibleForTesting
-  public ExternalIdsUpdate(
-      GitRepositoryManager repoManager,
-      @Nullable AccountCache accountCache,
-      AllUsersName allUsersName,
-      MetricMaker metricMaker,
-      ExternalIds externalIds,
-      ExternalIdCache externalIdCache,
-      PersonIdent committerIdent,
-      PersonIdent authorIdent,
-      @Nullable IdentifiedUser currentUser,
-      GitReferenceUpdated gitRefUpdated,
-      Runnable afterReadRevision,
-      Retryer<RefsMetaExternalIdsUpdate> retryer) {
-    this.repoManager = checkNotNull(repoManager, "repoManager");
-    this.accountCache = accountCache;
-    this.allUsersName = checkNotNull(allUsersName, "allUsersName");
-    this.committerIdent = checkNotNull(committerIdent, "committerIdent");
-    this.externalIds = checkNotNull(externalIds, "externalIds");
-    this.externalIdCache = checkNotNull(externalIdCache, "externalIdCache");
-    this.authorIdent = checkNotNull(authorIdent, "authorIdent");
-    this.currentUser = currentUser;
-    this.gitRefUpdated = checkNotNull(gitRefUpdated, "gitRefUpdated");
-    this.afterReadRevision = checkNotNull(afterReadRevision, "afterReadRevision");
-    this.retryer = checkNotNull(retryer, "retryer");
-    this.updateCount =
-        metricMaker.newCounter(
-            "notedb/external_id_update_count",
-            new Description("Total number of external ID updates.").setRate().setUnit("updates"));
-  }
-
-  /**
-   * Inserts a new external ID.
-   *
-   * <p>If the external ID already exists, the insert fails with {@link OrmDuplicateKeyException}.
-   */
-  public void insert(ExternalId extId) throws IOException, ConfigInvalidException, OrmException {
-    insert(Collections.singleton(extId));
-  }
-
-  /**
-   * Inserts new external IDs.
-   *
-   * <p>If any of the external ID already exists, the insert fails with {@link
-   * OrmDuplicateKeyException}.
-   */
-  public void insert(Collection<ExternalId> extIds)
-      throws IOException, ConfigInvalidException, OrmException {
-    RefsMetaExternalIdsUpdate u =
-        updateNoteMap(
-            o -> {
-              UpdatedExternalIds updatedExtIds = new UpdatedExternalIds();
-              for (ExternalId extId : extIds) {
-                ExternalId insertedExtId = insert(o.rw(), o.ins(), o.noteMap(), extId);
-                updatedExtIds.onUpdate(insertedExtId);
-              }
-              return updatedExtIds;
-            });
-    externalIdCache.onCreate(u.oldRev(), u.newRev(), u.updatedExtIds().getUpdated());
-    evictAccounts(u);
-  }
-
-  /**
-   * Inserts or updates an external ID.
-   *
-   * <p>If the external ID already exists, it is overwritten, otherwise it is inserted.
-   */
-  public void upsert(ExternalId extId) throws IOException, ConfigInvalidException, OrmException {
-    upsert(Collections.singleton(extId));
-  }
-
-  /**
-   * Inserts or updates external IDs.
-   *
-   * <p>If any of the external IDs already exists, it is overwritten. New external IDs are inserted.
-   */
-  public void upsert(Collection<ExternalId> extIds)
-      throws IOException, ConfigInvalidException, OrmException {
-    RefsMetaExternalIdsUpdate u =
-        updateNoteMap(
-            o -> {
-              UpdatedExternalIds updatedExtIds = new UpdatedExternalIds();
-              for (ExternalId extId : extIds) {
-                ExternalId updatedExtId = upsert(o.rw(), o.ins(), o.noteMap(), extId);
-                updatedExtIds.onUpdate(updatedExtId);
-              }
-              return updatedExtIds;
-            });
-    externalIdCache.onUpdate(u.oldRev(), u.newRev(), u.updatedExtIds().getUpdated());
-    evictAccounts(u);
-  }
-
-  /**
-   * Deletes an external ID.
-   *
-   * @throws IllegalStateException is thrown if there is an existing external ID that has the same
-   *     key, but otherwise doesn't match the specified external ID.
-   */
-  public void delete(ExternalId extId) throws IOException, ConfigInvalidException, OrmException {
-    delete(Collections.singleton(extId));
-  }
-
-  /**
-   * Deletes external IDs.
-   *
-   * @throws IllegalStateException is thrown if there is an existing external ID that has the same
-   *     key as any of the external IDs that should be deleted, but otherwise doesn't match the that
-   *     external ID.
-   */
-  public void delete(Collection<ExternalId> extIds)
-      throws IOException, ConfigInvalidException, OrmException {
-    RefsMetaExternalIdsUpdate u =
-        updateNoteMap(
-            o -> {
-              UpdatedExternalIds updatedExtIds = new UpdatedExternalIds();
-              for (ExternalId extId : extIds) {
-                ExternalId removedExtId = remove(o.rw(), o.noteMap(), extId);
-                updatedExtIds.onRemove(removedExtId);
-              }
-              return updatedExtIds;
-            });
-    externalIdCache.onRemove(u.oldRev(), u.newRev(), u.updatedExtIds().getRemoved());
-    evictAccounts(u);
-  }
-
-  /**
-   * Delete an external ID by key.
-   *
-   * @throws IllegalStateException is thrown if the external ID does not belong to the specified
-   *     account.
-   */
-  public void delete(Account.Id accountId, ExternalId.Key extIdKey)
-      throws IOException, ConfigInvalidException, OrmException {
-    delete(accountId, Collections.singleton(extIdKey));
-  }
-
-  /**
-   * Delete external IDs by external ID key.
-   *
-   * @throws IllegalStateException is thrown if any of the external IDs does not belong to the
-   *     specified account.
-   */
-  public void delete(Account.Id accountId, Collection<ExternalId.Key> extIdKeys)
-      throws IOException, ConfigInvalidException, OrmException {
-    RefsMetaExternalIdsUpdate u =
-        updateNoteMap(
-            o -> {
-              UpdatedExternalIds updatedExtIds = new UpdatedExternalIds();
-              for (ExternalId.Key extIdKey : extIdKeys) {
-                ExternalId removedExtId = remove(o.rw(), o.noteMap(), extIdKey, accountId);
-                updatedExtIds.onRemove(removedExtId);
-              }
-              return updatedExtIds;
-            });
-    externalIdCache.onRemove(u.oldRev(), u.newRev(), u.updatedExtIds().getRemoved());
-    evictAccount(accountId);
-  }
-
-  /**
-   * Delete external IDs by external ID key.
-   *
-   * <p>The external IDs are deleted regardless of which account they belong to.
-   */
-  public void deleteByKeys(Collection<ExternalId.Key> extIdKeys)
-      throws IOException, ConfigInvalidException, OrmException {
-    RefsMetaExternalIdsUpdate u =
-        updateNoteMap(
-            o -> {
-              UpdatedExternalIds updatedExtIds = new UpdatedExternalIds();
-              for (ExternalId.Key extIdKey : extIdKeys) {
-                ExternalId extId = remove(o.rw(), o.noteMap(), extIdKey, null);
-                updatedExtIds.onRemove(extId);
-              }
-              return updatedExtIds;
-            });
-    externalIdCache.onRemove(u.oldRev(), u.newRev(), u.updatedExtIds().getRemoved());
-    evictAccounts(u);
-  }
-
-  /** Deletes all external IDs of the specified account. */
-  public void deleteAll(Account.Id accountId)
-      throws IOException, ConfigInvalidException, OrmException {
-    delete(externalIds.byAccount(accountId));
-  }
-
-  /**
-   * Replaces external IDs for an account by external ID keys.
-   *
-   * <p>Deletion of external IDs is done before adding the new external IDs. This means if an
-   * external ID key is specified for deletion and an external ID with the same key is specified to
-   * be added, the old external ID with that key is deleted first and then the new external ID is
-   * added (so the external ID for that key is replaced).
-   *
-   * @throws IllegalStateException is thrown if any of the specified external IDs does not belong to
-   *     the specified account.
-   */
-  public void replace(
-      Account.Id accountId, Collection<ExternalId.Key> toDelete, Collection<ExternalId> toAdd)
-      throws IOException, ConfigInvalidException, OrmException {
-    checkSameAccount(toAdd, accountId);
-
-    RefsMetaExternalIdsUpdate u =
-        updateNoteMap(
-            o -> {
-              UpdatedExternalIds updatedExtIds = new UpdatedExternalIds();
-              for (ExternalId.Key extIdKey : toDelete) {
-                ExternalId removedExtId = remove(o.rw(), o.noteMap(), extIdKey, accountId);
-                updatedExtIds.onRemove(removedExtId);
-              }
-
-              for (ExternalId extId : toAdd) {
-                ExternalId insertedExtId = insert(o.rw(), o.ins(), o.noteMap(), extId);
-                updatedExtIds.onUpdate(insertedExtId);
-              }
-              return updatedExtIds;
-            });
-    externalIdCache.onReplace(
-        u.oldRev(),
-        u.newRev(),
-        accountId,
-        u.updatedExtIds().getRemoved(),
-        u.updatedExtIds().getUpdated());
-    evictAccount(accountId);
-  }
-
-  /**
-   * Replaces external IDs for an account by external ID keys.
-   *
-   * <p>Deletion of external IDs is done before adding the new external IDs. This means if an
-   * external ID key is specified for deletion and an external ID with the same key is specified to
-   * be added, the old external ID with that key is deleted first and then the new external ID is
-   * added (so the external ID for that key is replaced).
-   *
-   * <p>The external IDs are replaced regardless of which account they belong to.
-   */
-  public void replaceByKeys(Collection<ExternalId.Key> toDelete, Collection<ExternalId> toAdd)
-      throws IOException, ConfigInvalidException, OrmException {
-    RefsMetaExternalIdsUpdate u =
-        updateNoteMap(
-            o -> {
-              UpdatedExternalIds updatedExtIds = new UpdatedExternalIds();
-              for (ExternalId.Key extIdKey : toDelete) {
-                ExternalId removedExtId = remove(o.rw(), o.noteMap(), extIdKey, null);
-                updatedExtIds.onRemove(removedExtId);
-              }
-
-              for (ExternalId extId : toAdd) {
-                ExternalId insertedExtId = insert(o.rw(), o.ins(), o.noteMap(), extId);
-                updatedExtIds.onUpdate(insertedExtId);
-              }
-              return updatedExtIds;
-            });
-    externalIdCache.onReplace(
-        u.oldRev(), u.newRev(), u.updatedExtIds().getRemoved(), u.updatedExtIds().getUpdated());
-    evictAccounts(u);
-  }
-
-  /**
-   * Replaces an external ID.
-   *
-   * @throws IllegalStateException is thrown if the specified external IDs belong to different
-   *     accounts.
-   */
-  public void replace(ExternalId toDelete, ExternalId toAdd)
-      throws IOException, ConfigInvalidException, OrmException {
-    replace(Collections.singleton(toDelete), Collections.singleton(toAdd));
-  }
-
-  /**
-   * Replaces external IDs.
-   *
-   * <p>Deletion of external IDs is done before adding the new external IDs. This means if an
-   * external ID is specified for deletion and an external ID with the same key is specified to be
-   * added, the old external ID with that key is deleted first and then the new external ID is added
-   * (so the external ID for that key is replaced).
-   *
-   * @throws IllegalStateException is thrown if the specified external IDs belong to different
-   *     accounts.
-   */
-  public void replace(Collection<ExternalId> toDelete, Collection<ExternalId> toAdd)
-      throws IOException, ConfigInvalidException, OrmException {
-    Account.Id accountId = checkSameAccount(Iterables.concat(toDelete, toAdd));
-    if (accountId == null) {
-      // toDelete and toAdd are empty -> nothing to do
-      return;
-    }
-
-    replace(accountId, toDelete.stream().map(e -> e.key()).collect(toSet()), toAdd);
-  }
-
-  /**
-   * Checks that all specified external IDs belong to the same account.
-   *
-   * @return the ID of the account to which all specified external IDs belong.
-   */
-  public static Account.Id checkSameAccount(Iterable<ExternalId> extIds) {
-    return checkSameAccount(extIds, null);
-  }
-
-  /**
-   * Checks that all specified external IDs belong to specified account. If no account is specified
-   * it is checked that all specified external IDs belong to the same account.
-   *
-   * @return the ID of the account to which all specified external IDs belong.
-   */
-  public static Account.Id checkSameAccount(
-      Iterable<ExternalId> extIds, @Nullable Account.Id accountId) {
-    for (ExternalId extId : extIds) {
-      if (accountId == null) {
-        accountId = extId.accountId();
-        continue;
-      }
-      checkState(
-          accountId.equals(extId.accountId()),
-          "external id %s belongs to account %s, expected account %s",
-          extId.key().get(),
-          extId.accountId().get(),
-          accountId.get());
-    }
-    return accountId;
-  }
-
-  /**
-   * Inserts a new external ID and sets it in the note map.
-   *
-   * <p>If the external ID already exists, the insert fails with {@link OrmDuplicateKeyException}.
-   */
-  public static ExternalId insert(RevWalk rw, ObjectInserter ins, NoteMap noteMap, ExternalId extId)
-      throws OrmDuplicateKeyException, ConfigInvalidException, IOException {
-    if (noteMap.contains(extId.key().sha1())) {
-      throw new OrmDuplicateKeyException(
-          String.format("external id %s already exists", extId.key().get()));
-    }
-    return upsert(rw, ins, noteMap, extId);
-  }
-
-  /**
-   * Insert or updates an new external ID and sets it in the note map.
-   *
-   * <p>If the external ID already exists it is overwritten.
-   */
-  public static ExternalId upsert(RevWalk rw, ObjectInserter ins, NoteMap noteMap, ExternalId extId)
-      throws IOException, ConfigInvalidException {
-    ObjectId noteId = extId.key().sha1();
-    Config c = new Config();
-    if (noteMap.contains(extId.key().sha1())) {
-      byte[] raw =
-          rw.getObjectReader().open(noteMap.get(noteId), OBJ_BLOB).getCachedBytes(MAX_NOTE_SZ);
-      try {
-        c.fromText(new String(raw, UTF_8));
-      } catch (ConfigInvalidException e) {
-        throw new ConfigInvalidException(
-            String.format("Invalid external id config for note %s: %s", noteId, e.getMessage()));
-      }
-    }
-    extId.writeToConfig(c);
-    byte[] raw = c.toText().getBytes(UTF_8);
-    ObjectId noteData = ins.insert(OBJ_BLOB, raw);
-    noteMap.set(noteId, noteData);
-    return ExternalId.create(extId, noteData);
-  }
-
-  /**
-   * Removes an external ID from the note map.
-   *
-   * @throws IllegalStateException is thrown if there is an existing external ID that has the same
-   *     key, but otherwise doesn't match the specified external ID.
-   */
-  public static ExternalId remove(RevWalk rw, NoteMap noteMap, ExternalId extId)
-      throws IOException, ConfigInvalidException {
-    ObjectId noteId = extId.key().sha1();
-    if (!noteMap.contains(noteId)) {
-      return null;
-    }
-
-    ObjectId noteData = noteMap.get(noteId);
-    byte[] raw = rw.getObjectReader().open(noteData, OBJ_BLOB).getCachedBytes(MAX_NOTE_SZ);
-    ExternalId actualExtId = ExternalId.parse(noteId.name(), raw, noteData);
-    checkState(
-        extId.equals(actualExtId),
-        "external id %s should be removed, but it's not matching the actual external id %s",
-        extId.toString(),
-        actualExtId.toString());
-    noteMap.remove(noteId);
-    return actualExtId;
-  }
-
-  /**
-   * Removes an external ID from the note map by external ID key.
-   *
-   * @throws IllegalStateException is thrown if an expected account ID is provided and an external
-   *     ID with the specified key exists, but belongs to another account.
-   * @return the external ID that was removed, {@code null} if no external ID with the specified key
-   *     exists
-   */
-  private static ExternalId remove(
-      RevWalk rw, NoteMap noteMap, ExternalId.Key extIdKey, Account.Id expectedAccountId)
-      throws IOException, ConfigInvalidException {
-    ObjectId noteId = extIdKey.sha1();
-    if (!noteMap.contains(noteId)) {
-      return null;
-    }
-
-    ObjectId noteData = noteMap.get(noteId);
-    byte[] raw = rw.getObjectReader().open(noteData, OBJ_BLOB).getCachedBytes(MAX_NOTE_SZ);
-    ExternalId extId = ExternalId.parse(noteId.name(), raw, noteData);
-    if (expectedAccountId != null) {
-      checkState(
-          expectedAccountId.equals(extId.accountId()),
-          "external id %s should be removed for account %s,"
-              + " but external id belongs to account %s",
-          extIdKey.get(),
-          expectedAccountId.get(),
-          extId.accountId().get());
-    }
-    noteMap.remove(noteId);
-    return extId;
-  }
-
-  private RefsMetaExternalIdsUpdate updateNoteMap(ExternalIdUpdater updater)
-      throws IOException, ConfigInvalidException, OrmException {
-    try {
-      return retryer.call(
-          () -> {
-            try (Repository repo = repoManager.openRepository(allUsersName);
-                ObjectInserter ins = repo.newObjectInserter()) {
-              ObjectId rev = readRevision(repo);
-
-              afterReadRevision.run();
-
-              try (RevWalk rw = new RevWalk(repo)) {
-                NoteMap noteMap = readNoteMap(rw, rev);
-                UpdatedExternalIds updatedExtIds =
-                    updater.update(OpenRepo.create(repo, rw, ins, noteMap));
-
-                return commit(repo, rw, ins, rev, noteMap, updatedExtIds);
-              }
-            }
-          });
-    } catch (ExecutionException | RetryException e) {
-      if (e.getCause() != null) {
-        Throwables.throwIfInstanceOf(e.getCause(), IOException.class);
-        Throwables.throwIfInstanceOf(e.getCause(), ConfigInvalidException.class);
-        Throwables.throwIfInstanceOf(e.getCause(), OrmException.class);
-      }
-      throw new OrmException(e);
-    }
-  }
-
-  private RefsMetaExternalIdsUpdate commit(
-      Repository repo,
-      RevWalk rw,
-      ObjectInserter ins,
-      ObjectId rev,
-      NoteMap noteMap,
-      UpdatedExternalIds updatedExtIds)
-      throws IOException {
-    ObjectId newRev =
-        commit(
-            allUsersName,
-            repo,
-            rw,
-            ins,
-            rev,
-            noteMap,
-            COMMIT_MSG,
-            committerIdent,
-            authorIdent,
-            currentUser,
-            gitRefUpdated);
-    updateCount.increment();
-    return RefsMetaExternalIdsUpdate.create(rev, newRev, updatedExtIds);
-  }
-
-  /** Commits updates to the external IDs. */
-  public static ObjectId commit(
-      Project.NameKey project,
-      Repository repo,
-      RevWalk rw,
-      ObjectInserter ins,
-      ObjectId rev,
-      NoteMap noteMap,
-      String commitMessage,
-      PersonIdent committerIdent,
-      PersonIdent authorIdent,
-      @Nullable IdentifiedUser user,
-      GitReferenceUpdated gitRefUpdated)
-      throws IOException {
-    CommitBuilder cb = new CommitBuilder();
-    cb.setMessage(commitMessage);
-    cb.setTreeId(noteMap.writeTree(ins));
-    cb.setAuthor(authorIdent);
-    cb.setCommitter(committerIdent);
-    if (!rev.equals(ObjectId.zeroId())) {
-      cb.setParentId(rev);
-    } else {
-      cb.setParentIds(); // Ref is currently nonexistent, commit has no parents.
-    }
-    if (cb.getTreeId() == null) {
-      if (rev.equals(ObjectId.zeroId())) {
-        cb.setTreeId(emptyTree(ins)); // No parent, assume empty tree.
-      } else {
-        RevCommit p = rw.parseCommit(rev);
-        cb.setTreeId(p.getTree()); // Copy tree from parent.
-      }
-    }
-    ObjectId commitId = ins.insert(cb);
-    ins.flush();
-
-    RefUpdate u = repo.updateRef(RefNames.REFS_EXTERNAL_IDS);
-    u.setRefLogIdent(committerIdent);
-    u.setRefLogMessage("Update external IDs", false);
-    u.setExpectedOldObjectId(rev);
-    u.setNewObjectId(commitId);
-    RefUpdate.Result res = u.update();
-    switch (res) {
-      case NEW:
-      case FAST_FORWARD:
-      case NO_CHANGE:
-      case RENAMED:
-      case FORCED:
-        break;
-      case LOCK_FAILURE:
-        throw new LockFailureException("Updating external IDs failed with " + res, u);
-      case IO_FAILURE:
-      case NOT_ATTEMPTED:
-      case REJECTED:
-      case REJECTED_CURRENT_BRANCH:
-      case REJECTED_MISSING_OBJECT:
-      case REJECTED_OTHER_REASON:
-      default:
-        throw new IOException("Updating external IDs failed with " + res);
-    }
-    gitRefUpdated.fire(project, u, user != null ? user.getAccount() : null);
-    return rw.parseCommit(commitId);
-  }
-
-  private static ObjectId emptyTree(ObjectInserter ins) throws IOException {
-    return ins.insert(OBJ_TREE, new byte[] {});
-  }
-
-  private void evictAccount(Account.Id accountId) throws IOException {
-    if (accountCache != null) {
-      accountCache.evict(accountId);
-    }
-  }
-
-  private void evictAccounts(RefsMetaExternalIdsUpdate u) throws IOException {
-    if (accountCache != null) {
-      for (Account.Id id : u.updatedExtIds().all().map(ExternalId::accountId).collect(toSet())) {
-        accountCache.evict(id);
-      }
-    }
-  }
-
-  @FunctionalInterface
-  private static interface ExternalIdUpdater {
-    UpdatedExternalIds update(OpenRepo openRepo)
-        throws IOException, ConfigInvalidException, OrmException;
-  }
-
-  @AutoValue
-  abstract static class OpenRepo {
-    static OpenRepo create(Repository repo, RevWalk rw, ObjectInserter ins, NoteMap noteMap) {
-      return new AutoValue_ExternalIdsUpdate_OpenRepo(repo, rw, ins, noteMap);
-    }
-
-    abstract Repository repo();
-
-    abstract RevWalk rw();
-
-    abstract ObjectInserter ins();
-
-    abstract NoteMap noteMap();
-  }
-
-  @VisibleForTesting
-  @AutoValue
-  public abstract static class RefsMetaExternalIdsUpdate {
-    static RefsMetaExternalIdsUpdate create(
-        ObjectId oldRev, ObjectId newRev, UpdatedExternalIds updatedExtIds) {
-      return new AutoValue_ExternalIdsUpdate_RefsMetaExternalIdsUpdate(
-          oldRev, newRev, updatedExtIds);
-    }
-
-    abstract ObjectId oldRev();
-
-    abstract ObjectId newRev();
-
-    abstract UpdatedExternalIds updatedExtIds();
-  }
-
-  public static class UpdatedExternalIds {
-    private Set<ExternalId> updated = new HashSet<>();
-    private Set<ExternalId> removed = new HashSet<>();
-
-    public void onUpdate(ExternalId extId) {
-      if (extId != null) {
-        updated.add(extId);
-      }
-    }
-
-    public void onRemove(ExternalId extId) {
-      if (extId != null) {
-        removed.add(extId);
-      }
-    }
-
-    public Set<ExternalId> getUpdated() {
-      return ImmutableSet.copyOf(updated);
-    }
-
-    public Set<ExternalId> getRemoved() {
-      return ImmutableSet.copyOf(removed);
-    }
-
-    public Stream<ExternalId> all() {
-      return Streams.concat(removed.stream(), updated.stream());
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/Module.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/Module.java
deleted file mode 100644
index 6214129..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/Module.java
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.api;
-
-import com.google.gerrit.extensions.api.GerritApi;
-import com.google.inject.AbstractModule;
-
-public class Module extends AbstractModule {
-  @Override
-  protected void configure() {
-    bind(GerritApi.class).to(GerritApiImpl.class);
-
-    install(new com.google.gerrit.server.api.accounts.Module());
-    install(new com.google.gerrit.server.api.changes.Module());
-    install(new com.google.gerrit.server.api.config.Module());
-    install(new com.google.gerrit.server.api.groups.Module());
-    install(new com.google.gerrit.server.api.projects.Module());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountApiImpl.java
deleted file mode 100644
index d7952f8..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountApiImpl.java
+++ /dev/null
@@ -1,531 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.api.accounts;
-
-import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
-import static javax.servlet.http.HttpServletResponse.SC_OK;
-
-import com.google.gerrit.common.RawInputUtil;
-import com.google.gerrit.extensions.api.accounts.AccountApi;
-import com.google.gerrit.extensions.api.accounts.EmailInput;
-import com.google.gerrit.extensions.api.accounts.GpgKeyApi;
-import com.google.gerrit.extensions.api.changes.StarsInput;
-import com.google.gerrit.extensions.client.DiffPreferencesInfo;
-import com.google.gerrit.extensions.client.EditPreferencesInfo;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
-import com.google.gerrit.extensions.client.ProjectWatchInfo;
-import com.google.gerrit.extensions.common.AccountExternalIdInfo;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.AgreementInfo;
-import com.google.gerrit.extensions.common.AgreementInput;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.EmailInfo;
-import com.google.gerrit.extensions.common.GpgKeyInfo;
-import com.google.gerrit.extensions.common.GroupInfo;
-import com.google.gerrit.extensions.common.SshKeyInfo;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.server.account.AccountLoader;
-import com.google.gerrit.server.account.AccountResource;
-import com.google.gerrit.server.account.AddSshKey;
-import com.google.gerrit.server.account.CreateEmail;
-import com.google.gerrit.server.account.DeleteActive;
-import com.google.gerrit.server.account.DeleteEmail;
-import com.google.gerrit.server.account.DeleteExternalIds;
-import com.google.gerrit.server.account.DeleteSshKey;
-import com.google.gerrit.server.account.DeleteWatchedProjects;
-import com.google.gerrit.server.account.GetActive;
-import com.google.gerrit.server.account.GetAgreements;
-import com.google.gerrit.server.account.GetAvatar;
-import com.google.gerrit.server.account.GetDiffPreferences;
-import com.google.gerrit.server.account.GetEditPreferences;
-import com.google.gerrit.server.account.GetEmails;
-import com.google.gerrit.server.account.GetExternalIds;
-import com.google.gerrit.server.account.GetGroups;
-import com.google.gerrit.server.account.GetPreferences;
-import com.google.gerrit.server.account.GetSshKeys;
-import com.google.gerrit.server.account.GetWatchedProjects;
-import com.google.gerrit.server.account.Index;
-import com.google.gerrit.server.account.PostWatchedProjects;
-import com.google.gerrit.server.account.PutActive;
-import com.google.gerrit.server.account.PutAgreement;
-import com.google.gerrit.server.account.PutName;
-import com.google.gerrit.server.account.PutStatus;
-import com.google.gerrit.server.account.SetDiffPreferences;
-import com.google.gerrit.server.account.SetEditPreferences;
-import com.google.gerrit.server.account.SetPreferences;
-import com.google.gerrit.server.account.SshKeys;
-import com.google.gerrit.server.account.StarredChanges;
-import com.google.gerrit.server.account.Stars;
-import com.google.gerrit.server.change.ChangeResource;
-import com.google.gerrit.server.change.ChangesCollection;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.util.List;
-import java.util.Map;
-import java.util.SortedSet;
-
-public class AccountApiImpl implements AccountApi {
-  interface Factory {
-    AccountApiImpl create(AccountResource account);
-  }
-
-  private final AccountResource account;
-  private final ChangesCollection changes;
-  private final AccountLoader.Factory accountLoaderFactory;
-  private final GetAvatar getAvatar;
-  private final GetPreferences getPreferences;
-  private final SetPreferences setPreferences;
-  private final GetDiffPreferences getDiffPreferences;
-  private final SetDiffPreferences setDiffPreferences;
-  private final GetEditPreferences getEditPreferences;
-  private final SetEditPreferences setEditPreferences;
-  private final GetWatchedProjects getWatchedProjects;
-  private final PostWatchedProjects postWatchedProjects;
-  private final DeleteWatchedProjects deleteWatchedProjects;
-  private final StarredChanges.Create starredChangesCreate;
-  private final StarredChanges.Delete starredChangesDelete;
-  private final Stars stars;
-  private final Stars.Get starsGet;
-  private final Stars.Post starsPost;
-  private final GetEmails getEmails;
-  private final CreateEmail.Factory createEmailFactory;
-  private final DeleteEmail deleteEmail;
-  private final GpgApiAdapter gpgApiAdapter;
-  private final GetSshKeys getSshKeys;
-  private final AddSshKey addSshKey;
-  private final DeleteSshKey deleteSshKey;
-  private final SshKeys sshKeys;
-  private final GetAgreements getAgreements;
-  private final PutAgreement putAgreement;
-  private final GetActive getActive;
-  private final PutActive putActive;
-  private final DeleteActive deleteActive;
-  private final Index index;
-  private final GetExternalIds getExternalIds;
-  private final DeleteExternalIds deleteExternalIds;
-  private final PutStatus putStatus;
-  private final GetGroups getGroups;
-  private final PutName putName;
-
-  @Inject
-  AccountApiImpl(
-      AccountLoader.Factory ailf,
-      ChangesCollection changes,
-      GetAvatar getAvatar,
-      GetPreferences getPreferences,
-      SetPreferences setPreferences,
-      GetDiffPreferences getDiffPreferences,
-      SetDiffPreferences setDiffPreferences,
-      GetEditPreferences getEditPreferences,
-      SetEditPreferences setEditPreferences,
-      GetWatchedProjects getWatchedProjects,
-      PostWatchedProjects postWatchedProjects,
-      DeleteWatchedProjects deleteWatchedProjects,
-      StarredChanges.Create starredChangesCreate,
-      StarredChanges.Delete starredChangesDelete,
-      Stars stars,
-      Stars.Get starsGet,
-      Stars.Post starsPost,
-      GetEmails getEmails,
-      CreateEmail.Factory createEmailFactory,
-      DeleteEmail deleteEmail,
-      GpgApiAdapter gpgApiAdapter,
-      GetSshKeys getSshKeys,
-      AddSshKey addSshKey,
-      DeleteSshKey deleteSshKey,
-      SshKeys sshKeys,
-      GetAgreements getAgreements,
-      PutAgreement putAgreement,
-      GetActive getActive,
-      PutActive putActive,
-      DeleteActive deleteActive,
-      Index index,
-      GetExternalIds getExternalIds,
-      DeleteExternalIds deleteExternalIds,
-      PutStatus putStatus,
-      GetGroups getGroups,
-      PutName putName,
-      @Assisted AccountResource account) {
-    this.account = account;
-    this.accountLoaderFactory = ailf;
-    this.changes = changes;
-    this.getAvatar = getAvatar;
-    this.getPreferences = getPreferences;
-    this.setPreferences = setPreferences;
-    this.getDiffPreferences = getDiffPreferences;
-    this.setDiffPreferences = setDiffPreferences;
-    this.getEditPreferences = getEditPreferences;
-    this.setEditPreferences = setEditPreferences;
-    this.getWatchedProjects = getWatchedProjects;
-    this.postWatchedProjects = postWatchedProjects;
-    this.deleteWatchedProjects = deleteWatchedProjects;
-    this.starredChangesCreate = starredChangesCreate;
-    this.starredChangesDelete = starredChangesDelete;
-    this.stars = stars;
-    this.starsGet = starsGet;
-    this.starsPost = starsPost;
-    this.getEmails = getEmails;
-    this.createEmailFactory = createEmailFactory;
-    this.deleteEmail = deleteEmail;
-    this.getSshKeys = getSshKeys;
-    this.addSshKey = addSshKey;
-    this.deleteSshKey = deleteSshKey;
-    this.sshKeys = sshKeys;
-    this.gpgApiAdapter = gpgApiAdapter;
-    this.getAgreements = getAgreements;
-    this.putAgreement = putAgreement;
-    this.getActive = getActive;
-    this.putActive = putActive;
-    this.deleteActive = deleteActive;
-    this.index = index;
-    this.getExternalIds = getExternalIds;
-    this.deleteExternalIds = deleteExternalIds;
-    this.putStatus = putStatus;
-    this.getGroups = getGroups;
-    this.putName = putName;
-  }
-
-  @Override
-  public com.google.gerrit.extensions.common.AccountInfo get() throws RestApiException {
-    AccountLoader accountLoader = accountLoaderFactory.create(true);
-    try {
-      AccountInfo ai = accountLoader.get(account.getUser().getAccountId());
-      accountLoader.fill();
-      return ai;
-    } catch (Exception e) {
-      throw asRestApiException("Cannot parse account", e);
-    }
-  }
-
-  @Override
-  public boolean getActive() throws RestApiException {
-    Response<String> result = getActive.apply(account);
-    return result.statusCode() == SC_OK && result.value().equals("ok");
-  }
-
-  @Override
-  public void setActive(boolean active) throws RestApiException {
-    try {
-      if (active) {
-        putActive.apply(account, new PutActive.Input());
-      } else {
-        deleteActive.apply(account, new DeleteActive.Input());
-      }
-    } catch (Exception e) {
-      throw asRestApiException("Cannot set active", e);
-    }
-  }
-
-  @Override
-  public String getAvatarUrl(int size) throws RestApiException {
-    getAvatar.setSize(size);
-    return getAvatar.apply(account).location();
-  }
-
-  @Override
-  public GeneralPreferencesInfo getPreferences() throws RestApiException {
-    try {
-      return getPreferences.apply(account);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot get preferences", e);
-    }
-  }
-
-  @Override
-  public GeneralPreferencesInfo setPreferences(GeneralPreferencesInfo in) throws RestApiException {
-    try {
-      return setPreferences.apply(account, in);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot set preferences", e);
-    }
-  }
-
-  @Override
-  public DiffPreferencesInfo getDiffPreferences() throws RestApiException {
-    try {
-      return getDiffPreferences.apply(account);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot query diff preferences", e);
-    }
-  }
-
-  @Override
-  public DiffPreferencesInfo setDiffPreferences(DiffPreferencesInfo in) throws RestApiException {
-    try {
-      return setDiffPreferences.apply(account, in);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot set diff preferences", e);
-    }
-  }
-
-  @Override
-  public EditPreferencesInfo getEditPreferences() throws RestApiException {
-    try {
-      return getEditPreferences.apply(account);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot query edit preferences", e);
-    }
-  }
-
-  @Override
-  public EditPreferencesInfo setEditPreferences(EditPreferencesInfo in) throws RestApiException {
-    try {
-      return setEditPreferences.apply(account, in);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot set edit preferences", e);
-    }
-  }
-
-  @Override
-  public List<ProjectWatchInfo> getWatchedProjects() throws RestApiException {
-    try {
-      return getWatchedProjects.apply(account);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot get watched projects", e);
-    }
-  }
-
-  @Override
-  public List<ProjectWatchInfo> setWatchedProjects(List<ProjectWatchInfo> in)
-      throws RestApiException {
-    try {
-      return postWatchedProjects.apply(account, in);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot update watched projects", e);
-    }
-  }
-
-  @Override
-  public void deleteWatchedProjects(List<ProjectWatchInfo> in) throws RestApiException {
-    try {
-      deleteWatchedProjects.apply(account, in);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot delete watched projects", e);
-    }
-  }
-
-  @Override
-  public void starChange(String changeId) throws RestApiException {
-    try {
-      ChangeResource rsrc = changes.parse(TopLevelResource.INSTANCE, IdString.fromUrl(changeId));
-      starredChangesCreate.setChange(rsrc);
-      starredChangesCreate.apply(account, new StarredChanges.EmptyInput());
-    } catch (Exception e) {
-      throw asRestApiException("Cannot star change", e);
-    }
-  }
-
-  @Override
-  public void unstarChange(String changeId) throws RestApiException {
-    try {
-      ChangeResource rsrc = changes.parse(TopLevelResource.INSTANCE, IdString.fromUrl(changeId));
-      AccountResource.StarredChange starredChange =
-          new AccountResource.StarredChange(account.getUser(), rsrc);
-      starredChangesDelete.apply(starredChange, new StarredChanges.EmptyInput());
-    } catch (Exception e) {
-      throw asRestApiException("Cannot unstar change", e);
-    }
-  }
-
-  @Override
-  public void setStars(String changeId, StarsInput input) throws RestApiException {
-    try {
-      AccountResource.Star rsrc = stars.parse(account, IdString.fromUrl(changeId));
-      starsPost.apply(rsrc, input);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot post stars", e);
-    }
-  }
-
-  @Override
-  public SortedSet<String> getStars(String changeId) throws RestApiException {
-    try {
-      AccountResource.Star rsrc = stars.parse(account, IdString.fromUrl(changeId));
-      return starsGet.apply(rsrc);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot get stars", e);
-    }
-  }
-
-  @Override
-  public List<ChangeInfo> getStarredChanges() throws RestApiException {
-    try {
-      return stars.list().apply(account);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot get starred changes", e);
-    }
-  }
-
-  @Override
-  public List<GroupInfo> getGroups() throws RestApiException {
-    try {
-      return getGroups.apply(account);
-    } catch (OrmException e) {
-      throw asRestApiException("Cannot get groups", e);
-    }
-  }
-
-  @Override
-  public List<EmailInfo> getEmails() {
-    return getEmails.apply(account);
-  }
-
-  @Override
-  public void addEmail(EmailInput input) throws RestApiException {
-    AccountResource.Email rsrc = new AccountResource.Email(account.getUser(), input.email);
-    try {
-      createEmailFactory.create(input.email).apply(rsrc, input);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot add email", e);
-    }
-  }
-
-  @Override
-  public void deleteEmail(String email) throws RestApiException {
-    AccountResource.Email rsrc = new AccountResource.Email(account.getUser(), email);
-    try {
-      deleteEmail.apply(rsrc, null);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot delete email", e);
-    }
-  }
-
-  @Override
-  public void setStatus(String status) throws RestApiException {
-    PutStatus.Input in = new PutStatus.Input(status);
-    try {
-      putStatus.apply(account, in);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot set status", e);
-    }
-  }
-
-  @Override
-  public List<SshKeyInfo> listSshKeys() throws RestApiException {
-    try {
-      return getSshKeys.apply(account);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot list SSH keys", e);
-    }
-  }
-
-  @Override
-  public SshKeyInfo addSshKey(String key) throws RestApiException {
-    AddSshKey.Input in = new AddSshKey.Input();
-    in.raw = RawInputUtil.create(key);
-    try {
-      return addSshKey.apply(account, in).value();
-    } catch (Exception e) {
-      throw asRestApiException("Cannot add SSH key", e);
-    }
-  }
-
-  @Override
-  public void deleteSshKey(int seq) throws RestApiException {
-    try {
-      AccountResource.SshKey sshKeyRes =
-          sshKeys.parse(account, IdString.fromDecoded(Integer.toString(seq)));
-      deleteSshKey.apply(sshKeyRes, null);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot delete SSH key", e);
-    }
-  }
-
-  @Override
-  public Map<String, GpgKeyInfo> listGpgKeys() throws RestApiException {
-    try {
-      return gpgApiAdapter.listGpgKeys(account);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot list GPG keys", e);
-    }
-  }
-
-  @Override
-  public Map<String, GpgKeyInfo> putGpgKeys(List<String> add, List<String> delete)
-      throws RestApiException {
-    try {
-      return gpgApiAdapter.putGpgKeys(account, add, delete);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot add GPG key", e);
-    }
-  }
-
-  @Override
-  public GpgKeyApi gpgKey(String id) throws RestApiException {
-    try {
-      return gpgApiAdapter.gpgKey(account, IdString.fromDecoded(id));
-    } catch (Exception e) {
-      throw asRestApiException("Cannot get PGP key", e);
-    }
-  }
-
-  @Override
-  public List<AgreementInfo> listAgreements() throws RestApiException {
-    return getAgreements.apply(account);
-  }
-
-  @Override
-  public void signAgreement(String agreementName) throws RestApiException {
-    try {
-      AgreementInput input = new AgreementInput();
-      input.name = agreementName;
-      putAgreement.apply(account, input);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot sign agreement", e);
-    }
-  }
-
-  @Override
-  public void index() throws RestApiException {
-    try {
-      index.apply(account, new Index.Input());
-    } catch (Exception e) {
-      throw asRestApiException("Cannot index account", e);
-    }
-  }
-
-  @Override
-  public List<AccountExternalIdInfo> getExternalIds() throws RestApiException {
-    try {
-      return getExternalIds.apply(account);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot get external IDs", e);
-    }
-  }
-
-  @Override
-  public void deleteExternalIds(List<String> externalIds) throws RestApiException {
-    try {
-      deleteExternalIds.apply(account, externalIds);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot delete external IDs", e);
-    }
-  }
-
-  @Override
-  public void setName(String name) throws RestApiException {
-    PutName.Input input = new PutName.Input();
-    input.name = name;
-    try {
-      putName.apply(account, input);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot set account name", e);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountExternalIdCreator.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountExternalIdCreator.java
deleted file mode 100644
index 2f8dee6..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountExternalIdCreator.java
+++ /dev/null
@@ -1,32 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.api.accounts;
-
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import java.util.List;
-
-public interface AccountExternalIdCreator {
-
-  /**
-   * Returns additional external identifiers to assign to a given user when creating an account.
-   *
-   * @param id the identifier of the account.
-   * @param username the name of the user.
-   * @param email an optional email address to assign to the external identifiers, or {@code null}.
-   * @return a list of external identifiers, or an empty list.
-   */
-  List<ExternalId> create(Account.Id id, String username, String email);
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountInfoComparator.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountInfoComparator.java
deleted file mode 100644
index 7c468fc..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountInfoComparator.java
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.api.accounts;
-
-import com.google.common.collect.ComparisonChain;
-import com.google.common.collect.Ordering;
-import com.google.gerrit.extensions.common.AccountInfo;
-import java.util.Comparator;
-
-public class AccountInfoComparator extends Ordering<AccountInfo>
-    implements Comparator<AccountInfo> {
-  public static final AccountInfoComparator ORDER_NULLS_FIRST = new AccountInfoComparator();
-  public static final AccountInfoComparator ORDER_NULLS_LAST =
-      new AccountInfoComparator().setNullsLast();
-
-  private boolean nullsLast;
-
-  private AccountInfoComparator() {}
-
-  private AccountInfoComparator setNullsLast() {
-    this.nullsLast = true;
-    return this;
-  }
-
-  @Override
-  public int compare(AccountInfo a, AccountInfo b) {
-    return ComparisonChain.start()
-        .compare(a.name, b.name, createOrdering())
-        .compare(a.email, b.email, createOrdering())
-        .compare(a._accountId, b._accountId, createOrdering())
-        .result();
-  }
-
-  private <S extends Comparable<?>> Ordering<S> createOrdering() {
-    if (nullsLast) {
-      return Ordering.natural().nullsLast();
-    }
-    return Ordering.natural().nullsFirst();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountsImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountsImpl.java
deleted file mode 100644
index 5257aec..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountsImpl.java
+++ /dev/null
@@ -1,167 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.api.accounts;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
-
-import com.google.gerrit.extensions.api.accounts.AccountApi;
-import com.google.gerrit.extensions.api.accounts.AccountInput;
-import com.google.gerrit.extensions.api.accounts.Accounts;
-import com.google.gerrit.extensions.client.ListAccountsOption;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.account.AccountResource;
-import com.google.gerrit.server.account.AccountsCollection;
-import com.google.gerrit.server.account.CreateAccount;
-import com.google.gerrit.server.account.QueryAccounts;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.List;
-
-@Singleton
-public class AccountsImpl implements Accounts {
-  private final AccountsCollection accounts;
-  private final AccountApiImpl.Factory api;
-  private final PermissionBackend permissionBackend;
-  private final Provider<CurrentUser> self;
-  private final CreateAccount.Factory createAccount;
-  private final Provider<QueryAccounts> queryAccountsProvider;
-
-  @Inject
-  AccountsImpl(
-      AccountsCollection accounts,
-      AccountApiImpl.Factory api,
-      PermissionBackend permissionBackend,
-      Provider<CurrentUser> self,
-      CreateAccount.Factory createAccount,
-      Provider<QueryAccounts> queryAccountsProvider) {
-    this.accounts = accounts;
-    this.api = api;
-    this.permissionBackend = permissionBackend;
-    this.self = self;
-    this.createAccount = createAccount;
-    this.queryAccountsProvider = queryAccountsProvider;
-  }
-
-  @Override
-  public AccountApi id(String id) throws RestApiException {
-    try {
-      return api.create(accounts.parse(TopLevelResource.INSTANCE, IdString.fromDecoded(id)));
-    } catch (Exception e) {
-      throw asRestApiException("Cannot parse change", e);
-    }
-  }
-
-  @Override
-  public AccountApi id(int id) throws RestApiException {
-    return id(String.valueOf(id));
-  }
-
-  @Override
-  public AccountApi self() throws RestApiException {
-    if (!self.get().isIdentifiedUser()) {
-      throw new AuthException("Authentication required");
-    }
-    return api.create(new AccountResource(self.get().asIdentifiedUser()));
-  }
-
-  @Override
-  public AccountApi create(String username) throws RestApiException {
-    AccountInput in = new AccountInput();
-    in.username = username;
-    return create(in);
-  }
-
-  @Override
-  public AccountApi create(AccountInput in) throws RestApiException {
-    if (checkNotNull(in, "AccountInput").username == null) {
-      throw new BadRequestException("AccountInput must specify username");
-    }
-    try {
-      CreateAccount impl = createAccount.create(in.username);
-      permissionBackend.user(self).checkAny(GlobalPermission.fromAnnotation(impl.getClass()));
-      AccountInfo info = impl.apply(TopLevelResource.INSTANCE, in).value();
-      return id(info._accountId);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot create account " + in.username, e);
-    }
-  }
-
-  @Override
-  public SuggestAccountsRequest suggestAccounts() throws RestApiException {
-    return new SuggestAccountsRequest() {
-      @Override
-      public List<AccountInfo> get() throws RestApiException {
-        return AccountsImpl.this.suggestAccounts(this);
-      }
-    };
-  }
-
-  @Override
-  public SuggestAccountsRequest suggestAccounts(String query) throws RestApiException {
-    return suggestAccounts().withQuery(query);
-  }
-
-  private List<AccountInfo> suggestAccounts(SuggestAccountsRequest r) throws RestApiException {
-    try {
-      QueryAccounts myQueryAccounts = queryAccountsProvider.get();
-      myQueryAccounts.setSuggest(true);
-      myQueryAccounts.setQuery(r.getQuery());
-      myQueryAccounts.setLimit(r.getLimit());
-      return myQueryAccounts.apply(TopLevelResource.INSTANCE);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve suggested accounts", e);
-    }
-  }
-
-  @Override
-  public QueryRequest query() throws RestApiException {
-    return new QueryRequest() {
-      @Override
-      public List<AccountInfo> get() throws RestApiException {
-        return AccountsImpl.this.query(this);
-      }
-    };
-  }
-
-  @Override
-  public QueryRequest query(String query) throws RestApiException {
-    return query().withQuery(query);
-  }
-
-  private List<AccountInfo> query(QueryRequest r) throws RestApiException {
-    try {
-      QueryAccounts myQueryAccounts = queryAccountsProvider.get();
-      myQueryAccounts.setQuery(r.getQuery());
-      myQueryAccounts.setLimit(r.getLimit());
-      myQueryAccounts.setStart(r.getStart());
-      for (ListAccountsOption option : r.getOptions()) {
-        myQueryAccounts.addOption(option);
-      }
-      return myQueryAccounts.apply(TopLevelResource.INSTANCE);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve suggested accounts", e);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/GpgApiAdapter.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/GpgApiAdapter.java
deleted file mode 100644
index 7def6fa..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/GpgApiAdapter.java
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.api.accounts;
-
-import com.google.gerrit.extensions.api.accounts.GpgKeyApi;
-import com.google.gerrit.extensions.common.GpgKeyInfo;
-import com.google.gerrit.extensions.common.PushCertificateInfo;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.server.GpgException;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountResource;
-import java.util.List;
-import java.util.Map;
-
-public interface GpgApiAdapter {
-  boolean isEnabled();
-
-  Map<String, GpgKeyInfo> listGpgKeys(AccountResource account)
-      throws RestApiException, GpgException;
-
-  Map<String, GpgKeyInfo> putGpgKeys(AccountResource account, List<String> add, List<String> delete)
-      throws RestApiException, GpgException;
-
-  GpgKeyApi gpgKey(AccountResource account, IdString idStr) throws RestApiException, GpgException;
-
-  PushCertificateInfo checkPushCertificate(String certStr, IdentifiedUser expectedUser)
-      throws GpgException;
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/Module.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/Module.java
deleted file mode 100644
index 935c4d7..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/Module.java
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.api.accounts;
-
-import com.google.gerrit.extensions.api.accounts.Accounts;
-import com.google.gerrit.extensions.config.FactoryModule;
-
-public class Module extends FactoryModule {
-  @Override
-  protected void configure() {
-    bind(Accounts.class).to(AccountsImpl.class);
-
-    factory(AccountApiImpl.Factory.class);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java
deleted file mode 100644
index 447fdf4..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java
+++ /dev/null
@@ -1,722 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.api.changes;
-
-import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.api.changes.AbandonInput;
-import com.google.gerrit.extensions.api.changes.AddReviewerInput;
-import com.google.gerrit.extensions.api.changes.AddReviewerResult;
-import com.google.gerrit.extensions.api.changes.AssigneeInput;
-import com.google.gerrit.extensions.api.changes.ChangeApi;
-import com.google.gerrit.extensions.api.changes.ChangeEditApi;
-import com.google.gerrit.extensions.api.changes.Changes;
-import com.google.gerrit.extensions.api.changes.FixInput;
-import com.google.gerrit.extensions.api.changes.HashtagsInput;
-import com.google.gerrit.extensions.api.changes.IncludedInInfo;
-import com.google.gerrit.extensions.api.changes.MoveInput;
-import com.google.gerrit.extensions.api.changes.RebaseInput;
-import com.google.gerrit.extensions.api.changes.RestoreInput;
-import com.google.gerrit.extensions.api.changes.RevertInput;
-import com.google.gerrit.extensions.api.changes.ReviewerApi;
-import com.google.gerrit.extensions.api.changes.ReviewerInfo;
-import com.google.gerrit.extensions.api.changes.RevisionApi;
-import com.google.gerrit.extensions.api.changes.SubmittedTogetherInfo;
-import com.google.gerrit.extensions.api.changes.SubmittedTogetherOption;
-import com.google.gerrit.extensions.client.ListChangesOption;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.CommentInfo;
-import com.google.gerrit.extensions.common.CommitMessageInput;
-import com.google.gerrit.extensions.common.EditInfo;
-import com.google.gerrit.extensions.common.MergePatchSetInput;
-import com.google.gerrit.extensions.common.PureRevertInfo;
-import com.google.gerrit.extensions.common.RobotCommentInfo;
-import com.google.gerrit.extensions.common.SuggestedReviewerInfo;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.server.StarredChangesUtil;
-import com.google.gerrit.server.StarredChangesUtil.IllegalLabelException;
-import com.google.gerrit.server.change.Abandon;
-import com.google.gerrit.server.change.ChangeIncludedIn;
-import com.google.gerrit.server.change.ChangeJson;
-import com.google.gerrit.server.change.ChangeResource;
-import com.google.gerrit.server.change.Check;
-import com.google.gerrit.server.change.CreateMergePatchSet;
-import com.google.gerrit.server.change.DeleteAssignee;
-import com.google.gerrit.server.change.DeleteChange;
-import com.google.gerrit.server.change.DeletePrivate;
-import com.google.gerrit.server.change.GetAssignee;
-import com.google.gerrit.server.change.GetHashtags;
-import com.google.gerrit.server.change.GetPastAssignees;
-import com.google.gerrit.server.change.GetPureRevert;
-import com.google.gerrit.server.change.GetTopic;
-import com.google.gerrit.server.change.Ignore;
-import com.google.gerrit.server.change.Index;
-import com.google.gerrit.server.change.ListChangeComments;
-import com.google.gerrit.server.change.ListChangeDrafts;
-import com.google.gerrit.server.change.ListChangeRobotComments;
-import com.google.gerrit.server.change.ListReviewers;
-import com.google.gerrit.server.change.MarkAsReviewed;
-import com.google.gerrit.server.change.MarkAsUnreviewed;
-import com.google.gerrit.server.change.Move;
-import com.google.gerrit.server.change.PostHashtags;
-import com.google.gerrit.server.change.PostPrivate;
-import com.google.gerrit.server.change.PostReviewers;
-import com.google.gerrit.server.change.PutAssignee;
-import com.google.gerrit.server.change.PutMessage;
-import com.google.gerrit.server.change.PutTopic;
-import com.google.gerrit.server.change.Rebase;
-import com.google.gerrit.server.change.Restore;
-import com.google.gerrit.server.change.Revert;
-import com.google.gerrit.server.change.Reviewers;
-import com.google.gerrit.server.change.Revisions;
-import com.google.gerrit.server.change.SetPrivateOp;
-import com.google.gerrit.server.change.SetReadyForReview;
-import com.google.gerrit.server.change.SetWorkInProgress;
-import com.google.gerrit.server.change.SubmittedTogether;
-import com.google.gerrit.server.change.SuggestChangeReviewers;
-import com.google.gerrit.server.change.Unignore;
-import com.google.gerrit.server.change.WorkInProgressOp;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import java.util.EnumSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-class ChangeApiImpl implements ChangeApi {
-  interface Factory {
-    ChangeApiImpl create(ChangeResource change);
-  }
-
-  private final Changes changeApi;
-  private final Reviewers reviewers;
-  private final Revisions revisions;
-  private final ReviewerApiImpl.Factory reviewerApi;
-  private final RevisionApiImpl.Factory revisionApi;
-  private final SuggestChangeReviewers suggestReviewers;
-  private final ListReviewers listReviewers;
-  private final ChangeResource change;
-  private final Abandon abandon;
-  private final Revert revert;
-  private final Restore restore;
-  private final CreateMergePatchSet updateByMerge;
-  private final Provider<SubmittedTogether> submittedTogether;
-  private final Rebase.CurrentRevision rebase;
-  private final DeleteChange deleteChange;
-  private final GetTopic getTopic;
-  private final PutTopic putTopic;
-  private final ChangeIncludedIn includedIn;
-  private final PostReviewers postReviewers;
-  private final ChangeJson.Factory changeJson;
-  private final PostHashtags postHashtags;
-  private final GetHashtags getHashtags;
-  private final PutAssignee putAssignee;
-  private final GetAssignee getAssignee;
-  private final GetPastAssignees getPastAssignees;
-  private final DeleteAssignee deleteAssignee;
-  private final ListChangeComments listComments;
-  private final ListChangeRobotComments listChangeRobotComments;
-  private final ListChangeDrafts listDrafts;
-  private final ChangeEditApiImpl.Factory changeEditApi;
-  private final Check check;
-  private final Index index;
-  private final Move move;
-  private final PostPrivate postPrivate;
-  private final DeletePrivate deletePrivate;
-  private final Ignore ignore;
-  private final Unignore unignore;
-  private final MarkAsReviewed markAsReviewed;
-  private final MarkAsUnreviewed markAsUnreviewed;
-  private final SetWorkInProgress setWip;
-  private final SetReadyForReview setReady;
-  private final PutMessage putMessage;
-  private final GetPureRevert getPureRevert;
-  private final StarredChangesUtil stars;
-
-  @Inject
-  ChangeApiImpl(
-      Changes changeApi,
-      Reviewers reviewers,
-      Revisions revisions,
-      ReviewerApiImpl.Factory reviewerApi,
-      RevisionApiImpl.Factory revisionApi,
-      SuggestChangeReviewers suggestReviewers,
-      ListReviewers listReviewers,
-      Abandon abandon,
-      Revert revert,
-      Restore restore,
-      CreateMergePatchSet updateByMerge,
-      Provider<SubmittedTogether> submittedTogether,
-      Rebase.CurrentRevision rebase,
-      DeleteChange deleteChange,
-      GetTopic getTopic,
-      PutTopic putTopic,
-      ChangeIncludedIn includedIn,
-      PostReviewers postReviewers,
-      ChangeJson.Factory changeJson,
-      PostHashtags postHashtags,
-      GetHashtags getHashtags,
-      PutAssignee putAssignee,
-      GetAssignee getAssignee,
-      GetPastAssignees getPastAssignees,
-      DeleteAssignee deleteAssignee,
-      ListChangeComments listComments,
-      ListChangeRobotComments listChangeRobotComments,
-      ListChangeDrafts listDrafts,
-      ChangeEditApiImpl.Factory changeEditApi,
-      Check check,
-      Index index,
-      Move move,
-      PostPrivate postPrivate,
-      DeletePrivate deletePrivate,
-      Ignore ignore,
-      Unignore unignore,
-      MarkAsReviewed markAsReviewed,
-      MarkAsUnreviewed markAsUnreviewed,
-      SetWorkInProgress setWip,
-      SetReadyForReview setReady,
-      PutMessage putMessage,
-      GetPureRevert getPureRevert,
-      StarredChangesUtil stars,
-      @Assisted ChangeResource change) {
-    this.changeApi = changeApi;
-    this.revert = revert;
-    this.reviewers = reviewers;
-    this.revisions = revisions;
-    this.reviewerApi = reviewerApi;
-    this.revisionApi = revisionApi;
-    this.suggestReviewers = suggestReviewers;
-    this.listReviewers = listReviewers;
-    this.abandon = abandon;
-    this.restore = restore;
-    this.updateByMerge = updateByMerge;
-    this.submittedTogether = submittedTogether;
-    this.rebase = rebase;
-    this.deleteChange = deleteChange;
-    this.getTopic = getTopic;
-    this.putTopic = putTopic;
-    this.includedIn = includedIn;
-    this.postReviewers = postReviewers;
-    this.changeJson = changeJson;
-    this.postHashtags = postHashtags;
-    this.getHashtags = getHashtags;
-    this.putAssignee = putAssignee;
-    this.getAssignee = getAssignee;
-    this.getPastAssignees = getPastAssignees;
-    this.deleteAssignee = deleteAssignee;
-    this.listComments = listComments;
-    this.listChangeRobotComments = listChangeRobotComments;
-    this.listDrafts = listDrafts;
-    this.changeEditApi = changeEditApi;
-    this.check = check;
-    this.index = index;
-    this.move = move;
-    this.postPrivate = postPrivate;
-    this.deletePrivate = deletePrivate;
-    this.ignore = ignore;
-    this.unignore = unignore;
-    this.markAsReviewed = markAsReviewed;
-    this.markAsUnreviewed = markAsUnreviewed;
-    this.setWip = setWip;
-    this.setReady = setReady;
-    this.putMessage = putMessage;
-    this.getPureRevert = getPureRevert;
-    this.stars = stars;
-    this.change = change;
-  }
-
-  @Override
-  public String id() {
-    return Integer.toString(change.getId().get());
-  }
-
-  @Override
-  public RevisionApi current() throws RestApiException {
-    return revision("current");
-  }
-
-  @Override
-  public RevisionApi revision(int id) throws RestApiException {
-    return revision(String.valueOf(id));
-  }
-
-  @Override
-  public RevisionApi revision(String id) throws RestApiException {
-    try {
-      return revisionApi.create(revisions.parse(change, IdString.fromDecoded(id)));
-    } catch (Exception e) {
-      throw asRestApiException("Cannot parse revision", e);
-    }
-  }
-
-  @Override
-  public ReviewerApi reviewer(String id) throws RestApiException {
-    try {
-      return reviewerApi.create(reviewers.parse(change, IdString.fromDecoded(id)));
-    } catch (Exception e) {
-      throw asRestApiException("Cannot parse reviewer", e);
-    }
-  }
-
-  @Override
-  public void abandon() throws RestApiException {
-    abandon(new AbandonInput());
-  }
-
-  @Override
-  public void abandon(AbandonInput in) throws RestApiException {
-    try {
-      abandon.apply(change, in);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot abandon change", e);
-    }
-  }
-
-  @Override
-  public void restore() throws RestApiException {
-    restore(new RestoreInput());
-  }
-
-  @Override
-  public void restore(RestoreInput in) throws RestApiException {
-    try {
-      restore.apply(change, in);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot restore change", e);
-    }
-  }
-
-  @Override
-  public void move(String destination) throws RestApiException {
-    MoveInput in = new MoveInput();
-    in.destinationBranch = destination;
-    move(in);
-  }
-
-  @Override
-  public void move(MoveInput in) throws RestApiException {
-    try {
-      move.apply(change, in);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot move change", e);
-    }
-  }
-
-  @Override
-  public void setPrivate(boolean value, @Nullable String message) throws RestApiException {
-    try {
-      SetPrivateOp.Input input = new SetPrivateOp.Input(message);
-      if (value) {
-        postPrivate.apply(change, input);
-      } else {
-        deletePrivate.apply(change, input);
-      }
-    } catch (Exception e) {
-      throw asRestApiException("Cannot change private status", e);
-    }
-  }
-
-  @Override
-  public void setWorkInProgress(@Nullable String message) throws RestApiException {
-    try {
-      setWip.apply(change, new WorkInProgressOp.Input(message));
-    } catch (Exception e) {
-      throw asRestApiException("Cannot set work in progress state", e);
-    }
-  }
-
-  @Override
-  public void setReadyForReview(@Nullable String message) throws RestApiException {
-    try {
-      setReady.apply(change, new WorkInProgressOp.Input(message));
-    } catch (Exception e) {
-      throw asRestApiException("Cannot set ready for review state", e);
-    }
-  }
-
-  @Override
-  public ChangeApi revert() throws RestApiException {
-    return revert(new RevertInput());
-  }
-
-  @Override
-  public ChangeApi revert(RevertInput in) throws RestApiException {
-    try {
-      return changeApi.id(revert.apply(change, in)._number);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot revert change", e);
-    }
-  }
-
-  @Override
-  public ChangeInfo createMergePatchSet(MergePatchSetInput in) throws RestApiException {
-    try {
-      return updateByMerge.apply(change, in).value();
-    } catch (Exception e) {
-      throw asRestApiException("Cannot update change by merge", e);
-    }
-  }
-
-  @Override
-  public List<ChangeInfo> submittedTogether() throws RestApiException {
-    SubmittedTogetherInfo info =
-        submittedTogether(
-            EnumSet.noneOf(ListChangesOption.class), EnumSet.noneOf(SubmittedTogetherOption.class));
-    return info.changes;
-  }
-
-  @Override
-  public SubmittedTogetherInfo submittedTogether(EnumSet<SubmittedTogetherOption> options)
-      throws RestApiException {
-    return submittedTogether(EnumSet.noneOf(ListChangesOption.class), options);
-  }
-
-  @Override
-  public SubmittedTogetherInfo submittedTogether(
-      EnumSet<ListChangesOption> listOptions, EnumSet<SubmittedTogetherOption> submitOptions)
-      throws RestApiException {
-    try {
-      return submittedTogether
-          .get()
-          .addListChangesOption(listOptions)
-          .addSubmittedTogetherOption(submitOptions)
-          .applyInfo(change);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot query submittedTogether", e);
-    }
-  }
-
-  @Deprecated
-  @Override
-  public void publish() throws RestApiException {
-    throw new UnsupportedOperationException("draft workflow is discontinued");
-  }
-
-  @Override
-  public void rebase() throws RestApiException {
-    rebase(new RebaseInput());
-  }
-
-  @Override
-  public void rebase(RebaseInput in) throws RestApiException {
-    try {
-      rebase.apply(change, in);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot rebase change", e);
-    }
-  }
-
-  @Override
-  public void delete() throws RestApiException {
-    try {
-      deleteChange.apply(change, null);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot delete change", e);
-    }
-  }
-
-  @Override
-  public String topic() throws RestApiException {
-    return getTopic.apply(change);
-  }
-
-  @Override
-  public void topic(String topic) throws RestApiException {
-    PutTopic.Input in = new PutTopic.Input();
-    in.topic = topic;
-    try {
-      putTopic.apply(change, in);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot set topic", e);
-    }
-  }
-
-  @Override
-  public IncludedInInfo includedIn() throws RestApiException {
-    try {
-      return includedIn.apply(change);
-    } catch (Exception e) {
-      throw asRestApiException("Could not extract IncludedIn data", e);
-    }
-  }
-
-  @Override
-  public AddReviewerResult addReviewer(String reviewer) throws RestApiException {
-    AddReviewerInput in = new AddReviewerInput();
-    in.reviewer = reviewer;
-    return addReviewer(in);
-  }
-
-  @Override
-  public AddReviewerResult addReviewer(AddReviewerInput in) throws RestApiException {
-    try {
-      return postReviewers.apply(change, in);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot add change reviewer", e);
-    }
-  }
-
-  @Override
-  public SuggestedReviewersRequest suggestReviewers() throws RestApiException {
-    return new SuggestedReviewersRequest() {
-      @Override
-      public List<SuggestedReviewerInfo> get() throws RestApiException {
-        return ChangeApiImpl.this.suggestReviewers(this);
-      }
-    };
-  }
-
-  @Override
-  public SuggestedReviewersRequest suggestReviewers(String query) throws RestApiException {
-    return suggestReviewers().withQuery(query);
-  }
-
-  private List<SuggestedReviewerInfo> suggestReviewers(SuggestedReviewersRequest r)
-      throws RestApiException {
-    try {
-      suggestReviewers.setQuery(r.getQuery());
-      suggestReviewers.setLimit(r.getLimit());
-      return suggestReviewers.apply(change);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve suggested reviewers", e);
-    }
-  }
-
-  @Override
-  public List<ReviewerInfo> reviewers() throws RestApiException {
-    try {
-      return listReviewers.apply(change);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve reviewers", e);
-    }
-  }
-
-  @Override
-  public ChangeInfo get(EnumSet<ListChangesOption> s) throws RestApiException {
-    try {
-      return changeJson.create(s).format(change);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve change", e);
-    }
-  }
-
-  @Override
-  public ChangeInfo get() throws RestApiException {
-    return get(EnumSet.complementOf(EnumSet.of(ListChangesOption.CHECK)));
-  }
-
-  @Override
-  public EditInfo getEdit() throws RestApiException {
-    return edit().get().orElse(null);
-  }
-
-  @Override
-  public ChangeEditApi edit() throws RestApiException {
-    return changeEditApi.create(change);
-  }
-
-  @Override
-  public void setMessage(String msg) throws RestApiException {
-    CommitMessageInput in = new CommitMessageInput();
-    in.message = msg;
-    setMessage(in);
-  }
-
-  @Override
-  public void setMessage(CommitMessageInput in) throws RestApiException {
-    try {
-      putMessage.apply(change, in);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot edit commit message", e);
-    }
-  }
-
-  @Override
-  public ChangeInfo info() throws RestApiException {
-    return get(EnumSet.noneOf(ListChangesOption.class));
-  }
-
-  @Override
-  public void setHashtags(HashtagsInput input) throws RestApiException {
-    try {
-      postHashtags.apply(change, input);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot post hashtags", e);
-    }
-  }
-
-  @Override
-  public Set<String> getHashtags() throws RestApiException {
-    try {
-      return getHashtags.apply(change).value();
-    } catch (Exception e) {
-      throw asRestApiException("Cannot get hashtags", e);
-    }
-  }
-
-  @Override
-  public AccountInfo setAssignee(AssigneeInput input) throws RestApiException {
-    try {
-      return putAssignee.apply(change, input);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot set assignee", e);
-    }
-  }
-
-  @Override
-  public AccountInfo getAssignee() throws RestApiException {
-    try {
-      Response<AccountInfo> r = getAssignee.apply(change);
-      return r.isNone() ? null : r.value();
-    } catch (Exception e) {
-      throw asRestApiException("Cannot get assignee", e);
-    }
-  }
-
-  @Override
-  public List<AccountInfo> getPastAssignees() throws RestApiException {
-    try {
-      return getPastAssignees.apply(change).value();
-    } catch (Exception e) {
-      throw asRestApiException("Cannot get past assignees", e);
-    }
-  }
-
-  @Override
-  public AccountInfo deleteAssignee() throws RestApiException {
-    try {
-      Response<AccountInfo> r = deleteAssignee.apply(change, null);
-      return r.isNone() ? null : r.value();
-    } catch (Exception e) {
-      throw asRestApiException("Cannot delete assignee", e);
-    }
-  }
-
-  @Override
-  public Map<String, List<CommentInfo>> comments() throws RestApiException {
-    try {
-      return listComments.apply(change);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot get comments", e);
-    }
-  }
-
-  @Override
-  public Map<String, List<RobotCommentInfo>> robotComments() throws RestApiException {
-    try {
-      return listChangeRobotComments.apply(change);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot get robot comments", e);
-    }
-  }
-
-  @Override
-  public Map<String, List<CommentInfo>> drafts() throws RestApiException {
-    try {
-      return listDrafts.apply(change);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot get drafts", e);
-    }
-  }
-
-  @Override
-  public ChangeInfo check() throws RestApiException {
-    try {
-      return check.apply(change).value();
-    } catch (Exception e) {
-      throw asRestApiException("Cannot check change", e);
-    }
-  }
-
-  @Override
-  public ChangeInfo check(FixInput fix) throws RestApiException {
-    try {
-      // TODO(dborowitz): Convert to RetryingRestModifyView. Needs to plumb BatchUpdate.Factory into
-      // ConsistencyChecker.
-      return check.apply(change, fix).value();
-    } catch (Exception e) {
-      throw asRestApiException("Cannot check change", e);
-    }
-  }
-
-  @Override
-  public void index() throws RestApiException {
-    try {
-      index.apply(change, new Index.Input());
-    } catch (Exception e) {
-      throw asRestApiException("Cannot index change", e);
-    }
-  }
-
-  @Override
-  public void ignore(boolean ignore) throws RestApiException {
-    // TODO(dborowitz): Convert to RetryingRestModifyView. Needs to plumb BatchUpdate.Factory into
-    // StarredChangesUtil.
-    try {
-      if (ignore) {
-        this.ignore.apply(change, new Ignore.Input());
-      } else {
-        unignore.apply(change, new Unignore.Input());
-      }
-    } catch (OrmException | IllegalLabelException e) {
-      throw asRestApiException("Cannot ignore change", e);
-    }
-  }
-
-  @Override
-  public boolean ignored() throws RestApiException {
-    try {
-      return stars.isIgnored(change);
-    } catch (OrmException e) {
-      throw asRestApiException("Cannot check if ignored", e);
-    }
-  }
-
-  @Override
-  public void markAsReviewed(boolean reviewed) throws RestApiException {
-    // TODO(dborowitz): Convert to RetryingRestModifyView. Needs to plumb BatchUpdate.Factory into
-    // StarredChangesUtil.
-    try {
-      if (reviewed) {
-        markAsReviewed.apply(change, new MarkAsReviewed.Input());
-      } else {
-        markAsUnreviewed.apply(change, new MarkAsUnreviewed.Input());
-      }
-    } catch (OrmException | IllegalLabelException e) {
-      throw asRestApiException(
-          "Cannot mark change as " + (reviewed ? "reviewed" : "unreviewed"), e);
-    }
-  }
-
-  @Override
-  public PureRevertInfo pureRevert() throws RestApiException {
-    return pureRevert(null);
-  }
-
-  @Override
-  public PureRevertInfo pureRevert(@Nullable String claimedOriginal) throws RestApiException {
-    try {
-      return getPureRevert.setClaimedOriginal(claimedOriginal).apply(change);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot compute pure revert", e);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeEditApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeEditApiImpl.java
deleted file mode 100644
index 3ee7c76..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeEditApiImpl.java
+++ /dev/null
@@ -1,247 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.api.changes;
-
-import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
-
-import com.google.gerrit.extensions.api.changes.ChangeEditApi;
-import com.google.gerrit.extensions.api.changes.PublishChangeEditInput;
-import com.google.gerrit.extensions.client.ChangeEditDetailOption;
-import com.google.gerrit.extensions.common.EditInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BinaryResult;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.RawInput;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.server.change.ChangeEditResource;
-import com.google.gerrit.server.change.ChangeEdits;
-import com.google.gerrit.server.change.ChangeResource;
-import com.google.gerrit.server.change.DeleteChangeEdit;
-import com.google.gerrit.server.change.PublishChangeEdit;
-import com.google.gerrit.server.change.RebaseChangeEdit;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.util.Optional;
-
-public class ChangeEditApiImpl implements ChangeEditApi {
-  interface Factory {
-    ChangeEditApiImpl create(ChangeResource changeResource);
-  }
-
-  private final Provider<ChangeEdits.Detail> editDetailProvider;
-  private final ChangeEdits.Post changeEditsPost;
-  private final DeleteChangeEdit deleteChangeEdit;
-  private final RebaseChangeEdit.Rebase rebaseChangeEdit;
-  private final PublishChangeEdit.Publish publishChangeEdit;
-  private final Provider<ChangeEdits.Get> changeEditsGetProvider;
-  private final ChangeEdits.Put changeEditsPut;
-  private final ChangeEdits.DeleteContent changeEditDeleteContent;
-  private final Provider<ChangeEdits.GetMessage> getChangeEditCommitMessageProvider;
-  private final ChangeEdits.EditMessage modifyChangeEditCommitMessage;
-  private final ChangeEdits changeEdits;
-  private final ChangeResource changeResource;
-
-  @Inject
-  public ChangeEditApiImpl(
-      Provider<ChangeEdits.Detail> editDetailProvider,
-      ChangeEdits.Post changeEditsPost,
-      DeleteChangeEdit deleteChangeEdit,
-      RebaseChangeEdit.Rebase rebaseChangeEdit,
-      PublishChangeEdit.Publish publishChangeEdit,
-      Provider<ChangeEdits.Get> changeEditsGetProvider,
-      ChangeEdits.Put changeEditsPut,
-      ChangeEdits.DeleteContent changeEditDeleteContent,
-      Provider<ChangeEdits.GetMessage> getChangeEditCommitMessageProvider,
-      ChangeEdits.EditMessage modifyChangeEditCommitMessage,
-      ChangeEdits changeEdits,
-      @Assisted ChangeResource changeResource) {
-    this.editDetailProvider = editDetailProvider;
-    this.changeEditsPost = changeEditsPost;
-    this.deleteChangeEdit = deleteChangeEdit;
-    this.rebaseChangeEdit = rebaseChangeEdit;
-    this.publishChangeEdit = publishChangeEdit;
-    this.changeEditsGetProvider = changeEditsGetProvider;
-    this.changeEditsPut = changeEditsPut;
-    this.changeEditDeleteContent = changeEditDeleteContent;
-    this.getChangeEditCommitMessageProvider = getChangeEditCommitMessageProvider;
-    this.modifyChangeEditCommitMessage = modifyChangeEditCommitMessage;
-    this.changeEdits = changeEdits;
-    this.changeResource = changeResource;
-  }
-
-  @Override
-  public ChangeEditDetailRequest detail() throws RestApiException {
-    try {
-      return new ChangeEditDetailRequest() {
-        @Override
-        public Optional<EditInfo> get() throws RestApiException {
-          return ChangeEditApiImpl.this.get(this);
-        }
-      };
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve change edit", e);
-    }
-  }
-
-  private Optional<EditInfo> get(ChangeEditDetailRequest r) throws RestApiException {
-    try {
-      ChangeEdits.Detail editDetail = editDetailProvider.get();
-      editDetail.setBase(r.getBase());
-      editDetail.setList(r.options().contains(ChangeEditDetailOption.LIST_FILES));
-      editDetail.setDownloadCommands(
-          r.options().contains(ChangeEditDetailOption.DOWNLOAD_COMMANDS));
-      Response<EditInfo> edit = editDetail.apply(changeResource);
-      return edit.isNone() ? Optional.empty() : Optional.of(edit.value());
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve change edit", e);
-    }
-  }
-
-  @Override
-  public Optional<EditInfo> get() throws RestApiException {
-    try {
-      Response<EditInfo> edit = editDetailProvider.get().apply(changeResource);
-      return edit.isNone() ? Optional.empty() : Optional.of(edit.value());
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve change edit", e);
-    }
-  }
-
-  @Override
-  public void create() throws RestApiException {
-    try {
-      changeEditsPost.apply(changeResource, null);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot create change edit", e);
-    }
-  }
-
-  @Override
-  public void delete() throws RestApiException {
-    try {
-      deleteChangeEdit.apply(changeResource, new DeleteChangeEdit.Input());
-    } catch (Exception e) {
-      throw asRestApiException("Cannot delete change edit", e);
-    }
-  }
-
-  @Override
-  public void rebase() throws RestApiException {
-    try {
-      rebaseChangeEdit.apply(changeResource, null);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot rebase change edit", e);
-    }
-  }
-
-  @Override
-  public void publish() throws RestApiException {
-    publish(null);
-  }
-
-  @Override
-  public void publish(PublishChangeEditInput publishChangeEditInput) throws RestApiException {
-    try {
-      publishChangeEdit.apply(changeResource, publishChangeEditInput);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot publish change edit", e);
-    }
-  }
-
-  @Override
-  public Optional<BinaryResult> getFile(String filePath) throws RestApiException {
-    try {
-      ChangeEditResource changeEditResource = getChangeEditResource(filePath);
-      Response<BinaryResult> fileResponse = changeEditsGetProvider.get().apply(changeEditResource);
-      return fileResponse.isNone() ? Optional.empty() : Optional.of(fileResponse.value());
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve file of change edit", e);
-    }
-  }
-
-  @Override
-  public void renameFile(String oldFilePath, String newFilePath) throws RestApiException {
-    try {
-      ChangeEdits.Post.Input renameInput = new ChangeEdits.Post.Input();
-      renameInput.oldPath = oldFilePath;
-      renameInput.newPath = newFilePath;
-      changeEditsPost.apply(changeResource, renameInput);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot rename file of change edit", e);
-    }
-  }
-
-  @Override
-  public void restoreFile(String filePath) throws RestApiException {
-    try {
-      ChangeEdits.Post.Input restoreInput = new ChangeEdits.Post.Input();
-      restoreInput.restorePath = filePath;
-      changeEditsPost.apply(changeResource, restoreInput);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot restore file of change edit", e);
-    }
-  }
-
-  @Override
-  public void modifyFile(String filePath, RawInput newContent) throws RestApiException {
-    try {
-      changeEditsPut.apply(changeResource, filePath, newContent);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot modify file of change edit", e);
-    }
-  }
-
-  @Override
-  public void deleteFile(String filePath) throws RestApiException {
-    try {
-      changeEditDeleteContent.apply(changeResource, filePath);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot delete file of change edit", e);
-    }
-  }
-
-  @Override
-  public String getCommitMessage() throws RestApiException {
-    try {
-      try (BinaryResult binaryResult =
-          getChangeEditCommitMessageProvider.get().apply(changeResource)) {
-        return binaryResult.asString();
-      }
-    } catch (Exception e) {
-      throw asRestApiException("Cannot get commit message of change edit", e);
-    }
-  }
-
-  @Override
-  public void modifyCommitMessage(String newCommitMessage) throws RestApiException {
-    ChangeEdits.EditMessage.Input input = new ChangeEdits.EditMessage.Input();
-    input.message = newCommitMessage;
-    try {
-      modifyChangeEditCommitMessage.apply(changeResource, input);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot modify commit message of change edit", e);
-    }
-  }
-
-  private ChangeEditResource getChangeEditResource(String filePath)
-      throws ResourceNotFoundException, AuthException, IOException, OrmException {
-    return changeEdits.parse(changeResource, IdString.fromDecoded(filePath));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangesImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangesImpl.java
deleted file mode 100644
index cc39883..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangesImpl.java
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.api.changes;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
-
-import com.google.common.base.Joiner;
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.extensions.api.changes.ChangeApi;
-import com.google.gerrit.extensions.api.changes.Changes;
-import com.google.gerrit.extensions.client.ListChangesOption;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.ChangeInput;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.extensions.restapi.Url;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.server.change.ChangesCollection;
-import com.google.gerrit.server.change.CreateChange;
-import com.google.gerrit.server.query.change.QueryChanges;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.List;
-
-@Singleton
-class ChangesImpl implements Changes {
-  private final ChangesCollection changes;
-  private final ChangeApiImpl.Factory api;
-  private final CreateChange createChange;
-  private final Provider<QueryChanges> queryProvider;
-
-  @Inject
-  ChangesImpl(
-      ChangesCollection changes,
-      ChangeApiImpl.Factory api,
-      CreateChange createChange,
-      Provider<QueryChanges> queryProvider) {
-    this.changes = changes;
-    this.api = api;
-    this.createChange = createChange;
-    this.queryProvider = queryProvider;
-  }
-
-  @Override
-  public ChangeApi id(int id) throws RestApiException {
-    return id(String.valueOf(id));
-  }
-
-  @Override
-  public ChangeApi id(String project, String branch, String id) throws RestApiException {
-    return id(
-        Joiner.on('~')
-            .join(ImmutableList.of(Url.encode(project), Url.encode(branch), Url.encode(id))));
-  }
-
-  @Override
-  public ChangeApi id(String id) throws RestApiException {
-    try {
-      return api.create(changes.parse(TopLevelResource.INSTANCE, IdString.fromUrl(id)));
-    } catch (Exception e) {
-      throw asRestApiException("Cannot parse change", e);
-    }
-  }
-
-  @Override
-  public ChangeApi id(String project, int id) throws RestApiException {
-    return id(
-        Joiner.on('~').join(ImmutableList.of(Url.encode(project), Url.encode(String.valueOf(id)))));
-  }
-
-  @Override
-  public ChangeApi create(ChangeInput in) throws RestApiException {
-    try {
-      ChangeInfo out = createChange.apply(TopLevelResource.INSTANCE, in).value();
-      return api.create(changes.parse(new Change.Id(out._number)));
-    } catch (Exception e) {
-      throw asRestApiException("Cannot create change", e);
-    }
-  }
-
-  @Override
-  public QueryRequest query() {
-    return new QueryRequest() {
-      @Override
-      public List<ChangeInfo> get() throws RestApiException {
-        return ChangesImpl.this.get(this);
-      }
-    };
-  }
-
-  @Override
-  public QueryRequest query(String query) {
-    return query().withQuery(query);
-  }
-
-  private List<ChangeInfo> get(QueryRequest q) throws RestApiException {
-    QueryChanges qc = queryProvider.get();
-    if (q.getQuery() != null) {
-      qc.addQuery(q.getQuery());
-    }
-    qc.setLimit(q.getLimit());
-    qc.setStart(q.getStart());
-    for (ListChangesOption option : q.getOptions()) {
-      qc.addOption(option);
-    }
-
-    try {
-      List<?> result = qc.apply(TopLevelResource.INSTANCE);
-      if (result.isEmpty()) {
-        return ImmutableList.of();
-      }
-
-      // Check type safety of result; the extension API should be safer than the
-      // REST API in this case, since it's intended to be used in Java.
-      Object first = checkNotNull(result.iterator().next());
-      checkState(first instanceof ChangeInfo);
-      @SuppressWarnings("unchecked")
-      List<ChangeInfo> infos = (List<ChangeInfo>) result;
-
-      return ImmutableList.copyOf(infos);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot query changes", e);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/CommentApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/CommentApiImpl.java
deleted file mode 100644
index 6a2501e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/CommentApiImpl.java
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.api.changes;
-
-import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
-
-import com.google.gerrit.extensions.api.changes.CommentApi;
-import com.google.gerrit.extensions.api.changes.DeleteCommentInput;
-import com.google.gerrit.extensions.common.CommentInfo;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.server.change.CommentResource;
-import com.google.gerrit.server.change.DeleteComment;
-import com.google.gerrit.server.change.GetComment;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-
-class CommentApiImpl implements CommentApi {
-  interface Factory {
-    CommentApiImpl create(CommentResource c);
-  }
-
-  private final GetComment getComment;
-  private final DeleteComment deleteComment;
-  private final CommentResource comment;
-
-  @Inject
-  CommentApiImpl(
-      GetComment getComment, DeleteComment deleteComment, @Assisted CommentResource comment) {
-    this.getComment = getComment;
-    this.deleteComment = deleteComment;
-    this.comment = comment;
-  }
-
-  @Override
-  public CommentInfo get() throws RestApiException {
-    try {
-      return getComment.apply(comment);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve comment", e);
-    }
-  }
-
-  @Override
-  public CommentInfo delete(DeleteCommentInput input) throws RestApiException {
-    try {
-      return deleteComment.apply(comment, input);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot delete comment", e);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/DraftApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/DraftApiImpl.java
deleted file mode 100644
index eada51b..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/DraftApiImpl.java
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.api.changes;
-
-import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
-
-import com.google.gerrit.extensions.api.changes.DeleteCommentInput;
-import com.google.gerrit.extensions.api.changes.DraftApi;
-import com.google.gerrit.extensions.api.changes.DraftInput;
-import com.google.gerrit.extensions.common.CommentInfo;
-import com.google.gerrit.extensions.restapi.NotImplementedException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.server.change.DeleteDraftComment;
-import com.google.gerrit.server.change.DraftCommentResource;
-import com.google.gerrit.server.change.GetDraftComment;
-import com.google.gerrit.server.change.PutDraftComment;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-
-class DraftApiImpl implements DraftApi {
-  interface Factory {
-    DraftApiImpl create(DraftCommentResource d);
-  }
-
-  private final DeleteDraftComment deleteDraft;
-  private final GetDraftComment getDraft;
-  private final PutDraftComment putDraft;
-  private final DraftCommentResource draft;
-
-  @Inject
-  DraftApiImpl(
-      DeleteDraftComment deleteDraft,
-      GetDraftComment getDraft,
-      PutDraftComment putDraft,
-      @Assisted DraftCommentResource draft) {
-    this.deleteDraft = deleteDraft;
-    this.getDraft = getDraft;
-    this.putDraft = putDraft;
-    this.draft = draft;
-  }
-
-  @Override
-  public CommentInfo get() throws RestApiException {
-    try {
-      return getDraft.apply(draft);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve draft", e);
-    }
-  }
-
-  @Override
-  public CommentInfo update(DraftInput in) throws RestApiException {
-    try {
-      return putDraft.apply(draft, in).value();
-    } catch (Exception e) {
-      throw asRestApiException("Cannot update draft", e);
-    }
-  }
-
-  @Override
-  public void delete() throws RestApiException {
-    try {
-      deleteDraft.apply(draft, null);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot delete draft", e);
-    }
-  }
-
-  @Override
-  public CommentInfo delete(DeleteCommentInput input) {
-    throw new NotImplementedException();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/FileApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/FileApiImpl.java
deleted file mode 100644
index fd7f244..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/FileApiImpl.java
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.api.changes;
-
-import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
-
-import com.google.gerrit.extensions.api.changes.FileApi;
-import com.google.gerrit.extensions.common.DiffInfo;
-import com.google.gerrit.extensions.restapi.BinaryResult;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.server.change.FileResource;
-import com.google.gerrit.server.change.GetContent;
-import com.google.gerrit.server.change.GetDiff;
-import com.google.gerrit.server.change.Reviewed;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-
-class FileApiImpl implements FileApi {
-  interface Factory {
-    FileApiImpl create(FileResource r);
-  }
-
-  private final GetContent getContent;
-  private final GetDiff getDiff;
-  private final Reviewed.PutReviewed putReviewed;
-  private final Reviewed.DeleteReviewed deleteReviewed;
-  private final FileResource file;
-
-  @Inject
-  FileApiImpl(
-      GetContent getContent,
-      GetDiff getDiff,
-      Reviewed.PutReviewed putReviewed,
-      Reviewed.DeleteReviewed deleteReviewed,
-      @Assisted FileResource file) {
-    this.getContent = getContent;
-    this.getDiff = getDiff;
-    this.putReviewed = putReviewed;
-    this.deleteReviewed = deleteReviewed;
-    this.file = file;
-  }
-
-  @Override
-  public BinaryResult content() throws RestApiException {
-    try {
-      return getContent.apply(file);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve file content", e);
-    }
-  }
-
-  @Override
-  public DiffInfo diff() throws RestApiException {
-    try {
-      return getDiff.apply(file).value();
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve diff", e);
-    }
-  }
-
-  @Override
-  public DiffInfo diff(String base) throws RestApiException {
-    try {
-      return getDiff.setBase(base).apply(file).value();
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve diff", e);
-    }
-  }
-
-  @Override
-  public DiffInfo diff(int parent) throws RestApiException {
-    try {
-      return getDiff.setParent(parent).apply(file).value();
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve diff", e);
-    }
-  }
-
-  @Override
-  public DiffRequest diffRequest() {
-    return new DiffRequest() {
-      @Override
-      public DiffInfo get() throws RestApiException {
-        return FileApiImpl.this.get(this);
-      }
-    };
-  }
-
-  @Override
-  public void setReviewed(boolean reviewed) throws RestApiException {
-    try {
-      if (reviewed) {
-        putReviewed.apply(file, new Reviewed.Input());
-      } else {
-        deleteReviewed.apply(file, new Reviewed.Input());
-      }
-    } catch (Exception e) {
-      throw asRestApiException(String.format("Cannot set %sreviewed", reviewed ? "" : "un"), e);
-    }
-  }
-
-  private DiffInfo get(DiffRequest r) throws RestApiException {
-    if (r.getBase() != null) {
-      getDiff.setBase(r.getBase());
-    }
-    if (r.getContext() != null) {
-      getDiff.setContext(r.getContext());
-    }
-    if (r.getIntraline() != null) {
-      getDiff.setIntraline(r.getIntraline());
-    }
-    if (r.getWhitespace() != null) {
-      getDiff.setWhitespace(r.getWhitespace());
-    }
-    r.getParent().ifPresent(getDiff::setParent);
-    try {
-      return getDiff.apply(file).value();
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve diff", e);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/Module.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/Module.java
deleted file mode 100644
index e91d64a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/Module.java
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.api.changes;
-
-import com.google.gerrit.extensions.api.changes.Changes;
-import com.google.gerrit.extensions.config.FactoryModule;
-
-public class Module extends FactoryModule {
-  @Override
-  protected void configure() {
-    bind(Changes.class).to(ChangesImpl.class);
-
-    factory(ChangeApiImpl.Factory.class);
-    factory(CommentApiImpl.Factory.class);
-    factory(RobotCommentApiImpl.Factory.class);
-    factory(DraftApiImpl.Factory.class);
-    factory(RevisionApiImpl.Factory.class);
-    factory(FileApiImpl.Factory.class);
-    factory(ReviewerApiImpl.Factory.class);
-    factory(RevisionReviewerApiImpl.Factory.class);
-    factory(ChangeEditApiImpl.Factory.class);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ReviewerApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ReviewerApiImpl.java
deleted file mode 100644
index 2f8b7d8..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ReviewerApiImpl.java
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.api.changes;
-
-import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
-
-import com.google.gerrit.extensions.api.changes.DeleteReviewerInput;
-import com.google.gerrit.extensions.api.changes.DeleteVoteInput;
-import com.google.gerrit.extensions.api.changes.ReviewerApi;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.server.change.DeleteReviewer;
-import com.google.gerrit.server.change.DeleteVote;
-import com.google.gerrit.server.change.ReviewerResource;
-import com.google.gerrit.server.change.VoteResource;
-import com.google.gerrit.server.change.Votes;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.util.Map;
-
-public class ReviewerApiImpl implements ReviewerApi {
-  interface Factory {
-    ReviewerApiImpl create(ReviewerResource r);
-  }
-
-  private final ReviewerResource reviewer;
-  private final Votes.List listVotes;
-  private final DeleteVote deleteVote;
-  private final DeleteReviewer deleteReviewer;
-
-  @Inject
-  ReviewerApiImpl(
-      Votes.List listVotes,
-      DeleteVote deleteVote,
-      DeleteReviewer deleteReviewer,
-      @Assisted ReviewerResource reviewer) {
-    this.listVotes = listVotes;
-    this.deleteVote = deleteVote;
-    this.deleteReviewer = deleteReviewer;
-    this.reviewer = reviewer;
-  }
-
-  @Override
-  public Map<String, Short> votes() throws RestApiException {
-    try {
-      return listVotes.apply(reviewer);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot list votes", e);
-    }
-  }
-
-  @Override
-  public void deleteVote(String label) throws RestApiException {
-    try {
-      deleteVote.apply(new VoteResource(reviewer, label), null);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot delete vote", e);
-    }
-  }
-
-  @Override
-  public void deleteVote(DeleteVoteInput input) throws RestApiException {
-    try {
-      deleteVote.apply(new VoteResource(reviewer, input.label), input);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot delete vote", e);
-    }
-  }
-
-  @Override
-  public void remove() throws RestApiException {
-    remove(new DeleteReviewerInput());
-  }
-
-  @Override
-  public void remove(DeleteReviewerInput input) throws RestApiException {
-    try {
-      deleteReviewer.apply(reviewer, input);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot remove reviewer", e);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RevisionApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RevisionApiImpl.java
deleted file mode 100644
index 2eb55a5..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RevisionApiImpl.java
+++ /dev/null
@@ -1,655 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.api.changes;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.MultimapBuilder.ListMultimapBuilder;
-import com.google.gerrit.extensions.api.changes.ChangeApi;
-import com.google.gerrit.extensions.api.changes.Changes;
-import com.google.gerrit.extensions.api.changes.CherryPickInput;
-import com.google.gerrit.extensions.api.changes.CommentApi;
-import com.google.gerrit.extensions.api.changes.DraftApi;
-import com.google.gerrit.extensions.api.changes.DraftInput;
-import com.google.gerrit.extensions.api.changes.FileApi;
-import com.google.gerrit.extensions.api.changes.RebaseInput;
-import com.google.gerrit.extensions.api.changes.RelatedChangesInfo;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.api.changes.ReviewResult;
-import com.google.gerrit.extensions.api.changes.RevisionApi;
-import com.google.gerrit.extensions.api.changes.RevisionReviewerApi;
-import com.google.gerrit.extensions.api.changes.RobotCommentApi;
-import com.google.gerrit.extensions.api.changes.SubmitInput;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.extensions.common.ActionInfo;
-import com.google.gerrit.extensions.common.ApprovalInfo;
-import com.google.gerrit.extensions.common.CommentInfo;
-import com.google.gerrit.extensions.common.CommitInfo;
-import com.google.gerrit.extensions.common.EditInfo;
-import com.google.gerrit.extensions.common.FileInfo;
-import com.google.gerrit.extensions.common.MergeableInfo;
-import com.google.gerrit.extensions.common.RobotCommentInfo;
-import com.google.gerrit.extensions.common.TestSubmitRuleInput;
-import com.google.gerrit.extensions.restapi.BinaryResult;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.account.AccountDirectory.FillOptions;
-import com.google.gerrit.server.account.AccountLoader;
-import com.google.gerrit.server.change.ApplyFix;
-import com.google.gerrit.server.change.ChangeJson;
-import com.google.gerrit.server.change.CherryPick;
-import com.google.gerrit.server.change.Comments;
-import com.google.gerrit.server.change.CreateDraftComment;
-import com.google.gerrit.server.change.DraftComments;
-import com.google.gerrit.server.change.FileResource;
-import com.google.gerrit.server.change.Files;
-import com.google.gerrit.server.change.Fixes;
-import com.google.gerrit.server.change.GetCommit;
-import com.google.gerrit.server.change.GetDescription;
-import com.google.gerrit.server.change.GetMergeList;
-import com.google.gerrit.server.change.GetPatch;
-import com.google.gerrit.server.change.GetRelated;
-import com.google.gerrit.server.change.GetRevisionActions;
-import com.google.gerrit.server.change.ListRevisionComments;
-import com.google.gerrit.server.change.ListRevisionDrafts;
-import com.google.gerrit.server.change.ListRobotComments;
-import com.google.gerrit.server.change.Mergeable;
-import com.google.gerrit.server.change.PostReview;
-import com.google.gerrit.server.change.PreviewSubmit;
-import com.google.gerrit.server.change.PutDescription;
-import com.google.gerrit.server.change.Rebase;
-import com.google.gerrit.server.change.RebaseUtil;
-import com.google.gerrit.server.change.Reviewed;
-import com.google.gerrit.server.change.RevisionResource;
-import com.google.gerrit.server.change.RevisionReviewers;
-import com.google.gerrit.server.change.RobotComments;
-import com.google.gerrit.server.change.Submit;
-import com.google.gerrit.server.change.TestSubmitType;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import java.util.EnumSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-class RevisionApiImpl implements RevisionApi {
-  interface Factory {
-    RevisionApiImpl create(RevisionResource r);
-  }
-
-  private final GitRepositoryManager repoManager;
-  private final Changes changes;
-  private final RevisionReviewers revisionReviewers;
-  private final RevisionReviewerApiImpl.Factory revisionReviewerApi;
-  private final CherryPick cherryPick;
-  private final Rebase rebase;
-  private final RebaseUtil rebaseUtil;
-  private final Submit submit;
-  private final PreviewSubmit submitPreview;
-  private final Reviewed.PutReviewed putReviewed;
-  private final Reviewed.DeleteReviewed deleteReviewed;
-  private final RevisionResource revision;
-  private final Files files;
-  private final Files.ListFiles listFiles;
-  private final GetCommit getCommit;
-  private final GetPatch getPatch;
-  private final PostReview review;
-  private final Mergeable mergeable;
-  private final FileApiImpl.Factory fileApi;
-  private final ListRevisionComments listComments;
-  private final ListRobotComments listRobotComments;
-  private final ApplyFix applyFix;
-  private final Fixes fixes;
-  private final ListRevisionDrafts listDrafts;
-  private final CreateDraftComment createDraft;
-  private final DraftComments drafts;
-  private final DraftApiImpl.Factory draftFactory;
-  private final Comments comments;
-  private final CommentApiImpl.Factory commentFactory;
-  private final RobotComments robotComments;
-  private final RobotCommentApiImpl.Factory robotCommentFactory;
-  private final GetRevisionActions revisionActions;
-  private final TestSubmitType testSubmitType;
-  private final TestSubmitType.Get getSubmitType;
-  private final Provider<GetMergeList> getMergeList;
-  private final GetRelated getRelated;
-  private final PutDescription putDescription;
-  private final GetDescription getDescription;
-  private final ApprovalsUtil approvalsUtil;
-  private final Provider<ReviewDb> db;
-  private final AccountLoader.Factory accountLoaderFactory;
-
-  @Inject
-  RevisionApiImpl(
-      GitRepositoryManager repoManager,
-      Changes changes,
-      RevisionReviewers revisionReviewers,
-      RevisionReviewerApiImpl.Factory revisionReviewerApi,
-      CherryPick cherryPick,
-      Rebase rebase,
-      RebaseUtil rebaseUtil,
-      Submit submit,
-      PreviewSubmit submitPreview,
-      Reviewed.PutReviewed putReviewed,
-      Reviewed.DeleteReviewed deleteReviewed,
-      Files files,
-      Files.ListFiles listFiles,
-      GetCommit getCommit,
-      GetPatch getPatch,
-      PostReview review,
-      Mergeable mergeable,
-      FileApiImpl.Factory fileApi,
-      ListRevisionComments listComments,
-      ListRobotComments listRobotComments,
-      ApplyFix applyFix,
-      Fixes fixes,
-      ListRevisionDrafts listDrafts,
-      CreateDraftComment createDraft,
-      DraftComments drafts,
-      DraftApiImpl.Factory draftFactory,
-      Comments comments,
-      CommentApiImpl.Factory commentFactory,
-      RobotComments robotComments,
-      RobotCommentApiImpl.Factory robotCommentFactory,
-      GetRevisionActions revisionActions,
-      TestSubmitType testSubmitType,
-      TestSubmitType.Get getSubmitType,
-      Provider<GetMergeList> getMergeList,
-      GetRelated getRelated,
-      PutDescription putDescription,
-      GetDescription getDescription,
-      ApprovalsUtil approvalsUtil,
-      Provider<ReviewDb> db,
-      AccountLoader.Factory accountLoaderFactory,
-      @Assisted RevisionResource r) {
-    this.repoManager = repoManager;
-    this.changes = changes;
-    this.revisionReviewers = revisionReviewers;
-    this.revisionReviewerApi = revisionReviewerApi;
-    this.cherryPick = cherryPick;
-    this.rebase = rebase;
-    this.rebaseUtil = rebaseUtil;
-    this.review = review;
-    this.submit = submit;
-    this.submitPreview = submitPreview;
-    this.files = files;
-    this.putReviewed = putReviewed;
-    this.deleteReviewed = deleteReviewed;
-    this.listFiles = listFiles;
-    this.getCommit = getCommit;
-    this.getPatch = getPatch;
-    this.mergeable = mergeable;
-    this.fileApi = fileApi;
-    this.listComments = listComments;
-    this.robotComments = robotComments;
-    this.listRobotComments = listRobotComments;
-    this.applyFix = applyFix;
-    this.fixes = fixes;
-    this.listDrafts = listDrafts;
-    this.createDraft = createDraft;
-    this.drafts = drafts;
-    this.draftFactory = draftFactory;
-    this.comments = comments;
-    this.commentFactory = commentFactory;
-    this.robotCommentFactory = robotCommentFactory;
-    this.revisionActions = revisionActions;
-    this.testSubmitType = testSubmitType;
-    this.getSubmitType = getSubmitType;
-    this.getMergeList = getMergeList;
-    this.getRelated = getRelated;
-    this.putDescription = putDescription;
-    this.getDescription = getDescription;
-    this.approvalsUtil = approvalsUtil;
-    this.db = db;
-    this.accountLoaderFactory = accountLoaderFactory;
-    this.revision = r;
-  }
-
-  @Override
-  public ReviewResult review(ReviewInput in) throws RestApiException {
-    try {
-      return review.apply(revision, in).value();
-    } catch (Exception e) {
-      throw asRestApiException("Cannot post review", e);
-    }
-  }
-
-  @Override
-  public void submit() throws RestApiException {
-    SubmitInput in = new SubmitInput();
-    submit(in);
-  }
-
-  @Override
-  public void submit(SubmitInput in) throws RestApiException {
-    try {
-      submit.apply(revision, in);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot submit change", e);
-    }
-  }
-
-  @Override
-  public BinaryResult submitPreview() throws RestApiException {
-    return submitPreview("zip");
-  }
-
-  @Override
-  public BinaryResult submitPreview(String format) throws RestApiException {
-    try {
-      submitPreview.setFormat(format);
-      return submitPreview.apply(revision);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot get submit preview", e);
-    }
-  }
-
-  @Override
-  public void publish() throws RestApiException {
-    throw new UnsupportedOperationException("draft workflow is discontinued");
-  }
-
-  @Override
-  public void delete() throws RestApiException {
-    throw new UnsupportedOperationException("draft workflow is discontinued");
-  }
-
-  @Override
-  public ChangeApi rebase() throws RestApiException {
-    RebaseInput in = new RebaseInput();
-    return rebase(in);
-  }
-
-  @Override
-  public ChangeApi rebase(RebaseInput in) throws RestApiException {
-    try {
-      return changes.id(rebase.apply(revision, in)._number);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot rebase ps", e);
-    }
-  }
-
-  @Override
-  public boolean canRebase() throws RestApiException {
-    try (Repository repo = repoManager.openRepository(revision.getProject());
-        RevWalk rw = new RevWalk(repo)) {
-      return rebaseUtil.canRebase(revision.getPatchSet(), revision.getChange().getDest(), repo, rw);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot check if rebase is possible", e);
-    }
-  }
-
-  @Override
-  public ChangeApi cherryPick(CherryPickInput in) throws RestApiException {
-    try {
-      return changes.id(cherryPick.apply(revision, in)._number);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot cherry pick", e);
-    }
-  }
-
-  @Override
-  public RevisionReviewerApi reviewer(String id) throws RestApiException {
-    try {
-      return revisionReviewerApi.create(
-          revisionReviewers.parse(revision, IdString.fromDecoded(id)));
-    } catch (Exception e) {
-      throw asRestApiException("Cannot parse reviewer", e);
-    }
-  }
-
-  @Override
-  public void setReviewed(String path, boolean reviewed) throws RestApiException {
-    try {
-      RestModifyView<FileResource, Reviewed.Input> view;
-      if (reviewed) {
-        view = putReviewed;
-      } else {
-        view = deleteReviewed;
-      }
-      view.apply(files.parse(revision, IdString.fromDecoded(path)), new Reviewed.Input());
-    } catch (Exception e) {
-      throw asRestApiException("Cannot update reviewed flag", e);
-    }
-  }
-
-  @SuppressWarnings("unchecked")
-  @Override
-  public Set<String> reviewed() throws RestApiException {
-    try {
-      return ImmutableSet.copyOf(
-          (Iterable<String>) listFiles.setReviewed(true).apply(revision).value());
-    } catch (Exception e) {
-      throw asRestApiException("Cannot list reviewed files", e);
-    }
-  }
-
-  @Override
-  public MergeableInfo mergeable() throws RestApiException {
-    try {
-      return mergeable.apply(revision);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot check mergeability", e);
-    }
-  }
-
-  @Override
-  public MergeableInfo mergeableOtherBranches() throws RestApiException {
-    try {
-      mergeable.setOtherBranches(true);
-      return mergeable.apply(revision);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot check mergeability", e);
-    }
-  }
-
-  @SuppressWarnings("unchecked")
-  @Override
-  public Map<String, FileInfo> files() throws RestApiException {
-    try {
-      return (Map<String, FileInfo>) listFiles.apply(revision).value();
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve files", e);
-    }
-  }
-
-  @SuppressWarnings("unchecked")
-  @Override
-  public Map<String, FileInfo> files(String base) throws RestApiException {
-    try {
-      return (Map<String, FileInfo>) listFiles.setBase(base).apply(revision).value();
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve files", e);
-    }
-  }
-
-  @SuppressWarnings("unchecked")
-  @Override
-  public Map<String, FileInfo> files(int parentNum) throws RestApiException {
-    try {
-      return (Map<String, FileInfo>) listFiles.setParent(parentNum).apply(revision).value();
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve files", e);
-    }
-  }
-
-  @SuppressWarnings("unchecked")
-  @Override
-  public List<String> queryFiles(String query) throws RestApiException {
-    try {
-      checkArgument(query != null, "no query provided");
-      return (List<String>) listFiles.setQuery(query).apply(revision).value();
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve files", e);
-    }
-  }
-
-  @Override
-  public FileApi file(String path) {
-    return fileApi.create(files.parse(revision, IdString.fromDecoded(path)));
-  }
-
-  @Override
-  public CommitInfo commit(boolean addLinks) throws RestApiException {
-    try {
-      return getCommit.setAddLinks(addLinks).apply(revision).value();
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve commit", e);
-    }
-  }
-
-  @Override
-  public Map<String, List<CommentInfo>> comments() throws RestApiException {
-    try {
-      return listComments.apply(revision);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve comments", e);
-    }
-  }
-
-  @Override
-  public Map<String, List<RobotCommentInfo>> robotComments() throws RestApiException {
-    try {
-      return listRobotComments.apply(revision);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve robot comments", e);
-    }
-  }
-
-  @Override
-  public List<CommentInfo> commentsAsList() throws RestApiException {
-    try {
-      return listComments.getComments(revision);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve comments", e);
-    }
-  }
-
-  @Override
-  public Map<String, List<CommentInfo>> drafts() throws RestApiException {
-    try {
-      return listDrafts.apply(revision);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve drafts", e);
-    }
-  }
-
-  @Override
-  public List<RobotCommentInfo> robotCommentsAsList() throws RestApiException {
-    try {
-      return listRobotComments.getComments(revision);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve robot comments", e);
-    }
-  }
-
-  @Override
-  public EditInfo applyFix(String fixId) throws RestApiException {
-    try {
-      return applyFix.apply(fixes.parse(revision, IdString.fromDecoded(fixId)), null).value();
-    } catch (Exception e) {
-      throw asRestApiException("Cannot apply fix", e);
-    }
-  }
-
-  @Override
-  public List<CommentInfo> draftsAsList() throws RestApiException {
-    try {
-      return listDrafts.getComments(revision);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve drafts", e);
-    }
-  }
-
-  @Override
-  public DraftApi draft(String id) throws RestApiException {
-    try {
-      return draftFactory.create(drafts.parse(revision, IdString.fromDecoded(id)));
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve draft", e);
-    }
-  }
-
-  @Override
-  public DraftApi createDraft(DraftInput in) throws RestApiException {
-    try {
-      String id = createDraft.apply(revision, in).value().id;
-      // Reread change to pick up new notes refs.
-      return changes
-          .id(revision.getChange().getId().get())
-          .revision(revision.getPatchSet().getId().get())
-          .draft(id);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot create draft", e);
-    }
-  }
-
-  @Override
-  public CommentApi comment(String id) throws RestApiException {
-    try {
-      return commentFactory.create(comments.parse(revision, IdString.fromDecoded(id)));
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve comment", e);
-    }
-  }
-
-  @Override
-  public RobotCommentApi robotComment(String id) throws RestApiException {
-    try {
-      return robotCommentFactory.create(robotComments.parse(revision, IdString.fromDecoded(id)));
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve robot comment", e);
-    }
-  }
-
-  @Override
-  public BinaryResult patch() throws RestApiException {
-    try {
-      return getPatch.apply(revision);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot get patch", e);
-    }
-  }
-
-  @Override
-  public BinaryResult patch(String path) throws RestApiException {
-    try {
-      return getPatch.setPath(path).apply(revision);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot get patch", e);
-    }
-  }
-
-  @Override
-  public Map<String, ActionInfo> actions() throws RestApiException {
-    try {
-      return revisionActions.apply(revision).value();
-    } catch (Exception e) {
-      throw asRestApiException("Cannot get actions", e);
-    }
-  }
-
-  @Override
-  public SubmitType submitType() throws RestApiException {
-    try {
-      return getSubmitType.apply(revision);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot get submit type", e);
-    }
-  }
-
-  @Override
-  public SubmitType testSubmitType(TestSubmitRuleInput in) throws RestApiException {
-    try {
-      return testSubmitType.apply(revision, in);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot test submit type", e);
-    }
-  }
-
-  @Override
-  public MergeListRequest getMergeList() throws RestApiException {
-    return new MergeListRequest() {
-      @Override
-      public List<CommitInfo> get() throws RestApiException {
-        try {
-          GetMergeList gml = getMergeList.get();
-          gml.setUninterestingParent(getUninterestingParent());
-          gml.setAddLinks(getAddLinks());
-          return gml.apply(revision).value();
-        } catch (Exception e) {
-          throw asRestApiException("Cannot get merge list", e);
-        }
-      }
-    };
-  }
-
-  @Override
-  public RelatedChangesInfo related() throws RestApiException {
-    try {
-      return getRelated.apply(revision);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot get related changes", e);
-    }
-  }
-
-  @Override
-  public ListMultimap<String, ApprovalInfo> votes() throws RestApiException {
-    ListMultimap<String, ApprovalInfo> result =
-        ListMultimapBuilder.treeKeys().arrayListValues().build();
-    try {
-      Iterable<PatchSetApproval> approvals =
-          approvalsUtil.byPatchSet(
-              db.get(),
-              revision.getNotes(),
-              revision.getChangeResource().getUser(),
-              revision.getPatchSet().getId(),
-              null,
-              null);
-      AccountLoader accountLoader =
-          accountLoaderFactory.create(
-              EnumSet.of(
-                  FillOptions.ID, FillOptions.NAME, FillOptions.EMAIL, FillOptions.USERNAME));
-      for (PatchSetApproval approval : approvals) {
-        String label = approval.getLabel();
-        ApprovalInfo info =
-            ChangeJson.getApprovalInfo(
-                approval.getAccountId(),
-                Integer.valueOf(approval.getValue()),
-                null,
-                approval.getTag(),
-                approval.getGranted());
-        accountLoader.put(info);
-        result.get(label).add(info);
-      }
-      accountLoader.fill();
-    } catch (Exception e) {
-      throw asRestApiException("Cannot get votes", e);
-    }
-    return result;
-  }
-
-  @Override
-  public void description(String description) throws RestApiException {
-    PutDescription.Input in = new PutDescription.Input();
-    in.description = description;
-    try {
-      putDescription.apply(revision, in);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot set description", e);
-    }
-  }
-
-  @Override
-  public String description() throws RestApiException {
-    return getDescription.apply(revision);
-  }
-
-  @Override
-  public String etag() throws RestApiException {
-    return revisionActions.getETag(revision);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RevisionReviewerApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RevisionReviewerApiImpl.java
deleted file mode 100644
index 60dc1d2..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RevisionReviewerApiImpl.java
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.api.changes;
-
-import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
-
-import com.google.gerrit.extensions.api.changes.DeleteVoteInput;
-import com.google.gerrit.extensions.api.changes.RevisionReviewerApi;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.server.change.DeleteVote;
-import com.google.gerrit.server.change.ReviewerResource;
-import com.google.gerrit.server.change.VoteResource;
-import com.google.gerrit.server.change.Votes;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.util.Map;
-
-public class RevisionReviewerApiImpl implements RevisionReviewerApi {
-  interface Factory {
-    RevisionReviewerApiImpl create(ReviewerResource r);
-  }
-
-  private final ReviewerResource reviewer;
-  private final Votes.List listVotes;
-  private final DeleteVote deleteVote;
-
-  @Inject
-  RevisionReviewerApiImpl(
-      Votes.List listVotes, DeleteVote deleteVote, @Assisted ReviewerResource reviewer) {
-    this.listVotes = listVotes;
-    this.deleteVote = deleteVote;
-    this.reviewer = reviewer;
-  }
-
-  @Override
-  public Map<String, Short> votes() throws RestApiException {
-    try {
-      return listVotes.apply(reviewer);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot list votes", e);
-    }
-  }
-
-  @Override
-  public void deleteVote(String label) throws RestApiException {
-    try {
-      deleteVote.apply(new VoteResource(reviewer, label), null);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot delete vote", e);
-    }
-  }
-
-  @Override
-  public void deleteVote(DeleteVoteInput input) throws RestApiException {
-    try {
-      deleteVote.apply(new VoteResource(reviewer, input.label), input);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot delete vote", e);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RobotCommentApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RobotCommentApiImpl.java
deleted file mode 100644
index b19939b..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RobotCommentApiImpl.java
+++ /dev/null
@@ -1,49 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.api.changes;
-
-import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
-
-import com.google.gerrit.extensions.api.changes.RobotCommentApi;
-import com.google.gerrit.extensions.common.RobotCommentInfo;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.server.change.GetRobotComment;
-import com.google.gerrit.server.change.RobotCommentResource;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-
-public class RobotCommentApiImpl implements RobotCommentApi {
-  interface Factory {
-    RobotCommentApiImpl create(RobotCommentResource c);
-  }
-
-  private final GetRobotComment getComment;
-  private final RobotCommentResource comment;
-
-  @Inject
-  RobotCommentApiImpl(GetRobotComment getComment, @Assisted RobotCommentResource comment) {
-    this.getComment = getComment;
-    this.comment = comment;
-  }
-
-  @Override
-  public RobotCommentInfo get() throws RestApiException {
-    try {
-      return getComment.apply(comment);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve robot comment", e);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/config/ServerImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/config/ServerImpl.java
deleted file mode 100644
index 2148d97..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/config/ServerImpl.java
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.api.config;
-
-import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
-
-import com.google.gerrit.common.Version;
-import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo;
-import com.google.gerrit.extensions.api.config.ConsistencyCheckInput;
-import com.google.gerrit.extensions.api.config.Server;
-import com.google.gerrit.extensions.client.DiffPreferencesInfo;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
-import com.google.gerrit.extensions.common.ServerInfo;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.server.config.CheckConsistency;
-import com.google.gerrit.server.config.ConfigResource;
-import com.google.gerrit.server.config.GetDiffPreferences;
-import com.google.gerrit.server.config.GetPreferences;
-import com.google.gerrit.server.config.GetServerInfo;
-import com.google.gerrit.server.config.SetDiffPreferences;
-import com.google.gerrit.server.config.SetPreferences;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-
-@Singleton
-public class ServerImpl implements Server {
-  private final GetPreferences getPreferences;
-  private final SetPreferences setPreferences;
-  private final GetDiffPreferences getDiffPreferences;
-  private final SetDiffPreferences setDiffPreferences;
-  private final GetServerInfo getServerInfo;
-  private final Provider<CheckConsistency> checkConsistency;
-
-  @Inject
-  ServerImpl(
-      GetPreferences getPreferences,
-      SetPreferences setPreferences,
-      GetDiffPreferences getDiffPreferences,
-      SetDiffPreferences setDiffPreferences,
-      GetServerInfo getServerInfo,
-      Provider<CheckConsistency> checkConsistency) {
-    this.getPreferences = getPreferences;
-    this.setPreferences = setPreferences;
-    this.getDiffPreferences = getDiffPreferences;
-    this.setDiffPreferences = setDiffPreferences;
-    this.getServerInfo = getServerInfo;
-    this.checkConsistency = checkConsistency;
-  }
-
-  @Override
-  public String getVersion() throws RestApiException {
-    return Version.getVersion();
-  }
-
-  @Override
-  public ServerInfo getInfo() throws RestApiException {
-    try {
-      return getServerInfo.apply(new ConfigResource());
-    } catch (Exception e) {
-      throw asRestApiException("Cannot get server info", e);
-    }
-  }
-
-  @Override
-  public GeneralPreferencesInfo getDefaultPreferences() throws RestApiException {
-    try {
-      return getPreferences.apply(new ConfigResource());
-    } catch (Exception e) {
-      throw asRestApiException("Cannot get default general preferences", e);
-    }
-  }
-
-  @Override
-  public GeneralPreferencesInfo setDefaultPreferences(GeneralPreferencesInfo in)
-      throws RestApiException {
-    try {
-      return setPreferences.apply(new ConfigResource(), in);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot set default general preferences", e);
-    }
-  }
-
-  @Override
-  public DiffPreferencesInfo getDefaultDiffPreferences() throws RestApiException {
-    try {
-      return getDiffPreferences.apply(new ConfigResource());
-    } catch (Exception e) {
-      throw asRestApiException("Cannot get default diff preferences", e);
-    }
-  }
-
-  @Override
-  public DiffPreferencesInfo setDefaultDiffPreferences(DiffPreferencesInfo in)
-      throws RestApiException {
-    try {
-      return setDiffPreferences.apply(new ConfigResource(), in);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot set default diff preferences", e);
-    }
-  }
-
-  @Override
-  public ConsistencyCheckInfo checkConsistency(ConsistencyCheckInput in) throws RestApiException {
-    try {
-      return checkConsistency.get().apply(new ConfigResource(), in);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot check consistency", e);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/groups/GroupApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/groups/GroupApiImpl.java
deleted file mode 100644
index 42213f7..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/groups/GroupApiImpl.java
+++ /dev/null
@@ -1,277 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.api.groups;
-
-import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
-
-import com.google.gerrit.extensions.api.groups.GroupApi;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.GroupAuditEventInfo;
-import com.google.gerrit.extensions.common.GroupInfo;
-import com.google.gerrit.extensions.common.GroupOptionsInfo;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.server.group.AddMembers;
-import com.google.gerrit.server.group.AddSubgroups;
-import com.google.gerrit.server.group.DeleteMembers;
-import com.google.gerrit.server.group.DeleteSubgroups;
-import com.google.gerrit.server.group.GetAuditLog;
-import com.google.gerrit.server.group.GetDescription;
-import com.google.gerrit.server.group.GetDetail;
-import com.google.gerrit.server.group.GetGroup;
-import com.google.gerrit.server.group.GetName;
-import com.google.gerrit.server.group.GetOptions;
-import com.google.gerrit.server.group.GetOwner;
-import com.google.gerrit.server.group.GroupResource;
-import com.google.gerrit.server.group.Index;
-import com.google.gerrit.server.group.ListMembers;
-import com.google.gerrit.server.group.ListSubgroups;
-import com.google.gerrit.server.group.PutDescription;
-import com.google.gerrit.server.group.PutName;
-import com.google.gerrit.server.group.PutOptions;
-import com.google.gerrit.server.group.PutOwner;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.util.Arrays;
-import java.util.List;
-
-class GroupApiImpl implements GroupApi {
-  interface Factory {
-    GroupApiImpl create(GroupResource rsrc);
-  }
-
-  private final GetGroup getGroup;
-  private final GetDetail getDetail;
-  private final GetName getName;
-  private final PutName putName;
-  private final GetOwner getOwner;
-  private final PutOwner putOwner;
-  private final GetDescription getDescription;
-  private final PutDescription putDescription;
-  private final GetOptions getOptions;
-  private final PutOptions putOptions;
-  private final ListMembers listMembers;
-  private final AddMembers addMembers;
-  private final DeleteMembers deleteMembers;
-  private final ListSubgroups listSubgroups;
-  private final AddSubgroups addSubgroups;
-  private final DeleteSubgroups deleteSubgroups;
-  private final GetAuditLog getAuditLog;
-  private final GroupResource rsrc;
-  private final Index index;
-
-  @Inject
-  GroupApiImpl(
-      GetGroup getGroup,
-      GetDetail getDetail,
-      GetName getName,
-      PutName putName,
-      GetOwner getOwner,
-      PutOwner putOwner,
-      GetDescription getDescription,
-      PutDescription putDescription,
-      GetOptions getOptions,
-      PutOptions putOptions,
-      ListMembers listMembers,
-      AddMembers addMembers,
-      DeleteMembers deleteMembers,
-      ListSubgroups listSubgroups,
-      AddSubgroups addSubgroups,
-      DeleteSubgroups deleteSubgroups,
-      GetAuditLog getAuditLog,
-      Index index,
-      @Assisted GroupResource rsrc) {
-    this.getGroup = getGroup;
-    this.getDetail = getDetail;
-    this.getName = getName;
-    this.putName = putName;
-    this.getOwner = getOwner;
-    this.putOwner = putOwner;
-    this.getDescription = getDescription;
-    this.putDescription = putDescription;
-    this.getOptions = getOptions;
-    this.putOptions = putOptions;
-    this.listMembers = listMembers;
-    this.addMembers = addMembers;
-    this.deleteMembers = deleteMembers;
-    this.listSubgroups = listSubgroups;
-    this.addSubgroups = addSubgroups;
-    this.deleteSubgroups = deleteSubgroups;
-    this.getAuditLog = getAuditLog;
-    this.index = index;
-    this.rsrc = rsrc;
-  }
-
-  @Override
-  public GroupInfo get() throws RestApiException {
-    try {
-      return getGroup.apply(rsrc);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve group", e);
-    }
-  }
-
-  @Override
-  public GroupInfo detail() throws RestApiException {
-    try {
-      return getDetail.apply(rsrc);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve group", e);
-    }
-  }
-
-  @Override
-  public String name() throws RestApiException {
-    return getName.apply(rsrc);
-  }
-
-  @Override
-  public void name(String name) throws RestApiException {
-    PutName.Input in = new PutName.Input();
-    in.name = name;
-    try {
-      putName.apply(rsrc, in);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot put group name", e);
-    }
-  }
-
-  @Override
-  public GroupInfo owner() throws RestApiException {
-    try {
-      return getOwner.apply(rsrc);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot get group owner", e);
-    }
-  }
-
-  @Override
-  public void owner(String owner) throws RestApiException {
-    PutOwner.Input in = new PutOwner.Input();
-    in.owner = owner;
-    try {
-      putOwner.apply(rsrc, in);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot put group owner", e);
-    }
-  }
-
-  @Override
-  public String description() throws RestApiException {
-    return getDescription.apply(rsrc);
-  }
-
-  @Override
-  public void description(String description) throws RestApiException {
-    PutDescription.Input in = new PutDescription.Input();
-    in.description = description;
-    try {
-      putDescription.apply(rsrc, in);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot put group description", e);
-    }
-  }
-
-  @Override
-  public GroupOptionsInfo options() throws RestApiException {
-    return getOptions.apply(rsrc);
-  }
-
-  @Override
-  public void options(GroupOptionsInfo options) throws RestApiException {
-    try {
-      putOptions.apply(rsrc, options);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot put group options", e);
-    }
-  }
-
-  @Override
-  public List<AccountInfo> members() throws RestApiException {
-    return members(false);
-  }
-
-  @Override
-  public List<AccountInfo> members(boolean recursive) throws RestApiException {
-    listMembers.setRecursive(recursive);
-    try {
-      return listMembers.apply(rsrc);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot list group members", e);
-    }
-  }
-
-  @Override
-  public void addMembers(String... members) throws RestApiException {
-    try {
-      addMembers.apply(rsrc, AddMembers.Input.fromMembers(Arrays.asList(members)));
-    } catch (Exception e) {
-      throw asRestApiException("Cannot add group members", e);
-    }
-  }
-
-  @Override
-  public void removeMembers(String... members) throws RestApiException {
-    try {
-      deleteMembers.apply(rsrc, AddMembers.Input.fromMembers(Arrays.asList(members)));
-    } catch (Exception e) {
-      throw asRestApiException("Cannot remove group members", e);
-    }
-  }
-
-  @Override
-  public List<GroupInfo> includedGroups() throws RestApiException {
-    try {
-      return listSubgroups.apply(rsrc);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot list subgroups", e);
-    }
-  }
-
-  @Override
-  public void addGroups(String... groups) throws RestApiException {
-    try {
-      addSubgroups.apply(rsrc, AddSubgroups.Input.fromGroups(Arrays.asList(groups)));
-    } catch (Exception e) {
-      throw asRestApiException("Cannot add subgroups", e);
-    }
-  }
-
-  @Override
-  public void removeGroups(String... groups) throws RestApiException {
-    try {
-      deleteSubgroups.apply(rsrc, AddSubgroups.Input.fromGroups(Arrays.asList(groups)));
-    } catch (Exception e) {
-      throw asRestApiException("Cannot remove subgroups", e);
-    }
-  }
-
-  @Override
-  public List<? extends GroupAuditEventInfo> auditLog() throws RestApiException {
-    try {
-      return getAuditLog.apply(rsrc);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot get audit log", e);
-    }
-  }
-
-  @Override
-  public void index() throws RestApiException {
-    try {
-      index.apply(rsrc, new Index.Input());
-    } catch (Exception e) {
-      throw asRestApiException("Cannot index group", e);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/groups/GroupsImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/groups/GroupsImpl.java
deleted file mode 100644
index e1e72ba..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/groups/GroupsImpl.java
+++ /dev/null
@@ -1,184 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.api.groups;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
-
-import com.google.gerrit.extensions.api.groups.GroupApi;
-import com.google.gerrit.extensions.api.groups.GroupInput;
-import com.google.gerrit.extensions.api.groups.Groups;
-import com.google.gerrit.extensions.client.ListGroupsOption;
-import com.google.gerrit.extensions.common.GroupInfo;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.account.AccountsCollection;
-import com.google.gerrit.server.group.CreateGroup;
-import com.google.gerrit.server.group.GroupsCollection;
-import com.google.gerrit.server.group.ListGroups;
-import com.google.gerrit.server.group.QueryGroups;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.project.ProjectsCollection;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.List;
-import java.util.SortedMap;
-
-@Singleton
-class GroupsImpl implements Groups {
-  private final AccountsCollection accounts;
-  private final GroupsCollection groups;
-  private final ProjectsCollection projects;
-  private final Provider<ListGroups> listGroups;
-  private final Provider<QueryGroups> queryGroups;
-  private final Provider<CurrentUser> user;
-  private final PermissionBackend permissionBackend;
-  private final CreateGroup.Factory createGroup;
-  private final GroupApiImpl.Factory api;
-
-  @Inject
-  GroupsImpl(
-      AccountsCollection accounts,
-      GroupsCollection groups,
-      ProjectsCollection projects,
-      Provider<ListGroups> listGroups,
-      Provider<QueryGroups> queryGroups,
-      Provider<CurrentUser> user,
-      PermissionBackend permissionBackend,
-      CreateGroup.Factory createGroup,
-      GroupApiImpl.Factory api) {
-    this.accounts = accounts;
-    this.groups = groups;
-    this.projects = projects;
-    this.listGroups = listGroups;
-    this.queryGroups = queryGroups;
-    this.user = user;
-    this.permissionBackend = permissionBackend;
-    this.createGroup = createGroup;
-    this.api = api;
-  }
-
-  @Override
-  public GroupApi id(String id) throws RestApiException {
-    return api.create(groups.parse(TopLevelResource.INSTANCE, IdString.fromDecoded(id)));
-  }
-
-  @Override
-  public GroupApi create(String name) throws RestApiException {
-    GroupInput in = new GroupInput();
-    in.name = name;
-    return create(in);
-  }
-
-  @Override
-  public GroupApi create(GroupInput in) throws RestApiException {
-    if (checkNotNull(in, "GroupInput").name == null) {
-      throw new BadRequestException("GroupInput must specify name");
-    }
-    try {
-      CreateGroup impl = createGroup.create(in.name);
-      permissionBackend.user(user).checkAny(GlobalPermission.fromAnnotation(impl.getClass()));
-      GroupInfo info = impl.apply(TopLevelResource.INSTANCE, in);
-      return id(info.id);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot create group " + in.name, e);
-    }
-  }
-
-  @Override
-  public ListRequest list() {
-    return new ListRequest() {
-      @Override
-      public SortedMap<String, GroupInfo> getAsMap() throws RestApiException {
-        return list(this);
-      }
-    };
-  }
-
-  private SortedMap<String, GroupInfo> list(ListRequest req) throws RestApiException {
-    TopLevelResource tlr = TopLevelResource.INSTANCE;
-    ListGroups list = listGroups.get();
-    list.setOptions(req.getOptions());
-
-    for (String project : req.getProjects()) {
-      try {
-        list.addProject(projects.parse(tlr, IdString.fromDecoded(project)).getControl());
-      } catch (Exception e) {
-        throw asRestApiException("Error looking up project " + project, e);
-      }
-    }
-
-    for (String group : req.getGroups()) {
-      list.addGroup(groups.parse(group).getGroupUUID());
-    }
-
-    list.setVisibleToAll(req.getVisibleToAll());
-
-    if (req.getUser() != null) {
-      try {
-        list.setUser(accounts.parse(req.getUser()).getAccountId());
-      } catch (Exception e) {
-        throw asRestApiException("Error looking up user " + req.getUser(), e);
-      }
-    }
-
-    list.setOwned(req.getOwned());
-    list.setLimit(req.getLimit());
-    list.setStart(req.getStart());
-    list.setMatchSubstring(req.getSubstring());
-    list.setMatchRegex(req.getRegex());
-    list.setSuggest(req.getSuggest());
-    try {
-      return list.apply(tlr);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot list groups", e);
-    }
-  }
-
-  @Override
-  public QueryRequest query() {
-    return new QueryRequest() {
-      @Override
-      public List<GroupInfo> get() throws RestApiException {
-        return GroupsImpl.this.query(this);
-      }
-    };
-  }
-
-  @Override
-  public QueryRequest query(String query) {
-    return query().withQuery(query);
-  }
-
-  private List<GroupInfo> query(QueryRequest r) throws RestApiException {
-    try {
-      QueryGroups myQueryGroups = queryGroups.get();
-      myQueryGroups.setQuery(r.getQuery());
-      myQueryGroups.setLimit(r.getLimit());
-      myQueryGroups.setStart(r.getStart());
-      for (ListGroupsOption option : r.getOptions()) {
-        myQueryGroups.addOption(option);
-      }
-      return myQueryGroups.apply(TopLevelResource.INSTANCE);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot query groups", e);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/plugins/PluginApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/plugins/PluginApiImpl.java
deleted file mode 100644
index 2fc2e50..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/plugins/PluginApiImpl.java
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.api.plugins;
-
-import com.google.gerrit.extensions.api.plugins.PluginApi;
-import com.google.gerrit.extensions.common.PluginInfo;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.server.plugins.DisablePlugin;
-import com.google.gerrit.server.plugins.EnablePlugin;
-import com.google.gerrit.server.plugins.GetStatus;
-import com.google.gerrit.server.plugins.PluginResource;
-import com.google.gerrit.server.plugins.ReloadPlugin;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-
-public class PluginApiImpl implements PluginApi {
-  public interface Factory {
-    PluginApiImpl create(PluginResource resource);
-  }
-
-  private final GetStatus getStatus;
-  private final EnablePlugin enable;
-  private final DisablePlugin disable;
-  private final ReloadPlugin reload;
-  private final PluginResource resource;
-
-  @Inject
-  PluginApiImpl(
-      GetStatus getStatus,
-      EnablePlugin enable,
-      DisablePlugin disable,
-      ReloadPlugin reload,
-      @Assisted PluginResource resource) {
-    this.getStatus = getStatus;
-    this.enable = enable;
-    this.disable = disable;
-    this.reload = reload;
-    this.resource = resource;
-  }
-
-  @Override
-  public PluginInfo get() throws RestApiException {
-    return getStatus.apply(resource);
-  }
-
-  @Override
-  public void enable() throws RestApiException {
-    enable.apply(resource, new EnablePlugin.Input());
-  }
-
-  @Override
-  public void disable() throws RestApiException {
-    disable.apply(resource, new DisablePlugin.Input());
-  }
-
-  @Override
-  public void reload() throws RestApiException {
-    reload.apply(resource, new ReloadPlugin.Input());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/plugins/PluginsImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/plugins/PluginsImpl.java
deleted file mode 100644
index fb2fb27..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/plugins/PluginsImpl.java
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.api.plugins;
-
-import com.google.gerrit.extensions.api.plugins.PluginApi;
-import com.google.gerrit.extensions.api.plugins.Plugins;
-import com.google.gerrit.extensions.common.InstallPluginInput;
-import com.google.gerrit.extensions.common.PluginInfo;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.server.plugins.InstallPlugin;
-import com.google.gerrit.server.plugins.ListPlugins;
-import com.google.gerrit.server.plugins.PluginsCollection;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.SortedMap;
-
-@Singleton
-public class PluginsImpl implements Plugins {
-  private final PluginsCollection plugins;
-  private final Provider<ListPlugins> listProvider;
-  private final Provider<InstallPlugin> installProvider;
-  private final PluginApiImpl.Factory pluginApi;
-
-  @Inject
-  PluginsImpl(
-      PluginsCollection plugins,
-      Provider<ListPlugins> listProvider,
-      Provider<InstallPlugin> installProvider,
-      PluginApiImpl.Factory pluginApi) {
-    this.plugins = plugins;
-    this.listProvider = listProvider;
-    this.installProvider = installProvider;
-    this.pluginApi = pluginApi;
-  }
-
-  @Override
-  public PluginApi name(String name) throws RestApiException {
-    return pluginApi.create(plugins.parse(name));
-  }
-
-  @Override
-  public ListRequest list() {
-    return new ListRequest() {
-      @Override
-      public SortedMap<String, PluginInfo> getAsMap() throws RestApiException {
-        return listProvider.get().request(this).apply(TopLevelResource.INSTANCE);
-      }
-    };
-  }
-
-  @Override
-  public PluginApi install(String name, InstallPluginInput input) throws RestApiException {
-    try {
-      Response<PluginInfo> created =
-          installProvider.get().setName(name).apply(TopLevelResource.INSTANCE, input);
-      return pluginApi.create(plugins.parse(created.value().id));
-    } catch (IOException e) {
-      throw new RestApiException("could not install plugin", e);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/BranchApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/BranchApiImpl.java
deleted file mode 100644
index 642791a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/BranchApiImpl.java
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.api.projects;
-
-import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
-
-import com.google.gerrit.extensions.api.projects.BranchApi;
-import com.google.gerrit.extensions.api.projects.BranchInfo;
-import com.google.gerrit.extensions.api.projects.BranchInput;
-import com.google.gerrit.extensions.api.projects.ReflogEntryInfo;
-import com.google.gerrit.extensions.restapi.BinaryResult;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.BranchResource;
-import com.google.gerrit.server.project.BranchesCollection;
-import com.google.gerrit.server.project.CreateBranch;
-import com.google.gerrit.server.project.DeleteBranch;
-import com.google.gerrit.server.project.FileResource;
-import com.google.gerrit.server.project.FilesCollection;
-import com.google.gerrit.server.project.GetBranch;
-import com.google.gerrit.server.project.GetContent;
-import com.google.gerrit.server.project.GetReflog;
-import com.google.gerrit.server.project.ProjectResource;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.util.List;
-
-public class BranchApiImpl implements BranchApi {
-  interface Factory {
-    BranchApiImpl create(ProjectResource project, String ref);
-  }
-
-  private final BranchesCollection branches;
-  private final CreateBranch.Factory createBranchFactory;
-  private final DeleteBranch deleteBranch;
-  private final FilesCollection filesCollection;
-  private final GetBranch getBranch;
-  private final GetContent getContent;
-  private final GetReflog getReflog;
-  private final String ref;
-  private final ProjectResource project;
-
-  @Inject
-  BranchApiImpl(
-      BranchesCollection branches,
-      CreateBranch.Factory createBranchFactory,
-      DeleteBranch deleteBranch,
-      FilesCollection filesCollection,
-      GetBranch getBranch,
-      GetContent getContent,
-      GetReflog getReflog,
-      @Assisted ProjectResource project,
-      @Assisted String ref) {
-    this.branches = branches;
-    this.createBranchFactory = createBranchFactory;
-    this.deleteBranch = deleteBranch;
-    this.filesCollection = filesCollection;
-    this.getBranch = getBranch;
-    this.getContent = getContent;
-    this.getReflog = getReflog;
-    this.project = project;
-    this.ref = ref;
-  }
-
-  @Override
-  public BranchApi create(BranchInput input) throws RestApiException {
-    try {
-      createBranchFactory.create(ref).apply(project, input);
-      return this;
-    } catch (Exception e) {
-      throw asRestApiException("Cannot create branch", e);
-    }
-  }
-
-  @Override
-  public BranchInfo get() throws RestApiException {
-    try {
-      return getBranch.apply(resource());
-    } catch (Exception e) {
-      throw asRestApiException("Cannot read branch", e);
-    }
-  }
-
-  @Override
-  public void delete() throws RestApiException {
-    try {
-      deleteBranch.apply(resource(), new DeleteBranch.Input());
-    } catch (Exception e) {
-      throw asRestApiException("Cannot delete branch", e);
-    }
-  }
-
-  @Override
-  public BinaryResult file(String path) throws RestApiException {
-    try {
-      FileResource resource = filesCollection.parse(resource(), IdString.fromDecoded(path));
-      return getContent.apply(resource);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve file", e);
-    }
-  }
-
-  @Override
-  public List<ReflogEntryInfo> reflog() throws RestApiException {
-    try {
-      return getReflog.apply(resource());
-    } catch (IOException | PermissionBackendException e) {
-      throw new RestApiException("Cannot retrieve reflog", e);
-    }
-  }
-
-  private BranchResource resource()
-      throws RestApiException, IOException, PermissionBackendException {
-    return branches.parse(project, IdString.fromDecoded(ref));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ChildProjectApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ChildProjectApiImpl.java
deleted file mode 100644
index 1595682..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ChildProjectApiImpl.java
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.api.projects;
-
-import com.google.gerrit.extensions.api.projects.ChildProjectApi;
-import com.google.gerrit.extensions.common.ProjectInfo;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.server.project.ChildProjectResource;
-import com.google.gerrit.server.project.GetChildProject;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-
-public class ChildProjectApiImpl implements ChildProjectApi {
-  interface Factory {
-    ChildProjectApiImpl create(ChildProjectResource rsrc);
-  }
-
-  private final GetChildProject getChildProject;
-  private final ChildProjectResource rsrc;
-
-  @Inject
-  ChildProjectApiImpl(GetChildProject getChildProject, @Assisted ChildProjectResource rsrc) {
-    this.getChildProject = getChildProject;
-    this.rsrc = rsrc;
-  }
-
-  @Override
-  public ProjectInfo get() throws RestApiException {
-    return get(false);
-  }
-
-  @Override
-  public ProjectInfo get(boolean recursive) throws RestApiException {
-    getChildProject.setRecursive(recursive);
-    return getChildProject.apply(rsrc);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/CommitApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/CommitApiImpl.java
deleted file mode 100644
index c0a5a2c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/CommitApiImpl.java
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.api.projects;
-
-import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
-
-import com.google.gerrit.extensions.api.changes.ChangeApi;
-import com.google.gerrit.extensions.api.changes.Changes;
-import com.google.gerrit.extensions.api.changes.CherryPickInput;
-import com.google.gerrit.extensions.api.changes.IncludedInInfo;
-import com.google.gerrit.extensions.api.projects.CommitApi;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.server.change.CherryPickCommit;
-import com.google.gerrit.server.project.CommitIncludedIn;
-import com.google.gerrit.server.project.CommitResource;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-
-public class CommitApiImpl implements CommitApi {
-  public interface Factory {
-    CommitApiImpl create(CommitResource r);
-  }
-
-  private final Changes changes;
-  private final CherryPickCommit cherryPickCommit;
-  private final CommitIncludedIn includedIn;
-  private final CommitResource commitResource;
-
-  @Inject
-  CommitApiImpl(
-      Changes changes,
-      CherryPickCommit cherryPickCommit,
-      CommitIncludedIn includedIn,
-      @Assisted CommitResource commitResource) {
-    this.changes = changes;
-    this.cherryPickCommit = cherryPickCommit;
-    this.includedIn = includedIn;
-    this.commitResource = commitResource;
-  }
-
-  @Override
-  public ChangeApi cherryPick(CherryPickInput input) throws RestApiException {
-    try {
-      return changes.id(cherryPickCommit.apply(commitResource, input)._number);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot cherry pick", e);
-    }
-  }
-
-  @Override
-  public IncludedInInfo includedIn() throws RestApiException {
-    try {
-      return includedIn.apply(commitResource);
-    } catch (Exception e) {
-      throw asRestApiException("Could not extract IncludedIn data", e);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/DashboardApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/DashboardApiImpl.java
deleted file mode 100644
index 0d4afd6..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/DashboardApiImpl.java
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.api.projects;
-
-import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.api.projects.DashboardApi;
-import com.google.gerrit.extensions.api.projects.DashboardInfo;
-import com.google.gerrit.extensions.common.SetDashboardInput;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.DashboardResource;
-import com.google.gerrit.server.project.DashboardsCollection;
-import com.google.gerrit.server.project.GetDashboard;
-import com.google.gerrit.server.project.ProjectResource;
-import com.google.gerrit.server.project.SetDashboard;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-public class DashboardApiImpl implements DashboardApi {
-  interface Factory {
-    DashboardApiImpl create(ProjectResource project, String id);
-  }
-
-  private final DashboardsCollection dashboards;
-  private final Provider<GetDashboard> get;
-  private final SetDashboard set;
-  private final ProjectResource project;
-  private final String id;
-
-  @Inject
-  DashboardApiImpl(
-      DashboardsCollection dashboards,
-      Provider<GetDashboard> get,
-      SetDashboard set,
-      @Assisted ProjectResource project,
-      @Assisted @Nullable String id) {
-    this.dashboards = dashboards;
-    this.get = get;
-    this.set = set;
-    this.project = project;
-    this.id = id;
-  }
-
-  @Override
-  public DashboardInfo get() throws RestApiException {
-    return get(false);
-  }
-
-  @Override
-  public DashboardInfo get(boolean inherited) throws RestApiException {
-    try {
-      return get.get().setInherited(inherited).apply(resource());
-    } catch (IOException | PermissionBackendException | ConfigInvalidException e) {
-      throw asRestApiException("Cannot read dashboard", e);
-    }
-  }
-
-  @Override
-  public void setDefault() throws RestApiException {
-    SetDashboardInput input = new SetDashboardInput();
-    input.id = id;
-    try {
-      set.apply(DashboardResource.projectDefault(project.getControl()), input);
-    } catch (Exception e) {
-      String msg = String.format("Cannot %s default dashboard", id != null ? "set" : "remove");
-      throw asRestApiException(msg, e);
-    }
-  }
-
-  private DashboardResource resource()
-      throws ResourceNotFoundException, IOException, ConfigInvalidException,
-          PermissionBackendException {
-    return dashboards.parse(project, IdString.fromDecoded(id));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java
deleted file mode 100644
index e6d5ff3..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java
+++ /dev/null
@@ -1,569 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.api.projects;
-
-import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
-import static com.google.gerrit.server.project.DashboardsCollection.DEFAULT_DASHBOARD_NAME;
-import static java.util.stream.Collectors.toList;
-
-import com.google.gerrit.extensions.api.access.ProjectAccessInfo;
-import com.google.gerrit.extensions.api.access.ProjectAccessInput;
-import com.google.gerrit.extensions.api.config.AccessCheckInfo;
-import com.google.gerrit.extensions.api.config.AccessCheckInput;
-import com.google.gerrit.extensions.api.projects.BranchApi;
-import com.google.gerrit.extensions.api.projects.BranchInfo;
-import com.google.gerrit.extensions.api.projects.ChildProjectApi;
-import com.google.gerrit.extensions.api.projects.CommitApi;
-import com.google.gerrit.extensions.api.projects.ConfigInfo;
-import com.google.gerrit.extensions.api.projects.ConfigInput;
-import com.google.gerrit.extensions.api.projects.DashboardApi;
-import com.google.gerrit.extensions.api.projects.DashboardInfo;
-import com.google.gerrit.extensions.api.projects.DeleteBranchesInput;
-import com.google.gerrit.extensions.api.projects.DeleteTagsInput;
-import com.google.gerrit.extensions.api.projects.DescriptionInput;
-import com.google.gerrit.extensions.api.projects.ProjectApi;
-import com.google.gerrit.extensions.api.projects.ProjectInput;
-import com.google.gerrit.extensions.api.projects.TagApi;
-import com.google.gerrit.extensions.api.projects.TagInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.ProjectInfo;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.NotImplementedException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.project.CheckAccess;
-import com.google.gerrit.server.project.ChildProjectsCollection;
-import com.google.gerrit.server.project.CommitsCollection;
-import com.google.gerrit.server.project.CreateAccessChange;
-import com.google.gerrit.server.project.CreateProject;
-import com.google.gerrit.server.project.DeleteBranches;
-import com.google.gerrit.server.project.DeleteTags;
-import com.google.gerrit.server.project.GetAccess;
-import com.google.gerrit.server.project.GetConfig;
-import com.google.gerrit.server.project.GetDescription;
-import com.google.gerrit.server.project.GetHead;
-import com.google.gerrit.server.project.ListBranches;
-import com.google.gerrit.server.project.ListChildProjects;
-import com.google.gerrit.server.project.ListDashboards;
-import com.google.gerrit.server.project.ListTags;
-import com.google.gerrit.server.project.ProjectJson;
-import com.google.gerrit.server.project.ProjectResource;
-import com.google.gerrit.server.project.ProjectsCollection;
-import com.google.gerrit.server.project.PutConfig;
-import com.google.gerrit.server.project.PutDescription;
-import com.google.gerrit.server.project.SetAccess;
-import com.google.gerrit.server.project.SetHead;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import com.google.inject.assistedinject.AssistedInject;
-import java.util.Collections;
-import java.util.List;
-
-public class ProjectApiImpl implements ProjectApi {
-  interface Factory {
-    ProjectApiImpl create(ProjectResource project);
-
-    ProjectApiImpl create(String name);
-  }
-
-  private final CurrentUser user;
-  private final PermissionBackend permissionBackend;
-  private final CreateProject.Factory createProjectFactory;
-  private final ProjectApiImpl.Factory projectApi;
-  private final ProjectsCollection projects;
-  private final GetDescription getDescription;
-  private final PutDescription putDescription;
-  private final ChildProjectApiImpl.Factory childApi;
-  private final ChildProjectsCollection children;
-  private final ProjectResource project;
-  private final ProjectJson projectJson;
-  private final String name;
-  private final BranchApiImpl.Factory branchApi;
-  private final TagApiImpl.Factory tagApi;
-  private final GetAccess getAccess;
-  private final SetAccess setAccess;
-  private final CreateAccessChange createAccessChange;
-  private final GetConfig getConfig;
-  private final PutConfig putConfig;
-  private final Provider<ListBranches> listBranches;
-  private final Provider<ListTags> listTags;
-  private final DeleteBranches deleteBranches;
-  private final DeleteTags deleteTags;
-  private final CommitsCollection commitsCollection;
-  private final CommitApiImpl.Factory commitApi;
-  private final DashboardApiImpl.Factory dashboardApi;
-  private final CheckAccess checkAccess;
-  private final Provider<ListDashboards> listDashboards;
-  private final GetHead getHead;
-  private final SetHead setHead;
-
-  @AssistedInject
-  ProjectApiImpl(
-      CurrentUser user,
-      PermissionBackend permissionBackend,
-      CreateProject.Factory createProjectFactory,
-      ProjectApiImpl.Factory projectApi,
-      ProjectsCollection projects,
-      GetDescription getDescription,
-      PutDescription putDescription,
-      ChildProjectApiImpl.Factory childApi,
-      ChildProjectsCollection children,
-      ProjectJson projectJson,
-      BranchApiImpl.Factory branchApiFactory,
-      TagApiImpl.Factory tagApiFactory,
-      GetAccess getAccess,
-      SetAccess setAccess,
-      CreateAccessChange createAccessChange,
-      GetConfig getConfig,
-      PutConfig putConfig,
-      Provider<ListBranches> listBranches,
-      Provider<ListTags> listTags,
-      DeleteBranches deleteBranches,
-      DeleteTags deleteTags,
-      CommitsCollection commitsCollection,
-      CommitApiImpl.Factory commitApi,
-      DashboardApiImpl.Factory dashboardApi,
-      CheckAccess checkAccess,
-      Provider<ListDashboards> listDashboards,
-      GetHead getHead,
-      SetHead setHead,
-      @Assisted ProjectResource project) {
-    this(
-        user,
-        permissionBackend,
-        createProjectFactory,
-        projectApi,
-        projects,
-        getDescription,
-        putDescription,
-        childApi,
-        children,
-        projectJson,
-        branchApiFactory,
-        tagApiFactory,
-        getAccess,
-        setAccess,
-        createAccessChange,
-        getConfig,
-        putConfig,
-        listBranches,
-        listTags,
-        deleteBranches,
-        deleteTags,
-        project,
-        commitsCollection,
-        commitApi,
-        dashboardApi,
-        checkAccess,
-        listDashboards,
-        getHead,
-        setHead,
-        null);
-  }
-
-  @AssistedInject
-  ProjectApiImpl(
-      CurrentUser user,
-      PermissionBackend permissionBackend,
-      CreateProject.Factory createProjectFactory,
-      ProjectApiImpl.Factory projectApi,
-      ProjectsCollection projects,
-      GetDescription getDescription,
-      PutDescription putDescription,
-      ChildProjectApiImpl.Factory childApi,
-      ChildProjectsCollection children,
-      ProjectJson projectJson,
-      BranchApiImpl.Factory branchApiFactory,
-      TagApiImpl.Factory tagApiFactory,
-      GetAccess getAccess,
-      SetAccess setAccess,
-      CreateAccessChange createAccessChange,
-      GetConfig getConfig,
-      PutConfig putConfig,
-      Provider<ListBranches> listBranches,
-      Provider<ListTags> listTags,
-      DeleteBranches deleteBranches,
-      DeleteTags deleteTags,
-      CommitsCollection commitsCollection,
-      CommitApiImpl.Factory commitApi,
-      DashboardApiImpl.Factory dashboardApi,
-      CheckAccess checkAccess,
-      Provider<ListDashboards> listDashboards,
-      GetHead getHead,
-      SetHead setHead,
-      @Assisted String name) {
-    this(
-        user,
-        permissionBackend,
-        createProjectFactory,
-        projectApi,
-        projects,
-        getDescription,
-        putDescription,
-        childApi,
-        children,
-        projectJson,
-        branchApiFactory,
-        tagApiFactory,
-        getAccess,
-        setAccess,
-        createAccessChange,
-        getConfig,
-        putConfig,
-        listBranches,
-        listTags,
-        deleteBranches,
-        deleteTags,
-        null,
-        commitsCollection,
-        commitApi,
-        dashboardApi,
-        checkAccess,
-        listDashboards,
-        getHead,
-        setHead,
-        name);
-  }
-
-  private ProjectApiImpl(
-      CurrentUser user,
-      PermissionBackend permissionBackend,
-      CreateProject.Factory createProjectFactory,
-      ProjectApiImpl.Factory projectApi,
-      ProjectsCollection projects,
-      GetDescription getDescription,
-      PutDescription putDescription,
-      ChildProjectApiImpl.Factory childApi,
-      ChildProjectsCollection children,
-      ProjectJson projectJson,
-      BranchApiImpl.Factory branchApiFactory,
-      TagApiImpl.Factory tagApiFactory,
-      GetAccess getAccess,
-      SetAccess setAccess,
-      CreateAccessChange createAccessChange,
-      GetConfig getConfig,
-      PutConfig putConfig,
-      Provider<ListBranches> listBranches,
-      Provider<ListTags> listTags,
-      DeleteBranches deleteBranches,
-      DeleteTags deleteTags,
-      ProjectResource project,
-      CommitsCollection commitsCollection,
-      CommitApiImpl.Factory commitApi,
-      DashboardApiImpl.Factory dashboardApi,
-      CheckAccess checkAccess,
-      Provider<ListDashboards> listDashboards,
-      GetHead getHead,
-      SetHead setHead,
-      String name) {
-    this.user = user;
-    this.permissionBackend = permissionBackend;
-    this.createProjectFactory = createProjectFactory;
-    this.projectApi = projectApi;
-    this.projects = projects;
-    this.getDescription = getDescription;
-    this.putDescription = putDescription;
-    this.childApi = childApi;
-    this.children = children;
-    this.projectJson = projectJson;
-    this.project = project;
-    this.branchApi = branchApiFactory;
-    this.tagApi = tagApiFactory;
-    this.getAccess = getAccess;
-    this.setAccess = setAccess;
-    this.getConfig = getConfig;
-    this.putConfig = putConfig;
-    this.listBranches = listBranches;
-    this.listTags = listTags;
-    this.deleteBranches = deleteBranches;
-    this.deleteTags = deleteTags;
-    this.commitsCollection = commitsCollection;
-    this.commitApi = commitApi;
-    this.createAccessChange = createAccessChange;
-    this.dashboardApi = dashboardApi;
-    this.checkAccess = checkAccess;
-    this.listDashboards = listDashboards;
-    this.getHead = getHead;
-    this.setHead = setHead;
-    this.name = name;
-  }
-
-  @Override
-  public ProjectApi create() throws RestApiException {
-    return create(new ProjectInput());
-  }
-
-  @Override
-  public ProjectApi create(ProjectInput in) throws RestApiException {
-    try {
-      if (name == null) {
-        throw new ResourceConflictException("Project already exists");
-      }
-      if (in.name != null && !name.equals(in.name)) {
-        throw new BadRequestException("name must match input.name");
-      }
-      CreateProject impl = createProjectFactory.create(name);
-      permissionBackend.user(user).checkAny(GlobalPermission.fromAnnotation(impl.getClass()));
-      impl.apply(TopLevelResource.INSTANCE, in);
-      return projectApi.create(projects.parse(name));
-    } catch (Exception e) {
-      throw asRestApiException("Cannot create project: " + e.getMessage(), e);
-    }
-  }
-
-  @Override
-  public ProjectInfo get() throws RestApiException {
-    if (project == null) {
-      throw new ResourceNotFoundException(name);
-    }
-    return projectJson.format(project.getProjectState());
-  }
-
-  @Override
-  public String description() throws RestApiException {
-    return getDescription.apply(checkExists());
-  }
-
-  @Override
-  public ProjectAccessInfo access() throws RestApiException {
-    try {
-      return getAccess.apply(checkExists());
-    } catch (Exception e) {
-      throw asRestApiException("Cannot get access rights", e);
-    }
-  }
-
-  @Override
-  public AccessCheckInfo checkAccess(AccessCheckInput in) throws RestApiException {
-    try {
-      return checkAccess.apply(checkExists(), in);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot check access rights", e);
-    }
-  }
-
-  @Override
-  public ProjectAccessInfo access(ProjectAccessInput p) throws RestApiException {
-    try {
-      return setAccess.apply(checkExists(), p);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot put access rights", e);
-    }
-  }
-
-  @Override
-  public ChangeInfo accessChange(ProjectAccessInput p) throws RestApiException {
-    try {
-      return createAccessChange.apply(checkExists(), p).value();
-    } catch (Exception e) {
-      throw asRestApiException("Cannot put access right change", e);
-    }
-  }
-
-  @Override
-  public void description(DescriptionInput in) throws RestApiException {
-    try {
-      putDescription.apply(checkExists(), in);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot put project description", e);
-    }
-  }
-
-  @Override
-  public ConfigInfo config() throws RestApiException {
-    return getConfig.apply(checkExists());
-  }
-
-  @Override
-  public ConfigInfo config(ConfigInput in) throws RestApiException {
-    return putConfig.apply(checkExists(), in);
-  }
-
-  @Override
-  public ListRefsRequest<BranchInfo> branches() {
-    return new ListRefsRequest<BranchInfo>() {
-      @Override
-      public List<BranchInfo> get() throws RestApiException {
-        try {
-          return listBranches.get().request(this).apply(checkExists());
-        } catch (Exception e) {
-          throw asRestApiException("Cannot list branches", e);
-        }
-      }
-    };
-  }
-
-  @Override
-  public ListRefsRequest<TagInfo> tags() {
-    return new ListRefsRequest<TagInfo>() {
-      @Override
-      public List<TagInfo> get() throws RestApiException {
-        try {
-          return listTags.get().request(this).apply(checkExists());
-        } catch (Exception e) {
-          throw asRestApiException("Cannot list tags", e);
-        }
-      }
-    };
-  }
-
-  @Override
-  public List<ProjectInfo> children() throws RestApiException {
-    return children(false);
-  }
-
-  @Override
-  public List<ProjectInfo> children(boolean recursive) throws RestApiException {
-    ListChildProjects list = children.list();
-    list.setRecursive(recursive);
-    try {
-      return list.apply(checkExists());
-    } catch (Exception e) {
-      throw asRestApiException("Cannot list children", e);
-    }
-  }
-
-  @Override
-  public ChildProjectApi child(String name) throws RestApiException {
-    try {
-      return childApi.create(children.parse(checkExists(), IdString.fromDecoded(name)));
-    } catch (Exception e) {
-      throw asRestApiException("Cannot parse child project", e);
-    }
-  }
-
-  @Override
-  public BranchApi branch(String ref) throws ResourceNotFoundException {
-    return branchApi.create(checkExists(), ref);
-  }
-
-  @Override
-  public TagApi tag(String ref) throws ResourceNotFoundException {
-    return tagApi.create(checkExists(), ref);
-  }
-
-  @Override
-  public void deleteBranches(DeleteBranchesInput in) throws RestApiException {
-    try {
-      deleteBranches.apply(checkExists(), in);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot delete branches", e);
-    }
-  }
-
-  @Override
-  public void deleteTags(DeleteTagsInput in) throws RestApiException {
-    try {
-      deleteTags.apply(checkExists(), in);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot delete tags", e);
-    }
-  }
-
-  @Override
-  public CommitApi commit(String commit) throws RestApiException {
-    try {
-      return commitApi.create(commitsCollection.parse(checkExists(), IdString.fromDecoded(commit)));
-    } catch (Exception e) {
-      throw asRestApiException("Cannot parse commit", e);
-    }
-  }
-
-  @Override
-  public DashboardApi dashboard(String name) throws RestApiException {
-    try {
-      return dashboardApi.create(checkExists(), name);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot parse dashboard", e);
-    }
-  }
-
-  @Override
-  public DashboardApi defaultDashboard() throws RestApiException {
-    return dashboard(DEFAULT_DASHBOARD_NAME);
-  }
-
-  @Override
-  public void defaultDashboard(String name) throws RestApiException {
-    try {
-      dashboardApi.create(checkExists(), name).setDefault();
-    } catch (Exception e) {
-      throw asRestApiException("Cannot set default dashboard", e);
-    }
-  }
-
-  @Override
-  public void removeDefaultDashboard() throws RestApiException {
-    try {
-      dashboardApi.create(checkExists(), null).setDefault();
-    } catch (Exception e) {
-      throw asRestApiException("Cannot remove default dashboard", e);
-    }
-  }
-
-  @Override
-  public ListDashboardsRequest dashboards() throws RestApiException {
-    return new ListDashboardsRequest() {
-      @Override
-      public List<DashboardInfo> get() throws RestApiException {
-        try {
-          List<?> r = listDashboards.get().apply(checkExists());
-          if (r.isEmpty()) {
-            return Collections.emptyList();
-          }
-          if (r.get(0) instanceof DashboardInfo) {
-            return r.stream().map(i -> (DashboardInfo) i).collect(toList());
-          }
-          throw new NotImplementedException("list with inheritance");
-        } catch (Exception e) {
-          throw asRestApiException("Cannot list dashboards", e);
-        }
-      }
-    };
-  }
-
-  @Override
-  public String head() throws RestApiException {
-    try {
-      return getHead.apply(checkExists());
-    } catch (Exception e) {
-      throw asRestApiException("Cannot get HEAD", e);
-    }
-  }
-
-  @Override
-  public void head(String head) throws RestApiException {
-    SetHead.Input input = new SetHead.Input();
-    input.ref = head;
-    try {
-      setHead.apply(checkExists(), input);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot set HEAD", e);
-    }
-  }
-
-  private ProjectResource checkExists() throws ResourceNotFoundException {
-    if (project == null) {
-      throw new ResourceNotFoundException(name);
-    }
-    return project;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectsImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectsImpl.java
deleted file mode 100644
index 702a7e9..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectsImpl.java
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.api.projects;
-
-import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
-
-import com.google.gerrit.extensions.api.projects.ProjectApi;
-import com.google.gerrit.extensions.api.projects.ProjectInput;
-import com.google.gerrit.extensions.api.projects.Projects;
-import com.google.gerrit.extensions.common.ProjectInfo;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.ListProjects;
-import com.google.gerrit.server.project.ListProjects.FilterType;
-import com.google.gerrit.server.project.ProjectsCollection;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.SortedMap;
-
-@Singleton
-class ProjectsImpl implements Projects {
-  private final ProjectsCollection projects;
-  private final ProjectApiImpl.Factory api;
-  private final Provider<ListProjects> listProvider;
-
-  @Inject
-  ProjectsImpl(
-      ProjectsCollection projects,
-      ProjectApiImpl.Factory api,
-      Provider<ListProjects> listProvider) {
-    this.projects = projects;
-    this.api = api;
-    this.listProvider = listProvider;
-  }
-
-  @Override
-  public ProjectApi name(String name) throws RestApiException {
-    try {
-      return api.create(projects.parse(name));
-    } catch (UnprocessableEntityException e) {
-      return api.create(name);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot retrieve project", e);
-    }
-  }
-
-  @Override
-  public ProjectApi create(String name) throws RestApiException {
-    ProjectInput in = new ProjectInput();
-    in.name = name;
-    return create(in);
-  }
-
-  @Override
-  public ProjectApi create(ProjectInput in) throws RestApiException {
-    if (in.name == null) {
-      throw new BadRequestException("input.name is required");
-    }
-    return name(in.name).create(in);
-  }
-
-  @Override
-  public ListRequest list() {
-    return new ListRequest() {
-      @Override
-      public SortedMap<String, ProjectInfo> getAsMap() throws RestApiException {
-        try {
-          return list(this);
-        } catch (Exception e) {
-          throw asRestApiException("project list unavailable", e);
-        }
-      }
-    };
-  }
-
-  private SortedMap<String, ProjectInfo> list(ListRequest request)
-      throws RestApiException, PermissionBackendException {
-    ListProjects lp = listProvider.get();
-    lp.setShowDescription(request.getDescription());
-    lp.setLimit(request.getLimit());
-    lp.setStart(request.getStart());
-    lp.setMatchPrefix(request.getPrefix());
-
-    lp.setMatchSubstring(request.getSubstring());
-    lp.setMatchRegex(request.getRegex());
-    lp.setShowTree(request.getShowTree());
-    for (String branch : request.getBranches()) {
-      lp.addShowBranch(branch);
-    }
-
-    FilterType type;
-    switch (request.getFilterType()) {
-      case ALL:
-        type = FilterType.ALL;
-        break;
-      case CODE:
-        type = FilterType.CODE;
-        break;
-      case PARENT_CANDIDATES:
-        type = FilterType.PARENT_CANDIDATES;
-        break;
-      case PERMISSIONS:
-        type = FilterType.PERMISSIONS;
-        break;
-      default:
-        throw new BadRequestException("Unknown filter type: " + request.getFilterType());
-    }
-    lp.setFilterType(type);
-
-    return lp.apply();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/TagApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/TagApiImpl.java
deleted file mode 100644
index 283d117..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/TagApiImpl.java
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.api.projects;
-
-import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
-
-import com.google.gerrit.extensions.api.projects.TagApi;
-import com.google.gerrit.extensions.api.projects.TagInfo;
-import com.google.gerrit.extensions.api.projects.TagInput;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.server.project.CreateTag;
-import com.google.gerrit.server.project.DeleteTag;
-import com.google.gerrit.server.project.ListTags;
-import com.google.gerrit.server.project.ProjectResource;
-import com.google.gerrit.server.project.TagResource;
-import com.google.gerrit.server.project.TagsCollection;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-
-public class TagApiImpl implements TagApi {
-  interface Factory {
-    TagApiImpl create(ProjectResource project, String ref);
-  }
-
-  private final ListTags listTags;
-  private final CreateTag.Factory createTagFactory;
-  private final DeleteTag deleteTag;
-  private final TagsCollection tags;
-  private final String ref;
-  private final ProjectResource project;
-
-  @Inject
-  TagApiImpl(
-      ListTags listTags,
-      CreateTag.Factory createTagFactory,
-      DeleteTag deleteTag,
-      TagsCollection tags,
-      @Assisted ProjectResource project,
-      @Assisted String ref) {
-    this.listTags = listTags;
-    this.createTagFactory = createTagFactory;
-    this.deleteTag = deleteTag;
-    this.tags = tags;
-    this.project = project;
-    this.ref = ref;
-  }
-
-  @Override
-  public TagApi create(TagInput input) throws RestApiException {
-    try {
-      createTagFactory.create(ref).apply(project, input);
-      return this;
-    } catch (Exception e) {
-      throw asRestApiException("Cannot create tag", e);
-    }
-  }
-
-  @Override
-  public TagInfo get() throws RestApiException {
-    try {
-      return listTags.get(project, IdString.fromDecoded(ref));
-    } catch (Exception e) {
-      throw asRestApiException("Cannot get tag", e);
-    }
-  }
-
-  @Override
-  public void delete() throws RestApiException {
-    try {
-      deleteTag.apply(resource(), new DeleteTag.Input());
-    } catch (Exception e) {
-      throw asRestApiException("Cannot delete tag", e);
-    }
-  }
-
-  private TagResource resource() throws RestApiException, IOException {
-    return tags.parse(project, IdString.fromDecoded(ref));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/AccountGroupIdHandler.java b/gerrit-server/src/main/java/com/google/gerrit/server/args4j/AccountGroupIdHandler.java
deleted file mode 100644
index f3393c1..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/AccountGroupIdHandler.java
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.args4j;
-
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.account.GroupCache;
-import com.google.gerrit.server.group.InternalGroup;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.util.Optional;
-import org.kohsuke.args4j.CmdLineException;
-import org.kohsuke.args4j.CmdLineParser;
-import org.kohsuke.args4j.OptionDef;
-import org.kohsuke.args4j.spi.OptionHandler;
-import org.kohsuke.args4j.spi.Parameters;
-import org.kohsuke.args4j.spi.Setter;
-
-public class AccountGroupIdHandler extends OptionHandler<AccountGroup.Id> {
-  private final GroupCache groupCache;
-
-  @Inject
-  public AccountGroupIdHandler(
-      final GroupCache groupCache,
-      @Assisted final CmdLineParser parser,
-      @Assisted final OptionDef option,
-      @Assisted final Setter<AccountGroup.Id> setter) {
-    super(parser, option, setter);
-    this.groupCache = groupCache;
-  }
-
-  @Override
-  public final int parseArguments(Parameters params) throws CmdLineException {
-    final String n = params.getParameter(0);
-    Optional<InternalGroup> group = groupCache.get(new AccountGroup.NameKey(n));
-    if (!group.isPresent()) {
-      throw new CmdLineException(owner, "Group \"" + n + "\" does not exist");
-    }
-    setter.addValue(group.get().getId());
-    return 1;
-  }
-
-  @Override
-  public final String getDefaultMetaVariable() {
-    return "GROUP";
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/AccountGroupUUIDHandler.java b/gerrit-server/src/main/java/com/google/gerrit/server/args4j/AccountGroupUUIDHandler.java
deleted file mode 100644
index 35546e8..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/AccountGroupUUIDHandler.java
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.args4j;
-
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.GroupBackends;
-import com.google.gerrit.server.account.GroupControl;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import org.kohsuke.args4j.CmdLineException;
-import org.kohsuke.args4j.CmdLineParser;
-import org.kohsuke.args4j.OptionDef;
-import org.kohsuke.args4j.spi.OptionHandler;
-import org.kohsuke.args4j.spi.Parameters;
-import org.kohsuke.args4j.spi.Setter;
-
-public class AccountGroupUUIDHandler extends OptionHandler<AccountGroup.UUID> {
-  private final GroupBackend groupBackend;
-  private final GroupControl.Factory groupControlFactory;
-
-  @Inject
-  public AccountGroupUUIDHandler(
-      final GroupBackend groupBackend,
-      final GroupControl.Factory groupControlFactory,
-      @Assisted final CmdLineParser parser,
-      @Assisted final OptionDef option,
-      @Assisted final Setter<AccountGroup.UUID> setter) {
-    super(parser, option, setter);
-    this.groupBackend = groupBackend;
-    this.groupControlFactory = groupControlFactory;
-  }
-
-  @Override
-  public final int parseArguments(Parameters params) throws CmdLineException {
-    final String n = params.getParameter(0);
-    AccountGroup.UUID uuid = new AccountGroup.UUID(n);
-    if (groupBackend.handles(uuid)) {
-      GroupDescription.Basic d = groupBackend.get(uuid);
-      if (d != null) {
-        setter.addValue(uuid);
-        return 1;
-      }
-    }
-
-    // Might be a legacy AccountGroup.Id.
-    if (n.matches("^[1-9][0-9]*$")) {
-      try {
-        AccountGroup.Id legacyId = AccountGroup.Id.parse(n);
-        uuid = groupControlFactory.controlFor(legacyId).getGroup().getGroupUUID();
-        setter.addValue(uuid);
-        return 1;
-      } catch (IllegalArgumentException | NoSuchGroupException e) {
-        // Ignored
-      }
-    }
-
-    GroupReference group = GroupBackends.findExactSuggestion(groupBackend, n);
-    if (group == null) {
-      throw new CmdLineException(owner, "Group \"" + n + "\" does not exist");
-    }
-    setter.addValue(group.getUUID());
-    return 1;
-  }
-
-  @Override
-  public final String getDefaultMetaVariable() {
-    return "GROUP";
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/AccountIdHandler.java b/gerrit-server/src/main/java/com/google/gerrit/server/args4j/AccountIdHandler.java
deleted file mode 100644
index c7d3f73..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/AccountIdHandler.java
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.args4j;
-
-import com.google.gerrit.extensions.client.AuthType;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.account.AccountException;
-import com.google.gerrit.server.account.AccountManager;
-import com.google.gerrit.server.account.AccountResolver;
-import com.google.gerrit.server.account.AuthRequest;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.config.AuthConfig;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.kohsuke.args4j.CmdLineException;
-import org.kohsuke.args4j.CmdLineParser;
-import org.kohsuke.args4j.OptionDef;
-import org.kohsuke.args4j.spi.OptionHandler;
-import org.kohsuke.args4j.spi.Parameters;
-import org.kohsuke.args4j.spi.Setter;
-
-public class AccountIdHandler extends OptionHandler<Account.Id> {
-  private final AccountResolver accountResolver;
-  private final AccountManager accountManager;
-  private final AuthType authType;
-
-  @Inject
-  public AccountIdHandler(
-      AccountResolver accountResolver,
-      AccountManager accountManager,
-      AuthConfig authConfig,
-      @Assisted CmdLineParser parser,
-      @Assisted OptionDef option,
-      @Assisted Setter<Account.Id> setter) {
-    super(parser, option, setter);
-    this.accountResolver = accountResolver;
-    this.accountManager = accountManager;
-    this.authType = authConfig.getAuthType();
-  }
-
-  @Override
-  public int parseArguments(Parameters params) throws CmdLineException {
-    String token = params.getParameter(0);
-    Account.Id accountId;
-    try {
-      Account a = accountResolver.find(token);
-      if (a != null) {
-        accountId = a.getId();
-      } else {
-        switch (authType) {
-          case HTTP_LDAP:
-          case CLIENT_SSL_CERT_LDAP:
-          case LDAP:
-            accountId = createAccountByLdap(token);
-            break;
-          case CUSTOM_EXTENSION:
-          case DEVELOPMENT_BECOME_ANY_ACCOUNT:
-          case HTTP:
-          case LDAP_BIND:
-          case OAUTH:
-          case OPENID:
-          case OPENID_SSO:
-          default:
-            throw new CmdLineException(owner, "user \"" + token + "\" not found");
-        }
-      }
-    } catch (OrmException e) {
-      throw new CmdLineException(owner, "database is down");
-    } catch (IOException e) {
-      throw new CmdLineException(owner, "Failed to load account", e);
-    } catch (ConfigInvalidException e) {
-      throw new CmdLineException(owner, "Invalid account config", e);
-    }
-    setter.addValue(accountId);
-    return 1;
-  }
-
-  private Account.Id createAccountByLdap(String user) throws CmdLineException, IOException {
-    if (!ExternalId.isValidUsername(user)) {
-      throw new CmdLineException(owner, "user \"" + user + "\" not found");
-    }
-
-    try {
-      AuthRequest req = AuthRequest.forUser(user);
-      req.setSkipAuthentication(true);
-      return accountManager.authenticate(req).getAccountId();
-    } catch (AccountException e) {
-      throw new CmdLineException(owner, "user \"" + user + "\" not found");
-    }
-  }
-
-  @Override
-  public final String getDefaultMetaVariable() {
-    return "EMAIL";
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/ChangeIdHandler.java b/gerrit-server/src/main/java/com/google/gerrit/server/args4j/ChangeIdHandler.java
deleted file mode 100644
index 0e841ec..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/ChangeIdHandler.java
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.args4j;
-
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.InternalChangeQuery;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import org.kohsuke.args4j.CmdLineException;
-import org.kohsuke.args4j.CmdLineParser;
-import org.kohsuke.args4j.OptionDef;
-import org.kohsuke.args4j.spi.OptionHandler;
-import org.kohsuke.args4j.spi.Parameters;
-import org.kohsuke.args4j.spi.Setter;
-
-public class ChangeIdHandler extends OptionHandler<Change.Id> {
-  private final Provider<InternalChangeQuery> queryProvider;
-
-  @Inject
-  public ChangeIdHandler(
-      // TODO(dborowitz): Not sure whether this is injectable here.
-      Provider<InternalChangeQuery> queryProvider,
-      @Assisted final CmdLineParser parser,
-      @Assisted final OptionDef option,
-      @Assisted final Setter<Change.Id> setter) {
-    super(parser, option, setter);
-    this.queryProvider = queryProvider;
-  }
-
-  @Override
-  public final int parseArguments(Parameters params) throws CmdLineException {
-    final String token = params.getParameter(0);
-    final String[] tokens = token.split(",");
-    if (tokens.length != 3) {
-      throw new CmdLineException(
-          owner, "change should be specified as <project>,<branch>,<change-id>");
-    }
-
-    try {
-      final Change.Key key = Change.Key.parse(tokens[2]);
-      final Project.NameKey project = new Project.NameKey(tokens[0]);
-      final Branch.NameKey branch = new Branch.NameKey(project, tokens[1]);
-      for (ChangeData cd : queryProvider.get().byBranchKey(branch, key)) {
-        setter.addValue(cd.getId());
-        return 1;
-      }
-    } catch (IllegalArgumentException e) {
-      throw new CmdLineException(owner, "Change-Id is not valid");
-    } catch (OrmException e) {
-      throw new CmdLineException(owner, "Database error: " + e.getMessage());
-    }
-
-    throw new CmdLineException(owner, "\"" + token + "\": change not found");
-  }
-
-  @Override
-  public final String getDefaultMetaVariable() {
-    return "CHANGE";
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/PatchSetIdHandler.java b/gerrit-server/src/main/java/com/google/gerrit/server/args4j/PatchSetIdHandler.java
deleted file mode 100644
index cb70abf..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/PatchSetIdHandler.java
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.args4j;
-
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import org.kohsuke.args4j.CmdLineException;
-import org.kohsuke.args4j.CmdLineParser;
-import org.kohsuke.args4j.OptionDef;
-import org.kohsuke.args4j.spi.OptionHandler;
-import org.kohsuke.args4j.spi.Parameters;
-import org.kohsuke.args4j.spi.Setter;
-
-public class PatchSetIdHandler extends OptionHandler<PatchSet.Id> {
-
-  @Inject
-  public PatchSetIdHandler(
-      @Assisted final CmdLineParser parser,
-      @Assisted final OptionDef option,
-      @Assisted final Setter<PatchSet.Id> setter) {
-    super(parser, option, setter);
-  }
-
-  @Override
-  public final int parseArguments(Parameters params) throws CmdLineException {
-    final String token = params.getParameter(0);
-    final PatchSet.Id id;
-    try {
-      id = PatchSet.Id.parse(token);
-    } catch (IllegalArgumentException e) {
-      throw new CmdLineException(owner, "\"" + token + "\" is not a valid patch set");
-    }
-
-    setter.addValue(id);
-    return 1;
-  }
-
-  @Override
-  public final String getDefaultMetaVariable() {
-    return "CHANGE,PATCHSET";
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/ProjectControlHandler.java b/gerrit-server/src/main/java/com/google/gerrit/server/args4j/ProjectControlHandler.java
deleted file mode 100644
index 1823527..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/ProjectControlHandler.java
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.args4j;
-
-import com.google.gerrit.common.ProjectUtil;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.ProjectPermission;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import org.kohsuke.args4j.CmdLineException;
-import org.kohsuke.args4j.CmdLineParser;
-import org.kohsuke.args4j.OptionDef;
-import org.kohsuke.args4j.spi.OptionHandler;
-import org.kohsuke.args4j.spi.Parameters;
-import org.kohsuke.args4j.spi.Setter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ProjectControlHandler extends OptionHandler<ProjectControl> {
-  private static final Logger log = LoggerFactory.getLogger(ProjectControlHandler.class);
-
-  private final ProjectControl.GenericFactory projectControlFactory;
-  private final PermissionBackend permissionBackend;
-  private final Provider<CurrentUser> user;
-
-  @Inject
-  public ProjectControlHandler(
-      ProjectControl.GenericFactory projectControlFactory,
-      PermissionBackend permissionBackend,
-      Provider<CurrentUser> user,
-      @Assisted final CmdLineParser parser,
-      @Assisted final OptionDef option,
-      @Assisted final Setter<ProjectControl> setter) {
-    super(parser, option, setter);
-    this.projectControlFactory = projectControlFactory;
-    this.permissionBackend = permissionBackend;
-    this.user = user;
-  }
-
-  @Override
-  public final int parseArguments(Parameters params) throws CmdLineException {
-    String projectName = params.getParameter(0);
-
-    while (projectName.endsWith("/")) {
-      projectName = projectName.substring(0, projectName.length() - 1);
-    }
-
-    while (projectName.startsWith("/")) {
-      // Be nice and drop the leading "/" if supplied by an absolute path.
-      // We don't have a file system hierarchy, just a flat namespace in
-      // the database's Project entities. We never encode these with a
-      // leading '/' but users might accidentally include them in Git URLs.
-      //
-      projectName = projectName.substring(1);
-    }
-
-    String nameWithoutSuffix = ProjectUtil.stripGitSuffix(projectName);
-    Project.NameKey nameKey = new Project.NameKey(nameWithoutSuffix);
-
-    ProjectControl control;
-    try {
-      control = projectControlFactory.controlFor(nameKey, user.get());
-      permissionBackend.user(user).project(nameKey).check(ProjectPermission.ACCESS);
-    } catch (AuthException e) {
-      throw new CmdLineException(owner, new NoSuchProjectException(nameKey).getMessage());
-    } catch (NoSuchProjectException e) {
-      throw new CmdLineException(owner, e.getMessage());
-    } catch (PermissionBackendException | IOException e) {
-      log.warn("Cannot load project " + nameWithoutSuffix, e);
-      throw new CmdLineException(owner, new NoSuchProjectException(nameKey).getMessage());
-    }
-
-    setter.addValue(control);
-    return 1;
-  }
-
-  @Override
-  public final String getDefaultMetaVariable() {
-    return "PROJECT";
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/SocketAddressHandler.java b/gerrit-server/src/main/java/com/google/gerrit/server/args4j/SocketAddressHandler.java
deleted file mode 100644
index 4325c00..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/SocketAddressHandler.java
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.server.args4j;
-
-import com.google.gerrit.server.util.SocketUtil;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.net.SocketAddress;
-import org.kohsuke.args4j.CmdLineException;
-import org.kohsuke.args4j.CmdLineParser;
-import org.kohsuke.args4j.OptionDef;
-import org.kohsuke.args4j.spi.OptionHandler;
-import org.kohsuke.args4j.spi.Parameters;
-import org.kohsuke.args4j.spi.Setter;
-
-public class SocketAddressHandler extends OptionHandler<SocketAddress> {
-
-  @Inject
-  public SocketAddressHandler(
-      @Assisted final CmdLineParser parser,
-      @Assisted final OptionDef option,
-      @Assisted final Setter<SocketAddress> setter) {
-    super(parser, option, setter);
-  }
-
-  @Override
-  public final int parseArguments(Parameters params) throws CmdLineException {
-    final String token = params.getParameter(0);
-    try {
-      setter.addValue(SocketUtil.parse(token, 0));
-    } catch (IllegalArgumentException e) {
-      throw new CmdLineException(owner, e.getMessage());
-    }
-    return 1;
-  }
-
-  @Override
-  public final String getDefaultMetaVariable() {
-    return "HOST:PORT";
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/AuthRequest.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/AuthRequest.java
deleted file mode 100644
index 71c5d26..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/AuthRequest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.auth;
-
-import com.google.gerrit.common.Nullable;
-
-/** Defines an abstract request for user authentication to Gerrit. */
-public abstract class AuthRequest {
-  private final String username;
-  private final String password;
-
-  protected AuthRequest(String username, String password) {
-    this.username = username;
-    this.password = password;
-  }
-
-  /**
-   * Returns the username to be authenticated.
-   *
-   * @return username for authentication or null for anonymous access.
-   */
-  @Nullable
-  public final String getUsername() {
-    return username;
-  }
-
-  /**
-   * Returns the user's credentials
-   *
-   * @return user's credentials or null
-   */
-  @Nullable
-  public final String getPassword() {
-    return password;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/AuthUser.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/AuthUser.java
deleted file mode 100644
index 71f29a4..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/AuthUser.java
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.auth;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.auto.value.AutoValue;
-import com.google.gerrit.common.Nullable;
-
-/** An authenticated user as specified by the AuthBackend. */
-public class AuthUser {
-
-  /** Globally unique identifier for the user. */
-  @AutoValue
-  public abstract static class UUID {
-    /**
-     * A new unique identifier.
-     *
-     * @param uuid the unique identifier.
-     * @return identifier instance.
-     */
-    public static UUID create(String uuid) {
-      return new AutoValue_AuthUser_UUID(uuid);
-    }
-
-    public abstract String uuid();
-  }
-
-  private final UUID uuid;
-  private final String username;
-
-  /**
-   * An authenticated user.
-   *
-   * @param uuid the globally unique ID.
-   * @param username the name of the authenticated user.
-   */
-  public AuthUser(UUID uuid, @Nullable String username) {
-    this.uuid = checkNotNull(uuid);
-    this.username = username;
-  }
-
-  /** @return the globally unique identifier. */
-  public final UUID getUUID() {
-    return uuid;
-  }
-
-  /** @return the backend specific user name, or null if one does not exist. */
-  @Nullable
-  public final String getUsername() {
-    return username;
-  }
-
-  /** @return {@code true} if {@link #getUsername()} is not null. */
-  public final boolean hasUsername() {
-    return getUsername() != null;
-  }
-
-  @Override
-  public boolean equals(Object obj) {
-    if (obj instanceof AuthUser) {
-      return getUUID().equals(((AuthUser) obj).getUUID());
-    }
-    return false;
-  }
-
-  @Override
-  public int hashCode() {
-    return getUUID().hashCode();
-  }
-
-  @Override
-  public String toString() {
-    return String.format("AuthUser[uuid=%s, username=%s]", getUUID(), getUsername());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/InternalAuthBackend.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/InternalAuthBackend.java
deleted file mode 100644
index 508bf31..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/InternalAuthBackend.java
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.auth;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.config.AuthConfig;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.Locale;
-
-@Singleton
-public class InternalAuthBackend implements AuthBackend {
-  private final AccountCache accountCache;
-  private final AuthConfig authConfig;
-
-  @Inject
-  InternalAuthBackend(AccountCache accountCache, AuthConfig authConfig) {
-    this.accountCache = accountCache;
-    this.authConfig = authConfig;
-  }
-
-  @Override
-  public String getDomain() {
-    return "gerrit";
-  }
-
-  // TODO(gerritcodereview-team): This function has no coverage.
-  @Override
-  public AuthUser authenticate(AuthRequest req)
-      throws MissingCredentialsException, InvalidCredentialsException, UnknownUserException,
-          UserNotAllowedException, AuthException {
-    if (Strings.isNullOrEmpty(req.getUsername()) || Strings.isNullOrEmpty(req.getPassword())) {
-      throw new MissingCredentialsException();
-    }
-
-    String username;
-    if (authConfig.isUserNameToLowerCase()) {
-      username = req.getUsername().toLowerCase(Locale.US);
-    } else {
-      username = req.getUsername();
-    }
-
-    final AccountState who = accountCache.getByUsername(username);
-    if (who == null) {
-      throw new UnknownUserException();
-    } else if (!who.getAccount().isActive()) {
-      throw new UserNotAllowedException(
-          "Authentication failed for "
-              + username
-              + ": account inactive or not provisioned in Gerrit");
-    }
-
-    if (!who.checkPassword(req.getPassword(), username)) {
-      throw new InvalidCredentialsException();
-    }
-    return new AuthUser(AuthUser.UUID.create(username), username);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/UniversalAuthBackend.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/UniversalAuthBackend.java
deleted file mode 100644
index af9c51b..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/UniversalAuthBackend.java
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.auth;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.ArrayList;
-import java.util.List;
-
-/** Universal implementation of the AuthBackend that works with the injected set of AuthBackends. */
-@Singleton
-public final class UniversalAuthBackend implements AuthBackend {
-  private final DynamicSet<AuthBackend> authBackends;
-
-  @Inject
-  UniversalAuthBackend(DynamicSet<AuthBackend> authBackends) {
-    this.authBackends = authBackends;
-  }
-
-  @Override
-  public AuthUser authenticate(AuthRequest request) throws AuthException {
-    List<AuthUser> authUsers = new ArrayList<>();
-    List<AuthException> authExs = new ArrayList<>();
-    for (AuthBackend backend : authBackends) {
-      try {
-        authUsers.add(checkNotNull(backend.authenticate(request)));
-      } catch (MissingCredentialsException ex) {
-        // Not handled by this backend.
-      } catch (AuthException ex) {
-        authExs.add(ex);
-      }
-    }
-
-    // Handle the valid responses
-    if (authUsers.size() == 1) {
-      return authUsers.get(0);
-    } else if (authUsers.isEmpty() && authExs.size() == 1) {
-      throw authExs.get(0);
-    } else if (authExs.isEmpty() && authUsers.isEmpty()) {
-      throw new MissingCredentialsException();
-    }
-
-    String msg =
-        String.format(
-            "Multiple AuthBackends attempted to handle request: authUsers=%s authExs=%s",
-            authUsers, authExs);
-    throw new AuthException(msg);
-  }
-
-  @Override
-  public String getDomain() {
-    throw new UnsupportedOperationException("UniversalAuthBackend doesn't support domain.");
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/Helper.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/Helper.java
deleted file mode 100644
index fd88845..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/Helper.java
+++ /dev/null
@@ -1,445 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.auth.ldap;
-
-import com.google.common.base.Throwables;
-import com.google.common.cache.Cache;
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.common.data.ParameterizedString;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.account.AccountException;
-import com.google.gerrit.server.account.AuthenticationFailedException;
-import com.google.gerrit.server.auth.NoSuchUserException;
-import com.google.gerrit.server.config.ConfigUtil;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.util.ssl.BlindSSLSocketFactory;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.google.inject.name.Named;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Properties;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import javax.naming.CompositeName;
-import javax.naming.Context;
-import javax.naming.Name;
-import javax.naming.NamingEnumeration;
-import javax.naming.NamingException;
-import javax.naming.PartialResultException;
-import javax.naming.directory.Attribute;
-import javax.naming.directory.DirContext;
-import javax.naming.directory.InitialDirContext;
-import javax.net.ssl.SSLSocketFactory;
-import javax.security.auth.Subject;
-import javax.security.auth.login.LoginContext;
-import javax.security.auth.login.LoginException;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-class Helper {
-  private static final Logger log = LoggerFactory.getLogger(Helper.class);
-
-  static final String LDAP_UUID = "ldap:";
-
-  private final Cache<String, ImmutableSet<String>> parentGroups;
-  private final Config config;
-  private final String server;
-  private final String username;
-  private final String password;
-  private final String referral;
-  private final boolean sslVerify;
-  private final String authentication;
-  private volatile LdapSchema ldapSchema;
-  private final String readTimeoutMillis;
-  private final String connectTimeoutMillis;
-  private final boolean useConnectionPooling;
-  private final boolean groupsVisibleToAll;
-
-  @Inject
-  Helper(
-      @GerritServerConfig Config config,
-      @Named(LdapModule.PARENT_GROUPS_CACHE) Cache<String, ImmutableSet<String>> parentGroups) {
-    this.config = config;
-    this.server = LdapRealm.optional(config, "server");
-    this.username = LdapRealm.optional(config, "username");
-    this.password = LdapRealm.optional(config, "password", "");
-    this.referral = LdapRealm.optional(config, "referral", "ignore");
-    this.sslVerify = config.getBoolean("ldap", "sslverify", true);
-    this.groupsVisibleToAll = config.getBoolean("ldap", "groupsVisibleToAll", false);
-    this.authentication = LdapRealm.optional(config, "authentication", "simple");
-    String readTimeout = LdapRealm.optional(config, "readTimeout");
-    if (readTimeout != null) {
-      readTimeoutMillis =
-          Long.toString(ConfigUtil.getTimeUnit(readTimeout, 0, TimeUnit.MILLISECONDS));
-    } else {
-      readTimeoutMillis = null;
-    }
-    String connectTimeout = LdapRealm.optional(config, "connectTimeout");
-    if (connectTimeout != null) {
-      connectTimeoutMillis =
-          Long.toString(ConfigUtil.getTimeUnit(connectTimeout, 0, TimeUnit.MILLISECONDS));
-    } else {
-      connectTimeoutMillis = null;
-    }
-    this.parentGroups = parentGroups;
-    this.useConnectionPooling = LdapRealm.optional(config, "useConnectionPooling", false);
-  }
-
-  private Properties createContextProperties() {
-    final Properties env = new Properties();
-    env.put(Context.INITIAL_CONTEXT_FACTORY, LdapRealm.LDAP);
-    env.put(Context.PROVIDER_URL, server);
-    if (server.startsWith("ldaps:") && !sslVerify) {
-      Class<? extends SSLSocketFactory> factory = BlindSSLSocketFactory.class;
-      env.put("java.naming.ldap.factory.socket", factory.getName());
-    }
-    if (readTimeoutMillis != null) {
-      env.put("com.sun.jndi.ldap.read.timeout", readTimeoutMillis);
-    }
-    if (connectTimeoutMillis != null) {
-      env.put("com.sun.jndi.ldap.connect.timeout", connectTimeoutMillis);
-    }
-    if (useConnectionPooling) {
-      env.put("com.sun.jndi.ldap.connect.pool", "true");
-    }
-    return env;
-  }
-
-  DirContext open() throws NamingException, LoginException {
-    final Properties env = createContextProperties();
-    env.put(Context.SECURITY_AUTHENTICATION, authentication);
-    env.put(Context.REFERRAL, referral);
-    if ("GSSAPI".equals(authentication)) {
-      return kerberosOpen(env);
-    }
-    if (username != null) {
-      env.put(Context.SECURITY_PRINCIPAL, username);
-      env.put(Context.SECURITY_CREDENTIALS, password);
-    }
-    return new InitialDirContext(env);
-  }
-
-  private DirContext kerberosOpen(Properties env) throws LoginException, NamingException {
-    LoginContext ctx = new LoginContext("KerberosLogin");
-    ctx.login();
-    Subject subject = ctx.getSubject();
-    try {
-      return Subject.doAs(
-          subject,
-          new PrivilegedExceptionAction<DirContext>() {
-            @Override
-            public DirContext run() throws NamingException {
-              return new InitialDirContext(env);
-            }
-          });
-    } catch (PrivilegedActionException e) {
-      Throwables.throwIfInstanceOf(e.getException(), NamingException.class);
-      Throwables.throwIfInstanceOf(e.getException(), RuntimeException.class);
-      log.warn("Internal error", e.getException());
-      return null;
-    } finally {
-      ctx.logout();
-    }
-  }
-
-  DirContext authenticate(String dn, String password) throws AccountException {
-    final Properties env = createContextProperties();
-    env.put(Context.SECURITY_AUTHENTICATION, "simple");
-    env.put(Context.SECURITY_PRINCIPAL, dn);
-    env.put(Context.SECURITY_CREDENTIALS, password);
-    env.put(Context.REFERRAL, referral);
-    try {
-      return new InitialDirContext(env);
-    } catch (NamingException e) {
-      throw new AuthenticationFailedException("Incorrect username or password", e);
-    }
-  }
-
-  LdapSchema getSchema(DirContext ctx) {
-    if (ldapSchema == null) {
-      synchronized (this) {
-        if (ldapSchema == null) {
-          ldapSchema = new LdapSchema(ctx);
-        }
-      }
-    }
-    return ldapSchema;
-  }
-
-  LdapQuery.Result findAccount(
-      Helper.LdapSchema schema, DirContext ctx, String username, boolean fetchMemberOf)
-      throws NamingException, AccountException {
-    final HashMap<String, String> params = new HashMap<>();
-    params.put(LdapRealm.USERNAME, username);
-
-    List<LdapQuery> accountQueryList;
-    if (fetchMemberOf && schema.type.accountMemberField() != null) {
-      accountQueryList = schema.accountWithMemberOfQueryList;
-    } else {
-      accountQueryList = schema.accountQueryList;
-    }
-
-    for (LdapQuery accountQuery : accountQueryList) {
-      List<LdapQuery.Result> res = accountQuery.query(ctx, params);
-      if (res.size() == 1) {
-        return res.get(0);
-      } else if (res.size() > 1) {
-        throw new AccountException("Duplicate users: " + username);
-      }
-    }
-    throw new NoSuchUserException(username);
-  }
-
-  Set<AccountGroup.UUID> queryForGroups(
-      final DirContext ctx, String username, LdapQuery.Result account) throws NamingException {
-    final LdapSchema schema = getSchema(ctx);
-    final Set<String> groupDNs = new HashSet<>();
-
-    if (!schema.groupMemberQueryList.isEmpty()) {
-      final HashMap<String, String> params = new HashMap<>();
-
-      if (account == null) {
-        try {
-          account = findAccount(schema, ctx, username, false);
-        } catch (AccountException e) {
-          return Collections.emptySet();
-        }
-      }
-      for (String name : schema.groupMemberQueryList.get(0).getParameters()) {
-        params.put(name, account.get(name));
-      }
-
-      params.put(LdapRealm.USERNAME, username);
-
-      for (LdapQuery groupMemberQuery : schema.groupMemberQueryList) {
-        for (LdapQuery.Result r : groupMemberQuery.query(ctx, params)) {
-          recursivelyExpandGroups(groupDNs, schema, ctx, r.getDN());
-        }
-      }
-    }
-
-    if (schema.accountMemberField != null) {
-      if (account == null || account.getAll(schema.accountMemberField) == null) {
-        try {
-          account = findAccount(schema, ctx, username, true);
-        } catch (AccountException e) {
-          return Collections.emptySet();
-        }
-      }
-
-      final Attribute groupAtt = account.getAll(schema.accountMemberField);
-      if (groupAtt != null) {
-        final NamingEnumeration<?> groups = groupAtt.getAll();
-        try {
-          while (groups.hasMore()) {
-            final String nextDN = (String) groups.next();
-            recursivelyExpandGroups(groupDNs, schema, ctx, nextDN);
-          }
-        } catch (PartialResultException e) {
-          // Ignored
-        }
-      }
-    }
-
-    final Set<AccountGroup.UUID> actual = new HashSet<>();
-    for (String dn : groupDNs) {
-      actual.add(new AccountGroup.UUID(LDAP_UUID + dn));
-    }
-
-    if (actual.isEmpty()) {
-      return Collections.emptySet();
-    }
-    return ImmutableSet.copyOf(actual);
-  }
-
-  private void recursivelyExpandGroups(
-      final Set<String> groupDNs,
-      final LdapSchema schema,
-      final DirContext ctx,
-      final String groupDN) {
-    if (groupDNs.add(groupDN)
-        && schema.accountMemberField != null
-        && schema.accountMemberExpandGroups) {
-      ImmutableSet<String> cachedParentsDNs = parentGroups.getIfPresent(groupDN);
-      if (cachedParentsDNs == null) {
-        // Recursively identify the groups it is a member of.
-        ImmutableSet.Builder<String> dns = ImmutableSet.builder();
-        try {
-          final Name compositeGroupName = new CompositeName().add(groupDN);
-          final Attribute in =
-              ctx.getAttributes(compositeGroupName, schema.accountMemberFieldArray)
-                  .get(schema.accountMemberField);
-          if (in != null) {
-            final NamingEnumeration<?> groups = in.getAll();
-            try {
-              while (groups.hasMore()) {
-                dns.add((String) groups.next());
-              }
-            } catch (PartialResultException e) {
-              // Ignored
-            }
-          }
-        } catch (NamingException e) {
-          log.warn("Could not find group {}", groupDN, e);
-        }
-        cachedParentsDNs = dns.build();
-        parentGroups.put(groupDN, cachedParentsDNs);
-      }
-      for (String dn : cachedParentsDNs) {
-        recursivelyExpandGroups(groupDNs, schema, ctx, dn);
-      }
-    }
-  }
-
-  public boolean groupsVisibleToAll() {
-    return this.groupsVisibleToAll;
-  }
-
-  class LdapSchema {
-    final LdapType type;
-
-    final ParameterizedString accountFullName;
-    final ParameterizedString accountEmailAddress;
-    final ParameterizedString accountSshUserName;
-    final String accountMemberField;
-    final boolean accountMemberExpandGroups;
-    final String[] accountMemberFieldArray;
-    final List<LdapQuery> accountQueryList;
-    final List<LdapQuery> accountWithMemberOfQueryList;
-
-    final List<String> groupBases;
-    final SearchScope groupScope;
-    final ParameterizedString groupPattern;
-    final ParameterizedString groupName;
-    final List<LdapQuery> groupMemberQueryList;
-
-    LdapSchema(DirContext ctx) {
-      type = discoverLdapType(ctx);
-      groupMemberQueryList = new ArrayList<>();
-      accountQueryList = new ArrayList<>();
-      accountWithMemberOfQueryList = new ArrayList<>();
-
-      final Set<String> accountAtts = new HashSet<>();
-
-      // Group query
-      //
-
-      groupBases = LdapRealm.optionalList(config, "groupBase");
-      groupScope = LdapRealm.scope(config, "groupScope");
-      groupPattern = LdapRealm.paramString(config, "groupPattern", type.groupPattern());
-      groupName = LdapRealm.paramString(config, "groupName", type.groupName());
-      final String groupMemberPattern =
-          LdapRealm.optdef(config, "groupMemberPattern", type.groupMemberPattern());
-
-      for (String groupBase : groupBases) {
-        if (groupMemberPattern != null) {
-          final LdapQuery groupMemberQuery =
-              new LdapQuery(
-                  groupBase,
-                  groupScope,
-                  new ParameterizedString(groupMemberPattern),
-                  Collections.<String>emptySet());
-          if (groupMemberQuery.getParameters().isEmpty()) {
-            throw new IllegalArgumentException("No variables in ldap.groupMemberPattern");
-          }
-
-          for (String name : groupMemberQuery.getParameters()) {
-            accountAtts.add(name);
-          }
-
-          groupMemberQueryList.add(groupMemberQuery);
-        }
-      }
-
-      // Account query
-      //
-      accountFullName = LdapRealm.paramString(config, "accountFullName", type.accountFullName());
-      if (accountFullName != null) {
-        accountAtts.addAll(accountFullName.getParameterNames());
-      }
-      accountEmailAddress =
-          LdapRealm.paramString(config, "accountEmailAddress", type.accountEmailAddress());
-      if (accountEmailAddress != null) {
-        accountAtts.addAll(accountEmailAddress.getParameterNames());
-      }
-      accountSshUserName =
-          LdapRealm.paramString(config, "accountSshUserName", type.accountSshUserName());
-      if (accountSshUserName != null) {
-        accountAtts.addAll(accountSshUserName.getParameterNames());
-      }
-      accountMemberField =
-          LdapRealm.optdef(config, "accountMemberField", type.accountMemberField());
-      if (accountMemberField != null) {
-        accountMemberFieldArray = new String[] {accountMemberField};
-      } else {
-        accountMemberFieldArray = null;
-      }
-      accountMemberExpandGroups =
-          LdapRealm.optional(config, "accountMemberExpandGroups", type.accountMemberExpandGroups());
-
-      final SearchScope accountScope = LdapRealm.scope(config, "accountScope");
-      final String accountPattern =
-          LdapRealm.reqdef(config, "accountPattern", type.accountPattern());
-
-      Set<String> accountWithMemberOfAtts;
-      if (accountMemberField != null) {
-        accountWithMemberOfAtts = new HashSet<>(accountAtts);
-        accountWithMemberOfAtts.add(accountMemberField);
-      } else {
-        accountWithMemberOfAtts = null;
-      }
-      for (String accountBase : LdapRealm.requiredList(config, "accountBase")) {
-        LdapQuery accountQuery =
-            new LdapQuery(
-                accountBase, accountScope, new ParameterizedString(accountPattern), accountAtts);
-        if (accountQuery.getParameters().isEmpty()) {
-          throw new IllegalArgumentException("No variables in ldap.accountPattern");
-        }
-        accountQueryList.add(accountQuery);
-
-        if (accountWithMemberOfAtts != null) {
-          LdapQuery accountWithMemberOfQuery =
-              new LdapQuery(
-                  accountBase,
-                  accountScope,
-                  new ParameterizedString(accountPattern),
-                  accountWithMemberOfAtts);
-          accountWithMemberOfQueryList.add(accountWithMemberOfQuery);
-        }
-      }
-    }
-
-    LdapType discoverLdapType(DirContext ctx) {
-      try {
-        return LdapType.guessType(ctx);
-      } catch (NamingException e) {
-        log.warn(
-            "Cannot discover type of LDAP server at {},"
-                + " assuming the server is RFC 2307 compliant.",
-            server,
-            e);
-        return LdapType.RFC_2307;
-      }
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapAuthBackend.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapAuthBackend.java
deleted file mode 100644
index 2854294..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapAuthBackend.java
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.auth.ldap;
-
-import com.google.gerrit.extensions.client.AuthType;
-import com.google.gerrit.server.account.AccountException;
-import com.google.gerrit.server.auth.AuthBackend;
-import com.google.gerrit.server.auth.AuthException;
-import com.google.gerrit.server.auth.AuthRequest;
-import com.google.gerrit.server.auth.AuthUser;
-import com.google.gerrit.server.auth.InvalidCredentialsException;
-import com.google.gerrit.server.auth.MissingCredentialsException;
-import com.google.gerrit.server.auth.UnknownUserException;
-import com.google.gerrit.server.auth.UserNotAllowedException;
-import com.google.gerrit.server.config.AuthConfig;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.inject.Inject;
-import java.util.Locale;
-import javax.naming.NamingException;
-import javax.naming.directory.DirContext;
-import javax.security.auth.login.LoginException;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Implementation of AuthBackend for the LDAP authentication system. */
-public class LdapAuthBackend implements AuthBackend {
-  private static final Logger log = LoggerFactory.getLogger(LdapAuthBackend.class);
-
-  private final Helper helper;
-  private final AuthConfig authConfig;
-  private final boolean lowerCaseUsername;
-
-  @Inject
-  public LdapAuthBackend(Helper helper, AuthConfig authConfig, @GerritServerConfig Config config) {
-    this.helper = helper;
-    this.authConfig = authConfig;
-    this.lowerCaseUsername = config.getBoolean("ldap", "localUsernameToLowerCase", false);
-  }
-
-  @Override
-  public String getDomain() {
-    return "ldap";
-  }
-
-  @Override
-  public AuthUser authenticate(AuthRequest req)
-      throws MissingCredentialsException, InvalidCredentialsException, UnknownUserException,
-          UserNotAllowedException, AuthException {
-    if (req.getUsername() == null) {
-      throw new MissingCredentialsException();
-    }
-
-    final String username =
-        lowerCaseUsername ? req.getUsername().toLowerCase(Locale.US) : req.getUsername();
-    try {
-      final DirContext ctx;
-      if (authConfig.getAuthType() == AuthType.LDAP_BIND) {
-        ctx = helper.authenticate(username, req.getPassword());
-      } else {
-        ctx = helper.open();
-      }
-      try {
-        final Helper.LdapSchema schema = helper.getSchema(ctx);
-        final LdapQuery.Result m = helper.findAccount(schema, ctx, username, false);
-
-        if (authConfig.getAuthType() == AuthType.LDAP) {
-          // We found the user account, but we need to verify
-          // the password matches it before we can continue.
-          //
-          helper.authenticate(m.getDN(), req.getPassword()).close();
-        }
-        return new AuthUser(AuthUser.UUID.create(username), username);
-      } finally {
-        try {
-          ctx.close();
-        } catch (NamingException e) {
-          log.warn("Cannot close LDAP query handle", e);
-        }
-      }
-    } catch (AccountException e) {
-      log.error("Cannot query LDAP to authenticate user", e);
-      throw new InvalidCredentialsException("Cannot query LDAP for account", e);
-    } catch (NamingException e) {
-      log.error("Cannot query LDAP to authenticate user", e);
-      throw new AuthException("Cannot query LDAP for account", e);
-    } catch (LoginException e) {
-      log.error("Cannot authenticate server via JAAS", e);
-      throw new AuthException("Cannot query LDAP for account", e);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupBackend.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupBackend.java
deleted file mode 100644
index 324e191..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupBackend.java
+++ /dev/null
@@ -1,237 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.auth.ldap;
-
-import static com.google.gerrit.server.account.GroupBackends.GROUP_REF_NAME_COMPARATOR;
-import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_GERRIT;
-import static com.google.gerrit.server.auth.ldap.Helper.LDAP_UUID;
-import static com.google.gerrit.server.auth.ldap.LdapModule.GROUP_CACHE;
-import static com.google.gerrit.server.auth.ldap.LdapModule.GROUP_EXIST_CACHE;
-
-import com.google.common.cache.LoadingCache;
-import com.google.common.collect.Sets;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.common.data.ParameterizedString;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.GroupMembership;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.auth.ldap.Helper.LdapSchema;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.name.Named;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ExecutionException;
-import javax.naming.InvalidNameException;
-import javax.naming.NamingException;
-import javax.naming.directory.DirContext;
-import javax.naming.ldap.LdapName;
-import javax.naming.ldap.Rdn;
-import javax.security.auth.login.LoginException;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Implementation of GroupBackend for the LDAP group system. */
-public class LdapGroupBackend implements GroupBackend {
-  static final Logger log = LoggerFactory.getLogger(LdapGroupBackend.class);
-
-  private static final String LDAP_NAME = "ldap/";
-  private static final String GROUPNAME = "groupname";
-
-  private final Helper helper;
-  private final LoadingCache<String, Set<AccountGroup.UUID>> membershipCache;
-  private final LoadingCache<String, Boolean> existsCache;
-  private final ProjectCache projectCache;
-  private final Provider<CurrentUser> userProvider;
-  private final Config gerritConfig;
-
-  @Inject
-  LdapGroupBackend(
-      Helper helper,
-      @Named(GROUP_CACHE) LoadingCache<String, Set<AccountGroup.UUID>> membershipCache,
-      @Named(GROUP_EXIST_CACHE) LoadingCache<String, Boolean> existsCache,
-      ProjectCache projectCache,
-      Provider<CurrentUser> userProvider,
-      @GerritServerConfig Config gerritConfig) {
-    this.helper = helper;
-    this.membershipCache = membershipCache;
-    this.projectCache = projectCache;
-    this.existsCache = existsCache;
-    this.userProvider = userProvider;
-    this.gerritConfig = gerritConfig;
-  }
-
-  private boolean isLdapUUID(AccountGroup.UUID uuid) {
-    return uuid.get().startsWith(LDAP_UUID);
-  }
-
-  private static GroupReference groupReference(ParameterizedString p, LdapQuery.Result res)
-      throws NamingException {
-    return new GroupReference(
-        new AccountGroup.UUID(LDAP_UUID + res.getDN()), LDAP_NAME + LdapRealm.apply(p, res));
-  }
-
-  private static String cnFor(String dn) {
-    try {
-      LdapName name = new LdapName(dn);
-      if (!name.isEmpty()) {
-        String cn = name.get(name.size() - 1);
-        int index = cn.indexOf('=');
-        if (index >= 0) {
-          cn = cn.substring(index + 1);
-        }
-        return cn;
-      }
-    } catch (InvalidNameException e) {
-      log.warn("Cannot parse LDAP dn for cn", e);
-    }
-    return dn;
-  }
-
-  @Override
-  public boolean handles(AccountGroup.UUID uuid) {
-    return isLdapUUID(uuid);
-  }
-
-  @Override
-  public GroupDescription.Basic get(AccountGroup.UUID uuid) {
-    if (!handles(uuid)) {
-      return null;
-    }
-
-    String groupDn = uuid.get().substring(LDAP_UUID.length());
-    CurrentUser user = userProvider.get();
-    if (!(user.isIdentifiedUser()) || !membershipsOf(user.asIdentifiedUser()).contains(uuid)) {
-      try {
-        if (!existsCache.get(groupDn)) {
-          return null;
-        }
-      } catch (ExecutionException e) {
-        log.warn("Cannot lookup group {} in LDAP", groupDn, e);
-        return null;
-      }
-    }
-
-    final String name = LDAP_NAME + cnFor(groupDn);
-    return new GroupDescription.Basic() {
-      @Override
-      public AccountGroup.UUID getGroupUUID() {
-        return uuid;
-      }
-
-      @Override
-      public String getName() {
-        return name;
-      }
-
-      @Override
-      @Nullable
-      public String getEmailAddress() {
-        return null;
-      }
-
-      @Override
-      @Nullable
-      public String getUrl() {
-        return null;
-      }
-    };
-  }
-
-  @Override
-  public Collection<GroupReference> suggest(String name, ProjectState project) {
-    AccountGroup.UUID uuid = new AccountGroup.UUID(name);
-    if (isLdapUUID(uuid)) {
-      GroupDescription.Basic g = get(uuid);
-      if (g == null) {
-        return Collections.emptySet();
-      }
-      return Collections.singleton(GroupReference.forGroup(g));
-    } else if (name.startsWith(LDAP_NAME)) {
-      return suggestLdap(name.substring(LDAP_NAME.length()));
-    }
-    return Collections.emptySet();
-  }
-
-  @Override
-  public GroupMembership membershipsOf(IdentifiedUser user) {
-    String id = findId(user.state().getExternalIds());
-    if (id == null) {
-      return GroupMembership.EMPTY;
-    }
-    return new LdapGroupMembership(membershipCache, projectCache, id, gerritConfig);
-  }
-
-  private static String findId(Collection<ExternalId> extIds) {
-    for (ExternalId extId : extIds) {
-      if (extId.isScheme(SCHEME_GERRIT)) {
-        return extId.key().id();
-      }
-    }
-    return null;
-  }
-
-  private Set<GroupReference> suggestLdap(String name) {
-    if (name.isEmpty()) {
-      return Collections.emptySet();
-    }
-
-    Set<GroupReference> out = Sets.newTreeSet(GROUP_REF_NAME_COMPARATOR);
-    try {
-      DirContext ctx = helper.open();
-      try {
-        // Do exact lookups until there are at least 3 characters.
-        name = Rdn.escapeValue(name) + ((name.length() >= 3) ? "*" : "");
-        LdapSchema schema = helper.getSchema(ctx);
-        ParameterizedString filter =
-            ParameterizedString.asis(schema.groupPattern.replace(GROUPNAME, name).toString());
-        Set<String> returnAttrs = new HashSet<>(schema.groupName.getParameterNames());
-        Map<String, String> params = Collections.emptyMap();
-        for (String groupBase : schema.groupBases) {
-          LdapQuery query = new LdapQuery(groupBase, schema.groupScope, filter, returnAttrs);
-          for (LdapQuery.Result res : query.query(ctx, params)) {
-            out.add(groupReference(schema.groupName, res));
-          }
-        }
-      } finally {
-        try {
-          ctx.close();
-        } catch (NamingException e) {
-          log.warn("Cannot close LDAP query handle", e);
-        }
-      }
-    } catch (NamingException | LoginException e) {
-      log.warn("Cannot query LDAP for groups matching requested name", e);
-    }
-    return out;
-  }
-
-  @Override
-  public boolean isVisibleToAll(AccountGroup.UUID uuid) {
-    return handles(uuid) && helper.groupsVisibleToAll();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupMembership.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupMembership.java
deleted file mode 100644
index a12be7c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupMembership.java
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.auth.ldap;
-
-import com.google.common.cache.LoadingCache;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.account.GroupMembership;
-import com.google.gerrit.server.account.ListGroupMembership;
-import com.google.gerrit.server.project.ProjectCache;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.concurrent.ExecutionException;
-import org.eclipse.jgit.lib.Config;
-
-class LdapGroupMembership implements GroupMembership {
-  private final LoadingCache<String, Set<AccountGroup.UUID>> membershipCache;
-  private final ProjectCache projectCache;
-  private final String id;
-  private final boolean guessRelevantGroups;
-  private GroupMembership membership;
-
-  LdapGroupMembership(
-      LoadingCache<String, Set<AccountGroup.UUID>> membershipCache,
-      ProjectCache projectCache,
-      String id,
-      Config gerritConfig) {
-    this.membershipCache = membershipCache;
-    this.projectCache = projectCache;
-    this.id = id;
-    this.guessRelevantGroups = gerritConfig.getBoolean("ldap", "guessRelevantGroups", true);
-  }
-
-  @Override
-  public boolean contains(AccountGroup.UUID groupId) {
-    return get().contains(groupId);
-  }
-
-  @Override
-  public boolean containsAnyOf(Iterable<AccountGroup.UUID> groupIds) {
-    return get().containsAnyOf(groupIds);
-  }
-
-  @Override
-  public Set<AccountGroup.UUID> intersection(Iterable<AccountGroup.UUID> groupIds) {
-    return get().intersection(groupIds);
-  }
-
-  @Override
-  public Set<AccountGroup.UUID> getKnownGroups() {
-    Set<AccountGroup.UUID> g = new HashSet<>(get().getKnownGroups());
-    if (guessRelevantGroups) {
-      g.retainAll(projectCache.guessRelevantGroupUUIDs());
-    }
-    return g;
-  }
-
-  private synchronized GroupMembership get() {
-    if (membership == null) {
-      try {
-        membership = new ListGroupMembership(membershipCache.get(id));
-      } catch (ExecutionException e) {
-        LdapGroupBackend.log.warn("Cannot lookup membershipsOf {} in LDAP", id, e);
-        membership = GroupMembership.EMPTY;
-      }
-    }
-    return membership;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapModule.java
deleted file mode 100644
index 05228b4..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapModule.java
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.auth.ldap;
-
-import static java.util.concurrent.TimeUnit.HOURS;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.Realm;
-import com.google.gerrit.server.cache.CacheModule;
-import com.google.inject.Scopes;
-import com.google.inject.TypeLiteral;
-import java.util.Optional;
-import java.util.Set;
-
-public class LdapModule extends CacheModule {
-  static final String USERNAME_CACHE = "ldap_usernames";
-  static final String GROUP_CACHE = "ldap_groups";
-  static final String GROUP_EXIST_CACHE = "ldap_group_existence";
-  static final String PARENT_GROUPS_CACHE = "ldap_groups_byinclude";
-
-  @Override
-  protected void configure() {
-    cache(GROUP_CACHE, String.class, new TypeLiteral<Set<AccountGroup.UUID>>() {})
-        .expireAfterWrite(1, HOURS)
-        .loader(LdapRealm.MemberLoader.class);
-
-    cache(USERNAME_CACHE, String.class, new TypeLiteral<Optional<Account.Id>>() {})
-        .loader(LdapRealm.UserLoader.class);
-
-    cache(GROUP_EXIST_CACHE, String.class, new TypeLiteral<Boolean>() {})
-        .expireAfterWrite(1, HOURS)
-        .loader(LdapRealm.ExistenceLoader.class);
-
-    cache(PARENT_GROUPS_CACHE, String.class, new TypeLiteral<ImmutableSet<String>>() {})
-        .expireAfterWrite(1, HOURS);
-
-    bind(Helper.class);
-    bind(Realm.class).to(LdapRealm.class).in(Scopes.SINGLETON);
-
-    DynamicSet.bind(binder(), GroupBackend.class).to(LdapGroupBackend.class);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapRealm.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapRealm.java
deleted file mode 100644
index 24fdef4..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapRealm.java
+++ /dev/null
@@ -1,418 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.auth.ldap;
-
-import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_GERRIT;
-
-import com.google.common.base.Strings;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.common.data.ParameterizedString;
-import com.google.gerrit.extensions.client.AccountFieldName;
-import com.google.gerrit.extensions.client.AuthType;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.account.AbstractRealm;
-import com.google.gerrit.server.account.AccountException;
-import com.google.gerrit.server.account.AuthRequest;
-import com.google.gerrit.server.account.EmailExpander;
-import com.google.gerrit.server.account.GroupBackends;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.account.externalids.ExternalIds;
-import com.google.gerrit.server.auth.AuthenticationUnavailableException;
-import com.google.gerrit.server.auth.NoSuchUserException;
-import com.google.gerrit.server.config.AuthConfig;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.google.inject.name.Named;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import java.util.concurrent.ExecutionException;
-import javax.naming.CompositeName;
-import javax.naming.Name;
-import javax.naming.NamingException;
-import javax.naming.directory.DirContext;
-import javax.security.auth.login.LoginException;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-class LdapRealm extends AbstractRealm {
-  private static final Logger log = LoggerFactory.getLogger(LdapRealm.class);
-
-  static final String LDAP = "com.sun.jndi.ldap.LdapCtxFactory";
-  static final String USERNAME = "username";
-
-  private final Helper helper;
-  private final AuthConfig authConfig;
-  private final EmailExpander emailExpander;
-  private final LoadingCache<String, Optional<Account.Id>> usernameCache;
-  private final Set<AccountFieldName> readOnlyAccountFields;
-  private final boolean fetchMemberOfEagerly;
-  private final String mandatoryGroup;
-  private final LdapGroupBackend groupBackend;
-
-  private final Config config;
-
-  private final LoadingCache<String, Set<AccountGroup.UUID>> membershipCache;
-
-  @Inject
-  LdapRealm(
-      Helper helper,
-      AuthConfig authConfig,
-      EmailExpander emailExpander,
-      LdapGroupBackend groupBackend,
-      @Named(LdapModule.GROUP_CACHE) LoadingCache<String, Set<AccountGroup.UUID>> membershipCache,
-      @Named(LdapModule.USERNAME_CACHE) LoadingCache<String, Optional<Account.Id>> usernameCache,
-      @GerritServerConfig Config config) {
-    this.helper = helper;
-    this.authConfig = authConfig;
-    this.emailExpander = emailExpander;
-    this.groupBackend = groupBackend;
-    this.usernameCache = usernameCache;
-    this.membershipCache = membershipCache;
-    this.config = config;
-
-    this.readOnlyAccountFields = new HashSet<>();
-
-    if (optdef(config, "accountFullName", "DEFAULT") != null) {
-      readOnlyAccountFields.add(AccountFieldName.FULL_NAME);
-    }
-    if (optdef(config, "accountSshUserName", "DEFAULT") != null) {
-      readOnlyAccountFields.add(AccountFieldName.USER_NAME);
-    }
-    if (!authConfig.isAllowRegisterNewEmail()) {
-      readOnlyAccountFields.add(AccountFieldName.REGISTER_NEW_EMAIL);
-    }
-
-    fetchMemberOfEagerly = optional(config, "fetchMemberOfEagerly", true);
-    mandatoryGroup = optional(config, "mandatoryGroup");
-  }
-
-  static SearchScope scope(Config c, String setting) {
-    return c.getEnum("ldap", null, setting, SearchScope.SUBTREE);
-  }
-
-  static String optional(Config config, String name) {
-    return config.getString("ldap", null, name);
-  }
-
-  static int optional(Config config, String name, int defaultValue) {
-    return config.getInt("ldap", name, defaultValue);
-  }
-
-  static String optional(Config config, String name, String defaultValue) {
-    final String v = optional(config, name);
-    if (Strings.isNullOrEmpty(v)) {
-      return defaultValue;
-    }
-    return v;
-  }
-
-  static boolean optional(Config config, String name, boolean defaultValue) {
-    return config.getBoolean("ldap", name, defaultValue);
-  }
-
-  static String required(Config config, String name) {
-    final String v = optional(config, name);
-    if (v == null || "".equals(v)) {
-      throw new IllegalArgumentException("No ldap." + name + " configured");
-    }
-    return v;
-  }
-
-  static List<String> optionalList(Config config, String name) {
-    String[] s = config.getStringList("ldap", null, name);
-    return Arrays.asList(s);
-  }
-
-  static List<String> requiredList(Config config, String name) {
-    List<String> vlist = optionalList(config, name);
-
-    if (vlist.isEmpty()) {
-      throw new IllegalArgumentException("No ldap " + name + " configured");
-    }
-
-    return vlist;
-  }
-
-  static String optdef(Config c, String n, String d) {
-    final String[] v = c.getStringList("ldap", null, n);
-    if (v == null || v.length == 0) {
-      return d;
-
-    } else if (v[0] == null || "".equals(v[0])) {
-      return null;
-
-    } else {
-      checkBackendCompliance(n, v[0], Strings.isNullOrEmpty(d));
-      return v[0];
-    }
-  }
-
-  static String reqdef(Config c, String n, String d) {
-    final String v = optdef(c, n, d);
-    if (v == null) {
-      throw new IllegalArgumentException("No ldap." + n + " configured");
-    }
-    return v;
-  }
-
-  static ParameterizedString paramString(Config c, String n, String d) {
-    String expression = optdef(c, n, d);
-    if (expression == null) {
-      return null;
-    } else if (expression.contains("${")) {
-      return new ParameterizedString(expression);
-    } else {
-      return new ParameterizedString("${" + expression + "}");
-    }
-  }
-
-  private static void checkBackendCompliance(
-      String configOption, String suppliedValue, boolean disabledByBackend) {
-    if (disabledByBackend && !Strings.isNullOrEmpty(suppliedValue)) {
-      String msg = String.format("LDAP backend doesn't support: ldap.%s", configOption);
-      log.error(msg);
-      throw new IllegalArgumentException(msg);
-    }
-  }
-
-  @Override
-  public boolean allowsEdit(AccountFieldName field) {
-    return !readOnlyAccountFields.contains(field);
-  }
-
-  static String apply(ParameterizedString p, LdapQuery.Result m) throws NamingException {
-    if (p == null) {
-      return null;
-    }
-
-    final Map<String, String> values = new HashMap<>();
-    for (String name : m.attributes()) {
-      values.put(name, m.get(name));
-    }
-
-    String r = p.replace(values);
-    return r.isEmpty() ? null : r;
-  }
-
-  @Override
-  public AuthRequest authenticate(AuthRequest who) throws AccountException {
-    if (config.getBoolean("ldap", "localUsernameToLowerCase", false)) {
-      who.setLocalUser(who.getLocalUser().toLowerCase(Locale.US));
-    }
-
-    final String username = who.getLocalUser();
-    try {
-      final DirContext ctx;
-      if (authConfig.getAuthType() == AuthType.LDAP_BIND) {
-        ctx = helper.authenticate(username, who.getPassword());
-      } else {
-        ctx = helper.open();
-      }
-      try {
-        final Helper.LdapSchema schema = helper.getSchema(ctx);
-        LdapQuery.Result m;
-        who.setAuthProvidesAccountActiveStatus(true);
-        m = helper.findAccount(schema, ctx, username, fetchMemberOfEagerly);
-        who.setActive(true);
-
-        if (authConfig.getAuthType() == AuthType.LDAP && !who.isSkipAuthentication()) {
-          // We found the user account, but we need to verify
-          // the password matches it before we can continue.
-          //
-          helper.authenticate(m.getDN(), who.getPassword()).close();
-        }
-
-        who.setDisplayName(apply(schema.accountFullName, m));
-        who.setUserName(apply(schema.accountSshUserName, m));
-
-        if (schema.accountEmailAddress != null) {
-          who.setEmailAddress(apply(schema.accountEmailAddress, m));
-
-        } else if (emailExpander.canExpand(username)) {
-          // If LDAP cannot give us a valid email address for this user
-          // try expanding it through the older email expander code which
-          // assumes a user name within a domain.
-          //
-          who.setEmailAddress(emailExpander.expand(username));
-        }
-
-        // Fill the cache with the user's current groups. We've already
-        // spent the cost to open the LDAP connection, we might as well
-        // do one more call to get their group membership. Since we are
-        // in the middle of authenticating the user, its likely we will
-        // need to know what access rights they have soon.
-        //
-        if (fetchMemberOfEagerly || mandatoryGroup != null) {
-          Set<AccountGroup.UUID> groups = helper.queryForGroups(ctx, username, m);
-          if (mandatoryGroup != null) {
-            GroupReference mandatoryGroupRef =
-                GroupBackends.findExactSuggestion(groupBackend, mandatoryGroup);
-            if (mandatoryGroupRef == null) {
-              throw new AccountException("Could not identify mandatory group: " + mandatoryGroup);
-            }
-            if (!groups.contains(mandatoryGroupRef.getUUID())) {
-              throw new AccountException(
-                  "Not member of mandatory LDAP group: " + mandatoryGroupRef.getName());
-            }
-          }
-          // Regardless if we enabled fetchMemberOfEagerly, we already have the
-          // groups and it would be a waste not to cache them.
-          membershipCache.put(username, groups);
-        }
-        return who;
-      } finally {
-        try {
-          ctx.close();
-        } catch (NamingException e) {
-          log.warn("Cannot close LDAP query handle", e);
-        }
-      }
-    } catch (NamingException e) {
-      log.error("Cannot query LDAP to authenticate user", e);
-      throw new AuthenticationUnavailableException("Cannot query LDAP for account", e);
-    } catch (LoginException e) {
-      log.error("Cannot authenticate server via JAAS", e);
-      throw new AuthenticationUnavailableException("Cannot query LDAP for account", e);
-    }
-  }
-
-  @Override
-  public void onCreateAccount(AuthRequest who, Account account) {
-    usernameCache.put(who.getLocalUser(), Optional.of(account.getId()));
-  }
-
-  @Override
-  public Account.Id lookup(String accountName) {
-    if (Strings.isNullOrEmpty(accountName)) {
-      return null;
-    }
-    try {
-      Optional<Account.Id> id = usernameCache.get(accountName);
-      return id != null ? id.orElse(null) : null;
-    } catch (ExecutionException e) {
-      log.warn("Cannot lookup account {} in LDAP", accountName, e);
-      return null;
-    }
-  }
-
-  @Override
-  public boolean isActive(String username)
-      throws LoginException, NamingException, AccountException {
-    final DirContext ctx = helper.open();
-    try {
-      Helper.LdapSchema schema = helper.getSchema(ctx);
-      helper.findAccount(schema, ctx, username, false);
-      return true;
-    } catch (NoSuchUserException e) {
-      return false;
-    } finally {
-      try {
-        ctx.close();
-      } catch (NamingException e) {
-        log.warn("Cannot close LDAP query handle", e);
-      }
-    }
-  }
-
-  @Override
-  public boolean accountBelongsToRealm(Collection<ExternalId> externalIds) {
-    for (ExternalId id : externalIds) {
-      if (id.toString().contains(SCHEME_GERRIT)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  static class UserLoader extends CacheLoader<String, Optional<Account.Id>> {
-    private final ExternalIds externalIds;
-
-    @Inject
-    UserLoader(ExternalIds externalIds) {
-      this.externalIds = externalIds;
-    }
-
-    @Override
-    public Optional<Account.Id> load(String username) throws Exception {
-      return Optional.ofNullable(externalIds.get(ExternalId.Key.create(SCHEME_GERRIT, username)))
-          .map(ExternalId::accountId);
-    }
-  }
-
-  static class MemberLoader extends CacheLoader<String, Set<AccountGroup.UUID>> {
-    private final Helper helper;
-
-    @Inject
-    MemberLoader(Helper helper) {
-      this.helper = helper;
-    }
-
-    @Override
-    public Set<AccountGroup.UUID> load(String username) throws Exception {
-      final DirContext ctx = helper.open();
-      try {
-        return helper.queryForGroups(ctx, username, null);
-      } finally {
-        try {
-          ctx.close();
-        } catch (NamingException e) {
-          log.warn("Cannot close LDAP query handle", e);
-        }
-      }
-    }
-  }
-
-  static class ExistenceLoader extends CacheLoader<String, Boolean> {
-    private final Helper helper;
-
-    @Inject
-    ExistenceLoader(Helper helper) {
-      this.helper = helper;
-    }
-
-    @Override
-    public Boolean load(String groupDn) throws Exception {
-      final DirContext ctx = helper.open();
-      try {
-        Name compositeGroupName = new CompositeName().add(groupDn);
-        try {
-          ctx.getAttributes(compositeGroupName);
-          return true;
-        } catch (NamingException e) {
-          return false;
-        }
-      } finally {
-        try {
-          ctx.close();
-        } catch (NamingException e) {
-          log.warn("Cannot close LDAP query handle", e);
-        }
-      }
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/oauth/OAuthRealm.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/oauth/OAuthRealm.java
deleted file mode 100644
index 51b5e16..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/oauth/OAuthRealm.java
+++ /dev/null
@@ -1,132 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.auth.oauth;
-
-import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_EXTERNAL;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.extensions.auth.oauth.OAuthLoginProvider;
-import com.google.gerrit.extensions.auth.oauth.OAuthUserInfo;
-import com.google.gerrit.extensions.client.AccountFieldName;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.account.AbstractRealm;
-import com.google.gerrit.server.account.AccountException;
-import com.google.gerrit.server.account.AccountManager;
-import com.google.gerrit.server.account.AuthRequest;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-import org.eclipse.jgit.lib.Config;
-
-@Singleton
-public class OAuthRealm extends AbstractRealm {
-  private final DynamicMap<OAuthLoginProvider> loginProviders;
-  private final Set<AccountFieldName> editableAccountFields;
-
-  @Inject
-  OAuthRealm(DynamicMap<OAuthLoginProvider> loginProviders, @GerritServerConfig Config config) {
-    this.loginProviders = loginProviders;
-    this.editableAccountFields = new HashSet<>();
-    // User name should be always editable, because not all OAuth providers
-    // expose them
-    editableAccountFields.add(AccountFieldName.USER_NAME);
-    if (config.getBoolean("oauth", null, "allowEditFullName", false)) {
-      editableAccountFields.add(AccountFieldName.FULL_NAME);
-    }
-    if (config.getBoolean("oauth", null, "allowRegisterNewEmail", false)) {
-      editableAccountFields.add(AccountFieldName.REGISTER_NEW_EMAIL);
-    }
-  }
-
-  @Override
-  public boolean allowsEdit(AccountFieldName field) {
-    return editableAccountFields.contains(field);
-  }
-
-  /**
-   * Authenticates with the {@link OAuthLoginProvider} specified in the authentication request.
-   *
-   * <p>{@link AccountManager} calls this method without password if authenticity of the user has
-   * already been established. In that case we can skip the authentication request to the {@code
-   * OAuthLoginService}.
-   *
-   * @param who the authentication request.
-   * @return the authentication request with resolved email address and display name in case the
-   *     authenticity of the user could be established; otherwise {@code who} is returned unchanged.
-   * @throws AccountException if the authentication request with the OAuth2 server failed or no
-   *     {@code OAuthLoginProvider} was available to handle the request.
-   */
-  @Override
-  public AuthRequest authenticate(AuthRequest who) throws AccountException {
-    if (Strings.isNullOrEmpty(who.getPassword())) {
-      return who;
-    }
-
-    if (Strings.isNullOrEmpty(who.getAuthPlugin())
-        || Strings.isNullOrEmpty(who.getAuthProvider())) {
-      throw new AccountException("Cannot authenticate");
-    }
-    OAuthLoginProvider loginProvider =
-        loginProviders.get(who.getAuthPlugin(), who.getAuthProvider());
-    if (loginProvider == null) {
-      throw new AccountException("Cannot authenticate");
-    }
-
-    OAuthUserInfo userInfo;
-    try {
-      userInfo = loginProvider.login(who.getUserName(), who.getPassword());
-    } catch (IOException e) {
-      throw new AccountException("Cannot authenticate", e);
-    }
-    if (userInfo == null) {
-      throw new AccountException("Cannot authenticate");
-    }
-    if (!Strings.isNullOrEmpty(userInfo.getEmailAddress())
-        && (Strings.isNullOrEmpty(who.getUserName())
-            || !allowsEdit(AccountFieldName.REGISTER_NEW_EMAIL))) {
-      who.setEmailAddress(userInfo.getEmailAddress());
-    }
-    if (!Strings.isNullOrEmpty(userInfo.getDisplayName())
-        && (Strings.isNullOrEmpty(who.getDisplayName())
-            || !allowsEdit(AccountFieldName.FULL_NAME))) {
-      who.setDisplayName(userInfo.getDisplayName());
-    }
-    return who;
-  }
-
-  @Override
-  public void onCreateAccount(AuthRequest who, Account account) {}
-
-  @Override
-  public Account.Id lookup(String accountName) {
-    return null;
-  }
-
-  @Override
-  public boolean accountBelongsToRealm(Collection<ExternalId> externalIds) {
-    for (ExternalId id : externalIds) {
-      if (id.toString().contains(SCHEME_EXTERNAL)) {
-        return true;
-      }
-    }
-    return false;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/oauth/OAuthTokenCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/oauth/OAuthTokenCache.java
deleted file mode 100644
index 1ac3bca..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/oauth/OAuthTokenCache.java
+++ /dev/null
@@ -1,91 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.auth.oauth;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.common.cache.Cache;
-import com.google.gerrit.extensions.auth.oauth.OAuthToken;
-import com.google.gerrit.extensions.auth.oauth.OAuthTokenEncrypter;
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.cache.CacheModule;
-import com.google.inject.Inject;
-import com.google.inject.Module;
-import com.google.inject.Singleton;
-import com.google.inject.name.Named;
-
-@Singleton
-public class OAuthTokenCache {
-  public static final String OAUTH_TOKENS = "oauth_tokens";
-
-  private final DynamicItem<OAuthTokenEncrypter> encrypter;
-
-  public static Module module() {
-    return new CacheModule() {
-      @Override
-      protected void configure() {
-        persist(OAUTH_TOKENS, Account.Id.class, OAuthToken.class);
-      }
-    };
-  }
-
-  private final Cache<Account.Id, OAuthToken> cache;
-
-  @Inject
-  OAuthTokenCache(
-      @Named(OAUTH_TOKENS) Cache<Account.Id, OAuthToken> cache,
-      DynamicItem<OAuthTokenEncrypter> encrypter) {
-    this.cache = cache;
-    this.encrypter = encrypter;
-  }
-
-  public OAuthToken get(Account.Id id) {
-    OAuthToken accessToken = cache.getIfPresent(id);
-    if (accessToken == null) {
-      return null;
-    }
-    accessToken = decrypt(accessToken);
-    if (accessToken.isExpired()) {
-      cache.invalidate(id);
-      return null;
-    }
-    return accessToken;
-  }
-
-  public void put(Account.Id id, OAuthToken accessToken) {
-    cache.put(id, encrypt(checkNotNull(accessToken)));
-  }
-
-  public void remove(Account.Id id) {
-    cache.invalidate(id);
-  }
-
-  private OAuthToken encrypt(OAuthToken token) {
-    OAuthTokenEncrypter enc = encrypter.get();
-    if (enc == null) {
-      return token;
-    }
-    return enc.encrypt(token);
-  }
-
-  private OAuthToken decrypt(OAuthToken token) {
-    OAuthTokenEncrypter enc = encrypter.get();
-    if (enc == null) {
-      return token;
-    }
-    return enc.decrypt(token);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheBinding.java b/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheBinding.java
deleted file mode 100644
index abb0f32..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheBinding.java
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.cache;
-
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.Weigher;
-import com.google.gerrit.common.Nullable;
-import com.google.inject.TypeLiteral;
-import java.util.concurrent.TimeUnit;
-
-/** Configure a cache declared within a {@link CacheModule} instance. */
-public interface CacheBinding<K, V> {
-  /** Set the total size of the cache. */
-  CacheBinding<K, V> maximumWeight(long weight);
-
-  /** Set the total on-disk limit of the cache */
-  CacheBinding<K, V> diskLimit(long limit);
-
-  /** Set the time an element lives before being expired. */
-  CacheBinding<K, V> expireAfterWrite(long duration, TimeUnit durationUnits);
-
-  /** Populate the cache with items from the CacheLoader. */
-  CacheBinding<K, V> loader(Class<? extends CacheLoader<K, V>> clazz);
-
-  /** Algorithm to weigh an object with a method other than the unit weight 1. */
-  CacheBinding<K, V> weigher(Class<? extends Weigher<K, V>> clazz);
-
-  String name();
-
-  TypeLiteral<K> keyType();
-
-  TypeLiteral<V> valueType();
-
-  long maximumWeight();
-
-  long diskLimit();
-
-  @Nullable
-  Long expireAfterWrite(TimeUnit unit);
-
-  @Nullable
-  Weigher<K, V> weigher();
-
-  @Nullable
-  CacheLoader<K, V> loader();
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheMetrics.java b/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheMetrics.java
deleted file mode 100644
index 11f2034..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheMetrics.java
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.cache;
-
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheStats;
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.metrics.CallbackMetric;
-import com.google.gerrit.metrics.CallbackMetric1;
-import com.google.gerrit.metrics.Description;
-import com.google.gerrit.metrics.Field;
-import com.google.gerrit.metrics.MetricMaker;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.Set;
-
-@Singleton
-public class CacheMetrics {
-  @Inject
-  public CacheMetrics(MetricMaker metrics, DynamicMap<Cache<?, ?>> cacheMap) {
-    Field<String> F_NAME = Field.ofString("cache_name");
-
-    CallbackMetric1<String, Long> memEnt =
-        metrics.newCallbackMetric(
-            "caches/memory_cached",
-            Long.class,
-            new Description("Memory entries").setGauge().setUnit("entries"),
-            F_NAME);
-    CallbackMetric1<String, Double> memHit =
-        metrics.newCallbackMetric(
-            "caches/memory_hit_ratio",
-            Double.class,
-            new Description("Memory hit ratio").setGauge().setUnit("percent"),
-            F_NAME);
-    CallbackMetric1<String, Long> memEvict =
-        metrics.newCallbackMetric(
-            "caches/memory_eviction_count",
-            Long.class,
-            new Description("Memory eviction count").setGauge().setUnit("evicted entries"),
-            F_NAME);
-    CallbackMetric1<String, Long> perDiskEnt =
-        metrics.newCallbackMetric(
-            "caches/disk_cached",
-            Long.class,
-            new Description("Disk entries used by persistent cache").setGauge().setUnit("entries"),
-            F_NAME);
-    CallbackMetric1<String, Double> perDiskHit =
-        metrics.newCallbackMetric(
-            "caches/disk_hit_ratio",
-            Double.class,
-            new Description("Disk hit ratio for persistent cache").setGauge().setUnit("percent"),
-            F_NAME);
-
-    Set<CallbackMetric<?>> cacheMetrics =
-        ImmutableSet.<CallbackMetric<?>>of(memEnt, memHit, memEvict, perDiskEnt, perDiskHit);
-
-    metrics.newTrigger(
-        cacheMetrics,
-        () -> {
-          for (DynamicMap.Entry<Cache<?, ?>> e : cacheMap) {
-            Cache<?, ?> c = e.getProvider().get();
-            String name = metricNameOf(e);
-            CacheStats cstats = c.stats();
-            memEnt.set(name, c.size());
-            memHit.set(name, cstats.hitRate() * 100);
-            memEvict.set(name, cstats.evictionCount());
-            if (c instanceof PersistentCache) {
-              PersistentCache.DiskStats d = ((PersistentCache) c).diskStats();
-              perDiskEnt.set(name, d.size());
-              perDiskHit.set(name, hitRatio(d));
-            }
-          }
-          cacheMetrics.forEach(CallbackMetric::prune);
-        });
-  }
-
-  private static double hitRatio(PersistentCache.DiskStats d) {
-    if (d.requestCount() <= 0) {
-      return 100;
-    }
-    return ((double) d.hitCount() / d.requestCount() * 100);
-  }
-
-  private static String metricNameOf(DynamicMap.Entry<Cache<?, ?>> e) {
-    if ("gerrit".equals(e.getPluginName())) {
-      return e.getExportName();
-    }
-    return String.format("plugin/%s/%s", e.getPluginName(), e.getExportName());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheModule.java
deleted file mode 100644
index 0e0c16f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheModule.java
+++ /dev/null
@@ -1,157 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.cache;
-
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import com.google.common.cache.Weigher;
-import com.google.gerrit.extensions.annotations.Exports;
-import com.google.gerrit.extensions.config.FactoryModule;
-import com.google.inject.Key;
-import com.google.inject.Provider;
-import com.google.inject.Scopes;
-import com.google.inject.TypeLiteral;
-import com.google.inject.name.Names;
-import com.google.inject.util.Types;
-import java.io.Serializable;
-import java.lang.reflect.Type;
-
-/** Miniature DSL to support binding {@link Cache} instances in Guice. */
-public abstract class CacheModule extends FactoryModule {
-  public static final String MEMORY_MODULE = "cache-memory";
-  public static final String PERSISTENT_MODULE = "cache-persistent";
-
-  private static final TypeLiteral<Cache<?, ?>> ANY_CACHE = new TypeLiteral<Cache<?, ?>>() {};
-
-  /**
-   * Declare a named in-memory cache.
-   *
-   * @param <K> type of key used to lookup entries.
-   * @param <V> type of value stored by the cache.
-   * @return binding to describe the cache.
-   */
-  protected <K, V> CacheBinding<K, V> cache(String name, Class<K> keyType, Class<V> valType) {
-    return cache(name, TypeLiteral.get(keyType), TypeLiteral.get(valType));
-  }
-
-  /**
-   * Declare a named in-memory cache.
-   *
-   * @param <K> type of key used to lookup entries.
-   * @param <V> type of value stored by the cache.
-   * @return binding to describe the cache.
-   */
-  protected <K, V> CacheBinding<K, V> cache(String name, Class<K> keyType, TypeLiteral<V> valType) {
-    return cache(name, TypeLiteral.get(keyType), valType);
-  }
-
-  /**
-   * Declare a named in-memory cache.
-   *
-   * @param <K> type of key used to lookup entries.
-   * @param <V> type of value stored by the cache.
-   * @return binding to describe the cache.
-   */
-  protected <K, V> CacheBinding<K, V> cache(
-      String name, TypeLiteral<K> keyType, TypeLiteral<V> valType) {
-    Type type = Types.newParameterizedType(Cache.class, keyType.getType(), valType.getType());
-
-    @SuppressWarnings("unchecked")
-    Key<Cache<K, V>> key = (Key<Cache<K, V>>) Key.get(type, Names.named(name));
-
-    CacheProvider<K, V> m = new CacheProvider<>(this, name, keyType, valType);
-    bind(key).toProvider(m).asEagerSingleton();
-    bind(ANY_CACHE).annotatedWith(Exports.named(name)).to(key);
-    return m.maximumWeight(1024);
-  }
-
-  <K, V> Provider<CacheLoader<K, V>> bindCacheLoader(
-      CacheProvider<K, V> m, Class<? extends CacheLoader<K, V>> impl) {
-    Type type =
-        Types.newParameterizedType(Cache.class, m.keyType().getType(), m.valueType().getType());
-
-    Type loadingType =
-        Types.newParameterizedType(
-            LoadingCache.class, m.keyType().getType(), m.valueType().getType());
-
-    Type loaderType =
-        Types.newParameterizedType(
-            CacheLoader.class, m.keyType().getType(), m.valueType().getType());
-
-    @SuppressWarnings("unchecked")
-    Key<LoadingCache<K, V>> key = (Key<LoadingCache<K, V>>) Key.get(type, Names.named(m.name));
-
-    @SuppressWarnings("unchecked")
-    Key<LoadingCache<K, V>> loadingKey =
-        (Key<LoadingCache<K, V>>) Key.get(loadingType, Names.named(m.name));
-
-    @SuppressWarnings("unchecked")
-    Key<CacheLoader<K, V>> loaderKey =
-        (Key<CacheLoader<K, V>>) Key.get(loaderType, Names.named(m.name));
-
-    bind(loaderKey).to(impl).in(Scopes.SINGLETON);
-    bind(loadingKey).to(key);
-    return getProvider(loaderKey);
-  }
-
-  <K, V> Provider<Weigher<K, V>> bindWeigher(
-      CacheProvider<K, V> m, Class<? extends Weigher<K, V>> impl) {
-    Type weigherType =
-        Types.newParameterizedType(Weigher.class, m.keyType().getType(), m.valueType().getType());
-
-    @SuppressWarnings("unchecked")
-    Key<Weigher<K, V>> key = (Key<Weigher<K, V>>) Key.get(weigherType, Names.named(m.name));
-
-    bind(key).to(impl).in(Scopes.SINGLETON);
-    return getProvider(key);
-  }
-
-  /**
-   * Declare a named in-memory/on-disk cache.
-   *
-   * @param <K> type of key used to lookup entries.
-   * @param <V> type of value stored by the cache.
-   * @return binding to describe the cache.
-   */
-  protected <K extends Serializable, V extends Serializable> CacheBinding<K, V> persist(
-      String name, Class<K> keyType, Class<V> valType) {
-    return persist(name, TypeLiteral.get(keyType), TypeLiteral.get(valType));
-  }
-
-  /**
-   * Declare a named in-memory/on-disk cache.
-   *
-   * @param <K> type of key used to lookup entries.
-   * @param <V> type of value stored by the cache.
-   * @return binding to describe the cache.
-   */
-  protected <K extends Serializable, V extends Serializable> CacheBinding<K, V> persist(
-      String name, Class<K> keyType, TypeLiteral<V> valType) {
-    return persist(name, TypeLiteral.get(keyType), valType);
-  }
-
-  /**
-   * Declare a named in-memory/on-disk cache.
-   *
-   * @param <K> type of key used to lookup entries.
-   * @param <V> type of value stored by the cache.
-   * @return binding to describe the cache.
-   */
-  protected <K extends Serializable, V extends Serializable> CacheBinding<K, V> persist(
-      String name, TypeLiteral<K> keyType, TypeLiteral<V> valType) {
-    return ((CacheProvider<K, V>) cache(name, keyType, valType)).persist(true);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheProvider.java
deleted file mode 100644
index 86df104..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheProvider.java
+++ /dev/null
@@ -1,177 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.cache;
-
-import static java.util.concurrent.TimeUnit.SECONDS;
-
-import com.google.common.base.Preconditions;
-import com.google.common.base.Strings;
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.Weigher;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.annotations.PluginName;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.TypeLiteral;
-import java.util.concurrent.TimeUnit;
-
-class CacheProvider<K, V> implements Provider<Cache<K, V>>, CacheBinding<K, V> {
-  private final CacheModule module;
-  final String name;
-  private final TypeLiteral<K> keyType;
-  private final TypeLiteral<V> valType;
-  private boolean persist;
-  private long maximumWeight;
-  private long diskLimit;
-  private Long expireAfterWrite;
-  private Provider<CacheLoader<K, V>> loader;
-  private Provider<Weigher<K, V>> weigher;
-
-  private String plugin;
-  private MemoryCacheFactory memoryCacheFactory;
-  private PersistentCacheFactory persistentCacheFactory;
-  private boolean frozen;
-
-  CacheProvider(CacheModule module, String name, TypeLiteral<K> keyType, TypeLiteral<V> valType) {
-    this.module = module;
-    this.name = name;
-    this.keyType = keyType;
-    this.valType = valType;
-  }
-
-  @Inject(optional = true)
-  void setPluginName(@PluginName String pluginName) {
-    this.plugin = pluginName;
-  }
-
-  @Inject
-  void setMemoryCacheFactory(MemoryCacheFactory factory) {
-    this.memoryCacheFactory = factory;
-  }
-
-  @Inject(optional = true)
-  void setPersistentCacheFactory(@Nullable PersistentCacheFactory factory) {
-    this.persistentCacheFactory = factory;
-  }
-
-  CacheBinding<K, V> persist(boolean p) {
-    Preconditions.checkState(!frozen, "binding frozen, cannot be modified");
-    persist = p;
-    return this;
-  }
-
-  @Override
-  public CacheBinding<K, V> maximumWeight(long weight) {
-    Preconditions.checkState(!frozen, "binding frozen, cannot be modified");
-    maximumWeight = weight;
-    return this;
-  }
-
-  @Override
-  public CacheBinding<K, V> diskLimit(long limit) {
-    Preconditions.checkState(!frozen, "binding frozen, cannot be modified");
-    Preconditions.checkState(persist, "diskLimit supported for persistent caches only");
-    diskLimit = limit;
-    return this;
-  }
-
-  @Override
-  public CacheBinding<K, V> expireAfterWrite(long duration, TimeUnit unit) {
-    Preconditions.checkState(!frozen, "binding frozen, cannot be modified");
-    expireAfterWrite = SECONDS.convert(duration, unit);
-    return this;
-  }
-
-  @Override
-  public CacheBinding<K, V> loader(Class<? extends CacheLoader<K, V>> impl) {
-    Preconditions.checkState(!frozen, "binding frozen, cannot be modified");
-    loader = module.bindCacheLoader(this, impl);
-    return this;
-  }
-
-  @Override
-  public CacheBinding<K, V> weigher(Class<? extends Weigher<K, V>> impl) {
-    Preconditions.checkState(!frozen, "binding frozen, cannot be modified");
-    weigher = module.bindWeigher(this, impl);
-    return this;
-  }
-
-  @Override
-  public String name() {
-    if (!Strings.isNullOrEmpty(plugin)) {
-      return plugin + "." + name;
-    }
-    return name;
-  }
-
-  @Override
-  public TypeLiteral<K> keyType() {
-    return keyType;
-  }
-
-  @Override
-  public TypeLiteral<V> valueType() {
-    return valType;
-  }
-
-  @Override
-  public long maximumWeight() {
-    return maximumWeight;
-  }
-
-  @Override
-  public long diskLimit() {
-    if (diskLimit > 0) {
-      return diskLimit;
-    }
-    return 128 << 20;
-  }
-
-  @Override
-  @Nullable
-  public Long expireAfterWrite(TimeUnit unit) {
-    return expireAfterWrite != null ? unit.convert(expireAfterWrite, SECONDS) : null;
-  }
-
-  @Override
-  @Nullable
-  public Weigher<K, V> weigher() {
-    return weigher != null ? weigher.get() : null;
-  }
-
-  @Override
-  @Nullable
-  public CacheLoader<K, V> loader() {
-    return loader != null ? loader.get() : null;
-  }
-
-  @Override
-  public Cache<K, V> get() {
-    frozen = true;
-
-    if (loader != null) {
-      CacheLoader<K, V> ldr = loader.get();
-      if (persist && persistentCacheFactory != null) {
-        return persistentCacheFactory.build(this, ldr);
-      }
-      return memoryCacheFactory.build(this, ldr);
-    } else if (persist && persistentCacheFactory != null) {
-      return persistentCacheFactory.build(this);
-    } else {
-      return memoryCacheFactory.build(this);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/cache/ForwardingRemovalListener.java b/gerrit-server/src/main/java/com/google/gerrit/server/cache/ForwardingRemovalListener.java
deleted file mode 100644
index be06601..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/cache/ForwardingRemovalListener.java
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.cache;
-
-import com.google.common.base.Strings;
-import com.google.common.cache.RemovalListener;
-import com.google.common.cache.RemovalNotification;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-
-/**
- * This listener dispatches removal events to all other RemovalListeners attached via the DynamicSet
- * API.
- *
- * @param <K>
- * @param <V>
- */
-@SuppressWarnings("rawtypes")
-public class ForwardingRemovalListener<K, V> implements RemovalListener<K, V> {
-  public interface Factory {
-    ForwardingRemovalListener create(String cacheName);
-  }
-
-  private final DynamicSet<CacheRemovalListener> listeners;
-  private final String cacheName;
-  private String pluginName = "gerrit";
-
-  @Inject
-  ForwardingRemovalListener(
-      DynamicSet<CacheRemovalListener> listeners, @Assisted String cacheName) {
-    this.listeners = listeners;
-    this.cacheName = cacheName;
-  }
-
-  @Inject(optional = true)
-  void setPluginName(String name) {
-    if (!Strings.isNullOrEmpty(name)) {
-      this.pluginName = name;
-    }
-  }
-
-  @Override
-  @SuppressWarnings("unchecked")
-  public void onRemoval(RemovalNotification<K, V> notification) {
-    for (CacheRemovalListener<K, V> l : listeners) {
-      l.onRemoval(pluginName, cacheName, notification);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/cache/MemoryCacheFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/cache/MemoryCacheFactory.java
deleted file mode 100644
index 49fcd5b..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/cache/MemoryCacheFactory.java
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.cache;
-
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-
-public interface MemoryCacheFactory {
-  <K, V> Cache<K, V> build(CacheBinding<K, V> def);
-
-  <K, V> LoadingCache<K, V> build(CacheBinding<K, V> def, CacheLoader<K, V> loader);
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/cache/PersistentCacheFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/cache/PersistentCacheFactory.java
deleted file mode 100644
index c52c232..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/cache/PersistentCacheFactory.java
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.cache;
-
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import com.google.gerrit.server.plugins.Plugin;
-
-public interface PersistentCacheFactory {
-  <K, V> Cache<K, V> build(CacheBinding<K, V> def);
-
-  <K, V> LoadingCache<K, V> build(CacheBinding<K, V> def, CacheLoader<K, V> loader);
-
-  void onStop(Plugin plugin);
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Abandon.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Abandon.java
deleted file mode 100644
index c9d016d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Abandon.java
+++ /dev/null
@@ -1,210 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.change;
-
-import static com.google.gerrit.extensions.conditions.BooleanCondition.and;
-
-import com.google.common.collect.ImmutableListMultimap;
-import com.google.common.collect.ListMultimap;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.api.changes.AbandonInput;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.api.changes.RecipientType;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.webui.UiAction;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.git.AbandonOp;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.RetryingRestModifyView;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.Collection;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-@Singleton
-public class Abandon extends RetryingRestModifyView<ChangeResource, AbandonInput, ChangeInfo>
-    implements UiAction<ChangeResource> {
-  private final Provider<ReviewDb> dbProvider;
-  private final ChangeJson.Factory json;
-  private final AbandonOp.Factory abandonOpFactory;
-  private final NotifyUtil notifyUtil;
-
-  @Inject
-  Abandon(
-      Provider<ReviewDb> dbProvider,
-      ChangeJson.Factory json,
-      RetryHelper retryHelper,
-      AbandonOp.Factory abandonOpFactory,
-      NotifyUtil notifyUtil) {
-    super(retryHelper);
-    this.dbProvider = dbProvider;
-    this.json = json;
-    this.abandonOpFactory = abandonOpFactory;
-    this.notifyUtil = notifyUtil;
-  }
-
-  @Override
-  protected ChangeInfo applyImpl(
-      BatchUpdate.Factory updateFactory, ChangeResource req, AbandonInput input)
-      throws RestApiException, UpdateException, OrmException, PermissionBackendException,
-          IOException, ConfigInvalidException {
-    req.permissions().database(dbProvider).check(ChangePermission.ABANDON);
-
-    NotifyHandling notify = input.notify == null ? defaultNotify(req.getChange()) : input.notify;
-    Change change =
-        abandon(
-            updateFactory,
-            req.getNotes(),
-            req.getUser(),
-            input.message,
-            notify,
-            notifyUtil.resolveAccounts(input.notifyDetails));
-    return json.noOptions().format(change);
-  }
-
-  private NotifyHandling defaultNotify(Change change) {
-    return change.hasReviewStarted() ? NotifyHandling.ALL : NotifyHandling.OWNER;
-  }
-
-  public Change abandon(BatchUpdate.Factory updateFactory, ChangeNotes notes, CurrentUser user)
-      throws RestApiException, UpdateException {
-    return abandon(
-        updateFactory,
-        notes,
-        user,
-        "",
-        defaultNotify(notes.getChange()),
-        ImmutableListMultimap.of());
-  }
-
-  public Change abandon(
-      BatchUpdate.Factory updateFactory, ChangeNotes notes, CurrentUser user, String msgTxt)
-      throws RestApiException, UpdateException {
-    return abandon(
-        updateFactory,
-        notes,
-        user,
-        msgTxt,
-        defaultNotify(notes.getChange()),
-        ImmutableListMultimap.of());
-  }
-
-  public Change abandon(
-      BatchUpdate.Factory updateFactory,
-      ChangeNotes notes,
-      CurrentUser user,
-      String msgTxt,
-      NotifyHandling notifyHandling,
-      ListMultimap<RecipientType, Account.Id> accountsToNotify)
-      throws RestApiException, UpdateException {
-    Account account = user.isIdentifiedUser() ? user.asIdentifiedUser().getAccount() : null;
-    AbandonOp op = abandonOpFactory.create(account, msgTxt, notifyHandling, accountsToNotify);
-    try (BatchUpdate u =
-        updateFactory.create(dbProvider.get(), notes.getProjectName(), user, TimeUtil.nowTs())) {
-      u.addOp(notes.getChangeId(), op).execute();
-    }
-    return op.getChange();
-  }
-
-  /**
-   * If an extension has more than one changes to abandon that belong to the same project, they
-   * should use the batch instead of abandoning one by one.
-   *
-   * <p>It's the caller's responsibility to ensure that all jobs inside the same batch have the
-   * matching project from its ChangeData. Violations will result in a ResourceConflictException.
-   */
-  public void batchAbandon(
-      BatchUpdate.Factory updateFactory,
-      Project.NameKey project,
-      CurrentUser user,
-      Collection<ChangeData> changes,
-      String msgTxt,
-      NotifyHandling notifyHandling,
-      ListMultimap<RecipientType, Account.Id> accountsToNotify)
-      throws RestApiException, UpdateException {
-    if (changes.isEmpty()) {
-      return;
-    }
-    Account account = user.isIdentifiedUser() ? user.asIdentifiedUser().getAccount() : null;
-    try (BatchUpdate u = updateFactory.create(dbProvider.get(), project, user, TimeUtil.nowTs())) {
-      for (ChangeData change : changes) {
-        if (!project.equals(change.project())) {
-          throw new ResourceConflictException(
-              String.format(
-                  "Project name \"%s\" doesn't match \"%s\"",
-                  change.project().get(), project.get()));
-        }
-        u.addOp(
-            change.getId(),
-            abandonOpFactory.create(account, msgTxt, notifyHandling, accountsToNotify));
-      }
-      u.execute();
-    }
-  }
-
-  public void batchAbandon(
-      BatchUpdate.Factory updateFactory,
-      Project.NameKey project,
-      CurrentUser user,
-      Collection<ChangeData> changes,
-      String msgTxt)
-      throws RestApiException, UpdateException {
-    batchAbandon(
-        updateFactory,
-        project,
-        user,
-        changes,
-        msgTxt,
-        NotifyHandling.ALL,
-        ImmutableListMultimap.of());
-  }
-
-  public void batchAbandon(
-      BatchUpdate.Factory updateFactory,
-      Project.NameKey project,
-      CurrentUser user,
-      Collection<ChangeData> changes)
-      throws RestApiException, UpdateException {
-    batchAbandon(
-        updateFactory, project, user, changes, "", NotifyHandling.ALL, ImmutableListMultimap.of());
-  }
-
-  @Override
-  public UiAction.Description getDescription(ChangeResource rsrc) {
-    Change change = rsrc.getChange();
-    return new UiAction.Description()
-        .setLabel("Abandon")
-        .setTitle("Abandon the change")
-        .setVisible(
-            and(
-                change.getStatus().isOpen(),
-                rsrc.permissions().database(dbProvider).testCond(ChangePermission.ABANDON)));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/AbandonUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/AbandonUtil.java
deleted file mode 100644
index cbe2d1e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/AbandonUtil.java
+++ /dev/null
@@ -1,128 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.change;
-
-import com.google.common.collect.ImmutableListMultimap;
-import com.google.common.collect.ListMultimap;
-import com.google.gerrit.index.query.QueryParseException;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.InternalUser;
-import com.google.gerrit.server.config.ChangeCleanupConfig;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.ChangeQueryBuilder;
-import com.google.gerrit.server.query.change.ChangeQueryProcessor;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class AbandonUtil {
-  private static final Logger log = LoggerFactory.getLogger(AbandonUtil.class);
-
-  private final ChangeCleanupConfig cfg;
-  private final Provider<ChangeQueryProcessor> queryProvider;
-  private final ChangeQueryBuilder queryBuilder;
-  private final Abandon abandon;
-  private final InternalUser internalUser;
-
-  @Inject
-  AbandonUtil(
-      ChangeCleanupConfig cfg,
-      InternalUser.Factory internalUserFactory,
-      Provider<ChangeQueryProcessor> queryProvider,
-      ChangeQueryBuilder queryBuilder,
-      Abandon abandon) {
-    this.cfg = cfg;
-    this.queryProvider = queryProvider;
-    this.queryBuilder = queryBuilder;
-    this.abandon = abandon;
-    internalUser = internalUserFactory.create();
-  }
-
-  public void abandonInactiveOpenChanges(BatchUpdate.Factory updateFactory) {
-    if (cfg.getAbandonAfter() <= 0) {
-      return;
-    }
-
-    try {
-      String query =
-          "status:new age:" + TimeUnit.MILLISECONDS.toMinutes(cfg.getAbandonAfter()) + "m";
-      if (!cfg.getAbandonIfMergeable()) {
-        query += " -is:mergeable";
-      }
-
-      List<ChangeData> changesToAbandon =
-          queryProvider.get().enforceVisibility(false).query(queryBuilder.parse(query)).entities();
-      ImmutableListMultimap.Builder<Project.NameKey, ChangeData> builder =
-          ImmutableListMultimap.builder();
-      for (ChangeData cd : changesToAbandon) {
-        builder.put(cd.project(), cd);
-      }
-
-      int count = 0;
-      ListMultimap<Project.NameKey, ChangeData> abandons = builder.build();
-      String message = cfg.getAbandonMessage();
-      for (Project.NameKey project : abandons.keySet()) {
-        Collection<ChangeData> changes = getValidChanges(abandons.get(project), query);
-        try {
-          abandon.batchAbandon(updateFactory, project, internalUser, changes, message);
-          count += changes.size();
-        } catch (Throwable e) {
-          StringBuilder msg = new StringBuilder("Failed to auto-abandon inactive change(s):");
-          for (ChangeData change : changes) {
-            msg.append(" ").append(change.getId().get());
-          }
-          msg.append(".");
-          log.error(msg.toString(), e);
-        }
-      }
-      log.info("Auto-Abandoned {} of {} changes.", count, changesToAbandon.size());
-    } catch (QueryParseException | OrmException e) {
-      log.error("Failed to query inactive open changes for auto-abandoning.", e);
-    }
-  }
-
-  private Collection<ChangeData> getValidChanges(Collection<ChangeData> changes, String query)
-      throws OrmException, QueryParseException {
-    Collection<ChangeData> validChanges = new ArrayList<>();
-    for (ChangeData cd : changes) {
-      String newQuery = query + " change:" + cd.getId();
-      List<ChangeData> changesToAbandon =
-          queryProvider
-              .get()
-              .enforceVisibility(false)
-              .query(queryBuilder.parse(newQuery))
-              .entities();
-      if (!changesToAbandon.isEmpty()) {
-        validChanges.add(cd);
-      } else {
-        log.debug(
-            "Change data with id \"{}\" does not satisfy the query \"{}\""
-                + " any more, hence skipping it in clean up",
-            cd.getId(),
-            query);
-      }
-    }
-    return validChanges;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/AccountPatchReviewStore.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/AccountPatchReviewStore.java
deleted file mode 100644
index b7a6e82..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/AccountPatchReviewStore.java
+++ /dev/null
@@ -1,102 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.change;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gwtorm.server.OrmException;
-import java.util.Collection;
-import java.util.Optional;
-
-/**
- * Store for reviewed flags on changes.
- *
- * <p>A reviewed flag is a tuple of (patch set ID, file, account ID) and records whether the user
- * has reviewed a file in a patch set. Each user can easily have thousands of reviewed flags and the
- * number of reviewed flags is growing without bound. The store must be able handle this data volume
- * efficiently.
- *
- * <p>For a multi-master setup the store must replicate the data between the masters.
- */
-public interface AccountPatchReviewStore {
-
-  /** Represents patch set id with reviewed files. */
-  @AutoValue
-  abstract class PatchSetWithReviewedFiles {
-    abstract PatchSet.Id patchSetId();
-
-    abstract ImmutableSet<String> files();
-
-    public static PatchSetWithReviewedFiles create(PatchSet.Id id, ImmutableSet<String> files) {
-      return new AutoValue_AccountPatchReviewStore_PatchSetWithReviewedFiles(id, files);
-    }
-  }
-
-  /**
-   * Marks the given file in the given patch set as reviewed by the given user.
-   *
-   * @param psId patch set ID
-   * @param accountId account ID of the user
-   * @param path file path
-   * @return {@code true} if the reviewed flag was updated, {@code false} if the reviewed flag was
-   *     already set
-   * @throws OrmException thrown if updating the reviewed flag failed
-   */
-  boolean markReviewed(PatchSet.Id psId, Account.Id accountId, String path) throws OrmException;
-
-  /**
-   * Marks the given files in the given patch set as reviewed by the given user.
-   *
-   * @param psId patch set ID
-   * @param accountId account ID of the user
-   * @param paths file paths
-   * @throws OrmException thrown if updating the reviewed flag failed
-   */
-  void markReviewed(PatchSet.Id psId, Account.Id accountId, Collection<String> paths)
-      throws OrmException;
-
-  /**
-   * Clears the reviewed flag for the given file in the given patch set for the given user.
-   *
-   * @param psId patch set ID
-   * @param accountId account ID of the user
-   * @param path file path
-   * @throws OrmException thrown if clearing the reviewed flag failed
-   */
-  void clearReviewed(PatchSet.Id psId, Account.Id accountId, String path) throws OrmException;
-
-  /**
-   * Clears the reviewed flags for all files in the given patch set for all users.
-   *
-   * @param psId patch set ID
-   * @throws OrmException thrown if clearing the reviewed flags failed
-   */
-  void clearReviewed(PatchSet.Id psId) throws OrmException;
-
-  /**
-   * Find the latest patch set, that is smaller or equals to the given patch set, where at least,
-   * one file has been reviewed by the given user.
-   *
-   * @param psId patch set ID
-   * @param accountId account ID of the user
-   * @return optionally, all files the have been reviewed by the given user that belong to the patch
-   *     set that is smaller or equals to the given patch set
-   * @throws OrmException thrown if accessing the reviewed flags failed
-   */
-  Optional<PatchSetWithReviewedFiles> findReviewed(PatchSet.Id psId, Account.Id accountId)
-      throws OrmException;
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ActionJson.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ActionJson.java
deleted file mode 100644
index 7aa6e4e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ActionJson.java
+++ /dev/null
@@ -1,227 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.change;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.api.changes.ActionVisitor;
-import com.google.gerrit.extensions.common.ActionInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.RevisionInfo;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.extensions.webui.PrivateInternals_UiActionDescription;
-import com.google.gerrit.extensions.webui.UiAction;
-import com.google.gerrit.reviewdb.client.Change.Status;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.extensions.webui.UiActions;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-@Singleton
-public class ActionJson {
-  private final Revisions revisions;
-  private final ChangeJson.Factory changeJsonFactory;
-  private final ChangeResource.Factory changeResourceFactory;
-  private final UiActions uiActions;
-  private final DynamicMap<RestView<ChangeResource>> changeViews;
-  private final DynamicSet<ActionVisitor> visitorSet;
-  private final Provider<CurrentUser> userProvider;
-
-  @Inject
-  ActionJson(
-      Revisions revisions,
-      ChangeJson.Factory changeJsonFactory,
-      ChangeResource.Factory changeResourceFactory,
-      UiActions uiActions,
-      DynamicMap<RestView<ChangeResource>> changeViews,
-      DynamicSet<ActionVisitor> visitorSet,
-      Provider<CurrentUser> userProvider) {
-    this.revisions = revisions;
-    this.changeJsonFactory = changeJsonFactory;
-    this.changeResourceFactory = changeResourceFactory;
-    this.uiActions = uiActions;
-    this.changeViews = changeViews;
-    this.visitorSet = visitorSet;
-    this.userProvider = userProvider;
-  }
-
-  public Map<String, ActionInfo> format(RevisionResource rsrc) throws OrmException {
-    ChangeInfo changeInfo = null;
-    RevisionInfo revisionInfo = null;
-    List<ActionVisitor> visitors = visitors();
-    if (!visitors.isEmpty()) {
-      changeInfo = changeJson().format(rsrc);
-      revisionInfo = checkNotNull(Iterables.getOnlyElement(changeInfo.revisions.values()));
-      changeInfo.revisions = null;
-    }
-    return toActionMap(rsrc, visitors, changeInfo, revisionInfo);
-  }
-
-  private ChangeJson changeJson() {
-    return changeJsonFactory.noOptions();
-  }
-
-  private ArrayList<ActionVisitor> visitors() {
-    return Lists.newArrayList(visitorSet);
-  }
-
-  public ChangeInfo addChangeActions(ChangeInfo to, ChangeNotes notes) {
-    List<ActionVisitor> visitors = visitors();
-    to.actions = toActionMap(notes, visitors, copy(visitors, to));
-    return to;
-  }
-
-  public RevisionInfo addRevisionActions(
-      @Nullable ChangeInfo changeInfo, RevisionInfo to, RevisionResource rsrc) throws OrmException {
-    List<ActionVisitor> visitors = visitors();
-    if (!visitors.isEmpty()) {
-      if (changeInfo != null) {
-        changeInfo = copy(visitors, changeInfo);
-      } else {
-        changeInfo = changeJson().format(rsrc);
-      }
-    }
-    to.actions = toActionMap(rsrc, visitors, changeInfo, copy(visitors, to));
-    return to;
-  }
-
-  private ChangeInfo copy(List<ActionVisitor> visitors, ChangeInfo changeInfo) {
-    if (visitors.isEmpty()) {
-      return null;
-    }
-    // Include all fields from ChangeJson#toChangeInfo that are not protected by any
-    // ListChangesOptions.
-    ChangeInfo copy = new ChangeInfo();
-    copy.project = changeInfo.project;
-    copy.branch = changeInfo.branch;
-    copy.topic = changeInfo.topic;
-    copy.assignee = changeInfo.assignee;
-    copy.hashtags = changeInfo.hashtags;
-    copy.changeId = changeInfo.changeId;
-    copy.submitType = changeInfo.submitType;
-    copy.mergeable = changeInfo.mergeable;
-    copy.insertions = changeInfo.insertions;
-    copy.deletions = changeInfo.deletions;
-    copy.hasReviewStarted = changeInfo.hasReviewStarted;
-    copy.isPrivate = changeInfo.isPrivate;
-    copy.subject = changeInfo.subject;
-    copy.status = changeInfo.status;
-    copy.owner = changeInfo.owner;
-    copy.created = changeInfo.created;
-    copy.updated = changeInfo.updated;
-    copy._number = changeInfo._number;
-    copy.revertOf = changeInfo.revertOf;
-    copy.starred = changeInfo.starred;
-    copy.stars = changeInfo.stars;
-    copy.submitted = changeInfo.submitted;
-    copy.submitter = changeInfo.submitter;
-    copy.unresolvedCommentCount = changeInfo.unresolvedCommentCount;
-    copy.workInProgress = changeInfo.workInProgress;
-    copy.id = changeInfo.id;
-    return copy;
-  }
-
-  private RevisionInfo copy(List<ActionVisitor> visitors, RevisionInfo revisionInfo) {
-    if (visitors.isEmpty()) {
-      return null;
-    }
-    // Include all fields from ChangeJson#toRevisionInfo that are not protected by any
-    // ListChangesOptions.
-    RevisionInfo copy = new RevisionInfo();
-    copy.isCurrent = revisionInfo.isCurrent;
-    copy._number = revisionInfo._number;
-    copy.ref = revisionInfo.ref;
-    copy.created = revisionInfo.created;
-    copy.uploader = revisionInfo.uploader;
-    copy.fetch = revisionInfo.fetch;
-    copy.kind = revisionInfo.kind;
-    copy.description = revisionInfo.description;
-    return copy;
-  }
-
-  private Map<String, ActionInfo> toActionMap(
-      ChangeNotes notes, List<ActionVisitor> visitors, ChangeInfo changeInfo) {
-    CurrentUser user = userProvider.get();
-    Map<String, ActionInfo> out = new LinkedHashMap<>();
-    if (!user.isIdentifiedUser()) {
-      return out;
-    }
-
-    Iterable<UiAction.Description> descs =
-        uiActions.from(changeViews, changeResourceFactory.create(notes, user));
-
-    // The followup action is a client-side only operation that does not
-    // have a server side handler. It must be manually registered into the
-    // resulting action map.
-    Status status = notes.getChange().getStatus();
-    if (status.isOpen() || status.equals(Status.MERGED)) {
-      UiAction.Description descr = new UiAction.Description();
-      PrivateInternals_UiActionDescription.setId(descr, "followup");
-      PrivateInternals_UiActionDescription.setMethod(descr, "POST");
-      descr.setTitle("Create follow-up change");
-      descr.setLabel("Follow-Up");
-      descs = Iterables.concat(descs, Collections.singleton(descr));
-    }
-
-    ACTION:
-    for (UiAction.Description d : descs) {
-      ActionInfo actionInfo = new ActionInfo(d);
-      for (ActionVisitor visitor : visitors) {
-        if (!visitor.visit(d.getId(), actionInfo, changeInfo)) {
-          continue ACTION;
-        }
-      }
-      out.put(d.getId(), actionInfo);
-    }
-    return out;
-  }
-
-  private Map<String, ActionInfo> toActionMap(
-      RevisionResource rsrc,
-      List<ActionVisitor> visitors,
-      ChangeInfo changeInfo,
-      RevisionInfo revisionInfo) {
-    if (!rsrc.getUser().isIdentifiedUser()) {
-      return ImmutableMap.of();
-    }
-
-    Map<String, ActionInfo> out = new LinkedHashMap<>();
-    ACTION:
-    for (UiAction.Description d : uiActions.from(revisions, rsrc)) {
-      ActionInfo actionInfo = new ActionInfo(d);
-      for (ActionVisitor visitor : visitors) {
-        if (!visitor.visit(d.getId(), actionInfo, changeInfo, revisionInfo)) {
-          continue ACTION;
-        }
-      }
-      out.put(d.getId(), actionInfo);
-    }
-    return out;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/AllowedFormats.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/AllowedFormats.java
deleted file mode 100644
index 20e586f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/AllowedFormats.java
+++ /dev/null
@@ -1,58 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.change;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Sets;
-import com.google.gerrit.server.config.DownloadConfig;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-@Singleton
-public class AllowedFormats {
-  final ImmutableMap<String, ArchiveFormat> extensions;
-  final ImmutableSet<ArchiveFormat> allowed;
-
-  @Inject
-  AllowedFormats(DownloadConfig cfg) {
-    Map<String, ArchiveFormat> exts = new HashMap<>();
-    for (ArchiveFormat format : cfg.getArchiveFormats()) {
-      for (String ext : format.getSuffixes()) {
-        exts.put(ext, format);
-      }
-      exts.put(format.name().toLowerCase(), format);
-    }
-    extensions = ImmutableMap.copyOf(exts);
-
-    // Zip is not supported because it may be interpreted by a Java plugin as a
-    // valid JAR file, whose code would have access to cookies on the domain.
-    allowed =
-        Sets.immutableEnumSet(
-            Iterables.filter(cfg.getArchiveFormats(), f -> f != ArchiveFormat.ZIP));
-  }
-
-  public Set<ArchiveFormat> getAllowed() {
-    return allowed;
-  }
-
-  public ImmutableMap<String, ArchiveFormat> getExtensions() {
-    return extensions;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ApplyFix.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ApplyFix.java
deleted file mode 100644
index fa26eec..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ApplyFix.java
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.common.EditInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.edit.ChangeEdit;
-import com.google.gerrit.server.edit.ChangeEditJson;
-import com.google.gerrit.server.edit.ChangeEditModifier;
-import com.google.gerrit.server.edit.tree.TreeModification;
-import com.google.gerrit.server.fixes.FixReplacementInterpreter;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.InvalidChangeOperationException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.List;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-
-@Singleton
-public class ApplyFix implements RestModifyView<FixResource, Void> {
-
-  private final GitRepositoryManager gitRepositoryManager;
-  private final FixReplacementInterpreter fixReplacementInterpreter;
-  private final ChangeEditModifier changeEditModifier;
-  private final ChangeEditJson changeEditJson;
-  private final ProjectCache projectCache;
-
-  @Inject
-  public ApplyFix(
-      GitRepositoryManager gitRepositoryManager,
-      FixReplacementInterpreter fixReplacementInterpreter,
-      ChangeEditModifier changeEditModifier,
-      ChangeEditJson changeEditJson,
-      ProjectCache projectCache) {
-    this.gitRepositoryManager = gitRepositoryManager;
-    this.fixReplacementInterpreter = fixReplacementInterpreter;
-    this.changeEditModifier = changeEditModifier;
-    this.changeEditJson = changeEditJson;
-    this.projectCache = projectCache;
-  }
-
-  @Override
-  public Response<EditInfo> apply(FixResource fixResource, Void nothing)
-      throws AuthException, OrmException, ResourceConflictException, IOException,
-          ResourceNotFoundException, PermissionBackendException {
-    RevisionResource revisionResource = fixResource.getRevisionResource();
-    Project.NameKey project = revisionResource.getProject();
-    ProjectState projectState = projectCache.checkedGet(project);
-    PatchSet patchSet = revisionResource.getPatchSet();
-    ObjectId patchSetCommitId = ObjectId.fromString(patchSet.getRevision().get());
-
-    try (Repository repository = gitRepositoryManager.openRepository(project)) {
-      List<TreeModification> treeModifications =
-          fixReplacementInterpreter.toTreeModifications(
-              repository, projectState, patchSetCommitId, fixResource.getFixReplacements());
-      ChangeEdit changeEdit =
-          changeEditModifier.combineWithModifiedPatchSetTree(
-              repository, revisionResource.getNotes(), patchSet, treeModifications);
-      return Response.ok(changeEditJson.toEditInfo(changeEdit, false));
-    } catch (InvalidChangeOperationException e) {
-      throw new ResourceConflictException(e.getMessage());
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ArchiveFormat.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ArchiveFormat.java
deleted file mode 100644
index 3fefcd4..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ArchiveFormat.java
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2013 Google Inc. All Rights Reserved.
-//
-// 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.google.gerrit.server.change;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.io.OutputStream;
-import org.apache.commons.compress.archivers.ArchiveOutputStream;
-import org.eclipse.jgit.api.ArchiveCommand;
-import org.eclipse.jgit.api.ArchiveCommand.Format;
-import org.eclipse.jgit.archive.TarFormat;
-import org.eclipse.jgit.archive.Tbz2Format;
-import org.eclipse.jgit.archive.TgzFormat;
-import org.eclipse.jgit.archive.TxzFormat;
-import org.eclipse.jgit.archive.ZipFormat;
-import org.eclipse.jgit.lib.FileMode;
-import org.eclipse.jgit.lib.ObjectLoader;
-
-public enum ArchiveFormat {
-  TGZ("application/x-gzip", new TgzFormat()),
-  TAR("application/x-tar", new TarFormat()),
-  TBZ2("application/x-bzip2", new Tbz2Format()),
-  TXZ("application/x-xz", new TxzFormat()),
-  ZIP("application/x-zip", new ZipFormat());
-
-  private final ArchiveCommand.Format<?> format;
-  private final String mimeType;
-
-  ArchiveFormat(String mimeType, ArchiveCommand.Format<?> format) {
-    this.format = format;
-    this.mimeType = mimeType;
-    ArchiveCommand.registerFormat(name(), format);
-  }
-
-  public String getShortName() {
-    return name().toLowerCase();
-  }
-
-  String getMimeType() {
-    return mimeType;
-  }
-
-  String getDefaultSuffix() {
-    return getSuffixes().iterator().next();
-  }
-
-  Iterable<String> getSuffixes() {
-    return format.suffixes();
-  }
-
-  public ArchiveOutputStream createArchiveOutputStream(OutputStream o) throws IOException {
-    return (ArchiveOutputStream) this.format.createArchiveOutputStream(o);
-  }
-
-  public <T extends Closeable> void putEntry(T out, String path, byte[] data) throws IOException {
-    @SuppressWarnings("unchecked")
-    ArchiveCommand.Format<T> fmt = (Format<T>) format;
-    fmt.putEntry(
-        out,
-        null,
-        path,
-        FileMode.REGULAR_FILE,
-        new ObjectLoader.SmallObject(FileMode.TYPE_FILE, data));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeCleanupRunner.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeCleanupRunner.java
deleted file mode 100644
index 23c5b22..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeCleanupRunner.java
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.change;
-
-import static com.google.gerrit.server.config.ScheduleConfig.MISSING_CONFIG;
-
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.lifecycle.LifecycleModule;
-import com.google.gerrit.server.config.ChangeCleanupConfig;
-import com.google.gerrit.server.config.ScheduleConfig;
-import com.google.gerrit.server.git.WorkQueue;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gerrit.server.util.ManualRequestContext;
-import com.google.gerrit.server.util.OneOffRequestContext;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Runnable to enable scheduling change cleanups to run periodically */
-public class ChangeCleanupRunner implements Runnable {
-  private static final Logger log = LoggerFactory.getLogger(ChangeCleanupRunner.class);
-
-  public static class Module extends LifecycleModule {
-    @Override
-    protected void configure() {
-      listener().to(Lifecycle.class);
-    }
-  }
-
-  static class Lifecycle implements LifecycleListener {
-    private final WorkQueue queue;
-    private final ChangeCleanupRunner runner;
-    private final ChangeCleanupConfig cfg;
-
-    @Inject
-    Lifecycle(WorkQueue queue, ChangeCleanupRunner runner, ChangeCleanupConfig cfg) {
-      this.queue = queue;
-      this.runner = runner;
-      this.cfg = cfg;
-    }
-
-    @Override
-    public void start() {
-      ScheduleConfig scheduleConfig = cfg.getScheduleConfig();
-      long interval = scheduleConfig.getInterval();
-      long delay = scheduleConfig.getInitialDelay();
-      if (delay == MISSING_CONFIG && interval == MISSING_CONFIG) {
-        log.info("Ignoring missing changeCleanup schedule configuration");
-      } else if (delay < 0 || interval <= 0) {
-        log.warn("Ignoring invalid changeCleanup schedule configuration: {}", scheduleConfig);
-      } else {
-        @SuppressWarnings("unused")
-        Future<?> possiblyIgnoredError =
-            queue
-                .getDefaultQueue()
-                .scheduleAtFixedRate(runner, delay, interval, TimeUnit.MILLISECONDS);
-      }
-    }
-
-    @Override
-    public void stop() {
-      // handled by WorkQueue.stop() already
-    }
-  }
-
-  private final OneOffRequestContext oneOffRequestContext;
-  private final AbandonUtil abandonUtil;
-  private final RetryHelper retryHelper;
-
-  @Inject
-  ChangeCleanupRunner(
-      OneOffRequestContext oneOffRequestContext, AbandonUtil abandonUtil, RetryHelper retryHelper) {
-    this.oneOffRequestContext = oneOffRequestContext;
-    this.abandonUtil = abandonUtil;
-    this.retryHelper = retryHelper;
-  }
-
-  @Override
-  public void run() {
-    log.info("Running change cleanups.");
-    try (ManualRequestContext ctx = oneOffRequestContext.open()) {
-      // abandonInactiveOpenChanges skips failures instead of throwing, so retrying will never
-      // actually happen. For the purposes of this class that is fine: they'll get tried again the
-      // next time the scheduled task is run.
-      retryHelper.execute(
-          updateFactory -> {
-            abandonUtil.abandonInactiveOpenChanges(updateFactory);
-            return null;
-          });
-    } catch (RestApiException | UpdateException | OrmException e) {
-      log.error("Failed to cleanup changes.", e);
-    }
-  }
-
-  @Override
-  public String toString() {
-    return "change cleanup runner";
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeEditResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeEditResource.java
deleted file mode 100644
index 08bcabe..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeEditResource.java
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.restapi.RestResource;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.server.edit.ChangeEdit;
-import com.google.inject.TypeLiteral;
-
-/**
- * Represents change edit resource, that is actualy two kinds of resources:
- *
- * <ul>
- *   <li>the change edit itself
- *   <li>a path within the edit
- * </ul>
- *
- * distinguished by whether path is null or not.
- */
-public class ChangeEditResource implements RestResource {
-  public static final TypeLiteral<RestView<ChangeEditResource>> CHANGE_EDIT_KIND =
-      new TypeLiteral<RestView<ChangeEditResource>>() {};
-
-  private final ChangeResource change;
-  private final ChangeEdit edit;
-  private final String path;
-
-  public ChangeEditResource(ChangeResource change, ChangeEdit edit, String path) {
-    this.change = change;
-    this.edit = edit;
-    this.path = path;
-  }
-
-  // TODO(davido): Make this cacheable.
-  // Should just depend on the SHA-1 of the edit itself.
-  public boolean isCacheable() {
-    return false;
-  }
-
-  public ChangeResource getChangeResource() {
-    return change;
-  }
-
-  public ChangeEdit getChangeEdit() {
-    return edit;
-  }
-
-  public String getPath() {
-    return path;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeEdits.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeEdits.java
deleted file mode 100644
index 34c7534..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeEdits.java
+++ /dev/null
@@ -1,530 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.change;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.extensions.common.DiffWebLinkInfo;
-import com.google.gerrit.extensions.common.EditInfo;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AcceptsCreate;
-import com.google.gerrit.extensions.restapi.AcceptsDelete;
-import com.google.gerrit.extensions.restapi.AcceptsPost;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.BinaryResult;
-import com.google.gerrit.extensions.restapi.ChildCollection;
-import com.google.gerrit.extensions.restapi.DefaultInput;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.RawInput;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.WebLinks;
-import com.google.gerrit.server.edit.ChangeEdit;
-import com.google.gerrit.server.edit.ChangeEditJson;
-import com.google.gerrit.server.edit.ChangeEditModifier;
-import com.google.gerrit.server.edit.ChangeEditUtil;
-import com.google.gerrit.server.edit.UnchangedCommitMessageException;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.patch.PatchListNotAvailableException;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.InvalidChangeOperationException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.util.List;
-import java.util.Optional;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.kohsuke.args4j.Option;
-
-@Singleton
-public class ChangeEdits
-    implements ChildCollection<ChangeResource, ChangeEditResource>,
-        AcceptsCreate<ChangeResource>,
-        AcceptsPost<ChangeResource>,
-        AcceptsDelete<ChangeResource> {
-  private final DynamicMap<RestView<ChangeEditResource>> views;
-  private final Create.Factory createFactory;
-  private final DeleteFile.Factory deleteFileFactory;
-  private final Provider<Detail> detail;
-  private final ChangeEditUtil editUtil;
-  private final Post post;
-
-  @Inject
-  ChangeEdits(
-      DynamicMap<RestView<ChangeEditResource>> views,
-      Create.Factory createFactory,
-      Provider<Detail> detail,
-      ChangeEditUtil editUtil,
-      Post post,
-      DeleteFile.Factory deleteFileFactory) {
-    this.views = views;
-    this.createFactory = createFactory;
-    this.detail = detail;
-    this.editUtil = editUtil;
-    this.post = post;
-    this.deleteFileFactory = deleteFileFactory;
-  }
-
-  @Override
-  public DynamicMap<RestView<ChangeEditResource>> views() {
-    return views;
-  }
-
-  @Override
-  public RestView<ChangeResource> list() {
-    return detail.get();
-  }
-
-  @Override
-  public ChangeEditResource parse(ChangeResource rsrc, IdString id)
-      throws ResourceNotFoundException, AuthException, IOException, OrmException {
-    Optional<ChangeEdit> edit = editUtil.byChange(rsrc.getNotes(), rsrc.getUser());
-    if (!edit.isPresent()) {
-      throw new ResourceNotFoundException(id);
-    }
-    return new ChangeEditResource(rsrc, edit.get(), id.get());
-  }
-
-  @Override
-  public Create create(ChangeResource parent, IdString id) throws RestApiException {
-    return createFactory.create(id.get());
-  }
-
-  @Override
-  public Post post(ChangeResource parent) throws RestApiException {
-    return post;
-  }
-
-  /**
-   * Create handler that is activated when collection element is accessed but doesn't exist, e. g.
-   * PUT request with a path was called but change edit wasn't created yet. Change edit is created
-   * and PUT handler is called.
-   */
-  @Override
-  public DeleteFile delete(ChangeResource parent, IdString id) throws RestApiException {
-    // It's safe to assume that id can never be null, because
-    // otherwise we would end up in dedicated endpoint for
-    // deleting of change edits and not a file in change edit
-    return deleteFileFactory.create(id.get());
-  }
-
-  public static class Create implements RestModifyView<ChangeResource, Put.Input> {
-
-    interface Factory {
-      Create create(String path);
-    }
-
-    private final Put putEdit;
-    private final String path;
-
-    @Inject
-    Create(Put putEdit, @Assisted String path) {
-      this.putEdit = putEdit;
-      this.path = path;
-    }
-
-    @Override
-    public Response<?> apply(ChangeResource resource, Put.Input input)
-        throws AuthException, ResourceConflictException, IOException, OrmException,
-            PermissionBackendException {
-      putEdit.apply(resource, path, input.content);
-      return Response.none();
-    }
-  }
-
-  public static class DeleteFile implements RestModifyView<ChangeResource, DeleteFile.Input> {
-    public static class Input {}
-
-    interface Factory {
-      DeleteFile create(String path);
-    }
-
-    private final DeleteContent deleteContent;
-    private final String path;
-
-    @Inject
-    DeleteFile(DeleteContent deleteContent, @Assisted String path) {
-      this.deleteContent = deleteContent;
-      this.path = path;
-    }
-
-    @Override
-    public Response<?> apply(ChangeResource rsrc, DeleteFile.Input in)
-        throws IOException, AuthException, ResourceConflictException, OrmException,
-            PermissionBackendException {
-      return deleteContent.apply(rsrc, path);
-    }
-  }
-
-  // TODO(davido): Turn the boolean options to ChangeEditOption enum,
-  // like it's already the case for ListChangesOption/ListGroupsOption
-  public static class Detail implements RestReadView<ChangeResource> {
-    private final ChangeEditUtil editUtil;
-    private final ChangeEditJson editJson;
-    private final FileInfoJson fileInfoJson;
-    private final Revisions revisions;
-
-    private String base;
-    private boolean list;
-    private boolean downloadCommands;
-
-    @Option(name = "--base", metaVar = "revision-id")
-    public void setBase(String base) {
-      this.base = base;
-    }
-
-    @Option(name = "--list")
-    public void setList(boolean list) {
-      this.list = list;
-    }
-
-    @Option(name = "--download-commands")
-    public void setDownloadCommands(boolean downloadCommands) {
-      this.downloadCommands = downloadCommands;
-    }
-
-    @Inject
-    Detail(
-        ChangeEditUtil editUtil,
-        ChangeEditJson editJson,
-        FileInfoJson fileInfoJson,
-        Revisions revisions) {
-      this.editJson = editJson;
-      this.editUtil = editUtil;
-      this.fileInfoJson = fileInfoJson;
-      this.revisions = revisions;
-    }
-
-    @Override
-    public Response<EditInfo> apply(ChangeResource rsrc)
-        throws AuthException, IOException, ResourceNotFoundException, OrmException,
-            PermissionBackendException {
-      Optional<ChangeEdit> edit = editUtil.byChange(rsrc.getNotes(), rsrc.getUser());
-      if (!edit.isPresent()) {
-        return Response.none();
-      }
-
-      EditInfo editInfo = editJson.toEditInfo(edit.get(), downloadCommands);
-      if (list) {
-        PatchSet basePatchSet = null;
-        if (base != null) {
-          RevisionResource baseResource = revisions.parse(rsrc, IdString.fromDecoded(base));
-          basePatchSet = baseResource.getPatchSet();
-        }
-        try {
-          editInfo.files =
-              fileInfoJson.toFileInfoMap(
-                  rsrc.getChange(), edit.get().getEditCommit(), basePatchSet);
-        } catch (PatchListNotAvailableException e) {
-          throw new ResourceNotFoundException(e.getMessage());
-        }
-      }
-      return Response.ok(editInfo);
-    }
-  }
-
-  /**
-   * Post to edit collection resource. Two different operations are supported:
-   *
-   * <ul>
-   *   <li>Create non existing change edit
-   *   <li>Restore path in existing change edit
-   * </ul>
-   *
-   * The combination of two operations in one request is supported.
-   */
-  @Singleton
-  public static class Post implements RestModifyView<ChangeResource, Post.Input> {
-    public static class Input {
-      public String restorePath;
-      public String oldPath;
-      public String newPath;
-    }
-
-    private final ChangeEditModifier editModifier;
-    private final GitRepositoryManager repositoryManager;
-
-    @Inject
-    Post(ChangeEditModifier editModifier, GitRepositoryManager repositoryManager) {
-      this.editModifier = editModifier;
-      this.repositoryManager = repositoryManager;
-    }
-
-    @Override
-    public Response<?> apply(ChangeResource resource, Post.Input input)
-        throws AuthException, IOException, ResourceConflictException, OrmException,
-            PermissionBackendException {
-      Project.NameKey project = resource.getProject();
-      try (Repository repository = repositoryManager.openRepository(project)) {
-        if (isRestoreFile(input)) {
-          editModifier.restoreFile(repository, resource.getNotes(), input.restorePath);
-        } else if (isRenameFile(input)) {
-          editModifier.renameFile(repository, resource.getNotes(), input.oldPath, input.newPath);
-        } else {
-          editModifier.createEdit(repository, resource.getNotes());
-        }
-      } catch (InvalidChangeOperationException e) {
-        throw new ResourceConflictException(e.getMessage());
-      }
-      return Response.none();
-    }
-
-    private static boolean isRestoreFile(Input input) {
-      return input != null && !Strings.isNullOrEmpty(input.restorePath);
-    }
-
-    private static boolean isRenameFile(Input input) {
-      return input != null
-          && !Strings.isNullOrEmpty(input.oldPath)
-          && !Strings.isNullOrEmpty(input.newPath);
-    }
-  }
-
-  /** Put handler that is activated when PUT request is called on collection element. */
-  @Singleton
-  public static class Put implements RestModifyView<ChangeEditResource, Put.Input> {
-    public static class Input {
-      @DefaultInput public RawInput content;
-    }
-
-    private final ChangeEditModifier editModifier;
-    private final GitRepositoryManager repositoryManager;
-
-    @Inject
-    Put(ChangeEditModifier editModifier, GitRepositoryManager repositoryManager) {
-      this.editModifier = editModifier;
-      this.repositoryManager = repositoryManager;
-    }
-
-    @Override
-    public Response<?> apply(ChangeEditResource rsrc, Input input)
-        throws AuthException, ResourceConflictException, IOException, OrmException,
-            PermissionBackendException {
-      return apply(rsrc.getChangeResource(), rsrc.getPath(), input.content);
-    }
-
-    public Response<?> apply(ChangeResource rsrc, String path, RawInput newContent)
-        throws ResourceConflictException, AuthException, IOException, OrmException,
-            PermissionBackendException {
-      if (Strings.isNullOrEmpty(path) || path.charAt(0) == '/') {
-        throw new ResourceConflictException("Invalid path: " + path);
-      }
-
-      try (Repository repository = repositoryManager.openRepository(rsrc.getProject())) {
-        editModifier.modifyFile(repository, rsrc.getNotes(), path, newContent);
-      } catch (InvalidChangeOperationException e) {
-        throw new ResourceConflictException(e.getMessage());
-      }
-      return Response.none();
-    }
-  }
-
-  /**
-   * Handler to delete a file.
-   *
-   * <p>This deletes the file from the repository completely. This is not the same as reverting or
-   * restoring a file to its previous contents.
-   */
-  @Singleton
-  public static class DeleteContent
-      implements RestModifyView<ChangeEditResource, DeleteContent.Input> {
-    public static class Input {}
-
-    private final ChangeEditModifier editModifier;
-    private final GitRepositoryManager repositoryManager;
-
-    @Inject
-    DeleteContent(ChangeEditModifier editModifier, GitRepositoryManager repositoryManager) {
-      this.editModifier = editModifier;
-      this.repositoryManager = repositoryManager;
-    }
-
-    @Override
-    public Response<?> apply(ChangeEditResource rsrc, DeleteContent.Input input)
-        throws AuthException, ResourceConflictException, OrmException, IOException,
-            PermissionBackendException {
-      return apply(rsrc.getChangeResource(), rsrc.getPath());
-    }
-
-    public Response<?> apply(ChangeResource rsrc, String filePath)
-        throws AuthException, IOException, OrmException, ResourceConflictException,
-            PermissionBackendException {
-      try (Repository repository = repositoryManager.openRepository(rsrc.getProject())) {
-        editModifier.deleteFile(repository, rsrc.getNotes(), filePath);
-      } catch (InvalidChangeOperationException e) {
-        throw new ResourceConflictException(e.getMessage());
-      }
-      return Response.none();
-    }
-  }
-
-  public static class Get implements RestReadView<ChangeEditResource> {
-    private final FileContentUtil fileContentUtil;
-    private final ProjectCache projectCache;
-
-    @Option(
-        name = "--base",
-        aliases = {"-b"},
-        usage = "whether to load the content on the base revision instead of the change edit")
-    private boolean base;
-
-    @Inject
-    Get(FileContentUtil fileContentUtil, ProjectCache projectCache) {
-      this.fileContentUtil = fileContentUtil;
-      this.projectCache = projectCache;
-    }
-
-    @Override
-    public Response<BinaryResult> apply(ChangeEditResource rsrc) throws IOException {
-      try {
-        ChangeEdit edit = rsrc.getChangeEdit();
-        return Response.ok(
-            fileContentUtil.getContent(
-                projectCache.checkedGet(rsrc.getChangeResource().getProject()),
-                base
-                    ? ObjectId.fromString(edit.getBasePatchSet().getRevision().get())
-                    : edit.getEditCommit(),
-                rsrc.getPath(),
-                null));
-      } catch (ResourceNotFoundException | BadRequestException e) {
-        return Response.none();
-      }
-    }
-  }
-
-  @Singleton
-  public static class GetMeta implements RestReadView<ChangeEditResource> {
-    private final WebLinks webLinks;
-
-    @Inject
-    GetMeta(WebLinks webLinks) {
-      this.webLinks = webLinks;
-    }
-
-    @Override
-    public FileInfo apply(ChangeEditResource rsrc) {
-      FileInfo r = new FileInfo();
-      ChangeEdit edit = rsrc.getChangeEdit();
-      Change change = edit.getChange();
-      List<DiffWebLinkInfo> links =
-          webLinks.getDiffLinks(
-              change.getProject().get(),
-              change.getChangeId(),
-              edit.getBasePatchSet().getPatchSetId(),
-              edit.getBasePatchSet().getRefName(),
-              rsrc.getPath(),
-              0,
-              edit.getRefName(),
-              rsrc.getPath());
-      r.webLinks = links.isEmpty() ? null : links;
-      return r;
-    }
-
-    public static class FileInfo {
-      public List<DiffWebLinkInfo> webLinks;
-    }
-  }
-
-  @Singleton
-  public static class EditMessage implements RestModifyView<ChangeResource, EditMessage.Input> {
-    public static class Input {
-      @DefaultInput public String message;
-    }
-
-    private final ChangeEditModifier editModifier;
-    private final GitRepositoryManager repositoryManager;
-
-    @Inject
-    EditMessage(ChangeEditModifier editModifier, GitRepositoryManager repositoryManager) {
-      this.editModifier = editModifier;
-      this.repositoryManager = repositoryManager;
-    }
-
-    @Override
-    public Object apply(ChangeResource rsrc, Input input)
-        throws AuthException, IOException, BadRequestException, ResourceConflictException,
-            OrmException, PermissionBackendException {
-      if (input == null || Strings.isNullOrEmpty(input.message)) {
-        throw new BadRequestException("commit message must be provided");
-      }
-
-      Project.NameKey project = rsrc.getProject();
-      try (Repository repository = repositoryManager.openRepository(project)) {
-        editModifier.modifyMessage(repository, rsrc.getNotes(), input.message);
-      } catch (UnchangedCommitMessageException e) {
-        throw new ResourceConflictException(e.getMessage());
-      }
-
-      return Response.none();
-    }
-  }
-
-  public static class GetMessage implements RestReadView<ChangeResource> {
-    private final GitRepositoryManager repoManager;
-    private final ChangeEditUtil editUtil;
-
-    @Option(
-        name = "--base",
-        aliases = {"-b"},
-        usage = "whether to load the message on the base revision instead of the change edit")
-    private boolean base;
-
-    @Inject
-    GetMessage(GitRepositoryManager repoManager, ChangeEditUtil editUtil) {
-      this.repoManager = repoManager;
-      this.editUtil = editUtil;
-    }
-
-    @Override
-    public BinaryResult apply(ChangeResource rsrc)
-        throws AuthException, IOException, ResourceNotFoundException, OrmException {
-      Optional<ChangeEdit> edit = editUtil.byChange(rsrc.getNotes(), rsrc.getUser());
-      String msg;
-      if (edit.isPresent()) {
-        if (base) {
-          try (Repository repo = repoManager.openRepository(rsrc.getProject());
-              RevWalk rw = new RevWalk(repo)) {
-            RevCommit commit =
-                rw.parseCommit(
-                    ObjectId.fromString(edit.get().getBasePatchSet().getRevision().get()));
-            msg = commit.getFullMessage();
-          }
-        } else {
-          msg = edit.get().getEditCommit().getFullMessage();
-        }
-
-        return BinaryResult.create(msg)
-            .setContentType(FileContentUtil.TEXT_X_GERRIT_COMMIT_MESSAGE)
-            .base64();
-      }
-      throw new ResourceNotFoundException();
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeIncludedIn.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeIncludedIn.java
deleted file mode 100644
index 47f5a16..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeIncludedIn.java
+++ /dev/null
@@ -1,48 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.api.changes.IncludedInInfo;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-
-@Singleton
-public class ChangeIncludedIn implements RestReadView<ChangeResource> {
-  private Provider<ReviewDb> db;
-  private PatchSetUtil psUtil;
-  private IncludedIn includedIn;
-
-  @Inject
-  ChangeIncludedIn(Provider<ReviewDb> db, PatchSetUtil psUtil, IncludedIn includedIn) {
-    this.db = db;
-    this.psUtil = psUtil;
-    this.includedIn = includedIn;
-  }
-
-  @Override
-  public IncludedInInfo apply(ChangeResource rsrc)
-      throws RestApiException, OrmException, IOException {
-    PatchSet ps = psUtil.current(db.get(), rsrc.getNotes());
-    return includedIn.apply(rsrc.getProject(), ps.getRevision().get());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeInserter.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeInserter.java
deleted file mode 100644
index 4cae87f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeInserter.java
+++ /dev/null
@@ -1,578 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.change;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.gerrit.reviewdb.client.Change.INITIAL_PATCH_SET_ID;
-import static com.google.gerrit.server.notedb.ReviewerStateInternal.REVIEWER;
-import static java.util.stream.Collectors.toSet;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.collect.ImmutableListMultimap;
-import com.google.common.collect.ListMultimap;
-import com.google.gerrit.common.FooterConstants;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.LabelTypes;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.api.changes.RecipientType;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetInfo;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.events.CommitReceivedEvent;
-import com.google.gerrit.server.extensions.events.CommentAdded;
-import com.google.gerrit.server.extensions.events.RevisionCreated;
-import com.google.gerrit.server.git.GroupCollector;
-import com.google.gerrit.server.git.SendEmailExecutor;
-import com.google.gerrit.server.git.validators.CommitValidationException;
-import com.google.gerrit.server.git.validators.CommitValidators;
-import com.google.gerrit.server.mail.send.CreateChangeSender;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.ChangeUpdate;
-import com.google.gerrit.server.notedb.NotesMigration;
-import com.google.gerrit.server.patch.PatchSetInfoFactory;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.ssh.NoSshInfo;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.Context;
-import com.google.gerrit.server.update.InsertChangeOp;
-import com.google.gerrit.server.update.RepoContext;
-import com.google.gerrit.server.util.RequestScopePropagator;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Future;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.ReceiveCommand;
-import org.eclipse.jgit.util.ChangeIdUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ChangeInserter implements InsertChangeOp {
-  public interface Factory {
-    ChangeInserter create(Change.Id cid, ObjectId commitId, String refName);
-  }
-
-  private static final Logger log = LoggerFactory.getLogger(ChangeInserter.class);
-
-  private final PermissionBackend permissionBackend;
-  private final ProjectCache projectCache;
-  private final IdentifiedUser.GenericFactory userFactory;
-  private final PatchSetInfoFactory patchSetInfoFactory;
-  private final PatchSetUtil psUtil;
-  private final ApprovalsUtil approvalsUtil;
-  private final ChangeMessagesUtil cmUtil;
-  private final CreateChangeSender.Factory createChangeSenderFactory;
-  private final ExecutorService sendEmailExecutor;
-  private final CommitValidators.Factory commitValidatorsFactory;
-  private final RevisionCreated revisionCreated;
-  private final CommentAdded commentAdded;
-  private final NotesMigration migration;
-
-  private final Change.Id changeId;
-  private final PatchSet.Id psId;
-  private final ObjectId commitId;
-  private final String refName;
-
-  // Fields exposed as setters.
-  private Change.Status status;
-  private String topic;
-  private String message;
-  private String patchSetDescription;
-  private boolean isPrivate;
-  private boolean workInProgress;
-  private List<String> groups = Collections.emptyList();
-  private boolean validate = true;
-  private NotifyHandling notify = NotifyHandling.ALL;
-  private ListMultimap<RecipientType, Account.Id> accountsToNotify = ImmutableListMultimap.of();
-  private Set<Account.Id> reviewers;
-  private Set<Account.Id> extraCC;
-  private Map<String, Short> approvals;
-  private RequestScopePropagator requestScopePropagator;
-  private boolean fireRevisionCreated;
-  private boolean sendMail;
-  private boolean updateRef;
-  private Change.Id revertOf;
-
-  // Fields set during the insertion process.
-  private ReceiveCommand cmd;
-  private Change change;
-  private ChangeMessage changeMessage;
-  private PatchSetInfo patchSetInfo;
-  private PatchSet patchSet;
-  private String pushCert;
-  private ProjectState projectState;
-
-  @Inject
-  ChangeInserter(
-      PermissionBackend permissionBackend,
-      ProjectCache projectCache,
-      IdentifiedUser.GenericFactory userFactory,
-      PatchSetInfoFactory patchSetInfoFactory,
-      PatchSetUtil psUtil,
-      ApprovalsUtil approvalsUtil,
-      ChangeMessagesUtil cmUtil,
-      CreateChangeSender.Factory createChangeSenderFactory,
-      @SendEmailExecutor ExecutorService sendEmailExecutor,
-      CommitValidators.Factory commitValidatorsFactory,
-      CommentAdded commentAdded,
-      RevisionCreated revisionCreated,
-      NotesMigration migration,
-      @Assisted Change.Id changeId,
-      @Assisted ObjectId commitId,
-      @Assisted String refName) {
-    this.permissionBackend = permissionBackend;
-    this.projectCache = projectCache;
-    this.userFactory = userFactory;
-    this.patchSetInfoFactory = patchSetInfoFactory;
-    this.psUtil = psUtil;
-    this.approvalsUtil = approvalsUtil;
-    this.cmUtil = cmUtil;
-    this.createChangeSenderFactory = createChangeSenderFactory;
-    this.sendEmailExecutor = sendEmailExecutor;
-    this.commitValidatorsFactory = commitValidatorsFactory;
-    this.revisionCreated = revisionCreated;
-    this.commentAdded = commentAdded;
-    this.migration = migration;
-
-    this.changeId = changeId;
-    this.psId = new PatchSet.Id(changeId, INITIAL_PATCH_SET_ID);
-    this.commitId = commitId.copy();
-    this.refName = refName;
-    this.reviewers = Collections.emptySet();
-    this.extraCC = Collections.emptySet();
-    this.approvals = Collections.emptyMap();
-    this.fireRevisionCreated = true;
-    this.sendMail = true;
-    this.updateRef = true;
-  }
-
-  @Override
-  public Change createChange(Context ctx) throws IOException {
-    change =
-        new Change(
-            getChangeKey(ctx.getRevWalk(), commitId),
-            changeId,
-            ctx.getAccountId(),
-            new Branch.NameKey(ctx.getProject(), refName),
-            ctx.getWhen());
-    change.setStatus(MoreObjects.firstNonNull(status, Change.Status.NEW));
-    change.setTopic(topic);
-    change.setPrivate(isPrivate);
-    change.setWorkInProgress(workInProgress);
-    change.setReviewStarted(!workInProgress);
-    change.setRevertOf(revertOf);
-    return change;
-  }
-
-  private static Change.Key getChangeKey(RevWalk rw, ObjectId id) throws IOException {
-    RevCommit commit = rw.parseCommit(id);
-    rw.parseBody(commit);
-    List<String> idList = commit.getFooterLines(FooterConstants.CHANGE_ID);
-    if (!idList.isEmpty()) {
-      return new Change.Key(idList.get(idList.size() - 1).trim());
-    }
-    ObjectId changeId =
-        ChangeIdUtil.computeChangeId(
-            commit.getTree(),
-            commit,
-            commit.getAuthorIdent(),
-            commit.getCommitterIdent(),
-            commit.getShortMessage());
-    StringBuilder changeIdStr = new StringBuilder();
-    changeIdStr.append("I").append(ObjectId.toString(changeId));
-    return new Change.Key(changeIdStr.toString());
-  }
-
-  public PatchSet.Id getPatchSetId() {
-    return psId;
-  }
-
-  public ObjectId getCommitId() {
-    return commitId;
-  }
-
-  public Change getChange() {
-    checkState(change != null, "getChange() only valid after creating change");
-    return change;
-  }
-
-  public ChangeInserter setTopic(String topic) {
-    checkState(change == null, "setTopic(String) only valid before creating change");
-    this.topic = topic;
-    return this;
-  }
-
-  public ChangeInserter setMessage(String message) {
-    this.message = message;
-    return this;
-  }
-
-  public ChangeInserter setPatchSetDescription(String patchSetDescription) {
-    this.patchSetDescription = patchSetDescription;
-    return this;
-  }
-
-  public ChangeInserter setValidate(boolean validate) {
-    this.validate = validate;
-    return this;
-  }
-
-  public ChangeInserter setNotify(NotifyHandling notify) {
-    this.notify = notify;
-    return this;
-  }
-
-  public ChangeInserter setAccountsToNotify(
-      ListMultimap<RecipientType, Account.Id> accountsToNotify) {
-    this.accountsToNotify = checkNotNull(accountsToNotify);
-    return this;
-  }
-
-  public ChangeInserter setReviewers(Set<Account.Id> reviewers) {
-    this.reviewers = reviewers;
-    return this;
-  }
-
-  public ChangeInserter setExtraCC(Set<Account.Id> extraCC) {
-    this.extraCC = extraCC;
-    return this;
-  }
-
-  public ChangeInserter setPrivate(boolean isPrivate) {
-    checkState(change == null, "setPrivate(boolean) only valid before creating change");
-    this.isPrivate = isPrivate;
-    return this;
-  }
-
-  public ChangeInserter setWorkInProgress(boolean workInProgress) {
-    this.workInProgress = workInProgress;
-    return this;
-  }
-
-  public ChangeInserter setStatus(Change.Status status) {
-    checkState(change == null, "setStatus(Change.Status) only valid before creating change");
-    this.status = status;
-    return this;
-  }
-
-  public ChangeInserter setGroups(List<String> groups) {
-    checkNotNull(groups, "groups may not be empty");
-    checkState(patchSet == null, "setGroups(Iterable<String>) only valid before creating change");
-    this.groups = groups;
-    return this;
-  }
-
-  public ChangeInserter setFireRevisionCreated(boolean fireRevisionCreated) {
-    this.fireRevisionCreated = fireRevisionCreated;
-    return this;
-  }
-
-  public ChangeInserter setSendMail(boolean sendMail) {
-    this.sendMail = sendMail;
-    return this;
-  }
-
-  public ChangeInserter setRequestScopePropagator(RequestScopePropagator r) {
-    this.requestScopePropagator = r;
-    return this;
-  }
-
-  public ChangeInserter setRevertOf(Change.Id revertOf) {
-    this.revertOf = revertOf;
-    return this;
-  }
-
-  public void setPushCertificate(String cert) {
-    pushCert = cert;
-  }
-
-  public PatchSet getPatchSet() {
-    checkState(patchSet != null, "getPatchSet() only valid after creating change");
-    return patchSet;
-  }
-
-  public ChangeInserter setApprovals(Map<String, Short> approvals) {
-    this.approvals = approvals;
-    return this;
-  }
-
-  /**
-   * Set whether to include the new patch set ref update in this update.
-   *
-   * <p>If false, the caller is responsible for creating the patch set ref <strong>before</strong>
-   * executing the containing {@code BatchUpdate}.
-   *
-   * <p>Should not be used in new code, as it doesn't result in a single atomic batch ref update for
-   * code and NoteDb meta refs.
-   *
-   * @param updateRef whether to update the ref during {@code updateRepo}.
-   */
-  @Deprecated
-  public ChangeInserter setUpdateRef(boolean updateRef) {
-    this.updateRef = updateRef;
-    return this;
-  }
-
-  public ChangeMessage getChangeMessage() {
-    if (message == null) {
-      return null;
-    }
-    checkState(changeMessage != null, "getChangeMessage() only valid after inserting change");
-    return changeMessage;
-  }
-
-  public ReceiveCommand getCommand() {
-    return cmd;
-  }
-
-  @Override
-  public void updateRepo(RepoContext ctx) throws ResourceConflictException, IOException {
-    cmd = new ReceiveCommand(ObjectId.zeroId(), commitId, psId.toRefName());
-    projectState = projectCache.checkedGet(ctx.getProject());
-    validate(ctx);
-    if (!updateRef) {
-      return;
-    }
-    ctx.addRefUpdate(cmd);
-  }
-
-  @Override
-  public boolean updateChange(ChangeContext ctx)
-      throws RestApiException, OrmException, IOException, PermissionBackendException {
-    change = ctx.getChange(); // Use defensive copy created by ChangeControl.
-    ReviewDb db = ctx.getDb();
-    patchSetInfo =
-        patchSetInfoFactory.get(ctx.getRevWalk(), ctx.getRevWalk().parseCommit(commitId), psId);
-    ctx.getChange().setCurrentPatchSet(patchSetInfo);
-
-    ChangeUpdate update = ctx.getUpdate(psId);
-    update.setChangeId(change.getKey().get());
-    update.setSubjectForCommit("Create change");
-    update.setBranch(change.getDest().get());
-    update.setTopic(change.getTopic());
-    update.setPsDescription(patchSetDescription);
-    update.setPrivate(isPrivate);
-    update.setWorkInProgress(workInProgress);
-    if (revertOf != null) {
-      update.setRevertOf(revertOf.get());
-    }
-
-    List<String> newGroups = groups;
-    if (newGroups.isEmpty()) {
-      newGroups = GroupCollector.getDefaultGroups(commitId);
-    }
-    patchSet =
-        psUtil.insert(
-            ctx.getDb(),
-            ctx.getRevWalk(),
-            update,
-            psId,
-            commitId,
-            newGroups,
-            pushCert,
-            patchSetDescription);
-
-    /* TODO: fixStatus is used here because the tests
-     * (byStatusClosed() in AbstractQueryChangesTest)
-     * insert changes that are already merged,
-     * and setStatus may not be used to set the Status to merged
-     *
-     * is it possible to make the tests use the merge code path,
-     * instead of setting the status directly?
-     */
-    update.fixStatus(change.getStatus());
-
-    Set<Account.Id> reviewersToAdd = new HashSet<>(reviewers);
-    if (migration.readChanges()) {
-      approvalsUtil.addCcs(
-          ctx.getNotes(), update, filterOnChangeVisibility(db, ctx.getNotes(), extraCC));
-    } else {
-      reviewersToAdd.addAll(extraCC);
-    }
-
-    LabelTypes labelTypes = projectState.getLabelTypes();
-    approvalsUtil.addReviewers(
-        db,
-        update,
-        labelTypes,
-        change,
-        patchSet,
-        patchSetInfo,
-        filterOnChangeVisibility(db, ctx.getNotes(), reviewersToAdd),
-        Collections.<Account.Id>emptySet());
-    approvalsUtil.addApprovalsForNewPatchSet(
-        db, update, labelTypes, patchSet, ctx.getUser(), approvals);
-    // Check if approvals are changing in with this update. If so, add current user to reviewers.
-    // Note that this is done separately as addReviewers is filtering out the change owner as
-    // reviewer which is needed in several other code paths.
-    if (!approvals.isEmpty()) {
-      update.putReviewer(ctx.getAccountId(), REVIEWER);
-    }
-    if (message != null) {
-      changeMessage =
-          ChangeMessagesUtil.newMessage(
-              patchSet.getId(),
-              ctx.getUser(),
-              patchSet.getCreatedOn(),
-              message,
-              ChangeMessagesUtil.uploadedPatchSetTag(workInProgress));
-      cmUtil.addChangeMessage(db, update, changeMessage);
-    }
-    return true;
-  }
-
-  private Set<Account.Id> filterOnChangeVisibility(
-      final ReviewDb db, ChangeNotes notes, Set<Account.Id> accounts) {
-    return accounts.stream()
-        .filter(
-            accountId -> {
-              try {
-                IdentifiedUser user = userFactory.create(accountId);
-                return permissionBackend
-                    .user(user)
-                    .change(notes)
-                    .database(db)
-                    .test(ChangePermission.READ);
-              } catch (PermissionBackendException e) {
-                log.warn(
-                    "Failed to check if account {} can see change {}",
-                    accountId.get(),
-                    notes.getChangeId().get(),
-                    e);
-                return false;
-              }
-            })
-        .collect(toSet());
-  }
-
-  @Override
-  public void postUpdate(Context ctx) throws OrmException, IOException {
-    if (sendMail && (notify != NotifyHandling.NONE || !accountsToNotify.isEmpty())) {
-      Runnable sender =
-          new Runnable() {
-            @Override
-            public void run() {
-              try {
-                CreateChangeSender cm =
-                    createChangeSenderFactory.create(change.getProject(), change.getId());
-                cm.setFrom(change.getOwner());
-                cm.setPatchSet(patchSet, patchSetInfo);
-                cm.setNotify(notify);
-                cm.setAccountsToNotify(accountsToNotify);
-                cm.addReviewers(reviewers);
-                cm.addExtraCC(extraCC);
-                cm.send();
-              } catch (Exception e) {
-                log.error("Cannot send email for new change {}", change.getId(), e);
-              }
-            }
-
-            @Override
-            public String toString() {
-              return "send-email newchange";
-            }
-          };
-      if (requestScopePropagator != null) {
-        @SuppressWarnings("unused")
-        Future<?> possiblyIgnoredError =
-            sendEmailExecutor.submit(requestScopePropagator.wrap(sender));
-      } else {
-        sender.run();
-      }
-    }
-
-    /* For labels that are not set in this operation, show the "current" value
-     * of 0, and no oldValue as the value was not modified by this operation.
-     * For labels that are set in this operation, the value was modified, so
-     * show a transition from an oldValue of 0 to the new value.
-     */
-    if (fireRevisionCreated) {
-      revisionCreated.fire(change, patchSet, ctx.getAccount(), ctx.getWhen(), notify);
-      if (approvals != null && !approvals.isEmpty()) {
-        List<LabelType> labels =
-            projectState.getLabelTypes(change.getDest(), ctx.getUser()).getLabelTypes();
-        Map<String, Short> allApprovals = new HashMap<>();
-        Map<String, Short> oldApprovals = new HashMap<>();
-        for (LabelType lt : labels) {
-          allApprovals.put(lt.getName(), (short) 0);
-          oldApprovals.put(lt.getName(), null);
-        }
-        for (Map.Entry<String, Short> entry : approvals.entrySet()) {
-          if (entry.getValue() != 0) {
-            allApprovals.put(entry.getKey(), entry.getValue());
-            oldApprovals.put(entry.getKey(), (short) 0);
-          }
-        }
-        commentAdded.fire(
-            change, patchSet, ctx.getAccount(), null, allApprovals, oldApprovals, ctx.getWhen());
-      }
-    }
-  }
-
-  private void validate(RepoContext ctx) throws IOException, ResourceConflictException {
-    if (!validate) {
-      return;
-    }
-
-    PermissionBackend.ForRef perm =
-        permissionBackend.user(ctx.getUser()).project(ctx.getProject()).ref(refName);
-    try {
-      try (CommitReceivedEvent event =
-          new CommitReceivedEvent(
-              cmd,
-              projectState.getProject(),
-              change.getDest().get(),
-              ctx.getRevWalk().getObjectReader(),
-              commitId,
-              ctx.getIdentifiedUser())) {
-        commitValidatorsFactory
-            .forGerritCommits(
-                perm,
-                new Branch.NameKey(ctx.getProject(), refName),
-                ctx.getIdentifiedUser(),
-                new NoSshInfo(),
-                ctx.getRevWalk())
-            .validate(event);
-      }
-    } catch (CommitValidationException e) {
-      throw new ResourceConflictException(e.getFullMessage());
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeJson.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeJson.java
deleted file mode 100644
index 09091f4..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeJson.java
+++ /dev/null
@@ -1,1488 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.change;
-
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.gerrit.extensions.client.ListChangesOption.ALL_COMMITS;
-import static com.google.gerrit.extensions.client.ListChangesOption.ALL_FILES;
-import static com.google.gerrit.extensions.client.ListChangesOption.ALL_REVISIONS;
-import static com.google.gerrit.extensions.client.ListChangesOption.CHANGE_ACTIONS;
-import static com.google.gerrit.extensions.client.ListChangesOption.CHECK;
-import static com.google.gerrit.extensions.client.ListChangesOption.COMMIT_FOOTERS;
-import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_ACTIONS;
-import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_COMMIT;
-import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_FILES;
-import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_REVISION;
-import static com.google.gerrit.extensions.client.ListChangesOption.DETAILED_ACCOUNTS;
-import static com.google.gerrit.extensions.client.ListChangesOption.DETAILED_LABELS;
-import static com.google.gerrit.extensions.client.ListChangesOption.DOWNLOAD_COMMANDS;
-import static com.google.gerrit.extensions.client.ListChangesOption.LABELS;
-import static com.google.gerrit.extensions.client.ListChangesOption.MESSAGES;
-import static com.google.gerrit.extensions.client.ListChangesOption.PUSH_CERTIFICATES;
-import static com.google.gerrit.extensions.client.ListChangesOption.REVIEWED;
-import static com.google.gerrit.extensions.client.ListChangesOption.REVIEWER_UPDATES;
-import static com.google.gerrit.extensions.client.ListChangesOption.SUBMITTABLE;
-import static com.google.gerrit.extensions.client.ListChangesOption.TRACKING_IDS;
-import static com.google.gerrit.extensions.client.ListChangesOption.WEB_LINKS;
-import static com.google.gerrit.server.CommonConverters.toGitPerson;
-import static java.util.stream.Collectors.toList;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.base.Joiner;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Throwables;
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.HashBasedTable;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.LinkedHashMultimap;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.MultimapBuilder;
-import com.google.common.collect.SetMultimap;
-import com.google.common.collect.Sets;
-import com.google.common.collect.Table;
-import com.google.common.primitives.Ints;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.LabelTypes;
-import com.google.gerrit.common.data.LabelValue;
-import com.google.gerrit.common.data.SubmitRecord;
-import com.google.gerrit.common.data.SubmitTypeRecord;
-import com.google.gerrit.extensions.api.changes.FixInput;
-import com.google.gerrit.extensions.client.ListChangesOption;
-import com.google.gerrit.extensions.client.ReviewerState;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.ApprovalInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.ChangeMessageInfo;
-import com.google.gerrit.extensions.common.CommitInfo;
-import com.google.gerrit.extensions.common.FetchInfo;
-import com.google.gerrit.extensions.common.LabelInfo;
-import com.google.gerrit.extensions.common.ProblemInfo;
-import com.google.gerrit.extensions.common.PushCertificateInfo;
-import com.google.gerrit.extensions.common.ReviewerUpdateInfo;
-import com.google.gerrit.extensions.common.RevisionInfo;
-import com.google.gerrit.extensions.common.TrackingIdInfo;
-import com.google.gerrit.extensions.common.VotingRangeInfo;
-import com.google.gerrit.extensions.common.WebLinkInfo;
-import com.google.gerrit.extensions.config.DownloadCommand;
-import com.google.gerrit.extensions.config.DownloadScheme;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.Url;
-import com.google.gerrit.index.query.QueryResult;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.Patch;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.AnonymousUser;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.GpgException;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.ReviewerByEmailSet;
-import com.google.gerrit.server.ReviewerSet;
-import com.google.gerrit.server.ReviewerStatusUpdate;
-import com.google.gerrit.server.StarredChangesUtil;
-import com.google.gerrit.server.WebLinks;
-import com.google.gerrit.server.account.AccountLoader;
-import com.google.gerrit.server.api.accounts.AccountInfoComparator;
-import com.google.gerrit.server.api.accounts.GpgApiAdapter;
-import com.google.gerrit.server.config.TrackingFooters;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MergeUtil;
-import com.google.gerrit.server.index.change.ChangeField;
-import com.google.gerrit.server.index.change.ChangeIndexCollection;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.ReviewerStateInternal;
-import com.google.gerrit.server.patch.PatchListNotAvailableException;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.LabelPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.RemoveReviewerControl;
-import com.google.gerrit.server.project.SubmitRuleOptions;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.ChangeData.ChangedLines;
-import com.google.gerrit.server.query.change.PluginDefinedAttributesFactory;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import java.util.TreeMap;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ChangeJson {
-  private static final Logger log = LoggerFactory.getLogger(ChangeJson.class);
-
-  // Submit rule options in this class should always use fastEvalLabels for
-  // efficiency reasons. Callers that care about submittability after taking
-  // vote squashing into account should be looking at the submit action.
-  public static final SubmitRuleOptions SUBMIT_RULE_OPTIONS_LENIENT =
-      ChangeField.SUBMIT_RULE_OPTIONS_LENIENT.toBuilder().fastEvalLabels(true).build();
-
-  public static final SubmitRuleOptions SUBMIT_RULE_OPTIONS_STRICT =
-      ChangeField.SUBMIT_RULE_OPTIONS_STRICT.toBuilder().fastEvalLabels(true).build();
-
-  public static final ImmutableSet<ListChangesOption> REQUIRE_LAZY_LOAD =
-      ImmutableSet.of(
-          ALL_COMMITS,
-          ALL_REVISIONS,
-          CHANGE_ACTIONS,
-          CHECK,
-          COMMIT_FOOTERS,
-          CURRENT_ACTIONS,
-          CURRENT_COMMIT,
-          MESSAGES);
-
-  @Singleton
-  public static class Factory {
-    private final AssistedFactory factory;
-
-    @Inject
-    Factory(AssistedFactory factory) {
-      this.factory = factory;
-    }
-
-    public ChangeJson noOptions() {
-      return create(ImmutableSet.of());
-    }
-
-    public ChangeJson create(Iterable<ListChangesOption> options) {
-      return factory.create(options);
-    }
-
-    public ChangeJson create(ListChangesOption first, ListChangesOption... rest) {
-      return create(Sets.immutableEnumSet(first, rest));
-    }
-  }
-
-  public interface AssistedFactory {
-    ChangeJson create(Iterable<ListChangesOption> options);
-  }
-
-  private final Provider<ReviewDb> db;
-  private final Provider<CurrentUser> userProvider;
-  private final AnonymousUser anonymous;
-  private final PermissionBackend permissionBackend;
-  private final GitRepositoryManager repoManager;
-  private final ProjectCache projectCache;
-  private final MergeUtil.Factory mergeUtilFactory;
-  private final IdentifiedUser.GenericFactory userFactory;
-  private final ChangeData.Factory changeDataFactory;
-  private final FileInfoJson fileInfoJson;
-  private final AccountLoader.Factory accountLoaderFactory;
-  private final DynamicMap<DownloadScheme> downloadSchemes;
-  private final DynamicMap<DownloadCommand> downloadCommands;
-  private final WebLinks webLinks;
-  private final ImmutableSet<ListChangesOption> options;
-  private final ChangeMessagesUtil cmUtil;
-  private final Provider<ConsistencyChecker> checkerProvider;
-  private final ActionJson actionJson;
-  private final GpgApiAdapter gpgApi;
-  private final ChangeNotes.Factory notesFactory;
-  private final ChangeResource.Factory changeResourceFactory;
-  private final ChangeKindCache changeKindCache;
-  private final ChangeIndexCollection indexes;
-  private final ApprovalsUtil approvalsUtil;
-  private final RemoveReviewerControl removeReviewerControl;
-  private final TrackingFooters trackingFooters;
-  private boolean lazyLoad = true;
-  private AccountLoader accountLoader;
-  private FixInput fix;
-  private PluginDefinedAttributesFactory pluginDefinedAttributesFactory;
-
-  @Inject
-  ChangeJson(
-      Provider<ReviewDb> db,
-      Provider<CurrentUser> user,
-      AnonymousUser au,
-      PermissionBackend permissionBackend,
-      GitRepositoryManager repoManager,
-      ProjectCache projectCache,
-      MergeUtil.Factory mergeUtilFactory,
-      IdentifiedUser.GenericFactory uf,
-      ChangeData.Factory cdf,
-      FileInfoJson fileInfoJson,
-      AccountLoader.Factory ailf,
-      DynamicMap<DownloadScheme> downloadSchemes,
-      DynamicMap<DownloadCommand> downloadCommands,
-      WebLinks webLinks,
-      ChangeMessagesUtil cmUtil,
-      Provider<ConsistencyChecker> checkerProvider,
-      ActionJson actionJson,
-      GpgApiAdapter gpgApi,
-      ChangeNotes.Factory notesFactory,
-      ChangeResource.Factory changeResourceFactory,
-      ChangeKindCache changeKindCache,
-      ChangeIndexCollection indexes,
-      ApprovalsUtil approvalsUtil,
-      RemoveReviewerControl removeReviewerControl,
-      TrackingFooters trackingFooters,
-      @Assisted Iterable<ListChangesOption> options) {
-    this.db = db;
-    this.userProvider = user;
-    this.anonymous = au;
-    this.changeDataFactory = cdf;
-    this.permissionBackend = permissionBackend;
-    this.repoManager = repoManager;
-    this.userFactory = uf;
-    this.projectCache = projectCache;
-    this.mergeUtilFactory = mergeUtilFactory;
-    this.fileInfoJson = fileInfoJson;
-    this.accountLoaderFactory = ailf;
-    this.downloadSchemes = downloadSchemes;
-    this.downloadCommands = downloadCommands;
-    this.webLinks = webLinks;
-    this.cmUtil = cmUtil;
-    this.checkerProvider = checkerProvider;
-    this.actionJson = actionJson;
-    this.gpgApi = gpgApi;
-    this.notesFactory = notesFactory;
-    this.changeResourceFactory = changeResourceFactory;
-    this.changeKindCache = changeKindCache;
-    this.indexes = indexes;
-    this.approvalsUtil = approvalsUtil;
-    this.removeReviewerControl = removeReviewerControl;
-    this.options = Sets.immutableEnumSet(options);
-    this.trackingFooters = trackingFooters;
-  }
-
-  public ChangeJson lazyLoad(boolean load) {
-    lazyLoad = load;
-    return this;
-  }
-
-  public ChangeJson fix(FixInput fix) {
-    this.fix = fix;
-    return this;
-  }
-
-  public void setPluginDefinedAttributesFactory(PluginDefinedAttributesFactory pluginsFactory) {
-    this.pluginDefinedAttributesFactory = pluginsFactory;
-  }
-
-  public ChangeInfo format(ChangeResource rsrc) throws OrmException {
-    return format(changeDataFactory.create(db.get(), rsrc.getNotes()));
-  }
-
-  public ChangeInfo format(Change change) throws OrmException {
-    return format(changeDataFactory.create(db.get(), change));
-  }
-
-  public ChangeInfo format(Project.NameKey project, Change.Id id) throws OrmException {
-    ChangeNotes notes;
-    try {
-      notes = notesFactory.createChecked(db.get(), project, id);
-    } catch (OrmException e) {
-      if (!has(CHECK)) {
-        throw e;
-      }
-      return checkOnly(changeDataFactory.create(db.get(), project, id));
-    }
-    return format(changeDataFactory.create(db.get(), notes));
-  }
-
-  public ChangeInfo format(ChangeData cd) throws OrmException {
-    return format(cd, Optional.empty(), true);
-  }
-
-  private ChangeInfo format(
-      ChangeData cd, Optional<PatchSet.Id> limitToPsId, boolean fillAccountLoader)
-      throws OrmException {
-    try {
-      if (fillAccountLoader) {
-        accountLoader = accountLoaderFactory.create(has(DETAILED_ACCOUNTS));
-        ChangeInfo res = toChangeInfo(cd, limitToPsId);
-        accountLoader.fill();
-        return res;
-      }
-      return toChangeInfo(cd, limitToPsId);
-    } catch (PatchListNotAvailableException
-        | GpgException
-        | OrmException
-        | IOException
-        | PermissionBackendException
-        | NoSuchProjectException
-        | RuntimeException e) {
-      if (!has(CHECK)) {
-        Throwables.throwIfInstanceOf(e, OrmException.class);
-        throw new OrmException(e);
-      }
-      return checkOnly(cd);
-    }
-  }
-
-  public ChangeInfo format(RevisionResource rsrc) throws OrmException {
-    ChangeData cd = changeDataFactory.create(db.get(), rsrc.getNotes());
-    return format(cd, Optional.of(rsrc.getPatchSet().getId()), true);
-  }
-
-  public List<List<ChangeInfo>> formatQueryResults(List<QueryResult<ChangeData>> in)
-      throws OrmException {
-    accountLoader = accountLoaderFactory.create(has(DETAILED_ACCOUNTS));
-    ensureLoaded(FluentIterable.from(in).transformAndConcat(QueryResult::entities));
-
-    List<List<ChangeInfo>> res = Lists.newArrayListWithCapacity(in.size());
-    Map<Change.Id, ChangeInfo> out = new HashMap<>();
-    for (QueryResult<ChangeData> r : in) {
-      List<ChangeInfo> infos = toChangeInfo(out, r.entities());
-      if (!infos.isEmpty() && r.more()) {
-        infos.get(infos.size() - 1)._moreChanges = true;
-      }
-      res.add(infos);
-    }
-    accountLoader.fill();
-    return res;
-  }
-
-  public List<ChangeInfo> formatChangeDatas(Collection<ChangeData> in) throws OrmException {
-    accountLoader = accountLoaderFactory.create(has(DETAILED_ACCOUNTS));
-    ensureLoaded(in);
-    List<ChangeInfo> out = new ArrayList<>(in.size());
-    for (ChangeData cd : in) {
-      out.add(format(cd));
-    }
-    accountLoader.fill();
-    return out;
-  }
-
-  private void ensureLoaded(Iterable<ChangeData> all) throws OrmException {
-    if (lazyLoad) {
-      ChangeData.ensureChangeLoaded(all);
-      if (has(ALL_REVISIONS)) {
-        ChangeData.ensureAllPatchSetsLoaded(all);
-      } else if (has(CURRENT_REVISION) || has(MESSAGES)) {
-        ChangeData.ensureCurrentPatchSetLoaded(all);
-      }
-      if (has(REVIEWED) && userProvider.get().isIdentifiedUser()) {
-        ChangeData.ensureReviewedByLoadedForOpenChanges(all);
-      }
-      ChangeData.ensureCurrentApprovalsLoaded(all);
-    } else {
-      for (ChangeData cd : all) {
-        cd.setLazyLoad(false);
-      }
-    }
-  }
-
-  private boolean has(ListChangesOption option) {
-    return options.contains(option);
-  }
-
-  private List<ChangeInfo> toChangeInfo(Map<Change.Id, ChangeInfo> out, List<ChangeData> changes) {
-    List<ChangeInfo> info = Lists.newArrayListWithCapacity(changes.size());
-    for (ChangeData cd : changes) {
-      ChangeInfo i = out.get(cd.getId());
-      if (i == null) {
-        try {
-          i = toChangeInfo(cd, Optional.empty());
-        } catch (PatchListNotAvailableException
-            | GpgException
-            | OrmException
-            | IOException
-            | PermissionBackendException
-            | NoSuchProjectException
-            | RuntimeException e) {
-          if (has(CHECK)) {
-            i = checkOnly(cd);
-          } else if (e instanceof NoSuchChangeException) {
-            log.info(
-                "NoSuchChangeException: Omitting corrupt change "
-                    + cd.getId()
-                    + " from results. Seems to be stale in the index.");
-            continue;
-          } else {
-            log.warn("Omitting corrupt change " + cd.getId() + " from results", e);
-            continue;
-          }
-        }
-        out.put(cd.getId(), i);
-      }
-      info.add(i);
-    }
-    return info;
-  }
-
-  private ChangeInfo checkOnly(ChangeData cd) {
-    ChangeNotes notes;
-    try {
-      notes = cd.notes();
-    } catch (OrmException e) {
-      String msg = "Error loading change";
-      log.warn(msg + " " + cd.getId(), e);
-      ChangeInfo info = new ChangeInfo();
-      info._number = cd.getId().get();
-      ProblemInfo p = new ProblemInfo();
-      p.message = msg;
-      info.problems = Lists.newArrayList(p);
-      return info;
-    }
-
-    ConsistencyChecker.Result result = checkerProvider.get().check(notes, fix);
-    ChangeInfo info;
-    Change c = result.change();
-    if (c != null) {
-      info = new ChangeInfo();
-      info.project = c.getProject().get();
-      info.branch = c.getDest().getShortName();
-      info.topic = c.getTopic();
-      info.changeId = c.getKey().get();
-      info.subject = c.getSubject();
-      info.status = c.getStatus().asChangeStatus();
-      info.owner = new AccountInfo(c.getOwner().get());
-      info.created = c.getCreatedOn();
-      info.updated = c.getLastUpdatedOn();
-      info._number = c.getId().get();
-      info.problems = result.problems();
-      info.isPrivate = c.isPrivate() ? true : null;
-      info.workInProgress = c.isWorkInProgress() ? true : null;
-      info.hasReviewStarted = c.hasReviewStarted();
-      finish(info);
-    } else {
-      info = new ChangeInfo();
-      info._number = result.id().get();
-      info.problems = result.problems();
-    }
-    return info;
-  }
-
-  private ChangeInfo toChangeInfo(ChangeData cd, Optional<PatchSet.Id> limitToPsId)
-      throws PatchListNotAvailableException, GpgException, OrmException, IOException,
-          PermissionBackendException, NoSuchProjectException {
-    ChangeInfo out = new ChangeInfo();
-    CurrentUser user = userProvider.get();
-
-    if (has(CHECK)) {
-      out.problems = checkerProvider.get().check(cd.notes(), fix).problems();
-      // If any problems were fixed, the ChangeData needs to be reloaded.
-      for (ProblemInfo p : out.problems) {
-        if (p.status == ProblemInfo.Status.FIXED) {
-          cd = changeDataFactory.create(cd.db(), cd.project(), cd.getId());
-          break;
-        }
-      }
-    }
-
-    PermissionBackend.ForChange perm = permissionBackendForChange(user, cd);
-    Change in = cd.change();
-    out.project = in.getProject().get();
-    out.branch = in.getDest().getShortName();
-    out.topic = in.getTopic();
-    if (indexes.getSearchIndex().getSchema().hasField(ChangeField.ASSIGNEE)) {
-      if (in.getAssignee() != null) {
-        out.assignee = accountLoader.get(in.getAssignee());
-      }
-    }
-    out.hashtags = cd.hashtags();
-    out.changeId = in.getKey().get();
-    if (in.getStatus().isOpen()) {
-      SubmitTypeRecord str = cd.submitTypeRecord();
-      if (str.isOk()) {
-        out.submitType = str.type;
-      }
-      out.mergeable = cd.isMergeable();
-      if (has(SUBMITTABLE)) {
-        out.submittable = submittable(cd);
-      }
-    }
-    Optional<ChangedLines> changedLines = cd.changedLines();
-    if (changedLines.isPresent()) {
-      out.insertions = changedLines.get().insertions;
-      out.deletions = changedLines.get().deletions;
-    }
-    out.isPrivate = in.isPrivate() ? true : null;
-    out.workInProgress = in.isWorkInProgress() ? true : null;
-    out.hasReviewStarted = in.hasReviewStarted();
-    out.subject = in.getSubject();
-    out.status = in.getStatus().asChangeStatus();
-    out.owner = accountLoader.get(in.getOwner());
-    out.created = in.getCreatedOn();
-    out.updated = in.getLastUpdatedOn();
-    out._number = in.getId().get();
-    out.unresolvedCommentCount = cd.unresolvedCommentCount();
-
-    if (user.isIdentifiedUser()) {
-      Collection<String> stars = cd.stars(user.getAccountId());
-      out.starred = stars.contains(StarredChangesUtil.DEFAULT_LABEL) ? true : null;
-      if (!stars.isEmpty()) {
-        out.stars = stars;
-      }
-    }
-
-    if (in.getStatus().isOpen() && has(REVIEWED) && user.isIdentifiedUser()) {
-      out.reviewed = cd.isReviewedBy(user.getAccountId()) ? true : null;
-    }
-
-    out.labels = labelsFor(perm, cd, has(LABELS), has(DETAILED_LABELS));
-
-    if (out.labels != null && has(DETAILED_LABELS)) {
-      // If limited to specific patch sets but not the current patch set, don't
-      // list permitted labels, since users can't vote on those patch sets.
-      if (user.isIdentifiedUser()
-          && (!limitToPsId.isPresent() || limitToPsId.get().equals(in.currentPatchSetId()))) {
-        out.permittedLabels =
-            cd.change().getStatus() != Change.Status.ABANDONED
-                ? permittedLabels(perm, cd)
-                : ImmutableMap.of();
-      }
-
-      out.reviewers = reviewerMap(cd.reviewers(), cd.reviewersByEmail(), false);
-      out.pendingReviewers = reviewerMap(cd.pendingReviewers(), cd.pendingReviewersByEmail(), true);
-      out.removableReviewers = removableReviewers(cd, out);
-    }
-
-    setSubmitter(cd, out);
-    out.plugins =
-        pluginDefinedAttributesFactory != null ? pluginDefinedAttributesFactory.create(cd) : null;
-    out.revertOf = cd.change().getRevertOf() != null ? cd.change().getRevertOf().get() : null;
-
-    if (has(REVIEWER_UPDATES)) {
-      out.reviewerUpdates = reviewerUpdates(cd);
-    }
-
-    boolean needMessages = has(MESSAGES);
-    boolean needRevisions = has(ALL_REVISIONS) || has(CURRENT_REVISION) || limitToPsId.isPresent();
-    Map<PatchSet.Id, PatchSet> src;
-    if (needMessages || needRevisions) {
-      src = loadPatchSets(cd, limitToPsId);
-    } else {
-      src = null;
-    }
-
-    if (needMessages) {
-      out.messages = messages(cd);
-    }
-    finish(out);
-
-    // This block must come after the ChangeInfo is mostly populated, since
-    // it will be passed to ActionVisitors as-is.
-    if (needRevisions) {
-      out.revisions = revisions(cd, src, limitToPsId, out);
-      if (out.revisions != null) {
-        for (Map.Entry<String, RevisionInfo> entry : out.revisions.entrySet()) {
-          if (entry.getValue().isCurrent) {
-            out.currentRevision = entry.getKey();
-            break;
-          }
-        }
-      }
-    }
-
-    if (has(CURRENT_ACTIONS) || has(CHANGE_ACTIONS)) {
-      actionJson.addChangeActions(out, cd.notes());
-    }
-
-    if (has(TRACKING_IDS)) {
-      ListMultimap<String, String> set = trackingFooters.extract(cd.commitFooters());
-      out.trackingIds =
-          set.entries().stream()
-              .map(e -> new TrackingIdInfo(e.getKey(), e.getValue()))
-              .collect(toList());
-    }
-
-    return out;
-  }
-
-  private Map<ReviewerState, Collection<AccountInfo>> reviewerMap(
-      ReviewerSet reviewers, ReviewerByEmailSet reviewersByEmail, boolean includeRemoved) {
-    Map<ReviewerState, Collection<AccountInfo>> reviewerMap = new HashMap<>();
-    for (ReviewerStateInternal state : ReviewerStateInternal.values()) {
-      if (!includeRemoved && state == ReviewerStateInternal.REMOVED) {
-        continue;
-      }
-      Collection<AccountInfo> reviewersByState = toAccountInfo(reviewers.byState(state));
-      reviewersByState.addAll(toAccountInfoByEmail(reviewersByEmail.byState(state)));
-      if (!reviewersByState.isEmpty()) {
-        reviewerMap.put(state.asReviewerState(), reviewersByState);
-      }
-    }
-    return reviewerMap;
-  }
-
-  private Collection<ReviewerUpdateInfo> reviewerUpdates(ChangeData cd) throws OrmException {
-    List<ReviewerStatusUpdate> reviewerUpdates = cd.reviewerUpdates();
-    List<ReviewerUpdateInfo> result = new ArrayList<>(reviewerUpdates.size());
-    for (ReviewerStatusUpdate c : reviewerUpdates) {
-      ReviewerUpdateInfo change = new ReviewerUpdateInfo();
-      change.updated = c.date();
-      change.state = c.state().asReviewerState();
-      change.updatedBy = accountLoader.get(c.updatedBy());
-      change.reviewer = accountLoader.get(c.reviewer());
-      result.add(change);
-    }
-    return result;
-  }
-
-  private boolean submittable(ChangeData cd) throws OrmException {
-    return SubmitRecord.findOkRecord(cd.submitRecords(SUBMIT_RULE_OPTIONS_STRICT)).isPresent();
-  }
-
-  private List<SubmitRecord> submitRecords(ChangeData cd) throws OrmException {
-    return cd.submitRecords(SUBMIT_RULE_OPTIONS_LENIENT);
-  }
-
-  private Map<String, LabelInfo> labelsFor(
-      PermissionBackend.ForChange perm, ChangeData cd, boolean standard, boolean detailed)
-      throws OrmException, PermissionBackendException {
-    if (!standard && !detailed) {
-      return null;
-    }
-
-    LabelTypes labelTypes = cd.getLabelTypes();
-    Map<String, LabelWithStatus> withStatus =
-        cd.change().getStatus() == Change.Status.MERGED
-            ? labelsForSubmittedChange(perm, cd, labelTypes, standard, detailed)
-            : labelsForUnsubmittedChange(perm, cd, labelTypes, standard, detailed);
-    return ImmutableMap.copyOf(Maps.transformValues(withStatus, LabelWithStatus::label));
-  }
-
-  private Map<String, LabelWithStatus> labelsForUnsubmittedChange(
-      PermissionBackend.ForChange perm,
-      ChangeData cd,
-      LabelTypes labelTypes,
-      boolean standard,
-      boolean detailed)
-      throws OrmException, PermissionBackendException {
-    Map<String, LabelWithStatus> labels = initLabels(cd, labelTypes, standard);
-    if (detailed) {
-      setAllApprovals(perm, cd, labels);
-    }
-    for (Map.Entry<String, LabelWithStatus> e : labels.entrySet()) {
-      LabelType type = labelTypes.byLabel(e.getKey());
-      if (type == null) {
-        continue;
-      }
-      if (standard) {
-        for (PatchSetApproval psa : cd.currentApprovals()) {
-          if (type.matches(psa)) {
-            short val = psa.getValue();
-            Account.Id accountId = psa.getAccountId();
-            setLabelScores(type, e.getValue(), val, accountId);
-          }
-        }
-      }
-      if (detailed) {
-        setLabelValues(type, e.getValue());
-      }
-    }
-    return labels;
-  }
-
-  private Map<String, LabelWithStatus> initLabels(
-      ChangeData cd, LabelTypes labelTypes, boolean standard) throws OrmException {
-    Map<String, LabelWithStatus> labels = new TreeMap<>(labelTypes.nameComparator());
-    for (SubmitRecord rec : submitRecords(cd)) {
-      if (rec.labels == null) {
-        continue;
-      }
-      for (SubmitRecord.Label r : rec.labels) {
-        LabelWithStatus p = labels.get(r.label);
-        if (p == null || p.status().compareTo(r.status) < 0) {
-          LabelInfo n = new LabelInfo();
-          if (standard) {
-            switch (r.status) {
-              case OK:
-                n.approved = accountLoader.get(r.appliedBy);
-                break;
-              case REJECT:
-                n.rejected = accountLoader.get(r.appliedBy);
-                n.blocking = true;
-                break;
-              case IMPOSSIBLE:
-              case MAY:
-              case NEED:
-              default:
-                break;
-            }
-          }
-
-          n.optional = r.status == SubmitRecord.Label.Status.MAY ? true : null;
-          labels.put(r.label, LabelWithStatus.create(n, r.status));
-        }
-      }
-    }
-    return labels;
-  }
-
-  private void setLabelScores(
-      LabelType type, LabelWithStatus l, short score, Account.Id accountId) {
-    if (l.label().approved != null || l.label().rejected != null) {
-      return;
-    }
-
-    if (type.getMin() == null || type.getMax() == null) {
-      // Can't set score for unknown or misconfigured type.
-      return;
-    }
-
-    if (score != 0) {
-      if (score == type.getMin().getValue()) {
-        l.label().rejected = accountLoader.get(accountId);
-      } else if (score == type.getMax().getValue()) {
-        l.label().approved = accountLoader.get(accountId);
-      } else if (score < 0) {
-        l.label().disliked = accountLoader.get(accountId);
-        l.label().value = score;
-      } else if (score > 0 && l.label().disliked == null) {
-        l.label().recommended = accountLoader.get(accountId);
-        l.label().value = score;
-      }
-    }
-  }
-
-  private void setAllApprovals(
-      PermissionBackend.ForChange basePerm, ChangeData cd, Map<String, LabelWithStatus> labels)
-      throws OrmException, PermissionBackendException {
-    Change.Status status = cd.change().getStatus();
-    checkState(
-        status != Change.Status.MERGED, "should not call setAllApprovals on %s change", status);
-
-    // Include a user in the output for this label if either:
-    //  - They are an explicit reviewer.
-    //  - They ever voted on this change.
-    Set<Account.Id> allUsers = new HashSet<>();
-    allUsers.addAll(cd.reviewers().byState(ReviewerStateInternal.REVIEWER));
-    for (PatchSetApproval psa : cd.approvals().values()) {
-      allUsers.add(psa.getAccountId());
-    }
-
-    Table<Account.Id, String, PatchSetApproval> current =
-        HashBasedTable.create(allUsers.size(), cd.getLabelTypes().getLabelTypes().size());
-    for (PatchSetApproval psa : cd.currentApprovals()) {
-      current.put(psa.getAccountId(), psa.getLabel(), psa);
-    }
-
-    LabelTypes labelTypes = cd.getLabelTypes();
-    for (Account.Id accountId : allUsers) {
-      PermissionBackend.ForChange perm = basePerm.user(userFactory.create(accountId));
-      Map<String, VotingRangeInfo> pvr = getPermittedVotingRanges(permittedLabels(perm, cd));
-      for (Map.Entry<String, LabelWithStatus> e : labels.entrySet()) {
-        LabelType lt = labelTypes.byLabel(e.getKey());
-        if (lt == null) {
-          // Ignore submit record for undefined label; likely the submit rule
-          // author didn't intend for the label to show up in the table.
-          continue;
-        }
-        Integer value;
-        VotingRangeInfo permittedVotingRange = pvr.getOrDefault(lt.getName(), null);
-        String tag = null;
-        Timestamp date = null;
-        PatchSetApproval psa = current.get(accountId, lt.getName());
-        if (psa != null) {
-          value = Integer.valueOf(psa.getValue());
-          if (value == 0) {
-            // This may be a dummy approval that was inserted when the reviewer
-            // was added. Explicitly check whether the user can vote on this
-            // label.
-            value = perm.test(new LabelPermission(lt)) ? 0 : null;
-          }
-          tag = psa.getTag();
-          date = psa.getGranted();
-          if (psa.isPostSubmit()) {
-            log.warn("unexpected post-submit approval on open change: {}", psa);
-          }
-        } else {
-          // Either the user cannot vote on this label, or they were added as a
-          // reviewer but have not responded yet. Explicitly check whether the
-          // user can vote on this label.
-          value = perm.test(new LabelPermission(lt)) ? 0 : null;
-        }
-        addApproval(
-            e.getValue().label(), approvalInfo(accountId, value, permittedVotingRange, tag, date));
-      }
-    }
-  }
-
-  private Map<String, VotingRangeInfo> getPermittedVotingRanges(
-      Map<String, Collection<String>> permittedLabels) {
-    Map<String, VotingRangeInfo> permittedVotingRanges =
-        Maps.newHashMapWithExpectedSize(permittedLabels.size());
-    for (String label : permittedLabels.keySet()) {
-      List<Integer> permittedVotingRange =
-          permittedLabels.get(label).stream()
-              .map(this::parseRangeValue)
-              .filter(java.util.Objects::nonNull)
-              .sorted()
-              .collect(toList());
-
-      if (permittedVotingRange.isEmpty()) {
-        permittedVotingRanges.put(label, null);
-      } else {
-        int minPermittedValue = permittedVotingRange.get(0);
-        int maxPermittedValue = Iterables.getLast(permittedVotingRange);
-        permittedVotingRanges.put(label, new VotingRangeInfo(minPermittedValue, maxPermittedValue));
-      }
-    }
-    return permittedVotingRanges;
-  }
-
-  private Integer parseRangeValue(String value) {
-    if (value.startsWith("+")) {
-      value = value.substring(1);
-    } else if (value.startsWith(" ")) {
-      value = value.trim();
-    }
-    return Ints.tryParse(value);
-  }
-
-  private void setSubmitter(ChangeData cd, ChangeInfo out) throws OrmException {
-    Optional<PatchSetApproval> s = cd.getSubmitApproval();
-    if (!s.isPresent()) {
-      return;
-    }
-    out.submitted = s.get().getGranted();
-    out.submitter = accountLoader.get(s.get().getAccountId());
-  }
-
-  private Map<String, LabelWithStatus> labelsForSubmittedChange(
-      PermissionBackend.ForChange basePerm,
-      ChangeData cd,
-      LabelTypes labelTypes,
-      boolean standard,
-      boolean detailed)
-      throws OrmException, PermissionBackendException {
-    Set<Account.Id> allUsers = new HashSet<>();
-    if (detailed) {
-      // Users expect to see all reviewers on closed changes, even if they
-      // didn't vote on the latest patch set. If we don't need detailed labels,
-      // we aren't including 0 votes for all users below, so we can just look at
-      // the latest patch set (in the next loop).
-      for (PatchSetApproval psa : cd.approvals().values()) {
-        allUsers.add(psa.getAccountId());
-      }
-    }
-
-    Set<String> labelNames = new HashSet<>();
-    SetMultimap<Account.Id, PatchSetApproval> current =
-        MultimapBuilder.hashKeys().hashSetValues().build();
-    for (PatchSetApproval a : cd.currentApprovals()) {
-      allUsers.add(a.getAccountId());
-      LabelType type = labelTypes.byLabel(a.getLabelId());
-      if (type != null) {
-        labelNames.add(type.getName());
-        // Not worth the effort to distinguish between votable/non-votable for 0
-        // values on closed changes, since they can't vote anyway.
-        current.put(a.getAccountId(), a);
-      }
-    }
-
-    // Since voting on merged changes is allowed all labels which apply to
-    // the change must be returned. All applying labels can be retrieved from
-    // the submit records, which is what initLabels does.
-    // It's not possible to only compute the labels based on the approvals
-    // since merged changes may not have approvals for all labels (e.g. if not
-    // all labels are required for submit or if the change was auto-closed due
-    // to direct push or if new labels were defined after the change was
-    // merged).
-    Map<String, LabelWithStatus> labels;
-    labels = initLabels(cd, labelTypes, standard);
-
-    // Also include all labels for which approvals exists. E.g. there can be
-    // approvals for labels that are ignored by a Prolog submit rule and hence
-    // it wouldn't be included in the submit records.
-    for (String name : labelNames) {
-      if (!labels.containsKey(name)) {
-        labels.put(name, LabelWithStatus.create(new LabelInfo(), null));
-      }
-    }
-
-    if (detailed) {
-      labels.entrySet().stream()
-          .filter(e -> labelTypes.byLabel(e.getKey()) != null)
-          .forEach(e -> setLabelValues(labelTypes.byLabel(e.getKey()), e.getValue()));
-    }
-
-    for (Account.Id accountId : allUsers) {
-      Map<String, ApprovalInfo> byLabel = Maps.newHashMapWithExpectedSize(labels.size());
-      Map<String, VotingRangeInfo> pvr = Collections.emptyMap();
-      if (detailed) {
-        PermissionBackend.ForChange perm = basePerm.user(userFactory.create(accountId));
-        pvr = getPermittedVotingRanges(permittedLabels(perm, cd));
-        for (Map.Entry<String, LabelWithStatus> entry : labels.entrySet()) {
-          ApprovalInfo ai = approvalInfo(accountId, 0, null, null, null);
-          byLabel.put(entry.getKey(), ai);
-          addApproval(entry.getValue().label(), ai);
-        }
-      }
-      for (PatchSetApproval psa : current.get(accountId)) {
-        LabelType type = labelTypes.byLabel(psa.getLabelId());
-        if (type == null) {
-          continue;
-        }
-
-        short val = psa.getValue();
-        ApprovalInfo info = byLabel.get(type.getName());
-        if (info != null) {
-          info.value = Integer.valueOf(val);
-          info.permittedVotingRange = pvr.getOrDefault(type.getName(), null);
-          info.date = psa.getGranted();
-          info.tag = psa.getTag();
-          if (psa.isPostSubmit()) {
-            info.postSubmit = true;
-          }
-        }
-        if (!standard) {
-          continue;
-        }
-
-        setLabelScores(type, labels.get(type.getName()), val, accountId);
-      }
-    }
-    return labels;
-  }
-
-  private ApprovalInfo approvalInfo(
-      Account.Id id,
-      Integer value,
-      VotingRangeInfo permittedVotingRange,
-      String tag,
-      Timestamp date) {
-    ApprovalInfo ai = getApprovalInfo(id, value, permittedVotingRange, tag, date);
-    accountLoader.put(ai);
-    return ai;
-  }
-
-  public static ApprovalInfo getApprovalInfo(
-      Account.Id id,
-      Integer value,
-      @Nullable VotingRangeInfo permittedVotingRange,
-      @Nullable String tag,
-      Timestamp date) {
-    ApprovalInfo ai = new ApprovalInfo(id.get());
-    ai.value = value;
-    ai.permittedVotingRange = permittedVotingRange;
-    ai.date = date;
-    ai.tag = tag;
-    return ai;
-  }
-
-  private static boolean isOnlyZero(Collection<String> values) {
-    return values.isEmpty() || (values.size() == 1 && values.contains(" 0"));
-  }
-
-  private void setLabelValues(LabelType type, LabelWithStatus l) {
-    l.label().defaultValue = type.getDefaultValue();
-    l.label().values = new LinkedHashMap<>();
-    for (LabelValue v : type.getValues()) {
-      l.label().values.put(v.formatValue(), v.getText());
-    }
-    if (isOnlyZero(l.label().values.keySet())) {
-      l.label().values = null;
-    }
-  }
-
-  private Map<String, Collection<String>> permittedLabels(
-      PermissionBackend.ForChange perm, ChangeData cd)
-      throws OrmException, PermissionBackendException {
-    boolean isMerged = cd.change().getStatus() == Change.Status.MERGED;
-    LabelTypes labelTypes = cd.getLabelTypes();
-    Map<String, LabelType> toCheck = new HashMap<>();
-    for (SubmitRecord rec : submitRecords(cd)) {
-      if (rec.labels != null) {
-        for (SubmitRecord.Label r : rec.labels) {
-          LabelType type = labelTypes.byLabel(r.label);
-          if (type != null && (!isMerged || type.allowPostSubmit())) {
-            toCheck.put(type.getName(), type);
-          }
-        }
-      }
-    }
-
-    Map<String, Short> labels = null;
-    Set<LabelPermission.WithValue> can = perm.testLabels(toCheck.values());
-    SetMultimap<String, String> permitted = LinkedHashMultimap.create();
-    for (SubmitRecord rec : submitRecords(cd)) {
-      if (rec.labels == null) {
-        continue;
-      }
-      for (SubmitRecord.Label r : rec.labels) {
-        LabelType type = labelTypes.byLabel(r.label);
-        if (type == null || (isMerged && !type.allowPostSubmit())) {
-          continue;
-        }
-
-        for (LabelValue v : type.getValues()) {
-          boolean ok = can.contains(new LabelPermission.WithValue(type, v));
-          if (isMerged) {
-            if (labels == null) {
-              labels = currentLabels(perm, cd);
-            }
-            short prev = labels.getOrDefault(type.getName(), (short) 0);
-            ok &= v.getValue() >= prev;
-          }
-          if (ok) {
-            permitted.put(r.label, v.formatValue());
-          }
-        }
-      }
-    }
-
-    List<String> toClear = Lists.newArrayListWithCapacity(permitted.keySet().size());
-    for (Map.Entry<String, Collection<String>> e : permitted.asMap().entrySet()) {
-      if (isOnlyZero(e.getValue())) {
-        toClear.add(e.getKey());
-      }
-    }
-    for (String label : toClear) {
-      permitted.removeAll(label);
-    }
-    return permitted.asMap();
-  }
-
-  private Map<String, Short> currentLabels(PermissionBackend.ForChange perm, ChangeData cd)
-      throws OrmException {
-    IdentifiedUser user = perm.user().asIdentifiedUser();
-    Map<String, Short> result = new HashMap<>();
-    for (PatchSetApproval psa :
-        approvalsUtil.byPatchSetUser(
-            db.get(),
-            lazyLoad ? cd.notes() : notesFactory.createFromIndexedChange(cd.change()),
-            user,
-            cd.change().currentPatchSetId(),
-            user.getAccountId(),
-            null,
-            null)) {
-      result.put(psa.getLabel(), psa.getValue());
-    }
-    return result;
-  }
-
-  private Collection<ChangeMessageInfo> messages(ChangeData cd) throws OrmException {
-    List<ChangeMessage> messages = cmUtil.byChange(db.get(), cd.notes());
-    if (messages.isEmpty()) {
-      return Collections.emptyList();
-    }
-
-    List<ChangeMessageInfo> result = Lists.newArrayListWithCapacity(messages.size());
-    for (ChangeMessage message : messages) {
-      PatchSet.Id patchNum = message.getPatchSetId();
-      ChangeMessageInfo cmi = new ChangeMessageInfo();
-      cmi.id = message.getKey().get();
-      cmi.author = accountLoader.get(message.getAuthor());
-      cmi.date = message.getWrittenOn();
-      cmi.message = message.getMessage();
-      cmi.tag = message.getTag();
-      cmi._revisionNumber = patchNum != null ? patchNum.get() : null;
-      Account.Id realAuthor = message.getRealAuthor();
-      if (realAuthor != null) {
-        cmi.realAuthor = accountLoader.get(realAuthor);
-      }
-      result.add(cmi);
-    }
-    return result;
-  }
-
-  private Collection<AccountInfo> removableReviewers(ChangeData cd, ChangeInfo out)
-      throws PermissionBackendException, NoSuchProjectException, OrmException, IOException {
-    // Although this is called removableReviewers, this method also determines
-    // which CCs are removable.
-    //
-    // For reviewers, we need to look at each approval, because the reviewer
-    // should only be considered removable if *all* of their approvals can be
-    // removed. First, add all reviewers with *any* removable approval to the
-    // "removable" set. Along the way, if we encounter a non-removable approval,
-    // add the reviewer to the "fixed" set. Before we return, remove all members
-    // of "fixed" from "removable", because not all of their approvals can be
-    // removed.
-    Collection<LabelInfo> labels = out.labels.values();
-    Set<Account.Id> fixed = Sets.newHashSetWithExpectedSize(labels.size());
-    Set<Account.Id> removable = Sets.newHashSetWithExpectedSize(labels.size());
-    for (LabelInfo label : labels) {
-      if (label.all == null) {
-        continue;
-      }
-      for (ApprovalInfo ai : label.all) {
-        Account.Id id = new Account.Id(ai._accountId);
-
-        if (removeReviewerControl.testRemoveReviewer(
-            cd, userProvider.get(), id, MoreObjects.firstNonNull(ai.value, 0))) {
-          removable.add(id);
-        } else {
-          fixed.add(id);
-        }
-      }
-    }
-
-    // CCs are simpler than reviewers. They are removable if the ChangeControl
-    // would permit a non-negative approval by that account to be removed, in
-    // which case add them to removable. We don't need to add unremovable CCs to
-    // "fixed" because we only visit each CC once here.
-    Collection<AccountInfo> ccs = out.reviewers.get(ReviewerState.CC);
-    if (ccs != null) {
-      for (AccountInfo ai : ccs) {
-        if (ai._accountId != null) {
-          Account.Id id = new Account.Id(ai._accountId);
-          if (removeReviewerControl.testRemoveReviewer(cd, userProvider.get(), id, 0)) {
-            removable.add(id);
-          }
-        }
-      }
-    }
-
-    // Subtract any reviewers with non-removable approvals from the "removable"
-    // set. This also subtracts any CCs that for some reason also hold
-    // unremovable approvals.
-    removable.removeAll(fixed);
-
-    List<AccountInfo> result = Lists.newArrayListWithCapacity(removable.size());
-    for (Account.Id id : removable) {
-      result.add(accountLoader.get(id));
-    }
-    // Reviewers added by email are always removable
-    for (Collection<AccountInfo> infos : out.reviewers.values()) {
-      for (AccountInfo info : infos) {
-        if (info._accountId == null) {
-          result.add(info);
-        }
-      }
-    }
-    return result;
-  }
-
-  private Collection<AccountInfo> toAccountInfo(Collection<Account.Id> accounts) {
-    return accounts.stream()
-        .map(accountLoader::get)
-        .sorted(AccountInfoComparator.ORDER_NULLS_FIRST)
-        .collect(toList());
-  }
-
-  private Collection<AccountInfo> toAccountInfoByEmail(Collection<Address> addresses) {
-    return addresses.stream()
-        .map(a -> new AccountInfo(a.getName(), a.getEmail()))
-        .sorted(AccountInfoComparator.ORDER_NULLS_FIRST)
-        .collect(toList());
-  }
-
-  @Nullable
-  private Repository openRepoIfNecessary(Project.NameKey project) throws IOException {
-    if (has(ALL_COMMITS) || has(CURRENT_COMMIT) || has(COMMIT_FOOTERS)) {
-      return repoManager.openRepository(project);
-    }
-    return null;
-  }
-
-  @Nullable
-  private RevWalk newRevWalk(@Nullable Repository repo) {
-    return repo != null ? new RevWalk(repo) : null;
-  }
-
-  private Map<String, RevisionInfo> revisions(
-      ChangeData cd,
-      Map<PatchSet.Id, PatchSet> map,
-      Optional<PatchSet.Id> limitToPsId,
-      ChangeInfo changeInfo)
-      throws PatchListNotAvailableException, GpgException, OrmException, IOException,
-          PermissionBackendException {
-    Map<String, RevisionInfo> res = new LinkedHashMap<>();
-    Boolean isWorldReadable = null;
-    try (Repository repo = openRepoIfNecessary(cd.project());
-        RevWalk rw = newRevWalk(repo)) {
-      for (PatchSet in : map.values()) {
-        PatchSet.Id id = in.getId();
-        boolean want = false;
-        if (has(ALL_REVISIONS)) {
-          want = true;
-        } else if (limitToPsId.isPresent()) {
-          want = id.equals(limitToPsId.get());
-        } else {
-          want = id.equals(cd.change().currentPatchSetId());
-        }
-        if (want) {
-          if (isWorldReadable == null) {
-            isWorldReadable = isWorldReadable(cd);
-          }
-          res.put(
-              in.getRevision().get(),
-              toRevisionInfo(cd, in, repo, rw, false, changeInfo, isWorldReadable));
-        }
-      }
-      return res;
-    }
-  }
-
-  private Map<PatchSet.Id, PatchSet> loadPatchSets(ChangeData cd, Optional<PatchSet.Id> limitToPsId)
-      throws OrmException {
-    Collection<PatchSet> src;
-    if (has(ALL_REVISIONS) || has(MESSAGES)) {
-      src = cd.patchSets();
-    } else {
-      PatchSet ps;
-      if (limitToPsId.isPresent()) {
-        ps = cd.patchSet(limitToPsId.get());
-        if (ps == null) {
-          throw new OrmException("missing patch set " + limitToPsId.get());
-        }
-      } else {
-        ps = cd.currentPatchSet();
-        if (ps == null) {
-          throw new OrmException("missing current patch set for change " + cd.getId());
-        }
-      }
-      src = Collections.singletonList(ps);
-    }
-    Map<PatchSet.Id, PatchSet> map = Maps.newHashMapWithExpectedSize(src.size());
-    for (PatchSet patchSet : src) {
-      map.put(patchSet.getId(), patchSet);
-    }
-    return map;
-  }
-
-  public RevisionInfo getRevisionInfo(ChangeData cd, PatchSet in)
-      throws PatchListNotAvailableException, GpgException, OrmException, IOException,
-          PermissionBackendException {
-    accountLoader = accountLoaderFactory.create(has(DETAILED_ACCOUNTS));
-    try (Repository repo = openRepoIfNecessary(cd.project());
-        RevWalk rw = newRevWalk(repo)) {
-      RevisionInfo rev = toRevisionInfo(cd, in, repo, rw, true, null, isWorldReadable(cd));
-      accountLoader.fill();
-      return rev;
-    }
-  }
-
-  private RevisionInfo toRevisionInfo(
-      ChangeData cd,
-      PatchSet in,
-      @Nullable Repository repo,
-      @Nullable RevWalk rw,
-      boolean fillCommit,
-      @Nullable ChangeInfo changeInfo,
-      boolean isWorldReadable)
-      throws PatchListNotAvailableException, GpgException, OrmException, IOException {
-    Change c = cd.change();
-    RevisionInfo out = new RevisionInfo();
-    out.isCurrent = in.getId().equals(c.currentPatchSetId());
-    out._number = in.getId().get();
-    out.ref = in.getRefName();
-    out.created = in.getCreatedOn();
-    out.uploader = accountLoader.get(in.getUploader());
-    out.fetch = makeFetchMap(cd, in, isWorldReadable);
-    out.kind = changeKindCache.getChangeKind(rw, repo != null ? repo.getConfig() : null, cd, in);
-    out.description = in.getDescription();
-
-    boolean setCommit = has(ALL_COMMITS) || (out.isCurrent && has(CURRENT_COMMIT));
-    boolean addFooters = out.isCurrent && has(COMMIT_FOOTERS);
-    if (setCommit || addFooters) {
-      checkState(rw != null);
-      checkState(repo != null);
-      Project.NameKey project = c.getProject();
-      String rev = in.getRevision().get();
-      RevCommit commit = rw.parseCommit(ObjectId.fromString(rev));
-      rw.parseBody(commit);
-      if (setCommit) {
-        out.commit = toCommit(project, rw, commit, has(WEB_LINKS), fillCommit);
-      }
-      if (addFooters) {
-        Ref ref = repo.exactRef(cd.change().getDest().get());
-        RevCommit mergeTip = null;
-        if (ref != null) {
-          mergeTip = rw.parseCommit(ref.getObjectId());
-          rw.parseBody(mergeTip);
-        }
-        out.commitWithFooters =
-            mergeUtilFactory
-                .create(projectCache.get(project))
-                .createCommitMessageOnSubmit(
-                    commit, mergeTip, cd.notes(), userProvider.get(), in.getId());
-      }
-    }
-
-    if (has(ALL_FILES) || (out.isCurrent && has(CURRENT_FILES))) {
-      out.files = fileInfoJson.toFileInfoMap(c, in);
-      out.files.remove(Patch.COMMIT_MSG);
-      out.files.remove(Patch.MERGE_LIST);
-    }
-
-    if (out.isCurrent && has(CURRENT_ACTIONS) && userProvider.get().isIdentifiedUser()) {
-
-      actionJson.addRevisionActions(
-          changeInfo,
-          out,
-          new RevisionResource(changeResourceFactory.create(cd.notes(), userProvider.get()), in));
-    }
-
-    if (gpgApi.isEnabled() && has(PUSH_CERTIFICATES)) {
-      if (in.getPushCertificate() != null) {
-        out.pushCertificate =
-            gpgApi.checkPushCertificate(
-                in.getPushCertificate(), userFactory.create(in.getUploader()));
-      } else {
-        out.pushCertificate = new PushCertificateInfo();
-      }
-    }
-
-    return out;
-  }
-
-  CommitInfo toCommit(
-      Project.NameKey project, RevWalk rw, RevCommit commit, boolean addLinks, boolean fillCommit)
-      throws IOException {
-    CommitInfo info = new CommitInfo();
-    if (fillCommit) {
-      info.commit = commit.name();
-    }
-    info.parents = new ArrayList<>(commit.getParentCount());
-    info.author = toGitPerson(commit.getAuthorIdent());
-    info.committer = toGitPerson(commit.getCommitterIdent());
-    info.subject = commit.getShortMessage();
-    info.message = commit.getFullMessage();
-
-    if (addLinks) {
-      List<WebLinkInfo> links = webLinks.getPatchSetLinks(project, commit.name());
-      info.webLinks = links.isEmpty() ? null : links;
-    }
-
-    for (RevCommit parent : commit.getParents()) {
-      rw.parseBody(parent);
-      CommitInfo i = new CommitInfo();
-      i.commit = parent.name();
-      i.subject = parent.getShortMessage();
-      if (addLinks) {
-        List<WebLinkInfo> parentLinks = webLinks.getParentLinks(project, parent.name());
-        i.webLinks = parentLinks.isEmpty() ? null : parentLinks;
-      }
-      info.parents.add(i);
-    }
-    return info;
-  }
-
-  private Map<String, FetchInfo> makeFetchMap(ChangeData cd, PatchSet in, boolean isWorldReadable) {
-    Map<String, FetchInfo> r = new LinkedHashMap<>();
-    for (DynamicMap.Entry<DownloadScheme> e : downloadSchemes) {
-      String schemeName = e.getExportName();
-      DownloadScheme scheme = e.getProvider().get();
-      if (!scheme.isEnabled()
-          || (scheme.isAuthRequired() && !userProvider.get().isIdentifiedUser())) {
-        continue;
-      }
-      if (!scheme.isAuthSupported() && !isWorldReadable) {
-        continue;
-      }
-
-      String projectName = cd.project().get();
-      String url = scheme.getUrl(projectName);
-      String refName = in.getRefName();
-      FetchInfo fetchInfo = new FetchInfo(url, refName);
-      r.put(schemeName, fetchInfo);
-
-      if (has(DOWNLOAD_COMMANDS)) {
-        populateFetchMap(scheme, downloadCommands, projectName, refName, fetchInfo);
-      }
-    }
-
-    return r;
-  }
-
-  public static void populateFetchMap(
-      DownloadScheme scheme,
-      DynamicMap<DownloadCommand> commands,
-      String projectName,
-      String refName,
-      FetchInfo fetchInfo) {
-    for (DynamicMap.Entry<DownloadCommand> e2 : commands) {
-      String commandName = e2.getExportName();
-      DownloadCommand command = e2.getProvider().get();
-      String c = command.getCommand(scheme, projectName, refName);
-      if (c != null) {
-        addCommand(fetchInfo, commandName, c);
-      }
-    }
-  }
-
-  private static void addCommand(FetchInfo fetchInfo, String commandName, String c) {
-    if (fetchInfo.commands == null) {
-      fetchInfo.commands = new TreeMap<>();
-    }
-    fetchInfo.commands.put(commandName, c);
-  }
-
-  static void finish(ChangeInfo info) {
-    info.id =
-        Joiner.on('~')
-            .join(Url.encode(info.project), Url.encode(info.branch), Url.encode(info.changeId));
-  }
-
-  private static void addApproval(LabelInfo label, ApprovalInfo approval) {
-    if (label.all == null) {
-      label.all = new ArrayList<>();
-    }
-    label.all.add(approval);
-  }
-
-  /**
-   * @return {@link com.google.gerrit.server.permissions.PermissionBackend.ForChange} constructed
-   *     from either an index-backed or a database-backed {@link ChangeData} depending on {@code
-   *     lazyload}.
-   */
-  private PermissionBackend.ForChange permissionBackendForChange(CurrentUser user, ChangeData cd)
-      throws OrmException {
-    PermissionBackend.WithUser withUser = permissionBackend.user(user).database(db);
-    return lazyLoad
-        ? withUser.change(cd)
-        : withUser.indexedChange(cd, notesFactory.createFromIndexedChange(cd.change()));
-  }
-
-  private boolean isWorldReadable(ChangeData cd) throws OrmException, PermissionBackendException {
-    try {
-      permissionBackendForChange(anonymous, cd).check(ChangePermission.READ);
-      return true;
-    } catch (AuthException ae) {
-      return false;
-    }
-  }
-
-  @AutoValue
-  abstract static class LabelWithStatus {
-    private static LabelWithStatus create(LabelInfo label, SubmitRecord.Label.Status status) {
-      return new AutoValue_ChangeJson_LabelWithStatus(label, status);
-    }
-
-    abstract LabelInfo label();
-
-    @Nullable
-    abstract SubmitRecord.Label.Status status();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeKindCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeKindCacheImpl.java
deleted file mode 100644
index 89fcb6d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeKindCacheImpl.java
+++ /dev/null
@@ -1,456 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.change;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.eclipse.jgit.lib.ObjectIdSerialization.readNotNull;
-import static org.eclipse.jgit.lib.ObjectIdSerialization.writeNotNull;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.cache.Cache;
-import com.google.common.cache.Weigher;
-import com.google.common.collect.FluentIterable;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.client.ChangeKind;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.cache.CacheModule;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.InMemoryInserter;
-import com.google.gerrit.server.git.MergeUtil;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Module;
-import com.google.inject.name.Named;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Objects;
-import java.util.Set;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import org.eclipse.jgit.errors.LargeObjectException;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.merge.ThreeWayMerger;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ChangeKindCacheImpl implements ChangeKindCache {
-  private static final Logger log = LoggerFactory.getLogger(ChangeKindCacheImpl.class);
-
-  private static final String ID_CACHE = "change_kind";
-
-  public static Module module() {
-    return new CacheModule() {
-      @Override
-      protected void configure() {
-        bind(ChangeKindCache.class).to(ChangeKindCacheImpl.class);
-        persist(ID_CACHE, Key.class, ChangeKind.class)
-            .maximumWeight(2 << 20)
-            .weigher(ChangeKindWeigher.class);
-      }
-    };
-  }
-
-  @VisibleForTesting
-  public static class NoCache implements ChangeKindCache {
-    private final boolean useRecursiveMerge;
-    private final ChangeData.Factory changeDataFactory;
-    private final GitRepositoryManager repoManager;
-
-    @Inject
-    NoCache(
-        @GerritServerConfig Config serverConfig,
-        ChangeData.Factory changeDataFactory,
-        GitRepositoryManager repoManager) {
-      this.useRecursiveMerge = MergeUtil.useRecursiveMerge(serverConfig);
-      this.changeDataFactory = changeDataFactory;
-      this.repoManager = repoManager;
-    }
-
-    @Override
-    public ChangeKind getChangeKind(
-        Project.NameKey project,
-        @Nullable RevWalk rw,
-        @Nullable Config repoConfig,
-        ObjectId prior,
-        ObjectId next) {
-      try {
-        Key key = new Key(prior, next, useRecursiveMerge);
-        return new Loader(key, repoManager, project, rw, repoConfig).call();
-      } catch (IOException e) {
-        log.warn(
-            "Cannot check trivial rebase of new patch set " + next.name() + " in " + project, e);
-        return ChangeKind.REWORK;
-      }
-    }
-
-    @Override
-    public ChangeKind getChangeKind(ReviewDb db, Change change, PatchSet patch) {
-      return getChangeKindInternal(this, db, change, patch, changeDataFactory, repoManager);
-    }
-
-    @Override
-    public ChangeKind getChangeKind(
-        @Nullable RevWalk rw, @Nullable Config repoConfig, ChangeData cd, PatchSet patch) {
-      return getChangeKindInternal(this, rw, repoConfig, cd, patch);
-    }
-  }
-
-  public static class Key implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    private transient ObjectId prior;
-    private transient ObjectId next;
-    private transient String strategyName;
-
-    private Key(ObjectId prior, ObjectId next, boolean useRecursiveMerge) {
-      checkNotNull(next, "next");
-      String strategyName = MergeUtil.mergeStrategyName(true, useRecursiveMerge);
-      this.prior = prior.copy();
-      this.next = next.copy();
-      this.strategyName = strategyName;
-    }
-
-    public Key(ObjectId prior, ObjectId next, String strategyName) {
-      this.prior = prior;
-      this.next = next;
-      this.strategyName = strategyName;
-    }
-
-    public ObjectId getPrior() {
-      return prior;
-    }
-
-    public ObjectId getNext() {
-      return next;
-    }
-
-    public String getStrategyName() {
-      return strategyName;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-      if (o instanceof Key) {
-        Key k = (Key) o;
-        return Objects.equals(prior, k.prior)
-            && Objects.equals(next, k.next)
-            && Objects.equals(strategyName, k.strategyName);
-      }
-      return false;
-    }
-
-    @Override
-    public int hashCode() {
-      return Objects.hash(prior, next, strategyName);
-    }
-
-    private void writeObject(ObjectOutputStream out) throws IOException {
-      writeNotNull(out, prior);
-      writeNotNull(out, next);
-      out.writeUTF(strategyName);
-    }
-
-    private void readObject(ObjectInputStream in) throws IOException {
-      prior = readNotNull(in);
-      next = readNotNull(in);
-      strategyName = in.readUTF();
-    }
-  }
-
-  private static class Loader implements Callable<ChangeKind> {
-    private final Key key;
-    private final GitRepositoryManager repoManager;
-    private final Project.NameKey projectName;
-    private final RevWalk alreadyOpenRw;
-    private final Config repoConfig;
-
-    private Loader(
-        Key key,
-        GitRepositoryManager repoManager,
-        Project.NameKey projectName,
-        @Nullable RevWalk rw,
-        @Nullable Config repoConfig) {
-      checkArgument(
-          (rw == null && repoConfig == null) || (rw != null && repoConfig != null),
-          "must either provide both revwalk/config, or neither; got %s/%s",
-          rw,
-          repoConfig);
-      this.key = key;
-      this.repoManager = repoManager;
-      this.projectName = projectName;
-      this.alreadyOpenRw = rw;
-      this.repoConfig = repoConfig;
-    }
-
-    @SuppressWarnings("resource") // Resources are manually managed.
-    @Override
-    public ChangeKind call() throws IOException {
-      if (Objects.equals(key.prior, key.next)) {
-        return ChangeKind.NO_CODE_CHANGE;
-      }
-
-      RevWalk rw = alreadyOpenRw;
-      Config config = repoConfig;
-      Repository repo = null;
-      if (alreadyOpenRw == null) {
-        repo = repoManager.openRepository(projectName);
-        rw = new RevWalk(repo);
-        config = repo.getConfig();
-      }
-      try {
-        RevCommit prior = rw.parseCommit(key.prior);
-        rw.parseBody(prior);
-        RevCommit next = rw.parseCommit(key.next);
-        rw.parseBody(next);
-
-        if (!next.getFullMessage().equals(prior.getFullMessage())) {
-          if (isSameDeltaAndTree(prior, next)) {
-            return ChangeKind.NO_CODE_CHANGE;
-          }
-          return ChangeKind.REWORK;
-        }
-
-        if (isSameDeltaAndTree(prior, next)) {
-          return ChangeKind.NO_CHANGE;
-        }
-
-        if (prior.getParentCount() == 0 || next.getParentCount() == 0) {
-          // At this point we have considered all the kinds that could be applicable to root
-          // commits; the remainder of the checks in this method all assume that both commits have
-          // at least one parent.
-          return ChangeKind.REWORK;
-        }
-
-        if ((prior.getParentCount() > 1 || next.getParentCount() > 1)
-            && !onlyFirstParentChanged(prior, next)) {
-          // Trivial rebases done by machine only work well on 1 parent.
-          return ChangeKind.REWORK;
-        }
-
-        // A trivial rebase can be detected by looking for the next commit
-        // having the same tree as would exist when the prior commit is
-        // cherry-picked onto the next commit's new first parent.
-        try (ObjectInserter ins = new InMemoryInserter(rw.getObjectReader())) {
-          ThreeWayMerger merger = MergeUtil.newThreeWayMerger(ins, config, key.strategyName);
-          merger.setBase(prior.getParent(0));
-          if (merger.merge(next.getParent(0), prior)
-              && merger.getResultTreeId().equals(next.getTree())) {
-            if (prior.getParentCount() == 1) {
-              return ChangeKind.TRIVIAL_REBASE;
-            }
-            return ChangeKind.MERGE_FIRST_PARENT_UPDATE;
-          }
-        } catch (LargeObjectException e) {
-          // Some object is too large for the merge attempt to succeed. Assume
-          // it was a rework.
-        }
-        return ChangeKind.REWORK;
-      } finally {
-        if (repo != null) {
-          rw.close();
-          repo.close();
-        }
-      }
-    }
-
-    public static boolean onlyFirstParentChanged(RevCommit prior, RevCommit next) {
-      return !sameFirstParents(prior, next) && sameRestOfParents(prior, next);
-    }
-
-    private static boolean sameFirstParents(RevCommit prior, RevCommit next) {
-      if (prior.getParentCount() == 0) {
-        return next.getParentCount() == 0;
-      }
-      return prior.getParent(0).equals(next.getParent(0));
-    }
-
-    private static boolean sameRestOfParents(RevCommit prior, RevCommit next) {
-      Set<RevCommit> priorRestParents = allExceptFirstParent(prior.getParents());
-      Set<RevCommit> nextRestParents = allExceptFirstParent(next.getParents());
-      return priorRestParents.equals(nextRestParents);
-    }
-
-    private static Set<RevCommit> allExceptFirstParent(RevCommit[] parents) {
-      return FluentIterable.from(Arrays.asList(parents)).skip(1).toSet();
-    }
-
-    private static boolean isSameDeltaAndTree(RevCommit prior, RevCommit next) {
-      if (next.getTree() != prior.getTree()) {
-        return false;
-      }
-
-      if (prior.getParentCount() != next.getParentCount()) {
-        return false;
-      } else if (prior.getParentCount() == 0) {
-        return true;
-      }
-
-      // Make sure that the prior/next delta is the same - not just the tree.
-      // This is done by making sure that the parent trees are equal.
-      for (int i = 0; i < prior.getParentCount(); i++) {
-        if (next.getParent(i).getTree() != prior.getParent(i).getTree()) {
-          return false;
-        }
-      }
-      return true;
-    }
-  }
-
-  public static class ChangeKindWeigher implements Weigher<Key, ChangeKind> {
-    @Override
-    public int weigh(Key key, ChangeKind changeKind) {
-      return 16
-          + 2 * 36
-          + 2 * key.strategyName.length() // Size of Key, 64 bit JVM
-          + 2 * changeKind.name().length(); // Size of ChangeKind, 64 bit JVM
-    }
-  }
-
-  private final Cache<Key, ChangeKind> cache;
-  private final boolean useRecursiveMerge;
-  private final ChangeData.Factory changeDataFactory;
-  private final GitRepositoryManager repoManager;
-
-  @Inject
-  ChangeKindCacheImpl(
-      @GerritServerConfig Config serverConfig,
-      @Named(ID_CACHE) Cache<Key, ChangeKind> cache,
-      ChangeData.Factory changeDataFactory,
-      GitRepositoryManager repoManager) {
-    this.cache = cache;
-    this.useRecursiveMerge = MergeUtil.useRecursiveMerge(serverConfig);
-    this.changeDataFactory = changeDataFactory;
-    this.repoManager = repoManager;
-  }
-
-  @Override
-  public ChangeKind getChangeKind(
-      Project.NameKey project,
-      @Nullable RevWalk rw,
-      @Nullable Config repoConfig,
-      ObjectId prior,
-      ObjectId next) {
-    try {
-      Key key = new Key(prior, next, useRecursiveMerge);
-      return cache.get(key, new Loader(key, repoManager, project, rw, repoConfig));
-    } catch (ExecutionException e) {
-      log.warn("Cannot check trivial rebase of new patch set " + next.name() + " in " + project, e);
-      return ChangeKind.REWORK;
-    }
-  }
-
-  @Override
-  public ChangeKind getChangeKind(ReviewDb db, Change change, PatchSet patch) {
-    return getChangeKindInternal(this, db, change, patch, changeDataFactory, repoManager);
-  }
-
-  @Override
-  public ChangeKind getChangeKind(
-      @Nullable RevWalk rw, @Nullable Config repoConfig, ChangeData cd, PatchSet patch) {
-    return getChangeKindInternal(this, rw, repoConfig, cd, patch);
-  }
-
-  private static ChangeKind getChangeKindInternal(
-      ChangeKindCache cache,
-      @Nullable RevWalk rw,
-      @Nullable Config repoConfig,
-      ChangeData change,
-      PatchSet patch) {
-    ChangeKind kind = ChangeKind.REWORK;
-    // Trivial case: if we're on the first patch, we don't need to use
-    // the repository.
-    if (patch.getId().get() > 1) {
-      try {
-        Collection<PatchSet> patchSetCollection = change.patchSets();
-        PatchSet priorPs = patch;
-        for (PatchSet ps : patchSetCollection) {
-          if (ps.getId().get() < patch.getId().get()
-              && (ps.getId().get() > priorPs.getId().get() || priorPs == patch)) {
-            // We only want the previous patch set, so walk until the last one
-            priorPs = ps;
-          }
-        }
-
-        // If we still think the previous patch is the current patch,
-        // we only have one patch set.  Return the default.
-        // This can happen if a user creates a draft, uploads a second patch,
-        // and deletes the draft.
-        if (priorPs != patch) {
-          kind =
-              cache.getChangeKind(
-                  change.project(),
-                  rw,
-                  repoConfig,
-                  ObjectId.fromString(priorPs.getRevision().get()),
-                  ObjectId.fromString(patch.getRevision().get()));
-        }
-      } catch (OrmException e) {
-        // Do nothing; assume we have a complex change
-        log.warn(
-            "Unable to get change kind for patchSet "
-                + patch.getPatchSetId()
-                + "of change "
-                + change.getId(),
-            e);
-      }
-    }
-    return kind;
-  }
-
-  private static ChangeKind getChangeKindInternal(
-      ChangeKindCache cache,
-      ReviewDb db,
-      Change change,
-      PatchSet patch,
-      ChangeData.Factory changeDataFactory,
-      GitRepositoryManager repoManager) {
-    // TODO - dborowitz: add NEW_CHANGE type for default.
-    ChangeKind kind = ChangeKind.REWORK;
-    // Trivial case: if we're on the first patch, we don't need to open
-    // the repository.
-    if (patch.getId().get() > 1) {
-      try (Repository repo = repoManager.openRepository(change.getProject());
-          RevWalk rw = new RevWalk(repo)) {
-        kind =
-            getChangeKindInternal(
-                cache, rw, repo.getConfig(), changeDataFactory.create(db, change), patch);
-      } catch (IOException e) {
-        // Do nothing; assume we have a complex change
-        log.warn(
-            "Unable to get change kind for patchSet "
-                + patch.getPatchSetId()
-                + "of change "
-                + change.getChangeId(),
-            e);
-      }
-    }
-    return kind;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeResource.java
deleted file mode 100644
index 8c70ad8..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeResource.java
+++ /dev/null
@@ -1,216 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.change;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.collect.ImmutableList;
-import com.google.common.hash.Hasher;
-import com.google.common.hash.Hashing;
-import com.google.gerrit.extensions.restapi.RestResource;
-import com.google.gerrit.extensions.restapi.RestResource.HasETag;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.StarredChangesUtil;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.TypeLiteral;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.util.HashSet;
-import java.util.Set;
-import org.eclipse.jgit.lib.ObjectId;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ChangeResource implements RestResource, HasETag {
-  private static final Logger log = LoggerFactory.getLogger(ChangeResource.class);
-
-  /**
-   * JSON format version number for ETag computations.
-   *
-   * <p>Should be bumped on any JSON format change (new fields, etc.) so that otherwise unmodified
-   * changes get new ETags.
-   */
-  public static final int JSON_FORMAT_VERSION = 1;
-
-  public static final TypeLiteral<RestView<ChangeResource>> CHANGE_KIND =
-      new TypeLiteral<RestView<ChangeResource>>() {};
-
-  public interface Factory {
-    ChangeResource create(ChangeNotes notes, CurrentUser user);
-  }
-
-  private static final String ZERO_ID_STRING = ObjectId.zeroId().name();
-
-  private final Provider<ReviewDb> db;
-  private final AccountCache accountCache;
-  private final ApprovalsUtil approvalUtil;
-  private final PatchSetUtil patchSetUtil;
-  private final PermissionBackend permissionBackend;
-  private final StarredChangesUtil starredChangesUtil;
-  private final ProjectCache projectCache;
-  private final ChangeNotes notes;
-  private final CurrentUser user;
-
-  @Inject
-  ChangeResource(
-      Provider<ReviewDb> db,
-      AccountCache accountCache,
-      ApprovalsUtil approvalUtil,
-      PatchSetUtil patchSetUtil,
-      PermissionBackend permissionBackend,
-      StarredChangesUtil starredChangesUtil,
-      ProjectCache projectCache,
-      @Assisted ChangeNotes notes,
-      @Assisted CurrentUser user) {
-    this.db = db;
-    this.accountCache = accountCache;
-    this.approvalUtil = approvalUtil;
-    this.patchSetUtil = patchSetUtil;
-    this.permissionBackend = permissionBackend;
-    this.starredChangesUtil = starredChangesUtil;
-    this.projectCache = projectCache;
-    this.notes = notes;
-    this.user = user;
-  }
-
-  public PermissionBackend.ForChange permissions() {
-    return permissionBackend.user(user).change(notes);
-  }
-
-  public CurrentUser getUser() {
-    return user;
-  }
-
-  public Change.Id getId() {
-    return notes.getChangeId();
-  }
-
-  /** @return true if {@link #getUser()} is the change's owner. */
-  public boolean isUserOwner() {
-    Account.Id owner = getChange().getOwner();
-    return user.isIdentifiedUser() && user.asIdentifiedUser().getAccountId().equals(owner);
-  }
-
-  public Change getChange() {
-    return notes.getChange();
-  }
-
-  public Project.NameKey getProject() {
-    return getChange().getProject();
-  }
-
-  public ChangeNotes getNotes() {
-    return notes;
-  }
-
-  // This includes all information relevant for ETag computation
-  // unrelated to the UI.
-  public void prepareETag(Hasher h, CurrentUser user) {
-    h.putInt(JSON_FORMAT_VERSION)
-        .putLong(getChange().getLastUpdatedOn().getTime())
-        .putInt(getChange().getRowVersion())
-        .putInt(user.isIdentifiedUser() ? user.getAccountId().get() : 0);
-
-    if (user.isIdentifiedUser()) {
-      for (AccountGroup.UUID uuid : user.getEffectiveGroups().getKnownGroups()) {
-        h.putBytes(uuid.get().getBytes(UTF_8));
-      }
-    }
-
-    byte[] buf = new byte[20];
-    Set<Account.Id> accounts = new HashSet<>();
-    accounts.add(getChange().getOwner());
-    if (getChange().getAssignee() != null) {
-      accounts.add(getChange().getAssignee());
-    }
-    try {
-      patchSetUtil.byChange(db.get(), notes).stream()
-          .map(ps -> ps.getUploader())
-          .forEach(accounts::add);
-
-      // It's intentional to include the states for *all* reviewers into the ETag computation.
-      // We need the states of all current reviewers and CCs because they are part of ChangeInfo.
-      // Including removed reviewers is a cheap way of making sure that the states of accounts that
-      // posted a message on the change are included. Loading all change messages to find the exact
-      // set of accounts that posted a message is too expensive. However everyone who posts a
-      // message is automatically added as reviewer. Hence if we include removed reviewers we can
-      // be sure that we have all accounts that posted messages on the change.
-      accounts.addAll(approvalUtil.getReviewers(db.get(), notes).all());
-    } catch (OrmException e) {
-      // This ETag will be invalidated if it loads next time.
-    }
-    accounts.stream().forEach(a -> hashAccount(h, accountCache.get(a), buf));
-
-    ObjectId noteId;
-    try {
-      noteId = notes.loadRevision();
-    } catch (OrmException e) {
-      noteId = null; // This ETag will be invalidated if it loads next time.
-    }
-    hashObjectId(h, noteId, buf);
-    // TODO(dborowitz): Include more NoteDb and other related refs, e.g. drafts
-    // and edits.
-
-    Iterable<ProjectState> projectStateTree;
-    try {
-      projectStateTree = projectCache.checkedGet(getProject()).tree();
-    } catch (IOException e) {
-      log.error("could not load project {} while computing etag", getProject());
-      projectStateTree = ImmutableList.of();
-    }
-
-    for (ProjectState p : projectStateTree) {
-      hashObjectId(h, p.getConfig().getRevision(), buf);
-    }
-  }
-
-  @Override
-  public String getETag() {
-    Hasher h = Hashing.murmur3_128().newHasher();
-    if (user.isIdentifiedUser()) {
-      h.putString(starredChangesUtil.getObjectId(user.getAccountId(), getId()).name(), UTF_8);
-    }
-    prepareETag(h, user);
-    return h.hash().toString();
-  }
-
-  private void hashObjectId(Hasher h, ObjectId id, byte[] buf) {
-    MoreObjects.firstNonNull(id, ObjectId.zeroId()).copyRawTo(buf, 0);
-    h.putBytes(buf);
-  }
-
-  private void hashAccount(Hasher h, AccountState accountState, byte[] buf) {
-    h.putString(
-        MoreObjects.firstNonNull(accountState.getAccount().getMetaId(), ZERO_ID_STRING), UTF_8);
-    accountState.getExternalIds().stream().forEach(e -> hashObjectId(h, e.blobId(), buf));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangesCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangesCollection.java
deleted file mode 100644
index 805512e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangesCollection.java
+++ /dev/null
@@ -1,131 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AcceptsPost;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestCollection;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ChangeFinder;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.query.change.QueryChanges;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.List;
-
-@Singleton
-public class ChangesCollection
-    implements RestCollection<TopLevelResource, ChangeResource>, AcceptsPost<TopLevelResource> {
-  private final Provider<ReviewDb> db;
-  private final Provider<CurrentUser> user;
-  private final Provider<QueryChanges> queryFactory;
-  private final DynamicMap<RestView<ChangeResource>> views;
-  private final ChangeFinder changeFinder;
-  private final CreateChange createChange;
-  private final ChangeResource.Factory changeResourceFactory;
-  private final PermissionBackend permissionBackend;
-
-  @Inject
-  ChangesCollection(
-      Provider<ReviewDb> db,
-      Provider<CurrentUser> user,
-      Provider<QueryChanges> queryFactory,
-      DynamicMap<RestView<ChangeResource>> views,
-      ChangeFinder changeFinder,
-      CreateChange createChange,
-      ChangeResource.Factory changeResourceFactory,
-      PermissionBackend permissionBackend) {
-    this.db = db;
-    this.user = user;
-    this.queryFactory = queryFactory;
-    this.views = views;
-    this.changeFinder = changeFinder;
-    this.createChange = createChange;
-    this.changeResourceFactory = changeResourceFactory;
-    this.permissionBackend = permissionBackend;
-  }
-
-  @Override
-  public QueryChanges list() {
-    return queryFactory.get();
-  }
-
-  @Override
-  public DynamicMap<RestView<ChangeResource>> views() {
-    return views;
-  }
-
-  @Override
-  public ChangeResource parse(TopLevelResource root, IdString id)
-      throws ResourceNotFoundException, OrmException, PermissionBackendException {
-    List<ChangeNotes> notes = changeFinder.find(id.encoded());
-    if (notes.isEmpty()) {
-      throw new ResourceNotFoundException(id);
-    } else if (notes.size() != 1) {
-      throw new ResourceNotFoundException("Multiple changes found for " + id);
-    }
-
-    ChangeNotes change = notes.get(0);
-    if (!canRead(change)) {
-      throw new ResourceNotFoundException(id);
-    }
-    return changeResourceFactory.create(change, user.get());
-  }
-
-  public ChangeResource parse(Change.Id id)
-      throws ResourceNotFoundException, OrmException, PermissionBackendException {
-    List<ChangeNotes> notes = changeFinder.find(id);
-    if (notes.isEmpty()) {
-      throw new ResourceNotFoundException(toIdString(id));
-    } else if (notes.size() != 1) {
-      throw new ResourceNotFoundException("Multiple changes found for " + id);
-    }
-
-    ChangeNotes change = notes.get(0);
-    if (!canRead(change)) {
-      throw new ResourceNotFoundException(toIdString(id));
-    }
-    return changeResourceFactory.create(change, user.get());
-  }
-
-  private static IdString toIdString(Change.Id id) {
-    return IdString.fromDecoded(id.toString());
-  }
-
-  public ChangeResource parse(ChangeNotes notes, CurrentUser user) {
-    return changeResourceFactory.create(notes, user);
-  }
-
-  @Override
-  public CreateChange post(TopLevelResource parent) throws RestApiException {
-    return createChange;
-  }
-
-  private boolean canRead(ChangeNotes notes) throws PermissionBackendException {
-    return permissionBackend.user(user).change(notes).database(db).test(ChangePermission.READ);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Check.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Check.java
deleted file mode 100644
index 157928b..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Check.java
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.api.changes.FixInput;
-import com.google.gerrit.extensions.client.ListChangesOption;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-
-public class Check
-    implements RestReadView<ChangeResource>, RestModifyView<ChangeResource, FixInput> {
-  private final PermissionBackend permissionBackend;
-  private final Provider<CurrentUser> user;
-  private final ChangeJson.Factory jsonFactory;
-  private final ProjectControl.GenericFactory projectControlFactory;
-
-  @Inject
-  Check(
-      PermissionBackend permissionBackend,
-      Provider<CurrentUser> user,
-      ChangeJson.Factory json,
-      ProjectControl.GenericFactory projectControlFactory) {
-    this.permissionBackend = permissionBackend;
-    this.user = user;
-    this.jsonFactory = json;
-    this.projectControlFactory = projectControlFactory;
-  }
-
-  @Override
-  public Response<ChangeInfo> apply(ChangeResource rsrc) throws RestApiException, OrmException {
-    return Response.withMustRevalidate(newChangeJson().format(rsrc));
-  }
-
-  @Override
-  public Response<ChangeInfo> apply(ChangeResource rsrc, FixInput input)
-      throws RestApiException, OrmException, PermissionBackendException, NoSuchProjectException,
-          IOException {
-    if (!rsrc.isUserOwner()
-        && !projectControlFactory.controlFor(rsrc.getProject(), rsrc.getUser()).isOwner()) {
-      permissionBackend.user(user).check(GlobalPermission.MAINTAIN_SERVER);
-    }
-    return Response.withMustRevalidate(newChangeJson().fix(input).format(rsrc));
-  }
-
-  private ChangeJson newChangeJson() {
-    return jsonFactory.create(ListChangesOption.CHECK);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPick.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPick.java
deleted file mode 100644
index 7fffd3a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPick.java
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.change;
-
-import static com.google.gerrit.extensions.conditions.BooleanCondition.and;
-
-import com.google.gerrit.extensions.api.changes.CherryPickInput;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.webui.UiAction;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.git.IntegrationException;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.ProjectPermission;
-import com.google.gerrit.server.permissions.RefPermission;
-import com.google.gerrit.server.project.ContributorAgreementsChecker;
-import com.google.gerrit.server.project.InvalidChangeOperationException;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.RetryingRestModifyView;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-@Singleton
-public class CherryPick
-    extends RetryingRestModifyView<RevisionResource, CherryPickInput, ChangeInfo>
-    implements UiAction<RevisionResource> {
-  private final PermissionBackend permissionBackend;
-  private final Provider<CurrentUser> user;
-  private final CherryPickChange cherryPickChange;
-  private final ChangeJson.Factory json;
-  private final ContributorAgreementsChecker contributorAgreements;
-
-  @Inject
-  CherryPick(
-      PermissionBackend permissionBackend,
-      Provider<CurrentUser> user,
-      RetryHelper retryHelper,
-      CherryPickChange cherryPickChange,
-      ChangeJson.Factory json,
-      ContributorAgreementsChecker contributorAgreements) {
-    super(retryHelper);
-    this.permissionBackend = permissionBackend;
-    this.user = user;
-    this.cherryPickChange = cherryPickChange;
-    this.json = json;
-    this.contributorAgreements = contributorAgreements;
-  }
-
-  @Override
-  public ChangeInfo applyImpl(
-      BatchUpdate.Factory updateFactory, RevisionResource rsrc, CherryPickInput input)
-      throws OrmException, IOException, UpdateException, RestApiException,
-          PermissionBackendException, ConfigInvalidException, NoSuchProjectException {
-    input.parent = input.parent == null ? 1 : input.parent;
-    if (input.message == null || input.message.trim().isEmpty()) {
-      throw new BadRequestException("message must be non-empty");
-    } else if (input.destination == null || input.destination.trim().isEmpty()) {
-      throw new BadRequestException("destination must be non-empty");
-    }
-
-    String refName = RefNames.fullName(input.destination);
-    contributorAgreements.check(rsrc.getProject(), rsrc.getUser());
-
-    permissionBackend
-        .user(user)
-        .project(rsrc.getChange().getProject())
-        .ref(refName)
-        .check(RefPermission.CREATE_CHANGE);
-
-    try {
-      Change.Id cherryPickedChangeId =
-          cherryPickChange.cherryPick(
-              updateFactory,
-              rsrc.getChange(),
-              rsrc.getPatchSet(),
-              input,
-              new Branch.NameKey(rsrc.getProject(), refName));
-      return json.noOptions().format(rsrc.getProject(), cherryPickedChangeId);
-    } catch (InvalidChangeOperationException e) {
-      throw new BadRequestException(e.getMessage());
-    } catch (IntegrationException | NoSuchChangeException e) {
-      throw new ResourceConflictException(e.getMessage());
-    }
-  }
-
-  @Override
-  public UiAction.Description getDescription(RevisionResource rsrc) {
-    return new UiAction.Description()
-        .setLabel("Cherry Pick")
-        .setTitle("Cherry pick change to a different branch")
-        .setVisible(
-            and(
-                rsrc.isCurrent(),
-                permissionBackend
-                    .user(user)
-                    .project(rsrc.getProject())
-                    .testCond(ProjectPermission.CREATE_CHANGE)));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPickChange.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPickChange.java
deleted file mode 100644
index 4eca6aa..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPickChange.java
+++ /dev/null
@@ -1,415 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.change;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.common.FooterConstants;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.api.changes.CherryPickInput;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.MergeConflictException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Change.Status;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.ChangeUtil;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.ReviewerSet;
-import com.google.gerrit.server.Sequences;
-import com.google.gerrit.server.git.CodeReviewCommit;
-import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.IntegrationException;
-import com.google.gerrit.server.git.MergeIdenticalTreeException;
-import com.google.gerrit.server.git.MergeUtil;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.ReviewerStateInternal;
-import com.google.gerrit.server.project.InvalidChangeOperationException;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.InternalChangeQuery;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.TimeZone;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.InvalidObjectIdException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.util.ChangeIdUtil;
-
-@Singleton
-public class CherryPickChange {
-
-  private final Provider<ReviewDb> dbProvider;
-  private final Sequences seq;
-  private final Provider<InternalChangeQuery> queryProvider;
-  private final GitRepositoryManager gitManager;
-  private final TimeZone serverTimeZone;
-  private final Provider<IdentifiedUser> user;
-  private final ChangeInserter.Factory changeInserterFactory;
-  private final PatchSetInserter.Factory patchSetInserterFactory;
-  private final MergeUtil.Factory mergeUtilFactory;
-  private final ChangeNotes.Factory changeNotesFactory;
-  private final ProjectControl.GenericFactory projectControlFactory;
-  private final ApprovalsUtil approvalsUtil;
-  private final ChangeMessagesUtil changeMessagesUtil;
-  private final NotifyUtil notifyUtil;
-
-  @Inject
-  CherryPickChange(
-      Provider<ReviewDb> dbProvider,
-      Sequences seq,
-      Provider<InternalChangeQuery> queryProvider,
-      @GerritPersonIdent PersonIdent myIdent,
-      GitRepositoryManager gitManager,
-      Provider<IdentifiedUser> user,
-      ChangeInserter.Factory changeInserterFactory,
-      PatchSetInserter.Factory patchSetInserterFactory,
-      MergeUtil.Factory mergeUtilFactory,
-      ChangeNotes.Factory changeNotesFactory,
-      ProjectControl.GenericFactory projectControlFactory,
-      ApprovalsUtil approvalsUtil,
-      ChangeMessagesUtil changeMessagesUtil,
-      NotifyUtil notifyUtil) {
-    this.dbProvider = dbProvider;
-    this.seq = seq;
-    this.queryProvider = queryProvider;
-    this.gitManager = gitManager;
-    this.serverTimeZone = myIdent.getTimeZone();
-    this.user = user;
-    this.changeInserterFactory = changeInserterFactory;
-    this.patchSetInserterFactory = patchSetInserterFactory;
-    this.mergeUtilFactory = mergeUtilFactory;
-    this.changeNotesFactory = changeNotesFactory;
-    this.projectControlFactory = projectControlFactory;
-    this.approvalsUtil = approvalsUtil;
-    this.changeMessagesUtil = changeMessagesUtil;
-    this.notifyUtil = notifyUtil;
-  }
-
-  public Change.Id cherryPick(
-      BatchUpdate.Factory batchUpdateFactory,
-      Change change,
-      PatchSet patch,
-      CherryPickInput input,
-      Branch.NameKey dest)
-      throws OrmException, IOException, InvalidChangeOperationException, IntegrationException,
-          UpdateException, RestApiException, ConfigInvalidException, NoSuchProjectException {
-    return cherryPick(
-        batchUpdateFactory,
-        change,
-        patch.getId(),
-        change.getProject(),
-        ObjectId.fromString(patch.getRevision().get()),
-        input,
-        dest);
-  }
-
-  public Change.Id cherryPick(
-      BatchUpdate.Factory batchUpdateFactory,
-      @Nullable Change sourceChange,
-      @Nullable PatchSet.Id sourcePatchId,
-      Project.NameKey project,
-      ObjectId sourceCommit,
-      CherryPickInput input,
-      Branch.NameKey dest)
-      throws OrmException, IOException, InvalidChangeOperationException, IntegrationException,
-          UpdateException, RestApiException, ConfigInvalidException, NoSuchProjectException {
-
-    IdentifiedUser identifiedUser = user.get();
-    try (Repository git = gitManager.openRepository(project);
-        // This inserter and revwalk *must* be passed to any BatchUpdates
-        // created later on, to ensure the cherry-picked commit is flushed
-        // before patch sets are updated.
-        ObjectInserter oi = git.newObjectInserter();
-        ObjectReader reader = oi.newReader();
-        CodeReviewRevWalk revWalk = CodeReviewCommit.newRevWalk(reader)) {
-      Ref destRef = git.getRefDatabase().exactRef(dest.get());
-      if (destRef == null) {
-        throw new InvalidChangeOperationException(
-            String.format("Branch %s does not exist.", dest.get()));
-      }
-
-      RevCommit baseCommit = getBaseCommit(destRef, project.get(), revWalk, input.base);
-
-      CodeReviewCommit commitToCherryPick = revWalk.parseCommit(sourceCommit);
-
-      if (input.parent <= 0 || input.parent > commitToCherryPick.getParentCount()) {
-        throw new InvalidChangeOperationException(
-            String.format(
-                "Cherry Pick: Parent %s does not exist. Please specify a parent in"
-                    + " range [1, %s].",
-                input.parent, commitToCherryPick.getParentCount()));
-      }
-
-      Timestamp now = TimeUtil.nowTs();
-      PersonIdent committerIdent = identifiedUser.newCommitterIdent(now, serverTimeZone);
-
-      final ObjectId computedChangeId =
-          ChangeIdUtil.computeChangeId(
-              commitToCherryPick.getTree(),
-              baseCommit,
-              commitToCherryPick.getAuthorIdent(),
-              committerIdent,
-              input.message);
-      String commitMessage = ChangeIdUtil.insertId(input.message, computedChangeId).trim() + '\n';
-
-      CodeReviewCommit cherryPickCommit;
-      ProjectControl projectControl =
-          projectControlFactory.controlFor(dest.getParentKey(), identifiedUser);
-      try {
-        ProjectState projectState = projectControl.getProjectState();
-        cherryPickCommit =
-            mergeUtilFactory
-                .create(projectState)
-                .createCherryPickFromCommit(
-                    oi,
-                    git.getConfig(),
-                    baseCommit,
-                    commitToCherryPick,
-                    committerIdent,
-                    commitMessage,
-                    revWalk,
-                    input.parent - 1,
-                    false);
-
-        Change.Key changeKey;
-        final List<String> idList = cherryPickCommit.getFooterLines(FooterConstants.CHANGE_ID);
-        if (!idList.isEmpty()) {
-          final String idStr = idList.get(idList.size() - 1).trim();
-          changeKey = new Change.Key(idStr);
-        } else {
-          changeKey = new Change.Key("I" + computedChangeId.name());
-        }
-
-        Branch.NameKey newDest = new Branch.NameKey(project, destRef.getName());
-        List<ChangeData> destChanges =
-            queryProvider.get().setLimit(2).byBranchKey(newDest, changeKey);
-        if (destChanges.size() > 1) {
-          throw new InvalidChangeOperationException(
-              "Several changes with key "
-                  + changeKey
-                  + " reside on the same branch. "
-                  + "Cannot create a new patch set.");
-        }
-        try (BatchUpdate bu =
-            batchUpdateFactory.create(dbProvider.get(), project, identifiedUser, now)) {
-          bu.setRepository(git, revWalk, oi);
-          Change.Id result;
-          if (destChanges.size() == 1) {
-            // The change key exists on the destination branch. The cherry pick
-            // will be added as a new patch set.
-            result = insertPatchSet(bu, git, destChanges.get(0).notes(), cherryPickCommit, input);
-          } else {
-            // Change key not found on destination branch. We can create a new
-            // change.
-            String newTopic = null;
-            if (sourceChange != null && !Strings.isNullOrEmpty(sourceChange.getTopic())) {
-              newTopic = sourceChange.getTopic() + "-" + newDest.getShortName();
-            }
-            result =
-                createNewChange(
-                    bu, cherryPickCommit, dest.get(), newTopic, sourceChange, sourceCommit, input);
-
-            if (sourceChange != null && sourcePatchId != null) {
-              bu.addOp(
-                  sourceChange.getId(),
-                  new AddMessageToSourceChangeOp(
-                      changeMessagesUtil, sourcePatchId, dest.getShortName(), cherryPickCommit));
-            }
-          }
-          bu.execute();
-          return result;
-        }
-      } catch (MergeIdenticalTreeException | MergeConflictException e) {
-        throw new IntegrationException("Cherry pick failed: " + e.getMessage());
-      }
-    }
-  }
-
-  private RevCommit getBaseCommit(Ref destRef, String project, RevWalk revWalk, String base)
-      throws RestApiException, IOException, OrmException {
-    RevCommit destRefTip = revWalk.parseCommit(destRef.getObjectId());
-    // The tip commit of the destination ref is the default base for the newly created change.
-    if (Strings.isNullOrEmpty(base)) {
-      return destRefTip;
-    }
-
-    ObjectId baseObjectId;
-    try {
-      baseObjectId = ObjectId.fromString(base);
-    } catch (InvalidObjectIdException e) {
-      throw new BadRequestException(String.format("Base %s doesn't represent a valid SHA-1", base));
-    }
-
-    RevCommit baseCommit = revWalk.parseCommit(baseObjectId);
-    InternalChangeQuery changeQuery = queryProvider.get();
-    changeQuery.enforceVisibility(true);
-    List<ChangeData> changeDatas = changeQuery.byBranchCommit(project, destRef.getName(), base);
-
-    if (changeDatas.isEmpty()) {
-      if (revWalk.isMergedInto(baseCommit, destRefTip)) {
-        // The base commit is a merged commit with no change associated.
-        return baseCommit;
-      }
-      throw new UnprocessableEntityException(
-          String.format("Commit %s does not exist on branch %s", base, destRef.getName()));
-    } else if (changeDatas.size() != 1) {
-      throw new ResourceConflictException("Multiple changes found for commit " + base);
-    }
-
-    Change change = changeDatas.get(0).change();
-    Change.Status status = change.getStatus();
-    if (status == Status.NEW || status == Status.MERGED) {
-      // The base commit is a valid change revision.
-      return baseCommit;
-    }
-
-    throw new ResourceConflictException(
-        String.format(
-            "Change %s with commit %s is %s", change.getChangeId(), base, status.asChangeStatus()));
-  }
-
-  private Change.Id insertPatchSet(
-      BatchUpdate bu,
-      Repository git,
-      ChangeNotes destNotes,
-      CodeReviewCommit cherryPickCommit,
-      CherryPickInput input)
-      throws IOException, OrmException, BadRequestException, ConfigInvalidException {
-    Change destChange = destNotes.getChange();
-    PatchSet.Id psId = ChangeUtil.nextPatchSetId(git, destChange.currentPatchSetId());
-    PatchSetInserter inserter = patchSetInserterFactory.create(destNotes, psId, cherryPickCommit);
-    inserter
-        .setMessage("Uploaded patch set " + inserter.getPatchSetId().get() + ".")
-        .setNotify(input.notify)
-        .setAccountsToNotify(notifyUtil.resolveAccounts(input.notifyDetails));
-    bu.addOp(destChange.getId(), inserter);
-    return destChange.getId();
-  }
-
-  private Change.Id createNewChange(
-      BatchUpdate bu,
-      CodeReviewCommit cherryPickCommit,
-      String refName,
-      String topic,
-      @Nullable Change sourceChange,
-      ObjectId sourceCommit,
-      CherryPickInput input)
-      throws OrmException, IOException, BadRequestException, ConfigInvalidException {
-    Change.Id changeId = new Change.Id(seq.nextChangeId());
-    ChangeInserter ins = changeInserterFactory.create(changeId, cherryPickCommit, refName);
-    Branch.NameKey sourceBranch = sourceChange == null ? null : sourceChange.getDest();
-    ins.setMessage(messageForDestinationChange(ins.getPatchSetId(), sourceBranch, sourceCommit))
-        .setTopic(topic)
-        .setWorkInProgress(sourceChange != null && sourceChange.isWorkInProgress())
-        .setNotify(input.notify)
-        .setAccountsToNotify(notifyUtil.resolveAccounts(input.notifyDetails));
-    if (input.keepReviewers && sourceChange != null) {
-      ReviewerSet reviewerSet =
-          approvalsUtil.getReviewers(
-              dbProvider.get(), changeNotesFactory.createChecked(dbProvider.get(), sourceChange));
-      Set<Account.Id> reviewers =
-          new HashSet<>(reviewerSet.byState(ReviewerStateInternal.REVIEWER));
-      reviewers.add(sourceChange.getOwner());
-      reviewers.remove(user.get().getAccountId());
-      Set<Account.Id> ccs = new HashSet<>(reviewerSet.byState(ReviewerStateInternal.CC));
-      ccs.remove(user.get().getAccountId());
-      ins.setReviewers(reviewers).setExtraCC(ccs);
-    }
-    bu.insertChange(ins);
-    return changeId;
-  }
-
-  private static class AddMessageToSourceChangeOp implements BatchUpdateOp {
-    private final ChangeMessagesUtil cmUtil;
-    private final PatchSet.Id psId;
-    private final String destBranch;
-    private final ObjectId cherryPickCommit;
-
-    private AddMessageToSourceChangeOp(
-        ChangeMessagesUtil cmUtil, PatchSet.Id psId, String destBranch, ObjectId cherryPickCommit) {
-      this.cmUtil = cmUtil;
-      this.psId = psId;
-      this.destBranch = destBranch;
-      this.cherryPickCommit = cherryPickCommit;
-    }
-
-    @Override
-    public boolean updateChange(ChangeContext ctx) throws OrmException {
-      StringBuilder sb =
-          new StringBuilder("Patch Set ")
-              .append(psId.get())
-              .append(": Cherry Picked")
-              .append("\n\n")
-              .append("This patchset was cherry picked to branch ")
-              .append(destBranch)
-              .append(" as commit ")
-              .append(cherryPickCommit.name());
-      ChangeMessage changeMessage =
-          ChangeMessagesUtil.newMessage(
-              psId,
-              ctx.getUser(),
-              ctx.getWhen(),
-              sb.toString(),
-              ChangeMessagesUtil.TAG_CHERRY_PICK_CHANGE);
-      cmUtil.addChangeMessage(ctx.getDb(), ctx.getUpdate(psId), changeMessage);
-      return true;
-    }
-  }
-
-  private String messageForDestinationChange(
-      PatchSet.Id patchSetId, Branch.NameKey sourceBranch, ObjectId sourceCommit) {
-    StringBuilder stringBuilder = new StringBuilder("Patch Set ").append(patchSetId.get());
-
-    if (sourceBranch != null) {
-      stringBuilder.append(": Cherry Picked from branch ").append(sourceBranch.getShortName());
-    } else {
-      stringBuilder.append(": Cherry Picked from commit ").append(sourceCommit.getName());
-    }
-
-    return stringBuilder.append(".").toString();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPickCommit.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPickCommit.java
deleted file mode 100644
index 4980975..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPickCommit.java
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.change;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.extensions.api.changes.CherryPickInput;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.git.IntegrationException;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.RefPermission;
-import com.google.gerrit.server.project.CommitResource;
-import com.google.gerrit.server.project.ContributorAgreementsChecker;
-import com.google.gerrit.server.project.InvalidChangeOperationException;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.RetryingRestModifyView;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.revwalk.RevCommit;
-
-@Singleton
-public class CherryPickCommit
-    extends RetryingRestModifyView<CommitResource, CherryPickInput, ChangeInfo> {
-  private final PermissionBackend permissionBackend;
-  private final Provider<CurrentUser> user;
-  private final CherryPickChange cherryPickChange;
-  private final ChangeJson.Factory json;
-  private final ContributorAgreementsChecker contributorAgreements;
-
-  @Inject
-  CherryPickCommit(
-      RetryHelper retryHelper,
-      Provider<CurrentUser> user,
-      CherryPickChange cherryPickChange,
-      ChangeJson.Factory json,
-      PermissionBackend permissionBackend,
-      ContributorAgreementsChecker contributorAgreements) {
-    super(retryHelper);
-    this.permissionBackend = permissionBackend;
-    this.user = user;
-    this.cherryPickChange = cherryPickChange;
-    this.json = json;
-    this.contributorAgreements = contributorAgreements;
-  }
-
-  @Override
-  public ChangeInfo applyImpl(
-      BatchUpdate.Factory updateFactory, CommitResource rsrc, CherryPickInput input)
-      throws OrmException, IOException, UpdateException, RestApiException,
-          PermissionBackendException, ConfigInvalidException, NoSuchProjectException {
-    RevCommit commit = rsrc.getCommit();
-    String message = Strings.nullToEmpty(input.message).trim();
-    input.message = message.isEmpty() ? commit.getFullMessage() : message;
-    String destination = Strings.nullToEmpty(input.destination).trim();
-    input.parent = input.parent == null ? 1 : input.parent;
-    Project.NameKey projectName = rsrc.getProjectState().getNameKey();
-
-    if (destination.isEmpty()) {
-      throw new BadRequestException("destination must be non-empty");
-    }
-
-    String refName = RefNames.fullName(destination);
-    contributorAgreements.check(projectName, user.get());
-    permissionBackend
-        .user(user)
-        .project(projectName)
-        .ref(refName)
-        .check(RefPermission.CREATE_CHANGE);
-
-    try {
-      Change.Id cherryPickedChangeId =
-          cherryPickChange.cherryPick(
-              updateFactory,
-              null,
-              null,
-              projectName,
-              commit,
-              input,
-              new Branch.NameKey(rsrc.getProjectState().getNameKey(), refName));
-      return json.noOptions().format(projectName, cherryPickedChangeId);
-    } catch (InvalidChangeOperationException e) {
-      throw new BadRequestException(e.getMessage());
-    } catch (IntegrationException e) {
-      throw new ResourceConflictException(e.getMessage());
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/CommentJson.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/CommentJson.java
deleted file mode 100644
index 0ebd84b..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/CommentJson.java
+++ /dev/null
@@ -1,216 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.change;
-
-import static com.google.gerrit.server.CommentsUtil.COMMENT_INFO_ORDER;
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.FluentIterable;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.client.Comment.Range;
-import com.google.gerrit.extensions.client.Side;
-import com.google.gerrit.extensions.common.CommentInfo;
-import com.google.gerrit.extensions.common.FixReplacementInfo;
-import com.google.gerrit.extensions.common.FixSuggestionInfo;
-import com.google.gerrit.extensions.common.RobotCommentInfo;
-import com.google.gerrit.extensions.restapi.Url;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.FixReplacement;
-import com.google.gerrit.reviewdb.client.FixSuggestion;
-import com.google.gerrit.reviewdb.client.RobotComment;
-import com.google.gerrit.server.account.AccountLoader;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-class CommentJson {
-
-  private final AccountLoader.Factory accountLoaderFactory;
-
-  private boolean fillAccounts = true;
-  private boolean fillPatchSet;
-
-  @Inject
-  CommentJson(AccountLoader.Factory accountLoaderFactory) {
-    this.accountLoaderFactory = accountLoaderFactory;
-  }
-
-  CommentJson setFillAccounts(boolean fillAccounts) {
-    this.fillAccounts = fillAccounts;
-    return this;
-  }
-
-  CommentJson setFillPatchSet(boolean fillPatchSet) {
-    this.fillPatchSet = fillPatchSet;
-    return this;
-  }
-
-  public CommentFormatter newCommentFormatter() {
-    return new CommentFormatter();
-  }
-
-  public RobotCommentFormatter newRobotCommentFormatter() {
-    return new RobotCommentFormatter();
-  }
-
-  private abstract class BaseCommentFormatter<F extends Comment, T extends CommentInfo> {
-    public T format(F comment) throws OrmException {
-      AccountLoader loader = fillAccounts ? accountLoaderFactory.create(true) : null;
-      T info = toInfo(comment, loader);
-      if (loader != null) {
-        loader.fill();
-      }
-      return info;
-    }
-
-    public Map<String, List<T>> format(Iterable<F> comments) throws OrmException {
-      AccountLoader loader = fillAccounts ? accountLoaderFactory.create(true) : null;
-
-      Map<String, List<T>> out = new TreeMap<>();
-
-      for (F c : comments) {
-        T o = toInfo(c, loader);
-        List<T> list = out.get(o.path);
-        if (list == null) {
-          list = new ArrayList<>();
-          out.put(o.path, list);
-        }
-        o.path = null;
-        list.add(o);
-      }
-
-      for (List<T> list : out.values()) {
-        Collections.sort(list, COMMENT_INFO_ORDER);
-      }
-
-      if (loader != null) {
-        loader.fill();
-      }
-      return out;
-    }
-
-    public List<T> formatAsList(Iterable<F> comments) throws OrmException {
-      AccountLoader loader = fillAccounts ? accountLoaderFactory.create(true) : null;
-
-      List<T> out =
-          FluentIterable.from(comments)
-              .transform(c -> toInfo(c, loader))
-              .toSortedList(COMMENT_INFO_ORDER);
-
-      if (loader != null) {
-        loader.fill();
-      }
-      return out;
-    }
-
-    protected abstract T toInfo(F comment, AccountLoader loader);
-
-    protected void fillCommentInfo(Comment c, CommentInfo r, AccountLoader loader) {
-      if (fillPatchSet) {
-        r.patchSet = c.key.patchSetId;
-      }
-      r.id = Url.encode(c.key.uuid);
-      r.path = c.key.filename;
-      if (c.side <= 0) {
-        r.side = Side.PARENT;
-        if (c.side < 0) {
-          r.parent = -c.side;
-        }
-      }
-      if (c.lineNbr > 0) {
-        r.line = c.lineNbr;
-      }
-      r.inReplyTo = Url.encode(c.parentUuid);
-      r.message = Strings.emptyToNull(c.message);
-      r.updated = c.writtenOn;
-      r.range = toRange(c.range);
-      r.tag = c.tag;
-      r.unresolved = c.unresolved;
-      if (loader != null) {
-        r.author = loader.get(c.author.getId());
-      }
-    }
-
-    protected Range toRange(Comment.Range commentRange) {
-      Range range = null;
-      if (commentRange != null) {
-        range = new Range();
-        range.startLine = commentRange.startLine;
-        range.startCharacter = commentRange.startChar;
-        range.endLine = commentRange.endLine;
-        range.endCharacter = commentRange.endChar;
-      }
-      return range;
-    }
-  }
-
-  class CommentFormatter extends BaseCommentFormatter<Comment, CommentInfo> {
-    @Override
-    protected CommentInfo toInfo(Comment c, AccountLoader loader) {
-      CommentInfo ci = new CommentInfo();
-      fillCommentInfo(c, ci, loader);
-      return ci;
-    }
-
-    private CommentFormatter() {}
-  }
-
-  class RobotCommentFormatter extends BaseCommentFormatter<RobotComment, RobotCommentInfo> {
-    @Override
-    protected RobotCommentInfo toInfo(RobotComment c, AccountLoader loader) {
-      RobotCommentInfo rci = new RobotCommentInfo();
-      rci.robotId = c.robotId;
-      rci.robotRunId = c.robotRunId;
-      rci.url = c.url;
-      rci.properties = c.properties;
-      rci.fixSuggestions = toFixSuggestionInfos(c.fixSuggestions);
-      fillCommentInfo(c, rci, loader);
-      return rci;
-    }
-
-    private List<FixSuggestionInfo> toFixSuggestionInfos(
-        @Nullable List<FixSuggestion> fixSuggestions) {
-      if (fixSuggestions == null || fixSuggestions.isEmpty()) {
-        return null;
-      }
-
-      return fixSuggestions.stream().map(this::toFixSuggestionInfo).collect(toList());
-    }
-
-    private FixSuggestionInfo toFixSuggestionInfo(FixSuggestion fixSuggestion) {
-      FixSuggestionInfo fixSuggestionInfo = new FixSuggestionInfo();
-      fixSuggestionInfo.fixId = fixSuggestion.fixId;
-      fixSuggestionInfo.description = fixSuggestion.description;
-      fixSuggestionInfo.replacements =
-          fixSuggestion.replacements.stream().map(this::toFixReplacementInfo).collect(toList());
-      return fixSuggestionInfo;
-    }
-
-    private FixReplacementInfo toFixReplacementInfo(FixReplacement fixReplacement) {
-      FixReplacementInfo fixReplacementInfo = new FixReplacementInfo();
-      fixReplacementInfo.path = fixReplacement.path;
-      fixReplacementInfo.range = toRange(fixReplacement.range);
-      fixReplacementInfo.replacement = fixReplacement.replacement;
-      return fixReplacementInfo;
-    }
-
-    private RobotCommentFormatter() {}
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/CommentResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/CommentResource.java
deleted file mode 100644
index f7fc576..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/CommentResource.java
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.restapi.RestResource;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.inject.TypeLiteral;
-
-public class CommentResource implements RestResource {
-  public static final TypeLiteral<RestView<CommentResource>> COMMENT_KIND =
-      new TypeLiteral<RestView<CommentResource>>() {};
-
-  private final RevisionResource rev;
-  private final Comment comment;
-
-  public CommentResource(RevisionResource rev, Comment c) {
-    this.rev = rev;
-    this.comment = c;
-  }
-
-  public PatchSet getPatchSet() {
-    return rev.getPatchSet();
-  }
-
-  Comment getComment() {
-    return comment;
-  }
-
-  String getId() {
-    return comment.key.uuid;
-  }
-
-  Account.Id getAuthorId() {
-    return comment.author.getId();
-  }
-
-  RevisionResource getRevisionResource() {
-    return rev;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Comments.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Comments.java
deleted file mode 100644
index 935aa4e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Comments.java
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.ChildCollection;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CommentsUtil;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-
-@Singleton
-public class Comments implements ChildCollection<RevisionResource, CommentResource> {
-  private final DynamicMap<RestView<CommentResource>> views;
-  private final ListRevisionComments list;
-  private final Provider<ReviewDb> dbProvider;
-  private final CommentsUtil commentsUtil;
-
-  @Inject
-  Comments(
-      DynamicMap<RestView<CommentResource>> views,
-      ListRevisionComments list,
-      Provider<ReviewDb> dbProvider,
-      CommentsUtil commentsUtil) {
-    this.views = views;
-    this.list = list;
-    this.dbProvider = dbProvider;
-    this.commentsUtil = commentsUtil;
-  }
-
-  @Override
-  public DynamicMap<RestView<CommentResource>> views() {
-    return views;
-  }
-
-  @Override
-  public ListRevisionComments list() {
-    return list;
-  }
-
-  @Override
-  public CommentResource parse(RevisionResource rev, IdString id)
-      throws ResourceNotFoundException, OrmException {
-    String uuid = id.get();
-    ChangeNotes notes = rev.getNotes();
-
-    for (Comment c :
-        commentsUtil.publishedByPatchSet(dbProvider.get(), notes, rev.getPatchSet().getId())) {
-      if (uuid.equals(c.key.uuid)) {
-        return new CommentResource(rev, c);
-      }
-    }
-    throw new ResourceNotFoundException(id);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ConsistencyChecker.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ConsistencyChecker.java
deleted file mode 100644
index a149935..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ConsistencyChecker.java
+++ /dev/null
@@ -1,785 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.change;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.gerrit.reviewdb.client.RefNames.REFS_CHANGES;
-import static com.google.gerrit.reviewdb.server.ReviewDbUtil.intKeyOrdering;
-import static com.google.gerrit.server.ChangeUtil.PS_ID_ORDER;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.collect.Collections2;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.MultimapBuilder;
-import com.google.common.collect.SetMultimap;
-import com.google.gerrit.common.FooterConstants;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.api.changes.FixInput;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.common.ProblemInfo;
-import com.google.gerrit.extensions.common.ProblemInfo.Status;
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.reviewdb.server.ReviewDbUtil;
-import com.google.gerrit.server.ChangeUtil;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.account.Accounts;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.PatchSetState;
-import com.google.gerrit.server.patch.PatchSetInfoFactory;
-import com.google.gerrit.server.patch.PatchSetInfoNotAvailableException;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.RepoContext;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.IncorrectObjectTypeException;
-import org.eclipse.jgit.errors.MissingObjectException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Checks changes for various kinds of inconsistency and corruption.
- *
- * <p>A single instance may be reused for checking multiple changes, but not concurrently.
- */
-public class ConsistencyChecker {
-  private static final Logger log = LoggerFactory.getLogger(ConsistencyChecker.class);
-
-  @AutoValue
-  public abstract static class Result {
-    private static Result create(ChangeNotes notes, List<ProblemInfo> problems) {
-      return new AutoValue_ConsistencyChecker_Result(
-          notes.getChangeId(), notes.getChange(), problems);
-    }
-
-    public abstract Change.Id id();
-
-    @Nullable
-    public abstract Change change();
-
-    public abstract List<ProblemInfo> problems();
-  }
-
-  private final ChangeNotes.Factory notesFactory;
-  private final Accounts accounts;
-  private final DynamicItem<AccountPatchReviewStore> accountPatchReviewStore;
-  private final GitRepositoryManager repoManager;
-  private final PatchSetInfoFactory patchSetInfoFactory;
-  private final PatchSetInserter.Factory patchSetInserterFactory;
-  private final PatchSetUtil psUtil;
-  private final Provider<CurrentUser> user;
-  private final Provider<PersonIdent> serverIdent;
-  private final Provider<ReviewDb> db;
-  private final RetryHelper retryHelper;
-
-  private BatchUpdate.Factory updateFactory;
-  private FixInput fix;
-  private ChangeNotes notes;
-  private Repository repo;
-  private RevWalk rw;
-  private ObjectInserter oi;
-
-  private RevCommit tip;
-  private SetMultimap<ObjectId, PatchSet> patchSetsBySha;
-  private PatchSet currPs;
-  private RevCommit currPsCommit;
-
-  private List<ProblemInfo> problems;
-
-  @Inject
-  ConsistencyChecker(
-      @GerritPersonIdent Provider<PersonIdent> serverIdent,
-      ChangeNotes.Factory notesFactory,
-      Accounts accounts,
-      DynamicItem<AccountPatchReviewStore> accountPatchReviewStore,
-      GitRepositoryManager repoManager,
-      PatchSetInfoFactory patchSetInfoFactory,
-      PatchSetInserter.Factory patchSetInserterFactory,
-      PatchSetUtil psUtil,
-      Provider<CurrentUser> user,
-      Provider<ReviewDb> db,
-      RetryHelper retryHelper) {
-    this.accounts = accounts;
-    this.accountPatchReviewStore = accountPatchReviewStore;
-    this.db = db;
-    this.notesFactory = notesFactory;
-    this.patchSetInfoFactory = patchSetInfoFactory;
-    this.patchSetInserterFactory = patchSetInserterFactory;
-    this.psUtil = psUtil;
-    this.repoManager = repoManager;
-    this.retryHelper = retryHelper;
-    this.serverIdent = serverIdent;
-    this.user = user;
-    reset();
-  }
-
-  private void reset() {
-    updateFactory = null;
-    notes = null;
-    repo = null;
-    rw = null;
-    problems = new ArrayList<>();
-  }
-
-  private Change change() {
-    return notes.getChange();
-  }
-
-  public Result check(ChangeNotes notes, @Nullable FixInput f) {
-    checkNotNull(notes);
-    try {
-      return retryHelper.execute(
-          buf -> {
-            try {
-              reset();
-              this.updateFactory = buf;
-              this.notes = notes;
-              fix = f;
-              checkImpl();
-              return result();
-            } finally {
-              if (rw != null) {
-                rw.getObjectReader().close();
-                rw.close();
-                oi.close();
-              }
-              if (repo != null) {
-                repo.close();
-              }
-            }
-          });
-    } catch (RestApiException e) {
-      return logAndReturnOneProblem(e, notes, "Error checking change: " + e.getMessage());
-    } catch (UpdateException e) {
-      return logAndReturnOneProblem(e, notes, "Error checking change");
-    }
-  }
-
-  private Result logAndReturnOneProblem(Exception e, ChangeNotes notes, String problem) {
-    log.warn("Error checking change " + notes.getChangeId(), e);
-    return Result.create(notes, ImmutableList.of(problem(problem)));
-  }
-
-  private void checkImpl() {
-    checkOwner();
-    checkCurrentPatchSetEntity();
-
-    // All checks that require the repo.
-    if (!openRepo()) {
-      return;
-    }
-    if (!checkPatchSets()) {
-      return;
-    }
-    checkMerged();
-  }
-
-  private void checkOwner() {
-    try {
-      if (accounts.get(change().getOwner()) == null) {
-        problem("Missing change owner: " + change().getOwner());
-      }
-    } catch (IOException | ConfigInvalidException e) {
-      error("Failed to look up owner", e);
-    }
-  }
-
-  private void checkCurrentPatchSetEntity() {
-    try {
-      currPs = psUtil.current(db.get(), notes);
-      if (currPs == null) {
-        problem(
-            String.format("Current patch set %d not found", change().currentPatchSetId().get()));
-      }
-    } catch (OrmException e) {
-      error("Failed to look up current patch set", e);
-    }
-  }
-
-  private boolean openRepo() {
-    Project.NameKey project = change().getDest().getParentKey();
-    try {
-      repo = repoManager.openRepository(project);
-      oi = repo.newObjectInserter();
-      rw = new RevWalk(oi.newReader());
-      return true;
-    } catch (RepositoryNotFoundException e) {
-      return error("Destination repository not found: " + project, e);
-    } catch (IOException e) {
-      return error("Failed to open repository: " + project, e);
-    }
-  }
-
-  private boolean checkPatchSets() {
-    List<PatchSet> all;
-    try {
-      // Iterate in descending order.
-      all = PS_ID_ORDER.sortedCopy(psUtil.byChange(db.get(), notes));
-    } catch (OrmException e) {
-      return error("Failed to look up patch sets", e);
-    }
-    patchSetsBySha = MultimapBuilder.hashKeys(all.size()).treeSetValues(PS_ID_ORDER).build();
-
-    Map<String, Ref> refs;
-    try {
-      refs =
-          repo.getRefDatabase()
-              .exactRef(all.stream().map(ps -> ps.getId().toRefName()).toArray(String[]::new));
-    } catch (IOException e) {
-      error("error reading refs", e);
-      refs = Collections.emptyMap();
-    }
-
-    List<DeletePatchSetFromDbOp> deletePatchSetOps = new ArrayList<>();
-    for (PatchSet ps : all) {
-      // Check revision format.
-      int psNum = ps.getId().get();
-      String refName = ps.getId().toRefName();
-      ObjectId objId = parseObjectId(ps.getRevision().get(), "patch set " + psNum);
-      if (objId == null) {
-        continue;
-      }
-      patchSetsBySha.put(objId, ps);
-
-      // Check ref existence.
-      ProblemInfo refProblem = null;
-      Ref ref = refs.get(refName);
-      if (ref == null) {
-        refProblem = problem("Ref missing: " + refName);
-      } else if (!objId.equals(ref.getObjectId())) {
-        String actual = ref.getObjectId() != null ? ref.getObjectId().name() : "null";
-        refProblem =
-            problem(
-                String.format(
-                    "Expected %s to point to %s, found %s", ref.getName(), objId.name(), actual));
-      }
-
-      // Check object existence.
-      RevCommit psCommit = parseCommit(objId, String.format("patch set %d", psNum));
-      if (psCommit == null) {
-        if (fix != null && fix.deletePatchSetIfCommitMissing) {
-          deletePatchSetOps.add(new DeletePatchSetFromDbOp(lastProblem(), ps.getId()));
-        }
-        continue;
-      } else if (refProblem != null && fix != null) {
-        fixPatchSetRef(refProblem, ps);
-      }
-      if (ps.getId().equals(change().currentPatchSetId())) {
-        currPsCommit = psCommit;
-      }
-    }
-
-    // Delete any bad patch sets found above, in a single update.
-    deletePatchSets(deletePatchSetOps);
-
-    // Check for duplicates.
-    for (Map.Entry<ObjectId, Collection<PatchSet>> e : patchSetsBySha.asMap().entrySet()) {
-      if (e.getValue().size() > 1) {
-        problem(
-            String.format(
-                "Multiple patch sets pointing to %s: %s",
-                e.getKey().name(), Collections2.transform(e.getValue(), PatchSet::getPatchSetId)));
-      }
-    }
-
-    return currPs != null && currPsCommit != null;
-  }
-
-  private void checkMerged() {
-    String refName = change().getDest().get();
-    Ref dest;
-    try {
-      dest = repo.getRefDatabase().exactRef(refName);
-    } catch (IOException e) {
-      problem("Failed to look up destination ref: " + refName);
-      return;
-    }
-    if (dest == null) {
-      problem("Destination ref not found (may be new branch): " + refName);
-      return;
-    }
-    tip = parseCommit(dest.getObjectId(), "destination ref " + refName);
-    if (tip == null) {
-      return;
-    }
-
-    if (fix != null && fix.expectMergedAs != null) {
-      checkExpectMergedAs();
-    } else {
-      boolean merged;
-      try {
-        merged = rw.isMergedInto(currPsCommit, tip);
-      } catch (IOException e) {
-        problem("Error checking whether patch set " + currPs.getId().get() + " is merged");
-        return;
-      }
-      checkMergedBitMatchesStatus(currPs.getId(), currPsCommit, merged);
-    }
-  }
-
-  private ProblemInfo wrongChangeStatus(PatchSet.Id psId, RevCommit commit) {
-    String refName = change().getDest().get();
-    return problem(
-        String.format(
-            "Patch set %d (%s) is merged into destination ref %s (%s), but change"
-                + " status is %s",
-            psId.get(), commit.name(), refName, tip.name(), change().getStatus()));
-  }
-
-  private void checkMergedBitMatchesStatus(PatchSet.Id psId, RevCommit commit, boolean merged) {
-    String refName = change().getDest().get();
-    if (merged && change().getStatus() != Change.Status.MERGED) {
-      ProblemInfo p = wrongChangeStatus(psId, commit);
-      if (fix != null) {
-        fixMerged(p);
-      }
-    } else if (!merged && change().getStatus() == Change.Status.MERGED) {
-      problem(
-          String.format(
-              "Patch set %d (%s) is not merged into"
-                  + " destination ref %s (%s), but change status is %s",
-              currPs.getId().get(), commit.name(), refName, tip.name(), change().getStatus()));
-    }
-  }
-
-  private void checkExpectMergedAs() {
-    ObjectId objId = parseObjectId(fix.expectMergedAs, "expected merged commit");
-    RevCommit commit = parseCommit(objId, "expected merged commit");
-    if (commit == null) {
-      return;
-    }
-
-    try {
-      if (!rw.isMergedInto(commit, tip)) {
-        problem(
-            String.format(
-                "Expected merged commit %s is not merged into destination ref %s (%s)",
-                commit.name(), change().getDest().get(), tip.name()));
-        return;
-      }
-
-      List<PatchSet.Id> thisCommitPsIds = new ArrayList<>();
-      for (Ref ref : repo.getRefDatabase().getRefs(REFS_CHANGES).values()) {
-        if (!ref.getObjectId().equals(commit)) {
-          continue;
-        }
-        PatchSet.Id psId = PatchSet.Id.fromRef(ref.getName());
-        if (psId == null) {
-          continue;
-        }
-        try {
-          Change c =
-              notesFactory
-                  .createChecked(db.get(), change().getProject(), psId.getParentKey())
-                  .getChange();
-          if (!c.getDest().equals(change().getDest())) {
-            continue;
-          }
-        } catch (OrmException e) {
-          warn(e);
-          // Include this patch set; should cause an error below, which is good.
-        }
-        thisCommitPsIds.add(psId);
-      }
-      switch (thisCommitPsIds.size()) {
-        case 0:
-          // No patch set for this commit; insert one.
-          rw.parseBody(commit);
-          String changeId =
-              Iterables.getFirst(commit.getFooterLines(FooterConstants.CHANGE_ID), null);
-          // Missing Change-Id footer is ok, but mismatched is not.
-          if (changeId != null && !changeId.equals(change().getKey().get())) {
-            problem(
-                String.format(
-                    "Expected merged commit %s has Change-Id: %s, but expected %s",
-                    commit.name(), changeId, change().getKey().get()));
-            return;
-          }
-          insertMergedPatchSet(commit, null, false);
-          break;
-
-        case 1:
-          // Existing patch set ref pointing to this commit.
-          PatchSet.Id id = thisCommitPsIds.get(0);
-          if (id.equals(change().currentPatchSetId())) {
-            // If it's the current patch set, we can just fix the status.
-            fixMerged(wrongChangeStatus(id, commit));
-          } else if (id.get() > change().currentPatchSetId().get()) {
-            // If it's newer than the current patch set, reuse this patch set
-            // ID when inserting a new merged patch set.
-            insertMergedPatchSet(commit, id, true);
-          } else {
-            // If it's older than the current patch set, just delete the old
-            // ref, and use a new ID when inserting a new merged patch set.
-            insertMergedPatchSet(commit, id, false);
-          }
-          break;
-
-        default:
-          problem(
-              String.format(
-                  "Multiple patch sets for expected merged commit %s: %s",
-                  commit.name(), intKeyOrdering().sortedCopy(thisCommitPsIds)));
-          break;
-      }
-    } catch (IOException e) {
-      error("Error looking up expected merged commit " + fix.expectMergedAs, e);
-    }
-  }
-
-  private void insertMergedPatchSet(
-      final RevCommit commit, @Nullable PatchSet.Id psIdToDelete, boolean reuseOldPsId) {
-    ProblemInfo notFound = problem("No patch set found for merged commit " + commit.name());
-    if (!user.get().isIdentifiedUser()) {
-      notFound.status = Status.FIX_FAILED;
-      notFound.outcome = "Must be called by an identified user to insert new patch set";
-      return;
-    }
-    ProblemInfo insertPatchSetProblem;
-    ProblemInfo deleteOldPatchSetProblem;
-
-    if (psIdToDelete == null) {
-      insertPatchSetProblem =
-          problem(
-              String.format(
-                  "Expected merged commit %s has no associated patch set", commit.name()));
-      deleteOldPatchSetProblem = null;
-    } else {
-      String msg =
-          String.format(
-              "Expected merge commit %s corresponds to patch set %s,"
-                  + " not the current patch set %s",
-              commit.name(), psIdToDelete.get(), change().currentPatchSetId().get());
-      // Maybe an identical problem, but different fix.
-      deleteOldPatchSetProblem = reuseOldPsId ? null : problem(msg);
-      insertPatchSetProblem = problem(msg);
-    }
-
-    List<ProblemInfo> currProblems = new ArrayList<>(3);
-    currProblems.add(notFound);
-    if (deleteOldPatchSetProblem != null) {
-      currProblems.add(insertPatchSetProblem);
-    }
-    currProblems.add(insertPatchSetProblem);
-
-    try {
-      PatchSet.Id psId =
-          (psIdToDelete != null && reuseOldPsId)
-              ? psIdToDelete
-              : ChangeUtil.nextPatchSetId(repo, change().currentPatchSetId());
-      PatchSetInserter inserter = patchSetInserterFactory.create(notes, psId, commit);
-      try (BatchUpdate bu = newBatchUpdate()) {
-        bu.setRepository(repo, rw, oi);
-
-        if (psIdToDelete != null) {
-          // Delete the given patch set ref. If reuseOldPsId is true,
-          // PatchSetInserter will reinsert the same ref, making it a no-op.
-          bu.addOp(
-              notes.getChangeId(),
-              new BatchUpdateOp() {
-                @Override
-                public void updateRepo(RepoContext ctx) throws IOException {
-                  ctx.addRefUpdate(commit, ObjectId.zeroId(), psIdToDelete.toRefName());
-                }
-              });
-          if (!reuseOldPsId) {
-            bu.addOp(
-                notes.getChangeId(),
-                new DeletePatchSetFromDbOp(checkNotNull(deleteOldPatchSetProblem), psIdToDelete));
-          }
-        }
-
-        bu.addOp(
-            notes.getChangeId(),
-            inserter
-                .setValidate(false)
-                .setFireRevisionCreated(false)
-                .setNotify(NotifyHandling.NONE)
-                .setAllowClosed(true)
-                .setMessage("Patch set for merged commit inserted by consistency checker"));
-        bu.addOp(notes.getChangeId(), new FixMergedOp(notFound));
-        bu.execute();
-      }
-      notes = notesFactory.createChecked(db.get(), inserter.getChange());
-      insertPatchSetProblem.status = Status.FIXED;
-      insertPatchSetProblem.outcome = "Inserted as patch set " + psId.get();
-    } catch (OrmException | IOException | UpdateException | RestApiException e) {
-      warn(e);
-      for (ProblemInfo pi : currProblems) {
-        pi.status = Status.FIX_FAILED;
-        pi.outcome = "Error inserting merged patch set";
-      }
-      return;
-    }
-  }
-
-  private static class FixMergedOp implements BatchUpdateOp {
-    private final ProblemInfo p;
-
-    private FixMergedOp(ProblemInfo p) {
-      this.p = p;
-    }
-
-    @Override
-    public boolean updateChange(ChangeContext ctx) throws OrmException {
-      ctx.getChange().setStatus(Change.Status.MERGED);
-      ctx.getUpdate(ctx.getChange().currentPatchSetId()).fixStatus(Change.Status.MERGED);
-      p.status = Status.FIXED;
-      p.outcome = "Marked change as merged";
-      return true;
-    }
-  }
-
-  private void fixMerged(ProblemInfo p) {
-    try (BatchUpdate bu = newBatchUpdate()) {
-      bu.setRepository(repo, rw, oi);
-      bu.addOp(notes.getChangeId(), new FixMergedOp(p));
-      bu.execute();
-    } catch (UpdateException | RestApiException e) {
-      log.warn("Error marking " + notes.getChangeId() + "as merged", e);
-      p.status = Status.FIX_FAILED;
-      p.outcome = "Error updating status to merged";
-    }
-  }
-
-  private BatchUpdate newBatchUpdate() {
-    return updateFactory.create(db.get(), change().getProject(), user.get(), TimeUtil.nowTs());
-  }
-
-  private void fixPatchSetRef(ProblemInfo p, PatchSet ps) {
-    try {
-      RefUpdate ru = repo.updateRef(ps.getId().toRefName());
-      ru.setForceUpdate(true);
-      ru.setNewObjectId(ObjectId.fromString(ps.getRevision().get()));
-      ru.setRefLogIdent(newRefLogIdent());
-      ru.setRefLogMessage("Repair patch set ref", true);
-      RefUpdate.Result result = ru.update();
-      switch (result) {
-        case NEW:
-        case FORCED:
-        case FAST_FORWARD:
-        case NO_CHANGE:
-          p.status = Status.FIXED;
-          p.outcome = "Repaired patch set ref";
-          return;
-        case IO_FAILURE:
-        case LOCK_FAILURE:
-        case NOT_ATTEMPTED:
-        case REJECTED:
-        case REJECTED_CURRENT_BRANCH:
-        case RENAMED:
-        case REJECTED_MISSING_OBJECT:
-        case REJECTED_OTHER_REASON:
-        default:
-          p.status = Status.FIX_FAILED;
-          p.outcome = "Failed to update patch set ref: " + result;
-          return;
-      }
-    } catch (IOException e) {
-      String msg = "Error fixing patch set ref";
-      log.warn(msg + ' ' + ps.getId().toRefName(), e);
-      p.status = Status.FIX_FAILED;
-      p.outcome = msg;
-    }
-  }
-
-  private void deletePatchSets(List<DeletePatchSetFromDbOp> ops) {
-    try (BatchUpdate bu = newBatchUpdate()) {
-      bu.setRepository(repo, rw, oi);
-      for (DeletePatchSetFromDbOp op : ops) {
-        checkArgument(op.psId.getParentKey().equals(notes.getChangeId()));
-        bu.addOp(notes.getChangeId(), op);
-      }
-      bu.addOp(notes.getChangeId(), new UpdateCurrentPatchSetOp(ops));
-      bu.execute();
-    } catch (NoPatchSetsWouldRemainException e) {
-      for (DeletePatchSetFromDbOp op : ops) {
-        op.p.status = Status.FIX_FAILED;
-        op.p.outcome = e.getMessage();
-      }
-    } catch (UpdateException | RestApiException e) {
-      String msg = "Error deleting patch set";
-      log.warn(msg + " of change " + ops.get(0).psId.getParentKey(), e);
-      for (DeletePatchSetFromDbOp op : ops) {
-        // Overwrite existing statuses that were set before the transaction was
-        // rolled back.
-        op.p.status = Status.FIX_FAILED;
-        op.p.outcome = msg;
-      }
-    }
-  }
-
-  private class DeletePatchSetFromDbOp implements BatchUpdateOp {
-    private final ProblemInfo p;
-    private final PatchSet.Id psId;
-
-    private DeletePatchSetFromDbOp(ProblemInfo p, PatchSet.Id psId) {
-      this.p = p;
-      this.psId = psId;
-    }
-
-    @Override
-    public boolean updateChange(ChangeContext ctx)
-        throws OrmException, PatchSetInfoNotAvailableException {
-      // Delete dangling key references.
-      ReviewDb db = DeleteChangeOp.unwrap(ctx.getDb());
-      accountPatchReviewStore.get().clearReviewed(psId);
-      db.changeMessages().delete(db.changeMessages().byChange(psId.getParentKey()));
-      db.patchSetApprovals().delete(db.patchSetApprovals().byPatchSet(psId));
-      db.patchComments().delete(db.patchComments().byPatchSet(psId));
-      db.patchSets().deleteKeys(Collections.singleton(psId));
-
-      // NoteDb requires no additional fiddling; setting the state to deleted is
-      // sufficient to filter everything else out.
-      ctx.getUpdate(psId).setPatchSetState(PatchSetState.DELETED);
-
-      p.status = Status.FIXED;
-      p.outcome = "Deleted patch set";
-      return true;
-    }
-  }
-
-  private static class NoPatchSetsWouldRemainException extends RestApiException {
-    private static final long serialVersionUID = 1L;
-
-    private NoPatchSetsWouldRemainException() {
-      super("Cannot delete patch set; no patch sets would remain");
-    }
-  }
-
-  private class UpdateCurrentPatchSetOp implements BatchUpdateOp {
-    private final Set<PatchSet.Id> toDelete;
-
-    private UpdateCurrentPatchSetOp(List<DeletePatchSetFromDbOp> deleteOps) {
-      toDelete = new HashSet<>();
-      for (DeletePatchSetFromDbOp op : deleteOps) {
-        toDelete.add(op.psId);
-      }
-    }
-
-    @Override
-    public boolean updateChange(ChangeContext ctx)
-        throws OrmException, PatchSetInfoNotAvailableException, NoPatchSetsWouldRemainException {
-      if (!toDelete.contains(ctx.getChange().currentPatchSetId())) {
-        return false;
-      }
-      Set<PatchSet.Id> all = new HashSet<>();
-      // Doesn't make any assumptions about the order in which deletes happen
-      // and whether they are seen by this op; we are already given the full set
-      // of patch sets that will eventually be deleted in this update.
-      for (PatchSet ps : psUtil.byChange(ctx.getDb(), ctx.getNotes())) {
-        if (!toDelete.contains(ps.getId())) {
-          all.add(ps.getId());
-        }
-      }
-      if (all.isEmpty()) {
-        throw new NoPatchSetsWouldRemainException();
-      }
-      PatchSet.Id latest = ReviewDbUtil.intKeyOrdering().max(all);
-      ctx.getChange()
-          .setCurrentPatchSet(patchSetInfoFactory.get(ctx.getDb(), ctx.getNotes(), latest));
-      return true;
-    }
-  }
-
-  private PersonIdent newRefLogIdent() {
-    CurrentUser u = user.get();
-    if (u.isIdentifiedUser()) {
-      return u.asIdentifiedUser().newRefLogIdent();
-    }
-    return serverIdent.get();
-  }
-
-  private ObjectId parseObjectId(String objIdStr, String desc) {
-    try {
-      return ObjectId.fromString(objIdStr);
-    } catch (IllegalArgumentException e) {
-      problem(String.format("Invalid revision on %s: %s", desc, objIdStr));
-      return null;
-    }
-  }
-
-  private RevCommit parseCommit(ObjectId objId, String desc) {
-    try {
-      return rw.parseCommit(objId);
-    } catch (MissingObjectException e) {
-      problem(String.format("Object missing: %s: %s", desc, objId.name()));
-    } catch (IncorrectObjectTypeException e) {
-      problem(String.format("Not a commit: %s: %s", desc, objId.name()));
-    } catch (IOException e) {
-      problem(String.format("Failed to look up: %s: %s", desc, objId.name()));
-    }
-    return null;
-  }
-
-  private ProblemInfo problem(String msg) {
-    ProblemInfo p = new ProblemInfo();
-    p.message = checkNotNull(msg);
-    problems.add(p);
-    return p;
-  }
-
-  private ProblemInfo lastProblem() {
-    return problems.get(problems.size() - 1);
-  }
-
-  private boolean error(String msg, Throwable t) {
-    problem(msg);
-    // TODO(dborowitz): Expose stack trace to administrators.
-    warn(t);
-    return false;
-  }
-
-  private void warn(Throwable t) {
-    log.warn("Error in consistency check of change " + notes.getChangeId(), t);
-  }
-
-  private Result result() {
-    return Result.create(notes, problems);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateChange.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateChange.java
deleted file mode 100644
index bbc3de0..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateChange.java
+++ /dev/null
@@ -1,383 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.change;
-
-import static org.eclipse.jgit.lib.Constants.SIGNED_OFF_BY_TAG;
-
-import com.google.common.base.Joiner;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Strings;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.client.ChangeStatus;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.ChangeInput;
-import com.google.gerrit.extensions.common.MergeInput;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ChangeFinder;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.Sequences;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.config.AnonymousCowardName;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MergeUtil;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.RefPermission;
-import com.google.gerrit.server.project.CommitsCollection;
-import com.google.gerrit.server.project.ContributorAgreementsChecker;
-import com.google.gerrit.server.project.InvalidChangeOperationException;
-import com.google.gerrit.server.project.ProjectResource;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.project.ProjectsCollection;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.RetryingRestModifyView;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.sql.Timestamp;
-import java.util.Collections;
-import java.util.List;
-import java.util.TimeZone;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.lib.TreeFormatter;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.util.ChangeIdUtil;
-
-@Singleton
-public class CreateChange
-    extends RetryingRestModifyView<TopLevelResource, ChangeInput, Response<ChangeInfo>> {
-  private final String anonymousCowardName;
-  private final Provider<ReviewDb> db;
-  private final GitRepositoryManager gitManager;
-  private final AccountCache accountCache;
-  private final Sequences seq;
-  private final TimeZone serverTimeZone;
-  private final PermissionBackend permissionBackend;
-  private final Provider<CurrentUser> user;
-  private final ProjectsCollection projectsCollection;
-  private final CommitsCollection commits;
-  private final ChangeInserter.Factory changeInserterFactory;
-  private final ChangeJson.Factory jsonFactory;
-  private final ChangeFinder changeFinder;
-  private final PatchSetUtil psUtil;
-  private final MergeUtil.Factory mergeUtilFactory;
-  private final SubmitType submitType;
-  private final NotifyUtil notifyUtil;
-  private final ContributorAgreementsChecker contributorAgreements;
-  private final boolean disablePrivateChanges;
-
-  @Inject
-  CreateChange(
-      @AnonymousCowardName String anonymousCowardName,
-      Provider<ReviewDb> db,
-      GitRepositoryManager gitManager,
-      AccountCache accountCache,
-      Sequences seq,
-      @GerritPersonIdent PersonIdent myIdent,
-      PermissionBackend permissionBackend,
-      Provider<CurrentUser> user,
-      ProjectsCollection projectsCollection,
-      CommitsCollection commits,
-      ChangeInserter.Factory changeInserterFactory,
-      ChangeJson.Factory json,
-      ChangeFinder changeFinder,
-      RetryHelper retryHelper,
-      PatchSetUtil psUtil,
-      @GerritServerConfig Config config,
-      MergeUtil.Factory mergeUtilFactory,
-      NotifyUtil notifyUtil,
-      ContributorAgreementsChecker contributorAgreements) {
-    super(retryHelper);
-    this.anonymousCowardName = anonymousCowardName;
-    this.db = db;
-    this.gitManager = gitManager;
-    this.accountCache = accountCache;
-    this.seq = seq;
-    this.serverTimeZone = myIdent.getTimeZone();
-    this.permissionBackend = permissionBackend;
-    this.user = user;
-    this.projectsCollection = projectsCollection;
-    this.commits = commits;
-    this.changeInserterFactory = changeInserterFactory;
-    this.jsonFactory = json;
-    this.changeFinder = changeFinder;
-    this.psUtil = psUtil;
-    this.submitType = config.getEnum("project", null, "submitType", SubmitType.MERGE_IF_NECESSARY);
-    this.disablePrivateChanges = config.getBoolean("change", null, "disablePrivateChanges", false);
-    this.mergeUtilFactory = mergeUtilFactory;
-    this.notifyUtil = notifyUtil;
-    this.contributorAgreements = contributorAgreements;
-  }
-
-  @Override
-  protected Response<ChangeInfo> applyImpl(
-      BatchUpdate.Factory updateFactory, TopLevelResource parent, ChangeInput input)
-      throws OrmException, IOException, InvalidChangeOperationException, RestApiException,
-          UpdateException, PermissionBackendException, ConfigInvalidException {
-    if (Strings.isNullOrEmpty(input.project)) {
-      throw new BadRequestException("project must be non-empty");
-    }
-
-    if (Strings.isNullOrEmpty(input.branch)) {
-      throw new BadRequestException("branch must be non-empty");
-    }
-
-    String subject = clean(Strings.nullToEmpty(input.subject));
-    if (Strings.isNullOrEmpty(subject)) {
-      throw new BadRequestException("commit message must be non-empty");
-    }
-
-    if (input.status != null) {
-      if (input.status != ChangeStatus.NEW) {
-        throw new BadRequestException("unsupported change status");
-      }
-    }
-
-    ProjectResource rsrc = projectsCollection.parse(input.project);
-    boolean privateByDefault = rsrc.getProjectState().isPrivateByDefault();
-    boolean isPrivate = input.isPrivate == null ? privateByDefault : input.isPrivate;
-
-    if (isPrivate && disablePrivateChanges) {
-      throw new MethodNotAllowedException("private changes are disabled");
-    }
-
-    contributorAgreements.check(rsrc.getNameKey(), rsrc.getUser());
-
-    Project.NameKey project = rsrc.getNameKey();
-    String refName = RefNames.fullName(input.branch);
-    permissionBackend.user(user).project(project).ref(refName).check(RefPermission.CREATE_CHANGE);
-
-    try (Repository git = gitManager.openRepository(project);
-        ObjectInserter oi = git.newObjectInserter();
-        ObjectReader reader = oi.newReader();
-        RevWalk rw = new RevWalk(reader)) {
-      ObjectId parentCommit;
-      List<String> groups;
-      if (input.baseChange != null) {
-        List<ChangeNotes> notes = changeFinder.find(input.baseChange);
-        if (notes.size() != 1) {
-          throw new UnprocessableEntityException("Base change not found: " + input.baseChange);
-        }
-        ChangeNotes change = Iterables.getOnlyElement(notes);
-        if (!permissionBackend.user(user).change(change).database(db).test(ChangePermission.READ)) {
-          throw new UnprocessableEntityException("Base change not found: " + input.baseChange);
-        }
-        PatchSet ps = psUtil.current(db.get(), change);
-        parentCommit = ObjectId.fromString(ps.getRevision().get());
-        groups = ps.getGroups();
-      } else {
-        Ref destRef = git.getRefDatabase().exactRef(refName);
-        if (destRef != null) {
-          if (Boolean.TRUE.equals(input.newBranch)) {
-            throw new ResourceConflictException(
-                String.format("Branch %s already exists.", refName));
-          }
-          parentCommit = destRef.getObjectId();
-        } else {
-          if (Boolean.TRUE.equals(input.newBranch)) {
-            parentCommit = null;
-          } else {
-            throw new UnprocessableEntityException(
-                String.format("Branch %s does not exist.", refName));
-          }
-        }
-        groups = Collections.emptyList();
-      }
-      RevCommit mergeTip = parentCommit == null ? null : rw.parseCommit(parentCommit);
-
-      Timestamp now = TimeUtil.nowTs();
-      IdentifiedUser me = user.get().asIdentifiedUser();
-      PersonIdent author = me.newCommitterIdent(now, serverTimeZone);
-      AccountState account = accountCache.get(me.getAccountId());
-      GeneralPreferencesInfo info = account.getAccount().getGeneralPreferencesInfo();
-
-      boolean isWorkInProgress =
-          input.workInProgress == null
-              ? rsrc.getProjectState().isWorkInProgressByDefault()
-                  || MoreObjects.firstNonNull(info.workInProgressByDefault, false)
-              : input.workInProgress;
-
-      // Add a Change-Id line if there isn't already one
-      String commitMessage = subject;
-      if (ChangeIdUtil.indexOfChangeId(commitMessage, "\n") == -1) {
-        ObjectId treeId = mergeTip == null ? emptyTreeId(oi) : mergeTip.getTree();
-        ObjectId id = ChangeIdUtil.computeChangeId(treeId, mergeTip, author, author, commitMessage);
-        commitMessage = ChangeIdUtil.insertId(commitMessage, id);
-      }
-
-      if (Boolean.TRUE.equals(info.signedOffBy)) {
-        commitMessage =
-            Joiner.on("\n")
-                .join(
-                    commitMessage.trim(),
-                    String.format(
-                        "%s%s",
-                        SIGNED_OFF_BY_TAG, account.getAccount().getNameEmail(anonymousCowardName)));
-      }
-
-      RevCommit c;
-      if (input.merge != null) {
-        // create a merge commit
-        if (!(submitType.equals(SubmitType.MERGE_ALWAYS)
-            || submitType.equals(SubmitType.MERGE_IF_NECESSARY))) {
-          throw new BadRequestException("Submit type: " + submitType + " is not supported");
-        }
-        c =
-            newMergeCommit(
-                git, oi, rw, rsrc.getProjectState(), mergeTip, input.merge, author, commitMessage);
-      } else {
-        // create an empty commit
-        c = newCommit(oi, rw, author, mergeTip, commitMessage);
-      }
-
-      Change.Id changeId = new Change.Id(seq.nextChangeId());
-      ChangeInserter ins = changeInserterFactory.create(changeId, c, refName);
-      ins.setMessage(String.format("Uploaded patch set %s.", ins.getPatchSetId().get()));
-      String topic = input.topic;
-      if (topic != null) {
-        topic = Strings.emptyToNull(topic.trim());
-      }
-      ins.setTopic(topic);
-      ins.setPrivate(isPrivate);
-      ins.setWorkInProgress(isWorkInProgress);
-      ins.setGroups(groups);
-      ins.setNotify(input.notify);
-      ins.setAccountsToNotify(notifyUtil.resolveAccounts(input.notifyDetails));
-      try (BatchUpdate bu = updateFactory.create(db.get(), project, me, now)) {
-        bu.setRepository(git, rw, oi);
-        bu.insertChange(ins);
-        bu.execute();
-      }
-      ChangeJson json = jsonFactory.noOptions();
-      return Response.created(json.format(ins.getChange()));
-    } catch (IllegalArgumentException e) {
-      throw new BadRequestException(e.getMessage());
-    }
-  }
-
-  private static RevCommit newCommit(
-      ObjectInserter oi,
-      RevWalk rw,
-      PersonIdent authorIdent,
-      RevCommit mergeTip,
-      String commitMessage)
-      throws IOException {
-    CommitBuilder commit = new CommitBuilder();
-    if (mergeTip == null) {
-      commit.setTreeId(emptyTreeId(oi));
-    } else {
-      commit.setTreeId(mergeTip.getTree().getId());
-      commit.setParentId(mergeTip);
-    }
-    commit.setAuthor(authorIdent);
-    commit.setCommitter(authorIdent);
-    commit.setMessage(commitMessage);
-    return rw.parseCommit(insert(oi, commit));
-  }
-
-  private RevCommit newMergeCommit(
-      Repository repo,
-      ObjectInserter oi,
-      RevWalk rw,
-      ProjectState projectState,
-      RevCommit mergeTip,
-      MergeInput merge,
-      PersonIdent authorIdent,
-      String commitMessage)
-      throws RestApiException, IOException {
-    if (Strings.isNullOrEmpty(merge.source)) {
-      throw new BadRequestException("merge.source must be non-empty");
-    }
-
-    RevCommit sourceCommit = MergeUtil.resolveCommit(repo, rw, merge.source);
-    if (!commits.canRead(projectState, repo, sourceCommit)) {
-      throw new BadRequestException("do not have read permission for: " + merge.source);
-    }
-
-    MergeUtil mergeUtil = mergeUtilFactory.create(projectState);
-    // default merge strategy from project settings
-    String mergeStrategy =
-        MoreObjects.firstNonNull(
-            Strings.emptyToNull(merge.strategy), mergeUtil.mergeStrategyName());
-
-    return MergeUtil.createMergeCommit(
-        oi,
-        repo.getConfig(),
-        mergeTip,
-        sourceCommit,
-        mergeStrategy,
-        authorIdent,
-        commitMessage,
-        rw);
-  }
-
-  private static ObjectId insert(ObjectInserter inserter, CommitBuilder commit)
-      throws IOException, UnsupportedEncodingException {
-    ObjectId id = inserter.insert(commit);
-    inserter.flush();
-    return id;
-  }
-
-  private static ObjectId emptyTreeId(ObjectInserter inserter) throws IOException {
-    return inserter.insert(new TreeFormatter());
-  }
-
-  /**
-   * Remove comment lines from a commit message.
-   *
-   * <p>Based on {@link org.eclipse.jgit.util.ChangeIdUtil#clean}.
-   *
-   * @param msg
-   * @return message without comment lines, possibly empty.
-   */
-  private String clean(String msg) {
-    return msg.replaceAll("(?m)^#.*$\n?", "").trim();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateDraftComment.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateDraftComment.java
deleted file mode 100644
index 898f634..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateDraftComment.java
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.change;
-
-import static com.google.gerrit.server.CommentsUtil.setCommentRevId;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.api.changes.DraftInput;
-import com.google.gerrit.extensions.common.CommentInfo;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.extensions.restapi.Url;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.PatchLineComment.Status;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CommentsUtil;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.patch.PatchListCache;
-import com.google.gerrit.server.patch.PatchListNotAvailableException;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.RetryingRestModifyView;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.Collections;
-
-@Singleton
-public class CreateDraftComment
-    extends RetryingRestModifyView<RevisionResource, DraftInput, Response<CommentInfo>> {
-  private final Provider<ReviewDb> db;
-  private final Provider<CommentJson> commentJson;
-  private final CommentsUtil commentsUtil;
-  private final PatchSetUtil psUtil;
-  private final PatchListCache patchListCache;
-
-  @Inject
-  CreateDraftComment(
-      Provider<ReviewDb> db,
-      RetryHelper retryHelper,
-      Provider<CommentJson> commentJson,
-      CommentsUtil commentsUtil,
-      PatchSetUtil psUtil,
-      PatchListCache patchListCache) {
-    super(retryHelper);
-    this.db = db;
-    this.commentJson = commentJson;
-    this.commentsUtil = commentsUtil;
-    this.psUtil = psUtil;
-    this.patchListCache = patchListCache;
-  }
-
-  @Override
-  protected Response<CommentInfo> applyImpl(
-      BatchUpdate.Factory updateFactory, RevisionResource rsrc, DraftInput in)
-      throws RestApiException, UpdateException, OrmException {
-    if (Strings.isNullOrEmpty(in.path)) {
-      throw new BadRequestException("path must be non-empty");
-    } else if (in.message == null || in.message.trim().isEmpty()) {
-      throw new BadRequestException("message must be non-empty");
-    } else if (in.line != null && in.line < 0) {
-      throw new BadRequestException("line must be >= 0");
-    } else if (in.line != null && in.range != null && in.line != in.range.endLine) {
-      throw new BadRequestException("range endLine must be on the same line as the comment");
-    }
-
-    try (BatchUpdate bu =
-        updateFactory.create(db.get(), rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
-      Op op = new Op(rsrc.getPatchSet().getId(), in);
-      bu.addOp(rsrc.getChange().getId(), op);
-      bu.execute();
-      return Response.created(
-          commentJson.get().setFillAccounts(false).newCommentFormatter().format(op.comment));
-    }
-  }
-
-  private class Op implements BatchUpdateOp {
-    private final PatchSet.Id psId;
-    private final DraftInput in;
-
-    private Comment comment;
-
-    private Op(PatchSet.Id psId, DraftInput in) {
-      this.psId = psId;
-      this.in = in;
-    }
-
-    @Override
-    public boolean updateChange(ChangeContext ctx)
-        throws ResourceNotFoundException, OrmException, UnprocessableEntityException,
-            PatchListNotAvailableException {
-      PatchSet ps = psUtil.get(ctx.getDb(), ctx.getNotes(), psId);
-      if (ps == null) {
-        throw new ResourceNotFoundException("patch set not found: " + psId);
-      }
-      String parentUuid = Url.decode(in.inReplyTo);
-
-      comment =
-          commentsUtil.newComment(
-              ctx, in.path, ps.getId(), in.side(), in.message.trim(), in.unresolved, parentUuid);
-      comment.setLineNbrAndRange(in.line, in.range);
-      comment.tag = in.tag;
-
-      setCommentRevId(comment, patchListCache, ctx.getChange(), ps);
-
-      commentsUtil.putComments(
-          ctx.getDb(), ctx.getUpdate(psId), Status.DRAFT, Collections.singleton(comment));
-      ctx.dontBumpLastUpdatedOn();
-      return true;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateMergePatchSet.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateMergePatchSet.java
deleted file mode 100644
index 0425e53..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateMergePatchSet.java
+++ /dev/null
@@ -1,220 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.change;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Strings;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.client.ListChangesOption;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.MergeInput;
-import com.google.gerrit.extensions.common.MergePatchSetInput;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.MergeConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ChangeUtil;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MergeIdenticalTreeException;
-import com.google.gerrit.server.git.MergeUtil;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.CommitsCollection;
-import com.google.gerrit.server.project.InvalidChangeOperationException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.RetryingRestModifyView;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.TimeZone;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.util.ChangeIdUtil;
-
-@Singleton
-public class CreateMergePatchSet
-    extends RetryingRestModifyView<ChangeResource, MergePatchSetInput, Response<ChangeInfo>> {
-  private final Provider<ReviewDb> db;
-  private final GitRepositoryManager gitManager;
-  private final CommitsCollection commits;
-  private final TimeZone serverTimeZone;
-  private final Provider<CurrentUser> user;
-  private final ChangeJson.Factory jsonFactory;
-  private final PatchSetUtil psUtil;
-  private final MergeUtil.Factory mergeUtilFactory;
-  private final PatchSetInserter.Factory patchSetInserterFactory;
-  private final ProjectCache projectCache;
-
-  @Inject
-  CreateMergePatchSet(
-      Provider<ReviewDb> db,
-      GitRepositoryManager gitManager,
-      CommitsCollection commits,
-      @GerritPersonIdent PersonIdent myIdent,
-      Provider<CurrentUser> user,
-      ChangeJson.Factory json,
-      PatchSetUtil psUtil,
-      MergeUtil.Factory mergeUtilFactory,
-      RetryHelper retryHelper,
-      PatchSetInserter.Factory patchSetInserterFactory,
-      ProjectCache projectCache) {
-    super(retryHelper);
-    this.db = db;
-    this.gitManager = gitManager;
-    this.commits = commits;
-    this.serverTimeZone = myIdent.getTimeZone();
-    this.user = user;
-    this.jsonFactory = json;
-    this.psUtil = psUtil;
-    this.mergeUtilFactory = mergeUtilFactory;
-    this.patchSetInserterFactory = patchSetInserterFactory;
-    this.projectCache = projectCache;
-  }
-
-  @Override
-  protected Response<ChangeInfo> applyImpl(
-      BatchUpdate.Factory updateFactory, ChangeResource rsrc, MergePatchSetInput in)
-      throws OrmException, IOException, InvalidChangeOperationException, RestApiException,
-          UpdateException, PermissionBackendException {
-    rsrc.permissions().database(db).check(ChangePermission.ADD_PATCH_SET);
-
-    MergeInput merge = in.merge;
-    if (merge == null || Strings.isNullOrEmpty(merge.source)) {
-      throw new BadRequestException("merge.source must be non-empty");
-    }
-
-    PatchSet ps = psUtil.current(db.get(), rsrc.getNotes());
-    ProjectState projectState = projectCache.checkedGet(rsrc.getProject());
-    Change change = rsrc.getChange();
-    Project.NameKey project = change.getProject();
-    Branch.NameKey dest = change.getDest();
-    try (Repository git = gitManager.openRepository(project);
-        ObjectInserter oi = git.newObjectInserter();
-        ObjectReader reader = oi.newReader();
-        RevWalk rw = new RevWalk(reader)) {
-
-      RevCommit sourceCommit = MergeUtil.resolveCommit(git, rw, merge.source);
-      if (!commits.canRead(projectState, git, sourceCommit)) {
-        throw new ResourceNotFoundException(
-            "cannot find source commit: " + merge.source + " to merge.");
-      }
-
-      RevCommit currentPsCommit = rw.parseCommit(ObjectId.fromString(ps.getRevision().get()));
-      Timestamp now = TimeUtil.nowTs();
-      IdentifiedUser me = user.get().asIdentifiedUser();
-      PersonIdent author = me.newCommitterIdent(now, serverTimeZone);
-      RevCommit newCommit =
-          createMergeCommit(
-              in,
-              projectState,
-              dest,
-              git,
-              oi,
-              rw,
-              currentPsCommit,
-              sourceCommit,
-              author,
-              ObjectId.fromString(change.getKey().get().substring(1)));
-
-      PatchSet.Id nextPsId = ChangeUtil.nextPatchSetId(ps.getId());
-      PatchSetInserter psInserter =
-          patchSetInserterFactory.create(rsrc.getNotes(), nextPsId, newCommit);
-      try (BatchUpdate bu = updateFactory.create(db.get(), project, me, now)) {
-        bu.setRepository(git, rw, oi);
-        bu.addOp(
-            rsrc.getId(),
-            psInserter
-                .setMessage("Uploaded patch set " + nextPsId.get() + ".")
-                .setNotify(NotifyHandling.NONE)
-                .setCheckAddPatchSetPermission(false)
-                .setNotify(NotifyHandling.NONE));
-        bu.execute();
-      }
-
-      ChangeJson json = jsonFactory.create(ListChangesOption.CURRENT_REVISION);
-      return Response.ok(json.format(psInserter.getChange()));
-    }
-  }
-
-  private RevCommit createMergeCommit(
-      MergePatchSetInput in,
-      ProjectState projectState,
-      Branch.NameKey dest,
-      Repository git,
-      ObjectInserter oi,
-      RevWalk rw,
-      RevCommit currentPsCommit,
-      RevCommit sourceCommit,
-      PersonIdent author,
-      ObjectId changeId)
-      throws ResourceNotFoundException, MergeIdenticalTreeException, MergeConflictException,
-          IOException {
-
-    ObjectId parentCommit;
-    if (in.inheritParent) {
-      // inherit first parent from previous patch set
-      parentCommit = currentPsCommit.getParent(0);
-    } else {
-      // get the current branch tip of destination branch
-      Ref destRef = git.getRefDatabase().exactRef(dest.get());
-      if (destRef != null) {
-        parentCommit = destRef.getObjectId();
-      } else {
-        throw new ResourceNotFoundException("cannot find destination branch");
-      }
-    }
-    RevCommit mergeTip = rw.parseCommit(parentCommit);
-
-    String commitMsg;
-    if (Strings.emptyToNull(in.subject) != null) {
-      commitMsg = ChangeIdUtil.insertId(in.subject, changeId);
-    } else {
-      // reuse previous patch set commit message
-      commitMsg = currentPsCommit.getFullMessage();
-    }
-
-    String mergeStrategy =
-        MoreObjects.firstNonNull(
-            Strings.emptyToNull(in.merge.strategy),
-            mergeUtilFactory.create(projectState).mergeStrategyName());
-
-    return MergeUtil.createMergeCommit(
-        oi, git.getConfig(), mergeTip, sourceCommit, mergeStrategy, author, commitMsg, rw);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteAssignee.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteAssignee.java
deleted file mode 100644
index d3feb31..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteAssignee.java
+++ /dev/null
@@ -1,131 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.change;
-
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountLoader;
-import com.google.gerrit.server.change.DeleteAssignee.Input;
-import com.google.gerrit.server.extensions.events.AssigneeChanged;
-import com.google.gerrit.server.notedb.ChangeUpdate;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.Context;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.RetryingRestModifyView;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-
-@Singleton
-public class DeleteAssignee
-    extends RetryingRestModifyView<ChangeResource, Input, Response<AccountInfo>> {
-  public static class Input {}
-
-  private final ChangeMessagesUtil cmUtil;
-  private final Provider<ReviewDb> db;
-  private final AssigneeChanged assigneeChanged;
-  private final IdentifiedUser.GenericFactory userFactory;
-  private final AccountLoader.Factory accountLoaderFactory;
-
-  @Inject
-  DeleteAssignee(
-      RetryHelper retryHelper,
-      ChangeMessagesUtil cmUtil,
-      Provider<ReviewDb> db,
-      AssigneeChanged assigneeChanged,
-      IdentifiedUser.GenericFactory userFactory,
-      AccountLoader.Factory accountLoaderFactory) {
-    super(retryHelper);
-    this.cmUtil = cmUtil;
-    this.db = db;
-    this.assigneeChanged = assigneeChanged;
-    this.userFactory = userFactory;
-    this.accountLoaderFactory = accountLoaderFactory;
-  }
-
-  @Override
-  protected Response<AccountInfo> applyImpl(
-      BatchUpdate.Factory updateFactory, ChangeResource rsrc, Input input)
-      throws RestApiException, UpdateException, OrmException, PermissionBackendException {
-    rsrc.permissions().check(ChangePermission.EDIT_ASSIGNEE);
-
-    try (BatchUpdate bu =
-        updateFactory.create(db.get(), rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
-      Op op = new Op();
-      bu.addOp(rsrc.getChange().getId(), op);
-      bu.execute();
-      Account.Id deletedAssignee = op.getDeletedAssignee();
-      return deletedAssignee == null
-          ? Response.none()
-          : Response.ok(accountLoaderFactory.create(true).fillOne(deletedAssignee));
-    }
-  }
-
-  private class Op implements BatchUpdateOp {
-    private Change change;
-    private Account deletedAssignee;
-
-    @Override
-    public boolean updateChange(ChangeContext ctx) throws RestApiException, OrmException {
-      change = ctx.getChange();
-      ChangeUpdate update = ctx.getUpdate(change.currentPatchSetId());
-      Account.Id currentAssigneeId = change.getAssignee();
-      if (currentAssigneeId == null) {
-        return false;
-      }
-      IdentifiedUser deletedAssigneeUser = userFactory.create(currentAssigneeId);
-      deletedAssignee = deletedAssigneeUser.getAccount();
-      // noteDb
-      update.removeAssignee();
-      // reviewDb
-      change.setAssignee(null);
-      addMessage(ctx, update, deletedAssigneeUser);
-      return true;
-    }
-
-    public Account.Id getDeletedAssignee() {
-      return deletedAssignee != null ? deletedAssignee.getId() : null;
-    }
-
-    private void addMessage(ChangeContext ctx, ChangeUpdate update, IdentifiedUser deletedAssignee)
-        throws OrmException {
-      ChangeMessage cmsg =
-          ChangeMessagesUtil.newMessage(
-              ctx,
-              "Assignee deleted: " + deletedAssignee.getNameEmail(),
-              ChangeMessagesUtil.TAG_DELETE_ASSIGNEE);
-      cmUtil.addChangeMessage(ctx.getDb(), update, cmsg);
-    }
-
-    @Override
-    public void postUpdate(Context ctx) throws OrmException {
-      assigneeChanged.fire(change, ctx.getAccount(), deletedAssignee, ctx.getWhen());
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteChange.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteChange.java
deleted file mode 100644
index af26e8a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteChange.java
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.change;
-
-import static com.google.gerrit.extensions.conditions.BooleanCondition.and;
-
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.webui.UiAction;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.change.DeleteChange.Input;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.Order;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.RetryingRestModifyView;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-
-@Singleton
-public class DeleteChange extends RetryingRestModifyView<ChangeResource, Input, Response<?>>
-    implements UiAction<ChangeResource> {
-  public static class Input {}
-
-  private final Provider<ReviewDb> db;
-  private final Provider<DeleteChangeOp> opProvider;
-
-  @Inject
-  public DeleteChange(
-      Provider<ReviewDb> db, RetryHelper retryHelper, Provider<DeleteChangeOp> opProvider) {
-    super(retryHelper);
-    this.db = db;
-    this.opProvider = opProvider;
-  }
-
-  @Override
-  protected Response<?> applyImpl(
-      BatchUpdate.Factory updateFactory, ChangeResource rsrc, Input input)
-      throws RestApiException, UpdateException, PermissionBackendException {
-    if (rsrc.getChange().getStatus() == Change.Status.MERGED) {
-      throw new MethodNotAllowedException("delete not permitted");
-    }
-    rsrc.permissions().database(db).check(ChangePermission.DELETE);
-
-    try (BatchUpdate bu =
-        updateFactory.create(db.get(), rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
-      Change.Id id = rsrc.getChange().getId();
-      bu.setOrder(Order.DB_BEFORE_REPO);
-      bu.addOp(id, opProvider.get());
-      bu.execute();
-    }
-    return Response.none();
-  }
-
-  @Override
-  public UiAction.Description getDescription(ChangeResource rsrc) {
-    Change.Status status = rsrc.getChange().getStatus();
-    PermissionBackend.ForChange perm = rsrc.permissions().database(db);
-    return new UiAction.Description()
-        .setLabel("Delete")
-        .setTitle("Delete change " + rsrc.getId())
-        .setVisible(and(couldDeleteWhenIn(status), perm.testCond(ChangePermission.DELETE)));
-  }
-
-  private boolean couldDeleteWhenIn(Change.Status status) {
-    switch (status) {
-      case NEW:
-      case ABANDONED:
-        // New or abandoned changes can be deleted with the right permissions.
-        return true;
-
-      case MERGED:
-        // Merged changes should never be deleted.
-        return false;
-    }
-    return false;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteChangeEdit.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteChangeEdit.java
deleted file mode 100644
index e2e3920..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteChangeEdit.java
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.server.change.DeleteChangeEdit.Input;
-import com.google.gerrit.server.edit.ChangeEdit;
-import com.google.gerrit.server.edit.ChangeEditUtil;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.Optional;
-
-@Singleton
-public class DeleteChangeEdit implements RestModifyView<ChangeResource, Input> {
-  public static class Input {}
-
-  private final ChangeEditUtil editUtil;
-
-  @Inject
-  DeleteChangeEdit(ChangeEditUtil editUtil) {
-    this.editUtil = editUtil;
-  }
-
-  @Override
-  public Response<?> apply(ChangeResource rsrc, Input input)
-      throws AuthException, ResourceNotFoundException, IOException, OrmException {
-    Optional<ChangeEdit> edit = editUtil.byChange(rsrc.getNotes(), rsrc.getUser());
-    if (edit.isPresent()) {
-      editUtil.delete(edit.get());
-    } else {
-      throw new ResourceNotFoundException();
-    }
-
-    return Response.none();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteChangeOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteChangeOp.java
deleted file mode 100644
index 52bd357..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteChangeOp.java
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.change;
-
-import static com.google.common.base.Preconditions.checkState;
-
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.reviewdb.server.ReviewDbUtil;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.StarredChangesUtil;
-import com.google.gerrit.server.extensions.events.ChangeDeleted;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.BatchUpdateReviewDb;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.Order;
-import com.google.gerrit.server.update.RepoContext;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Map;
-import java.util.Optional;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-class DeleteChangeOp implements BatchUpdateOp {
-  static ReviewDb unwrap(ReviewDb db) {
-    // This is special. We want to delete exactly the rows that are present in
-    // the database, even when reading everything else from NoteDb, so we need
-    // to bypass the write-only wrapper.
-    if (db instanceof BatchUpdateReviewDb) {
-      db = ((BatchUpdateReviewDb) db).unsafeGetDelegate();
-    }
-    return ReviewDbUtil.unwrapDb(db);
-  }
-
-  private final PatchSetUtil psUtil;
-  private final StarredChangesUtil starredChangesUtil;
-  private final DynamicItem<AccountPatchReviewStore> accountPatchReviewStore;
-  private final ChangeDeleted changeDeleted;
-
-  private Change.Id id;
-
-  @Inject
-  DeleteChangeOp(
-      PatchSetUtil psUtil,
-      StarredChangesUtil starredChangesUtil,
-      DynamicItem<AccountPatchReviewStore> accountPatchReviewStore,
-      ChangeDeleted changeDeleted) {
-    this.psUtil = psUtil;
-    this.starredChangesUtil = starredChangesUtil;
-    this.accountPatchReviewStore = accountPatchReviewStore;
-    this.changeDeleted = changeDeleted;
-  }
-
-  @Override
-  public boolean updateChange(ChangeContext ctx)
-      throws RestApiException, OrmException, IOException, NoSuchChangeException {
-    checkState(
-        ctx.getOrder() == Order.DB_BEFORE_REPO, "must use DeleteChangeOp with DB_BEFORE_REPO");
-    checkState(id == null, "cannot reuse DeleteChangeOp");
-
-    id = ctx.getChange().getId();
-    Collection<PatchSet> patchSets = psUtil.byChange(ctx.getDb(), ctx.getNotes());
-
-    ensureDeletable(ctx, id, patchSets);
-    // Cleaning up is only possible as long as the change and its elements are
-    // still part of the database.
-    cleanUpReferences(ctx, id, patchSets);
-    deleteChangeElementsFromDb(ctx, id);
-
-    ctx.deleteChange();
-    changeDeleted.fire(ctx.getChange(), ctx.getAccount(), ctx.getWhen());
-    return true;
-  }
-
-  private void ensureDeletable(ChangeContext ctx, Change.Id id, Collection<PatchSet> patchSets)
-      throws ResourceConflictException, MethodNotAllowedException, IOException {
-    Change.Status status = ctx.getChange().getStatus();
-    if (status == Change.Status.MERGED) {
-      throw new MethodNotAllowedException("Deleting merged change " + id + " is not allowed");
-    }
-    for (PatchSet patchSet : patchSets) {
-      if (isPatchSetMerged(ctx, patchSet)) {
-        throw new ResourceConflictException(
-            String.format(
-                "Cannot delete change %s: patch set %s is already merged",
-                id, patchSet.getPatchSetId()));
-      }
-    }
-  }
-
-  private boolean isPatchSetMerged(ChangeContext ctx, PatchSet patchSet) throws IOException {
-    Optional<ObjectId> destId = ctx.getRepoView().getRef(ctx.getChange().getDest().get());
-    if (!destId.isPresent()) {
-      return false;
-    }
-
-    RevWalk revWalk = ctx.getRevWalk();
-    ObjectId objectId = ObjectId.fromString(patchSet.getRevision().get());
-    return revWalk.isMergedInto(revWalk.parseCommit(objectId), revWalk.parseCommit(destId.get()));
-  }
-
-  private void deleteChangeElementsFromDb(ChangeContext ctx, Change.Id id) throws OrmException {
-    // Only delete from ReviewDb here; deletion from NoteDb is handled in
-    // BatchUpdate.
-    ReviewDb db = unwrap(ctx.getDb());
-    db.patchComments().delete(db.patchComments().byChange(id));
-    db.patchSetApprovals().delete(db.patchSetApprovals().byChange(id));
-    db.patchSets().delete(db.patchSets().byChange(id));
-    db.changeMessages().delete(db.changeMessages().byChange(id));
-  }
-
-  private void cleanUpReferences(ChangeContext ctx, Change.Id id, Collection<PatchSet> patchSets)
-      throws OrmException, NoSuchChangeException {
-    for (PatchSet ps : patchSets) {
-      accountPatchReviewStore.get().clearReviewed(ps.getId());
-    }
-
-    // Non-atomic operation on Accounts table; not much we can do to make it
-    // atomic.
-    starredChangesUtil.unstarAll(ctx.getChange().getProject(), id);
-  }
-
-  @Override
-  public void updateRepo(RepoContext ctx) throws IOException {
-    String prefix = new PatchSet.Id(id, 1).toRefName();
-    prefix = prefix.substring(0, prefix.length() - 1);
-    for (Map.Entry<String, ObjectId> e : ctx.getRepoView().getRefs(prefix).entrySet()) {
-      ctx.addRefUpdate(e.getValue(), ObjectId.zeroId(), prefix + e.getKey());
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteComment.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteComment.java
deleted file mode 100644
index 00f6568..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteComment.java
+++ /dev/null
@@ -1,140 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.change;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.api.changes.DeleteCommentInput;
-import com.google.gerrit.extensions.common.CommentInfo;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CommentsUtil;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.RetryingRestModifyView;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.List;
-import java.util.Optional;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-@Singleton
-public class DeleteComment
-    extends RetryingRestModifyView<CommentResource, DeleteCommentInput, CommentInfo> {
-
-  private final Provider<CurrentUser> userProvider;
-  private final Provider<ReviewDb> dbProvider;
-  private final PermissionBackend permissionBackend;
-  private final CommentsUtil commentsUtil;
-  private final Provider<CommentJson> commentJson;
-  private final ChangeNotes.Factory notesFactory;
-
-  @Inject
-  public DeleteComment(
-      Provider<CurrentUser> userProvider,
-      Provider<ReviewDb> dbProvider,
-      PermissionBackend permissionBackend,
-      RetryHelper retryHelper,
-      CommentsUtil commentsUtil,
-      Provider<CommentJson> commentJson,
-      ChangeNotes.Factory notesFactory) {
-    super(retryHelper);
-    this.userProvider = userProvider;
-    this.dbProvider = dbProvider;
-    this.permissionBackend = permissionBackend;
-    this.commentsUtil = commentsUtil;
-    this.commentJson = commentJson;
-    this.notesFactory = notesFactory;
-  }
-
-  @Override
-  public CommentInfo applyImpl(
-      BatchUpdate.Factory batchUpdateFactory, CommentResource rsrc, DeleteCommentInput input)
-      throws RestApiException, IOException, ConfigInvalidException, OrmException,
-          PermissionBackendException, UpdateException {
-    CurrentUser user = userProvider.get();
-    permissionBackend.user(user).check(GlobalPermission.ADMINISTRATE_SERVER);
-
-    if (input == null) {
-      input = new DeleteCommentInput();
-    }
-
-    String newMessage = getCommentNewMessage(user.asIdentifiedUser().getName(), input.reason);
-    DeleteCommentOp deleteCommentOp = new DeleteCommentOp(rsrc, newMessage);
-    try (BatchUpdate batchUpdate =
-        batchUpdateFactory.create(
-            dbProvider.get(), rsrc.getRevisionResource().getProject(), user, TimeUtil.nowTs())) {
-      batchUpdate.addOp(rsrc.getRevisionResource().getChange().getId(), deleteCommentOp).execute();
-    }
-
-    ChangeNotes updatedNotes =
-        notesFactory.createChecked(rsrc.getRevisionResource().getChange().getId());
-    List<Comment> changeComments = commentsUtil.publishedByChange(dbProvider.get(), updatedNotes);
-    Optional<Comment> updatedComment =
-        changeComments.stream().filter(c -> c.key.equals(rsrc.getComment().key)).findFirst();
-    if (!updatedComment.isPresent()) {
-      // This should not happen as this endpoint should not remove the whole comment.
-      throw new ResourceNotFoundException("comment not found: " + rsrc.getComment().key);
-    }
-
-    return commentJson.get().newCommentFormatter().format(updatedComment.get());
-  }
-
-  private static String getCommentNewMessage(String name, String reason) {
-    StringBuilder stringBuilder = new StringBuilder("Comment removed by: ").append(name);
-    if (!Strings.isNullOrEmpty(reason)) {
-      stringBuilder.append("; Reason: ").append(reason);
-    }
-    return stringBuilder.toString();
-  }
-
-  private class DeleteCommentOp implements BatchUpdateOp {
-    private final CommentResource rsrc;
-    private final String newMessage;
-
-    DeleteCommentOp(CommentResource rsrc, String newMessage) {
-      this.rsrc = rsrc;
-      this.newMessage = newMessage;
-    }
-
-    @Override
-    public boolean updateChange(ChangeContext ctx)
-        throws ResourceConflictException, OrmException, ResourceNotFoundException {
-      PatchSet.Id psId = ctx.getChange().currentPatchSetId();
-      commentsUtil.deleteCommentByRewritingHistory(
-          ctx.getDb(),
-          ctx.getUpdate(psId),
-          rsrc.getComment().key,
-          rsrc.getPatchSet().getId(),
-          newMessage);
-      return true;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftComment.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftComment.java
deleted file mode 100644
index aec233e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftComment.java
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.change;
-
-import static com.google.gerrit.server.CommentsUtil.setCommentRevId;
-
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.common.CommentInfo;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CommentsUtil;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.change.DeleteDraftComment.Input;
-import com.google.gerrit.server.patch.PatchListCache;
-import com.google.gerrit.server.patch.PatchListNotAvailableException;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.RetryingRestModifyView;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.Collections;
-import java.util.Optional;
-
-@Singleton
-public class DeleteDraftComment
-    extends RetryingRestModifyView<DraftCommentResource, Input, Response<CommentInfo>> {
-  static class Input {}
-
-  private final Provider<ReviewDb> db;
-  private final CommentsUtil commentsUtil;
-  private final PatchSetUtil psUtil;
-  private final PatchListCache patchListCache;
-
-  @Inject
-  DeleteDraftComment(
-      Provider<ReviewDb> db,
-      CommentsUtil commentsUtil,
-      PatchSetUtil psUtil,
-      RetryHelper retryHelper,
-      PatchListCache patchListCache) {
-    super(retryHelper);
-    this.db = db;
-    this.commentsUtil = commentsUtil;
-    this.psUtil = psUtil;
-    this.patchListCache = patchListCache;
-  }
-
-  @Override
-  protected Response<CommentInfo> applyImpl(
-      BatchUpdate.Factory updateFactory, DraftCommentResource rsrc, Input input)
-      throws RestApiException, UpdateException {
-    try (BatchUpdate bu =
-        updateFactory.create(
-            db.get(), rsrc.getChange().getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
-      Op op = new Op(rsrc.getComment().key);
-      bu.addOp(rsrc.getChange().getId(), op);
-      bu.execute();
-    }
-    return Response.none();
-  }
-
-  private class Op implements BatchUpdateOp {
-    private final Comment.Key key;
-
-    private Op(Comment.Key key) {
-      this.key = key;
-    }
-
-    @Override
-    public boolean updateChange(ChangeContext ctx)
-        throws ResourceNotFoundException, OrmException, PatchListNotAvailableException {
-      Optional<Comment> maybeComment =
-          commentsUtil.getDraft(ctx.getDb(), ctx.getNotes(), ctx.getIdentifiedUser(), key);
-      if (!maybeComment.isPresent()) {
-        return false; // Nothing to do.
-      }
-      PatchSet.Id psId = new PatchSet.Id(ctx.getChange().getId(), key.patchSetId);
-      PatchSet ps = psUtil.get(ctx.getDb(), ctx.getNotes(), psId);
-      if (ps == null) {
-        throw new ResourceNotFoundException("patch set not found: " + psId);
-      }
-      Comment c = maybeComment.get();
-      setCommentRevId(c, patchListCache, ctx.getChange(), ps);
-      commentsUtil.deleteComments(ctx.getDb(), ctx.getUpdate(psId), Collections.singleton(c));
-      ctx.dontBumpLastUpdatedOn();
-      return true;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeletePrivate.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeletePrivate.java
deleted file mode 100644
index ba5403a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeletePrivate.java
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.change;
-
-import static com.google.gerrit.extensions.conditions.BooleanCondition.or;
-
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.conditions.BooleanCondition;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.RetryingRestModifyView;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-
-@Singleton
-public class DeletePrivate
-    extends RetryingRestModifyView<ChangeResource, SetPrivateOp.Input, Response<String>> {
-  private final ChangeMessagesUtil cmUtil;
-  private final Provider<ReviewDb> dbProvider;
-  private final PermissionBackend permissionBackend;
-  private final SetPrivateOp.Factory setPrivateOpFactory;
-
-  @Inject
-  DeletePrivate(
-      Provider<ReviewDb> dbProvider,
-      RetryHelper retryHelper,
-      ChangeMessagesUtil cmUtil,
-      PermissionBackend permissionBackend,
-      SetPrivateOp.Factory setPrivateOpFactory) {
-    super(retryHelper);
-    this.dbProvider = dbProvider;
-    this.cmUtil = cmUtil;
-    this.permissionBackend = permissionBackend;
-    this.setPrivateOpFactory = setPrivateOpFactory;
-  }
-
-  @Override
-  protected Response<String> applyImpl(
-      BatchUpdate.Factory updateFactory, ChangeResource rsrc, SetPrivateOp.Input input)
-      throws RestApiException, UpdateException {
-    if (!canDeletePrivate(rsrc).value()) {
-      throw new AuthException("not allowed to unmark private");
-    }
-
-    if (!rsrc.getChange().isPrivate()) {
-      throw new ResourceConflictException("change is not private");
-    }
-
-    SetPrivateOp op = setPrivateOpFactory.create(cmUtil, false, input);
-    try (BatchUpdate u =
-        updateFactory.create(
-            dbProvider.get(), rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
-      u.addOp(rsrc.getId(), op).execute();
-    }
-
-    return Response.none();
-  }
-
-  protected BooleanCondition canDeletePrivate(ChangeResource rsrc) {
-    PermissionBackend.WithUser user = permissionBackend.user(rsrc.getUser());
-    return or(rsrc.isUserOwner(), user.testCond(GlobalPermission.ADMINISTRATE_SERVER));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeletePrivateByPost.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeletePrivateByPost.java
deleted file mode 100644
index a392492..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeletePrivateByPost.java
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.change;
-
-import static com.google.gerrit.extensions.conditions.BooleanCondition.and;
-
-import com.google.gerrit.extensions.webui.UiAction;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-
-@Singleton
-public class DeletePrivateByPost extends DeletePrivate implements UiAction<ChangeResource> {
-  @Inject
-  DeletePrivateByPost(
-      Provider<ReviewDb> dbProvider,
-      RetryHelper retryHelper,
-      ChangeMessagesUtil cmUtil,
-      PermissionBackend permissionBackend,
-      SetPrivateOp.Factory setPrivateOpFactory) {
-    super(dbProvider, retryHelper, cmUtil, permissionBackend, setPrivateOpFactory);
-  }
-
-  @Override
-  public Description getDescription(ChangeResource rsrc) {
-    return new UiAction.Description()
-        .setLabel("Unmark private")
-        .setTitle("Unmark change as private")
-        .setVisible(and(rsrc.getChange().isPrivate(), canDeletePrivate(rsrc)));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteReviewer.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteReviewer.java
deleted file mode 100644
index c2bcd69..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteReviewer.java
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.change;
-
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.api.changes.DeleteReviewerInput;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.RetryingRestModifyView;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-
-@Singleton
-public class DeleteReviewer
-    extends RetryingRestModifyView<ReviewerResource, DeleteReviewerInput, Response<?>> {
-
-  private final Provider<ReviewDb> dbProvider;
-  private final DeleteReviewerOp.Factory deleteReviewerOpFactory;
-  private final DeleteReviewerByEmailOp.Factory deleteReviewerByEmailOpFactory;
-
-  @Inject
-  DeleteReviewer(
-      Provider<ReviewDb> dbProvider,
-      RetryHelper retryHelper,
-      DeleteReviewerOp.Factory deleteReviewerOpFactory,
-      DeleteReviewerByEmailOp.Factory deleteReviewerByEmailOpFactory) {
-    super(retryHelper);
-    this.dbProvider = dbProvider;
-    this.deleteReviewerOpFactory = deleteReviewerOpFactory;
-    this.deleteReviewerByEmailOpFactory = deleteReviewerByEmailOpFactory;
-  }
-
-  @Override
-  protected Response<?> applyImpl(
-      BatchUpdate.Factory updateFactory, ReviewerResource rsrc, DeleteReviewerInput input)
-      throws RestApiException, UpdateException {
-    if (input == null) {
-      input = new DeleteReviewerInput();
-    }
-
-    try (BatchUpdate bu =
-        updateFactory.create(
-            dbProvider.get(),
-            rsrc.getChangeResource().getProject(),
-            rsrc.getChangeResource().getUser(),
-            TimeUtil.nowTs())) {
-      BatchUpdateOp op;
-      if (rsrc.isByEmail()) {
-        op = deleteReviewerByEmailOpFactory.create(rsrc.getReviewerByEmail(), input);
-      } else {
-        op = deleteReviewerOpFactory.create(rsrc.getReviewerUser().getAccount(), input);
-      }
-      bu.addOp(rsrc.getChange().getId(), op);
-      bu.execute();
-    }
-    return Response.none();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteReviewerByEmailOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteReviewerByEmailOp.java
deleted file mode 100644
index 341ad4a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteReviewerByEmailOp.java
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.api.changes.DeleteReviewerInput;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.server.ChangeUtil;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.mail.send.DeleteReviewerSender;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.Context;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.util.Collections;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class DeleteReviewerByEmailOp implements BatchUpdateOp {
-  private static final Logger log = LoggerFactory.getLogger(DeleteReviewer.class);
-
-  public interface Factory {
-    DeleteReviewerByEmailOp create(Address reviewer, DeleteReviewerInput input);
-  }
-
-  private final DeleteReviewerSender.Factory deleteReviewerSenderFactory;
-  private final NotifyUtil notifyUtil;
-  private final Address reviewer;
-  private final DeleteReviewerInput input;
-
-  private ChangeMessage changeMessage;
-  private Change change;
-
-  @Inject
-  DeleteReviewerByEmailOp(
-      DeleteReviewerSender.Factory deleteReviewerSenderFactory,
-      NotifyUtil notifyUtil,
-      @Assisted Address reviewer,
-      @Assisted DeleteReviewerInput input) {
-    this.deleteReviewerSenderFactory = deleteReviewerSenderFactory;
-    this.notifyUtil = notifyUtil;
-    this.reviewer = reviewer;
-    this.input = input;
-  }
-
-  @Override
-  public boolean updateChange(ChangeContext ctx) throws OrmException {
-    change = ctx.getChange();
-    PatchSet.Id psId = ctx.getChange().currentPatchSetId();
-    String msg = "Removed reviewer " + reviewer;
-    changeMessage =
-        new ChangeMessage(
-            new ChangeMessage.Key(change.getId(), ChangeUtil.messageUuid()),
-            ctx.getAccountId(),
-            ctx.getWhen(),
-            psId);
-    changeMessage.setMessage(msg);
-
-    ctx.getUpdate(psId).setChangeMessage(msg);
-    ctx.getUpdate(psId).removeReviewerByEmail(reviewer);
-    return true;
-  }
-
-  @Override
-  public void postUpdate(Context ctx) {
-    if (input.notify == null) {
-      if (change.isWorkInProgress()) {
-        input.notify = NotifyHandling.NONE;
-      } else {
-        input.notify = NotifyHandling.ALL;
-      }
-    }
-    if (!NotifyUtil.shouldNotify(input.notify, input.notifyDetails)) {
-      return;
-    }
-    try {
-      DeleteReviewerSender cm =
-          deleteReviewerSenderFactory.create(ctx.getProject(), change.getId());
-      cm.setFrom(ctx.getAccountId());
-      cm.addReviewersByEmail(Collections.singleton(reviewer));
-      cm.setChangeMessage(changeMessage.getMessage(), changeMessage.getWrittenOn());
-      cm.setNotify(input.notify);
-      cm.setAccountsToNotify(notifyUtil.resolveAccounts(input.notifyDetails));
-      cm.send();
-    } catch (Exception err) {
-      log.error("Cannot email update for change " + change.getId(), err);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteReviewerOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteReviewerOp.java
deleted file mode 100644
index ad1cf60..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteReviewerOp.java
+++ /dev/null
@@ -1,253 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.change;
-
-import com.google.common.collect.Iterables;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.LabelTypes;
-import com.google.gerrit.extensions.api.changes.DeleteReviewerInput;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.reviewdb.server.ReviewDbUtil;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.extensions.events.ReviewerDeleted;
-import com.google.gerrit.server.mail.send.DeleteReviewerSender;
-import com.google.gerrit.server.notedb.ChangeUpdate;
-import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
-import com.google.gerrit.server.notedb.NotesMigration;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.RemoveReviewerControl;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.BatchUpdateReviewDb;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.Context;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class DeleteReviewerOp implements BatchUpdateOp {
-  private static final Logger log = LoggerFactory.getLogger(DeleteReviewer.class);
-
-  public interface Factory {
-    DeleteReviewerOp create(Account reviewerAccount, DeleteReviewerInput input);
-  }
-
-  private final ApprovalsUtil approvalsUtil;
-  private final PatchSetUtil psUtil;
-  private final ChangeMessagesUtil cmUtil;
-  private final IdentifiedUser.GenericFactory userFactory;
-  private final ReviewerDeleted reviewerDeleted;
-  private final Provider<IdentifiedUser> user;
-  private final DeleteReviewerSender.Factory deleteReviewerSenderFactory;
-  private final NotesMigration migration;
-  private final NotifyUtil notifyUtil;
-  private final RemoveReviewerControl removeReviewerControl;
-  private final ProjectCache projectCache;
-
-  private final Account reviewer;
-  private final DeleteReviewerInput input;
-
-  ChangeMessage changeMessage;
-  Change currChange;
-  PatchSet currPs;
-  Map<String, Short> newApprovals = new HashMap<>();
-  Map<String, Short> oldApprovals = new HashMap<>();
-
-  @Inject
-  DeleteReviewerOp(
-      ApprovalsUtil approvalsUtil,
-      PatchSetUtil psUtil,
-      ChangeMessagesUtil cmUtil,
-      IdentifiedUser.GenericFactory userFactory,
-      ReviewerDeleted reviewerDeleted,
-      Provider<IdentifiedUser> user,
-      DeleteReviewerSender.Factory deleteReviewerSenderFactory,
-      NotesMigration migration,
-      NotifyUtil notifyUtil,
-      RemoveReviewerControl removeReviewerControl,
-      ProjectCache projectCache,
-      @Assisted Account reviewerAccount,
-      @Assisted DeleteReviewerInput input) {
-    this.approvalsUtil = approvalsUtil;
-    this.psUtil = psUtil;
-    this.cmUtil = cmUtil;
-    this.userFactory = userFactory;
-    this.reviewerDeleted = reviewerDeleted;
-    this.user = user;
-    this.deleteReviewerSenderFactory = deleteReviewerSenderFactory;
-    this.migration = migration;
-    this.notifyUtil = notifyUtil;
-    this.removeReviewerControl = removeReviewerControl;
-    this.projectCache = projectCache;
-    this.reviewer = reviewerAccount;
-    this.input = input;
-  }
-
-  @Override
-  public boolean updateChange(ChangeContext ctx)
-      throws AuthException, ResourceNotFoundException, OrmException, PermissionBackendException,
-          IOException, NoSuchProjectException {
-    Account.Id reviewerId = reviewer.getId();
-    // Check of removing this reviewer (even if there is no vote processed by the loop below) is OK
-    removeReviewerControl.checkRemoveReviewer(ctx.getNotes(), ctx.getUser(), reviewerId);
-
-    if (!approvalsUtil.getReviewers(ctx.getDb(), ctx.getNotes()).all().contains(reviewerId)) {
-      throw new ResourceNotFoundException();
-    }
-    currChange = ctx.getChange();
-    currPs = psUtil.current(ctx.getDb(), ctx.getNotes());
-
-    LabelTypes labelTypes =
-        projectCache.checkedGet(ctx.getProject()).getLabelTypes(ctx.getNotes(), ctx.getUser());
-    // removing a reviewer will remove all her votes
-    for (LabelType lt : labelTypes.getLabelTypes()) {
-      newApprovals.put(lt.getName(), (short) 0);
-    }
-
-    StringBuilder msg = new StringBuilder();
-    msg.append("Removed reviewer " + reviewer.getFullName());
-    StringBuilder removedVotesMsg = new StringBuilder();
-    removedVotesMsg.append(" with the following votes:\n\n");
-    List<PatchSetApproval> del = new ArrayList<>();
-    boolean votesRemoved = false;
-    for (PatchSetApproval a : approvals(ctx, reviewerId)) {
-      // Check if removing this vote is OK
-      removeReviewerControl.checkRemoveReviewer(ctx.getNotes(), ctx.getUser(), a);
-      del.add(a);
-      if (a.getPatchSetId().equals(currPs.getId()) && a.getValue() != 0) {
-        oldApprovals.put(a.getLabel(), a.getValue());
-        removedVotesMsg
-            .append("* ")
-            .append(a.getLabel())
-            .append(formatLabelValue(a.getValue()))
-            .append(" by ")
-            .append(userFactory.create(a.getAccountId()).getNameEmail())
-            .append("\n");
-        votesRemoved = true;
-      }
-    }
-
-    if (votesRemoved) {
-      msg.append(removedVotesMsg);
-    } else {
-      msg.append(".");
-    }
-    ctx.getDb().patchSetApprovals().delete(del);
-    ChangeUpdate update = ctx.getUpdate(currPs.getId());
-    update.removeReviewer(reviewerId);
-
-    changeMessage =
-        ChangeMessagesUtil.newMessage(ctx, msg.toString(), ChangeMessagesUtil.TAG_DELETE_REVIEWER);
-    cmUtil.addChangeMessage(ctx.getDb(), update, changeMessage);
-
-    return true;
-  }
-
-  @Override
-  public void postUpdate(Context ctx) {
-    if (input.notify == null) {
-      if (currChange.isWorkInProgress()) {
-        input.notify = oldApprovals.isEmpty() ? NotifyHandling.NONE : NotifyHandling.OWNER;
-      } else {
-        input.notify = NotifyHandling.ALL;
-      }
-    }
-    if (NotifyUtil.shouldNotify(input.notify, input.notifyDetails)) {
-      emailReviewers(ctx.getProject(), currChange, changeMessage);
-    }
-    reviewerDeleted.fire(
-        currChange,
-        currPs,
-        reviewer,
-        ctx.getAccount(),
-        changeMessage.getMessage(),
-        newApprovals,
-        oldApprovals,
-        input.notify,
-        ctx.getWhen());
-  }
-
-  private Iterable<PatchSetApproval> approvals(ChangeContext ctx, Account.Id accountId)
-      throws OrmException {
-    Change.Id changeId = ctx.getNotes().getChangeId();
-    Iterable<PatchSetApproval> approvals;
-    PrimaryStorage r = PrimaryStorage.of(ctx.getChange());
-
-    if (migration.readChanges() && r == PrimaryStorage.REVIEW_DB) {
-      // Because NoteDb and ReviewDb have different semantics for zero-value
-      // approvals, we must fall back to ReviewDb as the source of truth here.
-      ReviewDb db = ctx.getDb();
-
-      if (db instanceof BatchUpdateReviewDb) {
-        db = ((BatchUpdateReviewDb) db).unsafeGetDelegate();
-      }
-      db = ReviewDbUtil.unwrapDb(db);
-      approvals = db.patchSetApprovals().byChange(changeId);
-    } else {
-      approvals = approvalsUtil.byChange(ctx.getDb(), ctx.getNotes()).values();
-    }
-
-    return Iterables.filter(approvals, psa -> accountId.equals(psa.getAccountId()));
-  }
-
-  private String formatLabelValue(short value) {
-    if (value > 0) {
-      return "+" + value;
-    }
-    return Short.toString(value);
-  }
-
-  private void emailReviewers(
-      Project.NameKey projectName, Change change, ChangeMessage changeMessage) {
-    Account.Id userId = user.get().getAccountId();
-    if (userId.equals(reviewer.getId())) {
-      // The user knows they removed themselves, don't bother emailing them.
-      return;
-    }
-    try {
-      DeleteReviewerSender cm = deleteReviewerSenderFactory.create(projectName, change.getId());
-      cm.setFrom(userId);
-      cm.addReviewers(Collections.singleton(reviewer.getId()));
-      cm.setChangeMessage(changeMessage.getMessage(), changeMessage.getWrittenOn());
-      cm.setNotify(input.notify);
-      cm.setAccountsToNotify(notifyUtil.resolveAccounts(input.notifyDetails));
-      cm.send();
-    } catch (Exception err) {
-      log.error("Cannot email update for change " + change.getId(), err);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteVote.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteVote.java
deleted file mode 100644
index 8c6c3cc..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteVote.java
+++ /dev/null
@@ -1,264 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.change;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.common.data.LabelTypes;
-import com.google.gerrit.extensions.api.changes.DeleteVoteInput;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.LabelId;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.extensions.events.VoteDeleted;
-import com.google.gerrit.server.mail.send.DeleteVoteSender;
-import com.google.gerrit.server.mail.send.ReplyToChangeSender;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.project.RemoveReviewerControl;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.Context;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.RetryingRestModifyView;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gerrit.server.util.LabelVote;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class DeleteVote extends RetryingRestModifyView<VoteResource, DeleteVoteInput, Response<?>> {
-  private static final Logger log = LoggerFactory.getLogger(DeleteVote.class);
-
-  private final Provider<ReviewDb> db;
-  private final ApprovalsUtil approvalsUtil;
-  private final PatchSetUtil psUtil;
-  private final ChangeMessagesUtil cmUtil;
-  private final IdentifiedUser.GenericFactory userFactory;
-  private final VoteDeleted voteDeleted;
-  private final DeleteVoteSender.Factory deleteVoteSenderFactory;
-  private final NotifyUtil notifyUtil;
-  private final RemoveReviewerControl removeReviewerControl;
-  private final ProjectCache projectCache;
-
-  @Inject
-  DeleteVote(
-      Provider<ReviewDb> db,
-      RetryHelper retryHelper,
-      ApprovalsUtil approvalsUtil,
-      PatchSetUtil psUtil,
-      ChangeMessagesUtil cmUtil,
-      IdentifiedUser.GenericFactory userFactory,
-      VoteDeleted voteDeleted,
-      DeleteVoteSender.Factory deleteVoteSenderFactory,
-      NotifyUtil notifyUtil,
-      RemoveReviewerControl removeReviewerControl,
-      ProjectCache projectCache) {
-    super(retryHelper);
-    this.db = db;
-    this.approvalsUtil = approvalsUtil;
-    this.psUtil = psUtil;
-    this.cmUtil = cmUtil;
-    this.userFactory = userFactory;
-    this.voteDeleted = voteDeleted;
-    this.deleteVoteSenderFactory = deleteVoteSenderFactory;
-    this.notifyUtil = notifyUtil;
-    this.removeReviewerControl = removeReviewerControl;
-    this.projectCache = projectCache;
-  }
-
-  @Override
-  protected Response<?> applyImpl(
-      BatchUpdate.Factory updateFactory, VoteResource rsrc, DeleteVoteInput input)
-      throws RestApiException, UpdateException, IOException {
-    if (input == null) {
-      input = new DeleteVoteInput();
-    }
-    if (input.label != null && !rsrc.getLabel().equals(input.label)) {
-      throw new BadRequestException("label must match URL");
-    }
-    if (input.notify == null) {
-      input.notify = NotifyHandling.ALL;
-    }
-    ReviewerResource r = rsrc.getReviewer();
-    Change change = r.getChange();
-
-    if (r.getRevisionResource() != null && !r.getRevisionResource().isCurrent()) {
-      throw new MethodNotAllowedException("Cannot delete vote on non-current patch set");
-    }
-
-    try (BatchUpdate bu =
-        updateFactory.create(
-            db.get(), change.getProject(), r.getChangeResource().getUser(), TimeUtil.nowTs())) {
-      bu.addOp(
-          change.getId(),
-          new Op(
-              projectCache.checkedGet(r.getChange().getProject()),
-              r.getReviewerUser().getAccount(),
-              rsrc.getLabel(),
-              input));
-      bu.execute();
-    }
-
-    return Response.none();
-  }
-
-  private class Op implements BatchUpdateOp {
-    private final ProjectState projectState;
-    private final Account account;
-    private final String label;
-    private final DeleteVoteInput input;
-
-    private ChangeMessage changeMessage;
-    private Change change;
-    private PatchSet ps;
-    private Map<String, Short> newApprovals = new HashMap<>();
-    private Map<String, Short> oldApprovals = new HashMap<>();
-
-    private Op(ProjectState projectState, Account account, String label, DeleteVoteInput input) {
-      this.projectState = projectState;
-      this.account = account;
-      this.label = label;
-      this.input = input;
-    }
-
-    @Override
-    public boolean updateChange(ChangeContext ctx)
-        throws OrmException, AuthException, ResourceNotFoundException, IOException,
-            PermissionBackendException, NoSuchProjectException {
-      change = ctx.getChange();
-      PatchSet.Id psId = change.currentPatchSetId();
-      ps = psUtil.current(db.get(), ctx.getNotes());
-
-      boolean found = false;
-      LabelTypes labelTypes = projectState.getLabelTypes(ctx.getNotes(), ctx.getUser());
-
-      for (PatchSetApproval a :
-          approvalsUtil.byPatchSetUser(
-              ctx.getDb(),
-              ctx.getNotes(),
-              ctx.getUser(),
-              psId,
-              account.getId(),
-              ctx.getRevWalk(),
-              ctx.getRepoView().getConfig())) {
-        if (labelTypes.byLabel(a.getLabelId()) == null) {
-          continue; // Ignore undefined labels.
-        } else if (!a.getLabel().equals(label)) {
-          // Populate map for non-matching labels, needed by VoteDeleted.
-          newApprovals.put(a.getLabel(), a.getValue());
-          continue;
-        } else {
-          try {
-            removeReviewerControl.checkRemoveReviewer(ctx.getNotes(), ctx.getUser(), a);
-          } catch (AuthException e) {
-            throw new AuthException("delete vote not permitted", e);
-          }
-        }
-        // Set the approval to 0 if vote is being removed.
-        newApprovals.put(a.getLabel(), (short) 0);
-        found = true;
-
-        // Set old value, as required by VoteDeleted.
-        oldApprovals.put(a.getLabel(), a.getValue());
-        break;
-      }
-      if (!found) {
-        throw new ResourceNotFoundException();
-      }
-
-      ctx.getUpdate(psId).removeApprovalFor(account.getId(), label);
-      ctx.getDb().patchSetApprovals().upsert(Collections.singleton(deletedApproval(ctx)));
-
-      StringBuilder msg = new StringBuilder();
-      msg.append("Removed ");
-      LabelVote.appendTo(msg, label, checkNotNull(oldApprovals.get(label)));
-      msg.append(" by ").append(userFactory.create(account.getId()).getNameEmail()).append("\n");
-      changeMessage =
-          ChangeMessagesUtil.newMessage(ctx, msg.toString(), ChangeMessagesUtil.TAG_DELETE_VOTE);
-      cmUtil.addChangeMessage(ctx.getDb(), ctx.getUpdate(psId), changeMessage);
-
-      return true;
-    }
-
-    private PatchSetApproval deletedApproval(ChangeContext ctx) {
-      // Set the effective user to the account we're trying to remove, and don't
-      // set the real user; this preserves the calling user as the NoteDb
-      // committer.
-      return new PatchSetApproval(
-          new PatchSetApproval.Key(ps.getId(), account.getId(), new LabelId(label)),
-          (short) 0,
-          ctx.getWhen());
-    }
-
-    @Override
-    public void postUpdate(Context ctx) {
-      if (changeMessage == null) {
-        return;
-      }
-
-      IdentifiedUser user = ctx.getIdentifiedUser();
-      if (NotifyUtil.shouldNotify(input.notify, input.notifyDetails)) {
-        try {
-          ReplyToChangeSender cm = deleteVoteSenderFactory.create(ctx.getProject(), change.getId());
-          cm.setFrom(user.getAccountId());
-          cm.setChangeMessage(changeMessage.getMessage(), ctx.getWhen());
-          cm.setNotify(input.notify);
-          cm.setAccountsToNotify(notifyUtil.resolveAccounts(input.notifyDetails));
-          cm.send();
-        } catch (Exception e) {
-          log.error("Cannot email update for change " + change.getId(), e);
-        }
-      }
-
-      voteDeleted.fire(
-          change,
-          ps,
-          account,
-          newApprovals,
-          oldApprovals,
-          input.notify,
-          changeMessage.getMessage(),
-          user.getAccount(),
-          ctx.getWhen());
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DownloadContent.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DownloadContent.java
deleted file mode 100644
index 311a25c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DownloadContent.java
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.restapi.BinaryResult;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.io.IOException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.kohsuke.args4j.Option;
-
-public class DownloadContent implements RestReadView<FileResource> {
-  private final FileContentUtil fileContentUtil;
-  private final ProjectCache projectCache;
-
-  @Option(name = "--parent")
-  private Integer parent;
-
-  @Inject
-  DownloadContent(FileContentUtil fileContentUtil, ProjectCache projectCache) {
-    this.fileContentUtil = fileContentUtil;
-    this.projectCache = projectCache;
-  }
-
-  @Override
-  public BinaryResult apply(FileResource rsrc)
-      throws ResourceNotFoundException, IOException, NoSuchChangeException, OrmException {
-    String path = rsrc.getPatchKey().get();
-    RevisionResource rev = rsrc.getRevision();
-    ObjectId revstr = ObjectId.fromString(rev.getPatchSet().getRevision().get());
-    return fileContentUtil.downloadContent(
-        projectCache.checkedGet(rev.getProject()), revstr, path, parent);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DraftCommentResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DraftCommentResource.java
deleted file mode 100644
index 0b1b15d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DraftCommentResource.java
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.restapi.RestResource;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.server.CurrentUser;
-import com.google.inject.TypeLiteral;
-
-public class DraftCommentResource implements RestResource {
-  public static final TypeLiteral<RestView<DraftCommentResource>> DRAFT_COMMENT_KIND =
-      new TypeLiteral<RestView<DraftCommentResource>>() {};
-
-  private final RevisionResource rev;
-  private final Comment comment;
-
-  public DraftCommentResource(RevisionResource rev, Comment c) {
-    this.rev = rev;
-    this.comment = c;
-  }
-
-  public CurrentUser getUser() {
-    return rev.getUser();
-  }
-
-  public Change getChange() {
-    return rev.getChange();
-  }
-
-  public PatchSet getPatchSet() {
-    return rev.getPatchSet();
-  }
-
-  Comment getComment() {
-    return comment;
-  }
-
-  String getId() {
-    return comment.key.uuid;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DraftComments.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DraftComments.java
deleted file mode 100644
index 4befc5b..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DraftComments.java
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ChildCollection;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CommentsUtil;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-
-@Singleton
-public class DraftComments implements ChildCollection<RevisionResource, DraftCommentResource> {
-  private final DynamicMap<RestView<DraftCommentResource>> views;
-  private final Provider<CurrentUser> user;
-  private final ListRevisionDrafts list;
-  private final Provider<ReviewDb> dbProvider;
-  private final CommentsUtil commentsUtil;
-
-  @Inject
-  DraftComments(
-      DynamicMap<RestView<DraftCommentResource>> views,
-      Provider<CurrentUser> user,
-      ListRevisionDrafts list,
-      Provider<ReviewDb> dbProvider,
-      CommentsUtil commentsUtil) {
-    this.views = views;
-    this.user = user;
-    this.list = list;
-    this.dbProvider = dbProvider;
-    this.commentsUtil = commentsUtil;
-  }
-
-  @Override
-  public DynamicMap<RestView<DraftCommentResource>> views() {
-    return views;
-  }
-
-  @Override
-  public ListRevisionDrafts list() throws AuthException {
-    checkIdentifiedUser();
-    return list;
-  }
-
-  @Override
-  public DraftCommentResource parse(RevisionResource rev, IdString id)
-      throws ResourceNotFoundException, OrmException, AuthException {
-    checkIdentifiedUser();
-    String uuid = id.get();
-    for (Comment c :
-        commentsUtil.draftByPatchSetAuthor(
-            dbProvider.get(), rev.getPatchSet().getId(), rev.getAccountId(), rev.getNotes())) {
-      if (uuid.equals(c.key.uuid)) {
-        return new DraftCommentResource(rev, c);
-      }
-    }
-    throw new ResourceNotFoundException(id);
-  }
-
-  private void checkIdentifiedUser() throws AuthException {
-    if (!(user.get().isIdentifiedUser())) {
-      throw new AuthException("drafts only available to authenticated users");
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/EmailReviewComments.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/EmailReviewComments.java
deleted file mode 100644
index 8e3ee9f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/EmailReviewComments.java
+++ /dev/null
@@ -1,189 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.change;
-
-import static com.google.gerrit.server.CommentsUtil.COMMENT_ORDER;
-
-import com.google.common.collect.ListMultimap;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.api.changes.RecipientType;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.git.SendEmailExecutor;
-import com.google.gerrit.server.mail.send.CommentSender;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.patch.PatchSetInfoFactory;
-import com.google.gerrit.server.util.LabelVote;
-import com.google.gerrit.server.util.RequestContext;
-import com.google.gerrit.server.util.ThreadLocalRequestContext;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.ProvisionException;
-import com.google.inject.assistedinject.Assisted;
-import java.util.List;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Future;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class EmailReviewComments implements Runnable, RequestContext {
-  private static final Logger log = LoggerFactory.getLogger(EmailReviewComments.class);
-
-  public interface Factory {
-    // TODO(dborowitz/wyatta): Rationalize these arguments so HTML and text templates are operating
-    // on the same set of inputs.
-    /**
-     * @param notify setting for handling notification.
-     * @param accountsToNotify detailed map of accounts to notify.
-     * @param notes change notes.
-     * @param patchSet patch set corresponding to the top-level op
-     * @param user user the email should come from.
-     * @param message used by text template only: the full ChangeMessage that will go in the
-     *     database. The contents of this message typically include the "Patch set N" header and "(M
-     *     comments)".
-     * @param comments inline comments.
-     * @param patchSetComment used by HTML template only: some quasi-human-generated text. The
-     *     contents should *not* include a "Patch set N" header or "(M comments)" footer, as these
-     *     will be added automatically in soy in a structured way.
-     * @param labels labels applied as part of this review operation.
-     * @return handle for sending email.
-     */
-    EmailReviewComments create(
-        NotifyHandling notify,
-        ListMultimap<RecipientType, Account.Id> accountsToNotify,
-        ChangeNotes notes,
-        PatchSet patchSet,
-        IdentifiedUser user,
-        ChangeMessage message,
-        List<Comment> comments,
-        String patchSetComment,
-        List<LabelVote> labels);
-  }
-
-  private final ExecutorService sendEmailsExecutor;
-  private final PatchSetInfoFactory patchSetInfoFactory;
-  private final CommentSender.Factory commentSenderFactory;
-  private final SchemaFactory<ReviewDb> schemaFactory;
-  private final ThreadLocalRequestContext requestContext;
-
-  private final NotifyHandling notify;
-  private final ListMultimap<RecipientType, Account.Id> accountsToNotify;
-  private final ChangeNotes notes;
-  private final PatchSet patchSet;
-  private final IdentifiedUser user;
-  private final ChangeMessage message;
-  private final List<Comment> comments;
-  private final String patchSetComment;
-  private final List<LabelVote> labels;
-  private ReviewDb db;
-
-  @Inject
-  EmailReviewComments(
-      @SendEmailExecutor ExecutorService executor,
-      PatchSetInfoFactory patchSetInfoFactory,
-      CommentSender.Factory commentSenderFactory,
-      SchemaFactory<ReviewDb> schemaFactory,
-      ThreadLocalRequestContext requestContext,
-      @Assisted NotifyHandling notify,
-      @Assisted ListMultimap<RecipientType, Account.Id> accountsToNotify,
-      @Assisted ChangeNotes notes,
-      @Assisted PatchSet patchSet,
-      @Assisted IdentifiedUser user,
-      @Assisted ChangeMessage message,
-      @Assisted List<Comment> comments,
-      @Nullable @Assisted String patchSetComment,
-      @Assisted List<LabelVote> labels) {
-    this.sendEmailsExecutor = executor;
-    this.patchSetInfoFactory = patchSetInfoFactory;
-    this.commentSenderFactory = commentSenderFactory;
-    this.schemaFactory = schemaFactory;
-    this.requestContext = requestContext;
-    this.notify = notify;
-    this.accountsToNotify = accountsToNotify;
-    this.notes = notes;
-    this.patchSet = patchSet;
-    this.user = user;
-    this.message = message;
-    this.comments = COMMENT_ORDER.sortedCopy(comments);
-    this.patchSetComment = patchSetComment;
-    this.labels = labels;
-  }
-
-  public void sendAsync() {
-    @SuppressWarnings("unused")
-    Future<?> possiblyIgnoredError = sendEmailsExecutor.submit(this);
-  }
-
-  @Override
-  public void run() {
-    RequestContext old = requestContext.setContext(this);
-    try {
-
-      CommentSender cm = commentSenderFactory.create(notes.getProjectName(), notes.getChangeId());
-      cm.setFrom(user.getAccountId());
-      cm.setPatchSet(patchSet, patchSetInfoFactory.get(notes.getProjectName(), patchSet));
-      cm.setChangeMessage(message.getMessage(), message.getWrittenOn());
-      cm.setComments(comments);
-      cm.setPatchSetComment(patchSetComment);
-      cm.setLabels(labels);
-      cm.setNotify(notify);
-      cm.setAccountsToNotify(accountsToNotify);
-      cm.send();
-    } catch (Exception e) {
-      log.error("Cannot email comments for " + patchSet.getId(), e);
-    } finally {
-      requestContext.setContext(old);
-      if (db != null) {
-        db.close();
-        db = null;
-      }
-    }
-  }
-
-  @Override
-  public String toString() {
-    return "send-email comments";
-  }
-
-  @Override
-  public CurrentUser getUser() {
-    return user.getRealUser();
-  }
-
-  @Override
-  public Provider<ReviewDb> getReviewDbProvider() {
-    return new Provider<ReviewDb>() {
-      @Override
-      public ReviewDb get() {
-        if (db == null) {
-          try {
-            db = schemaFactory.open();
-          } catch (OrmException e) {
-            throw new ProvisionException("Cannot open ReviewDb", e);
-          }
-        }
-        return db;
-      }
-    };
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/FileContentUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/FileContentUtil.java
deleted file mode 100644
index 00b7a88..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/FileContentUtil.java
+++ /dev/null
@@ -1,319 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.change;
-
-import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
-
-import com.google.common.base.Strings;
-import com.google.common.hash.Hasher;
-import com.google.common.hash.Hashing;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.common.data.PatchScript.FileMode;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.BinaryResult;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.reviewdb.client.Patch;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.mime.FileTypeRegistry;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import eu.medsea.mimeutil.MimeType;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.security.SecureRandom;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipOutputStream;
-import org.eclipse.jgit.errors.LargeObjectException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectLoader;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.treewalk.TreeWalk;
-import org.eclipse.jgit.util.NB;
-
-@Singleton
-public class FileContentUtil {
-  public static final String TEXT_X_GERRIT_COMMIT_MESSAGE = "text/x-gerrit-commit-message";
-  public static final String TEXT_X_GERRIT_MERGE_LIST = "text/x-gerrit-merge-list";
-  private static final String X_GIT_SYMLINK = "x-git/symlink";
-  private static final String X_GIT_GITLINK = "x-git/gitlink";
-  private static final int MAX_SIZE = 5 << 20;
-  private static final String ZIP_TYPE = "application/zip";
-  private static final SecureRandom rng = new SecureRandom();
-
-  private final GitRepositoryManager repoManager;
-  private final FileTypeRegistry registry;
-
-  @Inject
-  FileContentUtil(GitRepositoryManager repoManager, FileTypeRegistry ftr) {
-    this.repoManager = repoManager;
-    this.registry = ftr;
-  }
-
-  /**
-   * Get the content of a file at a specific commit or one of it's parent commits.
-   *
-   * @param project A {@code Project} that this request refers to.
-   * @param revstr An {@code ObjectId} specifying the commit.
-   * @param path A string specifying the filepath.
-   * @param parent A 1-based parent index to get the content from instead. Null if the content
-   *     should be obtained from {@code revstr} instead.
-   * @return Content of the file as {@code BinaryResult}.
-   * @throws ResourceNotFoundException
-   * @throws IOException
-   */
-  public BinaryResult getContent(
-      ProjectState project, ObjectId revstr, String path, @Nullable Integer parent)
-      throws BadRequestException, ResourceNotFoundException, IOException {
-    try (Repository repo = openRepository(project);
-        RevWalk rw = new RevWalk(repo)) {
-      if (parent != null) {
-        RevCommit revCommit = rw.parseCommit(revstr);
-        if (revCommit == null) {
-          throw new ResourceNotFoundException("commit not found");
-        }
-        if (parent > revCommit.getParentCount()) {
-          throw new BadRequestException("invalid parent");
-        }
-        revstr = rw.parseCommit(revstr).getParent(Integer.max(0, parent - 1)).toObjectId();
-      }
-      return getContent(repo, project, revstr, path);
-    }
-  }
-
-  public BinaryResult getContent(
-      Repository repo, ProjectState project, ObjectId revstr, String path)
-      throws IOException, ResourceNotFoundException {
-    try (RevWalk rw = new RevWalk(repo)) {
-      RevCommit commit = rw.parseCommit(revstr);
-      try (TreeWalk tw = TreeWalk.forPath(rw.getObjectReader(), path, commit.getTree())) {
-        if (tw == null) {
-          throw new ResourceNotFoundException();
-        }
-
-        org.eclipse.jgit.lib.FileMode mode = tw.getFileMode(0);
-        ObjectId id = tw.getObjectId(0);
-        if (mode == org.eclipse.jgit.lib.FileMode.GITLINK) {
-          return BinaryResult.create(id.name()).setContentType(X_GIT_GITLINK).base64();
-        }
-
-        ObjectLoader obj = repo.open(id, OBJ_BLOB);
-        byte[] raw;
-        try {
-          raw = obj.getCachedBytes(MAX_SIZE);
-        } catch (LargeObjectException e) {
-          raw = null;
-        }
-
-        String type;
-        if (mode == org.eclipse.jgit.lib.FileMode.SYMLINK) {
-          type = X_GIT_SYMLINK;
-        } else {
-          type = registry.getMimeType(path, raw).toString();
-          type = resolveContentType(project, path, FileMode.FILE, type);
-        }
-
-        return asBinaryResult(raw, obj).setContentType(type).base64();
-      }
-    }
-  }
-
-  private static BinaryResult asBinaryResult(byte[] raw, ObjectLoader obj) {
-    if (raw != null) {
-      return BinaryResult.create(raw);
-    }
-    BinaryResult result =
-        new BinaryResult() {
-          @Override
-          public void writeTo(OutputStream os) throws IOException {
-            obj.copyTo(os);
-          }
-        };
-    result.setContentLength(obj.getSize());
-    return result;
-  }
-
-  public BinaryResult downloadContent(
-      ProjectState project, ObjectId revstr, String path, @Nullable Integer parent)
-      throws ResourceNotFoundException, IOException {
-    try (Repository repo = openRepository(project);
-        RevWalk rw = new RevWalk(repo)) {
-      String suffix = "new";
-      RevCommit commit = rw.parseCommit(revstr);
-      if (parent != null && parent > 0) {
-        if (commit.getParentCount() == 1) {
-          suffix = "old";
-        } else {
-          suffix = "old" + parent;
-        }
-        commit = rw.parseCommit(commit.getParent(parent - 1));
-      }
-      try (TreeWalk tw = TreeWalk.forPath(rw.getObjectReader(), path, commit.getTree())) {
-        if (tw == null) {
-          throw new ResourceNotFoundException();
-        }
-
-        int mode = tw.getFileMode(0).getObjectType();
-        if (mode != Constants.OBJ_BLOB) {
-          throw new ResourceNotFoundException();
-        }
-
-        ObjectId id = tw.getObjectId(0);
-        ObjectLoader obj = repo.open(id, OBJ_BLOB);
-        byte[] raw;
-        try {
-          raw = obj.getCachedBytes(MAX_SIZE);
-        } catch (LargeObjectException e) {
-          raw = null;
-        }
-
-        MimeType contentType = registry.getMimeType(path, raw);
-        return registry.isSafeInline(contentType)
-            ? wrapBlob(path, obj, raw, contentType, suffix)
-            : zipBlob(path, obj, commit, suffix);
-      }
-    }
-  }
-
-  private BinaryResult wrapBlob(
-      String path,
-      final ObjectLoader obj,
-      byte[] raw,
-      MimeType contentType,
-      @Nullable String suffix) {
-    return asBinaryResult(raw, obj)
-        .setContentType(contentType.toString())
-        .setAttachmentName(safeFileName(path, suffix));
-  }
-
-  @SuppressWarnings("resource")
-  private BinaryResult zipBlob(
-      final String path, ObjectLoader obj, RevCommit commit, @Nullable final String suffix) {
-    final String commitName = commit.getName();
-    final long when = commit.getCommitTime() * 1000L;
-    return new BinaryResult() {
-      @Override
-      public void writeTo(OutputStream os) throws IOException {
-        try (ZipOutputStream zipOut = new ZipOutputStream(os)) {
-          String decoration = randSuffix();
-          if (!Strings.isNullOrEmpty(suffix)) {
-            decoration = suffix + '-' + decoration;
-          }
-          ZipEntry e = new ZipEntry(safeFileName(path, decoration));
-          e.setComment(commitName + ":" + path);
-          e.setSize(obj.getSize());
-          e.setTime(when);
-          zipOut.putNextEntry(e);
-          obj.copyTo(zipOut);
-          zipOut.closeEntry();
-        }
-      }
-    }.setContentType(ZIP_TYPE).setAttachmentName(safeFileName(path, suffix) + ".zip").disableGzip();
-  }
-
-  private static String safeFileName(String fileName, @Nullable String suffix) {
-    // Convert a file path (e.g. "src/Init.c") to a safe file name with
-    // no meta-characters that might be unsafe on any given platform.
-    //
-    int slash = fileName.lastIndexOf('/');
-    if (slash >= 0) {
-      fileName = fileName.substring(slash + 1);
-    }
-
-    StringBuilder r = new StringBuilder(fileName.length());
-    for (int i = 0; i < fileName.length(); i++) {
-      final char c = fileName.charAt(i);
-      if (c == '_' || c == '-' || c == '.' || c == '@') {
-        r.append(c);
-      } else if ('0' <= c && c <= '9') {
-        r.append(c);
-      } else if ('A' <= c && c <= 'Z') {
-        r.append(c);
-      } else if ('a' <= c && c <= 'z') {
-        r.append(c);
-      } else if (c == ' ' || c == '\n' || c == '\r' || c == '\t') {
-        r.append('-');
-      } else {
-        r.append('_');
-      }
-    }
-    fileName = r.toString();
-
-    int ext = fileName.lastIndexOf('.');
-    if (suffix == null) {
-      return fileName;
-    } else if (ext <= 0) {
-      return fileName + "_" + suffix;
-    } else {
-      return fileName.substring(0, ext) + "_" + suffix + fileName.substring(ext);
-    }
-  }
-
-  private static String randSuffix() {
-    // Produce a random suffix that is difficult (or nearly impossible)
-    // for an attacker to guess in advance. This reduces the risk that
-    // an attacker could upload a *.class file and have us send a ZIP
-    // that can be invoked through an applet tag in the victim's browser.
-    //
-    Hasher h = Hashing.murmur3_128().newHasher();
-    byte[] buf = new byte[8];
-
-    NB.encodeInt64(buf, 0, TimeUtil.nowMs());
-    h.putBytes(buf);
-
-    rng.nextBytes(buf);
-    h.putBytes(buf);
-
-    return h.hash().toString();
-  }
-
-  public static String resolveContentType(
-      ProjectState project, String path, FileMode fileMode, String mimeType) {
-    switch (fileMode) {
-      case FILE:
-        if (Patch.COMMIT_MSG.equals(path)) {
-          return TEXT_X_GERRIT_COMMIT_MESSAGE;
-        }
-        if (Patch.MERGE_LIST.equals(path)) {
-          return TEXT_X_GERRIT_MERGE_LIST;
-        }
-        if (project != null) {
-          for (ProjectState p : project.tree()) {
-            String t = p.getConfig().getMimeTypes().getMimeType(path);
-            if (t != null) {
-              return t;
-            }
-          }
-        }
-        return mimeType;
-      case GITLINK:
-        return X_GIT_GITLINK;
-      case SYMLINK:
-        return X_GIT_SYMLINK;
-      default:
-        throw new IllegalStateException("file mode: " + fileMode);
-    }
-  }
-
-  private Repository openRepository(ProjectState project)
-      throws RepositoryNotFoundException, IOException {
-    return repoManager.openRepository(project.getNameKey());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/FileInfoJson.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/FileInfoJson.java
deleted file mode 100644
index 6ccd460..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/FileInfoJson.java
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.change;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
-import com.google.gerrit.extensions.common.FileInfo;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Patch;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.RevId;
-import com.google.gerrit.server.patch.PatchList;
-import com.google.gerrit.server.patch.PatchListCache;
-import com.google.gerrit.server.patch.PatchListEntry;
-import com.google.gerrit.server.patch.PatchListKey;
-import com.google.gerrit.server.patch.PatchListNotAvailableException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.Map;
-import java.util.TreeMap;
-import org.eclipse.jgit.lib.ObjectId;
-
-@Singleton
-public class FileInfoJson {
-  private final PatchListCache patchListCache;
-
-  @Inject
-  FileInfoJson(PatchListCache patchListCache) {
-    this.patchListCache = patchListCache;
-  }
-
-  Map<String, FileInfo> toFileInfoMap(Change change, PatchSet patchSet)
-      throws PatchListNotAvailableException {
-    return toFileInfoMap(change, patchSet.getRevision(), null);
-  }
-
-  Map<String, FileInfo> toFileInfoMap(Change change, RevId revision, @Nullable PatchSet base)
-      throws PatchListNotAvailableException {
-    ObjectId objectId = ObjectId.fromString(revision.get());
-    return toFileInfoMap(change, objectId, base);
-  }
-
-  Map<String, FileInfo> toFileInfoMap(Change change, ObjectId objectId, @Nullable PatchSet base)
-      throws PatchListNotAvailableException {
-    ObjectId a = (base == null) ? null : ObjectId.fromString(base.getRevision().get());
-    return toFileInfoMap(change, PatchListKey.againstCommit(a, objectId, Whitespace.IGNORE_NONE));
-  }
-
-  Map<String, FileInfo> toFileInfoMap(Change change, RevId revision, int parent)
-      throws PatchListNotAvailableException {
-    ObjectId b = ObjectId.fromString(revision.get());
-    return toFileInfoMap(
-        change, PatchListKey.againstParentNum(parent + 1, b, Whitespace.IGNORE_NONE));
-  }
-
-  private Map<String, FileInfo> toFileInfoMap(Change change, PatchListKey key)
-      throws PatchListNotAvailableException {
-    PatchList list = patchListCache.get(key, change.getProject());
-
-    Map<String, FileInfo> files = new TreeMap<>();
-    for (PatchListEntry e : list.getPatches()) {
-      FileInfo d = new FileInfo();
-      d.status =
-          e.getChangeType() != Patch.ChangeType.MODIFIED ? e.getChangeType().getCode() : null;
-      d.oldPath = e.getOldName();
-      d.sizeDelta = e.getSizeDelta();
-      d.size = e.getSize();
-      if (e.getPatchType() == Patch.PatchType.BINARY) {
-        d.binary = true;
-      } else {
-        d.linesInserted = e.getInsertions() > 0 ? e.getInsertions() : null;
-        d.linesDeleted = e.getDeletions() > 0 ? e.getDeletions() : null;
-      }
-
-      FileInfo o = files.put(e.getNewName(), d);
-      if (o != null) {
-        // This should only happen on a delete-add break created by JGit
-        // when the file was rewritten and too little content survived. Write
-        // a single record with data from both sides.
-        d.status = Patch.ChangeType.REWRITE.getCode();
-        d.sizeDelta = o.sizeDelta;
-        d.size = o.size;
-        if (o.binary != null && o.binary) {
-          d.binary = true;
-        }
-        if (o.linesInserted != null) {
-          d.linesInserted = o.linesInserted;
-        }
-        if (o.linesDeleted != null) {
-          d.linesDeleted = o.linesDeleted;
-        }
-      }
-    }
-    return files;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/FileResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/FileResource.java
deleted file mode 100644
index ca47fb9..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/FileResource.java
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.restapi.RestResource;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Patch;
-import com.google.inject.TypeLiteral;
-
-public class FileResource implements RestResource {
-  public static final TypeLiteral<RestView<FileResource>> FILE_KIND =
-      new TypeLiteral<RestView<FileResource>>() {};
-
-  private final RevisionResource rev;
-  private final Patch.Key key;
-
-  public FileResource(RevisionResource rev, String name) {
-    this.rev = rev;
-    this.key = new Patch.Key(rev.getPatchSet().getId(), name);
-  }
-
-  public Patch.Key getPatchKey() {
-    return key;
-  }
-
-  public boolean isCacheable() {
-    return rev.isCacheable();
-  }
-
-  Account.Id getAccountId() {
-    return rev.getAccountId();
-  }
-
-  public RevisionResource getRevision() {
-    return rev;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Files.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Files.java
deleted file mode 100644
index c167e31..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Files.java
+++ /dev/null
@@ -1,349 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.change;
-
-import com.google.common.collect.Lists;
-import com.google.common.hash.Hasher;
-import com.google.common.hash.Hashing;
-import com.google.gerrit.extensions.common.FileInfo;
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.CacheControl;
-import com.google.gerrit.extensions.restapi.ChildCollection;
-import com.google.gerrit.extensions.restapi.ETagView;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.change.AccountPatchReviewStore.PatchSetWithReviewedFiles;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.patch.PatchList;
-import com.google.gerrit.server.patch.PatchListCache;
-import com.google.gerrit.server.patch.PatchListKey;
-import com.google.gerrit.server.patch.PatchListNotAvailableException;
-import com.google.gerrit.server.patch.PatchListObjectTooLargeException;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.treewalk.TreeWalk;
-import org.eclipse.jgit.treewalk.filter.PathFilterGroup;
-import org.kohsuke.args4j.Option;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class Files implements ChildCollection<RevisionResource, FileResource> {
-  private final DynamicMap<RestView<FileResource>> views;
-  private final Provider<ListFiles> list;
-
-  @Inject
-  Files(DynamicMap<RestView<FileResource>> views, Provider<ListFiles> list) {
-    this.views = views;
-    this.list = list;
-  }
-
-  @Override
-  public DynamicMap<RestView<FileResource>> views() {
-    return views;
-  }
-
-  @Override
-  public RestView<RevisionResource> list() throws AuthException {
-    return list.get();
-  }
-
-  @Override
-  public FileResource parse(RevisionResource rev, IdString id) {
-    return new FileResource(rev, id.get());
-  }
-
-  public static final class ListFiles implements ETagView<RevisionResource> {
-    private static final Logger log = LoggerFactory.getLogger(ListFiles.class);
-
-    @Option(name = "--base", metaVar = "revision-id")
-    String base;
-
-    @Option(name = "--parent", metaVar = "parent-number")
-    int parentNum;
-
-    @Option(name = "--reviewed")
-    boolean reviewed;
-
-    @Option(name = "-q")
-    String query;
-
-    private final Provider<ReviewDb> db;
-    private final Provider<CurrentUser> self;
-    private final FileInfoJson fileInfoJson;
-    private final Revisions revisions;
-    private final GitRepositoryManager gitManager;
-    private final PatchListCache patchListCache;
-    private final PatchSetUtil psUtil;
-    private final DynamicItem<AccountPatchReviewStore> accountPatchReviewStore;
-
-    @Inject
-    ListFiles(
-        Provider<ReviewDb> db,
-        Provider<CurrentUser> self,
-        FileInfoJson fileInfoJson,
-        Revisions revisions,
-        GitRepositoryManager gitManager,
-        PatchListCache patchListCache,
-        PatchSetUtil psUtil,
-        DynamicItem<AccountPatchReviewStore> accountPatchReviewStore) {
-      this.db = db;
-      this.self = self;
-      this.fileInfoJson = fileInfoJson;
-      this.revisions = revisions;
-      this.gitManager = gitManager;
-      this.patchListCache = patchListCache;
-      this.psUtil = psUtil;
-      this.accountPatchReviewStore = accountPatchReviewStore;
-    }
-
-    public ListFiles setReviewed(boolean r) {
-      this.reviewed = r;
-      return this;
-    }
-
-    @Override
-    public Response<?> apply(RevisionResource resource)
-        throws AuthException, BadRequestException, ResourceNotFoundException, OrmException,
-            RepositoryNotFoundException, IOException, PatchListNotAvailableException,
-            PermissionBackendException {
-      checkOptions();
-      if (reviewed) {
-        return Response.ok(reviewed(resource));
-      } else if (query != null) {
-        return Response.ok(query(resource));
-      }
-
-      Response<Map<String, FileInfo>> r;
-      if (base != null) {
-        RevisionResource baseResource =
-            revisions.parse(resource.getChangeResource(), IdString.fromDecoded(base));
-        r =
-            Response.ok(
-                fileInfoJson.toFileInfoMap(
-                    resource.getChange(),
-                    resource.getPatchSet().getRevision(),
-                    baseResource.getPatchSet()));
-      } else if (parentNum > 0) {
-        r =
-            Response.ok(
-                fileInfoJson.toFileInfoMap(
-                    resource.getChange(), resource.getPatchSet().getRevision(), parentNum - 1));
-      } else {
-        r = Response.ok(fileInfoJson.toFileInfoMap(resource.getChange(), resource.getPatchSet()));
-      }
-
-      if (resource.isCacheable()) {
-        r.caching(CacheControl.PRIVATE(7, TimeUnit.DAYS));
-      }
-      return r;
-    }
-
-    private void checkOptions() throws BadRequestException {
-      int supplied = 0;
-      if (base != null) {
-        supplied++;
-      }
-      if (parentNum > 0) {
-        supplied++;
-      }
-      if (reviewed) {
-        supplied++;
-      }
-      if (query != null) {
-        supplied++;
-      }
-      if (supplied > 1) {
-        throw new BadRequestException("cannot combine base, parent, reviewed, query");
-      }
-    }
-
-    private List<String> query(RevisionResource resource)
-        throws RepositoryNotFoundException, IOException {
-      Project.NameKey project = resource.getChange().getProject();
-      try (Repository git = gitManager.openRepository(project);
-          ObjectReader or = git.newObjectReader();
-          RevWalk rw = new RevWalk(or);
-          TreeWalk tw = new TreeWalk(or)) {
-        RevCommit c =
-            rw.parseCommit(ObjectId.fromString(resource.getPatchSet().getRevision().get()));
-
-        tw.addTree(c.getTree());
-        tw.setRecursive(true);
-        List<String> paths = new ArrayList<>();
-        while (tw.next() && paths.size() < 20) {
-          String s = tw.getPathString();
-          if (s.contains(query)) {
-            paths.add(s);
-          }
-        }
-        return paths;
-      }
-    }
-
-    private Collection<String> reviewed(RevisionResource resource)
-        throws AuthException, OrmException {
-      CurrentUser user = self.get();
-      if (!(user.isIdentifiedUser())) {
-        throw new AuthException("Authentication required");
-      }
-
-      Account.Id userId = user.getAccountId();
-      PatchSet patchSetId = resource.getPatchSet();
-      Optional<PatchSetWithReviewedFiles> o =
-          accountPatchReviewStore.get().findReviewed(patchSetId.getId(), userId);
-
-      if (o.isPresent()) {
-        PatchSetWithReviewedFiles res = o.get();
-        if (res.patchSetId().equals(patchSetId.getId())) {
-          return res.files();
-        }
-
-        try {
-          return copy(res.files(), res.patchSetId(), resource, userId);
-        } catch (PatchListObjectTooLargeException e) {
-          log.warn("Cannot copy patch review flags: " + e.getMessage());
-        } catch (IOException | PatchListNotAvailableException e) {
-          log.warn("Cannot copy patch review flags", e);
-        }
-      }
-
-      return Collections.emptyList();
-    }
-
-    private List<String> copy(
-        Set<String> paths, PatchSet.Id old, RevisionResource resource, Account.Id userId)
-        throws IOException, PatchListNotAvailableException, OrmException {
-      Project.NameKey project = resource.getChange().getProject();
-      try (Repository git = gitManager.openRepository(project);
-          ObjectReader reader = git.newObjectReader();
-          RevWalk rw = new RevWalk(reader);
-          TreeWalk tw = new TreeWalk(reader)) {
-        Change change = resource.getChange();
-        PatchSet patchSet = psUtil.get(db.get(), resource.getNotes(), old);
-        if (patchSet == null) {
-          throw new PatchListNotAvailableException(
-              String.format(
-                  "patch set %s of change %s not found", old.get(), change.getId().get()));
-        }
-
-        PatchList oldList = patchListCache.get(change, patchSet);
-
-        PatchList curList = patchListCache.get(change, resource.getPatchSet());
-
-        int sz = paths.size();
-        List<String> pathList = Lists.newArrayListWithCapacity(sz);
-
-        tw.setFilter(PathFilterGroup.createFromStrings(paths));
-        tw.setRecursive(true);
-        int o = tw.addTree(rw.parseCommit(oldList.getNewId()).getTree());
-        int c = tw.addTree(rw.parseCommit(curList.getNewId()).getTree());
-
-        int op = -1;
-        if (oldList.getOldId() != null) {
-          op = tw.addTree(rw.parseTree(oldList.getOldId()));
-        }
-
-        int cp = -1;
-        if (curList.getOldId() != null) {
-          cp = tw.addTree(rw.parseTree(curList.getOldId()));
-        }
-
-        while (tw.next()) {
-          String path = tw.getPathString();
-          if (tw.getRawMode(o) != 0
-              && tw.getRawMode(c) != 0
-              && tw.idEqual(o, c)
-              && paths.contains(path)) {
-            // File exists in previously reviewed oldList and in curList.
-            // File content is identical.
-            pathList.add(path);
-          } else if (op >= 0
-              && cp >= 0
-              && tw.getRawMode(o) == 0
-              && tw.getRawMode(c) == 0
-              && tw.getRawMode(op) != 0
-              && tw.getRawMode(cp) != 0
-              && tw.idEqual(op, cp)
-              && paths.contains(path)) {
-            // File was deleted in previously reviewed oldList and curList.
-            // File exists in ancestor of oldList and curList.
-            // File content is identical in ancestors.
-            pathList.add(path);
-          }
-        }
-        accountPatchReviewStore
-            .get()
-            .markReviewed(resource.getPatchSet().getId(), userId, pathList);
-        return pathList;
-      }
-    }
-
-    public ListFiles setQuery(String query) {
-      this.query = query;
-      return this;
-    }
-
-    public ListFiles setBase(String base) {
-      this.base = base;
-      return this;
-    }
-
-    public ListFiles setParent(int parentNum) {
-      this.parentNum = parentNum;
-      return this;
-    }
-
-    @Override
-    public String getETag(RevisionResource resource) {
-      Hasher h = Hashing.murmur3_128().newHasher();
-      resource.prepareETag(h, resource.getUser());
-      // File list comes from the PatchListCache, so any change to the key or value should
-      // invalidate ETag.
-      h.putLong(PatchListKey.serialVersionUID);
-      return h.hash().toString();
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Fixes.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Fixes.java
deleted file mode 100644
index af9f60a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Fixes.java
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.ChildCollection;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.reviewdb.client.FixSuggestion;
-import com.google.gerrit.reviewdb.client.RobotComment;
-import com.google.gerrit.server.CommentsUtil;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.List;
-import java.util.Objects;
-
-@Singleton
-public class Fixes implements ChildCollection<RevisionResource, FixResource> {
-
-  private final DynamicMap<RestView<FixResource>> views;
-  private final CommentsUtil commentsUtil;
-
-  @Inject
-  Fixes(DynamicMap<RestView<FixResource>> views, CommentsUtil commentsUtil) {
-    this.views = views;
-    this.commentsUtil = commentsUtil;
-  }
-
-  @Override
-  public RestView<RevisionResource> list() throws ResourceNotFoundException {
-    throw new ResourceNotFoundException();
-  }
-
-  @Override
-  public FixResource parse(RevisionResource revisionResource, IdString id)
-      throws ResourceNotFoundException, OrmException {
-    String fixId = id.get();
-    ChangeNotes changeNotes = revisionResource.getNotes();
-
-    List<RobotComment> robotComments =
-        commentsUtil.robotCommentsByPatchSet(changeNotes, revisionResource.getPatchSet().getId());
-    for (RobotComment robotComment : robotComments) {
-      for (FixSuggestion fixSuggestion : robotComment.fixSuggestions) {
-        if (Objects.equals(fixId, fixSuggestion.fixId)) {
-          return new FixResource(revisionResource, fixSuggestion.replacements);
-        }
-      }
-    }
-    throw new ResourceNotFoundException(id);
-  }
-
-  @Override
-  public DynamicMap<RestView<FixResource>> views() {
-    return views;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetArchive.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetArchive.java
deleted file mode 100644
index 7269a60..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetArchive.java
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.change;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.BinaryResult;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.io.OutputStream;
-import org.eclipse.jgit.api.ArchiveCommand;
-import org.eclipse.jgit.api.errors.GitAPIException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.kohsuke.args4j.Option;
-
-public class GetArchive implements RestReadView<RevisionResource> {
-  private final GitRepositoryManager repoManager;
-  private final AllowedFormats allowedFormats;
-
-  @Option(name = "--format")
-  private String format;
-
-  @Inject
-  GetArchive(GitRepositoryManager repoManager, AllowedFormats allowedFormats) {
-    this.repoManager = repoManager;
-    this.allowedFormats = allowedFormats;
-  }
-
-  @Override
-  public BinaryResult apply(RevisionResource rsrc)
-      throws BadRequestException, IOException, MethodNotAllowedException {
-    if (Strings.isNullOrEmpty(format)) {
-      throw new BadRequestException("format is not specified");
-    }
-    final ArchiveFormat f = allowedFormats.extensions.get("." + format);
-    if (f == null) {
-      throw new BadRequestException("unknown archive format");
-    }
-    if (f == ArchiveFormat.ZIP) {
-      throw new MethodNotAllowedException("zip format is disabled");
-    }
-    boolean close = true;
-    final Repository repo = repoManager.openRepository(rsrc.getProject());
-    try {
-      final RevCommit commit;
-      String name;
-      try (RevWalk rw = new RevWalk(repo)) {
-        commit = rw.parseCommit(ObjectId.fromString(rsrc.getPatchSet().getRevision().get()));
-        name = name(f, rw, commit);
-      }
-
-      BinaryResult bin =
-          new BinaryResult() {
-            @Override
-            public void writeTo(OutputStream out) throws IOException {
-              try {
-                new ArchiveCommand(repo)
-                    .setFormat(f.name())
-                    .setTree(commit.getTree())
-                    .setOutputStream(out)
-                    .call();
-              } catch (GitAPIException e) {
-                throw new IOException(e);
-              }
-            }
-
-            @Override
-            public void close() throws IOException {
-              repo.close();
-            }
-          };
-
-      bin.disableGzip().setContentType(f.getMimeType()).setAttachmentName(name);
-
-      close = false;
-      return bin;
-    } finally {
-      if (close) {
-        repo.close();
-      }
-    }
-  }
-
-  private static String name(ArchiveFormat format, RevWalk rw, RevCommit commit)
-      throws IOException {
-    return String.format(
-        "%s%s", rw.getObjectReader().abbreviate(commit, 7).name(), format.getDefaultSuffix());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetAssignee.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetAssignee.java
deleted file mode 100644
index d491b91..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetAssignee.java
+++ /dev/null
@@ -1,44 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.account.AccountLoader;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.Optional;
-
-@Singleton
-public class GetAssignee implements RestReadView<ChangeResource> {
-  private final AccountLoader.Factory accountLoaderFactory;
-
-  @Inject
-  GetAssignee(AccountLoader.Factory accountLoaderFactory) {
-    this.accountLoaderFactory = accountLoaderFactory;
-  }
-
-  @Override
-  public Response<AccountInfo> apply(ChangeResource rsrc) throws OrmException {
-    Optional<Account.Id> assignee = Optional.ofNullable(rsrc.getChange().getAssignee());
-    if (assignee.isPresent()) {
-      return Response.ok(accountLoaderFactory.create(true).fillOne(assignee.get()));
-    }
-    return Response.none();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetBlame.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetBlame.java
deleted file mode 100644
index 4810ca0..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetBlame.java
+++ /dev/null
@@ -1,169 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.change;
-
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.MultimapBuilder;
-import com.google.gerrit.extensions.common.BlameInfo;
-import com.google.gerrit.extensions.common.RangeInfo;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.CacheControl;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MergeUtil;
-import com.google.gerrit.server.patch.AutoMerger;
-import com.google.gerrit.server.project.InvalidChangeOperationException;
-import com.google.gitiles.blame.cache.BlameCache;
-import com.google.gitiles.blame.cache.Region;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.merge.ThreeWayMergeStrategy;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.kohsuke.args4j.Option;
-
-public class GetBlame implements RestReadView<FileResource> {
-
-  private final GitRepositoryManager repoManager;
-  private final BlameCache blameCache;
-  private final boolean allowBlame;
-  private final ThreeWayMergeStrategy mergeStrategy;
-  private final AutoMerger autoMerger;
-
-  @Option(
-      name = "--base",
-      aliases = {"-b"},
-      usage =
-          "whether to load the blame of the base revision (the direct"
-              + " parent of the change) instead of the change")
-  private boolean base;
-
-  @Inject
-  GetBlame(
-      GitRepositoryManager repoManager,
-      BlameCache blameCache,
-      @GerritServerConfig Config cfg,
-      AutoMerger autoMerger) {
-    this.repoManager = repoManager;
-    this.blameCache = blameCache;
-    this.mergeStrategy = MergeUtil.getMergeStrategy(cfg);
-    this.autoMerger = autoMerger;
-    allowBlame = cfg.getBoolean("change", "allowBlame", true);
-  }
-
-  @Override
-  public Response<List<BlameInfo>> apply(FileResource resource)
-      throws RestApiException, OrmException, IOException, InvalidChangeOperationException {
-    if (!allowBlame) {
-      throw new BadRequestException("blame is disabled");
-    }
-
-    Project.NameKey project = resource.getRevision().getChange().getProject();
-    try (Repository repository = repoManager.openRepository(project);
-        ObjectInserter ins = repository.newObjectInserter();
-        ObjectReader reader = ins.newReader();
-        RevWalk revWalk = new RevWalk(reader)) {
-      String refName =
-          resource.getRevision().getEdit().isPresent()
-              ? resource.getRevision().getEdit().get().getRefName()
-              : resource.getRevision().getPatchSet().getRefName();
-
-      Ref ref = repository.findRef(refName);
-      if (ref == null) {
-        throw new ResourceNotFoundException("unknown ref " + refName);
-      }
-      ObjectId objectId = ref.getObjectId();
-      RevCommit revCommit = revWalk.parseCommit(objectId);
-      RevCommit[] parents = revCommit.getParents();
-
-      String path = resource.getPatchKey().getFileName();
-
-      List<BlameInfo> result;
-      if (!base) {
-        result = blame(revCommit, path, repository, revWalk);
-
-      } else if (parents.length == 0) {
-        throw new ResourceNotFoundException("Initial commit doesn't have base");
-
-      } else if (parents.length == 1) {
-        result = blame(parents[0], path, repository, revWalk);
-
-      } else if (parents.length == 2) {
-        ObjectId automerge = autoMerger.merge(repository, revWalk, ins, revCommit, mergeStrategy);
-        result = blame(automerge, path, repository, revWalk);
-
-      } else {
-        throw new ResourceNotFoundException(
-            "Cannot generate blame for merge commit with more than 2 parents");
-      }
-
-      Response<List<BlameInfo>> r = Response.ok(result);
-      if (resource.isCacheable()) {
-        r.caching(CacheControl.PRIVATE(7, TimeUnit.DAYS));
-      }
-      return r;
-    }
-  }
-
-  private List<BlameInfo> blame(ObjectId id, String path, Repository repository, RevWalk revWalk)
-      throws IOException {
-    ListMultimap<BlameInfo, RangeInfo> ranges =
-        MultimapBuilder.hashKeys().arrayListValues().build();
-    List<BlameInfo> result = new ArrayList<>();
-    if (blameCache.findLastCommit(repository, id, path) == null) {
-      return result;
-    }
-
-    List<Region> blameRegions = blameCache.get(repository, id, path);
-    int from = 1;
-    for (Region region : blameRegions) {
-      RevCommit commit = revWalk.parseCommit(region.getSourceCommit());
-      BlameInfo blameInfo = toBlameInfo(commit, region.getSourceAuthor());
-      ranges.put(blameInfo, new RangeInfo(from, from + region.getCount() - 1));
-      from += region.getCount();
-    }
-
-    for (BlameInfo key : ranges.keySet()) {
-      key.ranges = ranges.get(key);
-      result.add(key);
-    }
-    return result;
-  }
-
-  private static BlameInfo toBlameInfo(RevCommit commit, PersonIdent sourceAuthor) {
-    BlameInfo blameInfo = new BlameInfo();
-    blameInfo.author = sourceAuthor.getName();
-    blameInfo.id = commit.getName();
-    blameInfo.commitMsg = commit.getFullMessage();
-    blameInfo.time = commit.getCommitTime();
-    return blameInfo;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetChange.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetChange.java
deleted file mode 100644
index 22b0b1c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetChange.java
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.client.ListChangesOption;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.util.EnumSet;
-import org.kohsuke.args4j.Option;
-
-public class GetChange implements RestReadView<ChangeResource> {
-  private final ChangeJson.Factory json;
-  private final EnumSet<ListChangesOption> options = EnumSet.noneOf(ListChangesOption.class);
-
-  @Option(name = "-o", usage = "Output options")
-  void addOption(ListChangesOption o) {
-    options.add(o);
-  }
-
-  @Option(name = "-O", usage = "Output option flags, in hex")
-  void setOptionFlagsHex(String hex) {
-    options.addAll(ListChangesOption.fromBits(Integer.parseInt(hex, 16)));
-  }
-
-  @Inject
-  GetChange(ChangeJson.Factory json) {
-    this.json = json;
-  }
-
-  @Override
-  public Response<ChangeInfo> apply(ChangeResource rsrc) throws OrmException {
-    return Response.withMustRevalidate(json.create(options).format(rsrc));
-  }
-
-  Response<ChangeInfo> apply(RevisionResource rsrc) throws OrmException {
-    return Response.withMustRevalidate(json.create(options).format(rsrc));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetComment.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetComment.java
deleted file mode 100644
index d601737..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetComment.java
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.common.CommentInfo;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-
-@Singleton
-public class GetComment implements RestReadView<CommentResource> {
-
-  private final Provider<CommentJson> commentJson;
-
-  @Inject
-  GetComment(Provider<CommentJson> commentJson) {
-    this.commentJson = commentJson;
-  }
-
-  @Override
-  public CommentInfo apply(CommentResource rsrc) throws OrmException {
-    return commentJson.get().newCommentFormatter().format(rsrc.getComment());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetCommit.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetCommit.java
deleted file mode 100644
index 694379e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetCommit.java
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.common.CommitInfo;
-import com.google.gerrit.extensions.restapi.CacheControl;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.util.concurrent.TimeUnit;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.kohsuke.args4j.Option;
-
-public class GetCommit implements RestReadView<RevisionResource> {
-  private final GitRepositoryManager repoManager;
-  private final ChangeJson.Factory json;
-
-  private boolean addLinks;
-
-  @Inject
-  GetCommit(GitRepositoryManager repoManager, ChangeJson.Factory json) {
-    this.repoManager = repoManager;
-    this.json = json;
-  }
-
-  @Option(name = "--links", usage = "Include weblinks")
-  public GetCommit setAddLinks(boolean addLinks) {
-    this.addLinks = addLinks;
-    return this;
-  }
-
-  @Override
-  public Response<CommitInfo> apply(RevisionResource rsrc) throws IOException {
-    Project.NameKey p = rsrc.getChange().getProject();
-    try (Repository repo = repoManager.openRepository(p);
-        RevWalk rw = new RevWalk(repo)) {
-      String rev = rsrc.getPatchSet().getRevision().get();
-      RevCommit commit = rw.parseCommit(ObjectId.fromString(rev));
-      rw.parseBody(commit);
-      CommitInfo info = json.noOptions().toCommit(rsrc.getProject(), rw, commit, addLinks, true);
-      Response<CommitInfo> r = Response.ok(info);
-      if (rsrc.isCacheable()) {
-        r.caching(CacheControl.PRIVATE(7, TimeUnit.DAYS));
-      }
-      return r;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetContent.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetContent.java
deleted file mode 100644
index f6b24b8..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetContent.java
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.BinaryResult;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Patch;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.patch.ComparisonType;
-import com.google.gerrit.server.patch.Text;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.kohsuke.args4j.Option;
-
-public class GetContent implements RestReadView<FileResource> {
-  private final Provider<ReviewDb> db;
-  private final GitRepositoryManager gitManager;
-  private final PatchSetUtil psUtil;
-  private final FileContentUtil fileContentUtil;
-  private final ProjectCache projectCache;
-
-  @Option(name = "--parent")
-  private Integer parent;
-
-  @Inject
-  GetContent(
-      Provider<ReviewDb> db,
-      GitRepositoryManager gitManager,
-      PatchSetUtil psUtil,
-      FileContentUtil fileContentUtil,
-      ProjectCache projectCache) {
-    this.db = db;
-    this.gitManager = gitManager;
-    this.psUtil = psUtil;
-    this.fileContentUtil = fileContentUtil;
-    this.projectCache = projectCache;
-  }
-
-  @Override
-  public BinaryResult apply(FileResource rsrc)
-      throws ResourceNotFoundException, IOException, BadRequestException, OrmException {
-    String path = rsrc.getPatchKey().get();
-    if (Patch.COMMIT_MSG.equals(path)) {
-      String msg = getMessage(rsrc.getRevision().getChangeResource().getNotes());
-      return BinaryResult.create(msg)
-          .setContentType(FileContentUtil.TEXT_X_GERRIT_COMMIT_MESSAGE)
-          .base64();
-    } else if (Patch.MERGE_LIST.equals(path)) {
-      byte[] mergeList = getMergeList(rsrc.getRevision().getChangeResource().getNotes());
-      return BinaryResult.create(mergeList)
-          .setContentType(FileContentUtil.TEXT_X_GERRIT_MERGE_LIST)
-          .base64();
-    }
-    return fileContentUtil.getContent(
-        projectCache.checkedGet(rsrc.getRevision().getProject()),
-        ObjectId.fromString(rsrc.getRevision().getPatchSet().getRevision().get()),
-        path,
-        parent);
-  }
-
-  private String getMessage(ChangeNotes notes) throws OrmException, IOException {
-    Change.Id changeId = notes.getChangeId();
-    PatchSet ps = psUtil.current(db.get(), notes);
-    if (ps == null) {
-      throw new NoSuchChangeException(changeId);
-    }
-
-    try (Repository git = gitManager.openRepository(notes.getProjectName());
-        RevWalk revWalk = new RevWalk(git)) {
-      RevCommit commit = revWalk.parseCommit(ObjectId.fromString(ps.getRevision().get()));
-      return commit.getFullMessage();
-    } catch (RepositoryNotFoundException e) {
-      throw new NoSuchChangeException(changeId, e);
-    }
-  }
-
-  private byte[] getMergeList(ChangeNotes notes) throws OrmException, IOException {
-    Change.Id changeId = notes.getChangeId();
-    PatchSet ps = psUtil.current(db.get(), notes);
-    if (ps == null) {
-      throw new NoSuchChangeException(changeId);
-    }
-
-    try (Repository git = gitManager.openRepository(notes.getProjectName());
-        RevWalk revWalk = new RevWalk(git)) {
-      return Text.forMergeList(
-              ComparisonType.againstAutoMerge(),
-              revWalk.getObjectReader(),
-              ObjectId.fromString(ps.getRevision().get()))
-          .getContent();
-    } catch (RepositoryNotFoundException e) {
-      throw new NoSuchChangeException(changeId, e);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDescription.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDescription.java
deleted file mode 100644
index b8a34d2..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDescription.java
+++ /dev/null
@@ -1,27 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.change;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.inject.Singleton;
-
-@Singleton
-public class GetDescription implements RestReadView<RevisionResource> {
-  @Override
-  public String apply(RevisionResource rsrc) {
-    return Strings.nullToEmpty(rsrc.getPatchSet().getDescription());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDetail.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDetail.java
deleted file mode 100644
index 8213193..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDetail.java
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.client.ListChangesOption;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import org.kohsuke.args4j.Option;
-
-public class GetDetail implements RestReadView<ChangeResource> {
-  private final GetChange delegate;
-
-  @Option(name = "-o", usage = "Output options")
-  void addOption(ListChangesOption o) {
-    delegate.addOption(o);
-  }
-
-  @Option(name = "-O", usage = "Output option flags, in hex")
-  void setOptionFlagsHex(String hex) {
-    delegate.setOptionFlagsHex(hex);
-  }
-
-  @Inject
-  GetDetail(GetChange delegate) {
-    this.delegate = delegate;
-    delegate.addOption(ListChangesOption.LABELS);
-    delegate.addOption(ListChangesOption.DETAILED_LABELS);
-    delegate.addOption(ListChangesOption.DETAILED_ACCOUNTS);
-    delegate.addOption(ListChangesOption.MESSAGES);
-    delegate.addOption(ListChangesOption.REVIEWER_UPDATES);
-  }
-
-  @Override
-  public Response<ChangeInfo> apply(ChangeResource rsrc) throws OrmException {
-    return delegate.apply(rsrc);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDiff.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDiff.java
deleted file mode 100644
index 25902b9..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDiff.java
+++ /dev/null
@@ -1,454 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.change;
-
-import static com.google.common.base.Preconditions.checkState;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.gerrit.common.data.PatchScript;
-import com.google.gerrit.common.data.PatchScript.DisplayMethod;
-import com.google.gerrit.extensions.client.DiffPreferencesInfo;
-import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
-import com.google.gerrit.extensions.common.ChangeType;
-import com.google.gerrit.extensions.common.DiffInfo;
-import com.google.gerrit.extensions.common.DiffInfo.ContentEntry;
-import com.google.gerrit.extensions.common.DiffInfo.FileMeta;
-import com.google.gerrit.extensions.common.DiffInfo.IntraLineStatus;
-import com.google.gerrit.extensions.common.DiffWebLinkInfo;
-import com.google.gerrit.extensions.common.WebLinkInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.CacheControl;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.prettify.common.SparseFileContent;
-import com.google.gerrit.reviewdb.client.Patch;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.WebLinks;
-import com.google.gerrit.server.git.LargeObjectException;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.patch.PatchScriptFactory;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.InvalidChangeOperationException;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import org.eclipse.jgit.diff.Edit;
-import org.eclipse.jgit.diff.ReplaceEdit;
-import org.kohsuke.args4j.CmdLineException;
-import org.kohsuke.args4j.CmdLineParser;
-import org.kohsuke.args4j.NamedOptionDef;
-import org.kohsuke.args4j.Option;
-import org.kohsuke.args4j.OptionDef;
-import org.kohsuke.args4j.spi.OptionHandler;
-import org.kohsuke.args4j.spi.Parameters;
-import org.kohsuke.args4j.spi.Setter;
-
-public class GetDiff implements RestReadView<FileResource> {
-  private static final ImmutableMap<Patch.ChangeType, ChangeType> CHANGE_TYPE =
-      Maps.immutableEnumMap(
-          new ImmutableMap.Builder<Patch.ChangeType, ChangeType>()
-              .put(Patch.ChangeType.ADDED, ChangeType.ADDED)
-              .put(Patch.ChangeType.MODIFIED, ChangeType.MODIFIED)
-              .put(Patch.ChangeType.DELETED, ChangeType.DELETED)
-              .put(Patch.ChangeType.RENAMED, ChangeType.RENAMED)
-              .put(Patch.ChangeType.COPIED, ChangeType.COPIED)
-              .put(Patch.ChangeType.REWRITE, ChangeType.REWRITE)
-              .build());
-
-  private final ProjectCache projectCache;
-  private final PatchScriptFactory.Factory patchScriptFactoryFactory;
-  private final Revisions revisions;
-  private final WebLinks webLinks;
-
-  @Option(name = "--base", metaVar = "REVISION")
-  String base;
-
-  @Option(name = "--parent", metaVar = "parent-number")
-  int parentNum;
-
-  @Deprecated
-  @Option(name = "--ignore-whitespace")
-  IgnoreWhitespace ignoreWhitespace;
-
-  @Option(name = "--whitespace")
-  Whitespace whitespace;
-
-  @Option(name = "--context", handler = ContextOptionHandler.class)
-  int context = DiffPreferencesInfo.DEFAULT_CONTEXT;
-
-  @Option(name = "--intraline")
-  boolean intraline;
-
-  @Option(name = "--weblinks-only")
-  boolean webLinksOnly;
-
-  @Inject
-  GetDiff(
-      ProjectCache projectCache,
-      PatchScriptFactory.Factory patchScriptFactoryFactory,
-      Revisions revisions,
-      WebLinks webLinks) {
-    this.projectCache = projectCache;
-    this.patchScriptFactoryFactory = patchScriptFactoryFactory;
-    this.revisions = revisions;
-    this.webLinks = webLinks;
-  }
-
-  @Override
-  public Response<DiffInfo> apply(FileResource resource)
-      throws ResourceConflictException, ResourceNotFoundException, OrmException, AuthException,
-          InvalidChangeOperationException, IOException, PermissionBackendException {
-    DiffPreferencesInfo prefs = new DiffPreferencesInfo();
-    if (whitespace != null) {
-      prefs.ignoreWhitespace = whitespace;
-    } else if (ignoreWhitespace != null) {
-      prefs.ignoreWhitespace = ignoreWhitespace.whitespace;
-    } else {
-      prefs.ignoreWhitespace = Whitespace.IGNORE_LEADING_AND_TRAILING;
-    }
-    prefs.context = context;
-    prefs.intralineDifference = intraline;
-
-    PatchScriptFactory psf;
-    PatchSet basePatchSet = null;
-    PatchSet.Id pId = resource.getPatchKey().getParentKey();
-    String fileName = resource.getPatchKey().getFileName();
-    ChangeNotes notes = resource.getRevision().getNotes();
-    if (base != null) {
-      RevisionResource baseResource =
-          revisions.parse(resource.getRevision().getChangeResource(), IdString.fromDecoded(base));
-      basePatchSet = baseResource.getPatchSet();
-      psf = patchScriptFactoryFactory.create(notes, fileName, basePatchSet.getId(), pId, prefs);
-    } else if (parentNum > 0) {
-      psf = patchScriptFactoryFactory.create(notes, fileName, parentNum - 1, pId, prefs);
-    } else {
-      psf = patchScriptFactoryFactory.create(notes, fileName, null, pId, prefs);
-    }
-
-    try {
-      psf.setLoadHistory(false);
-      psf.setLoadComments(context != DiffPreferencesInfo.WHOLE_FILE_CONTEXT);
-      PatchScript ps = psf.call();
-      Content content = new Content(ps);
-      Set<Edit> editsDueToRebase = ps.getEditsDueToRebase();
-      for (Edit edit : ps.getEdits()) {
-        if (edit.getType() == Edit.Type.EMPTY) {
-          continue;
-        }
-        content.addCommon(edit.getBeginA());
-
-        checkState(
-            content.nextA == edit.getBeginA(),
-            "nextA = %s; want %s",
-            content.nextA,
-            edit.getBeginA());
-        checkState(
-            content.nextB == edit.getBeginB(),
-            "nextB = %s; want %s",
-            content.nextB,
-            edit.getBeginB());
-        switch (edit.getType()) {
-          case DELETE:
-          case INSERT:
-          case REPLACE:
-            List<Edit> internalEdit =
-                edit instanceof ReplaceEdit ? ((ReplaceEdit) edit).getInternalEdits() : null;
-            boolean dueToRebase = editsDueToRebase.contains(edit);
-            content.addDiff(edit.getEndA(), edit.getEndB(), internalEdit, dueToRebase);
-            break;
-          case EMPTY:
-          default:
-            throw new IllegalStateException();
-        }
-      }
-      content.addCommon(ps.getA().size());
-
-      ProjectState state = projectCache.get(resource.getRevision().getChange().getProject());
-
-      DiffInfo result = new DiffInfo();
-      String revA = basePatchSet != null ? basePatchSet.getRefName() : content.commitIdA;
-      String revB =
-          resource.getRevision().getEdit().isPresent()
-              ? resource.getRevision().getEdit().get().getRefName()
-              : resource.getRevision().getPatchSet().getRefName();
-
-      List<DiffWebLinkInfo> links =
-          webLinks.getDiffLinks(
-              state.getName(),
-              resource.getPatchKey().getParentKey().getParentKey().get(),
-              basePatchSet != null ? basePatchSet.getId().get() : null,
-              revA,
-              MoreObjects.firstNonNull(ps.getOldName(), ps.getNewName()),
-              resource.getPatchKey().getParentKey().get(),
-              revB,
-              ps.getNewName());
-      result.webLinks = links.isEmpty() ? null : links;
-
-      if (!webLinksOnly) {
-        if (ps.isBinary()) {
-          result.binary = true;
-        }
-        if (ps.getDisplayMethodA() != DisplayMethod.NONE) {
-          result.metaA = new FileMeta();
-          result.metaA.name = MoreObjects.firstNonNull(ps.getOldName(), ps.getNewName());
-          result.metaA.contentType =
-              FileContentUtil.resolveContentType(
-                  state, result.metaA.name, ps.getFileModeA(), ps.getMimeTypeA());
-          result.metaA.lines = ps.getA().size();
-          result.metaA.webLinks = getFileWebLinks(state.getProject(), revA, result.metaA.name);
-          result.metaA.commitId = content.commitIdA;
-        }
-
-        if (ps.getDisplayMethodB() != DisplayMethod.NONE) {
-          result.metaB = new FileMeta();
-          result.metaB.name = ps.getNewName();
-          result.metaB.contentType =
-              FileContentUtil.resolveContentType(
-                  state, result.metaB.name, ps.getFileModeB(), ps.getMimeTypeB());
-          result.metaB.lines = ps.getB().size();
-          result.metaB.webLinks = getFileWebLinks(state.getProject(), revB, result.metaB.name);
-          result.metaB.commitId = content.commitIdB;
-        }
-
-        if (intraline) {
-          if (ps.hasIntralineTimeout()) {
-            result.intralineStatus = IntraLineStatus.TIMEOUT;
-          } else if (ps.hasIntralineFailure()) {
-            result.intralineStatus = IntraLineStatus.FAILURE;
-          } else {
-            result.intralineStatus = IntraLineStatus.OK;
-          }
-        }
-
-        result.changeType = CHANGE_TYPE.get(ps.getChangeType());
-        if (result.changeType == null) {
-          throw new IllegalStateException("unknown change type: " + ps.getChangeType());
-        }
-
-        if (ps.getPatchHeader().size() > 0) {
-          result.diffHeader = ps.getPatchHeader();
-        }
-        result.content = content.lines;
-      }
-
-      Response<DiffInfo> r = Response.ok(result);
-      if (resource.isCacheable()) {
-        r.caching(CacheControl.PRIVATE(7, TimeUnit.DAYS));
-      }
-      return r;
-    } catch (NoSuchChangeException e) {
-      throw new ResourceNotFoundException(e.getMessage(), e);
-    } catch (LargeObjectException e) {
-      throw new ResourceConflictException(e.getMessage(), e);
-    }
-  }
-
-  private List<WebLinkInfo> getFileWebLinks(Project project, String rev, String file) {
-    List<WebLinkInfo> links = webLinks.getFileLinks(project.getName(), rev, file);
-    return links.isEmpty() ? null : links;
-  }
-
-  public GetDiff setBase(String base) {
-    this.base = base;
-    return this;
-  }
-
-  public GetDiff setParent(int parentNum) {
-    this.parentNum = parentNum;
-    return this;
-  }
-
-  public GetDiff setContext(int context) {
-    this.context = context;
-    return this;
-  }
-
-  public GetDiff setIntraline(boolean intraline) {
-    this.intraline = intraline;
-    return this;
-  }
-
-  public GetDiff setWhitespace(Whitespace whitespace) {
-    this.whitespace = whitespace;
-    return this;
-  }
-
-  private static class Content {
-    final List<ContentEntry> lines;
-    final SparseFileContent fileA;
-    final SparseFileContent fileB;
-    final boolean ignoreWS;
-    final String commitIdA;
-    final String commitIdB;
-
-    int nextA;
-    int nextB;
-
-    Content(PatchScript ps) {
-      lines = Lists.newArrayListWithExpectedSize(ps.getEdits().size() + 2);
-      fileA = ps.getA();
-      fileB = ps.getB();
-      ignoreWS = ps.isIgnoreWhitespace();
-      commitIdA = ps.getCommitIdA();
-      commitIdB = ps.getCommitIdB();
-    }
-
-    void addCommon(int end) {
-      end = Math.min(end, fileA.size());
-      if (nextA >= end) {
-        return;
-      }
-
-      while (nextA < end) {
-        if (!fileA.contains(nextA)) {
-          int endRegion = Math.min(end, nextA == 0 ? fileA.first() : fileA.next(nextA - 1));
-          int len = endRegion - nextA;
-          entry().skip = len;
-          nextA = endRegion;
-          nextB += len;
-          continue;
-        }
-
-        ContentEntry e = null;
-        for (int i = nextA; i == nextA && i < end; i = fileA.next(i), nextA++, nextB++) {
-          if (ignoreWS && fileB.contains(nextB)) {
-            if (e == null || e.common == null) {
-              e = entry();
-              e.a = Lists.newArrayListWithCapacity(end - nextA);
-              e.b = Lists.newArrayListWithCapacity(end - nextA);
-              e.common = true;
-            }
-            e.a.add(fileA.get(nextA));
-            e.b.add(fileB.get(nextB));
-          } else {
-            if (e == null || e.common != null) {
-              e = entry();
-              e.ab = Lists.newArrayListWithCapacity(end - nextA);
-            }
-            e.ab.add(fileA.get(nextA));
-          }
-        }
-      }
-    }
-
-    void addDiff(int endA, int endB, List<Edit> internalEdit, boolean dueToRebase) {
-      int lenA = endA - nextA;
-      int lenB = endB - nextB;
-      checkState(lenA > 0 || lenB > 0);
-
-      ContentEntry e = entry();
-      if (lenA > 0) {
-        e.a = Lists.newArrayListWithCapacity(lenA);
-        for (; nextA < endA; nextA++) {
-          e.a.add(fileA.get(nextA));
-        }
-      }
-      if (lenB > 0) {
-        e.b = Lists.newArrayListWithCapacity(lenB);
-        for (; nextB < endB; nextB++) {
-          e.b.add(fileB.get(nextB));
-        }
-      }
-      if (internalEdit != null && !internalEdit.isEmpty()) {
-        e.editA = Lists.newArrayListWithCapacity(internalEdit.size() * 2);
-        e.editB = Lists.newArrayListWithCapacity(internalEdit.size() * 2);
-        int lastA = 0;
-        int lastB = 0;
-        for (Edit edit : internalEdit) {
-          if (edit.getBeginA() != edit.getEndA()) {
-            e.editA.add(
-                ImmutableList.of(edit.getBeginA() - lastA, edit.getEndA() - edit.getBeginA()));
-            lastA = edit.getEndA();
-          }
-          if (edit.getBeginB() != edit.getEndB()) {
-            e.editB.add(
-                ImmutableList.of(edit.getBeginB() - lastB, edit.getEndB() - edit.getBeginB()));
-            lastB = edit.getEndB();
-          }
-        }
-      }
-      e.dueToRebase = dueToRebase ? true : null;
-    }
-
-    private ContentEntry entry() {
-      ContentEntry e = new ContentEntry();
-      lines.add(e);
-      return e;
-    }
-  }
-
-  @Deprecated
-  enum IgnoreWhitespace {
-    NONE(DiffPreferencesInfo.Whitespace.IGNORE_NONE),
-    TRAILING(DiffPreferencesInfo.Whitespace.IGNORE_TRAILING),
-    CHANGED(DiffPreferencesInfo.Whitespace.IGNORE_LEADING_AND_TRAILING),
-    ALL(DiffPreferencesInfo.Whitespace.IGNORE_ALL);
-
-    private final DiffPreferencesInfo.Whitespace whitespace;
-
-    IgnoreWhitespace(DiffPreferencesInfo.Whitespace whitespace) {
-      this.whitespace = whitespace;
-    }
-  }
-
-  public static class ContextOptionHandler extends OptionHandler<Short> {
-    public ContextOptionHandler(CmdLineParser parser, OptionDef option, Setter<Short> setter) {
-      super(parser, option, setter);
-    }
-
-    @Override
-    public final int parseArguments(Parameters params) throws CmdLineException {
-      final String value = params.getParameter(0);
-      short context;
-      if ("all".equalsIgnoreCase(value)) {
-        context = DiffPreferencesInfo.WHOLE_FILE_CONTEXT;
-      } else {
-        try {
-          context = Short.parseShort(value, 10);
-          if (context < 0) {
-            throw new NumberFormatException();
-          }
-        } catch (NumberFormatException e) {
-          throw new CmdLineException(
-              owner,
-              String.format(
-                  "\"%s\" is not a valid value for \"%s\"",
-                  value, ((NamedOptionDef) option).name()));
-        }
-      }
-      setter.addValue(context);
-      return 1;
-    }
-
-    @Override
-    public final String getDefaultMetaVariable() {
-      return "ALL|# LINES";
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDraftComment.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDraftComment.java
deleted file mode 100644
index a380ce3..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDraftComment.java
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.common.CommentInfo;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-
-@Singleton
-public class GetDraftComment implements RestReadView<DraftCommentResource> {
-
-  private final Provider<CommentJson> commentJson;
-
-  @Inject
-  GetDraftComment(Provider<CommentJson> commentJson) {
-    this.commentJson = commentJson;
-  }
-
-  @Override
-  public CommentInfo apply(DraftCommentResource rsrc) throws OrmException {
-    return commentJson.get().newCommentFormatter().format(rsrc.getComment());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetHashtags.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetHashtags.java
deleted file mode 100644
index c285734..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetHashtags.java
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.Set;
-
-@Singleton
-public class GetHashtags implements RestReadView<ChangeResource> {
-  @Override
-  public Response<Set<String>> apply(ChangeResource req)
-      throws AuthException, OrmException, IOException, BadRequestException {
-    ChangeNotes notes = req.getNotes().load();
-    Set<String> hashtags = notes.getHashtags();
-    if (hashtags == null) {
-      hashtags = Collections.emptySet();
-    }
-    return Response.ok(hashtags);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetMergeList.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetMergeList.java
deleted file mode 100644
index 88677d6..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetMergeList.java
+++ /dev/null
@@ -1,97 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.change;
-
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.extensions.common.CommitInfo;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.CacheControl;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.patch.MergeListBuilder;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.kohsuke.args4j.Option;
-
-public class GetMergeList implements RestReadView<RevisionResource> {
-  private final GitRepositoryManager repoManager;
-  private final ChangeJson.Factory json;
-
-  @Option(name = "--parent", usage = "Uninteresting parent (1-based, default = 1)")
-  private int uninterestingParent = 1;
-
-  @Option(name = "--links", usage = "Include weblinks")
-  private boolean addLinks;
-
-  @Inject
-  GetMergeList(GitRepositoryManager repoManager, ChangeJson.Factory json) {
-    this.repoManager = repoManager;
-    this.json = json;
-  }
-
-  public void setUninterestingParent(int uninterestingParent) {
-    this.uninterestingParent = uninterestingParent;
-  }
-
-  public void setAddLinks(boolean addLinks) {
-    this.addLinks = addLinks;
-  }
-
-  @Override
-  public Response<List<CommitInfo>> apply(RevisionResource rsrc)
-      throws BadRequestException, IOException {
-    Project.NameKey p = rsrc.getChange().getProject();
-    try (Repository repo = repoManager.openRepository(p);
-        RevWalk rw = new RevWalk(repo)) {
-      String rev = rsrc.getPatchSet().getRevision().get();
-      RevCommit commit = rw.parseCommit(ObjectId.fromString(rev));
-      rw.parseBody(commit);
-
-      if (uninterestingParent < 1 || uninterestingParent > commit.getParentCount()) {
-        throw new BadRequestException("No such parent: " + uninterestingParent);
-      }
-
-      if (commit.getParentCount() < 2) {
-        return createResponse(rsrc, ImmutableList.<CommitInfo>of());
-      }
-
-      List<RevCommit> commits = MergeListBuilder.build(rw, commit, uninterestingParent);
-      List<CommitInfo> result = new ArrayList<>(commits.size());
-      ChangeJson changeJson = json.noOptions();
-      for (RevCommit c : commits) {
-        result.add(changeJson.toCommit(rsrc.getProject(), rw, c, addLinks, true));
-      }
-      return createResponse(rsrc, result);
-    }
-  }
-
-  private static Response<List<CommitInfo>> createResponse(
-      RevisionResource rsrc, List<CommitInfo> result) {
-    Response<List<CommitInfo>> r = Response.ok(result);
-    if (rsrc.isCacheable()) {
-      r.caching(CacheControl.PRIVATE(7, TimeUnit.DAYS));
-    }
-    return r;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetPastAssignees.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetPastAssignees.java
deleted file mode 100644
index 76114ac..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetPastAssignees.java
+++ /dev/null
@@ -1,53 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.change;
-
-import static java.util.stream.Collectors.toList;
-
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.account.AccountLoader;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-
-@Singleton
-public class GetPastAssignees implements RestReadView<ChangeResource> {
-  private final AccountLoader.Factory accountLoaderFactory;
-
-  @Inject
-  GetPastAssignees(AccountLoader.Factory accountLoaderFactory) {
-    this.accountLoaderFactory = accountLoaderFactory;
-  }
-
-  @Override
-  public Response<List<AccountInfo>> apply(ChangeResource rsrc) throws OrmException {
-
-    Set<Account.Id> pastAssignees = rsrc.getNotes().load().getPastAssignees();
-    if (pastAssignees == null) {
-      return Response.ok(Collections.emptyList());
-    }
-
-    AccountLoader accountLoader = accountLoaderFactory.create(true);
-    List<AccountInfo> infos = pastAssignees.stream().map(accountLoader::get).collect(toList());
-    accountLoader.fill();
-    return Response.ok(infos);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetPatch.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetPatch.java
deleted file mode 100644
index b59c17c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetPatch.java
+++ /dev/null
@@ -1,194 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.change;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.gerrit.extensions.restapi.BinaryResult;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Locale;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipOutputStream;
-import org.eclipse.jgit.diff.DiffFormatter;
-import org.eclipse.jgit.lib.AbbreviatedObjectId;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.treewalk.filter.PathFilter;
-import org.kohsuke.args4j.Option;
-
-public class GetPatch implements RestReadView<RevisionResource> {
-  private final GitRepositoryManager repoManager;
-
-  private final String FILE_NOT_FOUND = "File not found: %s.";
-
-  @Option(name = "--zip")
-  private boolean zip;
-
-  @Option(name = "--download")
-  private boolean download;
-
-  @Option(name = "--path")
-  private String path;
-
-  @Inject
-  GetPatch(GitRepositoryManager repoManager) {
-    this.repoManager = repoManager;
-  }
-
-  @Override
-  public BinaryResult apply(RevisionResource rsrc)
-      throws ResourceConflictException, IOException, ResourceNotFoundException {
-    final Repository repo = repoManager.openRepository(rsrc.getProject());
-    boolean close = true;
-    try {
-      final RevWalk rw = new RevWalk(repo);
-      try {
-        final RevCommit commit =
-            rw.parseCommit(ObjectId.fromString(rsrc.getPatchSet().getRevision().get()));
-        RevCommit[] parents = commit.getParents();
-        if (parents.length > 1) {
-          throw new ResourceConflictException("Revision has more than 1 parent.");
-        } else if (parents.length == 0) {
-          throw new ResourceConflictException("Revision has no parent.");
-        }
-        final RevCommit base = parents[0];
-        rw.parseBody(base);
-
-        BinaryResult bin =
-            new BinaryResult() {
-              @Override
-              public void writeTo(OutputStream out) throws IOException {
-                if (zip) {
-                  ZipOutputStream zos = new ZipOutputStream(out);
-                  ZipEntry e = new ZipEntry(fileName(rw, commit));
-                  e.setTime(commit.getCommitTime() * 1000L);
-                  zos.putNextEntry(e);
-                  format(zos);
-                  zos.closeEntry();
-                  zos.finish();
-                } else {
-                  format(out);
-                }
-              }
-
-              private void format(OutputStream out) throws IOException {
-                // Only add header if no path is specified
-                if (path == null) {
-                  out.write(formatEmailHeader(commit).getBytes(UTF_8));
-                }
-                try (DiffFormatter fmt = new DiffFormatter(out)) {
-                  fmt.setRepository(repo);
-                  if (path != null) {
-                    fmt.setPathFilter(PathFilter.create(path));
-                  }
-                  fmt.format(base.getTree(), commit.getTree());
-                  fmt.flush();
-                }
-              }
-
-              @Override
-              public void close() throws IOException {
-                rw.close();
-                repo.close();
-              }
-            };
-
-        if (path != null && bin.asString().isEmpty()) {
-          throw new ResourceNotFoundException(String.format(FILE_NOT_FOUND, path));
-        }
-
-        if (zip) {
-          bin.disableGzip()
-              .setContentType("application/zip")
-              .setAttachmentName(fileName(rw, commit) + ".zip");
-        } else {
-          bin.base64()
-              .setContentType("application/mbox")
-              .setAttachmentName(download ? fileName(rw, commit) + ".base64" : null);
-        }
-
-        close = false;
-        return bin;
-      } finally {
-        if (close) {
-          rw.close();
-        }
-      }
-    } finally {
-      if (close) {
-        repo.close();
-      }
-    }
-  }
-
-  public GetPatch setPath(String path) {
-    this.path = path;
-    return this;
-  }
-
-  private static String formatEmailHeader(RevCommit commit) {
-    StringBuilder b = new StringBuilder();
-    PersonIdent author = commit.getAuthorIdent();
-    String subject = commit.getShortMessage();
-    String msg = commit.getFullMessage().substring(subject.length());
-    if (msg.startsWith("\n\n")) {
-      msg = msg.substring(2);
-    }
-    b.append("From ")
-        .append(commit.getName())
-        .append(' ')
-        .append(
-            "Mon Sep 17 00:00:00 2001\n") // Fixed timestamp to match output of C Git's format-patch
-        .append("From: ")
-        .append(author.getName())
-        .append(" <")
-        .append(author.getEmailAddress())
-        .append(">\n")
-        .append("Date: ")
-        .append(formatDate(author))
-        .append('\n')
-        .append("Subject: [PATCH] ")
-        .append(subject)
-        .append('\n')
-        .append('\n')
-        .append(msg);
-    if (!msg.endsWith("\n")) {
-      b.append('\n');
-    }
-    return b.append("---\n\n").toString();
-  }
-
-  private static String formatDate(PersonIdent author) {
-    SimpleDateFormat df = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US);
-    df.setCalendar(Calendar.getInstance(author.getTimeZone(), Locale.US));
-    return df.format(author.getWhen());
-  }
-
-  private static String fileName(RevWalk rw, RevCommit commit) throws IOException {
-    AbbreviatedObjectId id = rw.getObjectReader().abbreviate(commit, 7);
-    return id.name() + ".diff";
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetPureRevert.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetPureRevert.java
deleted file mode 100644
index 9270463..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetPureRevert.java
+++ /dev/null
@@ -1,153 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.change;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.common.PureRevertInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MergeUtil;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.List;
-import org.eclipse.jgit.diff.DiffEntry;
-import org.eclipse.jgit.diff.DiffFormatter;
-import org.eclipse.jgit.errors.InvalidObjectIdException;
-import org.eclipse.jgit.errors.MissingObjectException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.merge.ThreeWayMerger;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.kohsuke.args4j.Option;
-
-public class GetPureRevert implements RestReadView<ChangeResource> {
-  private final MergeUtil.Factory mergeUtilFactory;
-  private final GitRepositoryManager repoManager;
-  private final ProjectCache projectCache;
-  private final ChangeNotes.Factory notesFactory;
-  private final Provider<ReviewDb> dbProvider;
-  private final PatchSetUtil psUtil;
-
-  @Option(
-      name = "--claimed-original",
-      aliases = {"-o"},
-      usage = "SHA1 (40 digit hex) of the original commit")
-  @Nullable
-  private String claimedOriginal;
-
-  @Inject
-  GetPureRevert(
-      MergeUtil.Factory mergeUtilFactory,
-      GitRepositoryManager repoManager,
-      ProjectCache projectCache,
-      ChangeNotes.Factory notesFactory,
-      Provider<ReviewDb> dbProvider,
-      PatchSetUtil psUtil) {
-    this.mergeUtilFactory = mergeUtilFactory;
-    this.repoManager = repoManager;
-    this.projectCache = projectCache;
-    this.notesFactory = notesFactory;
-    this.dbProvider = dbProvider;
-    this.psUtil = psUtil;
-  }
-
-  @Override
-  public PureRevertInfo apply(ChangeResource rsrc)
-      throws ResourceConflictException, IOException, BadRequestException, OrmException,
-          AuthException {
-    PatchSet currentPatchSet = psUtil.current(dbProvider.get(), rsrc.getNotes());
-    if (currentPatchSet == null) {
-      throw new ResourceConflictException("current revision is missing");
-    }
-    return getPureRevert(rsrc.getNotes());
-  }
-
-  public PureRevertInfo getPureRevert(ChangeNotes notes)
-      throws OrmException, IOException, BadRequestException, ResourceConflictException {
-    PatchSet currentPatchSet = psUtil.current(dbProvider.get(), notes);
-    if (currentPatchSet == null) {
-      throw new ResourceConflictException("current revision is missing");
-    }
-
-    if (claimedOriginal == null) {
-      if (notes.getChange().getRevertOf() == null) {
-        throw new BadRequestException("no ID was provided and change isn't a revert");
-      }
-      PatchSet ps =
-          psUtil.current(
-              dbProvider.get(),
-              notesFactory.createChecked(
-                  dbProvider.get(), notes.getProjectName(), notes.getChange().getRevertOf()));
-      claimedOriginal = ps.getRevision().get();
-    }
-
-    try (Repository repo = repoManager.openRepository(notes.getProjectName());
-        ObjectInserter oi = repo.newObjectInserter();
-        RevWalk rw = new RevWalk(repo)) {
-      RevCommit claimedOriginalCommit;
-      try {
-        claimedOriginalCommit = rw.parseCommit(ObjectId.fromString(claimedOriginal));
-      } catch (InvalidObjectIdException | MissingObjectException e) {
-        throw new BadRequestException("invalid object ID");
-      }
-      if (claimedOriginalCommit.getParentCount() == 0) {
-        throw new BadRequestException("can't check against initial commit");
-      }
-      RevCommit claimedRevertCommit =
-          rw.parseCommit(ObjectId.fromString(currentPatchSet.getRevision().get()));
-      if (claimedRevertCommit.getParentCount() == 0) {
-        throw new BadRequestException("claimed revert has no parents");
-      }
-      // Rebase claimed revert onto claimed original
-      ThreeWayMerger merger =
-          mergeUtilFactory
-              .create(projectCache.checkedGet(notes.getProjectName()))
-              .newThreeWayMerger(oi, repo.getConfig());
-      merger.setBase(claimedRevertCommit.getParent(0));
-      boolean success = merger.merge(claimedRevertCommit, claimedOriginalCommit);
-      if (!success || merger.getResultTreeId() == null) {
-        // Merge conflict during rebase
-        return new PureRevertInfo(false);
-      }
-
-      // Any differences between claimed original's parent and the rebase result indicate that the
-      // claimedRevert is not a pure revert but made content changes
-      try (DiffFormatter df = new DiffFormatter(new ByteArrayOutputStream())) {
-        df.setRepository(repo);
-        List<DiffEntry> entries =
-            df.scan(claimedOriginalCommit.getParent(0), merger.getResultTreeId());
-        return new PureRevertInfo(entries.isEmpty());
-      }
-    }
-  }
-
-  public GetPureRevert setClaimedOriginal(String claimedOriginal) {
-    this.claimedOriginal = claimedOriginal;
-    return this;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRelated.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRelated.java
deleted file mode 100644
index 188e067..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRelated.java
+++ /dev/null
@@ -1,167 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.change;
-
-import com.google.common.collect.Lists;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.api.changes.RelatedChangeAndCommitInfo;
-import com.google.gerrit.extensions.api.changes.RelatedChangesInfo;
-import com.google.gerrit.extensions.common.CommitInfo;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CommonConverters;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.change.RelatedChangesSorter.PatchSetData;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.InternalChangeQuery;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.revwalk.RevCommit;
-
-@Singleton
-public class GetRelated implements RestReadView<RevisionResource> {
-  private final Provider<ReviewDb> db;
-  private final Provider<InternalChangeQuery> queryProvider;
-  private final PatchSetUtil psUtil;
-  private final RelatedChangesSorter sorter;
-
-  @Inject
-  GetRelated(
-      Provider<ReviewDb> db,
-      Provider<InternalChangeQuery> queryProvider,
-      PatchSetUtil psUtil,
-      RelatedChangesSorter sorter) {
-    this.db = db;
-    this.queryProvider = queryProvider;
-    this.psUtil = psUtil;
-    this.sorter = sorter;
-  }
-
-  @Override
-  public RelatedChangesInfo apply(RevisionResource rsrc)
-      throws RepositoryNotFoundException, IOException, OrmException, NoSuchProjectException,
-          PermissionBackendException {
-    RelatedChangesInfo relatedChangesInfo = new RelatedChangesInfo();
-    relatedChangesInfo.changes = getRelated(rsrc);
-    return relatedChangesInfo;
-  }
-
-  private List<RelatedChangeAndCommitInfo> getRelated(RevisionResource rsrc)
-      throws OrmException, IOException, PermissionBackendException {
-    Set<String> groups = getAllGroups(rsrc.getNotes());
-    if (groups.isEmpty()) {
-      return Collections.emptyList();
-    }
-
-    List<ChangeData> cds =
-        queryProvider
-            .get()
-            .enforceVisibility(true)
-            .byProjectGroups(rsrc.getChange().getProject(), groups);
-    if (cds.isEmpty()) {
-      return Collections.emptyList();
-    }
-    if (cds.size() == 1 && cds.get(0).getId().equals(rsrc.getChange().getId())) {
-      return Collections.emptyList();
-    }
-    List<RelatedChangeAndCommitInfo> result = new ArrayList<>(cds.size());
-
-    boolean isEdit = rsrc.getEdit().isPresent();
-    PatchSet basePs = isEdit ? rsrc.getEdit().get().getBasePatchSet() : rsrc.getPatchSet();
-
-    reloadChangeIfStale(cds, basePs);
-
-    for (PatchSetData d : sorter.sort(cds, basePs, rsrc.getUser())) {
-      PatchSet ps = d.patchSet();
-      RevCommit commit;
-      if (isEdit && ps.getId().equals(basePs.getId())) {
-        // Replace base of an edit with the edit itself.
-        ps = rsrc.getPatchSet();
-        commit = rsrc.getEdit().get().getEditCommit();
-      } else {
-        commit = d.commit();
-      }
-      result.add(newChangeAndCommit(rsrc.getProject(), d.data().change(), ps, commit));
-    }
-
-    if (result.size() == 1) {
-      RelatedChangeAndCommitInfo r = result.get(0);
-      if (r.commit != null && r.commit.commit.equals(rsrc.getPatchSet().getRevision().get())) {
-        return Collections.emptyList();
-      }
-    }
-    return result;
-  }
-
-  private Set<String> getAllGroups(ChangeNotes notes) throws OrmException {
-    Set<String> result = new HashSet<>();
-    for (PatchSet ps : psUtil.byChange(db.get(), notes)) {
-      result.addAll(ps.getGroups());
-    }
-    return result;
-  }
-
-  private void reloadChangeIfStale(List<ChangeData> cds, PatchSet wantedPs) throws OrmException {
-    for (ChangeData cd : cds) {
-      if (cd.getId().equals(wantedPs.getId().getParentKey())) {
-        if (cd.patchSet(wantedPs.getId()) == null) {
-          cd.reloadChange();
-        }
-      }
-    }
-  }
-
-  static RelatedChangeAndCommitInfo newChangeAndCommit(
-      Project.NameKey project, @Nullable Change change, @Nullable PatchSet ps, RevCommit c) {
-    RelatedChangeAndCommitInfo info = new RelatedChangeAndCommitInfo();
-    info.project = project.get();
-
-    if (change != null) {
-      info.changeId = change.getKey().get();
-      info._changeNumber = change.getChangeId();
-      info._revisionNumber = ps != null ? ps.getPatchSetId() : null;
-      PatchSet.Id curr = change.currentPatchSetId();
-      info._currentRevisionNumber = curr != null ? curr.get() : null;
-      info.status = change.getStatus().asChangeStatus().toString();
-    }
-
-    info.commit = new CommitInfo();
-    info.commit.commit = c.name();
-    info.commit.parents = Lists.newArrayListWithCapacity(c.getParentCount());
-    for (int i = 0; i < c.getParentCount(); i++) {
-      CommitInfo p = new CommitInfo();
-      p.commit = c.getParent(i).name();
-      info.commit.parents.add(p);
-    }
-    info.commit.author = CommonConverters.toGitPerson(c.getAuthorIdent());
-    info.commit.subject = c.getShortMessage();
-    return info;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetReview.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetReview.java
deleted file mode 100644
index f379d83..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetReview.java
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.client.ListChangesOption;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-@Singleton
-public class GetReview implements RestReadView<RevisionResource> {
-  private final GetChange delegate;
-
-  @Inject
-  GetReview(GetChange delegate) {
-    this.delegate = delegate;
-    delegate.addOption(ListChangesOption.DETAILED_LABELS);
-    delegate.addOption(ListChangesOption.DETAILED_ACCOUNTS);
-  }
-
-  @Override
-  public Response<ChangeInfo> apply(RevisionResource rsrc) throws OrmException {
-    return delegate.apply(rsrc);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetReviewer.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetReviewer.java
deleted file mode 100644
index db9af1d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetReviewer.java
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.api.changes.ReviewerInfo;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.List;
-
-@Singleton
-public class GetReviewer implements RestReadView<ReviewerResource> {
-  private final ReviewerJson json;
-
-  @Inject
-  GetReviewer(ReviewerJson json) {
-    this.json = json;
-  }
-
-  @Override
-  public List<ReviewerInfo> apply(ReviewerResource rsrc)
-      throws OrmException, PermissionBackendException {
-    return json.format(rsrc);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRevisionActions.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRevisionActions.java
deleted file mode 100644
index 2a7bd4b..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRevisionActions.java
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.change;
-
-import com.google.common.hash.Hasher;
-import com.google.common.hash.Hashing;
-import com.google.gerrit.extensions.common.ActionInfo;
-import com.google.gerrit.extensions.restapi.ETagView;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.git.ChangeSet;
-import com.google.gerrit.server.git.MergeSuperSet;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.OrmRuntimeException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.Map;
-import org.eclipse.jgit.lib.Config;
-
-@Singleton
-public class GetRevisionActions implements ETagView<RevisionResource> {
-  private final ActionJson delegate;
-  private final Config config;
-  private final Provider<ReviewDb> dbProvider;
-  private final Provider<MergeSuperSet> mergeSuperSet;
-  private final ChangeResource.Factory changeResourceFactory;
-
-  @Inject
-  GetRevisionActions(
-      ActionJson delegate,
-      Provider<ReviewDb> dbProvider,
-      Provider<MergeSuperSet> mergeSuperSet,
-      ChangeResource.Factory changeResourceFactory,
-      @GerritServerConfig Config config) {
-    this.delegate = delegate;
-    this.dbProvider = dbProvider;
-    this.mergeSuperSet = mergeSuperSet;
-    this.changeResourceFactory = changeResourceFactory;
-    this.config = config;
-  }
-
-  @Override
-  public Response<Map<String, ActionInfo>> apply(RevisionResource rsrc) throws OrmException {
-    return Response.withMustRevalidate(delegate.format(rsrc));
-  }
-
-  @Override
-  public String getETag(RevisionResource rsrc) {
-    Hasher h = Hashing.murmur3_128().newHasher();
-    CurrentUser user = rsrc.getUser();
-    try {
-      rsrc.getChangeResource().prepareETag(h, user);
-      h.putBoolean(Submit.wholeTopicEnabled(config));
-      ReviewDb db = dbProvider.get();
-      ChangeSet cs = mergeSuperSet.get().completeChangeSet(db, rsrc.getChange(), user);
-      for (ChangeData cd : cs.changes()) {
-        changeResourceFactory.create(cd.notes(), user).prepareETag(h, user);
-      }
-      h.putBoolean(cs.furtherHiddenChanges());
-    } catch (IOException | OrmException | PermissionBackendException e) {
-      throw new OrmRuntimeException(e);
-    }
-    return h.hash().toString();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRobotComment.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRobotComment.java
deleted file mode 100644
index d4d53ad..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRobotComment.java
+++ /dev/null
@@ -1,38 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.common.RobotCommentInfo;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-
-@Singleton
-public class GetRobotComment implements RestReadView<RobotCommentResource> {
-
-  private final Provider<CommentJson> commentJson;
-
-  @Inject
-  GetRobotComment(Provider<CommentJson> commentJson) {
-    this.commentJson = commentJson;
-  }
-
-  @Override
-  public RobotCommentInfo apply(RobotCommentResource rsrc) throws OrmException {
-    return commentJson.get().newRobotCommentFormatter().format(rsrc.getComment());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetTopic.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetTopic.java
deleted file mode 100644
index 0746588..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetTopic.java
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.change;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.inject.Singleton;
-
-@Singleton
-public class GetTopic implements RestReadView<ChangeResource> {
-  @Override
-  public String apply(ChangeResource rsrc) {
-    return Strings.nullToEmpty(rsrc.getChange().getTopic());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Ignore.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Ignore.java
deleted file mode 100644
index 46dabdf..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Ignore.java
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.webui.UiAction;
-import com.google.gerrit.server.StarredChangesUtil;
-import com.google.gerrit.server.StarredChangesUtil.IllegalLabelException;
-import com.google.gerrit.server.StarredChangesUtil.MutuallyExclusiveLabelsException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class Ignore
-    implements RestModifyView<ChangeResource, Ignore.Input>, UiAction<ChangeResource> {
-  private static final Logger log = LoggerFactory.getLogger(Ignore.class);
-
-  public static class Input {}
-
-  private final StarredChangesUtil stars;
-
-  @Inject
-  Ignore(StarredChangesUtil stars) {
-    this.stars = stars;
-  }
-
-  @Override
-  public Description getDescription(ChangeResource rsrc) {
-    return new UiAction.Description()
-        .setLabel("Ignore")
-        .setTitle("Ignore the change")
-        .setVisible(canIgnore(rsrc));
-  }
-
-  @Override
-  public Response<String> apply(ChangeResource rsrc, Input input)
-      throws RestApiException, OrmException, IllegalLabelException {
-    try {
-      if (rsrc.isUserOwner()) {
-        throw new BadRequestException("cannot ignore own change");
-      }
-
-      if (!isIgnored(rsrc)) {
-        stars.ignore(rsrc);
-      }
-      return Response.ok("");
-    } catch (MutuallyExclusiveLabelsException e) {
-      throw new ResourceConflictException(e.getMessage());
-    }
-  }
-
-  private boolean canIgnore(ChangeResource rsrc) {
-    return !rsrc.isUserOwner() && !isIgnored(rsrc);
-  }
-
-  private boolean isIgnored(ChangeResource rsrc) {
-    try {
-      return stars.isIgnored(rsrc);
-    } catch (OrmException e) {
-      log.error("failed to check ignored star", e);
-    }
-    return false;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/IncludedIn.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/IncludedIn.java
deleted file mode 100644
index 8f8925a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/IncludedIn.java
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.change;
-
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.MultimapBuilder;
-import com.google.gerrit.extensions.api.changes.IncludedInInfo;
-import com.google.gerrit.extensions.config.ExternalIncludedIn;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.eclipse.jgit.errors.IncorrectObjectTypeException;
-import org.eclipse.jgit.errors.MissingObjectException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-@Singleton
-public class IncludedIn {
-  private final GitRepositoryManager repoManager;
-  private final DynamicSet<ExternalIncludedIn> externalIncludedIn;
-
-  @Inject
-  IncludedIn(GitRepositoryManager repoManager, DynamicSet<ExternalIncludedIn> externalIncludedIn) {
-    this.repoManager = repoManager;
-    this.externalIncludedIn = externalIncludedIn;
-  }
-
-  public IncludedInInfo apply(Project.NameKey project, String revisionId)
-      throws RestApiException, IOException {
-    try (Repository r = repoManager.openRepository(project);
-        RevWalk rw = new RevWalk(r)) {
-      rw.setRetainBody(false);
-      RevCommit rev;
-      try {
-        rev = rw.parseCommit(ObjectId.fromString(revisionId));
-      } catch (IncorrectObjectTypeException err) {
-        throw new BadRequestException(err.getMessage());
-      } catch (MissingObjectException err) {
-        throw new ResourceConflictException(err.getMessage());
-      }
-
-      IncludedInResolver.Result d = IncludedInResolver.resolve(r, rw, rev);
-      ListMultimap<String, String> external = MultimapBuilder.hashKeys().arrayListValues().build();
-      for (ExternalIncludedIn ext : externalIncludedIn) {
-        ListMultimap<String, String> extIncludedIns =
-            ext.getIncludedIn(project.get(), rev.name(), d.getTags(), d.getBranches());
-        if (extIncludedIns != null) {
-          external.putAll(extIncludedIns);
-        }
-      }
-      return new IncludedInInfo(
-          d.getBranches(), d.getTags(), (!external.isEmpty() ? external.asMap() : null));
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/IncludedInResolver.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/IncludedInResolver.java
deleted file mode 100644
index 658c91c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/IncludedInResolver.java
+++ /dev/null
@@ -1,259 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.change;
-
-import com.google.common.collect.LinkedListMultimap;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.Lists;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import org.eclipse.jgit.errors.IncorrectObjectTypeException;
-import org.eclipse.jgit.errors.MissingObjectException;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.RefDatabase;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevFlag;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Resolve in which tags and branches a commit is included. */
-public class IncludedInResolver {
-
-  private static final Logger log = LoggerFactory.getLogger(IncludedInResolver.class);
-
-  public static Result resolve(Repository repo, RevWalk rw, RevCommit commit) throws IOException {
-    RevFlag flag = newFlag(rw);
-    try {
-      return new IncludedInResolver(repo, rw, commit, flag).resolve();
-    } finally {
-      rw.disposeFlag(flag);
-    }
-  }
-
-  public static boolean includedInAny(
-      final Repository repo, RevWalk rw, RevCommit commit, Collection<Ref> refs)
-      throws IOException {
-    if (refs.isEmpty()) {
-      return false;
-    }
-    RevFlag flag = newFlag(rw);
-    try {
-      return new IncludedInResolver(repo, rw, commit, flag).includedInOne(refs);
-    } finally {
-      rw.disposeFlag(flag);
-    }
-  }
-
-  private static RevFlag newFlag(RevWalk rw) {
-    return rw.newFlag("CONTAINS_TARGET");
-  }
-
-  private final Repository repo;
-  private final RevWalk rw;
-  private final RevCommit target;
-
-  private final RevFlag containsTarget;
-  private ListMultimap<RevCommit, String> commitToRef;
-  private List<RevCommit> tipsByCommitTime;
-
-  private IncludedInResolver(
-      Repository repo, RevWalk rw, RevCommit target, RevFlag containsTarget) {
-    this.repo = repo;
-    this.rw = rw;
-    this.target = target;
-    this.containsTarget = containsTarget;
-  }
-
-  private Result resolve() throws IOException {
-    RefDatabase refDb = repo.getRefDatabase();
-    Collection<Ref> tags = refDb.getRefs(Constants.R_TAGS).values();
-    Collection<Ref> branches = refDb.getRefs(Constants.R_HEADS).values();
-    List<Ref> allTagsAndBranches = Lists.newArrayListWithCapacity(tags.size() + branches.size());
-    allTagsAndBranches.addAll(tags);
-    allTagsAndBranches.addAll(branches);
-    parseCommits(allTagsAndBranches);
-    Set<String> allMatchingTagsAndBranches = includedIn(tipsByCommitTime, 0);
-
-    Result detail = new Result();
-    detail.setBranches(getMatchingRefNames(allMatchingTagsAndBranches, branches));
-    detail.setTags(getMatchingRefNames(allMatchingTagsAndBranches, tags));
-
-    return detail;
-  }
-
-  private boolean includedInOne(Collection<Ref> refs) throws IOException {
-    parseCommits(refs);
-    List<RevCommit> before = new ArrayList<>();
-    List<RevCommit> after = new ArrayList<>();
-    partition(before, after);
-    rw.reset();
-    // It is highly likely that the target is reachable from the "after" set
-    // Within the "before" set we are trying to handle cases arising from clock skew
-    return !includedIn(after, 1).isEmpty() || !includedIn(before, 1).isEmpty();
-  }
-
-  /** Resolves which tip refs include the target commit. */
-  private Set<String> includedIn(Collection<RevCommit> tips, int limit)
-      throws IOException, MissingObjectException, IncorrectObjectTypeException {
-    Set<String> result = new HashSet<>();
-    for (RevCommit tip : tips) {
-      boolean commitFound = false;
-      rw.resetRetain(RevFlag.UNINTERESTING, containsTarget);
-      rw.markStart(tip);
-      for (RevCommit commit : rw) {
-        if (commit.equals(target) || commit.has(containsTarget)) {
-          commitFound = true;
-          tip.add(containsTarget);
-          result.addAll(commitToRef.get(tip));
-          break;
-        }
-      }
-      if (!commitFound) {
-        rw.markUninteresting(tip);
-      } else if (0 < limit && limit < result.size()) {
-        break;
-      }
-    }
-    return result;
-  }
-
-  /**
-   * Partition the reference tips into two sets:
-   *
-   * <ul>
-   *   <li>before = commits with time < target.getCommitTime()
-   *   <li>after = commits with time >= target.getCommitTime()
-   * </ul>
-   *
-   * Each of the before/after lists is sorted by the commit time.
-   *
-   * @param before
-   * @param after
-   */
-  private void partition(List<RevCommit> before, List<RevCommit> after) {
-    int insertionPoint =
-        Collections.binarySearch(
-            tipsByCommitTime,
-            target,
-            new Comparator<RevCommit>() {
-              @Override
-              public int compare(RevCommit c1, RevCommit c2) {
-                return c1.getCommitTime() - c2.getCommitTime();
-              }
-            });
-    if (insertionPoint < 0) {
-      insertionPoint = -(insertionPoint + 1);
-    }
-    if (0 < insertionPoint) {
-      before.addAll(tipsByCommitTime.subList(0, insertionPoint));
-    }
-    if (insertionPoint < tipsByCommitTime.size()) {
-      after.addAll(tipsByCommitTime.subList(insertionPoint, tipsByCommitTime.size()));
-    }
-  }
-
-  /**
-   * Returns the short names of refs which are as well in the matchingRefs list as well as in the
-   * allRef list.
-   */
-  private static List<String> getMatchingRefNames(
-      Set<String> matchingRefs, Collection<Ref> allRefs) {
-    List<String> refNames = Lists.newArrayListWithCapacity(matchingRefs.size());
-    for (Ref r : allRefs) {
-      if (matchingRefs.contains(r.getName())) {
-        refNames.add(Repository.shortenRefName(r.getName()));
-      }
-    }
-    return refNames;
-  }
-
-  /** Parse commit of ref and store the relation between ref and commit. */
-  private void parseCommits(Collection<Ref> refs) throws IOException {
-    if (commitToRef != null) {
-      return;
-    }
-    commitToRef = LinkedListMultimap.create();
-    for (Ref ref : refs) {
-      final RevCommit commit;
-      try {
-        commit = rw.parseCommit(ref.getObjectId());
-      } catch (IncorrectObjectTypeException notCommit) {
-        // Its OK for a tag reference to point to a blob or a tree, this
-        // is common in the Linux kernel or git.git repository.
-        //
-        continue;
-      } catch (MissingObjectException notHere) {
-        // Log the problem with this branch, but keep processing.
-        //
-        log.warn(
-            "Reference "
-                + ref.getName()
-                + " in "
-                + repo.getDirectory()
-                + " points to dangling object "
-                + ref.getObjectId());
-        continue;
-      }
-      commitToRef.put(commit, ref.getName());
-    }
-    tipsByCommitTime = Lists.newArrayList(commitToRef.keySet());
-    sortOlderFirst(tipsByCommitTime);
-  }
-
-  private void sortOlderFirst(List<RevCommit> tips) {
-    Collections.sort(
-        tips,
-        new Comparator<RevCommit>() {
-          @Override
-          public int compare(RevCommit c1, RevCommit c2) {
-            return c1.getCommitTime() - c2.getCommitTime();
-          }
-        });
-  }
-
-  public static class Result {
-    private List<String> branches;
-    private List<String> tags;
-
-    public Result() {}
-
-    public void setBranches(List<String> b) {
-      Collections.sort(b);
-      branches = b;
-    }
-
-    public List<String> getBranches() {
-      return branches;
-    }
-
-    public void setTags(List<String> t) {
-      Collections.sort(t);
-      tags = t;
-    }
-
-    public List<String> getTags() {
-      return tags;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Index.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Index.java
deleted file mode 100644
index 7c4d158..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Index.java
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.change.Index.Input;
-import com.google.gerrit.server.index.change.ChangeIndexer;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.RetryingRestModifyView;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-
-@Singleton
-public class Index extends RetryingRestModifyView<ChangeResource, Input, Response<?>> {
-  public static class Input {}
-
-  private final Provider<ReviewDb> db;
-  private final PermissionBackend permissionBackend;
-  private final Provider<CurrentUser> user;
-  private final ChangeIndexer indexer;
-
-  @Inject
-  Index(
-      Provider<ReviewDb> db,
-      RetryHelper retryHelper,
-      PermissionBackend permissionBackend,
-      Provider<CurrentUser> user,
-      ChangeIndexer indexer) {
-    super(retryHelper);
-    this.db = db;
-    this.permissionBackend = permissionBackend;
-    this.user = user;
-    this.indexer = indexer;
-  }
-
-  @Override
-  protected Response<?> applyImpl(
-      BatchUpdate.Factory updateFactory, ChangeResource rsrc, Input input)
-      throws IOException, AuthException, OrmException, PermissionBackendException {
-    permissionBackend.user(user).check(GlobalPermission.MAINTAIN_SERVER);
-    indexer.index(db.get(), rsrc.getChange());
-    return Response.none();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/LimitedByteArrayOutputStream.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/LimitedByteArrayOutputStream.java
deleted file mode 100644
index facc03c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/LimitedByteArrayOutputStream.java
+++ /dev/null
@@ -1,67 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.change;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-
-class LimitedByteArrayOutputStream extends OutputStream {
-
-  private final int maxSize;
-  private final ByteArrayOutputStream buffer;
-
-  /**
-   * Constructs a LimitedByteArrayOutputStream, which stores output in memory up to a certain
-   * specified size. When the output exceeds the specified size a LimitExceededException is thrown.
-   *
-   * @param max the maximum size in bytes which may be stored.
-   * @param initial the initial size. It must be smaller than the max size.
-   */
-  LimitedByteArrayOutputStream(int max, int initial) {
-    checkArgument(initial <= max);
-    maxSize = max;
-    buffer = new ByteArrayOutputStream(initial);
-  }
-
-  private void checkOversize(int additionalSize) throws IOException {
-    if (buffer.size() + additionalSize > maxSize) {
-      throw new LimitExceededException();
-    }
-  }
-
-  @Override
-  public void write(int b) throws IOException {
-    checkOversize(1);
-    buffer.write(b);
-  }
-
-  @Override
-  public void write(byte[] b, int off, int len) throws IOException {
-    checkOversize(len);
-    buffer.write(b, off, len);
-  }
-
-  /** @return a newly allocated byte array with contents of the buffer. */
-  public byte[] toByteArray() {
-    return buffer.toByteArray();
-  }
-
-  static class LimitExceededException extends IOException {
-    private static final long serialVersionUID = 1L;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListChangeComments.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ListChangeComments.java
deleted file mode 100644
index 0048657..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListChangeComments.java
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.common.CommentInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CommentsUtil;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.List;
-import java.util.Map;
-
-@Singleton
-public class ListChangeComments implements RestReadView<ChangeResource> {
-  private final Provider<ReviewDb> db;
-  private final ChangeData.Factory changeDataFactory;
-  private final Provider<CommentJson> commentJson;
-  private final CommentsUtil commentsUtil;
-
-  @Inject
-  ListChangeComments(
-      Provider<ReviewDb> db,
-      ChangeData.Factory changeDataFactory,
-      Provider<CommentJson> commentJson,
-      CommentsUtil commentsUtil) {
-    this.db = db;
-    this.changeDataFactory = changeDataFactory;
-    this.commentJson = commentJson;
-    this.commentsUtil = commentsUtil;
-  }
-
-  @Override
-  public Map<String, List<CommentInfo>> apply(ChangeResource rsrc)
-      throws AuthException, OrmException {
-    ChangeData cd = changeDataFactory.create(db.get(), rsrc.getNotes());
-    return commentJson
-        .get()
-        .setFillAccounts(true)
-        .setFillPatchSet(true)
-        .newCommentFormatter()
-        .format(commentsUtil.publishedByChange(db.get(), cd.notes()));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListChangeDrafts.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ListChangeDrafts.java
deleted file mode 100644
index 02713de..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListChangeDrafts.java
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.common.CommentInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CommentsUtil;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.List;
-import java.util.Map;
-
-@Singleton
-public class ListChangeDrafts implements RestReadView<ChangeResource> {
-  private final Provider<ReviewDb> db;
-  private final ChangeData.Factory changeDataFactory;
-  private final Provider<CommentJson> commentJson;
-  private final CommentsUtil commentsUtil;
-
-  @Inject
-  ListChangeDrafts(
-      Provider<ReviewDb> db,
-      ChangeData.Factory changeDataFactory,
-      Provider<CommentJson> commentJson,
-      CommentsUtil commentsUtil) {
-    this.db = db;
-    this.changeDataFactory = changeDataFactory;
-    this.commentJson = commentJson;
-    this.commentsUtil = commentsUtil;
-  }
-
-  @Override
-  public Map<String, List<CommentInfo>> apply(ChangeResource rsrc)
-      throws AuthException, OrmException {
-    if (!rsrc.getUser().isIdentifiedUser()) {
-      throw new AuthException("Authentication required");
-    }
-    ChangeData cd = changeDataFactory.create(db.get(), rsrc.getNotes());
-    List<Comment> drafts =
-        commentsUtil.draftByChangeAuthor(db.get(), cd.notes(), rsrc.getUser().getAccountId());
-    return commentJson
-        .get()
-        .setFillAccounts(false)
-        .setFillPatchSet(true)
-        .newCommentFormatter()
-        .format(drafts);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListChangeRobotComments.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ListChangeRobotComments.java
deleted file mode 100644
index fff7f82..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListChangeRobotComments.java
+++ /dev/null
@@ -1,58 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.common.RobotCommentInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CommentsUtil;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.util.List;
-import java.util.Map;
-
-public class ListChangeRobotComments implements RestReadView<ChangeResource> {
-  private final Provider<ReviewDb> db;
-  private final ChangeData.Factory changeDataFactory;
-  private final Provider<CommentJson> commentJson;
-  private final CommentsUtil commentsUtil;
-
-  @Inject
-  ListChangeRobotComments(
-      Provider<ReviewDb> db,
-      ChangeData.Factory changeDataFactory,
-      Provider<CommentJson> commentJson,
-      CommentsUtil commentsUtil) {
-    this.db = db;
-    this.changeDataFactory = changeDataFactory;
-    this.commentJson = commentJson;
-    this.commentsUtil = commentsUtil;
-  }
-
-  @Override
-  public Map<String, List<RobotCommentInfo>> apply(ChangeResource rsrc)
-      throws AuthException, OrmException {
-    ChangeData cd = changeDataFactory.create(db.get(), rsrc.getNotes());
-    return commentJson
-        .get()
-        .setFillAccounts(true)
-        .setFillPatchSet(true)
-        .newRobotCommentFormatter()
-        .format(commentsUtil.robotCommentsByChange(cd.notes()));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListReviewers.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ListReviewers.java
deleted file mode 100644
index 385e3b9..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListReviewers.java
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.api.changes.ReviewerInfo;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-@Singleton
-public class ListReviewers implements RestReadView<ChangeResource> {
-  private final Provider<ReviewDb> dbProvider;
-  private final ApprovalsUtil approvalsUtil;
-  private final ReviewerJson json;
-  private final ReviewerResource.Factory resourceFactory;
-
-  @Inject
-  ListReviewers(
-      Provider<ReviewDb> dbProvider,
-      ApprovalsUtil approvalsUtil,
-      ReviewerResource.Factory resourceFactory,
-      ReviewerJson json) {
-    this.dbProvider = dbProvider;
-    this.approvalsUtil = approvalsUtil;
-    this.resourceFactory = resourceFactory;
-    this.json = json;
-  }
-
-  @Override
-  public List<ReviewerInfo> apply(ChangeResource rsrc)
-      throws OrmException, PermissionBackendException {
-    Map<String, ReviewerResource> reviewers = new LinkedHashMap<>();
-    ReviewDb db = dbProvider.get();
-    for (Account.Id accountId : approvalsUtil.getReviewers(db, rsrc.getNotes()).all()) {
-      if (!reviewers.containsKey(accountId.toString())) {
-        reviewers.put(accountId.toString(), resourceFactory.create(rsrc, accountId));
-      }
-    }
-    for (Address adr : rsrc.getNotes().getReviewersByEmail().all()) {
-      if (!reviewers.containsKey(adr.toString())) {
-        reviewers.put(adr.toString(), new ReviewerResource(rsrc, adr));
-      }
-    }
-    return json.format(reviewers.values());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListRevisionComments.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ListRevisionComments.java
deleted file mode 100644
index 037a856..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListRevisionComments.java
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.change;
-
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CommentsUtil;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-
-@Singleton
-public class ListRevisionComments extends ListRevisionDrafts {
-  @Inject
-  ListRevisionComments(
-      Provider<ReviewDb> db, Provider<CommentJson> commentJson, CommentsUtil commentsUtil) {
-    super(db, commentJson, commentsUtil);
-  }
-
-  @Override
-  protected boolean includeAuthorInfo() {
-    return true;
-  }
-
-  @Override
-  protected Iterable<Comment> listComments(RevisionResource rsrc) throws OrmException {
-    ChangeNotes notes = rsrc.getNotes();
-    return commentsUtil.publishedByPatchSet(db.get(), notes, rsrc.getPatchSet().getId());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListRevisionDrafts.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ListRevisionDrafts.java
deleted file mode 100644
index 0463601..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListRevisionDrafts.java
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.common.CommentInfo;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CommentsUtil;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.List;
-import java.util.Map;
-
-@Singleton
-public class ListRevisionDrafts implements RestReadView<RevisionResource> {
-  protected final Provider<ReviewDb> db;
-  protected final Provider<CommentJson> commentJson;
-  protected final CommentsUtil commentsUtil;
-
-  @Inject
-  ListRevisionDrafts(
-      Provider<ReviewDb> db, Provider<CommentJson> commentJson, CommentsUtil commentsUtil) {
-    this.db = db;
-    this.commentJson = commentJson;
-    this.commentsUtil = commentsUtil;
-  }
-
-  protected Iterable<Comment> listComments(RevisionResource rsrc) throws OrmException {
-    return commentsUtil.draftByPatchSetAuthor(
-        db.get(), rsrc.getPatchSet().getId(), rsrc.getAccountId(), rsrc.getNotes());
-  }
-
-  protected boolean includeAuthorInfo() {
-    return false;
-  }
-
-  @Override
-  public Map<String, List<CommentInfo>> apply(RevisionResource rsrc) throws OrmException {
-    return commentJson
-        .get()
-        .setFillAccounts(includeAuthorInfo())
-        .newCommentFormatter()
-        .format(listComments(rsrc));
-  }
-
-  public List<CommentInfo> getComments(RevisionResource rsrc) throws OrmException {
-    return commentJson
-        .get()
-        .setFillAccounts(includeAuthorInfo())
-        .newCommentFormatter()
-        .formatAsList(listComments(rsrc));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListRevisionReviewers.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ListRevisionReviewers.java
deleted file mode 100644
index 6d9dc79..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListRevisionReviewers.java
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.api.changes.ReviewerInfo;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-@Singleton
-class ListRevisionReviewers implements RestReadView<RevisionResource> {
-  private final Provider<ReviewDb> dbProvider;
-  private final ApprovalsUtil approvalsUtil;
-  private final ReviewerJson json;
-  private final ReviewerResource.Factory resourceFactory;
-
-  @Inject
-  ListRevisionReviewers(
-      Provider<ReviewDb> dbProvider,
-      ApprovalsUtil approvalsUtil,
-      ReviewerResource.Factory resourceFactory,
-      ReviewerJson json) {
-    this.dbProvider = dbProvider;
-    this.approvalsUtil = approvalsUtil;
-    this.resourceFactory = resourceFactory;
-    this.json = json;
-  }
-
-  @Override
-  public List<ReviewerInfo> apply(RevisionResource rsrc)
-      throws OrmException, MethodNotAllowedException, PermissionBackendException {
-    if (!rsrc.isCurrent()) {
-      throw new MethodNotAllowedException("Cannot list reviewers on non-current patch set");
-    }
-
-    Map<String, ReviewerResource> reviewers = new LinkedHashMap<>();
-    ReviewDb db = dbProvider.get();
-    for (Account.Id accountId : approvalsUtil.getReviewers(db, rsrc.getNotes()).all()) {
-      if (!reviewers.containsKey(accountId.toString())) {
-        reviewers.put(accountId.toString(), resourceFactory.create(rsrc, accountId));
-      }
-    }
-    for (Address address : rsrc.getNotes().getReviewersByEmail().all()) {
-      if (!reviewers.containsKey(address.toString())) {
-        reviewers.put(address.toString(), new ReviewerResource(rsrc, address));
-      }
-    }
-    return json.format(reviewers.values());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListRobotComments.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ListRobotComments.java
deleted file mode 100644
index de2b91a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListRobotComments.java
+++ /dev/null
@@ -1,63 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.common.RobotCommentInfo;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.RobotComment;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CommentsUtil;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.List;
-import java.util.Map;
-
-@Singleton
-public class ListRobotComments implements RestReadView<RevisionResource> {
-  protected final Provider<ReviewDb> db;
-  protected final Provider<CommentJson> commentJson;
-  protected final CommentsUtil commentsUtil;
-
-  @Inject
-  ListRobotComments(
-      Provider<ReviewDb> db, Provider<CommentJson> commentJson, CommentsUtil commentsUtil) {
-    this.db = db;
-    this.commentJson = commentJson;
-    this.commentsUtil = commentsUtil;
-  }
-
-  @Override
-  public Map<String, List<RobotCommentInfo>> apply(RevisionResource rsrc) throws OrmException {
-    return commentJson
-        .get()
-        .setFillAccounts(true)
-        .newRobotCommentFormatter()
-        .format(listComments(rsrc));
-  }
-
-  public List<RobotCommentInfo> getComments(RevisionResource rsrc) throws OrmException {
-    return commentJson
-        .get()
-        .setFillAccounts(true)
-        .newRobotCommentFormatter()
-        .formatAsList(listComments(rsrc));
-  }
-
-  private Iterable<RobotComment> listComments(RevisionResource rsrc) throws OrmException {
-    return commentsUtil.robotCommentsByPatchSet(rsrc.getNotes(), rsrc.getPatchSet().getId());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/MarkAsReviewed.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/MarkAsReviewed.java
deleted file mode 100644
index 265b2b0..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/MarkAsReviewed.java
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.webui.UiAction;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.StarredChangesUtil;
-import com.google.gerrit.server.StarredChangesUtil.IllegalLabelException;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class MarkAsReviewed
-    implements RestModifyView<ChangeResource, MarkAsReviewed.Input>, UiAction<ChangeResource> {
-  private static final Logger log = LoggerFactory.getLogger(MarkAsReviewed.class);
-
-  public static class Input {}
-
-  private final Provider<ReviewDb> dbProvider;
-  private final ChangeData.Factory changeDataFactory;
-  private final StarredChangesUtil stars;
-
-  @Inject
-  MarkAsReviewed(
-      Provider<ReviewDb> dbProvider,
-      ChangeData.Factory changeDataFactory,
-      StarredChangesUtil stars) {
-    this.dbProvider = dbProvider;
-    this.changeDataFactory = changeDataFactory;
-    this.stars = stars;
-  }
-
-  @Override
-  public Description getDescription(ChangeResource rsrc) {
-    return new UiAction.Description()
-        .setLabel("Mark Reviewed")
-        .setTitle("Mark the change as reviewed to unhighlight it in the dashboard")
-        .setVisible(!isReviewed(rsrc));
-  }
-
-  @Override
-  public Response<String> apply(ChangeResource rsrc, Input input)
-      throws RestApiException, OrmException, IllegalLabelException {
-    stars.markAsReviewed(rsrc);
-    return Response.ok("");
-  }
-
-  private boolean isReviewed(ChangeResource rsrc) {
-    try {
-      return changeDataFactory
-          .create(dbProvider.get(), rsrc.getNotes())
-          .isReviewedBy(rsrc.getUser().asIdentifiedUser().getAccountId());
-    } catch (OrmException e) {
-      log.error("failed to check if change is reviewed", e);
-    }
-    return false;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/MarkAsUnreviewed.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/MarkAsUnreviewed.java
deleted file mode 100644
index 6de84ee..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/MarkAsUnreviewed.java
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.webui.UiAction;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.StarredChangesUtil;
-import com.google.gerrit.server.StarredChangesUtil.IllegalLabelException;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class MarkAsUnreviewed
-    implements RestModifyView<ChangeResource, MarkAsUnreviewed.Input>, UiAction<ChangeResource> {
-  private static final Logger log = LoggerFactory.getLogger(MarkAsUnreviewed.class);
-
-  public static class Input {}
-
-  private final Provider<ReviewDb> dbProvider;
-  private final ChangeData.Factory changeDataFactory;
-  private final StarredChangesUtil stars;
-
-  @Inject
-  MarkAsUnreviewed(
-      Provider<ReviewDb> dbProvider,
-      ChangeData.Factory changeDataFactory,
-      StarredChangesUtil stars) {
-    this.dbProvider = dbProvider;
-    this.changeDataFactory = changeDataFactory;
-    this.stars = stars;
-  }
-
-  @Override
-  public Description getDescription(ChangeResource rsrc) {
-    return new UiAction.Description()
-        .setLabel("Mark Unreviewed")
-        .setTitle("Mark the change as unreviewed to highlight it in the dashboard")
-        .setVisible(isReviewed(rsrc));
-  }
-
-  @Override
-  public Response<String> apply(ChangeResource rsrc, Input input)
-      throws OrmException, IllegalLabelException {
-    stars.markAsUnreviewed(rsrc);
-    return Response.ok("");
-  }
-
-  private boolean isReviewed(ChangeResource rsrc) {
-    try {
-      return changeDataFactory
-          .create(dbProvider.get(), rsrc.getNotes())
-          .isReviewedBy(rsrc.getUser().asIdentifiedUser().getAccountId());
-    } catch (OrmException e) {
-      log.error("failed to check if change is reviewed", e);
-    }
-    return false;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityCacheImpl.java
deleted file mode 100644
index a8cd31a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityCacheImpl.java
+++ /dev/null
@@ -1,234 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.change;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.gerrit.server.ioutil.BasicSerialization.readString;
-import static com.google.gerrit.server.ioutil.BasicSerialization.writeString;
-import static org.eclipse.jgit.lib.ObjectIdSerialization.readNotNull;
-import static org.eclipse.jgit.lib.ObjectIdSerialization.writeNotNull;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.cache.Cache;
-import com.google.common.cache.Weigher;
-import com.google.common.collect.ImmutableBiMap;
-import com.google.common.util.concurrent.UncheckedExecutionException;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.server.cache.CacheModule;
-import com.google.gerrit.server.git.CodeReviewCommit;
-import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
-import com.google.gerrit.server.git.strategy.SubmitDryRun;
-import com.google.inject.Inject;
-import com.google.inject.Module;
-import com.google.inject.Singleton;
-import com.google.inject.name.Named;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-import java.util.Arrays;
-import java.util.Objects;
-import java.util.Set;
-import java.util.concurrent.ExecutionException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class MergeabilityCacheImpl implements MergeabilityCache {
-  private static final Logger log = LoggerFactory.getLogger(MergeabilityCacheImpl.class);
-
-  private static final String CACHE_NAME = "mergeability";
-
-  public static final ImmutableBiMap<SubmitType, Character> SUBMIT_TYPES =
-      new ImmutableBiMap.Builder<SubmitType, Character>()
-          .put(SubmitType.FAST_FORWARD_ONLY, 'F')
-          .put(SubmitType.MERGE_IF_NECESSARY, 'M')
-          .put(SubmitType.REBASE_ALWAYS, 'P')
-          .put(SubmitType.REBASE_IF_NECESSARY, 'R')
-          .put(SubmitType.MERGE_ALWAYS, 'A')
-          .put(SubmitType.CHERRY_PICK, 'C')
-          .build();
-
-  static {
-    checkState(
-        SUBMIT_TYPES.size() == SubmitType.values().length,
-        "SubmitType <-> char BiMap needs updating");
-  }
-
-  public static Module module() {
-    return new CacheModule() {
-      @Override
-      protected void configure() {
-        persist(CACHE_NAME, EntryKey.class, Boolean.class)
-            .maximumWeight(1 << 20)
-            .weigher(MergeabilityWeigher.class);
-        bind(MergeabilityCache.class).to(MergeabilityCacheImpl.class);
-      }
-    };
-  }
-
-  public static ObjectId toId(Ref ref) {
-    return ref != null && ref.getObjectId() != null ? ref.getObjectId() : ObjectId.zeroId();
-  }
-
-  public static class EntryKey implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    private ObjectId commit;
-    private ObjectId into;
-    private SubmitType submitType;
-    private String mergeStrategy;
-
-    public EntryKey(ObjectId commit, ObjectId into, SubmitType submitType, String mergeStrategy) {
-      this.commit = checkNotNull(commit, "commit");
-      this.into = checkNotNull(into, "into");
-      this.submitType = checkNotNull(submitType, "submitType");
-      this.mergeStrategy = checkNotNull(mergeStrategy, "mergeStrategy");
-    }
-
-    public ObjectId getCommit() {
-      return commit;
-    }
-
-    public ObjectId getInto() {
-      return into;
-    }
-
-    public SubmitType getSubmitType() {
-      return submitType;
-    }
-
-    public String getMergeStrategy() {
-      return mergeStrategy;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-      if (o instanceof EntryKey) {
-        EntryKey k = (EntryKey) o;
-        return commit.equals(k.commit)
-            && into.equals(k.into)
-            && submitType == k.submitType
-            && mergeStrategy.equals(k.mergeStrategy);
-      }
-      return false;
-    }
-
-    @Override
-    public int hashCode() {
-      return Objects.hash(commit, into, submitType, mergeStrategy);
-    }
-
-    @Override
-    public String toString() {
-      return MoreObjects.toStringHelper(this)
-          .add("commit", commit.name())
-          .add("into", into.name())
-          .addValue(submitType)
-          .addValue(mergeStrategy)
-          .toString();
-    }
-
-    private void writeObject(ObjectOutputStream out) throws IOException {
-      writeNotNull(out, commit);
-      writeNotNull(out, into);
-      Character c = SUBMIT_TYPES.get(submitType);
-      if (c == null) {
-        throw new IOException("Invalid submit type: " + submitType);
-      }
-      out.writeChar(c);
-      writeString(out, mergeStrategy);
-    }
-
-    private void readObject(ObjectInputStream in) throws IOException {
-      commit = readNotNull(in);
-      into = readNotNull(in);
-      char t = in.readChar();
-      submitType = SUBMIT_TYPES.inverse().get(t);
-      if (submitType == null) {
-        throw new IOException("Invalid submit type code: " + t);
-      }
-      mergeStrategy = readString(in);
-    }
-  }
-
-  public static class MergeabilityWeigher implements Weigher<EntryKey, Boolean> {
-    @Override
-    public int weigh(EntryKey k, Boolean v) {
-      return 16
-          + 2 * (16 + 20)
-          + 3 * 8 // Size of EntryKey, 64-bit JVM.
-          + 8; // Size of Boolean.
-    }
-  }
-
-  private final SubmitDryRun submitDryRun;
-  private final Cache<EntryKey, Boolean> cache;
-
-  @Inject
-  MergeabilityCacheImpl(
-      SubmitDryRun submitDryRun, @Named(CACHE_NAME) Cache<EntryKey, Boolean> cache) {
-    this.submitDryRun = submitDryRun;
-    this.cache = cache;
-  }
-
-  @Override
-  public boolean get(
-      ObjectId commit,
-      Ref intoRef,
-      SubmitType submitType,
-      String mergeStrategy,
-      Branch.NameKey dest,
-      Repository repo) {
-    ObjectId into = intoRef != null ? intoRef.getObjectId() : ObjectId.zeroId();
-    EntryKey key = new EntryKey(commit, into, submitType, mergeStrategy);
-    try {
-      return cache.get(
-          key,
-          () -> {
-            if (key.into.equals(ObjectId.zeroId())) {
-              return true; // Assume yes on new branch.
-            }
-            try (CodeReviewRevWalk rw = CodeReviewCommit.newRevWalk(repo)) {
-              Set<RevCommit> accepted = SubmitDryRun.getAlreadyAccepted(repo, rw);
-              accepted.add(rw.parseCommit(key.into));
-              accepted.addAll(Arrays.asList(rw.parseCommit(key.commit).getParents()));
-              return submitDryRun.run(
-                  key.submitType, repo, rw, dest, key.into, key.commit, accepted);
-            }
-          });
-    } catch (ExecutionException | UncheckedExecutionException e) {
-      log.error(
-          "Error checking mergeability of {} into {} ({})",
-          key.commit.name(),
-          key.into.name(),
-          key.submitType.name(),
-          e.getCause());
-      return false;
-    }
-  }
-
-  @Override
-  public Boolean getIfPresent(
-      ObjectId commit, Ref intoRef, SubmitType submitType, String mergeStrategy) {
-    return cache.getIfPresent(new EntryKey(commit, toId(intoRef), submitType, mergeStrategy));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Mergeable.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Mergeable.java
deleted file mode 100644
index a8a297e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Mergeable.java
+++ /dev/null
@@ -1,208 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.change;
-
-import com.google.gerrit.common.data.SubmitTypeRecord;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.extensions.common.MergeableInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.reviewdb.server.ReviewDbUtil;
-import com.google.gerrit.server.ChangeUtil;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.git.BranchOrderSection;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MergeUtil;
-import com.google.gerrit.server.index.change.ChangeIndexer;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.project.SubmitRuleEvaluator;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Map;
-import java.util.Objects;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.kohsuke.args4j.Option;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class Mergeable implements RestReadView<RevisionResource> {
-  private static final Logger log = LoggerFactory.getLogger(Mergeable.class);
-
-  @Option(
-      name = "--other-branches",
-      aliases = {"-o"},
-      usage = "test mergeability for other branches too")
-  private boolean otherBranches;
-
-  private final GitRepositoryManager gitManager;
-  private final ProjectCache projectCache;
-  private final MergeUtil.Factory mergeUtilFactory;
-  private final ChangeData.Factory changeDataFactory;
-  private final Provider<ReviewDb> db;
-  private final ChangeIndexer indexer;
-  private final MergeabilityCache cache;
-  private final SubmitRuleEvaluator.Factory submitRuleEvaluatorFactory;
-
-  @Inject
-  Mergeable(
-      GitRepositoryManager gitManager,
-      ProjectCache projectCache,
-      MergeUtil.Factory mergeUtilFactory,
-      ChangeData.Factory changeDataFactory,
-      Provider<ReviewDb> db,
-      ChangeIndexer indexer,
-      MergeabilityCache cache,
-      SubmitRuleEvaluator.Factory submitRuleEvaluatorFactory) {
-    this.gitManager = gitManager;
-    this.projectCache = projectCache;
-    this.mergeUtilFactory = mergeUtilFactory;
-    this.changeDataFactory = changeDataFactory;
-    this.db = db;
-    this.indexer = indexer;
-    this.cache = cache;
-    this.submitRuleEvaluatorFactory = submitRuleEvaluatorFactory;
-  }
-
-  public void setOtherBranches(boolean otherBranches) {
-    this.otherBranches = otherBranches;
-  }
-
-  @Override
-  public MergeableInfo apply(RevisionResource resource)
-      throws AuthException, ResourceConflictException, BadRequestException, OrmException,
-          IOException {
-    Change change = resource.getChange();
-    PatchSet ps = resource.getPatchSet();
-    MergeableInfo result = new MergeableInfo();
-
-    if (!change.getStatus().isOpen()) {
-      throw new ResourceConflictException("change is " + ChangeUtil.status(change));
-    } else if (!ps.getId().equals(change.currentPatchSetId())) {
-      // Only the current revision is mergeable. Others always fail.
-      return result;
-    }
-
-    ChangeData cd = changeDataFactory.create(db.get(), resource.getNotes());
-    result.submitType = getSubmitType(resource.getUser(), cd, ps);
-
-    try (Repository git = gitManager.openRepository(change.getProject())) {
-      ObjectId commit = toId(ps);
-      Ref ref = git.getRefDatabase().exactRef(change.getDest().get());
-      ProjectState projectState = projectCache.get(change.getProject());
-      String strategy = mergeUtilFactory.create(projectState).mergeStrategyName();
-      result.strategy = strategy;
-      result.mergeable = isMergable(git, change, commit, ref, result.submitType, strategy);
-
-      if (otherBranches) {
-        result.mergeableInto = new ArrayList<>();
-        BranchOrderSection branchOrder = projectState.getBranchOrderSection();
-        if (branchOrder != null) {
-          int prefixLen = Constants.R_HEADS.length();
-          String[] names = branchOrder.getMoreStable(ref.getName());
-          Map<String, Ref> refs = git.getRefDatabase().exactRef(names);
-          for (String n : names) {
-            Ref other = refs.get(n);
-            if (other == null) {
-              continue;
-            }
-            if (cache.get(commit, other, SubmitType.CHERRY_PICK, strategy, change.getDest(), git)) {
-              result.mergeableInto.add(other.getName().substring(prefixLen));
-            }
-          }
-        }
-      }
-    }
-    return result;
-  }
-
-  private SubmitType getSubmitType(CurrentUser user, ChangeData cd, PatchSet patchSet)
-      throws OrmException {
-    SubmitTypeRecord rec =
-        submitRuleEvaluatorFactory.create(user, cd).setPatchSet(patchSet).getSubmitType();
-    if (rec.status != SubmitTypeRecord.Status.OK) {
-      throw new OrmException("Submit type rule failed: " + rec);
-    }
-    return rec.type;
-  }
-
-  private boolean isMergable(
-      Repository git,
-      Change change,
-      ObjectId commit,
-      Ref ref,
-      SubmitType submitType,
-      String strategy)
-      throws IOException, OrmException {
-    if (commit == null) {
-      return false;
-    }
-
-    Boolean old = cache.getIfPresent(commit, ref, submitType, strategy);
-    if (old != null) {
-      return old;
-    }
-    return refresh(change, commit, ref, submitType, strategy, git, old);
-  }
-
-  private static ObjectId toId(PatchSet ps) {
-    try {
-      return ObjectId.fromString(ps.getRevision().get());
-    } catch (IllegalArgumentException e) {
-      log.error("Invalid revision on patch set " + ps);
-      return null;
-    }
-  }
-
-  private boolean refresh(
-      final Change change,
-      ObjectId commit,
-      final Ref ref,
-      SubmitType type,
-      String strategy,
-      Repository git,
-      Boolean old)
-      throws OrmException, IOException {
-    final boolean mergeable = cache.get(commit, ref, type, strategy, change.getDest(), git);
-    if (!Objects.equals(mergeable, old)) {
-      invalidateETag(change.getId(), db.get());
-      indexer.index(db.get(), change);
-    }
-    return mergeable;
-  }
-
-  private static void invalidateETag(Change.Id id, ReviewDb db) throws OrmException {
-    // Empty update of Change to bump rowVersion, changing its ETag.
-    // TODO(dborowitz): Include cache info in ETag somehow instead.
-    db = ReviewDbUtil.unwrapDb(db);
-    Change c = db.changes().get(id);
-    if (c != null) {
-      db.changes().update(Collections.singleton(c));
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Module.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Module.java
deleted file mode 100644
index b4f71af..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Module.java
+++ /dev/null
@@ -1,183 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.change;
-
-import static com.google.gerrit.server.change.ChangeEditResource.CHANGE_EDIT_KIND;
-import static com.google.gerrit.server.change.ChangeResource.CHANGE_KIND;
-import static com.google.gerrit.server.change.CommentResource.COMMENT_KIND;
-import static com.google.gerrit.server.change.DraftCommentResource.DRAFT_COMMENT_KIND;
-import static com.google.gerrit.server.change.FileResource.FILE_KIND;
-import static com.google.gerrit.server.change.FixResource.FIX_KIND;
-import static com.google.gerrit.server.change.ReviewerResource.REVIEWER_KIND;
-import static com.google.gerrit.server.change.RevisionResource.REVISION_KIND;
-import static com.google.gerrit.server.change.RobotCommentResource.ROBOT_COMMENT_KIND;
-import static com.google.gerrit.server.change.VoteResource.VOTE_KIND;
-
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.RestApiModule;
-import com.google.gerrit.server.account.AccountLoader;
-import com.google.gerrit.server.change.Reviewed.DeleteReviewed;
-import com.google.gerrit.server.change.Reviewed.PutReviewed;
-
-public class Module extends RestApiModule {
-  @Override
-  protected void configure() {
-    bind(ChangesCollection.class);
-    bind(Revisions.class);
-    bind(Reviewers.class);
-    bind(RevisionReviewers.class);
-    bind(DraftComments.class);
-    bind(Comments.class);
-    bind(RobotComments.class);
-    bind(Fixes.class);
-    bind(Files.class);
-    bind(Votes.class);
-
-    DynamicMap.mapOf(binder(), CHANGE_KIND);
-    DynamicMap.mapOf(binder(), COMMENT_KIND);
-    DynamicMap.mapOf(binder(), ROBOT_COMMENT_KIND);
-    DynamicMap.mapOf(binder(), FIX_KIND);
-    DynamicMap.mapOf(binder(), DRAFT_COMMENT_KIND);
-    DynamicMap.mapOf(binder(), FILE_KIND);
-    DynamicMap.mapOf(binder(), REVIEWER_KIND);
-    DynamicMap.mapOf(binder(), REVISION_KIND);
-    DynamicMap.mapOf(binder(), CHANGE_EDIT_KIND);
-    DynamicMap.mapOf(binder(), VOTE_KIND);
-
-    get(CHANGE_KIND).to(GetChange.class);
-    post(CHANGE_KIND, "merge").to(CreateMergePatchSet.class);
-    get(CHANGE_KIND, "detail").to(GetDetail.class);
-    get(CHANGE_KIND, "topic").to(GetTopic.class);
-    get(CHANGE_KIND, "in").to(ChangeIncludedIn.class);
-    get(CHANGE_KIND, "assignee").to(GetAssignee.class);
-    get(CHANGE_KIND, "past_assignees").to(GetPastAssignees.class);
-    put(CHANGE_KIND, "assignee").to(PutAssignee.class);
-    delete(CHANGE_KIND, "assignee").to(DeleteAssignee.class);
-    get(CHANGE_KIND, "hashtags").to(GetHashtags.class);
-    get(CHANGE_KIND, "comments").to(ListChangeComments.class);
-    get(CHANGE_KIND, "robotcomments").to(ListChangeRobotComments.class);
-    get(CHANGE_KIND, "drafts").to(ListChangeDrafts.class);
-    get(CHANGE_KIND, "check").to(Check.class);
-    get(CHANGE_KIND, "pure_revert").to(GetPureRevert.class);
-    post(CHANGE_KIND, "check").to(Check.class);
-    put(CHANGE_KIND, "topic").to(PutTopic.class);
-    delete(CHANGE_KIND, "topic").to(PutTopic.class);
-    delete(CHANGE_KIND).to(DeleteChange.class);
-    post(CHANGE_KIND, "abandon").to(Abandon.class);
-    post(CHANGE_KIND, "hashtags").to(PostHashtags.class);
-    post(CHANGE_KIND, "restore").to(Restore.class);
-    post(CHANGE_KIND, "revert").to(Revert.class);
-    post(CHANGE_KIND, "submit").to(Submit.CurrentRevision.class);
-    get(CHANGE_KIND, "submitted_together").to(SubmittedTogether.class);
-    post(CHANGE_KIND, "rebase").to(Rebase.CurrentRevision.class);
-    post(CHANGE_KIND, "index").to(Index.class);
-    post(CHANGE_KIND, "rebuild.notedb").to(Rebuild.class);
-    post(CHANGE_KIND, "move").to(Move.class);
-    post(CHANGE_KIND, "private").to(PostPrivate.class);
-    post(CHANGE_KIND, "private.delete").to(DeletePrivateByPost.class);
-    delete(CHANGE_KIND, "private").to(DeletePrivate.class);
-    put(CHANGE_KIND, "ignore").to(Ignore.class);
-    put(CHANGE_KIND, "unignore").to(Unignore.class);
-    put(CHANGE_KIND, "reviewed").to(MarkAsReviewed.class);
-    put(CHANGE_KIND, "unreviewed").to(MarkAsUnreviewed.class);
-    post(CHANGE_KIND, "wip").to(SetWorkInProgress.class);
-    post(CHANGE_KIND, "ready").to(SetReadyForReview.class);
-    put(CHANGE_KIND, "message").to(PutMessage.class);
-
-    post(CHANGE_KIND, "reviewers").to(PostReviewers.class);
-    get(CHANGE_KIND, "suggest_reviewers").to(SuggestChangeReviewers.class);
-    child(CHANGE_KIND, "reviewers").to(Reviewers.class);
-    get(REVIEWER_KIND).to(GetReviewer.class);
-    delete(REVIEWER_KIND).to(DeleteReviewer.class);
-    post(REVIEWER_KIND, "delete").to(DeleteReviewer.class);
-    child(REVIEWER_KIND, "votes").to(Votes.class);
-    delete(VOTE_KIND).to(DeleteVote.class);
-    post(VOTE_KIND, "delete").to(DeleteVote.class);
-
-    child(CHANGE_KIND, "revisions").to(Revisions.class);
-    get(REVISION_KIND, "actions").to(GetRevisionActions.class);
-    post(REVISION_KIND, "cherrypick").to(CherryPick.class);
-    get(REVISION_KIND, "commit").to(GetCommit.class);
-    get(REVISION_KIND, "mergeable").to(Mergeable.class);
-    get(REVISION_KIND, "related").to(GetRelated.class);
-    get(REVISION_KIND, "review").to(GetReview.class);
-    post(REVISION_KIND, "review").to(PostReview.class);
-    get(REVISION_KIND, "preview_submit").to(PreviewSubmit.class);
-    post(REVISION_KIND, "submit").to(Submit.class);
-    post(REVISION_KIND, "rebase").to(Rebase.class);
-    put(REVISION_KIND, "description").to(PutDescription.class);
-    get(REVISION_KIND, "description").to(GetDescription.class);
-    get(REVISION_KIND, "patch").to(GetPatch.class);
-    get(REVISION_KIND, "submit_type").to(TestSubmitType.Get.class);
-    post(REVISION_KIND, "test.submit_rule").to(TestSubmitRule.class);
-    post(REVISION_KIND, "test.submit_type").to(TestSubmitType.class);
-    get(REVISION_KIND, "archive").to(GetArchive.class);
-    get(REVISION_KIND, "mergelist").to(GetMergeList.class);
-
-    child(REVISION_KIND, "reviewers").to(RevisionReviewers.class);
-
-    child(REVISION_KIND, "drafts").to(DraftComments.class);
-    put(REVISION_KIND, "drafts").to(CreateDraftComment.class);
-    get(DRAFT_COMMENT_KIND).to(GetDraftComment.class);
-    put(DRAFT_COMMENT_KIND).to(PutDraftComment.class);
-    delete(DRAFT_COMMENT_KIND).to(DeleteDraftComment.class);
-
-    child(REVISION_KIND, "comments").to(Comments.class);
-    get(COMMENT_KIND).to(GetComment.class);
-    delete(COMMENT_KIND).to(DeleteComment.class);
-    post(COMMENT_KIND, "delete").to(DeleteComment.class);
-
-    child(REVISION_KIND, "robotcomments").to(RobotComments.class);
-    get(ROBOT_COMMENT_KIND).to(GetRobotComment.class);
-    child(REVISION_KIND, "fixes").to(Fixes.class);
-    post(FIX_KIND, "apply").to(ApplyFix.class);
-
-    child(REVISION_KIND, "files").to(Files.class);
-    put(FILE_KIND, "reviewed").to(PutReviewed.class);
-    delete(FILE_KIND, "reviewed").to(DeleteReviewed.class);
-    get(FILE_KIND, "content").to(GetContent.class);
-    get(FILE_KIND, "download").to(DownloadContent.class);
-    get(FILE_KIND, "diff").to(GetDiff.class);
-    get(FILE_KIND, "blame").to(GetBlame.class);
-
-    child(CHANGE_KIND, "edit").to(ChangeEdits.class);
-    delete(CHANGE_KIND, "edit").to(DeleteChangeEdit.class);
-    child(CHANGE_KIND, "edit:publish").to(PublishChangeEdit.class);
-    child(CHANGE_KIND, "edit:rebase").to(RebaseChangeEdit.class);
-    put(CHANGE_KIND, "edit:message").to(ChangeEdits.EditMessage.class);
-    get(CHANGE_KIND, "edit:message").to(ChangeEdits.GetMessage.class);
-    put(CHANGE_EDIT_KIND, "/").to(ChangeEdits.Put.class);
-    delete(CHANGE_EDIT_KIND).to(ChangeEdits.DeleteContent.class);
-    get(CHANGE_EDIT_KIND, "/").to(ChangeEdits.Get.class);
-    get(CHANGE_EDIT_KIND, "meta").to(ChangeEdits.GetMeta.class);
-
-    factory(AccountLoader.Factory.class);
-    factory(ChangeEdits.Create.Factory.class);
-    factory(ChangeEdits.DeleteFile.Factory.class);
-    factory(ChangeInserter.Factory.class);
-    factory(ChangeResource.Factory.class);
-    factory(DeleteReviewerByEmailOp.Factory.class);
-    factory(DeleteReviewerOp.Factory.class);
-    factory(EmailReviewComments.Factory.class);
-    factory(PatchSetInserter.Factory.class);
-    factory(PostReviewersOp.Factory.class);
-    factory(RebaseChangeOp.Factory.class);
-    factory(ReviewerResource.Factory.class);
-    factory(SetAssigneeOp.Factory.class);
-    factory(SetHashtagsOp.Factory.class);
-    factory(SetPrivateOp.Factory.class);
-    factory(WorkInProgressOp.Factory.class);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Move.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Move.java
deleted file mode 100644
index 9690af2..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Move.java
+++ /dev/null
@@ -1,299 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.change;
-
-import static com.google.gerrit.extensions.conditions.BooleanCondition.and;
-import static com.google.gerrit.server.permissions.ChangePermission.ABANDON;
-import static com.google.gerrit.server.permissions.RefPermission.CREATE_CHANGE;
-import static com.google.gerrit.server.query.change.ChangeData.asChanges;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.extensions.api.changes.MoveInput;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.webui.UiAction;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Change.Status;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.LabelId;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.ChangeUtil;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.notedb.ChangeUpdate;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.query.change.InternalChangeQuery;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.RetryingRestModifyView;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-@Singleton
-public class Move extends RetryingRestModifyView<ChangeResource, MoveInput, ChangeInfo>
-    implements UiAction<ChangeResource> {
-  private final PermissionBackend permissionBackend;
-  private final Provider<ReviewDb> dbProvider;
-  private final ChangeJson.Factory json;
-  private final GitRepositoryManager repoManager;
-  private final Provider<InternalChangeQuery> queryProvider;
-  private final ChangeMessagesUtil cmUtil;
-  private final PatchSetUtil psUtil;
-  private final ApprovalsUtil approvalsUtil;
-  private final ProjectCache projectCache;
-  private final Provider<CurrentUser> userProvider;
-
-  @Inject
-  Move(
-      PermissionBackend permissionBackend,
-      Provider<ReviewDb> dbProvider,
-      ChangeJson.Factory json,
-      GitRepositoryManager repoManager,
-      Provider<InternalChangeQuery> queryProvider,
-      ChangeMessagesUtil cmUtil,
-      RetryHelper retryHelper,
-      PatchSetUtil psUtil,
-      ApprovalsUtil approvalsUtil,
-      ProjectCache projectCache,
-      Provider<CurrentUser> userProvider) {
-    super(retryHelper);
-    this.permissionBackend = permissionBackend;
-    this.dbProvider = dbProvider;
-    this.json = json;
-    this.repoManager = repoManager;
-    this.queryProvider = queryProvider;
-    this.cmUtil = cmUtil;
-    this.psUtil = psUtil;
-    this.approvalsUtil = approvalsUtil;
-    this.projectCache = projectCache;
-    this.userProvider = userProvider;
-  }
-
-  @Override
-  protected ChangeInfo applyImpl(
-      BatchUpdate.Factory updateFactory, ChangeResource rsrc, MoveInput input)
-      throws RestApiException, OrmException, UpdateException, PermissionBackendException {
-    Change change = rsrc.getChange();
-    Project.NameKey project = rsrc.getProject();
-    IdentifiedUser caller = rsrc.getUser().asIdentifiedUser();
-    if (input.destinationBranch == null) {
-      throw new BadRequestException("destination branch is required");
-    }
-    input.destinationBranch = RefNames.fullName(input.destinationBranch);
-
-    if (change.getStatus().isClosed()) {
-      throw new ResourceConflictException("Change is " + ChangeUtil.status(change));
-    }
-
-    Branch.NameKey newDest = new Branch.NameKey(project, input.destinationBranch);
-    if (change.getDest().equals(newDest)) {
-      throw new ResourceConflictException("Change is already destined for the specified branch");
-    }
-
-    // Move requires abandoning this change, and creating a new change.
-    try {
-      rsrc.permissions().database(dbProvider).check(ABANDON);
-      permissionBackend.user(caller).database(dbProvider).ref(newDest).check(CREATE_CHANGE);
-    } catch (AuthException denied) {
-      throw new AuthException("move not permitted", denied);
-    }
-
-    Op op = new Op(input);
-    try (BatchUpdate u =
-        updateFactory.create(dbProvider.get(), project, caller, TimeUtil.nowTs())) {
-      u.addOp(change.getId(), op);
-      u.execute();
-    }
-    return json.noOptions().format(op.getChange());
-  }
-
-  private class Op implements BatchUpdateOp {
-    private final MoveInput input;
-
-    private Change change;
-    private Branch.NameKey newDestKey;
-
-    Op(MoveInput input) {
-      this.input = input;
-    }
-
-    @Nullable
-    public Change getChange() {
-      return change;
-    }
-
-    @Override
-    public boolean updateChange(ChangeContext ctx)
-        throws OrmException, ResourceConflictException, IOException {
-      change = ctx.getChange();
-      if (change.getStatus() != Status.NEW) {
-        throw new ResourceConflictException("Change is " + ChangeUtil.status(change));
-      }
-
-      Project.NameKey projectKey = change.getProject();
-      newDestKey = new Branch.NameKey(projectKey, input.destinationBranch);
-      Branch.NameKey changePrevDest = change.getDest();
-      if (changePrevDest.equals(newDestKey)) {
-        throw new ResourceConflictException("Change is already destined for the specified branch");
-      }
-
-      final PatchSet.Id patchSetId = change.currentPatchSetId();
-      try (Repository repo = repoManager.openRepository(projectKey);
-          RevWalk revWalk = new RevWalk(repo)) {
-        RevCommit currPatchsetRevCommit =
-            revWalk.parseCommit(
-                ObjectId.fromString(
-                    psUtil.current(ctx.getDb(), ctx.getNotes()).getRevision().get()));
-        if (currPatchsetRevCommit.getParentCount() > 1) {
-          throw new ResourceConflictException("Merge commit cannot be moved");
-        }
-
-        ObjectId refId = repo.resolve(input.destinationBranch);
-        // Check if destination ref exists in project repo
-        if (refId == null) {
-          throw new ResourceConflictException(
-              "Destination " + input.destinationBranch + " not found in the project");
-        }
-        RevCommit refCommit = revWalk.parseCommit(refId);
-        if (revWalk.isMergedInto(currPatchsetRevCommit, refCommit)) {
-          throw new ResourceConflictException(
-              "Current patchset revision is reachable from tip of " + input.destinationBranch);
-        }
-      }
-
-      Change.Key changeKey = change.getKey();
-      if (!asChanges(queryProvider.get().byBranchKey(newDestKey, changeKey)).isEmpty()) {
-        throw new ResourceConflictException(
-            "Destination "
-                + newDestKey.getShortName()
-                + " has a different change with same change key "
-                + changeKey);
-      }
-
-      if (!change.currentPatchSetId().equals(patchSetId)) {
-        throw new ResourceConflictException("Patch set is not current");
-      }
-
-      PatchSet.Id psId = change.currentPatchSetId();
-      ChangeUpdate update = ctx.getUpdate(psId);
-      update.setBranch(newDestKey.get());
-      change.setDest(newDestKey);
-
-      updateApprovals(ctx, update, psId, projectKey);
-
-      StringBuilder msgBuf = new StringBuilder();
-      msgBuf.append("Change destination moved from ");
-      msgBuf.append(changePrevDest.getShortName());
-      msgBuf.append(" to ");
-      msgBuf.append(newDestKey.getShortName());
-      if (!Strings.isNullOrEmpty(input.message)) {
-        msgBuf.append("\n\n");
-        msgBuf.append(input.message);
-      }
-      ChangeMessage cmsg =
-          ChangeMessagesUtil.newMessage(ctx, msgBuf.toString(), ChangeMessagesUtil.TAG_MOVE);
-      cmUtil.addChangeMessage(ctx.getDb(), update, cmsg);
-
-      return true;
-    }
-
-    /**
-     * We have a long discussion about how to deal with its votes after moving a change from one
-     * branch to another. In the end, we think only keeping the veto votes is the best way since
-     * it's simple for us and less confusing for our users. See the discussion in the following
-     * proposal: https://gerrit-review.googlesource.com/c/gerrit/+/129171
-     */
-    private void updateApprovals(
-        ChangeContext ctx, ChangeUpdate update, PatchSet.Id psId, Project.NameKey project)
-        throws IOException, OrmException {
-      List<PatchSetApproval> approvals = new ArrayList<>();
-      for (PatchSetApproval psa :
-          approvalsUtil.byPatchSet(
-              ctx.getDb(),
-              ctx.getNotes(),
-              userProvider.get(),
-              psId,
-              ctx.getRevWalk(),
-              ctx.getRepoView().getConfig())) {
-        ProjectState projectState = projectCache.checkedGet(project);
-        LabelType type =
-            projectState.getLabelTypes(ctx.getNotes(), ctx.getUser()).byLabel(psa.getLabelId());
-        // Only keep veto votes, defined as votes where:
-        // 1- the label function allows minimum values to block submission.
-        // 2- the vote holds the minimum value.
-        if (type == null || (type.isMaxNegative(psa) && type.getFunction().isBlock())) {
-          continue;
-        }
-
-        // Remove votes from NoteDb.
-        update.removeApprovalFor(psa.getAccountId(), psa.getLabel());
-        approvals.add(
-            new PatchSetApproval(
-                new PatchSetApproval.Key(psId, psa.getAccountId(), new LabelId(psa.getLabel())),
-                (short) 0,
-                ctx.getWhen()));
-      }
-      // Remove votes from ReviewDb.
-      ctx.getDb().patchSetApprovals().upsert(approvals);
-    }
-  }
-
-  @Override
-  public UiAction.Description getDescription(ChangeResource rsrc) {
-    Change change = rsrc.getChange();
-    return new UiAction.Description()
-        .setLabel("Move Change")
-        .setTitle("Move change to a different branch")
-        .setVisible(
-            and(
-                change.getStatus().isOpen(),
-                and(
-                    permissionBackend
-                        .user(rsrc.getUser())
-                        .ref(change.getDest())
-                        .testCond(CREATE_CHANGE),
-                    rsrc.permissions().database(dbProvider).testCond(ABANDON))));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PatchSetInserter.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PatchSetInserter.java
deleted file mode 100644
index d298730..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PatchSetInserter.java
+++ /dev/null
@@ -1,353 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.change;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.gerrit.server.notedb.ReviewerStateInternal.CC;
-import static com.google.gerrit.server.notedb.ReviewerStateInternal.REVIEWER;
-
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableListMultimap;
-import com.google.common.collect.ListMultimap;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.api.changes.RecipientType;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetInfo;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ApprovalCopier;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.ChangeUtil;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.ReviewerSet;
-import com.google.gerrit.server.events.CommitReceivedEvent;
-import com.google.gerrit.server.extensions.events.RevisionCreated;
-import com.google.gerrit.server.git.validators.CommitValidationException;
-import com.google.gerrit.server.git.validators.CommitValidators;
-import com.google.gerrit.server.mail.send.ReplacePatchSetSender;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.ChangeUpdate;
-import com.google.gerrit.server.patch.PatchSetInfoFactory;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.ssh.NoSshInfo;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.Context;
-import com.google.gerrit.server.update.RepoContext;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.List;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.transport.ReceiveCommand;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class PatchSetInserter implements BatchUpdateOp {
-  private static final Logger log = LoggerFactory.getLogger(PatchSetInserter.class);
-
-  public interface Factory {
-    PatchSetInserter create(ChangeNotes notes, PatchSet.Id psId, ObjectId commitId);
-  }
-
-  // Injected fields.
-  private final PermissionBackend permissionBackend;
-  private final PatchSetInfoFactory patchSetInfoFactory;
-  private final CommitValidators.Factory commitValidatorsFactory;
-  private final ReplacePatchSetSender.Factory replacePatchSetFactory;
-  private final ProjectCache projectCache;
-  private final RevisionCreated revisionCreated;
-  private final ApprovalsUtil approvalsUtil;
-  private final ApprovalCopier approvalCopier;
-  private final ChangeMessagesUtil cmUtil;
-  private final PatchSetUtil psUtil;
-
-  // Assisted-injected fields.
-  private final PatchSet.Id psId;
-  private final ObjectId commitId;
-  // Read prior to running the batch update, so must only be used during
-  // updateRepo; updateChange and later must use the notes from the
-  // ChangeContext.
-  private final ChangeNotes origNotes;
-
-  // Fields exposed as setters.
-  private String message;
-  private String description;
-  private boolean validate = true;
-  private boolean checkAddPatchSetPermission = true;
-  private List<String> groups = Collections.emptyList();
-  private boolean fireRevisionCreated = true;
-  private NotifyHandling notify = NotifyHandling.ALL;
-  private ListMultimap<RecipientType, Account.Id> accountsToNotify = ImmutableListMultimap.of();
-  private boolean allowClosed;
-  private boolean copyApprovals = true;
-
-  // Fields set during some phase of BatchUpdate.Op.
-  private Change change;
-  private PatchSet patchSet;
-  private PatchSetInfo patchSetInfo;
-  private ChangeMessage changeMessage;
-  private ReviewerSet oldReviewers;
-
-  @Inject
-  public PatchSetInserter(
-      PermissionBackend permissionBackend,
-      ApprovalsUtil approvalsUtil,
-      ApprovalCopier approvalCopier,
-      ChangeMessagesUtil cmUtil,
-      PatchSetInfoFactory patchSetInfoFactory,
-      CommitValidators.Factory commitValidatorsFactory,
-      ReplacePatchSetSender.Factory replacePatchSetFactory,
-      PatchSetUtil psUtil,
-      RevisionCreated revisionCreated,
-      ProjectCache projectCache,
-      @Assisted ChangeNotes notes,
-      @Assisted PatchSet.Id psId,
-      @Assisted ObjectId commitId) {
-    this.permissionBackend = permissionBackend;
-    this.approvalsUtil = approvalsUtil;
-    this.approvalCopier = approvalCopier;
-    this.cmUtil = cmUtil;
-    this.patchSetInfoFactory = patchSetInfoFactory;
-    this.commitValidatorsFactory = commitValidatorsFactory;
-    this.replacePatchSetFactory = replacePatchSetFactory;
-    this.psUtil = psUtil;
-    this.revisionCreated = revisionCreated;
-    this.projectCache = projectCache;
-
-    this.origNotes = notes;
-    this.psId = psId;
-    this.commitId = commitId.copy();
-  }
-
-  public PatchSet.Id getPatchSetId() {
-    return psId;
-  }
-
-  public PatchSetInserter setMessage(String message) {
-    this.message = message;
-    return this;
-  }
-
-  public PatchSetInserter setDescription(String description) {
-    this.description = description;
-    return this;
-  }
-
-  public PatchSetInserter setValidate(boolean validate) {
-    this.validate = validate;
-    return this;
-  }
-
-  public PatchSetInserter setCheckAddPatchSetPermission(boolean checkAddPatchSetPermission) {
-    this.checkAddPatchSetPermission = checkAddPatchSetPermission;
-    return this;
-  }
-
-  public PatchSetInserter setGroups(List<String> groups) {
-    checkNotNull(groups, "groups may not be null");
-    this.groups = groups;
-    return this;
-  }
-
-  public PatchSetInserter setFireRevisionCreated(boolean fireRevisionCreated) {
-    this.fireRevisionCreated = fireRevisionCreated;
-    return this;
-  }
-
-  public PatchSetInserter setNotify(NotifyHandling notify) {
-    this.notify = Preconditions.checkNotNull(notify);
-    return this;
-  }
-
-  public PatchSetInserter setAccountsToNotify(
-      ListMultimap<RecipientType, Account.Id> accountsToNotify) {
-    this.accountsToNotify = checkNotNull(accountsToNotify);
-    return this;
-  }
-
-  public PatchSetInserter setAllowClosed(boolean allowClosed) {
-    this.allowClosed = allowClosed;
-    return this;
-  }
-
-  public PatchSetInserter setCopyApprovals(boolean copyApprovals) {
-    this.copyApprovals = copyApprovals;
-    return this;
-  }
-
-  public Change getChange() {
-    checkState(change != null, "getChange() only valid after executing update");
-    return change;
-  }
-
-  public PatchSet getPatchSet() {
-    checkState(patchSet != null, "getPatchSet() only valid after executing update");
-    return patchSet;
-  }
-
-  @Override
-  public void updateRepo(RepoContext ctx)
-      throws AuthException, ResourceConflictException, IOException, OrmException,
-          PermissionBackendException {
-    validate(ctx);
-    ctx.addRefUpdate(ObjectId.zeroId(), commitId, getPatchSetId().toRefName());
-  }
-
-  @Override
-  public boolean updateChange(ChangeContext ctx)
-      throws ResourceConflictException, OrmException, IOException {
-    ReviewDb db = ctx.getDb();
-
-    change = ctx.getChange();
-    ChangeUpdate update = ctx.getUpdate(psId);
-    update.setSubjectForCommit("Create patch set " + psId.get());
-
-    if (!change.getStatus().isOpen() && !allowClosed) {
-      throw new ResourceConflictException(
-          String.format(
-              "Cannot create new patch set of change %s because it is %s",
-              change.getId(), ChangeUtil.status(change)));
-    }
-
-    List<String> newGroups = groups;
-    if (newGroups.isEmpty()) {
-      PatchSet prevPs = psUtil.current(db, ctx.getNotes());
-      if (prevPs != null) {
-        newGroups = prevPs.getGroups();
-      }
-    }
-    patchSet =
-        psUtil.insert(
-            db,
-            ctx.getRevWalk(),
-            ctx.getUpdate(psId),
-            psId,
-            commitId,
-            newGroups,
-            null,
-            description);
-
-    if (notify != NotifyHandling.NONE) {
-      oldReviewers = approvalsUtil.getReviewers(db, ctx.getNotes());
-    }
-
-    if (message != null) {
-      changeMessage =
-          ChangeMessagesUtil.newMessage(
-              patchSet.getId(),
-              ctx.getUser(),
-              ctx.getWhen(),
-              message,
-              ChangeMessagesUtil.uploadedPatchSetTag(change.isWorkInProgress()));
-      changeMessage.setMessage(message);
-    }
-
-    patchSetInfo =
-        patchSetInfoFactory.get(ctx.getRevWalk(), ctx.getRevWalk().parseCommit(commitId), psId);
-    if (!allowClosed) {
-      change.setStatus(Change.Status.NEW);
-    }
-    change.setCurrentPatchSet(patchSetInfo);
-    if (copyApprovals) {
-      approvalCopier.copyInReviewDb(
-          db,
-          ctx.getNotes(),
-          ctx.getUser(),
-          patchSet,
-          ctx.getRevWalk(),
-          ctx.getRepoView().getConfig());
-    }
-    if (changeMessage != null) {
-      cmUtil.addChangeMessage(db, update, changeMessage);
-    }
-    return true;
-  }
-
-  @Override
-  public void postUpdate(Context ctx) throws OrmException {
-    if (notify != NotifyHandling.NONE || !accountsToNotify.isEmpty()) {
-      try {
-        ReplacePatchSetSender cm = replacePatchSetFactory.create(ctx.getProject(), change.getId());
-        cm.setFrom(ctx.getAccountId());
-        cm.setPatchSet(patchSet, patchSetInfo);
-        cm.setChangeMessage(changeMessage.getMessage(), ctx.getWhen());
-        cm.addReviewers(oldReviewers.byState(REVIEWER));
-        cm.addExtraCC(oldReviewers.byState(CC));
-        cm.setNotify(notify);
-        cm.setAccountsToNotify(accountsToNotify);
-        cm.send();
-      } catch (Exception err) {
-        log.error("Cannot send email for new patch set on change " + change.getId(), err);
-      }
-    }
-
-    if (fireRevisionCreated) {
-      revisionCreated.fire(change, patchSet, ctx.getAccount(), ctx.getWhen(), notify);
-    }
-  }
-
-  private void validate(RepoContext ctx)
-      throws AuthException, ResourceConflictException, IOException, PermissionBackendException {
-    if (checkAddPatchSetPermission) {
-      permissionBackend
-          .user(ctx.getUser())
-          .database(ctx.getDb())
-          .change(origNotes)
-          .check(ChangePermission.ADD_PATCH_SET);
-    }
-    if (!validate) {
-      return;
-    }
-
-    PermissionBackend.ForRef perm =
-        permissionBackend.user(ctx.getUser()).ref(origNotes.getChange().getDest());
-
-    String refName = getPatchSetId().toRefName();
-    try (CommitReceivedEvent event =
-        new CommitReceivedEvent(
-            new ReceiveCommand(
-                ObjectId.zeroId(),
-                commitId,
-                refName.substring(0, refName.lastIndexOf('/') + 1) + "new"),
-            projectCache.checkedGet(origNotes.getProjectName()).getProject(),
-            origNotes.getChange().getDest().get(),
-            ctx.getRevWalk().getObjectReader(),
-            commitId,
-            ctx.getIdentifiedUser())) {
-      commitValidatorsFactory
-          .forGerritCommits(
-              perm,
-              origNotes.getChange().getDest(),
-              ctx.getIdentifiedUser(),
-              new NoSshInfo(),
-              ctx.getRevWalk())
-          .validate(event);
-    } catch (CommitValidationException e) {
-      throw new ResourceConflictException(e.getFullMessage());
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PostHashtags.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PostHashtags.java
deleted file mode 100644
index 1ff0fdd..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PostHashtags.java
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.change;
-
-import com.google.common.collect.ImmutableSortedSet;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.api.changes.HashtagsInput;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.webui.UiAction;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.RetryingRestModifyView;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-
-@Singleton
-public class PostHashtags
-    extends RetryingRestModifyView<
-        ChangeResource, HashtagsInput, Response<ImmutableSortedSet<String>>>
-    implements UiAction<ChangeResource> {
-  private final Provider<ReviewDb> db;
-  private final SetHashtagsOp.Factory hashtagsFactory;
-
-  @Inject
-  PostHashtags(
-      Provider<ReviewDb> db, RetryHelper retryHelper, SetHashtagsOp.Factory hashtagsFactory) {
-    super(retryHelper);
-    this.db = db;
-    this.hashtagsFactory = hashtagsFactory;
-  }
-
-  @Override
-  protected Response<ImmutableSortedSet<String>> applyImpl(
-      BatchUpdate.Factory updateFactory, ChangeResource req, HashtagsInput input)
-      throws RestApiException, UpdateException, PermissionBackendException {
-    req.permissions().check(ChangePermission.EDIT_HASHTAGS);
-
-    try (BatchUpdate bu =
-        updateFactory.create(
-            db.get(), req.getChange().getProject(), req.getUser(), TimeUtil.nowTs())) {
-      SetHashtagsOp op = hashtagsFactory.create(input);
-      bu.addOp(req.getId(), op);
-      bu.execute();
-      return Response.<ImmutableSortedSet<String>>ok(op.getUpdatedHashtags());
-    }
-  }
-
-  @Override
-  public UiAction.Description getDescription(ChangeResource rsrc) {
-    return new UiAction.Description()
-        .setLabel("Edit Hashtags")
-        .setVisible(rsrc.permissions().testCond(ChangePermission.EDIT_HASHTAGS));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PostPrivate.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PostPrivate.java
deleted file mode 100644
index a084d9e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PostPrivate.java
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.change;
-
-import static com.google.gerrit.extensions.conditions.BooleanCondition.and;
-import static com.google.gerrit.extensions.conditions.BooleanCondition.or;
-
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.conditions.BooleanCondition;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.webui.UiAction;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.RetryingRestModifyView;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import org.eclipse.jgit.lib.Config;
-
-@Singleton
-public class PostPrivate
-    extends RetryingRestModifyView<ChangeResource, SetPrivateOp.Input, Response<String>>
-    implements UiAction<ChangeResource> {
-  private final ChangeMessagesUtil cmUtil;
-  private final Provider<ReviewDb> dbProvider;
-  private final PermissionBackend permissionBackend;
-  private final SetPrivateOp.Factory setPrivateOpFactory;
-  private final boolean disablePrivateChanges;
-
-  @Inject
-  PostPrivate(
-      Provider<ReviewDb> dbProvider,
-      RetryHelper retryHelper,
-      ChangeMessagesUtil cmUtil,
-      PermissionBackend permissionBackend,
-      SetPrivateOp.Factory setPrivateOpFactory,
-      @GerritServerConfig Config config) {
-    super(retryHelper);
-    this.dbProvider = dbProvider;
-    this.cmUtil = cmUtil;
-    this.permissionBackend = permissionBackend;
-    this.setPrivateOpFactory = setPrivateOpFactory;
-    this.disablePrivateChanges = config.getBoolean("change", null, "disablePrivateChanges", false);
-  }
-
-  @Override
-  public Response<String> applyImpl(
-      BatchUpdate.Factory updateFactory, ChangeResource rsrc, SetPrivateOp.Input input)
-      throws RestApiException, UpdateException {
-    if (disablePrivateChanges) {
-      throw new MethodNotAllowedException("private changes are disabled");
-    }
-
-    if (!canSetPrivate(rsrc).value()) {
-      throw new AuthException("not allowed to mark private");
-    }
-
-    if (rsrc.getChange().isPrivate()) {
-      return Response.ok("");
-    }
-
-    SetPrivateOp op = setPrivateOpFactory.create(cmUtil, true, input);
-    try (BatchUpdate u =
-        updateFactory.create(
-            dbProvider.get(), rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
-      u.addOp(rsrc.getId(), op).execute();
-    }
-
-    return Response.created("");
-  }
-
-  @Override
-  public Description getDescription(ChangeResource rsrc) {
-    Change change = rsrc.getChange();
-    return new UiAction.Description()
-        .setLabel("Mark private")
-        .setTitle("Mark change as private")
-        .setVisible(and(!disablePrivateChanges && !change.isPrivate(), canSetPrivate(rsrc)));
-  }
-
-  private BooleanCondition canSetPrivate(ChangeResource rsrc) {
-    PermissionBackend.WithUser user = permissionBackend.user(rsrc.getUser());
-    return or(
-        rsrc.isUserOwner() && rsrc.getChange().getStatus() != Change.Status.MERGED,
-        user.testCond(GlobalPermission.ADMINISTRATE_SERVER));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReview.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReview.java
deleted file mode 100644
index c5e72e5..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReview.java
+++ /dev/null
@@ -1,1384 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.change;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.gerrit.server.CommentsUtil.setCommentRevId;
-import static com.google.gerrit.server.notedb.ReviewerStateInternal.REVIEWER;
-import static com.google.gerrit.server.permissions.LabelPermission.ForUser.ON_BEHALF_OF;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.stream.Collectors.groupingBy;
-import static java.util.stream.Collectors.joining;
-import static java.util.stream.Collectors.toList;
-import static java.util.stream.Collectors.toSet;
-import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Strings;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Ordering;
-import com.google.common.hash.HashCode;
-import com.google.common.hash.Hashing;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.LabelTypes;
-import com.google.gerrit.extensions.api.changes.AddReviewerInput;
-import com.google.gerrit.extensions.api.changes.AddReviewerResult;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.api.changes.RecipientType;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.api.changes.ReviewInput.CommentInput;
-import com.google.gerrit.extensions.api.changes.ReviewInput.DraftHandling;
-import com.google.gerrit.extensions.api.changes.ReviewInput.RobotCommentInput;
-import com.google.gerrit.extensions.api.changes.ReviewResult;
-import com.google.gerrit.extensions.api.changes.ReviewerInfo;
-import com.google.gerrit.extensions.client.Comment.Range;
-import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
-import com.google.gerrit.extensions.client.ReviewerState;
-import com.google.gerrit.extensions.client.Side;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.FixReplacementInfo;
-import com.google.gerrit.extensions.common.FixSuggestionInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.extensions.restapi.Url;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.FixReplacement;
-import com.google.gerrit.reviewdb.client.FixSuggestion;
-import com.google.gerrit.reviewdb.client.LabelId;
-import com.google.gerrit.reviewdb.client.Patch;
-import com.google.gerrit.reviewdb.client.PatchLineComment.Status;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.client.RobotComment;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.ChangeUtil;
-import com.google.gerrit.server.CommentsUtil;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.OutputFormat;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.ReviewerSet;
-import com.google.gerrit.server.account.AccountsCollection;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.extensions.events.CommentAdded;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.ChangeUpdate;
-import com.google.gerrit.server.notedb.NotesMigration;
-import com.google.gerrit.server.patch.DiffSummary;
-import com.google.gerrit.server.patch.DiffSummaryKey;
-import com.google.gerrit.server.patch.PatchListCache;
-import com.google.gerrit.server.patch.PatchListKey;
-import com.google.gerrit.server.patch.PatchListNotAvailableException;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.LabelPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.Context;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.RetryingRestModifyView;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gerrit.server.util.LabelVote;
-import com.google.gson.Gson;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.OptionalInt;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-
-@Singleton
-public class PostReview
-    extends RetryingRestModifyView<RevisionResource, ReviewInput, Response<ReviewResult>> {
-  public static final String ERROR_ADDING_REVIEWER = "error adding reviewer";
-  public static final String ERROR_WIP_READY_MUTUALLY_EXCLUSIVE =
-      "work_in_progress and ready are mutually exclusive";
-
-  public static final String START_REVIEW_MESSAGE = "This change is ready for review.";
-
-  private static final Gson GSON = OutputFormat.JSON_COMPACT.newGson();
-  private static final int DEFAULT_ROBOT_COMMENT_SIZE_LIMIT_IN_BYTES = 1024 * 1024;
-
-  private final Provider<ReviewDb> db;
-  private final ChangeResource.Factory changeResourceFactory;
-  private final ChangeData.Factory changeDataFactory;
-  private final ApprovalsUtil approvalsUtil;
-  private final ChangeMessagesUtil cmUtil;
-  private final CommentsUtil commentsUtil;
-  private final PatchSetUtil psUtil;
-  private final PatchListCache patchListCache;
-  private final AccountsCollection accounts;
-  private final EmailReviewComments.Factory email;
-  private final CommentAdded commentAdded;
-  private final PostReviewers postReviewers;
-  private final NotesMigration migration;
-  private final NotifyUtil notifyUtil;
-  private final Config gerritConfig;
-  private final WorkInProgressOp.Factory workInProgressOpFactory;
-  private final ProjectCache projectCache;
-  private final PermissionBackend permissionBackend;
-  private final ProjectControl.GenericFactory projectControlFactory;
-  private final boolean strictLabels;
-
-  @Inject
-  PostReview(
-      Provider<ReviewDb> db,
-      RetryHelper retryHelper,
-      ChangeResource.Factory changeResourceFactory,
-      ChangeData.Factory changeDataFactory,
-      ApprovalsUtil approvalsUtil,
-      ChangeMessagesUtil cmUtil,
-      CommentsUtil commentsUtil,
-      PatchSetUtil psUtil,
-      PatchListCache patchListCache,
-      AccountsCollection accounts,
-      EmailReviewComments.Factory email,
-      CommentAdded commentAdded,
-      PostReviewers postReviewers,
-      NotesMigration migration,
-      NotifyUtil notifyUtil,
-      @GerritServerConfig Config gerritConfig,
-      WorkInProgressOp.Factory workInProgressOpFactory,
-      ProjectCache projectCache,
-      PermissionBackend permissionBackend,
-      ProjectControl.GenericFactory projectControlFactory) {
-    super(retryHelper);
-    this.db = db;
-    this.changeResourceFactory = changeResourceFactory;
-    this.changeDataFactory = changeDataFactory;
-    this.commentsUtil = commentsUtil;
-    this.psUtil = psUtil;
-    this.patchListCache = patchListCache;
-    this.approvalsUtil = approvalsUtil;
-    this.cmUtil = cmUtil;
-    this.accounts = accounts;
-    this.email = email;
-    this.commentAdded = commentAdded;
-    this.postReviewers = postReviewers;
-    this.migration = migration;
-    this.notifyUtil = notifyUtil;
-    this.gerritConfig = gerritConfig;
-    this.workInProgressOpFactory = workInProgressOpFactory;
-    this.projectCache = projectCache;
-    this.permissionBackend = permissionBackend;
-    this.projectControlFactory = projectControlFactory;
-    this.strictLabels = gerritConfig.getBoolean("change", "strictLabels", false);
-  }
-
-  @Override
-  protected Response<ReviewResult> applyImpl(
-      BatchUpdate.Factory updateFactory, RevisionResource revision, ReviewInput input)
-      throws RestApiException, UpdateException, OrmException, IOException,
-          PermissionBackendException, ConfigInvalidException, PatchListNotAvailableException,
-          NoSuchProjectException {
-    return apply(updateFactory, revision, input, TimeUtil.nowTs());
-  }
-
-  public Response<ReviewResult> apply(
-      BatchUpdate.Factory updateFactory, RevisionResource revision, ReviewInput input, Timestamp ts)
-      throws RestApiException, UpdateException, OrmException, IOException,
-          PermissionBackendException, ConfigInvalidException, PatchListNotAvailableException,
-          NoSuchProjectException {
-    // Respect timestamp, but truncate at change created-on time.
-    ts = Ordering.natural().max(ts, revision.getChange().getCreatedOn());
-    if (revision.getEdit().isPresent()) {
-      throw new ResourceConflictException("cannot post review on edit");
-    }
-    ProjectState projectState = projectCache.checkedGet(revision.getProject());
-    LabelTypes labelTypes = projectState.getLabelTypes(revision.getNotes(), revision.getUser());
-    if (input.onBehalfOf != null) {
-      revision = onBehalfOf(revision, labelTypes, input);
-    } else if (input.drafts == null) {
-      input.drafts = DraftHandling.DELETE;
-    }
-    if (input.labels != null) {
-      checkLabels(revision, labelTypes, input.labels);
-    }
-    if (input.comments != null) {
-      cleanUpComments(input.comments);
-      checkComments(revision, input.comments);
-    }
-    if (input.robotComments != null) {
-      if (!migration.readChanges()) {
-        throw new MethodNotAllowedException("robot comments not supported");
-      }
-      checkRobotComments(revision, input.robotComments);
-    }
-
-    NotifyHandling reviewerNotify = input.notify;
-    if (input.notify == null) {
-      input.notify = defaultNotify(revision.getChange(), input);
-    }
-
-    ListMultimap<RecipientType, Account.Id> accountsToNotify =
-        notifyUtil.resolveAccounts(input.notifyDetails);
-
-    Map<String, AddReviewerResult> reviewerJsonResults = null;
-    List<PostReviewers.Addition> reviewerResults = Lists.newArrayList();
-    boolean hasError = false;
-    boolean confirm = false;
-    if (input.reviewers != null) {
-      reviewerJsonResults = Maps.newHashMap();
-      for (AddReviewerInput reviewerInput : input.reviewers) {
-        // Prevent notifications because setting reviewers is batched.
-        reviewerInput.notify = NotifyHandling.NONE;
-
-        PostReviewers.Addition result =
-            postReviewers.prepareApplication(revision.getChangeResource(), reviewerInput, true);
-        reviewerJsonResults.put(reviewerInput.reviewer, result.result);
-        if (result.result.error != null) {
-          hasError = true;
-          continue;
-        }
-        if (result.result.confirm != null) {
-          confirm = true;
-          continue;
-        }
-        reviewerResults.add(result);
-      }
-    }
-
-    ReviewResult output = new ReviewResult();
-    output.reviewers = reviewerJsonResults;
-    if (hasError || confirm) {
-      output.error = ERROR_ADDING_REVIEWER;
-      return Response.withStatusCode(SC_BAD_REQUEST, output);
-    }
-    output.labels = input.labels;
-
-    try (BatchUpdate bu =
-        updateFactory.create(db.get(), revision.getChange().getProject(), revision.getUser(), ts)) {
-      Account.Id id = revision.getUser().getAccountId();
-      boolean ccOrReviewer = false;
-      if (input.labels != null && !input.labels.isEmpty()) {
-        ccOrReviewer = input.labels.values().stream().filter(v -> v != 0).findFirst().isPresent();
-      }
-
-      if (!ccOrReviewer) {
-        // Check if user was already CCed or reviewing prior to this review.
-        ReviewerSet currentReviewers =
-            approvalsUtil.getReviewers(db.get(), revision.getChangeResource().getNotes());
-        ccOrReviewer = currentReviewers.all().contains(id);
-      }
-
-      // Apply reviewer changes first. Revision emails should be sent to the
-      // updated set of reviewers. Also keep track of whether the user added
-      // themselves as a reviewer or to the CC list.
-      for (PostReviewers.Addition reviewerResult : reviewerResults) {
-        bu.addOp(revision.getChange().getId(), reviewerResult.op);
-        if (!ccOrReviewer && reviewerResult.result.reviewers != null) {
-          for (ReviewerInfo reviewerInfo : reviewerResult.result.reviewers) {
-            if (Objects.equals(id.get(), reviewerInfo._accountId)) {
-              ccOrReviewer = true;
-              break;
-            }
-          }
-        }
-        if (!ccOrReviewer && reviewerResult.result.ccs != null) {
-          for (AccountInfo accountInfo : reviewerResult.result.ccs) {
-            if (Objects.equals(id.get(), accountInfo._accountId)) {
-              ccOrReviewer = true;
-              break;
-            }
-          }
-        }
-      }
-
-      if (!ccOrReviewer) {
-        // User posting this review isn't currently in the reviewer or CC list,
-        // isn't being explicitly added, and isn't voting on any label.
-        // Automatically CC them on this change so they receive replies.
-        PostReviewers.Addition selfAddition =
-            postReviewers.ccCurrentUser(revision.getUser(), revision);
-        bu.addOp(revision.getChange().getId(), selfAddition.op);
-      }
-
-      // Add WorkInProgressOp if requested.
-      if (input.ready || input.workInProgress) {
-        if (input.ready && input.workInProgress) {
-          output.error = ERROR_WIP_READY_MUTUALLY_EXCLUSIVE;
-          return Response.withStatusCode(SC_BAD_REQUEST, output);
-        }
-
-        WorkInProgressOp.checkPermissions(
-            permissionBackend,
-            revision.getUser(),
-            revision.getChange(),
-            projectControlFactory.controlFor(revision.getProject(), revision.getUser()));
-
-        if (input.ready) {
-          output.ready = true;
-        }
-
-        // Suppress notifications in WorkInProgressOp, we'll take care of
-        // them in this endpoint.
-        WorkInProgressOp.Input wipIn = new WorkInProgressOp.Input();
-        wipIn.notify = NotifyHandling.NONE;
-        bu.addOp(
-            revision.getChange().getId(),
-            workInProgressOpFactory.create(input.workInProgress, wipIn));
-      }
-
-      // Add the review op.
-      bu.addOp(
-          revision.getChange().getId(),
-          new Op(projectState, revision.getPatchSet().getId(), input, accountsToNotify));
-
-      bu.execute();
-
-      for (PostReviewers.Addition reviewerResult : reviewerResults) {
-        reviewerResult.gatherResults();
-      }
-
-      emailReviewers(revision.getChange(), reviewerResults, reviewerNotify, accountsToNotify);
-    }
-
-    return Response.ok(output);
-  }
-
-  private NotifyHandling defaultNotify(Change c, ReviewInput in) {
-    boolean workInProgress = c.isWorkInProgress();
-    if (in.workInProgress) {
-      workInProgress = true;
-    }
-    if (in.ready) {
-      workInProgress = false;
-    }
-
-    if (ChangeMessagesUtil.isAutogenerated(in.tag)) {
-      // Autogenerated comments default to lower notify levels.
-      return workInProgress ? NotifyHandling.OWNER : NotifyHandling.OWNER_REVIEWERS;
-    }
-
-    if (workInProgress && !c.hasReviewStarted()) {
-      // If review hasn't started we want to minimize recipients, no matter who
-      // the author is.
-      return NotifyHandling.OWNER;
-    }
-
-    return NotifyHandling.ALL;
-  }
-
-  private void emailReviewers(
-      Change change,
-      List<PostReviewers.Addition> reviewerAdditions,
-      @Nullable NotifyHandling notify,
-      ListMultimap<RecipientType, Account.Id> accountsToNotify) {
-    List<Account.Id> to = new ArrayList<>();
-    List<Account.Id> cc = new ArrayList<>();
-    List<Address> toByEmail = new ArrayList<>();
-    List<Address> ccByEmail = new ArrayList<>();
-    for (PostReviewers.Addition addition : reviewerAdditions) {
-      if (addition.state == ReviewerState.REVIEWER) {
-        to.addAll(addition.reviewers);
-        toByEmail.addAll(addition.reviewersByEmail);
-      } else if (addition.state == ReviewerState.CC) {
-        cc.addAll(addition.reviewers);
-        ccByEmail.addAll(addition.reviewersByEmail);
-      }
-    }
-    if (reviewerAdditions.size() > 0) {
-      reviewerAdditions
-          .get(0)
-          .op
-          .emailReviewers(change, to, cc, toByEmail, ccByEmail, notify, accountsToNotify);
-    }
-  }
-
-  private RevisionResource onBehalfOf(RevisionResource rev, LabelTypes labelTypes, ReviewInput in)
-      throws BadRequestException, AuthException, UnprocessableEntityException, OrmException,
-          PermissionBackendException, IOException, ConfigInvalidException {
-    if (in.labels == null || in.labels.isEmpty()) {
-      throw new AuthException(
-          String.format("label required to post review on behalf of \"%s\"", in.onBehalfOf));
-    }
-    if (in.drafts == null) {
-      in.drafts = DraftHandling.KEEP;
-    }
-    if (in.drafts != DraftHandling.KEEP) {
-      throw new AuthException("not allowed to modify other user's drafts");
-    }
-
-    CurrentUser caller = rev.getUser();
-    PermissionBackend.ForChange perm = rev.permissions().database(db);
-    Iterator<Map.Entry<String, Short>> itr = in.labels.entrySet().iterator();
-    while (itr.hasNext()) {
-      Map.Entry<String, Short> ent = itr.next();
-      LabelType type = labelTypes.byLabel(ent.getKey());
-      if (type == null) {
-        if (strictLabels) {
-          throw new BadRequestException(
-              String.format("label \"%s\" is not a configured label", ent.getKey()));
-        }
-        itr.remove();
-        continue;
-      }
-
-      if (!caller.isInternalUser()) {
-        try {
-          perm.check(new LabelPermission.WithValue(ON_BEHALF_OF, type, ent.getValue()));
-        } catch (AuthException e) {
-          throw new AuthException(
-              String.format(
-                  "not permitted to modify label \"%s\" on behalf of \"%s\"",
-                  type.getName(), in.onBehalfOf));
-        }
-      }
-    }
-    if (in.labels.isEmpty()) {
-      throw new AuthException(
-          String.format("label required to post review on behalf of \"%s\"", in.onBehalfOf));
-    }
-
-    IdentifiedUser reviewer = accounts.parseOnBehalfOf(caller, in.onBehalfOf);
-    try {
-      perm.user(reviewer).check(ChangePermission.READ);
-    } catch (AuthException e) {
-      throw new UnprocessableEntityException(
-          String.format("on_behalf_of account %s cannot see change", reviewer.getAccountId()));
-    }
-
-    return new RevisionResource(
-        changeResourceFactory.create(rev.getNotes(), reviewer), rev.getPatchSet());
-  }
-
-  private void checkLabels(RevisionResource rsrc, LabelTypes labelTypes, Map<String, Short> labels)
-      throws BadRequestException, AuthException, PermissionBackendException {
-    PermissionBackend.ForChange perm = rsrc.permissions();
-    Iterator<Map.Entry<String, Short>> itr = labels.entrySet().iterator();
-    while (itr.hasNext()) {
-      Map.Entry<String, Short> ent = itr.next();
-      LabelType lt = labelTypes.byLabel(ent.getKey());
-      if (lt == null) {
-        if (strictLabels) {
-          throw new BadRequestException(
-              String.format("label \"%s\" is not a configured label", ent.getKey()));
-        }
-        itr.remove();
-        continue;
-      }
-
-      if (ent.getValue() == null || ent.getValue() == 0) {
-        // Always permit 0, even if it is not within range.
-        // Later null/0 will be deleted and revoke the label.
-        continue;
-      }
-
-      if (lt.getValue(ent.getValue()) == null) {
-        if (strictLabels) {
-          throw new BadRequestException(
-              String.format("label \"%s\": %d is not a valid value", ent.getKey(), ent.getValue()));
-        }
-        itr.remove();
-        continue;
-      }
-
-      short val = ent.getValue();
-      try {
-        perm.check(new LabelPermission.WithValue(lt, val));
-      } catch (AuthException e) {
-        throw new AuthException(
-            String.format("Applying label \"%s\": %d is restricted", lt.getName(), val));
-      }
-    }
-  }
-
-  private static <T extends CommentInput> void cleanUpComments(
-      Map<String, List<T>> commentsPerPath) {
-    Iterator<List<T>> mapValueIterator = commentsPerPath.values().iterator();
-    while (mapValueIterator.hasNext()) {
-      List<T> comments = mapValueIterator.next();
-      if (comments == null) {
-        mapValueIterator.remove();
-        continue;
-      }
-
-      cleanUpComments(comments);
-      if (comments.isEmpty()) {
-        mapValueIterator.remove();
-      }
-    }
-  }
-
-  private static <T extends CommentInput> void cleanUpComments(List<T> comments) {
-    Iterator<T> commentsIterator = comments.iterator();
-    while (commentsIterator.hasNext()) {
-      T comment = commentsIterator.next();
-      if (comment == null) {
-        commentsIterator.remove();
-        continue;
-      }
-
-      comment.message = Strings.nullToEmpty(comment.message).trim();
-      if (comment.message.isEmpty()) {
-        commentsIterator.remove();
-      }
-    }
-  }
-
-  private <T extends CommentInput> void checkComments(
-      RevisionResource revision, Map<String, List<T>> commentsPerPath)
-      throws BadRequestException, PatchListNotAvailableException {
-    Set<String> revisionFilePaths = getAffectedFilePaths(revision);
-    for (Map.Entry<String, List<T>> entry : commentsPerPath.entrySet()) {
-      String path = entry.getKey();
-      PatchSet.Id patchSetId = revision.getPatchSet().getId();
-      ensurePathRefersToAvailableOrMagicFile(path, revisionFilePaths, patchSetId);
-
-      List<T> comments = entry.getValue();
-      for (T comment : comments) {
-        ensureLineIsNonNegative(comment.line, path);
-        ensureCommentNotOnMagicFilesOfAutoMerge(path, comment);
-        ensureRangeIsValid(path, comment.range);
-      }
-    }
-  }
-
-  private Set<String> getAffectedFilePaths(RevisionResource revision)
-      throws PatchListNotAvailableException {
-    ObjectId newId = ObjectId.fromString(revision.getPatchSet().getRevision().get());
-    DiffSummaryKey key =
-        DiffSummaryKey.fromPatchListKey(
-            PatchListKey.againstDefaultBase(newId, Whitespace.IGNORE_NONE));
-    DiffSummary ds = patchListCache.getDiffSummary(key, revision.getProject());
-    return new HashSet<>(ds.getPaths());
-  }
-
-  private static void ensurePathRefersToAvailableOrMagicFile(
-      String path, Set<String> availableFilePaths, PatchSet.Id patchSetId)
-      throws BadRequestException {
-    if (!availableFilePaths.contains(path) && !Patch.isMagic(path)) {
-      throw new BadRequestException(
-          String.format("file %s not found in revision %s", path, patchSetId));
-    }
-  }
-
-  private static void ensureLineIsNonNegative(Integer line, String path)
-      throws BadRequestException {
-    if (line != null && line < 0) {
-      throw new BadRequestException(
-          String.format("negative line number %d not allowed on %s", line, path));
-    }
-  }
-
-  private static <T extends CommentInput> void ensureCommentNotOnMagicFilesOfAutoMerge(
-      String path, T comment) throws BadRequestException {
-    if (Patch.isMagic(path) && comment.side == Side.PARENT && comment.parent == null) {
-      throw new BadRequestException(String.format("cannot comment on %s on auto-merge", path));
-    }
-  }
-
-  private void checkRobotComments(
-      RevisionResource revision, Map<String, List<RobotCommentInput>> in)
-      throws BadRequestException, PatchListNotAvailableException {
-    cleanUpComments(in);
-    for (Map.Entry<String, List<RobotCommentInput>> e : in.entrySet()) {
-      String commentPath = e.getKey();
-      for (RobotCommentInput c : e.getValue()) {
-        ensureSizeOfJsonInputIsWithinBounds(c);
-        ensureRobotIdIsSet(c.robotId, commentPath);
-        ensureRobotRunIdIsSet(c.robotRunId, commentPath);
-        ensureFixSuggestionsAreAddable(c.fixSuggestions, commentPath);
-      }
-    }
-    checkComments(revision, in);
-  }
-
-  private void ensureSizeOfJsonInputIsWithinBounds(RobotCommentInput robotCommentInput)
-      throws BadRequestException {
-    OptionalInt robotCommentSizeLimit = getRobotCommentSizeLimit();
-    if (robotCommentSizeLimit.isPresent()) {
-      int sizeLimit = robotCommentSizeLimit.getAsInt();
-      byte[] robotCommentBytes = GSON.toJson(robotCommentInput).getBytes(StandardCharsets.UTF_8);
-      int robotCommentSize = robotCommentBytes.length;
-      if (robotCommentSize > sizeLimit) {
-        throw new BadRequestException(
-            String.format(
-                "Size %d (bytes) of robot comment is greater than limit %d (bytes)",
-                robotCommentSize, sizeLimit));
-      }
-    }
-  }
-
-  private OptionalInt getRobotCommentSizeLimit() {
-    int robotCommentSizeLimit =
-        gerritConfig.getInt(
-            "change", "robotCommentSizeLimit", DEFAULT_ROBOT_COMMENT_SIZE_LIMIT_IN_BYTES);
-    if (robotCommentSizeLimit <= 0) {
-      return OptionalInt.empty();
-    }
-    return OptionalInt.of(robotCommentSizeLimit);
-  }
-
-  private static void ensureRobotIdIsSet(String robotId, String commentPath)
-      throws BadRequestException {
-    if (robotId == null) {
-      throw new BadRequestException(
-          String.format("robotId is missing for robot comment on %s", commentPath));
-    }
-  }
-
-  private static void ensureRobotRunIdIsSet(String robotRunId, String commentPath)
-      throws BadRequestException {
-    if (robotRunId == null) {
-      throw new BadRequestException(
-          String.format("robotRunId is missing for robot comment on %s", commentPath));
-    }
-  }
-
-  private static void ensureFixSuggestionsAreAddable(
-      List<FixSuggestionInfo> fixSuggestionInfos, String commentPath) throws BadRequestException {
-    if (fixSuggestionInfos == null) {
-      return;
-    }
-
-    for (FixSuggestionInfo fixSuggestionInfo : fixSuggestionInfos) {
-      ensureDescriptionIsSet(commentPath, fixSuggestionInfo.description);
-      ensureFixReplacementsAreAddable(commentPath, fixSuggestionInfo.replacements);
-    }
-  }
-
-  private static void ensureDescriptionIsSet(String commentPath, String description)
-      throws BadRequestException {
-    if (description == null) {
-      throw new BadRequestException(
-          String.format(
-              "A description is required for the suggested fix of the robot comment on %s",
-              commentPath));
-    }
-  }
-
-  private static void ensureFixReplacementsAreAddable(
-      String commentPath, List<FixReplacementInfo> fixReplacementInfos) throws BadRequestException {
-    ensureReplacementsArePresent(commentPath, fixReplacementInfos);
-
-    for (FixReplacementInfo fixReplacementInfo : fixReplacementInfos) {
-      ensureReplacementPathIsSet(commentPath, fixReplacementInfo.path);
-      ensureRangeIsSet(commentPath, fixReplacementInfo.range);
-      ensureRangeIsValid(commentPath, fixReplacementInfo.range);
-      ensureReplacementStringIsSet(commentPath, fixReplacementInfo.replacement);
-    }
-
-    Map<String, List<FixReplacementInfo>> replacementsPerFilePath =
-        fixReplacementInfos.stream().collect(groupingBy(fixReplacement -> fixReplacement.path));
-    for (List<FixReplacementInfo> sameFileReplacements : replacementsPerFilePath.values()) {
-      ensureRangesDoNotOverlap(commentPath, sameFileReplacements);
-    }
-  }
-
-  private static void ensureReplacementsArePresent(
-      String commentPath, List<FixReplacementInfo> fixReplacementInfos) throws BadRequestException {
-    if (fixReplacementInfos == null || fixReplacementInfos.isEmpty()) {
-      throw new BadRequestException(
-          String.format(
-              "At least one replacement is "
-                  + "required for the suggested fix of the robot comment on %s",
-              commentPath));
-    }
-  }
-
-  private static void ensureReplacementPathIsSet(String commentPath, String replacementPath)
-      throws BadRequestException {
-    if (replacementPath == null) {
-      throw new BadRequestException(
-          String.format(
-              "A file path must be given for the replacement of the robot comment on %s",
-              commentPath));
-    }
-  }
-
-  private static void ensureRangeIsSet(String commentPath, Range range) throws BadRequestException {
-    if (range == null) {
-      throw new BadRequestException(
-          String.format(
-              "A range must be given for the replacement of the robot comment on %s", commentPath));
-    }
-  }
-
-  private static void ensureRangeIsValid(String commentPath, Range range)
-      throws BadRequestException {
-    if (range == null) {
-      return;
-    }
-    if (!range.isValid()) {
-      throw new BadRequestException(
-          String.format(
-              "Range (%s:%s - %s:%s) is not valid for the comment on %s",
-              range.startLine,
-              range.startCharacter,
-              range.endLine,
-              range.endCharacter,
-              commentPath));
-    }
-  }
-
-  private static void ensureReplacementStringIsSet(String commentPath, String replacement)
-      throws BadRequestException {
-    if (replacement == null) {
-      throw new BadRequestException(
-          String.format(
-              "A content for replacement "
-                  + "must be indicated for the replacement of the robot comment on %s",
-              commentPath));
-    }
-  }
-
-  private static void ensureRangesDoNotOverlap(
-      String commentPath, List<FixReplacementInfo> fixReplacementInfos) throws BadRequestException {
-    List<Range> sortedRanges =
-        fixReplacementInfos.stream()
-            .map(fixReplacementInfo -> fixReplacementInfo.range)
-            .sorted()
-            .collect(toList());
-
-    int previousEndLine = 0;
-    int previousOffset = -1;
-    for (Range range : sortedRanges) {
-      if (range.startLine < previousEndLine
-          || (range.startLine == previousEndLine && range.startCharacter < previousOffset)) {
-        throw new BadRequestException(
-            String.format("Replacements overlap for the robot comment on %s", commentPath));
-      }
-      previousEndLine = range.endLine;
-      previousOffset = range.endCharacter;
-    }
-  }
-
-  /** Used to compare Comments with CommentInput comments. */
-  @AutoValue
-  abstract static class CommentSetEntry {
-    private static CommentSetEntry create(
-        String filename,
-        int patchSetId,
-        Integer line,
-        Side side,
-        HashCode message,
-        Comment.Range range) {
-      return new AutoValue_PostReview_CommentSetEntry(
-          filename, patchSetId, line, side, message, range);
-    }
-
-    public static CommentSetEntry create(Comment comment) {
-      return create(
-          comment.key.filename,
-          comment.key.patchSetId,
-          comment.lineNbr,
-          Side.fromShort(comment.side),
-          Hashing.murmur3_128().hashString(comment.message, UTF_8),
-          comment.range);
-    }
-
-    abstract String filename();
-
-    abstract int patchSetId();
-
-    @Nullable
-    abstract Integer line();
-
-    abstract Side side();
-
-    abstract HashCode message();
-
-    @Nullable
-    abstract Comment.Range range();
-  }
-
-  private class Op implements BatchUpdateOp {
-    private final ProjectState projectState;
-    private final PatchSet.Id psId;
-    private final ReviewInput in;
-    private final ListMultimap<RecipientType, Account.Id> accountsToNotify;
-
-    private IdentifiedUser user;
-    private ChangeNotes notes;
-    private PatchSet ps;
-    private ChangeMessage message;
-    private List<Comment> comments = new ArrayList<>();
-    private List<LabelVote> labelDelta = new ArrayList<>();
-    private Map<String, Short> approvals = new HashMap<>();
-    private Map<String, Short> oldApprovals = new HashMap<>();
-
-    private Op(
-        ProjectState projectState,
-        PatchSet.Id psId,
-        ReviewInput in,
-        ListMultimap<RecipientType, Account.Id> accountsToNotify) {
-      this.projectState = projectState;
-      this.psId = psId;
-      this.in = in;
-      this.accountsToNotify = checkNotNull(accountsToNotify);
-    }
-
-    @Override
-    public boolean updateChange(ChangeContext ctx)
-        throws OrmException, ResourceConflictException, UnprocessableEntityException, IOException,
-            PatchListNotAvailableException {
-      user = ctx.getIdentifiedUser();
-      notes = ctx.getNotes();
-      ps = psUtil.get(ctx.getDb(), ctx.getNotes(), psId);
-      boolean dirty = false;
-      dirty |= insertComments(ctx);
-      dirty |= insertRobotComments(ctx);
-      dirty |= updateLabels(projectState, ctx);
-      dirty |= insertMessage(ctx);
-      return dirty;
-    }
-
-    @Override
-    public void postUpdate(Context ctx) throws OrmException {
-      if (message == null) {
-        return;
-      }
-      if (in.notify.compareTo(NotifyHandling.NONE) > 0 || !accountsToNotify.isEmpty()) {
-        email
-            .create(
-                in.notify,
-                accountsToNotify,
-                notes,
-                ps,
-                user,
-                message,
-                comments,
-                in.message,
-                labelDelta)
-            .sendAsync();
-      }
-      commentAdded.fire(
-          notes.getChange(),
-          ps,
-          user.getAccount(),
-          message.getMessage(),
-          approvals,
-          oldApprovals,
-          ctx.getWhen());
-    }
-
-    private boolean insertComments(ChangeContext ctx)
-        throws OrmException, UnprocessableEntityException, PatchListNotAvailableException {
-      Map<String, List<CommentInput>> map = in.comments;
-      if (map == null) {
-        map = Collections.emptyMap();
-      }
-
-      Map<String, Comment> drafts = Collections.emptyMap();
-      if (!map.isEmpty() || in.drafts != DraftHandling.KEEP) {
-        if (in.drafts == DraftHandling.PUBLISH_ALL_REVISIONS) {
-          drafts = changeDrafts(ctx);
-        } else {
-          drafts = patchSetDrafts(ctx);
-        }
-      }
-
-      List<Comment> toDel = new ArrayList<>();
-      List<Comment> toPublish = new ArrayList<>();
-
-      Set<CommentSetEntry> existingIds =
-          in.omitDuplicateComments ? readExistingComments(ctx) : Collections.emptySet();
-
-      for (Map.Entry<String, List<CommentInput>> ent : map.entrySet()) {
-        String path = ent.getKey();
-        for (CommentInput c : ent.getValue()) {
-          String parent = Url.decode(c.inReplyTo);
-          Comment e = drafts.remove(Url.decode(c.id));
-          if (e == null) {
-            e = commentsUtil.newComment(ctx, path, psId, c.side(), c.message, c.unresolved, parent);
-          } else {
-            e.writtenOn = ctx.getWhen();
-            e.side = c.side();
-            e.message = c.message;
-          }
-
-          setCommentRevId(e, patchListCache, ctx.getChange(), ps);
-          e.setLineNbrAndRange(c.line, c.range);
-          e.tag = in.tag;
-
-          if (existingIds.contains(CommentSetEntry.create(e))) {
-            continue;
-          }
-          toPublish.add(e);
-        }
-      }
-
-      switch (in.drafts) {
-        case KEEP:
-        default:
-          break;
-        case DELETE:
-          toDel.addAll(drafts.values());
-          break;
-        case PUBLISH:
-        case PUBLISH_ALL_REVISIONS:
-          commentsUtil.publish(ctx, psId, drafts.values(), in.tag);
-          comments.addAll(drafts.values());
-          break;
-      }
-      ChangeUpdate u = ctx.getUpdate(psId);
-      commentsUtil.deleteComments(ctx.getDb(), u, toDel);
-      commentsUtil.putComments(ctx.getDb(), u, Status.PUBLISHED, toPublish);
-      comments.addAll(toPublish);
-      return !toDel.isEmpty() || !toPublish.isEmpty();
-    }
-
-    private boolean insertRobotComments(ChangeContext ctx)
-        throws OrmException, PatchListNotAvailableException {
-      if (in.robotComments == null) {
-        return false;
-      }
-
-      List<RobotComment> newRobotComments = getNewRobotComments(ctx);
-      commentsUtil.putRobotComments(ctx.getUpdate(psId), newRobotComments);
-      comments.addAll(newRobotComments);
-      return !newRobotComments.isEmpty();
-    }
-
-    private List<RobotComment> getNewRobotComments(ChangeContext ctx)
-        throws OrmException, PatchListNotAvailableException {
-      List<RobotComment> toAdd = new ArrayList<>(in.robotComments.size());
-
-      Set<CommentSetEntry> existingIds =
-          in.omitDuplicateComments ? readExistingRobotComments(ctx) : Collections.emptySet();
-
-      for (Map.Entry<String, List<RobotCommentInput>> ent : in.robotComments.entrySet()) {
-        String path = ent.getKey();
-        for (RobotCommentInput c : ent.getValue()) {
-          RobotComment e = createRobotCommentFromInput(ctx, path, c);
-          if (existingIds.contains(CommentSetEntry.create(e))) {
-            continue;
-          }
-          toAdd.add(e);
-        }
-      }
-      return toAdd;
-    }
-
-    private RobotComment createRobotCommentFromInput(
-        ChangeContext ctx, String path, RobotCommentInput robotCommentInput)
-        throws PatchListNotAvailableException {
-      RobotComment robotComment =
-          commentsUtil.newRobotComment(
-              ctx,
-              path,
-              psId,
-              robotCommentInput.side(),
-              robotCommentInput.message,
-              robotCommentInput.robotId,
-              robotCommentInput.robotRunId);
-      robotComment.parentUuid = Url.decode(robotCommentInput.inReplyTo);
-      robotComment.url = robotCommentInput.url;
-      robotComment.properties = robotCommentInput.properties;
-      robotComment.setLineNbrAndRange(robotCommentInput.line, robotCommentInput.range);
-      robotComment.tag = in.tag;
-      setCommentRevId(robotComment, patchListCache, ctx.getChange(), ps);
-      robotComment.fixSuggestions = createFixSuggestionsFromInput(robotCommentInput.fixSuggestions);
-      return robotComment;
-    }
-
-    private List<FixSuggestion> createFixSuggestionsFromInput(
-        List<FixSuggestionInfo> fixSuggestionInfos) {
-      if (fixSuggestionInfos == null) {
-        return Collections.emptyList();
-      }
-
-      List<FixSuggestion> fixSuggestions = new ArrayList<>(fixSuggestionInfos.size());
-      for (FixSuggestionInfo fixSuggestionInfo : fixSuggestionInfos) {
-        fixSuggestions.add(createFixSuggestionFromInput(fixSuggestionInfo));
-      }
-      return fixSuggestions;
-    }
-
-    private FixSuggestion createFixSuggestionFromInput(FixSuggestionInfo fixSuggestionInfo) {
-      List<FixReplacement> fixReplacements = toFixReplacements(fixSuggestionInfo.replacements);
-      String fixId = ChangeUtil.messageUuid();
-      return new FixSuggestion(fixId, fixSuggestionInfo.description, fixReplacements);
-    }
-
-    private List<FixReplacement> toFixReplacements(List<FixReplacementInfo> fixReplacementInfos) {
-      return fixReplacementInfos.stream().map(this::toFixReplacement).collect(toList());
-    }
-
-    private FixReplacement toFixReplacement(FixReplacementInfo fixReplacementInfo) {
-      Comment.Range range = new Comment.Range(fixReplacementInfo.range);
-      return new FixReplacement(fixReplacementInfo.path, range, fixReplacementInfo.replacement);
-    }
-
-    private Set<CommentSetEntry> readExistingComments(ChangeContext ctx) throws OrmException {
-      return commentsUtil.publishedByChange(ctx.getDb(), ctx.getNotes()).stream()
-          .map(CommentSetEntry::create)
-          .collect(toSet());
-    }
-
-    private Set<CommentSetEntry> readExistingRobotComments(ChangeContext ctx) throws OrmException {
-      return commentsUtil.robotCommentsByChange(ctx.getNotes()).stream()
-          .map(CommentSetEntry::create)
-          .collect(toSet());
-    }
-
-    private Map<String, Comment> changeDrafts(ChangeContext ctx) throws OrmException {
-      Map<String, Comment> drafts = new HashMap<>();
-      for (Comment c :
-          commentsUtil.draftByChangeAuthor(ctx.getDb(), ctx.getNotes(), user.getAccountId())) {
-        c.tag = in.tag;
-        drafts.put(c.key.uuid, c);
-      }
-      return drafts;
-    }
-
-    private Map<String, Comment> patchSetDrafts(ChangeContext ctx) throws OrmException {
-      Map<String, Comment> drafts = new HashMap<>();
-      for (Comment c :
-          commentsUtil.draftByPatchSetAuthor(
-              ctx.getDb(), psId, user.getAccountId(), ctx.getNotes())) {
-        drafts.put(c.key.uuid, c);
-      }
-      return drafts;
-    }
-
-    private Map<String, Short> approvalsByKey(Collection<PatchSetApproval> patchsetApprovals) {
-      Map<String, Short> labels = new HashMap<>();
-      for (PatchSetApproval psa : patchsetApprovals) {
-        labels.put(psa.getLabel(), psa.getValue());
-      }
-      return labels;
-    }
-
-    private Map<String, Short> getAllApprovals(
-        LabelTypes labelTypes, Map<String, Short> current, Map<String, Short> input) {
-      Map<String, Short> allApprovals = new HashMap<>();
-      for (LabelType lt : labelTypes.getLabelTypes()) {
-        allApprovals.put(lt.getName(), (short) 0);
-      }
-      // set approvals to existing votes
-      if (current != null) {
-        allApprovals.putAll(current);
-      }
-      // set approvals to new votes
-      if (input != null) {
-        allApprovals.putAll(input);
-      }
-      return allApprovals;
-    }
-
-    private Map<String, Short> getPreviousApprovals(
-        Map<String, Short> allApprovals, Map<String, Short> current) {
-      Map<String, Short> previous = new HashMap<>();
-      for (Map.Entry<String, Short> approval : allApprovals.entrySet()) {
-        // assume vote is 0 if there is no vote
-        if (!current.containsKey(approval.getKey())) {
-          previous.put(approval.getKey(), (short) 0);
-        } else {
-          previous.put(approval.getKey(), current.get(approval.getKey()));
-        }
-      }
-      return previous;
-    }
-
-    private boolean isReviewer(ChangeContext ctx) throws OrmException {
-      if (ctx.getAccountId().equals(ctx.getChange().getOwner())) {
-        return true;
-      }
-      ChangeData cd = changeDataFactory.create(db.get(), ctx.getNotes());
-      ReviewerSet reviewers = cd.reviewers();
-      if (reviewers.byState(REVIEWER).contains(ctx.getAccountId())) {
-        return true;
-      }
-      return false;
-    }
-
-    private boolean updateLabels(ProjectState projectState, ChangeContext ctx)
-        throws OrmException, ResourceConflictException, IOException {
-      Map<String, Short> inLabels =
-          MoreObjects.firstNonNull(in.labels, Collections.<String, Short>emptyMap());
-
-      // If no labels were modified and change is closed, abort early.
-      // This avoids trying to record a modified label caused by a user
-      // losing access to a label after the change was submitted.
-      if (inLabels.isEmpty() && ctx.getChange().getStatus().isClosed()) {
-        return false;
-      }
-
-      List<PatchSetApproval> del = new ArrayList<>();
-      List<PatchSetApproval> ups = new ArrayList<>();
-      Map<String, PatchSetApproval> current = scanLabels(projectState, ctx, del);
-      LabelTypes labelTypes = projectState.getLabelTypes(ctx.getNotes(), ctx.getUser());
-      Map<String, Short> allApprovals =
-          getAllApprovals(labelTypes, approvalsByKey(current.values()), inLabels);
-      Map<String, Short> previous =
-          getPreviousApprovals(allApprovals, approvalsByKey(current.values()));
-
-      ChangeUpdate update = ctx.getUpdate(psId);
-      for (Map.Entry<String, Short> ent : allApprovals.entrySet()) {
-        String name = ent.getKey();
-        LabelType lt = checkNotNull(labelTypes.byLabel(name), name);
-
-        PatchSetApproval c = current.remove(lt.getName());
-        String normName = lt.getName();
-        approvals.put(normName, (short) 0);
-        if (ent.getValue() == null || ent.getValue() == 0) {
-          // User requested delete of this label.
-          oldApprovals.put(normName, null);
-          if (c != null) {
-            if (c.getValue() != 0) {
-              addLabelDelta(normName, (short) 0);
-              oldApprovals.put(normName, previous.get(normName));
-            }
-            del.add(c);
-            update.putApproval(normName, (short) 0);
-          }
-        } else if (c != null && c.getValue() != ent.getValue()) {
-          c.setValue(ent.getValue());
-          c.setGranted(ctx.getWhen());
-          c.setTag(in.tag);
-          ctx.getUser().updateRealAccountId(c::setRealAccountId);
-          ups.add(c);
-          addLabelDelta(normName, c.getValue());
-          oldApprovals.put(normName, previous.get(normName));
-          approvals.put(normName, c.getValue());
-          update.putApproval(normName, ent.getValue());
-        } else if (c != null && c.getValue() == ent.getValue()) {
-          current.put(normName, c);
-          oldApprovals.put(normName, null);
-          approvals.put(normName, c.getValue());
-        } else if (c == null) {
-          c = ApprovalsUtil.newApproval(psId, user, lt.getLabelId(), ent.getValue(), ctx.getWhen());
-          c.setTag(in.tag);
-          c.setGranted(ctx.getWhen());
-          ups.add(c);
-          addLabelDelta(normName, c.getValue());
-          oldApprovals.put(normName, previous.get(normName));
-          approvals.put(normName, c.getValue());
-          update.putReviewer(user.getAccountId(), REVIEWER);
-          update.putApproval(normName, ent.getValue());
-        }
-      }
-
-      validatePostSubmitLabels(ctx, labelTypes, previous, ups, del);
-
-      // Return early if user is not a reviewer and not posting any labels.
-      // This allows us to preserve their CC status.
-      if (current.isEmpty() && del.isEmpty() && ups.isEmpty() && !isReviewer(ctx)) {
-        return false;
-      }
-
-      forceCallerAsReviewer(projectState, ctx, current, ups, del);
-      ctx.getDb().patchSetApprovals().delete(del);
-      ctx.getDb().patchSetApprovals().upsert(ups);
-      return !del.isEmpty() || !ups.isEmpty();
-    }
-
-    private void validatePostSubmitLabels(
-        ChangeContext ctx,
-        LabelTypes labelTypes,
-        Map<String, Short> previous,
-        List<PatchSetApproval> ups,
-        List<PatchSetApproval> del)
-        throws ResourceConflictException {
-      if (ctx.getChange().getStatus().isOpen()) {
-        return; // Not closed, nothing to validate.
-      } else if (del.isEmpty() && ups.isEmpty()) {
-        return; // No new votes.
-      } else if (ctx.getChange().getStatus() != Change.Status.MERGED) {
-        throw new ResourceConflictException("change is closed");
-      }
-
-      // Disallow reducing votes on any labels post-submit. This assumes the
-      // high values were broadly necessary to submit, so reducing them would
-      // make it possible to take a merged change and make it no longer
-      // submittable.
-      List<PatchSetApproval> reduced = new ArrayList<>(ups.size() + del.size());
-      List<String> disallowed = new ArrayList<>(labelTypes.getLabelTypes().size());
-
-      for (PatchSetApproval psa : del) {
-        LabelType lt = checkNotNull(labelTypes.byLabel(psa.getLabel()));
-        String normName = lt.getName();
-        if (!lt.allowPostSubmit()) {
-          disallowed.add(normName);
-        }
-        Short prev = previous.get(normName);
-        if (prev != null && prev != 0) {
-          reduced.add(psa);
-        }
-      }
-
-      for (PatchSetApproval psa : ups) {
-        LabelType lt = checkNotNull(labelTypes.byLabel(psa.getLabel()));
-        String normName = lt.getName();
-        if (!lt.allowPostSubmit()) {
-          disallowed.add(normName);
-        }
-        Short prev = previous.get(normName);
-        if (prev == null) {
-          continue;
-        }
-        checkState(prev != psa.getValue()); // Should be filtered out above.
-        if (prev > psa.getValue()) {
-          reduced.add(psa);
-        } else {
-          // Set postSubmit bit in ReviewDb; not required for NoteDb, which sets
-          // it automatically.
-          psa.setPostSubmit(true);
-        }
-      }
-
-      if (!disallowed.isEmpty()) {
-        throw new ResourceConflictException(
-            "Voting on labels disallowed after submit: "
-                + disallowed.stream().distinct().sorted().collect(joining(", ")));
-      }
-      if (!reduced.isEmpty()) {
-        throw new ResourceConflictException(
-            "Cannot reduce vote on labels for closed change: "
-                + reduced.stream()
-                    .map(p -> p.getLabel())
-                    .distinct()
-                    .sorted()
-                    .collect(joining(", ")));
-      }
-    }
-
-    private void forceCallerAsReviewer(
-        ProjectState projectState,
-        ChangeContext ctx,
-        Map<String, PatchSetApproval> current,
-        List<PatchSetApproval> ups,
-        List<PatchSetApproval> del) {
-      if (current.isEmpty() && ups.isEmpty()) {
-        // TODO Find another way to link reviewers to changes.
-        if (del.isEmpty()) {
-          // If no existing label is being set to 0, hack in the caller
-          // as a reviewer by picking the first server-wide LabelType.
-          LabelId labelId =
-              projectState
-                  .getLabelTypes(ctx.getNotes(), ctx.getUser())
-                  .getLabelTypes()
-                  .get(0)
-                  .getLabelId();
-          PatchSetApproval c = ApprovalsUtil.newApproval(psId, user, labelId, 0, ctx.getWhen());
-          c.setTag(in.tag);
-          c.setGranted(ctx.getWhen());
-          ups.add(c);
-        } else {
-          // Pick a random label that is about to be deleted and keep it.
-          Iterator<PatchSetApproval> i = del.iterator();
-          PatchSetApproval c = i.next();
-          c.setValue((short) 0);
-          c.setGranted(ctx.getWhen());
-          i.remove();
-          ups.add(c);
-        }
-      }
-      ctx.getUpdate(ctx.getChange().currentPatchSetId()).putReviewer(user.getAccountId(), REVIEWER);
-    }
-
-    private Map<String, PatchSetApproval> scanLabels(
-        ProjectState projectState, ChangeContext ctx, List<PatchSetApproval> del)
-        throws OrmException, IOException {
-      LabelTypes labelTypes = projectState.getLabelTypes(ctx.getNotes(), ctx.getUser());
-      Map<String, PatchSetApproval> current = new HashMap<>();
-
-      for (PatchSetApproval a :
-          approvalsUtil.byPatchSetUser(
-              ctx.getDb(),
-              ctx.getNotes(),
-              ctx.getUser(),
-              psId,
-              user.getAccountId(),
-              ctx.getRevWalk(),
-              ctx.getRepoView().getConfig())) {
-        if (a.isLegacySubmit()) {
-          continue;
-        }
-
-        LabelType lt = labelTypes.byLabel(a.getLabelId());
-        if (lt != null) {
-          current.put(lt.getName(), a);
-        } else {
-          del.add(a);
-        }
-      }
-      return current;
-    }
-
-    private boolean insertMessage(ChangeContext ctx) throws OrmException {
-      String msg = Strings.nullToEmpty(in.message).trim();
-
-      StringBuilder buf = new StringBuilder();
-      for (LabelVote d : labelDelta) {
-        buf.append(" ").append(d.format());
-      }
-      if (comments.size() == 1) {
-        buf.append("\n\n(1 comment)");
-      } else if (comments.size() > 1) {
-        buf.append(String.format("\n\n(%d comments)", comments.size()));
-      }
-      if (!msg.isEmpty()) {
-        buf.append("\n\n").append(msg);
-      } else if (in.ready) {
-        buf.append("\n\n" + START_REVIEW_MESSAGE);
-      }
-      if (buf.length() == 0) {
-        return false;
-      }
-
-      message =
-          ChangeMessagesUtil.newMessage(
-              psId, user, ctx.getWhen(), "Patch Set " + psId.get() + ":" + buf, in.tag);
-      cmUtil.addChangeMessage(ctx.getDb(), ctx.getUpdate(psId), message);
-      return true;
-    }
-
-    private void addLabelDelta(String name, short value) {
-      labelDelta.add(LabelVote.create(name, value));
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReviewers.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReviewers.java
deleted file mode 100644
index 61d6020..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReviewers.java
+++ /dev/null
@@ -1,503 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.change;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.gerrit.extensions.client.ReviewerState.CC;
-import static com.google.gerrit.extensions.client.ReviewerState.REVIEWER;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableListMultimap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.Lists;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.extensions.api.changes.AddReviewerInput;
-import com.google.gerrit.extensions.api.changes.AddReviewerResult;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.api.changes.RecipientType;
-import com.google.gerrit.extensions.api.changes.ReviewerInfo;
-import com.google.gerrit.extensions.client.ReviewerState;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.AnonymousUser;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountLoader;
-import com.google.gerrit.server.account.AccountsCollection;
-import com.google.gerrit.server.account.GroupMembers;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.group.GroupsCollection;
-import com.google.gerrit.server.group.SystemGroupBackend;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.mail.send.OutgoingEmailValidator;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.NotesMigration;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.RefPermission;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.RetryingRestModifyView;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.text.MessageFormat;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.Config;
-
-@Singleton
-public class PostReviewers
-    extends RetryingRestModifyView<ChangeResource, AddReviewerInput, AddReviewerResult> {
-
-  public static final int DEFAULT_MAX_REVIEWERS_WITHOUT_CHECK = 10;
-  public static final int DEFAULT_MAX_REVIEWERS = 20;
-
-  private final AccountsCollection accounts;
-  private final ReviewerResource.Factory reviewerFactory;
-  private final PermissionBackend permissionBackend;
-
-  private final GroupsCollection groupsCollection;
-  private final GroupMembers.Factory groupMembersFactory;
-  private final AccountLoader.Factory accountLoaderFactory;
-  private final Provider<ReviewDb> dbProvider;
-  private final ChangeData.Factory changeDataFactory;
-  private final IdentifiedUser.GenericFactory identifiedUserFactory;
-  private final Config cfg;
-  private final ReviewerJson json;
-  private final NotesMigration migration;
-  private final NotifyUtil notifyUtil;
-  private final ProjectCache projectCache;
-  private final Provider<AnonymousUser> anonymousProvider;
-  private final PostReviewersOp.Factory postReviewersOpFactory;
-  private final OutgoingEmailValidator validator;
-
-  @Inject
-  PostReviewers(
-      AccountsCollection accounts,
-      ReviewerResource.Factory reviewerFactory,
-      PermissionBackend permissionBackend,
-      GroupsCollection groupsCollection,
-      GroupMembers.Factory groupMembersFactory,
-      AccountLoader.Factory accountLoaderFactory,
-      Provider<ReviewDb> db,
-      ChangeData.Factory changeDataFactory,
-      RetryHelper retryHelper,
-      IdentifiedUser.GenericFactory identifiedUserFactory,
-      @GerritServerConfig Config cfg,
-      ReviewerJson json,
-      NotesMigration migration,
-      NotifyUtil notifyUtil,
-      ProjectCache projectCache,
-      Provider<AnonymousUser> anonymousProvider,
-      PostReviewersOp.Factory postReviewersOpFactory,
-      OutgoingEmailValidator validator) {
-    super(retryHelper);
-    this.accounts = accounts;
-    this.reviewerFactory = reviewerFactory;
-    this.permissionBackend = permissionBackend;
-    this.groupsCollection = groupsCollection;
-    this.groupMembersFactory = groupMembersFactory;
-    this.accountLoaderFactory = accountLoaderFactory;
-    this.dbProvider = db;
-    this.changeDataFactory = changeDataFactory;
-    this.identifiedUserFactory = identifiedUserFactory;
-    this.cfg = cfg;
-    this.json = json;
-    this.migration = migration;
-    this.notifyUtil = notifyUtil;
-    this.projectCache = projectCache;
-    this.anonymousProvider = anonymousProvider;
-    this.postReviewersOpFactory = postReviewersOpFactory;
-    this.validator = validator;
-  }
-
-  @Override
-  protected AddReviewerResult applyImpl(
-      BatchUpdate.Factory updateFactory, ChangeResource rsrc, AddReviewerInput input)
-      throws IOException, OrmException, RestApiException, UpdateException,
-          PermissionBackendException, ConfigInvalidException {
-    if (input.reviewer == null) {
-      throw new BadRequestException("missing reviewer field");
-    }
-
-    Addition addition = prepareApplication(rsrc, input, true);
-    if (addition.op == null) {
-      return addition.result;
-    }
-    try (BatchUpdate bu =
-        updateFactory.create(
-            dbProvider.get(), rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
-      Change.Id id = rsrc.getChange().getId();
-      bu.addOp(id, addition.op);
-      bu.execute();
-      addition.gatherResults();
-    }
-    return addition.result;
-  }
-
-  public Addition prepareApplication(
-      ChangeResource rsrc, AddReviewerInput input, boolean allowGroup)
-      throws OrmException, IOException, PermissionBackendException, ConfigInvalidException {
-    String reviewer = input.reviewer;
-    ReviewerState state = input.state();
-    NotifyHandling notify = input.notify;
-    ListMultimap<RecipientType, Account.Id> accountsToNotify = null;
-    try {
-      accountsToNotify = notifyUtil.resolveAccounts(input.notifyDetails);
-    } catch (BadRequestException e) {
-      return fail(reviewer, e.getMessage());
-    }
-    boolean confirmed = input.confirmed();
-    boolean allowByEmail = projectCache.checkedGet(rsrc.getProject()).isEnableReviewerByEmail();
-
-    Addition byAccountId =
-        addByAccountId(reviewer, rsrc, state, notify, accountsToNotify, allowGroup, allowByEmail);
-
-    Addition wholeGroup = null;
-    if (byAccountId == null || !byAccountId.exactMatchFound) {
-      wholeGroup =
-          addWholeGroup(
-              reviewer, rsrc, state, notify, accountsToNotify, confirmed, allowGroup, allowByEmail);
-      if (wholeGroup != null && wholeGroup.exactMatchFound) {
-        return wholeGroup;
-      }
-    }
-
-    if (byAccountId != null) {
-      return byAccountId;
-    }
-    if (wholeGroup != null) {
-      return wholeGroup;
-    }
-
-    return addByEmail(reviewer, rsrc, state, notify, accountsToNotify);
-  }
-
-  Addition ccCurrentUser(CurrentUser user, RevisionResource revision) {
-    return new Addition(
-        user.getUserName(),
-        revision.getChangeResource(),
-        ImmutableSet.of(user.getAccountId()),
-        null,
-        CC,
-        NotifyHandling.NONE,
-        ImmutableListMultimap.of(),
-        true);
-  }
-
-  @Nullable
-  private Addition addByAccountId(
-      String reviewer,
-      ChangeResource rsrc,
-      ReviewerState state,
-      NotifyHandling notify,
-      ListMultimap<RecipientType, Account.Id> accountsToNotify,
-      boolean allowGroup,
-      boolean allowByEmail)
-      throws OrmException, PermissionBackendException, IOException, ConfigInvalidException {
-    IdentifiedUser user = null;
-    boolean exactMatchFound = false;
-    try {
-      user = accounts.parse(reviewer);
-      if (reviewer.equalsIgnoreCase(user.getName())
-          || reviewer.equals(String.valueOf(user.getAccountId()))) {
-        exactMatchFound = true;
-      }
-    } catch (UnprocessableEntityException | AuthException e) {
-      // AuthException won't occur since the user is authenticated at this point.
-      if (!allowGroup && !allowByEmail) {
-        // Only return failure if we aren't going to try other interpretations.
-        return fail(
-            reviewer, MessageFormat.format(ChangeMessages.get().reviewerNotFoundUser, reviewer));
-      }
-      return null;
-    }
-
-    ReviewerResource rrsrc = reviewerFactory.create(rsrc, user.getAccountId());
-    Account member = rrsrc.getReviewerUser().getAccount();
-    PermissionBackend.ForRef perm =
-        permissionBackend.user(rrsrc.getReviewerUser()).ref(rrsrc.getChange().getDest());
-    if (isValidReviewer(member, perm)) {
-      return new Addition(
-          reviewer,
-          rsrc,
-          ImmutableSet.of(member.getId()),
-          null,
-          state,
-          notify,
-          accountsToNotify,
-          exactMatchFound);
-    }
-    if (!member.isActive()) {
-      if (allowByEmail && state == CC) {
-        return null;
-      }
-      return fail(reviewer, MessageFormat.format(ChangeMessages.get().reviewerInactive, reviewer));
-    }
-    return fail(
-        reviewer, MessageFormat.format(ChangeMessages.get().reviewerCantSeeChange, reviewer));
-  }
-
-  @Nullable
-  private Addition addWholeGroup(
-      String reviewer,
-      ChangeResource rsrc,
-      ReviewerState state,
-      NotifyHandling notify,
-      ListMultimap<RecipientType, Account.Id> accountsToNotify,
-      boolean confirmed,
-      boolean allowGroup,
-      boolean allowByEmail)
-      throws OrmException, IOException, PermissionBackendException {
-    if (!allowGroup) {
-      return null;
-    }
-
-    GroupDescription.Basic group = null;
-    try {
-      group = groupsCollection.parseInternal(reviewer);
-    } catch (UnprocessableEntityException e) {
-      if (!allowByEmail) {
-        return fail(
-            reviewer,
-            MessageFormat.format(ChangeMessages.get().reviewerNotFoundUserOrGroup, reviewer));
-      }
-      return null;
-    }
-
-    if (!isLegalReviewerGroup(group.getGroupUUID())) {
-      return fail(
-          reviewer, MessageFormat.format(ChangeMessages.get().groupIsNotAllowed, group.getName()));
-    }
-
-    Set<Account.Id> reviewers = new HashSet<>();
-    Set<Account> members;
-    try {
-      members =
-          groupMembersFactory
-              .create(rsrc.getUser())
-              .listAccounts(group.getGroupUUID(), rsrc.getProject());
-    } catch (NoSuchGroupException e) {
-      return fail(
-          reviewer,
-          MessageFormat.format(ChangeMessages.get().reviewerNotFoundUserOrGroup, group.getName()));
-    } catch (NoSuchProjectException e) {
-      return fail(reviewer, e.getMessage());
-    }
-
-    // if maxAllowed is set to 0, it is allowed to add any number of
-    // reviewers
-    int maxAllowed = cfg.getInt("addreviewer", "maxAllowed", DEFAULT_MAX_REVIEWERS);
-    if (maxAllowed > 0 && members.size() > maxAllowed) {
-      return fail(
-          reviewer,
-          MessageFormat.format(ChangeMessages.get().groupHasTooManyMembers, group.getName()));
-    }
-
-    // if maxWithoutCheck is set to 0, we never ask for confirmation
-    int maxWithoutConfirmation =
-        cfg.getInt("addreviewer", "maxWithoutConfirmation", DEFAULT_MAX_REVIEWERS_WITHOUT_CHECK);
-    if (!confirmed && maxWithoutConfirmation > 0 && members.size() > maxWithoutConfirmation) {
-      return fail(
-          reviewer,
-          true,
-          MessageFormat.format(
-              ChangeMessages.get().groupManyMembersConfirmation, group.getName(), members.size()));
-    }
-
-    PermissionBackend.ForRef perm =
-        permissionBackend.user(rsrc.getUser()).ref(rsrc.getChange().getDest());
-    for (Account member : members) {
-      if (isValidReviewer(member, perm)) {
-        reviewers.add(member.getId());
-      }
-    }
-
-    return new Addition(reviewer, rsrc, reviewers, null, state, notify, accountsToNotify, true);
-  }
-
-  @Nullable
-  private Addition addByEmail(
-      String reviewer,
-      ChangeResource rsrc,
-      ReviewerState state,
-      NotifyHandling notify,
-      ListMultimap<RecipientType, Account.Id> accountsToNotify)
-      throws PermissionBackendException {
-    if (!permissionBackend
-        .user(anonymousProvider)
-        .change(rsrc.getNotes())
-        .database(dbProvider)
-        .test(ChangePermission.READ)) {
-      return fail(
-          reviewer, MessageFormat.format(ChangeMessages.get().reviewerCantSeeChange, reviewer));
-    }
-    if (!migration.readChanges()) {
-      // addByEmail depends on NoteDb.
-      return fail(
-          reviewer, MessageFormat.format(ChangeMessages.get().reviewerNotFoundUser, reviewer));
-    }
-    Address adr = Address.tryParse(reviewer);
-    if (adr == null || !validator.isValid(adr.getEmail())) {
-      return fail(reviewer, MessageFormat.format(ChangeMessages.get().reviewerInvalid, reviewer));
-    }
-    return new Addition(
-        reviewer, rsrc, null, ImmutableList.of(adr), state, notify, accountsToNotify, true);
-  }
-
-  private boolean isValidReviewer(Account member, PermissionBackend.ForRef perm)
-      throws PermissionBackendException {
-    if (member.isActive()) {
-      IdentifiedUser user = identifiedUserFactory.create(member.getId());
-      // Does not account for draft status as a user might want to let a
-      // reviewer see a draft.
-      try {
-        perm.user(user).check(RefPermission.READ);
-        return true;
-      } catch (AuthException e) {
-        return false;
-      }
-    }
-    return false;
-  }
-
-  private Addition fail(String reviewer, String error) {
-    return fail(reviewer, false, error);
-  }
-
-  private Addition fail(String reviewer, boolean confirm, String error) {
-    Addition addition = new Addition(reviewer);
-    addition.result.confirm = confirm ? true : null;
-    addition.result.error = error;
-    return addition;
-  }
-
-  public class Addition {
-    final AddReviewerResult result;
-    final PostReviewersOp op;
-    final Set<Account.Id> reviewers;
-    final Collection<Address> reviewersByEmail;
-    final ReviewerState state;
-    final ChangeNotes notes;
-    final IdentifiedUser caller;
-    final boolean exactMatchFound;
-
-    Addition(String reviewer) {
-      result = new AddReviewerResult(reviewer);
-      op = null;
-      reviewers = ImmutableSet.of();
-      reviewersByEmail = ImmutableSet.of();
-      state = REVIEWER;
-      notes = null;
-      caller = null;
-      exactMatchFound = false;
-    }
-
-    protected Addition(
-        String reviewer,
-        ChangeResource rsrc,
-        @Nullable Set<Account.Id> reviewers,
-        @Nullable Collection<Address> reviewersByEmail,
-        ReviewerState state,
-        @Nullable NotifyHandling notify,
-        ListMultimap<RecipientType, Account.Id> accountsToNotify,
-        boolean exactMatchFound) {
-      checkArgument(
-          reviewers != null || reviewersByEmail != null,
-          "must have either reviewers or reviewersByEmail");
-
-      result = new AddReviewerResult(reviewer);
-      this.reviewers = reviewers == null ? ImmutableSet.of() : reviewers;
-      this.reviewersByEmail = reviewersByEmail == null ? ImmutableList.of() : reviewersByEmail;
-      this.state = state;
-      notes = rsrc.getNotes();
-      caller = rsrc.getUser().asIdentifiedUser();
-      op =
-          postReviewersOpFactory.create(
-              this.reviewers, this.reviewersByEmail, state, notify, accountsToNotify);
-      this.exactMatchFound = exactMatchFound;
-    }
-
-    void gatherResults() throws OrmException, PermissionBackendException {
-      if (notes == null || caller == null) {
-        // When notes or caller is missing this is likely just carrying an error message
-        // in the contained AddReviewerResult.
-        return;
-      }
-
-      ChangeData cd = changeDataFactory.create(dbProvider.get(), notes);
-      PermissionBackend.ForChange perm =
-          permissionBackend.user(caller).database(dbProvider).change(cd);
-
-      // Generate result details and fill AccountLoader. This occurs outside
-      // the Op because the accounts are in a different table.
-      PostReviewersOp.Result opResult = op.getResult();
-      if (migration.readChanges() && state == CC) {
-        result.ccs = Lists.newArrayListWithCapacity(opResult.addedCCs().size());
-        for (Account.Id accountId : opResult.addedCCs()) {
-          IdentifiedUser u = identifiedUserFactory.create(accountId);
-          result.ccs.add(json.format(caller, new ReviewerInfo(accountId.get()), perm.user(u), cd));
-        }
-        accountLoaderFactory.create(true).fill(result.ccs);
-        for (Address a : reviewersByEmail) {
-          result.ccs.add(new AccountInfo(a.getName(), a.getEmail()));
-        }
-      } else {
-        result.reviewers = Lists.newArrayListWithCapacity(opResult.addedReviewers().size());
-        for (PatchSetApproval psa : opResult.addedReviewers()) {
-          // New reviewers have value 0, don't bother normalizing.
-          IdentifiedUser u = identifiedUserFactory.create(psa.getAccountId());
-          result.reviewers.add(
-              json.format(
-                  caller,
-                  new ReviewerInfo(psa.getAccountId().get()),
-                  perm.user(u),
-                  cd,
-                  ImmutableList.of(psa)));
-        }
-        accountLoaderFactory.create(true).fill(result.reviewers);
-        for (Address a : reviewersByEmail) {
-          result.reviewers.add(ReviewerInfo.byEmail(a.getName(), a.getEmail()));
-        }
-      }
-    }
-  }
-
-  public static boolean isLegalReviewerGroup(AccountGroup.UUID groupUUID) {
-    return !SystemGroupBackend.isSystemGroup(groupUUID);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReviewersOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReviewersOp.java
deleted file mode 100644
index 0034598..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReviewersOp.java
+++ /dev/null
@@ -1,264 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.change;
-
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.gerrit.extensions.client.ReviewerState.CC;
-import static java.util.stream.Collectors.toList;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.base.MoreObjects;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.Lists;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.api.changes.RecipientType;
-import com.google.gerrit.extensions.client.ReviewerState;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.extensions.events.ReviewerAdded;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.mail.send.AddReviewerSender;
-import com.google.gerrit.server.notedb.NotesMigration;
-import com.google.gerrit.server.notedb.ReviewerStateInternal;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.Context;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class PostReviewersOp implements BatchUpdateOp {
-  private static final Logger log = LoggerFactory.getLogger(PostReviewersOp.class);
-
-  public interface Factory {
-    PostReviewersOp create(
-        Set<Account.Id> reviewers,
-        Collection<Address> reviewersByEmail,
-        ReviewerState state,
-        @Nullable NotifyHandling notify,
-        ListMultimap<RecipientType, Account.Id> accountsToNotify);
-  }
-
-  @AutoValue
-  public abstract static class Result {
-    public abstract ImmutableList<PatchSetApproval> addedReviewers();
-
-    public abstract ImmutableList<Account.Id> addedCCs();
-
-    static Builder builder() {
-      return new AutoValue_PostReviewersOp_Result.Builder();
-    }
-
-    @AutoValue.Builder
-    abstract static class Builder {
-      abstract Builder setAddedReviewers(ImmutableList<PatchSetApproval> addedReviewers);
-
-      abstract Builder setAddedCCs(ImmutableList<Account.Id> addedCCs);
-
-      abstract Result build();
-    }
-  }
-
-  private final ApprovalsUtil approvalsUtil;
-  private final PatchSetUtil psUtil;
-  private final ReviewerAdded reviewerAdded;
-  private final AccountCache accountCache;
-  private final ProjectCache projectCache;
-  private final AddReviewerSender.Factory addReviewerSenderFactory;
-  private final NotesMigration migration;
-  private final Provider<IdentifiedUser> user;
-  private final Provider<ReviewDb> dbProvider;
-  private final Set<Account.Id> reviewers;
-  private final Collection<Address> reviewersByEmail;
-  private final ReviewerState state;
-  private final NotifyHandling notify;
-  private final ListMultimap<RecipientType, Account.Id> accountsToNotify;
-
-  private List<PatchSetApproval> addedReviewers = new ArrayList<>();
-  private Collection<Account.Id> addedCCs = new ArrayList<>();
-  private Collection<Address> addedCCsByEmail = new ArrayList<>();
-  private Change change;
-  private PatchSet patchSet;
-  private Result opResult;
-
-  @Inject
-  PostReviewersOp(
-      ApprovalsUtil approvalsUtil,
-      PatchSetUtil psUtil,
-      ReviewerAdded reviewerAdded,
-      AccountCache accountCache,
-      ProjectCache projectCache,
-      AddReviewerSender.Factory addReviewerSenderFactory,
-      NotesMigration migration,
-      Provider<IdentifiedUser> user,
-      Provider<ReviewDb> dbProvider,
-      @Assisted Set<Account.Id> reviewers,
-      @Assisted Collection<Address> reviewersByEmail,
-      @Assisted ReviewerState state,
-      @Assisted @Nullable NotifyHandling notify,
-      @Assisted ListMultimap<RecipientType, Account.Id> accountsToNotify) {
-    this.approvalsUtil = approvalsUtil;
-    this.psUtil = psUtil;
-    this.reviewerAdded = reviewerAdded;
-    this.accountCache = accountCache;
-    this.projectCache = projectCache;
-    this.addReviewerSenderFactory = addReviewerSenderFactory;
-    this.migration = migration;
-    this.user = user;
-    this.dbProvider = dbProvider;
-
-    this.reviewers = reviewers;
-    this.reviewersByEmail = reviewersByEmail;
-    this.state = state;
-    this.notify = notify;
-    this.accountsToNotify = accountsToNotify;
-  }
-
-  @Override
-  public boolean updateChange(ChangeContext ctx)
-      throws RestApiException, OrmException, IOException {
-    change = ctx.getChange();
-    if (!reviewers.isEmpty()) {
-      if (migration.readChanges() && state == CC) {
-        addedCCs =
-            approvalsUtil.addCcs(
-                ctx.getNotes(), ctx.getUpdate(change.currentPatchSetId()), reviewers);
-        if (addedCCs.isEmpty()) {
-          return false;
-        }
-      } else {
-        addedReviewers =
-            approvalsUtil.addReviewers(
-                ctx.getDb(),
-                ctx.getNotes(),
-                ctx.getUpdate(ctx.getChange().currentPatchSetId()),
-                projectCache
-                    .checkedGet(change.getProject())
-                    .getLabelTypes(change.getDest(), ctx.getUser()),
-                change,
-                reviewers);
-        if (addedReviewers.isEmpty()) {
-          return false;
-        }
-      }
-    }
-
-    for (Address a : reviewersByEmail) {
-      ctx.getUpdate(ctx.getChange().currentPatchSetId())
-          .putReviewerByEmail(a, ReviewerStateInternal.fromReviewerState(state));
-    }
-
-    patchSet = psUtil.current(dbProvider.get(), ctx.getNotes());
-    return true;
-  }
-
-  @Override
-  public void postUpdate(Context ctx) throws Exception {
-    opResult =
-        Result.builder()
-            .setAddedReviewers(ImmutableList.copyOf(addedReviewers))
-            .setAddedCCs(ImmutableList.copyOf(addedCCs))
-            .build();
-    emailReviewers(
-        change,
-        Lists.transform(addedReviewers, r -> r.getAccountId()),
-        addedCCs == null ? ImmutableList.of() : addedCCs,
-        reviewersByEmail,
-        addedCCsByEmail,
-        notify,
-        accountsToNotify);
-    if (!addedReviewers.isEmpty()) {
-      List<Account> reviewers =
-          addedReviewers.stream()
-              .map(r -> accountCache.get(r.getAccountId()).getAccount())
-              .collect(toList());
-      reviewerAdded.fire(change, patchSet, reviewers, ctx.getAccount(), ctx.getWhen());
-    }
-  }
-
-  public void emailReviewers(
-      Change change,
-      Collection<Account.Id> added,
-      Collection<Account.Id> copied,
-      Collection<Address> addedByEmail,
-      Collection<Address> copiedByEmail,
-      NotifyHandling notify,
-      ListMultimap<RecipientType, Account.Id> accountsToNotify) {
-    if (added.isEmpty() && copied.isEmpty() && addedByEmail.isEmpty() && copiedByEmail.isEmpty()) {
-      return;
-    }
-
-    // Email the reviewers
-    //
-    // The user knows they added themselves, don't bother emailing them.
-    List<Account.Id> toMail = Lists.newArrayListWithCapacity(added.size());
-    Account.Id userId = user.get().getAccountId();
-    for (Account.Id id : added) {
-      if (!id.equals(userId)) {
-        toMail.add(id);
-      }
-    }
-    List<Account.Id> toCopy = Lists.newArrayListWithCapacity(copied.size());
-    for (Account.Id id : copied) {
-      if (!id.equals(userId)) {
-        toCopy.add(id);
-      }
-    }
-    if (toMail.isEmpty() && toCopy.isEmpty() && addedByEmail.isEmpty() && copiedByEmail.isEmpty()) {
-      return;
-    }
-
-    try {
-      AddReviewerSender cm = addReviewerSenderFactory.create(change.getProject(), change.getId());
-      // Default to silent operation on WIP changes.
-      NotifyHandling defaultNotifyHandling =
-          change.isWorkInProgress() ? NotifyHandling.NONE : NotifyHandling.ALL;
-      cm.setNotify(MoreObjects.firstNonNull(notify, defaultNotifyHandling));
-      cm.setAccountsToNotify(accountsToNotify);
-      cm.setFrom(userId);
-      cm.addReviewers(toMail);
-      cm.addReviewersByEmail(addedByEmail);
-      cm.addExtraCC(toCopy);
-      cm.addExtraCCByEmail(copiedByEmail);
-      cm.send();
-    } catch (Exception err) {
-      log.error("Cannot send email to new reviewers of change " + change.getId(), err);
-    }
-  }
-
-  public Result getResult() {
-    checkState(opResult != null, "Batch update wasn't executed yet");
-    return opResult;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PreviewSubmit.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PreviewSubmit.java
deleted file mode 100644
index 3c83f81..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PreviewSubmit.java
+++ /dev/null
@@ -1,191 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.change;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.extensions.api.changes.SubmitInput;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.BinaryResult;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.NotImplementedException;
-import com.google.gerrit.extensions.restapi.PreconditionFailedException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ChangeUtil;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.change.LimitedByteArrayOutputStream.LimitExceededException;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.git.MergeOp;
-import com.google.gerrit.server.git.MergeOpRepoManager;
-import com.google.gerrit.server.git.MergeOpRepoManager.OpenRepo;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.Collection;
-import org.apache.commons.compress.archivers.ArchiveOutputStream;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.NullProgressMonitor;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.storage.pack.PackConfig;
-import org.eclipse.jgit.transport.BundleWriter;
-import org.eclipse.jgit.transport.ReceiveCommand;
-import org.kohsuke.args4j.Option;
-
-@Singleton
-public class PreviewSubmit implements RestReadView<RevisionResource> {
-  private static final int MAX_DEFAULT_BUNDLE_SIZE = 100 * 1024 * 1024;
-
-  private final Provider<ReviewDb> dbProvider;
-  private final Provider<MergeOp> mergeOpProvider;
-  private final AllowedFormats allowedFormats;
-  private int maxBundleSize;
-  private String format;
-
-  @Option(name = "--format")
-  public void setFormat(String f) {
-    this.format = f;
-  }
-
-  @Inject
-  PreviewSubmit(
-      Provider<ReviewDb> dbProvider,
-      Provider<MergeOp> mergeOpProvider,
-      AllowedFormats allowedFormats,
-      @GerritServerConfig Config cfg) {
-    this.dbProvider = dbProvider;
-    this.mergeOpProvider = mergeOpProvider;
-    this.allowedFormats = allowedFormats;
-    this.maxBundleSize = cfg.getInt("download", "maxBundleSize", MAX_DEFAULT_BUNDLE_SIZE);
-  }
-
-  @Override
-  public BinaryResult apply(RevisionResource rsrc)
-      throws OrmException, RestApiException, UpdateException, IOException, ConfigInvalidException,
-          PermissionBackendException {
-    if (Strings.isNullOrEmpty(format)) {
-      throw new BadRequestException("format is not specified");
-    }
-    ArchiveFormat f = allowedFormats.extensions.get("." + format);
-    if (f == null && format.equals("tgz")) {
-      // Always allow tgz, even when the allowedFormats doesn't contain it.
-      // Then we allow at least one format even if the list of allowed
-      // formats is empty.
-      f = ArchiveFormat.TGZ;
-    }
-    if (f == null) {
-      throw new BadRequestException("unknown archive format");
-    }
-
-    Change change = rsrc.getChange();
-    if (!change.getStatus().isOpen()) {
-      throw new PreconditionFailedException("change is " + ChangeUtil.status(change));
-    }
-    if (!rsrc.getUser().isIdentifiedUser()) {
-      throw new MethodNotAllowedException("Anonymous users cannot submit");
-    }
-
-    return getBundles(rsrc, f);
-  }
-
-  private BinaryResult getBundles(RevisionResource rsrc, ArchiveFormat f)
-      throws OrmException, RestApiException, UpdateException, IOException, ConfigInvalidException,
-          PermissionBackendException {
-    ReviewDb db = dbProvider.get();
-    IdentifiedUser caller = rsrc.getUser().asIdentifiedUser();
-    Change change = rsrc.getChange();
-
-    @SuppressWarnings("resource") // Returned BinaryResult takes ownership and handles closing.
-    MergeOp op = mergeOpProvider.get();
-    try {
-      op.merge(db, change, caller, false, new SubmitInput(), true);
-      BinaryResult bin = new SubmitPreviewResult(op, f, maxBundleSize);
-      bin.disableGzip()
-          .setContentType(f.getMimeType())
-          .setAttachmentName("submit-preview-" + change.getChangeId() + "." + format);
-      return bin;
-    } catch (OrmException
-        | RestApiException
-        | UpdateException
-        | IOException
-        | ConfigInvalidException
-        | RuntimeException
-        | PermissionBackendException e) {
-      op.close();
-      throw e;
-    }
-  }
-
-  private static class SubmitPreviewResult extends BinaryResult {
-
-    private final MergeOp mergeOp;
-    private final ArchiveFormat archiveFormat;
-    private final int maxBundleSize;
-
-    private SubmitPreviewResult(MergeOp mergeOp, ArchiveFormat archiveFormat, int maxBundleSize) {
-      this.mergeOp = mergeOp;
-      this.archiveFormat = archiveFormat;
-      this.maxBundleSize = maxBundleSize;
-    }
-
-    @Override
-    public void writeTo(OutputStream out) throws IOException {
-      try (ArchiveOutputStream aos = archiveFormat.createArchiveOutputStream(out)) {
-        MergeOpRepoManager orm = mergeOp.getMergeOpRepoManager();
-        for (Project.NameKey p : mergeOp.getAllProjects()) {
-          OpenRepo or = orm.getRepo(p);
-          BundleWriter bw = new BundleWriter(or.getCodeReviewRevWalk().getObjectReader());
-          bw.setObjectCountCallback(null);
-          bw.setPackConfig(new PackConfig(or.getRepo()));
-          Collection<ReceiveCommand> refs = or.getUpdate().getRefUpdates().values();
-          for (ReceiveCommand r : refs) {
-            bw.include(r.getRefName(), r.getNewId());
-            ObjectId oldId = r.getOldId();
-            if (!oldId.equals(ObjectId.zeroId())
-                // Probably the client doesn't already have NoteDb data.
-                && !RefNames.isNoteDbMetaRef(r.getRefName())) {
-              bw.assume(or.getCodeReviewRevWalk().parseCommit(oldId));
-            }
-          }
-          LimitedByteArrayOutputStream bos = new LimitedByteArrayOutputStream(maxBundleSize, 1024);
-          bw.writeBundle(NullProgressMonitor.INSTANCE, bos);
-          // This naming scheme cannot produce directory/file conflicts
-          // as no projects contains ".git/":
-          String path = p.get() + ".git";
-          archiveFormat.putEntry(aos, path, bos.toByteArray());
-        }
-      } catch (LimitExceededException e) {
-        throw new NotImplementedException("The bundle is too big to generate at the server");
-      } catch (NoSuchProjectException e) {
-        throw new IOException(e);
-      }
-    }
-
-    @Override
-    public void close() throws IOException {
-      mergeOp.close();
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PublishChangeEdit.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PublishChangeEdit.java
deleted file mode 100644
index c4e2f3b..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PublishChangeEdit.java
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.api.changes.PublishChangeEditInput;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AcceptsPost;
-import com.google.gerrit.extensions.restapi.ChildCollection;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.NotImplementedException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.server.edit.ChangeEdit;
-import com.google.gerrit.server.edit.ChangeEditUtil;
-import com.google.gerrit.server.project.ContributorAgreementsChecker;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.RetryingRestModifyView;
-import com.google.gerrit.server.update.UpdateException;
-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 org.eclipse.jgit.errors.ConfigInvalidException;
-
-@Singleton
-public class PublishChangeEdit
-    implements ChildCollection<ChangeResource, ChangeEditResource>, AcceptsPost<ChangeResource> {
-
-  private final Publish publish;
-
-  @Inject
-  PublishChangeEdit(Publish publish) {
-    this.publish = publish;
-  }
-
-  @Override
-  public DynamicMap<RestView<ChangeEditResource>> views() {
-    throw new NotImplementedException();
-  }
-
-  @Override
-  public RestView<ChangeResource> list() {
-    throw new NotImplementedException();
-  }
-
-  @Override
-  public ChangeEditResource parse(ChangeResource parent, IdString id) {
-    throw new NotImplementedException();
-  }
-
-  @Override
-  public Publish post(ChangeResource parent) throws RestApiException {
-    return publish;
-  }
-
-  @Singleton
-  public static class Publish
-      extends RetryingRestModifyView<ChangeResource, PublishChangeEditInput, Response<?>> {
-
-    private final ChangeEditUtil editUtil;
-    private final NotifyUtil notifyUtil;
-    private final ContributorAgreementsChecker contributorAgreementsChecker;
-
-    @Inject
-    Publish(
-        RetryHelper retryHelper,
-        ChangeEditUtil editUtil,
-        NotifyUtil notifyUtil,
-        ContributorAgreementsChecker contributorAgreementsChecker) {
-      super(retryHelper);
-      this.editUtil = editUtil;
-      this.notifyUtil = notifyUtil;
-      this.contributorAgreementsChecker = contributorAgreementsChecker;
-    }
-
-    @Override
-    protected Response<?> applyImpl(
-        BatchUpdate.Factory updateFactory, ChangeResource rsrc, PublishChangeEditInput in)
-        throws IOException, OrmException, RestApiException, UpdateException, ConfigInvalidException,
-            NoSuchProjectException {
-      contributorAgreementsChecker.check(rsrc.getProject(), rsrc.getUser());
-      Optional<ChangeEdit> edit = editUtil.byChange(rsrc.getNotes(), rsrc.getUser());
-      if (!edit.isPresent()) {
-        throw new ResourceConflictException(
-            String.format("no edit exists for change %s", rsrc.getChange().getChangeId()));
-      }
-      if (in == null) {
-        in = new PublishChangeEditInput();
-      }
-      editUtil.publish(
-          updateFactory,
-          rsrc.getNotes(),
-          rsrc.getUser(),
-          edit.get(),
-          in.notify,
-          notifyUtil.resolveAccounts(in.notifyDetails));
-      return Response.none();
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PutAssignee.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PutAssignee.java
deleted file mode 100644
index d53c85c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PutAssignee.java
+++ /dev/null
@@ -1,125 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.change;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.api.changes.AddReviewerInput;
-import com.google.gerrit.extensions.api.changes.AssigneeInput;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.client.ReviewerState;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.extensions.webui.UiAction;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountLoader;
-import com.google.gerrit.server.account.AccountsCollection;
-import com.google.gerrit.server.change.PostReviewers.Addition;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.RetryingRestModifyView;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-@Singleton
-public class PutAssignee extends RetryingRestModifyView<ChangeResource, AssigneeInput, AccountInfo>
-    implements UiAction<ChangeResource> {
-
-  private final AccountsCollection accounts;
-  private final SetAssigneeOp.Factory assigneeFactory;
-  private final Provider<ReviewDb> db;
-  private final PostReviewers postReviewers;
-  private final AccountLoader.Factory accountLoaderFactory;
-
-  @Inject
-  PutAssignee(
-      AccountsCollection accounts,
-      SetAssigneeOp.Factory assigneeFactory,
-      RetryHelper retryHelper,
-      Provider<ReviewDb> db,
-      PostReviewers postReviewers,
-      AccountLoader.Factory accountLoaderFactory) {
-    super(retryHelper);
-    this.accounts = accounts;
-    this.assigneeFactory = assigneeFactory;
-    this.db = db;
-    this.postReviewers = postReviewers;
-    this.accountLoaderFactory = accountLoaderFactory;
-  }
-
-  @Override
-  protected AccountInfo applyImpl(
-      BatchUpdate.Factory updateFactory, ChangeResource rsrc, AssigneeInput input)
-      throws RestApiException, UpdateException, OrmException, IOException,
-          PermissionBackendException, ConfigInvalidException {
-    rsrc.permissions().check(ChangePermission.EDIT_ASSIGNEE);
-
-    input.assignee = Strings.nullToEmpty(input.assignee).trim();
-    if (input.assignee.isEmpty()) {
-      throw new BadRequestException("missing assignee field");
-    }
-
-    IdentifiedUser assignee = accounts.parse(input.assignee);
-    if (!assignee.getAccount().isActive()) {
-      throw new UnprocessableEntityException(input.assignee + " is not active");
-    }
-    try {
-      rsrc.permissions().database(db).user(assignee).check(ChangePermission.READ);
-    } catch (AuthException e) {
-      throw new AuthException("read not permitted for " + input.assignee);
-    }
-
-    try (BatchUpdate bu =
-        updateFactory.create(
-            db.get(), rsrc.getChange().getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
-      SetAssigneeOp op = assigneeFactory.create(assignee);
-      bu.addOp(rsrc.getId(), op);
-
-      PostReviewers.Addition reviewersAddition = addAssigneeAsCC(rsrc, input.assignee);
-      bu.addOp(rsrc.getId(), reviewersAddition.op);
-
-      bu.execute();
-      return accountLoaderFactory.create(true).fillOne(assignee.getAccountId());
-    }
-  }
-
-  private Addition addAssigneeAsCC(ChangeResource rsrc, String assignee)
-      throws OrmException, IOException, PermissionBackendException, ConfigInvalidException {
-    AddReviewerInput reviewerInput = new AddReviewerInput();
-    reviewerInput.reviewer = assignee;
-    reviewerInput.state = ReviewerState.CC;
-    reviewerInput.confirmed = true;
-    reviewerInput.notify = NotifyHandling.NONE;
-    return postReviewers.prepareApplication(rsrc, reviewerInput, false);
-  }
-
-  @Override
-  public UiAction.Description getDescription(ChangeResource rsrc) {
-    return new UiAction.Description()
-        .setLabel("Edit Assignee")
-        .setVisible(rsrc.permissions().testCond(ChangePermission.EDIT_ASSIGNEE));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PutDescription.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PutDescription.java
deleted file mode 100644
index 4c9cf23..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PutDescription.java
+++ /dev/null
@@ -1,134 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.change;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.restapi.DefaultInput;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.webui.UiAction;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.notedb.ChangeUpdate;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.RetryingRestModifyView;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.Collections;
-
-@Singleton
-public class PutDescription
-    extends RetryingRestModifyView<RevisionResource, PutDescription.Input, Response<String>>
-    implements UiAction<RevisionResource> {
-  private final Provider<ReviewDb> dbProvider;
-  private final ChangeMessagesUtil cmUtil;
-  private final PatchSetUtil psUtil;
-
-  public static class Input {
-    @DefaultInput public String description;
-  }
-
-  @Inject
-  PutDescription(
-      Provider<ReviewDb> dbProvider,
-      ChangeMessagesUtil cmUtil,
-      RetryHelper retryHelper,
-      PatchSetUtil psUtil) {
-    super(retryHelper);
-    this.dbProvider = dbProvider;
-    this.cmUtil = cmUtil;
-    this.psUtil = psUtil;
-  }
-
-  @Override
-  protected Response<String> applyImpl(
-      BatchUpdate.Factory updateFactory, RevisionResource rsrc, Input input)
-      throws UpdateException, RestApiException, PermissionBackendException {
-    rsrc.permissions().check(ChangePermission.EDIT_DESCRIPTION);
-
-    Op op = new Op(input != null ? input : new Input(), rsrc.getPatchSet().getId());
-    try (BatchUpdate u =
-        updateFactory.create(
-            dbProvider.get(), rsrc.getChange().getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
-      u.addOp(rsrc.getChange().getId(), op);
-      u.execute();
-    }
-    return Strings.isNullOrEmpty(op.newDescription)
-        ? Response.none()
-        : Response.ok(op.newDescription);
-  }
-
-  private class Op implements BatchUpdateOp {
-    private final Input input;
-    private final PatchSet.Id psId;
-
-    private String oldDescription;
-    private String newDescription;
-
-    Op(Input input, PatchSet.Id psId) {
-      this.input = input;
-      this.psId = psId;
-    }
-
-    @Override
-    public boolean updateChange(ChangeContext ctx) throws OrmException {
-      PatchSet ps = psUtil.get(ctx.getDb(), ctx.getNotes(), psId);
-      ChangeUpdate update = ctx.getUpdate(psId);
-      newDescription = Strings.nullToEmpty(input.description);
-      oldDescription = Strings.nullToEmpty(ps.getDescription());
-      if (oldDescription.equals(newDescription)) {
-        return false;
-      }
-      String summary;
-      if (oldDescription.isEmpty()) {
-        summary = "Description set to \"" + newDescription + "\"";
-      } else if (newDescription.isEmpty()) {
-        summary = "Description \"" + oldDescription + "\" removed";
-      } else {
-        summary = "Description changed to \"" + newDescription + "\"";
-      }
-
-      ps.setDescription(newDescription);
-      update.setPsDescription(newDescription);
-
-      ctx.getDb().patchSets().update(Collections.singleton(ps));
-
-      ChangeMessage cmsg =
-          ChangeMessagesUtil.newMessage(
-              psId, ctx.getUser(), ctx.getWhen(), summary, ChangeMessagesUtil.TAG_SET_DESCRIPTION);
-      cmUtil.addChangeMessage(ctx.getDb(), update, cmsg);
-      return true;
-    }
-  }
-
-  @Override
-  public UiAction.Description getDescription(RevisionResource rsrc) {
-    return new UiAction.Description()
-        .setLabel("Edit Description")
-        .setVisible(rsrc.permissions().testCond(ChangePermission.EDIT_DESCRIPTION));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PutDraftComment.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PutDraftComment.java
deleted file mode 100644
index ca170df..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PutDraftComment.java
+++ /dev/null
@@ -1,175 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.change;
-
-import static com.google.gerrit.server.CommentsUtil.setCommentRevId;
-
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.api.changes.DraftInput;
-import com.google.gerrit.extensions.common.CommentInfo;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.Url;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.PatchLineComment.Status;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CommentsUtil;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.notedb.ChangeUpdate;
-import com.google.gerrit.server.patch.PatchListCache;
-import com.google.gerrit.server.patch.PatchListNotAvailableException;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.RetryingRestModifyView;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.sql.Timestamp;
-import java.util.Collections;
-import java.util.Optional;
-
-@Singleton
-public class PutDraftComment
-    extends RetryingRestModifyView<DraftCommentResource, DraftInput, Response<CommentInfo>> {
-
-  private final Provider<ReviewDb> db;
-  private final DeleteDraftComment delete;
-  private final CommentsUtil commentsUtil;
-  private final PatchSetUtil psUtil;
-  private final Provider<CommentJson> commentJson;
-  private final PatchListCache patchListCache;
-
-  @Inject
-  PutDraftComment(
-      Provider<ReviewDb> db,
-      DeleteDraftComment delete,
-      CommentsUtil commentsUtil,
-      PatchSetUtil psUtil,
-      RetryHelper retryHelper,
-      Provider<CommentJson> commentJson,
-      PatchListCache patchListCache) {
-    super(retryHelper);
-    this.db = db;
-    this.delete = delete;
-    this.commentsUtil = commentsUtil;
-    this.psUtil = psUtil;
-    this.commentJson = commentJson;
-    this.patchListCache = patchListCache;
-  }
-
-  @Override
-  protected Response<CommentInfo> applyImpl(
-      BatchUpdate.Factory updateFactory, DraftCommentResource rsrc, DraftInput in)
-      throws RestApiException, UpdateException, OrmException {
-    if (in == null || in.message == null || in.message.trim().isEmpty()) {
-      return delete.applyImpl(updateFactory, rsrc, null);
-    } else if (in.id != null && !rsrc.getId().equals(in.id)) {
-      throw new BadRequestException("id must match URL");
-    } else if (in.line != null && in.line < 0) {
-      throw new BadRequestException("line must be >= 0");
-    } else if (in.line != null && in.range != null && in.line != in.range.endLine) {
-      throw new BadRequestException("range endLine must be on the same line as the comment");
-    }
-
-    try (BatchUpdate bu =
-        updateFactory.create(
-            db.get(), rsrc.getChange().getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
-      Op op = new Op(rsrc.getComment().key, in);
-      bu.addOp(rsrc.getChange().getId(), op);
-      bu.execute();
-      return Response.ok(
-          commentJson.get().setFillAccounts(false).newCommentFormatter().format(op.comment));
-    }
-  }
-
-  private class Op implements BatchUpdateOp {
-    private final Comment.Key key;
-    private final DraftInput in;
-
-    private Comment comment;
-
-    private Op(Comment.Key key, DraftInput in) {
-      this.key = key;
-      this.in = in;
-    }
-
-    @Override
-    public boolean updateChange(ChangeContext ctx)
-        throws ResourceNotFoundException, OrmException, PatchListNotAvailableException {
-      Optional<Comment> maybeComment =
-          commentsUtil.getDraft(ctx.getDb(), ctx.getNotes(), ctx.getIdentifiedUser(), key);
-      if (!maybeComment.isPresent()) {
-        // Disappeared out from under us. Can't easily fall back to insert,
-        // because the input might be missing required fields. Just give up.
-        throw new ResourceNotFoundException("comment not found: " + key);
-      }
-      Comment origComment = maybeComment.get();
-      comment = new Comment(origComment);
-      // Copy constructor preserved old real author; replace with current real
-      // user.
-      ctx.getUser().updateRealAccountId(comment::setRealAuthor);
-
-      PatchSet.Id psId = new PatchSet.Id(ctx.getChange().getId(), origComment.key.patchSetId);
-      ChangeUpdate update = ctx.getUpdate(psId);
-
-      PatchSet ps = psUtil.get(ctx.getDb(), ctx.getNotes(), psId);
-      if (ps == null) {
-        throw new ResourceNotFoundException("patch set not found: " + psId);
-      }
-      if (in.path != null && !in.path.equals(origComment.key.filename)) {
-        // Updating the path alters the primary key, which isn't possible.
-        // Delete then recreate the comment instead of an update.
-
-        commentsUtil.deleteComments(ctx.getDb(), update, Collections.singleton(origComment));
-        comment.key.filename = in.path;
-      }
-      setCommentRevId(comment, patchListCache, ctx.getChange(), ps);
-      commentsUtil.putComments(
-          ctx.getDb(),
-          update,
-          Status.DRAFT,
-          Collections.singleton(update(comment, in, ctx.getWhen())));
-      ctx.dontBumpLastUpdatedOn();
-      return true;
-    }
-  }
-
-  private static Comment update(Comment e, DraftInput in, Timestamp when) {
-    if (in.side != null) {
-      e.side = in.side();
-    }
-    if (in.inReplyTo != null) {
-      e.parentUuid = Url.decode(in.inReplyTo);
-    }
-    e.setLineNbrAndRange(in.line, in.range);
-    e.message = in.message.trim();
-    e.writtenOn = when;
-    if (in.tag != null) {
-      // TODO(dborowitz): Can we support changing tags via PUT?
-      e.tag = in.tag;
-    }
-    if (in.unresolved != null) {
-      e.unresolved = in.unresolved;
-    }
-    return e;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PutMessage.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PutMessage.java
deleted file mode 100644
index a577004..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PutMessage.java
+++ /dev/null
@@ -1,214 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.change;
-
-import com.google.gerrit.common.FooterConstants;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.common.CommitMessageInput;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ChangeUtil;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.edit.UnchangedCommitMessageException;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.RetryingRestModifyView;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gerrit.server.util.CommitMessageUtil;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.List;
-import java.util.TimeZone;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-@Singleton
-public class PutMessage
-    extends RetryingRestModifyView<ChangeResource, CommitMessageInput, Response<?>> {
-
-  private final GitRepositoryManager repositoryManager;
-  private final Provider<CurrentUser> currentUserProvider;
-  private final Provider<ReviewDb> db;
-  private final TimeZone tz;
-  private final PatchSetInserter.Factory psInserterFactory;
-  private final PermissionBackend permissionBackend;
-  private final PatchSetUtil psUtil;
-  private final NotifyUtil notifyUtil;
-  private final ProjectCache projectCache;
-
-  @Inject
-  PutMessage(
-      RetryHelper retryHelper,
-      GitRepositoryManager repositoryManager,
-      Provider<CurrentUser> currentUserProvider,
-      Provider<ReviewDb> db,
-      PatchSetInserter.Factory psInserterFactory,
-      PermissionBackend permissionBackend,
-      @GerritPersonIdent PersonIdent gerritIdent,
-      PatchSetUtil psUtil,
-      NotifyUtil notifyUtil,
-      ProjectCache projectCache) {
-    super(retryHelper);
-    this.repositoryManager = repositoryManager;
-    this.currentUserProvider = currentUserProvider;
-    this.db = db;
-    this.psInserterFactory = psInserterFactory;
-    this.tz = gerritIdent.getTimeZone();
-    this.permissionBackend = permissionBackend;
-    this.psUtil = psUtil;
-    this.notifyUtil = notifyUtil;
-    this.projectCache = projectCache;
-  }
-
-  @Override
-  protected Response<String> applyImpl(
-      BatchUpdate.Factory updateFactory, ChangeResource resource, CommitMessageInput input)
-      throws IOException, UnchangedCommitMessageException, RestApiException, UpdateException,
-          PermissionBackendException, OrmException, ConfigInvalidException {
-    PatchSet ps = psUtil.current(db.get(), resource.getNotes());
-    if (ps == null) {
-      throw new ResourceConflictException("current revision is missing");
-    }
-
-    if (input == null) {
-      throw new BadRequestException("input cannot be null");
-    }
-    String sanitizedCommitMessage = CommitMessageUtil.checkAndSanitizeCommitMessage(input.message);
-
-    ensureCanEditCommitMessage(resource.getNotes());
-    ensureChangeIdIsCorrect(
-        projectCache.checkedGet(resource.getProject()).isRequireChangeID(),
-        resource.getChange().getKey().get(),
-        sanitizedCommitMessage);
-
-    NotifyHandling notify = input.notify;
-    if (notify == null) {
-      notify = resource.getChange().isWorkInProgress() ? NotifyHandling.OWNER : NotifyHandling.ALL;
-    }
-
-    try (Repository repository = repositoryManager.openRepository(resource.getProject());
-        RevWalk revWalk = new RevWalk(repository);
-        ObjectInserter objectInserter = repository.newObjectInserter()) {
-      RevCommit patchSetCommit = revWalk.parseCommit(ObjectId.fromString(ps.getRevision().get()));
-
-      String currentCommitMessage = patchSetCommit.getFullMessage();
-      if (input.message.equals(currentCommitMessage)) {
-        throw new ResourceConflictException("new and existing commit message are the same");
-      }
-
-      Timestamp ts = TimeUtil.nowTs();
-      try (BatchUpdate bu =
-          updateFactory.create(
-              db.get(), resource.getChange().getProject(), currentUserProvider.get(), ts)) {
-        // Ensure that BatchUpdate will update the same repo
-        bu.setRepository(repository, new RevWalk(objectInserter.newReader()), objectInserter);
-
-        PatchSet.Id psId = ChangeUtil.nextPatchSetId(repository, ps.getId());
-        ObjectId newCommit =
-            createCommit(objectInserter, patchSetCommit, sanitizedCommitMessage, ts);
-        PatchSetInserter inserter = psInserterFactory.create(resource.getNotes(), psId, newCommit);
-        inserter.setMessage(
-            String.format("Patch Set %s: Commit message was updated.", psId.getId()));
-        inserter.setDescription("Edit commit message");
-        inserter.setNotify(notify);
-        inserter.setAccountsToNotify(notifyUtil.resolveAccounts(input.notifyDetails));
-        bu.addOp(resource.getChange().getId(), inserter);
-        bu.execute();
-      }
-    }
-    return Response.ok("ok");
-  }
-
-  private ObjectId createCommit(
-      ObjectInserter objectInserter,
-      RevCommit basePatchSetCommit,
-      String commitMessage,
-      Timestamp timestamp)
-      throws IOException {
-    CommitBuilder builder = new CommitBuilder();
-    builder.setTreeId(basePatchSetCommit.getTree());
-    builder.setParentIds(basePatchSetCommit.getParents());
-    builder.setAuthor(basePatchSetCommit.getAuthorIdent());
-    builder.setCommitter(
-        currentUserProvider.get().asIdentifiedUser().newCommitterIdent(timestamp, tz));
-    builder.setMessage(commitMessage);
-    ObjectId newCommitId = objectInserter.insert(builder);
-    objectInserter.flush();
-    return newCommitId;
-  }
-
-  private void ensureCanEditCommitMessage(ChangeNotes changeNotes)
-      throws AuthException, PermissionBackendException {
-    if (!currentUserProvider.get().isIdentifiedUser()) {
-      throw new AuthException("Authentication required");
-    }
-    try {
-      permissionBackend
-          .user(currentUserProvider.get())
-          .database(db.get())
-          .change(changeNotes)
-          .check(ChangePermission.ADD_PATCH_SET);
-    } catch (AuthException denied) {
-      throw new AuthException("modifying commit message not permitted", denied);
-    }
-  }
-
-  private static void ensureChangeIdIsCorrect(
-      boolean requireChangeId, String currentChangeId, String newCommitMessage)
-      throws ResourceConflictException, BadRequestException {
-    RevCommit revCommit =
-        RevCommit.parse(
-            Constants.encode("tree " + ObjectId.zeroId().name() + "\n\n" + newCommitMessage));
-
-    // Check that the commit message without footers is not empty
-    CommitMessageUtil.checkAndSanitizeCommitMessage(revCommit.getShortMessage());
-
-    List<String> changeIdFooters = revCommit.getFooterLines(FooterConstants.CHANGE_ID);
-    if (requireChangeId && changeIdFooters.isEmpty()) {
-      throw new ResourceConflictException("missing Change-Id footer");
-    }
-    if (!changeIdFooters.isEmpty() && !changeIdFooters.get(0).equals(currentChangeId)) {
-      throw new ResourceConflictException("wrong Change-Id footer");
-    }
-    if (changeIdFooters.size() > 1) {
-      throw new ResourceConflictException("multiple Change-Id footers");
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PutTopic.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PutTopic.java
deleted file mode 100644
index 8b5608b..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PutTopic.java
+++ /dev/null
@@ -1,143 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.change;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.DefaultInput;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.webui.UiAction;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.ChangeUtil;
-import com.google.gerrit.server.change.PutTopic.Input;
-import com.google.gerrit.server.extensions.events.TopicEdited;
-import com.google.gerrit.server.notedb.ChangeUpdate;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.Context;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.RetryingRestModifyView;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-
-@Singleton
-public class PutTopic extends RetryingRestModifyView<ChangeResource, Input, Response<String>>
-    implements UiAction<ChangeResource> {
-  private final Provider<ReviewDb> dbProvider;
-  private final ChangeMessagesUtil cmUtil;
-  private final TopicEdited topicEdited;
-
-  public static class Input {
-    @DefaultInput public String topic;
-  }
-
-  @Inject
-  PutTopic(
-      Provider<ReviewDb> dbProvider,
-      ChangeMessagesUtil cmUtil,
-      RetryHelper retryHelper,
-      TopicEdited topicEdited) {
-    super(retryHelper);
-    this.dbProvider = dbProvider;
-    this.cmUtil = cmUtil;
-    this.topicEdited = topicEdited;
-  }
-
-  @Override
-  protected Response<String> applyImpl(
-      BatchUpdate.Factory updateFactory, ChangeResource req, Input input)
-      throws UpdateException, RestApiException, PermissionBackendException {
-    req.permissions().check(ChangePermission.EDIT_TOPIC_NAME);
-
-    if (input != null
-        && input.topic != null
-        && input.topic.length() > ChangeUtil.TOPIC_MAX_LENGTH) {
-      throw new BadRequestException(
-          String.format("topic length exceeds the limit (%s)", ChangeUtil.TOPIC_MAX_LENGTH));
-    }
-
-    Op op = new Op(input != null ? input : new Input());
-    try (BatchUpdate u =
-        updateFactory.create(
-            dbProvider.get(), req.getChange().getProject(), req.getUser(), TimeUtil.nowTs())) {
-      u.addOp(req.getId(), op);
-      u.execute();
-    }
-    return Strings.isNullOrEmpty(op.newTopicName) ? Response.none() : Response.ok(op.newTopicName);
-  }
-
-  private class Op implements BatchUpdateOp {
-    private final Input input;
-
-    private Change change;
-    private String oldTopicName;
-    private String newTopicName;
-
-    Op(Input input) {
-      this.input = input;
-    }
-
-    @Override
-    public boolean updateChange(ChangeContext ctx) throws OrmException {
-      change = ctx.getChange();
-      ChangeUpdate update = ctx.getUpdate(change.currentPatchSetId());
-      newTopicName = Strings.nullToEmpty(input.topic);
-      oldTopicName = Strings.nullToEmpty(change.getTopic());
-      if (oldTopicName.equals(newTopicName)) {
-        return false;
-      }
-      String summary;
-      if (oldTopicName.isEmpty()) {
-        summary = "Topic set to " + newTopicName;
-      } else if (newTopicName.isEmpty()) {
-        summary = "Topic " + oldTopicName + " removed";
-      } else {
-        summary = String.format("Topic changed from %s to %s", oldTopicName, newTopicName);
-      }
-      change.setTopic(Strings.emptyToNull(newTopicName));
-      update.setTopic(change.getTopic());
-
-      ChangeMessage cmsg =
-          ChangeMessagesUtil.newMessage(ctx, summary, ChangeMessagesUtil.TAG_SET_TOPIC);
-      cmUtil.addChangeMessage(ctx.getDb(), update, cmsg);
-      return true;
-    }
-
-    @Override
-    public void postUpdate(Context ctx) {
-      if (change != null) {
-        topicEdited.fire(change, ctx.getAccount(), oldTopicName, ctx.getWhen());
-      }
-    }
-  }
-
-  @Override
-  public UiAction.Description getDescription(ChangeResource rsrc) {
-    return new UiAction.Description()
-        .setLabel("Edit Topic")
-        .setVisible(rsrc.permissions().testCond(ChangePermission.EDIT_TOPIC_NAME));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Rebase.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Rebase.java
deleted file mode 100644
index 59ab190..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Rebase.java
+++ /dev/null
@@ -1,249 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.change;
-
-import static com.google.gerrit.extensions.conditions.BooleanCondition.and;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Sets;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.common.errors.EmailException;
-import com.google.gerrit.extensions.api.changes.RebaseInput;
-import com.google.gerrit.extensions.client.ListChangesOption;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.conditions.BooleanCondition;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.webui.UiAction;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Change.Status;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ChangeUtil;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.change.RebaseUtil.Base;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.RetryingRestModifyView;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class Rebase extends RetryingRestModifyView<RevisionResource, RebaseInput, ChangeInfo>
-    implements RestModifyView<RevisionResource, RebaseInput>, UiAction<RevisionResource> {
-  private static final Logger log = LoggerFactory.getLogger(Rebase.class);
-  private static final ImmutableSet<ListChangesOption> OPTIONS =
-      Sets.immutableEnumSet(ListChangesOption.CURRENT_REVISION, ListChangesOption.CURRENT_COMMIT);
-
-  private final GitRepositoryManager repoManager;
-  private final RebaseChangeOp.Factory rebaseFactory;
-  private final RebaseUtil rebaseUtil;
-  private final ChangeJson.Factory json;
-  private final Provider<ReviewDb> dbProvider;
-  private final PermissionBackend permissionBackend;
-
-  @Inject
-  public Rebase(
-      RetryHelper retryHelper,
-      GitRepositoryManager repoManager,
-      RebaseChangeOp.Factory rebaseFactory,
-      RebaseUtil rebaseUtil,
-      ChangeJson.Factory json,
-      Provider<ReviewDb> dbProvider,
-      PermissionBackend permissionBackend) {
-    super(retryHelper);
-    this.repoManager = repoManager;
-    this.rebaseFactory = rebaseFactory;
-    this.rebaseUtil = rebaseUtil;
-    this.json = json;
-    this.dbProvider = dbProvider;
-    this.permissionBackend = permissionBackend;
-  }
-
-  @Override
-  protected ChangeInfo applyImpl(
-      BatchUpdate.Factory updateFactory, RevisionResource rsrc, RebaseInput input)
-      throws EmailException, OrmException, UpdateException, RestApiException, IOException,
-          NoSuchChangeException, PermissionBackendException {
-    rsrc.permissions().database(dbProvider).check(ChangePermission.REBASE);
-
-    Change change = rsrc.getChange();
-    try (Repository repo = repoManager.openRepository(change.getProject());
-        ObjectInserter oi = repo.newObjectInserter();
-        ObjectReader reader = oi.newReader();
-        RevWalk rw = new RevWalk(reader);
-        BatchUpdate bu =
-            updateFactory.create(
-                dbProvider.get(), change.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
-      if (!change.getStatus().isOpen()) {
-        throw new ResourceConflictException("change is " + ChangeUtil.status(change));
-      } else if (!hasOneParent(rw, rsrc.getPatchSet())) {
-        throw new ResourceConflictException(
-            "cannot rebase merge commits or commit with no ancestor");
-      }
-      bu.setRepository(repo, rw, oi);
-      bu.addOp(
-          change.getId(),
-          rebaseFactory
-              .create(rsrc.getNotes(), rsrc.getPatchSet(), findBaseRev(repo, rw, rsrc, input))
-              .setForceContentMerge(true)
-              .setFireRevisionCreated(true));
-      bu.execute();
-    }
-    return json.create(OPTIONS).format(change.getProject(), change.getId());
-  }
-
-  private ObjectId findBaseRev(
-      Repository repo, RevWalk rw, RevisionResource rsrc, RebaseInput input)
-      throws RestApiException, OrmException, IOException, NoSuchChangeException, AuthException,
-          PermissionBackendException {
-    Branch.NameKey destRefKey = rsrc.getChange().getDest();
-    if (input == null || input.base == null) {
-      return rebaseUtil.findBaseRevision(rsrc.getPatchSet(), destRefKey, repo, rw);
-    }
-
-    Change change = rsrc.getChange();
-    String str = input.base.trim();
-    if (str.equals("")) {
-      // Remove existing dependency to other patch set.
-      Ref destRef = repo.exactRef(destRefKey.get());
-      if (destRef == null) {
-        throw new ResourceConflictException(
-            "can't rebase onto tip of branch " + destRefKey.get() + "; branch doesn't exist");
-      }
-      return destRef.getObjectId();
-    }
-
-    Base base = rebaseUtil.parseBase(rsrc, str);
-    if (base == null) {
-      throw new ResourceConflictException("base revision is missing: " + str);
-    }
-    PatchSet.Id baseId = base.patchSet().getId();
-    if (change.getId().equals(baseId.getParentKey())) {
-      throw new ResourceConflictException("cannot rebase change onto itself");
-    }
-
-    permissionBackend
-        .user(rsrc.getUser())
-        .database(dbProvider)
-        .change(base.notes())
-        .check(ChangePermission.READ);
-
-    Change baseChange = base.notes().getChange();
-    if (!baseChange.getProject().equals(change.getProject())) {
-      throw new ResourceConflictException(
-          "base change is in wrong project: " + baseChange.getProject());
-    } else if (!baseChange.getDest().equals(change.getDest())) {
-      throw new ResourceConflictException(
-          "base change is targeting wrong branch: " + baseChange.getDest());
-    } else if (baseChange.getStatus() == Status.ABANDONED) {
-      throw new ResourceConflictException("base change is abandoned: " + baseChange.getKey());
-    } else if (isMergedInto(rw, rsrc.getPatchSet(), base.patchSet())) {
-      throw new ResourceConflictException(
-          "base change "
-              + baseChange.getKey()
-              + " is a descendant of the current change - recursion not allowed");
-    }
-    return ObjectId.fromString(base.patchSet().getRevision().get());
-  }
-
-  private boolean isMergedInto(RevWalk rw, PatchSet base, PatchSet tip) throws IOException {
-    ObjectId baseId = ObjectId.fromString(base.getRevision().get());
-    ObjectId tipId = ObjectId.fromString(tip.getRevision().get());
-    return rw.isMergedInto(rw.parseCommit(baseId), rw.parseCommit(tipId));
-  }
-
-  private boolean hasOneParent(RevWalk rw, PatchSet ps) throws IOException {
-    // Prevent rebase of exotic changes (merge commit, no ancestor).
-    RevCommit c = rw.parseCommit(ObjectId.fromString(ps.getRevision().get()));
-    return c.getParentCount() == 1;
-  }
-
-  @Override
-  public UiAction.Description getDescription(RevisionResource resource) {
-    PatchSet patchSet = resource.getPatchSet();
-    Change change = resource.getChange();
-    Branch.NameKey dest = change.getDest();
-    boolean visible = change.getStatus().isOpen() && resource.isCurrent();
-    boolean enabled = false;
-
-    if (visible) {
-      try (Repository repo = repoManager.openRepository(dest.getParentKey());
-          RevWalk rw = new RevWalk(repo)) {
-        visible = hasOneParent(rw, resource.getPatchSet());
-        if (visible) {
-          enabled = rebaseUtil.canRebase(patchSet, dest, repo, rw);
-        }
-      } catch (IOException e) {
-        log.error("Failed to check if patch set can be rebased: " + resource.getPatchSet(), e);
-        visible = false;
-      }
-    }
-
-    BooleanCondition permissionCond =
-        resource.permissions().database(dbProvider).testCond(ChangePermission.REBASE);
-    return new UiAction.Description()
-        .setLabel("Rebase")
-        .setTitle("Rebase onto tip of branch or parent change")
-        .setVisible(and(visible, permissionCond))
-        .setEnabled(and(enabled, permissionCond));
-  }
-
-  public static class CurrentRevision
-      extends RetryingRestModifyView<ChangeResource, RebaseInput, ChangeInfo> {
-    private final PatchSetUtil psUtil;
-    private final Rebase rebase;
-
-    @Inject
-    CurrentRevision(RetryHelper retryHelper, PatchSetUtil psUtil, Rebase rebase) {
-      super(retryHelper);
-      this.psUtil = psUtil;
-      this.rebase = rebase;
-    }
-
-    @Override
-    protected ChangeInfo applyImpl(
-        BatchUpdate.Factory updateFactory, ChangeResource rsrc, RebaseInput input)
-        throws EmailException, OrmException, UpdateException, RestApiException, IOException,
-            PermissionBackendException {
-      PatchSet ps = psUtil.current(rebase.dbProvider.get(), rsrc.getNotes());
-      if (ps == null) {
-        throw new ResourceConflictException("current revision is missing");
-      }
-      return rebase.applyImpl(updateFactory, new RevisionResource(rsrc, ps), input);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/RebaseChangeEdit.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/RebaseChangeEdit.java
deleted file mode 100644
index 38a695a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/RebaseChangeEdit.java
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AcceptsPost;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ChildCollection;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.NotImplementedException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.edit.ChangeEditModifier;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.InvalidChangeOperationException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.eclipse.jgit.lib.Repository;
-
-@Singleton
-public class RebaseChangeEdit
-    implements ChildCollection<ChangeResource, ChangeEditResource>, AcceptsPost<ChangeResource> {
-
-  private final Rebase rebase;
-
-  @Inject
-  RebaseChangeEdit(Rebase rebase) {
-    this.rebase = rebase;
-  }
-
-  @Override
-  public DynamicMap<RestView<ChangeEditResource>> views() {
-    throw new NotImplementedException();
-  }
-
-  @Override
-  public RestView<ChangeResource> list() {
-    throw new NotImplementedException();
-  }
-
-  @Override
-  public ChangeEditResource parse(ChangeResource parent, IdString id) {
-    throw new NotImplementedException();
-  }
-
-  @Override
-  public Rebase post(ChangeResource parent) throws RestApiException {
-    return rebase;
-  }
-
-  @Singleton
-  public static class Rebase implements RestModifyView<ChangeResource, Rebase.Input> {
-    public static class Input {}
-
-    private final GitRepositoryManager repositoryManager;
-    private final ChangeEditModifier editModifier;
-
-    @Inject
-    Rebase(GitRepositoryManager repositoryManager, ChangeEditModifier editModifier) {
-      this.repositoryManager = repositoryManager;
-      this.editModifier = editModifier;
-    }
-
-    @Override
-    public Response<?> apply(ChangeResource rsrc, Rebase.Input in)
-        throws AuthException, ResourceConflictException, IOException, OrmException,
-            PermissionBackendException {
-      Project.NameKey project = rsrc.getProject();
-      try (Repository repository = repositoryManager.openRepository(project)) {
-        editModifier.rebaseEdit(repository, rsrc.getNotes());
-      } catch (InvalidChangeOperationException e) {
-        throw new ResourceConflictException(e.getMessage());
-      }
-      return Response.none();
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/RebaseChangeOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/RebaseChangeOp.java
deleted file mode 100644
index 909ea3a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/RebaseChangeOp.java
+++ /dev/null
@@ -1,292 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.change;
-
-import static com.google.common.base.Preconditions.checkState;
-
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.restapi.MergeConflictException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.RevId;
-import com.google.gerrit.server.ChangeUtil;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.change.RebaseUtil.Base;
-import com.google.gerrit.server.git.MergeUtil;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.InvalidChangeOperationException;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.Context;
-import com.google.gerrit.server.update.RepoContext;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.merge.ThreeWayMerger;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-public class RebaseChangeOp implements BatchUpdateOp {
-  public interface Factory {
-    RebaseChangeOp create(ChangeNotes notes, PatchSet originalPatchSet, ObjectId baseCommitId);
-  }
-
-  private final PatchSetInserter.Factory patchSetInserterFactory;
-  private final MergeUtil.Factory mergeUtilFactory;
-  private final RebaseUtil rebaseUtil;
-  private final ChangeResource.Factory changeResourceFactory;
-
-  private final ChangeNotes notes;
-  private final PatchSet originalPatchSet;
-  private final IdentifiedUser.GenericFactory identifiedUserFactory;
-  private final ProjectCache projectCache;
-
-  private ObjectId baseCommitId;
-  private PersonIdent committerIdent;
-  private boolean fireRevisionCreated = true;
-  private boolean validate = true;
-  private boolean checkAddPatchSetPermission = true;
-  private boolean forceContentMerge;
-  private boolean copyApprovals = true;
-  private boolean detailedCommitMessage;
-  private boolean postMessage = true;
-  private boolean matchAuthorToCommitterDate = false;
-
-  private RevCommit rebasedCommit;
-  private PatchSet.Id rebasedPatchSetId;
-  private PatchSetInserter patchSetInserter;
-  private PatchSet rebasedPatchSet;
-
-  @Inject
-  RebaseChangeOp(
-      PatchSetInserter.Factory patchSetInserterFactory,
-      MergeUtil.Factory mergeUtilFactory,
-      RebaseUtil rebaseUtil,
-      ChangeResource.Factory changeResourceFactory,
-      IdentifiedUser.GenericFactory identifiedUserFactory,
-      ProjectCache projectCache,
-      @Assisted ChangeNotes notes,
-      @Assisted PatchSet originalPatchSet,
-      @Assisted ObjectId baseCommitId) {
-    this.patchSetInserterFactory = patchSetInserterFactory;
-    this.mergeUtilFactory = mergeUtilFactory;
-    this.rebaseUtil = rebaseUtil;
-    this.changeResourceFactory = changeResourceFactory;
-    this.identifiedUserFactory = identifiedUserFactory;
-    this.projectCache = projectCache;
-    this.notes = notes;
-    this.originalPatchSet = originalPatchSet;
-    this.baseCommitId = baseCommitId;
-  }
-
-  public RebaseChangeOp setCommitterIdent(PersonIdent committerIdent) {
-    this.committerIdent = committerIdent;
-    return this;
-  }
-
-  public RebaseChangeOp setValidate(boolean validate) {
-    this.validate = validate;
-    return this;
-  }
-
-  public RebaseChangeOp setCheckAddPatchSetPermission(boolean checkAddPatchSetPermission) {
-    this.checkAddPatchSetPermission = checkAddPatchSetPermission;
-    return this;
-  }
-
-  public RebaseChangeOp setFireRevisionCreated(boolean fireRevisionCreated) {
-    this.fireRevisionCreated = fireRevisionCreated;
-    return this;
-  }
-
-  public RebaseChangeOp setForceContentMerge(boolean forceContentMerge) {
-    this.forceContentMerge = forceContentMerge;
-    return this;
-  }
-
-  public RebaseChangeOp setCopyApprovals(boolean copyApprovals) {
-    this.copyApprovals = copyApprovals;
-    return this;
-  }
-
-  public RebaseChangeOp setDetailedCommitMessage(boolean detailedCommitMessage) {
-    this.detailedCommitMessage = detailedCommitMessage;
-    return this;
-  }
-
-  public RebaseChangeOp setPostMessage(boolean postMessage) {
-    this.postMessage = postMessage;
-    return this;
-  }
-
-  public RebaseChangeOp setMatchAuthorToCommitterDate(boolean matchAuthorToCommitterDate) {
-    this.matchAuthorToCommitterDate = matchAuthorToCommitterDate;
-    return this;
-  }
-
-  @Override
-  public void updateRepo(RepoContext ctx)
-      throws MergeConflictException, InvalidChangeOperationException, RestApiException, IOException,
-          OrmException, NoSuchChangeException, PermissionBackendException {
-    // Ok that originalPatchSet was not read in a transaction, since we just
-    // need its revision.
-    RevId oldRev = originalPatchSet.getRevision();
-
-    RevWalk rw = ctx.getRevWalk();
-    RevCommit original = rw.parseCommit(ObjectId.fromString(oldRev.get()));
-    rw.parseBody(original);
-    RevCommit baseCommit = rw.parseCommit(baseCommitId);
-    CurrentUser changeOwner = identifiedUserFactory.create(notes.getChange().getOwner());
-
-    String newCommitMessage;
-    if (detailedCommitMessage) {
-      rw.parseBody(baseCommit);
-      newCommitMessage =
-          newMergeUtil()
-              .createCommitMessageOnSubmit(
-                  original, baseCommit, notes, changeOwner, originalPatchSet.getId());
-    } else {
-      newCommitMessage = original.getFullMessage();
-    }
-
-    rebasedCommit = rebaseCommit(ctx, original, baseCommit, newCommitMessage);
-    Base base =
-        rebaseUtil.parseBase(
-            new RevisionResource(
-                changeResourceFactory.create(notes, changeOwner), originalPatchSet),
-            baseCommitId.name());
-
-    rebasedPatchSetId =
-        ChangeUtil.nextPatchSetIdFromChangeRefsMap(
-            ctx.getRepoView().getRefs(originalPatchSet.getId().getParentKey().toRefPrefix()),
-            notes.getChange().currentPatchSetId());
-    patchSetInserter =
-        patchSetInserterFactory
-            .create(notes, rebasedPatchSetId, rebasedCommit)
-            .setDescription("Rebase")
-            .setNotify(NotifyHandling.NONE)
-            .setFireRevisionCreated(fireRevisionCreated)
-            .setCopyApprovals(copyApprovals)
-            .setCheckAddPatchSetPermission(checkAddPatchSetPermission)
-            .setValidate(validate);
-    if (postMessage) {
-      patchSetInserter.setMessage(
-          "Patch Set "
-              + rebasedPatchSetId.get()
-              + ": Patch Set "
-              + originalPatchSet.getId().get()
-              + " was rebased");
-    }
-
-    if (base != null) {
-      patchSetInserter.setGroups(base.patchSet().getGroups());
-    }
-    patchSetInserter.updateRepo(ctx);
-  }
-
-  @Override
-  public boolean updateChange(ChangeContext ctx)
-      throws ResourceConflictException, OrmException, IOException {
-    boolean ret = patchSetInserter.updateChange(ctx);
-    rebasedPatchSet = patchSetInserter.getPatchSet();
-    return ret;
-  }
-
-  @Override
-  public void postUpdate(Context ctx) throws OrmException {
-    patchSetInserter.postUpdate(ctx);
-  }
-
-  public RevCommit getRebasedCommit() {
-    checkState(rebasedCommit != null, "getRebasedCommit() only valid after updateRepo");
-    return rebasedCommit;
-  }
-
-  public PatchSet.Id getPatchSetId() {
-    checkState(rebasedPatchSetId != null, "getPatchSetId() only valid after updateRepo");
-    return rebasedPatchSetId;
-  }
-
-  public PatchSet getPatchSet() {
-    checkState(rebasedPatchSet != null, "getPatchSet() only valid after executing update");
-    return rebasedPatchSet;
-  }
-
-  private MergeUtil newMergeUtil() throws IOException {
-    ProjectState project = projectCache.checkedGet(notes.getProjectName());
-    return forceContentMerge
-        ? mergeUtilFactory.create(project, true)
-        : mergeUtilFactory.create(project);
-  }
-
-  /**
-   * Rebase a commit.
-   *
-   * @param ctx repo context.
-   * @param original the commit to rebase.
-   * @param base base to rebase against.
-   * @return the rebased commit.
-   * @throws MergeConflictException the rebase failed due to a merge conflict.
-   * @throws IOException the merge failed for another reason.
-   */
-  private RevCommit rebaseCommit(
-      RepoContext ctx, RevCommit original, ObjectId base, String commitMessage)
-      throws ResourceConflictException, IOException {
-    RevCommit parentCommit = original.getParent(0);
-
-    if (base.equals(parentCommit)) {
-      throw new ResourceConflictException("Change is already up to date.");
-    }
-
-    ThreeWayMerger merger =
-        newMergeUtil().newThreeWayMerger(ctx.getInserter(), ctx.getRepoView().getConfig());
-    merger.setBase(parentCommit);
-    boolean success = merger.merge(original, base);
-
-    if (!success || merger.getResultTreeId() == null) {
-      throw new MergeConflictException(
-          "The change could not be rebased due to a conflict during merge.");
-    }
-
-    CommitBuilder cb = new CommitBuilder();
-    cb.setTreeId(merger.getResultTreeId());
-    cb.setParentId(base);
-    cb.setAuthor(original.getAuthorIdent());
-    cb.setMessage(commitMessage);
-    if (committerIdent != null) {
-      cb.setCommitter(committerIdent);
-    } else {
-      cb.setCommitter(ctx.getIdentifiedUser().newCommitterIdent(ctx.getWhen(), ctx.getTimeZone()));
-    }
-    if (matchAuthorToCommitterDate) {
-      cb.setAuthor(
-          new PersonIdent(
-              cb.getAuthor(), cb.getCommitter().getWhen(), cb.getCommitter().getTimeZone()));
-    }
-    ObjectId objectId = ctx.getInserter().insert(cb);
-    ctx.getInserter().flush();
-    return ctx.getRevWalk().parseCommit(objectId);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/RebaseUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/RebaseUtil.java
deleted file mode 100644
index acb2c43..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/RebaseUtil.java
+++ /dev/null
@@ -1,205 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.change;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.primitives.Ints;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Change.Status;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.RevId;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.InternalChangeQuery;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Utility methods related to rebasing changes. */
-public class RebaseUtil {
-  private static final Logger log = LoggerFactory.getLogger(RebaseUtil.class);
-
-  private final Provider<InternalChangeQuery> queryProvider;
-  private final ChangeNotes.Factory notesFactory;
-  private final Provider<ReviewDb> dbProvider;
-  private final PatchSetUtil psUtil;
-
-  @Inject
-  RebaseUtil(
-      Provider<InternalChangeQuery> queryProvider,
-      ChangeNotes.Factory notesFactory,
-      Provider<ReviewDb> dbProvider,
-      PatchSetUtil psUtil) {
-    this.queryProvider = queryProvider;
-    this.notesFactory = notesFactory;
-    this.dbProvider = dbProvider;
-    this.psUtil = psUtil;
-  }
-
-  public boolean canRebase(PatchSet patchSet, Branch.NameKey dest, Repository git, RevWalk rw) {
-    try {
-      findBaseRevision(patchSet, dest, git, rw);
-      return true;
-    } catch (RestApiException e) {
-      return false;
-    } catch (OrmException | IOException e) {
-      log.warn("Error checking if patch set {} on {} can be rebased", patchSet.getId(), dest, e);
-      return false;
-    }
-  }
-
-  @AutoValue
-  abstract static class Base {
-    private static Base create(ChangeNotes notes, PatchSet ps) {
-      if (notes == null) {
-        return null;
-      }
-      return new AutoValue_RebaseUtil_Base(notes, ps);
-    }
-
-    abstract ChangeNotes notes();
-
-    abstract PatchSet patchSet();
-  }
-
-  Base parseBase(RevisionResource rsrc, String base) throws OrmException {
-    ReviewDb db = dbProvider.get();
-
-    // Try parsing the base as a ref string.
-    PatchSet.Id basePatchSetId = PatchSet.Id.fromRef(base);
-    if (basePatchSetId != null) {
-      Change.Id baseChangeId = basePatchSetId.getParentKey();
-      ChangeNotes baseNotes = notesFor(rsrc, baseChangeId);
-      if (baseNotes != null) {
-        return Base.create(
-            notesFor(rsrc, basePatchSetId.getParentKey()),
-            psUtil.get(db, baseNotes, basePatchSetId));
-      }
-    }
-
-    // Try parsing base as a change number (assume current patch set).
-    Integer baseChangeId = Ints.tryParse(base);
-    if (baseChangeId != null) {
-      ChangeNotes baseNotes = notesFor(rsrc, new Change.Id(baseChangeId));
-      if (baseNotes != null) {
-        return Base.create(baseNotes, psUtil.current(db, baseNotes));
-      }
-    }
-
-    // Try parsing as SHA-1.
-    Base ret = null;
-    for (ChangeData cd : queryProvider.get().byProjectCommit(rsrc.getProject(), base)) {
-      for (PatchSet ps : cd.patchSets()) {
-        if (!ps.getRevision().matches(base)) {
-          continue;
-        }
-        if (ret == null || ret.patchSet().getId().get() < ps.getId().get()) {
-          ret = Base.create(cd.notes(), ps);
-        }
-      }
-    }
-    return ret;
-  }
-
-  private ChangeNotes notesFor(RevisionResource rsrc, Change.Id id) throws OrmException {
-    if (rsrc.getChange().getId().equals(id)) {
-      return rsrc.getNotes();
-    }
-    return notesFactory.createChecked(dbProvider.get(), rsrc.getProject(), id);
-  }
-
-  /**
-   * Find the commit onto which a patch set should be rebased.
-   *
-   * <p>This is defined as the latest patch set of the change corresponding to this commit's parent,
-   * or the destination branch tip in the case where the parent's change is merged.
-   *
-   * @param patchSet patch set for which the new base commit should be found.
-   * @param destBranch the destination branch.
-   * @param git the repository.
-   * @param rw the RevWalk.
-   * @return the commit onto which the patch set should be rebased.
-   * @throws RestApiException if rebase is not possible.
-   * @throws IOException if accessing the repository fails.
-   * @throws OrmException if accessing the database fails.
-   */
-  ObjectId findBaseRevision(
-      PatchSet patchSet, Branch.NameKey destBranch, Repository git, RevWalk rw)
-      throws RestApiException, IOException, OrmException {
-    String baseRev = null;
-    RevCommit commit = rw.parseCommit(ObjectId.fromString(patchSet.getRevision().get()));
-
-    if (commit.getParentCount() > 1) {
-      throw new UnprocessableEntityException("Cannot rebase a change with multiple parents.");
-    } else if (commit.getParentCount() == 0) {
-      throw new UnprocessableEntityException(
-          "Cannot rebase a change without any parents (is this the initial commit?).");
-    }
-
-    RevId parentRev = new RevId(commit.getParent(0).name());
-
-    CHANGES:
-    for (ChangeData cd : queryProvider.get().byBranchCommit(destBranch, parentRev.get())) {
-      for (PatchSet depPatchSet : cd.patchSets()) {
-        if (!depPatchSet.getRevision().equals(parentRev)) {
-          continue;
-        }
-        Change depChange = cd.change();
-        if (depChange.getStatus() == Status.ABANDONED) {
-          throw new ResourceConflictException(
-              "Cannot rebase a change with an abandoned parent: " + depChange.getKey());
-        }
-
-        if (depChange.getStatus().isOpen()) {
-          if (depPatchSet.getId().equals(depChange.currentPatchSetId())) {
-            throw new ResourceConflictException(
-                "Change is already based on the latest patch set of the dependent change.");
-          }
-          baseRev = cd.currentPatchSet().getRevision().get();
-        }
-        break CHANGES;
-      }
-    }
-
-    if (baseRev == null) {
-      // We are dependent on a merged PatchSet or have no PatchSet
-      // dependencies at all.
-      Ref destRef = git.getRefDatabase().exactRef(destBranch.get());
-      if (destRef == null) {
-        throw new UnprocessableEntityException(
-            "The destination branch does not exist: " + destBranch.get());
-      }
-      baseRev = destRef.getObjectId().getName();
-      if (baseRev.equals(parentRev.get())) {
-        throw new ResourceConflictException("Change is already up to date.");
-      }
-    }
-    return ObjectId.fromString(baseRev);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Rebuild.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Rebuild.java
deleted file mode 100644
index bfa80dc..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Rebuild.java
+++ /dev/null
@@ -1,109 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.change;
-
-import static java.util.stream.Collectors.joining;
-
-import com.google.gerrit.extensions.restapi.BinaryResult;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.reviewdb.server.ReviewDbUtil;
-import com.google.gerrit.server.CommentsUtil;
-import com.google.gerrit.server.change.Rebuild.Input;
-import com.google.gerrit.server.notedb.ChangeBundle;
-import com.google.gerrit.server.notedb.ChangeBundleReader;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.NotesMigration;
-import com.google.gerrit.server.notedb.rebuild.ChangeRebuilder;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.List;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-@Singleton
-public class Rebuild implements RestModifyView<ChangeResource, Input> {
-  public static class Input {}
-
-  private final Provider<ReviewDb> db;
-  private final NotesMigration migration;
-  private final ChangeRebuilder rebuilder;
-  private final ChangeBundleReader bundleReader;
-  private final CommentsUtil commentsUtil;
-  private final ChangeNotes.Factory notesFactory;
-
-  @Inject
-  Rebuild(
-      Provider<ReviewDb> db,
-      NotesMigration migration,
-      ChangeRebuilder rebuilder,
-      ChangeBundleReader bundleReader,
-      CommentsUtil commentsUtil,
-      ChangeNotes.Factory notesFactory) {
-    this.db = db;
-    this.migration = migration;
-    this.rebuilder = rebuilder;
-    this.bundleReader = bundleReader;
-    this.commentsUtil = commentsUtil;
-    this.notesFactory = notesFactory;
-  }
-
-  @Override
-  public BinaryResult apply(ChangeResource rsrc, Input input)
-      throws ResourceNotFoundException, IOException, OrmException, ConfigInvalidException,
-          ResourceConflictException {
-    if (!migration.commitChangeWrites()) {
-      throw new ResourceNotFoundException();
-    }
-    if (!migration.readChanges()) {
-      // ChangeBundle#fromNotes currently doesn't work if reading isn't enabled,
-      // so don't attempt a diff.
-      rebuild(rsrc);
-      return BinaryResult.create("Rebuilt change successfully");
-    }
-
-    // Not the same transaction as the rebuild, so may result in spurious diffs
-    // in the case of races. This should be easy enough to detect by rerunning.
-    ChangeBundle reviewDbBundle =
-        bundleReader.fromReviewDb(ReviewDbUtil.unwrapDb(db.get()), rsrc.getId());
-    if (reviewDbBundle == null) {
-      throw new ResourceConflictException("change is missing in ReviewDb");
-    }
-    rebuild(rsrc);
-    ChangeNotes notes = notesFactory.create(db.get(), rsrc.getChange().getProject(), rsrc.getId());
-    ChangeBundle noteDbBundle = ChangeBundle.fromNotes(commentsUtil, notes);
-    List<String> diffs = reviewDbBundle.differencesFrom(noteDbBundle);
-    if (diffs.isEmpty()) {
-      return BinaryResult.create("No differences between ReviewDb and NoteDb");
-    }
-    return BinaryResult.create(
-        diffs.stream().collect(joining("\n", "Differences between ReviewDb and NoteDb:\n", "\n")));
-  }
-
-  private void rebuild(ChangeResource rsrc)
-      throws ResourceNotFoundException, OrmException, IOException {
-    try {
-      rebuilder.rebuild(db.get(), rsrc.getId());
-    } catch (NoSuchChangeException e) {
-      throw new ResourceNotFoundException(IdString.fromDecoded(rsrc.getId().toString()));
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/RelatedChangesSorter.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/RelatedChangesSorter.java
deleted file mode 100644
index 22ff2b7..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/RelatedChangesSorter.java
+++ /dev/null
@@ -1,275 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.change;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.MultimapBuilder;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.ArrayDeque;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Deque;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-@Singleton
-class RelatedChangesSorter {
-  private final GitRepositoryManager repoManager;
-  private final PermissionBackend permissionBackend;
-  private final Provider<ReviewDb> dbProvider;
-
-  @Inject
-  RelatedChangesSorter(
-      GitRepositoryManager repoManager,
-      PermissionBackend permissionBackend,
-      Provider<ReviewDb> dbProvider) {
-    this.repoManager = repoManager;
-    this.permissionBackend = permissionBackend;
-    this.dbProvider = dbProvider;
-  }
-
-  public List<PatchSetData> sort(List<ChangeData> in, PatchSet startPs, CurrentUser user)
-      throws OrmException, IOException, PermissionBackendException {
-    checkArgument(!in.isEmpty(), "Input may not be empty");
-    // Map of all patch sets, keyed by commit SHA-1.
-    Map<String, PatchSetData> byId = collectById(in);
-    PatchSetData start = byId.get(startPs.getRevision().get());
-    checkArgument(start != null, "%s not found in %s", startPs, in);
-    PermissionBackend.WithUser perm = permissionBackend.user(user).database(dbProvider);
-
-    // Map of patch set -> immediate parent.
-    ListMultimap<PatchSetData, PatchSetData> parents =
-        MultimapBuilder.hashKeys(in.size()).arrayListValues(3).build();
-    // Map of patch set -> immediate children.
-    ListMultimap<PatchSetData, PatchSetData> children =
-        MultimapBuilder.hashKeys(in.size()).arrayListValues(3).build();
-    // All other patch sets of the same change as startPs.
-    List<PatchSetData> otherPatchSetsOfStart = new ArrayList<>();
-
-    for (ChangeData cd : in) {
-      for (PatchSet ps : cd.patchSets()) {
-        PatchSetData thisPsd = checkNotNull(byId.get(ps.getRevision().get()));
-        if (cd.getId().equals(start.id()) && !ps.getId().equals(start.psId())) {
-          otherPatchSetsOfStart.add(thisPsd);
-        }
-        for (RevCommit p : thisPsd.commit().getParents()) {
-          PatchSetData parentPsd = byId.get(p.name());
-          if (parentPsd != null) {
-            parents.put(thisPsd, parentPsd);
-            children.put(parentPsd, thisPsd);
-          }
-        }
-      }
-    }
-
-    Collection<PatchSetData> ancestors = walkAncestors(perm, parents, start);
-    List<PatchSetData> descendants =
-        walkDescendants(perm, children, start, otherPatchSetsOfStart, ancestors);
-    List<PatchSetData> result = new ArrayList<>(ancestors.size() + descendants.size() - 1);
-    result.addAll(Lists.reverse(descendants));
-    result.addAll(ancestors);
-    return result;
-  }
-
-  private Map<String, PatchSetData> collectById(List<ChangeData> in)
-      throws OrmException, IOException {
-    Project.NameKey project = in.get(0).change().getProject();
-    Map<String, PatchSetData> result = Maps.newHashMapWithExpectedSize(in.size() * 3);
-    try (Repository repo = repoManager.openRepository(project);
-        RevWalk rw = new RevWalk(repo)) {
-      rw.setRetainBody(true);
-      for (ChangeData cd : in) {
-        checkArgument(
-            cd.change().getProject().equals(project),
-            "Expected change %s in project %s, found %s",
-            cd.getId(),
-            project,
-            cd.change().getProject());
-        for (PatchSet ps : cd.patchSets()) {
-          String id = ps.getRevision().get();
-          RevCommit c = rw.parseCommit(ObjectId.fromString(id));
-          PatchSetData psd = PatchSetData.create(cd, ps, c);
-          result.put(id, psd);
-        }
-      }
-    }
-    return result;
-  }
-
-  private static Collection<PatchSetData> walkAncestors(
-      PermissionBackend.WithUser perm,
-      ListMultimap<PatchSetData, PatchSetData> parents,
-      PatchSetData start)
-      throws PermissionBackendException {
-    LinkedHashSet<PatchSetData> result = new LinkedHashSet<>();
-    Deque<PatchSetData> pending = new ArrayDeque<>();
-    pending.add(start);
-    while (!pending.isEmpty()) {
-      PatchSetData psd = pending.remove();
-      if (result.contains(psd) || !isVisible(psd, perm)) {
-        continue;
-      }
-      result.add(psd);
-      pending.addAll(Lists.reverse(parents.get(psd)));
-    }
-    return result;
-  }
-
-  private static List<PatchSetData> walkDescendants(
-      PermissionBackend.WithUser perm,
-      ListMultimap<PatchSetData, PatchSetData> children,
-      PatchSetData start,
-      List<PatchSetData> otherPatchSetsOfStart,
-      Iterable<PatchSetData> ancestors)
-      throws PermissionBackendException {
-    Set<Change.Id> alreadyEmittedChanges = new HashSet<>();
-    addAllChangeIds(alreadyEmittedChanges, ancestors);
-
-    // Prefer descendants found by following the original patch set passed in.
-    List<PatchSetData> result =
-        walkDescendentsImpl(perm, alreadyEmittedChanges, children, ImmutableList.of(start));
-    addAllChangeIds(alreadyEmittedChanges, result);
-
-    // Then, go back and add new indirect descendants found by following any
-    // other patch sets of start. These show up after all direct descendants,
-    // because we wouldn't know where in the walk to insert them.
-    result.addAll(
-        walkDescendentsImpl(perm, alreadyEmittedChanges, children, otherPatchSetsOfStart));
-    return result;
-  }
-
-  private static void addAllChangeIds(
-      Collection<Change.Id> changeIds, Iterable<PatchSetData> psds) {
-    for (PatchSetData psd : psds) {
-      changeIds.add(psd.id());
-    }
-  }
-
-  private static List<PatchSetData> walkDescendentsImpl(
-      PermissionBackend.WithUser perm,
-      Set<Change.Id> alreadyEmittedChanges,
-      ListMultimap<PatchSetData, PatchSetData> children,
-      List<PatchSetData> start)
-      throws PermissionBackendException {
-    if (start.isEmpty()) {
-      return ImmutableList.of();
-    }
-    Map<Change.Id, PatchSet.Id> maxPatchSetIds = new HashMap<>();
-    Set<PatchSetData> seen = new HashSet<>();
-    List<PatchSetData> allPatchSets = new ArrayList<>();
-    Deque<PatchSetData> pending = new ArrayDeque<>();
-    pending.addAll(start);
-    while (!pending.isEmpty()) {
-      PatchSetData psd = pending.remove();
-      if (seen.contains(psd) || !isVisible(psd, perm)) {
-        continue;
-      }
-      seen.add(psd);
-      if (!alreadyEmittedChanges.contains(psd.id())) {
-        // Don't emit anything for changes that were previously emitted, even
-        // though different patch sets might show up later. However, do
-        // continue walking through them for the purposes of finding indirect
-        // descendants.
-        PatchSet.Id oldMax = maxPatchSetIds.get(psd.id());
-        if (oldMax == null || psd.psId().get() > oldMax.get()) {
-          maxPatchSetIds.put(psd.id(), psd.psId());
-        }
-        allPatchSets.add(psd);
-      }
-      // Depth-first search with newest children first.
-      for (PatchSetData child : children.get(psd)) {
-        pending.addFirst(child);
-      }
-    }
-
-    // If we saw the same change multiple times, prefer the latest patch set.
-    List<PatchSetData> result = new ArrayList<>(allPatchSets.size());
-    for (PatchSetData psd : allPatchSets) {
-      if (checkNotNull(maxPatchSetIds.get(psd.id())).equals(psd.psId())) {
-        result.add(psd);
-      }
-    }
-    return result;
-  }
-
-  private static boolean isVisible(PatchSetData psd, PermissionBackend.WithUser perm)
-      throws PermissionBackendException {
-    try {
-      perm.change(psd.data()).check(ChangePermission.READ);
-      return true;
-    } catch (AuthException e) {
-      return false;
-    }
-  }
-
-  @AutoValue
-  abstract static class PatchSetData {
-    @VisibleForTesting
-    static PatchSetData create(ChangeData cd, PatchSet ps, RevCommit commit) {
-      return new AutoValue_RelatedChangesSorter_PatchSetData(cd, ps, commit);
-    }
-
-    abstract ChangeData data();
-
-    abstract PatchSet patchSet();
-
-    abstract RevCommit commit();
-
-    PatchSet.Id psId() {
-      return patchSet().getId();
-    }
-
-    Change.Id id() {
-      return psId().getParentKey();
-    }
-
-    @Override
-    public int hashCode() {
-      return Objects.hash(patchSet().getId(), commit());
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Restore.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Restore.java
deleted file mode 100644
index 05e8b4a2..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Restore.java
+++ /dev/null
@@ -1,163 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.change;
-
-import static com.google.gerrit.extensions.conditions.BooleanCondition.and;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.api.changes.RestoreInput;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.webui.UiAction;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Change.Status;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.ChangeUtil;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.extensions.events.ChangeRestored;
-import com.google.gerrit.server.mail.send.ReplyToChangeSender;
-import com.google.gerrit.server.mail.send.RestoredSender;
-import com.google.gerrit.server.notedb.ChangeUpdate;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.Context;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.RetryingRestModifyView;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class Restore extends RetryingRestModifyView<ChangeResource, RestoreInput, ChangeInfo>
-    implements UiAction<ChangeResource> {
-  private static final Logger log = LoggerFactory.getLogger(Restore.class);
-
-  private final RestoredSender.Factory restoredSenderFactory;
-  private final Provider<ReviewDb> dbProvider;
-  private final ChangeJson.Factory json;
-  private final ChangeMessagesUtil cmUtil;
-  private final PatchSetUtil psUtil;
-  private final ChangeRestored changeRestored;
-
-  @Inject
-  Restore(
-      RestoredSender.Factory restoredSenderFactory,
-      Provider<ReviewDb> dbProvider,
-      ChangeJson.Factory json,
-      ChangeMessagesUtil cmUtil,
-      PatchSetUtil psUtil,
-      RetryHelper retryHelper,
-      ChangeRestored changeRestored) {
-    super(retryHelper);
-    this.restoredSenderFactory = restoredSenderFactory;
-    this.dbProvider = dbProvider;
-    this.json = json;
-    this.cmUtil = cmUtil;
-    this.psUtil = psUtil;
-    this.changeRestored = changeRestored;
-  }
-
-  @Override
-  protected ChangeInfo applyImpl(
-      BatchUpdate.Factory updateFactory, ChangeResource req, RestoreInput input)
-      throws RestApiException, UpdateException, OrmException, PermissionBackendException {
-    req.permissions().database(dbProvider).check(ChangePermission.RESTORE);
-
-    Op op = new Op(input);
-    try (BatchUpdate u =
-        updateFactory.create(
-            dbProvider.get(), req.getChange().getProject(), req.getUser(), TimeUtil.nowTs())) {
-      u.addOp(req.getId(), op).execute();
-    }
-    return json.noOptions().format(op.change);
-  }
-
-  private class Op implements BatchUpdateOp {
-    private final RestoreInput input;
-
-    private Change change;
-    private PatchSet patchSet;
-    private ChangeMessage message;
-
-    private Op(RestoreInput input) {
-      this.input = input;
-    }
-
-    @Override
-    public boolean updateChange(ChangeContext ctx) throws OrmException, ResourceConflictException {
-      change = ctx.getChange();
-      if (change == null || change.getStatus() != Status.ABANDONED) {
-        throw new ResourceConflictException("change is " + ChangeUtil.status(change));
-      }
-      PatchSet.Id psId = change.currentPatchSetId();
-      ChangeUpdate update = ctx.getUpdate(psId);
-      patchSet = psUtil.get(ctx.getDb(), ctx.getNotes(), psId);
-      change.setStatus(Status.NEW);
-      change.setLastUpdatedOn(ctx.getWhen());
-      update.setStatus(change.getStatus());
-
-      message = newMessage(ctx);
-      cmUtil.addChangeMessage(ctx.getDb(), update, message);
-      return true;
-    }
-
-    private ChangeMessage newMessage(ChangeContext ctx) {
-      StringBuilder msg = new StringBuilder();
-      msg.append("Restored");
-      if (!Strings.nullToEmpty(input.message).trim().isEmpty()) {
-        msg.append("\n\n");
-        msg.append(input.message.trim());
-      }
-      return ChangeMessagesUtil.newMessage(ctx, msg.toString(), ChangeMessagesUtil.TAG_RESTORE);
-    }
-
-    @Override
-    public void postUpdate(Context ctx) throws OrmException {
-      try {
-        ReplyToChangeSender cm = restoredSenderFactory.create(ctx.getProject(), change.getId());
-        cm.setFrom(ctx.getAccountId());
-        cm.setChangeMessage(message.getMessage(), ctx.getWhen());
-        cm.send();
-      } catch (Exception e) {
-        log.error("Cannot email update for change " + change.getId(), e);
-      }
-      changeRestored.fire(
-          change, patchSet, ctx.getAccount(), Strings.emptyToNull(input.message), ctx.getWhen());
-    }
-  }
-
-  @Override
-  public UiAction.Description getDescription(ChangeResource rsrc) {
-    return new UiAction.Description()
-        .setLabel("Restore")
-        .setTitle("Restore the change")
-        .setVisible(
-            and(
-                rsrc.getChange().getStatus() == Status.ABANDONED,
-                rsrc.permissions().database(dbProvider).testCond(ChangePermission.RESTORE)));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Revert.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Revert.java
deleted file mode 100644
index e46b19e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Revert.java
+++ /dev/null
@@ -1,296 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.change;
-
-import static com.google.gerrit.extensions.conditions.BooleanCondition.and;
-import static com.google.gerrit.server.permissions.RefPermission.CREATE_CHANGE;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.api.changes.RevertInput;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.webui.UiAction;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.ChangeUtil;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.ReviewerSet;
-import com.google.gerrit.server.Sequences;
-import com.google.gerrit.server.extensions.events.ChangeReverted;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.mail.send.RevertedSender;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.ReviewerStateInternal;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.ContributorAgreementsChecker;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.Context;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.RetryingRestModifyView;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.text.MessageFormat;
-import java.util.HashSet;
-import java.util.Set;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.util.ChangeIdUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class Revert extends RetryingRestModifyView<ChangeResource, RevertInput, ChangeInfo>
-    implements UiAction<ChangeResource> {
-  private static final Logger log = LoggerFactory.getLogger(Revert.class);
-
-  private final Provider<ReviewDb> db;
-  private final PermissionBackend permissionBackend;
-  private final GitRepositoryManager repoManager;
-  private final ChangeInserter.Factory changeInserterFactory;
-  private final ChangeMessagesUtil cmUtil;
-  private final Sequences seq;
-  private final PatchSetUtil psUtil;
-  private final RevertedSender.Factory revertedSenderFactory;
-  private final ChangeJson.Factory json;
-  private final PersonIdent serverIdent;
-  private final ApprovalsUtil approvalsUtil;
-  private final ChangeReverted changeReverted;
-  private final ContributorAgreementsChecker contributorAgreements;
-
-  @Inject
-  Revert(
-      Provider<ReviewDb> db,
-      PermissionBackend permissionBackend,
-      GitRepositoryManager repoManager,
-      ChangeInserter.Factory changeInserterFactory,
-      ChangeMessagesUtil cmUtil,
-      RetryHelper retryHelper,
-      Sequences seq,
-      PatchSetUtil psUtil,
-      RevertedSender.Factory revertedSenderFactory,
-      ChangeJson.Factory json,
-      @GerritPersonIdent PersonIdent serverIdent,
-      ApprovalsUtil approvalsUtil,
-      ChangeReverted changeReverted,
-      ContributorAgreementsChecker contributorAgreements) {
-    super(retryHelper);
-    this.db = db;
-    this.permissionBackend = permissionBackend;
-    this.repoManager = repoManager;
-    this.changeInserterFactory = changeInserterFactory;
-    this.cmUtil = cmUtil;
-    this.seq = seq;
-    this.psUtil = psUtil;
-    this.revertedSenderFactory = revertedSenderFactory;
-    this.json = json;
-    this.serverIdent = serverIdent;
-    this.approvalsUtil = approvalsUtil;
-    this.changeReverted = changeReverted;
-    this.contributorAgreements = contributorAgreements;
-  }
-
-  @Override
-  public ChangeInfo applyImpl(
-      BatchUpdate.Factory updateFactory, ChangeResource rsrc, RevertInput input)
-      throws IOException, OrmException, RestApiException, UpdateException, NoSuchChangeException,
-          PermissionBackendException, NoSuchProjectException {
-    Change change = rsrc.getChange();
-    if (change.getStatus() != Change.Status.MERGED) {
-      throw new ResourceConflictException("change is " + ChangeUtil.status(change));
-    }
-
-    contributorAgreements.check(rsrc.getProject(), rsrc.getUser());
-    permissionBackend.user(rsrc.getUser()).ref(change.getDest()).check(CREATE_CHANGE);
-
-    Change.Id revertId =
-        revert(updateFactory, rsrc.getNotes(), rsrc.getUser(), Strings.emptyToNull(input.message));
-    return json.noOptions().format(rsrc.getProject(), revertId);
-  }
-
-  private Change.Id revert(
-      BatchUpdate.Factory updateFactory, ChangeNotes notes, CurrentUser user, String message)
-      throws OrmException, IOException, RestApiException, UpdateException {
-    Change.Id changeIdToRevert = notes.getChangeId();
-    PatchSet.Id patchSetId = notes.getChange().currentPatchSetId();
-    PatchSet patch = psUtil.get(db.get(), notes, patchSetId);
-    if (patch == null) {
-      throw new ResourceNotFoundException(changeIdToRevert.toString());
-    }
-
-    Project.NameKey project = notes.getProjectName();
-    try (Repository git = repoManager.openRepository(project);
-        ObjectInserter oi = git.newObjectInserter();
-        ObjectReader reader = oi.newReader();
-        RevWalk revWalk = new RevWalk(reader)) {
-      RevCommit commitToRevert =
-          revWalk.parseCommit(ObjectId.fromString(patch.getRevision().get()));
-      if (commitToRevert.getParentCount() == 0) {
-        throw new ResourceConflictException("Cannot revert initial commit");
-      }
-
-      Timestamp now = TimeUtil.nowTs();
-      PersonIdent committerIdent = new PersonIdent(serverIdent, now);
-      PersonIdent authorIdent =
-          user.asIdentifiedUser().newCommitterIdent(now, committerIdent.getTimeZone());
-
-      RevCommit parentToCommitToRevert = commitToRevert.getParent(0);
-      revWalk.parseHeaders(parentToCommitToRevert);
-
-      CommitBuilder revertCommitBuilder = new CommitBuilder();
-      revertCommitBuilder.addParentId(commitToRevert);
-      revertCommitBuilder.setTreeId(parentToCommitToRevert.getTree());
-      revertCommitBuilder.setAuthor(authorIdent);
-      revertCommitBuilder.setCommitter(authorIdent);
-
-      Change changeToRevert = notes.getChange();
-      if (message == null) {
-        message =
-            MessageFormat.format(
-                ChangeMessages.get().revertChangeDefaultMessage,
-                changeToRevert.getSubject(),
-                patch.getRevision().get());
-      }
-
-      ObjectId computedChangeId =
-          ChangeIdUtil.computeChangeId(
-              parentToCommitToRevert.getTree(),
-              commitToRevert,
-              authorIdent,
-              committerIdent,
-              message);
-      revertCommitBuilder.setMessage(ChangeIdUtil.insertId(message, computedChangeId, true));
-
-      Change.Id changeId = new Change.Id(seq.nextChangeId());
-      ObjectId id = oi.insert(revertCommitBuilder);
-      RevCommit revertCommit = revWalk.parseCommit(id);
-
-      ChangeInserter ins =
-          changeInserterFactory
-              .create(changeId, revertCommit, notes.getChange().getDest().get())
-              .setTopic(changeToRevert.getTopic());
-      ins.setMessage("Uploaded patch set 1.");
-
-      ReviewerSet reviewerSet = approvalsUtil.getReviewers(db.get(), notes);
-
-      Set<Account.Id> reviewers = new HashSet<>();
-      reviewers.add(changeToRevert.getOwner());
-      reviewers.addAll(reviewerSet.byState(ReviewerStateInternal.REVIEWER));
-      reviewers.remove(user.getAccountId());
-      ins.setReviewers(reviewers);
-
-      Set<Account.Id> ccs = new HashSet<>(reviewerSet.byState(ReviewerStateInternal.CC));
-      ccs.remove(user.getAccountId());
-      ins.setExtraCC(ccs);
-      ins.setRevertOf(changeIdToRevert);
-
-      try (BatchUpdate bu = updateFactory.create(db.get(), project, user, now)) {
-        bu.setRepository(git, revWalk, oi);
-        bu.insertChange(ins);
-        bu.addOp(changeId, new NotifyOp(changeToRevert, ins));
-        bu.addOp(changeToRevert.getId(), new PostRevertedMessageOp(computedChangeId));
-        bu.execute();
-      }
-      return changeId;
-    } catch (RepositoryNotFoundException e) {
-      throw new ResourceNotFoundException(changeIdToRevert.toString(), e);
-    }
-  }
-
-  @Override
-  public UiAction.Description getDescription(ChangeResource rsrc) {
-    Change change = rsrc.getChange();
-    return new UiAction.Description()
-        .setLabel("Revert")
-        .setTitle("Revert the change")
-        .setVisible(
-            and(
-                change.getStatus() == Change.Status.MERGED,
-                permissionBackend
-                    .user(rsrc.getUser())
-                    .ref(change.getDest())
-                    .testCond(CREATE_CHANGE)));
-  }
-
-  private class NotifyOp implements BatchUpdateOp {
-    private final Change change;
-    private final ChangeInserter ins;
-
-    NotifyOp(Change change, ChangeInserter ins) {
-      this.change = change;
-      this.ins = ins;
-    }
-
-    @Override
-    public void postUpdate(Context ctx) throws Exception {
-      changeReverted.fire(change, ins.getChange(), ctx.getWhen());
-      try {
-        RevertedSender cm = revertedSenderFactory.create(ctx.getProject(), change.getId());
-        cm.setFrom(ctx.getAccountId());
-        cm.send();
-      } catch (Exception err) {
-        log.error("Cannot send email for revert change " + change.getId(), err);
-      }
-    }
-  }
-
-  private class PostRevertedMessageOp implements BatchUpdateOp {
-    private final ObjectId computedChangeId;
-
-    PostRevertedMessageOp(ObjectId computedChangeId) {
-      this.computedChangeId = computedChangeId;
-    }
-
-    @Override
-    public boolean updateChange(ChangeContext ctx) throws Exception {
-      Change change = ctx.getChange();
-      PatchSet.Id patchSetId = change.currentPatchSetId();
-      ChangeMessage changeMessage =
-          ChangeMessagesUtil.newMessage(
-              ctx,
-              "Created a revert of this change as I" + computedChangeId.name(),
-              ChangeMessagesUtil.TAG_REVERT);
-      cmUtil.addChangeMessage(ctx.getDb(), ctx.getUpdate(patchSetId), changeMessage);
-      return true;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Reviewed.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Reviewed.java
deleted file mode 100644
index 0d25d35..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Reviewed.java
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-public class Reviewed {
-  public static class Input {}
-
-  @Singleton
-  public static class PutReviewed implements RestModifyView<FileResource, Input> {
-    private final DynamicItem<AccountPatchReviewStore> accountPatchReviewStore;
-
-    @Inject
-    PutReviewed(DynamicItem<AccountPatchReviewStore> accountPatchReviewStore) {
-      this.accountPatchReviewStore = accountPatchReviewStore;
-    }
-
-    @Override
-    public Response<String> apply(FileResource resource, Input input) throws OrmException {
-      if (accountPatchReviewStore
-          .get()
-          .markReviewed(
-              resource.getPatchKey().getParentKey(),
-              resource.getAccountId(),
-              resource.getPatchKey().getFileName())) {
-        return Response.created("");
-      }
-      return Response.ok("");
-    }
-  }
-
-  @Singleton
-  public static class DeleteReviewed implements RestModifyView<FileResource, Input> {
-    private final DynamicItem<AccountPatchReviewStore> accountPatchReviewStore;
-
-    @Inject
-    DeleteReviewed(DynamicItem<AccountPatchReviewStore> accountPatchReviewStore) {
-      this.accountPatchReviewStore = accountPatchReviewStore;
-    }
-
-    @Override
-    public Response<?> apply(FileResource resource, Input input) throws OrmException {
-      accountPatchReviewStore
-          .get()
-          .clearReviewed(
-              resource.getPatchKey().getParentKey(),
-              resource.getAccountId(),
-              resource.getPatchKey().getFileName());
-      return Response.none();
-    }
-  }
-
-  private Reviewed() {}
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ReviewerJson.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ReviewerJson.java
deleted file mode 100644
index 5457142..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ReviewerJson.java
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.change;
-
-import static com.google.gerrit.common.data.LabelValue.formatValue;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.LabelTypes;
-import com.google.gerrit.common.data.SubmitRecord;
-import com.google.gerrit.extensions.api.changes.ReviewerInfo;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.account.AccountLoader;
-import com.google.gerrit.server.permissions.LabelPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.SubmitRuleEvaluator;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.Collection;
-import java.util.List;
-import java.util.TreeMap;
-
-@Singleton
-public class ReviewerJson {
-  private final Provider<ReviewDb> db;
-  private final PermissionBackend permissionBackend;
-  private final ChangeData.Factory changeDataFactory;
-  private final ApprovalsUtil approvalsUtil;
-  private final AccountLoader.Factory accountLoaderFactory;
-  private final SubmitRuleEvaluator.Factory submitRuleEvaluatorFactory;
-
-  @Inject
-  ReviewerJson(
-      Provider<ReviewDb> db,
-      PermissionBackend permissionBackend,
-      ChangeData.Factory changeDataFactory,
-      ApprovalsUtil approvalsUtil,
-      AccountLoader.Factory accountLoaderFactory,
-      SubmitRuleEvaluator.Factory submitRuleEvaluatorFactory) {
-    this.db = db;
-    this.permissionBackend = permissionBackend;
-    this.changeDataFactory = changeDataFactory;
-    this.approvalsUtil = approvalsUtil;
-    this.accountLoaderFactory = accountLoaderFactory;
-    this.submitRuleEvaluatorFactory = submitRuleEvaluatorFactory;
-  }
-
-  public List<ReviewerInfo> format(Collection<ReviewerResource> rsrcs)
-      throws OrmException, PermissionBackendException {
-    List<ReviewerInfo> infos = Lists.newArrayListWithCapacity(rsrcs.size());
-    AccountLoader loader = accountLoaderFactory.create(true);
-    ChangeData cd = null;
-    for (ReviewerResource rsrc : rsrcs) {
-      if (cd == null || !cd.getId().equals(rsrc.getChangeId())) {
-        cd = changeDataFactory.create(db.get(), rsrc.getChangeResource().getNotes());
-      }
-      ReviewerInfo info =
-          format(
-              rsrc.getChangeResource().getUser(),
-              new ReviewerInfo(rsrc.getReviewerUser().getAccountId().get()),
-              permissionBackend.user(rsrc.getReviewerUser()).database(db).change(cd),
-              cd);
-      loader.put(info);
-      infos.add(info);
-    }
-    loader.fill();
-    return infos;
-  }
-
-  public List<ReviewerInfo> format(ReviewerResource rsrc)
-      throws OrmException, PermissionBackendException {
-    return format(ImmutableList.<ReviewerResource>of(rsrc));
-  }
-
-  public ReviewerInfo format(
-      CurrentUser user, ReviewerInfo out, PermissionBackend.ForChange perm, ChangeData cd)
-      throws OrmException, PermissionBackendException {
-    PatchSet.Id psId = cd.change().currentPatchSetId();
-    return format(
-        user,
-        out,
-        perm,
-        cd,
-        approvalsUtil.byPatchSetUser(
-            db.get(), cd.notes(), perm.user(), psId, new Account.Id(out._accountId), null, null));
-  }
-
-  public ReviewerInfo format(
-      CurrentUser user,
-      ReviewerInfo out,
-      PermissionBackend.ForChange perm,
-      ChangeData cd,
-      Iterable<PatchSetApproval> approvals)
-      throws OrmException, PermissionBackendException {
-    LabelTypes labelTypes = cd.getLabelTypes();
-
-    out.approvals = new TreeMap<>(labelTypes.nameComparator());
-    for (PatchSetApproval ca : approvals) {
-      LabelType at = labelTypes.byLabel(ca.getLabelId());
-      if (at != null) {
-        out.approvals.put(at.getName(), formatValue(ca.getValue()));
-      }
-    }
-
-    // Add dummy approvals for all permitted labels for the user even if they
-    // do not exist in the DB.
-    PatchSet ps = cd.currentPatchSet();
-    if (ps != null) {
-      for (SubmitRecord rec :
-          submitRuleEvaluatorFactory.create(user, cd).setFastEvalLabels(true).evaluate()) {
-        if (rec.labels == null) {
-          continue;
-        }
-        for (SubmitRecord.Label label : rec.labels) {
-          String name = label.label;
-          LabelType type = labelTypes.byLabel(name);
-          if (!out.approvals.containsKey(name)
-              && type != null
-              && perm.test(new LabelPermission(type))) {
-            out.approvals.put(name, formatValue((short) 0));
-          }
-        }
-      }
-    }
-
-    if (out.approvals.isEmpty()) {
-      out.approvals = null;
-    }
-
-    return out;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ReviewerResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ReviewerResource.java
deleted file mode 100644
index 47e25b04..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ReviewerResource.java
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.change;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.restapi.RestResource;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.mail.Address;
-import com.google.inject.TypeLiteral;
-import com.google.inject.assistedinject.Assisted;
-import com.google.inject.assistedinject.AssistedInject;
-
-public class ReviewerResource implements RestResource {
-  public static final TypeLiteral<RestView<ReviewerResource>> REVIEWER_KIND =
-      new TypeLiteral<RestView<ReviewerResource>>() {};
-
-  public interface Factory {
-    ReviewerResource create(ChangeResource change, Account.Id id);
-
-    ReviewerResource create(RevisionResource revision, Account.Id id);
-  }
-
-  private final ChangeResource change;
-  private final RevisionResource revision;
-  @Nullable private final IdentifiedUser user;
-  @Nullable private final Address address;
-
-  @AssistedInject
-  ReviewerResource(
-      IdentifiedUser.GenericFactory userFactory,
-      @Assisted ChangeResource change,
-      @Assisted Account.Id id) {
-    this.change = change;
-    this.user = userFactory.create(id);
-    this.revision = null;
-    this.address = null;
-  }
-
-  @AssistedInject
-  ReviewerResource(
-      IdentifiedUser.GenericFactory userFactory,
-      @Assisted RevisionResource revision,
-      @Assisted Account.Id id) {
-    this.revision = revision;
-    this.change = revision.getChangeResource();
-    this.user = userFactory.create(id);
-    this.address = null;
-  }
-
-  ReviewerResource(ChangeResource change, Address address) {
-    this.change = change;
-    this.address = address;
-    this.revision = null;
-    this.user = null;
-  }
-
-  ReviewerResource(RevisionResource revision, Address address) {
-    this.revision = revision;
-    this.change = revision.getChangeResource();
-    this.address = address;
-    this.user = null;
-  }
-
-  public ChangeResource getChangeResource() {
-    return change;
-  }
-
-  public RevisionResource getRevisionResource() {
-    return revision;
-  }
-
-  public Change.Id getChangeId() {
-    return change.getId();
-  }
-
-  public Change getChange() {
-    return change.getChange();
-  }
-
-  public IdentifiedUser getReviewerUser() {
-    checkArgument(user != null, "no user provided");
-    return user;
-  }
-
-  public Address getReviewerByEmail() {
-    checkArgument(address != null, "no address provided");
-    return address;
-  }
-
-  /**
-   * Check if this resource was constructed by email or by {@code Account.Id}.
-   *
-   * @return true if the resource was constructed by providing an {@code Address}; false if the
-   *     resource was constructed by providing an {@code Account.Id}.
-   */
-  public boolean isByEmail() {
-    return user == null;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Reviewers.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Reviewers.java
deleted file mode 100644
index 8794083..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Reviewers.java
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ChildCollection;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.account.AccountsCollection;
-import com.google.gerrit.server.mail.Address;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.Collection;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-@Singleton
-public class Reviewers implements ChildCollection<ChangeResource, ReviewerResource> {
-  private final DynamicMap<RestView<ReviewerResource>> views;
-  private final Provider<ReviewDb> dbProvider;
-  private final ApprovalsUtil approvalsUtil;
-  private final AccountsCollection accounts;
-  private final ReviewerResource.Factory resourceFactory;
-  private final ListReviewers list;
-
-  @Inject
-  Reviewers(
-      Provider<ReviewDb> dbProvider,
-      ApprovalsUtil approvalsUtil,
-      AccountsCollection accounts,
-      ReviewerResource.Factory resourceFactory,
-      DynamicMap<RestView<ReviewerResource>> views,
-      ListReviewers list) {
-    this.dbProvider = dbProvider;
-    this.approvalsUtil = approvalsUtil;
-    this.accounts = accounts;
-    this.resourceFactory = resourceFactory;
-    this.views = views;
-    this.list = list;
-  }
-
-  @Override
-  public DynamicMap<RestView<ReviewerResource>> views() {
-    return views;
-  }
-
-  @Override
-  public RestView<ChangeResource> list() {
-    return list;
-  }
-
-  @Override
-  public ReviewerResource parse(ChangeResource rsrc, IdString id)
-      throws OrmException, ResourceNotFoundException, AuthException, IOException,
-          ConfigInvalidException {
-    Address address = Address.tryParse(id.get());
-
-    Account.Id accountId = null;
-    try {
-      accountId = accounts.parse(TopLevelResource.INSTANCE, id).getUser().getAccountId();
-    } catch (ResourceNotFoundException e) {
-      if (address == null) {
-        throw e;
-      }
-    }
-    // See if the id exists as a reviewer for this change
-    if (accountId != null && fetchAccountIds(rsrc).contains(accountId)) {
-      return resourceFactory.create(rsrc, accountId);
-    }
-
-    // See if the address exists as a reviewer on the change
-    if (address != null && rsrc.getNotes().getReviewersByEmail().all().contains(address)) {
-      return new ReviewerResource(rsrc, address);
-    }
-
-    throw new ResourceNotFoundException(id);
-  }
-
-  private Collection<Account.Id> fetchAccountIds(ChangeResource rsrc) throws OrmException {
-    return approvalsUtil.getReviewers(dbProvider.get(), rsrc.getNotes()).all();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/RevisionResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/RevisionResource.java
deleted file mode 100644
index b9b2d1d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/RevisionResource.java
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.change;
-
-import com.google.common.hash.Hasher;
-import com.google.common.hash.Hashing;
-import com.google.gerrit.extensions.restapi.RestResource;
-import com.google.gerrit.extensions.restapi.RestResource.HasETag;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.edit.ChangeEdit;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.inject.TypeLiteral;
-import java.util.Optional;
-
-public class RevisionResource implements RestResource, HasETag {
-  public static final TypeLiteral<RestView<RevisionResource>> REVISION_KIND =
-      new TypeLiteral<RestView<RevisionResource>>() {};
-
-  private final ChangeResource change;
-  private final PatchSet ps;
-  private final Optional<ChangeEdit> edit;
-  private boolean cacheable = true;
-
-  public RevisionResource(ChangeResource change, PatchSet ps) {
-    this(change, ps, Optional.empty());
-  }
-
-  public RevisionResource(ChangeResource change, PatchSet ps, Optional<ChangeEdit> edit) {
-    this.change = change;
-    this.ps = ps;
-    this.edit = edit;
-  }
-
-  public boolean isCacheable() {
-    return cacheable;
-  }
-
-  public PermissionBackend.ForChange permissions() {
-    return change.permissions();
-  }
-
-  public ChangeResource getChangeResource() {
-    return change;
-  }
-
-  public Change getChange() {
-    return getChangeResource().getChange();
-  }
-
-  public Project.NameKey getProject() {
-    return getChange().getProject();
-  }
-
-  public ChangeNotes getNotes() {
-    return getChangeResource().getNotes();
-  }
-
-  public PatchSet getPatchSet() {
-    return ps;
-  }
-
-  @Override
-  public String getETag() {
-    Hasher h = Hashing.murmur3_128().newHasher();
-    prepareETag(h, getUser());
-    return h.hash().toString();
-  }
-
-  void prepareETag(Hasher h, CurrentUser user) {
-    // Conservative estimate: refresh the revision if its parent change has changed, so we don't
-    // have to check whether a given modification affected this revision specifically.
-    change.prepareETag(h, user);
-  }
-
-  Account.Id getAccountId() {
-    return getUser().getAccountId();
-  }
-
-  CurrentUser getUser() {
-    return getChangeResource().getUser();
-  }
-
-  RevisionResource doNotCache() {
-    cacheable = false;
-    return this;
-  }
-
-  public Optional<ChangeEdit> getEdit() {
-    return edit;
-  }
-
-  @Override
-  public String toString() {
-    String s = ps.getId().toString();
-    if (edit.isPresent()) {
-      s = "edit:" + s;
-    }
-    return s;
-  }
-
-  public boolean isCurrent() {
-    return ps.getId().equals(getChange().currentPatchSetId());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/RevisionReviewers.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/RevisionReviewers.java
deleted file mode 100644
index be8bce0..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/RevisionReviewers.java
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ChildCollection;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.account.AccountsCollection;
-import com.google.gerrit.server.mail.Address;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.Collection;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-@Singleton
-public class RevisionReviewers implements ChildCollection<RevisionResource, ReviewerResource> {
-  private final DynamicMap<RestView<ReviewerResource>> views;
-  private final Provider<ReviewDb> dbProvider;
-  private final ApprovalsUtil approvalsUtil;
-  private final AccountsCollection accounts;
-  private final ReviewerResource.Factory resourceFactory;
-  private final ListRevisionReviewers list;
-
-  @Inject
-  RevisionReviewers(
-      Provider<ReviewDb> dbProvider,
-      ApprovalsUtil approvalsUtil,
-      AccountsCollection accounts,
-      ReviewerResource.Factory resourceFactory,
-      DynamicMap<RestView<ReviewerResource>> views,
-      ListRevisionReviewers list) {
-    this.dbProvider = dbProvider;
-    this.approvalsUtil = approvalsUtil;
-    this.accounts = accounts;
-    this.resourceFactory = resourceFactory;
-    this.views = views;
-    this.list = list;
-  }
-
-  @Override
-  public DynamicMap<RestView<ReviewerResource>> views() {
-    return views;
-  }
-
-  @Override
-  public RestView<RevisionResource> list() {
-    return list;
-  }
-
-  @Override
-  public ReviewerResource parse(RevisionResource rsrc, IdString id)
-      throws OrmException, ResourceNotFoundException, AuthException, MethodNotAllowedException,
-          IOException, ConfigInvalidException {
-    if (!rsrc.isCurrent()) {
-      throw new MethodNotAllowedException("Cannot access on non-current patch set");
-    }
-    Address address = Address.tryParse(id.get());
-
-    Account.Id accountId = null;
-    try {
-      accountId = accounts.parse(TopLevelResource.INSTANCE, id).getUser().getAccountId();
-    } catch (ResourceNotFoundException e) {
-      if (address == null) {
-        throw e;
-      }
-    }
-    Collection<Account.Id> reviewers =
-        approvalsUtil.getReviewers(dbProvider.get(), rsrc.getNotes()).all();
-    // See if the id exists as a reviewer for this change
-    if (reviewers.contains(accountId)) {
-      return resourceFactory.create(rsrc, accountId);
-    }
-
-    // See if the address exists as a reviewer on the change
-    if (address != null && rsrc.getNotes().getReviewersByEmail().all().contains(address)) {
-      return new ReviewerResource(rsrc, address);
-    }
-
-    throw new ResourceNotFoundException(id);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Revisions.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Revisions.java
deleted file mode 100644
index 084bc25..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Revisions.java
+++ /dev/null
@@ -1,171 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.change;
-
-import com.google.common.base.Joiner;
-import com.google.common.collect.Lists;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ChildCollection;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.RevId;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.edit.ChangeEdit;
-import com.google.gerrit.server.edit.ChangeEditUtil;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Optional;
-import org.eclipse.jgit.lib.ObjectId;
-
-@Singleton
-public class Revisions implements ChildCollection<ChangeResource, RevisionResource> {
-  private final DynamicMap<RestView<RevisionResource>> views;
-  private final Provider<ReviewDb> dbProvider;
-  private final ChangeEditUtil editUtil;
-  private final PatchSetUtil psUtil;
-  private final PermissionBackend permissionBackend;
-
-  @Inject
-  Revisions(
-      DynamicMap<RestView<RevisionResource>> views,
-      Provider<ReviewDb> dbProvider,
-      ChangeEditUtil editUtil,
-      PatchSetUtil psUtil,
-      PermissionBackend permissionBackend) {
-    this.views = views;
-    this.dbProvider = dbProvider;
-    this.editUtil = editUtil;
-    this.psUtil = psUtil;
-    this.permissionBackend = permissionBackend;
-  }
-
-  @Override
-  public DynamicMap<RestView<RevisionResource>> views() {
-    return views;
-  }
-
-  @Override
-  public RestView<ChangeResource> list() throws ResourceNotFoundException {
-    throw new ResourceNotFoundException();
-  }
-
-  @Override
-  public RevisionResource parse(ChangeResource change, IdString id)
-      throws ResourceNotFoundException, AuthException, OrmException, IOException,
-          PermissionBackendException {
-    if (id.get().equals("current")) {
-      PatchSet ps = psUtil.current(dbProvider.get(), change.getNotes());
-      if (ps != null && visible(change)) {
-        return new RevisionResource(change, ps).doNotCache();
-      }
-      throw new ResourceNotFoundException(id);
-    }
-
-    List<RevisionResource> match = Lists.newArrayListWithExpectedSize(2);
-    for (RevisionResource rsrc : find(change, id.get())) {
-      if (visible(change)) {
-        match.add(rsrc);
-      }
-    }
-    switch (match.size()) {
-      case 0:
-        throw new ResourceNotFoundException(id);
-      case 1:
-        return match.get(0);
-      default:
-        throw new ResourceNotFoundException(
-            "Multiple patch sets for \"" + id.get() + "\": " + Joiner.on("; ").join(match));
-    }
-  }
-
-  private boolean visible(ChangeResource change) throws PermissionBackendException {
-    try {
-      permissionBackend
-          .user(change.getUser())
-          .change(change.getNotes())
-          .database(dbProvider)
-          .check(ChangePermission.READ);
-      return true;
-    } catch (AuthException e) {
-      return false;
-    }
-  }
-
-  private List<RevisionResource> find(ChangeResource change, String id)
-      throws OrmException, IOException, AuthException {
-    if (id.equals("0") || id.equals("edit")) {
-      return loadEdit(change, null);
-    } else if (id.length() < 6 && id.matches("^[1-9][0-9]{0,4}$")) {
-      // Legacy patch set number syntax.
-      return byLegacyPatchSetId(change, id);
-    } else if (id.length() < 4 || id.length() > RevId.LEN) {
-      // Require a minimum of 4 digits.
-      // Impossibly long identifier will never match.
-      return Collections.emptyList();
-    } else {
-      List<RevisionResource> out = new ArrayList<>();
-      for (PatchSet ps : psUtil.byChange(dbProvider.get(), change.getNotes())) {
-        if (ps.getRevision() != null && ps.getRevision().get().startsWith(id)) {
-          out.add(new RevisionResource(change, ps));
-        }
-      }
-      // Not an existing patch set on a change, but might be an edit.
-      if (out.isEmpty() && id.length() == RevId.LEN) {
-        return loadEdit(change, new RevId(id));
-      }
-      return out;
-    }
-  }
-
-  private List<RevisionResource> byLegacyPatchSetId(ChangeResource change, String id)
-      throws OrmException {
-    PatchSet ps =
-        psUtil.get(
-            dbProvider.get(),
-            change.getNotes(),
-            new PatchSet.Id(change.getId(), Integer.parseInt(id)));
-    if (ps != null) {
-      return Collections.singletonList(new RevisionResource(change, ps));
-    }
-    return Collections.emptyList();
-  }
-
-  private List<RevisionResource> loadEdit(ChangeResource change, RevId revid)
-      throws AuthException, IOException {
-    Optional<ChangeEdit> edit = editUtil.byChange(change.getNotes(), change.getUser());
-    if (edit.isPresent()) {
-      PatchSet ps = new PatchSet(new PatchSet.Id(change.getId(), 0));
-      RevId editRevId = new RevId(ObjectId.toString(edit.get().getEditCommit()));
-      ps.setRevision(editRevId);
-      if (revid == null || editRevId.equals(revid)) {
-        return Collections.singletonList(new RevisionResource(change, ps, edit));
-      }
-    }
-    return Collections.emptyList();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/RobotCommentResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/RobotCommentResource.java
deleted file mode 100644
index 856c777..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/RobotCommentResource.java
+++ /dev/null
@@ -1,51 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.restapi.RestResource;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.RobotComment;
-import com.google.inject.TypeLiteral;
-
-public class RobotCommentResource implements RestResource {
-  public static final TypeLiteral<RestView<RobotCommentResource>> ROBOT_COMMENT_KIND =
-      new TypeLiteral<RestView<RobotCommentResource>>() {};
-
-  private final RevisionResource rev;
-  private final RobotComment comment;
-
-  public RobotCommentResource(RevisionResource rev, RobotComment c) {
-    this.rev = rev;
-    this.comment = c;
-  }
-
-  public PatchSet getPatchSet() {
-    return rev.getPatchSet();
-  }
-
-  RobotComment getComment() {
-    return comment;
-  }
-
-  String getId() {
-    return comment.key.uuid;
-  }
-
-  Account.Id getAuthorId() {
-    return comment.author.getId();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/RobotComments.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/RobotComments.java
deleted file mode 100644
index d1443af..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/RobotComments.java
+++ /dev/null
@@ -1,68 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.ChildCollection;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.reviewdb.client.RobotComment;
-import com.google.gerrit.server.CommentsUtil;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-@Singleton
-public class RobotComments implements ChildCollection<RevisionResource, RobotCommentResource> {
-  private final DynamicMap<RestView<RobotCommentResource>> views;
-  private final ListRobotComments list;
-  private final CommentsUtil commentsUtil;
-
-  @Inject
-  RobotComments(
-      DynamicMap<RestView<RobotCommentResource>> views,
-      ListRobotComments list,
-      CommentsUtil commentsUtil) {
-    this.views = views;
-    this.list = list;
-    this.commentsUtil = commentsUtil;
-  }
-
-  @Override
-  public DynamicMap<RestView<RobotCommentResource>> views() {
-    return views;
-  }
-
-  @Override
-  public ListRobotComments list() {
-    return list;
-  }
-
-  @Override
-  public RobotCommentResource parse(RevisionResource rev, IdString id)
-      throws ResourceNotFoundException, OrmException {
-    String uuid = id.get();
-    ChangeNotes notes = rev.getNotes();
-
-    for (RobotComment c : commentsUtil.robotCommentsByPatchSet(notes, rev.getPatchSet().getId())) {
-      if (uuid.equals(c.key.uuid)) {
-        return new RobotCommentResource(rev, c);
-      }
-    }
-    throw new ResourceNotFoundException(id);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/SetAssigneeOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/SetAssigneeOp.java
deleted file mode 100644
index 73a6c60..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/SetAssigneeOp.java
+++ /dev/null
@@ -1,138 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.change;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.extensions.events.AssigneeChanged;
-import com.google.gerrit.server.mail.send.SetAssigneeSender;
-import com.google.gerrit.server.notedb.ChangeUpdate;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.Context;
-import com.google.gerrit.server.validators.AssigneeValidationListener;
-import com.google.gerrit.server.validators.ValidationException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class SetAssigneeOp implements BatchUpdateOp {
-  private static final Logger log = LoggerFactory.getLogger(SetAssigneeOp.class);
-
-  public interface Factory {
-    SetAssigneeOp create(IdentifiedUser assignee);
-  }
-
-  private final ChangeMessagesUtil cmUtil;
-  private final DynamicSet<AssigneeValidationListener> validationListeners;
-  private final IdentifiedUser newAssignee;
-  private final AssigneeChanged assigneeChanged;
-  private final SetAssigneeSender.Factory setAssigneeSenderFactory;
-  private final Provider<IdentifiedUser> user;
-  private final IdentifiedUser.GenericFactory userFactory;
-
-  private Change change;
-  private IdentifiedUser oldAssignee;
-
-  @Inject
-  SetAssigneeOp(
-      ChangeMessagesUtil cmUtil,
-      DynamicSet<AssigneeValidationListener> validationListeners,
-      AssigneeChanged assigneeChanged,
-      SetAssigneeSender.Factory setAssigneeSenderFactory,
-      Provider<IdentifiedUser> user,
-      IdentifiedUser.GenericFactory userFactory,
-      @Assisted IdentifiedUser newAssignee) {
-    this.cmUtil = cmUtil;
-    this.validationListeners = validationListeners;
-    this.assigneeChanged = assigneeChanged;
-    this.setAssigneeSenderFactory = setAssigneeSenderFactory;
-    this.user = user;
-    this.userFactory = userFactory;
-    this.newAssignee = checkNotNull(newAssignee, "assignee");
-  }
-
-  @Override
-  public boolean updateChange(ChangeContext ctx) throws OrmException, RestApiException {
-    change = ctx.getChange();
-    if (newAssignee.getAccountId().equals(change.getAssignee())) {
-      return false;
-    }
-    try {
-      for (AssigneeValidationListener validator : validationListeners) {
-        validator.validateAssignee(change, newAssignee.getAccount());
-      }
-    } catch (ValidationException e) {
-      throw new ResourceConflictException(e.getMessage());
-    }
-
-    if (change.getAssignee() != null) {
-      oldAssignee = userFactory.create(change.getAssignee());
-    }
-
-    ChangeUpdate update = ctx.getUpdate(change.currentPatchSetId());
-    // notedb
-    update.setAssignee(newAssignee.getAccountId());
-    // reviewdb
-    change.setAssignee(newAssignee.getAccountId());
-    addMessage(ctx, update);
-    return true;
-  }
-
-  private void addMessage(ChangeContext ctx, ChangeUpdate update) throws OrmException {
-    StringBuilder msg = new StringBuilder();
-    msg.append("Assignee ");
-    if (oldAssignee == null) {
-      msg.append("added: ");
-      msg.append(newAssignee.getNameEmail());
-    } else {
-      msg.append("changed from: ");
-      msg.append(oldAssignee.getNameEmail());
-      msg.append(" to: ");
-      msg.append(newAssignee.getNameEmail());
-    }
-    ChangeMessage cmsg =
-        ChangeMessagesUtil.newMessage(ctx, msg.toString(), ChangeMessagesUtil.TAG_SET_ASSIGNEE);
-    cmUtil.addChangeMessage(ctx.getDb(), update, cmsg);
-  }
-
-  @Override
-  public void postUpdate(Context ctx) throws OrmException {
-    try {
-      SetAssigneeSender cm =
-          setAssigneeSenderFactory.create(
-              change.getProject(), change.getId(), newAssignee.getAccountId());
-      cm.setFrom(user.get().getAccountId());
-      cm.send();
-    } catch (Exception err) {
-      log.error("Cannot send email to new assignee of change " + change.getId(), err);
-    }
-    assigneeChanged.fire(
-        change,
-        ctx.getAccount(),
-        oldAssignee != null ? oldAssignee.getAccount() : null,
-        ctx.getWhen());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/SetHashtagsOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/SetHashtagsOp.java
deleted file mode 100644
index 1f17dd3..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/SetHashtagsOp.java
+++ /dev/null
@@ -1,177 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.change;
-
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.gerrit.server.change.HashtagsUtil.extractTags;
-
-import com.google.common.base.Joiner;
-import com.google.common.collect.ImmutableSortedSet;
-import com.google.common.collect.Ordering;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.api.changes.HashtagsInput;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.change.HashtagsUtil.InvalidHashtagException;
-import com.google.gerrit.server.extensions.events.HashtagsEdited;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.ChangeUpdate;
-import com.google.gerrit.server.notedb.NotesMigration;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.Context;
-import com.google.gerrit.server.validators.HashtagValidationListener;
-import com.google.gerrit.server.validators.ValidationException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-public class SetHashtagsOp implements BatchUpdateOp {
-  public interface Factory {
-    SetHashtagsOp create(HashtagsInput input);
-  }
-
-  private final NotesMigration notesMigration;
-  private final ChangeMessagesUtil cmUtil;
-  private final DynamicSet<HashtagValidationListener> validationListeners;
-  private final HashtagsEdited hashtagsEdited;
-  private final HashtagsInput input;
-
-  private boolean fireEvent = true;
-
-  private Change change;
-  private Set<String> toAdd;
-  private Set<String> toRemove;
-  private ImmutableSortedSet<String> updatedHashtags;
-
-  @Inject
-  SetHashtagsOp(
-      NotesMigration notesMigration,
-      ChangeMessagesUtil cmUtil,
-      DynamicSet<HashtagValidationListener> validationListeners,
-      HashtagsEdited hashtagsEdited,
-      @Assisted @Nullable HashtagsInput input) {
-    this.notesMigration = notesMigration;
-    this.cmUtil = cmUtil;
-    this.validationListeners = validationListeners;
-    this.hashtagsEdited = hashtagsEdited;
-    this.input = input;
-  }
-
-  public SetHashtagsOp setFireEvent(boolean fireEvent) {
-    this.fireEvent = fireEvent;
-    return this;
-  }
-
-  @Override
-  public boolean updateChange(ChangeContext ctx)
-      throws AuthException, BadRequestException, MethodNotAllowedException, OrmException,
-          IOException {
-    if (!notesMigration.readChanges()) {
-      throw new MethodNotAllowedException("Cannot add hashtags; NoteDb is disabled");
-    }
-    if (input == null || (input.add == null && input.remove == null)) {
-      updatedHashtags = ImmutableSortedSet.of();
-      return false;
-    }
-
-    change = ctx.getChange();
-    ChangeUpdate update = ctx.getUpdate(change.currentPatchSetId());
-    ChangeNotes notes = update.getNotes().load();
-
-    try {
-      Set<String> existingHashtags = notes.getHashtags();
-      Set<String> updated = new HashSet<>();
-      toAdd = new HashSet<>(extractTags(input.add));
-      toRemove = new HashSet<>(extractTags(input.remove));
-
-      for (HashtagValidationListener validator : validationListeners) {
-        validator.validateHashtags(update.getChange(), toAdd, toRemove);
-      }
-
-      updated.addAll(existingHashtags);
-      toAdd.removeAll(existingHashtags);
-      toRemove.retainAll(existingHashtags);
-      if (updated()) {
-        updated.addAll(toAdd);
-        updated.removeAll(toRemove);
-        update.setHashtags(updated);
-        addMessage(ctx, update);
-      }
-
-      updatedHashtags = ImmutableSortedSet.copyOf(updated);
-      return true;
-    } catch (ValidationException | InvalidHashtagException e) {
-      throw new BadRequestException(e.getMessage());
-    }
-  }
-
-  private void addMessage(ChangeContext ctx, ChangeUpdate update) throws OrmException {
-    StringBuilder msg = new StringBuilder();
-    appendHashtagMessage(msg, "added", toAdd);
-    appendHashtagMessage(msg, "removed", toRemove);
-    ChangeMessage cmsg =
-        ChangeMessagesUtil.newMessage(ctx, msg.toString(), ChangeMessagesUtil.TAG_SET_HASHTAGS);
-    cmUtil.addChangeMessage(ctx.getDb(), update, cmsg);
-  }
-
-  private void appendHashtagMessage(StringBuilder b, String action, Set<String> hashtags) {
-    if (isNullOrEmpty(hashtags)) {
-      return;
-    }
-
-    if (b.length() > 0) {
-      b.append("\n");
-    }
-    b.append("Hashtag");
-    if (hashtags.size() > 1) {
-      b.append("s");
-    }
-    b.append(" ");
-    b.append(action);
-    b.append(": ");
-    b.append(Joiner.on(", ").join(Ordering.natural().sortedCopy(hashtags)));
-  }
-
-  @Override
-  public void postUpdate(Context ctx) throws OrmException {
-    if (updated() && fireEvent) {
-      hashtagsEdited.fire(
-          change, ctx.getAccount(), updatedHashtags, toAdd, toRemove, ctx.getWhen());
-    }
-  }
-
-  public ImmutableSortedSet<String> getUpdatedHashtags() {
-    checkState(updatedHashtags != null, "getUpdatedHashtags() only valid after executing op");
-    return updatedHashtags;
-  }
-
-  private boolean updated() {
-    return !isNullOrEmpty(toAdd) || !isNullOrEmpty(toRemove);
-  }
-
-  private static boolean isNullOrEmpty(Collection<?> coll) {
-    return coll == null || coll.isEmpty();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/SetPrivateOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/SetPrivateOp.java
deleted file mode 100644
index de79f03..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/SetPrivateOp.java
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.change;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.extensions.events.PrivateStateChanged;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.ChangeUpdate;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.Context;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-
-public class SetPrivateOp implements BatchUpdateOp {
-  public static class Input {
-    String message;
-
-    public Input() {}
-
-    public Input(String message) {
-      this.message = message;
-    }
-  }
-
-  public interface Factory {
-    SetPrivateOp create(ChangeMessagesUtil cmUtil, boolean isPrivate, Input input);
-  }
-
-  private final ChangeMessagesUtil cmUtil;
-  private final PatchSetUtil psUtil;
-  private final boolean isPrivate;
-  private final Input input;
-  private final PrivateStateChanged privateStateChanged;
-
-  private Change change;
-  private PatchSet ps;
-
-  @Inject
-  SetPrivateOp(
-      PrivateStateChanged privateStateChanged,
-      PatchSetUtil psUtil,
-      @Assisted ChangeMessagesUtil cmUtil,
-      @Assisted boolean isPrivate,
-      @Assisted Input input) {
-    this.cmUtil = cmUtil;
-    this.psUtil = psUtil;
-    this.isPrivate = isPrivate;
-    this.input = input;
-    this.privateStateChanged = privateStateChanged;
-  }
-
-  @Override
-  public boolean updateChange(ChangeContext ctx) throws ResourceConflictException, OrmException {
-    change = ctx.getChange();
-    ChangeNotes notes = ctx.getNotes();
-    ps = psUtil.get(ctx.getDb(), notes, change.currentPatchSetId());
-    ChangeUpdate update = ctx.getUpdate(change.currentPatchSetId());
-    change.setPrivate(isPrivate);
-    change.setLastUpdatedOn(ctx.getWhen());
-    update.setPrivate(isPrivate);
-    addMessage(ctx, update);
-    return true;
-  }
-
-  @Override
-  public void postUpdate(Context ctx) {
-    privateStateChanged.fire(change, ps, ctx.getAccount(), ctx.getWhen());
-  }
-
-  private void addMessage(ChangeContext ctx, ChangeUpdate update) throws OrmException {
-    Change c = ctx.getChange();
-    StringBuilder buf = new StringBuilder(c.isPrivate() ? "Set private" : "Unset private");
-
-    String m = Strings.nullToEmpty(input == null ? null : input.message).trim();
-    if (!m.isEmpty()) {
-      buf.append("\n\n");
-      buf.append(m);
-    }
-
-    ChangeMessage cmsg =
-        ChangeMessagesUtil.newMessage(
-            ctx,
-            buf.toString(),
-            c.isPrivate()
-                ? ChangeMessagesUtil.TAG_SET_PRIVATE
-                : ChangeMessagesUtil.TAG_UNSET_PRIVATE);
-    cmUtil.addChangeMessage(ctx.getDb(), update, cmsg);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/SetReadyForReview.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/SetReadyForReview.java
deleted file mode 100644
index ca89cc9..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/SetReadyForReview.java
+++ /dev/null
@@ -1,131 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.change;
-
-import static com.google.gerrit.extensions.conditions.BooleanCondition.and;
-import static com.google.gerrit.extensions.conditions.BooleanCondition.or;
-
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.webui.UiAction;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Change.Status;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ChangeUtil;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.change.WorkInProgressOp.Input;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.RetryingRestModifyView;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class SetReadyForReview extends RetryingRestModifyView<ChangeResource, Input, Response<?>>
-    implements UiAction<ChangeResource> {
-  private static final Logger log = LoggerFactory.getLogger(SetReadyForReview.class);
-  private final WorkInProgressOp.Factory opFactory;
-  private final Provider<ReviewDb> db;
-  private final Provider<CurrentUser> self;
-  private final PermissionBackend permissionBackend;
-  private final ProjectControl.GenericFactory projectControlFactory;
-
-  @Inject
-  SetReadyForReview(
-      RetryHelper retryHelper,
-      WorkInProgressOp.Factory opFactory,
-      Provider<ReviewDb> db,
-      Provider<CurrentUser> self,
-      PermissionBackend permissionBackend,
-      ProjectControl.GenericFactory projectControlFactory) {
-    super(retryHelper);
-    this.opFactory = opFactory;
-    this.db = db;
-    this.self = self;
-    this.permissionBackend = permissionBackend;
-    this.projectControlFactory = projectControlFactory;
-  }
-
-  @Override
-  protected Response<?> applyImpl(
-      BatchUpdate.Factory updateFactory, ChangeResource rsrc, Input input)
-      throws RestApiException, UpdateException, PermissionBackendException, NoSuchProjectException,
-          IOException {
-    Change change = rsrc.getChange();
-    WorkInProgressOp.checkPermissions(
-        permissionBackend,
-        self.get(),
-        change,
-        projectControlFactory.controlFor(rsrc.getProject(), rsrc.getUser()));
-    if (!rsrc.isUserOwner()
-        && !permissionBackend.user(self).test(GlobalPermission.ADMINISTRATE_SERVER)
-        && !projectControlFactory.controlFor(rsrc.getProject(), rsrc.getUser()).isOwner()) {
-      throw new AuthException("not allowed to set ready for review");
-    }
-
-    if (change.getStatus() != Status.NEW) {
-      throw new ResourceConflictException("change is " + ChangeUtil.status(change));
-    }
-
-    if (!change.isWorkInProgress()) {
-      throw new ResourceConflictException("change is not work in progress");
-    }
-
-    try (BatchUpdate bu =
-        updateFactory.create(db.get(), rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
-      bu.addOp(rsrc.getChange().getId(), opFactory.create(false, input));
-      bu.execute();
-      return Response.ok("");
-    }
-  }
-
-  @Override
-  public Description getDescription(ChangeResource rsrc) {
-    boolean isProjectOwner;
-    try {
-      isProjectOwner =
-          projectControlFactory.controlFor(rsrc.getProject(), rsrc.getUser()).isOwner();
-    } catch (IOException | NoSuchProjectException e) {
-      isProjectOwner = false;
-      log.error("Cannot retrieve project owner ACL", e);
-    }
-    return new Description()
-        .setLabel("Start Review")
-        .setTitle("Set Ready For Review")
-        .setVisible(
-            and(
-                rsrc.getChange().getStatus() == Status.NEW && rsrc.getChange().isWorkInProgress(),
-                or(
-                    rsrc.isUserOwner(),
-                    or(
-                        isProjectOwner,
-                        permissionBackend
-                            .user(self)
-                            .testCond(GlobalPermission.ADMINISTRATE_SERVER)))));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/SetWorkInProgress.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/SetWorkInProgress.java
deleted file mode 100644
index bd412d7..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/SetWorkInProgress.java
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.change;
-
-import static com.google.gerrit.extensions.conditions.BooleanCondition.and;
-import static com.google.gerrit.extensions.conditions.BooleanCondition.or;
-
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.webui.UiAction;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Change.Status;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ChangeUtil;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.change.WorkInProgressOp.Input;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.RetryingRestModifyView;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class SetWorkInProgress extends RetryingRestModifyView<ChangeResource, Input, Response<?>>
-    implements UiAction<ChangeResource> {
-  private static final Logger log = LoggerFactory.getLogger(SetWorkInProgress.class);
-  private final WorkInProgressOp.Factory opFactory;
-  private final Provider<ReviewDb> db;
-  private final Provider<CurrentUser> self;
-  private final PermissionBackend permissionBackend;
-  private final ProjectControl.GenericFactory projectControlFactory;
-
-  @Inject
-  SetWorkInProgress(
-      WorkInProgressOp.Factory opFactory,
-      RetryHelper retryHelper,
-      Provider<ReviewDb> db,
-      Provider<CurrentUser> self,
-      PermissionBackend permissionBackend,
-      ProjectControl.GenericFactory projectControlFactory) {
-    super(retryHelper);
-    this.opFactory = opFactory;
-    this.db = db;
-    this.self = self;
-    this.permissionBackend = permissionBackend;
-    this.projectControlFactory = projectControlFactory;
-  }
-
-  @Override
-  protected Response<?> applyImpl(
-      BatchUpdate.Factory updateFactory, ChangeResource rsrc, Input input)
-      throws RestApiException, UpdateException, PermissionBackendException, NoSuchProjectException,
-          IOException {
-    Change change = rsrc.getChange();
-    WorkInProgressOp.checkPermissions(
-        permissionBackend,
-        self.get(),
-        change,
-        projectControlFactory.controlFor(rsrc.getProject(), rsrc.getUser()));
-
-    if (change.getStatus() != Status.NEW) {
-      throw new ResourceConflictException("change is " + ChangeUtil.status(change));
-    }
-
-    if (change.isWorkInProgress()) {
-      throw new ResourceConflictException("change is already work in progress");
-    }
-
-    try (BatchUpdate bu =
-        updateFactory.create(db.get(), rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
-      bu.addOp(rsrc.getChange().getId(), opFactory.create(true, input));
-      bu.execute();
-      return Response.ok("");
-    }
-  }
-
-  @Override
-  public Description getDescription(ChangeResource rsrc) {
-    boolean isProjectOwner;
-    try {
-      isProjectOwner =
-          projectControlFactory.controlFor(rsrc.getProject(), rsrc.getUser()).isOwner();
-    } catch (IOException | NoSuchProjectException e) {
-      isProjectOwner = false;
-      log.error("Cannot retrieve project owner ACL", e);
-    }
-    return new Description()
-        .setLabel("WIP")
-        .setTitle("Set Work In Progress")
-        .setVisible(
-            and(
-                rsrc.getChange().getStatus() == Status.NEW && !rsrc.getChange().isWorkInProgress(),
-                or(
-                    rsrc.isUserOwner(),
-                    or(
-                        isProjectOwner,
-                        permissionBackend
-                            .user(self)
-                            .testCond(GlobalPermission.ADMINISTRATE_SERVER)))));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Submit.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Submit.java
deleted file mode 100644
index 84ba88e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Submit.java
+++ /dev/null
@@ -1,535 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.change;
-
-import static java.util.stream.Collectors.joining;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Strings;
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.Sets;
-import com.google.gerrit.common.data.ParameterizedString;
-import com.google.gerrit.extensions.api.changes.SubmitInput;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.extensions.webui.UiAction;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RevId;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.ChangeUtil;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.ProjectUtil;
-import com.google.gerrit.server.account.AccountsCollection;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.git.ChangeSet;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MergeOp;
-import com.google.gerrit.server.git.MergeSuperSet;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.InternalChangeQuery;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.OrmRuntimeException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Queue;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class Submit
-    implements RestModifyView<RevisionResource, SubmitInput>, UiAction<RevisionResource> {
-  private static final Logger log = LoggerFactory.getLogger(Submit.class);
-
-  private static final String DEFAULT_TOOLTIP = "Submit patch set ${patchSet} into ${branch}";
-  private static final String DEFAULT_TOOLTIP_ANCESTORS =
-      "Submit patch set ${patchSet} and ancestors (${submitSize} changes "
-          + "altogether) into ${branch}";
-  private static final String DEFAULT_TOPIC_TOOLTIP =
-      "Submit all ${topicSize} changes of the same topic "
-          + "(${submitSize} changes including ancestors and other "
-          + "changes related by topic)";
-  private static final String BLOCKED_SUBMIT_TOOLTIP =
-      "This change depends on other changes which are not ready";
-  private static final String BLOCKED_HIDDEN_SUBMIT_TOOLTIP =
-      "This change depends on other hidden changes which are not ready";
-  private static final String BLOCKED_WORK_IN_PROGRESS = "This change is marked work in progress";
-  private static final String CLICK_FAILURE_TOOLTIP = "Clicking the button would fail";
-  private static final String CHANGE_UNMERGEABLE = "Problems with integrating this change";
-  private static final String CHANGES_NOT_MERGEABLE = "Problems with change(s): ";
-
-  public static class Output {
-    transient Change change;
-
-    private Output(Change c) {
-      change = c;
-    }
-  }
-
-  /**
-   * Subclass of {@link SubmitInput} with special bits that may be flipped for testing purposes
-   * only.
-   */
-  @VisibleForTesting
-  public static class TestSubmitInput extends SubmitInput {
-    public boolean failAfterRefUpdates;
-
-    /**
-     * For each change being submitted, an element is removed from this queue and, if the value is
-     * true, a bogus ref update is added to the batch, in order to generate a lock failure during
-     * execution.
-     */
-    public Queue<Boolean> generateLockFailures;
-  }
-
-  private final Provider<ReviewDb> dbProvider;
-  private final GitRepositoryManager repoManager;
-  private final PermissionBackend permissionBackend;
-  private final ChangeData.Factory changeDataFactory;
-  private final ChangeMessagesUtil cmUtil;
-  private final ChangeNotes.Factory changeNotesFactory;
-  private final Provider<MergeOp> mergeOpProvider;
-  private final Provider<MergeSuperSet> mergeSuperSet;
-  private final AccountsCollection accounts;
-  private final String label;
-  private final String labelWithParents;
-  private final ParameterizedString titlePattern;
-  private final ParameterizedString titlePatternWithAncestors;
-  private final String submitTopicLabel;
-  private final ParameterizedString submitTopicTooltip;
-  private final boolean submitWholeTopic;
-  private final Provider<InternalChangeQuery> queryProvider;
-  private final PatchSetUtil psUtil;
-
-  @Inject
-  Submit(
-      Provider<ReviewDb> dbProvider,
-      GitRepositoryManager repoManager,
-      PermissionBackend permissionBackend,
-      ChangeData.Factory changeDataFactory,
-      ChangeMessagesUtil cmUtil,
-      ChangeNotes.Factory changeNotesFactory,
-      Provider<MergeOp> mergeOpProvider,
-      Provider<MergeSuperSet> mergeSuperSet,
-      AccountsCollection accounts,
-      @GerritServerConfig Config cfg,
-      Provider<InternalChangeQuery> queryProvider,
-      PatchSetUtil psUtil) {
-    this.dbProvider = dbProvider;
-    this.repoManager = repoManager;
-    this.permissionBackend = permissionBackend;
-    this.changeDataFactory = changeDataFactory;
-    this.cmUtil = cmUtil;
-    this.changeNotesFactory = changeNotesFactory;
-    this.mergeOpProvider = mergeOpProvider;
-    this.mergeSuperSet = mergeSuperSet;
-    this.accounts = accounts;
-    this.label =
-        MoreObjects.firstNonNull(
-            Strings.emptyToNull(cfg.getString("change", null, "submitLabel")), "Submit");
-    this.labelWithParents =
-        MoreObjects.firstNonNull(
-            Strings.emptyToNull(cfg.getString("change", null, "submitLabelWithParents")),
-            "Submit including parents");
-    this.titlePattern =
-        new ParameterizedString(
-            MoreObjects.firstNonNull(
-                cfg.getString("change", null, "submitTooltip"), DEFAULT_TOOLTIP));
-    this.titlePatternWithAncestors =
-        new ParameterizedString(
-            MoreObjects.firstNonNull(
-                cfg.getString("change", null, "submitTooltipAncestors"),
-                DEFAULT_TOOLTIP_ANCESTORS));
-    submitWholeTopic = wholeTopicEnabled(cfg);
-    this.submitTopicLabel =
-        MoreObjects.firstNonNull(
-            Strings.emptyToNull(cfg.getString("change", null, "submitTopicLabel")),
-            "Submit whole topic");
-    this.submitTopicTooltip =
-        new ParameterizedString(
-            MoreObjects.firstNonNull(
-                cfg.getString("change", null, "submitTopicTooltip"), DEFAULT_TOPIC_TOOLTIP));
-    this.queryProvider = queryProvider;
-    this.psUtil = psUtil;
-  }
-
-  @Override
-  public Output apply(RevisionResource rsrc, SubmitInput input)
-      throws RestApiException, RepositoryNotFoundException, IOException, OrmException,
-          PermissionBackendException, UpdateException, ConfigInvalidException {
-    input.onBehalfOf = Strings.emptyToNull(input.onBehalfOf);
-    IdentifiedUser submitter;
-    if (input.onBehalfOf != null) {
-      submitter = onBehalfOf(rsrc, input);
-    } else {
-      rsrc.permissions().check(ChangePermission.SUBMIT);
-      submitter = rsrc.getUser().asIdentifiedUser();
-    }
-
-    return new Output(mergeChange(rsrc, submitter, input));
-  }
-
-  public Change mergeChange(RevisionResource rsrc, IdentifiedUser submitter, SubmitInput input)
-      throws OrmException, RestApiException, IOException, UpdateException, ConfigInvalidException,
-          PermissionBackendException {
-    Change change = rsrc.getChange();
-    if (!change.getStatus().isOpen()) {
-      throw new ResourceConflictException("change is " + ChangeUtil.status(change));
-    } else if (!ProjectUtil.branchExists(repoManager, change.getDest())) {
-      throw new ResourceConflictException(
-          String.format("destination branch \"%s\" not found.", change.getDest().get()));
-    } else if (!rsrc.getPatchSet().getId().equals(change.currentPatchSetId())) {
-      // TODO Allow submitting non-current revision by changing the current.
-      throw new ResourceConflictException(
-          String.format(
-              "revision %s is not current revision", rsrc.getPatchSet().getRevision().get()));
-    }
-
-    try (MergeOp op = mergeOpProvider.get()) {
-      ReviewDb db = dbProvider.get();
-      op.merge(db, change, submitter, true, input, false);
-      try {
-        change =
-            changeNotesFactory.createChecked(db, change.getProject(), change.getId()).getChange();
-      } catch (NoSuchChangeException e) {
-        throw new ResourceConflictException("change is deleted");
-      }
-    }
-
-    switch (change.getStatus()) {
-      case MERGED:
-        return change;
-      case NEW:
-        ChangeMessage msg = getConflictMessage(rsrc);
-        if (msg != null) {
-          throw new ResourceConflictException(msg.getMessage());
-        }
-        // $FALL-THROUGH$
-      case ABANDONED:
-      default:
-        throw new ResourceConflictException("change is " + ChangeUtil.status(change));
-    }
-  }
-
-  /**
-   * @param cd the change the user is currently looking at
-   * @param cs set of changes to be submitted at once
-   * @param user the user who is checking to submit
-   * @return a reason why any of the changes is not submittable or null
-   */
-  private String problemsForSubmittingChangeset(ChangeData cd, ChangeSet cs, CurrentUser user) {
-    try {
-      if (cs.furtherHiddenChanges()) {
-        return BLOCKED_HIDDEN_SUBMIT_TOOLTIP;
-      }
-      for (ChangeData c : cs.changes()) {
-        Set<ChangePermission> can =
-            permissionBackend
-                .user(user)
-                .database(dbProvider)
-                .change(c)
-                .test(EnumSet.of(ChangePermission.READ, ChangePermission.SUBMIT));
-        if (!can.contains(ChangePermission.READ)) {
-          return BLOCKED_HIDDEN_SUBMIT_TOOLTIP;
-        }
-        if (!can.contains(ChangePermission.SUBMIT)) {
-          return BLOCKED_SUBMIT_TOOLTIP;
-        }
-        if (c.change().isWorkInProgress()) {
-          return BLOCKED_WORK_IN_PROGRESS;
-        }
-        MergeOp.checkSubmitRule(c, false);
-      }
-
-      Collection<ChangeData> unmergeable = unmergeableChanges(cs);
-      if (unmergeable == null) {
-        return CLICK_FAILURE_TOOLTIP;
-      } else if (!unmergeable.isEmpty()) {
-        for (ChangeData c : unmergeable) {
-          if (c.change().getKey().equals(cd.change().getKey())) {
-            return CHANGE_UNMERGEABLE;
-          }
-        }
-        return CHANGES_NOT_MERGEABLE
-            + unmergeable.stream().map(c -> c.getId().toString()).collect(joining(", "));
-      }
-    } catch (ResourceConflictException e) {
-      return BLOCKED_SUBMIT_TOOLTIP;
-    } catch (PermissionBackendException | OrmException | IOException e) {
-      log.error("Error checking if change is submittable", e);
-      throw new OrmRuntimeException("Could not determine problems for the change", e);
-    }
-    return null;
-  }
-
-  @Override
-  public UiAction.Description getDescription(RevisionResource resource) {
-    Change change = resource.getChange();
-    if (!change.getStatus().isOpen()
-        || !resource.isCurrent()
-        || !resource.permissions().testOrFalse(ChangePermission.SUBMIT)) {
-      return null; // submit not visible
-    }
-
-    ReviewDb db = dbProvider.get();
-    ChangeData cd = changeDataFactory.create(db, resource.getNotes());
-    try {
-      MergeOp.checkSubmitRule(cd, false);
-    } catch (ResourceConflictException e) {
-      return null; // submit not visible
-    } catch (OrmException e) {
-      log.error("Error checking if change is submittable", e);
-      throw new OrmRuntimeException("Could not determine problems for the change", e);
-    }
-
-    ChangeSet cs;
-    try {
-      cs = mergeSuperSet.get().completeChangeSet(db, cd.change(), resource.getUser());
-    } catch (OrmException | IOException | PermissionBackendException e) {
-      throw new OrmRuntimeException(
-          "Could not determine complete set of changes to be submitted", e);
-    }
-
-    String topic = change.getTopic();
-    int topicSize = 0;
-    if (!Strings.isNullOrEmpty(topic)) {
-      topicSize = getChangesByTopic(topic).size();
-    }
-    boolean treatWithTopic = submitWholeTopic && !Strings.isNullOrEmpty(topic) && topicSize > 1;
-
-    String submitProblems = problemsForSubmittingChangeset(cd, cs, resource.getUser());
-
-    Boolean enabled;
-    try {
-      // Recheck mergeability rather than using value stored in the index,
-      // which may be stale.
-      // TODO(dborowitz): This is ugly; consider providing a way to not read
-      // stored fields from the index in the first place.
-      // cd.setMergeable(null);
-      // That was done in unmergeableChanges which was called by
-      // problemsForSubmittingChangeset, so now it is safe to read from
-      // the cache, as it yields the same result.
-      enabled = cd.isMergeable();
-    } catch (OrmException e) {
-      throw new OrmRuntimeException("Could not determine mergeability", e);
-    }
-
-    if (submitProblems != null) {
-      return new UiAction.Description()
-          .setLabel(treatWithTopic ? submitTopicLabel : (cs.size() > 1) ? labelWithParents : label)
-          .setTitle(submitProblems)
-          .setVisible(true)
-          .setEnabled(false);
-    }
-
-    if (treatWithTopic) {
-      Map<String, String> params =
-          ImmutableMap.of(
-              "topicSize", String.valueOf(topicSize),
-              "submitSize", String.valueOf(cs.size()));
-      return new UiAction.Description()
-          .setLabel(submitTopicLabel)
-          .setTitle(Strings.emptyToNull(submitTopicTooltip.replace(params)))
-          .setVisible(true)
-          .setEnabled(Boolean.TRUE.equals(enabled));
-    }
-    RevId revId = resource.getPatchSet().getRevision();
-    Map<String, String> params =
-        ImmutableMap.of(
-            "patchSet", String.valueOf(resource.getPatchSet().getPatchSetId()),
-            "branch", change.getDest().getShortName(),
-            "commit", ObjectId.fromString(revId.get()).abbreviate(7).name(),
-            "submitSize", String.valueOf(cs.size()));
-    ParameterizedString tp = cs.size() > 1 ? titlePatternWithAncestors : titlePattern;
-    return new UiAction.Description()
-        .setLabel(cs.size() > 1 ? labelWithParents : label)
-        .setTitle(Strings.emptyToNull(tp.replace(params)))
-        .setVisible(true)
-        .setEnabled(Boolean.TRUE.equals(enabled));
-  }
-
-  /**
-   * If the merge was attempted and it failed the system usually writes a comment as a ChangeMessage
-   * and sets status to NEW. Find the relevant message and return it.
-   */
-  public ChangeMessage getConflictMessage(RevisionResource rsrc) throws OrmException {
-    return FluentIterable.from(
-            cmUtil.byPatchSet(dbProvider.get(), rsrc.getNotes(), rsrc.getPatchSet().getId()))
-        .filter(cm -> cm.getAuthor() == null)
-        .last()
-        .orNull();
-  }
-
-  public Collection<ChangeData> unmergeableChanges(ChangeSet cs) throws OrmException, IOException {
-    Set<ChangeData> mergeabilityMap = new HashSet<>();
-    for (ChangeData change : cs.changes()) {
-      mergeabilityMap.add(change);
-    }
-
-    ListMultimap<Branch.NameKey, ChangeData> cbb = cs.changesByBranch();
-    for (Branch.NameKey branch : cbb.keySet()) {
-      Collection<ChangeData> targetBranch = cbb.get(branch);
-      HashMap<Change.Id, RevCommit> commits = findCommits(targetBranch, branch.getParentKey());
-
-      Set<ObjectId> allParents = Sets.newHashSetWithExpectedSize(cs.size());
-      for (RevCommit commit : commits.values()) {
-        for (RevCommit parent : commit.getParents()) {
-          allParents.add(parent.getId());
-        }
-      }
-
-      for (ChangeData change : targetBranch) {
-        RevCommit commit = commits.get(change.getId());
-        boolean isMergeCommit = commit.getParentCount() > 1;
-        boolean isLastInChain = !allParents.contains(commit.getId());
-
-        // Recheck mergeability rather than using value stored in the index,
-        // which may be stale.
-        // TODO(dborowitz): This is ugly; consider providing a way to not read
-        // stored fields from the index in the first place.
-        change.setMergeable(null);
-        Boolean mergeable = change.isMergeable();
-        if (mergeable == null) {
-          // Skip whole check, cannot determine if mergeable
-          return null;
-        }
-        if (mergeable) {
-          mergeabilityMap.remove(change);
-        }
-
-        if (isLastInChain && isMergeCommit && mergeable) {
-          for (ChangeData c : targetBranch) {
-            mergeabilityMap.remove(c);
-          }
-          break;
-        }
-      }
-    }
-    return mergeabilityMap;
-  }
-
-  private HashMap<Change.Id, RevCommit> findCommits(
-      Collection<ChangeData> changes, Project.NameKey project) throws IOException, OrmException {
-    HashMap<Change.Id, RevCommit> commits = new HashMap<>();
-    try (Repository repo = repoManager.openRepository(project);
-        RevWalk walk = new RevWalk(repo)) {
-      for (ChangeData change : changes) {
-        RevCommit commit =
-            walk.parseCommit(
-                ObjectId.fromString(
-                    psUtil.current(dbProvider.get(), change.notes()).getRevision().get()));
-        commits.put(change.getId(), commit);
-      }
-    }
-    return commits;
-  }
-
-  private IdentifiedUser onBehalfOf(RevisionResource rsrc, SubmitInput in)
-      throws AuthException, UnprocessableEntityException, OrmException, PermissionBackendException,
-          IOException, ConfigInvalidException {
-    PermissionBackend.ForChange perm = rsrc.permissions().database(dbProvider);
-    perm.check(ChangePermission.SUBMIT);
-    perm.check(ChangePermission.SUBMIT_AS);
-
-    CurrentUser caller = rsrc.getUser();
-    IdentifiedUser submitter = accounts.parseOnBehalfOf(caller, in.onBehalfOf);
-    try {
-      perm.user(submitter).check(ChangePermission.READ);
-    } catch (AuthException e) {
-      throw new UnprocessableEntityException(
-          String.format("on_behalf_of account %s cannot see change", submitter.getAccountId()));
-    }
-    return submitter;
-  }
-
-  public static boolean wholeTopicEnabled(Config config) {
-    return config.getBoolean("change", null, "submitWholeTopic", false);
-  }
-
-  private List<ChangeData> getChangesByTopic(String topic) {
-    try {
-      return queryProvider.get().byTopicOpen(topic);
-    } catch (OrmException e) {
-      throw new OrmRuntimeException(e);
-    }
-  }
-
-  public static class CurrentRevision implements RestModifyView<ChangeResource, SubmitInput> {
-    private final Provider<ReviewDb> dbProvider;
-    private final Submit submit;
-    private final ChangeJson.Factory json;
-    private final PatchSetUtil psUtil;
-
-    @Inject
-    CurrentRevision(
-        Provider<ReviewDb> dbProvider,
-        Submit submit,
-        ChangeJson.Factory json,
-        PatchSetUtil psUtil) {
-      this.dbProvider = dbProvider;
-      this.submit = submit;
-      this.json = json;
-      this.psUtil = psUtil;
-    }
-
-    @Override
-    public ChangeInfo apply(ChangeResource rsrc, SubmitInput input)
-        throws RestApiException, RepositoryNotFoundException, IOException, OrmException,
-            PermissionBackendException, UpdateException, ConfigInvalidException {
-      PatchSet ps = psUtil.current(dbProvider.get(), rsrc.getNotes());
-      if (ps == null) {
-        throw new ResourceConflictException("current revision is missing");
-      }
-
-      Output out = submit.apply(new RevisionResource(rsrc, ps), input);
-      return json.noOptions().format(out.change);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/SubmittedTogether.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/SubmittedTogether.java
deleted file mode 100644
index 98e47a9..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/SubmittedTogether.java
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.change;
-
-import static com.google.gerrit.extensions.api.changes.SubmittedTogetherOption.NON_VISIBLE_CHANGES;
-
-import com.google.gerrit.extensions.api.changes.SubmittedTogetherInfo;
-import com.google.gerrit.extensions.api.changes.SubmittedTogetherOption;
-import com.google.gerrit.extensions.client.ChangeStatus;
-import com.google.gerrit.extensions.client.ListChangesOption;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.change.WalkSorter.PatchSetData;
-import com.google.gerrit.server.git.ChangeSet;
-import com.google.gerrit.server.git.MergeSuperSet;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.InternalChangeQuery;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.List;
-import org.kohsuke.args4j.Option;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class SubmittedTogether implements RestReadView<ChangeResource> {
-  private static final Logger log = LoggerFactory.getLogger(SubmittedTogether.class);
-
-  private final EnumSet<SubmittedTogetherOption> options =
-      EnumSet.noneOf(SubmittedTogetherOption.class);
-
-  private final EnumSet<ListChangesOption> jsonOpt =
-      EnumSet.of(
-          ListChangesOption.CURRENT_REVISION,
-          ListChangesOption.CURRENT_COMMIT,
-          ListChangesOption.SUBMITTABLE);
-
-  private final ChangeJson.Factory json;
-  private final Provider<ReviewDb> dbProvider;
-  private final Provider<InternalChangeQuery> queryProvider;
-  private final Provider<MergeSuperSet> mergeSuperSet;
-  private final Provider<WalkSorter> sorter;
-
-  @Option(name = "-o", usage = "Output options")
-  void addOption(String option) {
-    for (ListChangesOption o : ListChangesOption.values()) {
-      if (o.name().equalsIgnoreCase(option)) {
-        jsonOpt.add(o);
-        return;
-      }
-    }
-
-    for (SubmittedTogetherOption o : SubmittedTogetherOption.values()) {
-      if (o.name().equalsIgnoreCase(option)) {
-        options.add(o);
-        return;
-      }
-    }
-
-    throw new IllegalArgumentException("option not recognized: " + option);
-  }
-
-  @Inject
-  SubmittedTogether(
-      ChangeJson.Factory json,
-      Provider<ReviewDb> dbProvider,
-      Provider<InternalChangeQuery> queryProvider,
-      Provider<MergeSuperSet> mergeSuperSet,
-      Provider<WalkSorter> sorter) {
-    this.json = json;
-    this.dbProvider = dbProvider;
-    this.queryProvider = queryProvider;
-    this.mergeSuperSet = mergeSuperSet;
-    this.sorter = sorter;
-  }
-
-  public SubmittedTogether addListChangesOption(EnumSet<ListChangesOption> o) {
-    jsonOpt.addAll(o);
-    return this;
-  }
-
-  public SubmittedTogether addSubmittedTogetherOption(EnumSet<SubmittedTogetherOption> o) {
-    options.addAll(o);
-    return this;
-  }
-
-  @Override
-  public Object apply(ChangeResource resource)
-      throws AuthException, BadRequestException, ResourceConflictException, IOException,
-          OrmException, PermissionBackendException {
-    SubmittedTogetherInfo info = applyInfo(resource);
-    if (options.isEmpty()) {
-      return info.changes;
-    }
-    return info;
-  }
-
-  public SubmittedTogetherInfo applyInfo(ChangeResource resource)
-      throws AuthException, IOException, OrmException, PermissionBackendException {
-    Change c = resource.getChange();
-    try {
-      List<ChangeData> cds;
-      int hidden;
-
-      if (c.getStatus().isOpen()) {
-        ChangeSet cs =
-            mergeSuperSet.get().completeChangeSet(dbProvider.get(), c, resource.getUser());
-        cds = cs.changes().asList();
-        hidden = cs.nonVisibleChanges().size();
-      } else if (c.getStatus().asChangeStatus() == ChangeStatus.MERGED) {
-        cds = queryProvider.get().bySubmissionId(c.getSubmissionId());
-        hidden = 0;
-      } else {
-        cds = Collections.emptyList();
-        hidden = 0;
-      }
-
-      if (hidden != 0 && !options.contains(NON_VISIBLE_CHANGES)) {
-        throw new AuthException("change would be submitted with a change that you cannot see");
-      }
-
-      if (cds.size() <= 1 && hidden == 0) {
-        cds = Collections.emptyList();
-      } else {
-        // Skip sorting for singleton lists, to avoid WalkSorter opening the
-        // repo just to fill out the commit field in PatchSetData.
-        cds = sort(cds);
-      }
-
-      SubmittedTogetherInfo info = new SubmittedTogetherInfo();
-      info.changes = json.create(jsonOpt).formatChangeDatas(cds);
-      info.nonVisibleChanges = hidden;
-      return info;
-    } catch (OrmException | IOException e) {
-      log.error("Error on getting a ChangeSet", e);
-      throw e;
-    }
-  }
-
-  private List<ChangeData> sort(List<ChangeData> cds) throws OrmException, IOException {
-    List<ChangeData> sorted = new ArrayList<>(cds.size());
-    for (PatchSetData psd : sorter.get().sort(cds)) {
-      sorted.add(psd.data());
-    }
-    return sorted;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/SuggestChangeReviewers.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/SuggestChangeReviewers.java
deleted file mode 100644
index 4d3abb2..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/SuggestChangeReviewers.java
+++ /dev/null
@@ -1,99 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.common.AccountVisibility;
-import com.google.gerrit.extensions.common.SuggestedReviewerInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.IdentifiedUser.GenericFactory;
-import com.google.gerrit.server.ReviewersUtil;
-import com.google.gerrit.server.ReviewersUtil.VisibilityControl;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.RefPermission;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.util.List;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.Config;
-import org.kohsuke.args4j.Option;
-
-public class SuggestChangeReviewers extends SuggestReviewers
-    implements RestReadView<ChangeResource> {
-
-  @Option(
-      name = "--exclude-groups",
-      aliases = {"-e"},
-      usage = "exclude groups from query")
-  boolean excludeGroups;
-
-  private final PermissionBackend permissionBackend;
-  private final Provider<CurrentUser> self;
-  private final ProjectCache projectCache;
-
-  @Inject
-  SuggestChangeReviewers(
-      AccountVisibility av,
-      GenericFactory identifiedUserFactory,
-      Provider<ReviewDb> dbProvider,
-      PermissionBackend permissionBackend,
-      Provider<CurrentUser> self,
-      @GerritServerConfig Config cfg,
-      ReviewersUtil reviewersUtil,
-      ProjectCache projectCache) {
-    super(av, identifiedUserFactory, dbProvider, cfg, reviewersUtil);
-    this.permissionBackend = permissionBackend;
-    this.self = self;
-    this.projectCache = projectCache;
-  }
-
-  @Override
-  public List<SuggestedReviewerInfo> apply(ChangeResource rsrc)
-      throws AuthException, BadRequestException, OrmException, IOException, ConfigInvalidException {
-    if (!self.get().isIdentifiedUser()) {
-      throw new AuthException("Authentication required");
-    }
-    return reviewersUtil.suggestReviewers(
-        rsrc.getNotes(),
-        this,
-        projectCache.checkedGet(rsrc.getProject()),
-        getVisibility(rsrc),
-        excludeGroups);
-  }
-
-  private VisibilityControl getVisibility(ChangeResource rsrc) {
-    // Use the destination reference, not the change, as drafts may deny
-    // anyone who is not already a reviewer.
-    // TODO(hiesel) Replace this with a check on the change resource once support for drafts was
-    // removed
-    PermissionBackend.ForRef perm = permissionBackend.user(self).ref(rsrc.getChange().getDest());
-    return new VisibilityControl() {
-      @Override
-      public boolean isVisibleTo(Account.Id account) throws OrmException {
-        IdentifiedUser who = identifiedUserFactory.create(account);
-        return perm.user(who).testOrFalse(RefPermission.READ);
-      }
-    };
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/SuggestReviewers.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/SuggestReviewers.java
deleted file mode 100644
index 6124f42..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/SuggestReviewers.java
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.common.AccountVisibility;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.ReviewersUtil;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import org.eclipse.jgit.lib.Config;
-import org.kohsuke.args4j.Option;
-
-public class SuggestReviewers {
-  private static final int DEFAULT_MAX_SUGGESTED = 10;
-
-  protected final Provider<ReviewDb> dbProvider;
-  protected final IdentifiedUser.GenericFactory identifiedUserFactory;
-  protected final ReviewersUtil reviewersUtil;
-
-  private final boolean suggestAccounts;
-  private final int maxAllowed;
-  private final int maxAllowedWithoutConfirmation;
-  protected int limit;
-  protected String query;
-  protected final int maxSuggestedReviewers;
-
-  @Option(
-      name = "--limit",
-      aliases = {"-n"},
-      metaVar = "CNT",
-      usage = "maximum number of reviewers to list")
-  public void setLimit(int l) {
-    this.limit = l <= 0 ? maxSuggestedReviewers : Math.min(l, maxSuggestedReviewers);
-  }
-
-  @Option(
-      name = "--query",
-      aliases = {"-q"},
-      metaVar = "QUERY",
-      usage = "match reviewers query")
-  public void setQuery(String q) {
-    this.query = q;
-  }
-
-  public String getQuery() {
-    return query;
-  }
-
-  public boolean getSuggestAccounts() {
-    return suggestAccounts;
-  }
-
-  public int getLimit() {
-    return limit;
-  }
-
-  public int getMaxAllowed() {
-    return maxAllowed;
-  }
-
-  public int getMaxAllowedWithoutConfirmation() {
-    return maxAllowedWithoutConfirmation;
-  }
-
-  @Inject
-  public SuggestReviewers(
-      AccountVisibility av,
-      IdentifiedUser.GenericFactory identifiedUserFactory,
-      Provider<ReviewDb> dbProvider,
-      @GerritServerConfig Config cfg,
-      ReviewersUtil reviewersUtil) {
-    this.dbProvider = dbProvider;
-    this.identifiedUserFactory = identifiedUserFactory;
-    this.reviewersUtil = reviewersUtil;
-    this.maxSuggestedReviewers =
-        cfg.getInt("suggest", "maxSuggestedReviewers", DEFAULT_MAX_SUGGESTED);
-    this.limit = this.maxSuggestedReviewers;
-    String suggest = cfg.getString("suggest", null, "accounts");
-    if ("OFF".equalsIgnoreCase(suggest) || "false".equalsIgnoreCase(suggest)) {
-      this.suggestAccounts = false;
-    } else {
-      this.suggestAccounts = (av != AccountVisibility.NONE);
-    }
-
-    this.maxAllowed = cfg.getInt("addreviewer", "maxAllowed", PostReviewers.DEFAULT_MAX_REVIEWERS);
-    this.maxAllowedWithoutConfirmation =
-        cfg.getInt(
-            "addreviewer",
-            "maxWithoutConfirmation",
-            PostReviewers.DEFAULT_MAX_REVIEWERS_WITHOUT_CHECK);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/TestSubmitRule.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/TestSubmitRule.java
deleted file mode 100644
index 1792c83..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/TestSubmitRule.java
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.change;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.collect.Lists;
-import com.google.gerrit.common.data.SubmitRecord;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.TestSubmitRuleInput;
-import com.google.gerrit.extensions.common.TestSubmitRuleInput.Filters;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.rules.RulesCache;
-import com.google.gerrit.server.account.AccountLoader;
-import com.google.gerrit.server.project.SubmitRuleEvaluator;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import org.kohsuke.args4j.Option;
-
-public class TestSubmitRule implements RestModifyView<RevisionResource, TestSubmitRuleInput> {
-  private final Provider<ReviewDb> db;
-  private final ChangeData.Factory changeDataFactory;
-  private final RulesCache rules;
-  private final AccountLoader.Factory accountInfoFactory;
-  private final SubmitRuleEvaluator.Factory submitRuleEvaluatorFactory;
-
-  @Option(name = "--filters", usage = "impact of filters in parent projects")
-  private Filters filters = Filters.RUN;
-
-  @Inject
-  TestSubmitRule(
-      Provider<ReviewDb> db,
-      ChangeData.Factory changeDataFactory,
-      RulesCache rules,
-      AccountLoader.Factory infoFactory,
-      SubmitRuleEvaluator.Factory submitRuleEvaluatorFactory) {
-    this.db = db;
-    this.changeDataFactory = changeDataFactory;
-    this.rules = rules;
-    this.accountInfoFactory = infoFactory;
-    this.submitRuleEvaluatorFactory = submitRuleEvaluatorFactory;
-  }
-
-  @Override
-  public List<Record> apply(RevisionResource rsrc, TestSubmitRuleInput input)
-      throws AuthException, OrmException {
-    if (input == null) {
-      input = new TestSubmitRuleInput();
-    }
-    if (input.rule != null && !rules.isProjectRulesEnabled()) {
-      throw new AuthException("project rules are disabled");
-    }
-    input.filters = MoreObjects.firstNonNull(input.filters, filters);
-    SubmitRuleEvaluator evaluator =
-        submitRuleEvaluatorFactory.create(
-            rsrc.getUser(), changeDataFactory.create(db.get(), rsrc.getNotes()));
-
-    List<SubmitRecord> records =
-        evaluator
-            .setPatchSet(rsrc.getPatchSet())
-            .setLogErrors(false)
-            .setSkipSubmitFilters(input.filters == Filters.SKIP)
-            .setRule(input.rule)
-            .evaluate();
-    List<Record> out = Lists.newArrayListWithCapacity(records.size());
-    AccountLoader accounts = accountInfoFactory.create(true);
-    for (SubmitRecord r : records) {
-      out.add(new Record(r, accounts));
-    }
-    if (!out.isEmpty()) {
-      out.get(0).prologReductionCount = evaluator.getReductionsConsumed();
-    }
-    accounts.fill();
-    return out;
-  }
-
-  static class Record {
-    SubmitRecord.Status status;
-    String errorMessage;
-    Map<String, AccountInfo> ok;
-    Map<String, AccountInfo> reject;
-    Map<String, None> need;
-    Map<String, AccountInfo> may;
-    Map<String, None> impossible;
-    Long prologReductionCount;
-
-    Record(SubmitRecord r, AccountLoader accounts) {
-      this.status = r.status;
-      this.errorMessage = r.errorMessage;
-
-      if (r.labels != null) {
-        for (SubmitRecord.Label n : r.labels) {
-          AccountInfo who = n.appliedBy != null ? accounts.get(n.appliedBy) : new AccountInfo(null);
-          label(n, who);
-        }
-      }
-    }
-
-    private void label(SubmitRecord.Label n, AccountInfo who) {
-      switch (n.status) {
-        case OK:
-          if (ok == null) {
-            ok = new LinkedHashMap<>();
-          }
-          ok.put(n.label, who);
-          break;
-        case REJECT:
-          if (reject == null) {
-            reject = new LinkedHashMap<>();
-          }
-          reject.put(n.label, who);
-          break;
-        case NEED:
-          if (need == null) {
-            need = new LinkedHashMap<>();
-          }
-          need.put(n.label, new None());
-          break;
-        case MAY:
-          if (may == null) {
-            may = new LinkedHashMap<>();
-          }
-          may.put(n.label, who);
-          break;
-        case IMPOSSIBLE:
-          if (impossible == null) {
-            impossible = new LinkedHashMap<>();
-          }
-          impossible.put(n.label, new None());
-          break;
-      }
-    }
-  }
-
-  static class None {}
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/TestSubmitType.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/TestSubmitType.java
deleted file mode 100644
index ca6f9cf..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/TestSubmitType.java
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.change;
-
-import com.google.common.base.MoreObjects;
-import com.google.gerrit.common.data.SubmitTypeRecord;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.extensions.common.TestSubmitRuleInput;
-import com.google.gerrit.extensions.common.TestSubmitRuleInput.Filters;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.rules.RulesCache;
-import com.google.gerrit.server.project.SubmitRuleEvaluator;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import org.kohsuke.args4j.Option;
-
-public class TestSubmitType implements RestModifyView<RevisionResource, TestSubmitRuleInput> {
-  private final Provider<ReviewDb> db;
-  private final ChangeData.Factory changeDataFactory;
-  private final RulesCache rules;
-  private final SubmitRuleEvaluator.Factory submitRuleEvaluatorFactory;
-
-  @Option(name = "--filters", usage = "impact of filters in parent projects")
-  private Filters filters = Filters.RUN;
-
-  @Inject
-  TestSubmitType(
-      Provider<ReviewDb> db,
-      ChangeData.Factory changeDataFactory,
-      RulesCache rules,
-      SubmitRuleEvaluator.Factory submitRuleEvaluatorFactory) {
-    this.db = db;
-    this.changeDataFactory = changeDataFactory;
-    this.rules = rules;
-    this.submitRuleEvaluatorFactory = submitRuleEvaluatorFactory;
-  }
-
-  @Override
-  public SubmitType apply(RevisionResource rsrc, TestSubmitRuleInput input)
-      throws AuthException, BadRequestException, OrmException {
-    if (input == null) {
-      input = new TestSubmitRuleInput();
-    }
-    if (input.rule != null && !rules.isProjectRulesEnabled()) {
-      throw new AuthException("project rules are disabled");
-    }
-    input.filters = MoreObjects.firstNonNull(input.filters, filters);
-    SubmitRuleEvaluator evaluator =
-        submitRuleEvaluatorFactory.create(
-            rsrc.getUser(), changeDataFactory.create(db.get(), rsrc.getNotes()));
-
-    SubmitTypeRecord rec =
-        evaluator
-            .setPatchSet(rsrc.getPatchSet())
-            .setLogErrors(false)
-            .setSkipSubmitFilters(input.filters == Filters.SKIP)
-            .setRule(input.rule)
-            .getSubmitType();
-    if (rec.status != SubmitTypeRecord.Status.OK) {
-      throw new BadRequestException(
-          String.format("rule %s produced invalid result: %s", evaluator.getSubmitRuleName(), rec));
-    }
-
-    return rec.type;
-  }
-
-  public static class Get implements RestReadView<RevisionResource> {
-    private final TestSubmitType test;
-
-    @Inject
-    Get(TestSubmitType test) {
-      this.test = test;
-    }
-
-    @Override
-    public SubmitType apply(RevisionResource resource)
-        throws AuthException, BadRequestException, OrmException {
-      return test.apply(resource, null);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Unignore.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Unignore.java
deleted file mode 100644
index 2bad16c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Unignore.java
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.webui.UiAction;
-import com.google.gerrit.server.StarredChangesUtil;
-import com.google.gerrit.server.StarredChangesUtil.IllegalLabelException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class Unignore
-    implements RestModifyView<ChangeResource, Unignore.Input>, UiAction<ChangeResource> {
-  private static final Logger log = LoggerFactory.getLogger(Unignore.class);
-
-  public static class Input {}
-
-  private final StarredChangesUtil stars;
-
-  @Inject
-  Unignore(StarredChangesUtil stars) {
-    this.stars = stars;
-  }
-
-  @Override
-  public Description getDescription(ChangeResource rsrc) {
-    return new UiAction.Description()
-        .setLabel("Unignore")
-        .setTitle("Unignore the change")
-        .setVisible(isIgnored(rsrc));
-  }
-
-  @Override
-  public Response<String> apply(ChangeResource rsrc, Input input)
-      throws OrmException, IllegalLabelException {
-    if (isIgnored(rsrc)) {
-      stars.unignore(rsrc);
-    }
-    return Response.ok("");
-  }
-
-  private boolean isIgnored(ChangeResource rsrc) {
-    try {
-      return stars.isIgnored(rsrc);
-    } catch (OrmException e) {
-      log.error("failed to check ignored star", e);
-    }
-    return false;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/VoteResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/VoteResource.java
deleted file mode 100644
index 4dfaff0..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/VoteResource.java
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.restapi.RestResource;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.inject.TypeLiteral;
-
-public class VoteResource implements RestResource {
-  public static final TypeLiteral<RestView<VoteResource>> VOTE_KIND =
-      new TypeLiteral<RestView<VoteResource>>() {};
-
-  private final ReviewerResource reviewer;
-  private final String label;
-
-  public VoteResource(ReviewerResource reviewer, String label) {
-    this.reviewer = reviewer;
-    this.label = label;
-  }
-
-  public ReviewerResource getReviewer() {
-    return reviewer;
-  }
-
-  public String getLabel() {
-    return label;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Votes.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Votes.java
deleted file mode 100644
index c2631d5..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Votes.java
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.change;
-
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ChildCollection;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.Map;
-import java.util.TreeMap;
-
-@Singleton
-public class Votes implements ChildCollection<ReviewerResource, VoteResource> {
-  private final DynamicMap<RestView<VoteResource>> views;
-  private final List list;
-
-  @Inject
-  Votes(DynamicMap<RestView<VoteResource>> views, List list) {
-    this.views = views;
-    this.list = list;
-  }
-
-  @Override
-  public DynamicMap<RestView<VoteResource>> views() {
-    return views;
-  }
-
-  @Override
-  public RestView<ReviewerResource> list() throws AuthException {
-    return list;
-  }
-
-  @Override
-  public VoteResource parse(ReviewerResource reviewer, IdString id)
-      throws ResourceNotFoundException, OrmException, AuthException, MethodNotAllowedException {
-    if (reviewer.getRevisionResource() != null && !reviewer.getRevisionResource().isCurrent()) {
-      throw new MethodNotAllowedException("Cannot access on non-current patch set");
-    }
-    return new VoteResource(reviewer, id.get());
-  }
-
-  @Singleton
-  public static class List implements RestReadView<ReviewerResource> {
-    private final Provider<ReviewDb> db;
-    private final ApprovalsUtil approvalsUtil;
-
-    @Inject
-    List(Provider<ReviewDb> db, ApprovalsUtil approvalsUtil) {
-      this.db = db;
-      this.approvalsUtil = approvalsUtil;
-    }
-
-    @Override
-    public Map<String, Short> apply(ReviewerResource rsrc)
-        throws OrmException, MethodNotAllowedException {
-      if (rsrc.getRevisionResource() != null && !rsrc.getRevisionResource().isCurrent()) {
-        throw new MethodNotAllowedException("Cannot list votes on non-current patch set");
-      }
-
-      Map<String, Short> votes = new TreeMap<>();
-      Iterable<PatchSetApproval> byPatchSetUser =
-          approvalsUtil.byPatchSetUser(
-              db.get(),
-              rsrc.getChangeResource().getNotes(),
-              rsrc.getChangeResource().getUser(),
-              rsrc.getChange().currentPatchSetId(),
-              rsrc.getReviewerUser().getAccountId(),
-              null,
-              null);
-      for (PatchSetApproval psa : byPatchSetUser) {
-        votes.put(psa.getLabel(), psa.getValue());
-      }
-      return votes;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/WalkSorter.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/WalkSorter.java
deleted file mode 100644
index 56d7ec0..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/WalkSorter.java
+++ /dev/null
@@ -1,269 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.change;
-
-import static com.google.common.base.Preconditions.checkState;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.MultimapBuilder;
-import com.google.common.collect.Ordering;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.util.ArrayDeque;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Deque;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.eclipse.jgit.errors.IncorrectObjectTypeException;
-import org.eclipse.jgit.errors.MissingObjectException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevFlag;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Helper to sort {@link ChangeData}s based on {@link RevWalk} ordering.
- *
- * <p>Split changes by project, and map each change to a single commit based on the latest patch
- * set. The set of patch sets considered may be limited by calling {@link
- * #includePatchSets(Iterable)}. Perform a standard {@link RevWalk} on each project repository, do
- * an approximate topo sort, and record the order in which each change's commit is seen.
- *
- * <p>Once an order within each project is determined, groups of changes are sorted based on the
- * project name. This is slightly more stable than sorting on something like the commit or change
- * timestamp, as it will not unexpectedly reorder large groups of changes on subsequent calls if one
- * of the changes was updated.
- */
-class WalkSorter {
-  private static final Logger log = LoggerFactory.getLogger(WalkSorter.class);
-
-  private static final Ordering<List<PatchSetData>> PROJECT_LIST_SORTER =
-      Ordering.natural()
-          .nullsFirst()
-          .onResultOf(
-              (List<PatchSetData> in) -> {
-                if (in == null || in.isEmpty()) {
-                  return null;
-                }
-                try {
-                  return in.get(0).data().change().getProject();
-                } catch (OrmException e) {
-                  throw new IllegalStateException(e);
-                }
-              });
-
-  private final GitRepositoryManager repoManager;
-  private final Set<PatchSet.Id> includePatchSets;
-  private boolean retainBody;
-
-  @Inject
-  WalkSorter(GitRepositoryManager repoManager) {
-    this.repoManager = repoManager;
-    includePatchSets = new HashSet<>();
-  }
-
-  public WalkSorter includePatchSets(Iterable<PatchSet.Id> patchSets) {
-    Iterables.addAll(includePatchSets, patchSets);
-    return this;
-  }
-
-  public WalkSorter setRetainBody(boolean retainBody) {
-    this.retainBody = retainBody;
-    return this;
-  }
-
-  public Iterable<PatchSetData> sort(Iterable<ChangeData> in) throws OrmException, IOException {
-    ListMultimap<Project.NameKey, ChangeData> byProject =
-        MultimapBuilder.hashKeys().arrayListValues().build();
-    for (ChangeData cd : in) {
-      byProject.put(cd.change().getProject(), cd);
-    }
-
-    List<List<PatchSetData>> sortedByProject = new ArrayList<>(byProject.keySet().size());
-    for (Map.Entry<Project.NameKey, Collection<ChangeData>> e : byProject.asMap().entrySet()) {
-      sortedByProject.add(sortProject(e.getKey(), e.getValue()));
-    }
-    Collections.sort(sortedByProject, PROJECT_LIST_SORTER);
-    return Iterables.concat(sortedByProject);
-  }
-
-  private List<PatchSetData> sortProject(Project.NameKey project, Collection<ChangeData> in)
-      throws OrmException, IOException {
-    try (Repository repo = repoManager.openRepository(project);
-        RevWalk rw = new RevWalk(repo)) {
-      rw.setRetainBody(retainBody);
-      ListMultimap<RevCommit, PatchSetData> byCommit = byCommit(rw, in);
-      if (byCommit.isEmpty()) {
-        return ImmutableList.of();
-      } else if (byCommit.size() == 1) {
-        return ImmutableList.of(byCommit.values().iterator().next());
-      }
-
-      // Walk from all patch set SHA-1s, and terminate as soon as we've found
-      // everything we're looking for. This is equivalent to just sorting the
-      // list of commits by the RevWalk's configured order.
-      //
-      // Partially topo sort the list, ensuring no parent is emitted before a
-      // direct child that is also in the input set. This preserves the stable,
-      // expected sort in the case where many commits share the same timestamp,
-      // e.g. a quick rebase. It also avoids JGit's topo sort, which slurps all
-      // interesting commits at the beginning, which is a problem since we don't
-      // know which commits to mark as uninteresting. Finding a reasonable set
-      // of commits to mark uninteresting (the "rootmost" set) is at least as
-      // difficult as just implementing this partial topo sort ourselves.
-      //
-      // (This is slightly less efficient than JGit's topo sort, which uses a
-      // private in-degree field in RevCommit rather than multimaps. We assume
-      // the input size is small enough that this is not an issue.)
-
-      Set<RevCommit> commits = byCommit.keySet();
-      ListMultimap<RevCommit, RevCommit> children = collectChildren(commits);
-      ListMultimap<RevCommit, RevCommit> pending =
-          MultimapBuilder.hashKeys().arrayListValues().build();
-      Deque<RevCommit> todo = new ArrayDeque<>();
-
-      RevFlag done = rw.newFlag("done");
-      markStart(rw, commits);
-      int expected = commits.size();
-      int found = 0;
-      RevCommit c;
-      List<PatchSetData> result = new ArrayList<>(expected);
-      while (found < expected && (c = rw.next()) != null) {
-        if (!commits.contains(c)) {
-          continue;
-        }
-        todo.clear();
-        todo.add(c);
-        int i = 0;
-        while (!todo.isEmpty()) {
-          // Sanity check: we can't pop more than N pending commits, otherwise
-          // we have an infinite loop due to programmer error or something.
-          checkState(++i <= commits.size(), "Too many pending steps while sorting %s", commits);
-          RevCommit t = todo.removeFirst();
-          if (t.has(done)) {
-            continue;
-          }
-          boolean ready = true;
-          for (RevCommit child : children.get(t)) {
-            if (!child.has(done)) {
-              pending.put(child, t);
-              ready = false;
-            }
-          }
-          if (ready) {
-            found += emit(t, byCommit, result, done);
-            todo.addAll(pending.get(t));
-          }
-        }
-      }
-      return result;
-    }
-  }
-
-  private static ListMultimap<RevCommit, RevCommit> collectChildren(Set<RevCommit> commits) {
-    ListMultimap<RevCommit, RevCommit> children =
-        MultimapBuilder.hashKeys().arrayListValues().build();
-    for (RevCommit c : commits) {
-      for (RevCommit p : c.getParents()) {
-        if (commits.contains(p)) {
-          children.put(p, c);
-        }
-      }
-    }
-    return children;
-  }
-
-  private static int emit(
-      RevCommit c,
-      ListMultimap<RevCommit, PatchSetData> byCommit,
-      List<PatchSetData> result,
-      RevFlag done) {
-    if (c.has(done)) {
-      return 0;
-    }
-    c.add(done);
-    Collection<PatchSetData> psds = byCommit.get(c);
-    if (!psds.isEmpty()) {
-      result.addAll(psds);
-      return 1;
-    }
-    return 0;
-  }
-
-  private ListMultimap<RevCommit, PatchSetData> byCommit(RevWalk rw, Collection<ChangeData> in)
-      throws OrmException, IOException {
-    ListMultimap<RevCommit, PatchSetData> byCommit =
-        MultimapBuilder.hashKeys(in.size()).arrayListValues(1).build();
-    for (ChangeData cd : in) {
-      PatchSet maxPs = null;
-      for (PatchSet ps : cd.patchSets()) {
-        if (shouldInclude(ps) && (maxPs == null || ps.getId().get() > maxPs.getId().get())) {
-          maxPs = ps;
-        }
-      }
-      if (maxPs == null) {
-        continue; // No patch sets matched.
-      }
-      ObjectId id = ObjectId.fromString(maxPs.getRevision().get());
-      try {
-        RevCommit c = rw.parseCommit(id);
-        byCommit.put(c, PatchSetData.create(cd, maxPs, c));
-      } catch (MissingObjectException | IncorrectObjectTypeException e) {
-        log.warn("missing commit " + id.name() + " for patch set " + maxPs.getId(), e);
-      }
-    }
-    return byCommit;
-  }
-
-  private boolean shouldInclude(PatchSet ps) {
-    return includePatchSets.isEmpty() || includePatchSets.contains(ps.getId());
-  }
-
-  private static void markStart(RevWalk rw, Iterable<RevCommit> commits) throws IOException {
-    for (RevCommit c : commits) {
-      rw.markStart(c);
-    }
-  }
-
-  @AutoValue
-  abstract static class PatchSetData {
-    @VisibleForTesting
-    static PatchSetData create(ChangeData cd, PatchSet ps, RevCommit commit) {
-      return new AutoValue_WalkSorter_PatchSetData(cd, ps, commit);
-    }
-
-    abstract ChangeData data();
-
-    abstract PatchSet patchSet();
-
-    abstract RevCommit commit();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/WorkInProgressOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/WorkInProgressOp.java
deleted file mode 100644
index 28226a7..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/WorkInProgressOp.java
+++ /dev/null
@@ -1,175 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.change;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableListMultimap;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.extensions.events.WorkInProgressStateChanged;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.ChangeUpdate;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.Context;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-
-/* Set work in progress or ready for review state on a change */
-public class WorkInProgressOp implements BatchUpdateOp {
-  public static class Input {
-    @Nullable String message;
-
-    @Nullable NotifyHandling notify;
-
-    public Input() {}
-
-    public Input(String message) {
-      this.message = message;
-    }
-  }
-
-  public interface Factory {
-    WorkInProgressOp create(boolean workInProgress, Input in);
-  }
-
-  public static void checkPermissions(
-      PermissionBackend permissionBackend,
-      CurrentUser user,
-      Change change,
-      ProjectControl projectControl)
-      throws PermissionBackendException, AuthException {
-    if (!user.isIdentifiedUser()) {
-      throw new AuthException("Authentication required");
-    }
-    if (change.getOwner().equals(user.asIdentifiedUser().getAccountId())) {
-      return;
-    }
-
-    try {
-      permissionBackend.user(user).check(GlobalPermission.ADMINISTRATE_SERVER);
-      return;
-    } catch (AuthException e) {
-      // Skip.
-    }
-    if (!projectControl.isOwner()) {
-      throw new AuthException("not allowed to toggle work in progress");
-    }
-  }
-
-  private final ChangeMessagesUtil cmUtil;
-  private final EmailReviewComments.Factory email;
-  private final PatchSetUtil psUtil;
-  private final boolean workInProgress;
-  private final Input in;
-  private final NotifyHandling notify;
-  private final WorkInProgressStateChanged stateChanged;
-
-  private Change change;
-  private ChangeNotes notes;
-  private PatchSet ps;
-  private ChangeMessage cmsg;
-
-  @Inject
-  WorkInProgressOp(
-      ChangeMessagesUtil cmUtil,
-      EmailReviewComments.Factory email,
-      PatchSetUtil psUtil,
-      WorkInProgressStateChanged stateChanged,
-      @Assisted boolean workInProgress,
-      @Assisted Input in) {
-    this.cmUtil = cmUtil;
-    this.email = email;
-    this.psUtil = psUtil;
-    this.stateChanged = stateChanged;
-    this.workInProgress = workInProgress;
-    this.in = in;
-    notify =
-        MoreObjects.firstNonNull(
-            in.notify, workInProgress ? NotifyHandling.NONE : NotifyHandling.ALL);
-  }
-
-  @Override
-  public boolean updateChange(ChangeContext ctx) throws OrmException {
-    change = ctx.getChange();
-    notes = ctx.getNotes();
-    ps = psUtil.get(ctx.getDb(), ctx.getNotes(), change.currentPatchSetId());
-    ChangeUpdate update = ctx.getUpdate(change.currentPatchSetId());
-    change.setWorkInProgress(workInProgress);
-    if (!change.hasReviewStarted() && !workInProgress) {
-      change.setReviewStarted(true);
-    }
-    change.setLastUpdatedOn(ctx.getWhen());
-    update.setWorkInProgress(workInProgress);
-    addMessage(ctx, update);
-    return true;
-  }
-
-  private void addMessage(ChangeContext ctx, ChangeUpdate update) throws OrmException {
-    Change c = ctx.getChange();
-    StringBuilder buf =
-        new StringBuilder(c.isWorkInProgress() ? "Set Work In Progress" : "Set Ready For Review");
-
-    String m = Strings.nullToEmpty(in == null ? null : in.message).trim();
-    if (!m.isEmpty()) {
-      buf.append("\n\n");
-      buf.append(m);
-    }
-
-    cmsg =
-        ChangeMessagesUtil.newMessage(
-            ctx,
-            buf.toString(),
-            c.isWorkInProgress()
-                ? ChangeMessagesUtil.TAG_SET_WIP
-                : ChangeMessagesUtil.TAG_SET_READY);
-
-    cmUtil.addChangeMessage(ctx.getDb(), update, cmsg);
-  }
-
-  @Override
-  public void postUpdate(Context ctx) {
-    stateChanged.fire(change, ps, ctx.getAccount(), ctx.getWhen());
-    if (workInProgress || notify.ordinal() < NotifyHandling.OWNER_REVIEWERS.ordinal()) {
-      return;
-    }
-    email
-        .create(
-            notify,
-            ImmutableListMultimap.of(),
-            notes,
-            ps,
-            ctx.getIdentifiedUser(),
-            cmsg,
-            ImmutableList.of(),
-            cmsg.getMessage(),
-            ImmutableList.of())
-        .sendAsync();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/AdministrateServerGroupsProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/AdministrateServerGroupsProvider.java
deleted file mode 100644
index 29f288a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/AdministrateServerGroupsProvider.java
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.server.config;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.common.data.PermissionRule;
-import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.GroupBackends;
-import com.google.gerrit.server.util.RequestContext;
-import com.google.gerrit.server.util.ServerRequestContext;
-import com.google.gerrit.server.util.ThreadLocalRequestContext;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Loads {@link AdministrateServerGroups} from {@code gerrit.config}. */
-public class AdministrateServerGroupsProvider implements Provider<ImmutableSet<GroupReference>> {
-  private final ImmutableSet<GroupReference> groups;
-
-  @Inject
-  public AdministrateServerGroupsProvider(
-      GroupBackend groupBackend,
-      @GerritServerConfig Config config,
-      ThreadLocalRequestContext threadContext,
-      ServerRequestContext serverCtx) {
-    RequestContext ctx = threadContext.setContext(serverCtx);
-    try {
-      ImmutableSet.Builder<GroupReference> builder = ImmutableSet.builder();
-      for (String value : config.getStringList("capability", null, "administrateServer")) {
-        PermissionRule rule = PermissionRule.fromString(value, false);
-        String name = rule.getGroup().getName();
-        GroupReference g = GroupBackends.findBestSuggestion(groupBackend, name);
-        if (g != null) {
-          builder.add(g);
-        } else {
-          Logger log = LoggerFactory.getLogger(getClass());
-          log.warn("Group \"{}\" not available, skipping.", name);
-        }
-      }
-      groups = builder.build();
-    } finally {
-      threadContext.setContext(ctx);
-    }
-  }
-
-  @Override
-  public ImmutableSet<GroupReference> get() {
-    return groups;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/AgreementJson.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/AgreementJson.java
deleted file mode 100644
index 83eca9c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/AgreementJson.java
+++ /dev/null
@@ -1,75 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.config;
-
-import com.google.gerrit.common.data.ContributorAgreement;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.extensions.common.AgreementInfo;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.GroupControl;
-import com.google.gerrit.server.group.GroupJson;
-import com.google.gerrit.server.group.GroupResource;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class AgreementJson {
-  private static final Logger log = LoggerFactory.getLogger(AgreementJson.class);
-
-  private final Provider<CurrentUser> self;
-  private final IdentifiedUser.GenericFactory identifiedUserFactory;
-  private final GroupControl.GenericFactory genericGroupControlFactory;
-  private final GroupJson groupJson;
-
-  @Inject
-  AgreementJson(
-      Provider<CurrentUser> self,
-      IdentifiedUser.GenericFactory identifiedUserFactory,
-      GroupControl.GenericFactory genericGroupControlFactory,
-      GroupJson groupJson) {
-    this.self = self;
-    this.identifiedUserFactory = identifiedUserFactory;
-    this.genericGroupControlFactory = genericGroupControlFactory;
-    this.groupJson = groupJson;
-  }
-
-  public AgreementInfo format(ContributorAgreement ca) {
-    AgreementInfo info = new AgreementInfo();
-    info.name = ca.getName();
-    info.description = ca.getDescription();
-    info.url = ca.getAgreementUrl();
-    GroupReference autoVerifyGroup = ca.getAutoVerify();
-    if (autoVerifyGroup != null && self.get().isIdentifiedUser()) {
-      IdentifiedUser user = identifiedUserFactory.create(self.get().getAccountId());
-      try {
-        GroupControl gc = genericGroupControlFactory.controlFor(user, autoVerifyGroup.getUUID());
-        GroupResource group = new GroupResource(gc);
-        info.autoVerifyGroup = groupJson.format(group);
-      } catch (NoSuchGroupException | OrmException e) {
-        log.warn(
-            "autoverify group \""
-                + autoVerifyGroup.getName()
-                + "\" does not exist, referenced in CLA \""
-                + ca.getName()
-                + "\"");
-      }
-    }
-    return info;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/AnonymousCowardNameProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/AnonymousCowardNameProvider.java
deleted file mode 100644
index 79676f6..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/AnonymousCowardNameProvider.java
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.server.config;
-
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import org.eclipse.jgit.lib.Config;
-
-public class AnonymousCowardNameProvider implements Provider<String> {
-  public static final String DEFAULT = "Anonymous Coward";
-
-  private final String anonymousCoward;
-
-  @Inject
-  public AnonymousCowardNameProvider(@GerritServerConfig Config cfg) {
-    String anonymousCoward = cfg.getString("user", null, "anonymousCoward");
-    if (anonymousCoward == null) {
-      anonymousCoward = DEFAULT;
-    }
-    this.anonymousCoward = anonymousCoward;
-  }
-
-  @Override
-  public String get() {
-    return anonymousCoward;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/CacheResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/CacheResource.java
deleted file mode 100644
index 16c7508..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/CacheResource.java
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.config;
-
-import com.google.common.cache.Cache;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.inject.Provider;
-import com.google.inject.TypeLiteral;
-
-public class CacheResource extends ConfigResource {
-  public static final TypeLiteral<RestView<CacheResource>> CACHE_KIND =
-      new TypeLiteral<RestView<CacheResource>>() {};
-
-  private final String name;
-  private final Provider<Cache<?, ?>> cacheProvider;
-
-  public CacheResource(String pluginName, String cacheName, Provider<Cache<?, ?>> cacheProvider) {
-    this.name = cacheNameOf(pluginName, cacheName);
-    this.cacheProvider = cacheProvider;
-  }
-
-  public CacheResource(String pluginName, String cacheName, Cache<?, ?> cache) {
-    this(
-        pluginName,
-        cacheName,
-        new Provider<Cache<?, ?>>() {
-          @Override
-          public Cache<?, ?> get() {
-            return cache;
-          }
-        });
-  }
-
-  public String getName() {
-    return name;
-  }
-
-  public Cache<?, ?> getCache() {
-    return cacheProvider.get();
-  }
-
-  public static String cacheNameOf(String plugin, String name) {
-    if ("gerrit".equals(plugin)) {
-      return name;
-    }
-    return plugin + "-" + name;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/CachesCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/CachesCollection.java
deleted file mode 100644
index 7ecfa63..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/CachesCollection.java
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.config;
-
-import static com.google.gerrit.common.data.GlobalCapability.MAINTAIN_SERVER;
-import static com.google.gerrit.common.data.GlobalCapability.VIEW_CACHES;
-
-import com.google.common.cache.Cache;
-import com.google.gerrit.extensions.annotations.RequiresAnyCapability;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AcceptsPost;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ChildCollection;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-
-@RequiresAnyCapability({VIEW_CACHES, MAINTAIN_SERVER})
-@Singleton
-public class CachesCollection
-    implements ChildCollection<ConfigResource, CacheResource>, AcceptsPost<ConfigResource> {
-
-  private final DynamicMap<RestView<CacheResource>> views;
-  private final Provider<ListCaches> list;
-  private final PermissionBackend permissionBackend;
-  private final Provider<CurrentUser> self;
-  private final DynamicMap<Cache<?, ?>> cacheMap;
-  private final PostCaches postCaches;
-
-  @Inject
-  CachesCollection(
-      DynamicMap<RestView<CacheResource>> views,
-      Provider<ListCaches> list,
-      PermissionBackend permissionBackend,
-      Provider<CurrentUser> self,
-      DynamicMap<Cache<?, ?>> cacheMap,
-      PostCaches postCaches) {
-    this.views = views;
-    this.list = list;
-    this.permissionBackend = permissionBackend;
-    this.self = self;
-    this.cacheMap = cacheMap;
-    this.postCaches = postCaches;
-  }
-
-  @Override
-  public RestView<ConfigResource> list() {
-    return list.get();
-  }
-
-  @Override
-  public CacheResource parse(ConfigResource parent, IdString id)
-      throws AuthException, ResourceNotFoundException, PermissionBackendException {
-    permissionBackend.user(self).check(GlobalPermission.VIEW_CACHES);
-
-    String cacheName = id.get();
-    String pluginName = "gerrit";
-    int i = cacheName.lastIndexOf('-');
-    if (i != -1) {
-      pluginName = cacheName.substring(0, i);
-      cacheName = cacheName.length() > i + 1 ? cacheName.substring(i + 1) : "";
-    }
-
-    Provider<Cache<?, ?>> cacheProvider = cacheMap.byPlugin(pluginName).get(cacheName);
-    if (cacheProvider == null) {
-      throw new ResourceNotFoundException(id);
-    }
-    return new CacheResource(pluginName, cacheName, cacheProvider);
-  }
-
-  @Override
-  public DynamicMap<RestView<CacheResource>> views() {
-    return views;
-  }
-
-  @Override
-  public PostCaches post(ConfigResource parent) throws RestApiException {
-    return postCaches;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/CapabilitiesCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/CapabilitiesCollection.java
deleted file mode 100644
index 1124048..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/CapabilitiesCollection.java
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.config;
-
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.ChildCollection;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-@Singleton
-public class CapabilitiesCollection implements ChildCollection<ConfigResource, CapabilityResource> {
-  private final DynamicMap<RestView<CapabilityResource>> views;
-  private final ListCapabilities list;
-
-  @Inject
-  CapabilitiesCollection(DynamicMap<RestView<CapabilityResource>> views, ListCapabilities list) {
-    this.views = views;
-    this.list = list;
-  }
-
-  @Override
-  public RestView<ConfigResource> list() throws ResourceNotFoundException {
-    return list;
-  }
-
-  @Override
-  public CapabilityResource parse(ConfigResource parent, IdString id)
-      throws ResourceNotFoundException {
-    throw new ResourceNotFoundException(id);
-  }
-
-  @Override
-  public DynamicMap<RestView<CapabilityResource>> views() {
-    return views;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/CapabilityConstants.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/CapabilityConstants.java
deleted file mode 100644
index 5025892..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/CapabilityConstants.java
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.config;
-
-import org.eclipse.jgit.nls.NLS;
-import org.eclipse.jgit.nls.TranslationBundle;
-
-public class CapabilityConstants extends TranslationBundle {
-  public static CapabilityConstants get() {
-    return NLS.getBundleFor(CapabilityConstants.class);
-  }
-
-  public String accessDatabase;
-  public String administrateServer;
-  public String batchChangesLimit;
-  public String createAccount;
-  public String createGroup;
-  public String createProject;
-  public String emailReviewers;
-  public String flushCaches;
-  public String killTask;
-  public String maintainServer;
-  public String modifyAccount;
-  public String priority;
-  public String queryLimit;
-  public String runAs;
-  public String runGC;
-  public String streamEvents;
-  public String viewAllAccounts;
-  public String viewCaches;
-  public String viewConnections;
-  public String viewPlugins;
-  public String viewQueue;
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/ChangeCleanupConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/ChangeCleanupConfig.java
deleted file mode 100644
index b2b5fab..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/ChangeCleanupConfig.java
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.config;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.common.Nullable;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.concurrent.TimeUnit;
-import org.eclipse.jgit.lib.Config;
-
-@Singleton
-public class ChangeCleanupConfig {
-  private static String SECTION = "changeCleanup";
-  private static String KEY_ABANDON_AFTER = "abandonAfter";
-  private static String KEY_ABANDON_IF_MERGEABLE = "abandonIfMergeable";
-  private static String KEY_ABANDON_MESSAGE = "abandonMessage";
-  private static String DEFAULT_ABANDON_MESSAGE =
-      "Auto-Abandoned due to inactivity, see "
-          + "${URL}Documentation/user-change-cleanup.html#auto-abandon\n"
-          + "\n"
-          + "If this change is still wanted it should be restored.";
-
-  private final ScheduleConfig scheduleConfig;
-  private final long abandonAfter;
-  private final boolean abandonIfMergeable;
-  private final String abandonMessage;
-
-  @Inject
-  ChangeCleanupConfig(
-      @GerritServerConfig Config cfg, @CanonicalWebUrl @Nullable String canonicalWebUrl) {
-    scheduleConfig = new ScheduleConfig(cfg, SECTION);
-    abandonAfter = readAbandonAfter(cfg);
-    abandonIfMergeable = cfg.getBoolean(SECTION, null, KEY_ABANDON_IF_MERGEABLE, true);
-    abandonMessage = readAbandonMessage(cfg, canonicalWebUrl);
-  }
-
-  private long readAbandonAfter(Config cfg) {
-    long abandonAfter =
-        ConfigUtil.getTimeUnit(cfg, SECTION, null, KEY_ABANDON_AFTER, 0, TimeUnit.MILLISECONDS);
-    return abandonAfter >= 0 ? abandonAfter : 0;
-  }
-
-  private String readAbandonMessage(Config cfg, String webUrl) {
-    String abandonMessage = cfg.getString(SECTION, null, KEY_ABANDON_MESSAGE);
-    if (Strings.isNullOrEmpty(abandonMessage)) {
-      abandonMessage = DEFAULT_ABANDON_MESSAGE;
-    }
-    if (!Strings.isNullOrEmpty(webUrl)) {
-      abandonMessage = abandonMessage.replaceAll("\\$\\{URL\\}", webUrl);
-    }
-    return abandonMessage;
-  }
-
-  public ScheduleConfig getScheduleConfig() {
-    return scheduleConfig;
-  }
-
-  public long getAbandonAfter() {
-    return abandonAfter;
-  }
-
-  public boolean getAbandonIfMergeable() {
-    return abandonIfMergeable;
-  }
-
-  public String getAbandonMessage() {
-    return abandonMessage;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/CheckConsistency.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/CheckConsistency.java
deleted file mode 100644
index eaf45be..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/CheckConsistency.java
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.config;
-
-import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo;
-import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo.CheckAccountExternalIdsResultInfo;
-import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo.CheckAccountsResultInfo;
-import com.google.gerrit.extensions.api.config.ConsistencyCheckInput;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.account.AccountsConsistencyChecker;
-import com.google.gerrit.server.account.externalids.ExternalIdsConsistencyChecker;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-
-@Singleton
-public class CheckConsistency implements RestModifyView<ConfigResource, ConsistencyCheckInput> {
-  private final PermissionBackend permissionBackend;
-  private final Provider<CurrentUser> user;
-  private final AccountsConsistencyChecker accountsConsistencyChecker;
-  private final ExternalIdsConsistencyChecker externalIdsConsistencyChecker;
-
-  @Inject
-  CheckConsistency(
-      PermissionBackend permissionBackend,
-      Provider<CurrentUser> user,
-      AccountsConsistencyChecker accountsConsistencyChecker,
-      ExternalIdsConsistencyChecker externalIdsConsistencyChecker) {
-    this.permissionBackend = permissionBackend;
-    this.user = user;
-    this.accountsConsistencyChecker = accountsConsistencyChecker;
-    this.externalIdsConsistencyChecker = externalIdsConsistencyChecker;
-  }
-
-  @Override
-  public ConsistencyCheckInfo apply(ConfigResource resource, ConsistencyCheckInput input)
-      throws RestApiException, IOException, OrmException, PermissionBackendException {
-    permissionBackend.user(user).check(GlobalPermission.ACCESS_DATABASE);
-
-    if (input == null || (input.checkAccounts == null && input.checkAccountExternalIds == null)) {
-      throw new BadRequestException("input required");
-    }
-
-    ConsistencyCheckInfo consistencyCheckInfo = new ConsistencyCheckInfo();
-    if (input.checkAccounts != null) {
-      consistencyCheckInfo.checkAccountsResult =
-          new CheckAccountsResultInfo(accountsConsistencyChecker.check());
-    }
-    if (input.checkAccountExternalIds != null) {
-      consistencyCheckInfo.checkAccountExternalIdsResult =
-          new CheckAccountExternalIdsResultInfo(externalIdsConsistencyChecker.check());
-    }
-
-    return consistencyCheckInfo;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/ConfigCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/ConfigCollection.java
deleted file mode 100644
index f268110..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/ConfigCollection.java
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.config;
-
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestCollection;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-@Singleton
-public class ConfigCollection implements RestCollection<TopLevelResource, ConfigResource> {
-  private final DynamicMap<RestView<ConfigResource>> views;
-
-  @Inject
-  ConfigCollection(DynamicMap<RestView<ConfigResource>> views) {
-    this.views = views;
-  }
-
-  @Override
-  public RestView<TopLevelResource> list() throws ResourceNotFoundException {
-    throw new ResourceNotFoundException();
-  }
-
-  @Override
-  public DynamicMap<RestView<ConfigResource>> views() {
-    return views;
-  }
-
-  @Override
-  public ConfigResource parse(TopLevelResource root, IdString id) throws ResourceNotFoundException {
-    if (id.get().equals("server")) {
-      return new ConfigResource();
-    }
-    throw new ResourceNotFoundException(id);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/ConfigUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/ConfigUtil.java
deleted file mode 100644
index c6527fd..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/ConfigUtil.java
+++ /dev/null
@@ -1,442 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.config;
-
-import com.google.common.base.Preconditions;
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.Config;
-
-public class ConfigUtil {
-
-  @SuppressWarnings("unchecked")
-  private static <T> T[] allValuesOf(T defaultValue) {
-    try {
-      return (T[]) defaultValue.getClass().getMethod("values").invoke(null);
-    } catch (IllegalArgumentException
-        | NoSuchMethodException
-        | InvocationTargetException
-        | IllegalAccessException
-        | SecurityException e) {
-      throw new IllegalArgumentException("Cannot obtain enumeration values", e);
-    }
-  }
-
-  /**
-   * Parse a Java enumeration from the configuration.
-   *
-   * @param <T> type of the enumeration object.
-   * @param section section the key is in.
-   * @param subsection subsection the key is in, or null if not in a subsection.
-   * @param setting name of the setting to read.
-   * @param valueString string value from git Config
-   * @param all all possible values in the enumeration which should be recognized. This should be
-   *     {@code EnumType.values()}.
-   * @return the selected enumeration value, or {@code defaultValue}.
-   */
-  private static <T extends Enum<?>> T getEnum(
-      final String section,
-      final String subsection,
-      final String setting,
-      String valueString,
-      final T[] all) {
-
-    String n = valueString.replace(' ', '_').replace('-', '_');
-    for (T e : all) {
-      if (e.name().equalsIgnoreCase(n)) {
-        return e;
-      }
-    }
-
-    final StringBuilder r = new StringBuilder();
-    r.append("Value \"");
-    r.append(valueString);
-    r.append("\" not recognized in ");
-    r.append(section);
-    if (subsection != null) {
-      r.append(".");
-      r.append(subsection);
-    }
-    r.append(".");
-    r.append(setting);
-    r.append("; supported values are: ");
-    for (T e : all) {
-      r.append(e.name());
-      r.append(" ");
-    }
-
-    throw new IllegalArgumentException(r.toString().trim());
-  }
-
-  /**
-   * Parse a Java enumeration list from the configuration.
-   *
-   * @param <T> type of the enumeration object.
-   * @param config the configuration file to read.
-   * @param section section the key is in.
-   * @param subsection subsection the key is in, or null if not in a subsection.
-   * @param setting name of the setting to read.
-   * @param defaultValue default value to return if the setting was not set. Must not be null as the
-   *     enumeration values are derived from this.
-   * @return the selected enumeration values list, or {@code defaultValue}.
-   */
-  public static <T extends Enum<?>> List<T> getEnumList(
-      final Config config,
-      final String section,
-      final String subsection,
-      final String setting,
-      final T defaultValue) {
-    final T[] all = allValuesOf(defaultValue);
-    return getEnumList(config, section, subsection, setting, all, defaultValue);
-  }
-
-  /**
-   * Parse a Java enumeration list from the configuration.
-   *
-   * @param <T> type of the enumeration object.
-   * @param config the configuration file to read.
-   * @param section section the key is in.
-   * @param subsection subsection the key is in, or null if not in a subsection.
-   * @param setting name of the setting to read.
-   * @param all all possible values in the enumeration which should be recognized. This should be
-   *     {@code EnumType.values()}.
-   * @param defaultValue default value to return if the setting was not set. This value may be null.
-   * @return the selected enumeration values list, or {@code defaultValue}.
-   */
-  public static <T extends Enum<?>> List<T> getEnumList(
-      final Config config,
-      final String section,
-      final String subsection,
-      final String setting,
-      final T[] all,
-      final T defaultValue) {
-    final List<T> list = new ArrayList<>();
-    final String[] values = config.getStringList(section, subsection, setting);
-    if (values.length == 0) {
-      list.add(defaultValue);
-    } else {
-      for (String string : values) {
-        if (string != null) {
-          list.add(getEnum(section, subsection, setting, string, all));
-        }
-      }
-    }
-    return list;
-  }
-
-  /**
-   * Parse a numerical time unit, such as "1 minute", from the configuration.
-   *
-   * @param config the configuration file to read.
-   * @param section section the key is in.
-   * @param subsection subsection the key is in, or null if not in a subsection.
-   * @param setting name of the setting to read.
-   * @param defaultValue default value to return if no value was set in the configuration file.
-   * @param wantUnit the units of {@code defaultValue} and the return value, as well as the units to
-   *     assume if the value does not contain an indication of the units.
-   * @return the setting, or {@code defaultValue} if not set, expressed in {@code units}.
-   */
-  public static long getTimeUnit(
-      final Config config,
-      final String section,
-      final String subsection,
-      final String setting,
-      final long defaultValue,
-      final TimeUnit wantUnit) {
-    final String valueString = config.getString(section, subsection, setting);
-    if (valueString == null) {
-      return defaultValue;
-    }
-
-    String s = valueString.trim();
-    if (s.length() == 0) {
-      return defaultValue;
-    }
-
-    if (s.startsWith("-") /* negative */) {
-      throw notTimeUnit(section, subsection, setting, valueString);
-    }
-
-    try {
-      return getTimeUnit(s, defaultValue, wantUnit);
-    } catch (IllegalArgumentException notTime) {
-      throw notTimeUnit(section, subsection, setting, valueString);
-    }
-  }
-
-  /**
-   * Parse a numerical time unit, such as "1 minute", from a string.
-   *
-   * @param valueString the string to parse.
-   * @param defaultValue default value to return if no value was set in the configuration file.
-   * @param wantUnit the units of {@code defaultValue} and the return value, as well as the units to
-   *     assume if the value does not contain an indication of the units.
-   * @return the setting, or {@code defaultValue} if not set, expressed in {@code units}.
-   */
-  public static long getTimeUnit(String valueString, long defaultValue, TimeUnit wantUnit) {
-    Matcher m = Pattern.compile("^(0|[1-9][0-9]*)\\s*(.*)$").matcher(valueString);
-    if (!m.matches()) {
-      return defaultValue;
-    }
-
-    String digits = m.group(1);
-    String unitName = m.group(2).trim();
-
-    TimeUnit inputUnit;
-    int inputMul;
-
-    if ("".equals(unitName)) {
-      inputUnit = wantUnit;
-      inputMul = 1;
-
-    } else if (match(unitName, "ms", "milliseconds")) {
-      inputUnit = TimeUnit.MILLISECONDS;
-      inputMul = 1;
-
-    } else if (match(unitName, "s", "sec", "second", "seconds")) {
-      inputUnit = TimeUnit.SECONDS;
-      inputMul = 1;
-
-    } else if (match(unitName, "m", "min", "minute", "minutes")) {
-      inputUnit = TimeUnit.MINUTES;
-      inputMul = 1;
-
-    } else if (match(unitName, "h", "hr", "hour", "hours")) {
-      inputUnit = TimeUnit.HOURS;
-      inputMul = 1;
-
-    } else if (match(unitName, "d", "day", "days")) {
-      inputUnit = TimeUnit.DAYS;
-      inputMul = 1;
-
-    } else if (match(unitName, "w", "week", "weeks")) {
-      inputUnit = TimeUnit.DAYS;
-      inputMul = 7;
-
-    } else if (match(unitName, "mon", "month", "months")) {
-      inputUnit = TimeUnit.DAYS;
-      inputMul = 30;
-
-    } else if (match(unitName, "y", "year", "years")) {
-      inputUnit = TimeUnit.DAYS;
-      inputMul = 365;
-
-    } else {
-      throw notTimeUnit(valueString);
-    }
-
-    try {
-      return wantUnit.convert(Long.parseLong(digits) * inputMul, inputUnit);
-    } catch (NumberFormatException nfe) {
-      throw notTimeUnit(valueString);
-    }
-  }
-
-  public static String getRequired(Config cfg, String section, String name) {
-    final String v = cfg.getString(section, null, name);
-    if (v == null || "".equals(v)) {
-      throw new IllegalArgumentException("No " + section + "." + name + " configured");
-    }
-    return v;
-  }
-
-  /**
-   * Store section by inspecting Java class attributes.
-   *
-   * <p>Optimize the storage by unsetting a variable if it is being set to default value by the
-   * server.
-   *
-   * <p>Fields marked with final or transient modifiers are skipped.
-   *
-   * @param cfg config in which the values should be stored
-   * @param section section
-   * @param sub subsection
-   * @param s instance of class with config values
-   * @param defaults instance of class with default values
-   * @throws ConfigInvalidException
-   */
-  public static <T> void storeSection(Config cfg, String section, String sub, T s, T defaults)
-      throws ConfigInvalidException {
-    try {
-      for (Field f : s.getClass().getDeclaredFields()) {
-        if (skipField(f)) {
-          continue;
-        }
-        Class<?> t = f.getType();
-        String n = f.getName();
-        f.setAccessible(true);
-        Object c = f.get(s);
-        Object d = f.get(defaults);
-        if (!isString(t) && !isCollectionOrMap(t)) {
-          Preconditions.checkNotNull(d, "Default cannot be null for: " + n);
-        }
-        if (c == null || c.equals(d)) {
-          cfg.unset(section, sub, n);
-        } else {
-          if (isString(t)) {
-            cfg.setString(section, sub, n, (String) c);
-          } else if (isInteger(t)) {
-            cfg.setInt(section, sub, n, (Integer) c);
-          } else if (isLong(t)) {
-            cfg.setLong(section, sub, n, (Long) c);
-          } else if (isBoolean(t)) {
-            cfg.setBoolean(section, sub, n, (Boolean) c);
-          } else if (t.isEnum()) {
-            cfg.setEnum(section, sub, n, (Enum<?>) c);
-          } else if (isCollectionOrMap(t)) {
-            // TODO(davido): accept closure passed in from caller
-            continue;
-          } else {
-            throw new ConfigInvalidException("type is unknown: " + t.getName());
-          }
-        }
-      }
-    } catch (SecurityException | IllegalArgumentException | IllegalAccessException e) {
-      throw new ConfigInvalidException("cannot save values", e);
-    }
-  }
-
-  /**
-   * Load section by inspecting Java class attributes.
-   *
-   * <p>Config values are stored optimized: no default values are stored. The loading is performed
-   * eagerly: all values are set.
-   *
-   * <p>Fields marked with final or transient modifiers are skipped.
-   *
-   * @param cfg config from which the values are loaded
-   * @param section section
-   * @param sub subsection
-   * @param s instance of class in which the values are set
-   * @param defaults instance of class with default values
-   * @param i instance to merge during the load. When present, the boolean fields are not nullified
-   *     when their values are false
-   * @return loaded instance
-   * @throws ConfigInvalidException
-   */
-  public static <T> T loadSection(Config cfg, String section, String sub, T s, T defaults, T i)
-      throws ConfigInvalidException {
-    try {
-      for (Field f : s.getClass().getDeclaredFields()) {
-        if (skipField(f)) {
-          continue;
-        }
-        Class<?> t = f.getType();
-        String n = f.getName();
-        f.setAccessible(true);
-        Object d = f.get(defaults);
-        if (!isString(t) && !isCollectionOrMap(t)) {
-          Preconditions.checkNotNull(d, "Default cannot be null for: " + n);
-        }
-        if (isString(t)) {
-          String v = cfg.getString(section, sub, n);
-          if (v == null) {
-            v = (String) d;
-          }
-          f.set(s, v);
-        } else if (isInteger(t)) {
-          f.set(s, cfg.getInt(section, sub, n, (Integer) d));
-        } else if (isLong(t)) {
-          f.set(s, cfg.getLong(section, sub, n, (Long) d));
-        } else if (isBoolean(t)) {
-          boolean b = cfg.getBoolean(section, sub, n, (Boolean) d);
-          if (b || i != null) {
-            f.set(s, b);
-          }
-        } else if (t.isEnum()) {
-          f.set(s, cfg.getEnum(section, sub, n, (Enum<?>) d));
-        } else if (isCollectionOrMap(t)) {
-          // TODO(davido): accept closure passed in from caller
-          continue;
-        } else {
-          throw new ConfigInvalidException("type is unknown: " + t.getName());
-        }
-        if (i != null) {
-          Object o = f.get(i);
-          if (o != null) {
-            f.set(s, o);
-          }
-        }
-      }
-    } catch (SecurityException | IllegalArgumentException | IllegalAccessException e) {
-      throw new ConfigInvalidException("cannot load values", e);
-    }
-    return s;
-  }
-
-  public static boolean skipField(Field field) {
-    int modifiers = field.getModifiers();
-    return Modifier.isFinal(modifiers) || Modifier.isTransient(modifiers);
-  }
-
-  private static boolean isCollectionOrMap(Class<?> t) {
-    return Collection.class.isAssignableFrom(t) || Map.class.isAssignableFrom(t);
-  }
-
-  private static boolean isString(Class<?> t) {
-    return String.class == t;
-  }
-
-  private static boolean isBoolean(Class<?> t) {
-    return Boolean.class == t || boolean.class == t;
-  }
-
-  private static boolean isLong(Class<?> t) {
-    return Long.class == t || long.class == t;
-  }
-
-  private static boolean isInteger(Class<?> t) {
-    return Integer.class == t || int.class == t;
-  }
-
-  private static boolean match(String a, String... cases) {
-    for (String b : cases) {
-      if (b != null && b.equalsIgnoreCase(a)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  private static IllegalArgumentException notTimeUnit(
-      final String section,
-      final String subsection,
-      final String setting,
-      final String valueString) {
-    return new IllegalArgumentException(
-        "Invalid time unit value: "
-            + section
-            + (subsection != null ? "." + subsection : "")
-            + "."
-            + setting
-            + " = "
-            + valueString);
-  }
-
-  private static IllegalArgumentException notTimeUnit(String val) {
-    return new IllegalArgumentException("Invalid time unit value: " + val);
-  }
-
-  private ConfigUtil() {}
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/ConfirmEmail.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/ConfirmEmail.java
deleted file mode 100644
index 1044bbb..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/ConfirmEmail.java
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.config;
-
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.DefaultInput;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.account.AccountException;
-import com.google.gerrit.server.account.AccountManager;
-import com.google.gerrit.server.config.ConfirmEmail.Input;
-import com.google.gerrit.server.mail.EmailTokenVerifier;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-@Singleton
-public class ConfirmEmail implements RestModifyView<ConfigResource, Input> {
-  public static class Input {
-    @DefaultInput public String token;
-  }
-
-  private final Provider<CurrentUser> self;
-  private final EmailTokenVerifier emailTokenVerifier;
-  private final AccountManager accountManager;
-
-  @Inject
-  public ConfirmEmail(
-      Provider<CurrentUser> self,
-      EmailTokenVerifier emailTokenVerifier,
-      AccountManager accountManager) {
-    this.self = self;
-    this.emailTokenVerifier = emailTokenVerifier;
-    this.accountManager = accountManager;
-  }
-
-  @Override
-  public Response<?> apply(ConfigResource rsrc, Input input)
-      throws AuthException, UnprocessableEntityException, AccountException, OrmException,
-          IOException, ConfigInvalidException {
-    CurrentUser user = self.get();
-    if (!user.isIdentifiedUser()) {
-      throw new AuthException("Authentication required");
-    }
-
-    if (input == null) {
-      input = new Input();
-    }
-    if (input.token == null) {
-      throw new UnprocessableEntityException("missing token");
-    }
-
-    try {
-      EmailTokenVerifier.ParsedToken token = emailTokenVerifier.decode(input.token);
-      Account.Id accId = user.getAccountId();
-      if (accId.equals(token.getAccountId())) {
-        accountManager.link(accId, token.toAuthRequest());
-        return Response.none();
-      }
-      throw new UnprocessableEntityException("invalid token");
-    } catch (EmailTokenVerifier.InvalidTokenException e) {
-      throw new UnprocessableEntityException("invalid token");
-    } catch (AccountException e) {
-      throw new UnprocessableEntityException(e.getMessage());
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/DeleteTask.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/DeleteTask.java
deleted file mode 100644
index 29ca20f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/DeleteTask.java
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.config;
-
-import static com.google.gerrit.common.data.GlobalCapability.KILL_TASK;
-import static com.google.gerrit.common.data.GlobalCapability.MAINTAIN_SERVER;
-import static javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
-
-import com.google.gerrit.extensions.annotations.RequiresAnyCapability;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.server.config.DeleteTask.Input;
-import com.google.gerrit.server.git.WorkQueue.Task;
-import com.google.inject.Singleton;
-
-@Singleton
-@RequiresAnyCapability({KILL_TASK, MAINTAIN_SERVER})
-public class DeleteTask implements RestModifyView<TaskResource, Input> {
-  public static class Input {}
-
-  @Override
-  public Response<?> apply(TaskResource rsrc, Input input) {
-    Task<?> task = rsrc.getTask();
-    boolean taskDeleted = task.cancel(true);
-    return taskDeleted
-        ? Response.none()
-        : Response.withStatusCode(SC_INTERNAL_SERVER_ERROR, "Unable to kill task " + task);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/FlushCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/FlushCache.java
deleted file mode 100644
index 366dae1..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/FlushCache.java
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.config;
-
-import static com.google.gerrit.common.data.GlobalCapability.FLUSH_CACHES;
-import static com.google.gerrit.common.data.GlobalCapability.MAINTAIN_SERVER;
-
-import com.google.gerrit.extensions.annotations.RequiresAnyCapability;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.config.FlushCache.Input;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-
-@RequiresAnyCapability({FLUSH_CACHES, MAINTAIN_SERVER})
-@Singleton
-public class FlushCache implements RestModifyView<CacheResource, Input> {
-  public static class Input {}
-
-  public static final String WEB_SESSIONS = "web_sessions";
-
-  private final PermissionBackend permissionBackend;
-  private final Provider<CurrentUser> self;
-
-  @Inject
-  public FlushCache(PermissionBackend permissionBackend, Provider<CurrentUser> self) {
-    this.permissionBackend = permissionBackend;
-    this.self = self;
-  }
-
-  @Override
-  public Response<String> apply(CacheResource rsrc, Input input)
-      throws AuthException, PermissionBackendException {
-    if (WEB_SESSIONS.equals(rsrc.getName())) {
-      permissionBackend.user(self).check(GlobalPermission.MAINTAIN_SERVER);
-    }
-
-    rsrc.getCache().invalidateAll();
-    return Response.ok("");
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GcConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GcConfig.java
deleted file mode 100644
index 36f5e29..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GcConfig.java
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.config;
-
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ConfigConstants;
-
-@Singleton
-public class GcConfig {
-  private final ScheduleConfig scheduleConfig;
-  private final boolean aggressive;
-
-  @Inject
-  GcConfig(@GerritServerConfig Config cfg) {
-    scheduleConfig = new ScheduleConfig(cfg, ConfigConstants.CONFIG_GC_SECTION);
-    aggressive = cfg.getBoolean(ConfigConstants.CONFIG_GC_SECTION, "aggressive", false);
-  }
-
-  public ScheduleConfig getScheduleConfig() {
-    return scheduleConfig;
-  }
-
-  public boolean isAggressive() {
-    return aggressive;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritGlobalModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritGlobalModule.java
deleted file mode 100644
index 773d4a9..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritGlobalModule.java
+++ /dev/null
@@ -1,421 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.config;
-
-import static com.google.inject.Scopes.SINGLETON;
-
-import com.google.common.cache.Cache;
-import com.google.gerrit.common.EventListener;
-import com.google.gerrit.common.UserScopedEventListener;
-import com.google.gerrit.extensions.annotations.Exports;
-import com.google.gerrit.extensions.api.changes.ActionVisitor;
-import com.google.gerrit.extensions.api.projects.CommentLinkInfo;
-import com.google.gerrit.extensions.auth.oauth.OAuthLoginProvider;
-import com.google.gerrit.extensions.auth.oauth.OAuthTokenEncrypter;
-import com.google.gerrit.extensions.common.AccountVisibility;
-import com.google.gerrit.extensions.config.CapabilityDefinition;
-import com.google.gerrit.extensions.config.CloneCommand;
-import com.google.gerrit.extensions.config.DownloadCommand;
-import com.google.gerrit.extensions.config.DownloadScheme;
-import com.google.gerrit.extensions.config.ExternalIncludedIn;
-import com.google.gerrit.extensions.config.FactoryModule;
-import com.google.gerrit.extensions.events.AccountIndexedListener;
-import com.google.gerrit.extensions.events.AgreementSignupListener;
-import com.google.gerrit.extensions.events.AssigneeChangedListener;
-import com.google.gerrit.extensions.events.ChangeAbandonedListener;
-import com.google.gerrit.extensions.events.ChangeDeletedListener;
-import com.google.gerrit.extensions.events.ChangeIndexedListener;
-import com.google.gerrit.extensions.events.ChangeMergedListener;
-import com.google.gerrit.extensions.events.ChangeRestoredListener;
-import com.google.gerrit.extensions.events.ChangeRevertedListener;
-import com.google.gerrit.extensions.events.CommentAddedListener;
-import com.google.gerrit.extensions.events.GarbageCollectorListener;
-import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
-import com.google.gerrit.extensions.events.GroupIndexedListener;
-import com.google.gerrit.extensions.events.HashtagsEditedListener;
-import com.google.gerrit.extensions.events.HeadUpdatedListener;
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.gerrit.extensions.events.NewProjectCreatedListener;
-import com.google.gerrit.extensions.events.PluginEventListener;
-import com.google.gerrit.extensions.events.PrivateStateChangedListener;
-import com.google.gerrit.extensions.events.ProjectDeletedListener;
-import com.google.gerrit.extensions.events.ReviewerAddedListener;
-import com.google.gerrit.extensions.events.ReviewerDeletedListener;
-import com.google.gerrit.extensions.events.RevisionCreatedListener;
-import com.google.gerrit.extensions.events.TopicEditedListener;
-import com.google.gerrit.extensions.events.UsageDataPublishedListener;
-import com.google.gerrit.extensions.events.VoteDeletedListener;
-import com.google.gerrit.extensions.events.WorkInProgressStateChangedListener;
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.systemstatus.MessageOfTheDay;
-import com.google.gerrit.extensions.webui.BranchWebLink;
-import com.google.gerrit.extensions.webui.DiffWebLink;
-import com.google.gerrit.extensions.webui.FileHistoryWebLink;
-import com.google.gerrit.extensions.webui.FileWebLink;
-import com.google.gerrit.extensions.webui.ParentWebLink;
-import com.google.gerrit.extensions.webui.PatchSetWebLink;
-import com.google.gerrit.extensions.webui.ProjectWebLink;
-import com.google.gerrit.extensions.webui.TagWebLink;
-import com.google.gerrit.extensions.webui.TopMenu;
-import com.google.gerrit.extensions.webui.WebUiPlugin;
-import com.google.gerrit.rules.PrologModule;
-import com.google.gerrit.rules.RulesCache;
-import com.google.gerrit.server.AnonymousUser;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.ChangeFinder;
-import com.google.gerrit.server.CmdLineParserModule;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.PluginUser;
-import com.google.gerrit.server.Sequences;
-import com.google.gerrit.server.account.AccountCacheImpl;
-import com.google.gerrit.server.account.AccountControl;
-import com.google.gerrit.server.account.AccountDeactivator;
-import com.google.gerrit.server.account.AccountManager;
-import com.google.gerrit.server.account.AccountResolver;
-import com.google.gerrit.server.account.AccountVisibilityProvider;
-import com.google.gerrit.server.account.CapabilityCollection;
-import com.google.gerrit.server.account.ChangeUserName;
-import com.google.gerrit.server.account.EmailExpander;
-import com.google.gerrit.server.account.GroupCacheImpl;
-import com.google.gerrit.server.account.GroupControl;
-import com.google.gerrit.server.account.GroupIncludeCacheImpl;
-import com.google.gerrit.server.account.GroupMembers;
-import com.google.gerrit.server.account.VersionedAuthorizedKeys;
-import com.google.gerrit.server.account.externalids.ExternalIdModule;
-import com.google.gerrit.server.api.accounts.AccountExternalIdCreator;
-import com.google.gerrit.server.auth.AuthBackend;
-import com.google.gerrit.server.auth.UniversalAuthBackend;
-import com.google.gerrit.server.auth.oauth.OAuthTokenCache;
-import com.google.gerrit.server.avatar.AvatarProvider;
-import com.google.gerrit.server.cache.CacheRemovalListener;
-import com.google.gerrit.server.change.AccountPatchReviewStore;
-import com.google.gerrit.server.change.ChangeJson;
-import com.google.gerrit.server.change.ChangeKindCacheImpl;
-import com.google.gerrit.server.change.MergeabilityCacheImpl;
-import com.google.gerrit.server.change.ReviewerSuggestion;
-import com.google.gerrit.server.events.EventFactory;
-import com.google.gerrit.server.events.EventsMetrics;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.extensions.webui.UiActions;
-import com.google.gerrit.server.git.AbandonOp;
-import com.google.gerrit.server.git.ChangeMessageModifier;
-import com.google.gerrit.server.git.EmailMerge;
-import com.google.gerrit.server.git.GitModule;
-import com.google.gerrit.server.git.GitModules;
-import com.google.gerrit.server.git.MergeUtil;
-import com.google.gerrit.server.git.MergedByPushOp;
-import com.google.gerrit.server.git.NotesBranchUtil;
-import com.google.gerrit.server.git.ReceivePackInitializer;
-import com.google.gerrit.server.git.TagCache;
-import com.google.gerrit.server.git.TransferConfig;
-import com.google.gerrit.server.git.VisibleRefFilter;
-import com.google.gerrit.server.git.receive.ReceiveCommitsModule;
-import com.google.gerrit.server.git.strategy.SubmitStrategy;
-import com.google.gerrit.server.git.validators.CommitValidationListener;
-import com.google.gerrit.server.git.validators.MergeValidationListener;
-import com.google.gerrit.server.git.validators.MergeValidators;
-import com.google.gerrit.server.git.validators.MergeValidators.AccountMergeValidator;
-import com.google.gerrit.server.git.validators.MergeValidators.ProjectConfigValidator;
-import com.google.gerrit.server.git.validators.OnSubmitValidationListener;
-import com.google.gerrit.server.git.validators.OnSubmitValidators;
-import com.google.gerrit.server.git.validators.RefOperationValidationListener;
-import com.google.gerrit.server.git.validators.RefOperationValidators;
-import com.google.gerrit.server.git.validators.UploadValidationListener;
-import com.google.gerrit.server.git.validators.UploadValidators;
-import com.google.gerrit.server.group.GroupModule;
-import com.google.gerrit.server.index.change.ReindexAfterRefUpdate;
-import com.google.gerrit.server.mail.EmailModule;
-import com.google.gerrit.server.mail.ListMailFilter;
-import com.google.gerrit.server.mail.MailFilter;
-import com.google.gerrit.server.mail.send.AddKeySender;
-import com.google.gerrit.server.mail.send.AddReviewerSender;
-import com.google.gerrit.server.mail.send.CreateChangeSender;
-import com.google.gerrit.server.mail.send.DeleteReviewerSender;
-import com.google.gerrit.server.mail.send.FromAddressGenerator;
-import com.google.gerrit.server.mail.send.FromAddressGeneratorProvider;
-import com.google.gerrit.server.mail.send.MailSoyTofuProvider;
-import com.google.gerrit.server.mail.send.MailTemplates;
-import com.google.gerrit.server.mail.send.MergedSender;
-import com.google.gerrit.server.mail.send.RegisterNewEmailSender;
-import com.google.gerrit.server.mail.send.ReplacePatchSetSender;
-import com.google.gerrit.server.mail.send.SetAssigneeSender;
-import com.google.gerrit.server.mail.send.VelocityRuntimeProvider;
-import com.google.gerrit.server.mime.FileTypeRegistry;
-import com.google.gerrit.server.mime.MimeUtilFileTypeRegistry;
-import com.google.gerrit.server.notedb.NoteDbModule;
-import com.google.gerrit.server.patch.PatchListCacheImpl;
-import com.google.gerrit.server.patch.PatchScriptFactory;
-import com.google.gerrit.server.patch.PatchSetInfoFactory;
-import com.google.gerrit.server.plugins.ReloadPluginListener;
-import com.google.gerrit.server.project.AccessControlModule;
-import com.google.gerrit.server.project.CommentLinkProvider;
-import com.google.gerrit.server.project.PermissionCollection;
-import com.google.gerrit.server.project.ProjectCacheImpl;
-import com.google.gerrit.server.project.ProjectNode;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.project.SectionSortCache;
-import com.google.gerrit.server.project.SubmitRuleEvaluator;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.ChangeQueryBuilder;
-import com.google.gerrit.server.query.change.ChangeQueryProcessor;
-import com.google.gerrit.server.query.change.ConflictsCacheImpl;
-import com.google.gerrit.server.ssh.SshAddressesModule;
-import com.google.gerrit.server.tools.ToolsCatalog;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.util.IdGenerator;
-import com.google.gerrit.server.util.ThreadLocalRequestContext;
-import com.google.gerrit.server.validators.AssigneeValidationListener;
-import com.google.gerrit.server.validators.GroupCreationValidationListener;
-import com.google.gerrit.server.validators.HashtagValidationListener;
-import com.google.gerrit.server.validators.OutgoingEmailValidationListener;
-import com.google.gerrit.server.validators.ProjectCreationValidationListener;
-import com.google.gitiles.blame.cache.BlameCache;
-import com.google.gitiles.blame.cache.BlameCacheImpl;
-import com.google.inject.Inject;
-import com.google.inject.TypeLiteral;
-import com.google.inject.internal.UniqueAnnotations;
-import com.google.template.soy.tofu.SoyTofu;
-import java.util.List;
-import org.apache.velocity.runtime.RuntimeInstance;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.transport.PostReceiveHook;
-import org.eclipse.jgit.transport.PostUploadHook;
-import org.eclipse.jgit.transport.PreUploadHook;
-
-/** Starts global state with standard dependencies. */
-public class GerritGlobalModule extends FactoryModule {
-  private final Config cfg;
-  private final AuthModule authModule;
-
-  @Inject
-  GerritGlobalModule(@GerritServerConfig Config cfg, AuthModule authModule) {
-    this.cfg = cfg;
-    this.authModule = authModule;
-  }
-
-  @Override
-  protected void configure() {
-    bind(EmailExpander.class).toProvider(EmailExpanderProvider.class).in(SINGLETON);
-
-    bind(IdGenerator.class);
-    bind(RulesCache.class);
-    bind(BlameCache.class).to(BlameCacheImpl.class);
-    bind(Sequences.class);
-    install(authModule);
-    install(AccountCacheImpl.module());
-    install(BatchUpdate.module());
-    install(ChangeKindCacheImpl.module());
-    install(ChangeFinder.module());
-    install(ConflictsCacheImpl.module());
-    install(GroupCacheImpl.module());
-    install(GroupIncludeCacheImpl.module());
-    install(MergeabilityCacheImpl.module());
-    install(PatchListCacheImpl.module());
-    install(ProjectCacheImpl.module());
-    install(SectionSortCache.module());
-    install(SubmitStrategy.module());
-    install(TagCache.module());
-    install(OAuthTokenCache.module());
-
-    install(new AccessControlModule());
-    install(new CmdLineParserModule());
-    install(new EmailModule());
-    install(new ExternalIdModule());
-    install(new GitModule());
-    install(new GroupModule());
-    install(new NoteDbModule(cfg));
-    install(new PrologModule());
-    install(new ReceiveCommitsModule());
-    install(new SshAddressesModule());
-    install(ThreadLocalRequestContext.module());
-
-    bind(AccountResolver.class);
-
-    factory(AddReviewerSender.Factory.class);
-    factory(DeleteReviewerSender.Factory.class);
-    factory(AddKeySender.Factory.class);
-    factory(CapabilityCollection.Factory.class);
-    factory(ChangeData.AssistedFactory.class);
-    factory(ChangeJson.AssistedFactory.class);
-    factory(CreateChangeSender.Factory.class);
-    factory(GroupMembers.Factory.class);
-    factory(EmailMerge.Factory.class);
-    factory(MergedSender.Factory.class);
-    factory(MergeUtil.Factory.class);
-    factory(PatchScriptFactory.Factory.class);
-    factory(PluginUser.Factory.class);
-    factory(ProjectNode.Factory.class);
-    factory(ProjectState.Factory.class);
-    factory(RegisterNewEmailSender.Factory.class);
-    factory(ReplacePatchSetSender.Factory.class);
-    factory(SetAssigneeSender.Factory.class);
-    factory(VisibleRefFilter.Factory.class);
-    bind(PermissionCollection.Factory.class);
-    bind(AccountVisibility.class).toProvider(AccountVisibilityProvider.class).in(SINGLETON);
-    factory(ProjectOwnerGroupsProvider.Factory.class);
-    factory(SubmitRuleEvaluator.Factory.class);
-
-    bind(AuthBackend.class).to(UniversalAuthBackend.class).in(SINGLETON);
-    DynamicSet.setOf(binder(), AuthBackend.class);
-
-    bind(GroupControl.Factory.class).in(SINGLETON);
-    bind(GroupControl.GenericFactory.class).in(SINGLETON);
-
-    bind(FileTypeRegistry.class).to(MimeUtilFileTypeRegistry.class);
-    bind(ToolsCatalog.class);
-    bind(EventFactory.class);
-    bind(TransferConfig.class);
-
-    bind(GcConfig.class);
-    bind(ChangeCleanupConfig.class);
-    bind(AccountDeactivator.class);
-
-    bind(ApprovalsUtil.class);
-
-    bind(RuntimeInstance.class).toProvider(VelocityRuntimeProvider.class);
-    bind(SoyTofu.class).annotatedWith(MailTemplates.class).toProvider(MailSoyTofuProvider.class);
-    bind(FromAddressGenerator.class).toProvider(FromAddressGeneratorProvider.class).in(SINGLETON);
-    bind(Boolean.class)
-        .annotatedWith(DisableReverseDnsLookup.class)
-        .toProvider(DisableReverseDnsLookupProvider.class)
-        .in(SINGLETON);
-
-    bind(PatchSetInfoFactory.class);
-    bind(IdentifiedUser.GenericFactory.class).in(SINGLETON);
-    bind(AccountControl.Factory.class);
-
-    bind(UiActions.class);
-    install(new com.google.gerrit.server.access.Module());
-    install(new com.google.gerrit.server.account.Module());
-    install(new com.google.gerrit.server.api.Module());
-    install(new com.google.gerrit.server.change.Module());
-    install(new com.google.gerrit.server.config.Module());
-    install(new com.google.gerrit.server.group.Module());
-    install(new com.google.gerrit.server.project.Module());
-
-    bind(GitReferenceUpdated.class);
-    DynamicMap.mapOf(binder(), new TypeLiteral<Cache<?, ?>>() {});
-    DynamicSet.setOf(binder(), CacheRemovalListener.class);
-    DynamicMap.mapOf(binder(), CapabilityDefinition.class);
-    DynamicSet.setOf(binder(), GitReferenceUpdatedListener.class);
-    DynamicSet.setOf(binder(), AssigneeChangedListener.class);
-    DynamicSet.setOf(binder(), ChangeAbandonedListener.class);
-    DynamicSet.setOf(binder(), ChangeDeletedListener.class);
-    DynamicSet.setOf(binder(), CommentAddedListener.class);
-    DynamicSet.setOf(binder(), HashtagsEditedListener.class);
-    DynamicSet.setOf(binder(), ChangeMergedListener.class);
-    DynamicSet.setOf(binder(), ChangeRestoredListener.class);
-    DynamicSet.setOf(binder(), ChangeRevertedListener.class);
-    DynamicSet.setOf(binder(), PrivateStateChangedListener.class);
-    DynamicSet.setOf(binder(), ReviewerAddedListener.class);
-    DynamicSet.setOf(binder(), ReviewerDeletedListener.class);
-    DynamicSet.setOf(binder(), VoteDeletedListener.class);
-    DynamicSet.setOf(binder(), WorkInProgressStateChangedListener.class);
-    DynamicSet.setOf(binder(), RevisionCreatedListener.class);
-    DynamicSet.setOf(binder(), TopicEditedListener.class);
-    DynamicSet.setOf(binder(), AgreementSignupListener.class);
-    DynamicSet.setOf(binder(), PluginEventListener.class);
-    DynamicSet.setOf(binder(), ReceivePackInitializer.class);
-    DynamicSet.setOf(binder(), PostReceiveHook.class);
-    DynamicSet.setOf(binder(), PreUploadHook.class);
-    DynamicSet.setOf(binder(), PostUploadHook.class);
-    DynamicSet.setOf(binder(), AccountIndexedListener.class);
-    DynamicSet.setOf(binder(), ChangeIndexedListener.class);
-    DynamicSet.setOf(binder(), GroupIndexedListener.class);
-    DynamicSet.setOf(binder(), NewProjectCreatedListener.class);
-    DynamicSet.setOf(binder(), ProjectDeletedListener.class);
-    DynamicSet.setOf(binder(), GarbageCollectorListener.class);
-    DynamicSet.setOf(binder(), HeadUpdatedListener.class);
-    DynamicSet.setOf(binder(), UsageDataPublishedListener.class);
-    DynamicSet.bind(binder(), GitReferenceUpdatedListener.class).to(ReindexAfterRefUpdate.class);
-    DynamicSet.bind(binder(), GitReferenceUpdatedListener.class)
-        .to(ProjectConfigEntry.UpdateChecker.class);
-    DynamicSet.setOf(binder(), EventListener.class);
-    DynamicSet.bind(binder(), EventListener.class).to(EventsMetrics.class);
-    DynamicSet.setOf(binder(), UserScopedEventListener.class);
-    DynamicSet.setOf(binder(), CommitValidationListener.class);
-    DynamicSet.setOf(binder(), ChangeMessageModifier.class);
-    DynamicSet.setOf(binder(), RefOperationValidationListener.class);
-    DynamicSet.setOf(binder(), OnSubmitValidationListener.class);
-    DynamicSet.setOf(binder(), MergeValidationListener.class);
-    DynamicSet.setOf(binder(), ProjectCreationValidationListener.class);
-    DynamicSet.setOf(binder(), GroupCreationValidationListener.class);
-    DynamicSet.setOf(binder(), HashtagValidationListener.class);
-    DynamicSet.setOf(binder(), OutgoingEmailValidationListener.class);
-    DynamicItem.itemOf(binder(), AvatarProvider.class);
-    DynamicSet.setOf(binder(), LifecycleListener.class);
-    DynamicSet.setOf(binder(), TopMenu.class);
-    DynamicSet.setOf(binder(), MessageOfTheDay.class);
-    DynamicMap.mapOf(binder(), DownloadScheme.class);
-    DynamicMap.mapOf(binder(), DownloadCommand.class);
-    DynamicMap.mapOf(binder(), CloneCommand.class);
-    DynamicMap.mapOf(binder(), ReviewerSuggestion.class);
-    DynamicSet.setOf(binder(), ExternalIncludedIn.class);
-    DynamicMap.mapOf(binder(), ProjectConfigEntry.class);
-    DynamicSet.setOf(binder(), PatchSetWebLink.class);
-    DynamicSet.setOf(binder(), ParentWebLink.class);
-    DynamicSet.setOf(binder(), FileWebLink.class);
-    DynamicSet.setOf(binder(), FileHistoryWebLink.class);
-    DynamicSet.setOf(binder(), DiffWebLink.class);
-    DynamicSet.setOf(binder(), ProjectWebLink.class);
-    DynamicSet.setOf(binder(), BranchWebLink.class);
-    DynamicSet.setOf(binder(), TagWebLink.class);
-    DynamicMap.mapOf(binder(), OAuthLoginProvider.class);
-    DynamicItem.itemOf(binder(), OAuthTokenEncrypter.class);
-    DynamicSet.setOf(binder(), AccountExternalIdCreator.class);
-    DynamicSet.setOf(binder(), WebUiPlugin.class);
-    DynamicItem.itemOf(binder(), AccountPatchReviewStore.class);
-    DynamicSet.setOf(binder(), AssigneeValidationListener.class);
-    DynamicSet.setOf(binder(), ActionVisitor.class);
-
-    DynamicMap.mapOf(binder(), MailFilter.class);
-    bind(MailFilter.class).annotatedWith(Exports.named("ListMailFilter")).to(ListMailFilter.class);
-
-    factory(UploadValidators.Factory.class);
-    DynamicSet.setOf(binder(), UploadValidationListener.class);
-
-    DynamicMap.mapOf(binder(), ChangeQueryBuilder.ChangeOperatorFactory.class);
-    DynamicMap.mapOf(binder(), ChangeQueryBuilder.ChangeHasOperandFactory.class);
-    DynamicMap.mapOf(binder(), ChangeQueryProcessor.ChangeAttributeFactory.class);
-
-    install(new GitwebConfig.LegacyModule(cfg));
-
-    bind(AnonymousUser.class);
-
-    factory(AbandonOp.Factory.class);
-    factory(AccountMergeValidator.Factory.class);
-    factory(RefOperationValidators.Factory.class);
-    factory(OnSubmitValidators.Factory.class);
-    factory(MergeValidators.Factory.class);
-    factory(ProjectConfigValidator.Factory.class);
-    factory(NotesBranchUtil.Factory.class);
-    factory(MergedByPushOp.Factory.class);
-    factory(GitModules.Factory.class);
-    factory(VersionedAuthorizedKeys.Factory.class);
-
-    bind(AccountManager.class);
-    factory(ChangeUserName.Factory.class);
-
-    bind(new TypeLiteral<List<CommentLinkInfo>>() {})
-        .toProvider(CommentLinkProvider.class)
-        .in(SINGLETON);
-
-    bind(ReloadPluginListener.class)
-        .annotatedWith(UniqueAnnotations.create())
-        .to(PluginConfigFactory.class);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritOptions.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritOptions.java
deleted file mode 100644
index 725a69a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritOptions.java
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.config;
-
-import static com.google.common.base.MoreObjects.firstNonNull;
-import static com.google.common.base.Preconditions.checkArgument;
-
-import com.google.gerrit.extensions.client.UiType;
-import org.eclipse.jgit.lib.Config;
-
-public class GerritOptions {
-  private final boolean headless;
-  private final boolean slave;
-  private final boolean enablePolyGerrit;
-  private final boolean enableGwtUi;
-  private final boolean forcePolyGerritDev;
-  private final UiType defaultUi;
-
-  public GerritOptions(Config cfg, boolean headless, boolean slave, boolean forcePolyGerritDev) {
-    this.slave = slave;
-    this.enablePolyGerrit =
-        forcePolyGerritDev || cfg.getBoolean("gerrit", null, "enablePolyGerrit", true);
-    this.enableGwtUi = cfg.getBoolean("gerrit", null, "enableGwtUi", true);
-    this.forcePolyGerritDev = forcePolyGerritDev;
-    this.headless = headless || (!enableGwtUi && !enablePolyGerrit);
-
-    UiType defaultUi = enablePolyGerrit && !enableGwtUi ? UiType.POLYGERRIT : UiType.GWT;
-    String uiStr = firstNonNull(cfg.getString("gerrit", null, "ui"), defaultUi.name());
-    this.defaultUi = firstNonNull(UiType.parse(uiStr), UiType.NONE);
-
-    switch (defaultUi) {
-      case GWT:
-        checkArgument(enableGwtUi, "gerrit.ui = %s but GWT UI is disabled", defaultUi);
-        break;
-      case POLYGERRIT:
-        checkArgument(enablePolyGerrit, "gerrit.ui = %s but PolyGerrit is disabled", defaultUi);
-        break;
-      case NONE:
-      default:
-        throw new IllegalArgumentException("invalid gerrit.ui: " + uiStr);
-    }
-  }
-
-  public boolean headless() {
-    return headless;
-  }
-
-  public boolean enableGwtUi() {
-    return !headless && enableGwtUi;
-  }
-
-  public boolean enableMasterFeatures() {
-    return !slave;
-  }
-
-  public boolean enablePolyGerrit() {
-    return !headless && enablePolyGerrit;
-  }
-
-  public boolean forcePolyGerritDev() {
-    return !headless && forcePolyGerritDev;
-  }
-
-  public UiType defaultUi() {
-    return defaultUi;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritRequestModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritRequestModule.java
deleted file mode 100644
index 5d88ec0..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritRequestModule.java
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.config;
-
-import static com.google.inject.Scopes.SINGLETON;
-
-import com.google.gerrit.extensions.config.FactoryModule;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.RequestCleanup;
-import com.google.gerrit.server.project.PerRequestProjectControlCache;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.inject.servlet.RequestScoped;
-
-/** Bindings for {@link RequestScoped} entities. */
-public class GerritRequestModule extends FactoryModule {
-  @Override
-  protected void configure() {
-    bind(RequestCleanup.class).in(RequestScoped.class);
-    bind(RequestScopedReviewDbProvider.class);
-    bind(IdentifiedUser.RequestFactory.class).in(SINGLETON);
-
-    bind(PerRequestProjectControlCache.class).in(RequestScoped.class);
-    bind(ProjectControl.Factory.class).in(SINGLETON);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerConfigModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerConfigModule.java
deleted file mode 100644
index a93d1f2..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerConfigModule.java
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.config;
-
-import static com.google.inject.Scopes.SINGLETON;
-
-import com.google.gerrit.server.securestore.DefaultSecureStore;
-import com.google.gerrit.server.securestore.SecureStore;
-import com.google.gerrit.server.securestore.SecureStoreProvider;
-import com.google.inject.AbstractModule;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import com.google.inject.ProvisionException;
-import java.io.IOException;
-import java.nio.file.Path;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.storage.file.FileBasedConfig;
-import org.eclipse.jgit.util.FS;
-
-/** Creates {@link GerritServerConfig}. */
-public class GerritServerConfigModule extends AbstractModule {
-  public static String getSecureStoreClassName(Path sitePath) {
-    if (sitePath != null) {
-      return getSecureStoreFromGerritConfig(sitePath);
-    }
-
-    String secureStoreProperty = System.getProperty("gerrit.secure_store_class");
-    return nullToDefault(secureStoreProperty);
-  }
-
-  private static String getSecureStoreFromGerritConfig(Path sitePath) {
-    AbstractModule m =
-        new AbstractModule() {
-          @Override
-          protected void configure() {
-            bind(Path.class).annotatedWith(SitePath.class).toInstance(sitePath);
-            bind(SitePaths.class);
-          }
-        };
-    Injector injector = Guice.createInjector(m);
-    SitePaths site = injector.getInstance(SitePaths.class);
-    FileBasedConfig cfg = new FileBasedConfig(site.gerrit_config.toFile(), FS.DETECTED);
-    if (!cfg.getFile().exists()) {
-      return DefaultSecureStore.class.getName();
-    }
-
-    try {
-      cfg.load();
-      String className = cfg.getString("gerrit", null, "secureStoreClass");
-      return nullToDefault(className);
-    } catch (IOException | ConfigInvalidException e) {
-      throw new ProvisionException(e.getMessage(), e);
-    }
-  }
-
-  private static String nullToDefault(String className) {
-    return className != null ? className : DefaultSecureStore.class.getName();
-  }
-
-  @Override
-  protected void configure() {
-    bind(SitePaths.class);
-    bind(TrackingFooters.class).toProvider(TrackingFootersProvider.class).in(SINGLETON);
-    bind(Config.class)
-        .annotatedWith(GerritServerConfig.class)
-        .toProvider(GerritServerConfigProvider.class)
-        .in(SINGLETON);
-    bind(SecureStore.class).toProvider(SecureStoreProvider.class).in(SINGLETON);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerConfigProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerConfigProvider.java
deleted file mode 100644
index 82fb6ec..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerConfigProvider.java
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.config;
-
-import static java.util.stream.Collectors.joining;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.server.notedb.NotesMigration;
-import com.google.gerrit.server.securestore.SecureStore;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.ProvisionException;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.List;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.storage.file.FileBasedConfig;
-import org.eclipse.jgit.util.FS;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Provides {@link Config} annotated with {@link GerritServerConfig}.
- *
- * <p>Note that this class is not a singleton, so the few callers that need a reloaded-on-demand
- * config can inject a {@code GerritServerConfigProvider}. However, most callers won't need this,
- * and will just inject {@code @GerritServerConfig Config} directly, which is bound as a singleton
- * in {@link GerritServerConfigModule}.
- */
-public class GerritServerConfigProvider implements Provider<Config> {
-  private static final Logger log = LoggerFactory.getLogger(GerritServerConfigProvider.class);
-
-  private final SitePaths site;
-  private final SecureStore secureStore;
-
-  @Inject
-  GerritServerConfigProvider(SitePaths site, SecureStore secureStore) {
-    this.site = site;
-    this.secureStore = secureStore;
-  }
-
-  @Override
-  public Config get() {
-    FileBasedConfig baseConfig = loadConfig(null, site.gerrit_config);
-    if (!baseConfig.getFile().exists()) {
-      log.info("No " + site.gerrit_config.toAbsolutePath() + "; assuming defaults");
-    }
-
-    FileBasedConfig noteDbConfigOverBaseConfig = loadConfig(baseConfig, site.notedb_config);
-    checkNoteDbConfig(noteDbConfigOverBaseConfig);
-
-    return new GerritConfig(noteDbConfigOverBaseConfig, baseConfig, secureStore);
-  }
-
-  private static FileBasedConfig loadConfig(@Nullable Config base, Path path) {
-    FileBasedConfig cfg = new FileBasedConfig(base, path.toFile(), FS.DETECTED);
-    try {
-      cfg.load();
-    } catch (IOException | ConfigInvalidException e) {
-      throw new ProvisionException(e.getMessage(), e);
-    }
-    return cfg;
-  }
-
-  private static void checkNoteDbConfig(FileBasedConfig noteDbConfig) {
-    List<String> bad = new ArrayList<>();
-    for (String section : noteDbConfig.getSections()) {
-      if (section.equals(NotesMigration.SECTION_NOTE_DB)) {
-        continue;
-      }
-      for (String subsection : noteDbConfig.getSubsections(section)) {
-        noteDbConfig
-            .getNames(section, subsection, false)
-            .forEach(n -> bad.add(section + "." + subsection + "." + n));
-      }
-      noteDbConfig.getNames(section, false).forEach(n -> bad.add(section + "." + n));
-    }
-    if (!bad.isEmpty()) {
-      throw new ProvisionException(
-          "Non-NoteDb config options not allowed in "
-              + noteDbConfig.getFile()
-              + ":\n"
-              + bad.stream().collect(joining("\n")));
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerIdProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerIdProvider.java
deleted file mode 100644
index dd84d78..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerIdProvider.java
+++ /dev/null
@@ -1,77 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.config;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.base.Strings;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.util.UUID;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.storage.file.FileBasedConfig;
-import org.eclipse.jgit.util.FS;
-
-public class GerritServerIdProvider implements Provider<String> {
-  public static final String SECTION = "gerrit";
-  public static final String KEY = "serverId";
-
-  public static String generate() {
-    return UUID.randomUUID().toString();
-  }
-
-  private final String id;
-
-  @Inject
-  GerritServerIdProvider(@GerritServerConfig Config cfg, SitePaths sitePaths)
-      throws IOException, ConfigInvalidException {
-    String origId = cfg.getString(SECTION, null, KEY);
-    if (!Strings.isNullOrEmpty(origId)) {
-      id = origId;
-      return;
-    }
-
-    // We're not generally supposed to do work in provider constructors, but this is a bit of a
-    // special case because we really need to have the ID available by the time the dbInjector
-    // is created. This even applies during MigrateToNoteDb, which otherwise would have been a
-    // reasonable place to do the ID generation. Fortunately, it's not much work, and it happens
-    // once.
-    id = generate();
-    Config newCfg = readGerritConfig(sitePaths);
-    newCfg.setString(SECTION, null, KEY, id);
-    Files.write(sitePaths.gerrit_config, newCfg.toText().getBytes(UTF_8));
-  }
-
-  @Override
-  public String get() {
-    return id;
-  }
-
-  private static Config readGerritConfig(SitePaths sitePaths)
-      throws IOException, ConfigInvalidException {
-    // Reread gerrit.config from disk before writing. We can't just use
-    // cfg.toText(), as the @GerritServerConfig only has gerrit.config as a
-    // fallback.
-    FileBasedConfig cfg = new FileBasedConfig(sitePaths.gerrit_config.toFile(), FS.DETECTED);
-    if (!cfg.getFile().exists()) {
-      return new Config();
-    }
-    cfg.load();
-    return cfg;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GetCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GetCache.java
deleted file mode 100644
index 53628cc..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GetCache.java
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.config;
-
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.server.config.ListCaches.CacheInfo;
-import com.google.inject.Singleton;
-
-@Singleton
-public class GetCache implements RestReadView<CacheResource> {
-
-  @Override
-  public CacheInfo apply(CacheResource rsrc) {
-    return new CacheInfo(rsrc.getName(), rsrc.getCache());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GetDiffPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GetDiffPreferences.java
deleted file mode 100644
index 8393fb4..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GetDiffPreferences.java
+++ /dev/null
@@ -1,68 +0,0 @@
-// 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.
-package com.google.gerrit.server.config;
-
-import static com.google.gerrit.server.config.ConfigUtil.loadSection;
-
-import com.google.gerrit.extensions.client.DiffPreferencesInfo;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.server.account.VersionedAccountPreferences;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.UserConfigSections;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.Repository;
-
-@Singleton
-public class GetDiffPreferences implements RestReadView<ConfigResource> {
-
-  private final AllUsersName allUsersName;
-  private final GitRepositoryManager gitManager;
-
-  @Inject
-  GetDiffPreferences(GitRepositoryManager gitManager, AllUsersName allUsersName) {
-    this.allUsersName = allUsersName;
-    this.gitManager = gitManager;
-  }
-
-  @Override
-  public DiffPreferencesInfo apply(ConfigResource configResource)
-      throws BadRequestException, ResourceConflictException, IOException, ConfigInvalidException {
-    return readFromGit(gitManager, allUsersName, null);
-  }
-
-  static DiffPreferencesInfo readFromGit(
-      GitRepositoryManager gitMgr, AllUsersName allUsersName, DiffPreferencesInfo in)
-      throws IOException, ConfigInvalidException, RepositoryNotFoundException {
-    try (Repository git = gitMgr.openRepository(allUsersName)) {
-      // Load all users prefs.
-      VersionedAccountPreferences dp = VersionedAccountPreferences.forDefault();
-      dp.load(git);
-      DiffPreferencesInfo allUserPrefs = new DiffPreferencesInfo();
-      loadSection(
-          dp.getConfig(),
-          UserConfigSections.DIFF,
-          null,
-          allUserPrefs,
-          DiffPreferencesInfo.defaults(),
-          in);
-      return allUserPrefs;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GetPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GetPreferences.java
deleted file mode 100644
index ed212f4..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GetPreferences.java
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.config;
-
-import static com.google.gerrit.server.config.ConfigUtil.loadSection;
-
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.server.account.GeneralPreferencesLoader;
-import com.google.gerrit.server.account.VersionedAccountPreferences;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.UserConfigSections;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.Repository;
-
-@Singleton
-public class GetPreferences implements RestReadView<ConfigResource> {
-  private final GeneralPreferencesLoader loader;
-  private final GitRepositoryManager gitMgr;
-  private final AllUsersName allUsersName;
-
-  @Inject
-  public GetPreferences(
-      GeneralPreferencesLoader loader, GitRepositoryManager gitMgr, AllUsersName allUsersName) {
-    this.loader = loader;
-    this.gitMgr = gitMgr;
-    this.allUsersName = allUsersName;
-  }
-
-  @Override
-  public GeneralPreferencesInfo apply(ConfigResource rsrc)
-      throws IOException, ConfigInvalidException {
-    return readFromGit(gitMgr, loader, allUsersName, null);
-  }
-
-  static GeneralPreferencesInfo readFromGit(
-      GitRepositoryManager gitMgr,
-      GeneralPreferencesLoader loader,
-      AllUsersName allUsersName,
-      GeneralPreferencesInfo in)
-      throws IOException, ConfigInvalidException, RepositoryNotFoundException {
-    try (Repository git = gitMgr.openRepository(allUsersName)) {
-      VersionedAccountPreferences p = VersionedAccountPreferences.forDefault();
-      p.load(git);
-
-      GeneralPreferencesInfo r =
-          loadSection(
-              p.getConfig(),
-              UserConfigSections.GENERAL,
-              null,
-              new GeneralPreferencesInfo(),
-              GeneralPreferencesInfo.defaults(),
-              in);
-
-      // TODO(davido): Maintain cache of default values in AllUsers repository
-      return loader.loadMyMenusAndUrlAliases(r, p, null);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GetServerInfo.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GetServerInfo.java
deleted file mode 100644
index 7a1031e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GetServerInfo.java
+++ /dev/null
@@ -1,391 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.config;
-
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.base.CharMatcher;
-import com.google.common.base.Strings;
-import com.google.common.collect.Lists;
-import com.google.gerrit.common.data.ContributorAgreement;
-import com.google.gerrit.extensions.client.UiType;
-import com.google.gerrit.extensions.common.AccountsInfo;
-import com.google.gerrit.extensions.common.AuthInfo;
-import com.google.gerrit.extensions.common.ChangeConfigInfo;
-import com.google.gerrit.extensions.common.DownloadInfo;
-import com.google.gerrit.extensions.common.DownloadSchemeInfo;
-import com.google.gerrit.extensions.common.GerritInfo;
-import com.google.gerrit.extensions.common.PluginConfigInfo;
-import com.google.gerrit.extensions.common.ReceiveInfo;
-import com.google.gerrit.extensions.common.ServerInfo;
-import com.google.gerrit.extensions.common.SshdInfo;
-import com.google.gerrit.extensions.common.SuggestInfo;
-import com.google.gerrit.extensions.common.UserConfigInfo;
-import com.google.gerrit.extensions.config.CloneCommand;
-import com.google.gerrit.extensions.config.DownloadCommand;
-import com.google.gerrit.extensions.config.DownloadScheme;
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.extensions.webui.WebUiPlugin;
-import com.google.gerrit.server.EnableSignedPush;
-import com.google.gerrit.server.account.AccountVisibilityProvider;
-import com.google.gerrit.server.account.Realm;
-import com.google.gerrit.server.avatar.AvatarProvider;
-import com.google.gerrit.server.change.AllowedFormats;
-import com.google.gerrit.server.change.ArchiveFormat;
-import com.google.gerrit.server.change.Submit;
-import com.google.gerrit.server.documentation.QueryDocumentationExecutor;
-import com.google.gerrit.server.index.change.ChangeField;
-import com.google.gerrit.server.index.change.ChangeIndexCollection;
-import com.google.gerrit.server.notedb.NotesMigration;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.inject.Inject;
-import java.net.MalformedURLException;
-import java.nio.file.Files;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Optional;
-import java.util.concurrent.TimeUnit;
-import org.eclipse.jgit.lib.Config;
-
-public class GetServerInfo implements RestReadView<ConfigResource> {
-  private static final String URL_ALIAS = "urlAlias";
-  private static final String KEY_MATCH = "match";
-  private static final String KEY_TOKEN = "token";
-
-  private final Config config;
-  private final AccountVisibilityProvider accountVisibilityProvider;
-  private final AuthConfig authConfig;
-  private final Realm realm;
-  private final DynamicMap<DownloadScheme> downloadSchemes;
-  private final DynamicMap<DownloadCommand> downloadCommands;
-  private final DynamicMap<CloneCommand> cloneCommands;
-  private final DynamicSet<WebUiPlugin> plugins;
-  private final AllowedFormats archiveFormats;
-  private final AllProjectsName allProjectsName;
-  private final AllUsersName allUsersName;
-  private final String anonymousCowardName;
-  private final DynamicItem<AvatarProvider> avatar;
-  private final boolean enableSignedPush;
-  private final QueryDocumentationExecutor docSearcher;
-  private final NotesMigration migration;
-  private final ProjectCache projectCache;
-  private final AgreementJson agreementJson;
-  private final GerritOptions gerritOptions;
-  private final ChangeIndexCollection indexes;
-  private final SitePaths sitePaths;
-
-  @Inject
-  public GetServerInfo(
-      @GerritServerConfig Config config,
-      AccountVisibilityProvider accountVisibilityProvider,
-      AuthConfig authConfig,
-      Realm realm,
-      DynamicMap<DownloadScheme> downloadSchemes,
-      DynamicMap<DownloadCommand> downloadCommands,
-      DynamicMap<CloneCommand> cloneCommands,
-      DynamicSet<WebUiPlugin> webUiPlugins,
-      AllowedFormats archiveFormats,
-      AllProjectsName allProjectsName,
-      AllUsersName allUsersName,
-      @AnonymousCowardName String anonymousCowardName,
-      DynamicItem<AvatarProvider> avatar,
-      @EnableSignedPush boolean enableSignedPush,
-      QueryDocumentationExecutor docSearcher,
-      NotesMigration migration,
-      ProjectCache projectCache,
-      AgreementJson agreementJson,
-      GerritOptions gerritOptions,
-      ChangeIndexCollection indexes,
-      SitePaths sitePaths) {
-    this.config = config;
-    this.accountVisibilityProvider = accountVisibilityProvider;
-    this.authConfig = authConfig;
-    this.realm = realm;
-    this.downloadSchemes = downloadSchemes;
-    this.downloadCommands = downloadCommands;
-    this.cloneCommands = cloneCommands;
-    this.plugins = webUiPlugins;
-    this.archiveFormats = archiveFormats;
-    this.allProjectsName = allProjectsName;
-    this.allUsersName = allUsersName;
-    this.anonymousCowardName = anonymousCowardName;
-    this.avatar = avatar;
-    this.enableSignedPush = enableSignedPush;
-    this.docSearcher = docSearcher;
-    this.migration = migration;
-    this.projectCache = projectCache;
-    this.agreementJson = agreementJson;
-    this.gerritOptions = gerritOptions;
-    this.indexes = indexes;
-    this.sitePaths = sitePaths;
-  }
-
-  @Override
-  public ServerInfo apply(ConfigResource rsrc) throws MalformedURLException {
-    ServerInfo info = new ServerInfo();
-    info.accounts = getAccountsInfo(accountVisibilityProvider);
-    info.auth = getAuthInfo(authConfig, realm);
-    info.change = getChangeInfo(config);
-    info.download =
-        getDownloadInfo(downloadSchemes, downloadCommands, cloneCommands, archiveFormats);
-    info.gerrit = getGerritInfo(config, allProjectsName, allUsersName);
-    info.noteDbEnabled = toBoolean(isNoteDbEnabled());
-    info.plugin = getPluginInfo();
-    if (Files.exists(sitePaths.site_theme)) {
-      info.defaultTheme = "/static/" + SitePaths.THEME_FILENAME;
-    }
-    info.sshd = getSshdInfo(config);
-    info.suggest = getSuggestInfo(config);
-
-    Map<String, String> urlAliases = getUrlAliasesInfo(config);
-    info.urlAliases = !urlAliases.isEmpty() ? urlAliases : null;
-
-    info.user = getUserInfo(anonymousCowardName);
-    info.receive = getReceiveInfo();
-    return info;
-  }
-
-  private AccountsInfo getAccountsInfo(AccountVisibilityProvider accountVisibilityProvider) {
-    AccountsInfo info = new AccountsInfo();
-    info.visibility = accountVisibilityProvider.get();
-    return info;
-  }
-
-  private AuthInfo getAuthInfo(AuthConfig cfg, Realm realm) {
-    AuthInfo info = new AuthInfo();
-    info.authType = cfg.getAuthType();
-    info.useContributorAgreements = toBoolean(cfg.isUseContributorAgreements());
-    info.editableAccountFields = new ArrayList<>(realm.getEditableFields());
-    info.switchAccountUrl = cfg.getSwitchAccountUrl();
-    info.gitBasicAuthPolicy = cfg.getGitBasicAuthPolicy();
-
-    if (info.useContributorAgreements != null) {
-      Collection<ContributorAgreement> agreements =
-          projectCache.getAllProjects().getConfig().getContributorAgreements();
-      if (!agreements.isEmpty()) {
-        info.contributorAgreements = Lists.newArrayListWithCapacity(agreements.size());
-        for (ContributorAgreement agreement : agreements) {
-          info.contributorAgreements.add(agreementJson.format(agreement));
-        }
-      }
-    }
-
-    switch (info.authType) {
-      case LDAP:
-      case LDAP_BIND:
-        info.registerUrl = cfg.getRegisterUrl();
-        info.registerText = cfg.getRegisterText();
-        info.editFullNameUrl = cfg.getEditFullNameUrl();
-        break;
-
-      case CUSTOM_EXTENSION:
-        info.registerUrl = cfg.getRegisterUrl();
-        info.registerText = cfg.getRegisterText();
-        info.editFullNameUrl = cfg.getEditFullNameUrl();
-        info.httpPasswordUrl = cfg.getHttpPasswordUrl();
-        break;
-
-      case HTTP:
-      case HTTP_LDAP:
-        info.loginUrl = cfg.getLoginUrl();
-        info.loginText = cfg.getLoginText();
-        break;
-
-      case CLIENT_SSL_CERT_LDAP:
-      case DEVELOPMENT_BECOME_ANY_ACCOUNT:
-      case OAUTH:
-      case OPENID:
-      case OPENID_SSO:
-        break;
-    }
-    return info;
-  }
-
-  private ChangeConfigInfo getChangeInfo(Config cfg) {
-    ChangeConfigInfo info = new ChangeConfigInfo();
-    info.allowBlame = toBoolean(cfg.getBoolean("change", "allowBlame", true));
-    boolean hasAssigneeInIndex =
-        indexes.getSearchIndex().getSchema().hasField(ChangeField.ASSIGNEE);
-    info.showAssigneeInChangesTable =
-        toBoolean(
-            cfg.getBoolean("change", "showAssigneeInChangesTable", false) && hasAssigneeInIndex);
-    info.largeChange = cfg.getInt("change", "largeChange", 500);
-    info.replyTooltip =
-        Optional.ofNullable(cfg.getString("change", null, "replyTooltip")).orElse("Reply and score")
-            + " (Shortcut: a)";
-    info.replyLabel =
-        Optional.ofNullable(cfg.getString("change", null, "replyLabel")).orElse("Reply") + "\u2026";
-    info.updateDelay =
-        (int) ConfigUtil.getTimeUnit(cfg, "change", null, "updateDelay", 300, TimeUnit.SECONDS);
-    info.submitWholeTopic = Submit.wholeTopicEnabled(cfg);
-    info.disablePrivateChanges =
-        toBoolean(config.getBoolean("change", null, "disablePrivateChanges", false));
-    return info;
-  }
-
-  private DownloadInfo getDownloadInfo(
-      DynamicMap<DownloadScheme> downloadSchemes,
-      DynamicMap<DownloadCommand> downloadCommands,
-      DynamicMap<CloneCommand> cloneCommands,
-      AllowedFormats archiveFormats) {
-    DownloadInfo info = new DownloadInfo();
-    info.schemes = new HashMap<>();
-    for (DynamicMap.Entry<DownloadScheme> e : downloadSchemes) {
-      DownloadScheme scheme = e.getProvider().get();
-      if (scheme.isEnabled() && scheme.getUrl("${project}") != null) {
-        info.schemes.put(
-            e.getExportName(), getDownloadSchemeInfo(scheme, downloadCommands, cloneCommands));
-      }
-    }
-    info.archives =
-        archiveFormats.getAllowed().stream().map(ArchiveFormat::getShortName).collect(toList());
-    return info;
-  }
-
-  private DownloadSchemeInfo getDownloadSchemeInfo(
-      DownloadScheme scheme,
-      DynamicMap<DownloadCommand> downloadCommands,
-      DynamicMap<CloneCommand> cloneCommands) {
-    DownloadSchemeInfo info = new DownloadSchemeInfo();
-    info.url = scheme.getUrl("${project}");
-    info.isAuthRequired = toBoolean(scheme.isAuthRequired());
-    info.isAuthSupported = toBoolean(scheme.isAuthSupported());
-
-    info.commands = new HashMap<>();
-    for (DynamicMap.Entry<DownloadCommand> e : downloadCommands) {
-      String commandName = e.getExportName();
-      DownloadCommand command = e.getProvider().get();
-      String c = command.getCommand(scheme, "${project}", "${ref}");
-      if (c != null) {
-        info.commands.put(commandName, c);
-      }
-    }
-
-    info.cloneCommands = new HashMap<>();
-    for (DynamicMap.Entry<CloneCommand> e : cloneCommands) {
-      String commandName = e.getExportName();
-      CloneCommand command = e.getProvider().get();
-      String c = command.getCommand(scheme, "${project-path}/${project-base-name}");
-      if (c != null) {
-        c = c.replaceAll("\\$\\{project-path\\}/\\$\\{project-base-name\\}", "\\$\\{project\\}");
-        info.cloneCommands.put(commandName, c);
-      }
-    }
-
-    return info;
-  }
-
-  private GerritInfo getGerritInfo(
-      Config cfg, AllProjectsName allProjectsName, AllUsersName allUsersName) {
-    GerritInfo info = new GerritInfo();
-    info.allProjects = allProjectsName.get();
-    info.allUsers = allUsersName.get();
-    info.reportBugUrl = cfg.getString("gerrit", null, "reportBugUrl");
-    info.reportBugText = cfg.getString("gerrit", null, "reportBugText");
-    info.docUrl = getDocUrl(cfg);
-    info.docSearch = docSearcher.isAvailable();
-    info.editGpgKeys =
-        toBoolean(enableSignedPush && cfg.getBoolean("gerrit", null, "editGpgKeys", true));
-    info.webUis = EnumSet.noneOf(UiType.class);
-    if (gerritOptions.enableGwtUi()) {
-      info.webUis.add(UiType.GWT);
-    }
-    if (gerritOptions.enablePolyGerrit()) {
-      info.webUis.add(UiType.POLYGERRIT);
-    }
-    return info;
-  }
-
-  private String getDocUrl(Config cfg) {
-    String docUrl = cfg.getString("gerrit", null, "docUrl");
-    if (Strings.isNullOrEmpty(docUrl)) {
-      return null;
-    }
-    return CharMatcher.is('/').trimTrailingFrom(docUrl) + '/';
-  }
-
-  private boolean isNoteDbEnabled() {
-    return migration.readChanges();
-  }
-
-  private PluginConfigInfo getPluginInfo() {
-    PluginConfigInfo info = new PluginConfigInfo();
-    info.hasAvatars = toBoolean(avatar.get() != null);
-    info.jsResourcePaths = new ArrayList<>();
-    info.htmlResourcePaths = new ArrayList<>();
-    for (WebUiPlugin u : plugins) {
-      String path =
-          String.format("plugins/%s/%s", u.getPluginName(), u.getJavaScriptResourcePath());
-      if (path.endsWith(".html")) {
-        info.htmlResourcePaths.add(path);
-      } else {
-        info.jsResourcePaths.add(path);
-      }
-    }
-    return info;
-  }
-
-  private Map<String, String> getUrlAliasesInfo(Config cfg) {
-    Map<String, String> urlAliases = new HashMap<>();
-    for (String subsection : cfg.getSubsections(URL_ALIAS)) {
-      urlAliases.put(
-          cfg.getString(URL_ALIAS, subsection, KEY_MATCH),
-          cfg.getString(URL_ALIAS, subsection, KEY_TOKEN));
-    }
-    return urlAliases;
-  }
-
-  private SshdInfo getSshdInfo(Config cfg) {
-    String[] addr = cfg.getStringList("sshd", null, "listenAddress");
-    if (addr.length == 1 && isOff(addr[0])) {
-      return null;
-    }
-    return new SshdInfo();
-  }
-
-  private static boolean isOff(String listenHostname) {
-    return "off".equalsIgnoreCase(listenHostname)
-        || "none".equalsIgnoreCase(listenHostname)
-        || "no".equalsIgnoreCase(listenHostname);
-  }
-
-  private SuggestInfo getSuggestInfo(Config cfg) {
-    SuggestInfo info = new SuggestInfo();
-    info.from = cfg.getInt("suggest", "from", 0);
-    return info;
-  }
-
-  private UserConfigInfo getUserInfo(String anonymousCowardName) {
-    UserConfigInfo info = new UserConfigInfo();
-    info.anonymousCowardName = anonymousCowardName;
-    return info;
-  }
-
-  private ReceiveInfo getReceiveInfo() {
-    ReceiveInfo info = new ReceiveInfo();
-    info.enableSignedPush = enableSignedPush;
-    return info;
-  }
-
-  private static Boolean toBoolean(boolean v) {
-    return v ? v : null;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GetSummary.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GetSummary.java
deleted file mode 100644
index 82912c0..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GetSummary.java
+++ /dev/null
@@ -1,279 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.config;
-
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.server.git.WorkQueue;
-import com.google.gerrit.server.git.WorkQueue.Task;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.lang.management.ManagementFactory;
-import java.lang.management.OperatingSystemMXBean;
-import java.lang.management.RuntimeMXBean;
-import java.lang.management.ThreadInfo;
-import java.lang.management.ThreadMXBean;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.eclipse.jgit.internal.storage.file.WindowCacheStatAccessor;
-import org.kohsuke.args4j.Option;
-
-@RequiresCapability(GlobalCapability.MAINTAIN_SERVER)
-public class GetSummary implements RestReadView<ConfigResource> {
-
-  private final WorkQueue workQueue;
-  private final Path sitePath;
-
-  @Option(name = "--gc", usage = "perform Java GC before retrieving memory stats")
-  private boolean gc;
-
-  public GetSummary setGc(boolean gc) {
-    this.gc = gc;
-    return this;
-  }
-
-  @Option(name = "--jvm", usage = "include details about the JVM")
-  private boolean jvm;
-
-  public GetSummary setJvm(boolean jvm) {
-    this.jvm = jvm;
-    return this;
-  }
-
-  @Inject
-  public GetSummary(WorkQueue workQueue, @SitePath Path sitePath) {
-    this.workQueue = workQueue;
-    this.sitePath = sitePath;
-  }
-
-  @Override
-  public SummaryInfo apply(ConfigResource rsrc) {
-    if (gc) {
-      System.gc();
-      System.runFinalization();
-      System.gc();
-    }
-
-    SummaryInfo summary = new SummaryInfo();
-    summary.taskSummary = getTaskSummary();
-    summary.memSummary = getMemSummary();
-    summary.threadSummary = getThreadSummary();
-    if (jvm) {
-      summary.jvmSummary = getJvmSummary();
-    }
-    return summary;
-  }
-
-  private TaskSummaryInfo getTaskSummary() {
-    Collection<Task<?>> pending = workQueue.getTasks();
-    int tasksTotal = pending.size();
-    int tasksRunning = 0;
-    int tasksReady = 0;
-    int tasksSleeping = 0;
-    for (Task<?> task : pending) {
-      switch (task.getState()) {
-        case RUNNING:
-          tasksRunning++;
-          break;
-        case READY:
-          tasksReady++;
-          break;
-        case SLEEPING:
-          tasksSleeping++;
-          break;
-        case CANCELLED:
-        case DONE:
-        case OTHER:
-          break;
-      }
-    }
-
-    TaskSummaryInfo taskSummary = new TaskSummaryInfo();
-    taskSummary.total = toInteger(tasksTotal);
-    taskSummary.running = toInteger(tasksRunning);
-    taskSummary.ready = toInteger(tasksReady);
-    taskSummary.sleeping = toInteger(tasksSleeping);
-    return taskSummary;
-  }
-
-  private MemSummaryInfo getMemSummary() {
-    Runtime r = Runtime.getRuntime();
-    long mMax = r.maxMemory();
-    long mFree = r.freeMemory();
-    long mTotal = r.totalMemory();
-    long mInuse = mTotal - mFree;
-
-    int jgitOpen = WindowCacheStatAccessor.getOpenFiles();
-    long jgitBytes = WindowCacheStatAccessor.getOpenBytes();
-
-    MemSummaryInfo memSummaryInfo = new MemSummaryInfo();
-    memSummaryInfo.total = bytes(mTotal);
-    memSummaryInfo.used = bytes(mInuse - jgitBytes);
-    memSummaryInfo.free = bytes(mFree);
-    memSummaryInfo.buffers = bytes(jgitBytes);
-    memSummaryInfo.max = bytes(mMax);
-    memSummaryInfo.openFiles = toInteger(jgitOpen);
-    return memSummaryInfo;
-  }
-
-  private ThreadSummaryInfo getThreadSummary() {
-    Runtime r = Runtime.getRuntime();
-    ThreadSummaryInfo threadInfo = new ThreadSummaryInfo();
-    threadInfo.cpus = r.availableProcessors();
-    threadInfo.threads = toInteger(ManagementFactory.getThreadMXBean().getThreadCount());
-
-    List<String> prefixes =
-        Arrays.asList(
-            "H2",
-            "HTTP",
-            "IntraLineDiff",
-            "ReceiveCommits",
-            "SSH git-receive-pack",
-            "SSH git-upload-pack",
-            "SSH-Interactive-Worker",
-            "SSH-Stream-Worker",
-            "SshCommandStart",
-            "sshd-SshServer");
-    String other = "Other";
-    ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
-
-    threadInfo.counts = new HashMap<>();
-    for (long id : threadMXBean.getAllThreadIds()) {
-      ThreadInfo info = threadMXBean.getThreadInfo(id);
-      if (info == null) {
-        continue;
-      }
-      String name = info.getThreadName();
-      Thread.State state = info.getThreadState();
-      String group = other;
-      for (String p : prefixes) {
-        if (name.startsWith(p)) {
-          group = p;
-          break;
-        }
-      }
-      Map<Thread.State, Integer> counts = threadInfo.counts.get(group);
-      if (counts == null) {
-        counts = new HashMap<>();
-        threadInfo.counts.put(group, counts);
-      }
-      Integer c = counts.get(state);
-      counts.put(state, c != null ? c + 1 : 1);
-    }
-
-    return threadInfo;
-  }
-
-  private JvmSummaryInfo getJvmSummary() {
-    OperatingSystemMXBean osBean = ManagementFactory.getOperatingSystemMXBean();
-    RuntimeMXBean runtimeBean = ManagementFactory.getRuntimeMXBean();
-
-    JvmSummaryInfo jvmSummary = new JvmSummaryInfo();
-    jvmSummary.vmVendor = runtimeBean.getVmVendor();
-    jvmSummary.vmName = runtimeBean.getVmName();
-    jvmSummary.vmVersion = runtimeBean.getVmVersion();
-    jvmSummary.osName = osBean.getName();
-    jvmSummary.osVersion = osBean.getVersion();
-    jvmSummary.osArch = osBean.getArch();
-    jvmSummary.user = System.getProperty("user.name");
-
-    try {
-      jvmSummary.host = InetAddress.getLocalHost().getHostName();
-    } catch (UnknownHostException e) {
-      // Ignored
-    }
-
-    jvmSummary.currentWorkingDirectory = path(Paths.get(".").toAbsolutePath().getParent());
-    jvmSummary.site = path(sitePath);
-    return jvmSummary;
-  }
-
-  private static Integer toInteger(int i) {
-    return i != 0 ? i : null;
-  }
-
-  private static String bytes(double value) {
-    value /= 1024;
-    String suffix = "k";
-
-    if (value > 1024) {
-      value /= 1024;
-      suffix = "m";
-    }
-    if (value > 1024) {
-      value /= 1024;
-      suffix = "g";
-    }
-    return String.format("%1$6.2f%2$s", value, suffix).trim();
-  }
-
-  private static String path(Path path) {
-    try {
-      return path.toRealPath().normalize().toString();
-    } catch (IOException err) {
-      return path.toAbsolutePath().normalize().toString();
-    }
-  }
-
-  public static class SummaryInfo {
-    public TaskSummaryInfo taskSummary;
-    public MemSummaryInfo memSummary;
-    public ThreadSummaryInfo threadSummary;
-    public JvmSummaryInfo jvmSummary;
-  }
-
-  public static class TaskSummaryInfo {
-    public Integer total;
-    public Integer running;
-    public Integer ready;
-    public Integer sleeping;
-  }
-
-  public static class MemSummaryInfo {
-    public String total;
-    public String used;
-    public String free;
-    public String buffers;
-    public String max;
-    public Integer openFiles;
-  }
-
-  public static class ThreadSummaryInfo {
-    public Integer cpus;
-    public Integer threads;
-    public Map<String, Map<Thread.State, Integer>> counts;
-  }
-
-  public static class JvmSummaryInfo {
-    public String vmVendor;
-    public String vmName;
-    public String vmVersion;
-    public String osName;
-    public String osVersion;
-    public String osArch;
-    public String user;
-    public String host;
-    public String currentWorkingDirectory;
-    public String site;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GetTask.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GetTask.java
deleted file mode 100644
index e4b3320..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GetTask.java
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.config;
-
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.server.config.ListTasks.TaskInfo;
-import com.google.inject.Singleton;
-
-@Singleton
-public class GetTask implements RestReadView<TaskResource> {
-
-  @Override
-  public TaskInfo apply(TaskResource rsrc) {
-    return new TaskInfo(rsrc.getTask());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GetVersion.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GetVersion.java
deleted file mode 100644
index c71cb69..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GetVersion.java
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.config;
-
-import com.google.gerrit.common.Version;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.inject.Singleton;
-
-@Singleton
-public class GetVersion implements RestReadView<ConfigResource> {
-  @Override
-  public String apply(ConfigResource resource) throws ResourceNotFoundException {
-    String version = Version.getVersion();
-    if (version == null) {
-      throw new ResourceNotFoundException();
-    }
-    return version;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GitwebCgiConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GitwebCgiConfig.java
deleted file mode 100644
index 153cddc..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GitwebCgiConfig.java
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.config;
-
-import static java.nio.file.Files.isExecutable;
-import static java.nio.file.Files.isRegularFile;
-
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class GitwebCgiConfig {
-  private static final Logger log = LoggerFactory.getLogger(GitwebCgiConfig.class);
-
-  public GitwebCgiConfig disabled() {
-    return new GitwebCgiConfig();
-  }
-
-  private final Path cgi;
-  private final Path css;
-  private final Path js;
-  private final Path logoPng;
-
-  @Inject
-  GitwebCgiConfig(SitePaths sitePaths, @GerritServerConfig Config cfg) {
-    if (GitwebConfig.isDisabled(cfg)) {
-      cgi = null;
-      css = null;
-      js = null;
-      logoPng = null;
-      return;
-    }
-
-    String cfgCgi = cfg.getString("gitweb", null, "cgi");
-    Path pkgCgi = Paths.get("/usr/lib/cgi-bin/gitweb.cgi");
-    String[] resourcePaths = {
-      "/usr/share/gitweb/static", "/usr/share/gitweb", "/var/www/static", "/var/www",
-    };
-    Path cgi;
-
-    if (cfgCgi != null) {
-      // Use the CGI script configured by the administrator, failing if it
-      // cannot be used as specified.
-      //
-      cgi = sitePaths.resolve(cfgCgi);
-      if (!isRegularFile(cgi)) {
-        throw new IllegalStateException("Cannot find gitweb.cgi: " + cgi);
-      }
-      if (!isExecutable(cgi)) {
-        throw new IllegalStateException("Cannot execute gitweb.cgi: " + cgi);
-      }
-
-      if (!cgi.equals(pkgCgi)) {
-        // Assume the administrator pointed us to the distribution,
-        // which also has the corresponding CSS and logo file.
-        //
-        String absPath = cgi.getParent().toAbsolutePath().toString();
-        resourcePaths = new String[] {absPath + "/static", absPath};
-      }
-
-    } else if (cfg.getString("gitweb", null, "url") != null) {
-      // Use an externally managed gitweb instance, and not an internal one.
-      //
-      cgi = null;
-      resourcePaths = new String[] {};
-
-    } else if (isRegularFile(pkgCgi) && isExecutable(pkgCgi)) {
-      // Use the OS packaged CGI.
-      //
-      log.debug("Assuming gitweb at " + pkgCgi);
-      cgi = pkgCgi;
-
-    } else {
-      log.warn("gitweb not installed (no " + pkgCgi + " found)");
-      cgi = null;
-      resourcePaths = new String[] {};
-    }
-
-    Path css = null;
-    Path js = null;
-    Path logo = null;
-    for (String path : resourcePaths) {
-      Path dir = Paths.get(path);
-      css = dir.resolve("gitweb.css");
-      js = dir.resolve("gitweb.js");
-      logo = dir.resolve("git-logo.png");
-      if (isRegularFile(css) && isRegularFile(logo)) {
-        break;
-      }
-    }
-
-    this.cgi = cgi;
-    this.css = css;
-    this.js = js;
-    this.logoPng = logo;
-  }
-
-  private GitwebCgiConfig() {
-    this.cgi = null;
-    this.css = null;
-    this.js = null;
-    this.logoPng = null;
-  }
-
-  /** @return local path to the CGI executable; null if we shouldn't execute. */
-  public Path getGitwebCgi() {
-    return cgi;
-  }
-
-  /** @return local path of the {@code gitweb.css} matching the CGI. */
-  public Path getGitwebCss() {
-    return css;
-  }
-
-  /** @return local path of the {@code gitweb.js} for the CGI. */
-  public Path getGitwebJs() {
-    return js;
-  }
-
-  /** @return local path of the {@code git-logo.png} for the CGI. */
-  public Path getGitLogoPng() {
-    return logoPng;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GitwebConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GitwebConfig.java
deleted file mode 100644
index 91eaf3c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GitwebConfig.java
+++ /dev/null
@@ -1,374 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.config;
-
-import static com.google.common.base.MoreObjects.firstNonNull;
-import static com.google.common.base.Strings.emptyToNull;
-import static com.google.common.base.Strings.isNullOrEmpty;
-import static com.google.common.base.Strings.nullToEmpty;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.data.GitwebType;
-import com.google.gerrit.common.data.ParameterizedString;
-import com.google.gerrit.extensions.common.WebLinkInfo;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.restapi.Url;
-import com.google.gerrit.extensions.webui.BranchWebLink;
-import com.google.gerrit.extensions.webui.FileHistoryWebLink;
-import com.google.gerrit.extensions.webui.FileWebLink;
-import com.google.gerrit.extensions.webui.ParentWebLink;
-import com.google.gerrit.extensions.webui.PatchSetWebLink;
-import com.google.gerrit.extensions.webui.ProjectWebLink;
-import com.google.gerrit.extensions.webui.TagWebLink;
-import com.google.inject.AbstractModule;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.net.MalformedURLException;
-import java.net.URL;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class GitwebConfig {
-  private static final Logger log = LoggerFactory.getLogger(GitwebConfig.class);
-
-  public static boolean isDisabled(Config cfg) {
-    return isEmptyString(cfg, "gitweb", null, "url")
-        || isEmptyString(cfg, "gitweb", null, "cgi")
-        || "disabled".equals(cfg.getString("gitweb", null, "type"));
-  }
-
-  public static class LegacyModule extends AbstractModule {
-    private final Config cfg;
-
-    public LegacyModule(Config cfg) {
-      this.cfg = cfg;
-    }
-
-    @Override
-    protected void configure() {
-      GitwebType type = typeFromConfig(cfg);
-      if (type != null) {
-        bind(GitwebType.class).toInstance(type);
-
-        if (!isNullOrEmpty(type.getBranch())) {
-          DynamicSet.bind(binder(), BranchWebLink.class).to(GitwebLinks.class);
-        }
-
-        if (!isNullOrEmpty(type.getTag())) {
-          DynamicSet.bind(binder(), TagWebLink.class).to(GitwebLinks.class);
-        }
-
-        if (!isNullOrEmpty(type.getFile()) || !isNullOrEmpty(type.getRootTree())) {
-          DynamicSet.bind(binder(), FileWebLink.class).to(GitwebLinks.class);
-        }
-
-        if (!isNullOrEmpty(type.getFileHistory())) {
-          DynamicSet.bind(binder(), FileHistoryWebLink.class).to(GitwebLinks.class);
-        }
-
-        if (!isNullOrEmpty(type.getRevision())) {
-          DynamicSet.bind(binder(), PatchSetWebLink.class).to(GitwebLinks.class);
-          DynamicSet.bind(binder(), ParentWebLink.class).to(GitwebLinks.class);
-        }
-
-        if (!isNullOrEmpty(type.getProject())) {
-          DynamicSet.bind(binder(), ProjectWebLink.class).to(GitwebLinks.class);
-        }
-      }
-    }
-  }
-
-  private static boolean isEmptyString(Config cfg, String section, String subsection, String name) {
-    // This is currently the only way to check for the empty string in a JGit
-    // config. Fun!
-    String[] values = cfg.getStringList(section, subsection, name);
-    return values.length > 0 && isNullOrEmpty(values[0]);
-  }
-
-  private static GitwebType typeFromConfig(Config cfg) {
-    GitwebType defaultType = defaultType(cfg.getString("gitweb", null, "type"));
-    if (defaultType == null) {
-      return null;
-    }
-    GitwebType type = new GitwebType();
-
-    type.setLinkName(
-        firstNonNull(cfg.getString("gitweb", null, "linkname"), defaultType.getLinkName()));
-    type.setBranch(firstNonNull(cfg.getString("gitweb", null, "branch"), defaultType.getBranch()));
-    type.setTag(firstNonNull(cfg.getString("gitweb", null, "tag"), defaultType.getTag()));
-    type.setProject(
-        firstNonNull(cfg.getString("gitweb", null, "project"), defaultType.getProject()));
-    type.setRevision(
-        firstNonNull(cfg.getString("gitweb", null, "revision"), defaultType.getRevision()));
-    type.setRootTree(
-        firstNonNull(cfg.getString("gitweb", null, "roottree"), defaultType.getRootTree()));
-    type.setFile(firstNonNull(cfg.getString("gitweb", null, "file"), defaultType.getFile()));
-    type.setFileHistory(
-        firstNonNull(cfg.getString("gitweb", null, "filehistory"), defaultType.getFileHistory()));
-    type.setUrlEncode(cfg.getBoolean("gitweb", null, "urlencode", defaultType.getUrlEncode()));
-    String pathSeparator = cfg.getString("gitweb", null, "pathSeparator");
-    if (pathSeparator != null) {
-      if (pathSeparator.length() == 1) {
-        char c = pathSeparator.charAt(0);
-        if (isValidPathSeparator(c)) {
-          type.setPathSeparator(firstNonNull(c, defaultType.getPathSeparator()));
-        } else {
-          log.warn("Invalid gitweb.pathSeparator: " + c);
-        }
-      } else {
-        log.warn("gitweb.pathSeparator is not a single character: " + pathSeparator);
-      }
-    }
-    return type;
-  }
-
-  private static GitwebType defaultType(String typeName) {
-    GitwebType type = new GitwebType();
-    switch (nullToEmpty(typeName)) {
-      case "gitweb":
-        type.setLinkName("gitweb");
-        type.setProject("?p=${project}.git;a=summary");
-        type.setRevision("?p=${project}.git;a=commit;h=${commit}");
-        type.setBranch("?p=${project}.git;a=shortlog;h=${branch}");
-        type.setTag("?p=${project}.git;a=tag;h=${tag}");
-        type.setRootTree("?p=${project}.git;a=tree;hb=${commit}");
-        type.setFile("?p=${project}.git;hb=${commit};f=${file}");
-        type.setFileHistory("?p=${project}.git;a=history;hb=${branch};f=${file}");
-        break;
-      case "cgit":
-        type.setLinkName("cgit");
-        type.setProject("${project}.git/summary");
-        type.setRevision("${project}.git/commit/?id=${commit}");
-        type.setBranch("${project}.git/log/?h=${branch}");
-        type.setTag("${project}.git/tag/?h=${tag}");
-        type.setRootTree("${project}.git/tree/?h=${commit}");
-        type.setFile("${project}.git/tree/${file}?h=${commit}");
-        type.setFileHistory("${project}.git/log/${file}?h=${branch}");
-        break;
-      case "custom":
-        // For a custom type with no explicit link name, just reuse "gitweb".
-        type.setLinkName("gitweb");
-        type.setProject("");
-        type.setRevision("");
-        type.setBranch("");
-        type.setTag("");
-        type.setRootTree("");
-        type.setFile("");
-        type.setFileHistory("");
-        break;
-      case "":
-      case "disabled":
-      default:
-        return null;
-    }
-    return type;
-  }
-
-  private final String url;
-  private final GitwebType type;
-
-  @Inject
-  GitwebConfig(
-      GitwebCgiConfig cgiConfig,
-      @GerritServerConfig Config cfg,
-      @Nullable @CanonicalWebUrl String gerritUrl)
-      throws MalformedURLException {
-    if (isDisabled(cfg)) {
-      type = null;
-      url = null;
-    } else {
-      String cfgUrl = cfg.getString("gitweb", null, "url");
-      type = typeFromConfig(cfg);
-      if (type == null) {
-        url = null;
-      } else if (cgiConfig.getGitwebCgi() == null) {
-        // Use an externally managed gitweb instance, and not an internal one.
-        url = cfgUrl;
-      } else {
-        String baseGerritUrl;
-        if (gerritUrl != null) {
-          URL u = new URL(gerritUrl);
-          baseGerritUrl = u.getPath();
-        } else {
-          baseGerritUrl = "/";
-        }
-        url = firstNonNull(cfgUrl, baseGerritUrl + "gitweb");
-      }
-    }
-  }
-
-  /** @return GitwebType for gitweb viewer. */
-  @Nullable
-  public GitwebType getGitwebType() {
-    return type;
-  }
-
-  /**
-   * @return URL of the entry point into gitweb. This URL may be relative to our context if gitweb
-   *     is hosted by ourselves; or absolute if its hosted elsewhere; or null if gitweb has not been
-   *     configured.
-   */
-  public String getUrl() {
-    return url;
-  }
-
-  /**
-   * Determines if a given character can be used unencoded in an URL as a replacement for the path
-   * separator '/'.
-   *
-   * <p>Reasoning: http://www.ietf.org/rfc/rfc1738.txt § 2.2:
-   *
-   * <p>... only alphanumerics, the special characters "$-_.+!*'(),", and reserved characters used
-   * for their reserved purposes may be used unencoded within a URL.
-   *
-   * <p>The following characters might occur in file names, however:
-   *
-   * <p>alphanumeric characters,
-   *
-   * <p>"$-_.+!',"
-   */
-  static boolean isValidPathSeparator(char c) {
-    switch (c) {
-      case '*':
-      case '(':
-      case ')':
-        return true;
-      default:
-        return false;
-    }
-  }
-
-  @Singleton
-  static class GitwebLinks
-      implements BranchWebLink,
-          FileHistoryWebLink,
-          FileWebLink,
-          PatchSetWebLink,
-          ParentWebLink,
-          ProjectWebLink,
-          TagWebLink {
-    private final String url;
-    private final GitwebType type;
-    private final ParameterizedString branch;
-    private final ParameterizedString file;
-    private final ParameterizedString fileHistory;
-    private final ParameterizedString project;
-    private final ParameterizedString revision;
-    private final ParameterizedString tag;
-
-    @Inject
-    GitwebLinks(GitwebConfig config, GitwebType type) {
-      this.url = config.getUrl();
-      this.type = type;
-      this.branch = parse(type.getBranch());
-      this.file = parse(firstNonNull(emptyToNull(type.getFile()), nullToEmpty(type.getRootTree())));
-      this.fileHistory = parse(type.getFileHistory());
-      this.project = parse(type.getProject());
-      this.revision = parse(type.getRevision());
-      this.tag = parse(type.getTag());
-    }
-
-    @Override
-    public WebLinkInfo getBranchWebLink(String projectName, String branchName) {
-      if (branch != null) {
-        return link(
-            branch
-                .replace("project", encode(projectName))
-                .replace("branch", encode(branchName))
-                .toString());
-      }
-      return null;
-    }
-
-    @Override
-    public WebLinkInfo getTagWebLink(String projectName, String tagName) {
-      if (tag != null) {
-        return link(
-            tag.replace("project", encode(projectName)).replace("tag", encode(tagName)).toString());
-      }
-      return null;
-    }
-
-    @Override
-    public WebLinkInfo getFileHistoryWebLink(String projectName, String revision, String fileName) {
-      if (fileHistory != null) {
-        return link(
-            fileHistory
-                .replace("project", encode(projectName))
-                .replace("branch", encode(revision))
-                .replace("file", encode(fileName))
-                .toString());
-      }
-      return null;
-    }
-
-    @Override
-    public WebLinkInfo getFileWebLink(String projectName, String revision, String fileName) {
-      if (file != null) {
-        return link(
-            file.replace("project", encode(projectName))
-                .replace("commit", encode(revision))
-                .replace("file", encode(fileName))
-                .toString());
-      }
-      return null;
-    }
-
-    @Override
-    public WebLinkInfo getPatchSetWebLink(String projectName, String commit) {
-      if (revision != null) {
-        return link(
-            revision
-                .replace("project", encode(projectName))
-                .replace("commit", encode(commit))
-                .toString());
-      }
-      return null;
-    }
-
-    @Override
-    public WebLinkInfo getParentWebLink(String projectName, String commit) {
-      // For Gitweb treat parent revision links the same as patch set links
-      return getPatchSetWebLink(projectName, commit);
-    }
-
-    @Override
-    public WebLinkInfo getProjectWeblink(String projectName) {
-      if (project != null) {
-        return link(project.replace("project", encode(projectName)).toString());
-      }
-      return null;
-    }
-
-    private String encode(String val) {
-      if (type.getUrlEncode()) {
-        return Url.encode(type.replacePathSeparator(val));
-      }
-      return val;
-    }
-
-    private WebLinkInfo link(String rest) {
-      return new WebLinkInfo(type.getLinkName(), null, url + rest, null);
-    }
-
-    private static ParameterizedString parse(String pattern) {
-      if (!isNullOrEmpty(pattern)) {
-        return new ParameterizedString(pattern);
-      }
-      return null;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GroupSetProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GroupSetProvider.java
deleted file mode 100644
index a8c1674..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GroupSetProvider.java
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.server.config;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.GroupBackends;
-import com.google.gerrit.server.util.RequestContext;
-import com.google.gerrit.server.util.ServerRequestContext;
-import com.google.gerrit.server.util.ThreadLocalRequestContext;
-import com.google.inject.Provider;
-import java.util.List;
-import java.util.Set;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Parses groups referenced in the {@code gerrit.config} file. */
-public abstract class GroupSetProvider implements Provider<Set<AccountGroup.UUID>> {
-
-  protected Set<AccountGroup.UUID> groupIds;
-
-  protected GroupSetProvider(
-      GroupBackend groupBackend,
-      ThreadLocalRequestContext threadContext,
-      ServerRequestContext serverCtx,
-      List<String> groupNames) {
-    RequestContext ctx = threadContext.setContext(serverCtx);
-    try {
-      ImmutableSet.Builder<AccountGroup.UUID> builder = ImmutableSet.builder();
-      for (String n : groupNames) {
-        GroupReference g = GroupBackends.findBestSuggestion(groupBackend, n);
-        if (g != null) {
-          builder.add(g.getUUID());
-        } else {
-          Logger log = LoggerFactory.getLogger(getClass());
-          log.warn("Group \"{}\" not available, skipping.", n);
-        }
-      }
-      groupIds = builder.build();
-    } finally {
-      threadContext.setContext(ctx);
-    }
-  }
-
-  @Override
-  public Set<AccountGroup.UUID> get() {
-    return groupIds;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/ListCaches.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/ListCaches.java
deleted file mode 100644
index d78f61d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/ListCaches.java
+++ /dev/null
@@ -1,202 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.config;
-
-import static com.google.gerrit.common.data.GlobalCapability.MAINTAIN_SERVER;
-import static com.google.gerrit.common.data.GlobalCapability.VIEW_CACHES;
-import static com.google.gerrit.server.config.CacheResource.cacheNameOf;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.base.Joiner;
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheStats;
-import com.google.gerrit.extensions.annotations.RequiresAnyCapability;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.BinaryResult;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.server.cache.PersistentCache;
-import com.google.inject.Inject;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-import org.kohsuke.args4j.Option;
-
-@RequiresAnyCapability({VIEW_CACHES, MAINTAIN_SERVER})
-public class ListCaches implements RestReadView<ConfigResource> {
-  private final DynamicMap<Cache<?, ?>> cacheMap;
-
-  public enum OutputFormat {
-    LIST,
-    TEXT_LIST
-  }
-
-  @Option(name = "--format", usage = "output format")
-  private OutputFormat format;
-
-  public ListCaches setFormat(OutputFormat format) {
-    this.format = format;
-    return this;
-  }
-
-  @Inject
-  public ListCaches(DynamicMap<Cache<?, ?>> cacheMap) {
-    this.cacheMap = cacheMap;
-  }
-
-  public Map<String, CacheInfo> getCacheInfos() {
-    Map<String, CacheInfo> cacheInfos = new TreeMap<>();
-    for (DynamicMap.Entry<Cache<?, ?>> e : cacheMap) {
-      cacheInfos.put(
-          cacheNameOf(e.getPluginName(), e.getExportName()), new CacheInfo(e.getProvider().get()));
-    }
-    return cacheInfos;
-  }
-
-  @Override
-  public Object apply(ConfigResource rsrc) {
-    if (format == null) {
-      return getCacheInfos();
-    }
-    List<String> cacheNames = new ArrayList<>();
-    for (DynamicMap.Entry<Cache<?, ?>> e : cacheMap) {
-      cacheNames.add(cacheNameOf(e.getPluginName(), e.getExportName()));
-    }
-    Collections.sort(cacheNames);
-
-    if (OutputFormat.TEXT_LIST.equals(format)) {
-      return BinaryResult.create(Joiner.on('\n').join(cacheNames))
-          .base64()
-          .setContentType("text/plain")
-          .setCharacterEncoding(UTF_8);
-    }
-    return cacheNames;
-  }
-
-  public enum CacheType {
-    MEM,
-    DISK
-  }
-
-  public static class CacheInfo {
-    public String name;
-    public CacheType type;
-    public EntriesInfo entries;
-    public String averageGet;
-    public HitRatioInfo hitRatio;
-
-    public CacheInfo(Cache<?, ?> cache) {
-      this(null, cache);
-    }
-
-    public CacheInfo(String name, Cache<?, ?> cache) {
-      this.name = name;
-
-      CacheStats stat = cache.stats();
-
-      entries = new EntriesInfo();
-      entries.setMem(cache.size());
-
-      averageGet = duration(stat.averageLoadPenalty());
-
-      hitRatio = new HitRatioInfo();
-      hitRatio.setMem(stat.hitCount(), stat.requestCount());
-
-      if (cache instanceof PersistentCache) {
-        type = CacheType.DISK;
-        PersistentCache.DiskStats diskStats = ((PersistentCache) cache).diskStats();
-        entries.setDisk(diskStats.size());
-        entries.setSpace(diskStats.space());
-        hitRatio.setDisk(diskStats.hitCount(), diskStats.requestCount());
-      } else {
-        type = CacheType.MEM;
-      }
-    }
-
-    private static String duration(double ns) {
-      if (ns < 0.5) {
-        return null;
-      }
-      String suffix = "ns";
-      if (ns >= 1000.0) {
-        ns /= 1000.0;
-        suffix = "us";
-      }
-      if (ns >= 1000.0) {
-        ns /= 1000.0;
-        suffix = "ms";
-      }
-      if (ns >= 1000.0) {
-        ns /= 1000.0;
-        suffix = "s";
-      }
-      return String.format("%4.1f%s", ns, suffix).trim();
-    }
-  }
-
-  public static class EntriesInfo {
-    public Long mem;
-    public Long disk;
-    public String space;
-
-    public void setMem(long mem) {
-      this.mem = mem != 0 ? mem : null;
-    }
-
-    public void setDisk(long disk) {
-      this.disk = disk != 0 ? disk : null;
-    }
-
-    public void setSpace(double value) {
-      space = bytes(value);
-    }
-
-    private static String bytes(double value) {
-      value /= 1024;
-      String suffix = "k";
-
-      if (value > 1024) {
-        value /= 1024;
-        suffix = "m";
-      }
-      if (value > 1024) {
-        value /= 1024;
-        suffix = "g";
-      }
-      return String.format("%1$6.2f%2$s", value, suffix).trim();
-    }
-  }
-
-  public static class HitRatioInfo {
-    public Integer mem;
-    public Integer disk;
-
-    public void setMem(long value, long total) {
-      mem = percent(value, total);
-    }
-
-    public void setDisk(long value, long total) {
-      disk = percent(value, total);
-    }
-
-    private static Integer percent(long value, long total) {
-      if (total <= 0) {
-        return null;
-      }
-      return (int) ((100 * value) / total);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/ListCapabilities.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/ListCapabilities.java
deleted file mode 100644
index b8d1888..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/ListCapabilities.java
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.config;
-
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.extensions.config.CapabilityDefinition;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.Map;
-import java.util.TreeMap;
-import java.util.regex.Pattern;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** List capabilities visible to the calling user. */
-@Singleton
-public class ListCapabilities implements RestReadView<ConfigResource> {
-  private static final Logger log = LoggerFactory.getLogger(ListCapabilities.class);
-  private static final Pattern PLUGIN_NAME_PATTERN = Pattern.compile("^[a-zA-Z0-9-]+$");
-
-  private final DynamicMap<CapabilityDefinition> pluginCapabilities;
-
-  @Inject
-  public ListCapabilities(DynamicMap<CapabilityDefinition> pluginCapabilities) {
-    this.pluginCapabilities = pluginCapabilities;
-  }
-
-  @Override
-  public Map<String, CapabilityInfo> apply(ConfigResource resource)
-      throws IllegalAccessException, NoSuchFieldException {
-    Map<String, CapabilityInfo> output = new TreeMap<>();
-    collectCoreCapabilities(output);
-    collectPluginCapabilities(output);
-    return output;
-  }
-
-  private void collectCoreCapabilities(Map<String, CapabilityInfo> output)
-      throws IllegalAccessException, NoSuchFieldException {
-    Class<? extends CapabilityConstants> bundleClass = CapabilityConstants.get().getClass();
-    CapabilityConstants c = CapabilityConstants.get();
-    for (String id : GlobalCapability.getAllNames()) {
-      String name = (String) bundleClass.getField(id).get(c);
-      output.put(id, new CapabilityInfo(id, name));
-    }
-  }
-
-  private void collectPluginCapabilities(Map<String, CapabilityInfo> output) {
-    for (String pluginName : pluginCapabilities.plugins()) {
-      if (!PLUGIN_NAME_PATTERN.matcher(pluginName).matches()) {
-        log.warn(
-            "Plugin name '{}' must match '{}' to use capabilities; rename the plugin",
-            pluginName,
-            PLUGIN_NAME_PATTERN.pattern());
-        continue;
-      }
-      for (Map.Entry<String, Provider<CapabilityDefinition>> entry :
-          pluginCapabilities.byPlugin(pluginName).entrySet()) {
-        String id = String.format("%s-%s", pluginName, entry.getKey());
-        output.put(id, new CapabilityInfo(id, entry.getValue().get().getDescription()));
-      }
-    }
-  }
-
-  public static class CapabilityInfo {
-    public String id;
-    public String name;
-
-    public CapabilityInfo(String id, String name) {
-      this.id = id;
-      this.name = name;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/ListTasks.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/ListTasks.java
deleted file mode 100644
index bbda9eb..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/ListTasks.java
+++ /dev/null
@@ -1,150 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.config;
-
-import com.google.common.collect.ComparisonChain;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.git.TaskInfoFactory;
-import com.google.gerrit.server.git.WorkQueue;
-import com.google.gerrit.server.git.WorkQueue.ProjectTask;
-import com.google.gerrit.server.git.WorkQueue.Task;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.ProjectPermission;
-import com.google.gerrit.server.util.IdGenerator;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
-@Singleton
-public class ListTasks implements RestReadView<ConfigResource> {
-  private final PermissionBackend permissionBackend;
-  private final WorkQueue workQueue;
-  private final Provider<CurrentUser> self;
-
-  @Inject
-  public ListTasks(
-      PermissionBackend permissionBackend, WorkQueue workQueue, Provider<CurrentUser> self) {
-    this.permissionBackend = permissionBackend;
-    this.workQueue = workQueue;
-    this.self = self;
-  }
-
-  @Override
-  public List<TaskInfo> apply(ConfigResource resource)
-      throws AuthException, PermissionBackendException {
-    CurrentUser user = self.get();
-    if (!user.isIdentifiedUser()) {
-      throw new AuthException("Authentication required");
-    }
-
-    List<TaskInfo> allTasks = getTasks();
-    try {
-      permissionBackend.user(user).check(GlobalPermission.VIEW_QUEUE);
-      return allTasks;
-    } catch (AuthException e) {
-      // Fall through to filter tasks.
-    }
-
-    Map<String, Boolean> visibilityCache = new HashMap<>();
-    List<TaskInfo> visibleTasks = new ArrayList<>();
-    for (TaskInfo task : allTasks) {
-      if (task.projectName != null) {
-        Boolean visible = visibilityCache.get(task.projectName);
-        if (visible == null) {
-          try {
-            permissionBackend
-                .user(user)
-                .project(new Project.NameKey(task.projectName))
-                .check(ProjectPermission.ACCESS);
-            visible = true;
-          } catch (AuthException e) {
-            visible = false;
-          }
-          visibilityCache.put(task.projectName, visible);
-        }
-        if (visible) {
-          visibleTasks.add(task);
-        }
-      }
-    }
-    return visibleTasks;
-  }
-
-  private List<TaskInfo> getTasks() {
-    List<TaskInfo> taskInfos =
-        workQueue.getTaskInfos(
-            new TaskInfoFactory<TaskInfo>() {
-              @Override
-              public TaskInfo getTaskInfo(Task<?> task) {
-                return new TaskInfo(task);
-              }
-            });
-    Collections.sort(
-        taskInfos,
-        new Comparator<TaskInfo>() {
-          @Override
-          public int compare(TaskInfo a, TaskInfo b) {
-            return ComparisonChain.start()
-                .compare(a.state.ordinal(), b.state.ordinal())
-                .compare(a.delay, b.delay)
-                .compare(a.command, b.command)
-                .result();
-          }
-        });
-    return taskInfos;
-  }
-
-  public static class TaskInfo {
-    public String id;
-    public Task.State state;
-    public Timestamp startTime;
-    public long delay;
-    public String command;
-    public String remoteName;
-    public String projectName;
-    public String queueName;
-
-    public TaskInfo(Task<?> task) {
-      this.id = IdGenerator.format(task.getTaskId());
-      this.state = task.getState();
-      this.startTime = new Timestamp(task.getStartTime().getTime());
-      this.delay = task.getDelay(TimeUnit.MILLISECONDS);
-      this.command = task.toString();
-      this.queueName = task.getQueueName();
-
-      if (task instanceof ProjectTask) {
-        ProjectTask<?> projectTask = ((ProjectTask<?>) task);
-        Project.NameKey name = projectTask.getProjectNameKey();
-        if (name != null) {
-          this.projectName = name.get();
-        }
-        this.remoteName = projectTask.getRemoteName();
-      }
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/ListTopMenus.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/ListTopMenus.java
deleted file mode 100644
index a7ba938..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/ListTopMenus.java
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.config;
-
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.extensions.webui.TopMenu;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.ArrayList;
-import java.util.List;
-
-@Singleton
-class ListTopMenus implements RestReadView<ConfigResource> {
-  private final DynamicSet<TopMenu> extensions;
-
-  @Inject
-  ListTopMenus(DynamicSet<TopMenu> extensions) {
-    this.extensions = extensions;
-  }
-
-  @Override
-  public List<TopMenu.MenuEntry> apply(ConfigResource resource) {
-    List<TopMenu.MenuEntry> entries = new ArrayList<>();
-    for (TopMenu extension : extensions) {
-      entries.addAll(extension.getEntries());
-    }
-    return entries;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/Module.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/Module.java
deleted file mode 100644
index 7bf5ad5..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/Module.java
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.config;
-
-import static com.google.gerrit.server.config.CapabilityResource.CAPABILITY_KIND;
-import static com.google.gerrit.server.config.ConfigResource.CONFIG_KIND;
-import static com.google.gerrit.server.config.TaskResource.TASK_KIND;
-import static com.google.gerrit.server.config.TopMenuResource.TOP_MENU_KIND;
-
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.RestApiModule;
-
-public class Module extends RestApiModule {
-  @Override
-  protected void configure() {
-    DynamicMap.mapOf(binder(), CAPABILITY_KIND);
-    DynamicMap.mapOf(binder(), CONFIG_KIND);
-    DynamicMap.mapOf(binder(), TASK_KIND);
-    DynamicMap.mapOf(binder(), TOP_MENU_KIND);
-    child(CONFIG_KIND, "capabilities").to(CapabilitiesCollection.class);
-    child(CONFIG_KIND, "tasks").to(TasksCollection.class);
-    get(TASK_KIND).to(GetTask.class);
-    delete(TASK_KIND).to(DeleteTask.class);
-    child(CONFIG_KIND, "top-menus").to(TopMenuCollection.class);
-    get(CONFIG_KIND, "version").to(GetVersion.class);
-    get(CONFIG_KIND, "info").to(GetServerInfo.class);
-    post(CONFIG_KIND, "check.consistency").to(CheckConsistency.class);
-    get(CONFIG_KIND, "preferences").to(GetPreferences.class);
-    put(CONFIG_KIND, "preferences").to(SetPreferences.class);
-    get(CONFIG_KIND, "preferences.diff").to(GetDiffPreferences.class);
-    put(CONFIG_KIND, "preferences.diff").to(SetDiffPreferences.class);
-    put(CONFIG_KIND, "email.confirm").to(ConfirmEmail.class);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/PluginConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/PluginConfig.java
deleted file mode 100644
index fd1a12c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/PluginConfig.java
+++ /dev/null
@@ -1,170 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.config;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Strings;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.project.ProjectState;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.Config;
-
-public class PluginConfig {
-  private static final String PLUGIN = "plugin";
-
-  private final String pluginName;
-  private Config cfg;
-  private final ProjectConfig projectConfig;
-
-  public PluginConfig(String pluginName, Config cfg) {
-    this(pluginName, cfg, null);
-  }
-
-  public PluginConfig(String pluginName, Config cfg, ProjectConfig projectConfig) {
-    this.pluginName = pluginName;
-    this.cfg = cfg;
-    this.projectConfig = projectConfig;
-  }
-
-  PluginConfig withInheritance(ProjectState.Factory projectStateFactory) {
-    if (projectConfig == null) {
-      return this;
-    }
-
-    ProjectState state = projectStateFactory.create(projectConfig);
-    ProjectState parent = Iterables.getFirst(state.parents(), null);
-    if (parent != null) {
-      PluginConfig parentPluginConfig =
-          parent.getConfig().getPluginConfig(pluginName).withInheritance(projectStateFactory);
-      Set<String> allNames = cfg.getNames(PLUGIN, pluginName);
-      cfg = copyConfig(cfg);
-      for (String name : parentPluginConfig.cfg.getNames(PLUGIN, pluginName)) {
-        if (!allNames.contains(name)) {
-          List<String> values =
-              Arrays.asList(parentPluginConfig.cfg.getStringList(PLUGIN, pluginName, name));
-          for (String value : values) {
-            GroupReference groupRef =
-                parentPluginConfig.projectConfig.getGroup(GroupReference.extractGroupName(value));
-            if (groupRef != null) {
-              projectConfig.resolve(groupRef);
-            }
-          }
-          cfg.setStringList(PLUGIN, pluginName, name, values);
-        }
-      }
-    }
-    return this;
-  }
-
-  private static Config copyConfig(Config cfg) {
-    Config copiedCfg = new Config();
-    try {
-      copiedCfg.fromText(cfg.toText());
-    } catch (ConfigInvalidException e) {
-      // cannot happen
-      throw new IllegalStateException(e);
-    }
-    return copiedCfg;
-  }
-
-  public String getString(String name) {
-    return cfg.getString(PLUGIN, pluginName, name);
-  }
-
-  public String getString(String name, String defaultValue) {
-    if (defaultValue == null) {
-      return cfg.getString(PLUGIN, pluginName, name);
-    }
-    return MoreObjects.firstNonNull(cfg.getString(PLUGIN, pluginName, name), defaultValue);
-  }
-
-  public void setString(String name, String value) {
-    if (Strings.isNullOrEmpty(value)) {
-      cfg.unset(PLUGIN, pluginName, name);
-    } else {
-      cfg.setString(PLUGIN, pluginName, name, value);
-    }
-  }
-
-  public String[] getStringList(String name) {
-    return cfg.getStringList(PLUGIN, pluginName, name);
-  }
-
-  public void setStringList(String name, List<String> values) {
-    if (values == null || values.isEmpty()) {
-      cfg.unset(PLUGIN, pluginName, name);
-    } else {
-      cfg.setStringList(PLUGIN, pluginName, name, values);
-    }
-  }
-
-  public int getInt(String name, int defaultValue) {
-    return cfg.getInt(PLUGIN, pluginName, name, defaultValue);
-  }
-
-  public void setInt(String name, int value) {
-    cfg.setInt(PLUGIN, pluginName, name, value);
-  }
-
-  public long getLong(String name, long defaultValue) {
-    return cfg.getLong(PLUGIN, pluginName, name, defaultValue);
-  }
-
-  public void setLong(String name, long value) {
-    cfg.setLong(PLUGIN, pluginName, name, value);
-  }
-
-  public boolean getBoolean(String name, boolean defaultValue) {
-    return cfg.getBoolean(PLUGIN, pluginName, name, defaultValue);
-  }
-
-  public void setBoolean(String name, boolean value) {
-    cfg.setBoolean(PLUGIN, pluginName, name, value);
-  }
-
-  public <T extends Enum<?>> T getEnum(String name, T defaultValue) {
-    return cfg.getEnum(PLUGIN, pluginName, name, defaultValue);
-  }
-
-  public <T extends Enum<?>> void setEnum(String name, T value) {
-    cfg.setEnum(PLUGIN, pluginName, name, value);
-  }
-
-  public <T extends Enum<?>> T getEnum(T[] all, String name, T defaultValue) {
-    return cfg.getEnum(all, PLUGIN, pluginName, name, defaultValue);
-  }
-
-  public void unset(String name) {
-    cfg.unset(PLUGIN, pluginName, name);
-  }
-
-  public Set<String> getNames() {
-    return cfg.getNames(PLUGIN, pluginName, true);
-  }
-
-  public GroupReference getGroupReference(String name) {
-    return projectConfig.getGroup(GroupReference.extractGroupName(getString(name)));
-  }
-
-  public void setGroupReference(String name, GroupReference value) {
-    GroupReference groupRef = projectConfig.resolve(value);
-    setString(name, groupRef.toConfigValue());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/PluginConfigFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/PluginConfigFactory.java
deleted file mode 100644
index 09f2837..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/PluginConfigFactory.java
+++ /dev/null
@@ -1,377 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.config;
-
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.git.ProjectLevelConfig;
-import com.google.gerrit.server.plugins.Plugin;
-import com.google.gerrit.server.plugins.ReloadPluginListener;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.securestore.SecureStore;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.util.HashMap;
-import java.util.Map;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.internal.storage.file.FileSnapshot;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.storage.file.FileBasedConfig;
-import org.eclipse.jgit.util.FS;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class PluginConfigFactory implements ReloadPluginListener {
-  private static final Logger log = LoggerFactory.getLogger(PluginConfigFactory.class);
-  private static final String EXTENSION = ".config";
-
-  private final SitePaths site;
-  private final Provider<Config> cfgProvider;
-  private final ProjectCache projectCache;
-  private final ProjectState.Factory projectStateFactory;
-  private final SecureStore secureStore;
-  private final Map<String, Config> pluginConfigs;
-
-  private volatile FileSnapshot cfgSnapshot;
-  private volatile Config cfg;
-
-  @Inject
-  PluginConfigFactory(
-      SitePaths site,
-      @GerritServerConfig Provider<Config> cfgProvider,
-      ProjectCache projectCache,
-      ProjectState.Factory projectStateFactory,
-      SecureStore secureStore) {
-    this.site = site;
-    this.cfgProvider = cfgProvider;
-    this.projectCache = projectCache;
-    this.projectStateFactory = projectStateFactory;
-    this.secureStore = secureStore;
-
-    this.pluginConfigs = new HashMap<>();
-    this.cfgSnapshot = FileSnapshot.save(site.gerrit_config.toFile());
-    this.cfg = cfgProvider.get();
-  }
-
-  /**
-   * Returns the configuration for the specified plugin that is stored in the 'gerrit.config' file.
-   *
-   * <p>The returned plugin configuration provides access to all parameters of the 'gerrit.config'
-   * file that are set in the 'plugin' subsection of the specified plugin.
-   *
-   * <p>E.g.: [plugin "my-plugin"] myKey = myValue
-   *
-   * @param pluginName the name of the plugin for which the configuration should be returned
-   * @return the plugin configuration from the 'gerrit.config' file
-   */
-  public PluginConfig getFromGerritConfig(String pluginName) {
-    return getFromGerritConfig(pluginName, false);
-  }
-
-  /**
-   * Returns the configuration for the specified plugin that is stored in the 'gerrit.config' file.
-   *
-   * <p>The returned plugin configuration provides access to all parameters of the 'gerrit.config'
-   * file that are set in the 'plugin' subsection of the specified plugin.
-   *
-   * <p>E.g.: [plugin "my-plugin"] myKey = myValue
-   *
-   * @param pluginName the name of the plugin for which the configuration should be returned
-   * @param refresh if <code>true</code> it is checked if the 'gerrit.config' file was modified and
-   *     if yes the Gerrit configuration is reloaded, if <code>false</code> the cached Gerrit
-   *     configuration is used
-   * @return the plugin configuration from the 'gerrit.config' file
-   */
-  public PluginConfig getFromGerritConfig(String pluginName, boolean refresh) {
-    if (refresh && secureStore.isOutdated()) {
-      secureStore.reload();
-    }
-    File configFile = site.gerrit_config.toFile();
-    if (refresh && cfgSnapshot.isModified(configFile)) {
-      cfgSnapshot = FileSnapshot.save(configFile);
-      cfg = cfgProvider.get();
-    }
-    return new PluginConfig(pluginName, cfg);
-  }
-
-  /**
-   * Returns the configuration for the specified plugin that is stored in the 'project.config' file
-   * of the specified project.
-   *
-   * <p>The returned plugin configuration provides access to all parameters of the 'project.config'
-   * file that are set in the 'plugin' subsection of the specified plugin.
-   *
-   * <p>E.g.: [plugin "my-plugin"] myKey = myValue
-   *
-   * @param projectName the name of the project for which the plugin configuration should be
-   *     returned
-   * @param pluginName the name of the plugin for which the configuration should be returned
-   * @return the plugin configuration from the 'project.config' file of the specified project
-   * @throws NoSuchProjectException thrown if the specified project does not exist
-   */
-  public PluginConfig getFromProjectConfig(Project.NameKey projectName, String pluginName)
-      throws NoSuchProjectException {
-    ProjectState projectState = projectCache.get(projectName);
-    if (projectState == null) {
-      throw new NoSuchProjectException(projectName);
-    }
-    return getFromProjectConfig(projectState, pluginName);
-  }
-
-  /**
-   * Returns the configuration for the specified plugin that is stored in the 'project.config' file
-   * of the specified project.
-   *
-   * <p>The returned plugin configuration provides access to all parameters of the 'project.config'
-   * file that are set in the 'plugin' subsection of the specified plugin.
-   *
-   * <p>E.g.: [plugin "my-plugin"] myKey = myValue
-   *
-   * @param projectState the project for which the plugin configuration should be returned
-   * @param pluginName the name of the plugin for which the configuration should be returned
-   * @return the plugin configuration from the 'project.config' file of the specified project
-   */
-  public PluginConfig getFromProjectConfig(ProjectState projectState, String pluginName) {
-    return projectState.getConfig().getPluginConfig(pluginName);
-  }
-
-  /**
-   * Returns the configuration for the specified plugin that is stored in the 'project.config' file
-   * of the specified project. Parameters which are not set in the 'project.config' of this project
-   * are inherited from the parent project's 'project.config' files.
-   *
-   * <p>The returned plugin configuration provides access to all parameters of the 'project.config'
-   * file that are set in the 'plugin' subsection of the specified plugin.
-   *
-   * <p>E.g.: child project: [plugin "my-plugin"] myKey = childValue
-   *
-   * <p>parent project: [plugin "my-plugin"] myKey = parentValue anotherKey = someValue
-   *
-   * <p>return: [plugin "my-plugin"] myKey = childValue anotherKey = someValue
-   *
-   * @param projectName the name of the project for which the plugin configuration should be
-   *     returned
-   * @param pluginName the name of the plugin for which the configuration should be returned
-   * @return the plugin configuration from the 'project.config' file of the specified project with
-   *     inherited non-set parameters from the parent projects
-   * @throws NoSuchProjectException thrown if the specified project does not exist
-   */
-  public PluginConfig getFromProjectConfigWithInheritance(
-      Project.NameKey projectName, String pluginName) throws NoSuchProjectException {
-    return getFromProjectConfig(projectName, pluginName).withInheritance(projectStateFactory);
-  }
-
-  /**
-   * Returns the configuration for the specified plugin that is stored in the 'project.config' file
-   * of the specified project. Parameters which are not set in the 'project.config' of this project
-   * are inherited from the parent project's 'project.config' files.
-   *
-   * <p>The returned plugin configuration provides access to all parameters of the 'project.config'
-   * file that are set in the 'plugin' subsection of the specified plugin.
-   *
-   * <p>E.g.: child project: [plugin "my-plugin"] myKey = childValue
-   *
-   * <p>parent project: [plugin "my-plugin"] myKey = parentValue anotherKey = someValue
-   *
-   * <p>return: [plugin "my-plugin"] myKey = childValue anotherKey = someValue
-   *
-   * @param projectState the project for which the plugin configuration should be returned
-   * @param pluginName the name of the plugin for which the configuration should be returned
-   * @return the plugin configuration from the 'project.config' file of the specified project with
-   *     inherited non-set parameters from the parent projects
-   */
-  public PluginConfig getFromProjectConfigWithInheritance(
-      ProjectState projectState, String pluginName) {
-    return getFromProjectConfig(projectState, pluginName).withInheritance(projectStateFactory);
-  }
-
-  /**
-   * Returns the configuration for the specified plugin that is stored in the plugin configuration
-   * file '{@code etc/<plugin-name>.config}'.
-   *
-   * <p>The plugin configuration is only loaded once and is then cached.
-   *
-   * @param pluginName the name of the plugin for which the configuration should be returned
-   * @return the plugin configuration from the '{@code etc/<plugin-name>.config}' file
-   */
-  public synchronized Config getGlobalPluginConfig(String pluginName) {
-    if (pluginConfigs.containsKey(pluginName)) {
-      return pluginConfigs.get(pluginName);
-    }
-
-    Path pluginConfigFile = site.etc_dir.resolve(pluginName + ".config");
-    FileBasedConfig cfg = new FileBasedConfig(pluginConfigFile.toFile(), FS.DETECTED);
-    GlobalPluginConfig pluginConfig = new GlobalPluginConfig(pluginName, cfg, secureStore);
-    pluginConfigs.put(pluginName, pluginConfig);
-    if (!cfg.getFile().exists()) {
-      log.info("No " + pluginConfigFile.toAbsolutePath() + "; assuming defaults");
-      return pluginConfig;
-    }
-
-    try {
-      cfg.load();
-    } catch (ConfigInvalidException e) {
-      // This is an error in user input, don't spam logs with a stack trace.
-      log.warn("Failed to load " + pluginConfigFile.toAbsolutePath() + ": " + e);
-    } catch (IOException e) {
-      log.warn("Failed to load " + pluginConfigFile.toAbsolutePath(), e);
-    }
-
-    return pluginConfig;
-  }
-
-  /**
-   * Returns the configuration for the specified plugin that is stored in the '{@code
-   * <plugin-name>.config}' file in the 'refs/meta/config' branch of the specified project.
-   *
-   * @param projectName the name of the project for which the plugin configuration should be
-   *     returned
-   * @param pluginName the name of the plugin for which the configuration should be returned
-   * @return the plugin configuration from the '{@code <plugin-name>.config}' file of the specified
-   *     project
-   * @throws NoSuchProjectException thrown if the specified project does not exist
-   */
-  public Config getProjectPluginConfig(Project.NameKey projectName, String pluginName)
-      throws NoSuchProjectException {
-    return getPluginConfig(projectName, pluginName).get();
-  }
-
-  /**
-   * Returns the configuration for the specified plugin that is stored in the '{@code
-   * <plugin-name>.config}' file in the 'refs/meta/config' branch of the specified project.
-   *
-   * @param projectState the project for which the plugin configuration should be returned
-   * @param pluginName the name of the plugin for which the configuration should be returned
-   * @return the plugin configuration from the '{@code <plugin-name>.config}' file of the specified
-   *     project
-   */
-  public Config getProjectPluginConfig(ProjectState projectState, String pluginName) {
-    return projectState.getConfig(pluginName + EXTENSION).get();
-  }
-
-  /**
-   * Returns the configuration for the specified plugin that is stored in the '{@code
-   * <plugin-name>.config}' file in the 'refs/meta/config' branch of the specified project.
-   * Parameters which are not set in the '{@code <plugin-name>.config}' of this project are
-   * inherited from the parent project's '{@code <plugin-name>.config}' files.
-   *
-   * <p>E.g.: child project: [mySection "mySubsection"] myKey = childValue
-   *
-   * <p>parent project: [mySection "mySubsection"] myKey = parentValue anotherKey = someValue
-   *
-   * <p>return: [mySection "mySubsection"] myKey = childValue anotherKey = someValue
-   *
-   * @param projectName the name of the project for which the plugin configuration should be
-   *     returned
-   * @param pluginName the name of the plugin for which the configuration should be returned
-   * @return the plugin configuration from the '{@code <plugin-name>.config}' file of the specified
-   *     project with inheriting non-set parameters from the parent projects
-   * @throws NoSuchProjectException thrown if the specified project does not exist
-   */
-  public Config getProjectPluginConfigWithInheritance(
-      Project.NameKey projectName, String pluginName) throws NoSuchProjectException {
-    return getPluginConfig(projectName, pluginName).getWithInheritance(false);
-  }
-
-  /**
-   * Returns the configuration for the specified plugin that is stored in the '{@code
-   * <plugin-name>.config}' file in the 'refs/meta/config' branch of the specified project.
-   * Parameters from the '{@code <plugin-name>.config}' of the parent project are appended to this
-   * project's '{@code <plugin-name>.config}' files.
-   *
-   * <p>E.g.: child project: [mySection "mySubsection"] myKey = childValue
-   *
-   * <p>parent project: [mySection "mySubsection"] myKey = parentValue anotherKey = someValue
-   *
-   * <p>return: [mySection "mySubsection"] myKey = childValue myKey = parentValue anotherKey =
-   * someValue
-   *
-   * @param projectName the name of the project for which the plugin configuration should be
-   *     returned
-   * @param pluginName the name of the plugin for which the configuration should be returned
-   * @return the plugin configuration from the '{@code <plugin-name>.config}' file of the specified
-   *     project with parameters from the parent projects appended to the project values
-   * @throws NoSuchProjectException thrown if the specified project does not exist
-   */
-  public Config getProjectPluginConfigWithMergedInheritance(
-      Project.NameKey projectName, String pluginName) throws NoSuchProjectException {
-    return getPluginConfig(projectName, pluginName).getWithInheritance(true);
-  }
-
-  /**
-   * Returns the configuration for the specified plugin that is stored in the '{@code
-   * <plugin-name>.config}' file in the 'refs/meta/config' branch of the specified project.
-   * Parameters which are not set in the '{@code <plugin-name>.config}' of this project are
-   * inherited from the parent project's '{@code <plugin-name>.config}' files.
-   *
-   * <p>E.g.: child project: [mySection "mySubsection"] myKey = childValue
-   *
-   * <p>parent project: [mySection "mySubsection"] myKey = parentValue anotherKey = someValue
-   *
-   * <p>return: [mySection "mySubsection"] myKey = childValue anotherKey = someValue
-   *
-   * @param projectState the project for which the plugin configuration should be returned
-   * @param pluginName the name of the plugin for which the configuration should be returned
-   * @return the plugin configuration from the '{@code <plugin-name>.config}' file of the specified
-   *     project with inheriting non-set parameters from the parent projects
-   */
-  public Config getProjectPluginConfigWithInheritance(
-      ProjectState projectState, String pluginName) {
-    return projectState.getConfig(pluginName + EXTENSION).getWithInheritance(false);
-  }
-
-  /**
-   * Returns the configuration for the specified plugin that is stored in the '{@code
-   * <plugin-name>.config}' file in the 'refs/meta/config' branch of the specified project.
-   * Parameters from the '{@code <plugin-name>.config}' of the parent project are appended to this
-   * project's '{@code <plugin-name>.config}' files.
-   *
-   * <p>E.g.: child project: [mySection "mySubsection"] myKey = childValue
-   *
-   * <p>parent project: [mySection "mySubsection"] myKey = parentValue anotherKey = someValue
-   *
-   * <p>return: [mySection "mySubsection"] myKey = childValue myKey = parentValue anotherKey =
-   * someValue
-   *
-   * @param projectState the project for which the plugin configuration should be returned
-   * @param pluginName the name of the plugin for which the configuration should be returned
-   * @return the plugin configuration from the '{@code <plugin-name>.config}' file of the specified
-   *     project with inheriting non-set parameters from the parent projects
-   */
-  public Config getProjectPluginConfigWithMergedInheritance(
-      ProjectState projectState, String pluginName) {
-    return projectState.getConfig(pluginName + EXTENSION).getWithInheritance(true);
-  }
-
-  private ProjectLevelConfig getPluginConfig(Project.NameKey projectName, String pluginName)
-      throws NoSuchProjectException {
-    ProjectState projectState = projectCache.get(projectName);
-    if (projectState == null) {
-      throw new NoSuchProjectException(projectName);
-    }
-    return projectState.getConfig(pluginName + EXTENSION);
-  }
-
-  @Override
-  public synchronized void onReloadPlugin(Plugin oldPlugin, Plugin newPlugin) {
-    pluginConfigs.remove(oldPlugin.getName());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/PostCaches.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/PostCaches.java
deleted file mode 100644
index d08f0a9..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/PostCaches.java
+++ /dev/null
@@ -1,131 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.config;
-
-import static com.google.gerrit.common.data.GlobalCapability.FLUSH_CACHES;
-import static com.google.gerrit.common.data.GlobalCapability.MAINTAIN_SERVER;
-
-import com.google.common.cache.Cache;
-import com.google.gerrit.extensions.annotations.RequiresAnyCapability;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.server.config.PostCaches.Input;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.ArrayList;
-import java.util.List;
-
-@RequiresAnyCapability({FLUSH_CACHES, MAINTAIN_SERVER})
-@Singleton
-public class PostCaches implements RestModifyView<ConfigResource, Input> {
-  public static class Input {
-    public Operation operation;
-    public List<String> caches;
-
-    public Input() {}
-
-    public Input(Operation op) {
-      this(op, null);
-    }
-
-    public Input(Operation op, List<String> c) {
-      operation = op;
-      caches = c;
-    }
-  }
-
-  public enum Operation {
-    FLUSH_ALL,
-    FLUSH
-  }
-
-  private final DynamicMap<Cache<?, ?>> cacheMap;
-  private final FlushCache flushCache;
-
-  @Inject
-  public PostCaches(DynamicMap<Cache<?, ?>> cacheMap, FlushCache flushCache) {
-    this.cacheMap = cacheMap;
-    this.flushCache = flushCache;
-  }
-
-  @Override
-  public Response<String> apply(ConfigResource rsrc, Input input)
-      throws AuthException, BadRequestException, UnprocessableEntityException,
-          PermissionBackendException {
-    if (input == null || input.operation == null) {
-      throw new BadRequestException("operation must be specified");
-    }
-
-    switch (input.operation) {
-      case FLUSH_ALL:
-        if (input.caches != null) {
-          throw new BadRequestException(
-              "specifying caches is not allowed for operation 'FLUSH_ALL'");
-        }
-        flushAll();
-        return Response.ok("");
-      case FLUSH:
-        if (input.caches == null || input.caches.isEmpty()) {
-          throw new BadRequestException("caches must be specified for operation 'FLUSH'");
-        }
-        flush(input.caches);
-        return Response.ok("");
-      default:
-        throw new BadRequestException("unsupported operation: " + input.operation);
-    }
-  }
-
-  private void flushAll() throws AuthException, PermissionBackendException {
-    for (DynamicMap.Entry<Cache<?, ?>> e : cacheMap) {
-      CacheResource cacheResource =
-          new CacheResource(e.getPluginName(), e.getExportName(), e.getProvider());
-      if (FlushCache.WEB_SESSIONS.equals(cacheResource.getName())) {
-        continue;
-      }
-      flushCache.apply(cacheResource, null);
-    }
-  }
-
-  private void flush(List<String> cacheNames)
-      throws UnprocessableEntityException, AuthException, PermissionBackendException {
-    List<CacheResource> cacheResources = new ArrayList<>(cacheNames.size());
-
-    for (String n : cacheNames) {
-      String pluginName = "gerrit";
-      String cacheName = n;
-      int i = cacheName.lastIndexOf('-');
-      if (i != -1) {
-        pluginName = cacheName.substring(0, i);
-        cacheName = cacheName.length() > i + 1 ? cacheName.substring(i + 1) : "";
-      }
-
-      Cache<?, ?> cache = cacheMap.get(pluginName, cacheName);
-      if (cache != null) {
-        cacheResources.add(new CacheResource(pluginName, cacheName, cache));
-      } else {
-        throw new UnprocessableEntityException(String.format("cache %s not found", n));
-      }
-    }
-
-    for (CacheResource rsrc : cacheResources) {
-      flushCache.apply(rsrc, null);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/ProjectConfigEntry.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/ProjectConfigEntry.java
deleted file mode 100644
index 943edbb..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/ProjectConfigEntry.java
+++ /dev/null
@@ -1,390 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.config;
-
-import static java.util.stream.Collectors.toList;
-
-import com.google.gerrit.extensions.annotations.ExtensionPoint;
-import com.google.gerrit.extensions.api.projects.ConfigValue;
-import com.google.gerrit.extensions.api.projects.ProjectConfigEntryType;
-import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.registration.DynamicMap.Entry;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.inject.Inject;
-import com.google.inject.ProvisionException;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.List;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@ExtensionPoint
-public class ProjectConfigEntry {
-  private final String displayName;
-  private final String description;
-  private final boolean inheritable;
-  private final String defaultValue;
-  private final ProjectConfigEntryType type;
-  private final List<String> permittedValues;
-
-  public ProjectConfigEntry(String displayName, String defaultValue) {
-    this(displayName, defaultValue, false);
-  }
-
-  public ProjectConfigEntry(String displayName, String defaultValue, boolean inheritable) {
-    this(displayName, defaultValue, inheritable, null);
-  }
-
-  public ProjectConfigEntry(
-      String displayName, String defaultValue, boolean inheritable, String description) {
-    this(displayName, defaultValue, ProjectConfigEntryType.STRING, null, inheritable, description);
-  }
-
-  public ProjectConfigEntry(String displayName, int defaultValue) {
-    this(displayName, defaultValue, false);
-  }
-
-  public ProjectConfigEntry(String displayName, int defaultValue, boolean inheritable) {
-    this(displayName, defaultValue, inheritable, null);
-  }
-
-  public ProjectConfigEntry(
-      String displayName, int defaultValue, boolean inheritable, String description) {
-    this(
-        displayName,
-        Integer.toString(defaultValue),
-        ProjectConfigEntryType.INT,
-        null,
-        inheritable,
-        description);
-  }
-
-  public ProjectConfigEntry(String displayName, long defaultValue) {
-    this(displayName, defaultValue, false);
-  }
-
-  public ProjectConfigEntry(String displayName, long defaultValue, boolean inheritable) {
-    this(displayName, defaultValue, inheritable, null);
-  }
-
-  public ProjectConfigEntry(
-      String displayName, long defaultValue, boolean inheritable, String description) {
-    this(
-        displayName,
-        Long.toString(defaultValue),
-        ProjectConfigEntryType.LONG,
-        null,
-        inheritable,
-        description);
-  }
-
-  // For inheritable boolean use 'LIST' type with InheritableBoolean
-  public ProjectConfigEntry(String displayName, boolean defaultValue) {
-    this(displayName, defaultValue, null);
-  }
-
-  // For inheritable boolean use 'LIST' type with InheritableBoolean
-  public ProjectConfigEntry(String displayName, boolean defaultValue, String description) {
-    this(
-        displayName,
-        Boolean.toString(defaultValue),
-        ProjectConfigEntryType.BOOLEAN,
-        null,
-        false,
-        description);
-  }
-
-  public ProjectConfigEntry(String displayName, String defaultValue, List<String> permittedValues) {
-    this(displayName, defaultValue, permittedValues, false);
-  }
-
-  public ProjectConfigEntry(
-      String displayName, String defaultValue, List<String> permittedValues, boolean inheritable) {
-    this(displayName, defaultValue, permittedValues, inheritable, null);
-  }
-
-  public ProjectConfigEntry(
-      String displayName,
-      String defaultValue,
-      List<String> permittedValues,
-      boolean inheritable,
-      String description) {
-    this(
-        displayName,
-        defaultValue,
-        ProjectConfigEntryType.LIST,
-        permittedValues,
-        inheritable,
-        description);
-  }
-
-  public <T extends Enum<?>> ProjectConfigEntry(
-      String displayName, T defaultValue, Class<T> permittedValues) {
-    this(displayName, defaultValue, permittedValues, false);
-  }
-
-  public <T extends Enum<?>> ProjectConfigEntry(
-      String displayName, T defaultValue, Class<T> permittedValues, boolean inheritable) {
-    this(displayName, defaultValue, permittedValues, inheritable, null);
-  }
-
-  public <T extends Enum<?>> ProjectConfigEntry(
-      String displayName,
-      T defaultValue,
-      Class<T> permittedValues,
-      boolean inheritable,
-      String description) {
-    this(
-        displayName,
-        defaultValue.name(),
-        ProjectConfigEntryType.LIST,
-        Arrays.stream(permittedValues.getEnumConstants()).map(Enum::name).collect(toList()),
-        inheritable,
-        description);
-  }
-
-  public ProjectConfigEntry(
-      String displayName,
-      String defaultValue,
-      ProjectConfigEntryType type,
-      List<String> permittedValues,
-      boolean inheritable,
-      String description) {
-    this.displayName = displayName;
-    this.defaultValue = defaultValue;
-    this.type = type;
-    this.permittedValues = permittedValues;
-    this.inheritable = inheritable;
-    this.description = description;
-    if (type == ProjectConfigEntryType.ARRAY && inheritable) {
-      throw new ProvisionException("ARRAY doesn't support inheritable values");
-    }
-  }
-
-  public String getDisplayName() {
-    return displayName;
-  }
-
-  public String getDescription() {
-    return description;
-  }
-
-  public boolean isInheritable() {
-    return inheritable;
-  }
-
-  public String getDefaultValue() {
-    return defaultValue;
-  }
-
-  public ProjectConfigEntryType getType() {
-    return type;
-  }
-
-  public List<String> getPermittedValues() {
-    return permittedValues;
-  }
-
-  /**
-   * @param project project state.
-   * @return whether the project is editable.
-   */
-  public boolean isEditable(ProjectState project) {
-    return true;
-  }
-
-  /**
-   * @param project project state.
-   * @return any warning associated with the project.
-   */
-  public String getWarning(ProjectState project) {
-    return null;
-  }
-
-  /**
-   * Called before the project config is updated. To modify the value before the project config is
-   * updated, override this method and return the modified value. Default implementation returns the
-   * same value.
-   *
-   * @param configValue the original configValue that was entered.
-   * @return the modified configValue.
-   */
-  public ConfigValue preUpdate(ConfigValue configValue) {
-    return configValue;
-  }
-
-  /**
-   * Called after reading the project config value. To modify the value before returning it to the
-   * client, override this method and return the modified value. Default implementation returns the
-   * same value.
-   *
-   * @param project the project.
-   * @param value the actual value of the config entry (computed out of the configured value, the
-   *     inherited value and the default value).
-   * @return the modified value.
-   */
-  public String onRead(ProjectState project, String value) {
-    return value;
-  }
-
-  /**
-   * Called after reading the project config value of type ARRAY. To modify the values before
-   * returning it to the client, override this method and return the modified values. Default
-   * implementation returns the same values.
-   *
-   * @param project the project.
-   * @param values the actual values of the config entry (computed out of the configured value, the
-   *     inherited value and the default value).
-   * @return the modified values.
-   */
-  public List<String> onRead(ProjectState project, List<String> values) {
-    return values;
-  }
-
-  /**
-   * Called after a project config is updated.
-   *
-   * @param project project name.
-   * @param oldValue old entry value.
-   * @param newValue new entry value.
-   */
-  public void onUpdate(Project.NameKey project, String oldValue, String newValue) {}
-
-  /**
-   * Called after a project config is updated.
-   *
-   * @param project project name.
-   * @param oldValue old entry value.
-   * @param newValue new entry value.
-   */
-  public void onUpdate(Project.NameKey project, Boolean oldValue, Boolean newValue) {}
-
-  /**
-   * Called after a project config is updated.
-   *
-   * @param project project name.
-   * @param oldValue old entry value.
-   * @param newValue new entry value.
-   */
-  public void onUpdate(Project.NameKey project, Integer oldValue, Integer newValue) {}
-
-  /**
-   * Called after a project config is updated.
-   *
-   * @param project project name.
-   * @param oldValue old entry value.
-   * @param newValue new entry value.
-   */
-  public void onUpdate(Project.NameKey project, Long oldValue, Long newValue) {}
-
-  public static class UpdateChecker implements GitReferenceUpdatedListener {
-    private static final Logger log = LoggerFactory.getLogger(UpdateChecker.class);
-
-    private final GitRepositoryManager repoManager;
-    private final DynamicMap<ProjectConfigEntry> pluginConfigEntries;
-
-    @Inject
-    UpdateChecker(
-        GitRepositoryManager repoManager, DynamicMap<ProjectConfigEntry> pluginConfigEntries) {
-      this.repoManager = repoManager;
-      this.pluginConfigEntries = pluginConfigEntries;
-    }
-
-    @Override
-    public void onGitReferenceUpdated(Event event) {
-      Project.NameKey p = new Project.NameKey(event.getProjectName());
-      if (!event.getRefName().equals(RefNames.REFS_CONFIG)) {
-        return;
-      }
-
-      try {
-        ProjectConfig oldCfg = parseConfig(p, event.getOldObjectId());
-        ProjectConfig newCfg = parseConfig(p, event.getNewObjectId());
-        if (oldCfg != null && newCfg != null) {
-          for (Entry<ProjectConfigEntry> e : pluginConfigEntries) {
-            ProjectConfigEntry configEntry = e.getProvider().get();
-            String newValue = getValue(newCfg, e);
-            String oldValue = getValue(oldCfg, e);
-            if ((newValue == null && oldValue == null)
-                || (newValue != null && newValue.equals(oldValue))) {
-              return;
-            }
-
-            switch (configEntry.getType()) {
-              case BOOLEAN:
-                configEntry.onUpdate(p, toBoolean(oldValue), toBoolean(newValue));
-                break;
-              case INT:
-                configEntry.onUpdate(p, toInt(oldValue), toInt(newValue));
-                break;
-              case LONG:
-                configEntry.onUpdate(p, toLong(oldValue), toLong(newValue));
-                break;
-              case LIST:
-              case STRING:
-              case ARRAY:
-              default:
-                configEntry.onUpdate(p, oldValue, newValue);
-            }
-          }
-        }
-      } catch (IOException | ConfigInvalidException e) {
-        log.error("Failed to check if plugin config of project {} was updated.", p.get(), e);
-      }
-    }
-
-    private ProjectConfig parseConfig(Project.NameKey p, String idStr)
-        throws IOException, ConfigInvalidException, RepositoryNotFoundException {
-      ObjectId id = ObjectId.fromString(idStr);
-      if (ObjectId.zeroId().equals(id)) {
-        return null;
-      }
-      try (Repository repo = repoManager.openRepository(p)) {
-        ProjectConfig pc = new ProjectConfig(p);
-        pc.load(repo, id);
-        return pc;
-      }
-    }
-
-    private static String getValue(ProjectConfig cfg, Entry<ProjectConfigEntry> e) {
-      String value = cfg.getPluginConfig(e.getPluginName()).getString(e.getExportName());
-      if (value == null) {
-        value = e.getProvider().get().getDefaultValue();
-      }
-      return value;
-    }
-  }
-
-  private static Boolean toBoolean(String value) {
-    return value != null ? Boolean.parseBoolean(value) : null;
-  }
-
-  private static Integer toInt(String value) {
-    return value != null ? Integer.parseInt(value) : null;
-  }
-
-  private static Long toLong(String value) {
-    return value != null ? Long.parseLong(value) : null;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/RepositoryConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/RepositoryConfig.java
deleted file mode 100644
index 4f35fc7..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/RepositoryConfig.java
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.config;
-
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.List;
-import org.eclipse.jgit.lib.Config;
-
-@Singleton
-public class RepositoryConfig {
-
-  static final String SECTION_NAME = "repository";
-  static final String OWNER_GROUP_NAME = "ownerGroup";
-  static final String DEFAULT_SUBMIT_TYPE_NAME = "defaultSubmitType";
-  static final String BASE_PATH_NAME = "basePath";
-
-  private final Config cfg;
-
-  @Inject
-  public RepositoryConfig(@GerritServerConfig Config cfg) {
-    this.cfg = cfg;
-  }
-
-  public SubmitType getDefaultSubmitType(Project.NameKey project) {
-    return cfg.getEnum(
-        SECTION_NAME,
-        findSubSection(project.get()),
-        DEFAULT_SUBMIT_TYPE_NAME,
-        SubmitType.MERGE_IF_NECESSARY);
-  }
-
-  public List<String> getOwnerGroups(Project.NameKey project) {
-    return ImmutableList.copyOf(
-        cfg.getStringList(SECTION_NAME, findSubSection(project.get()), OWNER_GROUP_NAME));
-  }
-
-  public Path getBasePath(Project.NameKey project) {
-    String basePath = cfg.getString(SECTION_NAME, findSubSection(project.get()), BASE_PATH_NAME);
-    return basePath != null ? Paths.get(basePath) : null;
-  }
-
-  public List<Path> getAllBasePaths() {
-    List<Path> basePaths = new ArrayList<>();
-    for (String subSection : cfg.getSubsections(SECTION_NAME)) {
-      String basePath = cfg.getString(SECTION_NAME, subSection, BASE_PATH_NAME);
-      if (basePath != null) {
-        basePaths.add(Paths.get(basePath));
-      }
-    }
-    return basePaths;
-  }
-
-  /**
-   * Find the subSection to get repository configuration from.
-   *
-   * <p>SubSection can use the * pattern so if project name matches more than one section, return
-   * the more precise one. E.g if the following subSections are defined:
-   *
-   * <pre>
-   * [repository "somePath/*"]
-   *   name = value
-   * [repository "somePath/somePath/*"]
-   *   name = value
-   * </pre>
-   *
-   * and this method is called with "somePath/somePath/someProject" as project name, it will return
-   * the subSection "somePath/somePath/*"
-   *
-   * @param project Name of the project
-   * @return the name of the subSection, null if none is found
-   */
-  private String findSubSection(String project) {
-    String subSectionFound = null;
-    for (String subSection : cfg.getSubsections(SECTION_NAME)) {
-      if (isMatch(subSection, project)
-          && (subSectionFound == null || subSectionFound.length() < subSection.length())) {
-        subSectionFound = subSection;
-      }
-    }
-    return subSectionFound;
-  }
-
-  private boolean isMatch(String subSection, String project) {
-    return project.equals(subSection)
-        || (subSection.endsWith("*")
-            && project.startsWith(subSection.substring(0, subSection.length() - 1)));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/RestCacheAdminModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/RestCacheAdminModule.java
deleted file mode 100644
index 992c62e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/RestCacheAdminModule.java
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.config;
-
-import static com.google.gerrit.server.config.CacheResource.CACHE_KIND;
-import static com.google.gerrit.server.config.ConfigResource.CONFIG_KIND;
-
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.RestApiModule;
-
-public class RestCacheAdminModule extends RestApiModule {
-
-  @Override
-  protected void configure() {
-    DynamicMap.mapOf(binder(), CACHE_KIND);
-    child(CONFIG_KIND, "caches").to(CachesCollection.class);
-    get(CACHE_KIND).to(GetCache.class);
-    post(CACHE_KIND, "flush").to(FlushCache.class);
-    get(CONFIG_KIND, "summary").to(GetSummary.class);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/ScheduleConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/ScheduleConfig.java
deleted file mode 100644
index 4a87474..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/ScheduleConfig.java
+++ /dev/null
@@ -1,194 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.config;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.text.MessageFormat;
-import java.util.Locale;
-import java.util.concurrent.TimeUnit;
-import org.eclipse.jgit.lib.Config;
-import org.joda.time.DateTime;
-import org.joda.time.LocalDateTime;
-import org.joda.time.LocalTime;
-import org.joda.time.MutableDateTime;
-import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.DateTimeFormatter;
-import org.joda.time.format.ISODateTimeFormat;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ScheduleConfig {
-  private static final Logger log = LoggerFactory.getLogger(ScheduleConfig.class);
-  public static final long MISSING_CONFIG = -1L;
-  public static final long INVALID_CONFIG = -2L;
-  private static final String KEY_INTERVAL = "interval";
-  private static final String KEY_STARTTIME = "startTime";
-
-  private final Config rc;
-  private final String section;
-  private final String subsection;
-  private final String keyInterval;
-  private final String keyStartTime;
-  private final long initialDelay;
-  private final long interval;
-
-  public ScheduleConfig(Config rc, String section) {
-    this(rc, section, null);
-  }
-
-  public ScheduleConfig(Config rc, String section, String subsection) {
-    this(rc, section, subsection, DateTime.now());
-  }
-
-  public ScheduleConfig(
-      Config rc, String section, String subsection, String keyInterval, String keyStartTime) {
-    this(rc, section, subsection, keyInterval, keyStartTime, DateTime.now());
-  }
-
-  @VisibleForTesting
-  ScheduleConfig(Config rc, String section, String subsection, DateTime now) {
-    this(rc, section, subsection, KEY_INTERVAL, KEY_STARTTIME, now);
-  }
-
-  @VisibleForTesting
-  ScheduleConfig(
-      Config rc,
-      String section,
-      String subsection,
-      String keyInterval,
-      String keyStartTime,
-      DateTime now) {
-    this.rc = rc;
-    this.section = section;
-    this.subsection = subsection;
-    this.keyInterval = keyInterval;
-    this.keyStartTime = keyStartTime;
-    this.interval = interval(rc, section, subsection, keyInterval);
-    if (interval > 0) {
-      this.initialDelay = initialDelay(rc, section, subsection, keyStartTime, now, interval);
-    } else {
-      this.initialDelay = interval;
-    }
-  }
-
-  /**
-   * Milliseconds between constructor invocation and first event time.
-   *
-   * <p>If there is any lag between the constructor invocation and queuing the object into an
-   * executor the event will run later, as there is no method to adjust for the scheduling delay.
-   */
-  public long getInitialDelay() {
-    return initialDelay;
-  }
-
-  /** Number of milliseconds between events. */
-  public long getInterval() {
-    return interval;
-  }
-
-  private static long interval(Config rc, String section, String subsection, String keyInterval) {
-    long interval = MISSING_CONFIG;
-    try {
-      interval =
-          ConfigUtil.getTimeUnit(rc, section, subsection, keyInterval, -1, TimeUnit.MILLISECONDS);
-      if (interval == MISSING_CONFIG) {
-        log.info(
-            MessageFormat.format(
-                "{0} schedule parameter \"{0}.{1}\" is not configured", section, keyInterval));
-      }
-    } catch (IllegalArgumentException e) {
-      log.error(
-          MessageFormat.format("Invalid {0} schedule parameter \"{0}.{1}\"", section, keyInterval),
-          e);
-      interval = INVALID_CONFIG;
-    }
-    return interval;
-  }
-
-  private static long initialDelay(
-      Config rc,
-      String section,
-      String subsection,
-      String keyStartTime,
-      DateTime now,
-      long interval) {
-    long delay = MISSING_CONFIG;
-    String start = rc.getString(section, subsection, keyStartTime);
-    try {
-      if (start != null) {
-        DateTimeFormatter formatter;
-        MutableDateTime startTime = now.toMutableDateTime();
-        try {
-          formatter = ISODateTimeFormat.hourMinute();
-          LocalTime firstStartTime = formatter.parseLocalTime(start);
-          startTime.hourOfDay().set(firstStartTime.getHourOfDay());
-          startTime.minuteOfHour().set(firstStartTime.getMinuteOfHour());
-        } catch (IllegalArgumentException e1) {
-          formatter = DateTimeFormat.forPattern("E HH:mm").withLocale(Locale.US);
-          LocalDateTime firstStartDateTime = formatter.parseLocalDateTime(start);
-          startTime.dayOfWeek().set(firstStartDateTime.getDayOfWeek());
-          startTime.hourOfDay().set(firstStartDateTime.getHourOfDay());
-          startTime.minuteOfHour().set(firstStartDateTime.getMinuteOfHour());
-        }
-        startTime.secondOfMinute().set(0);
-        startTime.millisOfSecond().set(0);
-        long s = startTime.getMillis();
-        long n = now.getMillis();
-        delay = (s - n) % interval;
-        if (delay <= 0) {
-          delay += interval;
-        }
-      } else {
-        log.info(
-            MessageFormat.format(
-                "{0} schedule parameter \"{0}.{1}\" is not configured", section, keyStartTime));
-      }
-    } catch (IllegalArgumentException e2) {
-      log.error(
-          MessageFormat.format("Invalid {0} schedule parameter \"{0}.{1}\"", section, keyStartTime),
-          e2);
-      delay = INVALID_CONFIG;
-    }
-    return delay;
-  }
-
-  @Override
-  public String toString() {
-    StringBuilder b = new StringBuilder();
-    b.append(formatValue(keyInterval));
-    b.append(", ");
-    b.append(formatValue(keyStartTime));
-    return b.toString();
-  }
-
-  private String formatValue(String key) {
-    StringBuilder b = new StringBuilder();
-    b.append(section);
-    if (subsection != null) {
-      b.append(".");
-      b.append(subsection);
-    }
-    b.append(".");
-    b.append(key);
-    String value = rc.getString(section, subsection, key);
-    if (value != null) {
-      b.append(" = ");
-      b.append(value);
-    } else {
-      b.append(": NA");
-    }
-    return b.toString();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/SetDiffPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/SetDiffPreferences.java
deleted file mode 100644
index 80c4625..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/SetDiffPreferences.java
+++ /dev/null
@@ -1,106 +0,0 @@
-// 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.
-package com.google.gerrit.server.config;
-
-import static com.google.gerrit.server.config.ConfigUtil.loadSection;
-import static com.google.gerrit.server.config.ConfigUtil.skipField;
-import static com.google.gerrit.server.config.ConfigUtil.storeSection;
-import static com.google.gerrit.server.config.GetDiffPreferences.readFromGit;
-
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
-import com.google.gerrit.extensions.client.DiffPreferencesInfo;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.server.account.VersionedAccountPreferences;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.UserConfigSections;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.lang.reflect.Field;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
-@Singleton
-public class SetDiffPreferences implements RestModifyView<ConfigResource, DiffPreferencesInfo> {
-  private static final Logger log = LoggerFactory.getLogger(SetDiffPreferences.class);
-
-  private final Provider<MetaDataUpdate.User> metaDataUpdateFactory;
-  private final AllUsersName allUsersName;
-  private final GitRepositoryManager gitManager;
-
-  @Inject
-  SetDiffPreferences(
-      GitRepositoryManager gitManager,
-      Provider<MetaDataUpdate.User> metaDataUpdateFactory,
-      AllUsersName allUsersName) {
-    this.gitManager = gitManager;
-    this.metaDataUpdateFactory = metaDataUpdateFactory;
-    this.allUsersName = allUsersName;
-  }
-
-  @Override
-  public DiffPreferencesInfo apply(ConfigResource configResource, DiffPreferencesInfo in)
-      throws BadRequestException, IOException, ConfigInvalidException {
-    if (in == null) {
-      throw new BadRequestException("input must be provided");
-    }
-    if (!hasSetFields(in)) {
-      throw new BadRequestException("unsupported option");
-    }
-    return writeToGit(readFromGit(gitManager, allUsersName, in));
-  }
-
-  private DiffPreferencesInfo writeToGit(DiffPreferencesInfo in)
-      throws RepositoryNotFoundException, IOException, ConfigInvalidException {
-    DiffPreferencesInfo out = new DiffPreferencesInfo();
-    try (MetaDataUpdate md = metaDataUpdateFactory.get().create(allUsersName)) {
-      VersionedAccountPreferences prefs = VersionedAccountPreferences.forDefault();
-      prefs.load(md);
-      DiffPreferencesInfo defaults = DiffPreferencesInfo.defaults();
-      storeSection(prefs.getConfig(), UserConfigSections.DIFF, null, in, defaults);
-      prefs.commit(md);
-      loadSection(
-          prefs.getConfig(),
-          UserConfigSections.DIFF,
-          null,
-          out,
-          DiffPreferencesInfo.defaults(),
-          null);
-    }
-    return out;
-  }
-
-  private static boolean hasSetFields(DiffPreferencesInfo in) {
-    try {
-      for (Field field : in.getClass().getDeclaredFields()) {
-        if (skipField(field)) {
-          continue;
-        }
-        if (field.get(in) != null) {
-          return true;
-        }
-      }
-    } catch (IllegalAccessException e) {
-      log.warn("Unable to verify input", e);
-    }
-    return false;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/SetPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/SetPreferences.java
deleted file mode 100644
index cc96cf0..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/SetPreferences.java
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.config;
-
-import static com.google.gerrit.server.config.ConfigUtil.loadSection;
-import static com.google.gerrit.server.config.ConfigUtil.skipField;
-import static com.google.gerrit.server.config.ConfigUtil.storeSection;
-import static com.google.gerrit.server.config.GetPreferences.readFromGit;
-
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.GeneralPreferencesLoader;
-import com.google.gerrit.server.account.VersionedAccountPreferences;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.UserConfigSections;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.lang.reflect.Field;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
-@Singleton
-public class SetPreferences implements RestModifyView<ConfigResource, GeneralPreferencesInfo> {
-  private static final Logger log = LoggerFactory.getLogger(SetPreferences.class);
-
-  private final GeneralPreferencesLoader loader;
-  private final GitRepositoryManager gitManager;
-  private final Provider<MetaDataUpdate.User> metaDataUpdateFactory;
-  private final AllUsersName allUsersName;
-  private final AccountCache accountCache;
-
-  @Inject
-  SetPreferences(
-      GeneralPreferencesLoader loader,
-      GitRepositoryManager gitManager,
-      Provider<MetaDataUpdate.User> metaDataUpdateFactory,
-      AllUsersName allUsersName,
-      AccountCache accountCache) {
-    this.loader = loader;
-    this.gitManager = gitManager;
-    this.metaDataUpdateFactory = metaDataUpdateFactory;
-    this.allUsersName = allUsersName;
-    this.accountCache = accountCache;
-  }
-
-  @Override
-  public GeneralPreferencesInfo apply(ConfigResource rsrc, GeneralPreferencesInfo i)
-      throws BadRequestException, IOException, ConfigInvalidException {
-    if (!hasSetFields(i)) {
-      throw new BadRequestException("unsupported option");
-    }
-    return writeToGit(readFromGit(gitManager, loader, allUsersName, i));
-  }
-
-  private GeneralPreferencesInfo writeToGit(GeneralPreferencesInfo i)
-      throws RepositoryNotFoundException, IOException, ConfigInvalidException, BadRequestException {
-    try (MetaDataUpdate md = metaDataUpdateFactory.get().create(allUsersName)) {
-      VersionedAccountPreferences p = VersionedAccountPreferences.forDefault();
-      p.load(md);
-      storeSection(
-          p.getConfig(), UserConfigSections.GENERAL, null, i, GeneralPreferencesInfo.defaults());
-      com.google.gerrit.server.account.SetPreferences.storeMyMenus(p, i.my);
-      com.google.gerrit.server.account.SetPreferences.storeUrlAliases(p, i.urlAliases);
-      p.commit(md);
-
-      accountCache.evictAllNoReindex();
-
-      GeneralPreferencesInfo r =
-          loadSection(
-              p.getConfig(),
-              UserConfigSections.GENERAL,
-              null,
-              new GeneralPreferencesInfo(),
-              GeneralPreferencesInfo.defaults(),
-              null);
-      return loader.loadMyMenusAndUrlAliases(r, p, null);
-    }
-  }
-
-  private static boolean hasSetFields(GeneralPreferencesInfo in) {
-    try {
-      for (Field field : in.getClass().getDeclaredFields()) {
-        if (skipField(field)) {
-          continue;
-        }
-        if (field.get(in) != null) {
-          return true;
-        }
-      }
-    } catch (IllegalAccessException e) {
-      log.warn("Unable to verify input", e);
-    }
-    return false;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/SitePaths.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/SitePaths.java
deleted file mode 100644
index 3748bfd..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/SitePaths.java
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.config;
-
-import com.google.common.collect.Iterables;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.nio.file.DirectoryStream;
-import java.nio.file.Files;
-import java.nio.file.NoSuchFileException;
-import java.nio.file.Path;
-
-/** Important paths within a {@link SitePath}. */
-@Singleton
-public final class SitePaths {
-  public static final String CSS_FILENAME = "GerritSite.css";
-  public static final String HEADER_FILENAME = "GerritSiteHeader.html";
-  public static final String FOOTER_FILENAME = "GerritSiteFooter.html";
-  public static final String THEME_FILENAME = "gerrit-theme.html";
-
-  public final Path site_path;
-  public final Path bin_dir;
-  public final Path etc_dir;
-  public final Path lib_dir;
-  public final Path tmp_dir;
-  public final Path logs_dir;
-  public final Path plugins_dir;
-  public final Path db_dir;
-  public final Path data_dir;
-  public final Path mail_dir;
-  public final Path hooks_dir;
-  public final Path static_dir;
-  public final Path themes_dir;
-  public final Path index_dir;
-
-  public final Path gerrit_sh;
-  public final Path gerrit_service;
-  public final Path gerrit_socket;
-  public final Path gerrit_war;
-
-  public final Path gerrit_config;
-  public final Path secure_config;
-  public final Path notedb_config;
-
-  public final Path ssl_keystore;
-  public final Path ssh_key;
-  public final Path ssh_rsa;
-  public final Path ssh_dsa;
-  public final Path ssh_ecdsa_256;
-  public final Path ssh_ecdsa_384;
-  public final Path ssh_ecdsa_521;
-  public final Path ssh_ed25519;
-  public final Path peer_keys;
-
-  public final Path site_css;
-  public final Path site_header;
-  public final Path site_footer;
-  // For PolyGerrit UI only.
-  public final Path site_theme;
-  public final Path site_gitweb;
-
-  /** {@code true} if {@link #site_path} has not been initialized. */
-  public final boolean isNew;
-
-  @Inject
-  public SitePaths(@SitePath Path sitePath) throws IOException {
-    site_path = sitePath;
-    Path p = sitePath;
-
-    bin_dir = p.resolve("bin");
-    etc_dir = p.resolve("etc");
-    lib_dir = p.resolve("lib");
-    tmp_dir = p.resolve("tmp");
-    plugins_dir = p.resolve("plugins");
-    db_dir = p.resolve("db");
-    data_dir = p.resolve("data");
-    logs_dir = p.resolve("logs");
-    mail_dir = etc_dir.resolve("mail");
-    hooks_dir = p.resolve("hooks");
-    static_dir = p.resolve("static");
-    themes_dir = p.resolve("themes");
-    index_dir = p.resolve("index");
-
-    gerrit_sh = bin_dir.resolve("gerrit.sh");
-    gerrit_service = bin_dir.resolve("gerrit.service");
-    gerrit_socket = bin_dir.resolve("gerrit.socket");
-    gerrit_war = bin_dir.resolve("gerrit.war");
-
-    gerrit_config = etc_dir.resolve("gerrit.config");
-    secure_config = etc_dir.resolve("secure.config");
-    notedb_config = etc_dir.resolve("notedb.config");
-
-    ssl_keystore = etc_dir.resolve("keystore");
-    ssh_key = etc_dir.resolve("ssh_host_key");
-    ssh_rsa = etc_dir.resolve("ssh_host_rsa_key");
-    ssh_dsa = etc_dir.resolve("ssh_host_dsa_key");
-    ssh_ecdsa_256 = etc_dir.resolve("ssh_host_ecdsa_key");
-    ssh_ecdsa_384 = etc_dir.resolve("ssh_host_ecdsa_384_key");
-    ssh_ecdsa_521 = etc_dir.resolve("ssh_host_ecdsa_521_key");
-    ssh_ed25519 = etc_dir.resolve("ssh_host_ed25519_key");
-    peer_keys = etc_dir.resolve("peer_keys");
-
-    site_css = etc_dir.resolve(CSS_FILENAME);
-    site_header = etc_dir.resolve(HEADER_FILENAME);
-    site_footer = etc_dir.resolve(FOOTER_FILENAME);
-    site_gitweb = etc_dir.resolve("gitweb_config.perl");
-
-    // For PolyGerrit UI.
-    site_theme = static_dir.resolve(THEME_FILENAME);
-
-    boolean isNew;
-    try (DirectoryStream<Path> files = Files.newDirectoryStream(site_path)) {
-      isNew = Iterables.isEmpty(files);
-    } catch (NoSuchFileException e) {
-      isNew = true;
-    }
-    this.isNew = isNew;
-  }
-
-  /**
-   * Resolve an absolute or relative path.
-   *
-   * <p>Relative paths are resolved relative to the {@link #site_path}.
-   *
-   * @param path the path string to resolve. May be null.
-   * @return the resolved path; null if {@code path} was null or empty.
-   */
-  public Path resolve(String path) {
-    if (path != null && !path.isEmpty()) {
-      Path loc = site_path.resolve(path).normalize();
-      try {
-        return loc.toRealPath();
-      } catch (IOException e) {
-        return loc.toAbsolutePath();
-      }
-    }
-    return null;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/TasksCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/TasksCollection.java
deleted file mode 100644
index fcaee8e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/TasksCollection.java
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.config;
-
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ChildCollection;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.git.WorkQueue;
-import com.google.gerrit.server.git.WorkQueue.ProjectTask;
-import com.google.gerrit.server.git.WorkQueue.Task;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.ProjectPermission;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-
-@Singleton
-public class TasksCollection implements ChildCollection<ConfigResource, TaskResource> {
-  private final DynamicMap<RestView<TaskResource>> views;
-  private final ListTasks list;
-  private final WorkQueue workQueue;
-  private final Provider<CurrentUser> self;
-  private final PermissionBackend permissionBackend;
-
-  @Inject
-  TasksCollection(
-      DynamicMap<RestView<TaskResource>> views,
-      ListTasks list,
-      WorkQueue workQueue,
-      Provider<CurrentUser> self,
-      PermissionBackend permissionBackend) {
-    this.views = views;
-    this.list = list;
-    this.workQueue = workQueue;
-    this.self = self;
-    this.permissionBackend = permissionBackend;
-  }
-
-  @Override
-  public RestView<ConfigResource> list() {
-    return list;
-  }
-
-  @Override
-  public TaskResource parse(ConfigResource parent, IdString id)
-      throws ResourceNotFoundException, AuthException, PermissionBackendException {
-    CurrentUser user = self.get();
-    if (!user.isIdentifiedUser()) {
-      throw new AuthException("Authentication required");
-    }
-
-    int taskId;
-    try {
-      taskId = (int) Long.parseLong(id.get(), 16);
-    } catch (NumberFormatException e) {
-      throw new ResourceNotFoundException(id);
-    }
-
-    Task<?> task = workQueue.getTask(taskId);
-    if (task instanceof ProjectTask) {
-      try {
-        permissionBackend
-            .user(user)
-            .project(((ProjectTask<?>) task).getProjectNameKey())
-            .check(ProjectPermission.ACCESS);
-        return new TaskResource(task);
-      } catch (AuthException e) {
-        // Fall through and try view queue permission.
-      }
-    }
-
-    if (task != null) {
-      try {
-        permissionBackend.user(user).check(GlobalPermission.VIEW_QUEUE);
-        return new TaskResource(task);
-      } catch (AuthException e) {
-        // Fall through and return not found.
-      }
-    }
-
-    throw new ResourceNotFoundException(id);
-  }
-
-  @Override
-  public DynamicMap<RestView<TaskResource>> views() {
-    return views;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/TopMenuCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/TopMenuCollection.java
deleted file mode 100644
index 2fc2dc1..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/TopMenuCollection.java
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.config;
-
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.ChildCollection;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-@Singleton
-class TopMenuCollection implements ChildCollection<ConfigResource, TopMenuResource> {
-  private final DynamicMap<RestView<TopMenuResource>> views;
-  private final ListTopMenus list;
-
-  @Inject
-  TopMenuCollection(DynamicMap<RestView<TopMenuResource>> views, ListTopMenus list) {
-    this.views = views;
-    this.list = list;
-  }
-
-  @Override
-  public RestView<ConfigResource> list() throws ResourceNotFoundException {
-    return list;
-  }
-
-  @Override
-  public TopMenuResource parse(ConfigResource parent, IdString id)
-      throws ResourceNotFoundException {
-    throw new ResourceNotFoundException(id);
-  }
-
-  @Override
-  public DynamicMap<RestView<TopMenuResource>> views() {
-    return views;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/TrackingFootersProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/TrackingFootersProvider.java
deleted file mode 100644
index 7b23fcc..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/TrackingFootersProvider.java
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.server.config;
-
-import com.google.gerrit.reviewdb.client.TrackingId;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.regex.PatternSyntaxException;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Provides a list of all configured {@link TrackingFooter}s. */
-@Singleton
-public class TrackingFootersProvider implements Provider<TrackingFooters> {
-  private static String TRACKING_ID_TAG = "trackingid";
-  private static String FOOTER_TAG = "footer";
-  private static String SYSTEM_TAG = "system";
-  private static String REGEX_TAG = "match";
-  private final List<TrackingFooter> trackingFooters = new ArrayList<>();
-  private static final Logger log = LoggerFactory.getLogger(TrackingFootersProvider.class);
-
-  @Inject
-  TrackingFootersProvider(@GerritServerConfig Config cfg) {
-    for (String name : cfg.getSubsections(TRACKING_ID_TAG)) {
-      boolean configValid = true;
-
-      Set<String> footers =
-          new HashSet<>(Arrays.asList(cfg.getStringList(TRACKING_ID_TAG, name, FOOTER_TAG)));
-      footers.removeAll(Collections.singleton(null));
-
-      if (footers.isEmpty()) {
-        configValid = false;
-        log.error(
-            "Missing " + TRACKING_ID_TAG + "." + name + "." + FOOTER_TAG + " in gerrit.config");
-      }
-
-      String system = cfg.getString(TRACKING_ID_TAG, name, SYSTEM_TAG);
-      if (system == null || system.isEmpty()) {
-        configValid = false;
-        log.error(
-            "Missing " + TRACKING_ID_TAG + "." + name + "." + SYSTEM_TAG + " in gerrit.config");
-      } else if (system.length() > TrackingId.TRACKING_SYSTEM_MAX_CHAR) {
-        configValid = false;
-        log.error(
-            "String too long \""
-                + system
-                + "\" in gerrit.config "
-                + TRACKING_ID_TAG
-                + "."
-                + name
-                + "."
-                + SYSTEM_TAG
-                + " (max "
-                + TrackingId.TRACKING_SYSTEM_MAX_CHAR
-                + " char)");
-      }
-
-      String match = cfg.getString(TRACKING_ID_TAG, name, REGEX_TAG);
-      if (match == null || match.isEmpty()) {
-        configValid = false;
-        log.error(
-            "Missing " + TRACKING_ID_TAG + "." + name + "." + REGEX_TAG + " in gerrit.config");
-      }
-
-      if (configValid) {
-        try {
-          for (String footer : footers) {
-            trackingFooters.add(new TrackingFooter(footer, match, system));
-          }
-        } catch (PatternSyntaxException e) {
-          log.error(
-              "Invalid pattern \""
-                  + match
-                  + "\" in gerrit.config "
-                  + TRACKING_ID_TAG
-                  + "."
-                  + name
-                  + "."
-                  + REGEX_TAG
-                  + ": "
-                  + e.getMessage());
-        }
-      }
-    }
-  }
-
-  @Override
-  public TrackingFooters get() {
-    return new TrackingFooters(trackingFooters);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/data/ChangeAttribute.java b/gerrit-server/src/main/java/com/google/gerrit/server/data/ChangeAttribute.java
deleted file mode 100644
index ec76f50..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/data/ChangeAttribute.java
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.server.data;
-
-import com.google.gerrit.extensions.common.PluginDefinedInfo;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gson.annotations.SerializedName;
-import java.util.List;
-
-public class ChangeAttribute {
-  public String project;
-  public String branch;
-  public String topic;
-  public String id;
-  public int number;
-  public String subject;
-  public AccountAttribute owner;
-  public AccountAttribute assignee;
-  public String url;
-  public String commitMessage;
-
-  public Long createdOn;
-  public Long lastUpdated;
-  public Boolean open;
-  public Change.Status status;
-  public List<MessageAttribute> comments;
-  public Boolean wip;
-
-  @SerializedName("private")
-  public Boolean isPrivate;
-
-  public List<TrackingIdAttribute> trackingIds;
-  public PatchSetAttribute currentPatchSet;
-  public List<PatchSetAttribute> patchSets;
-
-  public List<DependencyAttribute> dependsOn;
-  public List<DependencyAttribute> neededBy;
-  public List<SubmitRecordAttribute> submitRecords;
-  public List<AccountAttribute> allReviewers;
-  public List<PluginDefinedInfo> plugins;
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/data/SubmitLabelAttribute.java b/gerrit-server/src/main/java/com/google/gerrit/server/data/SubmitLabelAttribute.java
deleted file mode 100644
index 1b3c6a48..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/data/SubmitLabelAttribute.java
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.data;
-
-public class SubmitLabelAttribute {
-  public String label;
-  public String status;
-  public AccountAttribute by;
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/data/SubmitRecordAttribute.java b/gerrit-server/src/main/java/com/google/gerrit/server/data/SubmitRecordAttribute.java
deleted file mode 100644
index fec870f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/data/SubmitRecordAttribute.java
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.data;
-
-import java.util.List;
-
-public class SubmitRecordAttribute {
-  public String status;
-  public List<SubmitLabelAttribute> labels;
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/documentation/MarkdownFormatter.java b/gerrit-server/src/main/java/com/google/gerrit/server/documentation/MarkdownFormatter.java
deleted file mode 100644
index 68d2a34..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/documentation/MarkdownFormatter.java
+++ /dev/null
@@ -1,158 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.documentation;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.pegdown.Extensions.ALL;
-import static org.pegdown.Extensions.HARDWRAPS;
-import static org.pegdown.Extensions.SUPPRESS_ALL_HTML;
-
-import com.google.common.base.Strings;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.net.URL;
-import java.nio.charset.Charset;
-import java.util.concurrent.atomic.AtomicBoolean;
-import org.apache.commons.lang.StringEscapeUtils;
-import org.eclipse.jgit.util.RawParseUtils;
-import org.eclipse.jgit.util.TemporaryBuffer;
-import org.pegdown.LinkRenderer;
-import org.pegdown.PegDownProcessor;
-import org.pegdown.ToHtmlSerializer;
-import org.pegdown.ast.HeaderNode;
-import org.pegdown.ast.Node;
-import org.pegdown.ast.RootNode;
-import org.pegdown.ast.TextNode;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class MarkdownFormatter {
-  private static final Logger log = LoggerFactory.getLogger(MarkdownFormatter.class);
-
-  private static final String defaultCss;
-
-  static {
-    AtomicBoolean file = new AtomicBoolean();
-    String src;
-    try {
-      src = readPegdownCss(file);
-    } catch (IOException err) {
-      log.warn("Cannot load pegdown.css", err);
-      src = "";
-    }
-    defaultCss = file.get() ? null : src;
-  }
-
-  private static String readCSS() {
-    if (defaultCss != null) {
-      return defaultCss;
-    }
-    try {
-      return readPegdownCss(new AtomicBoolean());
-    } catch (IOException err) {
-      log.warn("Cannot load pegdown.css", err);
-      return "";
-    }
-  }
-
-  private boolean suppressHtml;
-  private String css;
-
-  public MarkdownFormatter suppressHtml() {
-    suppressHtml = true;
-    return this;
-  }
-
-  public MarkdownFormatter setCss(String css) {
-    this.css = StringEscapeUtils.escapeHtml(css);
-    return this;
-  }
-
-  public byte[] markdownToDocHtml(String md, String charEnc) throws UnsupportedEncodingException {
-    RootNode root = parseMarkdown(md);
-    String title = findTitle(root);
-
-    StringBuilder html = new StringBuilder();
-    html.append("<html>");
-    html.append("<head>");
-    if (!Strings.isNullOrEmpty(title)) {
-      html.append("<title>").append(title).append("</title>");
-    }
-    html.append("<style type=\"text/css\">\n");
-    if (css != null) {
-      html.append(css);
-    } else {
-      html.append(readCSS());
-    }
-    html.append("\n</style>");
-    html.append("</head>");
-    html.append("<body>\n");
-    html.append(new ToHtmlSerializer(new LinkRenderer()).toHtml(root));
-    html.append("\n</body></html>");
-    return html.toString().getBytes(charEnc);
-  }
-
-  public String extractTitleFromMarkdown(byte[] data, String charEnc) {
-    String md = RawParseUtils.decode(Charset.forName(charEnc), data);
-    return findTitle(parseMarkdown(md));
-  }
-
-  private String findTitle(Node root) {
-    if (root instanceof HeaderNode) {
-      HeaderNode h = (HeaderNode) root;
-      if (h.getLevel() == 1 && h.getChildren() != null && !h.getChildren().isEmpty()) {
-        StringBuilder b = new StringBuilder();
-        for (Node n : root.getChildren()) {
-          if (n instanceof TextNode) {
-            b.append(((TextNode) n).getText());
-          }
-        }
-        return b.toString();
-      }
-    }
-
-    for (Node n : root.getChildren()) {
-      String title = findTitle(n);
-      if (title != null) {
-        return title;
-      }
-    }
-    return null;
-  }
-
-  private RootNode parseMarkdown(String md) {
-    int options = ALL & ~(HARDWRAPS);
-    if (suppressHtml) {
-      options |= SUPPRESS_ALL_HTML;
-    }
-    return new PegDownProcessor(options).parseMarkdown(md.toCharArray());
-  }
-
-  private static String readPegdownCss(AtomicBoolean file) throws IOException {
-    String name = "pegdown.css";
-    URL url = MarkdownFormatter.class.getResource(name);
-    if (url == null) {
-      throw new FileNotFoundException("Resource " + name);
-    }
-    file.set("file".equals(url.getProtocol()));
-    try (InputStream in = url.openStream();
-        TemporaryBuffer.Heap tmp = new TemporaryBuffer.Heap(128 * 1024)) {
-      tmp.copy(in);
-      return new String(tmp.toByteArray(), UTF_8);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/documentation/QueryDocumentationExecutor.java b/gerrit-server/src/main/java/com/google/gerrit/server/documentation/QueryDocumentationExecutor.java
deleted file mode 100644
index 73c2b5e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/documentation/QueryDocumentationExecutor.java
+++ /dev/null
@@ -1,150 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.documentation;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Lists;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.Map;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-import org.apache.lucene.analysis.standard.StandardAnalyzer;
-import org.apache.lucene.document.Document;
-import org.apache.lucene.index.DirectoryReader;
-import org.apache.lucene.index.IndexReader;
-import org.apache.lucene.queryparser.simple.SimpleQueryParser;
-import org.apache.lucene.search.IndexSearcher;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.search.ScoreDoc;
-import org.apache.lucene.search.TopDocs;
-import org.apache.lucene.store.Directory;
-import org.apache.lucene.store.IndexOutput;
-import org.apache.lucene.store.RAMDirectory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class QueryDocumentationExecutor {
-  private static final Logger log = LoggerFactory.getLogger(QueryDocumentationExecutor.class);
-
-  private static Map<String, Float> WEIGHTS =
-      ImmutableMap.of(
-          Constants.TITLE_FIELD, 2.0f,
-          Constants.DOC_FIELD, 1.0f);
-
-  private IndexSearcher searcher;
-  private SimpleQueryParser parser;
-
-  public static class DocResult {
-    public String title;
-    public String url;
-    public String content;
-  }
-
-  @Inject
-  public QueryDocumentationExecutor() {
-    try {
-      Directory dir = readIndexDirectory();
-      if (dir == null) {
-        searcher = null;
-        parser = null;
-        return;
-      }
-      IndexReader reader = DirectoryReader.open(dir);
-      searcher = new IndexSearcher(reader);
-      parser = new SimpleQueryParser(new StandardAnalyzer(), WEIGHTS);
-    } catch (IOException e) {
-      log.error("Cannot initialize documentation full text index", e);
-      searcher = null;
-      parser = null;
-    }
-  }
-
-  public List<DocResult> doQuery(String q) throws DocQueryException {
-    if (!isAvailable()) {
-      throw new DocQueryException("Documentation search not available");
-    }
-    Query query = parser.parse(q);
-    try {
-      // TODO(fishywang): Currently as we don't have much documentation, we just use MAX_VALUE here
-      // and skipped paging. Maybe add paging later.
-      TopDocs results = searcher.search(query, Integer.MAX_VALUE);
-      ScoreDoc[] hits = results.scoreDocs;
-      int totalHits = results.totalHits;
-
-      List<DocResult> out = Lists.newArrayListWithCapacity(totalHits);
-      for (int i = 0; i < totalHits; i++) {
-        DocResult result = new DocResult();
-        Document doc = searcher.doc(hits[i].doc);
-        result.url = doc.get(Constants.URL_FIELD);
-        result.title = doc.get(Constants.TITLE_FIELD);
-        out.add(result);
-      }
-      return out;
-    } catch (IOException e) {
-      throw new DocQueryException(e);
-    }
-  }
-
-  protected Directory readIndexDirectory() throws IOException {
-    Directory dir = new RAMDirectory();
-    byte[] buffer = new byte[4096];
-    InputStream index = getClass().getResourceAsStream(Constants.INDEX_ZIP);
-    if (index == null) {
-      log.warn("No index available");
-      return null;
-    }
-
-    try (ZipInputStream zip = new ZipInputStream(index)) {
-      ZipEntry entry;
-      while ((entry = zip.getNextEntry()) != null) {
-        try (IndexOutput out = dir.createOutput(entry.getName(), null)) {
-          int count;
-          while ((count = zip.read(buffer)) != -1) {
-            out.writeBytes(buffer, count);
-          }
-        }
-      }
-    }
-    // We must NOT call dir.close() here, as DirectoryReader.open() expects an opened directory.
-    return dir;
-  }
-
-  public boolean isAvailable() {
-    return parser != null && searcher != null;
-  }
-
-  public static class DocQueryException extends Exception {
-    private static final long serialVersionUID = 1L;
-
-    DocQueryException() {}
-
-    DocQueryException(String msg) {
-      super(msg);
-    }
-
-    DocQueryException(String msg, Throwable e) {
-      super(msg, e);
-    }
-
-    DocQueryException(Throwable e) {
-      super(e);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEdit.java b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEdit.java
deleted file mode 100644
index e641abc..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEdit.java
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.edit;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import org.eclipse.jgit.revwalk.RevCommit;
-
-/**
- * A single user's edit for a change.
- *
- * <p>There is max. one edit per user per change. Edits are stored on refs:
- * refs/users/UU/UUUU/edit-CCCC/P where UU/UUUU is sharded representation of user account, CCCC is
- * change number and P is the patch set number it is based on.
- */
-public class ChangeEdit {
-  private final Change change;
-  private final String editRefName;
-  private final RevCommit editCommit;
-  private final PatchSet basePatchSet;
-
-  public ChangeEdit(
-      Change change, String editRefName, RevCommit editCommit, PatchSet basePatchSet) {
-    this.change = checkNotNull(change);
-    this.editRefName = checkNotNull(editRefName);
-    this.editCommit = checkNotNull(editCommit);
-    this.basePatchSet = checkNotNull(basePatchSet);
-  }
-
-  public Change getChange() {
-    return change;
-  }
-
-  public String getRefName() {
-    return editRefName;
-  }
-
-  public RevCommit getEditCommit() {
-    return editCommit;
-  }
-
-  public PatchSet getBasePatchSet() {
-    return basePatchSet;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditJson.java b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditJson.java
deleted file mode 100644
index 1024c62..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditJson.java
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.edit;
-
-import com.google.gerrit.extensions.common.CommitInfo;
-import com.google.gerrit.extensions.common.EditInfo;
-import com.google.gerrit.extensions.common.FetchInfo;
-import com.google.gerrit.extensions.config.DownloadCommand;
-import com.google.gerrit.extensions.config.DownloadScheme;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.server.CommonConverters;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.change.ChangeJson;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import org.eclipse.jgit.revwalk.RevCommit;
-
-@Singleton
-public class ChangeEditJson {
-  private final DynamicMap<DownloadCommand> downloadCommands;
-  private final DynamicMap<DownloadScheme> downloadSchemes;
-  private final Provider<CurrentUser> userProvider;
-
-  @Inject
-  ChangeEditJson(
-      DynamicMap<DownloadCommand> downloadCommand,
-      DynamicMap<DownloadScheme> downloadSchemes,
-      Provider<CurrentUser> userProvider) {
-    this.downloadCommands = downloadCommand;
-    this.downloadSchemes = downloadSchemes;
-    this.userProvider = userProvider;
-  }
-
-  public EditInfo toEditInfo(ChangeEdit edit, boolean downloadCommands) {
-    EditInfo out = new EditInfo();
-    out.commit = fillCommit(edit.getEditCommit());
-    out.baseRevision = edit.getBasePatchSet().getRevision().get();
-    out.basePatchSetNumber = edit.getBasePatchSet().getPatchSetId();
-    out.ref = edit.getRefName();
-    if (downloadCommands) {
-      out.fetch = fillFetchMap(edit);
-    }
-    return out;
-  }
-
-  private static CommitInfo fillCommit(RevCommit editCommit) {
-    CommitInfo commit = new CommitInfo();
-    commit.commit = editCommit.toObjectId().getName();
-    commit.author = CommonConverters.toGitPerson(editCommit.getAuthorIdent());
-    commit.committer = CommonConverters.toGitPerson(editCommit.getCommitterIdent());
-    commit.subject = editCommit.getShortMessage();
-    commit.message = editCommit.getFullMessage();
-
-    commit.parents = new ArrayList<>(editCommit.getParentCount());
-    for (RevCommit p : editCommit.getParents()) {
-      CommitInfo i = new CommitInfo();
-      i.commit = p.name();
-      commit.parents.add(i);
-    }
-
-    return commit;
-  }
-
-  private Map<String, FetchInfo> fillFetchMap(ChangeEdit edit) {
-    Map<String, FetchInfo> r = new LinkedHashMap<>();
-    for (DynamicMap.Entry<DownloadScheme> e : downloadSchemes) {
-      String schemeName = e.getExportName();
-      DownloadScheme scheme = e.getProvider().get();
-      if (!scheme.isEnabled()
-          || (scheme.isAuthRequired() && !userProvider.get().isIdentifiedUser())) {
-        continue;
-      }
-
-      // No fluff, just stuff
-      if (!scheme.isAuthSupported()) {
-        continue;
-      }
-
-      String projectName = edit.getChange().getProject().get();
-      String refName = edit.getRefName();
-      FetchInfo fetchInfo = new FetchInfo(scheme.getUrl(projectName), refName);
-      r.put(schemeName, fetchInfo);
-
-      ChangeJson.populateFetchMap(scheme, downloadCommands, projectName, refName, fetchInfo);
-    }
-
-    return r;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java
deleted file mode 100644
index 82fa596..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java
+++ /dev/null
@@ -1,612 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.edit;
-
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.MergeConflictException;
-import com.google.gerrit.extensions.restapi.RawInput;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.edit.tree.ChangeFileContentModification;
-import com.google.gerrit.server.edit.tree.DeleteFileModification;
-import com.google.gerrit.server.edit.tree.RenameFileModification;
-import com.google.gerrit.server.edit.tree.RestoreFileModification;
-import com.google.gerrit.server.edit.tree.TreeCreator;
-import com.google.gerrit.server.edit.tree.TreeModification;
-import com.google.gerrit.server.index.change.ChangeIndexer;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.InvalidChangeOperationException;
-import com.google.gerrit.server.util.CommitMessageUtil;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.List;
-import java.util.Optional;
-import java.util.TimeZone;
-import org.eclipse.jgit.lib.BatchRefUpdate;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.NullProgressMonitor;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.merge.MergeStrategy;
-import org.eclipse.jgit.merge.ThreeWayMerger;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevTree;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.ReceiveCommand;
-
-/**
- * Utility functions to manipulate change edits.
- *
- * <p>This class contains methods to modify edit's content. For retrieving, publishing and deleting
- * edit see {@link ChangeEditUtil}.
- *
- * <p>
- */
-@Singleton
-public class ChangeEditModifier {
-
-  private final TimeZone tz;
-  private final ChangeIndexer indexer;
-  private final Provider<ReviewDb> reviewDb;
-  private final Provider<CurrentUser> currentUser;
-  private final PermissionBackend permissionBackend;
-  private final ChangeEditUtil changeEditUtil;
-  private final PatchSetUtil patchSetUtil;
-
-  @Inject
-  ChangeEditModifier(
-      @GerritPersonIdent PersonIdent gerritIdent,
-      ChangeIndexer indexer,
-      Provider<ReviewDb> reviewDb,
-      Provider<CurrentUser> currentUser,
-      PermissionBackend permissionBackend,
-      ChangeEditUtil changeEditUtil,
-      PatchSetUtil patchSetUtil) {
-    this.indexer = indexer;
-    this.reviewDb = reviewDb;
-    this.currentUser = currentUser;
-    this.permissionBackend = permissionBackend;
-    this.tz = gerritIdent.getTimeZone();
-    this.changeEditUtil = changeEditUtil;
-    this.patchSetUtil = patchSetUtil;
-  }
-
-  /**
-   * Creates a new change edit.
-   *
-   * @param repository the affected Git repository
-   * @param notes the {@link ChangeNotes} of the change for which the change edit should be created
-   * @throws AuthException if the user isn't authenticated or not allowed to use change edits
-   * @throws InvalidChangeOperationException if a change edit already existed for the change
-   * @throws PermissionBackendException
-   */
-  public void createEdit(Repository repository, ChangeNotes notes)
-      throws AuthException, IOException, InvalidChangeOperationException, OrmException,
-          PermissionBackendException {
-    assertCanEdit(notes);
-
-    Optional<ChangeEdit> changeEdit = lookupChangeEdit(notes);
-    if (changeEdit.isPresent()) {
-      throw new InvalidChangeOperationException(
-          String.format("A change edit already exists for change %s", notes.getChangeId()));
-    }
-
-    PatchSet currentPatchSet = lookupCurrentPatchSet(notes);
-    ObjectId patchSetCommitId = getPatchSetCommitId(currentPatchSet);
-    createEdit(repository, notes, currentPatchSet, patchSetCommitId, TimeUtil.nowTs());
-  }
-
-  /**
-   * Rebase change edit on latest patch set
-   *
-   * @param repository the affected Git repository
-   * @param notes the {@link ChangeNotes} of the change whose change edit should be rebased
-   * @throws AuthException if the user isn't authenticated or not allowed to use change edits
-   * @throws InvalidChangeOperationException if a change edit doesn't exist for the specified
-   *     change, the change edit is already based on the latest patch set, or the change represents
-   *     the root commit
-   * @throws MergeConflictException if rebase fails due to merge conflicts
-   * @throws PermissionBackendException
-   */
-  public void rebaseEdit(Repository repository, ChangeNotes notes)
-      throws AuthException, InvalidChangeOperationException, IOException, OrmException,
-          MergeConflictException, PermissionBackendException {
-    assertCanEdit(notes);
-
-    Optional<ChangeEdit> optionalChangeEdit = lookupChangeEdit(notes);
-    if (!optionalChangeEdit.isPresent()) {
-      throw new InvalidChangeOperationException(
-          String.format("No change edit exists for change %s", notes.getChangeId()));
-    }
-    ChangeEdit changeEdit = optionalChangeEdit.get();
-
-    PatchSet currentPatchSet = lookupCurrentPatchSet(notes);
-    if (isBasedOn(changeEdit, currentPatchSet)) {
-      throw new InvalidChangeOperationException(
-          String.format(
-              "Change edit for change %s is already based on latest patch set %s",
-              notes.getChangeId(), currentPatchSet.getId()));
-    }
-
-    rebase(repository, changeEdit, currentPatchSet);
-  }
-
-  private void rebase(Repository repository, ChangeEdit changeEdit, PatchSet currentPatchSet)
-      throws IOException, MergeConflictException, InvalidChangeOperationException, OrmException {
-    RevCommit currentEditCommit = changeEdit.getEditCommit();
-    if (currentEditCommit.getParentCount() == 0) {
-      throw new InvalidChangeOperationException(
-          "Rebase change edit against root commit not supported");
-    }
-
-    Change change = changeEdit.getChange();
-    RevCommit basePatchSetCommit = lookupCommit(repository, currentPatchSet);
-    RevTree basePatchSetTree = basePatchSetCommit.getTree();
-
-    ObjectId newTreeId = merge(repository, changeEdit, basePatchSetTree);
-    Timestamp nowTimestamp = TimeUtil.nowTs();
-    String commitMessage = currentEditCommit.getFullMessage();
-    ObjectId newEditCommitId =
-        createCommit(repository, basePatchSetCommit, newTreeId, commitMessage, nowTimestamp);
-
-    String newEditRefName = getEditRefName(change, currentPatchSet);
-    updateReferenceWithNameChange(
-        repository,
-        changeEdit.getRefName(),
-        currentEditCommit,
-        newEditRefName,
-        newEditCommitId,
-        nowTimestamp);
-    reindex(change);
-  }
-
-  /**
-   * Modifies the commit message of a change edit. If the change edit doesn't exist, a new one will
-   * be created based on the current patch set.
-   *
-   * @param repository the affected Git repository
-   * @param notes the {@link ChangeNotes} of the change whose change edit's message should be
-   *     modified
-   * @param newCommitMessage the new commit message
-   * @throws AuthException if the user isn't authenticated or not allowed to use change edits
-   * @throws UnchangedCommitMessageException if the commit message is the same as before
-   * @throws PermissionBackendException
-   * @throws BadRequestException if the commit message is malformed
-   */
-  public void modifyMessage(Repository repository, ChangeNotes notes, String newCommitMessage)
-      throws AuthException, IOException, UnchangedCommitMessageException, OrmException,
-          PermissionBackendException, BadRequestException {
-    assertCanEdit(notes);
-    newCommitMessage = CommitMessageUtil.checkAndSanitizeCommitMessage(newCommitMessage);
-
-    Optional<ChangeEdit> optionalChangeEdit = lookupChangeEdit(notes);
-    PatchSet basePatchSet = getBasePatchSet(optionalChangeEdit, notes);
-    RevCommit basePatchSetCommit = lookupCommit(repository, basePatchSet);
-    RevCommit baseCommit =
-        optionalChangeEdit.map(ChangeEdit::getEditCommit).orElse(basePatchSetCommit);
-
-    String currentCommitMessage = baseCommit.getFullMessage();
-    if (newCommitMessage.equals(currentCommitMessage)) {
-      throw new UnchangedCommitMessageException();
-    }
-
-    RevTree baseTree = baseCommit.getTree();
-    Timestamp nowTimestamp = TimeUtil.nowTs();
-    ObjectId newEditCommit =
-        createCommit(repository, basePatchSetCommit, baseTree, newCommitMessage, nowTimestamp);
-
-    if (optionalChangeEdit.isPresent()) {
-      updateEdit(repository, optionalChangeEdit.get(), newEditCommit, nowTimestamp);
-    } else {
-      createEdit(repository, notes, basePatchSet, newEditCommit, nowTimestamp);
-    }
-  }
-
-  /**
-   * Modifies the contents of a file of a change edit. If the change edit doesn't exist, a new one
-   * will be created based on the current patch set.
-   *
-   * @param repository the affected Git repository
-   * @param notes the {@link ChangeNotes} of the change whose change edit should be modified
-   * @param filePath the path of the file whose contents should be modified
-   * @param newContent the new file content
-   * @throws AuthException if the user isn't authenticated or not allowed to use change edits
-   * @throws InvalidChangeOperationException if the file already had the specified content
-   * @throws PermissionBackendException
-   */
-  public void modifyFile(
-      Repository repository, ChangeNotes notes, String filePath, RawInput newContent)
-      throws AuthException, InvalidChangeOperationException, IOException, OrmException,
-          PermissionBackendException {
-    modifyTree(repository, notes, new ChangeFileContentModification(filePath, newContent));
-  }
-
-  /**
-   * Deletes a file from the Git tree of a change edit. If the change edit doesn't exist, a new one
-   * will be created based on the current patch set.
-   *
-   * @param repository the affected Git repository
-   * @param notes the {@link ChangeNotes} of the change whose change edit should be modified
-   * @param file path of the file which should be deleted
-   * @throws AuthException if the user isn't authenticated or not allowed to use change edits
-   * @throws InvalidChangeOperationException if the file does not exist
-   * @throws PermissionBackendException
-   */
-  public void deleteFile(Repository repository, ChangeNotes notes, String file)
-      throws AuthException, InvalidChangeOperationException, IOException, OrmException,
-          PermissionBackendException {
-    modifyTree(repository, notes, new DeleteFileModification(file));
-  }
-
-  /**
-   * Renames a file of a change edit or moves it to another directory. If the change edit doesn't
-   * exist, a new one will be created based on the current patch set.
-   *
-   * @param repository the affected Git repository
-   * @param notes the {@link ChangeNotes} of the change whose change edit should be modified
-   * @param currentFilePath the current path/name of the file
-   * @param newFilePath the desired path/name of the file
-   * @throws AuthException if the user isn't authenticated or not allowed to use change edits
-   * @throws InvalidChangeOperationException if the file was already renamed to the specified new
-   *     name
-   * @throws PermissionBackendException
-   */
-  public void renameFile(
-      Repository repository, ChangeNotes notes, String currentFilePath, String newFilePath)
-      throws AuthException, InvalidChangeOperationException, IOException, OrmException,
-          PermissionBackendException {
-    modifyTree(repository, notes, new RenameFileModification(currentFilePath, newFilePath));
-  }
-
-  /**
-   * Restores a file of a change edit to the state it was in before the patch set on which the
-   * change edit is based. If the change edit doesn't exist, a new one will be created based on the
-   * current patch set.
-   *
-   * @param repository the affected Git repository
-   * @param notes the {@link ChangeNotes} of the change whose change edit should be modified
-   * @param file the path of the file which should be restored
-   * @throws AuthException if the user isn't authenticated or not allowed to use change edits
-   * @throws InvalidChangeOperationException if the file was already restored
-   * @throws PermissionBackendException
-   */
-  public void restoreFile(Repository repository, ChangeNotes notes, String file)
-      throws AuthException, InvalidChangeOperationException, IOException, OrmException,
-          PermissionBackendException {
-    modifyTree(repository, notes, new RestoreFileModification(file));
-  }
-
-  private void modifyTree(
-      Repository repository, ChangeNotes notes, TreeModification treeModification)
-      throws AuthException, IOException, OrmException, InvalidChangeOperationException,
-          PermissionBackendException {
-    assertCanEdit(notes);
-
-    Optional<ChangeEdit> optionalChangeEdit = lookupChangeEdit(notes);
-    PatchSet basePatchSet = getBasePatchSet(optionalChangeEdit, notes);
-    RevCommit basePatchSetCommit = lookupCommit(repository, basePatchSet);
-    RevCommit baseCommit =
-        optionalChangeEdit.map(ChangeEdit::getEditCommit).orElse(basePatchSetCommit);
-
-    ObjectId newTreeId = createNewTree(repository, baseCommit, ImmutableList.of(treeModification));
-
-    String commitMessage = baseCommit.getFullMessage();
-    Timestamp nowTimestamp = TimeUtil.nowTs();
-    ObjectId newEditCommit =
-        createCommit(repository, basePatchSetCommit, newTreeId, commitMessage, nowTimestamp);
-
-    if (optionalChangeEdit.isPresent()) {
-      updateEdit(repository, optionalChangeEdit.get(), newEditCommit, nowTimestamp);
-    } else {
-      createEdit(repository, notes, basePatchSet, newEditCommit, nowTimestamp);
-    }
-  }
-
-  /**
-   * Applies the indicated modifications to the specified patch set. If a change edit exists and is
-   * based on the same patch set, the modified patch set tree is merged with the change edit. If the
-   * change edit doesn't exist, a new one will be created.
-   *
-   * @param repository the affected Git repository
-   * @param notes the {@link ChangeNotes} of the change to which the patch set belongs
-   * @param patchSet the {@code PatchSet} which should be modified
-   * @param treeModifications the modifications which should be applied
-   * @return the resulting {@code ChangeEdit}
-   * @throws AuthException if the user isn't authenticated or not allowed to use change edits
-   * @throws InvalidChangeOperationException if the existing change edit is based on another patch
-   *     set or no change edit exists but the specified patch set isn't the current one
-   * @throws MergeConflictException if the modified patch set tree can't be merged with an existing
-   *     change edit
-   */
-  public ChangeEdit combineWithModifiedPatchSetTree(
-      Repository repository,
-      ChangeNotes notes,
-      PatchSet patchSet,
-      List<TreeModification> treeModifications)
-      throws AuthException, IOException, InvalidChangeOperationException, MergeConflictException,
-          OrmException, PermissionBackendException {
-    assertCanEdit(notes);
-
-    Optional<ChangeEdit> optionalChangeEdit = lookupChangeEdit(notes);
-    ensureAllowedPatchSet(notes, optionalChangeEdit, patchSet);
-
-    RevCommit patchSetCommit = lookupCommit(repository, patchSet);
-    ObjectId newTreeId = createNewTree(repository, patchSetCommit, treeModifications);
-
-    if (optionalChangeEdit.isPresent()) {
-      ChangeEdit changeEdit = optionalChangeEdit.get();
-      newTreeId = merge(repository, changeEdit, newTreeId);
-      if (ObjectId.equals(newTreeId, changeEdit.getEditCommit().getTree())) {
-        // Modifications are already contained in the change edit.
-        return changeEdit;
-      }
-    }
-
-    String commitMessage =
-        optionalChangeEdit.map(ChangeEdit::getEditCommit).orElse(patchSetCommit).getFullMessage();
-    Timestamp nowTimestamp = TimeUtil.nowTs();
-    ObjectId newEditCommit =
-        createCommit(repository, patchSetCommit, newTreeId, commitMessage, nowTimestamp);
-
-    if (optionalChangeEdit.isPresent()) {
-      return updateEdit(repository, optionalChangeEdit.get(), newEditCommit, nowTimestamp);
-    }
-    return createEdit(repository, notes, patchSet, newEditCommit, nowTimestamp);
-  }
-
-  private void assertCanEdit(ChangeNotes notes) throws AuthException, PermissionBackendException {
-    if (!currentUser.get().isIdentifiedUser()) {
-      throw new AuthException("Authentication required");
-    }
-    try {
-      permissionBackend
-          .user(currentUser)
-          .database(reviewDb)
-          .change(notes)
-          .check(ChangePermission.ADD_PATCH_SET);
-    } catch (AuthException denied) {
-      throw new AuthException("edit not permitted", denied);
-    }
-  }
-
-  private static void ensureAllowedPatchSet(
-      ChangeNotes notes, Optional<ChangeEdit> optionalChangeEdit, PatchSet patchSet)
-      throws InvalidChangeOperationException {
-    if (optionalChangeEdit.isPresent()) {
-      ChangeEdit changeEdit = optionalChangeEdit.get();
-      if (!isBasedOn(changeEdit, patchSet)) {
-        throw new InvalidChangeOperationException(
-            String.format(
-                "Only the patch set %s on which the existing change edit is based may be modified "
-                    + "(specified patch set: %s)",
-                changeEdit.getBasePatchSet().getId(), patchSet.getId()));
-      }
-    } else {
-      PatchSet.Id patchSetId = patchSet.getId();
-      PatchSet.Id currentPatchSetId = notes.getChange().currentPatchSetId();
-      if (!patchSetId.equals(currentPatchSetId)) {
-        throw new InvalidChangeOperationException(
-            String.format(
-                "A change edit may only be created for the current patch set %s (and not for %s)",
-                currentPatchSetId, patchSetId));
-      }
-    }
-  }
-
-  private Optional<ChangeEdit> lookupChangeEdit(ChangeNotes notes)
-      throws AuthException, IOException {
-    return changeEditUtil.byChange(notes);
-  }
-
-  private PatchSet getBasePatchSet(Optional<ChangeEdit> optionalChangeEdit, ChangeNotes notes)
-      throws OrmException {
-    Optional<PatchSet> editBasePatchSet = optionalChangeEdit.map(ChangeEdit::getBasePatchSet);
-    return editBasePatchSet.isPresent() ? editBasePatchSet.get() : lookupCurrentPatchSet(notes);
-  }
-
-  private PatchSet lookupCurrentPatchSet(ChangeNotes notes) throws OrmException {
-    return patchSetUtil.current(reviewDb.get(), notes);
-  }
-
-  private static boolean isBasedOn(ChangeEdit changeEdit, PatchSet patchSet) {
-    PatchSet editBasePatchSet = changeEdit.getBasePatchSet();
-    return editBasePatchSet.getId().equals(patchSet.getId());
-  }
-
-  private static RevCommit lookupCommit(Repository repository, PatchSet patchSet)
-      throws IOException {
-    ObjectId patchSetCommitId = getPatchSetCommitId(patchSet);
-    return lookupCommit(repository, patchSetCommitId);
-  }
-
-  private static RevCommit lookupCommit(Repository repository, ObjectId commitId)
-      throws IOException {
-    try (RevWalk revWalk = new RevWalk(repository)) {
-      return revWalk.parseCommit(commitId);
-    }
-  }
-
-  private static ObjectId createNewTree(
-      Repository repository, RevCommit baseCommit, List<TreeModification> treeModifications)
-      throws IOException, InvalidChangeOperationException {
-    TreeCreator treeCreator = new TreeCreator(baseCommit);
-    treeCreator.addTreeModifications(treeModifications);
-    ObjectId newTreeId = treeCreator.createNewTreeAndGetId(repository);
-
-    if (ObjectId.equals(newTreeId, baseCommit.getTree())) {
-      throw new InvalidChangeOperationException("no changes were made");
-    }
-    return newTreeId;
-  }
-
-  private static ObjectId merge(Repository repository, ChangeEdit changeEdit, ObjectId newTreeId)
-      throws IOException, MergeConflictException {
-    PatchSet basePatchSet = changeEdit.getBasePatchSet();
-    ObjectId basePatchSetCommitId = getPatchSetCommitId(basePatchSet);
-    ObjectId editCommitId = changeEdit.getEditCommit();
-
-    ThreeWayMerger threeWayMerger = MergeStrategy.RESOLVE.newMerger(repository, true);
-    threeWayMerger.setBase(basePatchSetCommitId);
-    boolean successful = threeWayMerger.merge(newTreeId, editCommitId);
-
-    if (!successful) {
-      throw new MergeConflictException(
-          "The existing change edit could not be merged with another tree.");
-    }
-    return threeWayMerger.getResultTreeId();
-  }
-
-  private ObjectId createCommit(
-      Repository repository,
-      RevCommit basePatchSetCommit,
-      ObjectId tree,
-      String commitMessage,
-      Timestamp timestamp)
-      throws IOException {
-    try (ObjectInserter objectInserter = repository.newObjectInserter()) {
-      CommitBuilder builder = new CommitBuilder();
-      builder.setTreeId(tree);
-      builder.setParentIds(basePatchSetCommit.getParents());
-      builder.setAuthor(basePatchSetCommit.getAuthorIdent());
-      builder.setCommitter(getCommitterIdent(timestamp));
-      builder.setMessage(commitMessage);
-      ObjectId newCommitId = objectInserter.insert(builder);
-      objectInserter.flush();
-      return newCommitId;
-    }
-  }
-
-  private PersonIdent getCommitterIdent(Timestamp commitTimestamp) {
-    IdentifiedUser user = currentUser.get().asIdentifiedUser();
-    return user.newCommitterIdent(commitTimestamp, tz);
-  }
-
-  private static ObjectId getPatchSetCommitId(PatchSet patchSet) {
-    return ObjectId.fromString(patchSet.getRevision().get());
-  }
-
-  private ChangeEdit createEdit(
-      Repository repository,
-      ChangeNotes notes,
-      PatchSet basePatchSet,
-      ObjectId newEditCommitId,
-      Timestamp timestamp)
-      throws IOException, OrmException {
-    Change change = notes.getChange();
-    String editRefName = getEditRefName(change, basePatchSet);
-    updateReference(repository, editRefName, ObjectId.zeroId(), newEditCommitId, timestamp);
-    reindex(change);
-
-    RevCommit newEditCommit = lookupCommit(repository, newEditCommitId);
-    return new ChangeEdit(change, editRefName, newEditCommit, basePatchSet);
-  }
-
-  private String getEditRefName(Change change, PatchSet basePatchSet) {
-    IdentifiedUser me = currentUser.get().asIdentifiedUser();
-    return RefNames.refsEdit(me.getAccountId(), change.getId(), basePatchSet.getId());
-  }
-
-  private ChangeEdit updateEdit(
-      Repository repository, ChangeEdit changeEdit, ObjectId newEditCommitId, Timestamp timestamp)
-      throws IOException, OrmException {
-    String editRefName = changeEdit.getRefName();
-    RevCommit currentEditCommit = changeEdit.getEditCommit();
-    updateReference(repository, editRefName, currentEditCommit, newEditCommitId, timestamp);
-    reindex(changeEdit.getChange());
-
-    RevCommit newEditCommit = lookupCommit(repository, newEditCommitId);
-    return new ChangeEdit(
-        changeEdit.getChange(), editRefName, newEditCommit, changeEdit.getBasePatchSet());
-  }
-
-  private void updateReference(
-      Repository repository,
-      String refName,
-      ObjectId currentObjectId,
-      ObjectId targetObjectId,
-      Timestamp timestamp)
-      throws IOException {
-    RefUpdate ru = repository.updateRef(refName);
-    ru.setExpectedOldObjectId(currentObjectId);
-    ru.setNewObjectId(targetObjectId);
-    ru.setRefLogIdent(getRefLogIdent(timestamp));
-    ru.setRefLogMessage("inline edit (amend)", false);
-    ru.setForceUpdate(true);
-    try (RevWalk revWalk = new RevWalk(repository)) {
-      RefUpdate.Result res = ru.update(revWalk);
-      if (res != RefUpdate.Result.NEW && res != RefUpdate.Result.FORCED) {
-        throw new IOException(
-            "cannot update "
-                + ru.getName()
-                + " in "
-                + repository.getDirectory()
-                + ": "
-                + ru.getResult());
-      }
-    }
-  }
-
-  private void updateReferenceWithNameChange(
-      Repository repository,
-      String currentRefName,
-      ObjectId currentObjectId,
-      String newRefName,
-      ObjectId targetObjectId,
-      Timestamp timestamp)
-      throws IOException {
-    BatchRefUpdate batchRefUpdate = repository.getRefDatabase().newBatchUpdate();
-    batchRefUpdate.addCommand(new ReceiveCommand(ObjectId.zeroId(), targetObjectId, newRefName));
-    batchRefUpdate.addCommand(
-        new ReceiveCommand(currentObjectId, ObjectId.zeroId(), currentRefName));
-    batchRefUpdate.setRefLogMessage("rebase edit", false);
-    batchRefUpdate.setRefLogIdent(getRefLogIdent(timestamp));
-    try (RevWalk revWalk = new RevWalk(repository)) {
-      batchRefUpdate.execute(revWalk, NullProgressMonitor.INSTANCE);
-    }
-    for (ReceiveCommand cmd : batchRefUpdate.getCommands()) {
-      if (cmd.getResult() != ReceiveCommand.Result.OK) {
-        throw new IOException("failed: " + cmd);
-      }
-    }
-  }
-
-  private PersonIdent getRefLogIdent(Timestamp timestamp) {
-    IdentifiedUser user = currentUser.get().asIdentifiedUser();
-    return user.newRefLogIdent(timestamp, tz);
-  }
-
-  private void reindex(Change change) throws IOException, OrmException {
-    indexer.index(reviewDb.get(), change);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditUtil.java
deleted file mode 100644
index d1d72fa..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditUtil.java
+++ /dev/null
@@ -1,304 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.edit;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import com.google.common.collect.ListMultimap;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.api.changes.RecipientType;
-import com.google.gerrit.extensions.client.ChangeKind;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ChangeUtil;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.change.ChangeKindCache;
-import com.google.gerrit.server.change.PatchSetInserter;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.index.change.ChangeIndexer;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.RepoContext;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.Optional;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-/**
- * Utility functions to manipulate change edits.
- *
- * <p>This class contains methods to retrieve, publish and delete edits. For changing edits see
- * {@link ChangeEditModifier}.
- */
-@Singleton
-public class ChangeEditUtil {
-  private final GitRepositoryManager gitManager;
-  private final PatchSetInserter.Factory patchSetInserterFactory;
-  private final ChangeIndexer indexer;
-  private final Provider<ReviewDb> db;
-  private final Provider<CurrentUser> userProvider;
-  private final ChangeKindCache changeKindCache;
-  private final PatchSetUtil psUtil;
-
-  @Inject
-  ChangeEditUtil(
-      GitRepositoryManager gitManager,
-      PatchSetInserter.Factory patchSetInserterFactory,
-      ChangeIndexer indexer,
-      Provider<ReviewDb> db,
-      Provider<CurrentUser> userProvider,
-      ChangeKindCache changeKindCache,
-      PatchSetUtil psUtil) {
-    this.gitManager = gitManager;
-    this.patchSetInserterFactory = patchSetInserterFactory;
-    this.indexer = indexer;
-    this.db = db;
-    this.userProvider = userProvider;
-    this.changeKindCache = changeKindCache;
-    this.psUtil = psUtil;
-  }
-
-  /**
-   * Retrieve edit for a given change.
-   *
-   * <p>At most one change edit can exist per user and change.
-   *
-   * @param notes change notes of change to retrieve change edits for.
-   * @return edit for this change for this user, if present.
-   * @throws AuthException if this is not a logged-in user.
-   * @throws IOException if an error occurs.
-   */
-  public Optional<ChangeEdit> byChange(ChangeNotes notes) throws AuthException, IOException {
-    return byChange(notes, userProvider.get());
-  }
-
-  /**
-   * Retrieve edit for a change and the given user.
-   *
-   * <p>At most one change edit can exist per user and change.
-   *
-   * @param notes change notes of change to retrieve change edits for.
-   * @param user user to retrieve edits as.
-   * @return edit for this change for this user, if present.
-   * @throws AuthException if this is not a logged-in user.
-   * @throws IOException if an error occurs.
-   */
-  public Optional<ChangeEdit> byChange(ChangeNotes notes, CurrentUser user)
-      throws AuthException, IOException {
-    if (!user.isIdentifiedUser()) {
-      throw new AuthException("Authentication required");
-    }
-    IdentifiedUser u = user.asIdentifiedUser();
-    Change change = notes.getChange();
-    try (Repository repo = gitManager.openRepository(change.getProject())) {
-      int n = change.currentPatchSetId().get();
-      String[] refNames = new String[n];
-      for (int i = n; i > 0; i--) {
-        refNames[i - 1] =
-            RefNames.refsEdit(u.getAccountId(), change.getId(), new PatchSet.Id(change.getId(), i));
-      }
-      Ref ref = repo.getRefDatabase().firstExactRef(refNames);
-      if (ref == null) {
-        return Optional.empty();
-      }
-      try (RevWalk rw = new RevWalk(repo)) {
-        RevCommit commit = rw.parseCommit(ref.getObjectId());
-        PatchSet basePs = getBasePatchSet(notes, ref);
-        return Optional.of(new ChangeEdit(change, ref.getName(), commit, basePs));
-      }
-    }
-  }
-
-  /**
-   * Promote change edit to patch set, by squashing the edit into its parent.
-   *
-   * @param updateFactory factory for creating updates.
-   * @param notes the {@code ChangeNotes} of the change to which the change edit belongs
-   * @param user the current user
-   * @param edit change edit to publish
-   * @param notify Notify handling that defines to whom email notifications should be sent after the
-   *     change edit is published.
-   * @param accountsToNotify Accounts that should be notified after the change edit is published.
-   * @throws IOException
-   * @throws OrmException
-   * @throws UpdateException
-   * @throws RestApiException
-   */
-  public void publish(
-      BatchUpdate.Factory updateFactory,
-      ChangeNotes notes,
-      CurrentUser user,
-      final ChangeEdit edit,
-      NotifyHandling notify,
-      ListMultimap<RecipientType, Account.Id> accountsToNotify)
-      throws IOException, OrmException, RestApiException, UpdateException {
-    Change change = edit.getChange();
-    try (Repository repo = gitManager.openRepository(change.getProject());
-        ObjectInserter oi = repo.newObjectInserter();
-        ObjectReader reader = oi.newReader();
-        RevWalk rw = new RevWalk(reader)) {
-      PatchSet basePatchSet = edit.getBasePatchSet();
-      if (!basePatchSet.getId().equals(change.currentPatchSetId())) {
-        throw new ResourceConflictException("only edit for current patch set can be published");
-      }
-
-      RevCommit squashed = squashEdit(rw, oi, edit.getEditCommit(), basePatchSet);
-      PatchSet.Id psId = ChangeUtil.nextPatchSetId(repo, change.currentPatchSetId());
-      PatchSetInserter inserter =
-          patchSetInserterFactory
-              .create(notes, psId, squashed)
-              .setNotify(notify)
-              .setAccountsToNotify(accountsToNotify);
-
-      StringBuilder message =
-          new StringBuilder("Patch Set ").append(inserter.getPatchSetId().get()).append(": ");
-
-      // Previously checked that the base patch set is the current patch set.
-      ObjectId prior = ObjectId.fromString(basePatchSet.getRevision().get());
-      ChangeKind kind =
-          changeKindCache.getChangeKind(change.getProject(), rw, repo.getConfig(), prior, squashed);
-      if (kind == ChangeKind.NO_CODE_CHANGE) {
-        message.append("Commit message was updated.");
-        inserter.setDescription("Edit commit message");
-      } else {
-        message
-            .append("Published edit on patch set ")
-            .append(basePatchSet.getPatchSetId())
-            .append(".");
-      }
-
-      try (BatchUpdate bu =
-          updateFactory.create(db.get(), change.getProject(), user, TimeUtil.nowTs())) {
-        bu.setRepository(repo, rw, oi);
-        bu.addOp(change.getId(), inserter.setMessage(message.toString()));
-        bu.addOp(
-            change.getId(),
-            new BatchUpdateOp() {
-              @Override
-              public void updateRepo(RepoContext ctx) throws Exception {
-                ctx.addRefUpdate(edit.getEditCommit().copy(), ObjectId.zeroId(), edit.getRefName());
-              }
-            });
-        bu.execute();
-      }
-    }
-  }
-
-  /**
-   * Delete change edit.
-   *
-   * @param edit change edit to delete
-   * @throws IOException
-   * @throws OrmException
-   */
-  public void delete(ChangeEdit edit) throws IOException, OrmException {
-    Change change = edit.getChange();
-    try (Repository repo = gitManager.openRepository(change.getProject())) {
-      deleteRef(repo, edit);
-    }
-    indexer.index(db.get(), change);
-  }
-
-  private PatchSet getBasePatchSet(ChangeNotes notes, Ref ref) throws IOException {
-    try {
-      int pos = ref.getName().lastIndexOf("/");
-      checkArgument(pos > 0, "invalid edit ref: %s", ref.getName());
-      String psId = ref.getName().substring(pos + 1);
-      return psUtil.get(
-          db.get(), notes, new PatchSet.Id(notes.getChange().getId(), Integer.parseInt(psId)));
-    } catch (OrmException | NumberFormatException e) {
-      throw new IOException(e);
-    }
-  }
-
-  private RevCommit squashEdit(
-      RevWalk rw, ObjectInserter inserter, RevCommit edit, PatchSet basePatchSet)
-      throws IOException, ResourceConflictException {
-    RevCommit parent = rw.parseCommit(ObjectId.fromString(basePatchSet.getRevision().get()));
-    if (parent.getTree().equals(edit.getTree())
-        && edit.getFullMessage().equals(parent.getFullMessage())) {
-      throw new ResourceConflictException("identical tree and message");
-    }
-    return writeSquashedCommit(rw, inserter, parent, edit);
-  }
-
-  private static void deleteRef(Repository repo, ChangeEdit edit) throws IOException {
-    String refName = edit.getRefName();
-    RefUpdate ru = repo.updateRef(refName, true);
-    ru.setExpectedOldObjectId(edit.getEditCommit());
-    ru.setForceUpdate(true);
-    RefUpdate.Result result = ru.delete();
-    switch (result) {
-      case FORCED:
-      case NEW:
-      case NO_CHANGE:
-        break;
-      case FAST_FORWARD:
-      case IO_FAILURE:
-      case LOCK_FAILURE:
-      case NOT_ATTEMPTED:
-      case REJECTED:
-      case REJECTED_CURRENT_BRANCH:
-      case RENAMED:
-      case REJECTED_MISSING_OBJECT:
-      case REJECTED_OTHER_REASON:
-      default:
-        throw new IOException(String.format("Failed to delete ref %s: %s", refName, result));
-    }
-  }
-
-  private static RevCommit writeSquashedCommit(
-      RevWalk rw, ObjectInserter inserter, RevCommit parent, RevCommit edit) throws IOException {
-    CommitBuilder mergeCommit = new CommitBuilder();
-    for (int i = 0; i < parent.getParentCount(); i++) {
-      mergeCommit.addParentId(parent.getParent(i));
-    }
-    mergeCommit.setAuthor(parent.getAuthorIdent());
-    mergeCommit.setMessage(edit.getFullMessage());
-    mergeCommit.setCommitter(edit.getCommitterIdent());
-    mergeCommit.setTreeId(edit.getTree());
-
-    return rw.parseCommit(commit(inserter, mergeCommit));
-  }
-
-  private static ObjectId commit(ObjectInserter inserter, CommitBuilder mergeCommit)
-      throws IOException {
-    ObjectId id = inserter.insert(mergeCommit);
-    inserter.flush();
-    return id;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/ChangeFileContentModification.java b/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/ChangeFileContentModification.java
deleted file mode 100644
index 3d75e6a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/ChangeFileContentModification.java
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.edit.tree;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.io.ByteStreams;
-import com.google.gerrit.extensions.restapi.RawInput;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Collections;
-import java.util.List;
-import org.eclipse.jgit.dircache.DirCacheEditor;
-import org.eclipse.jgit.dircache.DirCacheEntry;
-import org.eclipse.jgit.errors.InvalidObjectIdException;
-import org.eclipse.jgit.lib.FileMode;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** A {@code TreeModification} which changes the content of a file. */
-public class ChangeFileContentModification implements TreeModification {
-
-  private static final Logger log = LoggerFactory.getLogger(ChangeFileContentModification.class);
-
-  private final String filePath;
-  private final RawInput newContent;
-
-  public ChangeFileContentModification(String filePath, RawInput newContent) {
-    this.filePath = filePath;
-    this.newContent = checkNotNull(newContent, "new content required");
-  }
-
-  @Override
-  public List<DirCacheEditor.PathEdit> getPathEdits(Repository repository, RevCommit baseCommit) {
-    DirCacheEditor.PathEdit changeContentEdit = new ChangeContent(filePath, newContent, repository);
-    return Collections.singletonList(changeContentEdit);
-  }
-
-  @Override
-  public String getFilePath() {
-    return filePath;
-  }
-
-  @VisibleForTesting
-  RawInput getNewContent() {
-    return newContent;
-  }
-
-  /** A {@code PathEdit} which changes the contents of a file. */
-  private static class ChangeContent extends DirCacheEditor.PathEdit {
-
-    private final RawInput newContent;
-    private final Repository repository;
-
-    ChangeContent(String filePath, RawInput newContent, Repository repository) {
-      super(filePath);
-      this.newContent = newContent;
-      this.repository = repository;
-    }
-
-    @Override
-    public void apply(DirCacheEntry dirCacheEntry) {
-      try {
-        if (dirCacheEntry.getFileMode() == FileMode.GITLINK) {
-          dirCacheEntry.setLength(0);
-          dirCacheEntry.setLastModified(0);
-          ObjectId newObjectId = ObjectId.fromString(getNewContentBytes(), 0);
-          dirCacheEntry.setObjectId(newObjectId);
-        } else {
-          if (dirCacheEntry.getRawMode() == 0) {
-            dirCacheEntry.setFileMode(FileMode.REGULAR_FILE);
-          }
-          ObjectId newBlobObjectId = createNewBlobAndGetItsId();
-          dirCacheEntry.setObjectId(newBlobObjectId);
-        }
-        // Previously, these two exceptions were swallowed. To improve the
-        // situation, we log them now. However, we should think of a better
-        // approach.
-      } catch (IOException e) {
-        String message =
-            String.format("Could not change the content of %s", dirCacheEntry.getPathString());
-        log.error(message, e);
-      } catch (InvalidObjectIdException e) {
-        log.error("Invalid object id in submodule link", e);
-      }
-    }
-
-    private ObjectId createNewBlobAndGetItsId() throws IOException {
-      try (ObjectInserter objectInserter = repository.newObjectInserter()) {
-        ObjectId blobObjectId = createNewBlobAndGetItsId(objectInserter);
-        objectInserter.flush();
-        return blobObjectId;
-      }
-    }
-
-    private ObjectId createNewBlobAndGetItsId(ObjectInserter objectInserter) throws IOException {
-      long contentLength = newContent.getContentLength();
-      if (contentLength < 0) {
-        return objectInserter.insert(OBJ_BLOB, getNewContentBytes());
-      }
-      InputStream contentInputStream = newContent.getInputStream();
-      return objectInserter.insert(OBJ_BLOB, contentLength, contentInputStream);
-    }
-
-    private byte[] getNewContentBytes() throws IOException {
-      return ByteStreams.toByteArray(newContent.getInputStream());
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/TreeCreator.java b/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/TreeCreator.java
deleted file mode 100644
index e867e76..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/TreeCreator.java
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.edit.tree;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import org.eclipse.jgit.dircache.DirCache;
-import org.eclipse.jgit.dircache.DirCacheBuilder;
-import org.eclipse.jgit.dircache.DirCacheEditor;
-import org.eclipse.jgit.dircache.DirCacheEntry;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-
-/**
- * A creator for a new Git tree. To create the new tree, the tree of another commit is taken as a
- * basis and modified.
- */
-public class TreeCreator {
-
-  private final RevCommit baseCommit;
-  private final List<TreeModification> treeModifications = new ArrayList<>();
-
-  public TreeCreator(RevCommit baseCommit) {
-    this.baseCommit = checkNotNull(baseCommit, "baseCommit is required");
-  }
-
-  /**
-   * Apply modifications to the tree which is taken as a basis. If this method is called multiple
-   * times, the modifications are applied subsequently in exactly the order they were provided.
-   *
-   * @param treeModifications modifications which should be applied to the base tree
-   */
-  public void addTreeModifications(List<TreeModification> treeModifications) {
-    checkNotNull(treeModifications, "treeModifications must not be null");
-    this.treeModifications.addAll(treeModifications);
-  }
-
-  /**
-   * Creates the new tree. When this method is called, the specified base tree is read from the
-   * repository, the specified modifications are applied, and the resulting tree is written to the
-   * object store of the repository.
-   *
-   * @param repository the affected Git repository
-   * @return the {@code ObjectId} of the created tree
-   * @throws IOException if problems arise when accessing the repository
-   */
-  public ObjectId createNewTreeAndGetId(Repository repository) throws IOException {
-    DirCache newTree = createNewTree(repository);
-    return writeAndGetId(repository, newTree);
-  }
-
-  private DirCache createNewTree(Repository repository) throws IOException {
-    DirCache newTree = readBaseTree(repository);
-    List<DirCacheEditor.PathEdit> pathEdits = getPathEdits(repository);
-    applyPathEdits(newTree, pathEdits);
-    return newTree;
-  }
-
-  private DirCache readBaseTree(Repository repository) throws IOException {
-    try (ObjectReader objectReader = repository.newObjectReader()) {
-      DirCache dirCache = DirCache.newInCore();
-      DirCacheBuilder dirCacheBuilder = dirCache.builder();
-      dirCacheBuilder.addTree(
-          new byte[0], DirCacheEntry.STAGE_0, objectReader, baseCommit.getTree());
-      dirCacheBuilder.finish();
-      return dirCache;
-    }
-  }
-
-  private List<DirCacheEditor.PathEdit> getPathEdits(Repository repository) throws IOException {
-    List<DirCacheEditor.PathEdit> pathEdits = new ArrayList<>();
-    for (TreeModification treeModification : treeModifications) {
-      pathEdits.addAll(treeModification.getPathEdits(repository, baseCommit));
-    }
-    return pathEdits;
-  }
-
-  private static void applyPathEdits(DirCache tree, List<DirCacheEditor.PathEdit> pathEdits) {
-    DirCacheEditor dirCacheEditor = tree.editor();
-    pathEdits.forEach(dirCacheEditor::add);
-    dirCacheEditor.finish();
-  }
-
-  private static ObjectId writeAndGetId(Repository repository, DirCache tree) throws IOException {
-    try (ObjectInserter objectInserter = repository.newObjectInserter()) {
-      ObjectId treeId = tree.writeTree(objectInserter);
-      objectInserter.flush();
-      return treeId;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/Event.java b/gerrit-server/src/main/java/com/google/gerrit/server/events/Event.java
deleted file mode 100644
index 20fbe2f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/events/Event.java
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.events;
-
-import com.google.gerrit.common.TimeUtil;
-
-public abstract class Event {
-  public final String type;
-  public long eventCreatedOn = TimeUtil.nowMs() / 1000L;
-
-  protected Event(String type) {
-    this.type = type;
-  }
-
-  public String getType() {
-    return type;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/EventFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/events/EventFactory.java
deleted file mode 100644
index 844b43b..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/events/EventFactory.java
+++ /dev/null
@@ -1,656 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.server.events;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static java.util.Comparator.comparing;
-
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.Lists;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.LabelTypes;
-import com.google.gerrit.common.data.SubmitRecord;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.Patch;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.client.UserIdentity;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.Emails;
-import com.google.gerrit.server.change.ChangeKindCache;
-import com.google.gerrit.server.config.CanonicalWebUrl;
-import com.google.gerrit.server.data.AccountAttribute;
-import com.google.gerrit.server.data.ApprovalAttribute;
-import com.google.gerrit.server.data.ChangeAttribute;
-import com.google.gerrit.server.data.DependencyAttribute;
-import com.google.gerrit.server.data.MessageAttribute;
-import com.google.gerrit.server.data.PatchAttribute;
-import com.google.gerrit.server.data.PatchSetAttribute;
-import com.google.gerrit.server.data.PatchSetCommentAttribute;
-import com.google.gerrit.server.data.RefUpdateAttribute;
-import com.google.gerrit.server.data.SubmitLabelAttribute;
-import com.google.gerrit.server.data.SubmitRecordAttribute;
-import com.google.gerrit.server.data.TrackingIdAttribute;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.patch.PatchList;
-import com.google.gerrit.server.patch.PatchListCache;
-import com.google.gerrit.server.patch.PatchListEntry;
-import com.google.gerrit.server.patch.PatchListNotAvailableException;
-import com.google.gerrit.server.patch.PatchListObjectTooLargeException;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.InternalChangeQuery;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class EventFactory {
-  private static final Logger log = LoggerFactory.getLogger(EventFactory.class);
-
-  private final AccountCache accountCache;
-  private final Emails emails;
-  private final Provider<String> urlProvider;
-  private final PatchListCache patchListCache;
-  private final PersonIdent myIdent;
-  private final ChangeData.Factory changeDataFactory;
-  private final ApprovalsUtil approvalsUtil;
-  private final ChangeKindCache changeKindCache;
-  private final Provider<InternalChangeQuery> queryProvider;
-  private final SchemaFactory<ReviewDb> schema;
-
-  @Inject
-  EventFactory(
-      AccountCache accountCache,
-      Emails emails,
-      @CanonicalWebUrl @Nullable Provider<String> urlProvider,
-      PatchListCache patchListCache,
-      @GerritPersonIdent PersonIdent myIdent,
-      ChangeData.Factory changeDataFactory,
-      ApprovalsUtil approvalsUtil,
-      ChangeKindCache changeKindCache,
-      Provider<InternalChangeQuery> queryProvider,
-      SchemaFactory<ReviewDb> schema) {
-    this.accountCache = accountCache;
-    this.emails = emails;
-    this.urlProvider = urlProvider;
-    this.patchListCache = patchListCache;
-    this.myIdent = myIdent;
-    this.changeDataFactory = changeDataFactory;
-    this.approvalsUtil = approvalsUtil;
-    this.changeKindCache = changeKindCache;
-    this.queryProvider = queryProvider;
-    this.schema = schema;
-  }
-
-  /**
-   * Create a ChangeAttribute for the given change suitable for serialization to JSON.
-   *
-   * @param change
-   * @return object suitable for serialization to JSON
-   */
-  public ChangeAttribute asChangeAttribute(Change change) {
-    try (ReviewDb db = schema.open()) {
-      return asChangeAttribute(db, change);
-    } catch (OrmException e) {
-      log.error("Cannot open database connection", e);
-      return new ChangeAttribute();
-    }
-  }
-
-  /**
-   * Create a ChangeAttribute for the given change suitable for serialization to JSON.
-   *
-   * @param db Review database
-   * @param change
-   * @return object suitable for serialization to JSON
-   */
-  public ChangeAttribute asChangeAttribute(ReviewDb db, Change change) {
-    ChangeAttribute a = new ChangeAttribute();
-    a.project = change.getProject().get();
-    a.branch = change.getDest().getShortName();
-    a.topic = change.getTopic();
-    a.id = change.getKey().get();
-    a.number = change.getId().get();
-    a.subject = change.getSubject();
-    try {
-      a.commitMessage = changeDataFactory.create(db, change).commitMessage();
-    } catch (Exception e) {
-      log.error("Error while getting full commit message for change {}", a.number, e);
-    }
-    a.url = getChangeUrl(change);
-    a.owner = asAccountAttribute(change.getOwner());
-    a.assignee = asAccountAttribute(change.getAssignee());
-    a.status = change.getStatus();
-    a.createdOn = change.getCreatedOn().getTime() / 1000L;
-    a.wip = change.isWorkInProgress() ? true : null;
-    a.isPrivate = change.isPrivate() ? true : null;
-    return a;
-  }
-
-  /**
-   * Create a RefUpdateAttribute for the given old ObjectId, new ObjectId, and branch that is
-   * suitable for serialization to JSON.
-   *
-   * @param oldId
-   * @param newId
-   * @param refName
-   * @return object suitable for serialization to JSON
-   */
-  public RefUpdateAttribute asRefUpdateAttribute(
-      ObjectId oldId, ObjectId newId, Branch.NameKey refName) {
-    RefUpdateAttribute ru = new RefUpdateAttribute();
-    ru.newRev = newId != null ? newId.getName() : ObjectId.zeroId().getName();
-    ru.oldRev = oldId != null ? oldId.getName() : ObjectId.zeroId().getName();
-    ru.project = refName.getParentKey().get();
-    ru.refName = refName.get();
-    return ru;
-  }
-
-  /**
-   * Extend the existing ChangeAttribute with additional fields.
-   *
-   * @param a
-   * @param change
-   */
-  public void extend(ChangeAttribute a, Change change) {
-    a.lastUpdated = change.getLastUpdatedOn().getTime() / 1000L;
-    a.open = change.getStatus().isOpen();
-  }
-
-  /**
-   * Add allReviewers to an existing ChangeAttribute.
-   *
-   * @param a
-   * @param notes
-   */
-  public void addAllReviewers(ReviewDb db, ChangeAttribute a, ChangeNotes notes)
-      throws OrmException {
-    Collection<Account.Id> reviewers = approvalsUtil.getReviewers(db, notes).all();
-    if (!reviewers.isEmpty()) {
-      a.allReviewers = Lists.newArrayListWithCapacity(reviewers.size());
-      for (Account.Id id : reviewers) {
-        a.allReviewers.add(asAccountAttribute(id));
-      }
-    }
-  }
-
-  /**
-   * Add submitRecords to an existing ChangeAttribute.
-   *
-   * @param ca
-   * @param submitRecords
-   */
-  public void addSubmitRecords(ChangeAttribute ca, List<SubmitRecord> submitRecords) {
-    ca.submitRecords = new ArrayList<>();
-
-    for (SubmitRecord submitRecord : submitRecords) {
-      SubmitRecordAttribute sa = new SubmitRecordAttribute();
-      sa.status = submitRecord.status.name();
-      if (submitRecord.status != SubmitRecord.Status.RULE_ERROR) {
-        addSubmitRecordLabels(submitRecord, sa);
-      }
-      ca.submitRecords.add(sa);
-    }
-    // Remove empty lists so a confusing label won't be displayed in the output.
-    if (ca.submitRecords.isEmpty()) {
-      ca.submitRecords = null;
-    }
-  }
-
-  private void addSubmitRecordLabels(SubmitRecord submitRecord, SubmitRecordAttribute sa) {
-    if (submitRecord.labels != null && !submitRecord.labels.isEmpty()) {
-      sa.labels = new ArrayList<>();
-      for (SubmitRecord.Label lbl : submitRecord.labels) {
-        SubmitLabelAttribute la = new SubmitLabelAttribute();
-        la.label = lbl.label;
-        la.status = lbl.status.name();
-        if (lbl.appliedBy != null) {
-          Account a = accountCache.get(lbl.appliedBy).getAccount();
-          la.by = asAccountAttribute(a);
-        }
-        sa.labels.add(la);
-      }
-    }
-  }
-
-  public void addDependencies(RevWalk rw, ChangeAttribute ca, Change change, PatchSet currentPs) {
-    if (change == null || currentPs == null) {
-      return;
-    }
-    ca.dependsOn = new ArrayList<>();
-    ca.neededBy = new ArrayList<>();
-    try {
-      addDependsOn(rw, ca, change, currentPs);
-      addNeededBy(rw, ca, change, currentPs);
-    } catch (OrmException | IOException e) {
-      // Squash DB exceptions and leave dependency lists partially filled.
-    }
-    // Remove empty lists so a confusing label won't be displayed in the output.
-    if (ca.dependsOn.isEmpty()) {
-      ca.dependsOn = null;
-    }
-    if (ca.neededBy.isEmpty()) {
-      ca.neededBy = null;
-    }
-  }
-
-  private void addDependsOn(RevWalk rw, ChangeAttribute ca, Change change, PatchSet currentPs)
-      throws OrmException, IOException {
-    RevCommit commit = rw.parseCommit(ObjectId.fromString(currentPs.getRevision().get()));
-    final List<String> parentNames = new ArrayList<>(commit.getParentCount());
-    for (RevCommit p : commit.getParents()) {
-      parentNames.add(p.name());
-    }
-
-    // Find changes in this project having a patch set matching any parent of
-    // this patch set's revision.
-    for (ChangeData cd : queryProvider.get().byProjectCommits(change.getProject(), parentNames)) {
-      for (PatchSet ps : cd.patchSets()) {
-        for (String p : parentNames) {
-          if (!ps.getRevision().get().equals(p)) {
-            continue;
-          }
-          ca.dependsOn.add(newDependsOn(checkNotNull(cd.change()), ps));
-        }
-      }
-    }
-    // Sort by original parent order.
-    Collections.sort(
-        ca.dependsOn,
-        comparing(
-            (DependencyAttribute d) -> {
-              for (int i = 0; i < parentNames.size(); i++) {
-                if (parentNames.get(i).equals(d.revision)) {
-                  return i;
-                }
-              }
-              return parentNames.size() + 1;
-            }));
-  }
-
-  private void addNeededBy(RevWalk rw, ChangeAttribute ca, Change change, PatchSet currentPs)
-      throws OrmException, IOException {
-    if (currentPs.getGroups().isEmpty()) {
-      return;
-    }
-    String rev = currentPs.getRevision().get();
-    // Find changes in the same related group as this patch set, having a patch
-    // set whose parent matches this patch set's revision.
-    for (ChangeData cd :
-        queryProvider.get().byProjectGroups(change.getProject(), currentPs.getGroups())) {
-      PATCH_SETS:
-      for (PatchSet ps : cd.patchSets()) {
-        RevCommit commit = rw.parseCommit(ObjectId.fromString(ps.getRevision().get()));
-        for (RevCommit p : commit.getParents()) {
-          if (!p.name().equals(rev)) {
-            continue;
-          }
-          ca.neededBy.add(newNeededBy(checkNotNull(cd.change()), ps));
-          continue PATCH_SETS;
-        }
-      }
-    }
-  }
-
-  private DependencyAttribute newDependsOn(Change c, PatchSet ps) {
-    DependencyAttribute d = newDependencyAttribute(c, ps);
-    d.isCurrentPatchSet = ps.getId().equals(c.currentPatchSetId());
-    return d;
-  }
-
-  private DependencyAttribute newNeededBy(Change c, PatchSet ps) {
-    return newDependencyAttribute(c, ps);
-  }
-
-  private DependencyAttribute newDependencyAttribute(Change c, PatchSet ps) {
-    DependencyAttribute d = new DependencyAttribute();
-    d.number = c.getId().get();
-    d.id = c.getKey().toString();
-    d.revision = ps.getRevision().get();
-    d.ref = ps.getRefName();
-    return d;
-  }
-
-  public void addTrackingIds(ChangeAttribute a, ListMultimap<String, String> set) {
-    if (!set.isEmpty()) {
-      a.trackingIds = new ArrayList<>(set.size());
-      for (Map.Entry<String, Collection<String>> e : set.asMap().entrySet()) {
-        for (String id : e.getValue()) {
-          TrackingIdAttribute t = new TrackingIdAttribute();
-          t.system = e.getKey();
-          t.id = id;
-          a.trackingIds.add(t);
-        }
-      }
-    }
-  }
-
-  public void addCommitMessage(ChangeAttribute a, String commitMessage) {
-    a.commitMessage = commitMessage;
-  }
-
-  public void addPatchSets(
-      ReviewDb db,
-      RevWalk revWalk,
-      ChangeAttribute ca,
-      Collection<PatchSet> ps,
-      Map<PatchSet.Id, Collection<PatchSetApproval>> approvals,
-      LabelTypes labelTypes) {
-    addPatchSets(db, revWalk, ca, ps, approvals, false, null, labelTypes);
-  }
-
-  public void addPatchSets(
-      ReviewDb db,
-      RevWalk revWalk,
-      ChangeAttribute ca,
-      Collection<PatchSet> ps,
-      Map<PatchSet.Id, Collection<PatchSetApproval>> approvals,
-      boolean includeFiles,
-      Change change,
-      LabelTypes labelTypes) {
-    if (!ps.isEmpty()) {
-      ca.patchSets = new ArrayList<>(ps.size());
-      for (PatchSet p : ps) {
-        PatchSetAttribute psa = asPatchSetAttribute(db, revWalk, change, p);
-        if (approvals != null) {
-          addApprovals(psa, p.getId(), approvals, labelTypes);
-        }
-        ca.patchSets.add(psa);
-        if (includeFiles) {
-          addPatchSetFileNames(psa, change, p);
-        }
-      }
-    }
-  }
-
-  public void addPatchSetComments(
-      PatchSetAttribute patchSetAttribute, Collection<Comment> comments) {
-    for (Comment comment : comments) {
-      if (comment.key.patchSetId == patchSetAttribute.number) {
-        if (patchSetAttribute.comments == null) {
-          patchSetAttribute.comments = new ArrayList<>();
-        }
-        patchSetAttribute.comments.add(asPatchSetLineAttribute(comment));
-      }
-    }
-  }
-
-  public void addPatchSetFileNames(
-      PatchSetAttribute patchSetAttribute, Change change, PatchSet patchSet) {
-    try {
-      PatchList patchList = patchListCache.get(change, patchSet);
-      for (PatchListEntry patch : patchList.getPatches()) {
-        if (patchSetAttribute.files == null) {
-          patchSetAttribute.files = new ArrayList<>();
-        }
-
-        PatchAttribute p = new PatchAttribute();
-        p.file = patch.getNewName();
-        p.fileOld = patch.getOldName();
-        p.type = patch.getChangeType();
-        p.deletions -= patch.getDeletions();
-        p.insertions = patch.getInsertions();
-        patchSetAttribute.files.add(p);
-      }
-    } catch (PatchListObjectTooLargeException e) {
-      log.warn("Cannot get patch list: " + e.getMessage());
-    } catch (PatchListNotAvailableException e) {
-      log.error("Cannot get patch list", e);
-    }
-  }
-
-  public void addComments(ChangeAttribute ca, Collection<ChangeMessage> messages) {
-    if (!messages.isEmpty()) {
-      ca.comments = new ArrayList<>();
-      for (ChangeMessage message : messages) {
-        ca.comments.add(asMessageAttribute(message));
-      }
-    }
-  }
-
-  /**
-   * Create a PatchSetAttribute for the given patchset suitable for serialization to JSON.
-   *
-   * @param revWalk
-   * @param patchSet
-   * @return object suitable for serialization to JSON
-   */
-  public PatchSetAttribute asPatchSetAttribute(RevWalk revWalk, Change change, PatchSet patchSet) {
-    try (ReviewDb db = schema.open()) {
-      return asPatchSetAttribute(db, revWalk, change, patchSet);
-    } catch (OrmException e) {
-      log.error("Cannot open database connection", e);
-      return new PatchSetAttribute();
-    }
-  }
-
-  /**
-   * Create a PatchSetAttribute for the given patchset suitable for serialization to JSON.
-   *
-   * @param db Review database
-   * @param patchSet
-   * @return object suitable for serialization to JSON
-   */
-  public PatchSetAttribute asPatchSetAttribute(
-      ReviewDb db, RevWalk revWalk, Change change, PatchSet patchSet) {
-    PatchSetAttribute p = new PatchSetAttribute();
-    p.revision = patchSet.getRevision().get();
-    p.number = patchSet.getPatchSetId();
-    p.ref = patchSet.getRefName();
-    p.uploader = asAccountAttribute(patchSet.getUploader());
-    p.createdOn = patchSet.getCreatedOn().getTime() / 1000L;
-    PatchSet.Id pId = patchSet.getId();
-    try {
-      p.parents = new ArrayList<>();
-      RevCommit c = revWalk.parseCommit(ObjectId.fromString(p.revision));
-      for (RevCommit parent : c.getParents()) {
-        p.parents.add(parent.name());
-      }
-
-      UserIdentity author = toUserIdentity(c.getAuthorIdent());
-      if (author.getAccount() == null) {
-        p.author = new AccountAttribute();
-        p.author.email = author.getEmail();
-        p.author.name = author.getName();
-        p.author.username = "";
-      } else {
-        p.author = asAccountAttribute(author.getAccount());
-      }
-
-      List<Patch> list = patchListCache.get(change, patchSet).toPatchList(pId);
-      for (Patch pe : list) {
-        if (!Patch.isMagic(pe.getFileName())) {
-          p.sizeDeletions -= pe.getDeletions();
-          p.sizeInsertions += pe.getInsertions();
-        }
-      }
-      p.kind = changeKindCache.getChangeKind(db, change, patchSet);
-    } catch (IOException | OrmException e) {
-      log.error("Cannot load patch set data for {}", patchSet.getId(), e);
-    } catch (PatchListObjectTooLargeException e) {
-      log.warn("Cannot get size information for {}: {}", pId, e.getMessage());
-    } catch (PatchListNotAvailableException e) {
-      log.error("Cannot get size information for {}.", pId, e);
-    }
-    return p;
-  }
-
-  // TODO: The same method exists in PatchSetInfoFactory, find a common place
-  // for it
-  private UserIdentity toUserIdentity(PersonIdent who) throws IOException, OrmException {
-    UserIdentity u = new UserIdentity();
-    u.setName(who.getName());
-    u.setEmail(who.getEmailAddress());
-    u.setDate(new Timestamp(who.getWhen().getTime()));
-    u.setTimeZone(who.getTimeZoneOffset());
-
-    // If only one account has access to this email address, select it
-    // as the identity of the user.
-    //
-    Set<Account.Id> a = emails.getAccountFor(u.getEmail());
-    if (a.size() == 1) {
-      u.setAccount(a.iterator().next());
-    }
-
-    return u;
-  }
-
-  public void addApprovals(
-      PatchSetAttribute p,
-      PatchSet.Id id,
-      Map<PatchSet.Id, Collection<PatchSetApproval>> all,
-      LabelTypes labelTypes) {
-    Collection<PatchSetApproval> list = all.get(id);
-    if (list != null) {
-      addApprovals(p, list, labelTypes);
-    }
-  }
-
-  public void addApprovals(
-      PatchSetAttribute p, Collection<PatchSetApproval> list, LabelTypes labelTypes) {
-    if (!list.isEmpty()) {
-      p.approvals = new ArrayList<>(list.size());
-      for (PatchSetApproval a : list) {
-        if (a.getValue() != 0) {
-          p.approvals.add(asApprovalAttribute(a, labelTypes));
-        }
-      }
-      if (p.approvals.isEmpty()) {
-        p.approvals = null;
-      }
-    }
-  }
-
-  /**
-   * Create an AuthorAttribute for the given account suitable for serialization to JSON.
-   *
-   * @param id
-   * @return object suitable for serialization to JSON
-   */
-  public AccountAttribute asAccountAttribute(Account.Id id) {
-    if (id == null) {
-      return null;
-    }
-    return asAccountAttribute(accountCache.get(id).getAccount());
-  }
-
-  /**
-   * Create an AuthorAttribute for the given account suitable for serialization to JSON.
-   *
-   * @param account
-   * @return object suitable for serialization to JSON
-   */
-  public AccountAttribute asAccountAttribute(Account account) {
-    if (account == null) {
-      return null;
-    }
-
-    AccountAttribute who = new AccountAttribute();
-    who.name = account.getFullName();
-    who.email = account.getPreferredEmail();
-    who.username = account.getUserName();
-    return who;
-  }
-
-  /**
-   * Create an AuthorAttribute for the given person ident suitable for serialization to JSON.
-   *
-   * @param ident
-   * @return object suitable for serialization to JSON
-   */
-  public AccountAttribute asAccountAttribute(PersonIdent ident) {
-    AccountAttribute who = new AccountAttribute();
-    who.name = ident.getName();
-    who.email = ident.getEmailAddress();
-    return who;
-  }
-
-  /**
-   * Create an ApprovalAttribute for the given approval suitable for serialization to JSON.
-   *
-   * @param approval
-   * @param labelTypes label types for the containing project
-   * @return object suitable for serialization to JSON
-   */
-  public ApprovalAttribute asApprovalAttribute(PatchSetApproval approval, LabelTypes labelTypes) {
-    ApprovalAttribute a = new ApprovalAttribute();
-    a.type = approval.getLabelId().get();
-    a.value = Short.toString(approval.getValue());
-    a.by = asAccountAttribute(approval.getAccountId());
-    a.grantedOn = approval.getGranted().getTime() / 1000L;
-    a.oldValue = null;
-
-    LabelType lt = labelTypes.byLabel(approval.getLabelId());
-    if (lt != null) {
-      a.description = lt.getName();
-    }
-    return a;
-  }
-
-  public MessageAttribute asMessageAttribute(ChangeMessage message) {
-    MessageAttribute a = new MessageAttribute();
-    a.timestamp = message.getWrittenOn().getTime() / 1000L;
-    a.reviewer =
-        message.getAuthor() != null
-            ? asAccountAttribute(message.getAuthor())
-            : asAccountAttribute(myIdent);
-    a.message = message.getMessage();
-    return a;
-  }
-
-  public PatchSetCommentAttribute asPatchSetLineAttribute(Comment c) {
-    PatchSetCommentAttribute a = new PatchSetCommentAttribute();
-    a.reviewer = asAccountAttribute(c.author.getId());
-    a.file = c.key.filename;
-    a.line = c.lineNbr;
-    a.message = c.message;
-    return a;
-  }
-
-  /** Get a link to the change; null if the server doesn't know its own address. */
-  private String getChangeUrl(Change change) {
-    if (change != null && urlProvider.get() != null) {
-      StringBuilder r = new StringBuilder();
-      r.append(urlProvider.get());
-      r.append(change.getChangeId());
-      return r.toString();
-    }
-    return null;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/EventsMetrics.java b/gerrit-server/src/main/java/com/google/gerrit/server/events/EventsMetrics.java
deleted file mode 100644
index fcf4a08..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/events/EventsMetrics.java
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.events;
-
-import com.google.gerrit.common.EventListener;
-import com.google.gerrit.metrics.Counter1;
-import com.google.gerrit.metrics.Description;
-import com.google.gerrit.metrics.Field;
-import com.google.gerrit.metrics.MetricMaker;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-@Singleton
-public class EventsMetrics implements EventListener {
-  private final Counter1<String> events;
-
-  @Inject
-  public EventsMetrics(MetricMaker metricMaker) {
-    events =
-        metricMaker.newCounter(
-            "events",
-            new Description("Triggered events").setRate().setUnit("triggered events"),
-            Field.ofString("type"));
-  }
-
-  @Override
-  public void onEvent(com.google.gerrit.server.events.Event event) {
-    events.increment(event.getType());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/StreamEventsApiListener.java b/gerrit-server/src/main/java/com/google/gerrit/server/events/StreamEventsApiListener.java
deleted file mode 100644
index 4c948fc..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/events/StreamEventsApiListener.java
+++ /dev/null
@@ -1,547 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.events;
-
-import com.google.common.base.Supplier;
-import com.google.common.base.Suppliers;
-import com.google.common.collect.Sets;
-import com.google.gerrit.common.EventDispatcher;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.LabelTypes;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.ApprovalInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.RevisionInfo;
-import com.google.gerrit.extensions.events.AssigneeChangedListener;
-import com.google.gerrit.extensions.events.ChangeAbandonedListener;
-import com.google.gerrit.extensions.events.ChangeDeletedListener;
-import com.google.gerrit.extensions.events.ChangeMergedListener;
-import com.google.gerrit.extensions.events.ChangeRestoredListener;
-import com.google.gerrit.extensions.events.CommentAddedListener;
-import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
-import com.google.gerrit.extensions.events.HashtagsEditedListener;
-import com.google.gerrit.extensions.events.NewProjectCreatedListener;
-import com.google.gerrit.extensions.events.PrivateStateChangedListener;
-import com.google.gerrit.extensions.events.ReviewerAddedListener;
-import com.google.gerrit.extensions.events.ReviewerDeletedListener;
-import com.google.gerrit.extensions.events.RevisionCreatedListener;
-import com.google.gerrit.extensions.events.TopicEditedListener;
-import com.google.gerrit.extensions.events.VoteDeletedListener;
-import com.google.gerrit.extensions.events.WorkInProgressStateChangedListener;
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.data.AccountAttribute;
-import com.google.gerrit.server.data.ApprovalAttribute;
-import com.google.gerrit.server.data.ChangeAttribute;
-import com.google.gerrit.server.data.PatchSetAttribute;
-import com.google.gerrit.server.data.RefUpdateAttribute;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.AbstractModule;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class StreamEventsApiListener
-    implements AssigneeChangedListener,
-        ChangeAbandonedListener,
-        ChangeDeletedListener,
-        ChangeMergedListener,
-        ChangeRestoredListener,
-        WorkInProgressStateChangedListener,
-        PrivateStateChangedListener,
-        CommentAddedListener,
-        GitReferenceUpdatedListener,
-        HashtagsEditedListener,
-        NewProjectCreatedListener,
-        ReviewerAddedListener,
-        ReviewerDeletedListener,
-        RevisionCreatedListener,
-        TopicEditedListener,
-        VoteDeletedListener {
-  private static final Logger log = LoggerFactory.getLogger(StreamEventsApiListener.class);
-
-  public static class Module extends AbstractModule {
-    @Override
-    protected void configure() {
-      DynamicSet.bind(binder(), AssigneeChangedListener.class).to(StreamEventsApiListener.class);
-      DynamicSet.bind(binder(), ChangeAbandonedListener.class).to(StreamEventsApiListener.class);
-      DynamicSet.bind(binder(), ChangeDeletedListener.class).to(StreamEventsApiListener.class);
-      DynamicSet.bind(binder(), ChangeMergedListener.class).to(StreamEventsApiListener.class);
-      DynamicSet.bind(binder(), ChangeRestoredListener.class).to(StreamEventsApiListener.class);
-      DynamicSet.bind(binder(), CommentAddedListener.class).to(StreamEventsApiListener.class);
-      DynamicSet.bind(binder(), GitReferenceUpdatedListener.class)
-          .to(StreamEventsApiListener.class);
-      DynamicSet.bind(binder(), HashtagsEditedListener.class).to(StreamEventsApiListener.class);
-      DynamicSet.bind(binder(), NewProjectCreatedListener.class).to(StreamEventsApiListener.class);
-      DynamicSet.bind(binder(), PrivateStateChangedListener.class)
-          .to(StreamEventsApiListener.class);
-      DynamicSet.bind(binder(), ReviewerAddedListener.class).to(StreamEventsApiListener.class);
-      DynamicSet.bind(binder(), ReviewerDeletedListener.class).to(StreamEventsApiListener.class);
-      DynamicSet.bind(binder(), RevisionCreatedListener.class).to(StreamEventsApiListener.class);
-      DynamicSet.bind(binder(), TopicEditedListener.class).to(StreamEventsApiListener.class);
-      DynamicSet.bind(binder(), VoteDeletedListener.class).to(StreamEventsApiListener.class);
-      DynamicSet.bind(binder(), WorkInProgressStateChangedListener.class)
-          .to(StreamEventsApiListener.class);
-    }
-  }
-
-  private final DynamicItem<EventDispatcher> dispatcher;
-  private final Provider<ReviewDb> db;
-  private final EventFactory eventFactory;
-  private final ProjectCache projectCache;
-  private final GitRepositoryManager repoManager;
-  private final PatchSetUtil psUtil;
-  private final ChangeNotes.Factory changeNotesFactory;
-
-  @Inject
-  StreamEventsApiListener(
-      DynamicItem<EventDispatcher> dispatcher,
-      Provider<ReviewDb> db,
-      EventFactory eventFactory,
-      ProjectCache projectCache,
-      GitRepositoryManager repoManager,
-      PatchSetUtil psUtil,
-      ChangeNotes.Factory changeNotesFactory) {
-    this.dispatcher = dispatcher;
-    this.db = db;
-    this.eventFactory = eventFactory;
-    this.projectCache = projectCache;
-    this.repoManager = repoManager;
-    this.psUtil = psUtil;
-    this.changeNotesFactory = changeNotesFactory;
-  }
-
-  private ChangeNotes getNotes(ChangeInfo info) throws OrmException {
-    try {
-      return changeNotesFactory.createChecked(new Change.Id(info._number));
-    } catch (NoSuchChangeException e) {
-      throw new OrmException(e);
-    }
-  }
-
-  private Change getChange(ChangeInfo info) throws OrmException {
-    return getNotes(info).getChange();
-  }
-
-  private PatchSet getPatchSet(ChangeNotes notes, RevisionInfo info) throws OrmException {
-    return psUtil.get(db.get(), notes, PatchSet.Id.fromRef(info.ref));
-  }
-
-  private Supplier<ChangeAttribute> changeAttributeSupplier(Change change) {
-    return Suppliers.memoize(
-        new Supplier<ChangeAttribute>() {
-          @Override
-          public ChangeAttribute get() {
-            return eventFactory.asChangeAttribute(change);
-          }
-        });
-  }
-
-  private Supplier<AccountAttribute> accountAttributeSupplier(AccountInfo account) {
-    return Suppliers.memoize(
-        new Supplier<AccountAttribute>() {
-          @Override
-          public AccountAttribute get() {
-            return account != null
-                ? eventFactory.asAccountAttribute(new Account.Id(account._accountId))
-                : null;
-          }
-        });
-  }
-
-  private Supplier<PatchSetAttribute> patchSetAttributeSupplier(
-      final Change change, PatchSet patchSet) {
-    return Suppliers.memoize(
-        new Supplier<PatchSetAttribute>() {
-          @Override
-          public PatchSetAttribute get() {
-            try (Repository repo = repoManager.openRepository(change.getProject());
-                RevWalk revWalk = new RevWalk(repo)) {
-              return eventFactory.asPatchSetAttribute(revWalk, change, patchSet);
-            } catch (IOException e) {
-              throw new RuntimeException(e);
-            }
-          }
-        });
-  }
-
-  private static Map<String, Short> convertApprovalsMap(Map<String, ApprovalInfo> approvals) {
-    Map<String, Short> result = new HashMap<>();
-    for (Entry<String, ApprovalInfo> e : approvals.entrySet()) {
-      Short value = e.getValue().value == null ? null : e.getValue().value.shortValue();
-      result.put(e.getKey(), value);
-    }
-    return result;
-  }
-
-  private ApprovalAttribute getApprovalAttribute(
-      LabelTypes labelTypes, Entry<String, Short> approval, Map<String, Short> oldApprovals) {
-    ApprovalAttribute a = new ApprovalAttribute();
-    a.type = approval.getKey();
-
-    if (oldApprovals != null && !oldApprovals.isEmpty()) {
-      if (oldApprovals.get(approval.getKey()) != null) {
-        a.oldValue = Short.toString(oldApprovals.get(approval.getKey()));
-      }
-    }
-    LabelType lt = labelTypes.byLabel(approval.getKey());
-    if (lt != null) {
-      a.description = lt.getName();
-    }
-    if (approval.getValue() != null) {
-      a.value = Short.toString(approval.getValue());
-    }
-    return a;
-  }
-
-  private Supplier<ApprovalAttribute[]> approvalsAttributeSupplier(
-      final Change change,
-      Map<String, ApprovalInfo> newApprovals,
-      final Map<String, ApprovalInfo> oldApprovals) {
-    final Map<String, Short> approvals = convertApprovalsMap(newApprovals);
-    return Suppliers.memoize(
-        new Supplier<ApprovalAttribute[]>() {
-          @Override
-          public ApprovalAttribute[] get() {
-            LabelTypes labelTypes = projectCache.get(change.getProject()).getLabelTypes();
-            if (approvals.size() > 0) {
-              ApprovalAttribute[] r = new ApprovalAttribute[approvals.size()];
-              int i = 0;
-              for (Map.Entry<String, Short> approval : approvals.entrySet()) {
-                r[i++] =
-                    getApprovalAttribute(labelTypes, approval, convertApprovalsMap(oldApprovals));
-              }
-              return r;
-            }
-            return null;
-          }
-        });
-  }
-
-  String[] hashtagArray(Collection<String> hashtags) {
-    if (hashtags != null && hashtags.size() > 0) {
-      return Sets.newHashSet(hashtags).toArray(new String[hashtags.size()]);
-    }
-    return null;
-  }
-
-  @Override
-  public void onAssigneeChanged(AssigneeChangedListener.Event ev) {
-    try {
-      Change change = getChange(ev.getChange());
-      AssigneeChangedEvent event = new AssigneeChangedEvent(change);
-
-      event.change = changeAttributeSupplier(change);
-      event.changer = accountAttributeSupplier(ev.getWho());
-      event.oldAssignee = accountAttributeSupplier(ev.getOldAssignee());
-
-      dispatcher.get().postEvent(change, event);
-    } catch (OrmException | PermissionBackendException e) {
-      log.error("Failed to dispatch event", e);
-    }
-  }
-
-  @Override
-  public void onTopicEdited(TopicEditedListener.Event ev) {
-    try {
-      Change change = getChange(ev.getChange());
-      TopicChangedEvent event = new TopicChangedEvent(change);
-
-      event.change = changeAttributeSupplier(change);
-      event.changer = accountAttributeSupplier(ev.getWho());
-      event.oldTopic = ev.getOldTopic();
-
-      dispatcher.get().postEvent(change, event);
-    } catch (OrmException | PermissionBackendException e) {
-      log.error("Failed to dispatch event", e);
-    }
-  }
-
-  @Override
-  public void onRevisionCreated(RevisionCreatedListener.Event ev) {
-    try {
-      ChangeNotes notes = getNotes(ev.getChange());
-      Change change = notes.getChange();
-      PatchSet patchSet = getPatchSet(notes, ev.getRevision());
-      PatchSetCreatedEvent event = new PatchSetCreatedEvent(change);
-
-      event.change = changeAttributeSupplier(change);
-      event.patchSet = patchSetAttributeSupplier(change, patchSet);
-      event.uploader = accountAttributeSupplier(ev.getWho());
-
-      dispatcher.get().postEvent(change, event);
-    } catch (OrmException | PermissionBackendException e) {
-      log.error("Failed to dispatch event", e);
-    }
-  }
-
-  @Override
-  public void onReviewerDeleted(ReviewerDeletedListener.Event ev) {
-    try {
-      ChangeNotes notes = getNotes(ev.getChange());
-      Change change = notes.getChange();
-      ReviewerDeletedEvent event = new ReviewerDeletedEvent(change);
-      event.change = changeAttributeSupplier(change);
-      event.patchSet = patchSetAttributeSupplier(change, psUtil.current(db.get(), notes));
-      event.reviewer = accountAttributeSupplier(ev.getReviewer());
-      event.remover = accountAttributeSupplier(ev.getWho());
-      event.comment = ev.getComment();
-      event.approvals =
-          approvalsAttributeSupplier(change, ev.getNewApprovals(), ev.getOldApprovals());
-
-      dispatcher.get().postEvent(change, event);
-    } catch (OrmException | PermissionBackendException e) {
-      log.error("Failed to dispatch event", e);
-    }
-  }
-
-  @Override
-  public void onReviewersAdded(ReviewerAddedListener.Event ev) {
-    try {
-      ChangeNotes notes = getNotes(ev.getChange());
-      Change change = notes.getChange();
-      ReviewerAddedEvent event = new ReviewerAddedEvent(change);
-
-      event.change = changeAttributeSupplier(change);
-      event.patchSet = patchSetAttributeSupplier(change, psUtil.current(db.get(), notes));
-      for (AccountInfo reviewer : ev.getReviewers()) {
-        event.reviewer = accountAttributeSupplier(reviewer);
-        dispatcher.get().postEvent(change, event);
-      }
-    } catch (OrmException | PermissionBackendException e) {
-      log.error("Failed to dispatch event", e);
-    }
-  }
-
-  @Override
-  public void onNewProjectCreated(NewProjectCreatedListener.Event ev) {
-    ProjectCreatedEvent event = new ProjectCreatedEvent();
-    event.projectName = ev.getProjectName();
-    event.headName = ev.getHeadName();
-
-    dispatcher.get().postEvent(event.getProjectNameKey(), event);
-  }
-
-  @Override
-  public void onHashtagsEdited(HashtagsEditedListener.Event ev) {
-    try {
-      Change change = getChange(ev.getChange());
-      HashtagsChangedEvent event = new HashtagsChangedEvent(change);
-
-      event.change = changeAttributeSupplier(change);
-      event.editor = accountAttributeSupplier(ev.getWho());
-      event.hashtags = hashtagArray(ev.getHashtags());
-      event.added = hashtagArray(ev.getAddedHashtags());
-      event.removed = hashtagArray(ev.getRemovedHashtags());
-
-      dispatcher.get().postEvent(change, event);
-    } catch (OrmException | PermissionBackendException e) {
-      log.error("Failed to dispatch event", e);
-    }
-  }
-
-  @Override
-  public void onGitReferenceUpdated(GitReferenceUpdatedListener.Event ev) {
-    RefUpdatedEvent event = new RefUpdatedEvent();
-    if (ev.getUpdater() != null) {
-      event.submitter = accountAttributeSupplier(ev.getUpdater());
-    }
-    final Branch.NameKey refName = new Branch.NameKey(ev.getProjectName(), ev.getRefName());
-    event.refUpdate =
-        Suppliers.memoize(
-            new Supplier<RefUpdateAttribute>() {
-              @Override
-              public RefUpdateAttribute get() {
-                return eventFactory.asRefUpdateAttribute(
-                    ObjectId.fromString(ev.getOldObjectId()),
-                    ObjectId.fromString(ev.getNewObjectId()),
-                    refName);
-              }
-            });
-    try {
-      dispatcher.get().postEvent(refName, event);
-    } catch (PermissionBackendException e) {
-      log.error("error while posting event", e);
-    }
-  }
-
-  @Override
-  public void onCommentAdded(CommentAddedListener.Event ev) {
-    try {
-      ChangeNotes notes = getNotes(ev.getChange());
-      Change change = notes.getChange();
-      PatchSet ps = getPatchSet(notes, ev.getRevision());
-      CommentAddedEvent event = new CommentAddedEvent(change);
-
-      event.change = changeAttributeSupplier(change);
-      event.author = accountAttributeSupplier(ev.getWho());
-      event.patchSet = patchSetAttributeSupplier(change, ps);
-      event.comment = ev.getComment();
-      event.approvals = approvalsAttributeSupplier(change, ev.getApprovals(), ev.getOldApprovals());
-
-      dispatcher.get().postEvent(change, event);
-    } catch (OrmException | PermissionBackendException e) {
-      log.error("Failed to dispatch event", e);
-    }
-  }
-
-  @Override
-  public void onChangeRestored(ChangeRestoredListener.Event ev) {
-    try {
-      ChangeNotes notes = getNotes(ev.getChange());
-      Change change = notes.getChange();
-      ChangeRestoredEvent event = new ChangeRestoredEvent(change);
-
-      event.change = changeAttributeSupplier(change);
-      event.restorer = accountAttributeSupplier(ev.getWho());
-      event.patchSet = patchSetAttributeSupplier(change, psUtil.current(db.get(), notes));
-      event.reason = ev.getReason();
-
-      dispatcher.get().postEvent(change, event);
-    } catch (OrmException | PermissionBackendException e) {
-      log.error("Failed to dispatch event", e);
-    }
-  }
-
-  @Override
-  public void onChangeMerged(ChangeMergedListener.Event ev) {
-    try {
-      ChangeNotes notes = getNotes(ev.getChange());
-      Change change = notes.getChange();
-      ChangeMergedEvent event = new ChangeMergedEvent(change);
-
-      event.change = changeAttributeSupplier(change);
-      event.submitter = accountAttributeSupplier(ev.getWho());
-      event.patchSet = patchSetAttributeSupplier(change, psUtil.current(db.get(), notes));
-      event.newRev = ev.getNewRevisionId();
-
-      dispatcher.get().postEvent(change, event);
-    } catch (OrmException | PermissionBackendException e) {
-      log.error("Failed to dispatch event", e);
-    }
-  }
-
-  @Override
-  public void onChangeAbandoned(ChangeAbandonedListener.Event ev) {
-    try {
-      ChangeNotes notes = getNotes(ev.getChange());
-      Change change = notes.getChange();
-      ChangeAbandonedEvent event = new ChangeAbandonedEvent(change);
-
-      event.change = changeAttributeSupplier(change);
-      event.abandoner = accountAttributeSupplier(ev.getWho());
-      event.patchSet = patchSetAttributeSupplier(change, psUtil.current(db.get(), notes));
-      event.reason = ev.getReason();
-
-      dispatcher.get().postEvent(change, event);
-    } catch (OrmException | PermissionBackendException e) {
-      log.error("Failed to dispatch event", e);
-    }
-  }
-
-  @Override
-  public void onWorkInProgressStateChanged(WorkInProgressStateChangedListener.Event ev) {
-    try {
-      ChangeNotes notes = getNotes(ev.getChange());
-      Change change = notes.getChange();
-      PatchSet patchSet = getPatchSet(notes, ev.getRevision());
-      WorkInProgressStateChangedEvent event = new WorkInProgressStateChangedEvent(change);
-
-      event.change = changeAttributeSupplier(change);
-      event.changer = accountAttributeSupplier(ev.getWho());
-      event.patchSet = patchSetAttributeSupplier(change, patchSet);
-
-      dispatcher.get().postEvent(change, event);
-    } catch (OrmException | PermissionBackendException e) {
-      log.error("Failed to dispatch event", e);
-    }
-  }
-
-  @Override
-  public void onPrivateStateChanged(PrivateStateChangedListener.Event ev) {
-    try {
-      ChangeNotes notes = getNotes(ev.getChange());
-      Change change = notes.getChange();
-      PatchSet patchSet = getPatchSet(notes, ev.getRevision());
-      PrivateStateChangedEvent event = new PrivateStateChangedEvent(change);
-
-      event.change = changeAttributeSupplier(change);
-      event.changer = accountAttributeSupplier(ev.getWho());
-      event.patchSet = patchSetAttributeSupplier(change, patchSet);
-
-      dispatcher.get().postEvent(change, event);
-    } catch (OrmException | PermissionBackendException e) {
-      log.error("Failed to dispatch event", e);
-    }
-  }
-
-  @Override
-  public void onVoteDeleted(VoteDeletedListener.Event ev) {
-    try {
-      ChangeNotes notes = getNotes(ev.getChange());
-      Change change = notes.getChange();
-      VoteDeletedEvent event = new VoteDeletedEvent(change);
-
-      event.change = changeAttributeSupplier(change);
-      event.patchSet = patchSetAttributeSupplier(change, psUtil.current(db.get(), notes));
-      event.comment = ev.getMessage();
-      event.reviewer = accountAttributeSupplier(ev.getReviewer());
-      event.remover = accountAttributeSupplier(ev.getWho());
-      event.approvals = approvalsAttributeSupplier(change, ev.getApprovals(), ev.getOldApprovals());
-
-      dispatcher.get().postEvent(change, event);
-    } catch (OrmException | PermissionBackendException e) {
-      log.error("Failed to dispatch event", e);
-    }
-  }
-
-  @Override
-  public void onChangeDeleted(ChangeDeletedListener.Event ev) {
-    try {
-      ChangeNotes notes = getNotes(ev.getChange());
-      Change change = notes.getChange();
-      ChangeDeletedEvent event = new ChangeDeletedEvent(change);
-
-      event.change = changeAttributeSupplier(change);
-      event.deleter = accountAttributeSupplier(ev.getWho());
-
-      dispatcher.get().postEvent(change, event);
-    } catch (OrmException | PermissionBackendException e) {
-      log.error("Failed to dispatch event", e);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AgreementSignup.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AgreementSignup.java
deleted file mode 100644
index 45f1159..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AgreementSignup.java
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.extensions.events;
-
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.events.AgreementSignupListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-@Singleton
-public class AgreementSignup {
-  private final DynamicSet<AgreementSignupListener> listeners;
-  private final EventUtil util;
-
-  @Inject
-  AgreementSignup(DynamicSet<AgreementSignupListener> listeners, EventUtil util) {
-    this.listeners = listeners;
-    this.util = util;
-  }
-
-  public void fire(Account account, String agreementName) {
-    if (!listeners.iterator().hasNext()) {
-      return;
-    }
-    Event event = new Event(util.accountInfo(account), agreementName);
-    for (AgreementSignupListener l : listeners) {
-      try {
-        l.onAgreementSignup(event);
-      } catch (Exception e) {
-        util.logEventListenerError(this, l, e);
-      }
-    }
-  }
-
-  private static class Event extends AbstractNoNotifyEvent
-      implements AgreementSignupListener.Event {
-    private final AccountInfo account;
-    private final String agreementName;
-
-    Event(AccountInfo account, String agreementName) {
-      this.account = account;
-      this.agreementName = agreementName;
-    }
-
-    @Override
-    public AccountInfo getAccount() {
-      return account;
-    }
-
-    @Override
-    public String getAgreementName() {
-      return agreementName;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AssigneeChanged.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AssigneeChanged.java
deleted file mode 100644
index 8f8f13e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AssigneeChanged.java
+++ /dev/null
@@ -1,80 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.extensions.events;
-
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.events.AssigneeChangedListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.sql.Timestamp;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class AssigneeChanged {
-  private static final Logger log = LoggerFactory.getLogger(AssigneeChanged.class);
-
-  private final DynamicSet<AssigneeChangedListener> listeners;
-  private final EventUtil util;
-
-  @Inject
-  AssigneeChanged(DynamicSet<AssigneeChangedListener> listeners, EventUtil util) {
-    this.listeners = listeners;
-    this.util = util;
-  }
-
-  public void fire(Change change, Account account, Account oldAssignee, Timestamp when) {
-    if (!listeners.iterator().hasNext()) {
-      return;
-    }
-    try {
-      Event event =
-          new Event(
-              util.changeInfo(change),
-              util.accountInfo(account),
-              util.accountInfo(oldAssignee),
-              when);
-      for (AssigneeChangedListener l : listeners) {
-        try {
-          l.onAssigneeChanged(event);
-        } catch (Exception e) {
-          util.logEventListenerError(event, l, e);
-        }
-      }
-    } catch (OrmException e) {
-      log.error("Couldn't fire event", e);
-    }
-  }
-
-  private static class Event extends AbstractChangeEvent implements AssigneeChangedListener.Event {
-    private final AccountInfo oldAssignee;
-
-    Event(ChangeInfo change, AccountInfo editor, AccountInfo oldAssignee, Timestamp when) {
-      super(change, editor, when, NotifyHandling.ALL);
-      this.oldAssignee = oldAssignee;
-    }
-
-    @Override
-    public AccountInfo getOldAssignee() {
-      return oldAssignee;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeAbandoned.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeAbandoned.java
deleted file mode 100644
index 8b8522a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeAbandoned.java
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.extensions.events;
-
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.RevisionInfo;
-import com.google.gerrit.extensions.events.ChangeAbandonedListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.server.GpgException;
-import com.google.gerrit.server.patch.PatchListNotAvailableException;
-import com.google.gerrit.server.patch.PatchListObjectTooLargeException;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.sql.Timestamp;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class ChangeAbandoned {
-  private static final Logger log = LoggerFactory.getLogger(ChangeAbandoned.class);
-
-  private final DynamicSet<ChangeAbandonedListener> listeners;
-  private final EventUtil util;
-
-  @Inject
-  ChangeAbandoned(DynamicSet<ChangeAbandonedListener> listeners, EventUtil util) {
-    this.listeners = listeners;
-    this.util = util;
-  }
-
-  public void fire(
-      Change change,
-      PatchSet ps,
-      Account abandoner,
-      String reason,
-      Timestamp when,
-      NotifyHandling notifyHandling) {
-    if (!listeners.iterator().hasNext()) {
-      return;
-    }
-    try {
-      Event event =
-          new Event(
-              util.changeInfo(change),
-              util.revisionInfo(change.getProject(), ps),
-              util.accountInfo(abandoner),
-              reason,
-              when,
-              notifyHandling);
-      for (ChangeAbandonedListener l : listeners) {
-        try {
-          l.onChangeAbandoned(event);
-        } catch (Exception e) {
-          util.logEventListenerError(this, l, e);
-        }
-      }
-    } catch (PatchListObjectTooLargeException e) {
-      log.warn("Couldn't fire event: " + e.getMessage());
-    } catch (PatchListNotAvailableException
-        | GpgException
-        | IOException
-        | OrmException
-        | PermissionBackendException e) {
-      log.error("Couldn't fire event", e);
-    }
-  }
-
-  private static class Event extends AbstractRevisionEvent
-      implements ChangeAbandonedListener.Event {
-    private final String reason;
-
-    Event(
-        ChangeInfo change,
-        RevisionInfo revision,
-        AccountInfo abandoner,
-        String reason,
-        Timestamp when,
-        NotifyHandling notifyHandling) {
-      super(change, revision, abandoner, when, notifyHandling);
-      this.reason = reason;
-    }
-
-    @Override
-    public String getReason() {
-      return reason;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeDeleted.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeDeleted.java
deleted file mode 100644
index 26bc229..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeDeleted.java
+++ /dev/null
@@ -1,67 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.extensions.events;
-
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.events.ChangeDeletedListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.sql.Timestamp;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class ChangeDeleted {
-  private static final Logger log = LoggerFactory.getLogger(ChangeDeleted.class);
-
-  private final DynamicSet<ChangeDeletedListener> listeners;
-  private final EventUtil util;
-
-  @Inject
-  ChangeDeleted(DynamicSet<ChangeDeletedListener> listeners, EventUtil util) {
-    this.listeners = listeners;
-    this.util = util;
-  }
-
-  public void fire(Change change, Account deleter, Timestamp when) {
-    if (!listeners.iterator().hasNext()) {
-      return;
-    }
-    try {
-      Event event = new Event(util.changeInfo(change), util.accountInfo(deleter), when);
-      for (ChangeDeletedListener l : listeners) {
-        try {
-          l.onChangeDeleted(event);
-        } catch (Exception e) {
-          util.logEventListenerError(this, l, e);
-        }
-      }
-    } catch (OrmException e) {
-      log.error("Couldn't fire event", e);
-    }
-  }
-
-  private static class Event extends AbstractChangeEvent implements ChangeDeletedListener.Event {
-    Event(ChangeInfo change, AccountInfo deleter, Timestamp when) {
-      super(change, deleter, when, NotifyHandling.ALL);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeMerged.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeMerged.java
deleted file mode 100644
index 217e5d6..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeMerged.java
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.extensions.events;
-
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.RevisionInfo;
-import com.google.gerrit.extensions.events.ChangeMergedListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.server.GpgException;
-import com.google.gerrit.server.patch.PatchListNotAvailableException;
-import com.google.gerrit.server.patch.PatchListObjectTooLargeException;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.sql.Timestamp;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class ChangeMerged {
-  private static final Logger log = LoggerFactory.getLogger(ChangeMerged.class);
-
-  private final DynamicSet<ChangeMergedListener> listeners;
-  private final EventUtil util;
-
-  @Inject
-  ChangeMerged(DynamicSet<ChangeMergedListener> listeners, EventUtil util) {
-    this.listeners = listeners;
-    this.util = util;
-  }
-
-  public void fire(
-      Change change, PatchSet ps, Account merger, String newRevisionId, Timestamp when) {
-    if (!listeners.iterator().hasNext()) {
-      return;
-    }
-    try {
-      Event event =
-          new Event(
-              util.changeInfo(change),
-              util.revisionInfo(change.getProject(), ps),
-              util.accountInfo(merger),
-              newRevisionId,
-              when);
-      for (ChangeMergedListener l : listeners) {
-        try {
-          l.onChangeMerged(event);
-        } catch (Exception e) {
-          util.logEventListenerError(this, l, e);
-        }
-      }
-    } catch (PatchListObjectTooLargeException e) {
-      log.warn("Couldn't fire event: " + e.getMessage());
-    } catch (PatchListNotAvailableException
-        | GpgException
-        | IOException
-        | OrmException
-        | PermissionBackendException e) {
-      log.error("Couldn't fire event", e);
-    }
-  }
-
-  private static class Event extends AbstractRevisionEvent implements ChangeMergedListener.Event {
-    private final String newRevisionId;
-
-    Event(
-        ChangeInfo change,
-        RevisionInfo revision,
-        AccountInfo merger,
-        String newRevisionId,
-        Timestamp when) {
-      super(change, revision, merger, when, NotifyHandling.ALL);
-      this.newRevisionId = newRevisionId;
-    }
-
-    @Override
-    public String getNewRevisionId() {
-      return newRevisionId;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeRestored.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeRestored.java
deleted file mode 100644
index 6715467..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeRestored.java
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.extensions.events;
-
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.RevisionInfo;
-import com.google.gerrit.extensions.events.ChangeRestoredListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.server.GpgException;
-import com.google.gerrit.server.patch.PatchListNotAvailableException;
-import com.google.gerrit.server.patch.PatchListObjectTooLargeException;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.sql.Timestamp;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class ChangeRestored {
-  private static final Logger log = LoggerFactory.getLogger(ChangeRestored.class);
-
-  private final DynamicSet<ChangeRestoredListener> listeners;
-  private final EventUtil util;
-
-  @Inject
-  ChangeRestored(DynamicSet<ChangeRestoredListener> listeners, EventUtil util) {
-    this.listeners = listeners;
-    this.util = util;
-  }
-
-  public void fire(Change change, PatchSet ps, Account restorer, String reason, Timestamp when) {
-    if (!listeners.iterator().hasNext()) {
-      return;
-    }
-    try {
-      Event event =
-          new Event(
-              util.changeInfo(change),
-              util.revisionInfo(change.getProject(), ps),
-              util.accountInfo(restorer),
-              reason,
-              when);
-      for (ChangeRestoredListener l : listeners) {
-        try {
-          l.onChangeRestored(event);
-        } catch (Exception e) {
-          util.logEventListenerError(this, l, e);
-        }
-      }
-    } catch (PatchListObjectTooLargeException e) {
-      log.warn("Couldn't fire event: " + e.getMessage());
-    } catch (PatchListNotAvailableException
-        | GpgException
-        | IOException
-        | OrmException
-        | PermissionBackendException e) {
-      log.error("Couldn't fire event", e);
-    }
-  }
-
-  private static class Event extends AbstractRevisionEvent implements ChangeRestoredListener.Event {
-
-    private String reason;
-
-    Event(
-        ChangeInfo change,
-        RevisionInfo revision,
-        AccountInfo restorer,
-        String reason,
-        Timestamp when) {
-      super(change, revision, restorer, when, NotifyHandling.ALL);
-      this.reason = reason;
-    }
-
-    @Override
-    public String getReason() {
-      return reason;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeReverted.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeReverted.java
deleted file mode 100644
index 1e91ab3..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ChangeReverted.java
+++ /dev/null
@@ -1,73 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.extensions.events;
-
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.events.ChangeRevertedListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.sql.Timestamp;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class ChangeReverted {
-  private static final Logger log = LoggerFactory.getLogger(ChangeReverted.class);
-
-  private final DynamicSet<ChangeRevertedListener> listeners;
-  private final EventUtil util;
-
-  @Inject
-  ChangeReverted(DynamicSet<ChangeRevertedListener> listeners, EventUtil util) {
-    this.listeners = listeners;
-    this.util = util;
-  }
-
-  public void fire(Change change, Change revertChange, Timestamp when) {
-    if (!listeners.iterator().hasNext()) {
-      return;
-    }
-    try {
-      Event event = new Event(util.changeInfo(change), util.changeInfo(revertChange), when);
-      for (ChangeRevertedListener l : listeners) {
-        try {
-          l.onChangeReverted(event);
-        } catch (Exception e) {
-          util.logEventListenerError(this, l, e);
-        }
-      }
-    } catch (OrmException e) {
-      log.error("Couldn't fire event", e);
-    }
-  }
-
-  private static class Event extends AbstractChangeEvent implements ChangeRevertedListener.Event {
-    private final ChangeInfo revertChange;
-
-    Event(ChangeInfo change, ChangeInfo revertChange, Timestamp when) {
-      super(change, revertChange.owner, when, NotifyHandling.ALL);
-      this.revertChange = revertChange;
-    }
-
-    @Override
-    public ChangeInfo getRevertChange() {
-      return revertChange;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/CommentAdded.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/CommentAdded.java
deleted file mode 100644
index 03ad58c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/CommentAdded.java
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.extensions.events;
-
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.ApprovalInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.RevisionInfo;
-import com.google.gerrit.extensions.events.CommentAddedListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.server.GpgException;
-import com.google.gerrit.server.patch.PatchListNotAvailableException;
-import com.google.gerrit.server.patch.PatchListObjectTooLargeException;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.Map;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class CommentAdded {
-  private static final Logger log = LoggerFactory.getLogger(CommentAdded.class);
-
-  private final DynamicSet<CommentAddedListener> listeners;
-  private final EventUtil util;
-
-  @Inject
-  CommentAdded(DynamicSet<CommentAddedListener> listeners, EventUtil util) {
-    this.listeners = listeners;
-    this.util = util;
-  }
-
-  public void fire(
-      Change change,
-      PatchSet ps,
-      Account author,
-      String comment,
-      Map<String, Short> approvals,
-      Map<String, Short> oldApprovals,
-      Timestamp when) {
-    if (!listeners.iterator().hasNext()) {
-      return;
-    }
-    try {
-      Event event =
-          new Event(
-              util.changeInfo(change),
-              util.revisionInfo(change.getProject(), ps),
-              util.accountInfo(author),
-              comment,
-              util.approvals(author, approvals, when),
-              util.approvals(author, oldApprovals, when),
-              when);
-      for (CommentAddedListener l : listeners) {
-        try {
-          l.onCommentAdded(event);
-        } catch (Exception e) {
-          util.logEventListenerError(this, l, e);
-        }
-      }
-    } catch (PatchListObjectTooLargeException e) {
-      log.warn("Couldn't fire event: " + e.getMessage());
-    } catch (PatchListNotAvailableException
-        | GpgException
-        | IOException
-        | OrmException
-        | PermissionBackendException e) {
-      log.error("Couldn't fire event", e);
-    }
-  }
-
-  private static class Event extends AbstractRevisionEvent implements CommentAddedListener.Event {
-
-    private final String comment;
-    private final Map<String, ApprovalInfo> approvals;
-    private final Map<String, ApprovalInfo> oldApprovals;
-
-    Event(
-        ChangeInfo change,
-        RevisionInfo revision,
-        AccountInfo author,
-        String comment,
-        Map<String, ApprovalInfo> approvals,
-        Map<String, ApprovalInfo> oldApprovals,
-        Timestamp when) {
-      super(change, revision, author, when, NotifyHandling.ALL);
-      this.comment = comment;
-      this.approvals = approvals;
-      this.oldApprovals = oldApprovals;
-    }
-
-    @Override
-    public String getComment() {
-      return comment;
-    }
-
-    @Override
-    public Map<String, ApprovalInfo> getApprovals() {
-      return approvals;
-    }
-
-    @Override
-    public Map<String, ApprovalInfo> getOldApprovals() {
-      return oldApprovals;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/EventUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/EventUtil.java
deleted file mode 100644
index bb0c3ce..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/EventUtil.java
+++ /dev/null
@@ -1,143 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.extensions.events;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Sets;
-import com.google.gerrit.extensions.client.ListChangesOption;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.ApprovalInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.RevisionInfo;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.GpgException;
-import com.google.gerrit.server.change.ChangeJson;
-import com.google.gerrit.server.patch.PatchListNotAvailableException;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.Map;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class EventUtil {
-  private static final Logger log = LoggerFactory.getLogger(EventUtil.class);
-
-  private static final ImmutableSet<ListChangesOption> CHANGE_OPTIONS;
-
-  static {
-    EnumSet<ListChangesOption> opts = EnumSet.allOf(ListChangesOption.class);
-
-    // Some options, like actions, are expensive to compute because they potentially have to walk
-    // lots of history and inspect lots of other changes.
-    opts.remove(ListChangesOption.CHANGE_ACTIONS);
-    opts.remove(ListChangesOption.CURRENT_ACTIONS);
-
-    // CHECK suppresses some exceptions on corrupt changes, which is not appropriate for passing
-    // through the event system as we would rather let them propagate.
-    opts.remove(ListChangesOption.CHECK);
-
-    CHANGE_OPTIONS = Sets.immutableEnumSet(opts);
-  }
-
-  private final ChangeData.Factory changeDataFactory;
-  private final Provider<ReviewDb> db;
-  private final ChangeJson.Factory changeJsonFactory;
-
-  @Inject
-  EventUtil(
-      ChangeJson.Factory changeJsonFactory,
-      ChangeData.Factory changeDataFactory,
-      Provider<ReviewDb> db) {
-    this.changeDataFactory = changeDataFactory;
-    this.db = db;
-    this.changeJsonFactory = changeJsonFactory;
-  }
-
-  public ChangeInfo changeInfo(Change change) throws OrmException {
-    return changeJsonFactory.create(CHANGE_OPTIONS).format(change);
-  }
-
-  public RevisionInfo revisionInfo(Project project, PatchSet ps)
-      throws OrmException, PatchListNotAvailableException, GpgException, IOException,
-          PermissionBackendException {
-    return revisionInfo(project.getNameKey(), ps);
-  }
-
-  public RevisionInfo revisionInfo(Project.NameKey project, PatchSet ps)
-      throws OrmException, PatchListNotAvailableException, GpgException, IOException,
-          PermissionBackendException {
-    ChangeData cd = changeDataFactory.create(db.get(), project, ps.getId().getParentKey());
-    return changeJsonFactory.create(CHANGE_OPTIONS).getRevisionInfo(cd, ps);
-  }
-
-  public AccountInfo accountInfo(Account a) {
-    if (a == null || a.getId() == null) {
-      return null;
-    }
-    AccountInfo accountInfo = new AccountInfo(a.getId().get());
-    accountInfo.email = a.getPreferredEmail();
-    accountInfo.name = a.getFullName();
-    accountInfo.username = a.getUserName();
-    return accountInfo;
-  }
-
-  public Map<String, ApprovalInfo> approvals(
-      Account a, Map<String, Short> approvals, Timestamp ts) {
-    Map<String, ApprovalInfo> result = new HashMap<>();
-    for (Map.Entry<String, Short> e : approvals.entrySet()) {
-      Integer value = e.getValue() != null ? Integer.valueOf(e.getValue()) : null;
-      result.put(e.getKey(), ChangeJson.getApprovalInfo(a.getId(), value, null, null, ts));
-    }
-    return result;
-  }
-
-  public void logEventListenerError(Object event, Object listener, Exception error) {
-    if (log.isDebugEnabled()) {
-      log.debug(
-          "Error in event listener {} for event {}",
-          listener.getClass().getName(),
-          event.getClass().getName(),
-          error);
-    } else {
-      log.warn(
-          "Error in event listener {} for event {}: {} - {}",
-          listener.getClass().getName(),
-          event.getClass().getName(),
-          error.getClass().getName(),
-          error.getMessage());
-    }
-  }
-
-  public static void logEventListenerError(Object listener, Exception error) {
-    if (log.isDebugEnabled()) {
-      log.debug("Error in event listener {}", listener.getClass().getName(), error);
-    } else {
-      log.warn("Error in event listener {}: {}", listener.getClass().getName(), error.getMessage());
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/GitReferenceUpdated.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/GitReferenceUpdated.java
deleted file mode 100644
index be14827..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/GitReferenceUpdated.java
+++ /dev/null
@@ -1,233 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.extensions.events;
-
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import org.eclipse.jgit.lib.BatchRefUpdate;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.transport.ReceiveCommand;
-
-@Singleton
-public class GitReferenceUpdated {
-  public static final GitReferenceUpdated DISABLED =
-      new GitReferenceUpdated() {
-        @Override
-        public void fire(
-            Project.NameKey project,
-            RefUpdate refUpdate,
-            ReceiveCommand.Type type,
-            Account updater) {}
-
-        @Override
-        public void fire(Project.NameKey project, RefUpdate refUpdate, Account updater) {}
-
-        @Override
-        public void fire(
-            Project.NameKey project,
-            String ref,
-            ObjectId oldObjectId,
-            ObjectId newObjectId,
-            Account updater) {}
-
-        @Override
-        public void fire(Project.NameKey project, ReceiveCommand cmd, Account updater) {}
-
-        @Override
-        public void fire(Project.NameKey project, BatchRefUpdate batchRefUpdate, Account updater) {}
-      };
-
-  private final DynamicSet<GitReferenceUpdatedListener> listeners;
-  private final EventUtil util;
-
-  @Inject
-  GitReferenceUpdated(DynamicSet<GitReferenceUpdatedListener> listeners, EventUtil util) {
-    this.listeners = listeners;
-    this.util = util;
-  }
-
-  private GitReferenceUpdated() {
-    this.listeners = null;
-    this.util = null;
-  }
-
-  public void fire(
-      Project.NameKey project, RefUpdate refUpdate, ReceiveCommand.Type type, Account updater) {
-    fire(
-        project,
-        refUpdate.getName(),
-        refUpdate.getOldObjectId(),
-        refUpdate.getNewObjectId(),
-        type,
-        util.accountInfo(updater));
-  }
-
-  public void fire(Project.NameKey project, RefUpdate refUpdate, Account updater) {
-    fire(
-        project,
-        refUpdate.getName(),
-        refUpdate.getOldObjectId(),
-        refUpdate.getNewObjectId(),
-        ReceiveCommand.Type.UPDATE,
-        util.accountInfo(updater));
-  }
-
-  public void fire(
-      Project.NameKey project,
-      String ref,
-      ObjectId oldObjectId,
-      ObjectId newObjectId,
-      Account updater) {
-    fire(
-        project,
-        ref,
-        oldObjectId,
-        newObjectId,
-        ReceiveCommand.Type.UPDATE,
-        util.accountInfo(updater));
-  }
-
-  public void fire(Project.NameKey project, ReceiveCommand cmd, Account updater) {
-    fire(
-        project,
-        cmd.getRefName(),
-        cmd.getOldId(),
-        cmd.getNewId(),
-        cmd.getType(),
-        util.accountInfo(updater));
-  }
-
-  public void fire(Project.NameKey project, BatchRefUpdate batchRefUpdate, Account updater) {
-    if (!listeners.iterator().hasNext()) {
-      return;
-    }
-    for (ReceiveCommand cmd : batchRefUpdate.getCommands()) {
-      if (cmd.getResult() == ReceiveCommand.Result.OK) {
-        fire(
-            project,
-            cmd.getRefName(),
-            cmd.getOldId(),
-            cmd.getNewId(),
-            cmd.getType(),
-            util.accountInfo(updater));
-      }
-    }
-  }
-
-  private void fire(
-      Project.NameKey project,
-      String ref,
-      ObjectId oldObjectId,
-      ObjectId newObjectId,
-      ReceiveCommand.Type type,
-      AccountInfo updater) {
-    if (!listeners.iterator().hasNext()) {
-      return;
-    }
-    ObjectId o = oldObjectId != null ? oldObjectId : ObjectId.zeroId();
-    ObjectId n = newObjectId != null ? newObjectId : ObjectId.zeroId();
-    Event event = new Event(project, ref, o.name(), n.name(), type, updater);
-    for (GitReferenceUpdatedListener l : listeners) {
-      try {
-        l.onGitReferenceUpdated(event);
-      } catch (Exception e) {
-        util.logEventListenerError(this, l, e);
-      }
-    }
-  }
-
-  private static class Event implements GitReferenceUpdatedListener.Event {
-    private final String projectName;
-    private final String ref;
-    private final String oldObjectId;
-    private final String newObjectId;
-    private final ReceiveCommand.Type type;
-    private final AccountInfo updater;
-
-    Event(
-        Project.NameKey project,
-        String ref,
-        String oldObjectId,
-        String newObjectId,
-        ReceiveCommand.Type type,
-        AccountInfo updater) {
-      this.projectName = project.get();
-      this.ref = ref;
-      this.oldObjectId = oldObjectId;
-      this.newObjectId = newObjectId;
-      this.type = type;
-      this.updater = updater;
-    }
-
-    @Override
-    public String getProjectName() {
-      return projectName;
-    }
-
-    @Override
-    public String getRefName() {
-      return ref;
-    }
-
-    @Override
-    public String getOldObjectId() {
-      return oldObjectId;
-    }
-
-    @Override
-    public String getNewObjectId() {
-      return newObjectId;
-    }
-
-    @Override
-    public boolean isCreate() {
-      return type == ReceiveCommand.Type.CREATE;
-    }
-
-    @Override
-    public boolean isDelete() {
-      return type == ReceiveCommand.Type.DELETE;
-    }
-
-    @Override
-    public boolean isNonFastForward() {
-      return type == ReceiveCommand.Type.UPDATE_NONFASTFORWARD;
-    }
-
-    @Override
-    public AccountInfo getUpdater() {
-      return updater;
-    }
-
-    @Override
-    public String toString() {
-      return String.format(
-          "%s[%s,%s: %s -> %s]",
-          getClass().getSimpleName(), projectName, ref, oldObjectId, newObjectId);
-    }
-
-    @Override
-    public NotifyHandling getNotify() {
-      return NotifyHandling.ALL;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/HashtagsEdited.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/HashtagsEdited.java
deleted file mode 100644
index 1c4b43c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/HashtagsEdited.java
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.extensions.events;
-
-import com.google.common.collect.ImmutableSortedSet;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.events.HashtagsEditedListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.sql.Timestamp;
-import java.util.Collection;
-import java.util.Set;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class HashtagsEdited {
-  private static final Logger log = LoggerFactory.getLogger(HashtagsEdited.class);
-
-  private final DynamicSet<HashtagsEditedListener> listeners;
-  private final EventUtil util;
-
-  @Inject
-  public HashtagsEdited(DynamicSet<HashtagsEditedListener> listeners, EventUtil util) {
-    this.listeners = listeners;
-    this.util = util;
-  }
-
-  public void fire(
-      Change change,
-      Account editor,
-      ImmutableSortedSet<String> hashtags,
-      Set<String> added,
-      Set<String> removed,
-      Timestamp when) {
-    if (!listeners.iterator().hasNext()) {
-      return;
-    }
-    try {
-      Event event =
-          new Event(
-              util.changeInfo(change), util.accountInfo(editor), hashtags, added, removed, when);
-      for (HashtagsEditedListener l : listeners) {
-        try {
-          l.onHashtagsEdited(event);
-        } catch (Exception e) {
-          util.logEventListenerError(this, l, e);
-        }
-      }
-    } catch (OrmException e) {
-      log.error("Couldn't fire event", e);
-    }
-  }
-
-  private static class Event extends AbstractChangeEvent implements HashtagsEditedListener.Event {
-
-    private Collection<String> updatedHashtags;
-    private Collection<String> addedHashtags;
-    private Collection<String> removedHashtags;
-
-    Event(
-        ChangeInfo change,
-        AccountInfo editor,
-        Collection<String> updated,
-        Collection<String> added,
-        Collection<String> removed,
-        Timestamp when) {
-      super(change, editor, when, NotifyHandling.ALL);
-      this.updatedHashtags = updated;
-      this.addedHashtags = added;
-      this.removedHashtags = removed;
-    }
-
-    @Override
-    public Collection<String> getHashtags() {
-      return updatedHashtags;
-    }
-
-    @Override
-    public Collection<String> getAddedHashtags() {
-      return addedHashtags;
-    }
-
-    @Override
-    public Collection<String> getRemovedHashtags() {
-      return removedHashtags;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/PrivateStateChanged.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/PrivateStateChanged.java
deleted file mode 100644
index 61fa6a9..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/PrivateStateChanged.java
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.extensions.events;
-
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.RevisionInfo;
-import com.google.gerrit.extensions.events.PrivateStateChangedListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.server.GpgException;
-import com.google.gerrit.server.patch.PatchListNotAvailableException;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.sql.Timestamp;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class PrivateStateChanged {
-  private static final Logger log = LoggerFactory.getLogger(PrivateStateChanged.class);
-
-  private final DynamicSet<PrivateStateChangedListener> listeners;
-  private final EventUtil util;
-
-  @Inject
-  PrivateStateChanged(DynamicSet<PrivateStateChangedListener> listeners, EventUtil util) {
-    this.listeners = listeners;
-    this.util = util;
-  }
-
-  public void fire(Change change, PatchSet patchSet, Account account, Timestamp when) {
-
-    if (!listeners.iterator().hasNext()) {
-      return;
-    }
-    try {
-      Event event =
-          new Event(
-              util.changeInfo(change),
-              util.revisionInfo(change.getProject(), patchSet),
-              util.accountInfo(account),
-              when);
-      for (PrivateStateChangedListener l : listeners) {
-        try {
-          l.onPrivateStateChanged(event);
-        } catch (Exception e) {
-          util.logEventListenerError(event, l, e);
-        }
-      }
-    } catch (PatchListNotAvailableException
-        | PermissionBackendException
-        | IOException
-        | GpgException
-        | OrmException e) {
-      log.error("Couldn't fire event", e);
-    }
-  }
-
-  private static class Event extends AbstractRevisionEvent
-      implements PrivateStateChangedListener.Event {
-
-    protected Event(ChangeInfo change, RevisionInfo revision, AccountInfo who, Timestamp when) {
-      super(change, revision, who, when, NotifyHandling.ALL);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ReviewerAdded.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ReviewerAdded.java
deleted file mode 100644
index 6ffdd02..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ReviewerAdded.java
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.extensions.events;
-
-import com.google.common.collect.Lists;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.RevisionInfo;
-import com.google.gerrit.extensions.events.ReviewerAddedListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.server.GpgException;
-import com.google.gerrit.server.patch.PatchListNotAvailableException;
-import com.google.gerrit.server.patch.PatchListObjectTooLargeException;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.List;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class ReviewerAdded {
-  private static final Logger log = LoggerFactory.getLogger(ReviewerAdded.class);
-
-  private final DynamicSet<ReviewerAddedListener> listeners;
-  private final EventUtil util;
-
-  @Inject
-  ReviewerAdded(DynamicSet<ReviewerAddedListener> listeners, EventUtil util) {
-    this.listeners = listeners;
-    this.util = util;
-  }
-
-  public void fire(
-      Change change, PatchSet patchSet, List<Account> reviewers, Account adder, Timestamp when) {
-    if (!listeners.iterator().hasNext() || reviewers.isEmpty()) {
-      return;
-    }
-
-    try {
-      Event event =
-          new Event(
-              util.changeInfo(change),
-              util.revisionInfo(change.getProject(), patchSet),
-              Lists.transform(reviewers, util::accountInfo),
-              util.accountInfo(adder),
-              when);
-      for (ReviewerAddedListener l : listeners) {
-        try {
-          l.onReviewersAdded(event);
-        } catch (Exception e) {
-          util.logEventListenerError(this, l, e);
-        }
-      }
-    } catch (PatchListObjectTooLargeException e) {
-      log.warn("Couldn't fire event: " + e.getMessage());
-    } catch (PatchListNotAvailableException
-        | GpgException
-        | IOException
-        | OrmException
-        | PermissionBackendException e) {
-      log.error("Couldn't fire event", e);
-    }
-  }
-
-  private static class Event extends AbstractRevisionEvent implements ReviewerAddedListener.Event {
-    private final List<AccountInfo> reviewers;
-
-    Event(
-        ChangeInfo change,
-        RevisionInfo revision,
-        List<AccountInfo> reviewers,
-        AccountInfo adder,
-        Timestamp when) {
-      super(change, revision, adder, when, NotifyHandling.ALL);
-      this.reviewers = reviewers;
-    }
-
-    @Override
-    public List<AccountInfo> getReviewers() {
-      return reviewers;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ReviewerDeleted.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ReviewerDeleted.java
deleted file mode 100644
index 1d00a50..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ReviewerDeleted.java
+++ /dev/null
@@ -1,140 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.extensions.events;
-
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.ApprovalInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.RevisionInfo;
-import com.google.gerrit.extensions.events.ReviewerDeletedListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.server.GpgException;
-import com.google.gerrit.server.patch.PatchListNotAvailableException;
-import com.google.gerrit.server.patch.PatchListObjectTooLargeException;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.Map;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class ReviewerDeleted {
-  private static final Logger log = LoggerFactory.getLogger(ReviewerDeleted.class);
-
-  private final DynamicSet<ReviewerDeletedListener> listeners;
-  private final EventUtil util;
-
-  @Inject
-  ReviewerDeleted(DynamicSet<ReviewerDeletedListener> listeners, EventUtil util) {
-    this.listeners = listeners;
-    this.util = util;
-  }
-
-  public void fire(
-      Change change,
-      PatchSet patchSet,
-      Account reviewer,
-      Account remover,
-      String message,
-      Map<String, Short> newApprovals,
-      Map<String, Short> oldApprovals,
-      NotifyHandling notify,
-      Timestamp when) {
-    if (!listeners.iterator().hasNext()) {
-      return;
-    }
-    try {
-      Event event =
-          new Event(
-              util.changeInfo(change),
-              util.revisionInfo(change.getProject(), patchSet),
-              util.accountInfo(reviewer),
-              util.accountInfo(remover),
-              message,
-              util.approvals(reviewer, newApprovals, when),
-              util.approvals(reviewer, oldApprovals, when),
-              notify,
-              when);
-      for (ReviewerDeletedListener listener : listeners) {
-        try {
-          listener.onReviewerDeleted(event);
-        } catch (Exception e) {
-          util.logEventListenerError(this, listener, e);
-        }
-      }
-    } catch (PatchListObjectTooLargeException e) {
-      log.warn("Couldn't fire event: " + e.getMessage());
-    } catch (PatchListNotAvailableException
-        | GpgException
-        | IOException
-        | OrmException
-        | PermissionBackendException e) {
-      log.error("Couldn't fire event", e);
-    }
-  }
-
-  private static class Event extends AbstractRevisionEvent
-      implements ReviewerDeletedListener.Event {
-    private final AccountInfo reviewer;
-    private final String comment;
-    private final Map<String, ApprovalInfo> newApprovals;
-    private final Map<String, ApprovalInfo> oldApprovals;
-
-    Event(
-        ChangeInfo change,
-        RevisionInfo revision,
-        AccountInfo reviewer,
-        AccountInfo remover,
-        String comment,
-        Map<String, ApprovalInfo> newApprovals,
-        Map<String, ApprovalInfo> oldApprovals,
-        NotifyHandling notify,
-        Timestamp when) {
-      super(change, revision, remover, when, notify);
-      this.reviewer = reviewer;
-      this.comment = comment;
-      this.newApprovals = newApprovals;
-      this.oldApprovals = oldApprovals;
-    }
-
-    @Override
-    public AccountInfo getReviewer() {
-      return reviewer;
-    }
-
-    @Override
-    public String getComment() {
-      return comment;
-    }
-
-    @Override
-    public Map<String, ApprovalInfo> getNewApprovals() {
-      return newApprovals;
-    }
-
-    @Override
-    public Map<String, ApprovalInfo> getOldApprovals() {
-      return oldApprovals;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/RevisionCreated.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/RevisionCreated.java
deleted file mode 100644
index d2ef2d5..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/RevisionCreated.java
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.extensions.events;
-
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.RevisionInfo;
-import com.google.gerrit.extensions.events.RevisionCreatedListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.server.GpgException;
-import com.google.gerrit.server.patch.PatchListNotAvailableException;
-import com.google.gerrit.server.patch.PatchListObjectTooLargeException;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.sql.Timestamp;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class RevisionCreated {
-  private static final Logger log = LoggerFactory.getLogger(RevisionCreated.class);
-
-  public static final RevisionCreated DISABLED =
-      new RevisionCreated() {
-        @Override
-        public void fire(
-            Change change,
-            PatchSet patchSet,
-            Account uploader,
-            Timestamp when,
-            NotifyHandling notify) {}
-      };
-
-  private final DynamicSet<RevisionCreatedListener> listeners;
-  private final EventUtil util;
-
-  @Inject
-  RevisionCreated(DynamicSet<RevisionCreatedListener> listeners, EventUtil util) {
-    this.listeners = listeners;
-    this.util = util;
-  }
-
-  private RevisionCreated() {
-    this.listeners = null;
-    this.util = null;
-  }
-
-  public void fire(
-      Change change, PatchSet patchSet, Account uploader, Timestamp when, NotifyHandling notify) {
-    if (!listeners.iterator().hasNext()) {
-      return;
-    }
-    try {
-      Event event =
-          new Event(
-              util.changeInfo(change),
-              util.revisionInfo(change.getProject(), patchSet),
-              util.accountInfo(uploader),
-              when,
-              notify);
-      for (RevisionCreatedListener l : listeners) {
-        try {
-          l.onRevisionCreated(event);
-        } catch (Exception e) {
-          util.logEventListenerError(this, l, e);
-        }
-      }
-    } catch (PatchListObjectTooLargeException e) {
-      log.warn("Couldn't fire event: " + e.getMessage());
-    } catch (PatchListNotAvailableException
-        | GpgException
-        | IOException
-        | OrmException
-        | PermissionBackendException e) {
-      log.error("Couldn't fire event", e);
-    }
-  }
-
-  private static class Event extends AbstractRevisionEvent
-      implements RevisionCreatedListener.Event {
-
-    Event(
-        ChangeInfo change,
-        RevisionInfo revision,
-        AccountInfo uploader,
-        Timestamp when,
-        NotifyHandling notify) {
-      super(change, revision, uploader, when, notify);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/TopicEdited.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/TopicEdited.java
deleted file mode 100644
index 7275ced..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/TopicEdited.java
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.extensions.events;
-
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.events.TopicEditedListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.sql.Timestamp;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class TopicEdited {
-  private static final Logger log = LoggerFactory.getLogger(TopicEdited.class);
-
-  private final DynamicSet<TopicEditedListener> listeners;
-  private final EventUtil util;
-
-  @Inject
-  TopicEdited(DynamicSet<TopicEditedListener> listeners, EventUtil util) {
-    this.listeners = listeners;
-    this.util = util;
-  }
-
-  public void fire(Change change, Account account, String oldTopicName, Timestamp when) {
-    if (!listeners.iterator().hasNext()) {
-      return;
-    }
-    try {
-      Event event =
-          new Event(util.changeInfo(change), util.accountInfo(account), oldTopicName, when);
-      for (TopicEditedListener l : listeners) {
-        try {
-          l.onTopicEdited(event);
-        } catch (Exception e) {
-          util.logEventListenerError(this, l, e);
-        }
-      }
-    } catch (OrmException e) {
-      log.error("Couldn't fire event", e);
-    }
-  }
-
-  private static class Event extends AbstractChangeEvent implements TopicEditedListener.Event {
-    private final String oldTopic;
-
-    Event(ChangeInfo change, AccountInfo editor, String oldTopic, Timestamp when) {
-      super(change, editor, when, NotifyHandling.ALL);
-      this.oldTopic = oldTopic;
-    }
-
-    @Override
-    public String getOldTopic() {
-      return oldTopic;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/VoteDeleted.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/VoteDeleted.java
deleted file mode 100644
index c377bdc..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/VoteDeleted.java
+++ /dev/null
@@ -1,139 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.extensions.events;
-
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.ApprovalInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.RevisionInfo;
-import com.google.gerrit.extensions.events.VoteDeletedListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.server.GpgException;
-import com.google.gerrit.server.patch.PatchListNotAvailableException;
-import com.google.gerrit.server.patch.PatchListObjectTooLargeException;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.Map;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class VoteDeleted {
-  private static final Logger log = LoggerFactory.getLogger(VoteDeleted.class);
-
-  private final DynamicSet<VoteDeletedListener> listeners;
-  private final EventUtil util;
-
-  @Inject
-  VoteDeleted(DynamicSet<VoteDeletedListener> listeners, EventUtil util) {
-    this.listeners = listeners;
-    this.util = util;
-  }
-
-  public void fire(
-      Change change,
-      PatchSet ps,
-      Account reviewer,
-      Map<String, Short> approvals,
-      Map<String, Short> oldApprovals,
-      NotifyHandling notify,
-      String message,
-      Account remover,
-      Timestamp when) {
-    if (!listeners.iterator().hasNext()) {
-      return;
-    }
-    try {
-      Event event =
-          new Event(
-              util.changeInfo(change),
-              util.revisionInfo(change.getProject(), ps),
-              util.accountInfo(reviewer),
-              util.approvals(remover, approvals, when),
-              util.approvals(remover, oldApprovals, when),
-              notify,
-              message,
-              util.accountInfo(remover),
-              when);
-      for (VoteDeletedListener l : listeners) {
-        try {
-          l.onVoteDeleted(event);
-        } catch (Exception e) {
-          util.logEventListenerError(this, l, e);
-        }
-      }
-    } catch (PatchListObjectTooLargeException e) {
-      log.warn("Couldn't fire event: " + e.getMessage());
-    } catch (PatchListNotAvailableException
-        | GpgException
-        | IOException
-        | OrmException
-        | PermissionBackendException e) {
-      log.error("Couldn't fire event", e);
-    }
-  }
-
-  private static class Event extends AbstractRevisionEvent implements VoteDeletedListener.Event {
-    private final AccountInfo reviewer;
-    private final Map<String, ApprovalInfo> approvals;
-    private final Map<String, ApprovalInfo> oldApprovals;
-    private final String message;
-
-    Event(
-        ChangeInfo change,
-        RevisionInfo revision,
-        AccountInfo reviewer,
-        Map<String, ApprovalInfo> approvals,
-        Map<String, ApprovalInfo> oldApprovals,
-        NotifyHandling notify,
-        String message,
-        AccountInfo remover,
-        Timestamp when) {
-      super(change, revision, remover, when, notify);
-      this.reviewer = reviewer;
-      this.approvals = approvals;
-      this.oldApprovals = oldApprovals;
-      this.message = message;
-    }
-
-    @Override
-    public Map<String, ApprovalInfo> getApprovals() {
-      return approvals;
-    }
-
-    @Override
-    public Map<String, ApprovalInfo> getOldApprovals() {
-      return oldApprovals;
-    }
-
-    @Override
-    public String getMessage() {
-      return message;
-    }
-
-    @Override
-    public AccountInfo getReviewer() {
-      return reviewer;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/WorkInProgressStateChanged.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/WorkInProgressStateChanged.java
deleted file mode 100644
index 4a28d0c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/WorkInProgressStateChanged.java
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.extensions.events;
-
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.RevisionInfo;
-import com.google.gerrit.extensions.events.WorkInProgressStateChangedListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.server.GpgException;
-import com.google.gerrit.server.patch.PatchListNotAvailableException;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.sql.Timestamp;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class WorkInProgressStateChanged {
-  private static final Logger log = LoggerFactory.getLogger(WorkInProgressStateChanged.class);
-
-  private final DynamicSet<WorkInProgressStateChangedListener> listeners;
-  private final EventUtil util;
-
-  @Inject
-  WorkInProgressStateChanged(
-      DynamicSet<WorkInProgressStateChangedListener> listeners, EventUtil util) {
-    this.listeners = listeners;
-    this.util = util;
-  }
-
-  public void fire(Change change, PatchSet patchSet, Account account, Timestamp when) {
-
-    if (!listeners.iterator().hasNext()) {
-      return;
-    }
-    try {
-      Event event =
-          new Event(
-              util.changeInfo(change),
-              util.revisionInfo(change.getProject(), patchSet),
-              util.accountInfo(account),
-              when);
-      for (WorkInProgressStateChangedListener l : listeners) {
-        try {
-          l.onWorkInProgressStateChanged(event);
-        } catch (Exception e) {
-          util.logEventListenerError(event, l, e);
-        }
-      }
-    } catch (PatchListNotAvailableException
-        | PermissionBackendException
-        | IOException
-        | GpgException
-        | OrmException e) {
-      log.error("Couldn't fire event", e);
-    }
-  }
-
-  private static class Event extends AbstractRevisionEvent
-      implements WorkInProgressStateChangedListener.Event {
-
-    protected Event(ChangeInfo change, RevisionInfo revision, AccountInfo who, Timestamp when) {
-      super(change, revision, who, when, NotifyHandling.ALL);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/webui/UiActions.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/webui/UiActions.java
deleted file mode 100644
index c959e96..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/webui/UiActions.java
+++ /dev/null
@@ -1,144 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.extensions.webui;
-
-import static com.google.gerrit.extensions.conditions.BooleanCondition.and;
-import static com.google.gerrit.extensions.conditions.BooleanCondition.or;
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.base.Predicate;
-import com.google.common.collect.Streams;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.api.access.GlobalOrPluginPermission;
-import com.google.gerrit.extensions.conditions.BooleanCondition;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.RestCollection;
-import com.google.gerrit.extensions.restapi.RestResource;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.extensions.webui.PrivateInternals_UiActionDescription;
-import com.google.gerrit.extensions.webui.UiAction;
-import com.google.gerrit.extensions.webui.UiAction.Description;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendCondition;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Objects;
-import java.util.Set;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class UiActions {
-  private static final Logger log = LoggerFactory.getLogger(UiActions.class);
-
-  public static Predicate<UiAction.Description> enabled() {
-    return UiAction.Description::isEnabled;
-  }
-
-  private final PermissionBackend permissionBackend;
-  private final Provider<CurrentUser> userProvider;
-
-  @Inject
-  UiActions(PermissionBackend permissionBackend, Provider<CurrentUser> userProvider) {
-    this.permissionBackend = permissionBackend;
-    this.userProvider = userProvider;
-  }
-
-  public <R extends RestResource> Iterable<UiAction.Description> from(
-      RestCollection<?, R> collection, R resource) {
-    return from(collection.views(), resource);
-  }
-
-  public <R extends RestResource> Iterable<UiAction.Description> from(
-      DynamicMap<RestView<R>> views, R resource) {
-    List<UiAction.Description> descs =
-        Streams.stream(views)
-            .map(e -> describe(e, resource))
-            .filter(Objects::nonNull)
-            .collect(toList());
-
-    List<PermissionBackendCondition> conds =
-        Streams.concat(
-                descs.stream().flatMap(u -> Streams.stream(visibleCondition(u))),
-                descs.stream().flatMap(u -> Streams.stream(enabledCondition(u))))
-            .collect(toList());
-    permissionBackend.bulkEvaluateTest(conds);
-
-    return descs.stream().filter(u -> u.isVisible()).collect(toList());
-  }
-
-  private static Iterable<PermissionBackendCondition> visibleCondition(Description u) {
-    return u.getVisibleCondition().children(PermissionBackendCondition.class);
-  }
-
-  private static Iterable<PermissionBackendCondition> enabledCondition(Description u) {
-    return u.getEnabledCondition().children(PermissionBackendCondition.class);
-  }
-
-  @Nullable
-  private <R extends RestResource> UiAction.Description describe(
-      DynamicMap.Entry<RestView<R>> e, R resource) {
-    int d = e.getExportName().indexOf('.');
-    if (d < 0) {
-      return null;
-    }
-
-    RestView<R> view;
-    try {
-      view = e.getProvider().get();
-    } catch (RuntimeException err) {
-      log.error("error creating view {}.{}", e.getPluginName(), e.getExportName(), err);
-      return null;
-    }
-
-    if (!(view instanceof UiAction)) {
-      return null;
-    }
-
-    UiAction.Description dsc = ((UiAction<R>) view).getDescription(resource);
-    if (dsc == null) {
-      return null;
-    }
-
-    Set<GlobalOrPluginPermission> globalRequired;
-    try {
-      globalRequired = GlobalPermission.fromAnnotation(e.getPluginName(), view.getClass());
-    } catch (PermissionBackendException err) {
-      log.error("exception testing view {}.{}", e.getPluginName(), e.getExportName(), err);
-      return null;
-    }
-    if (!globalRequired.isEmpty()) {
-      PermissionBackend.WithUser withUser = permissionBackend.user(userProvider);
-      Iterator<GlobalOrPluginPermission> i = globalRequired.iterator();
-      BooleanCondition p = withUser.testCond(i.next());
-      while (i.hasNext()) {
-        p = or(p, withUser.testCond(i.next()));
-      }
-      dsc.setVisible(and(p, dsc.getVisibleCondition()));
-    }
-
-    String name = e.getExportName().substring(d + 1);
-    PrivateInternals_UiActionDescription.setMethod(dsc, e.getExportName().substring(0, d));
-    PrivateInternals_UiActionDescription.setId(
-        dsc, "gerrit".equals(e.getPluginName()) ? name : e.getPluginName() + '~' + name);
-    return dsc;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/fixes/FixReplacementInterpreter.java b/gerrit-server/src/main/java/com/google/gerrit/server/fixes/FixReplacementInterpreter.java
deleted file mode 100644
index 1e5088be..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/fixes/FixReplacementInterpreter.java
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.fixes;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static java.util.stream.Collectors.groupingBy;
-
-import com.google.gerrit.common.RawInputUtil;
-import com.google.gerrit.extensions.restapi.BinaryResult;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.FixReplacement;
-import com.google.gerrit.server.change.FileContentUtil;
-import com.google.gerrit.server.edit.tree.ChangeFileContentModification;
-import com.google.gerrit.server.edit.tree.TreeModification;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-
-/** An interpreter for {@code FixReplacement}s. */
-@Singleton
-public class FixReplacementInterpreter {
-
-  private static final Comparator<FixReplacement> ASC_RANGE_FIX_REPLACEMENT_COMPARATOR =
-      Comparator.comparing(fixReplacement -> fixReplacement.range);
-
-  private final FileContentUtil fileContentUtil;
-
-  @Inject
-  public FixReplacementInterpreter(FileContentUtil fileContentUtil) {
-    this.fileContentUtil = fileContentUtil;
-  }
-
-  /**
-   * Transforms the given {@code FixReplacement}s into {@code TreeModification}s.
-   *
-   * @param repository the affected Git repository
-   * @param projectState the affected project
-   * @param patchSetCommitId the patch set which should be modified
-   * @param fixReplacements the replacements which should be applied
-   * @return a list of {@code TreeModification}s representing the given replacements
-   * @throws ResourceNotFoundException if a file to which one of the replacements refers doesn't
-   *     exist
-   * @throws ResourceConflictException if the replacements can't be transformed into {@code
-   *     TreeModification}s
-   */
-  public List<TreeModification> toTreeModifications(
-      Repository repository,
-      ProjectState projectState,
-      ObjectId patchSetCommitId,
-      List<FixReplacement> fixReplacements)
-      throws ResourceNotFoundException, IOException, ResourceConflictException {
-    checkNotNull(fixReplacements, "Fix replacements must not be null");
-
-    Map<String, List<FixReplacement>> fixReplacementsPerFilePath =
-        fixReplacements.stream().collect(groupingBy(fixReplacement -> fixReplacement.path));
-
-    List<TreeModification> treeModifications = new ArrayList<>();
-    for (Map.Entry<String, List<FixReplacement>> entry : fixReplacementsPerFilePath.entrySet()) {
-      TreeModification treeModification =
-          toTreeModification(
-              repository, projectState, patchSetCommitId, entry.getKey(), entry.getValue());
-      treeModifications.add(treeModification);
-    }
-    return treeModifications;
-  }
-
-  private TreeModification toTreeModification(
-      Repository repository,
-      ProjectState projectState,
-      ObjectId patchSetCommitId,
-      String filePath,
-      List<FixReplacement> fixReplacements)
-      throws ResourceNotFoundException, IOException, ResourceConflictException {
-    String fileContent = getFileContent(repository, projectState, patchSetCommitId, filePath);
-    String newFileContent = getNewFileContent(fileContent, fixReplacements);
-    return new ChangeFileContentModification(filePath, RawInputUtil.create(newFileContent));
-  }
-
-  private String getFileContent(
-      Repository repository, ProjectState projectState, ObjectId patchSetCommitId, String filePath)
-      throws ResourceNotFoundException, IOException {
-    try (BinaryResult fileContent =
-        fileContentUtil.getContent(repository, projectState, patchSetCommitId, filePath)) {
-      return fileContent.asString();
-    }
-  }
-
-  private static String getNewFileContent(String fileContent, List<FixReplacement> fixReplacements)
-      throws ResourceConflictException {
-    List<FixReplacement> sortedReplacements = new ArrayList<>(fixReplacements);
-    sortedReplacements.sort(ASC_RANGE_FIX_REPLACEMENT_COMPARATOR);
-
-    LineIdentifier lineIdentifier = new LineIdentifier(fileContent);
-    StringModifier fileContentModifier = new StringModifier(fileContent);
-    for (FixReplacement fixReplacement : sortedReplacements) {
-      Comment.Range range = fixReplacement.range;
-      try {
-        int startLineIndex = lineIdentifier.getStartIndexOfLine(range.startLine);
-        int startLineLength = lineIdentifier.getLengthOfLine(range.startLine);
-
-        int endLineIndex = lineIdentifier.getStartIndexOfLine(range.endLine);
-        int endLineLength = lineIdentifier.getLengthOfLine(range.endLine);
-
-        if (range.startChar > startLineLength || range.endChar > endLineLength) {
-          throw new ResourceConflictException(
-              String.format(
-                  "Range %s refers to a non-existent offset (start line length: %s,"
-                      + " end line length: %s)",
-                  toString(range), startLineLength, endLineLength));
-        }
-
-        int startIndex = startLineIndex + range.startChar;
-        int endIndex = endLineIndex + range.endChar;
-        fileContentModifier.replace(startIndex, endIndex, fixReplacement.replacement);
-      } catch (StringIndexOutOfBoundsException e) {
-        // Most of the StringIndexOutOfBoundsException should never occur because we reject fix
-        // replacements for invalid ranges. However, we can't cover all cases for efficiency
-        // reasons. For instance, we don't determine the number of lines in a file. That's why we
-        // need to map this exception and thus provide a meaningful error.
-        throw new ResourceConflictException(
-            String.format("Cannot apply fix replacement for range %s", toString(range)), e);
-      }
-    }
-    return fileContentModifier.getResult();
-  }
-
-  private static String toString(Comment.Range range) {
-    return String.format(
-        "(%s:%s - %s:%s)", range.startLine, range.startChar, range.endLine, range.endChar);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/fixes/LineIdentifier.java b/gerrit-server/src/main/java/com/google/gerrit/server/fixes/LineIdentifier.java
deleted file mode 100644
index c32d822..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/fixes/LineIdentifier.java
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.fixes;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * An identifier of lines in a string. Lines are sequences of characters which are separated by any
- * Unicode linebreak sequence as defined by the regular expression {@code \R}. If data for several
- * lines is requested, calls which are ordered according to ascending line numbers are the most
- * efficient.
- */
-class LineIdentifier {
-
-  private static final Pattern LINE_SEPARATOR_PATTERN = Pattern.compile("\\R");
-  private final Matcher lineSeparatorMatcher;
-
-  private int nextLineNumber;
-  private int nextLineStartIndex;
-  private int currentLineStartIndex;
-  private int currentLineEndIndex;
-
-  LineIdentifier(String string) {
-    checkNotNull(string);
-    lineSeparatorMatcher = LINE_SEPARATOR_PATTERN.matcher(string);
-    reset();
-  }
-
-  /**
-   * Returns the start index of the indicated line within the given string. Start indices are
-   * zero-based while line numbers are one-based.
-   *
-   * <p><b>Note:</b> Requesting data for several lines is more efficient if those calls occur with
-   * increasing line number.
-   *
-   * @param lineNumber the line whose start index should be determined
-   * @return the start index of the line
-   * @throws StringIndexOutOfBoundsException if the line number is negative, zero or greater than
-   *     the identified number of lines
-   */
-  public int getStartIndexOfLine(int lineNumber) {
-    findLine(lineNumber);
-    return currentLineStartIndex;
-  }
-
-  /**
-   * Returns the length of the indicated line in the given string. The character(s) used to separate
-   * lines aren't included in the count. Line numbers are one-based.
-   *
-   * <p><b>Note:</b> Requesting data for several lines is more efficient if those calls occur with
-   * increasing line number.
-   *
-   * @param lineNumber the line whose length should be determined
-   * @return the length of the line
-   * @throws StringIndexOutOfBoundsException if the line number is negative, zero or greater than
-   *     the identified number of lines
-   */
-  public int getLengthOfLine(int lineNumber) {
-    findLine(lineNumber);
-    return currentLineEndIndex - currentLineStartIndex;
-  }
-
-  private void findLine(int targetLineNumber) {
-    if (targetLineNumber <= 0) {
-      throw new StringIndexOutOfBoundsException("Line number must be positive");
-    }
-    if (targetLineNumber < nextLineNumber) {
-      reset();
-    }
-    while (nextLineNumber < targetLineNumber + 1 && lineSeparatorMatcher.find()) {
-      currentLineStartIndex = nextLineStartIndex;
-      currentLineEndIndex = lineSeparatorMatcher.start();
-      nextLineStartIndex = lineSeparatorMatcher.end();
-      nextLineNumber++;
-    }
-
-    // End of string
-    if (nextLineNumber == targetLineNumber) {
-      currentLineStartIndex = nextLineStartIndex;
-      currentLineEndIndex = lineSeparatorMatcher.regionEnd();
-    }
-    if (nextLineNumber < targetLineNumber) {
-      throw new StringIndexOutOfBoundsException(
-          String.format("Line %d isn't available", targetLineNumber));
-    }
-  }
-
-  private void reset() {
-    nextLineNumber = 1;
-    nextLineStartIndex = 0;
-    currentLineStartIndex = 0;
-    currentLineEndIndex = 0;
-    lineSeparatorMatcher.reset();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/fixes/StringModifier.java b/gerrit-server/src/main/java/com/google/gerrit/server/fixes/StringModifier.java
deleted file mode 100644
index ccd40b3..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/fixes/StringModifier.java
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.fixes;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * A modifier of a string. It allows to replace multiple parts of a string by indicating those parts
- * with indices based on the unmodified string. There is one limitation though: Replacements which
- * affect lower indices of the string must be specified before replacements for higher indices.
- */
-class StringModifier {
-
-  private final StringBuilder stringBuilder;
-
-  private int characterShift = 0;
-  private int previousEndOffset = Integer.MIN_VALUE;
-
-  StringModifier(String string) {
-    checkNotNull(string, "string must not be null");
-    stringBuilder = new StringBuilder(string);
-  }
-
-  /**
-   * Replaces part of the string with another content. When called multiple times, the calls must be
-   * ordered according to increasing start indices. Overlapping replacement regions aren't
-   * supported.
-   *
-   * @param startIndex the beginning index in the unmodified string (inclusive)
-   * @param endIndex the ending index in the unmodified string (exclusive)
-   * @param replacement the string which should be used instead of the original content
-   * @throws StringIndexOutOfBoundsException if the start index is smaller than the end index of a
-   *     previous call of this method
-   */
-  public void replace(int startIndex, int endIndex, String replacement) {
-    checkNotNull(replacement, "replacement string must not be null");
-    if (previousEndOffset > startIndex) {
-      throw new StringIndexOutOfBoundsException(
-          String.format(
-              "Not supported to replace the content starting at index %s after previous "
-                  + "replacement which ended at index %s",
-              startIndex, previousEndOffset));
-    }
-    int shiftedStartIndex = startIndex + characterShift;
-    int shiftedEndIndex = endIndex + characterShift;
-    if (shiftedEndIndex > stringBuilder.length()) {
-      throw new StringIndexOutOfBoundsException(
-          String.format("end %s > length %s", shiftedEndIndex, stringBuilder.length()));
-    }
-    stringBuilder.replace(shiftedStartIndex, shiftedEndIndex, replacement);
-
-    int replacedContentLength = endIndex - startIndex;
-    characterShift += replacement.length() - replacedContentLength;
-    previousEndOffset = endIndex;
-  }
-
-  /**
-   * Returns the modified string including all specified replacements.
-   *
-   * @return the modified string
-   */
-  public String getResult() {
-    return stringBuilder.toString();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/AbandonOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/AbandonOp.java
deleted file mode 100644
index 8298db3..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/AbandonOp.java
+++ /dev/null
@@ -1,139 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.git;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.ListMultimap;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.api.changes.RecipientType;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.ChangeUtil;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.extensions.events.ChangeAbandoned;
-import com.google.gerrit.server.mail.send.AbandonedSender;
-import com.google.gerrit.server.mail.send.ReplyToChangeSender;
-import com.google.gerrit.server.notedb.ChangeUpdate;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.Context;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class AbandonOp implements BatchUpdateOp {
-  private static final Logger log = LoggerFactory.getLogger(AbandonOp.class);
-
-  private final AbandonedSender.Factory abandonedSenderFactory;
-  private final ChangeMessagesUtil cmUtil;
-  private final PatchSetUtil psUtil;
-  private final ChangeAbandoned changeAbandoned;
-
-  private final String msgTxt;
-  private final NotifyHandling notifyHandling;
-  private final ListMultimap<RecipientType, Account.Id> accountsToNotify;
-  private final Account account;
-
-  private Change change;
-  private PatchSet patchSet;
-  private ChangeMessage message;
-
-  public interface Factory {
-    AbandonOp create(
-        @Assisted @Nullable Account account,
-        @Assisted @Nullable String msgTxt,
-        @Assisted NotifyHandling notifyHandling,
-        @Assisted ListMultimap<RecipientType, Account.Id> accountsToNotify);
-  }
-
-  @Inject
-  AbandonOp(
-      AbandonedSender.Factory abandonedSenderFactory,
-      ChangeMessagesUtil cmUtil,
-      PatchSetUtil psUtil,
-      ChangeAbandoned changeAbandoned,
-      @Assisted @Nullable Account account,
-      @Assisted @Nullable String msgTxt,
-      @Assisted NotifyHandling notifyHandling,
-      @Assisted ListMultimap<RecipientType, Account.Id> accountsToNotify) {
-    this.abandonedSenderFactory = abandonedSenderFactory;
-    this.cmUtil = cmUtil;
-    this.psUtil = psUtil;
-    this.changeAbandoned = changeAbandoned;
-
-    this.account = account;
-    this.msgTxt = Strings.nullToEmpty(msgTxt);
-    this.notifyHandling = notifyHandling;
-    this.accountsToNotify = accountsToNotify;
-  }
-
-  @Nullable
-  public Change getChange() {
-    return change;
-  }
-
-  @Override
-  public boolean updateChange(ChangeContext ctx) throws OrmException, ResourceConflictException {
-    change = ctx.getChange();
-    PatchSet.Id psId = change.currentPatchSetId();
-    ChangeUpdate update = ctx.getUpdate(psId);
-    if (!change.getStatus().isOpen()) {
-      throw new ResourceConflictException("change is " + ChangeUtil.status(change));
-    }
-    patchSet = psUtil.get(ctx.getDb(), ctx.getNotes(), psId);
-    change.setStatus(Change.Status.ABANDONED);
-    change.setLastUpdatedOn(ctx.getWhen());
-
-    update.setStatus(change.getStatus());
-    message = newMessage(ctx);
-    cmUtil.addChangeMessage(ctx.getDb(), update, message);
-    return true;
-  }
-
-  private ChangeMessage newMessage(ChangeContext ctx) {
-    StringBuilder msg = new StringBuilder();
-    msg.append("Abandoned");
-    if (!Strings.nullToEmpty(msgTxt).trim().isEmpty()) {
-      msg.append("\n\n");
-      msg.append(msgTxt.trim());
-    }
-
-    return ChangeMessagesUtil.newMessage(ctx, msg.toString(), ChangeMessagesUtil.TAG_ABANDON);
-  }
-
-  @Override
-  public void postUpdate(Context ctx) throws OrmException {
-    try {
-      ReplyToChangeSender cm = abandonedSenderFactory.create(ctx.getProject(), change.getId());
-      if (account != null) {
-        cm.setFrom(account.getId());
-      }
-      cm.setChangeMessage(message.getMessage(), ctx.getWhen());
-      cm.setNotify(notifyHandling);
-      cm.setAccountsToNotify(accountsToNotify);
-      cm.send();
-    } catch (Exception e) {
-      log.error("Cannot email update for change " + change.getId(), e);
-    }
-    changeAbandoned.fire(change, patchSet, account, msgTxt, ctx.getWhen(), notifyHandling);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/AccountsSection.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/AccountsSection.java
deleted file mode 100644
index ffecc36..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/AccountsSection.java
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.server.git;
-
-import com.google.gerrit.common.data.PermissionRule;
-import java.util.ArrayList;
-import java.util.List;
-
-public class AccountsSection {
-  protected List<PermissionRule> sameGroupVisibility;
-
-  public List<PermissionRule> getSameGroupVisibility() {
-    if (sameGroupVisibility == null) {
-      sameGroupVisibility = new ArrayList<>();
-    }
-    return sameGroupVisibility;
-  }
-
-  public void setSameGroupVisibility(List<PermissionRule> sameGroupVisibility) {
-    this.sameGroupVisibility = sameGroupVisibility;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/BanCommit.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/BanCommit.java
deleted file mode 100644
index 322d158..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/BanCommit.java
+++ /dev/null
@@ -1,171 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.git;
-
-import static com.google.gerrit.reviewdb.client.RefNames.REFS_REJECT_COMMITS;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.gerrit.common.errors.PermissionDeniedException;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.Date;
-import java.util.List;
-import java.util.TimeZone;
-import org.eclipse.jgit.errors.IncorrectObjectTypeException;
-import org.eclipse.jgit.errors.MissingObjectException;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.notes.Note;
-import org.eclipse.jgit.notes.NoteMap;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-@Singleton
-public class BanCommit {
-  /**
-   * Loads a list of commits to reject from {@code refs/meta/reject-commits}.
-   *
-   * @param repo repository from which the rejected commits should be loaded
-   * @param walk open revwalk on repo.
-   * @return NoteMap of commits to be rejected, null if there are none.
-   * @throws IOException the map cannot be loaded.
-   */
-  public static NoteMap loadRejectCommitsMap(Repository repo, RevWalk walk) throws IOException {
-    try {
-      Ref ref = repo.getRefDatabase().exactRef(RefNames.REFS_REJECT_COMMITS);
-      if (ref == null) {
-        return NoteMap.newEmptyMap();
-      }
-
-      RevCommit map = walk.parseCommit(ref.getObjectId());
-      return NoteMap.read(walk.getObjectReader(), map);
-    } catch (IOException badMap) {
-      throw new IOException("Cannot load " + RefNames.REFS_REJECT_COMMITS, badMap);
-    }
-  }
-
-  private final Provider<IdentifiedUser> currentUser;
-  private final GitRepositoryManager repoManager;
-  private final TimeZone tz;
-  private NotesBranchUtil.Factory notesBranchUtilFactory;
-
-  @Inject
-  BanCommit(
-      Provider<IdentifiedUser> currentUser,
-      GitRepositoryManager repoManager,
-      @GerritPersonIdent PersonIdent gerritIdent,
-      NotesBranchUtil.Factory notesBranchUtilFactory) {
-    this.currentUser = currentUser;
-    this.repoManager = repoManager;
-    this.notesBranchUtilFactory = notesBranchUtilFactory;
-    this.tz = gerritIdent.getTimeZone();
-  }
-
-  public BanCommitResult ban(
-      ProjectControl projectControl, List<ObjectId> commitsToBan, String reason)
-      throws PermissionDeniedException, LockFailureException, IOException {
-    if (!projectControl.isOwner()) {
-      throw new PermissionDeniedException("Not project owner: not permitted to ban commits");
-    }
-
-    final BanCommitResult result = new BanCommitResult();
-    NoteMap banCommitNotes = NoteMap.newEmptyMap();
-    // Add a note for each banned commit to notes.
-    final Project.NameKey project = projectControl.getProject().getNameKey();
-    try (Repository repo = repoManager.openRepository(project);
-        RevWalk revWalk = new RevWalk(repo);
-        ObjectInserter inserter = repo.newObjectInserter()) {
-      ObjectId noteId = null;
-      for (ObjectId commitToBan : commitsToBan) {
-        try {
-          revWalk.parseCommit(commitToBan);
-        } catch (MissingObjectException e) {
-          // Ignore exception, non-existing commits can be banned.
-        } catch (IncorrectObjectTypeException e) {
-          result.notACommit(commitToBan);
-          continue;
-        }
-        if (noteId == null) {
-          noteId = createNoteContent(reason, inserter);
-        }
-        banCommitNotes.set(commitToBan, noteId);
-      }
-      NotesBranchUtil notesBranchUtil = notesBranchUtilFactory.create(project, repo, inserter);
-      NoteMap newlyCreated =
-          notesBranchUtil.commitNewNotes(
-              banCommitNotes,
-              REFS_REJECT_COMMITS,
-              createPersonIdent(),
-              buildCommitMessage(commitsToBan, reason));
-
-      for (Note n : banCommitNotes) {
-        if (newlyCreated.contains(n)) {
-          result.commitBanned(n);
-        } else {
-          result.commitAlreadyBanned(n);
-        }
-      }
-      return result;
-    }
-  }
-
-  private ObjectId createNoteContent(String reason, ObjectInserter inserter) throws IOException {
-    String noteContent = reason != null ? reason : "";
-    if (noteContent.length() > 0 && !noteContent.endsWith("\n")) {
-      noteContent = noteContent + "\n";
-    }
-    return inserter.insert(Constants.OBJ_BLOB, noteContent.getBytes(UTF_8));
-  }
-
-  private PersonIdent createPersonIdent() {
-    Date now = new Date();
-    return currentUser.get().newCommitterIdent(now, tz);
-  }
-
-  private static String buildCommitMessage(List<ObjectId> bannedCommits, String reason) {
-    final StringBuilder commitMsg = new StringBuilder();
-    commitMsg.append("Banning ");
-    commitMsg.append(bannedCommits.size());
-    commitMsg.append(" ");
-    commitMsg.append(bannedCommits.size() == 1 ? "commit" : "commits");
-    commitMsg.append("\n\n");
-    if (reason != null) {
-      commitMsg.append("Reason: ");
-      commitMsg.append(reason);
-      commitMsg.append("\n\n");
-    }
-    commitMsg.append("The following commits are banned:\n");
-    final StringBuilder commitList = new StringBuilder();
-    for (ObjectId c : bannedCommits) {
-      if (commitList.length() > 0) {
-        commitList.append(",\n");
-      }
-      commitList.append(c.getName());
-    }
-    commitMsg.append(commitList);
-    return commitMsg.toString();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeAlreadyMergedException.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeAlreadyMergedException.java
deleted file mode 100644
index 0af4b72..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeAlreadyMergedException.java
+++ /dev/null
@@ -1,25 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.git;
-
-/** Indicates that the change or commit is already in the source tree. */
-public class ChangeAlreadyMergedException extends MergeIdenticalTreeException {
-  private static final long serialVersionUID = 1L;
-
-  /** @param msg message to return to the client describing the error. */
-  public ChangeAlreadyMergedException(String msg) {
-    super(msg);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeSet.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeSet.java
deleted file mode 100644
index e8569af..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeSet.java
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.git;
-
-import com.google.common.collect.ImmutableCollection;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.MultimapBuilder;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gwtorm.server.OrmException;
-import java.util.Collection;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-/**
- * A set of changes grouped together to be submitted atomically.
- *
- * <p>MergeSuperSet constructs ChangeSets to accumulate intermediate results toward the ChangeSet it
- * returns when done.
- *
- * <p>This class is not thread safe.
- */
-public class ChangeSet {
-  private final ImmutableMap<Change.Id, ChangeData> changeData;
-
-  /**
-   * Additional changes not included in changeData because their connection to the original change
-   * is not visible to the current user. That is, this map includes both - changes that are not
-   * visible to the current user, and - changes whose only relationship to the set is via a change
-   * that is not visible to the current user
-   */
-  private final ImmutableMap<Change.Id, ChangeData> nonVisibleChanges;
-
-  private static ImmutableMap<Change.Id, ChangeData> index(
-      Iterable<ChangeData> changes, Collection<Change.Id> exclude) {
-    Map<Change.Id, ChangeData> ret = new LinkedHashMap<>();
-    for (ChangeData cd : changes) {
-      Change.Id id = cd.getId();
-      if (!ret.containsKey(id) && !exclude.contains(id)) {
-        ret.put(id, cd);
-      }
-    }
-    return ImmutableMap.copyOf(ret);
-  }
-
-  public ChangeSet(Iterable<ChangeData> changes, Iterable<ChangeData> hiddenChanges) {
-    changeData = index(changes, ImmutableList.<Change.Id>of());
-    nonVisibleChanges = index(hiddenChanges, changeData.keySet());
-  }
-
-  public ChangeSet(ChangeData change, boolean visible) {
-    this(
-        visible ? ImmutableList.of(change) : ImmutableList.<ChangeData>of(),
-        ImmutableList.of(change));
-  }
-
-  public ImmutableSet<Change.Id> ids() {
-    return changeData.keySet();
-  }
-
-  public ImmutableMap<Change.Id, ChangeData> changesById() {
-    return changeData;
-  }
-
-  public ListMultimap<Branch.NameKey, ChangeData> changesByBranch() throws OrmException {
-    ListMultimap<Branch.NameKey, ChangeData> ret =
-        MultimapBuilder.hashKeys().arrayListValues().build();
-    for (ChangeData cd : changeData.values()) {
-      ret.put(cd.change().getDest(), cd);
-    }
-    return ret;
-  }
-
-  public ImmutableCollection<ChangeData> changes() {
-    return changeData.values();
-  }
-
-  public ImmutableSet<Project.NameKey> projects() {
-    ImmutableSet.Builder<Project.NameKey> ret = ImmutableSet.builder();
-    for (ChangeData cd : changeData.values()) {
-      ret.add(cd.project());
-    }
-    return ret.build();
-  }
-
-  public ImmutableSet<Change.Id> nonVisibleIds() {
-    return nonVisibleChanges.keySet();
-  }
-
-  public ImmutableList<ChangeData> nonVisibleChanges() {
-    return nonVisibleChanges.values().asList();
-  }
-
-  public boolean furtherHiddenChanges() {
-    return !nonVisibleChanges.isEmpty();
-  }
-
-  public int size() {
-    return changeData.size() + nonVisibleChanges.size();
-  }
-
-  @Override
-  public String toString() {
-    return getClass().getSimpleName() + ids() + nonVisibleIds();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/CodeReviewCommit.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/CodeReviewCommit.java
deleted file mode 100644
index 7bc6648..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/CodeReviewCommit.java
+++ /dev/null
@@ -1,162 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.server.git;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import com.google.common.collect.Ordering;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.server.git.strategy.CommitMergeStatus;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import java.io.IOException;
-import org.eclipse.jgit.errors.IncorrectObjectTypeException;
-import org.eclipse.jgit.errors.MissingObjectException;
-import org.eclipse.jgit.lib.AnyObjectId;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-/** Extended commit entity with code review specific metadata. */
-public class CodeReviewCommit extends RevCommit {
-  /**
-   * Default ordering when merging multiple topologically-equivalent commits.
-   *
-   * <p>Operates only on these commits and does not take ancestry into account.
-   *
-   * <p>Use this in preference to the default order, which comes from {@link AnyObjectId} and only
-   * orders on SHA-1.
-   */
-  public static final Ordering<CodeReviewCommit> ORDER =
-      Ordering.natural()
-          .onResultOf(
-              (CodeReviewCommit c) ->
-                  c.getPatchsetId() != null ? c.getPatchsetId().getParentKey().get() : null)
-          .nullsFirst();
-
-  public static CodeReviewRevWalk newRevWalk(Repository repo) {
-    return new CodeReviewRevWalk(repo);
-  }
-
-  public static CodeReviewRevWalk newRevWalk(ObjectReader reader) {
-    return new CodeReviewRevWalk(reader);
-  }
-
-  public static class CodeReviewRevWalk extends RevWalk {
-    private CodeReviewRevWalk(Repository repo) {
-      super(repo);
-    }
-
-    private CodeReviewRevWalk(ObjectReader reader) {
-      super(reader);
-    }
-
-    @Override
-    protected CodeReviewCommit createCommit(AnyObjectId id) {
-      return new CodeReviewCommit(id);
-    }
-
-    @Override
-    public CodeReviewCommit next()
-        throws MissingObjectException, IncorrectObjectTypeException, IOException {
-      return (CodeReviewCommit) super.next();
-    }
-
-    @Override
-    public void markStart(RevCommit c)
-        throws MissingObjectException, IncorrectObjectTypeException, IOException {
-      checkArgument(c instanceof CodeReviewCommit);
-      super.markStart(c);
-    }
-
-    @Override
-    public void markUninteresting(RevCommit c)
-        throws MissingObjectException, IncorrectObjectTypeException, IOException {
-      checkArgument(c instanceof CodeReviewCommit);
-      super.markUninteresting(c);
-    }
-
-    @Override
-    public CodeReviewCommit lookupCommit(AnyObjectId id) {
-      return (CodeReviewCommit) super.lookupCommit(id);
-    }
-
-    @Override
-    public CodeReviewCommit parseCommit(AnyObjectId id)
-        throws MissingObjectException, IncorrectObjectTypeException, IOException {
-      return (CodeReviewCommit) super.parseCommit(id);
-    }
-  }
-
-  /**
-   * Unique key of the PatchSet entity from the code review system.
-   *
-   * <p>This value is only available on commits that have a PatchSet represented in the code review
-   * system.
-   */
-  private PatchSet.Id patchsetId;
-
-  private ChangeNotes notes;
-
-  /**
-   * The result status for this commit.
-   *
-   * <p>Only valid if {@link #patchsetId} is not null.
-   */
-  private CommitMergeStatus statusCode;
-
-  public CodeReviewCommit(AnyObjectId id) {
-    super(id);
-  }
-
-  public ChangeNotes notes() {
-    return notes;
-  }
-
-  public CommitMergeStatus getStatusCode() {
-    return statusCode;
-  }
-
-  public void setStatusCode(CommitMergeStatus statusCode) {
-    this.statusCode = statusCode;
-  }
-
-  public PatchSet.Id getPatchsetId() {
-    return patchsetId;
-  }
-
-  public void setPatchsetId(PatchSet.Id patchsetId) {
-    this.patchsetId = patchsetId;
-  }
-
-  public void copyFrom(CodeReviewCommit src) {
-    notes = src.notes;
-    patchsetId = src.patchsetId;
-    statusCode = src.statusCode;
-  }
-
-  public Change change() {
-    return getNotes().getChange();
-  }
-
-  public ChangeNotes getNotes() {
-    return notes;
-  }
-
-  public void setNotes(ChangeNotes notes) {
-    this.notes = notes;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ConfiguredMimeTypes.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ConfiguredMimeTypes.java
deleted file mode 100644
index 5362ee6..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ConfiguredMimeTypes.java
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.git;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-import java.util.regex.Pattern;
-import java.util.regex.PatternSyntaxException;
-import org.eclipse.jgit.errors.InvalidPatternException;
-import org.eclipse.jgit.fnmatch.FileNameMatcher;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ConfiguredMimeTypes {
-  private static final Logger log = LoggerFactory.getLogger(ConfiguredMimeTypes.class);
-
-  private static final String MIMETYPE = "mimetype";
-  private static final String KEY_PATH = "path";
-
-  private final List<TypeMatcher> matchers;
-
-  ConfiguredMimeTypes(String projectName, Config rc) {
-    Set<String> types = rc.getSubsections(MIMETYPE);
-    if (types.isEmpty()) {
-      matchers = Collections.emptyList();
-    } else {
-      matchers = new ArrayList<>();
-      for (String typeName : types) {
-        for (String path : rc.getStringList(MIMETYPE, typeName, KEY_PATH)) {
-          try {
-            add(typeName, path);
-          } catch (PatternSyntaxException | InvalidPatternException e) {
-            log.warn(
-                "Ignoring invalid {}.{}.{} = {} in project {}: {}",
-                MIMETYPE,
-                typeName,
-                KEY_PATH,
-                path,
-                projectName,
-                e.getMessage());
-          }
-        }
-      }
-    }
-  }
-
-  private void add(String typeName, String path)
-      throws PatternSyntaxException, InvalidPatternException {
-    if (path.startsWith("^")) {
-      matchers.add(new ReType(typeName, path));
-    } else {
-      matchers.add(new FnType(typeName, path));
-    }
-  }
-
-  public String getMimeType(String path) {
-    for (TypeMatcher m : matchers) {
-      if (m.matches(path)) {
-        return m.type;
-      }
-    }
-    return null;
-  }
-
-  private abstract static class TypeMatcher {
-    final String type;
-
-    TypeMatcher(String type) {
-      this.type = type;
-    }
-
-    abstract boolean matches(String path);
-  }
-
-  private static class FnType extends TypeMatcher {
-    private final FileNameMatcher matcher;
-
-    FnType(String type, String pattern) throws InvalidPatternException {
-      super(type);
-      this.matcher = new FileNameMatcher(pattern, null);
-    }
-
-    @Override
-    boolean matches(String input) {
-      FileNameMatcher m = new FileNameMatcher(matcher);
-      m.append(input);
-      return m.isMatch();
-    }
-  }
-
-  private static class ReType extends TypeMatcher {
-    private final Pattern re;
-
-    ReType(String type, String pattern) throws PatternSyntaxException {
-      super(type);
-      this.re = Pattern.compile(pattern);
-    }
-
-    @Override
-    boolean matches(String input) {
-      return re.matcher(input).matches();
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/DefaultChangeReportFormatter.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/DefaultChangeReportFormatter.java
deleted file mode 100644
index ac69ff1..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/DefaultChangeReportFormatter.java
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.git;
-
-import com.google.gerrit.server.ChangeUtil;
-import com.google.gerrit.server.config.CanonicalWebUrl;
-import com.google.inject.Inject;
-
-public class DefaultChangeReportFormatter implements ChangeReportFormatter {
-  private final String canonicalWebUrl;
-
-  @Inject
-  DefaultChangeReportFormatter(@CanonicalWebUrl String canonicalWebUrl) {
-    this.canonicalWebUrl = canonicalWebUrl;
-  }
-
-  @Override
-  public String newChange(ChangeReportFormatter.Input input) {
-    return formatChangeUrl(canonicalWebUrl, input);
-  }
-
-  @Override
-  public String changeUpdated(ChangeReportFormatter.Input input) {
-    return formatChangeUrl(canonicalWebUrl, input);
-  }
-
-  @Override
-  public String changeClosed(ChangeReportFormatter.Input input) {
-    return String.format(
-        "change %s closed", ChangeUtil.formatChangeUrl(canonicalWebUrl, input.change()));
-  }
-
-  private String formatChangeUrl(String url, Input input) {
-    StringBuilder m =
-        new StringBuilder()
-            .append("  ")
-            .append(ChangeUtil.formatChangeUrl(url, input.change()))
-            .append(" ")
-            .append(ChangeUtil.cropSubject(input.subject()));
-    if (input.isEdit()) {
-      m.append(" [EDIT]");
-    }
-    if (input.isPrivate()) {
-      m.append(" [PRIVATE]");
-    }
-    if (input.isWorkInProgress()) {
-      m.append(" [WIP]");
-    }
-    return m.toString();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/DestinationList.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/DestinationList.java
deleted file mode 100644
index eacf66e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/DestinationList.java
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.git;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.MultimapBuilder;
-import com.google.common.collect.SetMultimap;
-import com.google.common.collect.Sets;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Project;
-import java.io.IOException;
-import java.util.List;
-import java.util.Set;
-
-public class DestinationList extends TabFile {
-  public static final String DIR_NAME = "destinations";
-  private SetMultimap<String, Branch.NameKey> destinations =
-      MultimapBuilder.hashKeys().hashSetValues().build();
-
-  public Set<Branch.NameKey> getDestinations(String label) {
-    return destinations.get(label);
-  }
-
-  public void parseLabel(String label, String text, ValidationError.Sink errors)
-      throws IOException {
-    destinations.replaceValues(label, toSet(parse(text, DIR_NAME + label, TRIM, null, errors)));
-  }
-
-  public String asText(String label) {
-    Set<Branch.NameKey> dests = destinations.get(label);
-    if (dests == null) {
-      return null;
-    }
-    List<Row> rows = Lists.newArrayListWithCapacity(dests.size());
-    for (Branch.NameKey dest : sort(dests)) {
-      rows.add(new Row(dest.get(), dest.getParentKey().get()));
-    }
-    return asText("Ref", "Project", rows);
-  }
-
-  protected static Set<Branch.NameKey> toSet(List<Row> destRows) {
-    Set<Branch.NameKey> dests = Sets.newHashSetWithExpectedSize(destRows.size());
-    for (Row row : destRows) {
-      dests.add(new Branch.NameKey(new Project.NameKey(row.right), row.left));
-    }
-    return dests;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/EmailMerge.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/EmailMerge.java
deleted file mode 100644
index 44450f0..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/EmailMerge.java
+++ /dev/null
@@ -1,148 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.git;
-
-import com.google.common.collect.ListMultimap;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.api.changes.RecipientType;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.mail.send.MergedSender;
-import com.google.gerrit.server.util.RequestContext;
-import com.google.gerrit.server.util.ThreadLocalRequestContext;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Inject;
-import com.google.inject.OutOfScopeException;
-import com.google.inject.Provider;
-import com.google.inject.ProvisionException;
-import com.google.inject.assistedinject.Assisted;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Future;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class EmailMerge implements Runnable, RequestContext {
-  private static final Logger log = LoggerFactory.getLogger(EmailMerge.class);
-
-  public interface Factory {
-    EmailMerge create(
-        Project.NameKey project,
-        Change.Id changeId,
-        Account.Id submitter,
-        NotifyHandling notifyHandling,
-        ListMultimap<RecipientType, Account.Id> accountsToNotify);
-  }
-
-  private final ExecutorService sendEmailsExecutor;
-  private final MergedSender.Factory mergedSenderFactory;
-  private final SchemaFactory<ReviewDb> schemaFactory;
-  private final ThreadLocalRequestContext requestContext;
-  private final IdentifiedUser.GenericFactory identifiedUserFactory;
-
-  private final Project.NameKey project;
-  private final Change.Id changeId;
-  private final Account.Id submitter;
-  private final NotifyHandling notifyHandling;
-  private final ListMultimap<RecipientType, Account.Id> accountsToNotify;
-
-  private ReviewDb db;
-
-  @Inject
-  EmailMerge(
-      @SendEmailExecutor ExecutorService executor,
-      MergedSender.Factory mergedSenderFactory,
-      SchemaFactory<ReviewDb> schemaFactory,
-      ThreadLocalRequestContext requestContext,
-      IdentifiedUser.GenericFactory identifiedUserFactory,
-      @Assisted Project.NameKey project,
-      @Assisted Change.Id changeId,
-      @Assisted @Nullable Account.Id submitter,
-      @Assisted NotifyHandling notifyHandling,
-      @Assisted ListMultimap<RecipientType, Account.Id> accountsToNotify) {
-    this.sendEmailsExecutor = executor;
-    this.mergedSenderFactory = mergedSenderFactory;
-    this.schemaFactory = schemaFactory;
-    this.requestContext = requestContext;
-    this.identifiedUserFactory = identifiedUserFactory;
-    this.project = project;
-    this.changeId = changeId;
-    this.submitter = submitter;
-    this.notifyHandling = notifyHandling;
-    this.accountsToNotify = accountsToNotify;
-  }
-
-  public void sendAsync() {
-    @SuppressWarnings("unused")
-    Future<?> possiblyIgnoredError = sendEmailsExecutor.submit(this);
-  }
-
-  @Override
-  public void run() {
-    RequestContext old = requestContext.setContext(this);
-    try {
-      MergedSender cm = mergedSenderFactory.create(project, changeId);
-      if (submitter != null) {
-        cm.setFrom(submitter);
-      }
-      cm.setNotify(notifyHandling);
-      cm.setAccountsToNotify(accountsToNotify);
-      cm.send();
-    } catch (Exception e) {
-      log.error("Cannot email merged notification for " + changeId, e);
-    } finally {
-      requestContext.setContext(old);
-      if (db != null) {
-        db.close();
-        db = null;
-      }
-    }
-  }
-
-  @Override
-  public String toString() {
-    return "send-email merged";
-  }
-
-  @Override
-  public CurrentUser getUser() {
-    if (submitter != null) {
-      return identifiedUserFactory.create(submitter).getRealUser();
-    }
-    throw new OutOfScopeException("No user on email thread");
-  }
-
-  @Override
-  public Provider<ReviewDb> getReviewDbProvider() {
-    return new Provider<ReviewDb>() {
-      @Override
-      public ReviewDb get() {
-        if (db == null) {
-          try {
-            db = schemaFactory.open();
-          } catch (OrmException e) {
-            throw new ProvisionException("Cannot open ReviewDb", e);
-          }
-        }
-        return db;
-      }
-    };
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollection.java
deleted file mode 100644
index 3bf89c7..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollection.java
+++ /dev/null
@@ -1,215 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.git;
-
-import com.google.common.collect.Sets;
-import com.google.gerrit.common.data.GarbageCollectionResult;
-import com.google.gerrit.extensions.events.GarbageCollectorListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.config.GcConfig;
-import com.google.gerrit.server.extensions.events.AbstractNoNotifyEvent;
-import com.google.inject.Inject;
-import java.io.PrintWriter;
-import java.util.List;
-import java.util.Properties;
-import java.util.Set;
-import org.eclipse.jgit.api.GarbageCollectCommand;
-import org.eclipse.jgit.api.Git;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ConfigConstants;
-import org.eclipse.jgit.lib.NullProgressMonitor;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.lib.TextProgressMonitor;
-import org.eclipse.jgit.storage.pack.PackConfig;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class GarbageCollection {
-  private static final Logger log = LoggerFactory.getLogger(GarbageCollection.class);
-
-  public static final String LOG_NAME = "gc_log";
-  private static final Logger gcLog = LoggerFactory.getLogger(LOG_NAME);
-
-  private final GitRepositoryManager repoManager;
-  private final GarbageCollectionQueue gcQueue;
-  private final GcConfig gcConfig;
-  private final DynamicSet<GarbageCollectorListener> listeners;
-
-  public interface Factory {
-    GarbageCollection create();
-  }
-
-  @Inject
-  GarbageCollection(
-      GitRepositoryManager repoManager,
-      GarbageCollectionQueue gcQueue,
-      GcConfig config,
-      DynamicSet<GarbageCollectorListener> listeners) {
-    this.repoManager = repoManager;
-    this.gcQueue = gcQueue;
-    this.gcConfig = config;
-    this.listeners = listeners;
-  }
-
-  public GarbageCollectionResult run(List<Project.NameKey> projectNames) {
-    return run(projectNames, null);
-  }
-
-  public GarbageCollectionResult run(List<Project.NameKey> projectNames, PrintWriter writer) {
-    return run(projectNames, gcConfig.isAggressive(), writer);
-  }
-
-  public GarbageCollectionResult run(
-      List<Project.NameKey> projectNames, boolean aggressive, PrintWriter writer) {
-    GarbageCollectionResult result = new GarbageCollectionResult();
-    Set<Project.NameKey> projectsToGc = gcQueue.addAll(projectNames);
-    for (Project.NameKey projectName :
-        Sets.difference(Sets.newHashSet(projectNames), projectsToGc)) {
-      result.addError(
-          new GarbageCollectionResult.Error(
-              GarbageCollectionResult.Error.Type.GC_ALREADY_SCHEDULED, projectName));
-    }
-    for (Project.NameKey p : projectsToGc) {
-      try (Repository repo = repoManager.openRepository(p)) {
-        logGcConfiguration(p, repo, aggressive);
-        print(writer, "collecting garbage for \"" + p + "\":\n");
-        GarbageCollectCommand gc = Git.wrap(repo).gc();
-        gc.setAggressive(aggressive);
-        logGcInfo(p, "before:", gc.getStatistics());
-        gc.setProgressMonitor(
-            writer != null ? new TextProgressMonitor(writer) : NullProgressMonitor.INSTANCE);
-        Properties statistics = gc.call();
-        logGcInfo(p, "after: ", statistics);
-        print(writer, "done.\n\n");
-        fire(p, statistics);
-      } catch (RepositoryNotFoundException e) {
-        logGcError(writer, p, e);
-        result.addError(
-            new GarbageCollectionResult.Error(
-                GarbageCollectionResult.Error.Type.REPOSITORY_NOT_FOUND, p));
-      } catch (Exception e) {
-        logGcError(writer, p, e);
-        result.addError(
-            new GarbageCollectionResult.Error(GarbageCollectionResult.Error.Type.GC_FAILED, p));
-      } finally {
-        gcQueue.gcFinished(p);
-      }
-    }
-    return result;
-  }
-
-  private void fire(Project.NameKey p, Properties statistics) {
-    if (!listeners.iterator().hasNext()) {
-      return;
-    }
-    Event event = new Event(p, statistics);
-    for (GarbageCollectorListener l : listeners) {
-      try {
-        l.onGarbageCollected(event);
-      } catch (RuntimeException e) {
-        log.warn("Failure in GarbageCollectorListener", e);
-      }
-    }
-  }
-
-  private static void logGcInfo(Project.NameKey projectName, String msg) {
-    logGcInfo(projectName, msg, null);
-  }
-
-  private static void logGcInfo(Project.NameKey projectName, String msg, Properties statistics) {
-    StringBuilder b = new StringBuilder();
-    b.append("[").append(projectName.get()).append("] ");
-    b.append(msg);
-    if (statistics != null) {
-      b.append(" ");
-      String s = statistics.toString();
-      if (s.startsWith("{") && s.endsWith("}")) {
-        s = s.substring(1, s.length() - 1);
-      }
-      b.append(s);
-    }
-    gcLog.info(b.toString());
-  }
-
-  private static void logGcConfiguration(
-      Project.NameKey projectName, Repository repo, boolean aggressive) {
-    StringBuilder b = new StringBuilder();
-    Config cfg = repo.getConfig();
-    b.append("gc.aggressive=").append(aggressive).append("; ");
-    b.append(formatConfigValues(cfg, ConfigConstants.CONFIG_GC_SECTION, null));
-    for (String subsection : cfg.getSubsections(ConfigConstants.CONFIG_GC_SECTION)) {
-      b.append(formatConfigValues(cfg, ConfigConstants.CONFIG_GC_SECTION, subsection));
-    }
-    if (b.length() == 0) {
-      b.append("no set");
-    }
-
-    logGcInfo(projectName, "gc config: " + b.toString());
-    logGcInfo(projectName, "pack config: " + (new PackConfig(repo)).toString());
-  }
-
-  private static String formatConfigValues(Config config, String section, String subsection) {
-    StringBuilder b = new StringBuilder();
-    Set<String> names = config.getNames(section, subsection);
-    for (String name : names) {
-      String value = config.getString(section, subsection, name);
-      b.append(section);
-      if (subsection != null) {
-        b.append(".").append(subsection);
-      }
-      b.append(".");
-      b.append(name).append("=").append(value);
-      b.append("; ");
-    }
-    return b.toString();
-  }
-
-  private static void logGcError(PrintWriter writer, Project.NameKey projectName, Exception e) {
-    print(writer, "failed.\n\n");
-    StringBuilder b = new StringBuilder();
-    b.append("[").append(projectName.get()).append("]");
-    gcLog.error(b.toString(), e);
-    log.error(b.toString(), e);
-  }
-
-  private static void print(PrintWriter writer, String message) {
-    if (writer != null) {
-      writer.print(message);
-    }
-  }
-
-  private static class Event extends AbstractNoNotifyEvent
-      implements GarbageCollectorListener.Event {
-    private final Project.NameKey p;
-    private final Properties statistics;
-
-    Event(Project.NameKey p, Properties statistics) {
-      this.p = p;
-      this.statistics = statistics;
-    }
-
-    @Override
-    public String getProjectName() {
-      return p.get();
-    }
-
-    @Override
-    public Properties getStatistics() {
-      return statistics;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollectionLogFile.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollectionLogFile.java
deleted file mode 100644
index e1f0594..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollectionLogFile.java
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.git;
-
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.util.SystemLog;
-import com.google.inject.Inject;
-import java.nio.file.Path;
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
-import org.apache.log4j.PatternLayout;
-
-public class GarbageCollectionLogFile implements LifecycleListener {
-
-  @Inject
-  public GarbageCollectionLogFile(SitePaths sitePaths) {
-    if (SystemLog.shouldConfigure()) {
-      initLogSystem(sitePaths.logs_dir);
-    }
-  }
-
-  @Override
-  public void start() {}
-
-  @Override
-  public void stop() {
-    LogManager.getLogger(GarbageCollection.LOG_NAME).removeAllAppenders();
-  }
-
-  private static void initLogSystem(Path logdir) {
-    Logger gcLogger = LogManager.getLogger(GarbageCollection.LOG_NAME);
-    gcLogger.removeAllAppenders();
-    gcLogger.addAppender(
-        SystemLog.createAppender(
-            logdir, GarbageCollection.LOG_NAME, new PatternLayout("[%d] %-5p %x: %m%n")));
-    gcLogger.setAdditivity(false);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollectionRunner.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollectionRunner.java
deleted file mode 100644
index 4d8a61f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollectionRunner.java
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.git;
-
-import static com.google.gerrit.server.config.ScheduleConfig.MISSING_CONFIG;
-
-import com.google.common.collect.Lists;
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.gerrit.server.config.GcConfig;
-import com.google.gerrit.server.config.ScheduleConfig;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.inject.Inject;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Runnable to enable scheduling gc to run periodically */
-public class GarbageCollectionRunner implements Runnable {
-  private static final Logger gcLog = LoggerFactory.getLogger(GarbageCollection.LOG_NAME);
-  private static final Logger log = LoggerFactory.getLogger(GarbageCollectionRunner.class);
-
-  static class Lifecycle implements LifecycleListener {
-    private final WorkQueue queue;
-    private final GarbageCollectionRunner gcRunner;
-    private final GcConfig gcConfig;
-
-    @Inject
-    Lifecycle(WorkQueue queue, GarbageCollectionRunner gcRunner, GcConfig config) {
-      this.queue = queue;
-      this.gcRunner = gcRunner;
-      this.gcConfig = config;
-    }
-
-    @Override
-    public void start() {
-      ScheduleConfig scheduleConfig = gcConfig.getScheduleConfig();
-      long interval = scheduleConfig.getInterval();
-      long delay = scheduleConfig.getInitialDelay();
-      if (delay == MISSING_CONFIG && interval == MISSING_CONFIG) {
-        log.info("Ignoring missing gc schedule configuration");
-      } else if (delay < 0 || interval <= 0) {
-        log.warn("Ignoring invalid gc schedule configuration: {}", scheduleConfig);
-      } else {
-        @SuppressWarnings("unused")
-        Future<?> possiblyIgnoredError =
-            queue
-                .getDefaultQueue()
-                .scheduleAtFixedRate(gcRunner, delay, interval, TimeUnit.MILLISECONDS);
-      }
-    }
-
-    @Override
-    public void stop() {
-      // handled by WorkQueue.stop() already
-    }
-  }
-
-  private final GarbageCollection.Factory garbageCollectionFactory;
-  private final ProjectCache projectCache;
-
-  @Inject
-  GarbageCollectionRunner(
-      GarbageCollection.Factory garbageCollectionFactory, ProjectCache projectCache) {
-    this.garbageCollectionFactory = garbageCollectionFactory;
-    this.projectCache = projectCache;
-  }
-
-  @Override
-  public void run() {
-    gcLog.info("Triggering gc on all repositories");
-    garbageCollectionFactory.create().run(Lists.newArrayList(projectCache.all()));
-  }
-
-  @Override
-  public String toString() {
-    return "GC runner";
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/GitModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/GitModule.java
deleted file mode 100644
index 92514da..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/GitModule.java
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.server.git;
-
-import com.google.gerrit.extensions.config.FactoryModule;
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import org.eclipse.jgit.transport.PostUploadHook;
-
-/** Configures the Git support. */
-public class GitModule extends FactoryModule {
-  @Override
-  protected void configure() {
-    factory(RenameGroupOp.Factory.class);
-    factory(MetaDataUpdate.InternalFactory.class);
-    bind(MetaDataUpdate.Server.class);
-    DynamicSet.bind(binder(), PostUploadHook.class).to(UploadPackMetricsHook.class);
-    DynamicItem.itemOf(binder(), ChangeReportFormatter.class);
-    DynamicItem.bind(binder(), ChangeReportFormatter.class).to(DefaultChangeReportFormatter.class);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/GitModules.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/GitModules.java
deleted file mode 100644
index 46916c8..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/GitModules.java
+++ /dev/null
@@ -1,112 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.git;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.SubmoduleSubscription;
-import com.google.gerrit.server.config.CanonicalWebUrl;
-import com.google.gerrit.server.git.MergeOpRepoManager.OpenRepo;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.util.RequestId;
-import com.google.gerrit.server.util.SubmoduleSectionParser;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.BlobBasedConfig;
-import org.eclipse.jgit.lib.FileMode;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.treewalk.TreeWalk;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Loads the .gitmodules file of the specified project/branch. It can be queried which submodules
- * this branch is subscribed to.
- */
-public class GitModules {
-  private static final Logger log = LoggerFactory.getLogger(GitModules.class);
-
-  public interface Factory {
-    GitModules create(Branch.NameKey project, MergeOpRepoManager m);
-  }
-
-  private static final String GIT_MODULES = ".gitmodules";
-
-  private final RequestId submissionId;
-  Set<SubmoduleSubscription> subscriptions;
-
-  @Inject
-  GitModules(
-      @CanonicalWebUrl @Nullable String canonicalWebUrl,
-      @Assisted Branch.NameKey branch,
-      @Assisted MergeOpRepoManager orm)
-      throws IOException {
-    this.submissionId = orm.getSubmissionId();
-    Project.NameKey project = branch.getParentKey();
-    logDebug("Loading .gitmodules of {} for project {}", branch, project);
-    try {
-      OpenRepo or = orm.getRepo(project);
-      ObjectId id = or.repo.resolve(branch.get());
-      if (id == null) {
-        throw new IOException("Cannot open branch " + branch.get());
-      }
-      RevCommit commit = or.rw.parseCommit(id);
-
-      try (TreeWalk tw = TreeWalk.forPath(or.repo, GIT_MODULES, commit.getTree())) {
-        if (tw == null || (tw.getRawMode(0) & FileMode.TYPE_MASK) != FileMode.TYPE_FILE) {
-          subscriptions = Collections.emptySet();
-          logDebug("The .gitmodules file doesn't exist in " + branch);
-          return;
-        }
-      }
-      BlobBasedConfig bbc;
-      try {
-        bbc = new BlobBasedConfig(null, or.repo, commit, GIT_MODULES);
-      } catch (ConfigInvalidException e) {
-        throw new IOException(
-            "Could not read .gitmodules of super project: " + branch.getParentKey(), e);
-      }
-      subscriptions = new SubmoduleSectionParser(bbc, canonicalWebUrl, branch).parseAllSections();
-    } catch (NoSuchProjectException e) {
-      throw new IOException(e);
-    }
-  }
-
-  public Collection<SubmoduleSubscription> subscribedTo(Branch.NameKey src) {
-    logDebug("Checking for a subscription of " + src);
-    Collection<SubmoduleSubscription> ret = new ArrayList<>();
-    for (SubmoduleSubscription s : subscriptions) {
-      if (s.getSubmodule().equals(src)) {
-        logDebug("Found " + s);
-        ret.add(s);
-      }
-    }
-    return ret;
-  }
-
-  private void logDebug(String msg, Object... args) {
-    if (log.isDebugEnabled()) {
-      log.debug(submissionId + msg, args);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/GroupCollector.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/GroupCollector.java
deleted file mode 100644
index 4a7c7e9..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/GroupCollector.java
+++ /dev/null
@@ -1,304 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.git;
-
-import static com.google.common.base.Preconditions.checkState;
-import static org.eclipse.jgit.revwalk.RevFlag.UNINTERESTING;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.MultimapBuilder;
-import com.google.common.collect.Multimaps;
-import com.google.common.collect.SetMultimap;
-import com.google.common.collect.Sets;
-import com.google.common.collect.SortedSetMultimap;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.change.RevisionResource;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gwtorm.server.OrmException;
-import java.util.ArrayDeque;
-import java.util.Collection;
-import java.util.Deque;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Helper for assigning groups to commits during {@code ReceiveCommits}.
- *
- * <p>For each commit encountered along a walk between the branch tip and the tip of the push, the
- * group of a commit is defined as follows:
- *
- * <ul>
- *   <li>If the commit is an existing patch set of a change, the group is read from the group field
- *       in the corresponding {@link PatchSet} record.
- *   <li>If all of a commit's parents are merged into the branch, then its group is its own SHA-1.
- *   <li>If the commit has a single parent that is not yet merged into the branch, then its group is
- *       the same as the parent's group.
- *   <li>
- *   <li>For a merge commit, choose a parent and use that parent's group. If one of the parents has
- *       a group from a patch set, use that group, otherwise, use the group from the first parent.
- *       In addition to setting this merge commit's group, use the chosen group for all commits that
- *       would otherwise use a group from the parents that were not chosen.
- *   <li>If a merge commit has multiple parents whose group comes from separate patch sets,
- *       concatenate the groups from those parents together. This indicates two side branches were
- *       pushed separately, followed by the merge.
- *   <li>
- * </ul>
- *
- * <p>Callers must call {@link #visit(RevCommit)} on all commits between the current branch tip and
- * the tip of a push, in reverse topo order (parents before children). Once all commits have been
- * visited, call {@link #getGroups()} for the result.
- */
-public class GroupCollector {
-  private static final Logger log = LoggerFactory.getLogger(GroupCollector.class);
-
-  public static List<String> getDefaultGroups(PatchSet ps) {
-    return ImmutableList.of(ps.getRevision().get());
-  }
-
-  public static List<String> getDefaultGroups(ObjectId commit) {
-    return ImmutableList.of(commit.name());
-  }
-
-  public static List<String> getGroups(RevisionResource rsrc) {
-    if (rsrc.getEdit().isPresent()) {
-      // Groups for an edit are just the base revision's groups, since they have
-      // the same parent.
-      return rsrc.getEdit().get().getBasePatchSet().getGroups();
-    }
-    return rsrc.getPatchSet().getGroups();
-  }
-
-  private interface Lookup {
-    List<String> lookup(PatchSet.Id psId) throws OrmException;
-  }
-
-  private final ListMultimap<ObjectId, PatchSet.Id> patchSetsBySha;
-  private final ListMultimap<ObjectId, String> groups;
-  private final SetMultimap<String, String> groupAliases;
-  private final Lookup groupLookup;
-
-  private boolean done;
-
-  public static GroupCollector create(
-      ListMultimap<ObjectId, Ref> changeRefsById,
-      ReviewDb db,
-      PatchSetUtil psUtil,
-      ChangeNotes.Factory notesFactory,
-      Project.NameKey project) {
-    return new GroupCollector(
-        transformRefs(changeRefsById),
-        new Lookup() {
-          @Override
-          public List<String> lookup(PatchSet.Id psId) throws OrmException {
-            // TODO(dborowitz): Reuse open repository from caller.
-            ChangeNotes notes = notesFactory.createChecked(db, project, psId.getParentKey());
-            PatchSet ps = psUtil.get(db, notes, psId);
-            return ps != null ? ps.getGroups() : null;
-          }
-        });
-  }
-
-  public static GroupCollector createForSchemaUpgradeOnly(
-      ListMultimap<ObjectId, Ref> changeRefsById, ReviewDb db) {
-    return new GroupCollector(
-        transformRefs(changeRefsById),
-        new Lookup() {
-          @Override
-          public List<String> lookup(PatchSet.Id psId) throws OrmException {
-            PatchSet ps = db.patchSets().get(psId);
-            return ps != null ? ps.getGroups() : null;
-          }
-        });
-  }
-
-  private GroupCollector(ListMultimap<ObjectId, PatchSet.Id> patchSetsBySha, Lookup groupLookup) {
-    this.patchSetsBySha = patchSetsBySha;
-    this.groupLookup = groupLookup;
-    groups = MultimapBuilder.hashKeys().arrayListValues().build();
-    groupAliases = MultimapBuilder.hashKeys().hashSetValues().build();
-  }
-
-  private static ListMultimap<ObjectId, PatchSet.Id> transformRefs(
-      ListMultimap<ObjectId, Ref> refs) {
-    return Multimaps.transformValues(refs, r -> PatchSet.Id.fromRef(r.getName()));
-  }
-
-  @VisibleForTesting
-  GroupCollector(
-      ListMultimap<ObjectId, PatchSet.Id> patchSetsBySha,
-      ListMultimap<PatchSet.Id, String> groupLookup) {
-    this(
-        patchSetsBySha,
-        new Lookup() {
-          @Override
-          public List<String> lookup(PatchSet.Id psId) {
-            List<String> groups = groupLookup.get(psId);
-            return !groups.isEmpty() ? groups : null;
-          }
-        });
-  }
-
-  public void visit(RevCommit c) {
-    checkState(!done, "visit() called after getGroups()");
-    Set<RevCommit> interestingParents = getInterestingParents(c);
-
-    if (interestingParents.size() == 0) {
-      // All parents are uninteresting: treat this commit as the root of a new
-      // group of related changes.
-      groups.put(c, c.name());
-      return;
-    } else if (interestingParents.size() == 1) {
-      // Only one parent is new in this push. If it is the only parent, just use
-      // that parent's group. If there are multiple parents, perhaps this commit
-      // is a merge of a side branch. This commit belongs in that parent's group
-      // in that case.
-      groups.putAll(c, groups.get(interestingParents.iterator().next()));
-      return;
-    }
-
-    // Multiple parents, merging at least two branches containing new commits in
-    // this push.
-    Set<String> thisCommitGroups = new TreeSet<>();
-    Set<String> parentGroupsNewInThisPush =
-        Sets.newLinkedHashSetWithExpectedSize(interestingParents.size());
-    for (RevCommit p : interestingParents) {
-      Collection<String> parentGroups = groups.get(p);
-      if (parentGroups.isEmpty()) {
-        throw new IllegalStateException(
-            String.format("no group assigned to parent %s of commit %s", p.name(), c.name()));
-      }
-
-      for (String parentGroup : parentGroups) {
-        if (isGroupFromExistingPatchSet(p, parentGroup)) {
-          // This parent's group is from an existing patch set, i.e. the parent
-          // not new in this push. Use this group for the commit.
-          thisCommitGroups.add(parentGroup);
-        } else {
-          // This parent's group is new in this push.
-          parentGroupsNewInThisPush.add(parentGroup);
-        }
-      }
-    }
-
-    Iterable<String> toAlias;
-    if (thisCommitGroups.isEmpty()) {
-      // All parent groups were new in this push. Pick the first one and alias
-      // other parents' groups to this first parent.
-      String firstParentGroup = parentGroupsNewInThisPush.iterator().next();
-      thisCommitGroups = ImmutableSet.of(firstParentGroup);
-      toAlias = Iterables.skip(parentGroupsNewInThisPush, 1);
-    } else {
-      // For each parent group that was new in this push, alias it to the actual
-      // computed group(s) for this commit.
-      toAlias = parentGroupsNewInThisPush;
-    }
-    groups.putAll(c, thisCommitGroups);
-    for (String pg : toAlias) {
-      groupAliases.putAll(pg, thisCommitGroups);
-    }
-  }
-
-  public SortedSetMultimap<ObjectId, String> getGroups() throws OrmException {
-    done = true;
-    SortedSetMultimap<ObjectId, String> result =
-        MultimapBuilder.hashKeys(groups.keySet().size()).treeSetValues().build();
-    for (Map.Entry<ObjectId, Collection<String>> e : groups.asMap().entrySet()) {
-      ObjectId id = e.getKey();
-      result.putAll(id.copy(), resolveGroups(id, e.getValue()));
-    }
-    return result;
-  }
-
-  private Set<RevCommit> getInterestingParents(RevCommit commit) {
-    Set<RevCommit> result = Sets.newLinkedHashSetWithExpectedSize(commit.getParentCount());
-    for (RevCommit p : commit.getParents()) {
-      if (!p.has(UNINTERESTING)) {
-        result.add(p);
-      }
-    }
-    return result;
-  }
-
-  private boolean isGroupFromExistingPatchSet(RevCommit commit, String group) {
-    ObjectId id = parseGroup(commit, group);
-    return id != null && patchSetsBySha.containsKey(id);
-  }
-
-  private Set<String> resolveGroups(ObjectId forCommit, Collection<String> candidates)
-      throws OrmException {
-    Set<String> actual = Sets.newTreeSet();
-    Set<String> done = Sets.newHashSetWithExpectedSize(candidates.size());
-    Set<String> seen = Sets.newHashSetWithExpectedSize(candidates.size());
-    Deque<String> todo = new ArrayDeque<>(candidates);
-    // BFS through all aliases to find groups that are not aliased to anything
-    // else.
-    while (!todo.isEmpty()) {
-      String g = todo.removeFirst();
-      if (!seen.add(g)) {
-        continue;
-      }
-      Set<String> aliases = groupAliases.get(g);
-      if (aliases.isEmpty()) {
-        if (!done.contains(g)) {
-          Iterables.addAll(actual, resolveGroup(forCommit, g));
-          done.add(g);
-        }
-      } else {
-        todo.addAll(aliases);
-      }
-    }
-    return actual;
-  }
-
-  private ObjectId parseGroup(ObjectId forCommit, String group) {
-    try {
-      return ObjectId.fromString(group);
-    } catch (IllegalArgumentException e) {
-      // Shouldn't happen; some sort of corruption or manual tinkering?
-      log.warn("group for commit {} is not a SHA-1: {}", forCommit.name(), group);
-      return null;
-    }
-  }
-
-  private Iterable<String> resolveGroup(ObjectId forCommit, String group) throws OrmException {
-    ObjectId id = parseGroup(forCommit, group);
-    if (id != null) {
-      PatchSet.Id psId = Iterables.getFirst(patchSetsBySha.get(id), null);
-      if (psId != null) {
-        List<String> groups = groupLookup.lookup(psId);
-        // Group for existing patch set may be missing, e.g. if group has not
-        // been migrated yet.
-        if (groups != null && !groups.isEmpty()) {
-          return groups;
-        }
-      }
-    }
-    return ImmutableList.of(group);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/GroupList.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/GroupList.java
deleted file mode 100644
index 5791843..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/GroupList.java
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.git;
-
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Project;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class GroupList extends TabFile {
-  private static final Logger log = LoggerFactory.getLogger(GroupList.class);
-
-  public static final String FILE_NAME = "groups";
-
-  private final Map<AccountGroup.UUID, GroupReference> byUUID;
-
-  private GroupList(Map<AccountGroup.UUID, GroupReference> byUUID) {
-    this.byUUID = byUUID;
-  }
-
-  public static GroupList parse(Project.NameKey project, String text, ValidationError.Sink errors)
-      throws IOException {
-    List<Row> rows = parse(text, FILE_NAME, TRIM, TRIM, errors);
-    Map<AccountGroup.UUID, GroupReference> groupsByUUID = new HashMap<>(rows.size());
-    for (Row row : rows) {
-      if (row.left == null) {
-        log.warn("null field in group list for {}:\n{}", project, text);
-        continue;
-      }
-      AccountGroup.UUID uuid = new AccountGroup.UUID(row.left);
-      String name = row.right;
-      GroupReference ref = new GroupReference(uuid, name);
-
-      groupsByUUID.put(uuid, ref);
-    }
-
-    return new GroupList(groupsByUUID);
-  }
-
-  public GroupReference byUUID(AccountGroup.UUID uuid) {
-    return byUUID.get(uuid);
-  }
-
-  public GroupReference resolve(GroupReference group) {
-    if (group != null) {
-      if (group.getUUID() == null || group.getUUID().get() == null) {
-        // A GroupReference from ProjectConfig that refers to a group not found
-        // in this file will have a null UUID. Since there may be multiple
-        // different missing references, it's not appropriate to cache the
-        // results, nor return null the set from #uuids.
-        return group;
-      }
-      GroupReference ref = byUUID.get(group.getUUID());
-      if (ref != null) {
-        return ref;
-      }
-      byUUID.put(group.getUUID(), group);
-    }
-    return group;
-  }
-
-  public Collection<GroupReference> references() {
-    return byUUID.values();
-  }
-
-  public Set<AccountGroup.UUID> uuids() {
-    return byUUID.keySet();
-  }
-
-  public void put(AccountGroup.UUID uuid, GroupReference reference) {
-    if (uuid == null || uuid.get() == null) {
-      return; // See note in #resolve above.
-    }
-    byUUID.put(uuid, reference);
-  }
-
-  public String asText() {
-    if (byUUID.isEmpty()) {
-      return null;
-    }
-
-    List<Row> rows = new ArrayList<>(byUUID.size());
-    for (GroupReference g : sort(byUUID.values())) {
-      if (g.getUUID() != null && g.getName() != null) {
-        rows.add(new Row(g.getUUID().get(), g.getName()));
-      }
-    }
-
-    return asText("UUID", "Group Name", rows);
-  }
-
-  public void retainUUIDs(Collection<AccountGroup.UUID> toBeRetained) {
-    byUUID.keySet().retainAll(toBeRetained);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/HackPushNegotiateHook.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/HackPushNegotiateHook.java
deleted file mode 100644
index 0011994..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/HackPushNegotiateHook.java
+++ /dev/null
@@ -1,147 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.server.git;
-
-import static org.eclipse.jgit.lib.RefDatabase.ALL;
-
-import com.google.common.collect.Sets;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Map;
-import java.util.Set;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.AdvertiseRefsHook;
-import org.eclipse.jgit.transport.BaseReceivePack;
-import org.eclipse.jgit.transport.ServiceMayNotContinueException;
-import org.eclipse.jgit.transport.UploadPack;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Advertises part of history to git push clients.
- *
- * <p>This is a hack to work around the lack of negotiation in the send-pack/receive-pack wire
- * protocol.
- *
- * <p>When the server is frequently advancing master by creating merge commits, the client may not
- * be able to discover a common ancestor during push. Attempting to push will re-upload a very large
- * amount of history. This hook hacks in a fake negotiation replacement by walking history and
- * sending recent commits as {@code ".have"} lines in the wire protocol, allowing the client to find
- * a common ancestor.
- */
-public class HackPushNegotiateHook implements AdvertiseRefsHook {
-  private static final Logger log = LoggerFactory.getLogger(HackPushNegotiateHook.class);
-
-  /** Size of an additional ".have" line. */
-  private static final int HAVE_LINE_LEN = 4 + Constants.OBJECT_ID_STRING_LENGTH + 1 + 5 + 1;
-
-  /**
-   * Maximum number of bytes to "waste" in the advertisement with a peek at this repository's
-   * current reachable history.
-   */
-  private static final int MAX_EXTRA_BYTES = 8192;
-
-  /**
-   * Number of recent commits to advertise immediately, hoping to show a client a nearby merge base.
-   */
-  private static final int BASE_COMMITS = 64;
-
-  /** Number of commits to skip once base has already been shown. */
-  private static final int STEP_COMMITS = 16;
-
-  /** Total number of commits to extract from the history. */
-  private static final int MAX_HISTORY = MAX_EXTRA_BYTES / HAVE_LINE_LEN;
-
-  @Override
-  public void advertiseRefs(UploadPack us) {
-    throw new UnsupportedOperationException("HackPushNegotiateHook cannot be used for UploadPack");
-  }
-
-  @Override
-  public void advertiseRefs(BaseReceivePack rp) throws ServiceMayNotContinueException {
-    Map<String, Ref> r = rp.getAdvertisedRefs();
-    if (r == null) {
-      try {
-        r = rp.getRepository().getRefDatabase().getRefs(ALL);
-      } catch (ServiceMayNotContinueException e) {
-        throw e;
-      } catch (IOException e) {
-        ServiceMayNotContinueException ex = new ServiceMayNotContinueException();
-        ex.initCause(e);
-        throw ex;
-      }
-    }
-    rp.setAdvertisedRefs(r, history(r.values(), rp));
-  }
-
-  private Set<ObjectId> history(Collection<Ref> refs, BaseReceivePack rp) {
-    Set<ObjectId> alreadySending = rp.getAdvertisedObjects();
-    if (alreadySending.isEmpty()) {
-      alreadySending = idsOf(refs);
-    }
-
-    int max = MAX_HISTORY - Math.max(0, alreadySending.size() - refs.size());
-    if (max <= 0) {
-      return Collections.emptySet();
-    }
-
-    // Scan history until the advertisement is full.
-    RevWalk rw = rp.getRevWalk();
-    rw.reset();
-    try {
-      for (Ref ref : refs) {
-        try {
-          if (ref.getObjectId() != null) {
-            rw.markStart(rw.parseCommit(ref.getObjectId()));
-          }
-        } catch (IOException badCommit) {
-          continue;
-        }
-      }
-
-      Set<ObjectId> history = Sets.newHashSetWithExpectedSize(max);
-      try {
-        int stepCnt = 0;
-        for (RevCommit c; history.size() < max && (c = rw.next()) != null; ) {
-          if (c.getParentCount() <= 1
-              && !alreadySending.contains(c)
-              && (history.size() < BASE_COMMITS || (++stepCnt % STEP_COMMITS) == 0)) {
-            history.add(c);
-          }
-        }
-      } catch (IOException err) {
-        log.error("error trying to advertise history", err);
-      }
-      return history;
-    } finally {
-      rw.reset();
-    }
-  }
-
-  private static Set<ObjectId> idsOf(Collection<Ref> refs) {
-    Set<ObjectId> r = Sets.newHashSetWithExpectedSize(refs.size());
-    for (Ref ref : refs) {
-      if (ref.getObjectId() != null) {
-        r.add(ref.getObjectId());
-      }
-    }
-    return r;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/InMemoryInserter.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/InMemoryInserter.java
deleted file mode 100644
index b80f846..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/InMemoryInserter.java
+++ /dev/null
@@ -1,151 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.git;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.common.collect.ImmutableList;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Set;
-import org.eclipse.jgit.errors.IncorrectObjectTypeException;
-import org.eclipse.jgit.lib.AbbreviatedObjectId;
-import org.eclipse.jgit.lib.AnyObjectId;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.ObjectLoader;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.transport.PackParser;
-
-public class InMemoryInserter extends ObjectInserter {
-  private final ObjectReader reader;
-  private final Map<ObjectId, InsertedObject> inserted = new LinkedHashMap<>();
-  private final boolean closeReader;
-
-  public InMemoryInserter(ObjectReader reader) {
-    this.reader = checkNotNull(reader);
-    closeReader = false;
-  }
-
-  public InMemoryInserter(Repository repo) {
-    this.reader = repo.newObjectReader();
-    closeReader = true;
-  }
-
-  @Override
-  public ObjectId insert(int type, long length, InputStream in) throws IOException {
-    return insert(InsertedObject.create(type, in));
-  }
-
-  @Override
-  public ObjectId insert(int type, byte[] data) {
-    return insert(type, data, 0, data.length);
-  }
-
-  @Override
-  public ObjectId insert(int type, byte[] data, int off, int len) {
-    return insert(InsertedObject.create(type, data, off, len));
-  }
-
-  public ObjectId insert(InsertedObject obj) {
-    inserted.put(obj.id(), obj);
-    return obj.id();
-  }
-
-  @Override
-  public PackParser newPackParser(InputStream in) {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public ObjectReader newReader() {
-    return new Reader();
-  }
-
-  @Override
-  public void flush() {
-    // Do nothing; objects are not written to the repo.
-  }
-
-  @Override
-  public void close() {
-    if (closeReader) {
-      reader.close();
-    }
-  }
-
-  public ImmutableList<InsertedObject> getInsertedObjects() {
-    return ImmutableList.copyOf(inserted.values());
-  }
-
-  public int getInsertedObjectCount() {
-    return inserted.values().size();
-  }
-
-  public void clear() {
-    inserted.clear();
-  }
-
-  private class Reader extends ObjectReader {
-    @Override
-    public ObjectReader newReader() {
-      return new Reader();
-    }
-
-    @Override
-    public Collection<ObjectId> resolve(AbbreviatedObjectId id) throws IOException {
-      Set<ObjectId> result = new HashSet<>();
-      for (ObjectId insId : inserted.keySet()) {
-        if (id.prefixCompare(insId) == 0) {
-          result.add(insId);
-        }
-      }
-      result.addAll(reader.resolve(id));
-      return result;
-    }
-
-    @Override
-    public ObjectLoader open(AnyObjectId objectId, int typeHint) throws IOException {
-      InsertedObject obj = inserted.get(objectId);
-      if (obj == null) {
-        return reader.open(objectId, typeHint);
-      }
-      if (typeHint != OBJ_ANY && obj.type() != typeHint) {
-        throw new IncorrectObjectTypeException(objectId.copy(), typeHint);
-      }
-      return obj.newLoader();
-    }
-
-    @Override
-    public Set<ObjectId> getShallowCommits() throws IOException {
-      return reader.getShallowCommits();
-    }
-
-    @Override
-    public void close() {
-      // Do nothing; this class owns no open resources.
-    }
-
-    @Override
-    public ObjectInserter getCreatedFromInserter() {
-      return InMemoryInserter.this;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/IntegrationException.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/IntegrationException.java
deleted file mode 100644
index 58d4e6e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/IntegrationException.java
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.server.git;
-
-/** Indicates an integration operation (see {@link MergeOp}) failed. */
-public class IntegrationException extends Exception {
-  private static final long serialVersionUID = 1L;
-
-  public IntegrationException(String msg) {
-    super(msg);
-  }
-
-  public IntegrationException(Throwable why) {
-    super(why);
-  }
-
-  public IntegrationException(String msg, Throwable why) {
-    super(msg, why);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/LabelNormalizer.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/LabelNormalizer.java
deleted file mode 100644
index 73cda7f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/LabelNormalizer.java
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.git;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.LabelTypes;
-import com.google.gerrit.common.data.LabelValue;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * Normalizes votes on labels according to project config.
- *
- * <p>Votes are recorded in the database for a user based on the state of the project at that time:
- * what labels are defined for the project. The label definition can change between the time a vote
- * is originally made and a later point, for example when a change is submitted. This class
- * normalizes old votes against current project configuration.
- */
-@Singleton
-public class LabelNormalizer {
-  @AutoValue
-  public abstract static class Result {
-    @VisibleForTesting
-    static Result create(
-        List<PatchSetApproval> unchanged,
-        List<PatchSetApproval> updated,
-        List<PatchSetApproval> deleted) {
-      return new AutoValue_LabelNormalizer_Result(
-          ImmutableList.copyOf(unchanged),
-          ImmutableList.copyOf(updated),
-          ImmutableList.copyOf(deleted));
-    }
-
-    public abstract ImmutableList<PatchSetApproval> unchanged();
-
-    public abstract ImmutableList<PatchSetApproval> updated();
-
-    public abstract ImmutableList<PatchSetApproval> deleted();
-
-    public Iterable<PatchSetApproval> getNormalized() {
-      return Iterables.concat(unchanged(), updated());
-    }
-  }
-
-  private final IdentifiedUser.GenericFactory userFactory;
-  private final ProjectCache projectCache;
-
-  @Inject
-  LabelNormalizer(IdentifiedUser.GenericFactory userFactory, ProjectCache projectCache) {
-    this.userFactory = userFactory;
-    this.projectCache = projectCache;
-  }
-
-  /**
-   * @param notes change containing the given approvals.
-   * @param approvals list of approvals.
-   * @return copies of approvals normalized to the defined ranges for the label type. Approvals for
-   *     unknown labels are not included in the output.
-   * @throws OrmException
-   */
-  public Result normalize(ChangeNotes notes, Collection<PatchSetApproval> approvals)
-      throws OrmException, IOException {
-    IdentifiedUser user = userFactory.create(notes.getChange().getOwner());
-    return normalize(notes, user, approvals);
-  }
-
-  /**
-   * @param notes change notes containing the given approvals.
-   * @param user current user.
-   * @param approvals list of approvals.
-   * @return copies of approvals normalized to the defined ranges for the label type. Approvals for
-   *     unknown labels are not included in the output.
-   */
-  public Result normalize(
-      ChangeNotes notes, CurrentUser user, Collection<PatchSetApproval> approvals)
-      throws IOException {
-    List<PatchSetApproval> unchanged = Lists.newArrayListWithCapacity(approvals.size());
-    List<PatchSetApproval> updated = Lists.newArrayListWithCapacity(approvals.size());
-    List<PatchSetApproval> deleted = Lists.newArrayListWithCapacity(approvals.size());
-    LabelTypes labelTypes =
-        projectCache.checkedGet(notes.getProjectName()).getLabelTypes(notes, user);
-    for (PatchSetApproval psa : approvals) {
-      Change.Id changeId = psa.getKey().getParentKey().getParentKey();
-      checkArgument(
-          changeId.equals(notes.getChangeId()),
-          "Approval %s does not match change %s",
-          psa.getKey(),
-          notes.getChange().getKey());
-      if (psa.isLegacySubmit()) {
-        unchanged.add(psa);
-        continue;
-      }
-      LabelType label = labelTypes.byLabel(psa.getLabelId());
-      if (label == null) {
-        deleted.add(psa);
-        continue;
-      }
-      PatchSetApproval copy = copy(psa);
-      applyTypeFloor(label, copy);
-      if (copy.getValue() != psa.getValue()) {
-        updated.add(copy);
-      } else {
-        unchanged.add(psa);
-      }
-    }
-    return Result.create(unchanged, updated, deleted);
-  }
-
-  private PatchSetApproval copy(PatchSetApproval src) {
-    return new PatchSetApproval(src.getPatchSetId(), src);
-  }
-
-  private void applyTypeFloor(LabelType lt, PatchSetApproval a) {
-    LabelValue atMin = lt.getMin();
-    if (atMin != null && a.getValue() < atMin.getValue()) {
-      a.setValue(atMin.getValue());
-    }
-    LabelValue atMax = lt.getMax();
-    if (atMax != null && a.getValue() > atMax.getValue()) {
-      a.setValue(atMax.getValue());
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java
deleted file mode 100644
index 8f075de..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java
+++ /dev/null
@@ -1,369 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.server.git;
-
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.gerrit.lifecycle.LifecycleModule;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.FileVisitOption;
-import java.nio.file.FileVisitResult;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.SimpleFileVisitor;
-import java.nio.file.attribute.BasicFileAttributes;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.SortedSet;
-import java.util.TreeSet;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ConfigConstants;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.lib.RepositoryCache;
-import org.eclipse.jgit.lib.RepositoryCache.FileKey;
-import org.eclipse.jgit.lib.RepositoryCacheConfig;
-import org.eclipse.jgit.lib.StoredConfig;
-import org.eclipse.jgit.storage.file.WindowCacheConfig;
-import org.eclipse.jgit.util.FS;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Manages Git repositories stored on the local filesystem. */
-@Singleton
-public class LocalDiskRepositoryManager implements GitRepositoryManager {
-  private static final Logger log = LoggerFactory.getLogger(LocalDiskRepositoryManager.class);
-
-  public static class Module extends LifecycleModule {
-    @Override
-    protected void configure() {
-      listener().to(LocalDiskRepositoryManager.Lifecycle.class);
-    }
-  }
-
-  public static class Lifecycle implements LifecycleListener {
-    private final Config serverConfig;
-
-    @Inject
-    Lifecycle(@GerritServerConfig Config cfg) {
-      this.serverConfig = cfg;
-    }
-
-    @Override
-    public void start() {
-      RepositoryCacheConfig repoCacheCfg = new RepositoryCacheConfig();
-      repoCacheCfg.fromConfig(serverConfig);
-      repoCacheCfg.install();
-
-      WindowCacheConfig cfg = new WindowCacheConfig();
-      cfg.fromConfig(serverConfig);
-      if (serverConfig.getString("core", null, "streamFileThreshold") == null) {
-        long mx = Runtime.getRuntime().maxMemory();
-        int limit =
-            (int)
-                Math.min(
-                    mx / 4, // don't use more than 1/4 of the heap.
-                    2047 << 20); // cannot exceed array length
-        if ((5 << 20) < limit && limit % (1 << 20) != 0) {
-          // If the limit is at least 5 MiB but is not a whole multiple
-          // of MiB round up to the next one full megabyte. This is a very
-          // tiny memory increase in exchange for nice round units.
-          limit = ((limit / (1 << 20)) + 1) << 20;
-        }
-
-        String desc;
-        if (limit % (1 << 20) == 0) {
-          desc = String.format("%dm", limit / (1 << 20));
-        } else if (limit % (1 << 10) == 0) {
-          desc = String.format("%dk", limit / (1 << 10));
-        } else {
-          desc = String.format("%d", limit);
-        }
-        log.info("Defaulting core.streamFileThreshold to {}", desc);
-        cfg.setStreamFileThreshold(limit);
-      }
-      cfg.install();
-    }
-
-    @Override
-    public void stop() {}
-  }
-
-  private final Path basePath;
-  private final Lock namesUpdateLock;
-  private volatile SortedSet<Project.NameKey> names = new TreeSet<>();
-
-  @Inject
-  LocalDiskRepositoryManager(SitePaths site, @GerritServerConfig Config cfg) {
-    basePath = site.resolve(cfg.getString("gerrit", null, "basePath"));
-    if (basePath == null) {
-      throw new IllegalStateException("gerrit.basePath must be configured");
-    }
-
-    namesUpdateLock = new ReentrantLock(true /* fair */);
-  }
-
-  /**
-   * Return the basePath under which the specified project is stored.
-   *
-   * @param name the name of the project
-   * @return base directory
-   */
-  public Path getBasePath(Project.NameKey name) {
-    return basePath;
-  }
-
-  @Override
-  public Repository openRepository(Project.NameKey name) throws RepositoryNotFoundException {
-    return openRepository(getBasePath(name), name);
-  }
-
-  private Repository openRepository(Path path, Project.NameKey name)
-      throws RepositoryNotFoundException {
-    if (isUnreasonableName(name)) {
-      throw new RepositoryNotFoundException("Invalid name: " + name);
-    }
-    File gitDir = path.resolve(name.get()).toFile();
-    if (!names.contains(name)) {
-      // The this.names list does not hold the project-name but it can still exist
-      // on disk; for instance when the project has been created directly on the
-      // file-system through replication.
-      //
-      if (!name.get().endsWith(Constants.DOT_GIT_EXT)) {
-        if (FileKey.resolve(gitDir, FS.DETECTED) != null) {
-          onCreateProject(name);
-        } else {
-          throw new RepositoryNotFoundException(gitDir);
-        }
-      } else {
-        final File directory = gitDir;
-        if (FileKey.isGitRepository(new File(directory, Constants.DOT_GIT), FS.DETECTED)) {
-          onCreateProject(name);
-        } else if (FileKey.isGitRepository(
-            new File(directory.getParentFile(), directory.getName() + Constants.DOT_GIT_EXT),
-            FS.DETECTED)) {
-          onCreateProject(name);
-        } else {
-          throw new RepositoryNotFoundException(gitDir);
-        }
-      }
-    }
-    final FileKey loc = FileKey.lenient(gitDir, FS.DETECTED);
-    try {
-      return RepositoryCache.open(loc);
-    } catch (IOException e1) {
-      final RepositoryNotFoundException e2;
-      e2 = new RepositoryNotFoundException("Cannot open repository " + name);
-      e2.initCause(e1);
-      throw e2;
-    }
-  }
-
-  @Override
-  public Repository createRepository(Project.NameKey name)
-      throws RepositoryNotFoundException, RepositoryCaseMismatchException, IOException {
-    Path path = getBasePath(name);
-    if (isUnreasonableName(name)) {
-      throw new RepositoryNotFoundException("Invalid name: " + name);
-    }
-
-    File dir = FileKey.resolve(path.resolve(name.get()).toFile(), FS.DETECTED);
-    FileKey loc;
-    if (dir != null) {
-      // Already exists on disk, use the repository we found.
-      //
-      Project.NameKey onDiskName = getProjectName(path, dir.getCanonicalFile().toPath());
-      onCreateProject(onDiskName);
-
-      loc = FileKey.exact(dir, FS.DETECTED);
-
-      if (!names.contains(name)) {
-        throw new RepositoryCaseMismatchException(name);
-      }
-    } else {
-      // It doesn't exist under any of the standard permutations
-      // of the repository name, so prefer the standard bare name.
-      //
-      String n = name.get() + Constants.DOT_GIT_EXT;
-      loc = FileKey.exact(path.resolve(n).toFile(), FS.DETECTED);
-    }
-
-    try {
-      Repository db = RepositoryCache.open(loc, false);
-      db.create(true /* bare */);
-
-      StoredConfig config = db.getConfig();
-      config.setBoolean(
-          ConfigConstants.CONFIG_CORE_SECTION,
-          null,
-          ConfigConstants.CONFIG_KEY_LOGALLREFUPDATES,
-          true);
-      config.save();
-
-      // JGit only writes to the reflog for refs/meta/config if the log file
-      // already exists.
-      //
-      File metaConfigLog = new File(db.getDirectory(), "logs/" + RefNames.REFS_CONFIG);
-      if (!metaConfigLog.getParentFile().mkdirs() || !metaConfigLog.createNewFile()) {
-        log.error("Failed to create ref log for {} in repository {}", RefNames.REFS_CONFIG, name);
-      }
-
-      onCreateProject(name);
-
-      return db;
-    } catch (IOException e1) {
-      final RepositoryNotFoundException e2;
-      e2 = new RepositoryNotFoundException("Cannot create repository " + name);
-      e2.initCause(e1);
-      throw e2;
-    }
-  }
-
-  private void onCreateProject(Project.NameKey newProjectName) {
-    namesUpdateLock.lock();
-    try {
-      SortedSet<Project.NameKey> n = new TreeSet<>(names);
-      n.add(newProjectName);
-      names = Collections.unmodifiableSortedSet(n);
-    } finally {
-      namesUpdateLock.unlock();
-    }
-  }
-
-  private boolean isUnreasonableName(Project.NameKey nameKey) {
-    final String name = nameKey.get();
-
-    return name.length() == 0 // no empty paths
-        || name.charAt(name.length() - 1) == '/' // no suffix
-        || name.indexOf('\\') >= 0 // no windows/dos style paths
-        || name.charAt(0) == '/' // no absolute paths
-        || new File(name).isAbsolute() // no absolute paths
-        || name.startsWith("../") // no "l../etc/passwd"
-        || name.contains("/../") // no "foo/../etc/passwd"
-        || name.contains("/./") // "foo/./foo" is insane to ask
-        || name.contains("//") // windows UNC path can be "//..."
-        || name.contains(".git/") // no path segments that end with '.git' as "foo.git/bar"
-        || name.contains("?") // common unix wildcard
-        || name.contains("%") // wildcard or string parameter
-        || name.contains("*") // wildcard
-        || name.contains(":") // Could be used for absolute paths in windows?
-        || name.contains("<") // redirect input
-        || name.contains(">") // redirect output
-        || name.contains("|") // pipe
-        || name.contains("$") // dollar sign
-        || name.contains("\r") // carriage return
-        || name.contains("/+") // delimiter in /changes/
-        || name.contains("~"); // delimiter in /changes/
-  }
-
-  @Override
-  public SortedSet<Project.NameKey> list() {
-    // The results of this method are cached by ProjectCacheImpl. Control only
-    // enters here if the cache was flushed by the administrator to force
-    // scanning the filesystem.
-    // Don't rely on the cached names collection but update it to contain
-    // the set of found project names
-    ProjectVisitor visitor = new ProjectVisitor(basePath);
-    scanProjects(visitor);
-
-    namesUpdateLock.lock();
-    try {
-      names = Collections.unmodifiableSortedSet(visitor.found);
-    } finally {
-      namesUpdateLock.unlock();
-    }
-    return names;
-  }
-
-  protected void scanProjects(ProjectVisitor visitor) {
-    try {
-      Files.walkFileTree(
-          visitor.startFolder,
-          EnumSet.of(FileVisitOption.FOLLOW_LINKS),
-          Integer.MAX_VALUE,
-          visitor);
-    } catch (IOException e) {
-      log.error("Error walking repository tree {}", visitor.startFolder.toAbsolutePath(), e);
-    }
-  }
-
-  private static Project.NameKey getProjectName(Path startFolder, Path p) {
-    String projectName = startFolder.relativize(p).toString();
-    if (File.separatorChar != '/') {
-      projectName = projectName.replace(File.separatorChar, '/');
-    }
-    if (projectName.endsWith(Constants.DOT_GIT_EXT)) {
-      int newLen = projectName.length() - Constants.DOT_GIT_EXT.length();
-      projectName = projectName.substring(0, newLen);
-    }
-    return new Project.NameKey(projectName);
-  }
-
-  protected class ProjectVisitor extends SimpleFileVisitor<Path> {
-    private final SortedSet<Project.NameKey> found = new TreeSet<>();
-    private Path startFolder;
-
-    public ProjectVisitor(Path startFolder) {
-      setStartFolder(startFolder);
-    }
-
-    public void setStartFolder(Path startFolder) {
-      this.startFolder = startFolder;
-    }
-
-    @Override
-    public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
-        throws IOException {
-      if (!dir.equals(startFolder) && isRepo(dir)) {
-        addProject(dir);
-        return FileVisitResult.SKIP_SUBTREE;
-      }
-      return FileVisitResult.CONTINUE;
-    }
-
-    @Override
-    public FileVisitResult visitFileFailed(Path file, IOException e) {
-      log.warn(e.getMessage());
-      return FileVisitResult.CONTINUE;
-    }
-
-    private boolean isRepo(Path p) {
-      String name = p.getFileName().toString();
-      return !name.equals(Constants.DOT_GIT)
-          && (name.endsWith(Constants.DOT_GIT_EXT)
-              || FileKey.isGitRepository(p.toFile(), FS.DETECTED));
-    }
-
-    private void addProject(Path p) {
-      Project.NameKey nameKey = getProjectName(startFolder, p);
-      if (getBasePath(nameKey).equals(startFolder)) {
-        if (isUnreasonableName(nameKey)) {
-          log.warn("Ignoring unreasonably named repository {}", p.toAbsolutePath());
-        } else {
-          found.add(nameKey);
-        }
-      }
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeIdenticalTreeException.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeIdenticalTreeException.java
deleted file mode 100644
index 938f6cf..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeIdenticalTreeException.java
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.git;
-
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-
-/**
- * Indicates that the commit is already contained in destination branch. Either the commit itself is
- * in the source tree, or the content is merged
- */
-public class MergeIdenticalTreeException extends ResourceConflictException {
-  private static final long serialVersionUID = 1L;
-
-  /** @param msg message to return to the client describing the error. */
-  public MergeIdenticalTreeException(String msg) {
-    super(msg);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java
deleted file mode 100644
index b6fbbe2..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java
+++ /dev/null
@@ -1,945 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.server.git;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static java.util.Comparator.comparing;
-import static java.util.stream.Collectors.toSet;
-
-import com.github.rholder.retry.Attempt;
-import com.github.rholder.retry.RetryListener;
-import com.google.auto.value.AutoValue;
-import com.google.common.base.Joiner;
-import com.google.common.collect.ImmutableListMultimap;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ImmutableSetMultimap;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.MultimapBuilder;
-import com.google.common.collect.SetMultimap;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.common.data.SubmitRecord;
-import com.google.gerrit.common.data.SubmitTypeRecord;
-import com.google.gerrit.extensions.api.changes.RecipientType;
-import com.google.gerrit.extensions.api.changes.SubmitInput;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.metrics.Counter0;
-import com.google.gerrit.metrics.Description;
-import com.google.gerrit.metrics.MetricMaker;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.InternalUser;
-import com.google.gerrit.server.change.NotifyUtil;
-import com.google.gerrit.server.git.MergeOpRepoManager.OpenBranch;
-import com.google.gerrit.server.git.MergeOpRepoManager.OpenRepo;
-import com.google.gerrit.server.git.strategy.SubmitStrategy;
-import com.google.gerrit.server.git.strategy.SubmitStrategyFactory;
-import com.google.gerrit.server.git.strategy.SubmitStrategyListener;
-import com.google.gerrit.server.git.validators.MergeValidationException;
-import com.google.gerrit.server.git.validators.MergeValidators;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.SubmitRuleOptions;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.InternalChangeQuery;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gerrit.server.util.RequestId;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.IncorrectObjectTypeException;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Merges changes in submission order into a single branch.
- *
- * <p>Branches are reduced to the minimum number of heads needed to merge everything. This allows
- * commits to be entered into the queue in any order (such as ancestors before descendants) and only
- * the most recent commit on any line of development will be merged. All unmerged commits along a
- * line of development must be in the submission queue in order to merge the tip of that line.
- *
- * <p>Conflicts are handled by discarding the entire line of development and marking it as
- * conflicting, even if an earlier commit along that same line can be merged cleanly.
- */
-public class MergeOp implements AutoCloseable {
-  private static final Logger log = LoggerFactory.getLogger(MergeOp.class);
-
-  private static final SubmitRuleOptions SUBMIT_RULE_OPTIONS = SubmitRuleOptions.defaults().build();
-  private static final SubmitRuleOptions SUBMIT_RULE_OPTIONS_ALLOW_CLOSED =
-      SUBMIT_RULE_OPTIONS.toBuilder().allowClosed(true).build();
-
-  public static class CommitStatus {
-    private final ImmutableMap<Change.Id, ChangeData> changes;
-    private final ImmutableSetMultimap<Branch.NameKey, Change.Id> byBranch;
-    private final Map<Change.Id, CodeReviewCommit> commits;
-    private final ListMultimap<Change.Id, String> problems;
-    private final boolean allowClosed;
-
-    private CommitStatus(ChangeSet cs, boolean allowClosed) throws OrmException {
-      checkArgument(
-          !cs.furtherHiddenChanges(), "CommitStatus must not be called with hidden changes");
-      changes = cs.changesById();
-      ImmutableSetMultimap.Builder<Branch.NameKey, Change.Id> bb = ImmutableSetMultimap.builder();
-      for (ChangeData cd : cs.changes()) {
-        bb.put(cd.change().getDest(), cd.getId());
-      }
-      byBranch = bb.build();
-      commits = new HashMap<>();
-      problems = MultimapBuilder.treeKeys(comparing(Change.Id::get)).arrayListValues(1).build();
-      this.allowClosed = allowClosed;
-    }
-
-    public ImmutableSet<Change.Id> getChangeIds() {
-      return changes.keySet();
-    }
-
-    public ImmutableSet<Change.Id> getChangeIds(Branch.NameKey branch) {
-      return byBranch.get(branch);
-    }
-
-    public CodeReviewCommit get(Change.Id changeId) {
-      return commits.get(changeId);
-    }
-
-    public void put(CodeReviewCommit c) {
-      commits.put(c.change().getId(), c);
-    }
-
-    public void problem(Change.Id id, String problem) {
-      problems.put(id, problem);
-    }
-
-    public void logProblem(Change.Id id, Throwable t) {
-      String msg = "Error reading change";
-      log.error(msg + " " + id, t);
-      problems.put(id, msg);
-    }
-
-    public void logProblem(Change.Id id, String msg) {
-      log.error(msg + " " + id);
-      problems.put(id, msg);
-    }
-
-    public boolean isOk() {
-      return problems.isEmpty();
-    }
-
-    public ImmutableListMultimap<Change.Id, String> getProblems() {
-      return ImmutableListMultimap.copyOf(problems);
-    }
-
-    public List<SubmitRecord> getSubmitRecords(Change.Id id) {
-      // Use the cached submit records from the original ChangeData in the input
-      // ChangeSet, which were checked earlier in the integrate process. Even in
-      // the case of a race where the submit records may have changed, it makes
-      // more sense to store the original results of the submit rule evaluator
-      // than to fail at this point.
-      //
-      // However, do NOT expose that ChangeData directly, as it is way out of
-      // date by this point.
-      ChangeData cd = checkNotNull(changes.get(id), "ChangeData for %s", id);
-      return checkNotNull(
-          cd.getSubmitRecords(submitRuleOptions(allowClosed)),
-          "getSubmitRecord only valid after submit rules are evalutated");
-    }
-
-    public void maybeFailVerbose() throws ResourceConflictException {
-      if (isOk()) {
-        return;
-      }
-      String msg =
-          "Failed to submit "
-              + changes.size()
-              + " change"
-              + (changes.size() > 1 ? "s" : "")
-              + " due to the following problems:\n";
-      List<String> ps = new ArrayList<>(problems.keySet().size());
-      for (Change.Id id : problems.keySet()) {
-        ps.add("Change " + id + ": " + Joiner.on("; ").join(problems.get(id)));
-      }
-      throw new ResourceConflictException(msg + Joiner.on('\n').join(ps));
-    }
-
-    public void maybeFail(String msgPrefix) throws ResourceConflictException {
-      if (isOk()) {
-        return;
-      }
-      StringBuilder msg = new StringBuilder(msgPrefix).append(" of change");
-      Set<Change.Id> ids = problems.keySet();
-      if (ids.size() == 1) {
-        msg.append(" ").append(ids.iterator().next());
-      } else {
-        msg.append("s ").append(Joiner.on(", ").join(ids));
-      }
-      throw new ResourceConflictException(msg.toString());
-    }
-  }
-
-  private final ChangeMessagesUtil cmUtil;
-  private final BatchUpdate.Factory batchUpdateFactory;
-  private final InternalUser.Factory internalUserFactory;
-  private final MergeSuperSet mergeSuperSet;
-  private final MergeValidators.Factory mergeValidatorsFactory;
-  private final Provider<InternalChangeQuery> queryProvider;
-  private final SubmitStrategyFactory submitStrategyFactory;
-  private final SubmoduleOp.Factory subOpFactory;
-  private final Provider<MergeOpRepoManager> ormProvider;
-  private final NotifyUtil notifyUtil;
-  private final RetryHelper retryHelper;
-
-  private Timestamp ts;
-  private RequestId submissionId;
-  private IdentifiedUser caller;
-
-  private MergeOpRepoManager orm;
-  private CommitStatus commitStatus;
-  private ReviewDb db;
-  private SubmitInput submitInput;
-  private ListMultimap<RecipientType, Account.Id> accountsToNotify;
-  private Set<Project.NameKey> allProjects;
-  private boolean dryrun;
-  private TopicMetrics topicMetrics;
-
-  @Inject
-  MergeOp(
-      ChangeMessagesUtil cmUtil,
-      BatchUpdate.Factory batchUpdateFactory,
-      InternalUser.Factory internalUserFactory,
-      MergeSuperSet mergeSuperSet,
-      MergeValidators.Factory mergeValidatorsFactory,
-      Provider<InternalChangeQuery> queryProvider,
-      SubmitStrategyFactory submitStrategyFactory,
-      SubmoduleOp.Factory subOpFactory,
-      Provider<MergeOpRepoManager> ormProvider,
-      NotifyUtil notifyUtil,
-      TopicMetrics topicMetrics,
-      RetryHelper retryHelper) {
-    this.cmUtil = cmUtil;
-    this.batchUpdateFactory = batchUpdateFactory;
-    this.internalUserFactory = internalUserFactory;
-    this.mergeSuperSet = mergeSuperSet;
-    this.mergeValidatorsFactory = mergeValidatorsFactory;
-    this.queryProvider = queryProvider;
-    this.submitStrategyFactory = submitStrategyFactory;
-    this.subOpFactory = subOpFactory;
-    this.ormProvider = ormProvider;
-    this.notifyUtil = notifyUtil;
-    this.retryHelper = retryHelper;
-    this.topicMetrics = topicMetrics;
-  }
-
-  @Override
-  public void close() {
-    if (orm != null) {
-      orm.close();
-    }
-  }
-
-  public static void checkSubmitRule(ChangeData cd, boolean allowClosed)
-      throws ResourceConflictException, OrmException {
-    PatchSet patchSet = cd.currentPatchSet();
-    if (patchSet == null) {
-      throw new ResourceConflictException("missing current patch set for change " + cd.getId());
-    }
-    List<SubmitRecord> results = getSubmitRecords(cd, allowClosed);
-    if (SubmitRecord.findOkRecord(results).isPresent()) {
-      // Rules supplied a valid solution.
-      return;
-    } else if (results.isEmpty()) {
-      throw new IllegalStateException(
-          String.format(
-              "SubmitRuleEvaluator.evaluate for change %s returned empty list for %s in %s",
-              cd.getId(), patchSet.getId(), cd.change().getProject().get()));
-    }
-
-    for (SubmitRecord record : results) {
-      switch (record.status) {
-        case CLOSED:
-          throw new ResourceConflictException("change is closed");
-
-        case RULE_ERROR:
-          throw new ResourceConflictException("submit rule error: " + record.errorMessage);
-
-        case NOT_READY:
-          throw new ResourceConflictException(describeLabels(cd, record.labels));
-
-        case FORCED:
-        case OK:
-        default:
-          throw new IllegalStateException(
-              String.format(
-                  "Unexpected SubmitRecord status %s for %s in %s",
-                  record.status, patchSet.getId().getId(), cd.change().getProject().get()));
-      }
-    }
-    throw new IllegalStateException();
-  }
-
-  private static SubmitRuleOptions submitRuleOptions(boolean allowClosed) {
-    return allowClosed ? SUBMIT_RULE_OPTIONS_ALLOW_CLOSED : SUBMIT_RULE_OPTIONS;
-  }
-
-  private static List<SubmitRecord> getSubmitRecords(ChangeData cd, boolean allowClosed)
-      throws OrmException {
-    return cd.submitRecords(submitRuleOptions(allowClosed));
-  }
-
-  private static String describeLabels(ChangeData cd, List<SubmitRecord.Label> labels)
-      throws OrmException {
-    List<String> labelResults = new ArrayList<>();
-    for (SubmitRecord.Label lbl : labels) {
-      switch (lbl.status) {
-        case OK:
-        case MAY:
-          break;
-
-        case REJECT:
-          labelResults.add("blocked by " + lbl.label);
-          break;
-
-        case NEED:
-          labelResults.add("needs " + lbl.label);
-          break;
-
-        case IMPOSSIBLE:
-          labelResults.add("needs " + lbl.label + " (check project access)");
-          break;
-
-        default:
-          throw new IllegalStateException(
-              String.format(
-                  "Unsupported SubmitRecord.Label %s for %s in %s",
-                  lbl, cd.change().currentPatchSetId(), cd.change().getProject()));
-      }
-    }
-    return Joiner.on("; ").join(labelResults);
-  }
-
-  private void checkSubmitRulesAndState(ChangeSet cs, boolean allowMerged)
-      throws ResourceConflictException {
-    checkArgument(
-        !cs.furtherHiddenChanges(), "checkSubmitRulesAndState called for topic with hidden change");
-    for (ChangeData cd : cs.changes()) {
-      try {
-        Change.Status status = cd.change().getStatus();
-        if (status != Change.Status.NEW) {
-          if (!(status == Change.Status.MERGED && allowMerged)) {
-            commitStatus.problem(
-                cd.getId(),
-                "Change " + cd.getId() + " is " + cd.change().getStatus().toString().toLowerCase());
-          }
-        } else if (cd.change().isWorkInProgress()) {
-          commitStatus.problem(cd.getId(), "Change " + cd.getId() + " is work in progress");
-        } else {
-          checkSubmitRule(cd, allowMerged);
-        }
-      } catch (ResourceConflictException e) {
-        commitStatus.problem(cd.getId(), e.getMessage());
-      } catch (OrmException e) {
-        String msg = "Error checking submit rules for change";
-        log.warn(msg + " " + cd.getId(), e);
-        commitStatus.problem(cd.getId(), msg);
-      }
-    }
-    commitStatus.maybeFailVerbose();
-  }
-
-  private void bypassSubmitRules(ChangeSet cs, boolean allowClosed) throws OrmException {
-    checkArgument(
-        !cs.furtherHiddenChanges(), "cannot bypass submit rules for topic with hidden change");
-    for (ChangeData cd : cs.changes()) {
-      List<SubmitRecord> records = new ArrayList<>(getSubmitRecords(cd, allowClosed));
-      SubmitRecord forced = new SubmitRecord();
-      forced.status = SubmitRecord.Status.FORCED;
-      records.add(forced);
-      cd.setSubmitRecords(submitRuleOptions(allowClosed), records);
-    }
-  }
-
-  /**
-   * Merges the given change.
-   *
-   * <p>Depending on the server configuration, more changes may be affected, e.g. by submission of a
-   * topic or via superproject subscriptions. All affected changes are integrated using the projects
-   * integration strategy.
-   *
-   * @param db the review database.
-   * @param change the change to be merged.
-   * @param caller the identity of the caller
-   * @param checkSubmitRules whether the prolog submit rules should be evaluated
-   * @param submitInput parameters regarding the merge
-   * @throws OrmException an error occurred reading or writing the database.
-   * @throws RestApiException if an error occurred.
-   * @throws PermissionBackendException if permissions can't be checked
-   * @throws IOException an error occurred reading from NoteDb.
-   */
-  public void merge(
-      ReviewDb db,
-      Change change,
-      IdentifiedUser caller,
-      boolean checkSubmitRules,
-      SubmitInput submitInput,
-      boolean dryrun)
-      throws OrmException, RestApiException, UpdateException, IOException, ConfigInvalidException,
-          PermissionBackendException {
-    this.submitInput = submitInput;
-    this.accountsToNotify = notifyUtil.resolveAccounts(submitInput.notifyDetails);
-    this.dryrun = dryrun;
-    this.caller = caller;
-    this.ts = TimeUtil.nowTs();
-    submissionId = RequestId.forChange(change);
-    this.db = db;
-    openRepoManager();
-
-    logDebug("Beginning integration of {}", change);
-    try {
-      ChangeSet cs = mergeSuperSet.setMergeOpRepoManager(orm).completeChangeSet(db, change, caller);
-      checkState(
-          cs.ids().contains(change.getId()), "change %s missing from %s", change.getId(), cs);
-      if (cs.furtherHiddenChanges()) {
-        throw new AuthException(
-            "A change to be submitted with " + change.getId() + " is not visible");
-      }
-      logDebug("Calculated to merge {}", cs);
-
-      // Count cross-project submissions outside of the retry loop. The chance of a single project
-      // failing increases with the number of projects, so the failure count would be inflated if
-      // this metric were incremented inside of integrateIntoHistory.
-      int projects = cs.projects().size();
-      if (projects > 1) {
-        topicMetrics.topicSubmissions.increment();
-      }
-
-      RetryTracker retryTracker = new RetryTracker();
-      retryHelper.execute(
-          updateFactory -> {
-            long attempt = retryTracker.lastAttemptNumber + 1;
-            boolean isRetry = attempt > 1;
-            if (isRetry) {
-              logDebug("Retrying, attempt #{}; skipping merged changes", attempt);
-              this.ts = TimeUtil.nowTs();
-              openRepoManager();
-            }
-            this.commitStatus = new CommitStatus(cs, isRetry);
-            MergeSuperSet.reloadChanges(cs);
-            if (checkSubmitRules) {
-              logDebug("Checking submit rules and state");
-              checkSubmitRulesAndState(cs, isRetry);
-            } else {
-              logDebug("Bypassing submit rules");
-              bypassSubmitRules(cs, isRetry);
-            }
-            try {
-              integrateIntoHistory(cs);
-            } catch (IntegrationException e) {
-              logError("Error from integrateIntoHistory", e);
-              throw new ResourceConflictException(e.getMessage(), e);
-            }
-            return null;
-          },
-          RetryHelper.options()
-              .listener(retryTracker)
-              // Up to the entire submit operation is retried, including possibly many projects.
-              // Multiply the timeout by the number of projects we're actually attempting to submit.
-              .timeout(retryHelper.getDefaultTimeout().multipliedBy(cs.projects().size()))
-              .build());
-
-      if (projects > 1) {
-        topicMetrics.topicSubmissionsCompleted.increment();
-      }
-    } catch (IOException e) {
-      // Anything before the merge attempt is an error
-      throw new OrmException(e);
-    }
-  }
-
-  private void openRepoManager() {
-    if (orm != null) {
-      orm.close();
-    }
-    orm = ormProvider.get();
-    orm.setContext(db, ts, caller, submissionId);
-  }
-
-  private class RetryTracker implements RetryListener {
-    long lastAttemptNumber;
-
-    @Override
-    public <V> void onRetry(Attempt<V> attempt) {
-      lastAttemptNumber = attempt.getAttemptNumber();
-    }
-  }
-
-  @Singleton
-  private static class TopicMetrics {
-    final Counter0 topicSubmissions;
-    final Counter0 topicSubmissionsCompleted;
-
-    @Inject
-    TopicMetrics(MetricMaker metrics) {
-      topicSubmissions =
-          metrics.newCounter(
-              "topic/cross_project_submit",
-              new Description("Attempts at cross project topic submission").setRate());
-      topicSubmissionsCompleted =
-          metrics.newCounter(
-              "topic/cross_project_submit_completed",
-              new Description("Cross project topic submissions that concluded successfully")
-                  .setRate());
-    }
-  }
-
-  private void integrateIntoHistory(ChangeSet cs)
-      throws IntegrationException, RestApiException, UpdateException {
-    checkArgument(!cs.furtherHiddenChanges(), "cannot integrate hidden changes into history");
-    logDebug("Beginning merge attempt on {}", cs);
-    Map<Branch.NameKey, BranchBatch> toSubmit = new HashMap<>();
-
-    ListMultimap<Branch.NameKey, ChangeData> cbb;
-    try {
-      cbb = cs.changesByBranch();
-    } catch (OrmException e) {
-      throw new IntegrationException("Error reading changes to submit", e);
-    }
-    Set<Branch.NameKey> branches = cbb.keySet();
-
-    for (Branch.NameKey branch : branches) {
-      OpenRepo or = openRepo(branch.getParentKey());
-      if (or != null) {
-        toSubmit.put(branch, validateChangeList(or, cbb.get(branch)));
-      }
-    }
-
-    // Done checks that don't involve running submit strategies.
-    commitStatus.maybeFailVerbose();
-
-    try {
-      SubmoduleOp submoduleOp = subOpFactory.create(branches, orm);
-      List<SubmitStrategy> strategies = getSubmitStrategies(toSubmit, submoduleOp, dryrun);
-      this.allProjects = submoduleOp.getProjectsInOrder();
-      batchUpdateFactory.execute(
-          orm.batchUpdates(allProjects),
-          new SubmitStrategyListener(submitInput, strategies, commitStatus),
-          submissionId,
-          dryrun);
-    } catch (NoSuchProjectException e) {
-      throw new ResourceNotFoundException(e.getMessage());
-    } catch (IOException | SubmoduleException e) {
-      throw new IntegrationException(e);
-    } catch (UpdateException e) {
-      if (e.getCause() instanceof LockFailureException) {
-        // Lock failures are a special case: RetryHelper depends on this specific causal chain in
-        // order to trigger a retry. The downside of throwing here is we will not get the nicer
-        // error message constructed below, in the case where this is the final attempt and the
-        // operation is not retried further. This is not a huge downside, and is hopefully so rare
-        // as to be unnoticeable, assuming RetryHelper is retrying sufficiently.
-        throw e;
-      }
-
-      // BatchUpdate may have inadvertently wrapped an IntegrationException
-      // thrown by some legacy SubmitStrategyOp code that intended the error
-      // message to be user-visible. Copy the message from the wrapped
-      // exception.
-      //
-      // If you happen across one of these, the correct fix is to convert the
-      // inner IntegrationException to a ResourceConflictException.
-      String msg;
-      if (e.getCause() instanceof IntegrationException) {
-        msg = e.getCause().getMessage();
-      } else {
-        msg = genericMergeError(cs);
-      }
-      throw new IntegrationException(msg, e);
-    }
-  }
-
-  public Set<Project.NameKey> getAllProjects() {
-    return allProjects;
-  }
-
-  public MergeOpRepoManager getMergeOpRepoManager() {
-    return orm;
-  }
-
-  private List<SubmitStrategy> getSubmitStrategies(
-      Map<Branch.NameKey, BranchBatch> toSubmit, SubmoduleOp submoduleOp, boolean dryrun)
-      throws IntegrationException, NoSuchProjectException, IOException {
-    List<SubmitStrategy> strategies = new ArrayList<>();
-    Set<Branch.NameKey> allBranches = submoduleOp.getBranchesInOrder();
-    Set<CodeReviewCommit> allCommits =
-        toSubmit.values().stream().map(BranchBatch::commits).flatMap(Set::stream).collect(toSet());
-    for (Branch.NameKey branch : allBranches) {
-      OpenRepo or = orm.getRepo(branch.getParentKey());
-      if (toSubmit.containsKey(branch)) {
-        BranchBatch submitting = toSubmit.get(branch);
-        OpenBranch ob = or.getBranch(branch);
-        checkNotNull(
-            submitting.submitType(),
-            "null submit type for %s; expected to previously fail fast",
-            submitting);
-        Set<CodeReviewCommit> commitsToSubmit = submitting.commits();
-        ob.mergeTip = new MergeTip(ob.oldTip, commitsToSubmit);
-        SubmitStrategy strategy =
-            submitStrategyFactory.create(
-                submitting.submitType(),
-                db,
-                or.rw,
-                or.canMergeFlag,
-                getAlreadyAccepted(or, ob.oldTip),
-                allCommits,
-                branch,
-                caller,
-                ob.mergeTip,
-                commitStatus,
-                submissionId,
-                submitInput,
-                accountsToNotify,
-                submoduleOp,
-                dryrun);
-        strategies.add(strategy);
-        strategy.addOps(or.getUpdate(), commitsToSubmit);
-        if (submitting.submitType().equals(SubmitType.FAST_FORWARD_ONLY)
-            && submoduleOp.hasSubscription(branch)) {
-          submoduleOp.addOp(or.getUpdate(), branch);
-        }
-      } else {
-        // no open change for this branch
-        // add submodule triggered op into BatchUpdate
-        submoduleOp.addOp(or.getUpdate(), branch);
-      }
-    }
-    return strategies;
-  }
-
-  private Set<RevCommit> getAlreadyAccepted(OpenRepo or, CodeReviewCommit branchTip)
-      throws IntegrationException {
-    Set<RevCommit> alreadyAccepted = new HashSet<>();
-
-    if (branchTip != null) {
-      alreadyAccepted.add(branchTip);
-    }
-
-    try {
-      for (Ref r : or.repo.getRefDatabase().getRefs(Constants.R_HEADS).values()) {
-        try {
-          CodeReviewCommit aac = or.rw.parseCommit(r.getObjectId());
-          if (!commitStatus.commits.values().contains(aac)) {
-            alreadyAccepted.add(aac);
-          }
-        } catch (IncorrectObjectTypeException iote) {
-          // Not a commit? Skip over it.
-        }
-      }
-    } catch (IOException e) {
-      throw new IntegrationException("Failed to determine already accepted commits.", e);
-    }
-
-    logDebug("Found {} existing heads", alreadyAccepted.size());
-    return alreadyAccepted;
-  }
-
-  @AutoValue
-  abstract static class BranchBatch {
-    @Nullable
-    abstract SubmitType submitType();
-
-    abstract Set<CodeReviewCommit> commits();
-  }
-
-  private BranchBatch validateChangeList(OpenRepo or, Collection<ChangeData> submitted)
-      throws IntegrationException {
-    logDebug("Validating {} changes", submitted.size());
-    Set<CodeReviewCommit> toSubmit = new LinkedHashSet<>(submitted.size());
-    SetMultimap<ObjectId, PatchSet.Id> revisions = getRevisions(or, submitted);
-
-    SubmitType submitType = null;
-    ChangeData choseSubmitTypeFrom = null;
-    for (ChangeData cd : submitted) {
-      Change.Id changeId = cd.getId();
-      ChangeNotes notes;
-      Change chg;
-      SubmitType st;
-      try {
-        notes = cd.notes();
-        chg = cd.change();
-        st = getSubmitType(cd);
-      } catch (OrmException e) {
-        commitStatus.logProblem(changeId, e);
-        continue;
-      }
-
-      if (st == null) {
-        commitStatus.logProblem(changeId, "No submit type for change");
-        continue;
-      }
-      if (submitType == null) {
-        submitType = st;
-        choseSubmitTypeFrom = cd;
-      } else if (st != submitType) {
-        commitStatus.problem(
-            changeId,
-            String.format(
-                "Change has submit type %s, but previously chose submit type %s "
-                    + "from change %s in the same batch",
-                st, submitType, choseSubmitTypeFrom.getId()));
-        continue;
-      }
-      if (chg.currentPatchSetId() == null) {
-        String msg = "Missing current patch set on change";
-        logError(msg + " " + changeId);
-        commitStatus.problem(changeId, msg);
-        continue;
-      }
-
-      PatchSet ps;
-      Branch.NameKey destBranch = chg.getDest();
-      try {
-        ps = cd.currentPatchSet();
-      } catch (OrmException e) {
-        commitStatus.logProblem(changeId, e);
-        continue;
-      }
-      if (ps == null || ps.getRevision() == null || ps.getRevision().get() == null) {
-        commitStatus.logProblem(changeId, "Missing patch set or revision on change");
-        continue;
-      }
-
-      String idstr = ps.getRevision().get();
-      ObjectId id;
-      try {
-        id = ObjectId.fromString(idstr);
-      } catch (IllegalArgumentException e) {
-        commitStatus.logProblem(changeId, e);
-        continue;
-      }
-
-      if (!revisions.containsEntry(id, ps.getId())) {
-        // TODO this is actually an error, the branch is gone but we
-        // want to merge the issue. We can't safely do that if the
-        // tip is not reachable.
-        //
-        commitStatus.logProblem(
-            changeId,
-            "Revision "
-                + idstr
-                + " of patch set "
-                + ps.getPatchSetId()
-                + " does not match "
-                + ps.getId().toRefName()
-                + " for change");
-        continue;
-      }
-
-      CodeReviewCommit commit;
-      try {
-        commit = or.rw.parseCommit(id);
-      } catch (IOException e) {
-        commitStatus.logProblem(changeId, e);
-        continue;
-      }
-
-      commit.setNotes(notes);
-      commit.setPatchsetId(ps.getId());
-      commitStatus.put(commit);
-
-      MergeValidators mergeValidators = mergeValidatorsFactory.create();
-      try {
-        mergeValidators.validatePreMerge(
-            or.repo, commit, or.project, destBranch, ps.getId(), caller);
-      } catch (MergeValidationException mve) {
-        commitStatus.problem(changeId, mve.getMessage());
-        continue;
-      }
-      commit.add(or.canMergeFlag);
-      toSubmit.add(commit);
-    }
-    logDebug("Submitting on this run: {}", toSubmit);
-    return new AutoValue_MergeOp_BranchBatch(submitType, toSubmit);
-  }
-
-  private SetMultimap<ObjectId, PatchSet.Id> getRevisions(OpenRepo or, Collection<ChangeData> cds)
-      throws IntegrationException {
-    try {
-      List<String> refNames = new ArrayList<>(cds.size());
-      for (ChangeData cd : cds) {
-        Change c = cd.change();
-        if (c != null) {
-          refNames.add(c.currentPatchSetId().toRefName());
-        }
-      }
-      SetMultimap<ObjectId, PatchSet.Id> revisions =
-          MultimapBuilder.hashKeys(cds.size()).hashSetValues(1).build();
-      for (Map.Entry<String, Ref> e :
-          or.repo
-              .getRefDatabase()
-              .exactRef(refNames.toArray(new String[refNames.size()]))
-              .entrySet()) {
-        revisions.put(e.getValue().getObjectId(), PatchSet.Id.fromRef(e.getKey()));
-      }
-      return revisions;
-    } catch (IOException | OrmException e) {
-      throw new IntegrationException("Failed to validate changes", e);
-    }
-  }
-
-  private SubmitType getSubmitType(ChangeData cd) throws OrmException {
-    SubmitTypeRecord str = cd.submitTypeRecord();
-    return str.isOk() ? str.type : null;
-  }
-
-  private OpenRepo openRepo(Project.NameKey project) throws IntegrationException {
-    try {
-      return orm.getRepo(project);
-    } catch (NoSuchProjectException e) {
-      logWarn("Project " + project + " no longer exists, abandoning open changes.");
-      abandonAllOpenChangeForDeletedProject(project);
-    } catch (IOException e) {
-      throw new IntegrationException("Error opening project " + project, e);
-    }
-    return null;
-  }
-
-  private void abandonAllOpenChangeForDeletedProject(Project.NameKey destProject) {
-    try {
-      for (ChangeData cd : queryProvider.get().byProjectOpen(destProject)) {
-        try (BatchUpdate bu =
-            batchUpdateFactory.create(db, destProject, internalUserFactory.create(), ts)) {
-          bu.setRequestId(submissionId);
-          bu.addOp(
-              cd.getId(),
-              new BatchUpdateOp() {
-                @Override
-                public boolean updateChange(ChangeContext ctx) throws OrmException {
-                  Change change = ctx.getChange();
-                  if (!change.getStatus().isOpen()) {
-                    return false;
-                  }
-
-                  change.setStatus(Change.Status.ABANDONED);
-
-                  ChangeMessage msg =
-                      ChangeMessagesUtil.newMessage(
-                          change.currentPatchSetId(),
-                          internalUserFactory.create(),
-                          change.getLastUpdatedOn(),
-                          ChangeMessagesUtil.TAG_MERGED,
-                          "Project was deleted.");
-                  cmUtil.addChangeMessage(
-                      ctx.getDb(), ctx.getUpdate(change.currentPatchSetId()), msg);
-
-                  return true;
-                }
-              });
-          try {
-            bu.execute();
-          } catch (UpdateException | RestApiException e) {
-            logWarn("Cannot abandon changes for deleted project " + destProject, e);
-          }
-        }
-      }
-    } catch (OrmException e) {
-      logWarn("Cannot abandon changes for deleted project " + destProject, e);
-    }
-  }
-
-  private String genericMergeError(ChangeSet cs) {
-    int c = cs.size();
-    if (c == 1) {
-      return "Error submitting change";
-    }
-    int p = cs.projects().size();
-    if (p == 1) {
-      // Fused updates: it's correct to say that none of the n changes were submitted.
-      return "Error submitting " + c + " changes";
-    }
-    // Multiple projects involved, but we don't know at this point what failed. At least give the
-    // user a heads up that some changes may be unsubmitted, even if the change screen they land on
-    // after the error message says that this particular change was submitted.
-    return "Error submitting some of the "
-        + c
-        + " changes to one or more of the "
-        + p
-        + " projects involved; some projects may have submitted successfully, but others may have"
-        + " failed";
-  }
-
-  private void logDebug(String msg, Object... args) {
-    if (log.isDebugEnabled()) {
-      log.debug(submissionId + msg, args);
-    }
-  }
-
-  private void logWarn(String msg, Throwable t) {
-    if (log.isWarnEnabled()) {
-      log.warn(submissionId + msg, t);
-    }
-  }
-
-  private void logWarn(String msg) {
-    if (log.isWarnEnabled()) {
-      log.warn(submissionId + msg);
-    }
-  }
-
-  private void logError(String msg, Throwable t) {
-    if (log.isErrorEnabled()) {
-      if (t != null) {
-        log.error(submissionId + msg, t);
-      } else {
-        log.error(submissionId + msg);
-      }
-    }
-  }
-
-  private void logError(String msg) {
-    logError(msg, null);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOpRepoManager.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOpRepoManager.java
deleted file mode 100644
index 29b2548..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOpRepoManager.java
+++ /dev/null
@@ -1,223 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.git;
-
-import static com.google.common.base.Preconditions.checkState;
-
-import com.google.common.collect.Maps;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
-import com.google.gerrit.server.git.validators.OnSubmitValidators;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.util.RequestId;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevFlag;
-import org.eclipse.jgit.revwalk.RevSort;
-
-/**
- * This is a helper class for MergeOp and not intended for general use.
- *
- * <p>Some database backends require to open a repository just once within a transaction of a
- * submission, this caches open repositories to satisfy that requirement.
- */
-public class MergeOpRepoManager implements AutoCloseable {
-  public class OpenRepo {
-    final Repository repo;
-    final CodeReviewRevWalk rw;
-    final RevFlag canMergeFlag;
-    final ObjectInserter ins;
-
-    final ProjectState project;
-    BatchUpdate update;
-
-    private final ObjectReader reader;
-    private final Map<Branch.NameKey, OpenBranch> branches;
-
-    private OpenRepo(Repository repo, ProjectState project) {
-      this.repo = repo;
-      this.project = project;
-      ins = repo.newObjectInserter();
-      reader = ins.newReader();
-      rw = CodeReviewCommit.newRevWalk(reader);
-      rw.sort(RevSort.TOPO);
-      rw.sort(RevSort.COMMIT_TIME_DESC, true);
-      rw.setRetainBody(false);
-      canMergeFlag = rw.newFlag("CAN_MERGE");
-      rw.retainOnReset(canMergeFlag);
-
-      branches = Maps.newHashMapWithExpectedSize(1);
-    }
-
-    OpenBranch getBranch(Branch.NameKey branch) throws IntegrationException {
-      OpenBranch ob = branches.get(branch);
-      if (ob == null) {
-        ob = new OpenBranch(this, branch);
-        branches.put(branch, ob);
-      }
-      return ob;
-    }
-
-    public Repository getRepo() {
-      return repo;
-    }
-
-    Project.NameKey getProjectName() {
-      return project.getNameKey();
-    }
-
-    public CodeReviewRevWalk getCodeReviewRevWalk() {
-      return rw;
-    }
-
-    public BatchUpdate getUpdate() {
-      checkState(db != null, "call setContext before getUpdate");
-      if (update == null) {
-        update =
-            batchUpdateFactory
-                .create(db, getProjectName(), caller, ts)
-                .setRepository(repo, rw, ins)
-                .setRequestId(submissionId)
-                .setOnSubmitValidators(onSubmitValidatorsFactory.create());
-      }
-      return update;
-    }
-
-    private void close() {
-      if (update != null) {
-        update.close();
-      }
-      rw.close();
-      reader.close();
-      ins.close();
-      repo.close();
-    }
-  }
-
-  public static class OpenBranch {
-    final RefUpdate update;
-    final CodeReviewCommit oldTip;
-    MergeTip mergeTip;
-
-    OpenBranch(OpenRepo or, Branch.NameKey name) throws IntegrationException {
-      try {
-        update = or.repo.updateRef(name.get());
-        if (update.getOldObjectId() != null) {
-          oldTip = or.rw.parseCommit(update.getOldObjectId());
-        } else if (Objects.equals(or.repo.getFullBranch(), name.get())
-            || Objects.equals(RefNames.REFS_CONFIG, name.get())) {
-          oldTip = null;
-          update.setExpectedOldObjectId(ObjectId.zeroId());
-        } else {
-          throw new IntegrationException(
-              "The destination branch " + name + " does not exist anymore.");
-        }
-      } catch (IOException e) {
-        throw new IntegrationException("Cannot open branch " + name, e);
-      }
-    }
-  }
-
-  private final Map<Project.NameKey, OpenRepo> openRepos;
-  private final BatchUpdate.Factory batchUpdateFactory;
-  private final OnSubmitValidators.Factory onSubmitValidatorsFactory;
-  private final GitRepositoryManager repoManager;
-  private final ProjectCache projectCache;
-
-  private ReviewDb db;
-  private Timestamp ts;
-  private IdentifiedUser caller;
-  private RequestId submissionId;
-
-  @Inject
-  MergeOpRepoManager(
-      GitRepositoryManager repoManager,
-      ProjectCache projectCache,
-      BatchUpdate.Factory batchUpdateFactory,
-      OnSubmitValidators.Factory onSubmitValidatorsFactory) {
-    this.repoManager = repoManager;
-    this.projectCache = projectCache;
-    this.batchUpdateFactory = batchUpdateFactory;
-    this.onSubmitValidatorsFactory = onSubmitValidatorsFactory;
-
-    openRepos = new HashMap<>();
-  }
-
-  public void setContext(ReviewDb db, Timestamp ts, IdentifiedUser caller, RequestId submissionId) {
-    this.db = db;
-    this.ts = ts;
-    this.caller = caller;
-    this.submissionId = submissionId;
-  }
-
-  public RequestId getSubmissionId() {
-    return submissionId;
-  }
-
-  public OpenRepo getRepo(Project.NameKey project) throws NoSuchProjectException, IOException {
-    if (openRepos.containsKey(project)) {
-      return openRepos.get(project);
-    }
-
-    ProjectState projectState = projectCache.get(project);
-    if (projectState == null) {
-      throw new NoSuchProjectException(project);
-    }
-    try {
-      OpenRepo or = new OpenRepo(repoManager.openRepository(project), projectState);
-      openRepos.put(project, or);
-      return or;
-    } catch (RepositoryNotFoundException e) {
-      throw new NoSuchProjectException(project, e);
-    }
-  }
-
-  public List<BatchUpdate> batchUpdates(Collection<Project.NameKey> projects)
-      throws NoSuchProjectException, IOException {
-    List<BatchUpdate> updates = new ArrayList<>(projects.size());
-    for (Project.NameKey project : projects) {
-      updates.add(getRepo(project).getUpdate().setRefLogMessage("merged"));
-    }
-    return updates;
-  }
-
-  @Override
-  public void close() {
-    for (OpenRepo repo : openRepos.values()) {
-      repo.close();
-    }
-    openRepos.clear();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeSorter.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeSorter.java
deleted file mode 100644
index d547d7f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeSorter.java
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.server.git;
-
-import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
-import com.google.gerrit.server.git.strategy.CommitMergeStatus;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevCommitList;
-import org.eclipse.jgit.revwalk.RevFlag;
-
-public class MergeSorter {
-  private final CodeReviewRevWalk rw;
-  private final RevFlag canMergeFlag;
-  private final Set<RevCommit> accepted;
-  private final Set<CodeReviewCommit> incoming;
-
-  public MergeSorter(
-      CodeReviewRevWalk rw,
-      Set<RevCommit> alreadyAccepted,
-      RevFlag canMergeFlag,
-      Set<CodeReviewCommit> incoming) {
-    this.rw = rw;
-    this.canMergeFlag = canMergeFlag;
-    this.accepted = alreadyAccepted;
-    this.incoming = incoming;
-  }
-
-  Collection<CodeReviewCommit> sort(Collection<CodeReviewCommit> toMerge) throws IOException {
-    final Set<CodeReviewCommit> heads = new HashSet<>();
-    final Set<CodeReviewCommit> sort = new HashSet<>(toMerge);
-    while (!sort.isEmpty()) {
-      final CodeReviewCommit n = removeOne(sort);
-
-      rw.resetRetain(canMergeFlag);
-      rw.markStart(n);
-      for (RevCommit c : accepted) {
-        rw.markUninteresting(c);
-      }
-
-      CodeReviewCommit c;
-      RevCommitList<RevCommit> contents = new RevCommitList<>();
-      while ((c = rw.next()) != null) {
-        if (!c.has(canMergeFlag) || !incoming.contains(c)) {
-          // We cannot merge n as it would bring something we
-          // aren't permitted to merge at this time. Drop n.
-          //
-          n.setStatusCode(CommitMergeStatus.MISSING_DEPENDENCY);
-          break;
-        }
-        contents.add(c);
-      }
-
-      if (n.getStatusCode() == CommitMergeStatus.MISSING_DEPENDENCY) {
-        continue;
-      }
-
-      // Anything reachable through us is better merged by just
-      // merging us directly. So prune our ancestors out and let
-      // us merge instead.
-      //
-      sort.removeAll(contents);
-      heads.removeAll(contents);
-      heads.add(n);
-    }
-    return heads;
-  }
-
-  private static <T> T removeOne(Collection<T> c) {
-    final Iterator<T> i = c.iterator();
-    final T r = i.next();
-    i.remove();
-    return r;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeSuperSet.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeSuperSet.java
deleted file mode 100644
index 58c183b..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeSuperSet.java
+++ /dev/null
@@ -1,420 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.git;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableListMultimap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.common.data.SubmitTypeRecord;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.change.Submit;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.git.MergeOpRepoManager.OpenRepo;
-import com.google.gerrit.server.index.change.ChangeField;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.SubmitRuleEvaluator;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.InternalChangeQuery;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevSort;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Calculates the minimal superset of changes required to be merged.
- *
- * <p>This includes all parents between a change and the tip of its target branch for the
- * merging/rebasing submit strategies. For the cherry-pick strategy no additional changes are
- * included.
- *
- * <p>If change.submitWholeTopic is enabled, also all changes of the topic and their parents are
- * included.
- */
-public class MergeSuperSet {
-  private static final Logger log = LoggerFactory.getLogger(MergeSuperSet.class);
-
-  public static void reloadChanges(ChangeSet cs) throws OrmException {
-    // Clear exactly the fields requested by query() below.
-    for (ChangeData cd : cs.changes()) {
-      cd.reloadChange();
-      cd.setPatchSets(null);
-      cd.setMergeable(null);
-    }
-  }
-
-  @AutoValue
-  abstract static class QueryKey {
-    private static QueryKey create(Branch.NameKey branch, Iterable<String> hashes) {
-      return new AutoValue_MergeSuperSet_QueryKey(branch, ImmutableSet.copyOf(hashes));
-    }
-
-    abstract Branch.NameKey branch();
-
-    abstract ImmutableSet<String> hashes();
-  }
-
-  private final ChangeData.Factory changeDataFactory;
-  private final Provider<InternalChangeQuery> queryProvider;
-  private final Provider<MergeOpRepoManager> repoManagerProvider;
-  private final PermissionBackend permissionBackend;
-  private final Config cfg;
-  private final Map<QueryKey, List<ChangeData>> queryCache;
-  private final Map<Branch.NameKey, Optional<RevCommit>> heads;
-  private final SubmitRuleEvaluator.Factory submitRuleEvaluatorFactory;
-
-  private MergeOpRepoManager orm;
-  private boolean closeOrm;
-
-  @Inject
-  MergeSuperSet(
-      @GerritServerConfig Config cfg,
-      ChangeData.Factory changeDataFactory,
-      Provider<InternalChangeQuery> queryProvider,
-      Provider<MergeOpRepoManager> repoManagerProvider,
-      PermissionBackend permissionBackend,
-      SubmitRuleEvaluator.Factory submitRuleEvaluatorFactory) {
-    this.cfg = cfg;
-    this.changeDataFactory = changeDataFactory;
-    this.queryProvider = queryProvider;
-    this.repoManagerProvider = repoManagerProvider;
-    this.permissionBackend = permissionBackend;
-    this.submitRuleEvaluatorFactory = submitRuleEvaluatorFactory;
-    queryCache = new HashMap<>();
-    heads = new HashMap<>();
-  }
-
-  public MergeSuperSet setMergeOpRepoManager(MergeOpRepoManager orm) {
-    checkState(this.orm == null);
-    this.orm = checkNotNull(orm);
-    closeOrm = false;
-    return this;
-  }
-
-  public ChangeSet completeChangeSet(ReviewDb db, Change change, CurrentUser user)
-      throws IOException, OrmException, PermissionBackendException {
-    try {
-      ChangeData cd = changeDataFactory.create(db, change.getProject(), change.getId());
-      ChangeSet cs =
-          new ChangeSet(
-              cd, permissionBackend.user(user).change(cd).database(db).test(ChangePermission.READ));
-      if (Submit.wholeTopicEnabled(cfg)) {
-        return completeChangeSetIncludingTopics(db, cs, user);
-      }
-      return completeChangeSetWithoutTopic(db, cs, user);
-    } finally {
-      if (closeOrm && orm != null) {
-        orm.close();
-        orm = null;
-      }
-    }
-  }
-
-  private SubmitType submitType(CurrentUser user, ChangeData cd, PatchSet ps) throws OrmException {
-    // Submit type prolog rules mean that the submit type can depend on the
-    // submitting user and the content of the change.
-    //
-    // If the current user can see the change, run that evaluation to get a
-    // preview of what would happen on submit.  If the current user can't see
-    // the change, instead of guessing who would do the submitting, rely on the
-    // project configuration and ignore the prolog rule.  If the prolog rule
-    // doesn't match that, we may pick the wrong submit type and produce a
-    // misleading (but still nonzero) count of the non visible changes that
-    // would be submitted together with the visible ones.
-    SubmitTypeRecord str =
-        ps == cd.currentPatchSet()
-            ? cd.submitTypeRecord()
-            : submitRuleEvaluatorFactory.create(user, cd).setPatchSet(ps).getSubmitType();
-    if (!str.isOk()) {
-      logErrorAndThrow("Failed to get submit type for " + cd.getId() + ": " + str.errorMessage);
-    }
-    return str.type;
-  }
-
-  private static ImmutableListMultimap<Branch.NameKey, ChangeData> byBranch(
-      Iterable<ChangeData> changes) throws OrmException {
-    ImmutableListMultimap.Builder<Branch.NameKey, ChangeData> builder =
-        ImmutableListMultimap.builder();
-    for (ChangeData cd : changes) {
-      builder.put(cd.change().getDest(), cd);
-    }
-    return builder.build();
-  }
-
-  private Set<String> walkChangesByHashes(
-      Collection<RevCommit> sourceCommits, Set<String> ignoreHashes, OpenRepo or, Branch.NameKey b)
-      throws IOException {
-    Set<String> destHashes = new HashSet<>();
-    or.rw.reset();
-    markHeadUninteresting(or, b);
-    for (RevCommit c : sourceCommits) {
-      String name = c.name();
-      if (ignoreHashes.contains(name)) {
-        continue;
-      }
-      destHashes.add(name);
-      or.rw.markStart(c);
-    }
-    for (RevCommit c : or.rw) {
-      String name = c.name();
-      if (ignoreHashes.contains(name)) {
-        continue;
-      }
-      destHashes.add(name);
-    }
-
-    return destHashes;
-  }
-
-  private ChangeSet completeChangeSetWithoutTopic(ReviewDb db, ChangeSet changes, CurrentUser user)
-      throws IOException, OrmException, PermissionBackendException {
-    Collection<ChangeData> visibleChanges = new ArrayList<>();
-    Collection<ChangeData> nonVisibleChanges = new ArrayList<>();
-
-    // For each target branch we run a separate rev walk to find open changes
-    // reachable from changes already in the merge super set.
-    ImmutableListMultimap<Branch.NameKey, ChangeData> bc =
-        byBranch(Iterables.concat(changes.changes(), changes.nonVisibleChanges()));
-    for (Branch.NameKey b : bc.keySet()) {
-      OpenRepo or = getRepo(b.getParentKey());
-      List<RevCommit> visibleCommits = new ArrayList<>();
-      List<RevCommit> nonVisibleCommits = new ArrayList<>();
-      for (ChangeData cd : bc.get(b)) {
-        boolean visible = changes.ids().contains(cd.getId());
-        if (visible && !canRead(db, user, cd)) {
-          // We thought the change was visible, but it isn't.
-          // This can happen if the ACL changes during the
-          // completeChangeSet computation, for example.
-          visible = false;
-        }
-
-        // Pick a revision to use for traversal.  If any of the patch sets
-        // is visible, we use the most recent one.  Otherwise, use the current
-        // patch set.
-        PatchSet ps = cd.currentPatchSet();
-        if (submitType(user, cd, ps) == SubmitType.CHERRY_PICK) {
-          if (visible) {
-            visibleChanges.add(cd);
-          } else {
-            nonVisibleChanges.add(cd);
-          }
-
-          continue;
-        }
-
-        // Get the underlying git commit object
-        String objIdStr = ps.getRevision().get();
-        RevCommit commit = or.rw.parseCommit(ObjectId.fromString(objIdStr));
-
-        // Always include the input, even if merged. This allows
-        // SubmitStrategyOp to correct the situation later, assuming it gets
-        // returned by byCommitsOnBranchNotMerged below.
-        if (visible) {
-          visibleCommits.add(commit);
-        } else {
-          nonVisibleCommits.add(commit);
-        }
-      }
-
-      Set<String> visibleHashes =
-          walkChangesByHashes(visibleCommits, Collections.emptySet(), or, b);
-      Iterables.addAll(visibleChanges, byCommitsOnBranchNotMerged(or, db, b, visibleHashes));
-
-      Set<String> nonVisibleHashes = walkChangesByHashes(nonVisibleCommits, visibleHashes, or, b);
-      Iterables.addAll(nonVisibleChanges, byCommitsOnBranchNotMerged(or, db, b, nonVisibleHashes));
-    }
-
-    return new ChangeSet(visibleChanges, nonVisibleChanges);
-  }
-
-  private OpenRepo getRepo(Project.NameKey project) throws IOException {
-    if (orm == null) {
-      orm = repoManagerProvider.get();
-      closeOrm = true;
-    }
-    try {
-      OpenRepo or = orm.getRepo(project);
-      checkState(or.rw.hasRevSort(RevSort.TOPO));
-      return or;
-    } catch (NoSuchProjectException e) {
-      throw new IOException(e);
-    }
-  }
-
-  private void markHeadUninteresting(OpenRepo or, Branch.NameKey b) throws IOException {
-    Optional<RevCommit> head = heads.get(b);
-    if (head == null) {
-      Ref ref = or.repo.getRefDatabase().exactRef(b.get());
-      head = ref != null ? Optional.of(or.rw.parseCommit(ref.getObjectId())) : Optional.empty();
-      heads.put(b, head);
-    }
-    if (head.isPresent()) {
-      or.rw.markUninteresting(head.get());
-    }
-  }
-
-  private List<ChangeData> byCommitsOnBranchNotMerged(
-      OpenRepo or, ReviewDb db, Branch.NameKey branch, Set<String> hashes)
-      throws OrmException, IOException {
-    if (hashes.isEmpty()) {
-      return ImmutableList.of();
-    }
-    QueryKey k = QueryKey.create(branch, hashes);
-    List<ChangeData> cached = queryCache.get(k);
-    if (cached != null) {
-      return cached;
-    }
-
-    List<ChangeData> result = new ArrayList<>();
-    Iterable<ChangeData> destChanges =
-        query().byCommitsOnBranchNotMerged(or.repo, db, branch, hashes);
-    for (ChangeData chd : destChanges) {
-      result.add(chd);
-    }
-    queryCache.put(k, result);
-    return result;
-  }
-
-  /**
-   * Completes {@code cs} with any additional changes from its topics
-   *
-   * <p>{@link #completeChangeSetIncludingTopics} calls this repeatedly, alternating with {@link
-   * #completeChangeSetWithoutTopic}, to discover what additional changes should be submitted with a
-   * change until the set stops growing.
-   *
-   * <p>{@code topicsSeen} and {@code visibleTopicsSeen} keep track of topics already explored to
-   * avoid wasted work.
-   *
-   * @return the resulting larger {@link ChangeSet}
-   */
-  private ChangeSet topicClosure(
-      ReviewDb db,
-      ChangeSet cs,
-      CurrentUser user,
-      Set<String> topicsSeen,
-      Set<String> visibleTopicsSeen)
-      throws OrmException, PermissionBackendException {
-    List<ChangeData> visibleChanges = new ArrayList<>();
-    List<ChangeData> nonVisibleChanges = new ArrayList<>();
-
-    for (ChangeData cd : cs.changes()) {
-      visibleChanges.add(cd);
-      String topic = cd.change().getTopic();
-      if (Strings.isNullOrEmpty(topic) || visibleTopicsSeen.contains(topic)) {
-        continue;
-      }
-      for (ChangeData topicCd : query().byTopicOpen(topic)) {
-        if (canRead(db, user, topicCd)) {
-          visibleChanges.add(topicCd);
-        } else {
-          nonVisibleChanges.add(topicCd);
-        }
-      }
-      topicsSeen.add(topic);
-      visibleTopicsSeen.add(topic);
-    }
-    for (ChangeData cd : cs.nonVisibleChanges()) {
-      nonVisibleChanges.add(cd);
-      String topic = cd.change().getTopic();
-      if (Strings.isNullOrEmpty(topic) || topicsSeen.contains(topic)) {
-        continue;
-      }
-      for (ChangeData topicCd : query().byTopicOpen(topic)) {
-        nonVisibleChanges.add(topicCd);
-      }
-      topicsSeen.add(topic);
-    }
-    return new ChangeSet(visibleChanges, nonVisibleChanges);
-  }
-
-  private ChangeSet completeChangeSetIncludingTopics(
-      ReviewDb db, ChangeSet changes, CurrentUser user)
-      throws IOException, OrmException, PermissionBackendException {
-    Set<String> topicsSeen = new HashSet<>();
-    Set<String> visibleTopicsSeen = new HashSet<>();
-    int oldSeen;
-    int seen = 0;
-
-    do {
-      oldSeen = seen;
-
-      changes = completeChangeSetWithoutTopic(db, changes, user);
-      changes = topicClosure(db, changes, user, topicsSeen, visibleTopicsSeen);
-
-      seen = topicsSeen.size() + visibleTopicsSeen.size();
-    } while (seen != oldSeen);
-    return changes;
-  }
-
-  private InternalChangeQuery query() {
-    // Request fields required for completing the ChangeSet and converting to
-    // ChangeInfo without having to touch the database or opening the repository
-    // more than necessary. This provides reasonable performance when loading
-    // the change screen; callers that care about reading the latest value of
-    // these fields should clear them explicitly using reloadChanges().
-    Set<String> fields =
-        ImmutableSet.of(
-            ChangeField.CHANGE.getName(),
-            ChangeField.PATCH_SET.getName(),
-            ChangeField.MERGEABLE.getName());
-    return queryProvider.get().setRequestedFields(fields);
-  }
-
-  private void logError(String msg) {
-    if (log.isErrorEnabled()) {
-      log.error(msg);
-    }
-  }
-
-  private void logErrorAndThrow(String msg) throws OrmException {
-    logError(msg);
-    throw new OrmException(msg);
-  }
-
-  private boolean canRead(ReviewDb db, CurrentUser user, ChangeData cd)
-      throws PermissionBackendException {
-    return permissionBackend.user(user).change(cd).database(db).test(ChangePermission.READ);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeTip.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeTip.java
deleted file mode 100644
index 3bd0f38..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeTip.java
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.git;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.gerrit.common.Nullable;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-import org.eclipse.jgit.lib.ObjectId;
-
-/**
- * Class describing a merge tip during merge operation.
- *
- * <p>The current tip of a {@link MergeTip} may be null if the merge operation is against an unborn
- * branch, and has not yet been attempted. This is distinct from a null {@link MergeTip} instance,
- * which may be used to indicate that a merge failed or another error state.
- */
-public class MergeTip {
-  private CodeReviewCommit initialTip;
-  private CodeReviewCommit branchTip;
-  private Map<ObjectId, ObjectId> mergeResults;
-
-  /**
-   * @param initialTip tip before the merge operation; may be null, indicating an unborn branch.
-   * @param toMerge list of commits to be merged in merge operation; may not be null or empty.
-   */
-  public MergeTip(@Nullable CodeReviewCommit initialTip, Collection<CodeReviewCommit> toMerge) {
-    checkNotNull(toMerge, "toMerge may not be null");
-    checkArgument(!toMerge.isEmpty(), "toMerge may not be empty");
-    this.initialTip = initialTip;
-    this.branchTip = initialTip;
-    this.mergeResults = new HashMap<>();
-    // Assume fast-forward merge until opposite is proven.
-    for (CodeReviewCommit commit : toMerge) {
-      mergeResults.put(commit.copy(), commit.copy());
-    }
-  }
-
-  /**
-   * @return the initial tip of the branch before the merge operation started; may be null,
-   *     indicating a previously unborn branch.
-   */
-  public CodeReviewCommit getInitialTip() {
-    return initialTip;
-  }
-
-  /**
-   * Moves this MergeTip to newTip and appends mergeResult.
-   *
-   * @param newTip The new tip; may not be null.
-   * @param mergedFrom The result of the merge of {@code newTip}.
-   */
-  public void moveTipTo(CodeReviewCommit newTip, ObjectId mergedFrom) {
-    checkArgument(newTip != null);
-    branchTip = newTip;
-    mergeResults.put(mergedFrom, newTip.copy());
-  }
-
-  /**
-   * The merge results of all the merges of this merge operation.
-   *
-   * @return The merge results of the merge operation as a map of SHA-1 to be merged to SHA-1 of the
-   *     merge result.
-   */
-  public Map<ObjectId, ObjectId> getMergeResults() {
-    return mergeResults;
-  }
-
-  /**
-   * @return The current tip of the current merge operation; may be null, indicating an unborn
-   *     branch.
-   */
-  @Nullable
-  public CodeReviewCommit getCurrentTip() {
-    return branchTip;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeUtil.java
deleted file mode 100644
index 9ea9dcb..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeUtil.java
+++ /dev/null
@@ -1,880 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.git;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.common.base.Joiner;
-import com.google.common.base.Strings;
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Sets;
-import com.google.gerrit.common.FooterConstants;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.MergeConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.LabelId;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSet.Id;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.config.CanonicalWebUrl;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
-import com.google.gerrit.server.git.strategy.CommitMergeStatus;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import com.google.inject.assistedinject.AssistedInject;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Objects;
-import java.util.Set;
-import org.eclipse.jgit.errors.AmbiguousObjectException;
-import org.eclipse.jgit.errors.IncorrectObjectTypeException;
-import org.eclipse.jgit.errors.LargeObjectException;
-import org.eclipse.jgit.errors.MissingObjectException;
-import org.eclipse.jgit.errors.NoMergeBaseException;
-import org.eclipse.jgit.errors.NoMergeBaseException.MergeBaseFailureReason;
-import org.eclipse.jgit.errors.RevisionSyntaxException;
-import org.eclipse.jgit.lib.AnyObjectId;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.merge.MergeStrategy;
-import org.eclipse.jgit.merge.Merger;
-import org.eclipse.jgit.merge.ResolveMerger;
-import org.eclipse.jgit.merge.ThreeWayMergeStrategy;
-import org.eclipse.jgit.merge.ThreeWayMerger;
-import org.eclipse.jgit.revwalk.FooterKey;
-import org.eclipse.jgit.revwalk.FooterLine;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevFlag;
-import org.eclipse.jgit.revwalk.RevSort;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Utility methods used during the merge process.
- *
- * <p><strong>Note:</strong> Unless otherwise specified, the methods in this class <strong>do
- * not</strong> flush {@link ObjectInserter}s. Callers that want to read back objects before
- * flushing should use {@link ObjectInserter#newReader()}. This is already the default behavior of
- * {@code BatchUpdate}.
- */
-public class MergeUtil {
-  private static final Logger log = LoggerFactory.getLogger(MergeUtil.class);
-
-  static class PluggableCommitMessageGenerator {
-    private final DynamicSet<ChangeMessageModifier> changeMessageModifiers;
-
-    @Inject
-    PluggableCommitMessageGenerator(DynamicSet<ChangeMessageModifier> changeMessageModifiers) {
-      this.changeMessageModifiers = changeMessageModifiers;
-    }
-
-    public String generate(
-        RevCommit original, RevCommit mergeTip, Branch.NameKey dest, String current) {
-      checkNotNull(original.getRawBuffer());
-      if (mergeTip != null) {
-        checkNotNull(mergeTip.getRawBuffer());
-      }
-      for (ChangeMessageModifier changeMessageModifier : changeMessageModifiers) {
-        current = changeMessageModifier.onSubmit(current, original, mergeTip, dest);
-        checkNotNull(
-            current,
-            changeMessageModifier.getClass().getName()
-                + ".OnSubmit returned null instead of new commit message");
-      }
-      return current;
-    }
-  }
-
-  private static final String R_HEADS_MASTER = Constants.R_HEADS + Constants.MASTER;
-
-  public static boolean useRecursiveMerge(Config cfg) {
-    return cfg.getBoolean("core", null, "useRecursiveMerge", true);
-  }
-
-  public static ThreeWayMergeStrategy getMergeStrategy(Config cfg) {
-    return useRecursiveMerge(cfg) ? MergeStrategy.RECURSIVE : MergeStrategy.RESOLVE;
-  }
-
-  public interface Factory {
-    MergeUtil create(ProjectState project);
-
-    MergeUtil create(ProjectState project, boolean useContentMerge);
-  }
-
-  private final Provider<ReviewDb> db;
-  private final IdentifiedUser.GenericFactory identifiedUserFactory;
-  private final Provider<String> urlProvider;
-  private final ApprovalsUtil approvalsUtil;
-  private final ProjectState project;
-  private final boolean useContentMerge;
-  private final boolean useRecursiveMerge;
-  private final PluggableCommitMessageGenerator commitMessageGenerator;
-
-  @AssistedInject
-  MergeUtil(
-      @GerritServerConfig Config serverConfig,
-      Provider<ReviewDb> db,
-      IdentifiedUser.GenericFactory identifiedUserFactory,
-      @CanonicalWebUrl @Nullable Provider<String> urlProvider,
-      ApprovalsUtil approvalsUtil,
-      PluggableCommitMessageGenerator commitMessageGenerator,
-      @Assisted ProjectState project) {
-    this(
-        serverConfig,
-        db,
-        identifiedUserFactory,
-        urlProvider,
-        approvalsUtil,
-        project,
-        commitMessageGenerator,
-        project.isUseContentMerge());
-  }
-
-  @AssistedInject
-  MergeUtil(
-      @GerritServerConfig Config serverConfig,
-      Provider<ReviewDb> db,
-      IdentifiedUser.GenericFactory identifiedUserFactory,
-      @CanonicalWebUrl @Nullable Provider<String> urlProvider,
-      ApprovalsUtil approvalsUtil,
-      @Assisted ProjectState project,
-      PluggableCommitMessageGenerator commitMessageGenerator,
-      @Assisted boolean useContentMerge) {
-    this.db = db;
-    this.identifiedUserFactory = identifiedUserFactory;
-    this.urlProvider = urlProvider;
-    this.approvalsUtil = approvalsUtil;
-    this.project = project;
-    this.useContentMerge = useContentMerge;
-    this.useRecursiveMerge = useRecursiveMerge(serverConfig);
-    this.commitMessageGenerator = commitMessageGenerator;
-  }
-
-  public CodeReviewCommit getFirstFastForward(
-      CodeReviewCommit mergeTip, RevWalk rw, List<CodeReviewCommit> toMerge)
-      throws IntegrationException {
-    for (Iterator<CodeReviewCommit> i = toMerge.iterator(); i.hasNext(); ) {
-      try {
-        final CodeReviewCommit n = i.next();
-        if (mergeTip == null || rw.isMergedInto(mergeTip, n)) {
-          i.remove();
-          return n;
-        }
-      } catch (IOException e) {
-        throw new IntegrationException("Cannot fast-forward test during merge", e);
-      }
-    }
-    return mergeTip;
-  }
-
-  public List<CodeReviewCommit> reduceToMinimalMerge(
-      MergeSorter mergeSorter, Collection<CodeReviewCommit> toSort) throws IntegrationException {
-    List<CodeReviewCommit> result = new ArrayList<>();
-    try {
-      result.addAll(mergeSorter.sort(toSort));
-    } catch (IOException e) {
-      throw new IntegrationException("Branch head sorting failed", e);
-    }
-    Collections.sort(result, CodeReviewCommit.ORDER);
-    return result;
-  }
-
-  public CodeReviewCommit createCherryPickFromCommit(
-      ObjectInserter inserter,
-      Config repoConfig,
-      RevCommit mergeTip,
-      RevCommit originalCommit,
-      PersonIdent cherryPickCommitterIdent,
-      String commitMsg,
-      CodeReviewRevWalk rw,
-      int parentIndex,
-      boolean ignoreIdenticalTree)
-      throws MissingObjectException, IncorrectObjectTypeException, IOException,
-          MergeIdenticalTreeException, MergeConflictException {
-
-    final ThreeWayMerger m = newThreeWayMerger(inserter, repoConfig);
-
-    m.setBase(originalCommit.getParent(parentIndex));
-    if (m.merge(mergeTip, originalCommit)) {
-      ObjectId tree = m.getResultTreeId();
-      if (tree.equals(mergeTip.getTree()) && !ignoreIdenticalTree) {
-        throw new MergeIdenticalTreeException("identical tree");
-      }
-
-      CommitBuilder mergeCommit = new CommitBuilder();
-      mergeCommit.setTreeId(tree);
-      mergeCommit.setParentId(mergeTip);
-      mergeCommit.setAuthor(originalCommit.getAuthorIdent());
-      mergeCommit.setCommitter(cherryPickCommitterIdent);
-      mergeCommit.setMessage(commitMsg);
-      matchAuthorToCommitterDate(project, mergeCommit);
-      return rw.parseCommit(inserter.insert(mergeCommit));
-    }
-    throw new MergeConflictException("merge conflict");
-  }
-
-  public static RevCommit createMergeCommit(
-      ObjectInserter inserter,
-      Config repoConfig,
-      RevCommit mergeTip,
-      RevCommit originalCommit,
-      String mergeStrategy,
-      PersonIdent committerIndent,
-      String commitMsg,
-      RevWalk rw)
-      throws IOException, MergeIdenticalTreeException, MergeConflictException {
-
-    if (!MergeStrategy.THEIRS.getName().equals(mergeStrategy)
-        && rw.isMergedInto(originalCommit, mergeTip)) {
-      throw new ChangeAlreadyMergedException(
-          "'" + originalCommit.getName() + "' has already been merged");
-    }
-
-    Merger m = newMerger(inserter, repoConfig, mergeStrategy);
-    if (m.merge(false, mergeTip, originalCommit)) {
-      ObjectId tree = m.getResultTreeId();
-
-      CommitBuilder mergeCommit = new CommitBuilder();
-      mergeCommit.setTreeId(tree);
-      mergeCommit.setParentIds(mergeTip, originalCommit);
-      mergeCommit.setAuthor(committerIndent);
-      mergeCommit.setCommitter(committerIndent);
-      mergeCommit.setMessage(commitMsg);
-      return rw.parseCommit(inserter.insert(mergeCommit));
-    }
-    List<String> conflicts = ImmutableList.of();
-    if (m instanceof ResolveMerger) {
-      conflicts = ((ResolveMerger) m).getUnmergedPaths();
-    }
-    throw new MergeConflictException(createConflictMessage(conflicts));
-  }
-
-  public static String createConflictMessage(List<String> conflicts) {
-    StringBuilder sb = new StringBuilder("merge conflict(s)");
-    for (String c : conflicts) {
-      sb.append('\n' + c);
-    }
-    return sb.toString();
-  }
-
-  /**
-   * Adds footers to existing commit message based on the state of the change.
-   *
-   * <p>This adds the following footers if they are missing:
-   *
-   * <ul>
-   *   <li>Reviewed-on: <i>url</i>
-   *   <li>Reviewed-by | Tested-by | <i>Other-Label-Name</i>: <i>reviewer</i>
-   *   <li>Change-Id
-   * </ul>
-   *
-   * @param n
-   * @param notes
-   * @param user
-   * @param psId
-   * @return new message
-   */
-  private String createDetailedCommitMessage(
-      RevCommit n, ChangeNotes notes, CurrentUser user, PatchSet.Id psId) {
-    Change c = notes.getChange();
-    final List<FooterLine> footers = n.getFooterLines();
-    final StringBuilder msgbuf = new StringBuilder();
-    msgbuf.append(n.getFullMessage());
-
-    if (msgbuf.length() == 0) {
-      // WTF, an empty commit message?
-      msgbuf.append("<no commit message provided>");
-    }
-    if (msgbuf.charAt(msgbuf.length() - 1) != '\n') {
-      // Missing a trailing LF? Correct it (perhaps the editor was broken).
-      msgbuf.append('\n');
-    }
-    if (footers.isEmpty()) {
-      // Doesn't end in a "Signed-off-by: ..." style line? Add another line
-      // break to start a new paragraph for the reviewed-by tag lines.
-      //
-      msgbuf.append('\n');
-    }
-
-    if (!contains(footers, FooterConstants.CHANGE_ID, c.getKey().get())) {
-      msgbuf.append(FooterConstants.CHANGE_ID.getName());
-      msgbuf.append(": ");
-      msgbuf.append(c.getKey().get());
-      msgbuf.append('\n');
-    }
-
-    final String siteUrl = urlProvider.get();
-    if (siteUrl != null) {
-      final String url = siteUrl + c.getId().get();
-      if (!contains(footers, FooterConstants.REVIEWED_ON, url)) {
-        msgbuf.append(FooterConstants.REVIEWED_ON.getName());
-        msgbuf.append(": ");
-        msgbuf.append(url);
-        msgbuf.append('\n');
-      }
-    }
-
-    PatchSetApproval submitAudit = null;
-
-    for (PatchSetApproval a : safeGetApprovals(notes, user, psId)) {
-      if (a.getValue() <= 0) {
-        // Negative votes aren't counted.
-        continue;
-      }
-
-      if (a.isLegacySubmit()) {
-        // Submit is treated specially, below (becomes committer)
-        //
-        if (submitAudit == null || a.getGranted().compareTo(submitAudit.getGranted()) > 0) {
-          submitAudit = a;
-        }
-        continue;
-      }
-
-      final Account acc = identifiedUserFactory.create(a.getAccountId()).getAccount();
-      final StringBuilder identbuf = new StringBuilder();
-      if (acc.getFullName() != null && acc.getFullName().length() > 0) {
-        if (identbuf.length() > 0) {
-          identbuf.append(' ');
-        }
-        identbuf.append(acc.getFullName());
-      }
-      if (acc.getPreferredEmail() != null && acc.getPreferredEmail().length() > 0) {
-        if (isSignedOffBy(footers, acc.getPreferredEmail())) {
-          continue;
-        }
-        if (identbuf.length() > 0) {
-          identbuf.append(' ');
-        }
-        identbuf.append('<');
-        identbuf.append(acc.getPreferredEmail());
-        identbuf.append('>');
-      }
-      if (identbuf.length() == 0) {
-        // Nothing reasonable to describe them by? Ignore them.
-        continue;
-      }
-
-      final String tag;
-      if (isCodeReview(a.getLabelId())) {
-        tag = "Reviewed-by";
-      } else if (isVerified(a.getLabelId())) {
-        tag = "Tested-by";
-      } else {
-        final LabelType lt = project.getLabelTypes().byLabel(a.getLabelId());
-        if (lt == null) {
-          continue;
-        }
-        tag = lt.getName();
-      }
-
-      if (!contains(footers, new FooterKey(tag), identbuf.toString())) {
-        msgbuf.append(tag);
-        msgbuf.append(": ");
-        msgbuf.append(identbuf);
-        msgbuf.append('\n');
-      }
-    }
-    return msgbuf.toString();
-  }
-
-  public String createCommitMessageOnSubmit(CodeReviewCommit n, RevCommit mergeTip) {
-    return createCommitMessageOnSubmit(
-        n,
-        mergeTip,
-        n.notes(),
-        identifiedUserFactory.create(n.notes().getChange().getOwner()),
-        n.getPatchsetId());
-  }
-
-  /**
-   * Creates a commit message for a change, which can be customized by plugins.
-   *
-   * <p>By default, adds footers to existing commit message based on the state of the change.
-   * Plugins implementing {@link ChangeMessageModifier} can modify the resulting commit message
-   * arbitrarily.
-   *
-   * @param n
-   * @param mergeTip
-   * @param notes
-   * @param user
-   * @param id
-   * @return new message
-   */
-  public String createCommitMessageOnSubmit(
-      RevCommit n, RevCommit mergeTip, ChangeNotes notes, CurrentUser user, Id id) {
-    return commitMessageGenerator.generate(
-        n, mergeTip, notes.getChange().getDest(), createDetailedCommitMessage(n, notes, user, id));
-  }
-
-  private static boolean isCodeReview(LabelId id) {
-    return "Code-Review".equalsIgnoreCase(id.get());
-  }
-
-  private static boolean isVerified(LabelId id) {
-    return "Verified".equalsIgnoreCase(id.get());
-  }
-
-  private Iterable<PatchSetApproval> safeGetApprovals(
-      ChangeNotes notes, CurrentUser user, PatchSet.Id psId) {
-    try {
-      return approvalsUtil.byPatchSet(db.get(), notes, user, psId, null, null);
-    } catch (OrmException e) {
-      log.error("Can't read approval records for " + psId, e);
-      return Collections.emptyList();
-    }
-  }
-
-  private static boolean contains(List<FooterLine> footers, FooterKey key, String val) {
-    for (FooterLine line : footers) {
-      if (line.matches(key) && val.equals(line.getValue())) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  private static boolean isSignedOffBy(List<FooterLine> footers, String email) {
-    for (FooterLine line : footers) {
-      if (line.matches(FooterKey.SIGNED_OFF_BY) && email.equals(line.getEmailAddress())) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  public boolean canMerge(
-      MergeSorter mergeSorter, Repository repo, CodeReviewCommit mergeTip, CodeReviewCommit toMerge)
-      throws IntegrationException {
-    if (hasMissingDependencies(mergeSorter, toMerge)) {
-      return false;
-    }
-
-    try (ObjectInserter ins = new InMemoryInserter(repo)) {
-      return newThreeWayMerger(ins, repo.getConfig()).merge(new AnyObjectId[] {mergeTip, toMerge});
-    } catch (LargeObjectException e) {
-      log.warn("Cannot merge due to LargeObjectException: " + toMerge.name());
-      return false;
-    } catch (NoMergeBaseException e) {
-      return false;
-    } catch (IOException e) {
-      throw new IntegrationException("Cannot merge " + toMerge.name(), e);
-    }
-  }
-
-  public boolean canFastForward(
-      MergeSorter mergeSorter,
-      CodeReviewCommit mergeTip,
-      CodeReviewRevWalk rw,
-      CodeReviewCommit toMerge)
-      throws IntegrationException {
-    if (hasMissingDependencies(mergeSorter, toMerge)) {
-      return false;
-    }
-
-    try {
-      return mergeTip == null
-          || rw.isMergedInto(mergeTip, toMerge)
-          || rw.isMergedInto(toMerge, mergeTip);
-    } catch (IOException e) {
-      throw new IntegrationException("Cannot fast-forward test during merge", e);
-    }
-  }
-
-  public boolean canCherryPick(
-      MergeSorter mergeSorter,
-      Repository repo,
-      CodeReviewCommit mergeTip,
-      CodeReviewRevWalk rw,
-      CodeReviewCommit toMerge)
-      throws IntegrationException {
-    if (mergeTip == null) {
-      // The branch is unborn. Fast-forward is possible.
-      //
-      return true;
-    }
-
-    if (toMerge.getParentCount() == 0) {
-      // Refuse to merge a root commit into an existing branch,
-      // we cannot obtain a delta for the cherry-pick to apply.
-      //
-      return false;
-    }
-
-    if (toMerge.getParentCount() == 1) {
-      // If there is only one parent, a cherry-pick can be done by
-      // taking the delta relative to that one parent and redoing
-      // that on the current merge tip.
-      //
-      try (ObjectInserter ins = new InMemoryInserter(repo)) {
-        ThreeWayMerger m = newThreeWayMerger(ins, repo.getConfig());
-        m.setBase(toMerge.getParent(0));
-        return m.merge(mergeTip, toMerge);
-      } catch (IOException e) {
-        throw new IntegrationException(
-            String.format(
-                "Cannot merge commit %s with mergetip %s", toMerge.name(), mergeTip.name()),
-            e);
-      }
-    }
-
-    // There are multiple parents, so this is a merge commit. We
-    // don't want to cherry-pick the merge as clients can't easily
-    // rebase their history with that merge present and replaced
-    // by an equivalent merge with a different first parent. So
-    // instead behave as though MERGE_IF_NECESSARY was configured.
-    //
-    return canFastForward(mergeSorter, mergeTip, rw, toMerge)
-        || canMerge(mergeSorter, repo, mergeTip, toMerge);
-  }
-
-  public boolean hasMissingDependencies(MergeSorter mergeSorter, CodeReviewCommit toMerge)
-      throws IntegrationException {
-    try {
-      return !mergeSorter.sort(Collections.singleton(toMerge)).contains(toMerge);
-    } catch (IOException e) {
-      throw new IntegrationException("Branch head sorting failed", e);
-    }
-  }
-
-  public CodeReviewCommit mergeOneCommit(
-      PersonIdent author,
-      PersonIdent committer,
-      CodeReviewRevWalk rw,
-      ObjectInserter inserter,
-      Config repoConfig,
-      Branch.NameKey destBranch,
-      CodeReviewCommit mergeTip,
-      CodeReviewCommit n)
-      throws IntegrationException {
-    ThreeWayMerger m = newThreeWayMerger(inserter, repoConfig);
-    try {
-      if (m.merge(new AnyObjectId[] {mergeTip, n})) {
-        return writeMergeCommit(
-            author, committer, rw, inserter, destBranch, mergeTip, m.getResultTreeId(), n);
-      }
-      failed(rw, mergeTip, n, CommitMergeStatus.PATH_CONFLICT);
-    } catch (NoMergeBaseException e) {
-      try {
-        failed(rw, mergeTip, n, getCommitMergeStatus(e.getReason()));
-      } catch (IOException e2) {
-        throw new IntegrationException("Cannot merge " + n.name(), e);
-      }
-    } catch (IOException e) {
-      throw new IntegrationException("Cannot merge " + n.name(), e);
-    }
-    return mergeTip;
-  }
-
-  private static CommitMergeStatus getCommitMergeStatus(MergeBaseFailureReason reason) {
-    switch (reason) {
-      case MULTIPLE_MERGE_BASES_NOT_SUPPORTED:
-      case TOO_MANY_MERGE_BASES:
-      default:
-        return CommitMergeStatus.MANUAL_RECURSIVE_MERGE;
-      case CONFLICTS_DURING_MERGE_BASE_CALCULATION:
-        return CommitMergeStatus.PATH_CONFLICT;
-    }
-  }
-
-  private static CodeReviewCommit failed(
-      CodeReviewRevWalk rw,
-      CodeReviewCommit mergeTip,
-      CodeReviewCommit n,
-      CommitMergeStatus failure)
-      throws MissingObjectException, IncorrectObjectTypeException, IOException {
-    rw.reset();
-    rw.markStart(n);
-    rw.markUninteresting(mergeTip);
-    CodeReviewCommit failed;
-    while ((failed = rw.next()) != null) {
-      failed.setStatusCode(failure);
-    }
-    return failed;
-  }
-
-  public CodeReviewCommit writeMergeCommit(
-      PersonIdent author,
-      PersonIdent committer,
-      CodeReviewRevWalk rw,
-      ObjectInserter inserter,
-      Branch.NameKey destBranch,
-      CodeReviewCommit mergeTip,
-      ObjectId treeId,
-      CodeReviewCommit n)
-      throws IOException, MissingObjectException, IncorrectObjectTypeException {
-    final List<CodeReviewCommit> merged = new ArrayList<>();
-    rw.reset();
-    rw.markStart(n);
-    rw.markUninteresting(mergeTip);
-    CodeReviewCommit crc;
-    while ((crc = rw.next()) != null) {
-      if (crc.getPatchsetId() != null) {
-        merged.add(crc);
-      }
-    }
-
-    StringBuilder msgbuf = new StringBuilder().append(summarize(rw, merged));
-    if (!R_HEADS_MASTER.equals(destBranch.get())) {
-      msgbuf.append(" into ");
-      msgbuf.append(destBranch.getShortName());
-    }
-
-    if (merged.size() > 1) {
-      msgbuf.append("\n\n* changes:\n");
-      for (CodeReviewCommit c : merged) {
-        rw.parseBody(c);
-        msgbuf.append("  ");
-        msgbuf.append(c.getShortMessage());
-        msgbuf.append("\n");
-      }
-    }
-
-    final CommitBuilder mergeCommit = new CommitBuilder();
-    mergeCommit.setTreeId(treeId);
-    mergeCommit.setParentIds(mergeTip, n);
-    mergeCommit.setAuthor(author);
-    mergeCommit.setCommitter(committer);
-    mergeCommit.setMessage(msgbuf.toString());
-
-    CodeReviewCommit mergeResult = rw.parseCommit(inserter.insert(mergeCommit));
-    mergeResult.setNotes(n.getNotes());
-    return mergeResult;
-  }
-
-  private String summarize(RevWalk rw, List<CodeReviewCommit> merged) throws IOException {
-    if (merged.size() == 1) {
-      CodeReviewCommit c = merged.get(0);
-      rw.parseBody(c);
-      return String.format("Merge \"%s\"", c.getShortMessage());
-    }
-
-    LinkedHashSet<String> topics = new LinkedHashSet<>(4);
-    for (CodeReviewCommit c : merged) {
-      if (!Strings.isNullOrEmpty(c.change().getTopic())) {
-        topics.add(c.change().getTopic());
-      }
-    }
-
-    if (topics.size() == 1) {
-      return String.format("Merge changes from topic \"%s\"", Iterables.getFirst(topics, null));
-    } else if (topics.size() > 1) {
-      return String.format("Merge changes from topics \"%s\"", Joiner.on("\", \"").join(topics));
-    } else {
-      return String.format(
-          "Merge changes %s%s",
-          FluentIterable.from(merged)
-              .limit(5)
-              .transform(c -> c.change().getKey().abbreviate())
-              .join(Joiner.on(',')),
-          merged.size() > 5 ? ", ..." : "");
-    }
-  }
-
-  public ThreeWayMerger newThreeWayMerger(ObjectInserter inserter, Config repoConfig) {
-    return newThreeWayMerger(inserter, repoConfig, mergeStrategyName());
-  }
-
-  public String mergeStrategyName() {
-    return mergeStrategyName(useContentMerge, useRecursiveMerge);
-  }
-
-  public static String mergeStrategyName(boolean useContentMerge, boolean useRecursiveMerge) {
-    if (useContentMerge) {
-      // Settings for this project allow us to try and automatically resolve
-      // conflicts within files if needed. Use either the old resolve merger or
-      // new recursive merger, and instruct to operate in core.
-      if (useRecursiveMerge) {
-        return MergeStrategy.RECURSIVE.getName();
-      }
-      return MergeStrategy.RESOLVE.getName();
-    }
-    // No auto conflict resolving allowed. If any of the
-    // affected files was modified, merge will fail.
-    return MergeStrategy.SIMPLE_TWO_WAY_IN_CORE.getName();
-  }
-
-  public static ThreeWayMerger newThreeWayMerger(
-      ObjectInserter inserter, Config repoConfig, String strategyName) {
-    Merger m = newMerger(inserter, repoConfig, strategyName);
-    checkArgument(
-        m instanceof ThreeWayMerger,
-        "merge strategy %s does not support three-way merging",
-        strategyName);
-    return (ThreeWayMerger) m;
-  }
-
-  public static Merger newMerger(ObjectInserter inserter, Config repoConfig, String strategyName) {
-    MergeStrategy strategy = MergeStrategy.get(strategyName);
-    checkArgument(strategy != null, "invalid merge strategy: %s", strategyName);
-    return strategy.newMerger(
-        new ObjectInserter.Filter() {
-          @Override
-          protected ObjectInserter delegate() {
-            return inserter;
-          }
-
-          @Override
-          public void flush() {}
-
-          @Override
-          public void close() {}
-        },
-        repoConfig);
-  }
-
-  public void markCleanMerges(
-      RevWalk rw, RevFlag canMergeFlag, CodeReviewCommit mergeTip, Set<RevCommit> alreadyAccepted)
-      throws IntegrationException {
-    if (mergeTip == null) {
-      // If mergeTip is null here, branchTip was null, indicating a new branch
-      // at the start of the merge process. We also elected to merge nothing,
-      // probably due to missing dependencies. Nothing was cleanly merged.
-      //
-      return;
-    }
-
-    try {
-      rw.resetRetain(canMergeFlag);
-      rw.sort(RevSort.TOPO);
-      rw.sort(RevSort.REVERSE, true);
-      rw.markStart(mergeTip);
-      for (RevCommit c : alreadyAccepted) {
-        // If branch was not created by this submit.
-        if (!Objects.equals(c, mergeTip)) {
-          rw.markUninteresting(c);
-        }
-      }
-
-      CodeReviewCommit c;
-      while ((c = (CodeReviewCommit) rw.next()) != null) {
-        if (c.getPatchsetId() != null && c.getStatusCode() == null) {
-          c.setStatusCode(CommitMergeStatus.CLEAN_MERGE);
-        }
-      }
-    } catch (IOException e) {
-      throw new IntegrationException("Cannot mark clean merges", e);
-    }
-  }
-
-  public Set<Change.Id> findUnmergedChanges(
-      Set<Change.Id> expected,
-      CodeReviewRevWalk rw,
-      RevFlag canMergeFlag,
-      CodeReviewCommit oldTip,
-      CodeReviewCommit mergeTip,
-      Iterable<Change.Id> alreadyMerged)
-      throws IntegrationException {
-    if (mergeTip == null) {
-      return expected;
-    }
-
-    try {
-      Set<Change.Id> found = Sets.newHashSetWithExpectedSize(expected.size());
-      Iterables.addAll(found, alreadyMerged);
-      rw.resetRetain(canMergeFlag);
-      rw.sort(RevSort.TOPO);
-      rw.markStart(mergeTip);
-      if (oldTip != null) {
-        rw.markUninteresting(oldTip);
-      }
-
-      CodeReviewCommit c;
-      while ((c = rw.next()) != null) {
-        if (c.getPatchsetId() == null) {
-          continue;
-        }
-        Change.Id id = c.getPatchsetId().getParentKey();
-        if (!expected.contains(id)) {
-          continue;
-        }
-        found.add(id);
-        if (found.size() == expected.size()) {
-          return Collections.emptySet();
-        }
-      }
-      return Sets.difference(expected, found);
-    } catch (IOException e) {
-      throw new IntegrationException("Cannot check if changes were merged", e);
-    }
-  }
-
-  public static CodeReviewCommit findAnyMergedInto(
-      CodeReviewRevWalk rw, Iterable<CodeReviewCommit> commits, CodeReviewCommit tip)
-      throws IOException {
-    for (CodeReviewCommit c : commits) {
-      // TODO(dborowitz): Seems like this could get expensive for many patch
-      // sets. Is there a more efficient implementation?
-      if (rw.isMergedInto(c, tip)) {
-        return c;
-      }
-    }
-    return null;
-  }
-
-  public static RevCommit resolveCommit(Repository repo, RevWalk rw, String str)
-      throws BadRequestException, ResourceNotFoundException, IOException {
-    try {
-      ObjectId commitId = repo.resolve(str);
-      if (commitId == null) {
-        throw new BadRequestException("Cannot resolve '" + str + "' to a commit");
-      }
-      return rw.parseCommit(commitId);
-    } catch (AmbiguousObjectException | IncorrectObjectTypeException | RevisionSyntaxException e) {
-      throw new BadRequestException(e.getMessage());
-    } catch (MissingObjectException e) {
-      throw new ResourceNotFoundException(e.getMessage());
-    }
-  }
-
-  private static void matchAuthorToCommitterDate(ProjectState project, CommitBuilder commit) {
-    if (project.isMatchAuthorToCommitterDate()) {
-      commit.setAuthor(
-          new PersonIdent(
-              commit.getAuthor(),
-              commit.getCommitter().getWhen(),
-              commit.getCommitter().getTimeZone()));
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergedByPushOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergedByPushOp.java
deleted file mode 100644
index 3584786..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergedByPushOp.java
+++ /dev/null
@@ -1,203 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.git;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.LabelId;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.client.PatchSetInfo;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.extensions.events.ChangeMerged;
-import com.google.gerrit.server.mail.send.MergedSender;
-import com.google.gerrit.server.notedb.ChangeUpdate;
-import com.google.gerrit.server.patch.PatchSetInfoFactory;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.Context;
-import com.google.gerrit.server.util.RequestScopePropagator;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Future;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class MergedByPushOp implements BatchUpdateOp {
-  private static final Logger log = LoggerFactory.getLogger(MergedByPushOp.class);
-
-  public interface Factory {
-    MergedByPushOp create(
-        RequestScopePropagator requestScopePropagator, PatchSet.Id psId, String refName);
-  }
-
-  private final RequestScopePropagator requestScopePropagator;
-  private final PatchSetInfoFactory patchSetInfoFactory;
-  private final ChangeMessagesUtil cmUtil;
-  private final MergedSender.Factory mergedSenderFactory;
-  private final PatchSetUtil psUtil;
-  private final ExecutorService sendEmailExecutor;
-  private final ChangeMerged changeMerged;
-
-  private final PatchSet.Id psId;
-  private final String refName;
-
-  private Change change;
-  private boolean correctBranch;
-  private Provider<PatchSet> patchSetProvider;
-  private PatchSet patchSet;
-  private PatchSetInfo info;
-
-  @Inject
-  MergedByPushOp(
-      PatchSetInfoFactory patchSetInfoFactory,
-      ChangeMessagesUtil cmUtil,
-      MergedSender.Factory mergedSenderFactory,
-      PatchSetUtil psUtil,
-      @SendEmailExecutor ExecutorService sendEmailExecutor,
-      ChangeMerged changeMerged,
-      @Assisted RequestScopePropagator requestScopePropagator,
-      @Assisted PatchSet.Id psId,
-      @Assisted String refName) {
-    this.patchSetInfoFactory = patchSetInfoFactory;
-    this.cmUtil = cmUtil;
-    this.mergedSenderFactory = mergedSenderFactory;
-    this.psUtil = psUtil;
-    this.sendEmailExecutor = sendEmailExecutor;
-    this.changeMerged = changeMerged;
-    this.requestScopePropagator = requestScopePropagator;
-    this.psId = psId;
-    this.refName = refName;
-  }
-
-  public String getMergedIntoRef() {
-    return refName;
-  }
-
-  public MergedByPushOp setPatchSetProvider(Provider<PatchSet> patchSetProvider) {
-    this.patchSetProvider = checkNotNull(patchSetProvider);
-    return this;
-  }
-
-  @Override
-  public boolean updateChange(ChangeContext ctx) throws OrmException, IOException {
-    change = ctx.getChange();
-    correctBranch = refName.equals(change.getDest().get());
-    if (!correctBranch) {
-      return false;
-    }
-
-    if (patchSetProvider != null) {
-      // Caller might have also arranged for construction of a new patch set
-      // that is not present in the old notes so we can't use PatchSetUtil.
-      patchSet = patchSetProvider.get();
-    } else {
-      patchSet =
-          checkNotNull(
-              psUtil.get(ctx.getDb(), ctx.getNotes(), psId), "patch set %s not found", psId);
-    }
-    info = getPatchSetInfo(ctx);
-
-    ChangeUpdate update = ctx.getUpdate(psId);
-    Change.Status status = change.getStatus();
-    if (status == Change.Status.MERGED) {
-      return true;
-    }
-    change.setCurrentPatchSet(info);
-    change.setStatus(Change.Status.MERGED);
-    // we cannot reconstruct the submit records for when this change was
-    // submitted, this is why we must fix the status
-    update.fixStatus(Change.Status.MERGED);
-    update.setCurrentPatchSet();
-    StringBuilder msgBuf = new StringBuilder();
-    msgBuf.append("Change has been successfully pushed");
-    if (!refName.equals(change.getDest().get())) {
-      msgBuf.append(" into ");
-      if (refName.startsWith(Constants.R_HEADS)) {
-        msgBuf.append("branch ");
-        msgBuf.append(Repository.shortenRefName(refName));
-      } else {
-        msgBuf.append(refName);
-      }
-    }
-    msgBuf.append(".");
-    ChangeMessage msg =
-        ChangeMessagesUtil.newMessage(
-            psId, ctx.getUser(), ctx.getWhen(), msgBuf.toString(), ChangeMessagesUtil.TAG_MERGED);
-    cmUtil.addChangeMessage(ctx.getDb(), update, msg);
-
-    PatchSetApproval submitter =
-        ApprovalsUtil.newApproval(
-            change.currentPatchSetId(), ctx.getUser(), LabelId.legacySubmit(), 1, ctx.getWhen());
-    update.putApproval(submitter.getLabel(), submitter.getValue());
-    ctx.getDb().patchSetApprovals().upsert(Collections.singleton(submitter));
-
-    return true;
-  }
-
-  @Override
-  public void postUpdate(Context ctx) {
-    if (!correctBranch) {
-      return;
-    }
-    @SuppressWarnings("unused") // Runnable already handles errors
-    Future<?> possiblyIgnoredError =
-        sendEmailExecutor.submit(
-            requestScopePropagator.wrap(
-                new Runnable() {
-                  @Override
-                  public void run() {
-                    try {
-                      MergedSender cm =
-                          mergedSenderFactory.create(ctx.getProject(), psId.getParentKey());
-                      cm.setFrom(ctx.getAccountId());
-                      cm.setPatchSet(patchSet, info);
-                      cm.send();
-                    } catch (Exception e) {
-                      log.error("Cannot send email for submitted patch set " + psId, e);
-                    }
-                  }
-
-                  @Override
-                  public String toString() {
-                    return "send-email merged";
-                  }
-                }));
-
-    changeMerged.fire(
-        change, patchSet, ctx.getAccount(), patchSet.getRevision().get(), ctx.getWhen());
-  }
-
-  private PatchSetInfo getPatchSetInfo(ChangeContext ctx) throws IOException, OrmException {
-    RevWalk rw = ctx.getRevWalk();
-    RevCommit commit =
-        rw.parseCommit(ObjectId.fromString(checkNotNull(patchSet).getRevision().get()));
-    return patchSetInfoFactory.get(rw, commit, psId);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MetaDataUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MetaDataUpdate.java
deleted file mode 100644
index 21f5d3e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MetaDataUpdate.java
+++ /dev/null
@@ -1,267 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.server.git;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.BatchRefUpdate;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.Repository;
-
-/** Helps with the updating of a {@link VersionedMetaData}. */
-public class MetaDataUpdate implements AutoCloseable {
-  public static class User {
-    private final InternalFactory factory;
-    private final GitRepositoryManager mgr;
-    private final PersonIdent serverIdent;
-    private final Provider<IdentifiedUser> identifiedUser;
-
-    @Inject
-    User(
-        InternalFactory factory,
-        GitRepositoryManager mgr,
-        @GerritPersonIdent PersonIdent serverIdent,
-        Provider<IdentifiedUser> identifiedUser) {
-      this.factory = factory;
-      this.mgr = mgr;
-      this.serverIdent = serverIdent;
-      this.identifiedUser = identifiedUser;
-    }
-
-    public PersonIdent getUserPersonIdent() {
-      return createPersonIdent(identifiedUser.get());
-    }
-
-    public MetaDataUpdate create(Project.NameKey name)
-        throws RepositoryNotFoundException, IOException {
-      return create(name, identifiedUser.get());
-    }
-
-    public MetaDataUpdate create(Project.NameKey name, IdentifiedUser user)
-        throws RepositoryNotFoundException, IOException {
-      return create(name, user, null);
-    }
-
-    /**
-     * Create an update using an existing batch ref update.
-     *
-     * <p>This allows batching together updates to multiple metadata refs. For making multiple
-     * commits to a single metadata ref, see {@link VersionedMetaData#openUpdate(MetaDataUpdate)}.
-     *
-     * @param name project name.
-     * @param user user for the update.
-     * @param batch batch update to use; the caller is responsible for committing the update.
-     */
-    public MetaDataUpdate create(Project.NameKey name, IdentifiedUser user, BatchRefUpdate batch)
-        throws RepositoryNotFoundException, IOException {
-      Repository repo = mgr.openRepository(name);
-      MetaDataUpdate md = create(name, repo, user, batch);
-      md.setCloseRepository(true);
-      return md;
-    }
-
-    /**
-     * Create an update using an existing batch ref update.
-     *
-     * <p>This allows batching together updates to multiple metadata refs. For making multiple
-     * commits to a single metadata ref, see {@link VersionedMetaData#openUpdate(MetaDataUpdate)}.
-     *
-     * <p>Important: Create a new MetaDataUpdate instance for each update:
-     *
-     * <pre>
-     * <code>
-     *   try (Repository repo = repoMgr.openRepository(allUsersName);
-     *       RevWalk rw = new RevWalk(repo)) {
-     *     BatchRefUpdate batchUpdate = repo.getRefDatabase().newBatchUpdate();
-     *     // WRONG: create the MetaDataUpdate instance here and reuse it for
-     *     //        all updates in the loop
-     *     for{@code (Map.Entry<Account.Id, DiffPreferencesInfo> e : diffPrefsFromDb)} {
-     *       // CORRECT: create a new MetaDataUpdate instance for each update
-     *       try (MetaDataUpdate md =
-     *           metaDataUpdateFactory.create(allUsersName, batchUpdate)) {
-     *         md.setMessage("Import diff preferences from reviewdb\n");
-     *         VersionedAccountPreferences vPrefs =
-     *             VersionedAccountPreferences.forUser(e.getKey());
-     *         storeSection(vPrefs.getConfig(), UserConfigSections.DIFF, null,
-     *             e.getValue(), DiffPreferencesInfo.defaults());
-     *         vPrefs.commit(md);
-     *       } catch (ConfigInvalidException e) {
-     *         // TODO handle exception
-     *       }
-     *     }
-     *     batchUpdate.execute(rw, NullProgressMonitor.INSTANCE);
-     *   }
-     * </code>
-     * </pre>
-     *
-     * @param name project name.
-     * @param repository the repository to update; the caller is responsible for closing the
-     *     repository.
-     * @param user user for the update.
-     * @param batch batch update to use; the caller is responsible for committing the update.
-     */
-    public MetaDataUpdate create(
-        Project.NameKey name, Repository repository, IdentifiedUser user, BatchRefUpdate batch) {
-      MetaDataUpdate md = factory.create(name, repository, batch);
-      md.getCommitBuilder().setCommitter(serverIdent);
-      md.setAuthor(user);
-      return md;
-    }
-
-    private PersonIdent createPersonIdent(IdentifiedUser user) {
-      return user.newCommitterIdent(serverIdent.getWhen(), serverIdent.getTimeZone());
-    }
-  }
-
-  public static class Server {
-    private final InternalFactory factory;
-    private final GitRepositoryManager mgr;
-    private final PersonIdent serverIdent;
-
-    @Inject
-    Server(
-        InternalFactory factory,
-        GitRepositoryManager mgr,
-        @GerritPersonIdent PersonIdent serverIdent) {
-      this.factory = factory;
-      this.mgr = mgr;
-      this.serverIdent = serverIdent;
-    }
-
-    public MetaDataUpdate create(Project.NameKey name)
-        throws RepositoryNotFoundException, IOException {
-      return create(name, null);
-    }
-
-    /** @see User#create(Project.NameKey, IdentifiedUser, BatchRefUpdate) */
-    public MetaDataUpdate create(Project.NameKey name, BatchRefUpdate batch)
-        throws RepositoryNotFoundException, IOException {
-      Repository repo = mgr.openRepository(name);
-      MetaDataUpdate md = factory.create(name, repo, batch);
-      md.setCloseRepository(true);
-      md.getCommitBuilder().setAuthor(serverIdent);
-      md.getCommitBuilder().setCommitter(serverIdent);
-      return md;
-    }
-  }
-
-  public interface InternalFactory {
-    MetaDataUpdate create(
-        @Assisted Project.NameKey projectName,
-        @Assisted Repository repository,
-        @Assisted @Nullable BatchRefUpdate batch);
-  }
-
-  private final GitReferenceUpdated gitRefUpdated;
-  private final Project.NameKey projectName;
-  private final Repository repository;
-  private final BatchRefUpdate batch;
-  private final CommitBuilder commit;
-  private boolean allowEmpty;
-  private boolean insertChangeId;
-  private boolean closeRepository;
-  private IdentifiedUser author;
-
-  @Inject
-  public MetaDataUpdate(
-      GitReferenceUpdated gitRefUpdated,
-      @Assisted Project.NameKey projectName,
-      @Assisted Repository repository,
-      @Assisted @Nullable BatchRefUpdate batch) {
-    this.gitRefUpdated = gitRefUpdated;
-    this.projectName = projectName;
-    this.repository = repository;
-    this.batch = batch;
-    this.commit = new CommitBuilder();
-  }
-
-  public MetaDataUpdate(
-      GitReferenceUpdated gitRefUpdated, Project.NameKey projectName, Repository repository) {
-    this(gitRefUpdated, projectName, repository, null);
-  }
-
-  /** Set the commit message used when committing the update. */
-  public void setMessage(String message) {
-    getCommitBuilder().setMessage(message);
-  }
-
-  public void setAuthor(IdentifiedUser author) {
-    this.author = author;
-    getCommitBuilder()
-        .setAuthor(
-            author.newCommitterIdent(
-                getCommitBuilder().getCommitter().getWhen(),
-                getCommitBuilder().getCommitter().getTimeZone()));
-  }
-
-  public void setAllowEmpty(boolean allowEmpty) {
-    this.allowEmpty = allowEmpty;
-  }
-
-  public void setInsertChangeId(boolean insertChangeId) {
-    this.insertChangeId = insertChangeId;
-  }
-
-  public void setCloseRepository(boolean closeRepository) {
-    this.closeRepository = closeRepository;
-  }
-
-  /** @return batch in which to run the update, or {@code null} for no batch. */
-  BatchRefUpdate getBatch() {
-    return batch;
-  }
-
-  /** Close the cached Repository handle. */
-  @Override
-  public void close() {
-    if (closeRepository) {
-      getRepository().close();
-    }
-  }
-
-  Project.NameKey getProjectName() {
-    return projectName;
-  }
-
-  public Repository getRepository() {
-    return repository;
-  }
-
-  boolean allowEmpty() {
-    return allowEmpty;
-  }
-
-  boolean insertChangeId() {
-    return insertChangeId;
-  }
-
-  public CommitBuilder getCommitBuilder() {
-    return commit;
-  }
-
-  protected void fireGitRefUpdatedEvent(RefUpdate ru) {
-    gitRefUpdated.fire(projectName, ru, author == null ? null : author.getAccount());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MultiProgressMonitor.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MultiProgressMonitor.java
deleted file mode 100644
index 694976d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MultiProgressMonitor.java
+++ /dev/null
@@ -1,355 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.git;
-
-import static java.util.concurrent.TimeUnit.NANOSECONDS;
-
-import com.google.common.base.Strings;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.List;
-import java.util.concurrent.CancellationException;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.ProgressMonitor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Progress reporting interface that multiplexes multiple sub-tasks.
- *
- * <p>Output is of the format:
- *
- * <pre>
- *   Task: subA: 1, subB: 75% (3/4) (-)\r
- *   Task: subA: 2, subB: 75% (3/4), subC: 1 (\)\r
- *   Task: subA: 2, subB: 100% (4/4), subC: 1 (|)\r
- *   Task: subA: 4, subB: 100% (4/4), subC: 4, done    \n
- * </pre>
- *
- * <p>Callers should try to keep task and sub-task descriptions short, since the output should fit
- * on one terminal line. (Note that git clients do not accept terminal control characters, so true
- * multi-line progress messages would be impossible.)
- */
-public class MultiProgressMonitor {
-  private static final Logger log = LoggerFactory.getLogger(MultiProgressMonitor.class);
-
-  /** Constant indicating the total work units cannot be predicted. */
-  public static final int UNKNOWN = 0;
-
-  private static final char[] SPINNER_STATES = new char[] {'-', '\\', '|', '/'};
-  private static final char NO_SPINNER = ' ';
-
-  /** Handle for a sub-task. */
-  public class Task implements ProgressMonitor {
-    private final String name;
-    private final int total;
-    private int count;
-    private int lastPercent;
-
-    Task(String subTaskName, int totalWork) {
-      this.name = subTaskName;
-      this.total = totalWork;
-    }
-
-    /**
-     * Indicate that work has been completed on this sub-task.
-     *
-     * <p>Must be called from a worker thread.
-     *
-     * @param completed number of work units completed.
-     */
-    @Override
-    public void update(int completed) {
-      boolean w = false;
-      synchronized (MultiProgressMonitor.this) {
-        count += completed;
-        if (total != UNKNOWN) {
-          int percent = count * 100 / total;
-          if (percent > lastPercent) {
-            lastPercent = percent;
-            w = true;
-          }
-        }
-      }
-      if (w) {
-        wakeUp();
-      }
-    }
-
-    /**
-     * Indicate that this sub-task is finished.
-     *
-     * <p>Must be called from a worker thread.
-     */
-    public void end() {
-      if (total == UNKNOWN && getCount() > 0) {
-        wakeUp();
-      }
-    }
-
-    @Override
-    public void start(int totalTasks) {}
-
-    @Override
-    public void beginTask(String title, int totalWork) {}
-
-    @Override
-    public void endTask() {}
-
-    @Override
-    public boolean isCancelled() {
-      return false;
-    }
-
-    public int getCount() {
-      synchronized (MultiProgressMonitor.this) {
-        return count;
-      }
-    }
-  }
-
-  private final OutputStream out;
-  private final String taskName;
-  private final List<Task> tasks = new CopyOnWriteArrayList<>();
-  private int spinnerIndex;
-  private char spinnerState = NO_SPINNER;
-  private boolean done;
-  private boolean write = true;
-
-  private final long maxIntervalNanos;
-
-  /**
-   * Create a new progress monitor for multiple sub-tasks.
-   *
-   * @param out stream for writing progress messages.
-   * @param taskName name of the overall task.
-   */
-  public MultiProgressMonitor(OutputStream out, String taskName) {
-    this(out, taskName, 500, TimeUnit.MILLISECONDS);
-  }
-
-  /**
-   * Create a new progress monitor for multiple sub-tasks.
-   *
-   * @param out stream for writing progress messages.
-   * @param taskName name of the overall task.
-   * @param maxIntervalTime maximum interval between progress messages.
-   * @param maxIntervalUnit time unit for progress interval.
-   */
-  public MultiProgressMonitor(
-      OutputStream out, String taskName, long maxIntervalTime, TimeUnit maxIntervalUnit) {
-    this.out = out;
-    this.taskName = taskName;
-    maxIntervalNanos = NANOSECONDS.convert(maxIntervalTime, maxIntervalUnit);
-  }
-
-  /**
-   * Wait for a task managed by a {@link Future}, with no timeout.
-   *
-   * @see #waitFor(Future, long, TimeUnit)
-   */
-  public void waitFor(Future<?> workerFuture) throws ExecutionException {
-    waitFor(workerFuture, 0, null);
-  }
-
-  /**
-   * Wait for a task managed by a {@link Future}.
-   *
-   * <p>Must be called from the main thread, <em>not</em> a worker thread. Once a worker thread
-   * calls {@link #end()}, the future has an additional {@code maxInterval} to finish before it is
-   * forcefully cancelled and {@link ExecutionException} is thrown.
-   *
-   * @param workerFuture a future that returns when worker threads are finished.
-   * @param timeoutTime overall timeout for the task; the future is forcefully cancelled if the task
-   *     exceeds the timeout. Non-positive values indicate no timeout.
-   * @param timeoutUnit unit for overall task timeout.
-   * @throws ExecutionException if this thread or a worker thread was interrupted, the worker was
-   *     cancelled, or timed out waiting for a worker to call {@link #end()}.
-   */
-  public void waitFor(Future<?> workerFuture, long timeoutTime, TimeUnit timeoutUnit)
-      throws ExecutionException {
-    long overallStart = System.nanoTime();
-    long deadline;
-    String detailMessage = "";
-    if (timeoutTime > 0) {
-      deadline = overallStart + NANOSECONDS.convert(timeoutTime, timeoutUnit);
-    } else {
-      deadline = 0;
-    }
-
-    synchronized (this) {
-      long left = maxIntervalNanos;
-      while (!done) {
-        long start = System.nanoTime();
-        try {
-          NANOSECONDS.timedWait(this, left);
-        } catch (InterruptedException e) {
-          throw new ExecutionException(e);
-        }
-
-        // Send an update on every wakeup (manual or spurious), but only move
-        // the spinner every maxInterval.
-        long now = System.nanoTime();
-
-        if (deadline > 0 && now > deadline) {
-          workerFuture.cancel(true);
-          if (workerFuture.isCancelled()) {
-            detailMessage =
-                String.format(
-                    "(timeout %sms, cancelled)",
-                    TimeUnit.MILLISECONDS.convert(now - deadline, NANOSECONDS));
-            log.warn(
-                "MultiProgressMonitor worker killed after {}ms {}",
-                TimeUnit.MILLISECONDS.convert(now - overallStart, NANOSECONDS),
-                detailMessage);
-          }
-          break;
-        }
-
-        left -= now - start;
-        if (left <= 0) {
-          moveSpinner();
-          left = maxIntervalNanos;
-        }
-        sendUpdate();
-        if (!done && workerFuture.isDone()) {
-          // The worker may not have called end() explicitly, which is likely a
-          // programming error.
-          log.warn("MultiProgressMonitor worker did not call end() before returning");
-          end();
-        }
-      }
-      sendDone();
-    }
-
-    // The loop exits as soon as the worker calls end(), but we give it another
-    // maxInterval to finish up and return.
-    try {
-      workerFuture.get(maxIntervalNanos, NANOSECONDS);
-    } catch (InterruptedException e) {
-      throw new ExecutionException(e);
-    } catch (CancellationException e) {
-      throw new ExecutionException(detailMessage, e);
-    } catch (TimeoutException e) {
-      workerFuture.cancel(true);
-      throw new ExecutionException(e);
-    }
-  }
-
-  private synchronized void wakeUp() {
-    notifyAll();
-  }
-
-  /**
-   * Begin a sub-task.
-   *
-   * @param subTask sub-task name.
-   * @param subTaskWork total work units in sub-task, or {@link #UNKNOWN}.
-   * @return sub-task handle.
-   */
-  public Task beginSubTask(String subTask, int subTaskWork) {
-    Task task = new Task(subTask, subTaskWork);
-    tasks.add(task);
-    return task;
-  }
-
-  /**
-   * End the overall task.
-   *
-   * <p>Must be called from a worker thread.
-   */
-  public synchronized void end() {
-    done = true;
-    wakeUp();
-  }
-
-  private void sendDone() {
-    spinnerState = NO_SPINNER;
-    StringBuilder s = format();
-    boolean any = false;
-    for (Task t : tasks) {
-      if (t.count != 0) {
-        any = true;
-        break;
-      }
-    }
-    if (any) {
-      s.append(",");
-    }
-    s.append(" done    \n");
-    send(s);
-  }
-
-  private void moveSpinner() {
-    spinnerIndex = (spinnerIndex + 1) % SPINNER_STATES.length;
-    spinnerState = SPINNER_STATES[spinnerIndex];
-  }
-
-  private void sendUpdate() {
-    send(format());
-  }
-
-  private StringBuilder format() {
-    StringBuilder s = new StringBuilder().append("\r").append(taskName).append(':');
-
-    if (!tasks.isEmpty()) {
-      boolean first = true;
-      for (Task t : tasks) {
-        int count = t.getCount();
-        if (count == 0) {
-          continue;
-        }
-
-        if (!first) {
-          s.append(',');
-        } else {
-          first = false;
-        }
-
-        s.append(' ');
-        if (!Strings.isNullOrEmpty(t.name)) {
-          s.append(t.name).append(": ");
-        }
-        if (t.total == UNKNOWN) {
-          s.append(count);
-        } else {
-          s.append(String.format("%d%% (%d/%d)", count * 100 / t.total, count, t.total));
-        }
-      }
-    }
-
-    if (spinnerState != NO_SPINNER) {
-      // Don't output a spinner until the alarm fires for the first time.
-      s.append(" (").append(spinnerState).append(')');
-    }
-    return s;
-  }
-
-  private void send(StringBuilder s) {
-    if (write) {
-      try {
-        out.write(Constants.encode(s.toString()));
-        out.flush();
-      } catch (IOException e) {
-        write = false;
-      }
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/NotifyConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/NotifyConfig.java
deleted file mode 100644
index 55b94e5..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/NotifyConfig.java
+++ /dev/null
@@ -1,118 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.git;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.server.account.WatchConfig.NotifyType;
-import com.google.gerrit.server.mail.Address;
-import java.util.EnumSet;
-import java.util.HashSet;
-import java.util.Set;
-
-public class NotifyConfig implements Comparable<NotifyConfig> {
-  public enum Header {
-    TO,
-    CC,
-    BCC
-  }
-
-  private String name;
-  private EnumSet<NotifyType> types = EnumSet.of(NotifyType.ALL);
-  private String filter;
-
-  private Header header;
-  private Set<GroupReference> groups = new HashSet<>();
-  private Set<Address> addresses = new HashSet<>();
-
-  public String getName() {
-    return name;
-  }
-
-  public void setName(String name) {
-    this.name = name;
-  }
-
-  public boolean isNotify(NotifyType type) {
-    return types.contains(type) || types.contains(NotifyType.ALL);
-  }
-
-  public EnumSet<NotifyType> getNotify() {
-    return types;
-  }
-
-  public void setTypes(EnumSet<NotifyType> newTypes) {
-    types = EnumSet.copyOf(newTypes);
-  }
-
-  public String getFilter() {
-    return filter;
-  }
-
-  public void setFilter(String filter) {
-    if ("*".equals(filter)) {
-      this.filter = null;
-    } else {
-      this.filter = Strings.emptyToNull(filter);
-    }
-  }
-
-  public Header getHeader() {
-    return header;
-  }
-
-  public void setHeader(Header hdr) {
-    header = hdr;
-  }
-
-  public Set<GroupReference> getGroups() {
-    return groups;
-  }
-
-  public Set<Address> getAddresses() {
-    return addresses;
-  }
-
-  public void addEmail(GroupReference group) {
-    groups.add(group);
-  }
-
-  public void addEmail(Address address) {
-    addresses.add(address);
-  }
-
-  @Override
-  public int compareTo(NotifyConfig o) {
-    return name.compareTo(o.name);
-  }
-
-  @Override
-  public int hashCode() {
-    return name.hashCode();
-  }
-
-  @Override
-  public boolean equals(Object obj) {
-    if (obj instanceof NotifyConfig) {
-      return compareTo((NotifyConfig) obj) == 0;
-    }
-    return false;
-  }
-
-  @Override
-  public String toString() {
-    return "NotifyConfig[" + name + " = " + addresses + " + " + groups + "]";
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectConfig.java
deleted file mode 100644
index ca61f80..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectConfig.java
+++ /dev/null
@@ -1,1564 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.server.git;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.gerrit.common.data.Permission.isPermission;
-
-import com.google.common.base.CharMatcher;
-import com.google.common.base.Joiner;
-import com.google.common.base.Splitter;
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import com.google.common.primitives.Shorts;
-import com.google.gerrit.common.data.AccessSection;
-import com.google.gerrit.common.data.ContributorAgreement;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.common.data.LabelFunction;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.LabelValue;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.common.data.PermissionRule;
-import com.google.gerrit.common.data.PermissionRule.Action;
-import com.google.gerrit.common.data.RefConfigSection;
-import com.google.gerrit.common.data.SubscribeSection;
-import com.google.gerrit.common.errors.InvalidNameException;
-import com.google.gerrit.extensions.client.InheritableBoolean;
-import com.google.gerrit.extensions.client.ProjectState;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.WatchConfig.NotifyType;
-import com.google.gerrit.server.config.ConfigUtil;
-import com.google.gerrit.server.config.PluginConfig;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.project.CommentLinkInfoImpl;
-import com.google.gerrit.server.project.RefPattern;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Optional;
-import java.util.Set;
-import java.util.regex.Pattern;
-import java.util.regex.PatternSyntaxException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.transport.RefSpec;
-
-public class ProjectConfig extends VersionedMetaData implements ValidationError.Sink {
-  public static final String COMMENTLINK = "commentlink";
-  private static final String KEY_MATCH = "match";
-  private static final String KEY_HTML = "html";
-  private static final String KEY_LINK = "link";
-  private static final String KEY_ENABLED = "enabled";
-
-  public static final String PROJECT_CONFIG = "project.config";
-
-  private static final String PROJECT = "project";
-  private static final String KEY_DESCRIPTION = "description";
-  private static final String KEY_MATCH_AUTHOR_DATE_WITH_COMMITTER_DATE =
-      "matchAuthorToCommitterDate";
-
-  public static final String ACCESS = "access";
-  private static final String KEY_INHERIT_FROM = "inheritFrom";
-  private static final String KEY_GROUP_PERMISSIONS = "exclusiveGroupPermissions";
-
-  private static final String ACCOUNTS = "accounts";
-  private static final String KEY_SAME_GROUP_VISIBILITY = "sameGroupVisibility";
-
-  private static final String BRANCH_ORDER = "branchOrder";
-  private static final String BRANCH = "branch";
-
-  private static final String CONTRIBUTOR_AGREEMENT = "contributor-agreement";
-  private static final String KEY_ACCEPTED = "accepted";
-  private static final String KEY_AUTO_VERIFY = "autoVerify";
-  private static final String KEY_AGREEMENT_URL = "agreementUrl";
-
-  private static final String NOTIFY = "notify";
-  private static final String KEY_EMAIL = "email";
-  private static final String KEY_FILTER = "filter";
-  private static final String KEY_TYPE = "type";
-  private static final String KEY_HEADER = "header";
-
-  private static final String CAPABILITY = "capability";
-
-  private static final String RECEIVE = "receive";
-  private static final String KEY_REQUIRE_SIGNED_OFF_BY = "requireSignedOffBy";
-  private static final String KEY_REQUIRE_CHANGE_ID = "requireChangeId";
-  private static final String KEY_USE_ALL_NOT_IN_TARGET = "createNewChangeForAllNotInTarget";
-  private static final String KEY_MAX_OBJECT_SIZE_LIMIT = "maxObjectSizeLimit";
-  private static final String KEY_REQUIRE_CONTRIBUTOR_AGREEMENT = "requireContributorAgreement";
-  private static final String KEY_CHECK_RECEIVED_OBJECTS = "checkReceivedObjects";
-  private static final String KEY_ENABLE_SIGNED_PUSH = "enableSignedPush";
-  private static final String KEY_REQUIRE_SIGNED_PUSH = "requireSignedPush";
-  private static final String KEY_REJECT_IMPLICIT_MERGES = "rejectImplicitMerges";
-
-  private static final String CHANGE = "change";
-  private static final String KEY_PRIVATE_BY_DEFAULT = "privateByDefault";
-  private static final String KEY_WORK_IN_PROGRESS_BY_DEFAULT = "workInProgressByDefault";
-
-  private static final String SUBMIT = "submit";
-  private static final String KEY_ACTION = "action";
-  private static final String KEY_MERGE_CONTENT = "mergeContent";
-  private static final String KEY_STATE = "state";
-
-  private static final String SUBSCRIBE_SECTION = "allowSuperproject";
-  private static final String SUBSCRIBE_MATCH_REFS = "matching";
-  private static final String SUBSCRIBE_MULTI_MATCH_REFS = "all";
-
-  private static final String DASHBOARD = "dashboard";
-  private static final String KEY_DEFAULT = "default";
-  private static final String KEY_LOCAL_DEFAULT = "local-default";
-
-  private static final String LABEL = "label";
-  private static final String KEY_FUNCTION = "function";
-  private static final String KEY_DEFAULT_VALUE = "defaultValue";
-  private static final String KEY_COPY_MIN_SCORE = "copyMinScore";
-  private static final String KEY_ALLOW_POST_SUBMIT = "allowPostSubmit";
-  private static final String KEY_COPY_MAX_SCORE = "copyMaxScore";
-  private static final String KEY_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE =
-      "copyAllScoresOnMergeFirstParentUpdate";
-  private static final String KEY_COPY_ALL_SCORES_ON_TRIVIAL_REBASE =
-      "copyAllScoresOnTrivialRebase";
-  private static final String KEY_COPY_ALL_SCORES_IF_NO_CODE_CHANGE = "copyAllScoresIfNoCodeChange";
-  private static final String KEY_COPY_ALL_SCORES_IF_NO_CHANGE = "copyAllScoresIfNoChange";
-  private static final String KEY_VALUE = "value";
-  private static final String KEY_CAN_OVERRIDE = "canOverride";
-  private static final String KEY_BRANCH = "branch";
-
-  private static final String REVIEWER = "reviewer";
-  private static final String KEY_ENABLE_REVIEWER_BY_EMAIL = "enableByEmail";
-
-  private static final String LEGACY_PERMISSION_PUSH_TAG = "pushTag";
-  private static final String LEGACY_PERMISSION_PUSH_SIGNED_TAG = "pushSignedTag";
-
-  private static final String PLUGIN = "plugin";
-
-  private static final SubmitType DEFAULT_SUBMIT_ACTION = SubmitType.MERGE_IF_NECESSARY;
-  private static final ProjectState DEFAULT_STATE_VALUE = ProjectState.ACTIVE;
-
-  private static final String EXTENSION_PANELS = "extension-panels";
-  private static final String KEY_PANEL = "panel";
-
-  private Project.NameKey projectName;
-  private Project project;
-  private AccountsSection accountsSection;
-  private GroupList groupList;
-  private Map<String, AccessSection> accessSections;
-  private BranchOrderSection branchOrderSection;
-  private Map<String, ContributorAgreement> contributorAgreements;
-  private Map<String, NotifyConfig> notifySections;
-  private Map<String, LabelType> labelSections;
-  private ConfiguredMimeTypes mimeTypes;
-  private Map<Project.NameKey, SubscribeSection> subscribeSections;
-  private List<CommentLinkInfoImpl> commentLinkSections;
-  private List<ValidationError> validationErrors;
-  private ObjectId rulesId;
-  private long maxObjectSizeLimit;
-  private Map<String, Config> pluginConfigs;
-  private boolean checkReceivedObjects;
-  private Set<String> sectionsWithUnknownPermissions;
-  private boolean hasLegacyPermissions;
-  private Map<String, List<String>> extensionPanelSections;
-  private Map<String, GroupReference> groupsByName;
-
-  public static ProjectConfig read(MetaDataUpdate update)
-      throws IOException, ConfigInvalidException {
-    ProjectConfig r = new ProjectConfig(update.getProjectName());
-    r.load(update);
-    return r;
-  }
-
-  public static ProjectConfig read(MetaDataUpdate update, ObjectId id)
-      throws IOException, ConfigInvalidException {
-    ProjectConfig r = new ProjectConfig(update.getProjectName());
-    r.load(update, id);
-    return r;
-  }
-
-  public static CommentLinkInfoImpl buildCommentLink(Config cfg, String name, boolean allowRaw)
-      throws IllegalArgumentException {
-    String match = cfg.getString(COMMENTLINK, name, KEY_MATCH);
-    if (match != null) {
-      // Unfortunately this validation isn't entirely complete. Clients
-      // can have exceptions trying to evaluate the pattern if they don't
-      // support a token used, even if the server does support the token.
-      //
-      // At the minimum, we can trap problems related to unmatched groups.
-      Pattern.compile(match);
-    }
-
-    String link = cfg.getString(COMMENTLINK, name, KEY_LINK);
-    String html = cfg.getString(COMMENTLINK, name, KEY_HTML);
-    boolean hasHtml = !Strings.isNullOrEmpty(html);
-
-    String rawEnabled = cfg.getString(COMMENTLINK, name, KEY_ENABLED);
-    Boolean enabled;
-    if (rawEnabled != null) {
-      enabled = cfg.getBoolean(COMMENTLINK, name, KEY_ENABLED, true);
-    } else {
-      enabled = null;
-    }
-    checkArgument(allowRaw || !hasHtml, "Raw html replacement not allowed");
-
-    if (Strings.isNullOrEmpty(match)
-        && Strings.isNullOrEmpty(link)
-        && !hasHtml
-        && enabled != null) {
-      if (enabled) {
-        return new CommentLinkInfoImpl.Enabled(name);
-      }
-      return new CommentLinkInfoImpl.Disabled(name);
-    }
-    return new CommentLinkInfoImpl(name, match, link, html, enabled);
-  }
-
-  public ProjectConfig(Project.NameKey projectName) {
-    this.projectName = projectName;
-  }
-
-  public Project.NameKey getName() {
-    return projectName;
-  }
-
-  public Project getProject() {
-    return project;
-  }
-
-  public AccountsSection getAccountsSection() {
-    return accountsSection;
-  }
-
-  public Map<String, List<String>> getExtensionPanelSections() {
-    return extensionPanelSections;
-  }
-
-  public AccessSection getAccessSection(String name) {
-    return getAccessSection(name, false);
-  }
-
-  public AccessSection getAccessSection(String name, boolean create) {
-    AccessSection as = accessSections.get(name);
-    if (as == null && create) {
-      as = new AccessSection(name);
-      accessSections.put(name, as);
-    }
-    return as;
-  }
-
-  public Collection<AccessSection> getAccessSections() {
-    return sort(accessSections.values());
-  }
-
-  public BranchOrderSection getBranchOrderSection() {
-    return branchOrderSection;
-  }
-
-  public Map<Project.NameKey, SubscribeSection> getSubscribeSections() {
-    return subscribeSections;
-  }
-
-  public Collection<SubscribeSection> getSubscribeSections(Branch.NameKey branch) {
-    Collection<SubscribeSection> ret = new ArrayList<>();
-    for (SubscribeSection s : subscribeSections.values()) {
-      if (s.appliesTo(branch)) {
-        ret.add(s);
-      }
-    }
-    return ret;
-  }
-
-  public void addSubscribeSection(SubscribeSection s) {
-    subscribeSections.put(s.getProject(), s);
-  }
-
-  public void remove(AccessSection section) {
-    if (section != null) {
-      String name = section.getName();
-      if (sectionsWithUnknownPermissions.contains(name)) {
-        AccessSection a = accessSections.get(name);
-        a.setPermissions(new ArrayList<Permission>());
-      } else {
-        accessSections.remove(name);
-      }
-    }
-  }
-
-  public void remove(AccessSection section, Permission permission) {
-    if (permission == null) {
-      remove(section);
-    } else if (section != null) {
-      AccessSection a = accessSections.get(section.getName());
-      a.remove(permission);
-      if (a.getPermissions().isEmpty()) {
-        remove(a);
-      }
-    }
-  }
-
-  public void remove(AccessSection section, Permission permission, PermissionRule rule) {
-    if (rule == null) {
-      remove(section, permission);
-    } else if (section != null && permission != null) {
-      AccessSection a = accessSections.get(section.getName());
-      if (a == null) {
-        return;
-      }
-      Permission p = a.getPermission(permission.getName());
-      if (p == null) {
-        return;
-      }
-      p.remove(rule);
-      if (p.getRules().isEmpty()) {
-        a.remove(permission);
-      }
-      if (a.getPermissions().isEmpty()) {
-        remove(a);
-      }
-    }
-  }
-
-  public void replace(AccessSection section) {
-    for (Permission permission : section.getPermissions()) {
-      for (PermissionRule rule : permission.getRules()) {
-        rule.setGroup(resolve(rule.getGroup()));
-      }
-    }
-
-    accessSections.put(section.getName(), section);
-  }
-
-  public ContributorAgreement getContributorAgreement(String name) {
-    return getContributorAgreement(name, false);
-  }
-
-  public ContributorAgreement getContributorAgreement(String name, boolean create) {
-    ContributorAgreement ca = contributorAgreements.get(name);
-    if (ca == null && create) {
-      ca = new ContributorAgreement(name);
-      contributorAgreements.put(name, ca);
-    }
-    return ca;
-  }
-
-  public Collection<ContributorAgreement> getContributorAgreements() {
-    return sort(contributorAgreements.values());
-  }
-
-  public void remove(ContributorAgreement section) {
-    if (section != null) {
-      accessSections.remove(section.getName());
-    }
-  }
-
-  public void replace(ContributorAgreement section) {
-    section.setAutoVerify(resolve(section.getAutoVerify()));
-    for (PermissionRule rule : section.getAccepted()) {
-      rule.setGroup(resolve(rule.getGroup()));
-    }
-
-    contributorAgreements.put(section.getName(), section);
-  }
-
-  public Collection<NotifyConfig> getNotifyConfigs() {
-    return notifySections.values();
-  }
-
-  public void putNotifyConfig(String name, NotifyConfig nc) {
-    notifySections.put(name, nc);
-  }
-
-  public Map<String, LabelType> getLabelSections() {
-    return labelSections;
-  }
-
-  public Collection<CommentLinkInfoImpl> getCommentLinkSections() {
-    return commentLinkSections;
-  }
-
-  public void addCommentLinkSection(CommentLinkInfoImpl commentLink) {
-    commentLinkSections.add(commentLink);
-  }
-
-  public ConfiguredMimeTypes getMimeTypes() {
-    return mimeTypes;
-  }
-
-  public GroupReference resolve(AccountGroup group) {
-    return resolve(GroupReference.forGroup(group));
-  }
-
-  public GroupReference resolve(GroupReference group) {
-    GroupReference groupRef = groupList.resolve(group);
-    if (groupRef != null
-        && groupRef.getUUID() != null
-        && !groupsByName.containsKey(groupRef.getName())) {
-      groupsByName.put(groupRef.getName(), groupRef);
-    }
-    return groupRef;
-  }
-
-  /** @return the group reference, if the group is used by at least one rule. */
-  public GroupReference getGroup(AccountGroup.UUID uuid) {
-    return groupList.byUUID(uuid);
-  }
-
-  /**
-   * @return the group reference corresponding to the specified group name if the group is used by
-   *     at least one rule or plugin value.
-   */
-  public GroupReference getGroup(String groupName) {
-    return groupsByName.get(groupName);
-  }
-
-  /** @return set of all groups used by this configuration. */
-  public Set<AccountGroup.UUID> getAllGroupUUIDs() {
-    return groupList.uuids();
-  }
-
-  /**
-   * @return the project's rules.pl ObjectId, if present in the branch. Null if it doesn't exist.
-   */
-  public ObjectId getRulesId() {
-    return rulesId;
-  }
-
-  /** @return the maxObjectSizeLimit configured on this project, or zero if not configured. */
-  public long getMaxObjectSizeLimit() {
-    return maxObjectSizeLimit;
-  }
-
-  /** @return the checkReceivedObjects for this project, default is true. */
-  public boolean getCheckReceivedObjects() {
-    return checkReceivedObjects;
-  }
-
-  /**
-   * Check all GroupReferences use current group name, repairing stale ones.
-   *
-   * @param groupBackend cache to use when looking up group information by UUID.
-   * @return true if one or more group names was stale.
-   */
-  public boolean updateGroupNames(GroupBackend groupBackend) {
-    boolean dirty = false;
-    for (GroupReference ref : groupList.references()) {
-      GroupDescription.Basic g = groupBackend.get(ref.getUUID());
-      if (g != null && !g.getName().equals(ref.getName())) {
-        dirty = true;
-        ref.setName(g.getName());
-      }
-    }
-    return dirty;
-  }
-
-  /**
-   * Get the validation errors, if any were discovered during load.
-   *
-   * @return list of errors; empty list if there are no errors.
-   */
-  public List<ValidationError> getValidationErrors() {
-    if (validationErrors != null) {
-      return Collections.unmodifiableList(validationErrors);
-    }
-    return Collections.emptyList();
-  }
-
-  @Override
-  protected String getRefName() {
-    return RefNames.REFS_CONFIG;
-  }
-
-  @Override
-  protected void onLoad() throws IOException, ConfigInvalidException {
-    readGroupList();
-    groupsByName = mapGroupReferences();
-
-    rulesId = getObjectId("rules.pl");
-    Config rc = readConfig(PROJECT_CONFIG);
-    project = new Project(projectName);
-
-    Project p = project;
-    p.setDescription(rc.getString(PROJECT, null, KEY_DESCRIPTION));
-    if (p.getDescription() == null) {
-      p.setDescription("");
-    }
-
-    if (rc.getStringList(ACCESS, null, KEY_INHERIT_FROM).length > 1) {
-      // The config must not contain more than one parent to inherit from
-      // as there is no guarantee which of the parents would be used then.
-      error(new ValidationError(PROJECT_CONFIG, "Cannot inherit from multiple projects"));
-    }
-    p.setParentName(rc.getString(ACCESS, null, KEY_INHERIT_FROM));
-
-    p.setUseContributorAgreements(
-        getEnum(rc, RECEIVE, null, KEY_REQUIRE_CONTRIBUTOR_AGREEMENT, InheritableBoolean.INHERIT));
-    p.setUseSignedOffBy(
-        getEnum(rc, RECEIVE, null, KEY_REQUIRE_SIGNED_OFF_BY, InheritableBoolean.INHERIT));
-    p.setRequireChangeID(
-        getEnum(rc, RECEIVE, null, KEY_REQUIRE_CHANGE_ID, InheritableBoolean.INHERIT));
-    p.setCreateNewChangeForAllNotInTarget(
-        getEnum(rc, RECEIVE, null, KEY_USE_ALL_NOT_IN_TARGET, InheritableBoolean.INHERIT));
-    p.setEnableSignedPush(
-        getEnum(rc, RECEIVE, null, KEY_ENABLE_SIGNED_PUSH, InheritableBoolean.INHERIT));
-    p.setRequireSignedPush(
-        getEnum(rc, RECEIVE, null, KEY_REQUIRE_SIGNED_PUSH, InheritableBoolean.INHERIT));
-    p.setMaxObjectSizeLimit(rc.getString(RECEIVE, null, KEY_MAX_OBJECT_SIZE_LIMIT));
-    p.setRejectImplicitMerges(
-        getEnum(rc, RECEIVE, null, KEY_REJECT_IMPLICIT_MERGES, InheritableBoolean.INHERIT));
-
-    p.setPrivateByDefault(
-        getEnum(rc, CHANGE, null, KEY_PRIVATE_BY_DEFAULT, InheritableBoolean.INHERIT));
-
-    p.setWorkInProgressByDefault(
-        getEnum(rc, CHANGE, null, KEY_WORK_IN_PROGRESS_BY_DEFAULT, InheritableBoolean.INHERIT));
-
-    p.setEnableReviewerByEmail(
-        getEnum(rc, REVIEWER, null, KEY_ENABLE_REVIEWER_BY_EMAIL, InheritableBoolean.INHERIT));
-
-    p.setSubmitType(getEnum(rc, SUBMIT, null, KEY_ACTION, DEFAULT_SUBMIT_ACTION));
-    p.setUseContentMerge(getEnum(rc, SUBMIT, null, KEY_MERGE_CONTENT, InheritableBoolean.INHERIT));
-    p.setMatchAuthorToCommitterDate(
-        getEnum(
-            rc,
-            SUBMIT,
-            null,
-            KEY_MATCH_AUTHOR_DATE_WITH_COMMITTER_DATE,
-            InheritableBoolean.INHERIT));
-    p.setState(getEnum(rc, PROJECT, null, KEY_STATE, DEFAULT_STATE_VALUE));
-
-    p.setDefaultDashboard(rc.getString(DASHBOARD, null, KEY_DEFAULT));
-    p.setLocalDefaultDashboard(rc.getString(DASHBOARD, null, KEY_LOCAL_DEFAULT));
-
-    loadAccountsSection(rc);
-    loadContributorAgreements(rc);
-    loadAccessSections(rc);
-    loadBranchOrderSection(rc);
-    loadNotifySections(rc);
-    loadLabelSections(rc);
-    loadCommentLinkSections(rc);
-    loadSubscribeSections(rc);
-    mimeTypes = new ConfiguredMimeTypes(projectName.get(), rc);
-    loadPluginSections(rc);
-    loadReceiveSection(rc);
-    loadExtensionPanelSections(rc);
-  }
-
-  private void loadAccountsSection(Config rc) {
-    accountsSection = new AccountsSection();
-    accountsSection.setSameGroupVisibility(
-        loadPermissionRules(rc, ACCOUNTS, null, KEY_SAME_GROUP_VISIBILITY, groupsByName, false));
-  }
-
-  private void loadExtensionPanelSections(Config rc) {
-    Map<String, String> lowerNames = Maps.newHashMapWithExpectedSize(2);
-    extensionPanelSections = Maps.newLinkedHashMap();
-    for (String name : rc.getSubsections(EXTENSION_PANELS)) {
-      String lower = name.toLowerCase();
-      if (lowerNames.containsKey(lower)) {
-        error(
-            new ValidationError(
-                PROJECT_CONFIG,
-                String.format(
-                    "Extension Panels \"%s\" conflicts with \"%s\"", name, lowerNames.get(lower))));
-      }
-      lowerNames.put(lower, name);
-      extensionPanelSections.put(
-          name,
-          new ArrayList<>(Arrays.asList(rc.getStringList(EXTENSION_PANELS, name, KEY_PANEL))));
-    }
-  }
-
-  private void loadContributorAgreements(Config rc) {
-    contributorAgreements = new HashMap<>();
-    for (String name : rc.getSubsections(CONTRIBUTOR_AGREEMENT)) {
-      ContributorAgreement ca = getContributorAgreement(name, true);
-      ca.setDescription(rc.getString(CONTRIBUTOR_AGREEMENT, name, KEY_DESCRIPTION));
-      ca.setAgreementUrl(rc.getString(CONTRIBUTOR_AGREEMENT, name, KEY_AGREEMENT_URL));
-      ca.setAccepted(
-          loadPermissionRules(rc, CONTRIBUTOR_AGREEMENT, name, KEY_ACCEPTED, groupsByName, false));
-
-      List<PermissionRule> rules =
-          loadPermissionRules(
-              rc, CONTRIBUTOR_AGREEMENT, name, KEY_AUTO_VERIFY, groupsByName, false);
-      if (rules.isEmpty()) {
-        ca.setAutoVerify(null);
-      } else if (rules.size() > 1) {
-        error(
-            new ValidationError(
-                PROJECT_CONFIG,
-                "Invalid rule in "
-                    + CONTRIBUTOR_AGREEMENT
-                    + "."
-                    + name
-                    + "."
-                    + KEY_AUTO_VERIFY
-                    + ": at most one group may be set"));
-      } else if (rules.get(0).getAction() != Action.ALLOW) {
-        error(
-            new ValidationError(
-                PROJECT_CONFIG,
-                "Invalid rule in "
-                    + CONTRIBUTOR_AGREEMENT
-                    + "."
-                    + name
-                    + "."
-                    + KEY_AUTO_VERIFY
-                    + ": the group must be allowed"));
-      } else {
-        ca.setAutoVerify(rules.get(0).getGroup());
-      }
-    }
-  }
-
-  /**
-   * Parses the [notify] sections out of the configuration file.
-   *
-   * <pre>
-   *   [notify "reviewers"]
-   *     email = group Reviewers
-   *     type = new_changes
-   *
-   *   [notify "dev-team"]
-   *     email = dev-team@example.com
-   *     filter = branch:master
-   *
-   *   [notify "qa"]
-   *     email = qa@example.com
-   *     filter = branch:\"^(maint|stable)-.*\"
-   *     type = submitted_changes
-   * </pre>
-   */
-  private void loadNotifySections(Config rc) {
-    notifySections = new HashMap<>();
-    for (String sectionName : rc.getSubsections(NOTIFY)) {
-      NotifyConfig n = new NotifyConfig();
-      n.setName(sectionName);
-      n.setFilter(rc.getString(NOTIFY, sectionName, KEY_FILTER));
-
-      EnumSet<NotifyType> types = EnumSet.noneOf(NotifyType.class);
-      types.addAll(ConfigUtil.getEnumList(rc, NOTIFY, sectionName, KEY_TYPE, NotifyType.ALL));
-      n.setTypes(types);
-      n.setHeader(rc.getEnum(NOTIFY, sectionName, KEY_HEADER, NotifyConfig.Header.BCC));
-
-      for (String dst : rc.getStringList(NOTIFY, sectionName, KEY_EMAIL)) {
-        String groupName = GroupReference.extractGroupName(dst);
-        if (groupName != null) {
-          GroupReference ref = groupsByName.get(groupName);
-          if (ref == null) {
-            ref = new GroupReference(null, groupName);
-            groupsByName.put(ref.getName(), ref);
-          }
-          if (ref.getUUID() != null) {
-            n.addEmail(ref);
-          } else {
-            error(
-                new ValidationError(
-                    PROJECT_CONFIG,
-                    "group \"" + ref.getName() + "\" not in " + GroupList.FILE_NAME));
-          }
-        } else if (dst.startsWith("user ")) {
-          error(new ValidationError(PROJECT_CONFIG, dst + " not supported"));
-        } else {
-          try {
-            n.addEmail(Address.parse(dst));
-          } catch (IllegalArgumentException err) {
-            error(
-                new ValidationError(
-                    PROJECT_CONFIG,
-                    "notify section \"" + sectionName + "\" has invalid email \"" + dst + "\""));
-          }
-        }
-      }
-      notifySections.put(sectionName, n);
-    }
-  }
-
-  private void loadAccessSections(Config rc) {
-    accessSections = new HashMap<>();
-    sectionsWithUnknownPermissions = new HashSet<>();
-    for (String refName : rc.getSubsections(ACCESS)) {
-      if (RefConfigSection.isValid(refName) && isValidRegex(refName)) {
-        AccessSection as = getAccessSection(refName, true);
-
-        for (String varName : rc.getStringList(ACCESS, refName, KEY_GROUP_PERMISSIONS)) {
-          for (String n : varName.split("[, \t]{1,}")) {
-            n = convertLegacyPermission(n);
-            if (isPermission(n)) {
-              as.getPermission(n, true).setExclusiveGroup(true);
-            }
-          }
-        }
-
-        for (String varName : rc.getNames(ACCESS, refName)) {
-          String convertedName = convertLegacyPermission(varName);
-          if (isPermission(convertedName)) {
-            Permission perm = as.getPermission(convertedName, true);
-            loadPermissionRules(
-                rc,
-                ACCESS,
-                refName,
-                varName,
-                groupsByName,
-                perm,
-                Permission.hasRange(convertedName));
-          } else {
-            sectionsWithUnknownPermissions.add(as.getName());
-          }
-        }
-      }
-    }
-
-    AccessSection capability = null;
-    for (String varName : rc.getNames(CAPABILITY)) {
-      if (capability == null) {
-        capability = new AccessSection(AccessSection.GLOBAL_CAPABILITIES);
-        accessSections.put(AccessSection.GLOBAL_CAPABILITIES, capability);
-      }
-      Permission perm = capability.getPermission(varName, true);
-      loadPermissionRules(
-          rc, CAPABILITY, null, varName, groupsByName, perm, GlobalCapability.hasRange(varName));
-    }
-  }
-
-  private boolean isValidRegex(String refPattern) {
-    try {
-      RefPattern.validateRegExp(refPattern);
-    } catch (InvalidNameException e) {
-      error(new ValidationError(PROJECT_CONFIG, "Invalid ref name: " + e.getMessage()));
-      return false;
-    }
-    return true;
-  }
-
-  private void loadBranchOrderSection(Config rc) {
-    if (rc.getSections().contains(BRANCH_ORDER)) {
-      branchOrderSection = new BranchOrderSection(rc.getStringList(BRANCH_ORDER, null, BRANCH));
-    }
-  }
-
-  private List<PermissionRule> loadPermissionRules(
-      Config rc,
-      String section,
-      String subsection,
-      String varName,
-      Map<String, GroupReference> groupsByName,
-      boolean useRange) {
-    Permission perm = new Permission(varName);
-    loadPermissionRules(rc, section, subsection, varName, groupsByName, perm, useRange);
-    return perm.getRules();
-  }
-
-  private void loadPermissionRules(
-      Config rc,
-      String section,
-      String subsection,
-      String varName,
-      Map<String, GroupReference> groupsByName,
-      Permission perm,
-      boolean useRange) {
-    for (String ruleString : rc.getStringList(section, subsection, varName)) {
-      PermissionRule rule;
-      try {
-        rule = PermissionRule.fromString(ruleString, useRange);
-      } catch (IllegalArgumentException notRule) {
-        error(
-            new ValidationError(
-                PROJECT_CONFIG,
-                "Invalid rule in "
-                    + section
-                    + (subsection != null ? "." + subsection : "")
-                    + "."
-                    + varName
-                    + ": "
-                    + notRule.getMessage()));
-        continue;
-      }
-
-      GroupReference ref = groupsByName.get(rule.getGroup().getName());
-      if (ref == null) {
-        // The group wasn't mentioned in the groups table, so there is
-        // no valid UUID for it. Pool the reference anyway so at least
-        // all rules in the same file share the same GroupReference.
-        //
-        ref = rule.getGroup();
-        groupsByName.put(ref.getName(), ref);
-        error(
-            new ValidationError(
-                PROJECT_CONFIG, "group \"" + ref.getName() + "\" not in " + GroupList.FILE_NAME));
-      }
-
-      rule.setGroup(ref);
-      perm.add(rule);
-    }
-  }
-
-  private static LabelValue parseLabelValue(String src) {
-    List<String> parts =
-        ImmutableList.copyOf(
-            Splitter.on(CharMatcher.whitespace()).omitEmptyStrings().limit(2).split(src));
-    if (parts.isEmpty()) {
-      throw new IllegalArgumentException("empty value");
-    }
-    String valueText = parts.size() > 1 ? parts.get(1) : "";
-    return new LabelValue(Shorts.checkedCast(PermissionRule.parseInt(parts.get(0))), valueText);
-  }
-
-  private void loadLabelSections(Config rc) {
-    Map<String, String> lowerNames = Maps.newHashMapWithExpectedSize(2);
-    labelSections = new LinkedHashMap<>();
-    for (String name : rc.getSubsections(LABEL)) {
-      String lower = name.toLowerCase();
-      if (lowerNames.containsKey(lower)) {
-        error(
-            new ValidationError(
-                PROJECT_CONFIG,
-                String.format("Label \"%s\" conflicts with \"%s\"", name, lowerNames.get(lower))));
-      }
-      lowerNames.put(lower, name);
-
-      List<LabelValue> values = new ArrayList<>();
-      for (String value : rc.getStringList(LABEL, name, KEY_VALUE)) {
-        try {
-          values.add(parseLabelValue(value));
-        } catch (IllegalArgumentException notValue) {
-          error(
-              new ValidationError(
-                  PROJECT_CONFIG,
-                  String.format(
-                      "Invalid %s \"%s\" for label \"%s\": %s",
-                      KEY_VALUE, value, name, notValue.getMessage())));
-        }
-      }
-
-      LabelType label;
-      try {
-        label = new LabelType(name, values);
-      } catch (IllegalArgumentException badName) {
-        error(new ValidationError(PROJECT_CONFIG, String.format("Invalid label \"%s\"", name)));
-        continue;
-      }
-
-      String functionName = rc.getString(LABEL, name, KEY_FUNCTION);
-      Optional<LabelFunction> function =
-          functionName != null
-              ? LabelFunction.parse(functionName)
-              : Optional.of(LabelFunction.MAX_WITH_BLOCK);
-      if (!function.isPresent()) {
-        error(
-            new ValidationError(
-                PROJECT_CONFIG,
-                String.format(
-                    "Invalid %s for label \"%s\". Valid names are: %s",
-                    KEY_FUNCTION, name, Joiner.on(", ").join(LabelFunction.ALL.keySet()))));
-      }
-      label.setFunction(function.orElse(null));
-
-      if (!values.isEmpty()) {
-        short dv = (short) rc.getInt(LABEL, name, KEY_DEFAULT_VALUE, 0);
-        if (isInRange(dv, values)) {
-          label.setDefaultValue(dv);
-        } else {
-          error(
-              new ValidationError(
-                  PROJECT_CONFIG,
-                  String.format(
-                      "Invalid %s \"%s\" for label \"%s\"", KEY_DEFAULT_VALUE, dv, name)));
-        }
-      }
-      label.setAllowPostSubmit(
-          rc.getBoolean(LABEL, name, KEY_ALLOW_POST_SUBMIT, LabelType.DEF_ALLOW_POST_SUBMIT));
-      label.setCopyMinScore(
-          rc.getBoolean(LABEL, name, KEY_COPY_MIN_SCORE, LabelType.DEF_COPY_MIN_SCORE));
-      label.setCopyMaxScore(
-          rc.getBoolean(LABEL, name, KEY_COPY_MAX_SCORE, LabelType.DEF_COPY_MAX_SCORE));
-      label.setCopyAllScoresOnMergeFirstParentUpdate(
-          rc.getBoolean(
-              LABEL,
-              name,
-              KEY_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE,
-              LabelType.DEF_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE));
-      label.setCopyAllScoresOnTrivialRebase(
-          rc.getBoolean(
-              LABEL,
-              name,
-              KEY_COPY_ALL_SCORES_ON_TRIVIAL_REBASE,
-              LabelType.DEF_COPY_ALL_SCORES_ON_TRIVIAL_REBASE));
-      label.setCopyAllScoresIfNoCodeChange(
-          rc.getBoolean(
-              LABEL,
-              name,
-              KEY_COPY_ALL_SCORES_IF_NO_CODE_CHANGE,
-              LabelType.DEF_COPY_ALL_SCORES_IF_NO_CODE_CHANGE));
-      label.setCopyAllScoresIfNoChange(
-          rc.getBoolean(
-              LABEL,
-              name,
-              KEY_COPY_ALL_SCORES_IF_NO_CHANGE,
-              LabelType.DEF_COPY_ALL_SCORES_IF_NO_CHANGE));
-      label.setCanOverride(
-          rc.getBoolean(LABEL, name, KEY_CAN_OVERRIDE, LabelType.DEF_CAN_OVERRIDE));
-      label.setRefPatterns(getStringListOrNull(rc, LABEL, name, KEY_BRANCH));
-      labelSections.put(name, label);
-    }
-  }
-
-  private boolean isInRange(short value, List<LabelValue> labelValues) {
-    for (LabelValue lv : labelValues) {
-      if (lv.getValue() == value) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  private List<String> getStringListOrNull(
-      Config rc, String section, String subSection, String name) {
-    String[] ac = rc.getStringList(section, subSection, name);
-    return ac.length == 0 ? null : Arrays.asList(ac);
-  }
-
-  private void loadCommentLinkSections(Config rc) {
-    Set<String> subsections = rc.getSubsections(COMMENTLINK);
-    commentLinkSections = Lists.newArrayListWithCapacity(subsections.size());
-    for (String name : subsections) {
-      try {
-        commentLinkSections.add(buildCommentLink(rc, name, false));
-      } catch (PatternSyntaxException e) {
-        error(
-            new ValidationError(
-                PROJECT_CONFIG,
-                String.format(
-                    "Invalid pattern \"%s\" in commentlink.%s.match: %s",
-                    rc.getString(COMMENTLINK, name, KEY_MATCH), name, e.getMessage())));
-      } catch (IllegalArgumentException e) {
-        error(
-            new ValidationError(
-                PROJECT_CONFIG,
-                String.format(
-                    "Error in pattern \"%s\" in commentlink.%s.match: %s",
-                    rc.getString(COMMENTLINK, name, KEY_MATCH), name, e.getMessage())));
-      }
-    }
-  }
-
-  private void loadSubscribeSections(Config rc) throws ConfigInvalidException {
-    Set<String> subsections = rc.getSubsections(SUBSCRIBE_SECTION);
-    subscribeSections = new HashMap<>();
-    try {
-      for (String projectName : subsections) {
-        Project.NameKey p = new Project.NameKey(projectName);
-        SubscribeSection ss = new SubscribeSection(p);
-        for (String s :
-            rc.getStringList(SUBSCRIBE_SECTION, projectName, SUBSCRIBE_MULTI_MATCH_REFS)) {
-          ss.addMultiMatchRefSpec(s);
-        }
-        for (String s : rc.getStringList(SUBSCRIBE_SECTION, projectName, SUBSCRIBE_MATCH_REFS)) {
-          ss.addMatchingRefSpec(s);
-        }
-        subscribeSections.put(p, ss);
-      }
-    } catch (IllegalArgumentException e) {
-      throw new ConfigInvalidException(e.getMessage());
-    }
-  }
-
-  private void loadReceiveSection(Config rc) {
-    checkReceivedObjects = rc.getBoolean(RECEIVE, KEY_CHECK_RECEIVED_OBJECTS, true);
-    maxObjectSizeLimit = rc.getLong(RECEIVE, null, KEY_MAX_OBJECT_SIZE_LIMIT, 0);
-  }
-
-  private void loadPluginSections(Config rc) {
-    pluginConfigs = new HashMap<>();
-    for (String plugin : rc.getSubsections(PLUGIN)) {
-      Config pluginConfig = new Config();
-      pluginConfigs.put(plugin, pluginConfig);
-      for (String name : rc.getNames(PLUGIN, plugin)) {
-        String value = rc.getString(PLUGIN, plugin, name);
-        String groupName = GroupReference.extractGroupName(value);
-        if (groupName != null) {
-          GroupReference ref = groupsByName.get(groupName);
-          if (ref == null) {
-            error(
-                new ValidationError(
-                    PROJECT_CONFIG, "group \"" + groupName + "\" not in " + GroupList.FILE_NAME));
-          }
-          rc.setString(PLUGIN, plugin, name, value);
-        }
-        pluginConfig.setStringList(
-            PLUGIN, plugin, name, Arrays.asList(rc.getStringList(PLUGIN, plugin, name)));
-      }
-    }
-  }
-
-  public PluginConfig getPluginConfig(String pluginName) {
-    Config pluginConfig = pluginConfigs.get(pluginName);
-    if (pluginConfig == null) {
-      pluginConfig = new Config();
-      pluginConfigs.put(pluginName, pluginConfig);
-    }
-    return new PluginConfig(pluginName, pluginConfig, this);
-  }
-
-  private void readGroupList() throws IOException {
-    groupList = GroupList.parse(projectName, readUTF8(GroupList.FILE_NAME), this);
-  }
-
-  private Map<String, GroupReference> mapGroupReferences() {
-    Collection<GroupReference> references = groupList.references();
-    Map<String, GroupReference> result = new HashMap<>(references.size());
-    for (GroupReference ref : references) {
-      result.put(ref.getName(), ref);
-    }
-
-    return result;
-  }
-
-  @Override
-  protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException {
-    if (commit.getMessage() == null || "".equals(commit.getMessage())) {
-      commit.setMessage("Updated project configuration\n");
-    }
-
-    Config rc = readConfig(PROJECT_CONFIG);
-    Project p = project;
-
-    if (p.getDescription() != null && !p.getDescription().isEmpty()) {
-      rc.setString(PROJECT, null, KEY_DESCRIPTION, p.getDescription());
-    } else {
-      rc.unset(PROJECT, null, KEY_DESCRIPTION);
-    }
-    set(rc, ACCESS, null, KEY_INHERIT_FROM, p.getParentName());
-    set(
-        rc,
-        RECEIVE,
-        null,
-        KEY_REQUIRE_CONTRIBUTOR_AGREEMENT,
-        p.getUseContributorAgreements(),
-        InheritableBoolean.INHERIT);
-    set(
-        rc,
-        RECEIVE,
-        null,
-        KEY_REQUIRE_SIGNED_OFF_BY,
-        p.getUseSignedOffBy(),
-        InheritableBoolean.INHERIT);
-    set(
-        rc,
-        RECEIVE,
-        null,
-        KEY_REQUIRE_CHANGE_ID,
-        p.getRequireChangeID(),
-        InheritableBoolean.INHERIT);
-    set(
-        rc,
-        RECEIVE,
-        null,
-        KEY_USE_ALL_NOT_IN_TARGET,
-        p.getCreateNewChangeForAllNotInTarget(),
-        InheritableBoolean.INHERIT);
-    set(
-        rc,
-        RECEIVE,
-        null,
-        KEY_MAX_OBJECT_SIZE_LIMIT,
-        validMaxObjectSizeLimit(p.getMaxObjectSizeLimit()));
-    set(
-        rc,
-        RECEIVE,
-        null,
-        KEY_ENABLE_SIGNED_PUSH,
-        p.getEnableSignedPush(),
-        InheritableBoolean.INHERIT);
-    set(
-        rc,
-        RECEIVE,
-        null,
-        KEY_REQUIRE_SIGNED_PUSH,
-        p.getRequireSignedPush(),
-        InheritableBoolean.INHERIT);
-    set(
-        rc,
-        RECEIVE,
-        null,
-        KEY_REJECT_IMPLICIT_MERGES,
-        p.getRejectImplicitMerges(),
-        InheritableBoolean.INHERIT);
-
-    set(
-        rc,
-        CHANGE,
-        null,
-        KEY_PRIVATE_BY_DEFAULT,
-        p.getPrivateByDefault(),
-        InheritableBoolean.INHERIT);
-
-    set(
-        rc,
-        CHANGE,
-        null,
-        KEY_WORK_IN_PROGRESS_BY_DEFAULT,
-        p.getWorkInProgressByDefault(),
-        InheritableBoolean.INHERIT);
-
-    set(
-        rc,
-        REVIEWER,
-        null,
-        KEY_ENABLE_REVIEWER_BY_EMAIL,
-        p.getEnableReviewerByEmail(),
-        InheritableBoolean.INHERIT);
-
-    set(rc, SUBMIT, null, KEY_ACTION, p.getSubmitType(), DEFAULT_SUBMIT_ACTION);
-    set(rc, SUBMIT, null, KEY_MERGE_CONTENT, p.getUseContentMerge(), InheritableBoolean.INHERIT);
-    set(
-        rc,
-        SUBMIT,
-        null,
-        KEY_MATCH_AUTHOR_DATE_WITH_COMMITTER_DATE,
-        p.getMatchAuthorToCommitterDate(),
-        InheritableBoolean.INHERIT);
-
-    set(rc, PROJECT, null, KEY_STATE, p.getState(), DEFAULT_STATE_VALUE);
-
-    set(rc, DASHBOARD, null, KEY_DEFAULT, p.getDefaultDashboard());
-    set(rc, DASHBOARD, null, KEY_LOCAL_DEFAULT, p.getLocalDefaultDashboard());
-
-    Set<AccountGroup.UUID> keepGroups = new HashSet<>();
-    saveAccountsSection(rc, keepGroups);
-    saveContributorAgreements(rc, keepGroups);
-    saveAccessSections(rc, keepGroups);
-    saveNotifySections(rc, keepGroups);
-    savePluginSections(rc, keepGroups);
-    groupList.retainUUIDs(keepGroups);
-    saveLabelSections(rc);
-    saveCommentLinkSections(rc);
-    saveSubscribeSections(rc);
-
-    saveConfig(PROJECT_CONFIG, rc);
-    saveGroupList();
-    return true;
-  }
-
-  public static String validMaxObjectSizeLimit(String value) throws ConfigInvalidException {
-    if (value == null) {
-      return null;
-    }
-    value = value.trim();
-    if (value.isEmpty()) {
-      return null;
-    }
-    Config cfg = new Config();
-    cfg.fromText("[s]\nn=" + value);
-    try {
-      long s = cfg.getLong("s", "n", 0);
-      if (s < 0) {
-        throw new ConfigInvalidException(
-            String.format(
-                "Negative value '%s' not allowed as %s", value, KEY_MAX_OBJECT_SIZE_LIMIT));
-      }
-      if (s == 0) {
-        // return null for the default so that it is not persisted
-        return null;
-      }
-      return value;
-    } catch (IllegalArgumentException e) {
-      throw new ConfigInvalidException(
-          String.format("Value '%s' not parseable as a Long", value), e);
-    }
-  }
-
-  private void saveAccountsSection(Config rc, Set<AccountGroup.UUID> keepGroups) {
-    if (accountsSection != null) {
-      rc.setStringList(
-          ACCOUNTS,
-          null,
-          KEY_SAME_GROUP_VISIBILITY,
-          ruleToStringList(accountsSection.getSameGroupVisibility(), keepGroups));
-    }
-  }
-
-  private void saveContributorAgreements(Config rc, Set<AccountGroup.UUID> keepGroups) {
-    for (ContributorAgreement ca : sort(contributorAgreements.values())) {
-      set(rc, CONTRIBUTOR_AGREEMENT, ca.getName(), KEY_DESCRIPTION, ca.getDescription());
-      set(rc, CONTRIBUTOR_AGREEMENT, ca.getName(), KEY_AGREEMENT_URL, ca.getAgreementUrl());
-
-      if (ca.getAutoVerify() != null) {
-        if (ca.getAutoVerify().getUUID() != null) {
-          keepGroups.add(ca.getAutoVerify().getUUID());
-        }
-        String autoVerify = new PermissionRule(ca.getAutoVerify()).asString(false);
-        set(rc, CONTRIBUTOR_AGREEMENT, ca.getName(), KEY_AUTO_VERIFY, autoVerify);
-      } else {
-        rc.unset(CONTRIBUTOR_AGREEMENT, ca.getName(), KEY_AUTO_VERIFY);
-      }
-
-      rc.setStringList(
-          CONTRIBUTOR_AGREEMENT,
-          ca.getName(),
-          KEY_ACCEPTED,
-          ruleToStringList(ca.getAccepted(), keepGroups));
-    }
-  }
-
-  private void saveNotifySections(Config rc, Set<AccountGroup.UUID> keepGroups) {
-    for (NotifyConfig nc : sort(notifySections.values())) {
-      List<String> email = new ArrayList<>();
-      for (GroupReference gr : nc.getGroups()) {
-        if (gr.getUUID() != null) {
-          keepGroups.add(gr.getUUID());
-        }
-        email.add(new PermissionRule(gr).asString(false));
-      }
-      Collections.sort(email);
-
-      List<String> addrs = new ArrayList<>();
-      for (Address addr : nc.getAddresses()) {
-        addrs.add(addr.toString());
-      }
-      Collections.sort(addrs);
-      email.addAll(addrs);
-
-      set(rc, NOTIFY, nc.getName(), KEY_HEADER, nc.getHeader(), NotifyConfig.Header.BCC);
-      if (email.isEmpty()) {
-        rc.unset(NOTIFY, nc.getName(), KEY_EMAIL);
-      } else {
-        rc.setStringList(NOTIFY, nc.getName(), KEY_EMAIL, email);
-      }
-
-      if (nc.getNotify().equals(EnumSet.of(NotifyType.ALL))) {
-        rc.unset(NOTIFY, nc.getName(), KEY_TYPE);
-      } else {
-        List<String> types = Lists.newArrayListWithCapacity(4);
-        for (NotifyType t : NotifyType.values()) {
-          if (nc.isNotify(t)) {
-            types.add(t.name().toLowerCase(Locale.US));
-          }
-        }
-        rc.setStringList(NOTIFY, nc.getName(), KEY_TYPE, types);
-      }
-
-      set(rc, NOTIFY, nc.getName(), KEY_FILTER, nc.getFilter());
-    }
-  }
-
-  private List<String> ruleToStringList(
-      List<PermissionRule> list, Set<AccountGroup.UUID> keepGroups) {
-    List<String> rules = new ArrayList<>();
-    for (PermissionRule rule : sort(list)) {
-      if (rule.getGroup().getUUID() != null) {
-        keepGroups.add(rule.getGroup().getUUID());
-      }
-      rules.add(rule.asString(false));
-    }
-    return rules;
-  }
-
-  private void saveAccessSections(Config rc, Set<AccountGroup.UUID> keepGroups) {
-    AccessSection capability = accessSections.get(AccessSection.GLOBAL_CAPABILITIES);
-    if (capability != null) {
-      Set<String> have = new HashSet<>();
-      for (Permission permission : sort(capability.getPermissions())) {
-        have.add(permission.getName().toLowerCase());
-
-        boolean needRange = GlobalCapability.hasRange(permission.getName());
-        List<String> rules = new ArrayList<>();
-        for (PermissionRule rule : sort(permission.getRules())) {
-          GroupReference group = resolve(rule.getGroup());
-          if (group.getUUID() != null) {
-            keepGroups.add(group.getUUID());
-          }
-          rules.add(rule.asString(needRange));
-        }
-        rc.setStringList(CAPABILITY, null, permission.getName(), rules);
-      }
-      for (String varName : rc.getNames(CAPABILITY)) {
-        if (!have.contains(varName.toLowerCase())) {
-          rc.unset(CAPABILITY, null, varName);
-        }
-      }
-    } else {
-      rc.unsetSection(CAPABILITY, null);
-    }
-
-    for (AccessSection as : sort(accessSections.values())) {
-      String refName = as.getName();
-      if (AccessSection.GLOBAL_CAPABILITIES.equals(refName)) {
-        continue;
-      }
-
-      StringBuilder doNotInherit = new StringBuilder();
-      for (Permission perm : sort(as.getPermissions())) {
-        if (perm.getExclusiveGroup()) {
-          if (0 < doNotInherit.length()) {
-            doNotInherit.append(' ');
-          }
-          doNotInherit.append(perm.getName());
-        }
-      }
-      if (0 < doNotInherit.length()) {
-        rc.setString(ACCESS, refName, KEY_GROUP_PERMISSIONS, doNotInherit.toString());
-      } else {
-        rc.unset(ACCESS, refName, KEY_GROUP_PERMISSIONS);
-      }
-
-      Set<String> have = new HashSet<>();
-      for (Permission permission : sort(as.getPermissions())) {
-        have.add(permission.getName().toLowerCase());
-
-        boolean needRange = Permission.hasRange(permission.getName());
-        List<String> rules = new ArrayList<>();
-        for (PermissionRule rule : sort(permission.getRules())) {
-          GroupReference group = resolve(rule.getGroup());
-          if (group.getUUID() != null) {
-            keepGroups.add(group.getUUID());
-          }
-          rules.add(rule.asString(needRange));
-        }
-        rc.setStringList(ACCESS, refName, permission.getName(), rules);
-      }
-
-      for (String varName : rc.getNames(ACCESS, refName)) {
-        if (isPermission(convertLegacyPermission(varName))
-            && !have.contains(varName.toLowerCase())) {
-          rc.unset(ACCESS, refName, varName);
-        }
-      }
-    }
-
-    for (String name : rc.getSubsections(ACCESS)) {
-      if (RefConfigSection.isValid(name) && !accessSections.containsKey(name)) {
-        rc.unsetSection(ACCESS, name);
-      }
-    }
-  }
-
-  private void saveLabelSections(Config rc) {
-    List<String> existing = Lists.newArrayList(rc.getSubsections(LABEL));
-    if (!Lists.newArrayList(labelSections.keySet()).equals(existing)) {
-      // Order of sections changed, remove and rewrite them all.
-      for (String name : existing) {
-        rc.unsetSection(LABEL, name);
-      }
-    }
-
-    Set<String> toUnset = Sets.newHashSet(existing);
-    for (Map.Entry<String, LabelType> e : labelSections.entrySet()) {
-      String name = e.getKey();
-      LabelType label = e.getValue();
-      toUnset.remove(name);
-      rc.setString(LABEL, name, KEY_FUNCTION, label.getFunction().getFunctionName());
-      rc.setInt(LABEL, name, KEY_DEFAULT_VALUE, label.getDefaultValue());
-
-      setBooleanConfigKey(
-          rc,
-          LABEL,
-          name,
-          KEY_ALLOW_POST_SUBMIT,
-          label.allowPostSubmit(),
-          LabelType.DEF_ALLOW_POST_SUBMIT);
-      setBooleanConfigKey(
-          rc,
-          LABEL,
-          name,
-          KEY_COPY_MIN_SCORE,
-          label.isCopyMinScore(),
-          LabelType.DEF_COPY_MIN_SCORE);
-      setBooleanConfigKey(
-          rc,
-          LABEL,
-          name,
-          KEY_COPY_MAX_SCORE,
-          label.isCopyMaxScore(),
-          LabelType.DEF_COPY_MAX_SCORE);
-      setBooleanConfigKey(
-          rc,
-          LABEL,
-          name,
-          KEY_COPY_ALL_SCORES_ON_TRIVIAL_REBASE,
-          label.isCopyAllScoresOnTrivialRebase(),
-          LabelType.DEF_COPY_ALL_SCORES_ON_TRIVIAL_REBASE);
-      setBooleanConfigKey(
-          rc,
-          LABEL,
-          name,
-          KEY_COPY_ALL_SCORES_IF_NO_CODE_CHANGE,
-          label.isCopyAllScoresIfNoCodeChange(),
-          LabelType.DEF_COPY_ALL_SCORES_IF_NO_CODE_CHANGE);
-      setBooleanConfigKey(
-          rc,
-          LABEL,
-          name,
-          KEY_COPY_ALL_SCORES_IF_NO_CHANGE,
-          label.isCopyAllScoresIfNoChange(),
-          LabelType.DEF_COPY_ALL_SCORES_IF_NO_CHANGE);
-      setBooleanConfigKey(
-          rc,
-          LABEL,
-          name,
-          KEY_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE,
-          label.isCopyAllScoresOnMergeFirstParentUpdate(),
-          LabelType.DEF_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE);
-      setBooleanConfigKey(
-          rc, LABEL, name, KEY_CAN_OVERRIDE, label.canOverride(), LabelType.DEF_CAN_OVERRIDE);
-      List<String> values = Lists.newArrayListWithCapacity(label.getValues().size());
-      for (LabelValue value : label.getValues()) {
-        values.add(value.format());
-      }
-      rc.setStringList(LABEL, name, KEY_VALUE, values);
-
-      List<String> refPatterns = label.getRefPatterns();
-      if (refPatterns != null && !refPatterns.isEmpty()) {
-        rc.setStringList(LABEL, name, KEY_BRANCH, refPatterns);
-      }
-    }
-
-    for (String name : toUnset) {
-      rc.unsetSection(LABEL, name);
-    }
-  }
-
-  private void saveCommentLinkSections(Config rc) {
-    if (commentLinkSections != null) {
-      for (CommentLinkInfoImpl cm : commentLinkSections) {
-        rc.setString(COMMENTLINK, cm.name, KEY_MATCH, cm.match);
-        if (!Strings.isNullOrEmpty(cm.html)) {
-          rc.setString(COMMENTLINK, cm.name, KEY_HTML, cm.html);
-        }
-        if (!Strings.isNullOrEmpty(cm.link)) {
-          rc.setString(COMMENTLINK, cm.name, KEY_LINK, cm.link);
-        }
-        if (cm.enabled != null && !cm.enabled) {
-          rc.setBoolean(COMMENTLINK, cm.name, KEY_ENABLED, cm.enabled);
-        }
-      }
-    }
-  }
-
-  private static void setBooleanConfigKey(
-      Config rc, String section, String name, String key, boolean value, boolean defaultValue) {
-    if (value == defaultValue) {
-      rc.unset(section, name, key);
-    } else {
-      rc.setBoolean(section, name, key, value);
-    }
-  }
-
-  private void savePluginSections(Config rc, Set<AccountGroup.UUID> keepGroups) {
-    List<String> existing = Lists.newArrayList(rc.getSubsections(PLUGIN));
-    for (String name : existing) {
-      rc.unsetSection(PLUGIN, name);
-    }
-
-    for (Entry<String, Config> e : pluginConfigs.entrySet()) {
-      String plugin = e.getKey();
-      Config pluginConfig = e.getValue();
-      for (String name : pluginConfig.getNames(PLUGIN, plugin)) {
-        String value = pluginConfig.getString(PLUGIN, plugin, name);
-        String groupName = GroupReference.extractGroupName(value);
-        if (groupName != null) {
-          GroupReference ref = groupsByName.get(groupName);
-          if (ref != null && ref.getUUID() != null) {
-            keepGroups.add(ref.getUUID());
-            pluginConfig.setString(PLUGIN, plugin, name, "group " + ref.getName());
-          }
-        }
-        rc.setStringList(
-            PLUGIN, plugin, name, Arrays.asList(pluginConfig.getStringList(PLUGIN, plugin, name)));
-      }
-    }
-  }
-
-  private void saveGroupList() throws IOException {
-    saveUTF8(GroupList.FILE_NAME, groupList.asText());
-  }
-
-  private void saveSubscribeSections(Config rc) {
-    for (Project.NameKey p : subscribeSections.keySet()) {
-      SubscribeSection s = subscribeSections.get(p);
-      List<String> matchings = new ArrayList<>();
-      for (RefSpec r : s.getMatchingRefSpecs()) {
-        matchings.add(r.toString());
-      }
-      rc.setStringList(SUBSCRIBE_SECTION, p.get(), SUBSCRIBE_MATCH_REFS, matchings);
-
-      List<String> multimatchs = new ArrayList<>();
-      for (RefSpec r : s.getMultiMatchRefSpecs()) {
-        multimatchs.add(r.toString());
-      }
-      rc.setStringList(SUBSCRIBE_SECTION, p.get(), SUBSCRIBE_MULTI_MATCH_REFS, multimatchs);
-    }
-  }
-
-  private <E extends Enum<?>> E getEnum(
-      Config rc, String section, String subsection, String name, E defaultValue) {
-    try {
-      return rc.getEnum(section, subsection, name, defaultValue);
-    } catch (IllegalArgumentException err) {
-      error(new ValidationError(PROJECT_CONFIG, err.getMessage()));
-      return defaultValue;
-    }
-  }
-
-  @Override
-  public void error(ValidationError error) {
-    if (validationErrors == null) {
-      validationErrors = new ArrayList<>(4);
-    }
-    validationErrors.add(error);
-  }
-
-  private static <T extends Comparable<? super T>> List<T> sort(Collection<T> m) {
-    ArrayList<T> r = new ArrayList<>(m);
-    Collections.sort(r);
-    return r;
-  }
-
-  public boolean hasLegacyPermissions() {
-    return hasLegacyPermissions;
-  }
-
-  private String convertLegacyPermission(String permissionName) {
-    switch (permissionName) {
-      case LEGACY_PERMISSION_PUSH_TAG:
-        hasLegacyPermissions = true;
-        return Permission.CREATE_TAG;
-      case LEGACY_PERMISSION_PUSH_SIGNED_TAG:
-        hasLegacyPermissions = true;
-        return Permission.CREATE_SIGNED_TAG;
-      default:
-        return permissionName;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectLevelConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectLevelConfig.java
deleted file mode 100644
index 2044db0..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectLevelConfig.java
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.git;
-
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Streams;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.project.ProjectState;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Set;
-import java.util.stream.Stream;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.Config;
-
-/** Configuration file in the projects refs/meta/config branch. */
-public class ProjectLevelConfig extends VersionedMetaData {
-  private final String fileName;
-  private final ProjectState project;
-  private Config cfg;
-
-  public ProjectLevelConfig(String fileName, ProjectState project) {
-    this.fileName = fileName;
-    this.project = project;
-  }
-
-  @Override
-  protected String getRefName() {
-    return RefNames.REFS_CONFIG;
-  }
-
-  @Override
-  protected void onLoad() throws IOException, ConfigInvalidException {
-    cfg = readConfig(fileName);
-  }
-
-  public Config get() {
-    if (cfg == null) {
-      cfg = new Config();
-    }
-    return cfg;
-  }
-
-  public Config getWithInheritance() {
-    return getWithInheritance(false);
-  }
-
-  /**
-   * Get a Config that includes the values from all parent projects.
-   *
-   * <p>Merging means that matching sections/subsection will be merged to include the values from
-   * both parent and child config.
-   *
-   * <p>No merging means that matching sections/subsections in the child project will replace the
-   * corresponding value from the parent.
-   *
-   * @param merge whether to merge parent values with child values or not.
-   * @return a combined config.
-   */
-  public Config getWithInheritance(boolean merge) {
-    Config cfgWithInheritance = new Config();
-    try {
-      cfgWithInheritance.fromText(get().toText());
-    } catch (ConfigInvalidException e) {
-      // cannot happen
-    }
-    ProjectState parent = Iterables.getFirst(project.parents(), null);
-    if (parent != null) {
-      Config parentCfg = parent.getConfig(fileName).getWithInheritance();
-      for (String section : parentCfg.getSections()) {
-        Set<String> allNames = get().getNames(section);
-        for (String name : parentCfg.getNames(section)) {
-          String[] parentValues = parentCfg.getStringList(section, null, name);
-          if (!allNames.contains(name)) {
-            cfgWithInheritance.setStringList(section, null, name, Arrays.asList(parentValues));
-          } else if (merge) {
-            cfgWithInheritance.setStringList(
-                section,
-                null,
-                name,
-                Stream.concat(
-                        Arrays.stream(cfg.getStringList(section, null, name)),
-                        Arrays.stream(parentValues))
-                    .sorted()
-                    .distinct()
-                    .collect(toList()));
-          }
-        }
-
-        for (String subsection : parentCfg.getSubsections(section)) {
-          allNames = get().getNames(section, subsection);
-          for (String name : parentCfg.getNames(section, subsection)) {
-            String[] parentValues = parentCfg.getStringList(section, subsection, name);
-            if (!allNames.contains(name)) {
-              cfgWithInheritance.setStringList(
-                  section, subsection, name, Arrays.asList(parentValues));
-            } else if (merge) {
-              cfgWithInheritance.setStringList(
-                  section,
-                  subsection,
-                  name,
-                  Streams.concat(
-                          Arrays.stream(cfg.getStringList(section, subsection, name)),
-                          Arrays.stream(parentValues))
-                      .sorted()
-                      .distinct()
-                      .collect(toList()));
-            }
-          }
-        }
-      }
-    }
-    return cfgWithInheritance;
-  }
-
-  @Override
-  protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException {
-    if (commit.getMessage() == null || "".equals(commit.getMessage())) {
-      commit.setMessage("Updated configuration\n");
-    }
-    saveConfig(fileName, cfg);
-    return true;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/QueryList.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/QueryList.java
deleted file mode 100644
index 1666bae..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/QueryList.java
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.git;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-
-public class QueryList extends TabFile {
-  public static final String FILE_NAME = "queries";
-  protected final Map<String, String> queriesByName;
-
-  private QueryList(List<Row> queriesByName) {
-    this.queriesByName = toMap(queriesByName);
-  }
-
-  public static QueryList parse(String text, ValidationError.Sink errors) throws IOException {
-    return new QueryList(parse(text, FILE_NAME, TRIM, TRIM, errors));
-  }
-
-  public String getQuery(String name) {
-    return queriesByName.get(name);
-  }
-
-  public String asText() {
-    return asText("Name", "Query", queriesByName);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/RebaseSorter.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/RebaseSorter.java
deleted file mode 100644
index 6fc5eaa..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/RebaseSorter.java
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.git;
-
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change.Status;
-import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
-import com.google.gerrit.server.git.strategy.CommitMergeStatus;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.InternalChangeQuery;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevFlag;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class RebaseSorter {
-  private static final Logger log = LoggerFactory.getLogger(RebaseSorter.class);
-
-  private final CodeReviewRevWalk rw;
-  private final RevFlag canMergeFlag;
-  private final RevCommit initialTip;
-  private final Set<RevCommit> alreadyAccepted;
-  private final Provider<InternalChangeQuery> queryProvider;
-  private final Set<CodeReviewCommit> incoming;
-
-  public RebaseSorter(
-      CodeReviewRevWalk rw,
-      RevCommit initialTip,
-      Set<RevCommit> alreadyAccepted,
-      RevFlag canMergeFlag,
-      Provider<InternalChangeQuery> queryProvider,
-      Set<CodeReviewCommit> incoming) {
-    this.rw = rw;
-    this.canMergeFlag = canMergeFlag;
-    this.initialTip = initialTip;
-    this.alreadyAccepted = alreadyAccepted;
-    this.queryProvider = queryProvider;
-    this.incoming = incoming;
-  }
-
-  public List<CodeReviewCommit> sort(Collection<CodeReviewCommit> toSort) throws IOException {
-    final List<CodeReviewCommit> sorted = new ArrayList<>();
-    final Set<CodeReviewCommit> sort = new HashSet<>(toSort);
-    while (!sort.isEmpty()) {
-      final CodeReviewCommit n = removeOne(sort);
-
-      rw.resetRetain(canMergeFlag);
-      rw.markStart(n);
-      if (initialTip != null) {
-        rw.markUninteresting(initialTip);
-      }
-
-      CodeReviewCommit c;
-      final List<CodeReviewCommit> contents = new ArrayList<>();
-      while ((c = rw.next()) != null) {
-        if (!c.has(canMergeFlag) || !incoming.contains(c)) {
-          if (isAlreadyMerged(c, n.change().getDest())) {
-            rw.markUninteresting(c);
-          } else {
-            // We cannot merge n as it would bring something we
-            // aren't permitted to merge at this time. Drop n.
-            //
-            n.setStatusCode(CommitMergeStatus.MISSING_DEPENDENCY);
-          }
-          // Stop RevWalk because c is either a merged commit or a missing
-          // dependency. Not need to walk further.
-          break;
-        }
-        contents.add(c);
-      }
-
-      if (n.getStatusCode() == CommitMergeStatus.MISSING_DEPENDENCY) {
-        continue;
-      }
-
-      sort.removeAll(contents);
-      Collections.reverse(contents);
-      sorted.removeAll(contents);
-      sorted.addAll(contents);
-    }
-    return sorted;
-  }
-
-  private boolean isAlreadyMerged(CodeReviewCommit commit, Branch.NameKey dest) throws IOException {
-    try (CodeReviewRevWalk mirw = CodeReviewCommit.newRevWalk(rw.getObjectReader())) {
-      mirw.reset();
-      mirw.markStart(commit);
-      // check if the commit is merged in other branches
-      for (RevCommit accepted : alreadyAccepted) {
-        if (mirw.isMergedInto(mirw.parseCommit(commit), mirw.parseCommit(accepted))) {
-          log.debug(
-              "Dependency {} merged into branch head {}.", commit.getName(), accepted.getName());
-          return true;
-        }
-      }
-
-      // check if the commit associated change is merged in the same branch
-      List<ChangeData> changes = queryProvider.get().byCommit(commit);
-      for (ChangeData change : changes) {
-        if (change.change().getStatus() == Status.MERGED
-            && change.change().getDest().equals(dest)) {
-          log.debug(
-              "Dependency {} associated with merged change {}.", commit.getName(), change.getId());
-          return true;
-        }
-      }
-      return false;
-    } catch (OrmException e) {
-      throw new IOException(e);
-    }
-  }
-
-  private static <T> T removeOne(Collection<T> c) {
-    final Iterator<T> i = c.iterator();
-    final T r = i.next();
-    i.remove();
-    return r;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/RenameGroupOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/RenameGroupOp.java
deleted file mode 100644
index ccaaa36..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/RenameGroupOp.java
+++ /dev/null
@@ -1,161 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.server.git;
-
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class RenameGroupOp extends DefaultQueueOp {
-  public interface Factory {
-    RenameGroupOp create(
-        @Assisted("author") PersonIdent author,
-        @Assisted AccountGroup.UUID uuid,
-        @Assisted("oldName") String oldName,
-        @Assisted("newName") String newName);
-  }
-
-  private static final int MAX_TRIES = 10;
-  private static final Logger log = LoggerFactory.getLogger(RenameGroupOp.class);
-
-  private final ProjectCache projectCache;
-  private final MetaDataUpdate.Server metaDataUpdateFactory;
-
-  private final PersonIdent author;
-  private final AccountGroup.UUID uuid;
-  private final String oldName;
-  private final String newName;
-  private final List<Project.NameKey> retryOn;
-
-  private boolean tryingAgain;
-
-  @Inject
-  public RenameGroupOp(
-      WorkQueue workQueue,
-      ProjectCache projectCache,
-      MetaDataUpdate.Server metaDataUpdateFactory,
-      @Assisted("author") PersonIdent author,
-      @Assisted AccountGroup.UUID uuid,
-      @Assisted("oldName") String oldName,
-      @Assisted("newName") String newName) {
-    super(workQueue);
-    this.projectCache = projectCache;
-    this.metaDataUpdateFactory = metaDataUpdateFactory;
-
-    this.author = author;
-    this.uuid = uuid;
-    this.oldName = oldName;
-    this.newName = newName;
-    this.retryOn = new ArrayList<>();
-  }
-
-  @Override
-  public void run() {
-    Iterable<Project.NameKey> names = tryingAgain ? retryOn : projectCache.all();
-    for (Project.NameKey projectName : names) {
-      ProjectConfig config = projectCache.get(projectName).getConfig();
-      GroupReference ref = config.getGroup(uuid);
-      if (ref == null || newName.equals(ref.getName())) {
-        continue;
-      }
-
-      try (MetaDataUpdate md = metaDataUpdateFactory.create(projectName)) {
-        rename(md);
-      } catch (RepositoryNotFoundException noProject) {
-        continue;
-      } catch (ConfigInvalidException | IOException err) {
-        log.error("Cannot rename group " + oldName + " in " + projectName, err);
-      }
-    }
-
-    // If one or more projects did not update, wait 5 minutes and give it
-    // another attempt. If it doesn't update after that, give up.
-    if (!retryOn.isEmpty() && !tryingAgain) {
-      tryingAgain = true;
-      @SuppressWarnings("unused")
-      Future<?> possiblyIgnoredError = start(5, TimeUnit.MINUTES);
-    }
-  }
-
-  private void rename(MetaDataUpdate md) throws IOException, ConfigInvalidException {
-    boolean success = false;
-    for (int attempts = 0; !success && attempts < MAX_TRIES; attempts++) {
-      ProjectConfig config = ProjectConfig.read(md);
-
-      // The group isn't referenced, or its name has been fixed already.
-      //
-      GroupReference ref = config.getGroup(uuid);
-      if (ref == null || newName.equals(ref.getName())) {
-        projectCache.evict(config.getProject());
-        return;
-      }
-
-      ref.setName(newName);
-      md.getCommitBuilder().setAuthor(author);
-      md.setMessage("Rename group " + oldName + " to " + newName + "\n");
-      try {
-        config.commit(md);
-        projectCache.evict(config.getProject());
-        success = true;
-      } catch (IOException e) {
-        log.error(
-            "Could not commit rename of group "
-                + oldName
-                + " to "
-                + newName
-                + " in "
-                + md.getProjectName().get(),
-            e);
-        try {
-          Thread.sleep(25 /* milliseconds */);
-        } catch (InterruptedException wakeUp) {
-          continue;
-        }
-      }
-    }
-
-    if (!success) {
-      if (tryingAgain) {
-        log.warn(
-            "Could not rename group "
-                + oldName
-                + " to "
-                + newName
-                + " in "
-                + md.getProjectName().get());
-      } else {
-        retryOn.add(md.getProjectName());
-      }
-    }
-  }
-
-  @Override
-  public String toString() {
-    return "Rename Group " + oldName;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/SearchingChangeCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/SearchingChangeCacheImpl.java
deleted file mode 100644
index abce2d2..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/SearchingChangeCacheImpl.java
+++ /dev/null
@@ -1,164 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.git;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ReviewerSet;
-import com.google.gerrit.server.cache.CacheModule;
-import com.google.gerrit.server.index.change.ChangeField;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.InternalChangeQuery;
-import com.google.gerrit.server.util.ManualRequestContext;
-import com.google.gerrit.server.util.OneOffRequestContext;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import com.google.inject.TypeLiteral;
-import com.google.inject.name.Named;
-import com.google.inject.util.Providers;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.ExecutionException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class SearchingChangeCacheImpl implements GitReferenceUpdatedListener {
-  private static final Logger log = LoggerFactory.getLogger(SearchingChangeCacheImpl.class);
-  static final String ID_CACHE = "changes";
-
-  public static class Module extends CacheModule {
-    private final boolean slave;
-
-    public Module() {
-      this(false);
-    }
-
-    public Module(boolean slave) {
-      this.slave = slave;
-    }
-
-    @Override
-    protected void configure() {
-      if (slave) {
-        bind(SearchingChangeCacheImpl.class)
-            .toProvider(Providers.<SearchingChangeCacheImpl>of(null));
-      } else {
-        cache(ID_CACHE, Project.NameKey.class, new TypeLiteral<List<CachedChange>>() {})
-            .maximumWeight(0)
-            .loader(Loader.class);
-
-        bind(SearchingChangeCacheImpl.class);
-        DynamicSet.bind(binder(), GitReferenceUpdatedListener.class)
-            .to(SearchingChangeCacheImpl.class);
-      }
-    }
-  }
-
-  @AutoValue
-  abstract static class CachedChange {
-    // Subset of fields in ChangeData, specifically fields needed to serve
-    // VisibleRefFilter without touching the database. More can be added as
-    // necessary.
-    abstract Change change();
-
-    @Nullable
-    abstract ReviewerSet reviewers();
-  }
-
-  private final LoadingCache<Project.NameKey, List<CachedChange>> cache;
-  private final ChangeData.Factory changeDataFactory;
-
-  @Inject
-  SearchingChangeCacheImpl(
-      @Named(ID_CACHE) LoadingCache<Project.NameKey, List<CachedChange>> cache,
-      ChangeData.Factory changeDataFactory) {
-    this.cache = cache;
-    this.changeDataFactory = changeDataFactory;
-  }
-
-  /**
-   * Read changes for the project from the secondary index.
-   *
-   * <p>Returned changes only include the {@code Change} object (with id, branch) and the reviewers.
-   * Additional stored fields are not loaded from the index.
-   *
-   * @param db database handle to populate missing change data (probably unused).
-   * @param project project to read.
-   * @return list of known changes; empty if no changes.
-   */
-  public List<ChangeData> getChangeData(ReviewDb db, Project.NameKey project) {
-    try {
-      List<CachedChange> cached = cache.get(project);
-      List<ChangeData> cds = new ArrayList<>(cached.size());
-      for (CachedChange cc : cached) {
-        ChangeData cd = changeDataFactory.create(db, cc.change());
-        cd.setReviewers(cc.reviewers());
-        cds.add(cd);
-      }
-      return Collections.unmodifiableList(cds);
-    } catch (ExecutionException e) {
-      log.warn("Cannot fetch changes for " + project, e);
-      return Collections.emptyList();
-    }
-  }
-
-  @Override
-  public void onGitReferenceUpdated(GitReferenceUpdatedListener.Event event) {
-    if (event.getRefName().startsWith(RefNames.REFS_CHANGES)) {
-      cache.invalidate(new Project.NameKey(event.getProjectName()));
-    }
-  }
-
-  static class Loader extends CacheLoader<Project.NameKey, List<CachedChange>> {
-    private final OneOffRequestContext requestContext;
-    private final Provider<InternalChangeQuery> queryProvider;
-
-    @Inject
-    Loader(OneOffRequestContext requestContext, Provider<InternalChangeQuery> queryProvider) {
-      this.requestContext = requestContext;
-      this.queryProvider = queryProvider;
-    }
-
-    @Override
-    public List<CachedChange> load(Project.NameKey key) throws Exception {
-      try (ManualRequestContext ctx = requestContext.open()) {
-        List<ChangeData> cds =
-            queryProvider
-                .get()
-                .setRequestedFields(
-                    ImmutableSet.of(ChangeField.CHANGE.getName(), ChangeField.REVIEWER.getName()))
-                .byProject(key);
-        List<CachedChange> result = new ArrayList<>(cds.size());
-        for (ChangeData cd : cds) {
-          result.add(
-              new AutoValue_SearchingChangeCacheImpl_CachedChange(cd.change(), cd.getReviewers()));
-        }
-        return Collections.unmodifiableList(result);
-      }
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/SendEmailExecutor.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/SendEmailExecutor.java
deleted file mode 100644
index 7d37e5a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/SendEmailExecutor.java
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.git;
-
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-import com.google.inject.BindingAnnotation;
-import java.lang.annotation.Retention;
-import java.util.concurrent.ScheduledThreadPoolExecutor;
-
-/** Marker on the global {@link ScheduledThreadPoolExecutor} used to send email. */
-@Retention(RUNTIME)
-@BindingAnnotation
-public @interface SendEmailExecutor {}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleException.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleException.java
deleted file mode 100644
index a0422be..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleException.java
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.server.git;
-
-/**
- * Indicates the gitlink's update cannot be processed at this time.
- *
- * <p>Message should be considered user-visible.
- */
-public class SubmoduleException extends Exception {
-  private static final long serialVersionUID = 1L;
-
-  SubmoduleException(String msg) {
-    super(msg, null);
-  }
-
-  SubmoduleException(String msg, Throwable why) {
-    super(msg, why);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java
deleted file mode 100644
index d497ee2..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java
+++ /dev/null
@@ -1,688 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.server.git;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.MultimapBuilder;
-import com.google.common.collect.SetMultimap;
-import com.google.gerrit.common.data.SubscribeSection;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.client.SubmoduleSubscription;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.VerboseSuperprojectUpdate;
-import com.google.gerrit.server.git.MergeOpRepoManager.OpenRepo;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.BatchUpdateListener;
-import com.google.gerrit.server.update.RepoContext;
-import com.google.gerrit.server.update.RepoOnlyOp;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.ArrayDeque;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Deque;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import org.apache.commons.lang.StringUtils;
-import org.eclipse.jgit.dircache.DirCache;
-import org.eclipse.jgit.dircache.DirCacheBuilder;
-import org.eclipse.jgit.dircache.DirCacheEditor;
-import org.eclipse.jgit.dircache.DirCacheEditor.DeletePath;
-import org.eclipse.jgit.dircache.DirCacheEditor.PathEdit;
-import org.eclipse.jgit.dircache.DirCacheEntry;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.FileMode;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.RefSpec;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class SubmoduleOp {
-
-  /** Only used for branches without code review changes */
-  public class GitlinkOp implements RepoOnlyOp {
-    private final Branch.NameKey branch;
-
-    GitlinkOp(Branch.NameKey branch) {
-      this.branch = branch;
-    }
-
-    @Override
-    public void updateRepo(RepoContext ctx) throws Exception {
-      CodeReviewCommit c = composeGitlinksCommit(branch);
-      if (c != null) {
-        ctx.addRefUpdate(c.getParent(0), c, branch.get());
-        addBranchTip(branch, c);
-      }
-    }
-  }
-
-  @Singleton
-  public static class Factory {
-    private final GitModules.Factory gitmodulesFactory;
-    private final Provider<PersonIdent> serverIdent;
-    private final Config cfg;
-    private final ProjectCache projectCache;
-    private final ProjectState.Factory projectStateFactory;
-    private final BatchUpdate.Factory batchUpdateFactory;
-
-    @Inject
-    Factory(
-        GitModules.Factory gitmodulesFactory,
-        @GerritPersonIdent Provider<PersonIdent> serverIdent,
-        @GerritServerConfig Config cfg,
-        ProjectCache projectCache,
-        ProjectState.Factory projectStateFactory,
-        BatchUpdate.Factory batchUpdateFactory) {
-      this.gitmodulesFactory = gitmodulesFactory;
-      this.serverIdent = serverIdent;
-      this.cfg = cfg;
-      this.projectCache = projectCache;
-      this.projectStateFactory = projectStateFactory;
-      this.batchUpdateFactory = batchUpdateFactory;
-    }
-
-    public SubmoduleOp create(Set<Branch.NameKey> updatedBranches, MergeOpRepoManager orm)
-        throws SubmoduleException {
-      return new SubmoduleOp(
-          gitmodulesFactory,
-          serverIdent.get(),
-          cfg,
-          projectCache,
-          projectStateFactory,
-          batchUpdateFactory,
-          updatedBranches,
-          orm);
-    }
-  }
-
-  private static final Logger log = LoggerFactory.getLogger(SubmoduleOp.class);
-
-  private final GitModules.Factory gitmodulesFactory;
-  private final PersonIdent myIdent;
-  private final ProjectCache projectCache;
-  private final ProjectState.Factory projectStateFactory;
-  private final BatchUpdate.Factory batchUpdateFactory;
-  private final VerboseSuperprojectUpdate verboseSuperProject;
-  private final boolean enableSuperProjectSubscriptions;
-  private final long maxCombinedCommitMessageSize;
-  private final long maxCommitMessages;
-  private final MergeOpRepoManager orm;
-  private final Map<Branch.NameKey, GitModules> branchGitModules;
-
-  // always update-to-current branch tips during submit process
-  private final Map<Branch.NameKey, CodeReviewCommit> branchTips;
-  // branches for all the submitting changes
-  private final Set<Branch.NameKey> updatedBranches;
-  // branches which in either a submodule or a superproject
-  private final Set<Branch.NameKey> affectedBranches;
-  // sorted version of affectedBranches
-  private final ImmutableSet<Branch.NameKey> sortedBranches;
-  // map of superproject branch and its submodule subscriptions
-  private final SetMultimap<Branch.NameKey, SubmoduleSubscription> targets;
-  // map of superproject and its branches which has submodule subscriptions
-  private final SetMultimap<Project.NameKey, Branch.NameKey> branchesByProject;
-
-  private SubmoduleOp(
-      GitModules.Factory gitmodulesFactory,
-      PersonIdent myIdent,
-      Config cfg,
-      ProjectCache projectCache,
-      ProjectState.Factory projectStateFactory,
-      BatchUpdate.Factory batchUpdateFactory,
-      Set<Branch.NameKey> updatedBranches,
-      MergeOpRepoManager orm)
-      throws SubmoduleException {
-    this.gitmodulesFactory = gitmodulesFactory;
-    this.myIdent = myIdent;
-    this.projectCache = projectCache;
-    this.projectStateFactory = projectStateFactory;
-    this.batchUpdateFactory = batchUpdateFactory;
-    this.verboseSuperProject =
-        cfg.getEnum("submodule", null, "verboseSuperprojectUpdate", VerboseSuperprojectUpdate.TRUE);
-    this.enableSuperProjectSubscriptions =
-        cfg.getBoolean("submodule", "enableSuperProjectSubscriptions", true);
-    this.maxCombinedCommitMessageSize =
-        cfg.getLong("submodule", "maxCombinedCommitMessageSize", 256 << 10);
-    this.maxCommitMessages = cfg.getLong("submodule", "maxCommitMessages", 1000);
-    this.orm = orm;
-    this.updatedBranches = updatedBranches;
-    this.targets = MultimapBuilder.hashKeys().hashSetValues().build();
-    this.affectedBranches = new HashSet<>();
-    this.branchTips = new HashMap<>();
-    this.branchGitModules = new HashMap<>();
-    this.branchesByProject = MultimapBuilder.hashKeys().hashSetValues().build();
-    this.sortedBranches = calculateSubscriptionMap();
-  }
-
-  private ImmutableSet<Branch.NameKey> calculateSubscriptionMap() throws SubmoduleException {
-    if (!enableSuperProjectSubscriptions) {
-      logDebug("Updating superprojects disabled");
-      return null;
-    }
-
-    logDebug("Calculating superprojects - submodules map");
-    LinkedHashSet<Branch.NameKey> allVisited = new LinkedHashSet<>();
-    for (Branch.NameKey updatedBranch : updatedBranches) {
-      if (allVisited.contains(updatedBranch)) {
-        continue;
-      }
-
-      searchForSuperprojects(updatedBranch, new LinkedHashSet<Branch.NameKey>(), allVisited);
-    }
-
-    // Since the searchForSuperprojects will add all branches (related or
-    // unrelated) and ensure the superproject's branches get added first before
-    // a submodule branch. Need remove all unrelated branches and reverse
-    // the order.
-    allVisited.retainAll(affectedBranches);
-    reverse(allVisited);
-    return ImmutableSet.copyOf(allVisited);
-  }
-
-  private void searchForSuperprojects(
-      Branch.NameKey current,
-      LinkedHashSet<Branch.NameKey> currentVisited,
-      LinkedHashSet<Branch.NameKey> allVisited)
-      throws SubmoduleException {
-    logDebug("Now processing " + current);
-
-    if (currentVisited.contains(current)) {
-      throw new SubmoduleException(
-          "Branch level circular subscriptions detected:  "
-              + printCircularPath(currentVisited, current));
-    }
-
-    if (allVisited.contains(current)) {
-      return;
-    }
-
-    currentVisited.add(current);
-    try {
-      Collection<SubmoduleSubscription> subscriptions =
-          superProjectSubscriptionsForSubmoduleBranch(current);
-      for (SubmoduleSubscription sub : subscriptions) {
-        Branch.NameKey superBranch = sub.getSuperProject();
-        searchForSuperprojects(superBranch, currentVisited, allVisited);
-        targets.put(superBranch, sub);
-        branchesByProject.put(superBranch.getParentKey(), superBranch);
-        affectedBranches.add(superBranch);
-        affectedBranches.add(sub.getSubmodule());
-      }
-    } catch (IOException e) {
-      throw new SubmoduleException("Cannot find superprojects for " + current, e);
-    }
-    currentVisited.remove(current);
-    allVisited.add(current);
-  }
-
-  private static <T> void reverse(LinkedHashSet<T> set) {
-    if (set == null) {
-      return;
-    }
-
-    Deque<T> q = new ArrayDeque<>(set);
-    set.clear();
-
-    while (!q.isEmpty()) {
-      set.add(q.removeLast());
-    }
-  }
-
-  private <T> String printCircularPath(LinkedHashSet<T> p, T target) {
-    StringBuilder sb = new StringBuilder();
-    sb.append(target);
-    ArrayList<T> reverseP = new ArrayList<>(p);
-    Collections.reverse(reverseP);
-    for (T t : reverseP) {
-      sb.append("->");
-      sb.append(t);
-      if (t.equals(target)) {
-        break;
-      }
-    }
-    return sb.toString();
-  }
-
-  private Collection<Branch.NameKey> getDestinationBranches(Branch.NameKey src, SubscribeSection s)
-      throws IOException {
-    Collection<Branch.NameKey> ret = new HashSet<>();
-    logDebug("Inspecting SubscribeSection " + s);
-    for (RefSpec r : s.getMatchingRefSpecs()) {
-      logDebug("Inspecting [matching] ref " + r);
-      if (!r.matchSource(src.get())) {
-        continue;
-      }
-      if (r.isWildcard()) {
-        // refs/heads/*[:refs/somewhere/*]
-        ret.add(new Branch.NameKey(s.getProject(), r.expandFromSource(src.get()).getDestination()));
-      } else {
-        // e.g. refs/heads/master[:refs/heads/stable]
-        String dest = r.getDestination();
-        if (dest == null) {
-          dest = r.getSource();
-        }
-        ret.add(new Branch.NameKey(s.getProject(), dest));
-      }
-    }
-
-    for (RefSpec r : s.getMultiMatchRefSpecs()) {
-      logDebug("Inspecting [all] ref " + r);
-      if (!r.matchSource(src.get())) {
-        continue;
-      }
-      OpenRepo or;
-      try {
-        or = orm.getRepo(s.getProject());
-      } catch (NoSuchProjectException e) {
-        // A project listed a non existent project to be allowed
-        // to subscribe to it. Allow this for now, i.e. no exception is
-        // thrown.
-        continue;
-      }
-
-      for (Ref ref : or.repo.getRefDatabase().getRefs(RefNames.REFS_HEADS).values()) {
-        if (r.getDestination() != null && !r.matchDestination(ref.getName())) {
-          continue;
-        }
-        Branch.NameKey b = new Branch.NameKey(s.getProject(), ref.getName());
-        if (!ret.contains(b)) {
-          ret.add(b);
-        }
-      }
-    }
-    logDebug("Returning possible branches: " + ret + "for project " + s.getProject());
-    return ret;
-  }
-
-  public Collection<SubmoduleSubscription> superProjectSubscriptionsForSubmoduleBranch(
-      Branch.NameKey srcBranch) throws IOException {
-    logDebug("Calculating possible superprojects for " + srcBranch);
-    Collection<SubmoduleSubscription> ret = new ArrayList<>();
-    Project.NameKey srcProject = srcBranch.getParentKey();
-    ProjectConfig cfg = projectCache.get(srcProject).getConfig();
-    for (SubscribeSection s : projectStateFactory.create(cfg).getSubscribeSections(srcBranch)) {
-      logDebug("Checking subscribe section " + s);
-      Collection<Branch.NameKey> branches = getDestinationBranches(srcBranch, s);
-      for (Branch.NameKey targetBranch : branches) {
-        Project.NameKey targetProject = targetBranch.getParentKey();
-        try {
-          OpenRepo or = orm.getRepo(targetProject);
-          ObjectId id = or.repo.resolve(targetBranch.get());
-          if (id == null) {
-            logDebug("The branch " + targetBranch + " doesn't exist.");
-            continue;
-          }
-        } catch (NoSuchProjectException e) {
-          logDebug("The project " + targetProject + " doesn't exist");
-          continue;
-        }
-
-        GitModules m = branchGitModules.get(targetBranch);
-        if (m == null) {
-          m = gitmodulesFactory.create(targetBranch, orm);
-          branchGitModules.put(targetBranch, m);
-        }
-        ret.addAll(m.subscribedTo(srcBranch));
-      }
-    }
-    logDebug("Calculated superprojects for " + srcBranch + " are " + ret);
-    return ret;
-  }
-
-  public void updateSuperProjects() throws SubmoduleException {
-    ImmutableSet<Project.NameKey> projects = getProjectsInOrder();
-    if (projects == null) {
-      return;
-    }
-
-    LinkedHashSet<Project.NameKey> superProjects = new LinkedHashSet<>();
-    try {
-      for (Project.NameKey project : projects) {
-        // only need superprojects
-        if (branchesByProject.containsKey(project)) {
-          superProjects.add(project);
-          // get a new BatchUpdate for the super project
-          OpenRepo or = orm.getRepo(project);
-          for (Branch.NameKey branch : branchesByProject.get(project)) {
-            addOp(or.getUpdate(), branch);
-          }
-        }
-      }
-      batchUpdateFactory.execute(
-          orm.batchUpdates(superProjects), BatchUpdateListener.NONE, orm.getSubmissionId(), false);
-    } catch (RestApiException | UpdateException | IOException | NoSuchProjectException e) {
-      throw new SubmoduleException("Cannot update gitlinks", e);
-    }
-  }
-
-  /** Create a separate gitlink commit */
-  public CodeReviewCommit composeGitlinksCommit(Branch.NameKey subscriber)
-      throws IOException, SubmoduleException {
-    OpenRepo or;
-    try {
-      or = orm.getRepo(subscriber.getParentKey());
-    } catch (NoSuchProjectException | IOException e) {
-      throw new SubmoduleException("Cannot access superproject", e);
-    }
-
-    CodeReviewCommit currentCommit;
-    if (branchTips.containsKey(subscriber)) {
-      currentCommit = branchTips.get(subscriber);
-    } else {
-      Ref r = or.repo.exactRef(subscriber.get());
-      if (r == null) {
-        throw new SubmoduleException(
-            "The branch was probably deleted from the subscriber repository");
-      }
-      currentCommit = or.rw.parseCommit(r.getObjectId());
-      addBranchTip(subscriber, currentCommit);
-    }
-
-    StringBuilder msgbuf = new StringBuilder("");
-    PersonIdent author = null;
-    DirCache dc = readTree(or.rw, currentCommit);
-    DirCacheEditor ed = dc.editor();
-    int count = 0;
-    for (SubmoduleSubscription s : targets.get(subscriber)) {
-      if (count > 0) {
-        msgbuf.append("\n\n");
-      }
-      RevCommit newCommit = updateSubmodule(dc, ed, msgbuf, s);
-      count++;
-      if (newCommit != null) {
-        if (author == null) {
-          author = newCommit.getAuthorIdent();
-        } else if (!author.equals(newCommit.getAuthorIdent())) {
-          author = myIdent;
-        }
-      }
-    }
-    ed.finish();
-    ObjectId newTreeId = dc.writeTree(or.ins);
-
-    // Gitlinks are already in the branch, return null
-    if (newTreeId.equals(currentCommit.getTree())) {
-      return null;
-    }
-    CommitBuilder commit = new CommitBuilder();
-    commit.setTreeId(newTreeId);
-    commit.setParentId(currentCommit);
-    StringBuilder commitMsg = new StringBuilder("Update git submodules\n\n");
-    if (verboseSuperProject != VerboseSuperprojectUpdate.FALSE) {
-      commitMsg.append(msgbuf);
-    }
-    commit.setMessage(commitMsg.toString());
-    commit.setAuthor(author);
-    commit.setCommitter(myIdent);
-    ObjectId id = or.ins.insert(commit);
-    return or.rw.parseCommit(id);
-  }
-
-  /** Amend an existing commit with gitlink updates */
-  public CodeReviewCommit composeGitlinksCommit(
-      Branch.NameKey subscriber, CodeReviewCommit currentCommit)
-      throws IOException, SubmoduleException {
-    OpenRepo or;
-    try {
-      or = orm.getRepo(subscriber.getParentKey());
-    } catch (NoSuchProjectException | IOException e) {
-      throw new SubmoduleException("Cannot access superproject", e);
-    }
-
-    StringBuilder msgbuf = new StringBuilder("");
-    DirCache dc = readTree(or.rw, currentCommit);
-    DirCacheEditor ed = dc.editor();
-    for (SubmoduleSubscription s : targets.get(subscriber)) {
-      updateSubmodule(dc, ed, msgbuf, s);
-    }
-    ed.finish();
-    ObjectId newTreeId = dc.writeTree(or.ins);
-
-    // Gitlinks are already updated, just return the commit
-    if (newTreeId.equals(currentCommit.getTree())) {
-      return currentCommit;
-    }
-    or.rw.parseBody(currentCommit);
-    CommitBuilder commit = new CommitBuilder();
-    commit.setTreeId(newTreeId);
-    commit.setParentIds(currentCommit.getParents());
-    if (verboseSuperProject != VerboseSuperprojectUpdate.FALSE) {
-      // TODO(czhen): handle cherrypick footer
-      commit.setMessage(currentCommit.getFullMessage() + "\n\n* submodules:\n" + msgbuf.toString());
-    } else {
-      commit.setMessage(currentCommit.getFullMessage());
-    }
-    commit.setAuthor(currentCommit.getAuthorIdent());
-    commit.setCommitter(myIdent);
-    ObjectId id = or.ins.insert(commit);
-    CodeReviewCommit newCommit = or.rw.parseCommit(id);
-    newCommit.copyFrom(currentCommit);
-    return newCommit;
-  }
-
-  private RevCommit updateSubmodule(
-      DirCache dc, DirCacheEditor ed, StringBuilder msgbuf, SubmoduleSubscription s)
-      throws SubmoduleException, IOException {
-    OpenRepo subOr;
-    try {
-      subOr = orm.getRepo(s.getSubmodule().getParentKey());
-    } catch (NoSuchProjectException | IOException e) {
-      throw new SubmoduleException("Cannot access submodule", e);
-    }
-
-    DirCacheEntry dce = dc.getEntry(s.getPath());
-    RevCommit oldCommit = null;
-    if (dce != null) {
-      if (!dce.getFileMode().equals(FileMode.GITLINK)) {
-        String errMsg =
-            "Requested to update gitlink "
-                + s.getPath()
-                + " in "
-                + s.getSubmodule().getParentKey().get()
-                + " but entry "
-                + "doesn't have gitlink file mode.";
-        throw new SubmoduleException(errMsg);
-      }
-      oldCommit = subOr.rw.parseCommit(dce.getObjectId());
-    }
-
-    final CodeReviewCommit newCommit;
-    if (branchTips.containsKey(s.getSubmodule())) {
-      newCommit = branchTips.get(s.getSubmodule());
-    } else {
-      Ref ref = subOr.repo.getRefDatabase().exactRef(s.getSubmodule().get());
-      if (ref == null) {
-        ed.add(new DeletePath(s.getPath()));
-        return null;
-      }
-      newCommit = subOr.rw.parseCommit(ref.getObjectId());
-      addBranchTip(s.getSubmodule(), newCommit);
-    }
-
-    if (Objects.equals(newCommit, oldCommit)) {
-      // gitlink have already been updated for this submodule
-      return null;
-    }
-    ed.add(
-        new PathEdit(s.getPath()) {
-          @Override
-          public void apply(DirCacheEntry ent) {
-            ent.setFileMode(FileMode.GITLINK);
-            ent.setObjectId(newCommit.getId());
-          }
-        });
-
-    if (verboseSuperProject != VerboseSuperprojectUpdate.FALSE) {
-      createSubmoduleCommitMsg(msgbuf, s, subOr, newCommit, oldCommit);
-    }
-    subOr.rw.parseBody(newCommit);
-    return newCommit;
-  }
-
-  private void createSubmoduleCommitMsg(
-      StringBuilder msgbuf,
-      SubmoduleSubscription s,
-      OpenRepo subOr,
-      RevCommit newCommit,
-      RevCommit oldCommit)
-      throws SubmoduleException {
-    msgbuf.append("* Update ");
-    msgbuf.append(s.getPath());
-    msgbuf.append(" from branch '");
-    msgbuf.append(s.getSubmodule().getShortName());
-    msgbuf.append("'");
-    msgbuf.append("\n  to " + newCommit.getName());
-
-    // newly created submodule gitlink, do not append whole history
-    if (oldCommit == null) {
-      return;
-    }
-
-    try {
-      subOr.rw.resetRetain(subOr.canMergeFlag);
-      subOr.rw.markStart(newCommit);
-      subOr.rw.markUninteresting(oldCommit);
-      int numMessages = 0;
-      for (Iterator<RevCommit> iter = subOr.rw.iterator(); iter.hasNext(); ) {
-        RevCommit c = iter.next();
-        subOr.rw.parseBody(c);
-
-        String message =
-            verboseSuperProject == VerboseSuperprojectUpdate.SUBJECT_ONLY
-                ? c.getShortMessage()
-                : StringUtils.replace(c.getFullMessage(), "\n", "\n    ");
-
-        String bullet = "\n  - ";
-        String ellipsis = "\n\n[...]";
-        int newSize = msgbuf.length() + bullet.length() + message.length();
-        if (++numMessages > maxCommitMessages
-            || newSize > maxCombinedCommitMessageSize
-            || iter.hasNext() && (newSize + ellipsis.length()) > maxCombinedCommitMessageSize) {
-          msgbuf.append(ellipsis);
-          break;
-        }
-        msgbuf.append(bullet);
-        msgbuf.append(message);
-      }
-    } catch (IOException e) {
-      throw new SubmoduleException(
-          "Could not perform a revwalk to create superproject commit message", e);
-    }
-  }
-
-  private static DirCache readTree(RevWalk rw, ObjectId base) throws IOException {
-    final DirCache dc = DirCache.newInCore();
-    final DirCacheBuilder b = dc.builder();
-    b.addTree(
-        new byte[0], // no prefix path
-        DirCacheEntry.STAGE_0, // standard stage
-        rw.getObjectReader(),
-        rw.parseTree(base));
-    b.finish();
-    return dc;
-  }
-
-  public ImmutableSet<Project.NameKey> getProjectsInOrder() throws SubmoduleException {
-    LinkedHashSet<Project.NameKey> projects = new LinkedHashSet<>();
-    for (Project.NameKey project : branchesByProject.keySet()) {
-      addAllSubmoduleProjects(project, new LinkedHashSet<>(), projects);
-    }
-
-    for (Branch.NameKey branch : updatedBranches) {
-      projects.add(branch.getParentKey());
-    }
-    return ImmutableSet.copyOf(projects);
-  }
-
-  private void addAllSubmoduleProjects(
-      Project.NameKey project,
-      LinkedHashSet<Project.NameKey> current,
-      LinkedHashSet<Project.NameKey> projects)
-      throws SubmoduleException {
-    if (current.contains(project)) {
-      throw new SubmoduleException(
-          "Project level circular subscriptions detected:  " + printCircularPath(current, project));
-    }
-
-    if (projects.contains(project)) {
-      return;
-    }
-
-    current.add(project);
-    Set<Project.NameKey> subprojects = new HashSet<>();
-    for (Branch.NameKey branch : branchesByProject.get(project)) {
-      Collection<SubmoduleSubscription> subscriptions = targets.get(branch);
-      for (SubmoduleSubscription s : subscriptions) {
-        subprojects.add(s.getSubmodule().getParentKey());
-      }
-    }
-
-    for (Project.NameKey p : subprojects) {
-      addAllSubmoduleProjects(p, current, projects);
-    }
-
-    current.remove(project);
-    projects.add(project);
-  }
-
-  public ImmutableSet<Branch.NameKey> getBranchesInOrder() {
-    LinkedHashSet<Branch.NameKey> branches = new LinkedHashSet<>();
-    if (sortedBranches != null) {
-      branches.addAll(sortedBranches);
-    }
-    branches.addAll(updatedBranches);
-    return ImmutableSet.copyOf(branches);
-  }
-
-  public boolean hasSubscription(Branch.NameKey branch) {
-    return targets.containsKey(branch);
-  }
-
-  public void addBranchTip(Branch.NameKey branch, CodeReviewCommit tip) {
-    branchTips.put(branch, tip);
-  }
-
-  public void addOp(BatchUpdate bu, Branch.NameKey branch) {
-    bu.addRepoOnlyOp(new GitlinkOp(branch));
-  }
-
-  private void logDebug(String msg, Object... args) {
-    if (log.isDebugEnabled()) {
-      log.debug(orm.getSubmissionId() + msg, args);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/TabFile.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/TabFile.java
deleted file mode 100644
index c417965..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/TabFile.java
+++ /dev/null
@@ -1,147 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.git;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class TabFile {
-  public interface Parser {
-    String parse(String str);
-  }
-
-  public static Parser TRIM =
-      new Parser() {
-        @Override
-        public String parse(String str) {
-          return str.trim();
-        }
-      };
-
-  protected static class Row {
-    public String left;
-    public String right;
-
-    public Row(String left, String right) {
-      this.left = left;
-      this.right = right;
-    }
-  }
-
-  protected static List<Row> parse(
-      String text, String filename, Parser left, Parser right, ValidationError.Sink errors)
-      throws IOException {
-    List<Row> rows = new ArrayList<>();
-    BufferedReader br = new BufferedReader(new StringReader(text));
-    String s;
-    for (int lineNumber = 1; (s = br.readLine()) != null; lineNumber++) {
-      if (s.isEmpty() || s.startsWith("#")) {
-        continue;
-      }
-
-      int tab = s.indexOf('\t');
-      if (tab < 0) {
-        errors.error(new ValidationError(filename, lineNumber, "missing tab delimiter"));
-        continue;
-      }
-
-      Row row = new Row(s.substring(0, tab), s.substring(tab + 1));
-      rows.add(row);
-
-      if (left != null) {
-        row.left = left.parse(row.left);
-      }
-      if (right != null) {
-        row.right = right.parse(row.right);
-      }
-    }
-    return rows;
-  }
-
-  protected static Map<String, String> toMap(List<Row> rows) {
-    Map<String, String> map = new HashMap<>(rows.size());
-    for (Row row : rows) {
-      map.put(row.left, row.right);
-    }
-    return map;
-  }
-
-  protected static String asText(String left, String right, Map<String, String> entries) {
-    if (entries.isEmpty()) {
-      return null;
-    }
-
-    List<Row> rows = new ArrayList<>(entries.size());
-    for (String key : sort(entries.keySet())) {
-      rows.add(new Row(key, entries.get(key)));
-    }
-    return asText(left, right, rows);
-  }
-
-  protected static String asText(String left, String right, List<Row> rows) {
-    if (rows.isEmpty()) {
-      return null;
-    }
-
-    left = "# " + left;
-    int leftLen = left.length();
-    for (Row row : rows) {
-      leftLen = Math.max(leftLen, row.left.length());
-    }
-
-    StringBuilder buf = new StringBuilder();
-    buf.append(pad(leftLen, left));
-    buf.append('\t');
-    buf.append(right);
-    buf.append('\n');
-
-    buf.append('#');
-    buf.append('\n');
-
-    for (Row row : rows) {
-      buf.append(pad(leftLen, row.left));
-      buf.append('\t');
-      buf.append(row.right);
-      buf.append('\n');
-    }
-    return buf.toString();
-  }
-
-  protected static <T extends Comparable<? super T>> List<T> sort(Collection<T> m) {
-    ArrayList<T> r = new ArrayList<>(m);
-    Collections.sort(r);
-    return r;
-  }
-
-  protected static String pad(int len, String src) {
-    if (len <= src.length()) {
-      return src;
-    }
-
-    StringBuilder r = new StringBuilder(len);
-    r.append(src);
-    while (r.length() < len) {
-      r.append(' ');
-    }
-    return r.toString();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/TagCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/TagCache.java
deleted file mode 100644
index 0822161..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/TagCache.java
+++ /dev/null
@@ -1,129 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.server.git;
-
-import com.google.common.cache.Cache;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.cache.CacheModule;
-import com.google.inject.Inject;
-import com.google.inject.Module;
-import com.google.inject.Singleton;
-import com.google.inject.name.Named;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-import org.eclipse.jgit.lib.ObjectId;
-
-@Singleton
-public class TagCache {
-  private static final String CACHE_NAME = "git_tags";
-
-  public static Module module() {
-    return new CacheModule() {
-      @Override
-      protected void configure() {
-        persist(CACHE_NAME, String.class, EntryVal.class);
-        bind(TagCache.class);
-      }
-    };
-  }
-
-  private final Cache<String, EntryVal> cache;
-  private final Object createLock = new Object();
-
-  @Inject
-  TagCache(@Named(CACHE_NAME) Cache<String, EntryVal> cache) {
-    this.cache = cache;
-  }
-
-  /**
-   * Advise the cache that a reference fast-forwarded.
-   *
-   * <p>This operation is not necessary, the cache will automatically detect changes made to
-   * references and update itself on demand. However, this method may allow the cache to update more
-   * quickly and reuse the caller's computation of the fast-forward status of a branch.
-   *
-   * @param name project the branch is contained in.
-   * @param refName the branch name.
-   * @param oldValue the old value, before the fast-forward. The cache will only update itself if it
-   *     is still using this old value.
-   * @param newValue the current value, after the fast-forward.
-   */
-  public void updateFastForward(
-      Project.NameKey name, String refName, ObjectId oldValue, ObjectId newValue) {
-    // Be really paranoid and null check everything. This method should
-    // never fail with an exception. Some of these references can be null
-    // (e.g. not all projects are cached, or the cache is not current).
-    //
-    EntryVal val = cache.getIfPresent(name.get());
-    if (val != null) {
-      TagSetHolder holder = val.holder;
-      if (holder != null) {
-        TagSet tags = holder.getTagSet();
-        if (tags != null) {
-          if (tags.updateFastForward(refName, oldValue, newValue)) {
-            cache.put(name.get(), val);
-          }
-        }
-      }
-    }
-  }
-
-  TagSetHolder get(Project.NameKey name) {
-    EntryVal val = cache.getIfPresent(name.get());
-    if (val == null) {
-      synchronized (createLock) {
-        val = cache.getIfPresent(name.get());
-        if (val == null) {
-          val = new EntryVal();
-          val.holder = new TagSetHolder(name);
-          cache.put(name.get(), val);
-        }
-      }
-    }
-    return val.holder;
-  }
-
-  void put(Project.NameKey name, TagSetHolder tags) {
-    EntryVal val = new EntryVal();
-    val.holder = tags;
-    cache.put(name.get(), val);
-  }
-
-  static class EntryVal implements Serializable {
-    static final long serialVersionUID = 1L;
-
-    transient TagSetHolder holder;
-
-    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
-      holder = new TagSetHolder(new Project.NameKey(in.readUTF()));
-      if (in.readBoolean()) {
-        TagSet tags = new TagSet(holder.getProjectName());
-        tags.readObject(in);
-        holder.setTagSet(tags);
-      }
-    }
-
-    private void writeObject(ObjectOutputStream out) throws IOException {
-      TagSet tags = holder.getTagSet();
-      out.writeUTF(holder.getProjectName().get());
-      out.writeBoolean(tags != null);
-      if (tags != null) {
-        tags.writeObject(out);
-      }
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/TagMatcher.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/TagMatcher.java
deleted file mode 100644
index 6e46d76..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/TagMatcher.java
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.server.git;
-
-import com.google.gerrit.server.git.TagSet.Tag;
-import java.util.ArrayList;
-import java.util.BitSet;
-import java.util.Collection;
-import java.util.List;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-
-class TagMatcher {
-  final BitSet mask = new BitSet();
-  final List<Ref> newRefs = new ArrayList<>();
-  final List<LostRef> lostRefs = new ArrayList<>();
-  final TagSetHolder holder;
-  final TagCache cache;
-  final Repository db;
-  final Collection<Ref> include;
-  TagSet tags;
-  final boolean updated;
-  private boolean rebuiltForNewTags;
-
-  TagMatcher(
-      TagSetHolder holder,
-      TagCache cache,
-      Repository db,
-      Collection<Ref> include,
-      TagSet tags,
-      boolean updated) {
-    this.holder = holder;
-    this.cache = cache;
-    this.db = db;
-    this.include = include;
-    this.tags = tags;
-    this.updated = updated;
-  }
-
-  boolean isReachable(Ref tagRef) {
-    tagRef = db.peel(tagRef);
-
-    ObjectId tagObj = tagRef.getPeeledObjectId();
-    if (tagObj == null) {
-      tagObj = tagRef.getObjectId();
-      if (tagObj == null) {
-        return false;
-      }
-    }
-
-    Tag tag = tags.lookupTag(tagObj);
-    if (tag == null) {
-      if (rebuiltForNewTags) {
-        return false;
-      }
-
-      rebuiltForNewTags = true;
-      holder.rebuildForNewTags(cache, this);
-      return isReachable(tagRef);
-    }
-
-    return tag.has(mask);
-  }
-
-  static class LostRef {
-    final Tag tag;
-    final int flag;
-
-    LostRef(Tag tag, int flag) {
-      this.tag = tag;
-      this.flag = flag;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/TagSet.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/TagSet.java
deleted file mode 100644
index f131bc9..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/TagSet.java
+++ /dev/null
@@ -1,384 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.server.git;
-
-import static org.eclipse.jgit.lib.ObjectIdSerialization.readNotNull;
-import static org.eclipse.jgit.lib.ObjectIdSerialization.writeNotNull;
-
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.util.BitSet;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicReference;
-import org.eclipse.jgit.errors.IncorrectObjectTypeException;
-import org.eclipse.jgit.lib.AnyObjectId;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectIdOwnerMap;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.RefDatabase;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevSort;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-class TagSet {
-  private static final Logger log = LoggerFactory.getLogger(TagSet.class);
-
-  private final Project.NameKey projectName;
-  private final Map<String, CachedRef> refs;
-  private final ObjectIdOwnerMap<Tag> tags;
-
-  TagSet(Project.NameKey projectName) {
-    this.projectName = projectName;
-    this.refs = new HashMap<>();
-    this.tags = new ObjectIdOwnerMap<>();
-  }
-
-  Tag lookupTag(AnyObjectId id) {
-    return tags.get(id);
-  }
-
-  boolean updateFastForward(String refName, ObjectId oldValue, ObjectId newValue) {
-    CachedRef ref = refs.get(refName);
-    if (ref != null) {
-      // compareAndSet works on reference equality, but this operation
-      // wants to use object equality. Switch out oldValue with cur so the
-      // compareAndSet will function correctly for this operation.
-      //
-      ObjectId cur = ref.get();
-      if (cur.equals(oldValue)) {
-        return ref.compareAndSet(cur, newValue);
-      }
-    }
-    return false;
-  }
-
-  void prepare(TagMatcher m) {
-    @SuppressWarnings("resource")
-    RevWalk rw = null;
-    try {
-      for (Ref currentRef : m.include) {
-        if (currentRef.isSymbolic()) {
-          continue;
-        }
-        if (currentRef.getObjectId() == null) {
-          continue;
-        }
-
-        CachedRef savedRef = refs.get(currentRef.getName());
-        if (savedRef == null) {
-          // If the reference isn't known to the set, return null
-          // and force the caller to rebuild the set in a new copy.
-          m.newRefs.add(currentRef);
-          continue;
-        }
-
-        // The reference has not been moved. It can be used as-is.
-        ObjectId savedObjectId = savedRef.get();
-        if (currentRef.getObjectId().equals(savedObjectId)) {
-          m.mask.set(savedRef.flag);
-          continue;
-        }
-
-        // Check on-the-fly to see if the branch still reaches the tag.
-        // This is very likely for a branch that fast-forwarded.
-        try {
-          if (rw == null) {
-            rw = new RevWalk(m.db);
-            rw.setRetainBody(false);
-          }
-
-          RevCommit savedCommit = rw.parseCommit(savedObjectId);
-          RevCommit currentCommit = rw.parseCommit(currentRef.getObjectId());
-          if (rw.isMergedInto(savedCommit, currentCommit)) {
-            // Fast-forward. Safely update the reference in-place.
-            savedRef.compareAndSet(savedObjectId, currentRef.getObjectId());
-            m.mask.set(savedRef.flag);
-            continue;
-          }
-
-          // The branch rewound. Walk the list of commits removed from
-          // the reference. If any matches to a tag, this has to be removed.
-          boolean err = false;
-          rw.reset();
-          rw.markStart(savedCommit);
-          rw.markUninteresting(currentCommit);
-          rw.sort(RevSort.TOPO, true);
-          RevCommit c;
-          while ((c = rw.next()) != null) {
-            Tag tag = tags.get(c);
-            if (tag != null && tag.refFlags.get(savedRef.flag)) {
-              m.lostRefs.add(new TagMatcher.LostRef(tag, savedRef.flag));
-              err = true;
-            }
-          }
-          if (!err) {
-            // All of the tags are still reachable. Update in-place.
-            savedRef.compareAndSet(savedObjectId, currentRef.getObjectId());
-            m.mask.set(savedRef.flag);
-          }
-
-        } catch (IOException err) {
-          // Defer a cache update until later. No conclusion can be made
-          // based on an exception reading from the repository storage.
-          log.warn("Error checking tags of " + projectName, err);
-        }
-      }
-    } finally {
-      if (rw != null) {
-        rw.close();
-      }
-    }
-  }
-
-  void build(Repository git, TagSet old, TagMatcher m) {
-    if (old != null && m != null && refresh(old, m)) {
-      return;
-    }
-
-    try (TagWalk rw = new TagWalk(git)) {
-      rw.setRetainBody(false);
-      for (Ref ref : git.getRefDatabase().getRefs(RefDatabase.ALL).values()) {
-        if (skip(ref)) {
-          continue;
-
-        } else if (isTag(ref)) {
-          // For a tag, remember where it points to.
-          addTag(rw, git.peel(ref));
-
-        } else {
-          // New reference to include in the set.
-          addRef(rw, ref);
-        }
-      }
-
-      // Traverse the complete history. Copy any flags from a commit to
-      // all of its ancestors. This automatically updates any Tag object
-      // as the TagCommit and the stored Tag object share the same
-      // underlying bit set.
-      TagCommit c;
-      while ((c = (TagCommit) rw.next()) != null) {
-        BitSet mine = c.refFlags;
-        int pCnt = c.getParentCount();
-        for (int pIdx = 0; pIdx < pCnt; pIdx++) {
-          ((TagCommit) c.getParent(pIdx)).refFlags.or(mine);
-        }
-      }
-    } catch (IOException e) {
-      log.warn("Error building tags for repository " + projectName, e);
-    }
-  }
-
-  void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
-    int refCnt = in.readInt();
-    for (int i = 0; i < refCnt; i++) {
-      String name = in.readUTF();
-      int flag = in.readInt();
-      ObjectId id = readNotNull(in);
-      refs.put(name, new CachedRef(flag, id));
-    }
-
-    int tagCnt = in.readInt();
-    for (int i = 0; i < tagCnt; i++) {
-      ObjectId id = readNotNull(in);
-      BitSet flags = (BitSet) in.readObject();
-      tags.add(new Tag(id, flags));
-    }
-  }
-
-  void writeObject(ObjectOutputStream out) throws IOException {
-    out.writeInt(refs.size());
-    for (Map.Entry<String, CachedRef> e : refs.entrySet()) {
-      out.writeUTF(e.getKey());
-      out.writeInt(e.getValue().flag);
-      writeNotNull(out, e.getValue().get());
-    }
-
-    out.writeInt(tags.size());
-    for (Tag tag : tags) {
-      writeNotNull(out, tag);
-      out.writeObject(tag.refFlags);
-    }
-  }
-
-  private boolean refresh(TagSet old, TagMatcher m) {
-    if (m.newRefs.isEmpty()) {
-      // No new references is a simple update. Copy from the old set.
-      copy(old, m);
-      return true;
-    }
-
-    // Only permit a refresh if all new references start from the tip of
-    // an existing references. This happens some of the time within a
-    // Gerrit Code Review server, perhaps about 50% of new references.
-    // Since a complete rebuild is so costly, try this approach first.
-
-    Map<ObjectId, Integer> byObj = new HashMap<>();
-    for (CachedRef r : old.refs.values()) {
-      ObjectId id = r.get();
-      if (!byObj.containsKey(id)) {
-        byObj.put(id, r.flag);
-      }
-    }
-
-    for (Ref newRef : m.newRefs) {
-      ObjectId id = newRef.getObjectId();
-      if (id == null || refs.containsKey(newRef.getName())) {
-        continue;
-      } else if (!byObj.containsKey(id)) {
-        return false;
-      }
-    }
-
-    copy(old, m);
-
-    for (Ref newRef : m.newRefs) {
-      ObjectId id = newRef.getObjectId();
-      if (id == null || refs.containsKey(newRef.getName())) {
-        continue;
-      }
-
-      int srcFlag = byObj.get(id);
-      int newFlag = refs.size();
-      refs.put(newRef.getName(), new CachedRef(newRef, newFlag));
-
-      for (Tag tag : tags) {
-        if (tag.refFlags.get(srcFlag)) {
-          tag.refFlags.set(newFlag);
-        }
-      }
-    }
-
-    return true;
-  }
-
-  private void copy(TagSet old, TagMatcher m) {
-    refs.putAll(old.refs);
-
-    for (Tag srcTag : old.tags) {
-      BitSet mine = new BitSet();
-      mine.or(srcTag.refFlags);
-      tags.add(new Tag(srcTag, mine));
-    }
-
-    for (TagMatcher.LostRef lost : m.lostRefs) {
-      Tag mine = tags.get(lost.tag);
-      if (mine != null) {
-        mine.refFlags.clear(lost.flag);
-      }
-    }
-  }
-
-  private void addTag(TagWalk rw, Ref ref) {
-    ObjectId id = ref.getPeeledObjectId();
-    if (id == null) {
-      id = ref.getObjectId();
-    }
-
-    if (!tags.contains(id)) {
-      BitSet flags;
-      try {
-        flags = ((TagCommit) rw.parseCommit(id)).refFlags;
-      } catch (IncorrectObjectTypeException notCommit) {
-        flags = new BitSet();
-      } catch (IOException e) {
-        log.warn("Error on " + ref.getName() + " of " + projectName, e);
-        flags = new BitSet();
-      }
-      tags.add(new Tag(id, flags));
-    }
-  }
-
-  private void addRef(TagWalk rw, Ref ref) {
-    try {
-      TagCommit commit = (TagCommit) rw.parseCommit(ref.getObjectId());
-      rw.markStart(commit);
-
-      int flag = refs.size();
-      commit.refFlags.set(flag);
-      refs.put(ref.getName(), new CachedRef(ref, flag));
-    } catch (IncorrectObjectTypeException notCommit) {
-      // No need to spam the logs.
-      // Quite many refs will point to non-commits.
-      // For instance, refs from refs/cache-automerge
-      // will often end up here.
-    } catch (IOException e) {
-      log.warn("Error on " + ref.getName() + " of " + projectName, e);
-    }
-  }
-
-  static boolean skip(Ref ref) {
-    return ref.isSymbolic() || ref.getObjectId() == null || PatchSet.isChangeRef(ref.getName());
-  }
-
-  private static boolean isTag(Ref ref) {
-    return ref.getName().startsWith(Constants.R_TAGS);
-  }
-
-  static final class Tag extends ObjectIdOwnerMap.Entry {
-    private final BitSet refFlags;
-
-    Tag(AnyObjectId id, BitSet flags) {
-      super(id);
-      this.refFlags = flags;
-    }
-
-    boolean has(BitSet mask) {
-      return refFlags.intersects(mask);
-    }
-  }
-
-  private static final class CachedRef extends AtomicReference<ObjectId> {
-    private static final long serialVersionUID = 1L;
-
-    final int flag;
-
-    CachedRef(Ref ref, int flag) {
-      this(flag, ref.getObjectId());
-    }
-
-    CachedRef(int flag, ObjectId id) {
-      this.flag = flag;
-      set(id);
-    }
-  }
-
-  private static final class TagWalk extends RevWalk {
-    TagWalk(Repository git) {
-      super(git);
-    }
-
-    @Override
-    protected TagCommit createCommit(AnyObjectId id) {
-      return new TagCommit(id);
-    }
-  }
-
-  private static final class TagCommit extends RevCommit {
-    final BitSet refFlags;
-
-    TagCommit(AnyObjectId id) {
-      super(id);
-      refFlags = new BitSet();
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/TagSetHolder.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/TagSetHolder.java
deleted file mode 100644
index e1faa65..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/TagSetHolder.java
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.server.git;
-
-import static java.util.stream.Collectors.toList;
-
-import com.google.gerrit.reviewdb.client.Project;
-import java.util.Collection;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-
-class TagSetHolder {
-  private final Object buildLock = new Object();
-  private final Project.NameKey projectName;
-  private volatile TagSet tags;
-
-  TagSetHolder(Project.NameKey projectName) {
-    this.projectName = projectName;
-  }
-
-  Project.NameKey getProjectName() {
-    return projectName;
-  }
-
-  TagSet getTagSet() {
-    return tags;
-  }
-
-  void setTagSet(TagSet tags) {
-    this.tags = tags;
-  }
-
-  TagMatcher matcher(TagCache cache, Repository db, Collection<Ref> include) {
-    include = include.stream().filter(r -> !TagSet.skip(r)).collect(toList());
-
-    TagSet tags = this.tags;
-    if (tags == null) {
-      tags = build(cache, db);
-    }
-
-    TagMatcher m = new TagMatcher(this, cache, db, include, tags, false);
-    tags.prepare(m);
-    if (!m.newRefs.isEmpty() || !m.lostRefs.isEmpty()) {
-      tags = rebuild(cache, db, tags, m);
-
-      m = new TagMatcher(this, cache, db, include, tags, true);
-      tags.prepare(m);
-    }
-    return m;
-  }
-
-  void rebuildForNewTags(TagCache cache, TagMatcher m) {
-    m.tags = rebuild(cache, m.db, m.tags, null);
-    m.mask.clear();
-    m.newRefs.clear();
-    m.lostRefs.clear();
-    m.tags.prepare(m);
-  }
-
-  private TagSet build(TagCache cache, Repository db) {
-    synchronized (buildLock) {
-      TagSet tags = this.tags;
-      if (tags == null) {
-        tags = new TagSet(projectName);
-        tags.build(db, null, null);
-        this.tags = tags;
-        cache.put(projectName, this);
-      }
-      return tags;
-    }
-  }
-
-  private TagSet rebuild(TagCache cache, Repository db, TagSet old, TagMatcher m) {
-    synchronized (buildLock) {
-      TagSet cur = this.tags;
-      if (cur == old) {
-        cur = new TagSet(projectName);
-        cur.build(db, old, m);
-        this.tags = cur;
-        cache.put(projectName, this);
-      }
-      return cur;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/TransferConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/TransferConfig.java
deleted file mode 100644
index 8c93833..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/TransferConfig.java
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.server.git;
-
-import com.google.gerrit.server.config.ConfigUtil;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.concurrent.TimeUnit;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.storage.pack.PackConfig;
-
-@Singleton
-public class TransferConfig {
-  private final int timeout;
-  private final PackConfig packConfig;
-  private final long maxObjectSizeLimit;
-  private final String maxObjectSizeLimitFormatted;
-  private final boolean inheritProjectMaxObjectSizeLimit;
-
-  @Inject
-  TransferConfig(@GerritServerConfig Config cfg) {
-    timeout =
-        (int)
-            ConfigUtil.getTimeUnit(
-                cfg,
-                "transfer",
-                null,
-                "timeout", //
-                0,
-                TimeUnit.SECONDS);
-    maxObjectSizeLimit = cfg.getLong("receive", "maxObjectSizeLimit", 0);
-    maxObjectSizeLimitFormatted = cfg.getString("receive", null, "maxObjectSizeLimit");
-    inheritProjectMaxObjectSizeLimit =
-        cfg.getBoolean("receive", "inheritProjectMaxObjectSizeLimit", false);
-
-    packConfig = new PackConfig();
-    packConfig.setDeltaCompress(false);
-    packConfig.setThreads(1);
-    packConfig.fromConfig(cfg);
-  }
-
-  /** @return configured timeout, in seconds. 0 if the timeout is infinite. */
-  public int getTimeout() {
-    return timeout;
-  }
-
-  public PackConfig getPackConfig() {
-    return packConfig;
-  }
-
-  public long getMaxObjectSizeLimit() {
-    return maxObjectSizeLimit;
-  }
-
-  public String getFormattedMaxObjectSizeLimit() {
-    return maxObjectSizeLimitFormatted;
-  }
-
-  public boolean getInheritProjectMaxObjectSizeLimit() {
-    return inheritProjectMaxObjectSizeLimit;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ValidationError.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ValidationError.java
deleted file mode 100644
index ad84046..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ValidationError.java
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.server.git;
-
-/** Indicates a problem with Git based data. */
-public class ValidationError {
-  private final String message;
-
-  public ValidationError(String file, String message) {
-    this(file + ": " + message);
-  }
-
-  public ValidationError(String file, int line, String message) {
-    this(file + ":" + line + ": " + message);
-  }
-
-  public ValidationError(String message) {
-    this.message = message;
-  }
-
-  public String getMessage() {
-    return message;
-  }
-
-  @Override
-  public String toString() {
-    return "ValidationError[" + message + "]";
-  }
-
-  public interface Sink {
-    void error(ValidationError error);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/VersionedMetaData.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/VersionedMetaData.java
deleted file mode 100644
index d1e3381..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/VersionedMetaData.java
+++ /dev/null
@@ -1,551 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.server.git;
-
-import com.google.common.base.MoreObjects;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-import org.eclipse.jgit.dircache.DirCache;
-import org.eclipse.jgit.dircache.DirCacheBuilder;
-import org.eclipse.jgit.dircache.DirCacheEditor;
-import org.eclipse.jgit.dircache.DirCacheEditor.DeletePath;
-import org.eclipse.jgit.dircache.DirCacheEditor.PathEdit;
-import org.eclipse.jgit.dircache.DirCacheEntry;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.IncorrectObjectTypeException;
-import org.eclipse.jgit.errors.MissingObjectException;
-import org.eclipse.jgit.lib.AnyObjectId;
-import org.eclipse.jgit.lib.BatchRefUpdate;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.FileMode;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.ObjectLoader;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevTree;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.ReceiveCommand;
-import org.eclipse.jgit.treewalk.TreeWalk;
-import org.eclipse.jgit.util.ChangeIdUtil;
-import org.eclipse.jgit.util.RawParseUtils;
-
-/**
- * Support for metadata stored within a version controlled branch.
- *
- * <p>Implementors are responsible for supplying implementations of the onLoad and onSave methods to
- * read from the repository, or format an update that can later be written back to the repository.
- */
-public abstract class VersionedMetaData {
-  /**
-   * Path information that does not hold references to any repository data structures, allowing the
-   * application to retain this object for long periods of time.
-   */
-  public static class PathInfo {
-    public final FileMode fileMode;
-    public final String path;
-    public final ObjectId objectId;
-
-    protected PathInfo(TreeWalk tw) {
-      fileMode = tw.getFileMode(0);
-      path = tw.getPathString();
-      objectId = tw.getObjectId(0);
-    }
-  }
-
-  protected RevCommit revision;
-  protected RevWalk rw;
-  protected ObjectReader reader;
-  protected ObjectInserter inserter;
-  protected DirCache newTree;
-
-  /** @return name of the reference storing this configuration. */
-  protected abstract String getRefName();
-
-  /** Set up the metadata, parsing any state from the loaded revision. */
-  protected abstract void onLoad() throws IOException, ConfigInvalidException;
-
-  /**
-   * Save any changes to the metadata in a commit.
-   *
-   * @return true if the commit should proceed, false to abort.
-   * @throws IOException
-   * @throws ConfigInvalidException
-   */
-  protected abstract boolean onSave(CommitBuilder commit)
-      throws IOException, ConfigInvalidException;
-
-  /** @return revision of the metadata that was loaded. */
-  public ObjectId getRevision() {
-    return revision != null ? revision.copy() : null;
-  }
-
-  /**
-   * Load the current version from the branch.
-   *
-   * <p>The repository is not held after the call completes, allowing the application to retain this
-   * object for long periods of time.
-   *
-   * @param db repository to access.
-   * @throws IOException
-   * @throws ConfigInvalidException
-   */
-  public void load(Repository db) throws IOException, ConfigInvalidException {
-    Ref ref = db.getRefDatabase().exactRef(getRefName());
-    load(db, ref != null ? ref.getObjectId() : null);
-  }
-
-  /**
-   * Load a specific version from the repository.
-   *
-   * <p>This method is primarily useful for applying updates to a specific revision that was shown
-   * to an end-user in the user interface. If there are conflicts with another user's concurrent
-   * changes, these will be automatically detected at commit time.
-   *
-   * <p>The repository is not held after the call completes, allowing the application to retain this
-   * object for long periods of time.
-   *
-   * @param db repository to access.
-   * @param id revision to load.
-   * @throws IOException
-   * @throws ConfigInvalidException
-   */
-  public void load(Repository db, ObjectId id) throws IOException, ConfigInvalidException {
-    try (RevWalk walk = new RevWalk(db)) {
-      load(walk, id);
-    }
-  }
-
-  /**
-   * Load a specific version from an open walk.
-   *
-   * <p>This method is primarily useful for applying updates to a specific revision that was shown
-   * to an end-user in the user interface. If there are conflicts with another user's concurrent
-   * changes, these will be automatically detected at commit time.
-   *
-   * <p>The caller retains ownership of the walk and is responsible for closing it. However, this
-   * instance does not hold a reference to the walk or the repository after the call completes,
-   * allowing the application to retain this object for long periods of time.
-   *
-   * @param walk open walk to access to access.
-   * @param id revision to load.
-   * @throws IOException
-   * @throws ConfigInvalidException
-   */
-  public void load(RevWalk walk, ObjectId id) throws IOException, ConfigInvalidException {
-    this.rw = walk;
-    this.reader = walk.getObjectReader();
-    try {
-      revision = id != null ? walk.parseCommit(id) : null;
-      onLoad();
-    } finally {
-      this.rw = null;
-      this.reader = null;
-    }
-  }
-
-  public void load(MetaDataUpdate update) throws IOException, ConfigInvalidException {
-    load(update.getRepository());
-  }
-
-  public void load(MetaDataUpdate update, ObjectId id) throws IOException, ConfigInvalidException {
-    load(update.getRepository(), id);
-  }
-
-  /**
-   * Update this metadata branch, recording a new commit on its reference.
-   *
-   * @param update helper information to define the update that will occur.
-   * @return the commit that was created
-   * @throws IOException if there is a storage problem and the update cannot be executed as
-   *     requested or if it failed because of a concurrent update to the same reference
-   */
-  public RevCommit commit(MetaDataUpdate update) throws IOException {
-    BatchMetaDataUpdate batch = openUpdate(update);
-    try {
-      batch.write(update.getCommitBuilder());
-      return batch.commit();
-    } finally {
-      batch.close();
-    }
-  }
-
-  /**
-   * Creates a new commit and a new ref based on this commit.
-   *
-   * @param update helper information to define the update that will occur.
-   * @param refName name of the ref that should be created
-   * @return the commit that was created
-   * @throws IOException if there is a storage problem and the update cannot be executed as
-   *     requested or if it failed because of a concurrent update to the same reference
-   */
-  public RevCommit commitToNewRef(MetaDataUpdate update, String refName) throws IOException {
-    BatchMetaDataUpdate batch = openUpdate(update);
-    try {
-      batch.write(update.getCommitBuilder());
-      return batch.createRef(refName);
-    } finally {
-      batch.close();
-    }
-  }
-
-  public interface BatchMetaDataUpdate {
-    void write(CommitBuilder commit) throws IOException;
-
-    void write(VersionedMetaData config, CommitBuilder commit) throws IOException;
-
-    RevCommit createRef(String refName) throws IOException;
-
-    RevCommit commit() throws IOException;
-
-    RevCommit commitAt(ObjectId revision) throws IOException;
-
-    void close();
-  }
-
-  /**
-   * Open a batch of updates to the same metadata ref.
-   *
-   * <p>This allows making multiple commits to a single metadata ref, at the end of which is a
-   * single ref update. For batching together updates to multiple refs (each consisting of one or
-   * more commits against their respective refs), create the {@link MetaDataUpdate} with a {@link
-   * BatchRefUpdate}.
-   *
-   * <p>A ref update produced by this {@link BatchMetaDataUpdate} is only committed if there is no
-   * associated {@link BatchRefUpdate}. As a result, the configured ref updated event is not fired
-   * if there is an associated batch.
-   *
-   * @param update helper info about the update.
-   * @throws IOException if the update failed.
-   */
-  public BatchMetaDataUpdate openUpdate(MetaDataUpdate update) throws IOException {
-    final Repository db = update.getRepository();
-
-    reader = db.newObjectReader();
-    inserter = db.newObjectInserter();
-    final RevWalk rw = new RevWalk(reader);
-    final RevTree tree = revision != null ? rw.parseTree(revision) : null;
-    newTree = readTree(tree);
-    return new BatchMetaDataUpdate() {
-      AnyObjectId src = revision;
-      AnyObjectId srcTree = tree;
-
-      @Override
-      public void write(CommitBuilder commit) throws IOException {
-        write(VersionedMetaData.this, commit);
-      }
-
-      private boolean doSave(VersionedMetaData config, CommitBuilder commit) throws IOException {
-        DirCache nt = config.newTree;
-        ObjectReader r = config.reader;
-        ObjectInserter i = config.inserter;
-        try {
-          config.newTree = newTree;
-          config.reader = reader;
-          config.inserter = inserter;
-          return config.onSave(commit);
-        } catch (ConfigInvalidException e) {
-          throw new IOException(
-              "Cannot update " + getRefName() + " in " + db.getDirectory() + ": " + e.getMessage(),
-              e);
-        } finally {
-          config.newTree = nt;
-          config.reader = r;
-          config.inserter = i;
-        }
-      }
-
-      @Override
-      public void write(VersionedMetaData config, CommitBuilder commit) throws IOException {
-        if (!doSave(config, commit)) {
-          return;
-        }
-
-        ObjectId res = newTree.writeTree(inserter);
-        if (res.equals(srcTree) && !update.allowEmpty() && (commit.getTreeId() == null)) {
-          // If there are no changes to the content, don't create the commit.
-          return;
-        }
-
-        // If changes are made to the DirCache and those changes are written as
-        // a commit and then the tree ID is set for the CommitBuilder, then
-        // those previous DirCache changes will be ignored and the commit's
-        // tree will be replaced with the ID in the CommitBuilder. The same is
-        // true if you explicitly set tree ID in a commit and then make changes
-        // to the DirCache; that tree ID will be ignored and replaced by that of
-        // the tree for the updated DirCache.
-        if (commit.getTreeId() == null) {
-          commit.setTreeId(res);
-        } else {
-          // In this case, the caller populated the tree without using DirCache.
-          res = commit.getTreeId();
-        }
-
-        if (src != null) {
-          commit.addParentId(src);
-        }
-
-        if (update.insertChangeId()) {
-          ObjectId id =
-              ChangeIdUtil.computeChangeId(
-                  res,
-                  getRevision(),
-                  commit.getAuthor(),
-                  commit.getCommitter(),
-                  commit.getMessage());
-          commit.setMessage(ChangeIdUtil.insertId(commit.getMessage(), id));
-        }
-
-        src = inserter.insert(commit);
-        srcTree = res;
-      }
-
-      @Override
-      public RevCommit createRef(String refName) throws IOException {
-        if (Objects.equals(src, revision)) {
-          return revision;
-        }
-        return updateRef(ObjectId.zeroId(), src, refName);
-      }
-
-      @Override
-      public RevCommit commit() throws IOException {
-        return commitAt(revision);
-      }
-
-      @Override
-      public RevCommit commitAt(ObjectId expected) throws IOException {
-        if (Objects.equals(src, expected)) {
-          return revision;
-        }
-        return updateRef(MoreObjects.firstNonNull(expected, ObjectId.zeroId()), src, getRefName());
-      }
-
-      @Override
-      public void close() {
-        newTree = null;
-
-        rw.close();
-        if (inserter != null) {
-          inserter.close();
-          inserter = null;
-        }
-
-        if (reader != null) {
-          reader.close();
-          reader = null;
-        }
-      }
-
-      private RevCommit updateRef(AnyObjectId oldId, AnyObjectId newId, String refName)
-          throws IOException {
-        BatchRefUpdate bru = update.getBatch();
-        if (bru != null) {
-          bru.addCommand(new ReceiveCommand(oldId.toObjectId(), newId.toObjectId(), refName));
-          inserter.flush();
-          revision = rw.parseCommit(newId);
-          return revision;
-        }
-
-        RefUpdate ru = db.updateRef(refName);
-        ru.setExpectedOldObjectId(oldId);
-        ru.setNewObjectId(newId);
-        ru.setRefLogIdent(update.getCommitBuilder().getAuthor());
-        String message = update.getCommitBuilder().getMessage();
-        if (message == null) {
-          message = "meta data update";
-        }
-        try (BufferedReader reader = new BufferedReader(new StringReader(message))) {
-          // read the subject line and use it as reflog message
-          ru.setRefLogMessage("commit: " + reader.readLine(), true);
-        }
-        inserter.flush();
-        RefUpdate.Result result = ru.update();
-        switch (result) {
-          case NEW:
-          case FAST_FORWARD:
-            revision = rw.parseCommit(ru.getNewObjectId());
-            update.fireGitRefUpdatedEvent(ru);
-            return revision;
-          case LOCK_FAILURE:
-            throw new LockFailureException(
-                "Cannot update "
-                    + ru.getName()
-                    + " in "
-                    + db.getDirectory()
-                    + ": "
-                    + ru.getResult(),
-                ru);
-          case FORCED:
-          case IO_FAILURE:
-          case NOT_ATTEMPTED:
-          case NO_CHANGE:
-          case REJECTED:
-          case REJECTED_CURRENT_BRANCH:
-          case RENAMED:
-          case REJECTED_MISSING_OBJECT:
-          case REJECTED_OTHER_REASON:
-          default:
-            throw new IOException(
-                "Cannot update "
-                    + ru.getName()
-                    + " in "
-                    + db.getDirectory()
-                    + ": "
-                    + ru.getResult());
-        }
-      }
-    };
-  }
-
-  protected DirCache readTree(RevTree tree)
-      throws IOException, MissingObjectException, IncorrectObjectTypeException {
-    DirCache dc = DirCache.newInCore();
-    if (tree != null) {
-      DirCacheBuilder b = dc.builder();
-      b.addTree(new byte[0], DirCacheEntry.STAGE_0, reader, tree);
-      b.finish();
-    }
-    return dc;
-  }
-
-  protected Config readConfig(String fileName) throws IOException, ConfigInvalidException {
-    Config rc = new Config();
-    String text = readUTF8(fileName);
-    if (!text.isEmpty()) {
-      try {
-        rc.fromText(text);
-      } catch (ConfigInvalidException err) {
-        StringBuilder msg =
-            new StringBuilder("Invalid config file ")
-                .append(fileName)
-                .append(" in commit ")
-                .append(revision.name());
-        if (err.getCause() != null) {
-          msg.append(": ").append(err.getCause());
-        }
-        throw new ConfigInvalidException(msg.toString(), err);
-      }
-    }
-    return rc;
-  }
-
-  protected String readUTF8(String fileName) throws IOException {
-    byte[] raw = readFile(fileName);
-    return raw.length != 0 ? RawParseUtils.decode(raw) : "";
-  }
-
-  protected byte[] readFile(String fileName) throws IOException {
-    if (revision == null) {
-      return new byte[] {};
-    }
-
-    try (TreeWalk tw = TreeWalk.forPath(reader, fileName, revision.getTree())) {
-      if (tw != null) {
-        ObjectLoader obj = reader.open(tw.getObjectId(0), Constants.OBJ_BLOB);
-        return obj.getCachedBytes(Integer.MAX_VALUE);
-      }
-    }
-    return new byte[] {};
-  }
-
-  protected ObjectId getObjectId(String fileName) throws IOException {
-    if (revision == null) {
-      return null;
-    }
-
-    try (TreeWalk tw = TreeWalk.forPath(reader, fileName, revision.getTree())) {
-      if (tw != null) {
-        return tw.getObjectId(0);
-      }
-    }
-
-    return null;
-  }
-
-  public List<PathInfo> getPathInfos(boolean recursive) throws IOException {
-    try (TreeWalk tw = new TreeWalk(reader)) {
-      tw.addTree(revision.getTree());
-      tw.setRecursive(recursive);
-      List<PathInfo> paths = new ArrayList<>();
-      while (tw.next()) {
-        paths.add(new PathInfo(tw));
-      }
-      return paths;
-    }
-  }
-
-  protected static void set(
-      Config rc, String section, String subsection, String name, String value) {
-    if (value != null) {
-      rc.setString(section, subsection, name, value);
-    } else {
-      rc.unset(section, subsection, name);
-    }
-  }
-
-  protected static void set(
-      Config rc, String section, String subsection, String name, boolean value) {
-    if (value) {
-      rc.setBoolean(section, subsection, name, value);
-    } else {
-      rc.unset(section, subsection, name);
-    }
-  }
-
-  protected static <E extends Enum<?>> void set(
-      Config rc, String section, String subsection, String name, E value, E defaultValue) {
-    if (value != defaultValue) {
-      rc.setEnum(section, subsection, name, value);
-    } else {
-      rc.unset(section, subsection, name);
-    }
-  }
-
-  protected void saveConfig(String fileName, Config cfg) throws IOException {
-    saveUTF8(fileName, cfg.toText());
-  }
-
-  protected void saveUTF8(String fileName, String text) throws IOException {
-    saveFile(fileName, text != null ? Constants.encode(text) : null);
-  }
-
-  protected void saveFile(String fileName, byte[] raw) throws IOException {
-    DirCacheEditor editor = newTree.editor();
-    if (raw != null && 0 < raw.length) {
-      final ObjectId blobId = inserter.insert(Constants.OBJ_BLOB, raw);
-      editor.add(
-          new PathEdit(fileName) {
-            @Override
-            public void apply(DirCacheEntry ent) {
-              ent.setFileMode(FileMode.REGULAR_FILE);
-              ent.setObjectId(blobId);
-            }
-          });
-    } else {
-      editor.add(new DeletePath(fileName));
-    }
-    editor.finish();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/VisibleRefFilter.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/VisibleRefFilter.java
deleted file mode 100644
index c16c195..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/VisibleRefFilter.java
+++ /dev/null
@@ -1,370 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.server.git;
-
-import static com.google.gerrit.reviewdb.client.RefNames.REFS_CACHE_AUTOMERGE;
-import static com.google.gerrit.reviewdb.client.RefNames.REFS_CHANGES;
-import static com.google.gerrit.reviewdb.client.RefNames.REFS_CONFIG;
-import static com.google.gerrit.reviewdb.client.RefNames.REFS_USERS_SELF;
-import static java.util.stream.Collectors.toMap;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.ChangeNotes.Factory.ChangeNotesResult;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.ProjectPermission;
-import com.google.gerrit.server.permissions.RefPermission;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.stream.Stream;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.RefDatabase;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.lib.SymbolicRef;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.AbstractAdvertiseRefsHook;
-import org.eclipse.jgit.transport.ServiceMayNotContinueException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class VisibleRefFilter extends AbstractAdvertiseRefsHook {
-  private static final Logger log = LoggerFactory.getLogger(VisibleRefFilter.class);
-
-  public interface Factory {
-    VisibleRefFilter create(ProjectState projectState, Repository git);
-  }
-
-  private final TagCache tagCache;
-  private final ChangeNotes.Factory changeNotesFactory;
-  @Nullable private final SearchingChangeCacheImpl changeCache;
-  private final Provider<ReviewDb> db;
-  private final Provider<CurrentUser> user;
-  private final PermissionBackend permissionBackend;
-  private final PermissionBackend.ForProject perm;
-  private final ProjectState projectState;
-  private final Repository git;
-  private ProjectControl projectCtl;
-  private boolean showMetadata = true;
-  private String userEditPrefix;
-  private Map<Change.Id, Branch.NameKey> visibleChanges;
-
-  @Inject
-  VisibleRefFilter(
-      TagCache tagCache,
-      ChangeNotes.Factory changeNotesFactory,
-      @Nullable SearchingChangeCacheImpl changeCache,
-      Provider<ReviewDb> db,
-      Provider<CurrentUser> user,
-      PermissionBackend permissionBackend,
-      @Assisted ProjectState projectState,
-      @Assisted Repository git) {
-    this.tagCache = tagCache;
-    this.changeNotesFactory = changeNotesFactory;
-    this.changeCache = changeCache;
-    this.db = db;
-    this.user = user;
-    this.permissionBackend = permissionBackend;
-    this.perm =
-        permissionBackend.user(user).database(db).project(projectState.getProject().getNameKey());
-    this.projectState = projectState;
-    this.git = git;
-  }
-
-  /** Show change references. Default is {@code true}. */
-  public VisibleRefFilter setShowMetadata(boolean show) {
-    showMetadata = show;
-    return this;
-  }
-
-  public Map<String, Ref> filter(Map<String, Ref> refs, boolean filterTagsSeparately) {
-    if (projectState.isAllUsers()) {
-      refs = addUsersSelfSymref(refs);
-    }
-
-    PermissionBackend.WithUser withUser = permissionBackend.user(user);
-    PermissionBackend.ForProject forProject = withUser.project(projectState.getNameKey());
-    if (!projectState.isAllUsers()) {
-      if (checkProjectPermission(forProject, ProjectPermission.READ)) {
-        return refs;
-      } else if (checkProjectPermission(forProject, ProjectPermission.READ_NO_CONFIG)) {
-        return fastHideRefsMetaConfig(refs);
-      }
-    }
-
-    Account.Id userId;
-    boolean viewMetadata;
-    if (user.get().isIdentifiedUser()) {
-      viewMetadata = withUser.testOrFalse(GlobalPermission.ACCESS_DATABASE);
-      IdentifiedUser u = user.get().asIdentifiedUser();
-      userId = u.getAccountId();
-      userEditPrefix = RefNames.refsEditPrefix(userId);
-    } else {
-      userId = null;
-      viewMetadata = false;
-    }
-
-    Map<String, Ref> result = new HashMap<>();
-    List<Ref> deferredTags = new ArrayList<>();
-
-    projectCtl = projectState.controlFor(user.get());
-    for (Ref ref : refs.values()) {
-      String name = ref.getName();
-      Change.Id changeId;
-      Account.Id accountId;
-      if (name.startsWith(REFS_CACHE_AUTOMERGE) || (!showMetadata && isMetadata(name))) {
-        continue;
-      } else if (RefNames.isRefsEdit(name)) {
-        // Edits are visible only to the owning user, if change is visible.
-        if (viewMetadata || visibleEdit(name)) {
-          result.put(name, ref);
-        }
-      } else if ((changeId = Change.Id.fromRef(name)) != null) {
-        // Change ref is visible only if the change is visible.
-        if (viewMetadata || visible(changeId)) {
-          result.put(name, ref);
-        }
-      } else if ((accountId = Account.Id.fromRef(name)) != null) {
-        // Account ref is visible only to corresponding account.
-        if (viewMetadata || (accountId.equals(userId) && canReadRef(name))) {
-          result.put(name, ref);
-        }
-      } else if (isTag(ref)) {
-        // If its a tag, consider it later.
-        if (ref.getObjectId() != null) {
-          deferredTags.add(ref);
-        }
-      } else if (name.startsWith(RefNames.REFS_SEQUENCES)) {
-        // Sequences are internal database implementation details.
-        if (viewMetadata) {
-          result.put(name, ref);
-        }
-      } else if (projectState.isAllUsers() && name.equals(RefNames.REFS_EXTERNAL_IDS)) {
-        // The notes branch with the external IDs of all users must not be exposed to normal users.
-        if (viewMetadata) {
-          result.put(name, ref);
-        }
-      } else if (canReadRef(ref.getLeaf().getName())) {
-        // Use the leaf to lookup the control data. If the reference is
-        // symbolic we want the control around the final target. If its
-        // not symbolic then getLeaf() is a no-op returning ref itself.
-        result.put(name, ref);
-      } else if (isRefsUsersSelf(ref)) {
-        // viewMetadata allows to see all account refs, hence refs/users/self should be included as
-        // well
-        if (viewMetadata) {
-          result.put(name, ref);
-        }
-      }
-    }
-
-    // If we have tags that were deferred, we need to do a revision walk
-    // to identify what tags we can actually reach, and what we cannot.
-    //
-    if (!deferredTags.isEmpty() && (!result.isEmpty() || filterTagsSeparately)) {
-      TagMatcher tags =
-          tagCache
-              .get(projectState.getNameKey())
-              .matcher(
-                  tagCache,
-                  git,
-                  filterTagsSeparately ? filter(git.getAllRefs()).values() : result.values());
-      for (Ref tag : deferredTags) {
-        if (tags.isReachable(tag)) {
-          result.put(tag.getName(), tag);
-        }
-      }
-    }
-
-    return result;
-  }
-
-  private Map<String, Ref> fastHideRefsMetaConfig(Map<String, Ref> refs) {
-    if (refs.containsKey(REFS_CONFIG) && !canReadRef(REFS_CONFIG)) {
-      Map<String, Ref> r = new HashMap<>(refs);
-      r.remove(REFS_CONFIG);
-      return r;
-    }
-    return refs;
-  }
-
-  private Map<String, Ref> addUsersSelfSymref(Map<String, Ref> refs) {
-    if (user.get().isIdentifiedUser()) {
-      Ref r = refs.get(RefNames.refsUsers(user.get().getAccountId()));
-      if (r != null) {
-        SymbolicRef s = new SymbolicRef(REFS_USERS_SELF, r);
-        refs = new HashMap<>(refs);
-        refs.put(s.getName(), s);
-      }
-    }
-    return refs;
-  }
-
-  @Override
-  protected Map<String, Ref> getAdvertisedRefs(Repository repository, RevWalk revWalk)
-      throws ServiceMayNotContinueException {
-    try {
-      return filter(repository.getRefDatabase().getRefs(RefDatabase.ALL));
-    } catch (ServiceMayNotContinueException e) {
-      throw e;
-    } catch (IOException e) {
-      ServiceMayNotContinueException ex = new ServiceMayNotContinueException();
-      ex.initCause(e);
-      throw ex;
-    }
-  }
-
-  private Map<String, Ref> filter(Map<String, Ref> refs) {
-    return filter(refs, false);
-  }
-
-  private boolean visible(Change.Id changeId) {
-    if (visibleChanges == null) {
-      if (changeCache == null) {
-        visibleChanges = visibleChangesByScan();
-      } else {
-        visibleChanges = visibleChangesBySearch();
-      }
-    }
-    return visibleChanges.containsKey(changeId);
-  }
-
-  private boolean visibleEdit(String name) {
-    Change.Id id = Change.Id.fromEditRefPart(name);
-    // Initialize if it wasn't yet
-    if (visibleChanges == null) {
-      visible(id);
-    }
-    if (id != null) {
-      return (userEditPrefix != null && name.startsWith(userEditPrefix) && visible(id))
-          || (visibleChanges.containsKey(id)
-              && projectCtl.controlForRef(visibleChanges.get(id)).isEditVisible());
-    }
-    return false;
-  }
-
-  private Map<Change.Id, Branch.NameKey> visibleChangesBySearch() {
-    Project.NameKey project = projectState.getNameKey();
-    try {
-      Map<Change.Id, Branch.NameKey> visibleChanges = new HashMap<>();
-      for (ChangeData cd : changeCache.getChangeData(db.get(), project)) {
-        ChangeNotes notes = changeNotesFactory.createFromIndexedChange(cd.change());
-        if (perm.indexedChange(cd, notes).test(ChangePermission.READ)) {
-          visibleChanges.put(cd.getId(), cd.change().getDest());
-        }
-      }
-      return visibleChanges;
-    } catch (OrmException | PermissionBackendException e) {
-      log.error(
-          "Cannot load changes for project " + project + ", assuming no changes are visible", e);
-      return Collections.emptyMap();
-    }
-  }
-
-  private Map<Change.Id, Branch.NameKey> visibleChangesByScan() {
-    Project.NameKey p = projectState.getNameKey();
-    Stream<ChangeNotesResult> s;
-    try {
-      s = changeNotesFactory.scan(git, db.get(), p);
-    } catch (IOException e) {
-      log.error("Cannot load changes for project " + p + ", assuming no changes are visible", e);
-      return Collections.emptyMap();
-    }
-    return s.map(r -> toNotes(p, r))
-        .filter(Objects::nonNull)
-        .collect(toMap(n -> n.getChangeId(), n -> n.getChange().getDest()));
-  }
-
-  @Nullable
-  private ChangeNotes toNotes(Project.NameKey p, ChangeNotesResult r) {
-    if (r.error().isPresent()) {
-      log.warn("Failed to load change " + r.id() + " in " + p, r.error().get());
-      return null;
-    }
-    try {
-      if (perm.change(r.notes()).test(ChangePermission.READ)) {
-        return r.notes();
-      }
-    } catch (PermissionBackendException e) {
-      log.warn("Failed to check permission for " + r.id() + " in " + p, e);
-    }
-    return null;
-  }
-
-  private boolean isMetadata(String name) {
-    return name.startsWith(REFS_CHANGES) || RefNames.isRefsEdit(name);
-  }
-
-  private static boolean isTag(Ref ref) {
-    return ref.getLeaf().getName().startsWith(Constants.R_TAGS);
-  }
-
-  private static boolean isRefsUsersSelf(Ref ref) {
-    return ref.getName().startsWith(REFS_USERS_SELF);
-  }
-
-  private boolean canReadRef(String ref) {
-    try {
-      perm.ref(ref).check(RefPermission.READ);
-      return true;
-    } catch (AuthException e) {
-      return false;
-    } catch (PermissionBackendException e) {
-      log.error("unable to check permissions", e);
-      return false;
-    }
-  }
-
-  private boolean checkProjectPermission(
-      PermissionBackend.ForProject forProject, ProjectPermission perm) {
-    try {
-      forProject.check(perm);
-    } catch (AuthException e) {
-      return false;
-    } catch (PermissionBackendException e) {
-      log.error(
-          "Can't check permission for user {} on project {}",
-          user.get(),
-          projectState.getName(),
-          e);
-      return false;
-    }
-    return true;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/WorkQueue.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/WorkQueue.java
deleted file mode 100644
index 72bc805..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/WorkQueue.java
+++ /dev/null
@@ -1,632 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.git;
-
-import com.google.common.base.CaseFormat;
-import com.google.common.base.Supplier;
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.gerrit.lifecycle.LifecycleModule;
-import com.google.gerrit.metrics.Description;
-import com.google.gerrit.metrics.MetricMaker;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.util.IdGenerator;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.lang.Thread.UncaughtExceptionHandler;
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Date;
-import java.util.List;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.Delayed;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.RunnableScheduledFuture;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ScheduledThreadPoolExecutor;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Delayed execution of tasks using a background thread pool. */
-@Singleton
-public class WorkQueue {
-  public static class Lifecycle implements LifecycleListener {
-    private final WorkQueue workQueue;
-
-    @Inject
-    Lifecycle(WorkQueue workQeueue) {
-      this.workQueue = workQeueue;
-    }
-
-    @Override
-    public void start() {}
-
-    @Override
-    public void stop() {
-      workQueue.stop();
-    }
-  }
-
-  public static class Module extends LifecycleModule {
-    @Override
-    protected void configure() {
-      bind(WorkQueue.class);
-      listener().to(Lifecycle.class);
-    }
-  }
-
-  private static final Logger log = LoggerFactory.getLogger(WorkQueue.class);
-  private static final UncaughtExceptionHandler LOG_UNCAUGHT_EXCEPTION =
-      new UncaughtExceptionHandler() {
-        @Override
-        public void uncaughtException(Thread t, Throwable e) {
-          log.error("WorkQueue thread " + t.getName() + " threw exception", e);
-        }
-      };
-
-  private final ScheduledExecutorService defaultQueue;
-  private final IdGenerator idGenerator;
-  private final MetricMaker metrics;
-  private final CopyOnWriteArrayList<Executor> queues;
-
-  @Inject
-  WorkQueue(IdGenerator idGenerator, @GerritServerConfig Config cfg, MetricMaker metrics) {
-    this(idGenerator, cfg.getInt("execution", "defaultThreadPoolSize", 1), metrics);
-  }
-
-  /** Constructor to allow binding the WorkQueue more explicitly in a vhost setup. */
-  public WorkQueue(IdGenerator idGenerator, int defaultThreadPoolSize, MetricMaker metrics) {
-    this.idGenerator = idGenerator;
-    this.metrics = metrics;
-    this.queues = new CopyOnWriteArrayList<>();
-    this.defaultQueue = createQueue(defaultThreadPoolSize, "WorkQueue", true);
-  }
-
-  /** Get the default work queue, for miscellaneous tasks. */
-  public ScheduledExecutorService getDefaultQueue() {
-    return defaultQueue;
-  }
-
-  /**
-   * Create a new executor queue.
-   *
-   * <p>Creates a new executor queue without associated metrics. This method is suitable for use by
-   * plugins.
-   *
-   * <p>If metrics are needed, use {@link #createQueue(int, String, int, boolean)} instead.
-   *
-   * @param poolsize the size of the pool.
-   * @param queueName the name of the queue.
-   */
-  public ScheduledExecutorService createQueue(int poolsize, String queueName) {
-    return createQueue(poolsize, queueName, Thread.NORM_PRIORITY, false);
-  }
-
-  /**
-   * Create a new executor queue, with default priority, optionally with metrics.
-   *
-   * <p>Creates a new executor queue, optionally with associated metrics. Metrics should not be
-   * requested for queues created by plugins.
-   *
-   * @param poolsize the size of the pool.
-   * @param queueName the name of the queue.
-   * @param withMetrics whether to create metrics.
-   */
-  public ScheduledThreadPoolExecutor createQueue(
-      int poolsize, String queueName, boolean withMetrics) {
-    return createQueue(poolsize, queueName, Thread.NORM_PRIORITY, withMetrics);
-  }
-
-  /**
-   * Create a new executor queue, optionally with metrics.
-   *
-   * <p>Creates a new executor queue, optionally with associated metrics. Metrics should not be
-   * requested for queues created by plugins.
-   *
-   * @param poolsize the size of the pool.
-   * @param queueName the name of the queue.
-   * @param threadPriority thread priority.
-   * @param withMetrics whether to create metrics.
-   */
-  public ScheduledThreadPoolExecutor createQueue(
-      int poolsize, String queueName, int threadPriority, boolean withMetrics) {
-    Executor executor = new Executor(poolsize, queueName);
-    if (withMetrics) {
-      log.info("Adding metrics for '{}' queue", queueName);
-      executor.buildMetrics(queueName);
-    }
-    executor.setContinueExistingPeriodicTasksAfterShutdownPolicy(false);
-    executor.setExecuteExistingDelayedTasksAfterShutdownPolicy(true);
-    queues.add(executor);
-    if (threadPriority != Thread.NORM_PRIORITY) {
-      ThreadFactory parent = executor.getThreadFactory();
-      executor.setThreadFactory(
-          task -> {
-            Thread t = parent.newThread(task);
-            t.setPriority(threadPriority);
-            return t;
-          });
-    }
-
-    return executor;
-  }
-
-  /** Get all of the tasks currently scheduled in any work queue. */
-  public List<Task<?>> getTasks() {
-    final List<Task<?>> r = new ArrayList<>();
-    for (Executor e : queues) {
-      e.addAllTo(r);
-    }
-    return r;
-  }
-
-  public <T> List<T> getTaskInfos(TaskInfoFactory<T> factory) {
-    List<T> taskInfos = new ArrayList<>();
-    for (Executor exe : queues) {
-      for (Task<?> task : exe.getTasks()) {
-        taskInfos.add(factory.getTaskInfo(task));
-      }
-    }
-    return taskInfos;
-  }
-
-  /** Locate a task by its unique id, null if no task matches. */
-  public Task<?> getTask(int id) {
-    Task<?> result = null;
-    for (Executor e : queues) {
-      final Task<?> t = e.getTask(id);
-      if (t != null) {
-        if (result != null) {
-          // Don't return the task if we have a duplicate. Lie instead.
-          return null;
-        }
-        result = t;
-      }
-    }
-    return result;
-  }
-
-  public ScheduledThreadPoolExecutor getExecutor(String queueName) {
-    for (Executor e : queues) {
-      if (e.queueName.equals(queueName)) {
-        return e;
-      }
-    }
-    return null;
-  }
-
-  private void stop() {
-    for (Executor p : queues) {
-      p.shutdown();
-      boolean isTerminated;
-      do {
-        try {
-          isTerminated = p.awaitTermination(10, TimeUnit.SECONDS);
-        } catch (InterruptedException ie) {
-          isTerminated = false;
-        }
-      } while (!isTerminated);
-    }
-    queues.clear();
-  }
-
-  /** An isolated queue. */
-  private class Executor extends ScheduledThreadPoolExecutor {
-    private final ConcurrentHashMap<Integer, Task<?>> all;
-    private final String queueName;
-
-    Executor(int corePoolSize, final String queueName) {
-      super(
-          corePoolSize,
-          new ThreadFactory() {
-            private final ThreadFactory parent = Executors.defaultThreadFactory();
-            private final AtomicInteger tid = new AtomicInteger(1);
-
-            @Override
-            public Thread newThread(Runnable task) {
-              final Thread t = parent.newThread(task);
-              t.setName(queueName + "-" + tid.getAndIncrement());
-              t.setUncaughtExceptionHandler(LOG_UNCAUGHT_EXCEPTION);
-              return t;
-            }
-          });
-
-      all =
-          new ConcurrentHashMap<>( //
-              corePoolSize << 1, // table size
-              0.75f, // load factor
-              corePoolSize + 4 // concurrency level
-              );
-      this.queueName = queueName;
-    }
-
-    @Override
-    protected void terminated() {
-      super.terminated();
-      queues.remove(this);
-    }
-
-    private void buildMetrics(String queueName) {
-      metrics.newCallbackMetric(
-          getMetricName(queueName, "max_pool_size"),
-          Long.class,
-          new Description("Maximum allowed number of threads in the pool")
-              .setGauge()
-              .setUnit("threads"),
-          new Supplier<Long>() {
-            @Override
-            public Long get() {
-              return (long) getMaximumPoolSize();
-            }
-          });
-      metrics.newCallbackMetric(
-          getMetricName(queueName, "pool_size"),
-          Long.class,
-          new Description("Current number of threads in the pool").setGauge().setUnit("threads"),
-          new Supplier<Long>() {
-            @Override
-            public Long get() {
-              return (long) getPoolSize();
-            }
-          });
-      metrics.newCallbackMetric(
-          getMetricName(queueName, "active_threads"),
-          Long.class,
-          new Description("Number number of threads that are actively executing tasks")
-              .setGauge()
-              .setUnit("threads"),
-          new Supplier<Long>() {
-            @Override
-            public Long get() {
-              return (long) getActiveCount();
-            }
-          });
-      metrics.newCallbackMetric(
-          getMetricName(queueName, "scheduled_tasks"),
-          Integer.class,
-          new Description("Number of scheduled tasks in the queue").setGauge().setUnit("tasks"),
-          new Supplier<Integer>() {
-            @Override
-            public Integer get() {
-              return getQueue().size();
-            }
-          });
-      metrics.newCallbackMetric(
-          getMetricName(queueName, "total_scheduled_tasks_count"),
-          Long.class,
-          new Description("Total number of tasks that have been scheduled for execution")
-              .setCumulative()
-              .setUnit("tasks"),
-          new Supplier<Long>() {
-            @Override
-            public Long get() {
-              return (long) getTaskCount();
-            }
-          });
-      metrics.newCallbackMetric(
-          getMetricName(queueName, "total_completed_tasks_count"),
-          Long.class,
-          new Description("Total number of tasks that have completed execution")
-              .setCumulative()
-              .setUnit("tasks"),
-          new Supplier<Long>() {
-            @Override
-            public Long get() {
-              return (long) getCompletedTaskCount();
-            }
-          });
-    }
-
-    private String getMetricName(String queueName, String metricName) {
-      String name =
-          CaseFormat.UPPER_CAMEL.to(
-              CaseFormat.LOWER_UNDERSCORE,
-              queueName.replaceFirst("SSH", "Ssh").replaceAll("-", ""));
-      return metrics.sanitizeMetricName(String.format("queue/%s/%s", name, metricName));
-    }
-
-    @Override
-    protected <V> RunnableScheduledFuture<V> decorateTask(
-        Runnable runnable, RunnableScheduledFuture<V> r) {
-      r = super.decorateTask(runnable, r);
-      for (; ; ) {
-        final int id = idGenerator.next();
-
-        Task<V> task;
-
-        if (runnable instanceof ProjectRunnable) {
-          task = new ProjectTask<>((ProjectRunnable) runnable, r, this, id);
-        } else {
-          task = new Task<>(runnable, r, this, id);
-        }
-
-        if (all.putIfAbsent(task.getTaskId(), task) == null) {
-          return task;
-        }
-      }
-    }
-
-    @Override
-    protected <V> RunnableScheduledFuture<V> decorateTask(
-        Callable<V> callable, RunnableScheduledFuture<V> task) {
-      throw new UnsupportedOperationException("Callable not implemented");
-    }
-
-    void remove(Task<?> task) {
-      all.remove(task.getTaskId(), task);
-    }
-
-    Task<?> getTask(int id) {
-      return all.get(id);
-    }
-
-    void addAllTo(List<Task<?>> list) {
-      list.addAll(all.values()); // iterator is thread safe
-    }
-
-    Collection<Task<?>> getTasks() {
-      return all.values();
-    }
-  }
-
-  /**
-   * Runnable needing to know it was canceled. Note that cancel is called only in case the task is
-   * not in progress already.
-   */
-  public interface CancelableRunnable extends Runnable {
-    /** Notifies the runnable it was canceled. */
-    void cancel();
-  }
-
-  /**
-   * Base interface handles the case when task was canceled before actual execution and in case it
-   * was started cancel method is not called yet the task itself will be destroyed anyway (it will
-   * result in resource opening errors). This interface gives a chance to implementing classes for
-   * handling such scenario and act accordingly.
-   */
-  public interface CanceledWhileRunning extends CancelableRunnable {
-    /** Notifies the runnable it was canceled during execution. * */
-    void setCanceledWhileRunning();
-  }
-
-  /** A wrapper around a scheduled Runnable, as maintained in the queue. */
-  public static class Task<V> implements RunnableScheduledFuture<V> {
-    /**
-     * Summarized status of a single task.
-     *
-     * <p>Tasks have the following state flow:
-     *
-     * <ol>
-     *   <li>{@link #SLEEPING}: if scheduled with a non-zero delay.
-     *   <li>{@link #READY}: waiting for an available worker thread.
-     *   <li>{@link #RUNNING}: actively executing on a worker thread.
-     *   <li>{@link #DONE}: finished executing, if not periodic.
-     * </ol>
-     */
-    public enum State {
-      // Ordered like this so ordinal matches the order we would
-      // prefer to see tasks sorted in: done before running,
-      // running before ready, ready before sleeping.
-      //
-      DONE,
-      CANCELLED,
-      RUNNING,
-      READY,
-      SLEEPING,
-      OTHER
-    }
-
-    private final Runnable runnable;
-    private final RunnableScheduledFuture<V> task;
-    private final Executor executor;
-    private final int taskId;
-    private final AtomicBoolean running;
-    private final Date startTime;
-
-    Task(Runnable runnable, RunnableScheduledFuture<V> task, Executor executor, int taskId) {
-      this.runnable = runnable;
-      this.task = task;
-      this.executor = executor;
-      this.taskId = taskId;
-      this.running = new AtomicBoolean();
-      this.startTime = new Date();
-    }
-
-    public int getTaskId() {
-      return taskId;
-    }
-
-    public State getState() {
-      if (isCancelled()) {
-        return State.CANCELLED;
-      } else if (isDone() && !isPeriodic()) {
-        return State.DONE;
-      } else if (running.get()) {
-        return State.RUNNING;
-      }
-
-      final long delay = getDelay(TimeUnit.MILLISECONDS);
-      if (delay <= 0) {
-        return State.READY;
-      }
-      return State.SLEEPING;
-    }
-
-    public Date getStartTime() {
-      return startTime;
-    }
-
-    public String getQueueName() {
-      return executor.queueName;
-    }
-
-    @Override
-    public boolean cancel(boolean mayInterruptIfRunning) {
-      if (task.cancel(mayInterruptIfRunning)) {
-        // Tiny abuse of running: if the task needs to know it was
-        // canceled (to clean up resources) and it hasn't started
-        // yet the task's run method won't execute. So we tag it
-        // as running and allow it to clean up. This ensures we do
-        // not invoke cancel twice.
-        //
-        if (runnable instanceof CancelableRunnable) {
-          if (running.compareAndSet(false, true)) {
-            ((CancelableRunnable) runnable).cancel();
-          } else if (runnable instanceof CanceledWhileRunning) {
-            ((CanceledWhileRunning) runnable).setCanceledWhileRunning();
-          }
-        }
-        if (runnable instanceof Future<?>) {
-          // Creating new futures eventually passes through
-          // AbstractExecutorService#schedule, which will convert the Guava
-          // Future to a Runnable, thereby making it impossible for the
-          // cancellation to propagate from ScheduledThreadPool's task back to
-          // the Guava future, so kludge it here.
-          ((Future<?>) runnable).cancel(mayInterruptIfRunning);
-        }
-
-        executor.remove(this);
-        executor.purge();
-        return true;
-      }
-      return false;
-    }
-
-    @Override
-    public int compareTo(Delayed o) {
-      return task.compareTo(o);
-    }
-
-    @Override
-    public V get() throws InterruptedException, ExecutionException {
-      return task.get();
-    }
-
-    @Override
-    public V get(long timeout, TimeUnit unit)
-        throws InterruptedException, ExecutionException, TimeoutException {
-      return task.get(timeout, unit);
-    }
-
-    @Override
-    public long getDelay(TimeUnit unit) {
-      return task.getDelay(unit);
-    }
-
-    @Override
-    public boolean isCancelled() {
-      return task.isCancelled();
-    }
-
-    @Override
-    public boolean isDone() {
-      return task.isDone();
-    }
-
-    @Override
-    public boolean isPeriodic() {
-      return task.isPeriodic();
-    }
-
-    @Override
-    public void run() {
-      if (running.compareAndSet(false, true)) {
-        try {
-          task.run();
-        } finally {
-          if (isPeriodic()) {
-            running.set(false);
-          } else {
-            executor.remove(this);
-          }
-        }
-      }
-    }
-
-    @Override
-    public String toString() {
-      // This is a workaround to be able to print a proper name when the task
-      // is wrapped into a TrustedListenableFutureTask.
-      try {
-        if (runnable
-            .getClass()
-            .isAssignableFrom(
-                Class.forName("com.google.common.util.concurrent.TrustedListenableFutureTask"))) {
-          Class<?> trustedFutureInterruptibleTask =
-              Class.forName(
-                  "com.google.common.util.concurrent.TrustedListenableFutureTask$TrustedFutureInterruptibleTask");
-          for (Field field : runnable.getClass().getDeclaredFields()) {
-            if (field.getType().isAssignableFrom(trustedFutureInterruptibleTask)) {
-              field.setAccessible(true);
-              Object innerObj = field.get(runnable);
-              if (innerObj != null) {
-                for (Field innerField : innerObj.getClass().getDeclaredFields()) {
-                  if (innerField.getType().isAssignableFrom(Callable.class)) {
-                    innerField.setAccessible(true);
-                    return ((Callable<?>) innerField.get(innerObj)).toString();
-                  }
-                }
-              }
-            }
-          }
-        }
-      } catch (ClassNotFoundException | IllegalArgumentException | IllegalAccessException e) {
-        log.debug("Cannot get a proper name for TrustedListenableFutureTask: {}", e.getMessage());
-      }
-      return runnable.toString();
-    }
-  }
-
-  /**
-   * Same as Task class, but with a reference to ProjectRunnable, used to retrieve the project name
-   * from the operation queued
-   */
-  public static class ProjectTask<V> extends Task<V> implements ProjectRunnable {
-
-    private final ProjectRunnable runnable;
-
-    ProjectTask(
-        ProjectRunnable runnable, RunnableScheduledFuture<V> task, Executor executor, int taskId) {
-      super(runnable, task, executor, taskId);
-      this.runnable = runnable;
-    }
-
-    @Override
-    public Project.NameKey getProjectNameKey() {
-      return runnable.getProjectNameKey();
-    }
-
-    @Override
-    public String getRemoteName() {
-      return runnable.getRemoteName();
-    }
-
-    @Override
-    public boolean hasCustomizedPrint() {
-      return runnable.hasCustomizedPrint();
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/AllRefsWatcher.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/AllRefsWatcher.java
deleted file mode 100644
index 4afaacd..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/AllRefsWatcher.java
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.git.receive;
-
-import static com.google.common.base.Preconditions.checkState;
-
-import java.util.Map;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.transport.AdvertiseRefsHook;
-import org.eclipse.jgit.transport.BaseReceivePack;
-import org.eclipse.jgit.transport.ServiceMayNotContinueException;
-import org.eclipse.jgit.transport.UploadPack;
-
-/**
- * Hook that scans all refs and holds onto the results reference.
- *
- * <p>This allows a caller who has an {@code AllRefsWatcher} instance to get the full map of refs in
- * the repo, even if refs are filtered by a later hook or filter.
- */
-class AllRefsWatcher implements AdvertiseRefsHook {
-  private Map<String, Ref> allRefs;
-
-  @Override
-  public void advertiseRefs(BaseReceivePack rp) throws ServiceMayNotContinueException {
-    allRefs = HookUtil.ensureAllRefsAdvertised(rp);
-  }
-
-  @Override
-  public void advertiseRefs(UploadPack uploadPack) {
-    throw new UnsupportedOperationException();
-  }
-
-  Map<String, Ref> getAllRefs() {
-    checkState(allRefs != null, "getAllRefs() only valid after refs were advertised");
-    return allRefs;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/AsyncReceiveCommits.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/AsyncReceiveCommits.java
deleted file mode 100644
index bed9bd4..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/AsyncReceiveCommits.java
+++ /dev/null
@@ -1,289 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.git.receive;
-
-import com.google.common.collect.SetMultimap;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.data.Capable;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.config.ConfigUtil;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.git.HackPushNegotiateHook;
-import com.google.gerrit.server.git.MultiProgressMonitor;
-import com.google.gerrit.server.git.ProjectRunnable;
-import com.google.gerrit.server.git.TransferConfig;
-import com.google.gerrit.server.git.VisibleRefFilter;
-import com.google.gerrit.server.notedb.ReviewerStateInternal;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.ProjectPermission;
-import com.google.gerrit.server.project.ContributorAgreementsChecker;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.query.change.InternalChangeQuery;
-import com.google.gerrit.server.util.MagicBranch;
-import com.google.gerrit.server.util.RequestScopePropagator;
-import com.google.inject.Inject;
-import com.google.inject.PrivateModule;
-import com.google.inject.Provider;
-import com.google.inject.Provides;
-import com.google.inject.Singleton;
-import com.google.inject.assistedinject.Assisted;
-import com.google.inject.assistedinject.FactoryModuleBuilder;
-import com.google.inject.name.Named;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.TimeUnit;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.transport.AdvertiseRefsHook;
-import org.eclipse.jgit.transport.AdvertiseRefsHookChain;
-import org.eclipse.jgit.transport.PreReceiveHook;
-import org.eclipse.jgit.transport.ReceiveCommand;
-import org.eclipse.jgit.transport.ReceiveCommand.Result;
-import org.eclipse.jgit.transport.ReceivePack;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Hook that delegates to {@link ReceiveCommits} in a worker thread. */
-public class AsyncReceiveCommits implements PreReceiveHook {
-  private static final Logger log = LoggerFactory.getLogger(AsyncReceiveCommits.class);
-
-  private static final String TIMEOUT_NAME = "ReceiveCommitsOverallTimeout";
-
-  public interface Factory {
-    AsyncReceiveCommits create(
-        ProjectControl projectControl,
-        Repository repository,
-        @Nullable MessageSender messageSender,
-        SetMultimap<ReviewerStateInternal, Account.Id> extraReviewers);
-  }
-
-  public static class Module extends PrivateModule {
-    @Override
-    public void configure() {
-      install(new FactoryModuleBuilder().build(AsyncReceiveCommits.Factory.class));
-      expose(AsyncReceiveCommits.Factory.class);
-      // Don't expose the binding for ReceiveCommits.Factory. All callers should
-      // be using AsyncReceiveCommits.Factory instead.
-      install(new FactoryModuleBuilder().build(ReceiveCommits.Factory.class));
-    }
-
-    @Provides
-    @Singleton
-    @Named(TIMEOUT_NAME)
-    long getTimeoutMillis(@GerritServerConfig Config cfg) {
-      return ConfigUtil.getTimeUnit(
-          cfg, "receive", null, "timeout", TimeUnit.MINUTES.toMillis(4), TimeUnit.MILLISECONDS);
-    }
-  }
-
-  private class Worker implements ProjectRunnable {
-    final MultiProgressMonitor progress;
-
-    private final Collection<ReceiveCommand> commands;
-
-    private Worker(Collection<ReceiveCommand> commands) {
-      this.commands = commands;
-      progress = new MultiProgressMonitor(new MessageSenderOutputStream(), "Processing changes");
-    }
-
-    @Override
-    public void run() {
-      rc.processCommands(commands, progress);
-    }
-
-    @Override
-    public Project.NameKey getProjectNameKey() {
-      return rc.getProject().getNameKey();
-    }
-
-    @Override
-    public String getRemoteName() {
-      return null;
-    }
-
-    @Override
-    public boolean hasCustomizedPrint() {
-      return true;
-    }
-
-    @Override
-    public String toString() {
-      return "receive-commits";
-    }
-
-    void sendMessages() {
-      rc.sendMessages();
-    }
-
-    private class MessageSenderOutputStream extends OutputStream {
-      @Override
-      public void write(int b) {
-        rc.getMessageSender().sendBytes(new byte[] {(byte) b});
-      }
-
-      @Override
-      public void write(byte[] what, int off, int len) {
-        rc.getMessageSender().sendBytes(what, off, len);
-      }
-
-      @Override
-      public void write(byte[] what) {
-        rc.getMessageSender().sendBytes(what);
-      }
-
-      @Override
-      public void flush() {
-        rc.getMessageSender().flush();
-      }
-    }
-  }
-
-  private final ReceiveCommits rc;
-  private final ReceivePack rp;
-  private final ExecutorService executor;
-  private final RequestScopePropagator scopePropagator;
-  private final ReceiveConfig receiveConfig;
-  private final ContributorAgreementsChecker contributorAgreements;
-  private final long timeoutMillis;
-  private final ProjectControl projectControl;
-  private final Repository repo;
-  private final AllRefsWatcher allRefsWatcher;
-
-  @Inject
-  AsyncReceiveCommits(
-      ReceiveCommits.Factory factory,
-      PermissionBackend permissionBackend,
-      VisibleRefFilter.Factory refFilterFactory,
-      Provider<InternalChangeQuery> queryProvider,
-      @ReceiveCommitsExecutor ExecutorService executor,
-      RequestScopePropagator scopePropagator,
-      ReceiveConfig receiveConfig,
-      TransferConfig transferConfig,
-      Provider<LazyPostReceiveHookChain> lazyPostReceive,
-      ContributorAgreementsChecker contributorAgreements,
-      @Named(TIMEOUT_NAME) long timeoutMillis,
-      @Assisted ProjectControl projectControl,
-      @Assisted Repository repo,
-      @Assisted @Nullable MessageSender messageSender,
-      @Assisted SetMultimap<ReviewerStateInternal, Account.Id> extraReviewers)
-      throws PermissionBackendException {
-    this.executor = executor;
-    this.scopePropagator = scopePropagator;
-    this.receiveConfig = receiveConfig;
-    this.contributorAgreements = contributorAgreements;
-    this.timeoutMillis = timeoutMillis;
-    this.projectControl = projectControl;
-    this.repo = repo;
-
-    IdentifiedUser user = projectControl.getUser().asIdentifiedUser();
-    ProjectState state = projectControl.getProjectState();
-    Project.NameKey projectName = projectControl.getProject().getNameKey();
-    rp = new ReceivePack(repo);
-    rp.setAllowCreates(true);
-    rp.setAllowDeletes(true);
-    rp.setAllowNonFastForwards(true);
-    rp.setRefLogIdent(user.newRefLogIdent());
-    rp.setTimeout(transferConfig.getTimeout());
-    rp.setMaxObjectSizeLimit(state.getEffectiveMaxObjectSizeLimit().value);
-    rp.setCheckReceivedObjects(state.getConfig().getCheckReceivedObjects());
-    rp.setRefFilter(new ReceiveRefFilter());
-    rp.setAllowPushOptions(true);
-    rp.setPreReceiveHook(this);
-    rp.setPostReceiveHook(lazyPostReceive.get());
-
-    // If the user lacks READ permission, some references may be filtered and hidden from view.
-    // Check objects mentioned inside the incoming pack file are reachable from visible refs.
-    try {
-      permissionBackend.user(user).project(projectName).check(ProjectPermission.READ);
-    } catch (AuthException e) {
-      rp.setCheckReferencedObjectsAreReachable(receiveConfig.checkReferencedObjectsAreReachable);
-    }
-
-    List<AdvertiseRefsHook> advHooks = new ArrayList<>(4);
-    allRefsWatcher = new AllRefsWatcher();
-    advHooks.add(allRefsWatcher);
-    advHooks.add(refFilterFactory.create(state, repo).setShowMetadata(false));
-    advHooks.add(new ReceiveCommitsAdvertiseRefsHook(queryProvider, projectName));
-    advHooks.add(new HackPushNegotiateHook());
-    rp.setAdvertiseRefsHook(AdvertiseRefsHookChain.newChain(advHooks));
-
-    rc = factory.create(projectControl, rp, allRefsWatcher, extraReviewers);
-    rc.init();
-    rc.setMessageSender(messageSender);
-  }
-
-  /** Determine if the user can upload commits. */
-  public Capable canUpload() throws IOException {
-    Capable result = projectControl.canPushToAtLeastOneRef();
-    if (result != Capable.OK) {
-      return result;
-    }
-
-    try {
-      contributorAgreements.check(
-          projectControl.getProject().getNameKey(), projectControl.getUser());
-    } catch (AuthException e) {
-      return new Capable(e.getMessage());
-    }
-
-    if (receiveConfig.checkMagicRefs) {
-      return MagicBranch.checkMagicBranchRefs(repo, projectControl.getProject());
-    }
-    return Capable.OK;
-  }
-
-  @Override
-  public void onPreReceive(ReceivePack rp, Collection<ReceiveCommand> commands) {
-    if (commands.stream().anyMatch(c -> c.getResult() != Result.NOT_ATTEMPTED)) {
-      // Stop processing when command was already processed by previously invoked
-      // pre-receive hooks
-      return;
-    }
-    Worker w = new Worker(commands);
-    try {
-      w.progress.waitFor(
-          executor.submit(scopePropagator.wrap(w)), timeoutMillis, TimeUnit.MILLISECONDS);
-    } catch (ExecutionException e) {
-      log.warn(
-          "Error in ReceiveCommits while processing changes for project {}",
-          projectControl.getProject().getName(),
-          e);
-      rp.sendError("internal error while processing changes");
-      // ReceiveCommits has tried its best to catch errors, so anything at this
-      // point is very bad.
-      for (ReceiveCommand c : commands) {
-        if (c.getResult() == Result.NOT_ATTEMPTED) {
-          c.setResult(Result.REJECTED_OTHER_REASON, "internal error");
-        }
-      }
-    } finally {
-      w.sendMessages();
-    }
-  }
-
-  public ReceivePack getReceivePack() {
-    return rp;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/HookUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/HookUtil.java
deleted file mode 100644
index 90b220a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/HookUtil.java
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.git.receive;
-
-import java.io.IOException;
-import java.util.Map;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.RefDatabase;
-import org.eclipse.jgit.transport.BaseReceivePack;
-import org.eclipse.jgit.transport.ServiceMayNotContinueException;
-
-/** Static utilities for writing {@link ReceiveCommits}-related hooks. */
-class HookUtil {
-  /**
-   * Scan and advertise all refs in the repo if refs have not already been advertised; otherwise,
-   * just return the advertised map.
-   *
-   * @param rp receive-pack handler.
-   * @return map of refs that were advertised.
-   * @throws ServiceMayNotContinueException if a problem occurred.
-   */
-  static Map<String, Ref> ensureAllRefsAdvertised(BaseReceivePack rp)
-      throws ServiceMayNotContinueException {
-    Map<String, Ref> refs = rp.getAdvertisedRefs();
-    if (refs != null) {
-      return refs;
-    }
-    try {
-      refs = rp.getRepository().getRefDatabase().getRefs(RefDatabase.ALL);
-    } catch (ServiceMayNotContinueException e) {
-      throw e;
-    } catch (IOException e) {
-      ServiceMayNotContinueException ex = new ServiceMayNotContinueException();
-      ex.initCause(e);
-      throw ex;
-    }
-    rp.setAdvertisedRefs(refs, rp.getAdvertisedObjects());
-    return refs;
-  }
-
-  private HookUtil() {}
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/MessageSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/MessageSender.java
deleted file mode 100644
index a338021..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/MessageSender.java
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.git.receive;
-
-/**
- * Interface used by {@link ReceiveCommits} for send messages over the wire during {@code
- * receive-pack}.
- */
-public interface MessageSender {
-  void sendMessage(String what);
-
-  void sendError(String what);
-
-  void sendBytes(byte[] what);
-
-  void sendBytes(byte[] what, int off, int len);
-
-  void flush();
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveCommits.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveCommits.java
deleted file mode 100644
index 364f9fb..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveCommits.java
+++ /dev/null
@@ -1,3022 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.server.git.receive;
-
-import static com.google.common.base.MoreObjects.firstNonNull;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.gerrit.common.FooterConstants.CHANGE_ID;
-import static com.google.gerrit.reviewdb.client.RefNames.REFS_CHANGES;
-import static com.google.gerrit.server.change.HashtagsUtil.cleanupHashtag;
-import static com.google.gerrit.server.git.MultiProgressMonitor.UNKNOWN;
-import static com.google.gerrit.server.git.receive.ReceiveConstants.COMMAND_REJECTION_MESSAGE_FOOTER;
-import static com.google.gerrit.server.git.receive.ReceiveConstants.ONLY_CHANGE_OWNER_OR_PROJECT_OWNER_CAN_MODIFY_WIP;
-import static com.google.gerrit.server.git.receive.ReceiveConstants.PUSH_OPTION_SKIP_VALIDATION;
-import static com.google.gerrit.server.git.receive.ReceiveConstants.SAME_CHANGE_ID_IN_MULTIPLE_CHANGES;
-import static com.google.gerrit.server.git.validators.CommitValidators.NEW_PATCHSET_PATTERN;
-import static com.google.gerrit.server.mail.MailUtil.getRecipientsFromFooters;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.Comparator.comparingInt;
-import static java.util.stream.Collectors.joining;
-import static java.util.stream.Collectors.toList;
-import static org.eclipse.jgit.lib.Constants.R_HEADS;
-import static org.eclipse.jgit.transport.ReceiveCommand.Result.NOT_ATTEMPTED;
-import static org.eclipse.jgit.transport.ReceiveCommand.Result.OK;
-import static org.eclipse.jgit.transport.ReceiveCommand.Result.REJECTED_MISSING_OBJECT;
-import static org.eclipse.jgit.transport.ReceiveCommand.Result.REJECTED_NONFASTFORWARD;
-import static org.eclipse.jgit.transport.ReceiveCommand.Result.REJECTED_OTHER_REASON;
-
-import com.google.common.base.Function;
-import com.google.common.base.Splitter;
-import com.google.common.base.Strings;
-import com.google.common.collect.BiMap;
-import com.google.common.collect.HashBiMap;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableListMultimap;
-import com.google.common.collect.ImmutableSetMultimap;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.LinkedListMultimap;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.MultimapBuilder;
-import com.google.common.collect.SetMultimap;
-import com.google.common.collect.Sets;
-import com.google.common.collect.SortedSetMultimap;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.LabelTypes;
-import com.google.gerrit.common.data.PermissionRule;
-import com.google.gerrit.extensions.api.changes.HashtagsInput;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.api.changes.RecipientType;
-import com.google.gerrit.extensions.api.changes.SubmitInput;
-import com.google.gerrit.extensions.api.projects.ProjectConfigEntryType;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.registration.DynamicMap.Entry;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.client.PatchSetInfo;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.client.RevId;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.ChangeUtil;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.Sequences;
-import com.google.gerrit.server.account.AccountResolver;
-import com.google.gerrit.server.account.AccountsUpdate;
-import com.google.gerrit.server.change.ChangeInserter;
-import com.google.gerrit.server.change.SetHashtagsOp;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.config.PluginConfig;
-import com.google.gerrit.server.config.ProjectConfigEntry;
-import com.google.gerrit.server.edit.ChangeEdit;
-import com.google.gerrit.server.edit.ChangeEditUtil;
-import com.google.gerrit.server.events.CommitReceivedEvent;
-import com.google.gerrit.server.git.BanCommit;
-import com.google.gerrit.server.git.ChangeReportFormatter;
-import com.google.gerrit.server.git.GroupCollector;
-import com.google.gerrit.server.git.MergeOp;
-import com.google.gerrit.server.git.MergeOpRepoManager;
-import com.google.gerrit.server.git.MergedByPushOp;
-import com.google.gerrit.server.git.MultiProgressMonitor;
-import com.google.gerrit.server.git.MultiProgressMonitor.Task;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.git.ReceivePackInitializer;
-import com.google.gerrit.server.git.SubmoduleException;
-import com.google.gerrit.server.git.SubmoduleOp;
-import com.google.gerrit.server.git.TagCache;
-import com.google.gerrit.server.git.ValidationError;
-import com.google.gerrit.server.git.validators.CommitValidationException;
-import com.google.gerrit.server.git.validators.CommitValidationMessage;
-import com.google.gerrit.server.git.validators.CommitValidators;
-import com.google.gerrit.server.git.validators.RefOperationValidationException;
-import com.google.gerrit.server.git.validators.RefOperationValidators;
-import com.google.gerrit.server.git.validators.ValidationMessage;
-import com.google.gerrit.server.index.change.ChangeIndexer;
-import com.google.gerrit.server.mail.MailUtil.MailRecipients;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.NotesMigration;
-import com.google.gerrit.server.notedb.ReviewerStateInternal;
-import com.google.gerrit.server.patch.PatchSetInfoFactory;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.RefPermission;
-import com.google.gerrit.server.project.CreateRefControl;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.InternalChangeQuery;
-import com.google.gerrit.server.ssh.SshInfo;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.Context;
-import com.google.gerrit.server.update.RepoContext;
-import com.google.gerrit.server.update.RepoOnlyOp;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gerrit.server.util.LabelVote;
-import com.google.gerrit.server.util.MagicBranch;
-import com.google.gerrit.server.util.RequestId;
-import com.google.gerrit.server.util.RequestScopePropagator;
-import com.google.gerrit.util.cli.CmdLineParser;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import com.google.inject.util.Providers;
-import java.io.IOException;
-import java.io.StringWriter;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.regex.Matcher;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.IncorrectObjectTypeException;
-import org.eclipse.jgit.errors.MissingObjectException;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.notes.NoteMap;
-import org.eclipse.jgit.revwalk.FooterLine;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevObject;
-import org.eclipse.jgit.revwalk.RevSort;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.revwalk.filter.RevFilter;
-import org.eclipse.jgit.transport.ReceiveCommand;
-import org.eclipse.jgit.transport.ReceiveCommand.Result;
-import org.eclipse.jgit.transport.ReceivePack;
-import org.kohsuke.args4j.CmdLineException;
-import org.kohsuke.args4j.Option;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Receives change upload using the Git receive-pack protocol. */
-class ReceiveCommits {
-  private static final Logger log = LoggerFactory.getLogger(ReceiveCommits.class);
-
-  private enum ReceiveError {
-    CONFIG_UPDATE(
-        "You are not allowed to perform this operation.\n"
-            + "Configuration changes can only be pushed by project owners\n"
-            + "who also have 'Push' rights on "
-            + RefNames.REFS_CONFIG),
-    UPDATE(
-        "You are not allowed to perform this operation.\n"
-            + "To push into this reference you need 'Push' rights."),
-    DELETE(
-        "You need 'Delete Reference' rights or 'Push' rights with the \n"
-            + "'Force Push' flag set to delete references."),
-    DELETE_CHANGES("Cannot delete from '" + REFS_CHANGES + "'"),
-    CODE_REVIEW(
-        "You need 'Push' rights to upload code review requests.\n"
-            + "Verify that you are pushing to the right branch.");
-
-    private final String value;
-
-    ReceiveError(String value) {
-      this.value = value;
-    }
-
-    String get() {
-      return value;
-    }
-  }
-
-  interface Factory {
-    ReceiveCommits create(
-        ProjectControl projectControl,
-        ReceivePack receivePack,
-        AllRefsWatcher allRefsWatcher,
-        SetMultimap<ReviewerStateInternal, Account.Id> extraReviewers);
-  }
-
-  private class ReceivePackMessageSender implements MessageSender {
-    @Override
-    public void sendMessage(String what) {
-      rp.sendMessage(what);
-    }
-
-    @Override
-    public void sendError(String what) {
-      rp.sendError(what);
-    }
-
-    @Override
-    public void sendBytes(byte[] what) {
-      sendBytes(what, 0, what.length);
-    }
-
-    @Override
-    public void sendBytes(byte[] what, int off, int len) {
-      try {
-        rp.getMessageOutputStream().write(what, off, len);
-      } catch (IOException e) {
-        // Ignore write failures (matching JGit behavior).
-      }
-    }
-
-    @Override
-    public void flush() {
-      try {
-        rp.getMessageOutputStream().flush();
-      } catch (IOException e) {
-        // Ignore write failures (matching JGit behavior).
-      }
-    }
-  }
-
-  private static final Function<Exception, RestApiException> INSERT_EXCEPTION =
-      new Function<Exception, RestApiException>() {
-        @Override
-        public RestApiException apply(Exception input) {
-          if (input instanceof RestApiException) {
-            return (RestApiException) input;
-          } else if ((input instanceof ExecutionException)
-              && (input.getCause() instanceof RestApiException)) {
-            return (RestApiException) input.getCause();
-          }
-          return new RestApiException("Error inserting change/patchset", input);
-        }
-      };
-
-  // ReceiveCommits has a lot of fields, sorry. Here and in the constructor they are split up
-  // somewhat, and kept sorted lexicographically within sections, except where later assignments
-  // depend on previous ones.
-
-  // Injected fields.
-  private final AccountResolver accountResolver;
-  private final AccountsUpdate.Server accountsUpdate;
-  private final AllProjectsName allProjectsName;
-  private final BatchUpdate.Factory batchUpdateFactory;
-  private final ChangeEditUtil editUtil;
-  private final ChangeIndexer indexer;
-  private final ChangeInserter.Factory changeInserterFactory;
-  private final ChangeNotes.Factory notesFactory;
-  private final CmdLineParser.Factory optionParserFactory;
-  private final CommitValidators.Factory commitValidatorsFactory;
-  private final DynamicMap<ProjectConfigEntry> pluginConfigEntries;
-  private final DynamicSet<ReceivePackInitializer> initializers;
-  private final IdentifiedUser user;
-  private final MergedByPushOp.Factory mergedByPushOpFactory;
-  private final NotesMigration notesMigration;
-  private final PatchSetInfoFactory patchSetInfoFactory;
-  private final PatchSetUtil psUtil;
-  private final PermissionBackend permissionBackend;
-  private final ProjectCache projectCache;
-  private final Provider<InternalChangeQuery> queryProvider;
-  private final Provider<MergeOp> mergeOpProvider;
-  private final Provider<MergeOpRepoManager> ormProvider;
-  private final ReceiveConfig receiveConfig;
-  private final RefOperationValidators.Factory refValidatorsFactory;
-  private final ReplaceOp.Factory replaceOpFactory;
-  private final RequestScopePropagator requestScopePropagator;
-  private final ReviewDb db;
-  private final Sequences seq;
-  private final SetHashtagsOp.Factory hashtagsFactory;
-  private final SshInfo sshInfo;
-  private final SubmoduleOp.Factory subOpFactory;
-  private final TagCache tagCache;
-  private final CreateRefControl createRefControl;
-
-  // Assisted injected fields.
-  private final AllRefsWatcher allRefsWatcher;
-  private final ImmutableSetMultimap<ReviewerStateInternal, Account.Id> extraReviewers;
-  private final ProjectControl projectControl;
-  private final ReceivePack rp;
-
-  // Immutable fields derived from constructor arguments.
-  private final LabelTypes labelTypes;
-  private final NoteMap rejectCommits;
-  private final PermissionBackend.ForProject permissions;
-  private final Project project;
-  private final Repository repo;
-  private final RequestId receiveId;
-
-  // Collections populated during processing.
-  private final List<UpdateGroupsRequest> updateGroups;
-  private final List<ValidationMessage> messages;
-  private final ListMultimap<ReceiveError, String> errors;
-  private final ListMultimap<String, String> pushOptions;
-  private final Map<Change.Id, ReplaceRequest> replaceByChange;
-  private final Set<ObjectId> validCommits;
-
-  /**
-   * Actual commands to be executed, as opposed to the mix of actual and magic commands that were
-   * provided over the wire.
-   *
-   * <p>Excludes commands executed implicitly as part of other {@link BatchUpdateOp}s, such as
-   * creating patch set refs.
-   */
-  private final List<ReceiveCommand> actualCommands;
-
-  // Collections lazily populated during processing.
-  private List<CreateRequest> newChanges;
-  private ListMultimap<Change.Id, Ref> refsByChange;
-  private ListMultimap<ObjectId, Ref> refsById;
-
-  // Other settings populated during processing.
-  private MagicBranchInput magicBranch;
-  private boolean newChangeForAllNotInTarget;
-  private String setFullNameTo;
-  private boolean setChangeAsPrivate;
-
-  // Handles for outputting back over the wire to the end user.
-  private Task newProgress;
-  private Task replaceProgress;
-  private Task closeProgress;
-  private Task commandProgress;
-  private MessageSender messageSender;
-  private final ChangeReportFormatter changeFormatter;
-
-  @Inject
-  ReceiveCommits(
-      AccountResolver accountResolver,
-      AccountsUpdate.Server accountsUpdate,
-      AllProjectsName allProjectsName,
-      BatchUpdate.Factory batchUpdateFactory,
-      ChangeEditUtil editUtil,
-      ChangeIndexer indexer,
-      ChangeInserter.Factory changeInserterFactory,
-      ChangeNotes.Factory notesFactory,
-      CmdLineParser.Factory optionParserFactory,
-      CommitValidators.Factory commitValidatorsFactory,
-      DynamicMap<ProjectConfigEntry> pluginConfigEntries,
-      DynamicSet<ReceivePackInitializer> initializers,
-      MergedByPushOp.Factory mergedByPushOpFactory,
-      NotesMigration notesMigration,
-      PatchSetInfoFactory patchSetInfoFactory,
-      PatchSetUtil psUtil,
-      PermissionBackend permissionBackend,
-      ProjectCache projectCache,
-      Provider<InternalChangeQuery> queryProvider,
-      Provider<MergeOp> mergeOpProvider,
-      Provider<MergeOpRepoManager> ormProvider,
-      ReceiveConfig receiveConfig,
-      RefOperationValidators.Factory refValidatorsFactory,
-      ReplaceOp.Factory replaceOpFactory,
-      RequestScopePropagator requestScopePropagator,
-      ReviewDb db,
-      Sequences seq,
-      SetHashtagsOp.Factory hashtagsFactory,
-      SshInfo sshInfo,
-      SubmoduleOp.Factory subOpFactory,
-      TagCache tagCache,
-      CreateRefControl createRefControl,
-      DynamicItem<ChangeReportFormatter> changeFormatterProvider,
-      @Assisted ProjectControl projectControl,
-      @Assisted ReceivePack rp,
-      @Assisted AllRefsWatcher allRefsWatcher,
-      @Assisted SetMultimap<ReviewerStateInternal, Account.Id> extraReviewers)
-      throws IOException {
-    // Injected fields.
-    this.accountResolver = accountResolver;
-    this.accountsUpdate = accountsUpdate;
-    this.allProjectsName = allProjectsName;
-    this.batchUpdateFactory = batchUpdateFactory;
-    this.changeInserterFactory = changeInserterFactory;
-    this.commitValidatorsFactory = commitValidatorsFactory;
-    this.changeFormatter = changeFormatterProvider.get();
-    this.user = projectControl.getUser().asIdentifiedUser();
-    this.db = db;
-    this.editUtil = editUtil;
-    this.hashtagsFactory = hashtagsFactory;
-    this.indexer = indexer;
-    this.initializers = initializers;
-    this.mergeOpProvider = mergeOpProvider;
-    this.mergedByPushOpFactory = mergedByPushOpFactory;
-    this.notesFactory = notesFactory;
-    this.notesMigration = notesMigration;
-    this.optionParserFactory = optionParserFactory;
-    this.ormProvider = ormProvider;
-    this.patchSetInfoFactory = patchSetInfoFactory;
-    this.permissionBackend = permissionBackend;
-    this.pluginConfigEntries = pluginConfigEntries;
-    this.projectCache = projectCache;
-    this.psUtil = psUtil;
-    this.queryProvider = queryProvider;
-    this.receiveConfig = receiveConfig;
-    this.refValidatorsFactory = refValidatorsFactory;
-    this.replaceOpFactory = replaceOpFactory;
-    this.requestScopePropagator = requestScopePropagator;
-    this.seq = seq;
-    this.sshInfo = sshInfo;
-    this.subOpFactory = subOpFactory;
-    this.tagCache = tagCache;
-    this.createRefControl = createRefControl;
-
-    // Assisted injected fields.
-    this.allRefsWatcher = allRefsWatcher;
-    this.extraReviewers = ImmutableSetMultimap.copyOf(extraReviewers);
-    this.projectControl = projectControl;
-    this.rp = rp;
-
-    // Immutable fields derived from constructor arguments.
-    repo = rp.getRepository();
-    project = projectControl.getProject();
-    labelTypes = projectControl.getProjectState().getLabelTypes();
-    permissions = permissionBackend.user(user).project(project.getNameKey());
-    receiveId = RequestId.forProject(project.getNameKey());
-    rejectCommits = BanCommit.loadRejectCommitsMap(rp.getRepository(), rp.getRevWalk());
-
-    // Collections populated during processing.
-    actualCommands = new ArrayList<>();
-    errors = LinkedListMultimap.create();
-    messages = new ArrayList<>();
-    pushOptions = LinkedListMultimap.create();
-    replaceByChange = new LinkedHashMap<>();
-    updateGroups = new ArrayList<>();
-    validCommits = new HashSet<>();
-
-    // Collections lazily populated during processing.
-    newChanges = Collections.emptyList();
-
-    // Other settings populated during processing.
-    newChangeForAllNotInTarget =
-        projectControl.getProjectState().isCreateNewChangeForAllNotInTarget();
-
-    // Handles for outputting back over the wire to the end user.
-    messageSender = new ReceivePackMessageSender();
-  }
-
-  void init() {
-    for (ReceivePackInitializer i : initializers) {
-      i.init(projectControl.getProject().getNameKey(), rp);
-    }
-  }
-
-  /** Set a message sender for this operation. */
-  void setMessageSender(MessageSender ms) {
-    messageSender = ms != null ? ms : new ReceivePackMessageSender();
-  }
-
-  MessageSender getMessageSender() {
-    if (messageSender == null) {
-      setMessageSender(null);
-    }
-    return messageSender;
-  }
-
-  Project getProject() {
-    return project;
-  }
-
-  private void addMessage(String message) {
-    messages.add(new CommitValidationMessage(message, false));
-  }
-
-  void addError(String error) {
-    messages.add(new CommitValidationMessage(error, true));
-  }
-
-  void sendMessages() {
-    for (ValidationMessage m : messages) {
-      if (m.isError()) {
-        messageSender.sendError(m.getMessage());
-      } else {
-        messageSender.sendMessage(m.getMessage());
-      }
-    }
-  }
-
-  void processCommands(Collection<ReceiveCommand> commands, MultiProgressMonitor progress) {
-    newProgress = progress.beginSubTask("new", UNKNOWN);
-    replaceProgress = progress.beginSubTask("updated", UNKNOWN);
-    closeProgress = progress.beginSubTask("closed", UNKNOWN);
-    commandProgress = progress.beginSubTask("refs", UNKNOWN);
-
-    try {
-      parseCommands(commands);
-    } catch (PermissionBackendException | NoSuchProjectException | IOException err) {
-      for (ReceiveCommand cmd : actualCommands) {
-        if (cmd.getResult() == NOT_ATTEMPTED) {
-          cmd.setResult(REJECTED_OTHER_REASON, "internal server error");
-        }
-      }
-      logError(String.format("Failed to process refs in %s", project.getName()), err);
-    }
-    if (magicBranch != null && magicBranch.cmd.getResult() == NOT_ATTEMPTED) {
-      selectNewAndReplacedChangesFromMagicBranch();
-    }
-    preparePatchSetsForReplace();
-    insertChangesAndPatchSets();
-    newProgress.end();
-    replaceProgress.end();
-
-    if (!errors.isEmpty()) {
-      logDebug("Handling error conditions: {}", errors.keySet());
-      for (ReceiveError error : errors.keySet()) {
-        rp.sendMessage(buildError(error, errors.get(error)));
-      }
-      rp.sendMessage(String.format("User: %s", displayName(user)));
-      rp.sendMessage(COMMAND_REJECTION_MESSAGE_FOOTER);
-    }
-
-    Set<Branch.NameKey> branches = new HashSet<>();
-    for (ReceiveCommand c : actualCommands) {
-      // Most post-update steps should happen in UpdateOneRefOp#postUpdate. The only steps that
-      // should happen in this loop are things that can't happen within one BatchUpdate because they
-      // involve kicking off an additional BatchUpdate.
-      if (c.getResult() != OK) {
-        continue;
-      }
-      if (isHead(c) || isConfig(c)) {
-        switch (c.getType()) {
-          case CREATE:
-          case UPDATE:
-          case UPDATE_NONFASTFORWARD:
-            autoCloseChanges(c);
-            branches.add(new Branch.NameKey(project.getNameKey(), c.getRefName()));
-            break;
-
-          case DELETE:
-            break;
-        }
-      }
-    }
-
-    // Update superproject gitlinks if required.
-    if (!branches.isEmpty()) {
-      try (MergeOpRepoManager orm = ormProvider.get()) {
-        orm.setContext(db, TimeUtil.nowTs(), user, receiveId);
-        SubmoduleOp op = subOpFactory.create(branches, orm);
-        op.updateSuperProjects();
-      } catch (SubmoduleException e) {
-        logError("Can't update the superprojects", e);
-      }
-    }
-
-    // Update account info with details discovered during commit walking.
-    updateAccountInfo();
-
-    closeProgress.end();
-    commandProgress.end();
-    progress.end();
-    reportMessages();
-  }
-
-  private void reportMessages() {
-    List<CreateRequest> created =
-        newChanges.stream().filter(r -> r.change != null).collect(toList());
-    if (!created.isEmpty()) {
-      addMessage("");
-      addMessage("New Changes:");
-      for (CreateRequest c : created) {
-        addMessage(
-            changeFormatter.newChange(
-                ChangeReportFormatter.Input.builder().setChange(c.change).build()));
-      }
-      addMessage("");
-    }
-
-    List<ReplaceRequest> updated =
-        replaceByChange.values().stream()
-            .filter(r -> !r.skip && r.inputCommand.getResult() == OK)
-            .sorted(comparingInt(r -> r.notes.getChangeId().get()))
-            .collect(toList());
-    if (!updated.isEmpty()) {
-      addMessage("");
-      addMessage("Updated Changes:");
-      boolean edit = magicBranch != null && (magicBranch.edit || magicBranch.draft);
-      for (ReplaceRequest u : updated) {
-        String subject;
-        Change change = u.notes.getChange();
-        if (edit) {
-          try {
-            subject = rp.getRevWalk().parseCommit(u.newCommitId).getShortMessage();
-          } catch (IOException e) {
-            // Log and fall back to original change subject
-            logWarn("failed to get subject for edit patch set", e);
-            subject = change.getSubject();
-          }
-        } else {
-          subject = u.info.getSubject();
-        }
-
-        boolean isPrivate = change.isPrivate();
-        boolean wip = change.isWorkInProgress();
-        if (magicBranch != null) {
-          if (magicBranch.isPrivate) {
-            isPrivate = true;
-          } else if (magicBranch.removePrivate) {
-            isPrivate = false;
-          }
-          if (magicBranch.workInProgress) {
-            wip = true;
-          } else if (magicBranch.ready) {
-            wip = false;
-          }
-        }
-
-        ChangeReportFormatter.Input input =
-            ChangeReportFormatter.Input.builder()
-                .setChange(change)
-                .setSubject(subject)
-                .setIsEdit(edit)
-                .setIsPrivate(isPrivate)
-                .setIsWorkInProgress(wip)
-                .build();
-        addMessage(changeFormatter.changeUpdated(input));
-      }
-      addMessage("");
-    }
-
-    // TODO(xchangcheng): remove after migrating tools which are using this magic branch.
-    if (magicBranch != null && magicBranch.publish) {
-      addMessage("Pushing to refs/publish/* is deprecated, use refs/for/* instead.");
-    }
-  }
-
-  private void insertChangesAndPatchSets() {
-    ReceiveCommand magicBranchCmd = magicBranch != null ? magicBranch.cmd : null;
-    if (magicBranchCmd != null && magicBranchCmd.getResult() != NOT_ATTEMPTED) {
-      logWarn(
-          String.format(
-              "Skipping change updates on %s because ref update failed: %s %s",
-              project.getName(),
-              magicBranchCmd.getResult(),
-              Strings.nullToEmpty(magicBranchCmd.getMessage())));
-      return;
-    }
-
-    try (BatchUpdate bu =
-            batchUpdateFactory.create(
-                db, project.getNameKey(), user.materializedCopy(), TimeUtil.nowTs());
-        ObjectInserter ins = repo.newObjectInserter();
-        ObjectReader reader = ins.newReader();
-        RevWalk rw = new RevWalk(reader)) {
-      bu.setRepository(repo, rw, ins).updateChangesInParallel();
-      bu.setRequestId(receiveId);
-      bu.setRefLogMessage("push");
-
-      logDebug("Adding {} replace requests", newChanges.size());
-      for (ReplaceRequest replace : replaceByChange.values()) {
-        replace.addOps(bu, replaceProgress);
-      }
-
-      logDebug("Adding {} create requests", newChanges.size());
-      for (CreateRequest create : newChanges) {
-        create.addOps(bu);
-      }
-
-      logDebug("Adding {} group update requests", newChanges.size());
-      updateGroups.forEach(r -> r.addOps(bu));
-
-      logDebug("Adding {} additional ref updates", actualCommands.size());
-      actualCommands.forEach(c -> bu.addRepoOnlyOp(new UpdateOneRefOp(c)));
-
-      logDebug("Executing batch");
-      try {
-        bu.execute();
-      } catch (UpdateException e) {
-        throw INSERT_EXCEPTION.apply(e);
-      }
-      if (magicBranchCmd != null) {
-        magicBranchCmd.setResult(OK);
-      }
-      for (ReplaceRequest replace : replaceByChange.values()) {
-        String rejectMessage = replace.getRejectMessage();
-        if (rejectMessage == null) {
-          if (replace.inputCommand.getResult() == NOT_ATTEMPTED) {
-            // Not necessarily the magic branch, so need to set OK on the original value.
-            replace.inputCommand.setResult(OK);
-          }
-        } else {
-          logDebug("Rejecting due to message from ReplaceOp");
-          reject(replace.inputCommand, rejectMessage);
-        }
-      }
-
-    } catch (ResourceConflictException e) {
-      addMessage(e.getMessage());
-      reject(magicBranchCmd, "conflict");
-    } catch (RestApiException | IOException err) {
-      logError("Can't insert change/patch set for " + project.getName(), err);
-      reject(magicBranchCmd, "internal server error: " + err.getMessage());
-    }
-
-    if (magicBranch != null && magicBranch.submit) {
-      try {
-        submit(newChanges, replaceByChange.values());
-      } catch (ResourceConflictException e) {
-        addMessage(e.getMessage());
-        reject(magicBranchCmd, "conflict");
-      } catch (RestApiException
-          | OrmException
-          | UpdateException
-          | IOException
-          | ConfigInvalidException
-          | PermissionBackendException e) {
-        logError("Error submitting changes to " + project.getName(), e);
-        reject(magicBranchCmd, "error during submit");
-      }
-    }
-  }
-
-  private String buildError(ReceiveError error, List<String> branches) {
-    StringBuilder sb = new StringBuilder();
-    if (branches.size() == 1) {
-      sb.append("Branch ").append(branches.get(0)).append(":\n");
-      sb.append(error.get());
-      return sb.toString();
-    }
-    sb.append("Branches");
-    String delim = " ";
-    for (String branch : branches) {
-      sb.append(delim).append(branch);
-      delim = ", ";
-    }
-    return sb.append(":\n").append(error.get()).toString();
-  }
-
-  private static String displayName(IdentifiedUser user) {
-    String displayName = user.getUserName();
-    if (displayName == null) {
-      displayName = user.getAccount().getPreferredEmail();
-    }
-    return displayName;
-  }
-
-  private void parseCommands(Collection<ReceiveCommand> commands)
-      throws PermissionBackendException, NoSuchProjectException, IOException {
-    List<String> optionList = rp.getPushOptions();
-    if (optionList != null) {
-      for (String option : optionList) {
-        int e = option.indexOf('=');
-        if (e > 0) {
-          pushOptions.put(option.substring(0, e), option.substring(e + 1));
-        } else {
-          pushOptions.put(option, "");
-        }
-      }
-    }
-
-    logDebug("Parsing {} commands", commands.size());
-    for (ReceiveCommand cmd : commands) {
-      if (cmd.getResult() != NOT_ATTEMPTED) {
-        // Already rejected by the core receive process.
-        logDebug("Already processed by core: {} {}", cmd.getResult(), cmd);
-        continue;
-      }
-
-      if (!Repository.isValidRefName(cmd.getRefName()) || cmd.getRefName().contains("//")) {
-        reject(cmd, "not valid ref");
-        continue;
-      }
-
-      if (MagicBranch.isMagicBranch(cmd.getRefName())) {
-        parseMagicBranch(cmd);
-        continue;
-      }
-
-      if (projectControl.getProjectState().isAllUsers()
-          && RefNames.REFS_USERS_SELF.equals(cmd.getRefName())) {
-        String newName = RefNames.refsUsers(user.getAccountId());
-        logDebug("Swapping out command for {} to {}", RefNames.REFS_USERS_SELF, newName);
-        final ReceiveCommand orgCmd = cmd;
-        cmd =
-            new ReceiveCommand(cmd.getOldId(), cmd.getNewId(), newName, cmd.getType()) {
-              @Override
-              public void setResult(Result s, String m) {
-                super.setResult(s, m);
-                orgCmd.setResult(s, m);
-              }
-            };
-      }
-
-      Matcher m = NEW_PATCHSET_PATTERN.matcher(cmd.getRefName());
-      if (m.matches()) {
-        // The referenced change must exist and must still be open.
-        //
-        Change.Id changeId = Change.Id.parse(m.group(1));
-        parseReplaceCommand(cmd, changeId);
-        continue;
-      }
-
-      switch (cmd.getType()) {
-        case CREATE:
-          parseCreate(cmd);
-          break;
-
-        case UPDATE:
-          parseUpdate(cmd);
-          break;
-
-        case DELETE:
-          parseDelete(cmd);
-          break;
-
-        case UPDATE_NONFASTFORWARD:
-          parseRewind(cmd);
-          break;
-
-        default:
-          reject(cmd, "prohibited by Gerrit: unknown command type " + cmd.getType());
-          continue;
-      }
-
-      if (cmd.getResult() != NOT_ATTEMPTED) {
-        continue;
-      }
-
-      if (isConfig(cmd)) {
-        logDebug("Processing {} command", cmd.getRefName());
-        if (!projectControl.isOwner()) {
-          reject(cmd, "not project owner");
-          continue;
-        }
-
-        switch (cmd.getType()) {
-          case CREATE:
-          case UPDATE:
-          case UPDATE_NONFASTFORWARD:
-            try {
-              ProjectConfig cfg = new ProjectConfig(project.getNameKey());
-              cfg.load(rp.getRevWalk(), cmd.getNewId());
-              if (!cfg.getValidationErrors().isEmpty()) {
-                addError("Invalid project configuration:");
-                for (ValidationError err : cfg.getValidationErrors()) {
-                  addError("  " + err.getMessage());
-                }
-                reject(cmd, "invalid project configuration");
-                logError(
-                    "User "
-                        + user.getUserName()
-                        + " tried to push invalid project configuration "
-                        + cmd.getNewId().name()
-                        + " for "
-                        + project.getName());
-                continue;
-              }
-              Project.NameKey newParent = cfg.getProject().getParent(allProjectsName);
-              Project.NameKey oldParent = project.getParent(allProjectsName);
-              if (oldParent == null) {
-                // update of the 'All-Projects' project
-                if (newParent != null) {
-                  reject(cmd, "invalid project configuration: root project cannot have parent");
-                  continue;
-                }
-              } else {
-                if (!oldParent.equals(newParent)) {
-                  try {
-                    permissionBackend.user(user).check(GlobalPermission.ADMINISTRATE_SERVER);
-                  } catch (AuthException e) {
-                    reject(cmd, "invalid project configuration: only Gerrit admin can set parent");
-                    continue;
-                  }
-                }
-
-                if (projectCache.get(newParent) == null) {
-                  reject(cmd, "invalid project configuration: parent does not exist");
-                  continue;
-                }
-              }
-
-              for (Entry<ProjectConfigEntry> e : pluginConfigEntries) {
-                PluginConfig pluginCfg = cfg.getPluginConfig(e.getPluginName());
-                ProjectConfigEntry configEntry = e.getProvider().get();
-                String value = pluginCfg.getString(e.getExportName());
-                String oldValue =
-                    projectControl
-                        .getProjectState()
-                        .getConfig()
-                        .getPluginConfig(e.getPluginName())
-                        .getString(e.getExportName());
-                if (configEntry.getType() == ProjectConfigEntryType.ARRAY) {
-                  oldValue =
-                      Arrays.stream(
-                              projectControl
-                                  .getProjectState()
-                                  .getConfig()
-                                  .getPluginConfig(e.getPluginName())
-                                  .getStringList(e.getExportName()))
-                          .collect(joining("\n"));
-                }
-
-                if ((value == null ? oldValue != null : !value.equals(oldValue))
-                    && !configEntry.isEditable(projectControl.getProjectState())) {
-                  reject(
-                      cmd,
-                      String.format(
-                          "invalid project configuration: Not allowed to set parameter"
-                              + " '%s' of plugin '%s' on project '%s'.",
-                          e.getExportName(), e.getPluginName(), project.getName()));
-                  continue;
-                }
-
-                if (ProjectConfigEntryType.LIST.equals(configEntry.getType())
-                    && value != null
-                    && !configEntry.getPermittedValues().contains(value)) {
-                  reject(
-                      cmd,
-                      String.format(
-                          "invalid project configuration: The value '%s' is "
-                              + "not permitted for parameter '%s' of plugin '%s'.",
-                          value, e.getExportName(), e.getPluginName()));
-                }
-              }
-            } catch (Exception e) {
-              reject(cmd, "invalid project configuration");
-              logError(
-                  "User "
-                      + user.getUserName()
-                      + " tried to push invalid project configuration "
-                      + cmd.getNewId().name()
-                      + " for "
-                      + project.getName(),
-                  e);
-              continue;
-            }
-            break;
-
-          case DELETE:
-            break;
-
-          default:
-            reject(
-                cmd,
-                "prohibited by Gerrit: don't know how to handle config update of type "
-                    + cmd.getType());
-            continue;
-        }
-      }
-    }
-  }
-
-  private void parseCreate(ReceiveCommand cmd)
-      throws PermissionBackendException, NoSuchProjectException, IOException {
-    RevObject obj;
-    try {
-      obj = rp.getRevWalk().parseAny(cmd.getNewId());
-    } catch (IOException err) {
-      logError(
-          "Invalid object " + cmd.getNewId().name() + " for " + cmd.getRefName() + " creation",
-          err);
-      reject(cmd, "invalid object");
-      return;
-    }
-    logDebug("Creating {}", cmd);
-
-    if (isHead(cmd) && !isCommit(cmd)) {
-      return;
-    }
-
-    Branch.NameKey branch = new Branch.NameKey(project.getName(), cmd.getRefName());
-    try {
-      // Must pass explicit user instead of injecting a provider into CreateRefControl, since
-      // Provider<CurrentUser> within ReceiveCommits will always return anonymous.
-      createRefControl.checkCreateRef(Providers.of(user), rp.getRepository(), branch, obj);
-    } catch (AuthException denied) {
-      reject(cmd, "prohibited by Gerrit: " + denied.getMessage());
-      return;
-    }
-
-    if (!validRefOperation(cmd)) {
-      // validRefOperation sets messages, so no need to provide more feedback.
-      return;
-    }
-
-    validateNewCommits(new Branch.NameKey(project.getNameKey(), cmd.getRefName()), cmd);
-    actualCommands.add(cmd);
-  }
-
-  private void parseUpdate(ReceiveCommand cmd) throws PermissionBackendException {
-    logDebug("Updating {}", cmd);
-    boolean ok;
-    try {
-      permissions.ref(cmd.getRefName()).check(RefPermission.UPDATE);
-      ok = true;
-    } catch (AuthException err) {
-      ok = false;
-    }
-    if (ok) {
-      if (isHead(cmd) && !isCommit(cmd)) {
-        return;
-      }
-      if (!validRefOperation(cmd)) {
-        return;
-      }
-      validateNewCommits(new Branch.NameKey(project.getNameKey(), cmd.getRefName()), cmd);
-      actualCommands.add(cmd);
-    } else {
-      if (RefNames.REFS_CONFIG.equals(cmd.getRefName())) {
-        errors.put(ReceiveError.CONFIG_UPDATE, RefNames.REFS_CONFIG);
-      } else {
-        errors.put(ReceiveError.UPDATE, cmd.getRefName());
-      }
-      reject(cmd, "prohibited by Gerrit: ref update access denied");
-    }
-  }
-
-  private boolean isCommit(ReceiveCommand cmd) {
-    RevObject obj;
-    try {
-      obj = rp.getRevWalk().parseAny(cmd.getNewId());
-    } catch (IOException err) {
-      logError("Invalid object " + cmd.getNewId().name() + " for " + cmd.getRefName(), err);
-      reject(cmd, "invalid object");
-      return false;
-    }
-
-    if (obj instanceof RevCommit) {
-      return true;
-    }
-    reject(cmd, "not a commit");
-    return false;
-  }
-
-  private void parseDelete(ReceiveCommand cmd) throws PermissionBackendException {
-    logDebug("Deleting {}", cmd);
-    if (cmd.getRefName().startsWith(REFS_CHANGES)) {
-      errors.put(ReceiveError.DELETE_CHANGES, cmd.getRefName());
-      reject(cmd, "cannot delete changes");
-    } else if (canDelete(cmd)) {
-      if (!validRefOperation(cmd)) {
-        return;
-      }
-      actualCommands.add(cmd);
-    } else if (RefNames.REFS_CONFIG.equals(cmd.getRefName())) {
-      reject(cmd, "cannot delete project configuration");
-    } else {
-      errors.put(ReceiveError.DELETE, cmd.getRefName());
-      reject(cmd, "cannot delete references");
-    }
-  }
-
-  private boolean canDelete(ReceiveCommand cmd) throws PermissionBackendException {
-    try {
-      permissions.ref(cmd.getRefName()).check(RefPermission.DELETE);
-      return true;
-    } catch (AuthException e) {
-      return false;
-    }
-  }
-
-  private void parseRewind(ReceiveCommand cmd) throws PermissionBackendException {
-    RevCommit newObject;
-    try {
-      newObject = rp.getRevWalk().parseCommit(cmd.getNewId());
-    } catch (IncorrectObjectTypeException notCommit) {
-      newObject = null;
-    } catch (IOException err) {
-      logError(
-          "Invalid object " + cmd.getNewId().name() + " for " + cmd.getRefName() + " forced update",
-          err);
-      reject(cmd, "invalid object");
-      return;
-    }
-    logDebug("Rewinding {}", cmd);
-
-    if (newObject != null) {
-      validateNewCommits(new Branch.NameKey(project.getNameKey(), cmd.getRefName()), cmd);
-      if (cmd.getResult() != NOT_ATTEMPTED) {
-        return;
-      }
-    }
-
-    boolean ok;
-    try {
-      permissions.ref(cmd.getRefName()).check(RefPermission.FORCE_UPDATE);
-      ok = true;
-    } catch (AuthException err) {
-      ok = false;
-    }
-    if (ok) {
-      if (!validRefOperation(cmd)) {
-        return;
-      }
-      actualCommands.add(cmd);
-    } else {
-      cmd.setResult(
-          REJECTED_NONFASTFORWARD, " need '" + PermissionRule.FORCE_PUSH + "' privilege.");
-    }
-  }
-
-  static class MagicBranchInput {
-    private static final Splitter COMMAS = Splitter.on(',').omitEmptyStrings();
-
-    final ReceiveCommand cmd;
-    final LabelTypes labelTypes;
-    final NotesMigration notesMigration;
-    private final boolean defaultPublishComments;
-    Branch.NameKey dest;
-    PermissionBackend.ForRef perm;
-    Set<Account.Id> reviewer = Sets.newLinkedHashSet();
-    Set<Account.Id> cc = Sets.newLinkedHashSet();
-    Map<String, Short> labels = new HashMap<>();
-    String message;
-    List<RevCommit> baseCommit;
-    CmdLineParser clp;
-    Set<String> hashtags = new HashSet<>();
-
-    @Option(name = "--base", metaVar = "BASE", usage = "merge base of changes")
-    List<ObjectId> base;
-
-    @Option(name = "--topic", metaVar = "NAME", usage = "attach topic to changes")
-    String topic;
-
-    @Option(
-        name = "--draft",
-        usage =
-            "Will be removed. Before that, this option will be mapped to '--private'"
-                + "for new changes and '--edit' for existing changes")
-    boolean draft;
-
-    boolean publish;
-
-    @Option(name = "--private", usage = "mark new/updated change as private")
-    boolean isPrivate;
-
-    @Option(name = "--remove-private", usage = "remove privacy flag from updated change")
-    boolean removePrivate;
-
-    @Option(
-        name = "--wip",
-        aliases = {"-work-in-progress"},
-        usage = "mark change as work in progress")
-    boolean workInProgress;
-
-    @Option(name = "--ready", usage = "mark change as ready")
-    boolean ready;
-
-    @Option(
-        name = "--edit",
-        aliases = {"-e"},
-        usage = "upload as change edit")
-    boolean edit;
-
-    @Option(name = "--submit", usage = "immediately submit the change")
-    boolean submit;
-
-    @Option(name = "--merged", usage = "create single change for a merged commit")
-    boolean merged;
-
-    @Option(name = "--publish-comments", usage = "publish all draft comments on updated changes")
-    private boolean publishComments;
-
-    @Option(
-        name = "--no-publish-comments",
-        aliases = {"--np"},
-        usage = "do not publish draft comments")
-    private boolean noPublishComments;
-
-    @Option(
-        name = "--notify",
-        usage =
-            "Notify handling that defines to whom email notifications "
-                + "should be sent. Allowed values are NONE, OWNER, "
-                + "OWNER_REVIEWERS, ALL. If not set, the default is ALL.")
-    private NotifyHandling notify;
-
-    @Option(name = "--notify-to", metaVar = "USER", usage = "user that should be notified")
-    List<Account.Id> tos = new ArrayList<>();
-
-    @Option(name = "--notify-cc", metaVar = "USER", usage = "user that should be CC'd")
-    List<Account.Id> ccs = new ArrayList<>();
-
-    @Option(name = "--notify-bcc", metaVar = "USER", usage = "user that should be BCC'd")
-    List<Account.Id> bccs = new ArrayList<>();
-
-    @Option(
-        name = "--reviewer",
-        aliases = {"-r"},
-        metaVar = "EMAIL",
-        usage = "add reviewer to changes")
-    void reviewer(Account.Id id) {
-      reviewer.add(id);
-    }
-
-    @Option(name = "--cc", metaVar = "EMAIL", usage = "notify user by CC")
-    void cc(Account.Id id) {
-      cc.add(id);
-    }
-
-    @Option(
-        name = "--label",
-        aliases = {"-l"},
-        metaVar = "LABEL+VALUE",
-        usage = "label(s) to assign (defaults to +1 if no value provided")
-    void addLabel(String token) throws CmdLineException {
-      LabelVote v = LabelVote.parse(token);
-      try {
-        LabelType.checkName(v.label());
-        ApprovalsUtil.checkLabel(labelTypes, v.label(), v.value());
-      } catch (BadRequestException e) {
-        throw clp.reject(e.getMessage());
-      }
-      labels.put(v.label(), v.value());
-    }
-
-    @Option(
-        name = "--message",
-        aliases = {"-m"},
-        metaVar = "MESSAGE",
-        usage = "Comment message to apply to the review")
-    void addMessage(String token) {
-      // Many characters have special meaning in the context of a git ref.
-      //
-      // Clients can use underscores to represent spaces.
-      message = token.replace("_", " ");
-      try {
-        // Other characters can be represented using percent-encoding.
-        message = URLDecoder.decode(message, UTF_8.name());
-      } catch (IllegalArgumentException e) {
-        // Ignore decoding errors; leave message as percent-encoded.
-      } catch (UnsupportedEncodingException e) {
-        // This shouldn't happen; surely URLDecoder recognizes UTF-8.
-        throw new IllegalStateException(e);
-      }
-    }
-
-    @Option(
-        name = "--hashtag",
-        aliases = {"-t"},
-        metaVar = "HASHTAG",
-        usage = "add hashtag to changes")
-    void addHashtag(String token) throws CmdLineException {
-      if (!notesMigration.readChanges()) {
-        throw clp.reject("cannot add hashtags; noteDb is disabled");
-      }
-      String hashtag = cleanupHashtag(token);
-      if (!hashtag.isEmpty()) {
-        hashtags.add(hashtag);
-      }
-      // TODO(dpursehouse): validate hashtags
-    }
-
-    MagicBranchInput(
-        IdentifiedUser user,
-        ReceiveCommand cmd,
-        LabelTypes labelTypes,
-        NotesMigration notesMigration) {
-      this.cmd = cmd;
-      this.draft = cmd.getRefName().startsWith(MagicBranch.NEW_DRAFT_CHANGE);
-      this.publish = cmd.getRefName().startsWith(MagicBranch.NEW_PUBLISH_CHANGE);
-      this.labelTypes = labelTypes;
-      this.notesMigration = notesMigration;
-      GeneralPreferencesInfo prefs = user.getAccount().getGeneralPreferencesInfo();
-      this.defaultPublishComments =
-          prefs != null
-              ? firstNonNull(
-                  user.getAccount().getGeneralPreferencesInfo().publishCommentsOnPush, false)
-              : false;
-    }
-
-    MailRecipients getMailRecipients() {
-      return new MailRecipients(reviewer, cc);
-    }
-
-    ListMultimap<RecipientType, Account.Id> getAccountsToNotify() {
-      ListMultimap<RecipientType, Account.Id> accountsToNotify =
-          MultimapBuilder.hashKeys().arrayListValues().build();
-      accountsToNotify.putAll(RecipientType.TO, tos);
-      accountsToNotify.putAll(RecipientType.CC, ccs);
-      accountsToNotify.putAll(RecipientType.BCC, bccs);
-      return accountsToNotify;
-    }
-
-    boolean shouldPublishComments() {
-      if (publishComments) {
-        return true;
-      } else if (noPublishComments) {
-        return false;
-      }
-      return defaultPublishComments;
-    }
-
-    String parse(
-        CmdLineParser clp,
-        Repository repo,
-        Set<String> refs,
-        ListMultimap<String, String> pushOptions)
-        throws CmdLineException {
-      String ref = RefNames.fullName(MagicBranch.getDestBranchName(cmd.getRefName()));
-
-      ListMultimap<String, String> options = LinkedListMultimap.create(pushOptions);
-      int optionStart = ref.indexOf('%');
-      if (0 < optionStart) {
-        for (String s : COMMAS.split(ref.substring(optionStart + 1))) {
-          int e = s.indexOf('=');
-          if (0 < e) {
-            options.put(s.substring(0, e), s.substring(e + 1));
-          } else {
-            options.put(s, "");
-          }
-        }
-        ref = ref.substring(0, optionStart);
-      }
-
-      if (!options.isEmpty()) {
-        clp.parseOptionMap(options);
-      }
-
-      // Split the destination branch by branch and topic. The topic
-      // suffix is entirely optional, so it might not even exist.
-      String head = readHEAD(repo);
-      int split = ref.length();
-      for (; ; ) {
-        String name = ref.substring(0, split);
-        if (refs.contains(name) || name.equals(head)) {
-          break;
-        }
-
-        split = name.lastIndexOf('/', split - 1);
-        if (split <= Constants.R_REFS.length()) {
-          return ref;
-        }
-      }
-      if (split < ref.length()) {
-        topic = Strings.emptyToNull(ref.substring(split + 1));
-      }
-      return ref.substring(0, split);
-    }
-
-    NotifyHandling getNotify() {
-      if (notify != null) {
-        return notify;
-      }
-      if (workInProgress) {
-        return NotifyHandling.OWNER;
-      }
-      return NotifyHandling.ALL;
-    }
-
-    NotifyHandling getNotify(ChangeNotes notes) {
-      if (notify != null) {
-        return notify;
-      }
-      if (workInProgress || (!ready && notes.getChange().isWorkInProgress())) {
-        return NotifyHandling.OWNER;
-      }
-      return NotifyHandling.ALL;
-    }
-  }
-
-  /**
-   * Gets an unmodifiable view of the pushOptions.
-   *
-   * <p>The collection is empty if the client does not support push options, or if the client did
-   * not send any options.
-   *
-   * @return an unmodifiable view of pushOptions.
-   */
-  @Nullable
-  ListMultimap<String, String> getPushOptions() {
-    return ImmutableListMultimap.copyOf(pushOptions);
-  }
-
-  private void parseMagicBranch(ReceiveCommand cmd) throws PermissionBackendException {
-    // Permit exactly one new change request per push.
-    if (magicBranch != null) {
-      reject(cmd, "duplicate request");
-      return;
-    }
-
-    logDebug("Found magic branch {}", cmd.getRefName());
-    magicBranch = new MagicBranchInput(user, cmd, labelTypes, notesMigration);
-    magicBranch.reviewer.addAll(extraReviewers.get(ReviewerStateInternal.REVIEWER));
-    magicBranch.cc.addAll(extraReviewers.get(ReviewerStateInternal.CC));
-
-    String ref;
-    CmdLineParser clp = optionParserFactory.create(magicBranch);
-    magicBranch.clp = clp;
-
-    try {
-      ref = magicBranch.parse(clp, repo, rp.getAdvertisedRefs().keySet(), pushOptions);
-    } catch (CmdLineException e) {
-      if (!clp.wasHelpRequestedByOption()) {
-        logDebug("Invalid branch syntax");
-        reject(cmd, e.getMessage());
-        return;
-      }
-      ref = null; // never happen
-    }
-
-    if (magicBranch.topic != null && magicBranch.topic.length() > ChangeUtil.TOPIC_MAX_LENGTH) {
-      reject(
-          cmd, String.format("topic length exceeds the limit (%s)", ChangeUtil.TOPIC_MAX_LENGTH));
-    }
-
-    if (clp.wasHelpRequestedByOption()) {
-      StringWriter w = new StringWriter();
-      w.write("\nHelp for refs/for/branch:\n\n");
-      clp.printUsage(w, null);
-      addMessage(w.toString());
-      reject(cmd, "see help");
-      return;
-    }
-    if (projectControl.getProjectState().isAllUsers() && RefNames.REFS_USERS_SELF.equals(ref)) {
-      logDebug("Handling {}", RefNames.REFS_USERS_SELF);
-      ref = RefNames.refsUsers(user.getAccountId());
-    }
-    if (!rp.getAdvertisedRefs().containsKey(ref)
-        && !ref.equals(readHEAD(repo))
-        && !ref.equals(RefNames.REFS_CONFIG)) {
-      logDebug("Ref {} not found", ref);
-      if (ref.startsWith(Constants.R_HEADS)) {
-        String n = ref.substring(Constants.R_HEADS.length());
-        reject(cmd, "branch " + n + " not found");
-      } else {
-        reject(cmd, ref + " not found");
-      }
-      return;
-    }
-
-    magicBranch.dest = new Branch.NameKey(project.getNameKey(), ref);
-    magicBranch.perm = permissions.ref(ref);
-    if (!projectControl.getProject().getState().permitsWrite()) {
-      reject(cmd, "project state does not permit write");
-      return;
-    }
-
-    try {
-      magicBranch.perm.check(RefPermission.CREATE_CHANGE);
-    } catch (AuthException denied) {
-      errors.put(ReceiveError.CODE_REVIEW, ref);
-      reject(cmd, denied.getMessage());
-      return;
-    }
-
-    // TODO(davido): Remove legacy support for drafts magic branch option
-    // after repo-tool supports private and work-in-progress changes.
-    if (magicBranch.draft && !receiveConfig.allowDrafts) {
-      errors.put(ReceiveError.CODE_REVIEW, ref);
-      reject(cmd, "draft workflow is disabled");
-      return;
-    }
-
-    if (magicBranch.isPrivate && magicBranch.removePrivate) {
-      reject(cmd, "the options 'private' and 'remove-private' are mutually exclusive");
-      return;
-    }
-
-    boolean privateByDefault = projectCache.get(project.getNameKey()).isPrivateByDefault();
-    setChangeAsPrivate =
-        magicBranch.draft
-            || magicBranch.isPrivate
-            || (privateByDefault && !magicBranch.removePrivate);
-
-    if (receiveConfig.disablePrivateChanges && setChangeAsPrivate) {
-      reject(cmd, "private changes are disabled");
-      return;
-    }
-
-    if (magicBranch.workInProgress && magicBranch.ready) {
-      reject(cmd, "the options 'wip' and 'ready' are mutually exclusive");
-      return;
-    }
-    if (magicBranch.publishComments && magicBranch.noPublishComments) {
-      reject(
-          cmd, "the options 'publish-comments' and 'no-publish-comments' are mutually exclusive");
-      return;
-    }
-
-    if (magicBranch.submit) {
-      try {
-        permissions.ref(ref).check(RefPermission.UPDATE_BY_SUBMIT);
-      } catch (AuthException e) {
-        reject(cmd, e.getMessage());
-        return;
-      }
-    }
-
-    RevWalk walk = rp.getRevWalk();
-    RevCommit tip;
-    try {
-      tip = walk.parseCommit(magicBranch.cmd.getNewId());
-      logDebug("Tip of push: {}", tip.name());
-    } catch (IOException ex) {
-      magicBranch.cmd.setResult(REJECTED_MISSING_OBJECT);
-      logError("Invalid pack upload; one or more objects weren't sent", ex);
-      return;
-    }
-
-    String destBranch = magicBranch.dest.get();
-    try {
-      if (magicBranch.merged) {
-        if (magicBranch.base != null) {
-          reject(cmd, "cannot use merged with base");
-          return;
-        }
-        RevCommit branchTip = readBranchTip(cmd, magicBranch.dest);
-        if (branchTip == null) {
-          return; // readBranchTip already rejected cmd.
-        }
-        if (!walk.isMergedInto(tip, branchTip)) {
-          reject(cmd, "not merged into branch");
-          return;
-        }
-      }
-
-      // If tip is a merge commit, or the root commit or
-      // if %base or %merged was specified, ignore newChangeForAllNotInTarget.
-      if (tip.getParentCount() > 1
-          || magicBranch.base != null
-          || magicBranch.merged
-          || tip.getParentCount() == 0) {
-        logDebug("Forcing newChangeForAllNotInTarget = false");
-        newChangeForAllNotInTarget = false;
-      }
-
-      if (magicBranch.base != null) {
-        logDebug("Handling %base: {}", magicBranch.base);
-        magicBranch.baseCommit = Lists.newArrayListWithCapacity(magicBranch.base.size());
-        for (ObjectId id : magicBranch.base) {
-          try {
-            magicBranch.baseCommit.add(walk.parseCommit(id));
-          } catch (IncorrectObjectTypeException notCommit) {
-            reject(cmd, "base must be a commit");
-            return;
-          } catch (MissingObjectException e) {
-            reject(cmd, "base not found");
-            return;
-          } catch (IOException e) {
-            logWarn(String.format("Project %s cannot read %s", project.getName(), id.name()), e);
-            reject(cmd, "internal server error");
-            return;
-          }
-        }
-      } else if (newChangeForAllNotInTarget) {
-        RevCommit branchTip = readBranchTip(cmd, magicBranch.dest);
-        if (branchTip == null) {
-          return; // readBranchTip already rejected cmd.
-        }
-        magicBranch.baseCommit = Collections.singletonList(branchTip);
-        logDebug("Set baseCommit = {}", magicBranch.baseCommit.get(0).name());
-      }
-    } catch (IOException ex) {
-      logWarn(
-          String.format("Error walking to %s in project %s", destBranch, project.getName()), ex);
-      reject(cmd, "internal server error");
-      return;
-    }
-
-    // Validate that the new commits are connected with the target
-    // branch.  If they aren't, we want to abort. We do this check by
-    // looking to see if we can compute a merge base between the new
-    // commits and the target branch head.
-    //
-    try {
-      Ref targetRef = rp.getAdvertisedRefs().get(magicBranch.dest.get());
-      if (targetRef == null || targetRef.getObjectId() == null) {
-        // The destination branch does not yet exist. Assume the
-        // history being sent for review will start it and thus
-        // is "connected" to the branch.
-        logDebug("Branch is unborn");
-        return;
-      }
-      RevCommit h = walk.parseCommit(targetRef.getObjectId());
-      logDebug("Current branch tip: {}", h.name());
-      RevFilter oldRevFilter = walk.getRevFilter();
-      try {
-        walk.reset();
-        walk.setRevFilter(RevFilter.MERGE_BASE);
-        walk.markStart(tip);
-        walk.markStart(h);
-        if (walk.next() == null) {
-          reject(magicBranch.cmd, "no common ancestry");
-        }
-      } finally {
-        walk.reset();
-        walk.setRevFilter(oldRevFilter);
-      }
-    } catch (IOException e) {
-      magicBranch.cmd.setResult(REJECTED_MISSING_OBJECT);
-      logError("Invalid pack upload; one or more objects weren't sent", e);
-    }
-  }
-
-  private static String readHEAD(Repository repo) {
-    try {
-      return repo.getFullBranch();
-    } catch (IOException e) {
-      log.error("Cannot read HEAD symref", e);
-      return null;
-    }
-  }
-
-  private RevCommit readBranchTip(ReceiveCommand cmd, Branch.NameKey branch) throws IOException {
-    Ref r = allRefs().get(branch.get());
-    if (r == null) {
-      reject(cmd, branch.get() + " not found");
-      return null;
-    }
-    return rp.getRevWalk().parseCommit(r.getObjectId());
-  }
-
-  private void parseReplaceCommand(ReceiveCommand cmd, Change.Id changeId) {
-    logDebug("Parsing replace command");
-    if (cmd.getType() != ReceiveCommand.Type.CREATE) {
-      reject(cmd, "invalid usage");
-      return;
-    }
-
-    RevCommit newCommit;
-    try {
-      newCommit = rp.getRevWalk().parseCommit(cmd.getNewId());
-      logDebug("Replacing with {}", newCommit);
-    } catch (IOException e) {
-      logError("Cannot parse " + cmd.getNewId().name() + " as commit", e);
-      reject(cmd, "invalid commit");
-      return;
-    }
-
-    Change changeEnt;
-    try {
-      changeEnt = notesFactory.createChecked(db, project.getNameKey(), changeId).getChange();
-    } catch (NoSuchChangeException e) {
-      logError("Change not found " + changeId, e);
-      reject(cmd, "change " + changeId + " not found");
-      return;
-    } catch (OrmException e) {
-      logError("Cannot lookup existing change " + changeId, e);
-      reject(cmd, "database error");
-      return;
-    }
-    if (!project.getNameKey().equals(changeEnt.getProject())) {
-      reject(cmd, "change " + changeId + " does not belong to project " + project.getName());
-      return;
-    }
-
-    logDebug("Replacing change {}", changeEnt.getId());
-    requestReplace(cmd, true, changeEnt, newCommit);
-  }
-
-  private boolean requestReplace(
-      ReceiveCommand cmd, boolean checkMergedInto, Change change, RevCommit newCommit) {
-    if (change.getStatus().isClosed()) {
-      reject(
-          cmd,
-          changeFormatter.changeClosed(
-              ChangeReportFormatter.Input.builder().setChange(change).build()));
-      return false;
-    }
-
-    ReplaceRequest req = new ReplaceRequest(change.getId(), newCommit, cmd, checkMergedInto);
-    if (replaceByChange.containsKey(req.ontoChange)) {
-      reject(cmd, "duplicate request");
-      return false;
-    }
-    replaceByChange.put(req.ontoChange, req);
-    return true;
-  }
-
-  private void selectNewAndReplacedChangesFromMagicBranch() {
-    logDebug("Finding new and replaced changes");
-    newChanges = new ArrayList<>();
-
-    ListMultimap<ObjectId, Ref> existing = changeRefsById();
-    GroupCollector groupCollector =
-        GroupCollector.create(changeRefsById(), db, psUtil, notesFactory, project.getNameKey());
-
-    try {
-      RevCommit start = setUpWalkForSelectingChanges();
-      if (start == null) {
-        return;
-      }
-
-      LinkedHashMap<RevCommit, ChangeLookup> pending = new LinkedHashMap<>();
-      Set<Change.Key> newChangeIds = new HashSet<>();
-      int maxBatchChanges = receiveConfig.getEffectiveMaxBatchChangesLimit(user);
-      int total = 0;
-      int alreadyTracked = 0;
-      boolean rejectImplicitMerges =
-          start.getParentCount() == 1
-              && projectCache.get(project.getNameKey()).isRejectImplicitMerges()
-              // Don't worry about implicit merges when creating changes for
-              // already-merged commits; they're already in history, so it's too
-              // late.
-              && !magicBranch.merged;
-      Set<RevCommit> mergedParents;
-      if (rejectImplicitMerges) {
-        mergedParents = new HashSet<>();
-      } else {
-        mergedParents = null;
-      }
-
-      for (; ; ) {
-        RevCommit c = rp.getRevWalk().next();
-        if (c == null) {
-          break;
-        }
-        total++;
-        rp.getRevWalk().parseBody(c);
-        String name = c.name();
-        groupCollector.visit(c);
-        Collection<Ref> existingRefs = existing.get(c);
-
-        if (rejectImplicitMerges) {
-          Collections.addAll(mergedParents, c.getParents());
-          mergedParents.remove(c);
-        }
-
-        boolean commitAlreadyTracked = !existingRefs.isEmpty();
-        if (commitAlreadyTracked) {
-          alreadyTracked++;
-          // Corner cases where an existing commit might need a new group:
-          // A) Existing commit has a null group; wasn't assigned during schema
-          //    upgrade, or schema upgrade is performed on a running server.
-          // B) Let A<-B<-C, then:
-          //      1. Push A to refs/heads/master
-          //      2. Push B to refs/for/master
-          //      3. Force push A~ to refs/heads/master
-          //      4. Push C to refs/for/master.
-          //      B will be in existing so we aren't replacing the patch set. It
-          //      used to have its own group, but now needs to to be changed to
-          //      A's group.
-          // C) Commit is a PatchSet of a pre-existing change uploaded with a
-          //    different target branch.
-          for (Ref ref : existingRefs) {
-            updateGroups.add(new UpdateGroupsRequest(ref, c));
-          }
-          if (!(newChangeForAllNotInTarget || magicBranch.base != null)) {
-            continue;
-          }
-        }
-
-        List<String> idList = c.getFooterLines(CHANGE_ID);
-
-        String idStr = !idList.isEmpty() ? idList.get(idList.size() - 1).trim() : null;
-
-        if (idStr != null) {
-          pending.put(c, new ChangeLookup(c, new Change.Key(idStr)));
-        } else {
-          pending.put(c, new ChangeLookup(c));
-        }
-        int n = pending.size() + newChanges.size();
-        if (maxBatchChanges != 0 && n > maxBatchChanges) {
-          logDebug("{} changes exceeds limit of {}", n, maxBatchChanges);
-          reject(
-              magicBranch.cmd,
-              "the number of pushed changes in a batch exceeds the max limit " + maxBatchChanges);
-          newChanges = Collections.emptyList();
-          return;
-        }
-
-        if (commitAlreadyTracked) {
-          boolean changeExistsOnDestBranch = false;
-          for (ChangeData cd : pending.get(c).destChanges) {
-            if (cd.change().getDest().equals(magicBranch.dest)) {
-              changeExistsOnDestBranch = true;
-              break;
-            }
-          }
-          if (changeExistsOnDestBranch) {
-            continue;
-          }
-
-          logDebug("Creating new change for {} even though it is already tracked", name);
-        }
-
-        if (!validCommit(rp.getRevWalk(), magicBranch.perm, magicBranch.dest, magicBranch.cmd, c)) {
-          // Not a change the user can propose? Abort as early as possible.
-          newChanges = Collections.emptyList();
-          logDebug("Aborting early due to invalid commit");
-          return;
-        }
-
-        // Don't allow merges to be uploaded in commit chain via all-not-in-target
-        if (newChangeForAllNotInTarget && c.getParentCount() > 1) {
-          reject(
-              magicBranch.cmd,
-              "Pushing merges in commit chains with 'all not in target' is not allowed,\n"
-                  + "to override please set the base manually");
-          logDebug("Rejecting merge commit {} with newChangeForAllNotInTarget", name);
-          // TODO(dborowitz): Should we early return here?
-        }
-
-        if (idList.isEmpty()) {
-          newChanges.add(new CreateRequest(c, magicBranch.dest.get()));
-          continue;
-        }
-      }
-      logDebug(
-          "Finished initial RevWalk with {} commits total: {} already"
-              + " tracked, {} new changes with no Change-Id, and {} deferred"
-              + " lookups",
-          total,
-          alreadyTracked,
-          newChanges.size(),
-          pending.size());
-
-      if (rejectImplicitMerges) {
-        rejectImplicitMerges(mergedParents);
-      }
-
-      for (Iterator<ChangeLookup> itr = pending.values().iterator(); itr.hasNext(); ) {
-        ChangeLookup p = itr.next();
-        if (p.changeKey == null) {
-          continue;
-        }
-
-        if (newChangeIds.contains(p.changeKey)) {
-          logDebug("Multiple commits with Change-Id {}", p.changeKey);
-          reject(magicBranch.cmd, SAME_CHANGE_ID_IN_MULTIPLE_CHANGES);
-          newChanges = Collections.emptyList();
-          return;
-        }
-
-        List<ChangeData> changes = p.destChanges;
-        if (changes.size() > 1) {
-          logDebug(
-              "Multiple changes in branch {} with Change-Id {}: {}",
-              magicBranch.dest,
-              p.changeKey,
-              changes.stream().map(cd -> cd.getId().toString()).collect(joining()));
-          // WTF, multiple changes in this branch have the same key?
-          // Since the commit is new, the user should recreate it with
-          // a different Change-Id. In practice, we should never see
-          // this error message as Change-Id should be unique per branch.
-          //
-          reject(magicBranch.cmd, p.changeKey.get() + " has duplicates");
-          newChanges = Collections.emptyList();
-          return;
-        }
-
-        if (changes.size() == 1) {
-          // Schedule as a replacement to this one matching change.
-          //
-
-          RevId currentPs = changes.get(0).currentPatchSet().getRevision();
-          // If Commit is already current PatchSet of target Change.
-          if (p.commit.name().equals(currentPs.get())) {
-            if (pending.size() == 1) {
-              // There are no commits left to check, all commits in pending were already
-              // current PatchSet of the corresponding target changes.
-              reject(magicBranch.cmd, "commit(s) already exists (as current patchset)");
-            } else {
-              // Commit is already current PatchSet.
-              // Remove from pending and try next commit.
-              itr.remove();
-              continue;
-            }
-          }
-          if (requestReplace(magicBranch.cmd, false, changes.get(0).change(), p.commit)) {
-            continue;
-          }
-          newChanges = Collections.emptyList();
-          return;
-        }
-
-        if (changes.size() == 0) {
-          if (!isValidChangeId(p.changeKey.get())) {
-            reject(magicBranch.cmd, "invalid Change-Id");
-            newChanges = Collections.emptyList();
-            return;
-          }
-
-          // In case the change look up from the index failed,
-          // double check against the existing refs
-          if (foundInExistingRef(existing.get(p.commit))) {
-            if (pending.size() == 1) {
-              reject(magicBranch.cmd, "commit(s) already exists (as current patchset)");
-              newChanges = Collections.emptyList();
-              return;
-            }
-            itr.remove();
-            continue;
-          }
-          newChangeIds.add(p.changeKey);
-        }
-        newChanges.add(new CreateRequest(p.commit, magicBranch.dest.get()));
-      }
-      logDebug(
-          "Finished deferred lookups with {} updates and {} new changes",
-          replaceByChange.size(),
-          newChanges.size());
-    } catch (IOException e) {
-      // Should never happen, the core receive process would have
-      // identified the missing object earlier before we got control.
-      //
-      magicBranch.cmd.setResult(REJECTED_MISSING_OBJECT);
-      logError("Invalid pack upload; one or more objects weren't sent", e);
-      newChanges = Collections.emptyList();
-      return;
-    } catch (OrmException e) {
-      logError("Cannot query database to locate prior changes", e);
-      reject(magicBranch.cmd, "database error");
-      newChanges = Collections.emptyList();
-      return;
-    }
-
-    if (newChanges.isEmpty() && replaceByChange.isEmpty()) {
-      reject(magicBranch.cmd, "no new changes");
-      return;
-    }
-    if (!newChanges.isEmpty() && magicBranch.edit) {
-      reject(magicBranch.cmd, "edit is not supported for new changes");
-      return;
-    }
-
-    try {
-      SortedSetMultimap<ObjectId, String> groups = groupCollector.getGroups();
-      List<Integer> newIds = seq.nextChangeIds(newChanges.size());
-      for (int i = 0; i < newChanges.size(); i++) {
-        CreateRequest create = newChanges.get(i);
-        create.setChangeId(newIds.get(i));
-        create.groups = ImmutableList.copyOf(groups.get(create.commit));
-      }
-      for (ReplaceRequest replace : replaceByChange.values()) {
-        replace.groups = ImmutableList.copyOf(groups.get(replace.newCommitId));
-      }
-      for (UpdateGroupsRequest update : updateGroups) {
-        update.groups = ImmutableList.copyOf((groups.get(update.commit)));
-      }
-      logDebug("Finished updating groups from GroupCollector");
-    } catch (OrmException e) {
-      logError("Error collecting groups for changes", e);
-      reject(magicBranch.cmd, "internal server error");
-      return;
-    }
-  }
-
-  private boolean foundInExistingRef(Collection<Ref> existingRefs) throws OrmException {
-    for (Ref ref : existingRefs) {
-      ChangeNotes notes =
-          notesFactory.create(db, project.getNameKey(), Change.Id.fromRef(ref.getName()));
-      Change change = notes.getChange();
-      if (change.getDest().equals(magicBranch.dest)) {
-        logDebug("Found change {} from existing refs.", change.getKey());
-        // Reindex the change asynchronously, ignoring errors.
-        @SuppressWarnings("unused")
-        Future<?> possiblyIgnoredError = indexer.indexAsync(project.getNameKey(), change.getId());
-        return true;
-      }
-    }
-    return false;
-  }
-
-  private RevCommit setUpWalkForSelectingChanges() throws IOException {
-    RevWalk rw = rp.getRevWalk();
-    RevCommit start = rw.parseCommit(magicBranch.cmd.getNewId());
-
-    rw.reset();
-    rw.sort(RevSort.TOPO);
-    rw.sort(RevSort.REVERSE, true);
-    rp.getRevWalk().markStart(start);
-    if (magicBranch.baseCommit != null) {
-      markExplicitBasesUninteresting();
-    } else if (magicBranch.merged) {
-      logDebug("Marking parents of merged commit {} uninteresting", start.name());
-      for (RevCommit c : start.getParents()) {
-        rw.markUninteresting(c);
-      }
-    } else {
-      markHeadsAsUninteresting(rw, magicBranch.dest != null ? magicBranch.dest.get() : null);
-    }
-    return start;
-  }
-
-  private void markExplicitBasesUninteresting() throws IOException {
-    logDebug("Marking {} base commits uninteresting", magicBranch.baseCommit.size());
-    for (RevCommit c : magicBranch.baseCommit) {
-      rp.getRevWalk().markUninteresting(c);
-    }
-    Ref targetRef = allRefs().get(magicBranch.dest.get());
-    if (targetRef != null) {
-      logDebug(
-          "Marking target ref {} ({}) uninteresting",
-          magicBranch.dest.get(),
-          targetRef.getObjectId().name());
-      rp.getRevWalk().markUninteresting(rp.getRevWalk().parseCommit(targetRef.getObjectId()));
-    }
-  }
-
-  private void rejectImplicitMerges(Set<RevCommit> mergedParents) throws IOException {
-    if (!mergedParents.isEmpty()) {
-      Ref targetRef = allRefs().get(magicBranch.dest.get());
-      if (targetRef != null) {
-        RevWalk rw = rp.getRevWalk();
-        RevCommit tip = rw.parseCommit(targetRef.getObjectId());
-        boolean containsImplicitMerges = true;
-        for (RevCommit p : mergedParents) {
-          containsImplicitMerges &= !rw.isMergedInto(p, tip);
-        }
-
-        if (containsImplicitMerges) {
-          rw.reset();
-          for (RevCommit p : mergedParents) {
-            rw.markStart(p);
-          }
-          rw.markUninteresting(tip);
-          RevCommit c;
-          while ((c = rw.next()) != null) {
-            rw.parseBody(c);
-            messages.add(
-                new CommitValidationMessage(
-                    "ERROR: Implicit Merge of "
-                        + c.abbreviate(7).name()
-                        + " "
-                        + c.getShortMessage(),
-                    false));
-          }
-          reject(magicBranch.cmd, "implicit merges detected");
-        }
-      }
-    }
-  }
-
-  private void markHeadsAsUninteresting(RevWalk rw, @Nullable String forRef) {
-    int i = 0;
-    for (Ref ref : allRefs().values()) {
-      if ((ref.getName().startsWith(R_HEADS) || ref.getName().equals(forRef))
-          && ref.getObjectId() != null) {
-        try {
-          rw.markUninteresting(rw.parseCommit(ref.getObjectId()));
-          i++;
-        } catch (IOException e) {
-          logWarn(String.format("Invalid ref %s in %s", ref.getName(), project.getName()), e);
-        }
-      }
-    }
-    logDebug("Marked {} heads as uninteresting", i);
-  }
-
-  private static boolean isValidChangeId(String idStr) {
-    return idStr.matches("^I[0-9a-fA-F]{40}$") && !idStr.matches("^I00*$");
-  }
-
-  private class ChangeLookup {
-    final RevCommit commit;
-    final Change.Key changeKey;
-    final List<ChangeData> destChanges;
-
-    ChangeLookup(RevCommit c, Change.Key key) throws OrmException {
-      commit = c;
-      changeKey = key;
-      destChanges = queryProvider.get().byBranchKey(magicBranch.dest, key);
-    }
-
-    ChangeLookup(RevCommit c) throws OrmException {
-      commit = c;
-      destChanges = queryProvider.get().byBranchCommit(magicBranch.dest, c.getName());
-      changeKey = null;
-    }
-  }
-
-  private class CreateRequest {
-    final RevCommit commit;
-    private final String refName;
-
-    Change.Id changeId;
-    ReceiveCommand cmd;
-    ChangeInserter ins;
-    List<String> groups = ImmutableList.of();
-
-    Change change;
-
-    CreateRequest(RevCommit commit, String refName) {
-      this.commit = commit;
-      this.refName = refName;
-    }
-
-    private void setChangeId(int id) {
-      possiblyOverrideWorkInProgress();
-
-      changeId = new Change.Id(id);
-      ins =
-          changeInserterFactory
-              .create(changeId, commit, refName)
-              .setTopic(magicBranch.topic)
-              .setPrivate(setChangeAsPrivate)
-              .setWorkInProgress(magicBranch.workInProgress)
-              // Changes already validated in validateNewCommits.
-              .setValidate(false);
-
-      if (magicBranch.merged) {
-        ins.setStatus(Change.Status.MERGED);
-      }
-      cmd = new ReceiveCommand(ObjectId.zeroId(), commit, ins.getPatchSetId().toRefName());
-      if (rp.getPushCertificate() != null) {
-        ins.setPushCertificate(rp.getPushCertificate().toTextWithSignature());
-      }
-    }
-
-    private void possiblyOverrideWorkInProgress() {
-      // When wip or ready explicitly provided, leave it as is.
-      if (magicBranch.workInProgress || magicBranch.ready) {
-        return;
-      }
-      magicBranch.workInProgress =
-          projectCache.get(project.getNameKey()).isWorkInProgressByDefault()
-              || firstNonNull(
-                  user.getAccount().getGeneralPreferencesInfo().workInProgressByDefault, false);
-    }
-
-    private void addOps(BatchUpdate bu) throws RestApiException {
-      checkState(changeId != null, "must call setChangeId before addOps");
-      try {
-        RevWalk rw = rp.getRevWalk();
-        rw.parseBody(commit);
-        final PatchSet.Id psId = ins.setGroups(groups).getPatchSetId();
-        Account.Id me = user.getAccountId();
-        List<FooterLine> footerLines = commit.getFooterLines();
-        MailRecipients recipients = new MailRecipients();
-        Map<String, Short> approvals = new HashMap<>();
-        checkNotNull(magicBranch);
-        recipients.add(magicBranch.getMailRecipients());
-        approvals = magicBranch.labels;
-        recipients.add(getRecipientsFromFooters(accountResolver, footerLines));
-        recipients.remove(me);
-        StringBuilder msg =
-            new StringBuilder(
-                ApprovalsUtil.renderMessageWithApprovals(
-                    psId.get(), approvals, Collections.<String, PatchSetApproval>emptyMap()));
-        msg.append('.');
-        if (!Strings.isNullOrEmpty(magicBranch.message)) {
-          msg.append("\n").append(magicBranch.message);
-        }
-
-        bu.insertChange(
-            ins.setReviewers(recipients.getReviewers())
-                .setExtraCC(recipients.getCcOnly())
-                .setApprovals(approvals)
-                .setMessage(msg.toString())
-                .setNotify(magicBranch.getNotify())
-                .setAccountsToNotify(magicBranch.getAccountsToNotify())
-                .setRequestScopePropagator(requestScopePropagator)
-                .setSendMail(true)
-                .setPatchSetDescription(magicBranch.message));
-        if (!magicBranch.hashtags.isEmpty()) {
-          // Any change owner is allowed to add hashtags when creating a change.
-          bu.addOp(
-              changeId,
-              hashtagsFactory.create(new HashtagsInput(magicBranch.hashtags)).setFireEvent(false));
-        }
-        if (!Strings.isNullOrEmpty(magicBranch.topic)) {
-          bu.addOp(
-              changeId,
-              new BatchUpdateOp() {
-                @Override
-                public boolean updateChange(ChangeContext ctx) {
-                  ctx.getUpdate(psId).setTopic(magicBranch.topic);
-                  return true;
-                }
-              });
-        }
-        bu.addOp(
-            changeId,
-            new BatchUpdateOp() {
-              @Override
-              public boolean updateChange(ChangeContext ctx) {
-                change = ctx.getChange();
-                return false;
-              }
-            });
-        bu.addOp(changeId, new ChangeProgressOp(newProgress));
-      } catch (Exception e) {
-        throw INSERT_EXCEPTION.apply(e);
-      }
-    }
-  }
-
-  private void submit(Collection<CreateRequest> create, Collection<ReplaceRequest> replace)
-      throws OrmException, RestApiException, UpdateException, IOException, ConfigInvalidException,
-          PermissionBackendException {
-    Map<ObjectId, Change> bySha = Maps.newHashMapWithExpectedSize(create.size() + replace.size());
-    for (CreateRequest r : create) {
-      checkNotNull(r.change, "cannot submit new change %s; op may not have run", r.changeId);
-      bySha.put(r.commit, r.change);
-    }
-    for (ReplaceRequest r : replace) {
-      bySha.put(r.newCommitId, r.notes.getChange());
-    }
-    Change tipChange = bySha.get(magicBranch.cmd.getNewId());
-    checkNotNull(
-        tipChange, "tip of push does not correspond to a change; found these changes: %s", bySha);
-    logDebug(
-        "Processing submit with tip change {} ({})", tipChange.getId(), magicBranch.cmd.getNewId());
-    try (MergeOp op = mergeOpProvider.get()) {
-      op.merge(db, tipChange, user, false, new SubmitInput(), false);
-    }
-  }
-
-  private void preparePatchSetsForReplace() {
-    try {
-      readChangesForReplace();
-      for (Iterator<ReplaceRequest> itr = replaceByChange.values().iterator(); itr.hasNext(); ) {
-        ReplaceRequest req = itr.next();
-        if (req.inputCommand.getResult() == NOT_ATTEMPTED) {
-          req.validate(false);
-          if (req.skip && req.cmd == null) {
-            itr.remove();
-          }
-        }
-      }
-    } catch (OrmException err) {
-      logError(
-          String.format(
-              "Cannot read database before replacement for project %s", project.getName()),
-          err);
-      for (ReplaceRequest req : replaceByChange.values()) {
-        if (req.inputCommand.getResult() == NOT_ATTEMPTED) {
-          req.inputCommand.setResult(REJECTED_OTHER_REASON, "internal server error");
-        }
-      }
-    } catch (IOException | PermissionBackendException err) {
-      logError(
-          String.format(
-              "Cannot read repository before replacement for project %s", project.getName()),
-          err);
-      for (ReplaceRequest req : replaceByChange.values()) {
-        if (req.inputCommand.getResult() == NOT_ATTEMPTED) {
-          req.inputCommand.setResult(REJECTED_OTHER_REASON, "internal server error");
-        }
-      }
-    }
-    logDebug("Read {} changes to replace", replaceByChange.size());
-
-    if (magicBranch != null && magicBranch.cmd.getResult() != NOT_ATTEMPTED) {
-      // Cancel creations tied to refs/for/ or refs/drafts/ command.
-      for (ReplaceRequest req : replaceByChange.values()) {
-        if (req.inputCommand == magicBranch.cmd && req.cmd != null) {
-          req.cmd.setResult(Result.REJECTED_OTHER_REASON, "aborted");
-        }
-      }
-      for (CreateRequest req : newChanges) {
-        req.cmd.setResult(Result.REJECTED_OTHER_REASON, "aborted");
-      }
-    }
-  }
-
-  private void readChangesForReplace() throws OrmException {
-    Collection<ChangeNotes> allNotes =
-        notesFactory.create(
-            db, replaceByChange.values().stream().map(r -> r.ontoChange).collect(toList()));
-    for (ChangeNotes notes : allNotes) {
-      replaceByChange.get(notes.getChangeId()).notes = notes;
-    }
-  }
-
-  private class ReplaceRequest {
-    final Change.Id ontoChange;
-    final ObjectId newCommitId;
-    final ReceiveCommand inputCommand;
-    final boolean checkMergedInto;
-    ChangeNotes notes;
-    BiMap<RevCommit, PatchSet.Id> revisions;
-    PatchSet.Id psId;
-    ReceiveCommand prev;
-    ReceiveCommand cmd;
-    PatchSetInfo info;
-    boolean skip;
-    private PatchSet.Id priorPatchSet;
-    List<String> groups = ImmutableList.of();
-    private ReplaceOp replaceOp;
-
-    ReplaceRequest(
-        Change.Id toChange, RevCommit newCommit, ReceiveCommand cmd, boolean checkMergedInto) {
-      this.ontoChange = toChange;
-      this.newCommitId = newCommit.copy();
-      this.inputCommand = checkNotNull(cmd);
-      this.checkMergedInto = checkMergedInto;
-
-      revisions = HashBiMap.create();
-      for (Ref ref : refs(toChange)) {
-        try {
-          revisions.forcePut(
-              rp.getRevWalk().parseCommit(ref.getObjectId()), PatchSet.Id.fromRef(ref.getName()));
-        } catch (IOException err) {
-          logWarn(
-              String.format(
-                  "Project %s contains invalid change ref %s", project.getName(), ref.getName()),
-              err);
-        }
-      }
-    }
-
-    /**
-     * Validate the new patch set commit for this change.
-     *
-     * <p><strong>Side effects:</strong>
-     *
-     * <ul>
-     *   <li>May add error or warning messages to the progress monitor
-     *   <li>Will reject {@code cmd} prior to returning false
-     *   <li>May reset {@code rp.getRevWalk()}; do not call in the middle of a walk.
-     * </ul>
-     *
-     * @param autoClose whether the caller intends to auto-close the change after adding a new patch
-     *     set.
-     * @return whether the new commit is valid
-     * @throws IOException
-     * @throws OrmException
-     * @throws PermissionBackendException
-     */
-    boolean validate(boolean autoClose)
-        throws IOException, OrmException, PermissionBackendException {
-      if (!autoClose && inputCommand.getResult() != NOT_ATTEMPTED) {
-        return false;
-      } else if (notes == null) {
-        reject(inputCommand, "change " + ontoChange + " not found");
-        return false;
-      }
-
-      Change change = notes.getChange();
-      priorPatchSet = change.currentPatchSetId();
-      if (!revisions.containsValue(priorPatchSet)) {
-        reject(inputCommand, "change " + ontoChange + " missing revisions");
-        return false;
-      }
-
-      RevCommit newCommit = rp.getRevWalk().parseCommit(newCommitId);
-      RevCommit priorCommit = revisions.inverse().get(priorPatchSet);
-      try {
-        permissions.change(notes).database(db).check(ChangePermission.ADD_PATCH_SET);
-      } catch (AuthException no) {
-        reject(inputCommand, "cannot add patch set to " + ontoChange + ".");
-        return false;
-      }
-
-      if (change.getStatus().isClosed()) {
-        reject(inputCommand, "change " + ontoChange + " closed");
-        return false;
-      } else if (revisions.containsKey(newCommit)) {
-        reject(inputCommand, "commit already exists (in the change)");
-        return false;
-      }
-
-      for (Ref r : rp.getRepository().getRefDatabase().getRefs("refs/changes").values()) {
-        if (r.getObjectId().equals(newCommit)) {
-          reject(inputCommand, "commit already exists (in the project)");
-          return false;
-        }
-      }
-
-      for (RevCommit prior : revisions.keySet()) {
-        // Don't allow a change to directly depend upon itself. This is a
-        // very common error due to users making a new commit rather than
-        // amending when trying to address review comments.
-        if (rp.getRevWalk().isMergedInto(prior, newCommit)) {
-          reject(inputCommand, SAME_CHANGE_ID_IN_MULTIPLE_CHANGES);
-          return false;
-        }
-      }
-
-      PermissionBackend.ForRef perm = permissions.ref(change.getDest().get());
-      if (!validCommit(rp.getRevWalk(), perm, change.getDest(), inputCommand, newCommit)) {
-        return false;
-      }
-      rp.getRevWalk().parseBody(priorCommit);
-
-      // Don't allow the same tree if the commit message is unmodified
-      // or no parents were updated (rebase), else warn that only part
-      // of the commit was modified.
-      if (newCommit.getTree().equals(priorCommit.getTree())) {
-        boolean messageEq = eq(newCommit.getFullMessage(), priorCommit.getFullMessage());
-        boolean parentsEq = parentsEqual(newCommit, priorCommit);
-        boolean authorEq = authorEqual(newCommit, priorCommit);
-        ObjectReader reader = rp.getRevWalk().getObjectReader();
-
-        if (messageEq && parentsEq && authorEq && !autoClose) {
-          addMessage(
-              String.format(
-                  "(W) No changes between prior commit %s and new commit %s",
-                  reader.abbreviate(priorCommit).name(), reader.abbreviate(newCommit).name()));
-        } else {
-          StringBuilder msg = new StringBuilder();
-          msg.append("(I) ");
-          msg.append(reader.abbreviate(newCommit).name());
-          msg.append(":");
-          msg.append(" no files changed");
-          if (!authorEq) {
-            msg.append(", author changed");
-          }
-          if (!messageEq) {
-            msg.append(", message updated");
-          }
-          if (!parentsEq) {
-            msg.append(", was rebased");
-          }
-          addMessage(msg.toString());
-        }
-      }
-
-      if (magicBranch != null
-          && (magicBranch.workInProgress || magicBranch.ready)
-          && magicBranch.workInProgress != change.isWorkInProgress()
-          && (!user.getAccountId().equals(change.getOwner())
-              && !permissionBackend.user(user).test(GlobalPermission.ADMINISTRATE_SERVER)
-              && !projectControl.isOwner())) {
-        reject(inputCommand, ONLY_CHANGE_OWNER_OR_PROJECT_OWNER_CAN_MODIFY_WIP);
-        return false;
-      }
-
-      if (magicBranch != null && (magicBranch.edit || magicBranch.draft)) {
-        return newEdit();
-      }
-
-      newPatchSet();
-      return true;
-    }
-
-    private boolean newEdit() {
-      psId = notes.getChange().currentPatchSetId();
-      Optional<ChangeEdit> edit = null;
-
-      try {
-        edit = editUtil.byChange(notes, user);
-      } catch (AuthException | IOException e) {
-        logError("Cannot retrieve edit", e);
-        return false;
-      }
-
-      if (edit.isPresent()) {
-        if (edit.get().getBasePatchSet().getId().equals(psId)) {
-          // replace edit
-          cmd =
-              new ReceiveCommand(edit.get().getEditCommit(), newCommitId, edit.get().getRefName());
-        } else {
-          // delete old edit ref on rebase
-          prev =
-              new ReceiveCommand(
-                  edit.get().getEditCommit(), ObjectId.zeroId(), edit.get().getRefName());
-          createEditCommand();
-        }
-      } else {
-        createEditCommand();
-      }
-
-      return true;
-    }
-
-    private void createEditCommand() {
-      // create new edit
-      cmd =
-          new ReceiveCommand(
-              ObjectId.zeroId(),
-              newCommitId,
-              RefNames.refsEdit(user.getAccountId(), notes.getChangeId(), psId));
-    }
-
-    private void newPatchSet() throws IOException, OrmException {
-      RevCommit newCommit = rp.getRevWalk().parseCommit(newCommitId);
-      psId =
-          ChangeUtil.nextPatchSetIdFromAllRefsMap(allRefs(), notes.getChange().currentPatchSetId());
-      info = patchSetInfoFactory.get(rp.getRevWalk(), newCommit, psId);
-      cmd = new ReceiveCommand(ObjectId.zeroId(), newCommitId, psId.toRefName());
-    }
-
-    void addOps(BatchUpdate bu, @Nullable Task progress) throws IOException {
-      if (magicBranch != null && (magicBranch.edit || magicBranch.draft)) {
-        bu.addOp(notes.getChangeId(), new ReindexOnlyOp());
-        if (prev != null) {
-          bu.addRepoOnlyOp(new UpdateOneRefOp(prev));
-        }
-        bu.addRepoOnlyOp(new UpdateOneRefOp(cmd));
-        return;
-      }
-      RevWalk rw = rp.getRevWalk();
-      // TODO(dborowitz): Move to ReplaceOp#updateRepo.
-      RevCommit newCommit = rw.parseCommit(newCommitId);
-      rw.parseBody(newCommit);
-
-      RevCommit priorCommit = revisions.inverse().get(priorPatchSet);
-      replaceOp =
-          replaceOpFactory
-              .create(
-                  projectControl,
-                  notes.getChange().getDest(),
-                  checkMergedInto,
-                  priorPatchSet,
-                  priorCommit,
-                  psId,
-                  newCommit,
-                  info,
-                  groups,
-                  magicBranch,
-                  rp.getPushCertificate())
-              .setRequestScopePropagator(requestScopePropagator);
-      bu.addOp(notes.getChangeId(), replaceOp);
-      if (progress != null) {
-        bu.addOp(notes.getChangeId(), new ChangeProgressOp(progress));
-      }
-    }
-
-    String getRejectMessage() {
-      return replaceOp != null ? replaceOp.getRejectMessage() : null;
-    }
-  }
-
-  private class UpdateGroupsRequest {
-    private final PatchSet.Id psId;
-    private final RevCommit commit;
-    List<String> groups = ImmutableList.of();
-
-    UpdateGroupsRequest(Ref ref, RevCommit commit) {
-      this.psId = checkNotNull(PatchSet.Id.fromRef(ref.getName()));
-      this.commit = commit;
-    }
-
-    private void addOps(BatchUpdate bu) {
-      bu.addOp(
-          psId.getParentKey(),
-          new BatchUpdateOp() {
-            @Override
-            public boolean updateChange(ChangeContext ctx) throws OrmException {
-              PatchSet ps = psUtil.get(ctx.getDb(), ctx.getNotes(), psId);
-              List<String> oldGroups = ps.getGroups();
-              if (oldGroups == null) {
-                if (groups == null) {
-                  return false;
-                }
-              } else if (sameGroups(oldGroups, groups)) {
-                return false;
-              }
-              psUtil.setGroups(ctx.getDb(), ctx.getUpdate(psId), ps, groups);
-              return true;
-            }
-          });
-    }
-
-    private boolean sameGroups(List<String> a, List<String> b) {
-      return Sets.newHashSet(a).equals(Sets.newHashSet(b));
-    }
-  }
-
-  private class UpdateOneRefOp implements RepoOnlyOp {
-    private final ReceiveCommand cmd;
-
-    private UpdateOneRefOp(ReceiveCommand cmd) {
-      this.cmd = checkNotNull(cmd);
-    }
-
-    @Override
-    public void updateRepo(RepoContext ctx) throws IOException {
-      ctx.addRefUpdate(cmd);
-    }
-
-    @Override
-    public void postUpdate(Context ctx) {
-      String refName = cmd.getRefName();
-      if (cmd.getType() == ReceiveCommand.Type.UPDATE) { // aka fast-forward
-        logDebug("Updating tag cache on fast-forward of {}", cmd.getRefName());
-        tagCache.updateFastForward(project.getNameKey(), refName, cmd.getOldId(), cmd.getNewId());
-      }
-      if (isConfig(cmd)) {
-        logDebug("Reloading project in cache");
-        projectCache.evict(project);
-        ProjectState ps = projectCache.get(project.getNameKey());
-        try {
-          logDebug("Updating project description");
-          repo.setGitwebDescription(ps.getProject().getDescription());
-        } catch (IOException e) {
-          log.warn("cannot update description of " + project.getName(), e);
-        }
-      }
-    }
-  }
-
-  private static class ReindexOnlyOp implements BatchUpdateOp {
-    @Override
-    public boolean updateChange(ChangeContext ctx) {
-      // Trigger reindexing even though change isn't actually updated.
-      return true;
-    }
-  }
-
-  private List<Ref> refs(Change.Id changeId) {
-    return refsByChange().get(changeId);
-  }
-
-  private void initChangeRefMaps() {
-    if (refsByChange == null) {
-      int estRefsPerChange = 4;
-      refsById = MultimapBuilder.hashKeys().arrayListValues().build();
-      refsByChange =
-          MultimapBuilder.hashKeys(allRefs().size() / estRefsPerChange)
-              .arrayListValues(estRefsPerChange)
-              .build();
-      for (Ref ref : allRefs().values()) {
-        ObjectId obj = ref.getObjectId();
-        if (obj != null) {
-          PatchSet.Id psId = PatchSet.Id.fromRef(ref.getName());
-          if (psId != null) {
-            refsById.put(obj, ref);
-            refsByChange.put(psId.getParentKey(), ref);
-          }
-        }
-      }
-    }
-  }
-
-  private ListMultimap<Change.Id, Ref> refsByChange() {
-    initChangeRefMaps();
-    return refsByChange;
-  }
-
-  private ListMultimap<ObjectId, Ref> changeRefsById() {
-    initChangeRefMaps();
-    return refsById;
-  }
-
-  static boolean parentsEqual(RevCommit a, RevCommit b) {
-    if (a.getParentCount() != b.getParentCount()) {
-      return false;
-    }
-    for (int i = 0; i < a.getParentCount(); i++) {
-      if (!a.getParent(i).equals(b.getParent(i))) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  static boolean authorEqual(RevCommit a, RevCommit b) {
-    PersonIdent aAuthor = a.getAuthorIdent();
-    PersonIdent bAuthor = b.getAuthorIdent();
-
-    if (aAuthor == null && bAuthor == null) {
-      return true;
-    } else if (aAuthor == null || bAuthor == null) {
-      return false;
-    }
-
-    return eq(aAuthor.getName(), bAuthor.getName())
-        && eq(aAuthor.getEmailAddress(), bAuthor.getEmailAddress());
-  }
-
-  static boolean eq(String a, String b) {
-    if (a == null && b == null) {
-      return true;
-    } else if (a == null || b == null) {
-      return false;
-    } else {
-      return a.equals(b);
-    }
-  }
-
-  private boolean validRefOperation(ReceiveCommand cmd) {
-    RefOperationValidators refValidators = refValidatorsFactory.create(getProject(), user, cmd);
-
-    try {
-      messages.addAll(refValidators.validateForRefOperation());
-    } catch (RefOperationValidationException e) {
-      messages.addAll(Lists.newArrayList(e.getMessages()));
-      reject(cmd, e.getMessage());
-      return false;
-    }
-
-    return true;
-  }
-
-  private void validateNewCommits(Branch.NameKey branch, ReceiveCommand cmd)
-      throws PermissionBackendException {
-    PermissionBackend.ForRef perm = permissions.ref(branch.get());
-    if (!RefNames.REFS_CONFIG.equals(cmd.getRefName())
-        && !(MagicBranch.isMagicBranch(cmd.getRefName())
-            || NEW_PATCHSET_PATTERN.matcher(cmd.getRefName()).matches())
-        && pushOptions.containsKey(PUSH_OPTION_SKIP_VALIDATION)) {
-      try {
-        perm.check(RefPermission.SKIP_VALIDATION);
-        if (!Iterables.isEmpty(rejectCommits)) {
-          throw new AuthException("reject-commits prevents " + PUSH_OPTION_SKIP_VALIDATION);
-        }
-        logDebug("Short-circuiting new commit validation");
-      } catch (AuthException denied) {
-        reject(cmd, denied.getMessage());
-      }
-      return;
-    }
-
-    boolean missingFullName = Strings.isNullOrEmpty(user.getAccount().getFullName());
-    RevWalk walk = rp.getRevWalk();
-    walk.reset();
-    walk.sort(RevSort.NONE);
-    try {
-      RevObject parsedObject = walk.parseAny(cmd.getNewId());
-      if (!(parsedObject instanceof RevCommit)) {
-        return;
-      }
-      ListMultimap<ObjectId, Ref> existing = changeRefsById();
-      walk.markStart((RevCommit) parsedObject);
-      markHeadsAsUninteresting(walk, cmd.getRefName());
-      int limit = receiveConfig.maxBatchCommits;
-      int n = 0;
-      for (RevCommit c; (c = walk.next()) != null; ) {
-        if (++n > limit) {
-          logDebug("Number of new commits exceeds limit of {}", limit);
-          addMessage(
-              "Cannot push more than "
-                  + limit
-                  + " commits to "
-                  + branch.get()
-                  + " without "
-                  + PUSH_OPTION_SKIP_VALIDATION
-                  + " option");
-          reject(cmd, "too many commits");
-          return;
-        }
-        if (existing.keySet().contains(c)) {
-          continue;
-        } else if (!validCommit(walk, perm, branch, cmd, c)) {
-          break;
-        }
-
-        if (missingFullName && user.hasEmailAddress(c.getCommitterIdent().getEmailAddress())) {
-          logDebug("Will update full name of caller");
-          setFullNameTo = c.getCommitterIdent().getName();
-          missingFullName = false;
-        }
-      }
-      logDebug("Validated {} new commits", n);
-    } catch (IOException err) {
-      cmd.setResult(REJECTED_MISSING_OBJECT);
-      logError("Invalid pack upload; one or more objects weren't sent", err);
-    }
-  }
-
-  private String messageForCommit(RevCommit c, String msg) {
-    return String.format("commit %s: %s", c.abbreviate(RevId.ABBREV_LEN).name(), msg);
-  }
-
-  private boolean validCommit(
-      RevWalk rw,
-      PermissionBackend.ForRef perm,
-      Branch.NameKey branch,
-      ReceiveCommand cmd,
-      ObjectId id)
-      throws IOException {
-
-    if (validCommits.contains(id)) {
-      return true;
-    }
-
-    RevCommit c = rw.parseCommit(id);
-    rw.parseBody(c);
-
-    try (CommitReceivedEvent receiveEvent =
-        new CommitReceivedEvent(cmd, project, branch.get(), rw.getObjectReader(), c, user)) {
-      boolean isMerged =
-          magicBranch != null
-              && cmd.getRefName().equals(magicBranch.cmd.getRefName())
-              && magicBranch.merged;
-      CommitValidators validators =
-          isMerged
-              ? commitValidatorsFactory.forMergedCommits(perm, user.asIdentifiedUser())
-              : commitValidatorsFactory.forReceiveCommits(
-                  perm, branch, user.asIdentifiedUser(), sshInfo, repo, rw);
-      for (CommitValidationMessage m : validators.validate(receiveEvent)) {
-        messages.add(new CommitValidationMessage(messageForCommit(c, m.getMessage()), m.isError()));
-      }
-    } catch (CommitValidationException e) {
-      logDebug("Commit validation failed on {}", c.name());
-      for (CommitValidationMessage m : e.getMessages()) {
-        // TODO(hanwen): drop the non-error messages?
-        messages.add(new CommitValidationMessage(messageForCommit(c, m.getMessage()), m.isError()));
-      }
-      reject(cmd, messageForCommit(c, e.getMessage()));
-      return false;
-    }
-    validCommits.add(c.copy());
-    return true;
-  }
-
-  private void autoCloseChanges(ReceiveCommand cmd) {
-    logDebug("Starting auto-closing of changes");
-    String refName = cmd.getRefName();
-    checkState(
-        !MagicBranch.isMagicBranch(refName),
-        "shouldn't be auto-closing changes on magic branch %s",
-        refName);
-    // TODO(dborowitz): Combine this BatchUpdate with the main one in
-    // insertChangesAndPatchSets.
-    try (BatchUpdate bu =
-            batchUpdateFactory.create(
-                db, projectControl.getProject().getNameKey(), user, TimeUtil.nowTs());
-        ObjectInserter ins = repo.newObjectInserter();
-        ObjectReader reader = ins.newReader();
-        RevWalk rw = new RevWalk(reader)) {
-      bu.setRepository(repo, rw, ins).updateChangesInParallel();
-      bu.setRequestId(receiveId);
-      // TODO(dborowitz): Teach BatchUpdate to ignore missing changes.
-
-      RevCommit newTip = rw.parseCommit(cmd.getNewId());
-      Branch.NameKey branch = new Branch.NameKey(project.getNameKey(), refName);
-
-      rw.reset();
-      rw.markStart(newTip);
-      if (!ObjectId.zeroId().equals(cmd.getOldId())) {
-        rw.markUninteresting(rw.parseCommit(cmd.getOldId()));
-      }
-
-      ListMultimap<ObjectId, Ref> byCommit = changeRefsById();
-      Map<Change.Key, ChangeNotes> byKey = null;
-      List<ReplaceRequest> replaceAndClose = new ArrayList<>();
-
-      int existingPatchSets = 0;
-      int newPatchSets = 0;
-      COMMIT:
-      for (RevCommit c; (c = rw.next()) != null; ) {
-        rw.parseBody(c);
-
-        for (Ref ref : byCommit.get(c.copy())) {
-          PatchSet.Id psId = PatchSet.Id.fromRef(ref.getName());
-          Optional<ChangeData> cd = byLegacyId(psId.getParentKey());
-          if (cd.isPresent() && cd.get().change().getDest().equals(branch)) {
-            existingPatchSets++;
-            bu.addOp(
-                psId.getParentKey(),
-                mergedByPushOpFactory.create(requestScopePropagator, psId, refName));
-            continue COMMIT;
-          }
-        }
-
-        for (String changeId : c.getFooterLines(CHANGE_ID)) {
-          if (byKey == null) {
-            byKey = openChangesByKeyByBranch(branch);
-          }
-
-          ChangeNotes onto = byKey.get(new Change.Key(changeId.trim()));
-          if (onto != null) {
-            newPatchSets++;
-            // Hold onto this until we're done with the walk, as the call to
-            // req.validate below calls isMergedInto which resets the walk.
-            ReplaceRequest req = new ReplaceRequest(onto.getChangeId(), c, cmd, false);
-            req.notes = onto;
-            replaceAndClose.add(req);
-            continue COMMIT;
-          }
-        }
-      }
-
-      for (ReplaceRequest req : replaceAndClose) {
-        Change.Id id = req.notes.getChangeId();
-        if (!req.validate(true)) {
-          logDebug("Not closing {} because validation failed", id);
-          continue;
-        }
-        req.addOps(bu, null);
-        bu.addOp(
-            id,
-            mergedByPushOpFactory
-                .create(requestScopePropagator, req.psId, refName)
-                .setPatchSetProvider(
-                    new Provider<PatchSet>() {
-                      @Override
-                      public PatchSet get() {
-                        return req.replaceOp.getPatchSet();
-                      }
-                    }));
-        bu.addOp(id, new ChangeProgressOp(closeProgress));
-      }
-
-      logDebug(
-          "Auto-closing {} changes with existing patch sets and {} with new patch sets",
-          existingPatchSets,
-          newPatchSets);
-      bu.execute();
-    } catch (RestApiException e) {
-      logError("Can't insert patchset", e);
-    } catch (IOException | OrmException | UpdateException | PermissionBackendException e) {
-      logError("Can't scan for changes to close", e);
-    }
-  }
-
-  private void updateAccountInfo() {
-    if (setFullNameTo == null) {
-      return;
-    }
-    logDebug("Updating full name of caller");
-    try {
-      Account account =
-          accountsUpdate
-              .create()
-              .update(
-                  user.getAccountId(),
-                  a -> {
-                    if (Strings.isNullOrEmpty(a.getFullName())) {
-                      a.setFullName(setFullNameTo);
-                    }
-                  });
-      if (account != null) {
-        user.getAccount().setFullName(account.getFullName());
-      }
-    } catch (IOException | ConfigInvalidException e) {
-      logWarn("Failed to update full name of caller", e);
-    }
-  }
-
-  private Map<Change.Key, ChangeNotes> openChangesByKeyByBranch(Branch.NameKey branch)
-      throws OrmException {
-    Map<Change.Key, ChangeNotes> r = new HashMap<>();
-    for (ChangeData cd : queryProvider.get().byBranchOpen(branch)) {
-      try {
-        r.put(cd.change().getKey(), cd.notes());
-      } catch (NoSuchChangeException e) {
-        // Ignore deleted change
-      }
-    }
-    return r;
-  }
-
-  private Optional<ChangeData> byLegacyId(Change.Id legacyId) throws OrmException {
-    List<ChangeData> res = queryProvider.get().byLegacyChangeId(legacyId);
-    if (res.isEmpty()) {
-      return Optional.empty();
-    }
-    return Optional.of(res.get(0));
-  }
-
-  private Map<String, Ref> allRefs() {
-    return allRefsWatcher.getAllRefs();
-  }
-
-  private void reject(@Nullable ReceiveCommand cmd, String why) {
-    if (cmd != null) {
-      cmd.setResult(REJECTED_OTHER_REASON, why);
-      commandProgress.update(1);
-    }
-  }
-
-  private static boolean isHead(ReceiveCommand cmd) {
-    return cmd.getRefName().startsWith(Constants.R_HEADS);
-  }
-
-  private static boolean isConfig(ReceiveCommand cmd) {
-    return cmd.getRefName().equals(RefNames.REFS_CONFIG);
-  }
-
-  private void logDebug(String msg, Object... args) {
-    if (log.isDebugEnabled()) {
-      log.debug(receiveId + msg, args);
-    }
-  }
-
-  private void logWarn(String msg, Throwable t) {
-    if (log.isWarnEnabled()) {
-      if (t != null) {
-        log.warn(receiveId + msg, t);
-      } else {
-        log.warn(receiveId + msg);
-      }
-    }
-  }
-
-  private void logWarn(String msg) {
-    logWarn(msg, null);
-  }
-
-  private void logError(String msg, Throwable t) {
-    if (log.isErrorEnabled()) {
-      if (t != null) {
-        log.error(receiveId + msg, t);
-      } else {
-        log.error(receiveId + msg);
-      }
-    }
-  }
-
-  private void logError(String msg) {
-    logError(msg, null);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveCommitsAdvertiseRefsHook.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveCommitsAdvertiseRefsHook.java
deleted file mode 100644
index 3645392..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveCommitsAdvertiseRefsHook.java
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.server.git.receive;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.index.change.ChangeField;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.InternalChangeQuery;
-import com.google.gerrit.server.util.MagicBranch;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Provider;
-import java.util.Collections;
-import java.util.Map;
-import java.util.Set;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.transport.AdvertiseRefsHook;
-import org.eclipse.jgit.transport.BaseReceivePack;
-import org.eclipse.jgit.transport.ServiceMayNotContinueException;
-import org.eclipse.jgit.transport.UploadPack;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Exposes only the non refs/changes/ reference names. */
-public class ReceiveCommitsAdvertiseRefsHook implements AdvertiseRefsHook {
-  private static final Logger log = LoggerFactory.getLogger(ReceiveCommitsAdvertiseRefsHook.class);
-
-  @VisibleForTesting
-  @AutoValue
-  public abstract static class Result {
-    public abstract Map<String, Ref> allRefs();
-
-    public abstract Set<ObjectId> additionalHaves();
-  }
-
-  private final Provider<InternalChangeQuery> queryProvider;
-  private final Project.NameKey projectName;
-
-  public ReceiveCommitsAdvertiseRefsHook(
-      Provider<InternalChangeQuery> queryProvider, Project.NameKey projectName) {
-    this.queryProvider = queryProvider;
-    this.projectName = projectName;
-  }
-
-  @Override
-  public void advertiseRefs(UploadPack us) {
-    throw new UnsupportedOperationException(
-        "ReceiveCommitsAdvertiseRefsHook cannot be used for UploadPack");
-  }
-
-  @Override
-  public void advertiseRefs(BaseReceivePack rp) throws ServiceMayNotContinueException {
-    Result r = advertiseRefs(HookUtil.ensureAllRefsAdvertised(rp));
-    rp.setAdvertisedRefs(r.allRefs(), r.additionalHaves());
-  }
-
-  @VisibleForTesting
-  public Result advertiseRefs(Map<String, Ref> oldRefs) {
-    Map<String, Ref> r = Maps.newHashMapWithExpectedSize(oldRefs.size());
-    Set<ObjectId> allPatchSets = Sets.newHashSetWithExpectedSize(oldRefs.size());
-    for (Map.Entry<String, Ref> e : oldRefs.entrySet()) {
-      String name = e.getKey();
-      if (!skip(name)) {
-        r.put(name, e.getValue());
-      }
-      if (name.startsWith(RefNames.REFS_CHANGES)) {
-        allPatchSets.add(e.getValue().getObjectId());
-      }
-    }
-    return new AutoValue_ReceiveCommitsAdvertiseRefsHook_Result(
-        r, advertiseOpenChanges(allPatchSets));
-  }
-
-  private static final ImmutableSet<String> OPEN_CHANGES_FIELDS =
-      ImmutableSet.of(
-          // Required for ChangeIsVisibleToPrdicate.
-          ChangeField.CHANGE.getName(),
-          ChangeField.REVIEWER.getName(),
-          // Required during advertiseOpenChanges.
-          ChangeField.PATCH_SET.getName());
-
-  private Set<ObjectId> advertiseOpenChanges(Set<ObjectId> allPatchSets) {
-    // Advertise some recent open changes, in case a commit is based on one.
-    int limit = 32;
-    try {
-      Set<ObjectId> r = Sets.newHashSetWithExpectedSize(limit);
-      for (ChangeData cd :
-          queryProvider
-              .get()
-              .setRequestedFields(OPEN_CHANGES_FIELDS)
-              .enforceVisibility(true)
-              .setLimit(limit)
-              .byProjectOpen(projectName)) {
-        PatchSet ps = cd.currentPatchSet();
-        if (ps != null) {
-          ObjectId id = ObjectId.fromString(ps.getRevision().get());
-          // Ensure we actually observed a patch set ref pointing to this
-          // object, in case the database is out of sync with the repo and the
-          // object doesn't actually exist.
-          if (allPatchSets.contains(id)) {
-            r.add(id);
-          }
-        }
-      }
-      return r;
-    } catch (OrmException err) {
-      log.error("Cannot list open changes of " + projectName, err);
-      return Collections.emptySet();
-    }
-  }
-
-  private static boolean skip(String name) {
-    return name.startsWith(RefNames.REFS_CHANGES)
-        || name.startsWith(RefNames.REFS_CACHE_AUTOMERGE)
-        || MagicBranch.isMagicBranch(name);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveCommitsExecutor.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveCommitsExecutor.java
deleted file mode 100644
index ee83a2c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveCommitsExecutor.java
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.git.receive;
-
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-import com.google.inject.BindingAnnotation;
-import java.lang.annotation.Retention;
-import java.util.concurrent.ExecutorService;
-
-/** Marker on the global {@link ExecutorService} used by {@link ReceiveCommits}. */
-@Retention(RUNTIME)
-@BindingAnnotation
-public @interface ReceiveCommitsExecutor {}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveCommitsExecutorModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveCommitsExecutorModule.java
deleted file mode 100644
index 8a66e34..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveCommitsExecutorModule.java
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.git.receive;
-
-import com.google.common.util.concurrent.ListeningExecutorService;
-import com.google.common.util.concurrent.MoreExecutors;
-import com.google.common.util.concurrent.ThreadFactoryBuilder;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.git.SendEmailExecutor;
-import com.google.gerrit.server.git.WorkQueue;
-import com.google.gerrit.server.update.ChangeUpdateExecutor;
-import com.google.inject.AbstractModule;
-import com.google.inject.Provides;
-import com.google.inject.Singleton;
-import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-import org.eclipse.jgit.lib.Config;
-
-/**
- * Module providing the {@link ReceiveCommitsExecutor}.
- *
- * <p>Unlike {@link ReceiveCommitsModule}, this module is intended to be installed only in top-level
- * injectors like in {@code Daemon}, not in the {@code sysInjector}.
- */
-public class ReceiveCommitsExecutorModule extends AbstractModule {
-  @Override
-  protected void configure() {}
-
-  @Provides
-  @Singleton
-  @ReceiveCommitsExecutor
-  public ExecutorService createReceiveCommitsExecutor(
-      @GerritServerConfig Config config, WorkQueue queues) {
-    int poolSize =
-        config.getInt(
-            "receive", null, "threadPoolSize", Runtime.getRuntime().availableProcessors());
-    return queues.createQueue(poolSize, "ReceiveCommits", true);
-  }
-
-  @Provides
-  @Singleton
-  @SendEmailExecutor
-  public ExecutorService createSendEmailExecutor(
-      @GerritServerConfig Config config, WorkQueue queues) {
-    int poolSize = config.getInt("sendemail", null, "threadPoolSize", 1);
-    if (poolSize == 0) {
-      return MoreExecutors.newDirectExecutorService();
-    }
-    return queues.createQueue(poolSize, "SendEmail", true);
-  }
-
-  @Provides
-  @Singleton
-  @ChangeUpdateExecutor
-  public ListeningExecutorService createChangeUpdateExecutor(@GerritServerConfig Config config) {
-    int poolSize = config.getInt("receive", null, "changeUpdateThreads", 1);
-    if (poolSize <= 1) {
-      return MoreExecutors.newDirectExecutorService();
-    }
-    return MoreExecutors.listeningDecorator(
-        MoreExecutors.getExitingExecutorService(
-            new ThreadPoolExecutor(
-                1,
-                poolSize,
-                10,
-                TimeUnit.MINUTES,
-                new ArrayBlockingQueue<Runnable>(poolSize),
-                new ThreadFactoryBuilder().setNameFormat("ChangeUpdate-%d").setDaemon(true).build(),
-                new ThreadPoolExecutor.CallerRunsPolicy())));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveConstants.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveConstants.java
deleted file mode 100644
index b71f01e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveConstants.java
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.git.receive;
-
-import com.google.common.annotations.VisibleForTesting;
-
-public final class ReceiveConstants {
-  public static final String PUSH_OPTION_SKIP_VALIDATION = "skip-validation";
-
-  @VisibleForTesting
-  public static final String ONLY_CHANGE_OWNER_OR_PROJECT_OWNER_CAN_MODIFY_WIP =
-      "only change owner or project owner can modify Work-in-Progress";
-
-  static final String COMMAND_REJECTION_MESSAGE_FOOTER =
-      "Please read the documentation and contact an administrator\n"
-          + "if you feel the configuration is incorrect";
-
-  static final String SAME_CHANGE_ID_IN_MULTIPLE_CHANGES =
-      "same Change-Id in multiple changes.\n"
-          + "Squash the commits with the same Change-Id or "
-          + "ensure Change-Ids are unique for each commit";
-
-  private ReceiveConstants() {}
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReplaceOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReplaceOp.java
deleted file mode 100644
index 4455aed..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReplaceOp.java
+++ /dev/null
@@ -1,604 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.git.receive;
-
-import static com.google.gerrit.common.FooterConstants.CHANGE_ID;
-import static com.google.gerrit.server.mail.MailUtil.getRecipientsFromFooters;
-import static com.google.gerrit.server.mail.MailUtil.getRecipientsFromReviewers;
-import static com.google.gerrit.server.notedb.ReviewerStateInternal.REVIEWER;
-import static org.eclipse.jgit.lib.Constants.R_HEADS;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableListMultimap;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.client.ChangeKind;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.client.PatchSetInfo;
-import com.google.gerrit.server.ApprovalCopier;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.CommentsUtil;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.account.AccountResolver;
-import com.google.gerrit.server.change.ChangeKindCache;
-import com.google.gerrit.server.change.EmailReviewComments;
-import com.google.gerrit.server.extensions.events.CommentAdded;
-import com.google.gerrit.server.extensions.events.RevisionCreated;
-import com.google.gerrit.server.git.MergedByPushOp;
-import com.google.gerrit.server.git.SendEmailExecutor;
-import com.google.gerrit.server.git.receive.ReceiveCommits.MagicBranchInput;
-import com.google.gerrit.server.mail.MailUtil.MailRecipients;
-import com.google.gerrit.server.mail.send.ReplacePatchSetSender;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.ChangeUpdate;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.Context;
-import com.google.gerrit.server.update.RepoContext;
-import com.google.gerrit.server.util.RequestScopePropagator;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import com.google.inject.util.Providers;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Future;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.PushCertificate;
-import org.eclipse.jgit.transport.ReceiveCommand;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ReplaceOp implements BatchUpdateOp {
-  public interface Factory {
-    ReplaceOp create(
-        ProjectControl projectControl,
-        Branch.NameKey dest,
-        boolean checkMergedInto,
-        @Assisted("priorPatchSetId") PatchSet.Id priorPatchSetId,
-        @Assisted("priorCommitId") ObjectId priorCommit,
-        @Assisted("patchSetId") PatchSet.Id patchSetId,
-        @Assisted("commitId") ObjectId commitId,
-        PatchSetInfo info,
-        List<String> groups,
-        @Nullable MagicBranchInput magicBranch,
-        @Nullable PushCertificate pushCertificate);
-  }
-
-  private static final Logger log = LoggerFactory.getLogger(ReplaceOp.class);
-
-  private static final String CHANGE_IS_CLOSED = "change is closed";
-
-  private final AccountResolver accountResolver;
-  private final ApprovalCopier approvalCopier;
-  private final ApprovalsUtil approvalsUtil;
-  private final ChangeData.Factory changeDataFactory;
-  private final ChangeKindCache changeKindCache;
-  private final ChangeMessagesUtil cmUtil;
-  private final CommentsUtil commentsUtil;
-  private final EmailReviewComments.Factory emailCommentsFactory;
-  private final ExecutorService sendEmailExecutor;
-  private final RevisionCreated revisionCreated;
-  private final CommentAdded commentAdded;
-  private final MergedByPushOp.Factory mergedByPushOpFactory;
-  private final PatchSetUtil psUtil;
-  private final ReplacePatchSetSender.Factory replacePatchSetFactory;
-  private final ProjectCache projectCache;
-
-  private final ProjectControl projectControl;
-  private final Branch.NameKey dest;
-  private final boolean checkMergedInto;
-  private final PatchSet.Id priorPatchSetId;
-  private final ObjectId priorCommitId;
-  private final PatchSet.Id patchSetId;
-  private final ObjectId commitId;
-  private final PatchSetInfo info;
-  private final MagicBranchInput magicBranch;
-  private final PushCertificate pushCertificate;
-  private List<String> groups = ImmutableList.of();
-
-  private final Map<String, Short> approvals = new HashMap<>();
-  private final MailRecipients recipients = new MailRecipients();
-  private RevCommit commit;
-  private ReceiveCommand cmd;
-  private ChangeNotes notes;
-  private PatchSet newPatchSet;
-  private ChangeKind changeKind;
-  private ChangeMessage msg;
-  private List<Comment> comments = ImmutableList.of();
-  private String rejectMessage;
-  private MergedByPushOp mergedByPushOp;
-  private RequestScopePropagator requestScopePropagator;
-
-  @Inject
-  ReplaceOp(
-      AccountResolver accountResolver,
-      ApprovalCopier approvalCopier,
-      ApprovalsUtil approvalsUtil,
-      ChangeData.Factory changeDataFactory,
-      ChangeKindCache changeKindCache,
-      ChangeMessagesUtil cmUtil,
-      CommentsUtil commentsUtil,
-      EmailReviewComments.Factory emailCommentsFactory,
-      RevisionCreated revisionCreated,
-      CommentAdded commentAdded,
-      MergedByPushOp.Factory mergedByPushOpFactory,
-      PatchSetUtil psUtil,
-      ReplacePatchSetSender.Factory replacePatchSetFactory,
-      ProjectCache projectCache,
-      @SendEmailExecutor ExecutorService sendEmailExecutor,
-      @Assisted ProjectControl projectControl,
-      @Assisted Branch.NameKey dest,
-      @Assisted boolean checkMergedInto,
-      @Assisted("priorPatchSetId") PatchSet.Id priorPatchSetId,
-      @Assisted("priorCommitId") ObjectId priorCommitId,
-      @Assisted("patchSetId") PatchSet.Id patchSetId,
-      @Assisted("commitId") ObjectId commitId,
-      @Assisted PatchSetInfo info,
-      @Assisted List<String> groups,
-      @Assisted @Nullable MagicBranchInput magicBranch,
-      @Assisted @Nullable PushCertificate pushCertificate) {
-    this.accountResolver = accountResolver;
-    this.approvalCopier = approvalCopier;
-    this.approvalsUtil = approvalsUtil;
-    this.changeDataFactory = changeDataFactory;
-    this.changeKindCache = changeKindCache;
-    this.cmUtil = cmUtil;
-    this.commentsUtil = commentsUtil;
-    this.emailCommentsFactory = emailCommentsFactory;
-    this.revisionCreated = revisionCreated;
-    this.commentAdded = commentAdded;
-    this.mergedByPushOpFactory = mergedByPushOpFactory;
-    this.psUtil = psUtil;
-    this.replacePatchSetFactory = replacePatchSetFactory;
-    this.projectCache = projectCache;
-    this.sendEmailExecutor = sendEmailExecutor;
-
-    this.projectControl = projectControl;
-    this.dest = dest;
-    this.checkMergedInto = checkMergedInto;
-    this.priorPatchSetId = priorPatchSetId;
-    this.priorCommitId = priorCommitId.copy();
-    this.patchSetId = patchSetId;
-    this.commitId = commitId.copy();
-    this.info = info;
-    this.groups = groups;
-    this.magicBranch = magicBranch;
-    this.pushCertificate = pushCertificate;
-  }
-
-  @Override
-  public void updateRepo(RepoContext ctx) throws Exception {
-    commit = ctx.getRevWalk().parseCommit(commitId);
-    ctx.getRevWalk().parseBody(commit);
-    changeKind =
-        changeKindCache.getChangeKind(
-            projectControl.getProject().getNameKey(),
-            ctx.getRevWalk(),
-            ctx.getRepoView().getConfig(),
-            priorCommitId,
-            commitId);
-
-    if (checkMergedInto) {
-      String mergedInto = findMergedInto(ctx, dest.get(), commit);
-      if (mergedInto != null) {
-        mergedByPushOp =
-            mergedByPushOpFactory.create(requestScopePropagator, patchSetId, mergedInto);
-      }
-    }
-
-    cmd = new ReceiveCommand(ObjectId.zeroId(), commitId, patchSetId.toRefName());
-    ctx.addRefUpdate(cmd);
-  }
-
-  @Override
-  public boolean updateChange(ChangeContext ctx)
-      throws RestApiException, OrmException, IOException, PermissionBackendException {
-    notes = ctx.getNotes();
-    Change change = notes.getChange();
-    if (change == null || change.getStatus().isClosed()) {
-      rejectMessage = CHANGE_IS_CLOSED;
-      return false;
-    }
-    if (groups.isEmpty()) {
-      PatchSet prevPs = psUtil.current(ctx.getDb(), notes);
-      groups = prevPs != null ? prevPs.getGroups() : ImmutableList.<String>of();
-    }
-
-    ChangeUpdate update = ctx.getUpdate(patchSetId);
-    update.setSubjectForCommit("Create patch set " + patchSetId.get());
-
-    String reviewMessage = null;
-    String psDescription = null;
-    if (magicBranch != null) {
-      recipients.add(magicBranch.getMailRecipients());
-      reviewMessage = magicBranch.message;
-      psDescription = magicBranch.message;
-      approvals.putAll(magicBranch.labels);
-      Set<String> hashtags = magicBranch.hashtags;
-      if (hashtags != null && !hashtags.isEmpty()) {
-        hashtags.addAll(notes.getHashtags());
-        update.setHashtags(hashtags);
-      }
-      if (magicBranch.topic != null && !magicBranch.topic.equals(ctx.getChange().getTopic())) {
-        update.setTopic(magicBranch.topic);
-      }
-      if (magicBranch.removePrivate) {
-        change.setPrivate(false);
-        update.setPrivate(false);
-      } else if (magicBranch.isPrivate) {
-        change.setPrivate(true);
-        update.setPrivate(true);
-      }
-      if (magicBranch.ready) {
-        change.setWorkInProgress(false);
-        change.setReviewStarted(true);
-        update.setWorkInProgress(false);
-      } else if (magicBranch.workInProgress) {
-        change.setWorkInProgress(true);
-        update.setWorkInProgress(true);
-      }
-      if (shouldPublishComments()) {
-        boolean workInProgress = change.isWorkInProgress();
-        if (magicBranch != null && magicBranch.workInProgress) {
-          workInProgress = true;
-        }
-        comments = publishComments(ctx, workInProgress);
-      }
-    }
-
-    newPatchSet =
-        psUtil.insert(
-            ctx.getDb(),
-            ctx.getRevWalk(),
-            update,
-            patchSetId,
-            commitId,
-            groups,
-            pushCertificate != null ? pushCertificate.toTextWithSignature() : null,
-            psDescription);
-
-    update.setPsDescription(psDescription);
-    recipients.add(getRecipientsFromFooters(accountResolver, commit.getFooterLines()));
-    recipients.remove(ctx.getAccountId());
-    ChangeData cd = changeDataFactory.create(ctx.getDb(), ctx.getNotes());
-    MailRecipients oldRecipients = getRecipientsFromReviewers(cd.reviewers());
-    Iterable<PatchSetApproval> newApprovals =
-        approvalsUtil.addApprovalsForNewPatchSet(
-            ctx.getDb(),
-            update,
-            projectControl.getProjectState().getLabelTypes(),
-            newPatchSet,
-            ctx.getUser(),
-            approvals);
-    approvalCopier.copyInReviewDb(
-        ctx.getDb(),
-        ctx.getNotes(),
-        ctx.getUser(),
-        newPatchSet,
-        ctx.getRevWalk(),
-        ctx.getRepoView().getConfig(),
-        newApprovals);
-    approvalsUtil.addReviewers(
-        ctx.getDb(),
-        update,
-        projectControl.getProjectState().getLabelTypes(),
-        change,
-        newPatchSet,
-        info,
-        recipients.getReviewers(),
-        oldRecipients.getAll());
-
-    // Check if approvals are changing in with this update. If so, add current user to reviewers.
-    // Note that this is done separately as addReviewers is filtering out the change owner as
-    // reviewer which is needed in several other code paths.
-    if (magicBranch != null && !magicBranch.labels.isEmpty()) {
-      update.putReviewer(ctx.getAccountId(), REVIEWER);
-    }
-
-    recipients.add(oldRecipients);
-
-    msg = createChangeMessage(ctx, reviewMessage);
-    cmUtil.addChangeMessage(ctx.getDb(), update, msg);
-
-    if (mergedByPushOp == null) {
-      resetChange(ctx);
-    } else {
-      mergedByPushOp.setPatchSetProvider(Providers.of(newPatchSet)).updateChange(ctx);
-    }
-
-    return true;
-  }
-
-  private ChangeMessage createChangeMessage(ChangeContext ctx, String reviewMessage)
-      throws OrmException, IOException {
-    String approvalMessage =
-        ApprovalsUtil.renderMessageWithApprovals(
-            patchSetId.get(), approvals, scanLabels(ctx, approvals));
-    String kindMessage = changeKindMessage(changeKind);
-    StringBuilder message = new StringBuilder(approvalMessage);
-    if (!Strings.isNullOrEmpty(kindMessage)) {
-      message.append(kindMessage);
-    } else {
-      message.append('.');
-    }
-    if (comments.size() == 1) {
-      message.append("\n\n(1 comment)");
-    } else if (comments.size() > 1) {
-      message.append(String.format("\n\n(%d comments)", comments.size()));
-    }
-    if (!Strings.isNullOrEmpty(reviewMessage)) {
-      message.append("\n\n").append(reviewMessage);
-    }
-    boolean workInProgress = ctx.getChange().isWorkInProgress();
-    if (magicBranch != null && magicBranch.workInProgress) {
-      workInProgress = true;
-    }
-    return ChangeMessagesUtil.newMessage(
-        patchSetId,
-        ctx.getUser(),
-        ctx.getWhen(),
-        message.toString(),
-        ChangeMessagesUtil.uploadedPatchSetTag(workInProgress));
-  }
-
-  private String changeKindMessage(ChangeKind changeKind) {
-    switch (changeKind) {
-      case MERGE_FIRST_PARENT_UPDATE:
-      case TRIVIAL_REBASE:
-      case NO_CHANGE:
-        return ": Patch Set " + priorPatchSetId.get() + " was rebased.";
-      case NO_CODE_CHANGE:
-        return ": Commit message was updated.";
-      case REWORK:
-      default:
-        return null;
-    }
-  }
-
-  private Map<String, PatchSetApproval> scanLabels(ChangeContext ctx, Map<String, Short> approvals)
-      throws OrmException, IOException {
-    Map<String, PatchSetApproval> current = new HashMap<>();
-    // We optimize here and only retrieve current when approvals provided
-    if (!approvals.isEmpty()) {
-      for (PatchSetApproval a :
-          approvalsUtil.byPatchSetUser(
-              ctx.getDb(),
-              ctx.getNotes(),
-              ctx.getUser(),
-              priorPatchSetId,
-              ctx.getAccountId(),
-              ctx.getRevWalk(),
-              ctx.getRepoView().getConfig())) {
-        if (a.isLegacySubmit()) {
-          continue;
-        }
-
-        LabelType lt = projectControl.getProjectState().getLabelTypes().byLabel(a.getLabelId());
-        if (lt != null) {
-          current.put(lt.getName(), a);
-        }
-      }
-    }
-    return current;
-  }
-
-  private void resetChange(ChangeContext ctx) {
-    Change change = ctx.getChange();
-    if (!change.currentPatchSetId().equals(priorPatchSetId)) {
-      return;
-    }
-
-    if (magicBranch != null && magicBranch.topic != null) {
-      change.setTopic(magicBranch.topic);
-    }
-    change.setStatus(Change.Status.NEW);
-    change.setCurrentPatchSet(info);
-
-    List<String> idList = commit.getFooterLines(CHANGE_ID);
-    if (idList.isEmpty()) {
-      change.setKey(new Change.Key("I" + commitId.name()));
-    } else {
-      change.setKey(new Change.Key(idList.get(idList.size() - 1).trim()));
-    }
-  }
-
-  private List<Comment> publishComments(ChangeContext ctx, boolean workInProgress)
-      throws OrmException {
-    List<Comment> comments =
-        commentsUtil.draftByChangeAuthor(ctx.getDb(), ctx.getNotes(), ctx.getUser().getAccountId());
-    commentsUtil.publish(
-        ctx, patchSetId, comments, ChangeMessagesUtil.uploadedPatchSetTag(workInProgress));
-    return comments;
-  }
-
-  @Override
-  public void postUpdate(Context ctx) throws Exception {
-    if (changeKind != ChangeKind.TRIVIAL_REBASE) {
-      // TODO(dborowitz): Merge email templates so we only have to send one.
-      Runnable e = new ReplaceEmailTask(ctx);
-      if (requestScopePropagator != null) {
-        @SuppressWarnings("unused")
-        Future<?> possiblyIgnoredError = sendEmailExecutor.submit(requestScopePropagator.wrap(e));
-      } else {
-        e.run();
-      }
-    }
-
-    NotifyHandling notify = magicBranch != null ? magicBranch.getNotify(notes) : NotifyHandling.ALL;
-
-    if (shouldPublishComments()) {
-      emailCommentsFactory
-          .create(
-              notify,
-              magicBranch != null ? magicBranch.getAccountsToNotify() : ImmutableListMultimap.of(),
-              notes,
-              newPatchSet,
-              ctx.getUser().asIdentifiedUser(),
-              msg,
-              comments,
-              msg.getMessage(),
-              ImmutableList.of()) // TODO(dborowitz): Include labels.
-          .sendAsync();
-    }
-
-    revisionCreated.fire(notes.getChange(), newPatchSet, ctx.getAccount(), ctx.getWhen(), notify);
-    try {
-      fireCommentAddedEvent(ctx);
-    } catch (Exception e) {
-      log.warn("comment-added event invocation failed", e);
-    }
-    if (mergedByPushOp != null) {
-      mergedByPushOp.postUpdate(ctx);
-    }
-  }
-
-  private class ReplaceEmailTask implements Runnable {
-    private final Context ctx;
-
-    private ReplaceEmailTask(Context ctx) {
-      this.ctx = ctx;
-    }
-
-    @Override
-    public void run() {
-      try {
-        ReplacePatchSetSender cm =
-            replacePatchSetFactory.create(
-                projectControl.getProject().getNameKey(), notes.getChangeId());
-        cm.setFrom(ctx.getAccount().getId());
-        cm.setPatchSet(newPatchSet, info);
-        cm.setChangeMessage(msg.getMessage(), ctx.getWhen());
-        if (magicBranch != null) {
-          cm.setNotify(magicBranch.getNotify(notes));
-          cm.setAccountsToNotify(magicBranch.getAccountsToNotify());
-        }
-        cm.addReviewers(recipients.getReviewers());
-        cm.addExtraCC(recipients.getCcOnly());
-        cm.send();
-      } catch (Exception e) {
-        log.error("Cannot send email for new patch set " + newPatchSet.getId(), e);
-      }
-    }
-
-    @Override
-    public String toString() {
-      return "send-email newpatchset";
-    }
-  }
-
-  private void fireCommentAddedEvent(Context ctx) throws IOException {
-    if (approvals.isEmpty()) {
-      return;
-    }
-
-    /* For labels that are not set in this operation, show the "current" value
-     * of 0, and no oldValue as the value was not modified by this operation.
-     * For labels that are set in this operation, the value was modified, so
-     * show a transition from an oldValue of 0 to the new value.
-     */
-    List<LabelType> labels =
-        projectCache
-            .checkedGet(ctx.getProject())
-            .getLabelTypes(notes, ctx.getUser())
-            .getLabelTypes();
-    Map<String, Short> allApprovals = new HashMap<>();
-    Map<String, Short> oldApprovals = new HashMap<>();
-    for (LabelType lt : labels) {
-      allApprovals.put(lt.getName(), (short) 0);
-      oldApprovals.put(lt.getName(), null);
-    }
-    for (Map.Entry<String, Short> entry : approvals.entrySet()) {
-      if (entry.getValue() != 0) {
-        allApprovals.put(entry.getKey(), entry.getValue());
-        oldApprovals.put(entry.getKey(), (short) 0);
-      }
-    }
-
-    commentAdded.fire(
-        notes.getChange(),
-        newPatchSet,
-        ctx.getAccount(),
-        null,
-        allApprovals,
-        oldApprovals,
-        ctx.getWhen());
-  }
-
-  public PatchSet getPatchSet() {
-    return newPatchSet;
-  }
-
-  public Change getChange() {
-    return notes.getChange();
-  }
-
-  public String getRejectMessage() {
-    return rejectMessage;
-  }
-
-  public ReceiveCommand getCommand() {
-    return cmd;
-  }
-
-  public ReplaceOp setRequestScopePropagator(RequestScopePropagator requestScopePropagator) {
-    this.requestScopePropagator = requestScopePropagator;
-    return this;
-  }
-
-  private static String findMergedInto(Context ctx, String first, RevCommit commit) {
-    try {
-      RevWalk rw = ctx.getRevWalk();
-      Optional<ObjectId> firstId = ctx.getRepoView().getRef(first);
-      if (firstId.isPresent() && rw.isMergedInto(commit, rw.parseCommit(firstId.get()))) {
-        return first;
-      }
-
-      for (Map.Entry<String, ObjectId> e : ctx.getRepoView().getRefs(R_HEADS).entrySet()) {
-        if (rw.isMergedInto(commit, rw.parseCommit(e.getValue()))) {
-          return R_HEADS + e.getKey();
-        }
-      }
-      return null;
-    } catch (IOException e) {
-      log.warn("Can't check for already submitted change", e);
-      return null;
-    }
-  }
-
-  private boolean shouldPublishComments() {
-    return magicBranch != null && magicBranch.shouldPublishComments();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/CherryPick.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/CherryPick.java
deleted file mode 100644
index 77aa950..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/CherryPick.java
+++ /dev/null
@@ -1,219 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.git.strategy;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.gerrit.server.git.strategy.CommitMergeStatus.SKIPPED_IDENTICAL_TREE;
-
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.extensions.restapi.MergeConflictException;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetInfo;
-import com.google.gerrit.server.ChangeUtil;
-import com.google.gerrit.server.git.CodeReviewCommit;
-import com.google.gerrit.server.git.IntegrationException;
-import com.google.gerrit.server.git.MergeIdenticalTreeException;
-import com.google.gerrit.server.git.MergeTip;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.RepoContext;
-import com.google.gwtorm.server.OrmException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.revwalk.RevCommit;
-
-public class CherryPick extends SubmitStrategy {
-
-  CherryPick(SubmitStrategy.Arguments args) {
-    super(args);
-  }
-
-  @Override
-  public List<SubmitStrategyOp> buildOps(Collection<CodeReviewCommit> toMerge)
-      throws IntegrationException {
-    List<CodeReviewCommit> sorted = CodeReviewCommit.ORDER.sortedCopy(toMerge);
-    List<SubmitStrategyOp> ops = new ArrayList<>(sorted.size());
-    boolean first = true;
-    while (!sorted.isEmpty()) {
-      CodeReviewCommit n = sorted.remove(0);
-      if (first && args.mergeTip.getInitialTip() == null) {
-        ops.add(new FastForwardOp(args, n));
-      } else if (n.getParentCount() == 0) {
-        ops.add(new CherryPickRootOp(n));
-      } else if (n.getParentCount() == 1) {
-        ops.add(new CherryPickOneOp(n));
-      } else {
-        ops.add(new CherryPickMultipleParentsOp(n));
-      }
-      first = false;
-    }
-    return ops;
-  }
-
-  private class CherryPickRootOp extends SubmitStrategyOp {
-    private CherryPickRootOp(CodeReviewCommit toMerge) {
-      super(CherryPick.this.args, toMerge);
-    }
-
-    @Override
-    public void updateRepoImpl(RepoContext ctx) {
-      // Refuse to merge a root commit into an existing branch, we cannot obtain
-      // a delta for the cherry-pick to apply.
-      toMerge.setStatusCode(CommitMergeStatus.CANNOT_CHERRY_PICK_ROOT);
-    }
-  }
-
-  private class CherryPickOneOp extends SubmitStrategyOp {
-    private PatchSet.Id psId;
-    private CodeReviewCommit newCommit;
-    private PatchSetInfo patchSetInfo;
-
-    private CherryPickOneOp(CodeReviewCommit toMerge) {
-      super(CherryPick.this.args, toMerge);
-    }
-
-    @Override
-    protected void updateRepoImpl(RepoContext ctx)
-        throws IntegrationException, IOException, OrmException {
-      // If there is only one parent, a cherry-pick can be done by taking the
-      // delta relative to that one parent and redoing that on the current merge
-      // tip.
-      args.rw.parseBody(toMerge);
-      psId =
-          ChangeUtil.nextPatchSetIdFromChangeRefsMap(
-              ctx.getRepoView().getRefs(getId().toRefPrefix()),
-              toMerge.change().currentPatchSetId());
-      RevCommit mergeTip = args.mergeTip.getCurrentTip();
-      args.rw.parseBody(mergeTip);
-      String cherryPickCmtMsg = args.mergeUtil.createCommitMessageOnSubmit(toMerge, mergeTip);
-
-      PersonIdent committer =
-          args.caller.newCommitterIdent(ctx.getWhen(), args.serverIdent.getTimeZone());
-      try {
-        newCommit =
-            args.mergeUtil.createCherryPickFromCommit(
-                ctx.getInserter(),
-                ctx.getRepoView().getConfig(),
-                args.mergeTip.getCurrentTip(),
-                toMerge,
-                committer,
-                cherryPickCmtMsg,
-                args.rw,
-                0,
-                false);
-      } catch (MergeConflictException mce) {
-        // Keep going in the case of a single merge failure; the goal is to
-        // cherry-pick as many commits as possible.
-        toMerge.setStatusCode(CommitMergeStatus.PATH_CONFLICT);
-        return;
-      } catch (MergeIdenticalTreeException mie) {
-        toMerge.setStatusCode(SKIPPED_IDENTICAL_TREE);
-        return;
-      }
-      // Initial copy doesn't have new patch set ID since change hasn't been
-      // updated yet.
-      newCommit = amendGitlink(newCommit);
-      newCommit.copyFrom(toMerge);
-      newCommit.setPatchsetId(psId);
-      newCommit.setStatusCode(CommitMergeStatus.CLEAN_PICK);
-      args.mergeTip.moveTipTo(newCommit, newCommit);
-      args.commitStatus.put(newCommit);
-
-      ctx.addRefUpdate(ObjectId.zeroId(), newCommit, psId.toRefName());
-      patchSetInfo = args.patchSetInfoFactory.get(ctx.getRevWalk(), newCommit, psId);
-    }
-
-    @Override
-    public PatchSet updateChangeImpl(ChangeContext ctx)
-        throws OrmException, NoSuchChangeException, IOException {
-      if (newCommit == null && toMerge.getStatusCode() == SKIPPED_IDENTICAL_TREE) {
-        return null;
-      }
-      checkNotNull(
-          newCommit,
-          "no new commit produced by CherryPick of %s, expected to fail fast",
-          toMerge.change().getId());
-      PatchSet prevPs = args.psUtil.current(ctx.getDb(), ctx.getNotes());
-      PatchSet newPs =
-          args.psUtil.insert(
-              ctx.getDb(),
-              ctx.getRevWalk(),
-              ctx.getUpdate(psId),
-              psId,
-              newCommit,
-              prevPs != null ? prevPs.getGroups() : ImmutableList.<String>of(),
-              null,
-              null);
-      ctx.getChange().setCurrentPatchSet(patchSetInfo);
-
-      // Don't copy approvals, as this is already taken care of by
-      // SubmitStrategyOp.
-
-      newCommit.setNotes(ctx.getNotes());
-      return newPs;
-    }
-  }
-
-  private class CherryPickMultipleParentsOp extends SubmitStrategyOp {
-    private CherryPickMultipleParentsOp(CodeReviewCommit toMerge) {
-      super(CherryPick.this.args, toMerge);
-    }
-
-    @Override
-    public void updateRepoImpl(RepoContext ctx) throws IntegrationException, IOException {
-      if (args.mergeUtil.hasMissingDependencies(args.mergeSorter, toMerge)) {
-        // One or more dependencies were not met. The status was already marked
-        // on the commit so we have nothing further to perform at this time.
-        return;
-      }
-      // There are multiple parents, so this is a merge commit. We don't want
-      // to cherry-pick the merge as clients can't easily rebase their history
-      // with that merge present and replaced by an equivalent merge with a
-      // different first parent. So instead behave as though MERGE_IF_NECESSARY
-      // was configured.
-      MergeTip mergeTip = args.mergeTip;
-      if (args.rw.isMergedInto(mergeTip.getCurrentTip(), toMerge)
-          && !args.submoduleOp.hasSubscription(args.destBranch)) {
-        mergeTip.moveTipTo(toMerge, toMerge);
-      } else {
-        PersonIdent myIdent = new PersonIdent(args.serverIdent, ctx.getWhen());
-        CodeReviewCommit result =
-            args.mergeUtil.mergeOneCommit(
-                myIdent,
-                myIdent,
-                args.rw,
-                ctx.getInserter(),
-                ctx.getRepoView().getConfig(),
-                args.destBranch,
-                mergeTip.getCurrentTip(),
-                toMerge);
-        result = amendGitlink(result);
-        mergeTip.moveTipTo(result, toMerge);
-        args.mergeUtil.markCleanMerges(
-            args.rw, args.canMergeFlag, mergeTip.getCurrentTip(), args.alreadyAccepted);
-      }
-    }
-  }
-
-  static boolean dryRun(
-      SubmitDryRun.Arguments args, CodeReviewCommit mergeTip, CodeReviewCommit toMerge)
-      throws IntegrationException {
-    return args.mergeUtil.canCherryPick(args.mergeSorter, args.repo, mergeTip, args.rw, toMerge);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/CommitMergeStatus.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/CommitMergeStatus.java
deleted file mode 100644
index e5c253d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/CommitMergeStatus.java
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.git.strategy;
-
-/**
- * Status codes set on {@link com.google.gerrit.server.git.CodeReviewCommit}s by {@link
- * SubmitStrategy} implementations.
- */
-public enum CommitMergeStatus {
-  CLEAN_MERGE("Change has been successfully merged"),
-
-  CLEAN_PICK("Change has been successfully cherry-picked"),
-
-  CLEAN_REBASE("Change has been successfully rebased and submitted"),
-
-  ALREADY_MERGED(""),
-
-  PATH_CONFLICT(
-      "Change could not be merged due to a path conflict.\n"
-          + "\n"
-          + "Please rebase the change locally and upload the rebased commit for review."),
-
-  REBASE_MERGE_CONFLICT(
-      "Change could not be merged due to a conflict.\n"
-          + "\n"
-          + "Please rebase the change locally and upload the rebased commit for review."),
-
-  SKIPPED_IDENTICAL_TREE(
-      "Marking change merged without cherry-picking to branch, as the resulting commit would be empty."),
-
-  MISSING_DEPENDENCY(""),
-
-  MANUAL_RECURSIVE_MERGE(
-      "The change requires a local merge to resolve.\n"
-          + "\n"
-          + "Please merge (or rebase) the change locally and upload the resolution for review."),
-
-  CANNOT_CHERRY_PICK_ROOT(
-      "Cannot cherry-pick an initial commit onto an existing branch.\n"
-          + "\n"
-          + "Please merge the change locally and upload the merge commit for review."),
-
-  CANNOT_REBASE_ROOT(
-      "Cannot rebase an initial commit onto an existing branch.\n"
-          + "\n"
-          + "Please merge the change locally and upload the merge commit for review."),
-
-  NOT_FAST_FORWARD(
-      "Project policy requires all submissions to be a fast-forward.\n"
-          + "\n"
-          + "Please rebase the change locally and upload again for review.");
-
-  private final String message;
-
-  CommitMergeStatus(String message) {
-    this.message = message;
-  }
-
-  public String getMessage() {
-    return message;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/FastForwardOnly.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/FastForwardOnly.java
deleted file mode 100644
index 38a193d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/FastForwardOnly.java
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.git.strategy;
-
-import com.google.gerrit.server.git.CodeReviewCommit;
-import com.google.gerrit.server.git.IntegrationException;
-import com.google.gerrit.server.update.RepoContext;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-public class FastForwardOnly extends SubmitStrategy {
-  FastForwardOnly(SubmitStrategy.Arguments args) {
-    super(args);
-  }
-
-  @Override
-  public List<SubmitStrategyOp> buildOps(Collection<CodeReviewCommit> toMerge)
-      throws IntegrationException {
-    List<CodeReviewCommit> sorted = args.mergeUtil.reduceToMinimalMerge(args.mergeSorter, toMerge);
-    List<SubmitStrategyOp> ops = new ArrayList<>(sorted.size());
-    CodeReviewCommit newTipCommit =
-        args.mergeUtil.getFirstFastForward(args.mergeTip.getInitialTip(), args.rw, sorted);
-    if (!newTipCommit.equals(args.mergeTip.getInitialTip())) {
-      ops.add(new FastForwardOp(args, newTipCommit));
-    }
-    while (!sorted.isEmpty()) {
-      ops.add(new NotFastForwardOp(sorted.remove(0)));
-    }
-    return ops;
-  }
-
-  private class NotFastForwardOp extends SubmitStrategyOp {
-    private NotFastForwardOp(CodeReviewCommit toMerge) {
-      super(FastForwardOnly.this.args, toMerge);
-    }
-
-    @Override
-    public void updateRepoImpl(RepoContext ctx) {
-      toMerge.setStatusCode(CommitMergeStatus.NOT_FAST_FORWARD);
-    }
-  }
-
-  static boolean dryRun(
-      SubmitDryRun.Arguments args, CodeReviewCommit mergeTip, CodeReviewCommit toMerge)
-      throws IntegrationException {
-    return args.mergeUtil.canFastForward(args.mergeSorter, mergeTip, args.rw, toMerge);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/FastForwardOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/FastForwardOp.java
deleted file mode 100644
index a3b10cb..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/FastForwardOp.java
+++ /dev/null
@@ -1,30 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.git.strategy;
-
-import com.google.gerrit.server.git.CodeReviewCommit;
-import com.google.gerrit.server.git.IntegrationException;
-import com.google.gerrit.server.update.RepoContext;
-
-class FastForwardOp extends SubmitStrategyOp {
-  FastForwardOp(SubmitStrategy.Arguments args, CodeReviewCommit toMerge) {
-    super(args, toMerge);
-  }
-
-  @Override
-  protected void updateRepoImpl(RepoContext ctx) throws IntegrationException {
-    args.mergeTip.moveTipTo(toMerge, toMerge);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/ImplicitIntegrateOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/ImplicitIntegrateOp.java
deleted file mode 100644
index f252015..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/ImplicitIntegrateOp.java
+++ /dev/null
@@ -1,29 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.git.strategy;
-
-import com.google.gerrit.server.git.CodeReviewCommit;
-
-/**
- * Operation for a change that is implicitly integrated by integrating another commit.
- *
- * <p>Updates the change status and message based on {@link CodeReviewCommit#getStatusCode()}, but
- * does not touch the repository.
- */
-class ImplicitIntegrateOp extends SubmitStrategyOp {
-  ImplicitIntegrateOp(SubmitStrategy.Arguments args, CodeReviewCommit toMerge) {
-    super(args, toMerge);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/MergeAlways.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/MergeAlways.java
deleted file mode 100644
index 1664be4..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/MergeAlways.java
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.git.strategy;
-
-import com.google.gerrit.server.git.CodeReviewCommit;
-import com.google.gerrit.server.git.IntegrationException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-public class MergeAlways extends SubmitStrategy {
-  MergeAlways(SubmitStrategy.Arguments args) {
-    super(args);
-  }
-
-  @Override
-  public List<SubmitStrategyOp> buildOps(Collection<CodeReviewCommit> toMerge)
-      throws IntegrationException {
-    List<CodeReviewCommit> sorted = args.mergeUtil.reduceToMinimalMerge(args.mergeSorter, toMerge);
-    List<SubmitStrategyOp> ops = new ArrayList<>(sorted.size());
-    if (args.mergeTip.getInitialTip() == null && !sorted.isEmpty()) {
-      // The branch is unborn. Take a fast-forward resolution to
-      // create the branch.
-      CodeReviewCommit first = sorted.remove(0);
-      ops.add(new FastForwardOp(args, first));
-    }
-    while (!sorted.isEmpty()) {
-      CodeReviewCommit n = sorted.remove(0);
-      ops.add(new MergeOneOp(args, n));
-    }
-    return ops;
-  }
-
-  static boolean dryRun(
-      SubmitDryRun.Arguments args, CodeReviewCommit mergeTip, CodeReviewCommit toMerge)
-      throws IntegrationException {
-    return args.mergeUtil.canMerge(args.mergeSorter, args.repo, mergeTip, toMerge);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/MergeIfNecessary.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/MergeIfNecessary.java
deleted file mode 100644
index d30aab2..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/MergeIfNecessary.java
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.git.strategy;
-
-import com.google.gerrit.server.git.CodeReviewCommit;
-import com.google.gerrit.server.git.IntegrationException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-public class MergeIfNecessary extends SubmitStrategy {
-  MergeIfNecessary(SubmitStrategy.Arguments args) {
-    super(args);
-  }
-
-  @Override
-  public List<SubmitStrategyOp> buildOps(Collection<CodeReviewCommit> toMerge)
-      throws IntegrationException {
-    List<CodeReviewCommit> sorted = args.mergeUtil.reduceToMinimalMerge(args.mergeSorter, toMerge);
-    List<SubmitStrategyOp> ops = new ArrayList<>(sorted.size());
-
-    if (args.mergeTip.getInitialTip() == null
-        || !args.submoduleOp.hasSubscription(args.destBranch)) {
-      CodeReviewCommit firstFastForward =
-          args.mergeUtil.getFirstFastForward(args.mergeTip.getInitialTip(), args.rw, sorted);
-      if (firstFastForward != null && !firstFastForward.equals(args.mergeTip.getInitialTip())) {
-        ops.add(new FastForwardOp(args, firstFastForward));
-      }
-    }
-
-    // For every other commit do a pair-wise merge.
-    while (!sorted.isEmpty()) {
-      CodeReviewCommit n = sorted.remove(0);
-      ops.add(new MergeOneOp(args, n));
-    }
-    return ops;
-  }
-
-  static boolean dryRun(
-      SubmitDryRun.Arguments args, CodeReviewCommit mergeTip, CodeReviewCommit toMerge)
-      throws IntegrationException {
-    return args.mergeUtil.canFastForward(args.mergeSorter, mergeTip, args.rw, toMerge)
-        || args.mergeUtil.canMerge(args.mergeSorter, args.repo, mergeTip, toMerge);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/MergeOneOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/MergeOneOp.java
deleted file mode 100644
index 3c3812d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/MergeOneOp.java
+++ /dev/null
@@ -1,52 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.git.strategy;
-
-import com.google.gerrit.server.git.CodeReviewCommit;
-import com.google.gerrit.server.git.IntegrationException;
-import com.google.gerrit.server.update.RepoContext;
-import java.io.IOException;
-import org.eclipse.jgit.lib.PersonIdent;
-
-class MergeOneOp extends SubmitStrategyOp {
-  MergeOneOp(SubmitStrategy.Arguments args, CodeReviewCommit toMerge) {
-    super(args, toMerge);
-  }
-
-  @Override
-  public void updateRepoImpl(RepoContext ctx) throws IntegrationException, IOException {
-    PersonIdent caller =
-        ctx.getIdentifiedUser()
-            .newCommitterIdent(args.serverIdent.getWhen(), args.serverIdent.getTimeZone());
-    if (args.mergeTip.getCurrentTip() == null) {
-      throw new IllegalStateException(
-          "cannot merge commit "
-              + toMerge.name()
-              + " onto a null tip; expected at least one fast-forward prior to"
-              + " this operation");
-    }
-    CodeReviewCommit merged =
-        args.mergeUtil.mergeOneCommit(
-            caller,
-            args.serverIdent,
-            args.rw,
-            ctx.getInserter(),
-            ctx.getRepoView().getConfig(),
-            args.destBranch,
-            args.mergeTip.getCurrentTip(),
-            toMerge);
-    args.mergeTip.moveTipTo(amendGitlink(merged), toMerge);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/RebaseAlways.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/RebaseAlways.java
deleted file mode 100644
index 26bb4c1..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/RebaseAlways.java
+++ /dev/null
@@ -1,22 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.git.strategy;
-
-public class RebaseAlways extends RebaseSubmitStrategy {
-
-  RebaseAlways(SubmitStrategy.Arguments args) {
-    super(args, true);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/RebaseIfNecessary.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/RebaseIfNecessary.java
deleted file mode 100644
index 104074a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/RebaseIfNecessary.java
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.git.strategy;
-
-public class RebaseIfNecessary extends RebaseSubmitStrategy {
-
-  RebaseIfNecessary(SubmitStrategy.Arguments args) {
-    super(args, false);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/RebaseSubmitStrategy.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/RebaseSubmitStrategy.java
deleted file mode 100644
index 5421254..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/RebaseSubmitStrategy.java
+++ /dev/null
@@ -1,303 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.git.strategy;
-
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.gerrit.server.git.strategy.CommitMergeStatus.SKIPPED_IDENTICAL_TREE;
-
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.extensions.restapi.MergeConflictException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.server.ChangeUtil;
-import com.google.gerrit.server.change.RebaseChangeOp;
-import com.google.gerrit.server.git.CodeReviewCommit;
-import com.google.gerrit.server.git.IntegrationException;
-import com.google.gerrit.server.git.MergeIdenticalTreeException;
-import com.google.gerrit.server.git.MergeTip;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.InvalidChangeOperationException;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.Context;
-import com.google.gerrit.server.update.RepoContext;
-import com.google.gwtorm.server.OrmException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-
-/** This strategy covers RebaseAlways and RebaseIfNecessary ones. */
-public class RebaseSubmitStrategy extends SubmitStrategy {
-  private final boolean rebaseAlways;
-
-  RebaseSubmitStrategy(SubmitStrategy.Arguments args, boolean rebaseAlways) {
-    super(args);
-    this.rebaseAlways = rebaseAlways;
-  }
-
-  @Override
-  public List<SubmitStrategyOp> buildOps(Collection<CodeReviewCommit> toMerge)
-      throws IntegrationException {
-    List<CodeReviewCommit> sorted;
-    try {
-      sorted = args.rebaseSorter.sort(toMerge);
-    } catch (IOException e) {
-      throw new IntegrationException("Commit sorting failed", e);
-    }
-    List<SubmitStrategyOp> ops = new ArrayList<>(sorted.size());
-    boolean first = true;
-
-    for (CodeReviewCommit c : sorted) {
-      if (c.getParentCount() > 1) {
-        // Since there is a merge commit, sort and prune again using
-        // MERGE_IF_NECESSARY semantics to avoid creating duplicate
-        // commits.
-        //
-        sorted = args.mergeUtil.reduceToMinimalMerge(args.mergeSorter, sorted);
-        break;
-      }
-    }
-
-    while (!sorted.isEmpty()) {
-      CodeReviewCommit n = sorted.remove(0);
-      if (first && args.mergeTip.getInitialTip() == null) {
-        // TODO(tandrii): Cherry-Pick strategy does this too, but it's wrong
-        // and can be fixed.
-        ops.add(new FastForwardOp(args, n));
-      } else if (n.getParentCount() == 0) {
-        ops.add(new RebaseRootOp(n));
-      } else if (n.getParentCount() == 1) {
-        ops.add(new RebaseOneOp(n));
-      } else {
-        ops.add(new RebaseMultipleParentsOp(n));
-      }
-      first = false;
-    }
-    return ops;
-  }
-
-  private class RebaseRootOp extends SubmitStrategyOp {
-    private RebaseRootOp(CodeReviewCommit toMerge) {
-      super(RebaseSubmitStrategy.this.args, toMerge);
-    }
-
-    @Override
-    public void updateRepoImpl(RepoContext ctx) {
-      // Refuse to merge a root commit into an existing branch, we cannot obtain
-      // a delta for the cherry-pick to apply.
-      toMerge.setStatusCode(CommitMergeStatus.CANNOT_REBASE_ROOT);
-    }
-  }
-
-  private class RebaseOneOp extends SubmitStrategyOp {
-    private RebaseChangeOp rebaseOp;
-    private CodeReviewCommit newCommit;
-    private PatchSet.Id newPatchSetId;
-
-    private RebaseOneOp(CodeReviewCommit toMerge) {
-      super(RebaseSubmitStrategy.this.args, toMerge);
-    }
-
-    @Override
-    public void updateRepoImpl(RepoContext ctx)
-        throws IntegrationException, InvalidChangeOperationException, RestApiException, IOException,
-            OrmException, PermissionBackendException {
-      if (args.mergeUtil.canFastForward(
-          args.mergeSorter, args.mergeTip.getCurrentTip(), args.rw, toMerge)) {
-        if (!rebaseAlways) {
-          args.mergeTip.moveTipTo(amendGitlink(toMerge), toMerge);
-          toMerge.setStatusCode(CommitMergeStatus.CLEAN_MERGE);
-          acceptMergeTip(args.mergeTip);
-          return;
-        }
-        // RebaseAlways means we modify commit message.
-        args.rw.parseBody(toMerge);
-        newPatchSetId =
-            ChangeUtil.nextPatchSetIdFromChangeRefsMap(
-                ctx.getRepoView().getRefs(getId().toRefPrefix()),
-                toMerge.change().currentPatchSetId());
-        RevCommit mergeTip = args.mergeTip.getCurrentTip();
-        args.rw.parseBody(mergeTip);
-        String cherryPickCmtMsg = args.mergeUtil.createCommitMessageOnSubmit(toMerge, mergeTip);
-        PersonIdent committer =
-            args.caller.newCommitterIdent(ctx.getWhen(), args.serverIdent.getTimeZone());
-        try {
-          newCommit =
-              args.mergeUtil.createCherryPickFromCommit(
-                  ctx.getInserter(),
-                  ctx.getRepoView().getConfig(),
-                  args.mergeTip.getCurrentTip(),
-                  toMerge,
-                  committer,
-                  cherryPickCmtMsg,
-                  args.rw,
-                  0,
-                  true);
-        } catch (MergeConflictException mce) {
-          // Unlike in Cherry-pick case, this should never happen.
-          toMerge.setStatusCode(CommitMergeStatus.REBASE_MERGE_CONFLICT);
-          throw new IllegalStateException("MergeConflictException on message edit must not happen");
-        } catch (MergeIdenticalTreeException mie) {
-          // this should not happen
-          toMerge.setStatusCode(SKIPPED_IDENTICAL_TREE);
-          return;
-        }
-        ctx.addRefUpdate(ObjectId.zeroId(), newCommit, newPatchSetId.toRefName());
-      } else {
-        // Stale read of patch set is ok; see comments in RebaseChangeOp.
-        PatchSet origPs = args.psUtil.get(ctx.getDb(), toMerge.getNotes(), toMerge.getPatchsetId());
-        rebaseOp =
-            args.rebaseFactory
-                .create(toMerge.notes(), origPs, args.mergeTip.getCurrentTip())
-                .setFireRevisionCreated(false)
-                // Bypass approval copier since SubmitStrategyOp copy all approvals
-                // later anyway.
-                .setCopyApprovals(false)
-                .setValidate(false)
-                .setCheckAddPatchSetPermission(false)
-                // RebaseAlways should set always modify commit message like
-                // Cherry-Pick strategy.
-                .setDetailedCommitMessage(rebaseAlways)
-                // Do not post message after inserting new patchset because there
-                // will be one about change being merged already.
-                .setPostMessage(false)
-                .setMatchAuthorToCommitterDate(args.project.isMatchAuthorToCommitterDate());
-        try {
-          rebaseOp.updateRepo(ctx);
-        } catch (MergeConflictException | NoSuchChangeException e) {
-          toMerge.setStatusCode(CommitMergeStatus.REBASE_MERGE_CONFLICT);
-          throw new IntegrationException(
-              "Cannot rebase " + toMerge.name() + ": " + e.getMessage(), e);
-        }
-        newCommit = args.rw.parseCommit(rebaseOp.getRebasedCommit());
-        newPatchSetId = rebaseOp.getPatchSetId();
-      }
-      newCommit = amendGitlink(newCommit);
-      newCommit.copyFrom(toMerge);
-      newCommit.setPatchsetId(newPatchSetId);
-      newCommit.setStatusCode(CommitMergeStatus.CLEAN_REBASE);
-      args.mergeTip.moveTipTo(newCommit, newCommit);
-      args.commitStatus.put(args.mergeTip.getCurrentTip());
-      acceptMergeTip(args.mergeTip);
-    }
-
-    @Override
-    public PatchSet updateChangeImpl(ChangeContext ctx)
-        throws NoSuchChangeException, ResourceConflictException, OrmException, IOException {
-      if (newCommit == null) {
-        checkState(!rebaseAlways, "RebaseAlways must never fast forward");
-        // otherwise, took the fast-forward option, nothing to do.
-        return null;
-      }
-
-      PatchSet newPs;
-      if (rebaseOp != null) {
-        rebaseOp.updateChange(ctx);
-        newPs = rebaseOp.getPatchSet();
-      } else {
-        // CherryPick
-        PatchSet prevPs = args.psUtil.current(ctx.getDb(), ctx.getNotes());
-        newPs =
-            args.psUtil.insert(
-                ctx.getDb(),
-                ctx.getRevWalk(),
-                ctx.getUpdate(newPatchSetId),
-                newPatchSetId,
-                newCommit,
-                prevPs != null ? prevPs.getGroups() : ImmutableList.<String>of(),
-                null,
-                null);
-      }
-      ctx.getChange()
-          .setCurrentPatchSet(
-              args.patchSetInfoFactory.get(ctx.getRevWalk(), newCommit, newPatchSetId));
-      newCommit.setNotes(ctx.getNotes());
-      return newPs;
-    }
-
-    @Override
-    public void postUpdateImpl(Context ctx) throws OrmException {
-      if (rebaseOp != null) {
-        rebaseOp.postUpdate(ctx);
-      }
-    }
-  }
-
-  private class RebaseMultipleParentsOp extends SubmitStrategyOp {
-    private RebaseMultipleParentsOp(CodeReviewCommit toMerge) {
-      super(RebaseSubmitStrategy.this.args, toMerge);
-    }
-
-    @Override
-    public void updateRepoImpl(RepoContext ctx) throws IntegrationException, IOException {
-      // There are multiple parents, so this is a merge commit. We don't want
-      // to rebase the merge as clients can't easily rebase their history with
-      // that merge present and replaced by an equivalent merge with a different
-      // first parent. So instead behave as though MERGE_IF_NECESSARY was
-      // configured.
-      // TODO(tandrii): this is not in spirit of RebaseAlways strategy because
-      // the commit messages can not be modified in the process. It's also
-      // possible to implement rebasing of merge commits. E.g., the Cherry Pick
-      // REST endpoint already supports cherry-picking of merge commits.
-      // For now, users of RebaseAlways strategy for whom changed commit footers
-      // are important would be well advised to prohibit uploading patches with
-      // merge commits.
-      MergeTip mergeTip = args.mergeTip;
-      if (args.rw.isMergedInto(mergeTip.getCurrentTip(), toMerge)
-          && !args.submoduleOp.hasSubscription(args.destBranch)) {
-        mergeTip.moveTipTo(toMerge, toMerge);
-      } else {
-        PersonIdent caller =
-            ctx.getIdentifiedUser().newCommitterIdent(ctx.getWhen(), ctx.getTimeZone());
-        CodeReviewCommit newTip =
-            args.mergeUtil.mergeOneCommit(
-                caller,
-                caller,
-                args.rw,
-                ctx.getInserter(),
-                ctx.getRepoView().getConfig(),
-                args.destBranch,
-                mergeTip.getCurrentTip(),
-                toMerge);
-        mergeTip.moveTipTo(amendGitlink(newTip), toMerge);
-      }
-      args.mergeUtil.markCleanMerges(
-          args.rw, args.canMergeFlag, mergeTip.getCurrentTip(), args.alreadyAccepted);
-      acceptMergeTip(mergeTip);
-    }
-  }
-
-  private void acceptMergeTip(MergeTip mergeTip) {
-    args.alreadyAccepted.add(mergeTip.getCurrentTip());
-  }
-
-  static boolean dryRun(
-      SubmitDryRun.Arguments args,
-      Repository repo,
-      CodeReviewCommit mergeTip,
-      CodeReviewCommit toMerge)
-      throws IntegrationException {
-    // Test for merge instead of cherry pick to avoid false negatives
-    // on commit chains.
-    return !args.mergeUtil.hasMissingDependencies(args.mergeSorter, toMerge)
-        && args.mergeUtil.canMerge(args.mergeSorter, repo, mergeTip, toMerge);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitDryRun.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitDryRun.java
deleted file mode 100644
index 3a954fb..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitDryRun.java
+++ /dev/null
@@ -1,150 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.git.strategy;
-
-import static java.util.stream.Collectors.toSet;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Streams;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.server.git.CodeReviewCommit;
-import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
-import com.google.gerrit.server.git.IntegrationException;
-import com.google.gerrit.server.git.MergeSorter;
-import com.google.gerrit.server.git.MergeUtil;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevFlag;
-import org.eclipse.jgit.revwalk.RevObject;
-import org.eclipse.jgit.revwalk.RevTag;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Dry run of a submit strategy. */
-public class SubmitDryRun {
-  private static final Logger log = LoggerFactory.getLogger(SubmitDryRun.class);
-
-  static class Arguments {
-    final Repository repo;
-    final CodeReviewRevWalk rw;
-    final MergeUtil mergeUtil;
-    final MergeSorter mergeSorter;
-
-    Arguments(Repository repo, CodeReviewRevWalk rw, MergeUtil mergeUtil, MergeSorter mergeSorter) {
-      this.repo = repo;
-      this.rw = rw;
-      this.mergeUtil = mergeUtil;
-      this.mergeSorter = mergeSorter;
-    }
-  }
-
-  public static Set<ObjectId> getAlreadyAccepted(Repository repo) throws IOException {
-    return Streams.concat(
-            repo.getRefDatabase().getRefs(Constants.R_HEADS).values().stream(),
-            repo.getRefDatabase().getRefs(Constants.R_TAGS).values().stream())
-        .map(Ref::getObjectId)
-        .filter(o -> o != null)
-        .collect(toSet());
-  }
-
-  public static Set<RevCommit> getAlreadyAccepted(Repository repo, RevWalk rw) throws IOException {
-    Set<RevCommit> accepted = new HashSet<>();
-    addCommits(getAlreadyAccepted(repo), rw, accepted);
-    return accepted;
-  }
-
-  public static void addCommits(Iterable<ObjectId> ids, RevWalk rw, Collection<RevCommit> out)
-      throws IOException {
-    for (ObjectId id : ids) {
-      RevObject obj = rw.parseAny(id);
-      if (obj instanceof RevTag) {
-        obj = rw.peel(obj);
-      }
-      if (obj instanceof RevCommit) {
-        out.add((RevCommit) obj);
-      }
-    }
-  }
-
-  private final ProjectCache projectCache;
-  private final MergeUtil.Factory mergeUtilFactory;
-
-  @Inject
-  SubmitDryRun(ProjectCache projectCache, MergeUtil.Factory mergeUtilFactory) {
-    this.projectCache = projectCache;
-    this.mergeUtilFactory = mergeUtilFactory;
-  }
-
-  public boolean run(
-      SubmitType submitType,
-      Repository repo,
-      CodeReviewRevWalk rw,
-      Branch.NameKey destBranch,
-      ObjectId tip,
-      ObjectId toMerge,
-      Set<RevCommit> alreadyAccepted)
-      throws IntegrationException, NoSuchProjectException, IOException {
-    CodeReviewCommit tipCommit = rw.parseCommit(tip);
-    CodeReviewCommit toMergeCommit = rw.parseCommit(toMerge);
-    RevFlag canMerge = rw.newFlag("CAN_MERGE");
-    toMergeCommit.add(canMerge);
-    Arguments args =
-        new Arguments(
-            repo,
-            rw,
-            mergeUtilFactory.create(getProject(destBranch)),
-            new MergeSorter(rw, alreadyAccepted, canMerge, ImmutableSet.of(toMergeCommit)));
-
-    switch (submitType) {
-      case CHERRY_PICK:
-        return CherryPick.dryRun(args, tipCommit, toMergeCommit);
-      case FAST_FORWARD_ONLY:
-        return FastForwardOnly.dryRun(args, tipCommit, toMergeCommit);
-      case MERGE_ALWAYS:
-        return MergeAlways.dryRun(args, tipCommit, toMergeCommit);
-      case MERGE_IF_NECESSARY:
-        return MergeIfNecessary.dryRun(args, tipCommit, toMergeCommit);
-      case REBASE_IF_NECESSARY:
-        return RebaseIfNecessary.dryRun(args, repo, tipCommit, toMergeCommit);
-      case REBASE_ALWAYS:
-        return RebaseAlways.dryRun(args, repo, tipCommit, toMergeCommit);
-      default:
-        String errorMsg = "No submit strategy for: " + submitType;
-        log.error(errorMsg);
-        throw new IntegrationException(errorMsg);
-    }
-  }
-
-  private ProjectState getProject(Branch.NameKey branch) throws NoSuchProjectException {
-    ProjectState p = projectCache.get(branch.getParentKey());
-    if (p == null) {
-      throw new NoSuchProjectException(branch.getParentKey());
-    }
-    return p;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategy.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategy.java
deleted file mode 100644
index 79c0cdb..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategy.java
+++ /dev/null
@@ -1,272 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.git.strategy;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.Sets;
-import com.google.gerrit.extensions.api.changes.RecipientType;
-import com.google.gerrit.extensions.api.changes.SubmitInput;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.extensions.config.FactoryModule;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.change.RebaseChangeOp;
-import com.google.gerrit.server.change.Submit.TestSubmitInput;
-import com.google.gerrit.server.extensions.events.ChangeMerged;
-import com.google.gerrit.server.git.CodeReviewCommit;
-import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
-import com.google.gerrit.server.git.EmailMerge;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.IntegrationException;
-import com.google.gerrit.server.git.LabelNormalizer;
-import com.google.gerrit.server.git.MergeOp.CommitStatus;
-import com.google.gerrit.server.git.MergeSorter;
-import com.google.gerrit.server.git.MergeTip;
-import com.google.gerrit.server.git.MergeUtil;
-import com.google.gerrit.server.git.RebaseSorter;
-import com.google.gerrit.server.git.SubmoduleOp;
-import com.google.gerrit.server.git.TagCache;
-import com.google.gerrit.server.git.validators.OnSubmitValidators;
-import com.google.gerrit.server.patch.PatchSetInfoFactory;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.query.change.InternalChangeQuery;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.util.RequestId;
-import com.google.inject.Inject;
-import com.google.inject.Module;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevFlag;
-
-/**
- * Base class that submit strategies must extend.
- *
- * <p>A submit strategy for a certain {@link SubmitType} defines how the submitted commits should be
- * merged.
- */
-public abstract class SubmitStrategy {
-  public static Module module() {
-    return new FactoryModule() {
-      @Override
-      protected void configure() {
-        factory(SubmitStrategy.Arguments.Factory.class);
-      }
-    };
-  }
-
-  static class Arguments {
-    interface Factory {
-      Arguments create(
-          SubmitType submitType,
-          Branch.NameKey destBranch,
-          CommitStatus commitStatus,
-          CodeReviewRevWalk rw,
-          IdentifiedUser caller,
-          MergeTip mergeTip,
-          RevFlag canMergeFlag,
-          ReviewDb db,
-          Set<RevCommit> alreadyAccepted,
-          Set<CodeReviewCommit> incoming,
-          RequestId submissionId,
-          SubmitInput submitInput,
-          ListMultimap<RecipientType, Account.Id> accountsToNotify,
-          SubmoduleOp submoduleOp,
-          boolean dryrun);
-    }
-
-    final AccountCache accountCache;
-    final ApprovalsUtil approvalsUtil;
-    final ChangeMerged changeMerged;
-    final ChangeMessagesUtil cmUtil;
-    final EmailMerge.Factory mergedSenderFactory;
-    final GitRepositoryManager repoManager;
-    final LabelNormalizer labelNormalizer;
-    final PatchSetInfoFactory patchSetInfoFactory;
-    final PatchSetUtil psUtil;
-    final ProjectCache projectCache;
-    final PersonIdent serverIdent;
-    final RebaseChangeOp.Factory rebaseFactory;
-    final OnSubmitValidators.Factory onSubmitValidatorsFactory;
-    final TagCache tagCache;
-    final Provider<InternalChangeQuery> queryProvider;
-
-    final Branch.NameKey destBranch;
-    final CodeReviewRevWalk rw;
-    final CommitStatus commitStatus;
-    final IdentifiedUser caller;
-    final MergeTip mergeTip;
-    final RevFlag canMergeFlag;
-    final ReviewDb db;
-    final Set<RevCommit> alreadyAccepted;
-    final RequestId submissionId;
-    final SubmitType submitType;
-    final SubmitInput submitInput;
-    final ListMultimap<RecipientType, Account.Id> accountsToNotify;
-    final SubmoduleOp submoduleOp;
-
-    final ProjectState project;
-    final MergeSorter mergeSorter;
-    final RebaseSorter rebaseSorter;
-    final MergeUtil mergeUtil;
-    final boolean dryrun;
-
-    @Inject
-    Arguments(
-        AccountCache accountCache,
-        ApprovalsUtil approvalsUtil,
-        ChangeMerged changeMerged,
-        ChangeMessagesUtil cmUtil,
-        EmailMerge.Factory mergedSenderFactory,
-        GitRepositoryManager repoManager,
-        LabelNormalizer labelNormalizer,
-        MergeUtil.Factory mergeUtilFactory,
-        PatchSetInfoFactory patchSetInfoFactory,
-        PatchSetUtil psUtil,
-        @GerritPersonIdent PersonIdent serverIdent,
-        ProjectCache projectCache,
-        RebaseChangeOp.Factory rebaseFactory,
-        OnSubmitValidators.Factory onSubmitValidatorsFactory,
-        TagCache tagCache,
-        Provider<InternalChangeQuery> queryProvider,
-        @Assisted Branch.NameKey destBranch,
-        @Assisted CommitStatus commitStatus,
-        @Assisted CodeReviewRevWalk rw,
-        @Assisted IdentifiedUser caller,
-        @Assisted MergeTip mergeTip,
-        @Assisted RevFlag canMergeFlag,
-        @Assisted ReviewDb db,
-        @Assisted Set<RevCommit> alreadyAccepted,
-        @Assisted Set<CodeReviewCommit> incoming,
-        @Assisted RequestId submissionId,
-        @Assisted SubmitType submitType,
-        @Assisted SubmitInput submitInput,
-        @Assisted ListMultimap<RecipientType, Account.Id> accountsToNotify,
-        @Assisted SubmoduleOp submoduleOp,
-        @Assisted boolean dryrun) {
-      this.accountCache = accountCache;
-      this.approvalsUtil = approvalsUtil;
-      this.changeMerged = changeMerged;
-      this.mergedSenderFactory = mergedSenderFactory;
-      this.repoManager = repoManager;
-      this.cmUtil = cmUtil;
-      this.labelNormalizer = labelNormalizer;
-      this.patchSetInfoFactory = patchSetInfoFactory;
-      this.psUtil = psUtil;
-      this.projectCache = projectCache;
-      this.rebaseFactory = rebaseFactory;
-      this.tagCache = tagCache;
-      this.queryProvider = queryProvider;
-
-      this.serverIdent = serverIdent;
-      this.destBranch = destBranch;
-      this.commitStatus = commitStatus;
-      this.rw = rw;
-      this.caller = caller;
-      this.mergeTip = mergeTip;
-      this.canMergeFlag = canMergeFlag;
-      this.db = db;
-      this.alreadyAccepted = alreadyAccepted;
-      this.submissionId = submissionId;
-      this.submitType = submitType;
-      this.submitInput = submitInput;
-      this.accountsToNotify = accountsToNotify;
-      this.submoduleOp = submoduleOp;
-      this.dryrun = dryrun;
-
-      this.project =
-          checkNotNull(
-              projectCache.get(destBranch.getParentKey()),
-              "project not found: %s",
-              destBranch.getParentKey());
-      this.mergeSorter = new MergeSorter(rw, alreadyAccepted, canMergeFlag, incoming);
-      this.rebaseSorter =
-          new RebaseSorter(
-              rw, mergeTip.getInitialTip(), alreadyAccepted, canMergeFlag, queryProvider, incoming);
-      this.mergeUtil = mergeUtilFactory.create(project);
-      this.onSubmitValidatorsFactory = onSubmitValidatorsFactory;
-    }
-  }
-
-  final Arguments args;
-
-  SubmitStrategy(Arguments args) {
-    this.args = checkNotNull(args);
-  }
-
-  /**
-   * Add operations to a batch update that execute this submit strategy.
-   *
-   * <p>Guarantees exactly one op is added to the update for each change in the input set.
-   *
-   * @param bu batch update to add operations to.
-   * @param toMerge the set of submitted commits that should be merged using this submit strategy.
-   *     Implementations are responsible for ordering of commits, and will not modify the input in
-   *     place.
-   * @throws IntegrationException if an error occurred initializing the operations (as opposed to an
-   *     error during execution, which will be reported only when the batch update executes the
-   *     operations).
-   */
-  public final void addOps(BatchUpdate bu, Set<CodeReviewCommit> toMerge)
-      throws IntegrationException {
-    List<SubmitStrategyOp> ops = buildOps(toMerge);
-    Set<CodeReviewCommit> added = Sets.newHashSetWithExpectedSize(ops.size());
-
-    for (SubmitStrategyOp op : ops) {
-      added.add(op.getCommit());
-    }
-
-    // First add ops for any implicitly merged changes.
-    List<CodeReviewCommit> difference = new ArrayList<>(Sets.difference(toMerge, added));
-    Collections.reverse(difference);
-    for (CodeReviewCommit c : difference) {
-      Change.Id id = c.change().getId();
-      bu.addOp(id, new ImplicitIntegrateOp(args, c));
-      maybeAddTestHelperOp(bu, id);
-    }
-
-    // Then ops for explicitly merged changes
-    for (SubmitStrategyOp op : ops) {
-      bu.addOp(op.getId(), op);
-      maybeAddTestHelperOp(bu, op.getId());
-    }
-  }
-
-  private void maybeAddTestHelperOp(BatchUpdate bu, Change.Id changeId) {
-    if (args.submitInput instanceof TestSubmitInput) {
-      bu.addOp(changeId, new TestHelperOp(changeId, args));
-    }
-  }
-
-  protected abstract List<SubmitStrategyOp> buildOps(Collection<CodeReviewCommit> toMerge)
-      throws IntegrationException;
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategyFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategyFactory.java
deleted file mode 100644
index 7678623..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategyFactory.java
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.git.strategy;
-
-import com.google.common.collect.ListMultimap;
-import com.google.gerrit.extensions.api.changes.RecipientType;
-import com.google.gerrit.extensions.api.changes.SubmitInput;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.git.CodeReviewCommit;
-import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
-import com.google.gerrit.server.git.IntegrationException;
-import com.google.gerrit.server.git.MergeOp.CommitStatus;
-import com.google.gerrit.server.git.MergeTip;
-import com.google.gerrit.server.git.SubmoduleOp;
-import com.google.gerrit.server.util.RequestId;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.Set;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevFlag;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Factory to create a {@link SubmitStrategy} for a {@link SubmitType}. */
-@Singleton
-public class SubmitStrategyFactory {
-  private static final Logger log = LoggerFactory.getLogger(SubmitStrategyFactory.class);
-
-  private final SubmitStrategy.Arguments.Factory argsFactory;
-
-  @Inject
-  SubmitStrategyFactory(SubmitStrategy.Arguments.Factory argsFactory) {
-    this.argsFactory = argsFactory;
-  }
-
-  public SubmitStrategy create(
-      SubmitType submitType,
-      ReviewDb db,
-      CodeReviewRevWalk rw,
-      RevFlag canMergeFlag,
-      Set<RevCommit> alreadyAccepted,
-      Set<CodeReviewCommit> incoming,
-      Branch.NameKey destBranch,
-      IdentifiedUser caller,
-      MergeTip mergeTip,
-      CommitStatus commitStatus,
-      RequestId submissionId,
-      SubmitInput submitInput,
-      ListMultimap<RecipientType, Account.Id> accountsToNotify,
-      SubmoduleOp submoduleOp,
-      boolean dryrun)
-      throws IntegrationException {
-    SubmitStrategy.Arguments args =
-        argsFactory.create(
-            submitType,
-            destBranch,
-            commitStatus,
-            rw,
-            caller,
-            mergeTip,
-            canMergeFlag,
-            db,
-            alreadyAccepted,
-            incoming,
-            submissionId,
-            submitInput,
-            accountsToNotify,
-            submoduleOp,
-            dryrun);
-    switch (submitType) {
-      case CHERRY_PICK:
-        return new CherryPick(args);
-      case FAST_FORWARD_ONLY:
-        return new FastForwardOnly(args);
-      case MERGE_ALWAYS:
-        return new MergeAlways(args);
-      case MERGE_IF_NECESSARY:
-        return new MergeIfNecessary(args);
-      case REBASE_IF_NECESSARY:
-        return new RebaseIfNecessary(args);
-      case REBASE_ALWAYS:
-        return new RebaseAlways(args);
-      default:
-        String errorMsg = "No submit strategy for: " + submitType;
-        log.error(errorMsg);
-        throw new IntegrationException(errorMsg);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategyListener.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategyListener.java
deleted file mode 100644
index 97291e5..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategyListener.java
+++ /dev/null
@@ -1,153 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.git.strategy;
-
-import com.google.common.base.CharMatcher;
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.extensions.api.changes.SubmitInput;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.server.change.Submit.TestSubmitInput;
-import com.google.gerrit.server.git.CodeReviewCommit;
-import com.google.gerrit.server.git.IntegrationException;
-import com.google.gerrit.server.git.MergeOp.CommitStatus;
-import com.google.gerrit.server.update.BatchUpdateListener;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-import org.eclipse.jgit.revwalk.RevCommit;
-
-public class SubmitStrategyListener implements BatchUpdateListener {
-  private final Collection<SubmitStrategy> strategies;
-  private final CommitStatus commitStatus;
-  private final boolean failAfterRefUpdates;
-
-  public SubmitStrategyListener(
-      SubmitInput input, Collection<SubmitStrategy> strategies, CommitStatus commitStatus) {
-    this.strategies = strategies;
-    this.commitStatus = commitStatus;
-    if (input instanceof TestSubmitInput) {
-      failAfterRefUpdates = ((TestSubmitInput) input).failAfterRefUpdates;
-    } else {
-      failAfterRefUpdates = false;
-    }
-  }
-
-  @Override
-  public void afterUpdateRepos() throws ResourceConflictException {
-    try {
-      markCleanMerges();
-      List<Change.Id> alreadyMerged = checkCommitStatus();
-      findUnmergedChanges(alreadyMerged);
-    } catch (IntegrationException e) {
-      throw new ResourceConflictException(e.getMessage(), e);
-    }
-  }
-
-  @Override
-  public void afterUpdateRefs() throws ResourceConflictException {
-    if (failAfterRefUpdates) {
-      throw new ResourceConflictException("Failing after ref updates");
-    }
-  }
-
-  private void findUnmergedChanges(List<Change.Id> alreadyMerged)
-      throws ResourceConflictException, IntegrationException {
-    for (SubmitStrategy strategy : strategies) {
-      if (strategy instanceof CherryPick) {
-        // Can't do this sanity check for CherryPick since:
-        // * CherryPick might have picked a subset of changes
-        // * CherryPick might have status SKIPPED_IDENTICAL_TREE
-        continue;
-      }
-      SubmitStrategy.Arguments args = strategy.args;
-      Set<Change.Id> unmerged =
-          args.mergeUtil.findUnmergedChanges(
-              args.commitStatus.getChangeIds(args.destBranch),
-              args.rw,
-              args.canMergeFlag,
-              args.mergeTip.getInitialTip(),
-              args.mergeTip.getCurrentTip(),
-              alreadyMerged);
-      for (Change.Id id : unmerged) {
-        commitStatus.problem(id, "internal error: change not reachable from new branch tip");
-      }
-    }
-    commitStatus.maybeFailVerbose();
-  }
-
-  private void markCleanMerges() throws IntegrationException {
-    for (SubmitStrategy strategy : strategies) {
-      SubmitStrategy.Arguments args = strategy.args;
-      RevCommit initialTip = args.mergeTip.getInitialTip();
-      args.mergeUtil.markCleanMerges(
-          args.rw,
-          args.canMergeFlag,
-          args.mergeTip.getCurrentTip(),
-          initialTip == null ? ImmutableSet.<RevCommit>of() : ImmutableSet.of(initialTip));
-    }
-  }
-
-  private List<Change.Id> checkCommitStatus() throws ResourceConflictException {
-    List<Change.Id> alreadyMerged = new ArrayList<>(commitStatus.getChangeIds().size());
-    for (Change.Id id : commitStatus.getChangeIds()) {
-      CodeReviewCommit commit = commitStatus.get(id);
-      CommitMergeStatus s = commit != null ? commit.getStatusCode() : null;
-      if (s == null) {
-        commitStatus.problem(id, "internal error: change not processed by merge strategy");
-        continue;
-      }
-      switch (s) {
-        case CLEAN_MERGE:
-        case CLEAN_REBASE:
-        case CLEAN_PICK:
-        case SKIPPED_IDENTICAL_TREE:
-          break; // Merge strategy accepted this change.
-
-        case ALREADY_MERGED:
-          // Already an ancestor of tip.
-          alreadyMerged.add(commit.getPatchsetId().getParentKey());
-          break;
-
-        case PATH_CONFLICT:
-        case REBASE_MERGE_CONFLICT:
-        case MANUAL_RECURSIVE_MERGE:
-        case CANNOT_CHERRY_PICK_ROOT:
-        case CANNOT_REBASE_ROOT:
-        case NOT_FAST_FORWARD:
-          // TODO(dborowitz): Reformat these messages to be more appropriate for
-          // short problem descriptions.
-          commitStatus.problem(id, CharMatcher.is('\n').collapseFrom(s.getMessage(), ' '));
-          break;
-
-        case MISSING_DEPENDENCY:
-          commitStatus.problem(id, "depends on change that was not submitted");
-          break;
-
-        default:
-          commitStatus.problem(id, "unspecified merge failure: " + s);
-          break;
-      }
-    }
-    commitStatus.maybeFailVerbose();
-    return alreadyMerged;
-  }
-
-  @Override
-  public void afterUpdateChanges() throws ResourceConflictException {
-    commitStatus.maybeFail("Error updating status");
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategyOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategyOp.java
deleted file mode 100644
index 9a362d4..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategyOp.java
+++ /dev/null
@@ -1,626 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.git.strategy;
-
-import static com.google.common.base.MoreObjects.firstNonNull;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.gerrit.server.notedb.ReviewerStateInternal.REVIEWER;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.common.data.SubmitRecord;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.LabelId;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.reviewdb.server.ReviewDbUtil;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.git.CodeReviewCommit;
-import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
-import com.google.gerrit.server.git.GroupCollector;
-import com.google.gerrit.server.git.IntegrationException;
-import com.google.gerrit.server.git.LabelNormalizer;
-import com.google.gerrit.server.git.MergeUtil;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.git.SubmoduleException;
-import com.google.gerrit.server.notedb.ChangeUpdate;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.Context;
-import com.google.gerrit.server.update.RepoContext;
-import com.google.gwtorm.server.OrmException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import org.eclipse.jgit.errors.IncorrectObjectTypeException;
-import org.eclipse.jgit.errors.MissingObjectException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.transport.ReceiveCommand;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-abstract class SubmitStrategyOp implements BatchUpdateOp {
-  private static final Logger log = LoggerFactory.getLogger(SubmitStrategyOp.class);
-
-  protected final SubmitStrategy.Arguments args;
-  protected final CodeReviewCommit toMerge;
-
-  private ReceiveCommand command;
-  private PatchSetApproval submitter;
-  private ObjectId mergeResultRev;
-  private PatchSet mergedPatchSet;
-  private Change updatedChange;
-  private CodeReviewCommit alreadyMergedCommit;
-  private boolean changeAlreadyMerged;
-
-  protected SubmitStrategyOp(SubmitStrategy.Arguments args, CodeReviewCommit toMerge) {
-    this.args = args;
-    this.toMerge = toMerge;
-  }
-
-  final Change.Id getId() {
-    return toMerge.change().getId();
-  }
-
-  final CodeReviewCommit getCommit() {
-    return toMerge;
-  }
-
-  protected final Branch.NameKey getDest() {
-    return toMerge.change().getDest();
-  }
-
-  protected final Project.NameKey getProject() {
-    return getDest().getParentKey();
-  }
-
-  @Override
-  public final void updateRepo(RepoContext ctx) throws Exception {
-    logDebug("{}#updateRepo for change {}", getClass().getSimpleName(), toMerge.change().getId());
-    checkState(
-        ctx.getRevWalk() == args.rw,
-        "SubmitStrategyOp requires callers to call BatchUpdate#setRepository with exactly the same"
-            + " CodeReviewRevWalk instance from the SubmitStrategy.Arguments: %s != %s",
-        ctx.getRevWalk(),
-        args.rw);
-    // Run the submit strategy implementation and record the merge tip state so
-    // we can create the ref update.
-    CodeReviewCommit tipBefore = args.mergeTip.getCurrentTip();
-    alreadyMergedCommit = getAlreadyMergedCommit(ctx);
-    if (alreadyMergedCommit == null) {
-      updateRepoImpl(ctx);
-    } else {
-      logDebug("Already merged as {}", alreadyMergedCommit.name());
-    }
-    CodeReviewCommit tipAfter = args.mergeTip.getCurrentTip();
-
-    if (Objects.equals(tipBefore, tipAfter)) {
-      logDebug("Did not move tip", getClass().getSimpleName());
-      return;
-    } else if (tipAfter == null) {
-      logDebug("No merge tip, no update to perform");
-      return;
-    }
-    logDebug("Moved tip from {} to {}", tipBefore, tipAfter);
-
-    checkProjectConfig(ctx, tipAfter);
-
-    // Needed by postUpdate, at which point mergeTip will have advanced further,
-    // so it's easier to just snapshot the command.
-    command =
-        new ReceiveCommand(firstNonNull(tipBefore, ObjectId.zeroId()), tipAfter, getDest().get());
-    ctx.addRefUpdate(command);
-    args.submoduleOp.addBranchTip(getDest(), tipAfter);
-  }
-
-  private void checkProjectConfig(RepoContext ctx, CodeReviewCommit commit)
-      throws IntegrationException {
-    String refName = getDest().get();
-    if (RefNames.REFS_CONFIG.equals(refName)) {
-      logDebug("Loading new configuration from {}", RefNames.REFS_CONFIG);
-      try {
-        ProjectConfig cfg = new ProjectConfig(getProject());
-        cfg.load(ctx.getRevWalk(), commit);
-      } catch (Exception e) {
-        throw new IntegrationException(
-            "Submit would store invalid"
-                + " project configuration "
-                + commit.name()
-                + " for "
-                + getProject(),
-            e);
-      }
-    }
-  }
-
-  private CodeReviewCommit getAlreadyMergedCommit(RepoContext ctx) throws IOException {
-    CodeReviewCommit tip = args.mergeTip.getInitialTip();
-    if (tip == null) {
-      return null;
-    }
-    CodeReviewRevWalk rw = (CodeReviewRevWalk) ctx.getRevWalk();
-    Change.Id id = getId();
-    String refPrefix = id.toRefPrefix();
-
-    Map<String, ObjectId> refs = ctx.getRepoView().getRefs(refPrefix);
-    List<CodeReviewCommit> commits = new ArrayList<>(refs.size());
-    for (Map.Entry<String, ObjectId> e : refs.entrySet()) {
-      PatchSet.Id psId = PatchSet.Id.fromRef(refPrefix + e.getKey());
-      if (psId == null) {
-        continue;
-      }
-      try {
-        CodeReviewCommit c = rw.parseCommit(e.getValue());
-        c.setPatchsetId(psId);
-        commits.add(c);
-      } catch (MissingObjectException | IncorrectObjectTypeException ex) {
-        continue; // Bogus ref, can't be merged into tip so we don't care.
-      }
-    }
-    Collections.sort(
-        commits, ReviewDbUtil.intKeyOrdering().reverse().onResultOf(c -> c.getPatchsetId()));
-    CodeReviewCommit result = MergeUtil.findAnyMergedInto(rw, commits, tip);
-    if (result == null) {
-      return null;
-    }
-
-    // Some patch set of this change is actually merged into the target
-    // branch, most likely because a previous run of MergeOp failed after
-    // updateRepo, during updateChange.
-    //
-    // Do the best we can to clean this up: mark the change as merged and set
-    // the current patch set. Don't touch the dest branch at all. This can
-    // lead to some odd situations like another change in the set merging in
-    // a different patch set of this change, but that's unavoidable at this
-    // point.  At least the change will end up in the right state.
-    //
-    // TODO(dborowitz): Consider deleting later junk patch set refs. They
-    // presumably don't have PatchSets pointing to them.
-    rw.parseBody(result);
-    result.add(args.canMergeFlag);
-    PatchSet.Id psId = result.getPatchsetId();
-    result.copyFrom(toMerge);
-    result.setPatchsetId(psId); // Got overwriten by copyFrom.
-    result.setStatusCode(CommitMergeStatus.ALREADY_MERGED);
-    args.commitStatus.put(result);
-    return result;
-  }
-
-  @Override
-  public final boolean updateChange(ChangeContext ctx) throws Exception {
-    logDebug("{}#updateChange for change {}", getClass().getSimpleName(), toMerge.change().getId());
-    toMerge.setNotes(ctx.getNotes()); // Update change and notes from ctx.
-    PatchSet.Id oldPsId = checkNotNull(toMerge.getPatchsetId());
-    PatchSet.Id newPsId;
-
-    if (ctx.getChange().getStatus() == Change.Status.MERGED) {
-      // Either another thread won a race, or we are retrying a whole topic submission after one
-      // repo failed with lock failure.
-      if (alreadyMergedCommit == null) {
-        logDebug(
-            "Change is already merged according to its status, but we were unable to find it"
-                + " merged into the current tip ({})",
-            args.mergeTip.getCurrentTip().name());
-      } else {
-        logDebug("Change is already merged");
-      }
-      changeAlreadyMerged = true;
-      return false;
-    }
-
-    if (alreadyMergedCommit != null) {
-      alreadyMergedCommit.setNotes(ctx.getNotes());
-      mergedPatchSet = getOrCreateAlreadyMergedPatchSet(ctx);
-      newPsId = mergedPatchSet.getId();
-    } else {
-      PatchSet newPatchSet = updateChangeImpl(ctx);
-      newPsId = checkNotNull(ctx.getChange().currentPatchSetId());
-      if (newPatchSet == null) {
-        checkState(
-            oldPsId.equals(newPsId),
-            "patch set advanced from %s to %s but updateChangeImpl did not"
-                + " return new patch set instance",
-            oldPsId,
-            newPsId);
-        // Ok to use stale notes to get the old patch set, which didn't change
-        // during the submit strategy.
-        mergedPatchSet =
-            checkNotNull(
-                args.psUtil.get(ctx.getDb(), ctx.getNotes(), oldPsId),
-                "missing old patch set %s",
-                oldPsId);
-      } else {
-        PatchSet.Id n = newPatchSet.getId();
-        checkState(
-            !n.equals(oldPsId) && n.equals(newPsId),
-            "current patch was %s and is now %s, but updateChangeImpl returned"
-                + " new patch set instance at %s",
-            oldPsId,
-            newPsId,
-            n);
-        mergedPatchSet = newPatchSet;
-      }
-    }
-
-    Change c = ctx.getChange();
-    Change.Id id = c.getId();
-    CodeReviewCommit commit = args.commitStatus.get(id);
-    checkNotNull(commit, "missing commit for change " + id);
-    CommitMergeStatus s = commit.getStatusCode();
-    checkNotNull(s, "status not set for change " + id + " expected to previously fail fast");
-    logDebug("Status of change {} ({}) on {}: {}", id, commit.name(), c.getDest(), s);
-    setApproval(ctx, args.caller);
-
-    mergeResultRev =
-        alreadyMergedCommit == null
-            ? args.mergeTip.getMergeResults().get(commit)
-            // Our fixup code is not smart enough to find a merge commit
-            // corresponding to the merge result. This results in a different
-            // ChangeMergedEvent in the fixup case, but we'll just live with that.
-            : alreadyMergedCommit;
-    try {
-      setMerged(ctx, message(ctx, commit, s));
-    } catch (OrmException err) {
-      String msg = "Error updating change status for " + id;
-      log.error(msg, err);
-      args.commitStatus.logProblem(id, msg);
-      // It's possible this happened before updating anything in the db, but
-      // it's hard to know for sure, so just return true below to be safe.
-    }
-    updatedChange = c;
-    return true;
-  }
-
-  private PatchSet getOrCreateAlreadyMergedPatchSet(ChangeContext ctx)
-      throws IOException, OrmException {
-    PatchSet.Id psId = alreadyMergedCommit.getPatchsetId();
-    logDebug("Fixing up already-merged patch set {}", psId);
-    PatchSet prevPs = args.psUtil.current(ctx.getDb(), ctx.getNotes());
-    ctx.getRevWalk().parseBody(alreadyMergedCommit);
-    ctx.getChange()
-        .setCurrentPatchSet(
-            psId, alreadyMergedCommit.getShortMessage(), ctx.getChange().getOriginalSubject());
-    PatchSet existing = args.psUtil.get(ctx.getDb(), ctx.getNotes(), psId);
-    if (existing != null) {
-      logDebug("Patch set row exists, only updating change");
-      return existing;
-    }
-    // No patch set for the already merged commit, although we know it came form
-    // a patch set ref. Fix up the database. Note that this uses the current
-    // user as the uploader, which is as good a guess as any.
-    List<String> groups =
-        prevPs != null ? prevPs.getGroups() : GroupCollector.getDefaultGroups(alreadyMergedCommit);
-    return args.psUtil.insert(
-        ctx.getDb(),
-        ctx.getRevWalk(),
-        ctx.getUpdate(psId),
-        psId,
-        alreadyMergedCommit,
-        groups,
-        null,
-        null);
-  }
-
-  private void setApproval(ChangeContext ctx, IdentifiedUser user)
-      throws OrmException, IOException {
-    Change.Id id = ctx.getChange().getId();
-    List<SubmitRecord> records = args.commitStatus.getSubmitRecords(id);
-    PatchSet.Id oldPsId = toMerge.getPatchsetId();
-    PatchSet.Id newPsId = ctx.getChange().currentPatchSetId();
-
-    logDebug("Add approval for " + id);
-    ChangeUpdate origPsUpdate = ctx.getUpdate(oldPsId);
-    origPsUpdate.putReviewer(user.getAccountId(), REVIEWER);
-    LabelNormalizer.Result normalized = approve(ctx, origPsUpdate);
-
-    ChangeUpdate newPsUpdate = ctx.getUpdate(newPsId);
-    newPsUpdate.merge(args.submissionId, records);
-    // If the submit strategy created a new revision (rebase, cherry-pick), copy
-    // approvals as well.
-    if (!newPsId.equals(oldPsId)) {
-      saveApprovals(normalized, ctx, newPsUpdate, true);
-      submitter = convertPatchSet(newPsId).apply(submitter);
-    }
-  }
-
-  private LabelNormalizer.Result approve(ChangeContext ctx, ChangeUpdate update)
-      throws OrmException, IOException {
-    PatchSet.Id psId = update.getPatchSetId();
-    Map<PatchSetApproval.Key, PatchSetApproval> byKey = new HashMap<>();
-    for (PatchSetApproval psa :
-        args.approvalsUtil.byPatchSet(
-            ctx.getDb(),
-            ctx.getNotes(),
-            ctx.getUser(),
-            psId,
-            ctx.getRevWalk(),
-            ctx.getRepoView().getConfig())) {
-      byKey.put(psa.getKey(), psa);
-    }
-
-    submitter =
-        ApprovalsUtil.newApproval(psId, ctx.getUser(), LabelId.legacySubmit(), 1, ctx.getWhen());
-    byKey.put(submitter.getKey(), submitter);
-
-    // Flatten out existing approvals for this patch set based upon the current
-    // permissions. Once the change is closed the approvals are not updated at
-    // presentation view time, except for zero votes used to indicate a reviewer
-    // was added. So we need to make sure votes are accurate now. This way if
-    // permissions get modified in the future, historical records stay accurate.
-    LabelNormalizer.Result normalized =
-        args.labelNormalizer.normalize(ctx.getNotes(), ctx.getUser(), byKey.values());
-    update.putApproval(submitter.getLabel(), submitter.getValue());
-    saveApprovals(normalized, ctx, update, false);
-    return normalized;
-  }
-
-  private void saveApprovals(
-      LabelNormalizer.Result normalized,
-      ChangeContext ctx,
-      ChangeUpdate update,
-      boolean includeUnchanged)
-      throws OrmException {
-    PatchSet.Id psId = update.getPatchSetId();
-    ctx.getDb().patchSetApprovals().upsert(convertPatchSet(normalized.getNormalized(), psId));
-    ctx.getDb().patchSetApprovals().upsert(zero(convertPatchSet(normalized.deleted(), psId)));
-    for (PatchSetApproval psa : normalized.updated()) {
-      update.putApprovalFor(psa.getAccountId(), psa.getLabel(), psa.getValue());
-    }
-    for (PatchSetApproval psa : normalized.deleted()) {
-      update.removeApprovalFor(psa.getAccountId(), psa.getLabel());
-    }
-
-    // TODO(dborowitz): Don't use a label in NoteDb; just check when status
-    // change happened.
-    for (PatchSetApproval psa : normalized.unchanged()) {
-      if (includeUnchanged || psa.isLegacySubmit()) {
-        logDebug("Adding submit label " + psa);
-        update.putApprovalFor(psa.getAccountId(), psa.getLabel(), psa.getValue());
-      }
-    }
-  }
-
-  private static Function<PatchSetApproval, PatchSetApproval> convertPatchSet(
-      final PatchSet.Id psId) {
-    return psa -> {
-      if (psa.getPatchSetId().equals(psId)) {
-        return psa;
-      }
-      return new PatchSetApproval(psId, psa);
-    };
-  }
-
-  private static Iterable<PatchSetApproval> convertPatchSet(
-      Iterable<PatchSetApproval> approvals, PatchSet.Id psId) {
-    return Iterables.transform(approvals, convertPatchSet(psId));
-  }
-
-  private static Iterable<PatchSetApproval> zero(Iterable<PatchSetApproval> approvals) {
-    return Iterables.transform(
-        approvals,
-        a -> {
-          PatchSetApproval copy = new PatchSetApproval(a.getPatchSetId(), a);
-          copy.setValue((short) 0);
-          return copy;
-        });
-  }
-
-  private String getByAccountName() {
-    checkNotNull(submitter, "getByAccountName called before submitter populated");
-    Account account = args.accountCache.get(submitter.getAccountId()).getAccount();
-    if (account != null && account.getFullName() != null) {
-      return " by " + account.getFullName();
-    }
-    return "";
-  }
-
-  private ChangeMessage message(ChangeContext ctx, CodeReviewCommit commit, CommitMergeStatus s)
-      throws OrmException {
-    checkNotNull(s, "CommitMergeStatus may not be null");
-    String txt = s.getMessage();
-    if (s == CommitMergeStatus.CLEAN_MERGE) {
-      return message(ctx, commit.getPatchsetId(), txt + getByAccountName());
-    } else if (s == CommitMergeStatus.CLEAN_REBASE || s == CommitMergeStatus.CLEAN_PICK) {
-      return message(
-          ctx, commit.getPatchsetId(), txt + " as " + commit.name() + getByAccountName());
-    } else if (s == CommitMergeStatus.SKIPPED_IDENTICAL_TREE) {
-      return message(ctx, commit.getPatchsetId(), txt);
-    } else if (s == CommitMergeStatus.ALREADY_MERGED) {
-      // Best effort to mimic the message that would have happened had this
-      // succeeded the first time around.
-      switch (args.submitType) {
-        case FAST_FORWARD_ONLY:
-        case MERGE_ALWAYS:
-        case MERGE_IF_NECESSARY:
-          return message(ctx, commit, CommitMergeStatus.CLEAN_MERGE);
-        case CHERRY_PICK:
-          return message(ctx, commit, CommitMergeStatus.CLEAN_PICK);
-        case REBASE_IF_NECESSARY:
-        case REBASE_ALWAYS:
-          return message(ctx, commit, CommitMergeStatus.CLEAN_REBASE);
-        default:
-          throw new IllegalStateException(
-              "unexpected submit type "
-                  + args.submitType.toString()
-                  + " for change "
-                  + commit.change().getId());
-      }
-    } else {
-      throw new IllegalStateException(
-          "unexpected status "
-              + s
-              + " for change "
-              + commit.change().getId()
-              + "; expected to previously fail fast");
-    }
-  }
-
-  private ChangeMessage message(ChangeContext ctx, PatchSet.Id psId, String body) {
-    return ChangeMessagesUtil.newMessage(
-        psId, ctx.getUser(), ctx.getWhen(), body, ChangeMessagesUtil.TAG_MERGED);
-  }
-
-  private void setMerged(ChangeContext ctx, ChangeMessage msg) throws OrmException {
-    Change c = ctx.getChange();
-    ReviewDb db = ctx.getDb();
-    logDebug("Setting change {} merged", c.getId());
-    c.setStatus(Change.Status.MERGED);
-    c.setSubmissionId(args.submissionId.toStringForStorage());
-
-    // TODO(dborowitz): We need to be able to change the author of the message,
-    // which is not the user from the update context. addMergedMessage was able
-    // to do this in the past.
-    if (msg != null) {
-      args.cmUtil.addChangeMessage(db, ctx.getUpdate(msg.getPatchSetId()), msg);
-    }
-  }
-
-  @Override
-  public final void postUpdate(Context ctx) throws Exception {
-    if (changeAlreadyMerged) {
-      // TODO(dborowitz): This is suboptimal behavior in the presence of retries: postUpdate steps
-      // will never get run for changes that submitted successfully on any but the final attempt.
-      // This is primarily a temporary workaround for the fact that the submitter field is not
-      // populated in the changeAlreadyMerged case.
-      //
-      // If we naively execute postUpdate even if the change is already merged when updateChange
-      // being, then we are subject to a race where postUpdate steps are run twice if two submit
-      // processes run at the same time.
-      logDebug("Skipping post-update steps for change {}", getId());
-      return;
-    }
-    postUpdateImpl(ctx);
-
-    if (command != null) {
-      args.tagCache.updateFastForward(
-          getProject(), command.getRefName(), command.getOldId(), command.getNewId());
-      // TODO(dborowitz): Move to BatchUpdate? Would also allow us to run once
-      // per project even if multiple changes to refs/meta/config are submitted.
-      if (RefNames.REFS_CONFIG.equals(getDest().get())) {
-        args.projectCache.evict(getProject());
-        ProjectState p = args.projectCache.get(getProject());
-        try (Repository git = args.repoManager.openRepository(getProject())) {
-          git.setGitwebDescription(p.getProject().getDescription());
-        } catch (IOException e) {
-          log.error("cannot update description of " + p.getName(), e);
-        }
-      }
-    }
-
-    // Assume the change must have been merged at this point, otherwise we would
-    // have failed fast in one of the other steps.
-    try {
-      args.mergedSenderFactory
-          .create(
-              ctx.getProject(),
-              getId(),
-              submitter.getAccountId(),
-              args.submitInput.notify,
-              args.accountsToNotify)
-          .sendAsync();
-    } catch (Exception e) {
-      log.error("Cannot email merged notification for " + getId(), e);
-    }
-    if (mergeResultRev != null && !args.dryrun) {
-      args.changeMerged.fire(
-          updatedChange,
-          mergedPatchSet,
-          args.accountCache.get(submitter.getAccountId()).getAccount(),
-          args.mergeTip.getCurrentTip().name(),
-          ctx.getWhen());
-    }
-  }
-
-  /**
-   * @see #updateRepo(RepoContext)
-   * @param ctx
-   */
-  protected void updateRepoImpl(RepoContext ctx) throws Exception {}
-
-  /**
-   * @see #updateChange(ChangeContext)
-   * @param ctx
-   * @return a new patch set if one was created by the submit strategy, or null if not.
-   */
-  protected PatchSet updateChangeImpl(ChangeContext ctx) throws Exception {
-    return null;
-  }
-
-  /**
-   * @see #postUpdate(Context)
-   * @param ctx
-   */
-  protected void postUpdateImpl(Context ctx) throws Exception {}
-
-  /**
-   * Amend the commit with gitlink update
-   *
-   * @param commit
-   */
-  protected CodeReviewCommit amendGitlink(CodeReviewCommit commit) throws IntegrationException {
-    if (!args.submoduleOp.hasSubscription(args.destBranch)) {
-      return commit;
-    }
-
-    // Modify the commit with gitlink update
-    try {
-      return args.submoduleOp.composeGitlinksCommit(args.destBranch, commit);
-    } catch (SubmoduleException | IOException e) {
-      throw new IntegrationException(
-          "cannot update gitlink for the commit at branch: " + args.destBranch);
-    }
-  }
-
-  protected final void logDebug(String msg, Object... args) {
-    if (log.isDebugEnabled()) {
-      log.debug(this.args.submissionId + msg, args);
-    }
-  }
-
-  protected final void logWarn(String msg, Throwable t) {
-    if (log.isWarnEnabled()) {
-      log.warn(args.submissionId + msg, t);
-    }
-  }
-
-  protected void logError(String msg, Throwable t) {
-    if (log.isErrorEnabled()) {
-      if (t != null) {
-        log.error(args.submissionId + msg, t);
-      } else {
-        log.error(args.submissionId + msg);
-      }
-    }
-  }
-
-  protected void logError(String msg) {
-    logError(msg, null);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/TestHelperOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/TestHelperOp.java
deleted file mode 100644
index 8d95045..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/TestHelperOp.java
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.git.strategy;
-
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.server.change.Submit.TestSubmitInput;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.RepoContext;
-import com.google.gerrit.server.util.RequestId;
-import java.io.IOException;
-import java.util.Queue;
-import org.eclipse.jgit.lib.ObjectId;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-class TestHelperOp implements BatchUpdateOp {
-  private static final Logger log = LoggerFactory.getLogger(TestHelperOp.class);
-
-  private final Change.Id changeId;
-  private final TestSubmitInput input;
-  private final RequestId submissionId;
-
-  TestHelperOp(Change.Id changeId, SubmitStrategy.Arguments args) {
-    this.changeId = changeId;
-    this.input = (TestSubmitInput) args.submitInput;
-    this.submissionId = args.submissionId;
-  }
-
-  @Override
-  public void updateRepo(RepoContext ctx) throws IOException {
-    Queue<Boolean> q = input.generateLockFailures;
-    if (q != null && !q.isEmpty() && q.remove()) {
-      logDebug("Adding bogus ref update to trigger lock failure, via change {}", changeId);
-      ctx.addRefUpdate(
-          ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"),
-          ObjectId.zeroId(),
-          "refs/test/" + getClass().getSimpleName());
-    }
-  }
-
-  private void logDebug(String msg, Object... args) {
-    if (log.isDebugEnabled()) {
-      log.debug(submissionId + msg, args);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/AccountValidator.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/AccountValidator.java
deleted file mode 100644
index 934b63c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/AccountValidator.java
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.git.validators;
-
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountConfig;
-import com.google.gerrit.server.mail.send.OutgoingEmailValidator;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-public class AccountValidator {
-
-  private final Provider<IdentifiedUser> self;
-  private final OutgoingEmailValidator emailValidator;
-
-  @Inject
-  public AccountValidator(Provider<IdentifiedUser> self, OutgoingEmailValidator emailValidator) {
-    this.self = self;
-    this.emailValidator = emailValidator;
-  }
-
-  public List<String> validate(
-      Account.Id accountId, RevWalk rw, @Nullable ObjectId oldId, ObjectId newId)
-      throws IOException {
-    Account oldAccount = null;
-    if (oldId != null && !ObjectId.zeroId().equals(oldId)) {
-      try {
-        oldAccount = loadAccount(accountId, rw, oldId);
-      } catch (ConfigInvalidException e) {
-        // ignore, maybe the new commit is repairing it now
-      }
-    }
-
-    Account newAccount;
-    try {
-      newAccount = loadAccount(accountId, rw, newId);
-    } catch (ConfigInvalidException e) {
-      return ImmutableList.of(
-          String.format(
-              "commit '%s' has an invalid '%s' file for account '%s': %s",
-              newId.name(), AccountConfig.ACCOUNT_CONFIG, accountId.get(), e.getMessage()));
-    }
-
-    List<String> messages = new ArrayList<>();
-    if (accountId.equals(self.get().getAccountId()) && !newAccount.isActive()) {
-      messages.add("cannot deactivate own account");
-    }
-
-    if (newAccount.getPreferredEmail() != null
-        && (oldAccount == null
-            || !newAccount.getPreferredEmail().equals(oldAccount.getPreferredEmail()))) {
-      if (!emailValidator.isValid(newAccount.getPreferredEmail())) {
-        messages.add(
-            String.format(
-                "invalid preferred email '%s' for account '%s'",
-                newAccount.getPreferredEmail(), accountId.get()));
-      }
-    }
-
-    return ImmutableList.copyOf(messages);
-  }
-
-  private Account loadAccount(Account.Id accountId, RevWalk rw, ObjectId commit)
-      throws IOException, ConfigInvalidException {
-    rw.reset();
-    AccountConfig accountConfig = new AccountConfig(null, accountId);
-    accountConfig.load(rw, commit);
-    return accountConfig.getAccount();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidationMessage.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidationMessage.java
deleted file mode 100644
index a778482..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidationMessage.java
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.git.validators;
-
-public class CommitValidationMessage extends ValidationMessage {
-  public CommitValidationMessage(String message, boolean isError) {
-    super(message, isError);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidators.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidators.java
deleted file mode 100644
index 923adad..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidators.java
+++ /dev/null
@@ -1,809 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.git.validators;
-
-import static com.google.gerrit.reviewdb.client.Change.CHANGE_ID_PATTERN;
-import static com.google.gerrit.reviewdb.client.RefNames.REFS_CHANGES;
-import static com.google.gerrit.reviewdb.client.RefNames.REFS_CONFIG;
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.base.CharMatcher;
-import com.google.common.base.Splitter;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.common.FooterConstants;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.PageLinks;
-import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo.ConsistencyProblemInfo;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.WatchConfig;
-import com.google.gerrit.server.account.externalids.ExternalIdsConsistencyChecker;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.config.CanonicalWebUrl;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.events.CommitReceivedEvent;
-import com.google.gerrit.server.git.BanCommit;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.git.ValidationError;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.RefPermission;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.ssh.SshInfo;
-import com.google.gerrit.server.util.MagicBranch;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.jcraft.jsch.HostKey;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.regex.Pattern;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.notes.NoteMap;
-import org.eclipse.jgit.revwalk.FooterKey;
-import org.eclipse.jgit.revwalk.FooterLine;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.util.SystemReader;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class CommitValidators {
-  private static final Logger log = LoggerFactory.getLogger(CommitValidators.class);
-
-  public static final Pattern NEW_PATCHSET_PATTERN =
-      Pattern.compile("^" + REFS_CHANGES + "(?:[0-9][0-9]/)?([1-9][0-9]*)(?:/[1-9][0-9]*)?$");
-
-  @Singleton
-  public static class Factory {
-    private final PersonIdent gerritIdent;
-    private final String canonicalWebUrl;
-    private final DynamicSet<CommitValidationListener> pluginValidators;
-    private final AllUsersName allUsers;
-    private final ExternalIdsConsistencyChecker externalIdsConsistencyChecker;
-    private final AccountValidator accountValidator;
-    private final String installCommitMsgHookCommand;
-    private final ProjectCache projectCache;
-
-    @Inject
-    Factory(
-        @GerritPersonIdent PersonIdent gerritIdent,
-        @CanonicalWebUrl @Nullable String canonicalWebUrl,
-        @GerritServerConfig Config cfg,
-        DynamicSet<CommitValidationListener> pluginValidators,
-        AllUsersName allUsers,
-        ExternalIdsConsistencyChecker externalIdsConsistencyChecker,
-        AccountValidator accountValidator,
-        ProjectCache projectCache) {
-      this.gerritIdent = gerritIdent;
-      this.canonicalWebUrl = canonicalWebUrl;
-      this.pluginValidators = pluginValidators;
-      this.allUsers = allUsers;
-      this.externalIdsConsistencyChecker = externalIdsConsistencyChecker;
-      this.accountValidator = accountValidator;
-      this.installCommitMsgHookCommand =
-          cfg != null ? cfg.getString("gerrit", null, "installCommitMsgHookCommand") : null;
-      this.projectCache = projectCache;
-    }
-
-    public CommitValidators forReceiveCommits(
-        PermissionBackend.ForRef perm,
-        Branch.NameKey branch,
-        IdentifiedUser user,
-        SshInfo sshInfo,
-        Repository repo,
-        RevWalk rw)
-        throws IOException {
-      NoteMap rejectCommits = BanCommit.loadRejectCommitsMap(repo, rw);
-      ProjectState projectState = projectCache.checkedGet(branch.getParentKey());
-      return new CommitValidators(
-          ImmutableList.of(
-              new UploadMergesPermissionValidator(perm),
-              new AmendedGerritMergeCommitValidationListener(perm, gerritIdent),
-              new AuthorUploaderValidator(user, perm, canonicalWebUrl),
-              new CommitterUploaderValidator(user, perm, canonicalWebUrl),
-              new SignedOffByValidator(user, perm, projectState),
-              new ChangeIdValidator(
-                  projectState, user, canonicalWebUrl, installCommitMsgHookCommand, sshInfo),
-              new ConfigValidator(branch, user, rw, allUsers),
-              new BannedCommitsValidator(rejectCommits),
-              new PluginCommitValidationListener(pluginValidators),
-              new ExternalIdUpdateListener(allUsers, externalIdsConsistencyChecker),
-              new AccountCommitValidator(allUsers, accountValidator)));
-    }
-
-    public CommitValidators forGerritCommits(
-        PermissionBackend.ForRef perm,
-        Branch.NameKey branch,
-        IdentifiedUser user,
-        SshInfo sshInfo,
-        RevWalk rw)
-        throws IOException {
-      return new CommitValidators(
-          ImmutableList.of(
-              new UploadMergesPermissionValidator(perm),
-              new AmendedGerritMergeCommitValidationListener(perm, gerritIdent),
-              new AuthorUploaderValidator(user, perm, canonicalWebUrl),
-              new SignedOffByValidator(user, perm, projectCache.checkedGet(branch.getParentKey())),
-              new ChangeIdValidator(
-                  projectCache.checkedGet(branch.getParentKey()),
-                  user,
-                  canonicalWebUrl,
-                  installCommitMsgHookCommand,
-                  sshInfo),
-              new ConfigValidator(branch, user, rw, allUsers),
-              new PluginCommitValidationListener(pluginValidators),
-              new ExternalIdUpdateListener(allUsers, externalIdsConsistencyChecker),
-              new AccountCommitValidator(allUsers, accountValidator)));
-    }
-
-    public CommitValidators forMergedCommits(PermissionBackend.ForRef perm, IdentifiedUser user) {
-      // Generally only include validators that are based on permissions of the
-      // user creating a change for a merged commit; generally exclude
-      // validators that would require amending the change in order to correct.
-      //
-      // Examples:
-      //  - Change-Id and Signed-off-by can't be added to an already-merged
-      //    commit.
-      //  - If the commit is banned, we can't ban it here. In fact, creating a
-      //    review of a previously merged and recently-banned commit is a use
-      //    case for post-commit code review: so reviewers have a place to
-      //    discuss what to do about it.
-      //  - Plugin validators may do things like require certain commit message
-      //    formats, so we play it safe and exclude them.
-      return new CommitValidators(
-          ImmutableList.of(
-              new UploadMergesPermissionValidator(perm),
-              new AuthorUploaderValidator(user, perm, canonicalWebUrl),
-              new CommitterUploaderValidator(user, perm, canonicalWebUrl)));
-    }
-  }
-
-  private final List<CommitValidationListener> validators;
-
-  CommitValidators(List<CommitValidationListener> validators) {
-    this.validators = validators;
-  }
-
-  public List<CommitValidationMessage> validate(CommitReceivedEvent receiveEvent)
-      throws CommitValidationException {
-    List<CommitValidationMessage> messages = new ArrayList<>();
-    try {
-      for (CommitValidationListener commitValidator : validators) {
-        messages.addAll(commitValidator.onCommitReceived(receiveEvent));
-      }
-    } catch (CommitValidationException e) {
-      log.debug("CommitValidationException occurred: {}", e.getFullMessage(), e);
-      // Keep the old messages (and their order) in case of an exception
-      messages.addAll(e.getMessages());
-      throw new CommitValidationException(e.getMessage(), messages);
-    }
-    return messages;
-  }
-
-  public static class ChangeIdValidator implements CommitValidationListener {
-    private static final String CHANGE_ID_PREFIX = FooterConstants.CHANGE_ID.getName() + ":";
-    private static final String MISSING_CHANGE_ID_MSG = "missing Change-Id in message footer";
-    private static final String MISSING_SUBJECT_MSG =
-        "missing subject; Change-Id must be in message footer";
-    private static final String MULTIPLE_CHANGE_ID_MSG =
-        "multiple Change-Id lines in message footer";
-    private static final String INVALID_CHANGE_ID_MSG =
-        "invalid Change-Id line format in message footer";
-    private static final Pattern CHANGE_ID = Pattern.compile(CHANGE_ID_PATTERN);
-
-    private final ProjectState projectState;
-    private final String canonicalWebUrl;
-    private final String installCommitMsgHookCommand;
-    private final SshInfo sshInfo;
-    private final IdentifiedUser user;
-
-    public ChangeIdValidator(
-        ProjectState projectState,
-        IdentifiedUser user,
-        String canonicalWebUrl,
-        String installCommitMsgHookCommand,
-        SshInfo sshInfo) {
-      this.projectState = projectState;
-      this.canonicalWebUrl = canonicalWebUrl;
-      this.installCommitMsgHookCommand = installCommitMsgHookCommand;
-      this.sshInfo = sshInfo;
-      this.user = user;
-    }
-
-    @Override
-    public List<CommitValidationMessage> onCommitReceived(CommitReceivedEvent receiveEvent)
-        throws CommitValidationException {
-      if (!shouldValidateChangeId(receiveEvent)) {
-        return Collections.emptyList();
-      }
-      RevCommit commit = receiveEvent.commit;
-      List<CommitValidationMessage> messages = new ArrayList<>();
-      List<String> idList = commit.getFooterLines(FooterConstants.CHANGE_ID);
-
-      if (idList.isEmpty()) {
-        String shortMsg = commit.getShortMessage();
-        if (shortMsg.startsWith(CHANGE_ID_PREFIX)
-            && CHANGE_ID.matcher(shortMsg.substring(CHANGE_ID_PREFIX.length()).trim()).matches()) {
-          throw new CommitValidationException(MISSING_SUBJECT_MSG);
-        }
-        if (projectState.isRequireChangeID()) {
-          messages.add(getMissingChangeIdErrorMsg(MISSING_CHANGE_ID_MSG, commit));
-          throw new CommitValidationException(MISSING_CHANGE_ID_MSG, messages);
-        }
-      } else if (idList.size() > 1) {
-        throw new CommitValidationException(MULTIPLE_CHANGE_ID_MSG, messages);
-      } else {
-        String v = idList.get(idList.size() - 1).trim();
-        // Reject Change-Ids with wrong format and invalid placeholder ID from
-        // Egit (I0000000000000000000000000000000000000000).
-        if (!CHANGE_ID.matcher(v).matches() || v.matches("^I00*$")) {
-          messages.add(getMissingChangeIdErrorMsg(INVALID_CHANGE_ID_MSG, receiveEvent.commit));
-          throw new CommitValidationException(INVALID_CHANGE_ID_MSG, messages);
-        }
-      }
-      return Collections.emptyList();
-    }
-
-    private static boolean shouldValidateChangeId(CommitReceivedEvent event) {
-      return MagicBranch.isMagicBranch(event.command.getRefName())
-          || NEW_PATCHSET_PATTERN.matcher(event.command.getRefName()).matches();
-    }
-
-    private CommitValidationMessage getMissingChangeIdErrorMsg(String errMsg, RevCommit c) {
-      StringBuilder sb = new StringBuilder();
-      sb.append("ERROR: ").append(errMsg).append("\n");
-
-      boolean hinted = false;
-      if (c.getFullMessage().contains(CHANGE_ID_PREFIX)) {
-        String lastLine = Iterables.getLast(Splitter.on('\n').split(c.getFullMessage()), "");
-        if (!lastLine.contains(CHANGE_ID_PREFIX)) {
-          hinted = true;
-          sb.append("\n")
-              .append("Hint: run\n")
-              .append("  git commit --amend\n")
-              .append("and move 'Change-Id: Ixxx..' to the bottom on a separate line\n");
-        }
-      }
-
-      // Print only one hint to avoid overwhelming the user.
-      if (!hinted) {
-        sb.append("\nHint: to automatically insert a Change-Id, install the hook:\n")
-            .append(getCommitMessageHookInstallationHint())
-            .append("\n")
-            .append("and then amend the commit:\n")
-            .append("  git commit --amend\n");
-      }
-      return new CommitValidationMessage(sb.toString(), false);
-    }
-
-    private String getCommitMessageHookInstallationHint() {
-      if (installCommitMsgHookCommand != null) {
-        return installCommitMsgHookCommand;
-      }
-      final List<HostKey> hostKeys = sshInfo.getHostKeys();
-
-      // If there are no SSH keys, the commit-msg hook must be installed via
-      // HTTP(S)
-      if (hostKeys.isEmpty()) {
-        String p = "${gitdir}/hooks/commit-msg";
-        return String.format(
-            "  gitdir=$(git rev-parse --git-dir); curl -o %s %s/tools/hooks/commit-msg ; chmod +x %s",
-            p, getGerritUrl(canonicalWebUrl), p);
-      }
-
-      // SSH keys exist, so the hook can be installed with scp.
-      String sshHost;
-      int sshPort;
-      String host = hostKeys.get(0).getHost();
-      int c = host.lastIndexOf(':');
-      if (0 <= c) {
-        if (host.startsWith("*:")) {
-          sshHost = getGerritHost(canonicalWebUrl);
-        } else {
-          sshHost = host.substring(0, c);
-        }
-        sshPort = Integer.parseInt(host.substring(c + 1));
-      } else {
-        sshHost = host;
-        sshPort = 22;
-      }
-
-      return String.format(
-          "  gitdir=$(git rev-parse --git-dir); scp -p -P %d %s@%s:hooks/commit-msg ${gitdir}/hooks/",
-          sshPort, user.getUserName(), sshHost);
-    }
-  }
-
-  /** If this is the special project configuration branch, validate the config. */
-  public static class ConfigValidator implements CommitValidationListener {
-    private final Branch.NameKey branch;
-    private final IdentifiedUser user;
-    private final RevWalk rw;
-    private final AllUsersName allUsers;
-
-    public ConfigValidator(
-        Branch.NameKey branch, IdentifiedUser user, RevWalk rw, AllUsersName allUsers) {
-      this.branch = branch;
-      this.user = user;
-      this.rw = rw;
-      this.allUsers = allUsers;
-    }
-
-    @Override
-    public List<CommitValidationMessage> onCommitReceived(CommitReceivedEvent receiveEvent)
-        throws CommitValidationException {
-      if (REFS_CONFIG.equals(branch.get())) {
-        List<CommitValidationMessage> messages = new ArrayList<>();
-
-        try {
-          ProjectConfig cfg = new ProjectConfig(receiveEvent.project.getNameKey());
-          cfg.load(rw, receiveEvent.command.getNewId());
-          if (!cfg.getValidationErrors().isEmpty()) {
-            addError("Invalid project configuration:", messages);
-            for (ValidationError err : cfg.getValidationErrors()) {
-              addError("  " + err.getMessage(), messages);
-            }
-            throw new ConfigInvalidException("invalid project configuration");
-          }
-        } catch (ConfigInvalidException | IOException e) {
-          log.error(
-              "User "
-                  + user.getUserName()
-                  + " tried to push an invalid project configuration "
-                  + receiveEvent.command.getNewId().name()
-                  + " for project "
-                  + receiveEvent.project,
-              e);
-          throw new CommitValidationException("invalid project configuration", messages);
-        }
-      }
-
-      if (allUsers.equals(branch.getParentKey()) && RefNames.isRefsUsers(branch.get())) {
-        List<CommitValidationMessage> messages = new ArrayList<>();
-        Account.Id accountId = Account.Id.fromRef(branch.get());
-        if (accountId != null) {
-          try {
-            WatchConfig wc = new WatchConfig(accountId);
-            wc.load(rw, receiveEvent.command.getNewId());
-            if (!wc.getValidationErrors().isEmpty()) {
-              addError("Invalid project configuration:", messages);
-              for (ValidationError err : wc.getValidationErrors()) {
-                addError("  " + err.getMessage(), messages);
-              }
-              throw new ConfigInvalidException("invalid watch configuration");
-            }
-          } catch (IOException | ConfigInvalidException e) {
-            log.error(
-                "User "
-                    + user.getUserName()
-                    + " tried to push an invalid watch configuration "
-                    + receiveEvent.command.getNewId().name()
-                    + " for account "
-                    + accountId.get(),
-                e);
-            throw new CommitValidationException("invalid watch configuration", messages);
-          }
-        }
-      }
-
-      return Collections.emptyList();
-    }
-  }
-
-  /** Require permission to upload merge commits. */
-  public static class UploadMergesPermissionValidator implements CommitValidationListener {
-    private final PermissionBackend.ForRef perm;
-
-    public UploadMergesPermissionValidator(PermissionBackend.ForRef perm) {
-      this.perm = perm;
-    }
-
-    @Override
-    public List<CommitValidationMessage> onCommitReceived(CommitReceivedEvent receiveEvent)
-        throws CommitValidationException {
-      if (receiveEvent.commit.getParentCount() <= 1) {
-        return Collections.emptyList();
-      }
-      try {
-        perm.check(RefPermission.MERGE);
-        return Collections.emptyList();
-      } catch (AuthException e) {
-        throw new CommitValidationException("you are not allowed to upload merges");
-      } catch (PermissionBackendException e) {
-        log.error("cannot check MERGE", e);
-        throw new CommitValidationException("internal auth error");
-      }
-    }
-  }
-
-  /** Execute commit validation plug-ins */
-  public static class PluginCommitValidationListener implements CommitValidationListener {
-    private final DynamicSet<CommitValidationListener> commitValidationListeners;
-
-    public PluginCommitValidationListener(
-        final DynamicSet<CommitValidationListener> commitValidationListeners) {
-      this.commitValidationListeners = commitValidationListeners;
-    }
-
-    @Override
-    public List<CommitValidationMessage> onCommitReceived(CommitReceivedEvent receiveEvent)
-        throws CommitValidationException {
-      List<CommitValidationMessage> messages = new ArrayList<>();
-
-      for (CommitValidationListener validator : commitValidationListeners) {
-        try {
-          messages.addAll(validator.onCommitReceived(receiveEvent));
-        } catch (CommitValidationException e) {
-          messages.addAll(e.getMessages());
-          throw new CommitValidationException(e.getMessage(), messages);
-        }
-      }
-      return messages;
-    }
-  }
-
-  public static class SignedOffByValidator implements CommitValidationListener {
-    private final IdentifiedUser user;
-    private final PermissionBackend.ForRef perm;
-    private final ProjectState state;
-
-    public SignedOffByValidator(
-        IdentifiedUser user, PermissionBackend.ForRef perm, ProjectState state) {
-      this.user = user;
-      this.perm = perm;
-      this.state = state;
-    }
-
-    @Override
-    public List<CommitValidationMessage> onCommitReceived(CommitReceivedEvent receiveEvent)
-        throws CommitValidationException {
-      if (!state.isUseSignedOffBy()) {
-        return Collections.emptyList();
-      }
-
-      RevCommit commit = receiveEvent.commit;
-      PersonIdent committer = commit.getCommitterIdent();
-      PersonIdent author = commit.getAuthorIdent();
-
-      boolean sboAuthor = false;
-      boolean sboCommitter = false;
-      boolean sboMe = false;
-      for (FooterLine footer : commit.getFooterLines()) {
-        if (footer.matches(FooterKey.SIGNED_OFF_BY)) {
-          String e = footer.getEmailAddress();
-          if (e != null) {
-            sboAuthor |= author.getEmailAddress().equals(e);
-            sboCommitter |= committer.getEmailAddress().equals(e);
-            sboMe |= user.hasEmailAddress(e);
-          }
-        }
-      }
-      if (!sboAuthor && !sboCommitter && !sboMe) {
-        try {
-          perm.check(RefPermission.FORGE_COMMITTER);
-        } catch (AuthException denied) {
-          throw new CommitValidationException(
-              "not Signed-off-by author/committer/uploader in message footer");
-        } catch (PermissionBackendException e) {
-          log.error("cannot check FORGE_COMMITTER", e);
-          throw new CommitValidationException("internal auth error");
-        }
-      }
-      return Collections.emptyList();
-    }
-  }
-
-  /** Require that author matches the uploader. */
-  public static class AuthorUploaderValidator implements CommitValidationListener {
-    private final IdentifiedUser user;
-    private final PermissionBackend.ForRef perm;
-    private final String canonicalWebUrl;
-
-    public AuthorUploaderValidator(
-        IdentifiedUser user, PermissionBackend.ForRef perm, String canonicalWebUrl) {
-      this.user = user;
-      this.perm = perm;
-      this.canonicalWebUrl = canonicalWebUrl;
-    }
-
-    @Override
-    public List<CommitValidationMessage> onCommitReceived(CommitReceivedEvent receiveEvent)
-        throws CommitValidationException {
-      PersonIdent author = receiveEvent.commit.getAuthorIdent();
-      if (user.hasEmailAddress(author.getEmailAddress())) {
-        return Collections.emptyList();
-      }
-      try {
-        perm.check(RefPermission.FORGE_AUTHOR);
-        return Collections.emptyList();
-      } catch (AuthException e) {
-        throw new CommitValidationException(
-            "invalid author", invalidEmail("author", author, user, canonicalWebUrl));
-      } catch (PermissionBackendException e) {
-        log.error("cannot check FORGE_AUTHOR", e);
-        throw new CommitValidationException("internal auth error");
-      }
-    }
-  }
-
-  /** Require that committer matches the uploader. */
-  public static class CommitterUploaderValidator implements CommitValidationListener {
-    private final IdentifiedUser user;
-    private final PermissionBackend.ForRef perm;
-    private final String canonicalWebUrl;
-
-    public CommitterUploaderValidator(
-        IdentifiedUser user, PermissionBackend.ForRef perm, String canonicalWebUrl) {
-      this.user = user;
-      this.perm = perm;
-      this.canonicalWebUrl = canonicalWebUrl;
-    }
-
-    @Override
-    public List<CommitValidationMessage> onCommitReceived(CommitReceivedEvent receiveEvent)
-        throws CommitValidationException {
-      PersonIdent committer = receiveEvent.commit.getCommitterIdent();
-      if (user.hasEmailAddress(committer.getEmailAddress())) {
-        return Collections.emptyList();
-      }
-      try {
-        perm.check(RefPermission.FORGE_COMMITTER);
-        return Collections.emptyList();
-      } catch (AuthException e) {
-        throw new CommitValidationException(
-            "invalid committer", invalidEmail("committer", committer, user, canonicalWebUrl));
-      } catch (PermissionBackendException e) {
-        log.error("cannot check FORGE_COMMITTER", e);
-        throw new CommitValidationException("internal auth error");
-      }
-    }
-  }
-
-  /**
-   * Don't allow the user to amend a merge created by Gerrit Code Review. This seems to happen all
-   * too often, due to users not paying any attention to what they are doing.
-   */
-  public static class AmendedGerritMergeCommitValidationListener
-      implements CommitValidationListener {
-    private final PermissionBackend.ForRef perm;
-    private final PersonIdent gerritIdent;
-
-    public AmendedGerritMergeCommitValidationListener(
-        PermissionBackend.ForRef perm, PersonIdent gerritIdent) {
-      this.perm = perm;
-      this.gerritIdent = gerritIdent;
-    }
-
-    @Override
-    public List<CommitValidationMessage> onCommitReceived(CommitReceivedEvent receiveEvent)
-        throws CommitValidationException {
-      PersonIdent author = receiveEvent.commit.getAuthorIdent();
-      if (receiveEvent.commit.getParentCount() > 1
-          && author.getName().equals(gerritIdent.getName())
-          && author.getEmailAddress().equals(gerritIdent.getEmailAddress())) {
-        try {
-          // Stop authors from amending the merge commits that Gerrit itself creates.
-          perm.check(RefPermission.FORGE_SERVER);
-        } catch (AuthException denied) {
-          throw new CommitValidationException(
-              String.format(
-                  "pushing merge commit %s by %s requires '%s' permission",
-                  receiveEvent.commit.getId(),
-                  gerritIdent.getEmailAddress(),
-                  RefPermission.FORGE_SERVER.name()));
-        } catch (PermissionBackendException e) {
-          log.error("cannot check FORGE_SERVER", e);
-          throw new CommitValidationException("internal auth error");
-        }
-      }
-      return Collections.emptyList();
-    }
-  }
-
-  /** Reject banned commits. */
-  public static class BannedCommitsValidator implements CommitValidationListener {
-    private final NoteMap rejectCommits;
-
-    public BannedCommitsValidator(NoteMap rejectCommits) {
-      this.rejectCommits = rejectCommits;
-    }
-
-    @Override
-    public List<CommitValidationMessage> onCommitReceived(CommitReceivedEvent receiveEvent)
-        throws CommitValidationException {
-      try {
-        if (rejectCommits.contains(receiveEvent.commit)) {
-          throw new CommitValidationException(
-              "contains banned commit " + receiveEvent.commit.getName());
-        }
-        return Collections.emptyList();
-      } catch (IOException e) {
-        String m = "error checking banned commits";
-        log.warn(m, e);
-        throw new CommitValidationException(m, e);
-      }
-    }
-  }
-
-  /** Validates updates to refs/meta/external-ids. */
-  public static class ExternalIdUpdateListener implements CommitValidationListener {
-    private final AllUsersName allUsers;
-    private final ExternalIdsConsistencyChecker externalIdsConsistencyChecker;
-
-    public ExternalIdUpdateListener(
-        AllUsersName allUsers, ExternalIdsConsistencyChecker externalIdsConsistencyChecker) {
-      this.externalIdsConsistencyChecker = externalIdsConsistencyChecker;
-      this.allUsers = allUsers;
-    }
-
-    @Override
-    public List<CommitValidationMessage> onCommitReceived(CommitReceivedEvent receiveEvent)
-        throws CommitValidationException {
-      if (allUsers.equals(receiveEvent.project.getNameKey())
-          && RefNames.REFS_EXTERNAL_IDS.equals(receiveEvent.refName)) {
-        try {
-          List<ConsistencyProblemInfo> problems =
-              externalIdsConsistencyChecker.check(receiveEvent.commit);
-          List<CommitValidationMessage> msgs =
-              problems.stream()
-                  .map(
-                      p ->
-                          new CommitValidationMessage(
-                              p.message, p.status == ConsistencyProblemInfo.Status.ERROR))
-                  .collect(toList());
-          if (msgs.stream().anyMatch(m -> m.isError())) {
-            throw new CommitValidationException("invalid external IDs", msgs);
-          }
-          return msgs;
-        } catch (IOException e) {
-          String m = "error validating external IDs";
-          log.warn(m, e);
-          throw new CommitValidationException(m, e);
-        }
-      }
-      return Collections.emptyList();
-    }
-  }
-
-  /** Rejects updates to 'account.config' in user branches. */
-  public static class AccountCommitValidator implements CommitValidationListener {
-    private final AllUsersName allUsers;
-    private final AccountValidator accountValidator;
-
-    public AccountCommitValidator(AllUsersName allUsers, AccountValidator accountValidator) {
-      this.allUsers = allUsers;
-      this.accountValidator = accountValidator;
-    }
-
-    @Override
-    public List<CommitValidationMessage> onCommitReceived(CommitReceivedEvent receiveEvent)
-        throws CommitValidationException {
-      if (!allUsers.equals(receiveEvent.project.getNameKey())) {
-        return Collections.emptyList();
-      }
-
-      if (receiveEvent.command.getRefName().startsWith(MagicBranch.NEW_CHANGE)) {
-        // no validation on push for review, will be checked on submit by
-        // MergeValidators.AccountMergeValidator
-        return Collections.emptyList();
-      }
-
-      Account.Id accountId = Account.Id.fromRef(receiveEvent.refName);
-      if (accountId == null) {
-        return Collections.emptyList();
-      }
-
-      try {
-        List<String> errorMessages =
-            accountValidator.validate(
-                accountId,
-                receiveEvent.revWalk,
-                receiveEvent.command.getOldId(),
-                receiveEvent.commit);
-        if (!errorMessages.isEmpty()) {
-          throw new CommitValidationException(
-              "invalid account configuration",
-              errorMessages.stream()
-                  .map(m -> new CommitValidationMessage(m, true))
-                  .collect(toList()));
-        }
-      } catch (IOException e) {
-        String m = String.format("Validating update for account %s failed", accountId.get());
-        log.error(m, e);
-        throw new CommitValidationException(m, e);
-      }
-      return Collections.emptyList();
-    }
-  }
-
-  private static CommitValidationMessage invalidEmail(
-      String type, PersonIdent who, IdentifiedUser currentUser, String canonicalWebUrl) {
-    StringBuilder sb = new StringBuilder();
-
-    sb.append("email address ")
-        .append(who.getEmailAddress())
-        .append(" is not registered in your account, and you lack 'forge ")
-        .append(type)
-        .append("' permission.\n");
-
-    if (currentUser.getEmailAddresses().isEmpty()) {
-      sb.append("You have not registered any email addresses.\n");
-    } else {
-      sb.append("The following addresses are currently registered:\n");
-      for (String address : currentUser.getEmailAddresses()) {
-        sb.append("   ").append(address).append("\n");
-      }
-    }
-
-    if (canonicalWebUrl != null) {
-      sb.append("To register an email address, visit:\n");
-      sb.append(canonicalWebUrl).append("#").append(PageLinks.SETTINGS_CONTACT).append("\n");
-    }
-    sb.append("\n");
-    return new CommitValidationMessage(sb.toString(), true);
-  }
-
-  /**
-   * Get the Gerrit URL.
-   *
-   * @return the canonical URL (with any trailing slash removed) if it is configured, otherwise fall
-   *     back to "http://hostname" where hostname is the value returned by {@link
-   *     #getGerritHost(String)}.
-   */
-  private static String getGerritUrl(String canonicalWebUrl) {
-    if (canonicalWebUrl != null) {
-      return CharMatcher.is('/').trimTrailingFrom(canonicalWebUrl);
-    }
-    return "http://" + getGerritHost(canonicalWebUrl);
-  }
-
-  /**
-   * Get the Gerrit hostname.
-   *
-   * @return the hostname from the canonical URL if it is configured, otherwise whatever the OS says
-   *     the hostname is.
-   */
-  private static String getGerritHost(String canonicalWebUrl) {
-    String host;
-    if (canonicalWebUrl != null) {
-      try {
-        host = new URL(canonicalWebUrl).getHost();
-      } catch (MalformedURLException e) {
-        host = SystemReader.getInstance().getHostname();
-      }
-    } else {
-      host = SystemReader.getInstance().getHostname();
-    }
-    return host;
-  }
-
-  private static void addError(String error, List<CommitValidationMessage> messages) {
-    messages.add(new CommitValidationMessage(error, true));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/MergeValidators.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/MergeValidators.java
deleted file mode 100644
index 8ccf081..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/MergeValidators.java
+++ /dev/null
@@ -1,287 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.git.validators;
-
-import com.google.common.base.Joiner;
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.extensions.api.projects.ProjectConfigEntryType;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.registration.DynamicMap.Entry;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountConfig;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.config.PluginConfig;
-import com.google.gerrit.server.config.ProjectConfigEntry;
-import com.google.gerrit.server.git.CodeReviewCommit;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.util.List;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class MergeValidators {
-  private static final Logger log = LoggerFactory.getLogger(MergeValidators.class);
-
-  private final DynamicSet<MergeValidationListener> mergeValidationListeners;
-  private final ProjectConfigValidator.Factory projectConfigValidatorFactory;
-  private final AccountMergeValidator.Factory accountValidatorFactory;
-
-  public interface Factory {
-    MergeValidators create();
-  }
-
-  @Inject
-  MergeValidators(
-      DynamicSet<MergeValidationListener> mergeValidationListeners,
-      ProjectConfigValidator.Factory projectConfigValidatorFactory,
-      AccountMergeValidator.Factory accountValidatorFactory) {
-    this.mergeValidationListeners = mergeValidationListeners;
-    this.projectConfigValidatorFactory = projectConfigValidatorFactory;
-    this.accountValidatorFactory = accountValidatorFactory;
-  }
-
-  public void validatePreMerge(
-      Repository repo,
-      CodeReviewCommit commit,
-      ProjectState destProject,
-      Branch.NameKey destBranch,
-      PatchSet.Id patchSetId,
-      IdentifiedUser caller)
-      throws MergeValidationException {
-    List<MergeValidationListener> validators =
-        ImmutableList.of(
-            new PluginMergeValidationListener(mergeValidationListeners),
-            projectConfigValidatorFactory.create(),
-            accountValidatorFactory.create());
-
-    for (MergeValidationListener validator : validators) {
-      validator.onPreMerge(repo, commit, destProject, destBranch, patchSetId, caller);
-    }
-  }
-
-  public static class ProjectConfigValidator implements MergeValidationListener {
-    private static final String INVALID_CONFIG =
-        "Change contains an invalid project configuration.";
-    private static final String PARENT_NOT_FOUND =
-        "Change contains an invalid project configuration:\nParent project does not exist.";
-    private static final String PLUGIN_VALUE_NOT_EDITABLE =
-        "Change contains an invalid project configuration:\n"
-            + "One of the plugin configuration parameters is not editable.";
-    private static final String PLUGIN_VALUE_NOT_PERMITTED =
-        "Change contains an invalid project configuration:\n"
-            + "One of the plugin configuration parameters has a value that is not"
-            + " permitted.";
-    private static final String ROOT_NO_PARENT =
-        "Change contains an invalid project configuration:\n"
-            + "The root project cannot have a parent.";
-    private static final String SET_BY_ADMIN =
-        "Change contains a project configuration that changes the parent"
-            + " project.\n"
-            + "The change must be submitted by a Gerrit administrator.";
-
-    private final AllProjectsName allProjectsName;
-    private final ProjectCache projectCache;
-    private final PermissionBackend permissionBackend;
-    private final DynamicMap<ProjectConfigEntry> pluginConfigEntries;
-
-    public interface Factory {
-      ProjectConfigValidator create();
-    }
-
-    @Inject
-    public ProjectConfigValidator(
-        AllProjectsName allProjectsName,
-        ProjectCache projectCache,
-        PermissionBackend permissionBackend,
-        DynamicMap<ProjectConfigEntry> pluginConfigEntries) {
-      this.allProjectsName = allProjectsName;
-      this.projectCache = projectCache;
-      this.permissionBackend = permissionBackend;
-      this.pluginConfigEntries = pluginConfigEntries;
-    }
-
-    @Override
-    public void onPreMerge(
-        final Repository repo,
-        final CodeReviewCommit commit,
-        final ProjectState destProject,
-        final Branch.NameKey destBranch,
-        final PatchSet.Id patchSetId,
-        IdentifiedUser caller)
-        throws MergeValidationException {
-      if (RefNames.REFS_CONFIG.equals(destBranch.get())) {
-        final Project.NameKey newParent;
-        try {
-          ProjectConfig cfg = new ProjectConfig(destProject.getNameKey());
-          cfg.load(repo, commit);
-          newParent = cfg.getProject().getParent(allProjectsName);
-          final Project.NameKey oldParent = destProject.getProject().getParent(allProjectsName);
-          if (oldParent == null) {
-            // update of the 'All-Projects' project
-            if (newParent != null) {
-              throw new MergeValidationException(ROOT_NO_PARENT);
-            }
-          } else {
-            if (!oldParent.equals(newParent)) {
-              try {
-                permissionBackend.user(caller).check(GlobalPermission.ADMINISTRATE_SERVER);
-              } catch (AuthException e) {
-                throw new MergeValidationException(SET_BY_ADMIN);
-              } catch (PermissionBackendException e) {
-                log.warn("Cannot check ADMINISTRATE_SERVER", e);
-                throw new MergeValidationException("validation unavailable");
-              }
-
-              if (projectCache.get(newParent) == null) {
-                throw new MergeValidationException(PARENT_NOT_FOUND);
-              }
-            }
-          }
-
-          for (Entry<ProjectConfigEntry> e : pluginConfigEntries) {
-            PluginConfig pluginCfg = cfg.getPluginConfig(e.getPluginName());
-            ProjectConfigEntry configEntry = e.getProvider().get();
-
-            String value = pluginCfg.getString(e.getExportName());
-            String oldValue =
-                destProject
-                    .getConfig()
-                    .getPluginConfig(e.getPluginName())
-                    .getString(e.getExportName());
-
-            if ((value == null ? oldValue != null : !value.equals(oldValue))
-                && !configEntry.isEditable(destProject)) {
-              throw new MergeValidationException(PLUGIN_VALUE_NOT_EDITABLE);
-            }
-
-            if (ProjectConfigEntryType.LIST.equals(configEntry.getType())
-                && value != null
-                && !configEntry.getPermittedValues().contains(value)) {
-              throw new MergeValidationException(PLUGIN_VALUE_NOT_PERMITTED);
-            }
-          }
-        } catch (ConfigInvalidException | IOException e) {
-          throw new MergeValidationException(INVALID_CONFIG);
-        }
-      }
-    }
-  }
-
-  /** Execute merge validation plug-ins */
-  public static class PluginMergeValidationListener implements MergeValidationListener {
-    private final DynamicSet<MergeValidationListener> mergeValidationListeners;
-
-    public PluginMergeValidationListener(
-        DynamicSet<MergeValidationListener> mergeValidationListeners) {
-      this.mergeValidationListeners = mergeValidationListeners;
-    }
-
-    @Override
-    public void onPreMerge(
-        Repository repo,
-        CodeReviewCommit commit,
-        ProjectState destProject,
-        Branch.NameKey destBranch,
-        PatchSet.Id patchSetId,
-        IdentifiedUser caller)
-        throws MergeValidationException {
-      for (MergeValidationListener validator : mergeValidationListeners) {
-        validator.onPreMerge(repo, commit, destProject, destBranch, patchSetId, caller);
-      }
-    }
-  }
-
-  public static class AccountMergeValidator implements MergeValidationListener {
-    public interface Factory {
-      AccountMergeValidator create();
-    }
-
-    private final Provider<ReviewDb> dbProvider;
-    private final AllUsersName allUsersName;
-    private final ChangeData.Factory changeDataFactory;
-    private final AccountValidator accountValidator;
-
-    @Inject
-    public AccountMergeValidator(
-        Provider<ReviewDb> dbProvider,
-        AllUsersName allUsersName,
-        ChangeData.Factory changeDataFactory,
-        AccountValidator accountValidator) {
-      this.dbProvider = dbProvider;
-      this.allUsersName = allUsersName;
-      this.changeDataFactory = changeDataFactory;
-      this.accountValidator = accountValidator;
-    }
-
-    @Override
-    public void onPreMerge(
-        Repository repo,
-        CodeReviewCommit commit,
-        ProjectState destProject,
-        Branch.NameKey destBranch,
-        PatchSet.Id patchSetId,
-        IdentifiedUser caller)
-        throws MergeValidationException {
-      Account.Id accountId = Account.Id.fromRef(destBranch.get());
-      if (!allUsersName.equals(destProject.getNameKey()) || accountId == null) {
-        return;
-      }
-
-      ChangeData cd =
-          changeDataFactory.create(
-              dbProvider.get(), destProject.getProject().getNameKey(), patchSetId.getParentKey());
-      try {
-        if (!cd.currentFilePaths().contains(AccountConfig.ACCOUNT_CONFIG)) {
-          return;
-        }
-      } catch (IOException | OrmException e) {
-        log.error("Cannot validate account update", e);
-        throw new MergeValidationException("account validation unavailable");
-      }
-
-      try (RevWalk rw = new RevWalk(repo)) {
-        List<String> errorMessages = accountValidator.validate(accountId, rw, null, commit);
-        if (!errorMessages.isEmpty()) {
-          throw new MergeValidationException(
-              "invalid account configuration: " + Joiner.on("; ").join(errorMessages));
-        }
-      } catch (IOException e) {
-        log.error("Cannot validate account update", e);
-        throw new MergeValidationException("account validation unavailable");
-      }
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/OnSubmitValidationListener.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/OnSubmitValidationListener.java
deleted file mode 100644
index a626998..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/OnSubmitValidationListener.java
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.git.validators;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.gerrit.extensions.annotations.ExtensionPoint;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.git.RefCache;
-import com.google.gerrit.server.update.ChainedReceiveCommands;
-import com.google.gerrit.server.validators.ValidationException;
-import java.io.IOException;
-import java.util.Optional;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.ReceiveCommand;
-
-/**
- * Listener to validate ref updates performed during submit operation.
- *
- * <p>As submit strategies may generate new commits (e.g. Cherry Pick), this listener allows
- * validation of resulting new commit before destination branch is updated and new patchset ref is
- * created.
- *
- * <p>If you only care about validating the change being submitted and not the resulting new commit,
- * consider using {@link MergeValidationListener} instead.
- */
-@ExtensionPoint
-public interface OnSubmitValidationListener {
-  class Arguments {
-    private Project.NameKey project;
-    private RevWalk rw;
-    private ImmutableMap<String, ReceiveCommand> commands;
-    private RefCache refs;
-
-    /**
-     * @param project project.
-     * @param rw revwalk that can read unflushed objects from {@code refs}.
-     * @param commands commands to be executed.
-     */
-    Arguments(Project.NameKey project, RevWalk rw, ChainedReceiveCommands commands) {
-      this.project = checkNotNull(project);
-      this.rw = checkNotNull(rw);
-      this.refs = checkNotNull(commands);
-      this.commands = ImmutableMap.copyOf(commands.getCommands());
-    }
-
-    /** Get the project name for this operation. */
-    public Project.NameKey getProject() {
-      return project;
-    }
-
-    /**
-     * Get a revwalk for this operation.
-     *
-     * <p>This instance is able to read all objects mentioned in {@link #getCommands()} and {@link
-     * #getRef(String)}.
-     *
-     * @return open revwalk.
-     */
-    public RevWalk getRevWalk() {
-      return rw;
-    }
-
-    /**
-     * @return a map from ref to commands covering all ref operations to be performed on this
-     *     repository as part of the ongoing submit operation.
-     */
-    public ImmutableMap<String, ReceiveCommand> getCommands() {
-      return commands;
-    }
-
-    /**
-     * Get a ref from the repository.
-     *
-     * @param name ref name; can be any ref, not just the ones mentioned in {@link #getCommands()}.
-     * @return latest value of a ref in the repository, as if all commands from {@link
-     *     #getCommands()} had already been applied.
-     * @throws IOException if an error occurred reading the ref.
-     */
-    public Optional<ObjectId> getRef(String name) throws IOException {
-      return refs.get(name);
-    }
-  }
-
-  /**
-   * Called right before branch is updated with new commit or commits as a result of submit.
-   *
-   * <p>If ValidationException is thrown, submitting is aborted.
-   */
-  void preBranchUpdate(Arguments args) throws ValidationException;
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/OnSubmitValidators.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/OnSubmitValidators.java
deleted file mode 100644
index 460889c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/OnSubmitValidators.java
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.git.validators;
-
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.git.IntegrationException;
-import com.google.gerrit.server.git.validators.OnSubmitValidationListener.Arguments;
-import com.google.gerrit.server.update.ChainedReceiveCommands;
-import com.google.gerrit.server.validators.ValidationException;
-import com.google.inject.Inject;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-public class OnSubmitValidators {
-  public interface Factory {
-    OnSubmitValidators create();
-  }
-
-  private final DynamicSet<OnSubmitValidationListener> listeners;
-
-  @Inject
-  OnSubmitValidators(DynamicSet<OnSubmitValidationListener> listeners) {
-    this.listeners = listeners;
-  }
-
-  public void validate(
-      Project.NameKey project, ObjectReader objectReader, ChainedReceiveCommands commands)
-      throws IntegrationException {
-    try (RevWalk rw = new RevWalk(objectReader)) {
-      Arguments args = new Arguments(project, rw, commands);
-      for (OnSubmitValidationListener listener : listeners) {
-        listener.preBranchUpdate(args);
-      }
-    } catch (ValidationException e) {
-      throw new IntegrationException(e.getMessage());
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/RefOperationValidators.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/RefOperationValidators.java
deleted file mode 100644
index 8047a99a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/RefOperationValidators.java
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.git.validators;
-
-import com.google.common.base.Predicate;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.events.RefReceivedEvent;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.validators.ValidationException;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.util.ArrayList;
-import java.util.List;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.transport.ReceiveCommand;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class RefOperationValidators {
-  private static final GetErrorMessages GET_ERRORS = new GetErrorMessages();
-  private static final Logger LOG = LoggerFactory.getLogger(RefOperationValidators.class);
-
-  public interface Factory {
-    RefOperationValidators create(Project project, IdentifiedUser user, ReceiveCommand cmd);
-  }
-
-  public static ReceiveCommand getCommand(RefUpdate update, ReceiveCommand.Type type) {
-    return new ReceiveCommand(
-        update.getExpectedOldObjectId(), update.getNewObjectId(), update.getName(), type);
-  }
-
-  private final PermissionBackend.WithUser perm;
-  private final AllUsersName allUsersName;
-  private final DynamicSet<RefOperationValidationListener> refOperationValidationListeners;
-  private final RefReceivedEvent event;
-
-  @Inject
-  RefOperationValidators(
-      PermissionBackend permissionBackend,
-      AllUsersName allUsersName,
-      DynamicSet<RefOperationValidationListener> refOperationValidationListeners,
-      @Assisted Project project,
-      @Assisted IdentifiedUser user,
-      @Assisted ReceiveCommand cmd) {
-    this.perm = permissionBackend.user(user);
-    this.allUsersName = allUsersName;
-    this.refOperationValidationListeners = refOperationValidationListeners;
-    event = new RefReceivedEvent();
-    event.command = cmd;
-    event.project = project;
-    event.user = user;
-  }
-
-  public List<ValidationMessage> validateForRefOperation() throws RefOperationValidationException {
-    List<ValidationMessage> messages = new ArrayList<>();
-    boolean withException = false;
-    List<RefOperationValidationListener> listeners = new ArrayList<>();
-    listeners.add(new DisallowCreationAndDeletionOfUserBranches(perm, allUsersName));
-    refOperationValidationListeners.forEach(l -> listeners.add(l));
-    try {
-      for (RefOperationValidationListener listener : listeners) {
-        messages.addAll(listener.onRefOperation(event));
-      }
-    } catch (ValidationException e) {
-      messages.add(new ValidationMessage(e.getMessage(), true));
-      withException = true;
-    }
-
-    if (withException) {
-      throwException(messages, event);
-    }
-
-    return messages;
-  }
-
-  private void throwException(Iterable<ValidationMessage> messages, RefReceivedEvent event)
-      throws RefOperationValidationException {
-    Iterable<ValidationMessage> errors = Iterables.filter(messages, GET_ERRORS);
-    String header =
-        String.format(
-            "Ref \"%s\" %S in project %s validation failed",
-            event.command.getRefName(), event.command.getType(), event.project.getName());
-    LOG.error(header);
-    throw new RefOperationValidationException(header, errors);
-  }
-
-  private static class GetErrorMessages implements Predicate<ValidationMessage> {
-    @Override
-    public boolean apply(ValidationMessage input) {
-      return input.isError();
-    }
-  }
-
-  private static class DisallowCreationAndDeletionOfUserBranches
-      implements RefOperationValidationListener {
-    private final PermissionBackend.WithUser perm;
-    private final AllUsersName allUsersName;
-
-    DisallowCreationAndDeletionOfUserBranches(
-        PermissionBackend.WithUser perm, AllUsersName allUsersName) {
-      this.perm = perm;
-      this.allUsersName = allUsersName;
-    }
-
-    @Override
-    public List<ValidationMessage> onRefOperation(RefReceivedEvent refEvent)
-        throws ValidationException {
-      if (refEvent.project.getNameKey().equals(allUsersName)
-          && (refEvent.command.getRefName().startsWith(RefNames.REFS_USERS)
-              && !refEvent.command.getRefName().equals(RefNames.REFS_USERS_DEFAULT))) {
-        if (refEvent.command.getType().equals(ReceiveCommand.Type.CREATE)) {
-          try {
-            perm.check(GlobalPermission.ACCESS_DATABASE);
-          } catch (AuthException | PermissionBackendException e) {
-            throw new ValidationException("Not allowed to create user branch.");
-          }
-          if (Account.Id.fromRef(refEvent.command.getRefName()) == null) {
-            throw new ValidationException(
-                String.format(
-                    "Not allowed to create non-user branch under %s.", RefNames.REFS_USERS));
-          }
-        } else if (refEvent.command.getType().equals(ReceiveCommand.Type.DELETE)) {
-          try {
-            perm.check(GlobalPermission.ACCESS_DATABASE);
-          } catch (AuthException | PermissionBackendException e) {
-            throw new ValidationException("Not allowed to delete user branch.");
-          }
-        }
-      }
-      return ImmutableList.of();
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/UploadValidators.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/UploadValidators.java
deleted file mode 100644
index 84d4586..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/UploadValidators.java
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.git.validators;
-
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.validators.ValidationException;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.util.Collection;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.transport.PreUploadHook;
-import org.eclipse.jgit.transport.ServiceMayNotContinueException;
-import org.eclipse.jgit.transport.UploadPack;
-
-public class UploadValidators implements PreUploadHook {
-
-  private final DynamicSet<UploadValidationListener> uploadValidationListeners;
-  private final Project project;
-  private final Repository repository;
-  private final String remoteHost;
-
-  public interface Factory {
-    UploadValidators create(Project project, Repository repository, String remoteAddress);
-  }
-
-  @Inject
-  UploadValidators(
-      DynamicSet<UploadValidationListener> uploadValidationListeners,
-      @Assisted Project project,
-      @Assisted Repository repository,
-      @Assisted String remoteHost) {
-    this.uploadValidationListeners = uploadValidationListeners;
-    this.project = project;
-    this.repository = repository;
-    this.remoteHost = remoteHost;
-  }
-
-  @Override
-  public void onSendPack(
-      UploadPack up, Collection<? extends ObjectId> wants, Collection<? extends ObjectId> haves)
-      throws ServiceMayNotContinueException {
-    for (UploadValidationListener validator : uploadValidationListeners) {
-      try {
-        validator.onPreUpload(repository, project, remoteHost, up, wants, haves);
-      } catch (ValidationException e) {
-        throw new UploadValidationException(e.getMessage());
-      }
-    }
-  }
-
-  @Override
-  public void onBeginNegotiateRound(
-      UploadPack up, Collection<? extends ObjectId> wants, int cntOffered)
-      throws ServiceMayNotContinueException {
-    for (UploadValidationListener validator : uploadValidationListeners) {
-      try {
-        validator.onBeginNegotiate(repository, project, remoteHost, up, wants, cntOffered);
-      } catch (ValidationException e) {
-        throw new UploadValidationException(e.getMessage());
-      }
-    }
-  }
-
-  @Override
-  public void onEndNegotiateRound(
-      UploadPack up,
-      Collection<? extends ObjectId> wants,
-      int cntCommon,
-      int cntNotFound,
-      boolean ready)
-      throws ServiceMayNotContinueException {}
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/ValidationMessage.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/ValidationMessage.java
deleted file mode 100644
index e1098aa..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/ValidationMessage.java
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.git.validators;
-
-public class ValidationMessage {
-  private final String message;
-  private final boolean isError;
-
-  public ValidationMessage(String message, boolean isError) {
-    this.message = message;
-    this.isError = isError;
-  }
-
-  public String getMessage() {
-    return message;
-  }
-
-  public boolean isError() {
-    return isError;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/AddMembers.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/AddMembers.java
deleted file mode 100644
index 6e0e512..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/AddMembers.java
+++ /dev/null
@@ -1,252 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.group;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Lists;
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.extensions.client.AuthType;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.DefaultInput;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.AccountException;
-import com.google.gerrit.server.account.AccountLoader;
-import com.google.gerrit.server.account.AccountManager;
-import com.google.gerrit.server.account.AccountResolver;
-import com.google.gerrit.server.account.AccountsCollection;
-import com.google.gerrit.server.account.AuthRequest;
-import com.google.gerrit.server.account.GroupControl;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.config.AuthConfig;
-import com.google.gerrit.server.group.AddMembers.Input;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-@Singleton
-public class AddMembers implements RestModifyView<GroupResource, Input> {
-  public static class Input {
-    @DefaultInput String _oneMember;
-
-    List<String> members;
-
-    public static Input fromMembers(List<String> members) {
-      Input in = new Input();
-      in.members = members;
-      return in;
-    }
-
-    static Input init(Input in) {
-      if (in == null) {
-        in = new Input();
-      }
-      if (in.members == null) {
-        in.members = Lists.newArrayListWithCapacity(1);
-      }
-      if (!Strings.isNullOrEmpty(in._oneMember)) {
-        in.members.add(in._oneMember);
-      }
-      return in;
-    }
-  }
-
-  private final AccountManager accountManager;
-  private final AuthType authType;
-  private final AccountsCollection accounts;
-  private final AccountResolver accountResolver;
-  private final AccountCache accountCache;
-  private final AccountLoader.Factory infoFactory;
-  private final Provider<ReviewDb> db;
-  private final Provider<GroupsUpdate> groupsUpdateProvider;
-
-  @Inject
-  AddMembers(
-      AccountManager accountManager,
-      AuthConfig authConfig,
-      AccountsCollection accounts,
-      AccountResolver accountResolver,
-      AccountCache accountCache,
-      AccountLoader.Factory infoFactory,
-      Provider<ReviewDb> db,
-      @UserInitiated Provider<GroupsUpdate> groupsUpdateProvider) {
-    this.accountManager = accountManager;
-    this.authType = authConfig.getAuthType();
-    this.accounts = accounts;
-    this.accountResolver = accountResolver;
-    this.accountCache = accountCache;
-    this.infoFactory = infoFactory;
-    this.db = db;
-    this.groupsUpdateProvider = groupsUpdateProvider;
-  }
-
-  @Override
-  public List<AccountInfo> apply(GroupResource resource, Input input)
-      throws AuthException, MethodNotAllowedException, UnprocessableEntityException, OrmException,
-          IOException, ConfigInvalidException, ResourceNotFoundException {
-    GroupDescription.Internal internalGroup =
-        resource.asInternalGroup().orElseThrow(MethodNotAllowedException::new);
-    input = Input.init(input);
-
-    GroupControl control = resource.getControl();
-    if (!control.canAddMember()) {
-      throw new AuthException("Cannot add members to group " + internalGroup.getName());
-    }
-
-    Set<Account.Id> newMemberIds = new HashSet<>();
-    for (String nameOrEmailOrId : input.members) {
-      Account a = findAccount(nameOrEmailOrId);
-      if (!a.isActive()) {
-        throw new UnprocessableEntityException(
-            String.format("Account Inactive: %s", nameOrEmailOrId));
-      }
-      newMemberIds.add(a.getId());
-    }
-
-    AccountGroup.UUID groupUuid = internalGroup.getGroupUUID();
-    try {
-      addMembers(groupUuid, newMemberIds);
-    } catch (NoSuchGroupException e) {
-      throw new ResourceNotFoundException(String.format("Group %s not found", groupUuid));
-    }
-    return toAccountInfoList(newMemberIds);
-  }
-
-  Account findAccount(String nameOrEmailOrId)
-      throws AuthException, UnprocessableEntityException, OrmException, IOException,
-          ConfigInvalidException {
-    try {
-      return accounts.parse(nameOrEmailOrId).getAccount();
-    } catch (UnprocessableEntityException e) {
-      // might be because the account does not exist or because the account is
-      // not visible
-      switch (authType) {
-        case HTTP_LDAP:
-        case CLIENT_SSL_CERT_LDAP:
-        case LDAP:
-          if (accountResolver.find(nameOrEmailOrId) == null) {
-            // account does not exist, try to create it
-            Account a = createAccountByLdap(nameOrEmailOrId);
-            if (a != null) {
-              return a;
-            }
-          }
-          break;
-        case CUSTOM_EXTENSION:
-        case DEVELOPMENT_BECOME_ANY_ACCOUNT:
-        case HTTP:
-        case LDAP_BIND:
-        case OAUTH:
-        case OPENID:
-        case OPENID_SSO:
-        default:
-      }
-      throw e;
-    }
-  }
-
-  public void addMembers(AccountGroup.UUID groupUuid, Collection<? extends Account.Id> newMemberIds)
-      throws OrmException, IOException, NoSuchGroupException {
-    groupsUpdateProvider
-        .get()
-        .addGroupMembers(db.get(), groupUuid, ImmutableSet.copyOf(newMemberIds));
-  }
-
-  private Account createAccountByLdap(String user) throws IOException {
-    if (!ExternalId.isValidUsername(user)) {
-      return null;
-    }
-
-    try {
-      AuthRequest req = AuthRequest.forUser(user);
-      req.setSkipAuthentication(true);
-      return accountCache.get(accountManager.authenticate(req).getAccountId()).getAccount();
-    } catch (AccountException e) {
-      return null;
-    }
-  }
-
-  private List<AccountInfo> toAccountInfoList(Set<Account.Id> accountIds) throws OrmException {
-    List<AccountInfo> result = new ArrayList<>();
-    AccountLoader loader = infoFactory.create(true);
-    for (Account.Id accId : accountIds) {
-      result.add(loader.get(accId));
-    }
-    loader.fill();
-    return result;
-  }
-
-  static class PutMember implements RestModifyView<GroupResource, PutMember.Input> {
-    static class Input {}
-
-    private final AddMembers put;
-    private final String id;
-
-    PutMember(AddMembers put, String id) {
-      this.put = put;
-      this.id = id;
-    }
-
-    @Override
-    public AccountInfo apply(GroupResource resource, PutMember.Input input)
-        throws AuthException, MethodNotAllowedException, ResourceNotFoundException, OrmException,
-            IOException, ConfigInvalidException {
-      AddMembers.Input in = new AddMembers.Input();
-      in._oneMember = id;
-      try {
-        List<AccountInfo> list = put.apply(resource, in);
-        if (list.size() == 1) {
-          return list.get(0);
-        }
-        throw new IllegalStateException();
-      } catch (UnprocessableEntityException e) {
-        throw new ResourceNotFoundException(id);
-      }
-    }
-  }
-
-  @Singleton
-  static class UpdateMember implements RestModifyView<MemberResource, PutMember.Input> {
-    private final GetMember get;
-
-    @Inject
-    UpdateMember(GetMember get) {
-      this.get = get;
-    }
-
-    @Override
-    public AccountInfo apply(MemberResource resource, PutMember.Input input) throws OrmException {
-      // Do nothing, the user is already a member.
-      return get.apply(resource);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/AddSubgroups.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/AddSubgroups.java
deleted file mode 100644
index 2ce168f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/AddSubgroups.java
+++ /dev/null
@@ -1,161 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.group;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.extensions.common.GroupInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.DefaultInput;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.account.GroupControl;
-import com.google.gerrit.server.group.AddSubgroups.Input;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-@Singleton
-public class AddSubgroups implements RestModifyView<GroupResource, Input> {
-  public static class Input {
-    @DefaultInput String _oneGroup;
-
-    public List<String> groups;
-
-    public static Input fromGroups(List<String> groups) {
-      Input in = new Input();
-      in.groups = groups;
-      return in;
-    }
-
-    static Input init(Input in) {
-      if (in == null) {
-        in = new Input();
-      }
-      if (in.groups == null) {
-        in.groups = Lists.newArrayListWithCapacity(1);
-      }
-      if (!Strings.isNullOrEmpty(in._oneGroup)) {
-        in.groups.add(in._oneGroup);
-      }
-      return in;
-    }
-  }
-
-  private final GroupsCollection groupsCollection;
-  private final Provider<ReviewDb> db;
-  private final Provider<GroupsUpdate> groupsUpdateProvider;
-  private final GroupJson json;
-
-  @Inject
-  public AddSubgroups(
-      GroupsCollection groupsCollection,
-      Provider<ReviewDb> db,
-      @UserInitiated Provider<GroupsUpdate> groupsUpdateProvider,
-      GroupJson json) {
-    this.groupsCollection = groupsCollection;
-    this.db = db;
-    this.groupsUpdateProvider = groupsUpdateProvider;
-    this.json = json;
-  }
-
-  @Override
-  public List<GroupInfo> apply(GroupResource resource, Input input)
-      throws MethodNotAllowedException, AuthException, UnprocessableEntityException, OrmException,
-          ResourceNotFoundException, IOException {
-    GroupDescription.Internal group =
-        resource.asInternalGroup().orElseThrow(MethodNotAllowedException::new);
-    input = Input.init(input);
-
-    GroupControl control = resource.getControl();
-    if (!control.canAddGroup()) {
-      throw new AuthException(String.format("Cannot add groups to group %s", group.getName()));
-    }
-
-    List<GroupInfo> result = new ArrayList<>();
-    Set<AccountGroup.UUID> subgroupUuids = new HashSet<>();
-    for (String subgroupIdentifier : input.groups) {
-      GroupDescription.Basic subgroup = groupsCollection.parse(subgroupIdentifier);
-      subgroupUuids.add(subgroup.getGroupUUID());
-      result.add(json.format(subgroup));
-    }
-
-    AccountGroup.UUID groupUuid = group.getGroupUUID();
-    try {
-      groupsUpdateProvider.get().addSubgroups(db.get(), groupUuid, subgroupUuids);
-    } catch (NoSuchGroupException e) {
-      throw new ResourceNotFoundException(String.format("Group %s not found", groupUuid));
-    }
-    return result;
-  }
-
-  static class PutSubgroup implements RestModifyView<GroupResource, PutSubgroup.Input> {
-    static class Input {}
-
-    private final AddSubgroups addSubgroups;
-    private final String id;
-
-    PutSubgroup(AddSubgroups addSubgroups, String id) {
-      this.addSubgroups = addSubgroups;
-      this.id = id;
-    }
-
-    @Override
-    public GroupInfo apply(GroupResource resource, Input input)
-        throws AuthException, MethodNotAllowedException, ResourceNotFoundException, OrmException,
-            IOException {
-      AddSubgroups.Input in = new AddSubgroups.Input();
-      in.groups = ImmutableList.of(id);
-      try {
-        List<GroupInfo> list = addSubgroups.apply(resource, in);
-        if (list.size() == 1) {
-          return list.get(0);
-        }
-        throw new IllegalStateException();
-      } catch (UnprocessableEntityException e) {
-        throw new ResourceNotFoundException(id);
-      }
-    }
-  }
-
-  @Singleton
-  static class UpdateSubgroup implements RestModifyView<SubgroupResource, PutSubgroup.Input> {
-    private final Provider<GetSubgroup> get;
-
-    @Inject
-    UpdateSubgroup(Provider<GetSubgroup> get) {
-      this.get = get;
-    }
-
-    @Override
-    public GroupInfo apply(SubgroupResource resource, PutSubgroup.Input input) throws OrmException {
-      // Do nothing, the group is already included.
-      return get.get().apply(resource);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/CreateGroup.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/CreateGroup.java
deleted file mode 100644
index e55397e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/CreateGroup.java
+++ /dev/null
@@ -1,219 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.group;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.common.data.GroupDescriptions;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
-import com.google.gerrit.extensions.api.groups.GroupInput;
-import com.google.gerrit.extensions.client.ListGroupsOption;
-import com.google.gerrit.extensions.common.GroupInfo;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.extensions.restapi.Url;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.CreateGroupArgs;
-import com.google.gerrit.server.account.GroupCache;
-import com.google.gerrit.server.account.GroupUUID;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.validators.GroupCreationValidationListener;
-import com.google.gerrit.server.validators.ValidationException;
-import com.google.gwtorm.server.OrmDuplicateKeyException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Locale;
-import java.util.Optional;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.PersonIdent;
-
-@RequiresCapability(GlobalCapability.CREATE_GROUP)
-public class CreateGroup implements RestModifyView<TopLevelResource, GroupInput> {
-  public interface Factory {
-    CreateGroup create(@Assisted String name);
-  }
-
-  private final Provider<IdentifiedUser> self;
-  private final PersonIdent serverIdent;
-  private final ReviewDb db;
-  private final Provider<GroupsUpdate> groupsUpdateProvider;
-  private final GroupCache groupCache;
-  private final GroupsCollection groups;
-  private final GroupJson json;
-  private final DynamicSet<GroupCreationValidationListener> groupCreationValidationListeners;
-  private final AddMembers addMembers;
-  private final SystemGroupBackend systemGroupBackend;
-  private final boolean defaultVisibleToAll;
-  private final String name;
-
-  @Inject
-  CreateGroup(
-      Provider<IdentifiedUser> self,
-      @GerritPersonIdent PersonIdent serverIdent,
-      ReviewDb db,
-      @UserInitiated Provider<GroupsUpdate> groupsUpdateProvider,
-      GroupCache groupCache,
-      GroupsCollection groups,
-      GroupJson json,
-      DynamicSet<GroupCreationValidationListener> groupCreationValidationListeners,
-      AddMembers addMembers,
-      SystemGroupBackend systemGroupBackend,
-      @GerritServerConfig Config cfg,
-      @Assisted String name) {
-    this.self = self;
-    this.serverIdent = serverIdent;
-    this.db = db;
-    this.groupsUpdateProvider = groupsUpdateProvider;
-    this.groupCache = groupCache;
-    this.groups = groups;
-    this.json = json;
-    this.groupCreationValidationListeners = groupCreationValidationListeners;
-    this.addMembers = addMembers;
-    this.systemGroupBackend = systemGroupBackend;
-    this.defaultVisibleToAll = cfg.getBoolean("groups", "newGroupsVisibleToAll", false);
-    this.name = name;
-  }
-
-  public CreateGroup addOption(ListGroupsOption o) {
-    json.addOption(o);
-    return this;
-  }
-
-  public CreateGroup addOptions(Collection<ListGroupsOption> o) {
-    json.addOptions(o);
-    return this;
-  }
-
-  @Override
-  public GroupInfo apply(TopLevelResource resource, GroupInput input)
-      throws AuthException, BadRequestException, UnprocessableEntityException,
-          ResourceConflictException, OrmException, IOException, ConfigInvalidException,
-          ResourceNotFoundException {
-    if (input == null) {
-      input = new GroupInput();
-    }
-    if (input.name != null && !name.equals(input.name)) {
-      throw new BadRequestException("name must match URL");
-    }
-
-    AccountGroup.Id ownerId = owner(input);
-    CreateGroupArgs args = new CreateGroupArgs();
-    args.setGroupName(name);
-    args.groupDescription = Strings.emptyToNull(input.description);
-    args.visibleToAll = MoreObjects.firstNonNull(input.visibleToAll, defaultVisibleToAll);
-    args.ownerGroupId = ownerId;
-    if (input.members != null && !input.members.isEmpty()) {
-      List<Account.Id> members = new ArrayList<>();
-      for (String nameOrEmailOrId : input.members) {
-        Account a = addMembers.findAccount(nameOrEmailOrId);
-        if (!a.isActive()) {
-          throw new UnprocessableEntityException(
-              String.format("Account Inactive: %s", nameOrEmailOrId));
-        }
-        members.add(a.getId());
-      }
-      args.initialMembers = members;
-    } else {
-      args.initialMembers =
-          ownerId == null
-              ? Collections.singleton(self.get().getAccountId())
-              : Collections.<Account.Id>emptySet();
-    }
-
-    for (GroupCreationValidationListener l : groupCreationValidationListeners) {
-      try {
-        l.validateNewGroup(args);
-      } catch (ValidationException e) {
-        throw new ResourceConflictException(e.getMessage(), e);
-      }
-    }
-
-    return json.format(GroupDescriptions.forAccountGroup(createGroup(args)));
-  }
-
-  private AccountGroup.Id owner(GroupInput input) throws UnprocessableEntityException {
-    if (input.ownerId != null) {
-      GroupDescription.Internal d = groups.parseInternal(Url.decode(input.ownerId));
-      return d.getId();
-    }
-    return null;
-  }
-
-  private AccountGroup createGroup(CreateGroupArgs createGroupArgs)
-      throws OrmException, ResourceConflictException, IOException {
-
-    String nameLower = createGroupArgs.getGroupName().toLowerCase(Locale.US);
-
-    for (String name : systemGroupBackend.getNames()) {
-      if (name.toLowerCase(Locale.US).equals(nameLower)) {
-        throw new ResourceConflictException("group '" + name + "' already exists");
-      }
-    }
-
-    for (String name : systemGroupBackend.getReservedNames()) {
-      if (name.toLowerCase(Locale.US).equals(nameLower)) {
-        throw new ResourceConflictException("group name '" + name + "' is reserved");
-      }
-    }
-
-    AccountGroup.Id groupId = new AccountGroup.Id(db.nextAccountGroupId());
-    AccountGroup.UUID uuid =
-        GroupUUID.make(
-            createGroupArgs.getGroupName(),
-            self.get().newCommitterIdent(serverIdent.getWhen(), serverIdent.getTimeZone()));
-    AccountGroup group =
-        new AccountGroup(createGroupArgs.getGroup(), groupId, uuid, TimeUtil.nowTs());
-    group.setVisibleToAll(createGroupArgs.visibleToAll);
-    if (createGroupArgs.ownerGroupId != null) {
-      Optional<InternalGroup> ownerGroup = groupCache.get(createGroupArgs.ownerGroupId);
-      ownerGroup.map(InternalGroup::getGroupUUID).ifPresent(group::setOwnerGroupUUID);
-    }
-    if (createGroupArgs.groupDescription != null) {
-      group.setDescription(createGroupArgs.groupDescription);
-    }
-    try {
-      groupsUpdateProvider
-          .get()
-          .addGroup(db, group, ImmutableSet.copyOf(createGroupArgs.initialMembers));
-    } catch (OrmDuplicateKeyException e) {
-      throw new ResourceConflictException(
-          "group '" + createGroupArgs.getGroupName() + "' already exists");
-    }
-
-    return group;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/DbGroupMemberAuditListener.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/DbGroupMemberAuditListener.java
deleted file mode 100644
index 0d44289..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/DbGroupMemberAuditListener.java
+++ /dev/null
@@ -1,195 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.group;
-
-import com.google.common.base.Joiner;
-import com.google.gerrit.audit.GroupMemberAuditListener;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.AccountGroupById;
-import com.google.gerrit.reviewdb.client.AccountGroupByIdAud;
-import com.google.gerrit.reviewdb.client.AccountGroupMember;
-import com.google.gerrit.reviewdb.client.AccountGroupMemberAudit;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.GroupCache;
-import com.google.gerrit.server.account.UniversalGroupBackend;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Inject;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-class DbGroupMemberAuditListener implements GroupMemberAuditListener {
-  private static final Logger log = LoggerFactory.getLogger(DbGroupMemberAuditListener.class);
-
-  private final SchemaFactory<ReviewDb> schema;
-  private final AccountCache accountCache;
-  private final GroupCache groupCache;
-  private final UniversalGroupBackend groupBackend;
-
-  @Inject
-  DbGroupMemberAuditListener(
-      SchemaFactory<ReviewDb> schema,
-      AccountCache accountCache,
-      GroupCache groupCache,
-      UniversalGroupBackend groupBackend) {
-    this.schema = schema;
-    this.accountCache = accountCache;
-    this.groupCache = groupCache;
-    this.groupBackend = groupBackend;
-  }
-
-  @Override
-  public void onAddAccountsToGroup(Account.Id me, Collection<AccountGroupMember> added) {
-    List<AccountGroupMemberAudit> auditInserts = new ArrayList<>();
-    for (AccountGroupMember m : added) {
-      AccountGroupMemberAudit audit = new AccountGroupMemberAudit(m, me, TimeUtil.nowTs());
-      auditInserts.add(audit);
-    }
-    try (ReviewDb db = schema.open()) {
-      db.accountGroupMembersAudit().insert(auditInserts);
-    } catch (OrmException e) {
-      logOrmExceptionForAccounts(
-          "Cannot log add accounts to group event performed by user", me, added, e);
-    }
-  }
-
-  @Override
-  public void onDeleteAccountsFromGroup(Account.Id me, Collection<AccountGroupMember> removed) {
-    List<AccountGroupMemberAudit> auditInserts = new ArrayList<>();
-    List<AccountGroupMemberAudit> auditUpdates = new ArrayList<>();
-    try (ReviewDb db = schema.open()) {
-      for (AccountGroupMember m : removed) {
-        AccountGroupMemberAudit audit = null;
-        for (AccountGroupMemberAudit a :
-            db.accountGroupMembersAudit().byGroupAccount(m.getAccountGroupId(), m.getAccountId())) {
-          if (a.isActive()) {
-            audit = a;
-            break;
-          }
-        }
-
-        if (audit != null) {
-          audit.removed(me, TimeUtil.nowTs());
-          auditUpdates.add(audit);
-        } else {
-          audit = new AccountGroupMemberAudit(m, me, TimeUtil.nowTs());
-          audit.removedLegacy();
-          auditInserts.add(audit);
-        }
-      }
-      db.accountGroupMembersAudit().update(auditUpdates);
-      db.accountGroupMembersAudit().insert(auditInserts);
-    } catch (OrmException e) {
-      logOrmExceptionForAccounts(
-          "Cannot log delete accounts from group event performed by user", me, removed, e);
-    }
-  }
-
-  @Override
-  public void onAddGroupsToGroup(Account.Id me, Collection<AccountGroupById> added) {
-    List<AccountGroupByIdAud> includesAudit = new ArrayList<>();
-    for (AccountGroupById groupInclude : added) {
-      AccountGroupByIdAud audit = new AccountGroupByIdAud(groupInclude, me, TimeUtil.nowTs());
-      includesAudit.add(audit);
-    }
-    try (ReviewDb db = schema.open()) {
-      db.accountGroupByIdAud().insert(includesAudit);
-    } catch (OrmException e) {
-      logOrmExceptionForGroups(
-          "Cannot log add groups to group event performed by user", me, added, e);
-    }
-  }
-
-  @Override
-  public void onDeleteGroupsFromGroup(Account.Id me, Collection<AccountGroupById> removed) {
-    final List<AccountGroupByIdAud> auditUpdates = new ArrayList<>();
-    try (ReviewDb db = schema.open()) {
-      for (AccountGroupById g : removed) {
-        AccountGroupByIdAud audit = null;
-        for (AccountGroupByIdAud a :
-            db.accountGroupByIdAud().byGroupInclude(g.getGroupId(), g.getIncludeUUID())) {
-          if (a.isActive()) {
-            audit = a;
-            break;
-          }
-        }
-
-        if (audit != null) {
-          audit.removed(me, TimeUtil.nowTs());
-          auditUpdates.add(audit);
-        }
-      }
-      db.accountGroupByIdAud().update(auditUpdates);
-    } catch (OrmException e) {
-      logOrmExceptionForGroups(
-          "Cannot log delete groups from group event performed by user", me, removed, e);
-    }
-  }
-
-  private void logOrmExceptionForAccounts(
-      String header, Account.Id me, Collection<AccountGroupMember> values, OrmException e) {
-    List<String> descriptions = new ArrayList<>();
-    for (AccountGroupMember m : values) {
-      Account.Id accountId = m.getAccountId();
-      String userName = accountCache.get(accountId).getUserName();
-      AccountGroup.Id groupId = m.getAccountGroupId();
-      String groupName = getGroupName(groupId);
-
-      descriptions.add(
-          MessageFormat.format(
-              "account {0}/{1}, group {2}/{3}", accountId, userName, groupId, groupName));
-    }
-    logOrmException(header, me, descriptions, e);
-  }
-
-  private void logOrmExceptionForGroups(
-      String header, Account.Id me, Collection<AccountGroupById> values, OrmException e) {
-    List<String> descriptions = new ArrayList<>();
-    for (AccountGroupById m : values) {
-      AccountGroup.UUID groupUuid = m.getIncludeUUID();
-      String groupName = groupBackend.get(groupUuid).getName();
-      AccountGroup.Id targetGroupId = m.getGroupId();
-      String targetGroupName = getGroupName(targetGroupId);
-
-      descriptions.add(
-          MessageFormat.format(
-              "group {0}/{1}, group {2}/{3}",
-              groupUuid, groupName, targetGroupId, targetGroupName));
-    }
-    logOrmException(header, me, descriptions, e);
-  }
-
-  private String getGroupName(AccountGroup.Id groupId) {
-    return groupCache.get(groupId).map(InternalGroup::getName).orElse("Deleted group " + groupId);
-  }
-
-  private void logOrmException(String header, Account.Id me, Iterable<?> values, OrmException e) {
-    StringBuilder message = new StringBuilder(header);
-    message.append(" ");
-    message.append(me);
-    message.append("/");
-    message.append(accountCache.get(me).getUserName());
-    message.append(": ");
-    message.append(Joiner.on("; ").join(values));
-    log.error(message.toString(), e);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/DeleteMembers.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/DeleteMembers.java
deleted file mode 100644
index 1069e1c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/DeleteMembers.java
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.group;
-
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.account.AccountsCollection;
-import com.google.gerrit.server.account.GroupControl;
-import com.google.gerrit.server.group.AddMembers.Input;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.HashSet;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-@Singleton
-public class DeleteMembers implements RestModifyView<GroupResource, Input> {
-  private final AccountsCollection accounts;
-  private final Provider<ReviewDb> db;
-  private final Provider<GroupsUpdate> groupsUpdateProvider;
-
-  @Inject
-  DeleteMembers(
-      AccountsCollection accounts,
-      Provider<ReviewDb> db,
-      @UserInitiated Provider<GroupsUpdate> groupsUpdateProvider) {
-    this.accounts = accounts;
-    this.db = db;
-    this.groupsUpdateProvider = groupsUpdateProvider;
-  }
-
-  @Override
-  public Response<?> apply(GroupResource resource, Input input)
-      throws AuthException, MethodNotAllowedException, UnprocessableEntityException, OrmException,
-          IOException, ConfigInvalidException, ResourceNotFoundException {
-    GroupDescription.Internal internalGroup =
-        resource.asInternalGroup().orElseThrow(MethodNotAllowedException::new);
-    input = Input.init(input);
-
-    final GroupControl control = resource.getControl();
-    if (!control.canRemoveMember()) {
-      throw new AuthException("Cannot delete members from group " + internalGroup.getName());
-    }
-
-    Set<Account.Id> membersToRemove = new HashSet<>();
-    for (String nameOrEmail : input.members) {
-      Account a = accounts.parse(nameOrEmail).getAccount();
-      membersToRemove.add(a.getId());
-    }
-    AccountGroup.UUID groupUuid = internalGroup.getGroupUUID();
-    try {
-      groupsUpdateProvider.get().removeGroupMembers(db.get(), groupUuid, membersToRemove);
-    } catch (NoSuchGroupException e) {
-      throw new ResourceNotFoundException(String.format("Group %s not found", groupUuid));
-    }
-
-    return Response.none();
-  }
-
-  @Singleton
-  static class DeleteMember implements RestModifyView<MemberResource, DeleteMember.Input> {
-    static class Input {}
-
-    private final Provider<DeleteMembers> delete;
-
-    @Inject
-    DeleteMember(Provider<DeleteMembers> delete) {
-      this.delete = delete;
-    }
-
-    @Override
-    public Response<?> apply(MemberResource resource, Input input)
-        throws AuthException, MethodNotAllowedException, UnprocessableEntityException, OrmException,
-            IOException, ConfigInvalidException, ResourceNotFoundException {
-      AddMembers.Input in = new AddMembers.Input();
-      in._oneMember = resource.getMember().getAccountId().toString();
-      return delete.get().apply(resource, in);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/DeleteSubgroups.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/DeleteSubgroups.java
deleted file mode 100644
index 14df51b..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/DeleteSubgroups.java
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.group;
-
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.account.GroupControl;
-import com.google.gerrit.server.group.AddSubgroups.Input;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.HashSet;
-import java.util.Set;
-
-@Singleton
-public class DeleteSubgroups implements RestModifyView<GroupResource, Input> {
-  private final GroupsCollection groupsCollection;
-  private final Provider<ReviewDb> db;
-  private final Provider<GroupsUpdate> groupsUpdateProvider;
-
-  @Inject
-  DeleteSubgroups(
-      GroupsCollection groupsCollection,
-      Provider<ReviewDb> db,
-      @UserInitiated Provider<GroupsUpdate> groupsUpdateProvider) {
-    this.groupsCollection = groupsCollection;
-    this.db = db;
-    this.groupsUpdateProvider = groupsUpdateProvider;
-  }
-
-  @Override
-  public Response<?> apply(GroupResource resource, Input input)
-      throws AuthException, MethodNotAllowedException, UnprocessableEntityException, OrmException,
-          ResourceNotFoundException, IOException {
-    GroupDescription.Internal internalGroup =
-        resource.asInternalGroup().orElseThrow(MethodNotAllowedException::new);
-    input = Input.init(input);
-
-    final GroupControl control = resource.getControl();
-    if (!control.canRemoveGroup()) {
-      throw new AuthException(
-          String.format("Cannot delete groups from group %s", internalGroup.getName()));
-    }
-
-    Set<AccountGroup.UUID> subgroupsToRemove = new HashSet<>();
-    for (String subgroupIdentifier : input.groups) {
-      GroupDescription.Basic subgroup = groupsCollection.parse(subgroupIdentifier);
-      subgroupsToRemove.add(subgroup.getGroupUUID());
-    }
-
-    AccountGroup.UUID groupUuid = internalGroup.getGroupUUID();
-    try {
-      groupsUpdateProvider.get().removeSubgroups(db.get(), groupUuid, subgroupsToRemove);
-    } catch (NoSuchGroupException e) {
-      throw new ResourceNotFoundException(String.format("Group %s not found", groupUuid));
-    }
-
-    return Response.none();
-  }
-
-  @Singleton
-  static class DeleteSubgroup implements RestModifyView<SubgroupResource, DeleteSubgroup.Input> {
-    static class Input {}
-
-    private final Provider<DeleteSubgroups> delete;
-
-    @Inject
-    DeleteSubgroup(Provider<DeleteSubgroups> delete) {
-      this.delete = delete;
-    }
-
-    @Override
-    public Response<?> apply(SubgroupResource resource, Input input)
-        throws AuthException, MethodNotAllowedException, UnprocessableEntityException, OrmException,
-            ResourceNotFoundException, IOException {
-      AddSubgroups.Input in = new AddSubgroups.Input();
-      in.groups = ImmutableList.of(resource.getMember().get());
-      return delete.get().apply(resource, in);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/GetAuditLog.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/GetAuditLog.java
deleted file mode 100644
index ba83e24..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/GetAuditLog.java
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.group;
-
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.GroupAuditEventInfo;
-import com.google.gerrit.extensions.common.GroupInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.extensions.restapi.Url;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.AccountGroupByIdAud;
-import com.google.gerrit.reviewdb.client.AccountGroupMemberAudit;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.account.AccountLoader;
-import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.GroupCache;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Optional;
-
-@Singleton
-public class GetAuditLog implements RestReadView<GroupResource> {
-  private final Provider<ReviewDb> db;
-  private final AccountLoader.Factory accountLoaderFactory;
-  private final GroupCache groupCache;
-  private final GroupJson groupJson;
-  private final GroupBackend groupBackend;
-
-  @Inject
-  public GetAuditLog(
-      Provider<ReviewDb> db,
-      AccountLoader.Factory accountLoaderFactory,
-      GroupCache groupCache,
-      GroupJson groupJson,
-      GroupBackend groupBackend) {
-    this.db = db;
-    this.accountLoaderFactory = accountLoaderFactory;
-    this.groupCache = groupCache;
-    this.groupJson = groupJson;
-    this.groupBackend = groupBackend;
-  }
-
-  @Override
-  public List<? extends GroupAuditEventInfo> apply(GroupResource rsrc)
-      throws AuthException, MethodNotAllowedException, OrmException {
-    GroupDescription.Internal group =
-        rsrc.asInternalGroup().orElseThrow(MethodNotAllowedException::new);
-    if (!rsrc.getControl().isOwner()) {
-      throw new AuthException("Not group owner");
-    }
-
-    AccountLoader accountLoader = accountLoaderFactory.create(true);
-
-    List<GroupAuditEventInfo> auditEvents = new ArrayList<>();
-
-    for (AccountGroupMemberAudit auditEvent :
-        db.get().accountGroupMembersAudit().byGroup(group.getId()).toList()) {
-      AccountInfo member = accountLoader.get(auditEvent.getKey().getParentKey());
-
-      auditEvents.add(
-          GroupAuditEventInfo.createAddUserEvent(
-              accountLoader.get(auditEvent.getAddedBy()),
-              auditEvent.getKey().getAddedOn(),
-              member));
-
-      if (!auditEvent.isActive()) {
-        auditEvents.add(
-            GroupAuditEventInfo.createRemoveUserEvent(
-                accountLoader.get(auditEvent.getRemovedBy()), auditEvent.getRemovedOn(), member));
-      }
-    }
-
-    for (AccountGroupByIdAud auditEvent :
-        db.get().accountGroupByIdAud().byGroup(group.getId()).toList()) {
-      AccountGroup.UUID includedGroupUUID = auditEvent.getKey().getIncludeUUID();
-      Optional<InternalGroup> includedGroup = groupCache.get(includedGroupUUID);
-      GroupInfo member;
-      if (includedGroup.isPresent()) {
-        member = groupJson.format(new InternalGroupDescription(includedGroup.get()));
-      } else {
-        GroupDescription.Basic groupDescription = groupBackend.get(includedGroupUUID);
-        member = new GroupInfo();
-        member.id = Url.encode(includedGroupUUID.get());
-        if (groupDescription != null) {
-          member.name = groupDescription.getName();
-        }
-      }
-
-      auditEvents.add(
-          GroupAuditEventInfo.createAddGroupEvent(
-              accountLoader.get(auditEvent.getAddedBy()),
-              auditEvent.getKey().getAddedOn(),
-              member));
-
-      if (!auditEvent.isActive()) {
-        auditEvents.add(
-            GroupAuditEventInfo.createRemoveGroupEvent(
-                accountLoader.get(auditEvent.getRemovedBy()), auditEvent.getRemovedOn(), member));
-      }
-    }
-
-    accountLoader.fill();
-
-    // sort by date in reverse order so that the newest audit event comes first
-    Collections.sort(
-        auditEvents,
-        new Comparator<GroupAuditEventInfo>() {
-          @Override
-          public int compare(GroupAuditEventInfo e1, GroupAuditEventInfo e2) {
-            return e2.date.compareTo(e1.date);
-          }
-        });
-
-    return auditEvents;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/GetDescription.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/GetDescription.java
deleted file mode 100644
index 0610843..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/GetDescription.java
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.group;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.inject.Singleton;
-
-@Singleton
-public class GetDescription implements RestReadView<GroupResource> {
-  @Override
-  public String apply(GroupResource resource) throws MethodNotAllowedException {
-    GroupDescription.Internal group =
-        resource.asInternalGroup().orElseThrow(MethodNotAllowedException::new);
-    return Strings.nullToEmpty(group.getDescription());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/GetDetail.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/GetDetail.java
deleted file mode 100644
index 47fe319..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/GetDetail.java
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.group;
-
-import com.google.gerrit.extensions.client.ListGroupsOption;
-import com.google.gerrit.extensions.common.GroupInfo;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-@Singleton
-public class GetDetail implements RestReadView<GroupResource> {
-  private final GroupJson json;
-
-  @Inject
-  GetDetail(GroupJson json) {
-    this.json = json.addOption(ListGroupsOption.MEMBERS).addOption(ListGroupsOption.INCLUDES);
-  }
-
-  @Override
-  public GroupInfo apply(GroupResource rsrc) throws OrmException {
-    return json.format(rsrc);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/GetGroup.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/GetGroup.java
deleted file mode 100644
index 03c6d6c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/GetGroup.java
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.group;
-
-import com.google.gerrit.extensions.common.GroupInfo;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-@Singleton
-public class GetGroup implements RestReadView<GroupResource> {
-  private final GroupJson json;
-
-  @Inject
-  GetGroup(GroupJson json) {
-    this.json = json;
-  }
-
-  @Override
-  public GroupInfo apply(GroupResource resource) throws OrmException {
-    return json.format(resource.getGroup());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/GetMember.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/GetMember.java
deleted file mode 100644
index 9d270ec..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/GetMember.java
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.group;
-
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.server.account.AccountLoader;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-@Singleton
-public class GetMember implements RestReadView<MemberResource> {
-  private final AccountLoader.Factory infoFactory;
-
-  @Inject
-  GetMember(AccountLoader.Factory infoFactory) {
-    this.infoFactory = infoFactory;
-  }
-
-  @Override
-  public AccountInfo apply(MemberResource rsrc) throws OrmException {
-    AccountLoader loader = infoFactory.create(true);
-    AccountInfo info = loader.get(rsrc.getMember().getAccountId());
-    loader.fill();
-    return info;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/GetName.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/GetName.java
deleted file mode 100644
index ce4df2a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/GetName.java
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.group;
-
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.inject.Singleton;
-
-@Singleton
-public class GetName implements RestReadView<GroupResource> {
-
-  @Override
-  public String apply(GroupResource resource) {
-    return resource.getName();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/GetOptions.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/GetOptions.java
deleted file mode 100644
index 7b55666..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/GetOptions.java
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.group;
-
-import com.google.gerrit.extensions.common.GroupOptionsInfo;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.inject.Singleton;
-
-@Singleton
-public class GetOptions implements RestReadView<GroupResource> {
-
-  @Override
-  public GroupOptionsInfo apply(GroupResource resource) {
-    return GroupJson.createOptions(resource.getGroup());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/GetOwner.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/GetOwner.java
deleted file mode 100644
index 03d0788..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/GetOwner.java
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.group;
-
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.extensions.common.GroupInfo;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.server.account.GroupControl;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-@Singleton
-public class GetOwner implements RestReadView<GroupResource> {
-
-  private final GroupControl.Factory controlFactory;
-  private final GroupJson json;
-
-  @Inject
-  GetOwner(GroupControl.Factory controlFactory, GroupJson json) {
-    this.controlFactory = controlFactory;
-    this.json = json;
-  }
-
-  @Override
-  public GroupInfo apply(GroupResource resource)
-      throws MethodNotAllowedException, ResourceNotFoundException, OrmException {
-    GroupDescription.Internal group =
-        resource.asInternalGroup().orElseThrow(MethodNotAllowedException::new);
-    try {
-      GroupControl c = controlFactory.validateFor(group.getOwnerGroupUUID());
-      return json.format(c.getGroup());
-    } catch (NoSuchGroupException e) {
-      throw new ResourceNotFoundException();
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/GetSubgroup.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/GetSubgroup.java
deleted file mode 100644
index a710188..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/GetSubgroup.java
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.group;
-
-import com.google.gerrit.extensions.common.GroupInfo;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-@Singleton
-public class GetSubgroup implements RestReadView<SubgroupResource> {
-  private final GroupJson json;
-
-  @Inject
-  GetSubgroup(GroupJson json) {
-    this.json = json;
-  }
-
-  @Override
-  public GroupInfo apply(SubgroupResource rsrc) throws OrmException {
-    return json.format(rsrc.getMemberDescription());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/GroupJson.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/GroupJson.java
deleted file mode 100644
index 85be5c4..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/GroupJson.java
+++ /dev/null
@@ -1,140 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.group;
-
-import static com.google.gerrit.extensions.client.ListGroupsOption.INCLUDES;
-import static com.google.gerrit.extensions.client.ListGroupsOption.MEMBERS;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.extensions.client.ListGroupsOption;
-import com.google.gerrit.extensions.common.GroupInfo;
-import com.google.gerrit.extensions.common.GroupOptionsInfo;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.Url;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.GroupControl;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.util.Collection;
-import java.util.EnumSet;
-
-public class GroupJson {
-  public static GroupOptionsInfo createOptions(GroupDescription.Basic group) {
-    GroupOptionsInfo options = new GroupOptionsInfo();
-    if (isInternalGroup(group) && ((GroupDescription.Internal) group).isVisibleToAll()) {
-      options.visibleToAll = true;
-    }
-    return options;
-  }
-
-  private final GroupBackend groupBackend;
-  private final GroupControl.Factory groupControlFactory;
-  private final Provider<ListMembers> listMembers;
-  private final Provider<ListSubgroups> listSubgroups;
-  private EnumSet<ListGroupsOption> options;
-
-  @Inject
-  GroupJson(
-      GroupBackend groupBackend,
-      GroupControl.Factory groupControlFactory,
-      Provider<ListMembers> listMembers,
-      Provider<ListSubgroups> listSubgroups) {
-    this.groupBackend = groupBackend;
-    this.groupControlFactory = groupControlFactory;
-    this.listMembers = listMembers;
-    this.listSubgroups = listSubgroups;
-
-    options = EnumSet.noneOf(ListGroupsOption.class);
-  }
-
-  public GroupJson addOption(ListGroupsOption o) {
-    options.add(o);
-    return this;
-  }
-
-  public GroupJson addOptions(Collection<ListGroupsOption> o) {
-    options.addAll(o);
-    return this;
-  }
-
-  public GroupInfo format(GroupResource rsrc) throws OrmException {
-    GroupInfo info = init(rsrc.getGroup());
-    initMembersAndSubgroups(rsrc, info);
-    return info;
-  }
-
-  public GroupInfo format(GroupDescription.Basic group) throws OrmException {
-    GroupInfo info = init(group);
-    if (options.contains(MEMBERS) || options.contains(INCLUDES)) {
-      GroupResource rsrc = new GroupResource(groupControlFactory.controlFor(group));
-      initMembersAndSubgroups(rsrc, info);
-    }
-    return info;
-  }
-
-  private GroupInfo init(GroupDescription.Basic group) {
-    GroupInfo info = new GroupInfo();
-    info.id = Url.encode(group.getGroupUUID().get());
-    info.name = Strings.emptyToNull(group.getName());
-    info.url = Strings.emptyToNull(group.getUrl());
-    info.options = createOptions(group);
-
-    if (isInternalGroup(group)) {
-      GroupDescription.Internal internalGroup = (GroupDescription.Internal) group;
-      info.description = Strings.emptyToNull(internalGroup.getDescription());
-      info.groupId = internalGroup.getId().get();
-      AccountGroup.UUID ownerGroupUUID = internalGroup.getOwnerGroupUUID();
-      if (ownerGroupUUID != null) {
-        info.ownerId = Url.encode(ownerGroupUUID.get());
-        GroupDescription.Basic o = groupBackend.get(ownerGroupUUID);
-        if (o != null) {
-          info.owner = o.getName();
-        }
-      }
-      info.createdOn = internalGroup.getCreatedOn();
-    }
-
-    return info;
-  }
-
-  private static boolean isInternalGroup(GroupDescription.Basic group) {
-    return group instanceof GroupDescription.Internal;
-  }
-
-  private GroupInfo initMembersAndSubgroups(GroupResource rsrc, GroupInfo info)
-      throws OrmException {
-    if (!rsrc.isInternalGroup()) {
-      return info;
-    }
-    try {
-      if (options.contains(MEMBERS)) {
-        info.members = listMembers.get().apply(rsrc);
-      }
-
-      if (options.contains(INCLUDES)) {
-        info.includes = listSubgroups.get().apply(rsrc);
-      }
-      return info;
-    } catch (MethodNotAllowedException e) {
-      // should never happen, this exception is only thrown if we would try to
-      // list members/includes of an external group, but in case of an external
-      // group we return before
-      throw new IllegalStateException(e);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/GroupModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/GroupModule.java
deleted file mode 100644
index 5939fd6..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/GroupModule.java
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.group;
-
-import static com.google.inject.Scopes.SINGLETON;
-
-import com.google.gerrit.extensions.config.FactoryModule;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.server.InternalUser;
-import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.IncludingGroupMembership;
-import com.google.gerrit.server.account.InternalGroupBackend;
-import com.google.gerrit.server.account.UniversalGroupBackend;
-
-public class GroupModule extends FactoryModule {
-
-  @Override
-  protected void configure() {
-    factory(InternalUser.Factory.class);
-    factory(IncludingGroupMembership.Factory.class);
-
-    bind(GroupBackend.class).to(UniversalGroupBackend.class).in(SINGLETON);
-    DynamicSet.setOf(binder(), GroupBackend.class);
-
-    bind(InternalGroupBackend.class).in(SINGLETON);
-    DynamicSet.bind(binder(), GroupBackend.class).to(SystemGroupBackend.class);
-    DynamicSet.bind(binder(), GroupBackend.class).to(InternalGroupBackend.class);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/GroupResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/GroupResource.java
deleted file mode 100644
index 44e770f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/GroupResource.java
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.group;
-
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.extensions.restapi.RestResource;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.server.account.GroupControl;
-import com.google.inject.TypeLiteral;
-import java.util.Optional;
-
-public class GroupResource implements RestResource {
-  public static final TypeLiteral<RestView<GroupResource>> GROUP_KIND =
-      new TypeLiteral<RestView<GroupResource>>() {};
-
-  private final GroupControl control;
-
-  public GroupResource(GroupControl control) {
-    this.control = control;
-  }
-
-  GroupResource(GroupResource rsrc) {
-    this.control = rsrc.getControl();
-  }
-
-  public GroupDescription.Basic getGroup() {
-    return control.getGroup();
-  }
-
-  public String getName() {
-    return getGroup().getName();
-  }
-
-  public boolean isInternalGroup() {
-    GroupDescription.Basic group = getGroup();
-    return group instanceof GroupDescription.Internal;
-  }
-
-  public Optional<GroupDescription.Internal> asInternalGroup() {
-    GroupDescription.Basic group = getGroup();
-    if (group instanceof GroupDescription.Internal) {
-      return Optional.of((GroupDescription.Internal) group);
-    }
-    return Optional.empty();
-  }
-
-  public GroupControl getControl() {
-    return control;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/Groups.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/Groups.java
deleted file mode 100644
index 233f36b..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/Groups.java
+++ /dev/null
@@ -1,271 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.group;
-
-import static com.google.common.collect.ImmutableSet.toImmutableSet;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Streams;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.AccountGroupById;
-import com.google.gerrit.reviewdb.client.AccountGroupMember;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gwtorm.server.OrmDuplicateKeyException;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.ResultSet;
-import com.google.inject.Singleton;
-import java.util.List;
-import java.util.Optional;
-import java.util.stream.Stream;
-
-/**
- * A database accessor for read calls related to groups.
- *
- * <p>All calls which read group related details from the database (either ReviewDb or NoteDb) are
- * gathered here. Other classes should always use this class instead of accessing the database
- * directly. There are a few exceptions though: schema classes, wrapper classes, and classes
- * executed during init. The latter ones should use {@code GroupsOnInit} instead.
- *
- * <p>If not explicitly stated, all methods of this class refer to <em>internal</em> groups.
- */
-@Singleton
-public class Groups {
-
-  /**
-   * Returns the {@code AccountGroup} for the specified ID if it exists.
-   *
-   * @param db the {@code ReviewDb} instance to use for lookups
-   * @param groupId the ID of the group
-   * @return the found {@code AccountGroup} if it exists, or else an empty {@code Optional}
-   * @throws OrmException if the group couldn't be retrieved from ReviewDb
-   */
-  public Optional<InternalGroup> getGroup(ReviewDb db, AccountGroup.Id groupId)
-      throws OrmException, NoSuchGroupException {
-    Optional<AccountGroup> accountGroup = Optional.ofNullable(db.accountGroups().get(groupId));
-
-    if (!accountGroup.isPresent()) {
-      return Optional.empty();
-    }
-
-    AccountGroup.UUID groupUuid = accountGroup.get().getGroupUUID();
-    ImmutableSet<Account.Id> members = getMembers(db, groupUuid).collect(toImmutableSet());
-    ImmutableSet<AccountGroup.UUID> subgroups =
-        getSubgroups(db, groupUuid).collect(toImmutableSet());
-    return accountGroup.map(group -> InternalGroup.create(group, members, subgroups));
-  }
-
-  /**
-   * Returns the {@code InternalGroup} for the specified UUID if it exists.
-   *
-   * @param db the {@code ReviewDb} instance to use for lookups
-   * @param groupUuid the UUID of the group
-   * @return the found {@code InternalGroup} if it exists, or else an empty {@code Optional}
-   * @throws OrmDuplicateKeyException if multiple groups are found for the specified UUID
-   * @throws OrmException if the group couldn't be retrieved from ReviewDb
-   */
-  public Optional<InternalGroup> getGroup(ReviewDb db, AccountGroup.UUID groupUuid)
-      throws OrmException, NoSuchGroupException {
-    Optional<AccountGroup> accountGroup = getGroupFromReviewDb(db, groupUuid);
-
-    if (!accountGroup.isPresent()) {
-      return Optional.empty();
-    }
-
-    ImmutableSet<Account.Id> members = getMembers(db, groupUuid).collect(toImmutableSet());
-    ImmutableSet<AccountGroup.UUID> subgroups =
-        getSubgroups(db, groupUuid).collect(toImmutableSet());
-    return accountGroup.map(group -> InternalGroup.create(group, members, subgroups));
-  }
-
-  /**
-   * Returns the {@code AccountGroup} for the specified UUID.
-   *
-   * @param db the {@code ReviewDb} instance to use for lookups
-   * @param groupUuid the UUID of the group
-   * @return the {@code AccountGroup} which has the specified UUID
-   * @throws OrmDuplicateKeyException if multiple groups are found for the specified UUID
-   * @throws OrmException if the group couldn't be retrieved from ReviewDb
-   * @throws NoSuchGroupException if a group with such a UUID doesn't exist
-   */
-  static AccountGroup getExistingGroupFromReviewDb(ReviewDb db, AccountGroup.UUID groupUuid)
-      throws OrmException, NoSuchGroupException {
-    Optional<AccountGroup> group = getGroupFromReviewDb(db, groupUuid);
-    return group.orElseThrow(() -> new NoSuchGroupException(groupUuid));
-  }
-
-  /**
-   * Returns the {@code AccountGroup} for the specified UUID if it exists.
-   *
-   * @param db the {@code ReviewDb} instance to use for lookups
-   * @param groupUuid the UUID of the group
-   * @return the found {@code AccountGroup} if it exists, or else an empty {@code Optional}
-   * @throws OrmDuplicateKeyException if multiple groups are found for the specified UUID
-   * @throws OrmException if the group couldn't be retrieved from ReviewDb
-   */
-  private static Optional<AccountGroup> getGroupFromReviewDb(
-      ReviewDb db, AccountGroup.UUID groupUuid) throws OrmException {
-    List<AccountGroup> accountGroups = db.accountGroups().byUUID(groupUuid).toList();
-    if (accountGroups.size() == 1) {
-      return Optional.of(Iterables.getOnlyElement(accountGroups));
-    } else if (accountGroups.isEmpty()) {
-      return Optional.empty();
-    } else {
-      throw new OrmDuplicateKeyException("Duplicate group UUID " + groupUuid);
-    }
-  }
-
-  public Stream<AccountGroup> getAll(ReviewDb db) throws OrmException {
-    return Streams.stream(db.accountGroups().all());
-  }
-
-  /**
-   * Indicates whether the specified account is a member of the specified group.
-   *
-   * <p><strong>Note</strong>: This method doesn't check whether the account exists!
-   *
-   * @param db the {@code ReviewDb} instance to use for lookups
-   * @param groupUuid the UUID of the group
-   * @param accountId the ID of the account
-   * @return {@code true} if the account is a member of the group, or else {@code false}
-   * @throws OrmException if an error occurs while reading from ReviewDb
-   * @throws NoSuchGroupException if the specified group doesn't exist
-   */
-  public boolean isMember(ReviewDb db, AccountGroup.UUID groupUuid, Account.Id accountId)
-      throws OrmException, NoSuchGroupException {
-    AccountGroup group = getExistingGroupFromReviewDb(db, groupUuid);
-    AccountGroupMember.Key key = new AccountGroupMember.Key(accountId, group.getId());
-    return db.accountGroupMembers().get(key) != null;
-  }
-
-  /**
-   * Indicates whether the specified group is a subgroup of the specified parent group.
-   *
-   * <p>The parent group must be an internal group whereas the subgroup may either be an internal or
-   * an external group.
-   *
-   * <p><strong>Note</strong>: This method doesn't check whether the subgroup exists!
-   *
-   * @param db the {@code ReviewDb} instance to use for lookups
-   * @param parentGroupUuid the UUID of the parent group
-   * @param subgroupUuid the UUID of the subgroup
-   * @return {@code true} if the group is a subgroup of the other group, or else {@code false}
-   * @throws OrmException if an error occurs while reading from ReviewDb
-   * @throws NoSuchGroupException if the specified parent group doesn't exist
-   */
-  public boolean isSubgroup(
-      ReviewDb db, AccountGroup.UUID parentGroupUuid, AccountGroup.UUID subgroupUuid)
-      throws OrmException, NoSuchGroupException {
-    AccountGroup parentGroup = getExistingGroupFromReviewDb(db, parentGroupUuid);
-    AccountGroupById.Key key = new AccountGroupById.Key(parentGroup.getId(), subgroupUuid);
-    return db.accountGroupById().get(key) != null;
-  }
-
-  /**
-   * Returns the members (accounts) of a group.
-   *
-   * <p><strong>Note</strong>: This method doesn't check whether the accounts exist!
-   *
-   * @param db the {@code ReviewDb} instance to use for lookups
-   * @param groupUuid the UUID of the group
-   * @return a stream of the IDs of the members
-   * @throws OrmException if an error occurs while reading from ReviewDb
-   * @throws NoSuchGroupException if the specified group doesn't exist
-   */
-  public Stream<Account.Id> getMembers(ReviewDb db, AccountGroup.UUID groupUuid)
-      throws OrmException, NoSuchGroupException {
-    AccountGroup group = getExistingGroupFromReviewDb(db, groupUuid);
-    ResultSet<AccountGroupMember> accountGroupMembers =
-        db.accountGroupMembers().byGroup(group.getId());
-    return Streams.stream(accountGroupMembers).map(AccountGroupMember::getAccountId);
-  }
-
-  /**
-   * Returns the subgroups of a group.
-   *
-   * <p>This parent group must be an internal group whereas the subgroups can either be internal or
-   * external groups.
-   *
-   * <p><strong>Note</strong>: This method doesn't check whether the subgroups exist!
-   *
-   * @param db the {@code ReviewDb} instance to use for lookups
-   * @param groupUuid the UUID of the parent group
-   * @return a stream of the UUIDs of the subgroups
-   * @throws OrmException if an error occurs while reading from ReviewDb
-   * @throws NoSuchGroupException if the specified parent group doesn't exist
-   */
-  public Stream<AccountGroup.UUID> getSubgroups(ReviewDb db, AccountGroup.UUID groupUuid)
-      throws OrmException, NoSuchGroupException {
-    AccountGroup group = getExistingGroupFromReviewDb(db, groupUuid);
-    ResultSet<AccountGroupById> accountGroupByIds = db.accountGroupById().byGroup(group.getId());
-    return Streams.stream(accountGroupByIds).map(AccountGroupById::getIncludeUUID).distinct();
-  }
-
-  /**
-   * Returns the groups of which the specified account is a member.
-   *
-   * <p><strong>Note</strong>: This method returns an empty stream if the account doesn't exist.
-   * This method doesn't check whether the groups exist.
-   *
-   * @param db the {@code ReviewDb} instance to use for lookups
-   * @param accountId the ID of the account
-   * @return a stream of the IDs of the groups of which the account is a member
-   * @throws OrmException if an error occurs while reading from ReviewDb
-   */
-  public static Stream<AccountGroup.Id> getGroupsWithMemberFromReviewDb(
-      ReviewDb db, Account.Id accountId) throws OrmException {
-    ResultSet<AccountGroupMember> accountGroupMembers =
-        db.accountGroupMembers().byAccount(accountId);
-    return Streams.stream(accountGroupMembers).map(AccountGroupMember::getAccountGroupId);
-  }
-
-  /**
-   * Returns the parent groups of the specified (sub)group.
-   *
-   * <p>The subgroup may either be an internal or an external group whereas the returned parent
-   * groups represent only internal groups.
-   *
-   * <p><strong>Note</strong>: This method returns an empty stream if the specified group doesn't
-   * exist. This method doesn't check whether the parent groups exist.
-   *
-   * @param db the {@code ReviewDb} instance to use for lookups
-   * @param subgroupUuid the UUID of the subgroup
-   * @return a stream of the IDs of the parent groups
-   * @throws OrmException if an error occurs while reading from ReviewDb
-   */
-  public static Stream<AccountGroup.Id> getParentGroupsFromReviewDb(
-      ReviewDb db, AccountGroup.UUID subgroupUuid) throws OrmException {
-    ResultSet<AccountGroupById> accountGroupByIds =
-        db.accountGroupById().byIncludeUUID(subgroupUuid);
-    return Streams.stream(accountGroupByIds).map(AccountGroupById::getGroupId);
-  }
-
-  /**
-   * Returns all known external groups. External groups are 'known' when they are specified as a
-   * subgroup of an internal group.
-   *
-   * @param db the {@code ReviewDb} instance to use for lookups
-   * @return a stream of the UUIDs of the known external groups
-   * @throws OrmException if an error occurs while reading from ReviewDb
-   */
-  public Stream<AccountGroup.UUID> getExternalGroups(ReviewDb db) throws OrmException {
-    return Streams.stream(db.accountGroupById().all())
-        .map(AccountGroupById::getIncludeUUID)
-        .distinct()
-        .filter(groupUuid -> !AccountGroup.isInternalGroup(groupUuid));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/GroupsCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/GroupsCollection.java
deleted file mode 100644
index 4d3bd11..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/GroupsCollection.java
+++ /dev/null
@@ -1,200 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.group;
-
-import com.google.common.collect.ListMultimap;
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AcceptsCreate;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.NeedsParams;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestCollection;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.AnonymousUser;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.GroupBackends;
-import com.google.gerrit.server.account.GroupControl;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-
-public class GroupsCollection
-    implements RestCollection<TopLevelResource, GroupResource>,
-        AcceptsCreate<TopLevelResource>,
-        NeedsParams {
-  private final DynamicMap<RestView<GroupResource>> views;
-  private final Provider<ListGroups> list;
-  private final Provider<QueryGroups> queryGroups;
-  private final CreateGroup.Factory createGroup;
-  private final GroupControl.Factory groupControlFactory;
-  private final GroupBackend groupBackend;
-  private final Provider<CurrentUser> self;
-
-  private boolean hasQuery2;
-
-  @Inject
-  GroupsCollection(
-      DynamicMap<RestView<GroupResource>> views,
-      Provider<ListGroups> list,
-      Provider<QueryGroups> queryGroups,
-      CreateGroup.Factory createGroup,
-      GroupControl.Factory groupControlFactory,
-      GroupBackend groupBackend,
-      Provider<CurrentUser> self) {
-    this.views = views;
-    this.list = list;
-    this.queryGroups = queryGroups;
-    this.createGroup = createGroup;
-    this.groupControlFactory = groupControlFactory;
-    this.groupBackend = groupBackend;
-    this.self = self;
-  }
-
-  @Override
-  public void setParams(ListMultimap<String, String> params) throws BadRequestException {
-    if (params.containsKey("query") && params.containsKey("query2")) {
-      throw new BadRequestException("\"query\" and \"query2\" options are mutually exclusive");
-    }
-
-    // The --query2 option is defined in QueryGroups
-    this.hasQuery2 = params.containsKey("query2");
-  }
-
-  @Override
-  public RestView<TopLevelResource> list() throws ResourceNotFoundException, AuthException {
-    final CurrentUser user = self.get();
-    if (user instanceof AnonymousUser) {
-      throw new AuthException("Authentication required");
-    } else if (!(user.isIdentifiedUser())) {
-      throw new ResourceNotFoundException();
-    }
-
-    if (hasQuery2) {
-      return queryGroups.get();
-    }
-
-    return list.get();
-  }
-
-  @Override
-  public GroupResource parse(TopLevelResource parent, IdString id)
-      throws AuthException, ResourceNotFoundException {
-    final CurrentUser user = self.get();
-    if (user instanceof AnonymousUser) {
-      throw new AuthException("Authentication required");
-    } else if (!(user.isIdentifiedUser())) {
-      throw new ResourceNotFoundException(id);
-    }
-
-    GroupDescription.Basic group = parseId(id.get());
-    if (group == null) {
-      throw new ResourceNotFoundException(id.get());
-    }
-    GroupControl ctl = groupControlFactory.controlFor(group);
-    if (!ctl.isVisible()) {
-      throw new ResourceNotFoundException(id);
-    }
-    return new GroupResource(ctl);
-  }
-
-  /**
-   * Parses a group ID from a request body and returns the group.
-   *
-   * @param id ID of the group, can be a group UUID, a group name or a legacy group ID
-   * @return the group
-   * @throws UnprocessableEntityException thrown if the group ID cannot be resolved or if the group
-   *     is not visible to the calling user
-   */
-  public GroupDescription.Basic parse(String id) throws UnprocessableEntityException {
-    GroupDescription.Basic group = parseId(id);
-    if (group == null || !groupControlFactory.controlFor(group).isVisible()) {
-      throw new UnprocessableEntityException(String.format("Group Not Found: %s", id));
-    }
-    return group;
-  }
-
-  /**
-   * Parses a group ID from a request body and returns the group if it is a Gerrit internal group.
-   *
-   * @param id ID of the group, can be a group UUID, a group name or a legacy group ID
-   * @return the group
-   * @throws UnprocessableEntityException thrown if the group ID cannot be resolved, if the group is
-   *     not visible to the calling user or if it's an external group
-   */
-  public GroupDescription.Internal parseInternal(String id) throws UnprocessableEntityException {
-    GroupDescription.Basic group = parse(id);
-    if (group instanceof GroupDescription.Internal) {
-      return (GroupDescription.Internal) group;
-    }
-
-    throw new UnprocessableEntityException(String.format("External Group Not Allowed: %s", id));
-  }
-
-  /**
-   * Parses a group ID and returns the group without making any permission check whether the current
-   * user can see the group.
-   *
-   * @param id ID of the group, can be a group UUID, a group name or a legacy group ID
-   * @return the group, null if no group is found for the given group ID
-   */
-  public GroupDescription.Basic parseId(String id) {
-    AccountGroup.UUID uuid = new AccountGroup.UUID(id);
-    if (groupBackend.handles(uuid)) {
-      GroupDescription.Basic d = groupBackend.get(uuid);
-      if (d != null) {
-        return d;
-      }
-    }
-
-    // Might be a legacy AccountGroup.Id.
-    if (id.matches("^[1-9][0-9]*$")) {
-      try {
-        AccountGroup.Id legacyId = AccountGroup.Id.parse(id);
-        return groupControlFactory.controlFor(legacyId).getGroup();
-      } catch (IllegalArgumentException | NoSuchGroupException e) {
-        // Ignored
-      }
-    }
-
-    // Might be a group name, be nice and accept unique names.
-    GroupReference ref = GroupBackends.findExactSuggestion(groupBackend, id);
-    if (ref != null) {
-      GroupDescription.Basic d = groupBackend.get(ref.getUUID());
-      if (d != null) {
-        return d;
-      }
-    }
-
-    return null;
-  }
-
-  @Override
-  public CreateGroup create(TopLevelResource root, IdString name) {
-    return createGroup.create(name.get());
-  }
-
-  @Override
-  public DynamicMap<RestView<GroupResource>> views() {
-    return views;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/GroupsUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/GroupsUpdate.java
deleted file mode 100644
index ad475b3..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/GroupsUpdate.java
+++ /dev/null
@@ -1,413 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.group;
-
-import static com.google.common.collect.ImmutableSet.toImmutableSet;
-import static com.google.gerrit.server.group.Groups.getExistingGroupFromReviewDb;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.audit.AuditService;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.errors.NameAlreadyUsedException;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.AccountGroupById;
-import com.google.gerrit.reviewdb.client.AccountGroupMember;
-import com.google.gerrit.reviewdb.client.AccountGroupName;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.GroupCache;
-import com.google.gerrit.server.account.GroupIncludeCache;
-import com.google.gerrit.server.git.RenameGroupOp;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.function.Consumer;
-import org.eclipse.jgit.lib.PersonIdent;
-
-/**
- * A database accessor for write calls related to groups.
- *
- * <p>All calls which write group related details to the database (either ReviewDb or NoteDb) are
- * gathered here. Other classes should always use this class instead of accessing the database
- * directly. There are a few exceptions though: schema classes, wrapper classes, and classes
- * executed during init. The latter ones should use {@code GroupsOnInit} instead.
- *
- * <p>If not explicitly stated, all methods of this class refer to <em>internal</em> groups.
- */
-public class GroupsUpdate {
-  public interface Factory {
-    /**
-     * Creates a {@code GroupsUpdate} which uses the identity of the specified user to mark database
-     * modifications executed by it. For NoteDb, this identity is used as author and committer for
-     * all related commits.
-     *
-     * <p><strong>Note</strong>: Please use this method with care and rather consider to use the
-     * correct annotation on the provider of a {@code GroupsUpdate} instead.
-     *
-     * @param currentUser the user to which modifications should be attributed, or {@code null} if
-     *     the Gerrit server identity should be used
-     */
-    GroupsUpdate create(@Nullable IdentifiedUser currentUser);
-  }
-
-  private final Groups groups;
-  private final GroupCache groupCache;
-  private final GroupIncludeCache groupIncludeCache;
-  private final AuditService auditService;
-  private final RenameGroupOp.Factory renameGroupOpFactory;
-  @Nullable private final IdentifiedUser currentUser;
-  private final PersonIdent committerIdent;
-
-  @Inject
-  GroupsUpdate(
-      Groups groups,
-      GroupCache groupCache,
-      GroupIncludeCache groupIncludeCache,
-      AuditService auditService,
-      RenameGroupOp.Factory renameGroupOpFactory,
-      @GerritPersonIdent PersonIdent serverIdent,
-      @Assisted @Nullable IdentifiedUser currentUser) {
-    this.groups = groups;
-    this.groupCache = groupCache;
-    this.groupIncludeCache = groupIncludeCache;
-    this.auditService = auditService;
-    this.renameGroupOpFactory = renameGroupOpFactory;
-    this.currentUser = currentUser;
-    committerIdent = getCommitterIdent(serverIdent, currentUser);
-  }
-
-  private static PersonIdent getCommitterIdent(
-      PersonIdent serverIdent, @Nullable IdentifiedUser currentUser) {
-    return currentUser != null ? createPersonIdent(serverIdent, currentUser) : serverIdent;
-  }
-
-  private static PersonIdent createPersonIdent(PersonIdent ident, IdentifiedUser user) {
-    return user.newCommitterIdent(ident.getWhen(), ident.getTimeZone());
-  }
-
-  /**
-   * Adds/Creates the specified group for the specified members (accounts).
-   *
-   * @param db the {@code ReviewDb} instance to update
-   * @param group the group to add
-   * @param memberIds the IDs of the accounts which should be members of the created group
-   * @throws OrmException if an error occurs while reading/writing from/to ReviewDb
-   * @throws IOException if the cache entry of one of the new members couldn't be invalidated, or
-   *     the new group couldn't be indexed
-   */
-  public void addGroup(ReviewDb db, AccountGroup group, Set<Account.Id> memberIds)
-      throws OrmException, IOException {
-    addNewGroup(db, group);
-    addNewGroupMembers(db, group, memberIds);
-    groupCache.onCreateGroup(group);
-  }
-
-  /**
-   * Adds the specified group.
-   *
-   * <p><strong>Note</strong>: This method doesn't update the index! It just adds the group to the
-   * database. Use this method with care.
-   *
-   * @param db the {@code ReviewDb} instance to update
-   * @param group the group to add
-   * @throws OrmException if an error occurs while reading/writing from/to ReviewDb
-   */
-  public static void addNewGroup(ReviewDb db, AccountGroup group) throws OrmException {
-    AccountGroupName gn = new AccountGroupName(group);
-    // first insert the group name to validate that the group name hasn't
-    // already been used to create another group
-    db.accountGroupNames().insert(ImmutableList.of(gn));
-    db.accountGroups().insert(ImmutableList.of(group));
-  }
-
-  /**
-   * Updates the specified group.
-   *
-   * @param db the {@code ReviewDb} instance to update
-   * @param groupUuid the UUID of the group to update
-   * @param groupConsumer a {@code Consumer} which performs the desired updates on the group
-   * @throws OrmException if an error occurs while reading/writing from/to ReviewDb
-   * @throws IOException if the cache entry for the group couldn't be invalidated
-   * @throws NoSuchGroupException if the specified group doesn't exist
-   */
-  public void updateGroup(
-      ReviewDb db, AccountGroup.UUID groupUuid, Consumer<AccountGroup> groupConsumer)
-      throws OrmException, IOException, NoSuchGroupException {
-    AccountGroup updatedGroup = updateGroupInDb(db, groupUuid, groupConsumer);
-    groupCache.evict(updatedGroup.getGroupUUID(), updatedGroup.getId(), updatedGroup.getNameKey());
-  }
-
-  @VisibleForTesting
-  public AccountGroup updateGroupInDb(
-      ReviewDb db, AccountGroup.UUID groupUuid, Consumer<AccountGroup> groupConsumer)
-      throws OrmException, NoSuchGroupException {
-    AccountGroup group = getExistingGroupFromReviewDb(db, groupUuid);
-    groupConsumer.accept(group);
-    db.accountGroups().update(ImmutableList.of(group));
-    return group;
-  }
-
-  /**
-   * Renames the specified group.
-   *
-   * @param db the {@code ReviewDb} instance to update
-   * @param groupUuid the UUID of the group to rename
-   * @param newName the new name of the group
-   * @throws OrmException if an error occurs while reading/writing from/to ReviewDb
-   * @throws IOException if the cache entry for the group couldn't be invalidated
-   * @throws NoSuchGroupException if the specified group doesn't exist
-   * @throws NameAlreadyUsedException if another group has the name {@code newName}
-   */
-  public void renameGroup(ReviewDb db, AccountGroup.UUID groupUuid, AccountGroup.NameKey newName)
-      throws OrmException, IOException, NameAlreadyUsedException, NoSuchGroupException {
-    AccountGroup group = getExistingGroupFromReviewDb(db, groupUuid);
-    AccountGroup.NameKey oldName = group.getNameKey();
-
-    try {
-      AccountGroupName id = new AccountGroupName(newName, group.getId());
-      db.accountGroupNames().insert(ImmutableList.of(id));
-    } catch (OrmException e) {
-      AccountGroupName other = db.accountGroupNames().get(newName);
-      if (other != null) {
-        // If we are using this identity, don't report the exception.
-        if (other.getId().equals(group.getId())) {
-          return;
-        }
-
-        // Otherwise, someone else has this identity.
-        throw new NameAlreadyUsedException("group with name " + newName + " already exists");
-      }
-      throw e;
-    }
-
-    group.setNameKey(newName);
-    db.accountGroups().update(ImmutableList.of(group));
-
-    db.accountGroupNames().deleteKeys(ImmutableList.of(oldName));
-
-    groupCache.evictAfterRename(oldName);
-    groupCache.evict(group.getGroupUUID(), group.getId(), group.getNameKey());
-
-    @SuppressWarnings("unused")
-    Future<?> possiblyIgnoredError =
-        renameGroupOpFactory
-            .create(committerIdent, groupUuid, oldName.get(), newName.get())
-            .start(0, TimeUnit.MILLISECONDS);
-  }
-
-  /**
-   * Adds an account as member to a group. The account is only added as a new member if it isn't
-   * already a member of the group.
-   *
-   * <p><strong>Note</strong>: This method doesn't check whether the account exists!
-   *
-   * @param db the {@code ReviewDb} instance to update
-   * @param groupUuid the UUID of the group
-   * @param accountId the ID of the account to add
-   * @throws OrmException if an error occurs while reading/writing from/to ReviewDb
-   * @throws IOException if the cache entry of the new member couldn't be invalidated
-   * @throws NoSuchGroupException if the specified group doesn't exist
-   */
-  public void addGroupMember(ReviewDb db, AccountGroup.UUID groupUuid, Account.Id accountId)
-      throws OrmException, IOException, NoSuchGroupException {
-    addGroupMembers(db, groupUuid, ImmutableSet.of(accountId));
-  }
-
-  /**
-   * Adds several accounts as members to a group. Only accounts which currently aren't members of
-   * the group are added.
-   *
-   * <p><strong>Note</strong>: This method doesn't check whether the accounts exist!
-   *
-   * @param db the {@code ReviewDb} instance to update
-   * @param groupUuid the UUID of the group
-   * @param accountIds a set of IDs of accounts to add
-   * @throws OrmException if an error occurs while reading/writing from/to ReviewDb
-   * @throws IOException if the group or one of the new members couldn't be indexed
-   * @throws NoSuchGroupException if the specified group doesn't exist
-   */
-  public void addGroupMembers(ReviewDb db, AccountGroup.UUID groupUuid, Set<Account.Id> accountIds)
-      throws OrmException, IOException, NoSuchGroupException {
-    AccountGroup group = getExistingGroupFromReviewDb(db, groupUuid);
-    Set<Account.Id> newMemberIds = new HashSet<>();
-    for (Account.Id accountId : accountIds) {
-      boolean isMember = groups.isMember(db, groupUuid, accountId);
-      if (!isMember) {
-        newMemberIds.add(accountId);
-      }
-    }
-
-    if (newMemberIds.isEmpty()) {
-      return;
-    }
-
-    addNewGroupMembers(db, group, newMemberIds);
-  }
-
-  private void addNewGroupMembers(ReviewDb db, AccountGroup group, Set<Account.Id> newMemberIds)
-      throws OrmException, IOException {
-    Set<AccountGroupMember> newMembers =
-        newMemberIds.stream()
-            .map(accountId -> new AccountGroupMember.Key(accountId, group.getId()))
-            .map(AccountGroupMember::new)
-            .collect(toImmutableSet());
-
-    if (currentUser != null) {
-      auditService.dispatchAddAccountsToGroup(currentUser.getAccountId(), newMembers);
-    }
-    db.accountGroupMembers().insert(newMembers);
-    groupCache.evict(group.getGroupUUID(), group.getId(), group.getNameKey());
-    for (AccountGroupMember newMember : newMembers) {
-      groupIncludeCache.evictGroupsWithMember(newMember.getAccountId());
-    }
-  }
-
-  /**
-   * Removes several members (accounts) from a group. Only accounts which currently are members of
-   * the group are removed.
-   *
-   * @param db the {@code ReviewDb} instance to update
-   * @param groupUuid the UUID of the group
-   * @param accountIds a set of IDs of accounts to remove
-   * @throws OrmException if an error occurs while reading/writing from/to ReviewDb
-   * @throws IOException if the group or one of the removed members couldn't be indexed
-   * @throws NoSuchGroupException if the specified group doesn't exist
-   */
-  public void removeGroupMembers(
-      ReviewDb db, AccountGroup.UUID groupUuid, Set<Account.Id> accountIds)
-      throws OrmException, IOException, NoSuchGroupException {
-    AccountGroup group = getExistingGroupFromReviewDb(db, groupUuid);
-    AccountGroup.Id groupId = group.getId();
-    Set<AccountGroupMember> membersToRemove = new HashSet<>();
-    for (Account.Id accountId : accountIds) {
-      boolean isMember = groups.isMember(db, groupUuid, accountId);
-      if (isMember) {
-        AccountGroupMember.Key key = new AccountGroupMember.Key(accountId, groupId);
-        membersToRemove.add(new AccountGroupMember(key));
-      }
-    }
-
-    if (membersToRemove.isEmpty()) {
-      return;
-    }
-
-    if (currentUser != null) {
-      auditService.dispatchDeleteAccountsFromGroup(currentUser.getAccountId(), membersToRemove);
-    }
-    db.accountGroupMembers().delete(membersToRemove);
-    groupCache.evict(group.getGroupUUID(), group.getId(), group.getNameKey());
-    for (AccountGroupMember member : membersToRemove) {
-      groupIncludeCache.evictGroupsWithMember(member.getAccountId());
-    }
-  }
-
-  /**
-   * Adds several groups as subgroups to a group. Only groups which currently aren't subgroups of
-   * the group are added.
-   *
-   * <p>The parent group must be an internal group whereas the subgroups can either be internal or
-   * external groups.
-   *
-   * <p><strong>Note</strong>: This method doesn't check whether the subgroups exist!
-   *
-   * @param db the {@code ReviewDb} instance to update
-   * @param parentGroupUuid the UUID of the parent group
-   * @param subgroupUuids a set of IDs of the groups to add as subgroups
-   * @throws OrmException if an error occurs while reading/writing from/to ReviewDb
-   * @throws IOException if the parent group couldn't be indexed
-   * @throws NoSuchGroupException if the specified parent group doesn't exist
-   */
-  public void addSubgroups(
-      ReviewDb db, AccountGroup.UUID parentGroupUuid, Set<AccountGroup.UUID> subgroupUuids)
-      throws OrmException, NoSuchGroupException, IOException {
-    AccountGroup parentGroup = getExistingGroupFromReviewDb(db, parentGroupUuid);
-    AccountGroup.Id parentGroupId = parentGroup.getId();
-    Set<AccountGroupById> newSubgroups = new HashSet<>();
-    for (AccountGroup.UUID includedGroupUuid : subgroupUuids) {
-      boolean isSubgroup = groups.isSubgroup(db, parentGroupUuid, includedGroupUuid);
-      if (!isSubgroup) {
-        AccountGroupById.Key key = new AccountGroupById.Key(parentGroupId, includedGroupUuid);
-        newSubgroups.add(new AccountGroupById(key));
-      }
-    }
-
-    if (newSubgroups.isEmpty()) {
-      return;
-    }
-
-    if (currentUser != null) {
-      auditService.dispatchAddGroupsToGroup(currentUser.getAccountId(), newSubgroups);
-    }
-    db.accountGroupById().insert(newSubgroups);
-    groupCache.evict(parentGroup.getGroupUUID(), parentGroup.getId(), parentGroup.getNameKey());
-    for (AccountGroupById newIncludedGroup : newSubgroups) {
-      groupIncludeCache.evictParentGroupsOf(newIncludedGroup.getIncludeUUID());
-    }
-    groupIncludeCache.evictSubgroupsOf(parentGroupUuid);
-  }
-
-  /**
-   * Removes several subgroups from a parent group. Only groups which currently are subgroups of the
-   * group are removed.
-   *
-   * <p>The parent group must be an internal group whereas the subgroups can either be internal or
-   * external groups.
-   *
-   * @param db the {@code ReviewDb} instance to update
-   * @param parentGroupUuid the UUID of the parent group
-   * @param subgroupUuids a set of IDs of the subgroups to remove from the parent group
-   * @throws OrmException if an error occurs while reading/writing from/to ReviewDb
-   * @throws IOException if the parent group couldn't be indexed
-   * @throws NoSuchGroupException if the specified parent group doesn't exist
-   */
-  public void removeSubgroups(
-      ReviewDb db, AccountGroup.UUID parentGroupUuid, Set<AccountGroup.UUID> subgroupUuids)
-      throws OrmException, NoSuchGroupException, IOException {
-    AccountGroup parentGroup = getExistingGroupFromReviewDb(db, parentGroupUuid);
-    AccountGroup.Id parentGroupId = parentGroup.getId();
-    Set<AccountGroupById> subgroupsToRemove = new HashSet<>();
-    for (AccountGroup.UUID subgroupUuid : subgroupUuids) {
-      boolean isSubgroup = groups.isSubgroup(db, parentGroupUuid, subgroupUuid);
-      if (isSubgroup) {
-        AccountGroupById.Key key = new AccountGroupById.Key(parentGroupId, subgroupUuid);
-        subgroupsToRemove.add(new AccountGroupById(key));
-      }
-    }
-
-    if (subgroupsToRemove.isEmpty()) {
-      return;
-    }
-
-    if (currentUser != null) {
-      auditService.dispatchDeleteGroupsFromGroup(currentUser.getAccountId(), subgroupsToRemove);
-    }
-    db.accountGroupById().delete(subgroupsToRemove);
-    groupCache.evict(parentGroup.getGroupUUID(), parentGroup.getId(), parentGroup.getNameKey());
-    for (AccountGroupById groupToRemove : subgroupsToRemove) {
-      groupIncludeCache.evictParentGroupsOf(groupToRemove.getIncludeUUID());
-    }
-    groupIncludeCache.evictSubgroupsOf(parentGroupUuid);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/Index.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/Index.java
deleted file mode 100644
index b61f954..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/Index.java
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.group;
-
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.account.GroupCache;
-import com.google.gerrit.server.group.Index.Input;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.Optional;
-
-@Singleton
-public class Index implements RestModifyView<GroupResource, Input> {
-  public static class Input {}
-
-  private final GroupCache groupCache;
-
-  @Inject
-  Index(GroupCache groupCache) {
-    this.groupCache = groupCache;
-  }
-
-  @Override
-  public Response<?> apply(GroupResource rsrc, Input input)
-      throws IOException, AuthException, UnprocessableEntityException {
-    if (!rsrc.getControl().isOwner()) {
-      throw new AuthException("not allowed to index group");
-    }
-
-    AccountGroup.UUID groupUuid = rsrc.getGroup().getGroupUUID();
-    if (!rsrc.isInternalGroup()) {
-      throw new UnprocessableEntityException(
-          String.format("External Group Not Allowed: %s", groupUuid.get()));
-    }
-
-    Optional<InternalGroup> group = groupCache.get(groupUuid);
-    // evicting the group from the cache, reindexes the group
-    if (group.isPresent()) {
-      groupCache.evict(group.get().getGroupUUID(), group.get().getId(), group.get().getNameKey());
-    }
-    return Response.none();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/InternalGroup.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/InternalGroup.java
deleted file mode 100644
index fafc591..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/InternalGroup.java
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.group;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import java.io.Serializable;
-import java.sql.Timestamp;
-
-@AutoValue
-public abstract class InternalGroup implements Serializable {
-  private static final long serialVersionUID = 1L;
-
-  public static InternalGroup create(
-      AccountGroup accountGroup,
-      ImmutableSet<Account.Id> members,
-      ImmutableSet<AccountGroup.UUID> subgroups) {
-    return new AutoValue_InternalGroup(
-        accountGroup.getId(),
-        accountGroup.getNameKey(),
-        accountGroup.getDescription(),
-        accountGroup.getOwnerGroupUUID(),
-        accountGroup.isVisibleToAll(),
-        accountGroup.getGroupUUID(),
-        accountGroup.getCreatedOn(),
-        members,
-        subgroups);
-  }
-
-  public abstract AccountGroup.Id getId();
-
-  public String getName() {
-    return getNameKey().get();
-  }
-
-  public abstract AccountGroup.NameKey getNameKey();
-
-  @Nullable
-  public abstract String getDescription();
-
-  public abstract AccountGroup.UUID getOwnerGroupUUID();
-
-  public abstract boolean isVisibleToAll();
-
-  public abstract AccountGroup.UUID getGroupUUID();
-
-  public abstract Timestamp getCreatedOn();
-
-  public abstract ImmutableSet<Account.Id> getMembers();
-
-  public abstract ImmutableSet<AccountGroup.UUID> getSubgroups();
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/InternalGroupDescription.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/InternalGroupDescription.java
deleted file mode 100644
index c5df2ff..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/InternalGroupDescription.java
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.group;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.PageLinks;
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import java.sql.Timestamp;
-
-public class InternalGroupDescription implements GroupDescription.Internal {
-
-  private final InternalGroup internalGroup;
-
-  public InternalGroupDescription(InternalGroup internalGroup) {
-    this.internalGroup = checkNotNull(internalGroup);
-  }
-
-  @Override
-  public AccountGroup.UUID getGroupUUID() {
-    return internalGroup.getGroupUUID();
-  }
-
-  @Override
-  public String getName() {
-    return internalGroup.getName();
-  }
-
-  @Nullable
-  @Override
-  public String getEmailAddress() {
-    return null;
-  }
-
-  @Nullable
-  @Override
-  public String getUrl() {
-    return "#" + PageLinks.toGroup(getGroupUUID());
-  }
-
-  @Override
-  public AccountGroup.Id getId() {
-    return internalGroup.getId();
-  }
-
-  @Override
-  @Nullable
-  public String getDescription() {
-    return internalGroup.getDescription();
-  }
-
-  @Override
-  public AccountGroup.UUID getOwnerGroupUUID() {
-    return internalGroup.getOwnerGroupUUID();
-  }
-
-  @Override
-  public boolean isVisibleToAll() {
-    return internalGroup.isVisibleToAll();
-  }
-
-  @Override
-  public Timestamp getCreatedOn() {
-    return internalGroup.getCreatedOn();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/ListGroups.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/ListGroups.java
deleted file mode 100644
index e942894..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/ListGroups.java
+++ /dev/null
@@ -1,408 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.group;
-
-import static com.google.common.collect.ImmutableList.toImmutableList;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Strings;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Streams;
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.common.data.GroupDescriptions;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.extensions.client.ListGroupsOption;
-import com.google.gerrit.extensions.common.GroupInfo;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.extensions.restapi.Url;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountResource;
-import com.google.gerrit.server.account.GetGroups;
-import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.GroupCache;
-import com.google.gerrit.server.account.GroupControl;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.EnumSet;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Set;
-import java.util.SortedMap;
-import java.util.TreeMap;
-import java.util.regex.Pattern;
-import java.util.stream.Stream;
-import org.kohsuke.args4j.Option;
-
-/** List groups visible to the calling user. */
-public class ListGroups implements RestReadView<TopLevelResource> {
-  private static final Comparator<GroupDescription.Internal> GROUP_COMPARATOR =
-      Comparator.comparing(GroupDescription.Basic::getName);
-
-  protected final GroupCache groupCache;
-
-  private final List<ProjectControl> projects = new ArrayList<>();
-  private final Set<AccountGroup.UUID> groupsToInspect = new HashSet<>();
-  private final GroupControl.Factory groupControlFactory;
-  private final GroupControl.GenericFactory genericGroupControlFactory;
-  private final Provider<IdentifiedUser> identifiedUser;
-  private final IdentifiedUser.GenericFactory userFactory;
-  private final GetGroups accountGetGroups;
-  private final GroupJson json;
-  private final GroupBackend groupBackend;
-  private final Groups groups;
-  private final Provider<ReviewDb> db;
-
-  private EnumSet<ListGroupsOption> options = EnumSet.noneOf(ListGroupsOption.class);
-  private boolean visibleToAll;
-  private Account.Id user;
-  private boolean owned;
-  private int limit;
-  private int start;
-  private String matchSubstring;
-  private String matchRegex;
-  private String suggest;
-
-  @Option(
-      name = "--project",
-      aliases = {"-p"},
-      usage = "projects for which the groups should be listed")
-  public void addProject(ProjectControl project) {
-    projects.add(project);
-  }
-
-  @Option(
-      name = "--visible-to-all",
-      usage = "to list only groups that are visible to all registered users")
-  public void setVisibleToAll(boolean visibleToAll) {
-    this.visibleToAll = visibleToAll;
-  }
-
-  @Option(
-      name = "--user",
-      aliases = {"-u"},
-      usage = "user for which the groups should be listed")
-  public void setUser(Account.Id user) {
-    this.user = user;
-  }
-
-  @Option(
-      name = "--owned",
-      usage =
-          "to list only groups that are owned by the"
-              + " specified user or by the calling user if no user was specifed")
-  public void setOwned(boolean owned) {
-    this.owned = owned;
-  }
-
-  /**
-   * Add a group to inspect.
-   *
-   * @param uuid UUID of the group
-   * @deprecated use {@link #addGroup(AccountGroup.UUID)}.
-   */
-  @Deprecated
-  @Option(
-      name = "--query",
-      aliases = {"-q"},
-      usage = "group to inspect (deprecated: use --group/-g instead)")
-  void addGroup_Deprecated(AccountGroup.UUID uuid) {
-    addGroup(uuid);
-  }
-
-  @Option(
-      name = "--group",
-      aliases = {"-g"},
-      usage = "group to inspect")
-  public void addGroup(AccountGroup.UUID uuid) {
-    groupsToInspect.add(uuid);
-  }
-
-  @Option(
-      name = "--limit",
-      aliases = {"-n"},
-      metaVar = "CNT",
-      usage = "maximum number of groups to list")
-  public void setLimit(int limit) {
-    this.limit = limit;
-  }
-
-  @Option(
-      name = "--start",
-      aliases = {"-S"},
-      metaVar = "CNT",
-      usage = "number of groups to skip")
-  public void setStart(int start) {
-    this.start = start;
-  }
-
-  @Option(
-      name = "--match",
-      aliases = {"-m"},
-      metaVar = "MATCH",
-      usage = "match group substring")
-  public void setMatchSubstring(String matchSubstring) {
-    this.matchSubstring = matchSubstring;
-  }
-
-  @Option(
-      name = "--regex",
-      aliases = {"-r"},
-      metaVar = "REGEX",
-      usage = "match group regex")
-  public void setMatchRegex(String matchRegex) {
-    this.matchRegex = matchRegex;
-  }
-
-  @Option(
-      name = "--suggest",
-      aliases = {"-s"},
-      usage = "to get a suggestion of groups")
-  public void setSuggest(String suggest) {
-    this.suggest = suggest;
-  }
-
-  @Option(name = "-o", usage = "Output options per group")
-  void addOption(ListGroupsOption o) {
-    options.add(o);
-  }
-
-  @Option(name = "-O", usage = "Output option flags, in hex")
-  void setOptionFlagsHex(String hex) {
-    options.addAll(ListGroupsOption.fromBits(Integer.parseInt(hex, 16)));
-  }
-
-  @Inject
-  protected ListGroups(
-      final GroupCache groupCache,
-      final GroupControl.Factory groupControlFactory,
-      final GroupControl.GenericFactory genericGroupControlFactory,
-      final Provider<IdentifiedUser> identifiedUser,
-      final IdentifiedUser.GenericFactory userFactory,
-      final GetGroups accountGetGroups,
-      GroupJson json,
-      GroupBackend groupBackend,
-      Groups groups,
-      Provider<ReviewDb> db) {
-    this.groupCache = groupCache;
-    this.groupControlFactory = groupControlFactory;
-    this.genericGroupControlFactory = genericGroupControlFactory;
-    this.identifiedUser = identifiedUser;
-    this.userFactory = userFactory;
-    this.accountGetGroups = accountGetGroups;
-    this.json = json;
-    this.groupBackend = groupBackend;
-    this.groups = groups;
-    this.db = db;
-  }
-
-  public void setOptions(EnumSet<ListGroupsOption> options) {
-    this.options = options;
-  }
-
-  public Account.Id getUser() {
-    return user;
-  }
-
-  public List<ProjectControl> getProjects() {
-    return projects;
-  }
-
-  @Override
-  public SortedMap<String, GroupInfo> apply(TopLevelResource resource)
-      throws OrmException, BadRequestException {
-    SortedMap<String, GroupInfo> output = new TreeMap<>();
-    for (GroupInfo info : get()) {
-      output.put(MoreObjects.firstNonNull(info.name, "Group " + Url.decode(info.id)), info);
-      info.name = null;
-    }
-    return output;
-  }
-
-  public List<GroupInfo> get() throws OrmException, BadRequestException {
-    if (!Strings.isNullOrEmpty(suggest)) {
-      return suggestGroups();
-    }
-
-    if (!Strings.isNullOrEmpty(matchSubstring) && !Strings.isNullOrEmpty(matchRegex)) {
-      throw new BadRequestException("Specify one of m/r");
-    }
-
-    if (owned) {
-      return getGroupsOwnedBy(user != null ? userFactory.create(user) : identifiedUser.get());
-    }
-
-    if (user != null) {
-      return accountGetGroups.apply(new AccountResource(userFactory.create(user)));
-    }
-
-    return getAllGroups();
-  }
-
-  private List<GroupInfo> getAllGroups() throws OrmException {
-    Pattern pattern = getRegexPattern();
-    Stream<GroupDescription.Internal> existingGroups =
-        getAllExistingGroups()
-            .filter(group -> !isNotRelevant(pattern, group))
-            .sorted(GROUP_COMPARATOR)
-            .skip(start);
-    if (limit > 0) {
-      existingGroups = existingGroups.limit(limit);
-    }
-    List<GroupDescription.Internal> relevantGroups = existingGroups.collect(toImmutableList());
-    List<GroupInfo> groupInfos = Lists.newArrayListWithCapacity(relevantGroups.size());
-    for (GroupDescription.Internal group : relevantGroups) {
-      groupInfos.add(json.addOptions(options).format(group));
-    }
-    return groupInfos;
-  }
-
-  private Stream<GroupDescription.Internal> getAllExistingGroups() throws OrmException {
-    if (!projects.isEmpty()) {
-      return projects.stream()
-          .map(ProjectControl::getProjectState)
-          .map(ProjectState::getAllGroups)
-          .flatMap(Collection::stream)
-          .map(GroupReference::getUUID)
-          .distinct()
-          .map(groupCache::get)
-          .flatMap(Streams::stream)
-          .map(InternalGroupDescription::new);
-    }
-    return groups.getAll(db.get()).map(GroupDescriptions::forAccountGroup);
-  }
-
-  private List<GroupInfo> suggestGroups() throws OrmException, BadRequestException {
-    if (conflictingSuggestParameters()) {
-      throw new BadRequestException(
-          "You should only have no more than one --project and -n with --suggest");
-    }
-    List<GroupReference> groupRefs =
-        Lists.newArrayList(
-            Iterables.limit(
-                groupBackend.suggest(
-                    suggest,
-                    projects.stream().findFirst().map(pc -> pc.getProjectState()).orElse(null)),
-                limit <= 0 ? 10 : Math.min(limit, 10)));
-
-    List<GroupInfo> groupInfos = Lists.newArrayListWithCapacity(groupRefs.size());
-    for (GroupReference ref : groupRefs) {
-      GroupDescription.Basic desc = groupBackend.get(ref.getUUID());
-      if (desc != null) {
-        groupInfos.add(json.addOptions(options).format(desc));
-      }
-    }
-    return groupInfos;
-  }
-
-  private boolean conflictingSuggestParameters() {
-    if (Strings.isNullOrEmpty(suggest)) {
-      return false;
-    }
-    if (projects.size() > 1) {
-      return true;
-    }
-    if (visibleToAll) {
-      return true;
-    }
-    if (user != null) {
-      return true;
-    }
-    if (owned) {
-      return true;
-    }
-    if (start != 0) {
-      return true;
-    }
-    if (!groupsToInspect.isEmpty()) {
-      return true;
-    }
-    if (!Strings.isNullOrEmpty(matchSubstring)) {
-      return true;
-    }
-    if (!Strings.isNullOrEmpty(matchRegex)) {
-      return true;
-    }
-    return false;
-  }
-
-  private List<GroupInfo> getGroupsOwnedBy(IdentifiedUser user) throws OrmException {
-    Pattern pattern = getRegexPattern();
-    Stream<GroupDescription.Internal> foundGroups =
-        groups
-            .getAll(db.get())
-            .map(GroupDescriptions::forAccountGroup)
-            .filter(group -> !isNotRelevant(pattern, group))
-            .filter(group -> isOwner(user, group))
-            .sorted(GROUP_COMPARATOR)
-            .skip(start);
-    if (limit > 0) {
-      foundGroups = foundGroups.limit(limit);
-    }
-    List<GroupDescription.Internal> ownedGroups = foundGroups.collect(toImmutableList());
-    List<GroupInfo> groupInfos = new ArrayList<>(ownedGroups.size());
-    for (GroupDescription.Internal group : ownedGroups) {
-      groupInfos.add(json.addOptions(options).format(group));
-    }
-    return groupInfos;
-  }
-
-  private boolean isOwner(CurrentUser user, GroupDescription.Internal group) {
-    try {
-      return genericGroupControlFactory.controlFor(user, group.getGroupUUID()).isOwner();
-    } catch (NoSuchGroupException e) {
-      return false;
-    }
-  }
-
-  private Pattern getRegexPattern() {
-    return Strings.isNullOrEmpty(matchRegex) ? null : Pattern.compile(matchRegex);
-  }
-
-  private boolean isNotRelevant(Pattern pattern, GroupDescription.Internal group) {
-    if (!Strings.isNullOrEmpty(matchSubstring)) {
-      if (!group.getName().toLowerCase(Locale.US).contains(matchSubstring.toLowerCase(Locale.US))) {
-        return true;
-      }
-    } else if (pattern != null) {
-      if (!pattern.matcher(group.getName()).matches()) {
-        return true;
-      }
-    }
-    if (visibleToAll && !group.isVisibleToAll()) {
-      return true;
-    }
-    if (!groupsToInspect.isEmpty() && !groupsToInspect.contains(group.getGroupUUID())) {
-      return true;
-    }
-
-    GroupControl c = groupControlFactory.controlFor(group);
-    return !c.isVisible();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/ListMembers.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/ListMembers.java
deleted file mode 100644
index af988b8..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/ListMembers.java
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.group;
-
-import static com.google.common.collect.ImmutableSet.toImmutableSet;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Sets;
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.account.AccountLoader;
-import com.google.gerrit.server.account.GroupCache;
-import com.google.gerrit.server.account.GroupControl;
-import com.google.gerrit.server.api.accounts.AccountInfoComparator;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
-import org.kohsuke.args4j.Option;
-
-public class ListMembers implements RestReadView<GroupResource> {
-  private final GroupCache groupCache;
-  private final GroupControl.Factory groupControlFactory;
-  private final AccountLoader accountLoader;
-
-  @Option(name = "--recursive", usage = "to resolve included groups recursively")
-  private boolean recursive;
-
-  @Inject
-  protected ListMembers(
-      GroupCache groupCache,
-      GroupControl.Factory groupControlFactory,
-      AccountLoader.Factory accountLoaderFactory) {
-    this.groupCache = groupCache;
-    this.groupControlFactory = groupControlFactory;
-    this.accountLoader = accountLoaderFactory.create(true);
-  }
-
-  public ListMembers setRecursive(boolean recursive) {
-    this.recursive = recursive;
-    return this;
-  }
-
-  @Override
-  public List<AccountInfo> apply(GroupResource resource)
-      throws MethodNotAllowedException, OrmException {
-    GroupDescription.Internal group =
-        resource.asInternalGroup().orElseThrow(MethodNotAllowedException::new);
-    return apply(group.getGroupUUID());
-  }
-
-  public List<AccountInfo> apply(AccountGroup.UUID groupId) throws OrmException {
-    Set<Account.Id> members = getMembers(groupId, new HashSet<>());
-    List<AccountInfo> memberInfos = new ArrayList<>(members.size());
-    for (Account.Id member : members) {
-      memberInfos.add(accountLoader.get(member));
-    }
-    accountLoader.fill();
-    memberInfos.sort(AccountInfoComparator.ORDER_NULLS_FIRST);
-    return memberInfos;
-  }
-
-  private Set<Account.Id> getMembers(
-      AccountGroup.UUID groupUUID, HashSet<AccountGroup.UUID> seenGroups) {
-    seenGroups.add(groupUUID);
-
-    Optional<InternalGroup> internalGroup = groupCache.get(groupUUID);
-    if (!internalGroup.isPresent()) {
-      return ImmutableSet.of();
-    }
-    InternalGroup group = internalGroup.get();
-
-    GroupControl groupControl = groupControlFactory.controlFor(new InternalGroupDescription(group));
-
-    Set<Account.Id> directMembers =
-        group.getMembers().stream().filter(groupControl::canSeeMember).collect(toImmutableSet());
-
-    Set<Account.Id> indirectMembers = new HashSet<>();
-    if (recursive && groupControl.canSeeGroup()) {
-      for (AccountGroup.UUID subgroupUuid : group.getSubgroups()) {
-        if (!seenGroups.contains(subgroupUuid)) {
-          indirectMembers.addAll(getMembers(subgroupUuid, seenGroups));
-        }
-      }
-    }
-    return Sets.union(directMembers, indirectMembers);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/ListSubgroups.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/ListSubgroups.java
deleted file mode 100644
index 70eefe7..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/ListSubgroups.java
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.group;
-
-import static com.google.common.base.Strings.nullToEmpty;
-
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.extensions.common.GroupInfo;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.account.GroupControl;
-import com.google.gerrit.server.account.GroupIncludeCache;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class ListSubgroups implements RestReadView<GroupResource> {
-  private static final Logger log = LoggerFactory.getLogger(ListSubgroups.class);
-
-  private final GroupControl.Factory controlFactory;
-  private final GroupIncludeCache groupIncludeCache;
-  private final GroupJson json;
-
-  @Inject
-  ListSubgroups(
-      GroupControl.Factory controlFactory, GroupIncludeCache groupIncludeCache, GroupJson json) {
-    this.controlFactory = controlFactory;
-    this.groupIncludeCache = groupIncludeCache;
-    this.json = json;
-  }
-
-  @Override
-  public List<GroupInfo> apply(GroupResource rsrc) throws MethodNotAllowedException, OrmException {
-    GroupDescription.Internal group =
-        rsrc.asInternalGroup().orElseThrow(MethodNotAllowedException::new);
-
-    boolean ownerOfParent = rsrc.getControl().isOwner();
-    List<GroupInfo> included = new ArrayList<>();
-    Collection<AccountGroup.UUID> subgroupUuids =
-        groupIncludeCache.subgroupsOf(group.getGroupUUID());
-    for (AccountGroup.UUID subgroupUuid : subgroupUuids) {
-      try {
-        GroupControl i = controlFactory.controlFor(subgroupUuid);
-        if (ownerOfParent || i.isVisible()) {
-          included.add(json.format(i.getGroup()));
-        }
-      } catch (NoSuchGroupException notFound) {
-        log.warn("Group {} no longer available, subgroup of {}", subgroupUuid, group.getName());
-        continue;
-      }
-    }
-    Collections.sort(
-        included,
-        new Comparator<GroupInfo>() {
-          @Override
-          public int compare(GroupInfo a, GroupInfo b) {
-            int cmp = nullToEmpty(a.name).compareTo(nullToEmpty(b.name));
-            if (cmp != 0) {
-              return cmp;
-            }
-            return nullToEmpty(a.id).compareTo(nullToEmpty(b.id));
-          }
-        });
-    return included;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/MemberResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/MemberResource.java
deleted file mode 100644
index 52a37a8..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/MemberResource.java
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.group;
-
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.inject.TypeLiteral;
-
-public class MemberResource extends GroupResource {
-  public static final TypeLiteral<RestView<MemberResource>> MEMBER_KIND =
-      new TypeLiteral<RestView<MemberResource>>() {};
-
-  private final IdentifiedUser user;
-
-  public MemberResource(GroupResource group, IdentifiedUser user) {
-    super(group);
-    this.user = user;
-  }
-
-  public IdentifiedUser getMember() {
-    return user;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/MembersCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/MembersCollection.java
deleted file mode 100644
index fdfb413..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/MembersCollection.java
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.group;
-
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AcceptsCreate;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ChildCollection;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountsCollection;
-import com.google.gerrit.server.group.AddMembers.PutMember;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-@Singleton
-public class MembersCollection
-    implements ChildCollection<GroupResource, MemberResource>, AcceptsCreate<GroupResource> {
-  private final DynamicMap<RestView<MemberResource>> views;
-  private final Provider<ListMembers> list;
-  private final AccountsCollection accounts;
-  private final Groups groups;
-  private final Provider<ReviewDb> db;
-  private final AddMembers put;
-
-  @Inject
-  MembersCollection(
-      DynamicMap<RestView<MemberResource>> views,
-      Provider<ListMembers> list,
-      AccountsCollection accounts,
-      Groups groups,
-      Provider<ReviewDb> db,
-      AddMembers put) {
-    this.views = views;
-    this.list = list;
-    this.accounts = accounts;
-    this.groups = groups;
-    this.db = db;
-    this.put = put;
-  }
-
-  @Override
-  public RestView<GroupResource> list() throws ResourceNotFoundException, AuthException {
-    return list.get();
-  }
-
-  @Override
-  public MemberResource parse(GroupResource parent, IdString id)
-      throws MethodNotAllowedException, AuthException, ResourceNotFoundException, OrmException,
-          IOException, ConfigInvalidException {
-    GroupDescription.Internal group =
-        parent.asInternalGroup().orElseThrow(MethodNotAllowedException::new);
-
-    IdentifiedUser user = accounts.parse(TopLevelResource.INSTANCE, id).getUser();
-    if (parent.getControl().canSeeMember(user.getAccountId()) && isMember(group, user)) {
-      return new MemberResource(parent, user);
-    }
-    throw new ResourceNotFoundException(id);
-  }
-
-  private boolean isMember(GroupDescription.Internal group, IdentifiedUser user)
-      throws OrmException, ResourceNotFoundException {
-    AccountGroup.UUID groupUuid = group.getGroupUUID();
-    try {
-      return groups.isMember(db.get(), groupUuid, user.getAccountId());
-    } catch (NoSuchGroupException e) {
-      throw new ResourceNotFoundException(String.format("Group %s not found", groupUuid));
-    }
-  }
-
-  @Override
-  public PutMember create(GroupResource group, IdString id) {
-    return new PutMember(put, id.get());
-  }
-
-  @Override
-  public DynamicMap<RestView<MemberResource>> views() {
-    return views;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/Module.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/Module.java
deleted file mode 100644
index 5006914..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/Module.java
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.group;
-
-import static com.google.gerrit.server.group.GroupResource.GROUP_KIND;
-import static com.google.gerrit.server.group.MemberResource.MEMBER_KIND;
-import static com.google.gerrit.server.group.SubgroupResource.SUBGROUP_KIND;
-
-import com.google.gerrit.audit.GroupMemberAuditListener;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.restapi.RestApiModule;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.group.AddMembers.UpdateMember;
-import com.google.gerrit.server.group.AddSubgroups.UpdateSubgroup;
-import com.google.gerrit.server.group.DeleteMembers.DeleteMember;
-import com.google.gerrit.server.group.DeleteSubgroups.DeleteSubgroup;
-import com.google.inject.Provides;
-
-public class Module extends RestApiModule {
-  @Override
-  protected void configure() {
-    bind(GroupsCollection.class);
-
-    DynamicMap.mapOf(binder(), GROUP_KIND);
-    DynamicMap.mapOf(binder(), MEMBER_KIND);
-    DynamicMap.mapOf(binder(), SUBGROUP_KIND);
-
-    get(GROUP_KIND).to(GetGroup.class);
-    put(GROUP_KIND).to(PutGroup.class);
-    get(GROUP_KIND, "detail").to(GetDetail.class);
-    post(GROUP_KIND, "index").to(Index.class);
-    post(GROUP_KIND, "members").to(AddMembers.class);
-    post(GROUP_KIND, "members.add").to(AddMembers.class);
-    post(GROUP_KIND, "members.delete").to(DeleteMembers.class);
-    post(GROUP_KIND, "groups").to(AddSubgroups.class);
-    post(GROUP_KIND, "groups.add").to(AddSubgroups.class);
-    post(GROUP_KIND, "groups.delete").to(DeleteSubgroups.class);
-    get(GROUP_KIND, "description").to(GetDescription.class);
-    put(GROUP_KIND, "description").to(PutDescription.class);
-    delete(GROUP_KIND, "description").to(PutDescription.class);
-    get(GROUP_KIND, "name").to(GetName.class);
-    put(GROUP_KIND, "name").to(PutName.class);
-    get(GROUP_KIND, "owner").to(GetOwner.class);
-    put(GROUP_KIND, "owner").to(PutOwner.class);
-    get(GROUP_KIND, "options").to(GetOptions.class);
-    put(GROUP_KIND, "options").to(PutOptions.class);
-    get(GROUP_KIND, "log.audit").to(GetAuditLog.class);
-
-    child(GROUP_KIND, "members").to(MembersCollection.class);
-    get(MEMBER_KIND).to(GetMember.class);
-    put(MEMBER_KIND).to(UpdateMember.class);
-    delete(MEMBER_KIND).to(DeleteMember.class);
-
-    child(GROUP_KIND, "groups").to(SubgroupsCollection.class);
-    get(SUBGROUP_KIND).to(GetSubgroup.class);
-    put(SUBGROUP_KIND).to(UpdateSubgroup.class);
-    delete(SUBGROUP_KIND).to(DeleteSubgroup.class);
-
-    factory(CreateGroup.Factory.class);
-    factory(GroupsUpdate.Factory.class);
-
-    DynamicSet.bind(binder(), GroupMemberAuditListener.class).to(DbGroupMemberAuditListener.class);
-  }
-
-  @Provides
-  @ServerInitiated
-  GroupsUpdate provideServerInitiatedGroupsUpdate(GroupsUpdate.Factory groupsUpdateFactory) {
-    return groupsUpdateFactory.create(null);
-  }
-
-  @Provides
-  @UserInitiated
-  GroupsUpdate provideUserInitiatedGroupsUpdate(
-      GroupsUpdate.Factory groupsUpdateFactory, IdentifiedUser currentUser) {
-    return groupsUpdateFactory.create(currentUser);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/PutDescription.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/PutDescription.java
deleted file mode 100644
index 3d6feea..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/PutDescription.java
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.group;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.DefaultInput;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.group.PutDescription.Input;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.Objects;
-
-@Singleton
-public class PutDescription implements RestModifyView<GroupResource, Input> {
-  public static class Input {
-    @DefaultInput public String description;
-  }
-
-  private final Provider<ReviewDb> db;
-  private final Provider<GroupsUpdate> groupsUpdateProvider;
-
-  @Inject
-  PutDescription(
-      Provider<ReviewDb> db, @UserInitiated Provider<GroupsUpdate> groupsUpdateProvider) {
-    this.db = db;
-    this.groupsUpdateProvider = groupsUpdateProvider;
-  }
-
-  @Override
-  public Response<String> apply(GroupResource resource, Input input)
-      throws AuthException, MethodNotAllowedException, ResourceNotFoundException, OrmException,
-          IOException {
-    if (input == null) {
-      input = new Input(); // Delete would set description to null.
-    }
-
-    GroupDescription.Internal internalGroup =
-        resource.asInternalGroup().orElseThrow(MethodNotAllowedException::new);
-    if (!resource.getControl().isOwner()) {
-      throw new AuthException("Not group owner");
-    }
-
-    String newDescription = Strings.emptyToNull(input.description);
-    if (!Objects.equals(internalGroup.getDescription(), newDescription)) {
-      AccountGroup.UUID groupUuid = internalGroup.getGroupUUID();
-      try {
-        groupsUpdateProvider
-            .get()
-            .updateGroup(db.get(), groupUuid, group -> group.setDescription(newDescription));
-      } catch (NoSuchGroupException e) {
-        throw new ResourceNotFoundException(String.format("Group %s not found", groupUuid));
-      }
-    }
-
-    return Strings.isNullOrEmpty(input.description)
-        ? Response.<String>none()
-        : Response.ok(input.description);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/PutGroup.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/PutGroup.java
deleted file mode 100644
index abaa317..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/PutGroup.java
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.group;
-
-import com.google.gerrit.extensions.api.groups.GroupInput;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.inject.Singleton;
-
-@Singleton
-public class PutGroup implements RestModifyView<GroupResource, GroupInput> {
-  @Override
-  public Response<?> apply(GroupResource resource, GroupInput input)
-      throws ResourceConflictException {
-    throw new ResourceConflictException("Group already exists");
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/PutName.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/PutName.java
deleted file mode 100644
index 75a7eb5..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/PutName.java
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.group;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.common.errors.NameAlreadyUsedException;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.DefaultInput;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.group.PutName.Input;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-
-@Singleton
-public class PutName implements RestModifyView<GroupResource, Input> {
-  public static class Input {
-    @DefaultInput public String name;
-  }
-
-  private final Provider<ReviewDb> db;
-  private final Provider<GroupsUpdate> groupsUpdateProvider;
-
-  @Inject
-  PutName(Provider<ReviewDb> db, @UserInitiated Provider<GroupsUpdate> groupsUpdateProvider) {
-    this.db = db;
-    this.groupsUpdateProvider = groupsUpdateProvider;
-  }
-
-  @Override
-  public String apply(GroupResource rsrc, Input input)
-      throws MethodNotAllowedException, AuthException, BadRequestException,
-          ResourceConflictException, ResourceNotFoundException, OrmException, IOException {
-    GroupDescription.Internal internalGroup =
-        rsrc.asInternalGroup().orElseThrow(MethodNotAllowedException::new);
-    if (!rsrc.getControl().isOwner()) {
-      throw new AuthException("Not group owner");
-    } else if (input == null || Strings.isNullOrEmpty(input.name)) {
-      throw new BadRequestException("name is required");
-    }
-    String newName = input.name.trim();
-    if (newName.isEmpty()) {
-      throw new BadRequestException("name is required");
-    }
-
-    if (internalGroup.getName().equals(newName)) {
-      return newName;
-    }
-
-    renameGroup(internalGroup, newName);
-    return newName;
-  }
-
-  private void renameGroup(GroupDescription.Internal group, String newName)
-      throws ResourceConflictException, ResourceNotFoundException, OrmException, IOException {
-    AccountGroup.UUID groupUuid = group.getGroupUUID();
-    try {
-      groupsUpdateProvider
-          .get()
-          .renameGroup(db.get(), groupUuid, new AccountGroup.NameKey(newName));
-    } catch (NoSuchGroupException e) {
-      throw new ResourceNotFoundException(String.format("Group %s not found", groupUuid));
-    } catch (NameAlreadyUsedException e) {
-      throw new ResourceConflictException("group with name " + newName + " already exists");
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/PutOptions.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/PutOptions.java
deleted file mode 100644
index 1ea018f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/PutOptions.java
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.group;
-
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.extensions.common.GroupOptionsInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-
-@Singleton
-public class PutOptions implements RestModifyView<GroupResource, GroupOptionsInfo> {
-  private final Provider<ReviewDb> db;
-  private final Provider<GroupsUpdate> groupsUpdateProvider;
-
-  @Inject
-  PutOptions(Provider<ReviewDb> db, @UserInitiated Provider<GroupsUpdate> groupsUpdateProvider) {
-    this.db = db;
-    this.groupsUpdateProvider = groupsUpdateProvider;
-  }
-
-  @Override
-  public GroupOptionsInfo apply(GroupResource resource, GroupOptionsInfo input)
-      throws MethodNotAllowedException, AuthException, BadRequestException,
-          ResourceNotFoundException, OrmException, IOException {
-    GroupDescription.Internal internalGroup =
-        resource.asInternalGroup().orElseThrow(MethodNotAllowedException::new);
-    if (!resource.getControl().isOwner()) {
-      throw new AuthException("Not group owner");
-    }
-
-    if (input == null) {
-      throw new BadRequestException("options are required");
-    }
-    if (input.visibleToAll == null) {
-      input.visibleToAll = false;
-    }
-
-    if (internalGroup.isVisibleToAll() != input.visibleToAll) {
-      AccountGroup.UUID groupUuid = internalGroup.getGroupUUID();
-      try {
-        groupsUpdateProvider
-            .get()
-            .updateGroup(db.get(), groupUuid, group -> group.setVisibleToAll(input.visibleToAll));
-      } catch (NoSuchGroupException e) {
-        throw new ResourceNotFoundException(String.format("Group %s not found", groupUuid));
-      }
-    }
-
-    GroupOptionsInfo options = new GroupOptionsInfo();
-    if (input.visibleToAll) {
-      options.visibleToAll = true;
-    }
-    return options;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/PutOwner.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/PutOwner.java
deleted file mode 100644
index 20e1dbe..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/PutOwner.java
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.group;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.extensions.common.GroupInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.DefaultInput;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.group.PutOwner.Input;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-
-@Singleton
-public class PutOwner implements RestModifyView<GroupResource, Input> {
-  public static class Input {
-    @DefaultInput public String owner;
-  }
-
-  private final GroupsCollection groupsCollection;
-  private final Provider<GroupsUpdate> groupsUpdateProvider;
-  private final Provider<ReviewDb> db;
-  private final GroupJson json;
-
-  @Inject
-  PutOwner(
-      GroupsCollection groupsCollection,
-      @UserInitiated Provider<GroupsUpdate> groupsUpdateProvider,
-      Provider<ReviewDb> db,
-      GroupJson json) {
-    this.groupsCollection = groupsCollection;
-    this.groupsUpdateProvider = groupsUpdateProvider;
-    this.db = db;
-    this.json = json;
-  }
-
-  @Override
-  public GroupInfo apply(GroupResource resource, Input input)
-      throws ResourceNotFoundException, MethodNotAllowedException, AuthException,
-          BadRequestException, UnprocessableEntityException, OrmException, IOException {
-    GroupDescription.Internal internalGroup =
-        resource.asInternalGroup().orElseThrow(MethodNotAllowedException::new);
-    if (!resource.getControl().isOwner()) {
-      throw new AuthException("Not group owner");
-    }
-
-    if (input == null || Strings.isNullOrEmpty(input.owner)) {
-      throw new BadRequestException("owner is required");
-    }
-
-    GroupDescription.Basic owner = groupsCollection.parse(input.owner);
-    if (!internalGroup.getOwnerGroupUUID().equals(owner.getGroupUUID())) {
-      AccountGroup.UUID groupUuid = internalGroup.getGroupUUID();
-      try {
-        groupsUpdateProvider
-            .get()
-            .updateGroup(
-                db.get(), groupUuid, group -> group.setOwnerGroupUUID(owner.getGroupUUID()));
-      } catch (NoSuchGroupException e) {
-        throw new ResourceNotFoundException(String.format("Group %s not found", groupUuid));
-      }
-    }
-    return json.format(owner);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/QueryGroups.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/QueryGroups.java
deleted file mode 100644
index bc77f76..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/QueryGroups.java
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.group;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.Lists;
-import com.google.gerrit.extensions.client.ListGroupsOption;
-import com.google.gerrit.extensions.common.GroupInfo;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.index.query.QueryParseException;
-import com.google.gerrit.index.query.QueryResult;
-import com.google.gerrit.server.index.group.GroupIndex;
-import com.google.gerrit.server.index.group.GroupIndexCollection;
-import com.google.gerrit.server.query.group.GroupQueryBuilder;
-import com.google.gerrit.server.query.group.GroupQueryProcessor;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.util.ArrayList;
-import java.util.EnumSet;
-import java.util.List;
-import org.kohsuke.args4j.Option;
-
-public class QueryGroups implements RestReadView<TopLevelResource> {
-  private final GroupIndexCollection indexes;
-  private final GroupQueryBuilder queryBuilder;
-  private final GroupQueryProcessor queryProcessor;
-  private final GroupJson json;
-
-  private String query;
-  private int limit;
-  private int start;
-  private EnumSet<ListGroupsOption> options = EnumSet.noneOf(ListGroupsOption.class);
-
-  // TODO(ekempin): --query in ListGroups is marked as deprecated, once it is
-  // removed we want to rename --query2 to --query here.
-  /** --query (-q) is already used by {@link ListGroups} */
-  @Option(
-      name = "--query2",
-      aliases = {"-q2"},
-      usage = "group query")
-  public void setQuery(String query) {
-    this.query = query;
-  }
-
-  @Option(
-      name = "--limit",
-      aliases = {"-n"},
-      metaVar = "CNT",
-      usage = "maximum number of groups to list")
-  public void setLimit(int limit) {
-    this.limit = limit;
-  }
-
-  @Option(
-      name = "--start",
-      aliases = {"-S"},
-      metaVar = "CNT",
-      usage = "number of groups to skip")
-  public void setStart(int start) {
-    this.start = start;
-  }
-
-  @Option(name = "-o", usage = "Output options per group")
-  public void addOption(ListGroupsOption o) {
-    options.add(o);
-  }
-
-  @Option(name = "-O", usage = "Output option flags, in hex")
-  public void setOptionFlagsHex(String hex) {
-    options.addAll(ListGroupsOption.fromBits(Integer.parseInt(hex, 16)));
-  }
-
-  @Inject
-  protected QueryGroups(
-      GroupIndexCollection indexes,
-      GroupQueryBuilder queryBuilder,
-      GroupQueryProcessor queryProcessor,
-      GroupJson json) {
-    this.indexes = indexes;
-    this.queryBuilder = queryBuilder;
-    this.queryProcessor = queryProcessor;
-    this.json = json;
-  }
-
-  @Override
-  public List<GroupInfo> apply(TopLevelResource resource)
-      throws BadRequestException, MethodNotAllowedException, OrmException {
-    if (Strings.isNullOrEmpty(query)) {
-      throw new BadRequestException("missing query field");
-    }
-
-    if (queryProcessor.isDisabled()) {
-      throw new MethodNotAllowedException("query disabled");
-    }
-
-    GroupIndex searchIndex = indexes.getSearchIndex();
-    if (searchIndex == null) {
-      throw new MethodNotAllowedException("no group index");
-    }
-
-    if (start != 0) {
-      queryProcessor.setStart(start);
-    }
-
-    if (limit != 0) {
-      queryProcessor.setUserProvidedLimit(limit);
-    }
-
-    try {
-      QueryResult<InternalGroup> result = queryProcessor.query(queryBuilder.parse(query));
-      List<InternalGroup> groups = result.entities();
-
-      ArrayList<GroupInfo> groupInfos = Lists.newArrayListWithCapacity(groups.size());
-      json.addOptions(options);
-      for (InternalGroup group : groups) {
-        groupInfos.add(json.format(new InternalGroupDescription(group)));
-      }
-      if (!groupInfos.isEmpty() && result.more()) {
-        groupInfos.get(groupInfos.size() - 1)._moreGroups = true;
-      }
-      return groupInfos;
-    } catch (QueryParseException e) {
-      throw new BadRequestException(e.getMessage());
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/ServerInitiated.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/ServerInitiated.java
deleted file mode 100644
index 6e75fde..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/ServerInitiated.java
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.group;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-import com.google.inject.BindingAnnotation;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/**
- * A marker for database modifications which aren't directly related to a user request (e.g. happen
- * outside of a request context). Those modifications will be attributed to the Gerrit server by
- * using the Gerrit server identity as author and committer for all related NoteDb commits.
- */
-@BindingAnnotation
-@Target({FIELD, PARAMETER, METHOD})
-@Retention(RUNTIME)
-public @interface ServerInitiated {}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/SubgroupResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/SubgroupResource.java
deleted file mode 100644
index 50c769d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/SubgroupResource.java
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.group;
-
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.inject.TypeLiteral;
-
-public class SubgroupResource extends GroupResource {
-  public static final TypeLiteral<RestView<SubgroupResource>> SUBGROUP_KIND =
-      new TypeLiteral<RestView<SubgroupResource>>() {};
-
-  private final GroupDescription.Basic member;
-
-  public SubgroupResource(GroupResource group, GroupDescription.Basic member) {
-    super(group);
-    this.member = member;
-  }
-
-  public AccountGroup.UUID getMember() {
-    return getMemberDescription().getGroupUUID();
-  }
-
-  public GroupDescription.Basic getMemberDescription() {
-    return member;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/SubgroupsCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/SubgroupsCollection.java
deleted file mode 100644
index 720c6df..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/SubgroupsCollection.java
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.group;
-
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AcceptsCreate;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ChildCollection;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.group.AddSubgroups.PutSubgroup;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-
-@Singleton
-public class SubgroupsCollection
-    implements ChildCollection<GroupResource, SubgroupResource>, AcceptsCreate<GroupResource> {
-  private final DynamicMap<RestView<SubgroupResource>> views;
-  private final ListSubgroups list;
-  private final GroupsCollection groupsCollection;
-  private final Provider<ReviewDb> dbProvider;
-  private final Groups groups;
-  private final AddSubgroups addSubgroups;
-
-  @Inject
-  SubgroupsCollection(
-      DynamicMap<RestView<SubgroupResource>> views,
-      ListSubgroups list,
-      GroupsCollection groupsCollection,
-      Provider<ReviewDb> dbProvider,
-      Groups groups,
-      AddSubgroups addSubgroups) {
-    this.views = views;
-    this.list = list;
-    this.groupsCollection = groupsCollection;
-    this.dbProvider = dbProvider;
-    this.groups = groups;
-    this.addSubgroups = addSubgroups;
-  }
-
-  @Override
-  public RestView<GroupResource> list() {
-    return list;
-  }
-
-  @Override
-  public SubgroupResource parse(GroupResource resource, IdString id)
-      throws MethodNotAllowedException, AuthException, ResourceNotFoundException, OrmException {
-    GroupDescription.Internal parent =
-        resource.asInternalGroup().orElseThrow(MethodNotAllowedException::new);
-
-    GroupDescription.Basic member =
-        groupsCollection.parse(TopLevelResource.INSTANCE, id).getGroup();
-    if (resource.getControl().canSeeGroup() && isSubgroup(parent, member)) {
-      return new SubgroupResource(resource, member);
-    }
-    throw new ResourceNotFoundException(id);
-  }
-
-  private boolean isSubgroup(GroupDescription.Internal parent, GroupDescription.Basic member)
-      throws OrmException, ResourceNotFoundException {
-    try {
-      return groups.isSubgroup(dbProvider.get(), parent.getGroupUUID(), member.getGroupUUID());
-    } catch (NoSuchGroupException e) {
-      throw new ResourceNotFoundException(
-          String.format("Group %s not found", parent.getGroupUUID()));
-    }
-  }
-
-  @Override
-  public PutSubgroup create(GroupResource group, IdString id) {
-    return new PutSubgroup(addSubgroups, id.get());
-  }
-
-  @Override
-  public DynamicMap<RestView<SubgroupResource>> views() {
-    return views;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/SystemGroupBackend.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/SystemGroupBackend.java
deleted file mode 100644
index 5d60790..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/SystemGroupBackend.java
+++ /dev/null
@@ -1,252 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.group;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static java.util.stream.Collectors.toSet;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.MoreObjects;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.StartupCheck;
-import com.google.gerrit.server.StartupException;
-import com.google.gerrit.server.account.AbstractGroupBackend;
-import com.google.gerrit.server.account.GroupMembership;
-import com.google.gerrit.server.account.ListGroupMembership;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import java.util.SortedMap;
-import java.util.TreeMap;
-import org.eclipse.jgit.lib.Config;
-
-@Singleton
-public class SystemGroupBackend extends AbstractGroupBackend {
-  public static final String SYSTEM_GROUP_SCHEME = "global:";
-
-  /** Common UUID assigned to the "Anonymous Users" group. */
-  public static final AccountGroup.UUID ANONYMOUS_USERS =
-      new AccountGroup.UUID(SYSTEM_GROUP_SCHEME + "Anonymous-Users");
-
-  /** Common UUID assigned to the "Registered Users" group. */
-  public static final AccountGroup.UUID REGISTERED_USERS =
-      new AccountGroup.UUID(SYSTEM_GROUP_SCHEME + "Registered-Users");
-
-  /** Common UUID assigned to the "Project Owners" placeholder group. */
-  public static final AccountGroup.UUID PROJECT_OWNERS =
-      new AccountGroup.UUID(SYSTEM_GROUP_SCHEME + "Project-Owners");
-
-  /** Common UUID assigned to the "Change Owner" placeholder group. */
-  public static final AccountGroup.UUID CHANGE_OWNER =
-      new AccountGroup.UUID(SYSTEM_GROUP_SCHEME + "Change-Owner");
-
-  private static final AccountGroup.UUID[] all = {
-    ANONYMOUS_USERS, REGISTERED_USERS, PROJECT_OWNERS, CHANGE_OWNER,
-  };
-
-  public static boolean isSystemGroup(AccountGroup.UUID uuid) {
-    return uuid.get().startsWith(SYSTEM_GROUP_SCHEME);
-  }
-
-  public static boolean isAnonymousOrRegistered(GroupReference ref) {
-    return isAnonymousOrRegistered(ref.getUUID());
-  }
-
-  public static boolean isAnonymousOrRegistered(AccountGroup.UUID uuid) {
-    return ANONYMOUS_USERS.equals(uuid) || REGISTERED_USERS.equals(uuid);
-  }
-
-  private final ImmutableSet<String> reservedNames;
-  private final SortedMap<String, GroupReference> namesToGroups;
-  private final ImmutableSet<String> names;
-  private final ImmutableMap<AccountGroup.UUID, GroupReference> uuids;
-
-  @Inject
-  @VisibleForTesting
-  public SystemGroupBackend(@GerritServerConfig Config cfg) {
-    SortedMap<String, GroupReference> n = new TreeMap<>();
-    ImmutableMap.Builder<AccountGroup.UUID, GroupReference> u = ImmutableMap.builder();
-
-    ImmutableSet.Builder<String> reservedNamesBuilder = ImmutableSet.builder();
-    for (AccountGroup.UUID uuid : all) {
-      int c = uuid.get().indexOf(':');
-      String defaultName = uuid.get().substring(c + 1).replace('-', ' ');
-      reservedNamesBuilder.add(defaultName);
-      String configuredName = cfg.getString("groups", uuid.get(), "name");
-      GroupReference ref =
-          new GroupReference(uuid, MoreObjects.firstNonNull(configuredName, defaultName));
-      n.put(ref.getName().toLowerCase(Locale.US), ref);
-      u.put(ref.getUUID(), ref);
-    }
-    reservedNames = reservedNamesBuilder.build();
-    namesToGroups = Collections.unmodifiableSortedMap(n);
-    names =
-        ImmutableSet.copyOf(namesToGroups.values().stream().map(r -> r.getName()).collect(toSet()));
-    uuids = u.build();
-  }
-
-  public GroupReference getGroup(AccountGroup.UUID uuid) {
-    return checkNotNull(uuids.get(uuid), "group %s not found", uuid.get());
-  }
-
-  public Set<String> getNames() {
-    return names;
-  }
-
-  public Set<String> getReservedNames() {
-    return reservedNames;
-  }
-
-  @Override
-  public boolean handles(AccountGroup.UUID uuid) {
-    return isSystemGroup(uuid);
-  }
-
-  @Override
-  public GroupDescription.Basic get(AccountGroup.UUID uuid) {
-    final GroupReference ref = uuids.get(uuid);
-    if (ref == null) {
-      return null;
-    }
-    return new GroupDescription.Basic() {
-      @Override
-      public String getName() {
-        return ref.getName();
-      }
-
-      @Override
-      public AccountGroup.UUID getGroupUUID() {
-        return ref.getUUID();
-      }
-
-      @Override
-      public String getUrl() {
-        return null;
-      }
-
-      @Override
-      public String getEmailAddress() {
-        return null;
-      }
-    };
-  }
-
-  @Override
-  public Collection<GroupReference> suggest(String name, ProjectState project) {
-    String nameLC = name.toLowerCase(Locale.US);
-    SortedMap<String, GroupReference> matches = namesToGroups.tailMap(nameLC);
-    if (matches.isEmpty()) {
-      return Collections.emptyList();
-    }
-
-    List<GroupReference> r = new ArrayList<>(matches.size());
-    for (Map.Entry<String, GroupReference> e : matches.entrySet()) {
-      if (e.getKey().startsWith(nameLC)) {
-        r.add(e.getValue());
-      } else {
-        break;
-      }
-    }
-    return r;
-  }
-
-  @Override
-  public GroupMembership membershipsOf(IdentifiedUser user) {
-    return new ListGroupMembership(ImmutableSet.of(ANONYMOUS_USERS, REGISTERED_USERS));
-  }
-
-  public static class NameCheck implements StartupCheck {
-    private final Config cfg;
-    private final Groups groups;
-    private final SchemaFactory<ReviewDb> schema;
-
-    @Inject
-    NameCheck(@GerritServerConfig Config cfg, Groups groups, SchemaFactory<ReviewDb> schema) {
-      this.cfg = cfg;
-      this.groups = groups;
-      this.schema = schema;
-    }
-
-    @Override
-    public void check() throws StartupException {
-      Map<AccountGroup.UUID, String> configuredNames = new HashMap<>();
-      Map<String, AccountGroup.UUID> byLowerCaseConfiguredName = new HashMap<>();
-      for (AccountGroup.UUID uuid : all) {
-        String configuredName = cfg.getString("groups", uuid.get(), "name");
-        if (configuredName != null) {
-          configuredNames.put(uuid, configuredName);
-          byLowerCaseConfiguredName.put(configuredName.toLowerCase(Locale.US), uuid);
-        }
-      }
-      if (configuredNames.isEmpty()) {
-        return;
-      }
-
-      Optional<AccountGroup> conflictingGroup;
-      try (ReviewDb db = schema.open()) {
-        conflictingGroup =
-            groups
-                .getAll(db)
-                .filter(group -> hasConfiguredName(byLowerCaseConfiguredName, group))
-                .findAny();
-
-      } catch (OrmException ignored) {
-        return;
-      }
-
-      if (conflictingGroup.isPresent()) {
-        AccountGroup group = conflictingGroup.get();
-        String groupName = group.getName();
-        AccountGroup.UUID systemGroupUuid = byLowerCaseConfiguredName.get(groupName);
-        throw new StartupException(
-            getAmbiguousNameMessage(groupName, group.getGroupUUID(), systemGroupUuid));
-      }
-    }
-
-    private static boolean hasConfiguredName(
-        Map<String, AccountGroup.UUID> byLowerCaseConfiguredName, AccountGroup group) {
-      String name = group.getName().toLowerCase(Locale.US);
-      return byLowerCaseConfiguredName.keySet().contains(name);
-    }
-
-    private static String getAmbiguousNameMessage(
-        String groupName, AccountGroup.UUID groupUuid, AccountGroup.UUID systemGroupUuid) {
-      return String.format(
-          "The configured name '%s' for system group '%s' is ambiguous"
-              + " with the name '%s' of existing group '%s'."
-              + " Please remove/change the value for groups.%s.name in"
-              + " gerrit.config.",
-          groupName, systemGroupUuid.get(), groupName, groupUuid.get(), systemGroupUuid.get());
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/UserInitiated.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/UserInitiated.java
deleted file mode 100644
index 2f1567d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/UserInitiated.java
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.group;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-import com.google.inject.BindingAnnotation;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/**
- * A marker for database modifications which are directly related to a user request (e.g. happen
- * inside of a request context). Those modifications will be attributed to the user by using the
- * user's identity as author and committer for all related NoteDb commits.
- */
-@BindingAnnotation
-@Target({FIELD, PARAMETER, METHOD})
-@Retention(RUNTIME)
-public @interface UserInitiated {}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/AbstractIndexModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/AbstractIndexModule.java
deleted file mode 100644
index d6029d0..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/AbstractIndexModule.java
+++ /dev/null
@@ -1,89 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.index;
-
-import com.google.gerrit.index.IndexConfig;
-import com.google.gerrit.lifecycle.LifecycleModule;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.index.account.AccountIndex;
-import com.google.gerrit.server.index.change.ChangeIndex;
-import com.google.gerrit.server.index.group.GroupIndex;
-import com.google.inject.AbstractModule;
-import com.google.inject.Provides;
-import com.google.inject.Singleton;
-import com.google.inject.assistedinject.FactoryModuleBuilder;
-import java.util.Map;
-import org.eclipse.jgit.lib.Config;
-
-public abstract class AbstractIndexModule extends AbstractModule {
-
-  private final int threads;
-  private final Map<String, Integer> singleVersions;
-
-  protected AbstractIndexModule(Map<String, Integer> singleVersions, int threads) {
-    this.singleVersions = singleVersions;
-    this.threads = threads;
-  }
-
-  @Override
-  protected void configure() {
-    install(
-        new FactoryModuleBuilder()
-            .implement(AccountIndex.class, getAccountIndex())
-            .build(AccountIndex.Factory.class));
-    install(
-        new FactoryModuleBuilder()
-            .implement(ChangeIndex.class, getChangeIndex())
-            .build(ChangeIndex.Factory.class));
-    install(
-        new FactoryModuleBuilder()
-            .implement(GroupIndex.class, getGroupIndex())
-            .build(GroupIndex.Factory.class));
-
-    install(new IndexModule(threads));
-    if (singleVersions == null) {
-      install(new MultiVersionModule());
-    } else {
-      install(new SingleVersionModule(singleVersions));
-    }
-  }
-
-  protected abstract Class<? extends AccountIndex> getAccountIndex();
-
-  protected abstract Class<? extends ChangeIndex> getChangeIndex();
-
-  protected abstract Class<? extends GroupIndex> getGroupIndex();
-
-  protected abstract Class<? extends VersionManager> getVersionManager();
-
-  @Provides
-  @Singleton
-  IndexConfig provideIndexConfig(@GerritServerConfig Config cfg) {
-    return getIndexConfig(cfg);
-  }
-
-  protected IndexConfig getIndexConfig(@GerritServerConfig Config cfg) {
-    return IndexConfig.fromConfig(cfg).separateChangeSubIndexes(true).build();
-  }
-
-  private class MultiVersionModule extends LifecycleModule {
-    @Override
-    public void configure() {
-      Class<? extends VersionManager> versionManagerClass = getVersionManager();
-      bind(VersionManager.class).to(versionManagerClass);
-      listener().to(versionManagerClass);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/DummyIndexModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/DummyIndexModule.java
deleted file mode 100644
index 481726b..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/DummyIndexModule.java
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.index;
-
-import com.google.gerrit.index.Index;
-import com.google.gerrit.index.IndexConfig;
-import com.google.gerrit.index.Schema;
-import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.group.InternalGroup;
-import com.google.gerrit.server.index.account.AccountIndex;
-import com.google.gerrit.server.index.change.ChangeIndex;
-import com.google.gerrit.server.index.change.DummyChangeIndex;
-import com.google.gerrit.server.index.group.GroupIndex;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.inject.AbstractModule;
-
-public class DummyIndexModule extends AbstractModule {
-  private static class DummyChangeIndexFactory implements ChangeIndex.Factory {
-    @Override
-    public ChangeIndex create(Schema<ChangeData> schema) {
-      throw new UnsupportedOperationException();
-    }
-  }
-
-  private static class DummyAccountIndexFactory implements AccountIndex.Factory {
-    @Override
-    public AccountIndex create(Schema<AccountState> schema) {
-      throw new UnsupportedOperationException();
-    }
-  }
-
-  private static class DummyGroupIndexFactory implements GroupIndex.Factory {
-    @Override
-    public GroupIndex create(Schema<InternalGroup> schema) {
-      throw new UnsupportedOperationException();
-    }
-  }
-
-  @Override
-  protected void configure() {
-    install(new IndexModule(1));
-    bind(IndexConfig.class).toInstance(IndexConfig.createDefault());
-    bind(Index.class).toInstance(new DummyChangeIndex());
-    bind(AccountIndex.Factory.class).toInstance(new DummyAccountIndexFactory());
-    bind(ChangeIndex.Factory.class).toInstance(new DummyChangeIndexFactory());
-    bind(GroupIndex.Factory.class).toInstance(new DummyGroupIndexFactory());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexModule.java
deleted file mode 100644
index 89afec4..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexModule.java
+++ /dev/null
@@ -1,235 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.index;
-
-import static com.google.gerrit.server.git.QueueProvider.QueueType.BATCH;
-import static com.google.gerrit.server.git.QueueProvider.QueueType.INTERACTIVE;
-
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.ImmutableCollection;
-import com.google.common.collect.ImmutableList;
-import com.google.common.util.concurrent.ListeningExecutorService;
-import com.google.common.util.concurrent.MoreExecutors;
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.index.IndexDefinition;
-import com.google.gerrit.index.SchemaDefinitions;
-import com.google.gerrit.lifecycle.LifecycleModule;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.git.WorkQueue;
-import com.google.gerrit.server.index.account.AccountIndexCollection;
-import com.google.gerrit.server.index.account.AccountIndexDefinition;
-import com.google.gerrit.server.index.account.AccountIndexRewriter;
-import com.google.gerrit.server.index.account.AccountIndexer;
-import com.google.gerrit.server.index.account.AccountIndexerImpl;
-import com.google.gerrit.server.index.account.AccountSchemaDefinitions;
-import com.google.gerrit.server.index.change.ChangeIndexCollection;
-import com.google.gerrit.server.index.change.ChangeIndexDefinition;
-import com.google.gerrit.server.index.change.ChangeIndexRewriter;
-import com.google.gerrit.server.index.change.ChangeIndexer;
-import com.google.gerrit.server.index.change.ChangeSchemaDefinitions;
-import com.google.gerrit.server.index.group.GroupIndexCollection;
-import com.google.gerrit.server.index.group.GroupIndexDefinition;
-import com.google.gerrit.server.index.group.GroupIndexRewriter;
-import com.google.gerrit.server.index.group.GroupIndexer;
-import com.google.gerrit.server.index.group.GroupIndexerImpl;
-import com.google.gerrit.server.index.group.GroupSchemaDefinitions;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.Key;
-import com.google.inject.Provides;
-import com.google.inject.ProvisionException;
-import com.google.inject.Singleton;
-import java.util.Collection;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import org.eclipse.jgit.lib.Config;
-
-/**
- * Module for non-indexer-specific secondary index setup.
- *
- * <p>This module should not be used directly except by specific secondary indexer implementations
- * (e.g. Lucene).
- */
-public class IndexModule extends LifecycleModule {
-  public enum IndexType {
-    LUCENE,
-    ELASTICSEARCH
-  }
-
-  public static final ImmutableCollection<SchemaDefinitions<?>> ALL_SCHEMA_DEFS =
-      ImmutableList.<SchemaDefinitions<?>>of(
-          AccountSchemaDefinitions.INSTANCE,
-          ChangeSchemaDefinitions.INSTANCE,
-          GroupSchemaDefinitions.INSTANCE);
-
-  /** Type of secondary index. */
-  public static IndexType getIndexType(Injector injector) {
-    Config cfg = injector.getInstance(Key.get(Config.class, GerritServerConfig.class));
-    return cfg.getEnum("index", null, "type", IndexType.LUCENE);
-  }
-
-  private final int threads;
-  private final ListeningExecutorService interactiveExecutor;
-  private final ListeningExecutorService batchExecutor;
-  private final boolean closeExecutorsOnShutdown;
-
-  public IndexModule(int threads) {
-    this.threads = threads;
-    this.interactiveExecutor = null;
-    this.batchExecutor = null;
-    this.closeExecutorsOnShutdown = true;
-  }
-
-  public IndexModule(
-      ListeningExecutorService interactiveExecutor, ListeningExecutorService batchExecutor) {
-    this.threads = -1;
-    this.interactiveExecutor = interactiveExecutor;
-    this.batchExecutor = batchExecutor;
-    this.closeExecutorsOnShutdown = false;
-  }
-
-  @Override
-  protected void configure() {
-    bind(AccountIndexRewriter.class);
-    bind(AccountIndexCollection.class);
-    listener().to(AccountIndexCollection.class);
-    factory(AccountIndexerImpl.Factory.class);
-
-    bind(ChangeIndexRewriter.class);
-    bind(ChangeIndexCollection.class);
-    listener().to(ChangeIndexCollection.class);
-    factory(ChangeIndexer.Factory.class);
-
-    bind(GroupIndexRewriter.class);
-    bind(GroupIndexCollection.class);
-    listener().to(GroupIndexCollection.class);
-    factory(GroupIndexerImpl.Factory.class);
-
-    if (closeExecutorsOnShutdown) {
-      // The executors must be shutdown _before_ closing the indexes.
-      // On Gerrit start the LifecycleListeners are invoked in the order in which they are
-      // registered, but on shutdown of Gerrit the order is reversed. This means the
-      // LifecycleListener to shutdown the executors must be registered _after_ the
-      // LifecycleListeners that close the indexes. The closing of the indexes is done by
-      // *IndexCollection which have been registered as LifecycleListener above. The
-      // registration of the ShutdownIndexExecutors LifecycleListener must happen afterwards.
-      listener().to(ShutdownIndexExecutors.class);
-    }
-
-    DynamicSet.setOf(binder(), OnlineUpgradeListener.class);
-  }
-
-  @Provides
-  Collection<IndexDefinition<?, ?, ?>> getIndexDefinitions(
-      AccountIndexDefinition accounts, ChangeIndexDefinition changes, GroupIndexDefinition groups) {
-    Collection<IndexDefinition<?, ?, ?>> result =
-        ImmutableList.<IndexDefinition<?, ?, ?>>of(accounts, groups, changes);
-    Set<String> expected =
-        FluentIterable.from(ALL_SCHEMA_DEFS).transform(SchemaDefinitions::getName).toSet();
-    Set<String> actual = FluentIterable.from(result).transform(IndexDefinition::getName).toSet();
-    if (!expected.equals(actual)) {
-      throw new ProvisionException(
-          "need index definitions for all schemas: " + expected + " != " + actual);
-    }
-    return result;
-  }
-
-  @Provides
-  @Singleton
-  AccountIndexer getAccountIndexer(
-      AccountIndexerImpl.Factory factory, AccountIndexCollection indexes) {
-    return factory.create(indexes);
-  }
-
-  @Provides
-  @Singleton
-  ChangeIndexer getChangeIndexer(
-      @IndexExecutor(INTERACTIVE) ListeningExecutorService executor,
-      ChangeIndexer.Factory factory,
-      ChangeIndexCollection indexes) {
-    // Bind default indexer to interactive executor; callers who need a
-    // different executor can use the factory directly.
-    return factory.create(executor, indexes);
-  }
-
-  @Provides
-  @Singleton
-  GroupIndexer getGroupIndexer(GroupIndexerImpl.Factory factory, GroupIndexCollection indexes) {
-    return factory.create(indexes);
-  }
-
-  @Provides
-  @Singleton
-  @IndexExecutor(INTERACTIVE)
-  ListeningExecutorService getInteractiveIndexExecutor(
-      @GerritServerConfig Config config, WorkQueue workQueue) {
-    if (interactiveExecutor != null) {
-      return interactiveExecutor;
-    }
-    int threads = this.threads;
-    if (threads <= 0) {
-      threads = config.getInt("index", null, "threads", 0);
-    }
-    if (threads <= 0) {
-      threads = Runtime.getRuntime().availableProcessors() / 2 + 1;
-    }
-    return MoreExecutors.listeningDecorator(
-        workQueue.createQueue(threads, "Index-Interactive", true));
-  }
-
-  @Provides
-  @Singleton
-  @IndexExecutor(BATCH)
-  ListeningExecutorService getBatchIndexExecutor(
-      @GerritServerConfig Config config, WorkQueue workQueue) {
-    if (batchExecutor != null) {
-      return batchExecutor;
-    }
-    int batchThreads = this.threads;
-    if (batchThreads <= 0) {
-      batchThreads = config.getInt("index", null, "batchThreads", 0);
-    }
-    if (batchThreads <= 0) {
-      batchThreads = Runtime.getRuntime().availableProcessors();
-    }
-    return MoreExecutors.listeningDecorator(
-        workQueue.createQueue(batchThreads, "Index-Batch", true));
-  }
-
-  @Singleton
-  private static class ShutdownIndexExecutors implements LifecycleListener {
-    private final ListeningExecutorService interactiveExecutor;
-    private final ListeningExecutorService batchExecutor;
-
-    @Inject
-    ShutdownIndexExecutors(
-        @IndexExecutor(INTERACTIVE) ListeningExecutorService interactiveExecutor,
-        @IndexExecutor(BATCH) ListeningExecutorService batchExecutor) {
-      this.interactiveExecutor = interactiveExecutor;
-      this.batchExecutor = batchExecutor;
-    }
-
-    @Override
-    public void start() {}
-
-    @Override
-    public void stop() {
-      MoreExecutors.shutdownAndAwaitTermination(
-          interactiveExecutor, Long.MAX_VALUE, TimeUnit.SECONDS);
-      MoreExecutors.shutdownAndAwaitTermination(batchExecutor, Long.MAX_VALUE, TimeUnit.SECONDS);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexUtils.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexUtils.java
deleted file mode 100644
index ea9900b..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexUtils.java
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.index;
-
-import static com.google.gerrit.server.index.change.ChangeField.CHANGE;
-import static com.google.gerrit.server.index.change.ChangeField.LEGACY_ID;
-import static com.google.gerrit.server.index.change.ChangeField.PROJECT;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Sets;
-import com.google.gerrit.index.QueryOptions;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.index.account.AccountField;
-import com.google.gerrit.server.index.group.GroupField;
-import com.google.gerrit.server.query.change.SingleGroupUser;
-import java.io.IOException;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-public final class IndexUtils {
-  public static final ImmutableMap<String, String> CUSTOM_CHAR_MAPPING =
-      ImmutableMap.of("_", " ", ".", " ");
-
-  public static void setReady(SitePaths sitePaths, String name, int version, boolean ready)
-      throws IOException {
-    try {
-      GerritIndexStatus cfg = new GerritIndexStatus(sitePaths);
-      cfg.setReady(name, version, ready);
-      cfg.save();
-    } catch (ConfigInvalidException e) {
-      throw new IOException(e);
-    }
-  }
-
-  public static boolean getReady(SitePaths sitePaths, String name, int version) throws IOException {
-    try {
-      GerritIndexStatus cfg = new GerritIndexStatus(sitePaths);
-      return cfg.getReady(name, version);
-    } catch (ConfigInvalidException e) {
-      throw new IOException(e);
-    }
-  }
-
-  public static Set<String> accountFields(QueryOptions opts) {
-    Set<String> fs = opts.fields();
-    return fs.contains(AccountField.ID.getName())
-        ? fs
-        : Sets.union(fs, ImmutableSet.of(AccountField.ID.getName()));
-  }
-
-  public static Set<String> changeFields(QueryOptions opts) {
-    // Ensure we request enough fields to construct a ChangeData. We need both
-    // change ID and project, which can either come via the Change field or
-    // separate fields.
-    Set<String> fs = opts.fields();
-    if (fs.contains(CHANGE.getName())) {
-      // A Change is always sufficient.
-      return fs;
-    }
-    if (fs.contains(PROJECT.getName()) && fs.contains(LEGACY_ID.getName())) {
-      return fs;
-    }
-    return Sets.union(fs, ImmutableSet.of(LEGACY_ID.getName(), PROJECT.getName()));
-  }
-
-  public static Set<String> groupFields(QueryOptions opts) {
-    Set<String> fs = opts.fields();
-    return fs.contains(GroupField.UUID.getName())
-        ? fs
-        : Sets.union(fs, ImmutableSet.of(GroupField.UUID.getName()));
-  }
-
-  public static String describe(CurrentUser user) {
-    if (user.isIdentifiedUser()) {
-      return user.getAccountId().toString();
-    }
-    if (user instanceof SingleGroupUser) {
-      return "group:" + user.getEffectiveGroups().getKnownGroups().iterator().next().toString();
-    }
-    return user.toString();
-  }
-
-  private IndexUtils() {
-    // hide default constructor
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/OnlineReindexer.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/OnlineReindexer.java
deleted file mode 100644
index ee2a76e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/OnlineReindexer.java
+++ /dev/null
@@ -1,157 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.index;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.common.collect.Lists;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.index.Index;
-import com.google.gerrit.index.IndexCollection;
-import com.google.gerrit.index.IndexDefinition;
-import com.google.gerrit.index.SiteIndexer;
-import java.io.IOException;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicBoolean;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class OnlineReindexer<K, V, I extends Index<K, V>> {
-  private static final Logger log = LoggerFactory.getLogger(OnlineReindexer.class);
-
-  private final String name;
-  private final IndexCollection<K, V, I> indexes;
-  private final SiteIndexer<K, V, I> batchIndexer;
-  private final int oldVersion;
-  private final int newVersion;
-  private final DynamicSet<OnlineUpgradeListener> listeners;
-  private I index;
-  private final AtomicBoolean running = new AtomicBoolean();
-
-  public OnlineReindexer(
-      IndexDefinition<K, V, I> def,
-      int oldVersion,
-      int newVersion,
-      DynamicSet<OnlineUpgradeListener> listeners) {
-    this.name = def.getName();
-    this.indexes = def.getIndexCollection();
-    this.batchIndexer = def.getSiteIndexer();
-    this.oldVersion = oldVersion;
-    this.newVersion = newVersion;
-    this.listeners = listeners;
-  }
-
-  public void start() {
-    if (running.compareAndSet(false, true)) {
-      Thread t =
-          new Thread() {
-            @Override
-            public void run() {
-              boolean ok = false;
-              try {
-                reindex();
-                ok = true;
-              } catch (IOException e) {
-                log.error("Online reindex of {} schema version {} failed", name, version(index), e);
-              } finally {
-                running.set(false);
-                if (!ok) {
-                  for (OnlineUpgradeListener listener : listeners) {
-                    listener.onFailure(name, oldVersion, newVersion);
-                  }
-                }
-              }
-            }
-          };
-      t.setName(
-          String.format("Reindex %s v%d-v%d", name, version(indexes.getSearchIndex()), newVersion));
-      t.start();
-    }
-  }
-
-  public boolean isRunning() {
-    return running.get();
-  }
-
-  public int getVersion() {
-    return newVersion;
-  }
-
-  private static int version(Index<?, ?> i) {
-    return i.getSchema().getVersion();
-  }
-
-  private void reindex() throws IOException {
-    for (OnlineUpgradeListener listener : listeners) {
-      listener.onStart(name, oldVersion, newVersion);
-    }
-    index =
-        checkNotNull(
-            indexes.getWriteIndex(newVersion),
-            "not an active write schema version: %s %s",
-            name,
-            newVersion);
-    log.info(
-        "Starting online reindex of {} from schema version {} to {}",
-        name,
-        version(indexes.getSearchIndex()),
-        version(index));
-
-    if (oldVersion != newVersion) {
-      index.deleteAll();
-    }
-    SiteIndexer.Result result = batchIndexer.indexAll(index);
-    if (!result.success()) {
-      log.error(
-          "Online reindex of {} schema version {} failed. Successfully"
-              + " indexed {}, failed to index {}",
-          name,
-          version(index),
-          result.doneCount(),
-          result.failedCount());
-      return;
-    }
-    log.info("Reindex {} to version {} complete", name, version(index));
-    activateIndex();
-    for (OnlineUpgradeListener listener : listeners) {
-      listener.onSuccess(name, oldVersion, newVersion);
-    }
-  }
-
-  public void activateIndex() {
-    indexes.setSearchIndex(index);
-    log.info("Using {} schema version {}", name, version(index));
-    try {
-      index.markReady(true);
-    } catch (IOException e) {
-      log.warn("Error activating new {} schema version {}", name, version(index));
-    }
-
-    List<I> toRemove = Lists.newArrayListWithExpectedSize(1);
-    for (I i : indexes.getWriteIndexes()) {
-      if (version(i) != version(index)) {
-        toRemove.add(i);
-      }
-    }
-    for (I i : toRemove) {
-      try {
-        i.markReady(false);
-        indexes.removeWriteIndex(version(i));
-      } catch (IOException e) {
-        log.warn("Error deactivating old {} schema version {}", name, version(i));
-      }
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/RefState.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/RefState.java
deleted file mode 100644
index b55afb6..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/RefState.java
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.index;
-
-import static com.google.common.base.MoreObjects.firstNonNull;
-import static com.google.common.base.Preconditions.checkArgument;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.auto.value.AutoValue;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.reviewdb.client.Project;
-import java.io.IOException;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-
-@AutoValue
-public abstract class RefState {
-  public static RefState create(String ref, String sha) {
-    return new AutoValue_RefState(ref, ObjectId.fromString(sha));
-  }
-
-  public static RefState create(String ref, @Nullable ObjectId id) {
-    return new AutoValue_RefState(ref, firstNonNull(id, ObjectId.zeroId()));
-  }
-
-  public static RefState of(Ref ref) {
-    return new AutoValue_RefState(ref.getName(), ref.getObjectId());
-  }
-
-  public byte[] toByteArray(Project.NameKey project) {
-    byte[] a = (project.toString() + ':' + ref() + ':').getBytes(UTF_8);
-    byte[] b = new byte[a.length + Constants.OBJECT_ID_STRING_LENGTH];
-    System.arraycopy(a, 0, b, 0, a.length);
-    id().copyTo(b, a.length);
-    return b;
-  }
-
-  public static void check(boolean condition, String str) {
-    checkArgument(condition, "invalid RefState: %s", str);
-  }
-
-  public abstract String ref();
-
-  public abstract ObjectId id();
-
-  public boolean match(Repository repo) throws IOException {
-    Ref ref = repo.exactRef(ref());
-    ObjectId expected = ref != null ? ref.getObjectId() : ObjectId.zeroId();
-    return id().equals(expected);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/VersionManager.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/VersionManager.java
deleted file mode 100644
index 8aabb60..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/VersionManager.java
+++ /dev/null
@@ -1,279 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.index;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkState;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.index.Index;
-import com.google.gerrit.index.IndexCollection;
-import com.google.gerrit.index.IndexDefinition;
-import com.google.gerrit.index.IndexDefinition.IndexFactory;
-import com.google.gerrit.index.Schema;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.inject.ProvisionException;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.Config;
-
-public abstract class VersionManager implements LifecycleListener {
-  public static boolean getOnlineUpgrade(Config cfg) {
-    return cfg.getBoolean("index", null, "onlineUpgrade", true);
-  }
-
-  public static class Version<V> {
-    public final Schema<V> schema;
-    public final int version;
-    public final boolean exists;
-    public final boolean ready;
-
-    public Version(Schema<V> schema, int version, boolean exists, boolean ready) {
-      checkArgument(schema == null || schema.getVersion() == version);
-      this.schema = schema;
-      this.version = version;
-      this.exists = exists;
-      this.ready = ready;
-    }
-  }
-
-  protected final boolean onlineUpgrade;
-  protected final String runReindexMsg;
-  protected final SitePaths sitePaths;
-
-  private final DynamicSet<OnlineUpgradeListener> listeners;
-
-  // The following fields must be accessed synchronized on this.
-  protected final Map<String, IndexDefinition<?, ?, ?>> defs;
-  protected final Map<String, OnlineReindexer<?, ?, ?>> reindexers;
-
-  protected VersionManager(
-      SitePaths sitePaths,
-      DynamicSet<OnlineUpgradeListener> listeners,
-      Collection<IndexDefinition<?, ?, ?>> defs,
-      boolean onlineUpgrade) {
-    this.sitePaths = sitePaths;
-    this.listeners = listeners;
-    this.defs = Maps.newHashMapWithExpectedSize(defs.size());
-    for (IndexDefinition<?, ?, ?> def : defs) {
-      this.defs.put(def.getName(), def);
-    }
-
-    this.reindexers = Maps.newHashMapWithExpectedSize(defs.size());
-    this.onlineUpgrade = onlineUpgrade;
-    this.runReindexMsg =
-        "No index versions for index '%s' ready; run java -jar "
-            + sitePaths.gerrit_war.toAbsolutePath()
-            + " reindex --index %s";
-  }
-
-  @Override
-  public void start() {
-    GerritIndexStatus cfg = createIndexStatus();
-    for (IndexDefinition<?, ?, ?> def : defs.values()) {
-      initIndex(def, cfg);
-    }
-  }
-
-  @Override
-  public void stop() {
-    // Do nothing; indexes are closed on demand by IndexCollection.
-  }
-
-  /**
-   * Start the online reindexer if the current index is not already the latest.
-   *
-   * @param name index name
-   * @param force start re-index
-   * @return true if started, otherwise false.
-   * @throws ReindexerAlreadyRunningException
-   */
-  public synchronized boolean startReindexer(String name, boolean force)
-      throws ReindexerAlreadyRunningException {
-    OnlineReindexer<?, ?, ?> reindexer = reindexers.get(name);
-    validateReindexerNotRunning(reindexer);
-    if (force || !isLatestIndexVersion(name, reindexer)) {
-      reindexer.start();
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * Activate the latest index if the current index is not already the latest.
-   *
-   * @param name index name
-   * @return true if index was activated, otherwise false.
-   * @throws ReindexerAlreadyRunningException
-   */
-  public synchronized boolean activateLatestIndex(String name)
-      throws ReindexerAlreadyRunningException {
-    OnlineReindexer<?, ?, ?> reindexer = reindexers.get(name);
-    validateReindexerNotRunning(reindexer);
-    if (!isLatestIndexVersion(name, reindexer)) {
-      reindexer.activateIndex();
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * Tells if an index with this name is currently known or not.
-   *
-   * @param name index name
-   * @return true if index is known and can be used, otherwise false.
-   */
-  public boolean isKnownIndex(String name) {
-    return defs.get(name) != null;
-  }
-
-  protected <K, V, I extends Index<K, V>> void initIndex(
-      IndexDefinition<K, V, I> def, GerritIndexStatus cfg) {
-    TreeMap<Integer, Version<V>> versions = scanVersions(def, cfg);
-    // Search from the most recent ready version.
-    // Write to the most recent ready version and the most recent version.
-    Version<V> search = null;
-    List<Version<V>> write = Lists.newArrayListWithCapacity(2);
-    for (Version<V> v : versions.descendingMap().values()) {
-      if (v.schema == null) {
-        continue;
-      }
-      if (write.isEmpty() && onlineUpgrade) {
-        write.add(v);
-      }
-      if (v.ready) {
-        search = v;
-        if (!write.contains(v)) {
-          write.add(v);
-        }
-        break;
-      }
-    }
-    if (search == null) {
-      throw new ProvisionException(String.format(runReindexMsg, def.getName(), def.getName()));
-    }
-
-    IndexFactory<K, V, I> factory = def.getIndexFactory();
-    I searchIndex = factory.create(search.schema);
-    IndexCollection<K, V, I> indexes = def.getIndexCollection();
-    indexes.setSearchIndex(searchIndex);
-    for (Version<V> v : write) {
-      if (v.version != search.version) {
-        indexes.addWriteIndex(factory.create(v.schema));
-      } else {
-        indexes.addWriteIndex(searchIndex);
-      }
-    }
-
-    markNotReady(def.getName(), versions.values(), write);
-
-    synchronized (this) {
-      if (!reindexers.containsKey(def.getName())) {
-        int latest = write.get(0).version;
-        OnlineReindexer<K, V, I> reindexer =
-            new OnlineReindexer<>(def, search.version, latest, listeners);
-        reindexers.put(def.getName(), reindexer);
-      }
-    }
-  }
-
-  synchronized void startOnlineUpgrade() {
-    checkState(onlineUpgrade, "online upgrade not enabled");
-    for (IndexDefinition<?, ?, ?> def : defs.values()) {
-      String name = def.getName();
-      IndexCollection<?, ?, ?> indexes = def.getIndexCollection();
-      Index<?, ?> search = indexes.getSearchIndex();
-      checkState(
-          search != null, "no search index ready for %s; should have failed at startup", name);
-      int searchVersion = search.getSchema().getVersion();
-
-      List<Index<?, ?>> write = ImmutableList.copyOf(indexes.getWriteIndexes());
-      checkState(
-          !write.isEmpty(),
-          "no write indexes set for %s; should have been initialized at startup",
-          name);
-      int latestWriteVersion = write.get(0).getSchema().getVersion();
-
-      if (latestWriteVersion != searchVersion) {
-        OnlineReindexer<?, ?, ?> reindexer = reindexers.get(name);
-        checkState(
-            reindexer != null,
-            "no reindexer found for %s; should have been initialized at startup",
-            name);
-        reindexer.start();
-      }
-    }
-  }
-
-  protected GerritIndexStatus createIndexStatus() {
-    try {
-      return new GerritIndexStatus(sitePaths);
-    } catch (ConfigInvalidException | IOException e) {
-      throw fail(e);
-    }
-  }
-
-  protected abstract <K, V, I extends Index<K, V>> TreeMap<Integer, Version<V>> scanVersions(
-      IndexDefinition<K, V, I> def, GerritIndexStatus cfg);
-
-  private <V> boolean isDirty(Collection<Version<V>> inUse, Version<V> v) {
-    return !inUse.contains(v) && v.exists;
-  }
-
-  private boolean isLatestIndexVersion(String name, OnlineReindexer<?, ?, ?> reindexer) {
-    int readVersion = defs.get(name).getIndexCollection().getSearchIndex().getSchema().getVersion();
-    return reindexer == null || reindexer.getVersion() == readVersion;
-  }
-
-  private static void validateReindexerNotRunning(OnlineReindexer<?, ?, ?> reindexer)
-      throws ReindexerAlreadyRunningException {
-    if (reindexer != null && reindexer.isRunning()) {
-      throw new ReindexerAlreadyRunningException();
-    }
-  }
-
-  private <V> void markNotReady(
-      String name, Iterable<Version<V>> versions, Collection<Version<V>> inUse) {
-    GerritIndexStatus cfg = createIndexStatus();
-    boolean dirty = false;
-    for (Version<V> v : versions) {
-      if (isDirty(inUse, v)) {
-        cfg.setReady(name, v.version, false);
-        dirty = true;
-      }
-    }
-    if (dirty) {
-      try {
-        cfg.save();
-      } catch (IOException e) {
-        throw fail(e);
-      }
-    }
-  }
-
-  private ProvisionException fail(Throwable t) {
-    ProvisionException e = new ProvisionException("Error scanning indexes");
-    e.initCause(t);
-    return e;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountField.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountField.java
deleted file mode 100644
index a5655c4..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountField.java
+++ /dev/null
@@ -1,148 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.index.account;
-
-import static com.google.gerrit.index.FieldDef.exact;
-import static com.google.gerrit.index.FieldDef.integer;
-import static com.google.gerrit.index.FieldDef.prefix;
-import static com.google.gerrit.index.FieldDef.storedOnly;
-import static com.google.gerrit.index.FieldDef.timestamp;
-import static java.util.stream.Collectors.toSet;
-
-import com.google.common.base.Predicates;
-import com.google.common.base.Strings;
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.index.FieldDef;
-import com.google.gerrit.index.SchemaUtil;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.index.RefState;
-import java.sql.Timestamp;
-import java.util.Collections;
-import java.util.Locale;
-import java.util.Set;
-import org.eclipse.jgit.lib.ObjectId;
-
-/** Secondary index schemas for accounts. */
-public class AccountField {
-  public static final FieldDef<AccountState, Integer> ID =
-      integer("id").stored().build(a -> a.getAccount().getId().get());
-
-  public static final FieldDef<AccountState, Iterable<String>> EXTERNAL_ID =
-      exact("external_id")
-          .buildRepeatable(a -> Iterables.transform(a.getExternalIds(), id -> id.key().get()));
-
-  /** Fuzzy prefix match on name and email parts. */
-  public static final FieldDef<AccountState, Iterable<String>> NAME_PART =
-      prefix("name")
-          .buildRepeatable(
-              a -> {
-                String fullName = a.getAccount().getFullName();
-                Set<String> parts =
-                    SchemaUtil.getNameParts(
-                        fullName, Iterables.transform(a.getExternalIds(), ExternalId::email));
-
-                // Additional values not currently added by getPersonParts.
-                // TODO(dborowitz): Move to getPersonParts and remove this hack.
-                if (fullName != null) {
-                  parts.add(fullName.toLowerCase(Locale.US));
-                }
-                return parts;
-              });
-
-  public static final FieldDef<AccountState, String> FULL_NAME =
-      exact("full_name").build(a -> a.getAccount().getFullName());
-
-  public static final FieldDef<AccountState, String> ACTIVE =
-      exact("inactive").build(a -> a.getAccount().isActive() ? "1" : "0");
-
-  public static final FieldDef<AccountState, Iterable<String>> EMAIL =
-      prefix("email")
-          .buildRepeatable(
-              a ->
-                  FluentIterable.from(a.getExternalIds())
-                      .transform(ExternalId::email)
-                      .append(Collections.singleton(a.getAccount().getPreferredEmail()))
-                      .filter(Predicates.notNull())
-                      .transform(String::toLowerCase)
-                      .toSet());
-
-  public static final FieldDef<AccountState, String> PREFERRED_EMAIL =
-      prefix("preferredemail")
-          .build(
-              a -> {
-                String preferredEmail = a.getAccount().getPreferredEmail();
-                return preferredEmail != null ? preferredEmail.toLowerCase() : null;
-              });
-
-  public static final FieldDef<AccountState, String> PREFERRED_EMAIL_EXACT =
-      exact("preferredemail_exact").build(a -> a.getAccount().getPreferredEmail());
-
-  public static final FieldDef<AccountState, Timestamp> REGISTERED =
-      timestamp("registered").build(a -> a.getAccount().getRegisteredOn());
-
-  public static final FieldDef<AccountState, String> USERNAME =
-      exact("username").build(a -> Strings.nullToEmpty(a.getUserName()).toLowerCase());
-
-  public static final FieldDef<AccountState, Iterable<String>> WATCHED_PROJECT =
-      exact("watchedproject")
-          .buildRepeatable(
-              a ->
-                  FluentIterable.from(a.getProjectWatches().keySet())
-                      .transform(k -> k.project().get())
-                      .toSet());
-
-  /**
-   * All values of all refs that were used in the course of indexing this document, except the
-   * refs/meta/external-ids notes branch which is handled specially (see {@link
-   * #EXTERNAL_ID_STATE}).
-   *
-   * <p>Emitted as UTF-8 encoded strings of the form {@code project:ref/name:[hex sha]}.
-   */
-  public static final FieldDef<AccountState, Iterable<byte[]>> REF_STATE =
-      storedOnly("ref_state")
-          .buildRepeatable(
-              a -> {
-                if (a.getAccount().getMetaId() == null) {
-                  return ImmutableList.of();
-                }
-
-                return ImmutableList.of(
-                    RefState.create(
-                            RefNames.refsUsers(a.getAccount().getId()),
-                            ObjectId.fromString(a.getAccount().getMetaId()))
-                        .toByteArray(a.getAllUsersNameForIndexing()));
-              });
-
-  /**
-   * All note values of all external IDs that were used in the course of indexing this document.
-   *
-   * <p>Emitted as UTF-8 encoded strings of the form {@code [hex sha of external ID]:[hex sha of
-   * note blob]}, or with other words {@code [note ID]:[note data ID]}.
-   */
-  public static final FieldDef<AccountState, Iterable<byte[]>> EXTERNAL_ID_STATE =
-      storedOnly("external_id_state")
-          .buildRepeatable(
-              a ->
-                  a.getExternalIds().stream()
-                      .filter(e -> e.blobId() != null)
-                      .map(e -> e.toByteArray())
-                      .collect(toSet()));
-
-  private AccountField() {}
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexRewriter.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexRewriter.java
deleted file mode 100644
index bc0970e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexRewriter.java
+++ /dev/null
@@ -1,44 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.index.account;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.gerrit.index.IndexRewriter;
-import com.google.gerrit.index.QueryOptions;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.index.query.QueryParseException;
-import com.google.gerrit.server.account.AccountState;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-@Singleton
-public class AccountIndexRewriter implements IndexRewriter<AccountState> {
-
-  private final AccountIndexCollection indexes;
-
-  @Inject
-  AccountIndexRewriter(AccountIndexCollection indexes) {
-    this.indexes = indexes;
-  }
-
-  @Override
-  public Predicate<AccountState> rewrite(Predicate<AccountState> in, QueryOptions opts)
-      throws QueryParseException {
-    AccountIndex index = indexes.getSearchIndex();
-    checkNotNull(index, "no active search index configured for accounts");
-    return new IndexedAccountQuery(index, in, opts);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexer.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexer.java
deleted file mode 100644
index dd24714..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexer.java
+++ /dev/null
@@ -1,28 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.index.account;
-
-import com.google.gerrit.reviewdb.client.Account;
-import java.io.IOException;
-
-public interface AccountIndexer {
-
-  /**
-   * Synchronously index an account.
-   *
-   * @param id account id to index.
-   */
-  void index(Account.Id id) throws IOException;
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexerImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexerImpl.java
deleted file mode 100644
index 6ec1260..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexerImpl.java
+++ /dev/null
@@ -1,91 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.index.account;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.events.AccountIndexedListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.index.Index;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.AccountState;
-import com.google.inject.assistedinject.Assisted;
-import com.google.inject.assistedinject.AssistedInject;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Collections;
-
-public class AccountIndexerImpl implements AccountIndexer {
-  public interface Factory {
-    AccountIndexerImpl create(AccountIndexCollection indexes);
-
-    AccountIndexerImpl create(@Nullable AccountIndex index);
-  }
-
-  private final AccountCache byIdCache;
-  private final DynamicSet<AccountIndexedListener> indexedListener;
-  private final AccountIndexCollection indexes;
-  private final AccountIndex index;
-
-  @AssistedInject
-  AccountIndexerImpl(
-      AccountCache byIdCache,
-      DynamicSet<AccountIndexedListener> indexedListener,
-      @Assisted AccountIndexCollection indexes) {
-    this.byIdCache = byIdCache;
-    this.indexedListener = indexedListener;
-    this.indexes = indexes;
-    this.index = null;
-  }
-
-  @AssistedInject
-  AccountIndexerImpl(
-      AccountCache byIdCache,
-      DynamicSet<AccountIndexedListener> indexedListener,
-      @Assisted AccountIndex index) {
-    this.byIdCache = byIdCache;
-    this.indexedListener = indexedListener;
-    this.indexes = null;
-    this.index = index;
-  }
-
-  @Override
-  public void index(Account.Id id) throws IOException {
-    for (Index<Account.Id, AccountState> i : getWriteIndexes()) {
-      AccountState accountState = byIdCache.getOrNull(id);
-      if (accountState != null) {
-        i.replace(accountState);
-      } else {
-        i.delete(id);
-      }
-    }
-    fireAccountIndexedEvent(id.get());
-  }
-
-  private void fireAccountIndexedEvent(int id) {
-    for (AccountIndexedListener listener : indexedListener) {
-      listener.onAccountIndexed(id);
-    }
-  }
-
-  private Collection<AccountIndex> getWriteIndexes() {
-    if (indexes != null) {
-      return indexes.getWriteIndexes();
-    }
-
-    return index != null ? Collections.singleton(index) : ImmutableSet.<AccountIndex>of();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountSchemaDefinitions.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountSchemaDefinitions.java
deleted file mode 100644
index dcdf9e3..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountSchemaDefinitions.java
+++ /dev/null
@@ -1,51 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.index.account;
-
-import static com.google.gerrit.index.SchemaUtil.schema;
-
-import com.google.gerrit.index.Schema;
-import com.google.gerrit.index.SchemaDefinitions;
-import com.google.gerrit.server.account.AccountState;
-
-public class AccountSchemaDefinitions extends SchemaDefinitions<AccountState> {
-  @Deprecated
-  static final Schema<AccountState> V4 =
-      schema(
-          AccountField.ACTIVE,
-          AccountField.EMAIL,
-          AccountField.EXTERNAL_ID,
-          AccountField.FULL_NAME,
-          AccountField.ID,
-          AccountField.NAME_PART,
-          AccountField.REGISTERED,
-          AccountField.USERNAME,
-          AccountField.WATCHED_PROJECT);
-
-  @Deprecated static final Schema<AccountState> V5 = schema(V4, AccountField.PREFERRED_EMAIL);
-
-  @Deprecated
-  static final Schema<AccountState> V6 =
-      schema(V5, AccountField.REF_STATE, AccountField.EXTERNAL_ID_STATE);
-
-  static final Schema<AccountState> V7 = schema(V6, AccountField.PREFERRED_EMAIL_EXACT);
-
-  public static final String NAME = "accounts";
-  public static final AccountSchemaDefinitions INSTANCE = new AccountSchemaDefinitions();
-
-  private AccountSchemaDefinitions() {
-    super(NAME, AccountState.class);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AllAccountsIndexer.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AllAccountsIndexer.java
deleted file mode 100644
index c66ef30..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AllAccountsIndexer.java
+++ /dev/null
@@ -1,124 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.index.account;
-
-import static com.google.gerrit.server.git.QueueProvider.QueueType.BATCH;
-
-import com.google.common.base.Stopwatch;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.ListeningExecutorService;
-import com.google.gerrit.index.SiteIndexer;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.account.Accounts;
-import com.google.gerrit.server.index.IndexExecutor;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-import org.eclipse.jgit.lib.ProgressMonitor;
-import org.eclipse.jgit.lib.TextProgressMonitor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class AllAccountsIndexer extends SiteIndexer<Account.Id, AccountState, AccountIndex> {
-  private static final Logger log = LoggerFactory.getLogger(AllAccountsIndexer.class);
-
-  private final ListeningExecutorService executor;
-  private final Accounts accounts;
-  private final AccountCache accountCache;
-
-  @Inject
-  AllAccountsIndexer(
-      @IndexExecutor(BATCH) ListeningExecutorService executor,
-      Accounts accounts,
-      AccountCache accountCache) {
-    this.executor = executor;
-    this.accounts = accounts;
-    this.accountCache = accountCache;
-  }
-
-  @Override
-  public SiteIndexer.Result indexAll(AccountIndex index) {
-    ProgressMonitor progress = new TextProgressMonitor(newPrintWriter(progressOut));
-    progress.start(2);
-    Stopwatch sw = Stopwatch.createStarted();
-    List<Account.Id> ids;
-    try {
-      ids = collectAccounts(progress);
-    } catch (IOException e) {
-      log.error("Error collecting accounts", e);
-      return new SiteIndexer.Result(sw, false, 0, 0);
-    }
-    return reindexAccounts(index, ids, progress);
-  }
-
-  private SiteIndexer.Result reindexAccounts(
-      AccountIndex index, List<Account.Id> ids, ProgressMonitor progress) {
-    progress.beginTask("Reindexing accounts", ids.size());
-    List<ListenableFuture<?>> futures = new ArrayList<>(ids.size());
-    AtomicBoolean ok = new AtomicBoolean(true);
-    AtomicInteger done = new AtomicInteger();
-    AtomicInteger failed = new AtomicInteger();
-    Stopwatch sw = Stopwatch.createStarted();
-    for (Account.Id id : ids) {
-      String desc = "account " + id;
-      ListenableFuture<?> future =
-          executor.submit(
-              () -> {
-                try {
-                  accountCache.evict(id);
-                  index.replace(accountCache.get(id));
-                  verboseWriter.println("Reindexed " + desc);
-                  done.incrementAndGet();
-                } catch (Exception e) {
-                  failed.incrementAndGet();
-                  throw e;
-                }
-                return null;
-              });
-      addErrorListener(future, desc, progress, ok);
-      futures.add(future);
-    }
-
-    try {
-      Futures.successfulAsList(futures).get();
-    } catch (ExecutionException | InterruptedException e) {
-      log.error("Error waiting on account futures", e);
-      return new SiteIndexer.Result(sw, false, 0, 0);
-    }
-
-    progress.endTask();
-    return new SiteIndexer.Result(sw, ok.get(), done.get(), failed.get());
-  }
-
-  private List<Account.Id> collectAccounts(ProgressMonitor progress) throws IOException {
-    progress.beginTask("Collecting accounts", ProgressMonitor.UNKNOWN);
-    List<Account.Id> ids = new ArrayList<>();
-    for (Account.Id accountId : accounts.allIds()) {
-      ids.add(accountId);
-      progress.update(1);
-    }
-    progress.endTask();
-    return ids;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/AllChangesIndexer.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/AllChangesIndexer.java
deleted file mode 100644
index 56d5ba5..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/AllChangesIndexer.java
+++ /dev/null
@@ -1,273 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.index.change;
-
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.common.util.concurrent.Futures.successfulAsList;
-import static com.google.common.util.concurrent.Futures.transform;
-import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
-import static com.google.gerrit.server.git.QueueProvider.QueueType.BATCH;
-
-import com.google.common.base.Stopwatch;
-import com.google.common.collect.ComparisonChain;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.ListeningExecutorService;
-import com.google.gerrit.index.SiteIndexer;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MultiProgressMonitor;
-import com.google.gerrit.server.git.MultiProgressMonitor.Task;
-import com.google.gerrit.server.index.IndexExecutor;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.ChangeNotes.Factory.ChangeNotesResult;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-import java.util.SortedSet;
-import java.util.TreeSet;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.RejectedExecutionException;
-import java.util.concurrent.atomic.AtomicBoolean;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.ProgressMonitor;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.lib.TextProgressMonitor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class AllChangesIndexer extends SiteIndexer<Change.Id, ChangeData, ChangeIndex> {
-  private static final Logger log = LoggerFactory.getLogger(AllChangesIndexer.class);
-
-  private final SchemaFactory<ReviewDb> schemaFactory;
-  private final ChangeData.Factory changeDataFactory;
-  private final GitRepositoryManager repoManager;
-  private final ListeningExecutorService executor;
-  private final ChangeIndexer.Factory indexerFactory;
-  private final ChangeNotes.Factory notesFactory;
-  private final ProjectCache projectCache;
-
-  @Inject
-  AllChangesIndexer(
-      SchemaFactory<ReviewDb> schemaFactory,
-      ChangeData.Factory changeDataFactory,
-      GitRepositoryManager repoManager,
-      @IndexExecutor(BATCH) ListeningExecutorService executor,
-      ChangeIndexer.Factory indexerFactory,
-      ChangeNotes.Factory notesFactory,
-      ProjectCache projectCache) {
-    this.schemaFactory = schemaFactory;
-    this.changeDataFactory = changeDataFactory;
-    this.repoManager = repoManager;
-    this.executor = executor;
-    this.indexerFactory = indexerFactory;
-    this.notesFactory = notesFactory;
-    this.projectCache = projectCache;
-  }
-
-  private static class ProjectHolder implements Comparable<ProjectHolder> {
-    final Project.NameKey name;
-    private final long size;
-
-    ProjectHolder(Project.NameKey name, long size) {
-      this.name = name;
-      this.size = size;
-    }
-
-    @Override
-    public int compareTo(ProjectHolder other) {
-      // Sort projects based on size first to maximize utilization of threads early on.
-      return ComparisonChain.start()
-          .compare(other.size, size)
-          .compare(other.name.get(), name.get())
-          .result();
-    }
-  }
-
-  @Override
-  public Result indexAll(ChangeIndex index) {
-    ProgressMonitor pm = new TextProgressMonitor();
-    pm.beginTask("Collecting projects", ProgressMonitor.UNKNOWN);
-    SortedSet<ProjectHolder> projects = new TreeSet<>();
-    int changeCount = 0;
-    Stopwatch sw = Stopwatch.createStarted();
-    int projectsFailed = 0;
-    for (Project.NameKey name : projectCache.all()) {
-      try (Repository repo = repoManager.openRepository(name)) {
-        long size = estimateSize(repo);
-        changeCount += size;
-        projects.add(new ProjectHolder(name, size));
-      } catch (IOException e) {
-        log.error("Error collecting project {}", name, e);
-        projectsFailed++;
-        if (projectsFailed > projects.size() / 2) {
-          log.error("Over 50% of the projects could not be collected: aborted");
-          return new Result(sw, false, 0, 0);
-        }
-      }
-      pm.update(1);
-    }
-    pm.endTask();
-    setTotalWork(changeCount);
-    return indexAll(index, projects);
-  }
-
-  private long estimateSize(Repository repo) throws IOException {
-    // Estimate size based on IDs that show up in ref names. This is not perfect, since patch set
-    // refs may exist for changes whose metadata was never successfully stored. But that's ok, as
-    // the estimate is just used as a heuristic for sorting projects.
-    return repo.getRefDatabase().getRefs(RefNames.REFS_CHANGES).values().stream()
-        .map(r -> Change.Id.fromRef(r.getName()))
-        .filter(Objects::nonNull)
-        .distinct()
-        .count();
-  }
-
-  private SiteIndexer.Result indexAll(ChangeIndex index, SortedSet<ProjectHolder> projects) {
-    Stopwatch sw = Stopwatch.createStarted();
-    MultiProgressMonitor mpm = new MultiProgressMonitor(progressOut, "Reindexing changes");
-    Task projTask = mpm.beginSubTask("projects", projects.size());
-    checkState(totalWork >= 0);
-    Task doneTask = mpm.beginSubTask(null, totalWork);
-    Task failedTask = mpm.beginSubTask("failed", MultiProgressMonitor.UNKNOWN);
-
-    List<ListenableFuture<?>> futures = new ArrayList<>();
-    AtomicBoolean ok = new AtomicBoolean(true);
-
-    for (ProjectHolder project : projects) {
-      ListenableFuture<?> future =
-          executor.submit(
-              reindexProject(
-                  indexerFactory.create(executor, index), project.name, doneTask, failedTask));
-      addErrorListener(future, "project " + project.name, projTask, ok);
-      futures.add(future);
-    }
-
-    try {
-      mpm.waitFor(
-          transform(
-              successfulAsList(futures),
-              x -> {
-                mpm.end();
-                return null;
-              },
-              directExecutor()));
-    } catch (ExecutionException e) {
-      log.error("Error in batch indexer", e);
-      ok.set(false);
-    }
-    // If too many changes failed, maybe there was a bug in the indexer. Don't
-    // trust the results. This is not an exact percentage since we bump the same
-    // failure counter if a project can't be read, but close enough.
-    int nFailed = failedTask.getCount();
-    int nDone = doneTask.getCount();
-    int nTotal = nFailed + nDone;
-    double pctFailed = ((double) nFailed) / nTotal * 100;
-    if (pctFailed > 10) {
-      log.error(
-          "Failed {}/{} changes ({}%); not marking new index as ready",
-          nFailed, nTotal, Math.round(pctFailed));
-      ok.set(false);
-    }
-    return new Result(sw, ok.get(), nDone, nFailed);
-  }
-
-  public Callable<Void> reindexProject(
-      ChangeIndexer indexer, Project.NameKey project, Task done, Task failed) {
-    return new ProjectIndexer(indexer, project, done, failed);
-  }
-
-  private class ProjectIndexer implements Callable<Void> {
-    private final ChangeIndexer indexer;
-    private final Project.NameKey project;
-    private final ProgressMonitor done;
-    private final ProgressMonitor failed;
-
-    private ProjectIndexer(
-        ChangeIndexer indexer,
-        Project.NameKey project,
-        ProgressMonitor done,
-        ProgressMonitor failed) {
-      this.indexer = indexer;
-      this.project = project;
-      this.done = done;
-      this.failed = failed;
-    }
-
-    @Override
-    public Void call() throws Exception {
-      try (Repository repo = repoManager.openRepository(project);
-          ReviewDb db = schemaFactory.open()) {
-        // Order of scanning changes is undefined. This is ok if we assume that packfile locality is
-        // not important for indexing, since sites should have a fully populated DiffSummary cache.
-        // It does mean that reindexing after invalidating the DiffSummary cache will be expensive,
-        // but the goal is to invalidate that cache as infrequently as we possibly can. And besides,
-        // we don't have concrete proof that improving packfile locality would help.
-        notesFactory.scan(repo, db, project).forEach(r -> index(db, r));
-      } catch (RepositoryNotFoundException rnfe) {
-        log.error(rnfe.getMessage());
-      }
-      return null;
-    }
-
-    private void index(ReviewDb db, ChangeNotesResult r) {
-      if (r.error().isPresent()) {
-        fail("Failed to read change " + r.id() + " for indexing", true, r.error().get());
-        return;
-      }
-      try {
-        indexer.index(changeDataFactory.create(db, r.notes()));
-        done.update(1);
-        verboseWriter.println("Reindexed change " + r.id());
-      } catch (RejectedExecutionException e) {
-        // Server shutdown, don't spam the logs.
-        failSilently();
-      } catch (Exception e) {
-        fail("Failed to index change " + r.id(), true, e);
-      }
-    }
-
-    private void fail(String error, boolean failed, Exception e) {
-      if (failed) {
-        this.failed.update(1);
-      }
-
-      if (e != null) {
-        log.warn(error, e);
-      } else {
-        log.warn(error);
-      }
-
-      verboseWriter.println(error);
-    }
-
-    private void failSilently() {
-      this.failed.update(1);
-    }
-
-    @Override
-    public String toString() {
-      return "Index all changes of project " + project.get();
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeField.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeField.java
deleted file mode 100644
index 9ad8a25..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeField.java
+++ /dev/null
@@ -1,793 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.index.change;
-
-import static com.google.common.base.MoreObjects.firstNonNull;
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.gerrit.index.FieldDef.exact;
-import static com.google.gerrit.index.FieldDef.fullText;
-import static com.google.gerrit.index.FieldDef.intRange;
-import static com.google.gerrit.index.FieldDef.integer;
-import static com.google.gerrit.index.FieldDef.prefix;
-import static com.google.gerrit.index.FieldDef.storedOnly;
-import static com.google.gerrit.index.FieldDef.timestamp;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.stream.Collectors.toList;
-import static java.util.stream.Collectors.toSet;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Splitter;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ImmutableTable;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Table;
-import com.google.gerrit.common.data.SubmitRecord;
-import com.google.gerrit.index.FieldDef;
-import com.google.gerrit.index.SchemaUtil;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.OutputFormat;
-import com.google.gerrit.server.ReviewerByEmailSet;
-import com.google.gerrit.server.ReviewerSet;
-import com.google.gerrit.server.StarredChangesUtil;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.index.RefState;
-import com.google.gerrit.server.index.change.StalenessChecker.RefStatePattern;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
-import com.google.gerrit.server.notedb.ReviewerStateInternal;
-import com.google.gerrit.server.notedb.RobotCommentNotes;
-import com.google.gerrit.server.project.SubmitRuleOptions;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.ChangeQueryBuilder;
-import com.google.gerrit.server.query.change.ChangeStatusPredicate;
-import com.google.gson.Gson;
-import com.google.gwtorm.protobuf.CodecFactory;
-import com.google.gwtorm.protobuf.ProtobufCodec;
-import com.google.gwtorm.server.OrmException;
-import com.google.protobuf.CodedOutputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Objects;
-import java.util.Set;
-import java.util.function.Function;
-import java.util.stream.Stream;
-import org.eclipse.jgit.lib.PersonIdent;
-
-/**
- * Fields indexed on change documents.
- *
- * <p>Each field corresponds to both a field name supported by {@link ChangeQueryBuilder} for
- * querying that field, and a method on {@link ChangeData} used for populating the corresponding
- * document fields in the secondary index.
- *
- * <p>Field names are all lowercase alphanumeric plus underscore; index implementations may create
- * unambiguous derived field names containing other characters.
- */
-public class ChangeField {
-  public static final int NO_ASSIGNEE = -1;
-
-  private static final Gson GSON = OutputFormat.JSON_COMPACT.newGson();
-
-  /** Legacy change ID. */
-  public static final FieldDef<ChangeData, Integer> LEGACY_ID =
-      integer("legacy_id").stored().build(cd -> cd.getId().get());
-
-  /** Newer style Change-Id key. */
-  public static final FieldDef<ChangeData, String> ID =
-      prefix(ChangeQueryBuilder.FIELD_CHANGE_ID).build(changeGetter(c -> c.getKey().get()));
-
-  /** Change status string, in the same format as {@code status:}. */
-  public static final FieldDef<ChangeData, String> STATUS =
-      exact(ChangeQueryBuilder.FIELD_STATUS)
-          .build(changeGetter(c -> ChangeStatusPredicate.canonicalize(c.getStatus())));
-
-  /** Project containing the change. */
-  public static final FieldDef<ChangeData, String> PROJECT =
-      exact(ChangeQueryBuilder.FIELD_PROJECT)
-          .stored()
-          .build(changeGetter(c -> c.getProject().get()));
-
-  /** Project containing the change, as a prefix field. */
-  public static final FieldDef<ChangeData, String> PROJECTS =
-      prefix(ChangeQueryBuilder.FIELD_PROJECTS).build(changeGetter(c -> c.getProject().get()));
-
-  /** Reference (aka branch) the change will submit onto. */
-  public static final FieldDef<ChangeData, String> REF =
-      exact(ChangeQueryBuilder.FIELD_REF).build(changeGetter(c -> c.getDest().get()));
-
-  /** Topic, a short annotation on the branch. */
-  public static final FieldDef<ChangeData, String> EXACT_TOPIC =
-      exact("topic4").build(ChangeField::getTopic);
-
-  /** Topic, a short annotation on the branch. */
-  public static final FieldDef<ChangeData, String> FUZZY_TOPIC =
-      fullText("topic5").build(ChangeField::getTopic);
-
-  /** Submission id assigned by MergeOp. */
-  public static final FieldDef<ChangeData, String> SUBMISSIONID =
-      exact(ChangeQueryBuilder.FIELD_SUBMISSIONID).build(changeGetter(Change::getSubmissionId));
-
-  /** Last update time since January 1, 1970. */
-  public static final FieldDef<ChangeData, Timestamp> UPDATED =
-      timestamp("updated2").stored().build(changeGetter(Change::getLastUpdatedOn));
-
-  /** List of full file paths modified in the current patch set. */
-  public static final FieldDef<ChangeData, Iterable<String>> PATH =
-      // Named for backwards compatibility.
-      exact(ChangeQueryBuilder.FIELD_FILE)
-          .buildRepeatable(cd -> firstNonNull(cd.currentFilePaths(), ImmutableList.of()));
-
-  public static Set<String> getFileParts(ChangeData cd) throws OrmException {
-    List<String> paths;
-    try {
-      paths = cd.currentFilePaths();
-    } catch (IOException e) {
-      throw new OrmException(e);
-    }
-
-    Splitter s = Splitter.on('/').omitEmptyStrings();
-    Set<String> r = new HashSet<>();
-    for (String path : paths) {
-      for (String part : s.split(path)) {
-        r.add(part);
-      }
-    }
-    return r;
-  }
-
-  /** Hashtags tied to a change */
-  public static final FieldDef<ChangeData, Iterable<String>> HASHTAG =
-      exact(ChangeQueryBuilder.FIELD_HASHTAG)
-          .buildRepeatable(cd -> cd.hashtags().stream().map(String::toLowerCase).collect(toSet()));
-
-  /** Hashtags with original case. */
-  public static final FieldDef<ChangeData, Iterable<byte[]>> HASHTAG_CASE_AWARE =
-      storedOnly("_hashtag")
-          .buildRepeatable(
-              cd -> cd.hashtags().stream().map(t -> t.getBytes(UTF_8)).collect(toSet()));
-
-  /** Components of each file path modified in the current patch set. */
-  public static final FieldDef<ChangeData, Iterable<String>> FILE_PART =
-      exact(ChangeQueryBuilder.FIELD_FILEPART).buildRepeatable(ChangeField::getFileParts);
-
-  /** Owner/creator of the change. */
-  public static final FieldDef<ChangeData, Integer> OWNER =
-      integer(ChangeQueryBuilder.FIELD_OWNER).build(changeGetter(c -> c.getOwner().get()));
-
-  /** The user assigned to the change. */
-  public static final FieldDef<ChangeData, Integer> ASSIGNEE =
-      integer(ChangeQueryBuilder.FIELD_ASSIGNEE)
-          .build(changeGetter(c -> c.getAssignee() != null ? c.getAssignee().get() : NO_ASSIGNEE));
-
-  /** Reviewer(s) associated with the change. */
-  public static final FieldDef<ChangeData, Iterable<String>> REVIEWER =
-      exact("reviewer2").stored().buildRepeatable(cd -> getReviewerFieldValues(cd.reviewers()));
-
-  /** Reviewer(s) associated with the change that do not have a gerrit account. */
-  public static final FieldDef<ChangeData, Iterable<String>> REVIEWER_BY_EMAIL =
-      exact("reviewer_by_email")
-          .stored()
-          .buildRepeatable(cd -> getReviewerByEmailFieldValues(cd.reviewersByEmail()));
-
-  /** Reviewer(s) modified during change's current WIP phase. */
-  public static final FieldDef<ChangeData, Iterable<String>> PENDING_REVIEWER =
-      exact(ChangeQueryBuilder.FIELD_PENDING_REVIEWER)
-          .stored()
-          .buildRepeatable(cd -> getReviewerFieldValues(cd.pendingReviewers()));
-
-  /** Reviewer(s) by email modified during change's current WIP phase. */
-  public static final FieldDef<ChangeData, Iterable<String>> PENDING_REVIEWER_BY_EMAIL =
-      exact(ChangeQueryBuilder.FIELD_PENDING_REVIEWER_BY_EMAIL)
-          .stored()
-          .buildRepeatable(cd -> getReviewerByEmailFieldValues(cd.pendingReviewersByEmail()));
-
-  /** References a change that this change reverts. */
-  public static final FieldDef<ChangeData, Integer> REVERT_OF =
-      integer(ChangeQueryBuilder.FIELD_REVERTOF)
-          .build(cd -> cd.change().getRevertOf() != null ? cd.change().getRevertOf().get() : null);
-
-  @VisibleForTesting
-  static List<String> getReviewerFieldValues(ReviewerSet reviewers) {
-    List<String> r = new ArrayList<>(reviewers.asTable().size() * 2);
-    for (Table.Cell<ReviewerStateInternal, Account.Id, Timestamp> c :
-        reviewers.asTable().cellSet()) {
-      String v = getReviewerFieldValue(c.getRowKey(), c.getColumnKey());
-      r.add(v);
-      r.add(v + ',' + c.getValue().getTime());
-    }
-    return r;
-  }
-
-  public static String getReviewerFieldValue(ReviewerStateInternal state, Account.Id id) {
-    return state.toString() + ',' + id;
-  }
-
-  @VisibleForTesting
-  static List<String> getReviewerByEmailFieldValues(ReviewerByEmailSet reviewersByEmail) {
-    List<String> r = new ArrayList<>(reviewersByEmail.asTable().size() * 2);
-    for (Table.Cell<ReviewerStateInternal, Address, Timestamp> c :
-        reviewersByEmail.asTable().cellSet()) {
-      String v = getReviewerByEmailFieldValue(c.getRowKey(), c.getColumnKey());
-      r.add(v);
-      if (c.getColumnKey().getName() != null) {
-        // Add another entry without the name to provide search functionality on the email
-        Address emailOnly = new Address(c.getColumnKey().getEmail());
-        r.add(getReviewerByEmailFieldValue(c.getRowKey(), emailOnly));
-      }
-      r.add(v + ',' + c.getValue().getTime());
-    }
-    return r;
-  }
-
-  public static String getReviewerByEmailFieldValue(ReviewerStateInternal state, Address adr) {
-    return state.toString() + ',' + adr;
-  }
-
-  public static ReviewerSet parseReviewerFieldValues(Iterable<String> values) {
-    ImmutableTable.Builder<ReviewerStateInternal, Account.Id, Timestamp> b =
-        ImmutableTable.builder();
-    for (String v : values) {
-      int f = v.indexOf(',');
-      if (f < 0) {
-        continue;
-      }
-      int l = v.lastIndexOf(',');
-      if (l == f) {
-        continue;
-      }
-      b.put(
-          ReviewerStateInternal.valueOf(v.substring(0, f)),
-          Account.Id.parse(v.substring(f + 1, l)),
-          new Timestamp(Long.valueOf(v.substring(l + 1, v.length()))));
-    }
-    return ReviewerSet.fromTable(b.build());
-  }
-
-  public static ReviewerByEmailSet parseReviewerByEmailFieldValues(Iterable<String> values) {
-    ImmutableTable.Builder<ReviewerStateInternal, Address, Timestamp> b = ImmutableTable.builder();
-    for (String v : values) {
-      int f = v.indexOf(',');
-      if (f < 0) {
-        continue;
-      }
-      int l = v.lastIndexOf(',');
-      if (l == f) {
-        continue;
-      }
-      b.put(
-          ReviewerStateInternal.valueOf(v.substring(0, f)),
-          Address.parse(v.substring(f + 1, l)),
-          new Timestamp(Long.valueOf(v.substring(l + 1, v.length()))));
-    }
-    return ReviewerByEmailSet.fromTable(b.build());
-  }
-
-  /** Commit ID of any patch set on the change, using prefix match. */
-  public static final FieldDef<ChangeData, Iterable<String>> COMMIT =
-      prefix(ChangeQueryBuilder.FIELD_COMMIT).buildRepeatable(ChangeField::getRevisions);
-
-  /** Commit ID of any patch set on the change, using exact match. */
-  public static final FieldDef<ChangeData, Iterable<String>> EXACT_COMMIT =
-      exact(ChangeQueryBuilder.FIELD_EXACTCOMMIT).buildRepeatable(ChangeField::getRevisions);
-
-  private static Set<String> getRevisions(ChangeData cd) throws OrmException {
-    Set<String> revisions = new HashSet<>();
-    for (PatchSet ps : cd.patchSets()) {
-      if (ps.getRevision() != null) {
-        revisions.add(ps.getRevision().get());
-      }
-    }
-    return revisions;
-  }
-
-  /** Tracking id extracted from a footer. */
-  public static final FieldDef<ChangeData, Iterable<String>> TR =
-      exact(ChangeQueryBuilder.FIELD_TR)
-          .buildRepeatable(cd -> ImmutableSet.copyOf(cd.trackingFooters().values()));
-
-  /** List of labels on the current patch set including change owner votes. */
-  public static final FieldDef<ChangeData, Iterable<String>> LABEL =
-      exact("label2").buildRepeatable(cd -> getLabels(cd, true));
-
-  private static Iterable<String> getLabels(ChangeData cd, boolean owners) throws OrmException {
-    Set<String> allApprovals = new HashSet<>();
-    Set<String> distinctApprovals = new HashSet<>();
-    for (PatchSetApproval a : cd.currentApprovals()) {
-      if (a.getValue() != 0 && !a.isLegacySubmit()) {
-        allApprovals.add(formatLabel(a.getLabel(), a.getValue(), a.getAccountId()));
-        if (owners && cd.change().getOwner().equals(a.getAccountId())) {
-          allApprovals.add(
-              formatLabel(a.getLabel(), a.getValue(), ChangeQueryBuilder.OWNER_ACCOUNT_ID));
-        }
-        distinctApprovals.add(formatLabel(a.getLabel(), a.getValue()));
-      }
-    }
-    allApprovals.addAll(distinctApprovals);
-    return allApprovals;
-  }
-
-  public static Set<String> getAuthorParts(ChangeData cd) throws OrmException, IOException {
-    return SchemaUtil.getPersonParts(cd.getAuthor());
-  }
-
-  public static Set<String> getAuthorNameAndEmail(ChangeData cd) throws OrmException, IOException {
-    return getNameAndEmail(cd.getAuthor());
-  }
-
-  public static Set<String> getCommitterParts(ChangeData cd) throws OrmException, IOException {
-    return SchemaUtil.getPersonParts(cd.getCommitter());
-  }
-
-  public static Set<String> getCommitterNameAndEmail(ChangeData cd)
-      throws OrmException, IOException {
-    return getNameAndEmail(cd.getCommitter());
-  }
-
-  private static Set<String> getNameAndEmail(PersonIdent person) {
-    if (person == null) {
-      return ImmutableSet.of();
-    }
-
-    String name = person.getName().toLowerCase(Locale.US);
-    String email = person.getEmailAddress().toLowerCase(Locale.US);
-
-    StringBuilder nameEmailBuilder = new StringBuilder();
-    PersonIdent.appendSanitized(nameEmailBuilder, name);
-    nameEmailBuilder.append(" <");
-    PersonIdent.appendSanitized(nameEmailBuilder, email);
-    nameEmailBuilder.append('>');
-
-    return ImmutableSet.of(name, email, nameEmailBuilder.toString());
-  }
-
-  /**
-   * The exact email address, or any part of the author name or email address, in the current patch
-   * set.
-   */
-  public static final FieldDef<ChangeData, Iterable<String>> AUTHOR =
-      fullText(ChangeQueryBuilder.FIELD_AUTHOR).buildRepeatable(ChangeField::getAuthorParts);
-
-  /** The exact name, email address and NameEmail of the author. */
-  public static final FieldDef<ChangeData, Iterable<String>> EXACT_AUTHOR =
-      exact(ChangeQueryBuilder.FIELD_EXACTAUTHOR)
-          .buildRepeatable(ChangeField::getAuthorNameAndEmail);
-
-  /**
-   * The exact email address, or any part of the committer name or email address, in the current
-   * patch set.
-   */
-  public static final FieldDef<ChangeData, Iterable<String>> COMMITTER =
-      fullText(ChangeQueryBuilder.FIELD_COMMITTER).buildRepeatable(ChangeField::getCommitterParts);
-
-  /** The exact name, email address, and NameEmail of the committer. */
-  public static final FieldDef<ChangeData, Iterable<String>> EXACT_COMMITTER =
-      exact(ChangeQueryBuilder.FIELD_EXACTCOMMITTER)
-          .buildRepeatable(ChangeField::getCommitterNameAndEmail);
-
-  public static final ProtobufCodec<Change> CHANGE_CODEC = CodecFactory.encoder(Change.class);
-
-  /** Serialized change object, used for pre-populating results. */
-  public static final FieldDef<ChangeData, byte[]> CHANGE =
-      storedOnly("_change").build(changeGetter(CHANGE_CODEC::encodeToByteArray));
-
-  public static final ProtobufCodec<PatchSetApproval> APPROVAL_CODEC =
-      CodecFactory.encoder(PatchSetApproval.class);
-
-  /** Serialized approvals for the current patch set, used for pre-populating results. */
-  public static final FieldDef<ChangeData, Iterable<byte[]>> APPROVAL =
-      storedOnly("_approval")
-          .buildRepeatable(cd -> toProtos(APPROVAL_CODEC, cd.currentApprovals()));
-
-  public static String formatLabel(String label, int value) {
-    return formatLabel(label, value, null);
-  }
-
-  public static String formatLabel(String label, int value, Account.Id accountId) {
-    return label.toLowerCase()
-        + (value >= 0 ? "+" : "")
-        + value
-        + (accountId != null ? "," + formatAccount(accountId) : "");
-  }
-
-  private static String formatAccount(Account.Id accountId) {
-    if (ChangeQueryBuilder.OWNER_ACCOUNT_ID.equals(accountId)) {
-      return ChangeQueryBuilder.ARG_ID_OWNER;
-    }
-    return Integer.toString(accountId.get());
-  }
-
-  /** Commit message of the current patch set. */
-  public static final FieldDef<ChangeData, String> COMMIT_MESSAGE =
-      fullText(ChangeQueryBuilder.FIELD_MESSAGE).build(ChangeData::commitMessage);
-
-  /** Summary or inline comment. */
-  public static final FieldDef<ChangeData, Iterable<String>> COMMENT =
-      fullText(ChangeQueryBuilder.FIELD_COMMENT)
-          .buildRepeatable(
-              cd ->
-                  Stream.concat(
-                          cd.publishedComments().stream().map(c -> c.message),
-                          cd.messages().stream().map(ChangeMessage::getMessage))
-                      .collect(toSet()));
-
-  /** Number of unresolved comments of the change. */
-  public static final FieldDef<ChangeData, Integer> UNRESOLVED_COMMENT_COUNT =
-      intRange(ChangeQueryBuilder.FIELD_UNRESOLVED_COMMENT_COUNT)
-          .stored()
-          .build(ChangeData::unresolvedCommentCount);
-
-  /** Whether the change is mergeable. */
-  public static final FieldDef<ChangeData, String> MERGEABLE =
-      exact(ChangeQueryBuilder.FIELD_MERGEABLE)
-          .stored()
-          .build(
-              cd -> {
-                Boolean m = cd.isMergeable();
-                if (m == null) {
-                  return null;
-                }
-                return m ? "1" : "0";
-              });
-
-  /** The number of inserted lines in this change. */
-  public static final FieldDef<ChangeData, Integer> ADDED =
-      intRange(ChangeQueryBuilder.FIELD_ADDED)
-          .stored()
-          .build(cd -> cd.changedLines().isPresent() ? cd.changedLines().get().insertions : null);
-
-  /** The number of deleted lines in this change. */
-  public static final FieldDef<ChangeData, Integer> DELETED =
-      intRange(ChangeQueryBuilder.FIELD_DELETED)
-          .stored()
-          .build(cd -> cd.changedLines().isPresent() ? cd.changedLines().get().deletions : null);
-
-  /** The total number of modified lines in this change. */
-  public static final FieldDef<ChangeData, Integer> DELTA =
-      intRange(ChangeQueryBuilder.FIELD_DELTA)
-          .build(cd -> cd.changedLines().map(c -> c.insertions + c.deletions).orElse(null));
-
-  /** Determines if this change is private. */
-  public static final FieldDef<ChangeData, String> PRIVATE =
-      exact(ChangeQueryBuilder.FIELD_PRIVATE).build(cd -> cd.change().isPrivate() ? "1" : "0");
-
-  /** Determines if this change is work in progress. */
-  public static final FieldDef<ChangeData, String> WIP =
-      exact(ChangeQueryBuilder.FIELD_WIP).build(cd -> cd.change().isWorkInProgress() ? "1" : "0");
-
-  /** Determines if this change has started review. */
-  public static final FieldDef<ChangeData, String> STARTED =
-      exact(ChangeQueryBuilder.FIELD_STARTED)
-          .build(cd -> cd.change().hasReviewStarted() ? "1" : "0");
-
-  /** Users who have commented on this change. */
-  public static final FieldDef<ChangeData, Iterable<Integer>> COMMENTBY =
-      integer(ChangeQueryBuilder.FIELD_COMMENTBY)
-          .buildRepeatable(
-              cd ->
-                  Stream.concat(
-                          cd.messages().stream().map(ChangeMessage::getAuthor),
-                          cd.publishedComments().stream().map(c -> c.author.getId()))
-                      .filter(Objects::nonNull)
-                      .map(Account.Id::get)
-                      .collect(toSet()));
-
-  /** Star labels on this change in the format: &lt;account-id&gt;:&lt;label&gt; */
-  public static final FieldDef<ChangeData, Iterable<String>> STAR =
-      exact(ChangeQueryBuilder.FIELD_STAR)
-          .stored()
-          .buildRepeatable(
-              cd ->
-                  Iterables.transform(
-                      cd.stars().entries(),
-                      e ->
-                          StarredChangesUtil.StarField.create(e.getKey(), e.getValue())
-                              .toString()));
-
-  /** Users that have starred the change with any label. */
-  public static final FieldDef<ChangeData, Iterable<Integer>> STARBY =
-      integer(ChangeQueryBuilder.FIELD_STARBY)
-          .buildRepeatable(cd -> Iterables.transform(cd.stars().keySet(), Account.Id::get));
-
-  /** Opaque group identifiers for this change's patch sets. */
-  public static final FieldDef<ChangeData, Iterable<String>> GROUP =
-      exact(ChangeQueryBuilder.FIELD_GROUP)
-          .buildRepeatable(
-              cd ->
-                  cd.patchSets().stream().flatMap(ps -> ps.getGroups().stream()).collect(toSet()));
-
-  public static final ProtobufCodec<PatchSet> PATCH_SET_CODEC =
-      CodecFactory.encoder(PatchSet.class);
-
-  /** Serialized patch set object, used for pre-populating results. */
-  public static final FieldDef<ChangeData, Iterable<byte[]>> PATCH_SET =
-      storedOnly("_patch_set").buildRepeatable(cd -> toProtos(PATCH_SET_CODEC, cd.patchSets()));
-
-  /** Users who have edits on this change. */
-  public static final FieldDef<ChangeData, Iterable<Integer>> EDITBY =
-      integer(ChangeQueryBuilder.FIELD_EDITBY)
-          .buildRepeatable(cd -> cd.editsByUser().stream().map(Account.Id::get).collect(toSet()));
-
-  /** Users who have draft comments on this change. */
-  public static final FieldDef<ChangeData, Iterable<Integer>> DRAFTBY =
-      integer(ChangeQueryBuilder.FIELD_DRAFTBY)
-          .buildRepeatable(cd -> cd.draftsByUser().stream().map(Account.Id::get).collect(toSet()));
-
-  public static final Integer NOT_REVIEWED = -1;
-
-  /**
-   * Users the change was reviewed by since the last author update.
-   *
-   * <p>A change is considered reviewed by a user if the latest update by that user is newer than
-   * the latest update by the change author. Both top-level change messages and new patch sets are
-   * considered to be updates.
-   *
-   * <p>If the latest update is by the change owner, then the special value {@link #NOT_REVIEWED} is
-   * emitted.
-   */
-  public static final FieldDef<ChangeData, Iterable<Integer>> REVIEWEDBY =
-      integer(ChangeQueryBuilder.FIELD_REVIEWEDBY)
-          .stored()
-          .buildRepeatable(
-              cd -> {
-                Set<Account.Id> reviewedBy = cd.reviewedBy();
-                if (reviewedBy.isEmpty()) {
-                  return ImmutableSet.of(NOT_REVIEWED);
-                }
-                return reviewedBy.stream().map(Account.Id::get).collect(toList());
-              });
-
-  // Submit rule options in this class should never use fastEvalLabels. This
-  // slows down indexing slightly but produces correct search results.
-  public static final SubmitRuleOptions SUBMIT_RULE_OPTIONS_LENIENT =
-      SubmitRuleOptions.defaults().allowClosed(true).build();
-
-  public static final SubmitRuleOptions SUBMIT_RULE_OPTIONS_STRICT =
-      SubmitRuleOptions.defaults().build();
-
-  /**
-   * JSON type for storing SubmitRecords.
-   *
-   * <p>Stored fields need to use a stable format over a long period; this type insulates the index
-   * from implementation changes in SubmitRecord itself.
-   */
-  static class StoredSubmitRecord {
-    static class StoredLabel {
-      String label;
-      SubmitRecord.Label.Status status;
-      Integer appliedBy;
-    }
-
-    SubmitRecord.Status status;
-    List<StoredLabel> labels;
-    String errorMessage;
-
-    StoredSubmitRecord(SubmitRecord rec) {
-      this.status = rec.status;
-      this.errorMessage = rec.errorMessage;
-      if (rec.labels != null) {
-        this.labels = new ArrayList<>(rec.labels.size());
-        for (SubmitRecord.Label label : rec.labels) {
-          StoredLabel sl = new StoredLabel();
-          sl.label = label.label;
-          sl.status = label.status;
-          sl.appliedBy = label.appliedBy != null ? label.appliedBy.get() : null;
-          this.labels.add(sl);
-        }
-      }
-    }
-
-    private SubmitRecord toSubmitRecord() {
-      SubmitRecord rec = new SubmitRecord();
-      rec.status = status;
-      rec.errorMessage = errorMessage;
-      if (labels != null) {
-        rec.labels = new ArrayList<>(labels.size());
-        for (StoredLabel label : labels) {
-          SubmitRecord.Label srl = new SubmitRecord.Label();
-          srl.label = label.label;
-          srl.status = label.status;
-          srl.appliedBy = label.appliedBy != null ? new Account.Id(label.appliedBy) : null;
-          rec.labels.add(srl);
-        }
-      }
-      return rec;
-    }
-  }
-
-  public static final FieldDef<ChangeData, Iterable<String>> SUBMIT_RECORD =
-      exact("submit_record").buildRepeatable(cd -> formatSubmitRecordValues(cd));
-
-  public static final FieldDef<ChangeData, Iterable<byte[]>> STORED_SUBMIT_RECORD_STRICT =
-      storedOnly("full_submit_record_strict")
-          .buildRepeatable(cd -> storedSubmitRecords(cd, SUBMIT_RULE_OPTIONS_STRICT));
-
-  public static final FieldDef<ChangeData, Iterable<byte[]>> STORED_SUBMIT_RECORD_LENIENT =
-      storedOnly("full_submit_record_lenient")
-          .buildRepeatable(cd -> storedSubmitRecords(cd, SUBMIT_RULE_OPTIONS_LENIENT));
-
-  public static void parseSubmitRecords(
-      Collection<String> values, SubmitRuleOptions opts, ChangeData out) {
-    checkArgument(!opts.fastEvalLabels());
-    List<SubmitRecord> records = parseSubmitRecords(values);
-    if (records.isEmpty()) {
-      // Assume no values means the field is not in the index;
-      // SubmitRuleEvaluator ensures the list is non-empty.
-      return;
-    }
-    out.setSubmitRecords(opts, records);
-
-    // Cache the fastEvalLabels variant as well so it can be used by
-    // ChangeJson.
-    out.setSubmitRecords(opts.toBuilder().fastEvalLabels(true).build(), records);
-  }
-
-  @VisibleForTesting
-  static List<SubmitRecord> parseSubmitRecords(Collection<String> values) {
-    return values.stream()
-        .map(v -> GSON.fromJson(v, StoredSubmitRecord.class).toSubmitRecord())
-        .collect(toList());
-  }
-
-  @VisibleForTesting
-  static List<byte[]> storedSubmitRecords(List<SubmitRecord> records) {
-    return Lists.transform(records, r -> GSON.toJson(new StoredSubmitRecord(r)).getBytes(UTF_8));
-  }
-
-  private static Iterable<byte[]> storedSubmitRecords(ChangeData cd, SubmitRuleOptions opts)
-      throws OrmException {
-    return storedSubmitRecords(cd.submitRecords(opts));
-  }
-
-  public static List<String> formatSubmitRecordValues(ChangeData cd) throws OrmException {
-    return formatSubmitRecordValues(
-        cd.submitRecords(SUBMIT_RULE_OPTIONS_STRICT), cd.change().getOwner());
-  }
-
-  @VisibleForTesting
-  static List<String> formatSubmitRecordValues(List<SubmitRecord> records, Account.Id changeOwner) {
-    List<String> result = new ArrayList<>();
-    for (SubmitRecord rec : records) {
-      result.add(rec.status.name());
-      if (rec.labels == null) {
-        continue;
-      }
-      for (SubmitRecord.Label label : rec.labels) {
-        String sl = label.status.toString() + ',' + label.label.toLowerCase();
-        result.add(sl);
-        String slc = sl + ',';
-        if (label.appliedBy != null) {
-          result.add(slc + label.appliedBy.get());
-          if (label.appliedBy.equals(changeOwner)) {
-            result.add(slc + ChangeQueryBuilder.OWNER_ACCOUNT_ID.get());
-          }
-        }
-      }
-    }
-    return result;
-  }
-
-  /**
-   * All values of all refs that were used in the course of indexing this document.
-   *
-   * <p>Emitted as UTF-8 encoded strings of the form {@code project:ref/name:[hex sha]}.
-   */
-  public static final FieldDef<ChangeData, Iterable<byte[]>> REF_STATE =
-      storedOnly("ref_state")
-          .buildRepeatable(
-              cd -> {
-                List<byte[]> result = new ArrayList<>();
-                Project.NameKey project = cd.change().getProject();
-
-                cd.editRefs()
-                    .values()
-                    .forEach(r -> result.add(RefState.of(r).toByteArray(project)));
-                cd.starRefs()
-                    .values()
-                    .forEach(r -> result.add(RefState.of(r.ref()).toByteArray(allUsers(cd))));
-
-                if (PrimaryStorage.of(cd.change()) == PrimaryStorage.NOTE_DB) {
-                  ChangeNotes notes = cd.notes();
-                  result.add(
-                      RefState.create(notes.getRefName(), notes.getMetaId()).toByteArray(project));
-                  notes.getRobotComments(); // Force loading robot comments.
-                  RobotCommentNotes robotNotes = notes.getRobotCommentNotes();
-                  result.add(
-                      RefState.create(robotNotes.getRefName(), robotNotes.getMetaId())
-                          .toByteArray(project));
-                  cd.draftRefs()
-                      .values()
-                      .forEach(r -> result.add(RefState.of(r).toByteArray(allUsers(cd))));
-                }
-
-                return result;
-              });
-
-  /**
-   * All ref wildcard patterns that were used in the course of indexing this document.
-   *
-   * <p>Emitted as UTF-8 encoded strings of the form {@code project:ref/name/*}. See {@link
-   * RefStatePattern} for the pattern format.
-   */
-  public static final FieldDef<ChangeData, Iterable<byte[]>> REF_STATE_PATTERN =
-      storedOnly("ref_state_pattern")
-          .buildRepeatable(
-              cd -> {
-                Change.Id id = cd.getId();
-                Project.NameKey project = cd.change().getProject();
-                List<byte[]> result = new ArrayList<>(3);
-                result.add(
-                    RefStatePattern.create(
-                            RefNames.REFS_USERS + "*/" + RefNames.EDIT_PREFIX + id + "/*")
-                        .toByteArray(project));
-                result.add(
-                    RefStatePattern.create(RefNames.refsStarredChangesPrefix(id) + "*")
-                        .toByteArray(allUsers(cd)));
-                if (PrimaryStorage.of(cd.change()) == PrimaryStorage.NOTE_DB) {
-                  result.add(
-                      RefStatePattern.create(RefNames.refsDraftCommentsPrefix(id) + "*")
-                          .toByteArray(allUsers(cd)));
-                }
-                return result;
-              });
-
-  private static String getTopic(ChangeData cd) throws OrmException {
-    Change c = cd.change();
-    if (c == null) {
-      return null;
-    }
-    return firstNonNull(c.getTopic(), "");
-  }
-
-  private static <T> List<byte[]> toProtos(ProtobufCodec<T> codec, Collection<T> objs)
-      throws OrmException {
-    List<byte[]> result = Lists.newArrayListWithCapacity(objs.size());
-    ByteArrayOutputStream out = new ByteArrayOutputStream(256);
-    try {
-      for (T obj : objs) {
-        out.reset();
-        CodedOutputStream cos = CodedOutputStream.newInstance(out);
-        codec.encode(obj, cos);
-        cos.flush();
-        result.add(out.toByteArray());
-      }
-    } catch (IOException e) {
-      throw new OrmException(e);
-    }
-    return result;
-  }
-
-  private static <T> FieldDef.Getter<ChangeData, T> changeGetter(Function<Change, T> func) {
-    return in -> in.change() != null ? func.apply(in.change()) : null;
-  }
-
-  private static AllUsersName allUsers(ChangeData cd) {
-    return cd.getAllUsersNameForIndexing();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexRewriter.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexRewriter.java
deleted file mode 100644
index 824fd4f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexRewriter.java
+++ /dev/null
@@ -1,293 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.index.change;
-
-import static com.google.gerrit.server.query.change.ChangeStatusPredicate.open;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-import com.google.gerrit.index.FieldDef;
-import com.google.gerrit.index.IndexConfig;
-import com.google.gerrit.index.IndexRewriter;
-import com.google.gerrit.index.QueryOptions;
-import com.google.gerrit.index.Schema;
-import com.google.gerrit.index.query.AndPredicate;
-import com.google.gerrit.index.query.IndexPredicate;
-import com.google.gerrit.index.query.LimitPredicate;
-import com.google.gerrit.index.query.NotPredicate;
-import com.google.gerrit.index.query.OrPredicate;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.index.query.QueryParseException;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Change.Status;
-import com.google.gerrit.server.query.change.AndChangeSource;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.ChangeDataSource;
-import com.google.gerrit.server.query.change.ChangeQueryBuilder;
-import com.google.gerrit.server.query.change.ChangeStatusPredicate;
-import com.google.gerrit.server.query.change.OrSource;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.BitSet;
-import java.util.EnumSet;
-import java.util.List;
-import java.util.Set;
-import org.eclipse.jgit.util.MutableInteger;
-
-/** Rewriter that pushes boolean logic into the secondary index. */
-@Singleton
-public class ChangeIndexRewriter implements IndexRewriter<ChangeData> {
-  /** Set of all open change statuses. */
-  public static final Set<Change.Status> OPEN_STATUSES;
-
-  /** Set of all closed change statuses. */
-  public static final Set<Change.Status> CLOSED_STATUSES;
-
-  static {
-    EnumSet<Change.Status> open = EnumSet.noneOf(Change.Status.class);
-    EnumSet<Change.Status> closed = EnumSet.noneOf(Change.Status.class);
-    for (Change.Status s : Change.Status.values()) {
-      if (s.isOpen()) {
-        open.add(s);
-      } else {
-        closed.add(s);
-      }
-    }
-    OPEN_STATUSES = Sets.immutableEnumSet(open);
-    CLOSED_STATUSES = Sets.immutableEnumSet(closed);
-  }
-
-  /**
-   * Get the set of statuses that changes matching the given predicate may have.
-   *
-   * @param in predicate
-   * @return the maximal set of statuses that any changes matching the input predicates may have,
-   *     based on examining boolean and {@link ChangeStatusPredicate}s.
-   */
-  public static EnumSet<Change.Status> getPossibleStatus(Predicate<ChangeData> in) {
-    EnumSet<Change.Status> s = extractStatus(in);
-    return s != null ? s : EnumSet.allOf(Change.Status.class);
-  }
-
-  private static EnumSet<Change.Status> extractStatus(Predicate<ChangeData> in) {
-    if (in instanceof ChangeStatusPredicate) {
-      Status status = ((ChangeStatusPredicate) in).getStatus();
-      return status != null ? EnumSet.of(status) : null;
-    } else if (in instanceof NotPredicate) {
-      EnumSet<Status> s = extractStatus(in.getChild(0));
-      return s != null ? EnumSet.complementOf(s) : null;
-    } else if (in instanceof OrPredicate) {
-      EnumSet<Change.Status> r = null;
-      int childrenWithStatus = 0;
-      for (int i = 0; i < in.getChildCount(); i++) {
-        EnumSet<Status> c = extractStatus(in.getChild(i));
-        if (c != null) {
-          if (r == null) {
-            r = EnumSet.noneOf(Change.Status.class);
-          }
-          r.addAll(c);
-          childrenWithStatus++;
-        }
-      }
-      if (r != null && childrenWithStatus < in.getChildCount()) {
-        // At least one child supplied a status but another did not.
-        // Assume all statuses for the children that did not feed a
-        // status at this part of the tree. This matches behavior if
-        // the child was used at the root of a query.
-        return EnumSet.allOf(Change.Status.class);
-      }
-      return r;
-    } else if (in instanceof AndPredicate) {
-      EnumSet<Change.Status> r = null;
-      for (int i = 0; i < in.getChildCount(); i++) {
-        EnumSet<Change.Status> c = extractStatus(in.getChild(i));
-        if (c != null) {
-          if (r == null) {
-            r = EnumSet.allOf(Change.Status.class);
-          }
-          r.retainAll(c);
-        }
-      }
-      return r;
-    }
-    return null;
-  }
-
-  private final ChangeIndexCollection indexes;
-  private final IndexConfig config;
-
-  @Inject
-  ChangeIndexRewriter(ChangeIndexCollection indexes, IndexConfig config) {
-    this.indexes = indexes;
-    this.config = config;
-  }
-
-  @Override
-  public Predicate<ChangeData> rewrite(Predicate<ChangeData> in, QueryOptions opts)
-      throws QueryParseException {
-    Predicate<ChangeData> s = rewriteImpl(in, opts);
-    if (!(s instanceof ChangeDataSource)) {
-      in = Predicate.and(open(), in);
-      s = rewriteImpl(in, opts);
-    }
-    if (!(s instanceof ChangeDataSource)) {
-      throw new QueryParseException("invalid query: " + s);
-    }
-    return s;
-  }
-
-  private Predicate<ChangeData> rewriteImpl(Predicate<ChangeData> in, QueryOptions opts)
-      throws QueryParseException {
-    ChangeIndex index = indexes.getSearchIndex();
-
-    MutableInteger leafTerms = new MutableInteger();
-    Predicate<ChangeData> out = rewriteImpl(in, index, opts, leafTerms);
-    if (in == out || out instanceof IndexPredicate) {
-      return new IndexedChangeQuery(index, out, opts);
-    } else if (out == null /* cannot rewrite */) {
-      return in;
-    } else {
-      return out;
-    }
-  }
-
-  /**
-   * Rewrite a single predicate subtree.
-   *
-   * @param in predicate to rewrite.
-   * @param index index whose schema determines which fields are indexed.
-   * @param opts other query options.
-   * @param leafTerms number of leaf index query terms encountered so far.
-   * @return {@code null} if no part of this subtree can be queried in the index directly. {@code
-   *     in} if this subtree and all its children can be queried directly in the index. Otherwise, a
-   *     predicate that is semantically equivalent, with some of its subtrees wrapped to query the
-   *     index directly.
-   * @throws QueryParseException if the underlying index implementation does not support this
-   *     predicate.
-   */
-  private Predicate<ChangeData> rewriteImpl(
-      Predicate<ChangeData> in, ChangeIndex index, QueryOptions opts, MutableInteger leafTerms)
-      throws QueryParseException {
-    if (isIndexPredicate(in, index)) {
-      if (++leafTerms.value > config.maxTerms()) {
-        throw new QueryParseException("too many terms in query");
-      }
-      return in;
-    } else if (in instanceof LimitPredicate) {
-      // Replace any limits with the limit provided by the caller. The caller
-      // should have already searched the predicate tree for limit predicates
-      // and included that in their limit computation.
-      return new LimitPredicate<>(ChangeQueryBuilder.FIELD_LIMIT, opts.limit());
-    } else if (!isRewritePossible(in)) {
-      if (in instanceof IndexPredicate) {
-        throw new QueryParseException("Unsupported index predicate: " + in.toString());
-      }
-      return null; // magic to indicate "in" cannot be rewritten
-    }
-
-    int n = in.getChildCount();
-    BitSet isIndexed = new BitSet(n);
-    BitSet notIndexed = new BitSet(n);
-    BitSet rewritten = new BitSet(n);
-    BitSet changeSource = new BitSet(n);
-    List<Predicate<ChangeData>> newChildren = Lists.newArrayListWithCapacity(n);
-    for (int i = 0; i < n; i++) {
-      Predicate<ChangeData> c = in.getChild(i);
-      Predicate<ChangeData> nc = rewriteImpl(c, index, opts, leafTerms);
-      if (nc == c) {
-        isIndexed.set(i);
-        newChildren.add(c);
-      } else if (nc == null /* cannot rewrite c */) {
-        notIndexed.set(i);
-        newChildren.add(c);
-      } else {
-        if (nc instanceof ChangeDataSource) {
-          changeSource.set(i);
-        }
-        rewritten.set(i);
-        newChildren.add(nc);
-      }
-    }
-
-    if (isIndexed.cardinality() == n) {
-      return in; // All children are indexed, leave as-is for parent.
-    } else if (notIndexed.cardinality() == n) {
-      return null; // Can't rewrite any children, so cannot rewrite in.
-    } else if (rewritten.cardinality() == n) {
-      // All children were rewritten.
-      if (changeSource.cardinality() == n) {
-        return copy(in, newChildren);
-      }
-      return in.copy(newChildren);
-    }
-    return partitionChildren(in, newChildren, isIndexed, index, opts);
-  }
-
-  private boolean isIndexPredicate(Predicate<ChangeData> in, ChangeIndex index) {
-    if (!(in instanceof IndexPredicate)) {
-      return false;
-    }
-    IndexPredicate<ChangeData> p = (IndexPredicate<ChangeData>) in;
-
-    FieldDef<ChangeData, ?> def = p.getField();
-    Schema<ChangeData> schema = index.getSchema();
-    return schema.hasField(def);
-  }
-
-  private Predicate<ChangeData> partitionChildren(
-      Predicate<ChangeData> in,
-      List<Predicate<ChangeData>> newChildren,
-      BitSet isIndexed,
-      ChangeIndex index,
-      QueryOptions opts)
-      throws QueryParseException {
-    if (isIndexed.cardinality() == 1) {
-      int i = isIndexed.nextSetBit(0);
-      newChildren.add(0, new IndexedChangeQuery(index, newChildren.remove(i), opts));
-      return copy(in, newChildren);
-    }
-
-    // Group all indexed predicates into a wrapped subtree.
-    List<Predicate<ChangeData>> indexed = Lists.newArrayListWithCapacity(isIndexed.cardinality());
-
-    List<Predicate<ChangeData>> all =
-        Lists.newArrayListWithCapacity(newChildren.size() - isIndexed.cardinality() + 1);
-
-    for (int i = 0; i < newChildren.size(); i++) {
-      Predicate<ChangeData> c = newChildren.get(i);
-      if (isIndexed.get(i)) {
-        indexed.add(c);
-      } else {
-        all.add(c);
-      }
-    }
-    all.add(0, new IndexedChangeQuery(index, in.copy(indexed), opts));
-    return copy(in, all);
-  }
-
-  private Predicate<ChangeData> copy(Predicate<ChangeData> in, List<Predicate<ChangeData>> all) {
-    if (in instanceof AndPredicate) {
-      return new AndChangeSource(all);
-    } else if (in instanceof OrPredicate) {
-      return new OrSource(all);
-    }
-    return in.copy(all);
-  }
-
-  private static boolean isRewritePossible(Predicate<ChangeData> p) {
-    return p.getChildCount() > 0
-        && (p instanceof AndPredicate || p instanceof OrPredicate || p instanceof NotPredicate);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexer.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexer.java
deleted file mode 100644
index f1a7e85..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexer.java
+++ /dev/null
@@ -1,504 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.index.change;
-
-import static com.google.gerrit.server.extensions.events.EventUtil.logEventListenerError;
-import static com.google.gerrit.server.git.QueueProvider.QueueType.BATCH;
-
-import com.google.common.base.Function;
-import com.google.common.util.concurrent.Atomics;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.ListeningExecutorService;
-import com.google.gerrit.extensions.events.ChangeIndexedListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.index.Index;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.index.IndexExecutor;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.NotesMigration;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.util.RequestContext;
-import com.google.gerrit.server.util.ThreadLocalRequestContext;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.OutOfScopeException;
-import com.google.inject.Provider;
-import com.google.inject.ProvisionException;
-import com.google.inject.assistedinject.Assisted;
-import com.google.inject.assistedinject.AssistedInject;
-import com.google.inject.util.Providers;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.concurrent.atomic.AtomicReference;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Helper for (re)indexing a change document.
- *
- * <p>Indexing is run in the background, as it may require substantial work to compute some of the
- * fields and/or update the index.
- */
-public class ChangeIndexer {
-  private static final Logger log = LoggerFactory.getLogger(ChangeIndexer.class);
-
-  public interface Factory {
-    ChangeIndexer create(ListeningExecutorService executor, ChangeIndex index);
-
-    ChangeIndexer create(ListeningExecutorService executor, ChangeIndexCollection indexes);
-  }
-
-  @SuppressWarnings("deprecation")
-  public static com.google.common.util.concurrent.CheckedFuture<?, IOException> allAsList(
-      List<? extends ListenableFuture<?>> futures) {
-    // allAsList propagates the first seen exception, wrapped in
-    // ExecutionException, so we can reuse the same mapper as for a single
-    // future. Assume the actual contents of the exception are not useful to
-    // callers. All exceptions are already logged by IndexTask.
-    return Futures.makeChecked(Futures.allAsList(futures), MAPPER);
-  }
-
-  private static final Function<Exception, IOException> MAPPER =
-      new Function<Exception, IOException>() {
-        @Override
-        public IOException apply(Exception in) {
-          if (in instanceof IOException) {
-            return (IOException) in;
-          } else if (in instanceof ExecutionException && in.getCause() instanceof IOException) {
-            return (IOException) in.getCause();
-          } else {
-            return new IOException(in);
-          }
-        }
-      };
-
-  private final ChangeIndexCollection indexes;
-  private final ChangeIndex index;
-  private final SchemaFactory<ReviewDb> schemaFactory;
-  private final NotesMigration notesMigration;
-  private final ChangeNotes.Factory changeNotesFactory;
-  private final ChangeData.Factory changeDataFactory;
-  private final ThreadLocalRequestContext context;
-  private final ListeningExecutorService batchExecutor;
-  private final ListeningExecutorService executor;
-  private final DynamicSet<ChangeIndexedListener> indexedListeners;
-  private final StalenessChecker stalenessChecker;
-  private final boolean autoReindexIfStale;
-
-  @AssistedInject
-  ChangeIndexer(
-      @GerritServerConfig Config cfg,
-      SchemaFactory<ReviewDb> schemaFactory,
-      NotesMigration notesMigration,
-      ChangeNotes.Factory changeNotesFactory,
-      ChangeData.Factory changeDataFactory,
-      ThreadLocalRequestContext context,
-      DynamicSet<ChangeIndexedListener> indexedListeners,
-      StalenessChecker stalenessChecker,
-      @IndexExecutor(BATCH) ListeningExecutorService batchExecutor,
-      @Assisted ListeningExecutorService executor,
-      @Assisted ChangeIndex index) {
-    this.executor = executor;
-    this.schemaFactory = schemaFactory;
-    this.notesMigration = notesMigration;
-    this.changeNotesFactory = changeNotesFactory;
-    this.changeDataFactory = changeDataFactory;
-    this.context = context;
-    this.indexedListeners = indexedListeners;
-    this.stalenessChecker = stalenessChecker;
-    this.batchExecutor = batchExecutor;
-    this.autoReindexIfStale = autoReindexIfStale(cfg);
-    this.index = index;
-    this.indexes = null;
-  }
-
-  @AssistedInject
-  ChangeIndexer(
-      SchemaFactory<ReviewDb> schemaFactory,
-      @GerritServerConfig Config cfg,
-      NotesMigration notesMigration,
-      ChangeNotes.Factory changeNotesFactory,
-      ChangeData.Factory changeDataFactory,
-      ThreadLocalRequestContext context,
-      DynamicSet<ChangeIndexedListener> indexedListeners,
-      StalenessChecker stalenessChecker,
-      @IndexExecutor(BATCH) ListeningExecutorService batchExecutor,
-      @Assisted ListeningExecutorService executor,
-      @Assisted ChangeIndexCollection indexes) {
-    this.executor = executor;
-    this.schemaFactory = schemaFactory;
-    this.notesMigration = notesMigration;
-    this.changeNotesFactory = changeNotesFactory;
-    this.changeDataFactory = changeDataFactory;
-    this.context = context;
-    this.indexedListeners = indexedListeners;
-    this.stalenessChecker = stalenessChecker;
-    this.batchExecutor = batchExecutor;
-    this.autoReindexIfStale = autoReindexIfStale(cfg);
-    this.index = null;
-    this.indexes = indexes;
-  }
-
-  private static boolean autoReindexIfStale(Config cfg) {
-    return cfg.getBoolean("index", null, "autoReindexIfStale", false);
-  }
-
-  /**
-   * Start indexing a change.
-   *
-   * @param id change to index.
-   * @return future for the indexing task.
-   */
-  @SuppressWarnings("deprecation")
-  public com.google.common.util.concurrent.CheckedFuture<?, IOException> indexAsync(
-      Project.NameKey project, Change.Id id) {
-    return submit(new IndexTask(project, id));
-  }
-
-  /**
-   * Start indexing multiple changes in parallel.
-   *
-   * @param ids changes to index.
-   * @return future for completing indexing of all changes.
-   */
-  @SuppressWarnings("deprecation")
-  public com.google.common.util.concurrent.CheckedFuture<?, IOException> indexAsync(
-      Project.NameKey project, Collection<Change.Id> ids) {
-    List<ListenableFuture<?>> futures = new ArrayList<>(ids.size());
-    for (Change.Id id : ids) {
-      futures.add(indexAsync(project, id));
-    }
-    return allAsList(futures);
-  }
-
-  /**
-   * Synchronously index a change.
-   *
-   * @param cd change to index.
-   */
-  public void index(ChangeData cd) throws IOException {
-    for (Index<?, ChangeData> i : getWriteIndexes()) {
-      i.replace(cd);
-    }
-    fireChangeIndexedEvent(cd.project().get(), cd.getId().get());
-
-    // Always double-check whether the change might be stale immediately after
-    // interactively indexing it. This fixes up the case where two writers write
-    // to the primary storage in one order, and the corresponding index writes
-    // happen in the opposite order:
-    //  1. Writer A writes to primary storage.
-    //  2. Writer B writes to primary storage.
-    //  3. Writer B updates index.
-    //  4. Writer A updates index.
-    //
-    // Without the extra reindexIfStale step, A has no way of knowing that it's
-    // about to overwrite the index document with stale data. It doesn't work to
-    // have A check for staleness before attempting its index update, because
-    // B's index update might not have happened when it does the check.
-    //
-    // With the extra reindexIfStale step after (3)/(4), we are able to detect
-    // and fix the staleness. It doesn't matter which order the two
-    // reindexIfStale calls actually execute in; we are guaranteed that at least
-    // one of them will execute after the second index write, (4).
-    autoReindexIfStale(cd);
-  }
-
-  private void fireChangeIndexedEvent(String projectName, int id) {
-    for (ChangeIndexedListener listener : indexedListeners) {
-      try {
-        listener.onChangeIndexed(projectName, id);
-      } catch (Exception e) {
-        logEventListenerError(listener, e);
-      }
-    }
-  }
-
-  private void fireChangeDeletedFromIndexEvent(int id) {
-    for (ChangeIndexedListener listener : indexedListeners) {
-      try {
-        listener.onChangeDeleted(id);
-      } catch (Exception e) {
-        logEventListenerError(listener, e);
-      }
-    }
-  }
-
-  /**
-   * Synchronously index a change.
-   *
-   * @param db review database.
-   * @param change change to index.
-   */
-  public void index(ReviewDb db, Change change) throws IOException, OrmException {
-    index(newChangeData(db, change));
-    // See comment in #index(ChangeData).
-    autoReindexIfStale(change.getProject(), change.getId());
-  }
-
-  /**
-   * Synchronously index a change.
-   *
-   * @param db review database.
-   * @param project the project to which the change belongs.
-   * @param changeId ID of the change to index.
-   */
-  public void index(ReviewDb db, Project.NameKey project, Change.Id changeId)
-      throws IOException, OrmException {
-    ChangeData cd = newChangeData(db, project, changeId);
-    index(cd);
-    // See comment in #index(ChangeData).
-    autoReindexIfStale(cd);
-  }
-
-  /**
-   * Start deleting a change.
-   *
-   * @param id change to delete.
-   * @return future for the deleting task.
-   */
-  @SuppressWarnings("deprecation")
-  public com.google.common.util.concurrent.CheckedFuture<?, IOException> deleteAsync(Change.Id id) {
-    return submit(new DeleteTask(id));
-  }
-
-  /**
-   * Synchronously delete a change.
-   *
-   * @param id change ID to delete.
-   */
-  public void delete(Change.Id id) throws IOException {
-    new DeleteTask(id).call();
-  }
-
-  /**
-   * Asynchronously check if a change is stale, and reindex if it is.
-   *
-   * <p>Always run on the batch executor, even if this indexer instance is configured to use a
-   * different executor.
-   *
-   * @param project the project to which the change belongs.
-   * @param id ID of the change to index.
-   * @return future for reindexing the change; returns true if the change was stale.
-   */
-  @SuppressWarnings("deprecation")
-  public com.google.common.util.concurrent.CheckedFuture<Boolean, IOException> reindexIfStale(
-      Project.NameKey project, Change.Id id) {
-    return submit(new ReindexIfStaleTask(project, id), batchExecutor);
-  }
-
-  private void autoReindexIfStale(ChangeData cd) {
-    autoReindexIfStale(cd.project(), cd.getId());
-  }
-
-  private void autoReindexIfStale(Project.NameKey project, Change.Id id) {
-    if (autoReindexIfStale) {
-      // Don't retry indefinitely; if this fails the change will be stale.
-      @SuppressWarnings("unused")
-      Future<?> possiblyIgnoredError = reindexIfStale(project, id);
-    }
-  }
-
-  private Collection<ChangeIndex> getWriteIndexes() {
-    return indexes != null ? indexes.getWriteIndexes() : Collections.singleton(index);
-  }
-
-  @SuppressWarnings("deprecation")
-  private <T> com.google.common.util.concurrent.CheckedFuture<T, IOException> submit(
-      Callable<T> task) {
-    return submit(task, executor);
-  }
-
-  @SuppressWarnings("deprecation")
-  private static <T> com.google.common.util.concurrent.CheckedFuture<T, IOException> submit(
-      Callable<T> task, ListeningExecutorService executor) {
-    return Futures.makeChecked(Futures.nonCancellationPropagating(executor.submit(task)), MAPPER);
-  }
-
-  private abstract class AbstractIndexTask<T> implements Callable<T> {
-    protected final Project.NameKey project;
-    protected final Change.Id id;
-
-    protected AbstractIndexTask(Project.NameKey project, Change.Id id) {
-      this.project = project;
-      this.id = id;
-    }
-
-    protected abstract T callImpl(Provider<ReviewDb> db) throws Exception;
-
-    @Override
-    public abstract String toString();
-
-    @Override
-    public final T call() throws Exception {
-      try {
-        final AtomicReference<Provider<ReviewDb>> dbRef = Atomics.newReference();
-        RequestContext newCtx =
-            new RequestContext() {
-              @Override
-              public Provider<ReviewDb> getReviewDbProvider() {
-                Provider<ReviewDb> db = dbRef.get();
-                if (db == null) {
-                  try {
-                    db = Providers.of(schemaFactory.open());
-                  } catch (OrmException e) {
-                    ProvisionException pe = new ProvisionException("error opening ReviewDb");
-                    pe.initCause(e);
-                    throw pe;
-                  }
-                  dbRef.set(db);
-                }
-                return db;
-              }
-
-              @Override
-              public CurrentUser getUser() {
-                throw new OutOfScopeException("No user during ChangeIndexer");
-              }
-            };
-        RequestContext oldCtx = context.setContext(newCtx);
-        try {
-          return callImpl(newCtx.getReviewDbProvider());
-        } finally {
-          context.setContext(oldCtx);
-          Provider<ReviewDb> db = dbRef.get();
-          if (db != null) {
-            db.get().close();
-          }
-        }
-      } catch (Exception e) {
-        log.error("Failed to execute " + this, e);
-        throw e;
-      }
-    }
-  }
-
-  private class IndexTask extends AbstractIndexTask<Void> {
-    private IndexTask(Project.NameKey project, Change.Id id) {
-      super(project, id);
-    }
-
-    @Override
-    public Void callImpl(Provider<ReviewDb> db) throws Exception {
-      ChangeData cd = newChangeData(db.get(), project, id);
-      index(cd);
-      return null;
-    }
-
-    @Override
-    public String toString() {
-      return "index-change-" + id;
-    }
-  }
-
-  // Not AbstractIndexTask as it doesn't need ReviewDb.
-  private class DeleteTask implements Callable<Void> {
-    private final Change.Id id;
-
-    private DeleteTask(Change.Id id) {
-      this.id = id;
-    }
-
-    @Override
-    public Void call() throws IOException {
-      // Don't bother setting a RequestContext to provide the DB.
-      // Implementations should not need to access the DB in order to delete a
-      // change ID.
-      for (ChangeIndex i : getWriteIndexes()) {
-        i.delete(id);
-      }
-      log.info("Deleted change {} from index.", id.get());
-      fireChangeDeletedFromIndexEvent(id.get());
-      return null;
-    }
-  }
-
-  private class ReindexIfStaleTask extends AbstractIndexTask<Boolean> {
-    private ReindexIfStaleTask(Project.NameKey project, Change.Id id) {
-      super(project, id);
-    }
-
-    @Override
-    public Boolean callImpl(Provider<ReviewDb> db) throws Exception {
-      try {
-        if (stalenessChecker.isStale(id)) {
-          index(newChangeData(db.get(), project, id));
-          return true;
-        }
-      } catch (NoSuchChangeException nsce) {
-        log.debug("Change {} was deleted, aborting reindexing the change.", id.get());
-      } catch (Exception e) {
-        if (!isCausedByRepositoryNotFoundException(e)) {
-          throw e;
-        }
-        log.debug(
-            "Change {} belongs to deleted project {}, aborting reindexing the change.",
-            id.get(),
-            project.get());
-      }
-      return false;
-    }
-
-    @Override
-    public String toString() {
-      return "reindex-if-stale-change-" + id;
-    }
-  }
-
-  private boolean isCausedByRepositoryNotFoundException(Throwable throwable) {
-    while (throwable != null) {
-      if (throwable instanceof RepositoryNotFoundException) {
-        return true;
-      }
-      throwable = throwable.getCause();
-    }
-    return false;
-  }
-
-  // Avoid auto-rebuilding when reindexing if reading is disabled. This just
-  // increases contention on the meta ref from a background indexing thread
-  // with little benefit. The next actual write to the entity may still incur a
-  // less-contentious rebuild.
-  private ChangeData newChangeData(ReviewDb db, Change change) throws OrmException {
-    if (!notesMigration.readChanges()) {
-      ChangeNotes notes = changeNotesFactory.createWithAutoRebuildingDisabled(change, null);
-      return changeDataFactory.create(db, notes);
-    }
-    return changeDataFactory.create(db, change);
-  }
-
-  private ChangeData newChangeData(ReviewDb db, Project.NameKey project, Change.Id changeId)
-      throws OrmException {
-    if (!notesMigration.readChanges()) {
-      ChangeNotes notes =
-          changeNotesFactory.createWithAutoRebuildingDisabled(db, project, changeId);
-      return changeDataFactory.create(db, notes);
-    }
-    return changeDataFactory.create(db, project, changeId);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeSchemaDefinitions.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeSchemaDefinitions.java
deleted file mode 100644
index 95bdaab..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeSchemaDefinitions.java
+++ /dev/null
@@ -1,105 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.index.change;
-
-import static com.google.gerrit.index.SchemaUtil.schema;
-
-import com.google.gerrit.index.Schema;
-import com.google.gerrit.index.SchemaDefinitions;
-import com.google.gerrit.server.query.change.ChangeData;
-
-public class ChangeSchemaDefinitions extends SchemaDefinitions<ChangeData> {
-  @Deprecated
-  static final Schema<ChangeData> V39 =
-      schema(
-          ChangeField.ADDED,
-          ChangeField.APPROVAL,
-          ChangeField.ASSIGNEE,
-          ChangeField.AUTHOR,
-          ChangeField.CHANGE,
-          ChangeField.COMMENT,
-          ChangeField.COMMENTBY,
-          ChangeField.COMMIT,
-          ChangeField.COMMITTER,
-          ChangeField.COMMIT_MESSAGE,
-          ChangeField.DELETED,
-          ChangeField.DELTA,
-          ChangeField.DRAFTBY,
-          ChangeField.EDITBY,
-          ChangeField.EXACT_COMMIT,
-          ChangeField.EXACT_TOPIC,
-          ChangeField.FILE_PART,
-          ChangeField.FUZZY_TOPIC,
-          ChangeField.GROUP,
-          ChangeField.HASHTAG,
-          ChangeField.HASHTAG_CASE_AWARE,
-          ChangeField.ID,
-          ChangeField.LABEL,
-          ChangeField.LEGACY_ID,
-          ChangeField.MERGEABLE,
-          ChangeField.OWNER,
-          ChangeField.PATCH_SET,
-          ChangeField.PATH,
-          ChangeField.PROJECT,
-          ChangeField.PROJECTS,
-          ChangeField.REF,
-          ChangeField.REF_STATE,
-          ChangeField.REF_STATE_PATTERN,
-          ChangeField.REVIEWEDBY,
-          ChangeField.REVIEWER,
-          ChangeField.STAR,
-          ChangeField.STARBY,
-          ChangeField.STATUS,
-          ChangeField.STORED_SUBMIT_RECORD_LENIENT,
-          ChangeField.STORED_SUBMIT_RECORD_STRICT,
-          ChangeField.SUBMISSIONID,
-          ChangeField.SUBMIT_RECORD,
-          ChangeField.TR,
-          ChangeField.UNRESOLVED_COMMENT_COUNT,
-          ChangeField.UPDATED);
-
-  @Deprecated static final Schema<ChangeData> V40 = schema(V39, ChangeField.PRIVATE);
-  @Deprecated static final Schema<ChangeData> V41 = schema(V40, ChangeField.REVIEWER_BY_EMAIL);
-  @Deprecated static final Schema<ChangeData> V42 = schema(V41, ChangeField.WIP);
-
-  @Deprecated
-  static final Schema<ChangeData> V43 =
-      schema(V42, ChangeField.EXACT_AUTHOR, ChangeField.EXACT_COMMITTER);
-
-  @Deprecated
-  static final Schema<ChangeData> V44 =
-      schema(
-          V43,
-          ChangeField.STARTED,
-          ChangeField.PENDING_REVIEWER,
-          ChangeField.PENDING_REVIEWER_BY_EMAIL);
-
-  @Deprecated static final Schema<ChangeData> V45 = schema(V44, ChangeField.REVERT_OF);
-
-  @Deprecated static final Schema<ChangeData> V46 = schema(V45);
-
-  // Removal of draft change workflow requires reindexing
-  @Deprecated static final Schema<ChangeData> V47 = schema(V46);
-
-  // Rename of star label 'mute' to 'reviewed' requires reindexing
-  static final Schema<ChangeData> V48 = schema(V47);
-
-  public static final String NAME = "changes";
-  public static final ChangeSchemaDefinitions INSTANCE = new ChangeSchemaDefinitions();
-
-  private ChangeSchemaDefinitions() {
-    super(NAME, ChangeData.class);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ReindexAfterRefUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ReindexAfterRefUpdate.java
deleted file mode 100644
index a2a4507..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ReindexAfterRefUpdate.java
+++ /dev/null
@@ -1,199 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.index.change;
-
-import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
-import static com.google.gerrit.server.query.change.ChangeData.asChanges;
-
-import com.google.common.util.concurrent.FutureCallback;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListeningExecutorService;
-import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.git.QueueProvider.QueueType;
-import com.google.gerrit.server.index.IndexExecutor;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.query.change.InternalChangeQuery;
-import com.google.gerrit.server.util.ManualRequestContext;
-import com.google.gerrit.server.util.OneOffRequestContext;
-import com.google.gerrit.server.util.RequestContext;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.util.List;
-import java.util.concurrent.Callable;
-import java.util.concurrent.Future;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ReindexAfterRefUpdate implements GitReferenceUpdatedListener {
-  private static final Logger log = LoggerFactory.getLogger(ReindexAfterRefUpdate.class);
-
-  private final OneOffRequestContext requestContext;
-  private final Provider<InternalChangeQuery> queryProvider;
-  private final ChangeIndexer.Factory indexerFactory;
-  private final ChangeIndexCollection indexes;
-  private final ChangeNotes.Factory notesFactory;
-  private final AllUsersName allUsersName;
-  private final AccountCache accountCache;
-  private final ListeningExecutorService executor;
-  private final boolean enabled;
-
-  @Inject
-  ReindexAfterRefUpdate(
-      @GerritServerConfig Config cfg,
-      OneOffRequestContext requestContext,
-      Provider<InternalChangeQuery> queryProvider,
-      ChangeIndexer.Factory indexerFactory,
-      ChangeIndexCollection indexes,
-      ChangeNotes.Factory notesFactory,
-      AllUsersName allUsersName,
-      AccountCache accountCache,
-      @IndexExecutor(QueueType.BATCH) ListeningExecutorService executor) {
-    this.requestContext = requestContext;
-    this.queryProvider = queryProvider;
-    this.indexerFactory = indexerFactory;
-    this.indexes = indexes;
-    this.notesFactory = notesFactory;
-    this.allUsersName = allUsersName;
-    this.accountCache = accountCache;
-    this.executor = executor;
-    this.enabled = cfg.getBoolean("index", null, "reindexAfterRefUpdate", true);
-  }
-
-  @Override
-  public void onGitReferenceUpdated(Event event) {
-    if (allUsersName.get().equals(event.getProjectName())) {
-      Account.Id accountId = Account.Id.fromRef(event.getRefName());
-      if (accountId != null && !event.getRefName().startsWith(RefNames.REFS_STARRED_CHANGES)) {
-        try {
-          accountCache.evict(accountId);
-        } catch (IOException e) {
-          log.error("Reindex account {} failed.", accountId, e);
-        }
-      }
-    }
-
-    if (!enabled
-        || event.getRefName().startsWith(RefNames.REFS_CHANGES)
-        || event.getRefName().startsWith(RefNames.REFS_DRAFT_COMMENTS)
-        || event.getRefName().startsWith(RefNames.REFS_USERS)) {
-      return;
-    }
-    Futures.addCallback(
-        executor.submit(new GetChanges(event)),
-        new FutureCallback<List<Change>>() {
-          @Override
-          public void onSuccess(List<Change> changes) {
-            for (Change c : changes) {
-              // Don't retry indefinitely; if this fails changes may be stale.
-              @SuppressWarnings("unused")
-              Future<?> possiblyIgnoredError = executor.submit(new Index(event, c.getId()));
-            }
-          }
-
-          @Override
-          public void onFailure(Throwable ignored) {
-            // Logged by {@link GetChanges#call()}.
-          }
-        },
-        directExecutor());
-  }
-
-  private abstract class Task<V> implements Callable<V> {
-    protected Event event;
-
-    protected Task(Event event) {
-      this.event = event;
-    }
-
-    @Override
-    public final V call() throws Exception {
-      try (ManualRequestContext ctx = requestContext.open()) {
-        return impl(ctx);
-      } catch (Exception e) {
-        log.error("Failed to reindex changes after " + event, e);
-        throw e;
-      }
-    }
-
-    protected abstract V impl(RequestContext ctx) throws Exception;
-  }
-
-  private class GetChanges extends Task<List<Change>> {
-    private GetChanges(Event event) {
-      super(event);
-    }
-
-    @Override
-    protected List<Change> impl(RequestContext ctx) throws OrmException {
-      String ref = event.getRefName();
-      Project.NameKey project = new Project.NameKey(event.getProjectName());
-      if (ref.equals(RefNames.REFS_CONFIG)) {
-        return asChanges(queryProvider.get().byProjectOpen(project));
-      }
-      return asChanges(queryProvider.get().byBranchNew(new Branch.NameKey(project, ref)));
-    }
-
-    @Override
-    public String toString() {
-      return "Get changes to reindex caused by "
-          + event.getRefName()
-          + " update of project "
-          + event.getProjectName();
-    }
-  }
-
-  private class Index extends Task<Void> {
-    private final Change.Id id;
-
-    Index(Event event, Change.Id id) {
-      super(event);
-      this.id = id;
-    }
-
-    @Override
-    protected Void impl(RequestContext ctx) throws OrmException, IOException {
-      // Reload change, as some time may have passed since GetChanges.
-      ReviewDb db = ctx.getReviewDbProvider().get();
-      try {
-        Change c =
-            notesFactory
-                .createChecked(db, new Project.NameKey(event.getProjectName()), id)
-                .getChange();
-        indexerFactory.create(executor, indexes).index(db, c);
-      } catch (NoSuchChangeException e) {
-        indexerFactory.create(executor, indexes).delete(id);
-      }
-      return null;
-    }
-
-    @Override
-    public String toString() {
-      return "Index change " + id.get() + " of project " + event.getProjectName();
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/StalenessChecker.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/StalenessChecker.java
deleted file mode 100644
index a9cd070..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/StalenessChecker.java
+++ /dev/null
@@ -1,278 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.index.change;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.stream.Collectors.joining;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Splitter;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.MultimapBuilder;
-import com.google.common.collect.SetMultimap;
-import com.google.common.collect.Sets;
-import com.google.common.collect.Streams;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.restapi.Url;
-import com.google.gerrit.index.IndexConfig;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.index.RefState;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
-import java.util.regex.Pattern;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class StalenessChecker {
-  private static final Logger log = LoggerFactory.getLogger(StalenessChecker.class);
-
-  public static final ImmutableSet<String> FIELDS =
-      ImmutableSet.of(
-          ChangeField.CHANGE.getName(),
-          ChangeField.REF_STATE.getName(),
-          ChangeField.REF_STATE_PATTERN.getName());
-
-  private final ChangeIndexCollection indexes;
-  private final GitRepositoryManager repoManager;
-  private final IndexConfig indexConfig;
-  private final Provider<ReviewDb> db;
-
-  @Inject
-  StalenessChecker(
-      ChangeIndexCollection indexes,
-      GitRepositoryManager repoManager,
-      IndexConfig indexConfig,
-      Provider<ReviewDb> db) {
-    this.indexes = indexes;
-    this.repoManager = repoManager;
-    this.indexConfig = indexConfig;
-    this.db = db;
-  }
-
-  public boolean isStale(Change.Id id) throws IOException, OrmException {
-    ChangeIndex i = indexes.getSearchIndex();
-    if (i == null) {
-      return false; // No index; caller couldn't do anything if it is stale.
-    }
-    if (!i.getSchema().hasField(ChangeField.REF_STATE)
-        || !i.getSchema().hasField(ChangeField.REF_STATE_PATTERN)) {
-      return false; // Index version not new enough for this check.
-    }
-
-    Optional<ChangeData> result =
-        i.get(id, IndexedChangeQuery.createOptions(indexConfig, 0, 1, FIELDS));
-    if (!result.isPresent()) {
-      return true; // Not in index, but caller wants it to be.
-    }
-    ChangeData cd = result.get();
-    return isStale(
-        repoManager,
-        id,
-        cd.change(),
-        ChangeNotes.readOneReviewDbChange(db.get(), id),
-        parseStates(cd),
-        parsePatterns(cd));
-  }
-
-  public static boolean isStale(
-      GitRepositoryManager repoManager,
-      Change.Id id,
-      Change indexChange,
-      @Nullable Change reviewDbChange,
-      SetMultimap<Project.NameKey, RefState> states,
-      ListMultimap<Project.NameKey, RefStatePattern> patterns) {
-    return reviewDbChangeIsStale(indexChange, reviewDbChange)
-        || refsAreStale(repoManager, id, states, patterns);
-  }
-
-  @VisibleForTesting
-  static boolean refsAreStale(
-      GitRepositoryManager repoManager,
-      Change.Id id,
-      SetMultimap<Project.NameKey, RefState> states,
-      ListMultimap<Project.NameKey, RefStatePattern> patterns) {
-    Set<Project.NameKey> projects = Sets.union(states.keySet(), patterns.keySet());
-
-    for (Project.NameKey p : projects) {
-      if (refsAreStale(repoManager, id, p, states, patterns)) {
-        return true;
-      }
-    }
-
-    return false;
-  }
-
-  @VisibleForTesting
-  static boolean reviewDbChangeIsStale(Change indexChange, @Nullable Change reviewDbChange) {
-    checkNotNull(indexChange);
-    PrimaryStorage storageFromIndex = PrimaryStorage.of(indexChange);
-    PrimaryStorage storageFromReviewDb = PrimaryStorage.of(reviewDbChange);
-    if (reviewDbChange == null) {
-      if (storageFromIndex == PrimaryStorage.REVIEW_DB) {
-        return true; // Index says it should have been in ReviewDb, but it wasn't.
-      }
-      return false; // Not in ReviewDb, but that's ok.
-    }
-    checkArgument(
-        indexChange.getId().equals(reviewDbChange.getId()),
-        "mismatched change ID: %s != %s",
-        indexChange.getId(),
-        reviewDbChange.getId());
-    if (storageFromIndex != storageFromReviewDb) {
-      return true; // Primary storage differs, definitely stale.
-    }
-    if (storageFromReviewDb != PrimaryStorage.REVIEW_DB) {
-      return false; // Not a ReviewDb change, don't check rowVersion.
-    }
-    return reviewDbChange.getRowVersion() != indexChange.getRowVersion();
-  }
-
-  private SetMultimap<Project.NameKey, RefState> parseStates(ChangeData cd) {
-    return parseStates(cd.getRefStates());
-  }
-
-  public static SetMultimap<Project.NameKey, RefState> parseStates(Iterable<byte[]> states) {
-    RefState.check(states != null, null);
-    SetMultimap<Project.NameKey, RefState> result =
-        MultimapBuilder.hashKeys().hashSetValues().build();
-    for (byte[] b : states) {
-      RefState.check(b != null, null);
-      String s = new String(b, UTF_8);
-      List<String> parts = Splitter.on(':').splitToList(s);
-      RefState.check(parts.size() == 3 && !parts.get(0).isEmpty() && !parts.get(1).isEmpty(), s);
-      result.put(new Project.NameKey(parts.get(0)), RefState.create(parts.get(1), parts.get(2)));
-    }
-    return result;
-  }
-
-  private ListMultimap<Project.NameKey, RefStatePattern> parsePatterns(ChangeData cd) {
-    return parsePatterns(cd.getRefStatePatterns());
-  }
-
-  public static ListMultimap<Project.NameKey, RefStatePattern> parsePatterns(
-      Iterable<byte[]> patterns) {
-    RefStatePattern.check(patterns != null, null);
-    ListMultimap<Project.NameKey, RefStatePattern> result =
-        MultimapBuilder.hashKeys().arrayListValues().build();
-    for (byte[] b : patterns) {
-      RefStatePattern.check(b != null, null);
-      String s = new String(b, UTF_8);
-      List<String> parts = Splitter.on(':').splitToList(s);
-      RefStatePattern.check(parts.size() == 2, s);
-      result.put(
-          new Project.NameKey(Url.decode(parts.get(0))), RefStatePattern.create(parts.get(1)));
-    }
-    return result;
-  }
-
-  private static boolean refsAreStale(
-      GitRepositoryManager repoManager,
-      Change.Id id,
-      Project.NameKey project,
-      SetMultimap<Project.NameKey, RefState> allStates,
-      ListMultimap<Project.NameKey, RefStatePattern> allPatterns) {
-    try (Repository repo = repoManager.openRepository(project)) {
-      Set<RefState> states = allStates.get(project);
-      for (RefState state : states) {
-        if (!state.match(repo)) {
-          return true;
-        }
-      }
-      for (RefStatePattern pattern : allPatterns.get(project)) {
-        if (!pattern.match(repo, states)) {
-          return true;
-        }
-      }
-      return false;
-    } catch (IOException e) {
-      log.warn("error checking staleness of {} in {}", id, project, e);
-      return true;
-    }
-  }
-
-  /**
-   * Pattern for matching refs.
-   *
-   * <p>Similar to '*' syntax for native Git refspecs, but slightly more powerful: the pattern may
-   * contain arbitrarily many asterisks. There must be at least one '*' and the first one must
-   * immediately follow a '/'.
-   */
-  @AutoValue
-  public abstract static class RefStatePattern {
-    static RefStatePattern create(String pattern) {
-      int star = pattern.indexOf('*');
-      check(star > 0 && pattern.charAt(star - 1) == '/', pattern);
-      String prefix = pattern.substring(0, star);
-      check(Repository.isValidRefName(pattern.replace('*', 'x')), pattern);
-
-      // Quote everything except the '*'s, which become ".*".
-      String regex =
-          Streams.stream(Splitter.on('*').split(pattern))
-              .map(Pattern::quote)
-              .collect(joining(".*", "^", "$"));
-      return new AutoValue_StalenessChecker_RefStatePattern(
-          pattern, prefix, Pattern.compile(regex));
-    }
-
-    byte[] toByteArray(Project.NameKey project) {
-      return (project.toString() + ':' + pattern()).getBytes(UTF_8);
-    }
-
-    private static void check(boolean condition, String str) {
-      checkArgument(condition, "invalid RefStatePattern: %s", str);
-    }
-
-    abstract String pattern();
-
-    abstract String prefix();
-
-    abstract Pattern regex();
-
-    boolean match(String refName) {
-      return regex().matcher(refName).find();
-    }
-
-    private boolean match(Repository repo, Set<RefState> expected) throws IOException {
-      for (Ref r : repo.getRefDatabase().getRefs(prefix()).values()) {
-        if (!match(r.getName())) {
-          continue;
-        }
-        if (!expected.contains(RefState.of(r))) {
-          return false;
-        }
-      }
-      return true;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/AllGroupsIndexer.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/group/AllGroupsIndexer.java
deleted file mode 100644
index 3584961..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/AllGroupsIndexer.java
+++ /dev/null
@@ -1,138 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.index.group;
-
-import static com.google.common.collect.ImmutableList.toImmutableList;
-import static com.google.gerrit.server.git.QueueProvider.QueueType.BATCH;
-
-import com.google.common.base.Stopwatch;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.ListeningExecutorService;
-import com.google.gerrit.index.SiteIndexer;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.account.GroupCache;
-import com.google.gerrit.server.group.Groups;
-import com.google.gerrit.server.group.InternalGroup;
-import com.google.gerrit.server.index.IndexExecutor;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-import org.eclipse.jgit.lib.ProgressMonitor;
-import org.eclipse.jgit.lib.TextProgressMonitor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class AllGroupsIndexer extends SiteIndexer<AccountGroup.UUID, InternalGroup, GroupIndex> {
-  private static final Logger log = LoggerFactory.getLogger(AllGroupsIndexer.class);
-
-  private final SchemaFactory<ReviewDb> schemaFactory;
-  private final ListeningExecutorService executor;
-  private final GroupCache groupCache;
-  private final Groups groups;
-
-  @Inject
-  AllGroupsIndexer(
-      SchemaFactory<ReviewDb> schemaFactory,
-      @IndexExecutor(BATCH) ListeningExecutorService executor,
-      GroupCache groupCache,
-      Groups groups) {
-    this.schemaFactory = schemaFactory;
-    this.executor = executor;
-    this.groupCache = groupCache;
-    this.groups = groups;
-  }
-
-  @Override
-  public SiteIndexer.Result indexAll(GroupIndex index) {
-    ProgressMonitor progress = new TextProgressMonitor(newPrintWriter(progressOut));
-    progress.start(2);
-    Stopwatch sw = Stopwatch.createStarted();
-    List<AccountGroup.UUID> uuids;
-    try {
-      uuids = collectGroups(progress);
-    } catch (OrmException e) {
-      log.error("Error collecting groups", e);
-      return new SiteIndexer.Result(sw, false, 0, 0);
-    }
-    return reindexGroups(index, uuids, progress);
-  }
-
-  private SiteIndexer.Result reindexGroups(
-      GroupIndex index, List<AccountGroup.UUID> uuids, ProgressMonitor progress) {
-    progress.beginTask("Reindexing groups", uuids.size());
-    List<ListenableFuture<?>> futures = new ArrayList<>(uuids.size());
-    AtomicBoolean ok = new AtomicBoolean(true);
-    AtomicInteger done = new AtomicInteger();
-    AtomicInteger failed = new AtomicInteger();
-    Stopwatch sw = Stopwatch.createStarted();
-    for (AccountGroup.UUID uuid : uuids) {
-      String desc = "group " + uuid;
-      ListenableFuture<?> future =
-          executor.submit(
-              () -> {
-                try {
-                  Optional<InternalGroup> oldGroup = groupCache.get(uuid);
-                  if (oldGroup.isPresent()) {
-                    InternalGroup group = oldGroup.get();
-                    groupCache.evict(group.getGroupUUID(), group.getId(), group.getNameKey());
-                  }
-                  Optional<InternalGroup> internalGroup = groupCache.get(uuid);
-                  if (internalGroup.isPresent()) {
-                    index.replace(internalGroup.get());
-                  } else {
-                    index.delete(uuid);
-                  }
-                  verboseWriter.println("Reindexed " + desc);
-                  done.incrementAndGet();
-                } catch (Exception e) {
-                  failed.incrementAndGet();
-                  throw e;
-                }
-                return null;
-              });
-      addErrorListener(future, desc, progress, ok);
-      futures.add(future);
-    }
-
-    try {
-      Futures.successfulAsList(futures).get();
-    } catch (ExecutionException | InterruptedException e) {
-      log.error("Error waiting on group futures", e);
-      return new SiteIndexer.Result(sw, false, 0, 0);
-    }
-
-    progress.endTask();
-    return new SiteIndexer.Result(sw, ok.get(), done.get(), failed.get());
-  }
-
-  private List<AccountGroup.UUID> collectGroups(ProgressMonitor progress) throws OrmException {
-    progress.beginTask("Collecting groups", ProgressMonitor.UNKNOWN);
-    try (ReviewDb db = schemaFactory.open()) {
-      return groups.getAll(db).map(AccountGroup::getGroupUUID).collect(toImmutableList());
-    } finally {
-      progress.endTask();
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupField.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupField.java
deleted file mode 100644
index 078433a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupField.java
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.index.group;
-
-import static com.google.common.collect.ImmutableList.toImmutableList;
-import static com.google.gerrit.index.FieldDef.exact;
-import static com.google.gerrit.index.FieldDef.fullText;
-import static com.google.gerrit.index.FieldDef.integer;
-import static com.google.gerrit.index.FieldDef.prefix;
-import static com.google.gerrit.index.FieldDef.timestamp;
-
-import com.google.gerrit.index.FieldDef;
-import com.google.gerrit.index.SchemaUtil;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.group.InternalGroup;
-import java.sql.Timestamp;
-
-/** Secondary index schemas for groups. */
-public class GroupField {
-  /** Legacy group ID. */
-  public static final FieldDef<InternalGroup, Integer> ID =
-      integer("id").build(g -> g.getId().get());
-
-  /** Group UUID. */
-  public static final FieldDef<InternalGroup, String> UUID =
-      exact("uuid").stored().build(g -> g.getGroupUUID().get());
-
-  /** Group owner UUID. */
-  public static final FieldDef<InternalGroup, String> OWNER_UUID =
-      exact("owner_uuid").build(g -> g.getOwnerGroupUUID().get());
-
-  /** Timestamp indicating when this group was created. */
-  public static final FieldDef<InternalGroup, Timestamp> CREATED_ON =
-      timestamp("created_on").build(InternalGroup::getCreatedOn);
-
-  /** Group name. */
-  public static final FieldDef<InternalGroup, String> NAME =
-      exact("name").build(InternalGroup::getName);
-
-  /** Prefix match on group name parts. */
-  public static final FieldDef<InternalGroup, Iterable<String>> NAME_PART =
-      prefix("name_part").buildRepeatable(g -> SchemaUtil.getNameParts(g.getName()));
-
-  /** Group description. */
-  public static final FieldDef<InternalGroup, String> DESCRIPTION =
-      fullText("description").build(InternalGroup::getDescription);
-
-  /** Whether the group is visible to all users. */
-  public static final FieldDef<InternalGroup, String> IS_VISIBLE_TO_ALL =
-      exact("is_visible_to_all").build(g -> g.isVisibleToAll() ? "1" : "0");
-
-  public static final FieldDef<InternalGroup, Iterable<Integer>> MEMBER =
-      integer("member")
-          .buildRepeatable(
-              g -> g.getMembers().stream().map(Account.Id::get).collect(toImmutableList()));
-
-  public static final FieldDef<InternalGroup, Iterable<String>> SUBGROUP =
-      exact("subgroup")
-          .buildRepeatable(
-              g ->
-                  g.getSubgroups().stream().map(AccountGroup.UUID::get).collect(toImmutableList()));
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexRewriter.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexRewriter.java
deleted file mode 100644
index c658173..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexRewriter.java
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.index.group;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.gerrit.index.IndexRewriter;
-import com.google.gerrit.index.QueryOptions;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.index.query.QueryParseException;
-import com.google.gerrit.server.group.InternalGroup;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-@Singleton
-public class GroupIndexRewriter implements IndexRewriter<InternalGroup> {
-  private final GroupIndexCollection indexes;
-
-  @Inject
-  GroupIndexRewriter(GroupIndexCollection indexes) {
-    this.indexes = indexes;
-  }
-
-  @Override
-  public Predicate<InternalGroup> rewrite(Predicate<InternalGroup> in, QueryOptions opts)
-      throws QueryParseException {
-    GroupIndex index = indexes.getSearchIndex();
-    checkNotNull(index, "no active search index configured for groups");
-    return new IndexedGroupQuery(index, in, opts);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexer.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexer.java
deleted file mode 100644
index 0925cf4..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexer.java
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.index.group;
-
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import java.io.IOException;
-
-public interface GroupIndexer {
-
-  /**
-   * Synchronously index a group.
-   *
-   * @param uuid group UUID to index.
-   */
-  void index(AccountGroup.UUID uuid) throws IOException;
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexerImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexerImpl.java
deleted file mode 100644
index 69b29bc..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexerImpl.java
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.index.group;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.events.GroupIndexedListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.index.Index;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.account.GroupCache;
-import com.google.gerrit.server.group.InternalGroup;
-import com.google.inject.assistedinject.Assisted;
-import com.google.inject.assistedinject.AssistedInject;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Optional;
-
-public class GroupIndexerImpl implements GroupIndexer {
-  public interface Factory {
-    GroupIndexerImpl create(GroupIndexCollection indexes);
-
-    GroupIndexerImpl create(@Nullable GroupIndex index);
-  }
-
-  private final GroupCache groupCache;
-  private final DynamicSet<GroupIndexedListener> indexedListener;
-  private final GroupIndexCollection indexes;
-  private final GroupIndex index;
-
-  @AssistedInject
-  GroupIndexerImpl(
-      GroupCache groupCache,
-      DynamicSet<GroupIndexedListener> indexedListener,
-      @Assisted GroupIndexCollection indexes) {
-    this.groupCache = groupCache;
-    this.indexedListener = indexedListener;
-    this.indexes = indexes;
-    this.index = null;
-  }
-
-  @AssistedInject
-  GroupIndexerImpl(
-      GroupCache groupCache,
-      DynamicSet<GroupIndexedListener> indexedListener,
-      @Assisted GroupIndex index) {
-    this.groupCache = groupCache;
-    this.indexedListener = indexedListener;
-    this.indexes = null;
-    this.index = index;
-  }
-
-  @Override
-  public void index(AccountGroup.UUID uuid) throws IOException {
-    for (Index<AccountGroup.UUID, InternalGroup> i : getWriteIndexes()) {
-      Optional<InternalGroup> internalGroup = groupCache.get(uuid);
-      if (internalGroup.isPresent()) {
-        i.replace(internalGroup.get());
-      } else {
-        i.delete(uuid);
-      }
-    }
-    fireGroupIndexedEvent(uuid.get());
-  }
-
-  private void fireGroupIndexedEvent(String uuid) {
-    for (GroupIndexedListener listener : indexedListener) {
-      listener.onGroupIndexed(uuid);
-    }
-  }
-
-  private Collection<GroupIndex> getWriteIndexes() {
-    if (indexes != null) {
-      return indexes.getWriteIndexes();
-    }
-
-    return index != null ? Collections.singleton(index) : ImmutableSet.of();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupSchemaDefinitions.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupSchemaDefinitions.java
deleted file mode 100644
index b280b25..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupSchemaDefinitions.java
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.index.group;
-
-import static com.google.gerrit.index.SchemaUtil.schema;
-
-import com.google.gerrit.index.Schema;
-import com.google.gerrit.index.SchemaDefinitions;
-import com.google.gerrit.server.group.InternalGroup;
-
-public class GroupSchemaDefinitions extends SchemaDefinitions<InternalGroup> {
-  @Deprecated
-  static final Schema<InternalGroup> V2 =
-      schema(
-          GroupField.DESCRIPTION,
-          GroupField.ID,
-          GroupField.IS_VISIBLE_TO_ALL,
-          GroupField.NAME,
-          GroupField.NAME_PART,
-          GroupField.OWNER_UUID,
-          GroupField.UUID);
-
-  @Deprecated static final Schema<InternalGroup> V3 = schema(V2, GroupField.CREATED_ON);
-
-  static final Schema<InternalGroup> V4 = schema(V3, GroupField.MEMBER, GroupField.SUBGROUP);
-
-  public static final GroupSchemaDefinitions INSTANCE = new GroupSchemaDefinitions();
-
-  private GroupSchemaDefinitions() {
-    super("groups", InternalGroup.class);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/IndexedGroupQuery.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/group/IndexedGroupQuery.java
deleted file mode 100644
index 255df32..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/IndexedGroupQuery.java
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.index.group;
-
-import com.google.gerrit.index.Index;
-import com.google.gerrit.index.IndexedQuery;
-import com.google.gerrit.index.QueryOptions;
-import com.google.gerrit.index.query.DataSource;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.index.query.QueryParseException;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.group.InternalGroup;
-
-public class IndexedGroupQuery extends IndexedQuery<AccountGroup.UUID, InternalGroup>
-    implements DataSource<InternalGroup> {
-
-  public IndexedGroupQuery(
-      Index<AccountGroup.UUID, InternalGroup> index,
-      Predicate<InternalGroup> pred,
-      QueryOptions opts)
-      throws QueryParseException {
-    super(index, pred, opts.convertForBackend());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ioutil/ColumnFormatter.java b/gerrit-server/src/main/java/com/google/gerrit/server/ioutil/ColumnFormatter.java
deleted file mode 100644
index 10ad33b..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/ioutil/ColumnFormatter.java
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.ioutil;
-
-import com.google.gerrit.server.StringUtil;
-import java.io.PrintWriter;
-
-/**
- * Simple output formatter for column-oriented data, writing its output to a {@link
- * java.io.PrintWriter} object. Handles escaping of the column data so that the resulting output is
- * unambiguous and reasonably safe and machine parsable.
- */
-public class ColumnFormatter {
-  private char columnSeparator;
-  private boolean firstColumn;
-  private final PrintWriter out;
-
-  /**
-   * @param out The writer to which output should be sent.
-   * @param columnSeparator A character that should serve as the separator token between columns of
-   *     output. As only non-printable characters in the column text are ever escaped, the column
-   *     separator must be a non-printable character if the output needs to be unambiguously parsed.
-   */
-  public ColumnFormatter(PrintWriter out, char columnSeparator) {
-    this.out = out;
-    this.columnSeparator = columnSeparator;
-    this.firstColumn = true;
-  }
-
-  /**
-   * Adds a text string as a new column in the current line of output, taking care of escaping as
-   * necessary.
-   *
-   * @param content the string to add.
-   */
-  public void addColumn(String content) {
-    if (!firstColumn) {
-      out.print(columnSeparator);
-    }
-    out.print(StringUtil.escapeString(content));
-    firstColumn = false;
-  }
-
-  /**
-   * Finishes the output by flushing the current line and takes care of any other cleanup action.
-   */
-  public void finish() {
-    nextLine();
-    out.flush();
-  }
-
-  /**
-   * Flushes the current line of output and makes the formatter ready to start receiving new column
-   * data for a new line (or end-of-file). If the current line is empty nothing is done, i.e.
-   * consecutive calls to this method without intervening calls to {@link #addColumn} will be
-   * squashed.
-   */
-  public void nextLine() {
-    if (!firstColumn) {
-      out.print('\n');
-      firstColumn = true;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/Address.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/Address.java
deleted file mode 100644
index e91f3f3..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/Address.java
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.mail;
-
-import com.google.gerrit.server.mail.send.EmailHeader;
-
-public class Address {
-  public static Address parse(String in) {
-    final int lt = in.indexOf('<');
-    final int gt = in.indexOf('>');
-    final int at = in.indexOf("@");
-    if (0 <= lt && lt < gt && lt + 1 < at && at + 1 < gt) {
-      final String email = in.substring(lt + 1, gt).trim();
-      final String name = in.substring(0, lt).trim();
-      int nameStart = 0;
-      int nameEnd = name.length();
-      if (name.startsWith("\"")) {
-        nameStart++;
-      }
-      if (name.endsWith("\"")) {
-        nameEnd--;
-      }
-      return new Address(name.length() > 0 ? name.substring(nameStart, nameEnd) : null, email);
-    }
-
-    if (lt < 0 && gt < 0 && 0 < at && at < in.length() - 1) {
-      return new Address(in);
-    }
-
-    throw new IllegalArgumentException("Invalid email address: " + in);
-  }
-
-  public static Address tryParse(String in) {
-    try {
-      return parse(in);
-    } catch (IllegalArgumentException e) {
-      return null;
-    }
-  }
-
-  final String name;
-  final String email;
-
-  public Address(String email) {
-    this(null, email);
-  }
-
-  public Address(String name, String email) {
-    this.name = name;
-    this.email = email;
-  }
-
-  public String getName() {
-    return name;
-  }
-
-  public String getEmail() {
-    return email;
-  }
-
-  @Override
-  public int hashCode() {
-    return email.hashCode();
-  }
-
-  @Override
-  public boolean equals(Object other) {
-    if (other instanceof Address) {
-      return email.equals(((Address) other).email);
-    }
-    return false;
-  }
-
-  @Override
-  public String toString() {
-    return toHeaderString();
-  }
-
-  public String toHeaderString() {
-    if (name != null) {
-      return quotedPhrase(name) + " <" + email + ">";
-    } else if (isSimple()) {
-      return email;
-    }
-    return "<" + email + ">";
-  }
-
-  private static final String MUST_QUOTE_EMAIL = "()<>,;:\\\"[]";
-  private static final String MUST_QUOTE_NAME = MUST_QUOTE_EMAIL + "@.";
-
-  private boolean isSimple() {
-    for (int i = 0; i < email.length(); i++) {
-      final char c = email.charAt(i);
-      if (c <= ' ' || 0x7F <= c || MUST_QUOTE_EMAIL.indexOf(c) != -1) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  private static String quotedPhrase(String name) {
-    if (EmailHeader.needsQuotedPrintable(name)) {
-      return EmailHeader.quotedPrintable(name);
-    }
-    for (int i = 0; i < name.length(); i++) {
-      final char c = name.charAt(i);
-      if (MUST_QUOTE_NAME.indexOf(c) != -1) {
-        return wrapInQuotes(name);
-      }
-    }
-    return name;
-  }
-
-  private static String wrapInQuotes(String name) {
-    final StringBuilder r = new StringBuilder(2 + name.length());
-    r.append('"');
-    for (int i = 0; i < name.length(); i++) {
-      char c = name.charAt(i);
-      if (c == '"' || c == '\\') {
-        r.append('\\');
-      }
-      r.append(c);
-    }
-    r.append('"');
-    return r.toString();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/ListMailFilter.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/ListMailFilter.java
deleted file mode 100644
index 2e7c828..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/ListMailFilter.java
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.mail;
-
-import static java.util.stream.Collectors.joining;
-
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.mail.receive.MailMessage;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.Arrays;
-import java.util.regex.Pattern;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class ListMailFilter implements MailFilter {
-  public enum ListFilterMode {
-    OFF,
-    WHITELIST,
-    BLACKLIST
-  }
-
-  private static final Logger log = LoggerFactory.getLogger(ListMailFilter.class);
-
-  private final ListFilterMode mode;
-  private final Pattern mailPattern;
-
-  @Inject
-  ListMailFilter(@GerritServerConfig Config cfg) {
-    this.mode = cfg.getEnum("receiveemail", "filter", "mode", ListFilterMode.OFF);
-    String[] addresses = cfg.getStringList("receiveemail", "filter", "patterns");
-    String concat = Arrays.asList(addresses).stream().collect(joining("|"));
-    this.mailPattern = Pattern.compile(concat);
-  }
-
-  @Override
-  public boolean shouldProcessMessage(MailMessage message) {
-    if (mode == ListFilterMode.OFF) {
-      return true;
-    }
-
-    boolean match = mailPattern.matcher(message.from().email).find();
-    if ((mode == ListFilterMode.WHITELIST && !match)
-        || (mode == ListFilterMode.BLACKLIST && match)) {
-      log.info("Mail message from " + message.from() + " rejected by list filter");
-      return false;
-    }
-    return true;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/MailFilter.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/MailFilter.java
deleted file mode 100644
index d50064d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/MailFilter.java
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.mail;
-
-import com.google.gerrit.extensions.annotations.ExtensionPoint;
-import com.google.gerrit.server.mail.receive.MailMessage;
-
-/**
- * Listener to filter incoming email.
- *
- * <p>Invoked by Gerrit for each incoming email.
- */
-@ExtensionPoint
-public interface MailFilter {
-  /**
-   * Determine if Gerrit should discard or further process the message.
-   *
-   * @param message MailMessage parsed by Gerrit.
-   * @return {@code true}, if Gerrit should process the message, {@code false} otherwise.
-   */
-  boolean shouldProcessMessage(MailMessage message);
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/MailUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/MailUtil.java
deleted file mode 100644
index 0487cc0..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/MailUtil.java
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.mail;
-
-import static com.google.gerrit.server.notedb.ReviewerStateInternal.CC;
-import static com.google.gerrit.server.notedb.ReviewerStateInternal.REVIEWER;
-
-import com.google.gerrit.common.FooterConstants;
-import com.google.gerrit.common.errors.NoSuchAccountException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.ReviewerSet;
-import com.google.gerrit.server.account.AccountResolver;
-import com.google.gwtorm.server.OrmException;
-import java.io.IOException;
-import java.time.format.DateTimeFormatter;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.regex.Pattern;
-import org.eclipse.jgit.revwalk.FooterKey;
-import org.eclipse.jgit.revwalk.FooterLine;
-
-public class MailUtil {
-  public static DateTimeFormatter rfcDateformatter =
-      DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss ZZZ");
-
-  public static MailRecipients getRecipientsFromFooters(
-      AccountResolver accountResolver, List<FooterLine> footerLines)
-      throws OrmException, IOException {
-    MailRecipients recipients = new MailRecipients();
-    for (FooterLine footerLine : footerLines) {
-      try {
-        if (isReviewer(footerLine)) {
-          recipients.reviewers.add(toAccountId(accountResolver, footerLine.getValue().trim()));
-        } else if (footerLine.matches(FooterKey.CC)) {
-          recipients.cc.add(toAccountId(accountResolver, footerLine.getValue().trim()));
-        }
-      } catch (NoSuchAccountException e) {
-        continue;
-      }
-    }
-    return recipients;
-  }
-
-  public static MailRecipients getRecipientsFromReviewers(ReviewerSet reviewers) {
-    MailRecipients recipients = new MailRecipients();
-    recipients.reviewers.addAll(reviewers.byState(REVIEWER));
-    recipients.cc.addAll(reviewers.byState(CC));
-    return recipients;
-  }
-
-  private static Account.Id toAccountId(AccountResolver accountResolver, String nameOrEmail)
-      throws OrmException, NoSuchAccountException, IOException {
-    Account a = accountResolver.findByNameOrEmail(nameOrEmail);
-    if (a == null) {
-      throw new NoSuchAccountException("\"" + nameOrEmail + "\" is not registered");
-    }
-    return a.getId();
-  }
-
-  private static boolean isReviewer(FooterLine candidateFooterLine) {
-    return candidateFooterLine.matches(FooterKey.SIGNED_OFF_BY)
-        || candidateFooterLine.matches(FooterKey.ACKED_BY)
-        || candidateFooterLine.matches(FooterConstants.REVIEWED_BY)
-        || candidateFooterLine.matches(FooterConstants.TESTED_BY);
-  }
-
-  public static class MailRecipients {
-    private final Set<Account.Id> reviewers;
-    private final Set<Account.Id> cc;
-
-    public MailRecipients() {
-      this.reviewers = new HashSet<>();
-      this.cc = new HashSet<>();
-    }
-
-    public MailRecipients(Set<Account.Id> reviewers, Set<Account.Id> cc) {
-      this.reviewers = new HashSet<>(reviewers);
-      this.cc = new HashSet<>(cc);
-    }
-
-    public void add(MailRecipients recipients) {
-      reviewers.addAll(recipients.reviewers);
-      cc.addAll(recipients.cc);
-    }
-
-    public void remove(Account.Id toRemove) {
-      reviewers.remove(toRemove);
-      cc.remove(toRemove);
-    }
-
-    public Set<Account.Id> getReviewers() {
-      return Collections.unmodifiableSet(reviewers);
-    }
-
-    public Set<Account.Id> getCcOnly() {
-      final Set<Account.Id> cc = new HashSet<>(this.cc);
-      cc.removeAll(reviewers);
-      return Collections.unmodifiableSet(cc);
-    }
-
-    public Set<Account.Id> getAll() {
-      final Set<Account.Id> all = new HashSet<>(reviewers.size() + cc.size());
-      all.addAll(reviewers);
-      all.addAll(cc);
-      return Collections.unmodifiableSet(all);
-    }
-  }
-
-  /** allow wildcard matching for {@code domains} */
-  public static Pattern glob(String[] domains) {
-    // if domains is not set, match anything
-    if (domains == null || domains.length == 0) {
-      return Pattern.compile(".*");
-    }
-
-    StringBuilder sb = new StringBuilder("");
-    for (String domain : domains) {
-      String quoted = "\\Q" + domain.replace("\\E", "\\E\\\\E\\Q") + "\\E|";
-      sb.append(quoted.replace("*", "\\E.*\\Q"));
-    }
-    return Pattern.compile(sb.substring(0, sb.length() - 1));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/MetadataName.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/MetadataName.java
deleted file mode 100644
index 3080e4f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/MetadataName.java
+++ /dev/null
@@ -1,34 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail;
-
-public final class MetadataName {
-  public static final String CHANGE_NUMBER = "Gerrit-Change-Number";
-  public static final String PATCH_SET = "Gerrit-PatchSet";
-  public static final String MESSAGE_TYPE = "Gerrit-MessageType";
-  public static final String TIMESTAMP = "Gerrit-Comment-Date";
-
-  public static String toHeader(String metadataName) {
-    return "X-" + metadataName;
-  }
-
-  public static String toHeaderWithDelimiter(String metadataName) {
-    return toHeader(metadataName) + ": ";
-  }
-
-  public static String toFooterWithDelimiter(String metadataName) {
-    return metadataName + ": ";
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/SignedTokenEmailTokenVerifier.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/SignedTokenEmailTokenVerifier.java
deleted file mode 100644
index aaf3243..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/SignedTokenEmailTokenVerifier.java
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.mail;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.config.AuthConfig;
-import com.google.gerrit.server.mail.send.RegisterNewEmailSender;
-import com.google.gwtjsonrpc.server.SignedToken;
-import com.google.gwtjsonrpc.server.ValidToken;
-import com.google.gwtjsonrpc.server.XsrfException;
-import com.google.inject.AbstractModule;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import org.eclipse.jgit.util.Base64;
-
-/** Verifies the token sent by {@link RegisterNewEmailSender}. */
-@Singleton
-public class SignedTokenEmailTokenVerifier implements EmailTokenVerifier {
-  private final SignedToken emailRegistrationToken;
-
-  public static class Module extends AbstractModule {
-    @Override
-    protected void configure() {
-      bind(EmailTokenVerifier.class).to(SignedTokenEmailTokenVerifier.class);
-    }
-  }
-
-  @Inject
-  SignedTokenEmailTokenVerifier(AuthConfig config) {
-    emailRegistrationToken = config.getEmailRegistrationToken();
-  }
-
-  @Override
-  public String encode(Account.Id accountId, String emailAddress) {
-    try {
-      String payload = String.format("%s:%s", accountId, emailAddress);
-      byte[] utf8 = payload.getBytes(UTF_8);
-      String base64 = Base64.encodeBytes(utf8);
-      return emailRegistrationToken.newToken(base64);
-    } catch (XsrfException e) {
-      throw new IllegalArgumentException(e);
-    }
-  }
-
-  @Override
-  public ParsedToken decode(String tokenString) throws InvalidTokenException {
-    ValidToken token;
-    try {
-      token = emailRegistrationToken.checkToken(tokenString, null);
-    } catch (XsrfException err) {
-      throw new InvalidTokenException(err);
-    }
-    if (token == null || token.getData() == null || token.getData().isEmpty()) {
-      throw new InvalidTokenException();
-    }
-
-    String payload = new String(Base64.decode(token.getData()), UTF_8);
-    Matcher matcher = Pattern.compile("^([0-9]+):(.+@.+)$").matcher(payload);
-    if (!matcher.matches()) {
-      throw new InvalidTokenException();
-    }
-
-    Account.Id id;
-    try {
-      id = Account.Id.parse(matcher.group(1));
-    } catch (IllegalArgumentException err) {
-      throw new InvalidTokenException(err);
-    }
-
-    String newEmail = matcher.group(2);
-    return new ParsedToken(id, newEmail);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/HtmlParser.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/HtmlParser.java
deleted file mode 100644
index 14cb09a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/HtmlParser.java
+++ /dev/null
@@ -1,137 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.receive;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterators;
-import com.google.common.collect.PeekingIterator;
-import com.google.gerrit.reviewdb.client.Comment;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import org.jsoup.Jsoup;
-import org.jsoup.nodes.Document;
-import org.jsoup.nodes.Element;
-
-/** Provides functionality for parsing the HTML part of a {@link MailMessage}. */
-public class HtmlParser {
-
-  private static final ImmutableList<String> MAIL_PROVIDER_EXTRAS =
-      ImmutableList.of(
-          "gmail_extra", // "On 01/01/2017 User<user@gmail.com> wrote:"
-          "gmail_quote" // Used for quoting original content
-          );
-
-  private HtmlParser() {}
-
-  /**
-   * Parses comments from html email.
-   *
-   * <p>This parser goes though all html elements in the email and checks for matching patterns. It
-   * keeps track of the last file and comments it encountered to know in which context a parsed
-   * comment belongs. It uses the href attributes of <a> tags to identify comments sent out by
-   * Gerrit as these are generally more reliable then the text captions.
-   *
-   * @param email the message as received from the email service
-   * @param comments a specific set of comments as sent out in the original notification email.
-   *     Comments are expected to be in the same order as they were sent out to in the email.
-   * @param changeUrl canonical change URL that points to the change on this Gerrit instance.
-   *     Example: https://go-review.googlesource.com/#/c/91570
-   * @return list of MailComments parsed from the html part of the email
-   */
-  public static List<MailComment> parse(
-      MailMessage email, Collection<Comment> comments, String changeUrl) {
-    // TODO(hiesel) Add support for Gmail Mobile
-    // TODO(hiesel) Add tests for other popular email clients
-
-    // This parser goes though all html elements in the email and checks for
-    // matching patterns. It keeps track of the last file and comments it
-    // encountered to know in which context a parsed comment belongs.
-    // It uses the href attributes of <a> tags to identify comments sent out by
-    // Gerrit as these are generally more reliable then the text captions.
-    List<MailComment> parsedComments = new ArrayList<>();
-    Document d = Jsoup.parse(email.htmlContent());
-    PeekingIterator<Comment> iter = Iterators.peekingIterator(comments.iterator());
-
-    String lastEncounteredFileName = null;
-    Comment lastEncounteredComment = null;
-    for (Element e : d.body().getAllElements()) {
-      String elementName = e.tagName();
-      boolean isInBlockQuote =
-          e.parents().stream().filter(p -> p.tagName().equals("blockquote")).findAny().isPresent();
-
-      if (elementName.equals("a")) {
-        String href = e.attr("href");
-        // Check if there is still a next comment that could be contained in
-        // this <a> tag
-        if (!iter.hasNext()) {
-          continue;
-        }
-        Comment perspectiveComment = iter.peek();
-        if (href.equals(ParserUtil.filePath(changeUrl, perspectiveComment))) {
-          if (lastEncounteredFileName == null
-              || !lastEncounteredFileName.equals(perspectiveComment.key.filename)) {
-            // Not a file-level comment, but users could have typed a comment
-            // right after this file annotation to create a new file-level
-            // comment. If this file has a file-level comment, we have already
-            // set lastEncounteredComment to that file-level comment when we
-            // encountered the file link and should not reset it now.
-            lastEncounteredFileName = perspectiveComment.key.filename;
-            lastEncounteredComment = null;
-          } else if (perspectiveComment.lineNbr == 0) {
-            // This was originally a file-level comment
-            lastEncounteredComment = perspectiveComment;
-            iter.next();
-          }
-        } else if (ParserUtil.isCommentUrl(href, changeUrl, perspectiveComment)) {
-          // This is a regular inline comment
-          lastEncounteredComment = perspectiveComment;
-          iter.next();
-        }
-      } else if (!isInBlockQuote
-          && elementName.equals("div")
-          && !MAIL_PROVIDER_EXTRAS.contains(e.className())) {
-        // This is a comment typed by the user
-        // Replace non-breaking spaces and trim string
-        String content = e.ownText().replace('\u00a0', ' ').trim();
-        if (!Strings.isNullOrEmpty(content)) {
-          if (lastEncounteredComment == null && lastEncounteredFileName == null) {
-            // Remove quotation line, email signature and
-            // "Sent from my xyz device"
-            content = ParserUtil.trimQuotation(content);
-            // TODO(hiesel) Add more sanitizer
-            if (!Strings.isNullOrEmpty(content)) {
-              ParserUtil.appendOrAddNewComment(
-                  new MailComment(content, null, null, MailComment.CommentType.CHANGE_MESSAGE),
-                  parsedComments);
-            }
-          } else if (lastEncounteredComment == null) {
-            ParserUtil.appendOrAddNewComment(
-                new MailComment(
-                    content, lastEncounteredFileName, null, MailComment.CommentType.FILE_COMMENT),
-                parsedComments);
-          } else {
-            ParserUtil.appendOrAddNewComment(
-                new MailComment(
-                    content, null, lastEncounteredComment, MailComment.CommentType.INLINE_COMMENT),
-                parsedComments);
-          }
-        }
-      }
-    }
-    return parsedComments;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/ImapMailReceiver.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/ImapMailReceiver.java
deleted file mode 100644
index 6bb6211..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/ImapMailReceiver.java
+++ /dev/null
@@ -1,135 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.receive;
-
-import com.google.gerrit.server.git.WorkQueue;
-import com.google.gerrit.server.mail.EmailSettings;
-import com.google.gerrit.server.mail.Encryption;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.commons.net.imap.IMAPClient;
-import org.apache.commons.net.imap.IMAPSClient;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class ImapMailReceiver extends MailReceiver {
-  private static final Logger log = LoggerFactory.getLogger(ImapMailReceiver.class);
-  private static final String INBOX_FOLDER = "INBOX";
-
-  @Inject
-  ImapMailReceiver(EmailSettings mailSettings, MailProcessor mailProcessor, WorkQueue workQueue) {
-    super(mailSettings, mailProcessor, workQueue);
-  }
-
-  /**
-   * Opens a connection to the mail server, removes emails where deletion is pending, reads new
-   * email and closes the connection.
-   *
-   * @param async determines if processing messages should happen asynchronously
-   * @throws MailTransferException in case of a known transport failure
-   * @throws IOException in case of a low-level transport failure
-   */
-  @Override
-  public synchronized void handleEmails(boolean async) throws MailTransferException, IOException {
-    IMAPClient imap;
-    if (mailSettings.encryption != Encryption.NONE) {
-      imap = new IMAPSClient(mailSettings.encryption.name(), true);
-    } else {
-      imap = new IMAPClient();
-    }
-    if (mailSettings.port > 0) {
-      imap.setDefaultPort(mailSettings.port);
-    }
-    // Set a 30s timeout for each operation
-    imap.setDefaultTimeout(30 * 1000);
-    imap.connect(mailSettings.host);
-    try {
-      if (!imap.login(mailSettings.username, mailSettings.password)) {
-        throw new MailTransferException("Could not login to IMAP server");
-      }
-      try {
-        if (!imap.select(INBOX_FOLDER)) {
-          throw new MailTransferException("Could not select IMAP folder " + INBOX_FOLDER);
-        }
-        // Fetch just the internal dates first to know how many messages we
-        // should fetch.
-        if (!imap.fetch("1:*", "(INTERNALDATE)")) {
-          // false indicates that there are no messages to fetch
-          log.info("Fetched 0 messages via IMAP");
-          return;
-        }
-        // Format of reply is one line per email and one line to indicate
-        // that the fetch was successful.
-        // Example:
-        // * 1 FETCH (INTERNALDATE "Mon, 24 Oct 2016 16:53:22 +0200 (CEST)")
-        // * 2 FETCH (INTERNALDATE "Mon, 24 Oct 2016 16:53:22 +0200 (CEST)")
-        // AAAC OK FETCH completed.
-        int numMessages = imap.getReplyStrings().length - 1;
-        log.info("Fetched " + numMessages + " messages via IMAP");
-        // Fetch the full version of all emails
-        List<MailMessage> mailMessages = new ArrayList<>(numMessages);
-        for (int i = 1; i <= numMessages; i++) {
-          if (imap.fetch(i + ":" + i, "(BODY.PEEK[])")) {
-            // Obtain full reply
-            String[] rawMessage = imap.getReplyStrings();
-            if (rawMessage.length < 2) {
-              continue;
-            }
-            // First and last line are IMAP status codes. We have already
-            // checked, that the fetch returned true (OK), so we safely ignore
-            // those two lines.
-            StringBuilder b = new StringBuilder(2 * (rawMessage.length - 2));
-            for (int j = 1; j < rawMessage.length - 1; j++) {
-              if (j > 1) {
-                b.append("\n");
-              }
-              b.append(rawMessage[j]);
-            }
-            try {
-              MailMessage mailMessage = RawMailParser.parse(b.toString());
-              if (pendingDeletion.contains(mailMessage.id())) {
-                // Mark message as deleted
-                if (imap.store(i + ":" + i, "+FLAGS", "(\\Deleted)")) {
-                  pendingDeletion.remove(mailMessage.id());
-                } else {
-                  log.error("Could not mark mail message as deleted: " + mailMessage.id());
-                }
-              } else {
-                mailMessages.add(mailMessage);
-              }
-            } catch (MailParsingException e) {
-              log.error("Exception while parsing email after IMAP fetch", e);
-            }
-          } else {
-            log.error("IMAP fetch failed. Will retry in next fetch cycle.");
-          }
-        }
-        // Permanently delete emails marked for deletion
-        if (!imap.expunge()) {
-          log.error("Could not expunge IMAP emails");
-        }
-        dispatchMailProcessor(mailMessages, async);
-      } finally {
-        imap.logout();
-      }
-    } finally {
-      imap.disconnect();
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailComment.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailComment.java
deleted file mode 100644
index f7804b33..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailComment.java
+++ /dev/null
@@ -1,51 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.receive;
-
-import com.google.gerrit.reviewdb.client.Comment;
-import java.util.Objects;
-
-/** A comment parsed from inbound email */
-public class MailComment {
-  enum CommentType {
-    CHANGE_MESSAGE,
-    FILE_COMMENT,
-    INLINE_COMMENT
-  }
-
-  CommentType type;
-  Comment inReplyTo;
-  String fileName;
-  String message;
-
-  public MailComment() {}
-
-  public MailComment(String message, String fileName, Comment inReplyTo, CommentType type) {
-    this.message = message;
-    this.fileName = fileName;
-    this.inReplyTo = inReplyTo;
-    this.type = type;
-  }
-
-  /**
-   * Checks if the provided comment concerns the same exact spot in the change. This is basically an
-   * equals method except that the message is not checked.
-   */
-  public boolean isSameCommentPath(MailComment c) {
-    return Objects.equals(fileName, c.fileName)
-        && Objects.equals(inReplyTo, c.inReplyTo)
-        && Objects.equals(type, c.type);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailMessage.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailMessage.java
deleted file mode 100644
index 68b3c23..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailMessage.java
+++ /dev/null
@@ -1,108 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.receive;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.server.mail.Address;
-import org.joda.time.DateTime;
-
-/**
- * A simplified representation of an RFC 2045-2047 mime email message used for representing received
- * emails inside Gerrit. It is populated by the MailParser after MailReceiver has received a
- * message. Transformations done by the parser include stitching mime parts together, transforming
- * all content to UTF-16 and removing attachments.
- *
- * <p>A valid {@link MailMessage} contains at least the following fields: id, from, to, subject and
- * dateReceived.
- */
-@AutoValue
-public abstract class MailMessage {
-  // Unique Identifier
-  public abstract String id();
-  // Envelop Information
-  public abstract Address from();
-
-  public abstract ImmutableList<Address> to();
-
-  public abstract ImmutableList<Address> cc();
-  // Metadata
-  public abstract DateTime dateReceived();
-
-  public abstract ImmutableList<String> additionalHeaders();
-  // Content
-  public abstract String subject();
-
-  @Nullable
-  public abstract String textContent();
-
-  @Nullable
-  public abstract String htmlContent();
-  // Raw content as received over the wire
-  @Nullable
-  public abstract ImmutableList<Integer> rawContent();
-
-  @Nullable
-  public abstract String rawContentUTF();
-
-  public static Builder builder() {
-    return new AutoValue_MailMessage.Builder();
-  }
-
-  public abstract Builder toBuilder();
-
-  @AutoValue.Builder
-  public abstract static class Builder {
-    public abstract Builder id(String val);
-
-    public abstract Builder from(Address val);
-
-    public abstract ImmutableList.Builder<Address> toBuilder();
-
-    public Builder addTo(Address val) {
-      toBuilder().add(val);
-      return this;
-    }
-
-    public abstract ImmutableList.Builder<Address> ccBuilder();
-
-    public Builder addCc(Address val) {
-      ccBuilder().add(val);
-      return this;
-    }
-
-    public abstract Builder dateReceived(DateTime val);
-
-    public abstract ImmutableList.Builder<String> additionalHeadersBuilder();
-
-    public Builder addAdditionalHeader(String val) {
-      additionalHeadersBuilder().add(val);
-      return this;
-    }
-
-    public abstract Builder subject(String val);
-
-    public abstract Builder textContent(String val);
-
-    public abstract Builder htmlContent(String val);
-
-    public abstract Builder rawContent(ImmutableList<Integer> val);
-
-    public abstract Builder rawContentUTF(String val);
-
-    public abstract MailMessage build();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailMetadata.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailMetadata.java
deleted file mode 100644
index 04c2add..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailMetadata.java
+++ /dev/null
@@ -1,46 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.receive;
-
-import com.google.common.base.MoreObjects;
-import java.sql.Timestamp;
-
-/** MailMetadata represents metadata parsed from inbound email. */
-public class MailMetadata {
-  public Integer changeNumber;
-  public Integer patchSet;
-  public String author; // Author of the email
-  public Timestamp timestamp;
-  public String messageType; // we expect comment here
-
-  public boolean hasRequiredFields() {
-    return changeNumber != null
-        && patchSet != null
-        && author != null
-        && timestamp != null
-        && messageType != null;
-  }
-
-  @Override
-  public String toString() {
-    return MoreObjects.toStringHelper(this)
-        .add("Change-Number", changeNumber)
-        .add("Patch-Set", patchSet)
-        .add("Author", author)
-        .add("Timestamp", timestamp)
-        .add("Message-Type", messageType)
-        .toString();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailParsingException.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailParsingException.java
deleted file mode 100644
index b91bb18..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailParsingException.java
+++ /dev/null
@@ -1,28 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.receive;
-
-/** An {@link Exception} indicating that an email could not be parsed. */
-public class MailParsingException extends Exception {
-  private static final long serialVersionUID = 1L;
-
-  public MailParsingException(String msg) {
-    super(msg);
-  }
-
-  public MailParsingException(String msg, Throwable cause) {
-    super(msg, cause);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailProcessor.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailProcessor.java
deleted file mode 100644
index ff09f53..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailProcessor.java
+++ /dev/null
@@ -1,405 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.receive;
-
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.client.Side;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.PatchLineComment.Status;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.CommentsUtil;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.Emails;
-import com.google.gerrit.server.change.EmailReviewComments;
-import com.google.gerrit.server.config.CanonicalWebUrl;
-import com.google.gerrit.server.extensions.events.CommentAdded;
-import com.google.gerrit.server.mail.MailFilter;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.patch.PatchListCache;
-import com.google.gerrit.server.patch.PatchListNotAvailableException;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.InternalChangeQuery;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.Context;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gerrit.server.util.ManualRequestContext;
-import com.google.gerrit.server.util.OneOffRequestContext;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** A service that can attach the comments from a {@link MailMessage} to a change. */
-@Singleton
-public class MailProcessor {
-  private static final Logger log = LoggerFactory.getLogger(MailProcessor.class);
-
-  private final Emails emails;
-  private final RetryHelper retryHelper;
-  private final ChangeMessagesUtil changeMessagesUtil;
-  private final CommentsUtil commentsUtil;
-  private final OneOffRequestContext oneOffRequestContext;
-  private final PatchListCache patchListCache;
-  private final PatchSetUtil psUtil;
-  private final Provider<InternalChangeQuery> queryProvider;
-  private final DynamicMap<MailFilter> mailFilters;
-  private final EmailReviewComments.Factory outgoingMailFactory;
-  private final CommentAdded commentAdded;
-  private final ApprovalsUtil approvalsUtil;
-  private final AccountCache accountCache;
-  private final Provider<String> canonicalUrl;
-
-  @Inject
-  public MailProcessor(
-      Emails emails,
-      RetryHelper retryHelper,
-      ChangeMessagesUtil changeMessagesUtil,
-      CommentsUtil commentsUtil,
-      OneOffRequestContext oneOffRequestContext,
-      PatchListCache patchListCache,
-      PatchSetUtil psUtil,
-      Provider<InternalChangeQuery> queryProvider,
-      DynamicMap<MailFilter> mailFilters,
-      EmailReviewComments.Factory outgoingMailFactory,
-      ApprovalsUtil approvalsUtil,
-      CommentAdded commentAdded,
-      AccountCache accountCache,
-      @CanonicalWebUrl Provider<String> canonicalUrl) {
-    this.emails = emails;
-    this.retryHelper = retryHelper;
-    this.changeMessagesUtil = changeMessagesUtil;
-    this.commentsUtil = commentsUtil;
-    this.oneOffRequestContext = oneOffRequestContext;
-    this.patchListCache = patchListCache;
-    this.psUtil = psUtil;
-    this.queryProvider = queryProvider;
-    this.mailFilters = mailFilters;
-    this.outgoingMailFactory = outgoingMailFactory;
-    this.commentAdded = commentAdded;
-    this.approvalsUtil = approvalsUtil;
-    this.accountCache = accountCache;
-    this.canonicalUrl = canonicalUrl;
-  }
-
-  /**
-   * Parses comments from a {@link MailMessage} and persists them on the change.
-   *
-   * @param message {@link MailMessage} to process
-   */
-  public void process(MailMessage message) throws RestApiException, UpdateException {
-    retryHelper.execute(
-        buf -> {
-          processImpl(buf, message);
-          return null;
-        });
-  }
-
-  private void processImpl(BatchUpdate.Factory buf, MailMessage message)
-      throws OrmException, UpdateException, RestApiException, IOException {
-    for (DynamicMap.Entry<MailFilter> filter : mailFilters) {
-      if (!filter.getProvider().get().shouldProcessMessage(message)) {
-        log.warn(
-            "Message {} filtered by plugin {} {}. Will delete message.",
-            message.id(),
-            filter.getPluginName(),
-            filter.getExportName());
-        return;
-      }
-    }
-
-    MailMetadata metadata = MetadataParser.parse(message);
-    if (!metadata.hasRequiredFields()) {
-      log.error(
-          "Message {} is missing required metadata, have {}. Will delete message.",
-          message.id(),
-          metadata);
-      return;
-    }
-
-    Set<Account.Id> accountIds = emails.getAccountFor(metadata.author);
-    if (accountIds.size() != 1) {
-      log.error(
-          "Address {} could not be matched to a unique account. It was matched to {}."
-              + " Will delete message.",
-          metadata.author,
-          accountIds);
-      return;
-    }
-    Account.Id account = accountIds.iterator().next();
-    if (!accountCache.get(account).getAccount().isActive()) {
-      log.warn("Mail: Account {} is inactive. Will delete message.", account);
-      return;
-    }
-
-    persistComments(buf, message, metadata, account);
-  }
-
-  private void persistComments(
-      BatchUpdate.Factory buf, MailMessage message, MailMetadata metadata, Account.Id sender)
-      throws OrmException, UpdateException, RestApiException {
-    try (ManualRequestContext ctx = oneOffRequestContext.openAs(sender)) {
-      List<ChangeData> changeDataList =
-          queryProvider.get().byLegacyChangeId(new Change.Id(metadata.changeNumber));
-      if (changeDataList.size() != 1) {
-        log.error(
-            "Message {} references unique change {}, but there are {} matching changes in "
-                + "the index. Will delete message.",
-            message.id(),
-            metadata.changeNumber,
-            changeDataList.size());
-        return;
-      }
-      ChangeData cd = changeDataList.get(0);
-      if (existingMessageIds(cd).contains(message.id())) {
-        log.info("Message {} was already processed. Will delete message.", message.id());
-        return;
-      }
-      // Get all comments; filter and sort them to get the original list of
-      // comments from the outbound email.
-      // TODO(hiesel) Also filter by original comment author.
-      Collection<Comment> comments =
-          cd.publishedComments().stream()
-              .filter(c -> (c.writtenOn.getTime() / 1000) == (metadata.timestamp.getTime() / 1000))
-              .sorted(CommentsUtil.COMMENT_ORDER)
-              .collect(toList());
-      Project.NameKey project = cd.project();
-      String changeUrl = canonicalUrl.get() + "#/c/" + cd.getId().get();
-
-      List<MailComment> parsedComments;
-      if (useHtmlParser(message)) {
-        parsedComments = HtmlParser.parse(message, comments, changeUrl);
-      } else {
-        parsedComments = TextParser.parse(message, comments, changeUrl);
-      }
-
-      if (parsedComments.isEmpty()) {
-        log.warn("Could not parse any comments from {}. Will delete message.", message.id());
-        return;
-      }
-
-      Op o = new Op(new PatchSet.Id(cd.getId(), metadata.patchSet), parsedComments, message.id());
-      BatchUpdate batchUpdate = buf.create(cd.db(), project, ctx.getUser(), TimeUtil.nowTs());
-      batchUpdate.addOp(cd.getId(), o);
-      batchUpdate.execute();
-    }
-  }
-
-  private class Op implements BatchUpdateOp {
-    private final PatchSet.Id psId;
-    private final List<MailComment> parsedComments;
-    private final String tag;
-    private ChangeMessage changeMessage;
-    private List<Comment> comments;
-    private PatchSet patchSet;
-    private ChangeNotes notes;
-
-    private Op(PatchSet.Id psId, List<MailComment> parsedComments, String messageId) {
-      this.psId = psId;
-      this.parsedComments = parsedComments;
-      this.tag = "mailMessageId=" + messageId;
-    }
-
-    @Override
-    public boolean updateChange(ChangeContext ctx)
-        throws OrmException, UnprocessableEntityException, PatchListNotAvailableException {
-      patchSet = psUtil.get(ctx.getDb(), ctx.getNotes(), psId);
-      notes = ctx.getNotes();
-      if (patchSet == null) {
-        throw new OrmException("patch set not found: " + psId);
-      }
-
-      changeMessage = generateChangeMessage(ctx);
-      changeMessagesUtil.addChangeMessage(ctx.getDb(), ctx.getUpdate(psId), changeMessage);
-
-      comments = new ArrayList<>();
-      for (MailComment c : parsedComments) {
-        if (c.type == MailComment.CommentType.CHANGE_MESSAGE) {
-          continue;
-        }
-        comments.add(
-            persistentCommentFromMailComment(ctx, c, targetPatchSetForComment(ctx, c, patchSet)));
-      }
-      commentsUtil.putComments(
-          ctx.getDb(),
-          ctx.getUpdate(ctx.getChange().currentPatchSetId()),
-          Status.PUBLISHED,
-          comments);
-
-      return true;
-    }
-
-    @Override
-    public void postUpdate(Context ctx) throws Exception {
-      String patchSetComment = null;
-      if (parsedComments.get(0).type == MailComment.CommentType.CHANGE_MESSAGE) {
-        patchSetComment = parsedComments.get(0).message;
-      }
-      // Send email notifications
-      outgoingMailFactory
-          .create(
-              NotifyHandling.ALL,
-              ArrayListMultimap.create(),
-              notes,
-              patchSet,
-              ctx.getUser().asIdentifiedUser(),
-              changeMessage,
-              comments,
-              patchSetComment,
-              ImmutableList.of())
-          .sendAsync();
-      // Get previous approvals from this user
-      Map<String, Short> approvals = new HashMap<>();
-      approvalsUtil
-          .byPatchSetUser(
-              ctx.getDb(),
-              notes,
-              ctx.getUser(),
-              psId,
-              ctx.getAccountId(),
-              ctx.getRevWalk(),
-              ctx.getRepoView().getConfig())
-          .forEach(a -> approvals.put(a.getLabel(), a.getValue()));
-      // Fire Gerrit event. Note that approvals can't be granted via email, so old and new approvals
-      // are always the same here.
-      commentAdded.fire(
-          notes.getChange(),
-          patchSet,
-          ctx.getAccount(),
-          changeMessage.getMessage(),
-          approvals,
-          approvals,
-          ctx.getWhen());
-    }
-
-    private ChangeMessage generateChangeMessage(ChangeContext ctx) {
-      String changeMsg = "Patch Set " + psId.get() + ":";
-      if (parsedComments.get(0).type == MailComment.CommentType.CHANGE_MESSAGE) {
-        // Add a blank line after Patch Set to follow the default format
-        if (parsedComments.size() > 1) {
-          changeMsg += "\n\n" + numComments(parsedComments.size() - 1);
-        }
-        changeMsg += "\n\n" + parsedComments.get(0).message;
-      } else {
-        changeMsg += "\n\n" + numComments(parsedComments.size());
-      }
-      return ChangeMessagesUtil.newMessage(ctx, changeMsg, tag);
-    }
-
-    private PatchSet targetPatchSetForComment(
-        ChangeContext ctx, MailComment mailComment, PatchSet current) throws OrmException {
-      if (mailComment.inReplyTo != null) {
-        return psUtil.get(
-            ctx.getDb(),
-            ctx.getNotes(),
-            new PatchSet.Id(ctx.getChange().getId(), mailComment.inReplyTo.key.patchSetId));
-      }
-      return current;
-    }
-
-    private Comment persistentCommentFromMailComment(
-        ChangeContext ctx, MailComment mailComment, PatchSet patchSetForComment)
-        throws OrmException, UnprocessableEntityException, PatchListNotAvailableException {
-      String fileName;
-      // The patch set that this comment is based on is different if this
-      // comment was sent in reply to a comment on a previous patch set.
-      Side side;
-      if (mailComment.inReplyTo != null) {
-        fileName = mailComment.inReplyTo.key.filename;
-        side = Side.fromShort(mailComment.inReplyTo.side);
-      } else {
-        fileName = mailComment.fileName;
-        side = Side.REVISION;
-      }
-
-      Comment comment =
-          commentsUtil.newComment(
-              ctx,
-              fileName,
-              patchSetForComment.getId(),
-              (short) side.ordinal(),
-              mailComment.message,
-              false,
-              null);
-
-      comment.tag = tag;
-      if (mailComment.inReplyTo != null) {
-        comment.parentUuid = mailComment.inReplyTo.key.uuid;
-        comment.lineNbr = mailComment.inReplyTo.lineNbr;
-        comment.range = mailComment.inReplyTo.range;
-        comment.unresolved = mailComment.inReplyTo.unresolved;
-      }
-      CommentsUtil.setCommentRevId(comment, patchListCache, ctx.getChange(), patchSetForComment);
-      return comment;
-    }
-  }
-
-  private static boolean useHtmlParser(MailMessage m) {
-    return !Strings.isNullOrEmpty(m.htmlContent());
-  }
-
-  private static String numComments(int numComments) {
-    return "(" + numComments + (numComments > 1 ? " comments)" : " comment)");
-  }
-
-  private Set<String> existingMessageIds(ChangeData cd) throws OrmException {
-    Set<String> existingMessageIds = new HashSet<>();
-    cd.messages().stream()
-        .forEach(
-            m -> {
-              String messageId = CommentsUtil.extractMessageId(m.getTag());
-              if (messageId != null) {
-                existingMessageIds.add(messageId);
-              }
-            });
-    cd.publishedComments().stream()
-        .forEach(
-            c -> {
-              String messageId = CommentsUtil.extractMessageId(c.tag);
-              if (messageId != null) {
-                existingMessageIds.add(messageId);
-              }
-            });
-    return existingMessageIds;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailReceiver.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailReceiver.java
deleted file mode 100644
index 6deb240..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailReceiver.java
+++ /dev/null
@@ -1,158 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.receive;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.lifecycle.LifecycleModule;
-import com.google.gerrit.server.git.WorkQueue;
-import com.google.gerrit.server.mail.EmailSettings;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.Timer;
-import java.util.TimerTask;
-import java.util.concurrent.Future;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** MailReceiver implements base functionality for receiving emails. */
-public abstract class MailReceiver implements LifecycleListener {
-  private static final Logger log = LoggerFactory.getLogger(MailReceiver.class);
-
-  protected EmailSettings mailSettings;
-  protected Set<String> pendingDeletion;
-  private MailProcessor mailProcessor;
-  private WorkQueue workQueue;
-  private Timer timer;
-
-  public static class Module extends LifecycleModule {
-    private final EmailSettings mailSettings;
-
-    @Inject
-    Module(EmailSettings mailSettings) {
-      this.mailSettings = mailSettings;
-    }
-
-    @Override
-    protected void configure() {
-      if (mailSettings.protocol == Protocol.NONE) {
-        return;
-      }
-      listener().to(MailReceiver.class);
-      switch (mailSettings.protocol) {
-        case IMAP:
-          bind(MailReceiver.class).to(ImapMailReceiver.class);
-          break;
-        case POP3:
-          bind(MailReceiver.class).to(Pop3MailReceiver.class);
-          break;
-        case NONE:
-        default:
-      }
-    }
-  }
-
-  MailReceiver(EmailSettings mailSettings, MailProcessor mailProcessor, WorkQueue workQueue) {
-    this.mailSettings = mailSettings;
-    this.mailProcessor = mailProcessor;
-    this.workQueue = workQueue;
-    pendingDeletion = Collections.synchronizedSet(new HashSet<>());
-  }
-
-  @Override
-  public void start() {
-    if (timer == null) {
-      timer = new Timer();
-    } else {
-      timer.cancel();
-    }
-    timer.scheduleAtFixedRate(
-        new TimerTask() {
-          @Override
-          public void run() {
-            try {
-              MailReceiver.this.handleEmails(true);
-            } catch (MailTransferException | IOException e) {
-              log.error("Error while fetching emails", e);
-            }
-          }
-        },
-        0L,
-        mailSettings.fetchInterval);
-  }
-
-  @Override
-  public void stop() {
-    if (timer != null) {
-      timer.cancel();
-    }
-  }
-
-  /**
-   * requestDeletion will enqueue an email for deletion and delete it the next time we connect to
-   * the email server. This does not guarantee deletion as the Gerrit instance might fail before we
-   * connect to the email server.
-   *
-   * @param messageId
-   */
-  public void requestDeletion(String messageId) {
-    pendingDeletion.add(messageId);
-  }
-
-  /**
-   * handleEmails will open a connection to the mail server, remove emails where deletion is
-   * pending, read new email and close the connection.
-   *
-   * @param async determines if processing messages should happen asynchronously
-   * @throws MailTransferException in case of a known transport failure
-   * @throws IOException in case of a low-level transport failure
-   */
-  @VisibleForTesting
-  public abstract void handleEmails(boolean async) throws MailTransferException, IOException;
-
-  protected void dispatchMailProcessor(List<MailMessage> messages, boolean async) {
-    for (MailMessage m : messages) {
-      if (async) {
-        @SuppressWarnings("unused")
-        Future<?> possiblyIgnoredError =
-            workQueue
-                .getDefaultQueue()
-                .submit(
-                    () -> {
-                      try {
-                        mailProcessor.process(m);
-                        requestDeletion(m.id());
-                      } catch (RestApiException | UpdateException e) {
-                        log.error("Mail: Can't process message " + m.id() + " . Won't delete.", e);
-                      }
-                    });
-      } else {
-        // Synchronous processing is used only in tests.
-        try {
-          mailProcessor.process(m);
-          requestDeletion(m.id());
-        } catch (RestApiException | UpdateException e) {
-          log.error("Mail: Can't process messages. Won't delete.", e);
-        }
-      }
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MetadataParser.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MetadataParser.java
deleted file mode 100644
index 7085051..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MetadataParser.java
+++ /dev/null
@@ -1,110 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.receive;
-
-import static com.google.gerrit.server.mail.MetadataName.toFooterWithDelimiter;
-import static com.google.gerrit.server.mail.MetadataName.toHeaderWithDelimiter;
-
-import com.google.common.base.Strings;
-import com.google.common.primitives.Ints;
-import com.google.gerrit.server.mail.MailUtil;
-import com.google.gerrit.server.mail.MetadataName;
-import java.sql.Timestamp;
-import java.time.Instant;
-import java.time.format.DateTimeParseException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Parse metadata from inbound email */
-public class MetadataParser {
-  private static final Logger log = LoggerFactory.getLogger(MailProcessor.class);
-
-  public static MailMetadata parse(MailMessage m) {
-    MailMetadata metadata = new MailMetadata();
-    // Find author
-    metadata.author = m.from().getEmail();
-
-    // Check email headers for X-Gerrit-<Name>
-    for (String header : m.additionalHeaders()) {
-      if (header.startsWith(toHeaderWithDelimiter(MetadataName.CHANGE_NUMBER))) {
-        String num = header.substring(toHeaderWithDelimiter(MetadataName.CHANGE_NUMBER).length());
-        metadata.changeNumber = Ints.tryParse(num);
-      } else if (header.startsWith(toHeaderWithDelimiter(MetadataName.PATCH_SET))) {
-        String ps = header.substring(toHeaderWithDelimiter(MetadataName.PATCH_SET).length());
-        metadata.patchSet = Ints.tryParse(ps);
-      } else if (header.startsWith(toHeaderWithDelimiter(MetadataName.TIMESTAMP))) {
-        String ts = header.substring(toHeaderWithDelimiter(MetadataName.TIMESTAMP).length()).trim();
-        try {
-          metadata.timestamp = Timestamp.from(MailUtil.rfcDateformatter.parse(ts, Instant::from));
-        } catch (DateTimeParseException e) {
-          log.error("Mail: Error while parsing timestamp from header of message " + m.id(), e);
-        }
-      } else if (header.startsWith(toHeaderWithDelimiter(MetadataName.MESSAGE_TYPE))) {
-        metadata.messageType =
-            header.substring(toHeaderWithDelimiter(MetadataName.MESSAGE_TYPE).length());
-      }
-    }
-    if (metadata.hasRequiredFields()) {
-      return metadata;
-    }
-
-    // If the required fields were not yet found, continue to parse the text
-    if (!Strings.isNullOrEmpty(m.textContent())) {
-      String[] lines = m.textContent().replace("\r\n", "\n").split("\n");
-      extractFooters(lines, metadata, m);
-      if (metadata.hasRequiredFields()) {
-        return metadata;
-      }
-    }
-
-    // If the required fields were not yet found, continue to parse the HTML
-    // HTML footer are contained inside a <div> tag
-    if (!Strings.isNullOrEmpty(m.htmlContent())) {
-      String[] lines = m.htmlContent().replace("\r\n", "\n").split("</div>");
-      extractFooters(lines, metadata, m);
-      if (metadata.hasRequiredFields()) {
-        return metadata;
-      }
-    }
-
-    return metadata;
-  }
-
-  private static void extractFooters(String[] lines, MailMetadata metadata, MailMessage m) {
-    for (String line : lines) {
-      if (metadata.changeNumber == null && line.contains(MetadataName.CHANGE_NUMBER)) {
-        metadata.changeNumber =
-            Ints.tryParse(extractFooter(toFooterWithDelimiter(MetadataName.CHANGE_NUMBER), line));
-      } else if (metadata.patchSet == null && line.contains(MetadataName.PATCH_SET)) {
-        metadata.patchSet =
-            Ints.tryParse(extractFooter(toFooterWithDelimiter(MetadataName.PATCH_SET), line));
-      } else if (metadata.timestamp == null && line.contains(MetadataName.TIMESTAMP)) {
-        String ts = extractFooter(toFooterWithDelimiter(MetadataName.TIMESTAMP), line);
-        try {
-          metadata.timestamp = Timestamp.from(MailUtil.rfcDateformatter.parse(ts, Instant::from));
-        } catch (DateTimeParseException e) {
-          log.error("Mail: Error while parsing timestamp from footer of message " + m.id(), e);
-        }
-      } else if (metadata.messageType == null && line.contains(MetadataName.MESSAGE_TYPE)) {
-        metadata.messageType =
-            extractFooter(toFooterWithDelimiter(MetadataName.MESSAGE_TYPE), line);
-      }
-    }
-  }
-
-  private static String extractFooter(String key, String line) {
-    return line.substring(line.indexOf(key) + key.length(), line.length()).trim();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/ParserUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/ParserUtil.java
deleted file mode 100644
index 5e3c0ed..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/ParserUtil.java
+++ /dev/null
@@ -1,132 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.receive;
-
-import com.google.common.collect.Iterables;
-import com.google.gerrit.reviewdb.client.Comment;
-import java.util.List;
-import java.util.StringJoiner;
-import java.util.regex.Pattern;
-
-public class ParserUtil {
-  private static final Pattern SIMPLE_EMAIL_PATTERN =
-      Pattern.compile(
-          "[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+"
-              + "(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})");
-
-  private ParserUtil() {}
-
-  /**
-   * Trims the quotation that email clients add Example: On Sun, Nov 20, 2016 at 10:33 PM,
-   * <gerrit@gerritcodereview.com> wrote:
-   *
-   * @param comment Comment parsed from an email.
-   * @return Trimmed comment.
-   */
-  public static String trimQuotation(String comment) {
-    StringJoiner j = new StringJoiner("\n");
-    String[] lines = comment.split("\n");
-    for (int i = 0; i < lines.length - 2; i++) {
-      j.add(lines[i]);
-    }
-
-    // Check if the last line contains the full quotation pattern (date + email)
-    String lastLine = lines[lines.length - 1];
-    if (containsQuotationPattern(lastLine)) {
-      if (lines.length > 1) {
-        j.add(lines[lines.length - 2]);
-      }
-      return j.toString().trim();
-    }
-
-    // Check if the second last line + the last line contain the full quotation pattern. This is
-    // necessary, as the quotation line can be split across the last two lines if it gets too long.
-    if (lines.length > 1) {
-      String lastLines = lines[lines.length - 2] + lastLine;
-      if (containsQuotationPattern(lastLines)) {
-        return j.toString().trim();
-      }
-    }
-
-    // Add the last two lines
-    if (lines.length > 1) {
-      j.add(lines[lines.length - 2]);
-    }
-    j.add(lines[lines.length - 1]);
-
-    return j.toString().trim();
-  }
-
-  /** Check if string is an inline comment url on a patch set or the base */
-  public static boolean isCommentUrl(String str, String changeUrl, Comment comment) {
-    int lineNbr = comment.range == null ? comment.lineNbr : comment.range.startLine;
-    return str.equals(filePath(changeUrl, comment) + "@" + lineNbr)
-        || str.equals(filePath(changeUrl, comment) + "@a" + lineNbr);
-  }
-
-  /** Generate the fully qualified filepath */
-  public static String filePath(String changeUrl, Comment comment) {
-    return changeUrl + "/" + comment.key.patchSetId + "/" + comment.key.filename;
-  }
-
-  /**
-   * When parsing mail content, we need to append comments prematurely since we are parsing
-   * block-by-block and never know what comes next. This can result in a comment being parsed as two
-   * comments when it spans multiple blocks. This method takes care of merging those blocks or
-   * adding a new comment to the list of appropriate.
-   */
-  public static void appendOrAddNewComment(MailComment comment, List<MailComment> comments) {
-    if (comments.isEmpty()) {
-      comments.add(comment);
-      return;
-    }
-    MailComment lastComment = Iterables.getLast(comments);
-
-    if (comment.isSameCommentPath(lastComment)) {
-      // Merge the two comments
-      lastComment.message += "\n\n" + comment.message;
-      return;
-    }
-
-    comments.add(comment);
-  }
-
-  private static boolean containsQuotationPattern(String s) {
-    // Identifying the quotation line is hard, as it can be in any language.
-    // We identify this line by it's characteristics: It usually contains a
-    // valid email address, some digits for the date in groups of 1-4 in a row
-    // as well as some characters.
-
-    // Count occurrences of digit groups
-    int numConsecutiveDigits = 0;
-    int maxConsecutiveDigits = 0;
-    int numDigitGroups = 0;
-    for (char c : s.toCharArray()) {
-      if (c >= '0' && c <= '9') {
-        numConsecutiveDigits++;
-      } else if (numConsecutiveDigits > 0) {
-        maxConsecutiveDigits = Integer.max(maxConsecutiveDigits, numConsecutiveDigits);
-        numConsecutiveDigits = 0;
-        numDigitGroups++;
-      }
-    }
-    if (numDigitGroups < 4 || maxConsecutiveDigits > 4) {
-      return false;
-    }
-
-    // Check if the string contains an email address
-    return SIMPLE_EMAIL_PATTERN.matcher(s).find();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/Pop3MailReceiver.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/Pop3MailReceiver.java
deleted file mode 100644
index bbb7e66..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/Pop3MailReceiver.java
+++ /dev/null
@@ -1,123 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.receive;
-
-import com.google.common.primitives.Ints;
-import com.google.gerrit.server.git.WorkQueue;
-import com.google.gerrit.server.mail.EmailSettings;
-import com.google.gerrit.server.mail.Encryption;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.commons.net.pop3.POP3Client;
-import org.apache.commons.net.pop3.POP3MessageInfo;
-import org.apache.commons.net.pop3.POP3SClient;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** An implementation of {@link MailReceiver} for POP3. */
-@Singleton
-public class Pop3MailReceiver extends MailReceiver {
-  private static final Logger log = LoggerFactory.getLogger(Pop3MailReceiver.class);
-
-  @Inject
-  Pop3MailReceiver(EmailSettings mailSettings, MailProcessor mailProcessor, WorkQueue workQueue) {
-    super(mailSettings, mailProcessor, workQueue);
-  }
-
-  /**
-   * Opens a connection to the mail server, removes emails where deletion is pending, reads new
-   * email and closes the connection.
-   *
-   * @param async determines if processing messages should happen asynchronously
-   * @throws MailTransferException in case of a known transport failure
-   * @throws IOException in case of a low-level transport failure
-   */
-  @Override
-  public synchronized void handleEmails(boolean async) throws MailTransferException, IOException {
-    POP3Client pop3;
-    if (mailSettings.encryption != Encryption.NONE) {
-      pop3 = new POP3SClient(mailSettings.encryption.name(), true);
-    } else {
-      pop3 = new POP3Client();
-    }
-    if (mailSettings.port > 0) {
-      pop3.setDefaultPort(mailSettings.port);
-    }
-    pop3.connect(mailSettings.host);
-    try {
-      if (!pop3.login(mailSettings.username, mailSettings.password)) {
-        throw new MailTransferException(
-            "Could not login to POP3 email server. Check username and password");
-      }
-      try {
-        POP3MessageInfo[] messages = pop3.listMessages();
-        if (messages == null) {
-          throw new MailTransferException("Could not retrieve message list via POP3");
-        }
-        log.info("Received " + messages.length + " messages via POP3");
-        // Fetch messages
-        List<MailMessage> mailMessages = new ArrayList<>();
-        for (POP3MessageInfo msginfo : messages) {
-          if (msginfo == null) {
-            // Message was deleted
-            continue;
-          }
-          try (BufferedReader reader = (BufferedReader) pop3.retrieveMessage(msginfo.number)) {
-            if (reader == null) {
-              throw new MailTransferException(
-                  "Could not retrieve POP3 message header for message " + msginfo.identifier);
-            }
-            int[] message = fetchMessage(reader);
-            MailMessage mailMessage = RawMailParser.parse(message);
-            // Delete messages where deletion is pending. This requires
-            // knowing the integer message ID of the email. We therefore parse
-            // the message first and extract the Message-ID specified in RFC
-            // 822 and delete the message if deletion is pending.
-            if (pendingDeletion.contains(mailMessage.id())) {
-              if (pop3.deleteMessage(msginfo.number)) {
-                pendingDeletion.remove(mailMessage.id());
-              } else {
-                log.error("Could not delete message " + msginfo.number);
-              }
-            } else {
-              // Process message further
-              mailMessages.add(mailMessage);
-            }
-          } catch (MailParsingException e) {
-            log.error("Could not parse message " + msginfo.number);
-          }
-        }
-        dispatchMailProcessor(mailMessages, async);
-      } finally {
-        pop3.logout();
-      }
-    } finally {
-      pop3.disconnect();
-    }
-  }
-
-  public final int[] fetchMessage(BufferedReader reader) throws IOException {
-    List<Integer> character = new ArrayList<>();
-    int ch;
-    while ((ch = reader.read()) != -1) {
-      character.add(ch);
-    }
-    return Ints.toArray(character);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/RawMailParser.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/RawMailParser.java
deleted file mode 100644
index 2c5449d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/RawMailParser.java
+++ /dev/null
@@ -1,174 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.receive;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.io.CharStreams;
-import com.google.common.primitives.Ints;
-import com.google.gerrit.server.mail.Address;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import org.apache.james.mime4j.MimeException;
-import org.apache.james.mime4j.dom.Entity;
-import org.apache.james.mime4j.dom.Message;
-import org.apache.james.mime4j.dom.MessageBuilder;
-import org.apache.james.mime4j.dom.Multipart;
-import org.apache.james.mime4j.dom.TextBody;
-import org.apache.james.mime4j.dom.address.Mailbox;
-import org.apache.james.mime4j.message.DefaultMessageBuilder;
-import org.joda.time.DateTime;
-
-/** Parses raw email content received through POP3 or IMAP into an internal {@link MailMessage}. */
-public class RawMailParser {
-  private static final ImmutableSet<String> MAIN_HEADERS =
-      ImmutableSet.of("to", "from", "cc", "date", "message-id", "subject", "content-type");
-
-  private RawMailParser() {}
-
-  /**
-   * Parses a MailMessage from a string.
-   *
-   * @param raw {@link String} payload as received over the wire
-   * @return parsed {@link MailMessage}
-   * @throws MailParsingException in case parsing fails
-   */
-  public static MailMessage parse(String raw) throws MailParsingException {
-    MailMessage.Builder messageBuilder = MailMessage.builder();
-    messageBuilder.rawContentUTF(raw);
-    Message mimeMessage;
-    try {
-      MessageBuilder builder = new DefaultMessageBuilder();
-      mimeMessage = builder.parseMessage(new ByteArrayInputStream(raw.getBytes(UTF_8)));
-    } catch (IOException | MimeException e) {
-      throw new MailParsingException("Can't parse email", e);
-    }
-    // Add general headers
-    if (mimeMessage.getMessageId() != null) {
-      messageBuilder.id(mimeMessage.getMessageId());
-    }
-    if (mimeMessage.getSubject() != null) {
-      messageBuilder.subject(mimeMessage.getSubject());
-    }
-    messageBuilder.dateReceived(new DateTime(mimeMessage.getDate()));
-
-    // Add From, To and Cc
-    if (mimeMessage.getFrom() != null && mimeMessage.getFrom().size() > 0) {
-      Mailbox from = mimeMessage.getFrom().get(0);
-      messageBuilder.from(new Address(from.getName(), from.getAddress()));
-    }
-    if (mimeMessage.getTo() != null) {
-      for (Mailbox m : mimeMessage.getTo().flatten()) {
-        messageBuilder.addTo(new Address(m.getName(), m.getAddress()));
-      }
-    }
-    if (mimeMessage.getCc() != null) {
-      for (Mailbox m : mimeMessage.getCc().flatten()) {
-        messageBuilder.addCc(new Address(m.getName(), m.getAddress()));
-      }
-    }
-
-    // Add additional headers
-    mimeMessage.getHeader().getFields().stream()
-        .filter(f -> !MAIN_HEADERS.contains(f.getName().toLowerCase()))
-        .forEach(f -> messageBuilder.addAdditionalHeader(f.getName() + ": " + f.getBody()));
-
-    // Add text and html body parts
-    StringBuilder textBuilder = new StringBuilder();
-    StringBuilder htmlBuilder = new StringBuilder();
-    try {
-      handleMimePart(mimeMessage, textBuilder, htmlBuilder);
-    } catch (IOException e) {
-      throw new MailParsingException("Can't parse email", e);
-    }
-    messageBuilder.textContent(Strings.emptyToNull(textBuilder.toString()));
-    messageBuilder.htmlContent(Strings.emptyToNull(htmlBuilder.toString()));
-
-    try {
-      // build() will only succeed if all required attributes were set. We wrap
-      // the IllegalStateException in a MailParsingException indicating that
-      // required attributes are missing, so that the caller doesn't fall over.
-      return messageBuilder.build();
-    } catch (IllegalStateException e) {
-      throw new MailParsingException("Missing required attributes after email was parsed", e);
-    }
-  }
-
-  /**
-   * Parses a MailMessage from an array of characters. Note that the character array is int-typed.
-   * This method is only used by POP3, which specifies that all transferred characters are US-ASCII
-   * (RFC 6856). When reading the input in Java, io.Reader yields ints. These can be safely
-   * converted to chars as all US-ASCII characters fit in a char. If emails contain non-ASCII
-   * characters, such as UTF runes, these will be encoded in ASCII using either Base64 or
-   * quoted-printable encoding.
-   *
-   * @param chars Array as received over the wire
-   * @return Parsed {@link MailMessage}
-   * @throws MailParsingException in case parsing fails
-   */
-  public static MailMessage parse(int[] chars) throws MailParsingException {
-    StringBuilder b = new StringBuilder(chars.length);
-    for (int c : chars) {
-      b.append((char) c);
-    }
-
-    MailMessage.Builder messageBuilder = parse(b.toString()).toBuilder();
-    messageBuilder.rawContent(ImmutableList.copyOf(Ints.asList(chars)));
-    return messageBuilder.build();
-  }
-
-  /**
-   * Traverses a mime tree and parses out text and html parts. All other parts will be dropped.
-   *
-   * @param part {@code MimePart} to parse
-   * @param textBuilder {@link StringBuilder} to append all plaintext parts
-   * @param htmlBuilder {@link StringBuilder} to append all html parts
-   * @throws IOException in case of a failure while transforming the input to a {@link String}
-   */
-  private static void handleMimePart(
-      Entity part, StringBuilder textBuilder, StringBuilder htmlBuilder) throws IOException {
-    if (isPlainOrHtml(part.getMimeType()) && !isAttachment(part.getDispositionType())) {
-      TextBody tb = (TextBody) part.getBody();
-      String result =
-          CharStreams.toString(new InputStreamReader(tb.getInputStream(), tb.getMimeCharset()));
-      if (part.getMimeType().equals("text/plain")) {
-        textBuilder.append(result);
-      } else if (part.getMimeType().equals("text/html")) {
-        htmlBuilder.append(result);
-      }
-    } else if (isMultipart(part.getMimeType())) {
-      Multipart multipart = (Multipart) part.getBody();
-      for (Entity e : multipart.getBodyParts()) {
-        handleMimePart(e, textBuilder, htmlBuilder);
-      }
-    }
-  }
-
-  private static boolean isPlainOrHtml(String mimeType) {
-    return (mimeType.equals("text/plain") || mimeType.equals("text/html"));
-  }
-
-  private static boolean isMultipart(String mimeType) {
-    return mimeType.startsWith("multipart/");
-  }
-
-  private static boolean isAttachment(String dispositionType) {
-    return dispositionType != null && dispositionType.equals("attachment");
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/TextParser.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/TextParser.java
deleted file mode 100644
index 80443ba..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/TextParser.java
+++ /dev/null
@@ -1,147 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.receive;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.Iterators;
-import com.google.common.collect.PeekingIterator;
-import com.google.gerrit.reviewdb.client.Comment;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/** Provides parsing functionality for plaintext email. */
-public class TextParser {
-  private TextParser() {}
-
-  /**
-   * Parses comments from plaintext email.
-   *
-   * @param email @param email the message as received from the email service
-   * @param comments list of {@link Comment}s previously persisted on the change that caused the
-   *     original notification email to be sent out. Ordering must be the same as in the outbound
-   *     email
-   * @param changeUrl canonical change url that points to the change on this Gerrit instance.
-   *     Example: https://go-review.googlesource.com/#/c/91570
-   * @return list of MailComments parsed from the plaintext part of the email
-   */
-  public static List<MailComment> parse(
-      MailMessage email, Collection<Comment> comments, String changeUrl) {
-    String body = email.textContent();
-    // Replace CR-LF by \n
-    body = body.replace("\r\n", "\n");
-
-    List<MailComment> parsedComments = new ArrayList<>();
-
-    // Some email clients (like GMail) use >> for enquoting text when there are
-    // inline comments that the users typed. These will then be enquoted by a
-    // single >. We sanitize this by unifying it into >. Inline comments typed
-    // by the user will not be enquoted.
-    //
-    // Example:
-    // Some comment
-    // >> Quoted Text
-    // >> Quoted Text
-    // > A comment typed in the email directly
-    String singleQuotePattern = "\n> ";
-    String doubleQuotePattern = "\n>> ";
-    if (countOccurrences(body, doubleQuotePattern) > countOccurrences(body, singleQuotePattern)) {
-      body = body.replace(doubleQuotePattern, singleQuotePattern);
-    }
-
-    PeekingIterator<Comment> iter = Iterators.peekingIterator(comments.iterator());
-
-    String[] lines = body.split("\n");
-    MailComment currentComment = null;
-    String lastEncounteredFileName = null;
-    Comment lastEncounteredComment = null;
-    for (String line : lines) {
-      if (line.equals(">")) {
-        // Skip empty lines
-        continue;
-      }
-      if (line.startsWith("> ")) {
-        line = line.substring("> ".length()).trim();
-        // This is not a comment, try to advance the file/comment pointers and
-        // add previous comment to list if applicable
-        if (currentComment != null) {
-          if (currentComment.type == MailComment.CommentType.CHANGE_MESSAGE) {
-            currentComment.message = ParserUtil.trimQuotation(currentComment.message);
-          }
-          if (!Strings.isNullOrEmpty(currentComment.message)) {
-            ParserUtil.appendOrAddNewComment(currentComment, parsedComments);
-          }
-          currentComment = null;
-        }
-
-        if (!iter.hasNext()) {
-          continue;
-        }
-        Comment perspectiveComment = iter.peek();
-        if (line.equals(ParserUtil.filePath(changeUrl, perspectiveComment))) {
-          if (lastEncounteredFileName == null
-              || !lastEncounteredFileName.equals(perspectiveComment.key.filename)) {
-            // This is the annotation of a file
-            lastEncounteredFileName = perspectiveComment.key.filename;
-            lastEncounteredComment = null;
-          } else if (perspectiveComment.lineNbr == 0) {
-            // This was originally a file-level comment
-            lastEncounteredComment = perspectiveComment;
-            iter.next();
-          }
-        } else if (ParserUtil.isCommentUrl(line, changeUrl, perspectiveComment)) {
-          lastEncounteredComment = perspectiveComment;
-          iter.next();
-        }
-      } else {
-        // This is a comment. Try to append to previous comment if applicable or
-        // create a new comment.
-        if (currentComment == null) {
-          // Start new comment
-          currentComment = new MailComment();
-          currentComment.message = line;
-          if (lastEncounteredComment == null) {
-            if (lastEncounteredFileName == null) {
-              // Change message
-              currentComment.type = MailComment.CommentType.CHANGE_MESSAGE;
-            } else {
-              // File comment not sent in reply to another comment
-              currentComment.type = MailComment.CommentType.FILE_COMMENT;
-              currentComment.fileName = lastEncounteredFileName;
-            }
-          } else {
-            // Comment sent in reply to another comment
-            currentComment.inReplyTo = lastEncounteredComment;
-            currentComment.type = MailComment.CommentType.INLINE_COMMENT;
-          }
-        } else {
-          // Attach to previous comment
-          currentComment.message += "\n" + line;
-        }
-      }
-    }
-    // There is no need to attach the currentComment after this loop as all
-    // emails have footers and other enquoted text after the last comment
-    // appeared and the last comment will have already been added to the list
-    // at this point.
-
-    return parsedComments;
-  }
-
-  /** Counts the occurrences of pattern in s */
-  private static int countOccurrences(String s, String pattern) {
-    return (s.length() - s.replace(pattern, "").length()) / pattern.length();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/AbandonedSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/AbandonedSender.java
deleted file mode 100644
index ec62833..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/AbandonedSender.java
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.mail.send;
-
-import com.google.gerrit.common.errors.EmailException;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.account.WatchConfig.NotifyType;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-
-/** Send notice about a change being abandoned by its owner. */
-public class AbandonedSender extends ReplyToChangeSender {
-  public interface Factory extends ReplyToChangeSender.Factory<AbandonedSender> {
-    @Override
-    AbandonedSender create(Project.NameKey project, Change.Id change);
-  }
-
-  @Inject
-  public AbandonedSender(
-      EmailArguments ea, @Assisted Project.NameKey project, @Assisted Change.Id id)
-      throws OrmException {
-    super(ea, "abandon", ChangeEmail.newChangeData(ea, project, id));
-  }
-
-  @Override
-  protected void init() throws EmailException {
-    super.init();
-
-    ccAllApprovals();
-    bccStarredBy();
-    includeWatchers(NotifyType.ABANDONED_CHANGES);
-    removeUsersThatIgnoredTheChange();
-  }
-
-  @Override
-  protected void formatChange() throws EmailException {
-    appendText(textTemplate("Abandoned"));
-    if (useHtml()) {
-      appendHtml(soyHtmlTemplate("AbandonedHtml"));
-    }
-  }
-
-  @Override
-  protected boolean supportsHtml() {
-    return true;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/AddKeySender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/AddKeySender.java
deleted file mode 100644
index 30938f1..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/AddKeySender.java
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.mail.send;
-
-import com.google.common.base.Joiner;
-import com.google.gerrit.common.errors.EmailException;
-import com.google.gerrit.extensions.api.changes.RecipientType;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.reviewdb.client.AccountSshKey;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.inject.assistedinject.Assisted;
-import com.google.inject.assistedinject.AssistedInject;
-import java.util.List;
-
-public class AddKeySender extends OutgoingEmail {
-  public interface Factory {
-    AddKeySender create(IdentifiedUser user, AccountSshKey sshKey);
-
-    AddKeySender create(IdentifiedUser user, List<String> gpgKey);
-  }
-
-  private final PermissionBackend permissionBackend;
-  private final IdentifiedUser callingUser;
-  private final IdentifiedUser user;
-  private final AccountSshKey sshKey;
-  private final List<String> gpgKeys;
-
-  @AssistedInject
-  public AddKeySender(
-      EmailArguments ea,
-      PermissionBackend permissionBackend,
-      IdentifiedUser callingUser,
-      @Assisted IdentifiedUser user,
-      @Assisted AccountSshKey sshKey) {
-    super(ea, "addkey");
-    this.permissionBackend = permissionBackend;
-    this.callingUser = callingUser;
-    this.user = user;
-    this.sshKey = sshKey;
-    this.gpgKeys = null;
-  }
-
-  @AssistedInject
-  public AddKeySender(
-      EmailArguments ea,
-      PermissionBackend permissionBackend,
-      IdentifiedUser callingUser,
-      @Assisted IdentifiedUser user,
-      @Assisted List<String> gpgKeys) {
-    super(ea, "addkey");
-    this.permissionBackend = permissionBackend;
-    this.callingUser = callingUser;
-    this.user = user;
-    this.sshKey = null;
-    this.gpgKeys = gpgKeys;
-  }
-
-  @Override
-  protected void init() throws EmailException {
-    super.init();
-    setHeader("Subject", String.format("[Gerrit Code Review] New %s Keys Added", getKeyType()));
-    add(RecipientType.TO, new Address(getEmail()));
-  }
-
-  @Override
-  protected boolean shouldSendMessage() {
-    if (sshKey == null && (gpgKeys == null || gpgKeys.isEmpty())) {
-      // Don't email if no keys were added.
-      return false;
-    }
-
-    if (user.equals(callingUser)) {
-      // Send email if the user self-added a key; this notification is necessary to alert
-      // the user if their account was compromised and a key was unexpectedly added.
-      return true;
-    }
-
-    try {
-      // Don't email if an administrator added a key on behalf of the user.
-      permissionBackend.user(callingUser).check(GlobalPermission.ADMINISTRATE_SERVER);
-      return false;
-    } catch (AuthException | PermissionBackendException e) {
-      // Send email if a non-administrator modified the keys, e.g. by MODIFY_ACCOUNT.
-      return true;
-    }
-  }
-
-  @Override
-  protected void format() throws EmailException {
-    appendText(textTemplate("AddKey"));
-    if (useHtml()) {
-      appendHtml(soyHtmlTemplate("AddKeyHtml"));
-    }
-  }
-
-  public String getEmail() {
-    return user.getAccount().getPreferredEmail();
-  }
-
-  public String getUserNameEmail() {
-    return getUserNameEmailFor(user.getAccountId());
-  }
-
-  public String getKeyType() {
-    if (sshKey != null) {
-      return "SSH";
-    } else if (gpgKeys != null) {
-      return "GPG";
-    }
-    return "Unknown";
-  }
-
-  public String getSshKey() {
-    return (sshKey != null) ? sshKey.getSshPublicKey() + "\n" : null;
-  }
-
-  public String getGpgKeys() {
-    if (gpgKeys != null) {
-      return Joiner.on("\n").join(gpgKeys);
-    }
-    return null;
-  }
-
-  @Override
-  protected void setupSoyContext() {
-    super.setupSoyContext();
-    soyContextEmailData.put("email", getEmail());
-    soyContextEmailData.put("gpgKeys", getGpgKeys());
-    soyContextEmailData.put("keyType", getKeyType());
-    soyContextEmailData.put("sshKey", getSshKey());
-    soyContextEmailData.put("userNameEmail", getUserNameEmail());
-  }
-
-  @Override
-  protected boolean supportsHtml() {
-    return true;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/ChangeEmail.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/ChangeEmail.java
deleted file mode 100644
index a7826cb..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/ChangeEmail.java
+++ /dev/null
@@ -1,606 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.send;
-
-import com.google.common.base.Splitter;
-import com.google.common.collect.ListMultimap;
-import com.google.gerrit.common.errors.EmailException;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.api.changes.RecipientType;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.Patch;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetInfo;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.StarredChangesUtil;
-import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.account.WatchConfig.NotifyType;
-import com.google.gerrit.server.mail.send.ProjectWatch.Watchers;
-import com.google.gerrit.server.notedb.ReviewerStateInternal;
-import com.google.gerrit.server.patch.PatchList;
-import com.google.gerrit.server.patch.PatchListEntry;
-import com.google.gerrit.server.patch.PatchListNotAvailableException;
-import com.google.gerrit.server.patch.PatchListObjectTooLargeException;
-import com.google.gerrit.server.patch.PatchSetInfoNotAvailableException;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gwtorm.server.OrmException;
-import com.google.template.soy.data.SoyListData;
-import com.google.template.soy.data.SoyMapData;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.text.MessageFormat;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-import org.eclipse.jgit.diff.DiffFormatter;
-import org.eclipse.jgit.internal.JGitText;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.util.RawParseUtils;
-import org.eclipse.jgit.util.TemporaryBuffer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Sends an email to one or more interested parties. */
-public abstract class ChangeEmail extends NotificationEmail {
-  private static final Logger log = LoggerFactory.getLogger(ChangeEmail.class);
-
-  protected static ChangeData newChangeData(
-      EmailArguments ea, Project.NameKey project, Change.Id id) {
-    return ea.changeDataFactory.create(ea.db.get(), project, id);
-  }
-
-  protected final Change change;
-  protected final ChangeData changeData;
-  protected ListMultimap<Account.Id, String> stars;
-  protected PatchSet patchSet;
-  protected PatchSetInfo patchSetInfo;
-  protected String changeMessage;
-  protected Timestamp timestamp;
-
-  protected ProjectState projectState;
-  protected Set<Account.Id> authors;
-  protected boolean emailOnlyAuthors;
-
-  protected ChangeEmail(EmailArguments ea, String mc, ChangeData cd) throws OrmException {
-    super(ea, mc, cd.change().getDest());
-    changeData = cd;
-    change = cd.change();
-    emailOnlyAuthors = false;
-  }
-
-  @Override
-  public void setFrom(Account.Id id) {
-    super.setFrom(id);
-
-    /** Is the from user in an email squelching group? */
-    try {
-      IdentifiedUser user = args.identifiedUserFactory.create(id);
-      args.permissionBackend.user(user).check(GlobalPermission.EMAIL_REVIEWERS);
-    } catch (AuthException | PermissionBackendException e) {
-      emailOnlyAuthors = true;
-    }
-  }
-
-  public void setPatchSet(PatchSet ps) {
-    patchSet = ps;
-  }
-
-  public void setPatchSet(PatchSet ps, PatchSetInfo psi) {
-    patchSet = ps;
-    patchSetInfo = psi;
-  }
-
-  @Deprecated
-  public void setChangeMessage(ChangeMessage cm) {
-    setChangeMessage(cm.getMessage(), cm.getWrittenOn());
-  }
-
-  public void setChangeMessage(String cm, Timestamp t) {
-    changeMessage = cm;
-    timestamp = t;
-  }
-
-  /** Format the message body by calling {@link #appendText(String)}. */
-  @Override
-  protected void format() throws EmailException {
-    formatChange();
-    appendText(textTemplate("ChangeFooter"));
-    if (useHtml()) {
-      appendHtml(soyHtmlTemplate("ChangeFooterHtml"));
-    }
-    formatFooter();
-  }
-
-  /** Format the message body by calling {@link #appendText(String)}. */
-  protected abstract void formatChange() throws EmailException;
-
-  /**
-   * Format the message footer by calling {@link #appendText(String)}.
-   *
-   * @throws EmailException if an error occurred.
-   */
-  protected void formatFooter() throws EmailException {}
-
-  /** Setup the message headers and envelope (TO, CC, BCC). */
-  @Override
-  protected void init() throws EmailException {
-    if (args.projectCache != null) {
-      projectState = args.projectCache.get(change.getProject());
-    } else {
-      projectState = null;
-    }
-
-    if (patchSet == null) {
-      try {
-        patchSet = changeData.currentPatchSet();
-      } catch (OrmException err) {
-        patchSet = null;
-      }
-    }
-
-    if (patchSet != null) {
-      setHeader("X-Gerrit-PatchSet", patchSet.getPatchSetId() + "");
-      if (patchSetInfo == null) {
-        try {
-          patchSetInfo =
-              args.patchSetInfoFactory.get(args.db.get(), changeData.notes(), patchSet.getId());
-        } catch (PatchSetInfoNotAvailableException | OrmException err) {
-          patchSetInfo = null;
-        }
-      }
-    }
-    authors = getAuthors();
-
-    try {
-      stars = changeData.stars();
-    } catch (OrmException e) {
-      throw new EmailException("Failed to load stars for change " + change.getChangeId(), e);
-    }
-
-    super.init();
-    if (timestamp != null) {
-      setHeader("Date", new Date(timestamp.getTime()));
-    }
-    setChangeSubjectHeader();
-    setHeader("X-Gerrit-Change-Id", "" + change.getKey().get());
-    setHeader("X-Gerrit-Change-Number", "" + change.getChangeId());
-    setChangeUrlHeader();
-    setCommitIdHeader();
-
-    if (notify.ordinal() >= NotifyHandling.OWNER_REVIEWERS.ordinal()) {
-      try {
-        addByEmail(
-            RecipientType.CC, changeData.reviewersByEmail().byState(ReviewerStateInternal.CC));
-        addByEmail(
-            RecipientType.CC,
-            changeData.reviewersByEmail().byState(ReviewerStateInternal.REVIEWER));
-      } catch (OrmException e) {
-        throw new EmailException("Failed to add unregistered CCs " + change.getChangeId(), e);
-      }
-    }
-  }
-
-  private void setChangeUrlHeader() {
-    final String u = getChangeUrl();
-    if (u != null) {
-      setHeader("X-Gerrit-ChangeURL", "<" + u + ">");
-    }
-  }
-
-  private void setCommitIdHeader() {
-    if (patchSet != null
-        && patchSet.getRevision() != null
-        && patchSet.getRevision().get() != null
-        && patchSet.getRevision().get().length() > 0) {
-      setHeader("X-Gerrit-Commit", patchSet.getRevision().get());
-    }
-  }
-
-  private void setChangeSubjectHeader() throws EmailException {
-    setHeader("Subject", textTemplate("ChangeSubject"));
-  }
-
-  /** Get a link to the change; null if the server doesn't know its own address. */
-  public String getChangeUrl() {
-    if (getGerritUrl() != null) {
-      final StringBuilder r = new StringBuilder();
-      r.append(getGerritUrl());
-      r.append(change.getChangeId());
-      return r.toString();
-    }
-    return null;
-  }
-
-  public String getChangeMessageThreadId() throws EmailException {
-    return velocify("<gerrit.${change.createdOn.time}.$change.key.get()@$email.gerritHost>");
-  }
-
-  /** Format the sender's "cover letter", {@link #getCoverLetter()}. */
-  protected void formatCoverLetter() {
-    final String cover = getCoverLetter();
-    if (!"".equals(cover)) {
-      appendText(cover);
-      appendText("\n\n");
-    }
-  }
-
-  /** Get the text of the "cover letter". */
-  public String getCoverLetter() {
-    if (changeMessage != null) {
-      return changeMessage.trim();
-    }
-    return "";
-  }
-
-  /** Format the change message and the affected file list. */
-  protected void formatChangeDetail() {
-    appendText(getChangeDetail());
-  }
-
-  /** Create the change message and the affected file list. */
-  public String getChangeDetail() {
-    try {
-      StringBuilder detail = new StringBuilder();
-
-      if (patchSetInfo != null) {
-        detail.append(patchSetInfo.getMessage().trim()).append("\n");
-      } else {
-        detail.append(change.getSubject().trim()).append("\n");
-      }
-
-      if (patchSet != null) {
-        detail.append("---\n");
-        PatchList patchList = getPatchList();
-        for (PatchListEntry p : patchList.getPatches()) {
-          if (Patch.isMagic(p.getNewName())) {
-            continue;
-          }
-          detail
-              .append(p.getChangeType().getCode())
-              .append(" ")
-              .append(p.getNewName())
-              .append("\n");
-        }
-        detail.append(
-            MessageFormat.format(
-                "" //
-                    + "{0,choice,0#0 files|1#1 file|1<{0} files} changed, " //
-                    + "{1,choice,0#0 insertions|1#1 insertion|1<{1} insertions}(+), " //
-                    + "{2,choice,0#0 deletions|1#1 deletion|1<{2} deletions}(-)" //
-                    + "\n",
-                patchList.getPatches().size() - 1, //
-                patchList.getInsertions(), //
-                patchList.getDeletions()));
-        detail.append("\n");
-      }
-      return detail.toString();
-    } catch (Exception err) {
-      log.warn("Cannot format change detail", err);
-      return "";
-    }
-  }
-
-  /** Get the patch list corresponding to this patch set. */
-  protected PatchList getPatchList() throws PatchListNotAvailableException {
-    if (patchSet != null) {
-      return args.patchListCache.get(change, patchSet);
-    }
-    throw new PatchListNotAvailableException("no patchSet specified");
-  }
-
-  /** Get the project entity the change is in; null if its been deleted. */
-  protected ProjectState getProjectState() {
-    return projectState;
-  }
-
-  /** Get the groups which own the project. */
-  protected Set<AccountGroup.UUID> getProjectOwners() {
-    final ProjectState r;
-
-    r = args.projectCache.get(change.getProject());
-    return r != null ? r.getOwners() : Collections.<AccountGroup.UUID>emptySet();
-  }
-
-  /** TO or CC all vested parties (change owner, patch set uploader, author). */
-  protected void rcptToAuthors(RecipientType rt) {
-    for (Account.Id id : authors) {
-      add(rt, id);
-    }
-  }
-
-  /** BCC any user who has starred this change. */
-  protected void bccStarredBy() {
-    if (!NotifyHandling.ALL.equals(notify)) {
-      return;
-    }
-
-    for (Map.Entry<Account.Id, Collection<String>> e : stars.asMap().entrySet()) {
-      if (e.getValue().contains(StarredChangesUtil.DEFAULT_LABEL)) {
-        super.add(RecipientType.BCC, e.getKey());
-      }
-    }
-  }
-
-  protected void removeUsersThatIgnoredTheChange() {
-    for (Map.Entry<Account.Id, Collection<String>> e : stars.asMap().entrySet()) {
-      if (e.getValue().contains(StarredChangesUtil.IGNORE_LABEL)) {
-        AccountState accountState = args.accountCache.get(e.getKey());
-        if (accountState != null) {
-          removeUser(accountState.getAccount());
-        }
-      }
-    }
-  }
-
-  @Override
-  protected final Watchers getWatchers(NotifyType type, boolean includeWatchersFromNotifyConfig)
-      throws OrmException {
-    if (!NotifyHandling.ALL.equals(notify)) {
-      return new Watchers();
-    }
-
-    ProjectWatch watch = new ProjectWatch(args, branch.getParentKey(), projectState, changeData);
-    return watch.getWatchers(type, includeWatchersFromNotifyConfig);
-  }
-
-  /** Any user who has published comments on this change. */
-  protected void ccAllApprovals() {
-    if (!NotifyHandling.ALL.equals(notify) && !NotifyHandling.OWNER_REVIEWERS.equals(notify)) {
-      return;
-    }
-
-    try {
-      for (Account.Id id : changeData.reviewers().all()) {
-        add(RecipientType.CC, id);
-      }
-    } catch (OrmException err) {
-      log.warn("Cannot CC users that reviewed updated change", err);
-    }
-  }
-
-  /** Users who have non-zero approval codes on the change. */
-  protected void ccExistingReviewers() {
-    if (!NotifyHandling.ALL.equals(notify) && !NotifyHandling.OWNER_REVIEWERS.equals(notify)) {
-      return;
-    }
-
-    try {
-      for (Account.Id id : changeData.reviewers().byState(ReviewerStateInternal.REVIEWER)) {
-        add(RecipientType.CC, id);
-      }
-    } catch (OrmException err) {
-      log.warn("Cannot CC users that commented on updated change", err);
-    }
-  }
-
-  @Override
-  protected void add(RecipientType rt, Account.Id to) {
-    if (!emailOnlyAuthors || authors.contains(to)) {
-      super.add(rt, to);
-    }
-  }
-
-  @Override
-  protected boolean isVisibleTo(Account.Id to) throws OrmException, PermissionBackendException {
-    return args.permissionBackend
-        .user(args.identifiedUserFactory.create(to))
-        .change(changeData)
-        .database(args.db.get())
-        .test(ChangePermission.READ);
-  }
-
-  /** Find all users who are authors of any part of this change. */
-  protected Set<Account.Id> getAuthors() {
-    Set<Account.Id> authors = new HashSet<>();
-
-    switch (notify) {
-      case NONE:
-        break;
-      case ALL:
-      default:
-        if (patchSet != null) {
-          authors.add(patchSet.getUploader());
-        }
-        if (patchSetInfo != null) {
-          if (patchSetInfo.getAuthor().getAccount() != null) {
-            authors.add(patchSetInfo.getAuthor().getAccount());
-          }
-          if (patchSetInfo.getCommitter().getAccount() != null) {
-            authors.add(patchSetInfo.getCommitter().getAccount());
-          }
-        }
-        // $FALL-THROUGH$
-      case OWNER_REVIEWERS:
-      case OWNER:
-        authors.add(change.getOwner());
-        break;
-    }
-
-    return authors;
-  }
-
-  @Override
-  protected void setupVelocityContext() {
-    super.setupVelocityContext();
-    velocityContext.put("change", change);
-    velocityContext.put("changeId", change.getKey());
-    velocityContext.put("coverLetter", getCoverLetter());
-    velocityContext.put("fromName", getNameFor(fromId));
-    velocityContext.put("patchSet", patchSet);
-    velocityContext.put("patchSetInfo", patchSetInfo);
-  }
-
-  @Override
-  protected void setupSoyContext() {
-    super.setupSoyContext();
-
-    soyContext.put("changeId", change.getKey().get());
-    soyContext.put("coverLetter", getCoverLetter());
-    soyContext.put("fromName", getNameFor(fromId));
-    soyContext.put("fromEmail", getNameEmailFor(fromId));
-    soyContext.put("diffLines", getDiffTemplateData());
-
-    soyContextEmailData.put("unifiedDiff", getUnifiedDiff());
-    soyContextEmailData.put("changeDetail", getChangeDetail());
-    soyContextEmailData.put("changeUrl", getChangeUrl());
-    soyContextEmailData.put("includeDiff", getIncludeDiff());
-
-    Map<String, String> changeData = new HashMap<>();
-    changeData.put("subject", change.getSubject());
-    changeData.put("originalSubject", change.getOriginalSubject());
-    changeData.put("ownerName", getNameFor(change.getOwner()));
-    changeData.put("ownerEmail", getNameEmailFor(change.getOwner()));
-    changeData.put("changeNumber", Integer.toString(change.getChangeId()));
-    soyContext.put("change", changeData);
-
-    String subject = change.getSubject();
-    changeData.put("subject", subject);
-    // shortSubject is the subject limited to 63 characters, with an ellipsis if
-    // it exceeds that.
-    if (subject.length() < 73) {
-      changeData.put("shortSubject", subject);
-    } else {
-      changeData.put("shortSubject", subject.substring(0, 69) + "...");
-    }
-
-    Map<String, Object> patchSetData = new HashMap<>();
-    patchSetData.put("patchSetId", patchSet.getPatchSetId());
-    patchSetData.put("refName", patchSet.getRefName());
-    soyContext.put("patchSet", patchSetData);
-
-    // TODO(wyatta): patchSetInfo
-
-    footers.add("Gerrit-MessageType: " + messageClass);
-    footers.add("Gerrit-Change-Id: " + change.getKey().get());
-    footers.add("Gerrit-Change-Number: " + Integer.toString(change.getChangeId()));
-    footers.add("Gerrit-PatchSet: " + patchSet.getPatchSetId());
-    footers.add("Gerrit-Owner: " + getNameEmailFor(change.getOwner()));
-    if (change.getAssignee() != null) {
-      footers.add("Gerrit-Assignee: " + getNameEmailFor(change.getAssignee()));
-    }
-    for (String reviewer : getEmailsByState(ReviewerStateInternal.REVIEWER)) {
-      footers.add("Gerrit-Reviewer: " + reviewer);
-    }
-    for (String reviewer : getEmailsByState(ReviewerStateInternal.CC)) {
-      footers.add("Gerrit-CC: " + reviewer);
-    }
-  }
-
-  private Set<String> getEmailsByState(ReviewerStateInternal state) {
-    Set<String> reviewers = new TreeSet<>();
-    try {
-      for (Account.Id who : changeData.reviewers().byState(state)) {
-        reviewers.add(getNameEmailFor(who));
-      }
-    } catch (OrmException e) {
-      log.warn("Cannot get change reviewers", e);
-    }
-    return reviewers;
-  }
-
-  public boolean getIncludeDiff() {
-    return args.settings.includeDiff;
-  }
-
-  private static final int HEAP_EST_SIZE = 32 * 1024;
-
-  /** Show patch set as unified difference. */
-  public String getUnifiedDiff() {
-    PatchList patchList;
-    try {
-      patchList = getPatchList();
-      if (patchList.getOldId() == null) {
-        // Octopus merges are not well supported for diff output by Gerrit.
-        // Currently these always have a null oldId in the PatchList.
-        return "[Octopus merge; cannot be formatted as a diff.]\n";
-      }
-    } catch (PatchListObjectTooLargeException e) {
-      log.warn("Cannot format patch " + e.getMessage());
-      return "";
-    } catch (PatchListNotAvailableException e) {
-      log.error("Cannot format patch", e);
-      return "";
-    }
-
-    int maxSize = args.settings.maximumDiffSize;
-    TemporaryBuffer.Heap buf = new TemporaryBuffer.Heap(Math.min(HEAP_EST_SIZE, maxSize), maxSize);
-    try (DiffFormatter fmt = new DiffFormatter(buf)) {
-      try (Repository git = args.server.openRepository(change.getProject())) {
-        try {
-          fmt.setRepository(git);
-          fmt.setDetectRenames(true);
-          fmt.format(patchList.getOldId(), patchList.getNewId());
-          return RawParseUtils.decode(buf.toByteArray());
-        } catch (IOException e) {
-          if (JGitText.get().inMemoryBufferLimitExceeded.equals(e.getMessage())) {
-            return "";
-          }
-          log.error("Cannot format patch", e);
-          return "";
-        }
-      } catch (IOException e) {
-        log.error("Cannot open repository to format patch", e);
-        return "";
-      }
-    }
-  }
-
-  /**
-   * Generate a Soy list of maps representing each line of the unified diff. The line maps will have
-   * a 'type' key which maps to one of 'common', 'add' or 'remove' and a 'text' key which maps to
-   * the line's content.
-   */
-  private SoyListData getDiffTemplateData() {
-    SoyListData result = new SoyListData();
-    Splitter lineSplitter = Splitter.on(System.getProperty("line.separator"));
-    for (String diffLine : lineSplitter.split(getUnifiedDiff())) {
-      SoyMapData lineData = new SoyMapData();
-      lineData.put("text", diffLine);
-
-      // Skip empty lines and lines that look like diff headers.
-      if (diffLine.isEmpty() || diffLine.startsWith("---") || diffLine.startsWith("+++")) {
-        lineData.put("type", "common");
-      } else {
-        switch (diffLine.charAt(0)) {
-          case '+':
-            lineData.put("type", "add");
-            break;
-          case '-':
-            lineData.put("type", "remove");
-            break;
-          default:
-            lineData.put("type", "common");
-            break;
-        }
-      }
-      result.add(lineData);
-    }
-    return result;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/CommentFormatter.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/CommentFormatter.java
deleted file mode 100644
index 74d1480..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/CommentFormatter.java
+++ /dev/null
@@ -1,181 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.send;
-
-import static com.google.common.base.Strings.isNullOrEmpty;
-
-import com.google.gerrit.common.Nullable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-public class CommentFormatter {
-  public enum BlockType {
-    LIST,
-    PARAGRAPH,
-    PRE_FORMATTED,
-    QUOTE
-  }
-
-  public static class Block {
-    public BlockType type;
-    public String text;
-    public List<String> items; // For the items of list blocks.
-    public List<Block> quotedBlocks; // For the contents of quote blocks.
-  }
-
-  /**
-   * Take a string of comment text that was written using the wiki-Like format and emit a list of
-   * blocks that can be rendered to block-level HTML. This method does not escape HTML.
-   *
-   * <p>Adapted from the {@code wikify} method found in:
-   * com.google.gwtexpui.safehtml.client.SafeHtml
-   *
-   * @param source The raw, unescaped comment in the Gerrit wiki-like format.
-   * @return List of block objects, each with unescaped comment content.
-   */
-  public static List<Block> parse(@Nullable String source) {
-    if (isNullOrEmpty(source)) {
-      return Collections.emptyList();
-    }
-
-    List<Block> result = new ArrayList<>();
-    for (String p : source.split("\n\n")) {
-      if (isQuote(p)) {
-        result.add(makeQuote(p));
-      } else if (isPreFormat(p)) {
-        result.add(makePre(p));
-      } else if (isList(p)) {
-        makeList(p, result);
-      } else if (!p.isEmpty()) {
-        result.add(makeParagraph(p));
-      }
-    }
-    return result;
-  }
-
-  /**
-   * Take a block of comment text that contains a list and potentially paragraphs (but does not
-   * contain blank lines), generate appropriate block elements and append them to the output list.
-   *
-   * <p>In simple cases, this will generate a single list block. For example, on the following
-   * input.
-   *
-   * <p>* Item one. * Item two. * item three.
-   *
-   * <p>However, if the list is adjacent to a paragraph, it will need to also generate that
-   * paragraph. Consider the following input.
-   *
-   * <p>A bit of text describing the context of the list: * List item one. * List item two. * Et
-   * cetera.
-   *
-   * <p>In this case, {@code makeList} generates a paragraph block object containing the
-   * non-bullet-prefixed text, followed by a list block.
-   *
-   * <p>Adapted from the {@code wikifyList} method found in:
-   * com.google.gwtexpui.safehtml.client.SafeHtml
-   *
-   * @param p The block containing the list (as well as potential paragraphs).
-   * @param out The list of blocks to append to.
-   */
-  private static void makeList(String p, List<Block> out) {
-    Block block = null;
-    StringBuilder textBuilder = null;
-    boolean inList = false;
-    boolean inParagraph = false;
-
-    for (String line : p.split("\n")) {
-      if (line.startsWith("-") || line.startsWith("*")) {
-        // The next line looks like a list item. If not building a list already,
-        // then create one. Remove the list item marker (* or -) from the line.
-        if (!inList) {
-          if (inParagraph) {
-            // Add the finished paragraph block to the result.
-            inParagraph = false;
-            block.text = textBuilder.toString();
-            out.add(block);
-          }
-
-          inList = true;
-          block = new Block();
-          block.type = BlockType.LIST;
-          block.items = new ArrayList<>();
-        }
-        line = line.substring(1).trim();
-
-      } else if (!inList) {
-        // Otherwise, if a list has not yet been started, but the next line does
-        // not look like a list item, then add the line to a paragraph block. If
-        // a paragraph block has not yet been started, then create one.
-        if (!inParagraph) {
-          inParagraph = true;
-          block = new Block();
-          block.type = BlockType.PARAGRAPH;
-          textBuilder = new StringBuilder();
-        } else {
-          textBuilder.append(" ");
-        }
-        textBuilder.append(line);
-        continue;
-      }
-
-      block.items.add(line);
-    }
-
-    if (block != null) {
-      out.add(block);
-    }
-  }
-
-  private static Block makeQuote(String p) {
-    String quote = p.replaceAll("\n\\s?>\\s?", "\n");
-    if (quote.startsWith("> ")) {
-      quote = quote.substring(2);
-    } else if (quote.startsWith(" > ")) {
-      quote = quote.substring(3);
-    }
-
-    Block block = new Block();
-    block.type = BlockType.QUOTE;
-    block.quotedBlocks = CommentFormatter.parse(quote);
-    return block;
-  }
-
-  private static Block makePre(String p) {
-    Block block = new Block();
-    block.type = BlockType.PRE_FORMATTED;
-    block.text = p;
-    return block;
-  }
-
-  private static Block makeParagraph(String p) {
-    Block block = new Block();
-    block.type = BlockType.PARAGRAPH;
-    block.text = p;
-    return block;
-  }
-
-  private static boolean isQuote(String p) {
-    return p.startsWith("> ") || p.startsWith(" > ");
-  }
-
-  private static boolean isPreFormat(String p) {
-    return p.startsWith(" ") || p.startsWith("\t") || p.contains("\n ") || p.contains("\n\t");
-  }
-
-  private static boolean isList(String p) {
-    return p.startsWith("- ") || p.startsWith("* ") || p.contains("\n- ") || p.contains("\n* ");
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/CommentSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/CommentSender.java
deleted file mode 100644
index b9fc5da..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/CommentSender.java
+++ /dev/null
@@ -1,660 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.send;
-
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.Ordering;
-import com.google.gerrit.common.data.FilenameComparator;
-import com.google.gerrit.common.errors.EmailException;
-import com.google.gerrit.common.errors.NoSuchEntityException;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.Patch;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RobotComment;
-import com.google.gerrit.server.CommentsUtil;
-import com.google.gerrit.server.account.WatchConfig.NotifyType;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.mail.MailUtil;
-import com.google.gerrit.server.mail.receive.Protocol;
-import com.google.gerrit.server.patch.PatchFile;
-import com.google.gerrit.server.patch.PatchList;
-import com.google.gerrit.server.patch.PatchListNotAvailableException;
-import com.google.gerrit.server.patch.PatchListObjectTooLargeException;
-import com.google.gerrit.server.util.LabelVote;
-import com.google.gwtorm.client.KeyUtil;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.time.ZoneId;
-import java.time.ZonedDateTime;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.Repository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Send comments, after the author of them hit used Publish Comments in the UI. */
-public class CommentSender extends ReplyToChangeSender {
-  private static final Logger log = LoggerFactory.getLogger(CommentSender.class);
-
-  public interface Factory {
-    CommentSender create(Project.NameKey project, Change.Id id);
-  }
-
-  private class FileCommentGroup {
-    public String filename;
-    public int patchSetId;
-    public PatchFile fileData;
-    public List<Comment> comments = new ArrayList<>();
-
-    /** @return a web link to the given patch set and file. */
-    public String getLink() {
-      String url = getGerritUrl();
-      if (url == null) {
-        return null;
-      }
-
-      return new StringBuilder()
-          .append(url)
-          .append("#/c/")
-          .append(change.getId())
-          .append('/')
-          .append(patchSetId)
-          .append('/')
-          .append(KeyUtil.encode(filename))
-          .toString();
-    }
-
-    /**
-     * @return A title for the group, i.e. "Commit Message", "Merge List", or "File [[filename]]".
-     */
-    public String getTitle() {
-      if (Patch.COMMIT_MSG.equals(filename)) {
-        return "Commit Message";
-      } else if (Patch.MERGE_LIST.equals(filename)) {
-        return "Merge List";
-      } else {
-        return "File " + filename;
-      }
-    }
-  }
-
-  private List<Comment> inlineComments = Collections.emptyList();
-  private String patchSetComment;
-  private List<LabelVote> labels = Collections.emptyList();
-  private final CommentsUtil commentsUtil;
-  private final boolean incomingEmailEnabled;
-  private final String replyToAddress;
-
-  @Inject
-  public CommentSender(
-      EmailArguments ea,
-      CommentsUtil commentsUtil,
-      @GerritServerConfig Config cfg,
-      @Assisted Project.NameKey project,
-      @Assisted Change.Id id)
-      throws OrmException {
-    super(ea, "comment", newChangeData(ea, project, id));
-    this.commentsUtil = commentsUtil;
-    this.incomingEmailEnabled =
-        cfg.getEnum("receiveemail", null, "protocol", Protocol.NONE).ordinal()
-            > Protocol.NONE.ordinal();
-    this.replyToAddress = cfg.getString("sendemail", null, "replyToAddress");
-  }
-
-  public void setComments(List<Comment> comments) throws OrmException {
-    inlineComments = comments;
-
-    Set<String> paths = new HashSet<>();
-    for (Comment c : comments) {
-      if (!Patch.isMagic(c.key.filename)) {
-        paths.add(c.key.filename);
-      }
-    }
-    changeData.setCurrentFilePaths(Ordering.natural().sortedCopy(paths));
-  }
-
-  public void setPatchSetComment(String comment) {
-    this.patchSetComment = comment;
-  }
-
-  public void setLabels(List<LabelVote> labels) {
-    this.labels = labels;
-  }
-
-  @Override
-  protected void init() throws EmailException {
-    super.init();
-
-    if (notify.compareTo(NotifyHandling.OWNER_REVIEWERS) >= 0) {
-      ccAllApprovals();
-    }
-    if (notify.compareTo(NotifyHandling.ALL) >= 0) {
-      bccStarredBy();
-      includeWatchers(NotifyType.ALL_COMMENTS, !change.isWorkInProgress() && !change.isPrivate());
-    }
-    removeUsersThatIgnoredTheChange();
-
-    // Add header that enables identifying comments on parsed email.
-    // Grouping is currently done by timestamp.
-    setHeader("X-Gerrit-Comment-Date", timestamp);
-
-    if (incomingEmailEnabled) {
-      if (replyToAddress == null) {
-        // Remove Reply-To and use outbound SMTP (default) instead.
-        removeHeader("Reply-To");
-      } else {
-        setHeader("Reply-To", replyToAddress);
-      }
-    }
-  }
-
-  @Override
-  public void formatChange() throws EmailException {
-    appendText(textTemplate("Comment"));
-    if (useHtml()) {
-      appendHtml(soyHtmlTemplate("CommentHtml"));
-    }
-  }
-
-  @Override
-  public void formatFooter() throws EmailException {
-    appendText(textTemplate("CommentFooter"));
-    if (useHtml()) {
-      appendHtml(soyHtmlTemplate("CommentFooterHtml"));
-    }
-  }
-
-  /** No longer used outside Velocity. Remove this method when VTL support is removed. */
-  @Deprecated
-  public boolean hasInlineComments() {
-    return !inlineComments.isEmpty();
-  }
-
-  /** No longer used outside Velocity. Remove this method when VTL support is removed. */
-  @Deprecated
-  public String getInlineComments() {
-    return getInlineComments(1);
-  }
-
-  /** No longer used outside Velocity. Remove this method when VTL support is removed. */
-  @Deprecated
-  public String getInlineComments(int lines) {
-    try (Repository repo = getRepository()) {
-      StringBuilder cmts = new StringBuilder();
-      for (FileCommentGroup group : getGroupedInlineComments(repo)) {
-        String link = group.getLink();
-        if (link != null) {
-          cmts.append(link).append('\n');
-        }
-        cmts.append(group.getTitle()).append(":\n\n");
-        for (Comment c : group.comments) {
-          appendComment(cmts, lines, group.fileData, c);
-        }
-        cmts.append("\n\n");
-      }
-      return cmts.toString();
-    }
-  }
-
-  /**
-   * @return a list of FileCommentGroup objects representing the inline comments grouped by the
-   *     file.
-   */
-  private List<CommentSender.FileCommentGroup> getGroupedInlineComments(Repository repo) {
-    List<CommentSender.FileCommentGroup> groups = new ArrayList<>();
-    // Get the patch list:
-    PatchList patchList = null;
-    if (repo != null) {
-      try {
-        patchList = getPatchList();
-      } catch (PatchListObjectTooLargeException e) {
-        log.warn("Failed to get patch list: " + e.getMessage());
-      } catch (PatchListNotAvailableException e) {
-        log.error("Failed to get patch list", e);
-      }
-    }
-
-    // Loop over the comments and collect them into groups based on the file
-    // location of the comment.
-    FileCommentGroup currentGroup = null;
-    for (Comment c : inlineComments) {
-      // If it's a new group:
-      if (currentGroup == null
-          || !c.key.filename.equals(currentGroup.filename)
-          || c.key.patchSetId != currentGroup.patchSetId) {
-        currentGroup = new FileCommentGroup();
-        currentGroup.filename = c.key.filename;
-        currentGroup.patchSetId = c.key.patchSetId;
-        groups.add(currentGroup);
-        if (patchList != null) {
-          try {
-            currentGroup.fileData = new PatchFile(repo, patchList, c.key.filename);
-          } catch (IOException e) {
-            log.warn(
-                "Cannot load {} from {} in {}",
-                c.key.filename,
-                patchList.getNewId().name(),
-                projectState.getName(),
-                e);
-            currentGroup.fileData = null;
-          }
-        }
-      }
-
-      if (currentGroup.fileData != null) {
-        currentGroup.comments.add(c);
-      }
-    }
-
-    Collections.sort(groups, Comparator.comparing(g -> g.filename, FilenameComparator.INSTANCE));
-    return groups;
-  }
-
-  /** No longer used except for Velocity. Remove this method when VTL support is removed. */
-  @Deprecated
-  private void appendComment(
-      StringBuilder out, int contextLines, PatchFile currentFileData, Comment comment) {
-    if (comment instanceof RobotComment) {
-      RobotComment robotComment = (RobotComment) comment;
-      out.append("Robot Comment from ")
-          .append(robotComment.robotId)
-          .append(" (run ID ")
-          .append(robotComment.robotRunId)
-          .append("):\n");
-    }
-    if (comment.range != null) {
-      appendRangedComment(out, currentFileData, comment);
-    } else {
-      appendLineComment(out, contextLines, currentFileData, comment);
-    }
-  }
-
-  /** No longer used except for Velocity. Remove this method when VTL support is removed. */
-  @Deprecated
-  private void appendRangedComment(StringBuilder out, PatchFile fileData, Comment comment) {
-    String prefix = getCommentLinePrefix(comment);
-    String emptyPrefix = Strings.padStart(": ", prefix.length(), ' ');
-    boolean firstLine = true;
-    for (String line : getLinesByRange(comment.range, fileData, comment.side)) {
-      out.append(firstLine ? prefix : emptyPrefix).append(line).append('\n');
-      firstLine = false;
-    }
-    appendQuotedParent(out, comment);
-    out.append(comment.message.trim()).append('\n');
-  }
-
-  private String getCommentLinePrefix(Comment comment) {
-    int lineNbr = comment.range == null ? comment.lineNbr : comment.range.startLine;
-    StringBuilder sb = new StringBuilder();
-    sb.append("PS").append(comment.key.patchSetId);
-    if (lineNbr != 0) {
-      sb.append(", Line ").append(lineNbr);
-    }
-    sb.append(": ");
-    return sb.toString();
-  }
-
-  /**
-   * @return the lines of file content in fileData that are encompassed by range on the given side.
-   */
-  private List<String> getLinesByRange(Comment.Range range, PatchFile fileData, short side) {
-    List<String> lines = new ArrayList<>();
-
-    for (int n = range.startLine; n <= range.endLine; n++) {
-      String s = getLine(fileData, side, n);
-      if (n == range.startLine && n == range.endLine && range.startChar < range.endChar) {
-        s = s.substring(Math.min(range.startChar, s.length()), Math.min(range.endChar, s.length()));
-      } else if (n == range.startLine) {
-        s = s.substring(Math.min(range.startChar, s.length()));
-      } else if (n == range.endLine) {
-        s = s.substring(0, Math.min(range.endChar, s.length()));
-      }
-      lines.add(s);
-    }
-    return lines;
-  }
-
-  /** No longer used except for Velocity. Remove this method when VTL support is removed. */
-  @Deprecated
-  private void appendLineComment(
-      StringBuilder out, int contextLines, PatchFile currentFileData, Comment comment) {
-    short side = comment.side;
-    int lineNbr = comment.lineNbr;
-
-    // Initialize maxLines to the known line number.
-    int maxLines = lineNbr;
-
-    try {
-      maxLines = currentFileData.getLineCount(side);
-    } catch (IOException err) {
-      // The file could not be read, leave the max as is.
-      log.warn("Failed to read file {} on side {}", comment.key.filename, side, err);
-    } catch (NoSuchEntityException err) {
-      // The file could not be read, leave the max as is.
-      log.warn("Side {} of file {} didn't exist", side, comment.key.filename, err);
-    }
-
-    int startLine = Math.max(1, lineNbr - contextLines + 1);
-    int stopLine = Math.min(maxLines, lineNbr + contextLines);
-
-    for (int line = startLine; line <= lineNbr; ++line) {
-      appendFileLine(out, currentFileData, side, line);
-    }
-    appendQuotedParent(out, comment);
-    out.append(comment.message.trim()).append('\n');
-
-    for (int line = lineNbr + 1; line < stopLine; ++line) {
-      appendFileLine(out, currentFileData, side, line);
-    }
-  }
-
-  /** No longer used except for Velocity. Remove this method when VTL support is removed. */
-  @Deprecated
-  private void appendFileLine(StringBuilder cmts, PatchFile fileData, short side, int line) {
-    String lineStr = getLine(fileData, side, line);
-    cmts.append("Line ").append(line).append(": ").append(lineStr).append("\n");
-  }
-
-  /** No longer used except for Velocity. Remove this method when VTL support is removed. */
-  @Deprecated
-  private void appendQuotedParent(StringBuilder out, Comment child) {
-    Optional<Comment> parent = getParent(child);
-    if (parent.isPresent()) {
-      out.append("> ").append(getShortenedCommentMessage(parent.get())).append('\n');
-    }
-  }
-
-  /**
-   * Get the parent comment of a given comment.
-   *
-   * @param child the comment with a potential parent comment.
-   * @return an optional comment that will be present if the given comment has a parent, and is
-   *     empty if it does not.
-   */
-  private Optional<Comment> getParent(Comment child) {
-    if (child.parentUuid == null) {
-      return Optional.empty();
-    }
-
-    Comment.Key key = new Comment.Key(child.parentUuid, child.key.filename, child.key.patchSetId);
-    try {
-      return commentsUtil.getPublished(args.db.get(), changeData.notes(), key);
-    } catch (OrmException e) {
-      log.warn("Could not find the parent of this comment: {}", child.toString());
-      return Optional.empty();
-    }
-  }
-
-  /**
-   * Retrieve the file lines referred to by a comment.
-   *
-   * @param comment The comment that refers to some file contents. The comment may be a line comment
-   *     or a ranged comment.
-   * @param fileData The file on which the comment appears.
-   * @return file contents referred to by the comment. If the comment is a line comment, the result
-   *     will be a list of one string. Otherwise it will be a list of one or more strings.
-   */
-  private List<String> getLinesOfComment(Comment comment, PatchFile fileData) {
-    List<String> lines = new ArrayList<>();
-    if (comment.lineNbr == 0) {
-      // file level comment has no line
-      return lines;
-    }
-    if (comment.range == null) {
-      lines.add(getLine(fileData, comment.side, comment.lineNbr));
-    } else {
-      lines.addAll(getLinesByRange(comment.range, fileData, comment.side));
-    }
-    return lines;
-  }
-
-  /**
-   * @return a shortened version of the given comment's message. Will be shortened to 100 characters
-   *     or the first line, or following the last period within the first 100 characters, whichever
-   *     is shorter. If the message is shortened, an ellipsis is appended.
-   */
-  protected static String getShortenedCommentMessage(String message) {
-    int threshold = 100;
-    String fullMessage = message.trim();
-    String msg = fullMessage;
-
-    if (msg.length() > threshold) {
-      msg = msg.substring(0, threshold);
-    }
-
-    int lf = msg.indexOf('\n');
-    int period = msg.lastIndexOf('.');
-
-    if (lf > 0) {
-      // Truncate if a line feed appears within the threshold.
-      msg = msg.substring(0, lf);
-
-    } else if (period > 0) {
-      // Otherwise truncate if there is a period within the threshold.
-      msg = msg.substring(0, period + 1);
-    }
-
-    // Append an ellipsis if the message has been truncated.
-    if (!msg.equals(fullMessage)) {
-      msg += " […]";
-    }
-
-    return msg;
-  }
-
-  protected static String getShortenedCommentMessage(Comment comment) {
-    return getShortenedCommentMessage(comment.message);
-  }
-
-  /**
-   * @return grouped inline comment data mapped to data structures that are suitable for passing
-   *     into Soy.
-   */
-  private List<Map<String, Object>> getCommentGroupsTemplateData(Repository repo) {
-    List<Map<String, Object>> commentGroups = new ArrayList<>();
-
-    for (CommentSender.FileCommentGroup group : getGroupedInlineComments(repo)) {
-      Map<String, Object> groupData = new HashMap<>();
-      groupData.put("link", group.getLink());
-      groupData.put("title", group.getTitle());
-      groupData.put("patchSetId", group.patchSetId);
-
-      List<Map<String, Object>> commentsList = new ArrayList<>();
-      for (Comment comment : group.comments) {
-        Map<String, Object> commentData = new HashMap<>();
-        commentData.put("lines", getLinesOfComment(comment, group.fileData));
-        commentData.put("message", comment.message.trim());
-        List<CommentFormatter.Block> blocks = CommentFormatter.parse(comment.message);
-        commentData.put("messageBlocks", commentBlocksToSoyData(blocks));
-
-        // Set the prefix.
-        String prefix = getCommentLinePrefix(comment);
-        commentData.put("linePrefix", prefix);
-        commentData.put("linePrefixEmpty", Strings.padStart(": ", prefix.length(), ' '));
-
-        // Set line numbers.
-        int startLine;
-        if (comment.range == null) {
-          startLine = comment.lineNbr;
-        } else {
-          startLine = comment.range.startLine;
-          commentData.put("endLine", comment.range.endLine);
-        }
-        commentData.put("startLine", startLine);
-
-        // Set the comment link.
-        if (comment.lineNbr == 0) {
-          commentData.put("link", group.getLink());
-        } else if (comment.side == 0) {
-          commentData.put("link", group.getLink() + "@a" + startLine);
-        } else {
-          commentData.put("link", group.getLink() + '@' + startLine);
-        }
-
-        // Set robot comment data.
-        if (comment instanceof RobotComment) {
-          RobotComment robotComment = (RobotComment) comment;
-          commentData.put("isRobotComment", true);
-          commentData.put("robotId", robotComment.robotId);
-          commentData.put("robotRunId", robotComment.robotRunId);
-          commentData.put("robotUrl", robotComment.url);
-        } else {
-          commentData.put("isRobotComment", false);
-        }
-
-        // If the comment has a quote, don't bother loading the parent message.
-        if (!hasQuote(blocks)) {
-          // Set parent comment info.
-          Optional<Comment> parent = getParent(comment);
-          if (parent.isPresent()) {
-            commentData.put("parentMessage", getShortenedCommentMessage(parent.get()));
-          }
-        }
-
-        commentsList.add(commentData);
-      }
-      groupData.put("comments", commentsList);
-
-      commentGroups.add(groupData);
-    }
-    return commentGroups;
-  }
-
-  private List<Map<String, Object>> commentBlocksToSoyData(List<CommentFormatter.Block> blocks) {
-    return blocks.stream()
-        .map(
-            b -> {
-              Map<String, Object> map = new HashMap<>();
-              switch (b.type) {
-                case PARAGRAPH:
-                  map.put("type", "paragraph");
-                  map.put("text", b.text);
-                  break;
-                case PRE_FORMATTED:
-                  map.put("type", "pre");
-                  map.put("text", b.text);
-                  break;
-                case QUOTE:
-                  map.put("type", "quote");
-                  map.put("quotedBlocks", commentBlocksToSoyData(b.quotedBlocks));
-                  break;
-                case LIST:
-                  map.put("type", "list");
-                  map.put("items", b.items);
-                  break;
-              }
-              return map;
-            })
-        .collect(toList());
-  }
-
-  private boolean hasQuote(List<CommentFormatter.Block> blocks) {
-    for (CommentFormatter.Block block : blocks) {
-      if (block.type == CommentFormatter.BlockType.QUOTE) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  private Repository getRepository() {
-    try {
-      return args.server.openRepository(projectState.getNameKey());
-    } catch (IOException e) {
-      return null;
-    }
-  }
-
-  @Override
-  protected void setupSoyContext() {
-    super.setupSoyContext();
-    boolean hasComments = false;
-    try (Repository repo = getRepository()) {
-      List<Map<String, Object>> files = getCommentGroupsTemplateData(repo);
-      soyContext.put("commentFiles", files);
-      hasComments = !files.isEmpty();
-    }
-
-    soyContext.put(
-        "patchSetCommentBlocks", commentBlocksToSoyData(CommentFormatter.parse(patchSetComment)));
-    soyContext.put("labels", getLabelVoteSoyData(labels));
-    soyContext.put("commentCount", inlineComments.size());
-    soyContext.put("commentTimestamp", getCommentTimestamp());
-    soyContext.put(
-        "coverLetterBlocks", commentBlocksToSoyData(CommentFormatter.parse(getCoverLetter())));
-
-    footers.add("Gerrit-Comment-Date: " + getCommentTimestamp());
-    footers.add("Gerrit-HasComments: " + (hasComments ? "Yes" : "No"));
-    footers.add("Gerrit-HasLabels: " + (labels.isEmpty() ? "No" : "Yes"));
-  }
-
-  private String getLine(PatchFile fileInfo, short side, int lineNbr) {
-    try {
-      return fileInfo.getLine(side, lineNbr);
-    } catch (IOException err) {
-      // Default to the empty string if the file cannot be safely read.
-      log.warn("Failed to read file on side {}", side, err);
-      return "";
-    } catch (IndexOutOfBoundsException err) {
-      // Default to the empty string if the given line number does not appear
-      // in the file.
-      log.debug("Failed to get line number of file on side {}", side, err);
-      return "";
-    } catch (NoSuchEntityException err) {
-      // Default to the empty string if the side cannot be found.
-      log.warn("Side {} of file didn't exist", side, err);
-      return "";
-    }
-  }
-
-  private List<Map<String, Object>> getLabelVoteSoyData(List<LabelVote> votes) {
-    List<Map<String, Object>> result = new ArrayList<>();
-    for (LabelVote vote : votes) {
-      Map<String, Object> data = new HashMap<>();
-      data.put("label", vote.label());
-
-      // Soy needs the short to be cast as an int for it to get converted to the
-      // correct tamplate type.
-      data.put("value", (int) vote.value());
-      result.add(data);
-    }
-    return result;
-  }
-
-  private String getCommentTimestamp() {
-    // Grouping is currently done by timestamp.
-    return MailUtil.rfcDateformatter.format(
-        ZonedDateTime.ofInstant(timestamp.toInstant(), ZoneId.of("UTC")));
-  }
-
-  @Override
-  protected boolean supportsHtml() {
-    return true;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/CreateChangeSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/CreateChangeSender.java
deleted file mode 100644
index 6d15d6f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/CreateChangeSender.java
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.mail.send;
-
-import com.google.common.collect.Iterables;
-import com.google.gerrit.common.errors.EmailException;
-import com.google.gerrit.extensions.api.changes.RecipientType;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.account.WatchConfig.NotifyType;
-import com.google.gerrit.server.mail.send.ProjectWatch.Watchers;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Notify interested parties of a brand new change. */
-public class CreateChangeSender extends NewChangeSender {
-  private static final Logger log = LoggerFactory.getLogger(CreateChangeSender.class);
-
-  public interface Factory {
-    CreateChangeSender create(Project.NameKey project, Change.Id id);
-  }
-
-  @Inject
-  public CreateChangeSender(
-      EmailArguments ea, @Assisted Project.NameKey project, @Assisted Change.Id id)
-      throws OrmException {
-    super(ea, newChangeData(ea, project, id));
-  }
-
-  @Override
-  protected void init() throws EmailException {
-    super.init();
-
-    try {
-      // Try to mark interested owners with TO and CC or BCC line.
-      Watchers matching =
-          getWatchers(NotifyType.NEW_CHANGES, !change.isWorkInProgress() && !change.isPrivate());
-      for (Account.Id user :
-          Iterables.concat(matching.to.accounts, matching.cc.accounts, matching.bcc.accounts)) {
-        if (isOwnerOfProjectOrBranch(user)) {
-          add(RecipientType.TO, user);
-        }
-      }
-
-      // Add everyone else. Owners added above will not be duplicated.
-      add(RecipientType.TO, matching.to);
-      add(RecipientType.CC, matching.cc);
-      add(RecipientType.BCC, matching.bcc);
-    } catch (OrmException err) {
-      // Just don't CC everyone. Better to send a partial message to those
-      // we already have queued up then to fail deliver entirely to people
-      // who have a lower interest in the change.
-      log.warn("Cannot notify watchers for new change", err);
-    }
-
-    includeWatchers(NotifyType.NEW_PATCHSETS, !change.isWorkInProgress() && !change.isPrivate());
-  }
-
-  private boolean isOwnerOfProjectOrBranch(Account.Id user) {
-    return projectState != null
-        && projectState
-            .controlFor(args.identifiedUserFactory.create(user))
-            .controlForRef(change.getDest())
-            .isOwner();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/DeleteReviewerSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/DeleteReviewerSender.java
deleted file mode 100644
index 0fea7ce..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/DeleteReviewerSender.java
+++ /dev/null
@@ -1,103 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.send;
-
-import com.google.gerrit.common.errors.EmailException;
-import com.google.gerrit.extensions.api.changes.RecipientType;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.account.WatchConfig.NotifyType;
-import com.google.gerrit.server.mail.Address;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/** Let users know that a reviewer and possibly her review have been removed. */
-public class DeleteReviewerSender extends ReplyToChangeSender {
-  private final Set<Account.Id> reviewers = new HashSet<>();
-  private final Set<Address> reviewersByEmail = new HashSet<>();
-
-  public interface Factory extends ReplyToChangeSender.Factory<DeleteReviewerSender> {
-    @Override
-    DeleteReviewerSender create(Project.NameKey project, Change.Id change);
-  }
-
-  @Inject
-  public DeleteReviewerSender(
-      EmailArguments ea, @Assisted Project.NameKey project, @Assisted Change.Id id)
-      throws OrmException {
-    super(ea, "deleteReviewer", newChangeData(ea, project, id));
-  }
-
-  public void addReviewers(Collection<Account.Id> cc) {
-    reviewers.addAll(cc);
-  }
-
-  public void addReviewersByEmail(Collection<Address> cc) {
-    reviewersByEmail.addAll(cc);
-  }
-
-  @Override
-  protected void init() throws EmailException {
-    super.init();
-
-    ccAllApprovals();
-    bccStarredBy();
-    ccExistingReviewers();
-    includeWatchers(NotifyType.ALL_COMMENTS);
-    add(RecipientType.TO, reviewers);
-    addByEmail(RecipientType.TO, reviewersByEmail);
-    removeUsersThatIgnoredTheChange();
-  }
-
-  @Override
-  protected void formatChange() throws EmailException {
-    appendText(textTemplate("DeleteReviewer"));
-    if (useHtml()) {
-      appendHtml(soyHtmlTemplate("DeleteReviewerHtml"));
-    }
-  }
-
-  public List<String> getReviewerNames() {
-    if (reviewers.isEmpty() && reviewersByEmail.isEmpty()) {
-      return null;
-    }
-    List<String> names = new ArrayList<>();
-    for (Account.Id id : reviewers) {
-      names.add(getNameFor(id));
-    }
-    for (Address a : reviewersByEmail) {
-      names.add(a.toString());
-    }
-    return names;
-  }
-
-  @Override
-  protected void setupSoyContext() {
-    super.setupSoyContext();
-    soyContextEmailData.put("reviewerNames", getReviewerNames());
-  }
-
-  @Override
-  protected boolean supportsHtml() {
-    return true;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/DeleteVoteSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/DeleteVoteSender.java
deleted file mode 100644
index 8509f73..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/DeleteVoteSender.java
+++ /dev/null
@@ -1,61 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.send;
-
-import com.google.gerrit.common.errors.EmailException;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.account.WatchConfig.NotifyType;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-
-/** Send notice about a vote that was removed from a change. */
-public class DeleteVoteSender extends ReplyToChangeSender {
-  public interface Factory extends ReplyToChangeSender.Factory<DeleteVoteSender> {
-    @Override
-    DeleteVoteSender create(Project.NameKey project, Change.Id change);
-  }
-
-  @Inject
-  protected DeleteVoteSender(
-      EmailArguments ea, @Assisted Project.NameKey project, @Assisted Change.Id id)
-      throws OrmException {
-    super(ea, "deleteVote", newChangeData(ea, project, id));
-  }
-
-  @Override
-  protected void init() throws EmailException {
-    super.init();
-
-    ccAllApprovals();
-    bccStarredBy();
-    includeWatchers(NotifyType.ALL_COMMENTS);
-    removeUsersThatIgnoredTheChange();
-  }
-
-  @Override
-  protected void formatChange() throws EmailException {
-    appendText(textTemplate("DeleteVote"));
-    if (useHtml()) {
-      appendHtml(soyHtmlTemplate("DeleteVoteHtml"));
-    }
-  }
-
-  @Override
-  protected boolean supportsHtml() {
-    return true;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/EmailArguments.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/EmailArguments.java
deleted file mode 100644
index 869d7d1..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/EmailArguments.java
+++ /dev/null
@@ -1,148 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.send;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.AnonymousUser;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.GerritPersonIdentProvider;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.IdentifiedUser.GenericFactory;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.GroupIncludeCache;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.config.AnonymousCowardName;
-import com.google.gerrit.server.config.CanonicalWebUrl;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.group.Groups;
-import com.google.gerrit.server.mail.EmailSettings;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.patch.PatchListCache;
-import com.google.gerrit.server.patch.PatchSetInfoFactory;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.query.account.InternalAccountQuery;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.ChangeQueryBuilder;
-import com.google.gerrit.server.ssh.SshAdvertisedAddresses;
-import com.google.gerrit.server.validators.OutgoingEmailValidationListener;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.template.soy.tofu.SoyTofu;
-import java.util.List;
-import org.apache.velocity.runtime.RuntimeInstance;
-import org.eclipse.jgit.lib.PersonIdent;
-
-public class EmailArguments {
-  final GitRepositoryManager server;
-  final ProjectCache projectCache;
-  final PermissionBackend permissionBackend;
-  final GroupBackend groupBackend;
-  final GroupIncludeCache groupIncludes;
-  final Groups groups;
-  final AccountCache accountCache;
-  final PatchListCache patchListCache;
-  final ApprovalsUtil approvalsUtil;
-  final FromAddressGenerator fromAddressGenerator;
-  final EmailSender emailSender;
-  final PatchSetInfoFactory patchSetInfoFactory;
-  final IdentifiedUser.GenericFactory identifiedUserFactory;
-  final ChangeNotes.Factory changeNotesFactory;
-  final AnonymousUser anonymousUser;
-  final String anonymousCowardName;
-  final PersonIdent gerritPersonIdent;
-  final Provider<String> urlProvider;
-  final AllProjectsName allProjectsName;
-  final List<String> sshAddresses;
-  final SitePaths site;
-
-  final ChangeQueryBuilder queryBuilder;
-  final Provider<ReviewDb> db;
-  final ChangeData.Factory changeDataFactory;
-  final RuntimeInstance velocityRuntime;
-  final SoyTofu soyTofu;
-  final EmailSettings settings;
-  final DynamicSet<OutgoingEmailValidationListener> outgoingEmailValidationListeners;
-  final Provider<InternalAccountQuery> accountQueryProvider;
-  final OutgoingEmailValidator validator;
-
-  @Inject
-  EmailArguments(
-      GitRepositoryManager server,
-      ProjectCache projectCache,
-      PermissionBackend permissionBackend,
-      GroupBackend groupBackend,
-      GroupIncludeCache groupIncludes,
-      AccountCache accountCache,
-      PatchListCache patchListCache,
-      ApprovalsUtil approvalsUtil,
-      FromAddressGenerator fromAddressGenerator,
-      EmailSender emailSender,
-      PatchSetInfoFactory patchSetInfoFactory,
-      GenericFactory identifiedUserFactory,
-      ChangeNotes.Factory changeNotesFactory,
-      AnonymousUser anonymousUser,
-      @AnonymousCowardName String anonymousCowardName,
-      GerritPersonIdentProvider gerritPersonIdentProvider,
-      Groups groups,
-      @CanonicalWebUrl @Nullable Provider<String> urlProvider,
-      AllProjectsName allProjectsName,
-      ChangeQueryBuilder queryBuilder,
-      Provider<ReviewDb> db,
-      ChangeData.Factory changeDataFactory,
-      RuntimeInstance velocityRuntime,
-      @MailTemplates SoyTofu soyTofu,
-      EmailSettings settings,
-      @SshAdvertisedAddresses List<String> sshAddresses,
-      SitePaths site,
-      DynamicSet<OutgoingEmailValidationListener> outgoingEmailValidationListeners,
-      Provider<InternalAccountQuery> accountQueryProvider,
-      OutgoingEmailValidator validator) {
-    this.server = server;
-    this.projectCache = projectCache;
-    this.permissionBackend = permissionBackend;
-    this.groupBackend = groupBackend;
-    this.groupIncludes = groupIncludes;
-    this.accountCache = accountCache;
-    this.patchListCache = patchListCache;
-    this.approvalsUtil = approvalsUtil;
-    this.fromAddressGenerator = fromAddressGenerator;
-    this.emailSender = emailSender;
-    this.patchSetInfoFactory = patchSetInfoFactory;
-    this.identifiedUserFactory = identifiedUserFactory;
-    this.changeNotesFactory = changeNotesFactory;
-    this.anonymousUser = anonymousUser;
-    this.anonymousCowardName = anonymousCowardName;
-    this.gerritPersonIdent = gerritPersonIdentProvider.get();
-    this.groups = groups;
-    this.urlProvider = urlProvider;
-    this.allProjectsName = allProjectsName;
-    this.queryBuilder = queryBuilder;
-    this.db = db;
-    this.changeDataFactory = changeDataFactory;
-    this.velocityRuntime = velocityRuntime;
-    this.soyTofu = soyTofu;
-    this.settings = settings;
-    this.sshAddresses = sshAddresses;
-    this.site = site;
-    this.outgoingEmailValidationListeners = outgoingEmailValidationListeners;
-    this.accountQueryProvider = accountQueryProvider;
-    this.validator = validator;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/EmailHeader.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/EmailHeader.java
deleted file mode 100644
index 0bfe428..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/EmailHeader.java
+++ /dev/null
@@ -1,239 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.mail.send;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.base.MoreObjects;
-import com.google.gerrit.server.mail.Address;
-import java.io.IOException;
-import java.io.Writer;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Objects;
-
-public abstract class EmailHeader {
-  public abstract boolean isEmpty();
-
-  public abstract void write(Writer w) throws IOException;
-
-  public static class String extends EmailHeader {
-    private final java.lang.String value;
-
-    public String(java.lang.String v) {
-      value = v;
-    }
-
-    public java.lang.String getString() {
-      return value;
-    }
-
-    @Override
-    public boolean isEmpty() {
-      return value == null || value.length() == 0;
-    }
-
-    @Override
-    public void write(Writer w) throws IOException {
-      if (needsQuotedPrintable(value)) {
-        w.write(quotedPrintable(value));
-      } else {
-        w.write(value);
-      }
-    }
-
-    @Override
-    public int hashCode() {
-      return Objects.hashCode(value);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-      return (o instanceof String) && Objects.equals(value, ((String) o).value);
-    }
-
-    @Override
-    public java.lang.String toString() {
-      return MoreObjects.toStringHelper(this).addValue(value).toString();
-    }
-  }
-
-  public static boolean needsQuotedPrintable(java.lang.String value) {
-    for (int i = 0; i < value.length(); i++) {
-      if (value.charAt(i) < ' ' || '~' < value.charAt(i)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  static boolean needsQuotedPrintableWithinPhrase(int cp) {
-    switch (cp) {
-      case '!':
-      case '*':
-      case '+':
-      case '-':
-      case '/':
-      case '=':
-      case '_':
-        return false;
-      default:
-        if (('a' <= cp && cp <= 'z') || ('A' <= cp && cp <= 'Z') || ('0' <= cp && cp <= '9')) {
-          return false;
-        }
-        return true;
-    }
-  }
-
-  public static java.lang.String quotedPrintable(java.lang.String value) {
-    final StringBuilder r = new StringBuilder();
-
-    r.append("=?UTF-8?Q?");
-    for (int i = 0; i < value.length(); i++) {
-      final int cp = value.codePointAt(i);
-      if (cp == ' ') {
-        r.append('_');
-
-      } else if (needsQuotedPrintableWithinPhrase(cp)) {
-        byte[] buf = new java.lang.String(Character.toChars(cp)).getBytes(UTF_8);
-        for (byte b : buf) {
-          r.append('=');
-          r.append(Integer.toHexString((b >>> 4) & 0x0f).toUpperCase());
-          r.append(Integer.toHexString(b & 0x0f).toUpperCase());
-        }
-
-      } else {
-        r.append(Character.toChars(cp));
-      }
-    }
-    r.append("?=");
-
-    return r.toString();
-  }
-
-  public static class Date extends EmailHeader {
-    private final java.util.Date value;
-
-    public Date(java.util.Date v) {
-      value = v;
-    }
-
-    public java.util.Date getDate() {
-      return value;
-    }
-
-    @Override
-    public boolean isEmpty() {
-      return value == null;
-    }
-
-    @Override
-    public void write(Writer w) throws IOException {
-      final SimpleDateFormat fmt;
-      // Mon, 1 Jun 2009 10:49:44 -0700
-      fmt = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.US);
-      w.write(fmt.format(value));
-    }
-
-    @Override
-    public int hashCode() {
-      return Objects.hashCode(value);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-      return (o instanceof Date) && Objects.equals(value, ((Date) o).value);
-    }
-
-    @Override
-    public java.lang.String toString() {
-      return MoreObjects.toStringHelper(this).addValue(value).toString();
-    }
-  }
-
-  public static class AddressList extends EmailHeader {
-    private final List<Address> list = new ArrayList<>();
-
-    public AddressList() {}
-
-    public AddressList(Address addr) {
-      add(addr);
-    }
-
-    public List<Address> getAddressList() {
-      return Collections.unmodifiableList(list);
-    }
-
-    public void add(Address addr) {
-      list.add(addr);
-    }
-
-    void remove(java.lang.String email) {
-      for (Iterator<Address> i = list.iterator(); i.hasNext(); ) {
-        if (i.next().getEmail().equals(email)) {
-          i.remove();
-        }
-      }
-    }
-
-    @Override
-    public boolean isEmpty() {
-      return list.isEmpty();
-    }
-
-    @Override
-    public void write(Writer w) throws IOException {
-      int len = 8;
-      boolean firstAddress = true;
-      boolean needComma = false;
-      for (Address addr : list) {
-        java.lang.String s = addr.toHeaderString();
-        if (firstAddress) {
-          firstAddress = false;
-        } else if (72 < len + s.length()) {
-          w.write(",\r\n\t");
-          len = 8;
-          needComma = false;
-        }
-
-        if (needComma) {
-          w.write(", ");
-        }
-        w.write(s);
-        len += s.length();
-        needComma = true;
-      }
-    }
-
-    @Override
-    public int hashCode() {
-      return Objects.hashCode(list);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-      return (o instanceof AddressList) && Objects.equals(list, ((AddressList) o).list);
-    }
-
-    @Override
-    public java.lang.String toString() {
-      return MoreObjects.toStringHelper(this).addValue(list).toString();
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/EmailSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/EmailSender.java
deleted file mode 100644
index 23fa1fe..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/EmailSender.java
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.mail.send;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.errors.EmailException;
-import com.google.gerrit.server.mail.Address;
-import java.util.Collection;
-import java.util.Map;
-
-/** Sends email messages to third parties. */
-public interface EmailSender {
-  boolean isEnabled();
-
-  /**
-   * Can the address receive messages from us?
-   *
-   * @param address the address to consider.
-   * @return true if this sender will deliver to the address.
-   */
-  boolean canEmail(String address);
-
-  /**
-   * Sends an email message. Messages always contain a text body, but messages can optionally
-   * include an additional HTML body. If both body types are present, {@code send} should construct
-   * a {@code multipart/alternative} message with an appropriately-selected boundary.
-   *
-   * @param from who the message is from.
-   * @param rcpt one or more address where the message will be delivered to. This list overrides any
-   *     To or CC headers in {@code headers}.
-   * @param headers message headers.
-   * @param textBody text to appear in the {@code text/plain} body of the message.
-   * @param htmlBody optional HTML code to appear in the {@code text/html} body of the message.
-   * @throws EmailException the message cannot be sent.
-   */
-  default void send(
-      Address from,
-      Collection<Address> rcpt,
-      Map<String, EmailHeader> headers,
-      String textBody,
-      @Nullable String htmlBody)
-      throws EmailException {
-    send(from, rcpt, headers, textBody);
-  }
-
-  /**
-   * Sends an email message with a text body only (i.e. not HTML or multipart).
-   *
-   * <p>Authors of new implementations of this interface should not use this method to send a
-   * message because this method does not accept the HTML body. Instead, authors should use the
-   * above signature of {@code send}.
-   *
-   * <p>This version of the method is preserved for support of legacy implementations.
-   *
-   * @param from who the message is from.
-   * @param rcpt one or more address where the message will be delivered to. This list overrides any
-   *     To or CC headers in {@code headers}.
-   * @param headers message headers.
-   * @param body text to appear in the body of the message.
-   * @throws EmailException the message cannot be sent.
-   */
-  void send(Address from, Collection<Address> rcpt, Map<String, EmailHeader> headers, String body)
-      throws EmailException;
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/FromAddressGenerator.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/FromAddressGenerator.java
deleted file mode 100644
index 2489063..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/FromAddressGenerator.java
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.mail.send;
-
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.mail.Address;
-
-/** Constructs an address to send email from. */
-public interface FromAddressGenerator {
-  boolean isGenericAddress(Account.Id fromId);
-
-  Address from(Account.Id fromId);
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/FromAddressGeneratorProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/FromAddressGeneratorProvider.java
deleted file mode 100644
index c2c6834..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/FromAddressGeneratorProvider.java
+++ /dev/null
@@ -1,239 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.mail.send;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.gerrit.common.data.ParameterizedString;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.config.AnonymousCowardName;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.mail.MailUtil;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.util.regex.Pattern;
-import org.apache.commons.codec.binary.Base64;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.PersonIdent;
-
-/** Creates a {@link FromAddressGenerator} from the {@link GerritServerConfig} */
-@Singleton
-public class FromAddressGeneratorProvider implements Provider<FromAddressGenerator> {
-  private final FromAddressGenerator generator;
-
-  @Inject
-  FromAddressGeneratorProvider(
-      @GerritServerConfig Config cfg,
-      @AnonymousCowardName String anonymousCowardName,
-      @GerritPersonIdent PersonIdent myIdent,
-      AccountCache accountCache) {
-    final String from = cfg.getString("sendemail", null, "from");
-    final Address srvAddr = toAddress(myIdent);
-
-    if (from == null || "MIXED".equalsIgnoreCase(from)) {
-      ParameterizedString name = new ParameterizedString("${user} (Code Review)");
-      generator =
-          new PatternGen(srvAddr, accountCache, anonymousCowardName, name, srvAddr.getEmail());
-    } else if ("USER".equalsIgnoreCase(from)) {
-      String[] domains = cfg.getStringList("sendemail", null, "allowedDomain");
-      Pattern domainPattern = MailUtil.glob(domains);
-      ParameterizedString namePattern = new ParameterizedString("${user} (Code Review)");
-      generator =
-          new UserGen(accountCache, domainPattern, anonymousCowardName, namePattern, srvAddr);
-    } else if ("SERVER".equalsIgnoreCase(from)) {
-      generator = new ServerGen(srvAddr);
-    } else {
-      final Address a = Address.parse(from);
-      final ParameterizedString name =
-          a.getName() != null ? new ParameterizedString(a.getName()) : null;
-      if (name == null || name.getParameterNames().isEmpty()) {
-        generator = new ServerGen(a);
-      } else {
-        generator = new PatternGen(srvAddr, accountCache, anonymousCowardName, name, a.getEmail());
-      }
-    }
-  }
-
-  private static Address toAddress(PersonIdent myIdent) {
-    return new Address(myIdent.getName(), myIdent.getEmailAddress());
-  }
-
-  @Override
-  public FromAddressGenerator get() {
-    return generator;
-  }
-
-  static final class UserGen implements FromAddressGenerator {
-    private final AccountCache accountCache;
-    private final Pattern domainPattern;
-    private final String anonymousCowardName;
-    private final ParameterizedString nameRewriteTmpl;
-    private final Address serverAddress;
-
-    /**
-     * From address generator for USER mode
-     *
-     * @param accountCache get user account from id
-     * @param domainPattern allowed user domain pattern that Gerrit can send as the user
-     * @param anonymousCowardName name used when user's full name is missing
-     * @param nameRewriteTmpl name template used for rewriting the sender's name when Gerrit can not
-     *     send as the user
-     * @param serverAddress serverAddress.name is used when fromId is null and serverAddress.email
-     *     is used when Gerrit can not send as the user
-     */
-    UserGen(
-        AccountCache accountCache,
-        Pattern domainPattern,
-        String anonymousCowardName,
-        ParameterizedString nameRewriteTmpl,
-        Address serverAddress) {
-      this.accountCache = accountCache;
-      this.domainPattern = domainPattern;
-      this.anonymousCowardName = anonymousCowardName;
-      this.nameRewriteTmpl = nameRewriteTmpl;
-      this.serverAddress = serverAddress;
-    }
-
-    @Override
-    public boolean isGenericAddress(Account.Id fromId) {
-      return false;
-    }
-
-    @Override
-    public Address from(Account.Id fromId) {
-      String senderName;
-      if (fromId != null) {
-        Account a = accountCache.get(fromId).getAccount();
-        String fullName = a.getFullName();
-        String userEmail = a.getPreferredEmail();
-        if (canRelay(userEmail)) {
-          return new Address(fullName, userEmail);
-        }
-
-        if (fullName == null || "".equals(fullName.trim())) {
-          fullName = anonymousCowardName;
-        }
-        senderName = nameRewriteTmpl.replace("user", fullName).toString();
-      } else {
-        senderName = serverAddress.getName();
-      }
-
-      String senderEmail;
-      ParameterizedString senderEmailPattern = new ParameterizedString(serverAddress.getEmail());
-      if (senderEmailPattern.getParameterNames().isEmpty()) {
-        senderEmail = senderEmailPattern.getRawPattern();
-      } else {
-        senderEmail = senderEmailPattern.replace("userHash", hashOf(senderName)).toString();
-      }
-      return new Address(senderName, senderEmail);
-    }
-
-    /** check if Gerrit is allowed to send from {@code userEmail}. */
-    private boolean canRelay(String userEmail) {
-      if (userEmail != null) {
-        int index = userEmail.indexOf('@');
-        if (index > 0 && index < userEmail.length() - 1) {
-          return domainPattern.matcher(userEmail.substring(index + 1)).matches();
-        }
-      }
-      return false;
-    }
-  }
-
-  static final class ServerGen implements FromAddressGenerator {
-    private final Address srvAddr;
-
-    ServerGen(Address srvAddr) {
-      this.srvAddr = srvAddr;
-    }
-
-    @Override
-    public boolean isGenericAddress(Account.Id fromId) {
-      return true;
-    }
-
-    @Override
-    public Address from(Account.Id fromId) {
-      return srvAddr;
-    }
-  }
-
-  static final class PatternGen implements FromAddressGenerator {
-    private final ParameterizedString senderEmailPattern;
-    private final Address serverAddress;
-    private final AccountCache accountCache;
-    private final String anonymousCowardName;
-    private final ParameterizedString namePattern;
-
-    PatternGen(
-        final Address serverAddress,
-        final AccountCache accountCache,
-        final String anonymousCowardName,
-        final ParameterizedString namePattern,
-        final String senderEmail) {
-      this.senderEmailPattern = new ParameterizedString(senderEmail);
-      this.serverAddress = serverAddress;
-      this.accountCache = accountCache;
-      this.anonymousCowardName = anonymousCowardName;
-      this.namePattern = namePattern;
-    }
-
-    @Override
-    public boolean isGenericAddress(Account.Id fromId) {
-      return false;
-    }
-
-    @Override
-    public Address from(Account.Id fromId) {
-      final String senderName;
-
-      if (fromId != null) {
-        final Account account = accountCache.get(fromId).getAccount();
-        String fullName = account.getFullName();
-        if (fullName == null || "".equals(fullName)) {
-          fullName = anonymousCowardName;
-        }
-        senderName = namePattern.replace("user", fullName).toString();
-
-      } else {
-        senderName = serverAddress.getName();
-      }
-
-      String senderEmail;
-      if (senderEmailPattern.getParameterNames().isEmpty()) {
-        senderEmail = senderEmailPattern.getRawPattern();
-      } else {
-        senderEmail = senderEmailPattern.replace("userHash", hashOf(senderName)).toString();
-      }
-      return new Address(senderName, senderEmail);
-    }
-  }
-
-  private static String hashOf(String data) {
-    try {
-      MessageDigest hash = MessageDigest.getInstance("MD5");
-      byte[] bytes = hash.digest(data.getBytes(UTF_8));
-      return Base64.encodeBase64URLSafeString(bytes);
-    } catch (NoSuchAlgorithmException e) {
-      throw new RuntimeException("No MD5 available", e);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/MailSoyTofuProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/MailSoyTofuProvider.java
deleted file mode 100644
index b267275..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/MailSoyTofuProvider.java
+++ /dev/null
@@ -1,113 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.send;
-
-import com.google.common.io.CharStreams;
-import com.google.common.io.Resources;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.ProvisionException;
-import com.google.inject.Singleton;
-import com.google.template.soy.SoyFileSet;
-import com.google.template.soy.shared.SoyAstCache;
-import com.google.template.soy.tofu.SoyTofu;
-import java.io.IOException;
-import java.io.Reader;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Path;
-
-/** Configures Soy Tofu object for rendering email templates. */
-@Singleton
-public class MailSoyTofuProvider implements Provider<SoyTofu> {
-
-  // Note: will fail to construct the tofu object if this array is empty.
-  private static final String[] TEMPLATES = {
-    "Abandoned.soy",
-    "AbandonedHtml.soy",
-    "AddKey.soy",
-    "AddKeyHtml.soy",
-    "ChangeFooter.soy",
-    "ChangeFooterHtml.soy",
-    "ChangeSubject.soy",
-    "Comment.soy",
-    "CommentHtml.soy",
-    "CommentFooter.soy",
-    "CommentFooterHtml.soy",
-    "DeleteReviewer.soy",
-    "DeleteReviewerHtml.soy",
-    "DeleteVote.soy",
-    "DeleteVoteHtml.soy",
-    "Footer.soy",
-    "FooterHtml.soy",
-    "HeaderHtml.soy",
-    "Merged.soy",
-    "MergedHtml.soy",
-    "NewChange.soy",
-    "NewChangeHtml.soy",
-    "Private.soy",
-    "RegisterNewEmail.soy",
-    "ReplacePatchSet.soy",
-    "ReplacePatchSetHtml.soy",
-    "Restored.soy",
-    "RestoredHtml.soy",
-    "Reverted.soy",
-    "RevertedHtml.soy",
-    "SetAssignee.soy",
-    "SetAssigneeHtml.soy",
-  };
-
-  private final SitePaths site;
-  private final SoyAstCache cache;
-
-  @Inject
-  MailSoyTofuProvider(SitePaths site, SoyAstCache cache) {
-    this.site = site;
-    this.cache = cache;
-  }
-
-  @Override
-  public SoyTofu get() throws ProvisionException {
-    SoyFileSet.Builder builder = SoyFileSet.builder();
-    builder.setSoyAstCache(cache);
-    for (String name : TEMPLATES) {
-      addTemplate(builder, name);
-    }
-    return builder.build().compileToTofu();
-  }
-
-  private void addTemplate(SoyFileSet.Builder builder, String name) throws ProvisionException {
-    // Load as a file in the mail templates directory if present.
-    Path tmpl = site.mail_dir.resolve(name);
-    if (Files.isRegularFile(tmpl)) {
-      String content;
-      // TODO(davido): Consider using JGit's FileSnapshot to cache based on
-      // mtime.
-      try (Reader r = Files.newBufferedReader(tmpl, StandardCharsets.UTF_8)) {
-        content = CharStreams.toString(r);
-      } catch (IOException err) {
-        throw new ProvisionException(
-            "Failed to read template file " + tmpl.toAbsolutePath().toString(), err);
-      }
-      builder.add(content, tmpl.toAbsolutePath().toString());
-      return;
-    }
-
-    // Otherwise load the template as a resource.
-    String resourcePath = "com/google/gerrit/server/mail/" + name;
-    builder.add(Resources.getResource(resourcePath));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/MergedSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/MergedSender.java
deleted file mode 100644
index 425ac65..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/MergedSender.java
+++ /dev/null
@@ -1,145 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.mail.send;
-
-import com.google.common.collect.HashBasedTable;
-import com.google.common.collect.Table;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.LabelTypes;
-import com.google.gerrit.common.data.LabelValue;
-import com.google.gerrit.common.errors.EmailException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.account.WatchConfig.NotifyType;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-
-/** Send notice about a change successfully merged. */
-public class MergedSender extends ReplyToChangeSender {
-  public interface Factory {
-    MergedSender create(Project.NameKey project, Change.Id id);
-  }
-
-  private final LabelTypes labelTypes;
-
-  @Inject
-  public MergedSender(EmailArguments ea, @Assisted Project.NameKey project, @Assisted Change.Id id)
-      throws OrmException {
-    super(ea, "merged", newChangeData(ea, project, id));
-    labelTypes = changeData.getLabelTypes();
-  }
-
-  @Override
-  protected void init() throws EmailException {
-    super.init();
-
-    ccAllApprovals();
-    bccStarredBy();
-    includeWatchers(NotifyType.ALL_COMMENTS);
-    includeWatchers(NotifyType.SUBMITTED_CHANGES);
-    removeUsersThatIgnoredTheChange();
-  }
-
-  @Override
-  protected void formatChange() throws EmailException {
-    appendText(textTemplate("Merged"));
-
-    if (useHtml()) {
-      appendHtml(soyHtmlTemplate("MergedHtml"));
-    }
-  }
-
-  public String getApprovals() {
-    try {
-      Table<Account.Id, String, PatchSetApproval> pos = HashBasedTable.create();
-      Table<Account.Id, String, PatchSetApproval> neg = HashBasedTable.create();
-      for (PatchSetApproval ca :
-          args.approvalsUtil.byPatchSet(
-              args.db.get(),
-              changeData.notes(),
-              args.identifiedUserFactory.create(changeData.change().getOwner()),
-              patchSet.getId(),
-              null,
-              null)) {
-        LabelType lt = labelTypes.byLabel(ca.getLabelId());
-        if (lt == null) {
-          continue;
-        }
-        if (ca.getValue() > 0) {
-          pos.put(ca.getAccountId(), lt.getName(), ca);
-        } else if (ca.getValue() < 0) {
-          neg.put(ca.getAccountId(), lt.getName(), ca);
-        }
-      }
-
-      return format("Approvals", pos) + format("Objections", neg);
-    } catch (OrmException err) {
-      // Don't list the approvals
-    }
-    return "";
-  }
-
-  private String format(String type, Table<Account.Id, String, PatchSetApproval> approvals) {
-    StringBuilder txt = new StringBuilder();
-    if (approvals.isEmpty()) {
-      return "";
-    }
-    txt.append(type).append(":\n");
-    for (Account.Id id : approvals.rowKeySet()) {
-      txt.append("  ");
-      txt.append(getNameFor(id));
-      txt.append(": ");
-      boolean first = true;
-      for (LabelType lt : labelTypes.getLabelTypes()) {
-        PatchSetApproval ca = approvals.get(id, lt.getName());
-        if (ca == null) {
-          continue;
-        }
-
-        if (first) {
-          first = false;
-        } else {
-          txt.append("; ");
-        }
-
-        LabelValue v = lt.getValue(ca);
-        if (v != null) {
-          txt.append(v.getText());
-        } else {
-          txt.append(lt.getName());
-          txt.append('=');
-          txt.append(LabelValue.formatValue(ca.getValue()));
-        }
-      }
-      txt.append('\n');
-    }
-    txt.append('\n');
-    return txt.toString();
-  }
-
-  @Override
-  protected void setupSoyContext() {
-    super.setupSoyContext();
-    soyContextEmailData.put("approvals", getApprovals());
-  }
-
-  @Override
-  protected boolean supportsHtml() {
-    return true;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/NewChangeSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/NewChangeSender.java
deleted file mode 100644
index 9f94fa3..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/NewChangeSender.java
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.mail.send;
-
-import com.google.gerrit.common.errors.EmailException;
-import com.google.gerrit.extensions.api.changes.RecipientType;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gwtorm.server.OrmException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/** Sends an email alerting a user to a new change for them to review. */
-public abstract class NewChangeSender extends ChangeEmail {
-  private final Set<Account.Id> reviewers = new HashSet<>();
-  private final Set<Address> reviewersByEmail = new HashSet<>();
-  private final Set<Account.Id> extraCC = new HashSet<>();
-  private final Set<Address> extraCCByEmail = new HashSet<>();
-
-  protected NewChangeSender(EmailArguments ea, ChangeData cd) throws OrmException {
-    super(ea, "newchange", cd);
-  }
-
-  public void addReviewers(Collection<Account.Id> cc) {
-    reviewers.addAll(cc);
-  }
-
-  public void addReviewersByEmail(Collection<Address> cc) {
-    reviewersByEmail.addAll(cc);
-  }
-
-  public void addExtraCC(Collection<Account.Id> cc) {
-    extraCC.addAll(cc);
-  }
-
-  public void addExtraCCByEmail(Collection<Address> cc) {
-    extraCCByEmail.addAll(cc);
-  }
-
-  @Override
-  protected void init() throws EmailException {
-    super.init();
-
-    setHeader("Message-ID", getChangeMessageThreadId());
-
-    switch (notify) {
-      case NONE:
-      case OWNER:
-        break;
-      case ALL:
-      default:
-        add(RecipientType.CC, extraCC);
-        extraCCByEmail.stream().forEach(cc -> add(RecipientType.CC, cc));
-        // $FALL-THROUGH$
-      case OWNER_REVIEWERS:
-        add(RecipientType.TO, reviewers, true);
-        addByEmail(RecipientType.TO, reviewersByEmail, true);
-        break;
-    }
-
-    rcptToAuthors(RecipientType.CC);
-  }
-
-  @Override
-  protected void formatChange() throws EmailException {
-    appendText(textTemplate("NewChange"));
-    if (useHtml()) {
-      appendHtml(soyHtmlTemplate("NewChangeHtml"));
-    }
-  }
-
-  public List<String> getReviewerNames() {
-    if (reviewers.isEmpty()) {
-      return null;
-    }
-    List<String> names = new ArrayList<>();
-    for (Account.Id id : reviewers) {
-      names.add(getNameFor(id));
-    }
-    return names;
-  }
-
-  @Override
-  protected void setupSoyContext() {
-    super.setupSoyContext();
-    soyContext.put("ownerName", getNameFor(change.getOwner()));
-    soyContextEmailData.put("reviewerNames", getReviewerNames());
-  }
-
-  @Override
-  protected boolean supportsHtml() {
-    return true;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/NotificationEmail.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/NotificationEmail.java
deleted file mode 100644
index bceac72..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/NotificationEmail.java
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.mail.send;
-
-import com.google.common.collect.Iterables;
-import com.google.gerrit.common.errors.EmailException;
-import com.google.gerrit.extensions.api.changes.RecipientType;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.server.account.WatchConfig.NotifyType;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.mail.send.ProjectWatch.Watchers;
-import com.google.gwtorm.server.OrmException;
-import java.util.HashMap;
-import java.util.Map;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Common class for notifications that are related to a project and branch */
-public abstract class NotificationEmail extends OutgoingEmail {
-  private static final Logger log = LoggerFactory.getLogger(NotificationEmail.class);
-
-  protected Branch.NameKey branch;
-
-  protected NotificationEmail(EmailArguments ea, String mc, Branch.NameKey branch) {
-    super(ea, mc);
-    this.branch = branch;
-  }
-
-  @Override
-  protected void init() throws EmailException {
-    super.init();
-    setListIdHeader();
-  }
-
-  private void setListIdHeader() throws EmailException {
-    // Set a reasonable list id so that filters can be used to sort messages
-    setVHeader("List-Id", "<$email.listId.replace('@', '.')>");
-    if (getSettingsUrl() != null) {
-      setVHeader("List-Unsubscribe", "<$email.settingsUrl>");
-    }
-  }
-
-  public String getListId() throws EmailException {
-    return velocify("gerrit-$projectName.replace('/', '-')@$email.gerritHost");
-  }
-
-  /** Include users and groups that want notification of events. */
-  protected void includeWatchers(NotifyType type) {
-    includeWatchers(type, true);
-  }
-
-  /** Include users and groups that want notification of events. */
-  protected void includeWatchers(NotifyType type, boolean includeWatchersFromNotifyConfig) {
-    try {
-      Watchers matching = getWatchers(type, includeWatchersFromNotifyConfig);
-      add(RecipientType.TO, matching.to);
-      add(RecipientType.CC, matching.cc);
-      add(RecipientType.BCC, matching.bcc);
-    } catch (OrmException err) {
-      // Just don't CC everyone. Better to send a partial message to those
-      // we already have queued up then to fail deliver entirely to people
-      // who have a lower interest in the change.
-      log.warn("Cannot BCC watchers for " + type, err);
-    }
-  }
-
-  /** Returns all watchers that are relevant */
-  protected abstract Watchers getWatchers(NotifyType type, boolean includeWatchersFromNotifyConfig)
-      throws OrmException;
-
-  /** Add users or email addresses to the TO, CC, or BCC list. */
-  protected void add(RecipientType type, Watchers.List list) {
-    for (Account.Id user : list.accounts) {
-      add(type, user);
-    }
-    for (Address addr : list.emails) {
-      add(type, addr);
-    }
-  }
-
-  public String getSshHost() {
-    String host = Iterables.getFirst(args.sshAddresses, null);
-    if (host == null) {
-      return null;
-    }
-    if (host.startsWith("*:")) {
-      return getGerritHost() + host.substring(1);
-    }
-    return host;
-  }
-
-  @Override
-  protected void setupVelocityContext() {
-    super.setupVelocityContext();
-    velocityContext.put("projectName", branch.getParentKey().get());
-    velocityContext.put("branch", branch);
-  }
-
-  @Override
-  protected void setupSoyContext() {
-    super.setupSoyContext();
-
-    String projectName = branch.getParentKey().get();
-    soyContext.put("projectName", projectName);
-    // shortProjectName is the project name with the path abbreviated.
-    soyContext.put("shortProjectName", projectName.replaceAll("/.*/", "..."));
-
-    soyContextEmailData.put("sshHost", getSshHost());
-
-    Map<String, String> branchData = new HashMap<>();
-    branchData.put("shortName", branch.getShortName());
-    soyContext.put("branch", branchData);
-
-    footers.add("Gerrit-Project: " + branch.getParentKey().get());
-    footers.add("Gerrit-Branch: " + branch.getShortName());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/OutgoingEmail.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/OutgoingEmail.java
deleted file mode 100644
index 7420611..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/OutgoingEmail.java
+++ /dev/null
@@ -1,641 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.send;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.gerrit.extensions.client.GeneralPreferencesInfo.EmailStrategy.CC_ON_OWN_COMMENTS;
-import static com.google.gerrit.extensions.client.GeneralPreferencesInfo.EmailStrategy.DISABLED;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.collect.ImmutableListMultimap;
-import com.google.common.collect.ListMultimap;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.errors.EmailException;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.api.changes.RecipientType;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo.EmailFormat;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.UserIdentity;
-import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.mail.send.EmailHeader.AddressList;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.validators.OutgoingEmailValidationListener;
-import com.google.gerrit.server.validators.ValidationException;
-import com.google.gwtorm.server.OrmException;
-import com.google.template.soy.data.SanitizedContent;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.StringJoiner;
-import org.apache.commons.lang.StringUtils;
-import org.apache.velocity.Template;
-import org.apache.velocity.VelocityContext;
-import org.apache.velocity.context.InternalContextAdapterImpl;
-import org.apache.velocity.runtime.RuntimeInstance;
-import org.apache.velocity.runtime.parser.node.SimpleNode;
-import org.eclipse.jgit.util.SystemReader;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Sends an email to one or more interested parties. */
-public abstract class OutgoingEmail {
-  private static final Logger log = LoggerFactory.getLogger(OutgoingEmail.class);
-
-  private static final String HDR_TO = "To";
-  private static final String HDR_CC = "CC";
-
-  protected String messageClass;
-  private final HashSet<Account.Id> rcptTo = new HashSet<>();
-  private final Map<String, EmailHeader> headers;
-  private final Set<Address> smtpRcptTo = new HashSet<>();
-  private Address smtpFromAddress;
-  private StringBuilder textBody;
-  private StringBuilder htmlBody;
-  private ListMultimap<RecipientType, Account.Id> accountsToNotify = ImmutableListMultimap.of();
-  protected VelocityContext velocityContext;
-  protected Map<String, Object> soyContext;
-  protected Map<String, Object> soyContextEmailData;
-  protected List<String> footers;
-  protected final EmailArguments args;
-  protected Account.Id fromId;
-  protected NotifyHandling notify = NotifyHandling.ALL;
-
-  protected OutgoingEmail(EmailArguments ea, String mc) {
-    args = ea;
-    messageClass = mc;
-    headers = new LinkedHashMap<>();
-  }
-
-  public void setFrom(Account.Id id) {
-    fromId = id;
-  }
-
-  public void setNotify(NotifyHandling notify) {
-    this.notify = checkNotNull(notify);
-  }
-
-  public void setAccountsToNotify(ListMultimap<RecipientType, Account.Id> accountsToNotify) {
-    this.accountsToNotify = checkNotNull(accountsToNotify);
-  }
-
-  /**
-   * Format and enqueue the message for delivery.
-   *
-   * @throws EmailException
-   */
-  public void send() throws EmailException {
-    if (NotifyHandling.NONE.equals(notify) && accountsToNotify.isEmpty()) {
-      return;
-    }
-
-    if (!args.emailSender.isEnabled()) {
-      // Server has explicitly disabled email sending.
-      //
-      return;
-    }
-
-    init();
-    if (useHtml()) {
-      appendHtml(soyHtmlTemplate("HeaderHtml"));
-    }
-    format();
-    appendText(textTemplate("Footer"));
-    if (useHtml()) {
-      appendHtml(soyHtmlTemplate("FooterHtml"));
-    }
-
-    Set<Address> smtpRcptToPlaintextOnly = new HashSet<>();
-    if (shouldSendMessage()) {
-      if (fromId != null) {
-        final Account fromUser = args.accountCache.get(fromId).getAccount();
-        GeneralPreferencesInfo senderPrefs = fromUser.getGeneralPreferencesInfo();
-
-        if (senderPrefs != null && senderPrefs.getEmailStrategy() == CC_ON_OWN_COMMENTS) {
-          // If we are impersonating a user, make sure they receive a CC of
-          // this message so they can always review and audit what we sent
-          // on their behalf to others.
-          //
-          add(RecipientType.CC, fromId);
-        } else if (!accountsToNotify.containsValue(fromId) && rcptTo.remove(fromId)) {
-          // If they don't want a copy, but we queued one up anyway,
-          // drop them from the recipient lists.
-          //
-          removeUser(fromUser);
-        }
-      }
-      // Check the preferences of all recipients. If any user has disabled
-      // his email notifications then drop him from recipients' list.
-      // In addition, check if users only want to receive plaintext email.
-      for (Account.Id id : rcptTo) {
-        Account thisUser = args.accountCache.get(id).getAccount();
-        GeneralPreferencesInfo prefs = thisUser.getGeneralPreferencesInfo();
-        if (prefs == null || prefs.getEmailStrategy() == DISABLED) {
-          removeUser(thisUser);
-        } else if (useHtml() && prefs.getEmailFormat() == EmailFormat.PLAINTEXT) {
-          removeUser(thisUser);
-          smtpRcptToPlaintextOnly.add(
-              new Address(thisUser.getFullName(), thisUser.getPreferredEmail()));
-        }
-        if (smtpRcptTo.isEmpty() && smtpRcptToPlaintextOnly.isEmpty()) {
-          return;
-        }
-      }
-
-      // Set Reply-To only if it hasn't been set by a child class
-      // Reply-To will already be populated for the message types where Gerrit supports
-      // inbound email replies.
-      if (!headers.containsKey("Reply-To")) {
-        StringJoiner j = new StringJoiner(", ");
-        if (fromId != null) {
-          Address address = toAddress(fromId);
-          if (address != null) {
-            j.add(address.getEmail());
-          }
-        }
-        smtpRcptTo.stream().forEach(a -> j.add(a.getEmail()));
-        smtpRcptToPlaintextOnly.stream().forEach(a -> j.add(a.getEmail()));
-        setHeader("Reply-To", j.toString());
-      }
-
-      String textPart = textBody.toString();
-      OutgoingEmailValidationListener.Args va = new OutgoingEmailValidationListener.Args();
-      va.messageClass = messageClass;
-      va.smtpFromAddress = smtpFromAddress;
-      va.smtpRcptTo = smtpRcptTo;
-      va.headers = headers;
-      va.body = textPart;
-
-      if (useHtml()) {
-        va.htmlBody = htmlBody.toString();
-      } else {
-        va.htmlBody = null;
-      }
-
-      for (OutgoingEmailValidationListener validator : args.outgoingEmailValidationListeners) {
-        try {
-          validator.validateOutgoingEmail(va);
-        } catch (ValidationException e) {
-          return;
-        }
-      }
-
-      if (!smtpRcptTo.isEmpty()) {
-        // Send multipart message
-        args.emailSender.send(va.smtpFromAddress, va.smtpRcptTo, va.headers, va.body, va.htmlBody);
-      }
-
-      if (!smtpRcptToPlaintextOnly.isEmpty()) {
-        // Send plaintext message
-        Map<String, EmailHeader> shallowCopy = new HashMap<>();
-        shallowCopy.putAll(headers);
-        // Remove To and Cc
-        shallowCopy.remove(HDR_TO);
-        shallowCopy.remove(HDR_CC);
-        for (Address a : smtpRcptToPlaintextOnly) {
-          // Add new To
-          EmailHeader.AddressList to = new EmailHeader.AddressList();
-          to.add(a);
-          shallowCopy.put(HDR_TO, to);
-        }
-        args.emailSender.send(va.smtpFromAddress, smtpRcptToPlaintextOnly, shallowCopy, va.body);
-      }
-    }
-  }
-
-  /** Format the message body by calling {@link #appendText(String)}. */
-  protected abstract void format() throws EmailException;
-
-  /**
-   * Setup the message headers and envelope (TO, CC, BCC).
-   *
-   * @throws EmailException if an error occurred.
-   */
-  protected void init() throws EmailException {
-    setupVelocityContext();
-    setupSoyContext();
-
-    smtpFromAddress = args.fromAddressGenerator.from(fromId);
-    setHeader("Date", new Date());
-    headers.put("From", new EmailHeader.AddressList(smtpFromAddress));
-    headers.put(HDR_TO, new EmailHeader.AddressList());
-    headers.put(HDR_CC, new EmailHeader.AddressList());
-    setHeader("Message-ID", "");
-
-    for (RecipientType recipientType : accountsToNotify.keySet()) {
-      add(recipientType, accountsToNotify.get(recipientType));
-    }
-
-    setHeader("X-Gerrit-MessageType", messageClass);
-    textBody = new StringBuilder();
-    htmlBody = new StringBuilder();
-
-    if (fromId != null && args.fromAddressGenerator.isGenericAddress(fromId)) {
-      appendText(getFromLine());
-    }
-  }
-
-  protected String getFromLine() {
-    final Account account = args.accountCache.get(fromId).getAccount();
-    final String name = account.getFullName();
-    final String email = account.getPreferredEmail();
-    StringBuilder f = new StringBuilder();
-
-    if ((name != null && !name.isEmpty()) || (email != null && !email.isEmpty())) {
-      f.append("From");
-      if (name != null && !name.isEmpty()) {
-        f.append(" ").append(name);
-      }
-      if (email != null && !email.isEmpty()) {
-        f.append(" <").append(email).append(">");
-      }
-      f.append(":\n\n");
-    }
-    return f.toString();
-  }
-
-  public String getGerritHost() {
-    if (getGerritUrl() != null) {
-      try {
-        return new URL(getGerritUrl()).getHost();
-      } catch (MalformedURLException e) {
-        // Try something else.
-      }
-    }
-
-    // Fall back onto whatever the local operating system thinks
-    // this server is called. We hopefully didn't get here as a
-    // good admin would have configured the canonical url.
-    //
-    return SystemReader.getInstance().getHostname();
-  }
-
-  public String getSettingsUrl() {
-    if (getGerritUrl() != null) {
-      final StringBuilder r = new StringBuilder();
-      r.append(getGerritUrl());
-      r.append("settings");
-      return r.toString();
-    }
-    return null;
-  }
-
-  public String getGerritUrl() {
-    return args.urlProvider.get();
-  }
-
-  /** Set a header in the outgoing message using a template. */
-  protected void setVHeader(String name, String value) throws EmailException {
-    setHeader(name, velocify(value));
-  }
-
-  /** Set a header in the outgoing message. */
-  protected void setHeader(String name, String value) {
-    headers.put(name, new EmailHeader.String(value));
-  }
-
-  /** Remove a header from the outgoing message. */
-  protected void removeHeader(String name) {
-    headers.remove(name);
-  }
-
-  protected void setHeader(String name, Date date) {
-    headers.put(name, new EmailHeader.Date(date));
-  }
-
-  /** Append text to the outgoing email body. */
-  protected void appendText(String text) {
-    if (text != null) {
-      textBody.append(text);
-    }
-  }
-
-  /** Append html to the outgoing email body. */
-  protected void appendHtml(String html) {
-    if (html != null) {
-      htmlBody.append(html);
-    }
-  }
-
-  /**
-   * Gets the human readable name for an account, usually the "full name".
-   *
-   * @param accountId user to fetch.
-   * @return name of the account, or the server identity name if null.
-   */
-  protected String getNameFor(@Nullable Account.Id accountId) {
-    if (accountId == null) {
-      return args.gerritPersonIdent.getName();
-    }
-
-    return args.accountCache.get(accountId).getAccount().getName(args.anonymousCowardName);
-  }
-
-  /**
-   * Gets the human readable name and email for an account.
-   *
-   * @param accountId user to fetch.
-   * @return name/email of account; Anonymous Coward if unset or the server identity if null.
-   */
-  protected String getNameEmailFor(@Nullable Account.Id accountId) {
-    if (accountId == null) {
-      return String.format(
-          "%s <%s>", args.gerritPersonIdent.getName(), args.gerritPersonIdent.getEmailAddress());
-    }
-
-    return args.accountCache.get(accountId).getAccount().getNameEmail(args.anonymousCowardName);
-  }
-
-  /**
-   * Gets the human readable name and email for an account; if both are unavailable, returns the
-   * username. If no username is set, this function returns null.
-   *
-   * @param accountId user to fetch.
-   * @return name/email of account, username, or null if unset.
-   */
-  @Nullable
-  protected String getUserNameEmailFor(@Nullable Account.Id accountId) {
-    if (accountId == null) {
-      return null;
-    }
-    AccountState who = args.accountCache.get(accountId);
-    String name = who.getAccount().getFullName();
-    String email = who.getAccount().getPreferredEmail();
-
-    if (name != null && email != null) {
-      return name + " <" + email + ">";
-    } else if (email != null) {
-      return email;
-    } else if (name != null) {
-      return name;
-    }
-    String username = who.getUserName();
-    if (username != null) {
-      return username;
-    }
-    return null;
-  }
-
-  protected boolean shouldSendMessage() {
-    if (textBody.length() == 0) {
-      // If we have no message body, don't send.
-      return false;
-    }
-
-    if (smtpRcptTo.isEmpty()) {
-      // If we have nobody to send this message to, then all of our
-      // selection filters previously for this type of message were
-      // unable to match a destination. Don't bother sending it.
-      return false;
-    }
-
-    if ((accountsToNotify == null || accountsToNotify.isEmpty())
-        && smtpRcptTo.size() == 1
-        && rcptTo.size() == 1
-        && rcptTo.contains(fromId)) {
-      // If the only recipient is also the sender, don't bother.
-      //
-      return false;
-    }
-
-    return true;
-  }
-
-  /** Schedule this message for delivery to the listed accounts. */
-  protected void add(RecipientType rt, Collection<Account.Id> list) {
-    add(rt, list, false);
-  }
-
-  /** Schedule this message for delivery to the listed accounts. */
-  protected void add(RecipientType rt, Collection<Account.Id> list, boolean override) {
-    for (final Account.Id id : list) {
-      add(rt, id, override);
-    }
-  }
-
-  /** Schedule this message for delivery to the listed address. */
-  protected void addByEmail(RecipientType rt, Collection<Address> list) {
-    addByEmail(rt, list, false);
-  }
-
-  /** Schedule this message for delivery to the listed address. */
-  protected void addByEmail(RecipientType rt, Collection<Address> list, boolean override) {
-    for (final Address id : list) {
-      add(rt, id, override);
-    }
-  }
-
-  protected void add(RecipientType rt, UserIdentity who) {
-    add(rt, who, false);
-  }
-
-  protected void add(RecipientType rt, UserIdentity who, boolean override) {
-    if (who != null && who.getAccount() != null) {
-      add(rt, who.getAccount(), override);
-    }
-  }
-
-  /** Schedule delivery of this message to the given account. */
-  protected void add(RecipientType rt, Account.Id to) {
-    add(rt, to, false);
-  }
-
-  protected void add(RecipientType rt, Account.Id to, boolean override) {
-    try {
-      if (!rcptTo.contains(to) && isVisibleTo(to)) {
-        rcptTo.add(to);
-        add(rt, toAddress(to), override);
-      }
-    } catch (OrmException | PermissionBackendException e) {
-      log.error("Error reading database for account: " + to, e);
-    }
-  }
-
-  /**
-   * @param to account.
-   * @throws OrmException
-   * @throws PermissionBackendException
-   * @return whether this email is visible to the given account.
-   */
-  protected boolean isVisibleTo(Account.Id to) throws OrmException, PermissionBackendException {
-    return true;
-  }
-
-  /** Schedule delivery of this message to the given account. */
-  protected void add(RecipientType rt, Address addr) {
-    add(rt, addr, false);
-  }
-
-  protected void add(RecipientType rt, Address addr, boolean override) {
-    if (addr != null && addr.getEmail() != null && addr.getEmail().length() > 0) {
-      if (!args.validator.isValid(addr.getEmail())) {
-        log.warn("Not emailing " + addr.getEmail() + " (invalid email address)");
-      } else if (!args.emailSender.canEmail(addr.getEmail())) {
-        log.warn("Not emailing " + addr.getEmail() + " (prohibited by allowrcpt)");
-      } else {
-        if (!smtpRcptTo.add(addr)) {
-          if (!override) {
-            return;
-          }
-          ((EmailHeader.AddressList) headers.get(HDR_TO)).remove(addr.getEmail());
-          ((EmailHeader.AddressList) headers.get(HDR_CC)).remove(addr.getEmail());
-        }
-        switch (rt) {
-          case TO:
-            ((EmailHeader.AddressList) headers.get(HDR_TO)).add(addr);
-            break;
-          case CC:
-            ((EmailHeader.AddressList) headers.get(HDR_CC)).add(addr);
-            break;
-          case BCC:
-            break;
-        }
-      }
-    }
-  }
-
-  private Address toAddress(Account.Id id) {
-    final Account a = args.accountCache.get(id).getAccount();
-    final String e = a.getPreferredEmail();
-    if (!a.isActive() || e == null) {
-      return null;
-    }
-    return new Address(a.getFullName(), e);
-  }
-
-  protected void setupVelocityContext() {
-    velocityContext = new VelocityContext();
-
-    velocityContext.put("email", this);
-    velocityContext.put("messageClass", messageClass);
-    velocityContext.put("StringUtils", StringUtils.class);
-  }
-
-  protected void setupSoyContext() {
-    soyContext = new HashMap<>();
-    footers = new ArrayList<>();
-
-    soyContext.put("messageClass", messageClass);
-    soyContext.put("footers", footers);
-
-    soyContextEmailData = new HashMap<>();
-    soyContextEmailData.put("settingsUrl", getSettingsUrl());
-    soyContextEmailData.put("gerritHost", getGerritHost());
-    soyContextEmailData.put("gerritUrl", getGerritUrl());
-    soyContext.put("email", soyContextEmailData);
-  }
-
-  protected String velocify(String template) throws EmailException {
-    try {
-      RuntimeInstance runtime = args.velocityRuntime;
-      String templateName = "OutgoingEmail";
-      SimpleNode tree = runtime.parse(new StringReader(template), templateName);
-      InternalContextAdapterImpl ica = new InternalContextAdapterImpl(velocityContext);
-      ica.pushCurrentTemplateName(templateName);
-      try {
-        tree.init(ica, runtime);
-        StringWriter w = new StringWriter();
-        tree.render(ica, w);
-        return w.toString();
-      } finally {
-        ica.popCurrentTemplateName();
-      }
-    } catch (Exception e) {
-      throw new EmailException("Cannot format velocity template: " + template, e);
-    }
-  }
-
-  protected String velocifyFile(String name) throws EmailException {
-    try {
-      RuntimeInstance runtime = args.velocityRuntime;
-      if (runtime.getLoaderNameForResource(name) == null) {
-        name = "com/google/gerrit/server/mail/" + name;
-      }
-      Template template = runtime.getTemplate(name, UTF_8.name());
-      StringWriter w = new StringWriter();
-      template.merge(velocityContext, w);
-      return w.toString();
-    } catch (Exception e) {
-      throw new EmailException("Cannot format velocity template " + name, e);
-    }
-  }
-
-  private String soyTemplate(String name, SanitizedContent.ContentKind kind) {
-    return args.soyTofu
-        .newRenderer("com.google.gerrit.server.mail.template." + name)
-        .setContentKind(kind)
-        .setData(soyContext)
-        .render();
-  }
-
-  protected String soyTextTemplate(String name) {
-    return soyTemplate(name, SanitizedContent.ContentKind.TEXT);
-  }
-
-  protected String soyHtmlTemplate(String name) {
-    return soyTemplate(name, SanitizedContent.ContentKind.HTML);
-  }
-
-  /**
-   * Evaluate the named template according to the following priority: 1) Velocity file override,
-   * OR... 2) Soy file override, OR... 3) Soy resource.
-   */
-  protected String textTemplate(String name) throws EmailException {
-    String velocityName = name + ".vm";
-    Path filePath = args.site.mail_dir.resolve(velocityName);
-    if (Files.isRegularFile(filePath)) {
-      return velocifyFile(velocityName);
-    }
-    return soyTextTemplate(name);
-  }
-
-  protected void removeUser(Account user) {
-    String fromEmail = user.getPreferredEmail();
-    for (Iterator<Address> j = smtpRcptTo.iterator(); j.hasNext(); ) {
-      if (j.next().getEmail().equals(fromEmail)) {
-        j.remove();
-      }
-    }
-    for (Map.Entry<String, EmailHeader> entry : headers.entrySet()) {
-      // Don't remove fromEmail from the "From" header though!
-      if (entry.getValue() instanceof AddressList && !entry.getKey().equals("From")) {
-        ((AddressList) entry.getValue()).remove(fromEmail);
-      }
-    }
-  }
-
-  protected final boolean useHtml() {
-    return args.settings.html && supportsHtml();
-  }
-
-  /** Override this method to enable HTML in a subclass. */
-  protected boolean supportsHtml() {
-    return false;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/OutgoingEmailValidator.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/OutgoingEmailValidator.java
deleted file mode 100644
index 1a4d39b..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/OutgoingEmailValidator.java
+++ /dev/null
@@ -1,49 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.send;
-
-import static org.apache.commons.validator.routines.DomainValidator.ArrayType.GENERIC_PLUS;
-
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import org.apache.commons.validator.routines.DomainValidator;
-import org.apache.commons.validator.routines.EmailValidator;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class OutgoingEmailValidator {
-  private static final Logger log = LoggerFactory.getLogger(OutgoingEmailValidator.class);
-
-  @Inject
-  OutgoingEmailValidator(@GerritServerConfig Config config) {
-    String[] allowTLD = config.getStringList("sendemail", null, "allowTLD");
-    if (allowTLD.length != 0) {
-      try {
-        DomainValidator.updateTLDOverride(GENERIC_PLUS, allowTLD);
-      } catch (IllegalStateException e) {
-        // Should only happen in tests, where the OutgoingEmailValidator
-        // is instantiated repeatedly.
-        log.error("Failed to update TLD override: " + e.getMessage());
-      }
-    }
-  }
-
-  public boolean isValid(String addr) {
-    return EmailValidator.getInstance(true, true).isValid(addr);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/ProjectWatch.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/ProjectWatch.java
deleted file mode 100644
index e1b6e36..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/ProjectWatch.java
+++ /dev/null
@@ -1,242 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.mail.send;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.index.query.QueryParseException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.account.WatchConfig.NotifyType;
-import com.google.gerrit.server.account.WatchConfig.ProjectWatchKey;
-import com.google.gerrit.server.git.NotifyConfig;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.ChangeQueryBuilder;
-import com.google.gerrit.server.query.change.SingleGroupUser;
-import com.google.gwtorm.server.OrmException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ProjectWatch {
-  private static final Logger log = LoggerFactory.getLogger(ProjectWatch.class);
-
-  protected final EmailArguments args;
-  protected final ProjectState projectState;
-  protected final Project.NameKey project;
-  protected final ChangeData changeData;
-
-  public ProjectWatch(
-      EmailArguments args,
-      Project.NameKey project,
-      ProjectState projectState,
-      ChangeData changeData) {
-    this.args = args;
-    this.project = project;
-    this.projectState = projectState;
-    this.changeData = changeData;
-  }
-
-  /** Returns all watchers that are relevant */
-  public final Watchers getWatchers(NotifyType type, boolean includeWatchersFromNotifyConfig)
-      throws OrmException {
-    Watchers matching = new Watchers();
-    Set<Account.Id> projectWatchers = new HashSet<>();
-
-    for (AccountState a : args.accountQueryProvider.get().byWatchedProject(project)) {
-      Account.Id accountId = a.getAccount().getId();
-      for (Map.Entry<ProjectWatchKey, Set<NotifyType>> e : a.getProjectWatches().entrySet()) {
-        if (project.equals(e.getKey().project())
-            && add(matching, accountId, e.getKey(), e.getValue(), type)) {
-          // We only want to prevent matching All-Projects if this filter hits
-          projectWatchers.add(accountId);
-        }
-      }
-    }
-
-    for (AccountState a : args.accountQueryProvider.get().byWatchedProject(args.allProjectsName)) {
-      for (Map.Entry<ProjectWatchKey, Set<NotifyType>> e : a.getProjectWatches().entrySet()) {
-        if (args.allProjectsName.equals(e.getKey().project())) {
-          Account.Id accountId = a.getAccount().getId();
-          if (!projectWatchers.contains(accountId)) {
-            add(matching, accountId, e.getKey(), e.getValue(), type);
-          }
-        }
-      }
-    }
-
-    if (!includeWatchersFromNotifyConfig) {
-      return matching;
-    }
-
-    for (ProjectState state : projectState.tree()) {
-      for (NotifyConfig nc : state.getConfig().getNotifyConfigs()) {
-        if (nc.isNotify(type)) {
-          try {
-            add(matching, nc);
-          } catch (QueryParseException e) {
-            log.warn(
-                "Project {} has invalid notify {} filter \"{}\": {}",
-                state.getName(),
-                nc.getName(),
-                nc.getFilter(),
-                e.getMessage());
-          }
-        }
-      }
-    }
-
-    return matching;
-  }
-
-  public static class Watchers {
-    static class List {
-      protected final Set<Account.Id> accounts = new HashSet<>();
-      protected final Set<Address> emails = new HashSet<>();
-    }
-
-    protected final List to = new List();
-    protected final List cc = new List();
-    protected final List bcc = new List();
-
-    List list(NotifyConfig.Header header) {
-      switch (header) {
-        case TO:
-          return to;
-        case CC:
-          return cc;
-        default:
-        case BCC:
-          return bcc;
-      }
-    }
-  }
-
-  private void add(Watchers matching, NotifyConfig nc) throws OrmException, QueryParseException {
-    for (GroupReference ref : nc.getGroups()) {
-      CurrentUser user = new SingleGroupUser(ref.getUUID());
-      if (filterMatch(user, nc.getFilter())) {
-        deliverToMembers(matching.list(nc.getHeader()), ref.getUUID());
-      }
-    }
-
-    if (!nc.getAddresses().isEmpty()) {
-      if (filterMatch(null, nc.getFilter())) {
-        matching.list(nc.getHeader()).emails.addAll(nc.getAddresses());
-      }
-    }
-  }
-
-  private void deliverToMembers(Watchers.List matching, AccountGroup.UUID startUUID)
-      throws OrmException {
-    ReviewDb db = args.db.get();
-    Set<AccountGroup.UUID> seen = new HashSet<>();
-    List<AccountGroup.UUID> q = new ArrayList<>();
-
-    seen.add(startUUID);
-    q.add(startUUID);
-
-    while (!q.isEmpty()) {
-      AccountGroup.UUID uuid = q.remove(q.size() - 1);
-      GroupDescription.Basic group = args.groupBackend.get(uuid);
-      if (group == null) {
-        continue;
-      }
-      if (!Strings.isNullOrEmpty(group.getEmailAddress())) {
-        // If the group has an email address, do not expand membership.
-        matching.emails.add(new Address(group.getEmailAddress()));
-        continue;
-      }
-
-      if (!(group instanceof GroupDescription.Internal)) {
-        // Non-internal groups cannot be expanded by the server.
-        continue;
-      }
-
-      GroupDescription.Internal ig = (GroupDescription.Internal) group;
-      try {
-        args.groups.getMembers(db, ig.getGroupUUID()).forEach(matching.accounts::add);
-      } catch (NoSuchGroupException e) {
-        continue;
-      }
-      for (AccountGroup.UUID m : args.groupIncludes.subgroupsOf(uuid)) {
-        if (seen.add(m)) {
-          q.add(m);
-        }
-      }
-    }
-  }
-
-  private boolean add(
-      Watchers matching,
-      Account.Id accountId,
-      ProjectWatchKey key,
-      Set<NotifyType> watchedTypes,
-      NotifyType type)
-      throws OrmException {
-    IdentifiedUser user = args.identifiedUserFactory.create(accountId);
-
-    try {
-      if (filterMatch(user, key.filter())) {
-        // If we are set to notify on this type, add the user.
-        // Otherwise, still return true to stop notifications for this user.
-        if (watchedTypes.contains(type)) {
-          matching.bcc.accounts.add(accountId);
-        }
-        return true;
-      }
-    } catch (QueryParseException e) {
-      // Ignore broken filter expressions.
-    }
-    return false;
-  }
-
-  private boolean filterMatch(CurrentUser user, String filter)
-      throws OrmException, QueryParseException {
-    ChangeQueryBuilder qb;
-    Predicate<ChangeData> p = null;
-
-    if (user == null) {
-      qb = args.queryBuilder.asUser(args.anonymousUser);
-    } else {
-      qb = args.queryBuilder.asUser(user);
-      p = qb.is_visible();
-    }
-
-    if (filter != null) {
-      Predicate<ChangeData> filterPredicate = qb.parse(filter);
-      if (p == null) {
-        p = filterPredicate;
-      } else {
-        p = Predicate.and(filterPredicate, p);
-      }
-    }
-    return p == null || p.asMatchable().match(changeData);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/RegisterNewEmailSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/RegisterNewEmailSender.java
deleted file mode 100644
index c667026..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/RegisterNewEmailSender.java
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.mail.send;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.gerrit.common.errors.EmailException;
-import com.google.gerrit.extensions.api.changes.RecipientType;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.mail.EmailTokenVerifier;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-
-public class RegisterNewEmailSender extends OutgoingEmail {
-  public interface Factory {
-    RegisterNewEmailSender create(String address);
-  }
-
-  private final EmailTokenVerifier tokenVerifier;
-  private final IdentifiedUser user;
-  private final String addr;
-  private String emailToken;
-
-  @Inject
-  public RegisterNewEmailSender(
-      EmailArguments ea,
-      EmailTokenVerifier etv,
-      IdentifiedUser callingUser,
-      @Assisted final String address) {
-    super(ea, "registernewemail");
-    tokenVerifier = etv;
-    user = callingUser;
-    addr = address;
-  }
-
-  @Override
-  protected void init() throws EmailException {
-    super.init();
-    setHeader("Subject", "[Gerrit Code Review] Email Verification");
-    add(RecipientType.TO, new Address(addr));
-  }
-
-  @Override
-  protected void format() throws EmailException {
-    appendText(textTemplate("RegisterNewEmail"));
-  }
-
-  public String getUserNameEmail() {
-    return getUserNameEmailFor(user.getAccountId());
-  }
-
-  public String getEmailRegistrationToken() {
-    if (emailToken == null) {
-      emailToken = checkNotNull(tokenVerifier.encode(user.getAccountId(), addr), "token");
-    }
-    return emailToken;
-  }
-
-  public boolean isAllowed() {
-    return args.emailSender.canEmail(addr);
-  }
-
-  @Override
-  protected void setupSoyContext() {
-    super.setupSoyContext();
-    soyContextEmailData.put("emailRegistrationToken", getEmailRegistrationToken());
-    soyContextEmailData.put("userNameEmail", getUserNameEmail());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/ReplacePatchSetSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/ReplacePatchSetSender.java
deleted file mode 100644
index c9e5791..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/ReplacePatchSetSender.java
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.mail.send;
-
-import com.google.gerrit.common.errors.EmailException;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.api.changes.RecipientType;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.account.WatchConfig.NotifyType;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/** Send notice of new patch sets for reviewers. */
-public class ReplacePatchSetSender extends ReplyToChangeSender {
-  public interface Factory {
-    ReplacePatchSetSender create(Project.NameKey project, Change.Id id);
-  }
-
-  private final Set<Account.Id> reviewers = new HashSet<>();
-  private final Set<Account.Id> extraCC = new HashSet<>();
-
-  @Inject
-  public ReplacePatchSetSender(
-      EmailArguments ea, @Assisted Project.NameKey project, @Assisted Change.Id id)
-      throws OrmException {
-    super(ea, "newpatchset", newChangeData(ea, project, id));
-  }
-
-  public void addReviewers(Collection<Account.Id> cc) {
-    reviewers.addAll(cc);
-  }
-
-  public void addExtraCC(Collection<Account.Id> cc) {
-    extraCC.addAll(cc);
-  }
-
-  @Override
-  protected void init() throws EmailException {
-    super.init();
-
-    if (fromId != null) {
-      // Don't call yourself a reviewer of your own patch set.
-      //
-      reviewers.remove(fromId);
-    }
-    if (notify == NotifyHandling.ALL || notify == NotifyHandling.OWNER_REVIEWERS) {
-      add(RecipientType.TO, reviewers);
-      add(RecipientType.CC, extraCC);
-    }
-    rcptToAuthors(RecipientType.CC);
-    bccStarredBy();
-    includeWatchers(NotifyType.NEW_PATCHSETS, !change.isWorkInProgress() && !change.isPrivate());
-    removeUsersThatIgnoredTheChange();
-  }
-
-  @Override
-  protected void formatChange() throws EmailException {
-    appendText(textTemplate("ReplacePatchSet"));
-    if (useHtml()) {
-      appendHtml(soyHtmlTemplate("ReplacePatchSetHtml"));
-    }
-  }
-
-  public List<String> getReviewerNames() {
-    List<String> names = new ArrayList<>();
-    for (Account.Id id : reviewers) {
-      if (id.equals(fromId)) {
-        continue;
-      }
-      names.add(getNameFor(id));
-    }
-    if (names.isEmpty()) {
-      return null;
-    }
-    return names;
-  }
-
-  @Override
-  protected void setupSoyContext() {
-    super.setupSoyContext();
-    soyContextEmailData.put("reviewerNames", getReviewerNames());
-  }
-
-  @Override
-  protected boolean supportsHtml() {
-    return true;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/RestoredSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/RestoredSender.java
deleted file mode 100644
index 6076b46..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/RestoredSender.java
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.server.mail.send;
-
-import com.google.gerrit.common.errors.EmailException;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.account.WatchConfig.NotifyType;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-
-/** Send notice about a change being restored by its owner. */
-public class RestoredSender extends ReplyToChangeSender {
-  public interface Factory extends ReplyToChangeSender.Factory<RestoredSender> {
-    @Override
-    RestoredSender create(Project.NameKey project, Change.Id id);
-  }
-
-  @Inject
-  public RestoredSender(
-      EmailArguments ea, @Assisted Project.NameKey project, @Assisted Change.Id id)
-      throws OrmException {
-    super(ea, "restore", ChangeEmail.newChangeData(ea, project, id));
-  }
-
-  @Override
-  protected void init() throws EmailException {
-    super.init();
-
-    ccAllApprovals();
-    bccStarredBy();
-    includeWatchers(NotifyType.ALL_COMMENTS);
-    removeUsersThatIgnoredTheChange();
-  }
-
-  @Override
-  protected void formatChange() throws EmailException {
-    appendText(textTemplate("Restored"));
-    if (useHtml()) {
-      appendHtml(soyHtmlTemplate("RestoredHtml"));
-    }
-  }
-
-  @Override
-  protected boolean supportsHtml() {
-    return true;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/RevertedSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/RevertedSender.java
deleted file mode 100644
index c4c0a69..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/RevertedSender.java
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.server.mail.send;
-
-import com.google.gerrit.common.errors.EmailException;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.account.WatchConfig.NotifyType;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-
-/** Send notice about a change being reverted. */
-public class RevertedSender extends ReplyToChangeSender {
-  public interface Factory {
-    RevertedSender create(Project.NameKey project, Change.Id id);
-  }
-
-  @Inject
-  public RevertedSender(
-      EmailArguments ea, @Assisted Project.NameKey project, @Assisted Change.Id id)
-      throws OrmException {
-    super(ea, "revert", ChangeEmail.newChangeData(ea, project, id));
-  }
-
-  @Override
-  protected void init() throws EmailException {
-    super.init();
-
-    ccAllApprovals();
-    bccStarredBy();
-    includeWatchers(NotifyType.ALL_COMMENTS);
-    removeUsersThatIgnoredTheChange();
-  }
-
-  @Override
-  protected void formatChange() throws EmailException {
-    appendText(textTemplate("Reverted"));
-    if (useHtml()) {
-      appendHtml(soyHtmlTemplate("RevertedHtml"));
-    }
-  }
-
-  @Override
-  protected boolean supportsHtml() {
-    return true;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/SmtpEmailSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/SmtpEmailSender.java
deleted file mode 100644
index b08e594..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/SmtpEmailSender.java
+++ /dev/null
@@ -1,409 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.mail.send;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.io.BaseEncoding;
-import com.google.common.primitives.Ints;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.common.Version;
-import com.google.gerrit.common.errors.EmailException;
-import com.google.gerrit.server.config.ConfigUtil;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.mail.Encryption;
-import com.google.inject.AbstractModule;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.BufferedWriter;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.Writer;
-import java.text.SimpleDateFormat;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ThreadLocalRandom;
-import java.util.concurrent.TimeUnit;
-import org.apache.commons.net.smtp.AuthSMTPClient;
-import org.apache.commons.net.smtp.SMTPClient;
-import org.apache.commons.net.smtp.SMTPReply;
-import org.apache.james.mime4j.codec.QuotedPrintableOutputStream;
-import org.eclipse.jgit.lib.Config;
-
-/** Sends email via a nearby SMTP server. */
-@Singleton
-public class SmtpEmailSender implements EmailSender {
-  /** The socket's connect timeout (0 = infinite timeout) */
-  private static final int DEFAULT_CONNECT_TIMEOUT = 0;
-
-  public static class Module extends AbstractModule {
-    @Override
-    protected void configure() {
-      bind(EmailSender.class).to(SmtpEmailSender.class);
-    }
-  }
-
-  private final boolean enabled;
-  private final int connectTimeout;
-
-  private String smtpHost;
-  private int smtpPort;
-  private String smtpUser;
-  private String smtpPass;
-  private Encryption smtpEncryption;
-  private boolean sslVerify;
-  private Set<String> allowrcpt;
-  private String importance;
-  private int expiryDays;
-
-  @Inject
-  SmtpEmailSender(@GerritServerConfig Config cfg) {
-    enabled = cfg.getBoolean("sendemail", null, "enable", true);
-    connectTimeout =
-        Ints.checkedCast(
-            ConfigUtil.getTimeUnit(
-                cfg,
-                "sendemail",
-                null,
-                "connectTimeout",
-                DEFAULT_CONNECT_TIMEOUT,
-                TimeUnit.MILLISECONDS));
-
-    smtpHost = cfg.getString("sendemail", null, "smtpserver");
-    if (smtpHost == null) {
-      smtpHost = "127.0.0.1";
-    }
-
-    smtpEncryption = cfg.getEnum("sendemail", null, "smtpencryption", Encryption.NONE);
-    sslVerify = cfg.getBoolean("sendemail", null, "sslverify", true);
-
-    final int defaultPort;
-    switch (smtpEncryption) {
-      case SSL:
-        defaultPort = 465;
-        break;
-
-      case NONE:
-      case TLS:
-      default:
-        defaultPort = 25;
-        break;
-    }
-    smtpPort = cfg.getInt("sendemail", null, "smtpserverport", defaultPort);
-
-    smtpUser = cfg.getString("sendemail", null, "smtpuser");
-    smtpPass = cfg.getString("sendemail", null, "smtppass");
-
-    Set<String> rcpt = new HashSet<>();
-    for (String addr : cfg.getStringList("sendemail", null, "allowrcpt")) {
-      rcpt.add(addr);
-    }
-    allowrcpt = Collections.unmodifiableSet(rcpt);
-    importance = cfg.getString("sendemail", null, "importance");
-    expiryDays = cfg.getInt("sendemail", null, "expiryDays", 0);
-  }
-
-  @Override
-  public boolean isEnabled() {
-    return enabled;
-  }
-
-  @Override
-  public boolean canEmail(String address) {
-    if (!isEnabled()) {
-      return false;
-    }
-
-    if (allowrcpt.isEmpty()) {
-      return true;
-    }
-
-    if (allowrcpt.contains(address)) {
-      return true;
-    }
-
-    String domain = address.substring(address.lastIndexOf('@') + 1);
-    if (allowrcpt.contains(domain) || allowrcpt.contains("@" + domain)) {
-      return true;
-    }
-
-    return false;
-  }
-
-  @Override
-  public void send(
-      final Address from,
-      Collection<Address> rcpt,
-      final Map<String, EmailHeader> callerHeaders,
-      String body)
-      throws EmailException {
-    send(from, rcpt, callerHeaders, body, null);
-  }
-
-  @Override
-  public void send(
-      final Address from,
-      Collection<Address> rcpt,
-      final Map<String, EmailHeader> callerHeaders,
-      String textBody,
-      @Nullable String htmlBody)
-      throws EmailException {
-    if (!isEnabled()) {
-      throw new EmailException("Sending email is disabled");
-    }
-
-    StringBuffer rejected = new StringBuffer();
-    try {
-      final SMTPClient client = open();
-      try {
-        if (!client.setSender(from.getEmail())) {
-          throw new EmailException(
-              "Server " + smtpHost + " rejected from address " + from.getEmail());
-        }
-
-        /* Do not prevent the email from being sent to "good" users simply
-         * because some users get rejected.  If not, a single rejected
-         * project watcher could prevent email for most actions on a project
-         * from being sent to any user!  Instead, queue up the errors, and
-         * throw an exception after sending the email to get the rejected
-         * error(s) logged.
-         */
-        for (Address addr : rcpt) {
-          if (!client.addRecipient(addr.getEmail())) {
-            String error = client.getReplyString();
-            rejected
-                .append("Server ")
-                .append(smtpHost)
-                .append(" rejected recipient ")
-                .append(addr)
-                .append(": ")
-                .append(error);
-          }
-        }
-
-        try (Writer messageDataWriter = client.sendMessageData()) {
-          if (messageDataWriter == null) {
-            /* Include rejected recipient error messages here to not lose that
-             * information. That piece of the puzzle is vital if zero recipients
-             * are accepted and the server consequently rejects the DATA command.
-             */
-            throw new EmailException(
-                rejected
-                    + "Server "
-                    + smtpHost
-                    + " rejected DATA command: "
-                    + client.getReplyString());
-          }
-
-          render(messageDataWriter, callerHeaders, textBody, htmlBody);
-
-          if (!client.completePendingCommand()) {
-            throw new EmailException(
-                "Server " + smtpHost + " rejected message body: " + client.getReplyString());
-          }
-
-          client.logout();
-          if (rejected.length() > 0) {
-            throw new EmailException(rejected.toString());
-          }
-        }
-      } finally {
-        client.disconnect();
-      }
-    } catch (IOException e) {
-      throw new EmailException("Cannot send outgoing email", e);
-    }
-  }
-
-  private void render(
-      Writer out,
-      Map<String, EmailHeader> callerHeaders,
-      String textBody,
-      @Nullable String htmlBody)
-      throws IOException, EmailException {
-    final Map<String, EmailHeader> hdrs = new LinkedHashMap<>(callerHeaders);
-    setMissingHeader(hdrs, "MIME-Version", "1.0");
-    setMissingHeader(hdrs, "Content-Transfer-Encoding", "8bit");
-    setMissingHeader(hdrs, "Content-Disposition", "inline");
-    setMissingHeader(hdrs, "User-Agent", "Gerrit/" + Version.getVersion());
-    if (importance != null) {
-      setMissingHeader(hdrs, "Importance", importance);
-    }
-    if (expiryDays > 0) {
-      Date expiry = new Date(TimeUtil.nowMs() + expiryDays * 24 * 60 * 60 * 1000L);
-      setMissingHeader(
-          hdrs, "Expiry-Date", new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z").format(expiry));
-    }
-
-    String encodedBody;
-    if (htmlBody == null) {
-      setMissingHeader(hdrs, "Content-Type", "text/plain; charset=UTF-8");
-      encodedBody = textBody;
-    } else {
-      String boundary = generateMultipartBoundary(textBody, htmlBody);
-      setMissingHeader(
-          hdrs,
-          "Content-Type",
-          "multipart/alternative; boundary=\"" + boundary + "\"; charset=UTF-8");
-      encodedBody = buildMultipartBody(boundary, textBody, htmlBody);
-    }
-
-    try (Writer w = new BufferedWriter(out)) {
-      for (Map.Entry<String, EmailHeader> h : hdrs.entrySet()) {
-        if (!h.getValue().isEmpty()) {
-          w.write(h.getKey());
-          w.write(": ");
-          h.getValue().write(w);
-          w.write("\r\n");
-        }
-      }
-
-      w.write("\r\n");
-      w.write(encodedBody);
-      w.flush();
-    }
-  }
-
-  public static String generateMultipartBoundary(String textBody, String htmlBody)
-      throws EmailException {
-    byte[] bytes = new byte[8];
-    ThreadLocalRandom rng = ThreadLocalRandom.current();
-
-    // The probability of the boundary being valid is approximately
-    // (2^64 - len(message)) / 2^64.
-    //
-    // The message is much shorter than 2^64 bytes, so if two tries don't
-    // suffice, something is seriously wrong.
-    for (int i = 0; i < 2; i++) {
-      rng.nextBytes(bytes);
-      String boundary = BaseEncoding.base64().encode(bytes);
-      String encBoundary = "--" + boundary;
-      if (textBody.contains(encBoundary) || htmlBody.contains(encBoundary)) {
-        continue;
-      }
-      return boundary;
-    }
-    throw new EmailException("Gave up generating unique MIME boundary");
-  }
-
-  protected String buildMultipartBody(String boundary, String textPart, String htmlPart)
-      throws IOException {
-    String encodedTextPart = quotedPrintableEncode(textPart);
-    String encodedHtmlPart = quotedPrintableEncode(htmlPart);
-
-    // Only declare quoted-printable encoding if there are characters that need to be encoded.
-    String textTransferEncoding = textPart.equals(encodedTextPart) ? "7bit" : "quoted-printable";
-    String htmlTransferEncoding = htmlPart.equals(encodedHtmlPart) ? "7bit" : "quoted-printable";
-
-    return
-    // Output the text part:
-    "--"
-        + boundary
-        + "\r\n"
-        + "Content-Type: text/plain; charset=UTF-8\r\n"
-        + "Content-Transfer-Encoding: "
-        + textTransferEncoding
-        + "\r\n"
-        + "\r\n"
-        + encodedTextPart
-        + "\r\n"
-
-        // Output the HTML part:
-        + "--"
-        + boundary
-        + "\r\n"
-        + "Content-Type: text/html; charset=UTF-8\r\n"
-        + "Content-Transfer-Encoding: "
-        + htmlTransferEncoding
-        + "\r\n"
-        + "\r\n"
-        + encodedHtmlPart
-        + "\r\n"
-
-        // Output the closing boundary.
-        + "--"
-        + boundary
-        + "--\r\n";
-  }
-
-  protected String quotedPrintableEncode(String input) throws IOException {
-    ByteArrayOutputStream s = new ByteArrayOutputStream();
-    try (QuotedPrintableOutputStream qp = new QuotedPrintableOutputStream(s, false)) {
-      qp.write(input.getBytes(UTF_8));
-    }
-    return s.toString();
-  }
-
-  private static void setMissingHeader(Map<String, EmailHeader> hdrs, String name, String value) {
-    if (!hdrs.containsKey(name) || hdrs.get(name).isEmpty()) {
-      hdrs.put(name, new EmailHeader.String(value));
-    }
-  }
-
-  private SMTPClient open() throws EmailException {
-    final AuthSMTPClient client = new AuthSMTPClient(UTF_8.name());
-
-    if (smtpEncryption == Encryption.SSL) {
-      client.enableSSL(sslVerify);
-    }
-
-    client.setConnectTimeout(connectTimeout);
-    try {
-      client.connect(smtpHost, smtpPort);
-      int replyCode = client.getReplyCode();
-      String replyString = client.getReplyString();
-      if (!SMTPReply.isPositiveCompletion(replyCode)) {
-        throw new EmailException(
-            String.format("SMTP server rejected connection: %d: %s", replyCode, replyString));
-      }
-      if (!client.login()) {
-        throw new EmailException("SMTP server rejected HELO/EHLO greeting: " + replyString);
-      }
-
-      if (smtpEncryption == Encryption.TLS) {
-        if (!client.startTLS(smtpHost, smtpPort, sslVerify)) {
-          throw new EmailException("SMTP server does not support TLS");
-        }
-        if (!client.login()) {
-          throw new EmailException("SMTP server rejected login: " + replyString);
-        }
-      }
-
-      if (smtpUser != null && !client.auth(smtpUser, smtpPass)) {
-        throw new EmailException("SMTP server rejected auth: " + replyString);
-      }
-      return client;
-    } catch (IOException | EmailException e) {
-      if (client.isConnected()) {
-        try {
-          client.disconnect();
-        } catch (IOException e2) {
-          // Ignored
-        }
-      }
-      if (e instanceof EmailException) {
-        throw (EmailException) e;
-      }
-      throw new EmailException(e.getMessage(), e);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/VelocityRuntimeProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/VelocityRuntimeProvider.java
deleted file mode 100644
index 524bbed..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/VelocityRuntimeProvider.java
+++ /dev/null
@@ -1,118 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.server.mail.send;
-
-import com.google.gerrit.server.config.SitePaths;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.ProvisionException;
-import com.google.inject.Singleton;
-import java.nio.file.Files;
-import java.util.Properties;
-import org.apache.velocity.runtime.RuntimeConstants;
-import org.apache.velocity.runtime.RuntimeInstance;
-import org.apache.velocity.runtime.RuntimeServices;
-import org.apache.velocity.runtime.log.LogChute;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Configures Velocity template engine for sending email. */
-@Singleton
-public class VelocityRuntimeProvider implements Provider<RuntimeInstance> {
-  private final SitePaths site;
-
-  @Inject
-  VelocityRuntimeProvider(SitePaths site) {
-    this.site = site;
-  }
-
-  @Override
-  public RuntimeInstance get() {
-    String rl = "resource.loader";
-    String pkg = "org.apache.velocity.runtime.resource.loader";
-
-    Properties p = new Properties();
-    p.setProperty(RuntimeConstants.VM_PERM_INLINE_LOCAL, "true");
-    p.setProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, Slf4jLogChute.class.getName());
-    p.setProperty(RuntimeConstants.RUNTIME_REFERENCES_STRICT, "true");
-    p.setProperty("runtime.log.logsystem.log4j.category", "velocity");
-
-    if (Files.isDirectory(site.mail_dir)) {
-      p.setProperty(rl, "file, class");
-      p.setProperty("file." + rl + ".class", pkg + ".FileResourceLoader");
-      p.setProperty("file." + rl + ".path", site.mail_dir.toAbsolutePath().toString());
-      p.setProperty("class." + rl + ".class", pkg + ".ClasspathResourceLoader");
-    } else {
-      p.setProperty(rl, "class");
-      p.setProperty("class." + rl + ".class", pkg + ".ClasspathResourceLoader");
-    }
-
-    RuntimeInstance ri = new RuntimeInstance();
-    try {
-      ri.init(p);
-    } catch (Exception err) {
-      throw new ProvisionException("Cannot configure Velocity templates", err);
-    }
-    return ri;
-  }
-
-  /** Connects Velocity to sfl4j. */
-  public static class Slf4jLogChute implements LogChute {
-    // Logger should be named 'velocity' for consistency with log4j config
-    private static final Logger log = LoggerFactory.getLogger("velocity");
-
-    @Override
-    public void init(RuntimeServices rs) {}
-
-    @Override
-    public boolean isLevelEnabled(int level) {
-      switch (level) {
-        default:
-        case DEBUG_ID:
-          return log.isDebugEnabled();
-        case INFO_ID:
-          return log.isInfoEnabled();
-        case WARN_ID:
-          return log.isWarnEnabled();
-        case ERROR_ID:
-          return log.isErrorEnabled();
-      }
-    }
-
-    @Override
-    public void log(int level, String message) {
-      log(level, message, null);
-    }
-
-    @Override
-    public void log(int level, String msg, Throwable err) {
-      switch (level) {
-        default:
-        case DEBUG_ID:
-          log.debug(msg, err);
-          break;
-        case INFO_ID:
-          log.info(msg, err);
-          break;
-        case WARN_ID:
-          log.warn(msg, err);
-          break;
-        case ERROR_ID:
-          log.error(msg, err);
-          break;
-      }
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mime/DefaultFileExtensionRegistry.java b/gerrit-server/src/main/java/com/google/gerrit/server/mime/DefaultFileExtensionRegistry.java
deleted file mode 100644
index 7f0661c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mime/DefaultFileExtensionRegistry.java
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.mime;
-
-import com.google.common.collect.ImmutableMap;
-import eu.medsea.mimeutil.MimeException;
-import eu.medsea.mimeutil.MimeType;
-import eu.medsea.mimeutil.MimeUtil;
-import eu.medsea.mimeutil.detector.MimeDetector;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Map;
-import java.util.Properties;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Loads mime types from {@code mime-types.properties} at specificity of 2. */
-public class DefaultFileExtensionRegistry extends MimeDetector {
-  private static final Logger log = LoggerFactory.getLogger(DefaultFileExtensionRegistry.class);
-  private static final ImmutableMap<String, MimeType> TYPES;
-
-  static {
-    Properties prop = new Properties();
-    try (InputStream in =
-        DefaultFileExtensionRegistry.class.getResourceAsStream("mime-types.properties")) {
-      prop.load(in);
-    } catch (IOException e) {
-      log.warn("Cannot load mime-types.properties", e);
-    }
-
-    ImmutableMap.Builder<String, MimeType> b = ImmutableMap.builder();
-    for (Map.Entry<Object, Object> e : prop.entrySet()) {
-      MimeType type = new FileExtensionMimeType((String) e.getValue());
-      b.put((String) e.getKey(), type);
-      MimeUtil.addKnownMimeType(type);
-    }
-    TYPES = b.build();
-  }
-
-  @Override
-  public String getDescription() {
-    return getClass().getName();
-  }
-
-  @Override
-  protected Collection<MimeType> getMimeTypesFileName(String name) {
-    int s = name.lastIndexOf('/');
-    if (s >= 0) {
-      name = name.substring(s + 1);
-    }
-
-    MimeType type = TYPES.get(name);
-    if (type != null) {
-      return Collections.singletonList(type);
-    }
-
-    int d = name.lastIndexOf('.');
-    if (0 < d) {
-      type = TYPES.get(name.substring(d + 1));
-      if (type != null) {
-        return Collections.singletonList(type);
-      }
-    }
-
-    return Collections.emptyList();
-  }
-
-  @Override
-  protected Collection<MimeType> getMimeTypesFile(File file) {
-    return getMimeTypesFileName(file.getName());
-  }
-
-  @Override
-  protected Collection<MimeType> getMimeTypesURL(URL url) {
-    return getMimeTypesFileName(url.getPath());
-  }
-
-  @Override
-  protected Collection<MimeType> getMimeTypesInputStream(InputStream arg0) {
-    return Collections.emptyList();
-  }
-
-  @Override
-  protected Collection<MimeType> getMimeTypesByteArray(byte[] arg0) {
-    return Collections.emptyList();
-  }
-
-  private static final class FileExtensionMimeType extends MimeType {
-    private static final long serialVersionUID = 1L;
-
-    FileExtensionMimeType(String mimeType) throws MimeException {
-      super(mimeType);
-    }
-
-    @Override
-    public int getSpecificity() {
-      return 2;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mime/MimeUtil2Module.java b/gerrit-server/src/main/java/com/google/gerrit/server/mime/MimeUtil2Module.java
deleted file mode 100644
index 387482a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mime/MimeUtil2Module.java
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.mime;
-
-import com.google.gerrit.server.util.HostPlatform;
-import com.google.inject.AbstractModule;
-import com.google.inject.Provides;
-import com.google.inject.Singleton;
-import eu.medsea.mimeutil.MimeUtil2;
-import eu.medsea.mimeutil.detector.ExtensionMimeDetector;
-import eu.medsea.mimeutil.detector.MagicMimeMimeDetector;
-
-public class MimeUtil2Module extends AbstractModule {
-  @Override
-  protected void configure() {}
-
-  @Provides
-  @Singleton
-  MimeUtil2 provideMimeUtil2() {
-    MimeUtil2 m = new MimeUtil2();
-    m.registerMimeDetector(ExtensionMimeDetector.class.getName());
-    m.registerMimeDetector(MagicMimeMimeDetector.class.getName());
-    if (HostPlatform.isWin32()) {
-      m.registerMimeDetector("eu.medsea.mimeutil.detector.WindowsRegistryMimeDetector");
-    }
-    m.registerMimeDetector(DefaultFileExtensionRegistry.class.getName());
-    return m;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mime/MimeUtilFileTypeRegistry.java b/gerrit-server/src/main/java/com/google/gerrit/server/mime/MimeUtilFileTypeRegistry.java
deleted file mode 100644
index 7cb34e2..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mime/MimeUtilFileTypeRegistry.java
+++ /dev/null
@@ -1,155 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.mime;
-
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import eu.medsea.mimeutil.MimeException;
-import eu.medsea.mimeutil.MimeType;
-import eu.medsea.mimeutil.MimeUtil2;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class MimeUtilFileTypeRegistry implements FileTypeRegistry {
-  private static final String KEY_SAFE = "safe";
-  private static final String SECTION_MIMETYPE = "mimetype";
-  private static final Logger log = LoggerFactory.getLogger(MimeUtilFileTypeRegistry.class);
-
-  private final Config cfg;
-  private final MimeUtil2 mimeUtil;
-
-  @Inject
-  MimeUtilFileTypeRegistry(@GerritServerConfig Config gsc, MimeUtil2 mu2) {
-    cfg = gsc;
-    mimeUtil = mu2;
-  }
-
-  /**
-   * Get specificity of mime types with generic types forced to low values
-   *
-   * <p>"application/octet-stream" is forced to -1. "text/plain" is forced to 0. All other mime
-   * types return the specificity reported by mimeType itself.
-   *
-   * @param mimeType The mimeType to get the corrected specificity for.
-   * @return The corrected specificity.
-   */
-  private int getCorrectedMimeSpecificity(MimeType mimeType) {
-    // Although the documentation of MimeType's getSpecificity claims that for
-    // example "application/octet-stream" always has a specificity of 0, it
-    // effectively returns 1 for us. This causes problems when trying to get
-    // the correct mime type via sorting. For example in
-    // [application/octet-stream, image/x-icon] both mime types come with
-    // specificity 1 for us. Hence, getMimeType below may end up using
-    // application/octet-stream instead of the more specific image/x-icon.
-    // Therefore, we have to force the specificity of generic types below the
-    // default of 1.
-    //
-    final String mimeTypeStr = mimeType.toString();
-    if (mimeTypeStr.equals("application/octet-stream")) {
-      return -1;
-    }
-    if (mimeTypeStr.equals("text/plain")) {
-      return 0;
-    }
-    return mimeType.getSpecificity();
-  }
-
-  @Override
-  @SuppressWarnings("unchecked")
-  public MimeType getMimeType(String path, byte[] content) {
-    Set<MimeType> mimeTypes = new HashSet<>();
-    if (content != null && content.length > 0) {
-      try {
-        mimeTypes.addAll(mimeUtil.getMimeTypes(content));
-      } catch (MimeException e) {
-        log.warn("Unable to determine MIME type from content", e);
-      }
-    }
-    return getMimeType(mimeTypes, path);
-  }
-
-  @Override
-  @SuppressWarnings("unchecked")
-  public MimeType getMimeType(String path, InputStream is) {
-    Set<MimeType> mimeTypes = new HashSet<>();
-    try {
-      mimeTypes.addAll(mimeUtil.getMimeTypes(is));
-    } catch (MimeException e) {
-      log.warn("Unable to determine MIME type from content", e);
-    }
-    return getMimeType(mimeTypes, path);
-  }
-
-  @SuppressWarnings("unchecked")
-  private MimeType getMimeType(Set<MimeType> mimeTypes, String path) {
-    try {
-      mimeTypes.addAll(mimeUtil.getMimeTypes(path));
-    } catch (MimeException e) {
-      log.warn("Unable to determine MIME type from path", e);
-    }
-
-    if (isUnknownType(mimeTypes)) {
-      return MimeUtil2.UNKNOWN_MIME_TYPE;
-    }
-
-    final List<MimeType> types = new ArrayList<>(mimeTypes);
-    Collections.sort(
-        types,
-        new Comparator<MimeType>() {
-          @Override
-          public int compare(MimeType a, MimeType b) {
-            return getCorrectedMimeSpecificity(b) - getCorrectedMimeSpecificity(a);
-          }
-        });
-    return types.get(0);
-  }
-
-  @Override
-  public boolean isSafeInline(MimeType type) {
-    if (MimeUtil2.UNKNOWN_MIME_TYPE.equals(type)) {
-      // Most browsers perform content type sniffing when they get told
-      // a generic content type. This is bad, so assume we cannot send
-      // the file inline.
-      //
-      return false;
-    }
-
-    final boolean any = isSafe(cfg, "*/*", false);
-    final boolean genericMedia = isSafe(cfg, type.getMediaType() + "/*", any);
-    return isSafe(cfg, type.toString(), genericMedia);
-  }
-
-  private static boolean isSafe(Config cfg, String type, boolean def) {
-    return cfg.getBoolean(SECTION_MIMETYPE, type, KEY_SAFE, def);
-  }
-
-  private static boolean isUnknownType(Collection<MimeType> mimeTypes) {
-    if (mimeTypes.isEmpty()) {
-      return true;
-    }
-    return mimeTypes.size() == 1 && mimeTypes.contains(MimeUtil2.UNKNOWN_MIME_TYPE);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/AbstractChangeNotes.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/AbstractChangeNotes.java
deleted file mode 100644
index ef2c9b3..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/AbstractChangeNotes.java
+++ /dev/null
@@ -1,240 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.notedb;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.gerrit.server.notedb.NoteDbTable.CHANGES;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.metrics.Timer1;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.notedb.ChangeNotesCommit.ChangeNotesRevWalk;
-import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
-import com.google.gerrit.server.notedb.rebuild.ChangeRebuilder;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-
-/** View of contents at a single ref related to some change. * */
-public abstract class AbstractChangeNotes<T> {
-  @VisibleForTesting
-  @Singleton
-  public static class Args {
-    final GitRepositoryManager repoManager;
-    final NotesMigration migration;
-    final AllUsersName allUsers;
-    final ChangeNoteUtil noteUtil;
-    final NoteDbMetrics metrics;
-    final Provider<ReviewDb> db;
-
-    // Providers required to avoid dependency cycles.
-
-    // ChangeRebuilder -> ChangeNotes.Factory -> Args
-    final Provider<ChangeRebuilder> rebuilder;
-
-    // ChangeNoteCache -> Args
-    final Provider<ChangeNotesCache> cache;
-
-    @Inject
-    Args(
-        GitRepositoryManager repoManager,
-        NotesMigration migration,
-        AllUsersName allUsers,
-        ChangeNoteUtil noteUtil,
-        NoteDbMetrics metrics,
-        Provider<ReviewDb> db,
-        Provider<ChangeRebuilder> rebuilder,
-        Provider<ChangeNotesCache> cache) {
-      this.repoManager = repoManager;
-      this.migration = migration;
-      this.allUsers = allUsers;
-      this.noteUtil = noteUtil;
-      this.metrics = metrics;
-      this.db = db;
-      this.rebuilder = rebuilder;
-      this.cache = cache;
-    }
-  }
-
-  @AutoValue
-  public abstract static class LoadHandle implements AutoCloseable {
-    public static LoadHandle create(ChangeNotesRevWalk walk, ObjectId id) {
-      if (ObjectId.zeroId().equals(id)) {
-        id = null;
-      } else if (id != null) {
-        id = id.copy();
-      }
-      return new AutoValue_AbstractChangeNotes_LoadHandle(checkNotNull(walk), id);
-    }
-
-    public static LoadHandle missing() {
-      return new AutoValue_AbstractChangeNotes_LoadHandle(null, null);
-    }
-
-    @Nullable
-    public abstract ChangeNotesRevWalk walk();
-
-    @Nullable
-    public abstract ObjectId id();
-
-    @Override
-    public void close() {
-      if (walk() != null) {
-        walk().close();
-      }
-    }
-  }
-
-  protected final Args args;
-  protected final PrimaryStorage primaryStorage;
-  protected final boolean autoRebuild;
-  private final Change.Id changeId;
-
-  private ObjectId revision;
-  private boolean loaded;
-
-  AbstractChangeNotes(
-      Args args, Change.Id changeId, @Nullable PrimaryStorage primaryStorage, boolean autoRebuild) {
-    this.args = checkNotNull(args);
-    this.changeId = checkNotNull(changeId);
-    this.primaryStorage = primaryStorage;
-    this.autoRebuild =
-        primaryStorage == PrimaryStorage.REVIEW_DB
-            && !args.migration.disableChangeReviewDb()
-            && autoRebuild;
-  }
-
-  public Change.Id getChangeId() {
-    return changeId;
-  }
-
-  /** @return revision of the metadata that was loaded. */
-  public ObjectId getRevision() {
-    return revision;
-  }
-
-  public T load() throws OrmException {
-    if (loaded) {
-      return self();
-    }
-    boolean read = args.migration.readChanges();
-    if (!read && primaryStorage == PrimaryStorage.NOTE_DB) {
-      throw new OrmException("NoteDb is required to read change " + changeId);
-    }
-    boolean readOrWrite = read || args.migration.rawWriteChangesSetting();
-    if (!readOrWrite) {
-      // Don't even open the repo if we neither write to nor read from NoteDb. It's possible that
-      // there is some garbage in the noteDbState field and/or the repo, but at this point NoteDb is
-      // completely off so it's none of our business.
-      loadDefaults();
-      return self();
-    }
-    if (args.migration.failOnLoadForTest()) {
-      throw new OrmException("Reading from NoteDb is disabled");
-    }
-    try (Timer1.Context timer = args.metrics.readLatency.start(CHANGES);
-        Repository repo = args.repoManager.openRepository(getProjectName());
-        // Call openHandle even if reading is disabled, to trigger
-        // auto-rebuilding before this object may get passed to a ChangeUpdate.
-        LoadHandle handle = openHandle(repo)) {
-      if (read) {
-        revision = handle.id();
-        onLoad(handle);
-      } else {
-        loadDefaults();
-      }
-      loaded = true;
-    } catch (ConfigInvalidException | IOException e) {
-      throw new OrmException(e);
-    }
-    return self();
-  }
-
-  protected ObjectId readRef(Repository repo) throws IOException {
-    Ref ref = repo.getRefDatabase().exactRef(getRefName());
-    return ref != null ? ref.getObjectId() : null;
-  }
-
-  /**
-   * Open a handle for reading this entity from a repository.
-   *
-   * <p>Implementations may override this method to provide auto-rebuilding behavior.
-   *
-   * @param repo open repository.
-   * @return handle for reading the entity.
-   * @throws NoSuchChangeException change does not exist.
-   * @throws IOException a repo-level error occurred.
-   */
-  protected LoadHandle openHandle(Repository repo) throws NoSuchChangeException, IOException {
-    return openHandle(repo, readRef(repo));
-  }
-
-  protected LoadHandle openHandle(Repository repo, ObjectId id) {
-    return LoadHandle.create(ChangeNotesCommit.newRevWalk(repo), id);
-  }
-
-  public T reload() throws NoSuchChangeException, OrmException {
-    loaded = false;
-    return load();
-  }
-
-  public ObjectId loadRevision() throws OrmException {
-    if (loaded) {
-      return getRevision();
-    } else if (!args.migration.readChanges()) {
-      return null;
-    }
-    try (Repository repo = args.repoManager.openRepository(getProjectName())) {
-      Ref ref = repo.getRefDatabase().exactRef(getRefName());
-      return ref != null ? ref.getObjectId() : null;
-    } catch (IOException e) {
-      throw new OrmException(e);
-    }
-  }
-
-  /** Load default values for any instance variables when NoteDb is disabled. */
-  protected abstract void loadDefaults();
-
-  /**
-   * @return the NameKey for the project where the notes should be stored, which is not necessarily
-   *     the same as the change's project.
-   */
-  public abstract Project.NameKey getProjectName();
-
-  /** @return name of the reference storing this configuration. */
-  protected abstract String getRefName();
-
-  /** Set up the metadata, parsing any state from the loaded revision. */
-  protected abstract void onLoad(LoadHandle handle)
-      throws NoSuchChangeException, IOException, ConfigInvalidException;
-
-  @SuppressWarnings("unchecked")
-  protected final T self() {
-    return (T) this;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/AbstractChangeUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/AbstractChangeUpdate.java
deleted file mode 100644
index f3f3a13..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/AbstractChangeUpdate.java
+++ /dev/null
@@ -1,316 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.notedb;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkState;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.InternalUser;
-import com.google.gwtorm.server.OrmException;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.Date;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-/** A single delta related to a specific patch-set of a change. */
-public abstract class AbstractChangeUpdate {
-  protected final NotesMigration migration;
-  protected final ChangeNoteUtil noteUtil;
-  protected final String anonymousCowardName;
-  protected final Account.Id accountId;
-  protected final Account.Id realAccountId;
-  protected final PersonIdent authorIdent;
-  protected final Date when;
-  private final long readOnlySkewMs;
-
-  @Nullable private final ChangeNotes notes;
-  private final Change change;
-  protected final PersonIdent serverIdent;
-
-  protected PatchSet.Id psId;
-  private ObjectId result;
-  protected boolean rootOnly;
-
-  protected AbstractChangeUpdate(
-      Config cfg,
-      NotesMigration migration,
-      ChangeNotes notes,
-      CurrentUser user,
-      PersonIdent serverIdent,
-      String anonymousCowardName,
-      ChangeNoteUtil noteUtil,
-      Date when) {
-    this.migration = migration;
-    this.noteUtil = noteUtil;
-    this.serverIdent = new PersonIdent(serverIdent, when);
-    this.anonymousCowardName = anonymousCowardName;
-    this.notes = notes;
-    this.change = notes.getChange();
-    this.accountId = accountId(user);
-    Account.Id realAccountId = accountId(user.getRealUser());
-    this.realAccountId = realAccountId != null ? realAccountId : accountId;
-    this.authorIdent = ident(noteUtil, serverIdent, anonymousCowardName, user, when);
-    this.when = when;
-    this.readOnlySkewMs = NoteDbChangeState.getReadOnlySkew(cfg);
-  }
-
-  protected AbstractChangeUpdate(
-      Config cfg,
-      NotesMigration migration,
-      ChangeNoteUtil noteUtil,
-      PersonIdent serverIdent,
-      String anonymousCowardName,
-      @Nullable ChangeNotes notes,
-      @Nullable Change change,
-      Account.Id accountId,
-      Account.Id realAccountId,
-      PersonIdent authorIdent,
-      Date when) {
-    checkArgument(
-        (notes != null && change == null) || (notes == null && change != null),
-        "exactly one of notes or change required");
-    this.migration = migration;
-    this.noteUtil = noteUtil;
-    this.serverIdent = new PersonIdent(serverIdent, when);
-    this.anonymousCowardName = anonymousCowardName;
-    this.notes = notes;
-    this.change = change != null ? change : notes.getChange();
-    this.accountId = accountId;
-    this.realAccountId = realAccountId;
-    this.authorIdent = authorIdent;
-    this.when = when;
-    this.readOnlySkewMs = NoteDbChangeState.getReadOnlySkew(cfg);
-  }
-
-  private static void checkUserType(CurrentUser user) {
-    checkArgument(
-        (user instanceof IdentifiedUser) || (user instanceof InternalUser),
-        "user must be IdentifiedUser or InternalUser: %s",
-        user);
-  }
-
-  private static Account.Id accountId(CurrentUser u) {
-    checkUserType(u);
-    return (u instanceof IdentifiedUser) ? u.getAccountId() : null;
-  }
-
-  private static PersonIdent ident(
-      ChangeNoteUtil noteUtil,
-      PersonIdent serverIdent,
-      String anonymousCowardName,
-      CurrentUser u,
-      Date when) {
-    checkUserType(u);
-    if (u instanceof IdentifiedUser) {
-      return noteUtil.newIdent(
-          u.asIdentifiedUser().getAccount(), when, serverIdent, anonymousCowardName);
-    } else if (u instanceof InternalUser) {
-      return serverIdent;
-    }
-    throw new IllegalStateException();
-  }
-
-  public Change.Id getId() {
-    return change.getId();
-  }
-
-  /**
-   * @return notes for the state of this change prior to this update. If this update is part of a
-   *     series managed by a {@link NoteDbUpdateManager}, then this reflects the state prior to the
-   *     first update in the series. A null return value can only happen when the change is being
-   *     rebuilt from NoteDb. A change that is in the process of being created will result in a
-   *     non-null return value from this method, but a null return value from {@link
-   *     ChangeNotes#getRevision()}.
-   */
-  @Nullable
-  public ChangeNotes getNotes() {
-    return notes;
-  }
-
-  public Change getChange() {
-    return change;
-  }
-
-  public Date getWhen() {
-    return when;
-  }
-
-  public PatchSet.Id getPatchSetId() {
-    return psId;
-  }
-
-  public void setPatchSetId(PatchSet.Id psId) {
-    checkArgument(psId == null || psId.getParentKey().equals(getId()));
-    this.psId = psId;
-  }
-
-  public Account.Id getAccountId() {
-    checkState(
-        accountId != null,
-        "author identity for %s is not from an IdentifiedUser: %s",
-        getClass().getSimpleName(),
-        authorIdent.toExternalString());
-    return accountId;
-  }
-
-  public Account.Id getNullableAccountId() {
-    return accountId;
-  }
-
-  protected PersonIdent newIdent(Account author, Date when) {
-    return noteUtil.newIdent(author, when, serverIdent, anonymousCowardName);
-  }
-
-  /** Whether no updates have been done. */
-  public abstract boolean isEmpty();
-
-  /** Wether this update can only be a root commit. */
-  public boolean isRootOnly() {
-    return rootOnly;
-  }
-
-  /**
-   * @return the NameKey for the project where the update will be stored, which is not necessarily
-   *     the same as the change's project.
-   */
-  protected abstract Project.NameKey getProjectName();
-
-  protected abstract String getRefName();
-
-  /**
-   * Apply this update to the given inserter.
-   *
-   * @param rw walk for reading back any objects needed for the update.
-   * @param ins inserter to write to; callers should not flush.
-   * @param curr the current tip of the branch prior to this update.
-   * @return commit ID produced by inserting this update's commit, or null if this update is a no-op
-   *     and should be skipped. The zero ID is a valid return value, and indicates the ref should be
-   *     deleted.
-   * @throws OrmException if a Gerrit-level error occurred.
-   * @throws IOException if a lower-level error occurred.
-   */
-  final ObjectId apply(RevWalk rw, ObjectInserter ins, ObjectId curr)
-      throws OrmException, IOException {
-    if (isEmpty()) {
-      return null;
-    }
-
-    // Allow this method to proceed even if migration.failChangeWrites() = true.
-    // This may be used by an auto-rebuilding step that the caller does not plan
-    // to actually store.
-
-    checkArgument(rw.getObjectReader().getCreatedFromInserter() == ins);
-    checkNotReadOnly();
-    ObjectId z = ObjectId.zeroId();
-    CommitBuilder cb = applyImpl(rw, ins, curr);
-    if (cb == null) {
-      result = z;
-      return z; // Impl intends to delete the ref.
-    } else if (cb == NO_OP_UPDATE) {
-      return null; // Impl is a no-op.
-    }
-    cb.setAuthor(authorIdent);
-    cb.setCommitter(new PersonIdent(serverIdent, when));
-    if (!curr.equals(z)) {
-      cb.setParentId(curr);
-    } else {
-      cb.setParentIds(); // Ref is currently nonexistent, commit has no parents.
-    }
-    if (cb.getTreeId() == null) {
-      if (curr.equals(z)) {
-        cb.setTreeId(emptyTree(ins)); // No parent, assume empty tree.
-      } else {
-        RevCommit p = rw.parseCommit(curr);
-        cb.setTreeId(p.getTree()); // Copy tree from parent.
-      }
-    }
-    result = ins.insert(cb);
-    return result;
-  }
-
-  protected void checkNotReadOnly() throws OrmException {
-    ChangeNotes notes = getNotes();
-    if (notes == null) {
-      // Can only happen during ChangeRebuilder, which will never include a read-only lease.
-      return;
-    }
-    Timestamp until = notes.getReadOnlyUntil();
-    if (until != null && NoteDbChangeState.timeForReadOnlyCheck(readOnlySkewMs).before(until)) {
-      throw new OrmException("change " + notes.getChangeId() + " is read-only until " + until);
-    }
-  }
-
-  /**
-   * Create a commit containing the contents of this update.
-   *
-   * @param ins inserter to write to; callers should not flush.
-   * @return a new commit builder representing this commit, or null to indicate the meta ref should
-   *     be deleted as a result of this update. The parent, author, and committer fields in the
-   *     return value are always overwritten. The tree ID may be unset by this method, which
-   *     indicates to the caller that it should be copied from the parent commit. To indicate that
-   *     this update is a no-op (but this could not be determined by {@link #isEmpty()}), return the
-   *     sentinel {@link #NO_OP_UPDATE}.
-   * @throws OrmException if a Gerrit-level error occurred.
-   * @throws IOException if a lower-level error occurred.
-   */
-  protected abstract CommitBuilder applyImpl(RevWalk rw, ObjectInserter ins, ObjectId curr)
-      throws OrmException, IOException;
-
-  protected static final CommitBuilder NO_OP_UPDATE = new CommitBuilder();
-
-  ObjectId getResult() {
-    return result;
-  }
-
-  public boolean allowWriteToNewRef() {
-    return true;
-  }
-
-  private static ObjectId emptyTree(ObjectInserter ins) throws IOException {
-    return ins.insert(Constants.OBJ_TREE, new byte[] {});
-  }
-
-  protected void verifyComment(Comment c) {
-    checkArgument(c.revId != null, "RevId required for comment: %s", c);
-    checkArgument(
-        c.author.getId().equals(getAccountId()),
-        "The author for the following comment does not match the author of this %s (%s): %s",
-        getClass().getSimpleName(),
-        getAccountId(),
-        c);
-    checkArgument(
-        c.getRealAuthor().getId().equals(realAccountId),
-        "The real author for the following comment does not match the real"
-            + " author of this %s (%s): %s",
-        getClass().getSimpleName(),
-        realAccountId,
-        c);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeBundle.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeBundle.java
deleted file mode 100644
index b9348eb..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeBundle.java
+++ /dev/null
@@ -1,1032 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.notedb;
-
-import static com.google.common.base.MoreObjects.firstNonNull;
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.gerrit.common.TimeUtil.roundToSecond;
-import static com.google.gerrit.reviewdb.server.ReviewDbUtil.intKeyOrdering;
-import static com.google.gerrit.server.notedb.ChangeBundle.Source.NOTE_DB;
-import static com.google.gerrit.server.notedb.ChangeBundle.Source.REVIEW_DB;
-import static java.util.stream.Collectors.toList;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.base.CharMatcher;
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-import com.google.common.base.Predicates;
-import com.google.common.base.Strings;
-import com.google.common.collect.Collections2;
-import com.google.common.collect.ComparisonChain;
-import com.google.common.collect.ImmutableCollection;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSortedMap;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.LinkedListMultimap;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Ordering;
-import com.google.common.collect.Sets;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.Patch;
-import com.google.gerrit.reviewdb.client.PatchLineComment;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.server.ChangeUtil;
-import com.google.gerrit.server.CommentsUtil;
-import com.google.gerrit.server.ReviewerSet;
-import com.google.gerrit.server.notedb.rebuild.ChangeRebuilderImpl;
-import com.google.gwtorm.client.Column;
-import com.google.gwtorm.server.OrmException;
-import java.lang.reflect.Field;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.TreeSet;
-
-/**
- * A bundle of all entities rooted at a single {@link Change} entity.
- *
- * <p>See the {@link Change} Javadoc for a depiction of this tree. Bundles may be compared using
- * {@link #differencesFrom(ChangeBundle)}, which normalizes out the minor implementation differences
- * between ReviewDb and NoteDb.
- */
-public class ChangeBundle {
-  public enum Source {
-    REVIEW_DB,
-    NOTE_DB;
-  }
-
-  public static ChangeBundle fromNotes(CommentsUtil commentsUtil, ChangeNotes notes)
-      throws OrmException {
-    return new ChangeBundle(
-        notes.getChange(),
-        notes.getChangeMessages(),
-        notes.getPatchSets().values(),
-        notes.getApprovals().values(),
-        Iterables.concat(
-            CommentsUtil.toPatchLineComments(
-                notes.getChangeId(),
-                PatchLineComment.Status.DRAFT,
-                commentsUtil.draftByChange(null, notes)),
-            CommentsUtil.toPatchLineComments(
-                notes.getChangeId(),
-                PatchLineComment.Status.PUBLISHED,
-                commentsUtil.publishedByChange(null, notes))),
-        notes.getReviewers(),
-        Source.NOTE_DB);
-  }
-
-  private static Map<ChangeMessage.Key, ChangeMessage> changeMessageMap(
-      Iterable<ChangeMessage> in) {
-    Map<ChangeMessage.Key, ChangeMessage> out =
-        new TreeMap<>(
-            new Comparator<ChangeMessage.Key>() {
-              @Override
-              public int compare(ChangeMessage.Key a, ChangeMessage.Key b) {
-                return ComparisonChain.start()
-                    .compare(a.getParentKey().get(), b.getParentKey().get())
-                    .compare(a.get(), b.get())
-                    .result();
-              }
-            });
-    for (ChangeMessage cm : in) {
-      out.put(cm.getKey(), cm);
-    }
-    return out;
-  }
-
-  // Unlike the *Map comparators, which are intended to make key lists diffable,
-  // this comparator sorts first on timestamp, then on every other field.
-  private static final Ordering<ChangeMessage> CHANGE_MESSAGE_ORDER =
-      new Ordering<ChangeMessage>() {
-        final Ordering<Comparable<?>> nullsFirst = Ordering.natural().nullsFirst();
-
-        @Override
-        public int compare(ChangeMessage a, ChangeMessage b) {
-          return ComparisonChain.start()
-              .compare(a.getWrittenOn(), b.getWrittenOn())
-              .compare(a.getKey().getParentKey().get(), b.getKey().getParentKey().get())
-              .compare(psId(a), psId(b), nullsFirst)
-              .compare(a.getAuthor(), b.getAuthor(), intKeyOrdering())
-              .compare(a.getMessage(), b.getMessage(), nullsFirst)
-              .result();
-        }
-
-        private Integer psId(ChangeMessage m) {
-          return m.getPatchSetId() != null ? m.getPatchSetId().get() : null;
-        }
-      };
-
-  private static ImmutableList<ChangeMessage> changeMessageList(Iterable<ChangeMessage> in) {
-    return CHANGE_MESSAGE_ORDER.immutableSortedCopy(in);
-  }
-
-  private static TreeMap<PatchSet.Id, PatchSet> patchSetMap(Iterable<PatchSet> in) {
-    TreeMap<PatchSet.Id, PatchSet> out =
-        new TreeMap<>(
-            new Comparator<PatchSet.Id>() {
-              @Override
-              public int compare(PatchSet.Id a, PatchSet.Id b) {
-                return patchSetIdChain(a, b).result();
-              }
-            });
-    for (PatchSet ps : in) {
-      out.put(ps.getId(), ps);
-    }
-    return out;
-  }
-
-  private static Map<PatchSetApproval.Key, PatchSetApproval> patchSetApprovalMap(
-      Iterable<PatchSetApproval> in) {
-    Map<PatchSetApproval.Key, PatchSetApproval> out =
-        new TreeMap<>(
-            new Comparator<PatchSetApproval.Key>() {
-              @Override
-              public int compare(PatchSetApproval.Key a, PatchSetApproval.Key b) {
-                return patchSetIdChain(a.getParentKey(), b.getParentKey())
-                    .compare(a.getAccountId().get(), b.getAccountId().get())
-                    .compare(a.getLabelId(), b.getLabelId())
-                    .result();
-              }
-            });
-    for (PatchSetApproval psa : in) {
-      out.put(psa.getKey(), psa);
-    }
-    return out;
-  }
-
-  private static Map<PatchLineComment.Key, PatchLineComment> patchLineCommentMap(
-      Iterable<PatchLineComment> in) {
-    Map<PatchLineComment.Key, PatchLineComment> out =
-        new TreeMap<>(
-            new Comparator<PatchLineComment.Key>() {
-              @Override
-              public int compare(PatchLineComment.Key a, PatchLineComment.Key b) {
-                Patch.Key pka = a.getParentKey();
-                Patch.Key pkb = b.getParentKey();
-                return patchSetIdChain(pka.getParentKey(), pkb.getParentKey())
-                    .compare(pka.get(), pkb.get())
-                    .compare(a.get(), b.get())
-                    .result();
-              }
-            });
-    for (PatchLineComment plc : in) {
-      out.put(plc.getKey(), plc);
-    }
-    return out;
-  }
-
-  private static ComparisonChain patchSetIdChain(PatchSet.Id a, PatchSet.Id b) {
-    return ComparisonChain.start()
-        .compare(a.getParentKey().get(), b.getParentKey().get())
-        .compare(a.get(), b.get());
-  }
-
-  private static void checkColumns(Class<?> clazz, Integer... expected) {
-    Set<Integer> ids = new TreeSet<>();
-    for (Field f : clazz.getDeclaredFields()) {
-      Column col = f.getAnnotation(Column.class);
-      if (col != null) {
-        ids.add(col.id());
-      }
-    }
-    Set<Integer> expectedIds = Sets.newTreeSet(Arrays.asList(expected));
-    checkState(
-        ids.equals(expectedIds),
-        "Unexpected column set for %s: %s != %s",
-        clazz.getSimpleName(),
-        ids,
-        expectedIds);
-  }
-
-  static {
-    // Initialization-time checks that the column set hasn't changed since the
-    // last time this file was updated.
-    checkColumns(Change.Id.class, 1);
-
-    checkColumns(
-        Change.class, 1, 2, 3, 4, 5, 7, 8, 10, 12, 13, 14, 17, 18, 19, 20, 21, 22, 23, 101);
-    checkColumns(ChangeMessage.Key.class, 1, 2);
-    checkColumns(ChangeMessage.class, 1, 2, 3, 4, 5, 6, 7);
-    checkColumns(PatchSet.Id.class, 1, 2);
-    checkColumns(PatchSet.class, 1, 2, 3, 4, 6, 8, 9);
-    checkColumns(PatchSetApproval.Key.class, 1, 2, 3);
-    checkColumns(PatchSetApproval.class, 1, 2, 3, 6, 7, 8);
-    checkColumns(PatchLineComment.Key.class, 1, 2);
-    checkColumns(PatchLineComment.class, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
-  }
-
-  private final Change change;
-  private final ImmutableList<ChangeMessage> changeMessages;
-  private final ImmutableSortedMap<PatchSet.Id, PatchSet> patchSets;
-  private final ImmutableMap<PatchSetApproval.Key, PatchSetApproval> patchSetApprovals;
-  private final ImmutableMap<PatchLineComment.Key, PatchLineComment> patchLineComments;
-  private final ReviewerSet reviewers;
-  private final Source source;
-
-  public ChangeBundle(
-      Change change,
-      Iterable<ChangeMessage> changeMessages,
-      Iterable<PatchSet> patchSets,
-      Iterable<PatchSetApproval> patchSetApprovals,
-      Iterable<PatchLineComment> patchLineComments,
-      ReviewerSet reviewers,
-      Source source) {
-    this.change = checkNotNull(change);
-    this.changeMessages = changeMessageList(changeMessages);
-    this.patchSets = ImmutableSortedMap.copyOfSorted(patchSetMap(patchSets));
-    this.patchSetApprovals = ImmutableMap.copyOf(patchSetApprovalMap(patchSetApprovals));
-    this.patchLineComments = ImmutableMap.copyOf(patchLineCommentMap(patchLineComments));
-    this.reviewers = checkNotNull(reviewers);
-    this.source = checkNotNull(source);
-
-    for (ChangeMessage m : this.changeMessages) {
-      checkArgument(m.getKey().getParentKey().equals(change.getId()));
-    }
-    for (PatchSet.Id id : this.patchSets.keySet()) {
-      checkArgument(id.getParentKey().equals(change.getId()));
-    }
-    for (PatchSetApproval.Key k : this.patchSetApprovals.keySet()) {
-      checkArgument(k.getParentKey().getParentKey().equals(change.getId()));
-    }
-    for (PatchLineComment.Key k : this.patchLineComments.keySet()) {
-      checkArgument(k.getParentKey().getParentKey().getParentKey().equals(change.getId()));
-    }
-  }
-
-  public Change getChange() {
-    return change;
-  }
-
-  public ImmutableCollection<ChangeMessage> getChangeMessages() {
-    return changeMessages;
-  }
-
-  public ImmutableCollection<PatchSet> getPatchSets() {
-    return patchSets.values();
-  }
-
-  public ImmutableCollection<PatchSetApproval> getPatchSetApprovals() {
-    return patchSetApprovals.values();
-  }
-
-  public ImmutableCollection<PatchLineComment> getPatchLineComments() {
-    return patchLineComments.values();
-  }
-
-  public ReviewerSet getReviewers() {
-    return reviewers;
-  }
-
-  public Source getSource() {
-    return source;
-  }
-
-  public ImmutableList<String> differencesFrom(ChangeBundle o) {
-    List<String> diffs = new ArrayList<>();
-    diffChanges(diffs, this, o);
-    diffChangeMessages(diffs, this, o);
-    diffPatchSets(diffs, this, o);
-    diffPatchSetApprovals(diffs, this, o);
-    diffReviewers(diffs, this, o);
-    diffPatchLineComments(diffs, this, o);
-    return ImmutableList.copyOf(diffs);
-  }
-
-  private Timestamp getFirstPatchSetTime() {
-    if (patchSets.isEmpty()) {
-      return change.getCreatedOn();
-    }
-    return patchSets.firstEntry().getValue().getCreatedOn();
-  }
-
-  private Timestamp getLatestTimestamp() {
-    Ordering<Timestamp> o = Ordering.natural().nullsFirst();
-    Timestamp ts = null;
-    for (ChangeMessage cm : filterChangeMessages()) {
-      ts = o.max(ts, cm.getWrittenOn());
-    }
-    for (PatchSet ps : getPatchSets()) {
-      ts = o.max(ts, ps.getCreatedOn());
-    }
-    for (PatchSetApproval psa : filterPatchSetApprovals().values()) {
-      ts = o.max(ts, psa.getGranted());
-    }
-    for (PatchLineComment plc : filterPatchLineComments().values()) {
-      // Ignore draft comments, as they do not show up in the change meta graph.
-      if (plc.getStatus() != PatchLineComment.Status.DRAFT) {
-        ts = o.max(ts, plc.getWrittenOn());
-      }
-    }
-    return firstNonNull(ts, change.getLastUpdatedOn());
-  }
-
-  private Map<PatchSetApproval.Key, PatchSetApproval> filterPatchSetApprovals() {
-    return limitToValidPatchSets(patchSetApprovals, PatchSetApproval.Key::getParentKey);
-  }
-
-  private Map<PatchLineComment.Key, PatchLineComment> filterPatchLineComments() {
-    return limitToValidPatchSets(patchLineComments, k -> k.getParentKey().getParentKey());
-  }
-
-  private <K, V> Map<K, V> limitToValidPatchSets(Map<K, V> in, Function<K, PatchSet.Id> func) {
-    return Maps.filterKeys(in, Predicates.compose(validPatchSetPredicate(), func));
-  }
-
-  private Predicate<PatchSet.Id> validPatchSetPredicate() {
-    return patchSets::containsKey;
-  }
-
-  private Collection<ChangeMessage> filterChangeMessages() {
-    final Predicate<PatchSet.Id> validPatchSet = validPatchSetPredicate();
-    return Collections2.filter(
-        changeMessages,
-        m -> {
-          PatchSet.Id psId = m.getPatchSetId();
-          if (psId == null) {
-            return true;
-          }
-          return validPatchSet.apply(psId);
-        });
-  }
-
-  private static void diffChanges(List<String> diffs, ChangeBundle bundleA, ChangeBundle bundleB) {
-    Change a = bundleA.change;
-    Change b = bundleB.change;
-    String desc = a.getId().equals(b.getId()) ? describe(a.getId()) : "Changes";
-
-    boolean excludeCreatedOn = false;
-    boolean excludeCurrentPatchSetId = false;
-    boolean excludeTopic = false;
-    Timestamp aCreated = a.getCreatedOn();
-    Timestamp bCreated = b.getCreatedOn();
-    Timestamp aUpdated = a.getLastUpdatedOn();
-    Timestamp bUpdated = b.getLastUpdatedOn();
-
-    boolean excludeSubject = false;
-    boolean excludeOrigSubj = false;
-    // Subject is not technically a nullable field, but we observed some null
-    // subjects in the wild on googlesource.com, so treat null as empty.
-    String aSubj = Strings.nullToEmpty(a.getSubject());
-    String bSubj = Strings.nullToEmpty(b.getSubject());
-
-    // Allow created timestamp in NoteDb to be any of:
-    //  - The created timestamp of the change.
-    //  - The timestamp of the first remaining patch set.
-    //  - The last updated timestamp, if it is less than the created timestamp.
-    //
-    // Ignore subject if the NoteDb subject starts with the ReviewDb subject.
-    // The NoteDb subject is read directly from the commit, whereas the ReviewDb
-    // subject historically may have been truncated to fit in a SQL varchar
-    // column.
-    //
-    // Ignore original subject on the ReviewDb side when comparing to NoteDb.
-    // This field may have any number of values:
-    //  - It may be null, if the change has had no new patch sets pushed since
-    //    migrating to schema 103.
-    //  - It may match the first patch set subject, if the change was created
-    //    after migrating to schema 103.
-    //  - It may match the subject of the first patch set that was pushed after
-    //    the migration to schema 103, even though that is neither the subject
-    //    of the first patch set nor the subject of the last patch set. (See
-    //    Change#setCurrentPatchSet as of 43b10f86 for this behavior.) This
-    //    subject of an intermediate patch set is not available to the
-    //    ChangeBundle; we would have to get the subject from the repo, which is
-    //    inconvenient at this point.
-    //
-    // Ignore original subject on the ReviewDb side if it equals the subject of
-    // the current patch set.
-    //
-    // For all of the above subject comparisons, first trim any leading spaces
-    // from the NoteDb strings. (We actually do represent the leading spaces
-    // faithfully during conversion, but JGit's FooterLine parser trims them
-    // when reading.)
-    //
-    // Ignore empty topic on the ReviewDb side if it is null on the NoteDb side.
-    //
-    // Ignore currentPatchSetId on NoteDb side if ReviewDb does not point to a
-    // valid patch set.
-    //
-    // Use max timestamp of all ReviewDb entities when comparing with NoteDb.
-    if (bundleA.source == REVIEW_DB && bundleB.source == NOTE_DB) {
-      boolean createdOnMatchesFirstPs =
-          !timestampsDiffer(bundleA, bundleA.getFirstPatchSetTime(), bundleB, bCreated);
-      boolean createdOnMatchesLastUpdatedOn =
-          !timestampsDiffer(bundleA, aUpdated, bundleB, bCreated);
-      boolean createdAfterUpdated = aCreated.compareTo(aUpdated) > 0;
-      excludeCreatedOn =
-          createdOnMatchesFirstPs || (createdAfterUpdated && createdOnMatchesLastUpdatedOn);
-
-      aSubj = cleanReviewDbSubject(aSubj);
-      bSubj = cleanNoteDbSubject(bSubj);
-      excludeCurrentPatchSetId = !bundleA.validPatchSetPredicate().apply(a.currentPatchSetId());
-      excludeSubject = bSubj.startsWith(aSubj) || excludeCurrentPatchSetId;
-      excludeOrigSubj = true;
-      String aTopic = trimOrNull(a.getTopic());
-      excludeTopic =
-          Objects.equals(aTopic, b.getTopic()) || ("".equals(aTopic) && b.getTopic() == null);
-      aUpdated = bundleA.getLatestTimestamp();
-    } else if (bundleA.source == NOTE_DB && bundleB.source == REVIEW_DB) {
-      boolean createdOnMatchesFirstPs =
-          !timestampsDiffer(bundleA, aCreated, bundleB, bundleB.getFirstPatchSetTime());
-      boolean createdOnMatchesLastUpdatedOn =
-          !timestampsDiffer(bundleA, aCreated, bundleB, bUpdated);
-      boolean createdAfterUpdated = bCreated.compareTo(bUpdated) > 0;
-      excludeCreatedOn =
-          createdOnMatchesFirstPs || (createdAfterUpdated && createdOnMatchesLastUpdatedOn);
-
-      aSubj = cleanNoteDbSubject(aSubj);
-      bSubj = cleanReviewDbSubject(bSubj);
-      excludeCurrentPatchSetId = !bundleB.validPatchSetPredicate().apply(b.currentPatchSetId());
-      excludeSubject = aSubj.startsWith(bSubj) || excludeCurrentPatchSetId;
-      excludeOrigSubj = true;
-      String bTopic = trimOrNull(b.getTopic());
-      excludeTopic =
-          Objects.equals(bTopic, a.getTopic()) || (a.getTopic() == null && "".equals(bTopic));
-      bUpdated = bundleB.getLatestTimestamp();
-    }
-
-    String subjectField = "subject";
-    String updatedField = "lastUpdatedOn";
-    List<String> exclude =
-        Lists.newArrayList(subjectField, updatedField, "noteDbState", "rowVersion");
-    if (excludeCreatedOn) {
-      exclude.add("createdOn");
-    }
-    if (excludeCurrentPatchSetId) {
-      exclude.add("currentPatchSetId");
-    }
-    if (excludeOrigSubj) {
-      exclude.add("originalSubject");
-    }
-    if (excludeTopic) {
-      exclude.add("topic");
-    }
-    diffColumnsExcluding(diffs, Change.class, desc, bundleA, a, bundleB, b, exclude);
-
-    // Allow last updated timestamps to either be exactly equal (within slop),
-    // or the NoteDb timestamp to be equal to the latest entity timestamp in the
-    // whole ReviewDb bundle (within slop).
-    if (timestampsDiffer(bundleA, a.getLastUpdatedOn(), bundleB, b.getLastUpdatedOn())) {
-      diffTimestamps(
-          diffs, desc, bundleA, aUpdated, bundleB, bUpdated, "effective last updated time");
-    }
-    if (!excludeSubject) {
-      diffValues(diffs, desc, aSubj, bSubj, subjectField);
-    }
-  }
-
-  private static String trimOrNull(String s) {
-    return s != null ? CharMatcher.whitespace().trimFrom(s) : null;
-  }
-
-  private static String cleanReviewDbSubject(String s) {
-    s = CharMatcher.is(' ').trimLeadingFrom(s);
-
-    // An old JGit bug failed to extract subjects from commits with "\r\n"
-    // terminators: https://bugs.eclipse.org/bugs/show_bug.cgi?id=400707
-    // Changes created with this bug may have "\r\n" converted to "\r " and the
-    // entire commit in the subject. The version of JGit used to read NoteDb
-    // changes parses these subjects correctly, so we need to clean up old
-    // ReviewDb subjects before comparing.
-    int rn = s.indexOf("\r \r ");
-    if (rn >= 0) {
-      s = s.substring(0, rn);
-    }
-    return ChangeNoteUtil.sanitizeFooter(s);
-  }
-
-  private static String cleanNoteDbSubject(String s) {
-    return ChangeNoteUtil.sanitizeFooter(s);
-  }
-
-  /**
-   * Set of fields that must always exactly match between ReviewDb and NoteDb.
-   *
-   * <p>Used to limit the worst-case quadratic search when pairing off matching messages below.
-   */
-  @AutoValue
-  abstract static class ChangeMessageCandidate {
-    static ChangeMessageCandidate create(ChangeMessage cm) {
-      return new AutoValue_ChangeBundle_ChangeMessageCandidate(
-          cm.getAuthor(), cm.getMessage(), cm.getTag());
-    }
-
-    @Nullable
-    abstract Account.Id author();
-
-    @Nullable
-    abstract String message();
-
-    @Nullable
-    abstract String tag();
-
-    // Exclude:
-    //  - patch set, which may be null on ReviewDb side but not NoteDb
-    //  - UUID, which is always different between ReviewDb and NoteDb
-    //  - writtenOn, which is fuzzy
-  }
-
-  private static void diffChangeMessages(
-      List<String> diffs, ChangeBundle bundleA, ChangeBundle bundleB) {
-    if (bundleA.source == REVIEW_DB && bundleB.source == REVIEW_DB) {
-      // Both came from ReviewDb: check all fields exactly.
-      Map<ChangeMessage.Key, ChangeMessage> as = changeMessageMap(bundleA.filterChangeMessages());
-      Map<ChangeMessage.Key, ChangeMessage> bs = changeMessageMap(bundleB.filterChangeMessages());
-
-      for (ChangeMessage.Key k : diffKeySets(diffs, as, bs)) {
-        ChangeMessage a = as.get(k);
-        ChangeMessage b = bs.get(k);
-        String desc = describe(k);
-        diffColumns(diffs, ChangeMessage.class, desc, bundleA, a, bundleB, b);
-      }
-      return;
-    }
-    Change.Id id = bundleA.getChange().getId();
-    checkArgument(id.equals(bundleB.getChange().getId()));
-
-    // Try to pair up matching ChangeMessages from each side, and succeed only
-    // if both collections are empty at the end. Quadratic in the worst case,
-    // but easy to reason about.
-    List<ChangeMessage> as = new LinkedList<>(bundleA.filterChangeMessages());
-
-    ListMultimap<ChangeMessageCandidate, ChangeMessage> bs = LinkedListMultimap.create();
-    for (ChangeMessage b : bundleB.filterChangeMessages()) {
-      bs.put(ChangeMessageCandidate.create(b), b);
-    }
-
-    Iterator<ChangeMessage> ait = as.iterator();
-    A:
-    while (ait.hasNext()) {
-      ChangeMessage a = ait.next();
-      Iterator<ChangeMessage> bit = bs.get(ChangeMessageCandidate.create(a)).iterator();
-      while (bit.hasNext()) {
-        ChangeMessage b = bit.next();
-        if (changeMessagesMatch(bundleA, a, bundleB, b)) {
-          ait.remove();
-          bit.remove();
-          continue A;
-        }
-      }
-    }
-
-    if (as.isEmpty() && bs.isEmpty()) {
-      return;
-    }
-    StringBuilder sb =
-        new StringBuilder("ChangeMessages differ for Change.Id ").append(id).append('\n');
-    if (!as.isEmpty()) {
-      sb.append("Only in A:");
-      for (ChangeMessage cm : as) {
-        sb.append("\n  ").append(cm);
-      }
-      if (!bs.isEmpty()) {
-        sb.append('\n');
-      }
-    }
-    if (!bs.isEmpty()) {
-      sb.append("Only in B:");
-      for (ChangeMessage cm : CHANGE_MESSAGE_ORDER.sortedCopy(bs.values())) {
-        sb.append("\n  ").append(cm);
-      }
-    }
-    diffs.add(sb.toString());
-  }
-
-  private static boolean changeMessagesMatch(
-      ChangeBundle bundleA, ChangeMessage a, ChangeBundle bundleB, ChangeMessage b) {
-    List<String> tempDiffs = new ArrayList<>();
-    String temp = "temp";
-
-    // ReviewDb allows timestamps before patch set was created, but NoteDb
-    // truncates this to the patch set creation timestamp.
-    Timestamp ta = a.getWrittenOn();
-    Timestamp tb = b.getWrittenOn();
-    PatchSet psa = bundleA.patchSets.get(a.getPatchSetId());
-    PatchSet psb = bundleB.patchSets.get(b.getPatchSetId());
-    boolean excludePatchSet = false;
-    boolean excludeWrittenOn = false;
-    if (bundleA.source == REVIEW_DB && bundleB.source == NOTE_DB) {
-      excludePatchSet = a.getPatchSetId() == null;
-      excludeWrittenOn =
-          psa != null
-              && psb != null
-              && ta.before(psa.getCreatedOn())
-              && tb.equals(psb.getCreatedOn());
-    } else if (bundleA.source == NOTE_DB && bundleB.source == REVIEW_DB) {
-      excludePatchSet = b.getPatchSetId() == null;
-      excludeWrittenOn =
-          psa != null
-              && psb != null
-              && tb.before(psb.getCreatedOn())
-              && ta.equals(psa.getCreatedOn());
-    }
-
-    List<String> exclude = Lists.newArrayList("key");
-    if (excludePatchSet) {
-      exclude.add("patchset");
-    }
-    if (excludeWrittenOn) {
-      exclude.add("writtenOn");
-    }
-
-    diffColumnsExcluding(tempDiffs, ChangeMessage.class, temp, bundleA, a, bundleB, b, exclude);
-    return tempDiffs.isEmpty();
-  }
-
-  private static void diffPatchSets(
-      List<String> diffs, ChangeBundle bundleA, ChangeBundle bundleB) {
-    Map<PatchSet.Id, PatchSet> as = bundleA.patchSets;
-    Map<PatchSet.Id, PatchSet> bs = bundleB.patchSets;
-    Optional<PatchSet.Id> minA = as.keySet().stream().min(intKeyOrdering());
-    Optional<PatchSet.Id> minB = bs.keySet().stream().min(intKeyOrdering());
-    Set<PatchSet.Id> ids = diffKeySets(diffs, as, bs);
-
-    // Old versions of Gerrit had a bug that created patch sets during
-    // rebase or submission with a createdOn timestamp earlier than the patch
-    // set it was replacing. (In the cases I examined, it was equal to createdOn
-    // for the change, but we're not counting on this exact behavior.)
-    //
-    // ChangeRebuilder ensures patch set events come out in order, but it's hard
-    // to predict what the resulting timestamps would look like. So, completely
-    // ignore the createdOn timestamps if both:
-    //   * ReviewDb timestamps are non-monotonic.
-    //   * NoteDb timestamps are monotonic.
-    //
-    // Allow the timestamp of the first patch set to match the creation time of
-    // the change.
-    boolean excludeAllCreatedOn = false;
-    if (bundleA.source == REVIEW_DB && bundleB.source == NOTE_DB) {
-      excludeAllCreatedOn = !createdOnIsMonotonic(as, ids) && createdOnIsMonotonic(bs, ids);
-    } else if (bundleA.source == NOTE_DB && bundleB.source == REVIEW_DB) {
-      excludeAllCreatedOn = createdOnIsMonotonic(as, ids) && !createdOnIsMonotonic(bs, ids);
-    }
-
-    for (PatchSet.Id id : ids) {
-      PatchSet a = as.get(id);
-      PatchSet b = bs.get(id);
-      String desc = describe(id);
-      String pushCertField = "pushCertificate";
-
-      boolean excludeCreatedOn = excludeAllCreatedOn;
-      boolean excludeDesc = false;
-      if (bundleA.source == REVIEW_DB && bundleB.source == NOTE_DB) {
-        excludeDesc = Objects.equals(trimOrNull(a.getDescription()), b.getDescription());
-        excludeCreatedOn |=
-            Optional.of(id).equals(minB) && b.getCreatedOn().equals(bundleB.change.getCreatedOn());
-      } else if (bundleA.source == NOTE_DB && bundleB.source == REVIEW_DB) {
-        excludeDesc = Objects.equals(a.getDescription(), trimOrNull(b.getDescription()));
-        excludeCreatedOn |=
-            Optional.of(id).equals(minA) && a.getCreatedOn().equals(bundleA.change.getCreatedOn());
-      }
-
-      List<String> exclude = Lists.newArrayList(pushCertField);
-      if (excludeCreatedOn) {
-        exclude.add("createdOn");
-      }
-      if (excludeDesc) {
-        exclude.add("description");
-      }
-
-      diffColumnsExcluding(diffs, PatchSet.class, desc, bundleA, a, bundleB, b, exclude);
-      diffValues(diffs, desc, trimPushCert(a), trimPushCert(b), pushCertField);
-    }
-  }
-
-  private static String trimPushCert(PatchSet ps) {
-    if (ps.getPushCertificate() == null) {
-      return null;
-    }
-    return CharMatcher.is('\n').trimTrailingFrom(ps.getPushCertificate());
-  }
-
-  private static boolean createdOnIsMonotonic(
-      Map<?, PatchSet> patchSets, Set<PatchSet.Id> limitToIds) {
-    List<PatchSet> orderedById =
-        patchSets.values().stream()
-            .filter(ps -> limitToIds.contains(ps.getId()))
-            .sorted(ChangeUtil.PS_ID_ORDER)
-            .collect(toList());
-    return Ordering.natural().onResultOf(PatchSet::getCreatedOn).isOrdered(orderedById);
-  }
-
-  private static void diffPatchSetApprovals(
-      List<String> diffs, ChangeBundle bundleA, ChangeBundle bundleB) {
-    Map<PatchSetApproval.Key, PatchSetApproval> as = bundleA.filterPatchSetApprovals();
-    Map<PatchSetApproval.Key, PatchSetApproval> bs = bundleB.filterPatchSetApprovals();
-    for (PatchSetApproval.Key k : diffKeySets(diffs, as, bs)) {
-      PatchSetApproval a = as.get(k);
-      PatchSetApproval b = bs.get(k);
-      String desc = describe(k);
-
-      // ReviewDb allows timestamps before patch set was created, but NoteDb
-      // truncates this to the patch set creation timestamp.
-      //
-      // ChangeRebuilder ensures all post-submit approvals happen after the
-      // actual submit, so the timestamps may not line up. This shouldn't really
-      // happen, because postSubmit shouldn't be set in ReviewDb until after the
-      // change is submitted in ReviewDb, but you never know.
-      //
-      // Due to a quirk of PostReview, post-submit 0 votes might not have the
-      // postSubmit bit set in ReviewDb. As these are only used for tombstone
-      // purposes, ignore the postSubmit bit in NoteDb in this case.
-      Timestamp ta = a.getGranted();
-      Timestamp tb = b.getGranted();
-      PatchSet psa = checkNotNull(bundleA.patchSets.get(a.getPatchSetId()));
-      PatchSet psb = checkNotNull(bundleB.patchSets.get(b.getPatchSetId()));
-      boolean excludeGranted = false;
-      boolean excludePostSubmit = false;
-      List<String> exclude = new ArrayList<>(1);
-      if (bundleA.source == REVIEW_DB && bundleB.source == NOTE_DB) {
-        excludeGranted =
-            (ta.before(psa.getCreatedOn()) && tb.equals(psb.getCreatedOn()))
-                || ta.compareTo(tb) < 0;
-        excludePostSubmit = a.getValue() == 0 && b.isPostSubmit();
-      } else if (bundleA.source == NOTE_DB && bundleB.source == REVIEW_DB) {
-        excludeGranted =
-            (tb.before(psb.getCreatedOn()) && ta.equals(psa.getCreatedOn()))
-                || (tb.compareTo(ta) < 0);
-        excludePostSubmit = b.getValue() == 0 && a.isPostSubmit();
-      }
-
-      // Legacy submit approvals may or may not have tags associated with them,
-      // depending on whether ChangeRebuilder happened to group them with the
-      // status change.
-      boolean excludeTag =
-          bundleA.source != bundleB.source && a.isLegacySubmit() && b.isLegacySubmit();
-
-      if (excludeGranted) {
-        exclude.add("granted");
-      }
-      if (excludePostSubmit) {
-        exclude.add("postSubmit");
-      }
-      if (excludeTag) {
-        exclude.add("tag");
-      }
-
-      diffColumnsExcluding(diffs, PatchSetApproval.class, desc, bundleA, a, bundleB, b, exclude);
-    }
-  }
-
-  private static void diffReviewers(
-      List<String> diffs, ChangeBundle bundleA, ChangeBundle bundleB) {
-    diffSets(diffs, bundleA.reviewers.all(), bundleB.reviewers.all(), "reviewer");
-  }
-
-  private static void diffPatchLineComments(
-      List<String> diffs, ChangeBundle bundleA, ChangeBundle bundleB) {
-    Map<PatchLineComment.Key, PatchLineComment> as = bundleA.filterPatchLineComments();
-    Map<PatchLineComment.Key, PatchLineComment> bs = bundleB.filterPatchLineComments();
-    for (PatchLineComment.Key k : diffKeySets(diffs, as, bs)) {
-      PatchLineComment a = as.get(k);
-      PatchLineComment b = bs.get(k);
-      String desc = describe(k);
-      diffColumns(diffs, PatchLineComment.class, desc, bundleA, a, bundleB, b);
-    }
-  }
-
-  private static <T> Set<T> diffKeySets(List<String> diffs, Map<T, ?> a, Map<T, ?> b) {
-    if (a.isEmpty() && b.isEmpty()) {
-      return a.keySet();
-    }
-    String clazz = keyClass((!a.isEmpty() ? a.keySet() : b.keySet()).iterator().next());
-    return diffSets(diffs, a.keySet(), b.keySet(), clazz);
-  }
-
-  private static <T> Set<T> diffSets(List<String> diffs, Set<T> as, Set<T> bs, String desc) {
-    if (as.isEmpty() && bs.isEmpty()) {
-      return as;
-    }
-
-    Set<T> aNotB = Sets.difference(as, bs);
-    Set<T> bNotA = Sets.difference(bs, as);
-    if (aNotB.isEmpty() && bNotA.isEmpty()) {
-      return as;
-    }
-    diffs.add(desc + " sets differ: " + aNotB + " only in A; " + bNotA + " only in B");
-    return Sets.intersection(as, bs);
-  }
-
-  private static <T> void diffColumns(
-      List<String> diffs,
-      Class<T> clazz,
-      String desc,
-      ChangeBundle bundleA,
-      T a,
-      ChangeBundle bundleB,
-      T b) {
-    diffColumnsExcluding(diffs, clazz, desc, bundleA, a, bundleB, b);
-  }
-
-  private static <T> void diffColumnsExcluding(
-      List<String> diffs,
-      Class<T> clazz,
-      String desc,
-      ChangeBundle bundleA,
-      T a,
-      ChangeBundle bundleB,
-      T b,
-      String... exclude) {
-    diffColumnsExcluding(diffs, clazz, desc, bundleA, a, bundleB, b, Arrays.asList(exclude));
-  }
-
-  private static <T> void diffColumnsExcluding(
-      List<String> diffs,
-      Class<T> clazz,
-      String desc,
-      ChangeBundle bundleA,
-      T a,
-      ChangeBundle bundleB,
-      T b,
-      Iterable<String> exclude) {
-    Set<String> toExclude = Sets.newLinkedHashSet(exclude);
-    for (Field f : clazz.getDeclaredFields()) {
-      Column col = f.getAnnotation(Column.class);
-      if (col == null) {
-        continue;
-      } else if (toExclude.remove(f.getName())) {
-        continue;
-      }
-      f.setAccessible(true);
-      try {
-        if (Timestamp.class.isAssignableFrom(f.getType())) {
-          diffTimestamps(diffs, desc, bundleA, a, bundleB, b, f.getName());
-        } else {
-          diffValues(diffs, desc, f.get(a), f.get(b), f.getName());
-        }
-      } catch (IllegalAccessException e) {
-        throw new IllegalArgumentException(e);
-      }
-    }
-    checkArgument(
-        toExclude.isEmpty(),
-        "requested columns to exclude not present in %s: %s",
-        clazz.getSimpleName(),
-        toExclude);
-  }
-
-  private static void diffTimestamps(
-      List<String> diffs,
-      String desc,
-      ChangeBundle bundleA,
-      Object a,
-      ChangeBundle bundleB,
-      Object b,
-      String field) {
-    checkArgument(a.getClass() == b.getClass());
-    Class<?> clazz = a.getClass();
-
-    Timestamp ta;
-    Timestamp tb;
-    try {
-      Field f = clazz.getDeclaredField(field);
-      checkArgument(f.getAnnotation(Column.class) != null);
-      f.setAccessible(true);
-      ta = (Timestamp) f.get(a);
-      tb = (Timestamp) f.get(b);
-    } catch (IllegalAccessException | NoSuchFieldException | SecurityException e) {
-      throw new IllegalArgumentException(e);
-    }
-    diffTimestamps(diffs, desc, bundleA, ta, bundleB, tb, field);
-  }
-
-  private static void diffTimestamps(
-      List<String> diffs,
-      String desc,
-      ChangeBundle bundleA,
-      Timestamp ta,
-      ChangeBundle bundleB,
-      Timestamp tb,
-      String fieldDesc) {
-    if (bundleA.source == bundleB.source || ta == null || tb == null) {
-      diffValues(diffs, desc, ta, tb, fieldDesc);
-    } else if (bundleA.source == NOTE_DB) {
-      diffTimestamps(diffs, desc, bundleA.getChange(), ta, bundleB.getChange(), tb, fieldDesc);
-    } else {
-      diffTimestamps(diffs, desc, bundleB.getChange(), tb, bundleA.getChange(), ta, fieldDesc);
-    }
-  }
-
-  private static boolean timestampsDiffer(
-      ChangeBundle bundleA, Timestamp ta, ChangeBundle bundleB, Timestamp tb) {
-    List<String> tempDiffs = new ArrayList<>(1);
-    diffTimestamps(tempDiffs, "temp", bundleA, ta, bundleB, tb, "temp");
-    return !tempDiffs.isEmpty();
-  }
-
-  private static void diffTimestamps(
-      List<String> diffs,
-      String desc,
-      Change changeFromNoteDb,
-      Timestamp tsFromNoteDb,
-      Change changeFromReviewDb,
-      Timestamp tsFromReviewDb,
-      String field) {
-    // Because ChangeRebuilder may batch events together that are several
-    // seconds apart, the timestamp in NoteDb may actually be several seconds
-    // *earlier* than the timestamp in ReviewDb that it was converted from.
-    checkArgument(
-        tsFromNoteDb.equals(roundToSecond(tsFromNoteDb)),
-        "%s from NoteDb has non-rounded %s timestamp: %s",
-        desc,
-        field,
-        tsFromNoteDb);
-
-    if (tsFromReviewDb.before(changeFromReviewDb.getCreatedOn())
-        && tsFromNoteDb.equals(changeFromNoteDb.getCreatedOn())) {
-      // Timestamp predates change creation. These are truncated to change
-      // creation time during NoteDb conversion, so allow this if the timestamp
-      // in NoteDb matches the createdOn time in NoteDb.
-      return;
-    }
-
-    long delta = tsFromReviewDb.getTime() - tsFromNoteDb.getTime();
-    long max = ChangeRebuilderImpl.MAX_WINDOW_MS;
-    if (delta < 0 || delta > max) {
-      diffs.add(
-          field
-              + " differs for "
-              + desc
-              + " in NoteDb vs. ReviewDb:"
-              + " {"
-              + tsFromNoteDb
-              + "} != {"
-              + tsFromReviewDb
-              + "}");
-    }
-  }
-
-  private static void diffValues(
-      List<String> diffs, String desc, Object va, Object vb, String name) {
-    if (!Objects.equals(va, vb)) {
-      diffs.add(name + " differs for " + desc + ": {" + va + "} != {" + vb + "}");
-    }
-  }
-
-  private static String describe(Object key) {
-    return keyClass(key) + " " + key;
-  }
-
-  private static String keyClass(Object obj) {
-    Class<?> clazz = obj.getClass();
-    String name = clazz.getSimpleName();
-    checkArgument(name.endsWith("Key") || name.endsWith("Id"), "not an Id/Key class: %s", name);
-    if (name.equals("Key") || name.equals("Id")) {
-      return clazz.getEnclosingClass().getSimpleName() + "." + name;
-    } else if (name.startsWith("AutoValue_")) {
-      return name.substring(name.lastIndexOf('_') + 1);
-    }
-    return name;
-  }
-
-  @Override
-  public String toString() {
-    return getClass().getSimpleName()
-        + "{id="
-        + change.getId()
-        + ", ChangeMessage["
-        + changeMessages.size()
-        + "]"
-        + ", PatchSet["
-        + patchSets.size()
-        + "]"
-        + ", PatchSetApproval["
-        + patchSetApprovals.size()
-        + "]"
-        + ", PatchLineComment["
-        + patchLineComments.size()
-        + "]"
-        + "}";
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeDraftUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeDraftUpdate.java
deleted file mode 100644
index 428faef..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeDraftUpdate.java
+++ /dev/null
@@ -1,273 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.notedb;
-
-import static com.google.common.base.MoreObjects.firstNonNull;
-import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.collect.Sets;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.PatchLineComment;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.client.RevId;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.config.AnonymousCowardName;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.assistedinject.Assisted;
-import com.google.inject.assistedinject.AssistedInject;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.notes.NoteMap;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-/**
- * A single delta to apply atomically to a change.
- *
- * <p>This delta contains only draft comments on a single patch set of a change by a single author.
- * This delta will become a single commit in the All-Users repository.
- *
- * <p>This class is not thread safe.
- */
-public class ChangeDraftUpdate extends AbstractChangeUpdate {
-  public interface Factory {
-    ChangeDraftUpdate create(
-        ChangeNotes notes,
-        @Assisted("effective") Account.Id accountId,
-        @Assisted("real") Account.Id realAccountId,
-        PersonIdent authorIdent,
-        Date when);
-
-    ChangeDraftUpdate create(
-        Change change,
-        @Assisted("effective") Account.Id accountId,
-        @Assisted("real") Account.Id realAccountId,
-        PersonIdent authorIdent,
-        Date when);
-  }
-
-  @AutoValue
-  abstract static class Key {
-    abstract String revId();
-
-    abstract Comment.Key key();
-  }
-
-  private static Key key(Comment c) {
-    return new AutoValue_ChangeDraftUpdate_Key(c.revId, c.key);
-  }
-
-  private final AllUsersName draftsProject;
-
-  private List<Comment> put = new ArrayList<>();
-  private Set<Key> delete = new HashSet<>();
-
-  @AssistedInject
-  private ChangeDraftUpdate(
-      @GerritServerConfig Config cfg,
-      @GerritPersonIdent PersonIdent serverIdent,
-      @AnonymousCowardName String anonymousCowardName,
-      NotesMigration migration,
-      AllUsersName allUsers,
-      ChangeNoteUtil noteUtil,
-      @Assisted ChangeNotes notes,
-      @Assisted("effective") Account.Id accountId,
-      @Assisted("real") Account.Id realAccountId,
-      @Assisted PersonIdent authorIdent,
-      @Assisted Date when) {
-    super(
-        cfg,
-        migration,
-        noteUtil,
-        serverIdent,
-        anonymousCowardName,
-        notes,
-        null,
-        accountId,
-        realAccountId,
-        authorIdent,
-        when);
-    this.draftsProject = allUsers;
-  }
-
-  @AssistedInject
-  private ChangeDraftUpdate(
-      @GerritServerConfig Config cfg,
-      @GerritPersonIdent PersonIdent serverIdent,
-      @AnonymousCowardName String anonymousCowardName,
-      NotesMigration migration,
-      AllUsersName allUsers,
-      ChangeNoteUtil noteUtil,
-      @Assisted Change change,
-      @Assisted("effective") Account.Id accountId,
-      @Assisted("real") Account.Id realAccountId,
-      @Assisted PersonIdent authorIdent,
-      @Assisted Date when) {
-    super(
-        cfg,
-        migration,
-        noteUtil,
-        serverIdent,
-        anonymousCowardName,
-        null,
-        change,
-        accountId,
-        realAccountId,
-        authorIdent,
-        when);
-    this.draftsProject = allUsers;
-  }
-
-  public void putComment(Comment c) {
-    verifyComment(c);
-    put.add(c);
-  }
-
-  public void deleteComment(Comment c) {
-    verifyComment(c);
-    delete.add(key(c));
-  }
-
-  public void deleteComment(String revId, Comment.Key key) {
-    delete.add(new AutoValue_ChangeDraftUpdate_Key(revId, key));
-  }
-
-  private CommitBuilder storeCommentsInNotes(
-      RevWalk rw, ObjectInserter ins, ObjectId curr, CommitBuilder cb)
-      throws ConfigInvalidException, OrmException, IOException {
-    RevisionNoteMap<ChangeRevisionNote> rnm = getRevisionNoteMap(rw, curr);
-    Set<RevId> updatedRevs = Sets.newHashSetWithExpectedSize(rnm.revisionNotes.size());
-    RevisionNoteBuilder.Cache cache = new RevisionNoteBuilder.Cache(rnm);
-
-    for (Comment c : put) {
-      if (!delete.contains(key(c))) {
-        cache.get(new RevId(c.revId)).putComment(c);
-      }
-    }
-    for (Key k : delete) {
-      cache.get(new RevId(k.revId())).deleteComment(k.key());
-    }
-
-    Map<RevId, RevisionNoteBuilder> builders = cache.getBuilders();
-    boolean touchedAnyRevs = false;
-    boolean hasComments = false;
-    for (Map.Entry<RevId, RevisionNoteBuilder> e : builders.entrySet()) {
-      updatedRevs.add(e.getKey());
-      ObjectId id = ObjectId.fromString(e.getKey().get());
-      byte[] data = e.getValue().build(noteUtil, noteUtil.getWriteJson());
-      if (!Arrays.equals(data, e.getValue().baseRaw)) {
-        touchedAnyRevs = true;
-      }
-      if (data.length == 0) {
-        rnm.noteMap.remove(id);
-      } else {
-        hasComments = true;
-        ObjectId dataBlob = ins.insert(OBJ_BLOB, data);
-        rnm.noteMap.set(id, dataBlob);
-      }
-    }
-
-    // If we didn't touch any notes, tell the caller this was a no-op update. We
-    // couldn't have done this in isEmpty() below because we hadn't read the old
-    // data yet.
-    if (!touchedAnyRevs) {
-      return NO_OP_UPDATE;
-    }
-
-    // If we touched every revision and there are no comments left, tell the
-    // caller to delete the entire ref.
-    boolean touchedAllRevs = updatedRevs.equals(rnm.revisionNotes.keySet());
-    if (touchedAllRevs && !hasComments) {
-      return null;
-    }
-
-    cb.setTreeId(rnm.noteMap.writeTree(ins));
-    return cb;
-  }
-
-  private RevisionNoteMap<ChangeRevisionNote> getRevisionNoteMap(RevWalk rw, ObjectId curr)
-      throws ConfigInvalidException, OrmException, IOException {
-    if (migration.readChanges()) {
-      // If reading from changes is enabled, then the old DraftCommentNotes
-      // already parsed the revision notes. We can reuse them as long as the ref
-      // hasn't advanced.
-      ChangeNotes changeNotes = getNotes();
-      if (changeNotes != null) {
-        DraftCommentNotes draftNotes = changeNotes.load().getDraftCommentNotes();
-        if (draftNotes != null) {
-          ObjectId idFromNotes = firstNonNull(draftNotes.getRevision(), ObjectId.zeroId());
-          RevisionNoteMap<ChangeRevisionNote> rnm = draftNotes.getRevisionNoteMap();
-          if (idFromNotes.equals(curr) && rnm != null) {
-            return rnm;
-          }
-        }
-      }
-    }
-    NoteMap noteMap;
-    if (!curr.equals(ObjectId.zeroId())) {
-      noteMap = NoteMap.read(rw.getObjectReader(), rw.parseCommit(curr));
-    } else {
-      noteMap = NoteMap.newEmptyMap();
-    }
-    // Even though reading from changes might not be enabled, we need to
-    // parse any existing revision notes so we can merge them.
-    return RevisionNoteMap.parse(
-        noteUtil, getId(), rw.getObjectReader(), noteMap, PatchLineComment.Status.DRAFT);
-  }
-
-  @Override
-  protected CommitBuilder applyImpl(RevWalk rw, ObjectInserter ins, ObjectId curr)
-      throws OrmException, IOException {
-    CommitBuilder cb = new CommitBuilder();
-    cb.setMessage("Update draft comments");
-    try {
-      return storeCommentsInNotes(rw, ins, curr, cb);
-    } catch (ConfigInvalidException e) {
-      throw new OrmException(e);
-    }
-  }
-
-  @Override
-  protected Project.NameKey getProjectName() {
-    return draftsProject;
-  }
-
-  @Override
-  protected String getRefName() {
-    return RefNames.refsDraftComments(getId(), accountId);
-  }
-
-  @Override
-  public boolean isEmpty() {
-    return delete.isEmpty() && put.isEmpty();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNoteUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNoteUtil.java
deleted file mode 100644
index 0628913..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNoteUtil.java
+++ /dev/null
@@ -1,647 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.notedb;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.gerrit.server.CommentsUtil.COMMENT_ORDER;
-import static com.google.gerrit.server.notedb.ChangeNotes.parseException;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.CharMatcher;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ListMultimap;
-import com.google.common.primitives.Ints;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.CommentRange;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.RevId;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.config.AnonymousCowardName;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.GerritServerId;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import com.google.inject.Inject;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.sql.Timestamp;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.revwalk.FooterKey;
-import org.eclipse.jgit.util.GitDateFormatter;
-import org.eclipse.jgit.util.GitDateFormatter.Format;
-import org.eclipse.jgit.util.GitDateParser;
-import org.eclipse.jgit.util.MutableInteger;
-import org.eclipse.jgit.util.QuotedString;
-import org.eclipse.jgit.util.RawParseUtils;
-
-public class ChangeNoteUtil {
-  public static final FooterKey FOOTER_ASSIGNEE = new FooterKey("Assignee");
-  public static final FooterKey FOOTER_BRANCH = new FooterKey("Branch");
-  public static final FooterKey FOOTER_CHANGE_ID = new FooterKey("Change-id");
-  public static final FooterKey FOOTER_COMMIT = new FooterKey("Commit");
-  public static final FooterKey FOOTER_CURRENT = new FooterKey("Current");
-  public static final FooterKey FOOTER_GROUPS = new FooterKey("Groups");
-  public static final FooterKey FOOTER_HASHTAGS = new FooterKey("Hashtags");
-  public static final FooterKey FOOTER_LABEL = new FooterKey("Label");
-  public static final FooterKey FOOTER_PATCH_SET = new FooterKey("Patch-set");
-  public static final FooterKey FOOTER_PATCH_SET_DESCRIPTION =
-      new FooterKey("Patch-set-description");
-  public static final FooterKey FOOTER_PRIVATE = new FooterKey("Private");
-  public static final FooterKey FOOTER_READ_ONLY_UNTIL = new FooterKey("Read-only-until");
-  public static final FooterKey FOOTER_REAL_USER = new FooterKey("Real-user");
-  public static final FooterKey FOOTER_STATUS = new FooterKey("Status");
-  public static final FooterKey FOOTER_SUBJECT = new FooterKey("Subject");
-  public static final FooterKey FOOTER_SUBMISSION_ID = new FooterKey("Submission-id");
-  public static final FooterKey FOOTER_SUBMITTED_WITH = new FooterKey("Submitted-with");
-  public static final FooterKey FOOTER_TOPIC = new FooterKey("Topic");
-  public static final FooterKey FOOTER_TAG = new FooterKey("Tag");
-  public static final FooterKey FOOTER_WORK_IN_PROGRESS = new FooterKey("Work-in-progress");
-  public static final FooterKey FOOTER_REVERT_OF = new FooterKey("Revert-of");
-
-  private static final String AUTHOR = "Author";
-  private static final String BASE_PATCH_SET = "Base-for-patch-set";
-  private static final String COMMENT_RANGE = "Comment-range";
-  private static final String FILE = "File";
-  private static final String LENGTH = "Bytes";
-  private static final String PARENT = "Parent";
-  private static final String PARENT_NUMBER = "Parent-number";
-  private static final String PATCH_SET = "Patch-set";
-  private static final String REAL_AUTHOR = "Real-author";
-  private static final String REVISION = "Revision";
-  private static final String UUID = "UUID";
-  private static final String UNRESOLVED = "Unresolved";
-  private static final String TAG = FOOTER_TAG.getName();
-
-  public static String formatTime(PersonIdent ident, Timestamp t) {
-    GitDateFormatter dateFormatter = new GitDateFormatter(Format.DEFAULT);
-    // TODO(dborowitz): Use a ThreadLocal or use Joda.
-    PersonIdent newIdent = new PersonIdent(ident, t);
-    return dateFormatter.formatDate(newIdent);
-  }
-
-  static Gson newGson() {
-    return new GsonBuilder()
-        .registerTypeAdapter(Timestamp.class, new CommentTimestampAdapter().nullSafe())
-        .setPrettyPrinting()
-        .create();
-  }
-
-  private final AccountCache accountCache;
-  private final PersonIdent serverIdent;
-  private final String anonymousCowardName;
-  private final String serverId;
-  private final Gson gson = newGson();
-  private final boolean writeJson;
-
-  @Inject
-  public ChangeNoteUtil(
-      AccountCache accountCache,
-      @GerritPersonIdent PersonIdent serverIdent,
-      @AnonymousCowardName String anonymousCowardName,
-      @GerritServerId String serverId,
-      @GerritServerConfig Config config) {
-    this.accountCache = accountCache;
-    this.serverIdent = serverIdent;
-    this.anonymousCowardName = anonymousCowardName;
-    this.serverId = serverId;
-    this.writeJson = config.getBoolean("notedb", "writeJson", true);
-  }
-
-  @VisibleForTesting
-  public PersonIdent newIdent(
-      Account author, Date when, PersonIdent serverIdent, String anonymousCowardName) {
-    return new PersonIdent(
-        author.getName(anonymousCowardName),
-        author.getId().get() + "@" + serverId,
-        when,
-        serverIdent.getTimeZone());
-  }
-
-  public boolean getWriteJson() {
-    return writeJson;
-  }
-
-  public Gson getGson() {
-    return gson;
-  }
-
-  public String getServerId() {
-    return serverId;
-  }
-
-  public Account.Id parseIdent(PersonIdent ident, Change.Id changeId)
-      throws ConfigInvalidException {
-    String email = ident.getEmailAddress();
-    int at = email.indexOf('@');
-    if (at >= 0) {
-      String host = email.substring(at + 1, email.length());
-      if (host.equals(serverId)) {
-        Integer id = Ints.tryParse(email.substring(0, at));
-        if (id != null) {
-          return new Account.Id(id);
-        }
-      }
-    }
-    throw parseException(changeId, "invalid identity, expected <id>@%s: %s", serverId, email);
-  }
-
-  private static boolean match(byte[] note, MutableInteger p, byte[] expected) {
-    int m = RawParseUtils.match(note, p.value, expected);
-    return m == p.value + expected.length;
-  }
-
-  public List<Comment> parseNote(byte[] note, MutableInteger p, Change.Id changeId)
-      throws ConfigInvalidException {
-    if (p.value >= note.length) {
-      return ImmutableList.of();
-    }
-    Set<Comment.Key> seen = new HashSet<>();
-    List<Comment> result = new ArrayList<>();
-    int sizeOfNote = note.length;
-    byte[] psb = PATCH_SET.getBytes(UTF_8);
-    byte[] bpsb = BASE_PATCH_SET.getBytes(UTF_8);
-    byte[] bpn = PARENT_NUMBER.getBytes(UTF_8);
-
-    RevId revId = new RevId(parseStringField(note, p, changeId, REVISION));
-    String fileName = null;
-    PatchSet.Id psId = null;
-    boolean isForBase = false;
-    Integer parentNumber = null;
-
-    while (p.value < sizeOfNote) {
-      boolean matchPs = match(note, p, psb);
-      boolean matchBase = match(note, p, bpsb);
-      if (matchPs) {
-        fileName = null;
-        psId = parsePsId(note, p, changeId, PATCH_SET);
-        isForBase = false;
-      } else if (matchBase) {
-        fileName = null;
-        psId = parsePsId(note, p, changeId, BASE_PATCH_SET);
-        isForBase = true;
-        if (match(note, p, bpn)) {
-          parentNumber = parseParentNumber(note, p, changeId);
-        }
-      } else if (psId == null) {
-        throw parseException(changeId, "missing %s or %s header", PATCH_SET, BASE_PATCH_SET);
-      }
-
-      Comment c = parseComment(note, p, fileName, psId, revId, isForBase, parentNumber);
-      fileName = c.key.filename;
-      if (!seen.add(c.key)) {
-        throw parseException(changeId, "multiple comments for %s in note", c.key);
-      }
-      result.add(c);
-    }
-    return result;
-  }
-
-  private Comment parseComment(
-      byte[] note,
-      MutableInteger curr,
-      String currentFileName,
-      PatchSet.Id psId,
-      RevId revId,
-      boolean isForBase,
-      Integer parentNumber)
-      throws ConfigInvalidException {
-    Change.Id changeId = psId.getParentKey();
-
-    // Check if there is a new file.
-    boolean newFile = (RawParseUtils.match(note, curr.value, FILE.getBytes(UTF_8))) != -1;
-    if (newFile) {
-      // If so, parse the new file name.
-      currentFileName = parseFilename(note, curr, changeId);
-    } else if (currentFileName == null) {
-      throw parseException(changeId, "could not parse %s", FILE);
-    }
-
-    CommentRange range = parseCommentRange(note, curr);
-    if (range == null) {
-      throw parseException(changeId, "could not parse %s", COMMENT_RANGE);
-    }
-
-    Timestamp commentTime = parseTimestamp(note, curr, changeId);
-    Account.Id aId = parseAuthor(note, curr, changeId, AUTHOR);
-    boolean hasRealAuthor =
-        (RawParseUtils.match(note, curr.value, REAL_AUTHOR.getBytes(UTF_8))) != -1;
-    Account.Id raId = null;
-    if (hasRealAuthor) {
-      raId = parseAuthor(note, curr, changeId, REAL_AUTHOR);
-    }
-
-    boolean hasParent = (RawParseUtils.match(note, curr.value, PARENT.getBytes(UTF_8))) != -1;
-    String parentUUID = null;
-    boolean unresolved = false;
-    if (hasParent) {
-      parentUUID = parseStringField(note, curr, changeId, PARENT);
-    }
-    boolean hasUnresolved =
-        (RawParseUtils.match(note, curr.value, UNRESOLVED.getBytes(UTF_8))) != -1;
-    if (hasUnresolved) {
-      unresolved = parseBooleanField(note, curr, changeId, UNRESOLVED);
-    }
-
-    String uuid = parseStringField(note, curr, changeId, UUID);
-
-    boolean hasTag = (RawParseUtils.match(note, curr.value, TAG.getBytes(UTF_8))) != -1;
-    String tag = null;
-    if (hasTag) {
-      tag = parseStringField(note, curr, changeId, TAG);
-    }
-
-    int commentLength = parseCommentLength(note, curr, changeId);
-
-    String message = RawParseUtils.decode(UTF_8, note, curr.value, curr.value + commentLength);
-    checkResult(message, "message contents", changeId);
-
-    Comment c =
-        new Comment(
-            new Comment.Key(uuid, currentFileName, psId.get()),
-            aId,
-            commentTime,
-            isForBase ? (short) (parentNumber == null ? 0 : -parentNumber) : (short) 1,
-            message,
-            serverId,
-            unresolved);
-    c.lineNbr = range.getEndLine();
-    c.parentUuid = parentUUID;
-    c.tag = tag;
-    c.setRevId(revId);
-    if (raId != null) {
-      c.setRealAuthor(raId);
-    }
-
-    if (range.getStartCharacter() != -1) {
-      c.setRange(range);
-    }
-
-    curr.value = RawParseUtils.nextLF(note, curr.value + commentLength);
-    curr.value = RawParseUtils.nextLF(note, curr.value);
-    return c;
-  }
-
-  private static String parseStringField(
-      byte[] note, MutableInteger curr, Change.Id changeId, String fieldName)
-      throws ConfigInvalidException {
-    int endOfLine = RawParseUtils.nextLF(note, curr.value);
-    checkHeaderLineFormat(note, curr, fieldName, changeId);
-    int startOfField = RawParseUtils.endOfFooterLineKey(note, curr.value) + 2;
-    curr.value = endOfLine;
-    return RawParseUtils.decode(UTF_8, note, startOfField, endOfLine - 1);
-  }
-
-  /**
-   * @return a comment range. If the comment range line in the note only has one number, we return a
-   *     CommentRange with that one number as the end line and the other fields as -1. If the
-   *     comment range line in the note contains a whole comment range, then we return a
-   *     CommentRange with all fields set. If the line is not correctly formatted, return null.
-   */
-  private static CommentRange parseCommentRange(byte[] note, MutableInteger ptr) {
-    CommentRange range = new CommentRange(-1, -1, -1, -1);
-
-    int last = ptr.value;
-    int startLine = RawParseUtils.parseBase10(note, ptr.value, ptr);
-    if (ptr.value == last) {
-      return null;
-    } else if (note[ptr.value] == '\n') {
-      range.setEndLine(startLine);
-      ptr.value += 1;
-      return range;
-    } else if (note[ptr.value] == ':') {
-      range.setStartLine(startLine);
-      ptr.value += 1;
-    } else {
-      return null;
-    }
-
-    last = ptr.value;
-    int startChar = RawParseUtils.parseBase10(note, ptr.value, ptr);
-    if (ptr.value == last) {
-      return null;
-    } else if (note[ptr.value] == '-') {
-      range.setStartCharacter(startChar);
-      ptr.value += 1;
-    } else {
-      return null;
-    }
-
-    last = ptr.value;
-    int endLine = RawParseUtils.parseBase10(note, ptr.value, ptr);
-    if (ptr.value == last) {
-      return null;
-    } else if (note[ptr.value] == ':') {
-      range.setEndLine(endLine);
-      ptr.value += 1;
-    } else {
-      return null;
-    }
-
-    last = ptr.value;
-    int endChar = RawParseUtils.parseBase10(note, ptr.value, ptr);
-    if (ptr.value == last) {
-      return null;
-    } else if (note[ptr.value] == '\n') {
-      range.setEndCharacter(endChar);
-      ptr.value += 1;
-    } else {
-      return null;
-    }
-    return range;
-  }
-
-  private static PatchSet.Id parsePsId(
-      byte[] note, MutableInteger curr, Change.Id changeId, String fieldName)
-      throws ConfigInvalidException {
-    checkHeaderLineFormat(note, curr, fieldName, changeId);
-    int startOfPsId = RawParseUtils.endOfFooterLineKey(note, curr.value) + 1;
-    MutableInteger i = new MutableInteger();
-    int patchSetId = RawParseUtils.parseBase10(note, startOfPsId, i);
-    int endOfLine = RawParseUtils.nextLF(note, curr.value);
-    if (i.value != endOfLine - 1) {
-      throw parseException(changeId, "could not parse %s", fieldName);
-    }
-    checkResult(patchSetId, "patchset id", changeId);
-    curr.value = endOfLine;
-    return new PatchSet.Id(changeId, patchSetId);
-  }
-
-  private static Integer parseParentNumber(byte[] note, MutableInteger curr, Change.Id changeId)
-      throws ConfigInvalidException {
-    checkHeaderLineFormat(note, curr, PARENT_NUMBER, changeId);
-
-    int start = RawParseUtils.endOfFooterLineKey(note, curr.value) + 1;
-    MutableInteger i = new MutableInteger();
-    int parentNumber = RawParseUtils.parseBase10(note, start, i);
-    int endOfLine = RawParseUtils.nextLF(note, curr.value);
-    if (i.value != endOfLine - 1) {
-      throw parseException(changeId, "could not parse %s", PARENT_NUMBER);
-    }
-    checkResult(parentNumber, "parent number", changeId);
-    curr.value = endOfLine;
-    return Integer.valueOf(parentNumber);
-  }
-
-  private static String parseFilename(byte[] note, MutableInteger curr, Change.Id changeId)
-      throws ConfigInvalidException {
-    checkHeaderLineFormat(note, curr, FILE, changeId);
-    int startOfFileName = RawParseUtils.endOfFooterLineKey(note, curr.value) + 2;
-    int endOfLine = RawParseUtils.nextLF(note, curr.value);
-    curr.value = endOfLine;
-    curr.value = RawParseUtils.nextLF(note, curr.value);
-    return QuotedString.GIT_PATH.dequote(
-        RawParseUtils.decode(UTF_8, note, startOfFileName, endOfLine - 1));
-  }
-
-  private static Timestamp parseTimestamp(byte[] note, MutableInteger curr, Change.Id changeId)
-      throws ConfigInvalidException {
-    int endOfLine = RawParseUtils.nextLF(note, curr.value);
-    Timestamp commentTime;
-    String dateString = RawParseUtils.decode(UTF_8, note, curr.value, endOfLine - 1);
-    try {
-      commentTime = new Timestamp(GitDateParser.parse(dateString, null, Locale.US).getTime());
-    } catch (ParseException e) {
-      throw new ConfigInvalidException("could not parse comment timestamp", e);
-    }
-    curr.value = endOfLine;
-    return checkResult(commentTime, "comment timestamp", changeId);
-  }
-
-  private Account.Id parseAuthor(
-      byte[] note, MutableInteger curr, Change.Id changeId, String fieldName)
-      throws ConfigInvalidException {
-    checkHeaderLineFormat(note, curr, fieldName, changeId);
-    int startOfAccountId = RawParseUtils.endOfFooterLineKey(note, curr.value) + 2;
-    PersonIdent ident = RawParseUtils.parsePersonIdent(note, startOfAccountId);
-    Account.Id aId = parseIdent(ident, changeId);
-    curr.value = RawParseUtils.nextLF(note, curr.value);
-    return checkResult(aId, fieldName, changeId);
-  }
-
-  private static int parseCommentLength(byte[] note, MutableInteger curr, Change.Id changeId)
-      throws ConfigInvalidException {
-    checkHeaderLineFormat(note, curr, LENGTH, changeId);
-    int startOfLength = RawParseUtils.endOfFooterLineKey(note, curr.value) + 1;
-    MutableInteger i = new MutableInteger();
-    i.value = startOfLength;
-    int commentLength = RawParseUtils.parseBase10(note, startOfLength, i);
-    if (i.value == startOfLength) {
-      throw parseException(changeId, "could not parse %s", LENGTH);
-    }
-    int endOfLine = RawParseUtils.nextLF(note, curr.value);
-    if (i.value != endOfLine - 1) {
-      throw parseException(changeId, "could not parse %s", LENGTH);
-    }
-    curr.value = endOfLine;
-    return checkResult(commentLength, "comment length", changeId);
-  }
-
-  private boolean parseBooleanField(
-      byte[] note, MutableInteger curr, Change.Id changeId, String fieldName)
-      throws ConfigInvalidException {
-    String str = parseStringField(note, curr, changeId, fieldName);
-    if ("true".equalsIgnoreCase(str)) {
-      return true;
-    } else if ("false".equalsIgnoreCase(str)) {
-      return false;
-    }
-    throw parseException(changeId, "invalid boolean for %s: %s", fieldName, str);
-  }
-
-  private static <T> T checkResult(T o, String fieldName, Change.Id changeId)
-      throws ConfigInvalidException {
-    if (o == null) {
-      throw parseException(changeId, "could not parse %s", fieldName);
-    }
-    return o;
-  }
-
-  private static int checkResult(int i, String fieldName, Change.Id changeId)
-      throws ConfigInvalidException {
-    if (i <= 0) {
-      throw parseException(changeId, "could not parse %s", fieldName);
-    }
-    return i;
-  }
-
-  private void appendHeaderField(PrintWriter writer, String field, String value) {
-    writer.print(field);
-    writer.print(": ");
-    writer.print(value);
-    writer.print('\n');
-  }
-
-  private static void checkHeaderLineFormat(
-      byte[] note, MutableInteger curr, String fieldName, Change.Id changeId)
-      throws ConfigInvalidException {
-    boolean correct = RawParseUtils.match(note, curr.value, fieldName.getBytes(UTF_8)) != -1;
-    int p = curr.value + fieldName.length();
-    correct &= (p < note.length && note[p] == ':');
-    p++;
-    correct &= (p < note.length && note[p] == ' ');
-    if (!correct) {
-      throw parseException(changeId, "could not parse %s", fieldName);
-    }
-  }
-
-  /**
-   * Build a note that contains the metadata for and the contents of all of the comments in the
-   * given comments.
-   *
-   * @param comments Comments to be written to the output stream, keyed by patch set ID; multiple
-   *     patch sets are allowed since base revisions may be shared across patch sets. All of the
-   *     comments must share the same RevId, and all the comments for a given patch set must have
-   *     the same side.
-   * @param out output stream to write to.
-   */
-  void buildNote(ListMultimap<Integer, Comment> comments, OutputStream out) {
-    if (comments.isEmpty()) {
-      return;
-    }
-
-    List<Integer> psIds = new ArrayList<>(comments.keySet());
-    Collections.sort(psIds);
-
-    OutputStreamWriter streamWriter = new OutputStreamWriter(out, UTF_8);
-    try (PrintWriter writer = new PrintWriter(streamWriter)) {
-      String revId = comments.values().iterator().next().revId;
-      appendHeaderField(writer, REVISION, revId);
-
-      for (int psId : psIds) {
-        List<Comment> psComments = COMMENT_ORDER.sortedCopy(comments.get(psId));
-        Comment first = psComments.get(0);
-
-        short side = first.side;
-        appendHeaderField(writer, side <= 0 ? BASE_PATCH_SET : PATCH_SET, Integer.toString(psId));
-        if (side < 0) {
-          appendHeaderField(writer, PARENT_NUMBER, Integer.toString(-side));
-        }
-
-        String currentFilename = null;
-
-        for (Comment c : psComments) {
-          checkArgument(
-              revId.equals(c.revId),
-              "All comments being added must have all the same RevId. The "
-                  + "comment below does not have the same RevId as the others "
-                  + "(%s).\n%s",
-              revId,
-              c);
-          checkArgument(
-              side == c.side,
-              "All comments being added must all have the same side. The "
-                  + "comment below does not have the same side as the others "
-                  + "(%s).\n%s",
-              side,
-              c);
-          String commentFilename = QuotedString.GIT_PATH.quote(c.key.filename);
-
-          if (!commentFilename.equals(currentFilename)) {
-            currentFilename = commentFilename;
-            writer.print("File: ");
-            writer.print(commentFilename);
-            writer.print("\n\n");
-          }
-
-          appendOneComment(writer, c);
-        }
-      }
-    }
-  }
-
-  private void appendOneComment(PrintWriter writer, Comment c) {
-    // The CommentRange field for a comment is allowed to be null. If it is
-    // null, then in the first line, we simply use the line number field for a
-    // comment instead. If it isn't null, we write the comment range itself.
-    Comment.Range range = c.range;
-    if (range != null) {
-      writer.print(range.startLine);
-      writer.print(':');
-      writer.print(range.startChar);
-      writer.print('-');
-      writer.print(range.endLine);
-      writer.print(':');
-      writer.print(range.endChar);
-    } else {
-      writer.print(c.lineNbr);
-    }
-    writer.print("\n");
-
-    writer.print(formatTime(serverIdent, c.writtenOn));
-    writer.print("\n");
-
-    appendIdent(writer, AUTHOR, c.author.getId(), c.writtenOn);
-    if (!c.getRealAuthor().equals(c.author)) {
-      appendIdent(writer, REAL_AUTHOR, c.getRealAuthor().getId(), c.writtenOn);
-    }
-
-    String parent = c.parentUuid;
-    if (parent != null) {
-      appendHeaderField(writer, PARENT, parent);
-    }
-
-    appendHeaderField(writer, UNRESOLVED, Boolean.toString(c.unresolved));
-    appendHeaderField(writer, UUID, c.key.uuid);
-
-    if (c.tag != null) {
-      appendHeaderField(writer, TAG, c.tag);
-    }
-
-    byte[] messageBytes = c.message.getBytes(UTF_8);
-    appendHeaderField(writer, LENGTH, Integer.toString(messageBytes.length));
-
-    writer.print(c.message);
-    writer.print("\n\n");
-  }
-
-  private void appendIdent(PrintWriter writer, String header, Account.Id id, Timestamp ts) {
-    PersonIdent ident =
-        newIdent(accountCache.get(id).getAccount(), ts, serverIdent, anonymousCowardName);
-    StringBuilder name = new StringBuilder();
-    PersonIdent.appendSanitized(name, ident.getName());
-    name.append(" <");
-    PersonIdent.appendSanitized(name, ident.getEmailAddress());
-    name.append('>');
-    appendHeaderField(writer, header, name.toString());
-  }
-
-  private static final CharMatcher INVALID_FOOTER_CHARS = CharMatcher.anyOf("\r\n\0");
-
-  static String sanitizeFooter(String value) {
-    // Remove characters that would confuse JGit's footer parser if they were
-    // included in footer values, for example by splitting the footer block into
-    // multiple paragraphs.
-    //
-    // One painful example: RevCommit#getShorMessage() might return a message
-    // containing "\r\r", which RevCommit#getFooterLines() will treat as an
-    // empty paragraph for the purposes of footer parsing.
-    return INVALID_FOOTER_CHARS.trimAndCollapseFrom(value, ' ');
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java
deleted file mode 100644
index 65e1f5d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java
+++ /dev/null
@@ -1,814 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.notedb;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.gerrit.reviewdb.client.RefNames.changeMetaRef;
-import static com.google.gerrit.server.notedb.NoteDbTable.CHANGES;
-import static java.util.Comparator.comparing;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableListMultimap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ImmutableSortedMap;
-import com.google.common.collect.ImmutableSortedSet;
-import com.google.common.collect.Iterators;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.MultimapBuilder;
-import com.google.common.collect.Multimaps;
-import com.google.common.collect.Ordering;
-import com.google.common.collect.Sets;
-import com.google.common.collect.Sets.SetView;
-import com.google.common.collect.Streams;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.data.SubmitRecord;
-import com.google.gerrit.metrics.Timer1;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.client.RevId;
-import com.google.gerrit.reviewdb.client.RobotComment;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.reviewdb.server.ReviewDbUtil;
-import com.google.gerrit.server.ReviewerByEmailSet;
-import com.google.gerrit.server.ReviewerSet;
-import com.google.gerrit.server.ReviewerStatusUpdate;
-import com.google.gerrit.server.git.RefCache;
-import com.google.gerrit.server.git.RepoRefCache;
-import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
-import com.google.gerrit.server.notedb.rebuild.ChangeRebuilder;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.InternalChangeQuery;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import java.util.function.Predicate;
-import java.util.stream.Stream;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** View of a single {@link Change} based on the log of its notes branch. */
-public class ChangeNotes extends AbstractChangeNotes<ChangeNotes> {
-  private static final Logger log = LoggerFactory.getLogger(ChangeNotes.class);
-
-  static final Ordering<PatchSetApproval> PSA_BY_TIME =
-      Ordering.from(comparing(PatchSetApproval::getGranted));
-
-  public static final Ordering<ChangeMessage> MESSAGE_BY_TIME =
-      Ordering.from(comparing(ChangeMessage::getWrittenOn));
-
-  public static ConfigInvalidException parseException(
-      Change.Id changeId, String fmt, Object... args) {
-    return new ConfigInvalidException("Change " + changeId + ": " + String.format(fmt, args));
-  }
-
-  @Nullable
-  public static Change readOneReviewDbChange(ReviewDb db, Change.Id id) throws OrmException {
-    return ReviewDbUtil.unwrapDb(db).changes().get(id);
-  }
-
-  @Singleton
-  public static class Factory {
-    private final Args args;
-    private final Provider<InternalChangeQuery> queryProvider;
-    private final ProjectCache projectCache;
-
-    @VisibleForTesting
-    @Inject
-    public Factory(
-        Args args, Provider<InternalChangeQuery> queryProvider, ProjectCache projectCache) {
-      this.args = args;
-      this.queryProvider = queryProvider;
-      this.projectCache = projectCache;
-    }
-
-    public ChangeNotes createChecked(ReviewDb db, Change c) throws OrmException {
-      return createChecked(db, c.getProject(), c.getId());
-    }
-
-    public ChangeNotes createChecked(ReviewDb db, Project.NameKey project, Change.Id changeId)
-        throws OrmException {
-      Change change = readOneReviewDbChange(db, changeId);
-      if (change == null) {
-        if (!args.migration.readChanges()) {
-          throw new NoSuchChangeException(changeId);
-        }
-        // Change isn't in ReviewDb, but its primary storage might be in NoteDb.
-        // Prepopulate the change exists with proper noteDbState field.
-        change = newNoteDbOnlyChange(project, changeId);
-      } else if (!change.getProject().equals(project)) {
-        throw new NoSuchChangeException(changeId);
-      }
-      return new ChangeNotes(args, change).load();
-    }
-
-    public ChangeNotes createChecked(Change.Id changeId) throws OrmException {
-      InternalChangeQuery query = queryProvider.get().noFields();
-      List<ChangeData> changes = query.byLegacyChangeId(changeId);
-      if (changes.isEmpty()) {
-        throw new NoSuchChangeException(changeId);
-      }
-      if (changes.size() != 1) {
-        log.error("Multiple changes found for {}", changeId.get());
-        throw new NoSuchChangeException(changeId);
-      }
-      return changes.get(0).notes();
-    }
-
-    public static Change newNoteDbOnlyChange(Project.NameKey project, Change.Id changeId) {
-      Change change =
-          new Change(
-              null, changeId, null, new Branch.NameKey(project, "INVALID_NOTE_DB_ONLY"), null);
-      change.setNoteDbState(NoteDbChangeState.NOTE_DB_PRIMARY_STATE);
-      return change;
-    }
-
-    private Change loadChangeFromDb(ReviewDb db, Project.NameKey project, Change.Id changeId)
-        throws OrmException {
-      checkArgument(project != null, "project is required");
-      Change change = readOneReviewDbChange(db, changeId);
-
-      if (change == null) {
-        if (args.migration.readChanges()) {
-          return newNoteDbOnlyChange(project, changeId);
-        }
-        throw new NoSuchChangeException(changeId);
-      }
-      checkArgument(
-          change.getProject().equals(project),
-          "passed project %s when creating ChangeNotes for %s, but actual project is %s",
-          project,
-          changeId,
-          change.getProject());
-      return change;
-    }
-
-    public ChangeNotes create(ReviewDb db, Project.NameKey project, Change.Id changeId)
-        throws OrmException {
-      return new ChangeNotes(args, loadChangeFromDb(db, project, changeId)).load();
-    }
-
-    public ChangeNotes createWithAutoRebuildingDisabled(
-        ReviewDb db, Project.NameKey project, Change.Id changeId) throws OrmException {
-      return new ChangeNotes(args, loadChangeFromDb(db, project, changeId), true, false, null)
-          .load();
-    }
-
-    /**
-     * Create change notes for a change that was loaded from index. This method should only be used
-     * when database access is harmful and potentially stale data from the index is acceptable.
-     *
-     * @param change change loaded from secondary index
-     * @return change notes
-     */
-    public ChangeNotes createFromIndexedChange(Change change) {
-      return new ChangeNotes(args, change);
-    }
-
-    public ChangeNotes createForBatchUpdate(Change change, boolean shouldExist)
-        throws OrmException {
-      return new ChangeNotes(args, change, shouldExist, false, null).load();
-    }
-
-    public ChangeNotes createWithAutoRebuildingDisabled(Change change, RefCache refs)
-        throws OrmException {
-      return new ChangeNotes(args, change, true, false, refs).load();
-    }
-
-    // TODO(ekempin): Remove when database backend is deleted
-    /**
-     * Instantiate ChangeNotes for a change that has been loaded by a batch read from the database.
-     */
-    private ChangeNotes createFromChangeOnlyWhenNoteDbDisabled(Change change) throws OrmException {
-      checkState(
-          !args.migration.readChanges(),
-          "do not call createFromChangeWhenNoteDbDisabled when NoteDb is enabled");
-      return new ChangeNotes(args, change).load();
-    }
-
-    public List<ChangeNotes> create(ReviewDb db, Collection<Change.Id> changeIds)
-        throws OrmException {
-      List<ChangeNotes> notes = new ArrayList<>();
-      if (args.migration.readChanges()) {
-        for (Change.Id changeId : changeIds) {
-          try {
-            notes.add(createChecked(changeId));
-          } catch (NoSuchChangeException e) {
-            // Ignore missing changes to match Access#get(Iterable) behavior.
-          }
-        }
-        return notes;
-      }
-
-      for (Change c : ReviewDbUtil.unwrapDb(db).changes().get(changeIds)) {
-        notes.add(createFromChangeOnlyWhenNoteDbDisabled(c));
-      }
-      return notes;
-    }
-
-    public List<ChangeNotes> create(
-        ReviewDb db,
-        Project.NameKey project,
-        Collection<Change.Id> changeIds,
-        Predicate<ChangeNotes> predicate)
-        throws OrmException {
-      List<ChangeNotes> notes = new ArrayList<>();
-      if (args.migration.readChanges()) {
-        for (Change.Id cid : changeIds) {
-          try {
-            ChangeNotes cn = create(db, project, cid);
-            if (cn.getChange() != null && predicate.test(cn)) {
-              notes.add(cn);
-            }
-          } catch (NoSuchChangeException e) {
-            // Match ReviewDb behavior, returning not found; maybe the caller learned about it from
-            // a dangling patch set ref or something.
-            continue;
-          }
-        }
-        return notes;
-      }
-
-      for (Change c : ReviewDbUtil.unwrapDb(db).changes().get(changeIds)) {
-        if (c != null && project.equals(c.getDest().getParentKey())) {
-          ChangeNotes cn = createFromChangeOnlyWhenNoteDbDisabled(c);
-          if (predicate.test(cn)) {
-            notes.add(cn);
-          }
-        }
-      }
-      return notes;
-    }
-
-    public ListMultimap<Project.NameKey, ChangeNotes> create(
-        ReviewDb db, Predicate<ChangeNotes> predicate) throws IOException, OrmException {
-      ListMultimap<Project.NameKey, ChangeNotes> m =
-          MultimapBuilder.hashKeys().arrayListValues().build();
-      if (args.migration.readChanges()) {
-        for (Project.NameKey project : projectCache.all()) {
-          try (Repository repo = args.repoManager.openRepository(project)) {
-            scanNoteDb(repo, db, project)
-                .filter(r -> !r.error().isPresent())
-                .map(ChangeNotesResult::notes)
-                .filter(predicate)
-                .forEach(n -> m.put(n.getProjectName(), n));
-          }
-        }
-      } else {
-        for (Change change : ReviewDbUtil.unwrapDb(db).changes().all()) {
-          ChangeNotes notes = createFromChangeOnlyWhenNoteDbDisabled(change);
-          if (predicate.test(notes)) {
-            m.put(change.getProject(), notes);
-          }
-        }
-      }
-      return ImmutableListMultimap.copyOf(m);
-    }
-
-    public Stream<ChangeNotesResult> scan(Repository repo, ReviewDb db, Project.NameKey project)
-        throws IOException {
-      return args.migration.readChanges() ? scanNoteDb(repo, db, project) : scanReviewDb(repo, db);
-    }
-
-    private Stream<ChangeNotesResult> scanReviewDb(Repository repo, ReviewDb db)
-        throws IOException {
-      // Scan IDs that might exist in ReviewDb, assuming that each change has at least one patch set
-      // ref. Not all changes might exist: some patch set refs might have been written where the
-      // corresponding ReviewDb write failed. These will be silently filtered out by the batch get
-      // call below, which is intended.
-      Set<Change.Id> ids = scanChangeIds(repo).fromPatchSetRefs();
-
-      // A batch size of N may overload get(Iterable), so use something smaller, but still >1.
-      return Streams.stream(Iterators.partition(ids.iterator(), 30))
-          .flatMap(
-              batch -> {
-                try {
-                  return Streams.stream(ReviewDbUtil.unwrapDb(db).changes().get(batch))
-                      .map(this::toResult)
-                      .filter(Objects::nonNull);
-                } catch (OrmException e) {
-                  // Return this error for each Id in the input batch.
-                  return batch.stream().map(id -> ChangeNotesResult.error(id, e));
-                }
-              });
-    }
-
-    private Stream<ChangeNotesResult> scanNoteDb(
-        Repository repo, ReviewDb db, Project.NameKey project) throws IOException {
-      ScanResult sr = scanChangeIds(repo);
-      PrimaryStorage defaultStorage = args.migration.changePrimaryStorage();
-
-      return sr.all().stream()
-          .map(id -> scanOneNoteDbChange(db, project, sr, defaultStorage, id))
-          .filter(Objects::nonNull);
-    }
-
-    private ChangeNotesResult scanOneNoteDbChange(
-        ReviewDb db,
-        Project.NameKey project,
-        ScanResult sr,
-        PrimaryStorage defaultStorage,
-        Change.Id id) {
-      Change change;
-      try {
-        change = readOneReviewDbChange(db, id);
-      } catch (OrmException e) {
-        return ChangeNotesResult.error(id, e);
-      }
-
-      if (change == null) {
-        if (!sr.fromMetaRefs().contains(id)) {
-          // Stray patch set refs can happen due to normal error conditions, e.g. failed
-          // push processing, so aren't worth even a warning.
-          return null;
-        }
-        if (defaultStorage == PrimaryStorage.REVIEW_DB) {
-          // If changes should exist in ReviewDb, it's worth warning about a meta ref with
-          // no corresponding ReviewDb data.
-          log.warn("skipping change {} found in project {} but not in ReviewDb", id, project);
-          return null;
-        }
-        // TODO(dborowitz): See discussion in NoteDbBatchUpdate#newChangeContext.
-        change = ChangeNotes.Factory.newNoteDbOnlyChange(project, id);
-      } else if (!change.getProject().equals(project)) {
-        log.error(
-            "skipping change {} found in project {} because ReviewDb change has" + " project {}",
-            id,
-            project,
-            change.getProject());
-        return null;
-      }
-      log.debug("adding change {} found in project {}", id, project);
-      return toResult(change);
-    }
-
-    @Nullable
-    private ChangeNotesResult toResult(Change rawChangeFromReviewDbOrNoteDb) {
-      ChangeNotes n = new ChangeNotes(args, rawChangeFromReviewDbOrNoteDb);
-      try {
-        n.load();
-      } catch (OrmException e) {
-        return ChangeNotesResult.error(n.getChangeId(), e);
-      }
-      return ChangeNotesResult.notes(n);
-    }
-
-    /** Result of {@link #scan(Repository, ReviewDb, Project.NameKey)}. */
-    @AutoValue
-    public abstract static class ChangeNotesResult {
-      static ChangeNotesResult error(Change.Id id, OrmException e) {
-        return new AutoValue_ChangeNotes_Factory_ChangeNotesResult(id, Optional.of(e), null);
-      }
-
-      static ChangeNotesResult notes(ChangeNotes notes) {
-        return new AutoValue_ChangeNotes_Factory_ChangeNotesResult(
-            notes.getChangeId(), Optional.empty(), notes);
-      }
-
-      /** Change ID that was scanned. */
-      public abstract Change.Id id();
-
-      /** Error encountered while loading this change, if any. */
-      public abstract Optional<OrmException> error();
-
-      /**
-       * Notes loaded for this change.
-       *
-       * @return notes.
-       * @throws IllegalStateException if there was an error loading the change; callers must check
-       *     that {@link #error()} is absent before attempting to look up the notes.
-       */
-      public ChangeNotes notes() {
-        checkState(maybeNotes() != null, "no ChangeNotes loaded; check error().isPresent() first");
-        return maybeNotes();
-      }
-
-      @Nullable
-      abstract ChangeNotes maybeNotes();
-    }
-
-    @AutoValue
-    abstract static class ScanResult {
-      abstract ImmutableSet<Change.Id> fromPatchSetRefs();
-
-      abstract ImmutableSet<Change.Id> fromMetaRefs();
-
-      SetView<Change.Id> all() {
-        return Sets.union(fromPatchSetRefs(), fromMetaRefs());
-      }
-    }
-
-    private static ScanResult scanChangeIds(Repository repo) throws IOException {
-      ImmutableSet.Builder<Change.Id> fromPs = ImmutableSet.builder();
-      ImmutableSet.Builder<Change.Id> fromMeta = ImmutableSet.builder();
-      for (Ref r : repo.getRefDatabase().getRefs(RefNames.REFS_CHANGES).values()) {
-        Change.Id id = Change.Id.fromRef(r.getName());
-        if (id != null) {
-          (r.getName().endsWith(RefNames.META_SUFFIX) ? fromMeta : fromPs).add(id);
-        }
-      }
-      return new AutoValue_ChangeNotes_Factory_ScanResult(fromPs.build(), fromMeta.build());
-    }
-  }
-
-  private final boolean shouldExist;
-  private final RefCache refs;
-
-  private Change change;
-  private ChangeNotesState state;
-
-  // Parsed note map state, used by ChangeUpdate to make in-place editing of
-  // notes easier.
-  RevisionNoteMap<ChangeRevisionNote> revisionNoteMap;
-
-  private NoteDbUpdateManager.Result rebuildResult;
-  private DraftCommentNotes draftCommentNotes;
-  private RobotCommentNotes robotCommentNotes;
-
-  // Lazy defensive copies of mutable ReviewDb types, to avoid polluting the
-  // ChangeNotesCache from handlers.
-  private ImmutableSortedMap<PatchSet.Id, PatchSet> patchSets;
-  private ImmutableListMultimap<PatchSet.Id, PatchSetApproval> approvals;
-  private ImmutableSet<Comment.Key> commentKeys;
-
-  @VisibleForTesting
-  public ChangeNotes(Args args, Change change) {
-    this(args, change, true, true, null);
-  }
-
-  private ChangeNotes(
-      Args args, Change change, boolean shouldExist, boolean autoRebuild, @Nullable RefCache refs) {
-    super(args, change.getId(), PrimaryStorage.of(change), autoRebuild);
-    this.change = new Change(change);
-    this.shouldExist = shouldExist;
-    this.refs = refs;
-  }
-
-  public Change getChange() {
-    return change;
-  }
-
-  public ObjectId getMetaId() {
-    return state.metaId();
-  }
-
-  public ImmutableSortedMap<PatchSet.Id, PatchSet> getPatchSets() {
-    if (patchSets == null) {
-      ImmutableSortedMap.Builder<PatchSet.Id, PatchSet> b =
-          ImmutableSortedMap.orderedBy(comparing(PatchSet.Id::get));
-      for (Map.Entry<PatchSet.Id, PatchSet> e : state.patchSets()) {
-        b.put(e.getKey(), new PatchSet(e.getValue()));
-      }
-      patchSets = b.build();
-    }
-    return patchSets;
-  }
-
-  public ImmutableListMultimap<PatchSet.Id, PatchSetApproval> getApprovals() {
-    if (approvals == null) {
-      ImmutableListMultimap.Builder<PatchSet.Id, PatchSetApproval> b =
-          ImmutableListMultimap.builder();
-      for (Map.Entry<PatchSet.Id, PatchSetApproval> e : state.approvals()) {
-        b.put(e.getKey(), new PatchSetApproval(e.getValue()));
-      }
-      approvals = b.build();
-    }
-    return approvals;
-  }
-
-  public ReviewerSet getReviewers() {
-    return state.reviewers();
-  }
-
-  /** @return reviewers that do not currently have a Gerrit account and were added by email. */
-  public ReviewerByEmailSet getReviewersByEmail() {
-    return state.reviewersByEmail();
-  }
-
-  /** @return reviewers that were modified during this change's current WIP phase. */
-  public ReviewerSet getPendingReviewers() {
-    return state.pendingReviewers();
-  }
-
-  /** @return reviewers by email that were modified during this change's current WIP phase. */
-  public ReviewerByEmailSet getPendingReviewersByEmail() {
-    return state.pendingReviewersByEmail();
-  }
-
-  public ImmutableList<ReviewerStatusUpdate> getReviewerUpdates() {
-    return state.reviewerUpdates();
-  }
-
-  /** @return an ImmutableSet of Account.Ids of all users that have been assigned to this change. */
-  public ImmutableSet<Account.Id> getPastAssignees() {
-    return state.pastAssignees();
-  }
-
-  /** @return a ImmutableSet of all hashtags for this change sorted in alphabetical order. */
-  public ImmutableSet<String> getHashtags() {
-    return ImmutableSortedSet.copyOf(state.hashtags());
-  }
-
-  /** @return a list of all users who have ever been a reviewer on this change. */
-  public ImmutableList<Account.Id> getAllPastReviewers() {
-    return state.allPastReviewers();
-  }
-
-  /**
-   * @return submit records stored during the most recent submit; only for changes that were
-   *     actually submitted.
-   */
-  public ImmutableList<SubmitRecord> getSubmitRecords() {
-    return state.submitRecords();
-  }
-
-  /** @return all change messages, in chronological order, oldest first. */
-  public ImmutableList<ChangeMessage> getChangeMessages() {
-    return state.allChangeMessages();
-  }
-
-  /** @return change messages by patch set, in chronological order, oldest first. */
-  public ImmutableListMultimap<PatchSet.Id, ChangeMessage> getChangeMessagesByPatchSet() {
-    return state.changeMessagesByPatchSet();
-  }
-
-  /** @return inline comments on each revision. */
-  public ImmutableListMultimap<RevId, Comment> getComments() {
-    return state.publishedComments();
-  }
-
-  public ImmutableSet<Comment.Key> getCommentKeys() {
-    if (commentKeys == null) {
-      ImmutableSet.Builder<Comment.Key> b = ImmutableSet.builder();
-      for (Comment c : getComments().values()) {
-        b.add(new Comment.Key(c.key));
-      }
-      commentKeys = b.build();
-    }
-    return commentKeys;
-  }
-
-  public ImmutableListMultimap<RevId, Comment> getDraftComments(Account.Id author)
-      throws OrmException {
-    return getDraftComments(author, null);
-  }
-
-  public ImmutableListMultimap<RevId, Comment> getDraftComments(
-      Account.Id author, @Nullable Ref ref) throws OrmException {
-    loadDraftComments(author, ref);
-    // Filter out any zombie draft comments. These are drafts that are also in
-    // the published map, and arise when the update to All-Users to delete them
-    // during the publish operation failed.
-    return ImmutableListMultimap.copyOf(
-        Multimaps.filterEntries(
-            draftCommentNotes.getComments(), e -> !getCommentKeys().contains(e.getValue().key)));
-  }
-
-  public ImmutableListMultimap<RevId, RobotComment> getRobotComments() throws OrmException {
-    loadRobotComments();
-    return robotCommentNotes.getComments();
-  }
-
-  /**
-   * If draft comments have already been loaded for this author, then they will not be reloaded.
-   * However, this method will load the comments if no draft comments have been loaded or if the
-   * caller would like the drafts for another author.
-   */
-  private void loadDraftComments(Account.Id author, @Nullable Ref ref) throws OrmException {
-    if (draftCommentNotes == null || !author.equals(draftCommentNotes.getAuthor()) || ref != null) {
-      draftCommentNotes =
-          new DraftCommentNotes(args, change, author, autoRebuild, rebuildResult, ref);
-      draftCommentNotes.load();
-    }
-  }
-
-  private void loadRobotComments() throws OrmException {
-    if (robotCommentNotes == null) {
-      robotCommentNotes = new RobotCommentNotes(args, change);
-      robotCommentNotes.load();
-    }
-  }
-
-  @VisibleForTesting
-  DraftCommentNotes getDraftCommentNotes() {
-    return draftCommentNotes;
-  }
-
-  public RobotCommentNotes getRobotCommentNotes() {
-    return robotCommentNotes;
-  }
-
-  public boolean containsComment(Comment c) throws OrmException {
-    if (containsCommentPublished(c)) {
-      return true;
-    }
-    loadDraftComments(c.author.getId(), null);
-    return draftCommentNotes.containsComment(c);
-  }
-
-  public boolean containsCommentPublished(Comment c) {
-    for (Comment l : getComments().values()) {
-      if (c.key.equals(l.key)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  @Override
-  public String getRefName() {
-    return changeMetaRef(getChangeId());
-  }
-
-  public PatchSet getCurrentPatchSet() {
-    PatchSet.Id psId = change.currentPatchSetId();
-    return checkNotNull(getPatchSets().get(psId), "missing current patch set %s", psId.get());
-  }
-
-  @VisibleForTesting
-  public Timestamp getReadOnlyUntil() {
-    return state.readOnlyUntil();
-  }
-
-  public boolean isPrivate() {
-    if (state.isPrivate() == null) {
-      return false;
-    }
-    return state.isPrivate();
-  }
-
-  public boolean isWorkInProgress() {
-    if (state.isWorkInProgress() == null) {
-      return false;
-    }
-    return state.isWorkInProgress();
-  }
-
-  public Change.Id getRevertOf() {
-    return state.revertOf();
-  }
-
-  public boolean hasReviewStarted() {
-    return state.hasReviewStarted();
-  }
-
-  @Override
-  protected void onLoad(LoadHandle handle)
-      throws NoSuchChangeException, IOException, ConfigInvalidException {
-    ObjectId rev = handle.id();
-    if (rev == null) {
-      if (args.migration.readChanges()
-          && PrimaryStorage.of(change) == PrimaryStorage.NOTE_DB
-          && shouldExist) {
-        throw new NoSuchChangeException(getChangeId());
-      }
-      loadDefaults();
-      return;
-    }
-
-    ChangeNotesCache.Value v =
-        args.cache.get().get(getProjectName(), getChangeId(), rev, handle.walk());
-    state = v.state();
-    state.copyColumnsTo(change);
-    revisionNoteMap = v.revisionNoteMap();
-  }
-
-  @Override
-  protected void loadDefaults() {
-    state = ChangeNotesState.empty(change);
-  }
-
-  @Override
-  public Project.NameKey getProjectName() {
-    return change.getProject();
-  }
-
-  @Override
-  protected ObjectId readRef(Repository repo) throws IOException {
-    return refs != null ? refs.get(getRefName()).orElse(null) : super.readRef(repo);
-  }
-
-  @Override
-  protected LoadHandle openHandle(Repository repo) throws NoSuchChangeException, IOException {
-    if (autoRebuild) {
-      NoteDbChangeState state = NoteDbChangeState.parse(change);
-      if (args.migration.disableChangeReviewDb()) {
-        checkState(
-            state != null,
-            "shouldn't have null NoteDbChangeState when ReviewDb disabled: %s",
-            change);
-      }
-      ObjectId id = readRef(repo);
-      if (id == null) {
-        // Meta ref doesn't exist in NoteDb.
-
-        if (state == null) {
-          // Either ReviewDb change is being newly created, or it exists in ReviewDb but has not yet
-          // been rebuilt for the first time, e.g. because we just turned on write-only mode. In
-          // both cases, we don't want to auto-rebuild, just proceed with an empty ChangeNotes.
-          return super.openHandle(repo, id);
-        } else if (shouldExist && state.getPrimaryStorage() == PrimaryStorage.NOTE_DB) {
-          throw new NoSuchChangeException(getChangeId());
-        }
-
-        // ReviewDb claims NoteDb state exists, but meta ref isn't present: fall through and
-        // auto-rebuild if necessary.
-      }
-      RefCache refs = this.refs != null ? this.refs : new RepoRefCache(repo);
-      if (!NoteDbChangeState.isChangeUpToDate(state, refs, getChangeId())) {
-        return rebuildAndOpen(repo, id);
-      }
-    }
-    return super.openHandle(repo);
-  }
-
-  private LoadHandle rebuildAndOpen(Repository repo, ObjectId oldId) throws IOException {
-    Timer1.Context timer = args.metrics.autoRebuildLatency.start(CHANGES);
-    try {
-      Change.Id cid = getChangeId();
-      ReviewDb db = args.db.get();
-      ChangeRebuilder rebuilder = args.rebuilder.get();
-      NoteDbUpdateManager.Result r;
-      try (NoteDbUpdateManager manager = rebuilder.stage(db, cid)) {
-        if (manager == null) {
-          return super.openHandle(repo, oldId); // May be null in tests.
-        }
-        manager.setRefLogMessage("Auto-rebuilding change");
-        r = manager.stageAndApplyDelta(change);
-        try {
-          rebuilder.execute(db, cid, manager);
-          repo.scanForRepoChanges();
-        } catch (OrmException | IOException e) {
-          // Rebuilding failed. Most likely cause is contention on one or more
-          // change refs; there are other types of errors that can happen during
-          // rebuilding, but generally speaking they should happen during stage(),
-          // not execute(). Assume that some other worker is going to successfully
-          // store the rebuilt state, which is deterministic given an input
-          // ChangeBundle.
-          //
-          // Parse notes from the staged result so we can return something useful
-          // to the caller instead of throwing.
-          log.debug("Rebuilding change {} failed: {}", getChangeId(), e.getMessage());
-          args.metrics.autoRebuildFailureCount.increment(CHANGES);
-          rebuildResult = checkNotNull(r);
-          checkNotNull(r.newState());
-          checkNotNull(r.staged());
-          checkNotNull(r.staged().changeObjects());
-          return LoadHandle.create(
-              ChangeNotesCommit.newStagedRevWalk(repo, r.staged().changeObjects()),
-              r.newState().getChangeMetaId());
-        }
-      }
-      return LoadHandle.create(ChangeNotesCommit.newRevWalk(repo), r.newState().getChangeMetaId());
-    } catch (NoSuchChangeException e) {
-      return super.openHandle(repo, oldId);
-    } catch (OrmException e) {
-      throw new IOException(e);
-    } finally {
-      log.debug(
-          "Rebuilt change {} in project {} in {} ms",
-          getChangeId(),
-          getProjectName(),
-          TimeUnit.MILLISECONDS.convert(timer.stop(), TimeUnit.NANOSECONDS));
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesCache.java
deleted file mode 100644
index 676dbb8..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesCache.java
+++ /dev/null
@@ -1,348 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.notedb;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.cache.Cache;
-import com.google.common.collect.Table;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.ReviewerByEmailSet;
-import com.google.gerrit.server.ReviewerSet;
-import com.google.gerrit.server.cache.CacheModule;
-import com.google.gerrit.server.notedb.AbstractChangeNotes.Args;
-import com.google.gerrit.server.notedb.ChangeNotesCommit.ChangeNotesRevWalk;
-import com.google.inject.Inject;
-import com.google.inject.Module;
-import com.google.inject.Singleton;
-import com.google.inject.name.Named;
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.ObjectId;
-
-@Singleton
-public class ChangeNotesCache {
-  @VisibleForTesting static final String CACHE_NAME = "change_notes";
-
-  public static Module module() {
-    return new CacheModule() {
-      @Override
-      protected void configure() {
-        bind(ChangeNotesCache.class);
-        cache(CACHE_NAME, Key.class, ChangeNotesState.class)
-            .weigher(Weigher.class)
-            .maximumWeight(10 << 20);
-      }
-    };
-  }
-
-  @AutoValue
-  public abstract static class Key {
-    abstract Project.NameKey project();
-
-    abstract Change.Id changeId();
-
-    abstract ObjectId id();
-  }
-
-  public static class Weigher implements com.google.common.cache.Weigher<Key, ChangeNotesState> {
-    // Single object overhead.
-    private static final int O = 16;
-
-    // Single pointer overhead.
-    private static final int P = 8;
-
-    // Single IntKey overhead.
-    private static final int K = O + 4;
-
-    // Single Timestamp overhead.
-    private static final int T = O + 8;
-
-    @Override
-    public int weigh(Key key, ChangeNotesState state) {
-      // Take all columns and all collection sizes into account, but use
-      // estimated average element sizes rather than iterating over collections.
-      // Numbers are largely hand-wavy based on
-      // http://stackoverflow.com/questions/258120/what-is-the-memory-consumption-of-an-object-in-java
-      return P
-          + O
-          + 20 // metaId
-          + K // changeId
-          + str(40) // changeKey
-          + T // createdOn
-          + T // lastUpdatedOn
-          + P
-          + K // owner
-          + P
-          + str(state.columns().branch())
-          + P
-          + patchSetId() // currentPatchSetId
-          + P
-          + str(state.columns().subject())
-          + P
-          + str(state.columns().topic())
-          + P
-          + str(state.columns().originalSubject())
-          + P
-          + str(state.columns().submissionId())
-          + ptr(state.columns().assignee(), K) // assignee
-          + P // status
-          + P
-          + set(state.pastAssignees(), K)
-          + P
-          + set(state.hashtags(), str(10))
-          + P
-          + list(state.patchSets(), patchSet())
-          + P
-          + reviewerSet(state.reviewers(), 2) // REVIEWER or CC
-          + P
-          + reviewerSet(state.reviewersByEmail(), 2) // REVIEWER or CC
-          + P
-          + reviewerSet(state.pendingReviewers(), 3) // includes REMOVED
-          + P
-          + reviewerSet(state.pendingReviewersByEmail(), 3) // includes REMOVED
-          + P
-          + list(state.allPastReviewers(), approval())
-          + P
-          + list(state.reviewerUpdates(), 4 * O + K + K + P)
-          + P
-          + list(state.submitRecords(), P + list(2, str(4) + P + K) + P)
-          + P
-          + list(state.allChangeMessages(), changeMessage())
-          // Just key overhead for map, already counted messages in previous.
-          + P
-          + map(state.changeMessagesByPatchSet().asMap(), patchSetId())
-          + P
-          + map(state.publishedComments().asMap(), comment())
-          + T // readOnlyUntil
-          + 1 // isPrivate
-          + 1 // workInProgress
-          + 1; // hasReviewStarted
-    }
-
-    private static int ptr(Object o, int size) {
-      return o != null ? P + size : P;
-    }
-
-    private static int str(String s) {
-      if (s == null) {
-        return P;
-      }
-      return str(s.length());
-    }
-
-    private static int str(int n) {
-      return 8 + 24 + 2 * n;
-    }
-
-    private static int patchSetId() {
-      return O + 4 + O + 4;
-    }
-
-    private static int set(Set<?> set, int elemSize) {
-      if (set == null) {
-        return P;
-      }
-      return hashtable(set.size(), elemSize);
-    }
-
-    private static int map(Map<?, ?> map, int elemSize) {
-      if (map == null) {
-        return P;
-      }
-      return hashtable(map.size(), elemSize);
-    }
-
-    private static int hashtable(int n, int elemSize) {
-      // Made up numbers.
-      int overhead = 32;
-      int elemOverhead = O + 32;
-      return overhead + elemOverhead * n * elemSize;
-    }
-
-    private static int list(List<?> list, int elemSize) {
-      if (list == null) {
-        return P;
-      }
-      return list(list.size(), elemSize);
-    }
-
-    private static int list(int n, int elemSize) {
-      return O + O + n * (P + elemSize);
-    }
-
-    private static int hashBasedTable(
-        Table<?, ?, ?> table, int numRows, int rowKey, int columnKey, int elemSize) {
-      return O
-          + hashtable(numRows, rowKey + hashtable(0, 0))
-          + hashtable(table.size(), columnKey + elemSize);
-    }
-
-    private static int reviewerSet(ReviewerSet reviewers, int numRows) {
-      final int rowKey = 1; // ReviewerStateInternal
-      final int columnKey = K; // Account.Id
-      final int cellValue = T; // Timestamp
-      return hashBasedTable(reviewers.asTable(), numRows, rowKey, columnKey, cellValue);
-    }
-
-    private static int reviewerSet(ReviewerByEmailSet reviewers, int numRows) {
-      final int rowKey = 1; // ReviewerStateInternal
-      final int columnKey = P + 2 * str(20); // name and email, just a guess
-      final int cellValue = T; // Timestamp
-      return hashBasedTable(reviewers.asTable(), numRows, rowKey, columnKey, cellValue);
-    }
-
-    private static int patchSet() {
-      return O
-          + P
-          + patchSetId()
-          + str(40) // revision
-          + P
-          + K // uploader
-          + P
-          + T // createdOn
-          + 1 // draft
-          + str(40) // groups
-          + P; // pushCertificate
-    }
-
-    private static int approval() {
-      return O
-          + P
-          + patchSetId()
-          + P
-          + K
-          + P
-          + O
-          + str(10)
-          + 2 // value
-          + P
-          + T // granted
-          + P // tag
-          + P; // realAccountId
-    }
-
-    private static int changeMessage() {
-      int key = K + str(20);
-      return O
-          + P
-          + key
-          + P
-          + K // author
-          + P
-          + T // writtenON
-          + str(64) // message
-          + P
-          + patchSetId()
-          + P
-          + P; // realAuthor
-    }
-
-    private static int comment() {
-      int key = P + str(20) + P + str(32) + 4;
-      int ident = O + 4;
-      return O
-          + P
-          + key
-          + 4 // lineNbr
-          + P
-          + ident // author
-          + P
-          + ident // realAuthor
-          + P
-          + T // writtenOn
-          + 2 // side
-          + str(32) // message
-          + str(10) // parentUuid
-          + (P + O + 4 + 4 + 4 + 4) / 2 // range on 50% of comments
-          + P // tag
-          + P
-          + str(40) // revId
-          + P
-          + str(36); // serverId
-    }
-  }
-
-  @AutoValue
-  abstract static class Value {
-    abstract ChangeNotesState state();
-
-    /**
-     * The {@link RevisionNoteMap} produced while parsing this change.
-     *
-     * <p>These instances are mutable and non-threadsafe, so it is only safe to return it to the
-     * caller that actually incurred the cache miss. It is only used as an optimization; {@link
-     * ChangeNotes} is capable of lazily loading it as necessary.
-     */
-    @Nullable
-    abstract RevisionNoteMap<ChangeRevisionNote> revisionNoteMap();
-  }
-
-  private class Loader implements Callable<ChangeNotesState> {
-    private final Key key;
-    private final ChangeNotesRevWalk rw;
-
-    private RevisionNoteMap<ChangeRevisionNote> revisionNoteMap;
-
-    private Loader(Key key, ChangeNotesRevWalk rw) {
-      this.key = key;
-      this.rw = rw;
-    }
-
-    @Override
-    public ChangeNotesState call() throws ConfigInvalidException, IOException {
-      ChangeNotesParser parser =
-          new ChangeNotesParser(key.changeId(), key.id(), rw, args.noteUtil, args.metrics);
-      ChangeNotesState result = parser.parseAll();
-      // This assignment only happens if call() was actually called, which only
-      // happens when Cache#get(K, Callable<V>) incurs a cache miss.
-      revisionNoteMap = parser.getRevisionNoteMap();
-      return result;
-    }
-  }
-
-  private final Cache<Key, ChangeNotesState> cache;
-  private final Args args;
-
-  @Inject
-  ChangeNotesCache(@Named(CACHE_NAME) Cache<Key, ChangeNotesState> cache, Args args) {
-    this.cache = cache;
-    this.args = args;
-  }
-
-  Value get(Project.NameKey project, Change.Id changeId, ObjectId metaId, ChangeNotesRevWalk rw)
-      throws IOException {
-    try {
-      Key key = new AutoValue_ChangeNotesCache_Key(project, changeId, metaId.copy());
-      Loader loader = new Loader(key, rw);
-      ChangeNotesState s = cache.get(key, loader);
-      return new AutoValue_ChangeNotesCache_Value(s, loader.revisionNoteMap);
-    } catch (ExecutionException e) {
-      throw new IOException(
-          String.format(
-              "Error loading %s in %s at %s",
-              RefNames.changeMetaRef(changeId), project, metaId.name()),
-          e);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesParser.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesParser.java
deleted file mode 100644
index d6472bc..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesParser.java
+++ /dev/null
@@ -1,1158 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.notedb;
-
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_ASSIGNEE;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_BRANCH;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_CHANGE_ID;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_COMMIT;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_CURRENT;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_GROUPS;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_HASHTAGS;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_LABEL;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_PATCH_SET;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_PATCH_SET_DESCRIPTION;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_PRIVATE;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_READ_ONLY_UNTIL;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_REAL_USER;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_REVERT_OF;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_STATUS;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_SUBJECT;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_SUBMISSION_ID;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_SUBMITTED_WITH;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_TAG;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_TOPIC;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_WORK_IN_PROGRESS;
-import static com.google.gerrit.server.notedb.NoteDbTable.CHANGES;
-import static java.util.stream.Collectors.joining;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.base.Enums;
-import com.google.common.base.Splitter;
-import com.google.common.collect.HashBasedTable;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ImmutableTable;
-import com.google.common.collect.LinkedListMultimap;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.Lists;
-import com.google.common.collect.MultimapBuilder;
-import com.google.common.collect.Sets;
-import com.google.common.collect.Table;
-import com.google.common.collect.Tables;
-import com.google.common.primitives.Ints;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.SubmitRecord;
-import com.google.gerrit.metrics.Timer1;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.LabelId;
-import com.google.gerrit.reviewdb.client.PatchLineComment;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.client.RevId;
-import com.google.gerrit.reviewdb.server.ReviewDbUtil;
-import com.google.gerrit.server.ReviewerByEmailSet;
-import com.google.gerrit.server.ReviewerSet;
-import com.google.gerrit.server.ReviewerStatusUpdate;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.notedb.ChangeNotesCommit.ChangeNotesRevWalk;
-import com.google.gerrit.server.util.LabelVote;
-import java.io.IOException;
-import java.nio.charset.Charset;
-import java.sql.Timestamp;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.function.Function;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.InvalidObjectIdException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.notes.NoteMap;
-import org.eclipse.jgit.revwalk.FooterKey;
-import org.eclipse.jgit.util.GitDateParser;
-import org.eclipse.jgit.util.RawParseUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-class ChangeNotesParser {
-  private static final Logger log = LoggerFactory.getLogger(ChangeNotesParser.class);
-
-  // Sentinel RevId indicating a mutable field on a patch set was parsed, but
-  // the parser does not yet know its commit SHA-1.
-  private static final RevId PARTIAL_PATCH_SET = new RevId("INVALID PARTIAL PATCH SET");
-
-  @AutoValue
-  abstract static class ApprovalKey {
-    abstract PatchSet.Id psId();
-
-    abstract Account.Id accountId();
-
-    abstract String label();
-
-    private static ApprovalKey create(PatchSet.Id psId, Account.Id accountId, String label) {
-      return new AutoValue_ChangeNotesParser_ApprovalKey(psId, accountId, label);
-    }
-  }
-
-  // Private final members initialized in the constructor.
-  private final ChangeNoteUtil noteUtil;
-  private final NoteDbMetrics metrics;
-  private final Change.Id id;
-  private final ObjectId tip;
-  private final ChangeNotesRevWalk walk;
-
-  // Private final but mutable members initialized in the constructor and filled
-  // in during the parsing process.
-  private final Table<Account.Id, ReviewerStateInternal, Timestamp> reviewers;
-  private final Table<Address, ReviewerStateInternal, Timestamp> reviewersByEmail;
-  private final List<Account.Id> allPastReviewers;
-  private final List<ReviewerStatusUpdate> reviewerUpdates;
-  private final List<SubmitRecord> submitRecords;
-  private final ListMultimap<RevId, Comment> comments;
-  private final Map<PatchSet.Id, PatchSet> patchSets;
-  private final Set<PatchSet.Id> deletedPatchSets;
-  private final Map<PatchSet.Id, PatchSetState> patchSetStates;
-  private final List<PatchSet.Id> currentPatchSets;
-  private final Map<ApprovalKey, PatchSetApproval> approvals;
-  private final List<PatchSetApproval> bufferedApprovals;
-  private final List<ChangeMessage> allChangeMessages;
-  private final ListMultimap<PatchSet.Id, ChangeMessage> changeMessagesByPatchSet;
-
-  // Non-final private members filled in during the parsing process.
-  private String branch;
-  private Change.Status status;
-  private String topic;
-  private Optional<Account.Id> assignee;
-  private List<Account.Id> pastAssignees;
-  private Set<String> hashtags;
-  private Timestamp createdOn;
-  private Timestamp lastUpdatedOn;
-  private Account.Id ownerId;
-  private String changeId;
-  private String subject;
-  private String originalSubject;
-  private String submissionId;
-  private String tag;
-  private RevisionNoteMap<ChangeRevisionNote> revisionNoteMap;
-  private Timestamp readOnlyUntil;
-  private Boolean isPrivate;
-  private Boolean workInProgress;
-  private Boolean previousWorkInProgressFooter;
-  private Boolean hasReviewStarted;
-  private ReviewerSet pendingReviewers;
-  private ReviewerByEmailSet pendingReviewersByEmail;
-  private Change.Id revertOf;
-
-  ChangeNotesParser(
-      Change.Id changeId,
-      ObjectId tip,
-      ChangeNotesRevWalk walk,
-      ChangeNoteUtil noteUtil,
-      NoteDbMetrics metrics) {
-    this.id = changeId;
-    this.tip = tip;
-    this.walk = walk;
-    this.noteUtil = noteUtil;
-    this.metrics = metrics;
-    approvals = new LinkedHashMap<>();
-    bufferedApprovals = new ArrayList<>();
-    reviewers = HashBasedTable.create();
-    reviewersByEmail = HashBasedTable.create();
-    pendingReviewers = ReviewerSet.empty();
-    pendingReviewersByEmail = ReviewerByEmailSet.empty();
-    allPastReviewers = new ArrayList<>();
-    reviewerUpdates = new ArrayList<>();
-    submitRecords = Lists.newArrayListWithExpectedSize(1);
-    allChangeMessages = new ArrayList<>();
-    changeMessagesByPatchSet = LinkedListMultimap.create();
-    comments = MultimapBuilder.hashKeys().arrayListValues().build();
-    patchSets = new HashMap<>();
-    deletedPatchSets = new HashSet<>();
-    patchSetStates = new HashMap<>();
-    currentPatchSets = new ArrayList<>();
-  }
-
-  ChangeNotesState parseAll() throws ConfigInvalidException, IOException {
-    // Don't include initial parse in timer, as this might do more I/O to page
-    // in the block containing most commits. Later reads are not guaranteed to
-    // avoid I/O, but often should.
-    walk.reset();
-    walk.markStart(walk.parseCommit(tip));
-
-    try (Timer1.Context timer = metrics.parseLatency.start(CHANGES)) {
-      ChangeNotesCommit commit;
-      while ((commit = walk.next()) != null) {
-        parse(commit);
-      }
-      if (hasReviewStarted == null) {
-        if (previousWorkInProgressFooter == null) {
-          hasReviewStarted = true;
-        } else {
-          hasReviewStarted = !previousWorkInProgressFooter;
-        }
-      }
-      parseNotes();
-      allPastReviewers.addAll(reviewers.rowKeySet());
-      pruneReviewers();
-      pruneReviewersByEmail();
-
-      updatePatchSetStates();
-      checkMandatoryFooters();
-    }
-
-    return buildState();
-  }
-
-  RevisionNoteMap<ChangeRevisionNote> getRevisionNoteMap() {
-    return revisionNoteMap;
-  }
-
-  private ChangeNotesState buildState() {
-    return ChangeNotesState.create(
-        tip.copy(),
-        id,
-        new Change.Key(changeId),
-        createdOn,
-        lastUpdatedOn,
-        ownerId,
-        branch,
-        buildCurrentPatchSetId(),
-        subject,
-        topic,
-        originalSubject,
-        submissionId,
-        assignee != null ? assignee.orElse(null) : null,
-        status,
-        Sets.newLinkedHashSet(Lists.reverse(pastAssignees)),
-        hashtags,
-        patchSets,
-        buildApprovals(),
-        ReviewerSet.fromTable(Tables.transpose(reviewers)),
-        ReviewerByEmailSet.fromTable(Tables.transpose(reviewersByEmail)),
-        pendingReviewers,
-        pendingReviewersByEmail,
-        allPastReviewers,
-        buildReviewerUpdates(),
-        submitRecords,
-        buildAllMessages(),
-        buildMessagesByPatchSet(),
-        comments,
-        readOnlyUntil,
-        isPrivate,
-        workInProgress,
-        hasReviewStarted,
-        revertOf);
-  }
-
-  private PatchSet.Id buildCurrentPatchSetId() {
-    // currentPatchSets are in parse order, i.e. newest first. Pick the first
-    // patch set that was marked as current, excluding deleted patch sets.
-    for (PatchSet.Id psId : currentPatchSets) {
-      if (patchSets.containsKey(psId)) {
-        return psId;
-      }
-    }
-    return null;
-  }
-
-  private ListMultimap<PatchSet.Id, PatchSetApproval> buildApprovals() {
-    ListMultimap<PatchSet.Id, PatchSetApproval> result =
-        MultimapBuilder.hashKeys().arrayListValues().build();
-    for (PatchSetApproval a : approvals.values()) {
-      if (!patchSets.containsKey(a.getPatchSetId())) {
-        continue; // Patch set deleted or missing.
-      } else if (allPastReviewers.contains(a.getAccountId())
-          && !reviewers.containsRow(a.getAccountId())) {
-        continue; // Reviewer was explicitly removed.
-      }
-      result.put(a.getPatchSetId(), a);
-    }
-    for (Collection<PatchSetApproval> v : result.asMap().values()) {
-      Collections.sort((List<PatchSetApproval>) v, ChangeNotes.PSA_BY_TIME);
-    }
-    return result;
-  }
-
-  private List<ReviewerStatusUpdate> buildReviewerUpdates() {
-    List<ReviewerStatusUpdate> result = new ArrayList<>();
-    HashMap<Account.Id, ReviewerStateInternal> lastState = new HashMap<>();
-    for (ReviewerStatusUpdate u : Lists.reverse(reviewerUpdates)) {
-      if (!Objects.equals(ownerId, u.reviewer()) && lastState.get(u.reviewer()) != u.state()) {
-        result.add(u);
-        lastState.put(u.reviewer(), u.state());
-      }
-    }
-    return result;
-  }
-
-  private List<ChangeMessage> buildAllMessages() {
-    return Lists.reverse(allChangeMessages);
-  }
-
-  private ListMultimap<PatchSet.Id, ChangeMessage> buildMessagesByPatchSet() {
-    for (Collection<ChangeMessage> v : changeMessagesByPatchSet.asMap().values()) {
-      Collections.reverse((List<ChangeMessage>) v);
-    }
-    return changeMessagesByPatchSet;
-  }
-
-  private void parse(ChangeNotesCommit commit) throws ConfigInvalidException {
-    Timestamp ts = new Timestamp(commit.getCommitterIdent().getWhen().getTime());
-
-    createdOn = ts;
-    parseTag(commit);
-
-    if (branch == null) {
-      branch = parseBranch(commit);
-    }
-
-    PatchSet.Id psId = parsePatchSetId(commit);
-    PatchSetState psState = parsePatchSetState(commit);
-    if (psState != null) {
-      if (!patchSetStates.containsKey(psId)) {
-        patchSetStates.put(psId, psState);
-      }
-      if (psState == PatchSetState.DELETED) {
-        deletedPatchSets.add(psId);
-      }
-    }
-
-    Account.Id accountId = parseIdent(commit);
-    if (accountId != null) {
-      ownerId = accountId;
-    }
-    Account.Id realAccountId = parseRealAccountId(commit, accountId);
-
-    if (changeId == null) {
-      changeId = parseChangeId(commit);
-    }
-
-    String currSubject = parseSubject(commit);
-    if (currSubject != null) {
-      if (subject == null) {
-        subject = currSubject;
-      }
-      originalSubject = currSubject;
-    }
-
-    parseChangeMessage(psId, accountId, realAccountId, commit, ts);
-    if (topic == null) {
-      topic = parseTopic(commit);
-    }
-
-    parseHashtags(commit);
-    parseAssignee(commit);
-
-    if (submissionId == null) {
-      submissionId = parseSubmissionId(commit);
-    }
-
-    ObjectId currRev = parseRevision(commit);
-    if (currRev != null) {
-      parsePatchSet(psId, currRev, accountId, ts);
-    }
-    parseGroups(psId, commit);
-    parseCurrentPatchSet(psId, commit);
-
-    if (submitRecords.isEmpty()) {
-      // Only parse the most recent set of submit records; any older ones are
-      // still there, but not currently used.
-      parseSubmitRecords(commit.getFooterLineValues(FOOTER_SUBMITTED_WITH));
-    }
-
-    if (status == null) {
-      status = parseStatus(commit);
-    }
-
-    // Parse approvals after status to treat approvals in the same commit as
-    // "Status: merged" as non-post-submit.
-    for (String line : commit.getFooterLineValues(FOOTER_LABEL)) {
-      parseApproval(psId, accountId, realAccountId, ts, line);
-    }
-
-    for (ReviewerStateInternal state : ReviewerStateInternal.values()) {
-      for (String line : commit.getFooterLineValues(state.getFooterKey())) {
-        parseReviewer(ts, state, line);
-      }
-      for (String line : commit.getFooterLineValues(state.getByEmailFooterKey())) {
-        parseReviewerByEmail(ts, state, line);
-      }
-      // Don't update timestamp when a reviewer was added, matching RevewDb
-      // behavior.
-    }
-
-    if (readOnlyUntil == null) {
-      parseReadOnlyUntil(commit);
-    }
-
-    if (isPrivate == null) {
-      parseIsPrivate(commit);
-    }
-
-    if (revertOf == null) {
-      revertOf = parseRevertOf(commit);
-    }
-
-    previousWorkInProgressFooter = null;
-    parseWorkInProgress(commit);
-
-    if (lastUpdatedOn == null || ts.after(lastUpdatedOn)) {
-      lastUpdatedOn = ts;
-    }
-
-    parseDescription(psId, commit);
-  }
-
-  private String parseSubmissionId(ChangeNotesCommit commit) throws ConfigInvalidException {
-    return parseOneFooter(commit, FOOTER_SUBMISSION_ID);
-  }
-
-  private String parseBranch(ChangeNotesCommit commit) throws ConfigInvalidException {
-    String branch = parseOneFooter(commit, FOOTER_BRANCH);
-    return branch != null ? RefNames.fullName(branch) : null;
-  }
-
-  private String parseChangeId(ChangeNotesCommit commit) throws ConfigInvalidException {
-    return parseOneFooter(commit, FOOTER_CHANGE_ID);
-  }
-
-  private String parseSubject(ChangeNotesCommit commit) throws ConfigInvalidException {
-    return parseOneFooter(commit, FOOTER_SUBJECT);
-  }
-
-  private Account.Id parseRealAccountId(ChangeNotesCommit commit, Account.Id effectiveAccountId)
-      throws ConfigInvalidException {
-    String realUser = parseOneFooter(commit, FOOTER_REAL_USER);
-    if (realUser == null) {
-      return effectiveAccountId;
-    }
-    PersonIdent ident = RawParseUtils.parsePersonIdent(realUser);
-    return noteUtil.parseIdent(ident, id);
-  }
-
-  private String parseTopic(ChangeNotesCommit commit) throws ConfigInvalidException {
-    return parseOneFooter(commit, FOOTER_TOPIC);
-  }
-
-  private String parseOneFooter(ChangeNotesCommit commit, FooterKey footerKey)
-      throws ConfigInvalidException {
-    List<String> footerLines = commit.getFooterLineValues(footerKey);
-    if (footerLines.isEmpty()) {
-      return null;
-    } else if (footerLines.size() > 1) {
-      throw expectedOneFooter(footerKey, footerLines);
-    }
-    return footerLines.get(0);
-  }
-
-  private String parseExactlyOneFooter(ChangeNotesCommit commit, FooterKey footerKey)
-      throws ConfigInvalidException {
-    String line = parseOneFooter(commit, footerKey);
-    if (line == null) {
-      throw expectedOneFooter(footerKey, Collections.<String>emptyList());
-    }
-    return line;
-  }
-
-  private ObjectId parseRevision(ChangeNotesCommit commit) throws ConfigInvalidException {
-    String sha = parseOneFooter(commit, FOOTER_COMMIT);
-    if (sha == null) {
-      return null;
-    }
-    try {
-      return ObjectId.fromString(sha);
-    } catch (InvalidObjectIdException e) {
-      ConfigInvalidException cie = invalidFooter(FOOTER_COMMIT, sha);
-      cie.initCause(e);
-      throw cie;
-    }
-  }
-
-  private void parsePatchSet(PatchSet.Id psId, ObjectId rev, Account.Id accountId, Timestamp ts)
-      throws ConfigInvalidException {
-    if (accountId == null) {
-      throw parseException("patch set %s requires an identified user as uploader", psId.get());
-    }
-    PatchSet ps = patchSets.get(psId);
-    if (ps == null) {
-      ps = new PatchSet(psId);
-      patchSets.put(psId, ps);
-    } else if (!ps.getRevision().equals(PARTIAL_PATCH_SET)) {
-      if (deletedPatchSets.contains(psId)) {
-        // Do not update PS details as PS was deleted and this meta data is of
-        // no relevance
-        return;
-      }
-      throw new ConfigInvalidException(
-          String.format(
-              "Multiple revisions parsed for patch set %s: %s and %s",
-              psId.get(), patchSets.get(psId).getRevision(), rev.name()));
-    }
-    ps.setRevision(new RevId(rev.name()));
-    ps.setUploader(accountId);
-    ps.setCreatedOn(ts);
-  }
-
-  private void parseGroups(PatchSet.Id psId, ChangeNotesCommit commit)
-      throws ConfigInvalidException {
-    String groupsStr = parseOneFooter(commit, FOOTER_GROUPS);
-    if (groupsStr == null) {
-      return;
-    }
-    PatchSet ps = patchSets.get(psId);
-    if (ps == null) {
-      ps = new PatchSet(psId);
-      ps.setRevision(PARTIAL_PATCH_SET);
-      patchSets.put(psId, ps);
-    } else if (!ps.getGroups().isEmpty()) {
-      return;
-    }
-    ps.setGroups(PatchSet.splitGroups(groupsStr));
-  }
-
-  private void parseCurrentPatchSet(PatchSet.Id psId, ChangeNotesCommit commit)
-      throws ConfigInvalidException {
-    // This commit implies a new current patch set if either it creates a new
-    // patch set, or sets the current field explicitly.
-    boolean current = false;
-    if (parseOneFooter(commit, FOOTER_COMMIT) != null) {
-      current = true;
-    } else {
-      String currentStr = parseOneFooter(commit, FOOTER_CURRENT);
-      if (Boolean.TRUE.toString().equalsIgnoreCase(currentStr)) {
-        current = true;
-      } else if (currentStr != null) {
-        // Only "true" is allowed; unsetting the current patch set makes no
-        // sense.
-        throw invalidFooter(FOOTER_CURRENT, currentStr);
-      }
-    }
-    if (current) {
-      currentPatchSets.add(psId);
-    }
-  }
-
-  private void parseHashtags(ChangeNotesCommit commit) throws ConfigInvalidException {
-    // Commits are parsed in reverse order and only the last set of hashtags
-    // should be used.
-    if (hashtags != null) {
-      return;
-    }
-    List<String> hashtagsLines = commit.getFooterLineValues(FOOTER_HASHTAGS);
-    if (hashtagsLines.isEmpty()) {
-      return;
-    } else if (hashtagsLines.size() > 1) {
-      throw expectedOneFooter(FOOTER_HASHTAGS, hashtagsLines);
-    } else if (hashtagsLines.get(0).isEmpty()) {
-      hashtags = ImmutableSet.of();
-    } else {
-      hashtags = Sets.newHashSet(Splitter.on(',').split(hashtagsLines.get(0)));
-    }
-  }
-
-  private void parseAssignee(ChangeNotesCommit commit) throws ConfigInvalidException {
-    if (pastAssignees == null) {
-      pastAssignees = Lists.newArrayList();
-    }
-    String assigneeValue = parseOneFooter(commit, FOOTER_ASSIGNEE);
-    if (assigneeValue != null) {
-      Optional<Account.Id> parsedAssignee;
-      if (assigneeValue.equals("")) {
-        // Empty footer found, assignee deleted
-        parsedAssignee = Optional.empty();
-      } else {
-        PersonIdent ident = RawParseUtils.parsePersonIdent(assigneeValue);
-        parsedAssignee = Optional.ofNullable(noteUtil.parseIdent(ident, id));
-      }
-      if (assignee == null) {
-        assignee = parsedAssignee;
-      }
-      if (parsedAssignee.isPresent()) {
-        pastAssignees.add(parsedAssignee.get());
-      }
-    }
-  }
-
-  private void parseTag(ChangeNotesCommit commit) throws ConfigInvalidException {
-    tag = null;
-    List<String> tagLines = commit.getFooterLineValues(FOOTER_TAG);
-    if (tagLines.isEmpty()) {
-      return;
-    } else if (tagLines.size() == 1) {
-      tag = tagLines.get(0);
-    } else {
-      throw expectedOneFooter(FOOTER_TAG, tagLines);
-    }
-  }
-
-  private Change.Status parseStatus(ChangeNotesCommit commit) throws ConfigInvalidException {
-    List<String> statusLines = commit.getFooterLineValues(FOOTER_STATUS);
-    if (statusLines.isEmpty()) {
-      return null;
-    } else if (statusLines.size() > 1) {
-      throw expectedOneFooter(FOOTER_STATUS, statusLines);
-    }
-    Change.Status status =
-        Enums.getIfPresent(Change.Status.class, statusLines.get(0).toUpperCase()).orNull();
-    if (status == null) {
-      throw invalidFooter(FOOTER_STATUS, statusLines.get(0));
-    }
-    // All approvals after MERGED and before the next status change get the postSubmit
-    // bit. (Currently the state can't change from MERGED to something else, but just in case.) The
-    // exception is the legacy SUBM approval, which is never considered post-submit, but might end
-    // up sorted after the submit during rebuilding.
-    if (status == Change.Status.MERGED) {
-      for (PatchSetApproval psa : bufferedApprovals) {
-        if (!psa.isLegacySubmit()) {
-          psa.setPostSubmit(true);
-        }
-      }
-    }
-    bufferedApprovals.clear();
-    return status;
-  }
-
-  private PatchSet.Id parsePatchSetId(ChangeNotesCommit commit) throws ConfigInvalidException {
-    String psIdLine = parseExactlyOneFooter(commit, FOOTER_PATCH_SET);
-    int s = psIdLine.indexOf(' ');
-    String psIdStr = s < 0 ? psIdLine : psIdLine.substring(0, s);
-    Integer psId = Ints.tryParse(psIdStr);
-    if (psId == null) {
-      throw invalidFooter(FOOTER_PATCH_SET, psIdStr);
-    }
-    return new PatchSet.Id(id, psId);
-  }
-
-  private PatchSetState parsePatchSetState(ChangeNotesCommit commit) throws ConfigInvalidException {
-    String psIdLine = parseExactlyOneFooter(commit, FOOTER_PATCH_SET);
-    int s = psIdLine.indexOf(' ');
-    if (s < 0) {
-      return null;
-    }
-    String withParens = psIdLine.substring(s + 1);
-    if (withParens.startsWith("(") && withParens.endsWith(")")) {
-      PatchSetState state =
-          Enums.getIfPresent(
-                  PatchSetState.class,
-                  withParens.substring(1, withParens.length() - 1).toUpperCase())
-              .orNull();
-      if (state != null) {
-        return state;
-      }
-    }
-    throw invalidFooter(FOOTER_PATCH_SET, psIdLine);
-  }
-
-  private void parseDescription(PatchSet.Id psId, ChangeNotesCommit commit)
-      throws ConfigInvalidException {
-    List<String> descLines = commit.getFooterLineValues(FOOTER_PATCH_SET_DESCRIPTION);
-    if (descLines.isEmpty()) {
-      return;
-    } else if (descLines.size() == 1) {
-      String desc = descLines.get(0).trim();
-      PatchSet ps = patchSets.get(psId);
-      if (ps == null) {
-        ps = new PatchSet(psId);
-        ps.setRevision(PARTIAL_PATCH_SET);
-        patchSets.put(psId, ps);
-      }
-      if (ps.getDescription() == null) {
-        ps.setDescription(desc);
-      }
-    } else {
-      throw expectedOneFooter(FOOTER_PATCH_SET_DESCRIPTION, descLines);
-    }
-  }
-
-  private void parseChangeMessage(
-      PatchSet.Id psId,
-      Account.Id accountId,
-      Account.Id realAccountId,
-      ChangeNotesCommit commit,
-      Timestamp ts) {
-    byte[] raw = commit.getRawBuffer();
-    int size = raw.length;
-    Charset enc = RawParseUtils.parseEncoding(raw);
-
-    int subjectStart = RawParseUtils.commitMessage(raw, 0);
-    if (subjectStart < 0 || subjectStart >= size) {
-      return;
-    }
-
-    int subjectEnd = RawParseUtils.endOfParagraph(raw, subjectStart);
-    if (subjectEnd == size) {
-      return;
-    }
-
-    int changeMessageStart;
-
-    if (raw[subjectEnd] == '\n') {
-      changeMessageStart = subjectEnd + 2; // \n\n ends paragraph
-    } else if (raw[subjectEnd] == '\r') {
-      changeMessageStart = subjectEnd + 4; // \r\n\r\n ends paragraph
-    } else {
-      return;
-    }
-
-    int ptr = size - 1;
-    int changeMessageEnd = -1;
-    while (ptr > changeMessageStart) {
-      ptr = RawParseUtils.prevLF(raw, ptr, '\r');
-      if (ptr == -1) {
-        break;
-      }
-      if (raw[ptr] == '\n') {
-        changeMessageEnd = ptr - 1;
-        break;
-      } else if (raw[ptr] == '\r') {
-        changeMessageEnd = ptr - 3;
-        break;
-      }
-    }
-
-    if (ptr <= changeMessageStart) {
-      return;
-    }
-
-    String changeMsgString =
-        RawParseUtils.decode(enc, raw, changeMessageStart, changeMessageEnd + 1);
-    ChangeMessage changeMessage =
-        new ChangeMessage(
-            new ChangeMessage.Key(psId.getParentKey(), commit.name()), accountId, ts, psId);
-    changeMessage.setMessage(changeMsgString);
-    changeMessage.setTag(tag);
-    changeMessage.setRealAuthor(realAccountId);
-    changeMessagesByPatchSet.put(psId, changeMessage);
-    allChangeMessages.add(changeMessage);
-  }
-
-  private void parseNotes() throws IOException, ConfigInvalidException {
-    ObjectReader reader = walk.getObjectReader();
-    ChangeNotesCommit tipCommit = walk.parseCommit(tip);
-    revisionNoteMap =
-        RevisionNoteMap.parse(
-            noteUtil,
-            id,
-            reader,
-            NoteMap.read(reader, tipCommit),
-            PatchLineComment.Status.PUBLISHED);
-    Map<RevId, ChangeRevisionNote> rns = revisionNoteMap.revisionNotes;
-
-    for (Map.Entry<RevId, ChangeRevisionNote> e : rns.entrySet()) {
-      for (Comment c : e.getValue().getComments()) {
-        comments.put(e.getKey(), c);
-      }
-    }
-
-    for (PatchSet ps : patchSets.values()) {
-      ChangeRevisionNote rn = rns.get(ps.getRevision());
-      if (rn != null && rn.getPushCert() != null) {
-        ps.setPushCertificate(rn.getPushCert());
-      }
-    }
-  }
-
-  private void parseApproval(
-      PatchSet.Id psId, Account.Id accountId, Account.Id realAccountId, Timestamp ts, String line)
-      throws ConfigInvalidException {
-    if (accountId == null) {
-      throw parseException("patch set %s requires an identified user as uploader", psId.get());
-    }
-    PatchSetApproval psa;
-    if (line.startsWith("-")) {
-      psa = parseRemoveApproval(psId, accountId, realAccountId, ts, line);
-    } else {
-      psa = parseAddApproval(psId, accountId, realAccountId, ts, line);
-    }
-    bufferedApprovals.add(psa);
-  }
-
-  private PatchSetApproval parseAddApproval(
-      PatchSet.Id psId, Account.Id committerId, Account.Id realAccountId, Timestamp ts, String line)
-      throws ConfigInvalidException {
-    // There are potentially 3 accounts involved here:
-    //  1. The account from the commit, which is the effective IdentifiedUser
-    //     that produced the update.
-    //  2. The account in the label footer itself, which is used during submit
-    //     to copy other users' labels to a new patch set.
-    //  3. The account in the Real-user footer, indicating that the whole
-    //     update operation was executed by this user on behalf of the effective
-    //     user.
-    Account.Id effectiveAccountId;
-    String labelVoteStr;
-    int s = line.indexOf(' ');
-    if (s > 0) {
-      // Account in the label line (2) becomes the effective ID of the
-      // approval. If there is a real user (3) different from the commit user
-      // (2), we actually don't store that anywhere in this case; it's more
-      // important to record that the real user (3) actually initiated submit.
-      labelVoteStr = line.substring(0, s);
-      PersonIdent ident = RawParseUtils.parsePersonIdent(line.substring(s + 1));
-      checkFooter(ident != null, FOOTER_LABEL, line);
-      effectiveAccountId = noteUtil.parseIdent(ident, id);
-    } else {
-      labelVoteStr = line;
-      effectiveAccountId = committerId;
-    }
-
-    LabelVote l;
-    try {
-      l = LabelVote.parseWithEquals(labelVoteStr);
-    } catch (IllegalArgumentException e) {
-      ConfigInvalidException pe = parseException("invalid %s: %s", FOOTER_LABEL, line);
-      pe.initCause(e);
-      throw pe;
-    }
-
-    PatchSetApproval psa =
-        new PatchSetApproval(
-            new PatchSetApproval.Key(psId, effectiveAccountId, new LabelId(l.label())),
-            l.value(),
-            ts);
-    psa.setTag(tag);
-    if (!Objects.equals(realAccountId, committerId)) {
-      psa.setRealAccountId(realAccountId);
-    }
-    ApprovalKey k = ApprovalKey.create(psId, effectiveAccountId, l.label());
-    if (!approvals.containsKey(k)) {
-      approvals.put(k, psa);
-    }
-    return psa;
-  }
-
-  private PatchSetApproval parseRemoveApproval(
-      PatchSet.Id psId, Account.Id committerId, Account.Id realAccountId, Timestamp ts, String line)
-      throws ConfigInvalidException {
-    // See comments in parseAddApproval about the various users involved.
-    Account.Id effectiveAccountId;
-    String label;
-    int s = line.indexOf(' ');
-    if (s > 0) {
-      label = line.substring(1, s);
-      PersonIdent ident = RawParseUtils.parsePersonIdent(line.substring(s + 1));
-      checkFooter(ident != null, FOOTER_LABEL, line);
-      effectiveAccountId = noteUtil.parseIdent(ident, id);
-    } else {
-      label = line.substring(1);
-      effectiveAccountId = committerId;
-    }
-
-    try {
-      LabelType.checkNameInternal(label);
-    } catch (IllegalArgumentException e) {
-      ConfigInvalidException pe = parseException("invalid %s: %s", FOOTER_LABEL, line);
-      pe.initCause(e);
-      throw pe;
-    }
-
-    // Store an actual 0-vote approval in the map for a removed approval, for
-    // several reasons:
-    //  - This is closer to the ReviewDb representation, which leads to less
-    //    confusion and special-casing of NoteDb.
-    //  - More importantly, ApprovalCopier needs an actual approval in order to
-    //    block copying an earlier approval over a later delete.
-    PatchSetApproval remove =
-        new PatchSetApproval(
-            new PatchSetApproval.Key(psId, effectiveAccountId, new LabelId(label)), (short) 0, ts);
-    if (!Objects.equals(realAccountId, committerId)) {
-      remove.setRealAccountId(realAccountId);
-    }
-    ApprovalKey k = ApprovalKey.create(psId, effectiveAccountId, label);
-    if (!approvals.containsKey(k)) {
-      approvals.put(k, remove);
-    }
-    return remove;
-  }
-
-  private void parseSubmitRecords(List<String> lines) throws ConfigInvalidException {
-    SubmitRecord rec = null;
-
-    for (String line : lines) {
-      int c = line.indexOf(": ");
-      if (c < 0) {
-        rec = new SubmitRecord();
-        submitRecords.add(rec);
-        int s = line.indexOf(' ');
-        String statusStr = s >= 0 ? line.substring(0, s) : line;
-        rec.status = Enums.getIfPresent(SubmitRecord.Status.class, statusStr).orNull();
-        checkFooter(rec.status != null, FOOTER_SUBMITTED_WITH, line);
-        if (s >= 0) {
-          rec.errorMessage = line.substring(s);
-        }
-      } else {
-        checkFooter(rec != null, FOOTER_SUBMITTED_WITH, line);
-        SubmitRecord.Label label = new SubmitRecord.Label();
-        if (rec.labels == null) {
-          rec.labels = new ArrayList<>();
-        }
-        rec.labels.add(label);
-
-        label.status =
-            Enums.getIfPresent(SubmitRecord.Label.Status.class, line.substring(0, c)).orNull();
-        checkFooter(label.status != null, FOOTER_SUBMITTED_WITH, line);
-        int c2 = line.indexOf(": ", c + 2);
-        if (c2 >= 0) {
-          label.label = line.substring(c + 2, c2);
-          PersonIdent ident = RawParseUtils.parsePersonIdent(line.substring(c2 + 2));
-          checkFooter(ident != null, FOOTER_SUBMITTED_WITH, line);
-          label.appliedBy = noteUtil.parseIdent(ident, id);
-        } else {
-          label.label = line.substring(c + 2);
-        }
-      }
-    }
-  }
-
-  private Account.Id parseIdent(ChangeNotesCommit commit) throws ConfigInvalidException {
-    // Check if the author name/email is the same as the committer name/email,
-    // i.e. was the server ident at the time this commit was made.
-    PersonIdent a = commit.getAuthorIdent();
-    PersonIdent c = commit.getCommitterIdent();
-    if (a.getName().equals(c.getName()) && a.getEmailAddress().equals(c.getEmailAddress())) {
-      return null;
-    }
-    return noteUtil.parseIdent(commit.getAuthorIdent(), id);
-  }
-
-  private void parseReviewer(Timestamp ts, ReviewerStateInternal state, String line)
-      throws ConfigInvalidException {
-    PersonIdent ident = RawParseUtils.parsePersonIdent(line);
-    if (ident == null) {
-      throw invalidFooter(state.getFooterKey(), line);
-    }
-    Account.Id accountId = noteUtil.parseIdent(ident, id);
-    reviewerUpdates.add(ReviewerStatusUpdate.create(ts, ownerId, accountId, state));
-    if (!reviewers.containsRow(accountId)) {
-      reviewers.put(accountId, state, ts);
-    }
-  }
-
-  private void parseReviewerByEmail(Timestamp ts, ReviewerStateInternal state, String line)
-      throws ConfigInvalidException {
-    Address adr;
-    try {
-      adr = Address.parse(line);
-    } catch (IllegalArgumentException e) {
-      throw invalidFooter(state.getByEmailFooterKey(), line);
-    }
-    if (!reviewersByEmail.containsRow(adr)) {
-      reviewersByEmail.put(adr, state, ts);
-    }
-  }
-
-  private void parseReadOnlyUntil(ChangeNotesCommit commit) throws ConfigInvalidException {
-    String raw = parseOneFooter(commit, FOOTER_READ_ONLY_UNTIL);
-    if (raw == null) {
-      return;
-    }
-    try {
-      readOnlyUntil = new Timestamp(GitDateParser.parse(raw, null, Locale.US).getTime());
-    } catch (ParseException e) {
-      ConfigInvalidException cie = invalidFooter(FOOTER_READ_ONLY_UNTIL, raw);
-      cie.initCause(e);
-      throw cie;
-    }
-  }
-
-  private void parseIsPrivate(ChangeNotesCommit commit) throws ConfigInvalidException {
-    String raw = parseOneFooter(commit, FOOTER_PRIVATE);
-    if (raw == null) {
-      return;
-    } else if (Boolean.TRUE.toString().equalsIgnoreCase(raw)) {
-      isPrivate = true;
-      return;
-    } else if (Boolean.FALSE.toString().equalsIgnoreCase(raw)) {
-      isPrivate = false;
-      return;
-    }
-    throw invalidFooter(FOOTER_PRIVATE, raw);
-  }
-
-  private void parseWorkInProgress(ChangeNotesCommit commit) throws ConfigInvalidException {
-    String raw = parseOneFooter(commit, FOOTER_WORK_IN_PROGRESS);
-    if (raw == null) {
-      // No change to WIP state in this revision.
-      previousWorkInProgressFooter = null;
-      return;
-    } else if (Boolean.TRUE.toString().equalsIgnoreCase(raw)) {
-      // This revision moves the change into WIP.
-      previousWorkInProgressFooter = true;
-      if (workInProgress == null) {
-        // Because this is the first time workInProgress is being set, we know
-        // that this change's current state is WIP. All the reviewer updates
-        // we've seen so far are pending, so take a snapshot of the reviewers
-        // and reviewersByEmail tables.
-        pendingReviewers =
-            ReviewerSet.fromTable(Tables.transpose(ImmutableTable.copyOf(reviewers)));
-        pendingReviewersByEmail =
-            ReviewerByEmailSet.fromTable(Tables.transpose(ImmutableTable.copyOf(reviewersByEmail)));
-        workInProgress = true;
-      }
-      return;
-    } else if (Boolean.FALSE.toString().equalsIgnoreCase(raw)) {
-      previousWorkInProgressFooter = false;
-      hasReviewStarted = true;
-      if (workInProgress == null) {
-        workInProgress = false;
-      }
-      return;
-    }
-    throw invalidFooter(FOOTER_WORK_IN_PROGRESS, raw);
-  }
-
-  private Change.Id parseRevertOf(ChangeNotesCommit commit) throws ConfigInvalidException {
-    String footer = parseOneFooter(commit, FOOTER_REVERT_OF);
-    if (footer == null) {
-      return null;
-    }
-    Integer revertOf = Ints.tryParse(footer);
-    if (revertOf == null) {
-      throw invalidFooter(FOOTER_REVERT_OF, footer);
-    }
-    return new Change.Id(revertOf);
-  }
-
-  private void pruneReviewers() {
-    Iterator<Table.Cell<Account.Id, ReviewerStateInternal, Timestamp>> rit =
-        reviewers.cellSet().iterator();
-    while (rit.hasNext()) {
-      Table.Cell<Account.Id, ReviewerStateInternal, Timestamp> e = rit.next();
-      if (e.getColumnKey() == ReviewerStateInternal.REMOVED) {
-        rit.remove();
-      }
-    }
-  }
-
-  private void pruneReviewersByEmail() {
-    Iterator<Table.Cell<Address, ReviewerStateInternal, Timestamp>> rit =
-        reviewersByEmail.cellSet().iterator();
-    while (rit.hasNext()) {
-      Table.Cell<Address, ReviewerStateInternal, Timestamp> e = rit.next();
-      if (e.getColumnKey() == ReviewerStateInternal.REMOVED) {
-        rit.remove();
-      }
-    }
-  }
-
-  private void updatePatchSetStates() {
-    Set<PatchSet.Id> missing = new TreeSet<>(ReviewDbUtil.intKeyOrdering());
-    for (Iterator<PatchSet> it = patchSets.values().iterator(); it.hasNext(); ) {
-      PatchSet ps = it.next();
-      if (ps.getRevision().equals(PARTIAL_PATCH_SET)) {
-        missing.add(ps.getId());
-        it.remove();
-      }
-    }
-    for (Map.Entry<PatchSet.Id, PatchSetState> e : patchSetStates.entrySet()) {
-      switch (e.getValue()) {
-        case PUBLISHED:
-        default:
-          break;
-
-        case DELETED:
-          patchSets.remove(e.getKey());
-          break;
-      }
-    }
-
-    // Post-process other collections to remove items corresponding to deleted
-    // (or otherwise missing) patch sets. This is safer than trying to prevent
-    // insertion, as it will also filter out items racily added after the patch
-    // set was deleted.
-    changeMessagesByPatchSet.keys().retainAll(patchSets.keySet());
-
-    int pruned =
-        pruneEntitiesForMissingPatchSets(allChangeMessages, ChangeMessage::getPatchSetId, missing);
-    pruned +=
-        pruneEntitiesForMissingPatchSets(
-            comments.values(), c -> new PatchSet.Id(id, c.key.patchSetId), missing);
-    pruned +=
-        pruneEntitiesForMissingPatchSets(
-            approvals.values(), PatchSetApproval::getPatchSetId, missing);
-
-    if (!missing.isEmpty()) {
-      log.warn("ignoring {} additional entities due to missing patch sets: {}", pruned, missing);
-    }
-  }
-
-  private <T> int pruneEntitiesForMissingPatchSets(
-      Iterable<T> ents, Function<T, PatchSet.Id> psIdFunc, Set<PatchSet.Id> missing) {
-    int pruned = 0;
-    for (Iterator<T> it = ents.iterator(); it.hasNext(); ) {
-      PatchSet.Id psId = psIdFunc.apply(it.next());
-      if (!patchSets.containsKey(psId)) {
-        pruned++;
-        missing.add(psId);
-        it.remove();
-      } else if (deletedPatchSets.contains(psId)) {
-        it.remove(); // Not an error we need to report, don't increment pruned.
-      }
-    }
-    return pruned;
-  }
-
-  private void checkMandatoryFooters() throws ConfigInvalidException {
-    List<FooterKey> missing = new ArrayList<>();
-    if (branch == null) {
-      missing.add(FOOTER_BRANCH);
-    }
-    if (changeId == null) {
-      missing.add(FOOTER_CHANGE_ID);
-    }
-    if (originalSubject == null || subject == null) {
-      missing.add(FOOTER_SUBJECT);
-    }
-    if (!missing.isEmpty()) {
-      throw parseException(
-          "Missing footers: " + missing.stream().map(FooterKey::getName).collect(joining(", ")));
-    }
-  }
-
-  private ConfigInvalidException expectedOneFooter(FooterKey footer, List<String> actual) {
-    return parseException("missing or multiple %s: %s", footer.getName(), actual);
-  }
-
-  private ConfigInvalidException invalidFooter(FooterKey footer, String actual) {
-    return parseException("invalid %s: %s", footer.getName(), actual);
-  }
-
-  private void checkFooter(boolean expr, FooterKey footer, String actual)
-      throws ConfigInvalidException {
-    if (!expr) {
-      throw invalidFooter(footer, actual);
-    }
-  }
-
-  private ConfigInvalidException parseException(String fmt, Object... args) {
-    return ChangeNotes.parseException(id, fmt, args);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesState.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesState.java
deleted file mode 100644
index 1dd944d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesState.java
+++ /dev/null
@@ -1,341 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.notedb;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableListMultimap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ListMultimap;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.data.SubmitRecord;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RevId;
-import com.google.gerrit.server.ReviewerByEmailSet;
-import com.google.gerrit.server.ReviewerSet;
-import com.google.gerrit.server.ReviewerStatusUpdate;
-import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.eclipse.jgit.lib.ObjectId;
-
-/**
- * Immutable state associated with a change meta ref at a given commit.
- *
- * <p>One instance is the output of a single {@link ChangeNotesParser}, and contains types required
- * to support public methods on {@link ChangeNotes}. It is intended to be cached in-process.
- *
- * <p>Note that {@link ChangeNotes} contains more than just a single {@code ChangeNoteState}, such
- * as per-draft information, so that class is not cached directly.
- */
-@AutoValue
-public abstract class ChangeNotesState {
-  static ChangeNotesState empty(Change change) {
-    return new AutoValue_ChangeNotesState(
-        null,
-        change.getId(),
-        null,
-        ImmutableSet.of(),
-        ImmutableSet.of(),
-        ImmutableList.of(),
-        ImmutableList.of(),
-        ReviewerSet.empty(),
-        ReviewerByEmailSet.empty(),
-        ReviewerSet.empty(),
-        ReviewerByEmailSet.empty(),
-        ImmutableList.of(),
-        ImmutableList.of(),
-        ImmutableList.of(),
-        ImmutableList.of(),
-        ImmutableListMultimap.of(),
-        ImmutableListMultimap.of(),
-        null,
-        null,
-        null,
-        true,
-        null);
-  }
-
-  static ChangeNotesState create(
-      @Nullable ObjectId metaId,
-      Change.Id changeId,
-      Change.Key changeKey,
-      Timestamp createdOn,
-      Timestamp lastUpdatedOn,
-      Account.Id owner,
-      String branch,
-      @Nullable PatchSet.Id currentPatchSetId,
-      String subject,
-      @Nullable String topic,
-      @Nullable String originalSubject,
-      @Nullable String submissionId,
-      @Nullable Account.Id assignee,
-      @Nullable Change.Status status,
-      @Nullable Set<Account.Id> pastAssignees,
-      @Nullable Set<String> hashtags,
-      Map<PatchSet.Id, PatchSet> patchSets,
-      ListMultimap<PatchSet.Id, PatchSetApproval> approvals,
-      ReviewerSet reviewers,
-      ReviewerByEmailSet reviewersByEmail,
-      ReviewerSet pendingReviewers,
-      ReviewerByEmailSet pendingReviewersByEmail,
-      List<Account.Id> allPastReviewers,
-      List<ReviewerStatusUpdate> reviewerUpdates,
-      List<SubmitRecord> submitRecords,
-      List<ChangeMessage> allChangeMessages,
-      ListMultimap<PatchSet.Id, ChangeMessage> changeMessagesByPatchSet,
-      ListMultimap<RevId, Comment> publishedComments,
-      @Nullable Timestamp readOnlyUntil,
-      @Nullable Boolean isPrivate,
-      @Nullable Boolean workInProgress,
-      boolean hasReviewStarted,
-      @Nullable Change.Id revertOf) {
-    if (hashtags == null) {
-      hashtags = ImmutableSet.of();
-    }
-    return new AutoValue_ChangeNotesState(
-        metaId,
-        changeId,
-        new AutoValue_ChangeNotesState_ChangeColumns(
-            changeKey,
-            createdOn,
-            lastUpdatedOn,
-            owner,
-            branch,
-            currentPatchSetId,
-            subject,
-            topic,
-            originalSubject,
-            submissionId,
-            assignee,
-            status,
-            isPrivate,
-            workInProgress,
-            hasReviewStarted,
-            revertOf),
-        ImmutableSet.copyOf(pastAssignees),
-        ImmutableSet.copyOf(hashtags),
-        ImmutableList.copyOf(patchSets.entrySet()),
-        ImmutableList.copyOf(approvals.entries()),
-        reviewers,
-        reviewersByEmail,
-        pendingReviewers,
-        pendingReviewersByEmail,
-        ImmutableList.copyOf(allPastReviewers),
-        ImmutableList.copyOf(reviewerUpdates),
-        ImmutableList.copyOf(submitRecords),
-        ImmutableList.copyOf(allChangeMessages),
-        ImmutableListMultimap.copyOf(changeMessagesByPatchSet),
-        ImmutableListMultimap.copyOf(publishedComments),
-        readOnlyUntil,
-        isPrivate,
-        workInProgress,
-        hasReviewStarted,
-        revertOf);
-  }
-
-  /**
-   * Subset of Change columns that can be represented in NoteDb.
-   *
-   * <p>Notable exceptions include rowVersion and noteDbState, which are only make sense when read
-   * from NoteDb, so they cannot be cached.
-   *
-   * <p>Fields are in listed column order.
-   */
-  @AutoValue
-  abstract static class ChangeColumns {
-    abstract Change.Key changeKey();
-
-    abstract Timestamp createdOn();
-
-    abstract Timestamp lastUpdatedOn();
-
-    abstract Account.Id owner();
-
-    // Project not included, as it's not stored anywhere in the meta ref.
-    abstract String branch();
-
-    @Nullable
-    abstract PatchSet.Id currentPatchSetId();
-
-    abstract String subject();
-
-    @Nullable
-    abstract String topic();
-
-    @Nullable
-    abstract String originalSubject();
-
-    @Nullable
-    abstract String submissionId();
-
-    @Nullable
-    abstract Account.Id assignee();
-    // TODO(dborowitz): Use a sensible default other than null
-    @Nullable
-    abstract Change.Status status();
-
-    @Nullable
-    abstract Boolean isPrivate();
-
-    @Nullable
-    abstract Boolean isWorkInProgress();
-
-    @Nullable
-    abstract Boolean hasReviewStarted();
-
-    @Nullable
-    abstract Change.Id revertOf();
-  }
-
-  // Only null if NoteDb is disabled.
-  @Nullable
-  abstract ObjectId metaId();
-
-  abstract Change.Id changeId();
-
-  // Only null if NoteDb is disabled.
-  @Nullable
-  abstract ChangeColumns columns();
-
-  // Other related to this Change.
-  abstract ImmutableSet<Account.Id> pastAssignees();
-
-  abstract ImmutableSet<String> hashtags();
-
-  abstract ImmutableList<Map.Entry<PatchSet.Id, PatchSet>> patchSets();
-
-  abstract ImmutableList<Map.Entry<PatchSet.Id, PatchSetApproval>> approvals();
-
-  abstract ReviewerSet reviewers();
-
-  abstract ReviewerByEmailSet reviewersByEmail();
-
-  abstract ReviewerSet pendingReviewers();
-
-  abstract ReviewerByEmailSet pendingReviewersByEmail();
-
-  abstract ImmutableList<Account.Id> allPastReviewers();
-
-  abstract ImmutableList<ReviewerStatusUpdate> reviewerUpdates();
-
-  abstract ImmutableList<SubmitRecord> submitRecords();
-
-  abstract ImmutableList<ChangeMessage> allChangeMessages();
-
-  abstract ImmutableListMultimap<PatchSet.Id, ChangeMessage> changeMessagesByPatchSet();
-
-  abstract ImmutableListMultimap<RevId, Comment> publishedComments();
-
-  @Nullable
-  abstract Timestamp readOnlyUntil();
-
-  @Nullable
-  abstract Boolean isPrivate();
-
-  @Nullable
-  abstract Boolean isWorkInProgress();
-
-  @Nullable
-  abstract Boolean hasReviewStarted();
-
-  @Nullable
-  abstract Change.Id revertOf();
-
-  Change newChange(Project.NameKey project) {
-    ChangeColumns c = checkNotNull(columns(), "columns are required");
-    Change change =
-        new Change(
-            c.changeKey(),
-            changeId(),
-            c.owner(),
-            new Branch.NameKey(project, c.branch()),
-            c.createdOn());
-    copyNonConstructorColumnsTo(change);
-    change.setNoteDbState(NoteDbChangeState.NOTE_DB_PRIMARY_STATE);
-    return change;
-  }
-
-  void copyColumnsTo(Change change) throws IOException {
-    ChangeColumns c = columns();
-    checkState(
-        c != null && metaId() != null,
-        "missing columns or metaId in ChangeNotesState; is NoteDb enabled? %s",
-        this);
-    checkMetaId(change);
-    change.setKey(c.changeKey());
-    change.setOwner(c.owner());
-    change.setDest(new Branch.NameKey(change.getProject(), c.branch()));
-    change.setCreatedOn(c.createdOn());
-    copyNonConstructorColumnsTo(change);
-  }
-
-  private void checkMetaId(Change change) throws IOException {
-    NoteDbChangeState state = NoteDbChangeState.parse(change);
-    if (state == null) {
-      return; // Can happen during small NoteDb tests.
-    } else if (state.getPrimaryStorage() == PrimaryStorage.NOTE_DB) {
-      return;
-    }
-    checkState(state.getRefState().isPresent(), "expected RefState: %s", state);
-    ObjectId idFromState = state.getRefState().get().changeMetaId();
-    if (!idFromState.equals(metaId())) {
-      throw new IOException(
-          "cannot copy ChangeNotesState into Change "
-              + changeId()
-              + "; this ChangeNotesState was created from "
-              + metaId()
-              + ", but change requires state "
-              + idFromState);
-    }
-  }
-
-  private void copyNonConstructorColumnsTo(Change change) {
-    ChangeColumns c = checkNotNull(columns(), "columns are required");
-    if (c.status() != null) {
-      change.setStatus(c.status());
-    }
-    change.setTopic(Strings.emptyToNull(c.topic()));
-    change.setLastUpdatedOn(c.lastUpdatedOn());
-    change.setSubmissionId(c.submissionId());
-    change.setAssignee(c.assignee());
-    change.setPrivate(c.isPrivate() == null ? false : c.isPrivate());
-    change.setWorkInProgress(c.isWorkInProgress() == null ? false : c.isWorkInProgress());
-    change.setReviewStarted(c.hasReviewStarted() == null ? false : c.hasReviewStarted());
-    change.setRevertOf(c.revertOf());
-
-    if (!patchSets().isEmpty()) {
-      change.setCurrentPatchSet(c.currentPatchSetId(), c.subject(), c.originalSubject());
-    } else {
-      // TODO(dborowitz): This should be an error, but for now it's required for
-      // some tests to pass.
-      change.clearCurrentPatchSet();
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeRevisionNote.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeRevisionNote.java
deleted file mode 100644
index 153c9c3..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeRevisionNote.java
+++ /dev/null
@@ -1,111 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.notedb;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.primitives.Bytes;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.PatchLineComment;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.util.List;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.util.MutableInteger;
-import org.eclipse.jgit.util.RawParseUtils;
-
-class ChangeRevisionNote extends RevisionNote<Comment> {
-  private static final byte[] CERT_HEADER = "certificate version ".getBytes(UTF_8);
-  // See org.eclipse.jgit.transport.PushCertificateParser.END_SIGNATURE
-  private static final byte[] END_SIGNATURE = "-----END PGP SIGNATURE-----\n".getBytes(UTF_8);
-
-  private final ChangeNoteUtil noteUtil;
-  private final Change.Id changeId;
-  private final PatchLineComment.Status status;
-  private String pushCert;
-
-  ChangeRevisionNote(
-      ChangeNoteUtil noteUtil,
-      Change.Id changeId,
-      ObjectReader reader,
-      ObjectId noteId,
-      PatchLineComment.Status status) {
-    super(reader, noteId);
-    this.noteUtil = noteUtil;
-    this.changeId = changeId;
-    this.status = status;
-  }
-
-  public String getPushCert() {
-    checkParsed();
-    return pushCert;
-  }
-
-  @Override
-  protected List<Comment> parse(byte[] raw, int offset) throws IOException, ConfigInvalidException {
-    MutableInteger p = new MutableInteger();
-    p.value = offset;
-
-    if (isJson(raw, p.value)) {
-      RevisionNoteData data = parseJson(noteUtil, raw, p.value);
-      if (status == PatchLineComment.Status.PUBLISHED) {
-        pushCert = data.pushCert;
-      } else {
-        pushCert = null;
-      }
-      return data.comments;
-    }
-
-    if (status == PatchLineComment.Status.PUBLISHED) {
-      pushCert = parsePushCert(changeId, raw, p);
-      trimLeadingEmptyLines(raw, p);
-    } else {
-      pushCert = null;
-    }
-    return noteUtil.parseNote(raw, p, changeId);
-  }
-
-  private static boolean isJson(byte[] raw, int offset) {
-    return raw[offset] == '{' || raw[offset] == '[';
-  }
-
-  private RevisionNoteData parseJson(ChangeNoteUtil noteUtil, byte[] raw, int offset)
-      throws IOException {
-    try (InputStream is = new ByteArrayInputStream(raw, offset, raw.length - offset);
-        Reader r = new InputStreamReader(is, UTF_8)) {
-      return noteUtil.getGson().fromJson(r, RevisionNoteData.class);
-    }
-  }
-
-  private static String parsePushCert(Change.Id changeId, byte[] bytes, MutableInteger p)
-      throws ConfigInvalidException {
-    if (RawParseUtils.match(bytes, p.value, CERT_HEADER) < 0) {
-      return null;
-    }
-    int end = Bytes.indexOf(bytes, END_SIGNATURE);
-    if (end < 0) {
-      throw ChangeNotes.parseException(changeId, "invalid push certificate in note");
-    }
-    int start = p.value;
-    p.value = end + END_SIGNATURE.length;
-    return new String(bytes, start, p.value, UTF_8);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeUpdate.java
deleted file mode 100644
index 7e0daa6..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeUpdate.java
+++ /dev/null
@@ -1,890 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.notedb;
-
-import static com.google.common.base.MoreObjects.firstNonNull;
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.gerrit.reviewdb.client.RefNames.changeMetaRef;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_ASSIGNEE;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_BRANCH;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_CHANGE_ID;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_COMMIT;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_CURRENT;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_GROUPS;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_HASHTAGS;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_LABEL;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_PATCH_SET;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_PATCH_SET_DESCRIPTION;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_PRIVATE;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_READ_ONLY_UNTIL;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_REAL_USER;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_REVERT_OF;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_STATUS;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_SUBJECT;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_SUBMISSION_ID;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_SUBMITTED_WITH;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_TAG;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_TOPIC;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_WORK_IN_PROGRESS;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.sanitizeFooter;
-import static java.util.Comparator.comparing;
-import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Joiner;
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Table;
-import com.google.common.collect.TreeBasedTable;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.data.SubmitRecord;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.PatchLineComment;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RevId;
-import com.google.gerrit.reviewdb.client.RobotComment;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.config.AnonymousCowardName;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.util.LabelVote;
-import com.google.gerrit.server.util.RequestId;
-import com.google.gwtorm.client.IntKey;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.assistedinject.Assisted;
-import com.google.inject.assistedinject.AssistedInject;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.notes.NoteMap;
-import org.eclipse.jgit.revwalk.FooterKey;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-/**
- * A delta to apply to a change.
- *
- * <p>This delta will become two unique commits: one in the AllUsers repo that will contain the
- * draft comments on this change and one in the notes branch that will contain approvals, reviewers,
- * change status, subject, submit records, the change message, and published comments. There are
- * limitations on the set of modifications that can be handled in a single update. In particular,
- * there is a single author and timestamp for each update.
- *
- * <p>This class is not thread-safe.
- */
-public class ChangeUpdate extends AbstractChangeUpdate {
-  public interface Factory {
-    ChangeUpdate create(ChangeNotes notes, CurrentUser user);
-
-    ChangeUpdate create(ChangeNotes notes, CurrentUser user, Date when);
-
-    ChangeUpdate create(
-        Change change,
-        @Assisted("effective") @Nullable Account.Id accountId,
-        @Assisted("real") @Nullable Account.Id realAccountId,
-        PersonIdent authorIdent,
-        Date when,
-        Comparator<String> labelNameComparator);
-
-    @VisibleForTesting
-    ChangeUpdate create(
-        ChangeNotes notes, CurrentUser user, Date when, Comparator<String> labelNameComparator);
-  }
-
-  private final AccountCache accountCache;
-  private final NoteDbUpdateManager.Factory updateManagerFactory;
-  private final ChangeDraftUpdate.Factory draftUpdateFactory;
-  private final RobotCommentUpdate.Factory robotCommentUpdateFactory;
-  private final DeleteCommentRewriter.Factory deleteCommentRewriterFactory;
-
-  private final Table<String, Account.Id, Optional<Short>> approvals;
-  private final Map<Account.Id, ReviewerStateInternal> reviewers = new LinkedHashMap<>();
-  private final Map<Address, ReviewerStateInternal> reviewersByEmail = new LinkedHashMap<>();
-  private final List<Comment> comments = new ArrayList<>();
-
-  private String commitSubject;
-  private String subject;
-  private String changeId;
-  private String branch;
-  private Change.Status status;
-  private List<SubmitRecord> submitRecords;
-  private String submissionId;
-  private String topic;
-  private String commit;
-  private Optional<Account.Id> assignee;
-  private Set<String> hashtags;
-  private String changeMessage;
-  private String tag;
-  private PatchSetState psState;
-  private Iterable<String> groups;
-  private String pushCert;
-  private boolean isAllowWriteToNewtRef;
-  private String psDescription;
-  private boolean currentPatchSet;
-  private Timestamp readOnlyUntil;
-  private Boolean isPrivate;
-  private Boolean workInProgress;
-  private Integer revertOf;
-
-  private ChangeDraftUpdate draftUpdate;
-  private RobotCommentUpdate robotCommentUpdate;
-  private DeleteCommentRewriter deleteCommentRewriter;
-
-  @AssistedInject
-  private ChangeUpdate(
-      @GerritServerConfig Config cfg,
-      @GerritPersonIdent PersonIdent serverIdent,
-      @AnonymousCowardName String anonymousCowardName,
-      NotesMigration migration,
-      AccountCache accountCache,
-      NoteDbUpdateManager.Factory updateManagerFactory,
-      ChangeDraftUpdate.Factory draftUpdateFactory,
-      RobotCommentUpdate.Factory robotCommentUpdateFactory,
-      DeleteCommentRewriter.Factory deleteCommentRewriterFactory,
-      ProjectCache projectCache,
-      @Assisted ChangeNotes notes,
-      @Assisted CurrentUser user,
-      ChangeNoteUtil noteUtil) {
-    this(
-        cfg,
-        serverIdent,
-        anonymousCowardName,
-        migration,
-        accountCache,
-        updateManagerFactory,
-        draftUpdateFactory,
-        robotCommentUpdateFactory,
-        deleteCommentRewriterFactory,
-        projectCache,
-        notes,
-        user,
-        serverIdent.getWhen(),
-        noteUtil);
-  }
-
-  @AssistedInject
-  private ChangeUpdate(
-      @GerritServerConfig Config cfg,
-      @GerritPersonIdent PersonIdent serverIdent,
-      @AnonymousCowardName String anonymousCowardName,
-      NotesMigration migration,
-      AccountCache accountCache,
-      NoteDbUpdateManager.Factory updateManagerFactory,
-      ChangeDraftUpdate.Factory draftUpdateFactory,
-      RobotCommentUpdate.Factory robotCommentUpdateFactory,
-      DeleteCommentRewriter.Factory deleteCommentRewriterFactory,
-      ProjectCache projectCache,
-      @Assisted ChangeNotes notes,
-      @Assisted CurrentUser user,
-      @Assisted Date when,
-      ChangeNoteUtil noteUtil) {
-    this(
-        cfg,
-        serverIdent,
-        anonymousCowardName,
-        migration,
-        accountCache,
-        updateManagerFactory,
-        draftUpdateFactory,
-        robotCommentUpdateFactory,
-        deleteCommentRewriterFactory,
-        notes,
-        user,
-        when,
-        projectCache.get(notes.getProjectName()).getLabelTypes().nameComparator(),
-        noteUtil);
-  }
-
-  private static Table<String, Account.Id, Optional<Short>> approvals(
-      Comparator<String> nameComparator) {
-    return TreeBasedTable.create(nameComparator, comparing(IntKey::get));
-  }
-
-  @AssistedInject
-  private ChangeUpdate(
-      @GerritServerConfig Config cfg,
-      @GerritPersonIdent PersonIdent serverIdent,
-      @AnonymousCowardName String anonymousCowardName,
-      NotesMigration migration,
-      AccountCache accountCache,
-      NoteDbUpdateManager.Factory updateManagerFactory,
-      ChangeDraftUpdate.Factory draftUpdateFactory,
-      RobotCommentUpdate.Factory robotCommentUpdateFactory,
-      DeleteCommentRewriter.Factory deleteCommentRewriterFactory,
-      @Assisted ChangeNotes notes,
-      @Assisted CurrentUser user,
-      @Assisted Date when,
-      @Assisted Comparator<String> labelNameComparator,
-      ChangeNoteUtil noteUtil) {
-    super(cfg, migration, notes, user, serverIdent, anonymousCowardName, noteUtil, when);
-    this.accountCache = accountCache;
-    this.updateManagerFactory = updateManagerFactory;
-    this.draftUpdateFactory = draftUpdateFactory;
-    this.robotCommentUpdateFactory = robotCommentUpdateFactory;
-    this.deleteCommentRewriterFactory = deleteCommentRewriterFactory;
-    this.approvals = approvals(labelNameComparator);
-  }
-
-  @AssistedInject
-  private ChangeUpdate(
-      @GerritServerConfig Config cfg,
-      @GerritPersonIdent PersonIdent serverIdent,
-      @AnonymousCowardName String anonymousCowardName,
-      NotesMigration migration,
-      AccountCache accountCache,
-      NoteDbUpdateManager.Factory updateManagerFactory,
-      ChangeDraftUpdate.Factory draftUpdateFactory,
-      RobotCommentUpdate.Factory robotCommentUpdateFactory,
-      DeleteCommentRewriter.Factory deleteCommentRewriterFactory,
-      ChangeNoteUtil noteUtil,
-      @Assisted Change change,
-      @Assisted("effective") @Nullable Account.Id accountId,
-      @Assisted("real") @Nullable Account.Id realAccountId,
-      @Assisted PersonIdent authorIdent,
-      @Assisted Date when,
-      @Assisted Comparator<String> labelNameComparator) {
-    super(
-        cfg,
-        migration,
-        noteUtil,
-        serverIdent,
-        anonymousCowardName,
-        null,
-        change,
-        accountId,
-        realAccountId,
-        authorIdent,
-        when);
-    this.accountCache = accountCache;
-    this.draftUpdateFactory = draftUpdateFactory;
-    this.robotCommentUpdateFactory = robotCommentUpdateFactory;
-    this.updateManagerFactory = updateManagerFactory;
-    this.deleteCommentRewriterFactory = deleteCommentRewriterFactory;
-    this.approvals = approvals(labelNameComparator);
-  }
-
-  public ObjectId commit() throws IOException, OrmException {
-    try (NoteDbUpdateManager updateManager = updateManagerFactory.create(getProjectName())) {
-      updateManager.add(this);
-      updateManager.stageAndApplyDelta(getChange());
-      updateManager.execute();
-    }
-    return getResult();
-  }
-
-  public void setChangeId(String changeId) {
-    String old = getChange().getKey().get();
-    checkArgument(
-        old.equals(changeId),
-        "The Change-Id was already set to %s, so we cannot set this Change-Id: %s",
-        old,
-        changeId);
-    this.changeId = changeId;
-  }
-
-  public void setBranch(String branch) {
-    this.branch = branch;
-  }
-
-  public void setStatus(Change.Status status) {
-    checkArgument(status != Change.Status.MERGED, "use merge(Iterable<SubmitRecord>)");
-    this.status = status;
-  }
-
-  public void fixStatus(Change.Status status) {
-    this.status = status;
-  }
-
-  public void putApproval(String label, short value) {
-    putApprovalFor(getAccountId(), label, value);
-  }
-
-  public void putApprovalFor(Account.Id reviewer, String label, short value) {
-    approvals.put(label, reviewer, Optional.of(value));
-  }
-
-  public void removeApproval(String label) {
-    removeApprovalFor(getAccountId(), label);
-  }
-
-  public void removeApprovalFor(Account.Id reviewer, String label) {
-    approvals.put(label, reviewer, Optional.empty());
-  }
-
-  public void merge(RequestId submissionId, Iterable<SubmitRecord> submitRecords) {
-    this.status = Change.Status.MERGED;
-    this.submissionId = submissionId.toStringForStorage();
-    this.submitRecords = ImmutableList.copyOf(submitRecords);
-    checkArgument(!this.submitRecords.isEmpty(), "no submit records specified at submit time");
-  }
-
-  @Deprecated // Only until we improve ChangeRebuilder to call merge().
-  public void setSubmissionId(String submissionId) {
-    this.submissionId = submissionId;
-  }
-
-  public void setSubjectForCommit(String commitSubject) {
-    this.commitSubject = commitSubject;
-  }
-
-  public void setSubject(String subject) {
-    this.subject = subject;
-  }
-
-  @VisibleForTesting
-  ObjectId getCommit() {
-    return ObjectId.fromString(commit);
-  }
-
-  public void setChangeMessage(String changeMessage) {
-    this.changeMessage = changeMessage;
-  }
-
-  public void setTag(String tag) {
-    this.tag = tag;
-  }
-
-  public void setPsDescription(String psDescription) {
-    this.psDescription = psDescription;
-  }
-
-  public void putComment(PatchLineComment.Status status, Comment c) {
-    verifyComment(c);
-    createDraftUpdateIfNull();
-    if (status == PatchLineComment.Status.DRAFT) {
-      draftUpdate.putComment(c);
-    } else {
-      comments.add(c);
-      // Always delete the corresponding comment from drafts. Published comments
-      // are immutable, meaning in normal operation we only hit this path when
-      // publishing a comment. It's exactly in that case that we have to delete
-      // the draft.
-      draftUpdate.deleteComment(c);
-    }
-  }
-
-  public void putRobotComment(RobotComment c) {
-    verifyComment(c);
-    createRobotCommentUpdateIfNull();
-    robotCommentUpdate.putComment(c);
-  }
-
-  public void deleteComment(Comment c) {
-    verifyComment(c);
-    createDraftUpdateIfNull().deleteComment(c);
-  }
-
-  public void deleteCommentByRewritingHistory(String uuid, String newMessage) {
-    deleteCommentRewriter =
-        deleteCommentRewriterFactory.create(getChange().getId(), uuid, newMessage);
-  }
-
-  @VisibleForTesting
-  ChangeDraftUpdate createDraftUpdateIfNull() {
-    if (draftUpdate == null) {
-      ChangeNotes notes = getNotes();
-      if (notes != null) {
-        draftUpdate = draftUpdateFactory.create(notes, accountId, realAccountId, authorIdent, when);
-      } else {
-        draftUpdate =
-            draftUpdateFactory.create(getChange(), accountId, realAccountId, authorIdent, when);
-      }
-    }
-    return draftUpdate;
-  }
-
-  @VisibleForTesting
-  RobotCommentUpdate createRobotCommentUpdateIfNull() {
-    if (robotCommentUpdate == null) {
-      ChangeNotes notes = getNotes();
-      if (notes != null) {
-        robotCommentUpdate =
-            robotCommentUpdateFactory.create(notes, accountId, realAccountId, authorIdent, when);
-      } else {
-        robotCommentUpdate =
-            robotCommentUpdateFactory.create(
-                getChange(), accountId, realAccountId, authorIdent, when);
-      }
-    }
-    return robotCommentUpdate;
-  }
-
-  public void setTopic(String topic) {
-    this.topic = Strings.nullToEmpty(topic);
-  }
-
-  public void setCommit(RevWalk rw, ObjectId id) throws IOException {
-    setCommit(rw, id, null);
-  }
-
-  public void setCommit(RevWalk rw, ObjectId id, String pushCert) throws IOException {
-    RevCommit commit = rw.parseCommit(id);
-    rw.parseBody(commit);
-    this.commit = commit.name();
-    subject = commit.getShortMessage();
-    this.pushCert = pushCert;
-  }
-
-  /**
-   * Set the revision without depending on the commit being present in the repository; should only
-   * be used for converting old corrupt commits.
-   */
-  public void setRevisionForMissingCommit(String id, String pushCert) {
-    commit = id;
-    this.pushCert = pushCert;
-  }
-
-  public void setHashtags(Set<String> hashtags) {
-    this.hashtags = hashtags;
-  }
-
-  public void setAssignee(Account.Id assignee) {
-    checkArgument(assignee != null, "use removeAssignee");
-    this.assignee = Optional.of(assignee);
-  }
-
-  public void removeAssignee() {
-    this.assignee = Optional.empty();
-  }
-
-  public Map<Account.Id, ReviewerStateInternal> getReviewers() {
-    return reviewers;
-  }
-
-  public void putReviewer(Account.Id reviewer, ReviewerStateInternal type) {
-    checkArgument(type != ReviewerStateInternal.REMOVED, "invalid ReviewerType");
-    reviewers.put(reviewer, type);
-  }
-
-  public void removeReviewer(Account.Id reviewer) {
-    reviewers.put(reviewer, ReviewerStateInternal.REMOVED);
-  }
-
-  public void putReviewerByEmail(Address reviewer, ReviewerStateInternal type) {
-    checkArgument(type != ReviewerStateInternal.REMOVED, "invalid ReviewerType");
-    reviewersByEmail.put(reviewer, type);
-  }
-
-  public void removeReviewerByEmail(Address reviewer) {
-    reviewersByEmail.put(reviewer, ReviewerStateInternal.REMOVED);
-  }
-
-  public void setPatchSetState(PatchSetState psState) {
-    this.psState = psState;
-  }
-
-  public void setCurrentPatchSet() {
-    this.currentPatchSet = true;
-  }
-
-  public void setGroups(List<String> groups) {
-    checkNotNull(groups, "groups may not be null");
-    this.groups = groups;
-  }
-
-  public void setRevertOf(int revertOf) {
-    int ownId = getChange().getId().get();
-    checkArgument(ownId != revertOf, "A change cannot revert itself");
-    this.revertOf = revertOf;
-    rootOnly = true;
-  }
-
-  /** @return the tree id for the updated tree */
-  private ObjectId storeRevisionNotes(RevWalk rw, ObjectInserter inserter, ObjectId curr)
-      throws ConfigInvalidException, OrmException, IOException {
-    if (comments.isEmpty() && pushCert == null) {
-      return null;
-    }
-    RevisionNoteMap<ChangeRevisionNote> rnm = getRevisionNoteMap(rw, curr);
-
-    RevisionNoteBuilder.Cache cache = new RevisionNoteBuilder.Cache(rnm);
-    for (Comment c : comments) {
-      c.tag = tag;
-      cache.get(new RevId(c.revId)).putComment(c);
-    }
-    if (pushCert != null) {
-      checkState(commit != null);
-      cache.get(new RevId(commit)).setPushCertificate(pushCert);
-    }
-    Map<RevId, RevisionNoteBuilder> builders = cache.getBuilders();
-    checkComments(rnm.revisionNotes, builders);
-
-    for (Map.Entry<RevId, RevisionNoteBuilder> e : builders.entrySet()) {
-      ObjectId data =
-          inserter.insert(OBJ_BLOB, e.getValue().build(noteUtil, noteUtil.getWriteJson()));
-      rnm.noteMap.set(ObjectId.fromString(e.getKey().get()), data);
-    }
-
-    return rnm.noteMap.writeTree(inserter);
-  }
-
-  private RevisionNoteMap<ChangeRevisionNote> getRevisionNoteMap(RevWalk rw, ObjectId curr)
-      throws ConfigInvalidException, OrmException, IOException {
-    if (curr.equals(ObjectId.zeroId())) {
-      return RevisionNoteMap.emptyMap();
-    }
-    if (migration.readChanges()) {
-      // If reading from changes is enabled, then the old ChangeNotes may have
-      // already parsed the revision notes. We can reuse them as long as the ref
-      // hasn't advanced.
-      ChangeNotes notes = getNotes();
-      if (notes != null && notes.revisionNoteMap != null) {
-        ObjectId idFromNotes = firstNonNull(notes.load().getRevision(), ObjectId.zeroId());
-        if (idFromNotes.equals(curr)) {
-          return notes.revisionNoteMap;
-        }
-      }
-    }
-    NoteMap noteMap = NoteMap.read(rw.getObjectReader(), rw.parseCommit(curr));
-    // Even though reading from changes might not be enabled, we need to
-    // parse any existing revision notes so we can merge them.
-    return RevisionNoteMap.parse(
-        noteUtil, getId(), rw.getObjectReader(), noteMap, PatchLineComment.Status.PUBLISHED);
-  }
-
-  private void checkComments(
-      Map<RevId, ChangeRevisionNote> existingNotes, Map<RevId, RevisionNoteBuilder> toUpdate)
-      throws OrmException {
-    // Prohibit various kinds of illegal operations on comments.
-    Set<Comment.Key> existing = new HashSet<>();
-    for (ChangeRevisionNote rn : existingNotes.values()) {
-      for (Comment c : rn.getComments()) {
-        existing.add(c.key);
-        if (draftUpdate != null) {
-          // Take advantage of an existing update on All-Users to prune any
-          // published comments from drafts. NoteDbUpdateManager takes care of
-          // ensuring that this update is applied before its dependent draft
-          // update.
-          //
-          // Deleting aggressively in this way, combined with filtering out
-          // duplicate published/draft comments in ChangeNotes#getDraftComments,
-          // makes up for the fact that updates between the change repo and
-          // All-Users are not atomic.
-          //
-          // TODO(dborowitz): We might want to distinguish between deleted
-          // drafts that we're fixing up after the fact by putting them in a
-          // separate commit. But note that we don't care much about the commit
-          // graph of the draft ref, particularly because the ref is completely
-          // deleted when all drafts are gone.
-          draftUpdate.deleteComment(c.revId, c.key);
-        }
-      }
-    }
-
-    for (RevisionNoteBuilder b : toUpdate.values()) {
-      for (Comment c : b.put.values()) {
-        if (existing.contains(c.key)) {
-          throw new OrmException("Cannot update existing published comment: " + c);
-        }
-      }
-    }
-  }
-
-  @Override
-  protected String getRefName() {
-    return changeMetaRef(getId());
-  }
-
-  @Override
-  protected CommitBuilder applyImpl(RevWalk rw, ObjectInserter ins, ObjectId curr)
-      throws OrmException, IOException {
-    checkState(deleteCommentRewriter == null, "cannot update and rewrite ref in one BatchUpdate");
-
-    CommitBuilder cb = new CommitBuilder();
-
-    int ps = psId != null ? psId.get() : getChange().currentPatchSetId().get();
-    StringBuilder msg = new StringBuilder();
-    if (commitSubject != null) {
-      msg.append(commitSubject);
-    } else {
-      msg.append("Update patch set ").append(ps);
-    }
-    msg.append("\n\n");
-
-    if (changeMessage != null) {
-      msg.append(changeMessage);
-      msg.append("\n\n");
-    }
-
-    addPatchSetFooter(msg, ps);
-
-    if (currentPatchSet) {
-      addFooter(msg, FOOTER_CURRENT, Boolean.TRUE);
-    }
-
-    if (psDescription != null) {
-      addFooter(msg, FOOTER_PATCH_SET_DESCRIPTION, psDescription);
-    }
-
-    if (changeId != null) {
-      addFooter(msg, FOOTER_CHANGE_ID, changeId);
-    }
-
-    if (subject != null) {
-      addFooter(msg, FOOTER_SUBJECT, subject);
-    }
-
-    if (branch != null) {
-      addFooter(msg, FOOTER_BRANCH, branch);
-    }
-
-    if (status != null) {
-      addFooter(msg, FOOTER_STATUS, status.name().toLowerCase());
-    }
-
-    if (topic != null) {
-      addFooter(msg, FOOTER_TOPIC, topic);
-    }
-
-    if (commit != null) {
-      addFooter(msg, FOOTER_COMMIT, commit);
-    }
-
-    if (assignee != null) {
-      if (assignee.isPresent()) {
-        addFooter(msg, FOOTER_ASSIGNEE);
-        addIdent(msg, assignee.get()).append('\n');
-      } else {
-        addFooter(msg, FOOTER_ASSIGNEE).append('\n');
-      }
-    }
-
-    Joiner comma = Joiner.on(',');
-    if (hashtags != null) {
-      addFooter(msg, FOOTER_HASHTAGS, comma.join(hashtags));
-    }
-
-    if (tag != null) {
-      addFooter(msg, FOOTER_TAG, tag);
-    }
-
-    if (groups != null) {
-      addFooter(msg, FOOTER_GROUPS, comma.join(groups));
-    }
-
-    for (Map.Entry<Account.Id, ReviewerStateInternal> e : reviewers.entrySet()) {
-      addFooter(msg, e.getValue().getFooterKey());
-      addIdent(msg, e.getKey()).append('\n');
-    }
-
-    for (Map.Entry<Address, ReviewerStateInternal> e : reviewersByEmail.entrySet()) {
-      addFooter(msg, e.getValue().getByEmailFooterKey(), e.getKey().toString());
-    }
-
-    for (Table.Cell<String, Account.Id, Optional<Short>> c : approvals.cellSet()) {
-      addFooter(msg, FOOTER_LABEL);
-      // Label names/values are safe to append without sanitizing.
-      if (!c.getValue().isPresent()) {
-        msg.append('-').append(c.getRowKey());
-      } else {
-        msg.append(LabelVote.create(c.getRowKey(), c.getValue().get()).formatWithEquals());
-      }
-      Account.Id id = c.getColumnKey();
-      if (!id.equals(getAccountId())) {
-        addIdent(msg.append(' '), id);
-      }
-      msg.append('\n');
-    }
-
-    if (submissionId != null) {
-      addFooter(msg, FOOTER_SUBMISSION_ID, submissionId);
-    }
-
-    if (submitRecords != null) {
-      for (SubmitRecord rec : submitRecords) {
-        addFooter(msg, FOOTER_SUBMITTED_WITH).append(rec.status);
-        if (rec.errorMessage != null) {
-          msg.append(' ').append(sanitizeFooter(rec.errorMessage));
-        }
-        msg.append('\n');
-
-        if (rec.labels != null) {
-          for (SubmitRecord.Label label : rec.labels) {
-            // Label names/values are safe to append without sanitizing.
-            addFooter(msg, FOOTER_SUBMITTED_WITH)
-                .append(label.status)
-                .append(": ")
-                .append(label.label);
-            if (label.appliedBy != null) {
-              msg.append(": ");
-              addIdent(msg, label.appliedBy);
-            }
-            msg.append('\n');
-          }
-        }
-      }
-    }
-
-    if (!Objects.equals(accountId, realAccountId)) {
-      addFooter(msg, FOOTER_REAL_USER);
-      addIdent(msg, realAccountId).append('\n');
-    }
-
-    if (readOnlyUntil != null) {
-      addFooter(msg, FOOTER_READ_ONLY_UNTIL, ChangeNoteUtil.formatTime(serverIdent, readOnlyUntil));
-    }
-
-    if (isPrivate != null) {
-      addFooter(msg, FOOTER_PRIVATE, isPrivate);
-    }
-
-    if (workInProgress != null) {
-      addFooter(msg, FOOTER_WORK_IN_PROGRESS, workInProgress);
-    }
-
-    if (revertOf != null) {
-      addFooter(msg, FOOTER_REVERT_OF, revertOf);
-    }
-
-    cb.setMessage(msg.toString());
-    try {
-      ObjectId treeId = storeRevisionNotes(rw, ins, curr);
-      if (treeId != null) {
-        cb.setTreeId(treeId);
-      }
-    } catch (ConfigInvalidException e) {
-      throw new OrmException(e);
-    }
-    return cb;
-  }
-
-  private void addPatchSetFooter(StringBuilder sb, int ps) {
-    addFooter(sb, FOOTER_PATCH_SET).append(ps);
-    if (psState != null) {
-      sb.append(" (").append(psState.name().toLowerCase()).append(')');
-    }
-    sb.append('\n');
-  }
-
-  @Override
-  protected Project.NameKey getProjectName() {
-    return getChange().getProject();
-  }
-
-  @Override
-  public boolean isEmpty() {
-    return commitSubject == null
-        && approvals.isEmpty()
-        && changeMessage == null
-        && comments.isEmpty()
-        && reviewers.isEmpty()
-        && reviewersByEmail.isEmpty()
-        && changeId == null
-        && branch == null
-        && status == null
-        && submissionId == null
-        && submitRecords == null
-        && assignee == null
-        && hashtags == null
-        && topic == null
-        && commit == null
-        && psState == null
-        && groups == null
-        && tag == null
-        && psDescription == null
-        && !currentPatchSet
-        && readOnlyUntil == null
-        && isPrivate == null
-        && workInProgress == null
-        && revertOf == null;
-  }
-
-  ChangeDraftUpdate getDraftUpdate() {
-    return draftUpdate;
-  }
-
-  RobotCommentUpdate getRobotCommentUpdate() {
-    return robotCommentUpdate;
-  }
-
-  public DeleteCommentRewriter getDeleteCommentRewriter() {
-    return deleteCommentRewriter;
-  }
-
-  public void setAllowWriteToNewRef(boolean allow) {
-    isAllowWriteToNewtRef = allow;
-  }
-
-  @Override
-  public boolean allowWriteToNewRef() {
-    return isAllowWriteToNewtRef;
-  }
-
-  public void setPrivate(boolean isPrivate) {
-    this.isPrivate = isPrivate;
-  }
-
-  public void setWorkInProgress(boolean workInProgress) {
-    this.workInProgress = workInProgress;
-  }
-
-  void setReadOnlyUntil(Timestamp readOnlyUntil) {
-    this.readOnlyUntil = readOnlyUntil;
-  }
-
-  private static StringBuilder addFooter(StringBuilder sb, FooterKey footer) {
-    return sb.append(footer.getName()).append(": ");
-  }
-
-  private static void addFooter(StringBuilder sb, FooterKey footer, Object... values) {
-    addFooter(sb, footer);
-    for (Object value : values) {
-      sb.append(sanitizeFooter(Objects.toString(value)));
-    }
-    sb.append('\n');
-  }
-
-  private StringBuilder addIdent(StringBuilder sb, Account.Id accountId) {
-    Account account = accountCache.get(accountId).getAccount();
-    PersonIdent ident = newIdent(account, when);
-
-    PersonIdent.appendSanitized(sb, ident.getName());
-    sb.append(" <");
-    PersonIdent.appendSanitized(sb, ident.getEmailAddress());
-    sb.append('>');
-    return sb;
-  }
-
-  @Override
-  protected void checkNotReadOnly() throws OrmException {
-    // Allow setting Read-only-until to 0 to release an existing lease.
-    if (readOnlyUntil != null && readOnlyUntil.getTime() == 0) {
-      return;
-    }
-    super.checkNotReadOnly();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/DeleteCommentRewriter.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/DeleteCommentRewriter.java
deleted file mode 100644
index 7a3d441..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/DeleteCommentRewriter.java
+++ /dev/null
@@ -1,235 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.notedb;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.gerrit.reviewdb.client.PatchLineComment.Status.PUBLISHED;
-import static java.util.stream.Collectors.toList;
-import static java.util.stream.Collectors.toMap;
-import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.client.RevId;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.notes.NoteMap;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevSort;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-/**
- * Deletes a published comment from NoteDb by rewriting the commit history. Instead of deleting the
- * whole comment, it just replaces the comment's message with a new message.
- */
-public class DeleteCommentRewriter implements NoteDbRewriter {
-
-  public interface Factory {
-    /**
-     * Creates a DeleteCommentRewriter instance.
-     *
-     * @param id the id of the change which contains the target comment.
-     * @param uuid the uuid of the target comment.
-     * @param newMessage the message used to replace the old message of the target comment.
-     * @return the DeleteCommentRewriter instance
-     */
-    DeleteCommentRewriter create(
-        Change.Id id, @Assisted("uuid") String uuid, @Assisted("newMessage") String newMessage);
-  }
-
-  private final ChangeNoteUtil noteUtil;
-  private final Change.Id changeId;
-  private final String uuid;
-  private final String newMessage;
-
-  @Inject
-  DeleteCommentRewriter(
-      ChangeNoteUtil noteUtil,
-      @Assisted Change.Id changeId,
-      @Assisted("uuid") String uuid,
-      @Assisted("newMessage") String newMessage) {
-    this.noteUtil = noteUtil;
-    this.changeId = changeId;
-    this.uuid = uuid;
-    this.newMessage = newMessage;
-  }
-
-  @Override
-  public String getRefName() {
-    return RefNames.changeMetaRef(changeId);
-  }
-
-  @Override
-  public ObjectId rewriteCommitHistory(RevWalk revWalk, ObjectInserter inserter, ObjectId currTip)
-      throws IOException, ConfigInvalidException, OrmException {
-    checkArgument(!currTip.equals(ObjectId.zeroId()));
-
-    // Walk from the first commit of the branch.
-    revWalk.reset();
-    revWalk.markStart(revWalk.parseCommit(currTip));
-    revWalk.sort(RevSort.REVERSE);
-
-    ObjectReader reader = revWalk.getObjectReader();
-    RevCommit newTipCommit = revWalk.next(); // The first commit will not be rewritten.
-    Map<String, Comment> parentComments =
-        getPublishedComments(noteUtil, changeId, reader, NoteMap.read(reader, newTipCommit));
-
-    boolean rewrite = false;
-    RevCommit originalCommit;
-    while ((originalCommit = revWalk.next()) != null) {
-      NoteMap noteMap = NoteMap.read(reader, originalCommit);
-      Map<String, Comment> currComments = getPublishedComments(noteUtil, changeId, reader, noteMap);
-
-      if (!rewrite && currComments.containsKey(uuid)) {
-        rewrite = true;
-      }
-
-      if (!rewrite) {
-        parentComments = currComments;
-        newTipCommit = originalCommit;
-        continue;
-      }
-
-      List<Comment> putInComments = getPutInComments(parentComments, currComments);
-      List<Comment> deletedComments = getDeletedComments(parentComments, currComments);
-      newTipCommit =
-          revWalk.parseCommit(
-              rewriteCommit(
-                  originalCommit, newTipCommit, inserter, reader, putInComments, deletedComments));
-      parentComments = currComments;
-    }
-
-    return newTipCommit;
-  }
-
-  /**
-   * Gets all the comments which are presented at a commit. Note they include the comments put in by
-   * the previous commits.
-   */
-  @VisibleForTesting
-  public static Map<String, Comment> getPublishedComments(
-      ChangeNoteUtil noteUtil, Change.Id changeId, ObjectReader reader, NoteMap noteMap)
-      throws IOException, ConfigInvalidException {
-    return RevisionNoteMap.parse(noteUtil, changeId, reader, noteMap, PUBLISHED).revisionNotes
-        .values().stream()
-        .flatMap(n -> n.getComments().stream())
-        .collect(toMap(c -> c.key.uuid, c -> c));
-  }
-
-  /**
-   * Gets the comments put in by the current commit. The message of the target comment will be
-   * replaced by the new message.
-   *
-   * @param parMap the comment map of the parent commit.
-   * @param curMap the comment map of the current commit.
-   * @return The comments put in by the current commit.
-   */
-  private List<Comment> getPutInComments(Map<String, Comment> parMap, Map<String, Comment> curMap) {
-    List<Comment> comments = new ArrayList<>();
-    for (String key : curMap.keySet()) {
-      if (!parMap.containsKey(key)) {
-        Comment comment = curMap.get(key);
-        if (key.equals(uuid)) {
-          comment.message = newMessage;
-        }
-        comments.add(comment);
-      }
-    }
-    return comments;
-  }
-
-  /**
-   * Gets the comments deleted by the current commit.
-   *
-   * @param parMap the comment map of the parent commit.
-   * @param curMap the comment map of the current commit.
-   * @return The comments deleted by the current commit.
-   */
-  private List<Comment> getDeletedComments(
-      Map<String, Comment> parMap, Map<String, Comment> curMap) {
-    return parMap.entrySet().stream()
-        .filter(c -> !curMap.containsKey(c.getKey()))
-        .map(c -> c.getValue())
-        .collect(toList());
-  }
-
-  /**
-   * Rewrites one commit.
-   *
-   * @param originalCommit the original commit to be rewritten.
-   * @param parentCommit the parent of the new commit.
-   * @param inserter the {@code ObjectInserter} for the rewrite process.
-   * @param reader the {@code ObjectReader} for the rewrite process.
-   * @param putInComments the comments put in by this commit.
-   * @param deletedComments the comments deleted by this commit.
-   * @return the {@code objectId} of the new commit.
-   * @throws IOException
-   * @throws ConfigInvalidException
-   */
-  private ObjectId rewriteCommit(
-      RevCommit originalCommit,
-      RevCommit parentCommit,
-      ObjectInserter inserter,
-      ObjectReader reader,
-      List<Comment> putInComments,
-      List<Comment> deletedComments)
-      throws IOException, ConfigInvalidException {
-    RevisionNoteMap<ChangeRevisionNote> revNotesMap =
-        RevisionNoteMap.parse(
-            noteUtil, changeId, reader, NoteMap.read(reader, parentCommit), PUBLISHED);
-    RevisionNoteBuilder.Cache cache = new RevisionNoteBuilder.Cache(revNotesMap);
-
-    for (Comment c : putInComments) {
-      cache.get(new RevId(c.revId)).putComment(c);
-    }
-
-    for (Comment c : deletedComments) {
-      cache.get(new RevId(c.revId)).deleteComment(c.key);
-    }
-
-    Map<RevId, RevisionNoteBuilder> builders = cache.getBuilders();
-    for (Map.Entry<RevId, RevisionNoteBuilder> entry : builders.entrySet()) {
-      ObjectId objectId = ObjectId.fromString(entry.getKey().get());
-      byte[] data = entry.getValue().build(noteUtil, noteUtil.getWriteJson());
-      if (data.length == 0) {
-        revNotesMap.noteMap.remove(objectId);
-      } else {
-        revNotesMap.noteMap.set(objectId, inserter.insert(OBJ_BLOB, data));
-      }
-    }
-
-    CommitBuilder cb = new CommitBuilder();
-    cb.setParentId(parentCommit);
-    cb.setTreeId(revNotesMap.noteMap.writeTree(inserter));
-    cb.setMessage(originalCommit.getFullMessage());
-    cb.setCommitter(originalCommit.getCommitterIdent());
-    cb.setAuthor(originalCommit.getAuthorIdent());
-    cb.setEncoding(originalCommit.getEncoding());
-
-    return inserter.insert(cb);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/DraftCommentNotes.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/DraftCommentNotes.java
deleted file mode 100644
index 008f31f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/DraftCommentNotes.java
+++ /dev/null
@@ -1,258 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.notedb;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.gerrit.reviewdb.client.RefNames.refsDraftComments;
-import static com.google.gerrit.server.notedb.NoteDbTable.CHANGES;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.ImmutableListMultimap;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.MultimapBuilder;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.metrics.Timer1;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.PatchLineComment;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RevId;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.git.RepoRefCache;
-import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
-import com.google.gerrit.server.notedb.NoteDbUpdateManager.StagedResult;
-import com.google.gerrit.server.notedb.rebuild.ChangeRebuilder;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.assistedinject.Assisted;
-import com.google.inject.assistedinject.AssistedInject;
-import java.io.IOException;
-import java.util.concurrent.TimeUnit;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.notes.NoteMap;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.transport.ReceiveCommand;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** View of the draft comments for a single {@link Change} based on the log of its drafts branch. */
-public class DraftCommentNotes extends AbstractChangeNotes<DraftCommentNotes> {
-  private static final Logger log = LoggerFactory.getLogger(DraftCommentNotes.class);
-
-  public interface Factory {
-    DraftCommentNotes create(Change change, Account.Id accountId);
-
-    DraftCommentNotes createWithAutoRebuildingDisabled(Change.Id changeId, Account.Id accountId);
-  }
-
-  private final Change change;
-  private final Account.Id author;
-  private final NoteDbUpdateManager.Result rebuildResult;
-  private final Ref ref;
-
-  private ImmutableListMultimap<RevId, Comment> comments;
-  private RevisionNoteMap<ChangeRevisionNote> revisionNoteMap;
-
-  @AssistedInject
-  DraftCommentNotes(Args args, @Assisted Change change, @Assisted Account.Id author) {
-    this(args, change, author, true, null, null);
-  }
-
-  @AssistedInject
-  DraftCommentNotes(Args args, @Assisted Change.Id changeId, @Assisted Account.Id author) {
-    // PrimaryStorage is unknown; this should only called by
-    // PatchLineCommentsUtil#draftByAuthor, which can live with this.
-    super(args, changeId, null, false);
-    this.change = null;
-    this.author = author;
-    this.rebuildResult = null;
-    this.ref = null;
-  }
-
-  DraftCommentNotes(
-      Args args,
-      Change change,
-      Account.Id author,
-      boolean autoRebuild,
-      @Nullable NoteDbUpdateManager.Result rebuildResult,
-      @Nullable Ref ref) {
-    super(args, change.getId(), PrimaryStorage.of(change), autoRebuild);
-    this.change = change;
-    this.author = author;
-    this.rebuildResult = rebuildResult;
-    this.ref = ref;
-    if (ref != null) {
-      checkArgument(
-          ref.getName().equals(getRefName()),
-          "draft ref not for change %s and account %s: %s",
-          getChangeId(),
-          author,
-          ref.getName());
-    }
-  }
-
-  RevisionNoteMap<ChangeRevisionNote> getRevisionNoteMap() {
-    return revisionNoteMap;
-  }
-
-  public Account.Id getAuthor() {
-    return author;
-  }
-
-  public ImmutableListMultimap<RevId, Comment> getComments() {
-    return comments;
-  }
-
-  public boolean containsComment(Comment c) {
-    for (Comment existing : comments.values()) {
-      if (c.key.equals(existing.key)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  @Override
-  protected String getRefName() {
-    return refsDraftComments(getChangeId(), author);
-  }
-
-  @Override
-  protected ObjectId readRef(Repository repo) throws IOException {
-    if (ref != null) {
-      return ref.getObjectId();
-    }
-    return super.readRef(repo);
-  }
-
-  @Override
-  protected void onLoad(LoadHandle handle) throws IOException, ConfigInvalidException {
-    ObjectId rev = handle.id();
-    if (rev == null) {
-      loadDefaults();
-      return;
-    }
-
-    RevCommit tipCommit = handle.walk().parseCommit(rev);
-    ObjectReader reader = handle.walk().getObjectReader();
-    revisionNoteMap =
-        RevisionNoteMap.parse(
-            args.noteUtil,
-            getChangeId(),
-            reader,
-            NoteMap.read(reader, tipCommit),
-            PatchLineComment.Status.DRAFT);
-    ListMultimap<RevId, Comment> cs = MultimapBuilder.hashKeys().arrayListValues().build();
-    for (ChangeRevisionNote rn : revisionNoteMap.revisionNotes.values()) {
-      for (Comment c : rn.getComments()) {
-        cs.put(new RevId(c.revId), c);
-      }
-    }
-    comments = ImmutableListMultimap.copyOf(cs);
-  }
-
-  @Override
-  protected void loadDefaults() {
-    comments = ImmutableListMultimap.of();
-  }
-
-  @Override
-  public Project.NameKey getProjectName() {
-    return args.allUsers;
-  }
-
-  @Override
-  protected LoadHandle openHandle(Repository repo) throws NoSuchChangeException, IOException {
-    if (rebuildResult != null) {
-      StagedResult sr = checkNotNull(rebuildResult.staged());
-      return LoadHandle.create(
-          ChangeNotesCommit.newStagedRevWalk(repo, sr.allUsersObjects()),
-          findNewId(sr.allUsersCommands(), getRefName()));
-    } else if (change != null && autoRebuild) {
-      NoteDbChangeState state = NoteDbChangeState.parse(change);
-      // Only check if this particular user's drafts are up to date, to avoid
-      // reading unnecessary refs.
-      if (!NoteDbChangeState.areDraftsUpToDate(
-          state, new RepoRefCache(repo), getChangeId(), author)) {
-        return rebuildAndOpen(repo);
-      }
-    }
-    return super.openHandle(repo);
-  }
-
-  private static ObjectId findNewId(Iterable<ReceiveCommand> cmds, String refName) {
-    for (ReceiveCommand cmd : cmds) {
-      if (cmd.getRefName().equals(refName)) {
-        return cmd.getNewId();
-      }
-    }
-    return null;
-  }
-
-  private LoadHandle rebuildAndOpen(Repository repo) throws NoSuchChangeException, IOException {
-    Timer1.Context timer = args.metrics.autoRebuildLatency.start(CHANGES);
-    try {
-      Change.Id cid = getChangeId();
-      ReviewDb db = args.db.get();
-      ChangeRebuilder rebuilder = args.rebuilder.get();
-      NoteDbUpdateManager.Result r;
-      try (NoteDbUpdateManager manager = rebuilder.stage(db, cid)) {
-        if (manager == null) {
-          return super.openHandle(repo); // May be null in tests.
-        }
-        r = manager.stageAndApplyDelta(change);
-        try {
-          rebuilder.execute(db, cid, manager);
-          repo.scanForRepoChanges();
-        } catch (OrmException | IOException e) {
-          // See ChangeNotes#rebuildAndOpen.
-          log.debug("Rebuilding change {} via drafts failed: {}", getChangeId(), e.getMessage());
-          args.metrics.autoRebuildFailureCount.increment(CHANGES);
-          checkNotNull(r.staged());
-          return LoadHandle.create(
-              ChangeNotesCommit.newStagedRevWalk(repo, r.staged().allUsersObjects()), draftsId(r));
-        }
-      }
-      return LoadHandle.create(ChangeNotesCommit.newRevWalk(repo), draftsId(r));
-    } catch (NoSuchChangeException e) {
-      return super.openHandle(repo);
-    } catch (OrmException e) {
-      throw new IOException(e);
-    } finally {
-      log.debug(
-          "Rebuilt change {} in {} in {} ms via drafts",
-          getChangeId(),
-          change != null ? "project " + change.getProject() : "unknown project",
-          TimeUnit.MILLISECONDS.convert(timer.stop(), TimeUnit.NANOSECONDS));
-    }
-  }
-
-  private ObjectId draftsId(NoteDbUpdateManager.Result r) {
-    checkNotNull(r);
-    checkNotNull(r.newState());
-    return r.newState().getDraftIds().get(author);
-  }
-
-  @VisibleForTesting
-  NoteMap getNoteMap() {
-    return revisionNoteMap != null ? revisionNoteMap.noteMap : null;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbChangeState.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbChangeState.java
deleted file mode 100644
index 12967b8..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbChangeState.java
+++ /dev/null
@@ -1,471 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.notedb;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.gerrit.reviewdb.client.RefNames.changeMetaRef;
-import static com.google.gerrit.reviewdb.client.RefNames.refsDraftComments;
-import static com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage.NOTE_DB;
-import static com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage.REVIEW_DB;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Splitter;
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Maps;
-import com.google.common.primitives.Longs;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.server.ReviewDbUtil;
-import com.google.gerrit.server.git.RefCache;
-import com.google.gwtorm.server.OrmRuntimeException;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.concurrent.TimeUnit;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-
-/**
- * The state of all relevant NoteDb refs across all repos corresponding to a given Change entity.
- *
- * <p>Stored serialized in the {@code Change#noteDbState} field, and used to determine whether the
- * state in NoteDb is out of date.
- *
- * <p>Serialized in one of the forms:
- *
- * <ul>
- *   <li>[meta-sha],[account1]=[drafts-sha],[account2]=[drafts-sha]...
- *   <li>R,[meta-sha],[account1]=[drafts-sha],[account2]=[drafts-sha]...
- *   <li>R=[read-only-until],[meta-sha],[account1]=[drafts-sha],[account2]=[drafts-sha]...
- *   <li>N
- *   <li>N=[read-only-until]
- * </ul>
- *
- * in numeric account ID order, with hex SHA-1s for human readability.
- */
-public class NoteDbChangeState {
-  public static final String NOTE_DB_PRIMARY_STATE = "N";
-
-  public enum PrimaryStorage {
-    REVIEW_DB('R'),
-    NOTE_DB('N');
-
-    private final char code;
-
-    PrimaryStorage(char code) {
-      this.code = code;
-    }
-
-    public static PrimaryStorage of(@Nullable Change c) {
-      return of(NoteDbChangeState.parse(c));
-    }
-
-    public static PrimaryStorage of(@Nullable NoteDbChangeState s) {
-      return s != null ? s.getPrimaryStorage() : REVIEW_DB;
-    }
-  }
-
-  @AutoValue
-  public abstract static class Delta {
-    @VisibleForTesting
-    public static Delta create(
-        Change.Id changeId,
-        Optional<ObjectId> newChangeMetaId,
-        Map<Account.Id, ObjectId> newDraftIds) {
-      if (newDraftIds == null) {
-        newDraftIds = ImmutableMap.of();
-      }
-      return new AutoValue_NoteDbChangeState_Delta(
-          changeId, newChangeMetaId, ImmutableMap.copyOf(newDraftIds));
-    }
-
-    abstract Change.Id changeId();
-
-    abstract Optional<ObjectId> newChangeMetaId();
-
-    abstract ImmutableMap<Account.Id, ObjectId> newDraftIds();
-  }
-
-  @AutoValue
-  public abstract static class RefState {
-    @VisibleForTesting
-    public static RefState create(ObjectId changeMetaId, Map<Account.Id, ObjectId> draftIds) {
-      return new AutoValue_NoteDbChangeState_RefState(
-          changeMetaId.copy(),
-          ImmutableMap.copyOf(Maps.filterValues(draftIds, id -> !ObjectId.zeroId().equals(id))));
-    }
-
-    private static Optional<RefState> parse(Change.Id changeId, List<String> parts) {
-      checkArgument(!parts.isEmpty(), "missing state string for change %s", changeId);
-      ObjectId changeMetaId = ObjectId.fromString(parts.get(0));
-      Map<Account.Id, ObjectId> draftIds = Maps.newHashMapWithExpectedSize(parts.size() - 1);
-      Splitter s = Splitter.on('=');
-      for (int i = 1; i < parts.size(); i++) {
-        String p = parts.get(i);
-        List<String> draftParts = s.splitToList(p);
-        checkArgument(
-            draftParts.size() == 2, "invalid draft state part for change %s: %s", changeId, p);
-        draftIds.put(Account.Id.parse(draftParts.get(0)), ObjectId.fromString(draftParts.get(1)));
-      }
-      return Optional.of(create(changeMetaId, draftIds));
-    }
-
-    abstract ObjectId changeMetaId();
-
-    abstract ImmutableMap<Account.Id, ObjectId> draftIds();
-
-    @Override
-    public String toString() {
-      return appendTo(new StringBuilder()).toString();
-    }
-
-    StringBuilder appendTo(StringBuilder sb) {
-      sb.append(changeMetaId().name());
-      for (Account.Id id : ReviewDbUtil.intKeyOrdering().sortedCopy(draftIds().keySet())) {
-        sb.append(',').append(id.get()).append('=').append(draftIds().get(id).name());
-      }
-      return sb;
-    }
-  }
-
-  public static NoteDbChangeState parse(@Nullable Change c) {
-    return c != null ? parse(c.getId(), c.getNoteDbState()) : null;
-  }
-
-  @VisibleForTesting
-  public static NoteDbChangeState parse(Change.Id id, @Nullable String str) {
-    if (Strings.isNullOrEmpty(str)) {
-      // Return null rather than Optional as this is what goes in the field in
-      // ReviewDb.
-      return null;
-    }
-    List<String> parts = Splitter.on(',').splitToList(str);
-    String first = parts.get(0);
-    Optional<Timestamp> readOnlyUntil = parseReadOnlyUntil(id, str, first);
-
-    // Only valid NOTE_DB state is "N".
-    if (parts.size() == 1 && first.charAt(0) == NOTE_DB.code) {
-      return new NoteDbChangeState(id, NOTE_DB, Optional.empty(), readOnlyUntil);
-    }
-
-    // Otherwise it must be REVIEW_DB, either "R,<RefState>" or just
-    // "<RefState>". Allow length > 0 for forward compatibility.
-    if (first.length() > 0) {
-      Optional<RefState> refState;
-      if (first.charAt(0) == REVIEW_DB.code) {
-        refState = RefState.parse(id, parts.subList(1, parts.size()));
-      } else {
-        refState = RefState.parse(id, parts);
-      }
-      return new NoteDbChangeState(id, REVIEW_DB, refState, readOnlyUntil);
-    }
-    throw invalidState(id, str);
-  }
-
-  private static Optional<Timestamp> parseReadOnlyUntil(
-      Change.Id id, String fullStr, String first) {
-    if (first.length() > 2 && first.charAt(1) == '=') {
-      Long ts = Longs.tryParse(first.substring(2));
-      if (ts == null) {
-        throw invalidState(id, fullStr);
-      }
-      return Optional.of(new Timestamp(ts));
-    }
-    return Optional.empty();
-  }
-
-  private static IllegalArgumentException invalidState(Change.Id id, String str) {
-    return new IllegalArgumentException("invalid state string for change " + id + ": " + str);
-  }
-
-  /**
-   * Apply a delta to the state stored in a change entity.
-   *
-   * <p>This method does not check whether the old state was read-only; it is up to the caller to
-   * not violate read-only semantics when storing the change back in ReviewDb.
-   *
-   * @param change change entity. The delta is applied against this entity's {@code noteDbState} and
-   *     the new state is stored back in the entity as a side effect.
-   * @param delta delta to apply.
-   * @return new state, equivalent to what is stored in {@code change} as a side effect.
-   */
-  public static NoteDbChangeState applyDelta(Change change, Delta delta) {
-    if (delta == null) {
-      return null;
-    }
-    String oldStr = change.getNoteDbState();
-    if (oldStr == null && !delta.newChangeMetaId().isPresent()) {
-      // Neither an old nor a new meta ID was present, most likely because we
-      // aren't writing a NoteDb graph at all for this change at this point. No
-      // point in proceeding.
-      return null;
-    }
-    NoteDbChangeState oldState = parse(change.getId(), oldStr);
-    if (oldState != null && oldState.getPrimaryStorage() == NOTE_DB) {
-      // NOTE_DB state doesn't include RefState, so applying a delta is a no-op.
-      return oldState;
-    }
-
-    ObjectId changeMetaId;
-    if (delta.newChangeMetaId().isPresent()) {
-      changeMetaId = delta.newChangeMetaId().get();
-      if (changeMetaId.equals(ObjectId.zeroId())) {
-        change.setNoteDbState(null);
-        return null;
-      }
-    } else {
-      changeMetaId = oldState.getChangeMetaId();
-    }
-
-    Map<Account.Id, ObjectId> draftIds = new HashMap<>();
-    if (oldState != null) {
-      draftIds.putAll(oldState.getDraftIds());
-    }
-    for (Map.Entry<Account.Id, ObjectId> e : delta.newDraftIds().entrySet()) {
-      if (e.getValue().equals(ObjectId.zeroId())) {
-        draftIds.remove(e.getKey());
-      } else {
-        draftIds.put(e.getKey(), e.getValue());
-      }
-    }
-
-    NoteDbChangeState state =
-        new NoteDbChangeState(
-            change.getId(),
-            oldState != null ? oldState.getPrimaryStorage() : REVIEW_DB,
-            Optional.of(RefState.create(changeMetaId, draftIds)),
-            // Copy old read-only deadline rather than advancing it; the caller is
-            // still responsible for finishing the rest of its work before the lease
-            // runs out.
-            oldState != null ? oldState.getReadOnlyUntil() : Optional.empty());
-    change.setNoteDbState(state.toString());
-    return state;
-  }
-
-  // TODO(dborowitz): Ugly. Refactor these static methods into a Checker class
-  // or something. They do not belong in NoteDbChangeState itself because:
-  //  - need to inject Config but don't want a whole Factory
-  //  - can't be methods on NoteDbChangeState because state is nullable (though
-  //    we could also solve this by inventing an empty-but-non-null state)
-  // Also we should clean up duplicated code between static/non-static methods.
-  public static boolean isChangeUpToDate(
-      @Nullable NoteDbChangeState state, RefCache changeRepoRefs, Change.Id changeId)
-      throws IOException {
-    if (PrimaryStorage.of(state) == NOTE_DB) {
-      return true; // Primary storage is NoteDb, up to date by definition.
-    }
-    if (state == null) {
-      return !changeRepoRefs.get(changeMetaRef(changeId)).isPresent();
-    }
-    return state.isChangeUpToDate(changeRepoRefs);
-  }
-
-  public static boolean areDraftsUpToDate(
-      @Nullable NoteDbChangeState state,
-      RefCache draftsRepoRefs,
-      Change.Id changeId,
-      Account.Id accountId)
-      throws IOException {
-    if (PrimaryStorage.of(state) == NOTE_DB) {
-      return true; // Primary storage is NoteDb, up to date by definition.
-    }
-    if (state == null) {
-      return !draftsRepoRefs.get(refsDraftComments(changeId, accountId)).isPresent();
-    }
-    return state.areDraftsUpToDate(draftsRepoRefs, accountId);
-  }
-
-  public static long getReadOnlySkew(Config cfg) {
-    return cfg.getTimeUnit("notedb", null, "maxTimestampSkew", 1000, TimeUnit.MILLISECONDS);
-  }
-
-  static Timestamp timeForReadOnlyCheck(long skewMs) {
-    // Subtract some slop in case the machine that set the change's read-only
-    // lease has a clock behind ours.
-    return new Timestamp(TimeUtil.nowMs() - skewMs);
-  }
-
-  public static void checkNotReadOnly(@Nullable Change change, long skewMs) {
-    checkNotReadOnly(parse(change), skewMs);
-  }
-
-  public static void checkNotReadOnly(@Nullable NoteDbChangeState state, long skewMs) {
-    if (state == null) {
-      return; // No state means ReviewDb primary non-read-only.
-    } else if (state.isReadOnly(timeForReadOnlyCheck(skewMs))) {
-      throw new OrmRuntimeException(
-          "change "
-              + state.getChangeId()
-              + " is read-only until "
-              + state.getReadOnlyUntil().get());
-    }
-  }
-
-  private final Change.Id changeId;
-  private final PrimaryStorage primaryStorage;
-  private final Optional<RefState> refState;
-  private final Optional<Timestamp> readOnlyUntil;
-
-  public NoteDbChangeState(
-      Change.Id changeId,
-      PrimaryStorage primaryStorage,
-      Optional<RefState> refState,
-      Optional<Timestamp> readOnlyUntil) {
-    this.changeId = checkNotNull(changeId);
-    this.primaryStorage = checkNotNull(primaryStorage);
-    this.refState = checkNotNull(refState);
-    this.readOnlyUntil = checkNotNull(readOnlyUntil);
-
-    switch (primaryStorage) {
-      case REVIEW_DB:
-        checkArgument(
-            refState.isPresent(),
-            "expected RefState for change %s with primary storage %s",
-            changeId,
-            primaryStorage);
-        break;
-      case NOTE_DB:
-        checkArgument(
-            !refState.isPresent(),
-            "expected no RefState for change %s with primary storage %s",
-            changeId,
-            primaryStorage);
-        break;
-      default:
-        throw new IllegalStateException("invalid PrimaryStorage: " + primaryStorage);
-    }
-  }
-
-  public PrimaryStorage getPrimaryStorage() {
-    return primaryStorage;
-  }
-
-  public boolean isChangeUpToDate(RefCache changeRepoRefs) throws IOException {
-    if (primaryStorage == NOTE_DB) {
-      return true; // Primary storage is NoteDb, up to date by definition.
-    }
-    Optional<ObjectId> id = changeRepoRefs.get(changeMetaRef(changeId));
-    if (!id.isPresent()) {
-      return getChangeMetaId().equals(ObjectId.zeroId());
-    }
-    return id.get().equals(getChangeMetaId());
-  }
-
-  public boolean areDraftsUpToDate(RefCache draftsRepoRefs, Account.Id accountId)
-      throws IOException {
-    if (primaryStorage == NOTE_DB) {
-      return true; // Primary storage is NoteDb, up to date by definition.
-    }
-    Optional<ObjectId> id = draftsRepoRefs.get(refsDraftComments(changeId, accountId));
-    if (!id.isPresent()) {
-      return !getDraftIds().containsKey(accountId);
-    }
-    return id.get().equals(getDraftIds().get(accountId));
-  }
-
-  public boolean isUpToDate(RefCache changeRepoRefs, RefCache draftsRepoRefs) throws IOException {
-    if (primaryStorage == NOTE_DB) {
-      return true; // Primary storage is NoteDb, up to date by definition.
-    }
-    if (!isChangeUpToDate(changeRepoRefs)) {
-      return false;
-    }
-    for (Account.Id accountId : getDraftIds().keySet()) {
-      if (!areDraftsUpToDate(draftsRepoRefs, accountId)) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  public boolean isReadOnly(Timestamp now) {
-    return readOnlyUntil.isPresent() && now.before(readOnlyUntil.get());
-  }
-
-  public Optional<Timestamp> getReadOnlyUntil() {
-    return readOnlyUntil;
-  }
-
-  public NoteDbChangeState withReadOnlyUntil(Timestamp ts) {
-    return new NoteDbChangeState(changeId, primaryStorage, refState, Optional.of(ts));
-  }
-
-  public Change.Id getChangeId() {
-    return changeId;
-  }
-
-  public ObjectId getChangeMetaId() {
-    return refState().changeMetaId();
-  }
-
-  public ImmutableMap<Account.Id, ObjectId> getDraftIds() {
-    return refState().draftIds();
-  }
-
-  public Optional<RefState> getRefState() {
-    return refState;
-  }
-
-  private RefState refState() {
-    checkState(refState.isPresent(), "state for %s has no RefState: %s", changeId, this);
-    return refState.get();
-  }
-
-  @Override
-  public String toString() {
-    switch (primaryStorage) {
-      case REVIEW_DB:
-        if (!readOnlyUntil.isPresent()) {
-          // Don't include enum field, just IDs (though parse would accept it).
-          return refState().toString();
-        }
-        return primaryStorage.code + "=" + readOnlyUntil.get().getTime() + "," + refState.get();
-      case NOTE_DB:
-        if (!readOnlyUntil.isPresent()) {
-          return NOTE_DB_PRIMARY_STATE;
-        }
-        return primaryStorage.code + "=" + readOnlyUntil.get().getTime();
-      default:
-        throw new IllegalArgumentException("Unsupported PrimaryStorage: " + primaryStorage);
-    }
-  }
-
-  @Override
-  public int hashCode() {
-    return Objects.hash(changeId, primaryStorage, refState, readOnlyUntil);
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (!(o instanceof NoteDbChangeState)) {
-      return false;
-    }
-    NoteDbChangeState s = (NoteDbChangeState) o;
-    return changeId.equals(s.changeId)
-        && primaryStorage.equals(s.primaryStorage)
-        && refState.equals(s.refState)
-        && readOnlyUntil.equals(s.readOnlyUntil);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbTable.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbTable.java
deleted file mode 100644
index be24e28..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbTable.java
+++ /dev/null
@@ -1,29 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.notedb;
-
-public enum NoteDbTable {
-  ACCOUNTS,
-  CHANGES;
-
-  public String key() {
-    return name().toLowerCase();
-  }
-
-  @Override
-  public String toString() {
-    return key();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbUpdateManager.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbUpdateManager.java
deleted file mode 100644
index cb72320..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbUpdateManager.java
+++ /dev/null
@@ -1,873 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.notedb;
-
-import static com.google.common.base.MoreObjects.firstNonNull;
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.gerrit.reviewdb.client.RefNames.REFS_DRAFT_COMMENTS;
-import static com.google.gerrit.server.notedb.NoteDbTable.CHANGES;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.collect.HashBasedTable;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.MultimapBuilder;
-import com.google.common.collect.Table;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.metrics.Timer1;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.InMemoryInserter;
-import com.google.gerrit.server.git.InsertedObject;
-import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
-import com.google.gerrit.server.update.ChainedReceiveCommands;
-import com.google.gerrit.server.update.RefUpdateUtil;
-import com.google.gerrit.server.update.RetryingRestModifyView;
-import com.google.gwtorm.server.OrmConcurrencyException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.BatchRefUpdate;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.PushCertificate;
-import org.eclipse.jgit.transport.ReceiveCommand;
-
-/**
- * Object to manage a single sequence of updates to NoteDb.
- *
- * <p>Instances are one-time-use. Handles updating both the change repo and the All-Users repo for
- * any affected changes, with proper ordering.
- *
- * <p>To see the state that would be applied prior to executing the full sequence of updates, use
- * {@link #stage()}.
- */
-public class NoteDbUpdateManager implements AutoCloseable {
-  public static final String CHANGES_READ_ONLY = "NoteDb changes are read-only";
-
-  private static final ImmutableList<String> PACKAGE_PREFIXES =
-      ImmutableList.of("com.google.gerrit.server.", "com.google.gerrit.");
-  private static final ImmutableSet<String> SERVLET_NAMES =
-      ImmutableSet.of(
-          "com.google.gerrit.httpd.restapi.RestApiServlet", RetryingRestModifyView.class.getName());
-
-  public interface Factory {
-    NoteDbUpdateManager create(Project.NameKey projectName);
-  }
-
-  @AutoValue
-  public abstract static class StagedResult {
-    private static StagedResult create(
-        Change.Id id, NoteDbChangeState.Delta delta, OpenRepo changeRepo, OpenRepo allUsersRepo) {
-      ImmutableList<ReceiveCommand> changeCommands = ImmutableList.of();
-      ImmutableList<InsertedObject> changeObjects = ImmutableList.of();
-      if (changeRepo != null) {
-        changeCommands = changeRepo.getCommandsSnapshot();
-        changeObjects = changeRepo.getInsertedObjects();
-      }
-      ImmutableList<ReceiveCommand> allUsersCommands = ImmutableList.of();
-      ImmutableList<InsertedObject> allUsersObjects = ImmutableList.of();
-      if (allUsersRepo != null) {
-        allUsersCommands = allUsersRepo.getCommandsSnapshot();
-        allUsersObjects = allUsersRepo.getInsertedObjects();
-      }
-      return new AutoValue_NoteDbUpdateManager_StagedResult(
-          id, delta,
-          changeCommands, changeObjects,
-          allUsersCommands, allUsersObjects);
-    }
-
-    public abstract Change.Id id();
-
-    @Nullable
-    public abstract NoteDbChangeState.Delta delta();
-
-    public abstract ImmutableList<ReceiveCommand> changeCommands();
-
-    /**
-     * Objects inserted into the change repo for this change.
-     *
-     * <p>Includes all objects inserted for any change in this repo that may have been processed by
-     * the corresponding {@link NoteDbUpdateManager} instance, not just those objects that were
-     * inserted to handle this specific change's updates.
-     *
-     * @return inserted objects, or null if the corresponding {@link NoteDbUpdateManager} was
-     *     configured not to {@link NoteDbUpdateManager#setSaveObjects(boolean) save objects}.
-     */
-    @Nullable
-    public abstract ImmutableList<InsertedObject> changeObjects();
-
-    public abstract ImmutableList<ReceiveCommand> allUsersCommands();
-
-    /**
-     * Objects inserted into the All-Users repo for this change.
-     *
-     * <p>Includes all objects inserted into All-Users for any change that may have been processed
-     * by the corresponding {@link NoteDbUpdateManager} instance, not just those objects that were
-     * inserted to handle this specific change's updates.
-     *
-     * @return inserted objects, or null if the corresponding {@link NoteDbUpdateManager} was
-     *     configured not to {@link NoteDbUpdateManager#setSaveObjects(boolean) save objects}.
-     */
-    @Nullable
-    public abstract ImmutableList<InsertedObject> allUsersObjects();
-  }
-
-  @AutoValue
-  public abstract static class Result {
-    static Result create(NoteDbUpdateManager.StagedResult staged, NoteDbChangeState newState) {
-      return new AutoValue_NoteDbUpdateManager_Result(newState, staged);
-    }
-
-    @Nullable
-    public abstract NoteDbChangeState newState();
-
-    @Nullable
-    abstract NoteDbUpdateManager.StagedResult staged();
-  }
-
-  public static class OpenRepo implements AutoCloseable {
-    public final Repository repo;
-    public final RevWalk rw;
-    public final ChainedReceiveCommands cmds;
-
-    private final InMemoryInserter inMemIns;
-    private final ObjectInserter tempIns;
-    @Nullable private final ObjectInserter finalIns;
-
-    private final boolean close;
-    private final boolean saveObjects;
-
-    private OpenRepo(
-        Repository repo,
-        RevWalk rw,
-        @Nullable ObjectInserter ins,
-        ChainedReceiveCommands cmds,
-        boolean close,
-        boolean saveObjects) {
-      ObjectReader reader = rw.getObjectReader();
-      checkArgument(
-          ins == null || reader.getCreatedFromInserter() == ins,
-          "expected reader to be created from %s, but was %s",
-          ins,
-          reader.getCreatedFromInserter());
-      this.repo = checkNotNull(repo);
-
-      if (saveObjects) {
-        this.inMemIns = new InMemoryInserter(rw.getObjectReader());
-        this.tempIns = inMemIns;
-      } else {
-        checkArgument(ins != null);
-        this.inMemIns = null;
-        this.tempIns = ins;
-      }
-
-      this.rw = new RevWalk(tempIns.newReader());
-      this.finalIns = ins;
-      this.cmds = checkNotNull(cmds);
-      this.close = close;
-      this.saveObjects = saveObjects;
-    }
-
-    public Optional<ObjectId> getObjectId(String refName) throws IOException {
-      return cmds.get(refName);
-    }
-
-    ImmutableList<ReceiveCommand> getCommandsSnapshot() {
-      return ImmutableList.copyOf(cmds.getCommands().values());
-    }
-
-    @Nullable
-    ImmutableList<InsertedObject> getInsertedObjects() {
-      return saveObjects ? inMemIns.getInsertedObjects() : null;
-    }
-
-    void flush() throws IOException {
-      flushToFinalInserter();
-      finalIns.flush();
-    }
-
-    void flushToFinalInserter() throws IOException {
-      if (!saveObjects) {
-        return;
-      }
-      checkState(finalIns != null);
-      for (InsertedObject obj : inMemIns.getInsertedObjects()) {
-        finalIns.insert(obj.type(), obj.data().toByteArray());
-      }
-      inMemIns.clear();
-    }
-
-    @Override
-    public void close() {
-      rw.getObjectReader().close();
-      rw.close();
-      if (close) {
-        if (finalIns != null) {
-          finalIns.close();
-        }
-        repo.close();
-      }
-    }
-  }
-
-  private final Provider<PersonIdent> serverIdent;
-  private final GitRepositoryManager repoManager;
-  private final NotesMigration migration;
-  private final AllUsersName allUsersName;
-  private final NoteDbMetrics metrics;
-  private final Project.NameKey projectName;
-  private final ListMultimap<String, ChangeUpdate> changeUpdates;
-  private final ListMultimap<String, ChangeDraftUpdate> draftUpdates;
-  private final ListMultimap<String, RobotCommentUpdate> robotCommentUpdates;
-  private final ListMultimap<String, NoteDbRewriter> rewriters;
-  private final Set<Change.Id> toDelete;
-
-  private OpenRepo changeRepo;
-  private OpenRepo allUsersRepo;
-  private Map<Change.Id, StagedResult> staged;
-  private boolean checkExpectedState = true;
-  private boolean saveObjects = true;
-  private boolean atomicRefUpdates = true;
-  private String refLogMessage;
-  private PersonIdent refLogIdent;
-  private PushCertificate pushCert;
-
-  @Inject
-  NoteDbUpdateManager(
-      @GerritPersonIdent Provider<PersonIdent> serverIdent,
-      GitRepositoryManager repoManager,
-      NotesMigration migration,
-      AllUsersName allUsersName,
-      NoteDbMetrics metrics,
-      @Assisted Project.NameKey projectName) {
-    this.serverIdent = serverIdent;
-    this.repoManager = repoManager;
-    this.migration = migration;
-    this.allUsersName = allUsersName;
-    this.metrics = metrics;
-    this.projectName = projectName;
-    changeUpdates = MultimapBuilder.hashKeys().arrayListValues().build();
-    draftUpdates = MultimapBuilder.hashKeys().arrayListValues().build();
-    robotCommentUpdates = MultimapBuilder.hashKeys().arrayListValues().build();
-    rewriters = MultimapBuilder.hashKeys().arrayListValues().build();
-    toDelete = new HashSet<>();
-  }
-
-  @Override
-  public void close() {
-    try {
-      if (allUsersRepo != null) {
-        OpenRepo r = allUsersRepo;
-        allUsersRepo = null;
-        r.close();
-      }
-    } finally {
-      if (changeRepo != null) {
-        OpenRepo r = changeRepo;
-        changeRepo = null;
-        r.close();
-      }
-    }
-  }
-
-  public NoteDbUpdateManager setChangeRepo(
-      Repository repo, RevWalk rw, @Nullable ObjectInserter ins, ChainedReceiveCommands cmds) {
-    checkState(changeRepo == null, "change repo already initialized");
-    changeRepo = new OpenRepo(repo, rw, ins, cmds, false, saveObjects);
-    return this;
-  }
-
-  public NoteDbUpdateManager setAllUsersRepo(
-      Repository repo, RevWalk rw, @Nullable ObjectInserter ins, ChainedReceiveCommands cmds) {
-    checkState(allUsersRepo == null, "All-Users repo already initialized");
-    allUsersRepo = new OpenRepo(repo, rw, ins, cmds, false, saveObjects);
-    return this;
-  }
-
-  public NoteDbUpdateManager setCheckExpectedState(boolean checkExpectedState) {
-    this.checkExpectedState = checkExpectedState;
-    return this;
-  }
-
-  /**
-   * Set whether to save objects and make them available in {@link StagedResult}s.
-   *
-   * <p>If set, all objects inserted into all repos managed by this instance will be buffered in
-   * memory, and the {@link StagedResult}s will return non-null lists from {@link
-   * StagedResult#changeObjects()} and {@link StagedResult#allUsersObjects()}.
-   *
-   * <p>Not recommended if modifying a large number of changes with a single manager.
-   *
-   * @param saveObjects whether to save objects; defaults to true.
-   * @return this
-   */
-  public NoteDbUpdateManager setSaveObjects(boolean saveObjects) {
-    this.saveObjects = saveObjects;
-    return this;
-  }
-
-  /**
-   * Set whether to use atomic ref updates.
-   *
-   * <p>Can be set to false when the change updates represented by this manager aren't logically
-   * related, e.g. when the updater is only used to group objects together with a single inserter.
-   *
-   * @param atomicRefUpdates whether to use atomic ref updates; defaults to true.
-   * @return this
-   */
-  public NoteDbUpdateManager setAtomicRefUpdates(boolean atomicRefUpdates) {
-    this.atomicRefUpdates = atomicRefUpdates;
-    return this;
-  }
-
-  public NoteDbUpdateManager setRefLogMessage(String message) {
-    this.refLogMessage = message;
-    return this;
-  }
-
-  public NoteDbUpdateManager setRefLogIdent(PersonIdent ident) {
-    this.refLogIdent = ident;
-    return this;
-  }
-
-  /**
-   * Set a push certificate for the push that originally triggered this NoteDb update.
-   *
-   * <p>The pusher will not necessarily have specified any of the NoteDb refs explicitly, such as
-   * when processing a push to {@code refs/for/master}. That's fine; this is just passed to the
-   * underlying {@link BatchRefUpdate}, and the implementation decides what to do with it.
-   *
-   * <p>The cert should be associated with the main repo. There is currently no way of associating a
-   * push cert with the {@code All-Users} repo, since it is not currently possible to update draft
-   * changes via push.
-   *
-   * @param pushCert push certificate; may be null.
-   * @return this
-   */
-  public NoteDbUpdateManager setPushCertificate(PushCertificate pushCert) {
-    this.pushCert = pushCert;
-    return this;
-  }
-
-  public OpenRepo getChangeRepo() throws IOException {
-    initChangeRepo();
-    return changeRepo;
-  }
-
-  public OpenRepo getAllUsersRepo() throws IOException {
-    initAllUsersRepo();
-    return allUsersRepo;
-  }
-
-  private void initChangeRepo() throws IOException {
-    if (changeRepo == null) {
-      changeRepo = openRepo(projectName);
-    }
-  }
-
-  private void initAllUsersRepo() throws IOException {
-    if (allUsersRepo == null) {
-      allUsersRepo = openRepo(allUsersName);
-    }
-  }
-
-  private OpenRepo openRepo(Project.NameKey p) throws IOException {
-    Repository repo = repoManager.openRepository(p); // Closed by OpenRepo#close.
-    ObjectInserter ins = repo.newObjectInserter(); // Closed by OpenRepo#close.
-    ObjectReader reader = ins.newReader(); // Not closed by OpenRepo#close.
-    try (RevWalk rw = new RevWalk(reader)) { // Doesn't escape OpenRepo constructor.
-      return new OpenRepo(repo, rw, ins, new ChainedReceiveCommands(repo), true, saveObjects) {
-        @Override
-        public void close() {
-          reader.close();
-          super.close();
-        }
-      };
-    }
-  }
-
-  private boolean isEmpty() {
-    if (!migration.commitChangeWrites()) {
-      return true;
-    }
-    return changeUpdates.isEmpty()
-        && draftUpdates.isEmpty()
-        && robotCommentUpdates.isEmpty()
-        && rewriters.isEmpty()
-        && toDelete.isEmpty()
-        && !hasCommands(changeRepo)
-        && !hasCommands(allUsersRepo);
-  }
-
-  private static boolean hasCommands(@Nullable OpenRepo or) {
-    return or != null && !or.cmds.isEmpty();
-  }
-
-  /**
-   * Add an update to the list of updates to execute.
-   *
-   * <p>Updates should only be added to the manager after all mutations have been made, as this
-   * method may eagerly access the update.
-   *
-   * @param update the update to add.
-   */
-  public void add(ChangeUpdate update) {
-    checkArgument(
-        update.getProjectName().equals(projectName),
-        "update for project %s cannot be added to manager for project %s",
-        update.getProjectName(),
-        projectName);
-    checkState(staged == null, "cannot add new update after staging");
-    changeUpdates.put(update.getRefName(), update);
-    ChangeDraftUpdate du = update.getDraftUpdate();
-    if (du != null) {
-      draftUpdates.put(du.getRefName(), du);
-    }
-    RobotCommentUpdate rcu = update.getRobotCommentUpdate();
-    if (rcu != null) {
-      robotCommentUpdates.put(rcu.getRefName(), rcu);
-    }
-    DeleteCommentRewriter deleteCommentRewriter = update.getDeleteCommentRewriter();
-    if (deleteCommentRewriter != null) {
-      rewriters.put(deleteCommentRewriter.getRefName(), deleteCommentRewriter);
-    }
-  }
-
-  public void add(ChangeDraftUpdate draftUpdate) {
-    checkState(staged == null, "cannot add new update after staging");
-    draftUpdates.put(draftUpdate.getRefName(), draftUpdate);
-  }
-
-  public void deleteChange(Change.Id id) {
-    checkState(staged == null, "cannot add new change to delete after staging");
-    toDelete.add(id);
-  }
-
-  /**
-   * Stage updates in the manager's internal list of commands.
-   *
-   * @return map of the state that would get written to the applicable repo(s) for each affected
-   *     change.
-   * @throws OrmException if a database layer error occurs.
-   * @throws IOException if a storage layer error occurs.
-   */
-  public Map<Change.Id, StagedResult> stage() throws OrmException, IOException {
-    if (staged != null) {
-      return staged;
-    }
-    try (Timer1.Context timer = metrics.stageUpdateLatency.start(CHANGES)) {
-      staged = new HashMap<>();
-      if (isEmpty()) {
-        return staged;
-      }
-
-      initChangeRepo();
-      if (!draftUpdates.isEmpty() || !toDelete.isEmpty()) {
-        initAllUsersRepo();
-      }
-      checkExpectedState();
-      addCommands();
-
-      Table<Change.Id, Account.Id, ObjectId> allDraftIds = getDraftIds();
-      Set<Change.Id> changeIds = new HashSet<>();
-      for (ReceiveCommand cmd : changeRepo.getCommandsSnapshot()) {
-        Change.Id changeId = Change.Id.fromRef(cmd.getRefName());
-        if (changeId == null || !cmd.getRefName().equals(RefNames.changeMetaRef(changeId))) {
-          // Not a meta ref update, likely due to a repo update along with the change meta update.
-          continue;
-        }
-        changeIds.add(changeId);
-        Optional<ObjectId> metaId = Optional.of(cmd.getNewId());
-        staged.put(
-            changeId,
-            StagedResult.create(
-                changeId,
-                NoteDbChangeState.Delta.create(
-                    changeId, metaId, allDraftIds.rowMap().remove(changeId)),
-                changeRepo,
-                allUsersRepo));
-      }
-
-      for (Map.Entry<Change.Id, Map<Account.Id, ObjectId>> e : allDraftIds.rowMap().entrySet()) {
-        // If a change remains in the table at this point, it means we are
-        // updating its drafts but not the change itself.
-        StagedResult r =
-            StagedResult.create(
-                e.getKey(),
-                NoteDbChangeState.Delta.create(e.getKey(), Optional.empty(), e.getValue()),
-                changeRepo,
-                allUsersRepo);
-        checkState(
-            r.changeCommands().isEmpty(),
-            "should not have change commands when updating only drafts: %s",
-            r);
-        staged.put(r.id(), r);
-      }
-
-      return staged;
-    }
-  }
-
-  public Result stageAndApplyDelta(Change change) throws OrmException, IOException {
-    StagedResult sr = stage().get(change.getId());
-    NoteDbChangeState newState =
-        NoteDbChangeState.applyDelta(change, sr != null ? sr.delta() : null);
-    return Result.create(sr, newState);
-  }
-
-  private Table<Change.Id, Account.Id, ObjectId> getDraftIds() {
-    Table<Change.Id, Account.Id, ObjectId> draftIds = HashBasedTable.create();
-    if (allUsersRepo == null) {
-      return draftIds;
-    }
-    for (ReceiveCommand cmd : allUsersRepo.getCommandsSnapshot()) {
-      String r = cmd.getRefName();
-      if (r.startsWith(REFS_DRAFT_COMMENTS)) {
-        Change.Id changeId = Change.Id.fromRefPart(r.substring(REFS_DRAFT_COMMENTS.length()));
-        Account.Id accountId = Account.Id.fromRefSuffix(r);
-        checkDraftRef(accountId != null && changeId != null, r);
-        draftIds.put(changeId, accountId, cmd.getNewId());
-      }
-    }
-    return draftIds;
-  }
-
-  public void flush() throws IOException {
-    if (changeRepo != null) {
-      changeRepo.flush();
-    }
-    if (allUsersRepo != null) {
-      allUsersRepo.flush();
-    }
-  }
-
-  @Nullable
-  public BatchRefUpdate execute() throws OrmException, IOException {
-    return execute(false);
-  }
-
-  @Nullable
-  public BatchRefUpdate execute(boolean dryrun) throws OrmException, IOException {
-    // Check before even inspecting the list, as this is a programmer error.
-    if (migration.failChangeWrites()) {
-      throw new OrmException(CHANGES_READ_ONLY);
-    }
-    if (isEmpty()) {
-      return null;
-    }
-    try (Timer1.Context timer = metrics.updateLatency.start(CHANGES)) {
-      stage();
-      // ChangeUpdates must execute before ChangeDraftUpdates.
-      //
-      // ChangeUpdate will automatically delete draft comments for any published
-      // comments, but the updates to the two repos don't happen atomically.
-      // Thus if the change meta update succeeds and the All-Users update fails,
-      // we may have stale draft comments. Doing it in this order allows stale
-      // comments to be filtered out by ChangeNotes, reflecting the fact that
-      // comments can only go from DRAFT to PUBLISHED, not vice versa.
-      BatchRefUpdate result = execute(changeRepo, dryrun, pushCert);
-      execute(allUsersRepo, dryrun, null);
-      return result;
-    } finally {
-      close();
-    }
-  }
-
-  private BatchRefUpdate execute(OpenRepo or, boolean dryrun, @Nullable PushCertificate pushCert)
-      throws IOException {
-    if (or == null || or.cmds.isEmpty()) {
-      return null;
-    }
-    if (!dryrun) {
-      or.flush();
-    } else {
-      // OpenRepo buffers objects separately; caller may assume that objects are available in the
-      // inserter it previously passed via setChangeRepo.
-      or.flushToFinalInserter();
-    }
-
-    BatchRefUpdate bru = or.repo.getRefDatabase().newBatchUpdate();
-    bru.setPushCertificate(pushCert);
-    if (refLogMessage != null) {
-      bru.setRefLogMessage(refLogMessage, false);
-    } else {
-      bru.setRefLogMessage(firstNonNull(guessRestApiHandler(), "Update NoteDb refs"), false);
-    }
-    bru.setRefLogIdent(refLogIdent != null ? refLogIdent : serverIdent.get());
-    bru.setAtomic(atomicRefUpdates);
-    or.cmds.addTo(bru);
-    bru.setAllowNonFastForwards(true);
-
-    if (!dryrun) {
-      RefUpdateUtil.executeChecked(bru, or.rw);
-    }
-    return bru;
-  }
-
-  private static String guessRestApiHandler() {
-    StackTraceElement[] trace = Thread.currentThread().getStackTrace();
-    int i = findRestApiServlet(trace);
-    if (i < 0) {
-      return null;
-    }
-    try {
-      for (i--; i >= 0; i--) {
-        String cn = trace[i].getClassName();
-        Class<?> cls = Class.forName(cn);
-        if (RestModifyView.class.isAssignableFrom(cls) && cls != RetryingRestModifyView.class) {
-          return viewName(cn);
-        }
-      }
-      return null;
-    } catch (ClassNotFoundException e) {
-      return null;
-    }
-  }
-
-  private static String viewName(String cn) {
-    String impl = cn.replace('$', '.');
-    for (String p : PACKAGE_PREFIXES) {
-      if (impl.startsWith(p)) {
-        return impl.substring(p.length());
-      }
-    }
-    return impl;
-  }
-
-  private static int findRestApiServlet(StackTraceElement[] trace) {
-    for (int i = 0; i < trace.length; i++) {
-      if (SERVLET_NAMES.contains(trace[i].getClassName())) {
-        return i;
-      }
-    }
-    return -1;
-  }
-
-  private void addCommands() throws OrmException, IOException {
-    if (isEmpty()) {
-      return;
-    }
-    checkState(changeRepo != null, "must set change repo");
-    if (!draftUpdates.isEmpty()) {
-      checkState(allUsersRepo != null, "must set all users repo");
-    }
-    addUpdates(changeUpdates, changeRepo);
-    if (!draftUpdates.isEmpty()) {
-      addUpdates(draftUpdates, allUsersRepo);
-    }
-    if (!robotCommentUpdates.isEmpty()) {
-      addUpdates(robotCommentUpdates, changeRepo);
-    }
-    if (!rewriters.isEmpty()) {
-      Optional<String> conflictKey =
-          rewriters.keySet().stream()
-              .filter(k -> (draftUpdates.containsKey(k) || robotCommentUpdates.containsKey(k)))
-              .findAny();
-      if (conflictKey.isPresent()) {
-        throw new IllegalArgumentException(
-            String.format(
-                "cannot update and rewrite ref %s in one BatchUpdate", conflictKey.get()));
-      }
-      addRewrites(rewriters, changeRepo);
-    }
-
-    for (Change.Id id : toDelete) {
-      doDelete(id);
-    }
-    checkExpectedState();
-  }
-
-  private void doDelete(Change.Id id) throws IOException {
-    String metaRef = RefNames.changeMetaRef(id);
-    Optional<ObjectId> old = changeRepo.cmds.get(metaRef);
-    if (old.isPresent()) {
-      changeRepo.cmds.add(new ReceiveCommand(old.get(), ObjectId.zeroId(), metaRef));
-    }
-
-    // Just scan repo for ref names, but get "old" values from cmds.
-    for (Ref r :
-        allUsersRepo.repo.getRefDatabase().getRefs(RefNames.refsDraftCommentsPrefix(id)).values()) {
-      old = allUsersRepo.cmds.get(r.getName());
-      if (old.isPresent()) {
-        allUsersRepo.cmds.add(new ReceiveCommand(old.get(), ObjectId.zeroId(), r.getName()));
-      }
-    }
-  }
-
-  public static class MismatchedStateException extends OrmException {
-    private static final long serialVersionUID = 1L;
-
-    private MismatchedStateException(Change.Id id, NoteDbChangeState expectedState) {
-      super(
-          String.format(
-              "cannot apply NoteDb updates for change %s; change meta ref does not match %s",
-              id, expectedState.getChangeMetaId().name()));
-    }
-  }
-
-  private void checkExpectedState() throws OrmException, IOException {
-    if (!checkExpectedState) {
-      return;
-    }
-
-    // Refuse to apply an update unless the state in NoteDb matches the state
-    // claimed in the ref. This means we may have failed a NoteDb ref update,
-    // and it would be incorrect to claim that the ref is up to date after this
-    // pipeline.
-    //
-    // Generally speaking, this case should be rare; in most cases, we should
-    // have detected and auto-fixed the stale state when creating ChangeNotes
-    // that got passed into the ChangeUpdate.
-    for (Collection<ChangeUpdate> us : changeUpdates.asMap().values()) {
-      ChangeUpdate u = us.iterator().next();
-      NoteDbChangeState expectedState = NoteDbChangeState.parse(u.getChange());
-
-      if (expectedState == null) {
-        // No previous state means we haven't previously written NoteDb graphs
-        // for this change yet. This means either:
-        //  - The change is new, and we'll be creating its ref.
-        //  - We short-circuited before adding any commands that update this
-        //    ref, and we won't stage a delta for this change either.
-        // Either way, it is safe to proceed here rather than throwing
-        // MismatchedStateException.
-        continue;
-      }
-
-      if (expectedState.getPrimaryStorage() == PrimaryStorage.NOTE_DB) {
-        // NoteDb is primary, no need to compare state to ReviewDb.
-        continue;
-      }
-
-      if (!expectedState.isChangeUpToDate(changeRepo.cmds.getRepoRefCache())) {
-        throw new MismatchedStateException(u.getId(), expectedState);
-      }
-    }
-
-    for (Collection<ChangeDraftUpdate> us : draftUpdates.asMap().values()) {
-      ChangeDraftUpdate u = us.iterator().next();
-      NoteDbChangeState expectedState = NoteDbChangeState.parse(u.getChange());
-
-      if (expectedState == null || expectedState.getPrimaryStorage() == PrimaryStorage.NOTE_DB) {
-        continue; // See above.
-      }
-
-      Account.Id accountId = u.getAccountId();
-      if (!expectedState.areDraftsUpToDate(allUsersRepo.cmds.getRepoRefCache(), accountId)) {
-        ObjectId expectedDraftId =
-            firstNonNull(expectedState.getDraftIds().get(accountId), ObjectId.zeroId());
-        throw new OrmConcurrencyException(
-            String.format(
-                "cannot apply NoteDb updates for change %s;"
-                    + " draft ref for account %s does not match %s",
-                u.getId(), accountId, expectedDraftId.name()));
-      }
-    }
-  }
-
-  private static <U extends AbstractChangeUpdate> void addUpdates(
-      ListMultimap<String, U> all, OpenRepo or) throws OrmException, IOException {
-    for (Map.Entry<String, Collection<U>> e : all.asMap().entrySet()) {
-      String refName = e.getKey();
-      Collection<U> updates = e.getValue();
-      ObjectId old = or.cmds.get(refName).orElse(ObjectId.zeroId());
-      // Only actually write to the ref if one of the updates explicitly allows
-      // us to do so, i.e. it is known to represent a new change. This avoids
-      // writing partial change meta if the change hasn't been backfilled yet.
-      if (!allowWrite(updates, old)) {
-        continue;
-      }
-
-      ObjectId curr = old;
-      for (U u : updates) {
-        if (u.isRootOnly() && !old.equals(ObjectId.zeroId())) {
-          throw new OrmException("Given ChangeUpdate is only allowed on initial commit");
-        }
-        ObjectId next = u.apply(or.rw, or.tempIns, curr);
-        if (next == null) {
-          continue;
-        }
-        curr = next;
-      }
-      if (!old.equals(curr)) {
-        or.cmds.add(new ReceiveCommand(old, curr, refName));
-      }
-    }
-  }
-
-  private static void addRewrites(ListMultimap<String, NoteDbRewriter> rewriters, OpenRepo openRepo)
-      throws OrmException, IOException {
-    for (Map.Entry<String, Collection<NoteDbRewriter>> entry : rewriters.asMap().entrySet()) {
-      String refName = entry.getKey();
-      ObjectId oldTip = openRepo.cmds.get(refName).orElse(ObjectId.zeroId());
-
-      if (oldTip.equals(ObjectId.zeroId())) {
-        throw new OrmException(String.format("Ref %s is empty", refName));
-      }
-
-      ObjectId currTip = oldTip;
-      try {
-        for (NoteDbRewriter noteDbRewriter : entry.getValue()) {
-          ObjectId nextTip =
-              noteDbRewriter.rewriteCommitHistory(openRepo.rw, openRepo.tempIns, currTip);
-          if (nextTip != null) {
-            currTip = nextTip;
-          }
-        }
-      } catch (ConfigInvalidException e) {
-        throw new OrmException("Cannot rewrite commit history", e);
-      }
-
-      if (!oldTip.equals(currTip)) {
-        openRepo.cmds.add(new ReceiveCommand(oldTip, currTip, refName));
-      }
-    }
-  }
-
-  private static <U extends AbstractChangeUpdate> boolean allowWrite(
-      Collection<U> updates, ObjectId old) {
-    if (!old.equals(ObjectId.zeroId())) {
-      return true;
-    }
-    return updates.iterator().next().allowWriteToNewRef();
-  }
-
-  private static void checkDraftRef(boolean condition, String refName) {
-    checkState(condition, "invalid draft ref: %s", refName);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NotesMigration.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NotesMigration.java
deleted file mode 100644
index e560ec8..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NotesMigration.java
+++ /dev/null
@@ -1,250 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.notedb;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.gerrit.server.notedb.NoteDbTable.CHANGES;
-
-import com.google.auto.value.AutoValue;
-import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
-import com.google.inject.AbstractModule;
-import java.util.concurrent.atomic.AtomicReference;
-import org.eclipse.jgit.lib.Config;
-
-/**
- * Current low-level settings of the NoteDb migration for changes.
- *
- * <p>This class only describes the migration state of the {@link
- * com.google.gerrit.reviewdb.client.Change Change} entity group, since it is possible for a given
- * site to be in different states of the Change NoteDb migration process while staying at the same
- * ReviewDb schema version. It does <em>not</em> describe the migration state of non-Change tables;
- * those are automatically migrated using the ReviewDb schema migration process, so the NoteDb
- * migration state at a given ReviewDb schema cannot vary.
- *
- * <p>In many places, core Gerrit code should not directly care about the NoteDb migration state,
- * and should prefer high-level APIs like {@link com.google.gerrit.server.ApprovalsUtil
- * ApprovalsUtil} that don't require callers to inspect the migration state. The
- * <em>implementation</em> of those utilities does care about the state, and should query the {@code
- * NotesMigration} for the properties of the migration, for example, {@link #changePrimaryStorage()
- * where new changes should be stored}.
- *
- * <p>Core Gerrit code is mostly interested in one facet of the migration at a time (reading or
- * writing, say), but not all combinations of return values are supported or even make sense.
- *
- * <p>This class controls the state of the migration according to options in {@code gerrit.config}.
- * In general, any changes to these options should only be made by adventurous administrators, who
- * know what they're doing, on non-production data, for the purposes of testing the NoteDb
- * implementation. Changing options quite likely requires re-running {@code MigrateToNoteDb}. For
- * these reasons, the options remain undocumented.
- *
- * <p><strong>Note:</strong> Callers should not assume the values returned by {@code
- * NotesMigration}'s methods will not change in a running server.
- */
-public abstract class NotesMigration {
-  public static final String SECTION_NOTE_DB = "noteDb";
-
-  private static final String DISABLE_REVIEW_DB = "disableReviewDb";
-  private static final String PRIMARY_STORAGE = "primaryStorage";
-  private static final String READ = "read";
-  private static final String SEQUENCE = "sequence";
-  private static final String WRITE = "write";
-
-  public static class Module extends AbstractModule {
-    @Override
-    public void configure() {
-      bind(MutableNotesMigration.class);
-      bind(NotesMigration.class).to(MutableNotesMigration.class);
-    }
-  }
-
-  @AutoValue
-  abstract static class Snapshot {
-    static Builder builder() {
-      // Default values are defined as what we would read from an empty config.
-      return create(new Config()).toBuilder();
-    }
-
-    static Snapshot create(Config cfg) {
-      return new AutoValue_NotesMigration_Snapshot.Builder()
-          .setWriteChanges(cfg.getBoolean(SECTION_NOTE_DB, CHANGES.key(), WRITE, false))
-          .setReadChanges(cfg.getBoolean(SECTION_NOTE_DB, CHANGES.key(), READ, false))
-          .setReadChangeSequence(cfg.getBoolean(SECTION_NOTE_DB, CHANGES.key(), SEQUENCE, false))
-          .setChangePrimaryStorage(
-              cfg.getEnum(
-                  SECTION_NOTE_DB, CHANGES.key(), PRIMARY_STORAGE, PrimaryStorage.REVIEW_DB))
-          .setDisableChangeReviewDb(
-              cfg.getBoolean(SECTION_NOTE_DB, CHANGES.key(), DISABLE_REVIEW_DB, false))
-          .setFailOnLoadForTest(false) // Only set in tests, can't be set via config.
-          .build();
-    }
-
-    abstract boolean writeChanges();
-
-    abstract boolean readChanges();
-
-    abstract boolean readChangeSequence();
-
-    abstract PrimaryStorage changePrimaryStorage();
-
-    abstract boolean disableChangeReviewDb();
-
-    abstract boolean failOnLoadForTest();
-
-    abstract Builder toBuilder();
-
-    void setConfigValues(Config cfg) {
-      cfg.setBoolean(SECTION_NOTE_DB, CHANGES.key(), WRITE, writeChanges());
-      cfg.setBoolean(SECTION_NOTE_DB, CHANGES.key(), READ, readChanges());
-      cfg.setBoolean(SECTION_NOTE_DB, CHANGES.key(), SEQUENCE, readChangeSequence());
-      cfg.setEnum(SECTION_NOTE_DB, CHANGES.key(), PRIMARY_STORAGE, changePrimaryStorage());
-      cfg.setBoolean(SECTION_NOTE_DB, CHANGES.key(), DISABLE_REVIEW_DB, disableChangeReviewDb());
-    }
-
-    @AutoValue.Builder
-    abstract static class Builder {
-      abstract Builder setWriteChanges(boolean writeChanges);
-
-      abstract Builder setReadChanges(boolean readChanges);
-
-      abstract Builder setReadChangeSequence(boolean readChangeSequence);
-
-      abstract Builder setChangePrimaryStorage(PrimaryStorage changePrimaryStorage);
-
-      abstract Builder setDisableChangeReviewDb(boolean disableChangeReviewDb);
-
-      abstract Builder setFailOnLoadForTest(boolean failOnLoadForTest);
-
-      abstract Snapshot autoBuild();
-
-      Snapshot build() {
-        Snapshot s = autoBuild();
-        checkArgument(
-            !(s.disableChangeReviewDb() && s.changePrimaryStorage() != PrimaryStorage.NOTE_DB),
-            "cannot disable ReviewDb for changes if default change primary storage is ReviewDb");
-        return s;
-      }
-    }
-  }
-
-  protected final AtomicReference<Snapshot> snapshot;
-
-  /**
-   * Read changes from NoteDb.
-   *
-   * <p>Change data is read from NoteDb refs, but ReviewDb is still the source of truth. If the
-   * loader determines NoteDb is out of date, the change data in NoteDb will be transparently
-   * rebuilt. This means that some code paths that look read-only may in fact attempt to write.
-   *
-   * <p>If true and {@code writeChanges() = false}, changes can still be read from NoteDb, but any
-   * attempts to write will generate an error.
-   */
-  public final boolean readChanges() {
-    return snapshot.get().readChanges();
-  }
-
-  /**
-   * Write changes to NoteDb.
-   *
-   * <p>This method is awkwardly named because you should be using either {@link
-   * #commitChangeWrites()} or {@link #failChangeWrites()} instead.
-   *
-   * <p>Updates to change data are written to NoteDb refs, but ReviewDb is still the source of
-   * truth. Change data will not be written unless the NoteDb refs are already up to date, and the
-   * write path will attempt to rebuild the change if not.
-   *
-   * <p>If false, the behavior when attempting to write depends on {@code readChanges()}. If {@code
-   * readChanges() = false}, writes to NoteDb are simply ignored; if {@code true}, any attempts to
-   * write will generate an error.
-   */
-  public final boolean rawWriteChangesSetting() {
-    return snapshot.get().writeChanges();
-  }
-
-  /**
-   * Read sequential change ID numbers from NoteDb.
-   *
-   * <p>If true, change IDs are read from {@code refs/sequences/changes} in All-Projects. If false,
-   * change IDs are read from ReviewDb's native sequences.
-   */
-  public final boolean readChangeSequence() {
-    return snapshot.get().readChangeSequence();
-  }
-
-  /** @return default primary storage for new changes. */
-  public final PrimaryStorage changePrimaryStorage() {
-    return snapshot.get().changePrimaryStorage();
-  }
-
-  /**
-   * Disable ReviewDb access for changes.
-   *
-   * <p>When set, ReviewDb operations involving the Changes table become no-ops. Lookups return no
-   * results; updates do nothing, as does opening, committing, or rolling back a transaction on the
-   * Changes table.
-   */
-  public final boolean disableChangeReviewDb() {
-    return snapshot.get().disableChangeReviewDb();
-  }
-
-  /**
-   * Whether to fail when reading any data from NoteDb.
-   *
-   * <p>Used in conjunction with {@link #readChanges()} for tests.
-   */
-  public boolean failOnLoadForTest() {
-    return snapshot.get().failOnLoadForTest();
-  }
-
-  public final boolean commitChangeWrites() {
-    // It may seem odd that readChanges() without writeChanges() means we should
-    // attempt to commit writes. However, this method is used by callers to know
-    // whether or not they should short-circuit and skip attempting to read or
-    // write NoteDb refs.
-    //
-    // It is possible for commitChangeWrites() to return true and
-    // failChangeWrites() to also return true, causing an error later in the
-    // same codepath. This specific condition is used by the auto-rebuilding
-    // path to rebuild a change and stage the results, but not commit them due
-    // to failChangeWrites().
-    return rawWriteChangesSetting() || readChanges();
-  }
-
-  public final boolean failChangeWrites() {
-    return !rawWriteChangesSetting() && readChanges();
-  }
-
-  public final void setConfigValues(Config cfg) {
-    snapshot.get().setConfigValues(cfg);
-  }
-
-  @Override
-  public final boolean equals(Object o) {
-    return o instanceof NotesMigration
-        && snapshot.get().equals(((NotesMigration) o).snapshot.get());
-  }
-
-  @Override
-  public final int hashCode() {
-    return snapshot.get().hashCode();
-  }
-
-  protected NotesMigration(Snapshot snapshot) {
-    this.snapshot = new AtomicReference<>(snapshot);
-  }
-
-  final Snapshot snapshot() {
-    return snapshot.get();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/PrimaryStorageMigrator.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/PrimaryStorageMigrator.java
deleted file mode 100644
index 4917e65..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/PrimaryStorageMigrator.java
+++ /dev/null
@@ -1,513 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.notedb;
-
-import static com.google.common.base.Preconditions.checkState;
-import static java.util.concurrent.TimeUnit.MILLISECONDS;
-import static java.util.concurrent.TimeUnit.NANOSECONDS;
-import static java.util.concurrent.TimeUnit.SECONDS;
-
-import com.github.rholder.retry.RetryException;
-import com.github.rholder.retry.Retryer;
-import com.github.rholder.retry.RetryerBuilder;
-import com.github.rholder.retry.StopStrategies;
-import com.github.rholder.retry.WaitStrategies;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Stopwatch;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.reviewdb.server.ReviewDbUtil;
-import com.google.gerrit.server.InternalUser;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.RepoRefCache;
-import com.google.gerrit.server.index.change.ChangeField;
-import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
-import com.google.gerrit.server.notedb.NoteDbChangeState.RefState;
-import com.google.gerrit.server.notedb.rebuild.ChangeRebuilder;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.InternalChangeQuery;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.BatchUpdateOp;
-import com.google.gerrit.server.update.ChangeContext;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gwtorm.server.AtomicUpdate;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.OrmRuntimeException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.atomic.AtomicBoolean;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Helper to migrate the {@link PrimaryStorage} of individual changes. */
-@Singleton
-public class PrimaryStorageMigrator {
-  private static final Logger log = LoggerFactory.getLogger(PrimaryStorageMigrator.class);
-
-  /**
-   * Exception thrown during migration if the change has no {@code noteDbState} field at the
-   * beginning of the migration.
-   */
-  public static class NoNoteDbStateException extends RuntimeException {
-    private static final long serialVersionUID = 1L;
-
-    private NoNoteDbStateException(Change.Id id) {
-      super("change " + id + " has no note_db_state; rebuild it first");
-    }
-  }
-
-  private final AllUsersName allUsers;
-  private final ChangeNotes.Factory changeNotesFactory;
-  private final ChangeRebuilder rebuilder;
-  private final ChangeUpdate.Factory updateFactory;
-  private final GitRepositoryManager repoManager;
-  private final InternalUser.Factory internalUserFactory;
-  private final Provider<InternalChangeQuery> queryProvider;
-  private final Provider<ReviewDb> db;
-  private final RetryHelper retryHelper;
-
-  private final long skewMs;
-  private final long timeoutMs;
-  private final Retryer<NoteDbChangeState> testEnsureRebuiltRetryer;
-
-  @Inject
-  PrimaryStorageMigrator(
-      @GerritServerConfig Config cfg,
-      Provider<ReviewDb> db,
-      GitRepositoryManager repoManager,
-      AllUsersName allUsers,
-      ChangeRebuilder rebuilder,
-      ChangeNotes.Factory changeNotesFactory,
-      Provider<InternalChangeQuery> queryProvider,
-      ChangeUpdate.Factory updateFactory,
-      InternalUser.Factory internalUserFactory,
-      RetryHelper retryHelper) {
-    this(
-        cfg,
-        db,
-        repoManager,
-        allUsers,
-        rebuilder,
-        null,
-        changeNotesFactory,
-        queryProvider,
-        updateFactory,
-        internalUserFactory,
-        retryHelper);
-  }
-
-  @VisibleForTesting
-  public PrimaryStorageMigrator(
-      Config cfg,
-      Provider<ReviewDb> db,
-      GitRepositoryManager repoManager,
-      AllUsersName allUsers,
-      ChangeRebuilder rebuilder,
-      @Nullable Retryer<NoteDbChangeState> testEnsureRebuiltRetryer,
-      ChangeNotes.Factory changeNotesFactory,
-      Provider<InternalChangeQuery> queryProvider,
-      ChangeUpdate.Factory updateFactory,
-      InternalUser.Factory internalUserFactory,
-      RetryHelper retryHelper) {
-    this.db = db;
-    this.repoManager = repoManager;
-    this.allUsers = allUsers;
-    this.rebuilder = rebuilder;
-    this.testEnsureRebuiltRetryer = testEnsureRebuiltRetryer;
-    this.changeNotesFactory = changeNotesFactory;
-    this.queryProvider = queryProvider;
-    this.updateFactory = updateFactory;
-    this.internalUserFactory = internalUserFactory;
-    this.retryHelper = retryHelper;
-    skewMs = NoteDbChangeState.getReadOnlySkew(cfg);
-
-    String s = "notedb";
-    timeoutMs =
-        cfg.getTimeUnit(
-            s,
-            null,
-            "primaryStorageMigrationTimeout",
-            MILLISECONDS.convert(60, SECONDS),
-            MILLISECONDS);
-  }
-
-  /**
-   * Migrate a change's primary storage from ReviewDb to NoteDb.
-   *
-   * <p>This method will return only if the primary storage of the change is NoteDb afterwards. (It
-   * may return early if the primary storage was already NoteDb.)
-   *
-   * <p>If this method throws an exception, then the primary storage of the change is probably not
-   * NoteDb. (It is possible that the primary storage of the change is NoteDb in this case, but
-   * there was an error reading the state.) Moreover, after an exception, the change may be
-   * read-only until a lease expires. If the caller chooses to retry, they should wait until the
-   * read-only lease expires; this method will fail relatively quickly if called on a read-only
-   * change.
-   *
-   * <p>Note that if the change is read-only after this method throws an exception, that does not
-   * necessarily guarantee that the read-only lease was acquired during that particular method
-   * invocation; this call may have in fact failed because another thread acquired the lease first.
-   *
-   * @param id change ID.
-   * @throws OrmException if a ReviewDb-level error occurs.
-   * @throws IOException if a repo-level error occurs.
-   */
-  public void migrateToNoteDbPrimary(Change.Id id) throws OrmException, IOException {
-    // Since there are multiple non-atomic steps in this method, we need to
-    // consider what happens when there is another writer concurrent with the
-    // thread executing this method.
-    //
-    // Let:
-    // * OR = other writer writes noteDbState & new data to ReviewDb (in one
-    //        transaction)
-    // * ON = other writer writes to NoteDb
-    // * MRO = migrator sets state to read-only
-    // * MR = ensureRebuilt writes rebuilt noteDbState to ReviewDb (but does not
-    //        otherwise update ReviewDb in this transaction)
-    // * MN = ensureRebuilt writes rebuilt state to NoteDb
-    //
-    // Consider all the interleavings of these operations.
-    //
-    // * OR,ON,MRO,...
-    //   Other writer completes before migrator begins; this is not a concurrent
-    //   write.
-    // * MRO,...,OR,...
-    //   OR will fail, since it atomically checks that the noteDbState is not
-    //   read-only before proceeding. This results in an exception, but not a
-    //   concurrent write.
-    //
-    // Thus all the "interesting" interleavings start with OR,MRO, and differ on
-    // where ON falls relative to MR/MN.
-    //
-    // * OR,MRO,ON,MR,MN
-    //   The other NoteDb write succeeds despite the noteDbState being
-    //   read-only. Because the read-only state from MRO includes the update
-    //   from OR, the change is up-to-date at this point. Thus MR,MN is a no-op.
-    //   The end result is an up-to-date, read-only change.
-    //
-    // * OR,MRO,MR,ON,MN
-    //   The change is out-of-date when ensureRebuilt begins, because OR
-    //   succeeded but the corresponding ON has not happened yet. ON will
-    //   succeed, because there have been no intervening NoteDb writes. MN will
-    //   fail, because ON updated the state in NoteDb to something other than
-    //   what MR claimed. This leaves the change in an out-of-date, read-only
-    //   state.
-    //
-    //   If this method threw an exception in this case, the change would
-    //   eventually switch back to read-write when the read-only lease expires,
-    //   so this situation is recoverable. However, it would be inconvenient for
-    //   a change to be read-only for so long.
-    //
-    //   Thus, as an optimization, we have a retry loop that attempts
-    //   ensureRebuilt while still holding the same read-only lease. This
-    //   effectively results in the interleaving OR,MR,ON,MR,MN; in contrast
-    //   with the previous case, here, MR/MN actually rebuilds the change. In
-    //   the case of a write failure, MR/MN might fail and get retried again. If
-    //   it exceeds the maximum number of retries, an exception is thrown.
-    //
-    // * OR,MRO,MR,MN,ON
-    //   The change is out-of-date when ensureRebuilt begins. The change is
-    //   rebuilt, leaving a new state in NoteDb. ON will fail, because the old
-    //   NoteDb state has changed since the ref state was read when the update
-    //   began (prior to OR). This results in an exception from ON, but the end
-    //   result is still an up-to-date, read-only change. The end user that
-    //   initiated the other write observes an error, but this is no different
-    //   from other errors that need retrying, e.g. due to a backend write
-    //   failure.
-
-    Stopwatch sw = Stopwatch.createStarted();
-    Change readOnlyChange = setReadOnlyInReviewDb(id); // MRO
-    if (readOnlyChange == null) {
-      return; // Already migrated.
-    }
-
-    NoteDbChangeState rebuiltState;
-    try {
-      // MR,MN
-      rebuiltState =
-          ensureRebuiltRetryer(sw)
-              .call(
-                  () ->
-                      ensureRebuilt(
-                          readOnlyChange.getProject(),
-                          id,
-                          NoteDbChangeState.parse(readOnlyChange)));
-    } catch (RetryException | ExecutionException e) {
-      throw new OrmException(e);
-    }
-
-    // At this point, the noteDbState in ReviewDb is read-only, and it is
-    // guaranteed to match the state actually in NoteDb. Now it is safe to set
-    // the primary storage to NoteDb.
-
-    setPrimaryStorageNoteDb(id, rebuiltState);
-    log.debug("Migrated change {} to NoteDb primary in {}ms", id, sw.elapsed(MILLISECONDS));
-  }
-
-  private Change setReadOnlyInReviewDb(Change.Id id) throws OrmException {
-    AtomicBoolean alreadyMigrated = new AtomicBoolean(false);
-    Change result =
-        db().changes()
-            .atomicUpdate(
-                id,
-                new AtomicUpdate<Change>() {
-                  @Override
-                  public Change update(Change change) {
-                    NoteDbChangeState state = NoteDbChangeState.parse(change);
-                    if (state == null) {
-                      // Could rebuild the change here, but that's more complexity, and this
-                      // normally shouldn't happen.
-                      //
-                      // Known cases where this happens are described in and handled by
-                      // NoteDbMigrator#canSkipPrimaryStorageMigration.
-                      throw new NoNoteDbStateException(id);
-                    }
-                    // If the change is already read-only, then the lease is held by another
-                    // (likely failed) migrator thread. Fail early, as we can't take over
-                    // the lease.
-                    NoteDbChangeState.checkNotReadOnly(change, skewMs);
-                    if (state.getPrimaryStorage() != PrimaryStorage.NOTE_DB) {
-                      Timestamp now = TimeUtil.nowTs();
-                      Timestamp until = new Timestamp(now.getTime() + timeoutMs);
-                      change.setNoteDbState(state.withReadOnlyUntil(until).toString());
-                    } else {
-                      alreadyMigrated.set(true);
-                    }
-                    return change;
-                  }
-                });
-    return alreadyMigrated.get() ? null : result;
-  }
-
-  private Retryer<NoteDbChangeState> ensureRebuiltRetryer(Stopwatch sw) {
-    if (testEnsureRebuiltRetryer != null) {
-      return testEnsureRebuiltRetryer;
-    }
-    // Retry the ensureRebuilt step with backoff until half the timeout has
-    // expired, leaving the remaining half for the rest of the steps.
-    long remainingNanos = (MILLISECONDS.toNanos(timeoutMs) / 2) - sw.elapsed(NANOSECONDS);
-    remainingNanos = Math.max(remainingNanos, 0);
-    return RetryerBuilder.<NoteDbChangeState>newBuilder()
-        .retryIfException(e -> (e instanceof IOException) || (e instanceof OrmException))
-        .withWaitStrategy(
-            WaitStrategies.join(
-                WaitStrategies.exponentialWait(250, MILLISECONDS),
-                WaitStrategies.randomWait(50, MILLISECONDS)))
-        .withStopStrategy(StopStrategies.stopAfterDelay(remainingNanos, NANOSECONDS))
-        .build();
-  }
-
-  private NoteDbChangeState ensureRebuilt(
-      Project.NameKey project, Change.Id id, NoteDbChangeState readOnlyState)
-      throws IOException, OrmException, RepositoryNotFoundException {
-    try (Repository changeRepo = repoManager.openRepository(project);
-        Repository allUsersRepo = repoManager.openRepository(allUsers)) {
-      if (!readOnlyState.isUpToDate(new RepoRefCache(changeRepo), new RepoRefCache(allUsersRepo))) {
-        NoteDbUpdateManager.Result r = rebuilder.rebuildEvenIfReadOnly(db(), id);
-        checkState(
-            r.newState().getReadOnlyUntil().equals(readOnlyState.getReadOnlyUntil()),
-            "state after rebuilding has different read-only lease: %s != %s",
-            r.newState(),
-            readOnlyState);
-        readOnlyState = r.newState();
-      }
-    }
-    return readOnlyState;
-  }
-
-  private void setPrimaryStorageNoteDb(Change.Id id, NoteDbChangeState expectedState)
-      throws OrmException {
-    db().changes()
-        .atomicUpdate(
-            id,
-            new AtomicUpdate<Change>() {
-              @Override
-              public Change update(Change change) {
-                NoteDbChangeState state = NoteDbChangeState.parse(change);
-                if (!Objects.equals(state, expectedState)) {
-                  throw new OrmRuntimeException(badState(state, expectedState));
-                }
-                Timestamp until = state.getReadOnlyUntil().get();
-                if (TimeUtil.nowTs().after(until)) {
-                  throw new OrmRuntimeException(
-                      "read-only lease on change " + id + " expired at " + until);
-                }
-                change.setNoteDbState(NoteDbChangeState.NOTE_DB_PRIMARY_STATE);
-                return change;
-              }
-            });
-  }
-
-  private ReviewDb db() {
-    return ReviewDbUtil.unwrapDb(db.get());
-  }
-
-  private String badState(NoteDbChangeState actual, NoteDbChangeState expected) {
-    return "state changed unexpectedly: " + actual + " != " + expected;
-  }
-
-  public void migrateToReviewDbPrimary(Change.Id id, @Nullable Project.NameKey project)
-      throws OrmException, IOException {
-    // Migrating back to ReviewDb primary is much simpler than the original migration to NoteDb
-    // primary, because when NoteDb is primary, each write only goes to one storage location rather
-    // than both. We only need to consider whether a concurrent writer (OR) conflicts with the first
-    // setReadOnlyInNoteDb step (MR) in this method.
-    //
-    // If OR wins, then either:
-    // * MR will set read-only after OR is completed, which is not a concurrent write.
-    // * MR will fail to set read-only with a lock failure. The caller will have to retry, but the
-    //   change is not in a read-only state, so behavior is not degraded in the meantime.
-    //
-    // If MR wins, then either:
-    // * OR will fail with a read-only exception (via AbstractChangeNotes#apply).
-    // * OR will fail with a lock failure.
-    //
-    // In all of these scenarios, the change is read-only if and only if MR succeeds.
-    //
-    // There will be no concurrent writes to ReviewDb for this change until
-    // setPrimaryStorageReviewDb completes, because ReviewDb writes are not attempted when primary
-    // storage is NoteDb. After the primary storage changes back, it is possible for subsequent
-    // NoteDb writes to conflict with the releaseReadOnlyLeaseInNoteDb step, but at this point,
-    // since ReviewDb is primary, we are back to ignoring them.
-    Stopwatch sw = Stopwatch.createStarted();
-    if (project == null) {
-      project = getProject(id);
-    }
-    ObjectId newMetaId = setReadOnlyInNoteDb(project, id);
-    rebuilder.rebuildReviewDb(db(), project, id);
-    setPrimaryStorageReviewDb(id, newMetaId);
-    releaseReadOnlyLeaseInNoteDb(project, id);
-    log.debug("Migrated change {} to ReviewDb primary in {}ms", id, sw.elapsed(MILLISECONDS));
-  }
-
-  private ObjectId setReadOnlyInNoteDb(Project.NameKey project, Change.Id id)
-      throws OrmException, IOException {
-    Timestamp now = TimeUtil.nowTs();
-    Timestamp until = new Timestamp(now.getTime() + timeoutMs);
-    ChangeUpdate update =
-        updateFactory.create(
-            changeNotesFactory.createChecked(db.get(), project, id), internalUserFactory.create());
-    update.setReadOnlyUntil(until);
-    return update.commit();
-  }
-
-  private void setPrimaryStorageReviewDb(Change.Id id, ObjectId newMetaId)
-      throws OrmException, IOException {
-    ImmutableMap.Builder<Account.Id, ObjectId> draftIds = ImmutableMap.builder();
-    try (Repository repo = repoManager.openRepository(allUsers)) {
-      for (Ref draftRef :
-          repo.getRefDatabase().getRefs(RefNames.refsDraftCommentsPrefix(id)).values()) {
-        Account.Id accountId = Account.Id.fromRef(draftRef.getName());
-        if (accountId != null) {
-          draftIds.put(accountId, draftRef.getObjectId().copy());
-        }
-      }
-    }
-    NoteDbChangeState newState =
-        new NoteDbChangeState(
-            id,
-            PrimaryStorage.REVIEW_DB,
-            Optional.of(RefState.create(newMetaId, draftIds.build())),
-            Optional.empty());
-    db().changes()
-        .atomicUpdate(
-            id,
-            new AtomicUpdate<Change>() {
-              @Override
-              public Change update(Change change) {
-                if (PrimaryStorage.of(change) != PrimaryStorage.NOTE_DB) {
-                  throw new OrmRuntimeException(
-                      "change " + id + " is not NoteDb primary: " + change.getNoteDbState());
-                }
-                change.setNoteDbState(newState.toString());
-                return change;
-              }
-            });
-  }
-
-  private void releaseReadOnlyLeaseInNoteDb(Project.NameKey project, Change.Id id)
-      throws OrmException {
-    // Use a BatchUpdate since ReviewDb is primary at this point, so it needs to reflect the update.
-    // (In practice retrying won't happen, since we aren't using fused updates at this point.)
-    try {
-      retryHelper.execute(
-          updateFactory -> {
-            try (BatchUpdate bu =
-                updateFactory.create(
-                    db.get(), project, internalUserFactory.create(), TimeUtil.nowTs())) {
-              bu.addOp(
-                  id,
-                  new BatchUpdateOp() {
-                    @Override
-                    public boolean updateChange(ChangeContext ctx) {
-                      ctx.getUpdate(ctx.getChange().currentPatchSetId())
-                          .setReadOnlyUntil(new Timestamp(0));
-                      return true;
-                    }
-                  });
-              bu.execute();
-              return null;
-            }
-          });
-    } catch (RestApiException | UpdateException e) {
-      throw new OrmException(e);
-    }
-  }
-
-  private Project.NameKey getProject(Change.Id id) throws OrmException {
-    List<ChangeData> cds =
-        queryProvider
-            .get()
-            .setRequestedFields(ImmutableSet.of(ChangeField.PROJECT.getName()))
-            .byLegacyChangeId(id);
-    Set<Project.NameKey> projects = new TreeSet<>();
-    for (ChangeData cd : cds) {
-      projects.add(cd.project());
-    }
-    if (projects.size() != 1) {
-      throw new OrmException(
-          "zero or multiple projects found for change "
-              + id
-              + ", must specify project explicitly: "
-              + projects);
-    }
-    return projects.iterator().next();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RepoSequence.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RepoSequence.java
deleted file mode 100644
index 11266f9..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RepoSequence.java
+++ /dev/null
@@ -1,345 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.notedb;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.gerrit.reviewdb.client.RefNames.REFS;
-import static com.google.gerrit.reviewdb.client.RefNames.REFS_SEQUENCES;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
-
-import com.github.rholder.retry.RetryException;
-import com.github.rholder.retry.Retryer;
-import com.github.rholder.retry.RetryerBuilder;
-import com.github.rholder.retry.StopStrategies;
-import com.github.rholder.retry.WaitStrategies;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.CharMatcher;
-import com.google.common.base.Predicates;
-import com.google.common.base.Throwables;
-import com.google.common.collect.ImmutableList;
-import com.google.common.primitives.Ints;
-import com.google.common.util.concurrent.Runnables;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gwtorm.server.OrmException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-import org.eclipse.jgit.errors.IncorrectObjectTypeException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.ObjectLoader;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.ReceiveCommand;
-
-/**
- * Class for managing an incrementing sequence backed by a git repository.
- *
- * <p>The current sequence number is stored as UTF-8 text in a blob pointed to by a ref in the
- * {@code refs/sequences/*} namespace. Multiple processes can share the same sequence by
- * incrementing the counter using normal git ref updates. To amortize the cost of these ref updates,
- * processes can increment the counter by a larger number and hand out numbers from that range in
- * memory until they run out. This means concurrent processes will hand out somewhat non-monotonic
- * numbers.
- */
-public class RepoSequence {
-  @FunctionalInterface
-  public interface Seed {
-    int get() throws OrmException;
-  }
-
-  @VisibleForTesting
-  static RetryerBuilder<RefUpdate.Result> retryerBuilder() {
-    return RetryerBuilder.<RefUpdate.Result>newBuilder()
-        .retryIfResult(Predicates.equalTo(RefUpdate.Result.LOCK_FAILURE))
-        .withWaitStrategy(
-            WaitStrategies.join(
-                WaitStrategies.exponentialWait(5, TimeUnit.SECONDS),
-                WaitStrategies.randomWait(50, TimeUnit.MILLISECONDS)))
-        .withStopStrategy(StopStrategies.stopAfterDelay(30, TimeUnit.SECONDS));
-  }
-
-  private static final Retryer<RefUpdate.Result> RETRYER = retryerBuilder().build();
-
-  private final GitRepositoryManager repoManager;
-  private final GitReferenceUpdated gitRefUpdated;
-  private final Project.NameKey projectName;
-  private final String refName;
-  private final Seed seed;
-  private final int floor;
-  private final int batchSize;
-  private final Runnable afterReadRef;
-  private final Retryer<RefUpdate.Result> retryer;
-
-  // Protects all non-final fields.
-  private final Lock counterLock;
-
-  private int limit;
-  private int counter;
-
-  @VisibleForTesting int acquireCount;
-
-  public RepoSequence(
-      GitRepositoryManager repoManager,
-      GitReferenceUpdated gitRefUpdated,
-      Project.NameKey projectName,
-      String name,
-      Seed seed,
-      int batchSize) {
-    this(
-        repoManager,
-        gitRefUpdated,
-        projectName,
-        name,
-        seed,
-        batchSize,
-        Runnables.doNothing(),
-        RETRYER,
-        0);
-  }
-
-  public RepoSequence(
-      GitRepositoryManager repoManager,
-      GitReferenceUpdated gitRefUpdated,
-      Project.NameKey projectName,
-      String name,
-      Seed seed,
-      int batchSize,
-      int floor) {
-    this(
-        repoManager,
-        gitRefUpdated,
-        projectName,
-        name,
-        seed,
-        batchSize,
-        Runnables.doNothing(),
-        RETRYER,
-        floor);
-  }
-
-  @VisibleForTesting
-  RepoSequence(
-      GitRepositoryManager repoManager,
-      GitReferenceUpdated gitRefUpdated,
-      Project.NameKey projectName,
-      String name,
-      Seed seed,
-      int batchSize,
-      Runnable afterReadRef,
-      Retryer<RefUpdate.Result> retryer) {
-    this(repoManager, gitRefUpdated, projectName, name, seed, batchSize, afterReadRef, retryer, 0);
-  }
-
-  RepoSequence(
-      GitRepositoryManager repoManager,
-      GitReferenceUpdated gitRefUpdated,
-      Project.NameKey projectName,
-      String name,
-      Seed seed,
-      int batchSize,
-      Runnable afterReadRef,
-      Retryer<RefUpdate.Result> retryer,
-      int floor) {
-    this.repoManager = checkNotNull(repoManager, "repoManager");
-    this.gitRefUpdated = checkNotNull(gitRefUpdated, "gitRefUpdated");
-    this.projectName = checkNotNull(projectName, "projectName");
-
-    checkArgument(
-        name != null
-            && !name.startsWith(REFS)
-            && !name.startsWith(REFS_SEQUENCES.substring(REFS.length())),
-        "name should be a suffix to follow \"refs/sequences/\", got: %s",
-        name);
-    this.refName = RefNames.REFS_SEQUENCES + name;
-
-    this.seed = checkNotNull(seed, "seed");
-    this.floor = floor;
-
-    checkArgument(batchSize > 0, "expected batchSize > 0, got: %s", batchSize);
-    this.batchSize = batchSize;
-    this.afterReadRef = checkNotNull(afterReadRef, "afterReadRef");
-    this.retryer = checkNotNull(retryer, "retryer");
-
-    counterLock = new ReentrantLock(true);
-  }
-
-  public int next() throws OrmException {
-    counterLock.lock();
-    try {
-      if (counter >= limit) {
-        acquire(batchSize);
-      }
-      return counter++;
-    } finally {
-      counterLock.unlock();
-    }
-  }
-
-  public ImmutableList<Integer> next(int count) throws OrmException {
-    if (count == 0) {
-      return ImmutableList.of();
-    }
-    checkArgument(count > 0, "count is negative: %s", count);
-    counterLock.lock();
-    try {
-      List<Integer> ids = new ArrayList<>(count);
-      while (counter < limit) {
-        ids.add(counter++);
-        if (ids.size() == count) {
-          return ImmutableList.copyOf(ids);
-        }
-      }
-      acquire(Math.max(count - ids.size(), batchSize));
-      while (ids.size() < count) {
-        ids.add(counter++);
-      }
-      return ImmutableList.copyOf(ids);
-    } finally {
-      counterLock.unlock();
-    }
-  }
-
-  @VisibleForTesting
-  public void set(int val) throws OrmException {
-    // Don't bother spinning. This is only for tests, and a test that calls set
-    // concurrently with other writes is doing it wrong.
-    counterLock.lock();
-    try {
-      try (Repository repo = repoManager.openRepository(projectName);
-          RevWalk rw = new RevWalk(repo)) {
-        checkResult(store(repo, rw, null, val));
-        counter = limit;
-      } catch (IOException e) {
-        throw new OrmException(e);
-      }
-    } finally {
-      counterLock.unlock();
-    }
-  }
-
-  private void acquire(int count) throws OrmException {
-    try (Repository repo = repoManager.openRepository(projectName);
-        RevWalk rw = new RevWalk(repo)) {
-      TryAcquire attempt = new TryAcquire(repo, rw, count);
-      checkResult(retryer.call(attempt));
-      counter = attempt.next;
-      limit = counter + count;
-      acquireCount++;
-    } catch (ExecutionException | RetryException e) {
-      if (e.getCause() != null) {
-        Throwables.throwIfInstanceOf(e.getCause(), OrmException.class);
-      }
-      throw new OrmException(e);
-    } catch (IOException e) {
-      throw new OrmException(e);
-    }
-  }
-
-  private void checkResult(RefUpdate.Result result) throws OrmException {
-    if (!refUpdated(result)) {
-      throw new OrmException("failed to update " + refName + ": " + result);
-    }
-  }
-
-  private boolean refUpdated(RefUpdate.Result result) {
-    return result == RefUpdate.Result.NEW || result == RefUpdate.Result.FORCED;
-  }
-
-  private class TryAcquire implements Callable<RefUpdate.Result> {
-    private final Repository repo;
-    private final RevWalk rw;
-    private final int count;
-
-    private int next;
-
-    private TryAcquire(Repository repo, RevWalk rw, int count) {
-      this.repo = repo;
-      this.rw = rw;
-      this.count = count;
-    }
-
-    @Override
-    public RefUpdate.Result call() throws Exception {
-      Ref ref = repo.exactRef(refName);
-      int nextCandidate;
-      afterReadRef.run();
-      ObjectId oldId;
-      if (ref == null) {
-        oldId = ObjectId.zeroId();
-        nextCandidate = seed.get();
-      } else {
-        oldId = ref.getObjectId();
-        nextCandidate = parse(oldId);
-      }
-      next = Math.max(floor, nextCandidate);
-      return store(repo, rw, oldId, next + count);
-    }
-
-    private int parse(ObjectId id) throws IOException, OrmException {
-      ObjectLoader ol = rw.getObjectReader().open(id, OBJ_BLOB);
-      if (ol.getType() != OBJ_BLOB) {
-        // In theory this should be thrown by open but not all implementations
-        // may do it properly (certainly InMemoryRepository doesn't).
-        throw new IncorrectObjectTypeException(id, OBJ_BLOB);
-      }
-      String str = CharMatcher.whitespace().trimFrom(new String(ol.getCachedBytes(), UTF_8));
-      Integer val = Ints.tryParse(str);
-      if (val == null) {
-        throw new OrmException("invalid value in " + refName + " blob at " + id.name());
-      }
-      return val;
-    }
-  }
-
-  private RefUpdate.Result store(Repository repo, RevWalk rw, @Nullable ObjectId oldId, int val)
-      throws IOException {
-    ObjectId newId;
-    try (ObjectInserter ins = repo.newObjectInserter()) {
-      newId = ins.insert(OBJ_BLOB, Integer.toString(val).getBytes(UTF_8));
-      ins.flush();
-    }
-    RefUpdate ru = repo.updateRef(refName);
-    if (oldId != null) {
-      ru.setExpectedOldObjectId(oldId);
-    }
-    ru.setNewObjectId(newId);
-    ru.setForceUpdate(true); // Required for non-commitish updates.
-    RefUpdate.Result result = ru.update(rw);
-    if (refUpdated(result)) {
-      gitRefUpdated.fire(projectName, ru, null);
-    }
-    return result;
-  }
-
-  public static ReceiveCommand storeNew(ObjectInserter ins, String name, int val)
-      throws IOException {
-    ObjectId newId = ins.insert(OBJ_BLOB, Integer.toString(val).getBytes(UTF_8));
-    return new ReceiveCommand(ObjectId.zeroId(), newId, RefNames.REFS_SEQUENCES + name);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNoteBuilder.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNoteBuilder.java
deleted file mode 100644
index b341ea8..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNoteBuilder.java
+++ /dev/null
@@ -1,156 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.notedb;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.gerrit.server.CommentsUtil.COMMENT_ORDER;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.Maps;
-import com.google.common.collect.MultimapBuilder;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.RevId;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-class RevisionNoteBuilder {
-  static class Cache {
-    private final RevisionNoteMap<? extends RevisionNote<? extends Comment>> revisionNoteMap;
-    private final Map<RevId, RevisionNoteBuilder> builders;
-
-    Cache(RevisionNoteMap<? extends RevisionNote<? extends Comment>> revisionNoteMap) {
-      this.revisionNoteMap = revisionNoteMap;
-      this.builders = new HashMap<>();
-    }
-
-    RevisionNoteBuilder get(RevId revId) {
-      RevisionNoteBuilder b = builders.get(revId);
-      if (b == null) {
-        b = new RevisionNoteBuilder(revisionNoteMap.revisionNotes.get(revId));
-        builders.put(revId, b);
-      }
-      return b;
-    }
-
-    Map<RevId, RevisionNoteBuilder> getBuilders() {
-      return Collections.unmodifiableMap(builders);
-    }
-  }
-
-  final byte[] baseRaw;
-  final List<? extends Comment> baseComments;
-  final Map<Comment.Key, Comment> put;
-  final Set<Comment.Key> delete;
-
-  private String pushCert;
-
-  RevisionNoteBuilder(RevisionNote<? extends Comment> base) {
-    if (base != null) {
-      baseRaw = base.getRaw();
-      baseComments = base.getComments();
-      put = Maps.newHashMapWithExpectedSize(baseComments.size());
-      if (base instanceof ChangeRevisionNote) {
-        pushCert = ((ChangeRevisionNote) base).getPushCert();
-      }
-    } else {
-      baseRaw = new byte[0];
-      baseComments = Collections.emptyList();
-      put = new HashMap<>();
-      pushCert = null;
-    }
-    delete = new HashSet<>();
-  }
-
-  public byte[] build(ChangeNoteUtil noteUtil, boolean writeJson) throws IOException {
-    ByteArrayOutputStream out = new ByteArrayOutputStream();
-    if (writeJson) {
-      buildNoteJson(noteUtil, out);
-    } else {
-      buildNoteLegacy(noteUtil, out);
-    }
-    return out.toByteArray();
-  }
-
-  void putComment(Comment comment) {
-    checkArgument(!delete.contains(comment.key), "cannot both delete and put %s", comment.key);
-    put.put(comment.key, comment);
-  }
-
-  void deleteComment(Comment.Key key) {
-    checkArgument(!put.containsKey(key), "cannot both delete and put %s", key);
-    delete.add(key);
-  }
-
-  void setPushCertificate(String pushCert) {
-    this.pushCert = pushCert;
-  }
-
-  private ListMultimap<Integer, Comment> buildCommentMap() {
-    ListMultimap<Integer, Comment> all = MultimapBuilder.hashKeys().arrayListValues().build();
-
-    for (Comment c : baseComments) {
-      if (!delete.contains(c.key) && !put.containsKey(c.key)) {
-        all.put(c.key.patchSetId, c);
-      }
-    }
-    for (Comment c : put.values()) {
-      if (!delete.contains(c.key)) {
-        all.put(c.key.patchSetId, c);
-      }
-    }
-    return all;
-  }
-
-  private void buildNoteJson(ChangeNoteUtil noteUtil, OutputStream out) throws IOException {
-    ListMultimap<Integer, Comment> comments = buildCommentMap();
-    if (comments.isEmpty() && pushCert == null) {
-      return;
-    }
-
-    RevisionNoteData data = new RevisionNoteData();
-    data.comments = COMMENT_ORDER.sortedCopy(comments.values());
-    data.pushCert = pushCert;
-
-    try (OutputStreamWriter osw = new OutputStreamWriter(out, UTF_8)) {
-      noteUtil.getGson().toJson(data, osw);
-    }
-  }
-
-  private void buildNoteLegacy(ChangeNoteUtil noteUtil, OutputStream out) throws IOException {
-    if (pushCert != null) {
-      byte[] certBytes = pushCert.getBytes(UTF_8);
-      out.write(certBytes, 0, trimTrailingNewlines(certBytes));
-      out.write('\n');
-    }
-    noteUtil.buildNote(buildCommentMap(), out);
-  }
-
-  private static int trimTrailingNewlines(byte[] bytes) {
-    int p = bytes.length;
-    while (p > 1 && bytes[p - 1] == '\n') {
-      p--;
-    }
-    return p;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNoteMap.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNoteMap.java
deleted file mode 100644
index aa82d1a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNoteMap.java
+++ /dev/null
@@ -1,72 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.notedb;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.PatchLineComment;
-import com.google.gerrit.reviewdb.client.RevId;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.notes.Note;
-import org.eclipse.jgit.notes.NoteMap;
-
-class RevisionNoteMap<T extends RevisionNote<? extends Comment>> {
-  final NoteMap noteMap;
-  final ImmutableMap<RevId, T> revisionNotes;
-
-  static RevisionNoteMap<ChangeRevisionNote> parse(
-      ChangeNoteUtil noteUtil,
-      Change.Id changeId,
-      ObjectReader reader,
-      NoteMap noteMap,
-      PatchLineComment.Status status)
-      throws ConfigInvalidException, IOException {
-    Map<RevId, ChangeRevisionNote> result = new HashMap<>();
-    for (Note note : noteMap) {
-      ChangeRevisionNote rn =
-          new ChangeRevisionNote(noteUtil, changeId, reader, note.getData(), status);
-      rn.parse();
-      result.put(new RevId(note.name()), rn);
-    }
-    return new RevisionNoteMap<>(noteMap, ImmutableMap.copyOf(result));
-  }
-
-  static RevisionNoteMap<RobotCommentsRevisionNote> parseRobotComments(
-      ChangeNoteUtil noteUtil, ObjectReader reader, NoteMap noteMap)
-      throws ConfigInvalidException, IOException {
-    Map<RevId, RobotCommentsRevisionNote> result = new HashMap<>();
-    for (Note note : noteMap) {
-      RobotCommentsRevisionNote rn =
-          new RobotCommentsRevisionNote(noteUtil, reader, note.getData());
-      rn.parse();
-      result.put(new RevId(note.name()), rn);
-    }
-    return new RevisionNoteMap<>(noteMap, ImmutableMap.copyOf(result));
-  }
-
-  static <T extends RevisionNote<? extends Comment>> RevisionNoteMap<T> emptyMap() {
-    return new RevisionNoteMap<>(NoteMap.newEmptyMap(), ImmutableMap.<RevId, T>of());
-  }
-
-  private RevisionNoteMap(NoteMap noteMap, ImmutableMap<RevId, T> revisionNotes) {
-    this.noteMap = noteMap;
-    this.revisionNotes = revisionNotes;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RobotCommentNotes.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RobotCommentNotes.java
deleted file mode 100644
index 99d9615..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RobotCommentNotes.java
+++ /dev/null
@@ -1,111 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.notedb;
-
-import com.google.common.collect.ImmutableListMultimap;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.MultimapBuilder;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.client.RevId;
-import com.google.gerrit.reviewdb.client.RobotComment;
-import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.notes.NoteMap;
-import org.eclipse.jgit.revwalk.RevCommit;
-
-public class RobotCommentNotes extends AbstractChangeNotes<RobotCommentNotes> {
-  public interface Factory {
-    RobotCommentNotes create(Change change);
-  }
-
-  private final Change change;
-
-  private ImmutableListMultimap<RevId, RobotComment> comments;
-  private RevisionNoteMap<RobotCommentsRevisionNote> revisionNoteMap;
-  private ObjectId metaId;
-
-  @Inject
-  RobotCommentNotes(Args args, @Assisted Change change) {
-    super(args, change.getId(), PrimaryStorage.of(change), false);
-    this.change = change;
-  }
-
-  RevisionNoteMap<RobotCommentsRevisionNote> getRevisionNoteMap() {
-    return revisionNoteMap;
-  }
-
-  public ImmutableListMultimap<RevId, RobotComment> getComments() {
-    return comments;
-  }
-
-  public boolean containsComment(RobotComment c) {
-    for (RobotComment existing : comments.values()) {
-      if (c.key.equals(existing.key)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  @Override
-  public String getRefName() {
-    return RefNames.robotCommentsRef(getChangeId());
-  }
-
-  @Nullable
-  public ObjectId getMetaId() {
-    return metaId;
-  }
-
-  @Override
-  protected void onLoad(LoadHandle handle) throws IOException, ConfigInvalidException {
-    metaId = handle.id();
-    if (metaId == null) {
-      loadDefaults();
-      return;
-    }
-    metaId = metaId.copy();
-
-    RevCommit tipCommit = handle.walk().parseCommit(metaId);
-    ObjectReader reader = handle.walk().getObjectReader();
-    revisionNoteMap =
-        RevisionNoteMap.parseRobotComments(args.noteUtil, reader, NoteMap.read(reader, tipCommit));
-    ListMultimap<RevId, RobotComment> cs = MultimapBuilder.hashKeys().arrayListValues().build();
-    for (RobotCommentsRevisionNote rn : revisionNoteMap.revisionNotes.values()) {
-      for (RobotComment c : rn.getComments()) {
-        cs.put(new RevId(c.revId), c);
-      }
-    }
-    comments = ImmutableListMultimap.copyOf(cs);
-  }
-
-  @Override
-  protected void loadDefaults() {
-    comments = ImmutableListMultimap.of();
-  }
-
-  @Override
-  public Project.NameKey getProjectName() {
-    return change.getProject();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RobotCommentUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RobotCommentUpdate.java
deleted file mode 100644
index 82593eb..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RobotCommentUpdate.java
+++ /dev/null
@@ -1,239 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.notedb;
-
-import static com.google.common.base.MoreObjects.firstNonNull;
-import static com.google.gerrit.reviewdb.client.RefNames.robotCommentsRef;
-import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
-
-import com.google.common.collect.Sets;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RevId;
-import com.google.gerrit.reviewdb.client.RobotComment;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.config.AnonymousCowardName;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.assistedinject.Assisted;
-import com.google.inject.assistedinject.AssistedInject;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.notes.NoteMap;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-/**
- * A single delta to apply atomically to a change.
- *
- * <p>This delta contains only robot comments on a single patch set of a change by a single author.
- * This delta will become a single commit in the repository.
- *
- * <p>This class is not thread safe.
- */
-public class RobotCommentUpdate extends AbstractChangeUpdate {
-  public interface Factory {
-    RobotCommentUpdate create(
-        ChangeNotes notes,
-        @Assisted("effective") Account.Id accountId,
-        @Assisted("real") Account.Id realAccountId,
-        PersonIdent authorIdent,
-        Date when);
-
-    RobotCommentUpdate create(
-        Change change,
-        @Assisted("effective") Account.Id accountId,
-        @Assisted("real") Account.Id realAccountId,
-        PersonIdent authorIdent,
-        Date when);
-  }
-
-  private List<RobotComment> put = new ArrayList<>();
-
-  @AssistedInject
-  private RobotCommentUpdate(
-      @GerritServerConfig Config cfg,
-      @GerritPersonIdent PersonIdent serverIdent,
-      @AnonymousCowardName String anonymousCowardName,
-      NotesMigration migration,
-      ChangeNoteUtil noteUtil,
-      @Assisted ChangeNotes notes,
-      @Assisted("effective") Account.Id accountId,
-      @Assisted("real") Account.Id realAccountId,
-      @Assisted PersonIdent authorIdent,
-      @Assisted Date when) {
-    super(
-        cfg,
-        migration,
-        noteUtil,
-        serverIdent,
-        anonymousCowardName,
-        notes,
-        null,
-        accountId,
-        realAccountId,
-        authorIdent,
-        when);
-  }
-
-  @AssistedInject
-  private RobotCommentUpdate(
-      @GerritServerConfig Config cfg,
-      @GerritPersonIdent PersonIdent serverIdent,
-      @AnonymousCowardName String anonymousCowardName,
-      NotesMigration migration,
-      ChangeNoteUtil noteUtil,
-      @Assisted Change change,
-      @Assisted("effective") Account.Id accountId,
-      @Assisted("real") Account.Id realAccountId,
-      @Assisted PersonIdent authorIdent,
-      @Assisted Date when) {
-    super(
-        cfg,
-        migration,
-        noteUtil,
-        serverIdent,
-        anonymousCowardName,
-        null,
-        change,
-        accountId,
-        realAccountId,
-        authorIdent,
-        when);
-  }
-
-  public void putComment(RobotComment c) {
-    verifyComment(c);
-    put.add(c);
-  }
-
-  private CommitBuilder storeCommentsInNotes(
-      RevWalk rw, ObjectInserter ins, ObjectId curr, CommitBuilder cb)
-      throws ConfigInvalidException, OrmException, IOException {
-    RevisionNoteMap<RobotCommentsRevisionNote> rnm = getRevisionNoteMap(rw, curr);
-    Set<RevId> updatedRevs = Sets.newHashSetWithExpectedSize(rnm.revisionNotes.size());
-    RevisionNoteBuilder.Cache cache = new RevisionNoteBuilder.Cache(rnm);
-
-    for (RobotComment c : put) {
-      cache.get(new RevId(c.revId)).putComment(c);
-    }
-
-    Map<RevId, RevisionNoteBuilder> builders = cache.getBuilders();
-    boolean touchedAnyRevs = false;
-    boolean hasComments = false;
-    for (Map.Entry<RevId, RevisionNoteBuilder> e : builders.entrySet()) {
-      updatedRevs.add(e.getKey());
-      ObjectId id = ObjectId.fromString(e.getKey().get());
-      byte[] data = e.getValue().build(noteUtil, true);
-      if (!Arrays.equals(data, e.getValue().baseRaw)) {
-        touchedAnyRevs = true;
-      }
-      if (data.length == 0) {
-        rnm.noteMap.remove(id);
-      } else {
-        hasComments = true;
-        ObjectId dataBlob = ins.insert(OBJ_BLOB, data);
-        rnm.noteMap.set(id, dataBlob);
-      }
-    }
-
-    // If we didn't touch any notes, tell the caller this was a no-op update. We
-    // couldn't have done this in isEmpty() below because we hadn't read the old
-    // data yet.
-    if (!touchedAnyRevs) {
-      return NO_OP_UPDATE;
-    }
-
-    // If we touched every revision and there are no comments left, tell the
-    // caller to delete the entire ref.
-    boolean touchedAllRevs = updatedRevs.equals(rnm.revisionNotes.keySet());
-    if (touchedAllRevs && !hasComments) {
-      return null;
-    }
-
-    cb.setTreeId(rnm.noteMap.writeTree(ins));
-    return cb;
-  }
-
-  private RevisionNoteMap<RobotCommentsRevisionNote> getRevisionNoteMap(RevWalk rw, ObjectId curr)
-      throws ConfigInvalidException, OrmException, IOException {
-    if (curr.equals(ObjectId.zeroId())) {
-      return RevisionNoteMap.emptyMap();
-    }
-    if (migration.readChanges()) {
-      // If reading from changes is enabled, then the old RobotCommentNotes
-      // already parsed the revision notes. We can reuse them as long as the ref
-      // hasn't advanced.
-      ChangeNotes changeNotes = getNotes();
-      if (changeNotes != null) {
-        RobotCommentNotes robotCommentNotes = changeNotes.load().getRobotCommentNotes();
-        if (robotCommentNotes != null) {
-          ObjectId idFromNotes = firstNonNull(robotCommentNotes.getRevision(), ObjectId.zeroId());
-          RevisionNoteMap<RobotCommentsRevisionNote> rnm = robotCommentNotes.getRevisionNoteMap();
-          if (idFromNotes.equals(curr) && rnm != null) {
-            return rnm;
-          }
-        }
-      }
-    }
-    NoteMap noteMap;
-    if (!curr.equals(ObjectId.zeroId())) {
-      noteMap = NoteMap.read(rw.getObjectReader(), rw.parseCommit(curr));
-    } else {
-      noteMap = NoteMap.newEmptyMap();
-    }
-    // Even though reading from changes might not be enabled, we need to
-    // parse any existing revision notes so we can merge them.
-    return RevisionNoteMap.parseRobotComments(noteUtil, rw.getObjectReader(), noteMap);
-  }
-
-  @Override
-  protected CommitBuilder applyImpl(RevWalk rw, ObjectInserter ins, ObjectId curr)
-      throws OrmException, IOException {
-    CommitBuilder cb = new CommitBuilder();
-    cb.setMessage("Update robot comments");
-    try {
-      return storeCommentsInNotes(rw, ins, curr, cb);
-    } catch (ConfigInvalidException e) {
-      throw new OrmException(e);
-    }
-  }
-
-  @Override
-  protected Project.NameKey getProjectName() {
-    return getNotes().getProjectName();
-  }
-
-  @Override
-  protected String getRefName() {
-    return robotCommentsRef(getId());
-  }
-
-  @Override
-  public boolean isEmpty() {
-    return put.isEmpty();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RobotCommentsRevisionNote.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RobotCommentsRevisionNote.java
deleted file mode 100644
index aa229ab..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RobotCommentsRevisionNote.java
+++ /dev/null
@@ -1,44 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.notedb;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.gerrit.reviewdb.client.RobotComment;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.util.List;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectReader;
-
-public class RobotCommentsRevisionNote extends RevisionNote<RobotComment> {
-  private final ChangeNoteUtil noteUtil;
-
-  RobotCommentsRevisionNote(ChangeNoteUtil noteUtil, ObjectReader reader, ObjectId noteId) {
-    super(reader, noteId);
-    this.noteUtil = noteUtil;
-  }
-
-  @Override
-  protected List<RobotComment> parse(byte[] raw, int offset) throws IOException {
-    try (InputStream is = new ByteArrayInputStream(raw, offset, raw.length - offset);
-        Reader r = new InputStreamReader(is, UTF_8)) {
-      return noteUtil.getGson().fromJson(r, RobotCommentsRevisionNoteData.class).comments;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ChangeRebuilderImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ChangeRebuilderImpl.java
deleted file mode 100644
index cabe18f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ChangeRebuilderImpl.java
+++ /dev/null
@@ -1,692 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.notedb.rebuild;
-
-import static com.google.common.base.MoreObjects.firstNonNull;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.gerrit.reviewdb.client.RefNames.changeMetaRef;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_HASHTAGS;
-import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_PATCH_SET;
-import static java.util.concurrent.TimeUnit.SECONDS;
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.base.Splitter;
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.ImmutableCollection;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.Lists;
-import com.google.common.collect.MultimapBuilder;
-import com.google.common.collect.Ordering;
-import com.google.common.collect.Sets;
-import com.google.common.collect.Table;
-import com.google.common.primitives.Ints;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.PatchLineComment;
-import com.google.gerrit.reviewdb.client.PatchLineComment.Status;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.reviewdb.server.ReviewDbUtil;
-import com.google.gerrit.server.CommentsUtil;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.config.AnonymousCowardName;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.GerritServerId;
-import com.google.gerrit.server.notedb.ChangeBundle;
-import com.google.gerrit.server.notedb.ChangeBundleReader;
-import com.google.gerrit.server.notedb.ChangeDraftUpdate;
-import com.google.gerrit.server.notedb.ChangeNoteUtil;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.ChangeUpdate;
-import com.google.gerrit.server.notedb.NoteDbChangeState;
-import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
-import com.google.gerrit.server.notedb.NoteDbUpdateManager;
-import com.google.gerrit.server.notedb.NoteDbUpdateManager.OpenRepo;
-import com.google.gerrit.server.notedb.NoteDbUpdateManager.Result;
-import com.google.gerrit.server.notedb.NotesMigration;
-import com.google.gerrit.server.notedb.ReviewerStateInternal;
-import com.google.gerrit.server.patch.PatchListCache;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.update.ChainedReceiveCommands;
-import com.google.gwtorm.client.Key;
-import com.google.gwtorm.server.Access;
-import com.google.gwtorm.server.AtomicUpdate;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-import java.util.TreeMap;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.ReceiveCommand;
-
-public class ChangeRebuilderImpl extends ChangeRebuilder {
-  /**
-   * The maximum amount of time between the ReviewDb timestamp of the first and last events batched
-   * together into a single NoteDb update.
-   *
-   * <p>Used to account for the fact that different records with their own timestamps (e.g. {@link
-   * PatchSetApproval} and {@link ChangeMessage}) historically didn't necessarily use the same
-   * timestamp, and tended to call {@code System.currentTimeMillis()} independently.
-   */
-  public static final long MAX_WINDOW_MS = SECONDS.toMillis(3);
-
-  /**
-   * The maximum amount of time between two consecutive events to consider them to be in the same
-   * batch.
-   */
-  static final long MAX_DELTA_MS = SECONDS.toMillis(1);
-
-  private final AccountCache accountCache;
-  private final ChangeBundleReader bundleReader;
-  private final ChangeDraftUpdate.Factory draftUpdateFactory;
-  private final ChangeNoteUtil changeNoteUtil;
-  private final ChangeNotes.Factory notesFactory;
-  private final ChangeUpdate.Factory updateFactory;
-  private final CommentsUtil commentsUtil;
-  private final NoteDbUpdateManager.Factory updateManagerFactory;
-  private final NotesMigration migration;
-  private final PatchListCache patchListCache;
-  private final PersonIdent serverIdent;
-  private final ProjectCache projectCache;
-  private final String anonymousCowardName;
-  private final String serverId;
-  private final long skewMs;
-
-  @Inject
-  ChangeRebuilderImpl(
-      @GerritServerConfig Config cfg,
-      SchemaFactory<ReviewDb> schemaFactory,
-      AccountCache accountCache,
-      ChangeBundleReader bundleReader,
-      ChangeDraftUpdate.Factory draftUpdateFactory,
-      ChangeNoteUtil changeNoteUtil,
-      ChangeNotes.Factory notesFactory,
-      ChangeUpdate.Factory updateFactory,
-      CommentsUtil commentsUtil,
-      NoteDbUpdateManager.Factory updateManagerFactory,
-      NotesMigration migration,
-      PatchListCache patchListCache,
-      @GerritPersonIdent PersonIdent serverIdent,
-      @Nullable ProjectCache projectCache,
-      @AnonymousCowardName String anonymousCowardName,
-      @GerritServerId String serverId) {
-    super(schemaFactory);
-    this.accountCache = accountCache;
-    this.bundleReader = bundleReader;
-    this.draftUpdateFactory = draftUpdateFactory;
-    this.changeNoteUtil = changeNoteUtil;
-    this.notesFactory = notesFactory;
-    this.updateFactory = updateFactory;
-    this.commentsUtil = commentsUtil;
-    this.updateManagerFactory = updateManagerFactory;
-    this.migration = migration;
-    this.patchListCache = patchListCache;
-    this.serverIdent = serverIdent;
-    this.projectCache = projectCache;
-    this.anonymousCowardName = anonymousCowardName;
-    this.serverId = serverId;
-    this.skewMs = NoteDbChangeState.getReadOnlySkew(cfg);
-  }
-
-  @Override
-  public Result rebuild(ReviewDb db, Change.Id changeId) throws IOException, OrmException {
-    return rebuild(db, changeId, true);
-  }
-
-  @Override
-  public Result rebuildEvenIfReadOnly(ReviewDb db, Change.Id changeId)
-      throws IOException, OrmException {
-    return rebuild(db, changeId, false);
-  }
-
-  private Result rebuild(ReviewDb db, Change.Id changeId, boolean checkReadOnly)
-      throws IOException, OrmException {
-    db = ReviewDbUtil.unwrapDb(db);
-    // Read change just to get project; this instance is then discarded so we can read a consistent
-    // ChangeBundle inside a transaction.
-    Change change = db.changes().get(changeId);
-    if (change == null) {
-      throw new NoSuchChangeException(changeId);
-    }
-    try (NoteDbUpdateManager manager = updateManagerFactory.create(change.getProject())) {
-      buildUpdates(manager, bundleReader.fromReviewDb(db, changeId));
-      return execute(db, changeId, manager, checkReadOnly, true);
-    }
-  }
-
-  @Override
-  public Result rebuild(NoteDbUpdateManager manager, ChangeBundle bundle)
-      throws NoSuchChangeException, IOException, OrmException {
-    Change change = new Change(bundle.getChange());
-    buildUpdates(manager, bundle);
-    return manager.stageAndApplyDelta(change);
-  }
-
-  @Override
-  public NoteDbUpdateManager stage(ReviewDb db, Change.Id changeId)
-      throws IOException, OrmException {
-    db = ReviewDbUtil.unwrapDb(db);
-    Change change = checkNoteDbState(ChangeNotes.readOneReviewDbChange(db, changeId));
-    if (change == null) {
-      throw new NoSuchChangeException(changeId);
-    }
-    NoteDbUpdateManager manager = updateManagerFactory.create(change.getProject());
-    buildUpdates(manager, bundleReader.fromReviewDb(db, changeId));
-    manager.stage();
-    return manager;
-  }
-
-  @Override
-  public Result execute(ReviewDb db, Change.Id changeId, NoteDbUpdateManager manager)
-      throws OrmException, IOException {
-    return execute(db, changeId, manager, true, true);
-  }
-
-  public Result execute(
-      ReviewDb db,
-      Change.Id changeId,
-      NoteDbUpdateManager manager,
-      boolean checkReadOnly,
-      boolean executeManager)
-      throws OrmException, IOException {
-    db = ReviewDbUtil.unwrapDb(db);
-    Change change = checkNoteDbState(ChangeNotes.readOneReviewDbChange(db, changeId));
-    if (change == null) {
-      throw new NoSuchChangeException(changeId);
-    }
-
-    String oldNoteDbStateStr = change.getNoteDbState();
-    Result r = manager.stageAndApplyDelta(change);
-    String newNoteDbStateStr = change.getNoteDbState();
-    if (newNoteDbStateStr == null) {
-      throw new OrmException(
-          String.format(
-              "Rebuilding change %s produced no writes to NoteDb: %s",
-              changeId, bundleReader.fromReviewDb(db, changeId)));
-    }
-    NoteDbChangeState newNoteDbState =
-        checkNotNull(NoteDbChangeState.parse(changeId, newNoteDbStateStr));
-    try {
-      db.changes()
-          .atomicUpdate(
-              changeId,
-              new AtomicUpdate<Change>() {
-                @Override
-                public Change update(Change change) {
-                  if (checkReadOnly) {
-                    NoteDbChangeState.checkNotReadOnly(change, skewMs);
-                  }
-                  String currNoteDbStateStr = change.getNoteDbState();
-                  if (Objects.equals(currNoteDbStateStr, newNoteDbStateStr)) {
-                    // Another thread completed the same rebuild we were about to.
-                    throw new AbortUpdateException();
-                  } else if (!Objects.equals(oldNoteDbStateStr, currNoteDbStateStr)) {
-                    // Another thread updated the state to something else.
-                    throw new ConflictingUpdateRuntimeException(change, oldNoteDbStateStr);
-                  }
-                  change.setNoteDbState(newNoteDbStateStr);
-                  return change;
-                }
-              });
-    } catch (ConflictingUpdateRuntimeException e) {
-      // Rethrow as an OrmException so the caller knows to use staged results. Strictly speaking
-      // they are not completely up to date, but result we send to the caller is the same as if this
-      // rebuild had executed before the other thread.
-      throw new ConflictingUpdateException(e);
-    } catch (AbortUpdateException e) {
-      if (newNoteDbState.isUpToDate(
-          manager.getChangeRepo().cmds.getRepoRefCache(),
-          manager.getAllUsersRepo().cmds.getRepoRefCache())) {
-        // If the state in ReviewDb matches NoteDb at this point, it means another thread
-        // successfully completed this rebuild. It's ok to not execute the update in this case,
-        // since the object referenced in the Result was flushed to the repo by whatever thread won
-        // the race.
-        return r;
-      }
-      // If the state doesn't match, that means another thread attempted this rebuild, but
-      // failed. Fall through and try to update the ref again.
-    }
-    if (migration.failChangeWrites()) {
-      // Don't even attempt to execute if read-only, it would fail anyway. But do throw an exception
-      // to the caller so they know to use the staged results instead of reading from the repo.
-      throw new OrmException(NoteDbUpdateManager.CHANGES_READ_ONLY);
-    }
-    if (executeManager) {
-      manager.execute();
-    }
-    return r;
-  }
-
-  static Change checkNoteDbState(Change c) throws OrmException {
-    // Can only rebuild a change if its primary storage is ReviewDb.
-    NoteDbChangeState s = NoteDbChangeState.parse(c);
-    if (s != null && s.getPrimaryStorage() != PrimaryStorage.REVIEW_DB) {
-      throw new OrmException(String.format("cannot rebuild change %s with state %s", c.getId(), s));
-    }
-    return c;
-  }
-
-  @Override
-  public void buildUpdates(NoteDbUpdateManager manager, ChangeBundle bundle)
-      throws IOException, OrmException {
-    manager.setCheckExpectedState(false).setRefLogMessage("Rebuilding change");
-    Change change = new Change(bundle.getChange());
-    if (bundle.getPatchSets().isEmpty()) {
-      throw new NoPatchSetsException(change.getId());
-    }
-    if (change.getLastUpdatedOn().compareTo(change.getCreatedOn()) < 0) {
-      // A bug in data migration might set created_on to the time of the migration. The
-      // correct timestamps were lost, but we can at least set it so created_on is not after
-      // last_updated_on.
-      // See https://bugs.chromium.org/p/gerrit/issues/detail?id=7397
-      change.setCreatedOn(change.getLastUpdatedOn());
-    }
-
-    // We will rebuild all events, except for draft comments, in buckets based on author and
-    // timestamp.
-    List<Event> events = new ArrayList<>();
-    ListMultimap<Account.Id, DraftCommentEvent> draftCommentEvents =
-        MultimapBuilder.hashKeys().arrayListValues().build();
-
-    events.addAll(getHashtagsEvents(change, manager));
-
-    // Delete ref only after hashtags have been read.
-    deleteChangeMetaRef(change, manager.getChangeRepo().cmds);
-    deleteDraftRefs(change, manager.getAllUsersRepo());
-
-    Integer minPsNum = getMinPatchSetNum(bundle);
-    TreeMap<PatchSet.Id, PatchSetEvent> patchSetEvents =
-        new TreeMap<>(ReviewDbUtil.intKeyOrdering());
-
-    for (PatchSet ps : bundle.getPatchSets()) {
-      PatchSetEvent pse = new PatchSetEvent(change, ps, manager.getChangeRepo().rw);
-      patchSetEvents.put(ps.getId(), pse);
-      events.add(pse);
-      for (Comment c : getComments(bundle, serverId, Status.PUBLISHED, ps)) {
-        CommentEvent e = new CommentEvent(c, change, ps, patchListCache);
-        events.add(e.addDep(pse));
-      }
-      for (Comment c : getComments(bundle, serverId, Status.DRAFT, ps)) {
-        DraftCommentEvent e = new DraftCommentEvent(c, change, ps, patchListCache);
-        draftCommentEvents.put(c.author.getId(), e);
-      }
-    }
-    ensurePatchSetOrder(patchSetEvents);
-
-    for (PatchSetApproval psa : bundle.getPatchSetApprovals()) {
-      PatchSetEvent pse = patchSetEvents.get(psa.getPatchSetId());
-      if (pse != null) {
-        events.add(new ApprovalEvent(psa, change.getCreatedOn()).addDep(pse));
-      }
-    }
-
-    for (Table.Cell<ReviewerStateInternal, Account.Id, Timestamp> r :
-        bundle.getReviewers().asTable().cellSet()) {
-      events.add(new ReviewerEvent(r, change.getCreatedOn()));
-    }
-
-    Change noteDbChange = new Change(null, null, null, null, null);
-    for (ChangeMessage msg : bundle.getChangeMessages()) {
-      Event msgEvent = new ChangeMessageEvent(change, noteDbChange, msg, change.getCreatedOn());
-      if (msg.getPatchSetId() != null) {
-        PatchSetEvent pse = patchSetEvents.get(msg.getPatchSetId());
-        if (pse == null) {
-          continue; // Ignore events for missing patch sets.
-        }
-        msgEvent.addDep(pse);
-      }
-      events.add(msgEvent);
-    }
-
-    sortAndFillEvents(change, noteDbChange, bundle.getPatchSets(), events, minPsNum);
-
-    EventList<Event> el = new EventList<>();
-    for (Event e : events) {
-      if (!el.canAdd(e)) {
-        flushEventsToUpdate(manager, el, change);
-        checkState(el.canAdd(e));
-      }
-      el.add(e);
-    }
-    flushEventsToUpdate(manager, el, change);
-
-    EventList<DraftCommentEvent> plcel = new EventList<>();
-    for (Account.Id author : draftCommentEvents.keys()) {
-      for (DraftCommentEvent e : Ordering.natural().sortedCopy(draftCommentEvents.get(author))) {
-        if (!plcel.canAdd(e)) {
-          flushEventsToDraftUpdate(manager, plcel, change);
-          checkState(plcel.canAdd(e));
-        }
-        plcel.add(e);
-      }
-      flushEventsToDraftUpdate(manager, plcel, change);
-    }
-  }
-
-  private static Integer getMinPatchSetNum(ChangeBundle bundle) {
-    Integer minPsNum = null;
-    for (PatchSet ps : bundle.getPatchSets()) {
-      int n = ps.getId().get();
-      if (minPsNum == null || n < minPsNum) {
-        minPsNum = n;
-      }
-    }
-    return minPsNum;
-  }
-
-  private static void ensurePatchSetOrder(TreeMap<PatchSet.Id, PatchSetEvent> events) {
-    if (events.isEmpty()) {
-      return;
-    }
-    Iterator<PatchSetEvent> it = events.values().iterator();
-    PatchSetEvent curr = it.next();
-    while (it.hasNext()) {
-      PatchSetEvent next = it.next();
-      next.addDep(curr);
-      curr = next;
-    }
-  }
-
-  private static List<Comment> getComments(
-      ChangeBundle bundle, String serverId, PatchLineComment.Status status, PatchSet ps) {
-    return bundle.getPatchLineComments().stream()
-        .filter(c -> c.getPatchSetId().equals(ps.getId()) && c.getStatus() == status)
-        .map(plc -> plc.asComment(serverId))
-        .sorted(CommentsUtil.COMMENT_ORDER)
-        .collect(toList());
-  }
-
-  private void sortAndFillEvents(
-      Change change,
-      Change noteDbChange,
-      ImmutableCollection<PatchSet> patchSets,
-      List<Event> events,
-      Integer minPsNum) {
-    Event finalUpdates = new FinalUpdatesEvent(change, noteDbChange, patchSets);
-    events.add(finalUpdates);
-    setPostSubmitDeps(events);
-    new EventSorter(events).sort();
-
-    // Ensure the first event in the list creates the change, setting the author and any required
-    // footers. Also force the creation time of the first patch set to match the creation time of
-    // the change.
-    Event first = events.get(0);
-    if (first instanceof PatchSetEvent && change.getOwner().equals(first.user)) {
-      first.when = change.getCreatedOn();
-      ((PatchSetEvent) first).createChange = true;
-    } else {
-      events.add(0, new CreateChangeEvent(change, minPsNum));
-    }
-
-    // Final pass to correct some inconsistencies.
-    //
-    // First, fill in any missing patch set IDs using the latest patch set of the change at the time
-    // of the event, because NoteDb can't represent actions with no associated patch set ID. This
-    // workaround is as if a user added a ChangeMessage on the change by replying from the latest
-    // patch set.
-    //
-    // Start with the first patch set that actually exists. If there are no patch sets at all,
-    // minPsNum will be null, so just bail and use 1 as the patch set ID.
-    //
-    // Second, ensure timestamps are nondecreasing, by copying the previous timestamp if this
-    // happens. This assumes that the only way this can happen is due to dependency constraints, and
-    // it is ok to give an event the same timestamp as one of its dependencies.
-    int ps = firstNonNull(minPsNum, 1);
-    for (int i = 0; i < events.size(); i++) {
-      Event e = events.get(i);
-      if (e.psId == null) {
-        e.psId = new PatchSet.Id(change.getId(), ps);
-      } else {
-        ps = Math.max(ps, e.psId.get());
-      }
-
-      if (i > 0) {
-        Event p = events.get(i - 1);
-        if (e.when.before(p.when)) {
-          e.when = p.when;
-        }
-      }
-    }
-  }
-
-  private void setPostSubmitDeps(List<Event> events) {
-    Optional<Event> submitEvent =
-        Lists.reverse(events).stream().filter(Event::isSubmit).findFirst();
-    if (submitEvent.isPresent()) {
-      events.stream().filter(Event::isPostSubmitApproval).forEach(e -> e.addDep(submitEvent.get()));
-    }
-  }
-
-  private void flushEventsToUpdate(
-      NoteDbUpdateManager manager, EventList<Event> events, Change change)
-      throws OrmException, IOException {
-    if (events.isEmpty()) {
-      return;
-    }
-    Comparator<String> labelNameComparator;
-    if (projectCache != null) {
-      labelNameComparator = projectCache.get(change.getProject()).getLabelTypes().nameComparator();
-    } else {
-      // No project cache available, bail and use natural ordering; there's no semantic difference
-      // anyway difference.
-      labelNameComparator = Ordering.natural();
-    }
-    ChangeUpdate update =
-        updateFactory.create(
-            change,
-            events.getAccountId(),
-            events.getRealAccountId(),
-            newAuthorIdent(events),
-            events.getWhen(),
-            labelNameComparator);
-    update.setAllowWriteToNewRef(true);
-    update.setPatchSetId(events.getPatchSetId());
-    update.setTag(events.getTag());
-    for (Event e : events) {
-      e.apply(update);
-    }
-    manager.add(update);
-    events.clear();
-  }
-
-  private void flushEventsToDraftUpdate(
-      NoteDbUpdateManager manager, EventList<DraftCommentEvent> events, Change change) {
-    if (events.isEmpty()) {
-      return;
-    }
-    ChangeDraftUpdate update =
-        draftUpdateFactory.create(
-            change,
-            events.getAccountId(),
-            events.getRealAccountId(),
-            newAuthorIdent(events),
-            events.getWhen());
-    update.setPatchSetId(events.getPatchSetId());
-    for (DraftCommentEvent e : events) {
-      e.applyDraft(update);
-    }
-    manager.add(update);
-    events.clear();
-  }
-
-  private PersonIdent newAuthorIdent(EventList<?> events) {
-    Account.Id id = events.getAccountId();
-    if (id == null) {
-      return new PersonIdent(serverIdent, events.getWhen());
-    }
-    return changeNoteUtil.newIdent(
-        accountCache.get(id).getAccount(), events.getWhen(), serverIdent, anonymousCowardName);
-  }
-
-  private List<HashtagsEvent> getHashtagsEvents(Change change, NoteDbUpdateManager manager)
-      throws IOException {
-    String refName = changeMetaRef(change.getId());
-    Optional<ObjectId> old = manager.getChangeRepo().getObjectId(refName);
-    if (!old.isPresent()) {
-      return Collections.emptyList();
-    }
-
-    RevWalk rw = manager.getChangeRepo().rw;
-    List<HashtagsEvent> events = new ArrayList<>();
-    rw.reset();
-    rw.markStart(rw.parseCommit(old.get()));
-    for (RevCommit commit : rw) {
-      Account.Id authorId;
-      try {
-        authorId = changeNoteUtil.parseIdent(commit.getAuthorIdent(), change.getId());
-      } catch (ConfigInvalidException e) {
-        continue; // Corrupt data, no valid hashtags in this commit.
-      }
-      PatchSet.Id psId = parsePatchSetId(change, commit);
-      Set<String> hashtags = parseHashtags(commit);
-      if (authorId == null || psId == null || hashtags == null) {
-        continue;
-      }
-
-      Timestamp commitTime = new Timestamp(commit.getCommitterIdent().getWhen().getTime());
-      events.add(new HashtagsEvent(psId, authorId, commitTime, hashtags, change.getCreatedOn()));
-    }
-    return events;
-  }
-
-  private Set<String> parseHashtags(RevCommit commit) {
-    List<String> hashtagsLines = commit.getFooterLines(FOOTER_HASHTAGS);
-    if (hashtagsLines.isEmpty() || hashtagsLines.size() > 1) {
-      return null;
-    }
-
-    if (hashtagsLines.get(0).isEmpty()) {
-      return ImmutableSet.of();
-    }
-    return Sets.newHashSet(Splitter.on(',').split(hashtagsLines.get(0)));
-  }
-
-  private PatchSet.Id parsePatchSetId(Change change, RevCommit commit) {
-    List<String> psIdLines = commit.getFooterLines(FOOTER_PATCH_SET);
-    if (psIdLines.size() != 1) {
-      return null;
-    }
-    Integer psId = Ints.tryParse(psIdLines.get(0));
-    if (psId == null) {
-      return null;
-    }
-    return new PatchSet.Id(change.getId(), psId);
-  }
-
-  private void deleteChangeMetaRef(Change change, ChainedReceiveCommands cmds) throws IOException {
-    String refName = changeMetaRef(change.getId());
-    Optional<ObjectId> old = cmds.get(refName);
-    if (old.isPresent()) {
-      cmds.add(new ReceiveCommand(old.get(), ObjectId.zeroId(), refName));
-    }
-  }
-
-  private void deleteDraftRefs(Change change, OpenRepo allUsersRepo) throws IOException {
-    for (Ref r :
-        allUsersRepo
-            .repo
-            .getRefDatabase()
-            .getRefs(RefNames.refsDraftCommentsPrefix(change.getId()))
-            .values()) {
-      allUsersRepo.cmds.add(new ReceiveCommand(r.getObjectId(), ObjectId.zeroId(), r.getName()));
-    }
-  }
-
-  static void createChange(ChangeUpdate update, Change change) {
-    update.setSubjectForCommit("Create change");
-    update.setChangeId(change.getKey().get());
-    update.setBranch(change.getDest().get());
-    update.setSubject(change.getOriginalSubject());
-    if (change.getRevertOf() != null) {
-      update.setRevertOf(change.getRevertOf().get());
-    }
-  }
-
-  @Override
-  public void rebuildReviewDb(ReviewDb db, Project.NameKey project, Change.Id changeId)
-      throws OrmException {
-    // TODO(dborowitz): Fail fast if changes tables are disabled in ReviewDb.
-    ChangeNotes notes = notesFactory.create(db, project, changeId);
-    ChangeBundle bundle = ChangeBundle.fromNotes(commentsUtil, notes);
-
-    db = ReviewDbUtil.unwrapDb(db);
-    db.changes().beginTransaction(changeId);
-    try {
-      Change c = db.changes().get(changeId);
-      if (c != null) {
-        PrimaryStorage ps = PrimaryStorage.of(c);
-        switch (ps) {
-          case REVIEW_DB:
-            return; // Nothing to do.
-          case NOTE_DB:
-            break; // Continue and rebuild.
-          default:
-            throw new OrmException("primary storage of " + changeId + " is " + ps);
-        }
-      } else {
-        c = notes.getChange();
-      }
-      db.changes().upsert(Collections.singleton(c));
-      putExactlyEntities(
-          db.changeMessages(), db.changeMessages().byChange(c.getId()), bundle.getChangeMessages());
-      putExactlyEntities(db.patchSets(), db.patchSets().byChange(c.getId()), bundle.getPatchSets());
-      putExactlyEntities(
-          db.patchSetApprovals(),
-          db.patchSetApprovals().byChange(c.getId()),
-          bundle.getPatchSetApprovals());
-      putExactlyEntities(
-          db.patchComments(),
-          db.patchComments().byChange(c.getId()),
-          bundle.getPatchLineComments());
-      db.commit();
-    } finally {
-      db.rollback();
-    }
-  }
-
-  private static <T, K extends Key<?>> void putExactlyEntities(
-      Access<T, K> access, Iterable<T> existing, Collection<T> ents) throws OrmException {
-    Set<K> toKeep = access.toMap(ents).keySet();
-    access.delete(
-        FluentIterable.from(existing).filter(e -> !toKeep.contains(access.primaryKey(e))));
-    access.upsert(ents);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/CommentEvent.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/CommentEvent.java
deleted file mode 100644
index 1fffab4..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/CommentEvent.java
+++ /dev/null
@@ -1,85 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.notedb.rebuild;
-
-import static com.google.gerrit.server.CommentsUtil.setCommentRevId;
-
-import com.google.common.base.MoreObjects.ToStringHelper;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.PatchLineComment;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.server.CommentsUtil;
-import com.google.gerrit.server.notedb.ChangeUpdate;
-import com.google.gerrit.server.patch.PatchListCache;
-import com.google.gerrit.server.patch.PatchListNotAvailableException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-class CommentEvent extends Event {
-  private static final Logger log = LoggerFactory.getLogger(CommentEvent.class);
-
-  public final Comment c;
-  private final Change change;
-  private final PatchSet ps;
-  private final PatchListCache cache;
-
-  CommentEvent(Comment c, Change change, PatchSet ps, PatchListCache cache) {
-    super(
-        CommentsUtil.getCommentPsId(change.getId(), c),
-        c.author.getId(),
-        c.getRealAuthor().getId(),
-        c.writtenOn,
-        change.getCreatedOn(),
-        c.tag);
-    this.c = c;
-    this.change = change;
-    this.ps = ps;
-    this.cache = cache;
-  }
-
-  @Override
-  boolean uniquePerUpdate() {
-    return false;
-  }
-
-  @Override
-  protected boolean canHaveTag() {
-    return true;
-  }
-
-  @Override
-  void apply(ChangeUpdate update) {
-    checkUpdate(update);
-    if (c.revId == null) {
-      try {
-        setCommentRevId(c, cache, change, ps);
-      } catch (PatchListNotAvailableException e) {
-        log.warn(
-            "Unable to determine parent commit of patch set {} ({}); omitting inline comment {}",
-            ps.getId(),
-            ps.getRevision(),
-            c);
-        return;
-      }
-    }
-    update.putComment(PatchLineComment.Status.PUBLISHED, c);
-  }
-
-  @Override
-  protected void addToString(ToStringHelper helper) {
-    helper.add("message", c.message);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/DraftCommentEvent.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/DraftCommentEvent.java
deleted file mode 100644
index 3bc3a58..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/DraftCommentEvent.java
+++ /dev/null
@@ -1,83 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.notedb.rebuild;
-
-import static com.google.gerrit.server.CommentsUtil.setCommentRevId;
-
-import com.google.common.base.MoreObjects.ToStringHelper;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.server.CommentsUtil;
-import com.google.gerrit.server.notedb.ChangeDraftUpdate;
-import com.google.gerrit.server.notedb.ChangeUpdate;
-import com.google.gerrit.server.patch.PatchListCache;
-import com.google.gerrit.server.patch.PatchListNotAvailableException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-class DraftCommentEvent extends Event {
-  private static final Logger log = LoggerFactory.getLogger(DraftCommentEvent.class);
-
-  public final Comment c;
-  private final Change change;
-  private final PatchSet ps;
-  private final PatchListCache cache;
-
-  DraftCommentEvent(Comment c, Change change, PatchSet ps, PatchListCache cache) {
-    super(
-        CommentsUtil.getCommentPsId(change.getId(), c),
-        c.author.getId(),
-        c.getRealAuthor().getId(),
-        c.writtenOn,
-        change.getCreatedOn(),
-        c.tag);
-    this.c = c;
-    this.change = change;
-    this.ps = ps;
-    this.cache = cache;
-  }
-
-  @Override
-  boolean uniquePerUpdate() {
-    return false;
-  }
-
-  @Override
-  void apply(ChangeUpdate update) {
-    throw new UnsupportedOperationException();
-  }
-
-  void applyDraft(ChangeDraftUpdate draftUpdate) {
-    if (c.revId == null) {
-      try {
-        setCommentRevId(c, cache, change, ps);
-      } catch (PatchListNotAvailableException e) {
-        log.warn(
-            "Unable to determine parent commit of patch set {} ({}); omitting draft inline comment",
-            ps.getId(),
-            ps.getRevision(),
-            c);
-        return;
-      }
-    }
-    draftUpdate.putComment(c);
-  }
-
-  @Override
-  protected void addToString(ToStringHelper helper) {
-    helper.add("message", c.message);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/EventList.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/EventList.java
deleted file mode 100644
index 773215e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/EventList.java
+++ /dev/null
@@ -1,170 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.notedb.rebuild;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-
-import com.google.common.collect.Lists;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.Objects;
-
-class EventList<E extends Event> implements Iterable<E> {
-  private final ArrayList<E> list = new ArrayList<>();
-  private boolean isSubmit;
-
-  @Override
-  public Iterator<E> iterator() {
-    return list.iterator();
-  }
-
-  void add(E e) {
-    list.add(e);
-    if (e.isSubmit()) {
-      isSubmit = true;
-    }
-  }
-
-  void clear() {
-    list.clear();
-    isSubmit = false;
-  }
-
-  boolean isEmpty() {
-    return list.isEmpty();
-  }
-
-  boolean canAdd(E e) {
-    if (isEmpty()) {
-      return true;
-    }
-    if (e instanceof FinalUpdatesEvent) {
-      return false; // FinalUpdatesEvent always gets its own update.
-    }
-
-    Event last = getLast();
-    if (!Objects.equals(e.user, last.user)
-        || !Objects.equals(e.realUser, last.realUser)
-        || !e.psId.equals(last.psId)) {
-      return false; // Different patch set or author.
-    }
-    if (e.canHaveTag() && canHaveTag() && !Objects.equals(e.tag, getTag())) {
-      // We should trust the tag field, and it doesn't match.
-      return false;
-    }
-    if (e.isPostSubmitApproval() && isSubmit) {
-      // Post-submit approvals must come after the update that submits.
-      return false;
-    }
-
-    long t = e.when.getTime();
-    long tFirst = getFirstTime();
-    long tLast = getLastTime();
-    checkArgument(t >= tLast, "event %s is before previous event in list %s", e, last);
-    if (t - tLast > ChangeRebuilderImpl.MAX_DELTA_MS
-        || t - tFirst > ChangeRebuilderImpl.MAX_WINDOW_MS) {
-      return false; // Too much time elapsed.
-    }
-
-    if (!e.uniquePerUpdate()) {
-      return true;
-    }
-    for (Event o : this) {
-      if (e.getClass() == o.getClass()) {
-        return false; // Only one event of this type allowed per update.
-      }
-    }
-
-    // TODO(dborowitz): Additional heuristics, like keeping events separate if
-    // they affect overlapping fields within a single entity.
-
-    return true;
-  }
-
-  Timestamp getWhen() {
-    return get(0).when;
-  }
-
-  PatchSet.Id getPatchSetId() {
-    PatchSet.Id id = checkNotNull(get(0).psId);
-    for (int i = 1; i < size(); i++) {
-      checkState(
-          get(i).psId.equals(id), "mismatched patch sets in EventList: %s != %s", id, get(i).psId);
-    }
-    return id;
-  }
-
-  Account.Id getAccountId() {
-    Account.Id id = get(0).user;
-    for (int i = 1; i < size(); i++) {
-      checkState(
-          Objects.equals(id, get(i).user),
-          "mismatched users in EventList: %s != %s",
-          id,
-          get(i).user);
-    }
-    return id;
-  }
-
-  Account.Id getRealAccountId() {
-    Account.Id id = get(0).realUser;
-    for (int i = 1; i < size(); i++) {
-      checkState(
-          Objects.equals(id, get(i).realUser),
-          "mismatched real users in EventList: %s != %s",
-          id,
-          get(i).realUser);
-    }
-    return id;
-  }
-
-  String getTag() {
-    for (E e : Lists.reverse(list)) {
-      if (e.tag != null) {
-        return e.tag;
-      }
-    }
-    return null;
-  }
-
-  private boolean canHaveTag() {
-    return list.stream().anyMatch(Event::canHaveTag);
-  }
-
-  private E get(int i) {
-    return list.get(i);
-  }
-
-  private int size() {
-    return list.size();
-  }
-
-  private E getLast() {
-    return list.get(list.size() - 1);
-  }
-
-  private long getLastTime() {
-    return getLast().when.getTime();
-  }
-
-  private long getFirstTime() {
-    return list.get(0).when.getTime();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/GcAllUsers.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/GcAllUsers.java
deleted file mode 100644
index 0653192..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/GcAllUsers.java
+++ /dev/null
@@ -1,122 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.notedb.rebuild;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_GC_SECTION;
-import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_AUTO;
-
-import com.google.common.base.Throwables;
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.data.GarbageCollectionResult;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.git.GarbageCollection;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.LocalDiskRepositoryManager;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.function.Consumer;
-import org.eclipse.jgit.lib.Repository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class GcAllUsers {
-  private static final Logger log = LoggerFactory.getLogger(GcAllUsers.class);
-
-  private final AllUsersName allUsers;
-  private final GarbageCollection.Factory gcFactory;
-  private final GitRepositoryManager repoManager;
-
-  @Inject
-  GcAllUsers(
-      AllUsersName allUsers,
-      GarbageCollection.Factory gcFactory,
-      GitRepositoryManager repoManager) {
-    this.allUsers = allUsers;
-    this.gcFactory = gcFactory;
-    this.repoManager = repoManager;
-  }
-
-  public void runWithLogger() {
-    // Print log messages using logger, and skip progress.
-    run(s -> log.info(s), null);
-  }
-
-  public void run(PrintWriter writer) {
-    // Print both log messages and progress to given writer.
-    run(checkNotNull(writer)::println, writer);
-  }
-
-  private void run(Consumer<String> logOneLine, @Nullable PrintWriter progressWriter) {
-    if (!(repoManager instanceof LocalDiskRepositoryManager)) {
-      logOneLine.accept("Skipping GC of " + allUsers + "; not a local disk repo");
-      return;
-    }
-    if (!enableAutoGc(logOneLine)) {
-      logOneLine.accept(
-          "Skipping GC of "
-              + allUsers
-              + " due to disabling "
-              + CONFIG_GC_SECTION
-              + "."
-              + CONFIG_KEY_AUTO);
-      logOneLine.accept(
-          "If loading accounts is slow after the NoteDb migration, run `git gc` on "
-              + allUsers
-              + " manually");
-      return;
-    }
-
-    if (progressWriter == null) {
-      // Mimic log line from GarbageCollection.
-      logOneLine.accept("collecting garbage for \"" + allUsers + "\":\n");
-    }
-    GarbageCollectionResult result =
-        gcFactory.create().run(ImmutableList.of(allUsers), progressWriter);
-    if (!result.hasErrors()) {
-      return;
-    }
-    for (GarbageCollectionResult.Error e : result.getErrors()) {
-      switch (e.getType()) {
-        case GC_ALREADY_SCHEDULED:
-          logOneLine.accept("GC already scheduled for " + e.getProjectName());
-          break;
-        case GC_FAILED:
-          logOneLine.accept("GC failed for " + e.getProjectName());
-          break;
-        case REPOSITORY_NOT_FOUND:
-          logOneLine.accept(e.getProjectName() + " repo not found");
-          break;
-        default:
-          logOneLine.accept("GC failed for " + e.getProjectName() + ": " + e.getType());
-          break;
-      }
-    }
-  }
-
-  private boolean enableAutoGc(Consumer<String> logOneLine) {
-    try (Repository repo = repoManager.openRepository(allUsers)) {
-      return repo.getConfig().getInt(CONFIG_GC_SECTION, CONFIG_KEY_AUTO, -1) != 0;
-    } catch (IOException e) {
-      logOneLine.accept(
-          "Error reading config for " + allUsers + ":\n" + Throwables.getStackTraceAsString(e));
-      return false;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/NoteDbMigrator.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/NoteDbMigrator.java
deleted file mode 100644
index efff338..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/NoteDbMigrator.java
+++ /dev/null
@@ -1,1054 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.notedb.rebuild;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.gerrit.reviewdb.server.ReviewDbUtil.unwrapDb;
-import static com.google.gerrit.server.notedb.NotesMigration.SECTION_NOTE_DB;
-import static com.google.gerrit.server.notedb.NotesMigrationState.NOTE_DB;
-import static com.google.gerrit.server.notedb.NotesMigrationState.READ_WRITE_NO_SEQUENCE;
-import static com.google.gerrit.server.notedb.NotesMigrationState.READ_WRITE_WITH_SEQUENCE_NOTE_DB_PRIMARY;
-import static com.google.gerrit.server.notedb.NotesMigrationState.READ_WRITE_WITH_SEQUENCE_REVIEW_DB_PRIMARY;
-import static com.google.gerrit.server.notedb.NotesMigrationState.WRITE;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.Comparator.comparing;
-import static java.util.stream.Collectors.joining;
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Stopwatch;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableListMultimap;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.MultimapBuilder;
-import com.google.common.collect.Ordering;
-import com.google.common.collect.SetMultimap;
-import com.google.common.collect.Streams;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.ListeningExecutorService;
-import com.google.common.util.concurrent.MoreExecutors;
-import com.google.gerrit.common.FormatUtil;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.reviewdb.server.ReviewDbWrapper;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.InternalUser;
-import com.google.gerrit.server.Sequences;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.config.GerritServerConfigProvider;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.LockFailureException;
-import com.google.gerrit.server.git.WorkQueue;
-import com.google.gerrit.server.notedb.ChangeBundleReader;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.MutableNotesMigration;
-import com.google.gerrit.server.notedb.NoteDbTable;
-import com.google.gerrit.server.notedb.NoteDbUpdateManager;
-import com.google.gerrit.server.notedb.NotesMigrationState;
-import com.google.gerrit.server.notedb.PrimaryStorageMigrator;
-import com.google.gerrit.server.notedb.PrimaryStorageMigrator.NoNoteDbStateException;
-import com.google.gerrit.server.notedb.RepoSequence;
-import com.google.gerrit.server.notedb.rebuild.ChangeRebuilder.NoPatchSetsException;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.update.ChainedReceiveCommands;
-import com.google.gerrit.server.update.RefUpdateUtil;
-import com.google.gerrit.server.util.ManualRequestContext;
-import com.google.gerrit.server.util.ThreadLocalRequestContext;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Optional;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.function.Consumer;
-import java.util.function.Predicate;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.internal.storage.file.FileRepository;
-import org.eclipse.jgit.internal.storage.file.PackInserter;
-import org.eclipse.jgit.lib.BatchRefUpdate;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.ProgressMonitor;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.lib.TextProgressMonitor;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.storage.file.FileBasedConfig;
-import org.eclipse.jgit.transport.ReceiveCommand;
-import org.eclipse.jgit.util.FS;
-import org.eclipse.jgit.util.io.NullOutputStream;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** One stop shop for migrating a site's change storage from ReviewDb to NoteDb. */
-public class NoteDbMigrator implements AutoCloseable {
-  private static final Logger log = LoggerFactory.getLogger(NoteDbMigrator.class);
-
-  private static final String AUTO_MIGRATE = "autoMigrate";
-  private static final String TRIAL = "trial";
-
-  public static boolean getAutoMigrate(Config cfg) {
-    return cfg.getBoolean(SECTION_NOTE_DB, NoteDbTable.CHANGES.key(), AUTO_MIGRATE, false);
-  }
-
-  private static void setAutoMigrate(Config cfg, boolean autoMigrate) {
-    cfg.setBoolean(SECTION_NOTE_DB, NoteDbTable.CHANGES.key(), AUTO_MIGRATE, autoMigrate);
-  }
-
-  public static boolean getTrialMode(Config cfg) {
-    return cfg.getBoolean(SECTION_NOTE_DB, NoteDbTable.CHANGES.key(), TRIAL, false);
-  }
-
-  public static void setTrialMode(Config cfg, boolean trial) {
-    cfg.setBoolean(SECTION_NOTE_DB, NoteDbTable.CHANGES.key(), TRIAL, trial);
-  }
-
-  public static class Builder {
-    private final Config cfg;
-    private final SitePaths sitePaths;
-    private final Provider<PersonIdent> serverIdent;
-    private final AllUsersName allUsers;
-    private final SchemaFactory<ReviewDb> schemaFactory;
-    private final GitRepositoryManager repoManager;
-    private final NoteDbUpdateManager.Factory updateManagerFactory;
-    private final ChangeBundleReader bundleReader;
-    private final AllProjectsName allProjects;
-    private final InternalUser.Factory userFactory;
-    private final ThreadLocalRequestContext requestContext;
-    private final ChangeRebuilderImpl rebuilder;
-    private final WorkQueue workQueue;
-    private final MutableNotesMigration globalNotesMigration;
-    private final PrimaryStorageMigrator primaryStorageMigrator;
-    private final DynamicSet<NotesMigrationStateListener> listeners;
-
-    private int threads;
-    private ImmutableList<Project.NameKey> projects = ImmutableList.of();
-    private ImmutableList<Project.NameKey> skipProjects = ImmutableList.of();
-    private ImmutableList<Change.Id> changes = ImmutableList.of();
-    private OutputStream progressOut = NullOutputStream.INSTANCE;
-    private NotesMigrationState stopAtState;
-    private boolean trial;
-    private boolean forceRebuild;
-    private int sequenceGap = -1;
-    private boolean autoMigrate;
-
-    @Inject
-    Builder(
-        GerritServerConfigProvider configProvider,
-        SitePaths sitePaths,
-        @GerritPersonIdent Provider<PersonIdent> serverIdent,
-        AllUsersName allUsers,
-        SchemaFactory<ReviewDb> schemaFactory,
-        GitRepositoryManager repoManager,
-        NoteDbUpdateManager.Factory updateManagerFactory,
-        ChangeBundleReader bundleReader,
-        AllProjectsName allProjects,
-        ThreadLocalRequestContext requestContext,
-        InternalUser.Factory userFactory,
-        ChangeRebuilderImpl rebuilder,
-        WorkQueue workQueue,
-        MutableNotesMigration globalNotesMigration,
-        PrimaryStorageMigrator primaryStorageMigrator,
-        DynamicSet<NotesMigrationStateListener> listeners) {
-      // Reload gerrit.config/notedb.config on each migrator invocation, in case a previous
-      // migration in the same process modified the on-disk contents. This ensures the defaults for
-      // trial/autoMigrate get set correctly below.
-      this.cfg = configProvider.get();
-      this.sitePaths = sitePaths;
-      this.serverIdent = serverIdent;
-      this.allUsers = allUsers;
-      this.schemaFactory = schemaFactory;
-      this.repoManager = repoManager;
-      this.updateManagerFactory = updateManagerFactory;
-      this.bundleReader = bundleReader;
-      this.allProjects = allProjects;
-      this.requestContext = requestContext;
-      this.userFactory = userFactory;
-      this.rebuilder = rebuilder;
-      this.workQueue = workQueue;
-      this.globalNotesMigration = globalNotesMigration;
-      this.primaryStorageMigrator = primaryStorageMigrator;
-      this.listeners = listeners;
-      this.trial = getTrialMode(cfg);
-      this.autoMigrate = getAutoMigrate(cfg);
-    }
-
-    /**
-     * Set the number of threads used by parallelizable phases of the migration, such as rebuilding
-     * all changes.
-     *
-     * <p>Not all phases are parallelizable, and calling {@link #rebuild()} directly will do
-     * substantial work in the calling thread regardless of the number of threads configured.
-     *
-     * <p>By default, all work is done in the calling thread.
-     *
-     * @param threads thread count; if less than 2, all work happens in the calling thread.
-     * @return this.
-     */
-    public Builder setThreads(int threads) {
-      this.threads = threads;
-      return this;
-    }
-
-    /**
-     * Limit the set of projects that are processed.
-     *
-     * <p>Incompatible with {@link #setChanges(Collection)}.
-     *
-     * <p>By default, all projects will be processed.
-     *
-     * @param projects set of projects; if null or empty, all projects will be processed.
-     * @return this.
-     */
-    public Builder setProjects(@Nullable Collection<Project.NameKey> projects) {
-      this.projects = projects != null ? ImmutableList.copyOf(projects) : ImmutableList.of();
-      return this;
-    }
-
-    /**
-     * Process all projects except these
-     *
-     * <p>Incompatible with {@link #setProjects(Collection)} and {@link #setChanges(Collection)}
-     *
-     * <p>By default, all projects will be processed.
-     *
-     * @param skipProjects set of projects; if null or empty all project will be processed
-     * @return this.
-     */
-    public Builder setSkipProjects(@Nullable Collection<Project.NameKey> skipProjects) {
-      this.skipProjects =
-          skipProjects != null ? ImmutableList.copyOf(skipProjects) : ImmutableList.of();
-      return this;
-    }
-
-    /**
-     * Limit the set of changes that are processed.
-     *
-     * <p>Incompatible with {@link #setProjects(Collection)}.
-     *
-     * <p>By default, all changes will be processed.
-     *
-     * @param changes set of changes; if null or empty, all changes will be processed.
-     * @return this.
-     */
-    public Builder setChanges(@Nullable Collection<Change.Id> changes) {
-      this.changes = changes != null ? ImmutableList.copyOf(changes) : ImmutableList.of();
-      return this;
-    }
-
-    /**
-     * Set output stream for progress monitors.
-     *
-     * <p>By default, there is no progress monitor output (although there may be other logs).
-     *
-     * @param progressOut output stream.
-     * @return this.
-     */
-    public Builder setProgressOut(OutputStream progressOut) {
-      this.progressOut = checkNotNull(progressOut);
-      return this;
-    }
-
-    /**
-     * Stop at a specific migration state, for testing only.
-     *
-     * @param stopAtState state to stop at.
-     * @return this.
-     */
-    @VisibleForTesting
-    public Builder setStopAtStateForTesting(NotesMigrationState stopAtState) {
-      this.stopAtState = stopAtState;
-      return this;
-    }
-
-    /**
-     * Rebuild in "trial mode": configure Gerrit to write to and read from NoteDb, but leave
-     * ReviewDb as the source of truth for all changes.
-     *
-     * <p>By default, trial mode is off, and NoteDb is the source of truth for all changes following
-     * the migration.
-     *
-     * @param trial whether to rebuild in trial mode.
-     * @return this.
-     */
-    public Builder setTrialMode(boolean trial) {
-      this.trial = trial;
-      return this;
-    }
-
-    /**
-     * Rebuild all changes in NoteDb from ReviewDb, even if Gerrit is currently configured to read
-     * from NoteDb.
-     *
-     * <p>Only supported if ReviewDb is still the source of truth for all changes.
-     *
-     * <p>By default, force rebuilding is off.
-     *
-     * @param forceRebuild whether to force rebuilding.
-     * @return this.
-     */
-    public Builder setForceRebuild(boolean forceRebuild) {
-      this.forceRebuild = forceRebuild;
-      return this;
-    }
-
-    /**
-     * Gap between ReviewDb change sequence numbers and NoteDb.
-     *
-     * <p>If NoteDb sequences are enabled in a running server, there is a race between the migration
-     * step that calls {@code nextChangeId()} to seed the ref, and other threads that call {@code
-     * nextChangeId()} to create new changes. In order to prevent these operations stepping on one
-     * another, we use this value to skip some predefined sequence numbers. This is strongly
-     * recommended in a running server.
-     *
-     * <p>If the migration takes place offline, there is no race with other threads, and this option
-     * may be set to 0. However, admins may still choose to use a gap, for example to make it easier
-     * to distinguish changes that were created before and after the NoteDb migration.
-     *
-     * <p>By default, uses the value from {@code noteDb.changes.initialSequenceGap} in {@code
-     * gerrit.config}, which defaults to 1000.
-     *
-     * @param sequenceGap sequence gap size; if negative, use the default.
-     * @return this.
-     */
-    public Builder setSequenceGap(int sequenceGap) {
-      this.sequenceGap = sequenceGap;
-      return this;
-    }
-
-    /**
-     * Enable auto-migration on subsequent daemon launches.
-     *
-     * <p>If true, prior to running any migration steps, sets the necessary configuration in {@code
-     * gerrit.config} to make {@code gerrit.war daemon} retry the migration on next startup, if it
-     * fails.
-     *
-     * @param autoMigrate whether to set auto-migration config.
-     * @return this.
-     */
-    public Builder setAutoMigrate(boolean autoMigrate) {
-      this.autoMigrate = autoMigrate;
-      return this;
-    }
-
-    public NoteDbMigrator build() throws MigrationException {
-      return new NoteDbMigrator(
-          sitePaths,
-          schemaFactory,
-          serverIdent,
-          allUsers,
-          repoManager,
-          updateManagerFactory,
-          bundleReader,
-          allProjects,
-          requestContext,
-          userFactory,
-          rebuilder,
-          globalNotesMigration,
-          primaryStorageMigrator,
-          listeners,
-          threads > 1
-              ? MoreExecutors.listeningDecorator(
-                  workQueue.createQueue(threads, "RebuildChange", true))
-              : MoreExecutors.newDirectExecutorService(),
-          projects,
-          skipProjects,
-          changes,
-          progressOut,
-          stopAtState,
-          trial,
-          forceRebuild,
-          sequenceGap >= 0 ? sequenceGap : Sequences.getChangeSequenceGap(cfg),
-          autoMigrate);
-    }
-  }
-
-  private final FileBasedConfig gerritConfig;
-  private final FileBasedConfig noteDbConfig;
-  private final SchemaFactory<ReviewDb> schemaFactory;
-  private final Provider<PersonIdent> serverIdent;
-  private final AllUsersName allUsers;
-  private final GitRepositoryManager repoManager;
-  private final NoteDbUpdateManager.Factory updateManagerFactory;
-  private final ChangeBundleReader bundleReader;
-  private final AllProjectsName allProjects;
-  private final ThreadLocalRequestContext requestContext;
-  private final InternalUser.Factory userFactory;
-  private final ChangeRebuilderImpl rebuilder;
-  private final MutableNotesMigration globalNotesMigration;
-  private final PrimaryStorageMigrator primaryStorageMigrator;
-  private final DynamicSet<NotesMigrationStateListener> listeners;
-
-  private final ListeningExecutorService executor;
-  private final ImmutableList<Project.NameKey> projects;
-  private final ImmutableList<Project.NameKey> skipProjects;
-  private final ImmutableList<Change.Id> changes;
-  private final OutputStream progressOut;
-  private final NotesMigrationState stopAtState;
-  private final boolean trial;
-  private final boolean forceRebuild;
-  private final int sequenceGap;
-  private final boolean autoMigrate;
-
-  private NoteDbMigrator(
-      SitePaths sitePaths,
-      SchemaFactory<ReviewDb> schemaFactory,
-      Provider<PersonIdent> serverIdent,
-      AllUsersName allUsers,
-      GitRepositoryManager repoManager,
-      NoteDbUpdateManager.Factory updateManagerFactory,
-      ChangeBundleReader bundleReader,
-      AllProjectsName allProjects,
-      ThreadLocalRequestContext requestContext,
-      InternalUser.Factory userFactory,
-      ChangeRebuilderImpl rebuilder,
-      MutableNotesMigration globalNotesMigration,
-      PrimaryStorageMigrator primaryStorageMigrator,
-      DynamicSet<NotesMigrationStateListener> listeners,
-      ListeningExecutorService executor,
-      ImmutableList<Project.NameKey> projects,
-      ImmutableList<Project.NameKey> skipProjects,
-      ImmutableList<Change.Id> changes,
-      OutputStream progressOut,
-      NotesMigrationState stopAtState,
-      boolean trial,
-      boolean forceRebuild,
-      int sequenceGap,
-      boolean autoMigrate)
-      throws MigrationException {
-    if (ImmutableList.of(!changes.isEmpty(), !projects.isEmpty(), !skipProjects.isEmpty()).stream()
-            .filter(e -> e)
-            .count()
-        > 1) {
-      throw new MigrationException("Cannot combine changes, projects and skipProjects");
-    }
-    if (sequenceGap < 0) {
-      throw new MigrationException("Sequence gap must be non-negative: " + sequenceGap);
-    }
-
-    this.schemaFactory = schemaFactory;
-    this.serverIdent = serverIdent;
-    this.allUsers = allUsers;
-    this.rebuilder = rebuilder;
-    this.repoManager = repoManager;
-    this.updateManagerFactory = updateManagerFactory;
-    this.bundleReader = bundleReader;
-    this.allProjects = allProjects;
-    this.requestContext = requestContext;
-    this.userFactory = userFactory;
-    this.globalNotesMigration = globalNotesMigration;
-    this.primaryStorageMigrator = primaryStorageMigrator;
-    this.listeners = listeners;
-    this.executor = executor;
-    this.projects = projects;
-    this.skipProjects = skipProjects;
-    this.changes = changes;
-    this.progressOut = progressOut;
-    this.stopAtState = stopAtState;
-    this.trial = trial;
-    this.forceRebuild = forceRebuild;
-    this.sequenceGap = sequenceGap;
-    this.autoMigrate = autoMigrate;
-
-    // Stack notedb.config over gerrit.config, in the same way as GerritServerConfigProvider.
-    this.gerritConfig = new FileBasedConfig(sitePaths.gerrit_config.toFile(), FS.detect());
-    this.noteDbConfig =
-        new FileBasedConfig(gerritConfig, sitePaths.notedb_config.toFile(), FS.detect());
-  }
-
-  @Override
-  public void close() {
-    executor.shutdownNow();
-  }
-
-  public void migrate() throws OrmException, IOException {
-    if (!changes.isEmpty() || !projects.isEmpty() || !skipProjects.isEmpty()) {
-      throw new MigrationException(
-          "Cannot set changes or projects or skipProjects during full migration; call rebuild() instead");
-    }
-    Optional<NotesMigrationState> maybeState = loadState();
-    if (!maybeState.isPresent()) {
-      throw new MigrationException("Could not determine initial migration state");
-    }
-
-    NotesMigrationState state = maybeState.get();
-    if (trial && state.compareTo(READ_WRITE_NO_SEQUENCE) > 0) {
-      throw new MigrationException(
-          "Migration has already progressed past the endpoint of the \"trial mode\" state;"
-              + " NoteDb is already the primary storage for some changes");
-    }
-    if (forceRebuild && state.compareTo(READ_WRITE_WITH_SEQUENCE_REVIEW_DB_PRIMARY) > 0) {
-      throw new MigrationException(
-          "Cannot force rebuild changes; NoteDb is already the primary storage for some changes");
-    }
-    setControlFlags();
-
-    boolean rebuilt = false;
-    while (state.compareTo(NOTE_DB) < 0) {
-      if (state.equals(stopAtState)) {
-        return;
-      }
-      boolean stillNeedsRebuild = forceRebuild && !rebuilt;
-      if (trial && state.compareTo(READ_WRITE_NO_SEQUENCE) >= 0) {
-        if (stillNeedsRebuild && state == READ_WRITE_NO_SEQUENCE) {
-          // We're at the end state of trial mode, but still need a rebuild due to forceRebuild. Let
-          // the loop go one more time.
-        } else {
-          return;
-        }
-      }
-      switch (state) {
-        case REVIEW_DB:
-          state = turnOnWrites(state);
-          break;
-        case WRITE:
-          state = rebuildAndEnableReads(state);
-          rebuilt = true;
-          break;
-        case READ_WRITE_NO_SEQUENCE:
-          if (stillNeedsRebuild) {
-            state = rebuildAndEnableReads(state);
-            rebuilt = true;
-          } else {
-            state = enableSequences(state);
-          }
-          break;
-        case READ_WRITE_WITH_SEQUENCE_REVIEW_DB_PRIMARY:
-          if (stillNeedsRebuild) {
-            state = rebuildAndEnableReads(state);
-            rebuilt = true;
-          } else {
-            state = setNoteDbPrimary(state);
-          }
-          break;
-        case READ_WRITE_WITH_SEQUENCE_NOTE_DB_PRIMARY:
-          // The only way we can get here is if there was a failure on a previous run of
-          // setNoteDbPrimary, since that method moves to NOTE_DB if it completes
-          // successfully. Assume that not all changes were converted and re-run the step.
-          // migrateToNoteDbPrimary is a relatively fast no-op for already-migrated changes, so this
-          // isn't actually repeating work.
-          state = setNoteDbPrimary(state);
-          break;
-        case NOTE_DB:
-          // Done!
-          break;
-        default:
-          throw new MigrationException(
-              "Migration out of the following state is not supported:\n" + state.toText());
-      }
-    }
-  }
-
-  private NotesMigrationState turnOnWrites(NotesMigrationState prev) throws IOException {
-    return saveState(prev, WRITE);
-  }
-
-  private NotesMigrationState rebuildAndEnableReads(NotesMigrationState prev)
-      throws OrmException, IOException {
-    rebuild();
-    return saveState(prev, READ_WRITE_NO_SEQUENCE);
-  }
-
-  private NotesMigrationState enableSequences(NotesMigrationState prev)
-      throws OrmException, IOException {
-    try (ReviewDb db = schemaFactory.open()) {
-      @SuppressWarnings("deprecation")
-      final int nextChangeId = db.nextChangeId();
-
-      RepoSequence seq =
-          new RepoSequence(
-              repoManager,
-              GitReferenceUpdated.DISABLED,
-              allProjects,
-              Sequences.NAME_CHANGES,
-              // If sequenceGap is 0, this writes into the sequence ref the same ID that is returned
-              // by the call to seq.next() below. If we actually used this as a change ID, that
-              // would be a problem, but we just discard it, so this is safe.
-              () -> nextChangeId + sequenceGap - 1,
-              1,
-              nextChangeId);
-      seq.next();
-    }
-    return saveState(prev, READ_WRITE_WITH_SEQUENCE_REVIEW_DB_PRIMARY);
-  }
-
-  private NotesMigrationState setNoteDbPrimary(NotesMigrationState prev)
-      throws MigrationException, OrmException, IOException {
-    checkState(
-        projects.isEmpty() && changes.isEmpty() && skipProjects.isEmpty(),
-        "Should not have attempted setNoteDbPrimary with a subset of changes");
-    checkState(
-        prev == READ_WRITE_WITH_SEQUENCE_REVIEW_DB_PRIMARY
-            || prev == READ_WRITE_WITH_SEQUENCE_NOTE_DB_PRIMARY,
-        "Unexpected start state for setNoteDbPrimary: %s",
-        prev);
-
-    // Before changing the primary storage of old changes, ensure new changes are created with
-    // NoteDb primary.
-    prev = saveState(prev, READ_WRITE_WITH_SEQUENCE_NOTE_DB_PRIMARY);
-
-    Stopwatch sw = Stopwatch.createStarted();
-    log.info("Setting primary storage to NoteDb");
-    List<Change.Id> allChanges;
-    try (ReviewDb db = unwrapDb(schemaFactory.open())) {
-      allChanges = Streams.stream(db.changes().all()).map(Change::getId).collect(toList());
-    }
-
-    try (ContextHelper contextHelper = new ContextHelper()) {
-      List<ListenableFuture<Boolean>> futures =
-          allChanges.stream()
-              .map(
-                  id ->
-                      executor.submit(
-                          () -> {
-                            try (ManualRequestContext ctx = contextHelper.open()) {
-                              try {
-                                primaryStorageMigrator.migrateToNoteDbPrimary(id);
-                              } catch (NoNoteDbStateException e) {
-                                if (canSkipPrimaryStorageMigration(
-                                    ctx.getReviewDbProvider().get(), id)) {
-                                  log.warn(
-                                      "Change {} previously failed to rebuild;"
-                                          + " skipping primary storage migration",
-                                      id,
-                                      e);
-                                } else {
-                                  throw e;
-                                }
-                              }
-                              return true;
-                            } catch (Exception e) {
-                              log.error("Error migrating primary storage for " + id, e);
-                              return false;
-                            }
-                          }))
-              .collect(toList());
-
-      boolean ok = futuresToBoolean(futures, "Error migrating primary storage");
-      double t = sw.elapsed(TimeUnit.MILLISECONDS) / 1000d;
-      log.info(
-          String.format(
-              "Migrated primary storage of %d changes in %.01fs (%.01f/s)\n",
-              allChanges.size(), t, allChanges.size() / t));
-      if (!ok) {
-        throw new MigrationException("Migrating primary storage for some changes failed, see log");
-      }
-    }
-
-    return disableReviewDb(prev);
-  }
-
-  /**
-   * Checks whether a change is so corrupt that it can be completely skipped by the primary storage
-   * migration step.
-   *
-   * <p>To get to the point where this method is called from {@link #setNoteDbPrimary}, it means we
-   * attempted to rebuild it, and encountered an error that was then caught in {@link
-   * #rebuildProject} and skipped. As a result, there is no {@code noteDbState} field in the change
-   * by the time we get to {@link #setNoteDbPrimary}, so {@code migrateToNoteDbPrimary} throws an
-   * exception.
-   *
-   * <p>We have to do this hacky double-checking because we don't have a way for the rebuilding
-   * phase to communicate to the primary storage migration phase that the change is skippable. It
-   * would be possible to store this info in some field in this class, but there is no guarantee
-   * that the rebuild and primary storage migration phases are run in the same JVM invocation.
-   *
-   * <p>In an ideal world, we could do this through the {@link
-   * com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage} enum, having a separate value
-   * for errors. However, that would be an invasive change touching many non-migration-related parts
-   * of the NoteDb migration code, which is too risky to attempt in the stable branch where this bug
-   * had to be fixed.
-   *
-   * <p>As of this writing, the only case where this happens is when a change has no patch sets.
-   */
-  private static boolean canSkipPrimaryStorageMigration(ReviewDb db, Change.Id id) {
-    try {
-      return Iterables.isEmpty(unwrapDb(db).patchSets().byChange(id));
-    } catch (Exception e) {
-      log.error("Error checking if change " + id + " can be skipped, assuming no", e);
-      return false;
-    }
-  }
-
-  private NotesMigrationState disableReviewDb(NotesMigrationState prev) throws IOException {
-    return saveState(prev, NOTE_DB, c -> setAutoMigrate(c, false));
-  }
-
-  private Optional<NotesMigrationState> loadState() throws IOException {
-    try {
-      gerritConfig.load();
-      noteDbConfig.load();
-      return NotesMigrationState.forConfig(noteDbConfig);
-    } catch (ConfigInvalidException | IllegalArgumentException e) {
-      log.warn("error reading NoteDb migration options from " + noteDbConfig.getFile(), e);
-      return Optional.empty();
-    }
-  }
-
-  private NotesMigrationState saveState(
-      NotesMigrationState expectedOldState, NotesMigrationState newState) throws IOException {
-    return saveState(expectedOldState, newState, c -> {});
-  }
-
-  private NotesMigrationState saveState(
-      NotesMigrationState expectedOldState,
-      NotesMigrationState newState,
-      Consumer<Config> additionalUpdates)
-      throws IOException {
-    synchronized (globalNotesMigration) {
-      // This read-modify-write is racy. We're counting on the fact that no other Gerrit operation
-      // modifies gerrit.config, and hoping that admins don't either.
-      Optional<NotesMigrationState> actualOldState = loadState();
-      if (!actualOldState.equals(Optional.of(expectedOldState))) {
-        throw new MigrationException(
-            "Cannot move to new state:\n"
-                + newState.toText()
-                + "\n\n"
-                + "Expected this state in gerrit.config:\n"
-                + expectedOldState.toText()
-                + "\n\n"
-                + (actualOldState.isPresent()
-                    ? "But found this state:\n" + actualOldState.get().toText()
-                    : "But could not parse the current state"));
-      }
-
-      preStateChange(expectedOldState, newState);
-
-      newState.setConfigValues(noteDbConfig);
-      additionalUpdates.accept(noteDbConfig);
-      noteDbConfig.save();
-
-      // Only set in-memory state once it's been persisted to storage.
-      globalNotesMigration.setFrom(newState);
-      log.info("Migration state: {} => {}", expectedOldState, newState);
-
-      return newState;
-    }
-  }
-
-  private void preStateChange(NotesMigrationState oldState, NotesMigrationState newState)
-      throws IOException {
-    for (NotesMigrationStateListener listener : listeners) {
-      listener.preStateChange(oldState, newState);
-    }
-  }
-
-  private void setControlFlags() throws MigrationException {
-    synchronized (globalNotesMigration) {
-      try {
-        noteDbConfig.load();
-        setAutoMigrate(noteDbConfig, autoMigrate);
-        setTrialMode(noteDbConfig, trial);
-        noteDbConfig.save();
-      } catch (ConfigInvalidException | IOException e) {
-        throw new MigrationException("Error saving auto-migration config", e);
-      }
-    }
-  }
-
-  public void rebuild() throws MigrationException, OrmException {
-    if (!globalNotesMigration.commitChangeWrites()) {
-      throw new MigrationException("Cannot rebuild without noteDb.changes.write=true");
-    }
-    Stopwatch sw = Stopwatch.createStarted();
-    log.info("Rebuilding changes in NoteDb");
-
-    ImmutableListMultimap<Project.NameKey, Change.Id> changesByProject = getChangesByProject();
-    List<ListenableFuture<Boolean>> futures = new ArrayList<>();
-    try (ContextHelper contextHelper = new ContextHelper()) {
-      List<Project.NameKey> projectNames =
-          Ordering.usingToString().sortedCopy(changesByProject.keySet());
-      for (Project.NameKey project : projectNames) {
-        ListenableFuture<Boolean> future =
-            executor.submit(
-                () -> {
-                  try {
-                    return rebuildProject(contextHelper.getReviewDb(), changesByProject, project);
-                  } catch (Exception e) {
-                    log.error("Error rebuilding project " + project, e);
-                    return false;
-                  }
-                });
-        futures.add(future);
-      }
-
-      boolean ok = futuresToBoolean(futures, "Error rebuilding projects");
-      double t = sw.elapsed(TimeUnit.MILLISECONDS) / 1000d;
-      log.info(
-          String.format(
-              "Rebuilt %d changes in %.01fs (%.01f/s)\n",
-              changesByProject.size(), t, changesByProject.size() / t));
-      if (!ok) {
-        throw new MigrationException("Rebuilding some changes failed, see log");
-      }
-    }
-  }
-
-  private ImmutableListMultimap<Project.NameKey, Change.Id> getChangesByProject()
-      throws OrmException {
-    // Memoize all changes so we can close the db connection and allow other threads to use the full
-    // connection pool.
-    SetMultimap<Project.NameKey, Change.Id> out =
-        MultimapBuilder.treeKeys(comparing(Project.NameKey::get))
-            .treeSetValues(comparing(Change.Id::get))
-            .build();
-    try (ReviewDb db = unwrapDb(schemaFactory.open())) {
-      if (!projects.isEmpty()) {
-        return byProject(db.changes().all(), c -> projects.contains(c.getProject()), out);
-      }
-      if (!skipProjects.isEmpty()) {
-        return byProject(db.changes().all(), c -> !skipProjects.contains(c.getProject()), out);
-      }
-      if (!changes.isEmpty()) {
-        return byProject(db.changes().get(changes), c -> true, out);
-      }
-      return byProject(db.changes().all(), c -> true, out);
-    }
-  }
-
-  private static ImmutableListMultimap<Project.NameKey, Change.Id> byProject(
-      Iterable<Change> changes,
-      Predicate<Change> pred,
-      SetMultimap<Project.NameKey, Change.Id> out) {
-    Streams.stream(changes).filter(pred).forEach(c -> out.put(c.getProject(), c.getId()));
-    return ImmutableListMultimap.copyOf(out);
-  }
-
-  private static ObjectInserter newPackInserter(Repository repo) {
-    if (!(repo instanceof FileRepository)) {
-      return repo.newObjectInserter();
-    }
-    PackInserter ins = ((FileRepository) repo).getObjectDatabase().newPackInserter();
-    ins.checkExisting(false);
-    return ins;
-  }
-
-  private boolean rebuildProject(
-      ReviewDb db,
-      ImmutableListMultimap<Project.NameKey, Change.Id> allChanges,
-      Project.NameKey project) {
-    checkArgument(allChanges.containsKey(project));
-    boolean ok = true;
-    ProgressMonitor pm =
-        new TextProgressMonitor(
-            new PrintWriter(new BufferedWriter(new OutputStreamWriter(progressOut, UTF_8))));
-    try (Repository changeRepo = repoManager.openRepository(project);
-        // Only use a PackInserter for the change repo, not All-Users.
-        //
-        // It's not possible to share a single inserter for All-Users across all project tasks, and
-        // we don't want to add one pack per project to All-Users. Adding many loose objects is
-        // preferable to many packs.
-        //
-        // Anyway, the number of objects inserted into All-Users is proportional to the number
-        // of pending draft comments, which should not be high (relative to the total number of
-        // changes), so the number of loose objects shouldn't be too unreasonable.
-        ObjectInserter changeIns = newPackInserter(changeRepo);
-        ObjectReader changeReader = changeIns.newReader();
-        RevWalk changeRw = new RevWalk(changeReader);
-        Repository allUsersRepo = repoManager.openRepository(allUsers);
-        ObjectInserter allUsersIns = allUsersRepo.newObjectInserter();
-        ObjectReader allUsersReader = allUsersIns.newReader();
-        RevWalk allUsersRw = new RevWalk(allUsersReader)) {
-      ChainedReceiveCommands changeCmds = new ChainedReceiveCommands(changeRepo);
-      ChainedReceiveCommands allUsersCmds = new ChainedReceiveCommands(allUsersRepo);
-
-      Collection<Change.Id> changes = allChanges.get(project);
-      pm.beginTask(FormatUtil.elide("Rebuilding " + project.get(), 50), changes.size());
-      int toSave = 0;
-      try {
-        for (Change.Id changeId : changes) {
-          // NoteDbUpdateManager assumes that all commands in its OpenRepo were added by itself, so
-          // we can't share the top-level ChainedReceiveCommands. Use a new set of commands sharing
-          // the same underlying repo, and copy commands back to the top-level
-          // ChainedReceiveCommands later. This also assumes that each ref in the final list of
-          // commands was only modified by a single NoteDbUpdateManager; since we use one manager
-          // per change, and each ref corresponds to exactly one change, this assumption should be
-          // safe.
-          ChainedReceiveCommands tmpChangeCmds =
-              new ChainedReceiveCommands(changeCmds.getRepoRefCache());
-          ChainedReceiveCommands tmpAllUsersCmds =
-              new ChainedReceiveCommands(allUsersCmds.getRepoRefCache());
-
-          try (NoteDbUpdateManager manager =
-              updateManagerFactory
-                  .create(project)
-                  .setAtomicRefUpdates(false)
-                  .setSaveObjects(false)
-                  .setChangeRepo(changeRepo, changeRw, changeIns, tmpChangeCmds)
-                  .setAllUsersRepo(allUsersRepo, allUsersRw, allUsersIns, tmpAllUsersCmds)) {
-            rebuild(db, changeId, manager);
-
-            // Executing with dryRun=true writes all objects to the underlying inserters and adds
-            // commands to the ChainedReceiveCommands. Afterwards, we can discard the manager, so we
-            // don't keep using any memory beyond what may be buffered in the PackInserter.
-            manager.execute(true);
-
-            tmpChangeCmds.getCommands().values().forEach(c -> addCommand(changeCmds, c));
-            tmpAllUsersCmds.getCommands().values().forEach(c -> addCommand(allUsersCmds, c));
-
-            toSave++;
-          } catch (NoPatchSetsException e) {
-            log.warn(e.getMessage());
-          } catch (ConflictingUpdateException ex) {
-            log.warn(
-                "Rebuilding detected a conflicting ReviewDb update for change {};"
-                    + " will be auto-rebuilt at runtime",
-                changeId);
-          } catch (Throwable t) {
-            log.error("Failed to rebuild change " + changeId, t);
-            ok = false;
-          }
-          pm.update(1);
-        }
-      } finally {
-        pm.endTask();
-      }
-
-      pm.beginTask(FormatUtil.elide("Saving " + project.get(), 50), ProgressMonitor.UNKNOWN);
-      try {
-        save(changeRepo, changeRw, changeIns, changeCmds);
-        save(allUsersRepo, allUsersRw, allUsersIns, allUsersCmds);
-        // This isn't really useful progress. If we passed a real ProgressMonitor to
-        // BatchRefUpdate#execute we might get something more incremental, but that doesn't allow us
-        // to specify the repo name in the task text.
-        pm.update(toSave);
-      } catch (LockFailureException e) {
-        log.warn(
-            "Rebuilding detected a conflicting NoteDb update for the following refs, which will"
-                + " be auto-rebuilt at runtime: {}",
-            e.getFailedRefs().stream().distinct().sorted().collect(joining(", ")));
-      } catch (IOException e) {
-        log.error("Failed to save NoteDb state for " + project, e);
-      } finally {
-        pm.endTask();
-      }
-    } catch (RepositoryNotFoundException e) {
-      log.warn("Repository {} not found", project);
-    } catch (IOException e) {
-      log.error("Failed to rebuild project " + project, e);
-    }
-    return ok;
-  }
-
-  private void rebuild(ReviewDb db, Change.Id changeId, NoteDbUpdateManager manager)
-      throws OrmException, IOException {
-    // Match ChangeRebuilderImpl#stage, but without calling manager.stage(), since that can only be
-    // called after building updates for all changes.
-    Change change =
-        ChangeRebuilderImpl.checkNoteDbState(ChangeNotes.readOneReviewDbChange(db, changeId));
-    if (change == null) {
-      // Could log here instead, but this matches the behavior of ChangeRebuilderImpl#stage.
-      throw new NoSuchChangeException(changeId);
-    }
-    rebuilder.buildUpdates(manager, bundleReader.fromReviewDb(db, changeId));
-
-    rebuilder.execute(db, changeId, manager, true, false);
-  }
-
-  private static void addCommand(ChainedReceiveCommands cmds, ReceiveCommand cmd) {
-    // ChainedReceiveCommands doesn't allow no-ops, but these occur when rebuilding a
-    // previously-rebuilt change.
-    if (!cmd.getOldId().equals(cmd.getNewId())) {
-      cmds.add(cmd);
-    }
-  }
-
-  private void save(Repository repo, RevWalk rw, ObjectInserter ins, ChainedReceiveCommands cmds)
-      throws IOException {
-    if (cmds.isEmpty()) {
-      return;
-    }
-    ins.flush();
-    BatchRefUpdate bru = repo.getRefDatabase().newBatchUpdate();
-    bru.setRefLogMessage("Migrate changes to NoteDb", false);
-    bru.setRefLogIdent(serverIdent.get());
-    bru.setAtomic(false);
-    bru.setAllowNonFastForwards(true);
-    cmds.addTo(bru);
-    RefUpdateUtil.executeChecked(bru, rw);
-  }
-
-  private static boolean futuresToBoolean(List<ListenableFuture<Boolean>> futures, String errMsg) {
-    try {
-      return Futures.allAsList(futures).get().stream().allMatch(b -> b);
-    } catch (InterruptedException | ExecutionException e) {
-      log.error(errMsg, e);
-      return false;
-    }
-  }
-
-  private class ContextHelper implements AutoCloseable {
-    private final Thread callingThread;
-    private ReviewDb db;
-    private Runnable closeDb;
-
-    ContextHelper() {
-      callingThread = Thread.currentThread();
-    }
-
-    ManualRequestContext open() throws OrmException {
-      return new ManualRequestContext(
-          userFactory.create(),
-          // Reuse the same lazily-opened ReviewDb on the original calling thread, otherwise open
-          // SchemaFactory in the normal way.
-          Thread.currentThread().equals(callingThread) ? this::getReviewDb : schemaFactory,
-          requestContext);
-    }
-
-    synchronized ReviewDb getReviewDb() throws OrmException {
-      if (db == null) {
-        ReviewDb actual = schemaFactory.open();
-        closeDb = actual::close;
-        db =
-            new ReviewDbWrapper(unwrapDb(actual)) {
-              @Override
-              public void close() {
-                // Closed by ContextHelper#close.
-              }
-            };
-      }
-      return db;
-    }
-
-    @Override
-    public synchronized void close() {
-      if (db != null) {
-        closeDb.run();
-        db = null;
-        closeDb = null;
-      }
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/OnlineNoteDbMigrator.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/OnlineNoteDbMigrator.java
deleted file mode 100644
index 65755ed..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/OnlineNoteDbMigrator.java
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.notedb.rebuild;
-
-import com.google.common.base.Stopwatch;
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.gerrit.lifecycle.LifecycleModule;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.index.OnlineUpgrader;
-import com.google.gerrit.server.index.VersionManager;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import com.google.inject.name.Named;
-import com.google.inject.name.Names;
-import java.util.concurrent.TimeUnit;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class OnlineNoteDbMigrator implements LifecycleListener {
-  private static final Logger log = LoggerFactory.getLogger(OnlineNoteDbMigrator.class);
-
-  private static final String TRIAL = "OnlineNoteDbMigrator/trial";
-
-  public static class Module extends LifecycleModule {
-    private final boolean trial;
-
-    public Module(boolean trial) {
-      this.trial = trial;
-    }
-
-    @Override
-    public void configure() {
-      listener().to(OnlineNoteDbMigrator.class);
-      bindConstant().annotatedWith(Names.named(TRIAL)).to(trial);
-    }
-  }
-
-  private final GcAllUsers gcAllUsers;
-  private final OnlineUpgrader indexUpgrader;
-  private final Provider<NoteDbMigrator.Builder> migratorBuilderProvider;
-  private final boolean upgradeIndex;
-  private final boolean trial;
-
-  @Inject
-  OnlineNoteDbMigrator(
-      @GerritServerConfig Config cfg,
-      GcAllUsers gcAllUsers,
-      OnlineUpgrader indexUpgrader,
-      Provider<NoteDbMigrator.Builder> migratorBuilderProvider,
-      @Named(TRIAL) boolean trial) {
-    this.gcAllUsers = gcAllUsers;
-    this.indexUpgrader = indexUpgrader;
-    this.migratorBuilderProvider = migratorBuilderProvider;
-    this.upgradeIndex = VersionManager.getOnlineUpgrade(cfg);
-    this.trial = trial || NoteDbMigrator.getTrialMode(cfg);
-  }
-
-  @Override
-  public void start() {
-    Thread t = new Thread(this::migrate);
-    t.setDaemon(true);
-    t.setName(getClass().getSimpleName());
-    t.start();
-  }
-
-  private void migrate() {
-    log.info("Starting online NoteDb migration");
-    if (upgradeIndex) {
-      log.info("Online index schema upgrades will be deferred until NoteDb migration is complete");
-    }
-    Stopwatch sw = Stopwatch.createStarted();
-    // TODO(dborowitz): Tune threads, maybe expose a progress monitor somewhere.
-    try (NoteDbMigrator migrator =
-        migratorBuilderProvider.get().setAutoMigrate(true).setTrialMode(trial).build()) {
-      migrator.migrate();
-    } catch (Exception e) {
-      log.error("Error in online NoteDb migration", e);
-    }
-    gcAllUsers.runWithLogger();
-    log.info("Online NoteDb migration completed in {}s", sw.elapsed(TimeUnit.SECONDS));
-
-    if (upgradeIndex) {
-      log.info("Starting deferred index schema upgrades");
-      indexUpgrader.start();
-    }
-  }
-
-  @Override
-  public void stop() {
-    // Do nothing; upgrade process uses daemon threads and knows how to recover from failures on
-    // next attempt.
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/AutoMerger.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/AutoMerger.java
deleted file mode 100644
index 19568cf..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/AutoMerger.java
+++ /dev/null
@@ -1,274 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.patch;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.git.InMemoryInserter;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.Map;
-import org.eclipse.jgit.diff.Sequence;
-import org.eclipse.jgit.dircache.DirCache;
-import org.eclipse.jgit.dircache.DirCacheBuilder;
-import org.eclipse.jgit.dircache.DirCacheEntry;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.merge.MergeFormatter;
-import org.eclipse.jgit.merge.MergeResult;
-import org.eclipse.jgit.merge.ResolveMerger;
-import org.eclipse.jgit.merge.ThreeWayMergeStrategy;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevObject;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.util.TemporaryBuffer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class AutoMerger {
-  private static final Logger log = LoggerFactory.getLogger(AutoMerger.class);
-
-  public static boolean cacheAutomerge(Config cfg) {
-    return cfg.getBoolean("change", null, "cacheAutomerge", true);
-  }
-
-  private final PersonIdent gerritIdent;
-  private final boolean save;
-
-  @Inject
-  AutoMerger(@GerritServerConfig Config cfg, @GerritPersonIdent PersonIdent gerritIdent) {
-    save = cacheAutomerge(cfg);
-    this.gerritIdent = gerritIdent;
-  }
-
-  /**
-   * Perform an auto-merge of the parents of the given merge commit.
-   *
-   * @return auto-merge commit or {@code null} if an auto-merge commit couldn't be created. Headers
-   *     of the returned RevCommit are parsed.
-   */
-  public RevCommit merge(
-      Repository repo,
-      RevWalk rw,
-      ObjectInserter ins,
-      RevCommit merge,
-      ThreeWayMergeStrategy mergeStrategy)
-      throws IOException {
-    checkArgument(rw.getObjectReader().getCreatedFromInserter() == ins);
-    InMemoryInserter tmpIns = null;
-    if (ins instanceof InMemoryInserter) {
-      // Caller gave us an in-memory inserter, so ensure anything we write from
-      // this method is visible to them.
-      tmpIns = (InMemoryInserter) ins;
-    } else if (!save) {
-      // If we don't plan on saving results, use a fully in-memory inserter.
-      // Using just a non-flushing wrapper is not sufficient, since in
-      // particular DfsInserter might try to write to storage after exceeding an
-      // internal buffer size.
-      tmpIns = new InMemoryInserter(rw.getObjectReader());
-    }
-
-    rw.parseHeaders(merge);
-    String refName = RefNames.refsCacheAutomerge(merge.name());
-    Ref ref = repo.getRefDatabase().exactRef(refName);
-    if (ref != null && ref.getObjectId() != null) {
-      RevObject obj = rw.parseAny(ref.getObjectId());
-      if (obj instanceof RevCommit) {
-        return (RevCommit) obj;
-      }
-      return commit(repo, rw, tmpIns, ins, refName, obj, merge);
-    }
-
-    ResolveMerger m = (ResolveMerger) mergeStrategy.newMerger(repo, true);
-    DirCache dc = DirCache.newInCore();
-    m.setDirCache(dc);
-    m.setObjectInserter(tmpIns == null ? new NonFlushingWrapper(ins) : tmpIns);
-
-    boolean couldMerge;
-    try {
-      couldMerge = m.merge(merge.getParents());
-    } catch (IOException e) {
-      // It is not safe to continue further down in this method as throwing
-      // an exception most likely means that the merge tree was not created
-      // and m.getMergeResults() is empty. This would mean that all paths are
-      // unmerged and Gerrit UI would show all paths in the patch list.
-      log.warn("Error attempting automerge " + refName, e);
-      return null;
-    }
-
-    ObjectId treeId;
-    if (couldMerge) {
-      treeId = m.getResultTreeId();
-
-    } else {
-      RevCommit ours = merge.getParent(0);
-      RevCommit theirs = merge.getParent(1);
-      rw.parseBody(ours);
-      rw.parseBody(theirs);
-      String oursMsg = ours.getShortMessage();
-      String theirsMsg = theirs.getShortMessage();
-
-      String oursName =
-          String.format(
-              "HEAD   (%s %s)",
-              ours.abbreviate(6).name(), oursMsg.substring(0, Math.min(oursMsg.length(), 60)));
-      String theirsName =
-          String.format(
-              "BRANCH (%s %s)",
-              theirs.abbreviate(6).name(),
-              theirsMsg.substring(0, Math.min(theirsMsg.length(), 60)));
-
-      MergeFormatter fmt = new MergeFormatter();
-      Map<String, MergeResult<? extends Sequence>> r = m.getMergeResults();
-      Map<String, ObjectId> resolved = new HashMap<>();
-      for (Map.Entry<String, MergeResult<? extends Sequence>> entry : r.entrySet()) {
-        MergeResult<? extends Sequence> p = entry.getValue();
-        try (TemporaryBuffer buf = new TemporaryBuffer.LocalFile(null, 10 * 1024 * 1024)) {
-          fmt.formatMerge(buf, p, "BASE", oursName, theirsName, UTF_8.name());
-          buf.close();
-
-          try (InputStream in = buf.openInputStream()) {
-            resolved.put(entry.getKey(), ins.insert(Constants.OBJ_BLOB, buf.length(), in));
-          }
-        }
-      }
-
-      DirCacheBuilder builder = dc.builder();
-      int cnt = dc.getEntryCount();
-      for (int i = 0; i < cnt; ) {
-        DirCacheEntry entry = dc.getEntry(i);
-        if (entry.getStage() == 0) {
-          builder.add(entry);
-          i++;
-          continue;
-        }
-
-        int next = dc.nextEntry(i);
-        String path = entry.getPathString();
-        DirCacheEntry res = new DirCacheEntry(path);
-        if (resolved.containsKey(path)) {
-          // For a file with content merge conflict that we produced a result
-          // above on, collapse the file down to a single stage 0 with just
-          // the blob content, and a randomly selected mode (the lowest stage,
-          // which should be the merge base, or ours).
-          res.setFileMode(entry.getFileMode());
-          res.setObjectId(resolved.get(path));
-
-        } else if (next == i + 1) {
-          // If there is exactly one stage present, shouldn't be a conflict...
-          res.setFileMode(entry.getFileMode());
-          res.setObjectId(entry.getObjectId());
-
-        } else if (next == i + 2) {
-          // Two stages suggests a delete/modify conflict. Pick the higher
-          // stage as the automatic result.
-          entry = dc.getEntry(i + 1);
-          res.setFileMode(entry.getFileMode());
-          res.setObjectId(entry.getObjectId());
-
-        } else {
-          // 3 stage conflict, no resolve above
-          // Punt on the 3-stage conflict and show the base, for now.
-          res.setFileMode(entry.getFileMode());
-          res.setObjectId(entry.getObjectId());
-        }
-        builder.add(res);
-        i = next;
-      }
-      builder.finish();
-      treeId = dc.writeTree(ins);
-    }
-
-    return commit(repo, rw, tmpIns, ins, refName, treeId, merge);
-  }
-
-  private RevCommit commit(
-      Repository repo,
-      RevWalk rw,
-      @Nullable InMemoryInserter tmpIns,
-      ObjectInserter ins,
-      String refName,
-      ObjectId tree,
-      RevCommit merge)
-      throws IOException {
-    rw.parseHeaders(merge);
-    // For maximum stability, choose a single ident using the committer time of
-    // the input commit, using the server name and timezone.
-    PersonIdent ident =
-        new PersonIdent(
-            gerritIdent, merge.getCommitterIdent().getWhen(), gerritIdent.getTimeZone());
-    CommitBuilder cb = new CommitBuilder();
-    cb.setAuthor(ident);
-    cb.setCommitter(ident);
-    cb.setTreeId(tree);
-    cb.setMessage("Auto-merge of " + merge.name() + '\n');
-    for (RevCommit p : merge.getParents()) {
-      cb.addParentId(p);
-    }
-
-    if (!save) {
-      checkArgument(tmpIns != null);
-      try (ObjectReader tmpReader = tmpIns.newReader();
-          RevWalk tmpRw = new RevWalk(tmpReader)) {
-        return tmpRw.parseCommit(tmpIns.insert(cb));
-      }
-    }
-
-    checkArgument(tmpIns == null);
-    checkArgument(!(ins instanceof InMemoryInserter));
-    ObjectId commitId = ins.insert(cb);
-    ins.flush();
-
-    RefUpdate ru = repo.updateRef(refName);
-    ru.setNewObjectId(commitId);
-    ru.disableRefLog();
-    ru.forceUpdate();
-    return rw.parseCommit(commitId);
-  }
-
-  private static class NonFlushingWrapper extends ObjectInserter.Filter {
-    private final ObjectInserter ins;
-
-    private NonFlushingWrapper(ObjectInserter ins) {
-      this.ins = ins;
-    }
-
-    @Override
-    protected ObjectInserter delegate() {
-      return ins;
-    }
-
-    @Override
-    public void flush() {}
-
-    @Override
-    public void close() {}
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/ComparisonType.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/ComparisonType.java
deleted file mode 100644
index abbb680..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/ComparisonType.java
+++ /dev/null
@@ -1,77 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.patch;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.gerrit.server.ioutil.BasicSerialization.readVarInt32;
-import static com.google.gerrit.server.ioutil.BasicSerialization.writeVarInt32;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-public class ComparisonType {
-
-  /** 1-based parent */
-  private final Integer parentNum;
-
-  private final boolean autoMerge;
-
-  public static ComparisonType againstOtherPatchSet() {
-    return new ComparisonType(null, false);
-  }
-
-  public static ComparisonType againstParent(int parentNum) {
-    return new ComparisonType(parentNum, false);
-  }
-
-  public static ComparisonType againstAutoMerge() {
-    return new ComparisonType(null, true);
-  }
-
-  private ComparisonType(Integer parentNum, boolean autoMerge) {
-    this.parentNum = parentNum;
-    this.autoMerge = autoMerge;
-  }
-
-  public boolean isAgainstParentOrAutoMerge() {
-    return isAgainstParent() || isAgainstAutoMerge();
-  }
-
-  public boolean isAgainstParent() {
-    return parentNum != null;
-  }
-
-  public boolean isAgainstAutoMerge() {
-    return autoMerge;
-  }
-
-  public int getParentNum() {
-    checkNotNull(parentNum);
-    return parentNum;
-  }
-
-  void writeTo(OutputStream out) throws IOException {
-    writeVarInt32(out, parentNum != null ? parentNum : 0);
-    writeVarInt32(out, autoMerge ? 1 : 0);
-  }
-
-  static ComparisonType readFrom(InputStream in) throws IOException {
-    int p = readVarInt32(in);
-    Integer parentNum = p > 0 ? p : null;
-    boolean autoMerge = readVarInt32(in) != 0;
-    return new ComparisonType(parentNum, autoMerge);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffExecutorModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffExecutorModule.java
deleted file mode 100644
index 5359479..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffExecutorModule.java
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.patch;
-
-import com.google.common.util.concurrent.ThreadFactoryBuilder;
-import com.google.inject.AbstractModule;
-import com.google.inject.Provides;
-import com.google.inject.Singleton;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-/** Module providing the {@link DiffExecutor}. */
-public class DiffExecutorModule extends AbstractModule {
-
-  @Override
-  protected void configure() {}
-
-  @Provides
-  @Singleton
-  @DiffExecutor
-  public ExecutorService createDiffExecutor() {
-    return Executors.newCachedThreadPool(
-        new ThreadFactoryBuilder().setNameFormat("Diff-%d").setDaemon(true).build());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffSummaryKey.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffSummaryKey.java
deleted file mode 100644
index 8ce4dd3..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffSummaryKey.java
+++ /dev/null
@@ -1,114 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.patch;
-
-import static org.eclipse.jgit.lib.ObjectIdSerialization.readCanBeNull;
-import static org.eclipse.jgit.lib.ObjectIdSerialization.readNotNull;
-import static org.eclipse.jgit.lib.ObjectIdSerialization.writeCanBeNull;
-import static org.eclipse.jgit.lib.ObjectIdSerialization.writeNotNull;
-
-import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-import java.util.Objects;
-import org.eclipse.jgit.lib.ObjectId;
-
-public class DiffSummaryKey implements Serializable {
-  public static final long serialVersionUID = 1L;
-
-  /** see PatchListKey#oldId */
-  private transient ObjectId oldId;
-
-  /** see PatchListKey#parentNum */
-  private transient Integer parentNum;
-
-  private transient ObjectId newId;
-  private transient Whitespace whitespace;
-
-  public static DiffSummaryKey fromPatchListKey(PatchListKey plk) {
-    return new DiffSummaryKey(
-        plk.getOldId(), plk.getParentNum(), plk.getNewId(), plk.getWhitespace());
-  }
-
-  private DiffSummaryKey(ObjectId oldId, Integer parentNum, ObjectId newId, Whitespace whitespace) {
-    this.oldId = oldId;
-    this.parentNum = parentNum;
-    this.newId = newId;
-    this.whitespace = whitespace;
-  }
-
-  PatchListKey toPatchListKey() {
-    return new PatchListKey(oldId, parentNum, newId, whitespace);
-  }
-
-  @Override
-  public int hashCode() {
-    return Objects.hash(oldId, parentNum, newId, whitespace);
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (o instanceof DiffSummaryKey) {
-      DiffSummaryKey k = (DiffSummaryKey) o;
-      return Objects.equals(oldId, k.oldId)
-          && Objects.equals(parentNum, k.parentNum)
-          && Objects.equals(newId, k.newId)
-          && whitespace == k.whitespace;
-    }
-    return false;
-  }
-
-  @Override
-  public String toString() {
-    StringBuilder n = new StringBuilder();
-    n.append("DiffSummaryKey[");
-    n.append(oldId != null ? oldId.name() : "BASE");
-    n.append("..");
-    n.append(newId.name());
-    n.append(" ");
-    if (parentNum != null) {
-      n.append(parentNum);
-      n.append(" ");
-    }
-    n.append(whitespace.name());
-    n.append("]");
-    return n.toString();
-  }
-
-  private void writeObject(ObjectOutputStream out) throws IOException {
-    writeCanBeNull(out, oldId);
-    out.writeInt(parentNum == null ? 0 : parentNum);
-    writeNotNull(out, newId);
-    Character c = PatchListKey.WHITESPACE_TYPES.get(whitespace);
-    if (c == null) {
-      throw new IOException("Invalid whitespace type: " + whitespace);
-    }
-    out.writeChar(c);
-  }
-
-  private void readObject(ObjectInputStream in) throws IOException {
-    oldId = readCanBeNull(in);
-    int n = in.readInt();
-    parentNum = n == 0 ? null : Integer.valueOf(n);
-    newId = readNotNull(in);
-    char t = in.readChar();
-    whitespace = PatchListKey.WHITESPACE_TYPES.inverse().get(t);
-    if (whitespace == null) {
-      throw new IOException("Invalid whitespace type code: " + t);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffSummaryLoader.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffSummaryLoader.java
deleted file mode 100644
index 8bca19f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffSummaryLoader.java
+++ /dev/null
@@ -1,73 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.patch;
-
-import com.google.gerrit.reviewdb.client.Patch;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.Callable;
-
-public class DiffSummaryLoader implements Callable<DiffSummary> {
-  public interface Factory {
-    DiffSummaryLoader create(DiffSummaryKey key, Project.NameKey project);
-  }
-
-  private final PatchListCache patchListCache;
-  private final DiffSummaryKey key;
-  private final Project.NameKey project;
-
-  @Inject
-  DiffSummaryLoader(PatchListCache plc, @Assisted DiffSummaryKey k, @Assisted Project.NameKey p) {
-    patchListCache = plc;
-    key = k;
-    project = p;
-  }
-
-  @Override
-  public DiffSummary call() throws Exception {
-    PatchList patchList = patchListCache.get(key.toPatchListKey(), project);
-    return toDiffSummary(patchList);
-  }
-
-  private DiffSummary toDiffSummary(PatchList patchList) {
-    List<String> r = new ArrayList<>(patchList.getPatches().size());
-    for (PatchListEntry e : patchList.getPatches()) {
-      if (Patch.isMagic(e.getNewName())) {
-        continue;
-      }
-      switch (e.getChangeType()) {
-        case ADDED:
-        case MODIFIED:
-        case DELETED:
-        case COPIED:
-        case REWRITE:
-          r.add(e.getNewName());
-          break;
-
-        case RENAMED:
-          r.add(e.getOldName());
-          r.add(e.getNewName());
-          break;
-      }
-    }
-    Collections.sort(r);
-    return new DiffSummary(
-        r.toArray(new String[r.size()]), patchList.getInsertions(), patchList.getDeletions());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineDiffKey.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineDiffKey.java
deleted file mode 100644
index 06e2c45..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineDiffKey.java
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.server.patch;
-
-import com.google.auto.value.AutoValue;
-import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
-import java.io.Serializable;
-import org.eclipse.jgit.lib.ObjectId;
-
-@AutoValue
-public abstract class IntraLineDiffKey implements Serializable {
-  public static final long serialVersionUID = 12L;
-
-  public static IntraLineDiffKey create(ObjectId aId, ObjectId bId, Whitespace whitespace) {
-    return new AutoValue_IntraLineDiffKey(aId, bId, whitespace);
-  }
-
-  public abstract ObjectId getBlobA();
-
-  public abstract ObjectId getBlobB();
-
-  public abstract Whitespace getWhitespace();
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineLoader.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineLoader.java
deleted file mode 100644
index f17f0b6..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineLoader.java
+++ /dev/null
@@ -1,325 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.patch;
-
-import com.google.common.base.Throwables;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.server.config.ConfigUtil;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.regex.Pattern;
-import org.eclipse.jgit.diff.Edit;
-import org.eclipse.jgit.diff.MyersDiff;
-import org.eclipse.jgit.diff.ReplaceEdit;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-class IntraLineLoader implements Callable<IntraLineDiff> {
-  static final Logger log = LoggerFactory.getLogger(IntraLineLoader.class);
-
-  interface Factory {
-    IntraLineLoader create(IntraLineDiffKey key, IntraLineDiffArgs args);
-  }
-
-  private static final Pattern BLANK_LINE_RE =
-      Pattern.compile("^[ \\t]*(|[{}]|/\\*\\*?|\\*)[ \\t]*$");
-
-  private static final Pattern CONTROL_BLOCK_START_RE = Pattern.compile("[{:][ \\t]*$");
-
-  private final ExecutorService diffExecutor;
-  private final long timeoutMillis;
-  private final IntraLineDiffKey key;
-  private final IntraLineDiffArgs args;
-
-  @Inject
-  IntraLineLoader(
-      @DiffExecutor ExecutorService diffExecutor,
-      @GerritServerConfig Config cfg,
-      @Assisted IntraLineDiffKey key,
-      @Assisted IntraLineDiffArgs args) {
-    this.diffExecutor = diffExecutor;
-    timeoutMillis =
-        ConfigUtil.getTimeUnit(
-            cfg,
-            "cache",
-            PatchListCacheImpl.INTRA_NAME,
-            "timeout",
-            TimeUnit.MILLISECONDS.convert(5, TimeUnit.SECONDS),
-            TimeUnit.MILLISECONDS);
-    this.key = key;
-    this.args = args;
-  }
-
-  @Override
-  public IntraLineDiff call() throws Exception {
-    Future<IntraLineDiff> result =
-        diffExecutor.submit(
-            () ->
-                IntraLineLoader.compute(
-                    args.aText(), args.bText(), args.edits(), args.editsDueToRebase()));
-    try {
-      return result.get(timeoutMillis, TimeUnit.MILLISECONDS);
-    } catch (InterruptedException | TimeoutException e) {
-      log.warn(
-          timeoutMillis
-              + " ms timeout reached for IntraLineDiff"
-              + " in project "
-              + args.project()
-              + " on commit "
-              + args.commit().name()
-              + " for path "
-              + args.path()
-              + " comparing "
-              + key.getBlobA().name()
-              + ".."
-              + key.getBlobB().name());
-      result.cancel(true);
-      return new IntraLineDiff(IntraLineDiff.Status.TIMEOUT);
-    } catch (ExecutionException e) {
-      // If there was an error computing the result, carry it
-      // up to the caller so the cache knows this key is invalid.
-      Throwables.throwIfInstanceOf(e.getCause(), Exception.class);
-      throw new Exception(e.getMessage(), e.getCause());
-    }
-  }
-
-  static IntraLineDiff compute(
-      Text aText,
-      Text bText,
-      ImmutableList<Edit> immutableEdits,
-      ImmutableSet<Edit> immutableEditsDueToRebase) {
-    List<Edit> edits = new ArrayList<>(immutableEdits);
-    combineLineEdits(edits, immutableEditsDueToRebase, aText, bText);
-
-    for (int i = 0; i < edits.size(); i++) {
-      Edit e = edits.get(i);
-
-      if (e.getType() == Edit.Type.REPLACE) {
-        CharText a = new CharText(aText, e.getBeginA(), e.getEndA());
-        CharText b = new CharText(bText, e.getBeginB(), e.getEndB());
-        CharTextComparator cmp = new CharTextComparator();
-
-        List<Edit> wordEdits = MyersDiff.INSTANCE.diff(cmp, a, b);
-
-        // Combine edits that are really close together. If they are
-        // just a few characters apart we tend to get better results
-        // by joining them together and taking the whole span.
-        //
-        for (int j = 0; j < wordEdits.size() - 1; ) {
-          Edit c = wordEdits.get(j);
-          Edit n = wordEdits.get(j + 1);
-
-          if (n.getBeginA() - c.getEndA() <= 5 || n.getBeginB() - c.getEndB() <= 5) {
-            int ab = c.getBeginA();
-            int ae = n.getEndA();
-
-            int bb = c.getBeginB();
-            int be = n.getEndB();
-
-            if (canCoalesce(a, c.getEndA(), n.getBeginA())
-                && canCoalesce(b, c.getEndB(), n.getBeginB())) {
-              wordEdits.set(j, new Edit(ab, ae, bb, be));
-              wordEdits.remove(j + 1);
-              continue;
-            }
-          }
-
-          j++;
-        }
-
-        // Apply some simple rules to fix up some of the edits. Our
-        // logic above, along with our per-character difference tends
-        // to produce some crazy stuff.
-        //
-        for (int j = 0; j < wordEdits.size(); j++) {
-          Edit c = wordEdits.get(j);
-          int ab = c.getBeginA();
-          int ae = c.getEndA();
-
-          int bb = c.getBeginB();
-          int be = c.getEndB();
-
-          // Sometimes the diff generator produces an INSERT or DELETE
-          // right up against a REPLACE, but we only find this after
-          // we've also played some shifting games on the prior edit.
-          // If that happened to us, coalesce them together so we can
-          // correct this mess for the user. If we don't we wind up
-          // with silly stuff like "es" -> "es = Addresses".
-          //
-          if (1 < j) {
-            Edit p = wordEdits.get(j - 1);
-            if (p.getEndA() == ab || p.getEndB() == bb) {
-              if (p.getEndA() == ab && p.getBeginA() < p.getEndA()) {
-                ab = p.getBeginA();
-              }
-              if (p.getEndB() == bb && p.getBeginB() < p.getEndB()) {
-                bb = p.getBeginB();
-              }
-              wordEdits.remove(--j);
-            }
-          }
-
-          // We sometimes collapsed an edit together in a strange way,
-          // such that the edges of each text is identical. Fix by
-          // by dropping out that incorrectly replaced region.
-          //
-          while (ab < ae && bb < be && cmp.equals(a, ab, b, bb)) {
-            ab++;
-            bb++;
-          }
-          while (ab < ae && bb < be && cmp.equals(a, ae - 1, b, be - 1)) {
-            ae--;
-            be--;
-          }
-
-          // The leading part of an edit and its trailing part in the same
-          // text might be identical. Slide down that edit and use the tail
-          // rather than the leading bit.
-          //
-          while (0 < ab
-              && ab < ae
-              && a.charAt(ab - 1) != '\n'
-              && cmp.equals(a, ab - 1, a, ae - 1)) {
-            ab--;
-            ae--;
-          }
-          if (!a.isLineStart(ab) || !a.contains(ab, ae, '\n')) {
-            while (ab < ae && ae < a.size() && cmp.equals(a, ab, a, ae)) {
-              ab++;
-              ae++;
-              if (a.charAt(ae - 1) == '\n') {
-                break;
-              }
-            }
-          }
-
-          while (0 < bb
-              && bb < be
-              && b.charAt(bb - 1) != '\n'
-              && cmp.equals(b, bb - 1, b, be - 1)) {
-            bb--;
-            be--;
-          }
-          if (!b.isLineStart(bb) || !b.contains(bb, be, '\n')) {
-            while (bb < be && be < b.size() && cmp.equals(b, bb, b, be)) {
-              bb++;
-              be++;
-              if (b.charAt(be - 1) == '\n') {
-                break;
-              }
-            }
-          }
-
-          // If most of a line was modified except the LF was common, make
-          // the LF part of the modification region. This is easier to read.
-          //
-          if (ab < ae //
-              && (ab == 0 || a.charAt(ab - 1) == '\n') //
-              && ae < a.size()
-              && a.charAt(ae - 1) != '\n'
-              && a.charAt(ae) == '\n') {
-            ae++;
-          }
-          if (bb < be //
-              && (bb == 0 || b.charAt(bb - 1) == '\n') //
-              && be < b.size()
-              && b.charAt(be - 1) != '\n'
-              && b.charAt(be) == '\n') {
-            be++;
-          }
-
-          wordEdits.set(j, new Edit(ab, ae, bb, be));
-        }
-
-        edits.set(i, new ReplaceEdit(e, wordEdits));
-      }
-    }
-
-    return new IntraLineDiff(edits);
-  }
-
-  private static void combineLineEdits(
-      List<Edit> edits, ImmutableSet<Edit> editsDueToRebase, Text a, Text b) {
-    for (int j = 0; j < edits.size() - 1; ) {
-      Edit c = edits.get(j);
-      Edit n = edits.get(j + 1);
-
-      if (editsDueToRebase.contains(c) || editsDueToRebase.contains(n)) {
-        // Don't combine any edits which were identified as being introduced by a rebase as we would
-        // lose that information because of the combination.
-        j++;
-        continue;
-      }
-
-      // Combine edits that are really close together. Right now our rule
-      // is, coalesce two line edits which are only one line apart if that
-      // common context line is either a "pointless line", or is identical
-      // on both sides and starts a new block of code. These are mostly
-      // block reindents to add or remove control flow operators.
-      //
-      final int ad = n.getBeginA() - c.getEndA();
-      final int bd = n.getBeginB() - c.getEndB();
-      if ((1 <= ad && isBlankLineGap(a, c.getEndA(), n.getBeginA()))
-          || (1 <= bd && isBlankLineGap(b, c.getEndB(), n.getBeginB()))
-          || (ad == 1 && bd == 1 && isControlBlockStart(a, c.getEndA()))) {
-        int ab = c.getBeginA();
-        int ae = n.getEndA();
-
-        int bb = c.getBeginB();
-        int be = n.getEndB();
-
-        edits.set(j, new Edit(ab, ae, bb, be));
-        edits.remove(j + 1);
-        continue;
-      }
-
-      j++;
-    }
-  }
-
-  private static boolean isBlankLineGap(Text a, int b, int e) {
-    for (; b < e; b++) {
-      if (!BLANK_LINE_RE.matcher(a.getString(b)).matches()) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  private static boolean isControlBlockStart(Text a, int idx) {
-    return CONTROL_BLOCK_START_RE.matcher(a.getString(idx)).find();
-  }
-
-  private static boolean canCoalesce(CharText a, int b, int e) {
-    while (b < e) {
-      if (a.charAt(b++) == '\n') {
-        return false;
-      }
-    }
-    return true;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchList.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchList.java
deleted file mode 100644
index 16ede58..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchList.java
+++ /dev/null
@@ -1,207 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.patch;
-
-import static com.google.gerrit.server.ioutil.BasicSerialization.readBytes;
-import static com.google.gerrit.server.ioutil.BasicSerialization.readVarInt32;
-import static com.google.gerrit.server.ioutil.BasicSerialization.writeBytes;
-import static com.google.gerrit.server.ioutil.BasicSerialization.writeVarInt32;
-import static org.eclipse.jgit.lib.ObjectIdSerialization.readCanBeNull;
-import static org.eclipse.jgit.lib.ObjectIdSerialization.readNotNull;
-import static org.eclipse.jgit.lib.ObjectIdSerialization.writeCanBeNull;
-import static org.eclipse.jgit.lib.ObjectIdSerialization.writeNotNull;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.reviewdb.client.Patch;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.zip.DeflaterOutputStream;
-import java.util.zip.InflaterInputStream;
-import org.eclipse.jgit.lib.AnyObjectId;
-import org.eclipse.jgit.lib.ObjectId;
-
-public class PatchList implements Serializable {
-  private static final long serialVersionUID = PatchListKey.serialVersionUID;
-
-  private static final Comparator<PatchListEntry> PATCH_CMP =
-      new Comparator<PatchListEntry>() {
-        @Override
-        public int compare(PatchListEntry a, PatchListEntry b) {
-          return comparePaths(a.getNewName(), b.getNewName());
-        }
-      };
-
-  @VisibleForTesting
-  static int comparePaths(String a, String b) {
-    int m1 = Patch.isMagic(a) ? (a.equals(Patch.MERGE_LIST) ? 2 : 1) : 3;
-    int m2 = Patch.isMagic(b) ? (b.equals(Patch.MERGE_LIST) ? 2 : 1) : 3;
-
-    if (m1 != m2) {
-      return m1 - m2;
-    } else if (m1 < 3) {
-      return 0;
-    }
-
-    // m1 == m2 == 3: normal names.
-    return a.compareTo(b);
-  }
-
-  @Nullable private transient ObjectId oldId;
-  private transient ObjectId newId;
-  private transient boolean isMerge;
-  private transient ComparisonType comparisonType;
-  private transient int insertions;
-  private transient int deletions;
-  private transient PatchListEntry[] patches;
-
-  public PatchList(
-      @Nullable AnyObjectId oldId,
-      AnyObjectId newId,
-      boolean isMerge,
-      ComparisonType comparisonType,
-      PatchListEntry[] patches) {
-    this.oldId = oldId != null ? oldId.copy() : null;
-    this.newId = newId.copy();
-    this.isMerge = isMerge;
-    this.comparisonType = comparisonType;
-
-    Arrays.sort(patches, 0, patches.length, PATCH_CMP);
-
-    // Skip magic files
-    int i = 0;
-    for (; i < patches.length; i++) {
-      if (!Patch.isMagic(patches[i].getNewName())) {
-        break;
-      }
-    }
-    for (; i < patches.length; i++) {
-      insertions += patches[i].getInsertions();
-      deletions += patches[i].getDeletions();
-    }
-
-    this.patches = patches;
-  }
-
-  /** Old side tree or commit; null only if this is a combined diff. */
-  @Nullable
-  public ObjectId getOldId() {
-    return oldId;
-  }
-
-  /** New side commit. */
-  public ObjectId getNewId() {
-    return newId;
-  }
-
-  /** Get a sorted, unmodifiable list of all files in this list. */
-  public List<PatchListEntry> getPatches() {
-    return Collections.unmodifiableList(Arrays.asList(patches));
-  }
-
-  /** @return the comparison type */
-  public ComparisonType getComparisonType() {
-    return comparisonType;
-  }
-
-  /** @return total number of new lines added. */
-  public int getInsertions() {
-    return insertions;
-  }
-
-  /** @return total number of lines removed. */
-  public int getDeletions() {
-    return deletions;
-  }
-
-  /**
-   * Get a sorted, modifiable list of all files in this list.
-   *
-   * <p>The returned list items do not populate:
-   *
-   * <ul>
-   *   <li>{@link Patch#getCommentCount()}
-   *   <li>{@link Patch#getDraftCount()}
-   *   <li>{@link Patch#isReviewedByCurrentUser()}
-   * </ul>
-   *
-   * @param setId the patch set identity these patches belong to. This really should not need to be
-   *     specified, but is a current legacy artifact of how the cache is keyed versus how the
-   *     database is keyed.
-   */
-  public List<Patch> toPatchList(PatchSet.Id setId) {
-    final ArrayList<Patch> r = new ArrayList<>(patches.length);
-    for (PatchListEntry e : patches) {
-      r.add(e.toPatch(setId));
-    }
-    return r;
-  }
-
-  /** Find an entry by name, returning an empty entry if not present. */
-  public PatchListEntry get(String fileName) {
-    final int index = search(fileName);
-    return 0 <= index ? patches[index] : PatchListEntry.empty(fileName);
-  }
-
-  private int search(String fileName) {
-    PatchListEntry want = PatchListEntry.empty(fileName);
-    return Arrays.binarySearch(patches, 0, patches.length, want, PATCH_CMP);
-  }
-
-  private void writeObject(ObjectOutputStream output) throws IOException {
-    final ByteArrayOutputStream buf = new ByteArrayOutputStream();
-    try (DeflaterOutputStream out = new DeflaterOutputStream(buf)) {
-      writeCanBeNull(out, oldId);
-      writeNotNull(out, newId);
-      writeVarInt32(out, isMerge ? 1 : 0);
-      comparisonType.writeTo(out);
-      writeVarInt32(out, insertions);
-      writeVarInt32(out, deletions);
-      writeVarInt32(out, patches.length);
-      for (PatchListEntry p : patches) {
-        p.writeTo(out);
-      }
-    }
-    writeBytes(output, buf.toByteArray());
-  }
-
-  private void readObject(ObjectInputStream input) throws IOException {
-    final ByteArrayInputStream buf = new ByteArrayInputStream(readBytes(input));
-    try (InflaterInputStream in = new InflaterInputStream(buf)) {
-      oldId = readCanBeNull(in);
-      newId = readNotNull(in);
-      isMerge = readVarInt32(in) != 0;
-      comparisonType = ComparisonType.readFrom(in);
-      insertions = readVarInt32(in);
-      deletions = readVarInt32(in);
-      final int cnt = readVarInt32(in);
-      final PatchListEntry[] all = new PatchListEntry[cnt];
-      for (int i = 0; i < all.length; i++) {
-        all[i] = PatchListEntry.readFrom(in);
-      }
-      patches = all;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListCacheImpl.java
deleted file mode 100644
index 01c8b41..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListCacheImpl.java
+++ /dev/null
@@ -1,191 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.patch;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.cache.Cache;
-import com.google.common.util.concurrent.UncheckedExecutionException;
-import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.cache.CacheModule;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.inject.Inject;
-import com.google.inject.Module;
-import com.google.inject.Singleton;
-import com.google.inject.name.Named;
-import java.util.concurrent.ExecutionException;
-import org.eclipse.jgit.errors.LargeObjectException;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-
-/** Provides a cached list of {@link PatchListEntry}. */
-@Singleton
-public class PatchListCacheImpl implements PatchListCache {
-  static final String FILE_NAME = "diff";
-  static final String INTRA_NAME = "diff_intraline";
-  static final String DIFF_SUMMARY = "diff_summary";
-
-  public static Module module() {
-    return new CacheModule() {
-      @Override
-      protected void configure() {
-        factory(PatchListLoader.Factory.class);
-        persist(FILE_NAME, PatchListKey.class, PatchList.class)
-            .maximumWeight(10 << 20)
-            .weigher(PatchListWeigher.class);
-
-        factory(IntraLineLoader.Factory.class);
-        persist(INTRA_NAME, IntraLineDiffKey.class, IntraLineDiff.class)
-            .maximumWeight(10 << 20)
-            .weigher(IntraLineWeigher.class);
-
-        factory(DiffSummaryLoader.Factory.class);
-        persist(DIFF_SUMMARY, DiffSummaryKey.class, DiffSummary.class)
-            .maximumWeight(10 << 20)
-            .weigher(DiffSummaryWeigher.class)
-            .diskLimit(1 << 30);
-
-        bind(PatchListCacheImpl.class);
-        bind(PatchListCache.class).to(PatchListCacheImpl.class);
-      }
-    };
-  }
-
-  private final Cache<PatchListKey, PatchList> fileCache;
-  private final Cache<IntraLineDiffKey, IntraLineDiff> intraCache;
-  private final Cache<DiffSummaryKey, DiffSummary> diffSummaryCache;
-  private final PatchListLoader.Factory fileLoaderFactory;
-  private final IntraLineLoader.Factory intraLoaderFactory;
-  private final DiffSummaryLoader.Factory diffSummaryLoaderFactory;
-  private final boolean computeIntraline;
-
-  @Inject
-  PatchListCacheImpl(
-      @Named(FILE_NAME) Cache<PatchListKey, PatchList> fileCache,
-      @Named(INTRA_NAME) Cache<IntraLineDiffKey, IntraLineDiff> intraCache,
-      @Named(DIFF_SUMMARY) Cache<DiffSummaryKey, DiffSummary> diffSummaryCache,
-      PatchListLoader.Factory fileLoaderFactory,
-      IntraLineLoader.Factory intraLoaderFactory,
-      DiffSummaryLoader.Factory diffSummaryLoaderFactory,
-      @GerritServerConfig Config cfg) {
-    this.fileCache = fileCache;
-    this.intraCache = intraCache;
-    this.diffSummaryCache = diffSummaryCache;
-    this.fileLoaderFactory = fileLoaderFactory;
-    this.intraLoaderFactory = intraLoaderFactory;
-    this.diffSummaryLoaderFactory = diffSummaryLoaderFactory;
-
-    this.computeIntraline =
-        cfg.getBoolean(
-            "cache", INTRA_NAME, "enabled", cfg.getBoolean("cache", "diff", "intraline", true));
-  }
-
-  @Override
-  public PatchList get(PatchListKey key, Project.NameKey project)
-      throws PatchListNotAvailableException {
-    try {
-      PatchList pl = fileCache.get(key, fileLoaderFactory.create(key, project));
-      if (pl instanceof LargeObjectTombstone) {
-        throw new PatchListObjectTooLargeException(
-            "Error computing " + key + ". Previous attempt failed with LargeObjectException");
-      }
-      return pl;
-    } catch (ExecutionException e) {
-      PatchListLoader.log.warn("Error computing " + key, e);
-      throw new PatchListNotAvailableException(e);
-    } catch (UncheckedExecutionException e) {
-      if (e.getCause() instanceof LargeObjectException) {
-        // Cache negative result so we don't need to redo expensive computations that would yield
-        // the same result.
-        fileCache.put(key, new LargeObjectTombstone());
-        PatchListLoader.log.warn("Error computing " + key, e);
-        throw new PatchListNotAvailableException(e);
-      }
-      throw e;
-    }
-  }
-
-  @Override
-  public PatchList get(Change change, PatchSet patchSet) throws PatchListNotAvailableException {
-    return get(change, patchSet, null);
-  }
-
-  @Override
-  public ObjectId getOldId(Change change, PatchSet patchSet, Integer parentNum)
-      throws PatchListNotAvailableException {
-    return get(change, patchSet, parentNum).getOldId();
-  }
-
-  private PatchList get(Change change, PatchSet patchSet, Integer parentNum)
-      throws PatchListNotAvailableException {
-    Project.NameKey project = change.getProject();
-    if (patchSet.getRevision() == null) {
-      throw new PatchListNotAvailableException("revision is null for " + patchSet.getId());
-    }
-    ObjectId b = ObjectId.fromString(patchSet.getRevision().get());
-    Whitespace ws = Whitespace.IGNORE_NONE;
-    if (parentNum != null) {
-      return get(PatchListKey.againstParentNum(parentNum, b, ws), project);
-    }
-    return get(PatchListKey.againstDefaultBase(b, ws), project);
-  }
-
-  @Override
-  public IntraLineDiff getIntraLineDiff(IntraLineDiffKey key, IntraLineDiffArgs args) {
-    if (computeIntraline) {
-      try {
-        return intraCache.get(key, intraLoaderFactory.create(key, args));
-      } catch (ExecutionException | LargeObjectException e) {
-        IntraLineLoader.log.warn("Error computing " + key, e);
-        return new IntraLineDiff(IntraLineDiff.Status.ERROR);
-      }
-    }
-    return new IntraLineDiff(IntraLineDiff.Status.DISABLED);
-  }
-
-  @Override
-  public DiffSummary getDiffSummary(DiffSummaryKey key, Project.NameKey project)
-      throws PatchListNotAvailableException {
-    try {
-      return diffSummaryCache.get(key, diffSummaryLoaderFactory.create(key, project));
-    } catch (ExecutionException e) {
-      PatchListLoader.log.warn("Error computing " + key, e);
-      throw new PatchListNotAvailableException(e);
-    } catch (UncheckedExecutionException e) {
-      if (e.getCause() instanceof LargeObjectException) {
-        PatchListLoader.log.warn("Error computing " + key, e);
-        throw new PatchListNotAvailableException(e);
-      }
-      throw e;
-    }
-  }
-
-  /** Used to cache negative results in {@code fileCache}. */
-  @VisibleForTesting
-  public static class LargeObjectTombstone extends PatchList {
-    private static final long serialVersionUID = 1L;
-
-    @VisibleForTesting
-    public LargeObjectTombstone() {
-      // Initialize super class with valid values. We don't care about the inner state, but need to
-      // pass valid values that don't break (de)serialization.
-      super(
-          null, ObjectId.zeroId(), false, ComparisonType.againstAutoMerge(), new PatchListEntry[0]);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListEntry.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListEntry.java
deleted file mode 100644
index 96f66f6..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListEntry.java
+++ /dev/null
@@ -1,373 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.patch;
-
-import static com.google.gerrit.server.ioutil.BasicSerialization.readBytes;
-import static com.google.gerrit.server.ioutil.BasicSerialization.readEnum;
-import static com.google.gerrit.server.ioutil.BasicSerialization.readFixInt64;
-import static com.google.gerrit.server.ioutil.BasicSerialization.readString;
-import static com.google.gerrit.server.ioutil.BasicSerialization.readVarInt32;
-import static com.google.gerrit.server.ioutil.BasicSerialization.writeBytes;
-import static com.google.gerrit.server.ioutil.BasicSerialization.writeEnum;
-import static com.google.gerrit.server.ioutil.BasicSerialization.writeFixInt64;
-import static com.google.gerrit.server.ioutil.BasicSerialization.writeString;
-import static com.google.gerrit.server.ioutil.BasicSerialization.writeVarInt32;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.reviewdb.client.Patch;
-import com.google.gerrit.reviewdb.client.Patch.ChangeType;
-import com.google.gerrit.reviewdb.client.Patch.PatchType;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-import org.eclipse.jgit.diff.Edit;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.patch.CombinedFileHeader;
-import org.eclipse.jgit.patch.FileHeader;
-import org.eclipse.jgit.util.IntList;
-import org.eclipse.jgit.util.RawParseUtils;
-
-public class PatchListEntry {
-  private static final byte[] EMPTY_HEADER = {};
-
-  static PatchListEntry empty(String fileName) {
-    return new PatchListEntry(
-        ChangeType.MODIFIED,
-        PatchType.UNIFIED,
-        null,
-        fileName,
-        EMPTY_HEADER,
-        ImmutableList.of(),
-        ImmutableSet.of(),
-        0,
-        0,
-        0,
-        0);
-  }
-
-  private final ChangeType changeType;
-  private final PatchType patchType;
-  private final String oldName;
-  private final String newName;
-  private final byte[] header;
-  private final ImmutableList<Edit> edits;
-  private final ImmutableSet<Edit> editsDueToRebase;
-  private final int insertions;
-  private final int deletions;
-  private final long size;
-  private final long sizeDelta;
-  // Note: When adding new fields, the serialVersionUID in PatchListKey must be
-  // incremented so that entries from the cache are automatically invalidated.
-
-  PatchListEntry(
-      FileHeader hdr, List<Edit> editList, Set<Edit> editsDueToRebase, long size, long sizeDelta) {
-    changeType = toChangeType(hdr);
-    patchType = toPatchType(hdr);
-
-    switch (changeType) {
-      case DELETED:
-        oldName = null;
-        newName = hdr.getOldPath();
-        break;
-
-      case ADDED:
-      case MODIFIED:
-      case REWRITE:
-        oldName = null;
-        newName = hdr.getNewPath();
-        break;
-
-      case COPIED:
-      case RENAMED:
-        oldName = hdr.getOldPath();
-        newName = hdr.getNewPath();
-        break;
-
-      default:
-        throw new IllegalArgumentException("Unsupported type " + changeType);
-    }
-
-    header = compact(hdr);
-
-    if (hdr instanceof CombinedFileHeader || hdr.getHunks().isEmpty()) {
-      edits = ImmutableList.of();
-    } else {
-      edits = ImmutableList.copyOf(editList);
-    }
-    this.editsDueToRebase = ImmutableSet.copyOf(editsDueToRebase);
-
-    int ins = 0;
-    int del = 0;
-    for (Edit e : editList) {
-      if (!editsDueToRebase.contains(e)) {
-        del += e.getEndA() - e.getBeginA();
-        ins += e.getEndB() - e.getBeginB();
-      }
-    }
-    insertions = ins;
-    deletions = del;
-    this.size = size;
-    this.sizeDelta = sizeDelta;
-  }
-
-  private PatchListEntry(
-      ChangeType changeType,
-      PatchType patchType,
-      String oldName,
-      String newName,
-      byte[] header,
-      ImmutableList<Edit> edits,
-      ImmutableSet<Edit> editsDueToRebase,
-      int insertions,
-      int deletions,
-      long size,
-      long sizeDelta) {
-    this.changeType = changeType;
-    this.patchType = patchType;
-    this.oldName = oldName;
-    this.newName = newName;
-    this.header = header;
-    this.edits = edits;
-    this.editsDueToRebase = editsDueToRebase;
-    this.insertions = insertions;
-    this.deletions = deletions;
-    this.size = size;
-    this.sizeDelta = sizeDelta;
-  }
-
-  int weigh() {
-    int size = 16 + 6 * 8 + 2 * 4 + 20 + 16 + 8 + 4 + 20;
-    size += stringSize(oldName);
-    size += stringSize(newName);
-    size += header.length;
-    size += (8 + 16 + 4 * 4) * edits.size();
-    size += (8 + 16 + 4 * 4) * editsDueToRebase.size();
-    return size;
-  }
-
-  private static int stringSize(String str) {
-    if (str != null) {
-      return 16 + 3 * 4 + 16 + str.length() * 2;
-    }
-    return 0;
-  }
-
-  public ChangeType getChangeType() {
-    return changeType;
-  }
-
-  public PatchType getPatchType() {
-    return patchType;
-  }
-
-  public String getOldName() {
-    return oldName;
-  }
-
-  public String getNewName() {
-    return newName;
-  }
-
-  public ImmutableList<Edit> getEdits() {
-    return edits;
-  }
-
-  public ImmutableSet<Edit> getEditsDueToRebase() {
-    return editsDueToRebase;
-  }
-
-  public int getInsertions() {
-    return insertions;
-  }
-
-  public int getDeletions() {
-    return deletions;
-  }
-
-  public long getSize() {
-    return size;
-  }
-
-  public long getSizeDelta() {
-    return sizeDelta;
-  }
-
-  public List<String> getHeaderLines() {
-    final IntList m = RawParseUtils.lineMap(header, 0, header.length);
-    final List<String> headerLines = new ArrayList<>(m.size() - 1);
-    for (int i = 1; i < m.size() - 1; i++) {
-      final int b = m.get(i);
-      int e = m.get(i + 1);
-      if (header[e - 1] == '\n') {
-        e--;
-      }
-      headerLines.add(RawParseUtils.decode(Constants.CHARSET, header, b, e));
-    }
-    return headerLines;
-  }
-
-  Patch toPatch(PatchSet.Id setId) {
-    final Patch p = new Patch(new Patch.Key(setId, getNewName()));
-    p.setChangeType(getChangeType());
-    p.setPatchType(getPatchType());
-    p.setSourceFileName(getOldName());
-    p.setInsertions(insertions);
-    p.setDeletions(deletions);
-    return p;
-  }
-
-  void writeTo(OutputStream out) throws IOException {
-    writeEnum(out, changeType);
-    writeEnum(out, patchType);
-    writeString(out, oldName);
-    writeString(out, newName);
-    writeBytes(out, header);
-    writeVarInt32(out, insertions);
-    writeVarInt32(out, deletions);
-    writeFixInt64(out, size);
-    writeFixInt64(out, sizeDelta);
-
-    writeEditArray(out, edits);
-    writeEditArray(out, editsDueToRebase);
-  }
-
-  private static void writeEditArray(OutputStream out, Collection<Edit> edits) throws IOException {
-    writeVarInt32(out, edits.size());
-    for (Edit edit : edits) {
-      writeVarInt32(out, edit.getBeginA());
-      writeVarInt32(out, edit.getEndA());
-      writeVarInt32(out, edit.getBeginB());
-      writeVarInt32(out, edit.getEndB());
-    }
-  }
-
-  static PatchListEntry readFrom(InputStream in) throws IOException {
-    ChangeType changeType = readEnum(in, ChangeType.values());
-    PatchType patchType = readEnum(in, PatchType.values());
-    String oldName = readString(in);
-    String newName = readString(in);
-    byte[] hdr = readBytes(in);
-    int ins = readVarInt32(in);
-    int del = readVarInt32(in);
-    long size = readFixInt64(in);
-    long sizeDelta = readFixInt64(in);
-
-    Edit[] editArray = readEditArray(in);
-    Edit[] editsDueToRebase = readEditArray(in);
-
-    return new PatchListEntry(
-        changeType,
-        patchType,
-        oldName,
-        newName,
-        hdr,
-        ImmutableList.copyOf(editArray),
-        ImmutableSet.copyOf(editsDueToRebase),
-        ins,
-        del,
-        size,
-        sizeDelta);
-  }
-
-  private static Edit[] readEditArray(InputStream in) throws IOException {
-    int numEdits = readVarInt32(in);
-    Edit[] edits = new Edit[numEdits];
-    for (int i = 0; i < numEdits; i++) {
-      int beginA = readVarInt32(in);
-      int endA = readVarInt32(in);
-      int beginB = readVarInt32(in);
-      int endB = readVarInt32(in);
-      edits[i] = new Edit(beginA, endA, beginB, endB);
-    }
-    return edits;
-  }
-
-  private static byte[] compact(FileHeader h) {
-    final int end = end(h);
-    if (h.getStartOffset() == 0 && end == h.getBuffer().length) {
-      return h.getBuffer();
-    }
-
-    final byte[] buf = new byte[end - h.getStartOffset()];
-    System.arraycopy(h.getBuffer(), h.getStartOffset(), buf, 0, buf.length);
-    return buf;
-  }
-
-  private static int end(FileHeader h) {
-    if (h instanceof CombinedFileHeader) {
-      return h.getEndOffset();
-    }
-    if (!h.getHunks().isEmpty()) {
-      return h.getHunks().get(0).getStartOffset();
-    }
-    return h.getEndOffset();
-  }
-
-  private static ChangeType toChangeType(FileHeader hdr) {
-    switch (hdr.getChangeType()) {
-      case ADD:
-        return Patch.ChangeType.ADDED;
-      case MODIFY:
-        return Patch.ChangeType.MODIFIED;
-      case DELETE:
-        return Patch.ChangeType.DELETED;
-      case RENAME:
-        return Patch.ChangeType.RENAMED;
-      case COPY:
-        return Patch.ChangeType.COPIED;
-      default:
-        throw new IllegalArgumentException("Unsupported type " + hdr.getChangeType());
-    }
-  }
-
-  private static PatchType toPatchType(FileHeader hdr) {
-    PatchType pt;
-
-    switch (hdr.getPatchType()) {
-      case UNIFIED:
-        pt = Patch.PatchType.UNIFIED;
-        break;
-      case GIT_BINARY:
-      case BINARY:
-        pt = Patch.PatchType.BINARY;
-        break;
-      default:
-        throw new IllegalArgumentException("Unsupported type " + hdr.getPatchType());
-    }
-
-    if (pt != PatchType.BINARY) {
-      final byte[] buf = hdr.getBuffer();
-      for (int ptr = hdr.getStartOffset(); ptr < hdr.getEndOffset(); ptr++) {
-        if (buf[ptr] == '\0') {
-          // Its really binary, but Git couldn't see the nul early enough
-          // to realize its binary, and instead produced the diff.
-          //
-          // Force it to be a binary; it really should have been that.
-          //
-          pt = PatchType.BINARY;
-          break;
-        }
-      }
-    }
-
-    return pt;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListKey.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListKey.java
deleted file mode 100644
index 39ebcab..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListKey.java
+++ /dev/null
@@ -1,181 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.patch;
-
-import static com.google.common.base.Preconditions.checkState;
-import static org.eclipse.jgit.lib.ObjectIdSerialization.readCanBeNull;
-import static org.eclipse.jgit.lib.ObjectIdSerialization.readNotNull;
-import static org.eclipse.jgit.lib.ObjectIdSerialization.writeCanBeNull;
-import static org.eclipse.jgit.lib.ObjectIdSerialization.writeNotNull;
-
-import com.google.common.collect.ImmutableBiMap;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-import java.util.Objects;
-import org.eclipse.jgit.lib.AnyObjectId;
-import org.eclipse.jgit.lib.ObjectId;
-
-public class PatchListKey implements Serializable {
-  public static final long serialVersionUID = 31L;
-
-  public static final ImmutableBiMap<Whitespace, Character> WHITESPACE_TYPES =
-      ImmutableBiMap.of(
-          Whitespace.IGNORE_NONE, 'N',
-          Whitespace.IGNORE_TRAILING, 'E',
-          Whitespace.IGNORE_LEADING_AND_TRAILING, 'S',
-          Whitespace.IGNORE_ALL, 'A');
-
-  static {
-    checkState(WHITESPACE_TYPES.size() == Whitespace.values().length);
-  }
-
-  public static PatchListKey againstDefaultBase(AnyObjectId newId, Whitespace ws) {
-    return new PatchListKey(null, newId, ws);
-  }
-
-  public static PatchListKey againstParentNum(int parentNum, AnyObjectId newId, Whitespace ws) {
-    return new PatchListKey(parentNum, newId, ws);
-  }
-
-  public static PatchListKey againstCommit(
-      AnyObjectId otherCommitId, AnyObjectId newId, Whitespace whitespace) {
-    return new PatchListKey(otherCommitId, newId, whitespace);
-  }
-
-  /**
-   * Old patch-set ID
-   *
-   * <p>When null, it represents the Base of the newId for a non-merge commit.
-   *
-   * <p>When newId is a merge commit, null value of the oldId represents either the auto-merge
-   * commit of the newId or a parent commit of the newId. These two cases are distinguished by the
-   * parentNum.
-   */
-  private transient ObjectId oldId;
-
-  /**
-   * 1-based parent number when newId is a merge commit
-   *
-   * <p>For the auto-merge case this field is null.
-   *
-   * <p>Used only when oldId is null and newId is a merge commit
-   */
-  private transient Integer parentNum;
-
-  private transient ObjectId newId;
-  private transient Whitespace whitespace;
-
-  private PatchListKey(AnyObjectId a, AnyObjectId b, Whitespace ws) {
-    oldId = a != null ? a.copy() : null;
-    newId = b.copy();
-    whitespace = ws;
-  }
-
-  private PatchListKey(int parentNum, AnyObjectId b, Whitespace ws) {
-    this.parentNum = Integer.valueOf(parentNum);
-    newId = b.copy();
-    whitespace = ws;
-  }
-
-  /** For use only by DiffSummaryKey. */
-  PatchListKey(ObjectId oldId, Integer parentNum, ObjectId newId, Whitespace whitespace) {
-    this.oldId = oldId;
-    this.parentNum = parentNum;
-    this.newId = newId;
-    this.whitespace = whitespace;
-  }
-
-  /** Old side commit, or null to assume ancestor or combined merge. */
-  @Nullable
-  public ObjectId getOldId() {
-    return oldId;
-  }
-
-  /** Parent number (old side) of the new side (merge) commit */
-  @Nullable
-  public Integer getParentNum() {
-    return parentNum;
-  }
-
-  /** New side commit name. */
-  public ObjectId getNewId() {
-    return newId;
-  }
-
-  public Whitespace getWhitespace() {
-    return whitespace;
-  }
-
-  @Override
-  public int hashCode() {
-    return Objects.hash(oldId, parentNum, newId, whitespace);
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (o instanceof PatchListKey) {
-      PatchListKey k = (PatchListKey) o;
-      return Objects.equals(oldId, k.oldId)
-          && Objects.equals(parentNum, k.parentNum)
-          && Objects.equals(newId, k.newId)
-          && whitespace == k.whitespace;
-    }
-    return false;
-  }
-
-  @Override
-  public String toString() {
-    StringBuilder n = new StringBuilder();
-    n.append("PatchListKey[");
-    n.append(oldId != null ? oldId.name() : "BASE");
-    n.append("..");
-    n.append(newId.name());
-    n.append(" ");
-    if (parentNum != null) {
-      n.append(parentNum);
-      n.append(" ");
-    }
-    n.append(whitespace.name());
-    n.append("]");
-    return n.toString();
-  }
-
-  private void writeObject(ObjectOutputStream out) throws IOException {
-    writeCanBeNull(out, oldId);
-    out.writeInt(parentNum == null ? 0 : parentNum);
-    writeNotNull(out, newId);
-    Character c = WHITESPACE_TYPES.get(whitespace);
-    if (c == null) {
-      throw new IOException("Invalid whitespace type: " + whitespace);
-    }
-    out.writeChar(c);
-  }
-
-  private void readObject(ObjectInputStream in) throws IOException {
-    oldId = readCanBeNull(in);
-    int n = in.readInt();
-    parentNum = n == 0 ? null : Integer.valueOf(n);
-    newId = readNotNull(in);
-    char t = in.readChar();
-    whitespace = WHITESPACE_TYPES.inverse().get(t);
-    if (whitespace == null) {
-      throw new IOException("Invalid whitespace type code: " + t);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListLoader.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListLoader.java
deleted file mode 100644
index 563020e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListLoader.java
+++ /dev/null
@@ -1,601 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.patch;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.collect.ImmutableList.toImmutableList;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.stream.Collectors.toSet;
-import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.base.Throwables;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMultimap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Multimap;
-import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
-import com.google.gerrit.reviewdb.client.Patch;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.config.ConfigUtil;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.InMemoryInserter;
-import com.google.gerrit.server.git.MergeUtil;
-import com.google.gerrit.server.patch.EditTransformer.ContextAwareEdit;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import org.eclipse.jgit.diff.DiffEntry;
-import org.eclipse.jgit.diff.DiffEntry.ChangeType;
-import org.eclipse.jgit.diff.DiffFormatter;
-import org.eclipse.jgit.diff.Edit;
-import org.eclipse.jgit.diff.EditList;
-import org.eclipse.jgit.diff.HistogramDiff;
-import org.eclipse.jgit.diff.RawText;
-import org.eclipse.jgit.diff.RawTextComparator;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.FileMode;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.merge.ThreeWayMergeStrategy;
-import org.eclipse.jgit.patch.FileHeader;
-import org.eclipse.jgit.patch.FileHeader.PatchType;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevObject;
-import org.eclipse.jgit.revwalk.RevTree;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.treewalk.TreeWalk;
-import org.eclipse.jgit.util.io.DisabledOutputStream;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class PatchListLoader implements Callable<PatchList> {
-  static final Logger log = LoggerFactory.getLogger(PatchListLoader.class);
-
-  public interface Factory {
-    PatchListLoader create(PatchListKey key, Project.NameKey project);
-  }
-
-  private final GitRepositoryManager repoManager;
-  private final PatchListCache patchListCache;
-  private final ThreeWayMergeStrategy mergeStrategy;
-  private final ExecutorService diffExecutor;
-  private final AutoMerger autoMerger;
-  private final PatchListKey key;
-  private final Project.NameKey project;
-  private final long timeoutMillis;
-  private final boolean save;
-
-  @Inject
-  PatchListLoader(
-      GitRepositoryManager mgr,
-      PatchListCache plc,
-      @GerritServerConfig Config cfg,
-      @DiffExecutor ExecutorService de,
-      AutoMerger am,
-      @Assisted PatchListKey k,
-      @Assisted Project.NameKey p) {
-    repoManager = mgr;
-    patchListCache = plc;
-    mergeStrategy = MergeUtil.getMergeStrategy(cfg);
-    diffExecutor = de;
-    autoMerger = am;
-    key = k;
-    project = p;
-    timeoutMillis =
-        ConfigUtil.getTimeUnit(
-            cfg,
-            "cache",
-            PatchListCacheImpl.FILE_NAME,
-            "timeout",
-            TimeUnit.MILLISECONDS.convert(5, TimeUnit.SECONDS),
-            TimeUnit.MILLISECONDS);
-    save = AutoMerger.cacheAutomerge(cfg);
-  }
-
-  @Override
-  public PatchList call() throws IOException, PatchListNotAvailableException {
-    try (Repository repo = repoManager.openRepository(project);
-        ObjectInserter ins = newInserter(repo);
-        ObjectReader reader = ins.newReader();
-        RevWalk rw = new RevWalk(reader)) {
-      return readPatchList(repo, rw, ins);
-    }
-  }
-
-  private static RawTextComparator comparatorFor(Whitespace ws) {
-    switch (ws) {
-      case IGNORE_ALL:
-        return RawTextComparator.WS_IGNORE_ALL;
-
-      case IGNORE_TRAILING:
-        return RawTextComparator.WS_IGNORE_TRAILING;
-
-      case IGNORE_LEADING_AND_TRAILING:
-        return RawTextComparator.WS_IGNORE_CHANGE;
-
-      case IGNORE_NONE:
-      default:
-        return RawTextComparator.DEFAULT;
-    }
-  }
-
-  private ObjectInserter newInserter(Repository repo) {
-    return save ? repo.newObjectInserter() : new InMemoryInserter(repo);
-  }
-
-  private PatchList readPatchList(Repository repo, RevWalk rw, ObjectInserter ins)
-      throws IOException, PatchListNotAvailableException {
-    ObjectReader reader = rw.getObjectReader();
-    checkArgument(reader.getCreatedFromInserter() == ins);
-    RawTextComparator cmp = comparatorFor(key.getWhitespace());
-    try (DiffFormatter df = new DiffFormatter(DisabledOutputStream.INSTANCE)) {
-      RevCommit b = rw.parseCommit(key.getNewId());
-      RevObject a = aFor(key, repo, rw, ins, b);
-
-      if (a == null) {
-        // TODO(sop) Remove this case.
-        // This is an octopus merge commit which should be compared against the
-        // auto-merge. However since we don't support computing the auto-merge
-        // for octopus merge commits, we fall back to diffing against the first
-        // parent, even though this wasn't what was requested.
-        //
-        ComparisonType comparisonType = ComparisonType.againstParent(1);
-        PatchListEntry[] entries = new PatchListEntry[2];
-        entries[0] = newCommitMessage(cmp, reader, null, b);
-        entries[1] = newMergeList(cmp, reader, null, b, comparisonType);
-        return new PatchList(a, b, true, comparisonType, entries);
-      }
-
-      ComparisonType comparisonType = getComparisonType(a, b);
-
-      RevCommit aCommit = a instanceof RevCommit ? (RevCommit) a : null;
-      RevTree aTree = rw.parseTree(a);
-      RevTree bTree = b.getTree();
-
-      df.setReader(reader, repo.getConfig());
-      df.setDiffComparator(cmp);
-      df.setDetectRenames(true);
-      List<DiffEntry> diffEntries = df.scan(aTree, bTree);
-
-      Multimap<String, ContextAwareEdit> editsDueToRebasePerFilePath = ImmutableMultimap.of();
-      EditsDueToRebaseResult editsDueToRebaseResult =
-          determineEditsDueToRebase(aCommit, b, diffEntries, df, rw);
-      diffEntries = editsDueToRebaseResult.getRelevantOriginalDiffEntries();
-      editsDueToRebasePerFilePath = editsDueToRebaseResult.getEditsDueToRebasePerFilePath();
-
-      List<PatchListEntry> entries = new ArrayList<>();
-      entries.add(
-          newCommitMessage(
-              cmp, reader, comparisonType.isAgainstParentOrAutoMerge() ? null : aCommit, b));
-      boolean isMerge = b.getParentCount() > 1;
-      if (isMerge) {
-        entries.add(
-            newMergeList(
-                cmp,
-                reader,
-                comparisonType.isAgainstParentOrAutoMerge() ? null : aCommit,
-                b,
-                comparisonType));
-      }
-      for (DiffEntry diffEntry : diffEntries) {
-        Set<ContextAwareEdit> editsDueToRebase =
-            getEditsDueToRebase(editsDueToRebasePerFilePath, diffEntry);
-        Optional<PatchListEntry> patchListEntry =
-            getPatchListEntry(reader, df, diffEntry, aTree, bTree, editsDueToRebase);
-        patchListEntry.ifPresent(entries::add);
-      }
-      return new PatchList(
-          a, b, isMerge, comparisonType, entries.toArray(new PatchListEntry[entries.size()]));
-    }
-  }
-
-  /**
-   * Identifies the edits which are present between {@code commitA} and {@code commitB} due to other
-   * commits in between those two. Edits which cannot be clearly attributed to those other commits
-   * (because they overlap with modifications introduced by {@code commitA} or {@code commitB}) are
-   * omitted from the result. The edits are expressed as differences between {@code treeA} of {@code
-   * commitA} and {@code treeB} of {@code commitB}.
-   *
-   * <p><b>Note:</b> If one of the commits is a merge commit, an empty {@code Multimap} will be
-   * returned.
-   *
-   * <p><b>Warning:</b> This method assumes that commitA and commitB are either a parent and child
-   * commit or represent two patch sets which belong to the same change. No checks are made to
-   * confirm this assumption! Passing arbitrary commits to this method may lead to strange results
-   * or take very long.
-   *
-   * <p>This logic could be expanded to arbitrary commits if the following adjustments were applied:
-   *
-   * <ul>
-   *   <li>If {@code commitA} is an ancestor of {@code commitB} (or the other way around), {@code
-   *       commitA} (or {@code commitB}) is used instead of its parent in this method.
-   *   <li>Special handling for merge commits is added. If only one of them is a merge commit, the
-   *       whole computation has to be done between the single parent and all parents of the merge
-   *       commit. If both of them are merge commits, all combinations of parents have to be
-   *       considered. Alternatively, we could decide to not support this feature for merge commits
-   *       (or just for specific types of merge commits).
-   * </ul>
-   *
-   * @param commitA the commit defining {@code treeA}
-   * @param commitB the commit defining {@code treeB}
-   * @param diffEntries the list of {@code DiffEntries} for the diff between {@code commitA} and
-   *     {@code commitB}
-   * @param df the {@code DiffFormatter}
-   * @param rw the current {@code RevWalk}
-   * @return an aggregated result of the computation
-   * @throws PatchListNotAvailableException if the edits can't be identified
-   * @throws IOException if an error occurred while accessing the repository
-   */
-  private EditsDueToRebaseResult determineEditsDueToRebase(
-      RevCommit commitA,
-      RevCommit commitB,
-      List<DiffEntry> diffEntries,
-      DiffFormatter df,
-      RevWalk rw)
-      throws PatchListNotAvailableException, IOException {
-    if (commitA == null
-        || isRootOrMergeCommit(commitA)
-        || isRootOrMergeCommit(commitB)
-        || areParentChild(commitA, commitB)
-        || haveCommonParent(commitA, commitB)) {
-      return EditsDueToRebaseResult.create(diffEntries, ImmutableMultimap.of());
-    }
-
-    PatchListKey oldKey = PatchListKey.againstDefaultBase(key.getOldId(), key.getWhitespace());
-    PatchList oldPatchList = patchListCache.get(oldKey, project);
-    PatchListKey newKey = PatchListKey.againstDefaultBase(key.getNewId(), key.getWhitespace());
-    PatchList newPatchList = patchListCache.get(newKey, project);
-
-    List<PatchListEntry> oldPatches = oldPatchList.getPatches();
-    List<PatchListEntry> newPatches = newPatchList.getPatches();
-    // TODO(aliceks): Have separate but more limited lists for parents and patch sets (but don't
-    // mess up renames/copies).
-    Set<String> touchedFilePaths = new HashSet<>();
-    for (PatchListEntry patchListEntry : oldPatches) {
-      touchedFilePaths.addAll(getTouchedFilePaths(patchListEntry));
-    }
-    for (PatchListEntry patchListEntry : newPatches) {
-      touchedFilePaths.addAll(getTouchedFilePaths(patchListEntry));
-    }
-
-    List<DiffEntry> relevantDiffEntries =
-        diffEntries.stream()
-            .filter(diffEntry -> isTouched(touchedFilePaths, diffEntry))
-            .collect(toImmutableList());
-
-    RevCommit parentCommitA = commitA.getParent(0);
-    rw.parseBody(parentCommitA);
-    RevCommit parentCommitB = commitB.getParent(0);
-    rw.parseBody(parentCommitB);
-    List<DiffEntry> parentDiffEntries = df.scan(parentCommitA, parentCommitB);
-    // TODO(aliceks): Find a way to not construct a PatchListEntry as it contains many unnecessary
-    // details and we don't fill all of them properly.
-    List<PatchListEntry> parentPatchListEntries =
-        getRelevantPatchListEntries(
-            parentDiffEntries, parentCommitA, parentCommitB, touchedFilePaths, df);
-
-    EditTransformer editTransformer = new EditTransformer(parentPatchListEntries);
-    editTransformer.transformReferencesOfSideA(oldPatches);
-    editTransformer.transformReferencesOfSideB(newPatches);
-    return EditsDueToRebaseResult.create(
-        relevantDiffEntries, editTransformer.getEditsPerFilePath());
-  }
-
-  private static boolean isRootOrMergeCommit(RevCommit commit) {
-    return commit.getParentCount() != 1;
-  }
-
-  private static boolean areParentChild(RevCommit commitA, RevCommit commitB) {
-    return ObjectId.equals(commitA.getParent(0), commitB)
-        || ObjectId.equals(commitB.getParent(0), commitA);
-  }
-
-  private static boolean haveCommonParent(RevCommit commitA, RevCommit commitB) {
-    return ObjectId.equals(commitA.getParent(0), commitB.getParent(0));
-  }
-
-  private static Set<String> getTouchedFilePaths(PatchListEntry patchListEntry) {
-    String oldFilePath = patchListEntry.getOldName();
-    String newFilePath = patchListEntry.getNewName();
-
-    return oldFilePath == null
-        ? ImmutableSet.of(newFilePath)
-        : ImmutableSet.of(oldFilePath, newFilePath);
-  }
-
-  private static boolean isTouched(Set<String> touchedFilePaths, DiffEntry diffEntry) {
-    String oldFilePath = diffEntry.getOldPath();
-    String newFilePath = diffEntry.getNewPath();
-    // One of the above file paths could be /dev/null but we need not explicitly check for this
-    // value as the set of file paths shouldn't contain it.
-    return touchedFilePaths.contains(oldFilePath) || touchedFilePaths.contains(newFilePath);
-  }
-
-  private List<PatchListEntry> getRelevantPatchListEntries(
-      List<DiffEntry> parentDiffEntries,
-      RevCommit parentCommitA,
-      RevCommit parentCommitB,
-      Set<String> touchedFilePaths,
-      DiffFormatter diffFormatter)
-      throws IOException {
-    List<PatchListEntry> parentPatchListEntries = new ArrayList<>(parentDiffEntries.size());
-    for (DiffEntry parentDiffEntry : parentDiffEntries) {
-      if (!isTouched(touchedFilePaths, parentDiffEntry)) {
-        continue;
-      }
-      FileHeader fileHeader = toFileHeader(parentCommitB, diffFormatter, parentDiffEntry);
-      // The code which uses this PatchListEntry doesn't care about the last three parameters. As
-      // they are expensive to compute, we use arbitrary values for them.
-      PatchListEntry patchListEntry =
-          newEntry(parentCommitA.getTree(), fileHeader, ImmutableSet.of(), 0, 0);
-      parentPatchListEntries.add(patchListEntry);
-    }
-    return parentPatchListEntries;
-  }
-
-  private static Set<ContextAwareEdit> getEditsDueToRebase(
-      Multimap<String, ContextAwareEdit> editsDueToRebasePerFilePath, DiffEntry diffEntry) {
-    if (editsDueToRebasePerFilePath.isEmpty()) {
-      return ImmutableSet.of();
-    }
-
-    String filePath = diffEntry.getNewPath();
-    if (diffEntry.getChangeType() == ChangeType.DELETE) {
-      filePath = diffEntry.getOldPath();
-    }
-    return ImmutableSet.copyOf(editsDueToRebasePerFilePath.get(filePath));
-  }
-
-  private Optional<PatchListEntry> getPatchListEntry(
-      ObjectReader objectReader,
-      DiffFormatter diffFormatter,
-      DiffEntry diffEntry,
-      RevTree treeA,
-      RevTree treeB,
-      Set<ContextAwareEdit> editsDueToRebase)
-      throws IOException {
-    FileHeader fileHeader = toFileHeader(key.getNewId(), diffFormatter, diffEntry);
-    long oldSize = getFileSize(objectReader, diffEntry.getOldMode(), diffEntry.getOldPath(), treeA);
-    long newSize = getFileSize(objectReader, diffEntry.getNewMode(), diffEntry.getNewPath(), treeB);
-    Set<Edit> contentEditsDueToRebase = getContentEdits(editsDueToRebase);
-    PatchListEntry patchListEntry =
-        newEntry(treeA, fileHeader, contentEditsDueToRebase, newSize, newSize - oldSize);
-    // All edits in a file are due to rebase -> exclude the file from the diff.
-    if (EditTransformer.toEdits(patchListEntry).allMatch(editsDueToRebase::contains)) {
-      return Optional.empty();
-    }
-    return Optional.of(patchListEntry);
-  }
-
-  private static Set<Edit> getContentEdits(Set<ContextAwareEdit> editsDueToRebase) {
-    return editsDueToRebase.stream()
-        .map(ContextAwareEdit::toEdit)
-        .filter(Optional::isPresent)
-        .map(Optional::get)
-        .collect(toSet());
-  }
-
-  private ComparisonType getComparisonType(RevObject a, RevCommit b) {
-    for (int i = 0; i < b.getParentCount(); i++) {
-      if (b.getParent(i).equals(a)) {
-        return ComparisonType.againstParent(i + 1);
-      }
-    }
-
-    if (key.getOldId() == null && b.getParentCount() > 0) {
-      return ComparisonType.againstAutoMerge();
-    }
-
-    return ComparisonType.againstOtherPatchSet();
-  }
-
-  private static long getFileSize(ObjectReader reader, FileMode mode, String path, RevTree t)
-      throws IOException {
-    if (!isBlob(mode)) {
-      return 0;
-    }
-    try (TreeWalk tw = TreeWalk.forPath(reader, path, t)) {
-      return tw != null ? reader.open(tw.getObjectId(0), OBJ_BLOB).getSize() : 0;
-    }
-  }
-
-  private static boolean isBlob(FileMode mode) {
-    int t = mode.getBits() & FileMode.TYPE_MASK;
-    return t == FileMode.TYPE_FILE || t == FileMode.TYPE_SYMLINK;
-  }
-
-  private FileHeader toFileHeader(
-      ObjectId commitB, DiffFormatter diffFormatter, DiffEntry diffEntry) throws IOException {
-
-    Future<FileHeader> result =
-        diffExecutor.submit(
-            () -> {
-              synchronized (diffEntry) {
-                return diffFormatter.toFileHeader(diffEntry);
-              }
-            });
-
-    try {
-      return result.get(timeoutMillis, TimeUnit.MILLISECONDS);
-    } catch (InterruptedException | TimeoutException e) {
-      log.warn(
-          timeoutMillis
-              + " ms timeout reached for Diff loader"
-              + " in project "
-              + project
-              + " on commit "
-              + commitB.name()
-              + " on path "
-              + diffEntry.getNewPath()
-              + " comparing "
-              + diffEntry.getOldId().name()
-              + ".."
-              + diffEntry.getNewId().name());
-      result.cancel(true);
-      synchronized (diffEntry) {
-        return toFileHeaderWithoutMyersDiff(diffFormatter, diffEntry);
-      }
-    } catch (ExecutionException e) {
-      // If there was an error computing the result, carry it
-      // up to the caller so the cache knows this key is invalid.
-      Throwables.throwIfInstanceOf(e.getCause(), IOException.class);
-      throw new IOException(e.getMessage(), e.getCause());
-    }
-  }
-
-  private FileHeader toFileHeaderWithoutMyersDiff(DiffFormatter diffFormatter, DiffEntry diffEntry)
-      throws IOException {
-    HistogramDiff histogramDiff = new HistogramDiff();
-    histogramDiff.setFallbackAlgorithm(null);
-    diffFormatter.setDiffAlgorithm(histogramDiff);
-    return diffFormatter.toFileHeader(diffEntry);
-  }
-
-  private PatchListEntry newCommitMessage(
-      RawTextComparator cmp, ObjectReader reader, RevCommit aCommit, RevCommit bCommit)
-      throws IOException {
-    Text aText = aCommit != null ? Text.forCommit(reader, aCommit) : Text.EMPTY;
-    Text bText = Text.forCommit(reader, bCommit);
-    return createPatchListEntry(cmp, aCommit, aText, bText, Patch.COMMIT_MSG);
-  }
-
-  private PatchListEntry newMergeList(
-      RawTextComparator cmp,
-      ObjectReader reader,
-      RevCommit aCommit,
-      RevCommit bCommit,
-      ComparisonType comparisonType)
-      throws IOException {
-    Text aText = aCommit != null ? Text.forMergeList(comparisonType, reader, aCommit) : Text.EMPTY;
-    Text bText = Text.forMergeList(comparisonType, reader, bCommit);
-    return createPatchListEntry(cmp, aCommit, aText, bText, Patch.MERGE_LIST);
-  }
-
-  private static PatchListEntry createPatchListEntry(
-      RawTextComparator cmp, RevCommit aCommit, Text aText, Text bText, String fileName) {
-    byte[] rawHdr = getRawHeader(aCommit != null, fileName);
-    byte[] aContent = aText.getContent();
-    byte[] bContent = bText.getContent();
-    long size = bContent.length;
-    long sizeDelta = bContent.length - aContent.length;
-    RawText aRawText = new RawText(aContent);
-    RawText bRawText = new RawText(bContent);
-    EditList edits = new HistogramDiff().diff(cmp, aRawText, bRawText);
-    FileHeader fh = new FileHeader(rawHdr, edits, PatchType.UNIFIED);
-    return new PatchListEntry(fh, edits, ImmutableSet.of(), size, sizeDelta);
-  }
-
-  private static byte[] getRawHeader(boolean hasA, String fileName) {
-    StringBuilder hdr = new StringBuilder();
-    hdr.append("diff --git");
-    if (hasA) {
-      hdr.append(" a/").append(fileName);
-    } else {
-      hdr.append(" ").append(FileHeader.DEV_NULL);
-    }
-    hdr.append(" b/").append(fileName);
-    hdr.append("\n");
-
-    if (hasA) {
-      hdr.append("--- a/").append(fileName).append("\n");
-    } else {
-      hdr.append("--- ").append(FileHeader.DEV_NULL).append("\n");
-    }
-    hdr.append("+++ b/").append(fileName).append("\n");
-    return hdr.toString().getBytes(UTF_8);
-  }
-
-  private static PatchListEntry newEntry(
-      RevTree aTree, FileHeader fileHeader, Set<Edit> editsDueToRebase, long size, long sizeDelta) {
-    if (aTree == null // want combined diff
-        || fileHeader.getPatchType() != PatchType.UNIFIED
-        || fileHeader.getHunks().isEmpty()) {
-      return new PatchListEntry(fileHeader, ImmutableList.of(), ImmutableSet.of(), size, sizeDelta);
-    }
-
-    List<Edit> edits = fileHeader.toEditList();
-    if (edits.isEmpty()) {
-      return new PatchListEntry(fileHeader, ImmutableList.of(), ImmutableSet.of(), size, sizeDelta);
-    }
-    return new PatchListEntry(fileHeader, edits, editsDueToRebase, size, sizeDelta);
-  }
-
-  private RevObject aFor(
-      PatchListKey key, Repository repo, RevWalk rw, ObjectInserter ins, RevCommit b)
-      throws IOException {
-    if (key.getOldId() != null) {
-      return rw.parseAny(key.getOldId());
-    }
-
-    switch (b.getParentCount()) {
-      case 0:
-        return rw.parseAny(emptyTree(ins));
-      case 1:
-        {
-          RevCommit r = b.getParent(0);
-          rw.parseBody(r);
-          return r;
-        }
-      case 2:
-        if (key.getParentNum() != null) {
-          RevCommit r = b.getParent(key.getParentNum() - 1);
-          rw.parseBody(r);
-          return r;
-        }
-        return autoMerger.merge(repo, rw, ins, b, mergeStrategy);
-      default:
-        // TODO(sop) handle an octopus merge.
-        return null;
-    }
-  }
-
-  private static ObjectId emptyTree(ObjectInserter ins) throws IOException {
-    ObjectId id = ins.insert(Constants.OBJ_TREE, new byte[] {});
-    ins.flush();
-    return id;
-  }
-
-  @AutoValue
-  abstract static class EditsDueToRebaseResult {
-    public static EditsDueToRebaseResult create(
-        List<DiffEntry> relevantDiffEntries,
-        Multimap<String, ContextAwareEdit> editsDueToRebasePerFilePath) {
-      return new AutoValue_PatchListLoader_EditsDueToRebaseResult(
-          relevantDiffEntries, editsDueToRebasePerFilePath);
-    }
-
-    public abstract List<DiffEntry> getRelevantOriginalDiffEntries();
-
-    /** Returns the edits per file path they modify in {@code treeB}. */
-    public abstract Multimap<String, ContextAwareEdit> getEditsDueToRebasePerFilePath();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptBuilder.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptBuilder.java
deleted file mode 100644
index 6f3e055..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptBuilder.java
+++ /dev/null
@@ -1,568 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.patch;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.common.data.CommentDetail;
-import com.google.gerrit.common.data.PatchScript;
-import com.google.gerrit.common.data.PatchScript.DisplayMethod;
-import com.google.gerrit.extensions.client.DiffPreferencesInfo;
-import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
-import com.google.gerrit.prettify.common.EditList;
-import com.google.gerrit.prettify.common.SparseFileContent;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.Patch;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.mime.FileTypeRegistry;
-import com.google.inject.Inject;
-import eu.medsea.mimeutil.MimeType;
-import eu.medsea.mimeutil.MimeUtil2;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import org.eclipse.jgit.diff.Edit;
-import org.eclipse.jgit.errors.CorruptObjectException;
-import org.eclipse.jgit.errors.IncorrectObjectTypeException;
-import org.eclipse.jgit.errors.MissingObjectException;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.FileMode;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevTree;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.treewalk.TreeWalk;
-
-class PatchScriptBuilder {
-  static final int MAX_CONTEXT = 5000000;
-  static final int BIG_FILE = 9000;
-
-  private static final Comparator<Edit> EDIT_SORT =
-      new Comparator<Edit>() {
-        @Override
-        public int compare(Edit o1, Edit o2) {
-          return o1.getBeginA() - o2.getBeginA();
-        }
-      };
-
-  private Repository db;
-  private Project.NameKey projectKey;
-  private ObjectReader reader;
-  private Change change;
-  private DiffPreferencesInfo diffPrefs;
-  private ComparisonType comparisonType;
-  private ObjectId aId;
-  private ObjectId bId;
-
-  private final Side a;
-  private final Side b;
-
-  private List<Edit> edits;
-  private final FileTypeRegistry registry;
-  private final PatchListCache patchListCache;
-  private int context;
-
-  @Inject
-  PatchScriptBuilder(FileTypeRegistry ftr, PatchListCache plc) {
-    a = new Side();
-    b = new Side();
-    registry = ftr;
-    patchListCache = plc;
-  }
-
-  void setRepository(Repository r, Project.NameKey projectKey) {
-    this.db = r;
-    this.projectKey = projectKey;
-  }
-
-  void setChange(Change c) {
-    this.change = c;
-  }
-
-  void setDiffPrefs(DiffPreferencesInfo dp) {
-    diffPrefs = dp;
-
-    context = diffPrefs.context;
-    if (context == DiffPreferencesInfo.WHOLE_FILE_CONTEXT) {
-      context = MAX_CONTEXT;
-    } else if (context > MAX_CONTEXT) {
-      context = MAX_CONTEXT;
-    }
-  }
-
-  void setTrees(ComparisonType ct, ObjectId a, ObjectId b) {
-    comparisonType = ct;
-    aId = a;
-    bId = b;
-  }
-
-  PatchScript toPatchScript(PatchListEntry content, CommentDetail comments, List<Patch> history)
-      throws IOException {
-    reader = db.newObjectReader();
-    try {
-      return build(content, comments, history);
-    } finally {
-      reader.close();
-    }
-  }
-
-  private PatchScript build(PatchListEntry content, CommentDetail comments, List<Patch> history)
-      throws IOException {
-    boolean intralineDifferenceIsPossible = true;
-    boolean intralineFailure = false;
-    boolean intralineTimeout = false;
-
-    a.path = oldName(content);
-    b.path = newName(content);
-
-    a.resolve(null, aId);
-    b.resolve(a, bId);
-
-    edits = new ArrayList<>(content.getEdits());
-    ImmutableSet<Edit> editsDueToRebase = content.getEditsDueToRebase();
-
-    if (!isModify(content)) {
-      intralineDifferenceIsPossible = false;
-    } else if (diffPrefs.intralineDifference) {
-      IntraLineDiff d =
-          patchListCache.getIntraLineDiff(
-              IntraLineDiffKey.create(a.id, b.id, diffPrefs.ignoreWhitespace),
-              IntraLineDiffArgs.create(
-                  a.src, b.src, edits, editsDueToRebase, projectKey, bId, b.path));
-      if (d != null) {
-        switch (d.getStatus()) {
-          case EDIT_LIST:
-            edits = new ArrayList<>(d.getEdits());
-            break;
-
-          case DISABLED:
-            intralineDifferenceIsPossible = false;
-            break;
-
-          case ERROR:
-            intralineDifferenceIsPossible = false;
-            intralineFailure = true;
-            break;
-
-          case TIMEOUT:
-            intralineDifferenceIsPossible = false;
-            intralineTimeout = true;
-            break;
-        }
-      } else {
-        intralineDifferenceIsPossible = false;
-        intralineFailure = true;
-      }
-    }
-
-    if (comments != null) {
-      ensureCommentsVisible(comments);
-    }
-
-    boolean hugeFile = false;
-    if (a.src == b.src && a.size() <= context && content.getEdits().isEmpty()) {
-      // Odd special case; the files are identical (100% rename or copy)
-      // and the user has asked for context that is larger than the file.
-      // Send them the entire file, with an empty edit after the last line.
-      //
-      for (int i = 0; i < a.size(); i++) {
-        a.addLine(i);
-      }
-      edits = new ArrayList<>(1);
-      edits.add(new Edit(a.size(), a.size()));
-
-    } else {
-      if (BIG_FILE < Math.max(a.size(), b.size())) {
-        // IF the file is really large, we disable things to avoid choking
-        // the browser client.
-        //
-        hugeFile = true;
-      }
-
-      // In order to expand the skipped common lines or syntax highlight the
-      // file properly we need to give the client the complete file contents.
-      // So force our context temporarily to the complete file size.
-      //
-      context = MAX_CONTEXT;
-
-      packContent(diffPrefs.ignoreWhitespace != Whitespace.IGNORE_NONE);
-    }
-
-    return new PatchScript(
-        change.getKey(),
-        content.getChangeType(),
-        content.getOldName(),
-        content.getNewName(),
-        a.fileMode,
-        b.fileMode,
-        content.getHeaderLines(),
-        diffPrefs,
-        a.dst,
-        b.dst,
-        edits,
-        editsDueToRebase,
-        a.displayMethod,
-        b.displayMethod,
-        a.mimeType.toString(),
-        b.mimeType.toString(),
-        comments,
-        history,
-        hugeFile,
-        intralineDifferenceIsPossible,
-        intralineFailure,
-        intralineTimeout,
-        content.getPatchType() == Patch.PatchType.BINARY,
-        aId == null ? null : aId.getName(),
-        bId == null ? null : bId.getName());
-  }
-
-  private static boolean isModify(PatchListEntry content) {
-    switch (content.getChangeType()) {
-      case MODIFIED:
-      case COPIED:
-      case RENAMED:
-      case REWRITE:
-        return true;
-
-      case ADDED:
-      case DELETED:
-      default:
-        return false;
-    }
-  }
-
-  private static String oldName(PatchListEntry entry) {
-    switch (entry.getChangeType()) {
-      case ADDED:
-        return null;
-      case DELETED:
-      case MODIFIED:
-      case REWRITE:
-        return entry.getNewName();
-      case COPIED:
-      case RENAMED:
-      default:
-        return entry.getOldName();
-    }
-  }
-
-  private static String newName(PatchListEntry entry) {
-    switch (entry.getChangeType()) {
-      case DELETED:
-        return null;
-      case ADDED:
-      case MODIFIED:
-      case COPIED:
-      case RENAMED:
-      case REWRITE:
-      default:
-        return entry.getNewName();
-    }
-  }
-
-  private void ensureCommentsVisible(CommentDetail comments) {
-    if (comments.getCommentsA().isEmpty() && comments.getCommentsB().isEmpty()) {
-      // No comments, no additional dummy edits are required.
-      //
-      return;
-    }
-
-    // Construct empty Edit blocks around each location where a comment is.
-    // This will force the later packContent method to include the regions
-    // containing comments, potentially combining those regions together if
-    // they have overlapping contexts. UI renders will also be able to make
-    // correct hunks from this, but because the Edit is empty they will not
-    // style it specially.
-    //
-    final List<Edit> empty = new ArrayList<>();
-    int lastLine;
-
-    lastLine = -1;
-    for (Comment c : comments.getCommentsA()) {
-      final int a = c.lineNbr;
-      if (lastLine != a) {
-        final int b = mapA2B(a - 1);
-        if (0 <= b) {
-          safeAdd(empty, new Edit(a - 1, b));
-        }
-        lastLine = a;
-      }
-    }
-
-    lastLine = -1;
-    for (Comment c : comments.getCommentsB()) {
-      int b = c.lineNbr;
-      if (lastLine != b) {
-        final int a = mapB2A(b - 1);
-        if (0 <= a) {
-          safeAdd(empty, new Edit(a, b - 1));
-        }
-        lastLine = b;
-      }
-    }
-
-    // Sort the final list by the index in A, so packContent can combine
-    // them correctly later.
-    //
-    edits.addAll(empty);
-    Collections.sort(edits, EDIT_SORT);
-  }
-
-  private void safeAdd(List<Edit> empty, Edit toAdd) {
-    final int a = toAdd.getBeginA();
-    final int b = toAdd.getBeginB();
-    for (Edit e : edits) {
-      if (e.getBeginA() <= a && a <= e.getEndA()) {
-        return;
-      }
-      if (e.getBeginB() <= b && b <= e.getEndB()) {
-        return;
-      }
-    }
-    empty.add(toAdd);
-  }
-
-  private int mapA2B(int a) {
-    if (edits.isEmpty()) {
-      // Magic special case of an unmodified file.
-      //
-      return a;
-    }
-
-    for (int i = 0; i < edits.size(); i++) {
-      final Edit e = edits.get(i);
-      if (a < e.getBeginA()) {
-        if (i == 0) {
-          // Special case of context at start of file.
-          //
-          return a;
-        }
-        return e.getBeginB() - (e.getBeginA() - a);
-      }
-      if (e.getBeginA() <= a && a <= e.getEndA()) {
-        return -1;
-      }
-    }
-
-    final Edit last = edits.get(edits.size() - 1);
-    return last.getEndB() + (a - last.getEndA());
-  }
-
-  private int mapB2A(int b) {
-    if (edits.isEmpty()) {
-      // Magic special case of an unmodified file.
-      //
-      return b;
-    }
-
-    for (int i = 0; i < edits.size(); i++) {
-      final Edit e = edits.get(i);
-      if (b < e.getBeginB()) {
-        if (i == 0) {
-          // Special case of context at start of file.
-          //
-          return b;
-        }
-        return e.getBeginA() - (e.getBeginB() - b);
-      }
-      if (e.getBeginB() <= b && b <= e.getEndB()) {
-        return -1;
-      }
-    }
-
-    final Edit last = edits.get(edits.size() - 1);
-    return last.getEndA() + (b - last.getEndB());
-  }
-
-  private void packContent(boolean ignoredWhitespace) {
-    EditList list = new EditList(edits, context, a.size(), b.size());
-    for (EditList.Hunk hunk : list.getHunks()) {
-      while (hunk.next()) {
-        if (hunk.isContextLine()) {
-          final String lineA = a.src.getString(hunk.getCurA());
-          a.dst.addLine(hunk.getCurA(), lineA);
-
-          if (ignoredWhitespace) {
-            // If we ignored whitespace in some form, also get the line
-            // from b when it does not exactly match the line from a.
-            //
-            final String lineB = b.src.getString(hunk.getCurB());
-            if (!lineA.equals(lineB)) {
-              b.dst.addLine(hunk.getCurB(), lineB);
-            }
-          }
-          hunk.incBoth();
-          continue;
-        }
-
-        if (hunk.isDeletedA()) {
-          a.addLine(hunk.getCurA());
-          hunk.incA();
-        }
-
-        if (hunk.isInsertedB()) {
-          b.addLine(hunk.getCurB());
-          hunk.incB();
-        }
-      }
-    }
-  }
-
-  private class Side {
-    String path;
-    ObjectId id;
-    FileMode mode;
-    byte[] srcContent;
-    Text src;
-    MimeType mimeType = MimeUtil2.UNKNOWN_MIME_TYPE;
-    DisplayMethod displayMethod = DisplayMethod.DIFF;
-    PatchScript.FileMode fileMode = PatchScript.FileMode.FILE;
-    final SparseFileContent dst = new SparseFileContent();
-
-    int size() {
-      return src != null ? src.size() : 0;
-    }
-
-    void addLine(int line) {
-      dst.addLine(line, src.getString(line));
-    }
-
-    void resolve(Side other, ObjectId within) throws IOException {
-      try {
-        final boolean reuse;
-        if (Patch.COMMIT_MSG.equals(path)) {
-          if (comparisonType.isAgainstParentOrAutoMerge()
-              && (aId == within || within.equals(aId))) {
-            id = ObjectId.zeroId();
-            src = Text.EMPTY;
-            srcContent = Text.NO_BYTES;
-            mode = FileMode.MISSING;
-            displayMethod = DisplayMethod.NONE;
-          } else {
-            id = within;
-            src = Text.forCommit(reader, within);
-            srcContent = src.getContent();
-            if (src == Text.EMPTY) {
-              mode = FileMode.MISSING;
-              displayMethod = DisplayMethod.NONE;
-            } else {
-              mode = FileMode.REGULAR_FILE;
-            }
-          }
-          reuse = false;
-        } else if (Patch.MERGE_LIST.equals(path)) {
-          if (comparisonType.isAgainstParentOrAutoMerge()
-              && (aId == within || within.equals(aId))) {
-            id = ObjectId.zeroId();
-            src = Text.EMPTY;
-            srcContent = Text.NO_BYTES;
-            mode = FileMode.MISSING;
-            displayMethod = DisplayMethod.NONE;
-          } else {
-            id = within;
-            src = Text.forMergeList(comparisonType, reader, within);
-            srcContent = src.getContent();
-            if (src == Text.EMPTY) {
-              mode = FileMode.MISSING;
-              displayMethod = DisplayMethod.NONE;
-            } else {
-              mode = FileMode.REGULAR_FILE;
-            }
-          }
-          reuse = false;
-        } else {
-          final TreeWalk tw = find(within);
-
-          id = tw != null ? tw.getObjectId(0) : ObjectId.zeroId();
-          mode = tw != null ? tw.getFileMode(0) : FileMode.MISSING;
-          reuse =
-              other != null
-                  && other.id.equals(id)
-                  && (other.mode == mode || isBothFile(other.mode, mode));
-
-          if (reuse) {
-            srcContent = other.srcContent;
-
-          } else if (mode.getObjectType() == Constants.OBJ_BLOB) {
-            srcContent = Text.asByteArray(db.open(id, Constants.OBJ_BLOB));
-
-          } else if (mode.getObjectType() == Constants.OBJ_COMMIT) {
-            String strContent = "Subproject commit " + ObjectId.toString(id);
-            srcContent = strContent.getBytes(UTF_8);
-
-          } else {
-            srcContent = Text.NO_BYTES;
-          }
-
-          if (reuse) {
-            mimeType = other.mimeType;
-            displayMethod = other.displayMethod;
-            src = other.src;
-
-          } else if (srcContent.length > 0 && FileMode.SYMLINK != mode) {
-            mimeType = registry.getMimeType(path, srcContent);
-            if ("image".equals(mimeType.getMediaType()) && registry.isSafeInline(mimeType)) {
-              displayMethod = DisplayMethod.IMG;
-            }
-          }
-        }
-
-        if (mode == FileMode.MISSING) {
-          displayMethod = DisplayMethod.NONE;
-        }
-
-        if (!reuse) {
-          if (srcContent == Text.NO_BYTES) {
-            src = Text.EMPTY;
-          } else {
-            src = new Text(srcContent);
-          }
-        }
-
-        dst.setSize(size());
-
-        if (mode == FileMode.SYMLINK) {
-          fileMode = PatchScript.FileMode.SYMLINK;
-        } else if (mode == FileMode.GITLINK) {
-          fileMode = PatchScript.FileMode.GITLINK;
-        }
-      } catch (IOException err) {
-        throw new IOException("Cannot read " + within.name() + ":" + path, err);
-      }
-    }
-
-    private TreeWalk find(ObjectId within)
-        throws MissingObjectException, IncorrectObjectTypeException, CorruptObjectException,
-            IOException {
-      if (path == null || within == null) {
-        return null;
-      }
-      try (RevWalk rw = new RevWalk(reader)) {
-        final RevTree tree = rw.parseTree(within);
-        return TreeWalk.forPath(reader, path, tree);
-      }
-    }
-  }
-
-  private static boolean isBothFile(FileMode a, FileMode b) {
-    return (a.getBits() & FileMode.TYPE_FILE) == FileMode.TYPE_FILE
-        && (b.getBits() & FileMode.TYPE_FILE) == FileMode.TYPE_FILE;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptFactory.java
deleted file mode 100644
index fe158f8..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptFactory.java
+++ /dev/null
@@ -1,412 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.patch;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.data.CommentDetail;
-import com.google.gerrit.common.data.PatchScript;
-import com.google.gerrit.extensions.client.DiffPreferencesInfo;
-import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.Patch;
-import com.google.gerrit.reviewdb.client.Patch.ChangeType;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CommentsUtil;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.edit.ChangeEdit;
-import com.google.gerrit.server.edit.ChangeEditUtil;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.LargeObjectException;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.InvalidChangeOperationException;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import com.google.inject.assistedinject.AssistedInject;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.concurrent.Callable;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class PatchScriptFactory implements Callable<PatchScript> {
-  public interface Factory {
-    PatchScriptFactory create(
-        ChangeNotes notes,
-        String fileName,
-        @Assisted("patchSetA") PatchSet.Id patchSetA,
-        @Assisted("patchSetB") PatchSet.Id patchSetB,
-        DiffPreferencesInfo diffPrefs);
-
-    PatchScriptFactory create(
-        ChangeNotes notes,
-        String fileName,
-        int parentNum,
-        PatchSet.Id patchSetB,
-        DiffPreferencesInfo diffPrefs);
-  }
-
-  private static final Logger log = LoggerFactory.getLogger(PatchScriptFactory.class);
-
-  private final GitRepositoryManager repoManager;
-  private final PatchSetUtil psUtil;
-  private final Provider<PatchScriptBuilder> builderFactory;
-  private final PatchListCache patchListCache;
-  private final ReviewDb db;
-  private final CommentsUtil commentsUtil;
-
-  private final String fileName;
-  @Nullable private final PatchSet.Id psa;
-  private final int parentNum;
-  private final PatchSet.Id psb;
-  private final DiffPreferencesInfo diffPrefs;
-  private final ChangeEditUtil editReader;
-  private final Provider<CurrentUser> userProvider;
-  private final PermissionBackend permissionBackend;
-  private Optional<ChangeEdit> edit;
-
-  private final Change.Id changeId;
-  private boolean loadHistory = true;
-  private boolean loadComments = true;
-
-  private ChangeNotes notes;
-  private ObjectId aId;
-  private ObjectId bId;
-  private List<Patch> history;
-  private CommentDetail comments;
-
-  @AssistedInject
-  PatchScriptFactory(
-      GitRepositoryManager grm,
-      PatchSetUtil psUtil,
-      Provider<PatchScriptBuilder> builderFactory,
-      PatchListCache patchListCache,
-      ReviewDb db,
-      CommentsUtil commentsUtil,
-      ChangeEditUtil editReader,
-      Provider<CurrentUser> userProvider,
-      PermissionBackend permissionBackend,
-      @Assisted ChangeNotes notes,
-      @Assisted String fileName,
-      @Assisted("patchSetA") @Nullable PatchSet.Id patchSetA,
-      @Assisted("patchSetB") PatchSet.Id patchSetB,
-      @Assisted DiffPreferencesInfo diffPrefs) {
-    this.repoManager = grm;
-    this.psUtil = psUtil;
-    this.builderFactory = builderFactory;
-    this.patchListCache = patchListCache;
-    this.db = db;
-    this.notes = notes;
-    this.commentsUtil = commentsUtil;
-    this.editReader = editReader;
-    this.userProvider = userProvider;
-    this.permissionBackend = permissionBackend;
-
-    this.fileName = fileName;
-    this.psa = patchSetA;
-    this.parentNum = -1;
-    this.psb = patchSetB;
-    this.diffPrefs = diffPrefs;
-
-    changeId = patchSetB.getParentKey();
-  }
-
-  @AssistedInject
-  PatchScriptFactory(
-      GitRepositoryManager grm,
-      PatchSetUtil psUtil,
-      Provider<PatchScriptBuilder> builderFactory,
-      PatchListCache patchListCache,
-      ReviewDb db,
-      CommentsUtil commentsUtil,
-      ChangeEditUtil editReader,
-      Provider<CurrentUser> userProvider,
-      PermissionBackend permissionBackend,
-      @Assisted ChangeNotes notes,
-      @Assisted String fileName,
-      @Assisted int parentNum,
-      @Assisted PatchSet.Id patchSetB,
-      @Assisted DiffPreferencesInfo diffPrefs) {
-    this.repoManager = grm;
-    this.psUtil = psUtil;
-    this.builderFactory = builderFactory;
-    this.patchListCache = patchListCache;
-    this.db = db;
-    this.notes = notes;
-    this.commentsUtil = commentsUtil;
-    this.editReader = editReader;
-    this.userProvider = userProvider;
-    this.permissionBackend = permissionBackend;
-
-    this.fileName = fileName;
-    this.psa = null;
-    this.parentNum = parentNum;
-    this.psb = patchSetB;
-    this.diffPrefs = diffPrefs;
-
-    changeId = patchSetB.getParentKey();
-    checkArgument(parentNum >= 0, "parentNum must be >= 0");
-  }
-
-  public void setLoadHistory(boolean load) {
-    loadHistory = load;
-  }
-
-  public void setLoadComments(boolean load) {
-    loadComments = load;
-  }
-
-  @Override
-  public PatchScript call()
-      throws OrmException, LargeObjectException, AuthException, InvalidChangeOperationException,
-          IOException, PermissionBackendException {
-    if (parentNum < 0) {
-      validatePatchSetId(psa);
-    }
-    validatePatchSetId(psb);
-
-    PatchSet psEntityA = psa != null ? psUtil.get(db, notes, psa) : null;
-    PatchSet psEntityB = psb.get() == 0 ? new PatchSet(psb) : psUtil.get(db, notes, psb);
-    if (psEntityA != null || psEntityB != null) {
-      try {
-        permissionBackend
-            .user(userProvider)
-            .change(notes)
-            .database(db)
-            .check(ChangePermission.READ);
-      } catch (AuthException e) {
-        throw new NoSuchChangeException(changeId);
-      }
-    }
-
-    try (Repository git = repoManager.openRepository(notes.getProjectName())) {
-      bId = toObjectId(psEntityB);
-      if (parentNum < 0) {
-        aId = psEntityA != null ? toObjectId(psEntityA) : null;
-      }
-
-      try {
-        final PatchList list = listFor(keyFor(diffPrefs.ignoreWhitespace));
-        final PatchScriptBuilder b = newBuilder(list, git);
-        final PatchListEntry content = list.get(fileName);
-
-        loadCommentsAndHistory(content.getChangeType(), content.getOldName(), content.getNewName());
-
-        return b.toPatchScript(content, comments, history);
-      } catch (PatchListNotAvailableException e) {
-        throw new NoSuchChangeException(changeId, e);
-      } catch (IOException e) {
-        log.error("File content unavailable", e);
-        throw new NoSuchChangeException(changeId, e);
-      } catch (org.eclipse.jgit.errors.LargeObjectException err) {
-        throw new LargeObjectException("File content is too large", err);
-      }
-    } catch (RepositoryNotFoundException e) {
-      log.error("Repository " + notes.getProjectName() + " not found", e);
-      throw new NoSuchChangeException(changeId, e);
-    } catch (IOException e) {
-      log.error("Cannot open repository " + notes.getProjectName(), e);
-      throw new NoSuchChangeException(changeId, e);
-    }
-  }
-
-  private PatchListKey keyFor(Whitespace whitespace) {
-    if (parentNum < 0) {
-      return PatchListKey.againstCommit(aId, bId, whitespace);
-    }
-    return PatchListKey.againstParentNum(parentNum + 1, bId, whitespace);
-  }
-
-  private PatchList listFor(PatchListKey key) throws PatchListNotAvailableException {
-    return patchListCache.get(key, notes.getProjectName());
-  }
-
-  private PatchScriptBuilder newBuilder(PatchList list, Repository git) {
-    final PatchScriptBuilder b = builderFactory.get();
-    b.setRepository(git, notes.getProjectName());
-    b.setChange(notes.getChange());
-    b.setDiffPrefs(diffPrefs);
-    b.setTrees(list.getComparisonType(), list.getOldId(), list.getNewId());
-    return b;
-  }
-
-  private ObjectId toObjectId(PatchSet ps) throws AuthException, IOException, OrmException {
-    if (ps.getId().get() == 0) {
-      return getEditRev();
-    }
-    if (ps.getRevision() == null || ps.getRevision().get() == null) {
-      throw new NoSuchChangeException(changeId);
-    }
-
-    try {
-      return ObjectId.fromString(ps.getRevision().get());
-    } catch (IllegalArgumentException e) {
-      log.error("Patch set " + ps.getId() + " has invalid revision");
-      throw new NoSuchChangeException(changeId, e);
-    }
-  }
-
-  private ObjectId getEditRev() throws AuthException, IOException, OrmException {
-    edit = editReader.byChange(notes);
-    if (edit.isPresent()) {
-      return edit.get().getEditCommit();
-    }
-    throw new NoSuchChangeException(notes.getChangeId());
-  }
-
-  private void validatePatchSetId(PatchSet.Id psId) throws NoSuchChangeException {
-    if (psId == null) { // OK, means use base;
-    } else if (changeId.equals(psId.getParentKey())) { // OK, same change;
-    } else {
-      throw new NoSuchChangeException(changeId);
-    }
-  }
-
-  private void loadCommentsAndHistory(ChangeType changeType, String oldName, String newName)
-      throws OrmException {
-    Map<Patch.Key, Patch> byKey = new HashMap<>();
-
-    if (loadHistory) {
-      // This seems like a cheap trick. It doesn't properly account for a
-      // file that gets renamed between patch set 1 and patch set 2. We
-      // will wind up packing the wrong Patch object because we didn't do
-      // proper rename detection between the patch sets.
-      //
-      history = new ArrayList<>();
-      for (PatchSet ps : psUtil.byChange(db, notes)) {
-        String name = fileName;
-        if (psa != null) {
-          switch (changeType) {
-            case COPIED:
-            case RENAMED:
-              if (ps.getId().equals(psa)) {
-                name = oldName;
-              }
-              break;
-
-            case MODIFIED:
-            case DELETED:
-            case ADDED:
-            case REWRITE:
-              break;
-          }
-        }
-
-        Patch p = new Patch(new Patch.Key(ps.getId(), name));
-        history.add(p);
-        byKey.put(p.getKey(), p);
-      }
-      if (edit != null && edit.isPresent()) {
-        Patch p = new Patch(new Patch.Key(new PatchSet.Id(psb.getParentKey(), 0), fileName));
-        history.add(p);
-        byKey.put(p.getKey(), p);
-      }
-    }
-
-    if (loadComments && edit == null) {
-      comments = new CommentDetail(psa, psb);
-      switch (changeType) {
-        case ADDED:
-        case MODIFIED:
-          loadPublished(byKey, newName);
-          break;
-
-        case DELETED:
-          loadPublished(byKey, newName);
-          break;
-
-        case COPIED:
-        case RENAMED:
-          if (psa != null) {
-            loadPublished(byKey, oldName);
-          }
-          loadPublished(byKey, newName);
-          break;
-
-        case REWRITE:
-          break;
-      }
-
-      CurrentUser user = userProvider.get();
-      if (user.isIdentifiedUser()) {
-        Account.Id me = user.getAccountId();
-        switch (changeType) {
-          case ADDED:
-          case MODIFIED:
-            loadDrafts(byKey, me, newName);
-            break;
-
-          case DELETED:
-            loadDrafts(byKey, me, newName);
-            break;
-
-          case COPIED:
-          case RENAMED:
-            if (psa != null) {
-              loadDrafts(byKey, me, oldName);
-            }
-            loadDrafts(byKey, me, newName);
-            break;
-
-          case REWRITE:
-            break;
-        }
-      }
-    }
-  }
-
-  private void loadPublished(Map<Patch.Key, Patch> byKey, String file) throws OrmException {
-    for (Comment c : commentsUtil.publishedByChangeFile(db, notes, changeId, file)) {
-      comments.include(notes.getChangeId(), c);
-      PatchSet.Id psId = new PatchSet.Id(notes.getChangeId(), c.key.patchSetId);
-      Patch.Key pKey = new Patch.Key(psId, c.key.filename);
-      Patch p = byKey.get(pKey);
-      if (p != null) {
-        p.setCommentCount(p.getCommentCount() + 1);
-      }
-    }
-  }
-
-  private void loadDrafts(Map<Patch.Key, Patch> byKey, Account.Id me, String file)
-      throws OrmException {
-    for (Comment c : commentsUtil.draftByChangeFileAuthor(db, notes, file, me)) {
-      comments.include(notes.getChangeId(), c);
-      PatchSet.Id psId = new PatchSet.Id(notes.getChangeId(), c.key.patchSetId);
-      Patch.Key pKey = new Patch.Key(psId, c.key.filename);
-      Patch p = byKey.get(pKey);
-      if (p != null) {
-        p.setDraftCount(p.getDraftCount() + 1);
-      }
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/Text.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/Text.java
deleted file mode 100644
index 90141715..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/Text.java
+++ /dev/null
@@ -1,190 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.patch;
-
-import static java.nio.charset.StandardCharsets.ISO_8859_1;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import java.io.IOException;
-import java.nio.charset.Charset;
-import java.nio.charset.IllegalCharsetNameException;
-import java.nio.charset.UnsupportedCharsetException;
-import java.text.SimpleDateFormat;
-import org.eclipse.jgit.diff.RawText;
-import org.eclipse.jgit.errors.LargeObjectException;
-import org.eclipse.jgit.errors.MissingObjectException;
-import org.eclipse.jgit.lib.AnyObjectId;
-import org.eclipse.jgit.lib.ObjectLoader;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.storage.pack.PackConfig;
-import org.eclipse.jgit.util.RawParseUtils;
-import org.mozilla.universalchardet.UniversalDetector;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class Text extends RawText {
-  private static final Logger log = LoggerFactory.getLogger(Text.class);
-  private static final int bigFileThreshold = PackConfig.DEFAULT_BIG_FILE_THRESHOLD;
-
-  public static final byte[] NO_BYTES = {};
-  public static final Text EMPTY = new Text(NO_BYTES);
-
-  public static Text forCommit(ObjectReader reader, AnyObjectId commitId) throws IOException {
-    try (RevWalk rw = new RevWalk(reader)) {
-      RevCommit c;
-      if (commitId instanceof RevCommit) {
-        c = (RevCommit) commitId;
-      } else {
-        c = rw.parseCommit(commitId);
-      }
-
-      StringBuilder b = new StringBuilder();
-      switch (c.getParentCount()) {
-        case 0:
-          break;
-        case 1:
-          {
-            RevCommit p = c.getParent(0);
-            rw.parseBody(p);
-            b.append("Parent:     ");
-            b.append(reader.abbreviate(p, 8).name());
-            b.append(" (");
-            b.append(p.getShortMessage());
-            b.append(")\n");
-            break;
-          }
-        default:
-          for (int i = 0; i < c.getParentCount(); i++) {
-            RevCommit p = c.getParent(i);
-            rw.parseBody(p);
-            b.append(i == 0 ? "Merge Of:   " : "            ");
-            b.append(reader.abbreviate(p, 8).name());
-            b.append(" (");
-            b.append(p.getShortMessage());
-            b.append(")\n");
-          }
-      }
-      appendPersonIdent(b, "Author", c.getAuthorIdent());
-      appendPersonIdent(b, "Commit", c.getCommitterIdent());
-      b.append("\n");
-      b.append(c.getFullMessage());
-      return new Text(b.toString().getBytes(UTF_8));
-    }
-  }
-
-  public static Text forMergeList(
-      ComparisonType comparisonType, ObjectReader reader, AnyObjectId commitId) throws IOException {
-    try (RevWalk rw = new RevWalk(reader)) {
-      RevCommit c = rw.parseCommit(commitId);
-      StringBuilder b = new StringBuilder();
-      switch (c.getParentCount()) {
-        case 0:
-          break;
-        case 1:
-          {
-            break;
-          }
-        default:
-          int uniterestingParent =
-              comparisonType.isAgainstParent() ? comparisonType.getParentNum() : 1;
-
-          b.append("Merge List:\n\n");
-          for (RevCommit commit : MergeListBuilder.build(rw, c, uniterestingParent)) {
-            b.append("* ");
-            b.append(reader.abbreviate(commit, 8).name());
-            b.append(" ");
-            b.append(commit.getShortMessage());
-            b.append("\n");
-          }
-      }
-      return new Text(b.toString().getBytes(UTF_8));
-    }
-  }
-
-  private static void appendPersonIdent(StringBuilder b, String field, PersonIdent person) {
-    if (person != null) {
-      b.append(field).append(":    ");
-      if (person.getName() != null) {
-        b.append(" ");
-        b.append(person.getName());
-      }
-      if (person.getEmailAddress() != null) {
-        b.append(" <");
-        b.append(person.getEmailAddress());
-        b.append(">");
-      }
-      b.append("\n");
-
-      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ZZZ");
-      sdf.setTimeZone(person.getTimeZone());
-      b.append(field).append("Date: ");
-      b.append(sdf.format(person.getWhen()));
-      b.append("\n");
-    }
-  }
-
-  public static byte[] asByteArray(ObjectLoader ldr)
-      throws MissingObjectException, LargeObjectException, IOException {
-    return ldr.getCachedBytes(bigFileThreshold);
-  }
-
-  private static Charset charset(byte[] content, String encoding) {
-    if (encoding == null) {
-      UniversalDetector d = new UniversalDetector(null);
-      d.handleData(content, 0, content.length);
-      d.dataEnd();
-      encoding = d.getDetectedCharset();
-    }
-    if (encoding == null) {
-      return ISO_8859_1;
-    }
-    try {
-      return Charset.forName(encoding);
-
-    } catch (IllegalCharsetNameException err) {
-      log.error("Invalid detected charset name '" + encoding + "': " + err);
-      return ISO_8859_1;
-
-    } catch (UnsupportedCharsetException err) {
-      log.error("Detected charset '" + encoding + "' not supported: " + err);
-      return ISO_8859_1;
-    }
-  }
-
-  private Charset charset;
-
-  public Text(byte[] r) {
-    super(r);
-  }
-
-  public Text(ObjectLoader ldr) throws MissingObjectException, LargeObjectException, IOException {
-    this(asByteArray(ldr));
-  }
-
-  public byte[] getContent() {
-    return content;
-  }
-
-  @Override
-  protected String decode(int s, int e) {
-    if (charset == null) {
-      charset = charset(content, null);
-    }
-    return RawParseUtils.decode(charset, content, s, e);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/permissions/ChangePermission.java b/gerrit-server/src/main/java/com/google/gerrit/server/permissions/ChangePermission.java
deleted file mode 100644
index 4b06861..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/permissions/ChangePermission.java
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.permissions;
-
-import com.google.gerrit.common.data.Permission;
-import java.util.Locale;
-import java.util.Optional;
-
-public enum ChangePermission implements ChangePermissionOrLabel {
-  READ(Permission.READ),
-  RESTORE,
-  DELETE,
-  ABANDON(Permission.ABANDON),
-  EDIT_ASSIGNEE(Permission.EDIT_ASSIGNEE),
-  EDIT_DESCRIPTION,
-  EDIT_HASHTAGS(Permission.EDIT_HASHTAGS),
-  EDIT_TOPIC_NAME(Permission.EDIT_TOPIC_NAME),
-  REMOVE_REVIEWER(Permission.REMOVE_REVIEWER),
-  ADD_PATCH_SET(Permission.ADD_PATCH_SET),
-  REBASE(Permission.REBASE),
-  SUBMIT(Permission.SUBMIT),
-  SUBMIT_AS(Permission.SUBMIT_AS);
-
-  private final String name;
-
-  ChangePermission() {
-    name = null;
-  }
-
-  ChangePermission(String name) {
-    this.name = name;
-  }
-
-  /** @return name used in {@code project.config} permissions. */
-  @Override
-  public Optional<String> permissionName() {
-    return Optional.ofNullable(name);
-  }
-
-  @Override
-  public String describeForException() {
-    return toString().toLowerCase(Locale.US).replace('_', ' ');
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/permissions/ChangePermissionOrLabel.java b/gerrit-server/src/main/java/com/google/gerrit/server/permissions/ChangePermissionOrLabel.java
deleted file mode 100644
index 06c0d73..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/permissions/ChangePermissionOrLabel.java
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.permissions;
-
-import java.util.Optional;
-
-/** A {@link ChangePermission} or a {@link LabelPermission}. */
-public interface ChangePermissionOrLabel {
-  /** @return name used in {@code project.config} permissions. */
-  public Optional<String> permissionName();
-
-  /** @return readable identifier of this permission for exception message. */
-  public String describeForException();
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/permissions/FailedPermissionBackend.java b/gerrit-server/src/main/java/com/google/gerrit/server/permissions/FailedPermissionBackend.java
deleted file mode 100644
index 4c6e6753..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/permissions/FailedPermissionBackend.java
+++ /dev/null
@@ -1,178 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.permissions;
-
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.permissions.PermissionBackend.ForChange;
-import com.google.gerrit.server.permissions.PermissionBackend.ForProject;
-import com.google.gerrit.server.permissions.PermissionBackend.ForRef;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.inject.Provider;
-import java.util.Collection;
-import java.util.Set;
-
-/**
- * Helpers for {@link PermissionBackend} that must fail.
- *
- * <p>These helpers are useful to curry failure state identified inside a non-throwing factory
- * method to the throwing {@code check} or {@code test} methods.
- */
-public class FailedPermissionBackend {
-  public static ForProject project(String message) {
-    return project(message, null);
-  }
-
-  public static ForProject project(String message, Throwable cause) {
-    return new FailedProject(message, cause);
-  }
-
-  public static ForRef ref(String message) {
-    return ref(message, null);
-  }
-
-  public static ForRef ref(String message, Throwable cause) {
-    return new FailedRef(message, cause);
-  }
-
-  public static ForChange change(String message) {
-    return change(message, null);
-  }
-
-  public static ForChange change(String message, Throwable cause) {
-    return new FailedChange(message, cause);
-  }
-
-  private FailedPermissionBackend() {}
-
-  private static class FailedProject extends ForProject {
-    private final String message;
-    private final Throwable cause;
-
-    FailedProject(String message, Throwable cause) {
-      this.message = message;
-      this.cause = cause;
-    }
-
-    @Override
-    public ForProject database(Provider<ReviewDb> db) {
-      return this;
-    }
-
-    @Override
-    public ForProject user(CurrentUser user) {
-      return this;
-    }
-
-    @Override
-    public ForRef ref(String ref) {
-      return new FailedRef(message, cause);
-    }
-
-    @Override
-    public void check(ProjectPermission perm) throws PermissionBackendException {
-      throw new PermissionBackendException(message, cause);
-    }
-
-    @Override
-    public Set<ProjectPermission> test(Collection<ProjectPermission> permSet)
-        throws PermissionBackendException {
-      throw new PermissionBackendException(message, cause);
-    }
-  }
-
-  private static class FailedRef extends ForRef {
-    private final String message;
-    private final Throwable cause;
-
-    FailedRef(String message, Throwable cause) {
-      this.message = message;
-      this.cause = cause;
-    }
-
-    @Override
-    public ForRef database(Provider<ReviewDb> db) {
-      return this;
-    }
-
-    @Override
-    public ForRef user(CurrentUser user) {
-      return this;
-    }
-
-    @Override
-    public ForChange change(ChangeData cd) {
-      return new FailedChange(message, cause);
-    }
-
-    @Override
-    public ForChange change(ChangeNotes notes) {
-      return new FailedChange(message, cause);
-    }
-
-    @Override
-    public ForChange indexedChange(ChangeData cd, ChangeNotes notes) {
-      return new FailedChange(message, cause);
-    }
-
-    @Override
-    public void check(RefPermission perm) throws PermissionBackendException {
-      throw new PermissionBackendException(message, cause);
-    }
-
-    @Override
-    public Set<RefPermission> test(Collection<RefPermission> permSet)
-        throws PermissionBackendException {
-      throw new PermissionBackendException(message, cause);
-    }
-  }
-
-  private static class FailedChange extends ForChange {
-    private final String message;
-    private final Throwable cause;
-
-    FailedChange(String message, Throwable cause) {
-      this.message = message;
-      this.cause = cause;
-    }
-
-    @Override
-    public ForChange database(Provider<ReviewDb> db) {
-      return this;
-    }
-
-    @Override
-    public ForChange user(CurrentUser user) {
-      return this;
-    }
-
-    @Override
-    public void check(ChangePermissionOrLabel perm) throws PermissionBackendException {
-      throw new PermissionBackendException(message, cause);
-    }
-
-    @Override
-    public <T extends ChangePermissionOrLabel> Set<T> test(Collection<T> permSet)
-        throws PermissionBackendException {
-      throw new PermissionBackendException(message, cause);
-    }
-
-    @Override
-    public CurrentUser user() {
-      throw new UnsupportedOperationException("FailedPermissionBackend is not scoped to user");
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/permissions/GlobalPermission.java b/gerrit-server/src/main/java/com/google/gerrit/server/permissions/GlobalPermission.java
deleted file mode 100644
index 13d6e48..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/permissions/GlobalPermission.java
+++ /dev/null
@@ -1,181 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.permissions;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.extensions.annotations.CapabilityScope;
-import com.google.gerrit.extensions.annotations.RequiresAnyCapability;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
-import com.google.gerrit.extensions.api.access.GlobalOrPluginPermission;
-import com.google.gerrit.extensions.api.access.PluginPermission;
-import java.lang.annotation.Annotation;
-import java.util.Collections;
-import java.util.LinkedHashSet;
-import java.util.Locale;
-import java.util.Set;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Global server permissions built into Gerrit. */
-public enum GlobalPermission implements GlobalOrPluginPermission {
-  ACCESS_DATABASE(GlobalCapability.ACCESS_DATABASE),
-  ADMINISTRATE_SERVER(GlobalCapability.ADMINISTRATE_SERVER),
-  CREATE_ACCOUNT(GlobalCapability.CREATE_ACCOUNT),
-  CREATE_GROUP(GlobalCapability.CREATE_GROUP),
-  CREATE_PROJECT(GlobalCapability.CREATE_PROJECT),
-  EMAIL_REVIEWERS(GlobalCapability.EMAIL_REVIEWERS),
-  FLUSH_CACHES(GlobalCapability.FLUSH_CACHES),
-  KILL_TASK(GlobalCapability.KILL_TASK),
-  MAINTAIN_SERVER(GlobalCapability.MAINTAIN_SERVER),
-  MODIFY_ACCOUNT(GlobalCapability.MODIFY_ACCOUNT),
-  RUN_AS(GlobalCapability.RUN_AS),
-  RUN_GC(GlobalCapability.RUN_GC),
-  STREAM_EVENTS(GlobalCapability.STREAM_EVENTS),
-  VIEW_ALL_ACCOUNTS(GlobalCapability.VIEW_ALL_ACCOUNTS),
-  VIEW_CACHES(GlobalCapability.VIEW_CACHES),
-  VIEW_CONNECTIONS(GlobalCapability.VIEW_CONNECTIONS),
-  VIEW_PLUGINS(GlobalCapability.VIEW_PLUGINS),
-  VIEW_QUEUE(GlobalCapability.VIEW_QUEUE);
-
-  private static final Logger log = LoggerFactory.getLogger(GlobalPermission.class);
-  private static final ImmutableMap<String, GlobalPermission> BY_NAME;
-
-  static {
-    ImmutableMap.Builder<String, GlobalPermission> m = ImmutableMap.builder();
-    for (GlobalPermission p : values()) {
-      m.put(p.permissionName(), p);
-    }
-    BY_NAME = m.build();
-  }
-
-  @Nullable
-  public static GlobalPermission byName(String name) {
-    return BY_NAME.get(name);
-  }
-
-  /**
-   * Extracts the {@code @RequiresCapability} or {@code @RequiresAnyCapability} annotation.
-   *
-   * @param pluginName name of the declaring plugin. May be {@code null} or {@code "gerrit"} for
-   *     classes originating from the core server.
-   * @param clazz target class to extract annotation from.
-   * @return empty set if no annotations were found, or a collection of permissions, any of which
-   *     are suitable to enable access.
-   * @throws PermissionBackendException the annotation could not be parsed.
-   */
-  public static Set<GlobalOrPluginPermission> fromAnnotation(
-      @Nullable String pluginName, Class<?> clazz) throws PermissionBackendException {
-    RequiresCapability rc = findAnnotation(clazz, RequiresCapability.class);
-    RequiresAnyCapability rac = findAnnotation(clazz, RequiresAnyCapability.class);
-    if (rc != null && rac != null) {
-      log.error(
-          "Class {} uses both @{} and @{}",
-          clazz.getName(),
-          RequiresCapability.class.getSimpleName(),
-          RequiresAnyCapability.class.getSimpleName());
-      throw new PermissionBackendException("cannot extract permission");
-    } else if (rc != null) {
-      return Collections.singleton(
-          resolve(
-              pluginName,
-              rc.value(),
-              rc.scope(),
-              rc.fallBackToAdmin(),
-              clazz,
-              RequiresCapability.class));
-    } else if (rac != null) {
-      Set<GlobalOrPluginPermission> r = new LinkedHashSet<>();
-      for (String capability : rac.value()) {
-        r.add(
-            resolve(
-                pluginName,
-                capability,
-                rac.scope(),
-                rac.fallBackToAdmin(),
-                clazz,
-                RequiresAnyCapability.class));
-      }
-      return Collections.unmodifiableSet(r);
-    } else {
-      return Collections.emptySet();
-    }
-  }
-
-  public static Set<GlobalOrPluginPermission> fromAnnotation(Class<?> clazz)
-      throws PermissionBackendException {
-    return fromAnnotation(null, clazz);
-  }
-
-  private final String name;
-
-  GlobalPermission(String name) {
-    this.name = name;
-  }
-
-  /** @return name used in {@code project.config} permissions. */
-  @Override
-  public String permissionName() {
-    return name;
-  }
-
-  @Override
-  public String describeForException() {
-    return toString().toLowerCase(Locale.US).replace('_', ' ');
-  }
-
-  private static GlobalOrPluginPermission resolve(
-      @Nullable String pluginName,
-      String capability,
-      CapabilityScope scope,
-      boolean fallBackToAdmin,
-      Class<?> clazz,
-      Class<?> annotationClass)
-      throws PermissionBackendException {
-    if (pluginName != null
-        && !"gerrit".equals(pluginName)
-        && (scope == CapabilityScope.PLUGIN || scope == CapabilityScope.CONTEXT)) {
-      return new PluginPermission(pluginName, capability, fallBackToAdmin);
-    }
-
-    if (scope == CapabilityScope.PLUGIN) {
-      log.error(
-          "Class {} uses @{}(scope={}), but is not within a plugin",
-          clazz.getName(),
-          annotationClass.getSimpleName(),
-          scope.name());
-      throw new PermissionBackendException("cannot extract permission");
-    }
-
-    GlobalPermission perm = byName(capability);
-    if (perm == null) {
-      log.error("Class {} requires unknown capability {}", clazz.getName(), capability);
-      throw new PermissionBackendException("cannot extract permission");
-    }
-    return perm;
-  }
-
-  @Nullable
-  private static <T extends Annotation> T findAnnotation(Class<?> clazz, Class<T> annotation) {
-    for (; clazz != null; clazz = clazz.getSuperclass()) {
-      T t = clazz.getAnnotation(annotation);
-      if (t != null) {
-        return t;
-      }
-    }
-    return null;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/permissions/LabelPermission.java b/gerrit-server/src/main/java/com/google/gerrit/server/permissions/LabelPermission.java
deleted file mode 100644
index 747c997..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/permissions/LabelPermission.java
+++ /dev/null
@@ -1,273 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.permissions;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.gerrit.server.permissions.LabelPermission.ForUser.ON_BEHALF_OF;
-import static com.google.gerrit.server.permissions.LabelPermission.ForUser.SELF;
-
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.LabelValue;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.server.util.LabelVote;
-import java.util.Optional;
-
-/** Permission representing a label. */
-public class LabelPermission implements ChangePermissionOrLabel {
-  public enum ForUser {
-    SELF,
-    ON_BEHALF_OF;
-  }
-
-  private final ForUser forUser;
-  private final String name;
-
-  /**
-   * Construct a reference to a label permission.
-   *
-   * @param type type description of the label.
-   */
-  public LabelPermission(LabelType type) {
-    this(SELF, type);
-  }
-
-  /**
-   * Construct a reference to a label permission.
-   *
-   * @param forUser {@code SELF} (default) or {@code ON_BEHALF_OF} for labelAs behavior.
-   * @param type type description of the label.
-   */
-  public LabelPermission(ForUser forUser, LabelType type) {
-    this(forUser, type.getName());
-  }
-
-  /**
-   * Construct a reference to a label permission.
-   *
-   * @param name name of the label, e.g. {@code "Code-Review"} or {@code "Verified"}.
-   */
-  public LabelPermission(String name) {
-    this(SELF, name);
-  }
-
-  /**
-   * Construct a reference to a label permission.
-   *
-   * @param forUser {@code SELF} (default) or {@code ON_BEHALF_OF} for labelAs behavior.
-   * @param name name of the label, e.g. {@code "Code-Review"} or {@code "Verified"}.
-   */
-  public LabelPermission(ForUser forUser, String name) {
-    this.forUser = checkNotNull(forUser, "ForUser");
-    this.name = LabelType.checkName(name);
-  }
-
-  /** @return {@code SELF} or {@code ON_BEHALF_OF} (or labelAs). */
-  public ForUser forUser() {
-    return forUser;
-  }
-
-  /** @return name of the label, e.g. {@code "Code-Review"}. */
-  public String label() {
-    return name;
-  }
-
-  /** @return name used in {@code project.config} permissions. */
-  @Override
-  public Optional<String> permissionName() {
-    switch (forUser) {
-      case SELF:
-        return Optional.of(Permission.forLabel(name));
-      case ON_BEHALF_OF:
-        return Optional.of(Permission.forLabelAs(name));
-    }
-    return Optional.empty();
-  }
-
-  @Override
-  public String describeForException() {
-    if (forUser == ON_BEHALF_OF) {
-      return "labelAs " + name;
-    }
-    return "label " + name;
-  }
-
-  @Override
-  public int hashCode() {
-    return name.hashCode();
-  }
-
-  @Override
-  public boolean equals(Object other) {
-    if (other instanceof LabelPermission) {
-      LabelPermission b = (LabelPermission) other;
-      return forUser == b.forUser && name.equals(b.name);
-    }
-    return false;
-  }
-
-  @Override
-  public String toString() {
-    if (forUser == ON_BEHALF_OF) {
-      return "LabelAs[" + name + ']';
-    }
-    return "Label[" + name + ']';
-  }
-
-  /** A {@link LabelPermission} at a specific value. */
-  public static class WithValue implements ChangePermissionOrLabel {
-    private final ForUser forUser;
-    private final LabelVote label;
-
-    /**
-     * Construct a reference to a label at a specific value.
-     *
-     * @param type description of the label.
-     * @param value numeric score assigned to the label.
-     */
-    public WithValue(LabelType type, LabelValue value) {
-      this(SELF, type, value);
-    }
-
-    /**
-     * Construct a reference to a label at a specific value.
-     *
-     * @param type description of the label.
-     * @param value numeric score assigned to the label.
-     */
-    public WithValue(LabelType type, short value) {
-      this(SELF, type.getName(), value);
-    }
-
-    /**
-     * Construct a reference to a label at a specific value.
-     *
-     * @param forUser {@code SELF} (default) or {@code ON_BEHALF_OF} for labelAs behavior.
-     * @param type description of the label.
-     * @param value numeric score assigned to the label.
-     */
-    public WithValue(ForUser forUser, LabelType type, LabelValue value) {
-      this(forUser, type.getName(), value.getValue());
-    }
-
-    /**
-     * Construct a reference to a label at a specific value.
-     *
-     * @param forUser {@code SELF} (default) or {@code ON_BEHALF_OF} for labelAs behavior.
-     * @param type description of the label.
-     * @param value numeric score assigned to the label.
-     */
-    public WithValue(ForUser forUser, LabelType type, short value) {
-      this(forUser, type.getName(), value);
-    }
-
-    /**
-     * Construct a reference to a label at a specific value.
-     *
-     * @param name name of the label, e.g. {@code "Code-Review"} or {@code "Verified"}.
-     * @param value numeric score assigned to the label.
-     */
-    public WithValue(String name, short value) {
-      this(SELF, name, value);
-    }
-
-    /**
-     * Construct a reference to a label at a specific value.
-     *
-     * @param forUser {@code SELF} (default) or {@code ON_BEHALF_OF} for labelAs behavior.
-     * @param name name of the label, e.g. {@code "Code-Review"} or {@code "Verified"}.
-     * @param value numeric score assigned to the label.
-     */
-    public WithValue(ForUser forUser, String name, short value) {
-      this(forUser, LabelVote.create(name, value));
-    }
-
-    /**
-     * Construct a reference to a label at a specific value.
-     *
-     * @param label label name and vote.
-     */
-    public WithValue(LabelVote label) {
-      this(SELF, label);
-    }
-
-    /**
-     * Construct a reference to a label at a specific value.
-     *
-     * @param forUser {@code SELF} (default) or {@code ON_BEHALF_OF} for labelAs behavior.
-     * @param label label name and vote.
-     */
-    public WithValue(ForUser forUser, LabelVote label) {
-      this.forUser = checkNotNull(forUser, "ForUser");
-      this.label = checkNotNull(label, "LabelVote");
-    }
-
-    /** @return {@code SELF} or {@code ON_BEHALF_OF} (or labelAs). */
-    public ForUser forUser() {
-      return forUser;
-    }
-
-    /** @return name of the label, e.g. {@code "Code-Review"}. */
-    public String label() {
-      return label.label();
-    }
-
-    /** @return specific value of the label, e.g. 1 or 2. */
-    public short value() {
-      return label.value();
-    }
-
-    /** @return name used in {@code project.config} permissions. */
-    @Override
-    public Optional<String> permissionName() {
-      switch (forUser) {
-        case SELF:
-          return Optional.of(Permission.forLabel(label()));
-        case ON_BEHALF_OF:
-          return Optional.of(Permission.forLabelAs(label()));
-      }
-      return Optional.empty();
-    }
-
-    @Override
-    public String describeForException() {
-      if (forUser == ON_BEHALF_OF) {
-        return "labelAs " + label.formatWithEquals();
-      }
-      return "label " + label.formatWithEquals();
-    }
-
-    @Override
-    public int hashCode() {
-      return label.hashCode();
-    }
-
-    @Override
-    public boolean equals(Object other) {
-      if (other instanceof WithValue) {
-        WithValue b = (WithValue) other;
-        return forUser == b.forUser && label.equals(b.label);
-      }
-      return false;
-    }
-
-    @Override
-    public String toString() {
-      if (forUser == ON_BEHALF_OF) {
-        return "LabelAs[" + label.format() + ']';
-      }
-      return "Label[" + label.format() + ']';
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/permissions/PermissionBackend.java b/gerrit-server/src/main/java/com/google/gerrit/server/permissions/PermissionBackend.java
deleted file mode 100644
index 0561e404..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/permissions/PermissionBackend.java
+++ /dev/null
@@ -1,439 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.permissions;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static java.util.stream.Collectors.toSet;
-
-import com.google.common.collect.Sets;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.extensions.api.access.GlobalOrPluginPermission;
-import com.google.gerrit.extensions.conditions.BooleanCondition;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.project.DefaultPermissionBackend;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.ImplementedBy;
-import com.google.inject.Provider;
-import com.google.inject.util.Providers;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.Iterator;
-import java.util.Set;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Checks authorization to perform an action on a project, reference, or change.
- *
- * <p>{@code check} methods should be used during action handlers to verify the user is allowed to
- * exercise the specified permission. For convenience in implementation {@code check} methods throw
- * {@link AuthException} if the permission is denied.
- *
- * <p>{@code test} methods should be used when constructing replies to the client and the result
- * object needs to include a true/false hint indicating the user's ability to exercise the
- * permission. This is suitable for configuring UI button state, but should not be relied upon to
- * guard handlers before making state changes.
- *
- * <p>{@code PermissionBackend} is a singleton for the server, acting as a factory for lightweight
- * request instances. Implementation classes may cache supporting data inside of {@link WithUser},
- * {@link ForProject}, {@link ForRef}, and {@link ForChange} instances, in addition to storing
- * within {@link CurrentUser} using a {@link com.google.gerrit.server.CurrentUser.PropertyKey}.
- * {@link GlobalPermission} caching for {@link WithUser} may best cached inside {@link CurrentUser}
- * as {@link WithUser} instances are frequently created.
- *
- * <p>Example use:
- *
- * <pre>
- *   private final PermissionBackend permissions;
- *   private final Provider<CurrentUser> user;
- *
- *   @Inject
- *   Foo(PermissionBackend permissions, Provider<CurrentUser> user) {
- *     this.permissions = permissions;
- *     this.user = user;
- *   }
- *
- *   public void apply(...) {
- *     permissions.user(user).change(cd).check(ChangePermission.SUBMIT);
- *   }
- *
- *   public UiAction.Description getDescription(ChangeResource rsrc) {
- *     return new UiAction.Description()
- *       .setLabel("Submit")
- *       .setVisible(rsrc.permissions().testCond(ChangePermission.SUBMIT));
- * }
- * </pre>
- */
-@ImplementedBy(DefaultPermissionBackend.class)
-public abstract class PermissionBackend {
-  private static final Logger logger = LoggerFactory.getLogger(PermissionBackend.class);
-
-  /** @return lightweight factory scoped to answer for the specified user. */
-  public abstract WithUser user(CurrentUser user);
-
-  /** @return lightweight factory scoped to answer for the specified user. */
-  public <U extends CurrentUser> WithUser user(Provider<U> user) {
-    return user(checkNotNull(user, "Provider<CurrentUser>").get());
-  }
-
-  /**
-   * Bulk evaluate a collection of {@link PermissionBackendCondition} for view handling.
-   *
-   * <p>Overridden implementations should call {@link PermissionBackendCondition#set(boolean)} to
-   * cache the result of {@code testOrFalse} in the condition for later evaluation. Caching the
-   * result will bypass the usual invocation of {@code testOrFalse}.
-   *
-   * <p>{@code conds} may contain duplicate entries (such as same user, resource, permission
-   * triplet). When duplicates exist, implementations should set a result into all instances to
-   * ensure {@code testOrFalse} does not get invoked during evaluation of the containing condition.
-   *
-   * @param conds conditions to consider.
-   */
-  public void bulkEvaluateTest(Collection<PermissionBackendCondition> conds) {
-    // Do nothing by default. The default implementation of PermissionBackendCondition
-    // delegates to the appropriate testOrFalse method in PermissionBackend.
-  }
-
-  /** PermissionBackend with an optional per-request ReviewDb handle. */
-  public abstract static class AcceptsReviewDb<T> {
-    protected Provider<ReviewDb> db;
-
-    public T database(Provider<ReviewDb> db) {
-      if (db != null) {
-        this.db = db;
-      }
-      return self();
-    }
-
-    public T database(ReviewDb db) {
-      return database(Providers.of(checkNotNull(db, "ReviewDb")));
-    }
-
-    @SuppressWarnings("unchecked")
-    private T self() {
-      return (T) this;
-    }
-  }
-
-  /** PermissionBackend scoped to a specific user. */
-  public abstract static class WithUser extends AcceptsReviewDb<WithUser> {
-    /** @return instance scoped for the specified project. */
-    public abstract ForProject project(Project.NameKey project);
-
-    /** @return instance scoped for the {@code ref}, and its parent project. */
-    public ForRef ref(Branch.NameKey ref) {
-      return project(ref.getParentKey()).ref(ref.get()).database(db);
-    }
-
-    /** @return instance scoped for the change, and its destination ref and project. */
-    public ForChange change(ChangeData cd) {
-      try {
-        return ref(cd.change().getDest()).change(cd);
-      } catch (OrmException e) {
-        return FailedPermissionBackend.change("unavailable", e);
-      }
-    }
-
-    /** @return instance scoped for the change, and its destination ref and project. */
-    public ForChange change(ChangeNotes notes) {
-      return ref(notes.getChange().getDest()).change(notes);
-    }
-
-    /**
-     * @return instance scoped for the change loaded from index, and its destination ref and
-     *     project. This method should only be used when database access is harmful and potentially
-     *     stale data from the index is acceptable.
-     */
-    public ForChange indexedChange(ChangeData cd, ChangeNotes notes) {
-      return ref(notes.getChange().getDest()).indexedChange(cd, notes);
-    }
-
-    /** Verify scoped user can {@code perm}, throwing if denied. */
-    public abstract void check(GlobalOrPluginPermission perm)
-        throws AuthException, PermissionBackendException;
-
-    /**
-     * Verify scoped user can perform at least one listed permission.
-     *
-     * <p>If {@code any} is empty, the method completes normally and allows the caller to continue.
-     * Since no permissions were supplied to check, its assumed no permissions are necessary to
-     * continue with the caller's operation.
-     *
-     * <p>If the user has at least one of the permissions in {@code any}, the method completes
-     * normally, possibly without checking all listed permissions.
-     *
-     * <p>If {@code any} is non-empty and the user has none, {@link AuthException} is thrown for one
-     * of the failed permissions.
-     *
-     * @param any set of permissions to check.
-     */
-    public void checkAny(Set<GlobalOrPluginPermission> any)
-        throws PermissionBackendException, AuthException {
-      for (Iterator<GlobalOrPluginPermission> itr = any.iterator(); itr.hasNext(); ) {
-        try {
-          check(itr.next());
-          return;
-        } catch (AuthException err) {
-          if (!itr.hasNext()) {
-            throw err;
-          }
-        }
-      }
-    }
-
-    /** Filter {@code permSet} to permissions scoped user might be able to perform. */
-    public abstract <T extends GlobalOrPluginPermission> Set<T> test(Collection<T> permSet)
-        throws PermissionBackendException;
-
-    public boolean test(GlobalOrPluginPermission perm) throws PermissionBackendException {
-      return test(Collections.singleton(perm)).contains(perm);
-    }
-
-    public boolean testOrFalse(GlobalOrPluginPermission perm) {
-      try {
-        return test(perm);
-      } catch (PermissionBackendException e) {
-        logger.warn("Cannot test " + perm + "; assuming false", e);
-        return false;
-      }
-    }
-
-    public BooleanCondition testCond(GlobalOrPluginPermission perm) {
-      return new PermissionBackendCondition.WithUser(this, perm);
-    }
-
-    /**
-     * Filter a set of projects using {@code check(perm)}.
-     *
-     * @param perm required permission in a project to be included in result.
-     * @param projects candidate set of projects; may be empty.
-     * @return filtered set of {@code projects} where {@code check(perm)} was successful.
-     * @throws PermissionBackendException backend cannot access its internal state.
-     */
-    public Set<Project.NameKey> filter(ProjectPermission perm, Collection<Project.NameKey> projects)
-        throws PermissionBackendException {
-      checkNotNull(perm, "ProjectPermission");
-      checkNotNull(projects, "projects");
-      Set<Project.NameKey> allowed = Sets.newHashSetWithExpectedSize(projects.size());
-      for (Project.NameKey project : projects) {
-        try {
-          project(project).check(perm);
-          allowed.add(project);
-        } catch (AuthException e) {
-          // Do not include this project in allowed.
-        } catch (PermissionBackendException e) {
-          if (e.getCause() instanceof RepositoryNotFoundException) {
-            logger.warn("Could not find repository of the project {} : ", project.get(), e);
-            // Do not include this project because doesn't exist
-          } else {
-            throw e;
-          }
-        }
-      }
-      return allowed;
-    }
-  }
-
-  /** PermissionBackend scoped to a user and project. */
-  public abstract static class ForProject extends AcceptsReviewDb<ForProject> {
-    /** @return new instance rescoped to same project, but different {@code user}. */
-    public abstract ForProject user(CurrentUser user);
-
-    /** @return instance scoped for {@code ref} in this project. */
-    public abstract ForRef ref(String ref);
-
-    /** @return instance scoped for the change, and its destination ref and project. */
-    public ForChange change(ChangeData cd) {
-      try {
-        return ref(cd.change().getDest().get()).change(cd);
-      } catch (OrmException e) {
-        return FailedPermissionBackend.change("unavailable", e);
-      }
-    }
-
-    /** @return instance scoped for the change, and its destination ref and project. */
-    public ForChange change(ChangeNotes notes) {
-      return ref(notes.getChange().getDest().get()).change(notes);
-    }
-
-    /**
-     * @return instance scoped for the change loaded from index, and its destination ref and
-     *     project. This method should only be used when database access is harmful and potentially
-     *     stale data from the index is acceptable.
-     */
-    public ForChange indexedChange(ChangeData cd, ChangeNotes notes) {
-      return ref(notes.getChange().getDest().get()).indexedChange(cd, notes);
-    }
-
-    /** Verify scoped user can {@code perm}, throwing if denied. */
-    public abstract void check(ProjectPermission perm)
-        throws AuthException, PermissionBackendException;
-
-    /** Filter {@code permSet} to permissions scoped user might be able to perform. */
-    public abstract Set<ProjectPermission> test(Collection<ProjectPermission> permSet)
-        throws PermissionBackendException;
-
-    public boolean test(ProjectPermission perm) throws PermissionBackendException {
-      return test(EnumSet.of(perm)).contains(perm);
-    }
-
-    public boolean testOrFalse(ProjectPermission perm) {
-      try {
-        return test(perm);
-      } catch (PermissionBackendException e) {
-        logger.warn("Cannot test " + perm + "; assuming false", e);
-        return false;
-      }
-    }
-
-    public BooleanCondition testCond(ProjectPermission perm) {
-      return new PermissionBackendCondition.ForProject(this, perm);
-    }
-  }
-
-  /** PermissionBackend scoped to a user, project and reference. */
-  public abstract static class ForRef extends AcceptsReviewDb<ForRef> {
-    /** @return new instance rescoped to same reference, but different {@code user}. */
-    public abstract ForRef user(CurrentUser user);
-
-    /** @return instance scoped to change. */
-    public abstract ForChange change(ChangeData cd);
-
-    /** @return instance scoped to change. */
-    public abstract ForChange change(ChangeNotes notes);
-
-    /**
-     * @return instance scoped to change loaded from index. This method should only be used when
-     *     database access is harmful and potentially stale data from the index is acceptable.
-     */
-    public abstract ForChange indexedChange(ChangeData cd, ChangeNotes notes);
-
-    /** Verify scoped user can {@code perm}, throwing if denied. */
-    public abstract void check(RefPermission perm) throws AuthException, PermissionBackendException;
-
-    /** Filter {@code permSet} to permissions scoped user might be able to perform. */
-    public abstract Set<RefPermission> test(Collection<RefPermission> permSet)
-        throws PermissionBackendException;
-
-    public boolean test(RefPermission perm) throws PermissionBackendException {
-      return test(EnumSet.of(perm)).contains(perm);
-    }
-
-    /**
-     * Test if user may be able to perform the permission.
-     *
-     * <p>Similar to {@link #test(RefPermission)} except this method returns {@code false} instead
-     * of throwing an exception.
-     *
-     * @param perm the permission to test.
-     * @return true if the user might be able to perform the permission; false if the user may be
-     *     missing the necessary grants or state, or if the backend threw an exception.
-     */
-    public boolean testOrFalse(RefPermission perm) {
-      try {
-        return test(perm);
-      } catch (PermissionBackendException e) {
-        logger.warn("Cannot test " + perm + "; assuming false", e);
-        return false;
-      }
-    }
-
-    public BooleanCondition testCond(RefPermission perm) {
-      return new PermissionBackendCondition.ForRef(this, perm);
-    }
-  }
-
-  /** PermissionBackend scoped to a user, project, reference and change. */
-  public abstract static class ForChange extends AcceptsReviewDb<ForChange> {
-    /** @return user this instance is scoped to. */
-    public abstract CurrentUser user();
-
-    /** @return new instance rescoped to same change, but different {@code user}. */
-    public abstract ForChange user(CurrentUser user);
-
-    /** Verify scoped user can {@code perm}, throwing if denied. */
-    public abstract void check(ChangePermissionOrLabel perm)
-        throws AuthException, PermissionBackendException;
-
-    /** Filter {@code permSet} to permissions scoped user might be able to perform. */
-    public abstract <T extends ChangePermissionOrLabel> Set<T> test(Collection<T> permSet)
-        throws PermissionBackendException;
-
-    public boolean test(ChangePermissionOrLabel perm) throws PermissionBackendException {
-      return test(Collections.singleton(perm)).contains(perm);
-    }
-
-    /**
-     * Test if user may be able to perform the permission.
-     *
-     * <p>Similar to {@link #test(ChangePermissionOrLabel)} except this method returns {@code false}
-     * instead of throwing an exception.
-     *
-     * @param perm the permission to test.
-     * @return true if the user might be able to perform the permission; false if the user may be
-     *     missing the necessary grants or state, or if the backend threw an exception.
-     */
-    public boolean testOrFalse(ChangePermissionOrLabel perm) {
-      try {
-        return test(perm);
-      } catch (PermissionBackendException e) {
-        logger.warn("Cannot test " + perm + "; assuming false", e);
-        return false;
-      }
-    }
-
-    public BooleanCondition testCond(ChangePermissionOrLabel perm) {
-      return new PermissionBackendCondition.ForChange(this, perm);
-    }
-
-    /**
-     * Test which values of a label the user may be able to set.
-     *
-     * @param label definition of the label to test values of.
-     * @return set containing values the user may be able to use; may be empty if none.
-     * @throws PermissionBackendException if failure consulting backend configuration.
-     */
-    public Set<LabelPermission.WithValue> test(LabelType label) throws PermissionBackendException {
-      return test(valuesOf(checkNotNull(label, "LabelType")));
-    }
-
-    /**
-     * Test which values of a group of labels the user may be able to set.
-     *
-     * @param types definition of the labels to test values of.
-     * @return set containing values the user may be able to use; may be empty if none.
-     * @throws PermissionBackendException if failure consulting backend configuration.
-     */
-    public Set<LabelPermission.WithValue> testLabels(Collection<LabelType> types)
-        throws PermissionBackendException {
-      checkNotNull(types, "LabelType");
-      return test(types.stream().flatMap((t) -> valuesOf(t).stream()).collect(toSet()));
-    }
-
-    private static Set<LabelPermission.WithValue> valuesOf(LabelType label) {
-      return label.getValues().stream()
-          .map((v) -> new LabelPermission.WithValue(label, v))
-          .collect(toSet());
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/permissions/PermissionBackendCondition.java b/gerrit-server/src/main/java/com/google/gerrit/server/permissions/PermissionBackendCondition.java
deleted file mode 100644
index 8d66e50..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/permissions/PermissionBackendCondition.java
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.permissions;
-
-import com.google.gerrit.extensions.api.access.GlobalOrPluginPermission;
-import com.google.gerrit.extensions.conditions.BooleanCondition;
-import com.google.gerrit.extensions.conditions.PrivateInternals_BooleanCondition;
-
-/** {@link BooleanCondition} to evaluate a permission. */
-public abstract class PermissionBackendCondition
-    extends PrivateInternals_BooleanCondition.SubclassOnlyInCoreServer {
-  Boolean value;
-
-  /**
-   * Assign a specific {@code testOrFalse} result to this condition.
-   *
-   * <p>By setting the condition to a specific value the condition will bypass calling {@link
-   * PermissionBackend} during {@code value()}, and immediately return the set value instead.
-   *
-   * @param val value to return from {@code value()}.
-   */
-  public void set(boolean val) {
-    value = val;
-  }
-
-  @Override
-  public abstract String toString();
-
-  public static class WithUser extends PermissionBackendCondition {
-    private final PermissionBackend.WithUser impl;
-    private final GlobalOrPluginPermission perm;
-
-    WithUser(PermissionBackend.WithUser impl, GlobalOrPluginPermission perm) {
-      this.impl = impl;
-      this.perm = perm;
-    }
-
-    public PermissionBackend.WithUser withUser() {
-      return impl;
-    }
-
-    public GlobalOrPluginPermission permission() {
-      return perm;
-    }
-
-    @Override
-    public boolean value() {
-      return value != null ? value : impl.testOrFalse(perm);
-    }
-
-    @Override
-    public String toString() {
-      return "PermissionBackendCondition.WithUser(" + perm + ")";
-    }
-  }
-
-  public static class ForProject extends PermissionBackendCondition {
-    private final PermissionBackend.ForProject impl;
-    private final ProjectPermission perm;
-
-    ForProject(PermissionBackend.ForProject impl, ProjectPermission perm) {
-      this.impl = impl;
-      this.perm = perm;
-    }
-
-    public PermissionBackend.ForProject project() {
-      return impl;
-    }
-
-    public ProjectPermission permission() {
-      return perm;
-    }
-
-    @Override
-    public boolean value() {
-      return value != null ? value : impl.testOrFalse(perm);
-    }
-
-    @Override
-    public String toString() {
-      return "PermissionBackendCondition.ForProject(" + perm + ")";
-    }
-  }
-
-  public static class ForRef extends PermissionBackendCondition {
-    private final PermissionBackend.ForRef impl;
-    private final RefPermission perm;
-
-    ForRef(PermissionBackend.ForRef impl, RefPermission perm) {
-      this.impl = impl;
-      this.perm = perm;
-    }
-
-    public PermissionBackend.ForRef ref() {
-      return impl;
-    }
-
-    public RefPermission permission() {
-      return perm;
-    }
-
-    @Override
-    public boolean value() {
-      return value != null ? value : impl.testOrFalse(perm);
-    }
-
-    @Override
-    public String toString() {
-      return "PermissionBackendCondition.ForRef(" + perm + ")";
-    }
-  }
-
-  public static class ForChange extends PermissionBackendCondition {
-    private final PermissionBackend.ForChange impl;
-    private final ChangePermissionOrLabel perm;
-
-    ForChange(PermissionBackend.ForChange impl, ChangePermissionOrLabel perm) {
-      this.impl = impl;
-      this.perm = perm;
-    }
-
-    public PermissionBackend.ForChange change() {
-      return impl;
-    }
-
-    public ChangePermissionOrLabel permission() {
-      return perm;
-    }
-
-    @Override
-    public boolean value() {
-      return value != null ? value : impl.testOrFalse(perm);
-    }
-
-    @Override
-    public String toString() {
-      return "PermissionBackendCondition.ForChange(" + perm + ")";
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/permissions/ProjectPermission.java b/gerrit-server/src/main/java/com/google/gerrit/server/permissions/ProjectPermission.java
deleted file mode 100644
index 5e8bbc4..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/permissions/ProjectPermission.java
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.permissions;
-
-import com.google.gerrit.common.data.Permission;
-import java.util.Locale;
-import java.util.Optional;
-
-public enum ProjectPermission {
-  /**
-   * Can access at least one reference or change within the repository.
-   *
-   * <p>Checking this permission instead of {@link #READ} may require filtering to hide specific
-   * references or changes, which can be expensive.
-   */
-  ACCESS,
-
-  /**
-   * Can read all references in the repository.
-   *
-   * <p>This is a stronger form of {@link #ACCESS} where no filtering is required.
-   */
-  READ(Permission.READ),
-
-  /**
-   * Can read all non-config references in the repository.
-   *
-   * <p>This is the same as {@code READ} but does not check if they user can see refs/meta/config.
-   * Therefore, callers should check {@code READ} before excluding config refs in a short-circuit.
-   */
-  READ_NO_CONFIG,
-
-  /**
-   * Can create at least one reference in the project.
-   *
-   * <p>This project level permission only validates the user may create some type of reference
-   * within the project. The exact reference name must be checked at creation:
-   *
-   * <pre>permissionBackend
-   *    .user(user)
-   *    .project(proj)
-   *    .ref(ref)
-   *    .check(RefPermission.CREATE);
-   * </pre>
-   */
-  CREATE_REF,
-
-  /**
-   * Can create at least one tag reference in the project.
-   *
-   * <p>This project level permission only validates the user may create some tag reference within
-   * the project. The exact reference name must be checked at creation:
-   *
-   * <pre>permissionBackend
-   *    .user(user)
-   *    .project(proj)
-   *    .ref(ref)
-   *    .check(RefPermission.CREATE);
-   * </pre>
-   */
-  CREATE_TAG_REF,
-
-  /**
-   * Can create at least one change in the project.
-   *
-   * <p>This project level permission only validates the user may create a change for some branch
-   * within the project. The exact reference name must be checked at creation:
-   *
-   * <pre>permissionBackend
-   *    .user(user)
-   *    .project(proj)
-   *    .ref(ref)
-   *    .check(RefPermission.CREATE_CHANGE);
-   * </pre>
-   */
-  CREATE_CHANGE,
-
-  /** Can run receive pack. */
-  RUN_RECEIVE_PACK,
-
-  /** Can run upload pack. */
-  RUN_UPLOAD_PACK;
-
-  private final String name;
-
-  ProjectPermission() {
-    name = null;
-  }
-
-  ProjectPermission(String name) {
-    this.name = name;
-  }
-
-  /** @return name used in {@code project.config} permissions. */
-  public Optional<String> permissionName() {
-    return Optional.ofNullable(name);
-  }
-
-  public String describeForException() {
-    return toString().toLowerCase(Locale.US).replace('_', ' ');
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/permissions/RefPermission.java b/gerrit-server/src/main/java/com/google/gerrit/server/permissions/RefPermission.java
deleted file mode 100644
index 8b5d8fb..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/permissions/RefPermission.java
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.permissions;
-
-import com.google.gerrit.common.data.Permission;
-import java.util.Locale;
-import java.util.Optional;
-
-public enum RefPermission {
-  READ(Permission.READ),
-  CREATE(Permission.CREATE),
-  DELETE(Permission.DELETE),
-  UPDATE(Permission.PUSH),
-  FORCE_UPDATE,
-
-  FORGE_AUTHOR(Permission.FORGE_AUTHOR),
-  FORGE_COMMITTER(Permission.FORGE_COMMITTER),
-  FORGE_SERVER(Permission.FORGE_SERVER),
-  MERGE,
-  SKIP_VALIDATION,
-
-  /** Create a change to code review a commit. */
-  CREATE_CHANGE,
-
-  /**
-   * Creates changes, then also immediately submits them during {@code push}.
-   *
-   * <p>This is similar to {@link #UPDATE} except it constructs changes first, then submits them
-   * according to the submit strategy, which may include cherry-pick or rebase. By creating changes
-   * for each commit, automatic server side rebase, and post-update review are enabled.
-   */
-  UPDATE_BY_SUBMIT;
-
-  private final String name;
-
-  RefPermission() {
-    name = null;
-  }
-
-  RefPermission(String name) {
-    this.name = name;
-  }
-
-  /** @return name used in {@code project.config} permissions. */
-  public Optional<String> permissionName() {
-    return Optional.ofNullable(name);
-  }
-
-  public String describeForException() {
-    return toString().toLowerCase(Locale.US).replace('_', ' ');
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/AutoRegisterModules.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/AutoRegisterModules.java
deleted file mode 100644
index 37eabe9..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/AutoRegisterModules.java
+++ /dev/null
@@ -1,253 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.plugins;
-
-import static com.google.gerrit.extensions.webui.JavaScriptPlugin.STATIC_INIT_JS;
-import static com.google.gerrit.server.plugins.AutoRegisterUtil.calculateBindAnnotation;
-import static com.google.gerrit.server.plugins.PluginGuiceEnvironment.is;
-
-import com.google.common.collect.LinkedListMultimap;
-import com.google.common.collect.ListMultimap;
-import com.google.gerrit.extensions.annotations.Export;
-import com.google.gerrit.extensions.annotations.ExtensionPoint;
-import com.google.gerrit.extensions.annotations.Listen;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.webui.JavaScriptPlugin;
-import com.google.gerrit.extensions.webui.WebUiPlugin;
-import com.google.gerrit.server.plugins.PluginContentScanner.ExtensionMetaData;
-import com.google.inject.AbstractModule;
-import com.google.inject.Module;
-import com.google.inject.Scopes;
-import com.google.inject.TypeLiteral;
-import java.io.IOException;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.ParameterizedType;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-class AutoRegisterModules {
-  private static final Logger log = LoggerFactory.getLogger(AutoRegisterModules.class);
-
-  private final String pluginName;
-  private final PluginGuiceEnvironment env;
-  private final PluginContentScanner scanner;
-  private final ClassLoader classLoader;
-  private final ModuleGenerator sshGen;
-  private final ModuleGenerator httpGen;
-
-  private Set<Class<?>> sysSingletons;
-  private ListMultimap<TypeLiteral<?>, Class<?>> sysListen;
-  private String initJs;
-
-  Module sysModule;
-  Module sshModule;
-  Module httpModule;
-
-  AutoRegisterModules(
-      String pluginName,
-      PluginGuiceEnvironment env,
-      PluginContentScanner scanner,
-      ClassLoader classLoader) {
-    this.pluginName = pluginName;
-    this.env = env;
-    this.scanner = scanner;
-    this.classLoader = classLoader;
-    this.sshGen = env.hasSshModule() ? env.newSshModuleGenerator() : new ModuleGenerator.NOP();
-    this.httpGen = env.hasHttpModule() ? env.newHttpModuleGenerator() : new ModuleGenerator.NOP();
-  }
-
-  AutoRegisterModules discover() throws InvalidPluginException {
-    sysSingletons = new HashSet<>();
-    sysListen = LinkedListMultimap.create();
-    initJs = null;
-
-    sshGen.setPluginName(pluginName);
-    httpGen.setPluginName(pluginName);
-
-    scan();
-
-    if (!sysSingletons.isEmpty() || !sysListen.isEmpty() || initJs != null) {
-      sysModule = makeSystemModule();
-    }
-    sshModule = sshGen.create();
-    httpModule = httpGen.create();
-    return this;
-  }
-
-  private Module makeSystemModule() {
-    return new AbstractModule() {
-      @Override
-      protected void configure() {
-        for (Class<?> clazz : sysSingletons) {
-          bind(clazz).in(Scopes.SINGLETON);
-        }
-        for (Map.Entry<TypeLiteral<?>, Class<?>> e : sysListen.entries()) {
-          @SuppressWarnings("unchecked")
-          TypeLiteral<Object> type = (TypeLiteral<Object>) e.getKey();
-
-          @SuppressWarnings("unchecked")
-          Class<Object> impl = (Class<Object>) e.getValue();
-
-          Annotation n = calculateBindAnnotation(impl);
-          bind(type).annotatedWith(n).to(impl);
-        }
-        if (initJs != null) {
-          DynamicSet.bind(binder(), WebUiPlugin.class).toInstance(new JavaScriptPlugin(initJs));
-        }
-      }
-    };
-  }
-
-  private void scan() throws InvalidPluginException {
-    Map<Class<? extends Annotation>, Iterable<ExtensionMetaData>> extensions =
-        scanner.scan(pluginName, Arrays.asList(Export.class, Listen.class));
-    for (ExtensionMetaData export : extensions.get(Export.class)) {
-      export(export);
-    }
-    for (ExtensionMetaData listener : extensions.get(Listen.class)) {
-      listen(listener);
-    }
-    if (env.hasHttpModule()) {
-      exportInitJs();
-    }
-  }
-
-  private void exportInitJs() {
-    try {
-      if (scanner.getEntry(STATIC_INIT_JS).isPresent()) {
-        initJs = STATIC_INIT_JS;
-      }
-    } catch (IOException e) {
-      log.warn(
-          "Cannot access {} from plugin {}: "
-              + "JavaScript auto-discovered plugin will not be registered",
-          STATIC_INIT_JS,
-          pluginName,
-          e);
-    }
-  }
-
-  private void export(ExtensionMetaData def) throws InvalidPluginException {
-    Class<?> clazz;
-    try {
-      clazz = Class.forName(def.className, false, classLoader);
-    } catch (ClassNotFoundException err) {
-      throw new InvalidPluginException(
-          String.format("Cannot load %s with @Export(\"%s\")", def.className, def.annotationValue),
-          err);
-    }
-
-    Export export = clazz.getAnnotation(Export.class);
-    if (export == null) {
-      log.warn(
-          "In plugin {} asm incorrectly parsed {} with @Export(\"{}\")",
-          pluginName,
-          clazz.getName(),
-          def.annotationValue);
-      return;
-    }
-
-    if (is("org.apache.sshd.server.Command", clazz)) {
-      sshGen.export(export, clazz);
-    } else if (is("javax.servlet.http.HttpServlet", clazz)) {
-      httpGen.export(export, clazz);
-      listen(clazz, clazz);
-    } else {
-      int cnt = sysListen.size();
-      listen(clazz, clazz);
-      if (cnt == sysListen.size()) {
-        // If no bindings were recorded, the extension isn't recognized.
-        throw new InvalidPluginException(
-            String.format(
-                "Class %s with @Export(\"%s\") not supported", clazz.getName(), export.value()));
-      }
-    }
-  }
-
-  private void listen(ExtensionMetaData def) throws InvalidPluginException {
-    Class<?> clazz;
-    try {
-      clazz = Class.forName(def.className, false, classLoader);
-    } catch (ClassNotFoundException err) {
-      throw new InvalidPluginException(
-          String.format("Cannot load %s with @Listen", def.className), err);
-    }
-
-    Listen listen = clazz.getAnnotation(Listen.class);
-    if (listen != null) {
-      listen(clazz, clazz);
-    } else {
-      log.warn("In plugin {} asm incorrectly parsed {} with @Listen", pluginName, clazz.getName());
-    }
-  }
-
-  private void listen(java.lang.reflect.Type type, Class<?> clazz) throws InvalidPluginException {
-    while (type != null) {
-      Class<?> rawType;
-      if (type instanceof ParameterizedType) {
-        rawType = (Class<?>) ((ParameterizedType) type).getRawType();
-      } else if (type instanceof Class) {
-        rawType = (Class<?>) type;
-      } else {
-        return;
-      }
-
-      if (rawType.getAnnotation(ExtensionPoint.class) != null) {
-        TypeLiteral<?> tl = TypeLiteral.get(type);
-        if (env.hasDynamicItem(tl)) {
-          sysSingletons.add(clazz);
-          sysListen.put(tl, clazz);
-          httpGen.listen(tl, clazz);
-          sshGen.listen(tl, clazz);
-        } else if (env.hasDynamicSet(tl)) {
-          sysSingletons.add(clazz);
-          sysListen.put(tl, clazz);
-          httpGen.listen(tl, clazz);
-          sshGen.listen(tl, clazz);
-        } else if (env.hasDynamicMap(tl)) {
-          if (clazz.getAnnotation(Export.class) == null) {
-            throw new InvalidPluginException(
-                String.format(
-                    "Class %s requires @Export(\"name\") annotation for %s",
-                    clazz.getName(), rawType.getName()));
-          }
-          sysSingletons.add(clazz);
-          sysListen.put(tl, clazz);
-          httpGen.listen(tl, clazz);
-          sshGen.listen(tl, clazz);
-        } else {
-          throw new InvalidPluginException(
-              String.format(
-                  "Cannot register %s, server does not accept %s",
-                  clazz.getName(), rawType.getName()));
-        }
-        return;
-      }
-
-      java.lang.reflect.Type[] interfaces = rawType.getGenericInterfaces();
-      if (interfaces != null) {
-        for (java.lang.reflect.Type i : interfaces) {
-          listen(i, clazz);
-        }
-      }
-
-      type = rawType.getGenericSuperclass();
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/CleanupHandle.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/CleanupHandle.java
deleted file mode 100644
index 5a60ee2..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/CleanupHandle.java
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.plugins;
-
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.jar.JarFile;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-class CleanupHandle {
-  private static final Logger log = LoggerFactory.getLogger(CleanupHandle.class);
-
-  private final Path tmp;
-  private final JarFile jarFile;
-
-  CleanupHandle(Path tmp, JarFile jarFile) {
-    this.tmp = tmp;
-    this.jarFile = jarFile;
-  }
-
-  void cleanup() {
-    try {
-      jarFile.close();
-    } catch (IOException err) {
-      log.error("Cannot close " + jarFile.getName(), err);
-    }
-    try {
-      Files.deleteIfExists(tmp);
-      log.info("Cleaned plugin " + tmp.getFileName());
-    } catch (IOException e) {
-      log.warn(
-          "Cannot delete "
-              + tmp.toAbsolutePath()
-              + ", retrying to delete it on termination of the virtual machine",
-          e);
-      tmp.toFile().deleteOnExit();
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/DisablePlugin.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/DisablePlugin.java
deleted file mode 100644
index a2da580..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/DisablePlugin.java
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.plugins;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
-import com.google.gerrit.extensions.common.PluginInfo;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.server.plugins.DisablePlugin.Input;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
-@Singleton
-public class DisablePlugin implements RestModifyView<PluginResource, Input> {
-  public static class Input {}
-
-  private final PluginLoader loader;
-
-  @Inject
-  DisablePlugin(PluginLoader loader) {
-    this.loader = loader;
-  }
-
-  @Override
-  public PluginInfo apply(PluginResource resource, Input input) throws MethodNotAllowedException {
-    if (!loader.isRemoteAdminEnabled()) {
-      throw new MethodNotAllowedException("remote plugin administration is disabled");
-    }
-    String name = resource.getName();
-    loader.disablePlugins(ImmutableSet.of(name));
-    return ListPlugins.toPluginInfo(loader.get(name));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/EnablePlugin.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/EnablePlugin.java
deleted file mode 100644
index f29e36b..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/EnablePlugin.java
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.plugins;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
-import com.google.gerrit.extensions.common.PluginInfo;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.server.plugins.EnablePlugin.Input;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-
-@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
-@Singleton
-public class EnablePlugin implements RestModifyView<PluginResource, Input> {
-  public static class Input {}
-
-  private final PluginLoader loader;
-
-  @Inject
-  EnablePlugin(PluginLoader loader) {
-    this.loader = loader;
-  }
-
-  @Override
-  public PluginInfo apply(PluginResource resource, Input input)
-      throws ResourceConflictException, MethodNotAllowedException {
-    if (!loader.isRemoteAdminEnabled()) {
-      throw new MethodNotAllowedException("remote plugin administration is disabled");
-    }
-    String name = resource.getName();
-    try {
-      loader.enablePlugins(ImmutableSet.of(name));
-    } catch (PluginInstallException e) {
-      StringWriter buf = new StringWriter();
-      buf.write(String.format("cannot enable %s\n", name));
-      PrintWriter pw = new PrintWriter(buf);
-      e.printStackTrace(pw);
-      pw.flush();
-      throw new ResourceConflictException(buf.toString());
-    }
-    return ListPlugins.toPluginInfo(loader.get(name));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/InstallPlugin.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/InstallPlugin.java
deleted file mode 100644
index 531e9ac..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/InstallPlugin.java
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.plugins;
-
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
-import com.google.gerrit.extensions.common.InstallPluginInput;
-import com.google.gerrit.extensions.common.PluginInfo;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.net.URL;
-import java.util.zip.ZipException;
-
-@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
-public class InstallPlugin implements RestModifyView<TopLevelResource, InstallPluginInput> {
-  private final PluginLoader loader;
-
-  private String name;
-  private boolean created;
-
-  @Inject
-  InstallPlugin(PluginLoader loader) {
-    this.loader = loader;
-  }
-
-  public InstallPlugin setName(String name) {
-    this.name = name;
-    return this;
-  }
-
-  public InstallPlugin setCreated(boolean created) {
-    this.created = created;
-    return this;
-  }
-
-  @Override
-  public Response<PluginInfo> apply(TopLevelResource resource, InstallPluginInput input)
-      throws BadRequestException, MethodNotAllowedException, IOException {
-    if (!loader.isRemoteAdminEnabled()) {
-      throw new MethodNotAllowedException("remote installation is disabled");
-    }
-    try {
-      try (InputStream in = openStream(input)) {
-        String pluginName = loader.installPluginFromStream(name, in);
-        PluginInfo info = ListPlugins.toPluginInfo(loader.get(pluginName));
-        return created ? Response.created(info) : Response.ok(info);
-      }
-    } catch (PluginInstallException e) {
-      StringWriter buf = new StringWriter();
-      buf.write(String.format("cannot install %s", name));
-      if (e.getCause() instanceof ZipException) {
-        buf.write(": ");
-        buf.write(e.getCause().getMessage());
-      } else {
-        buf.write(":\n");
-        PrintWriter pw = new PrintWriter(buf);
-        e.printStackTrace(pw);
-        pw.flush();
-      }
-      throw new BadRequestException(buf.toString());
-    }
-  }
-
-  private InputStream openStream(InstallPluginInput input) throws IOException, BadRequestException {
-    if (input.raw != null) {
-      return input.raw.getInputStream();
-    }
-    try {
-      return new URL(input.url).openStream();
-    } catch (IOException e) {
-      throw new BadRequestException(e.getMessage());
-    }
-  }
-
-  @RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
-  static class Overwrite implements RestModifyView<PluginResource, InstallPluginInput> {
-    private final Provider<InstallPlugin> install;
-
-    @Inject
-    Overwrite(Provider<InstallPlugin> install) {
-      this.install = install;
-    }
-
-    @Override
-    public Response<PluginInfo> apply(PluginResource resource, InstallPluginInput input)
-        throws BadRequestException, MethodNotAllowedException, IOException {
-      return install.get().setName(resource.getName()).apply(TopLevelResource.INSTANCE, input);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarPluginProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarPluginProvider.java
deleted file mode 100644
index f147154..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarPluginProvider.java
+++ /dev/null
@@ -1,172 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.plugins;
-
-import com.google.common.base.MoreObjects;
-import com.google.gerrit.server.config.PluginConfig;
-import com.google.gerrit.server.config.PluginConfigFactory;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.jar.JarFile;
-import java.util.jar.Manifest;
-import org.eclipse.jgit.internal.storage.file.FileSnapshot;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class JarPluginProvider implements ServerPluginProvider {
-  static final String PLUGIN_TMP_PREFIX = "plugin_";
-  static final String JAR_EXTENSION = ".jar";
-  static final Logger log = LoggerFactory.getLogger(JarPluginProvider.class);
-
-  private final Path tmpDir;
-  private final PluginConfigFactory configFactory;
-
-  @Inject
-  JarPluginProvider(SitePaths sitePaths, PluginConfigFactory configFactory) {
-    this.tmpDir = sitePaths.tmp_dir;
-    this.configFactory = configFactory;
-  }
-
-  @Override
-  public boolean handles(Path srcPath) {
-    String fileName = srcPath.getFileName().toString();
-    return fileName.endsWith(JAR_EXTENSION) || fileName.endsWith(JAR_EXTENSION + ".disabled");
-  }
-
-  @Override
-  public String getPluginName(Path srcPath) {
-    try {
-      return MoreObjects.firstNonNull(getJarPluginName(srcPath), PluginUtil.nameOf(srcPath));
-    } catch (IOException e) {
-      throw new IllegalArgumentException(
-          "Invalid plugin file " + srcPath + ": cannot get plugin name", e);
-    }
-  }
-
-  public static String getJarPluginName(Path srcPath) throws IOException {
-    try (JarFile jarFile = new JarFile(srcPath.toFile())) {
-      return jarFile.getManifest().getMainAttributes().getValue("Gerrit-PluginName");
-    }
-  }
-
-  @Override
-  public ServerPlugin get(Path srcPath, FileSnapshot snapshot, PluginDescription description)
-      throws InvalidPluginException {
-    try {
-      String name = getPluginName(srcPath);
-      String extension = getExtension(srcPath);
-      try (InputStream in = Files.newInputStream(srcPath)) {
-        Path tmp = PluginUtil.asTemp(in, tempNameFor(name), extension, tmpDir);
-        return loadJarPlugin(name, srcPath, snapshot, tmp, description);
-      }
-    } catch (IOException e) {
-      throw new InvalidPluginException("Cannot load Jar plugin " + srcPath, e);
-    }
-  }
-
-  @Override
-  public String getProviderPluginName() {
-    return "gerrit";
-  }
-
-  private static String getExtension(Path path) {
-    return getExtension(path.getFileName().toString());
-  }
-
-  private static String getExtension(String name) {
-    int ext = name.lastIndexOf('.');
-    return 0 < ext ? name.substring(ext) : "";
-  }
-
-  private static String tempNameFor(String name) {
-    SimpleDateFormat fmt = new SimpleDateFormat("yyMMdd_HHmm");
-    return PLUGIN_TMP_PREFIX + name + "_" + fmt.format(new Date()) + "_";
-  }
-
-  public static Path storeInTemp(String pluginName, InputStream in, SitePaths sitePaths)
-      throws IOException {
-    if (!Files.exists(sitePaths.tmp_dir)) {
-      Files.createDirectories(sitePaths.tmp_dir);
-    }
-    return PluginUtil.asTemp(in, tempNameFor(pluginName), ".jar", sitePaths.tmp_dir);
-  }
-
-  private ServerPlugin loadJarPlugin(
-      String name, Path srcJar, FileSnapshot snapshot, Path tmp, PluginDescription description)
-      throws IOException, InvalidPluginException, MalformedURLException {
-    JarFile jarFile = new JarFile(tmp.toFile());
-    boolean keep = false;
-    try {
-      Manifest manifest = jarFile.getManifest();
-      Plugin.ApiType type = Plugin.getApiType(manifest);
-
-      List<URL> urls = new ArrayList<>(2);
-      String overlay = System.getProperty("gerrit.plugin-classes");
-      if (overlay != null) {
-        Path classes = Paths.get(overlay).resolve(name).resolve("main");
-        if (Files.isDirectory(classes)) {
-          log.info("plugin {}: including {}", name, classes);
-          urls.add(classes.toUri().toURL());
-        }
-      }
-      urls.add(tmp.toUri().toURL());
-
-      ClassLoader pluginLoader =
-          new URLClassLoader(urls.toArray(new URL[urls.size()]), PluginUtil.parentFor(type));
-
-      JarScanner jarScanner = createJarScanner(tmp);
-      PluginConfig pluginConfig = configFactory.getFromGerritConfig(name);
-
-      ServerPlugin plugin =
-          new ServerPlugin(
-              name,
-              description.canonicalUrl,
-              description.user,
-              srcJar,
-              snapshot,
-              jarScanner,
-              description.dataDir,
-              pluginLoader,
-              pluginConfig.getString("metricsPrefix", null));
-      plugin.setCleanupHandle(new CleanupHandle(tmp, jarFile));
-      keep = true;
-      return plugin;
-    } finally {
-      if (!keep) {
-        jarFile.close();
-      }
-    }
-  }
-
-  private JarScanner createJarScanner(Path srcJar) throws InvalidPluginException {
-    try {
-      return new JarScanner(srcJar);
-    } catch (IOException e) {
-      throw new InvalidPluginException("Cannot scan plugin file " + srcJar, e);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarScanner.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarScanner.java
deleted file mode 100644
index 863ef3f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarScanner.java
+++ /dev/null
@@ -1,348 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.plugins;
-
-import static com.google.common.base.MoreObjects.firstNonNull;
-import static com.google.common.collect.Iterables.transform;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.MultimapBuilder;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.annotation.Annotation;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import java.util.jar.Attributes;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
-import java.util.jar.Manifest;
-import org.eclipse.jgit.util.IO;
-import org.objectweb.asm.AnnotationVisitor;
-import org.objectweb.asm.Attribute;
-import org.objectweb.asm.ClassReader;
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.FieldVisitor;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class JarScanner implements PluginContentScanner, AutoCloseable {
-  private static final Logger log = LoggerFactory.getLogger(JarScanner.class);
-  private static final int SKIP_ALL =
-      ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES;
-  private final JarFile jarFile;
-
-  public JarScanner(Path src) throws IOException {
-    this.jarFile = new JarFile(src.toFile());
-  }
-
-  @Override
-  public Map<Class<? extends Annotation>, Iterable<ExtensionMetaData>> scan(
-      String pluginName, Iterable<Class<? extends Annotation>> annotations)
-      throws InvalidPluginException {
-    Set<String> descriptors = new HashSet<>();
-    ListMultimap<String, JarScanner.ClassData> rawMap =
-        MultimapBuilder.hashKeys().arrayListValues().build();
-    Map<Class<? extends Annotation>, String> classObjToClassDescr = new HashMap<>();
-
-    for (Class<? extends Annotation> annotation : annotations) {
-      String descriptor = Type.getType(annotation).getDescriptor();
-      descriptors.add(descriptor);
-      classObjToClassDescr.put(annotation, descriptor);
-    }
-
-    Enumeration<JarEntry> e = jarFile.entries();
-    while (e.hasMoreElements()) {
-      JarEntry entry = e.nextElement();
-      if (skip(entry)) {
-        continue;
-      }
-
-      ClassData def = new ClassData(descriptors);
-      try {
-        new ClassReader(read(jarFile, entry)).accept(def, SKIP_ALL);
-      } catch (IOException err) {
-        throw new InvalidPluginException("Cannot auto-register", err);
-      } catch (RuntimeException err) {
-        log.warn(
-            "Plugin {} has invalid class file {} inside of {}",
-            pluginName,
-            entry.getName(),
-            jarFile.getName(),
-            err);
-        continue;
-      }
-
-      if (!Strings.isNullOrEmpty(def.annotationName)) {
-        if (def.isConcrete()) {
-          rawMap.put(def.annotationName, def);
-        } else {
-          log.warn(
-              "Plugin {} tries to @{}(\"{}\") abstract class {}",
-              pluginName,
-              def.annotationName,
-              def.annotationValue,
-              def.className);
-        }
-      }
-    }
-
-    ImmutableMap.Builder<Class<? extends Annotation>, Iterable<ExtensionMetaData>> result =
-        ImmutableMap.builder();
-
-    for (Class<? extends Annotation> annotoation : annotations) {
-      String descr = classObjToClassDescr.get(annotoation);
-      Collection<ClassData> discoverdData = rawMap.get(descr);
-      Collection<ClassData> values = firstNonNull(discoverdData, Collections.<ClassData>emptySet());
-
-      result.put(
-          annotoation,
-          transform(values, cd -> new ExtensionMetaData(cd.className, cd.annotationValue)));
-    }
-
-    return result.build();
-  }
-
-  public List<String> findSubClassesOf(Class<?> superClass) throws IOException {
-    return findSubClassesOf(superClass.getName());
-  }
-
-  @Override
-  public void close() throws IOException {
-    jarFile.close();
-  }
-
-  private List<String> findSubClassesOf(String superClass) throws IOException {
-    String name = superClass.replace('.', '/');
-
-    List<String> classes = new ArrayList<>();
-    Enumeration<JarEntry> e = jarFile.entries();
-    while (e.hasMoreElements()) {
-      JarEntry entry = e.nextElement();
-      if (skip(entry)) {
-        continue;
-      }
-
-      ClassData def = new ClassData(Collections.<String>emptySet());
-      try {
-        new ClassReader(read(jarFile, entry)).accept(def, SKIP_ALL);
-      } catch (RuntimeException err) {
-        log.warn("Jar {} has invalid class file {}", jarFile.getName(), entry.getName(), err);
-        continue;
-      }
-
-      if (name.equals(def.superName)) {
-        classes.addAll(findSubClassesOf(def.className));
-        if (def.isConcrete()) {
-          classes.add(def.className);
-        }
-      }
-    }
-
-    return classes;
-  }
-
-  private static boolean skip(JarEntry entry) {
-    if (!entry.getName().endsWith(".class")) {
-      return true; // Avoid non-class resources.
-    }
-    if (entry.getSize() <= 0) {
-      return true; // Directories have 0 size.
-    }
-    if (entry.getSize() >= 1024 * 1024) {
-      return true; // Do not scan huge class files.
-    }
-    return false;
-  }
-
-  private static byte[] read(JarFile jarFile, JarEntry entry) throws IOException {
-    byte[] data = new byte[(int) entry.getSize()];
-    try (InputStream in = jarFile.getInputStream(entry)) {
-      IO.readFully(in, data, 0, data.length);
-    }
-    return data;
-  }
-
-  public static class ClassData extends ClassVisitor {
-    int access;
-    String className;
-    String superName;
-    String annotationName;
-    String annotationValue;
-    String[] interfaces;
-    Collection<String> exports;
-
-    private ClassData(Collection<String> exports) {
-      super(Opcodes.ASM5);
-      this.exports = exports;
-    }
-
-    boolean isConcrete() {
-      return (access & Opcodes.ACC_ABSTRACT) == 0 && (access & Opcodes.ACC_INTERFACE) == 0;
-    }
-
-    @Override
-    public void visit(
-        int version,
-        int access,
-        String name,
-        String signature,
-        String superName,
-        String[] interfaces) {
-      this.className = Type.getObjectType(name).getClassName();
-      this.access = access;
-      this.superName = superName;
-    }
-
-    @Override
-    public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
-      if (!visible) {
-        return null;
-      }
-      Optional<String> found = exports.stream().filter(x -> x.equals(desc)).findAny();
-      if (found.isPresent()) {
-        annotationName = desc;
-        return new AbstractAnnotationVisitor() {
-          @Override
-          public void visit(String name, Object value) {
-            annotationValue = (String) value;
-          }
-        };
-      }
-      return null;
-    }
-
-    @Override
-    public void visitSource(String arg0, String arg1) {}
-
-    @Override
-    public void visitOuterClass(String arg0, String arg1, String arg2) {}
-
-    @Override
-    public MethodVisitor visitMethod(
-        int arg0, String arg1, String arg2, String arg3, String[] arg4) {
-      return null;
-    }
-
-    @Override
-    public void visitInnerClass(String arg0, String arg1, String arg2, int arg3) {}
-
-    @Override
-    public FieldVisitor visitField(int arg0, String arg1, String arg2, String arg3, Object arg4) {
-      return null;
-    }
-
-    @Override
-    public void visitEnd() {}
-
-    @Override
-    public void visitAttribute(Attribute arg0) {}
-  }
-
-  private abstract static class AbstractAnnotationVisitor extends AnnotationVisitor {
-    AbstractAnnotationVisitor() {
-      super(Opcodes.ASM5);
-    }
-
-    @Override
-    public AnnotationVisitor visitAnnotation(String arg0, String arg1) {
-      return null;
-    }
-
-    @Override
-    public AnnotationVisitor visitArray(String arg0) {
-      return null;
-    }
-
-    @Override
-    public void visitEnum(String arg0, String arg1, String arg2) {}
-
-    @Override
-    public void visitEnd() {}
-  }
-
-  @Override
-  public Optional<PluginEntry> getEntry(String resourcePath) throws IOException {
-    JarEntry jarEntry = jarFile.getJarEntry(resourcePath);
-    if (jarEntry == null || jarEntry.getSize() == 0) {
-      return Optional.empty();
-    }
-
-    return Optional.of(resourceOf(jarEntry));
-  }
-
-  @Override
-  public Enumeration<PluginEntry> entries() {
-    return Collections.enumeration(
-        Lists.transform(
-            Collections.list(jarFile.entries()),
-            jarEntry -> {
-              try {
-                return resourceOf(jarEntry);
-              } catch (IOException e) {
-                throw new IllegalArgumentException(
-                    "Cannot convert jar entry " + jarEntry + " to a resource", e);
-              }
-            }));
-  }
-
-  @Override
-  public InputStream getInputStream(PluginEntry entry) throws IOException {
-    return jarFile.getInputStream(jarFile.getEntry(entry.getName()));
-  }
-
-  @Override
-  public Manifest getManifest() throws IOException {
-    return jarFile.getManifest();
-  }
-
-  private PluginEntry resourceOf(JarEntry jarEntry) throws IOException {
-    return new PluginEntry(
-        jarEntry.getName(),
-        jarEntry.getTime(),
-        Optional.of(jarEntry.getSize()),
-        attributesOf(jarEntry));
-  }
-
-  private Map<Object, String> attributesOf(JarEntry jarEntry) throws IOException {
-    Attributes attributes = jarEntry.getAttributes();
-    if (attributes == null) {
-      return Collections.emptyMap();
-    }
-    return Maps.transformEntries(
-        attributes,
-        new Maps.EntryTransformer<Object, Object, String>() {
-          @Override
-          public String transformEntry(Object key, Object value) {
-            return (String) value;
-          }
-        });
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ListPlugins.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ListPlugins.java
deleted file mode 100644
index ee7cd5c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ListPlugins.java
+++ /dev/null
@@ -1,164 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.plugins;
-
-import static java.util.Comparator.comparing;
-import static java.util.stream.Collectors.toMap;
-
-import com.google.common.collect.Streams;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
-import com.google.gerrit.extensions.api.plugins.Plugins;
-import com.google.gerrit.extensions.common.PluginInfo;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.extensions.restapi.Url;
-import com.google.inject.Inject;
-import java.util.Locale;
-import java.util.SortedMap;
-import java.util.TreeMap;
-import java.util.regex.Pattern;
-import java.util.stream.Stream;
-import org.kohsuke.args4j.Option;
-
-/** List the installed plugins. */
-@RequiresCapability(GlobalCapability.VIEW_PLUGINS)
-public class ListPlugins implements RestReadView<TopLevelResource> {
-  private final PluginLoader pluginLoader;
-
-  private boolean all;
-  private int limit;
-  private int start;
-  private String matchPrefix;
-  private String matchSubstring;
-  private String matchRegex;
-
-  @Option(
-      name = "--all",
-      aliases = {"-a"},
-      usage = "List all plugins, including disabled plugins")
-  public void setAll(boolean all) {
-    this.all = all;
-  }
-
-  @Option(
-      name = "--limit",
-      aliases = {"-n"},
-      metaVar = "CNT",
-      usage = "maximum number of plugins to list")
-  public void setLimit(int limit) {
-    this.limit = limit;
-  }
-
-  @Option(
-      name = "--start",
-      aliases = {"-S"},
-      metaVar = "CNT",
-      usage = "number of plugins to skip")
-  public void setStart(int start) {
-    this.start = start;
-  }
-
-  @Option(
-      name = "--prefix",
-      aliases = {"-p"},
-      metaVar = "PREFIX",
-      usage = "match plugin prefix")
-  public void setMatchPrefix(String matchPrefix) {
-    this.matchPrefix = matchPrefix;
-  }
-
-  @Option(
-      name = "--match",
-      aliases = {"-m"},
-      metaVar = "MATCH",
-      usage = "match plugin substring")
-  public void setMatchSubstring(String matchSubstring) {
-    this.matchSubstring = matchSubstring;
-  }
-
-  @Option(name = "-r", metaVar = "REGEX", usage = "match plugin regex")
-  public void setMatchRegex(String matchRegex) {
-    this.matchRegex = matchRegex;
-  }
-
-  @Inject
-  protected ListPlugins(PluginLoader pluginLoader) {
-    this.pluginLoader = pluginLoader;
-  }
-
-  public ListPlugins request(Plugins.ListRequest request) {
-    this.setAll(request.getAll());
-    this.setStart(request.getStart());
-    this.setLimit(request.getLimit());
-    this.setMatchPrefix(request.getPrefix());
-    this.setMatchSubstring(request.getSubstring());
-    this.setMatchRegex(request.getRegex());
-    return this;
-  }
-
-  @Override
-  public SortedMap<String, PluginInfo> apply(TopLevelResource resource) throws BadRequestException {
-    Stream<Plugin> s = Streams.stream(pluginLoader.getPlugins(all));
-    if (matchPrefix != null) {
-      checkMatchOptions(matchSubstring == null && matchRegex == null);
-      s = s.filter(p -> p.getName().startsWith(matchPrefix));
-    } else if (matchSubstring != null) {
-      checkMatchOptions(matchPrefix == null && matchRegex == null);
-      String substring = matchSubstring.toLowerCase(Locale.US);
-      s = s.filter(p -> p.getName().toLowerCase(Locale.US).contains(substring));
-    } else if (matchRegex != null) {
-      checkMatchOptions(matchPrefix == null && matchSubstring == null);
-      Pattern pattern = Pattern.compile(matchRegex);
-      s = s.filter(p -> pattern.matcher(p.getName()).matches());
-    }
-    s = s.sorted(comparing(Plugin::getName));
-    if (start > 0) {
-      s = s.skip(start);
-    }
-    if (limit > 0) {
-      s = s.limit(limit);
-    }
-    return new TreeMap<>(s.collect(toMap(p -> p.getName(), p -> toPluginInfo(p))));
-  }
-
-  private void checkMatchOptions(boolean cond) throws BadRequestException {
-    if (!cond) {
-      throw new BadRequestException("specify exactly one of p/m/r");
-    }
-  }
-
-  public static PluginInfo toPluginInfo(Plugin p) {
-    String id;
-    String version;
-    String indexUrl;
-    String filename;
-    Boolean disabled;
-
-    id = Url.encode(p.getName());
-    version = p.getVersion();
-    disabled = p.isDisabled() ? true : null;
-    if (p.getSrcFile() != null) {
-      indexUrl = String.format("plugins/%s/", p.getName());
-      filename = p.getSrcFile().getFileName().toString();
-    } else {
-      indexUrl = null;
-      filename = null;
-    }
-
-    return new PluginInfo(id, version, indexUrl, filename, disabled);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginCleanerTask.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginCleanerTask.java
deleted file mode 100644
index 390f0e9..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginCleanerTask.java
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.plugins;
-
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.server.git.WorkQueue;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-class PluginCleanerTask implements Runnable {
-  private static final Logger log = LoggerFactory.getLogger(PluginCleanerTask.class);
-
-  private final WorkQueue workQueue;
-  private final PluginLoader loader;
-  private volatile int pending;
-  private Future<?> self;
-  private int attempts;
-  private long start;
-
-  @Inject
-  PluginCleanerTask(WorkQueue workQueue, PluginLoader loader) {
-    this.workQueue = workQueue;
-    this.loader = loader;
-  }
-
-  @Override
-  public void run() {
-    try {
-      for (int t = 0; t < 2 * (attempts + 1); t++) {
-        System.gc();
-        Thread.sleep(50);
-      }
-    } catch (InterruptedException e) {
-      // Ignored
-    }
-
-    int left = loader.processPendingCleanups();
-    synchronized (this) {
-      pending = left;
-      self = null;
-
-      if (0 < left) {
-        long waiting = TimeUtil.nowMs() - start;
-        log.warn(
-            "{} plugins still waiting to be reclaimed after {} minutes",
-            pending,
-            TimeUnit.MILLISECONDS.toMinutes(waiting));
-        attempts = Math.min(attempts + 1, 15);
-        ensureScheduled();
-      } else {
-        attempts = 0;
-      }
-    }
-  }
-
-  @Override
-  public String toString() {
-    int p = pending;
-    if (0 < p) {
-      return String.format("Plugin Cleaner (waiting for %d plugins)", p);
-    }
-    return "Plugin Cleaner";
-  }
-
-  synchronized void clean(int expect) {
-    if (self == null && pending == 0) {
-      start = TimeUtil.nowMs();
-    }
-    pending = expect;
-    ensureScheduled();
-  }
-
-  private void ensureScheduled() {
-    if (self == null && 0 < pending) {
-      if (attempts == 1) {
-        self = workQueue.getDefaultQueue().schedule(this, 30, TimeUnit.SECONDS);
-      } else {
-        self = workQueue.getDefaultQueue().schedule(this, attempts + 1, TimeUnit.MINUTES);
-      }
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginEntry.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginEntry.java
deleted file mode 100644
index f7b1e82..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginEntry.java
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.plugins;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Map;
-import java.util.Optional;
-
-/**
- * Plugin static resource entry
- *
- * <p>Bean representing a static resource inside a plugin. All static resources are available at
- * {@code <plugin web url>/static} and served by the HttpPluginServlet.
- */
-public class PluginEntry {
-  public static final String ATTR_CHARACTER_ENCODING = "Character-Encoding";
-  public static final String ATTR_CONTENT_TYPE = "Content-Type";
-  public static final Comparator<PluginEntry> COMPARATOR_BY_NAME =
-      new Comparator<PluginEntry>() {
-        @Override
-        public int compare(PluginEntry a, PluginEntry b) {
-          return a.getName().compareTo(b.getName());
-        }
-      };
-
-  private static final Map<Object, String> EMPTY_ATTRS = Collections.emptyMap();
-  private static final Optional<Long> NO_SIZE = Optional.empty();
-
-  private final String name;
-  private final long time;
-  private final Optional<Long> size;
-  private final Map<Object, String> attrs;
-
-  public PluginEntry(String name, long time, Optional<Long> size, Map<Object, String> attrs) {
-    this.name = name;
-    this.time = time;
-    this.size = size;
-    this.attrs = attrs;
-  }
-
-  public PluginEntry(String name, long time, Optional<Long> size) {
-    this(name, time, size, EMPTY_ATTRS);
-  }
-
-  public PluginEntry(String name, long time) {
-    this(name, time, NO_SIZE, EMPTY_ATTRS);
-  }
-
-  public String getName() {
-    return name;
-  }
-
-  public long getTime() {
-    return time;
-  }
-
-  public Optional<Long> getSize() {
-    return size;
-  }
-
-  public Map<Object, String> getAttrs() {
-    return attrs;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginGuiceEnvironment.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginGuiceEnvironment.java
deleted file mode 100644
index effd51a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginGuiceEnvironment.java
+++ /dev/null
@@ -1,648 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.plugins;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.gerrit.extensions.registration.PrivateInternals_DynamicTypes.dynamicItemsOf;
-import static com.google.gerrit.extensions.registration.PrivateInternals_DynamicTypes.dynamicMapsOf;
-import static com.google.gerrit.extensions.registration.PrivateInternals_DynamicTypes.dynamicSetsOf;
-
-import com.google.common.collect.LinkedListMultimap;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.Lists;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.annotations.RootRelative;
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.registration.PrivateInternals_DynamicMapImpl;
-import com.google.gerrit.extensions.registration.PrivateInternals_DynamicTypes;
-import com.google.gerrit.extensions.registration.RegistrationHandle;
-import com.google.gerrit.extensions.registration.ReloadableRegistrationHandle;
-import com.google.gerrit.extensions.systemstatus.ServerInformation;
-import com.google.gerrit.extensions.webui.WebUiPlugin;
-import com.google.gerrit.index.IndexCollection;
-import com.google.gerrit.metrics.MetricMaker;
-import com.google.gerrit.server.util.PluginRequestContext;
-import com.google.gerrit.server.util.RequestContext;
-import com.google.gerrit.server.util.ThreadLocalRequestContext;
-import com.google.inject.AbstractModule;
-import com.google.inject.Binding;
-import com.google.inject.Guice;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.Key;
-import com.google.inject.Module;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import com.google.inject.TypeLiteral;
-import com.google.inject.internal.UniqueAnnotations;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.ParameterizedType;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.CopyOnWriteArrayList;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * Tracks Guice bindings that should be exposed to loaded plugins.
- *
- * <p>This is an internal implementation detail of how the main server is able to export its
- * explicit Guice bindings to tightly coupled plugins, giving them access to singletons and request
- * scoped resources just like any core code.
- */
-@Singleton
-public class PluginGuiceEnvironment {
-  private final Injector sysInjector;
-  private final ServerInformation srvInfo;
-  private final ThreadLocalRequestContext local;
-  private final CopyConfigModule copyConfigModule;
-  private final Set<Key<?>> copyConfigKeys;
-  private final List<StartPluginListener> onStart;
-  private final List<StopPluginListener> onStop;
-  private final List<ReloadPluginListener> onReload;
-  private final MetricMaker serverMetrics;
-
-  private Module sysModule;
-  private Module sshModule;
-  private Module httpModule;
-
-  private Provider<ModuleGenerator> sshGen;
-  private Provider<ModuleGenerator> httpGen;
-
-  private Map<TypeLiteral<?>, DynamicItem<?>> sysItems;
-  private Map<TypeLiteral<?>, DynamicItem<?>> sshItems;
-  private Map<TypeLiteral<?>, DynamicItem<?>> httpItems;
-
-  private Map<TypeLiteral<?>, DynamicSet<?>> sysSets;
-  private Map<TypeLiteral<?>, DynamicSet<?>> sshSets;
-  private Map<TypeLiteral<?>, DynamicSet<?>> httpSets;
-
-  private Map<TypeLiteral<?>, DynamicMap<?>> sysMaps;
-  private Map<TypeLiteral<?>, DynamicMap<?>> sshMaps;
-  private Map<TypeLiteral<?>, DynamicMap<?>> httpMaps;
-
-  @Inject
-  PluginGuiceEnvironment(
-      Injector sysInjector,
-      ThreadLocalRequestContext local,
-      ServerInformation srvInfo,
-      CopyConfigModule ccm,
-      MetricMaker serverMetrics) {
-    this.sysInjector = sysInjector;
-    this.srvInfo = srvInfo;
-    this.local = local;
-    this.copyConfigModule = ccm;
-    this.copyConfigKeys = Guice.createInjector(ccm).getAllBindings().keySet();
-    this.serverMetrics = serverMetrics;
-
-    onStart = new CopyOnWriteArrayList<>();
-    onStart.addAll(listeners(sysInjector, StartPluginListener.class));
-
-    onStop = new CopyOnWriteArrayList<>();
-    onStop.addAll(listeners(sysInjector, StopPluginListener.class));
-
-    onReload = new CopyOnWriteArrayList<>();
-    onReload.addAll(listeners(sysInjector, ReloadPluginListener.class));
-
-    sysItems = dynamicItemsOf(sysInjector);
-    sysSets = dynamicSetsOf(sysInjector);
-    sysMaps = dynamicMapsOf(sysInjector);
-  }
-
-  ServerInformation getServerInformation() {
-    return srvInfo;
-  }
-
-  MetricMaker getServerMetrics() {
-    return serverMetrics;
-  }
-
-  boolean hasDynamicItem(TypeLiteral<?> type) {
-    return sysItems.containsKey(type)
-        || (sshItems != null && sshItems.containsKey(type))
-        || (httpItems != null && httpItems.containsKey(type));
-  }
-
-  boolean hasDynamicSet(TypeLiteral<?> type) {
-    return sysSets.containsKey(type)
-        || (sshSets != null && sshSets.containsKey(type))
-        || (httpSets != null && httpSets.containsKey(type));
-  }
-
-  boolean hasDynamicMap(TypeLiteral<?> type) {
-    return sysMaps.containsKey(type)
-        || (sshMaps != null && sshMaps.containsKey(type))
-        || (httpMaps != null && httpMaps.containsKey(type));
-  }
-
-  public Module getSysModule() {
-    return sysModule;
-  }
-
-  public void setDbCfgInjector(Injector dbInjector, Injector cfgInjector) {
-    final Module db = copy(dbInjector);
-    final Module cm = copy(cfgInjector);
-    final Module sm = copy(sysInjector);
-    sysModule =
-        new AbstractModule() {
-          @Override
-          protected void configure() {
-            install(copyConfigModule);
-            install(db);
-            install(cm);
-            install(sm);
-          }
-        };
-  }
-
-  public void setSshInjector(Injector injector) {
-    sshModule = copy(injector);
-    sshGen = injector.getProvider(ModuleGenerator.class);
-    sshItems = dynamicItemsOf(injector);
-    sshSets = dynamicSetsOf(injector);
-    sshMaps = dynamicMapsOf(injector);
-    onStart.addAll(listeners(injector, StartPluginListener.class));
-    onStop.addAll(listeners(injector, StopPluginListener.class));
-    onReload.addAll(listeners(injector, ReloadPluginListener.class));
-  }
-
-  boolean hasSshModule() {
-    return sshModule != null;
-  }
-
-  Module getSshModule() {
-    return sshModule;
-  }
-
-  ModuleGenerator newSshModuleGenerator() {
-    return sshGen.get();
-  }
-
-  public void setHttpInjector(Injector injector) {
-    httpModule = copy(injector);
-    httpGen = injector.getProvider(ModuleGenerator.class);
-    httpItems = dynamicItemsOf(injector);
-    httpSets = httpDynamicSetsOf(injector);
-    httpMaps = dynamicMapsOf(injector);
-    onStart.addAll(listeners(injector, StartPluginListener.class));
-    onStop.addAll(listeners(injector, StopPluginListener.class));
-    onReload.addAll(listeners(injector, ReloadPluginListener.class));
-  }
-
-  private Map<TypeLiteral<?>, DynamicSet<?>> httpDynamicSetsOf(Injector i) {
-    // Copy binding of DynamicSet<WebUiPlugin> from sysInjector to HTTP.
-    // This supports older plugins that bound a plugin in the HttpModule.
-    TypeLiteral<WebUiPlugin> key = TypeLiteral.get(WebUiPlugin.class);
-    DynamicSet<?> web = sysSets.get(key);
-    checkNotNull(web, "DynamicSet<WebUiPlugin> exists in sysInjector");
-
-    Map<TypeLiteral<?>, DynamicSet<?>> m = new HashMap<>(dynamicSetsOf(i));
-    m.put(key, web);
-    return Collections.unmodifiableMap(m);
-  }
-
-  boolean hasHttpModule() {
-    return httpModule != null;
-  }
-
-  Module getHttpModule() {
-    return httpModule;
-  }
-
-  ModuleGenerator newHttpModuleGenerator() {
-    return httpGen.get();
-  }
-
-  public RequestContext enter(Plugin plugin) {
-    return local.setContext(new PluginRequestContext(plugin.getPluginUser()));
-  }
-
-  public void exit(RequestContext old) {
-    local.setContext(old);
-  }
-
-  public void onStartPlugin(Plugin plugin) {
-    RequestContext oldContext = enter(plugin);
-    try {
-      attachItem(sysItems, plugin.getSysInjector(), plugin);
-      attachItem(sshItems, plugin.getSshInjector(), plugin);
-      attachItem(httpItems, plugin.getHttpInjector(), plugin);
-
-      attachSet(sysSets, plugin.getSysInjector(), plugin);
-      attachSet(sshSets, plugin.getSshInjector(), plugin);
-      attachSet(httpSets, plugin.getHttpInjector(), plugin);
-
-      attachMap(sysMaps, plugin.getSysInjector(), plugin);
-      attachMap(sshMaps, plugin.getSshInjector(), plugin);
-      attachMap(httpMaps, plugin.getHttpInjector(), plugin);
-    } finally {
-      exit(oldContext);
-    }
-
-    for (StartPluginListener l : onStart) {
-      l.onStartPlugin(plugin);
-    }
-  }
-
-  public void onStopPlugin(Plugin plugin) {
-    for (StopPluginListener l : onStop) {
-      l.onStopPlugin(plugin);
-    }
-  }
-
-  private void attachItem(
-      Map<TypeLiteral<?>, DynamicItem<?>> items, @Nullable Injector src, Plugin plugin) {
-    for (RegistrationHandle h :
-        PrivateInternals_DynamicTypes.attachItems(src, items, plugin.getName())) {
-      plugin.add(h);
-    }
-  }
-
-  private void attachSet(
-      Map<TypeLiteral<?>, DynamicSet<?>> sets, @Nullable Injector src, Plugin plugin) {
-    for (RegistrationHandle h : PrivateInternals_DynamicTypes.attachSets(src, sets)) {
-      plugin.add(h);
-    }
-  }
-
-  private void attachMap(
-      Map<TypeLiteral<?>, DynamicMap<?>> maps, @Nullable Injector src, Plugin plugin) {
-    for (RegistrationHandle h :
-        PrivateInternals_DynamicTypes.attachMaps(src, plugin.getName(), maps)) {
-      plugin.add(h);
-    }
-  }
-
-  void onReloadPlugin(Plugin oldPlugin, Plugin newPlugin) {
-    // Index all old registrations by the raw type. These may be replaced
-    // during the reattach calls below. Any that are not replaced will be
-    // removed when the old plugin does its stop routine.
-    ListMultimap<TypeLiteral<?>, ReloadableRegistrationHandle<?>> old = LinkedListMultimap.create();
-    for (ReloadableRegistrationHandle<?> h : oldPlugin.getReloadableHandles()) {
-      old.put(h.getKey().getTypeLiteral(), h);
-    }
-
-    RequestContext oldContext = enter(newPlugin);
-    try {
-      reattachMap(old, sysMaps, newPlugin.getSysInjector(), newPlugin);
-      reattachMap(old, sshMaps, newPlugin.getSshInjector(), newPlugin);
-      reattachMap(old, httpMaps, newPlugin.getHttpInjector(), newPlugin);
-
-      reattachSet(old, sysSets, newPlugin.getSysInjector(), newPlugin);
-      reattachSet(old, sshSets, newPlugin.getSshInjector(), newPlugin);
-      reattachSet(old, httpSets, newPlugin.getHttpInjector(), newPlugin);
-
-      reattachItem(old, sysItems, newPlugin.getSysInjector(), newPlugin);
-      reattachItem(old, sshItems, newPlugin.getSshInjector(), newPlugin);
-      reattachItem(old, httpItems, newPlugin.getHttpInjector(), newPlugin);
-    } finally {
-      exit(oldContext);
-    }
-
-    for (ReloadPluginListener l : onReload) {
-      l.onReloadPlugin(oldPlugin, newPlugin);
-    }
-  }
-
-  private void reattachMap(
-      ListMultimap<TypeLiteral<?>, ReloadableRegistrationHandle<?>> oldHandles,
-      Map<TypeLiteral<?>, DynamicMap<?>> maps,
-      @Nullable Injector src,
-      Plugin newPlugin) {
-    if (src == null || maps == null || maps.isEmpty()) {
-      return;
-    }
-
-    for (Map.Entry<TypeLiteral<?>, DynamicMap<?>> e : maps.entrySet()) {
-      @SuppressWarnings("unchecked")
-      TypeLiteral<Object> type = (TypeLiteral<Object>) e.getKey();
-
-      @SuppressWarnings("unchecked")
-      PrivateInternals_DynamicMapImpl<Object> map =
-          (PrivateInternals_DynamicMapImpl<Object>) e.getValue();
-
-      Map<Annotation, ReloadableRegistrationHandle<?>> am = new HashMap<>();
-      for (ReloadableRegistrationHandle<?> h : oldHandles.get(type)) {
-        Annotation a = h.getKey().getAnnotation();
-        if (a != null && !UNIQUE_ANNOTATION.isInstance(a)) {
-          am.put(a, h);
-        }
-      }
-
-      for (Binding<?> binding : bindings(src, e.getKey())) {
-        @SuppressWarnings("unchecked")
-        Binding<Object> b = (Binding<Object>) binding;
-        Key<Object> key = b.getKey();
-        if (key.getAnnotation() == null) {
-          continue;
-        }
-
-        @SuppressWarnings("unchecked")
-        ReloadableRegistrationHandle<Object> h =
-            (ReloadableRegistrationHandle<Object>) am.remove(key.getAnnotation());
-        if (h != null) {
-          replace(newPlugin, h, b);
-          oldHandles.remove(type, h);
-        } else {
-          newPlugin.add(map.put(newPlugin.getName(), b.getKey(), b.getProvider()));
-        }
-      }
-    }
-  }
-
-  /** Type used to declare unique annotations. Guice hides this, so extract it. */
-  private static final Class<?> UNIQUE_ANNOTATION = UniqueAnnotations.create().annotationType();
-
-  private void reattachSet(
-      ListMultimap<TypeLiteral<?>, ReloadableRegistrationHandle<?>> oldHandles,
-      Map<TypeLiteral<?>, DynamicSet<?>> sets,
-      @Nullable Injector src,
-      Plugin newPlugin) {
-    if (src == null || sets == null || sets.isEmpty()) {
-      return;
-    }
-
-    for (Map.Entry<TypeLiteral<?>, DynamicSet<?>> e : sets.entrySet()) {
-      @SuppressWarnings("unchecked")
-      TypeLiteral<Object> type = (TypeLiteral<Object>) e.getKey();
-
-      @SuppressWarnings("unchecked")
-      DynamicSet<Object> set = (DynamicSet<Object>) e.getValue();
-
-      // Index all old handles that match this DynamicSet<T> keyed by
-      // annotations. Ignore the unique annotations, thereby favoring
-      // the @Named annotations or some other non-unique naming.
-      Map<Annotation, ReloadableRegistrationHandle<?>> am = new HashMap<>();
-      List<ReloadableRegistrationHandle<?>> old = oldHandles.get(type);
-      Iterator<ReloadableRegistrationHandle<?>> oi = old.iterator();
-      while (oi.hasNext()) {
-        ReloadableRegistrationHandle<?> h = oi.next();
-        Annotation a = h.getKey().getAnnotation();
-        if (a != null && !UNIQUE_ANNOTATION.isInstance(a)) {
-          am.put(a, h);
-          oi.remove();
-        }
-      }
-
-      // Replace old handles with new bindings, favoring cases where there
-      // is an exact match on an @Named annotation. If there is no match
-      // pick any handle and replace it. We generally expect only one
-      // handle of each DynamicSet type when using unique annotations, but
-      // possibly multiple ones if @Named was used. Plugin authors that want
-      // atomic replacement across reloads should use @Named annotations with
-      // stable names that do not change across plugin versions to ensure the
-      // handles are swapped correctly.
-      oi = old.iterator();
-      for (Binding<?> binding : bindings(src, type)) {
-        @SuppressWarnings("unchecked")
-        Binding<Object> b = (Binding<Object>) binding;
-        Key<Object> key = b.getKey();
-        if (key.getAnnotation() == null) {
-          continue;
-        }
-
-        @SuppressWarnings("unchecked")
-        ReloadableRegistrationHandle<Object> h1 =
-            (ReloadableRegistrationHandle<Object>) am.remove(key.getAnnotation());
-        if (h1 != null) {
-          replace(newPlugin, h1, b);
-        } else if (oi.hasNext()) {
-          @SuppressWarnings("unchecked")
-          ReloadableRegistrationHandle<Object> h2 =
-              (ReloadableRegistrationHandle<Object>) oi.next();
-          oi.remove();
-          replace(newPlugin, h2, b);
-        } else {
-          newPlugin.add(set.add(b.getKey(), b.getProvider()));
-        }
-      }
-    }
-  }
-
-  private void reattachItem(
-      ListMultimap<TypeLiteral<?>, ReloadableRegistrationHandle<?>> oldHandles,
-      Map<TypeLiteral<?>, DynamicItem<?>> items,
-      @Nullable Injector src,
-      Plugin newPlugin) {
-    if (src == null || items == null || items.isEmpty()) {
-      return;
-    }
-
-    for (Map.Entry<TypeLiteral<?>, DynamicItem<?>> e : items.entrySet()) {
-      @SuppressWarnings("unchecked")
-      TypeLiteral<Object> type = (TypeLiteral<Object>) e.getKey();
-
-      @SuppressWarnings("unchecked")
-      DynamicItem<Object> item = (DynamicItem<Object>) e.getValue();
-
-      Iterator<ReloadableRegistrationHandle<?>> oi = oldHandles.get(type).iterator();
-
-      for (Binding<?> binding : bindings(src, type)) {
-        @SuppressWarnings("unchecked")
-        Binding<Object> b = (Binding<Object>) binding;
-        if (oi.hasNext()) {
-          @SuppressWarnings("unchecked")
-          ReloadableRegistrationHandle<Object> h = (ReloadableRegistrationHandle<Object>) oi.next();
-          oi.remove();
-          replace(newPlugin, h, b);
-        } else {
-          newPlugin.add(item.set(b.getKey(), b.getProvider(), newPlugin.getName()));
-        }
-      }
-    }
-  }
-
-  private static <T> void replace(
-      Plugin newPlugin, ReloadableRegistrationHandle<T> h, Binding<T> b) {
-    RegistrationHandle n = h.replace(b.getKey(), b.getProvider());
-    if (n != null) {
-      newPlugin.add(n);
-    }
-  }
-
-  static <T> List<T> listeners(Injector src, Class<T> type) {
-    List<Binding<T>> bindings = bindings(src, TypeLiteral.get(type));
-    int cnt = bindings != null ? bindings.size() : 0;
-    List<T> found = Lists.newArrayListWithCapacity(cnt);
-    if (bindings != null) {
-      for (Binding<T> b : bindings) {
-        found.add(b.getProvider().get());
-      }
-    }
-    return found;
-  }
-
-  private static <T> List<Binding<T>> bindings(Injector src, TypeLiteral<T> type) {
-    return src.findBindingsByType(type);
-  }
-
-  private Module copy(Injector src) {
-    Set<TypeLiteral<?>> dynamicTypes = new HashSet<>();
-    Set<TypeLiteral<?>> dynamicItemTypes = new HashSet<>();
-    for (Map.Entry<Key<?>, Binding<?>> e : src.getBindings().entrySet()) {
-      TypeLiteral<?> type = e.getKey().getTypeLiteral();
-      if (type.getRawType() == DynamicItem.class) {
-        ParameterizedType t = (ParameterizedType) type.getType();
-        dynamicItemTypes.add(TypeLiteral.get(t.getActualTypeArguments()[0]));
-      } else if (type.getRawType() == DynamicSet.class || type.getRawType() == DynamicMap.class) {
-        ParameterizedType t = (ParameterizedType) type.getType();
-        dynamicTypes.add(TypeLiteral.get(t.getActualTypeArguments()[0]));
-      }
-    }
-
-    final Map<Key<?>, Binding<?>> bindings = new LinkedHashMap<>();
-    for (Map.Entry<Key<?>, Binding<?>> e : src.getBindings().entrySet()) {
-      if (dynamicTypes.contains(e.getKey().getTypeLiteral())
-          && e.getKey().getAnnotation() != null) {
-        // A type used in DynamicSet or DynamicMap that has an annotation
-        // must be picked up by the set/map itself. A type used in either
-        // but without an annotation may be magic glue implementing F and
-        // using DynamicSet<F> or DynamicMap<F> internally. That should be
-        // exported to plugins.
-        continue;
-      } else if (dynamicItemTypes.contains(e.getKey().getTypeLiteral())) {
-        continue;
-      } else if (shouldCopy(e.getKey())) {
-        bindings.put(e.getKey(), e.getValue());
-      }
-    }
-    bindings.remove(Key.get(Injector.class));
-    bindings.remove(Key.get(java.util.logging.Logger.class));
-
-    @Nullable
-    final Binding<HttpServletRequest> requestBinding =
-        src.getExistingBinding(Key.get(HttpServletRequest.class));
-
-    @Nullable
-    final Binding<HttpServletResponse> responseBinding =
-        src.getExistingBinding(Key.get(HttpServletResponse.class));
-
-    return new AbstractModule() {
-      @SuppressWarnings("unchecked")
-      @Override
-      protected void configure() {
-        for (Map.Entry<Key<?>, Binding<?>> e : bindings.entrySet()) {
-          Key<Object> k = (Key<Object>) e.getKey();
-          Binding<Object> b = (Binding<Object>) e.getValue();
-          bind(k).toProvider(b.getProvider());
-        }
-
-        if (requestBinding != null) {
-          bind(HttpServletRequest.class)
-              .annotatedWith(RootRelative.class)
-              .toProvider(requestBinding.getProvider());
-        }
-        if (responseBinding != null) {
-          bind(HttpServletResponse.class)
-              .annotatedWith(RootRelative.class)
-              .toProvider(responseBinding.getProvider());
-        }
-      }
-    };
-  }
-
-  private boolean shouldCopy(Key<?> key) {
-    if (copyConfigKeys.contains(key)) {
-      return false;
-    }
-    Class<?> type = key.getTypeLiteral().getRawType();
-    if (LifecycleListener.class.isAssignableFrom(type)
-        // This is needed for secondary index to work from plugin listeners
-        && !IndexCollection.class.isAssignableFrom(type)) {
-      return false;
-    }
-    if (StartPluginListener.class.isAssignableFrom(type)) {
-      return false;
-    }
-    if (StopPluginListener.class.isAssignableFrom(type)) {
-      return false;
-    }
-    if (MetricMaker.class.isAssignableFrom(type)) {
-      return false;
-    }
-
-    if (type.getName().startsWith("com.google.inject.")) {
-      return false;
-    }
-
-    if (is("org.apache.sshd.server.Command", type)) {
-      return false;
-    }
-
-    if (is("javax.servlet.Filter", type)) {
-      return false;
-    }
-    if (is("javax.servlet.ServletContext", type)) {
-      return false;
-    }
-    if (is("javax.servlet.ServletRequest", type)) {
-      return false;
-    }
-    if (is("javax.servlet.ServletResponse", type)) {
-      return false;
-    }
-    if (is("javax.servlet.http.HttpServlet", type)) {
-      return false;
-    }
-    if (is("javax.servlet.http.HttpServletRequest", type)) {
-      return false;
-    }
-    if (is("javax.servlet.http.HttpServletResponse", type)) {
-      return false;
-    }
-    if (is("javax.servlet.http.HttpSession", type)) {
-      return false;
-    }
-    if (Map.class.isAssignableFrom(type)
-        && key.getAnnotationType() != null
-        && "com.google.inject.servlet.RequestParameters"
-            .equals(key.getAnnotationType().getName())) {
-      return false;
-    }
-    if (type.getName().startsWith("com.google.gerrit.httpd.GitOverHttpServlet$")) {
-      return false;
-    }
-    return true;
-  }
-
-  static boolean is(String name, Class<?> type) {
-    while (type != null) {
-      if (name.equals(type.getName())) {
-        return true;
-      }
-
-      Class<?>[] interfaces = type.getInterfaces();
-      if (interfaces != null) {
-        for (Class<?> i : interfaces) {
-          if (is(name, i)) {
-            return true;
-          }
-        }
-      }
-
-      type = type.getSuperclass();
-    }
-    return false;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginLoader.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginLoader.java
deleted file mode 100644
index d366dbf..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginLoader.java
+++ /dev/null
@@ -1,720 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.plugins;
-
-import com.google.common.base.CharMatcher;
-import com.google.common.base.Joiner;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Strings;
-import com.google.common.collect.ComparisonChain;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.LinkedHashMultimap;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.SetMultimap;
-import com.google.common.collect.Sets;
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.gerrit.extensions.systemstatus.ServerInformation;
-import com.google.gerrit.server.PluginUser;
-import com.google.gerrit.server.cache.PersistentCacheFactory;
-import com.google.gerrit.server.config.CanonicalWebUrl;
-import com.google.gerrit.server.config.ConfigUtil;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.plugins.ServerPluginProvider.PluginDescription;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.DirectoryStream;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.AbstractMap;
-import java.util.ArrayDeque;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Queue;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.TimeUnit;
-import org.eclipse.jgit.internal.storage.file.FileSnapshot;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class PluginLoader implements LifecycleListener {
-  private static final Logger log = LoggerFactory.getLogger(PluginLoader.class);
-
-  public String getPluginName(Path srcPath) {
-    return MoreObjects.firstNonNull(getGerritPluginName(srcPath), PluginUtil.nameOf(srcPath));
-  }
-
-  private final Path pluginsDir;
-  private final Path dataDir;
-  private final Path tempDir;
-  private final PluginGuiceEnvironment env;
-  private final ServerInformationImpl srvInfoImpl;
-  private final PluginUser.Factory pluginUserFactory;
-  private final ConcurrentMap<String, Plugin> running;
-  private final ConcurrentMap<String, Plugin> disabled;
-  private final Map<String, FileSnapshot> broken;
-  private final Map<Plugin, CleanupHandle> cleanupHandles;
-  private final Queue<Plugin> toCleanup;
-  private final Provider<PluginCleanerTask> cleaner;
-  private final PluginScannerThread scanner;
-  private final Provider<String> urlProvider;
-  private final PersistentCacheFactory persistentCacheFactory;
-  private final boolean remoteAdmin;
-  private final UniversalServerPluginProvider serverPluginFactory;
-
-  @Inject
-  public PluginLoader(
-      SitePaths sitePaths,
-      PluginGuiceEnvironment pe,
-      ServerInformationImpl sii,
-      PluginUser.Factory puf,
-      Provider<PluginCleanerTask> pct,
-      @GerritServerConfig Config cfg,
-      @CanonicalWebUrl Provider<String> provider,
-      PersistentCacheFactory cacheFactory,
-      UniversalServerPluginProvider pluginFactory) {
-    pluginsDir = sitePaths.plugins_dir;
-    dataDir = sitePaths.data_dir;
-    tempDir = sitePaths.tmp_dir;
-    env = pe;
-    srvInfoImpl = sii;
-    pluginUserFactory = puf;
-    running = Maps.newConcurrentMap();
-    disabled = Maps.newConcurrentMap();
-    broken = new HashMap<>();
-    toCleanup = new ArrayDeque<>();
-    cleanupHandles = Maps.newConcurrentMap();
-    cleaner = pct;
-    urlProvider = provider;
-    persistentCacheFactory = cacheFactory;
-    serverPluginFactory = pluginFactory;
-
-    remoteAdmin = cfg.getBoolean("plugins", null, "allowRemoteAdmin", false);
-
-    long checkFrequency =
-        ConfigUtil.getTimeUnit(
-            cfg,
-            "plugins",
-            null,
-            "checkFrequency",
-            TimeUnit.MINUTES.toMillis(1),
-            TimeUnit.MILLISECONDS);
-    if (checkFrequency > 0) {
-      scanner = new PluginScannerThread(this, checkFrequency);
-    } else {
-      scanner = null;
-    }
-  }
-
-  public boolean isRemoteAdminEnabled() {
-    return remoteAdmin;
-  }
-
-  public Plugin get(String name) {
-    Plugin p = running.get(name);
-    if (p != null) {
-      return p;
-    }
-    return disabled.get(name);
-  }
-
-  public Iterable<Plugin> getPlugins(boolean all) {
-    if (!all) {
-      return running.values();
-    }
-    List<Plugin> plugins = new ArrayList<>(running.values());
-    plugins.addAll(disabled.values());
-    return plugins;
-  }
-
-  public String installPluginFromStream(String originalName, InputStream in)
-      throws IOException, PluginInstallException {
-    checkRemoteInstall();
-
-    String fileName = originalName;
-    Path tmp = PluginUtil.asTemp(in, ".next_" + fileName + "_", ".tmp", pluginsDir);
-    String name = MoreObjects.firstNonNull(getGerritPluginName(tmp), PluginUtil.nameOf(fileName));
-    if (!originalName.equals(name)) {
-      log.warn(
-          "Plugin provides its own name: <{}>, use it instead of the input name: <{}>",
-          name,
-          originalName);
-    }
-
-    String fileExtension = getExtension(fileName);
-    Path dst = pluginsDir.resolve(name + fileExtension);
-    synchronized (this) {
-      Plugin active = running.get(name);
-      if (active != null) {
-        fileName = active.getSrcFile().getFileName().toString();
-        log.info("Replacing plugin {}", active.getName());
-        Path old = pluginsDir.resolve(".last_" + fileName);
-        Files.deleteIfExists(old);
-        Files.move(active.getSrcFile(), old);
-      }
-
-      Files.deleteIfExists(pluginsDir.resolve(fileName + ".disabled"));
-      Files.move(tmp, dst);
-      try {
-        Plugin plugin = runPlugin(name, dst, active);
-        if (active == null) {
-          log.info("Installed plugin {}", plugin.getName());
-        }
-      } catch (PluginInstallException e) {
-        Files.deleteIfExists(dst);
-        throw e;
-      }
-
-      cleanInBackground();
-    }
-
-    return name;
-  }
-
-  private synchronized void unloadPlugin(Plugin plugin) {
-    persistentCacheFactory.onStop(plugin);
-    String name = plugin.getName();
-    log.info("Unloading plugin {}, version {}", name, plugin.getVersion());
-    plugin.stop(env);
-    env.onStopPlugin(plugin);
-    running.remove(name);
-    disabled.remove(name);
-    toCleanup.add(plugin);
-  }
-
-  public void disablePlugins(Set<String> names) {
-    if (!isRemoteAdminEnabled()) {
-      log.warn("Remote plugin administration is disabled, ignoring disablePlugins({})", names);
-      return;
-    }
-
-    synchronized (this) {
-      for (String name : names) {
-        Plugin active = running.get(name);
-        if (active == null) {
-          continue;
-        }
-
-        log.info("Disabling plugin {}", active.getName());
-        Path off =
-            active.getSrcFile().resolveSibling(active.getSrcFile().getFileName() + ".disabled");
-        try {
-          Files.move(active.getSrcFile(), off);
-        } catch (IOException e) {
-          log.error("Failed to disable plugin", e);
-          // In theory we could still unload the plugin even if the rename
-          // failed. However, it would be reloaded on the next server startup,
-          // which is probably not what the user expects.
-          continue;
-        }
-
-        unloadPlugin(active);
-        try {
-          FileSnapshot snapshot = FileSnapshot.save(off.toFile());
-          Plugin offPlugin = loadPlugin(name, off, snapshot);
-          disabled.put(name, offPlugin);
-        } catch (Throwable e) {
-          // This shouldn't happen, as the plugin was loaded earlier.
-          log.warn("Cannot load disabled plugin {}", active.getName(), e.getCause());
-        }
-      }
-      cleanInBackground();
-    }
-  }
-
-  public void enablePlugins(Set<String> names) throws PluginInstallException {
-    if (!isRemoteAdminEnabled()) {
-      log.warn("Remote plugin administration is disabled, ignoring enablePlugins({})", names);
-      return;
-    }
-
-    synchronized (this) {
-      for (String name : names) {
-        Plugin off = disabled.get(name);
-        if (off == null) {
-          continue;
-        }
-
-        log.info("Enabling plugin {}", name);
-        String n = off.getSrcFile().toFile().getName();
-        if (n.endsWith(".disabled")) {
-          n = n.substring(0, n.lastIndexOf('.'));
-        }
-        Path on = pluginsDir.resolve(n);
-        try {
-          Files.move(off.getSrcFile(), on);
-        } catch (IOException e) {
-          log.error("Failed to move plugin {} into place", name, e);
-          continue;
-        }
-        disabled.remove(name);
-        runPlugin(name, on, null);
-      }
-      cleanInBackground();
-    }
-  }
-
-  private void removeStalePluginFiles() {
-    DirectoryStream.Filter<Path> filter =
-        new DirectoryStream.Filter<Path>() {
-          @Override
-          public boolean accept(Path entry) throws IOException {
-            return entry.getFileName().toString().startsWith("plugin_");
-          }
-        };
-    try (DirectoryStream<Path> files = Files.newDirectoryStream(tempDir, filter)) {
-      for (Path file : files) {
-        log.info("Removing stale plugin file: {}", file.toFile().getName());
-        try {
-          Files.delete(file);
-        } catch (IOException e) {
-          log.error(
-              "Failed to remove stale plugin file {}: {}", file.toFile().getName(), e.getMessage());
-        }
-      }
-    } catch (IOException e) {
-      log.warn("Unable to discover stale plugin files: {}", e.getMessage());
-    }
-  }
-
-  @Override
-  public synchronized void start() {
-    removeStalePluginFiles();
-    Path absolutePath = pluginsDir.toAbsolutePath();
-    if (!Files.exists(absolutePath)) {
-      log.info("{} does not exist; creating", absolutePath);
-      try {
-        Files.createDirectories(absolutePath);
-      } catch (IOException e) {
-        log.error("Failed to create {}: {}", absolutePath, e.getMessage());
-      }
-    }
-    log.info("Loading plugins from {}", absolutePath);
-    srvInfoImpl.state = ServerInformation.State.STARTUP;
-    rescan();
-    srvInfoImpl.state = ServerInformation.State.RUNNING;
-    if (scanner != null) {
-      scanner.start();
-    }
-  }
-
-  @Override
-  public void stop() {
-    if (scanner != null) {
-      scanner.end();
-    }
-    srvInfoImpl.state = ServerInformation.State.SHUTDOWN;
-    synchronized (this) {
-      for (Plugin p : running.values()) {
-        unloadPlugin(p);
-      }
-      running.clear();
-      disabled.clear();
-      broken.clear();
-      if (!toCleanup.isEmpty()) {
-        System.gc();
-        processPendingCleanups();
-      }
-    }
-  }
-
-  public void reload(List<String> names) throws InvalidPluginException, PluginInstallException {
-    synchronized (this) {
-      List<Plugin> reload = Lists.newArrayListWithCapacity(names.size());
-      List<String> bad = Lists.newArrayListWithExpectedSize(4);
-      for (String name : names) {
-        Plugin active = running.get(name);
-        if (active != null) {
-          reload.add(active);
-        } else {
-          bad.add(name);
-        }
-      }
-      if (!bad.isEmpty()) {
-        throw new InvalidPluginException(
-            String.format("Plugin(s) \"%s\" not running", Joiner.on("\", \"").join(bad)));
-      }
-
-      for (Plugin active : reload) {
-        String name = active.getName();
-        try {
-          log.info("Reloading plugin {}", name);
-          Plugin newPlugin = runPlugin(name, active.getSrcFile(), active);
-          log.info("Reloaded plugin {}, version {}", newPlugin.getName(), newPlugin.getVersion());
-        } catch (PluginInstallException e) {
-          log.warn("Cannot reload plugin {}", name, e.getCause());
-          throw e;
-        }
-      }
-
-      cleanInBackground();
-    }
-  }
-
-  public synchronized void rescan() {
-    SetMultimap<String, Path> pluginsFiles = prunePlugins(pluginsDir);
-    if (pluginsFiles.isEmpty()) {
-      return;
-    }
-
-    syncDisabledPlugins(pluginsFiles);
-
-    Map<String, Path> activePlugins = filterDisabled(pluginsFiles);
-    for (Map.Entry<String, Path> entry : jarsFirstSortedPluginsSet(activePlugins)) {
-      String name = entry.getKey();
-      Path path = entry.getValue();
-      String fileName = path.getFileName().toString();
-      if (!isUiPlugin(fileName) && !serverPluginFactory.handles(path)) {
-        log.warn("No Plugin provider was found that handles this file format: {}", fileName);
-        continue;
-      }
-
-      FileSnapshot brokenTime = broken.get(name);
-      if (brokenTime != null && !brokenTime.isModified(path.toFile())) {
-        continue;
-      }
-
-      Plugin active = running.get(name);
-      if (active != null && !active.isModified(path)) {
-        continue;
-      }
-
-      if (active != null) {
-        log.info("Reloading plugin {}", active.getName());
-      }
-
-      try {
-        Plugin loadedPlugin = runPlugin(name, path, active);
-        if (!loadedPlugin.isDisabled()) {
-          log.info(
-              "{} plugin {}, version {}",
-              active == null ? "Loaded" : "Reloaded",
-              loadedPlugin.getName(),
-              loadedPlugin.getVersion());
-        }
-      } catch (PluginInstallException e) {
-        log.warn("Cannot load plugin {}", name, e.getCause());
-      }
-    }
-
-    cleanInBackground();
-  }
-
-  private void addAllEntries(Map<String, Path> from, TreeSet<Entry<String, Path>> to) {
-    Iterator<Entry<String, Path>> it = from.entrySet().iterator();
-    while (it.hasNext()) {
-      Entry<String, Path> entry = it.next();
-      to.add(new AbstractMap.SimpleImmutableEntry<>(entry.getKey(), entry.getValue()));
-    }
-  }
-
-  private TreeSet<Entry<String, Path>> jarsFirstSortedPluginsSet(Map<String, Path> activePlugins) {
-    TreeSet<Entry<String, Path>> sortedPlugins =
-        Sets.newTreeSet(
-            new Comparator<Entry<String, Path>>() {
-              @Override
-              public int compare(Entry<String, Path> e1, Entry<String, Path> e2) {
-                Path n1 = e1.getValue().getFileName();
-                Path n2 = e2.getValue().getFileName();
-                return ComparisonChain.start()
-                    .compareTrueFirst(isJar(n1), isJar(n2))
-                    .compare(n1, n2)
-                    .result();
-              }
-
-              private boolean isJar(Path n1) {
-                return n1.toString().endsWith(".jar");
-              }
-            });
-
-    addAllEntries(activePlugins, sortedPlugins);
-    return sortedPlugins;
-  }
-
-  private void syncDisabledPlugins(SetMultimap<String, Path> jars) {
-    stopRemovedPlugins(jars);
-    dropRemovedDisabledPlugins(jars);
-  }
-
-  private Plugin runPlugin(String name, Path plugin, Plugin oldPlugin)
-      throws PluginInstallException {
-    FileSnapshot snapshot = FileSnapshot.save(plugin.toFile());
-    try {
-      Plugin newPlugin = loadPlugin(name, plugin, snapshot);
-      if (newPlugin.getCleanupHandle() != null) {
-        cleanupHandles.put(newPlugin, newPlugin.getCleanupHandle());
-      }
-      /*
-       * Pluggable plugin provider may have assigned a plugin name that could be
-       * actually different from the initial one assigned during scan. It is
-       * safer then to reassign it.
-       */
-      name = newPlugin.getName();
-      boolean reload = oldPlugin != null && oldPlugin.canReload() && newPlugin.canReload();
-      if (!reload && oldPlugin != null) {
-        unloadPlugin(oldPlugin);
-      }
-      if (!newPlugin.isDisabled()) {
-        newPlugin.start(env);
-      }
-      if (reload) {
-        env.onReloadPlugin(oldPlugin, newPlugin);
-        unloadPlugin(oldPlugin);
-      } else if (!newPlugin.isDisabled()) {
-        env.onStartPlugin(newPlugin);
-      }
-      if (!newPlugin.isDisabled()) {
-        running.put(name, newPlugin);
-      } else {
-        disabled.put(name, newPlugin);
-      }
-      broken.remove(name);
-      return newPlugin;
-    } catch (Throwable err) {
-      broken.put(name, snapshot);
-      throw new PluginInstallException(err);
-    }
-  }
-
-  private void stopRemovedPlugins(SetMultimap<String, Path> jars) {
-    Set<String> unload = Sets.newHashSet(running.keySet());
-    for (Map.Entry<String, Collection<Path>> entry : jars.asMap().entrySet()) {
-      for (Path path : entry.getValue()) {
-        if (!path.getFileName().toString().endsWith(".disabled")) {
-          unload.remove(entry.getKey());
-        }
-      }
-    }
-    for (String name : unload) {
-      unloadPlugin(running.get(name));
-    }
-  }
-
-  private void dropRemovedDisabledPlugins(SetMultimap<String, Path> jars) {
-    Set<String> unload = Sets.newHashSet(disabled.keySet());
-    for (Map.Entry<String, Collection<Path>> entry : jars.asMap().entrySet()) {
-      for (Path path : entry.getValue()) {
-        if (path.getFileName().toString().endsWith(".disabled")) {
-          unload.remove(entry.getKey());
-        }
-      }
-    }
-    for (String name : unload) {
-      disabled.remove(name);
-    }
-  }
-
-  synchronized int processPendingCleanups() {
-    Iterator<Plugin> iterator = toCleanup.iterator();
-    while (iterator.hasNext()) {
-      Plugin plugin = iterator.next();
-      iterator.remove();
-
-      CleanupHandle cleanupHandle = cleanupHandles.remove(plugin);
-      if (cleanupHandle != null) {
-        cleanupHandle.cleanup();
-      }
-    }
-    return toCleanup.size();
-  }
-
-  private void cleanInBackground() {
-    int cnt = toCleanup.size();
-    if (0 < cnt) {
-      cleaner.get().clean(cnt);
-    }
-  }
-
-  private String getExtension(String name) {
-    int ext = name.lastIndexOf('.');
-    return 0 < ext ? name.substring(ext) : "";
-  }
-
-  private Plugin loadPlugin(String name, Path srcPlugin, FileSnapshot snapshot)
-      throws InvalidPluginException {
-    String pluginName = srcPlugin.getFileName().toString();
-    if (isUiPlugin(pluginName)) {
-      return loadJsPlugin(name, srcPlugin, snapshot);
-    } else if (serverPluginFactory.handles(srcPlugin)) {
-      return loadServerPlugin(srcPlugin, snapshot);
-    } else {
-      throw new InvalidPluginException(
-          String.format("Unsupported plugin type: %s", srcPlugin.getFileName()));
-    }
-  }
-
-  private Path getPluginDataDir(String name) {
-    return dataDir.resolve(name);
-  }
-
-  private String getPluginCanonicalWebUrl(String name) {
-    String canonicalWebUrl = urlProvider.get();
-    if (Strings.isNullOrEmpty(canonicalWebUrl)) {
-      return "/plugins/" + name;
-    }
-
-    String url =
-        String.format(
-            "%s/plugins/%s/", CharMatcher.is('/').trimTrailingFrom(canonicalWebUrl), name);
-    return url;
-  }
-
-  private Plugin loadJsPlugin(String name, Path srcJar, FileSnapshot snapshot) {
-    return new JsPlugin(name, srcJar, pluginUserFactory.create(name), snapshot);
-  }
-
-  private ServerPlugin loadServerPlugin(Path scriptFile, FileSnapshot snapshot)
-      throws InvalidPluginException {
-    String name = serverPluginFactory.getPluginName(scriptFile);
-    return serverPluginFactory.get(
-        scriptFile,
-        snapshot,
-        new PluginDescription(
-            pluginUserFactory.create(name),
-            getPluginCanonicalWebUrl(name),
-            getPluginDataDir(name)));
-  }
-
-  // Only one active plugin per plugin name can exist for each plugin name.
-  // Filter out disabled plugins and transform the multimap to a map
-  private Map<String, Path> filterDisabled(SetMultimap<String, Path> pluginPaths) {
-    Map<String, Path> activePlugins = Maps.newHashMapWithExpectedSize(pluginPaths.keys().size());
-    for (String name : pluginPaths.keys()) {
-      for (Path pluginPath : pluginPaths.asMap().get(name)) {
-        if (!pluginPath.getFileName().toString().endsWith(".disabled")) {
-          assert !activePlugins.containsKey(name);
-          activePlugins.put(name, pluginPath);
-        }
-      }
-    }
-    return activePlugins;
-  }
-
-  // Scan the $site_path/plugins directory and fetch all files and directories.
-  // The Key in returned multimap is the plugin name initially assigned from its filename.
-  // Values are the files. Plugins can optionally provide their name in MANIFEST file.
-  // If multiple plugin files provide the same plugin name, then only
-  // the first plugin remains active and all other plugins with the same
-  // name are disabled.
-  //
-  // NOTE: Bear in mind that the plugin name can be reassigned after load by the
-  //       Server plugin provider.
-  public SetMultimap<String, Path> prunePlugins(Path pluginsDir) {
-    List<Path> pluginPaths = scanPathsInPluginsDirectory(pluginsDir);
-    SetMultimap<String, Path> map;
-    map = asMultimap(pluginPaths);
-    for (String plugin : map.keySet()) {
-      Collection<Path> files = map.asMap().get(plugin);
-      if (files.size() == 1) {
-        continue;
-      }
-      // retrieve enabled plugins
-      Iterable<Path> enabled = filterDisabledPlugins(files);
-      // If we have only one (the winner) plugin, nothing to do
-      if (!Iterables.skip(enabled, 1).iterator().hasNext()) {
-        continue;
-      }
-      Path winner = Iterables.getFirst(enabled, null);
-      assert winner != null;
-      // Disable all loser plugins by renaming their file names to
-      // "file.disabled" and replace the disabled files in the multimap.
-      Collection<Path> elementsToRemove = new ArrayList<>();
-      Collection<Path> elementsToAdd = new ArrayList<>();
-      for (Path loser : Iterables.skip(enabled, 1)) {
-        log.warn(
-            "Plugin <{}> was disabled, because"
-                + " another plugin <{}>"
-                + " with the same name <{}> already exists",
-            loser,
-            winner,
-            plugin);
-        Path disabledPlugin = Paths.get(loser + ".disabled");
-        elementsToAdd.add(disabledPlugin);
-        elementsToRemove.add(loser);
-        try {
-          Files.move(loser, disabledPlugin);
-        } catch (IOException e) {
-          log.warn("Failed to fully disable plugin {}", loser, e);
-        }
-      }
-      Iterables.removeAll(files, elementsToRemove);
-      Iterables.addAll(files, elementsToAdd);
-    }
-    return map;
-  }
-
-  private List<Path> scanPathsInPluginsDirectory(Path pluginsDir) {
-    try {
-      return PluginUtil.listPlugins(pluginsDir);
-    } catch (IOException e) {
-      log.error("Cannot list {}", pluginsDir.toAbsolutePath(), e);
-      return ImmutableList.of();
-    }
-  }
-
-  private Iterable<Path> filterDisabledPlugins(Collection<Path> paths) {
-    return Iterables.filter(paths, p -> !p.getFileName().toString().endsWith(".disabled"));
-  }
-
-  public String getGerritPluginName(Path srcPath) {
-    String fileName = srcPath.getFileName().toString();
-    if (isUiPlugin(fileName)) {
-      return fileName.substring(0, fileName.lastIndexOf('.'));
-    }
-    if (serverPluginFactory.handles(srcPath)) {
-      return serverPluginFactory.getPluginName(srcPath);
-    }
-    return null;
-  }
-
-  private SetMultimap<String, Path> asMultimap(List<Path> plugins) {
-    SetMultimap<String, Path> map = LinkedHashMultimap.create();
-    for (Path srcPath : plugins) {
-      map.put(getPluginName(srcPath), srcPath);
-    }
-    return map;
-  }
-
-  private boolean isUiPlugin(String name) {
-    return isPlugin(name, "js") || isPlugin(name, "html");
-  }
-
-  private boolean isPlugin(String fileName, String ext) {
-    String fullExt = "." + ext;
-    return fileName.endsWith(fullExt) || fileName.endsWith(fullExt + ".disabled");
-  }
-
-  private void checkRemoteInstall() throws PluginInstallException {
-    if (!isRemoteAdminEnabled()) {
-      throw new PluginInstallException("remote installation is disabled");
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginModule.java
deleted file mode 100644
index db18470..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginModule.java
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.plugins;
-
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.systemstatus.ServerInformation;
-import com.google.gerrit.lifecycle.LifecycleModule;
-
-public class PluginModule extends LifecycleModule {
-  @Override
-  protected void configure() {
-    bind(ServerInformationImpl.class);
-    bind(ServerInformation.class).to(ServerInformationImpl.class);
-
-    bind(PluginCleanerTask.class);
-    bind(PluginGuiceEnvironment.class);
-    bind(PluginLoader.class);
-    bind(CopyConfigModule.class);
-    listener().to(PluginLoader.class);
-
-    DynamicSet.setOf(binder(), ServerPluginProvider.class);
-    DynamicSet.bind(binder(), ServerPluginProvider.class).to(JarPluginProvider.class);
-    bind(UniversalServerPluginProvider.class);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginRestApiModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginRestApiModule.java
deleted file mode 100644
index 5f97134..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginRestApiModule.java
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.plugins;
-
-import static com.google.gerrit.server.plugins.PluginResource.PLUGIN_KIND;
-
-import com.google.gerrit.extensions.api.plugins.Plugins;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.RestApiModule;
-import com.google.gerrit.server.api.plugins.PluginApiImpl;
-import com.google.gerrit.server.api.plugins.PluginsImpl;
-
-public class PluginRestApiModule extends RestApiModule {
-  @Override
-  protected void configure() {
-    bind(PluginsCollection.class);
-    DynamicMap.mapOf(binder(), PLUGIN_KIND);
-    put(PLUGIN_KIND).to(InstallPlugin.Overwrite.class);
-    delete(PLUGIN_KIND).to(DisablePlugin.class);
-    get(PLUGIN_KIND, "status").to(GetStatus.class);
-    post(PLUGIN_KIND, "disable").to(DisablePlugin.class);
-    post(PLUGIN_KIND, "enable").to(EnablePlugin.class);
-    post(PLUGIN_KIND, "reload").to(ReloadPlugin.class);
-    bind(Plugins.class).to(PluginsImpl.class);
-    factory(PluginApiImpl.Factory.class);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginsCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginsCollection.java
deleted file mode 100644
index 768aa86..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginsCollection.java
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.plugins;
-
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AcceptsCreate;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestCollection;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-
-@Singleton
-public class PluginsCollection
-    implements RestCollection<TopLevelResource, PluginResource>, AcceptsCreate<TopLevelResource> {
-
-  private final DynamicMap<RestView<PluginResource>> views;
-  private final PluginLoader loader;
-  private final Provider<ListPlugins> list;
-  private final Provider<InstallPlugin> install;
-
-  @Inject
-  PluginsCollection(
-      DynamicMap<RestView<PluginResource>> views,
-      PluginLoader loader,
-      Provider<ListPlugins> list,
-      Provider<InstallPlugin> install) {
-    this.views = views;
-    this.loader = loader;
-    this.list = list;
-    this.install = install;
-  }
-
-  @Override
-  public RestView<TopLevelResource> list() throws ResourceNotFoundException {
-    return list.get();
-  }
-
-  @Override
-  public PluginResource parse(TopLevelResource parent, IdString id)
-      throws ResourceNotFoundException {
-    return parse(id.get());
-  }
-
-  public PluginResource parse(String id) throws ResourceNotFoundException {
-    Plugin p = loader.get(id);
-    if (p == null) {
-      throw new ResourceNotFoundException(id);
-    }
-    return new PluginResource(p);
-  }
-
-  @Override
-  public InstallPlugin create(TopLevelResource parent, IdString id)
-      throws ResourceNotFoundException, MethodNotAllowedException {
-    if (!loader.isRemoteAdminEnabled()) {
-      throw new MethodNotAllowedException("remote installation is disabled");
-    }
-    return install.get().setName(id.get()).setCreated(true);
-  }
-
-  @Override
-  public DynamicMap<RestView<PluginResource>> views() {
-    return views;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ReloadPlugin.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ReloadPlugin.java
deleted file mode 100644
index 7b464bb..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ReloadPlugin.java
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.plugins;
-
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
-import com.google.gerrit.extensions.common.PluginInfo;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.server.plugins.ReloadPlugin.Input;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-
-@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
-@Singleton
-public class ReloadPlugin implements RestModifyView<PluginResource, Input> {
-  public static class Input {}
-
-  private final PluginLoader loader;
-
-  @Inject
-  ReloadPlugin(PluginLoader loader) {
-    this.loader = loader;
-  }
-
-  @Override
-  public PluginInfo apply(PluginResource resource, Input input) throws ResourceConflictException {
-    String name = resource.getName();
-    try {
-      loader.reload(ImmutableList.of(name));
-    } catch (InvalidPluginException e) {
-      throw new ResourceConflictException(e.getMessage());
-    } catch (PluginInstallException e) {
-      StringWriter buf = new StringWriter();
-      buf.write(String.format("cannot reload %s\n", name));
-      PrintWriter pw = new PrintWriter(buf);
-      e.printStackTrace(pw);
-      pw.flush();
-      throw new ResourceConflictException(buf.toString());
-    }
-    return ListPlugins.toPluginInfo(loader.get(name));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPlugin.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPlugin.java
deleted file mode 100644
index 232a3ee..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPlugin.java
+++ /dev/null
@@ -1,311 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.plugins;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.Lists;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.registration.RegistrationHandle;
-import com.google.gerrit.extensions.registration.ReloadableRegistrationHandle;
-import com.google.gerrit.lifecycle.LifecycleManager;
-import com.google.gerrit.server.PluginUser;
-import com.google.gerrit.server.util.RequestContext;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import com.google.inject.Module;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.jar.Attributes;
-import java.util.jar.Manifest;
-import org.eclipse.jgit.internal.storage.file.FileSnapshot;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ServerPlugin extends Plugin {
-  private static final Logger log = LoggerFactory.getLogger(ServerPlugin.class);
-
-  private final Manifest manifest;
-  private final PluginContentScanner scanner;
-  private final Path dataDir;
-  private final String pluginCanonicalWebUrl;
-  private final ClassLoader classLoader;
-  private final String metricsPrefix;
-  protected Class<? extends Module> sysModule;
-  protected Class<? extends Module> sshModule;
-  protected Class<? extends Module> httpModule;
-
-  private Injector sysInjector;
-  private Injector sshInjector;
-  private Injector httpInjector;
-  private LifecycleManager serverManager;
-  private List<ReloadableRegistrationHandle<?>> reloadableHandles;
-
-  public ServerPlugin(
-      String name,
-      String pluginCanonicalWebUrl,
-      PluginUser pluginUser,
-      Path srcJar,
-      FileSnapshot snapshot,
-      PluginContentScanner scanner,
-      Path dataDir,
-      ClassLoader classLoader,
-      String metricsPrefix)
-      throws InvalidPluginException {
-    super(
-        name,
-        srcJar,
-        pluginUser,
-        snapshot,
-        scanner == null ? ApiType.PLUGIN : Plugin.getApiType(getPluginManifest(scanner)));
-    this.pluginCanonicalWebUrl = pluginCanonicalWebUrl;
-    this.scanner = scanner;
-    this.dataDir = dataDir;
-    this.classLoader = classLoader;
-    this.manifest = scanner == null ? null : getPluginManifest(scanner);
-    this.metricsPrefix = metricsPrefix;
-    if (manifest != null) {
-      loadGuiceModules(manifest, classLoader);
-    }
-  }
-
-  public ServerPlugin(
-      String name,
-      String pluginCanonicalWebUrl,
-      PluginUser pluginUser,
-      Path srcJar,
-      FileSnapshot snapshot,
-      PluginContentScanner scanner,
-      Path dataDir,
-      ClassLoader classLoader)
-      throws InvalidPluginException {
-    this(
-        name,
-        pluginCanonicalWebUrl,
-        pluginUser,
-        srcJar,
-        snapshot,
-        scanner,
-        dataDir,
-        classLoader,
-        null);
-  }
-
-  private void loadGuiceModules(Manifest manifest, ClassLoader classLoader)
-      throws InvalidPluginException {
-    Attributes main = manifest.getMainAttributes();
-    String sysName = main.getValue("Gerrit-Module");
-    String sshName = main.getValue("Gerrit-SshModule");
-    String httpName = main.getValue("Gerrit-HttpModule");
-
-    if (!Strings.isNullOrEmpty(sshName) && getApiType() != Plugin.ApiType.PLUGIN) {
-      throw new InvalidPluginException(
-          String.format(
-              "Using Gerrit-SshModule requires Gerrit-ApiType: %s", Plugin.ApiType.PLUGIN));
-    }
-
-    try {
-      this.sysModule = load(sysName, classLoader);
-      this.sshModule = load(sshName, classLoader);
-      this.httpModule = load(httpName, classLoader);
-    } catch (ClassNotFoundException e) {
-      throw new InvalidPluginException("Unable to load plugin Guice Modules", e);
-    }
-  }
-
-  @SuppressWarnings("unchecked")
-  protected static Class<? extends Module> load(String name, ClassLoader pluginLoader)
-      throws ClassNotFoundException {
-    if (Strings.isNullOrEmpty(name)) {
-      return null;
-    }
-
-    Class<?> clazz = Class.forName(name, false, pluginLoader);
-    if (!Module.class.isAssignableFrom(clazz)) {
-      throw new ClassCastException(
-          String.format("Class %s does not implement %s", name, Module.class.getName()));
-    }
-    return (Class<? extends Module>) clazz;
-  }
-
-  Path getDataDir() {
-    return dataDir;
-  }
-
-  String getPluginCanonicalWebUrl() {
-    return pluginCanonicalWebUrl;
-  }
-
-  String getMetricsPrefix() {
-    return metricsPrefix;
-  }
-
-  private static Manifest getPluginManifest(PluginContentScanner scanner)
-      throws InvalidPluginException {
-    try {
-      return scanner.getManifest();
-    } catch (IOException e) {
-      throw new InvalidPluginException("Cannot get plugin manifest", e);
-    }
-  }
-
-  @Override
-  @Nullable
-  public String getVersion() {
-    Attributes main = manifest.getMainAttributes();
-    return main.getValue(Attributes.Name.IMPLEMENTATION_VERSION);
-  }
-
-  @Override
-  protected boolean canReload() {
-    Attributes main = manifest.getMainAttributes();
-    String v = main.getValue("Gerrit-ReloadMode");
-    if (Strings.isNullOrEmpty(v) || "reload".equalsIgnoreCase(v)) {
-      return true;
-    } else if ("restart".equalsIgnoreCase(v)) {
-      return false;
-    } else {
-      log.warn("Plugin {} has invalid Gerrit-ReloadMode {}; assuming restart", getName(), v);
-      return false;
-    }
-  }
-
-  @Override
-  protected void start(PluginGuiceEnvironment env) throws Exception {
-    RequestContext oldContext = env.enter(this);
-    try {
-      startPlugin(env);
-    } finally {
-      env.exit(oldContext);
-    }
-  }
-
-  private void startPlugin(PluginGuiceEnvironment env) throws Exception {
-    Injector root = newRootInjector(env);
-    serverManager = new LifecycleManager();
-    serverManager.add(root);
-
-    AutoRegisterModules auto = null;
-    if (sysModule == null && sshModule == null && httpModule == null) {
-      auto = new AutoRegisterModules(getName(), env, scanner, classLoader);
-      auto.discover();
-    }
-
-    if (sysModule != null) {
-      sysInjector = root.createChildInjector(root.getInstance(sysModule));
-      serverManager.add(sysInjector);
-    } else if (auto != null && auto.sysModule != null) {
-      sysInjector = root.createChildInjector(auto.sysModule);
-      serverManager.add(sysInjector);
-    } else {
-      sysInjector = root;
-    }
-
-    if (env.hasSshModule()) {
-      List<Module> modules = new ArrayList<>();
-      if (getApiType() == ApiType.PLUGIN) {
-        modules.add(env.getSshModule());
-      }
-      if (sshModule != null) {
-        modules.add(sysInjector.getInstance(sshModule));
-        sshInjector = sysInjector.createChildInjector(modules);
-        serverManager.add(sshInjector);
-      } else if (auto != null && auto.sshModule != null) {
-        modules.add(auto.sshModule);
-        sshInjector = sysInjector.createChildInjector(modules);
-        serverManager.add(sshInjector);
-      }
-    }
-
-    if (env.hasHttpModule()) {
-      List<Module> modules = new ArrayList<>();
-      if (getApiType() == ApiType.PLUGIN) {
-        modules.add(env.getHttpModule());
-      }
-      if (httpModule != null) {
-        modules.add(sysInjector.getInstance(httpModule));
-        httpInjector = sysInjector.createChildInjector(modules);
-        serverManager.add(httpInjector);
-      } else if (auto != null && auto.httpModule != null) {
-        modules.add(auto.httpModule);
-        httpInjector = sysInjector.createChildInjector(modules);
-        serverManager.add(httpInjector);
-      }
-    }
-
-    serverManager.start();
-  }
-
-  private Injector newRootInjector(PluginGuiceEnvironment env) {
-    List<Module> modules = Lists.newArrayListWithCapacity(2);
-    if (getApiType() == ApiType.PLUGIN) {
-      modules.add(env.getSysModule());
-    }
-    modules.add(new ServerPluginInfoModule(this, env.getServerMetrics()));
-    return Guice.createInjector(modules);
-  }
-
-  @Override
-  protected void stop(PluginGuiceEnvironment env) {
-    if (serverManager != null) {
-      RequestContext oldContext = env.enter(this);
-      try {
-        serverManager.stop();
-      } finally {
-        env.exit(oldContext);
-      }
-      serverManager = null;
-      sysInjector = null;
-      sshInjector = null;
-      httpInjector = null;
-    }
-  }
-
-  @Override
-  public Injector getSysInjector() {
-    return sysInjector;
-  }
-
-  @Override
-  @Nullable
-  public Injector getSshInjector() {
-    return sshInjector;
-  }
-
-  @Override
-  @Nullable
-  public Injector getHttpInjector() {
-    return httpInjector;
-  }
-
-  @Override
-  public void add(RegistrationHandle handle) {
-    if (serverManager != null) {
-      if (handle instanceof ReloadableRegistrationHandle) {
-        if (reloadableHandles == null) {
-          reloadableHandles = new ArrayList<>();
-        }
-        reloadableHandles.add((ReloadableRegistrationHandle<?>) handle);
-      }
-      serverManager.add(handle);
-    }
-  }
-
-  @Override
-  public PluginContentScanner getContentScanner() {
-    return scanner;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPluginProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPluginProvider.java
deleted file mode 100644
index 632f838..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPluginProvider.java
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.plugins;
-
-import com.google.gerrit.extensions.annotations.ExtensionPoint;
-import com.google.gerrit.server.PluginUser;
-import java.nio.file.Path;
-import org.eclipse.jgit.internal.storage.file.FileSnapshot;
-
-/**
- * Provider of one Server plugin from one external file
- *
- * <p>Allows to load one plugin from one external file or one directory by declaring the ability to
- * handle it.
- *
- * <p>In order to load multiple files into a single plugin, group them into a directory tree and
- * then load the directory root as a single plugin.
- */
-@ExtensionPoint
-public interface ServerPluginProvider {
-
-  /** Descriptor of the Plugin that ServerPluginProvider has to load. */
-  class PluginDescription {
-    public final PluginUser user;
-    public final String canonicalUrl;
-    public final Path dataDir;
-
-    /**
-     * Creates a new PluginDescription for ServerPluginProvider.
-     *
-     * @param user Gerrit user for interacting with plugins
-     * @param canonicalUrl plugin root Web URL
-     * @param dataDir directory for plugin data
-     */
-    public PluginDescription(PluginUser user, String canonicalUrl, Path dataDir) {
-      this.user = user;
-      this.canonicalUrl = canonicalUrl;
-      this.dataDir = dataDir;
-    }
-  }
-
-  /**
-   * Declares the availability to manage an external file or directory
-   *
-   * @param srcPath the external file or directory
-   * @return true if file or directory can be loaded into a Server Plugin
-   */
-  boolean handles(Path srcPath);
-
-  /**
-   * Returns the plugin name of an external file or directory
-   *
-   * <p>Should be called only if {@link #handles(Path) handles(srcFile)} returns true and thus
-   * srcFile is a supported plugin format. An IllegalArgumentException is thrown otherwise as
-   * srcFile is not a valid file format for extracting its plugin name.
-   *
-   * @param srcPath external file or directory
-   * @return plugin name
-   */
-  String getPluginName(Path srcPath);
-
-  /**
-   * Loads an external file or directory into a Server plugin.
-   *
-   * <p>Should be called only if {@link #handles(Path) handles(srcFile)} returns true and thus
-   * srcFile is a supported plugin format. An IllegalArgumentException is thrown otherwise as
-   * srcFile is not a valid file format for extracting its plugin name.
-   *
-   * @param srcPath external file or directory
-   * @param snapshot snapshot of the external file
-   * @param pluginDescriptor descriptor of the ServerPlugin to load
-   * @throws InvalidPluginException if plugin is supposed to be handled but cannot be loaded for any
-   *     other reason
-   */
-  ServerPlugin get(Path srcPath, FileSnapshot snapshot, PluginDescription pluginDescriptor)
-      throws InvalidPluginException;
-
-  /**
-   * Returns the plugin name of this provider.
-   *
-   * <p>Allows to identify which plugin provided the current ServerPluginProvider by returning the
-   * plugin name. Helpful for troubleshooting plugin loading problems.
-   *
-   * @return plugin name of this provider
-   */
-  String getProviderPluginName();
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/TestServerPlugin.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/TestServerPlugin.java
deleted file mode 100644
index dbdc576..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/TestServerPlugin.java
+++ /dev/null
@@ -1,80 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.plugins;
-
-import com.google.gerrit.server.PluginUser;
-import java.nio.file.Path;
-
-public class TestServerPlugin extends ServerPlugin {
-  private final ClassLoader classLoader;
-  private String sysName;
-  private String httpName;
-  private String sshName;
-
-  public TestServerPlugin(
-      String name,
-      String pluginCanonicalWebUrl,
-      PluginUser user,
-      ClassLoader classloader,
-      String sysName,
-      String httpName,
-      String sshName,
-      Path dataDir)
-      throws InvalidPluginException {
-    super(name, pluginCanonicalWebUrl, user, null, null, null, dataDir, classloader);
-    this.classLoader = classloader;
-    this.sysName = sysName;
-    this.httpName = httpName;
-    this.sshName = sshName;
-    loadGuiceModules();
-  }
-
-  private void loadGuiceModules() throws InvalidPluginException {
-    try {
-      this.sysModule = load(sysName, classLoader);
-      this.httpModule = load(httpName, classLoader);
-      this.sshModule = load(sshName, classLoader);
-    } catch (ClassNotFoundException e) {
-      throw new InvalidPluginException("Unable to load plugin Guice Modules", e);
-    }
-  }
-
-  @Override
-  public String getVersion() {
-    return "1.0";
-  }
-
-  @Override
-  protected boolean canReload() {
-    return false;
-  }
-
-  @Override
-  // Widen access modifier in derived class
-  public void start(PluginGuiceEnvironment env) throws Exception {
-    super.start(env);
-  }
-
-  @Override
-  // Widen access modifier in derived class
-  public void stop(PluginGuiceEnvironment env) {
-    super.stop(env);
-  }
-
-  @Override
-  public PluginContentScanner getContentScanner() {
-    return null;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/UniversalServerPluginProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/UniversalServerPluginProvider.java
deleted file mode 100644
index 50b8752..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/UniversalServerPluginProvider.java
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.plugins;
-
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.List;
-import org.eclipse.jgit.internal.storage.file.FileSnapshot;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-class UniversalServerPluginProvider implements ServerPluginProvider {
-  private static final Logger log = LoggerFactory.getLogger(UniversalServerPluginProvider.class);
-
-  private final DynamicSet<ServerPluginProvider> serverPluginProviders;
-
-  @Inject
-  UniversalServerPluginProvider(DynamicSet<ServerPluginProvider> sf) {
-    this.serverPluginProviders = sf;
-  }
-
-  @Override
-  public ServerPlugin get(Path srcPath, FileSnapshot snapshot, PluginDescription pluginDescription)
-      throws InvalidPluginException {
-    return providerOf(srcPath).get(srcPath, snapshot, pluginDescription);
-  }
-
-  @Override
-  public String getPluginName(Path srcPath) {
-    return providerOf(srcPath).getPluginName(srcPath);
-  }
-
-  @Override
-  public boolean handles(Path srcPath) {
-    List<ServerPluginProvider> providers = providersForHandlingPlugin(srcPath);
-    switch (providers.size()) {
-      case 1:
-        return true;
-      case 0:
-        return false;
-      default:
-        throw new MultipleProvidersForPluginException(srcPath, providers);
-    }
-  }
-
-  @Override
-  public String getProviderPluginName() {
-    return "gerrit";
-  }
-
-  private ServerPluginProvider providerOf(Path srcPath) {
-    List<ServerPluginProvider> providers = providersForHandlingPlugin(srcPath);
-    switch (providers.size()) {
-      case 1:
-        return providers.get(0);
-      case 0:
-        throw new IllegalArgumentException(
-            "No ServerPluginProvider found/loaded to handle plugin file "
-                + srcPath.toAbsolutePath());
-      default:
-        throw new MultipleProvidersForPluginException(srcPath, providers);
-    }
-  }
-
-  private List<ServerPluginProvider> providersForHandlingPlugin(Path srcPath) {
-    List<ServerPluginProvider> providers = new ArrayList<>();
-    for (ServerPluginProvider serverPluginProvider : serverPluginProviders) {
-      boolean handles = serverPluginProvider.handles(srcPath);
-      log.debug(
-          "File {} handled by {} ? => {}",
-          srcPath,
-          serverPluginProvider.getProviderPluginName(),
-          handles);
-      if (handles) {
-        providers.add(serverPluginProvider);
-      }
-    }
-    return providers;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/BanCommit.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/BanCommit.java
deleted file mode 100644
index 278b2af..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/BanCommit.java
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.project;
-
-import com.google.common.collect.Lists;
-import com.google.gerrit.common.errors.PermissionDeniedException;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.server.git.BanCommitResult;
-import com.google.gerrit.server.project.BanCommit.BanResultInfo;
-import com.google.gerrit.server.project.BanCommit.Input;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.RetryHelper;
-import com.google.gerrit.server.update.RetryingRestModifyView;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import org.eclipse.jgit.lib.ObjectId;
-
-@Singleton
-public class BanCommit extends RetryingRestModifyView<ProjectResource, Input, BanResultInfo> {
-  public static class Input {
-    public List<String> commits;
-    public String reason;
-
-    public static Input fromCommits(String firstCommit, String... moreCommits) {
-      return fromCommits(Lists.asList(firstCommit, moreCommits));
-    }
-
-    public static Input fromCommits(List<String> commits) {
-      Input in = new Input();
-      in.commits = commits;
-      return in;
-    }
-  }
-
-  private final com.google.gerrit.server.git.BanCommit banCommit;
-
-  @Inject
-  BanCommit(RetryHelper retryHelper, com.google.gerrit.server.git.BanCommit banCommit) {
-    super(retryHelper);
-    this.banCommit = banCommit;
-  }
-
-  @Override
-  protected BanResultInfo applyImpl(
-      BatchUpdate.Factory updateFactory, ProjectResource rsrc, Input input)
-      throws RestApiException, UpdateException, IOException {
-    BanResultInfo r = new BanResultInfo();
-    if (input != null && input.commits != null && !input.commits.isEmpty()) {
-      List<ObjectId> commitsToBan = new ArrayList<>(input.commits.size());
-      for (String c : input.commits) {
-        try {
-          commitsToBan.add(ObjectId.fromString(c));
-        } catch (IllegalArgumentException e) {
-          throw new UnprocessableEntityException(e.getMessage());
-        }
-      }
-
-      try {
-        BanCommitResult result = banCommit.ban(rsrc.getControl(), commitsToBan, input.reason);
-        r.newlyBanned = transformCommits(result.getNewlyBannedCommits());
-        r.alreadyBanned = transformCommits(result.getAlreadyBannedCommits());
-        r.ignored = transformCommits(result.getIgnoredObjectIds());
-      } catch (PermissionDeniedException e) {
-        throw new AuthException(e.getMessage());
-      }
-    }
-    return r;
-  }
-
-  private static List<String> transformCommits(List<ObjectId> commits) {
-    if (commits == null || commits.isEmpty()) {
-      return null;
-    }
-    return Lists.transform(commits, ObjectId::getName);
-  }
-
-  public static class BanResultInfo {
-    public List<String> newlyBanned;
-    public List<String> alreadyBanned;
-    public List<String> ignored;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/BranchResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/BranchResource.java
deleted file mode 100644
index 2e81af3..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/BranchResource.java
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.inject.TypeLiteral;
-import org.eclipse.jgit.lib.Ref;
-
-public class BranchResource extends RefResource {
-  public static final TypeLiteral<RestView<BranchResource>> BRANCH_KIND =
-      new TypeLiteral<RestView<BranchResource>>() {};
-
-  private final String refName;
-  private final String revision;
-
-  public BranchResource(ProjectControl control, Ref ref) {
-    super(control);
-    this.refName = ref.getName();
-    this.revision = ref.getObjectId() != null ? ref.getObjectId().name() : null;
-  }
-
-  public Branch.NameKey getBranchKey() {
-    return new Branch.NameKey(getNameKey(), refName);
-  }
-
-  @Override
-  public String getRef() {
-    return refName;
-  }
-
-  @Override
-  public String getRevision() {
-    return revision;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/BranchesCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/BranchesCollection.java
deleted file mode 100644
index a40eabb..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/BranchesCollection.java
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AcceptsCreate;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ChildCollection;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.RefPermission;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-
-@Singleton
-public class BranchesCollection
-    implements ChildCollection<ProjectResource, BranchResource>, AcceptsCreate<ProjectResource> {
-  private final DynamicMap<RestView<BranchResource>> views;
-  private final Provider<ListBranches> list;
-  private final PermissionBackend permissionBackend;
-  private final Provider<CurrentUser> user;
-  private final GitRepositoryManager repoManager;
-  private final CreateBranch.Factory createBranchFactory;
-
-  @Inject
-  BranchesCollection(
-      DynamicMap<RestView<BranchResource>> views,
-      Provider<ListBranches> list,
-      PermissionBackend permissionBackend,
-      Provider<CurrentUser> user,
-      GitRepositoryManager repoManager,
-      CreateBranch.Factory createBranchFactory) {
-    this.views = views;
-    this.list = list;
-    this.permissionBackend = permissionBackend;
-    this.user = user;
-    this.repoManager = repoManager;
-    this.createBranchFactory = createBranchFactory;
-  }
-
-  @Override
-  public RestView<ProjectResource> list() {
-    return list.get();
-  }
-
-  @Override
-  public BranchResource parse(ProjectResource parent, IdString id)
-      throws ResourceNotFoundException, IOException, PermissionBackendException {
-    Project.NameKey project = parent.getNameKey();
-    try (Repository repo = repoManager.openRepository(project)) {
-      Ref ref = repo.exactRef(RefNames.fullName(id.get()));
-      if (ref == null) {
-        throw new ResourceNotFoundException(id);
-      }
-
-      // ListBranches checks the target of a symbolic reference to determine access
-      // rights on the symbolic reference itself. This check prevents seeing a hidden
-      // branch simply because the symbolic reference name was visible.
-      permissionBackend
-          .user(user)
-          .project(project)
-          .ref(ref.isSymbolic() ? ref.getTarget().getName() : ref.getName())
-          .check(RefPermission.READ);
-      return new BranchResource(parent.getControl(), ref);
-    } catch (AuthException notAllowed) {
-      throw new ResourceNotFoundException(id);
-    } catch (RepositoryNotFoundException noRepo) {
-      throw new ResourceNotFoundException();
-    }
-  }
-
-  @Override
-  public DynamicMap<RestView<BranchResource>> views() {
-    return views;
-  }
-
-  @Override
-  public CreateBranch create(ProjectResource parent, IdString name) {
-    return createBranchFactory.create(name.get());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java
deleted file mode 100644
index 1582d43..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java
+++ /dev/null
@@ -1,439 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.project;
-
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.gerrit.server.permissions.LabelPermission.ForUser.ON_BEHALF_OF;
-
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.data.LabelFunction;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.PermissionRange;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.ChangePermissionOrLabel;
-import com.google.gerrit.server.permissions.LabelPermission;
-import com.google.gerrit.server.permissions.PermissionBackend.ForChange;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.RefPermission;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.Collection;
-import java.util.EnumSet;
-import java.util.Map;
-import java.util.Set;
-
-/** Access control management for a user accessing a single change. */
-class ChangeControl {
-  @Singleton
-  static class Factory {
-    private final ChangeData.Factory changeDataFactory;
-    private final ChangeNotes.Factory notesFactory;
-    private final ApprovalsUtil approvalsUtil;
-    private final PatchSetUtil patchSetUtil;
-
-    @Inject
-    Factory(
-        ChangeData.Factory changeDataFactory,
-        ChangeNotes.Factory notesFactory,
-        ApprovalsUtil approvalsUtil,
-        PatchSetUtil patchSetUtil) {
-      this.changeDataFactory = changeDataFactory;
-      this.notesFactory = notesFactory;
-      this.approvalsUtil = approvalsUtil;
-      this.patchSetUtil = patchSetUtil;
-    }
-
-    ChangeControl create(
-        RefControl refControl, ReviewDb db, Project.NameKey project, Change.Id changeId)
-        throws OrmException {
-      return create(refControl, notesFactory.create(db, project, changeId));
-    }
-
-    ChangeControl create(RefControl refControl, ChangeNotes notes) {
-      return new ChangeControl(changeDataFactory, approvalsUtil, refControl, notes, patchSetUtil);
-    }
-  }
-
-  private final ChangeData.Factory changeDataFactory;
-  private final ApprovalsUtil approvalsUtil;
-  private final RefControl refControl;
-  private final ChangeNotes notes;
-  private final PatchSetUtil patchSetUtil;
-
-  ChangeControl(
-      ChangeData.Factory changeDataFactory,
-      ApprovalsUtil approvalsUtil,
-      RefControl refControl,
-      ChangeNotes notes,
-      PatchSetUtil patchSetUtil) {
-    this.changeDataFactory = changeDataFactory;
-    this.approvalsUtil = approvalsUtil;
-    this.refControl = refControl;
-    this.notes = notes;
-    this.patchSetUtil = patchSetUtil;
-  }
-
-  ChangeControl forUser(CurrentUser who) {
-    if (getUser().equals(who)) {
-      return this;
-    }
-    return new ChangeControl(
-        changeDataFactory, approvalsUtil, getRefControl().forUser(who), notes, patchSetUtil);
-  }
-
-  private RefControl getRefControl() {
-    return refControl;
-  }
-
-  private CurrentUser getUser() {
-    return getRefControl().getUser();
-  }
-
-  private ProjectControl getProjectControl() {
-    return getRefControl().getProjectControl();
-  }
-
-  private Change getChange() {
-    return notes.getChange();
-  }
-
-  private ChangeNotes getNotes() {
-    return notes;
-  }
-
-  /** Can this user see this change? */
-  private boolean isVisible(ReviewDb db, @Nullable ChangeData cd) throws OrmException {
-    if (getChange().isPrivate() && !isPrivateVisible(db, cd)) {
-      return false;
-    }
-    return isRefVisible();
-  }
-
-  /** Can the user see this change? Does not account for draft status */
-  private boolean isRefVisible() {
-    return getRefControl().isVisible();
-  }
-
-  /** Can this user abandon this change? */
-  private boolean canAbandon(ReviewDb db) throws OrmException {
-    return (isOwner() // owner (aka creator) of the change can abandon
-            || getRefControl().isOwner() // branch owner can abandon
-            || getProjectControl().isOwner() // project owner can abandon
-            || getRefControl().canAbandon() // user can abandon a specific ref
-            || getProjectControl().isAdmin())
-        && !isPatchSetLocked(db);
-  }
-
-  /** Can this user delete this change? */
-  private boolean canDelete(Change.Status status) {
-    switch (status) {
-      case NEW:
-      case ABANDONED:
-        return (getRefControl().canDeleteChanges(isOwner()) || getProjectControl().isAdmin());
-      case MERGED:
-      default:
-        return false;
-    }
-  }
-
-  /** Can this user rebase this change? */
-  private boolean canRebase(ReviewDb db) throws OrmException {
-    return (isOwner() || getRefControl().canSubmit(isOwner()) || getRefControl().canRebase())
-        && refControl.asForRef().testOrFalse(RefPermission.CREATE_CHANGE)
-        && !isPatchSetLocked(db);
-  }
-
-  /** Can this user restore this change? */
-  private boolean canRestore(ReviewDb db) throws OrmException {
-    // Anyone who can abandon the change can restore it, as long as they can create changes.
-    return canAbandon(db) && refControl.asForRef().testOrFalse(RefPermission.CREATE_CHANGE);
-  }
-
-  /** The range of permitted values associated with a label permission. */
-  private PermissionRange getRange(String permission) {
-    return getRefControl().getRange(permission, isOwner());
-  }
-
-  /** Can this user add a patch set to this change? */
-  private boolean canAddPatchSet(ReviewDb db) throws OrmException {
-    if (!refControl.asForRef().testOrFalse(RefPermission.CREATE_CHANGE) || isPatchSetLocked(db)) {
-      return false;
-    }
-    if (isOwner()) {
-      return true;
-    }
-    return getRefControl().canAddPatchSet();
-  }
-
-  /** Is the current patch set locked against state changes? */
-  private boolean isPatchSetLocked(ReviewDb db) throws OrmException {
-    if (getChange().getStatus() == Change.Status.MERGED) {
-      return false;
-    }
-
-    for (PatchSetApproval ap :
-        approvalsUtil.byPatchSet(
-            db, getNotes(), getUser(), getChange().currentPatchSetId(), null, null)) {
-      LabelType type =
-          getProjectControl()
-              .getProjectState()
-              .getLabelTypes(getNotes(), getUser())
-              .byLabel(ap.getLabel());
-      if (type != null
-          && ap.getValue() == 1
-          && type.getFunction() == LabelFunction.PATCH_SET_LOCK) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /** Is this user the owner of the change? */
-  private boolean isOwner() {
-    if (getUser().isIdentifiedUser()) {
-      Account.Id id = getUser().asIdentifiedUser().getAccountId();
-      return id.equals(getChange().getOwner());
-    }
-    return false;
-  }
-
-  /** Is this user assigned to this change? */
-  private boolean isAssignee() {
-    Account.Id currentAssignee = notes.getChange().getAssignee();
-    if (currentAssignee != null && getUser().isIdentifiedUser()) {
-      Account.Id id = getUser().getAccountId();
-      return id.equals(currentAssignee);
-    }
-    return false;
-  }
-
-  /** Is this user a reviewer for the change? */
-  private boolean isReviewer(ReviewDb db, @Nullable ChangeData cd) throws OrmException {
-    if (getUser().isIdentifiedUser()) {
-      Collection<Account.Id> results = changeData(db, cd).reviewers().all();
-      return results.contains(getUser().getAccountId());
-    }
-    return false;
-  }
-
-  /** Can this user edit the topic name? */
-  private boolean canEditTopicName() {
-    if (getChange().getStatus().isOpen()) {
-      return isOwner() // owner (aka creator) of the change can edit topic
-          || getRefControl().isOwner() // branch owner can edit topic
-          || getProjectControl().isOwner() // project owner can edit topic
-          || getRefControl().canEditTopicName() // user can edit topic on a specific ref
-          || getProjectControl().isAdmin();
-    }
-    return getRefControl().canForceEditTopicName();
-  }
-
-  /** Can this user edit the description? */
-  private boolean canEditDescription() {
-    if (getChange().getStatus().isOpen()) {
-      return isOwner() // owner (aka creator) of the change can edit desc
-          || getRefControl().isOwner() // branch owner can edit desc
-          || getProjectControl().isOwner() // project owner can edit desc
-          || getProjectControl().isAdmin();
-    }
-    return false;
-  }
-
-  private boolean canEditAssignee() {
-    return isOwner()
-        || getProjectControl().isOwner()
-        || getRefControl().canEditAssignee()
-        || isAssignee();
-  }
-
-  /** Can this user edit the hashtag name? */
-  private boolean canEditHashtags() {
-    return isOwner() // owner (aka creator) of the change can edit hashtags
-        || getRefControl().isOwner() // branch owner can edit hashtags
-        || getProjectControl().isOwner() // project owner can edit hashtags
-        || getRefControl().canEditHashtags() // user can edit hashtag on a specific ref
-        || getProjectControl().isAdmin();
-  }
-
-  private ChangeData changeData(ReviewDb db, @Nullable ChangeData cd) {
-    return cd != null ? cd : changeDataFactory.create(db, getNotes());
-  }
-
-  private boolean isPrivateVisible(ReviewDb db, ChangeData cd) throws OrmException {
-    return isOwner()
-        || isReviewer(db, cd)
-        || getRefControl().canViewPrivateChanges()
-        || getUser().isInternalUser();
-  }
-
-  ForChange asForChange(@Nullable ChangeData cd, @Nullable Provider<ReviewDb> db) {
-    return new ForChangeImpl(cd, db);
-  }
-
-  private class ForChangeImpl extends ForChange {
-    private ChangeData cd;
-    private Map<String, PermissionRange> labels;
-
-    ForChangeImpl(@Nullable ChangeData cd, @Nullable Provider<ReviewDb> db) {
-      this.cd = cd;
-      this.db = db;
-    }
-
-    private ReviewDb db() {
-      if (db != null) {
-        return db.get();
-      } else if (cd != null) {
-        return cd.db();
-      } else {
-        return null;
-      }
-    }
-
-    private ChangeData changeData() {
-      if (cd == null) {
-        ReviewDb reviewDb = db();
-        checkState(reviewDb != null, "need ReviewDb");
-        cd = changeDataFactory.create(reviewDb, getNotes());
-      }
-      return cd;
-    }
-
-    @Override
-    public CurrentUser user() {
-      return getUser();
-    }
-
-    @Override
-    public ForChange user(CurrentUser user) {
-      return user().equals(user) ? this : forUser(user).asForChange(cd, db);
-    }
-
-    @Override
-    public void check(ChangePermissionOrLabel perm)
-        throws AuthException, PermissionBackendException {
-      if (!can(perm)) {
-        throw new AuthException(perm.describeForException() + " not permitted");
-      }
-    }
-
-    @Override
-    public <T extends ChangePermissionOrLabel> Set<T> test(Collection<T> permSet)
-        throws PermissionBackendException {
-      Set<T> ok = newSet(permSet);
-      for (T perm : permSet) {
-        if (can(perm)) {
-          ok.add(perm);
-        }
-      }
-      return ok;
-    }
-
-    private boolean can(ChangePermissionOrLabel perm) throws PermissionBackendException {
-      if (perm instanceof ChangePermission) {
-        return can((ChangePermission) perm);
-      } else if (perm instanceof LabelPermission) {
-        return can((LabelPermission) perm);
-      } else if (perm instanceof LabelPermission.WithValue) {
-        return can((LabelPermission.WithValue) perm);
-      }
-      throw new PermissionBackendException(perm + " unsupported");
-    }
-
-    private boolean can(ChangePermission perm) throws PermissionBackendException {
-      try {
-        switch (perm) {
-          case READ:
-            return isVisible(db(), changeData());
-          case ABANDON:
-            return canAbandon(db());
-          case DELETE:
-            return canDelete(getChange().getStatus());
-          case ADD_PATCH_SET:
-            return canAddPatchSet(db());
-          case EDIT_ASSIGNEE:
-            return canEditAssignee();
-          case EDIT_DESCRIPTION:
-            return canEditDescription();
-          case EDIT_HASHTAGS:
-            return canEditHashtags();
-          case EDIT_TOPIC_NAME:
-            return canEditTopicName();
-          case REBASE:
-            return canRebase(db());
-          case RESTORE:
-            return canRestore(db());
-          case SUBMIT:
-            return getRefControl().canSubmit(isOwner());
-
-          case REMOVE_REVIEWER:
-          case SUBMIT_AS:
-            return getRefControl().canPerform(perm.permissionName().get());
-        }
-      } catch (OrmException e) {
-        throw new PermissionBackendException("unavailable", e);
-      }
-      throw new PermissionBackendException(perm + " unsupported");
-    }
-
-    private boolean can(LabelPermission perm) {
-      return !label(perm.permissionName().get()).isEmpty();
-    }
-
-    private boolean can(LabelPermission.WithValue perm) {
-      PermissionRange r = label(perm.permissionName().get());
-      if (perm.forUser() == ON_BEHALF_OF && r.isEmpty()) {
-        return false;
-      }
-      return r.contains(perm.value());
-    }
-
-    private PermissionRange label(String permission) {
-      if (labels == null) {
-        labels = Maps.newHashMapWithExpectedSize(4);
-      }
-      PermissionRange r = labels.get(permission);
-      if (r == null) {
-        r = getRange(permission);
-        labels.put(permission, r);
-      }
-      return r;
-    }
-  }
-
-  static <T extends ChangePermissionOrLabel> Set<T> newSet(Collection<T> permSet) {
-    if (permSet instanceof EnumSet) {
-      @SuppressWarnings({"unchecked", "rawtypes"})
-      Set<T> s = ((EnumSet) permSet).clone();
-      s.clear();
-      return s;
-    }
-    return Sets.newHashSetWithExpectedSize(permSet.size());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/CheckAccess.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/CheckAccess.java
deleted file mode 100644
index b8d3fbc..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/CheckAccess.java
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.project;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.extensions.api.config.AccessCheckInfo;
-import com.google.gerrit.extensions.api.config.AccessCheckInput;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountResolver;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.ProjectPermission;
-import com.google.gerrit.server.permissions.RefPermission;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import javax.servlet.http.HttpServletResponse;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-@Singleton
-public class CheckAccess implements RestModifyView<ProjectResource, AccessCheckInput> {
-  private final AccountResolver accountResolver;
-  private final IdentifiedUser.GenericFactory userFactory;
-  private final PermissionBackend permissionBackend;
-
-  @Inject
-  CheckAccess(
-      AccountResolver resolver,
-      IdentifiedUser.GenericFactory userFactory,
-      PermissionBackend permissionBackend) {
-    this.accountResolver = resolver;
-    this.userFactory = userFactory;
-    this.permissionBackend = permissionBackend;
-  }
-
-  @Override
-  public AccessCheckInfo apply(ProjectResource rsrc, AccessCheckInput input)
-      throws OrmException, PermissionBackendException, RestApiException, IOException,
-          ConfigInvalidException {
-    permissionBackend.user(rsrc.getUser()).check(GlobalPermission.ADMINISTRATE_SERVER);
-
-    if (input == null) {
-      throw new BadRequestException("input is required");
-    }
-    if (Strings.isNullOrEmpty(input.account)) {
-      throw new BadRequestException("input requires 'account'");
-    }
-
-    Account match = accountResolver.find(input.account);
-    if (match == null) {
-      throw new UnprocessableEntityException(
-          String.format("cannot find account %s", input.account));
-    }
-
-    AccessCheckInfo info = new AccessCheckInfo();
-
-    IdentifiedUser user = userFactory.create(match.getId());
-    try {
-      permissionBackend.user(user).project(rsrc.getNameKey()).check(ProjectPermission.ACCESS);
-    } catch (AuthException | PermissionBackendException e) {
-      info.message =
-          String.format(
-              "user %s (%s) cannot see project %s",
-              user.getNameEmail(), user.getAccount().getId(), rsrc.getName());
-      info.status = HttpServletResponse.SC_FORBIDDEN;
-      return info;
-    }
-
-    if (!Strings.isNullOrEmpty(input.ref)) {
-      try {
-        permissionBackend
-            .user(user)
-            .ref(new Branch.NameKey(rsrc.getNameKey(), input.ref))
-            .check(RefPermission.READ);
-      } catch (AuthException | PermissionBackendException e) {
-        info.status = HttpServletResponse.SC_FORBIDDEN;
-        info.message =
-            String.format(
-                "user %s (%s) cannot see ref %s in project %s",
-                user.getNameEmail(), user.getAccount().getId(), input.ref, rsrc.getName());
-        return info;
-      }
-    }
-
-    info.status = HttpServletResponse.SC_OK;
-    return info;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/CheckMergeability.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/CheckMergeability.java
deleted file mode 100644
index ab48143..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/CheckMergeability.java
+++ /dev/null
@@ -1,126 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.extensions.common.MergeableInfo;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.InMemoryInserter;
-import com.google.gerrit.server.git.MergeUtil;
-import com.google.inject.Inject;
-import java.io.IOException;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.merge.Merger;
-import org.eclipse.jgit.merge.ResolveMerger;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.kohsuke.args4j.Option;
-
-/** Check the mergeability at current branch for a git object references expression. */
-public class CheckMergeability implements RestReadView<BranchResource> {
-  private String source;
-  private String strategy;
-  private SubmitType submitType;
-
-  @Option(
-      name = "--source",
-      metaVar = "COMMIT",
-      usage =
-          "the source reference to merge, which could be any git object "
-              + "references expression, refer to "
-              + "org.eclipse.jgit.lib.Repository#resolve(String)",
-      required = true)
-  public void setSource(String source) {
-    this.source = source;
-  }
-
-  @Option(
-      name = "--strategy",
-      metaVar = "STRATEGY",
-      usage = "name of the merge strategy, refer to org.eclipse.jgit.merge.MergeStrategy")
-  public void setStrategy(String strategy) {
-    this.strategy = strategy;
-  }
-
-  private final GitRepositoryManager gitManager;
-  private final CommitsCollection commits;
-
-  @Inject
-  CheckMergeability(
-      GitRepositoryManager gitManager, CommitsCollection commits, @GerritServerConfig Config cfg) {
-    this.gitManager = gitManager;
-    this.commits = commits;
-    this.strategy = MergeUtil.getMergeStrategy(cfg).getName();
-    this.submitType = cfg.getEnum("project", null, "submitType", SubmitType.MERGE_IF_NECESSARY);
-  }
-
-  @Override
-  public MergeableInfo apply(BranchResource resource)
-      throws IOException, BadRequestException, ResourceNotFoundException {
-    if (!(submitType.equals(SubmitType.MERGE_ALWAYS)
-        || submitType.equals(SubmitType.MERGE_IF_NECESSARY))) {
-      throw new BadRequestException("Submit type: " + submitType + " is not supported");
-    }
-
-    MergeableInfo result = new MergeableInfo();
-    result.submitType = submitType;
-    result.strategy = strategy;
-    try (Repository git = gitManager.openRepository(resource.getNameKey());
-        RevWalk rw = new RevWalk(git);
-        ObjectInserter inserter = new InMemoryInserter(git)) {
-      Merger m = MergeUtil.newMerger(inserter, git.getConfig(), strategy);
-
-      Ref destRef = git.getRefDatabase().exactRef(resource.getRef());
-      if (destRef == null) {
-        throw new ResourceNotFoundException(resource.getRef());
-      }
-
-      RevCommit targetCommit = rw.parseCommit(destRef.getObjectId());
-      RevCommit sourceCommit = MergeUtil.resolveCommit(git, rw, source);
-
-      if (!commits.canRead(resource.getProjectState(), git, sourceCommit)) {
-        throw new BadRequestException("do not have read permission for: " + source);
-      }
-
-      if (rw.isMergedInto(sourceCommit, targetCommit)) {
-        result.mergeable = true;
-        result.commitMerged = true;
-        result.contentMerged = true;
-        return result;
-      }
-
-      if (m.merge(false, targetCommit, sourceCommit)) {
-        result.mergeable = true;
-        result.commitMerged = false;
-        result.contentMerged = m.getResultTreeId().equals(targetCommit.getTree());
-      } else {
-        result.mergeable = false;
-        if (m instanceof ResolveMerger) {
-          result.conflicts = ((ResolveMerger) m).getUnmergedPaths();
-        }
-      }
-    } catch (IllegalArgumentException e) {
-      throw new BadRequestException(e.getMessage());
-    }
-    return result;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ChildProjectResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ChildProjectResource.java
deleted file mode 100644
index b372b38..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ChildProjectResource.java
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.project;
-
-import com.google.common.collect.Iterables;
-import com.google.gerrit.extensions.restapi.RestResource;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.inject.TypeLiteral;
-
-public class ChildProjectResource implements RestResource {
-  public static final TypeLiteral<RestView<ChildProjectResource>> CHILD_PROJECT_KIND =
-      new TypeLiteral<RestView<ChildProjectResource>>() {};
-
-  private final ProjectResource parent;
-  private final ProjectState child;
-
-  public ChildProjectResource(ProjectResource parent, ProjectState child) {
-    this.parent = parent;
-    this.child = child;
-  }
-
-  public ProjectResource getParent() {
-    return parent;
-  }
-
-  public ProjectState getChild() {
-    return child;
-  }
-
-  public boolean isDirectChild() {
-    ProjectState firstParent = Iterables.getFirst(child.parents(), null);
-    return firstParent != null && parent.getNameKey().equals(firstParent.getNameKey());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ChildProjectsCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ChildProjectsCollection.java
deleted file mode 100644
index 0cd7d19..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ChildProjectsCollection.java
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ChildCollection;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-
-@Singleton
-public class ChildProjectsCollection
-    implements ChildCollection<ProjectResource, ChildProjectResource> {
-  private final Provider<ListChildProjects> list;
-  private final ProjectsCollection projectsCollection;
-  private final DynamicMap<RestView<ChildProjectResource>> views;
-
-  @Inject
-  ChildProjectsCollection(
-      Provider<ListChildProjects> list,
-      ProjectsCollection projectsCollection,
-      DynamicMap<RestView<ChildProjectResource>> views) {
-    this.list = list;
-    this.projectsCollection = projectsCollection;
-    this.views = views;
-  }
-
-  @Override
-  public ListChildProjects list() throws ResourceNotFoundException, AuthException {
-    return list.get();
-  }
-
-  @Override
-  public ChildProjectResource parse(ProjectResource parent, IdString id)
-      throws ResourceNotFoundException, IOException, PermissionBackendException {
-    ProjectResource p = projectsCollection.parse(TopLevelResource.INSTANCE, id);
-    for (ProjectState pp : p.getControl().getProjectState().parents()) {
-      if (parent.getNameKey().equals(pp.getProject().getNameKey())) {
-        return new ChildProjectResource(parent, p.getProjectState());
-      }
-    }
-    throw new ResourceNotFoundException(id);
-  }
-
-  @Override
-  public DynamicMap<RestView<ChildProjectResource>> views() {
-    return views;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/CommentLinkProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/CommentLinkProvider.java
deleted file mode 100644
index 0d2452c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/CommentLinkProvider.java
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.project;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-import com.google.gerrit.extensions.api.projects.CommentLinkInfo;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.util.List;
-import java.util.Set;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class CommentLinkProvider implements Provider<List<CommentLinkInfo>> {
-  private static final Logger log = LoggerFactory.getLogger(CommentLinkProvider.class);
-
-  private final Config cfg;
-
-  @Inject
-  CommentLinkProvider(@GerritServerConfig Config cfg) {
-    this.cfg = cfg;
-  }
-
-  @Override
-  public List<CommentLinkInfo> get() {
-    Set<String> subsections = cfg.getSubsections(ProjectConfig.COMMENTLINK);
-    List<CommentLinkInfo> cls = Lists.newArrayListWithCapacity(subsections.size());
-    for (String name : subsections) {
-      try {
-        CommentLinkInfoImpl cl = ProjectConfig.buildCommentLink(cfg, name, true);
-        if (cl.isOverrideOnly()) {
-          log.warn("commentlink " + name + " empty except for \"enabled\"");
-          continue;
-        }
-        cls.add(cl);
-      } catch (IllegalArgumentException e) {
-        log.warn("invalid commentlink: " + e.getMessage());
-      }
-    }
-    return ImmutableList.copyOf(cls);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/CommitIncludedIn.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/CommitIncludedIn.java
deleted file mode 100644
index 3c9b4bd..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/CommitIncludedIn.java
+++ /dev/null
@@ -1,44 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.api.changes.IncludedInInfo;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.change.IncludedIn;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.eclipse.jgit.revwalk.RevCommit;
-
-@Singleton
-public class CommitIncludedIn implements RestReadView<CommitResource> {
-  private IncludedIn includedIn;
-
-  @Inject
-  CommitIncludedIn(IncludedIn includedIn) {
-    this.includedIn = includedIn;
-  }
-
-  @Override
-  public IncludedInInfo apply(CommitResource rsrc)
-      throws RestApiException, OrmException, IOException {
-    RevCommit commit = rsrc.getCommit();
-    Project.NameKey project = rsrc.getProjectState().getNameKey();
-    return includedIn.apply(project, commit.getId().getName());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/CommitResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/CommitResource.java
deleted file mode 100644
index 0925524..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/CommitResource.java
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.restapi.RestResource;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.inject.TypeLiteral;
-import org.eclipse.jgit.revwalk.RevCommit;
-
-public class CommitResource implements RestResource {
-  public static final TypeLiteral<RestView<CommitResource>> COMMIT_KIND =
-      new TypeLiteral<RestView<CommitResource>>() {};
-
-  private final ProjectResource project;
-  private final RevCommit commit;
-
-  public CommitResource(ProjectResource project, RevCommit commit) {
-    this.project = project;
-    this.commit = commit;
-  }
-
-  public ProjectState getProjectState() {
-    return project.getProjectState();
-  }
-
-  public RevCommit getCommit() {
-    return commit;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/CommitsCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/CommitsCollection.java
deleted file mode 100644
index 11ed75a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/CommitsCollection.java
+++ /dev/null
@@ -1,140 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.ChildCollection;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.change.IncludedInResolver;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.VisibleRefFilter;
-import com.google.gerrit.server.index.change.ChangeIndexCollection;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.InternalChangeQuery;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-import org.eclipse.jgit.errors.IncorrectObjectTypeException;
-import org.eclipse.jgit.errors.MissingObjectException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class CommitsCollection implements ChildCollection<ProjectResource, CommitResource> {
-  private static final Logger log = LoggerFactory.getLogger(CommitsCollection.class);
-
-  private final DynamicMap<RestView<CommitResource>> views;
-  private final GitRepositoryManager repoManager;
-  private final VisibleRefFilter.Factory refFilter;
-  private final ChangeIndexCollection indexes;
-  private final Provider<InternalChangeQuery> queryProvider;
-
-  @Inject
-  public CommitsCollection(
-      DynamicMap<RestView<CommitResource>> views,
-      GitRepositoryManager repoManager,
-      VisibleRefFilter.Factory refFilter,
-      ChangeIndexCollection indexes,
-      Provider<InternalChangeQuery> queryProvider) {
-    this.views = views;
-    this.repoManager = repoManager;
-    this.refFilter = refFilter;
-    this.indexes = indexes;
-    this.queryProvider = queryProvider;
-  }
-
-  @Override
-  public RestView<ProjectResource> list() throws ResourceNotFoundException {
-    throw new ResourceNotFoundException();
-  }
-
-  @Override
-  public CommitResource parse(ProjectResource parent, IdString id)
-      throws ResourceNotFoundException, IOException {
-    ObjectId objectId;
-    try {
-      objectId = ObjectId.fromString(id.get());
-    } catch (IllegalArgumentException e) {
-      throw new ResourceNotFoundException(id);
-    }
-
-    try (Repository repo = repoManager.openRepository(parent.getNameKey());
-        RevWalk rw = new RevWalk(repo)) {
-      RevCommit commit = rw.parseCommit(objectId);
-      rw.parseBody(commit);
-      if (!canRead(parent.getProjectState(), repo, commit)) {
-        throw new ResourceNotFoundException(id);
-      }
-      for (int i = 0; i < commit.getParentCount(); i++) {
-        rw.parseBody(rw.parseCommit(commit.getParent(i)));
-      }
-      return new CommitResource(parent, commit);
-    } catch (MissingObjectException | IncorrectObjectTypeException e) {
-      throw new ResourceNotFoundException(id);
-    }
-  }
-
-  @Override
-  public DynamicMap<RestView<CommitResource>> views() {
-    return views;
-  }
-
-  /** @return true if {@code commit} is visible to the caller. */
-  public boolean canRead(ProjectState state, Repository repo, RevCommit commit) {
-    Project.NameKey project = state.getNameKey();
-
-    // Look for changes associated with the commit.
-    if (indexes.getSearchIndex() != null) {
-      try {
-        List<ChangeData> changes =
-            queryProvider.get().enforceVisibility(true).byProjectCommit(project, commit);
-        if (!changes.isEmpty()) {
-          return true;
-        }
-      } catch (OrmException e) {
-        log.error("Cannot look up change for commit {} in {}", commit.name(), project, e);
-      }
-    }
-
-    return isReachableFrom(state, repo, commit, repo.getAllRefs());
-  }
-
-  public boolean isReachableFrom(
-      ProjectState state, Repository repo, RevCommit commit, Map<String, Ref> refs) {
-    try (RevWalk rw = new RevWalk(repo)) {
-      refs = refFilter.create(state, repo).filter(refs, true);
-      return IncludedInResolver.includedInAny(repo, rw, commit, refs.values());
-    } catch (IOException e) {
-      log.error(
-          "Cannot verify permissions to commit object {} in repository {}",
-          commit.name(),
-          state.getNameKey(),
-          e);
-      return false;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ConfigInfoImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ConfigInfoImpl.java
deleted file mode 100644
index 9913693..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ConfigInfoImpl.java
+++ /dev/null
@@ -1,212 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.project;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.extensions.api.projects.CommentLinkInfo;
-import com.google.gerrit.extensions.api.projects.ConfigInfo;
-import com.google.gerrit.extensions.api.projects.ProjectConfigEntryType;
-import com.google.gerrit.extensions.common.ActionInfo;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.registration.DynamicMap.Entry;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.extensions.webui.UiAction;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.config.PluginConfig;
-import com.google.gerrit.server.config.PluginConfigFactory;
-import com.google.gerrit.server.config.ProjectConfigEntry;
-import com.google.gerrit.server.extensions.webui.UiActions;
-import com.google.gerrit.server.project.ProjectState.EffectiveMaxObjectSizeLimit;
-import java.util.Arrays;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.TreeMap;
-
-public class ConfigInfoImpl extends ConfigInfo {
-  public ConfigInfoImpl(
-      boolean serverEnableSignedPush,
-      ProjectControl control,
-      DynamicMap<ProjectConfigEntry> pluginConfigEntries,
-      PluginConfigFactory cfgFactory,
-      AllProjectsName allProjects,
-      UiActions uiActions,
-      DynamicMap<RestView<ProjectResource>> views) {
-    ProjectState projectState = control.getProjectState();
-    Project p = control.getProject();
-    this.description = Strings.emptyToNull(p.getDescription());
-
-    InheritedBooleanInfo useContributorAgreements = new InheritedBooleanInfo();
-    InheritedBooleanInfo useSignedOffBy = new InheritedBooleanInfo();
-    InheritedBooleanInfo useContentMerge = new InheritedBooleanInfo();
-    InheritedBooleanInfo requireChangeId = new InheritedBooleanInfo();
-    InheritedBooleanInfo createNewChangeForAllNotInTarget = new InheritedBooleanInfo();
-    InheritedBooleanInfo enableSignedPush = new InheritedBooleanInfo();
-    InheritedBooleanInfo requireSignedPush = new InheritedBooleanInfo();
-    InheritedBooleanInfo rejectImplicitMerges = new InheritedBooleanInfo();
-    InheritedBooleanInfo privateByDefault = new InheritedBooleanInfo();
-    InheritedBooleanInfo workInProgressByDefault = new InheritedBooleanInfo();
-    InheritedBooleanInfo enableReviewerByEmail = new InheritedBooleanInfo();
-    InheritedBooleanInfo matchAuthorToCommitterDate = new InheritedBooleanInfo();
-
-    useContributorAgreements.value = projectState.isUseContributorAgreements();
-    useSignedOffBy.value = projectState.isUseSignedOffBy();
-    useContentMerge.value = projectState.isUseContentMerge();
-    requireChangeId.value = projectState.isRequireChangeID();
-    createNewChangeForAllNotInTarget.value = projectState.isCreateNewChangeForAllNotInTarget();
-
-    useContributorAgreements.configuredValue = p.getUseContributorAgreements();
-    useSignedOffBy.configuredValue = p.getUseSignedOffBy();
-    useContentMerge.configuredValue = p.getUseContentMerge();
-    requireChangeId.configuredValue = p.getRequireChangeID();
-    createNewChangeForAllNotInTarget.configuredValue = p.getCreateNewChangeForAllNotInTarget();
-    enableSignedPush.configuredValue = p.getEnableSignedPush();
-    requireSignedPush.configuredValue = p.getRequireSignedPush();
-    rejectImplicitMerges.configuredValue = p.getRejectImplicitMerges();
-    privateByDefault.configuredValue = p.getPrivateByDefault();
-    workInProgressByDefault.configuredValue = p.getWorkInProgressByDefault();
-    enableReviewerByEmail.configuredValue = p.getEnableReviewerByEmail();
-    matchAuthorToCommitterDate.configuredValue = p.getMatchAuthorToCommitterDate();
-
-    ProjectState parentState = Iterables.getFirst(projectState.parents(), null);
-    if (parentState != null) {
-      useContributorAgreements.inheritedValue = parentState.isUseContributorAgreements();
-      useSignedOffBy.inheritedValue = parentState.isUseSignedOffBy();
-      useContentMerge.inheritedValue = parentState.isUseContentMerge();
-      requireChangeId.inheritedValue = parentState.isRequireChangeID();
-      createNewChangeForAllNotInTarget.inheritedValue =
-          parentState.isCreateNewChangeForAllNotInTarget();
-      enableSignedPush.inheritedValue = projectState.isEnableSignedPush();
-      requireSignedPush.inheritedValue = projectState.isRequireSignedPush();
-      privateByDefault.inheritedValue = projectState.isPrivateByDefault();
-      workInProgressByDefault.inheritedValue = projectState.isWorkInProgressByDefault();
-      rejectImplicitMerges.inheritedValue = projectState.isRejectImplicitMerges();
-      enableReviewerByEmail.inheritedValue = projectState.isEnableReviewerByEmail();
-      matchAuthorToCommitterDate.inheritedValue = projectState.isMatchAuthorToCommitterDate();
-    }
-
-    this.useContributorAgreements = useContributorAgreements;
-    this.useSignedOffBy = useSignedOffBy;
-    this.useContentMerge = useContentMerge;
-    this.requireChangeId = requireChangeId;
-    this.rejectImplicitMerges = rejectImplicitMerges;
-    this.createNewChangeForAllNotInTarget = createNewChangeForAllNotInTarget;
-    this.enableReviewerByEmail = enableReviewerByEmail;
-    this.matchAuthorToCommitterDate = matchAuthorToCommitterDate;
-    if (serverEnableSignedPush) {
-      this.enableSignedPush = enableSignedPush;
-      this.requireSignedPush = requireSignedPush;
-    }
-    this.privateByDefault = privateByDefault;
-    this.workInProgressByDefault = workInProgressByDefault;
-
-    this.maxObjectSizeLimit = getMaxObjectSizeLimit(projectState, p);
-
-    this.submitType = p.getSubmitType();
-    this.state =
-        p.getState() != com.google.gerrit.extensions.client.ProjectState.ACTIVE
-            ? p.getState()
-            : null;
-
-    this.commentlinks = new LinkedHashMap<>();
-    for (CommentLinkInfo cl : projectState.getCommentLinks()) {
-      this.commentlinks.put(cl.name, cl);
-    }
-
-    pluginConfig =
-        getPluginConfig(control.getProjectState(), pluginConfigEntries, cfgFactory, allProjects);
-
-    actions = new TreeMap<>();
-    for (UiAction.Description d : uiActions.from(views, new ProjectResource(control))) {
-      actions.put(d.getId(), new ActionInfo(d));
-    }
-    this.theme = projectState.getTheme();
-
-    this.extensionPanelNames = projectState.getConfig().getExtensionPanelSections();
-  }
-
-  private MaxObjectSizeLimitInfo getMaxObjectSizeLimit(ProjectState projectState, Project p) {
-    MaxObjectSizeLimitInfo info = new MaxObjectSizeLimitInfo();
-    EffectiveMaxObjectSizeLimit limit = projectState.getEffectiveMaxObjectSizeLimit();
-    long value = limit.value;
-    info.value = value == 0 ? null : String.valueOf(value);
-    info.configuredValue = p.getMaxObjectSizeLimit();
-    info.summary = limit.summary;
-    return info;
-  }
-
-  private Map<String, Map<String, ConfigParameterInfo>> getPluginConfig(
-      ProjectState project,
-      DynamicMap<ProjectConfigEntry> pluginConfigEntries,
-      PluginConfigFactory cfgFactory,
-      AllProjectsName allProjects) {
-    TreeMap<String, Map<String, ConfigParameterInfo>> pluginConfig = new TreeMap<>();
-    for (Entry<ProjectConfigEntry> e : pluginConfigEntries) {
-      ProjectConfigEntry configEntry = e.getProvider().get();
-      PluginConfig cfg = cfgFactory.getFromProjectConfig(project, e.getPluginName());
-      String configuredValue = cfg.getString(e.getExportName());
-      ConfigParameterInfo p = new ConfigParameterInfo();
-      p.displayName = configEntry.getDisplayName();
-      p.description = configEntry.getDescription();
-      p.warning = configEntry.getWarning(project);
-      p.type = configEntry.getType();
-      p.permittedValues = configEntry.getPermittedValues();
-      p.editable = configEntry.isEditable(project) ? true : null;
-      if (configEntry.isInheritable() && !allProjects.equals(project.getNameKey())) {
-        PluginConfig cfgWithInheritance =
-            cfgFactory.getFromProjectConfigWithInheritance(project, e.getPluginName());
-        p.inheritable = true;
-        p.value =
-            configEntry.onRead(
-                project,
-                cfgWithInheritance.getString(e.getExportName(), configEntry.getDefaultValue()));
-        p.configuredValue = configuredValue;
-        p.inheritedValue = getInheritedValue(project, cfgFactory, e);
-      } else {
-        if (configEntry.getType() == ProjectConfigEntryType.ARRAY) {
-          p.values =
-              configEntry.onRead(project, Arrays.asList(cfg.getStringList(e.getExportName())));
-        } else {
-          p.value =
-              configEntry.onRead(
-                  project,
-                  configuredValue != null ? configuredValue : configEntry.getDefaultValue());
-        }
-      }
-      Map<String, ConfigParameterInfo> pc = pluginConfig.get(e.getPluginName());
-      if (pc == null) {
-        pc = new TreeMap<>();
-        pluginConfig.put(e.getPluginName(), pc);
-      }
-      pc.put(e.getExportName(), p);
-    }
-    return !pluginConfig.isEmpty() ? pluginConfig : null;
-  }
-
-  private String getInheritedValue(
-      ProjectState project, PluginConfigFactory cfgFactory, Entry<ProjectConfigEntry> e) {
-    ProjectConfigEntry configEntry = e.getProvider().get();
-    ProjectState parent = Iterables.getFirst(project.parents(), null);
-    String inheritedValue = configEntry.getDefaultValue();
-    if (parent != null) {
-      PluginConfig parentCfgWithInheritance =
-          cfgFactory.getFromProjectConfigWithInheritance(parent, e.getPluginName());
-      inheritedValue =
-          parentCfgWithInheritance.getString(e.getExportName(), configEntry.getDefaultValue());
-    }
-    return inheritedValue;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ContributorAgreementsChecker.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ContributorAgreementsChecker.java
deleted file mode 100644
index 0033b12..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ContributorAgreementsChecker.java
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.project;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.PageLinks;
-import com.google.gerrit.common.data.ContributorAgreement;
-import com.google.gerrit.common.data.PermissionRule;
-import com.google.gerrit.common.data.PermissionRule.Action;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.AccountGroup.UUID;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.config.CanonicalWebUrl;
-import com.google.gerrit.server.project.ProjectControl.Metrics;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-@Singleton
-public class ContributorAgreementsChecker {
-
-  private final String canonicalWebUrl;
-  private final ProjectCache projectCache;
-  private final Metrics metrics;
-
-  @Inject
-  ContributorAgreementsChecker(
-      @CanonicalWebUrl @Nullable String canonicalWebUrl,
-      ProjectCache projectCache,
-      Metrics metrics) {
-    this.canonicalWebUrl = canonicalWebUrl;
-    this.projectCache = projectCache;
-    this.metrics = metrics;
-  }
-
-  /**
-   * Checks if the user has signed a contributor agreement for the project.
-   *
-   * @throws AuthException if the user has not signed a contributor agreement for the project
-   * @throws IOException if project states could not be loaded
-   */
-  public void check(Project.NameKey project, CurrentUser user) throws IOException, AuthException {
-    metrics.claCheckCount.increment();
-
-    ProjectState projectState = projectCache.checkedGet(project);
-    if (projectState == null) {
-      throw new IOException("Can't load All-Projects");
-    }
-
-    if (!projectState.isUseContributorAgreements()) {
-      return;
-    }
-
-    if (!user.isIdentifiedUser()) {
-      throw new AuthException("Must be logged in to verify Contributor Agreement");
-    }
-
-    IdentifiedUser iUser = user.asIdentifiedUser();
-    Collection<ContributorAgreement> contributorAgreements =
-        projectCache.getAllProjects().getConfig().getContributorAgreements();
-    List<UUID> okGroupIds = new ArrayList<>();
-    for (ContributorAgreement ca : contributorAgreements) {
-      List<AccountGroup.UUID> groupIds;
-      groupIds = okGroupIds;
-
-      for (PermissionRule rule : ca.getAccepted()) {
-        if ((rule.getAction() == Action.ALLOW)
-            && (rule.getGroup() != null)
-            && (rule.getGroup().getUUID() != null)) {
-          groupIds.add(new AccountGroup.UUID(rule.getGroup().getUUID().get()));
-        }
-      }
-    }
-
-    if (!iUser.getEffectiveGroups().containsAnyOf(okGroupIds)) {
-      final StringBuilder msg = new StringBuilder();
-      msg.append("A Contributor Agreement must be completed before uploading");
-      if (canonicalWebUrl != null) {
-        msg.append(":\n\n  ");
-        msg.append(canonicalWebUrl);
-        msg.append("#");
-        msg.append(PageLinks.SETTINGS_AGREEMENTS);
-        msg.append("\n");
-      } else {
-        msg.append(".");
-      }
-      throw new AuthException(msg.toString());
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateAccessChange.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateAccessChange.java
deleted file mode 100644
index 459a413..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateAccessChange.java
+++ /dev/null
@@ -1,165 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.project;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.common.data.AccessSection;
-import com.google.gerrit.common.errors.InvalidNameException;
-import com.google.gerrit.common.errors.PermissionDeniedException;
-import com.google.gerrit.extensions.api.access.ProjectAccessInput;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.Sequences;
-import com.google.gerrit.server.change.ChangeInserter;
-import com.google.gerrit.server.change.ChangeJson;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.RefPermission;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.update.UpdateException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.List;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-@Singleton
-public class CreateAccessChange implements RestModifyView<ProjectResource, ProjectAccessInput> {
-  private final PermissionBackend permissionBackend;
-  private final Sequences seq;
-  private final ChangeInserter.Factory changeInserterFactory;
-  private final BatchUpdate.Factory updateFactory;
-  private final Provider<MetaDataUpdate.User> metaDataUpdateFactory;
-  private final Provider<ReviewDb> db;
-  private final SetAccessUtil setAccess;
-  private final ChangeJson.Factory jsonFactory;
-
-  @Inject
-  CreateAccessChange(
-      PermissionBackend permissionBackend,
-      ChangeInserter.Factory changeInserterFactory,
-      BatchUpdate.Factory updateFactory,
-      Sequences seq,
-      Provider<MetaDataUpdate.User> metaDataUpdateFactory,
-      Provider<ReviewDb> db,
-      SetAccessUtil accessUtil,
-      ChangeJson.Factory jsonFactory) {
-    this.permissionBackend = permissionBackend;
-    this.seq = seq;
-    this.changeInserterFactory = changeInserterFactory;
-    this.updateFactory = updateFactory;
-    this.metaDataUpdateFactory = metaDataUpdateFactory;
-    this.db = db;
-    this.setAccess = accessUtil;
-    this.jsonFactory = jsonFactory;
-  }
-
-  @Override
-  public Response<ChangeInfo> apply(ProjectResource rsrc, ProjectAccessInput input)
-      throws PermissionBackendException, PermissionDeniedException, IOException,
-          ConfigInvalidException, OrmException, InvalidNameException, UpdateException,
-          RestApiException {
-    MetaDataUpdate.User metaDataUpdateUser = metaDataUpdateFactory.get();
-    List<AccessSection> removals = setAccess.getAccessSections(input.remove);
-    List<AccessSection> additions = setAccess.getAccessSections(input.add);
-
-    PermissionBackend.ForRef metaRef =
-        permissionBackend.user(rsrc.getUser()).project(rsrc.getNameKey()).ref(RefNames.REFS_CONFIG);
-    try {
-      metaRef.check(RefPermission.READ);
-    } catch (AuthException denied) {
-      throw new PermissionDeniedException(RefNames.REFS_CONFIG + " not visible");
-    }
-    if (!rsrc.getControl().isOwner()) {
-      try {
-        metaRef.check(RefPermission.CREATE_CHANGE);
-      } catch (AuthException denied) {
-        throw new PermissionDeniedException("cannot create change for " + RefNames.REFS_CONFIG);
-      }
-    }
-
-    Project.NameKey newParentProjectName =
-        input.parent == null ? null : new Project.NameKey(input.parent);
-
-    try (MetaDataUpdate md = metaDataUpdateUser.create(rsrc.getNameKey())) {
-      ProjectConfig config = ProjectConfig.read(md);
-
-      setAccess.validateChanges(config, removals, additions);
-      setAccess.applyChanges(config, removals, additions);
-      try {
-        setAccess.setParentName(
-            rsrc.getUser().asIdentifiedUser(),
-            config,
-            rsrc.getNameKey(),
-            newParentProjectName,
-            false);
-      } catch (AuthException e) {
-        throw new IllegalStateException(e);
-      }
-
-      md.setMessage("Review access change");
-      md.setInsertChangeId(true);
-      Change.Id changeId = new Change.Id(seq.nextChangeId());
-      RevCommit commit =
-          config.commitToNewRef(
-              md, new PatchSet.Id(changeId, Change.INITIAL_PATCH_SET_ID).toRefName());
-
-      try (ObjectInserter objInserter = md.getRepository().newObjectInserter();
-          ObjectReader objReader = objInserter.newReader();
-          RevWalk rw = new RevWalk(objReader);
-          BatchUpdate bu =
-              updateFactory.create(db.get(), rsrc.getNameKey(), rsrc.getUser(), TimeUtil.nowTs())) {
-        bu.setRepository(md.getRepository(), rw, objInserter);
-        ChangeInserter ins = newInserter(changeId, commit);
-        bu.insertChange(ins);
-        bu.execute();
-        return Response.created(jsonFactory.noOptions().format(ins.getChange()));
-      }
-    } catch (InvalidNameException e) {
-      throw new BadRequestException(e.toString());
-    }
-  }
-
-  // ProjectConfig doesn't currently support fusing into a BatchUpdate.
-  @SuppressWarnings("deprecation")
-  private ChangeInserter newInserter(Change.Id changeId, RevCommit commit) {
-    return changeInserterFactory
-        .create(changeId, commit, RefNames.REFS_CONFIG)
-        .setMessage(
-            // Same message as in ReceiveCommits.CreateRequest.
-            ApprovalsUtil.renderMessageWithApprovals(1, ImmutableMap.of(), ImmutableMap.of()))
-        .setValidate(false)
-        .setUpdateRef(false);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateBranch.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateBranch.java
deleted file mode 100644
index 0a648d9..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateBranch.java
+++ /dev/null
@@ -1,191 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.api.projects.BranchInfo;
-import com.google.gerrit.extensions.api.projects.BranchInput;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.RefPermission;
-import com.google.gerrit.server.util.MagicBranch;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import org.eclipse.jgit.errors.IncorrectObjectTypeException;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevObject;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.ReceiveCommand;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class CreateBranch implements RestModifyView<ProjectResource, BranchInput> {
-  private static final Logger log = LoggerFactory.getLogger(CreateBranch.class);
-
-  public interface Factory {
-    CreateBranch create(String ref);
-  }
-
-  private final Provider<IdentifiedUser> identifiedUser;
-  private final PermissionBackend permissionBackend;
-  private final GitRepositoryManager repoManager;
-  private final GitReferenceUpdated referenceUpdated;
-  private final RefValidationHelper refCreationValidator;
-  private final CreateRefControl createRefControl;
-  private String ref;
-
-  @Inject
-  CreateBranch(
-      Provider<IdentifiedUser> identifiedUser,
-      PermissionBackend permissionBackend,
-      GitRepositoryManager repoManager,
-      GitReferenceUpdated referenceUpdated,
-      RefValidationHelper.Factory refHelperFactory,
-      CreateRefControl createRefControl,
-      @Assisted String ref) {
-    this.identifiedUser = identifiedUser;
-    this.permissionBackend = permissionBackend;
-    this.repoManager = repoManager;
-    this.referenceUpdated = referenceUpdated;
-    this.refCreationValidator = refHelperFactory.create(ReceiveCommand.Type.CREATE);
-    this.createRefControl = createRefControl;
-    this.ref = ref;
-  }
-
-  @Override
-  public BranchInfo apply(ProjectResource rsrc, BranchInput input)
-      throws BadRequestException, AuthException, ResourceConflictException, IOException,
-          PermissionBackendException, NoSuchProjectException {
-    if (input == null) {
-      input = new BranchInput();
-    }
-    if (input.ref != null && !ref.equals(input.ref)) {
-      throw new BadRequestException("ref must match URL");
-    }
-    if (input.revision == null) {
-      input.revision = Constants.HEAD;
-    }
-    while (ref.startsWith("/")) {
-      ref = ref.substring(1);
-    }
-    ref = RefNames.fullName(ref);
-    if (!Repository.isValidRefName(ref)) {
-      throw new BadRequestException("invalid branch name \"" + ref + "\"");
-    }
-    if (MagicBranch.isMagicBranch(ref)) {
-      throw new BadRequestException(
-          "not allowed to create branches under \""
-              + MagicBranch.getMagicRefNamePrefix(ref)
-              + "\"");
-    }
-
-    final Branch.NameKey name = new Branch.NameKey(rsrc.getNameKey(), ref);
-    try (Repository repo = repoManager.openRepository(rsrc.getNameKey())) {
-      ObjectId revid = RefUtil.parseBaseRevision(repo, rsrc.getNameKey(), input.revision);
-      RevWalk rw = RefUtil.verifyConnected(repo, revid);
-      RevObject object = rw.parseAny(revid);
-
-      if (ref.startsWith(Constants.R_HEADS)) {
-        // Ensure that what we start the branch from is a commit. If we
-        // were given a tag, deference to the commit instead.
-        //
-        try {
-          object = rw.parseCommit(object);
-        } catch (IncorrectObjectTypeException notCommit) {
-          throw new BadRequestException("\"" + input.revision + "\" not a commit");
-        }
-      }
-
-      createRefControl.checkCreateRef(identifiedUser, repo, name, object);
-
-      try {
-        final RefUpdate u = repo.updateRef(ref);
-        u.setExpectedOldObjectId(ObjectId.zeroId());
-        u.setNewObjectId(object.copy());
-        u.setRefLogIdent(identifiedUser.get().newRefLogIdent());
-        u.setRefLogMessage("created via REST from " + input.revision, false);
-        refCreationValidator.validateRefOperation(rsrc.getName(), identifiedUser.get(), u);
-        final RefUpdate.Result result = u.update(rw);
-        switch (result) {
-          case FAST_FORWARD:
-          case NEW:
-          case NO_CHANGE:
-            referenceUpdated.fire(
-                name.getParentKey(),
-                u,
-                ReceiveCommand.Type.CREATE,
-                identifiedUser.get().getAccount());
-            break;
-          case LOCK_FAILURE:
-            if (repo.getRefDatabase().exactRef(ref) != null) {
-              throw new ResourceConflictException("branch \"" + ref + "\" already exists");
-            }
-            String refPrefix = RefUtil.getRefPrefix(ref);
-            while (!Constants.R_HEADS.equals(refPrefix)) {
-              if (repo.getRefDatabase().exactRef(refPrefix) != null) {
-                throw new ResourceConflictException(
-                    "Cannot create branch \""
-                        + ref
-                        + "\" since it conflicts with branch \""
-                        + refPrefix
-                        + "\".");
-              }
-              refPrefix = RefUtil.getRefPrefix(refPrefix);
-            }
-            // $FALL-THROUGH$
-          case FORCED:
-          case IO_FAILURE:
-          case NOT_ATTEMPTED:
-          case REJECTED:
-          case REJECTED_CURRENT_BRANCH:
-          case RENAMED:
-          case REJECTED_MISSING_OBJECT:
-          case REJECTED_OTHER_REASON:
-          default:
-            {
-              throw new IOException(result.name());
-            }
-        }
-
-        BranchInfo info = new BranchInfo();
-        info.ref = ref;
-        info.revision = revid.getName();
-        info.canDelete =
-            permissionBackend.user(identifiedUser).ref(name).testOrFalse(RefPermission.DELETE)
-                ? true
-                : null;
-        return info;
-      } catch (IOException err) {
-        log.error("Cannot create branch \"" + name + "\"", err);
-        throw err;
-      }
-    } catch (RefUtil.InvalidRevisionException e) {
-      throw new BadRequestException("invalid revision \"" + input.revision + "\"");
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateProject.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateProject.java
deleted file mode 100644
index bd8f11e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateProject.java
+++ /dev/null
@@ -1,400 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.project;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Strings;
-import com.google.common.collect.Lists;
-import com.google.gerrit.common.ProjectUtil;
-import com.google.gerrit.common.data.AccessSection;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.common.data.PermissionRule;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
-import com.google.gerrit.extensions.api.projects.ConfigInput;
-import com.google.gerrit.extensions.api.projects.ProjectInput;
-import com.google.gerrit.extensions.client.InheritableBoolean;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.extensions.common.ProjectInfo;
-import com.google.gerrit.extensions.events.NewProjectCreatedListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.config.ProjectOwnerGroupsProvider;
-import com.google.gerrit.server.config.RepositoryConfig;
-import com.google.gerrit.server.extensions.events.AbstractNoNotifyEvent;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.git.RepositoryCaseMismatchException;
-import com.google.gerrit.server.group.GroupsCollection;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.validators.ProjectCreationValidationListener;
-import com.google.gerrit.server.validators.ValidationException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.RefUpdate.Result;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.transport.ReceiveCommand;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@RequiresCapability(GlobalCapability.CREATE_PROJECT)
-public class CreateProject implements RestModifyView<TopLevelResource, ProjectInput> {
-  public interface Factory {
-    CreateProject create(String name);
-  }
-
-  private static final Logger log = LoggerFactory.getLogger(CreateProject.class);
-
-  private final Provider<ProjectsCollection> projectsCollection;
-  private final Provider<GroupsCollection> groupsCollection;
-  private final DynamicSet<ProjectCreationValidationListener> projectCreationValidationListeners;
-  private final ProjectJson json;
-  private final GitRepositoryManager repoManager;
-  private final DynamicSet<NewProjectCreatedListener> createdListeners;
-  private final ProjectCache projectCache;
-  private final GroupBackend groupBackend;
-  private final ProjectOwnerGroupsProvider.Factory projectOwnerGroups;
-  private final MetaDataUpdate.User metaDataUpdateFactory;
-  private final GitReferenceUpdated referenceUpdated;
-  private final RepositoryConfig repositoryCfg;
-  private final PersonIdent serverIdent;
-  private final Provider<IdentifiedUser> identifiedUser;
-  private final Provider<PutConfig> putConfig;
-  private final AllProjectsName allProjects;
-  private final String name;
-
-  @Inject
-  CreateProject(
-      Provider<ProjectsCollection> projectsCollection,
-      Provider<GroupsCollection> groupsCollection,
-      ProjectJson json,
-      DynamicSet<ProjectCreationValidationListener> projectCreationValidationListeners,
-      GitRepositoryManager repoManager,
-      DynamicSet<NewProjectCreatedListener> createdListeners,
-      ProjectCache projectCache,
-      GroupBackend groupBackend,
-      ProjectOwnerGroupsProvider.Factory projectOwnerGroups,
-      MetaDataUpdate.User metaDataUpdateFactory,
-      GitReferenceUpdated referenceUpdated,
-      RepositoryConfig repositoryCfg,
-      @GerritPersonIdent PersonIdent serverIdent,
-      Provider<IdentifiedUser> identifiedUser,
-      Provider<PutConfig> putConfig,
-      AllProjectsName allProjects,
-      @Assisted String name) {
-    this.projectsCollection = projectsCollection;
-    this.groupsCollection = groupsCollection;
-    this.projectCreationValidationListeners = projectCreationValidationListeners;
-    this.json = json;
-    this.repoManager = repoManager;
-    this.createdListeners = createdListeners;
-    this.projectCache = projectCache;
-    this.groupBackend = groupBackend;
-    this.projectOwnerGroups = projectOwnerGroups;
-    this.metaDataUpdateFactory = metaDataUpdateFactory;
-    this.referenceUpdated = referenceUpdated;
-    this.repositoryCfg = repositoryCfg;
-    this.serverIdent = serverIdent;
-    this.identifiedUser = identifiedUser;
-    this.putConfig = putConfig;
-    this.allProjects = allProjects;
-    this.name = name;
-  }
-
-  @Override
-  public Response<ProjectInfo> apply(TopLevelResource resource, ProjectInput input)
-      throws BadRequestException, UnprocessableEntityException, ResourceConflictException,
-          ResourceNotFoundException, IOException, ConfigInvalidException,
-          PermissionBackendException {
-    if (input == null) {
-      input = new ProjectInput();
-    }
-    if (input.name != null && !name.equals(input.name)) {
-      throw new BadRequestException("name must match URL");
-    }
-
-    CreateProjectArgs args = new CreateProjectArgs();
-    args.setProjectName(ProjectUtil.stripGitSuffix(name));
-
-    String parentName =
-        MoreObjects.firstNonNull(Strings.emptyToNull(input.parent), allProjects.get());
-    args.newParent = projectsCollection.get().parse(parentName, false).getNameKey();
-    args.createEmptyCommit = input.createEmptyCommit;
-    args.permissionsOnly = input.permissionsOnly;
-    args.projectDescription = Strings.emptyToNull(input.description);
-    args.submitType = input.submitType;
-    args.branch = normalizeBranchNames(input.branches);
-    if (input.owners == null || input.owners.isEmpty()) {
-      args.ownerIds = new ArrayList<>(projectOwnerGroups.create(args.getProject()).get());
-    } else {
-      args.ownerIds = Lists.newArrayListWithCapacity(input.owners.size());
-      for (String owner : input.owners) {
-        args.ownerIds.add(groupsCollection.get().parse(owner).getGroupUUID());
-      }
-    }
-    args.contributorAgreements =
-        MoreObjects.firstNonNull(input.useContributorAgreements, InheritableBoolean.INHERIT);
-    args.signedOffBy = MoreObjects.firstNonNull(input.useSignedOffBy, InheritableBoolean.INHERIT);
-    args.contentMerge =
-        input.submitType == SubmitType.FAST_FORWARD_ONLY
-            ? InheritableBoolean.FALSE
-            : MoreObjects.firstNonNull(input.useContentMerge, InheritableBoolean.INHERIT);
-    args.newChangeForAllNotInTarget =
-        MoreObjects.firstNonNull(
-            input.createNewChangeForAllNotInTarget, InheritableBoolean.INHERIT);
-    args.changeIdRequired =
-        MoreObjects.firstNonNull(input.requireChangeId, InheritableBoolean.INHERIT);
-    args.enableSignedPush =
-        MoreObjects.firstNonNull(input.enableSignedPush, InheritableBoolean.INHERIT);
-    args.requireSignedPush =
-        MoreObjects.firstNonNull(input.requireSignedPush, InheritableBoolean.INHERIT);
-    try {
-      args.maxObjectSizeLimit = ProjectConfig.validMaxObjectSizeLimit(input.maxObjectSizeLimit);
-    } catch (ConfigInvalidException e) {
-      throw new BadRequestException(e.getMessage());
-    }
-
-    for (ProjectCreationValidationListener l : projectCreationValidationListeners) {
-      try {
-        l.validateNewProject(args);
-      } catch (ValidationException e) {
-        throw new ResourceConflictException(e.getMessage(), e);
-      }
-    }
-
-    ProjectState projectState = createProject(args);
-    if (input.pluginConfigValues != null) {
-      ConfigInput in = new ConfigInput();
-      in.pluginConfigValues = input.pluginConfigValues;
-      putConfig.get().apply(projectState, in);
-    }
-
-    return Response.created(json.format(projectState));
-  }
-
-  private ProjectState createProject(CreateProjectArgs args)
-      throws BadRequestException, ResourceConflictException, IOException, ConfigInvalidException {
-    final Project.NameKey nameKey = args.getProject();
-    try {
-      final String head = args.permissionsOnly ? RefNames.REFS_CONFIG : args.branch.get(0);
-      try (Repository repo = repoManager.openRepository(nameKey)) {
-        if (repo.getObjectDatabase().exists()) {
-          throw new ResourceConflictException("project \"" + nameKey + "\" exists");
-        }
-      } catch (RepositoryNotFoundException e) {
-        // It does not exist, safe to ignore.
-      }
-      try (Repository repo = repoManager.createRepository(nameKey)) {
-        RefUpdate u = repo.updateRef(Constants.HEAD);
-        u.disableRefLog();
-        u.link(head);
-
-        createProjectConfig(args);
-
-        if (!args.permissionsOnly && args.createEmptyCommit) {
-          createEmptyCommits(repo, nameKey, args.branch);
-        }
-
-        fire(nameKey, head);
-
-        return projectCache.get(nameKey);
-      }
-    } catch (RepositoryCaseMismatchException e) {
-      throw new ResourceConflictException(
-          "Cannot create "
-              + nameKey.get()
-              + " because the name is already occupied by another project."
-              + " The other project has the same name, only spelled in a"
-              + " different case.");
-    } catch (RepositoryNotFoundException badName) {
-      throw new BadRequestException("invalid project name: " + nameKey);
-    } catch (ConfigInvalidException e) {
-      String msg = "Cannot create " + nameKey;
-      log.error(msg, e);
-      throw e;
-    }
-  }
-
-  private void createProjectConfig(CreateProjectArgs args)
-      throws IOException, ConfigInvalidException {
-    try (MetaDataUpdate md = metaDataUpdateFactory.create(args.getProject())) {
-      ProjectConfig config = ProjectConfig.read(md);
-
-      Project newProject = config.getProject();
-      newProject.setDescription(args.projectDescription);
-      newProject.setSubmitType(
-          MoreObjects.firstNonNull(
-              args.submitType, repositoryCfg.getDefaultSubmitType(args.getProject())));
-      newProject.setUseContributorAgreements(args.contributorAgreements);
-      newProject.setUseSignedOffBy(args.signedOffBy);
-      newProject.setUseContentMerge(args.contentMerge);
-      newProject.setCreateNewChangeForAllNotInTarget(args.newChangeForAllNotInTarget);
-      newProject.setRequireChangeID(args.changeIdRequired);
-      newProject.setMaxObjectSizeLimit(args.maxObjectSizeLimit);
-      newProject.setEnableSignedPush(args.enableSignedPush);
-      newProject.setRequireSignedPush(args.requireSignedPush);
-      if (args.newParent != null) {
-        newProject.setParentName(args.newParent);
-      }
-
-      if (!args.ownerIds.isEmpty()) {
-        AccessSection all = config.getAccessSection(AccessSection.ALL, true);
-        for (AccountGroup.UUID ownerId : args.ownerIds) {
-          GroupDescription.Basic g = groupBackend.get(ownerId);
-          if (g != null) {
-            GroupReference group = config.resolve(GroupReference.forGroup(g));
-            all.getPermission(Permission.OWNER, true).add(new PermissionRule(group));
-          }
-        }
-      }
-
-      md.setMessage("Created project\n");
-      config.commit(md);
-      md.getRepository().setGitwebDescription(args.projectDescription);
-    }
-    projectCache.onCreateProject(args.getProject());
-  }
-
-  private List<String> normalizeBranchNames(List<String> branches) throws BadRequestException {
-    if (branches == null || branches.isEmpty()) {
-      return Collections.singletonList(Constants.R_HEADS + Constants.MASTER);
-    }
-
-    List<String> normalizedBranches = new ArrayList<>();
-    for (String branch : branches) {
-      while (branch.startsWith("/")) {
-        branch = branch.substring(1);
-      }
-      branch = RefNames.fullName(branch);
-      if (!Repository.isValidRefName(branch)) {
-        throw new BadRequestException(String.format("Branch \"%s\" is not a valid name.", branch));
-      }
-      if (!normalizedBranches.contains(branch)) {
-        normalizedBranches.add(branch);
-      }
-    }
-    return normalizedBranches;
-  }
-
-  private void createEmptyCommits(Repository repo, Project.NameKey project, List<String> refs)
-      throws IOException {
-    try (ObjectInserter oi = repo.newObjectInserter()) {
-      CommitBuilder cb = new CommitBuilder();
-      cb.setTreeId(oi.insert(Constants.OBJ_TREE, new byte[] {}));
-      cb.setAuthor(metaDataUpdateFactory.getUserPersonIdent());
-      cb.setCommitter(serverIdent);
-      cb.setMessage("Initial empty repository\n");
-
-      ObjectId id = oi.insert(cb);
-      oi.flush();
-
-      for (String ref : refs) {
-        RefUpdate ru = repo.updateRef(ref);
-        ru.setNewObjectId(id);
-        Result result = ru.update();
-        switch (result) {
-          case NEW:
-            referenceUpdated.fire(
-                project, ru, ReceiveCommand.Type.CREATE, identifiedUser.get().getAccount());
-            break;
-          case FAST_FORWARD:
-          case FORCED:
-          case IO_FAILURE:
-          case LOCK_FAILURE:
-          case NOT_ATTEMPTED:
-          case NO_CHANGE:
-          case REJECTED:
-          case REJECTED_CURRENT_BRANCH:
-          case RENAMED:
-          case REJECTED_MISSING_OBJECT:
-          case REJECTED_OTHER_REASON:
-          default:
-            {
-              throw new IOException(
-                  String.format("Failed to create ref \"%s\": %s", ref, result.name()));
-            }
-        }
-      }
-    } catch (IOException e) {
-      log.error("Cannot create empty commit for " + project.get(), e);
-      throw e;
-    }
-  }
-
-  private void fire(Project.NameKey name, String head) {
-    if (!createdListeners.iterator().hasNext()) {
-      return;
-    }
-
-    Event event = new Event(name, head);
-    for (NewProjectCreatedListener l : createdListeners) {
-      try {
-        l.onNewProjectCreated(event);
-      } catch (RuntimeException e) {
-        log.warn("Failure in NewProjectCreatedListener", e);
-      }
-    }
-  }
-
-  static class Event extends AbstractNoNotifyEvent implements NewProjectCreatedListener.Event {
-    private final Project.NameKey name;
-    private final String head;
-
-    Event(Project.NameKey name, String head) {
-      this.name = name;
-      this.head = head;
-    }
-
-    @Override
-    public String getProjectName() {
-      return name.get();
-    }
-
-    @Override
-    public String getHeadName() {
-      return head;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateProjectArgs.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateProjectArgs.java
deleted file mode 100644
index 01f456e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateProjectArgs.java
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.client.InheritableBoolean;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Project;
-import java.util.List;
-
-public class CreateProjectArgs {
-
-  private Project.NameKey projectName;
-  public List<AccountGroup.UUID> ownerIds;
-  public Project.NameKey newParent;
-  public String projectDescription;
-  public SubmitType submitType;
-  public InheritableBoolean contributorAgreements;
-  public InheritableBoolean signedOffBy;
-  public boolean permissionsOnly;
-  public List<String> branch;
-  public InheritableBoolean contentMerge;
-  public InheritableBoolean newChangeForAllNotInTarget;
-  public InheritableBoolean changeIdRequired;
-  public InheritableBoolean enableSignedPush;
-  public InheritableBoolean requireSignedPush;
-  public boolean createEmptyCommit;
-  public String maxObjectSizeLimit;
-
-  public CreateProjectArgs() {
-    contributorAgreements = InheritableBoolean.INHERIT;
-    signedOffBy = InheritableBoolean.INHERIT;
-    contentMerge = InheritableBoolean.INHERIT;
-    changeIdRequired = InheritableBoolean.INHERIT;
-    newChangeForAllNotInTarget = InheritableBoolean.INHERIT;
-    enableSignedPush = InheritableBoolean.INHERIT;
-    requireSignedPush = InheritableBoolean.INHERIT;
-    submitType = SubmitType.MERGE_IF_NECESSARY;
-  }
-
-  public Project.NameKey getProject() {
-    return projectName;
-  }
-
-  public String getProjectName() {
-    return projectName != null ? projectName.get() : null;
-  }
-
-  public void setProjectName(String n) {
-    projectName = n != null ? new Project.NameKey(n) : null;
-  }
-
-  public void setProjectName(Project.NameKey n) {
-    projectName = n;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateRefControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateRefControl.java
deleted file mode 100644
index 3be260e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateRefControl.java
+++ /dev/null
@@ -1,149 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.project;
-
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.RefPermission;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevObject;
-import org.eclipse.jgit.revwalk.RevTag;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Manages access control for creating Git references (aka branches, tags). */
-@Singleton
-public class CreateRefControl {
-  private static final Logger log = LoggerFactory.getLogger(CreateRefControl.class);
-
-  private final PermissionBackend permissionBackend;
-  private final ProjectCache projectCache;
-
-  @Inject
-  CreateRefControl(PermissionBackend permissionBackend, ProjectCache projectCache) {
-    this.permissionBackend = permissionBackend;
-    this.projectCache = projectCache;
-  }
-
-  /**
-   * Checks whether the {@link CurrentUser} can create a new Git ref.
-   *
-   * @param user the user performing the operation
-   * @param repo repository on which user want to create
-   * @param branch the branch the new {@link RevObject} should be created on
-   * @param object the object the user will start the reference with
-   * @throws AuthException if creation is denied; the message explains the denial.
-   * @throws PermissionBackendException on failure of permission checks.
-   */
-  public void checkCreateRef(
-      Provider<? extends CurrentUser> user,
-      Repository repo,
-      Branch.NameKey branch,
-      RevObject object)
-      throws AuthException, PermissionBackendException, NoSuchProjectException, IOException {
-    ProjectState ps = projectCache.checkedGet(branch.getParentKey());
-    if (ps == null) {
-      throw new NoSuchProjectException(branch.getParentKey());
-    }
-    if (!ps.getProject().getState().permitsWrite()) {
-      throw new AuthException("project state does not permit write");
-    }
-
-    PermissionBackend.ForRef perm = permissionBackend.user(user).ref(branch);
-    if (object instanceof RevCommit) {
-      perm.check(RefPermission.CREATE);
-      checkCreateCommit(user, repo, (RevCommit) object, ps, perm);
-    } else if (object instanceof RevTag) {
-      RevTag tag = (RevTag) object;
-      try (RevWalk rw = new RevWalk(repo)) {
-        rw.parseBody(tag);
-      } catch (IOException e) {
-        log.error("RevWalk({}) parsing {}:", branch.getParentKey(), tag.name(), e);
-        throw e;
-      }
-
-      // If tagger is present, require it matches the user's email.
-      PersonIdent tagger = tag.getTaggerIdent();
-      if (tagger != null
-          && (!user.get().isIdentifiedUser()
-              || !user.get().asIdentifiedUser().hasEmailAddress(tagger.getEmailAddress()))) {
-        perm.check(RefPermission.FORGE_COMMITTER);
-      }
-
-      RevObject target = tag.getObject();
-      if (target instanceof RevCommit) {
-        checkCreateCommit(user, repo, (RevCommit) target, ps, perm);
-      } else {
-        checkCreateRef(user, repo, branch, target);
-      }
-
-      // If the tag has a PGP signature, allow a lower level of permission
-      // than if it doesn't have a PGP signature.
-      RefControl refControl = ps.controlFor(user.get()).controlForRef(branch);
-      if (tag.getFullMessage().contains("-----BEGIN PGP SIGNATURE-----\n")) {
-        if (!refControl.canPerform(Permission.CREATE_SIGNED_TAG)) {
-          throw new AuthException(Permission.CREATE_SIGNED_TAG + " not permitted");
-        }
-      } else if (!refControl.canPerform(Permission.CREATE_TAG)) {
-        throw new AuthException(Permission.CREATE_TAG + " not permitted");
-      }
-    }
-  }
-
-  /**
-   * Check if the user is allowed to create a new commit object if this creation would introduce a
-   * new commit to the repository.
-   */
-  private void checkCreateCommit(
-      Provider<? extends CurrentUser> user,
-      Repository repo,
-      RevCommit commit,
-      ProjectState projectState,
-      PermissionBackend.ForRef forRef)
-      throws AuthException, PermissionBackendException {
-    try {
-      // If the user has update (push) permission, they can create the ref regardless
-      // of whether they are pushing any new objects along with the create.
-      forRef.check(RefPermission.UPDATE);
-      return;
-    } catch (AuthException denied) {
-      // Fall through to check reachability.
-    }
-
-    if (projectState.controlFor(user.get()).isReachableFromHeadsOrTags(repo, commit)) {
-      // If the user has no push permissions, check whether the object is
-      // merged into a branch or tag readable by this user. If so, they are
-      // not effectively "pushing" more objects, so they can create the ref
-      // even if they don't have push permission.
-      return;
-    }
-
-    throw new AuthException(
-        String.format(
-            "%s for creating new commit object not permitted",
-            RefPermission.UPDATE.describeForException()));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateTag.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateTag.java
deleted file mode 100644
index 61548c4..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateTag.java
+++ /dev/null
@@ -1,160 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.project;
-
-import static org.eclipse.jgit.lib.Constants.R_TAGS;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.projects.TagInfo;
-import com.google.gerrit.extensions.api.projects.TagInput;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.WebLinks;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.TagCache;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.RefPermission;
-import com.google.gerrit.server.project.RefUtil.InvalidRevisionException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.util.TimeZone;
-import org.eclipse.jgit.api.Git;
-import org.eclipse.jgit.api.TagCommand;
-import org.eclipse.jgit.api.errors.GitAPIException;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevObject;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class CreateTag implements RestModifyView<ProjectResource, TagInput> {
-  private static final Logger log = LoggerFactory.getLogger(CreateTag.class);
-
-  public interface Factory {
-    CreateTag create(String ref);
-  }
-
-  private final PermissionBackend permissionBackend;
-  private final Provider<IdentifiedUser> identifiedUser;
-  private final GitRepositoryManager repoManager;
-  private final TagCache tagCache;
-  private final GitReferenceUpdated referenceUpdated;
-  private final WebLinks links;
-  private String ref;
-
-  @Inject
-  CreateTag(
-      PermissionBackend permissionBackend,
-      Provider<IdentifiedUser> identifiedUser,
-      GitRepositoryManager repoManager,
-      TagCache tagCache,
-      GitReferenceUpdated referenceUpdated,
-      WebLinks webLinks,
-      @Assisted String ref) {
-    this.permissionBackend = permissionBackend;
-    this.identifiedUser = identifiedUser;
-    this.repoManager = repoManager;
-    this.tagCache = tagCache;
-    this.referenceUpdated = referenceUpdated;
-    this.links = webLinks;
-    this.ref = ref;
-  }
-
-  @Override
-  public TagInfo apply(ProjectResource resource, TagInput input)
-      throws RestApiException, IOException, PermissionBackendException {
-    if (input == null) {
-      input = new TagInput();
-    }
-    if (input.ref != null && !ref.equals(input.ref)) {
-      throw new BadRequestException("ref must match URL");
-    }
-    if (input.revision == null) {
-      input.revision = Constants.HEAD;
-    }
-
-    ref = RefUtil.normalizeTagRef(ref);
-
-    RefControl refControl = resource.getControl().controlForRef(ref);
-    PermissionBackend.ForRef perm =
-        permissionBackend.user(identifiedUser).project(resource.getNameKey()).ref(ref);
-
-    try (Repository repo = repoManager.openRepository(resource.getNameKey())) {
-      ObjectId revid = RefUtil.parseBaseRevision(repo, resource.getNameKey(), input.revision);
-      RevWalk rw = RefUtil.verifyConnected(repo, revid);
-      RevObject object = rw.parseAny(revid);
-      rw.reset();
-      boolean isAnnotated = Strings.emptyToNull(input.message) != null;
-      boolean isSigned = isAnnotated && input.message.contains("-----BEGIN PGP SIGNATURE-----\n");
-      if (isSigned) {
-        throw new MethodNotAllowedException("Cannot create signed tag \"" + ref + "\"");
-      } else if (isAnnotated && !refControl.canPerform(Permission.CREATE_TAG)) {
-        throw new AuthException("Cannot create annotated tag \"" + ref + "\"");
-      } else {
-        perm.check(RefPermission.CREATE);
-      }
-      if (repo.getRefDatabase().exactRef(ref) != null) {
-        throw new ResourceConflictException("tag \"" + ref + "\" already exists");
-      }
-
-      try (Git git = new Git(repo)) {
-        TagCommand tag =
-            git.tag()
-                .setObjectId(object)
-                .setName(ref.substring(R_TAGS.length()))
-                .setAnnotated(isAnnotated)
-                .setSigned(isSigned);
-
-        if (isAnnotated) {
-          tag.setMessage(input.message)
-              .setTagger(
-                  identifiedUser.get().newCommitterIdent(TimeUtil.nowTs(), TimeZone.getDefault()));
-        }
-
-        Ref result = tag.call();
-        tagCache.updateFastForward(
-            resource.getNameKey(), ref, ObjectId.zeroId(), result.getObjectId());
-        referenceUpdated.fire(
-            resource.getNameKey(),
-            ref,
-            ObjectId.zeroId(),
-            result.getObjectId(),
-            identifiedUser.get().getAccount());
-        try (RevWalk w = new RevWalk(repo)) {
-          return ListTags.createTagInfo(perm, result, w, resource.getNameKey(), links);
-        }
-      }
-    } catch (InvalidRevisionException e) {
-      throw new BadRequestException("Invalid base revision");
-    } catch (GitAPIException e) {
-      log.error("Cannot create tag \"" + ref + "\"", e);
-      throw new IOException(e);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/DashboardResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/DashboardResource.java
deleted file mode 100644
index a3fd09e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/DashboardResource.java
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.restapi.RestResource;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.inject.TypeLiteral;
-import org.eclipse.jgit.lib.Config;
-
-public class DashboardResource implements RestResource {
-  public static final TypeLiteral<RestView<DashboardResource>> DASHBOARD_KIND =
-      new TypeLiteral<RestView<DashboardResource>>() {};
-
-  public static DashboardResource projectDefault(ProjectControl ctl) {
-    return new DashboardResource(ctl, null, null, null, true);
-  }
-
-  private final ProjectControl control;
-  private final String refName;
-  private final String pathName;
-  private final Config config;
-  private final boolean projectDefault;
-
-  public DashboardResource(
-      ProjectControl control,
-      String refName,
-      String pathName,
-      Config config,
-      boolean projectDefault) {
-    this.control = control;
-    this.refName = refName;
-    this.pathName = pathName;
-    this.config = config;
-    this.projectDefault = projectDefault;
-  }
-
-  public ProjectControl getControl() {
-    return control;
-  }
-
-  public String getRefName() {
-    return refName;
-  }
-
-  public String getPathName() {
-    return pathName;
-  }
-
-  public Config getConfig() {
-    return config;
-  }
-
-  public boolean isProjectDefault() {
-    return projectDefault;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/DashboardsCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/DashboardsCollection.java
deleted file mode 100644
index d43a066..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/DashboardsCollection.java
+++ /dev/null
@@ -1,254 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.project;
-
-import static com.google.gerrit.reviewdb.client.RefNames.REFS_DASHBOARDS;
-
-import com.google.common.base.Joiner;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Splitter;
-import com.google.common.base.Strings;
-import com.google.common.collect.Lists;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.api.projects.DashboardInfo;
-import com.google.gerrit.extensions.api.projects.DashboardSectionInfo;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AcceptsCreate;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ChildCollection;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.extensions.restapi.Url;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.UrlEncoded;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.RefPermission;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.List;
-import org.eclipse.jgit.errors.AmbiguousObjectException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.IncorrectObjectTypeException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.BlobBasedConfig;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-
-@Singleton
-public class DashboardsCollection
-    implements ChildCollection<ProjectResource, DashboardResource>, AcceptsCreate<ProjectResource> {
-  public static final String DEFAULT_DASHBOARD_NAME = "default";
-
-  private final GitRepositoryManager gitManager;
-  private final DynamicMap<RestView<DashboardResource>> views;
-  private final Provider<ListDashboards> list;
-  private final Provider<SetDefaultDashboard.CreateDefault> createDefault;
-  private final PermissionBackend permissionBackend;
-
-  @Inject
-  DashboardsCollection(
-      GitRepositoryManager gitManager,
-      DynamicMap<RestView<DashboardResource>> views,
-      Provider<ListDashboards> list,
-      Provider<SetDefaultDashboard.CreateDefault> createDefault,
-      PermissionBackend permissionBackend) {
-    this.gitManager = gitManager;
-    this.views = views;
-    this.list = list;
-    this.createDefault = createDefault;
-    this.permissionBackend = permissionBackend;
-  }
-
-  public static boolean isDefaultDashboard(@Nullable String id) {
-    return DEFAULT_DASHBOARD_NAME.equals(id);
-  }
-
-  public static boolean isDefaultDashboard(@Nullable IdString id) {
-    return id != null && isDefaultDashboard(id.toString());
-  }
-
-  @Override
-  public RestView<ProjectResource> list() throws ResourceNotFoundException {
-    return list.get();
-  }
-
-  @Override
-  public RestModifyView<ProjectResource, ?> create(ProjectResource parent, IdString id)
-      throws RestApiException {
-    if (isDefaultDashboard(id)) {
-      return createDefault.get();
-    }
-    throw new ResourceNotFoundException(id);
-  }
-
-  @Override
-  public DashboardResource parse(ProjectResource parent, IdString id)
-      throws ResourceNotFoundException, IOException, ConfigInvalidException,
-          PermissionBackendException {
-    ProjectControl myCtl = parent.getControl();
-    if (isDefaultDashboard(id)) {
-      return DashboardResource.projectDefault(myCtl);
-    }
-
-    DashboardInfo info;
-    try {
-      info = newDashboardInfo(id.get());
-    } catch (InvalidDashboardId e) {
-      throw new ResourceNotFoundException(id);
-    }
-
-    CurrentUser user = myCtl.getUser();
-    for (ProjectState ps : myCtl.getProjectState().tree()) {
-      try {
-        return parse(ps.controlFor(user), info, myCtl);
-      } catch (AmbiguousObjectException | ConfigInvalidException | IncorrectObjectTypeException e) {
-        throw new ResourceNotFoundException(id);
-      } catch (ResourceNotFoundException e) {
-        continue;
-      }
-    }
-    throw new ResourceNotFoundException(id);
-  }
-
-  public static String normalizeDashboardRef(String ref) {
-    if (!ref.startsWith(REFS_DASHBOARDS)) {
-      return REFS_DASHBOARDS + ref;
-    }
-    return ref;
-  }
-
-  private DashboardResource parse(ProjectControl ctl, DashboardInfo info, ProjectControl myCtl)
-      throws ResourceNotFoundException, IOException, AmbiguousObjectException,
-          IncorrectObjectTypeException, ConfigInvalidException, PermissionBackendException {
-    String ref = normalizeDashboardRef(info.ref);
-    try {
-      permissionBackend
-          .user(ctl.getUser())
-          .project(ctl.getProject().getNameKey())
-          .ref(ref)
-          .check(RefPermission.READ);
-    } catch (AuthException e) {
-      // Don't leak the project's existence
-      throw new ResourceNotFoundException(info.id);
-    }
-    if (!Repository.isValidRefName(ref)) {
-      throw new ResourceNotFoundException(info.id);
-    }
-
-    try (Repository git = gitManager.openRepository(ctl.getProject().getNameKey())) {
-      ObjectId objId = git.resolve(ref + ":" + info.path);
-      if (objId == null) {
-        throw new ResourceNotFoundException(info.id);
-      }
-      BlobBasedConfig cfg = new BlobBasedConfig(null, git, objId);
-      return new DashboardResource(myCtl, ref, info.path, cfg, false);
-    } catch (RepositoryNotFoundException e) {
-      throw new ResourceNotFoundException(info.id);
-    }
-  }
-
-  @Override
-  public DynamicMap<RestView<DashboardResource>> views() {
-    return views;
-  }
-
-  public static DashboardInfo newDashboardInfo(String ref, String path) {
-    DashboardInfo info = new DashboardInfo();
-    info.ref = ref;
-    info.path = path;
-    info.id = Joiner.on(':').join(Url.encode(ref), Url.encode(path));
-    return info;
-  }
-
-  public static class InvalidDashboardId extends Exception {
-    private static final long serialVersionUID = 1L;
-
-    public InvalidDashboardId(String id) {
-      super(id);
-    }
-  }
-
-  static DashboardInfo newDashboardInfo(String id) throws InvalidDashboardId {
-    DashboardInfo info = new DashboardInfo();
-    List<String> parts = Lists.newArrayList(Splitter.on(':').limit(2).split(id));
-    if (parts.size() != 2) {
-      throw new InvalidDashboardId(id);
-    }
-    info.id = id;
-    info.ref = parts.get(0);
-    info.path = parts.get(1);
-    return info;
-  }
-
-  static DashboardInfo parse(
-      Project definingProject,
-      String refName,
-      String path,
-      Config config,
-      String project,
-      boolean setDefault) {
-    DashboardInfo info = newDashboardInfo(refName, path);
-    info.project = project;
-    info.definingProject = definingProject.getName();
-    String query = config.getString("dashboard", null, "title");
-    info.title = replace(project, query == null ? info.path : query);
-    info.description = replace(project, config.getString("dashboard", null, "description"));
-    info.foreach = config.getString("dashboard", null, "foreach");
-
-    if (setDefault) {
-      String id = refName + ":" + path;
-      info.isDefault = id.equals(defaultOf(definingProject)) ? true : null;
-    }
-
-    UrlEncoded u = new UrlEncoded("/dashboard/");
-    u.put("title", MoreObjects.firstNonNull(info.title, info.path));
-    if (info.foreach != null) {
-      u.put("foreach", replace(project, info.foreach));
-    }
-    for (String name : config.getSubsections("section")) {
-      DashboardSectionInfo s = new DashboardSectionInfo();
-      s.name = name;
-      s.query = config.getString("section", name, "query");
-      u.put(s.name, replace(project, s.query));
-      info.sections.add(s);
-    }
-    info.url = u.toString().replace("%3A", ":");
-
-    return info;
-  }
-
-  private static String replace(String project, String query) {
-    return query.replace("${project}", project);
-  }
-
-  private static String defaultOf(Project proj) {
-    final String defaultId =
-        MoreObjects.firstNonNull(
-            proj.getLocalDefaultDashboard(), Strings.nullToEmpty(proj.getDefaultDashboard()));
-    if (defaultId.startsWith(REFS_DASHBOARDS)) {
-      return defaultId.substring(REFS_DASHBOARDS.length());
-    }
-    return defaultId;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/DefaultPermissionBackend.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/DefaultPermissionBackend.java
deleted file mode 100644
index decb328..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/DefaultPermissionBackend.java
+++ /dev/null
@@ -1,203 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.project;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static java.util.stream.Collectors.toSet;
-
-import com.google.common.collect.Sets;
-import com.google.gerrit.common.data.PermissionRule;
-import com.google.gerrit.common.data.PermissionRule.Action;
-import com.google.gerrit.extensions.api.access.GlobalOrPluginPermission;
-import com.google.gerrit.extensions.api.access.PluginPermission;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.PeerDaemonUser;
-import com.google.gerrit.server.account.CapabilityCollection;
-import com.google.gerrit.server.permissions.FailedPermissionBackend;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.Collection;
-import java.util.EnumSet;
-import java.util.List;
-import java.util.Set;
-
-@Singleton
-public class DefaultPermissionBackend extends PermissionBackend {
-  private static final CurrentUser.PropertyKey<Boolean> IS_ADMIN = CurrentUser.PropertyKey.create();
-
-  private final ProjectCache projectCache;
-
-  @Inject
-  DefaultPermissionBackend(ProjectCache projectCache) {
-    this.projectCache = projectCache;
-  }
-
-  private CapabilityCollection capabilities() {
-    return projectCache.getAllProjects().getCapabilityCollection();
-  }
-
-  @Override
-  public WithUser user(CurrentUser user) {
-    return new WithUserImpl(checkNotNull(user, "user"));
-  }
-
-  class WithUserImpl extends WithUser {
-    private final CurrentUser user;
-    private Boolean admin;
-
-    WithUserImpl(CurrentUser user) {
-      this.user = checkNotNull(user, "user");
-    }
-
-    @Override
-    public ForProject project(Project.NameKey project) {
-      try {
-        return projectCache.checkedGet(project, true).controlFor(user).asForProject().database(db);
-      } catch (Exception e) {
-        Throwable cause = e.getCause() != null ? e.getCause() : e;
-        return FailedPermissionBackend.project(
-            "project '" + project.get() + "' is unavailable", cause);
-      }
-    }
-
-    @Override
-    public void check(GlobalOrPluginPermission perm)
-        throws AuthException, PermissionBackendException {
-      if (!can(perm)) {
-        throw new AuthException(perm.describeForException() + " not permitted");
-      }
-    }
-
-    @Override
-    public <T extends GlobalOrPluginPermission> Set<T> test(Collection<T> permSet)
-        throws PermissionBackendException {
-      Set<T> ok = newSet(permSet);
-      for (T perm : permSet) {
-        if (can(perm)) {
-          ok.add(perm);
-        }
-      }
-      return ok;
-    }
-
-    private boolean can(GlobalOrPluginPermission perm) throws PermissionBackendException {
-      if (perm instanceof GlobalPermission) {
-        return can((GlobalPermission) perm);
-      } else if (perm instanceof PluginPermission) {
-        PluginPermission pluginPermission = (PluginPermission) perm;
-        return has(pluginPermission.permissionName())
-            || (pluginPermission.fallBackToAdmin() && isAdmin());
-      }
-      throw new PermissionBackendException(perm + " unsupported");
-    }
-
-    private boolean can(GlobalPermission perm) throws PermissionBackendException {
-      switch (perm) {
-        case ADMINISTRATE_SERVER:
-          return isAdmin();
-        case EMAIL_REVIEWERS:
-          return canEmailReviewers();
-
-        case FLUSH_CACHES:
-        case KILL_TASK:
-        case RUN_GC:
-        case VIEW_CACHES:
-        case VIEW_QUEUE:
-          return has(perm.permissionName()) || can(GlobalPermission.MAINTAIN_SERVER);
-
-        case CREATE_ACCOUNT:
-        case CREATE_GROUP:
-        case CREATE_PROJECT:
-        case MAINTAIN_SERVER:
-        case MODIFY_ACCOUNT:
-        case STREAM_EVENTS:
-        case VIEW_ALL_ACCOUNTS:
-        case VIEW_CONNECTIONS:
-        case VIEW_PLUGINS:
-          return has(perm.permissionName()) || isAdmin();
-
-        case ACCESS_DATABASE:
-        case RUN_AS:
-          return has(perm.permissionName());
-      }
-      throw new PermissionBackendException(perm + " unsupported");
-    }
-
-    private boolean isAdmin() {
-      if (admin == null) {
-        admin = computeAdmin();
-      }
-      return admin;
-    }
-
-    private Boolean computeAdmin() {
-      Boolean r = user.get(IS_ADMIN);
-      if (r == null) {
-        if (user.isImpersonating()) {
-          r = false;
-        } else if (user instanceof PeerDaemonUser) {
-          r = true;
-        } else {
-          r = allow(capabilities().administrateServer);
-        }
-        user.put(IS_ADMIN, r);
-      }
-      return r;
-    }
-
-    private boolean canEmailReviewers() {
-      List<PermissionRule> email = capabilities().emailReviewers;
-      return allow(email) || notDenied(email);
-    }
-
-    private boolean has(String permissionName) {
-      return allow(capabilities().getPermission(permissionName));
-    }
-
-    private boolean allow(Collection<PermissionRule> rules) {
-      return user.getEffectiveGroups()
-          .containsAnyOf(
-              rules.stream()
-                  .filter(r -> r.getAction() == Action.ALLOW)
-                  .map(r -> r.getGroup().getUUID())
-                  .collect(toSet()));
-    }
-
-    private boolean notDenied(Collection<PermissionRule> rules) {
-      Set<AccountGroup.UUID> denied =
-          rules.stream()
-              .filter(r -> r.getAction() != Action.ALLOW)
-              .map(r -> r.getGroup().getUUID())
-              .collect(toSet());
-      return denied.isEmpty() || !user.getEffectiveGroups().containsAnyOf(denied);
-    }
-  }
-
-  private static <T extends GlobalOrPluginPermission> Set<T> newSet(Collection<T> permSet) {
-    if (permSet instanceof EnumSet) {
-      @SuppressWarnings({"unchecked", "rawtypes"})
-      Set<T> s = ((EnumSet) permSet).clone();
-      s.clear();
-      return s;
-    }
-    return Sets.newHashSetWithExpectedSize(permSet.size());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/DefaultPermissionBackendModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/DefaultPermissionBackendModule.java
deleted file mode 100644
index bdfc67f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/DefaultPermissionBackendModule.java
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.config.FactoryModule;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.inject.AbstractModule;
-
-/** Binds the default {@link PermissionBackend}. */
-public class DefaultPermissionBackendModule extends AbstractModule {
-  @Override
-  protected void configure() {
-    install(new LegacyControlsModule());
-  }
-
-  /** Binds legacy ProjectControl, RefControl, ChangeControl. */
-  public static class LegacyControlsModule extends FactoryModule {
-    @Override
-    protected void configure() {
-      // TODO(sop) Hide ProjectControl, RefControl, ChangeControl related bindings.
-      bind(ProjectControl.GenericFactory.class);
-      factory(ProjectControl.AssistedFactory.class);
-      bind(ChangeControl.Factory.class);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteBranch.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteBranch.java
deleted file mode 100644
index 8cd44d1..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteBranch.java
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.project;
-
-import static org.eclipse.jgit.lib.Constants.R_HEADS;
-
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.RefPermission;
-import com.google.gerrit.server.project.DeleteBranch.Input;
-import com.google.gerrit.server.query.change.InternalChangeQuery;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-
-@Singleton
-public class DeleteBranch implements RestModifyView<BranchResource, Input> {
-  public static class Input {}
-
-  private final Provider<InternalChangeQuery> queryProvider;
-  private final DeleteRef.Factory deleteRefFactory;
-  private final Provider<CurrentUser> user;
-  private final PermissionBackend permissionBackend;
-
-  @Inject
-  DeleteBranch(
-      Provider<InternalChangeQuery> queryProvider,
-      DeleteRef.Factory deleteRefFactory,
-      Provider<CurrentUser> user,
-      PermissionBackend permissionBackend) {
-    this.queryProvider = queryProvider;
-    this.deleteRefFactory = deleteRefFactory;
-    this.user = user;
-    this.permissionBackend = permissionBackend;
-  }
-
-  @Override
-  public Response<?> apply(BranchResource rsrc, Input input)
-      throws RestApiException, OrmException, IOException, PermissionBackendException {
-    permissionBackend.user(user).ref(rsrc.getBranchKey()).check(RefPermission.DELETE);
-
-    if (!queryProvider.get().setLimit(1).byBranchOpen(rsrc.getBranchKey()).isEmpty()) {
-      throw new ResourceConflictException("branch " + rsrc.getBranchKey() + " has open changes");
-    }
-
-    deleteRefFactory.create(rsrc).ref(rsrc.getRef()).prefix(R_HEADS).delete();
-    return Response.none();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteBranches.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteBranches.java
deleted file mode 100644
index fa7e917..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteBranches.java
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.project;
-
-import static org.eclipse.jgit.lib.Constants.R_HEADS;
-
-import com.google.gerrit.extensions.api.projects.DeleteBranchesInput;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-
-@Singleton
-public class DeleteBranches implements RestModifyView<ProjectResource, DeleteBranchesInput> {
-  private final DeleteRef.Factory deleteRefFactory;
-
-  @Inject
-  DeleteBranches(DeleteRef.Factory deleteRefFactory) {
-    this.deleteRefFactory = deleteRefFactory;
-  }
-
-  @Override
-  public Response<?> apply(ProjectResource project, DeleteBranchesInput input)
-      throws OrmException, IOException, RestApiException, PermissionBackendException {
-    if (input == null || input.branches == null || input.branches.isEmpty()) {
-      throw new BadRequestException("branches must be specified");
-    }
-    deleteRefFactory.create(project).refs(input.branches).prefix(R_HEADS).delete();
-    return Response.none();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteDashboard.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteDashboard.java
deleted file mode 100644
index 958de55..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteDashboard.java
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.api.projects.DashboardInfo;
-import com.google.gerrit.extensions.common.SetDashboardInput;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-
-@Singleton
-class DeleteDashboard implements RestModifyView<DashboardResource, SetDashboardInput> {
-  private final Provider<SetDefaultDashboard> defaultSetter;
-
-  @Inject
-  DeleteDashboard(Provider<SetDefaultDashboard> defaultSetter) {
-    this.defaultSetter = defaultSetter;
-  }
-
-  @Override
-  public Response<DashboardInfo> apply(DashboardResource resource, SetDashboardInput input)
-      throws RestApiException, IOException, PermissionBackendException {
-    if (resource.isProjectDefault()) {
-      SetDashboardInput in = new SetDashboardInput();
-      in.commitMessage = input != null ? input.commitMessage : null;
-      return defaultSetter.get().apply(resource, in);
-    }
-
-    // TODO: Implement delete of dashboards by API.
-    throw new MethodNotAllowedException();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteRef.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteRef.java
deleted file mode 100644
index 9f05b97..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteRef.java
+++ /dev/null
@@ -1,287 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.project;
-
-import static java.lang.String.format;
-import static java.util.stream.Collectors.toList;
-import static org.eclipse.jgit.lib.Constants.R_REFS;
-import static org.eclipse.jgit.lib.Constants.R_TAGS;
-import static org.eclipse.jgit.transport.ReceiveCommand.Type.DELETE;
-
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.RefPermission;
-import com.google.gerrit.server.query.change.InternalChangeQuery;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import org.eclipse.jgit.errors.LockFailedException;
-import org.eclipse.jgit.lib.BatchRefUpdate;
-import org.eclipse.jgit.lib.NullProgressMonitor;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.ReceiveCommand;
-import org.eclipse.jgit.transport.ReceiveCommand.Result;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class DeleteRef {
-  private static final Logger log = LoggerFactory.getLogger(DeleteRef.class);
-
-  private static final int MAX_LOCK_FAILURE_CALLS = 10;
-  private static final long SLEEP_ON_LOCK_FAILURE_MS = 15;
-
-  private final Provider<IdentifiedUser> identifiedUser;
-  private final PermissionBackend permissionBackend;
-  private final GitRepositoryManager repoManager;
-  private final GitReferenceUpdated referenceUpdated;
-  private final RefValidationHelper refDeletionValidator;
-  private final Provider<InternalChangeQuery> queryProvider;
-  private final ProjectResource resource;
-  private final List<String> refsToDelete;
-  private String prefix;
-
-  public interface Factory {
-    DeleteRef create(ProjectResource r);
-  }
-
-  @Inject
-  DeleteRef(
-      Provider<IdentifiedUser> identifiedUser,
-      PermissionBackend permissionBackend,
-      GitRepositoryManager repoManager,
-      GitReferenceUpdated referenceUpdated,
-      RefValidationHelper.Factory refDeletionValidatorFactory,
-      Provider<InternalChangeQuery> queryProvider,
-      @Assisted ProjectResource resource) {
-    this.identifiedUser = identifiedUser;
-    this.permissionBackend = permissionBackend;
-    this.repoManager = repoManager;
-    this.referenceUpdated = referenceUpdated;
-    this.refDeletionValidator = refDeletionValidatorFactory.create(DELETE);
-    this.queryProvider = queryProvider;
-    this.resource = resource;
-    this.refsToDelete = new ArrayList<>();
-  }
-
-  public DeleteRef ref(String ref) {
-    this.refsToDelete.add(ref);
-    return this;
-  }
-
-  public DeleteRef refs(List<String> refs) {
-    this.refsToDelete.addAll(refs);
-    return this;
-  }
-
-  public DeleteRef prefix(String prefix) {
-    this.prefix = prefix;
-    return this;
-  }
-
-  public void delete()
-      throws OrmException, IOException, ResourceConflictException, AuthException,
-          PermissionBackendException {
-    if (!refsToDelete.isEmpty()) {
-      try (Repository r = repoManager.openRepository(resource.getNameKey())) {
-        if (refsToDelete.size() == 1) {
-          deleteSingleRef(r);
-        } else {
-          deleteMultipleRefs(r);
-        }
-      }
-    }
-  }
-
-  private void deleteSingleRef(Repository r)
-      throws IOException, ResourceConflictException, AuthException, PermissionBackendException {
-    String ref = refsToDelete.get(0);
-    if (prefix != null && !ref.startsWith(R_REFS)) {
-      ref = prefix + ref;
-    }
-
-    permissionBackend
-        .user(identifiedUser)
-        .project(resource.getNameKey())
-        .ref(ref)
-        .check(RefPermission.DELETE);
-
-    RefUpdate.Result result;
-    RefUpdate u = r.updateRef(ref);
-    u.setExpectedOldObjectId(r.exactRef(ref).getObjectId());
-    u.setNewObjectId(ObjectId.zeroId());
-    u.setForceUpdate(true);
-    refDeletionValidator.validateRefOperation(resource.getName(), identifiedUser.get(), u);
-    int remainingLockFailureCalls = MAX_LOCK_FAILURE_CALLS;
-    for (; ; ) {
-      try {
-        result = u.delete();
-      } catch (LockFailedException e) {
-        result = RefUpdate.Result.LOCK_FAILURE;
-      } catch (IOException e) {
-        log.error("Cannot delete " + ref, e);
-        throw e;
-      }
-      if (result == RefUpdate.Result.LOCK_FAILURE && --remainingLockFailureCalls > 0) {
-        try {
-          Thread.sleep(SLEEP_ON_LOCK_FAILURE_MS);
-        } catch (InterruptedException ie) {
-          // ignore
-        }
-      } else {
-        break;
-      }
-    }
-
-    switch (result) {
-      case NEW:
-      case NO_CHANGE:
-      case FAST_FORWARD:
-      case FORCED:
-        referenceUpdated.fire(
-            resource.getNameKey(),
-            u,
-            ReceiveCommand.Type.DELETE,
-            identifiedUser.get().getAccount());
-        break;
-
-      case REJECTED_CURRENT_BRANCH:
-        log.error("Cannot delete " + ref + ": " + result.name());
-        throw new ResourceConflictException("cannot delete current branch");
-
-      case IO_FAILURE:
-      case LOCK_FAILURE:
-      case NOT_ATTEMPTED:
-      case REJECTED:
-      case RENAMED:
-      case REJECTED_MISSING_OBJECT:
-      case REJECTED_OTHER_REASON:
-      default:
-        log.error("Cannot delete " + ref + ": " + result.name());
-        throw new ResourceConflictException("cannot delete: " + result.name());
-    }
-  }
-
-  private void deleteMultipleRefs(Repository r)
-      throws OrmException, IOException, ResourceConflictException, PermissionBackendException {
-    BatchRefUpdate batchUpdate = r.getRefDatabase().newBatchUpdate();
-    batchUpdate.setAtomic(false);
-    List<String> refs =
-        prefix == null
-            ? refsToDelete
-            : refsToDelete.stream()
-                .map(ref -> ref.startsWith(R_REFS) ? ref : prefix + ref)
-                .collect(toList());
-    for (String ref : refs) {
-      batchUpdate.addCommand(createDeleteCommand(resource, r, ref));
-    }
-    try (RevWalk rw = new RevWalk(r)) {
-      batchUpdate.execute(rw, NullProgressMonitor.INSTANCE);
-    }
-    StringBuilder errorMessages = new StringBuilder();
-    for (ReceiveCommand command : batchUpdate.getCommands()) {
-      if (command.getResult() == Result.OK) {
-        postDeletion(resource, command);
-      } else {
-        appendAndLogErrorMessage(errorMessages, command);
-      }
-    }
-    if (errorMessages.length() > 0) {
-      throw new ResourceConflictException(errorMessages.toString());
-    }
-  }
-
-  private ReceiveCommand createDeleteCommand(ProjectResource project, Repository r, String refName)
-      throws OrmException, IOException, ResourceConflictException, PermissionBackendException {
-    Ref ref = r.getRefDatabase().getRef(refName);
-    ReceiveCommand command;
-    if (ref == null) {
-      command = new ReceiveCommand(ObjectId.zeroId(), ObjectId.zeroId(), refName);
-      command.setResult(
-          Result.REJECTED_OTHER_REASON,
-          "it doesn't exist or you do not have permission to delete it");
-      return command;
-    }
-    command = new ReceiveCommand(ref.getObjectId(), ObjectId.zeroId(), ref.getName());
-
-    try {
-      permissionBackend
-          .user(identifiedUser)
-          .project(project.getNameKey())
-          .ref(refName)
-          .check(RefPermission.DELETE);
-    } catch (AuthException denied) {
-      command.setResult(
-          Result.REJECTED_OTHER_REASON,
-          "it doesn't exist or you do not have permission to delete it");
-    }
-
-    if (!refName.startsWith(R_TAGS)) {
-      Branch.NameKey branchKey = new Branch.NameKey(project.getNameKey(), ref.getName());
-      if (!queryProvider.get().setLimit(1).byBranchOpen(branchKey).isEmpty()) {
-        command.setResult(Result.REJECTED_OTHER_REASON, "it has open changes");
-      }
-    }
-
-    RefUpdate u = r.updateRef(refName);
-    u.setForceUpdate(true);
-    u.setExpectedOldObjectId(r.exactRef(refName).getObjectId());
-    u.setNewObjectId(ObjectId.zeroId());
-    refDeletionValidator.validateRefOperation(project.getName(), identifiedUser.get(), u);
-    return command;
-  }
-
-  private void appendAndLogErrorMessage(StringBuilder errorMessages, ReceiveCommand cmd) {
-    String msg = null;
-    switch (cmd.getResult()) {
-      case REJECTED_CURRENT_BRANCH:
-        msg = format("Cannot delete %s: it is the current branch", cmd.getRefName());
-        break;
-      case REJECTED_OTHER_REASON:
-        msg = format("Cannot delete %s: %s", cmd.getRefName(), cmd.getMessage());
-        break;
-      case LOCK_FAILURE:
-      case NOT_ATTEMPTED:
-      case OK:
-      case REJECTED_MISSING_OBJECT:
-      case REJECTED_NOCREATE:
-      case REJECTED_NODELETE:
-      case REJECTED_NONFASTFORWARD:
-      default:
-        msg = format("Cannot delete %s: %s", cmd.getRefName(), cmd.getResult());
-        break;
-    }
-    log.error(msg);
-    errorMessages.append(msg);
-    errorMessages.append("\n");
-  }
-
-  private void postDeletion(ProjectResource project, ReceiveCommand cmd) {
-    referenceUpdated.fire(project.getNameKey(), cmd, identifiedUser.get().getAccount());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteTag.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteTag.java
deleted file mode 100644
index a05fa2e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteTag.java
+++ /dev/null
@@ -1,60 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.RefPermission;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-
-@Singleton
-public class DeleteTag implements RestModifyView<TagResource, DeleteTag.Input> {
-  public static class Input {}
-
-  private final PermissionBackend permissionBackend;
-  private final Provider<CurrentUser> user;
-  private final DeleteRef.Factory deleteRefFactory;
-
-  @Inject
-  DeleteTag(
-      PermissionBackend permissionBackend,
-      Provider<CurrentUser> user,
-      DeleteRef.Factory deleteRefFactory) {
-    this.permissionBackend = permissionBackend;
-    this.user = user;
-    this.deleteRefFactory = deleteRefFactory;
-  }
-
-  @Override
-  public Response<?> apply(TagResource resource, Input input)
-      throws OrmException, RestApiException, IOException, PermissionBackendException {
-    String tag = RefUtil.normalizeTagRef(resource.getTagInfo().ref);
-    permissionBackend
-        .user(user)
-        .project(resource.getNameKey())
-        .ref(tag)
-        .check(RefPermission.DELETE);
-    deleteRefFactory.create(resource).ref(tag).delete();
-    return Response.none();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteTags.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteTags.java
deleted file mode 100644
index c020351..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteTags.java
+++ /dev/null
@@ -1,48 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.project;
-
-import static org.eclipse.jgit.lib.Constants.R_TAGS;
-
-import com.google.gerrit.extensions.api.projects.DeleteTagsInput;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-
-@Singleton
-public class DeleteTags implements RestModifyView<ProjectResource, DeleteTagsInput> {
-  private final DeleteRef.Factory deleteRefFactory;
-
-  @Inject
-  DeleteTags(DeleteRef.Factory deleteRefFactory) {
-    this.deleteRefFactory = deleteRefFactory;
-  }
-
-  @Override
-  public Response<?> apply(ProjectResource project, DeleteTagsInput input)
-      throws OrmException, RestApiException, IOException, PermissionBackendException {
-    if (input == null || input.tags == null || input.tags.isEmpty()) {
-      throw new BadRequestException("tags must be specified");
-    }
-    deleteRefFactory.create(project).refs(input.tags).prefix(R_TAGS).delete();
-    return Response.none();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/FileResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/FileResource.java
deleted file mode 100644
index 82462b2..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/FileResource.java
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestResource;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.inject.TypeLiteral;
-import java.io.IOException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevTree;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.treewalk.TreeWalk;
-
-public class FileResource implements RestResource {
-  public static final TypeLiteral<RestView<FileResource>> FILE_KIND =
-      new TypeLiteral<RestView<FileResource>>() {};
-
-  public static FileResource create(
-      GitRepositoryManager repoManager, ProjectState projectState, ObjectId rev, String path)
-      throws ResourceNotFoundException, IOException {
-    try (Repository repo = repoManager.openRepository(projectState.getNameKey());
-        RevWalk rw = new RevWalk(repo)) {
-      RevTree tree = rw.parseTree(rev);
-      if (TreeWalk.forPath(repo, path, tree) != null) {
-        return new FileResource(projectState, rev, path);
-      }
-    }
-    throw new ResourceNotFoundException(IdString.fromDecoded(path));
-  }
-
-  private final ProjectState projectState;
-  private final ObjectId rev;
-  private final String path;
-
-  public FileResource(ProjectState projectState, ObjectId rev, String path) {
-    this.projectState = projectState;
-    this.rev = rev;
-    this.path = path;
-  }
-
-  public ProjectState getProjectState() {
-    return projectState;
-  }
-
-  public ObjectId getRev() {
-    return rev;
-  }
-
-  public String getPath() {
-    return path;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/FilesCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/FilesCollection.java
deleted file mode 100644
index dd32f85..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/FilesCollection.java
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.ChildCollection;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.eclipse.jgit.lib.ObjectId;
-
-@Singleton
-public class FilesCollection implements ChildCollection<BranchResource, FileResource> {
-  private final DynamicMap<RestView<FileResource>> views;
-  private final GitRepositoryManager repoManager;
-
-  @Inject
-  FilesCollection(DynamicMap<RestView<FileResource>> views, GitRepositoryManager repoManager) {
-    this.views = views;
-    this.repoManager = repoManager;
-  }
-
-  @Override
-  public RestView<BranchResource> list() throws ResourceNotFoundException {
-    throw new ResourceNotFoundException();
-  }
-
-  @Override
-  public FileResource parse(BranchResource parent, IdString id)
-      throws ResourceNotFoundException, IOException {
-    return FileResource.create(
-        repoManager, parent.getProjectState(), ObjectId.fromString(parent.getRevision()), id.get());
-  }
-
-  @Override
-  public DynamicMap<RestView<FileResource>> views() {
-    return views;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/FilesInCommitCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/FilesInCommitCollection.java
deleted file mode 100644
index 7144099..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/FilesInCommitCollection.java
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.ChildCollection;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.reviewdb.client.Patch;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-
-@Singleton
-public class FilesInCommitCollection implements ChildCollection<CommitResource, FileResource> {
-  private final DynamicMap<RestView<FileResource>> views;
-  private final GitRepositoryManager repoManager;
-
-  @Inject
-  FilesInCommitCollection(
-      DynamicMap<RestView<FileResource>> views, GitRepositoryManager repoManager) {
-    this.views = views;
-    this.repoManager = repoManager;
-  }
-
-  @Override
-  public RestView<CommitResource> list() throws ResourceNotFoundException {
-    throw new ResourceNotFoundException();
-  }
-
-  @Override
-  public FileResource parse(CommitResource parent, IdString id)
-      throws ResourceNotFoundException, IOException {
-    if (Patch.isMagic(id.get())) {
-      return new FileResource(parent.getProjectState(), parent.getCommit(), id.get());
-    }
-    return FileResource.create(repoManager, parent.getProjectState(), parent.getCommit(), id.get());
-  }
-
-  @Override
-  public DynamicMap<RestView<FileResource>> views() {
-    return views;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GarbageCollect.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GarbageCollect.java
deleted file mode 100644
index f81a0f3..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GarbageCollect.java
+++ /dev/null
@@ -1,170 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.project;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.gerrit.common.data.GarbageCollectionResult;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
-import com.google.gerrit.extensions.restapi.BinaryResult;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.webui.UiAction;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.config.CanonicalWebUrl;
-import com.google.gerrit.server.git.GarbageCollection;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.LocalDiskRepositoryManager;
-import com.google.gerrit.server.git.WorkQueue;
-import com.google.gerrit.server.project.GarbageCollect.Input;
-import com.google.gerrit.server.util.IdGenerator;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.util.Collections;
-
-@RequiresCapability(GlobalCapability.RUN_GC)
-@Singleton
-public class GarbageCollect
-    implements RestModifyView<ProjectResource, Input>, UiAction<ProjectResource> {
-  public static class Input {
-    public boolean showProgress;
-    public boolean aggressive;
-    public boolean async;
-  }
-
-  private final boolean canGC;
-  private final GarbageCollection.Factory garbageCollectionFactory;
-  private final WorkQueue workQueue;
-  private final Provider<String> canonicalUrl;
-
-  @Inject
-  GarbageCollect(
-      GitRepositoryManager repoManager,
-      GarbageCollection.Factory garbageCollectionFactory,
-      WorkQueue workQueue,
-      @CanonicalWebUrl Provider<String> canonicalUrl) {
-    this.workQueue = workQueue;
-    this.canonicalUrl = canonicalUrl;
-    this.canGC = repoManager instanceof LocalDiskRepositoryManager;
-    this.garbageCollectionFactory = garbageCollectionFactory;
-  }
-
-  @Override
-  public Object apply(ProjectResource rsrc, Input input) {
-    Project.NameKey project = rsrc.getNameKey();
-    if (input.async) {
-      return applyAsync(project, input);
-    }
-    return applySync(project, input);
-  }
-
-  private Response.Accepted applyAsync(Project.NameKey project, Input input) {
-    Runnable job =
-        new Runnable() {
-          @Override
-          public void run() {
-            runGC(project, input, null);
-          }
-
-          @Override
-          public String toString() {
-            return "Run "
-                + (input.aggressive ? "aggressive " : "")
-                + "garbage collection on project "
-                + project.get();
-          }
-        };
-
-    @SuppressWarnings("unchecked")
-    WorkQueue.Task<Void> task = (WorkQueue.Task<Void>) workQueue.getDefaultQueue().submit(job);
-
-    String location =
-        canonicalUrl.get() + "a/config/server/tasks/" + IdGenerator.format(task.getTaskId());
-
-    return Response.accepted(location);
-  }
-
-  @SuppressWarnings("resource")
-  private BinaryResult applySync(Project.NameKey project, Input input) {
-    return new BinaryResult() {
-      @Override
-      public void writeTo(OutputStream out) throws IOException {
-        PrintWriter writer =
-            new PrintWriter(new OutputStreamWriter(out, UTF_8)) {
-              @Override
-              public void println() {
-                write('\n');
-              }
-            };
-        try {
-          PrintWriter progressWriter = input.showProgress ? writer : null;
-          GarbageCollectionResult result = runGC(project, input, progressWriter);
-          String msg = "Garbage collection completed successfully.";
-          if (result.hasErrors()) {
-            for (GarbageCollectionResult.Error e : result.getErrors()) {
-              switch (e.getType()) {
-                case REPOSITORY_NOT_FOUND:
-                  msg = "Error: project \"" + e.getProjectName() + "\" not found.";
-                  break;
-                case GC_ALREADY_SCHEDULED:
-                  msg =
-                      "Error: garbage collection for project \""
-                          + e.getProjectName()
-                          + "\" was already scheduled.";
-                  break;
-                case GC_FAILED:
-                  msg =
-                      "Error: garbage collection for project \""
-                          + e.getProjectName()
-                          + "\" failed.";
-                  break;
-                default:
-                  msg =
-                      "Error: garbage collection for project \""
-                          + e.getProjectName()
-                          + "\" failed: "
-                          + e.getType()
-                          + ".";
-              }
-            }
-          }
-          writer.println(msg);
-        } finally {
-          writer.flush();
-        }
-      }
-    }.setContentType("text/plain").setCharacterEncoding(UTF_8).disableGzip();
-  }
-
-  GarbageCollectionResult runGC(Project.NameKey project, Input input, PrintWriter progressWriter) {
-    return garbageCollectionFactory
-        .create()
-        .run(Collections.singletonList(project), input.aggressive, progressWriter);
-  }
-
-  @Override
-  public UiAction.Description getDescription(ProjectResource rsrc) {
-    return new UiAction.Description()
-        .setLabel("Run GC")
-        .setTitle("Triggers the Git Garbage Collection for this project.")
-        .setVisible(canGC);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetAccess.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetAccess.java
deleted file mode 100644
index 9fbb355..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetAccess.java
+++ /dev/null
@@ -1,331 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.project;
-
-import static com.google.gerrit.server.permissions.GlobalPermission.ADMINISTRATE_SERVER;
-import static com.google.gerrit.server.permissions.ProjectPermission.CREATE_REF;
-import static com.google.gerrit.server.permissions.ProjectPermission.CREATE_TAG_REF;
-import static com.google.gerrit.server.permissions.RefPermission.CREATE_CHANGE;
-import static com.google.gerrit.server.permissions.RefPermission.READ;
-import static java.util.stream.Collectors.toMap;
-
-import com.google.common.collect.ImmutableBiMap;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.common.data.AccessSection;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.common.data.PermissionRule;
-import com.google.gerrit.common.data.RefConfigSection;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.extensions.api.access.AccessSectionInfo;
-import com.google.gerrit.extensions.api.access.PermissionInfo;
-import com.google.gerrit.extensions.api.access.PermissionRuleInfo;
-import com.google.gerrit.extensions.api.access.ProjectAccessInfo;
-import com.google.gerrit.extensions.common.GroupInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.GroupControl;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.group.GroupJson;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.RefPermission;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class GetAccess implements RestReadView<ProjectResource> {
-  private static final Logger LOG = LoggerFactory.getLogger(GetAccess.class);
-
-  /** Marker value used in {@code Map<?, GroupInfo>} for groups not visible to current user. */
-  private static final GroupInfo INVISIBLE_SENTINEL = new GroupInfo();
-
-  public static final ImmutableBiMap<PermissionRule.Action, PermissionRuleInfo.Action> ACTION_TYPE =
-      ImmutableBiMap.of(
-          PermissionRule.Action.ALLOW,
-          PermissionRuleInfo.Action.ALLOW,
-          PermissionRule.Action.BATCH,
-          PermissionRuleInfo.Action.BATCH,
-          PermissionRule.Action.BLOCK,
-          PermissionRuleInfo.Action.BLOCK,
-          PermissionRule.Action.DENY,
-          PermissionRuleInfo.Action.DENY,
-          PermissionRule.Action.INTERACTIVE,
-          PermissionRuleInfo.Action.INTERACTIVE);
-
-  private final Provider<CurrentUser> user;
-  private final PermissionBackend permissionBackend;
-  private final GroupControl.Factory groupControlFactory;
-  private final AllProjectsName allProjectsName;
-  private final ProjectJson projectJson;
-  private final ProjectCache projectCache;
-  private final MetaDataUpdate.Server metaDataUpdateFactory;
-  private final ProjectControl.GenericFactory projectControlFactory;
-  private final GroupBackend groupBackend;
-  private final GroupJson groupJson;
-
-  @Inject
-  public GetAccess(
-      Provider<CurrentUser> self,
-      PermissionBackend permissionBackend,
-      GroupControl.Factory groupControlFactory,
-      AllProjectsName allProjectsName,
-      ProjectCache projectCache,
-      MetaDataUpdate.Server metaDataUpdateFactory,
-      ProjectJson projectJson,
-      ProjectControl.GenericFactory projectControlFactory,
-      GroupBackend groupBackend,
-      GroupJson groupJson) {
-    this.user = self;
-    this.permissionBackend = permissionBackend;
-    this.groupControlFactory = groupControlFactory;
-    this.allProjectsName = allProjectsName;
-    this.projectJson = projectJson;
-    this.projectCache = projectCache;
-    this.projectControlFactory = projectControlFactory;
-    this.metaDataUpdateFactory = metaDataUpdateFactory;
-    this.groupBackend = groupBackend;
-    this.groupJson = groupJson;
-  }
-
-  public ProjectAccessInfo apply(Project.NameKey nameKey)
-      throws ResourceNotFoundException, ResourceConflictException, IOException,
-          PermissionBackendException, OrmException {
-    try {
-      return apply(new ProjectResource(projectControlFactory.controlFor(nameKey, user.get())));
-    } catch (NoSuchProjectException e) {
-      throw new ResourceNotFoundException(nameKey.get());
-    }
-  }
-
-  @Override
-  public ProjectAccessInfo apply(ProjectResource rsrc)
-      throws ResourceNotFoundException, ResourceConflictException, IOException,
-          PermissionBackendException, OrmException {
-    // Load the current configuration from the repository, ensuring it's the most
-    // recent version available. If it differs from what was in the project
-    // state, force a cache flush now.
-
-    Project.NameKey projectName = rsrc.getNameKey();
-    ProjectAccessInfo info = new ProjectAccessInfo();
-    ProjectControl pc = createProjectControl(projectName);
-    PermissionBackend.ForProject perm = permissionBackend.user(user).project(projectName);
-
-    ProjectConfig config;
-    try (MetaDataUpdate md = metaDataUpdateFactory.create(projectName)) {
-      config = ProjectConfig.read(md);
-
-      if (config.updateGroupNames(groupBackend)) {
-        md.setMessage("Update group names\n");
-        config.commit(md);
-        projectCache.evict(config.getProject());
-        pc = createProjectControl(projectName);
-        perm = permissionBackend.user(user).project(projectName);
-      } else if (config.getRevision() != null
-          && !config.getRevision().equals(pc.getProjectState().getConfig().getRevision())) {
-        projectCache.evict(config.getProject());
-        pc = createProjectControl(projectName);
-        perm = permissionBackend.user(user).project(projectName);
-      }
-    } catch (ConfigInvalidException e) {
-      throw new ResourceConflictException(e.getMessage());
-    } catch (RepositoryNotFoundException e) {
-      throw new ResourceNotFoundException(rsrc.getName());
-    }
-
-    info.local = new HashMap<>();
-    info.ownerOf = new HashSet<>();
-    Map<AccountGroup.UUID, GroupInfo> visibleGroups = new HashMap<>();
-    boolean checkReadConfig = check(perm, RefNames.REFS_CONFIG, READ);
-
-    for (AccessSection section : config.getAccessSections()) {
-      String name = section.getName();
-      if (AccessSection.GLOBAL_CAPABILITIES.equals(name)) {
-        if (pc.isOwner()) {
-          info.local.put(name, createAccessSection(visibleGroups, section));
-          info.ownerOf.add(name);
-
-        } else if (checkReadConfig) {
-          info.local.put(section.getName(), createAccessSection(visibleGroups, section));
-        }
-
-      } else if (RefConfigSection.isValid(name)) {
-        if (pc.controlForRef(name).isOwner()) {
-          info.local.put(name, createAccessSection(visibleGroups, section));
-          info.ownerOf.add(name);
-
-        } else if (checkReadConfig) {
-          info.local.put(name, createAccessSection(visibleGroups, section));
-
-        } else if (check(perm, name, READ)) {
-          // Filter the section to only add rules describing groups that
-          // are visible to the current-user. This includes any group the
-          // user is a member of, as well as groups they own or that
-          // are visible to all users.
-
-          AccessSection dst = null;
-          for (Permission srcPerm : section.getPermissions()) {
-            Permission dstPerm = null;
-
-            for (PermissionRule srcRule : srcPerm.getRules()) {
-              AccountGroup.UUID groupId = srcRule.getGroup().getUUID();
-              if (groupId == null) {
-                continue;
-              }
-
-              GroupInfo group = loadGroup(visibleGroups, groupId);
-
-              if (group != INVISIBLE_SENTINEL) {
-                if (dstPerm == null) {
-                  if (dst == null) {
-                    dst = new AccessSection(name);
-                    info.local.put(name, createAccessSection(visibleGroups, dst));
-                  }
-                  dstPerm = dst.getPermission(srcPerm.getName(), true);
-                }
-                dstPerm.add(srcRule);
-              }
-            }
-          }
-        }
-      }
-    }
-
-    if (info.ownerOf.isEmpty()
-        && permissionBackend.user(user).test(GlobalPermission.ADMINISTRATE_SERVER)) {
-      // Special case: If the section list is empty, this project has no current
-      // access control information. Fall back to site administrators.
-      info.ownerOf.add(AccessSection.ALL);
-    }
-
-    if (config.getRevision() != null) {
-      info.revision = config.getRevision().name();
-    }
-
-    ProjectState parent = Iterables.getFirst(pc.getProjectState().parents(), null);
-    if (parent != null) {
-      info.inheritsFrom = projectJson.format(parent.getProject());
-    }
-
-    if (projectName.equals(allProjectsName)
-        && permissionBackend.user(user).testOrFalse(ADMINISTRATE_SERVER)) {
-      info.ownerOf.add(AccessSection.GLOBAL_CAPABILITIES);
-    }
-
-    info.isOwner = toBoolean(pc.isOwner());
-    info.canUpload =
-        toBoolean(
-            pc.isOwner()
-                || (checkReadConfig && perm.ref(RefNames.REFS_CONFIG).testOrFalse(CREATE_CHANGE)));
-    info.canAdd = toBoolean(perm.testOrFalse(CREATE_REF));
-    info.canAddTags = toBoolean(perm.testOrFalse(CREATE_TAG_REF));
-    info.configVisible = checkReadConfig || pc.isOwner();
-
-    info.groups =
-        visibleGroups.entrySet().stream()
-            .filter(e -> e.getValue() != INVISIBLE_SENTINEL)
-            .collect(toMap(e -> e.getKey().get(), e -> e.getValue()));
-
-    return info;
-  }
-
-  private GroupInfo loadGroup(Map<AccountGroup.UUID, GroupInfo> visibleGroups, AccountGroup.UUID id)
-      throws OrmException {
-    GroupInfo group = visibleGroups.get(id);
-    if (group == null) {
-      try {
-        GroupControl control = groupControlFactory.controlFor(id);
-        group = INVISIBLE_SENTINEL;
-        if (control.isVisible()) {
-          group = groupJson.format(control.getGroup());
-          group.id = null;
-        }
-      } catch (NoSuchGroupException e) {
-        LOG.warn("NoSuchGroupException; ignoring group " + id, e);
-        group = INVISIBLE_SENTINEL;
-      }
-      visibleGroups.put(id, group);
-    }
-
-    return group;
-  }
-
-  private static boolean check(PermissionBackend.ForProject ctx, String ref, RefPermission perm)
-      throws PermissionBackendException {
-    try {
-      ctx.ref(ref).check(perm);
-      return true;
-    } catch (AuthException denied) {
-      return false;
-    }
-  }
-
-  private AccessSectionInfo createAccessSection(
-      Map<AccountGroup.UUID, GroupInfo> groups, AccessSection section) throws OrmException {
-    AccessSectionInfo accessSectionInfo = new AccessSectionInfo();
-    accessSectionInfo.permissions = new HashMap<>();
-    for (Permission p : section.getPermissions()) {
-      PermissionInfo pInfo = new PermissionInfo(p.getLabel(), p.getExclusiveGroup() ? true : null);
-      pInfo.rules = new HashMap<>();
-      for (PermissionRule r : p.getRules()) {
-        PermissionRuleInfo info =
-            new PermissionRuleInfo(ACTION_TYPE.get(r.getAction()), r.getForce());
-        if (r.hasRange()) {
-          info.max = r.getMax();
-          info.min = r.getMin();
-        }
-        AccountGroup.UUID group = r.getGroup().getUUID();
-        if (group != null) {
-          pInfo.rules.put(group.get(), info);
-          loadGroup(groups, group);
-        }
-      }
-      accessSectionInfo.permissions.put(p.getName(), pInfo);
-    }
-    return accessSectionInfo;
-  }
-
-  private ProjectControl createProjectControl(Project.NameKey projectName)
-      throws IOException, ResourceNotFoundException {
-    try {
-      return projectControlFactory.controlFor(projectName, user.get());
-    } catch (NoSuchProjectException e) {
-      throw new ResourceNotFoundException(projectName.get());
-    }
-  }
-
-  private static Boolean toBoolean(boolean value) {
-    return value ? true : null;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetBranch.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetBranch.java
deleted file mode 100644
index d312bde..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetBranch.java
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.api.projects.BranchInfo;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-
-@Singleton
-public class GetBranch implements RestReadView<BranchResource> {
-  private final Provider<ListBranches> list;
-
-  @Inject
-  GetBranch(Provider<ListBranches> list) {
-    this.list = list;
-  }
-
-  @Override
-  public BranchInfo apply(BranchResource rsrc)
-      throws ResourceNotFoundException, IOException, PermissionBackendException {
-    return list.get().toBranchInfo(rsrc);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetChildProject.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetChildProject.java
deleted file mode 100644
index afffdfc..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetChildProject.java
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.common.ProjectInfo;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.inject.Inject;
-import org.kohsuke.args4j.Option;
-
-public class GetChildProject implements RestReadView<ChildProjectResource> {
-  @Option(name = "--recursive", usage = "to list child projects recursively")
-  public void setRecursive(boolean recursive) {
-    this.recursive = recursive;
-  }
-
-  private final ProjectJson json;
-  private boolean recursive;
-
-  @Inject
-  GetChildProject(ProjectJson json) {
-    this.json = json;
-  }
-
-  @Override
-  public ProjectInfo apply(ChildProjectResource rsrc) throws ResourceNotFoundException {
-    if (recursive || rsrc.isDirectChild()) {
-      return json.format(rsrc.getChild().getProject());
-    }
-    throw new ResourceNotFoundException(rsrc.getChild().getName());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetCommit.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetCommit.java
deleted file mode 100644
index bd4492e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetCommit.java
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.common.CommitInfo;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.server.CommonConverters;
-import com.google.inject.Singleton;
-import java.util.ArrayList;
-import org.eclipse.jgit.revwalk.RevCommit;
-
-@Singleton
-public class GetCommit implements RestReadView<CommitResource> {
-
-  @Override
-  public CommitInfo apply(CommitResource rsrc) {
-    return toCommitInfo(rsrc.getCommit());
-  }
-
-  private static CommitInfo toCommitInfo(RevCommit commit) {
-    CommitInfo info = new CommitInfo();
-    info.commit = commit.getName();
-    info.author = CommonConverters.toGitPerson(commit.getAuthorIdent());
-    info.committer = CommonConverters.toGitPerson(commit.getCommitterIdent());
-    info.subject = commit.getShortMessage();
-    info.message = commit.getFullMessage();
-    info.parents = new ArrayList<>(commit.getParentCount());
-    for (int i = 0; i < commit.getParentCount(); i++) {
-      RevCommit p = commit.getParent(i);
-      CommitInfo parentInfo = new CommitInfo();
-      parentInfo.commit = p.getName();
-      parentInfo.subject = p.getShortMessage();
-      info.parents.add(parentInfo);
-    }
-    return info;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetConfig.java
deleted file mode 100644
index 3995e1f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetConfig.java
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.api.projects.ConfigInfo;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.server.EnableSignedPush;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.config.PluginConfigFactory;
-import com.google.gerrit.server.config.ProjectConfigEntry;
-import com.google.gerrit.server.extensions.webui.UiActions;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-@Singleton
-public class GetConfig implements RestReadView<ProjectResource> {
-  private final boolean serverEnableSignedPush;
-  private final DynamicMap<ProjectConfigEntry> pluginConfigEntries;
-  private final PluginConfigFactory cfgFactory;
-  private final AllProjectsName allProjects;
-  private final UiActions uiActions;
-  private final DynamicMap<RestView<ProjectResource>> views;
-
-  @Inject
-  public GetConfig(
-      @EnableSignedPush boolean serverEnableSignedPush,
-      DynamicMap<ProjectConfigEntry> pluginConfigEntries,
-      PluginConfigFactory cfgFactory,
-      AllProjectsName allProjects,
-      UiActions uiActions,
-      DynamicMap<RestView<ProjectResource>> views) {
-    this.serverEnableSignedPush = serverEnableSignedPush;
-    this.pluginConfigEntries = pluginConfigEntries;
-    this.allProjects = allProjects;
-    this.cfgFactory = cfgFactory;
-    this.uiActions = uiActions;
-    this.views = views;
-  }
-
-  @Override
-  public ConfigInfo apply(ProjectResource resource) {
-    return new ConfigInfoImpl(
-        serverEnableSignedPush,
-        resource.getControl(),
-        pluginConfigEntries,
-        cfgFactory,
-        allProjects,
-        uiActions,
-        views);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetContent.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetContent.java
deleted file mode 100644
index b5294c4..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetContent.java
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.BinaryResult;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.server.change.FileContentUtil;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-
-@Singleton
-public class GetContent implements RestReadView<FileResource> {
-  private final FileContentUtil fileContentUtil;
-
-  @Inject
-  GetContent(FileContentUtil fileContentUtil) {
-    this.fileContentUtil = fileContentUtil;
-  }
-
-  @Override
-  public BinaryResult apply(FileResource rsrc)
-      throws ResourceNotFoundException, BadRequestException, IOException {
-    return fileContentUtil.getContent(rsrc.getProjectState(), rsrc.getRev(), rsrc.getPath(), null);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetDashboard.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetDashboard.java
deleted file mode 100644
index cdf23bb..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetDashboard.java
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.project;
-
-import static com.google.gerrit.reviewdb.client.RefNames.REFS_DASHBOARDS;
-import static com.google.gerrit.server.project.DashboardsCollection.isDefaultDashboard;
-
-import com.google.common.base.Splitter;
-import com.google.common.base.Strings;
-import com.google.common.collect.Lists;
-import com.google.gerrit.extensions.api.projects.DashboardInfo;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.extensions.restapi.Url;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.util.List;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.kohsuke.args4j.Option;
-
-public class GetDashboard implements RestReadView<DashboardResource> {
-  private final DashboardsCollection dashboards;
-
-  @Option(name = "--inherited", usage = "include inherited dashboards")
-  private boolean inherited;
-
-  @Inject
-  GetDashboard(DashboardsCollection dashboards) {
-    this.dashboards = dashboards;
-  }
-
-  public GetDashboard setInherited(boolean inherited) {
-    this.inherited = inherited;
-    return this;
-  }
-
-  @Override
-  public DashboardInfo apply(DashboardResource resource)
-      throws RestApiException, IOException, PermissionBackendException {
-    if (inherited && !resource.isProjectDefault()) {
-      throw new BadRequestException("inherited flag can only be used with default");
-    }
-
-    String project = resource.getControl().getProject().getName();
-    if (resource.isProjectDefault()) {
-      // The default is not resolved to a definition yet.
-      try {
-        resource = defaultOf(resource.getControl());
-      } catch (ConfigInvalidException e) {
-        throw new ResourceConflictException(e.getMessage());
-      }
-    }
-
-    return DashboardsCollection.parse(
-        resource.getControl().getProject(),
-        resource.getRefName().substring(REFS_DASHBOARDS.length()),
-        resource.getPathName(),
-        resource.getConfig(),
-        project,
-        true);
-  }
-
-  private DashboardResource defaultOf(ProjectControl ctl)
-      throws ResourceNotFoundException, IOException, ConfigInvalidException,
-          PermissionBackendException {
-    String id = ctl.getProject().getLocalDefaultDashboard();
-    if (Strings.isNullOrEmpty(id)) {
-      id = ctl.getProject().getDefaultDashboard();
-    }
-    if (isDefaultDashboard(id)) {
-      throw new ResourceNotFoundException();
-    } else if (!Strings.isNullOrEmpty(id)) {
-      return parse(ctl, id);
-    } else if (!inherited) {
-      throw new ResourceNotFoundException();
-    }
-
-    for (ProjectState ps : ctl.getProjectState().tree()) {
-      id = ps.getProject().getDefaultDashboard();
-      if (isDefaultDashboard(id)) {
-        throw new ResourceNotFoundException();
-      } else if (!Strings.isNullOrEmpty(id)) {
-        ctl = ps.controlFor(ctl.getUser());
-        return parse(ctl, id);
-      }
-    }
-    throw new ResourceNotFoundException();
-  }
-
-  private DashboardResource parse(ProjectControl ctl, String id)
-      throws ResourceNotFoundException, IOException, ConfigInvalidException,
-          PermissionBackendException {
-    List<String> p = Lists.newArrayList(Splitter.on(':').limit(2).split(id));
-    String ref = Url.encode(p.get(0));
-    String path = Url.encode(p.get(1));
-    return dashboards.parse(new ProjectResource(ctl), IdString.fromUrl(ref + ':' + path));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetDescription.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetDescription.java
deleted file mode 100644
index dd03e97..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetDescription.java
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.project;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.inject.Singleton;
-
-@Singleton
-public class GetDescription implements RestReadView<ProjectResource> {
-  @Override
-  public String apply(ProjectResource rsrc) {
-    return Strings.nullToEmpty(rsrc.getProjectState().getProject().getDescription());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetHead.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetHead.java
deleted file mode 100644
index 31dc7bf..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetHead.java
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.RefPermission;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.eclipse.jgit.errors.IncorrectObjectTypeException;
-import org.eclipse.jgit.errors.MissingObjectException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-@Singleton
-public class GetHead implements RestReadView<ProjectResource> {
-  private final GitRepositoryManager repoManager;
-  private final CommitsCollection commits;
-  private final PermissionBackend permissionBackend;
-
-  @Inject
-  GetHead(
-      GitRepositoryManager repoManager,
-      CommitsCollection commits,
-      PermissionBackend permissionBackend) {
-    this.repoManager = repoManager;
-    this.commits = commits;
-    this.permissionBackend = permissionBackend;
-  }
-
-  @Override
-  public String apply(ProjectResource rsrc)
-      throws AuthException, ResourceNotFoundException, IOException, PermissionBackendException {
-    try (Repository repo = repoManager.openRepository(rsrc.getNameKey())) {
-      Ref head = repo.getRefDatabase().exactRef(Constants.HEAD);
-      if (head == null) {
-        throw new ResourceNotFoundException(Constants.HEAD);
-      } else if (head.isSymbolic()) {
-        String n = head.getTarget().getName();
-        permissionBackend
-            .user(rsrc.getUser())
-            .project(rsrc.getNameKey())
-            .ref(n)
-            .check(RefPermission.READ);
-        return n;
-      } else if (head.getObjectId() != null) {
-        try (RevWalk rw = new RevWalk(repo)) {
-          RevCommit commit = rw.parseCommit(head.getObjectId());
-          if (commits.canRead(rsrc.getProjectState(), repo, commit)) {
-            return head.getObjectId().name();
-          }
-          throw new AuthException("not allowed to see HEAD");
-        } catch (MissingObjectException | IncorrectObjectTypeException e) {
-          if (rsrc.getControl().isOwner()) {
-            return head.getObjectId().name();
-          }
-          throw new AuthException("not allowed to see HEAD");
-        }
-      }
-      throw new ResourceNotFoundException(Constants.HEAD);
-    } catch (RepositoryNotFoundException e) {
-      throw new ResourceNotFoundException(rsrc.getName());
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetParent.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetParent.java
deleted file mode 100644
index 8f0b6f0..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetParent.java
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-@Singleton
-class GetParent implements RestReadView<ProjectResource> {
-  private final AllProjectsName allProjectsName;
-
-  @Inject
-  GetParent(AllProjectsName allProjectsName) {
-    this.allProjectsName = allProjectsName;
-  }
-
-  @Override
-  public String apply(ProjectResource resource) {
-    Project project = resource.getProjectState().getProject();
-    Project.NameKey parentName = project.getParent(allProjectsName);
-    return parentName != null ? parentName.get() : "";
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetProject.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetProject.java
deleted file mode 100644
index 8288610..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetProject.java
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.common.ProjectInfo;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-@Singleton
-class GetProject implements RestReadView<ProjectResource> {
-
-  private final ProjectJson json;
-
-  @Inject
-  GetProject(ProjectJson json) {
-    this.json = json;
-  }
-
-  @Override
-  public ProjectInfo apply(ProjectResource rsrc) {
-    return json.format(rsrc.getProjectState());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetReflog.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetReflog.java
deleted file mode 100644
index 81f0873..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetReflog.java
+++ /dev/null
@@ -1,131 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.project;
-
-import com.google.common.collect.Lists;
-import com.google.gerrit.extensions.api.projects.ReflogEntryInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.server.CommonConverters;
-import com.google.gerrit.server.args4j.TimestampHandler;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.List;
-import org.eclipse.jgit.lib.ReflogEntry;
-import org.eclipse.jgit.lib.ReflogReader;
-import org.eclipse.jgit.lib.Repository;
-import org.kohsuke.args4j.Option;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class GetReflog implements RestReadView<BranchResource> {
-  private static final Logger log = LoggerFactory.getLogger(GetReflog.class);
-
-  private final GitRepositoryManager repoManager;
-
-  @Option(
-      name = "--limit",
-      aliases = {"-n"},
-      metaVar = "CNT",
-      usage = "maximum number of reflog entries to list")
-  public GetReflog setLimit(int limit) {
-    this.limit = limit;
-    return this;
-  }
-
-  @Option(
-      name = "--from",
-      metaVar = "TIMESTAMP",
-      usage =
-          "timestamp from which the reflog entries should be listed (UTC, format: "
-              + TimestampHandler.TIMESTAMP_FORMAT
-              + ")")
-  public GetReflog setFrom(Timestamp from) {
-    this.from = from;
-    return this;
-  }
-
-  @Option(
-      name = "--to",
-      metaVar = "TIMESTAMP",
-      usage =
-          "timestamp until which the reflog entries should be listed (UTC, format: "
-              + TimestampHandler.TIMESTAMP_FORMAT
-              + ")")
-  public GetReflog setTo(Timestamp to) {
-    this.to = to;
-    return this;
-  }
-
-  private int limit;
-  private Timestamp from;
-  private Timestamp to;
-
-  @Inject
-  public GetReflog(GitRepositoryManager repoManager) {
-    this.repoManager = repoManager;
-  }
-
-  @Override
-  public List<ReflogEntryInfo> apply(BranchResource rsrc) throws RestApiException, IOException {
-    if (!rsrc.getControl().isOwner()) {
-      throw new AuthException("not project owner");
-    }
-
-    try (Repository repo = repoManager.openRepository(rsrc.getNameKey())) {
-      ReflogReader r;
-      try {
-        r = repo.getReflogReader(rsrc.getRef());
-      } catch (UnsupportedOperationException e) {
-        String msg = "reflog not supported on repo " + rsrc.getNameKey().get();
-        log.error(msg);
-        throw new MethodNotAllowedException(msg);
-      }
-      if (r == null) {
-        throw new ResourceNotFoundException(rsrc.getRef());
-      }
-      List<ReflogEntry> entries;
-      if (from == null && to == null) {
-        entries = limit > 0 ? r.getReverseEntries(limit) : r.getReverseEntries();
-      } else {
-        entries = limit > 0 ? new ArrayList<>(limit) : new ArrayList<>();
-        for (ReflogEntry e : r.getReverseEntries()) {
-          Timestamp timestamp = new Timestamp(e.getWho().getWhen().getTime());
-          if ((from == null || from.before(timestamp)) && (to == null || to.after(timestamp))) {
-            entries.add(e);
-          }
-          if (limit > 0 && entries.size() >= limit) {
-            break;
-          }
-        }
-      }
-      return Lists.transform(entries, e -> newReflogEntryInfo(e));
-    }
-  }
-
-  private ReflogEntryInfo newReflogEntryInfo(ReflogEntry e) {
-    return new ReflogEntryInfo(
-        e.getOldId().getName(),
-        e.getNewId().getName(),
-        CommonConverters.toGitPerson(e.getWho()),
-        e.getComment());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetStatistics.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetStatistics.java
deleted file mode 100644
index 36d558c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetStatistics.java
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.project;
-
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.eclipse.jgit.api.GarbageCollectCommand;
-import org.eclipse.jgit.api.Git;
-import org.eclipse.jgit.api.errors.GitAPIException;
-import org.eclipse.jgit.api.errors.JGitInternalException;
-import org.eclipse.jgit.lib.Repository;
-
-@RequiresCapability(GlobalCapability.RUN_GC)
-@Singleton
-public class GetStatistics implements RestReadView<ProjectResource> {
-
-  private final GitRepositoryManager repoManager;
-
-  @Inject
-  GetStatistics(GitRepositoryManager repoManager) {
-    this.repoManager = repoManager;
-  }
-
-  @Override
-  public RepositoryStatistics apply(ProjectResource rsrc)
-      throws ResourceNotFoundException, ResourceConflictException {
-    try (Repository repo = repoManager.openRepository(rsrc.getNameKey())) {
-      GarbageCollectCommand gc = Git.wrap(repo).gc();
-      return new RepositoryStatistics(gc.getStatistics());
-    } catch (GitAPIException | JGitInternalException e) {
-      throw new ResourceConflictException(e.getMessage());
-    } catch (IOException e) {
-      throw new ResourceNotFoundException(rsrc.getName());
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetTag.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetTag.java
deleted file mode 100644
index a94d17e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetTag.java
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.api.projects.TagInfo;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.inject.Singleton;
-
-@Singleton
-public class GetTag implements RestReadView<TagResource> {
-
-  @Override
-  public TagInfo apply(TagResource resource) {
-    return resource.getTagInfo();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/Index.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/Index.java
deleted file mode 100644
index 8c8314b..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/Index.java
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.project;
-
-import static com.google.gerrit.server.git.QueueProvider.QueueType.BATCH;
-
-import com.google.common.io.ByteStreams;
-import com.google.common.util.concurrent.ListeningExecutorService;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
-import com.google.gerrit.extensions.api.projects.ProjectInput;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.git.MultiProgressMonitor;
-import com.google.gerrit.server.git.MultiProgressMonitor.Task;
-import com.google.gerrit.server.index.IndexExecutor;
-import com.google.gerrit.server.index.change.AllChangesIndexer;
-import com.google.gerrit.server.index.change.ChangeIndexer;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.concurrent.Future;
-import org.eclipse.jgit.util.io.NullOutputStream;
-
-@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
-@Singleton
-public class Index implements RestModifyView<ProjectResource, ProjectInput> {
-
-  private final Provider<AllChangesIndexer> allChangesIndexerProvider;
-  private final ChangeIndexer indexer;
-  private final ListeningExecutorService executor;
-
-  @Inject
-  Index(
-      Provider<AllChangesIndexer> allChangesIndexerProvider,
-      ChangeIndexer indexer,
-      @IndexExecutor(BATCH) ListeningExecutorService executor) {
-    this.allChangesIndexerProvider = allChangesIndexerProvider;
-    this.indexer = indexer;
-    this.executor = executor;
-  }
-
-  @Override
-  public Response.Accepted apply(ProjectResource resource, ProjectInput input) {
-    Project.NameKey project = resource.getNameKey();
-    Task mpt =
-        new MultiProgressMonitor(ByteStreams.nullOutputStream(), "Reindexing project")
-            .beginSubTask("", MultiProgressMonitor.UNKNOWN);
-    AllChangesIndexer allChangesIndexer = allChangesIndexerProvider.get();
-    allChangesIndexer.setVerboseOut(NullOutputStream.INSTANCE);
-    // The REST call is just a trigger for async reindexing, so it is safe to ignore the future's
-    // return value.
-    @SuppressWarnings("unused")
-    Future<Void> ignored =
-        executor.submit(allChangesIndexer.reindexProject(indexer, project, mpt, mpt));
-    return Response.accepted("Project " + project + " submitted for reindexing");
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListBranches.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListBranches.java
deleted file mode 100644
index 9227f3dd..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListBranches.java
+++ /dev/null
@@ -1,252 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.project;
-
-import com.google.common.collect.ComparisonChain;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Sets;
-import com.google.gerrit.extensions.api.projects.BranchInfo;
-import com.google.gerrit.extensions.api.projects.ProjectApi.ListRefsRequest;
-import com.google.gerrit.extensions.common.ActionInfo;
-import com.google.gerrit.extensions.common.WebLinkInfo;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.extensions.webui.UiAction;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.WebLinks;
-import com.google.gerrit.server.extensions.webui.UiActions;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.RefPermission;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Set;
-import java.util.TreeMap;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.kohsuke.args4j.Option;
-
-public class ListBranches implements RestReadView<ProjectResource> {
-  private final GitRepositoryManager repoManager;
-  private final PermissionBackend permissionBackend;
-  private final Provider<CurrentUser> user;
-  private final DynamicMap<RestView<BranchResource>> branchViews;
-  private final UiActions uiActions;
-  private final WebLinks webLinks;
-
-  @Option(
-      name = "--limit",
-      aliases = {"-n"},
-      metaVar = "CNT",
-      usage = "maximum number of branches to list")
-  public void setLimit(int limit) {
-    this.limit = limit;
-  }
-
-  @Option(
-      name = "--start",
-      aliases = {"-S", "-s"},
-      metaVar = "CNT",
-      usage = "number of branches to skip")
-  public void setStart(int start) {
-    this.start = start;
-  }
-
-  @Option(
-      name = "--match",
-      aliases = {"-m"},
-      metaVar = "MATCH",
-      usage = "match branches substring")
-  public void setMatchSubstring(String matchSubstring) {
-    this.matchSubstring = matchSubstring;
-  }
-
-  @Option(
-      name = "--regex",
-      aliases = {"-r"},
-      metaVar = "REGEX",
-      usage = "match branches regex")
-  public void setMatchRegex(String matchRegex) {
-    this.matchRegex = matchRegex;
-  }
-
-  private int limit;
-  private int start;
-  private String matchSubstring;
-  private String matchRegex;
-
-  @Inject
-  public ListBranches(
-      GitRepositoryManager repoManager,
-      PermissionBackend permissionBackend,
-      Provider<CurrentUser> user,
-      DynamicMap<RestView<BranchResource>> branchViews,
-      UiActions uiActions,
-      WebLinks webLinks) {
-    this.repoManager = repoManager;
-    this.permissionBackend = permissionBackend;
-    this.user = user;
-    this.branchViews = branchViews;
-    this.uiActions = uiActions;
-    this.webLinks = webLinks;
-  }
-
-  public ListBranches request(ListRefsRequest<BranchInfo> request) {
-    this.setLimit(request.getLimit());
-    this.setStart(request.getStart());
-    this.setMatchSubstring(request.getSubstring());
-    this.setMatchRegex(request.getRegex());
-    return this;
-  }
-
-  @Override
-  public List<BranchInfo> apply(ProjectResource rsrc)
-      throws ResourceNotFoundException, IOException, BadRequestException,
-          PermissionBackendException {
-    return new RefFilter<BranchInfo>(Constants.R_HEADS)
-        .subString(matchSubstring)
-        .regex(matchRegex)
-        .start(start)
-        .limit(limit)
-        .filter(allBranches(rsrc));
-  }
-
-  BranchInfo toBranchInfo(BranchResource rsrc)
-      throws IOException, ResourceNotFoundException, PermissionBackendException {
-    try (Repository db = repoManager.openRepository(rsrc.getNameKey())) {
-      Ref r = db.exactRef(rsrc.getRef());
-      if (r == null) {
-        throw new ResourceNotFoundException();
-      }
-      return toBranchInfo(rsrc, ImmutableList.of(r)).get(0);
-    } catch (RepositoryNotFoundException noRepo) {
-      throw new ResourceNotFoundException();
-    }
-  }
-
-  private List<BranchInfo> allBranches(ProjectResource rsrc)
-      throws IOException, ResourceNotFoundException, PermissionBackendException {
-    List<Ref> refs;
-    try (Repository db = repoManager.openRepository(rsrc.getNameKey())) {
-      Collection<Ref> heads = db.getRefDatabase().getRefs(Constants.R_HEADS).values();
-      refs = new ArrayList<>(heads.size() + 3);
-      refs.addAll(heads);
-      refs.addAll(
-          db.getRefDatabase()
-              .exactRef(Constants.HEAD, RefNames.REFS_CONFIG, RefNames.REFS_USERS_DEFAULT)
-              .values());
-    } catch (RepositoryNotFoundException noGitRepository) {
-      throw new ResourceNotFoundException();
-    }
-    return toBranchInfo(rsrc, refs);
-  }
-
-  private List<BranchInfo> toBranchInfo(ProjectResource rsrc, List<Ref> refs)
-      throws PermissionBackendException {
-    Set<String> targets = Sets.newHashSetWithExpectedSize(1);
-    for (Ref ref : refs) {
-      if (ref.isSymbolic()) {
-        targets.add(ref.getTarget().getName());
-      }
-    }
-
-    ProjectControl pctl = rsrc.getControl();
-    PermissionBackend.ForProject perm = permissionBackend.user(user).project(rsrc.getNameKey());
-    List<BranchInfo> branches = new ArrayList<>(refs.size());
-    for (Ref ref : refs) {
-      if (ref.isSymbolic()) {
-        // A symbolic reference to another branch, instead of
-        // showing the resolved value, show the name it references.
-        //
-        String target = ref.getTarget().getName();
-        if (!perm.ref(target).test(RefPermission.READ)) {
-          continue;
-        }
-        if (target.startsWith(Constants.R_HEADS)) {
-          target = target.substring(Constants.R_HEADS.length());
-        }
-
-        BranchInfo b = new BranchInfo();
-        b.ref = ref.getName();
-        b.revision = target;
-        branches.add(b);
-
-        if (!Constants.HEAD.equals(ref.getName())) {
-          b.canDelete = perm.ref(ref.getName()).testOrFalse(RefPermission.DELETE) ? true : null;
-        }
-        continue;
-      }
-
-      if (perm.ref(ref.getName()).test(RefPermission.READ)) {
-        branches.add(createBranchInfo(perm.ref(ref.getName()), ref, pctl, targets));
-      }
-    }
-    Collections.sort(branches, new BranchComparator());
-    return branches;
-  }
-
-  private static class BranchComparator implements Comparator<BranchInfo> {
-    @Override
-    public int compare(BranchInfo a, BranchInfo b) {
-      return ComparisonChain.start()
-          .compareTrueFirst(isHead(a), isHead(b))
-          .compareTrueFirst(isConfig(a), isConfig(b))
-          .compare(a.ref, b.ref)
-          .result();
-    }
-
-    private static boolean isHead(BranchInfo i) {
-      return Constants.HEAD.equals(i.ref);
-    }
-
-    private static boolean isConfig(BranchInfo i) {
-      return RefNames.REFS_CONFIG.equals(i.ref);
-    }
-  }
-
-  private BranchInfo createBranchInfo(
-      PermissionBackend.ForRef perm, Ref ref, ProjectControl pctl, Set<String> targets) {
-    BranchInfo info = new BranchInfo();
-    info.ref = ref.getName();
-    info.revision = ref.getObjectId() != null ? ref.getObjectId().name() : null;
-    info.canDelete =
-        !targets.contains(ref.getName()) && perm.testOrFalse(RefPermission.DELETE) ? true : null;
-
-    BranchResource rsrc = new BranchResource(pctl, ref);
-    for (UiAction.Description d : uiActions.from(branchViews, rsrc)) {
-      if (info.actions == null) {
-        info.actions = new TreeMap<>();
-      }
-      info.actions.put(d.getId(), new ActionInfo(d));
-    }
-
-    List<WebLinkInfo> links = webLinks.getBranchLinks(pctl.getProject().getName(), ref.getName());
-    info.webLinks = links.isEmpty() ? null : links;
-    return info;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListChildProjects.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListChildProjects.java
deleted file mode 100644
index 5a6aa11..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListChildProjects.java
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.project;
-
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.Multimap;
-import com.google.gerrit.extensions.common.ProjectInfo;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.ProjectPermission;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.kohsuke.args4j.Option;
-
-public class ListChildProjects implements RestReadView<ProjectResource> {
-
-  @Option(name = "--recursive", usage = "to list child projects recursively")
-  private boolean recursive;
-
-  private final ProjectCache projectCache;
-  private final PermissionBackend permissionBackend;
-  private final Provider<CurrentUser> user;
-  private final AllProjectsName allProjects;
-  private final ProjectJson json;
-
-  @Inject
-  ListChildProjects(
-      ProjectCache projectCache,
-      PermissionBackend permissionBackend,
-      Provider<CurrentUser> user,
-      AllProjectsName allProjectsName,
-      ProjectJson json) {
-    this.projectCache = projectCache;
-    this.permissionBackend = permissionBackend;
-    this.user = user;
-    this.allProjects = allProjectsName;
-    this.json = json;
-  }
-
-  public void setRecursive(boolean recursive) {
-    this.recursive = recursive;
-  }
-
-  @Override
-  public List<ProjectInfo> apply(ProjectResource rsrc) throws PermissionBackendException {
-    if (recursive) {
-      return recursiveChildProjects(rsrc.getNameKey());
-    }
-    return directChildProjects(rsrc.getNameKey());
-  }
-
-  private List<ProjectInfo> directChildProjects(Project.NameKey parent)
-      throws PermissionBackendException {
-    Map<Project.NameKey, Project> children = new HashMap<>();
-    for (Project.NameKey name : projectCache.all()) {
-      ProjectState c = projectCache.get(name);
-      if (c != null && parent.equals(c.getProject().getParent(allProjects))) {
-        children.put(c.getNameKey(), c.getProject());
-      }
-    }
-    return permissionBackend.user(user).filter(ProjectPermission.ACCESS, children.keySet()).stream()
-        .sorted()
-        .map((p) -> json.format(children.get(p)))
-        .collect(toList());
-  }
-
-  private List<ProjectInfo> recursiveChildProjects(Project.NameKey parent)
-      throws PermissionBackendException {
-    Map<Project.NameKey, Project> projects = readAllProjects();
-    Multimap<Project.NameKey, Project.NameKey> children = parentToChildren(projects);
-    PermissionBackend.WithUser perm = permissionBackend.user(user);
-
-    List<ProjectInfo> results = new ArrayList<>();
-    depthFirstFormat(results, perm, projects, children, parent);
-    return results;
-  }
-
-  private Map<Project.NameKey, Project> readAllProjects() {
-    Map<Project.NameKey, Project> projects = new HashMap<>();
-    for (Project.NameKey name : projectCache.all()) {
-      ProjectState c = projectCache.get(name);
-      if (c != null) {
-        projects.put(c.getNameKey(), c.getProject());
-      }
-    }
-    return projects;
-  }
-
-  /** Map of parent project to direct child. */
-  private Multimap<Project.NameKey, Project.NameKey> parentToChildren(
-      Map<Project.NameKey, Project> projects) {
-    Multimap<Project.NameKey, Project.NameKey> m = ArrayListMultimap.create();
-    for (Map.Entry<Project.NameKey, Project> e : projects.entrySet()) {
-      if (!allProjects.equals(e.getKey())) {
-        m.put(e.getValue().getParent(allProjects), e.getKey());
-      }
-    }
-    return m;
-  }
-
-  private void depthFirstFormat(
-      List<ProjectInfo> results,
-      PermissionBackend.WithUser perm,
-      Map<Project.NameKey, Project> projects,
-      Multimap<Project.NameKey, Project.NameKey> children,
-      Project.NameKey parent)
-      throws PermissionBackendException {
-    List<Project.NameKey> canSee =
-        perm.filter(ProjectPermission.ACCESS, children.get(parent)).stream()
-            .sorted()
-            .collect(toList());
-    children.removeAll(parent); // removing all entries prevents cycles.
-
-    for (Project.NameKey c : canSee) {
-      results.add(json.format(projects.get(c)));
-      depthFirstFormat(results, perm, projects, children, c);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListDashboards.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListDashboards.java
deleted file mode 100644
index 94f7af9..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListDashboards.java
+++ /dev/null
@@ -1,156 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.project;
-
-import static com.google.gerrit.reviewdb.client.RefNames.REFS_DASHBOARDS;
-
-import com.google.gerrit.extensions.api.projects.DashboardInfo;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.ProjectPermission;
-import com.google.gerrit.server.permissions.RefPermission;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.BlobBasedConfig;
-import org.eclipse.jgit.lib.FileMode;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.treewalk.TreeWalk;
-import org.kohsuke.args4j.Option;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ListDashboards implements RestReadView<ProjectResource> {
-  private static final Logger log = LoggerFactory.getLogger(ListDashboards.class);
-
-  private final GitRepositoryManager gitManager;
-  private final PermissionBackend permissionBackend;
-  private final Provider<CurrentUser> user;
-
-  @Option(name = "--inherited", usage = "include inherited dashboards")
-  private boolean inherited;
-
-  @Inject
-  ListDashboards(
-      GitRepositoryManager gitManager,
-      PermissionBackend permissionBackend,
-      Provider<CurrentUser> user) {
-    this.gitManager = gitManager;
-    this.permissionBackend = permissionBackend;
-    this.user = user;
-  }
-
-  @Override
-  public List<?> apply(ProjectResource rsrc)
-      throws ResourceNotFoundException, IOException, PermissionBackendException {
-    String project = rsrc.getName();
-    if (!inherited) {
-      return scan(rsrc.getProjectState(), project, true);
-    }
-
-    List<List<DashboardInfo>> all = new ArrayList<>();
-    boolean setDefault = true;
-    for (ProjectState ps : tree(rsrc)) {
-      List<DashboardInfo> list = scan(ps, project, setDefault);
-      for (DashboardInfo d : list) {
-        if (d.isDefault != null && Boolean.TRUE.equals(d.isDefault)) {
-          setDefault = false;
-        }
-      }
-      if (!list.isEmpty()) {
-        all.add(list);
-      }
-    }
-    return all;
-  }
-
-  private Collection<ProjectState> tree(ProjectResource rsrc) throws PermissionBackendException {
-    Map<Project.NameKey, ProjectState> tree = new LinkedHashMap<>();
-    for (ProjectState ps : rsrc.getProjectState().tree()) {
-      tree.put(ps.getNameKey(), ps);
-    }
-    tree.keySet()
-        .retainAll(permissionBackend.user(user).filter(ProjectPermission.ACCESS, tree.keySet()));
-    return tree.values();
-  }
-
-  private List<DashboardInfo> scan(ProjectState state, String project, boolean setDefault)
-      throws ResourceNotFoundException, IOException, PermissionBackendException {
-    PermissionBackend.ForProject perm = permissionBackend.user(user).project(state.getNameKey());
-    try (Repository git = gitManager.openRepository(state.getNameKey());
-        RevWalk rw = new RevWalk(git)) {
-      List<DashboardInfo> all = new ArrayList<>();
-      for (Ref ref : git.getRefDatabase().getRefs(REFS_DASHBOARDS).values()) {
-        if (perm.ref(ref.getName()).test(RefPermission.READ)) {
-          all.addAll(scanDashboards(state.getProject(), git, rw, ref, project, setDefault));
-        }
-      }
-      return all;
-    } catch (RepositoryNotFoundException e) {
-      throw new ResourceNotFoundException();
-    }
-  }
-
-  private List<DashboardInfo> scanDashboards(
-      Project definingProject,
-      Repository git,
-      RevWalk rw,
-      Ref ref,
-      String project,
-      boolean setDefault)
-      throws IOException {
-    List<DashboardInfo> list = new ArrayList<>();
-    try (TreeWalk tw = new TreeWalk(rw.getObjectReader())) {
-      tw.addTree(rw.parseTree(ref.getObjectId()));
-      tw.setRecursive(true);
-      while (tw.next()) {
-        if (tw.getFileMode(0) == FileMode.REGULAR_FILE) {
-          try {
-            list.add(
-                DashboardsCollection.parse(
-                    definingProject,
-                    ref.getName().substring(REFS_DASHBOARDS.length()),
-                    tw.getPathString(),
-                    new BlobBasedConfig(null, git, tw.getObjectId(0)),
-                    project,
-                    setDefault));
-          } catch (ConfigInvalidException e) {
-            log.warn(
-                "Cannot parse dashboard {}:{}:{}: {}",
-                definingProject.getName(),
-                ref.getName(),
-                tw.getPathString(),
-                e.getMessage());
-          }
-        }
-      }
-    }
-    return list;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListProjects.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListProjects.java
deleted file mode 100644
index 9ed04b0..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListProjects.java
+++ /dev/null
@@ -1,612 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.project;
-
-import static com.google.gerrit.extensions.client.ProjectState.HIDDEN;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.extensions.common.ProjectInfo;
-import com.google.gerrit.extensions.common.WebLinkInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.BinaryResult;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.extensions.restapi.Url;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.OutputFormat;
-import com.google.gerrit.server.StringUtil;
-import com.google.gerrit.server.WebLinks;
-import com.google.gerrit.server.account.GroupControl;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.group.GroupsCollection;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.ProjectPermission;
-import com.google.gerrit.server.permissions.RefPermission;
-import com.google.gerrit.server.util.RegexListSearcher;
-import com.google.gerrit.server.util.TreeFormatter;
-import com.google.gson.reflect.TypeToken;
-import com.google.inject.Inject;
-import java.io.BufferedWriter;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Objects;
-import java.util.SortedMap;
-import java.util.SortedSet;
-import java.util.TreeMap;
-import java.util.TreeSet;
-import java.util.stream.Stream;
-import java.util.stream.StreamSupport;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.kohsuke.args4j.Option;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** List projects visible to the calling user. */
-public class ListProjects implements RestReadView<TopLevelResource> {
-  private static final Logger log = LoggerFactory.getLogger(ListProjects.class);
-
-  public enum FilterType {
-    CODE {
-      @Override
-      boolean matches(Repository git) throws IOException {
-        return !PERMISSIONS.matches(git);
-      }
-
-      @Override
-      boolean useMatch() {
-        return true;
-      }
-    },
-    PARENT_CANDIDATES {
-      @Override
-      boolean matches(Repository git) {
-        return true;
-      }
-
-      @Override
-      boolean useMatch() {
-        return false;
-      }
-    },
-    PERMISSIONS {
-      @Override
-      boolean matches(Repository git) throws IOException {
-        Ref head = git.getRefDatabase().exactRef(Constants.HEAD);
-        return head != null
-            && head.isSymbolic()
-            && RefNames.REFS_CONFIG.equals(head.getLeaf().getName());
-      }
-
-      @Override
-      boolean useMatch() {
-        return true;
-      }
-    },
-    ALL {
-      @Override
-      boolean matches(Repository git) {
-        return true;
-      }
-
-      @Override
-      boolean useMatch() {
-        return false;
-      }
-    };
-
-    abstract boolean matches(Repository git) throws IOException;
-
-    abstract boolean useMatch();
-  }
-
-  private final CurrentUser currentUser;
-  private final ProjectCache projectCache;
-  private final GroupsCollection groupsCollection;
-  private final GroupControl.Factory groupControlFactory;
-  private final GitRepositoryManager repoManager;
-  private final PermissionBackend permissionBackend;
-  private final ProjectNode.Factory projectNodeFactory;
-  private final WebLinks webLinks;
-
-  @Deprecated
-  @Option(name = "--format", usage = "(deprecated) output format")
-  private OutputFormat format = OutputFormat.TEXT;
-
-  @Option(
-      name = "--show-branch",
-      aliases = {"-b"},
-      usage = "displays the sha of each project in the specified branch")
-  public void addShowBranch(String branch) {
-    showBranch.add(branch);
-  }
-
-  @Option(
-      name = "--tree",
-      aliases = {"-t"},
-      usage =
-          "displays project inheritance in a tree-like format\n"
-              + "this option does not work together with the show-branch option")
-  public void setShowTree(boolean showTree) {
-    this.showTree = showTree;
-  }
-
-  @Option(name = "--type", usage = "type of project")
-  public void setFilterType(FilterType type) {
-    this.type = type;
-  }
-
-  @Option(
-      name = "--description",
-      aliases = {"-d"},
-      usage = "include description of project in list")
-  public void setShowDescription(boolean showDescription) {
-    this.showDescription = showDescription;
-  }
-
-  @Option(name = "--all", usage = "display all projects that are accessible by the calling user")
-  public void setAll(boolean all) {
-    this.all = all;
-  }
-
-  @Option(
-      name = "--limit",
-      aliases = {"-n"},
-      metaVar = "CNT",
-      usage = "maximum number of projects to list")
-  public void setLimit(int limit) {
-    this.limit = limit;
-  }
-
-  @Option(
-      name = "--start",
-      aliases = {"-S"},
-      metaVar = "CNT",
-      usage = "number of projects to skip")
-  public void setStart(int start) {
-    this.start = start;
-  }
-
-  @Option(
-      name = "--prefix",
-      aliases = {"-p"},
-      metaVar = "PREFIX",
-      usage = "match project prefix")
-  public void setMatchPrefix(String matchPrefix) {
-    this.matchPrefix = matchPrefix;
-  }
-
-  @Option(
-      name = "--match",
-      aliases = {"-m"},
-      metaVar = "MATCH",
-      usage = "match project substring")
-  public void setMatchSubstring(String matchSubstring) {
-    this.matchSubstring = matchSubstring;
-  }
-
-  @Option(name = "-r", metaVar = "REGEX", usage = "match project regex")
-  public void setMatchRegex(String matchRegex) {
-    this.matchRegex = matchRegex;
-  }
-
-  @Option(
-      name = "--has-acl-for",
-      metaVar = "GROUP",
-      usage = "displays only projects on which access rights for this group are directly assigned")
-  public void setGroupUuid(AccountGroup.UUID groupUuid) {
-    this.groupUuid = groupUuid;
-  }
-
-  private final List<String> showBranch = new ArrayList<>();
-  private boolean showTree;
-  private FilterType type = FilterType.ALL;
-  private boolean showDescription;
-  private boolean all;
-  private int limit;
-  private int start;
-  private String matchPrefix;
-  private String matchSubstring;
-  private String matchRegex;
-  private AccountGroup.UUID groupUuid;
-
-  @Inject
-  protected ListProjects(
-      CurrentUser currentUser,
-      ProjectCache projectCache,
-      GroupsCollection groupsCollection,
-      GroupControl.Factory groupControlFactory,
-      GitRepositoryManager repoManager,
-      PermissionBackend permissionBackend,
-      ProjectNode.Factory projectNodeFactory,
-      WebLinks webLinks) {
-    this.currentUser = currentUser;
-    this.projectCache = projectCache;
-    this.groupsCollection = groupsCollection;
-    this.groupControlFactory = groupControlFactory;
-    this.repoManager = repoManager;
-    this.permissionBackend = permissionBackend;
-    this.projectNodeFactory = projectNodeFactory;
-    this.webLinks = webLinks;
-  }
-
-  public List<String> getShowBranch() {
-    return showBranch;
-  }
-
-  public boolean isShowTree() {
-    return showTree;
-  }
-
-  public boolean isShowDescription() {
-    return showDescription;
-  }
-
-  public OutputFormat getFormat() {
-    return format;
-  }
-
-  public ListProjects setFormat(OutputFormat fmt) {
-    format = fmt;
-    return this;
-  }
-
-  @Override
-  public Object apply(TopLevelResource resource)
-      throws BadRequestException, PermissionBackendException {
-    if (format == OutputFormat.TEXT) {
-      ByteArrayOutputStream buf = new ByteArrayOutputStream();
-      display(buf);
-      return BinaryResult.create(buf.toByteArray())
-          .setContentType("text/plain")
-          .setCharacterEncoding(UTF_8);
-    }
-    return apply();
-  }
-
-  public SortedMap<String, ProjectInfo> apply()
-      throws BadRequestException, PermissionBackendException {
-    format = OutputFormat.JSON;
-    return display(null);
-  }
-
-  public SortedMap<String, ProjectInfo> display(@Nullable OutputStream displayOutputStream)
-      throws BadRequestException, PermissionBackendException {
-    if (groupUuid != null) {
-      try {
-        if (!groupControlFactory.controlFor(groupUuid).isVisible()) {
-          return Collections.emptySortedMap();
-        }
-      } catch (NoSuchGroupException ex) {
-        return Collections.emptySortedMap();
-      }
-    }
-
-    PrintWriter stdout = null;
-    if (displayOutputStream != null) {
-      stdout =
-          new PrintWriter(new BufferedWriter(new OutputStreamWriter(displayOutputStream, UTF_8)));
-    }
-
-    if (type == FilterType.PARENT_CANDIDATES) {
-      // Historically, PARENT_CANDIDATES implied showDescription.
-      showDescription = true;
-    }
-
-    int foundIndex = 0;
-    int found = 0;
-    TreeMap<String, ProjectInfo> output = new TreeMap<>();
-    Map<String, String> hiddenNames = new HashMap<>();
-    Map<Project.NameKey, Boolean> accessibleParents = new HashMap<>();
-    PermissionBackend.WithUser perm = permissionBackend.user(currentUser);
-    final TreeMap<Project.NameKey, ProjectNode> treeMap = new TreeMap<>();
-    try {
-      Iterable<Project.NameKey> projectNames = filter(perm)::iterator;
-      for (Project.NameKey projectName : projectNames) {
-        final ProjectState e = projectCache.get(projectName);
-        if (e == null || (!all && e.getProject().getState() == HIDDEN)) {
-          // If we can't get it from the cache, pretend its not present.
-          // If all wasn't selected, and its HIDDEN, pretend its not present.
-          continue;
-        }
-
-        final ProjectControl pctl = e.controlFor(currentUser);
-        if (groupUuid != null
-            && !pctl.getProjectState()
-                .getLocalGroups()
-                .contains(GroupReference.forGroup(groupsCollection.parseId(groupUuid.get())))) {
-          continue;
-        }
-
-        ProjectInfo info = new ProjectInfo();
-        if (showTree && !format.isJson()) {
-          treeMap.put(projectName, projectNodeFactory.create(pctl.getProject(), true));
-          continue;
-        }
-
-        info.name = projectName.get();
-        if (showTree && format.isJson()) {
-          ProjectState parent = Iterables.getFirst(e.parents(), null);
-          if (parent != null) {
-            if (isParentAccessible(accessibleParents, perm, parent)) {
-              info.parent = parent.getName();
-            } else {
-              info.parent = hiddenNames.get(parent.getName());
-              if (info.parent == null) {
-                info.parent = "?-" + (hiddenNames.size() + 1);
-                hiddenNames.put(parent.getName(), info.parent);
-              }
-            }
-          }
-        }
-
-        if (showDescription) {
-          info.description = Strings.emptyToNull(e.getProject().getDescription());
-        }
-        info.state = e.getProject().getState();
-
-        try {
-          if (!showBranch.isEmpty()) {
-            try (Repository git = repoManager.openRepository(projectName)) {
-              if (!type.matches(git)) {
-                continue;
-              }
-
-              List<Ref> refs = getBranchRefs(projectName, pctl);
-              if (!hasValidRef(refs)) {
-                continue;
-              }
-
-              for (int i = 0; i < showBranch.size(); i++) {
-                Ref ref = refs.get(i);
-                if (ref != null && ref.getObjectId() != null) {
-                  if (info.branches == null) {
-                    info.branches = new LinkedHashMap<>();
-                  }
-                  info.branches.put(showBranch.get(i), ref.getObjectId().name());
-                }
-              }
-            }
-          } else if (!showTree && type.useMatch()) {
-            try (Repository git = repoManager.openRepository(projectName)) {
-              if (!type.matches(git)) {
-                continue;
-              }
-            }
-          }
-        } catch (RepositoryNotFoundException err) {
-          // If the Git repository is gone, the project doesn't actually exist anymore.
-          continue;
-        } catch (IOException err) {
-          log.warn("Unexpected error reading " + projectName, err);
-          continue;
-        }
-
-        if (type != FilterType.PARENT_CANDIDATES) {
-          List<WebLinkInfo> links = webLinks.getProjectLinks(projectName.get());
-          info.webLinks = links.isEmpty() ? null : links;
-        }
-
-        if (foundIndex++ < start) {
-          continue;
-        }
-        if (limit > 0 && ++found > limit) {
-          break;
-        }
-
-        if (stdout == null || format.isJson()) {
-          output.put(info.name, info);
-          continue;
-        }
-
-        if (!showBranch.isEmpty()) {
-          for (String name : showBranch) {
-            String ref = info.branches != null ? info.branches.get(name) : null;
-            if (ref == null) {
-              // Print stub (forty '-' symbols)
-              ref = "----------------------------------------";
-            }
-            stdout.print(ref);
-            stdout.print(' ');
-          }
-        }
-        stdout.print(info.name);
-
-        if (info.description != null) {
-          // We still want to list every project as one-liners, hence escaping \n.
-          stdout.print(" - " + StringUtil.escapeString(info.description));
-        }
-        stdout.print('\n');
-      }
-
-      for (ProjectInfo info : output.values()) {
-        info.id = Url.encode(info.name);
-        info.name = null;
-      }
-      if (stdout == null) {
-        return output;
-      } else if (format.isJson()) {
-        format
-            .newGson()
-            .toJson(output, new TypeToken<Map<String, ProjectInfo>>() {}.getType(), stdout);
-        stdout.print('\n');
-      } else if (showTree && treeMap.size() > 0) {
-        printProjectTree(stdout, treeMap);
-      }
-      return null;
-    } finally {
-      if (stdout != null) {
-        stdout.flush();
-      }
-    }
-  }
-
-  private Stream<Project.NameKey> filter(PermissionBackend.WithUser perm)
-      throws BadRequestException {
-    Stream<Project.NameKey> matches = StreamSupport.stream(scan().spliterator(), false);
-    if (type == FilterType.PARENT_CANDIDATES) {
-      matches =
-          matches.map(projectCache::get).map(this::parentOf).filter(Objects::nonNull).sorted();
-    }
-    return matches.filter(p -> perm.project(p).testOrFalse(ProjectPermission.ACCESS));
-  }
-
-  private Project.NameKey parentOf(ProjectState ps) {
-    if (ps == null) {
-      return null;
-    }
-    Project.NameKey parent = ps.getProject().getParent();
-    if (parent != null) {
-      if (projectCache.get(parent) != null) {
-        return parent;
-      }
-      log.warn("parent project {} of project {} not found", parent.get(), ps.getName());
-    }
-    return null;
-  }
-
-  private boolean isParentAccessible(
-      Map<Project.NameKey, Boolean> checked, PermissionBackend.WithUser perm, ProjectState p)
-      throws PermissionBackendException {
-    Project.NameKey name = p.getNameKey();
-    Boolean b = checked.get(name);
-    if (b == null) {
-      try {
-        perm.project(name).check(ProjectPermission.ACCESS);
-        b = true;
-      } catch (AuthException denied) {
-        b = false;
-      }
-      checked.put(name, b);
-    }
-    return b;
-  }
-
-  private Iterable<Project.NameKey> scan() throws BadRequestException {
-    if (matchPrefix != null) {
-      checkMatchOptions(matchSubstring == null && matchRegex == null);
-      return projectCache.byName(matchPrefix);
-    } else if (matchSubstring != null) {
-      checkMatchOptions(matchPrefix == null && matchRegex == null);
-      return Iterables.filter(
-          projectCache.all(),
-          p -> p.get().toLowerCase(Locale.US).contains(matchSubstring.toLowerCase(Locale.US)));
-    } else if (matchRegex != null) {
-      checkMatchOptions(matchPrefix == null && matchSubstring == null);
-      RegexListSearcher<Project.NameKey> searcher;
-      try {
-        searcher =
-            new RegexListSearcher<Project.NameKey>(matchRegex) {
-              @Override
-              public String apply(Project.NameKey in) {
-                return in.get();
-              }
-            };
-      } catch (IllegalArgumentException e) {
-        throw new BadRequestException(e.getMessage());
-      }
-      return searcher.search(ImmutableList.copyOf(projectCache.all()));
-    } else {
-      return projectCache.all();
-    }
-  }
-
-  private static void checkMatchOptions(boolean cond) throws BadRequestException {
-    if (!cond) {
-      throw new BadRequestException("specify exactly one of p/m/r");
-    }
-  }
-
-  private void printProjectTree(
-      final PrintWriter stdout, TreeMap<Project.NameKey, ProjectNode> treeMap) {
-    final SortedSet<ProjectNode> sortedNodes = new TreeSet<>();
-
-    // Builds the inheritance tree using a list.
-    //
-    for (ProjectNode key : treeMap.values()) {
-      if (key.isAllProjects()) {
-        sortedNodes.add(key);
-        continue;
-      }
-
-      ProjectNode node = treeMap.get(key.getParentName());
-      if (node != null) {
-        node.addChild(key);
-      } else {
-        sortedNodes.add(key);
-      }
-    }
-
-    final TreeFormatter treeFormatter = new TreeFormatter(stdout);
-    treeFormatter.printTree(sortedNodes);
-    stdout.flush();
-  }
-
-  private List<Ref> getBranchRefs(Project.NameKey projectName, ProjectControl projectControl) {
-    Ref[] result = new Ref[showBranch.size()];
-    try (Repository git = repoManager.openRepository(projectName)) {
-      PermissionBackend.ForProject perm = permissionBackend.user(currentUser).project(projectName);
-      for (int i = 0; i < showBranch.size(); i++) {
-        Ref ref = git.findRef(showBranch.get(i));
-        if (all && projectControl.isOwner()) {
-          result[i] = ref;
-        } else if (ref != null && ref.getObjectId() != null) {
-          try {
-            perm.ref(ref.getLeaf().getName()).check(RefPermission.READ);
-            result[i] = ref;
-          } catch (AuthException e) {
-            continue;
-          }
-        }
-      }
-    } catch (IOException | PermissionBackendException e) {
-      // Fall through and return what is available.
-    }
-    return Arrays.asList(result);
-  }
-
-  private static boolean hasValidRef(List<Ref> refs) {
-    for (Ref ref : refs) {
-      if (ref != null) {
-        return true;
-      }
-    }
-    return false;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListTags.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListTags.java
deleted file mode 100644
index 58ee77d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListTags.java
+++ /dev/null
@@ -1,224 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.project;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.gerrit.extensions.api.projects.ProjectApi.ListRefsRequest;
-import com.google.gerrit.extensions.api.projects.TagInfo;
-import com.google.gerrit.extensions.common.WebLinkInfo;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.CommonConverters;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.WebLinks;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.VisibleRefFilter;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.RefPermission;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
-import org.eclipse.jgit.errors.MissingObjectException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevObject;
-import org.eclipse.jgit.revwalk.RevTag;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.kohsuke.args4j.Option;
-
-public class ListTags implements RestReadView<ProjectResource> {
-  private final GitRepositoryManager repoManager;
-  private final PermissionBackend permissionBackend;
-  private final Provider<CurrentUser> user;
-  private final VisibleRefFilter.Factory refFilterFactory;
-  private final WebLinks links;
-
-  @Option(
-      name = "--limit",
-      aliases = {"-n"},
-      metaVar = "CNT",
-      usage = "maximum number of tags to list")
-  public void setLimit(int limit) {
-    this.limit = limit;
-  }
-
-  @Option(
-      name = "--start",
-      aliases = {"-S", "-s"},
-      metaVar = "CNT",
-      usage = "number of tags to skip")
-  public void setStart(int start) {
-    this.start = start;
-  }
-
-  @Option(
-      name = "--match",
-      aliases = {"-m"},
-      metaVar = "MATCH",
-      usage = "match tags substring")
-  public void setMatchSubstring(String matchSubstring) {
-    this.matchSubstring = matchSubstring;
-  }
-
-  @Option(
-      name = "--regex",
-      aliases = {"-r"},
-      metaVar = "REGEX",
-      usage = "match tags regex")
-  public void setMatchRegex(String matchRegex) {
-    this.matchRegex = matchRegex;
-  }
-
-  private int limit;
-  private int start;
-  private String matchSubstring;
-  private String matchRegex;
-
-  @Inject
-  public ListTags(
-      GitRepositoryManager repoManager,
-      PermissionBackend permissionBackend,
-      Provider<CurrentUser> user,
-      VisibleRefFilter.Factory refFilterFactory,
-      WebLinks webLinks) {
-    this.repoManager = repoManager;
-    this.permissionBackend = permissionBackend;
-    this.user = user;
-    this.refFilterFactory = refFilterFactory;
-    this.links = webLinks;
-  }
-
-  public ListTags request(ListRefsRequest<TagInfo> request) {
-    this.setLimit(request.getLimit());
-    this.setStart(request.getStart());
-    this.setMatchSubstring(request.getSubstring());
-    this.setMatchRegex(request.getRegex());
-    return this;
-  }
-
-  @Override
-  public List<TagInfo> apply(ProjectResource resource)
-      throws IOException, ResourceNotFoundException, BadRequestException {
-    List<TagInfo> tags = new ArrayList<>();
-
-    PermissionBackend.ForProject perm = permissionBackend.user(user).project(resource.getNameKey());
-    try (Repository repo = getRepository(resource.getNameKey());
-        RevWalk rw = new RevWalk(repo)) {
-      Map<String, Ref> all =
-          visibleTags(
-              resource.getProjectState(), repo, repo.getRefDatabase().getRefs(Constants.R_TAGS));
-      for (Ref ref : all.values()) {
-        tags.add(createTagInfo(perm.ref(ref.getName()), ref, rw, resource.getNameKey(), links));
-      }
-    }
-
-    Collections.sort(
-        tags,
-        new Comparator<TagInfo>() {
-          @Override
-          public int compare(TagInfo a, TagInfo b) {
-            return a.ref.compareTo(b.ref);
-          }
-        });
-
-    return new RefFilter<TagInfo>(Constants.R_TAGS)
-        .start(start)
-        .limit(limit)
-        .subString(matchSubstring)
-        .regex(matchRegex)
-        .filter(tags);
-  }
-
-  public TagInfo get(ProjectResource resource, IdString id)
-      throws ResourceNotFoundException, IOException {
-    try (Repository repo = getRepository(resource.getNameKey());
-        RevWalk rw = new RevWalk(repo)) {
-      String tagName = id.get();
-      if (!tagName.startsWith(Constants.R_TAGS)) {
-        tagName = Constants.R_TAGS + tagName;
-      }
-      Ref ref = repo.getRefDatabase().exactRef(tagName);
-      if (ref != null
-          && !visibleTags(resource.getProjectState(), repo, ImmutableMap.of(ref.getName(), ref))
-              .isEmpty()) {
-        return createTagInfo(
-            permissionBackend
-                .user(resource.getUser())
-                .project(resource.getNameKey())
-                .ref(ref.getName()),
-            ref,
-            rw,
-            resource.getNameKey(),
-            links);
-      }
-    }
-    throw new ResourceNotFoundException(id);
-  }
-
-  public static TagInfo createTagInfo(
-      PermissionBackend.ForRef perm,
-      Ref ref,
-      RevWalk rw,
-      Project.NameKey projectName,
-      WebLinks links)
-      throws MissingObjectException, IOException {
-    RevObject object = rw.parseAny(ref.getObjectId());
-    Boolean canDelete = perm.testOrFalse(RefPermission.DELETE) ? true : null;
-    List<WebLinkInfo> webLinks = links.getTagLinks(projectName.get(), ref.getName());
-    if (object instanceof RevTag) {
-      // Annotated or signed tag
-      RevTag tag = (RevTag) object;
-      PersonIdent tagger = tag.getTaggerIdent();
-      return new TagInfo(
-          ref.getName(),
-          tag.getName(),
-          tag.getObject().getName(),
-          tag.getFullMessage().trim(),
-          tagger != null ? CommonConverters.toGitPerson(tag.getTaggerIdent()) : null,
-          canDelete,
-          webLinks.isEmpty() ? null : webLinks);
-    }
-    // Lightweight tag
-    return new TagInfo(
-        ref.getName(),
-        ref.getObjectId().getName(),
-        canDelete,
-        webLinks.isEmpty() ? null : webLinks);
-  }
-
-  private Repository getRepository(Project.NameKey project)
-      throws ResourceNotFoundException, IOException {
-    try {
-      return repoManager.openRepository(project);
-    } catch (RepositoryNotFoundException noGitRepository) {
-      throw new ResourceNotFoundException();
-    }
-  }
-
-  private Map<String, Ref> visibleTags(ProjectState state, Repository repo, Map<String, Ref> tags) {
-    return refFilterFactory.create(state, repo).setShowMetadata(false).filter(tags, true);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/Module.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/Module.java
deleted file mode 100644
index d0753eb..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/Module.java
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.project;
-
-import static com.google.gerrit.server.project.BranchResource.BRANCH_KIND;
-import static com.google.gerrit.server.project.ChildProjectResource.CHILD_PROJECT_KIND;
-import static com.google.gerrit.server.project.CommitResource.COMMIT_KIND;
-import static com.google.gerrit.server.project.DashboardResource.DASHBOARD_KIND;
-import static com.google.gerrit.server.project.FileResource.FILE_KIND;
-import static com.google.gerrit.server.project.ProjectResource.PROJECT_KIND;
-import static com.google.gerrit.server.project.TagResource.TAG_KIND;
-
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.RestApiModule;
-import com.google.gerrit.server.change.CherryPickCommit;
-
-public class Module extends RestApiModule {
-  @Override
-  protected void configure() {
-    bind(ProjectsCollection.class);
-    bind(DashboardsCollection.class);
-
-    DynamicMap.mapOf(binder(), PROJECT_KIND);
-    DynamicMap.mapOf(binder(), CHILD_PROJECT_KIND);
-    DynamicMap.mapOf(binder(), BRANCH_KIND);
-    DynamicMap.mapOf(binder(), DASHBOARD_KIND);
-    DynamicMap.mapOf(binder(), FILE_KIND);
-    DynamicMap.mapOf(binder(), COMMIT_KIND);
-    DynamicMap.mapOf(binder(), TAG_KIND);
-
-    put(PROJECT_KIND).to(PutProject.class);
-    get(PROJECT_KIND).to(GetProject.class);
-    get(PROJECT_KIND, "description").to(GetDescription.class);
-    put(PROJECT_KIND, "description").to(PutDescription.class);
-    delete(PROJECT_KIND, "description").to(PutDescription.class);
-
-    get(PROJECT_KIND, "access").to(GetAccess.class);
-    post(PROJECT_KIND, "access").to(SetAccess.class);
-    put(PROJECT_KIND, "access:review").to(CreateAccessChange.class);
-    post(PROJECT_KIND, "check.access").to(CheckAccess.class);
-
-    get(PROJECT_KIND, "parent").to(GetParent.class);
-    put(PROJECT_KIND, "parent").to(SetParent.class);
-
-    child(PROJECT_KIND, "children").to(ChildProjectsCollection.class);
-    get(CHILD_PROJECT_KIND).to(GetChildProject.class);
-
-    get(PROJECT_KIND, "HEAD").to(GetHead.class);
-    put(PROJECT_KIND, "HEAD").to(SetHead.class);
-
-    put(PROJECT_KIND, "ban").to(BanCommit.class);
-
-    get(PROJECT_KIND, "statistics.git").to(GetStatistics.class);
-    post(PROJECT_KIND, "gc").to(GarbageCollect.class);
-    post(PROJECT_KIND, "index").to(Index.class);
-
-    child(PROJECT_KIND, "branches").to(BranchesCollection.class);
-    put(BRANCH_KIND).to(PutBranch.class);
-    get(BRANCH_KIND).to(GetBranch.class);
-    delete(BRANCH_KIND).to(DeleteBranch.class);
-    post(PROJECT_KIND, "branches:delete").to(DeleteBranches.class);
-    factory(CreateBranch.Factory.class);
-    get(BRANCH_KIND, "mergeable").to(CheckMergeability.class);
-    factory(RefValidationHelper.Factory.class);
-    get(BRANCH_KIND, "reflog").to(GetReflog.class);
-    child(BRANCH_KIND, "files").to(FilesCollection.class);
-    get(FILE_KIND, "content").to(GetContent.class);
-
-    child(PROJECT_KIND, "commits").to(CommitsCollection.class);
-    get(COMMIT_KIND).to(GetCommit.class);
-    get(COMMIT_KIND, "in").to(CommitIncludedIn.class);
-    child(COMMIT_KIND, "files").to(FilesInCommitCollection.class);
-
-    child(PROJECT_KIND, "tags").to(TagsCollection.class);
-    get(TAG_KIND).to(GetTag.class);
-    put(TAG_KIND).to(PutTag.class);
-    delete(TAG_KIND).to(DeleteTag.class);
-    post(PROJECT_KIND, "tags:delete").to(DeleteTags.class);
-    factory(CreateTag.Factory.class);
-
-    child(PROJECT_KIND, "dashboards").to(DashboardsCollection.class);
-    get(DASHBOARD_KIND).to(GetDashboard.class);
-    put(DASHBOARD_KIND).to(SetDashboard.class);
-    delete(DASHBOARD_KIND).to(DeleteDashboard.class);
-    factory(CreateProject.Factory.class);
-
-    get(PROJECT_KIND, "config").to(GetConfig.class);
-    put(PROJECT_KIND, "config").to(PutConfig.class);
-    post(COMMIT_KIND, "cherrypick").to(CherryPickCommit.class);
-
-    factory(DeleteRef.Factory.class);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/PerRequestProjectControlCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/PerRequestProjectControlCache.java
deleted file mode 100644
index 0f71ac8..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/PerRequestProjectControlCache.java
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.server.project;
-
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.CurrentUser;
-import com.google.inject.Inject;
-import com.google.inject.servlet.RequestScoped;
-import java.util.HashMap;
-import java.util.Map;
-
-/** Caches {@link ProjectControl} objects for the current user of the request. */
-@RequestScoped
-public class PerRequestProjectControlCache {
-  private final ProjectCache projectCache;
-  private final CurrentUser user;
-  private final Map<Project.NameKey, ProjectControl> controls;
-
-  @Inject
-  PerRequestProjectControlCache(ProjectCache projectCache, CurrentUser userProvider) {
-    this.projectCache = projectCache;
-    this.user = userProvider;
-    this.controls = new HashMap<>();
-  }
-
-  ProjectControl get(Project.NameKey nameKey) throws NoSuchProjectException {
-    ProjectControl ctl = controls.get(nameKey);
-    if (ctl == null) {
-      ProjectState p = projectCache.get(nameKey);
-      if (p == null) {
-        throw new NoSuchProjectException(nameKey);
-      }
-      ctl = p.controlFor(user);
-      controls.put(nameKey, ctl);
-    }
-    return ctl;
-  }
-
-  public void evict(Project project) {
-    projectCache.evict(project);
-    controls.remove(project.getNameKey());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/PermissionCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/PermissionCollection.java
deleted file mode 100644
index 9febb3f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/PermissionCollection.java
+++ /dev/null
@@ -1,236 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.server.project;
-
-import static com.google.common.base.MoreObjects.firstNonNull;
-import static com.google.gerrit.server.project.RefPattern.isRE;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.MultimapBuilder;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.data.AccessSection;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.common.data.PermissionRule;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.CurrentUser;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Effective permissions applied to a reference in a project.
- *
- * <p>A collection may be user specific if a matching {@link AccessSection} uses "${username}" in
- * its name. The permissions granted in that section may only be granted to the username that
- * appears in the reference name, and also only if the user is a member of the relevant group.
- */
-public class PermissionCollection {
-  @Singleton
-  public static class Factory {
-    private final SectionSortCache sorter;
-
-    @Inject
-    Factory(SectionSortCache sorter) {
-      this.sorter = sorter;
-    }
-
-    /**
-     * Get all permissions that apply to a reference.
-     *
-     * @param matcherList collection of sections that should be considered, in priority order
-     *     (project specific definitions must appear before inherited ones).
-     * @param ref reference being accessed.
-     * @param user if the reference is a per-user reference, e.g. access sections using the
-     *     parameter variable "${username}" will have each username inserted into them to see if
-     *     they apply to the reference named by {@code ref}.
-     * @return map of permissions that apply to this reference, keyed by permission name.
-     */
-    PermissionCollection filter(
-        Iterable<SectionMatcher> matcherList, String ref, CurrentUser user) {
-      if (isRE(ref)) {
-        ref = RefPattern.shortestExample(ref);
-      } else if (ref.endsWith("/*")) {
-        ref = ref.substring(0, ref.length() - 1);
-      }
-
-      boolean perUser = false;
-      Map<AccessSection, Project.NameKey> sectionToProject = new LinkedHashMap<>();
-      for (SectionMatcher sm : matcherList) {
-        // If the matcher has to expand parameters and its prefix matches the
-        // reference there is a very good chance the reference is actually user
-        // specific, even if the matcher does not match the reference. Since its
-        // difficult to prove this is true all of the time, use an approximation
-        // to prevent reuse of collections across users accessing the same
-        // reference at the same time.
-        //
-        // This check usually gets caching right, as most per-user references
-        // use a common prefix like "refs/sandbox/" or "refs/heads/users/"
-        // that will never be shared with non-user references, and the per-user
-        // references are usually less frequent than the non-user references.
-        //
-        if (sm.matcher instanceof RefPatternMatcher.ExpandParameters) {
-          if (!((RefPatternMatcher.ExpandParameters) sm.matcher).matchPrefix(ref)) {
-            continue;
-          }
-          perUser = true;
-          if (sm.match(ref, user)) {
-            sectionToProject.put(sm.section, sm.project);
-          }
-        } else if (sm.match(ref, null)) {
-          sectionToProject.put(sm.section, sm.project);
-        }
-      }
-      List<AccessSection> sections = Lists.newArrayList(sectionToProject.keySet());
-      sorter.sort(ref, sections);
-
-      Set<SeenRule> seen = new HashSet<>();
-      Set<String> exclusiveGroupPermissions = new HashSet<>();
-
-      HashMap<String, List<PermissionRule>> permissions = new HashMap<>();
-      HashMap<String, List<PermissionRule>> overridden = new HashMap<>();
-      Map<PermissionRule, ProjectRef> ruleProps = Maps.newIdentityHashMap();
-      ListMultimap<Project.NameKey, String> exclusivePermissionsByProject =
-          MultimapBuilder.hashKeys().arrayListValues().build();
-      for (AccessSection section : sections) {
-        Project.NameKey project = sectionToProject.get(section);
-        for (Permission permission : section.getPermissions()) {
-          boolean exclusivePermissionExists =
-              exclusiveGroupPermissions.contains(permission.getName());
-
-          for (PermissionRule rule : permission.getRules()) {
-            SeenRule s = SeenRule.create(section, permission, rule);
-            boolean addRule;
-            if (rule.isBlock()) {
-              addRule = !exclusivePermissionsByProject.containsEntry(project, permission.getName());
-            } else {
-              addRule = seen.add(s) && !rule.isDeny() && !exclusivePermissionExists;
-            }
-
-            HashMap<String, List<PermissionRule>> p = null;
-            if (addRule) {
-              p = permissions;
-            } else if (!rule.isDeny() && !exclusivePermissionExists) {
-              p = overridden;
-            }
-
-            if (p != null) {
-              List<PermissionRule> r = p.get(permission.getName());
-              if (r == null) {
-                r = new ArrayList<>(2);
-                p.put(permission.getName(), r);
-              }
-              r.add(rule);
-              ruleProps.put(rule, ProjectRef.create(project, section.getName()));
-            }
-          }
-
-          if (permission.getExclusiveGroup()) {
-            exclusivePermissionsByProject.put(project, permission.getName());
-            exclusiveGroupPermissions.add(permission.getName());
-          }
-        }
-      }
-
-      return new PermissionCollection(permissions, overridden, ruleProps, perUser);
-    }
-  }
-
-  private final Map<String, List<PermissionRule>> rules;
-  private final Map<String, List<PermissionRule>> overridden;
-  private final Map<PermissionRule, ProjectRef> ruleProps;
-  private final boolean perUser;
-
-  private PermissionCollection(
-      Map<String, List<PermissionRule>> rules,
-      Map<String, List<PermissionRule>> overridden,
-      Map<PermissionRule, ProjectRef> ruleProps,
-      boolean perUser) {
-    this.rules = rules;
-    this.overridden = overridden;
-    this.ruleProps = ruleProps;
-    this.perUser = perUser;
-  }
-
-  /**
-   * @return true if a "${username}" pattern might need to be expanded to build this collection,
-   *     making the results user specific.
-   */
-  public boolean isUserSpecific() {
-    return perUser;
-  }
-
-  /**
-   * Obtain all permission rules for a given type of permission.
-   *
-   * @param permissionName type of permission.
-   * @return all rules that apply to this reference, for any group. Never null; the empty list is
-   *     returned when there are no rules for the requested permission name.
-   */
-  public List<PermissionRule> getPermission(String permissionName) {
-    List<PermissionRule> r = rules.get(permissionName);
-    return r != null ? r : Collections.<PermissionRule>emptyList();
-  }
-
-  List<PermissionRule> getOverridden(String permissionName) {
-    return firstNonNull(overridden.get(permissionName), Collections.<PermissionRule>emptyList());
-  }
-
-  ProjectRef getRuleProps(PermissionRule rule) {
-    return ruleProps.get(rule);
-  }
-
-  /**
-   * Obtain all declared permission rules that match the reference.
-   *
-   * @return all rules. The collection will iterate a permission if it was declared in the project
-   *     configuration, either directly or inherited. If the project owner did not use a known
-   *     permission (for example {@link Permission#FORGE_SERVER}, then it will not be represented in
-   *     the result even if {@link #getPermission(String)} returns an empty list for the same
-   *     permission.
-   */
-  public Iterable<Map.Entry<String, List<PermissionRule>>> getDeclaredPermissions() {
-    return rules.entrySet();
-  }
-
-  /** Tracks whether or not a permission has been overridden. */
-  @AutoValue
-  abstract static class SeenRule {
-    public abstract String refPattern();
-
-    public abstract String permissionName();
-
-    @Nullable
-    public abstract AccountGroup.UUID group();
-
-    static SeenRule create(
-        AccessSection section, Permission permission, @Nullable PermissionRule rule) {
-      AccountGroup.UUID group =
-          rule != null && rule.getGroup() != null ? rule.getGroup().getUUID() : null;
-      return new AutoValue_PermissionCollection_SeenRule(
-          section.getName(), permission.getName(), group);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCache.java
deleted file mode 100644
index cb3223d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCache.java
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.server.project;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Project;
-import java.io.IOException;
-import java.util.Set;
-
-/** Cache of project information, including access rights. */
-public interface ProjectCache {
-  /** @return the parent state for all projects on this server. */
-  ProjectState getAllProjects();
-
-  /** @return the project state of the project storing meta data for all users. */
-  ProjectState getAllUsers();
-
-  /**
-   * Get the cached data for a project by its unique name.
-   *
-   * @param projectName name of the project.
-   * @return the cached data; null if no such project exists, projectName is null or an error
-   *     occurred.
-   * @see #checkedGet(com.google.gerrit.reviewdb.client.Project.NameKey)
-   */
-  ProjectState get(@Nullable Project.NameKey projectName);
-
-  /**
-   * Get the cached data for a project by its unique name.
-   *
-   * @param projectName name of the project.
-   * @throws IOException when there was an error.
-   * @return the cached data; null if no such project exists or projectName is null.
-   */
-  ProjectState checkedGet(@Nullable Project.NameKey projectName) throws IOException;
-
-  /**
-   * Get the cached data for a project by its unique name.
-   *
-   * @param projectName name of the project.
-   * @param strict true when any error generates an exception
-   * @throws Exception in case of any error (strict = true) or only for I/O or other internal
-   *     errors.
-   * @return the cached data or null when strict = false
-   */
-  public ProjectState checkedGet(Project.NameKey projectName, boolean strict) throws Exception;
-
-  /** Invalidate the cached information about the given project. */
-  void evict(Project p);
-
-  /** Invalidate the cached information about the given project. */
-  void evict(Project.NameKey p);
-
-  /**
-   * Remove information about the given project from the cache. It will no longer be returned from
-   * {@link #all()}.
-   */
-  void remove(Project p);
-
-  /**
-   * Remove information about the given project from the cache. It will no longer be returned from
-   * {@link #all()}.
-   */
-  void remove(Project.NameKey name);
-
-  /** @return sorted iteration of projects. */
-  Iterable<Project.NameKey> all();
-
-  /**
-   * @return estimated set of relevant groups extracted from hot project access rules. If the cache
-   *     is cold or too small for the entire project set of the server, this set may be incomplete.
-   */
-  Set<AccountGroup.UUID> guessRelevantGroupUUIDs();
-
-  /**
-   * Filter the set of registered project names by common prefix.
-   *
-   * @param prefix common prefix.
-   * @return sorted iteration of projects sharing the same prefix.
-   */
-  Iterable<Project.NameKey> byName(String prefix);
-
-  /** Notify the cache that a new project was constructed. */
-  void onCreateProject(Project.NameKey newProjectName);
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheClock.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheClock.java
deleted file mode 100644
index 6f7e414..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheClock.java
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.project;
-
-import com.google.common.util.concurrent.ThreadFactoryBuilder;
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.gerrit.server.config.ConfigUtil;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicLong;
-import org.eclipse.jgit.lib.Config;
-
-/** Ticks periodically to force refresh events for {@link ProjectCacheImpl}. */
-@Singleton
-public class ProjectCacheClock implements LifecycleListener {
-  private final Config serverConfig;
-
-  private final AtomicLong generation = new AtomicLong();
-
-  private ScheduledExecutorService executor;
-
-  @Inject
-  public ProjectCacheClock(@GerritServerConfig Config serverConfig) {
-    this.serverConfig = serverConfig;
-  }
-
-  @Override
-  public void start() {
-    long checkFrequencyMillis = checkFrequency(serverConfig);
-
-    if (checkFrequencyMillis == Long.MAX_VALUE) {
-      // Start with generation 1 (to avoid magic 0 below).
-      // Do not begin background thread, disabling the clock.
-      generation.set(1);
-    } else if (10 < checkFrequencyMillis) {
-      // Start with generation 1 (to avoid magic 0 below).
-      generation.set(1);
-      executor =
-          Executors.newScheduledThreadPool(
-              1,
-              new ThreadFactoryBuilder()
-                  .setNameFormat("ProjectCacheClock-%d")
-                  .setDaemon(true)
-                  .setPriority(Thread.MIN_PRIORITY)
-                  .build());
-      @SuppressWarnings("unused") // Runnable already handles errors
-      Future<?> possiblyIgnoredError =
-          executor.scheduleAtFixedRate(
-              () -> {
-                generation.incrementAndGet();
-              },
-              checkFrequencyMillis,
-              checkFrequencyMillis,
-              TimeUnit.MILLISECONDS);
-    } else {
-      // Magic generation 0 triggers ProjectState to always
-      // check on each needsRefresh() request we make to it.
-      generation.set(0);
-    }
-  }
-
-  @Override
-  public void stop() {
-    if (executor != null) {
-      executor.shutdown();
-    }
-  }
-
-  long read() {
-    return generation.get();
-  }
-
-  private static long checkFrequency(Config serverConfig) {
-    String freq = serverConfig.getString("cache", "projects", "checkFrequency");
-    if (freq != null && ("disabled".equalsIgnoreCase(freq) || "off".equalsIgnoreCase(freq))) {
-      return Long.MAX_VALUE;
-    }
-    return TimeUnit.MILLISECONDS.convert(
-        ConfigUtil.getTimeUnit(
-            serverConfig, "cache", "projects", "checkFrequency", 5, TimeUnit.MINUTES),
-        TimeUnit.MINUTES);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheImpl.java
deleted file mode 100644
index c8106d0..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheImpl.java
+++ /dev/null
@@ -1,350 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.server.project;
-
-import static java.util.stream.Collectors.toSet;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Throwables;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import com.google.common.collect.Sets;
-import com.google.gerrit.lifecycle.LifecycleModule;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.cache.CacheModule;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.inject.Inject;
-import com.google.inject.Module;
-import com.google.inject.Singleton;
-import com.google.inject.TypeLiteral;
-import com.google.inject.name.Named;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-import java.util.Objects;
-import java.util.Set;
-import java.util.SortedSet;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.Repository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Cache of project information, including access rights. */
-@Singleton
-public class ProjectCacheImpl implements ProjectCache {
-  private static final Logger log = LoggerFactory.getLogger(ProjectCacheImpl.class);
-
-  private static final String CACHE_NAME = "projects";
-  private static final String CACHE_LIST = "project_list";
-
-  public static Module module() {
-    return new CacheModule() {
-      @Override
-      protected void configure() {
-        cache(CACHE_NAME, String.class, ProjectState.class).loader(Loader.class);
-
-        cache(CACHE_LIST, ListKey.class, new TypeLiteral<SortedSet<Project.NameKey>>() {})
-            .maximumWeight(1)
-            .loader(Lister.class);
-
-        bind(ProjectCacheImpl.class);
-        bind(ProjectCache.class).to(ProjectCacheImpl.class);
-
-        install(
-            new LifecycleModule() {
-              @Override
-              protected void configure() {
-                listener().to(ProjectCacheWarmer.class);
-                listener().to(ProjectCacheClock.class);
-              }
-            });
-      }
-    };
-  }
-
-  private final AllProjectsName allProjectsName;
-  private final AllUsersName allUsersName;
-  private final LoadingCache<String, ProjectState> byName;
-  private final LoadingCache<ListKey, SortedSet<Project.NameKey>> list;
-  private final Lock listLock;
-  private final ProjectCacheClock clock;
-
-  @Inject
-  ProjectCacheImpl(
-      final AllProjectsName allProjectsName,
-      final AllUsersName allUsersName,
-      @Named(CACHE_NAME) LoadingCache<String, ProjectState> byName,
-      @Named(CACHE_LIST) LoadingCache<ListKey, SortedSet<Project.NameKey>> list,
-      ProjectCacheClock clock) {
-    this.allProjectsName = allProjectsName;
-    this.allUsersName = allUsersName;
-    this.byName = byName;
-    this.list = list;
-    this.listLock = new ReentrantLock(true /* fair */);
-    this.clock = clock;
-  }
-
-  @Override
-  public ProjectState getAllProjects() {
-    ProjectState state = get(allProjectsName);
-    if (state == null) {
-      // This should never occur, the server must have this
-      // project to process anything.
-      throw new IllegalStateException("Missing project " + allProjectsName);
-    }
-    return state;
-  }
-
-  @Override
-  public ProjectState getAllUsers() {
-    ProjectState state = get(allUsersName);
-    if (state == null) {
-      // This should never occur.
-      throw new IllegalStateException("Missing project " + allUsersName);
-    }
-    return state;
-  }
-
-  @Override
-  public ProjectState get(Project.NameKey projectName) {
-    try {
-      return checkedGet(projectName);
-    } catch (IOException e) {
-      return null;
-    }
-  }
-
-  @Override
-  public ProjectState checkedGet(Project.NameKey projectName) throws IOException {
-    if (projectName == null) {
-      return null;
-    }
-    try {
-      return strictCheckedGet(projectName);
-    } catch (Exception e) {
-      if (!(e.getCause() instanceof RepositoryNotFoundException)) {
-        log.warn("Cannot read project {}", projectName.get(), e);
-        Throwables.throwIfInstanceOf(e.getCause(), IOException.class);
-        throw new IOException(e);
-      }
-      log.debug("Cannot find project {}", projectName.get(), e);
-      return null;
-    }
-  }
-
-  @Override
-  public ProjectState checkedGet(Project.NameKey projectName, boolean strict) throws Exception {
-    return strict ? strictCheckedGet(projectName) : checkedGet(projectName);
-  }
-
-  private ProjectState strictCheckedGet(Project.NameKey projectName) throws Exception {
-    ProjectState state = byName.get(projectName.get());
-    if (state != null && state.needsRefresh(clock.read())) {
-      byName.invalidate(projectName.get());
-      state = byName.get(projectName.get());
-    }
-    return state;
-  }
-
-  @Override
-  public void evict(Project p) {
-    if (p != null) {
-      byName.invalidate(p.getNameKey().get());
-    }
-  }
-
-  /** Invalidate the cached information about the given project. */
-  @Override
-  public void evict(Project.NameKey p) {
-    if (p != null) {
-      byName.invalidate(p.get());
-    }
-  }
-
-  @Override
-  public void remove(Project p) {
-    remove(p.getNameKey());
-  }
-
-  @Override
-  public void remove(Project.NameKey name) {
-    listLock.lock();
-    try {
-      SortedSet<Project.NameKey> n = Sets.newTreeSet(list.get(ListKey.ALL));
-      n.remove(name);
-      list.put(ListKey.ALL, Collections.unmodifiableSortedSet(n));
-    } catch (ExecutionException e) {
-      log.warn("Cannot list available projects", e);
-    } finally {
-      listLock.unlock();
-    }
-    evict(name);
-  }
-
-  @Override
-  public void onCreateProject(Project.NameKey newProjectName) {
-    listLock.lock();
-    try {
-      SortedSet<Project.NameKey> n = Sets.newTreeSet(list.get(ListKey.ALL));
-      n.add(newProjectName);
-      list.put(ListKey.ALL, Collections.unmodifiableSortedSet(n));
-    } catch (ExecutionException e) {
-      log.warn("Cannot list available projects", e);
-    } finally {
-      listLock.unlock();
-    }
-  }
-
-  @Override
-  public SortedSet<Project.NameKey> all() {
-    try {
-      return list.get(ListKey.ALL);
-    } catch (ExecutionException e) {
-      log.warn("Cannot list available projects", e);
-      return Collections.emptySortedSet();
-    }
-  }
-
-  @Override
-  public Set<AccountGroup.UUID> guessRelevantGroupUUIDs() {
-    return all().stream()
-        .map(n -> byName.getIfPresent(n.get()))
-        .filter(Objects::nonNull)
-        .flatMap(p -> p.getConfig().getAllGroupUUIDs().stream())
-        // getAllGroupUUIDs shouldn't really return null UUIDs, but harden
-        // against them just in case there is a bug or corner case.
-        .filter(id -> id != null && id.get() != null)
-        .collect(toSet());
-  }
-
-  @Override
-  public Iterable<Project.NameKey> byName(String pfx) {
-    final Iterable<Project.NameKey> src;
-    try {
-      src = list.get(ListKey.ALL).tailSet(new Project.NameKey(pfx));
-    } catch (ExecutionException e) {
-      return Collections.emptyList();
-    }
-    return new Iterable<Project.NameKey>() {
-      @Override
-      public Iterator<Project.NameKey> iterator() {
-        return new Iterator<Project.NameKey>() {
-          private Iterator<Project.NameKey> itr = src.iterator();
-          private Project.NameKey next;
-
-          @Override
-          public boolean hasNext() {
-            if (next != null) {
-              return true;
-            }
-
-            if (!itr.hasNext()) {
-              return false;
-            }
-
-            Project.NameKey r = itr.next();
-            if (r.get().startsWith(pfx)) {
-              next = r;
-              return true;
-            }
-            itr = Collections.<Project.NameKey>emptyList().iterator();
-            return false;
-          }
-
-          @Override
-          public Project.NameKey next() {
-            if (!hasNext()) {
-              throw new NoSuchElementException();
-            }
-
-            Project.NameKey r = next;
-            next = null;
-            return r;
-          }
-
-          @Override
-          public void remove() {
-            throw new UnsupportedOperationException();
-          }
-        };
-      }
-    };
-  }
-
-  static class Loader extends CacheLoader<String, ProjectState> {
-    private final ProjectState.Factory projectStateFactory;
-    private final GitRepositoryManager mgr;
-    private final ProjectCacheClock clock;
-
-    @Inject
-    Loader(ProjectState.Factory psf, GitRepositoryManager g, ProjectCacheClock clock) {
-      projectStateFactory = psf;
-      mgr = g;
-      this.clock = clock;
-    }
-
-    @Override
-    public ProjectState load(String projectName) throws Exception {
-      long now = clock.read();
-      Project.NameKey key = new Project.NameKey(projectName);
-      try (Repository git = mgr.openRepository(key)) {
-        ProjectConfig cfg = new ProjectConfig(key);
-        cfg.load(git);
-
-        ProjectState state = projectStateFactory.create(cfg);
-        state.initLastCheck(now);
-        return state;
-      }
-    }
-  }
-
-  static class ListKey {
-    static final ListKey ALL = new ListKey();
-
-    private ListKey() {}
-  }
-
-  static class Lister extends CacheLoader<ListKey, SortedSet<Project.NameKey>> {
-    private final GitRepositoryManager mgr;
-
-    @Inject
-    Lister(GitRepositoryManager mgr) {
-      this.mgr = mgr;
-    }
-
-    @Override
-    public SortedSet<Project.NameKey> load(ListKey key) throws Exception {
-      return mgr.list();
-    }
-  }
-
-  @VisibleForTesting
-  public void evictAllByName() {
-    byName.invalidateAll();
-  }
-
-  @VisibleForTesting
-  public long sizeAllByName() {
-    return byName.size();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheWarmer.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheWarmer.java
deleted file mode 100644
index 66bbcca..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheWarmer.java
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.project;
-
-import com.google.common.util.concurrent.ThreadFactoryBuilder;
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledThreadPoolExecutor;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class ProjectCacheWarmer implements LifecycleListener {
-  private static final Logger log = LoggerFactory.getLogger(ProjectCacheWarmer.class);
-
-  private final Config config;
-  private final ProjectCache cache;
-
-  @Inject
-  ProjectCacheWarmer(@GerritServerConfig Config config, ProjectCache cache) {
-    this.config = config;
-    this.cache = cache;
-  }
-
-  @Override
-  public void start() {
-    int cpus = Runtime.getRuntime().availableProcessors();
-    if (config.getBoolean("cache", "projects", "loadOnStartup", false)) {
-      ThreadPoolExecutor pool =
-          new ScheduledThreadPoolExecutor(
-              config.getInt("cache", "projects", "loadThreads", cpus),
-              new ThreadFactoryBuilder().setNameFormat("ProjectCacheLoader-%d").build());
-      ExecutorService scheduler = Executors.newFixedThreadPool(1);
-
-      log.info("Loading project cache");
-      scheduler.execute(
-          () -> {
-            for (Project.NameKey name : cache.all()) {
-              pool.execute(
-                  () -> {
-                    cache.get(name);
-                  });
-            }
-            pool.shutdown();
-            try {
-              pool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
-              log.info("Finished loading project cache");
-            } catch (InterruptedException e) {
-              log.warn("Interrupted while waiting for project cache to load");
-            }
-          });
-    }
-  }
-
-  @Override
-  public void stop() {}
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java
deleted file mode 100644
index e97411e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java
+++ /dev/null
@@ -1,512 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.project;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.gerrit.reviewdb.client.RefNames.REFS_TAGS;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Maps;
-import com.google.gerrit.common.data.AccessSection;
-import com.google.gerrit.common.data.Capable;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.common.data.PermissionRule;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.metrics.Counter0;
-import com.google.gerrit.metrics.Description;
-import com.google.gerrit.metrics.MetricMaker;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.account.GroupMembership;
-import com.google.gerrit.server.config.GitReceivePackGroups;
-import com.google.gerrit.server.config.GitUploadPackGroups;
-import com.google.gerrit.server.group.SystemGroupBackend;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.permissions.FailedPermissionBackend;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackend.ForChange;
-import com.google.gerrit.server.permissions.PermissionBackend.ForProject;
-import com.google.gerrit.server.permissions.PermissionBackend.ForRef;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.ProjectPermission;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.RefDatabase;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Access control management for a user accessing a project's data. */
-public class ProjectControl {
-  private static final Logger log = LoggerFactory.getLogger(ProjectControl.class);
-
-  public static class GenericFactory {
-    private final ProjectCache projectCache;
-
-    @Inject
-    GenericFactory(ProjectCache pc) {
-      projectCache = pc;
-    }
-
-    public ProjectControl controlFor(Project.NameKey nameKey, CurrentUser user)
-        throws NoSuchProjectException, IOException {
-      final ProjectState p = projectCache.checkedGet(nameKey);
-      if (p == null) {
-        throw new NoSuchProjectException(nameKey);
-      }
-      return p.controlFor(user);
-    }
-  }
-
-  public static class Factory {
-    private final Provider<PerRequestProjectControlCache> userCache;
-
-    @Inject
-    Factory(Provider<PerRequestProjectControlCache> uc) {
-      userCache = uc;
-    }
-
-    public ProjectControl controlFor(Project.NameKey nameKey) throws NoSuchProjectException {
-      return userCache.get().get(nameKey);
-    }
-  }
-
-  public interface AssistedFactory {
-    ProjectControl create(CurrentUser who, ProjectState ps);
-  }
-
-  @Singleton
-  protected static class Metrics {
-    final Counter0 claCheckCount;
-
-    @Inject
-    Metrics(MetricMaker metricMaker) {
-      claCheckCount =
-          metricMaker.newCounter(
-              "license/cla_check_count",
-              new Description("Total number of CLA check requests").setRate().setUnit("requests"));
-    }
-  }
-
-  private final Set<AccountGroup.UUID> uploadGroups;
-  private final Set<AccountGroup.UUID> receiveGroups;
-  private final PermissionBackend.WithUser perm;
-  private final CurrentUser user;
-  private final ProjectState state;
-  private final CommitsCollection commits;
-  private final ChangeControl.Factory changeControlFactory;
-  private final PermissionCollection.Factory permissionFilter;
-
-  private List<SectionMatcher> allSections;
-  private Map<String, RefControl> refControls;
-  private Boolean declaredOwner;
-
-  @Inject
-  ProjectControl(
-      @GitUploadPackGroups Set<AccountGroup.UUID> uploadGroups,
-      @GitReceivePackGroups Set<AccountGroup.UUID> receiveGroups,
-      PermissionCollection.Factory permissionFilter,
-      CommitsCollection commits,
-      ChangeControl.Factory changeControlFactory,
-      PermissionBackend permissionBackend,
-      @Assisted CurrentUser who,
-      @Assisted ProjectState ps) {
-    this.changeControlFactory = changeControlFactory;
-    this.uploadGroups = uploadGroups;
-    this.receiveGroups = receiveGroups;
-    this.permissionFilter = permissionFilter;
-    this.commits = commits;
-    this.perm = permissionBackend.user(who);
-    user = who;
-    state = ps;
-  }
-
-  public ProjectControl forUser(CurrentUser who) {
-    ProjectControl r = state.controlFor(who);
-    // Not per-user, and reusing saves lookup time.
-    r.allSections = allSections;
-    return r;
-  }
-
-  public ChangeControl controlFor(ReviewDb db, Change change) throws OrmException {
-    return changeControlFactory.create(
-        controlForRef(change.getDest()), db, change.getProject(), change.getId());
-  }
-
-  public ChangeControl controlFor(ChangeNotes notes) {
-    return changeControlFactory.create(controlForRef(notes.getChange().getDest()), notes);
-  }
-
-  public RefControl controlForRef(Branch.NameKey ref) {
-    return controlForRef(ref.get());
-  }
-
-  public RefControl controlForRef(String refName) {
-    if (refControls == null) {
-      refControls = new HashMap<>();
-    }
-    RefControl ctl = refControls.get(refName);
-    if (ctl == null) {
-      PermissionCollection relevant = permissionFilter.filter(access(), refName, user);
-      ctl = new RefControl(this, refName, relevant);
-      refControls.put(refName, ctl);
-    }
-    return ctl;
-  }
-
-  public CurrentUser getUser() {
-    return user;
-  }
-
-  public ProjectState getProjectState() {
-    return state;
-  }
-
-  public Project getProject() {
-    return state.getProject();
-  }
-
-  /** Is this user a project owner? */
-  public boolean isOwner() {
-    return (isDeclaredOwner() && !controlForRef("refs/*").isBlocked(Permission.OWNER)) || isAdmin();
-  }
-
-  /**
-   * @return {@code Capable.OK} if the user can upload to at least one reference. Does not check
-   *     Contributor Agreements.
-   */
-  public Capable canPushToAtLeastOneRef() {
-    if (!canPerformOnAnyRef(Permission.PUSH)
-        && !canPerformOnAnyRef(Permission.CREATE_TAG)
-        && !isOwner()) {
-      return new Capable("Upload denied for project '" + state.getName() + "'");
-    }
-    return Capable.OK;
-  }
-
-  /** Can the user run upload pack? */
-  private boolean canRunUploadPack() {
-    for (AccountGroup.UUID group : uploadGroups) {
-      if (match(group)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /** Can the user run receive pack? */
-  private boolean canRunReceivePack() {
-    for (AccountGroup.UUID group : receiveGroups) {
-      if (match(group)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  private boolean allRefsAreVisible(Set<String> ignore) {
-    return user.isInternalUser() || canPerformOnAllRefs(Permission.READ, ignore);
-  }
-
-  /** Returns whether the project is hidden. */
-  private boolean isHidden() {
-    return getProject().getState().equals(com.google.gerrit.extensions.client.ProjectState.HIDDEN);
-  }
-
-  private boolean canAddRefs() {
-    return (canPerformOnAnyRef(Permission.CREATE) || isAdmin());
-  }
-
-  private boolean canAddTagRefs() {
-    return (canPerformOnTagRef(Permission.CREATE) || isAdmin());
-  }
-
-  private boolean canCreateChanges() {
-    for (SectionMatcher matcher : access()) {
-      AccessSection section = matcher.section;
-      if (section.getName().startsWith("refs/for/")) {
-        Permission permission = section.getPermission(Permission.PUSH);
-        if (permission != null && controlForRef(section.getName()).canPerform(Permission.PUSH)) {
-          return true;
-        }
-      }
-    }
-    return false;
-  }
-
-  boolean isAdmin() {
-    try {
-      perm.check(GlobalPermission.ADMINISTRATE_SERVER);
-      return true;
-    } catch (AuthException | PermissionBackendException e) {
-      return false;
-    }
-  }
-
-  private boolean isDeclaredOwner() {
-    if (declaredOwner == null) {
-      GroupMembership effectiveGroups = user.getEffectiveGroups();
-      declaredOwner = effectiveGroups.containsAnyOf(state.getAllOwners());
-    }
-    return declaredOwner;
-  }
-
-  private boolean canPerformOnTagRef(String permissionName) {
-    for (SectionMatcher matcher : access()) {
-      AccessSection section = matcher.section;
-
-      if (section.getName().startsWith(REFS_TAGS)) {
-        Permission permission = section.getPermission(permissionName);
-        if (permission == null) {
-          continue;
-        }
-
-        Boolean can = canPerform(permissionName, section, permission);
-        if (can != null) {
-          return can;
-        }
-      }
-    }
-
-    return false;
-  }
-
-  private boolean canPerformOnAnyRef(String permissionName) {
-    for (SectionMatcher matcher : access()) {
-      AccessSection section = matcher.section;
-      Permission permission = section.getPermission(permissionName);
-      if (permission == null) {
-        continue;
-      }
-
-      Boolean can = canPerform(permissionName, section, permission);
-      if (can != null) {
-        return can;
-      }
-    }
-
-    return false;
-  }
-
-  private Boolean canPerform(String permissionName, AccessSection section, Permission permission) {
-    for (PermissionRule rule : permission.getRules()) {
-      if (rule.isBlock() || rule.isDeny() || !match(rule)) {
-        continue;
-      }
-
-      // Being in a group that was granted this permission is only an
-      // approximation.  There might be overrides and doNotInherit
-      // that would render this to be false.
-      //
-      if (controlForRef(section.getName()).canPerform(permissionName)) {
-        return true;
-      }
-      break;
-    }
-    return null;
-  }
-
-  private boolean canPerformOnAllRefs(String permission, Set<String> ignore) {
-    boolean canPerform = false;
-    Set<String> patterns = allRefPatterns(permission);
-    if (patterns.contains(AccessSection.ALL)) {
-      // Only possible if granted on the pattern that
-      // matches every possible reference.  Check all
-      // patterns also have the permission.
-      //
-      for (String pattern : patterns) {
-        if (controlForRef(pattern).canPerform(permission)) {
-          canPerform = true;
-        } else if (ignore.contains(pattern)) {
-          continue;
-        } else {
-          return false;
-        }
-      }
-    }
-    return canPerform;
-  }
-
-  private Set<String> allRefPatterns(String permissionName) {
-    Set<String> all = new HashSet<>();
-    for (SectionMatcher matcher : access()) {
-      AccessSection section = matcher.section;
-      Permission permission = section.getPermission(permissionName);
-      if (permission != null) {
-        all.add(section.getName());
-      }
-    }
-    return all;
-  }
-
-  private List<SectionMatcher> access() {
-    if (allSections == null) {
-      allSections = state.getAllSections();
-    }
-    return allSections;
-  }
-
-  boolean match(PermissionRule rule) {
-    return match(rule.getGroup().getUUID());
-  }
-
-  boolean match(PermissionRule rule, boolean isChangeOwner) {
-    return match(rule.getGroup().getUUID(), isChangeOwner);
-  }
-
-  boolean match(AccountGroup.UUID uuid) {
-    return match(uuid, false);
-  }
-
-  boolean match(AccountGroup.UUID uuid, boolean isChangeOwner) {
-    if (SystemGroupBackend.PROJECT_OWNERS.equals(uuid)) {
-      return isDeclaredOwner();
-    } else if (SystemGroupBackend.CHANGE_OWNER.equals(uuid)) {
-      return isChangeOwner;
-    } else {
-      return user.getEffectiveGroups().contains(uuid);
-    }
-  }
-
-  boolean isReachableFromHeadsOrTags(Repository repo, RevCommit commit) {
-    try {
-      RefDatabase refdb = repo.getRefDatabase();
-      Collection<Ref> heads = refdb.getRefs(Constants.R_HEADS).values();
-      Collection<Ref> tags = refdb.getRefs(Constants.R_TAGS).values();
-      Map<String, Ref> refs = Maps.newHashMapWithExpectedSize(heads.size() + tags.size());
-      for (Ref r : Iterables.concat(heads, tags)) {
-        refs.put(r.getName(), r);
-      }
-      return commits.isReachableFrom(state, repo, commit, refs);
-    } catch (IOException e) {
-      log.error(
-          "Cannot verify permissions to commit object {} in repository {}",
-          commit.name(),
-          getProject().getNameKey(),
-          e);
-      return false;
-    }
-  }
-
-  ForProject asForProject() {
-    return new ForProjectImpl();
-  }
-
-  private class ForProjectImpl extends ForProject {
-    @Override
-    public ForProject user(CurrentUser user) {
-      return forUser(user).asForProject().database(db);
-    }
-
-    @Override
-    public ForRef ref(String ref) {
-      return controlForRef(ref).asForRef().database(db);
-    }
-
-    @Override
-    public ForChange change(ChangeData cd) {
-      try {
-        checkProject(cd.change());
-        return super.change(cd);
-      } catch (OrmException e) {
-        return FailedPermissionBackend.change("unavailable", e);
-      }
-    }
-
-    @Override
-    public ForChange change(ChangeNotes notes) {
-      checkProject(notes.getChange());
-      return super.change(notes);
-    }
-
-    private void checkProject(Change change) {
-      Project.NameKey project = getProject().getNameKey();
-      checkArgument(
-          project.equals(change.getProject()),
-          "expected change in project %s, not %s",
-          project,
-          change.getProject());
-    }
-
-    @Override
-    public void check(ProjectPermission perm) throws AuthException, PermissionBackendException {
-      if (!can(perm)) {
-        throw new AuthException(perm.describeForException() + " not permitted");
-      }
-    }
-
-    @Override
-    public Set<ProjectPermission> test(Collection<ProjectPermission> permSet)
-        throws PermissionBackendException {
-      EnumSet<ProjectPermission> ok = EnumSet.noneOf(ProjectPermission.class);
-      for (ProjectPermission perm : permSet) {
-        if (can(perm)) {
-          ok.add(perm);
-        }
-      }
-      return ok;
-    }
-
-    private boolean can(ProjectPermission perm) throws PermissionBackendException {
-      switch (perm) {
-        case ACCESS:
-          return (!isHidden() && (user.isInternalUser() || canPerformOnAnyRef(Permission.READ)))
-              || isOwner();
-
-        case READ:
-          return !isHidden() && allRefsAreVisible(Collections.emptySet());
-
-        case READ_NO_CONFIG:
-          return !isHidden() && allRefsAreVisible(ImmutableSet.of(RefNames.REFS_CONFIG));
-
-        case CREATE_REF:
-          return canAddRefs();
-        case CREATE_TAG_REF:
-          return canAddTagRefs();
-        case CREATE_CHANGE:
-          return canCreateChanges();
-
-        case RUN_RECEIVE_PACK:
-          return canRunReceivePack();
-        case RUN_UPLOAD_PACK:
-          return canRunUploadPack();
-      }
-      throw new PermissionBackendException(perm + " unsupported");
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectHierarchyIterator.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectHierarchyIterator.java
deleted file mode 100644
index ac8d536..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectHierarchyIterator.java
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.project;
-
-import com.google.common.base.Joiner;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.config.AllProjectsName;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.Set;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Iterates from a project up through its parents to All-Projects.
- *
- * <p>If a cycle is detected the cycle is broken and All-Projects is visited.
- */
-class ProjectHierarchyIterator implements Iterator<ProjectState> {
-  private static final Logger log = LoggerFactory.getLogger(ProjectHierarchyIterator.class);
-
-  private final ProjectCache cache;
-  private final AllProjectsName allProjectsName;
-  private final Set<Project.NameKey> seen;
-  private ProjectState next;
-
-  ProjectHierarchyIterator(ProjectCache c, AllProjectsName all, ProjectState firstResult) {
-    cache = c;
-    allProjectsName = all;
-
-    seen = Sets.newLinkedHashSet();
-    seen.add(firstResult.getNameKey());
-    next = firstResult;
-  }
-
-  @Override
-  public boolean hasNext() {
-    return next != null;
-  }
-
-  @Override
-  public ProjectState next() {
-    ProjectState n = next;
-    if (n == null) {
-      throw new NoSuchElementException();
-    }
-    next = computeNext(n);
-    return n;
-  }
-
-  private ProjectState computeNext(ProjectState n) {
-    Project.NameKey parentName = n.getProject().getParent();
-    if (parentName != null && visit(parentName)) {
-      ProjectState p = cache.get(parentName);
-      if (p != null) {
-        return p;
-      }
-    }
-
-    // Parent does not exist or was already visited.
-    // Fall back to visit All-Projects exactly once.
-    if (seen.add(allProjectsName)) {
-      return cache.get(allProjectsName);
-    }
-    return null;
-  }
-
-  private boolean visit(Project.NameKey parentName) {
-    if (seen.add(parentName)) {
-      return true;
-    }
-
-    List<String> order = Lists.newArrayListWithCapacity(seen.size() + 1);
-    for (Project.NameKey p : seen) {
-      order.add(p.get());
-    }
-    int idx = order.lastIndexOf(parentName.get());
-    order.add(parentName.get());
-    log.warn(
-        "Cycle detected in projects: " + Joiner.on(" -> ").join(order.subList(idx, order.size())));
-    return false;
-  }
-
-  @Override
-  public void remove() {
-    throw new UnsupportedOperationException();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectNode.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectNode.java
deleted file mode 100644
index e1ba692..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectNode.java
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.server.project;
-
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.util.TreeFormatter.TreeNode;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.util.SortedSet;
-import java.util.TreeSet;
-
-/** Node of a Project in a tree formatted by {@link ListProjects}. */
-public class ProjectNode implements TreeNode, Comparable<ProjectNode> {
-  public interface Factory {
-    ProjectNode create(Project project, boolean isVisible);
-  }
-
-  private final AllProjectsName allProjectsName;
-  private final Project project;
-  private final boolean isVisible;
-
-  private final SortedSet<ProjectNode> children = new TreeSet<>();
-
-  @Inject
-  protected ProjectNode(
-      final AllProjectsName allProjectsName,
-      @Assisted final Project project,
-      @Assisted final boolean isVisible) {
-    this.allProjectsName = allProjectsName;
-    this.project = project;
-    this.isVisible = isVisible;
-  }
-
-  /**
-   * Returns the project parent name.
-   *
-   * @return Project parent name, {@code null} for the 'All-Projects' root project
-   */
-  public Project.NameKey getParentName() {
-    return project.getParent(allProjectsName);
-  }
-
-  public boolean isAllProjects() {
-    return allProjectsName.equals(project.getNameKey());
-  }
-
-  public Project getProject() {
-    return project;
-  }
-
-  @Override
-  public String getDisplayName() {
-    return project.getName();
-  }
-
-  @Override
-  public boolean isVisible() {
-    return isVisible;
-  }
-
-  @Override
-  public SortedSet<? extends ProjectNode> getChildren() {
-    return children;
-  }
-
-  public void addChild(ProjectNode child) {
-    children.add(child);
-  }
-
-  @Override
-  public int compareTo(ProjectNode o) {
-    return project.getNameKey().compareTo(o.project.getNameKey());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectRef.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectRef.java
deleted file mode 100644
index be5fda0..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectRef.java
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.project;
-
-import com.google.auto.value.AutoValue;
-import com.google.gerrit.reviewdb.client.Project;
-
-@AutoValue
-abstract class ProjectRef {
-  public abstract Project.NameKey project();
-
-  public abstract String ref();
-
-  static ProjectRef create(Project.NameKey project, String ref) {
-    return new AutoValue_ProjectRef(project, ref);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectResource.java
deleted file mode 100644
index a91ba62..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectResource.java
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.restapi.RestResource;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.CurrentUser;
-import com.google.inject.TypeLiteral;
-
-public class ProjectResource implements RestResource {
-  public static final TypeLiteral<RestView<ProjectResource>> PROJECT_KIND =
-      new TypeLiteral<RestView<ProjectResource>>() {};
-
-  private final ProjectControl control;
-
-  public ProjectResource(ProjectControl control) {
-    this.control = control;
-  }
-
-  ProjectResource(ProjectResource rsrc) {
-    this.control = rsrc.getControl();
-  }
-
-  public String getName() {
-    return control.getProject().getName();
-  }
-
-  public Project.NameKey getNameKey() {
-    return control.getProject().getNameKey();
-  }
-
-  public ProjectState getProjectState() {
-    return control.getProjectState();
-  }
-
-  public CurrentUser getUser() {
-    return getControl().getUser();
-  }
-
-  public ProjectControl getControl() {
-    return control;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectState.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectState.java
deleted file mode 100644
index 08c3d9f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectState.java
+++ /dev/null
@@ -1,659 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.server.project;
-
-import static com.google.gerrit.common.data.PermissionRule.Action.ALLOW;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.gerrit.common.data.AccessSection;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.LabelTypes;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.common.data.PermissionRule;
-import com.google.gerrit.common.data.RefConfigSection;
-import com.google.gerrit.common.data.SubscribeSection;
-import com.google.gerrit.extensions.api.projects.CommentLinkInfo;
-import com.google.gerrit.extensions.api.projects.ThemeInfo;
-import com.google.gerrit.extensions.client.InheritableBoolean;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.rules.PrologEnvironment;
-import com.google.gerrit.rules.RulesCache;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.account.CapabilityCollection;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.git.BranchOrderSection;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.git.ProjectLevelConfig;
-import com.google.gerrit.server.git.TransferConfig;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import com.googlecode.prolog_cafe.exceptions.CompileException;
-import com.googlecode.prolog_cafe.lang.PrologMachineCopy;
-import java.io.IOException;
-import java.io.Reader;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.function.Function;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Cached information on a project. */
-public class ProjectState {
-  private static final Logger log = LoggerFactory.getLogger(ProjectState.class);
-
-  public interface Factory {
-    ProjectState create(ProjectConfig config);
-  }
-
-  private final boolean isAllProjects;
-  private final boolean isAllUsers;
-  private final SitePaths sitePaths;
-  private final AllProjectsName allProjectsName;
-  private final ProjectCache projectCache;
-  private final ProjectControl.AssistedFactory projectControlFactory;
-  private final PrologEnvironment.Factory envFactory;
-  private final GitRepositoryManager gitMgr;
-  private final RulesCache rulesCache;
-  private final List<CommentLinkInfo> commentLinks;
-
-  private final ProjectConfig config;
-  private final Map<String, ProjectLevelConfig> configs;
-  private final Set<AccountGroup.UUID> localOwners;
-  private final long globalMaxObjectSizeLimit;
-  private final boolean inheritProjectMaxObjectSizeLimit;
-
-  /** Prolog rule state. */
-  private volatile PrologMachineCopy rulesMachine;
-
-  /** Last system time the configuration's revision was examined. */
-  private volatile long lastCheckGeneration;
-
-  /** Local access sections, wrapped in SectionMatchers for faster evaluation. */
-  private volatile List<SectionMatcher> localAccessSections;
-
-  /** Theme information loaded from site_path/themes. */
-  private volatile ThemeInfo theme;
-
-  /** If this is all projects, the capabilities used by the server. */
-  private final CapabilityCollection capabilities;
-
-  /** All label types applicable to changes in this project. */
-  private LabelTypes labelTypes;
-
-  @Inject
-  public ProjectState(
-      SitePaths sitePaths,
-      ProjectCache projectCache,
-      AllProjectsName allProjectsName,
-      AllUsersName allUsersName,
-      ProjectControl.AssistedFactory projectControlFactory,
-      PrologEnvironment.Factory envFactory,
-      GitRepositoryManager gitMgr,
-      RulesCache rulesCache,
-      List<CommentLinkInfo> commentLinks,
-      CapabilityCollection.Factory limitsFactory,
-      TransferConfig transferConfig,
-      @Assisted ProjectConfig config) {
-    this.sitePaths = sitePaths;
-    this.projectCache = projectCache;
-    this.isAllProjects = config.getProject().getNameKey().equals(allProjectsName);
-    this.isAllUsers = config.getProject().getNameKey().equals(allUsersName);
-    this.allProjectsName = allProjectsName;
-    this.projectControlFactory = projectControlFactory;
-    this.envFactory = envFactory;
-    this.gitMgr = gitMgr;
-    this.rulesCache = rulesCache;
-    this.commentLinks = commentLinks;
-    this.config = config;
-    this.configs = new HashMap<>();
-    this.capabilities =
-        isAllProjects
-            ? limitsFactory.create(config.getAccessSection(AccessSection.GLOBAL_CAPABILITIES))
-            : null;
-    this.globalMaxObjectSizeLimit = transferConfig.getMaxObjectSizeLimit();
-    this.inheritProjectMaxObjectSizeLimit = transferConfig.getInheritProjectMaxObjectSizeLimit();
-
-    if (isAllProjects && !Permission.canBeOnAllProjects(AccessSection.ALL, Permission.OWNER)) {
-      localOwners = Collections.emptySet();
-    } else {
-      HashSet<AccountGroup.UUID> groups = new HashSet<>();
-      AccessSection all = config.getAccessSection(AccessSection.ALL);
-      if (all != null) {
-        Permission owner = all.getPermission(Permission.OWNER);
-        if (owner != null) {
-          for (PermissionRule rule : owner.getRules()) {
-            GroupReference ref = rule.getGroup();
-            if (rule.getAction() == ALLOW && ref.getUUID() != null) {
-              groups.add(ref.getUUID());
-            }
-          }
-        }
-      }
-      localOwners = Collections.unmodifiableSet(groups);
-    }
-  }
-
-  void initLastCheck(long generation) {
-    lastCheckGeneration = generation;
-  }
-
-  boolean needsRefresh(long generation) {
-    if (generation <= 0) {
-      return isRevisionOutOfDate();
-    }
-    if (lastCheckGeneration != generation) {
-      lastCheckGeneration = generation;
-      return isRevisionOutOfDate();
-    }
-    return false;
-  }
-
-  private boolean isRevisionOutOfDate() {
-    try (Repository git = gitMgr.openRepository(getNameKey())) {
-      Ref ref = git.getRefDatabase().exactRef(RefNames.REFS_CONFIG);
-      if (ref == null || ref.getObjectId() == null) {
-        return true;
-      }
-      return !ref.getObjectId().equals(config.getRevision());
-    } catch (IOException gone) {
-      return true;
-    }
-  }
-
-  /**
-   * @return cached computation of all global capabilities. This should only be invoked on the state
-   *     from {@link ProjectCache#getAllProjects()}. Null on any other project.
-   */
-  public CapabilityCollection getCapabilityCollection() {
-    return capabilities;
-  }
-
-  /** @return Construct a new PrologEnvironment for the calling thread. */
-  public PrologEnvironment newPrologEnvironment() throws CompileException {
-    PrologMachineCopy pmc = rulesMachine;
-    if (pmc == null) {
-      pmc = rulesCache.loadMachine(getNameKey(), config.getRulesId());
-      rulesMachine = pmc;
-    }
-    return envFactory.create(pmc);
-  }
-
-  /**
-   * Like {@link #newPrologEnvironment()} but instead of reading the rules.pl read the provided
-   * input stream.
-   *
-   * @param name a name of the input stream. Could be any name.
-   * @param in stream to read prolog rules from
-   * @throws CompileException
-   */
-  public PrologEnvironment newPrologEnvironment(String name, Reader in) throws CompileException {
-    PrologMachineCopy pmc = rulesCache.loadMachine(name, in);
-    return envFactory.create(pmc);
-  }
-
-  public Project getProject() {
-    return config.getProject();
-  }
-
-  public Project.NameKey getNameKey() {
-    return getProject().getNameKey();
-  }
-
-  public String getName() {
-    return getNameKey().get();
-  }
-
-  public ProjectConfig getConfig() {
-    return config;
-  }
-
-  public ProjectLevelConfig getConfig(String fileName) {
-    if (configs.containsKey(fileName)) {
-      return configs.get(fileName);
-    }
-
-    ProjectLevelConfig cfg = new ProjectLevelConfig(fileName, this);
-    try (Repository git = gitMgr.openRepository(getNameKey())) {
-      cfg.load(git);
-    } catch (IOException | ConfigInvalidException e) {
-      log.warn("Failed to load " + fileName + " for " + getName(), e);
-    }
-
-    configs.put(fileName, cfg);
-    return cfg;
-  }
-
-  public static class EffectiveMaxObjectSizeLimit {
-    public long value;
-    public String summary;
-  }
-
-  private static final String MAY_NOT_SET = "This project may not set a higher limit.";
-
-  @VisibleForTesting
-  public static final String INHERITED_FROM_PARENT = "Inherited from parent project '%s'.";
-
-  @VisibleForTesting
-  public static final String OVERRIDDEN_BY_PARENT =
-      "Overridden by parent project '%s'. " + MAY_NOT_SET;
-
-  @VisibleForTesting
-  public static final String INHERITED_FROM_GLOBAL = "Inherited from the global config.";
-
-  @VisibleForTesting
-  public static final String OVERRIDDEN_BY_GLOBAL =
-      "Overridden by the global config. " + MAY_NOT_SET;
-
-  public EffectiveMaxObjectSizeLimit getEffectiveMaxObjectSizeLimit() {
-    EffectiveMaxObjectSizeLimit result = new EffectiveMaxObjectSizeLimit();
-
-    result.value = config.getMaxObjectSizeLimit();
-
-    if (inheritProjectMaxObjectSizeLimit) {
-      for (ProjectState parent : parents()) {
-        long parentValue = parent.config.getMaxObjectSizeLimit();
-        if (parentValue > 0 && result.value > 0) {
-          if (parentValue < result.value) {
-            result.value = parentValue;
-            result.summary = String.format(OVERRIDDEN_BY_PARENT, parent.config.getName());
-          }
-        } else if (parentValue > 0) {
-          result.value = parentValue;
-          result.summary = String.format(INHERITED_FROM_PARENT, parent.config.getName());
-        }
-      }
-    }
-
-    if (globalMaxObjectSizeLimit > 0 && result.value > 0) {
-      if (globalMaxObjectSizeLimit < result.value) {
-        result.value = globalMaxObjectSizeLimit;
-        result.summary = OVERRIDDEN_BY_GLOBAL;
-      }
-    } else if (globalMaxObjectSizeLimit > result.value) {
-      // zero means "no limit", in this case the max is more limiting
-      result.value = globalMaxObjectSizeLimit;
-      result.summary = INHERITED_FROM_GLOBAL;
-    }
-    return result;
-  }
-
-  /** Get the sections that pertain only to this project. */
-  List<SectionMatcher> getLocalAccessSections() {
-    List<SectionMatcher> sm = localAccessSections;
-    if (sm == null) {
-      Collection<AccessSection> fromConfig = config.getAccessSections();
-      sm = new ArrayList<>(fromConfig.size());
-      for (AccessSection section : fromConfig) {
-        if (isAllProjects) {
-          List<Permission> copy = Lists.newArrayListWithCapacity(section.getPermissions().size());
-          for (Permission p : section.getPermissions()) {
-            if (Permission.canBeOnAllProjects(section.getName(), p.getName())) {
-              copy.add(p);
-            }
-          }
-          section = new AccessSection(section.getName());
-          section.setPermissions(copy);
-        }
-
-        SectionMatcher matcher = SectionMatcher.wrap(getNameKey(), section);
-        if (matcher != null) {
-          sm.add(matcher);
-        }
-      }
-      localAccessSections = sm;
-    }
-    return sm;
-  }
-
-  /**
-   * Obtain all local and inherited sections. This collection is looked up dynamically and is not
-   * cached. Callers should try to cache this result per-request as much as possible.
-   */
-  List<SectionMatcher> getAllSections() {
-    if (isAllProjects) {
-      return getLocalAccessSections();
-    }
-
-    List<SectionMatcher> all = new ArrayList<>();
-    for (ProjectState s : tree()) {
-      all.addAll(s.getLocalAccessSections());
-    }
-    return all;
-  }
-
-  /**
-   * @return all {@link AccountGroup}'s to which the owner privilege for 'refs/*' is assigned for
-   *     this project (the local owners), if there are no local owners the local owners of the
-   *     nearest parent project that has local owners are returned
-   */
-  public Set<AccountGroup.UUID> getOwners() {
-    for (ProjectState p : tree()) {
-      if (!p.localOwners.isEmpty()) {
-        return p.localOwners;
-      }
-    }
-    return Collections.emptySet();
-  }
-
-  /**
-   * @return all {@link AccountGroup}'s that are allowed to administrate the complete project. This
-   *     includes all groups to which the owner privilege for 'refs/*' is assigned for this project
-   *     (the local owners) and all groups to which the owner privilege for 'refs/*' is assigned for
-   *     one of the parent projects (the inherited owners).
-   */
-  public Set<AccountGroup.UUID> getAllOwners() {
-    Set<AccountGroup.UUID> result = new HashSet<>();
-
-    for (ProjectState p : tree()) {
-      result.addAll(p.localOwners);
-    }
-
-    return result;
-  }
-
-  public ProjectControl controlFor(CurrentUser user) {
-    return projectControlFactory.create(user, this);
-  }
-
-  /**
-   * @return an iterable that walks through this project and then the parents of this project.
-   *     Starts from this project and progresses up the hierarchy to All-Projects.
-   */
-  public Iterable<ProjectState> tree() {
-    return new Iterable<ProjectState>() {
-      @Override
-      public Iterator<ProjectState> iterator() {
-        return new ProjectHierarchyIterator(projectCache, allProjectsName, ProjectState.this);
-      }
-    };
-  }
-
-  /**
-   * @return an iterable that walks in-order from All-Projects through the project hierarchy to this
-   *     project.
-   */
-  public Iterable<ProjectState> treeInOrder() {
-    List<ProjectState> projects = Lists.newArrayList(tree());
-    Collections.reverse(projects);
-    return projects;
-  }
-
-  /**
-   * @return an iterable that walks through the parents of this project. Starts from the immediate
-   *     parent of this project and progresses up the hierarchy to All-Projects.
-   */
-  public FluentIterable<ProjectState> parents() {
-    return FluentIterable.from(tree()).skip(1);
-  }
-
-  public boolean isAllProjects() {
-    return isAllProjects;
-  }
-
-  public boolean isAllUsers() {
-    return isAllUsers;
-  }
-
-  public boolean isUseContributorAgreements() {
-    return getInheritableBoolean(Project::getUseContributorAgreements);
-  }
-
-  public boolean isUseContentMerge() {
-    return getInheritableBoolean(Project::getUseContentMerge);
-  }
-
-  public boolean isUseSignedOffBy() {
-    return getInheritableBoolean(Project::getUseSignedOffBy);
-  }
-
-  public boolean isRequireChangeID() {
-    return getInheritableBoolean(Project::getRequireChangeID);
-  }
-
-  public boolean isCreateNewChangeForAllNotInTarget() {
-    return getInheritableBoolean(Project::getCreateNewChangeForAllNotInTarget);
-  }
-
-  public boolean isEnableSignedPush() {
-    return getInheritableBoolean(Project::getEnableSignedPush);
-  }
-
-  public boolean isRequireSignedPush() {
-    return getInheritableBoolean(Project::getRequireSignedPush);
-  }
-
-  public boolean isRejectImplicitMerges() {
-    return getInheritableBoolean(Project::getRejectImplicitMerges);
-  }
-
-  public boolean isPrivateByDefault() {
-    return getInheritableBoolean(Project::getPrivateByDefault);
-  }
-
-  public boolean isWorkInProgressByDefault() {
-    return getInheritableBoolean(Project::getWorkInProgressByDefault);
-  }
-
-  public boolean isEnableReviewerByEmail() {
-    return getInheritableBoolean(Project::getEnableReviewerByEmail);
-  }
-
-  public boolean isMatchAuthorToCommitterDate() {
-    return getInheritableBoolean(Project::getMatchAuthorToCommitterDate);
-  }
-
-  /** All available label types. */
-  public LabelTypes getLabelTypes() {
-    if (labelTypes == null) {
-      labelTypes = loadLabelTypes();
-    }
-    return labelTypes;
-  }
-
-  /** All available label types for this change and user. */
-  public LabelTypes getLabelTypes(ChangeNotes notes, CurrentUser user) {
-    return getLabelTypes(notes.getChange().getDest(), user);
-  }
-
-  /** All available label types for this branch and user. */
-  public LabelTypes getLabelTypes(Branch.NameKey destination, CurrentUser user) {
-    List<LabelType> all = getLabelTypes().getLabelTypes();
-
-    List<LabelType> r = Lists.newArrayListWithCapacity(all.size());
-    for (LabelType l : all) {
-      List<String> refs = l.getRefPatterns();
-      if (refs == null) {
-        r.add(l);
-      } else {
-        for (String refPattern : refs) {
-          if (RefConfigSection.isValid(refPattern) && match(destination, refPattern, user)) {
-            r.add(l);
-            break;
-          }
-        }
-      }
-    }
-
-    return new LabelTypes(r);
-  }
-
-  public List<CommentLinkInfo> getCommentLinks() {
-    Map<String, CommentLinkInfo> cls = new LinkedHashMap<>();
-    for (CommentLinkInfo cl : commentLinks) {
-      cls.put(cl.name.toLowerCase(), cl);
-    }
-    for (ProjectState s : treeInOrder()) {
-      for (CommentLinkInfoImpl cl : s.getConfig().getCommentLinkSections()) {
-        String name = cl.name.toLowerCase();
-        if (cl.isOverrideOnly()) {
-          CommentLinkInfo parent = cls.get(name);
-          if (parent == null) {
-            continue; // Ignore invalid overrides.
-          }
-          cls.put(name, cl.inherit(parent));
-        } else {
-          cls.put(name, cl);
-        }
-      }
-    }
-    return ImmutableList.copyOf(cls.values());
-  }
-
-  public BranchOrderSection getBranchOrderSection() {
-    for (ProjectState s : tree()) {
-      BranchOrderSection section = s.getConfig().getBranchOrderSection();
-      if (section != null) {
-        return section;
-      }
-    }
-    return null;
-  }
-
-  public Collection<SubscribeSection> getSubscribeSections(Branch.NameKey branch) {
-    Collection<SubscribeSection> ret = new ArrayList<>();
-    for (ProjectState s : tree()) {
-      ret.addAll(s.getConfig().getSubscribeSections(branch));
-    }
-    return ret;
-  }
-
-  public ThemeInfo getTheme() {
-    ThemeInfo theme = this.theme;
-    if (theme == null) {
-      synchronized (this) {
-        theme = this.theme;
-        if (theme == null) {
-          theme = loadTheme();
-          this.theme = theme;
-        }
-      }
-    }
-    if (theme == ThemeInfo.INHERIT) {
-      ProjectState parent = Iterables.getFirst(parents(), null);
-      return parent != null ? parent.getTheme() : null;
-    }
-    return theme;
-  }
-
-  public Set<GroupReference> getAllGroups() {
-    return getGroups(getAllSections());
-  }
-
-  public Set<GroupReference> getLocalGroups() {
-    return getGroups(getLocalAccessSections());
-  }
-
-  private static Set<GroupReference> getGroups(List<SectionMatcher> sectionMatcherList) {
-    final Set<GroupReference> all = new HashSet<>();
-    for (SectionMatcher matcher : sectionMatcherList) {
-      final AccessSection section = matcher.section;
-      for (Permission permission : section.getPermissions()) {
-        for (PermissionRule rule : permission.getRules()) {
-          all.add(rule.getGroup());
-        }
-      }
-    }
-    return all;
-  }
-
-  private ThemeInfo loadTheme() {
-    String name = getConfig().getProject().getName();
-    Path dir = sitePaths.themes_dir.resolve(name);
-    if (!Files.exists(dir)) {
-      return ThemeInfo.INHERIT;
-    } else if (!Files.isDirectory(dir)) {
-      log.warn("Bad theme for {}: not a directory", name);
-      return ThemeInfo.INHERIT;
-    }
-    try {
-      return new ThemeInfo(
-          readFile(dir.resolve(SitePaths.CSS_FILENAME)),
-          readFile(dir.resolve(SitePaths.HEADER_FILENAME)),
-          readFile(dir.resolve(SitePaths.FOOTER_FILENAME)));
-    } catch (IOException e) {
-      log.error("Error reading theme for " + name, e);
-      return ThemeInfo.INHERIT;
-    }
-  }
-
-  private String readFile(Path p) throws IOException {
-    return Files.exists(p) ? new String(Files.readAllBytes(p), UTF_8) : null;
-  }
-
-  private boolean getInheritableBoolean(Function<Project, InheritableBoolean> func) {
-    for (ProjectState s : tree()) {
-      switch (func.apply(s.getProject())) {
-        case TRUE:
-          return true;
-        case FALSE:
-          return false;
-        case INHERIT:
-        default:
-          continue;
-      }
-    }
-    return false;
-  }
-
-  private LabelTypes loadLabelTypes() {
-    Map<String, LabelType> types = new LinkedHashMap<>();
-    for (ProjectState s : treeInOrder()) {
-      for (LabelType type : s.getConfig().getLabelSections().values()) {
-        String lower = type.getName().toLowerCase();
-        LabelType old = types.get(lower);
-        if (old == null || old.canOverride()) {
-          types.put(lower, type);
-        }
-      }
-    }
-    List<LabelType> all = Lists.newArrayListWithCapacity(types.size());
-    for (LabelType type : types.values()) {
-      if (!type.getValues().isEmpty()) {
-        all.add(type);
-      }
-    }
-    return new LabelTypes(Collections.unmodifiableList(all));
-  }
-
-  private boolean match(Branch.NameKey destination, String refPattern, CurrentUser user) {
-    return RefPatternMatcher.getMatcher(refPattern).match(destination.get(), user);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectsCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectsCollection.java
deleted file mode 100644
index e0741f0..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectsCollection.java
+++ /dev/null
@@ -1,149 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.project;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AcceptsCreate;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestCollection;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.OutputFormat;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.ProjectPermission;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.eclipse.jgit.lib.Constants;
-
-@Singleton
-public class ProjectsCollection
-    implements RestCollection<TopLevelResource, ProjectResource>, AcceptsCreate<TopLevelResource> {
-  private final DynamicMap<RestView<ProjectResource>> views;
-  private final Provider<ListProjects> list;
-  private final ProjectControl.GenericFactory controlFactory;
-  private final PermissionBackend permissionBackend;
-  private final Provider<CurrentUser> user;
-  private final CreateProject.Factory createProjectFactory;
-
-  @Inject
-  ProjectsCollection(
-      DynamicMap<RestView<ProjectResource>> views,
-      Provider<ListProjects> list,
-      ProjectControl.GenericFactory controlFactory,
-      PermissionBackend permissionBackend,
-      CreateProject.Factory factory,
-      Provider<CurrentUser> user) {
-    this.views = views;
-    this.list = list;
-    this.controlFactory = controlFactory;
-    this.permissionBackend = permissionBackend;
-    this.user = user;
-    this.createProjectFactory = factory;
-  }
-
-  @Override
-  public RestView<TopLevelResource> list() {
-    return list.get().setFormat(OutputFormat.JSON);
-  }
-
-  @Override
-  public ProjectResource parse(TopLevelResource parent, IdString id)
-      throws ResourceNotFoundException, IOException, PermissionBackendException {
-    ProjectResource rsrc = _parse(id.get(), true);
-    if (rsrc == null) {
-      throw new ResourceNotFoundException(id);
-    }
-    return rsrc;
-  }
-
-  /**
-   * Parses a project ID from a request body and returns the project.
-   *
-   * @param id ID of the project, can be a project name
-   * @return the project
-   * @throws UnprocessableEntityException thrown if the project ID cannot be resolved or if the
-   *     project is not visible to the calling user
-   * @throws IOException thrown when there is an error.
-   * @throws PermissionBackendException
-   */
-  public ProjectResource parse(String id)
-      throws UnprocessableEntityException, IOException, PermissionBackendException {
-    return parse(id, true);
-  }
-
-  /**
-   * Parses a project ID from a request body and returns the project.
-   *
-   * @param id ID of the project, can be a project name
-   * @param checkAccess if true, check the project is accessible by the current user
-   * @return the project
-   * @throws UnprocessableEntityException thrown if the project ID cannot be resolved or if the
-   *     project is not visible to the calling user and checkVisibility is true.
-   * @throws IOException thrown when there is an error.
-   * @throws PermissionBackendException
-   */
-  public ProjectResource parse(String id, boolean checkAccess)
-      throws UnprocessableEntityException, IOException, PermissionBackendException {
-    ProjectResource rsrc = _parse(id, checkAccess);
-    if (rsrc == null) {
-      throw new UnprocessableEntityException(String.format("Project Not Found: %s", id));
-    }
-    return rsrc;
-  }
-
-  @Nullable
-  private ProjectResource _parse(String id, boolean checkAccess)
-      throws IOException, PermissionBackendException {
-    if (id.endsWith(Constants.DOT_GIT_EXT)) {
-      id = id.substring(0, id.length() - Constants.DOT_GIT_EXT.length());
-    }
-
-    Project.NameKey nameKey = new Project.NameKey(id);
-    ProjectControl ctl;
-    try {
-      ctl = controlFactory.controlFor(nameKey, user.get());
-    } catch (NoSuchProjectException e) {
-      return null;
-    }
-
-    if (checkAccess) {
-      try {
-        permissionBackend.user(user).project(nameKey).check(ProjectPermission.ACCESS);
-      } catch (AuthException e) {
-        return null; // Pretend like not found on access denied.
-      }
-    }
-    return new ProjectResource(ctl);
-  }
-
-  @Override
-  public DynamicMap<RestView<ProjectResource>> views() {
-    return views;
-  }
-
-  @Override
-  public CreateProject create(TopLevelResource parent, IdString name) {
-    return createProjectFactory.create(name.get());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/PutBranch.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/PutBranch.java
deleted file mode 100644
index 8e8efaf..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/PutBranch.java
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.api.projects.BranchInfo;
-import com.google.gerrit.extensions.api.projects.BranchInput;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.inject.Singleton;
-
-@Singleton
-public class PutBranch implements RestModifyView<BranchResource, BranchInput> {
-
-  @Override
-  public BranchInfo apply(BranchResource rsrc, BranchInput input) throws ResourceConflictException {
-    throw new ResourceConflictException("Branch \"" + rsrc.getRef() + "\" already exists");
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/PutConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/PutConfig.java
deleted file mode 100644
index c1ca04a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/PutConfig.java
+++ /dev/null
@@ -1,318 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.project;
-
-import com.google.common.base.Joiner;
-import com.google.common.base.Strings;
-import com.google.gerrit.extensions.api.projects.ConfigInfo;
-import com.google.gerrit.extensions.api.projects.ConfigInput;
-import com.google.gerrit.extensions.api.projects.ConfigValue;
-import com.google.gerrit.extensions.api.projects.ProjectConfigEntryType;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.EnableSignedPush;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.config.PluginConfig;
-import com.google.gerrit.server.config.PluginConfigFactory;
-import com.google.gerrit.server.config.ProjectConfigEntry;
-import com.google.gerrit.server.extensions.webui.UiActions;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.regex.Pattern;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class PutConfig implements RestModifyView<ProjectResource, ConfigInput> {
-  private static final Logger log = LoggerFactory.getLogger(PutConfig.class);
-  private static final Pattern PARAMETER_NAME_PATTERN =
-      Pattern.compile("^[a-zA-Z0-9]+[a-zA-Z0-9-]*$");
-
-  private final boolean serverEnableSignedPush;
-  private final Provider<MetaDataUpdate.User> metaDataUpdateFactory;
-  private final ProjectCache projectCache;
-  private final ProjectState.Factory projectStateFactory;
-  private final DynamicMap<ProjectConfigEntry> pluginConfigEntries;
-  private final PluginConfigFactory cfgFactory;
-  private final AllProjectsName allProjects;
-  private final UiActions uiActions;
-  private final DynamicMap<RestView<ProjectResource>> views;
-  private final Provider<CurrentUser> user;
-
-  @Inject
-  PutConfig(
-      @EnableSignedPush boolean serverEnableSignedPush,
-      Provider<MetaDataUpdate.User> metaDataUpdateFactory,
-      ProjectCache projectCache,
-      ProjectState.Factory projectStateFactory,
-      DynamicMap<ProjectConfigEntry> pluginConfigEntries,
-      PluginConfigFactory cfgFactory,
-      AllProjectsName allProjects,
-      UiActions uiActions,
-      DynamicMap<RestView<ProjectResource>> views,
-      Provider<CurrentUser> user) {
-    this.serverEnableSignedPush = serverEnableSignedPush;
-    this.metaDataUpdateFactory = metaDataUpdateFactory;
-    this.projectCache = projectCache;
-    this.projectStateFactory = projectStateFactory;
-    this.pluginConfigEntries = pluginConfigEntries;
-    this.cfgFactory = cfgFactory;
-    this.allProjects = allProjects;
-    this.uiActions = uiActions;
-    this.views = views;
-    this.user = user;
-  }
-
-  @Override
-  public ConfigInfo apply(ProjectResource rsrc, ConfigInput input) throws RestApiException {
-    if (!rsrc.getControl().isOwner()) {
-      throw new AuthException("restricted to project owner");
-    }
-    return apply(rsrc.getProjectState(), input);
-  }
-
-  public ConfigInfo apply(ProjectState projectState, ConfigInput input)
-      throws ResourceNotFoundException, BadRequestException, ResourceConflictException {
-    Project.NameKey projectName = projectState.getNameKey();
-    if (input == null) {
-      throw new BadRequestException("config is required");
-    }
-
-    try (MetaDataUpdate md = metaDataUpdateFactory.get().create(projectName)) {
-      ProjectConfig projectConfig = ProjectConfig.read(md);
-      Project p = projectConfig.getProject();
-
-      p.setDescription(Strings.emptyToNull(input.description));
-
-      if (input.useContributorAgreements != null) {
-        p.setUseContributorAgreements(input.useContributorAgreements);
-      }
-      if (input.useContentMerge != null) {
-        p.setUseContentMerge(input.useContentMerge);
-      }
-      if (input.useSignedOffBy != null) {
-        p.setUseSignedOffBy(input.useSignedOffBy);
-      }
-
-      if (input.createNewChangeForAllNotInTarget != null) {
-        p.setCreateNewChangeForAllNotInTarget(input.createNewChangeForAllNotInTarget);
-      }
-
-      if (input.requireChangeId != null) {
-        p.setRequireChangeID(input.requireChangeId);
-      }
-
-      if (serverEnableSignedPush) {
-        if (input.enableSignedPush != null) {
-          p.setEnableSignedPush(input.enableSignedPush);
-        }
-        if (input.requireSignedPush != null) {
-          p.setRequireSignedPush(input.requireSignedPush);
-        }
-      }
-
-      if (input.rejectImplicitMerges != null) {
-        p.setRejectImplicitMerges(input.rejectImplicitMerges);
-      }
-
-      if (input.privateByDefault != null) {
-        p.setPrivateByDefault(input.privateByDefault);
-      }
-
-      if (input.workInProgressByDefault != null) {
-        p.setWorkInProgressByDefault(input.workInProgressByDefault);
-      }
-
-      if (input.maxObjectSizeLimit != null) {
-        p.setMaxObjectSizeLimit(input.maxObjectSizeLimit);
-      }
-
-      if (input.submitType != null) {
-        p.setSubmitType(input.submitType);
-      }
-
-      if (input.state != null) {
-        p.setState(input.state);
-      }
-
-      if (input.enableReviewerByEmail != null) {
-        p.setEnableReviewerByEmail(input.enableReviewerByEmail);
-      }
-
-      if (input.matchAuthorToCommitterDate != null) {
-        p.setMatchAuthorToCommitterDate(input.matchAuthorToCommitterDate);
-      }
-
-      if (input.pluginConfigValues != null) {
-        setPluginConfigValues(projectState, projectConfig, input.pluginConfigValues);
-      }
-
-      md.setMessage("Modified project settings\n");
-      try {
-        projectConfig.commit(md);
-        projectCache.evict(projectConfig.getProject());
-        md.getRepository().setGitwebDescription(p.getDescription());
-      } catch (IOException e) {
-        if (e.getCause() instanceof ConfigInvalidException) {
-          throw new ResourceConflictException(
-              "Cannot update " + projectName + ": " + e.getCause().getMessage());
-        }
-        log.warn("Failed to update config of project {}.", projectName, e);
-        throw new ResourceConflictException("Cannot update " + projectName, e);
-      }
-
-      ProjectState state = projectStateFactory.create(ProjectConfig.read(md));
-      return new ConfigInfoImpl(
-          serverEnableSignedPush,
-          state.controlFor(user.get()),
-          pluginConfigEntries,
-          cfgFactory,
-          allProjects,
-          uiActions,
-          views);
-    } catch (RepositoryNotFoundException notFound) {
-      throw new ResourceNotFoundException(projectName.get());
-    } catch (ConfigInvalidException err) {
-      throw new ResourceConflictException("Cannot read project " + projectName, err);
-    } catch (IOException err) {
-      throw new ResourceConflictException("Cannot update project " + projectName, err);
-    }
-  }
-
-  private void setPluginConfigValues(
-      ProjectState projectState,
-      ProjectConfig projectConfig,
-      Map<String, Map<String, ConfigValue>> pluginConfigValues)
-      throws BadRequestException {
-    for (Entry<String, Map<String, ConfigValue>> e : pluginConfigValues.entrySet()) {
-      String pluginName = e.getKey();
-      PluginConfig cfg = projectConfig.getPluginConfig(pluginName);
-      for (Entry<String, ConfigValue> v : e.getValue().entrySet()) {
-        ProjectConfigEntry projectConfigEntry = pluginConfigEntries.get(pluginName, v.getKey());
-        if (projectConfigEntry != null) {
-          if (!PARAMETER_NAME_PATTERN.matcher(v.getKey()).matches()) {
-            // TODO check why we have this restriction
-            log.warn(
-                "Parameter name '{}' must match '{}'",
-                v.getKey(),
-                PARAMETER_NAME_PATTERN.pattern());
-            continue;
-          }
-          String oldValue = cfg.getString(v.getKey());
-          String value = v.getValue().value;
-          if (projectConfigEntry.getType() == ProjectConfigEntryType.ARRAY) {
-            List<String> l = Arrays.asList(cfg.getStringList(v.getKey()));
-            oldValue = Joiner.on("\n").join(l);
-            value = Joiner.on("\n").join(v.getValue().values);
-          }
-          if (Strings.emptyToNull(value) != null) {
-            if (!value.equals(oldValue)) {
-              validateProjectConfigEntryIsEditable(
-                  projectConfigEntry, projectState, v.getKey(), pluginName);
-              v.setValue(projectConfigEntry.preUpdate(v.getValue()));
-              value = v.getValue().value;
-              try {
-                switch (projectConfigEntry.getType()) {
-                  case BOOLEAN:
-                    boolean newBooleanValue = Boolean.parseBoolean(value);
-                    cfg.setBoolean(v.getKey(), newBooleanValue);
-                    break;
-                  case INT:
-                    int newIntValue = Integer.parseInt(value);
-                    cfg.setInt(v.getKey(), newIntValue);
-                    break;
-                  case LONG:
-                    long newLongValue = Long.parseLong(value);
-                    cfg.setLong(v.getKey(), newLongValue);
-                    break;
-                  case LIST:
-                    if (!projectConfigEntry.getPermittedValues().contains(value)) {
-                      throw new BadRequestException(
-                          String.format(
-                              "The value '%s' is not permitted for parameter '%s' of plugin '"
-                                  + pluginName
-                                  + "'",
-                              value,
-                              v.getKey()));
-                    }
-                    // $FALL-THROUGH$
-                  case STRING:
-                    cfg.setString(v.getKey(), value);
-                    break;
-                  case ARRAY:
-                    cfg.setStringList(v.getKey(), v.getValue().values);
-                    break;
-                  default:
-                    log.warn(
-                        "The type '{}' of parameter '{}' is not supported.",
-                        projectConfigEntry.getType().name(),
-                        v.getKey());
-                }
-              } catch (NumberFormatException ex) {
-                throw new BadRequestException(
-                    String.format(
-                        "The value '%s' of config parameter '%s' of plugin '%s' is invalid: %s",
-                        v.getValue(), v.getKey(), pluginName, ex.getMessage()));
-              }
-            }
-          } else {
-            if (oldValue != null) {
-              validateProjectConfigEntryIsEditable(
-                  projectConfigEntry, projectState, v.getKey(), pluginName);
-              cfg.unset(v.getKey());
-            }
-          }
-        } else {
-          throw new BadRequestException(
-              String.format(
-                  "The config parameter '%s' of plugin '%s' does not exist.",
-                  v.getKey(), pluginName));
-        }
-      }
-    }
-  }
-
-  private static void validateProjectConfigEntryIsEditable(
-      ProjectConfigEntry projectConfigEntry,
-      ProjectState projectState,
-      String parameterName,
-      String pluginName)
-      throws BadRequestException {
-    if (!projectConfigEntry.isEditable(projectState)) {
-      throw new BadRequestException(
-          String.format(
-              "Not allowed to set parameter '%s' of plugin '%s' on project '%s'.",
-              parameterName, pluginName, projectState.getName()));
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/PutDescription.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/PutDescription.java
deleted file mode 100644
index 78230bd..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/PutDescription.java
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.project;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Strings;
-import com.google.gerrit.extensions.api.projects.DescriptionInput;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-
-@Singleton
-public class PutDescription implements RestModifyView<ProjectResource, DescriptionInput> {
-  private final ProjectCache cache;
-  private final MetaDataUpdate.Server updateFactory;
-
-  @Inject
-  PutDescription(ProjectCache cache, MetaDataUpdate.Server updateFactory) {
-    this.cache = cache;
-    this.updateFactory = updateFactory;
-  }
-
-  @Override
-  public Response<String> apply(ProjectResource resource, DescriptionInput input)
-      throws AuthException, ResourceConflictException, ResourceNotFoundException, IOException {
-    if (input == null) {
-      input = new DescriptionInput(); // Delete would set description to null.
-    }
-
-    ProjectControl ctl = resource.getControl();
-    IdentifiedUser user = ctl.getUser().asIdentifiedUser();
-    if (!ctl.isOwner()) {
-      throw new AuthException("not project owner");
-    }
-
-    try (MetaDataUpdate md = updateFactory.create(resource.getNameKey())) {
-      ProjectConfig config = ProjectConfig.read(md);
-      Project project = config.getProject();
-      project.setDescription(Strings.emptyToNull(input.description));
-
-      String msg =
-          MoreObjects.firstNonNull(
-              Strings.emptyToNull(input.commitMessage), "Updated description.\n");
-      if (!msg.endsWith("\n")) {
-        msg += "\n";
-      }
-      md.setAuthor(user);
-      md.setMessage(msg);
-      config.commit(md);
-      cache.evict(ctl.getProject());
-      md.getRepository().setGitwebDescription(project.getDescription());
-
-      return Strings.isNullOrEmpty(project.getDescription())
-          ? Response.<String>none()
-          : Response.ok(project.getDescription());
-    } catch (RepositoryNotFoundException notFound) {
-      throw new ResourceNotFoundException(resource.getName());
-    } catch (ConfigInvalidException e) {
-      throw new ResourceConflictException(
-          String.format("invalid project.config: %s", e.getMessage()));
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/PutProject.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/PutProject.java
deleted file mode 100644
index 1d2384f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/PutProject.java
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.api.projects.ProjectInput;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.inject.Singleton;
-
-@Singleton
-public class PutProject implements RestModifyView<ProjectResource, ProjectInput> {
-  @Override
-  public Response<?> apply(ProjectResource resource, ProjectInput input)
-      throws ResourceConflictException {
-    throw new ResourceConflictException("Project \"" + resource.getName() + "\" already exists");
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/PutTag.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/PutTag.java
deleted file mode 100644
index b8a8f6d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/PutTag.java
+++ /dev/null
@@ -1,28 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.api.projects.TagInfo;
-import com.google.gerrit.extensions.api.projects.TagInput;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-
-public class PutTag implements RestModifyView<TagResource, TagInput> {
-
-  @Override
-  public TagInfo apply(TagResource resource, TagInput input) throws ResourceConflictException {
-    throw new ResourceConflictException("Tag \"" + resource.getTagInfo().ref + "\" already exists");
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/RefControl.java
deleted file mode 100644
index cde2c80..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefControl.java
+++ /dev/null
@@ -1,591 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.server.project;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.common.data.PermissionRange;
-import com.google.gerrit.common.data.PermissionRule;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.permissions.FailedPermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackend.ForChange;
-import com.google.gerrit.server.permissions.PermissionBackend.ForRef;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.RefPermission;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.util.Providers;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/** Manages access control for Git references (aka branches, tags). */
-public class RefControl {
-  private final ProjectControl projectControl;
-  private final String refName;
-
-  /** All permissions that apply to this reference. */
-  private final PermissionCollection relevant;
-
-  /** Cached set of permissions matching this user. */
-  private final Map<String, List<PermissionRule>> effective;
-
-  private Boolean owner;
-  private Boolean canForgeAuthor;
-  private Boolean canForgeCommitter;
-  private Boolean isVisible;
-
-  RefControl(ProjectControl projectControl, String ref, PermissionCollection relevant) {
-    this.projectControl = projectControl;
-    this.refName = ref;
-    this.relevant = relevant;
-    this.effective = new HashMap<>();
-  }
-
-  public String getRefName() {
-    return refName;
-  }
-
-  public ProjectControl getProjectControl() {
-    return projectControl;
-  }
-
-  public CurrentUser getUser() {
-    return projectControl.getUser();
-  }
-
-  public RefControl forUser(CurrentUser who) {
-    ProjectControl newCtl = projectControl.forUser(who);
-    if (relevant.isUserSpecific()) {
-      return newCtl.controlForRef(getRefName());
-    }
-    return new RefControl(newCtl, getRefName(), relevant);
-  }
-
-  /** Is this user a ref owner? */
-  public boolean isOwner() {
-    if (owner == null) {
-      if (canPerform(Permission.OWNER)) {
-        owner = true;
-
-      } else {
-        owner = projectControl.isOwner();
-      }
-    }
-    return owner;
-  }
-
-  /** Can this user see this reference exists? */
-  boolean isVisible() {
-    if (isVisible == null) {
-      isVisible =
-          (getUser().isInternalUser() || canPerform(Permission.READ))
-              && isProjectStatePermittingRead();
-    }
-    return isVisible;
-  }
-
-  /** Can this user see other users change edits? */
-  public boolean isEditVisible() {
-    return canViewPrivateChanges();
-  }
-
-  private boolean canUpload() {
-    return projectControl.controlForRef("refs/for/" + getRefName()).canPerform(Permission.PUSH)
-        && isProjectStatePermittingWrite();
-  }
-
-  /** @return true if this user can add a new patch set to this ref */
-  boolean canAddPatchSet() {
-    return projectControl
-            .controlForRef("refs/for/" + getRefName())
-            .canPerform(Permission.ADD_PATCH_SET)
-        && isProjectStatePermittingWrite();
-  }
-
-  /** @return true if this user can submit merge patch sets to this ref */
-  private boolean canUploadMerges() {
-    return projectControl
-            .controlForRef("refs/for/" + getRefName())
-            .canPerform(Permission.PUSH_MERGE)
-        && isProjectStatePermittingWrite();
-  }
-
-  /** @return true if this user can rebase changes on this ref */
-  boolean canRebase() {
-    return canPerform(Permission.REBASE) && isProjectStatePermittingWrite();
-  }
-
-  /** @return true if this user can submit patch sets to this ref */
-  boolean canSubmit(boolean isChangeOwner) {
-    if (RefNames.REFS_CONFIG.equals(refName)) {
-      // Always allow project owners to submit configuration changes.
-      // Submitting configuration changes modifies the access control
-      // rules. Allowing this to be done by a non-project-owner opens
-      // a security hole enabling editing of access rules, and thus
-      // granting of powers beyond submitting to the configuration.
-      return projectControl.isOwner();
-    }
-    return canPerform(Permission.SUBMIT, isChangeOwner) && isProjectStatePermittingWrite();
-  }
-
-  /** @return true if the user can update the reference as a fast-forward. */
-  private boolean canUpdate() {
-    if (RefNames.REFS_CONFIG.equals(refName) && !projectControl.isOwner()) {
-      // Pushing requires being at least project owner, in addition to push.
-      // Pushing configuration changes modifies the access control
-      // rules. Allowing this to be done by a non-project-owner opens
-      // a security hole enabling editing of access rules, and thus
-      // granting of powers beyond pushing to the configuration.
-
-      // On the AllProjects project the owner access right cannot be assigned,
-      // this why for the AllProjects project we allow administrators to push
-      // configuration changes if they have push without being project owner.
-      if (!(projectControl.getProjectState().isAllProjects() && projectControl.isAdmin())) {
-        return false;
-      }
-    }
-    return canPerform(Permission.PUSH) && isProjectStatePermittingWrite();
-  }
-
-  /** @return true if the user can rewind (force push) the reference. */
-  private boolean canForceUpdate() {
-    if (!isProjectStatePermittingWrite()) {
-      return false;
-    }
-
-    if (canPushWithForce()) {
-      return true;
-    }
-
-    switch (getUser().getAccessPath()) {
-      case GIT:
-        return false;
-
-      case JSON_RPC:
-      case REST_API:
-      case SSH_COMMAND:
-      case UNKNOWN:
-      case WEB_BROWSER:
-      default:
-        return (isOwner() && !isForceBlocked(Permission.PUSH)) || projectControl.isAdmin();
-    }
-  }
-
-  private boolean isProjectStatePermittingWrite() {
-    return getProjectControl().getProject().getState().permitsWrite();
-  }
-
-  private boolean isProjectStatePermittingRead() {
-    return getProjectControl().getProject().getState().permitsRead();
-  }
-
-  private boolean canPushWithForce() {
-    if (!isProjectStatePermittingWrite()
-        || (RefNames.REFS_CONFIG.equals(refName) && !projectControl.isOwner())) {
-      // Pushing requires being at least project owner, in addition to push.
-      // Pushing configuration changes modifies the access control
-      // rules. Allowing this to be done by a non-project-owner opens
-      // a security hole enabling editing of access rules, and thus
-      // granting of powers beyond pushing to the configuration.
-      return false;
-    }
-    return canForcePerform(Permission.PUSH);
-  }
-
-  /**
-   * Determines whether the user can delete the Git ref controlled by this object.
-   *
-   * @return {@code true} if the user specified can delete a Git ref.
-   */
-  private boolean canDelete() {
-    if (!isProjectStatePermittingWrite() || (RefNames.REFS_CONFIG.equals(refName))) {
-      // Never allow removal of the refs/meta/config branch.
-      // Deleting the branch would destroy all Gerrit specific
-      // metadata about the project, including its access rules.
-      // If a project is to be removed from Gerrit, its repository
-      // should be removed first.
-      return false;
-    }
-
-    switch (getUser().getAccessPath()) {
-      case GIT:
-        return canPushWithForce() || canPerform(Permission.DELETE);
-
-      case JSON_RPC:
-      case REST_API:
-      case SSH_COMMAND:
-      case UNKNOWN:
-      case WEB_BROWSER:
-      default:
-        return (isOwner() && !isForceBlocked(Permission.PUSH))
-            || canPushWithForce()
-            || canPerform(Permission.DELETE)
-            || projectControl.isAdmin();
-    }
-  }
-
-  /** @return true if this user can forge the author line in a commit. */
-  private boolean canForgeAuthor() {
-    if (canForgeAuthor == null) {
-      canForgeAuthor = canPerform(Permission.FORGE_AUTHOR);
-    }
-    return canForgeAuthor;
-  }
-
-  /** @return true if this user can forge the committer line in a commit. */
-  private boolean canForgeCommitter() {
-    if (canForgeCommitter == null) {
-      canForgeCommitter = canPerform(Permission.FORGE_COMMITTER);
-    }
-    return canForgeCommitter;
-  }
-
-  /** @return true if this user can forge the server on the committer line. */
-  private boolean canForgeGerritServerIdentity() {
-    return canPerform(Permission.FORGE_SERVER);
-  }
-
-  /** @return true if this user can abandon a change for this ref */
-  boolean canAbandon() {
-    return canPerform(Permission.ABANDON);
-  }
-
-  /** @return true if this user can remove a reviewer for a change. */
-  boolean canRemoveReviewer() {
-    return canPerform(Permission.REMOVE_REVIEWER);
-  }
-
-  /** @return true if this user can view private changes. */
-  boolean canViewPrivateChanges() {
-    return canPerform(Permission.VIEW_PRIVATE_CHANGES);
-  }
-
-  /** @return true if this user can delete changes. */
-  boolean canDeleteChanges(boolean isChangeOwner) {
-    return canPerform(Permission.DELETE_CHANGES)
-        || (isChangeOwner && canPerform(Permission.DELETE_OWN_CHANGES, isChangeOwner));
-  }
-
-  /** @return true if this user can edit topic names. */
-  boolean canEditTopicName() {
-    return canPerform(Permission.EDIT_TOPIC_NAME);
-  }
-
-  /** @return true if this user can edit hashtag names. */
-  boolean canEditHashtags() {
-    return canPerform(Permission.EDIT_HASHTAGS);
-  }
-
-  boolean canEditAssignee() {
-    return canPerform(Permission.EDIT_ASSIGNEE);
-  }
-
-  /** @return true if this user can force edit topic names. */
-  boolean canForceEditTopicName() {
-    return canForcePerform(Permission.EDIT_TOPIC_NAME);
-  }
-
-  /** The range of permitted values associated with a label permission. */
-  PermissionRange getRange(String permission) {
-    return getRange(permission, false);
-  }
-
-  /** The range of permitted values associated with a label permission. */
-  PermissionRange getRange(String permission, boolean isChangeOwner) {
-    if (Permission.hasRange(permission)) {
-      return toRange(permission, access(permission, isChangeOwner));
-    }
-    return null;
-  }
-
-  private static class AllowedRange {
-    private int allowMin;
-    private int allowMax;
-    private int blockMin = Integer.MIN_VALUE;
-    private int blockMax = Integer.MAX_VALUE;
-
-    void update(PermissionRule rule) {
-      if (rule.isBlock()) {
-        blockMin = Math.max(blockMin, rule.getMin());
-        blockMax = Math.min(blockMax, rule.getMax());
-      } else {
-        allowMin = Math.min(allowMin, rule.getMin());
-        allowMax = Math.max(allowMax, rule.getMax());
-      }
-    }
-
-    int getAllowMin() {
-      return allowMin;
-    }
-
-    int getAllowMax() {
-      return allowMax;
-    }
-
-    int getBlockMin() {
-      // ALLOW wins over BLOCK on the same project
-      return Math.min(blockMin, allowMin - 1);
-    }
-
-    int getBlockMax() {
-      // ALLOW wins over BLOCK on the same project
-      return Math.max(blockMax, allowMax + 1);
-    }
-  }
-
-  private PermissionRange toRange(String permissionName, List<PermissionRule> ruleList) {
-    Map<ProjectRef, AllowedRange> ranges = new HashMap<>();
-    for (PermissionRule rule : ruleList) {
-      ProjectRef p = relevant.getRuleProps(rule);
-      AllowedRange r = ranges.get(p);
-      if (r == null) {
-        r = new AllowedRange();
-        ranges.put(p, r);
-      }
-      r.update(rule);
-    }
-    int allowMin = 0;
-    int allowMax = 0;
-    int blockMin = Integer.MIN_VALUE;
-    int blockMax = Integer.MAX_VALUE;
-    for (AllowedRange r : ranges.values()) {
-      allowMin = Math.min(allowMin, r.getAllowMin());
-      allowMax = Math.max(allowMax, r.getAllowMax());
-      blockMin = Math.max(blockMin, r.getBlockMin());
-      blockMax = Math.min(blockMax, r.getBlockMax());
-    }
-
-    // BLOCK wins over ALLOW across projects
-    int min = Math.max(allowMin, blockMin + 1);
-    int max = Math.min(allowMax, blockMax - 1);
-    return new PermissionRange(permissionName, min, max);
-  }
-
-  /** True if the user has this permission. Works only for non labels. */
-  boolean canPerform(String permissionName) {
-    return canPerform(permissionName, false);
-  }
-
-  boolean canPerform(String permissionName, boolean isChangeOwner) {
-    return doCanPerform(permissionName, isChangeOwner, false);
-  }
-
-  /** True if the user is blocked from using this permission. */
-  public boolean isBlocked(String permissionName) {
-    return !doCanPerform(permissionName, false, true);
-  }
-
-  private boolean doCanPerform(String permissionName, boolean isChangeOwner, boolean blockOnly) {
-    List<PermissionRule> access = access(permissionName, isChangeOwner);
-    List<PermissionRule> overridden = relevant.getOverridden(permissionName);
-    Set<ProjectRef> allows = new HashSet<>();
-    Set<ProjectRef> blocks = new HashSet<>();
-    for (PermissionRule rule : access) {
-      if (rule.isBlock() && !rule.getForce()) {
-        blocks.add(relevant.getRuleProps(rule));
-      } else {
-        allows.add(relevant.getRuleProps(rule));
-      }
-    }
-    for (PermissionRule rule : overridden) {
-      blocks.remove(relevant.getRuleProps(rule));
-    }
-    blocks.removeAll(allows);
-    return blocks.isEmpty() && (!allows.isEmpty() || blockOnly);
-  }
-
-  /** True if the user has force this permission. Works only for non labels. */
-  private boolean canForcePerform(String permissionName) {
-    List<PermissionRule> access = access(permissionName);
-    List<PermissionRule> overridden = relevant.getOverridden(permissionName);
-    Set<ProjectRef> allows = new HashSet<>();
-    Set<ProjectRef> blocks = new HashSet<>();
-    for (PermissionRule rule : access) {
-      if (rule.isBlock()) {
-        blocks.add(relevant.getRuleProps(rule));
-      } else if (rule.getForce()) {
-        allows.add(relevant.getRuleProps(rule));
-      }
-    }
-    for (PermissionRule rule : overridden) {
-      if (rule.getForce()) {
-        blocks.remove(relevant.getRuleProps(rule));
-      }
-    }
-    blocks.removeAll(allows);
-    return blocks.isEmpty() && !allows.isEmpty();
-  }
-
-  /** True if for this permission force is blocked for the user. Works only for non labels. */
-  private boolean isForceBlocked(String permissionName) {
-    List<PermissionRule> access = access(permissionName);
-    List<PermissionRule> overridden = relevant.getOverridden(permissionName);
-    Set<ProjectRef> allows = new HashSet<>();
-    Set<ProjectRef> blocks = new HashSet<>();
-    for (PermissionRule rule : access) {
-      if (rule.isBlock()) {
-        blocks.add(relevant.getRuleProps(rule));
-      } else if (rule.getForce()) {
-        allows.add(relevant.getRuleProps(rule));
-      }
-    }
-    for (PermissionRule rule : overridden) {
-      if (rule.getForce()) {
-        blocks.remove(relevant.getRuleProps(rule));
-      }
-    }
-    blocks.removeAll(allows);
-    return !blocks.isEmpty();
-  }
-
-  /** Rules for the given permission, or the empty list. */
-  private List<PermissionRule> access(String permissionName) {
-    return access(permissionName, false);
-  }
-
-  /** Rules for the given permission, or the empty list. */
-  private List<PermissionRule> access(String permissionName, boolean isChangeOwner) {
-    List<PermissionRule> rules = effective.get(permissionName);
-    if (rules != null) {
-      return rules;
-    }
-
-    rules = relevant.getPermission(permissionName);
-
-    List<PermissionRule> mine = new ArrayList<>(rules.size());
-    for (PermissionRule rule : rules) {
-      if (projectControl.match(rule, isChangeOwner)) {
-        mine.add(rule);
-      }
-    }
-
-    if (mine.isEmpty()) {
-      mine = Collections.emptyList();
-    }
-    effective.put(permissionName, mine);
-    return mine;
-  }
-
-  ForRef asForRef() {
-    return new ForRefImpl();
-  }
-
-  private class ForRefImpl extends ForRef {
-    @Override
-    public ForRef user(CurrentUser user) {
-      return forUser(user).asForRef().database(db);
-    }
-
-    @Override
-    public ForChange change(ChangeData cd) {
-      try {
-        // TODO(hiesel) Force callers to call database() and use db instead of cd.db()
-        return getProjectControl()
-            .controlFor(cd.db(), cd.change())
-            .asForChange(cd, Providers.of(cd.db()));
-      } catch (OrmException e) {
-        return FailedPermissionBackend.change("unavailable", e);
-      }
-    }
-
-    @Override
-    public ForChange change(ChangeNotes notes) {
-      Project.NameKey project = getProjectControl().getProject().getNameKey();
-      Change change = notes.getChange();
-      checkArgument(
-          project.equals(change.getProject()),
-          "expected change in project %s, not %s",
-          project,
-          change.getProject());
-      return getProjectControl().controlFor(notes).asForChange(null, db);
-    }
-
-    @Override
-    public ForChange indexedChange(ChangeData cd, ChangeNotes notes) {
-      return getProjectControl().controlFor(notes).asForChange(cd, db);
-    }
-
-    @Override
-    public void check(RefPermission perm) throws AuthException, PermissionBackendException {
-      if (!can(perm)) {
-        throw new AuthException(perm.describeForException() + " not permitted for " + getRefName());
-      }
-    }
-
-    @Override
-    public Set<RefPermission> test(Collection<RefPermission> permSet)
-        throws PermissionBackendException {
-      EnumSet<RefPermission> ok = EnumSet.noneOf(RefPermission.class);
-      for (RefPermission perm : permSet) {
-        if (can(perm)) {
-          ok.add(perm);
-        }
-      }
-      return ok;
-    }
-
-    private boolean can(RefPermission perm) throws PermissionBackendException {
-      switch (perm) {
-        case READ:
-          return isVisible();
-        case CREATE:
-          // TODO This isn't an accurate test.
-          return canPerform(perm.permissionName().get());
-        case DELETE:
-          return canDelete();
-        case UPDATE:
-          return canUpdate();
-        case FORCE_UPDATE:
-          return canForceUpdate();
-
-        case FORGE_AUTHOR:
-          return canForgeAuthor();
-        case FORGE_COMMITTER:
-          return canForgeCommitter();
-        case FORGE_SERVER:
-          return canForgeGerritServerIdentity();
-        case MERGE:
-          return canUploadMerges();
-
-        case CREATE_CHANGE:
-          return canUpload();
-
-        case UPDATE_BY_SUBMIT:
-          return projectControl.controlForRef("refs/for/" + getRefName()).canSubmit(true);
-
-        case SKIP_VALIDATION:
-          return canForgeAuthor()
-              && canForgeCommitter()
-              && canForgeGerritServerIdentity()
-              && canUploadMerges()
-              && !projectControl.getProjectState().isUseSignedOffBy();
-      }
-      throw new PermissionBackendException(perm + " unsupported");
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefPatternMatcher.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/RefPatternMatcher.java
deleted file mode 100644
index 63da731..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefPatternMatcher.java
+++ /dev/null
@@ -1,172 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.project;
-
-import static com.google.gerrit.server.project.RefPattern.isRE;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.common.data.ParameterizedString;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.CurrentUser;
-import dk.brics.automaton.Automaton;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Pattern;
-
-public abstract class RefPatternMatcher {
-  public static RefPatternMatcher getMatcher(String pattern) {
-    if (pattern.contains("${")) {
-      return new ExpandParameters(pattern);
-    } else if (isRE(pattern)) {
-      return new Regexp(pattern);
-    } else if (pattern.endsWith("/*")) {
-      return new Prefix(pattern.substring(0, pattern.length() - 1));
-    } else {
-      return new Exact(pattern);
-    }
-  }
-
-  public abstract boolean match(String ref, CurrentUser user);
-
-  private static class Exact extends RefPatternMatcher {
-    private final String expect;
-
-    Exact(String name) {
-      expect = name;
-    }
-
-    @Override
-    public boolean match(String ref, CurrentUser user) {
-      return expect.equals(ref);
-    }
-  }
-
-  private static class Prefix extends RefPatternMatcher {
-    private final String prefix;
-
-    Prefix(String pfx) {
-      prefix = pfx;
-    }
-
-    @Override
-    public boolean match(String ref, CurrentUser user) {
-      return ref.startsWith(prefix);
-    }
-  }
-
-  private static class Regexp extends RefPatternMatcher {
-    private final Pattern pattern;
-
-    Regexp(String re) {
-      pattern = Pattern.compile(re);
-    }
-
-    @Override
-    public boolean match(String ref, CurrentUser user) {
-      return pattern.matcher(ref).matches();
-    }
-  }
-
-  static class ExpandParameters extends RefPatternMatcher {
-    private final ParameterizedString template;
-    private final String prefix;
-
-    ExpandParameters(String pattern) {
-      template = new ParameterizedString(pattern);
-
-      if (isRE(pattern)) {
-        // Replace ${username} and ${shardeduserid} with ":PLACEHOLDER:"
-        // as : is not legal in a reference and the string :PLACEHOLDER:
-        // is not likely to be a valid part of the regex. This later
-        // allows the pattern prefix to be clipped, saving time on
-        // evaluation.
-        String replacement = ":PLACEHOLDER:";
-        Map<String, String> params =
-            ImmutableMap.of(
-                RefPattern.USERID_SHARDED, replacement,
-                RefPattern.USERNAME, replacement);
-        Automaton am = RefPattern.toRegExp(template.replace(params)).toAutomaton();
-        String rePrefix = am.getCommonPrefix();
-        prefix = rePrefix.substring(0, rePrefix.indexOf(replacement));
-      } else {
-        prefix = pattern.substring(0, pattern.indexOf("${"));
-      }
-    }
-
-    @Override
-    public boolean match(String ref, CurrentUser user) {
-      if (!ref.startsWith(prefix)) {
-        return false;
-      }
-
-      for (String username : getUsernames(user)) {
-        String u;
-        if (isRE(template.getPattern())) {
-          u = Pattern.quote(username);
-        } else {
-          u = username;
-        }
-
-        Account.Id accountId = user.isIdentifiedUser() ? user.getAccountId() : null;
-        RefPatternMatcher next = getMatcher(expand(template, u, accountId));
-        if (next != null && next.match(expand(ref, u, accountId), user)) {
-          return true;
-        }
-      }
-      return false;
-    }
-
-    private Iterable<String> getUsernames(CurrentUser user) {
-      if (user.isIdentifiedUser()) {
-        Set<String> emails = user.asIdentifiedUser().getEmailAddresses();
-        if (user.getUserName() == null) {
-          return emails;
-        } else if (emails.isEmpty()) {
-          return ImmutableSet.of(user.getUserName());
-        }
-        return Iterables.concat(emails, ImmutableSet.of(user.getUserName()));
-      }
-      if (user.getUserName() != null) {
-        return ImmutableSet.of(user.getUserName());
-      }
-      return ImmutableSet.of();
-    }
-
-    boolean matchPrefix(String ref) {
-      return ref.startsWith(prefix);
-    }
-
-    private String expand(String parameterizedRef, String userName, Account.Id accountId) {
-      if (parameterizedRef.contains("${")) {
-        return expand(new ParameterizedString(parameterizedRef), userName, accountId);
-      }
-      return parameterizedRef;
-    }
-
-    private String expand(
-        ParameterizedString parameterizedRef, String userName, Account.Id accountId) {
-      Map<String, String> params = new HashMap<>();
-      params.put(RefPattern.USERNAME, userName);
-      if (accountId != null) {
-        params.put(RefPattern.USERID_SHARDED, RefNames.shard(accountId.get()));
-      }
-      return parameterizedRef.replace(params);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/RefResource.java
deleted file mode 100644
index 124439f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefResource.java
+++ /dev/null
@@ -1,28 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.project;
-
-public abstract class RefResource extends ProjectResource {
-
-  public RefResource(ProjectControl control) {
-    super(control);
-  }
-
-  /** @return the ref's name */
-  public abstract String getRef();
-
-  /** @return the ref's revision */
-  public abstract String getRevision();
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/RefUtil.java
deleted file mode 100644
index 8a7e5f1..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefUtil.java
+++ /dev/null
@@ -1,132 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.project;
-
-import static org.eclipse.jgit.lib.Constants.R_REFS;
-import static org.eclipse.jgit.lib.Constants.R_TAGS;
-
-import com.google.common.collect.Iterables;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import java.io.IOException;
-import java.util.Collections;
-import org.eclipse.jgit.errors.IncorrectObjectTypeException;
-import org.eclipse.jgit.errors.MissingObjectException;
-import org.eclipse.jgit.errors.RevisionSyntaxException;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.RefDatabase;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.ObjectWalk;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class RefUtil {
-  private static final Logger log = LoggerFactory.getLogger(RefUtil.class);
-
-  public static ObjectId parseBaseRevision(
-      Repository repo, Project.NameKey projectName, String baseRevision)
-      throws InvalidRevisionException {
-    try {
-      ObjectId revid = repo.resolve(baseRevision);
-      if (revid == null) {
-        throw new InvalidRevisionException();
-      }
-      return revid;
-    } catch (IOException err) {
-      log.error(
-          "Cannot resolve \"" + baseRevision + "\" in project \"" + projectName.get() + "\"", err);
-      throw new InvalidRevisionException();
-    } catch (RevisionSyntaxException err) {
-      log.error("Invalid revision syntax \"" + baseRevision + "\"", err);
-      throw new InvalidRevisionException();
-    }
-  }
-
-  public static RevWalk verifyConnected(Repository repo, ObjectId revid)
-      throws InvalidRevisionException {
-    try {
-      ObjectWalk rw = new ObjectWalk(repo);
-      try {
-        rw.markStart(rw.parseCommit(revid));
-      } catch (IncorrectObjectTypeException err) {
-        throw new InvalidRevisionException();
-      }
-      RefDatabase refDb = repo.getRefDatabase();
-      Iterable<Ref> refs =
-          Iterables.concat(
-              refDb.getRefs(Constants.R_HEADS).values(), refDb.getRefs(Constants.R_TAGS).values());
-      Ref rc = refDb.exactRef(RefNames.REFS_CONFIG);
-      if (rc != null) {
-        refs = Iterables.concat(refs, Collections.singleton(rc));
-      }
-      for (Ref r : refs) {
-        try {
-          rw.markUninteresting(rw.parseAny(r.getObjectId()));
-        } catch (MissingObjectException err) {
-          continue;
-        }
-      }
-      rw.checkConnectivity();
-      return rw;
-    } catch (IncorrectObjectTypeException | MissingObjectException err) {
-      throw new InvalidRevisionException();
-    } catch (IOException err) {
-      log.error(
-          "Repository \"" + repo.getDirectory() + "\" may be corrupt; suggest running git fsck",
-          err);
-      throw new InvalidRevisionException();
-    }
-  }
-
-  public static String getRefPrefix(String refName) {
-    int i = refName.lastIndexOf('/');
-    if (i > Constants.R_HEADS.length() - 1) {
-      return refName.substring(0, i);
-    }
-    return Constants.R_HEADS;
-  }
-
-  public static String normalizeTagRef(String tag) throws BadRequestException {
-    String result = tag;
-    while (result.startsWith("/")) {
-      result = result.substring(1);
-    }
-    if (result.startsWith(R_REFS) && !result.startsWith(R_TAGS)) {
-      throw new BadRequestException("invalid tag name \"" + result + "\"");
-    }
-    if (!result.startsWith(R_TAGS)) {
-      result = R_TAGS + result;
-    }
-    if (!Repository.isValidRefName(result)) {
-      throw new BadRequestException("invalid tag name \"" + result + "\"");
-    }
-    return result;
-  }
-
-  /** Error indicating the revision is invalid as supplied. */
-  static class InvalidRevisionException extends Exception {
-    private static final long serialVersionUID = 1L;
-
-    public static final String MESSAGE = "Invalid Revision";
-
-    InvalidRevisionException() {
-      super(MESSAGE);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/RemoveReviewerControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/RemoveReviewerControl.java
deleted file mode 100644
index d4c0f53..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/RemoveReviewerControl.java
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-
-@Singleton
-public class RemoveReviewerControl {
-  private final PermissionBackend permissionBackend;
-  private final Provider<ReviewDb> dbProvider;
-  private final ProjectControl.GenericFactory projectControlFactory;
-
-  @Inject
-  RemoveReviewerControl(
-      PermissionBackend permissionBackend,
-      Provider<ReviewDb> dbProvider,
-      ProjectControl.GenericFactory projectControlFactory) {
-    this.permissionBackend = permissionBackend;
-    this.dbProvider = dbProvider;
-    this.projectControlFactory = projectControlFactory;
-  }
-
-  /**
-   * Checks if removing the given reviewer and patch set approval is OK.
-   *
-   * @throws AuthException if this user is not allowed to remove this approval.
-   */
-  public void checkRemoveReviewer(
-      ChangeNotes notes, CurrentUser currentUser, PatchSetApproval approval)
-      throws PermissionBackendException, AuthException, NoSuchProjectException, IOException {
-    checkRemoveReviewer(notes, currentUser, approval.getAccountId(), approval.getValue());
-  }
-
-  /**
-   * Checks if removing the given reviewer is OK. Does not check if removing any approvals the
-   * reviewer might have given is OK.
-   *
-   * @throws AuthException if this user is not allowed to remove this approval.
-   */
-  public void checkRemoveReviewer(ChangeNotes notes, CurrentUser currentUser, Account.Id reviewer)
-      throws PermissionBackendException, AuthException, NoSuchProjectException, IOException {
-    checkRemoveReviewer(notes, currentUser, reviewer, 0);
-  }
-
-  /** @return true if the user is allowed to remove this reviewer. */
-  public boolean testRemoveReviewer(
-      ChangeData cd, CurrentUser currentUser, Account.Id reviewer, int value)
-      throws PermissionBackendException, NoSuchProjectException, OrmException, IOException {
-    if (canRemoveReviewerWithoutPermissionCheck(cd.change(), currentUser, reviewer, value)) {
-      return true;
-    }
-    return permissionBackend
-        .user(currentUser)
-        .change(cd)
-        .database(dbProvider)
-        .test(ChangePermission.REMOVE_REVIEWER);
-  }
-
-  private void checkRemoveReviewer(
-      ChangeNotes notes, CurrentUser currentUser, Account.Id reviewer, int val)
-      throws PermissionBackendException, NoSuchProjectException, AuthException, IOException {
-    if (canRemoveReviewerWithoutPermissionCheck(notes.getChange(), currentUser, reviewer, val)) {
-      return;
-    }
-
-    permissionBackend
-        .user(currentUser)
-        .change(notes)
-        .database(dbProvider)
-        .check(ChangePermission.REMOVE_REVIEWER);
-  }
-
-  private boolean canRemoveReviewerWithoutPermissionCheck(
-      Change change, CurrentUser currentUser, Account.Id reviewer, int value)
-      throws NoSuchProjectException, IOException {
-    if (change.getStatus().equals(Change.Status.MERGED)) {
-      return false;
-    }
-
-    if (currentUser.isIdentifiedUser()) {
-      Account.Id aId = currentUser.getAccountId();
-      if (aId.equals(reviewer)) {
-        return true; // A user can always remove themselves.
-      } else if (aId.equals(change.getOwner()) && 0 <= value) {
-        return true; // The change owner may remove any zero or positive score.
-      }
-    }
-
-    // Users with the remove reviewer permission, the branch owner, project
-    // owner and site admin can remove anyone
-    ProjectControl ctl = projectControlFactory.controlFor(change.getProject(), currentUser);
-    if (ctl.controlForRef(change.getDest()).isOwner() // branch owner
-        || ctl.isOwner() // project owner
-        || ctl.isAdmin()) { // project admin
-      return true;
-    }
-    return false;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/RepositoryStatistics.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/RepositoryStatistics.java
deleted file mode 100644
index 3cb4bac..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/RepositoryStatistics.java
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.project;
-
-import com.google.common.base.CaseFormat;
-import java.util.Map.Entry;
-import java.util.Properties;
-import java.util.TreeMap;
-
-class RepositoryStatistics extends TreeMap<String, Object> {
-  private static final long serialVersionUID = 1L;
-
-  RepositoryStatistics(Properties p) {
-    for (Entry<Object, Object> e : p.entrySet()) {
-      put(
-          CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, e.getKey().toString()),
-          e.getValue());
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/RuleEvalException.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/RuleEvalException.java
deleted file mode 100644
index d2af2a3..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/RuleEvalException.java
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.project;
-
-public class RuleEvalException extends Exception {
-  private static final long serialVersionUID = 1L;
-
-  public RuleEvalException(String message) {
-    super(message);
-  }
-
-  RuleEvalException(String message, Throwable cause) {
-    super(message, cause);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SectionMatcher.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SectionMatcher.java
deleted file mode 100644
index 65b17bb..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SectionMatcher.java
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.server.project;
-
-import com.google.gerrit.common.data.AccessSection;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.CurrentUser;
-
-/**
- * Matches an AccessSection against a reference name.
- *
- * <p>These matchers are "compiled" versions of the AccessSection name, supporting faster selection
- * of which sections are relevant to any given input reference.
- */
-class SectionMatcher extends RefPatternMatcher {
-  static SectionMatcher wrap(Project.NameKey project, AccessSection section) {
-    String ref = section.getName();
-    if (AccessSection.isValid(ref)) {
-      return new SectionMatcher(project, section, getMatcher(ref));
-    }
-    return null;
-  }
-
-  final Project.NameKey project;
-  final AccessSection section;
-  final RefPatternMatcher matcher;
-
-  SectionMatcher(Project.NameKey project, AccessSection section, RefPatternMatcher matcher) {
-    this.project = project;
-    this.section = section;
-    this.matcher = matcher;
-  }
-
-  @Override
-  public boolean match(String ref, CurrentUser user) {
-    return this.matcher.match(ref, user);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SectionSortCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SectionSortCache.java
deleted file mode 100644
index a02941e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SectionSortCache.java
+++ /dev/null
@@ -1,156 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.server.project;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.cache.Cache;
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.common.data.AccessSection;
-import com.google.gerrit.server.cache.CacheModule;
-import com.google.gerrit.server.util.MostSpecificComparator;
-import com.google.inject.Inject;
-import com.google.inject.Module;
-import com.google.inject.Singleton;
-import com.google.inject.name.Named;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.IdentityHashMap;
-import java.util.List;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Caches the order AccessSections should be sorted for evaluation. */
-@Singleton
-public class SectionSortCache {
-  private static final Logger log = LoggerFactory.getLogger(SectionSortCache.class);
-
-  private static final String CACHE_NAME = "permission_sort";
-
-  public static Module module() {
-    return new CacheModule() {
-      @Override
-      protected void configure() {
-        cache(CACHE_NAME, EntryKey.class, EntryVal.class);
-        bind(SectionSortCache.class);
-      }
-    };
-  }
-
-  private final Cache<EntryKey, EntryVal> cache;
-
-  @Inject
-  SectionSortCache(@Named(CACHE_NAME) Cache<EntryKey, EntryVal> cache) {
-    this.cache = cache;
-  }
-
-  void sort(String ref, List<AccessSection> sections) {
-    final int cnt = sections.size();
-    if (cnt <= 1) {
-      return;
-    }
-
-    EntryKey key = EntryKey.create(ref, sections);
-    EntryVal val = cache.getIfPresent(key);
-    if (val != null) {
-      int[] srcIdx = val.order;
-      if (srcIdx != null) {
-        AccessSection[] srcList = copy(sections);
-        for (int i = 0; i < cnt; i++) {
-          sections.set(i, srcList[srcIdx[i]]);
-        }
-      } else {
-        // Identity transform. No sorting is required.
-      }
-
-    } else {
-      boolean poison = false;
-      IdentityHashMap<AccessSection, Integer> srcMap = new IdentityHashMap<>();
-      for (int i = 0; i < cnt; i++) {
-        poison |= srcMap.put(sections.get(i), i) != null;
-      }
-
-      Collections.sort(sections, new MostSpecificComparator(ref));
-
-      int[] srcIdx;
-      if (isIdentityTransform(sections, srcMap)) {
-        srcIdx = null;
-      } else {
-        srcIdx = new int[cnt];
-        for (int i = 0; i < cnt; i++) {
-          srcIdx[i] = srcMap.get(sections.get(i));
-        }
-      }
-
-      if (poison) {
-        log.error("Received duplicate AccessSection instances, not caching sort");
-      } else {
-        cache.put(key, new EntryVal(srcIdx));
-      }
-    }
-  }
-
-  private static AccessSection[] copy(List<AccessSection> sections) {
-    return sections.toArray(new AccessSection[sections.size()]);
-  }
-
-  private static boolean isIdentityTransform(
-      List<AccessSection> sections, IdentityHashMap<AccessSection, Integer> srcMap) {
-    for (int i = 0; i < sections.size(); i++) {
-      if (i != srcMap.get(sections.get(i))) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  @AutoValue
-  abstract static class EntryKey {
-    public abstract String ref();
-
-    public abstract List<String> patterns();
-
-    public abstract int cachedHashCode();
-
-    static EntryKey create(String refName, List<AccessSection> sections) {
-      int hc = refName.hashCode();
-      List<String> patterns = new ArrayList<>(sections.size());
-      for (AccessSection s : sections) {
-        String n = s.getName();
-        patterns.add(n);
-        hc = hc * 31 + n.hashCode();
-      }
-      return new AutoValue_SectionSortCache_EntryKey(refName, ImmutableList.copyOf(patterns), hc);
-    }
-
-    @Override
-    public int hashCode() {
-      return cachedHashCode();
-    }
-  }
-
-  static final class EntryVal {
-    /**
-     * Maps the input index to the output index.
-     *
-     * <p>For {@code x == order[y]} the expression means move the item at source position {@code x}
-     * to the output position {@code y}.
-     */
-    final int[] order;
-
-    EntryVal(int[] order) {
-      this.order = order;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetAccess.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SetAccess.java
deleted file mode 100644
index e875388..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetAccess.java
+++ /dev/null
@@ -1,131 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.project;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.common.data.AccessSection;
-import com.google.gerrit.common.errors.InvalidNameException;
-import com.google.gerrit.extensions.api.access.ProjectAccessInfo;
-import com.google.gerrit.extensions.api.access.ProjectAccessInput;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.List;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-@Singleton
-public class SetAccess implements RestModifyView<ProjectResource, ProjectAccessInput> {
-  protected final GroupBackend groupBackend;
-  private final PermissionBackend permissionBackend;
-  private final Provider<MetaDataUpdate.User> metaDataUpdateFactory;
-  private final GetAccess getAccess;
-  private final ProjectCache projectCache;
-  private final Provider<IdentifiedUser> identifiedUser;
-  private final SetAccessUtil accessUtil;
-
-  @Inject
-  private SetAccess(
-      GroupBackend groupBackend,
-      PermissionBackend permissionBackend,
-      Provider<MetaDataUpdate.User> metaDataUpdateFactory,
-      ProjectCache projectCache,
-      GetAccess getAccess,
-      Provider<IdentifiedUser> identifiedUser,
-      SetAccessUtil accessUtil) {
-    this.groupBackend = groupBackend;
-    this.permissionBackend = permissionBackend;
-    this.metaDataUpdateFactory = metaDataUpdateFactory;
-    this.getAccess = getAccess;
-    this.projectCache = projectCache;
-    this.identifiedUser = identifiedUser;
-    this.accessUtil = accessUtil;
-  }
-
-  @Override
-  public ProjectAccessInfo apply(ProjectResource rsrc, ProjectAccessInput input)
-      throws ResourceNotFoundException, ResourceConflictException, IOException, AuthException,
-          BadRequestException, UnprocessableEntityException, OrmException,
-          PermissionBackendException {
-    MetaDataUpdate.User metaDataUpdateUser = metaDataUpdateFactory.get();
-
-    ProjectConfig config;
-
-    List<AccessSection> removals = accessUtil.getAccessSections(input.remove);
-    List<AccessSection> additions = accessUtil.getAccessSections(input.add);
-    try (MetaDataUpdate md = metaDataUpdateUser.create(rsrc.getNameKey())) {
-      config = ProjectConfig.read(md);
-
-      // Check that the user has the right permissions.
-      boolean checkedAdmin = false;
-      for (AccessSection section : Iterables.concat(additions, removals)) {
-        boolean isGlobalCapabilities = AccessSection.GLOBAL_CAPABILITIES.equals(section.getName());
-        if (isGlobalCapabilities) {
-          if (!checkedAdmin) {
-            permissionBackend.user(identifiedUser).check(GlobalPermission.ADMINISTRATE_SERVER);
-            checkedAdmin = true;
-          }
-        } else if (!rsrc.getControl().controlForRef(section.getName()).isOwner()) {
-          throw new AuthException(
-              "You are not allowed to edit permissions for ref: " + section.getName());
-        }
-      }
-
-      accessUtil.validateChanges(config, removals, additions);
-      accessUtil.applyChanges(config, removals, additions);
-
-      accessUtil.setParentName(
-          identifiedUser.get(),
-          config,
-          rsrc.getNameKey(),
-          input.parent == null ? null : new Project.NameKey(input.parent),
-          !checkedAdmin);
-
-      if (!Strings.isNullOrEmpty(input.message)) {
-        if (!input.message.endsWith("\n")) {
-          input.message += "\n";
-        }
-        md.setMessage(input.message);
-      } else {
-        md.setMessage("Modify access rules\n");
-      }
-
-      config.commit(md);
-      projectCache.evict(config.getProject());
-    } catch (InvalidNameException e) {
-      throw new BadRequestException(e.toString());
-    } catch (ConfigInvalidException e) {
-      throw new ResourceConflictException(rsrc.getName());
-    }
-
-    return getAccess.apply(rsrc.getNameKey());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetAccessUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SetAccessUtil.java
deleted file mode 100644
index b14008d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetAccessUtil.java
+++ /dev/null
@@ -1,226 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.project;
-
-import com.google.common.collect.Iterables;
-import com.google.gerrit.common.data.AccessSection;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.common.data.PermissionRule;
-import com.google.gerrit.common.errors.InvalidNameException;
-import com.google.gerrit.extensions.api.access.AccessSectionInfo;
-import com.google.gerrit.extensions.api.access.PermissionInfo;
-import com.google.gerrit.extensions.api.access.PermissionRuleInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.group.GroupsCollection;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-@Singleton
-public class SetAccessUtil {
-  private final GroupsCollection groupsCollection;
-  private final AllProjectsName allProjects;
-  private final Provider<SetParent> setParent;
-
-  @Inject
-  private SetAccessUtil(
-      GroupsCollection groupsCollection,
-      AllProjectsName allProjects,
-      Provider<SetParent> setParent) {
-    this.groupsCollection = groupsCollection;
-    this.allProjects = allProjects;
-    this.setParent = setParent;
-  }
-
-  List<AccessSection> getAccessSections(Map<String, AccessSectionInfo> sectionInfos)
-      throws UnprocessableEntityException {
-    if (sectionInfos == null) {
-      return Collections.emptyList();
-    }
-
-    List<AccessSection> sections = new ArrayList<>(sectionInfos.size());
-    for (Map.Entry<String, AccessSectionInfo> entry : sectionInfos.entrySet()) {
-      if (entry.getValue().permissions == null) {
-        continue;
-      }
-
-      AccessSection accessSection = new AccessSection(entry.getKey());
-      for (Map.Entry<String, PermissionInfo> permissionEntry :
-          entry.getValue().permissions.entrySet()) {
-        if (permissionEntry.getValue().rules == null) {
-          continue;
-        }
-
-        Permission p = new Permission(permissionEntry.getKey());
-        if (permissionEntry.getValue().exclusive != null) {
-          p.setExclusiveGroup(permissionEntry.getValue().exclusive);
-        }
-
-        for (Map.Entry<String, PermissionRuleInfo> permissionRuleInfoEntry :
-            permissionEntry.getValue().rules.entrySet()) {
-          GroupDescription.Basic group = groupsCollection.parseId(permissionRuleInfoEntry.getKey());
-          if (group == null) {
-            throw new UnprocessableEntityException(
-                permissionRuleInfoEntry.getKey() + " is not a valid group ID");
-          }
-
-          PermissionRuleInfo pri = permissionRuleInfoEntry.getValue();
-          PermissionRule r = new PermissionRule(GroupReference.forGroup(group));
-          if (pri != null) {
-            if (pri.max != null) {
-              r.setMax(pri.max);
-            }
-            if (pri.min != null) {
-              r.setMin(pri.min);
-            }
-            if (pri.action != null) {
-              r.setAction(GetAccess.ACTION_TYPE.inverse().get(pri.action));
-            }
-            if (pri.force != null) {
-              r.setForce(pri.force);
-            }
-          }
-          p.add(r);
-        }
-        accessSection.getPermissions().add(p);
-      }
-      sections.add(accessSection);
-    }
-    return sections;
-  }
-
-  /**
-   * Checks that the removals and additions are logically valid, but doesn't check current user's
-   * permission.
-   */
-  void validateChanges(
-      ProjectConfig config, List<AccessSection> removals, List<AccessSection> additions)
-      throws BadRequestException, InvalidNameException {
-    // Perform permission checks
-    for (AccessSection section : Iterables.concat(additions, removals)) {
-      boolean isGlobalCapabilities = AccessSection.GLOBAL_CAPABILITIES.equals(section.getName());
-      if (isGlobalCapabilities) {
-        if (!allProjects.equals(config.getName())) {
-          throw new BadRequestException(
-              "Cannot edit global capabilities for projects other than " + allProjects.get());
-        }
-      }
-    }
-
-    // Perform addition checks
-    for (AccessSection section : additions) {
-      String name = section.getName();
-      boolean isGlobalCapabilities = AccessSection.GLOBAL_CAPABILITIES.equals(name);
-
-      if (!isGlobalCapabilities) {
-        if (!AccessSection.isValid(name)) {
-          throw new BadRequestException("invalid section name");
-        }
-        RefPattern.validate(name);
-      } else {
-        // Check all permissions for soundness
-        for (Permission p : section.getPermissions()) {
-          if (!GlobalCapability.isCapability(p.getName())) {
-            throw new BadRequestException(
-                "Cannot add non-global capability " + p.getName() + " to global capabilities");
-          }
-        }
-      }
-    }
-  }
-
-  void applyChanges(
-      ProjectConfig config, List<AccessSection> removals, List<AccessSection> additions) {
-    // Apply removals
-    for (AccessSection section : removals) {
-      if (section.getPermissions().isEmpty()) {
-        // Remove entire section
-        config.remove(config.getAccessSection(section.getName()));
-        continue;
-      }
-
-      // Remove specific permissions
-      for (Permission p : section.getPermissions()) {
-        if (p.getRules().isEmpty()) {
-          config.remove(config.getAccessSection(section.getName()), p);
-        } else {
-          for (PermissionRule r : p.getRules()) {
-            config.remove(config.getAccessSection(section.getName()), p, r);
-          }
-        }
-      }
-    }
-
-    // Apply additions
-    for (AccessSection section : additions) {
-      AccessSection currentAccessSection = config.getAccessSection(section.getName());
-
-      if (currentAccessSection == null) {
-        // Add AccessSection
-        config.replace(section);
-      } else {
-        for (Permission p : section.getPermissions()) {
-          Permission currentPermission = currentAccessSection.getPermission(p.getName());
-          if (currentPermission == null) {
-            // Add Permission
-            currentAccessSection.addPermission(p);
-          } else {
-            for (PermissionRule r : p.getRules()) {
-              // AddPermissionRule
-              currentPermission.add(r);
-            }
-          }
-        }
-      }
-    }
-  }
-
-  void setParentName(
-      IdentifiedUser identifiedUser,
-      ProjectConfig config,
-      Project.NameKey projectName,
-      Project.NameKey newParentProjectName,
-      boolean checkAdmin)
-      throws ResourceConflictException, AuthException, PermissionBackendException {
-    if (newParentProjectName != null
-        && !config.getProject().getNameKey().equals(allProjects)
-        && !config.getProject().getParent(allProjects).equals(newParentProjectName)) {
-      try {
-        setParent
-            .get()
-            .validateParentUpdate(
-                projectName, identifiedUser, newParentProjectName.get(), checkAdmin);
-      } catch (UnprocessableEntityException e) {
-        throw new ResourceConflictException(e.getMessage(), e);
-      }
-      config.getProject().setParentName(newParentProjectName);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetDashboard.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SetDashboard.java
deleted file mode 100644
index 21ec077..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetDashboard.java
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.api.projects.DashboardInfo;
-import com.google.gerrit.extensions.common.SetDashboardInput;
-import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-
-@Singleton
-public class SetDashboard implements RestModifyView<DashboardResource, SetDashboardInput> {
-  private final Provider<SetDefaultDashboard> defaultSetter;
-
-  @Inject
-  SetDashboard(Provider<SetDefaultDashboard> defaultSetter) {
-    this.defaultSetter = defaultSetter;
-  }
-
-  @Override
-  public Response<DashboardInfo> apply(DashboardResource resource, SetDashboardInput input)
-      throws RestApiException, IOException, PermissionBackendException {
-    if (resource.isProjectDefault()) {
-      return defaultSetter.get().apply(resource, input);
-    }
-
-    // TODO: Implement creation/update of dashboards by API.
-    throw new MethodNotAllowedException();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetDefaultDashboard.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SetDefaultDashboard.java
deleted file mode 100644
index 9aa9ae7..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetDefaultDashboard.java
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.project;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Strings;
-import com.google.gerrit.extensions.api.projects.DashboardInfo;
-import com.google.gerrit.extensions.common.SetDashboardInput;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.kohsuke.args4j.Option;
-
-class SetDefaultDashboard implements RestModifyView<DashboardResource, SetDashboardInput> {
-  private final ProjectCache cache;
-  private final MetaDataUpdate.Server updateFactory;
-  private final DashboardsCollection dashboards;
-  private final Provider<GetDashboard> get;
-
-  @Option(name = "--inherited", usage = "set dashboard inherited by children")
-  private boolean inherited;
-
-  @Inject
-  SetDefaultDashboard(
-      ProjectCache cache,
-      MetaDataUpdate.Server updateFactory,
-      DashboardsCollection dashboards,
-      Provider<GetDashboard> get) {
-    this.cache = cache;
-    this.updateFactory = updateFactory;
-    this.dashboards = dashboards;
-    this.get = get;
-  }
-
-  @Override
-  public Response<DashboardInfo> apply(DashboardResource resource, SetDashboardInput input)
-      throws RestApiException, IOException, PermissionBackendException {
-    if (input == null) {
-      input = new SetDashboardInput(); // Delete would set input to null.
-    }
-    input.id = Strings.emptyToNull(input.id);
-
-    ProjectControl ctl = resource.getControl();
-    if (!ctl.isOwner()) {
-      throw new AuthException("not project owner");
-    }
-
-    DashboardResource target = null;
-    if (input.id != null) {
-      try {
-        target = dashboards.parse(new ProjectResource(ctl), IdString.fromUrl(input.id));
-      } catch (ResourceNotFoundException e) {
-        throw new BadRequestException("dashboard " + input.id + " not found");
-      } catch (ConfigInvalidException e) {
-        throw new ResourceConflictException(e.getMessage());
-      }
-    }
-
-    try (MetaDataUpdate md = updateFactory.create(ctl.getProject().getNameKey())) {
-      ProjectConfig config = ProjectConfig.read(md);
-      Project project = config.getProject();
-      if (inherited) {
-        project.setDefaultDashboard(input.id);
-      } else {
-        project.setLocalDefaultDashboard(input.id);
-      }
-
-      String msg =
-          MoreObjects.firstNonNull(
-              Strings.emptyToNull(input.commitMessage),
-              input.id == null
-                  ? "Removed default dashboard.\n"
-                  : String.format("Changed default dashboard to %s.\n", input.id));
-      if (!msg.endsWith("\n")) {
-        msg += "\n";
-      }
-      md.setAuthor(ctl.getUser().asIdentifiedUser());
-      md.setMessage(msg);
-      config.commit(md);
-      cache.evict(ctl.getProject());
-
-      if (target != null) {
-        DashboardInfo info = get.get().apply(target);
-        info.isDefault = true;
-        return Response.ok(info);
-      }
-      return Response.none();
-    } catch (RepositoryNotFoundException notFound) {
-      throw new ResourceNotFoundException(ctl.getProject().getName());
-    } catch (ConfigInvalidException e) {
-      throw new ResourceConflictException(
-          String.format("invalid project.config: %s", e.getMessage()));
-    }
-  }
-
-  static class CreateDefault implements RestModifyView<ProjectResource, SetDashboardInput> {
-    private final Provider<SetDefaultDashboard> setDefault;
-
-    @Option(name = "--inherited", usage = "set dashboard inherited by children")
-    private boolean inherited;
-
-    @Inject
-    CreateDefault(Provider<SetDefaultDashboard> setDefault) {
-      this.setDefault = setDefault;
-    }
-
-    @Override
-    public Response<DashboardInfo> apply(ProjectResource resource, SetDashboardInput input)
-        throws RestApiException, IOException, PermissionBackendException {
-      SetDefaultDashboard set = setDefault.get();
-      set.inherited = inherited;
-      return set.apply(DashboardResource.projectDefault(resource.getControl()), input);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetHead.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SetHead.java
deleted file mode 100644
index eeb47df..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetHead.java
+++ /dev/null
@@ -1,157 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.project;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.extensions.events.HeadUpdatedListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.DefaultInput;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.extensions.events.AbstractNoNotifyEvent;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.project.SetHead.Input;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.util.Map;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.Repository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class SetHead implements RestModifyView<ProjectResource, Input> {
-  private static final Logger log = LoggerFactory.getLogger(SetHead.class);
-
-  public static class Input {
-    @DefaultInput public String ref;
-  }
-
-  private final GitRepositoryManager repoManager;
-  private final Provider<IdentifiedUser> identifiedUser;
-  private final DynamicSet<HeadUpdatedListener> headUpdatedListeners;
-
-  @Inject
-  SetHead(
-      GitRepositoryManager repoManager,
-      Provider<IdentifiedUser> identifiedUser,
-      DynamicSet<HeadUpdatedListener> headUpdatedListeners) {
-    this.repoManager = repoManager;
-    this.identifiedUser = identifiedUser;
-    this.headUpdatedListeners = headUpdatedListeners;
-  }
-
-  @Override
-  public String apply(ProjectResource rsrc, Input input)
-      throws AuthException, ResourceNotFoundException, BadRequestException,
-          UnprocessableEntityException, IOException {
-    if (!rsrc.getControl().isOwner()) {
-      throw new AuthException("restricted to project owner");
-    }
-    if (input == null || Strings.isNullOrEmpty(input.ref)) {
-      throw new BadRequestException("ref required");
-    }
-    String ref = RefNames.fullName(input.ref);
-
-    try (Repository repo = repoManager.openRepository(rsrc.getNameKey())) {
-      Map<String, Ref> cur = repo.getRefDatabase().exactRef(Constants.HEAD, ref);
-      if (!cur.containsKey(ref)) {
-        throw new UnprocessableEntityException(String.format("Ref Not Found: %s", ref));
-      }
-
-      final String oldHead = cur.get(Constants.HEAD).getTarget().getName();
-      final String newHead = ref;
-      if (!oldHead.equals(newHead)) {
-        final RefUpdate u = repo.updateRef(Constants.HEAD, true);
-        u.setRefLogIdent(identifiedUser.get().newRefLogIdent());
-        RefUpdate.Result res = u.link(newHead);
-        switch (res) {
-          case NO_CHANGE:
-          case RENAMED:
-          case FORCED:
-          case NEW:
-            break;
-          case FAST_FORWARD:
-          case IO_FAILURE:
-          case LOCK_FAILURE:
-          case NOT_ATTEMPTED:
-          case REJECTED:
-          case REJECTED_CURRENT_BRANCH:
-          case REJECTED_MISSING_OBJECT:
-          case REJECTED_OTHER_REASON:
-          default:
-            throw new IOException("Setting HEAD failed with " + res);
-        }
-
-        fire(rsrc.getNameKey(), oldHead, newHead);
-      }
-      return ref;
-    } catch (RepositoryNotFoundException e) {
-      throw new ResourceNotFoundException(rsrc.getName());
-    }
-  }
-
-  private void fire(Project.NameKey nameKey, String oldHead, String newHead) {
-    if (!headUpdatedListeners.iterator().hasNext()) {
-      return;
-    }
-    Event event = new Event(nameKey, oldHead, newHead);
-    for (HeadUpdatedListener l : headUpdatedListeners) {
-      try {
-        l.onHeadUpdated(event);
-      } catch (RuntimeException e) {
-        log.warn("Failure in HeadUpdatedListener", e);
-      }
-    }
-  }
-
-  static class Event extends AbstractNoNotifyEvent implements HeadUpdatedListener.Event {
-    private final Project.NameKey nameKey;
-    private final String oldHead;
-    private final String newHead;
-
-    Event(Project.NameKey nameKey, String oldHead, String newHead) {
-      this.nameKey = nameKey;
-      this.oldHead = oldHead;
-      this.newHead = newHead;
-    }
-
-    @Override
-    public String getProjectName() {
-      return nameKey.get();
-    }
-
-    @Override
-    public String getOldHeadName() {
-      return oldHead;
-    }
-
-    @Override
-    public String getNewHeadName() {
-      return newHead;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetParent.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SetParent.java
deleted file mode 100644
index 37cfcdd..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetParent.java
+++ /dev/null
@@ -1,138 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.project;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Strings;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.DefaultInput;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.SetParent.Input;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-
-@Singleton
-public class SetParent implements RestModifyView<ProjectResource, Input> {
-  public static class Input {
-    @DefaultInput public String parent;
-    public String commitMessage;
-  }
-
-  private final ProjectCache cache;
-  private final PermissionBackend permissionBackend;
-  private final MetaDataUpdate.Server updateFactory;
-  private final AllProjectsName allProjects;
-
-  @Inject
-  SetParent(
-      ProjectCache cache,
-      PermissionBackend permissionBackend,
-      MetaDataUpdate.Server updateFactory,
-      AllProjectsName allProjects) {
-    this.cache = cache;
-    this.permissionBackend = permissionBackend;
-    this.updateFactory = updateFactory;
-    this.allProjects = allProjects;
-  }
-
-  @Override
-  public String apply(ProjectResource rsrc, Input input)
-      throws AuthException, ResourceConflictException, ResourceNotFoundException,
-          UnprocessableEntityException, IOException, PermissionBackendException {
-    return apply(rsrc, input, true);
-  }
-
-  public String apply(ProjectResource rsrc, Input input, boolean checkIfAdmin)
-      throws AuthException, ResourceConflictException, ResourceNotFoundException,
-          UnprocessableEntityException, IOException, PermissionBackendException {
-    IdentifiedUser user = rsrc.getUser().asIdentifiedUser();
-    String parentName =
-        MoreObjects.firstNonNull(Strings.emptyToNull(input.parent), allProjects.get());
-    validateParentUpdate(rsrc.getProjectState().getNameKey(), user, parentName, checkIfAdmin);
-    try (MetaDataUpdate md = updateFactory.create(rsrc.getNameKey())) {
-      ProjectConfig config = ProjectConfig.read(md);
-      Project project = config.getProject();
-      project.setParentName(parentName);
-
-      String msg = Strings.emptyToNull(input.commitMessage);
-      if (msg == null) {
-        msg = String.format("Changed parent to %s.\n", parentName);
-      } else if (!msg.endsWith("\n")) {
-        msg += "\n";
-      }
-      md.setAuthor(user);
-      md.setMessage(msg);
-      config.commit(md);
-      cache.evict(rsrc.getProjectState().getProject());
-
-      Project.NameKey parent = project.getParent(allProjects);
-      checkNotNull(parent);
-      return parent.get();
-    } catch (RepositoryNotFoundException notFound) {
-      throw new ResourceNotFoundException(rsrc.getName());
-    } catch (ConfigInvalidException e) {
-      throw new ResourceConflictException(
-          String.format("invalid project.config: %s", e.getMessage()));
-    }
-  }
-
-  public void validateParentUpdate(
-      Project.NameKey project, IdentifiedUser user, String newParent, boolean checkIfAdmin)
-      throws AuthException, ResourceConflictException, UnprocessableEntityException,
-          PermissionBackendException {
-    if (checkIfAdmin) {
-      permissionBackend.user(user).check(GlobalPermission.ADMINISTRATE_SERVER);
-    }
-
-    if (project.equals(allProjects)) {
-      throw new ResourceConflictException("cannot set parent of " + allProjects.get());
-    }
-
-    newParent = Strings.emptyToNull(newParent);
-    if (newParent != null) {
-      ProjectState parent = cache.get(new Project.NameKey(newParent));
-      if (parent == null) {
-        throw new UnprocessableEntityException("parent project " + newParent + " not found");
-      }
-
-      if (Iterables.tryFind(
-              parent.tree(),
-              p -> {
-                return p.getNameKey().equals(project);
-              })
-          .isPresent()) {
-        throw new ResourceConflictException(
-            "cycle exists between " + project.get() + " and " + parent.getName());
-      }
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SubmitRuleEvaluator.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SubmitRuleEvaluator.java
deleted file mode 100644
index f501dd3..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SubmitRuleEvaluator.java
+++ /dev/null
@@ -1,673 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.project;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkState;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.data.SubmitRecord;
-import com.google.gerrit.common.data.SubmitTypeRecord;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.rules.PrologEnvironment;
-import com.google.gerrit.rules.StoredValues;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.Accounts;
-import com.google.gerrit.server.account.Emails;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import com.googlecode.prolog_cafe.exceptions.CompileException;
-import com.googlecode.prolog_cafe.exceptions.ReductionLimitException;
-import com.googlecode.prolog_cafe.lang.IntegerTerm;
-import com.googlecode.prolog_cafe.lang.ListTerm;
-import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.StructureTerm;
-import com.googlecode.prolog_cafe.lang.SymbolTerm;
-import com.googlecode.prolog_cafe.lang.Term;
-import com.googlecode.prolog_cafe.lang.VariableTerm;
-import java.io.IOException;
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Evaluates a submit-like Prolog rule found in the rules.pl file of the current project and filters
- * the results through rules found in the parent projects, all the way up to All-Projects.
- */
-public class SubmitRuleEvaluator {
-  private static final Logger log = LoggerFactory.getLogger(SubmitRuleEvaluator.class);
-
-  private static final String DEFAULT_MSG = "Error evaluating project rules, check server log";
-
-  public static List<SubmitRecord> defaultRuleError() {
-    return createRuleError(DEFAULT_MSG);
-  }
-
-  public static List<SubmitRecord> createRuleError(String err) {
-    SubmitRecord rec = new SubmitRecord();
-    rec.status = SubmitRecord.Status.RULE_ERROR;
-    rec.errorMessage = err;
-    return Collections.singletonList(rec);
-  }
-
-  public static SubmitTypeRecord defaultTypeError() {
-    return SubmitTypeRecord.error(DEFAULT_MSG);
-  }
-
-  /**
-   * Exception thrown when the label term of a submit record unexpectedly didn't contain a user
-   * term.
-   */
-  private static class UserTermExpected extends Exception {
-    private static final long serialVersionUID = 1L;
-
-    UserTermExpected(SubmitRecord.Label label) {
-      super(String.format("A label with the status %s must contain a user.", label.toString()));
-    }
-  }
-
-  public interface Factory {
-    SubmitRuleEvaluator create(CurrentUser user, ChangeData cd);
-  }
-
-  private final AccountCache accountCache;
-  private final Accounts accounts;
-  private final Emails emails;
-  private final ProjectCache projectCache;
-  private final ChangeData cd;
-
-  private SubmitRuleOptions.Builder optsBuilder = SubmitRuleOptions.defaults();
-  private SubmitRuleOptions opts;
-  private Change change;
-  private CurrentUser user;
-  private PatchSet patchSet;
-  private boolean logErrors = true;
-  private long reductionsConsumed;
-  private ProjectState projectState;
-
-  private Term submitRule;
-
-  @Inject
-  SubmitRuleEvaluator(
-      AccountCache accountCache,
-      Accounts accounts,
-      Emails emails,
-      ProjectCache projectCache,
-      @Assisted CurrentUser user,
-      @Assisted ChangeData cd) {
-    this.accountCache = accountCache;
-    this.accounts = accounts;
-    this.emails = emails;
-    this.projectCache = projectCache;
-    this.user = user;
-    this.cd = cd;
-  }
-
-  /**
-   * @return immutable snapshot of options configured so far. If neither {@link #getSubmitRule()}
-   *     nor {@link #getSubmitType()} have been called yet, state within this instance is still
-   *     mutable, so may change before evaluation. The instance's options are frozen at evaluation
-   *     time.
-   */
-  public SubmitRuleOptions getOptions() {
-    if (opts != null) {
-      return opts;
-    }
-    return optsBuilder.build();
-  }
-
-  public SubmitRuleEvaluator setOptions(SubmitRuleOptions opts) {
-    checkNotStarted();
-    if (opts != null) {
-      optsBuilder = opts.toBuilder();
-    } else {
-      optsBuilder = SubmitRuleOptions.defaults();
-    }
-    return this;
-  }
-
-  /**
-   * @param ps patch set of the change to evaluate. If not set, the current patch set will be loaded
-   *     from {@link #evaluate()} or {@link #getSubmitType}.
-   * @return this
-   */
-  public SubmitRuleEvaluator setPatchSet(PatchSet ps) {
-    checkArgument(
-        ps.getId().getParentKey().equals(cd.getId()),
-        "Patch set %s does not match change %s",
-        ps.getId(),
-        cd.getId());
-    patchSet = ps;
-    return this;
-  }
-
-  /**
-   * @param fast if true assume reviewers are permitted to use label values currently stored on the
-   *     change. Fast mode bypasses some reviewer permission checks.
-   * @return this
-   */
-  public SubmitRuleEvaluator setFastEvalLabels(boolean fast) {
-    checkNotStarted();
-    optsBuilder.fastEvalLabels(fast);
-    return this;
-  }
-
-  /**
-   * @param allow whether to allow {@link #evaluate()} on closed changes.
-   * @return this
-   */
-  public SubmitRuleEvaluator setAllowClosed(boolean allow) {
-    checkNotStarted();
-    optsBuilder.allowClosed(allow);
-    return this;
-  }
-
-  /**
-   * @param skip if true, submit filter will not be applied.
-   * @return this
-   */
-  public SubmitRuleEvaluator setSkipSubmitFilters(boolean skip) {
-    checkNotStarted();
-    optsBuilder.skipFilters(skip);
-    return this;
-  }
-
-  /**
-   * @param rule custom rule to use, or null to use refs/meta/config:rules.pl.
-   * @return this
-   */
-  public SubmitRuleEvaluator setRule(@Nullable String rule) {
-    checkNotStarted();
-    optsBuilder.rule(rule);
-    return this;
-  }
-
-  /**
-   * @param log whether to log error messages in addition to returning error records. If true, error
-   *     record messages will be less descriptive.
-   */
-  public SubmitRuleEvaluator setLogErrors(boolean log) {
-    logErrors = log;
-    return this;
-  }
-
-  /** @return Prolog reductions consumed during evaluation. */
-  public long getReductionsConsumed() {
-    return reductionsConsumed;
-  }
-
-  /**
-   * Evaluate the submit rules.
-   *
-   * @return List of {@link SubmitRecord} objects returned from the evaluated rules, including any
-   *     errors.
-   */
-  public List<SubmitRecord> evaluate() {
-    initOptions();
-    try {
-      init();
-    } catch (OrmException e) {
-      return ruleError("Error looking up change " + cd.getId(), e);
-    }
-
-    if (!opts.allowClosed() && change.getStatus().isClosed()) {
-      SubmitRecord rec = new SubmitRecord();
-      rec.status = SubmitRecord.Status.CLOSED;
-      return Collections.singletonList(rec);
-    }
-
-    List<Term> results;
-    try {
-      results =
-          evaluateImpl(
-              "locate_submit_rule",
-              "can_submit",
-              "locate_submit_filter",
-              "filter_submit_results",
-              user);
-    } catch (RuleEvalException e) {
-      return ruleError(e.getMessage(), e);
-    }
-
-    if (results.isEmpty()) {
-      // This should never occur. A well written submit rule will always produce
-      // at least one result informing the caller of the labels that are
-      // required for this change to be submittable. Each label will indicate
-      // whether or not that is actually possible given the permissions.
-      return ruleError(
-          String.format(
-              "Submit rule '%s' for change %s of %s has no solution.",
-              getSubmitRuleName(), cd.getId(), getProjectName()));
-    }
-
-    return resultsToSubmitRecord(getSubmitRule(), results);
-  }
-
-  /**
-   * Convert the results from Prolog Cafe's format to Gerrit's common format.
-   *
-   * <p>can_submit/1 terminates when an ok(P) record is found. Therefore walk the results backwards,
-   * using only that ok(P) record if it exists. This skips partial results that occur early in the
-   * output. Later after the loop the out collection is reversed to restore it to the original
-   * ordering.
-   */
-  private List<SubmitRecord> resultsToSubmitRecord(Term submitRule, List<Term> results) {
-    List<SubmitRecord> out = new ArrayList<>(results.size());
-    for (int resultIdx = results.size() - 1; 0 <= resultIdx; resultIdx--) {
-      Term submitRecord = results.get(resultIdx);
-      SubmitRecord rec = new SubmitRecord();
-      out.add(rec);
-
-      if (!(submitRecord instanceof StructureTerm) || 1 != submitRecord.arity()) {
-        return invalidResult(submitRule, submitRecord);
-      }
-
-      if ("ok".equals(submitRecord.name())) {
-        rec.status = SubmitRecord.Status.OK;
-
-      } else if ("not_ready".equals(submitRecord.name())) {
-        rec.status = SubmitRecord.Status.NOT_READY;
-
-      } else {
-        return invalidResult(submitRule, submitRecord);
-      }
-
-      // Unpack the one argument. This should also be a structure with one
-      // argument per label that needs to be reported on to the caller.
-      //
-      submitRecord = submitRecord.arg(0);
-
-      if (!(submitRecord instanceof StructureTerm)) {
-        return invalidResult(submitRule, submitRecord);
-      }
-
-      rec.labels = new ArrayList<>(submitRecord.arity());
-
-      for (Term state : ((StructureTerm) submitRecord).args()) {
-        if (!(state instanceof StructureTerm)
-            || 2 != state.arity()
-            || !"label".equals(state.name())) {
-          return invalidResult(submitRule, submitRecord);
-        }
-
-        SubmitRecord.Label lbl = new SubmitRecord.Label();
-        rec.labels.add(lbl);
-
-        lbl.label = state.arg(0).name();
-        Term status = state.arg(1);
-
-        try {
-          if ("ok".equals(status.name())) {
-            lbl.status = SubmitRecord.Label.Status.OK;
-            appliedBy(lbl, status);
-
-          } else if ("reject".equals(status.name())) {
-            lbl.status = SubmitRecord.Label.Status.REJECT;
-            appliedBy(lbl, status);
-
-          } else if ("need".equals(status.name())) {
-            lbl.status = SubmitRecord.Label.Status.NEED;
-
-          } else if ("may".equals(status.name())) {
-            lbl.status = SubmitRecord.Label.Status.MAY;
-
-          } else if ("impossible".equals(status.name())) {
-            lbl.status = SubmitRecord.Label.Status.IMPOSSIBLE;
-
-          } else {
-            return invalidResult(submitRule, submitRecord);
-          }
-        } catch (UserTermExpected e) {
-          return invalidResult(submitRule, submitRecord, e.getMessage());
-        }
-      }
-
-      if (rec.status == SubmitRecord.Status.OK) {
-        break;
-      }
-    }
-    Collections.reverse(out);
-
-    return out;
-  }
-
-  private List<SubmitRecord> invalidResult(Term rule, Term record, String reason) {
-    return ruleError(
-        String.format(
-            "Submit rule %s for change %s of %s output invalid result: %s%s",
-            rule,
-            cd.getId(),
-            getProjectName(),
-            record,
-            (reason == null ? "" : ". Reason: " + reason)));
-  }
-
-  private List<SubmitRecord> invalidResult(Term rule, Term record) {
-    return invalidResult(rule, record, null);
-  }
-
-  private List<SubmitRecord> ruleError(String err) {
-    return ruleError(err, null);
-  }
-
-  private List<SubmitRecord> ruleError(String err, Exception e) {
-    if (logErrors) {
-      if (e == null) {
-        log.error(err);
-      } else {
-        log.error(err, e);
-      }
-      return defaultRuleError();
-    }
-    return createRuleError(err);
-  }
-
-  /**
-   * Evaluate the submit type rules to get the submit type.
-   *
-   * @return record from the evaluated rules.
-   */
-  public SubmitTypeRecord getSubmitType() {
-    initOptions();
-    try {
-      init();
-    } catch (OrmException e) {
-      return typeError("Error looking up change " + cd.getId(), e);
-    }
-
-    List<Term> results;
-    try {
-      results =
-          evaluateImpl(
-              "locate_submit_type",
-              "get_submit_type",
-              "locate_submit_type_filter",
-              "filter_submit_type_results",
-              // Do not include current user in submit type evaluation. This is used
-              // for mergeability checks, which are stored persistently and so must
-              // have a consistent view of the submit type.
-              null);
-    } catch (RuleEvalException e) {
-      return typeError(e.getMessage(), e);
-    }
-
-    if (results.isEmpty()) {
-      // Should never occur for a well written rule
-      return typeError(
-          "Submit rule '"
-              + getSubmitRuleName()
-              + "' for change "
-              + cd.getId()
-              + " of "
-              + getProjectName()
-              + " has no solution.");
-    }
-
-    Term typeTerm = results.get(0);
-    if (!(typeTerm instanceof SymbolTerm)) {
-      return typeError(
-          "Submit rule '"
-              + getSubmitRuleName()
-              + "' for change "
-              + cd.getId()
-              + " of "
-              + getProjectName()
-              + " did not return a symbol.");
-    }
-
-    String typeName = ((SymbolTerm) typeTerm).name();
-    try {
-      return SubmitTypeRecord.OK(SubmitType.valueOf(typeName.toUpperCase()));
-    } catch (IllegalArgumentException e) {
-      return typeError(
-          "Submit type rule "
-              + getSubmitRule()
-              + " for change "
-              + cd.getId()
-              + " of "
-              + getProjectName()
-              + " output invalid result: "
-              + typeName);
-    }
-  }
-
-  private SubmitTypeRecord typeError(String err) {
-    return typeError(err, null);
-  }
-
-  private SubmitTypeRecord typeError(String err, Exception e) {
-    if (logErrors) {
-      if (e == null) {
-        log.error(err);
-      } else {
-        log.error(err, e);
-      }
-      return defaultTypeError();
-    }
-    return SubmitTypeRecord.error(err);
-  }
-
-  private List<Term> evaluateImpl(
-      String userRuleLocatorName,
-      String userRuleWrapperName,
-      String filterRuleLocatorName,
-      String filterRuleWrapperName,
-      CurrentUser user)
-      throws RuleEvalException {
-    PrologEnvironment env = getPrologEnvironment(user);
-    try {
-      Term sr = env.once("gerrit", userRuleLocatorName, new VariableTerm());
-      if (opts.fastEvalLabels()) {
-        env.once("gerrit", "assume_range_from_label");
-      }
-
-      List<Term> results = new ArrayList<>();
-      try {
-        for (Term[] template : env.all("gerrit", userRuleWrapperName, sr, new VariableTerm())) {
-          results.add(template[1]);
-        }
-      } catch (ReductionLimitException err) {
-        throw new RuleEvalException(
-            String.format(
-                "%s on change %d of %s", err.getMessage(), cd.getId().get(), getProjectName()));
-      } catch (RuntimeException err) {
-        throw new RuleEvalException(
-            String.format(
-                "Exception calling %s on change %d of %s", sr, cd.getId().get(), getProjectName()),
-            err);
-      } finally {
-        reductionsConsumed = env.getReductions();
-      }
-
-      Term resultsTerm = toListTerm(results);
-      if (!opts.skipFilters()) {
-        resultsTerm =
-            runSubmitFilters(resultsTerm, env, filterRuleLocatorName, filterRuleWrapperName);
-      }
-      List<Term> r;
-      if (resultsTerm instanceof ListTerm) {
-        r = new ArrayList<>();
-        for (Term t = resultsTerm; t instanceof ListTerm; ) {
-          ListTerm l = (ListTerm) t;
-          r.add(l.car().dereference());
-          t = l.cdr().dereference();
-        }
-      } else {
-        r = Collections.emptyList();
-      }
-      submitRule = sr;
-      return r;
-    } finally {
-      env.close();
-    }
-  }
-
-  private PrologEnvironment getPrologEnvironment(CurrentUser user) throws RuleEvalException {
-    PrologEnvironment env;
-    try {
-      if (opts.rule() == null) {
-        env = projectState.newPrologEnvironment();
-      } else {
-        env = projectState.newPrologEnvironment("stdin", new StringReader(opts.rule()));
-      }
-    } catch (CompileException err) {
-      String msg;
-      if (opts.rule() == null) {
-        msg = String.format("Cannot load rules.pl for %s: %s", getProjectName(), err.getMessage());
-      } else {
-        msg = err.getMessage();
-      }
-      throw new RuleEvalException(msg, err);
-    }
-    env.set(StoredValues.ACCOUNTS, accounts);
-    env.set(StoredValues.ACCOUNT_CACHE, accountCache);
-    env.set(StoredValues.EMAILS, emails);
-    env.set(StoredValues.REVIEW_DB, cd.db());
-    env.set(StoredValues.CHANGE_DATA, cd);
-    if (user != null) {
-      env.set(StoredValues.CURRENT_USER, user);
-    }
-    env.set(StoredValues.PROJECT_STATE, projectState);
-    return env;
-  }
-
-  private Term runSubmitFilters(
-      Term results,
-      PrologEnvironment env,
-      String filterRuleLocatorName,
-      String filterRuleWrapperName)
-      throws RuleEvalException {
-    PrologEnvironment childEnv = env;
-    for (ProjectState parentState : projectState.parents()) {
-      PrologEnvironment parentEnv;
-      try {
-        parentEnv = parentState.newPrologEnvironment();
-      } catch (CompileException err) {
-        throw new RuleEvalException("Cannot consult rules.pl for " + parentState.getName(), err);
-      }
-
-      parentEnv.copyStoredValues(childEnv);
-      Term filterRule = parentEnv.once("gerrit", filterRuleLocatorName, new VariableTerm());
-      try {
-        if (opts.fastEvalLabels()) {
-          env.once("gerrit", "assume_range_from_label");
-        }
-
-        Term[] template =
-            parentEnv.once(
-                "gerrit", filterRuleWrapperName, filterRule, results, new VariableTerm());
-        results = template[2];
-      } catch (ReductionLimitException err) {
-        throw new RuleEvalException(
-            String.format(
-                "%s on change %d of %s",
-                err.getMessage(), cd.getId().get(), parentState.getName()));
-      } catch (RuntimeException err) {
-        throw new RuleEvalException(
-            String.format(
-                "Exception calling %s on change %d of %s",
-                filterRule, cd.getId().get(), parentState.getName()),
-            err);
-      } finally {
-        reductionsConsumed += env.getReductions();
-      }
-      childEnv = parentEnv;
-    }
-    return results;
-  }
-
-  private static Term toListTerm(List<Term> terms) {
-    Term list = Prolog.Nil;
-    for (int i = terms.size() - 1; i >= 0; i--) {
-      list = new ListTerm(terms.get(i), list);
-    }
-    return list;
-  }
-
-  private void appliedBy(SubmitRecord.Label label, Term status) throws UserTermExpected {
-    if (status instanceof StructureTerm && status.arity() == 1) {
-      Term who = status.arg(0);
-      if (isUser(who)) {
-        label.appliedBy = new Account.Id(((IntegerTerm) who.arg(0)).intValue());
-      } else {
-        throw new UserTermExpected(label);
-      }
-    }
-  }
-
-  private static boolean isUser(Term who) {
-    return who instanceof StructureTerm
-        && who.arity() == 1
-        && who.name().equals("user")
-        && who.arg(0) instanceof IntegerTerm;
-  }
-
-  public Term getSubmitRule() {
-    checkState(submitRule != null, "getSubmitRule() invalid before evaluation");
-    return submitRule;
-  }
-
-  public String getSubmitRuleName() {
-    return submitRule != null ? submitRule.toString() : "<unknown rule>";
-  }
-
-  private void checkNotStarted() {
-    checkState(opts == null, "cannot set options after starting evaluation");
-  }
-
-  private void initOptions() {
-    if (opts == null) {
-      opts = optsBuilder.build();
-      optsBuilder = null;
-    }
-  }
-
-  private void init() throws OrmException {
-    if (change == null) {
-      change = cd.change();
-      if (change == null) {
-        throw new OrmException("No change found");
-      }
-    }
-
-    if (projectState == null) {
-      try {
-        projectState = projectCache.checkedGet(change.getProject());
-      } catch (IOException e) {
-        throw new OrmException("Can't load project state", e);
-      }
-    }
-
-    if (patchSet == null) {
-      patchSet = cd.currentPatchSet();
-      if (patchSet == null) {
-        throw new OrmException("No patch set found");
-      }
-    }
-  }
-
-  private String getProjectName() {
-    return projectState.getName();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SubmitRuleOptions.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SubmitRuleOptions.java
deleted file mode 100644
index 3e89f23..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SubmitRuleOptions.java
+++ /dev/null
@@ -1,65 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.project;
-
-import com.google.auto.value.AutoValue;
-import com.google.gerrit.common.Nullable;
-
-/**
- * Stable identifier for options passed to a particular submit rule evaluator.
- *
- * <p>Used to test whether it is ok to reuse a cached list of submit records. Does not include a
- * change or patch set ID; callers are responsible for checking those on their own.
- */
-@AutoValue
-public abstract class SubmitRuleOptions {
-  public static Builder builder() {
-    return new AutoValue_SubmitRuleOptions.Builder();
-  }
-
-  public static Builder defaults() {
-    return builder().fastEvalLabels(false).allowClosed(false).skipFilters(false).rule(null);
-  }
-
-  public abstract boolean fastEvalLabels();
-
-  public abstract boolean allowClosed();
-
-  public abstract boolean skipFilters();
-
-  @Nullable
-  public abstract String rule();
-
-  @AutoValue.Builder
-  public abstract static class Builder {
-    public abstract SubmitRuleOptions.Builder fastEvalLabels(boolean fastEvalLabels);
-
-    public abstract SubmitRuleOptions.Builder allowClosed(boolean allowClosed);
-
-    public abstract SubmitRuleOptions.Builder skipFilters(boolean skipFilters);
-
-    public abstract SubmitRuleOptions.Builder rule(@Nullable String rule);
-
-    public abstract SubmitRuleOptions build();
-  }
-
-  public Builder toBuilder() {
-    return builder()
-        .fastEvalLabels(fastEvalLabels())
-        .allowClosed(allowClosed())
-        .skipFilters(skipFilters())
-        .rule(rule());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SuggestParentCandidates.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SuggestParentCandidates.java
deleted file mode 100644
index ef539be..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SuggestParentCandidates.java
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.server.project;
-
-import static java.util.stream.Collectors.toList;
-
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.ProjectPermission;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-@Singleton
-public class SuggestParentCandidates {
-  private final ProjectCache projectCache;
-  private final PermissionBackend permissionBackend;
-  private final Provider<CurrentUser> user;
-  private final AllProjectsName allProjects;
-
-  @Inject
-  SuggestParentCandidates(
-      ProjectCache projectCache,
-      PermissionBackend permissionBackend,
-      Provider<CurrentUser> user,
-      AllProjectsName allProjects) {
-    this.projectCache = projectCache;
-    this.permissionBackend = permissionBackend;
-    this.user = user;
-    this.allProjects = allProjects;
-  }
-
-  public List<Project.NameKey> getNameKeys() throws PermissionBackendException {
-    return permissionBackend.user(user).filter(ProjectPermission.ACCESS, parents()).stream()
-        .sorted()
-        .collect(toList());
-  }
-
-  private Set<Project.NameKey> parents() {
-    Set<Project.NameKey> parents = new HashSet<>();
-    for (Project.NameKey p : projectCache.all()) {
-      ProjectState ps = projectCache.get(p);
-      if (ps != null) {
-        Project.NameKey parent = ps.getProject().getParent();
-        if (parent != null) {
-          parents.add(parent);
-        }
-      }
-    }
-    parents.add(allProjects);
-    return parents;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/TagResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/TagResource.java
deleted file mode 100644
index fe4d68d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/TagResource.java
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.api.projects.TagInfo;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.inject.TypeLiteral;
-
-public class TagResource extends RefResource {
-  public static final TypeLiteral<RestView<TagResource>> TAG_KIND =
-      new TypeLiteral<RestView<TagResource>>() {};
-
-  private final TagInfo tagInfo;
-
-  public TagResource(ProjectControl control, TagInfo tagInfo) {
-    super(control);
-    this.tagInfo = tagInfo;
-  }
-
-  public TagInfo getTagInfo() {
-    return tagInfo;
-  }
-
-  @Override
-  public String getRef() {
-    return tagInfo.ref;
-  }
-
-  @Override
-  public String getRevision() {
-    return tagInfo.revision;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/TagsCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/TagsCollection.java
deleted file mode 100644
index 78670ad..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/TagsCollection.java
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.project;
-
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AcceptsCreate;
-import com.google.gerrit.extensions.restapi.ChildCollection;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestView;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-
-@Singleton
-public class TagsCollection
-    implements ChildCollection<ProjectResource, TagResource>, AcceptsCreate<ProjectResource> {
-  private final DynamicMap<RestView<TagResource>> views;
-  private final Provider<ListTags> list;
-  private final CreateTag.Factory createTagFactory;
-
-  @Inject
-  public TagsCollection(
-      DynamicMap<RestView<TagResource>> views,
-      Provider<ListTags> list,
-      CreateTag.Factory createTagFactory) {
-    this.views = views;
-    this.list = list;
-    this.createTagFactory = createTagFactory;
-  }
-
-  @Override
-  public RestView<ProjectResource> list() throws ResourceNotFoundException {
-    return list.get();
-  }
-
-  @Override
-  public TagResource parse(ProjectResource resource, IdString id)
-      throws ResourceNotFoundException, IOException {
-    return new TagResource(resource.getControl(), list.get().get(resource, id));
-  }
-
-  @Override
-  public DynamicMap<RestView<TagResource>> views() {
-    return views;
-  }
-
-  @Override
-  public CreateTag create(ProjectResource resource, IdString name) {
-    return createTagFactory.create(name.get());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/account/AccountIsVisibleToPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/account/AccountIsVisibleToPredicate.java
deleted file mode 100644
index cc9fc0d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/account/AccountIsVisibleToPredicate.java
+++ /dev/null
@@ -1,40 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.query.account;
-
-import com.google.gerrit.index.query.IsVisibleToPredicate;
-import com.google.gerrit.server.account.AccountControl;
-import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.index.IndexUtils;
-import com.google.gwtorm.server.OrmException;
-
-public class AccountIsVisibleToPredicate extends IsVisibleToPredicate<AccountState> {
-  protected final AccountControl accountControl;
-
-  public AccountIsVisibleToPredicate(AccountControl accountControl) {
-    super(AccountQueryBuilder.FIELD_VISIBLETO, IndexUtils.describe(accountControl.getUser()));
-    this.accountControl = accountControl;
-  }
-
-  @Override
-  public boolean match(AccountState accountState) throws OrmException {
-    return accountControl.canSee(accountState);
-  }
-
-  @Override
-  public int getCost() {
-    return 1;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/account/AccountPredicates.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/account/AccountPredicates.java
deleted file mode 100644
index 9ab8b0a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/account/AccountPredicates.java
+++ /dev/null
@@ -1,135 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.query.account;
-
-import com.google.common.collect.Lists;
-import com.google.common.primitives.Ints;
-import com.google.gerrit.index.FieldDef;
-import com.google.gerrit.index.query.IndexPredicate;
-import com.google.gerrit.index.query.Matchable;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.index.query.QueryBuilder;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.index.account.AccountField;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gwtorm.server.OrmException;
-import java.util.List;
-
-public class AccountPredicates {
-  public static boolean hasActive(Predicate<AccountState> p) {
-    return QueryBuilder.find(p, AccountPredicate.class, AccountField.ACTIVE.getName()) != null;
-  }
-
-  public static Predicate<AccountState> andActive(Predicate<AccountState> p) {
-    return Predicate.and(p, isActive());
-  }
-
-  public static Predicate<AccountState> defaultPredicate(String query) {
-    // Adapt the capacity of this list when adding more default predicates.
-    List<Predicate<AccountState>> preds = Lists.newArrayListWithCapacity(3);
-    Integer id = Ints.tryParse(query);
-    if (id != null) {
-      preds.add(id(new Account.Id(id)));
-    }
-    preds.add(equalsName(query));
-    preds.add(username(query));
-    // Adapt the capacity of the "predicates" list when adding more default
-    // predicates.
-    return Predicate.or(preds);
-  }
-
-  public static Predicate<AccountState> id(Account.Id accountId) {
-    return new AccountPredicate(
-        AccountField.ID, AccountQueryBuilder.FIELD_ACCOUNT, accountId.toString());
-  }
-
-  public static Predicate<AccountState> email(String email) {
-    return new AccountPredicate(
-        AccountField.EMAIL, AccountQueryBuilder.FIELD_EMAIL, email.toLowerCase());
-  }
-
-  public static Predicate<AccountState> preferredEmail(String email) {
-    return new AccountPredicate(
-        AccountField.PREFERRED_EMAIL,
-        AccountQueryBuilder.FIELD_PREFERRED_EMAIL,
-        email.toLowerCase());
-  }
-
-  public static Predicate<AccountState> preferredEmailExact(String email) {
-    return new AccountPredicate(
-        AccountField.PREFERRED_EMAIL_EXACT, AccountQueryBuilder.FIELD_PREFERRED_EMAIL_EXACT, email);
-  }
-
-  public static Predicate<AccountState> equalsName(String name) {
-    return new AccountPredicate(
-        AccountField.NAME_PART, AccountQueryBuilder.FIELD_NAME, name.toLowerCase());
-  }
-
-  public static Predicate<AccountState> externalId(String externalId) {
-    return new AccountPredicate(AccountField.EXTERNAL_ID, externalId);
-  }
-
-  public static Predicate<AccountState> fullName(String fullName) {
-    return new AccountPredicate(AccountField.FULL_NAME, fullName);
-  }
-
-  public static Predicate<AccountState> isActive() {
-    return new AccountPredicate(AccountField.ACTIVE, "1");
-  }
-
-  public static Predicate<AccountState> isNotActive() {
-    return new AccountPredicate(AccountField.ACTIVE, "0");
-  }
-
-  public static Predicate<AccountState> username(String username) {
-    return new AccountPredicate(
-        AccountField.USERNAME, AccountQueryBuilder.FIELD_USERNAME, username.toLowerCase());
-  }
-
-  public static Predicate<AccountState> watchedProject(Project.NameKey project) {
-    return new AccountPredicate(AccountField.WATCHED_PROJECT, project.get());
-  }
-
-  public static Predicate<AccountState> cansee(
-      AccountQueryBuilder.Arguments args, ChangeNotes changeNotes) {
-    return new CanSeeChangePredicate(
-        args.db, args.permissionBackend, args.userFactory, changeNotes);
-  }
-
-  static class AccountPredicate extends IndexPredicate<AccountState>
-      implements Matchable<AccountState> {
-    AccountPredicate(FieldDef<AccountState, ?> def, String value) {
-      super(def, value);
-    }
-
-    AccountPredicate(FieldDef<AccountState, ?> def, String name, String value) {
-      super(def, name, value);
-    }
-
-    @Override
-    public boolean match(AccountState object) throws OrmException {
-      return true;
-    }
-
-    @Override
-    public int getCost() {
-      return 1;
-    }
-  }
-
-  private AccountPredicates() {}
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/account/AccountQueryBuilder.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/account/AccountQueryBuilder.java
deleted file mode 100644
index 959f764..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/account/AccountQueryBuilder.java
+++ /dev/null
@@ -1,186 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.query.account;
-
-import com.google.common.base.Splitter;
-import com.google.common.collect.Lists;
-import com.google.common.primitives.Ints;
-import com.google.gerrit.common.errors.NotSignedInException;
-import com.google.gerrit.index.query.LimitPredicate;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.index.query.QueryBuilder;
-import com.google.gerrit.index.query.QueryParseException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ChangeFinder;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.ProvisionException;
-
-/** Parses a query string meant to be applied to account objects. */
-public class AccountQueryBuilder extends QueryBuilder<AccountState> {
-  public static final String FIELD_ACCOUNT = "account";
-  public static final String FIELD_EMAIL = "email";
-  public static final String FIELD_LIMIT = "limit";
-  public static final String FIELD_NAME = "name";
-  public static final String FIELD_PREFERRED_EMAIL = "preferredemail";
-  public static final String FIELD_PREFERRED_EMAIL_EXACT = "preferredemail_exact";
-  public static final String FIELD_USERNAME = "username";
-  public static final String FIELD_VISIBLETO = "visibleto";
-
-  private static final QueryBuilder.Definition<AccountState, AccountQueryBuilder> mydef =
-      new QueryBuilder.Definition<>(AccountQueryBuilder.class);
-
-  public static class Arguments {
-    final Provider<ReviewDb> db;
-    final ChangeFinder changeFinder;
-    final IdentifiedUser.GenericFactory userFactory;
-    final PermissionBackend permissionBackend;
-
-    private final Provider<CurrentUser> self;
-
-    @Inject
-    public Arguments(
-        Provider<CurrentUser> self,
-        Provider<ReviewDb> db,
-        ChangeFinder changeFinder,
-        IdentifiedUser.GenericFactory userFactory,
-        PermissionBackend permissionBackend) {
-      this.self = self;
-      this.db = db;
-      this.changeFinder = changeFinder;
-      this.userFactory = userFactory;
-      this.permissionBackend = permissionBackend;
-    }
-
-    IdentifiedUser getIdentifiedUser() throws QueryParseException {
-      try {
-        CurrentUser u = getUser();
-        if (u.isIdentifiedUser()) {
-          return u.asIdentifiedUser();
-        }
-        throw new QueryParseException(NotSignedInException.MESSAGE);
-      } catch (ProvisionException e) {
-        throw new QueryParseException(NotSignedInException.MESSAGE, e);
-      }
-    }
-
-    CurrentUser getUser() throws QueryParseException {
-      try {
-        return self.get();
-      } catch (ProvisionException e) {
-        throw new QueryParseException(NotSignedInException.MESSAGE, e);
-      }
-    }
-  }
-
-  private final Arguments args;
-
-  @Inject
-  AccountQueryBuilder(Arguments args) {
-    super(mydef);
-    this.args = args;
-  }
-
-  @Operator
-  public Predicate<AccountState> cansee(String change)
-      throws QueryParseException, OrmException, PermissionBackendException {
-    ChangeNotes changeNotes = args.changeFinder.findOne(change);
-    if (changeNotes == null
-        || !args.permissionBackend
-            .user(args.getUser())
-            .database(args.db)
-            .change(changeNotes)
-            .test(ChangePermission.READ)) {
-      throw error(String.format("change %s not found", change));
-    }
-
-    return AccountPredicates.cansee(args, changeNotes);
-  }
-
-  @Operator
-  public Predicate<AccountState> email(String email) {
-    return AccountPredicates.email(email);
-  }
-
-  @Operator
-  public Predicate<AccountState> is(String value) throws QueryParseException {
-    if ("active".equalsIgnoreCase(value)) {
-      return AccountPredicates.isActive();
-    }
-    if ("inactive".equalsIgnoreCase(value)) {
-      return AccountPredicates.isNotActive();
-    }
-    throw error("Invalid query");
-  }
-
-  @Operator
-  public Predicate<AccountState> limit(String query) throws QueryParseException {
-    Integer limit = Ints.tryParse(query);
-    if (limit == null) {
-      throw error("Invalid limit: " + query);
-    }
-    return new LimitPredicate<>(FIELD_LIMIT, limit);
-  }
-
-  @Operator
-  public Predicate<AccountState> name(String name) {
-    return AccountPredicates.equalsName(name);
-  }
-
-  @Operator
-  public Predicate<AccountState> username(String username) {
-    return AccountPredicates.username(username);
-  }
-
-  public Predicate<AccountState> defaultQuery(String query) {
-    return Predicate.and(
-        Lists.transform(
-            Splitter.on(' ').omitEmptyStrings().splitToList(query), this::defaultField));
-  }
-
-  @Override
-  protected Predicate<AccountState> defaultField(String query) {
-    Predicate<AccountState> defaultPredicate = AccountPredicates.defaultPredicate(query);
-    if (query.startsWith("cansee:")) {
-      try {
-        return cansee(query.substring(7));
-      } catch (OrmException | QueryParseException | PermissionBackendException e) {
-        // Ignore, fall back to default query
-      }
-    }
-
-    if ("self".equalsIgnoreCase(query) || "me".equalsIgnoreCase(query)) {
-      try {
-        return Predicate.or(defaultPredicate, AccountPredicates.id(self()));
-      } catch (QueryParseException e) {
-        // Skip.
-      }
-    }
-    return defaultPredicate;
-  }
-
-  private Account.Id self() throws QueryParseException {
-    return args.getIdentifiedUser().getAccountId();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/account/AccountQueryProcessor.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/account/AccountQueryProcessor.java
deleted file mode 100644
index a33118d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/account/AccountQueryProcessor.java
+++ /dev/null
@@ -1,77 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.query.account;
-
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.gerrit.server.query.account.AccountQueryBuilder.FIELD_LIMIT;
-
-import com.google.gerrit.index.IndexConfig;
-import com.google.gerrit.index.query.AndSource;
-import com.google.gerrit.index.query.IndexPredicate;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.index.query.QueryProcessor;
-import com.google.gerrit.metrics.MetricMaker;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.account.AccountControl;
-import com.google.gerrit.server.account.AccountLimits;
-import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.index.account.AccountIndexCollection;
-import com.google.gerrit.server.index.account.AccountIndexRewriter;
-import com.google.gerrit.server.index.account.AccountSchemaDefinitions;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-
-/**
- * Query processor for the account index.
- *
- * <p>Instances are one-time-use. Other singleton classes should inject a Provider rather than
- * holding on to a single instance.
- */
-public class AccountQueryProcessor extends QueryProcessor<AccountState> {
-  private final AccountControl.Factory accountControlFactory;
-
-  static {
-    // It is assumed that basic rewrites do not touch visibleto predicates.
-    checkState(
-        !AccountIsVisibleToPredicate.class.isAssignableFrom(IndexPredicate.class),
-        "AccountQueryProcessor assumes visibleto is not used by the index rewriter.");
-  }
-
-  @Inject
-  protected AccountQueryProcessor(
-      Provider<CurrentUser> userProvider,
-      AccountLimits.Factory limitsFactory,
-      MetricMaker metricMaker,
-      IndexConfig indexConfig,
-      AccountIndexCollection indexes,
-      AccountIndexRewriter rewriter,
-      AccountControl.Factory accountControlFactory) {
-    super(
-        metricMaker,
-        AccountSchemaDefinitions.INSTANCE,
-        indexConfig,
-        indexes,
-        rewriter,
-        FIELD_LIMIT,
-        () -> limitsFactory.create(userProvider.get()).getQueryLimit());
-    this.accountControlFactory = accountControlFactory;
-  }
-
-  @Override
-  protected Predicate<AccountState> enforceVisibility(Predicate<AccountState> pred) {
-    return new AndSource<>(
-        pred, new AccountIsVisibleToPredicate(accountControlFactory.get()), start);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/account/CanSeeChangePredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/account/CanSeeChangePredicate.java
deleted file mode 100644
index f8b8cc7..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/account/CanSeeChangePredicate.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package com.google.gerrit.server.query.account;
-
-import com.google.gerrit.index.query.PostFilterPredicate;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Provider;
-import java.util.Collection;
-import java.util.Objects;
-
-public class CanSeeChangePredicate extends PostFilterPredicate<AccountState> {
-  private final Provider<ReviewDb> db;
-  private final PermissionBackend permissionBackend;
-  private final IdentifiedUser.GenericFactory userFactory;
-  private final ChangeNotes changeNotes;
-
-  CanSeeChangePredicate(
-      Provider<ReviewDb> db,
-      PermissionBackend permissionBackend,
-      IdentifiedUser.GenericFactory userFactory,
-      ChangeNotes changeNotes) {
-    this.db = db;
-    this.permissionBackend = permissionBackend;
-    this.userFactory = userFactory;
-    this.changeNotes = changeNotes;
-  }
-
-  @Override
-  public boolean match(AccountState accountState) throws OrmException {
-    try {
-      return permissionBackend
-          .user(userFactory.create(accountState.getAccount().getId()))
-          .database(db)
-          .change(changeNotes)
-          .test(ChangePermission.READ);
-    } catch (PermissionBackendException e) {
-      throw new OrmException("Failed to check if account can see change", e);
-    }
-  }
-
-  @Override
-  public int getCost() {
-    return 1;
-  }
-
-  @Override
-  public Predicate<AccountState> copy(Collection<? extends Predicate<AccountState>> children) {
-    return new CanSeeChangePredicate(db, permissionBackend, userFactory, changeNotes);
-  }
-
-  @Override
-  public int hashCode() {
-    return Objects.hash(changeNotes.getChange().getChangeId());
-  }
-
-  @Override
-  public boolean equals(Object other) {
-    if (other == null) {
-      return false;
-    }
-    return getClass() == other.getClass()
-        && changeNotes.getChange().getChangeId()
-            == ((CanSeeChangePredicate) other).changeNotes.getChange().getChangeId();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/account/InternalAccountQuery.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/account/InternalAccountQuery.java
deleted file mode 100644
index 1eec8d9..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/account/InternalAccountQuery.java
+++ /dev/null
@@ -1,201 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.query.account;
-
-import static java.util.stream.Collectors.toList;
-import static java.util.stream.Collectors.toSet;
-
-import com.google.common.base.Joiner;
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableListMultimap;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Multimap;
-import com.google.gerrit.index.FieldDef;
-import com.google.gerrit.index.IndexConfig;
-import com.google.gerrit.index.Schema;
-import com.google.gerrit.index.query.InternalQuery;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.index.account.AccountField;
-import com.google.gerrit.server.index.account.AccountIndexCollection;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Set;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Query wrapper for the account index.
- *
- * <p>Instances are one-time-use. Other singleton classes should inject a Provider rather than
- * holding on to a single instance.
- */
-public class InternalAccountQuery extends InternalQuery<AccountState> {
-  private static final Logger log = LoggerFactory.getLogger(InternalAccountQuery.class);
-
-  @Inject
-  InternalAccountQuery(
-      AccountQueryProcessor queryProcessor,
-      AccountIndexCollection indexes,
-      IndexConfig indexConfig) {
-    super(queryProcessor, indexes, indexConfig);
-  }
-
-  @Override
-  public InternalAccountQuery setLimit(int n) {
-    super.setLimit(n);
-    return this;
-  }
-
-  @Override
-  public InternalAccountQuery enforceVisibility(boolean enforce) {
-    super.enforceVisibility(enforce);
-    return this;
-  }
-
-  @Override
-  public InternalAccountQuery setRequestedFields(Set<String> fields) {
-    super.setRequestedFields(fields);
-    return this;
-  }
-
-  @Override
-  public InternalAccountQuery noFields() {
-    super.noFields();
-    return this;
-  }
-
-  public List<AccountState> byDefault(String query) throws OrmException {
-    return query(AccountPredicates.defaultPredicate(query));
-  }
-
-  public List<AccountState> byExternalId(String scheme, String id) throws OrmException {
-    return byExternalId(ExternalId.Key.create(scheme, id));
-  }
-
-  public List<AccountState> byExternalId(ExternalId.Key externalId) throws OrmException {
-    return query(AccountPredicates.externalId(externalId.toString()));
-  }
-
-  public AccountState oneByExternalId(String externalId) throws OrmException {
-    return oneByExternalId(ExternalId.Key.parse(externalId));
-  }
-
-  public AccountState oneByExternalId(String scheme, String id) throws OrmException {
-    return oneByExternalId(ExternalId.Key.create(scheme, id));
-  }
-
-  public AccountState oneByExternalId(ExternalId.Key externalId) throws OrmException {
-    List<AccountState> accountStates = byExternalId(externalId);
-    if (accountStates.size() == 1) {
-      return accountStates.get(0);
-    } else if (accountStates.size() > 0) {
-      StringBuilder msg = new StringBuilder();
-      msg.append("Ambiguous external ID ").append(externalId).append(" for accounts: ");
-      Joiner.on(", ")
-          .appendTo(msg, Lists.transform(accountStates, AccountState.ACCOUNT_ID_FUNCTION));
-      log.warn(msg.toString());
-    }
-    return null;
-  }
-
-  public List<AccountState> byFullName(String fullName) throws OrmException {
-    return query(AccountPredicates.fullName(fullName));
-  }
-
-  /**
-   * Queries for accounts that have a preferred email that exactly matches the given email.
-   *
-   * @param email preferred email by which accounts should be found
-   * @return list of accounts that have a preferred email that exactly matches the given email
-   * @throws OrmException if query cannot be parsed
-   */
-  public List<AccountState> byPreferredEmail(String email) throws OrmException {
-    if (hasPreferredEmailExact()) {
-      return query(AccountPredicates.preferredEmailExact(email));
-    }
-
-    if (!hasPreferredEmail()) {
-      return ImmutableList.of();
-    }
-
-    return query(AccountPredicates.preferredEmail(email)).stream()
-        .filter(a -> a.getAccount().getPreferredEmail().equals(email))
-        .collect(toList());
-  }
-
-  /**
-   * Makes multiple queries for accounts by preferred email (exact match).
-   *
-   * @param emails preferred emails by which accounts should be found
-   * @return multimap of the given emails to accounts that have a preferred email that exactly
-   *     matches this email
-   * @throws OrmException if query cannot be parsed
-   */
-  public Multimap<String, AccountState> byPreferredEmail(String... emails) throws OrmException {
-    List<String> emailList = Arrays.asList(emails);
-
-    if (hasPreferredEmailExact()) {
-      List<List<AccountState>> r =
-          query(
-              emailList.stream()
-                  .map(e -> AccountPredicates.preferredEmailExact(e))
-                  .collect(toList()));
-      Multimap<String, AccountState> accountsByEmail = ArrayListMultimap.create();
-      for (int i = 0; i < emailList.size(); i++) {
-        accountsByEmail.putAll(emailList.get(i), r.get(i));
-      }
-      return accountsByEmail;
-    }
-
-    if (!hasPreferredEmail()) {
-      return ImmutableListMultimap.of();
-    }
-
-    List<List<AccountState>> r =
-        query(emailList.stream().map(e -> AccountPredicates.preferredEmail(e)).collect(toList()));
-    Multimap<String, AccountState> accountsByEmail = ArrayListMultimap.create();
-    for (int i = 0; i < emailList.size(); i++) {
-      String email = emailList.get(i);
-      Set<AccountState> matchingAccounts =
-          r.get(i).stream()
-              .filter(a -> a.getAccount().getPreferredEmail().equals(email))
-              .collect(toSet());
-      accountsByEmail.putAll(email, matchingAccounts);
-    }
-    return accountsByEmail;
-  }
-
-  public List<AccountState> byWatchedProject(Project.NameKey project) throws OrmException {
-    return query(AccountPredicates.watchedProject(project));
-  }
-
-  private boolean hasField(FieldDef<AccountState, ?> field) {
-    Schema<AccountState> s = schema();
-    return (s != null && s.hasField(field));
-  }
-
-  private boolean hasPreferredEmail() {
-    return hasField(AccountField.PREFERRED_EMAIL);
-  }
-
-  private boolean hasPreferredEmailExact() {
-    return hasField(AccountField.PREFERRED_EMAIL_EXACT);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AgePredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AgePredicate.java
deleted file mode 100644
index 6310665..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AgePredicate.java
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.server.query.change;
-
-import static java.util.concurrent.TimeUnit.MILLISECONDS;
-import static java.util.concurrent.TimeUnit.SECONDS;
-
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.server.config.ConfigUtil;
-import com.google.gerrit.server.index.change.ChangeField;
-import com.google.gwtorm.server.OrmException;
-import java.sql.Timestamp;
-
-public class AgePredicate extends TimestampRangeChangePredicate {
-  protected final long cut;
-
-  public AgePredicate(String value) {
-    super(ChangeField.UPDATED, ChangeQueryBuilder.FIELD_AGE, value);
-
-    long s = ConfigUtil.getTimeUnit(getValue(), 0, SECONDS);
-    long ms = MILLISECONDS.convert(s, SECONDS);
-    this.cut = TimeUtil.nowMs() - ms;
-  }
-
-  @Override
-  public Timestamp getMinTimestamp() {
-    return new Timestamp(0);
-  }
-
-  @Override
-  public Timestamp getMaxTimestamp() {
-    return new Timestamp(cut);
-  }
-
-  @Override
-  public boolean match(ChangeData object) throws OrmException {
-    Change change = object.change();
-    return change != null && change.getLastUpdatedOn().getTime() <= cut;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeData.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeData.java
deleted file mode 100644
index fc99201..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeData.java
+++ /dev/null
@@ -1,1277 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.query.change;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.gerrit.server.ApprovalsUtil.sortApprovals;
-import static java.util.stream.Collectors.toList;
-import static java.util.stream.Collectors.toMap;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.base.MoreObjects;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableListMultimap;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ImmutableSortedSet;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.data.LabelTypes;
-import com.google.gerrit.common.data.SubmitRecord;
-import com.google.gerrit.common.data.SubmitTypeRecord;
-import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.client.RobotComment;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ApprovalsUtil;
-import com.google.gerrit.server.ChangeMessagesUtil;
-import com.google.gerrit.server.CommentsUtil;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.ReviewerByEmailSet;
-import com.google.gerrit.server.ReviewerSet;
-import com.google.gerrit.server.ReviewerStatusUpdate;
-import com.google.gerrit.server.StarredChangesUtil;
-import com.google.gerrit.server.StarredChangesUtil.StarRef;
-import com.google.gerrit.server.change.GetPureRevert;
-import com.google.gerrit.server.change.MergeabilityCache;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.config.TrackingFooters;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MergeUtil;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.NotesMigration;
-import com.google.gerrit.server.patch.DiffSummary;
-import com.google.gerrit.server.patch.DiffSummaryKey;
-import com.google.gerrit.server.patch.PatchListCache;
-import com.google.gerrit.server.patch.PatchListKey;
-import com.google.gerrit.server.patch.PatchListNotAvailableException;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.project.SubmitRuleEvaluator;
-import com.google.gerrit.server.project.SubmitRuleOptions;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.ResultSet;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import java.util.stream.Stream;
-import org.eclipse.jgit.errors.IncorrectObjectTypeException;
-import org.eclipse.jgit.errors.MissingObjectException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.FooterLine;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-public class ChangeData {
-  private static final int BATCH_SIZE = 50;
-
-  public static List<Change> asChanges(List<ChangeData> changeDatas) throws OrmException {
-    List<Change> result = new ArrayList<>(changeDatas.size());
-    for (ChangeData cd : changeDatas) {
-      result.add(cd.change());
-    }
-    return result;
-  }
-
-  public static Map<Change.Id, ChangeData> asMap(List<ChangeData> changes) {
-    return changes.stream().collect(toMap(ChangeData::getId, cd -> cd));
-  }
-
-  public static void ensureChangeLoaded(Iterable<ChangeData> changes) throws OrmException {
-    ChangeData first = Iterables.getFirst(changes, null);
-    if (first == null) {
-      return;
-    } else if (first.notesMigration.readChanges()) {
-      for (ChangeData cd : changes) {
-        cd.change();
-      }
-      return;
-    }
-
-    Map<Change.Id, ChangeData> missing = new HashMap<>();
-    for (ChangeData cd : changes) {
-      if (cd.change == null) {
-        missing.put(cd.getId(), cd);
-      }
-    }
-    if (missing.isEmpty()) {
-      return;
-    }
-    for (ChangeNotes notes : first.notesFactory.create(first.db, missing.keySet())) {
-      missing.get(notes.getChangeId()).change = notes.getChange();
-    }
-  }
-
-  public static void ensureAllPatchSetsLoaded(Iterable<ChangeData> changes) throws OrmException {
-    ChangeData first = Iterables.getFirst(changes, null);
-    if (first == null) {
-      return;
-    } else if (first.notesMigration.readChanges()) {
-      for (ChangeData cd : changes) {
-        cd.patchSets();
-      }
-      return;
-    }
-
-    List<ResultSet<PatchSet>> results = new ArrayList<>(BATCH_SIZE);
-    for (List<ChangeData> batch : Iterables.partition(changes, BATCH_SIZE)) {
-      results.clear();
-      for (ChangeData cd : batch) {
-        if (cd.patchSets == null) {
-          results.add(cd.db.patchSets().byChange(cd.getId()));
-        } else {
-          results.add(null);
-        }
-      }
-      for (int i = 0; i < batch.size(); i++) {
-        ResultSet<PatchSet> result = results.get(i);
-        if (result != null) {
-          batch.get(i).patchSets = result.toList();
-        }
-      }
-    }
-  }
-
-  public static void ensureCurrentPatchSetLoaded(Iterable<ChangeData> changes) throws OrmException {
-    ChangeData first = Iterables.getFirst(changes, null);
-    if (first == null) {
-      return;
-    } else if (first.notesMigration.readChanges()) {
-      for (ChangeData cd : changes) {
-        cd.currentPatchSet();
-      }
-      return;
-    }
-
-    Map<PatchSet.Id, ChangeData> missing = new HashMap<>();
-    for (ChangeData cd : changes) {
-      if (cd.currentPatchSet == null && cd.patchSets == null) {
-        missing.put(cd.change().currentPatchSetId(), cd);
-      }
-    }
-    if (missing.isEmpty()) {
-      return;
-    }
-    for (PatchSet ps : first.db.patchSets().get(missing.keySet())) {
-      missing.get(ps.getId()).currentPatchSet = ps;
-    }
-  }
-
-  public static void ensureCurrentApprovalsLoaded(Iterable<ChangeData> changes)
-      throws OrmException {
-    ChangeData first = Iterables.getFirst(changes, null);
-    if (first == null) {
-      return;
-    } else if (first.notesMigration.readChanges()) {
-      for (ChangeData cd : changes) {
-        cd.currentApprovals();
-      }
-      return;
-    }
-
-    List<ResultSet<PatchSetApproval>> results = new ArrayList<>(BATCH_SIZE);
-    for (List<ChangeData> batch : Iterables.partition(changes, BATCH_SIZE)) {
-      results.clear();
-      for (ChangeData cd : batch) {
-        if (cd.currentApprovals == null) {
-          PatchSet.Id psId = cd.change().currentPatchSetId();
-          results.add(cd.db.patchSetApprovals().byPatchSet(psId));
-        } else {
-          results.add(null);
-        }
-      }
-      for (int i = 0; i < batch.size(); i++) {
-        ResultSet<PatchSetApproval> result = results.get(i);
-        if (result != null) {
-          batch.get(i).currentApprovals = sortApprovals(result);
-        }
-      }
-    }
-  }
-
-  public static void ensureMessagesLoaded(Iterable<ChangeData> changes) throws OrmException {
-    ChangeData first = Iterables.getFirst(changes, null);
-    if (first == null) {
-      return;
-    } else if (first.notesMigration.readChanges()) {
-      for (ChangeData cd : changes) {
-        cd.messages();
-      }
-      return;
-    }
-
-    List<ResultSet<ChangeMessage>> results = new ArrayList<>(BATCH_SIZE);
-    for (List<ChangeData> batch : Iterables.partition(changes, BATCH_SIZE)) {
-      results.clear();
-      for (ChangeData cd : batch) {
-        if (cd.messages == null) {
-          PatchSet.Id psId = cd.change().currentPatchSetId();
-          results.add(cd.db.changeMessages().byPatchSet(psId));
-        } else {
-          results.add(null);
-        }
-      }
-      for (int i = 0; i < batch.size(); i++) {
-        ResultSet<ChangeMessage> result = results.get(i);
-        if (result != null) {
-          batch.get(i).messages = result.toList();
-        }
-      }
-    }
-  }
-
-  public static void ensureReviewedByLoadedForOpenChanges(Iterable<ChangeData> changes)
-      throws OrmException {
-    List<ChangeData> pending = new ArrayList<>();
-    for (ChangeData cd : changes) {
-      if (cd.reviewedBy == null && cd.change().getStatus().isOpen()) {
-        pending.add(cd);
-      }
-    }
-
-    if (!pending.isEmpty()) {
-      ensureAllPatchSetsLoaded(pending);
-      ensureMessagesLoaded(pending);
-      for (ChangeData cd : pending) {
-        cd.reviewedBy();
-      }
-    }
-  }
-
-  public static class Factory {
-    private final AssistedFactory assistedFactory;
-
-    @Inject
-    Factory(AssistedFactory assistedFactory) {
-      this.assistedFactory = assistedFactory;
-    }
-
-    public ChangeData create(ReviewDb db, Project.NameKey project, Change.Id id) {
-      return assistedFactory.create(db, project, id, null, null);
-    }
-
-    public ChangeData create(ReviewDb db, Change change) {
-      return assistedFactory.create(db, change.getProject(), change.getId(), change, null);
-    }
-
-    public ChangeData create(ReviewDb db, ChangeNotes notes) {
-      return assistedFactory.create(
-          db, notes.getChange().getProject(), notes.getChangeId(), notes.getChange(), notes);
-    }
-  }
-
-  public interface AssistedFactory {
-    ChangeData create(
-        ReviewDb db,
-        Project.NameKey project,
-        Change.Id id,
-        @Nullable Change change,
-        @Nullable ChangeNotes notes);
-  }
-
-  /**
-   * Create an instance for testing only.
-   *
-   * <p>Attempting to lazy load data will fail with NPEs. Callers may consider manually setting
-   * fields that can be set.
-   *
-   * @param id change ID
-   * @return instance for testing.
-   */
-  public static ChangeData createForTest(
-      Project.NameKey project, Change.Id id, int currentPatchSetId) {
-    ChangeData cd =
-        new ChangeData(
-            null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-            null, null, null, null, project, id, null, null);
-    cd.currentPatchSet = new PatchSet(new PatchSet.Id(id, currentPatchSetId));
-    return cd;
-  }
-
-  // Injected fields.
-  private @Nullable final StarredChangesUtil starredChangesUtil;
-  private final AllUsersName allUsersName;
-  private final ApprovalsUtil approvalsUtil;
-  private final ChangeMessagesUtil cmUtil;
-  private final ChangeNotes.Factory notesFactory;
-  private final CommentsUtil commentsUtil;
-  private final GitRepositoryManager repoManager;
-  private final IdentifiedUser.GenericFactory userFactory;
-  private final MergeUtil.Factory mergeUtilFactory;
-  private final MergeabilityCache mergeabilityCache;
-  private final NotesMigration notesMigration;
-  private final PatchListCache patchListCache;
-  private final PatchSetUtil psUtil;
-  private final ProjectCache projectCache;
-  private final TrackingFooters trackingFooters;
-  private final GetPureRevert pureRevert;
-  private final SubmitRuleEvaluator.Factory submitRuleEvaluatorFactory;
-
-  // Required assisted injected fields.
-  private final ReviewDb db;
-  private final Project.NameKey project;
-  private final Change.Id legacyId;
-
-  // Lazily populated fields, including optional assisted injected fields.
-
-  private final Map<SubmitRuleOptions, List<SubmitRecord>> submitRecords =
-      Maps.newLinkedHashMapWithExpectedSize(1);
-
-  private boolean lazyLoad = true;
-  private Change change;
-  private ChangeNotes notes;
-  private String commitMessage;
-  private List<FooterLine> commitFooters;
-  private PatchSet currentPatchSet;
-  private Collection<PatchSet> patchSets;
-  private ListMultimap<PatchSet.Id, PatchSetApproval> allApprovals;
-  private List<PatchSetApproval> currentApprovals;
-  private List<String> currentFiles;
-  private Optional<DiffSummary> diffSummary;
-  private Collection<Comment> publishedComments;
-  private Collection<RobotComment> robotComments;
-  private CurrentUser visibleTo;
-  private List<ChangeMessage> messages;
-  private Optional<ChangedLines> changedLines;
-  private SubmitTypeRecord submitTypeRecord;
-  private Boolean mergeable;
-  private Set<String> hashtags;
-  private Map<Account.Id, Ref> editsByUser;
-  private Set<Account.Id> reviewedBy;
-  private Map<Account.Id, Ref> draftsByUser;
-  private ImmutableListMultimap<Account.Id, String> stars;
-  private StarsOf starsOf;
-  private ImmutableMap<Account.Id, StarRef> starRefs;
-  private ReviewerSet reviewers;
-  private ReviewerByEmailSet reviewersByEmail;
-  private ReviewerSet pendingReviewers;
-  private ReviewerByEmailSet pendingReviewersByEmail;
-  private List<ReviewerStatusUpdate> reviewerUpdates;
-  private PersonIdent author;
-  private PersonIdent committer;
-  private int parentCount;
-  private Integer unresolvedCommentCount;
-  private LabelTypes labelTypes;
-
-  private ImmutableList<byte[]> refStates;
-  private ImmutableList<byte[]> refStatePatterns;
-
-  @Inject
-  private ChangeData(
-      @Nullable StarredChangesUtil starredChangesUtil,
-      ApprovalsUtil approvalsUtil,
-      AllUsersName allUsersName,
-      ChangeMessagesUtil cmUtil,
-      ChangeNotes.Factory notesFactory,
-      CommentsUtil commentsUtil,
-      GitRepositoryManager repoManager,
-      IdentifiedUser.GenericFactory userFactory,
-      MergeUtil.Factory mergeUtilFactory,
-      MergeabilityCache mergeabilityCache,
-      NotesMigration notesMigration,
-      PatchListCache patchListCache,
-      PatchSetUtil psUtil,
-      ProjectCache projectCache,
-      TrackingFooters trackingFooters,
-      GetPureRevert pureRevert,
-      SubmitRuleEvaluator.Factory submitRuleEvaluatorFactory,
-      @Assisted ReviewDb db,
-      @Assisted Project.NameKey project,
-      @Assisted Change.Id id,
-      @Assisted @Nullable Change change,
-      @Assisted @Nullable ChangeNotes notes) {
-    this.approvalsUtil = approvalsUtil;
-    this.allUsersName = allUsersName;
-    this.cmUtil = cmUtil;
-    this.notesFactory = notesFactory;
-    this.commentsUtil = commentsUtil;
-    this.repoManager = repoManager;
-    this.userFactory = userFactory;
-    this.mergeUtilFactory = mergeUtilFactory;
-    this.mergeabilityCache = mergeabilityCache;
-    this.notesMigration = notesMigration;
-    this.patchListCache = patchListCache;
-    this.psUtil = psUtil;
-    this.projectCache = projectCache;
-    this.starredChangesUtil = starredChangesUtil;
-    this.trackingFooters = trackingFooters;
-    this.pureRevert = pureRevert;
-    this.submitRuleEvaluatorFactory = submitRuleEvaluatorFactory;
-
-    // May be null in tests when created via createForTest above, in which case lazy-loading will
-    // intentionally fail with NPE. Still not marked @Nullable in the constructor, to force callers
-    // using Guice to pass a non-null value.
-    this.db = db;
-
-    this.project = project;
-    this.legacyId = id;
-
-    this.change = change;
-    this.notes = notes;
-  }
-
-  public ChangeData setLazyLoad(boolean load) {
-    lazyLoad = load;
-    return this;
-  }
-
-  public ReviewDb db() {
-    return db;
-  }
-
-  public AllUsersName getAllUsersNameForIndexing() {
-    return allUsersName;
-  }
-
-  public void setCurrentFilePaths(List<String> filePaths) throws OrmException {
-    PatchSet ps = currentPatchSet();
-    if (ps != null) {
-      currentFiles = ImmutableList.copyOf(filePaths);
-    }
-  }
-
-  public List<String> currentFilePaths() throws IOException, OrmException {
-    if (currentFiles == null) {
-      if (!lazyLoad) {
-        return Collections.emptyList();
-      }
-      Optional<DiffSummary> p = getDiffSummary();
-      currentFiles = p.map(DiffSummary::getPaths).orElse(Collections.emptyList());
-    }
-    return currentFiles;
-  }
-
-  private Optional<DiffSummary> getDiffSummary() throws OrmException, IOException {
-    if (diffSummary == null) {
-      if (!lazyLoad) {
-        return Optional.empty();
-      }
-
-      Change c = change();
-      PatchSet ps = currentPatchSet();
-      if (c == null || ps == null || !loadCommitData()) {
-        return Optional.empty();
-      }
-
-      ObjectId id = ObjectId.fromString(ps.getRevision().get());
-      Whitespace ws = Whitespace.IGNORE_NONE;
-      PatchListKey pk =
-          parentCount > 1
-              ? PatchListKey.againstParentNum(1, id, ws)
-              : PatchListKey.againstDefaultBase(id, ws);
-      DiffSummaryKey key = DiffSummaryKey.fromPatchListKey(pk);
-      try {
-        diffSummary = Optional.of(patchListCache.getDiffSummary(key, c.getProject()));
-      } catch (PatchListNotAvailableException e) {
-        diffSummary = Optional.empty();
-      }
-    }
-    return diffSummary;
-  }
-
-  private Optional<ChangedLines> computeChangedLines() throws OrmException, IOException {
-    Optional<DiffSummary> ds = getDiffSummary();
-    if (ds.isPresent()) {
-      return Optional.of(ds.get().getChangedLines());
-    }
-    return Optional.empty();
-  }
-
-  public Optional<ChangedLines> changedLines() throws OrmException, IOException {
-    if (changedLines == null) {
-      if (!lazyLoad) {
-        return Optional.empty();
-      }
-      changedLines = computeChangedLines();
-    }
-    return changedLines;
-  }
-
-  public void setChangedLines(int insertions, int deletions) {
-    changedLines = Optional.of(new ChangedLines(insertions, deletions));
-  }
-
-  public void setNoChangedLines() {
-    changedLines = Optional.empty();
-  }
-
-  public Change.Id getId() {
-    return legacyId;
-  }
-
-  public Project.NameKey project() {
-    return project;
-  }
-
-  boolean fastIsVisibleTo(CurrentUser user) {
-    return visibleTo == user;
-  }
-
-  void cacheVisibleTo(CurrentUser user) {
-    visibleTo = user;
-  }
-
-  public Change change() throws OrmException {
-    if (change == null && lazyLoad) {
-      reloadChange();
-    }
-    return change;
-  }
-
-  public void setChange(Change c) {
-    change = c;
-  }
-
-  public Change reloadChange() throws OrmException {
-    try {
-      notes = notesFactory.createChecked(db, project, legacyId);
-    } catch (NoSuchChangeException e) {
-      throw new OrmException("Unable to load change " + legacyId, e);
-    }
-    change = notes.getChange();
-    setPatchSets(null);
-    return change;
-  }
-
-  public LabelTypes getLabelTypes() throws OrmException {
-    if (labelTypes == null) {
-      ProjectState state;
-      try {
-        state = projectCache.checkedGet(project());
-      } catch (IOException e) {
-        throw new OrmException("project state not available", e);
-      }
-      labelTypes = state.getLabelTypes(change().getDest(), userFactory.create(change().getOwner()));
-    }
-    return labelTypes;
-  }
-
-  public ChangeNotes notes() throws OrmException {
-    if (notes == null) {
-      if (!lazyLoad) {
-        throw new OrmException("ChangeNotes not available, lazyLoad = false");
-      }
-      notes = notesFactory.create(db, project(), legacyId);
-    }
-    return notes;
-  }
-
-  public PatchSet currentPatchSet() throws OrmException {
-    if (currentPatchSet == null) {
-      Change c = change();
-      if (c == null) {
-        return null;
-      }
-      for (PatchSet p : patchSets()) {
-        if (p.getId().equals(c.currentPatchSetId())) {
-          currentPatchSet = p;
-          return p;
-        }
-      }
-    }
-    return currentPatchSet;
-  }
-
-  public List<PatchSetApproval> currentApprovals() throws OrmException {
-    if (currentApprovals == null) {
-      if (!lazyLoad) {
-        return Collections.emptyList();
-      }
-      Change c = change();
-      if (c == null) {
-        currentApprovals = Collections.emptyList();
-      } else {
-        try {
-          currentApprovals =
-              ImmutableList.copyOf(
-                  approvalsUtil.byPatchSet(
-                      db,
-                      notes(),
-                      userFactory.create(c.getOwner()),
-                      c.currentPatchSetId(),
-                      null,
-                      null));
-        } catch (OrmException e) {
-          if (e.getCause() instanceof NoSuchChangeException) {
-            currentApprovals = Collections.emptyList();
-          } else {
-            throw e;
-          }
-        }
-      }
-    }
-    return currentApprovals;
-  }
-
-  public void setCurrentApprovals(List<PatchSetApproval> approvals) {
-    currentApprovals = approvals;
-  }
-
-  public String commitMessage() throws IOException, OrmException {
-    if (commitMessage == null) {
-      if (!loadCommitData()) {
-        return null;
-      }
-    }
-    return commitMessage;
-  }
-
-  public List<FooterLine> commitFooters() throws IOException, OrmException {
-    if (commitFooters == null) {
-      if (!loadCommitData()) {
-        return null;
-      }
-    }
-    return commitFooters;
-  }
-
-  public ListMultimap<String, String> trackingFooters() throws IOException, OrmException {
-    return trackingFooters.extract(commitFooters());
-  }
-
-  public PersonIdent getAuthor() throws IOException, OrmException {
-    if (author == null) {
-      if (!loadCommitData()) {
-        return null;
-      }
-    }
-    return author;
-  }
-
-  public PersonIdent getCommitter() throws IOException, OrmException {
-    if (committer == null) {
-      if (!loadCommitData()) {
-        return null;
-      }
-    }
-    return committer;
-  }
-
-  private boolean loadCommitData()
-      throws OrmException, RepositoryNotFoundException, IOException, MissingObjectException,
-          IncorrectObjectTypeException {
-    PatchSet ps = currentPatchSet();
-    if (ps == null) {
-      return false;
-    }
-    String sha1 = ps.getRevision().get();
-    try (Repository repo = repoManager.openRepository(project());
-        RevWalk walk = new RevWalk(repo)) {
-      RevCommit c = walk.parseCommit(ObjectId.fromString(sha1));
-      commitMessage = c.getFullMessage();
-      commitFooters = c.getFooterLines();
-      author = c.getAuthorIdent();
-      committer = c.getCommitterIdent();
-      parentCount = c.getParentCount();
-    }
-    return true;
-  }
-
-  /**
-   * @return patches for the change, in patch set ID order.
-   * @throws OrmException an error occurred reading the database.
-   */
-  public Collection<PatchSet> patchSets() throws OrmException {
-    if (patchSets == null) {
-      patchSets = psUtil.byChange(db, notes());
-    }
-    return patchSets;
-  }
-
-  public void setPatchSets(Collection<PatchSet> patchSets) {
-    this.currentPatchSet = null;
-    this.patchSets = patchSets;
-  }
-
-  /**
-   * @return patch with the given ID, or null if it does not exist.
-   * @throws OrmException an error occurred reading the database.
-   */
-  public PatchSet patchSet(PatchSet.Id psId) throws OrmException {
-    if (currentPatchSet != null && currentPatchSet.getId().equals(psId)) {
-      return currentPatchSet;
-    }
-    for (PatchSet ps : patchSets()) {
-      if (ps.getId().equals(psId)) {
-        return ps;
-      }
-    }
-    return null;
-  }
-
-  /**
-   * @return all patch set approvals for the change, keyed by ID, ordered by timestamp within each
-   *     patch set.
-   * @throws OrmException an error occurred reading the database.
-   */
-  public ListMultimap<PatchSet.Id, PatchSetApproval> approvals() throws OrmException {
-    if (allApprovals == null) {
-      if (!lazyLoad) {
-        return ImmutableListMultimap.of();
-      }
-      allApprovals = approvalsUtil.byChange(db, notes());
-    }
-    return allApprovals;
-  }
-
-  /**
-   * @return The submit ('SUBM') approval label
-   * @throws OrmException an error occurred reading the database.
-   */
-  public Optional<PatchSetApproval> getSubmitApproval() throws OrmException {
-    return currentApprovals().stream().filter(PatchSetApproval::isLegacySubmit).findFirst();
-  }
-
-  public ReviewerSet reviewers() throws OrmException {
-    if (reviewers == null) {
-      if (!lazyLoad) {
-        return ReviewerSet.empty();
-      }
-      reviewers = approvalsUtil.getReviewers(notes(), approvals().values());
-    }
-    return reviewers;
-  }
-
-  public void setReviewers(ReviewerSet reviewers) {
-    this.reviewers = reviewers;
-  }
-
-  public ReviewerSet getReviewers() {
-    return reviewers;
-  }
-
-  public ReviewerByEmailSet reviewersByEmail() throws OrmException {
-    if (reviewersByEmail == null) {
-      if (!lazyLoad) {
-        return ReviewerByEmailSet.empty();
-      }
-      reviewersByEmail = notes().getReviewersByEmail();
-    }
-    return reviewersByEmail;
-  }
-
-  public void setReviewersByEmail(ReviewerByEmailSet reviewersByEmail) {
-    this.reviewersByEmail = reviewersByEmail;
-  }
-
-  public ReviewerByEmailSet getReviewersByEmail() {
-    return reviewersByEmail;
-  }
-
-  public void setPendingReviewers(ReviewerSet pendingReviewers) {
-    this.pendingReviewers = pendingReviewers;
-  }
-
-  public ReviewerSet getPendingReviewers() {
-    return this.pendingReviewers;
-  }
-
-  public ReviewerSet pendingReviewers() throws OrmException {
-    if (pendingReviewers == null) {
-      if (!lazyLoad) {
-        return ReviewerSet.empty();
-      }
-      pendingReviewers = notes().getPendingReviewers();
-    }
-    return pendingReviewers;
-  }
-
-  public void setPendingReviewersByEmail(ReviewerByEmailSet pendingReviewersByEmail) {
-    this.pendingReviewersByEmail = pendingReviewersByEmail;
-  }
-
-  public ReviewerByEmailSet getPendingReviewersByEmail() {
-    return pendingReviewersByEmail;
-  }
-
-  public ReviewerByEmailSet pendingReviewersByEmail() throws OrmException {
-    if (pendingReviewersByEmail == null) {
-      if (!lazyLoad) {
-        return ReviewerByEmailSet.empty();
-      }
-      pendingReviewersByEmail = notes().getPendingReviewersByEmail();
-    }
-    return pendingReviewersByEmail;
-  }
-
-  public List<ReviewerStatusUpdate> reviewerUpdates() throws OrmException {
-    if (reviewerUpdates == null) {
-      if (!lazyLoad) {
-        return Collections.emptyList();
-      }
-      reviewerUpdates = approvalsUtil.getReviewerUpdates(notes());
-    }
-    return reviewerUpdates;
-  }
-
-  public void setReviewerUpdates(List<ReviewerStatusUpdate> reviewerUpdates) {
-    this.reviewerUpdates = reviewerUpdates;
-  }
-
-  public List<ReviewerStatusUpdate> getReviewerUpdates() {
-    return reviewerUpdates;
-  }
-
-  public Collection<Comment> publishedComments() throws OrmException {
-    if (publishedComments == null) {
-      if (!lazyLoad) {
-        return Collections.emptyList();
-      }
-      publishedComments = commentsUtil.publishedByChange(db, notes());
-    }
-    return publishedComments;
-  }
-
-  public Collection<RobotComment> robotComments() throws OrmException {
-    if (robotComments == null) {
-      if (!lazyLoad) {
-        return Collections.emptyList();
-      }
-      robotComments = commentsUtil.robotCommentsByChange(notes());
-    }
-    return robotComments;
-  }
-
-  public Integer unresolvedCommentCount() throws OrmException {
-    if (unresolvedCommentCount == null) {
-      if (!lazyLoad) {
-        return null;
-      }
-
-      List<Comment> comments =
-          Stream.concat(publishedComments().stream(), robotComments().stream()).collect(toList());
-
-      // Build a map of uuid to list of direct descendants.
-      Map<String, List<Comment>> forest = new HashMap<>();
-      for (Comment comment : comments) {
-        List<Comment> siblings = forest.get(comment.parentUuid);
-        if (siblings == null) {
-          siblings = new ArrayList<>();
-          forest.put(comment.parentUuid, siblings);
-        }
-        siblings.add(comment);
-      }
-
-      // Find latest comment in each thread and apply to unresolved counter.
-      int unresolved = 0;
-      if (forest.containsKey(null)) {
-        for (Comment root : forest.get(null)) {
-          if (getLatestComment(forest, root).unresolved) {
-            unresolved++;
-          }
-        }
-      }
-      unresolvedCommentCount = unresolved;
-    }
-
-    return unresolvedCommentCount;
-  }
-
-  protected Comment getLatestComment(Map<String, List<Comment>> forest, Comment root) {
-    List<Comment> children = forest.get(root.key.uuid);
-    if (children == null) {
-      return root;
-    }
-    Comment latest = null;
-    for (Comment comment : children) {
-      Comment branchLatest = getLatestComment(forest, comment);
-      if (latest == null || branchLatest.writtenOn.after(latest.writtenOn)) {
-        latest = branchLatest;
-      }
-    }
-    return latest;
-  }
-
-  public void setUnresolvedCommentCount(Integer count) {
-    this.unresolvedCommentCount = count;
-  }
-
-  public List<ChangeMessage> messages() throws OrmException {
-    if (messages == null) {
-      if (!lazyLoad) {
-        return Collections.emptyList();
-      }
-      messages = cmUtil.byChange(db, notes());
-    }
-    return messages;
-  }
-
-  public List<SubmitRecord> submitRecords(SubmitRuleOptions options) throws OrmException {
-    List<SubmitRecord> records = submitRecords.get(options);
-    if (records == null) {
-      if (!lazyLoad) {
-        return Collections.emptyList();
-      }
-      records =
-          submitRuleEvaluatorFactory
-              .create(userFactory.create(change().getOwner()), this)
-              .setOptions(options)
-              .evaluate();
-      submitRecords.put(options, records);
-    }
-    return records;
-  }
-
-  @Nullable
-  public List<SubmitRecord> getSubmitRecords(SubmitRuleOptions options) {
-    return submitRecords.get(options);
-  }
-
-  public void setSubmitRecords(SubmitRuleOptions options, List<SubmitRecord> records) {
-    submitRecords.put(options, records);
-  }
-
-  public SubmitTypeRecord submitTypeRecord() throws OrmException {
-    if (submitTypeRecord == null) {
-      submitTypeRecord =
-          submitRuleEvaluatorFactory
-              .create(userFactory.create(change().getOwner()), this)
-              .getSubmitType();
-    }
-    return submitTypeRecord;
-  }
-
-  public void setMergeable(Boolean mergeable) {
-    this.mergeable = mergeable;
-  }
-
-  public Boolean isMergeable() throws OrmException {
-    if (mergeable == null) {
-      Change c = change();
-      if (c == null) {
-        return null;
-      }
-      if (c.getStatus() == Change.Status.MERGED) {
-        mergeable = true;
-      } else if (c.getStatus() == Change.Status.ABANDONED) {
-        return null;
-      } else if (c.isWorkInProgress()) {
-        return null;
-      } else {
-        if (!lazyLoad) {
-          return null;
-        }
-        PatchSet ps = currentPatchSet();
-        if (ps == null) {
-          return null;
-        }
-
-        try (Repository repo = repoManager.openRepository(project())) {
-          Ref ref = repo.getRefDatabase().exactRef(c.getDest().get());
-          SubmitTypeRecord str = submitTypeRecord();
-          if (!str.isOk()) {
-            // If submit type rules are broken, it's definitely not mergeable.
-            // No need to log, as SubmitRuleEvaluator already did it for us.
-            return false;
-          }
-          String mergeStrategy =
-              mergeUtilFactory.create(projectCache.get(project())).mergeStrategyName();
-          mergeable =
-              mergeabilityCache.get(
-                  ObjectId.fromString(ps.getRevision().get()),
-                  ref,
-                  str.type,
-                  mergeStrategy,
-                  c.getDest(),
-                  repo);
-        } catch (IOException e) {
-          throw new OrmException(e);
-        }
-      }
-    }
-    return mergeable;
-  }
-
-  public Set<Account.Id> editsByUser() throws OrmException {
-    return editRefs().keySet();
-  }
-
-  public Map<Account.Id, Ref> editRefs() throws OrmException {
-    if (editsByUser == null) {
-      if (!lazyLoad) {
-        return Collections.emptyMap();
-      }
-      Change c = change();
-      if (c == null) {
-        return Collections.emptyMap();
-      }
-      editsByUser = new HashMap<>();
-      Change.Id id = checkNotNull(change.getId());
-      try (Repository repo = repoManager.openRepository(project())) {
-        for (Map.Entry<String, Ref> e :
-            repo.getRefDatabase().getRefs(RefNames.REFS_USERS).entrySet()) {
-          if (id.equals(Change.Id.fromEditRefPart(e.getKey()))) {
-            editsByUser.put(Account.Id.fromRefPart(e.getKey()), e.getValue());
-          }
-        }
-      } catch (IOException e) {
-        throw new OrmException(e);
-      }
-    }
-    return editsByUser;
-  }
-
-  public Set<Account.Id> draftsByUser() throws OrmException {
-    return draftRefs().keySet();
-  }
-
-  public Map<Account.Id, Ref> draftRefs() throws OrmException {
-    if (draftsByUser == null) {
-      if (!lazyLoad) {
-        return Collections.emptyMap();
-      }
-      Change c = change();
-      if (c == null) {
-        return Collections.emptyMap();
-      }
-
-      draftsByUser = new HashMap<>();
-      if (notesMigration.readChanges()) {
-        for (Ref ref : commentsUtil.getDraftRefs(notes.getChangeId())) {
-          Account.Id account = Account.Id.fromRefSuffix(ref.getName());
-          if (account != null
-              // Double-check that any drafts exist for this user after
-              // filtering out zombies. If some but not all drafts in the ref
-              // were zombies, the returned Ref still includes those zombies;
-              // this is suboptimal, but is ok for the purposes of
-              // draftsByUser(), and easier than trying to rebuild the change at
-              // this point.
-              && !notes().getDraftComments(account, ref).isEmpty()) {
-            draftsByUser.put(account, ref);
-          }
-        }
-      } else {
-        for (Comment sc : commentsUtil.draftByChange(db, notes())) {
-          draftsByUser.put(sc.author.getId(), null);
-        }
-      }
-    }
-    return draftsByUser;
-  }
-
-  public boolean isReviewedBy(Account.Id accountId) throws OrmException {
-    Collection<String> stars = stars(accountId);
-
-    PatchSet ps = currentPatchSet();
-    if (ps != null) {
-      if (stars.contains(StarredChangesUtil.REVIEWED_LABEL + "/" + ps.getPatchSetId())) {
-        return true;
-      }
-
-      if (stars.contains(StarredChangesUtil.UNREVIEWED_LABEL + "/" + ps.getPatchSetId())) {
-        return false;
-      }
-    }
-
-    return reviewedBy().contains(accountId);
-  }
-
-  public Set<Account.Id> reviewedBy() throws OrmException {
-    if (reviewedBy == null) {
-      if (!lazyLoad) {
-        return Collections.emptySet();
-      }
-      Change c = change();
-      if (c == null) {
-        return Collections.emptySet();
-      }
-      List<ReviewedByEvent> events = new ArrayList<>();
-      for (ChangeMessage msg : messages()) {
-        if (msg.getAuthor() != null) {
-          events.add(ReviewedByEvent.create(msg));
-        }
-      }
-      events = Lists.reverse(events);
-      reviewedBy = new LinkedHashSet<>();
-      Account.Id owner = c.getOwner();
-      for (ReviewedByEvent event : events) {
-        if (owner.equals(event.author())) {
-          break;
-        }
-        reviewedBy.add(event.author());
-      }
-    }
-    return reviewedBy;
-  }
-
-  public void setReviewedBy(Set<Account.Id> reviewedBy) {
-    this.reviewedBy = reviewedBy;
-  }
-
-  public Set<String> hashtags() throws OrmException {
-    if (hashtags == null) {
-      if (!lazyLoad) {
-        return Collections.emptySet();
-      }
-      hashtags = notes().getHashtags();
-    }
-    return hashtags;
-  }
-
-  public void setHashtags(Set<String> hashtags) {
-    this.hashtags = hashtags;
-  }
-
-  public ImmutableListMultimap<Account.Id, String> stars() throws OrmException {
-    if (stars == null) {
-      if (!lazyLoad) {
-        return ImmutableListMultimap.of();
-      }
-      ImmutableListMultimap.Builder<Account.Id, String> b = ImmutableListMultimap.builder();
-      for (Map.Entry<Account.Id, StarRef> e : starRefs().entrySet()) {
-        b.putAll(e.getKey(), e.getValue().labels());
-      }
-      return b.build();
-    }
-    return stars;
-  }
-
-  public void setStars(ListMultimap<Account.Id, String> stars) {
-    this.stars = ImmutableListMultimap.copyOf(stars);
-  }
-
-  public ImmutableMap<Account.Id, StarRef> starRefs() throws OrmException {
-    if (starRefs == null) {
-      if (!lazyLoad) {
-        return ImmutableMap.of();
-      }
-      starRefs = checkNotNull(starredChangesUtil).byChange(legacyId);
-    }
-    return starRefs;
-  }
-
-  public Set<String> stars(Account.Id accountId) throws OrmException {
-    if (starsOf != null) {
-      if (!starsOf.accountId().equals(accountId)) {
-        starsOf = null;
-      }
-    }
-    if (starsOf == null) {
-      if (stars != null) {
-        starsOf = StarsOf.create(accountId, stars.get(accountId));
-      } else {
-        if (!lazyLoad) {
-          return ImmutableSet.of();
-        }
-        starsOf = StarsOf.create(accountId, starredChangesUtil.getLabels(accountId, legacyId));
-      }
-    }
-    return starsOf.stars();
-  }
-
-  /**
-   * @return {@code null} if {@code revertOf} is {@code null}; true if the change is a pure revert;
-   *     false otherwise.
-   */
-  @Nullable
-  public Boolean isPureRevert() throws OrmException {
-    if (change().getRevertOf() == null) {
-      return null;
-    }
-    try {
-      return pureRevert.getPureRevert(notes()).isPureRevert;
-    } catch (IOException | BadRequestException | ResourceConflictException e) {
-      throw new OrmException("could not compute pure revert", e);
-    }
-  }
-
-  @Override
-  public String toString() {
-    MoreObjects.ToStringHelper h = MoreObjects.toStringHelper(this);
-    if (change != null) {
-      h.addValue(change);
-    } else {
-      h.addValue(legacyId);
-    }
-    return h.toString();
-  }
-
-  public static class ChangedLines {
-    public final int insertions;
-    public final int deletions;
-
-    public ChangedLines(int insertions, int deletions) {
-      this.insertions = insertions;
-      this.deletions = deletions;
-    }
-  }
-
-  public ImmutableList<byte[]> getRefStates() {
-    return refStates;
-  }
-
-  public void setRefStates(Iterable<byte[]> refStates) {
-    this.refStates = ImmutableList.copyOf(refStates);
-  }
-
-  public ImmutableList<byte[]> getRefStatePatterns() {
-    return refStatePatterns;
-  }
-
-  public void setRefStatePatterns(Iterable<byte[]> refStatePatterns) {
-    this.refStatePatterns = ImmutableList.copyOf(refStatePatterns);
-  }
-
-  @AutoValue
-  abstract static class ReviewedByEvent {
-    private static ReviewedByEvent create(ChangeMessage msg) {
-      return new AutoValue_ChangeData_ReviewedByEvent(msg.getAuthor(), msg.getWrittenOn());
-    }
-
-    public abstract Account.Id author();
-
-    public abstract Timestamp ts();
-  }
-
-  @AutoValue
-  abstract static class StarsOf {
-    private static StarsOf create(Account.Id accountId, Iterable<String> stars) {
-      return new AutoValue_ChangeData_StarsOf(accountId, ImmutableSortedSet.copyOf(stars));
-    }
-
-    public abstract Account.Id accountId();
-
-    public abstract ImmutableSortedSet<String> stars();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeIsVisibleToPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeIsVisibleToPredicate.java
deleted file mode 100644
index 3ed7e0c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeIsVisibleToPredicate.java
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.server.query.change;
-
-import com.google.gerrit.index.query.IsVisibleToPredicate;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.index.IndexUtils;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Provider;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ChangeIsVisibleToPredicate extends IsVisibleToPredicate<ChangeData> {
-  private static final Logger log = LoggerFactory.getLogger(ChangeIsVisibleToPredicate.class);
-
-  protected final Provider<ReviewDb> db;
-  protected final ChangeNotes.Factory notesFactory;
-  protected final CurrentUser user;
-  protected final PermissionBackend permissionBackend;
-
-  public ChangeIsVisibleToPredicate(
-      Provider<ReviewDb> db,
-      ChangeNotes.Factory notesFactory,
-      CurrentUser user,
-      PermissionBackend permissionBackend) {
-    super(ChangeQueryBuilder.FIELD_VISIBLETO, IndexUtils.describe(user));
-    this.db = db;
-    this.notesFactory = notesFactory;
-    this.user = user;
-    this.permissionBackend = permissionBackend;
-  }
-
-  @Override
-  public boolean match(ChangeData cd) throws OrmException {
-    if (cd.fastIsVisibleTo(user)) {
-      return true;
-    }
-    Change change = cd.change();
-    if (change == null) {
-      return false;
-    }
-
-    ChangeNotes notes = notesFactory.createFromIndexedChange(change);
-    boolean visible;
-    try {
-      visible =
-          permissionBackend
-              .user(user)
-              .indexedChange(cd, notes)
-              .database(db)
-              .test(ChangePermission.READ);
-    } catch (PermissionBackendException e) {
-      Throwable cause = e.getCause();
-      if (cause instanceof RepositoryNotFoundException) {
-        log.warn(
-            "Skipping change {} because the corresponding repository was not found", cd.getId(), e);
-        return false;
-      }
-      throw new OrmException("unable to check permissions on change " + cd.getId(), e);
-    }
-    if (visible) {
-      cd.cacheVisibleTo(user);
-      return true;
-    }
-    return false;
-  }
-
-  @Override
-  public int getCost() {
-    return 1;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeOperatorPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeOperatorPredicate.java
deleted file mode 100644
index 8b08536..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeOperatorPredicate.java
+++ /dev/null
@@ -1,26 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.query.change;
-
-import com.google.gerrit.index.query.Matchable;
-import com.google.gerrit.index.query.OperatorPredicate;
-
-public abstract class ChangeOperatorPredicate extends OperatorPredicate<ChangeData>
-    implements Matchable<ChangeData> {
-
-  protected ChangeOperatorPredicate(String name, String value) {
-    super(name, value);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
deleted file mode 100644
index 5aca6b4..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
+++ /dev/null
@@ -1,1337 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.query.change;
-
-import static com.google.gerrit.reviewdb.client.Change.CHANGE_ID_PATTERN;
-import static com.google.gerrit.server.query.change.ChangeData.asChanges;
-import static java.util.stream.Collectors.toList;
-import static java.util.stream.Collectors.toSet;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Enums;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.primitives.Ints;
-import com.google.gerrit.common.data.GroupDescription;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.common.data.SubmitRecord;
-import com.google.gerrit.common.errors.NotSignedInException;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.index.IndexConfig;
-import com.google.gerrit.index.Schema;
-import com.google.gerrit.index.SchemaUtil;
-import com.google.gerrit.index.query.LimitPredicate;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.index.query.QueryBuilder;
-import com.google.gerrit.index.query.QueryParseException;
-import com.google.gerrit.index.query.QueryRequiresAuthException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CommentsUtil;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.StarredChangesUtil;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.AccountResolver;
-import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.GroupBackends;
-import com.google.gerrit.server.account.VersionedAccountDestinations;
-import com.google.gerrit.server.account.VersionedAccountQueries;
-import com.google.gerrit.server.change.ChangeTriplet;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.strategy.SubmitDryRun;
-import com.google.gerrit.server.group.ListMembers;
-import com.google.gerrit.server.index.change.ChangeField;
-import com.google.gerrit.server.index.change.ChangeIndex;
-import com.google.gerrit.server.index.change.ChangeIndexCollection;
-import com.google.gerrit.server.index.change.ChangeIndexRewriter;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.NotesMigration;
-import com.google.gerrit.server.notedb.ReviewerStateInternal;
-import com.google.gerrit.server.patch.PatchListCache;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.project.ListChildProjects;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.ProvisionException;
-import com.google.inject.util.Providers;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-import java.util.function.Function;
-import java.util.regex.Pattern;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.Repository;
-
-/** Parses a query string meant to be applied to change objects. */
-public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
-  public interface ChangeOperatorFactory extends OperatorFactory<ChangeData, ChangeQueryBuilder> {}
-
-  /**
-   * Converts a operand (operator value) passed to an operator into a {@link Predicate}.
-   *
-   * <p>Register a ChangeOperandFactory in a config Module like this (note, for an example we are
-   * using the has predicate, when other predicate plugin operands are created they can be
-   * registered in a similar manner):
-   *
-   * <p>bind(ChangeHasOperandFactory.class) .annotatedWith(Exports.named("your has operand"))
-   * .to(YourClass.class);
-   */
-  private interface ChangeOperandFactory {
-    Predicate<ChangeData> create(ChangeQueryBuilder builder) throws QueryParseException;
-  }
-
-  public interface ChangeHasOperandFactory extends ChangeOperandFactory {}
-
-  private static final Pattern PAT_LEGACY_ID = Pattern.compile("^[1-9][0-9]*$");
-  private static final Pattern PAT_CHANGE_ID = Pattern.compile(CHANGE_ID_PATTERN);
-  private static final Pattern DEF_CHANGE =
-      Pattern.compile("^(?:[1-9][0-9]*|(?:[^~]+~[^~]+~)?[iI][0-9a-f]{4,}.*)$");
-
-  static final int MAX_ACCOUNTS_PER_DEFAULT_FIELD = 10;
-
-  // NOTE: As new search operations are added, please keep the
-  // SearchSuggestOracle up to date.
-
-  public static final String FIELD_ADDED = "added";
-  public static final String FIELD_AGE = "age";
-  public static final String FIELD_ASSIGNEE = "assignee";
-  public static final String FIELD_AUTHOR = "author";
-  public static final String FIELD_EXACTAUTHOR = "exactauthor";
-  public static final String FIELD_BEFORE = "before";
-  public static final String FIELD_CHANGE = "change";
-  public static final String FIELD_CHANGE_ID = "change_id";
-  public static final String FIELD_COMMENT = "comment";
-  public static final String FIELD_COMMENTBY = "commentby";
-  public static final String FIELD_COMMIT = "commit";
-  public static final String FIELD_COMMITTER = "committer";
-  public static final String FIELD_EXACTCOMMITTER = "exactcommitter";
-  public static final String FIELD_CONFLICTS = "conflicts";
-  public static final String FIELD_DELETED = "deleted";
-  public static final String FIELD_DELTA = "delta";
-  public static final String FIELD_DESTINATION = "destination";
-  public static final String FIELD_DRAFTBY = "draftby";
-  public static final String FIELD_EDITBY = "editby";
-  public static final String FIELD_EXACTCOMMIT = "exactcommit";
-  public static final String FIELD_FILE = "file";
-  public static final String FIELD_FILEPART = "filepart";
-  public static final String FIELD_GROUP = "group";
-  public static final String FIELD_HASHTAG = "hashtag";
-  public static final String FIELD_LABEL = "label";
-  public static final String FIELD_LIMIT = "limit";
-  public static final String FIELD_MERGE = "merge";
-  public static final String FIELD_MERGEABLE = "mergeable2";
-  public static final String FIELD_MESSAGE = "message";
-  public static final String FIELD_OWNER = "owner";
-  public static final String FIELD_OWNERIN = "ownerin";
-  public static final String FIELD_PARENTPROJECT = "parentproject";
-  public static final String FIELD_PATH = "path";
-  public static final String FIELD_PENDING_REVIEWER = "pendingreviewer";
-  public static final String FIELD_PENDING_REVIEWER_BY_EMAIL = "pendingreviewerbyemail";
-  public static final String FIELD_PRIVATE = "private";
-  public static final String FIELD_PROJECT = "project";
-  public static final String FIELD_PROJECTS = "projects";
-  public static final String FIELD_REF = "ref";
-  public static final String FIELD_REVIEWEDBY = "reviewedby";
-  public static final String FIELD_REVIEWER = "reviewer";
-  public static final String FIELD_REVIEWERIN = "reviewerin";
-  public static final String FIELD_STAR = "star";
-  public static final String FIELD_STARBY = "starby";
-  public static final String FIELD_STARREDBY = "starredby";
-  public static final String FIELD_STARTED = "started";
-  public static final String FIELD_STATUS = "status";
-  public static final String FIELD_SUBMISSIONID = "submissionid";
-  public static final String FIELD_TR = "tr";
-  public static final String FIELD_UNRESOLVED_COMMENT_COUNT = "unresolved";
-  public static final String FIELD_VISIBLETO = "visibleto";
-  public static final String FIELD_WATCHEDBY = "watchedby";
-  public static final String FIELD_WIP = "wip";
-  public static final String FIELD_REVERTOF = "revertof";
-
-  public static final String ARG_ID_USER = "user";
-  public static final String ARG_ID_GROUP = "group";
-  public static final String ARG_ID_OWNER = "owner";
-  public static final Account.Id OWNER_ACCOUNT_ID = new Account.Id(0);
-
-  private static final QueryBuilder.Definition<ChangeData, ChangeQueryBuilder> mydef =
-      new QueryBuilder.Definition<>(ChangeQueryBuilder.class);
-
-  @VisibleForTesting
-  public static class Arguments {
-    final AccountCache accountCache;
-    final AccountResolver accountResolver;
-    final AllProjectsName allProjectsName;
-    final AllUsersName allUsersName;
-    final PermissionBackend permissionBackend;
-    final ChangeData.Factory changeDataFactory;
-    final ChangeIndex index;
-    final ChangeIndexRewriter rewriter;
-    final ChangeNotes.Factory notesFactory;
-    final CommentsUtil commentsUtil;
-    final ConflictsCache conflictsCache;
-    final DynamicMap<ChangeHasOperandFactory> hasOperands;
-    final DynamicMap<ChangeOperatorFactory> opFactories;
-    final GitRepositoryManager repoManager;
-    final GroupBackend groupBackend;
-    final IdentifiedUser.GenericFactory userFactory;
-    final IndexConfig indexConfig;
-    final NotesMigration notesMigration;
-    final PatchListCache patchListCache;
-    final ProjectCache projectCache;
-    final Provider<InternalChangeQuery> queryProvider;
-    final Provider<ListChildProjects> listChildProjects;
-    final Provider<ListMembers> listMembers;
-    final Provider<ReviewDb> db;
-    final StarredChangesUtil starredChangesUtil;
-    final SubmitDryRun submitDryRun;
-
-    private final Provider<CurrentUser> self;
-
-    @Inject
-    @VisibleForTesting
-    public Arguments(
-        Provider<ReviewDb> db,
-        Provider<InternalChangeQuery> queryProvider,
-        ChangeIndexRewriter rewriter,
-        DynamicMap<ChangeOperatorFactory> opFactories,
-        DynamicMap<ChangeHasOperandFactory> hasOperands,
-        IdentifiedUser.GenericFactory userFactory,
-        Provider<CurrentUser> self,
-        PermissionBackend permissionBackend,
-        ChangeNotes.Factory notesFactory,
-        ChangeData.Factory changeDataFactory,
-        CommentsUtil commentsUtil,
-        AccountResolver accountResolver,
-        GroupBackend groupBackend,
-        AllProjectsName allProjectsName,
-        AllUsersName allUsersName,
-        PatchListCache patchListCache,
-        GitRepositoryManager repoManager,
-        ProjectCache projectCache,
-        Provider<ListChildProjects> listChildProjects,
-        ChangeIndexCollection indexes,
-        SubmitDryRun submitDryRun,
-        ConflictsCache conflictsCache,
-        IndexConfig indexConfig,
-        Provider<ListMembers> listMembers,
-        StarredChangesUtil starredChangesUtil,
-        AccountCache accountCache,
-        NotesMigration notesMigration) {
-      this(
-          db,
-          queryProvider,
-          rewriter,
-          opFactories,
-          hasOperands,
-          userFactory,
-          self,
-          permissionBackend,
-          notesFactory,
-          changeDataFactory,
-          commentsUtil,
-          accountResolver,
-          groupBackend,
-          allProjectsName,
-          allUsersName,
-          patchListCache,
-          repoManager,
-          projectCache,
-          listChildProjects,
-          submitDryRun,
-          conflictsCache,
-          indexes != null ? indexes.getSearchIndex() : null,
-          indexConfig,
-          listMembers,
-          starredChangesUtil,
-          accountCache,
-          notesMigration);
-    }
-
-    private Arguments(
-        Provider<ReviewDb> db,
-        Provider<InternalChangeQuery> queryProvider,
-        ChangeIndexRewriter rewriter,
-        DynamicMap<ChangeOperatorFactory> opFactories,
-        DynamicMap<ChangeHasOperandFactory> hasOperands,
-        IdentifiedUser.GenericFactory userFactory,
-        Provider<CurrentUser> self,
-        PermissionBackend permissionBackend,
-        ChangeNotes.Factory notesFactory,
-        ChangeData.Factory changeDataFactory,
-        CommentsUtil commentsUtil,
-        AccountResolver accountResolver,
-        GroupBackend groupBackend,
-        AllProjectsName allProjectsName,
-        AllUsersName allUsersName,
-        PatchListCache patchListCache,
-        GitRepositoryManager repoManager,
-        ProjectCache projectCache,
-        Provider<ListChildProjects> listChildProjects,
-        SubmitDryRun submitDryRun,
-        ConflictsCache conflictsCache,
-        ChangeIndex index,
-        IndexConfig indexConfig,
-        Provider<ListMembers> listMembers,
-        StarredChangesUtil starredChangesUtil,
-        AccountCache accountCache,
-        NotesMigration notesMigration) {
-      this.db = db;
-      this.queryProvider = queryProvider;
-      this.rewriter = rewriter;
-      this.opFactories = opFactories;
-      this.userFactory = userFactory;
-      this.self = self;
-      this.permissionBackend = permissionBackend;
-      this.notesFactory = notesFactory;
-      this.changeDataFactory = changeDataFactory;
-      this.commentsUtil = commentsUtil;
-      this.accountResolver = accountResolver;
-      this.groupBackend = groupBackend;
-      this.allProjectsName = allProjectsName;
-      this.allUsersName = allUsersName;
-      this.patchListCache = patchListCache;
-      this.repoManager = repoManager;
-      this.projectCache = projectCache;
-      this.listChildProjects = listChildProjects;
-      this.submitDryRun = submitDryRun;
-      this.conflictsCache = conflictsCache;
-      this.index = index;
-      this.indexConfig = indexConfig;
-      this.listMembers = listMembers;
-      this.starredChangesUtil = starredChangesUtil;
-      this.accountCache = accountCache;
-      this.hasOperands = hasOperands;
-      this.notesMigration = notesMigration;
-    }
-
-    Arguments asUser(CurrentUser otherUser) {
-      return new Arguments(
-          db,
-          queryProvider,
-          rewriter,
-          opFactories,
-          hasOperands,
-          userFactory,
-          Providers.of(otherUser),
-          permissionBackend,
-          notesFactory,
-          changeDataFactory,
-          commentsUtil,
-          accountResolver,
-          groupBackend,
-          allProjectsName,
-          allUsersName,
-          patchListCache,
-          repoManager,
-          projectCache,
-          listChildProjects,
-          submitDryRun,
-          conflictsCache,
-          index,
-          indexConfig,
-          listMembers,
-          starredChangesUtil,
-          accountCache,
-          notesMigration);
-    }
-
-    Arguments asUser(Account.Id otherId) {
-      try {
-        CurrentUser u = self.get();
-        if (u.isIdentifiedUser() && otherId.equals(u.getAccountId())) {
-          return this;
-        }
-      } catch (ProvisionException e) {
-        // Doesn't match current user, continue.
-      }
-      return asUser(userFactory.create(otherId));
-    }
-
-    IdentifiedUser getIdentifiedUser() throws QueryRequiresAuthException {
-      try {
-        CurrentUser u = getUser();
-        if (u.isIdentifiedUser()) {
-          return u.asIdentifiedUser();
-        }
-        throw new QueryRequiresAuthException(NotSignedInException.MESSAGE);
-      } catch (ProvisionException e) {
-        throw new QueryRequiresAuthException(NotSignedInException.MESSAGE, e);
-      }
-    }
-
-    CurrentUser getUser() throws QueryRequiresAuthException {
-      try {
-        return self.get();
-      } catch (ProvisionException e) {
-        throw new QueryRequiresAuthException(NotSignedInException.MESSAGE, e);
-      }
-    }
-
-    Schema<ChangeData> getSchema() {
-      return index != null ? index.getSchema() : null;
-    }
-  }
-
-  private final Arguments args;
-
-  @Inject
-  ChangeQueryBuilder(Arguments args) {
-    super(mydef);
-    this.args = args;
-    setupDynamicOperators();
-  }
-
-  @VisibleForTesting
-  protected ChangeQueryBuilder(
-      Definition<ChangeData, ? extends QueryBuilder<ChangeData>> def, Arguments args) {
-    super(def);
-    this.args = args;
-  }
-
-  private void setupDynamicOperators() {
-    for (DynamicMap.Entry<ChangeOperatorFactory> e : args.opFactories) {
-      String name = e.getExportName() + "_" + e.getPluginName();
-      opFactories.put(name, e.getProvider().get());
-    }
-  }
-
-  public Arguments getArgs() {
-    return args;
-  }
-
-  public ChangeQueryBuilder asUser(CurrentUser user) {
-    return new ChangeQueryBuilder(builderDef, args.asUser(user));
-  }
-
-  @Operator
-  public Predicate<ChangeData> age(String value) {
-    return new AgePredicate(value);
-  }
-
-  @Operator
-  public Predicate<ChangeData> before(String value) throws QueryParseException {
-    return new BeforePredicate(value);
-  }
-
-  @Operator
-  public Predicate<ChangeData> until(String value) throws QueryParseException {
-    return before(value);
-  }
-
-  @Operator
-  public Predicate<ChangeData> after(String value) throws QueryParseException {
-    return new AfterPredicate(value);
-  }
-
-  @Operator
-  public Predicate<ChangeData> since(String value) throws QueryParseException {
-    return after(value);
-  }
-
-  @Operator
-  public Predicate<ChangeData> change(String query) throws QueryParseException {
-    Optional<ChangeTriplet> triplet = ChangeTriplet.parse(query);
-    if (triplet.isPresent()) {
-      return Predicate.and(
-          project(triplet.get().project().get()),
-          branch(triplet.get().branch().get()),
-          new ChangeIdPredicate(parseChangeId(triplet.get().id().get())));
-    }
-    if (PAT_LEGACY_ID.matcher(query).matches()) {
-      return new LegacyChangeIdPredicate(Change.Id.parse(query));
-    } else if (PAT_CHANGE_ID.matcher(query).matches()) {
-      return new ChangeIdPredicate(parseChangeId(query));
-    }
-
-    throw new QueryParseException("Invalid change format");
-  }
-
-  @Operator
-  public Predicate<ChangeData> comment(String value) {
-    return new CommentPredicate(args.index, value);
-  }
-
-  @Operator
-  public Predicate<ChangeData> status(String statusName) {
-    if ("reviewed".equalsIgnoreCase(statusName)) {
-      return IsReviewedPredicate.create();
-    }
-    return ChangeStatusPredicate.parse(statusName);
-  }
-
-  public Predicate<ChangeData> status_open() {
-    return ChangeStatusPredicate.open();
-  }
-
-  @Operator
-  public Predicate<ChangeData> has(String value) throws QueryParseException {
-    if ("star".equalsIgnoreCase(value)) {
-      return starredby(self());
-    }
-
-    if ("stars".equalsIgnoreCase(value)) {
-      return new HasStarsPredicate(self());
-    }
-
-    if ("draft".equalsIgnoreCase(value)) {
-      return draftby(self());
-    }
-
-    if ("edit".equalsIgnoreCase(value)) {
-      return new EditByPredicate(self());
-    }
-
-    if ("unresolved".equalsIgnoreCase(value)) {
-      return new IsUnresolvedPredicate();
-    }
-
-    // for plugins the value will be operandName_pluginName
-    String[] names = value.split("_");
-    if (names.length == 2) {
-      ChangeHasOperandFactory op = args.hasOperands.get(names[1], names[0]);
-      if (op != null) {
-        return op.create(this);
-      }
-    }
-
-    throw new IllegalArgumentException();
-  }
-
-  @Operator
-  public Predicate<ChangeData> is(String value) throws QueryParseException {
-    if ("starred".equalsIgnoreCase(value)) {
-      return starredby(self());
-    }
-
-    if ("watched".equalsIgnoreCase(value)) {
-      return new IsWatchedByPredicate(args, false);
-    }
-
-    if ("visible".equalsIgnoreCase(value)) {
-      return is_visible();
-    }
-
-    if ("reviewed".equalsIgnoreCase(value)) {
-      return IsReviewedPredicate.create();
-    }
-
-    if ("owner".equalsIgnoreCase(value)) {
-      return new OwnerPredicate(self());
-    }
-
-    if ("reviewer".equalsIgnoreCase(value)) {
-      if (args.getSchema().hasField(ChangeField.WIP)) {
-        return Predicate.and(
-            Predicate.not(new BooleanPredicate(ChangeField.WIP)),
-            ReviewerPredicate.reviewer(args, self()));
-      }
-      return ReviewerPredicate.reviewer(args, self());
-    }
-
-    if ("cc".equalsIgnoreCase(value)) {
-      return ReviewerPredicate.cc(self());
-    }
-
-    if ("mergeable".equalsIgnoreCase(value)) {
-      return new BooleanPredicate(ChangeField.MERGEABLE);
-    }
-
-    if ("private".equalsIgnoreCase(value)) {
-      if (args.getSchema().hasField(ChangeField.PRIVATE)) {
-        return new BooleanPredicate(ChangeField.PRIVATE);
-      }
-      throw new QueryParseException(
-          "'is:private' operator is not supported by change index version");
-    }
-
-    if ("assigned".equalsIgnoreCase(value)) {
-      return Predicate.not(new AssigneePredicate(new Account.Id(ChangeField.NO_ASSIGNEE)));
-    }
-
-    if ("unassigned".equalsIgnoreCase(value)) {
-      return new AssigneePredicate(new Account.Id(ChangeField.NO_ASSIGNEE));
-    }
-
-    if ("submittable".equalsIgnoreCase(value)) {
-      return new SubmittablePredicate(SubmitRecord.Status.OK);
-    }
-
-    if ("ignored".equalsIgnoreCase(value)) {
-      return star("ignore");
-    }
-
-    if ("started".equalsIgnoreCase(value)) {
-      if (args.getSchema().hasField(ChangeField.STARTED)) {
-        return new BooleanPredicate(ChangeField.STARTED);
-      }
-      throw new QueryParseException(
-          "'is:started' operator is not supported by change index version");
-    }
-
-    if ("wip".equalsIgnoreCase(value)) {
-      if (args.getSchema().hasField(ChangeField.WIP)) {
-        return new BooleanPredicate(ChangeField.WIP);
-      }
-      throw new QueryParseException("'is:wip' operator is not supported by change index version");
-    }
-
-    return status(value);
-  }
-
-  @Operator
-  public Predicate<ChangeData> commit(String id) {
-    return new CommitPredicate(id);
-  }
-
-  @Operator
-  public Predicate<ChangeData> conflicts(String value) throws OrmException, QueryParseException {
-    List<Change> changes = parseChange(value);
-    List<Predicate<ChangeData>> or = new ArrayList<>(changes.size());
-    for (Change c : changes) {
-      or.add(ConflictsPredicate.create(args, value, c));
-    }
-    return Predicate.or(or);
-  }
-
-  @Operator
-  public Predicate<ChangeData> p(String name) {
-    return project(name);
-  }
-
-  @Operator
-  public Predicate<ChangeData> project(String name) {
-    if (name.startsWith("^")) {
-      return new RegexProjectPredicate(name);
-    }
-    return new ProjectPredicate(name);
-  }
-
-  @Operator
-  public Predicate<ChangeData> projects(String name) {
-    return new ProjectPrefixPredicate(name);
-  }
-
-  @Operator
-  public Predicate<ChangeData> parentproject(String name) {
-    return new ParentProjectPredicate(args.projectCache, args.listChildProjects, args.self, name);
-  }
-
-  @Operator
-  public Predicate<ChangeData> branch(String name) {
-    if (name.startsWith("^")) {
-      return ref("^" + RefNames.fullName(name.substring(1)));
-    }
-    return ref(RefNames.fullName(name));
-  }
-
-  @Operator
-  public Predicate<ChangeData> hashtag(String hashtag) {
-    return new HashtagPredicate(hashtag);
-  }
-
-  @Operator
-  public Predicate<ChangeData> topic(String name) {
-    return new ExactTopicPredicate(name);
-  }
-
-  @Operator
-  public Predicate<ChangeData> intopic(String name) {
-    if (name.startsWith("^")) {
-      return new RegexTopicPredicate(name);
-    }
-    if (name.isEmpty()) {
-      return new ExactTopicPredicate(name);
-    }
-    return new FuzzyTopicPredicate(name, args.index);
-  }
-
-  @Operator
-  public Predicate<ChangeData> ref(String ref) {
-    if (ref.startsWith("^")) {
-      return new RegexRefPredicate(ref);
-    }
-    return new RefPredicate(ref);
-  }
-
-  @Operator
-  public Predicate<ChangeData> f(String file) {
-    return file(file);
-  }
-
-  @Operator
-  public Predicate<ChangeData> file(String file) {
-    if (file.startsWith("^")) {
-      return new RegexPathPredicate(file);
-    }
-    return EqualsFilePredicate.create(args, file);
-  }
-
-  @Operator
-  public Predicate<ChangeData> path(String path) {
-    if (path.startsWith("^")) {
-      return new RegexPathPredicate(path);
-    }
-    return new EqualsPathPredicate(FIELD_PATH, path);
-  }
-
-  @Operator
-  public Predicate<ChangeData> label(String name)
-      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
-    Set<Account.Id> accounts = null;
-    AccountGroup.UUID group = null;
-
-    // Parse for:
-    // label:CodeReview=1,user=jsmith or
-    // label:CodeReview=1,jsmith or
-    // label:CodeReview=1,group=android_approvers or
-    // label:CodeReview=1,android_approvers
-    // user/groups without a label will first attempt to match user
-    // Special case: votes by owners can be tracked with ",owner":
-    // label:Code-Review+2,owner
-    // label:Code-Review+2,user=owner
-    String[] splitReviewer = name.split(",", 2);
-    name = splitReviewer[0]; // remove all but the vote piece, e.g.'CodeReview=1'
-
-    if (splitReviewer.length == 2) {
-      // process the user/group piece
-      PredicateArgs lblArgs = new PredicateArgs(splitReviewer[1]);
-
-      for (Map.Entry<String, String> pair : lblArgs.keyValue.entrySet()) {
-        if (pair.getKey().equalsIgnoreCase(ARG_ID_USER)) {
-          if (pair.getValue().equals(ARG_ID_OWNER)) {
-            accounts = Collections.singleton(OWNER_ACCOUNT_ID);
-          } else {
-            accounts = parseAccount(pair.getValue());
-          }
-        } else if (pair.getKey().equalsIgnoreCase(ARG_ID_GROUP)) {
-          group = parseGroup(pair.getValue()).getUUID();
-        } else {
-          throw new QueryParseException("Invalid argument identifier '" + pair.getKey() + "'");
-        }
-      }
-
-      for (String value : lblArgs.positional) {
-        if (accounts != null || group != null) {
-          throw new QueryParseException("more than one user/group specified (" + value + ")");
-        }
-        try {
-          if (value.equals(ARG_ID_OWNER)) {
-            accounts = Collections.singleton(OWNER_ACCOUNT_ID);
-          } else {
-            accounts = parseAccount(value);
-          }
-        } catch (QueryParseException qpex) {
-          // If it doesn't match an account, see if it matches a group
-          // (accounts get precedence)
-          try {
-            group = parseGroup(value).getUUID();
-          } catch (QueryParseException e) {
-            throw error("Neither user nor group " + value + " found", e);
-          }
-        }
-      }
-    }
-
-    if (group != null) {
-      accounts = getMembers(group);
-    }
-
-    // If the vote piece looks like Code-Review=NEED with a valid non-numeric
-    // submit record status, interpret as a submit record query.
-    int eq = name.indexOf('=');
-    if (args.getSchema().hasField(ChangeField.SUBMIT_RECORD) && eq > 0) {
-      String statusName = name.substring(eq + 1).toUpperCase();
-      if (!isInt(statusName)) {
-        SubmitRecord.Label.Status status =
-            Enums.getIfPresent(SubmitRecord.Label.Status.class, statusName).orNull();
-        if (status == null) {
-          throw error("Invalid label status " + statusName + " in " + name);
-        }
-        return SubmitRecordPredicate.create(name.substring(0, eq), status, accounts);
-      }
-    }
-
-    return new LabelPredicate(args, name, accounts, group);
-  }
-
-  private static boolean isInt(String s) {
-    if (s == null) {
-      return false;
-    }
-    if (s.startsWith("+")) {
-      s = s.substring(1);
-    }
-    return Ints.tryParse(s) != null;
-  }
-
-  @Operator
-  public Predicate<ChangeData> message(String text) {
-    return new MessagePredicate(args.index, text);
-  }
-
-  @Operator
-  public Predicate<ChangeData> star(String label) throws QueryParseException {
-    return new StarPredicate(self(), label);
-  }
-
-  @Operator
-  public Predicate<ChangeData> starredby(String who)
-      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
-    return starredby(parseAccount(who));
-  }
-
-  private Predicate<ChangeData> starredby(Set<Account.Id> who) {
-    List<Predicate<ChangeData>> p = Lists.newArrayListWithCapacity(who.size());
-    for (Account.Id id : who) {
-      p.add(starredby(id));
-    }
-    return Predicate.or(p);
-  }
-
-  private Predicate<ChangeData> starredby(Account.Id who) {
-    return new StarPredicate(who, StarredChangesUtil.DEFAULT_LABEL);
-  }
-
-  @Operator
-  public Predicate<ChangeData> watchedby(String who)
-      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
-    Set<Account.Id> m = parseAccount(who);
-    List<IsWatchedByPredicate> p = Lists.newArrayListWithCapacity(m.size());
-
-    Account.Id callerId;
-    try {
-      CurrentUser caller = args.self.get();
-      callerId = caller.isIdentifiedUser() ? caller.getAccountId() : null;
-    } catch (ProvisionException e) {
-      callerId = null;
-    }
-
-    for (Account.Id id : m) {
-      // Each child IsWatchedByPredicate includes a visibility filter for the
-      // corresponding user, to ensure that predicate subtree only returns
-      // changes visible to that user. The exception is if one of the users is
-      // the caller of this method, in which case visibility is already being
-      // checked at the top level.
-      p.add(new IsWatchedByPredicate(args.asUser(id), !id.equals(callerId)));
-    }
-    return Predicate.or(p);
-  }
-
-  @Operator
-  public Predicate<ChangeData> draftby(String who)
-      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
-    Set<Account.Id> m = parseAccount(who);
-    List<Predicate<ChangeData>> p = Lists.newArrayListWithCapacity(m.size());
-    for (Account.Id id : m) {
-      p.add(draftby(id));
-    }
-    return Predicate.or(p);
-  }
-
-  private Predicate<ChangeData> draftby(Account.Id who) {
-    return new HasDraftByPredicate(who);
-  }
-
-  private boolean isSelf(String who) {
-    return "self".equals(who) || "me".equals(who);
-  }
-
-  @Operator
-  public Predicate<ChangeData> visibleto(String who)
-      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
-    if (isSelf(who)) {
-      return is_visible();
-    }
-    Set<Account.Id> m = args.accountResolver.findAll(who);
-    if (!m.isEmpty()) {
-      List<Predicate<ChangeData>> p = Lists.newArrayListWithCapacity(m.size());
-      for (Account.Id id : m) {
-        return visibleto(args.userFactory.create(id));
-      }
-      return Predicate.or(p);
-    }
-
-    // If its not an account, maybe its a group?
-    //
-    Collection<GroupReference> suggestions = args.groupBackend.suggest(who, null);
-    if (!suggestions.isEmpty()) {
-      HashSet<AccountGroup.UUID> ids = new HashSet<>();
-      for (GroupReference ref : suggestions) {
-        ids.add(ref.getUUID());
-      }
-      return visibleto(new SingleGroupUser(ids));
-    }
-
-    throw error("No user or group matches \"" + who + "\".");
-  }
-
-  public Predicate<ChangeData> visibleto(CurrentUser user) {
-    return new ChangeIsVisibleToPredicate(args.db, args.notesFactory, user, args.permissionBackend);
-  }
-
-  public Predicate<ChangeData> is_visible() throws QueryParseException {
-    return visibleto(args.getUser());
-  }
-
-  @Operator
-  public Predicate<ChangeData> o(String who)
-      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
-    return owner(who);
-  }
-
-  @Operator
-  public Predicate<ChangeData> owner(String who)
-      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
-    return owner(parseAccount(who));
-  }
-
-  private Predicate<ChangeData> owner(Set<Account.Id> who) {
-    List<OwnerPredicate> p = Lists.newArrayListWithCapacity(who.size());
-    for (Account.Id id : who) {
-      p.add(new OwnerPredicate(id));
-    }
-    return Predicate.or(p);
-  }
-
-  private Predicate<ChangeData> ownerDefaultField(String who)
-      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
-    Set<Account.Id> accounts = parseAccount(who);
-    if (accounts.size() > MAX_ACCOUNTS_PER_DEFAULT_FIELD) {
-      return Predicate.any();
-    }
-    return owner(accounts);
-  }
-
-  @Operator
-  public Predicate<ChangeData> assignee(String who)
-      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
-    return assignee(parseAccount(who));
-  }
-
-  private Predicate<ChangeData> assignee(Set<Account.Id> who) {
-    List<AssigneePredicate> p = Lists.newArrayListWithCapacity(who.size());
-    for (Account.Id id : who) {
-      p.add(new AssigneePredicate(id));
-    }
-    return Predicate.or(p);
-  }
-
-  @Operator
-  public Predicate<ChangeData> ownerin(String group) throws QueryParseException, OrmException {
-    GroupReference g = GroupBackends.findBestSuggestion(args.groupBackend, group);
-    if (g == null) {
-      throw error("Group " + group + " not found");
-    }
-
-    AccountGroup.UUID groupId = g.getUUID();
-    GroupDescription.Basic groupDescription = args.groupBackend.get(groupId);
-    if (!(groupDescription instanceof GroupDescription.Internal)) {
-      return new OwnerinPredicate(args.userFactory, groupId);
-    }
-
-    Set<Account.Id> accounts = getMembers(groupId);
-    List<OwnerPredicate> p = Lists.newArrayListWithCapacity(accounts.size());
-    for (Account.Id id : accounts) {
-      p.add(new OwnerPredicate(id));
-    }
-    return Predicate.or(p);
-  }
-
-  @Operator
-  public Predicate<ChangeData> r(String who)
-      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
-    return reviewer(who);
-  }
-
-  @Operator
-  public Predicate<ChangeData> reviewer(String who)
-      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
-    return reviewer(who, false);
-  }
-
-  private Predicate<ChangeData> reviewerDefaultField(String who)
-      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
-    return reviewer(who, true);
-  }
-
-  private Predicate<ChangeData> reviewer(String who, boolean forDefaultField)
-      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
-    Predicate<ChangeData> byState =
-        reviewerByState(who, ReviewerStateInternal.REVIEWER, forDefaultField);
-    if (Objects.equals(byState, Predicate.<ChangeData>any())) {
-      return Predicate.any();
-    }
-    if (args.getSchema().hasField(ChangeField.WIP)) {
-      return Predicate.and(Predicate.not(new BooleanPredicate(ChangeField.WIP)), byState);
-    }
-    return byState;
-  }
-
-  @Operator
-  public Predicate<ChangeData> cc(String who)
-      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
-    return reviewerByState(who, ReviewerStateInternal.CC, false);
-  }
-
-  @Operator
-  public Predicate<ChangeData> reviewerin(String group) throws QueryParseException {
-    GroupReference g = GroupBackends.findBestSuggestion(args.groupBackend, group);
-    if (g == null) {
-      throw error("Group " + group + " not found");
-    }
-    return new ReviewerinPredicate(args.userFactory, g.getUUID());
-  }
-
-  @Operator
-  public Predicate<ChangeData> tr(String trackingId) {
-    return new TrackingIdPredicate(trackingId);
-  }
-
-  @Operator
-  public Predicate<ChangeData> bug(String trackingId) {
-    return tr(trackingId);
-  }
-
-  @Operator
-  public Predicate<ChangeData> limit(String query) throws QueryParseException {
-    Integer limit = Ints.tryParse(query);
-    if (limit == null) {
-      throw error("Invalid limit: " + query);
-    }
-    return new LimitPredicate<>(FIELD_LIMIT, limit);
-  }
-
-  @Operator
-  public Predicate<ChangeData> added(String value) throws QueryParseException {
-    return new AddedPredicate(value);
-  }
-
-  @Operator
-  public Predicate<ChangeData> deleted(String value) throws QueryParseException {
-    return new DeletedPredicate(value);
-  }
-
-  @Operator
-  public Predicate<ChangeData> size(String value) throws QueryParseException {
-    return delta(value);
-  }
-
-  @Operator
-  public Predicate<ChangeData> delta(String value) throws QueryParseException {
-    return new DeltaPredicate(value);
-  }
-
-  @Operator
-  public Predicate<ChangeData> commentby(String who)
-      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
-    return commentby(parseAccount(who));
-  }
-
-  private Predicate<ChangeData> commentby(Set<Account.Id> who) {
-    List<CommentByPredicate> p = Lists.newArrayListWithCapacity(who.size());
-    for (Account.Id id : who) {
-      p.add(new CommentByPredicate(id));
-    }
-    return Predicate.or(p);
-  }
-
-  @Operator
-  public Predicate<ChangeData> from(String who)
-      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
-    Set<Account.Id> ownerIds = parseAccount(who);
-    return Predicate.or(owner(ownerIds), commentby(ownerIds));
-  }
-
-  @Operator
-  public Predicate<ChangeData> query(String name) throws QueryParseException {
-    try (Repository git = args.repoManager.openRepository(args.allUsersName)) {
-      VersionedAccountQueries q = VersionedAccountQueries.forUser(self());
-      q.load(git);
-      String query = q.getQueryList().getQuery(name);
-      if (query != null) {
-        return parse(query);
-      }
-    } catch (RepositoryNotFoundException e) {
-      throw new QueryParseException(
-          "Unknown named query (no " + args.allUsersName + " repo): " + name, e);
-    } catch (IOException | ConfigInvalidException e) {
-      throw new QueryParseException("Error parsing named query: " + name, e);
-    }
-    throw new QueryParseException("Unknown named query: " + name);
-  }
-
-  @Operator
-  public Predicate<ChangeData> reviewedby(String who)
-      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
-    return IsReviewedPredicate.create(parseAccount(who));
-  }
-
-  @Operator
-  public Predicate<ChangeData> destination(String name) throws QueryParseException {
-    try (Repository git = args.repoManager.openRepository(args.allUsersName)) {
-      VersionedAccountDestinations d = VersionedAccountDestinations.forUser(self());
-      d.load(git);
-      Set<Branch.NameKey> destinations = d.getDestinationList().getDestinations(name);
-      if (destinations != null && !destinations.isEmpty()) {
-        return new DestinationPredicate(destinations, name);
-      }
-    } catch (RepositoryNotFoundException e) {
-      throw new QueryParseException(
-          "Unknown named destination (no " + args.allUsersName + " repo): " + name, e);
-    } catch (IOException | ConfigInvalidException e) {
-      throw new QueryParseException("Error parsing named destination: " + name, e);
-    }
-    throw new QueryParseException("Unknown named destination: " + name);
-  }
-
-  @Operator
-  public Predicate<ChangeData> author(String who) throws QueryParseException {
-    if (args.getSchema().hasField(ChangeField.EXACT_AUTHOR)) {
-      return getAuthorOrCommitterPredicate(
-          who.trim(), ExactAuthorPredicate::new, AuthorPredicate::new);
-    }
-    return getAuthorOrCommitterFullTextPredicate(who.trim(), AuthorPredicate::new);
-  }
-
-  @Operator
-  public Predicate<ChangeData> committer(String who) throws QueryParseException {
-    if (args.getSchema().hasField(ChangeField.EXACT_COMMITTER)) {
-      return getAuthorOrCommitterPredicate(
-          who.trim(), ExactCommitterPredicate::new, CommitterPredicate::new);
-    }
-    return getAuthorOrCommitterFullTextPredicate(who.trim(), CommitterPredicate::new);
-  }
-
-  @Operator
-  public Predicate<ChangeData> submittable(String str) throws QueryParseException {
-    SubmitRecord.Status status =
-        Enums.getIfPresent(SubmitRecord.Status.class, str.toUpperCase()).orNull();
-    if (status == null) {
-      throw error("invalid value for submittable:" + str);
-    }
-    return new SubmittablePredicate(status);
-  }
-
-  @Operator
-  public Predicate<ChangeData> unresolved(String value) throws QueryParseException {
-    return new IsUnresolvedPredicate(value);
-  }
-
-  @Operator
-  public Predicate<ChangeData> revertof(String value) throws QueryParseException {
-    if (args.getSchema().hasField(ChangeField.REVERT_OF)) {
-      return new RevertOfPredicate(value);
-    }
-    throw new QueryParseException("'revertof' operator is not supported by change index version");
-  }
-
-  @Override
-  protected Predicate<ChangeData> defaultField(String query) throws QueryParseException {
-    if (query.startsWith("refs/")) {
-      return ref(query);
-    } else if (DEF_CHANGE.matcher(query).matches()) {
-      List<Predicate<ChangeData>> predicates = Lists.newArrayListWithCapacity(2);
-      try {
-        predicates.add(change(query));
-      } catch (QueryParseException e) {
-        // Skip.
-      }
-
-      // For PAT_LEGACY_ID, it may also be the prefix of some commits.
-      if (query.length() >= 6 && PAT_LEGACY_ID.matcher(query).matches()) {
-        predicates.add(commit(query));
-      }
-
-      return Predicate.or(predicates);
-    }
-
-    // Adapt the capacity of this list when adding more default predicates.
-    List<Predicate<ChangeData>> predicates = Lists.newArrayListWithCapacity(11);
-    try {
-      Predicate<ChangeData> p = ownerDefaultField(query);
-      if (!Objects.equals(p, Predicate.<ChangeData>any())) {
-        predicates.add(p);
-      }
-    } catch (OrmException | IOException | ConfigInvalidException | QueryParseException e) {
-      // Skip.
-    }
-    try {
-      Predicate<ChangeData> p = reviewerDefaultField(query);
-      if (!Objects.equals(p, Predicate.<ChangeData>any())) {
-        predicates.add(p);
-      }
-    } catch (OrmException | IOException | ConfigInvalidException | QueryParseException e) {
-      // Skip.
-    }
-    predicates.add(file(query));
-    try {
-      predicates.add(label(query));
-    } catch (OrmException | IOException | ConfigInvalidException | QueryParseException e) {
-      // Skip.
-    }
-    predicates.add(commit(query));
-    predicates.add(message(query));
-    predicates.add(comment(query));
-    predicates.add(projects(query));
-    predicates.add(ref(query));
-    predicates.add(branch(query));
-    predicates.add(topic(query));
-    // Adapt the capacity of the "predicates" list when adding more default
-    // predicates.
-    return Predicate.or(predicates);
-  }
-
-  private Predicate<ChangeData> getAuthorOrCommitterPredicate(
-      String who,
-      Function<String, Predicate<ChangeData>> exactPredicateFunc,
-      Function<String, Predicate<ChangeData>> fullPredicateFunc)
-      throws QueryParseException {
-    if (Address.tryParse(who) != null) {
-      return exactPredicateFunc.apply(who);
-    }
-    return getAuthorOrCommitterFullTextPredicate(who, fullPredicateFunc);
-  }
-
-  private Predicate<ChangeData> getAuthorOrCommitterFullTextPredicate(
-      String who, Function<String, Predicate<ChangeData>> fullPredicateFunc)
-      throws QueryParseException {
-    Set<String> parts = SchemaUtil.getNameParts(who);
-    if (parts.isEmpty()) {
-      throw error("invalid value");
-    }
-
-    List<Predicate<ChangeData>> predicates =
-        parts.stream().map(fullPredicateFunc).collect(toList());
-    return Predicate.and(predicates);
-  }
-
-  private Set<Account.Id> getMembers(AccountGroup.UUID g) throws OrmException {
-    Set<Account.Id> accounts;
-    Set<Account.Id> allMembers =
-        args.listMembers.get().setRecursive(true).apply(g).stream()
-            .map(a -> new Account.Id(a._accountId))
-            .collect(toSet());
-    int maxTerms = args.indexConfig.maxTerms();
-    if (allMembers.size() > maxTerms) {
-      // limit the number of query terms otherwise Gerrit will barf
-      accounts = ImmutableSet.copyOf(Iterables.limit(allMembers, maxTerms));
-    } else {
-      accounts = allMembers;
-    }
-    return accounts;
-  }
-
-  private Set<Account.Id> parseAccount(String who)
-      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
-    if (isSelf(who)) {
-      return Collections.singleton(self());
-    }
-    Set<Account.Id> matches = args.accountResolver.findAll(who);
-    if (matches.isEmpty()) {
-      throw error("User " + who + " not found");
-    }
-    return matches;
-  }
-
-  private GroupReference parseGroup(String group) throws QueryParseException {
-    GroupReference g = GroupBackends.findBestSuggestion(args.groupBackend, group);
-    if (g == null) {
-      throw error("Group " + group + " not found");
-    }
-    return g;
-  }
-
-  private List<Change> parseChange(String value) throws OrmException, QueryParseException {
-    if (PAT_LEGACY_ID.matcher(value).matches()) {
-      return asChanges(args.queryProvider.get().byLegacyChangeId(Change.Id.parse(value)));
-    } else if (PAT_CHANGE_ID.matcher(value).matches()) {
-      List<Change> changes = asChanges(args.queryProvider.get().byKeyPrefix(parseChangeId(value)));
-      if (changes.isEmpty()) {
-        throw error("Change " + value + " not found");
-      }
-      return changes;
-    }
-
-    throw error("Change " + value + " not found");
-  }
-
-  private static String parseChangeId(String value) {
-    if (value.charAt(0) == 'i') {
-      value = "I" + value.substring(1);
-    }
-    return value;
-  }
-
-  private Account.Id self() throws QueryParseException {
-    return args.getIdentifiedUser().getAccountId();
-  }
-
-  public Predicate<ChangeData> reviewerByState(
-      String who, ReviewerStateInternal state, boolean forDefaultField)
-      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
-    Predicate<ChangeData> reviewerByEmailPredicate = null;
-    if (args.index.getSchema().hasField(ChangeField.REVIEWER_BY_EMAIL)) {
-      Address address = Address.tryParse(who);
-      if (address != null) {
-        reviewerByEmailPredicate = ReviewerByEmailPredicate.forState(address, state);
-      }
-    }
-
-    Predicate<ChangeData> reviewerPredicate = null;
-    try {
-      Set<Account.Id> accounts = parseAccount(who);
-      if (!forDefaultField || accounts.size() <= MAX_ACCOUNTS_PER_DEFAULT_FIELD) {
-        reviewerPredicate =
-            Predicate.or(
-                accounts.stream()
-                    .map(id -> ReviewerPredicate.forState(id, state))
-                    .collect(toList()));
-      }
-    } catch (QueryParseException e) {
-      // Propagate this exception only if we can't use 'who' to query by email
-      if (reviewerByEmailPredicate == null) {
-        throw e;
-      }
-    }
-
-    if (reviewerPredicate != null && reviewerByEmailPredicate != null) {
-      return Predicate.or(reviewerPredicate, reviewerByEmailPredicate);
-    } else if (reviewerPredicate != null) {
-      return reviewerPredicate;
-    } else if (reviewerByEmailPredicate != null) {
-      return reviewerByEmailPredicate;
-    } else {
-      return Predicate.any();
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryProcessor.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryProcessor.java
deleted file mode 100644
index b190cd2..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryProcessor.java
+++ /dev/null
@@ -1,144 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.server.query.change;
-
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.gerrit.server.query.change.ChangeQueryBuilder.FIELD_LIMIT;
-
-import com.google.gerrit.extensions.common.PluginDefinedInfo;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.index.IndexConfig;
-import com.google.gerrit.index.QueryOptions;
-import com.google.gerrit.index.query.IndexPredicate;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.index.query.QueryProcessor;
-import com.google.gerrit.metrics.MetricMaker;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.account.AccountLimits;
-import com.google.gerrit.server.index.change.ChangeIndexCollection;
-import com.google.gerrit.server.index.change.ChangeIndexRewriter;
-import com.google.gerrit.server.index.change.ChangeSchemaDefinitions;
-import com.google.gerrit.server.index.change.IndexedChangeQuery;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Query processor for the change index.
- *
- * <p>Instances are one-time-use. Other singleton classes should inject a Provider rather than
- * holding on to a single instance.
- */
-public class ChangeQueryProcessor extends QueryProcessor<ChangeData>
-    implements PluginDefinedAttributesFactory {
-  /**
-   * Register a ChangeAttributeFactory in a config Module like this:
-   *
-   * <p>bind(ChangeAttributeFactory.class) .annotatedWith(Exports.named("export-name"))
-   * .to(YourClass.class);
-   */
-  public interface ChangeAttributeFactory {
-    PluginDefinedInfo create(ChangeData a, ChangeQueryProcessor qp, String plugin);
-  }
-
-  private final Provider<ReviewDb> db;
-  private final Provider<CurrentUser> userProvider;
-  private final ChangeNotes.Factory notesFactory;
-  private final DynamicMap<ChangeAttributeFactory> attributeFactories;
-  private final PermissionBackend permissionBackend;
-
-  static {
-    // It is assumed that basic rewrites do not touch visibleto predicates.
-    checkState(
-        !ChangeIsVisibleToPredicate.class.isAssignableFrom(IndexPredicate.class),
-        "ChangeQueryProcessor assumes visibleto is not used by the index rewriter.");
-  }
-
-  @Inject
-  ChangeQueryProcessor(
-      Provider<CurrentUser> userProvider,
-      AccountLimits.Factory limitsFactory,
-      MetricMaker metricMaker,
-      IndexConfig indexConfig,
-      ChangeIndexCollection indexes,
-      ChangeIndexRewriter rewriter,
-      Provider<ReviewDb> db,
-      ChangeNotes.Factory notesFactory,
-      DynamicMap<ChangeAttributeFactory> attributeFactories,
-      PermissionBackend permissionBackend) {
-    super(
-        metricMaker,
-        ChangeSchemaDefinitions.INSTANCE,
-        indexConfig,
-        indexes,
-        rewriter,
-        FIELD_LIMIT,
-        () -> limitsFactory.create(userProvider.get()).getQueryLimit());
-    this.db = db;
-    this.userProvider = userProvider;
-    this.notesFactory = notesFactory;
-    this.attributeFactories = attributeFactories;
-    this.permissionBackend = permissionBackend;
-  }
-
-  @Override
-  public ChangeQueryProcessor enforceVisibility(boolean enforce) {
-    super.enforceVisibility(enforce);
-    return this;
-  }
-
-  @Override
-  protected QueryOptions createOptions(
-      IndexConfig indexConfig, int start, int limit, Set<String> requestedFields) {
-    return IndexedChangeQuery.createOptions(indexConfig, start, limit, requestedFields);
-  }
-
-  @Override
-  public List<PluginDefinedInfo> create(ChangeData cd) {
-    List<PluginDefinedInfo> plugins = new ArrayList<>(attributeFactories.plugins().size());
-    for (String plugin : attributeFactories.plugins()) {
-      for (Provider<ChangeAttributeFactory> provider :
-          attributeFactories.byPlugin(plugin).values()) {
-        PluginDefinedInfo pda = null;
-        try {
-          pda = provider.get().create(cd, this, plugin);
-        } catch (RuntimeException e) {
-          /* Eat runtime exceptions so that queries don't fail. */
-        }
-        if (pda != null) {
-          pda.name = plugin;
-          plugins.add(pda);
-        }
-      }
-    }
-    if (plugins.isEmpty()) {
-      plugins = null;
-    }
-    return plugins;
-  }
-
-  @Override
-  protected Predicate<ChangeData> enforceVisibility(Predicate<ChangeData> pred) {
-    return new AndChangeSource(
-        pred,
-        new ChangeIsVisibleToPredicate(db, notesFactory, userProvider.get(), permissionBackend),
-        start);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeStatusPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeStatusPredicate.java
deleted file mode 100644
index 155b016..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeStatusPredicate.java
+++ /dev/null
@@ -1,147 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.query.change;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Change.Status;
-import com.google.gerrit.server.index.change.ChangeField;
-import com.google.gwtorm.server.OrmException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.NavigableMap;
-import java.util.Objects;
-import java.util.TreeMap;
-
-/**
- * Predicate for a {@link Status}.
- *
- * <p>The actual name of this operator can differ, it usually comes as {@code status:} but may also
- * be {@code is:} to help do-what-i-meanery for end-users searching for changes. Either operator
- * name has the same meaning.
- *
- * <p>Status names are looked up by prefix case-insensitively.
- */
-public final class ChangeStatusPredicate extends ChangeIndexPredicate {
-  private static final String INVALID_STATUS = "__invalid__";
-  private static final Predicate<ChangeData> NONE = new ChangeStatusPredicate(null);
-
-  private static final TreeMap<String, Predicate<ChangeData>> PREDICATES;
-  private static final Predicate<ChangeData> CLOSED;
-  private static final Predicate<ChangeData> OPEN;
-
-  static {
-    PREDICATES = new TreeMap<>();
-    List<Predicate<ChangeData>> open = new ArrayList<>();
-    List<Predicate<ChangeData>> closed = new ArrayList<>();
-
-    for (Change.Status s : Change.Status.values()) {
-      ChangeStatusPredicate p = forStatus(s);
-      String str = canonicalize(s);
-      checkState(
-          !INVALID_STATUS.equals(str),
-          "invalid status sentinel %s cannot match canonicalized status string %s",
-          INVALID_STATUS,
-          str);
-      PREDICATES.put(str, p);
-      (s.isOpen() ? open : closed).add(p);
-    }
-
-    CLOSED = Predicate.or(closed);
-    OPEN = Predicate.or(open);
-
-    PREDICATES.put("closed", CLOSED);
-    PREDICATES.put("open", OPEN);
-    PREDICATES.put("pending", OPEN);
-  }
-
-  public static String canonicalize(Change.Status status) {
-    return status.name().toLowerCase();
-  }
-
-  public static Predicate<ChangeData> parse(String value) {
-    String lower = value.toLowerCase();
-    NavigableMap<String, Predicate<ChangeData>> head = PREDICATES.tailMap(lower, true);
-    if (!head.isEmpty()) {
-      // Assume no statuses share a common prefix so we can only walk one entry.
-      Map.Entry<String, Predicate<ChangeData>> e = head.entrySet().iterator().next();
-      if (e.getKey().startsWith(lower)) {
-        return e.getValue();
-      }
-    }
-    return NONE;
-  }
-
-  public static Predicate<ChangeData> open() {
-    return OPEN;
-  }
-
-  public static Predicate<ChangeData> closed() {
-    return CLOSED;
-  }
-
-  public static ChangeStatusPredicate forStatus(Change.Status status) {
-    return new ChangeStatusPredicate(checkNotNull(status));
-  }
-
-  @Nullable private final Change.Status status;
-
-  private ChangeStatusPredicate(@Nullable Change.Status status) {
-    super(ChangeField.STATUS, status != null ? canonicalize(status) : INVALID_STATUS);
-    this.status = status;
-  }
-
-  /**
-   * Get the status for this predicate.
-   *
-   * @return the status, or null if this predicate is intended to never match any changes.
-   */
-  @Nullable
-  public Change.Status getStatus() {
-    return status;
-  }
-
-  @Override
-  public boolean match(ChangeData object) throws OrmException {
-    Change change = object.change();
-    return change != null && Objects.equals(status, change.getStatus());
-  }
-
-  @Override
-  public int getCost() {
-    return 0;
-  }
-
-  @Override
-  public int hashCode() {
-    return Objects.hashCode(status);
-  }
-
-  @Override
-  public boolean equals(Object other) {
-    return (other instanceof ChangeStatusPredicate)
-        && Objects.equals(status, ((ChangeStatusPredicate) other).status);
-  }
-
-  @Override
-  public String toString() {
-    return getOperator() + ":" + getValue();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictKey.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictKey.java
deleted file mode 100644
index 0101ffe..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictKey.java
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.query.change;
-
-import com.google.gerrit.extensions.client.SubmitType;
-import java.io.Serializable;
-import java.util.Objects;
-import org.eclipse.jgit.lib.ObjectId;
-
-public class ConflictKey implements Serializable {
-  private static final long serialVersionUID = 2L;
-
-  private final ObjectId commit;
-  private final ObjectId otherCommit;
-  private final SubmitType submitType;
-  private final boolean contentMerge;
-
-  public ConflictKey(
-      ObjectId commit, ObjectId otherCommit, SubmitType submitType, boolean contentMerge) {
-    if (SubmitType.FAST_FORWARD_ONLY.equals(submitType) || commit.compareTo(otherCommit) < 0) {
-      this.commit = commit;
-      this.otherCommit = otherCommit;
-    } else {
-      this.commit = otherCommit;
-      this.otherCommit = commit;
-    }
-    this.submitType = submitType;
-    this.contentMerge = contentMerge;
-  }
-
-  public ObjectId getCommit() {
-    return commit;
-  }
-
-  public ObjectId getOtherCommit() {
-    return otherCommit;
-  }
-
-  public SubmitType getSubmitType() {
-    return submitType;
-  }
-
-  public boolean isContentMerge() {
-    return contentMerge;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (!(o instanceof ConflictKey)) {
-      return false;
-    }
-    ConflictKey other = (ConflictKey) o;
-    return commit.equals(other.commit)
-        && otherCommit.equals(other.otherCommit)
-        && submitType.equals(other.submitType)
-        && contentMerge == other.contentMerge;
-  }
-
-  @Override
-  public int hashCode() {
-    return Objects.hash(commit, otherCommit, submitType, contentMerge);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictsCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictsCache.java
deleted file mode 100644
index e8b2fef..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictsCache.java
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.query.change;
-
-import com.google.gerrit.common.Nullable;
-
-public interface ConflictsCache {
-
-  void put(ConflictKey key, Boolean value);
-
-  @Nullable
-  Boolean getIfPresent(ConflictKey key);
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictsCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictsCacheImpl.java
deleted file mode 100644
index 1185677..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictsCacheImpl.java
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.query.change;
-
-import com.google.common.cache.Cache;
-import com.google.gerrit.server.cache.CacheModule;
-import com.google.inject.Inject;
-import com.google.inject.Module;
-import com.google.inject.Singleton;
-import com.google.inject.name.Named;
-
-@Singleton
-public class ConflictsCacheImpl implements ConflictsCache {
-  public static final String NAME = "conflicts";
-
-  public static Module module() {
-    return new CacheModule() {
-      @Override
-      protected void configure() {
-        persist(NAME, ConflictKey.class, Boolean.class).maximumWeight(37400);
-        bind(ConflictsCache.class).to(ConflictsCacheImpl.class);
-      }
-    };
-  }
-
-  private final Cache<ConflictKey, Boolean> conflictsCache;
-
-  @Inject
-  public ConflictsCacheImpl(@Named(NAME) Cache<ConflictKey, Boolean> conflictsCache) {
-    this.conflictsCache = conflictsCache;
-  }
-
-  @Override
-  public void put(ConflictKey key, Boolean value) {
-    conflictsCache.put(key, value);
-  }
-
-  @Override
-  public Boolean getIfPresent(ConflictKey key) {
-    return conflictsCache.getIfPresent(key);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictsPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictsPredicate.java
deleted file mode 100644
index dbcb879..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictsPredicate.java
+++ /dev/null
@@ -1,200 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.query.change;
-
-import com.google.gerrit.common.data.SubmitTypeRecord;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.index.query.QueryParseException;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.server.git.CodeReviewCommit;
-import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
-import com.google.gerrit.server.git.IntegrationException;
-import com.google.gerrit.server.git.strategy.SubmitDryRun;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.query.change.ChangeQueryBuilder.Arguments;
-import com.google.gwtorm.server.OrmException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-public class ConflictsPredicate {
-  // UI code may depend on this string, so use caution when changing.
-  protected static final String TOO_MANY_FILES = "too many files to find conflicts";
-
-  private ConflictsPredicate() {}
-
-  public static Predicate<ChangeData> create(Arguments args, String value, Change c)
-      throws QueryParseException, OrmException {
-    ChangeData cd;
-    List<String> files;
-    try {
-      cd = args.changeDataFactory.create(args.db.get(), c);
-      files = cd.currentFilePaths();
-    } catch (IOException e) {
-      throw new OrmException(e);
-    }
-
-    if (3 + files.size() > args.indexConfig.maxTerms()) {
-      // Short-circuit with a nice error message if we exceed the index
-      // backend's term limit. This assumes that "conflicts:foo" is the entire
-      // query; if there are more terms in the input, we might not
-      // short-circuit here, which will result in a more generic error message
-      // later on in the query parsing.
-      throw new QueryParseException(TOO_MANY_FILES);
-    }
-
-    List<Predicate<ChangeData>> filePredicates = new ArrayList<>(files.size());
-    for (String file : files) {
-      filePredicates.add(new EqualsPathPredicate(ChangeQueryBuilder.FIELD_PATH, file));
-    }
-
-    List<Predicate<ChangeData>> and = new ArrayList<>(5);
-    and.add(new ProjectPredicate(c.getProject().get()));
-    and.add(new RefPredicate(c.getDest().get()));
-    and.add(Predicate.not(new LegacyChangeIdPredicate(c.getId())));
-    and.add(Predicate.or(filePredicates));
-
-    ChangeDataCache changeDataCache = new ChangeDataCache(cd, args.projectCache);
-    and.add(new CheckConflict(ChangeQueryBuilder.FIELD_CONFLICTS, value, args, c, changeDataCache));
-    return Predicate.and(and);
-  }
-
-  private static final class CheckConflict extends ChangeOperatorPredicate {
-    private final Arguments args;
-    private final Branch.NameKey dest;
-    private final ChangeDataCache changeDataCache;
-
-    CheckConflict(
-        String field, String value, Arguments args, Change c, ChangeDataCache changeDataCache) {
-      super(field, value);
-      this.args = args;
-      this.dest = c.getDest();
-      this.changeDataCache = changeDataCache;
-    }
-
-    @Override
-    public boolean match(ChangeData object) throws OrmException {
-      Change otherChange = object.change();
-      if (otherChange == null || !otherChange.getDest().equals(dest)) {
-        return false;
-      }
-
-      SubmitTypeRecord str = object.submitTypeRecord();
-      if (!str.isOk()) {
-        return false;
-      }
-
-      ProjectState projectState;
-      try {
-        projectState = changeDataCache.getProjectState();
-      } catch (NoSuchProjectException e) {
-        return false;
-      }
-
-      ObjectId other = ObjectId.fromString(object.currentPatchSet().getRevision().get());
-      ConflictKey conflictsKey =
-          new ConflictKey(
-              changeDataCache.getTestAgainst(), other, str.type, projectState.isUseContentMerge());
-      Boolean conflicts = args.conflictsCache.getIfPresent(conflictsKey);
-      if (conflicts != null) {
-        return conflicts;
-      }
-
-      try (Repository repo = args.repoManager.openRepository(otherChange.getProject());
-          CodeReviewRevWalk rw = CodeReviewCommit.newRevWalk(repo)) {
-        conflicts =
-            !args.submitDryRun.run(
-                str.type,
-                repo,
-                rw,
-                otherChange.getDest(),
-                changeDataCache.getTestAgainst(),
-                other,
-                getAlreadyAccepted(repo, rw));
-        args.conflictsCache.put(conflictsKey, conflicts);
-        return conflicts;
-      } catch (IntegrationException | NoSuchProjectException | IOException e) {
-        throw new OrmException(e);
-      }
-    }
-
-    @Override
-    public int getCost() {
-      return 5;
-    }
-
-    private Set<RevCommit> getAlreadyAccepted(Repository repo, RevWalk rw)
-        throws IntegrationException {
-      try {
-        Set<RevCommit> accepted = new HashSet<>();
-        SubmitDryRun.addCommits(changeDataCache.getAlreadyAccepted(repo), rw, accepted);
-        ObjectId tip = changeDataCache.getTestAgainst();
-        if (tip != null) {
-          accepted.add(rw.parseCommit(tip));
-        }
-        return accepted;
-      } catch (OrmException | IOException e) {
-        throw new IntegrationException("Failed to determine already accepted commits.", e);
-      }
-    }
-  }
-
-  private static class ChangeDataCache {
-    private final ChangeData cd;
-    private final ProjectCache projectCache;
-
-    private ObjectId testAgainst;
-    private ProjectState projectState;
-    private Set<ObjectId> alreadyAccepted;
-
-    ChangeDataCache(ChangeData cd, ProjectCache projectCache) {
-      this.cd = cd;
-      this.projectCache = projectCache;
-    }
-
-    ObjectId getTestAgainst() throws OrmException {
-      if (testAgainst == null) {
-        testAgainst = ObjectId.fromString(cd.currentPatchSet().getRevision().get());
-      }
-      return testAgainst;
-    }
-
-    ProjectState getProjectState() throws NoSuchProjectException {
-      if (projectState == null) {
-        projectState = projectCache.get(cd.project());
-        if (projectState == null) {
-          throw new NoSuchProjectException(cd.project());
-        }
-      }
-      return projectState;
-    }
-
-    Set<ObjectId> getAlreadyAccepted(Repository repo) throws IOException {
-      if (alreadyAccepted == null) {
-        alreadyAccepted = SubmitDryRun.getAlreadyAccepted(repo);
-      }
-      return alreadyAccepted;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/DestinationPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/DestinationPredicate.java
deleted file mode 100644
index 7f969e1..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/DestinationPredicate.java
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.query.change;
-
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gwtorm.server.OrmException;
-import java.util.Set;
-
-public class DestinationPredicate extends ChangeOperatorPredicate {
-  protected Set<Branch.NameKey> destinations;
-
-  public DestinationPredicate(Set<Branch.NameKey> destinations, String value) {
-    super(ChangeQueryBuilder.FIELD_DESTINATION, value);
-    this.destinations = destinations;
-  }
-
-  @Override
-  public boolean match(ChangeData object) throws OrmException {
-    Change change = object.change();
-    if (change == null) {
-      return false;
-    }
-    return destinations.contains(change.getDest());
-  }
-
-  @Override
-  public int getCost() {
-    return 1;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/EqualsLabelPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/EqualsLabelPredicate.java
deleted file mode 100644
index 785ae38..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/EqualsLabelPredicate.java
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.query.change;
-
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.LabelTypes;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.index.change.ChangeField;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Provider;
-
-public class EqualsLabelPredicate extends ChangeIndexPredicate {
-  protected final ProjectCache projectCache;
-  protected final PermissionBackend permissionBackend;
-  protected final IdentifiedUser.GenericFactory userFactory;
-  protected final Provider<ReviewDb> dbProvider;
-  protected final String label;
-  protected final int expVal;
-  protected final Account.Id account;
-  protected final AccountGroup.UUID group;
-
-  public EqualsLabelPredicate(
-      LabelPredicate.Args args, String label, int expVal, Account.Id account) {
-    super(ChangeField.LABEL, ChangeField.formatLabel(label, expVal, account));
-    this.permissionBackend = args.permissionBackend;
-    this.projectCache = args.projectCache;
-    this.userFactory = args.userFactory;
-    this.dbProvider = args.dbProvider;
-    this.group = args.group;
-    this.label = label;
-    this.expVal = expVal;
-    this.account = account;
-  }
-
-  @Override
-  public boolean match(ChangeData object) throws OrmException {
-    Change c = object.change();
-    if (c == null) {
-      // The change has disappeared.
-      //
-      return false;
-    }
-
-    ProjectState project = projectCache.get(c.getDest().getParentKey());
-    if (project == null) {
-      // The project has disappeared.
-      //
-      return false;
-    }
-
-    LabelType labelType = type(project.getLabelTypes(), label);
-    if (labelType == null) {
-      return false; // Label is not defined by this project.
-    }
-
-    boolean hasVote = false;
-    for (PatchSetApproval p : object.currentApprovals()) {
-      if (labelType.matches(p)) {
-        hasVote = true;
-        if (match(object, p.getValue(), p.getAccountId())) {
-          return true;
-        }
-      }
-    }
-
-    if (!hasVote && expVal == 0) {
-      return true;
-    }
-
-    return false;
-  }
-
-  protected static LabelType type(LabelTypes types, String toFind) {
-    if (types.byLabel(toFind) != null) {
-      return types.byLabel(toFind);
-    }
-
-    for (LabelType lt : types.getLabelTypes()) {
-      if (toFind.equalsIgnoreCase(lt.getName())) {
-        return lt;
-      }
-    }
-    return null;
-  }
-
-  protected boolean match(ChangeData cd, short value, Account.Id approver) {
-    if (value != expVal) {
-      return false;
-    }
-
-    if (account != null && !account.equals(approver)) {
-      return false;
-    }
-
-    IdentifiedUser reviewer = userFactory.create(approver);
-    if (group != null && !reviewer.getEffectiveGroups().contains(group)) {
-      return false;
-    }
-
-    // Check the user has 'READ' permission.
-    try {
-      PermissionBackend.ForChange perm =
-          permissionBackend.user(reviewer).database(dbProvider).change(cd);
-      return perm.test(ChangePermission.READ);
-    } catch (PermissionBackendException e) {
-      return false;
-    }
-  }
-
-  @Override
-  public int getCost() {
-    return 1 + (group == null ? 0 : 1);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/InternalChangeQuery.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/InternalChangeQuery.java
deleted file mode 100644
index 4d10c0e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/InternalChangeQuery.java
+++ /dev/null
@@ -1,284 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.query.change;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.gerrit.index.query.Predicate.and;
-import static com.google.gerrit.index.query.Predicate.not;
-import static com.google.gerrit.index.query.Predicate.or;
-import static com.google.gerrit.server.query.change.ChangeStatusPredicate.open;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Strings;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-import com.google.gerrit.index.IndexConfig;
-import com.google.gerrit.index.query.InternalQuery;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.index.change.ChangeIndexCollection;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-
-/**
- * Query wrapper for the change index.
- *
- * <p>Instances are one-time-use. Other singleton classes should inject a Provider rather than
- * holding on to a single instance.
- */
-public class InternalChangeQuery extends InternalQuery<ChangeData> {
-  private static Predicate<ChangeData> ref(Branch.NameKey branch) {
-    return new RefPredicate(branch.get());
-  }
-
-  private static Predicate<ChangeData> change(Change.Key key) {
-    return new ChangeIdPredicate(key.get());
-  }
-
-  private static Predicate<ChangeData> project(Project.NameKey project) {
-    return new ProjectPredicate(project.get());
-  }
-
-  private static Predicate<ChangeData> status(Change.Status status) {
-    return ChangeStatusPredicate.forStatus(status);
-  }
-
-  private static Predicate<ChangeData> commit(String id) {
-    return new CommitPredicate(id);
-  }
-
-  private final ChangeData.Factory changeDataFactory;
-  private final ChangeNotes.Factory notesFactory;
-
-  @Inject
-  InternalChangeQuery(
-      ChangeQueryProcessor queryProcessor,
-      ChangeIndexCollection indexes,
-      IndexConfig indexConfig,
-      ChangeData.Factory changeDataFactory,
-      ChangeNotes.Factory notesFactory) {
-    super(queryProcessor, indexes, indexConfig);
-    this.changeDataFactory = changeDataFactory;
-    this.notesFactory = notesFactory;
-  }
-
-  @Override
-  public InternalChangeQuery setLimit(int n) {
-    super.setLimit(n);
-    return this;
-  }
-
-  @Override
-  public InternalChangeQuery enforceVisibility(boolean enforce) {
-    super.enforceVisibility(enforce);
-    return this;
-  }
-
-  @Override
-  public InternalChangeQuery setRequestedFields(Set<String> fields) {
-    super.setRequestedFields(fields);
-    return this;
-  }
-
-  @Override
-  public InternalChangeQuery noFields() {
-    super.noFields();
-    return this;
-  }
-
-  public List<ChangeData> byKey(Change.Key key) throws OrmException {
-    return byKeyPrefix(key.get());
-  }
-
-  public List<ChangeData> byKeyPrefix(String prefix) throws OrmException {
-    return query(new ChangeIdPredicate(prefix));
-  }
-
-  public List<ChangeData> byLegacyChangeId(Change.Id id) throws OrmException {
-    return query(new LegacyChangeIdPredicate(id));
-  }
-
-  public List<ChangeData> byLegacyChangeIds(Collection<Change.Id> ids) throws OrmException {
-    List<Predicate<ChangeData>> preds = new ArrayList<>(ids.size());
-    for (Change.Id id : ids) {
-      preds.add(new LegacyChangeIdPredicate(id));
-    }
-    return query(or(preds));
-  }
-
-  public List<ChangeData> byBranchKey(Branch.NameKey branch, Change.Key key) throws OrmException {
-    return query(and(ref(branch), project(branch.getParentKey()), change(key)));
-  }
-
-  public List<ChangeData> byProject(Project.NameKey project) throws OrmException {
-    return query(project(project));
-  }
-
-  public List<ChangeData> byBranchOpen(Branch.NameKey branch) throws OrmException {
-    return query(and(ref(branch), project(branch.getParentKey()), open()));
-  }
-
-  public List<ChangeData> byBranchNew(Branch.NameKey branch) throws OrmException {
-    return query(and(ref(branch), project(branch.getParentKey()), status(Change.Status.NEW)));
-  }
-
-  public Iterable<ChangeData> byCommitsOnBranchNotMerged(
-      Repository repo, ReviewDb db, Branch.NameKey branch, Collection<String> hashes)
-      throws OrmException, IOException {
-    return byCommitsOnBranchNotMerged(
-        repo,
-        db,
-        branch,
-        hashes,
-        // Account for all commit predicates plus ref, project, status.
-        indexConfig.maxTerms() - 3);
-  }
-
-  @VisibleForTesting
-  Iterable<ChangeData> byCommitsOnBranchNotMerged(
-      Repository repo,
-      ReviewDb db,
-      Branch.NameKey branch,
-      Collection<String> hashes,
-      int indexLimit)
-      throws OrmException, IOException {
-    if (hashes.size() > indexLimit) {
-      return byCommitsOnBranchNotMergedFromDatabase(repo, db, branch, hashes);
-    }
-    return byCommitsOnBranchNotMergedFromIndex(branch, hashes);
-  }
-
-  private Iterable<ChangeData> byCommitsOnBranchNotMergedFromDatabase(
-      Repository repo, ReviewDb db, Branch.NameKey branch, Collection<String> hashes)
-      throws OrmException, IOException {
-    Set<Change.Id> changeIds = Sets.newHashSetWithExpectedSize(hashes.size());
-    String lastPrefix = null;
-    for (Ref ref : repo.getRefDatabase().getRefs(RefNames.REFS_CHANGES).values()) {
-      String r = ref.getName();
-      if ((lastPrefix != null && r.startsWith(lastPrefix))
-          || !hashes.contains(ref.getObjectId().name())) {
-        continue;
-      }
-      Change.Id id = Change.Id.fromRef(r);
-      if (id == null) {
-        continue;
-      }
-      if (changeIds.add(id)) {
-        lastPrefix = r.substring(0, r.lastIndexOf('/'));
-      }
-    }
-
-    List<ChangeNotes> notes =
-        notesFactory.create(
-            db,
-            branch.getParentKey(),
-            changeIds,
-            cn -> {
-              Change c = cn.getChange();
-              return c.getDest().equals(branch) && c.getStatus() != Change.Status.MERGED;
-            });
-    return Lists.transform(notes, n -> changeDataFactory.create(db, n));
-  }
-
-  private Iterable<ChangeData> byCommitsOnBranchNotMergedFromIndex(
-      Branch.NameKey branch, Collection<String> hashes) throws OrmException {
-    return query(
-        and(
-            ref(branch),
-            project(branch.getParentKey()),
-            not(status(Change.Status.MERGED)),
-            or(commits(hashes))));
-  }
-
-  private static List<Predicate<ChangeData>> commits(Collection<String> hashes) {
-    List<Predicate<ChangeData>> commits = new ArrayList<>(hashes.size());
-    for (String s : hashes) {
-      commits.add(commit(s));
-    }
-    return commits;
-  }
-
-  public List<ChangeData> byProjectOpen(Project.NameKey project) throws OrmException {
-    return query(and(project(project), open()));
-  }
-
-  public List<ChangeData> byTopicOpen(String topic) throws OrmException {
-    return query(and(new ExactTopicPredicate(topic), open()));
-  }
-
-  public List<ChangeData> byCommit(ObjectId id) throws OrmException {
-    return byCommit(id.name());
-  }
-
-  public List<ChangeData> byCommit(String hash) throws OrmException {
-    return query(commit(hash));
-  }
-
-  public List<ChangeData> byProjectCommit(Project.NameKey project, ObjectId id)
-      throws OrmException {
-    return byProjectCommit(project, id.name());
-  }
-
-  public List<ChangeData> byProjectCommit(Project.NameKey project, String hash)
-      throws OrmException {
-    return query(and(project(project), commit(hash)));
-  }
-
-  public List<ChangeData> byProjectCommits(Project.NameKey project, List<String> hashes)
-      throws OrmException {
-    int n = indexConfig.maxTerms() - 1;
-    checkArgument(hashes.size() <= n, "cannot exceed %s commits", n);
-    return query(and(project(project), or(commits(hashes))));
-  }
-
-  public List<ChangeData> byBranchCommit(String project, String branch, String hash)
-      throws OrmException {
-    return query(and(new ProjectPredicate(project), new RefPredicate(branch), commit(hash)));
-  }
-
-  public List<ChangeData> byBranchCommit(Branch.NameKey branch, String hash) throws OrmException {
-    return byBranchCommit(branch.getParentKey().get(), branch.get(), hash);
-  }
-
-  public List<ChangeData> bySubmissionId(String cs) throws OrmException {
-    if (Strings.isNullOrEmpty(cs)) {
-      return Collections.emptyList();
-    }
-    return query(new SubmissionIdPredicate(cs));
-  }
-
-  public List<ChangeData> byProjectGroups(Project.NameKey project, Collection<String> groups)
-      throws OrmException {
-    List<GroupPredicate> groupPredicates = new ArrayList<>(groups.size());
-    for (String g : groups) {
-      groupPredicates.add(new GroupPredicate(g));
-    }
-    return query(and(project(project), or(groupPredicates)));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/IsWatchedByPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/IsWatchedByPredicate.java
deleted file mode 100644
index 90eb8e4..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/IsWatchedByPredicate.java
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.server.query.change;
-
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.index.query.AndPredicate;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.index.query.QueryBuilder;
-import com.google.gerrit.index.query.QueryParseException;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.account.WatchConfig.ProjectWatchKey;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-public class IsWatchedByPredicate extends AndPredicate<ChangeData> {
-  protected static String describe(CurrentUser user) {
-    if (user.isIdentifiedUser()) {
-      return user.getAccountId().toString();
-    }
-    return user.toString();
-  }
-
-  protected final CurrentUser user;
-
-  public IsWatchedByPredicate(ChangeQueryBuilder.Arguments args, boolean checkIsVisible)
-      throws QueryParseException {
-    super(filters(args, checkIsVisible));
-    this.user = args.getUser();
-  }
-
-  protected static List<Predicate<ChangeData>> filters(
-      ChangeQueryBuilder.Arguments args, boolean checkIsVisible) throws QueryParseException {
-    List<Predicate<ChangeData>> r = new ArrayList<>();
-    ChangeQueryBuilder builder = new ChangeQueryBuilder(args);
-    for (ProjectWatchKey w : getWatches(args)) {
-      Predicate<ChangeData> f = null;
-      if (w.filter() != null) {
-        try {
-          f = builder.parse(w.filter());
-          if (QueryBuilder.find(f, IsWatchedByPredicate.class) != null) {
-            // If the query is going to infinite loop, assume it
-            // will never match and return null. Yes this test
-            // prevents you from having a filter that matches what
-            // another user is filtering on. :-)
-            continue;
-          }
-        } catch (QueryParseException e) {
-          continue;
-        }
-      }
-
-      Predicate<ChangeData> p;
-      if (w.project().equals(args.allProjectsName)) {
-        p = null;
-      } else {
-        p = builder.project(w.project().get());
-      }
-
-      if (p != null && f != null) {
-        r.add(and(p, f));
-      } else if (p != null) {
-        r.add(p);
-      } else if (f != null) {
-        r.add(f);
-      } else {
-        r.add(builder.status_open());
-      }
-    }
-    if (r.isEmpty()) {
-      return none();
-    } else if (checkIsVisible) {
-      return ImmutableList.of(or(r), builder.is_visible());
-    } else {
-      return ImmutableList.of(or(r));
-    }
-  }
-
-  protected static Collection<ProjectWatchKey> getWatches(ChangeQueryBuilder.Arguments args)
-      throws QueryParseException {
-    CurrentUser user = args.getUser();
-    if (user.isIdentifiedUser()) {
-      return args.accountCache.get(args.getUser().getAccountId()).getProjectWatches().keySet();
-    }
-    return Collections.<ProjectWatchKey>emptySet();
-  }
-
-  protected static List<Predicate<ChangeData>> none() {
-    Predicate<ChangeData> any = any();
-    return ImmutableList.of(not(any));
-  }
-
-  @Override
-  public int getCost() {
-    return 1;
-  }
-
-  @Override
-  public String toString() {
-    String val = describe(user);
-    if (val.indexOf(' ') < 0) {
-      return ChangeQueryBuilder.FIELD_WATCHEDBY + ":" + val;
-    }
-    return ChangeQueryBuilder.FIELD_WATCHEDBY + ":\"" + val + "\"";
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/OrSource.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/OrSource.java
deleted file mode 100644
index a703852..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/OrSource.java
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.server.query.change;
-
-import com.google.gerrit.index.query.OrPredicate;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gwtorm.server.ListResultSet;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.ResultSet;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-public class OrSource extends OrPredicate<ChangeData> implements ChangeDataSource {
-  private int cardinality = -1;
-
-  public OrSource(Collection<? extends Predicate<ChangeData>> that) {
-    super(that);
-  }
-
-  @Override
-  public ResultSet<ChangeData> read() throws OrmException {
-    // TODO(spearce) This probably should be more lazy.
-    //
-    List<ChangeData> r = new ArrayList<>();
-    Set<Change.Id> have = new HashSet<>();
-    for (Predicate<ChangeData> p : getChildren()) {
-      if (p instanceof ChangeDataSource) {
-        for (ChangeData cd : ((ChangeDataSource) p).read()) {
-          if (have.add(cd.getId())) {
-            r.add(cd);
-          }
-        }
-      } else {
-        throw new OrmException("No ChangeDataSource: " + p);
-      }
-    }
-    return new ListResultSet<>(r);
-  }
-
-  @Override
-  public boolean hasChange() {
-    for (Predicate<ChangeData> p : getChildren()) {
-      if (!(p instanceof ChangeDataSource) || !((ChangeDataSource) p).hasChange()) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  @Override
-  public int getCardinality() {
-    if (cardinality < 0) {
-      cardinality = 0;
-      for (Predicate<ChangeData> p : getChildren()) {
-        if (p instanceof ChangeDataSource) {
-          cardinality += ((ChangeDataSource) p).getCardinality();
-        }
-      }
-    }
-    return cardinality;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/OutputStreamQuery.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/OutputStreamQuery.java
deleted file mode 100644
index eef79b2..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/OutputStreamQuery.java
+++ /dev/null
@@ -1,463 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.query.change;
-
-import static com.google.common.base.Preconditions.checkState;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.common.data.LabelTypes;
-import com.google.gerrit.index.query.QueryParseException;
-import com.google.gerrit.index.query.QueryResult;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.config.TrackingFooters;
-import com.google.gerrit.server.data.ChangeAttribute;
-import com.google.gerrit.server.data.PatchSetAttribute;
-import com.google.gerrit.server.data.QueryStatsAttribute;
-import com.google.gerrit.server.events.EventFactory;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.project.SubmitRuleEvaluator;
-import com.google.gson.Gson;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.util.io.DisabledOutputStream;
-import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.DateTimeFormatter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Change query implementation that outputs to a stream in the style of an SSH command.
- *
- * <p>Instances are one-time-use. Other singleton classes should inject a Provider rather than
- * holding on to a single instance.
- */
-public class OutputStreamQuery {
-  private static final Logger log = LoggerFactory.getLogger(OutputStreamQuery.class);
-
-  private static final DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss zzz");
-
-  public enum OutputFormat {
-    TEXT,
-    JSON
-  }
-
-  private final ReviewDb db;
-  private final GitRepositoryManager repoManager;
-  private final ChangeQueryBuilder queryBuilder;
-  private final ChangeQueryProcessor queryProcessor;
-  private final EventFactory eventFactory;
-  private final TrackingFooters trackingFooters;
-  private final CurrentUser user;
-  private final SubmitRuleEvaluator.Factory submitRuleEvaluatorFactory;
-
-  private OutputFormat outputFormat = OutputFormat.TEXT;
-  private boolean includePatchSets;
-  private boolean includeCurrentPatchSet;
-  private boolean includeApprovals;
-  private boolean includeComments;
-  private boolean includeFiles;
-  private boolean includeCommitMessage;
-  private boolean includeDependencies;
-  private boolean includeSubmitRecords;
-  private boolean includeAllReviewers;
-
-  private OutputStream outputStream = DisabledOutputStream.INSTANCE;
-  private PrintWriter out;
-
-  @Inject
-  OutputStreamQuery(
-      ReviewDb db,
-      GitRepositoryManager repoManager,
-      ChangeQueryBuilder queryBuilder,
-      ChangeQueryProcessor queryProcessor,
-      EventFactory eventFactory,
-      TrackingFooters trackingFooters,
-      CurrentUser user,
-      SubmitRuleEvaluator.Factory submitRuleEvaluatorFactory) {
-    this.db = db;
-    this.repoManager = repoManager;
-    this.queryBuilder = queryBuilder;
-    this.queryProcessor = queryProcessor;
-    this.eventFactory = eventFactory;
-    this.trackingFooters = trackingFooters;
-    this.user = user;
-    this.submitRuleEvaluatorFactory = submitRuleEvaluatorFactory;
-  }
-
-  void setLimit(int n) {
-    queryProcessor.setUserProvidedLimit(n);
-  }
-
-  public void setStart(int n) {
-    queryProcessor.setStart(n);
-  }
-
-  public void setIncludePatchSets(boolean on) {
-    includePatchSets = on;
-  }
-
-  public boolean getIncludePatchSets() {
-    return includePatchSets;
-  }
-
-  public void setIncludeCurrentPatchSet(boolean on) {
-    includeCurrentPatchSet = on;
-  }
-
-  public boolean getIncludeCurrentPatchSet() {
-    return includeCurrentPatchSet;
-  }
-
-  public void setIncludeApprovals(boolean on) {
-    includeApprovals = on;
-  }
-
-  public void setIncludeComments(boolean on) {
-    includeComments = on;
-  }
-
-  public void setIncludeFiles(boolean on) {
-    includeFiles = on;
-  }
-
-  public boolean getIncludeFiles() {
-    return includeFiles;
-  }
-
-  public void setIncludeDependencies(boolean on) {
-    includeDependencies = on;
-  }
-
-  public boolean getIncludeDependencies() {
-    return includeDependencies;
-  }
-
-  public void setIncludeCommitMessage(boolean on) {
-    includeCommitMessage = on;
-  }
-
-  public void setIncludeSubmitRecords(boolean on) {
-    includeSubmitRecords = on;
-  }
-
-  public void setIncludeAllReviewers(boolean on) {
-    includeAllReviewers = on;
-  }
-
-  public void setOutput(OutputStream out, OutputFormat fmt) {
-    this.outputStream = out;
-    this.outputFormat = fmt;
-  }
-
-  public void query(String queryString) throws IOException {
-    out =
-        new PrintWriter( //
-            new BufferedWriter( //
-                new OutputStreamWriter(outputStream, UTF_8)));
-    try {
-      if (queryProcessor.isDisabled()) {
-        ErrorMessage m = new ErrorMessage();
-        m.message = "query disabled";
-        show(m);
-        return;
-      }
-
-      try {
-        final QueryStatsAttribute stats = new QueryStatsAttribute();
-        stats.runTimeMilliseconds = TimeUtil.nowMs();
-
-        Map<Project.NameKey, Repository> repos = new HashMap<>();
-        Map<Project.NameKey, RevWalk> revWalks = new HashMap<>();
-        QueryResult<ChangeData> results = queryProcessor.query(queryBuilder.parse(queryString));
-        try {
-          for (ChangeData d : results.entities()) {
-            show(buildChangeAttribute(d, repos, revWalks));
-          }
-        } finally {
-          closeAll(revWalks.values(), repos.values());
-        }
-
-        stats.rowCount = results.entities().size();
-        stats.moreChanges = results.more();
-        stats.runTimeMilliseconds = TimeUtil.nowMs() - stats.runTimeMilliseconds;
-        show(stats);
-      } catch (OrmException err) {
-        log.error("Cannot execute query: " + queryString, err);
-
-        ErrorMessage m = new ErrorMessage();
-        m.message = "cannot query database";
-        show(m);
-
-      } catch (QueryParseException e) {
-        ErrorMessage m = new ErrorMessage();
-        m.message = e.getMessage();
-        show(m);
-      }
-    } finally {
-      try {
-        out.flush();
-      } finally {
-        out = null;
-      }
-    }
-  }
-
-  private ChangeAttribute buildChangeAttribute(
-      ChangeData d, Map<Project.NameKey, Repository> repos, Map<Project.NameKey, RevWalk> revWalks)
-      throws OrmException, IOException {
-    LabelTypes labelTypes = d.getLabelTypes();
-    ChangeAttribute c = eventFactory.asChangeAttribute(db, d.change());
-    eventFactory.extend(c, d.change());
-
-    if (!trackingFooters.isEmpty()) {
-      eventFactory.addTrackingIds(c, d.trackingFooters());
-    }
-
-    if (includeAllReviewers) {
-      eventFactory.addAllReviewers(db, c, d.notes());
-    }
-
-    if (includeSubmitRecords) {
-      eventFactory.addSubmitRecords(
-          c, submitRuleEvaluatorFactory.create(user, d).setAllowClosed(true).evaluate());
-    }
-
-    if (includeCommitMessage) {
-      eventFactory.addCommitMessage(c, d.commitMessage());
-    }
-
-    RevWalk rw = null;
-    if (includePatchSets || includeCurrentPatchSet || includeDependencies) {
-      Project.NameKey p = d.change().getProject();
-      rw = revWalks.get(p);
-      // Cache and reuse repos and revwalks.
-      if (rw == null) {
-        Repository repo = repoManager.openRepository(p);
-        checkState(repos.put(p, repo) == null);
-        rw = new RevWalk(repo);
-        revWalks.put(p, rw);
-      }
-    }
-
-    if (includePatchSets) {
-      eventFactory.addPatchSets(
-          db,
-          rw,
-          c,
-          d.patchSets(),
-          includeApprovals ? d.approvals().asMap() : null,
-          includeFiles,
-          d.change(),
-          labelTypes);
-    }
-
-    if (includeCurrentPatchSet) {
-      PatchSet current = d.currentPatchSet();
-      if (current != null) {
-        c.currentPatchSet = eventFactory.asPatchSetAttribute(db, rw, d.change(), current);
-        eventFactory.addApprovals(c.currentPatchSet, d.currentApprovals(), labelTypes);
-
-        if (includeFiles) {
-          eventFactory.addPatchSetFileNames(c.currentPatchSet, d.change(), d.currentPatchSet());
-        }
-        if (includeComments) {
-          eventFactory.addPatchSetComments(c.currentPatchSet, d.publishedComments());
-        }
-      }
-    }
-
-    if (includeComments) {
-      eventFactory.addComments(c, d.messages());
-      if (includePatchSets) {
-        eventFactory.addPatchSets(
-            db,
-            rw,
-            c,
-            d.patchSets(),
-            includeApprovals ? d.approvals().asMap() : null,
-            includeFiles,
-            d.change(),
-            labelTypes);
-        for (PatchSetAttribute attribute : c.patchSets) {
-          eventFactory.addPatchSetComments(attribute, d.publishedComments());
-        }
-      }
-    }
-
-    if (includeDependencies) {
-      eventFactory.addDependencies(rw, c, d.change(), d.currentPatchSet());
-    }
-
-    c.plugins = queryProcessor.create(d);
-    return c;
-  }
-
-  private static void closeAll(Iterable<RevWalk> revWalks, Iterable<Repository> repos) {
-    if (repos != null) {
-      for (Repository repo : repos) {
-        repo.close();
-      }
-    }
-    if (revWalks != null) {
-      for (RevWalk revWalk : revWalks) {
-        revWalk.close();
-      }
-    }
-  }
-
-  private void show(Object data) {
-    switch (outputFormat) {
-      default:
-      case TEXT:
-        if (data instanceof ChangeAttribute) {
-          out.print("change ");
-          out.print(((ChangeAttribute) data).id);
-          out.print("\n");
-          showText(data, 1);
-        } else {
-          showText(data, 0);
-        }
-        out.print('\n');
-        break;
-
-      case JSON:
-        out.print(new Gson().toJson(data));
-        out.print('\n');
-        break;
-    }
-  }
-
-  private void showText(Object data, int depth) {
-    for (Field f : fieldsOf(data.getClass())) {
-      Object val;
-      try {
-        val = f.get(data);
-      } catch (IllegalArgumentException err) {
-        continue;
-      } catch (IllegalAccessException err) {
-        continue;
-      }
-      if (val == null) {
-        continue;
-      }
-
-      showField(f.getName(), val, depth);
-    }
-  }
-
-  private String indent(int spaces) {
-    if (spaces == 0) {
-      return "";
-    }
-    return String.format("%" + spaces + "s", " ");
-  }
-
-  private void showField(String field, Object value, int depth) {
-    final int spacesDepthRatio = 2;
-    String indent = indent(depth * spacesDepthRatio);
-    out.print(indent);
-    out.print(field);
-    out.print(':');
-    if (value instanceof String && ((String) value).contains("\n")) {
-      out.print(' ');
-      // Idention for multi-line text is
-      // current depth indetion + length of field + length of ": "
-      indent = indent(indent.length() + field.length() + spacesDepthRatio);
-      out.print(((String) value).replaceAll("\n", "\n" + indent).trim());
-      out.print('\n');
-    } else if (value instanceof Long && isDateField(field)) {
-      out.print(' ');
-      out.print(dtf.print(((Long) value) * 1000L));
-      out.print('\n');
-    } else if (isPrimitive(value)) {
-      out.print(' ');
-      out.print(value);
-      out.print('\n');
-    } else if (value instanceof Collection) {
-      out.print('\n');
-      boolean firstElement = true;
-      for (Object thing : ((Collection<?>) value)) {
-        // The name of the collection was initially printed at the beginning
-        // of this routine.  Beginning at the second sub-element, reprint
-        // the collection name so humans can separate individual elements
-        // with less strain and error.
-        //
-        if (firstElement) {
-          firstElement = false;
-        } else {
-          out.print(indent);
-          out.print(field);
-          out.print(":\n");
-        }
-        if (isPrimitive(thing)) {
-          out.print(' ');
-          out.print(value);
-          out.print('\n');
-        } else {
-          showText(thing, depth + 1);
-        }
-      }
-    } else {
-      out.print('\n');
-      showText(value, depth + 1);
-    }
-  }
-
-  private static boolean isPrimitive(Object value) {
-    return value instanceof String //
-        || value instanceof Number //
-        || value instanceof Boolean //
-        || value instanceof Enum;
-  }
-
-  private static boolean isDateField(String name) {
-    return "lastUpdated".equals(name) //
-        || "grantedOn".equals(name) //
-        || "timestamp".equals(name) //
-        || "createdOn".equals(name);
-  }
-
-  private List<Field> fieldsOf(Class<?> type) {
-    List<Field> r = new ArrayList<>();
-    if (type.getSuperclass() != null) {
-      r.addAll(fieldsOf(type.getSuperclass()));
-    }
-    r.addAll(Arrays.asList(type.getDeclaredFields()));
-    return r;
-  }
-
-  static class ErrorMessage {
-    public final String type = "error";
-    public String message;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/OwnerinPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/OwnerinPredicate.java
deleted file mode 100644
index fec7f26..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/OwnerinPredicate.java
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.server.query.change;
-
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gwtorm.server.OrmException;
-
-public class OwnerinPredicate extends ChangeOperatorPredicate {
-  protected final IdentifiedUser.GenericFactory userFactory;
-  protected final AccountGroup.UUID uuid;
-
-  public OwnerinPredicate(IdentifiedUser.GenericFactory userFactory, AccountGroup.UUID uuid) {
-    super(ChangeQueryBuilder.FIELD_OWNERIN, uuid.toString());
-    this.userFactory = userFactory;
-    this.uuid = uuid;
-  }
-
-  protected AccountGroup.UUID getAccountGroupUUID() {
-    return uuid;
-  }
-
-  @Override
-  public boolean match(ChangeData object) throws OrmException {
-    final Change change = object.change();
-    if (change == null) {
-      return false;
-    }
-    final IdentifiedUser owner = userFactory.create(change.getOwner());
-    return owner.getEffectiveGroups().contains(uuid);
-  }
-
-  @Override
-  public int getCost() {
-    return 2;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ParentProjectPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ParentProjectPredicate.java
deleted file mode 100644
index 19c0515..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ParentProjectPredicate.java
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.query.change;
-
-import com.google.gerrit.extensions.common.ProjectInfo;
-import com.google.gerrit.index.query.OrPredicate;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.ListChildProjects;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectResource;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.inject.Provider;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ParentProjectPredicate extends OrPredicate<ChangeData> {
-  private static final Logger log = LoggerFactory.getLogger(ParentProjectPredicate.class);
-
-  protected final String value;
-
-  public ParentProjectPredicate(
-      ProjectCache projectCache,
-      Provider<ListChildProjects> listChildProjects,
-      Provider<CurrentUser> self,
-      String value) {
-    super(predicates(projectCache, listChildProjects, self, value));
-    this.value = value;
-  }
-
-  protected static List<Predicate<ChangeData>> predicates(
-      ProjectCache projectCache,
-      Provider<ListChildProjects> listChildProjects,
-      Provider<CurrentUser> self,
-      String value) {
-    ProjectState projectState = projectCache.get(new Project.NameKey(value));
-    if (projectState == null) {
-      return Collections.emptyList();
-    }
-
-    List<Predicate<ChangeData>> r = new ArrayList<>();
-    r.add(new ProjectPredicate(projectState.getName()));
-    try {
-      ProjectResource proj = new ProjectResource(projectState.controlFor(self.get()));
-      ListChildProjects children = listChildProjects.get();
-      children.setRecursive(true);
-      for (ProjectInfo p : children.apply(proj)) {
-        r.add(new ProjectPredicate(p.name));
-      }
-    } catch (PermissionBackendException e) {
-      log.warn("cannot check permissions to expand child projects", e);
-    }
-    return r;
-  }
-
-  @Override
-  public String toString() {
-    return ChangeQueryBuilder.FIELD_PARENTPROJECT + ":" + value;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/PredicateArgs.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/PredicateArgs.java
deleted file mode 100644
index ad7a57d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/PredicateArgs.java
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.query.change;
-
-import com.google.gerrit.index.query.QueryParseException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * This class is used to extract comma separated values in a predicate.
- *
- * <p>If tags for the values are present (e.g. "branch=jb_2.3,vote=approved") then the args are
- * placed in a map that maps tag to value (e.g., "branch" to "jb_2.3"). If no tag is present (e.g.
- * "jb_2.3,approved") then the args are placed into a positional list. Args may be mixed so some may
- * appear in the map and others in the positional list (e.g. "vote=approved,jb_2.3).
- */
-public class PredicateArgs {
-  public List<String> positional;
-  public Map<String, String> keyValue;
-
-  /**
-   * Parses query arguments into {@link #keyValue} and/or {@link #positional}..
-   *
-   * <p>Labels for these arguments should be kept in ChangeQueryBuilder as {@code ARG_ID_[argument
-   * name]}.
-   *
-   * @param args arguments to be parsed
-   * @throws QueryParseException
-   */
-  PredicateArgs(String args) throws QueryParseException {
-    positional = new ArrayList<>();
-    keyValue = new HashMap<>();
-
-    String[] splitArgs = args.split(",");
-
-    for (String arg : splitArgs) {
-      String[] splitKeyValue = arg.split("=");
-
-      if (splitKeyValue.length == 1) {
-        positional.add(splitKeyValue[0]);
-      } else if (splitKeyValue.length == 2) {
-        if (!keyValue.containsKey(splitKeyValue[0])) {
-          keyValue.put(splitKeyValue[0], splitKeyValue[1]);
-        } else {
-          throw new QueryParseException("Duplicate key " + splitKeyValue[0]);
-        }
-      } else {
-        throw new QueryParseException("invalid arg " + arg);
-      }
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/QueryChanges.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/QueryChanges.java
deleted file mode 100644
index 73bb1d7..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/QueryChanges.java
+++ /dev/null
@@ -1,148 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.query.change;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Sets;
-import com.google.gerrit.extensions.client.ListChangesOption;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.index.query.QueryParseException;
-import com.google.gerrit.index.query.QueryRequiresAuthException;
-import com.google.gerrit.index.query.QueryResult;
-import com.google.gerrit.server.change.ChangeJson;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.List;
-import org.kohsuke.args4j.Option;
-
-public class QueryChanges implements RestReadView<TopLevelResource> {
-  private final ChangeJson.Factory json;
-  private final ChangeQueryBuilder qb;
-  private final ChangeQueryProcessor imp;
-  private EnumSet<ListChangesOption> options;
-
-  @Option(
-      name = "--query",
-      aliases = {"-q"},
-      metaVar = "QUERY",
-      usage = "Query string")
-  private List<String> queries;
-
-  @Option(
-      name = "--limit",
-      aliases = {"-n"},
-      metaVar = "CNT",
-      usage = "Maximum number of results to return")
-  public void setLimit(int limit) {
-    imp.setUserProvidedLimit(limit);
-  }
-
-  @Option(name = "-o", usage = "Output options per change")
-  public void addOption(ListChangesOption o) {
-    options.add(o);
-  }
-
-  @Option(name = "-O", usage = "Output option flags, in hex")
-  void setOptionFlagsHex(String hex) {
-    options.addAll(ListChangesOption.fromBits(Integer.parseInt(hex, 16)));
-  }
-
-  @Option(
-      name = "--start",
-      aliases = {"-S"},
-      metaVar = "CNT",
-      usage = "Number of changes to skip")
-  public void setStart(int start) {
-    imp.setStart(start);
-  }
-
-  @Inject
-  QueryChanges(ChangeJson.Factory json, ChangeQueryBuilder qb, ChangeQueryProcessor qp) {
-    this.json = json;
-    this.qb = qb;
-    this.imp = qp;
-
-    options = EnumSet.noneOf(ListChangesOption.class);
-  }
-
-  public void addQuery(String query) {
-    if (queries == null) {
-      queries = new ArrayList<>();
-    }
-    queries.add(query);
-  }
-
-  public String getQuery(int i) {
-    return queries.get(i);
-  }
-
-  @Override
-  public List<?> apply(TopLevelResource rsrc)
-      throws BadRequestException, AuthException, OrmException {
-    List<List<ChangeInfo>> out;
-    try {
-      out = query();
-    } catch (QueryRequiresAuthException e) {
-      throw new AuthException("Must be signed-in to use this operator");
-    } catch (QueryParseException e) {
-      throw new BadRequestException(e.getMessage(), e);
-    }
-    return out.size() == 1 ? out.get(0) : out;
-  }
-
-  private List<List<ChangeInfo>> query() throws OrmException, QueryParseException {
-    if (imp.isDisabled()) {
-      throw new QueryParseException("query disabled");
-    }
-    if (queries == null || queries.isEmpty()) {
-      queries = Collections.singletonList("status:open");
-    } else if (queries.size() > 10) {
-      // Hard-code a default maximum number of queries to prevent
-      // users from submitting too much to the server in a single call.
-      throw new QueryParseException("limit of 10 queries");
-    }
-
-    int cnt = queries.size();
-    List<QueryResult<ChangeData>> results = imp.query(qb.parse(queries));
-
-    ChangeJson cjson = json.create(options);
-    cjson.setPluginDefinedAttributesFactory(this.imp);
-    List<List<ChangeInfo>> res =
-        cjson
-            .lazyLoad(containsAnyOf(options, ChangeJson.REQUIRE_LAZY_LOAD))
-            .formatQueryResults(results);
-
-    for (int n = 0; n < cnt; n++) {
-      List<ChangeInfo> info = res.get(n);
-      if (results.get(n).more() && !info.isEmpty()) {
-        Iterables.getLast(info)._moreChanges = true;
-      }
-    }
-    return res;
-  }
-
-  private static boolean containsAnyOf(
-      EnumSet<ListChangesOption> set, ImmutableSet<ListChangesOption> toFind) {
-    return !Sets.intersection(toFind, set).isEmpty();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexPathPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexPathPredicate.java
deleted file mode 100644
index 46b4cd5..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexPathPredicate.java
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.server.query.change;
-
-import com.google.gerrit.server.index.change.ChangeField;
-import com.google.gerrit.server.util.RegexListSearcher;
-import com.google.gwtorm.server.OrmException;
-import java.io.IOException;
-import java.util.List;
-
-public class RegexPathPredicate extends ChangeRegexPredicate {
-  public RegexPathPredicate(String re) {
-    super(ChangeField.PATH, re);
-  }
-
-  @Override
-  public boolean match(ChangeData object) throws OrmException {
-    List<String> files;
-    try {
-      files = object.currentFilePaths();
-    } catch (IOException e) {
-      throw new OrmException(e);
-    }
-    return RegexListSearcher.ofStrings(getValue()).hasMatch(files);
-  }
-
-  @Override
-  public int getCost() {
-    return 1;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ReviewerByEmailPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ReviewerByEmailPredicate.java
deleted file mode 100644
index f4e979c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ReviewerByEmailPredicate.java
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.query.change;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.server.index.change.ChangeField;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.notedb.ReviewerStateInternal;
-import com.google.gwtorm.server.OrmException;
-
-class ReviewerByEmailPredicate extends ChangeIndexPredicate {
-
-  static Predicate<ChangeData> forState(Address adr, ReviewerStateInternal state) {
-    checkArgument(state != ReviewerStateInternal.REMOVED, "can't query by removed reviewer");
-    return new ReviewerByEmailPredicate(state, adr);
-  }
-
-  private final ReviewerStateInternal state;
-  private final Address adr;
-
-  private ReviewerByEmailPredicate(ReviewerStateInternal state, Address adr) {
-    super(ChangeField.REVIEWER_BY_EMAIL, ChangeField.getReviewerByEmailFieldValue(state, adr));
-    this.state = state;
-    this.adr = adr;
-  }
-
-  Address getAddress() {
-    return adr;
-  }
-
-  @Override
-  public boolean match(ChangeData cd) throws OrmException {
-    return cd.reviewersByEmail().asTable().get(state, adr) != null;
-  }
-
-  @Override
-  public int getCost() {
-    return 1;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ReviewerinPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ReviewerinPredicate.java
deleted file mode 100644
index 38f6561..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ReviewerinPredicate.java
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.server.query.change;
-
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.notedb.ReviewerStateInternal;
-import com.google.gwtorm.server.OrmException;
-
-public class ReviewerinPredicate extends ChangeOperatorPredicate {
-  protected final IdentifiedUser.GenericFactory userFactory;
-  protected final AccountGroup.UUID uuid;
-
-  public ReviewerinPredicate(IdentifiedUser.GenericFactory userFactory, AccountGroup.UUID uuid) {
-    super(ChangeQueryBuilder.FIELD_REVIEWERIN, uuid.toString());
-    this.userFactory = userFactory;
-    this.uuid = uuid;
-  }
-
-  protected AccountGroup.UUID getAccountGroupUUID() {
-    return uuid;
-  }
-
-  @Override
-  public boolean match(ChangeData object) throws OrmException {
-    for (Account.Id accountId : object.reviewers().byState(ReviewerStateInternal.REVIEWER)) {
-      IdentifiedUser reviewer = userFactory.create(accountId);
-      if (reviewer.getEffectiveGroups().contains(uuid)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  @Override
-  public int getCost() {
-    return 3;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/SingleGroupUser.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/SingleGroupUser.java
deleted file mode 100644
index a084b35..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/SingleGroupUser.java
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.query.change;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.account.GroupMembership;
-import com.google.gerrit.server.account.ListGroupMembership;
-import java.util.Set;
-
-public final class SingleGroupUser extends CurrentUser {
-  private final GroupMembership groups;
-
-  public SingleGroupUser(AccountGroup.UUID groupId) {
-    this(ImmutableSet.of(groupId));
-  }
-
-  public SingleGroupUser(Set<AccountGroup.UUID> groups) {
-    this.groups = new ListGroupMembership(groups);
-  }
-
-  @Override
-  public GroupMembership getEffectiveGroups() {
-    return groups;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/TrackingIdPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/TrackingIdPredicate.java
deleted file mode 100644
index a3566a5..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/TrackingIdPredicate.java
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.server.query.change;
-
-import com.google.gerrit.server.index.change.ChangeField;
-import com.google.gwtorm.server.OrmException;
-import java.io.IOException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class TrackingIdPredicate extends ChangeIndexPredicate {
-  private static final Logger log = LoggerFactory.getLogger(TrackingIdPredicate.class);
-
-  public TrackingIdPredicate(String trackingId) {
-    super(ChangeField.TR, trackingId);
-  }
-
-  @Override
-  public boolean match(ChangeData cd) throws OrmException {
-    try {
-      return cd.trackingFooters().containsValue(getValue());
-    } catch (IOException e) {
-      log.warn("Cannot extract footers from " + cd.getId(), e);
-    }
-    return false;
-  }
-
-  @Override
-  public int getCost() {
-    return 1;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/group/GroupIsVisibleToPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/group/GroupIsVisibleToPredicate.java
deleted file mode 100644
index ffa59c2..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/group/GroupIsVisibleToPredicate.java
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.query.group;
-
-import com.google.gerrit.common.errors.NoSuchGroupException;
-import com.google.gerrit.index.query.IsVisibleToPredicate;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.account.GroupControl;
-import com.google.gerrit.server.group.InternalGroup;
-import com.google.gerrit.server.index.IndexUtils;
-import com.google.gerrit.server.query.account.AccountQueryBuilder;
-import com.google.gwtorm.server.OrmException;
-
-public class GroupIsVisibleToPredicate extends IsVisibleToPredicate<InternalGroup> {
-  protected final GroupControl.GenericFactory groupControlFactory;
-  protected final CurrentUser user;
-
-  public GroupIsVisibleToPredicate(
-      GroupControl.GenericFactory groupControlFactory, CurrentUser user) {
-    super(AccountQueryBuilder.FIELD_VISIBLETO, IndexUtils.describe(user));
-    this.groupControlFactory = groupControlFactory;
-    this.user = user;
-  }
-
-  @Override
-  public boolean match(InternalGroup group) throws OrmException {
-    try {
-      return groupControlFactory.controlFor(user, group.getGroupUUID()).isVisible();
-    } catch (NoSuchGroupException e) {
-      // Ignored
-      return false;
-    }
-  }
-
-  @Override
-  public int getCost() {
-    return 1;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/group/GroupQueryBuilder.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/group/GroupQueryBuilder.java
deleted file mode 100644
index 057cc44..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/group/GroupQueryBuilder.java
+++ /dev/null
@@ -1,206 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.query.group;
-
-import static com.google.common.collect.ImmutableList.toImmutableList;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.Lists;
-import com.google.common.primitives.Ints;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.index.FieldDef;
-import com.google.gerrit.index.query.LimitPredicate;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.index.query.QueryBuilder;
-import com.google.gerrit.index.query.QueryParseException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.account.AccountResolver;
-import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.GroupBackends;
-import com.google.gerrit.server.account.GroupCache;
-import com.google.gerrit.server.group.InternalGroup;
-import com.google.gerrit.server.index.group.GroupField;
-import com.google.gerrit.server.index.group.GroupIndex;
-import com.google.gerrit.server.index.group.GroupIndexCollection;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-/** Parses a query string meant to be applied to group objects. */
-public class GroupQueryBuilder extends QueryBuilder<InternalGroup> {
-  public static final String FIELD_UUID = "uuid";
-  public static final String FIELD_DESCRIPTION = "description";
-  public static final String FIELD_INNAME = "inname";
-  public static final String FIELD_NAME = "name";
-  public static final String FIELD_OWNER = "owner";
-  public static final String FIELD_LIMIT = "limit";
-
-  private static final QueryBuilder.Definition<InternalGroup, GroupQueryBuilder> mydef =
-      new QueryBuilder.Definition<>(GroupQueryBuilder.class);
-
-  public static class Arguments {
-    final GroupIndex groupIndex;
-    final GroupCache groupCache;
-    final GroupBackend groupBackend;
-    final AccountResolver accountResolver;
-
-    @Inject
-    Arguments(
-        GroupIndexCollection groupIndexCollection,
-        GroupCache groupCache,
-        GroupBackend groupBackend,
-        AccountResolver accountResolver) {
-      this.groupIndex = groupIndexCollection.getSearchIndex();
-      this.groupCache = groupCache;
-      this.groupBackend = groupBackend;
-      this.accountResolver = accountResolver;
-    }
-  }
-
-  private final Arguments args;
-
-  @Inject
-  GroupQueryBuilder(Arguments args) {
-    super(mydef);
-    this.args = args;
-  }
-
-  @Operator
-  public Predicate<InternalGroup> uuid(String uuid) {
-    return GroupPredicates.uuid(new AccountGroup.UUID(uuid));
-  }
-
-  @Operator
-  public Predicate<InternalGroup> description(String description) throws QueryParseException {
-    if (Strings.isNullOrEmpty(description)) {
-      throw error("description operator requires a value");
-    }
-
-    return GroupPredicates.description(description);
-  }
-
-  @Operator
-  public Predicate<InternalGroup> inname(String namePart) {
-    if (namePart.isEmpty()) {
-      return name(namePart);
-    }
-    return GroupPredicates.inname(namePart);
-  }
-
-  @Operator
-  public Predicate<InternalGroup> name(String name) {
-    return GroupPredicates.name(name);
-  }
-
-  @Operator
-  public Predicate<InternalGroup> owner(String owner) throws QueryParseException {
-    AccountGroup.UUID groupUuid = parseGroup(owner);
-    return GroupPredicates.owner(groupUuid);
-  }
-
-  @Operator
-  public Predicate<InternalGroup> is(String value) throws QueryParseException {
-    if ("visibletoall".equalsIgnoreCase(value)) {
-      return GroupPredicates.isVisibleToAll();
-    }
-    throw error("Invalid query");
-  }
-
-  @Override
-  protected Predicate<InternalGroup> defaultField(String query) throws QueryParseException {
-    // Adapt the capacity of this list when adding more default predicates.
-    List<Predicate<InternalGroup>> preds = Lists.newArrayListWithCapacity(5);
-    preds.add(uuid(query));
-    preds.add(name(query));
-    preds.add(inname(query));
-    if (!Strings.isNullOrEmpty(query)) {
-      preds.add(description(query));
-    }
-    try {
-      preds.add(owner(query));
-    } catch (QueryParseException e) {
-      // Skip.
-    }
-    return Predicate.or(preds);
-  }
-
-  @Operator
-  public Predicate<InternalGroup> member(String query)
-      throws QueryParseException, OrmException, ConfigInvalidException, IOException {
-    if (isFieldAbsentFromIndex(GroupField.MEMBER)) {
-      throw getExceptionForUnsupportedOperator("member");
-    }
-
-    Set<Account.Id> accounts = parseAccount(query);
-    List<Predicate<InternalGroup>> predicates =
-        accounts.stream().map(GroupPredicates::member).collect(toImmutableList());
-    return Predicate.or(predicates);
-  }
-
-  @Operator
-  public Predicate<InternalGroup> subgroup(String query) throws QueryParseException {
-    if (isFieldAbsentFromIndex(GroupField.SUBGROUP)) {
-      throw getExceptionForUnsupportedOperator("subgroup");
-    }
-
-    AccountGroup.UUID groupUuid = parseGroup(query);
-    return GroupPredicates.subgroup(groupUuid);
-  }
-
-  @Operator
-  public Predicate<InternalGroup> limit(String query) throws QueryParseException {
-    Integer limit = Ints.tryParse(query);
-    if (limit == null) {
-      throw error("Invalid limit: " + query);
-    }
-    return new LimitPredicate<>(FIELD_LIMIT, limit);
-  }
-
-  private boolean isFieldAbsentFromIndex(FieldDef<InternalGroup, ?> field) {
-    return !args.groupIndex.getSchema().hasField(field);
-  }
-
-  private static QueryParseException getExceptionForUnsupportedOperator(String operatorName) {
-    return new QueryParseException(
-        String.format("'%s' operator is not supported by group index version", operatorName));
-  }
-
-  private Set<Account.Id> parseAccount(String nameOrEmail)
-      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
-    Set<Account.Id> foundAccounts = args.accountResolver.findAll(nameOrEmail);
-    if (foundAccounts.isEmpty()) {
-      throw error("User " + nameOrEmail + " not found");
-    }
-    return foundAccounts;
-  }
-
-  private AccountGroup.UUID parseGroup(String groupNameOrUuid) throws QueryParseException {
-    Optional<InternalGroup> group = args.groupCache.get(new AccountGroup.UUID(groupNameOrUuid));
-    if (group.isPresent()) {
-      return group.get().getGroupUUID();
-    }
-    GroupReference groupReference =
-        GroupBackends.findBestSuggestion(args.groupBackend, groupNameOrUuid);
-    if (groupReference == null) {
-      throw error("Group " + groupNameOrUuid + " not found");
-    }
-    return groupReference.getUUID();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/group/GroupQueryProcessor.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/group/GroupQueryProcessor.java
deleted file mode 100644
index 8554ecf..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/group/GroupQueryProcessor.java
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.query.group;
-
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.gerrit.server.query.group.GroupQueryBuilder.FIELD_LIMIT;
-
-import com.google.gerrit.index.IndexConfig;
-import com.google.gerrit.index.query.AndSource;
-import com.google.gerrit.index.query.IndexPredicate;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.index.query.QueryProcessor;
-import com.google.gerrit.metrics.MetricMaker;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.account.AccountLimits;
-import com.google.gerrit.server.account.GroupControl;
-import com.google.gerrit.server.group.InternalGroup;
-import com.google.gerrit.server.index.group.GroupIndexCollection;
-import com.google.gerrit.server.index.group.GroupIndexRewriter;
-import com.google.gerrit.server.index.group.GroupSchemaDefinitions;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-
-/**
- * Query processor for the group index.
- *
- * <p>Instances are one-time-use. Other singleton classes should inject a Provider rather than
- * holding on to a single instance.
- */
-public class GroupQueryProcessor extends QueryProcessor<InternalGroup> {
-  private final Provider<CurrentUser> userProvider;
-  private final GroupControl.GenericFactory groupControlFactory;
-
-  static {
-    // It is assumed that basic rewrites do not touch visibleto predicates.
-    checkState(
-        !GroupIsVisibleToPredicate.class.isAssignableFrom(IndexPredicate.class),
-        "GroupQueryProcessor assumes visibleto is not used by the index rewriter.");
-  }
-
-  @Inject
-  protected GroupQueryProcessor(
-      Provider<CurrentUser> userProvider,
-      AccountLimits.Factory limitsFactory,
-      MetricMaker metricMaker,
-      IndexConfig indexConfig,
-      GroupIndexCollection indexes,
-      GroupIndexRewriter rewriter,
-      GroupControl.GenericFactory groupControlFactory) {
-    super(
-        metricMaker,
-        GroupSchemaDefinitions.INSTANCE,
-        indexConfig,
-        indexes,
-        rewriter,
-        FIELD_LIMIT,
-        () -> limitsFactory.create(userProvider.get()).getQueryLimit());
-    this.userProvider = userProvider;
-    this.groupControlFactory = groupControlFactory;
-  }
-
-  @Override
-  protected Predicate<InternalGroup> enforceVisibility(Predicate<InternalGroup> pred) {
-    return new AndSource<>(
-        pred, new GroupIsVisibleToPredicate(groupControlFactory, userProvider.get()), start);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/group/InternalGroupQuery.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/group/InternalGroupQuery.java
deleted file mode 100644
index b1d44e4..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/group/InternalGroupQuery.java
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.query.group;
-
-import static com.google.common.collect.ImmutableList.toImmutableList;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.index.IndexConfig;
-import com.google.gerrit.index.query.InternalQuery;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.group.InternalGroup;
-import com.google.gerrit.server.index.group.GroupIndexCollection;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.util.List;
-import java.util.Optional;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Query wrapper for the group index.
- *
- * <p>Instances are one-time-use. Other singleton classes should inject a Provider rather than
- * holding on to a single instance.
- */
-public class InternalGroupQuery extends InternalQuery<InternalGroup> {
-  private static final Logger log = LoggerFactory.getLogger(InternalGroupQuery.class);
-
-  @Inject
-  InternalGroupQuery(
-      GroupQueryProcessor queryProcessor, GroupIndexCollection indexes, IndexConfig indexConfig) {
-    super(queryProcessor, indexes, indexConfig);
-  }
-
-  public Optional<InternalGroup> byName(AccountGroup.NameKey groupName) throws OrmException {
-    return getOnlyGroup(GroupPredicates.name(groupName.get()), "group name '" + groupName + "'");
-  }
-
-  public Optional<InternalGroup> byId(AccountGroup.Id groupId) throws OrmException {
-    return getOnlyGroup(GroupPredicates.id(groupId), "group id '" + groupId + "'");
-  }
-
-  public List<InternalGroup> byMember(Account.Id memberId) throws OrmException {
-    return query(GroupPredicates.member(memberId));
-  }
-
-  public List<InternalGroup> bySubgroup(AccountGroup.UUID subgroupId) throws OrmException {
-    return query(GroupPredicates.subgroup(subgroupId));
-  }
-
-  private Optional<InternalGroup> getOnlyGroup(
-      Predicate<InternalGroup> predicate, String groupDescription) throws OrmException {
-    List<InternalGroup> groups = query(predicate);
-    if (groups.isEmpty()) {
-      return Optional.empty();
-    }
-
-    if (groups.size() == 1) {
-      return Optional.of(Iterables.getOnlyElement(groups));
-    }
-
-    ImmutableList<AccountGroup.UUID> groupUuids =
-        groups.stream().map(InternalGroup::getGroupUUID).collect(toImmutableList());
-    log.warn("Ambiguous {} for groups {}.", groupDescription, groupUuids);
-    return Optional.empty();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/AclUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/AclUtil.java
deleted file mode 100644
index 3b87fb6..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/AclUtil.java
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.schema;
-
-import com.google.gerrit.common.data.AccessSection;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.common.data.PermissionRule;
-import com.google.gerrit.server.git.ProjectConfig;
-
-public class AclUtil {
-  public static void grant(
-      ProjectConfig config, AccessSection section, String permission, GroupReference... groupList) {
-    grant(config, section, permission, false, groupList);
-  }
-
-  public static void grant(
-      ProjectConfig config,
-      AccessSection section,
-      String permission,
-      boolean force,
-      GroupReference... groupList) {
-    grant(config, section, permission, force, null, groupList);
-  }
-
-  public static void grant(
-      ProjectConfig config,
-      AccessSection section,
-      String permission,
-      boolean force,
-      Boolean exclusive,
-      GroupReference... groupList) {
-    Permission p = section.getPermission(permission, true);
-    if (exclusive != null) {
-      p.setExclusiveGroup(exclusive);
-    }
-    for (GroupReference group : groupList) {
-      if (group != null) {
-        PermissionRule r = rule(config, group);
-        r.setForce(force);
-        p.add(r);
-      }
-    }
-  }
-
-  public static void block(
-      ProjectConfig config, AccessSection section, String permission, GroupReference... groupList) {
-    Permission p = section.getPermission(permission, true);
-    for (GroupReference group : groupList) {
-      if (group != null) {
-        PermissionRule r = rule(config, group);
-        r.setBlock();
-        p.add(r);
-      }
-    }
-  }
-
-  public static void grant(
-      ProjectConfig config,
-      AccessSection section,
-      LabelType type,
-      int min,
-      int max,
-      GroupReference... groupList) {
-    String name = Permission.LABEL + type.getName();
-    Permission p = section.getPermission(name, true);
-    for (GroupReference group : groupList) {
-      if (group != null) {
-        PermissionRule r = rule(config, group);
-        r.setRange(min, max);
-        p.add(r);
-      }
-    }
-  }
-
-  public static PermissionRule rule(ProjectConfig config, GroupReference group) {
-    return new PermissionRule(config.resolve(group));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/AllProjectsCreator.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/AllProjectsCreator.java
deleted file mode 100644
index dfcacb7..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/AllProjectsCreator.java
+++ /dev/null
@@ -1,245 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.schema;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.gerrit.reviewdb.client.RefNames.REFS_SEQUENCES;
-import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
-import static com.google.gerrit.server.group.SystemGroupBackend.PROJECT_OWNERS;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-import static com.google.gerrit.server.schema.AclUtil.grant;
-import static com.google.gerrit.server.schema.AclUtil.rule;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.common.Version;
-import com.google.gerrit.common.data.AccessSection;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.LabelValue;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.common.data.PermissionRule;
-import com.google.gerrit.common.data.PermissionRule.Action;
-import com.google.gerrit.extensions.client.InheritableBoolean;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.Sequences;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.group.SystemGroupBackend;
-import com.google.gerrit.server.notedb.NotesMigration;
-import com.google.gerrit.server.notedb.RepoSequence;
-import com.google.inject.Inject;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.BatchRefUpdate;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.NullProgressMonitor;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.ReceiveCommand;
-
-/** Creates the {@code All-Projects} repository and initial ACLs. */
-public class AllProjectsCreator {
-  private final GitRepositoryManager mgr;
-  private final AllProjectsName allProjectsName;
-  private final PersonIdent serverUser;
-  private final NotesMigration notesMigration;
-  private String message;
-  private int firstChangeId = ReviewDb.FIRST_CHANGE_ID;
-
-  private GroupReference admin;
-  private GroupReference batch;
-  private GroupReference anonymous;
-  private GroupReference registered;
-  private GroupReference owners;
-
-  @Inject
-  AllProjectsCreator(
-      GitRepositoryManager mgr,
-      AllProjectsName allProjectsName,
-      SystemGroupBackend systemGroupBackend,
-      @GerritPersonIdent PersonIdent serverUser,
-      NotesMigration notesMigration) {
-    this.mgr = mgr;
-    this.allProjectsName = allProjectsName;
-    this.serverUser = serverUser;
-    this.notesMigration = notesMigration;
-
-    this.anonymous = systemGroupBackend.getGroup(ANONYMOUS_USERS);
-    this.registered = systemGroupBackend.getGroup(REGISTERED_USERS);
-    this.owners = systemGroupBackend.getGroup(PROJECT_OWNERS);
-  }
-
-  public AllProjectsCreator setAdministrators(GroupReference admin) {
-    this.admin = admin;
-    return this;
-  }
-
-  public AllProjectsCreator setBatchUsers(GroupReference batch) {
-    this.batch = batch;
-    return this;
-  }
-
-  public AllProjectsCreator setCommitMessage(String message) {
-    this.message = message;
-    return this;
-  }
-
-  public AllProjectsCreator setFirstChangeIdForNoteDb(int id) {
-    checkArgument(id > 0, "id must be positive: %s", id);
-    firstChangeId = id;
-    return this;
-  }
-
-  public void create() throws IOException, ConfigInvalidException {
-    try (Repository git = mgr.openRepository(allProjectsName)) {
-      initAllProjects(git);
-    } catch (RepositoryNotFoundException notFound) {
-      // A repository may be missing if this project existed only to store
-      // inheritable permissions. For example 'All-Projects'.
-      try (Repository git = mgr.createRepository(allProjectsName)) {
-        initAllProjects(git);
-        RefUpdate u = git.updateRef(Constants.HEAD);
-        u.link(RefNames.REFS_CONFIG);
-      } catch (RepositoryNotFoundException err) {
-        String name = allProjectsName.get();
-        throw new IOException("Cannot create repository " + name, err);
-      }
-    }
-  }
-
-  private void initAllProjects(Repository git) throws IOException, ConfigInvalidException {
-    BatchRefUpdate bru = git.getRefDatabase().newBatchUpdate();
-    try (MetaDataUpdate md =
-        new MetaDataUpdate(GitReferenceUpdated.DISABLED, allProjectsName, git, bru)) {
-      md.getCommitBuilder().setAuthor(serverUser);
-      md.getCommitBuilder().setCommitter(serverUser);
-      md.setMessage(
-          MoreObjects.firstNonNull(
-              Strings.emptyToNull(message),
-              "Initialized Gerrit Code Review " + Version.getVersion()));
-
-      ProjectConfig config = ProjectConfig.read(md);
-      Project p = config.getProject();
-      p.setDescription("Access inherited by all other projects.");
-      p.setRequireChangeID(InheritableBoolean.TRUE);
-      p.setUseContentMerge(InheritableBoolean.TRUE);
-      p.setUseContributorAgreements(InheritableBoolean.FALSE);
-      p.setUseSignedOffBy(InheritableBoolean.FALSE);
-      p.setEnableSignedPush(InheritableBoolean.FALSE);
-
-      AccessSection cap = config.getAccessSection(AccessSection.GLOBAL_CAPABILITIES, true);
-      AccessSection all = config.getAccessSection(AccessSection.ALL, true);
-      AccessSection heads = config.getAccessSection(AccessSection.HEADS, true);
-      AccessSection tags = config.getAccessSection("refs/tags/*", true);
-      AccessSection meta = config.getAccessSection(RefNames.REFS_CONFIG, true);
-      AccessSection refsFor = config.getAccessSection("refs/for/*", true);
-      AccessSection magic = config.getAccessSection("refs/for/" + AccessSection.ALL, true);
-
-      grant(config, cap, GlobalCapability.ADMINISTRATE_SERVER, admin);
-      grant(config, all, Permission.READ, admin, anonymous);
-      grant(config, refsFor, Permission.ADD_PATCH_SET, registered);
-
-      if (batch != null) {
-        Permission priority = cap.getPermission(GlobalCapability.PRIORITY, true);
-        PermissionRule r = rule(config, batch);
-        r.setAction(Action.BATCH);
-        priority.add(r);
-
-        Permission stream = cap.getPermission(GlobalCapability.STREAM_EVENTS, true);
-        stream.add(rule(config, batch));
-      }
-
-      LabelType cr = initCodeReviewLabel(config);
-      grant(config, heads, cr, -1, 1, registered);
-      grant(config, heads, cr, -2, 2, admin, owners);
-      grant(config, heads, Permission.CREATE, admin, owners);
-      grant(config, heads, Permission.PUSH, admin, owners);
-      grant(config, heads, Permission.SUBMIT, admin, owners);
-      grant(config, heads, Permission.FORGE_AUTHOR, registered);
-      grant(config, heads, Permission.FORGE_COMMITTER, admin, owners);
-      grant(config, heads, Permission.EDIT_TOPIC_NAME, true, admin, owners);
-
-      grant(config, tags, Permission.CREATE, admin, owners);
-      grant(config, tags, Permission.CREATE_TAG, admin, owners);
-      grant(config, tags, Permission.CREATE_SIGNED_TAG, admin, owners);
-
-      grant(config, magic, Permission.PUSH, registered);
-      grant(config, magic, Permission.PUSH_MERGE, registered);
-
-      meta.getPermission(Permission.READ, true).setExclusiveGroup(true);
-      grant(config, meta, Permission.READ, admin, owners);
-      grant(config, meta, cr, -2, 2, admin, owners);
-      grant(config, meta, Permission.CREATE, admin, owners);
-      grant(config, meta, Permission.PUSH, admin, owners);
-      grant(config, meta, Permission.SUBMIT, admin, owners);
-
-      config.commitToNewRef(md, RefNames.REFS_CONFIG);
-      initSequences(git, bru);
-      execute(git, bru);
-    }
-  }
-
-  public static LabelType initCodeReviewLabel(ProjectConfig c) {
-    LabelType type =
-        new LabelType(
-            "Code-Review",
-            ImmutableList.of(
-                new LabelValue((short) 2, "Looks good to me, approved"),
-                new LabelValue((short) 1, "Looks good to me, but someone else must approve"),
-                new LabelValue((short) 0, "No score"),
-                new LabelValue((short) -1, "I would prefer this is not merged as is"),
-                new LabelValue((short) -2, "This shall not be merged")));
-    type.setCopyMinScore(true);
-    type.setCopyAllScoresOnTrivialRebase(true);
-    c.getLabelSections().put(type.getName(), type);
-    return type;
-  }
-
-  private void initSequences(Repository git, BatchRefUpdate bru) throws IOException {
-    if (notesMigration.readChangeSequence()
-        && git.exactRef(REFS_SEQUENCES + Sequences.NAME_CHANGES) == null) {
-      // Can't easily reuse the inserter from MetaDataUpdate, but this shouldn't slow down site
-      // initialization unduly.
-      try (ObjectInserter ins = git.newObjectInserter()) {
-        bru.addCommand(RepoSequence.storeNew(ins, Sequences.NAME_CHANGES, firstChangeId));
-        ins.flush();
-      }
-    }
-  }
-
-  private void execute(Repository git, BatchRefUpdate bru) throws IOException {
-    try (RevWalk rw = new RevWalk(git)) {
-      bru.execute(rw, NullProgressMonitor.INSTANCE);
-    }
-    for (ReceiveCommand cmd : bru.getCommands()) {
-      if (cmd.getResult() != ReceiveCommand.Result.OK) {
-        throw new IOException("Failed to initialize " + allProjectsName + " refs:\n" + bru);
-      }
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/AllUsersCreator.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/AllUsersCreator.java
deleted file mode 100644
index b524ecc..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/AllUsersCreator.java
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.schema;
-
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-import static com.google.gerrit.server.schema.AclUtil.grant;
-
-import com.google.gerrit.common.Version;
-import com.google.gerrit.common.data.AccessSection;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.group.SystemGroupBackend;
-import com.google.gerrit.server.project.RefPattern;
-import com.google.inject.Inject;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-
-/** Creates the {@code All-Users} repository. */
-public class AllUsersCreator {
-  private final GitRepositoryManager mgr;
-  private final AllUsersName allUsersName;
-  private final PersonIdent serverUser;
-  private final GroupReference registered;
-
-  private GroupReference admin;
-
-  @Inject
-  AllUsersCreator(
-      GitRepositoryManager mgr,
-      AllUsersName allUsersName,
-      SystemGroupBackend systemGroupBackend,
-      @GerritPersonIdent PersonIdent serverUser) {
-    this.mgr = mgr;
-    this.allUsersName = allUsersName;
-    this.serverUser = serverUser;
-    this.registered = systemGroupBackend.getGroup(REGISTERED_USERS);
-  }
-
-  public AllUsersCreator setAdministrators(GroupReference admin) {
-    this.admin = admin;
-    return this;
-  }
-
-  public void create() throws IOException, ConfigInvalidException {
-    try (Repository git = mgr.openRepository(allUsersName)) {
-      initAllUsers(git);
-    } catch (RepositoryNotFoundException notFound) {
-      try (Repository git = mgr.createRepository(allUsersName)) {
-        initAllUsers(git);
-      } catch (RepositoryNotFoundException err) {
-        String name = allUsersName.get();
-        throw new IOException("Cannot create repository " + name, err);
-      }
-    }
-  }
-
-  private void initAllUsers(Repository git) throws IOException, ConfigInvalidException {
-    try (MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, git)) {
-      md.getCommitBuilder().setAuthor(serverUser);
-      md.getCommitBuilder().setCommitter(serverUser);
-      md.setMessage("Initialized Gerrit Code Review " + Version.getVersion());
-
-      ProjectConfig config = ProjectConfig.read(md);
-      Project project = config.getProject();
-      project.setDescription("Individual user settings and preferences.");
-
-      AccessSection users =
-          config.getAccessSection(
-              RefNames.REFS_USERS + "${" + RefPattern.USERID_SHARDED + "}", true);
-      LabelType cr = AllProjectsCreator.initCodeReviewLabel(config);
-      grant(config, users, Permission.READ, false, true, registered);
-      grant(config, users, Permission.PUSH, false, true, registered);
-      grant(config, users, Permission.SUBMIT, false, true, registered);
-      grant(config, users, cr, -2, 2, registered);
-
-      AccessSection defaults = config.getAccessSection(RefNames.REFS_USERS_DEFAULT, true);
-      defaults.getPermission(Permission.READ, true).setExclusiveGroup(true);
-      grant(config, defaults, Permission.READ, admin);
-      defaults.getPermission(Permission.PUSH, true).setExclusiveGroup(true);
-      grant(config, defaults, Permission.PUSH, admin);
-      defaults.getPermission(Permission.CREATE, true).setExclusiveGroup(true);
-      grant(config, defaults, Permission.CREATE, admin);
-
-      config.commit(md);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/JdbcAccountPatchReviewStore.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/JdbcAccountPatchReviewStore.java
deleted file mode 100644
index 43f39b2..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/JdbcAccountPatchReviewStore.java
+++ /dev/null
@@ -1,355 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.schema;
-
-import static java.util.concurrent.TimeUnit.MILLISECONDS;
-import static java.util.concurrent.TimeUnit.SECONDS;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.primitives.Ints;
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.lifecycle.LifecycleModule;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.server.change.AccountPatchReviewStore;
-import com.google.gerrit.server.config.ConfigUtil;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.config.ThreadSettingsConfig;
-import com.google.gwtorm.server.OrmDuplicateKeyException;
-import com.google.gwtorm.server.OrmException;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.Collection;
-import java.util.Optional;
-import javax.sql.DataSource;
-import org.apache.commons.dbcp.BasicDataSource;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public abstract class JdbcAccountPatchReviewStore
-    implements AccountPatchReviewStore, LifecycleListener {
-  private static final String ACCOUNT_PATCH_REVIEW_DB = "accountPatchReviewDb";
-  private static final String H2_DB = "h2";
-  private static final String MARIADB = "mariadb";
-  private static final String MYSQL = "mysql";
-  private static final String POSTGRESQL = "postgresql";
-  private static final String URL = "url";
-  private static final Logger log = LoggerFactory.getLogger(JdbcAccountPatchReviewStore.class);
-
-  public static class Module extends LifecycleModule {
-    private final Config cfg;
-
-    public Module(Config cfg) {
-      this.cfg = cfg;
-    }
-
-    @Override
-    protected void configure() {
-      Class<? extends JdbcAccountPatchReviewStore> impl;
-      String url = cfg.getString(ACCOUNT_PATCH_REVIEW_DB, null, URL);
-      if (url == null || url.contains(H2_DB)) {
-        impl = H2AccountPatchReviewStore.class;
-      } else if (url.contains(POSTGRESQL)) {
-        impl = PostgresqlAccountPatchReviewStore.class;
-      } else if (url.contains(MYSQL)) {
-        impl = MysqlAccountPatchReviewStore.class;
-      } else if (url.contains(MARIADB)) {
-        impl = MariaDBAccountPatchReviewStore.class;
-      } else {
-        throw new IllegalArgumentException(
-            "unsupported driver type for account patch reviews db: " + url);
-      }
-      DynamicItem.bind(binder(), AccountPatchReviewStore.class).to(impl);
-      listener().to(impl);
-    }
-  }
-
-  private DataSource ds;
-
-  public static JdbcAccountPatchReviewStore createAccountPatchReviewStore(
-      Config cfg, SitePaths sitePaths, ThreadSettingsConfig threadSettingsConfig) {
-    String url = cfg.getString(ACCOUNT_PATCH_REVIEW_DB, null, URL);
-    if (url == null || url.contains(H2_DB)) {
-      return new H2AccountPatchReviewStore(cfg, sitePaths, threadSettingsConfig);
-    }
-    if (url.contains(POSTGRESQL)) {
-      return new PostgresqlAccountPatchReviewStore(cfg, sitePaths, threadSettingsConfig);
-    }
-    if (url.contains(MYSQL)) {
-      return new MysqlAccountPatchReviewStore(cfg, sitePaths, threadSettingsConfig);
-    }
-    if (url.contains(MARIADB)) {
-      return new MariaDBAccountPatchReviewStore(cfg, sitePaths, threadSettingsConfig);
-    }
-    throw new IllegalArgumentException(
-        "unsupported driver type for account patch reviews db: " + url);
-  }
-
-  protected JdbcAccountPatchReviewStore(
-      Config cfg, SitePaths sitePaths, ThreadSettingsConfig threadSettingsConfig) {
-    this.ds = createDataSource(cfg, sitePaths, threadSettingsConfig);
-  }
-
-  protected JdbcAccountPatchReviewStore(DataSource ds) {
-    this.ds = ds;
-  }
-
-  private static String getUrl(@GerritServerConfig Config cfg, SitePaths sitePaths) {
-    String url = cfg.getString(ACCOUNT_PATCH_REVIEW_DB, null, URL);
-    if (url == null) {
-      return H2.createUrl(sitePaths.db_dir.resolve("account_patch_reviews"));
-    }
-    return url;
-  }
-
-  private static DataSource createDataSource(
-      Config cfg, SitePaths sitePaths, ThreadSettingsConfig threadSettingsConfig) {
-    BasicDataSource datasource = new BasicDataSource();
-    String url = getUrl(cfg, sitePaths);
-    int poolLimit = threadSettingsConfig.getDatabasePoolLimit();
-    datasource.setUrl(url);
-    datasource.setDriverClassName(getDriverFromUrl(url));
-    datasource.setMaxActive(cfg.getInt(ACCOUNT_PATCH_REVIEW_DB, "poolLimit", poolLimit));
-    datasource.setMinIdle(cfg.getInt(ACCOUNT_PATCH_REVIEW_DB, "poolminidle", 4));
-    datasource.setMaxIdle(
-        cfg.getInt(ACCOUNT_PATCH_REVIEW_DB, "poolmaxidle", Math.min(poolLimit, 16)));
-    datasource.setInitialSize(datasource.getMinIdle());
-    datasource.setMaxWait(
-        ConfigUtil.getTimeUnit(
-            cfg,
-            ACCOUNT_PATCH_REVIEW_DB,
-            null,
-            "poolmaxwait",
-            MILLISECONDS.convert(30, SECONDS),
-            MILLISECONDS));
-    long evictIdleTimeMs = 1000L * 60;
-    datasource.setMinEvictableIdleTimeMillis(evictIdleTimeMs);
-    datasource.setTimeBetweenEvictionRunsMillis(evictIdleTimeMs / 2);
-    return datasource;
-  }
-
-  private static String getDriverFromUrl(String url) {
-    if (url.contains(POSTGRESQL)) {
-      return "org.postgresql.Driver";
-    }
-    if (url.contains(MYSQL)) {
-      return "com.mysql.jdbc.Driver";
-    }
-    if (url.contains(MARIADB)) {
-      return "org.mariadb.jdbc.Driver";
-    }
-    return "org.h2.Driver";
-  }
-
-  @Override
-  public void start() {
-    try {
-      createTableIfNotExists();
-    } catch (OrmException e) {
-      log.error("Failed to create table to store account patch reviews", e);
-    }
-  }
-
-  public Connection getConnection() throws SQLException {
-    return ds.getConnection();
-  }
-
-  public void createTableIfNotExists() throws OrmException {
-    try (Connection con = ds.getConnection();
-        Statement stmt = con.createStatement()) {
-      doCreateTable(stmt);
-    } catch (SQLException e) {
-      throw convertError("create", e);
-    }
-  }
-
-  protected void doCreateTable(Statement stmt) throws SQLException {
-    stmt.executeUpdate(
-        "CREATE TABLE IF NOT EXISTS account_patch_reviews ("
-            + "account_id INTEGER DEFAULT 0 NOT NULL, "
-            + "change_id INTEGER DEFAULT 0 NOT NULL, "
-            + "patch_set_id INTEGER DEFAULT 0 NOT NULL, "
-            + "file_name VARCHAR(4096) DEFAULT '' NOT NULL, "
-            + "CONSTRAINT primary_key_account_patch_reviews "
-            + "PRIMARY KEY (change_id, patch_set_id, account_id, file_name)"
-            + ")");
-  }
-
-  public void dropTableIfExists() throws OrmException {
-    try (Connection con = ds.getConnection();
-        Statement stmt = con.createStatement()) {
-      stmt.executeUpdate("DROP TABLE IF EXISTS account_patch_reviews");
-    } catch (SQLException e) {
-      throw convertError("create", e);
-    }
-  }
-
-  @Override
-  public void stop() {}
-
-  @Override
-  public boolean markReviewed(PatchSet.Id psId, Account.Id accountId, String path)
-      throws OrmException {
-    try (Connection con = ds.getConnection();
-        PreparedStatement stmt =
-            con.prepareStatement(
-                "INSERT INTO account_patch_reviews "
-                    + "(account_id, change_id, patch_set_id, file_name) VALUES "
-                    + "(?, ?, ?, ?)")) {
-      stmt.setInt(1, accountId.get());
-      stmt.setInt(2, psId.getParentKey().get());
-      stmt.setInt(3, psId.get());
-      stmt.setString(4, path);
-      stmt.executeUpdate();
-      return true;
-    } catch (SQLException e) {
-      OrmException ormException = convertError("insert", e);
-      if (ormException instanceof OrmDuplicateKeyException) {
-        return false;
-      }
-      throw ormException;
-    }
-  }
-
-  @Override
-  public void markReviewed(PatchSet.Id psId, Account.Id accountId, Collection<String> paths)
-      throws OrmException {
-    if (paths == null || paths.isEmpty()) {
-      return;
-    }
-
-    try (Connection con = ds.getConnection();
-        PreparedStatement stmt =
-            con.prepareStatement(
-                "INSERT INTO account_patch_reviews "
-                    + "(account_id, change_id, patch_set_id, file_name) VALUES "
-                    + "(?, ?, ?, ?)")) {
-      for (String path : paths) {
-        stmt.setInt(1, accountId.get());
-        stmt.setInt(2, psId.getParentKey().get());
-        stmt.setInt(3, psId.get());
-        stmt.setString(4, path);
-        stmt.addBatch();
-      }
-      stmt.executeBatch();
-    } catch (SQLException e) {
-      OrmException ormException = convertError("insert", e);
-      if (ormException instanceof OrmDuplicateKeyException) {
-        return;
-      }
-      throw ormException;
-    }
-  }
-
-  @Override
-  public void clearReviewed(PatchSet.Id psId, Account.Id accountId, String path)
-      throws OrmException {
-    try (Connection con = ds.getConnection();
-        PreparedStatement stmt =
-            con.prepareStatement(
-                "DELETE FROM account_patch_reviews "
-                    + "WHERE account_id = ? AND change_id = ? AND "
-                    + "patch_set_id = ? AND file_name = ?")) {
-      stmt.setInt(1, accountId.get());
-      stmt.setInt(2, psId.getParentKey().get());
-      stmt.setInt(3, psId.get());
-      stmt.setString(4, path);
-      stmt.executeUpdate();
-    } catch (SQLException e) {
-      throw convertError("delete", e);
-    }
-  }
-
-  @Override
-  public void clearReviewed(PatchSet.Id psId) throws OrmException {
-    try (Connection con = ds.getConnection();
-        PreparedStatement stmt =
-            con.prepareStatement(
-                "DELETE FROM account_patch_reviews "
-                    + "WHERE change_id = ? AND patch_set_id = ?")) {
-      stmt.setInt(1, psId.getParentKey().get());
-      stmt.setInt(2, psId.get());
-      stmt.executeUpdate();
-    } catch (SQLException e) {
-      throw convertError("delete", e);
-    }
-  }
-
-  @Override
-  public Optional<PatchSetWithReviewedFiles> findReviewed(PatchSet.Id psId, Account.Id accountId)
-      throws OrmException {
-    try (Connection con = ds.getConnection();
-        PreparedStatement stmt =
-            con.prepareStatement(
-                "SELECT patch_set_id, file_name FROM account_patch_reviews APR1 "
-                    + "WHERE account_id = ? AND change_id = ? AND patch_set_id = "
-                    + "(SELECT MAX(patch_set_id) FROM account_patch_reviews APR2 WHERE "
-                    + "APR1.account_id = APR2.account_id "
-                    + "AND APR1.change_id = APR2.change_id "
-                    + "AND patch_set_id <= ?)")) {
-      stmt.setInt(1, accountId.get());
-      stmt.setInt(2, psId.getParentKey().get());
-      stmt.setInt(3, psId.get());
-      try (ResultSet rs = stmt.executeQuery()) {
-        if (rs.next()) {
-          PatchSet.Id id = new PatchSet.Id(psId.getParentKey(), rs.getInt("patch_set_id"));
-          ImmutableSet.Builder<String> builder = ImmutableSet.builder();
-          do {
-            builder.add(rs.getString("file_name"));
-          } while (rs.next());
-
-          return Optional.of(
-              AccountPatchReviewStore.PatchSetWithReviewedFiles.create(id, builder.build()));
-        }
-
-        return Optional.empty();
-      }
-    } catch (SQLException e) {
-      throw convertError("select", e);
-    }
-  }
-
-  public OrmException convertError(String op, SQLException err) {
-    if (err.getCause() == null && err.getNextException() != null) {
-      err.initCause(err.getNextException());
-    }
-    return new OrmException(op + " failure on account_patch_reviews", err);
-  }
-
-  private static String getSQLState(SQLException err) {
-    String ec;
-    SQLException next = err;
-    do {
-      ec = next.getSQLState();
-      next = next.getNextException();
-    } while (ec == null && next != null);
-    return ec;
-  }
-
-  protected static int getSQLStateInt(SQLException err) {
-    String s = getSQLState(err);
-    if (s != null) {
-      Integer i = Ints.tryParse(s);
-      return i != null ? i : -1;
-    }
-    return 0;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/JdbcUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/JdbcUtil.java
deleted file mode 100644
index 2624923..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/JdbcUtil.java
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.schema;
-
-public class JdbcUtil {
-
-  public static String hostname(String hostname) {
-    if (hostname == null || hostname.isEmpty()) {
-      hostname = "localhost";
-
-    } else if (hostname.contains(":") && !hostname.startsWith("[")) {
-      hostname = "[" + hostname + "]";
-    }
-    return hostname;
-  }
-
-  public static String port(String port) {
-    if (port != null && !port.isEmpty()) {
-      return ":" + port;
-    }
-    return "";
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/NoChangesReviewDbWrapper.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/NoChangesReviewDbWrapper.java
deleted file mode 100644
index fd0c7fc..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/NoChangesReviewDbWrapper.java
+++ /dev/null
@@ -1,357 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.schema;
-
-import static com.google.common.base.Preconditions.checkState;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.util.concurrent.Futures;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.PatchLineComment;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.server.ChangeAccess;
-import com.google.gerrit.reviewdb.server.ChangeMessageAccess;
-import com.google.gerrit.reviewdb.server.PatchLineCommentAccess;
-import com.google.gerrit.reviewdb.server.PatchSetAccess;
-import com.google.gerrit.reviewdb.server.PatchSetApprovalAccess;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.reviewdb.server.ReviewDbWrapper;
-import com.google.gwtorm.client.Key;
-import com.google.gwtorm.server.Access;
-import com.google.gwtorm.server.AtomicUpdate;
-import com.google.gwtorm.server.ListResultSet;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.ResultSet;
-import java.util.Map;
-import java.util.function.Function;
-
-/**
- * Wrapper for ReviewDb that never calls the underlying change tables.
- *
- * <p>See {@link NotesMigrationSchemaFactory} for discussion.
- */
-class NoChangesReviewDbWrapper extends ReviewDbWrapper {
-  private static <T> ResultSet<T> empty() {
-    return new ListResultSet<>(ImmutableList.of());
-  }
-
-  @SuppressWarnings("deprecation")
-  private static <T, K extends Key<?>>
-      com.google.common.util.concurrent.CheckedFuture<T, OrmException> emptyFuture() {
-    return Futures.immediateCheckedFuture(null);
-  }
-
-  private final ChangeAccess changes;
-  private final PatchSetApprovalAccess patchSetApprovals;
-  private final ChangeMessageAccess changeMessages;
-  private final PatchSetAccess patchSets;
-  private final PatchLineCommentAccess patchComments;
-
-  private boolean inTransaction;
-
-  NoChangesReviewDbWrapper(ReviewDb db) {
-    super(db);
-    changes = new Changes(this, delegate);
-    patchSetApprovals = new PatchSetApprovals(this, delegate);
-    changeMessages = new ChangeMessages(this, delegate);
-    patchSets = new PatchSets(this, delegate);
-    patchComments = new PatchLineComments(this, delegate);
-  }
-
-  @Override
-  public boolean changesTablesEnabled() {
-    return false;
-  }
-
-  @Override
-  public ChangeAccess changes() {
-    return changes;
-  }
-
-  @Override
-  public PatchSetApprovalAccess patchSetApprovals() {
-    return patchSetApprovals;
-  }
-
-  @Override
-  public ChangeMessageAccess changeMessages() {
-    return changeMessages;
-  }
-
-  @Override
-  public PatchSetAccess patchSets() {
-    return patchSets;
-  }
-
-  @Override
-  public PatchLineCommentAccess patchComments() {
-    return patchComments;
-  }
-
-  @Override
-  public void commit() throws OrmException {
-    if (!inTransaction) {
-      // This reads a little weird, we're not in a transaction, so why are we calling commit?
-      // Because we want to let the underlying ReviewDb do its normal thing in this case (which may
-      // be throwing an exception, or not, depending on implementation).
-      delegate.commit();
-    }
-  }
-
-  @Override
-  public void rollback() throws OrmException {
-    if (inTransaction) {
-      inTransaction = false;
-    } else {
-      // See comment in commit(): we want to let the underlying ReviewDb do its thing.
-      delegate.rollback();
-    }
-  }
-
-  private abstract static class AbstractDisabledAccess<T, K extends Key<?>>
-      implements Access<T, K> {
-    // Don't even hold a reference to delegate, so it's not possible to use it accidentally.
-    private final NoChangesReviewDbWrapper wrapper;
-    private final String relationName;
-    private final int relationId;
-    private final Function<T, K> primaryKey;
-    private final Function<Iterable<T>, Map<K, T>> toMap;
-
-    private AbstractDisabledAccess(NoChangesReviewDbWrapper wrapper, Access<T, K> delegate) {
-      this.wrapper = wrapper;
-      this.relationName = delegate.getRelationName();
-      this.relationId = delegate.getRelationID();
-      this.primaryKey = delegate::primaryKey;
-      this.toMap = delegate::toMap;
-    }
-
-    @Override
-    public final int getRelationID() {
-      return relationId;
-    }
-
-    @Override
-    public final String getRelationName() {
-      return relationName;
-    }
-
-    @Override
-    public final K primaryKey(T entity) {
-      return primaryKey.apply(entity);
-    }
-
-    @Override
-    public final Map<K, T> toMap(Iterable<T> iterable) {
-      return toMap.apply(iterable);
-    }
-
-    @Override
-    public final ResultSet<T> iterateAllEntities() {
-      return empty();
-    }
-
-    @SuppressWarnings("deprecation")
-    @Override
-    public final com.google.common.util.concurrent.CheckedFuture<T, OrmException> getAsync(K key) {
-      return emptyFuture();
-    }
-
-    @Override
-    public final ResultSet<T> get(Iterable<K> keys) {
-      return empty();
-    }
-
-    @Override
-    public final void insert(Iterable<T> instances) {
-      // Do nothing.
-    }
-
-    @Override
-    public final void update(Iterable<T> instances) {
-      // Do nothing.
-    }
-
-    @Override
-    public final void upsert(Iterable<T> instances) {
-      // Do nothing.
-    }
-
-    @Override
-    public final void deleteKeys(Iterable<K> keys) {
-      // Do nothing.
-    }
-
-    @Override
-    public final void delete(Iterable<T> instances) {
-      // Do nothing.
-    }
-
-    @Override
-    public final void beginTransaction(K key) {
-      // Keep track of when we've started a transaction so that we can avoid calling commit/rollback
-      // on the underlying ReviewDb. This is just a simple arm's-length approach, and may produce
-      // slightly different results from a native ReviewDb in corner cases like:
-      //  * beginning transactions on different tables simultaneously
-      //  * doing work between commit and rollback
-      // These kinds of things are already misuses of ReviewDb, and shouldn't be happening in
-      // current code anyway.
-      checkState(!wrapper.inTransaction, "already in transaction");
-      wrapper.inTransaction = true;
-    }
-
-    @Override
-    public final T atomicUpdate(K key, AtomicUpdate<T> update) {
-      return null;
-    }
-
-    @Override
-    public final T get(K id) {
-      return null;
-    }
-  }
-
-  private static class Changes extends AbstractDisabledAccess<Change, Change.Id>
-      implements ChangeAccess {
-    private Changes(NoChangesReviewDbWrapper wrapper, ReviewDb db) {
-      super(wrapper, db.changes());
-    }
-
-    @Override
-    public ResultSet<Change> all() {
-      return empty();
-    }
-  }
-
-  private static class ChangeMessages
-      extends AbstractDisabledAccess<ChangeMessage, ChangeMessage.Key>
-      implements ChangeMessageAccess {
-    private ChangeMessages(NoChangesReviewDbWrapper wrapper, ReviewDb db) {
-      super(wrapper, db.changeMessages());
-    }
-
-    @Override
-    public ResultSet<ChangeMessage> byChange(Change.Id id) throws OrmException {
-      return empty();
-    }
-
-    @Override
-    public ResultSet<ChangeMessage> byPatchSet(PatchSet.Id id) throws OrmException {
-      return empty();
-    }
-
-    @Override
-    public ResultSet<ChangeMessage> all() throws OrmException {
-      return empty();
-    }
-  }
-
-  private static class PatchSets extends AbstractDisabledAccess<PatchSet, PatchSet.Id>
-      implements PatchSetAccess {
-    private PatchSets(NoChangesReviewDbWrapper wrapper, ReviewDb db) {
-      super(wrapper, db.patchSets());
-    }
-
-    @Override
-    public ResultSet<PatchSet> byChange(Change.Id id) {
-      return empty();
-    }
-
-    @Override
-    public ResultSet<PatchSet> all() {
-      return empty();
-    }
-  }
-
-  private static class PatchSetApprovals
-      extends AbstractDisabledAccess<PatchSetApproval, PatchSetApproval.Key>
-      implements PatchSetApprovalAccess {
-    private PatchSetApprovals(NoChangesReviewDbWrapper wrapper, ReviewDb db) {
-      super(wrapper, db.patchSetApprovals());
-    }
-
-    @Override
-    public ResultSet<PatchSetApproval> byChange(Change.Id id) {
-      return empty();
-    }
-
-    @Override
-    public ResultSet<PatchSetApproval> byPatchSet(PatchSet.Id id) {
-      return empty();
-    }
-
-    @Override
-    public ResultSet<PatchSetApproval> byPatchSetUser(PatchSet.Id patchSet, Account.Id account) {
-      return empty();
-    }
-
-    @Override
-    public ResultSet<PatchSetApproval> all() {
-      return empty();
-    }
-  }
-
-  private static class PatchLineComments
-      extends AbstractDisabledAccess<PatchLineComment, PatchLineComment.Key>
-      implements PatchLineCommentAccess {
-    private PatchLineComments(NoChangesReviewDbWrapper wrapper, ReviewDb db) {
-      super(wrapper, db.patchComments());
-    }
-
-    @Override
-    public ResultSet<PatchLineComment> byChange(Change.Id id) {
-      return empty();
-    }
-
-    @Override
-    public ResultSet<PatchLineComment> byPatchSet(PatchSet.Id id) {
-      return empty();
-    }
-
-    @Override
-    public ResultSet<PatchLineComment> publishedByChangeFile(Change.Id id, String file) {
-      return empty();
-    }
-
-    @Override
-    public ResultSet<PatchLineComment> publishedByPatchSet(PatchSet.Id patchset) {
-      return empty();
-    }
-
-    @Override
-    public ResultSet<PatchLineComment> draftByPatchSetAuthor(
-        PatchSet.Id patchset, Account.Id author) {
-      return empty();
-    }
-
-    @Override
-    public ResultSet<PatchLineComment> draftByChangeFileAuthor(
-        Change.Id id, String file, Account.Id author) {
-      return empty();
-    }
-
-    @Override
-    public ResultSet<PatchLineComment> draftByAuthor(Account.Id author) {
-      return empty();
-    }
-
-    @Override
-    public ResultSet<PatchLineComment> all() {
-      return empty();
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/NotesMigrationSchemaFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/NotesMigrationSchemaFactory.java
deleted file mode 100644
index d73a5f4..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/NotesMigrationSchemaFactory.java
+++ /dev/null
@@ -1,73 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.schema;
-
-import com.google.gerrit.reviewdb.server.DisallowReadFromChangesReviewDbWrapper;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.notedb.NotesMigration;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-@Singleton
-public class NotesMigrationSchemaFactory implements SchemaFactory<ReviewDb> {
-  private final SchemaFactory<ReviewDb> delegate;
-  private final NotesMigration migration;
-
-  @Inject
-  NotesMigrationSchemaFactory(
-      @ReviewDbFactory SchemaFactory<ReviewDb> delegate, NotesMigration migration) {
-    this.delegate = delegate;
-    this.migration = migration;
-  }
-
-  @Override
-  public ReviewDb open() throws OrmException {
-    ReviewDb db = delegate.open();
-    if (!migration.readChanges()) {
-      return db;
-    }
-
-    // There are two levels at which this class disables access to Changes and related tables,
-    // corresponding to two phases of the NoteDb migration:
-    //
-    // 1. When changes are read from NoteDb but some changes might still have their primary storage
-    //    in ReviewDb, it is generally programmer error to read changes from ReviewDb. However,
-    //    since ReviewDb is still the primary storage for most or all changes, we still need to
-    //    support writing to ReviewDb. This behavior is accomplished by wrapping in a
-    //    DisallowReadFromChangesReviewDbWrapper.
-    //
-    //    Some codepaths might need to be able to read from ReviewDb if they really need to, because
-    //    they need to operate on the underlying source of truth, for example when reading a change
-    //    to determine its primary storage. To support this, ReviewDbUtil#unwrapDb can detect and
-    //    unwrap databases of this type.
-    //
-    // 2. After all changes have their primary storage in NoteDb, we can completely shut off access
-    //    to the change tables. At this point in the migration, we are by definition not using the
-    //    ReviewDb tables at all; we could even delete the tables at this point, and Gerrit would
-    //    continue to function.
-    //
-    //    This is accomplished by setting the delegate ReviewDb *underneath* DisallowReadFromChanges
-    //    to be a complete no-op, with NoChangesReviewDbWrapper. With this wrapper, all read
-    //    operations return no results, and write operations silently do nothing. This wrapper is
-    //    not a public class and nobody should ever attempt to unwrap it.
-
-    if (migration.disableChangeReviewDb()) {
-      db = new NoChangesReviewDbWrapper(db);
-    }
-    return new DisallowReadFromChangesReviewDbWrapper(db);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/ProjectConfigSchemaUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/ProjectConfigSchemaUpdate.java
deleted file mode 100644
index 67d11a8..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/ProjectConfigSchemaUpdate.java
+++ /dev/null
@@ -1,107 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.schema;
-
-import static com.google.gerrit.server.git.ProjectConfig.ACCESS;
-import static java.util.stream.Collectors.toList;
-
-import com.google.gerrit.common.data.PermissionRule;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.git.VersionedMetaData;
-import com.google.gwtorm.server.OrmException;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.PersonIdent;
-
-public class ProjectConfigSchemaUpdate extends VersionedMetaData {
-
-  private final MetaDataUpdate update;
-  private Config config;
-  private boolean updated;
-
-  public static ProjectConfigSchemaUpdate read(MetaDataUpdate update)
-      throws IOException, ConfigInvalidException {
-    ProjectConfigSchemaUpdate r = new ProjectConfigSchemaUpdate(update);
-    r.load(update);
-    return r;
-  }
-
-  private ProjectConfigSchemaUpdate(MetaDataUpdate update) {
-    this.update = update;
-  }
-
-  @Override
-  protected String getRefName() {
-    return RefNames.REFS_CONFIG;
-  }
-
-  @Override
-  protected void onLoad() throws IOException, ConfigInvalidException {
-    config = readConfig(ProjectConfig.PROJECT_CONFIG);
-  }
-
-  public void removeForceFromPermission(String name) {
-    for (String subsection : config.getSubsections(ACCESS)) {
-      Set<String> names = config.getNames(ACCESS, subsection);
-      if (names.contains(name)) {
-        List<String> values =
-            Arrays.stream(config.getStringList(ACCESS, subsection, name))
-                .map(
-                    r -> {
-                      PermissionRule rule = PermissionRule.fromString(r, false);
-                      if (rule.getForce()) {
-                        rule.setForce(false);
-                        updated = true;
-                      }
-                      return rule.asString(false);
-                    })
-                .collect(toList());
-        config.setStringList(ACCESS, subsection, name, values);
-      }
-    }
-  }
-
-  @Override
-  protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException {
-    saveConfig(ProjectConfig.PROJECT_CONFIG, config);
-    return true;
-  }
-
-  public void save(PersonIdent personIdent, String commitMessage) throws OrmException {
-    if (!updated) {
-      return;
-    }
-
-    update.getCommitBuilder().setAuthor(personIdent);
-    update.getCommitBuilder().setCommitter(personIdent);
-    update.setMessage(commitMessage);
-    try {
-      commit(update);
-    } catch (IOException e) {
-      throw new OrmException(e);
-    }
-  }
-
-  public boolean isUpdated() {
-    return updated;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaCreator.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaCreator.java
deleted file mode 100644
index 8c1ccd2..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaCreator.java
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.schema;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.CurrentSchemaVersion;
-import com.google.gerrit.reviewdb.client.SystemConfig;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.account.GroupUUID;
-import com.google.gerrit.server.config.SitePath;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.group.GroupsUpdate;
-import com.google.gerrit.server.group.InternalGroup;
-import com.google.gerrit.server.index.group.GroupIndex;
-import com.google.gerrit.server.index.group.GroupIndexCollection;
-import com.google.gwtorm.jdbc.JdbcExecutor;
-import com.google.gwtorm.jdbc.JdbcSchema;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.util.Collections;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.PersonIdent;
-
-/** Creates the current database schema and populates initial code rows. */
-public class SchemaCreator {
-  @SitePath private final Path site_path;
-
-  private final AllProjectsCreator allProjectsCreator;
-  private final AllUsersCreator allUsersCreator;
-  private final PersonIdent serverUser;
-  private final DataSourceType dataSourceType;
-  private final GroupIndexCollection indexCollection;
-
-  private AccountGroup admin;
-  private AccountGroup batch;
-
-  @Inject
-  public SchemaCreator(
-      SitePaths site,
-      AllProjectsCreator ap,
-      AllUsersCreator auc,
-      @GerritPersonIdent PersonIdent au,
-      DataSourceType dst,
-      GroupIndexCollection ic) {
-    this(site.site_path, ap, auc, au, dst, ic);
-  }
-
-  public SchemaCreator(
-      @SitePath Path site,
-      AllProjectsCreator ap,
-      AllUsersCreator auc,
-      @GerritPersonIdent PersonIdent au,
-      DataSourceType dst,
-      GroupIndexCollection ic) {
-    site_path = site;
-    allProjectsCreator = ap;
-    allUsersCreator = auc;
-    serverUser = au;
-    dataSourceType = dst;
-    indexCollection = ic;
-  }
-
-  public void create(ReviewDb db) throws OrmException, IOException, ConfigInvalidException {
-    final JdbcSchema jdbc = (JdbcSchema) db;
-    try (JdbcExecutor e = new JdbcExecutor(jdbc)) {
-      jdbc.updateSchema(e);
-    }
-
-    final CurrentSchemaVersion sVer = CurrentSchemaVersion.create();
-    sVer.versionNbr = SchemaVersion.getBinaryVersion();
-    db.schemaVersion().insert(Collections.singleton(sVer));
-
-    createDefaultGroups(db);
-    initSystemConfig(db);
-    allProjectsCreator
-        .setAdministrators(GroupReference.forGroup(admin))
-        .setBatchUsers(GroupReference.forGroup(batch))
-        .create();
-    allUsersCreator.setAdministrators(GroupReference.forGroup(admin)).create();
-    dataSourceType.getIndexScript().run(db);
-  }
-
-  private void createDefaultGroups(ReviewDb db) throws OrmException, IOException {
-    admin = newGroup(db, "Administrators");
-    admin.setDescription("Gerrit Site Administrators");
-    GroupsUpdate.addNewGroup(db, admin);
-    index(InternalGroup.create(admin, ImmutableSet.of(), ImmutableSet.of()));
-
-    batch = newGroup(db, "Non-Interactive Users");
-    batch.setDescription("Users who perform batch actions on Gerrit");
-    batch.setOwnerGroupUUID(admin.getGroupUUID());
-    GroupsUpdate.addNewGroup(db, batch);
-    index(InternalGroup.create(batch, ImmutableSet.of(), ImmutableSet.of()));
-  }
-
-  private void index(InternalGroup group) throws IOException {
-    for (GroupIndex groupIndex : indexCollection.getWriteIndexes()) {
-      groupIndex.replace(group);
-    }
-  }
-
-  private AccountGroup newGroup(ReviewDb c, String name) throws OrmException {
-    AccountGroup.UUID uuid = GroupUUID.make(name, serverUser);
-    return new AccountGroup( //
-        new AccountGroup.NameKey(name), //
-        new AccountGroup.Id(c.nextAccountGroupId()), //
-        uuid,
-        TimeUtil.nowTs());
-  }
-
-  private SystemConfig initSystemConfig(ReviewDb db) throws OrmException {
-    SystemConfig s = SystemConfig.create();
-    try {
-      s.sitePath = site_path.toRealPath().normalize().toString();
-    } catch (IOException e) {
-      s.sitePath = site_path.toAbsolutePath().normalize().toString();
-    }
-    db.systemConfig().insert(Collections.singleton(s));
-    return s;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaUpdater.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaUpdater.java
deleted file mode 100644
index 266fbaa..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaUpdater.java
+++ /dev/null
@@ -1,153 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.schema;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.gerrit.reviewdb.client.CurrentSchemaVersion;
-import com.google.gerrit.reviewdb.client.SystemConfig;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.reviewdb.server.ReviewDbUtil;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.config.AnonymousCowardName;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.group.SystemGroupBackend;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.AbstractModule;
-import com.google.inject.Guice;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.Key;
-import com.google.inject.Provider;
-import com.google.inject.Stage;
-import java.io.IOException;
-import java.sql.SQLException;
-import java.util.Collections;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.PersonIdent;
-
-/** Creates or updates the current database schema. */
-public class SchemaUpdater {
-  private final SchemaFactory<ReviewDb> schema;
-  private final SitePaths site;
-  private final SchemaCreator creator;
-  private final Provider<SchemaVersion> updater;
-
-  @Inject
-  SchemaUpdater(
-      @ReviewDbFactory SchemaFactory<ReviewDb> schema,
-      SitePaths site,
-      SchemaCreator creator,
-      Injector parent) {
-    this.schema = schema;
-    this.site = site;
-    this.creator = creator;
-    this.updater = buildInjector(parent).getProvider(SchemaVersion.class);
-  }
-
-  private static Injector buildInjector(Injector parent) {
-    // Use DEVELOPMENT mode to allow lazy initialization of the
-    // graph. This avoids touching ancient schema versions that
-    // are behind this installation's current version.
-    return Guice.createInjector(
-        Stage.DEVELOPMENT,
-        new AbstractModule() {
-          @Override
-          protected void configure() {
-            bind(SchemaVersion.class).to(SchemaVersion.C);
-
-            for (Key<?> k :
-                new Key<?>[] {
-                  Key.get(PersonIdent.class, GerritPersonIdent.class),
-                  Key.get(String.class, AnonymousCowardName.class),
-                  Key.get(Config.class, GerritServerConfig.class),
-                }) {
-              rebind(parent, k);
-            }
-
-            for (Class<?> c :
-                new Class<?>[] {
-                  AllProjectsName.class,
-                  AllUsersCreator.class,
-                  AllUsersName.class,
-                  GitRepositoryManager.class,
-                  SitePaths.class,
-                  SystemGroupBackend.class,
-                }) {
-              rebind(parent, Key.get(c));
-            }
-          }
-
-          private <T> void rebind(Injector parent, Key<T> c) {
-            bind(c).toProvider(parent.getProvider(c));
-          }
-        });
-  }
-
-  public void update(UpdateUI ui) throws OrmException {
-    try (ReviewDb db = ReviewDbUtil.unwrapDb(schema.open())) {
-
-      final SchemaVersion u = updater.get();
-      final CurrentSchemaVersion version = getSchemaVersion(db);
-      if (version == null) {
-        try {
-          creator.create(db);
-        } catch (IOException | ConfigInvalidException e) {
-          throw new OrmException("Cannot initialize schema", e);
-        }
-
-      } else {
-        try {
-          u.check(ui, version, db);
-        } catch (SQLException e) {
-          throw new OrmException("Cannot upgrade schema", e);
-        }
-
-        updateSystemConfig(db);
-      }
-    }
-  }
-
-  @VisibleForTesting
-  public SchemaVersion getLatestSchemaVersion() {
-    return updater.get();
-  }
-
-  private CurrentSchemaVersion getSchemaVersion(ReviewDb db) {
-    try {
-      return db.schemaVersion().get(new CurrentSchemaVersion.Key());
-    } catch (OrmException e) {
-      return null;
-    }
-  }
-
-  private void updateSystemConfig(ReviewDb db) throws OrmException {
-    final SystemConfig sc = db.systemConfig().get(new SystemConfig.Key());
-    if (sc == null) {
-      throw new OrmException("No record in system_config table");
-    }
-    try {
-      sc.sitePath = site.site_path.toRealPath().normalize().toString();
-    } catch (IOException e) {
-      sc.sitePath = site.site_path.toAbsolutePath().normalize().toString();
-    }
-    db.systemConfig().update(Collections.singleton(sc));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersion.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersion.java
deleted file mode 100644
index d1cbad6..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersion.java
+++ /dev/null
@@ -1,214 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.schema;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Stopwatch;
-import com.google.common.collect.Lists;
-import com.google.gerrit.reviewdb.client.CurrentSchemaVersion;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gwtorm.jdbc.JdbcExecutor;
-import com.google.gwtorm.jdbc.JdbcSchema;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.StatementExecutor;
-import com.google.inject.Provider;
-import java.sql.PreparedStatement;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-/** A version of the database schema. */
-public abstract class SchemaVersion {
-  /** The current schema version. */
-  public static final Class<Schema_161> C = Schema_161.class;
-
-  public static int getBinaryVersion() {
-    return guessVersion(C);
-  }
-
-  private final Provider<? extends SchemaVersion> prior;
-  private final int versionNbr;
-
-  protected SchemaVersion(Provider<? extends SchemaVersion> prior) {
-    this.prior = prior;
-    this.versionNbr = guessVersion(getClass());
-  }
-
-  public static int guessVersion(Class<?> c) {
-    String n = c.getName();
-    n = n.substring(n.lastIndexOf('_') + 1);
-    while (n.startsWith("0")) {
-      n = n.substring(1);
-    }
-    return Integer.parseInt(n);
-  }
-
-  /** @return the {@link CurrentSchemaVersion#versionNbr} this step targets. */
-  public final int getVersionNbr() {
-    return versionNbr;
-  }
-
-  @VisibleForTesting
-  public final SchemaVersion getPrior() {
-    return prior.get();
-  }
-
-  public final void check(UpdateUI ui, CurrentSchemaVersion curr, ReviewDb db)
-      throws OrmException, SQLException {
-    if (curr.versionNbr == versionNbr) {
-      // Nothing to do, we are at the correct schema.
-    } else if (curr.versionNbr > versionNbr) {
-      throw new OrmException(
-          "Cannot downgrade database schema from version "
-              + curr.versionNbr
-              + " to "
-              + versionNbr
-              + ".");
-    } else {
-      upgradeFrom(ui, curr, db);
-    }
-  }
-
-  /** Runs check on the prior schema version, and then upgrades. */
-  private void upgradeFrom(UpdateUI ui, CurrentSchemaVersion curr, ReviewDb db)
-      throws OrmException, SQLException {
-    List<SchemaVersion> pending = pending(curr.versionNbr);
-    updateSchema(pending, ui, db);
-    migrateData(pending, ui, curr, db);
-
-    JdbcSchema s = (JdbcSchema) db;
-    final List<String> pruneList = new ArrayList<>();
-    s.pruneSchema(
-        new StatementExecutor() {
-          @Override
-          public void execute(String sql) {
-            pruneList.add(sql);
-          }
-
-          @Override
-          public void close() {
-            // Do nothing.
-          }
-        });
-
-    try (JdbcExecutor e = new JdbcExecutor(s)) {
-      if (!pruneList.isEmpty()) {
-        ui.pruneSchema(e, pruneList);
-      }
-    }
-  }
-
-  private List<SchemaVersion> pending(int curr) {
-    List<SchemaVersion> r = Lists.newArrayListWithCapacity(versionNbr - curr);
-    for (SchemaVersion v = this; curr < v.getVersionNbr(); v = v.prior.get()) {
-      r.add(v);
-    }
-    Collections.reverse(r);
-    return r;
-  }
-
-  private void updateSchema(List<SchemaVersion> pending, UpdateUI ui, ReviewDb db)
-      throws OrmException, SQLException {
-    for (SchemaVersion v : pending) {
-      ui.message(String.format("Upgrading schema to %d ...", v.getVersionNbr()));
-      v.preUpdateSchema(db);
-    }
-
-    JdbcSchema s = (JdbcSchema) db;
-    try (JdbcExecutor e = new JdbcExecutor(s)) {
-      s.updateSchema(e);
-    }
-  }
-
-  /**
-   * Invoked before updateSchema adds new columns/tables.
-   *
-   * @param db open database handle.
-   * @throws OrmException if a Gerrit-specific exception occurred.
-   * @throws SQLException if an underlying SQL exception occurred.
-   */
-  protected void preUpdateSchema(ReviewDb db) throws OrmException, SQLException {}
-
-  private void migrateData(
-      List<SchemaVersion> pending, UpdateUI ui, CurrentSchemaVersion curr, ReviewDb db)
-      throws OrmException, SQLException {
-    for (SchemaVersion v : pending) {
-      Stopwatch sw = Stopwatch.createStarted();
-      ui.message(String.format("Migrating data to schema %d ...", v.getVersionNbr()));
-      v.migrateData(db, ui);
-      v.finish(curr, db);
-      ui.message(String.format("\t> Done (%.3f s)", sw.elapsed(TimeUnit.MILLISECONDS) / 1000d));
-    }
-  }
-
-  /**
-   * Invoked between updateSchema (adds new columns/tables) and pruneSchema (removes deleted
-   * columns/tables).
-   *
-   * @param db open database handle.
-   * @param ui interface for interacting with the user.
-   * @throws OrmException if a Gerrit-specific exception occurred.
-   * @throws SQLException if an underlying SQL exception occurred.
-   */
-  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {}
-
-  /** Mark the current schema version. */
-  protected void finish(CurrentSchemaVersion curr, ReviewDb db) throws OrmException {
-    curr.versionNbr = versionNbr;
-    db.schemaVersion().update(Collections.singleton(curr));
-  }
-
-  /** Rename an existing table. */
-  protected static void renameTable(ReviewDb db, String from, String to) throws OrmException {
-    JdbcSchema s = (JdbcSchema) db;
-    try (JdbcExecutor e = new JdbcExecutor(s)) {
-      s.renameTable(e, from, to);
-    }
-  }
-
-  /** Rename an existing column. */
-  protected static void renameColumn(ReviewDb db, String table, String from, String to)
-      throws OrmException {
-    JdbcSchema s = (JdbcSchema) db;
-    try (JdbcExecutor e = new JdbcExecutor(s)) {
-      s.renameColumn(e, table, from, to);
-    }
-  }
-
-  /** Execute an SQL statement. */
-  protected static void execute(ReviewDb db, String sql) throws SQLException {
-    try (Statement s = newStatement(db)) {
-      s.execute(sql);
-    }
-  }
-
-  /** Open a new single statement. */
-  protected static Statement newStatement(ReviewDb db) throws SQLException {
-    return ((JdbcSchema) db).getConnection().createStatement();
-  }
-
-  /** Open a new prepared statement. */
-  protected static PreparedStatement prepareStatement(ReviewDb db, String sql) throws SQLException {
-    return ((JdbcSchema) db).getConnection().prepareStatement(sql);
-  }
-
-  /** Open a new statement executor. */
-  protected static JdbcExecutor newExecutor(ReviewDb db) throws OrmException {
-    return new JdbcExecutor(((JdbcSchema) db).getConnection());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_108.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_108.java
deleted file mode 100644
index dc88f8d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_108.java
+++ /dev/null
@@ -1,191 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.schema;
-
-import com.google.common.base.Joiner;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.MultimapBuilder;
-import com.google.common.collect.SetMultimap;
-import com.google.common.collect.Sets;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Change.Status;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.Project.NameKey;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.GroupCollector;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Map;
-import java.util.Set;
-import java.util.SortedSet;
-import org.eclipse.jgit.errors.MissingObjectException;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.RefDatabase;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevObject;
-import org.eclipse.jgit.revwalk.RevSort;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-public class Schema_108 extends SchemaVersion {
-  private final GitRepositoryManager repoManager;
-
-  @Inject
-  Schema_108(Provider<Schema_107> prior, GitRepositoryManager repoManager) {
-    super(prior);
-    this.repoManager = repoManager;
-  }
-
-  @Override
-  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException {
-    ui.message("Listing all changes ...");
-    SetMultimap<Project.NameKey, Change.Id> openByProject = getOpenChangesByProject(db, ui);
-    ui.message("done");
-
-    ui.message("Updating groups for open changes ...");
-    int i = 0;
-    for (Map.Entry<Project.NameKey, Collection<Change.Id>> e : openByProject.asMap().entrySet()) {
-      try (Repository repo = repoManager.openRepository(e.getKey());
-          RevWalk rw = new RevWalk(repo)) {
-        updateProjectGroups(db, repo, rw, (Set<Change.Id>) e.getValue(), ui);
-      } catch (IOException | NoSuchChangeException err) {
-        throw new OrmException(err);
-      }
-      if (++i % 100 == 0) {
-        ui.message("  done " + i + " projects ...");
-      }
-    }
-    ui.message("done");
-  }
-
-  private void updateProjectGroups(
-      ReviewDb db, Repository repo, RevWalk rw, Set<Change.Id> changes, UpdateUI ui)
-      throws OrmException, IOException {
-    // Match sorting in ReceiveCommits.
-    rw.reset();
-    rw.sort(RevSort.TOPO);
-    rw.sort(RevSort.REVERSE, true);
-
-    RefDatabase refdb = repo.getRefDatabase();
-    for (Ref ref : refdb.getRefs(Constants.R_HEADS).values()) {
-      RevCommit c = maybeParseCommit(rw, ref.getObjectId(), ui);
-      if (c != null) {
-        rw.markUninteresting(c);
-      }
-    }
-
-    ListMultimap<ObjectId, Ref> changeRefsBySha =
-        MultimapBuilder.hashKeys().arrayListValues().build();
-    ListMultimap<ObjectId, PatchSet.Id> patchSetsBySha =
-        MultimapBuilder.hashKeys().arrayListValues().build();
-    for (Ref ref : refdb.getRefs(RefNames.REFS_CHANGES).values()) {
-      ObjectId id = ref.getObjectId();
-      if (ref.getObjectId() == null) {
-        continue;
-      }
-      id = id.copy();
-      changeRefsBySha.put(id, ref);
-      PatchSet.Id psId = PatchSet.Id.fromRef(ref.getName());
-      if (psId != null && changes.contains(psId.getParentKey())) {
-        patchSetsBySha.put(id, psId);
-        RevCommit c = maybeParseCommit(rw, id, ui);
-        if (c != null) {
-          rw.markStart(c);
-        }
-      }
-    }
-
-    GroupCollector collector = GroupCollector.createForSchemaUpgradeOnly(changeRefsBySha, db);
-    RevCommit c;
-    while ((c = rw.next()) != null) {
-      collector.visit(c);
-    }
-
-    updateGroups(db, collector, patchSetsBySha);
-  }
-
-  private static void updateGroups(
-      ReviewDb db, GroupCollector collector, ListMultimap<ObjectId, PatchSet.Id> patchSetsBySha)
-      throws OrmException {
-    Map<PatchSet.Id, PatchSet> patchSets =
-        db.patchSets().toMap(db.patchSets().get(patchSetsBySha.values()));
-    for (Map.Entry<ObjectId, Collection<String>> e : collector.getGroups().asMap().entrySet()) {
-      for (PatchSet.Id psId : patchSetsBySha.get(e.getKey())) {
-        PatchSet ps = patchSets.get(psId);
-        if (ps != null) {
-          ps.setGroups(ImmutableList.copyOf(e.getValue()));
-        }
-      }
-    }
-
-    db.patchSets().update(patchSets.values());
-  }
-
-  private SetMultimap<Project.NameKey, Change.Id> getOpenChangesByProject(ReviewDb db, UpdateUI ui)
-      throws OrmException {
-    SortedSet<NameKey> projects = repoManager.list();
-    SortedSet<NameKey> nonExistentProjects = Sets.newTreeSet();
-    SetMultimap<Project.NameKey, Change.Id> openByProject =
-        MultimapBuilder.hashKeys().hashSetValues().build();
-    for (Change c : db.changes().all()) {
-      Status status = c.getStatus();
-      if (status != null && status.isClosed()) {
-        continue;
-      }
-
-      NameKey projectKey = c.getProject();
-      if (!projects.contains(projectKey)) {
-        nonExistentProjects.add(projectKey);
-      } else {
-        // The old "submitted" state is not supported anymore
-        // (thus status is null) but it was an opened state and needs
-        // to be migrated as such
-        openByProject.put(projectKey, c.getId());
-      }
-    }
-
-    if (!nonExistentProjects.isEmpty()) {
-      ui.message("Detected open changes referring to the following non-existent projects:");
-      ui.message(Joiner.on(", ").join(nonExistentProjects));
-      ui.message(
-          "It is highly recommended to remove\n"
-              + "the obsolete open changes, comments and patch-sets from your DB.\n");
-    }
-    return openByProject;
-  }
-
-  private static RevCommit maybeParseCommit(RevWalk rw, ObjectId id, UpdateUI ui)
-      throws IOException {
-    if (id != null) {
-      try {
-        RevObject obj = rw.parseAny(id);
-        return (obj instanceof RevCommit) ? (RevCommit) obj : null;
-      } catch (MissingObjectException moe) {
-        ui.message("Missing object: " + id.getName() + "\n");
-      }
-    }
-    return null;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_115.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_115.java
deleted file mode 100644
index 3c6a50e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_115.java
+++ /dev/null
@@ -1,209 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.schema;
-
-import static com.google.gerrit.server.config.ConfigUtil.storeSection;
-
-import com.google.common.base.Preconditions;
-import com.google.common.base.Strings;
-import com.google.gerrit.extensions.client.DiffPreferencesInfo;
-import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
-import com.google.gerrit.extensions.client.Theme;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.account.VersionedAccountPreferences;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.UserConfigSections;
-import com.google.gerrit.server.patch.PatchListKey;
-import com.google.gwtorm.jdbc.JdbcSchema;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.sql.ResultSet;
-import java.sql.ResultSetMetaData;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.BatchRefUpdate;
-import org.eclipse.jgit.lib.NullProgressMonitor;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-public class Schema_115 extends SchemaVersion {
-  private final GitRepositoryManager mgr;
-  private final AllUsersName allUsersName;
-  private final PersonIdent serverUser;
-
-  @Inject
-  Schema_115(
-      Provider<Schema_114> prior,
-      GitRepositoryManager mgr,
-      AllUsersName allUsersName,
-      @GerritPersonIdent PersonIdent serverUser) {
-    super(prior);
-    this.mgr = mgr;
-    this.allUsersName = allUsersName;
-    this.serverUser = serverUser;
-  }
-
-  @Override
-  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {
-    Map<Account.Id, DiffPreferencesInfo> imports = new HashMap<>();
-    try (Statement stmt = ((JdbcSchema) db).getConnection().createStatement();
-        ResultSet rs = stmt.executeQuery("SELECT * FROM account_diff_preferences")) {
-      Set<String> availableColumns = getColumns(rs);
-      while (rs.next()) {
-        Account.Id accountId = new Account.Id(rs.getInt("id"));
-        DiffPreferencesInfo prefs = new DiffPreferencesInfo();
-        if (availableColumns.contains("context")) {
-          prefs.context = (int) rs.getShort("context");
-        }
-        if (availableColumns.contains("expand_all_comments")) {
-          prefs.expandAllComments = toBoolean(rs.getString("expand_all_comments"));
-        }
-        if (availableColumns.contains("hide_line_numbers")) {
-          prefs.hideLineNumbers = toBoolean(rs.getString("hide_line_numbers"));
-        }
-        if (availableColumns.contains("hide_top_menu")) {
-          prefs.hideTopMenu = toBoolean(rs.getString("hide_top_menu"));
-        }
-        if (availableColumns.contains("ignore_whitespace")) {
-          // Enum with char as value
-          prefs.ignoreWhitespace = toWhitespace(rs.getString("ignore_whitespace"));
-        }
-        if (availableColumns.contains("intraline_difference")) {
-          prefs.intralineDifference = toBoolean(rs.getString("intraline_difference"));
-        }
-        if (availableColumns.contains("line_length")) {
-          prefs.lineLength = rs.getInt("line_length");
-        }
-        if (availableColumns.contains("manual_review")) {
-          prefs.manualReview = toBoolean(rs.getString("manual_review"));
-        }
-        if (availableColumns.contains("render_entire_file")) {
-          prefs.renderEntireFile = toBoolean(rs.getString("render_entire_file"));
-        }
-        if (availableColumns.contains("retain_header")) {
-          prefs.retainHeader = toBoolean(rs.getString("retain_header"));
-        }
-        if (availableColumns.contains("show_line_endings")) {
-          prefs.showLineEndings = toBoolean(rs.getString("show_line_endings"));
-        }
-        if (availableColumns.contains("show_tabs")) {
-          prefs.showTabs = toBoolean(rs.getString("show_tabs"));
-        }
-        if (availableColumns.contains("show_whitespace_errors")) {
-          prefs.showWhitespaceErrors = toBoolean(rs.getString("show_whitespace_errors"));
-        }
-        if (availableColumns.contains("skip_deleted")) {
-          prefs.skipDeleted = toBoolean(rs.getString("skip_deleted"));
-        }
-        if (availableColumns.contains("skip_uncommented")) {
-          prefs.skipUncommented = toBoolean(rs.getString("skip_uncommented"));
-        }
-        if (availableColumns.contains("syntax_highlighting")) {
-          prefs.syntaxHighlighting = toBoolean(rs.getString("syntax_highlighting"));
-        }
-        if (availableColumns.contains("tab_size")) {
-          prefs.tabSize = rs.getInt("tab_size");
-        }
-        if (availableColumns.contains("theme")) {
-          // Enum with name as values; can be null
-          prefs.theme = toTheme(rs.getString("theme"));
-        }
-        if (availableColumns.contains("hide_empty_pane")) {
-          prefs.hideEmptyPane = toBoolean(rs.getString("hide_empty_pane"));
-        }
-        if (availableColumns.contains("auto_hide_diff_table_header")) {
-          prefs.autoHideDiffTableHeader = toBoolean(rs.getString("auto_hide_diff_table_header"));
-        }
-        imports.put(accountId, prefs);
-      }
-    }
-
-    if (imports.isEmpty()) {
-      return;
-    }
-
-    try (Repository git = mgr.openRepository(allUsersName);
-        RevWalk rw = new RevWalk(git)) {
-      BatchRefUpdate bru = git.getRefDatabase().newBatchUpdate();
-      for (Map.Entry<Account.Id, DiffPreferencesInfo> e : imports.entrySet()) {
-        try (MetaDataUpdate md =
-            new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, git, bru)) {
-          md.getCommitBuilder().setAuthor(serverUser);
-          md.getCommitBuilder().setCommitter(serverUser);
-          VersionedAccountPreferences p = VersionedAccountPreferences.forUser(e.getKey());
-          p.load(md);
-          storeSection(
-              p.getConfig(),
-              UserConfigSections.DIFF,
-              null,
-              e.getValue(),
-              DiffPreferencesInfo.defaults());
-          p.commit(md);
-        }
-      }
-
-      bru.execute(rw, NullProgressMonitor.INSTANCE);
-    } catch (ConfigInvalidException | IOException ex) {
-      throw new OrmException(ex);
-    }
-  }
-
-  private Set<String> getColumns(ResultSet rs) throws SQLException {
-    ResultSetMetaData metaData = rs.getMetaData();
-    int columnCount = metaData.getColumnCount();
-    Set<String> columns = new HashSet<>(columnCount);
-    for (int i = 1; i <= columnCount; i++) {
-      columns.add(metaData.getColumnLabel(i).toLowerCase());
-    }
-    return columns;
-  }
-
-  private static Theme toTheme(String v) {
-    if (v == null) {
-      return Theme.DEFAULT;
-    }
-    return Theme.valueOf(v);
-  }
-
-  private static Whitespace toWhitespace(String v) {
-    Preconditions.checkNotNull(v);
-    if (v.isEmpty()) {
-      return Whitespace.IGNORE_NONE;
-    }
-    Whitespace r = PatchListKey.WHITESPACE_TYPES.inverse().get(v.charAt(0));
-    if (r == null) {
-      throw new IllegalArgumentException("Cannot find Whitespace type for: " + v);
-    }
-    return r;
-  }
-
-  private static boolean toBoolean(String v) {
-    Preconditions.checkState(!Strings.isNullOrEmpty(v));
-    return v.equals("Y");
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_119.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_119.java
deleted file mode 100644
index f6abca8..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_119.java
+++ /dev/null
@@ -1,234 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.schema;
-
-import static com.google.gerrit.reviewdb.client.CoreDownloadSchemes.ANON_GIT;
-import static com.google.gerrit.reviewdb.client.CoreDownloadSchemes.ANON_HTTP;
-import static com.google.gerrit.reviewdb.client.CoreDownloadSchemes.HTTP;
-import static com.google.gerrit.reviewdb.client.CoreDownloadSchemes.REPO_DOWNLOAD;
-import static com.google.gerrit.reviewdb.client.CoreDownloadSchemes.SSH;
-import static com.google.gerrit.server.config.ConfigUtil.storeSection;
-
-import com.google.common.base.Preconditions;
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableMap;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo.DateFormat;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo.DiffView;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo.DownloadCommand;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo.EmailStrategy;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo.ReviewCategoryStrategy;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo.TimeFormat;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.account.VersionedAccountPreferences;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.UserConfigSections;
-import com.google.gwtorm.jdbc.JdbcSchema;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.BatchRefUpdate;
-import org.eclipse.jgit.lib.NullProgressMonitor;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-public class Schema_119 extends SchemaVersion {
-  private static final ImmutableMap<String, String> LEGACY_DISPLAYNAME_MAP =
-      ImmutableMap.<String, String>of(
-          "ANON_GIT", ANON_GIT,
-          "ANON_HTTP", ANON_HTTP,
-          "HTTP", HTTP,
-          "SSH", SSH,
-          "REPO_DOWNLOAD", REPO_DOWNLOAD);
-
-  private final GitRepositoryManager mgr;
-  private final AllUsersName allUsersName;
-  private final PersonIdent serverUser;
-
-  @Inject
-  Schema_119(
-      Provider<Schema_118> prior,
-      GitRepositoryManager mgr,
-      AllUsersName allUsersName,
-      @GerritPersonIdent PersonIdent serverUser) {
-    super(prior);
-    this.mgr = mgr;
-    this.allUsersName = allUsersName;
-    this.serverUser = serverUser;
-  }
-
-  @Override
-  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {
-    JdbcSchema schema = (JdbcSchema) db;
-    Connection connection = schema.getConnection();
-    String tableName = "accounts";
-    String emailStrategy = "email_strategy";
-    Set<String> columns = schema.getDialect().listColumns(connection, tableName);
-    Map<Account.Id, GeneralPreferencesInfo> imports = new HashMap<>();
-    try (Statement stmt = ((JdbcSchema) db).getConnection().createStatement();
-        ResultSet rs =
-            stmt.executeQuery(
-                "select "
-                    + "account_id, "
-                    + "maximum_page_size, "
-                    + "show_site_header, "
-                    + "use_flash_clipboard, "
-                    + "download_url, "
-                    + "download_command, "
-                    + (columns.contains(emailStrategy)
-                        ? emailStrategy + ", "
-                        : "copy_self_on_email, ")
-                    + "date_format, "
-                    + "time_format, "
-                    + "relative_date_in_change_table, "
-                    + "diff_view, "
-                    + "size_bar_in_change_table, "
-                    + "legacycid_in_change_table, "
-                    + "review_category_strategy, "
-                    + "mute_common_path_prefixes "
-                    + "from "
-                    + tableName)) {
-      while (rs.next()) {
-        GeneralPreferencesInfo p = new GeneralPreferencesInfo();
-        Account.Id accountId = new Account.Id(rs.getInt(1));
-        p.changesPerPage = (int) rs.getShort(2);
-        p.showSiteHeader = toBoolean(rs.getString(3));
-        p.useFlashClipboard = toBoolean(rs.getString(4));
-        p.downloadScheme = convertToModernNames(rs.getString(5));
-        p.downloadCommand = toDownloadCommand(rs.getString(6));
-        p.emailStrategy = toEmailStrategy(rs.getString(7), columns.contains(emailStrategy));
-        p.dateFormat = toDateFormat(rs.getString(8));
-        p.timeFormat = toTimeFormat(rs.getString(9));
-        p.relativeDateInChangeTable = toBoolean(rs.getString(10));
-        p.diffView = toDiffView(rs.getString(11));
-        p.sizeBarInChangeTable = toBoolean(rs.getString(12));
-        p.legacycidInChangeTable = toBoolean(rs.getString(13));
-        p.reviewCategoryStrategy = toReviewCategoryStrategy(rs.getString(14));
-        p.muteCommonPathPrefixes = toBoolean(rs.getString(15));
-        p.defaultBaseForMerges = GeneralPreferencesInfo.defaults().defaultBaseForMerges;
-        imports.put(accountId, p);
-      }
-    }
-
-    if (imports.isEmpty()) {
-      return;
-    }
-
-    try (Repository git = mgr.openRepository(allUsersName);
-        RevWalk rw = new RevWalk(git)) {
-      BatchRefUpdate bru = git.getRefDatabase().newBatchUpdate();
-      for (Map.Entry<Account.Id, GeneralPreferencesInfo> e : imports.entrySet()) {
-        try (MetaDataUpdate md =
-            new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, git, bru)) {
-          md.getCommitBuilder().setAuthor(serverUser);
-          md.getCommitBuilder().setCommitter(serverUser);
-          VersionedAccountPreferences p = VersionedAccountPreferences.forUser(e.getKey());
-          p.load(md);
-          storeSection(
-              p.getConfig(),
-              UserConfigSections.GENERAL,
-              null,
-              e.getValue(),
-              GeneralPreferencesInfo.defaults());
-          p.commit(md);
-        }
-      }
-
-      bru.execute(rw, NullProgressMonitor.INSTANCE);
-    } catch (ConfigInvalidException | IOException ex) {
-      throw new OrmException(ex);
-    }
-  }
-
-  private String convertToModernNames(String s) {
-    return !Strings.isNullOrEmpty(s) && LEGACY_DISPLAYNAME_MAP.containsKey(s)
-        ? LEGACY_DISPLAYNAME_MAP.get(s)
-        : s;
-  }
-
-  private static DownloadCommand toDownloadCommand(String v) {
-    if (v == null) {
-      return DownloadCommand.CHECKOUT;
-    }
-    return DownloadCommand.valueOf(v);
-  }
-
-  private static DateFormat toDateFormat(String v) {
-    if (v == null) {
-      return DateFormat.STD;
-    }
-    return DateFormat.valueOf(v);
-  }
-
-  private static TimeFormat toTimeFormat(String v) {
-    if (v == null) {
-      return TimeFormat.HHMM_12;
-    }
-    return TimeFormat.valueOf(v);
-  }
-
-  private static DiffView toDiffView(String v) {
-    if (v == null) {
-      return DiffView.SIDE_BY_SIDE;
-    }
-    return DiffView.valueOf(v);
-  }
-
-  private static EmailStrategy toEmailStrategy(String v, boolean emailStrategyColumnExists)
-      throws OrmException {
-    if (v == null) {
-      return EmailStrategy.ENABLED;
-    }
-    if (emailStrategyColumnExists) {
-      return EmailStrategy.valueOf(v);
-    }
-    if (v.equals("N")) {
-      // EMAIL_STRATEGY='ENABLED' WHERE (COPY_SELF_ON_EMAIL='N')
-      return EmailStrategy.ENABLED;
-    } else if (v.equals("Y")) {
-      // EMAIL_STRATEGY='CC_ON_OWN_COMMENTS' WHERE (COPY_SELF_ON_EMAIL='Y')
-      return EmailStrategy.CC_ON_OWN_COMMENTS;
-    } else {
-      throw new OrmException("invalid value in accounts.copy_self_on_email: " + v);
-    }
-  }
-
-  private static ReviewCategoryStrategy toReviewCategoryStrategy(String v) {
-    if (v == null) {
-      return ReviewCategoryStrategy.NONE;
-    }
-    return ReviewCategoryStrategy.valueOf(v);
-  }
-
-  private static boolean toBoolean(String v) {
-    Preconditions.checkState(!Strings.isNullOrEmpty(v));
-    return v.equals("Y");
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_120.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_120.java
deleted file mode 100644
index 072fc62..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_120.java
+++ /dev/null
@@ -1,119 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.schema;
-
-import com.google.gerrit.common.data.SubscribeSection;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gwtorm.jdbc.JdbcSchema;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.BatchRefUpdate;
-import org.eclipse.jgit.lib.NullProgressMonitor;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.RefSpec;
-
-public class Schema_120 extends SchemaVersion {
-
-  private final GitRepositoryManager mgr;
-  private final PersonIdent serverUser;
-
-  @Inject
-  Schema_120(
-      Provider<Schema_119> prior,
-      GitRepositoryManager mgr,
-      @GerritPersonIdent PersonIdent serverUser) {
-    super(prior);
-    this.mgr = mgr;
-    this.serverUser = serverUser;
-  }
-
-  private void allowSubmoduleSubscription(Branch.NameKey subbranch, Branch.NameKey superBranch)
-      throws OrmException {
-    try (Repository git = mgr.openRepository(subbranch.getParentKey());
-        RevWalk rw = new RevWalk(git)) {
-      BatchRefUpdate bru = git.getRefDatabase().newBatchUpdate();
-      try (MetaDataUpdate md =
-          new MetaDataUpdate(GitReferenceUpdated.DISABLED, subbranch.getParentKey(), git, bru)) {
-        md.getCommitBuilder().setAuthor(serverUser);
-        md.getCommitBuilder().setCommitter(serverUser);
-        md.setMessage("Added superproject subscription during upgrade");
-        ProjectConfig pc = ProjectConfig.read(md);
-
-        SubscribeSection s = null;
-        for (SubscribeSection s1 : pc.getSubscribeSections(subbranch)) {
-          if (s1.getProject().equals(superBranch.getParentKey())) {
-            s = s1;
-          }
-        }
-        if (s == null) {
-          s = new SubscribeSection(superBranch.getParentKey());
-          pc.addSubscribeSection(s);
-        }
-        RefSpec newRefSpec = new RefSpec(subbranch.get() + ":" + superBranch.get());
-
-        if (!s.getMatchingRefSpecs().contains(newRefSpec)) {
-          // For the migration we use only exact RefSpecs, we're not trying to
-          // generalize it.
-          s.addMatchingRefSpec(newRefSpec);
-        }
-
-        pc.commit(md);
-      }
-      bru.execute(rw, NullProgressMonitor.INSTANCE);
-    } catch (ConfigInvalidException | IOException e) {
-      throw new OrmException(e);
-    }
-  }
-
-  @Override
-  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {
-    ui.message("Generating Superproject subscriptions table to submodule ACLs");
-
-    try (Statement stmt = ((JdbcSchema) db).getConnection().createStatement();
-        ResultSet rs =
-            stmt.executeQuery(
-                "SELECT "
-                    + "super_project_project_name, "
-                    + "super_project_branch_name, "
-                    + "submodule_project_name, "
-                    + "submodule_branch_name "
-                    + "FROM submodule_subscriptions")) {
-      while (rs.next()) {
-        Project.NameKey superproject = new Project.NameKey(rs.getString(1));
-        Branch.NameKey superbranch = new Branch.NameKey(superproject, rs.getString(2));
-
-        Project.NameKey submodule = new Project.NameKey(rs.getString(3));
-        Branch.NameKey subbranch = new Branch.NameKey(submodule, rs.getString(4));
-
-        allowSubmoduleSubscription(subbranch, superbranch);
-      }
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_124.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_124.java
deleted file mode 100644
index 7842b65..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_124.java
+++ /dev/null
@@ -1,143 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.schema;
-
-import static java.util.Comparator.comparing;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.MultimapBuilder;
-import com.google.common.collect.Ordering;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountSshKey;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.account.VersionedAuthorizedKeys;
-import com.google.gerrit.server.account.VersionedAuthorizedKeys.SimpleSshKeyCreator;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gwtorm.jdbc.JdbcSchema;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.BatchRefUpdate;
-import org.eclipse.jgit.lib.NullProgressMonitor;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-public class Schema_124 extends SchemaVersion {
-  private final GitRepositoryManager repoManager;
-  private final AllUsersName allUsersName;
-  private final PersonIdent serverUser;
-
-  @Inject
-  Schema_124(
-      Provider<Schema_123> prior,
-      GitRepositoryManager repoManager,
-      AllUsersName allUsersName,
-      @GerritPersonIdent PersonIdent serverUser) {
-    super(prior);
-    this.repoManager = repoManager;
-    this.allUsersName = allUsersName;
-    this.serverUser = serverUser;
-  }
-
-  @Override
-  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {
-    ListMultimap<Account.Id, AccountSshKey> imports =
-        MultimapBuilder.hashKeys().arrayListValues().build();
-    try (Statement stmt = ((JdbcSchema) db).getConnection().createStatement();
-        ResultSet rs =
-            stmt.executeQuery(
-                "SELECT "
-                    + "account_id, "
-                    + "seq, "
-                    + "ssh_public_key, "
-                    + "valid "
-                    + "FROM account_ssh_keys")) {
-      while (rs.next()) {
-        Account.Id accountId = new Account.Id(rs.getInt(1));
-        int seq = rs.getInt(2);
-        String sshPublicKey = rs.getString(3);
-        AccountSshKey key = new AccountSshKey(new AccountSshKey.Id(accountId, seq), sshPublicKey);
-        boolean valid = toBoolean(rs.getString(4));
-        if (!valid) {
-          key.setInvalid();
-        }
-        imports.put(accountId, key);
-      }
-    }
-
-    if (imports.isEmpty()) {
-      return;
-    }
-
-    try (Repository git = repoManager.openRepository(allUsersName);
-        RevWalk rw = new RevWalk(git)) {
-      BatchRefUpdate bru = git.getRefDatabase().newBatchUpdate();
-
-      for (Map.Entry<Account.Id, Collection<AccountSshKey>> e : imports.asMap().entrySet()) {
-        try (MetaDataUpdate md =
-            new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, git, bru)) {
-          md.getCommitBuilder().setAuthor(serverUser);
-          md.getCommitBuilder().setCommitter(serverUser);
-
-          VersionedAuthorizedKeys authorizedKeys =
-              new VersionedAuthorizedKeys(new SimpleSshKeyCreator(), e.getKey());
-          authorizedKeys.load(md);
-          authorizedKeys.setKeys(fixInvalidSequenceNumbers(e.getValue()));
-          authorizedKeys.commit(md);
-        }
-      }
-
-      bru.execute(rw, NullProgressMonitor.INSTANCE);
-    } catch (ConfigInvalidException | IOException ex) {
-      throw new OrmException(ex);
-    }
-  }
-
-  private Collection<AccountSshKey> fixInvalidSequenceNumbers(Collection<AccountSshKey> keys) {
-    Ordering<AccountSshKey> o = Ordering.from(comparing(k -> k.getKey().get()));
-    List<AccountSshKey> fixedKeys = new ArrayList<>(keys);
-    AccountSshKey minKey = o.min(keys);
-    while (minKey.getKey().get() <= 0) {
-      AccountSshKey fixedKey =
-          new AccountSshKey(
-              new AccountSshKey.Id(
-                  minKey.getKey().getParentKey(), Math.max(o.max(keys).getKey().get() + 1, 1)),
-              minKey.getSshPublicKey());
-      Collections.replaceAll(fixedKeys, minKey, fixedKey);
-      minKey = o.min(fixedKeys);
-    }
-    return fixedKeys;
-  }
-
-  private static boolean toBoolean(String v) {
-    return !Strings.isNullOrEmpty(v) && v.equalsIgnoreCase("Y");
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_125.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_125.java
deleted file mode 100644
index 947c115..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_125.java
+++ /dev/null
@@ -1,128 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.schema;
-
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-import static com.google.gerrit.server.schema.AclUtil.grant;
-
-import com.google.gerrit.common.data.AccessSection;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.group.SystemGroupBackend;
-import com.google.gerrit.server.project.RefPattern;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-
-public class Schema_125 extends SchemaVersion {
-  private static final String COMMIT_MSG =
-      "Assign default permissions on user branches\n"
-          + "\n"
-          + "By default each user should be able to read and update the own user\n"
-          + "branch. Also the user should be able to approve and submit changes for\n"
-          + "the own user branch. Assign default permissions for this and remove the\n"
-          + "old exclusive read protection from the user branches.\n";
-
-  private final GitRepositoryManager repoManager;
-  private final AllUsersName allUsersName;
-  private final AllProjectsName allProjectsName;
-  private final SystemGroupBackend systemGroupBackend;
-  private final PersonIdent serverUser;
-
-  @Inject
-  Schema_125(
-      Provider<Schema_124> prior,
-      GitRepositoryManager repoManager,
-      AllUsersName allUsersName,
-      AllProjectsName allProjectsName,
-      SystemGroupBackend systemGroupBackend,
-      @GerritPersonIdent PersonIdent serverUser) {
-    super(prior);
-    this.repoManager = repoManager;
-    this.allUsersName = allUsersName;
-    this.allProjectsName = allProjectsName;
-    this.systemGroupBackend = systemGroupBackend;
-    this.serverUser = serverUser;
-  }
-
-  @Override
-  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException {
-    try (Repository git = repoManager.openRepository(allUsersName);
-        MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, git)) {
-      ProjectConfig config = ProjectConfig.read(md);
-
-      config
-          .getAccessSection(RefNames.REFS_USERS + "*", true)
-          .remove(new Permission(Permission.READ));
-      GroupReference registered = systemGroupBackend.getGroup(REGISTERED_USERS);
-      AccessSection users =
-          config.getAccessSection(
-              RefNames.REFS_USERS + "${" + RefPattern.USERID_SHARDED + "}", true);
-      grant(config, users, Permission.READ, true, registered);
-      grant(config, users, Permission.PUSH, true, registered);
-      grant(config, users, Permission.SUBMIT, true, registered);
-
-      for (LabelType lt : getLabelTypes(config)) {
-        if ("Code-Review".equals(lt.getName()) || "Verified".equals(lt.getName())) {
-          grant(config, users, lt, lt.getMin().getValue(), lt.getMax().getValue(), registered);
-        }
-      }
-
-      md.getCommitBuilder().setAuthor(serverUser);
-      md.getCommitBuilder().setCommitter(serverUser);
-      md.setMessage(COMMIT_MSG);
-      config.commit(md);
-    } catch (ConfigInvalidException | IOException ex) {
-      throw new OrmException(ex);
-    }
-  }
-
-  private Collection<LabelType> getLabelTypes(ProjectConfig config)
-      throws IOException, ConfigInvalidException {
-    Map<String, LabelType> labelTypes = new HashMap<>(config.getLabelSections());
-    Project.NameKey parent = config.getProject().getParent(allProjectsName);
-    while (parent != null) {
-      try (Repository git = repoManager.openRepository(parent);
-          MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, parent, git)) {
-        ProjectConfig parentConfig = ProjectConfig.read(md);
-        for (LabelType lt : parentConfig.getLabelSections().values()) {
-          if (!labelTypes.containsKey(lt.getName())) {
-            labelTypes.put(lt.getName(), lt);
-          }
-        }
-        parent = parentConfig.getProject().getParent(allProjectsName);
-      }
-    }
-    return labelTypes.values();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_126.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_126.java
deleted file mode 100644
index 2053c1a..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_126.java
+++ /dev/null
@@ -1,86 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.schema;
-
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-import static com.google.gerrit.server.schema.AclUtil.grant;
-
-import com.google.gerrit.common.data.AccessSection;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.group.SystemGroupBackend;
-import com.google.gerrit.server.project.RefPattern;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-
-public class Schema_126 extends SchemaVersion {
-  private static final String COMMIT_MSG = "Fix default permissions on user branches";
-
-  private final GitRepositoryManager repoManager;
-  private final AllUsersName allUsersName;
-  private final SystemGroupBackend systemGroupBackend;
-  private final PersonIdent serverUser;
-
-  @Inject
-  Schema_126(
-      Provider<Schema_125> prior,
-      GitRepositoryManager repoManager,
-      AllUsersName allUsersName,
-      SystemGroupBackend systemGroupBackend,
-      @GerritPersonIdent PersonIdent serverUser) {
-    super(prior);
-    this.repoManager = repoManager;
-    this.allUsersName = allUsersName;
-    this.systemGroupBackend = systemGroupBackend;
-    this.serverUser = serverUser;
-  }
-
-  @Override
-  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException {
-    try (Repository git = repoManager.openRepository(allUsersName);
-        MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, git)) {
-      ProjectConfig config = ProjectConfig.read(md);
-
-      String refsUsersShardedId = RefNames.REFS_USERS + "${" + RefPattern.USERID_SHARDED + "}";
-      config.remove(config.getAccessSection(refsUsersShardedId));
-
-      GroupReference registered = systemGroupBackend.getGroup(REGISTERED_USERS);
-      AccessSection users = config.getAccessSection(refsUsersShardedId, true);
-      grant(config, users, Permission.READ, false, true, registered);
-      grant(config, users, Permission.PUSH, false, true, registered);
-      grant(config, users, Permission.SUBMIT, false, true, registered);
-
-      md.getCommitBuilder().setAuthor(serverUser);
-      md.getCommitBuilder().setCommitter(serverUser);
-      md.setMessage(COMMIT_MSG);
-      config.commit(md);
-    } catch (ConfigInvalidException | IOException ex) {
-      throw new OrmException(ex);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_128.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_128.java
deleted file mode 100644
index 781f281..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_128.java
+++ /dev/null
@@ -1,80 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.schema;
-
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-import static com.google.gerrit.server.schema.AclUtil.grant;
-
-import com.google.gerrit.common.data.AccessSection;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.group.SystemGroupBackend;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-
-public class Schema_128 extends SchemaVersion {
-  private static final String COMMIT_MSG = "Add addPatchSet permission to all projects";
-
-  private final GitRepositoryManager repoManager;
-  private final AllProjectsName allProjectsName;
-  private final SystemGroupBackend systemGroupBackend;
-  private final PersonIdent serverUser;
-
-  @Inject
-  Schema_128(
-      Provider<Schema_127> prior,
-      GitRepositoryManager repoManager,
-      AllProjectsName allProjectsName,
-      SystemGroupBackend systemGroupBackend,
-      @GerritPersonIdent PersonIdent serverUser) {
-    super(prior);
-    this.repoManager = repoManager;
-    this.allProjectsName = allProjectsName;
-    this.systemGroupBackend = systemGroupBackend;
-    this.serverUser = serverUser;
-  }
-
-  @Override
-  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException {
-    try (Repository git = repoManager.openRepository(allProjectsName);
-        MetaDataUpdate md =
-            new MetaDataUpdate(GitReferenceUpdated.DISABLED, allProjectsName, git)) {
-      ProjectConfig config = ProjectConfig.read(md);
-
-      GroupReference registered = systemGroupBackend.getGroup(REGISTERED_USERS);
-      AccessSection refsFor = config.getAccessSection("refs/for/*", true);
-      grant(config, refsFor, Permission.ADD_PATCH_SET, false, false, registered);
-
-      md.getCommitBuilder().setAuthor(serverUser);
-      md.getCommitBuilder().setCommitter(serverUser);
-      md.setMessage(COMMIT_MSG);
-      config.commit(md);
-    } catch (ConfigInvalidException | IOException ex) {
-      throw new OrmException(ex);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_130.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_130.java
deleted file mode 100644
index 52f90b5..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_130.java
+++ /dev/null
@@ -1,76 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.schema;
-
-import static java.util.stream.Collectors.joining;
-
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.util.SortedSet;
-import java.util.TreeSet;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-
-public class Schema_130 extends SchemaVersion {
-  private static final String COMMIT_MSG =
-      "Remove force option from 'Push Annotated Tag' permission\n"
-          + "\n"
-          + "The force option on 'Push Annotated Tag' had no effect and is no longer\n"
-          + "supported.";
-
-  private final GitRepositoryManager repoManager;
-  private final PersonIdent serverUser;
-
-  @Inject
-  Schema_130(
-      Provider<Schema_129> prior,
-      GitRepositoryManager repoManager,
-      @GerritPersonIdent PersonIdent serverUser) {
-    super(prior);
-    this.repoManager = repoManager;
-    this.serverUser = serverUser;
-  }
-
-  @Override
-  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException {
-    SortedSet<Project.NameKey> repoList = repoManager.list();
-    SortedSet<Project.NameKey> repoUpgraded = new TreeSet<>();
-    ui.message("\tMigrating " + repoList.size() + " repositories ...");
-    for (Project.NameKey projectName : repoList) {
-      try (Repository git = repoManager.openRepository(projectName);
-          MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, projectName, git)) {
-        ProjectConfigSchemaUpdate cfg = ProjectConfigSchemaUpdate.read(md);
-        cfg.removeForceFromPermission("pushTag");
-        if (cfg.isUpdated()) {
-          repoUpgraded.add(projectName);
-        }
-        cfg.save(serverUser, COMMIT_MSG);
-      } catch (ConfigInvalidException | IOException ex) {
-        throw new OrmException("Cannot migrate project " + projectName, ex);
-      }
-    }
-    ui.message("\tMigration completed:  " + repoUpgraded.size() + " repositories updated:");
-    ui.message("\t" + repoUpgraded.stream().map(n -> n.get()).collect(joining(" ")));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_131.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_131.java
deleted file mode 100644
index 0387e35..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_131.java
+++ /dev/null
@@ -1,76 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.schema;
-
-import static java.util.stream.Collectors.joining;
-
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.util.SortedSet;
-import java.util.TreeSet;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-
-public class Schema_131 extends SchemaVersion {
-  private static final String COMMIT_MSG =
-      "Rename 'Push Annotated/Signed Tag' permission to 'Create Annotated/Signed Tag'";
-
-  private final GitRepositoryManager repoManager;
-  private final PersonIdent serverUser;
-
-  @Inject
-  Schema_131(
-      Provider<Schema_130> prior,
-      GitRepositoryManager repoManager,
-      @GerritPersonIdent PersonIdent serverUser) {
-    super(prior);
-    this.repoManager = repoManager;
-    this.serverUser = serverUser;
-  }
-
-  @Override
-  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException {
-    SortedSet<Project.NameKey> repoList = repoManager.list();
-    SortedSet<Project.NameKey> repoUpgraded = new TreeSet<>();
-    ui.message("\tMigrating " + repoList.size() + " repositories ...");
-    for (Project.NameKey projectName : repoList) {
-      try (Repository git = repoManager.openRepository(projectName);
-          MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, projectName, git)) {
-        ProjectConfig config = ProjectConfig.read(md);
-        if (config.hasLegacyPermissions()) {
-          md.getCommitBuilder().setAuthor(serverUser);
-          md.getCommitBuilder().setCommitter(serverUser);
-          md.setMessage(COMMIT_MSG);
-          config.commit(md);
-          repoUpgraded.add(projectName);
-        }
-      } catch (ConfigInvalidException | IOException ex) {
-        throw new OrmException("Cannot migrate project " + projectName, ex);
-      }
-    }
-    ui.message("\tMigration completed:  " + repoUpgraded.size() + " repositories updated:");
-    ui.message("\t" + repoUpgraded.stream().map(n -> n.get()).collect(joining(" ")));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_135.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_135.java
deleted file mode 100644
index f15e4c6..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_135.java
+++ /dev/null
@@ -1,98 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.schema;
-
-import static com.google.gerrit.server.group.SystemGroupBackend.PROJECT_OWNERS;
-import static java.util.stream.Collectors.toSet;
-
-import com.google.gerrit.common.data.AccessSection;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.common.data.PermissionRule;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.group.SystemGroupBackend;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.util.Set;
-import java.util.stream.Stream;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-
-public class Schema_135 extends SchemaVersion {
-  private static final String COMMIT_MSG =
-      "Allow admins and project owners to create refs/meta/config";
-
-  private final GitRepositoryManager repoManager;
-  private final AllProjectsName allProjectsName;
-  private final SystemGroupBackend systemGroupBackend;
-  private final PersonIdent serverUser;
-
-  @Inject
-  Schema_135(
-      Provider<Schema_134> prior,
-      GitRepositoryManager repoManager,
-      AllProjectsName allProjectsName,
-      SystemGroupBackend systemGroupBackend,
-      @GerritPersonIdent PersonIdent serverUser) {
-    super(prior);
-    this.repoManager = repoManager;
-    this.allProjectsName = allProjectsName;
-    this.systemGroupBackend = systemGroupBackend;
-    this.serverUser = serverUser;
-  }
-
-  @Override
-  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException {
-    try (Repository git = repoManager.openRepository(allProjectsName);
-        MetaDataUpdate md =
-            new MetaDataUpdate(GitReferenceUpdated.DISABLED, allProjectsName, git)) {
-      ProjectConfig config = ProjectConfig.read(md);
-
-      AccessSection meta = config.getAccessSection(RefNames.REFS_CONFIG, true);
-      Permission createRefsMetaConfigPermission = meta.getPermission(Permission.CREATE, true);
-
-      Set<GroupReference> groups =
-          Stream.concat(
-                  config.getAccessSection(AccessSection.GLOBAL_CAPABILITIES, true)
-                      .getPermission(GlobalCapability.ADMINISTRATE_SERVER, true).getRules().stream()
-                      .map(PermissionRule::getGroup),
-                  Stream.of(systemGroupBackend.getGroup(PROJECT_OWNERS)))
-              .filter(g -> createRefsMetaConfigPermission.getRule(g) == null)
-              .collect(toSet());
-
-      for (GroupReference group : groups) {
-        createRefsMetaConfigPermission.add(new PermissionRule(config.resolve(group)));
-      }
-
-      md.getCommitBuilder().setAuthor(serverUser);
-      md.getCommitBuilder().setCommitter(serverUser);
-      md.setMessage(COMMIT_MSG);
-      config.commit(md);
-    } catch (ConfigInvalidException | IOException ex) {
-      throw new OrmException(ex);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_139.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_139.java
deleted file mode 100644
index 7d71f6b..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_139.java
+++ /dev/null
@@ -1,206 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.schema;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.base.Preconditions;
-import com.google.common.base.Strings;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.MultimapBuilder;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.account.WatchConfig;
-import com.google.gerrit.server.account.WatchConfig.NotifyType;
-import com.google.gerrit.server.account.WatchConfig.ProjectWatchKey;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gwtorm.jdbc.JdbcSchema;
-import com.google.gwtorm.server.OrmDuplicateKeyException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.Collection;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.BatchRefUpdate;
-import org.eclipse.jgit.lib.NullProgressMonitor;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-public class Schema_139 extends SchemaVersion {
-  private static final String MSG = "Migrate project watches to git";
-
-  private final GitRepositoryManager repoManager;
-  private final AllUsersName allUsersName;
-  private final PersonIdent serverUser;
-
-  @Inject
-  Schema_139(
-      Provider<Schema_138> prior,
-      GitRepositoryManager repoManager,
-      AllUsersName allUsersName,
-      @GerritPersonIdent PersonIdent serverUser) {
-    super(prior);
-    this.repoManager = repoManager;
-    this.allUsersName = allUsersName;
-    this.serverUser = serverUser;
-  }
-
-  @Override
-  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {
-    ListMultimap<Account.Id, ProjectWatch> imports =
-        MultimapBuilder.hashKeys().arrayListValues().build();
-    try (Statement stmt = ((JdbcSchema) db).getConnection().createStatement();
-        ResultSet rs =
-            stmt.executeQuery(
-                "SELECT "
-                    + "account_id, "
-                    + "project_name, "
-                    + "filter, "
-                    + "notify_abandoned_changes, "
-                    + "notify_all_comments, "
-                    + "notify_new_changes, "
-                    + "notify_new_patch_sets, "
-                    + "notify_submitted_changes "
-                    + "FROM account_project_watches")) {
-      while (rs.next()) {
-        Account.Id accountId = new Account.Id(rs.getInt(1));
-        ProjectWatch.Builder b =
-            ProjectWatch.builder()
-                .project(new Project.NameKey(rs.getString(2)))
-                .filter(rs.getString(3))
-                .notifyAbandonedChanges(toBoolean(rs.getString(4)))
-                .notifyAllComments(toBoolean(rs.getString(5)))
-                .notifyNewChanges(toBoolean(rs.getString(6)))
-                .notifyNewPatchSets(toBoolean(rs.getString(7)))
-                .notifySubmittedChanges(toBoolean(rs.getString(8)));
-        imports.put(accountId, b.build());
-      }
-    }
-
-    if (imports.isEmpty()) {
-      return;
-    }
-
-    try (Repository git = repoManager.openRepository(allUsersName);
-        RevWalk rw = new RevWalk(git)) {
-      BatchRefUpdate bru = git.getRefDatabase().newBatchUpdate();
-      bru.setRefLogIdent(serverUser);
-      bru.setRefLogMessage(MSG, false);
-
-      for (Map.Entry<Account.Id, Collection<ProjectWatch>> e : imports.asMap().entrySet()) {
-        Map<ProjectWatchKey, Set<NotifyType>> projectWatches = new HashMap<>();
-        for (ProjectWatch projectWatch : e.getValue()) {
-          ProjectWatchKey key =
-              ProjectWatchKey.create(projectWatch.project(), projectWatch.filter());
-          if (projectWatches.containsKey(key)) {
-            throw new OrmDuplicateKeyException(
-                "Duplicate key for watched project: " + key.toString());
-          }
-          Set<NotifyType> notifyValues = EnumSet.noneOf(NotifyType.class);
-          if (projectWatch.notifyAbandonedChanges()) {
-            notifyValues.add(NotifyType.ABANDONED_CHANGES);
-          }
-          if (projectWatch.notifyAllComments()) {
-            notifyValues.add(NotifyType.ALL_COMMENTS);
-          }
-          if (projectWatch.notifyNewChanges()) {
-            notifyValues.add(NotifyType.NEW_CHANGES);
-          }
-          if (projectWatch.notifyNewPatchSets()) {
-            notifyValues.add(NotifyType.NEW_PATCHSETS);
-          }
-          if (projectWatch.notifySubmittedChanges()) {
-            notifyValues.add(NotifyType.SUBMITTED_CHANGES);
-          }
-          projectWatches.put(key, notifyValues);
-        }
-
-        try (MetaDataUpdate md =
-            new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, git, bru)) {
-          md.getCommitBuilder().setAuthor(serverUser);
-          md.getCommitBuilder().setCommitter(serverUser);
-          md.setMessage(MSG);
-
-          WatchConfig watchConfig = new WatchConfig(e.getKey());
-          watchConfig.load(md);
-          watchConfig.setProjectWatches(projectWatches);
-          watchConfig.commit(md);
-        }
-      }
-      bru.execute(rw, NullProgressMonitor.INSTANCE);
-    } catch (IOException | ConfigInvalidException ex) {
-      throw new OrmException(ex);
-    }
-  }
-
-  @AutoValue
-  abstract static class ProjectWatch {
-    abstract Project.NameKey project();
-
-    abstract @Nullable String filter();
-
-    abstract boolean notifyAbandonedChanges();
-
-    abstract boolean notifyAllComments();
-
-    abstract boolean notifyNewChanges();
-
-    abstract boolean notifyNewPatchSets();
-
-    abstract boolean notifySubmittedChanges();
-
-    static Builder builder() {
-      return new AutoValue_Schema_139_ProjectWatch.Builder();
-    }
-
-    @AutoValue.Builder
-    abstract static class Builder {
-      abstract Builder project(Project.NameKey project);
-
-      abstract Builder filter(@Nullable String filter);
-
-      abstract Builder notifyAbandonedChanges(boolean notifyAbandonedChanges);
-
-      abstract Builder notifyAllComments(boolean notifyAllComments);
-
-      abstract Builder notifyNewChanges(boolean notifyNewChanges);
-
-      abstract Builder notifyNewPatchSets(boolean notifyNewPatchSets);
-
-      abstract Builder notifySubmittedChanges(boolean notifySubmittedChanges);
-
-      abstract ProjectWatch build();
-    }
-  }
-
-  private static boolean toBoolean(String v) {
-    Preconditions.checkState(!Strings.isNullOrEmpty(v));
-    return v.equals("Y");
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_144.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_144.java
deleted file mode 100644
index d43b887..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_144.java
+++ /dev/null
@@ -1,114 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.schema;
-
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.account.externalids.ExternalIdReader;
-import com.google.gerrit.server.account.externalids.ExternalIdsUpdate;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gwtorm.jdbc.JdbcSchema;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.HashSet;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.notes.NoteMap;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-public class Schema_144 extends SchemaVersion {
-  private static final String COMMIT_MSG = "Import external IDs from ReviewDb";
-
-  private final GitRepositoryManager repoManager;
-  private final AllUsersName allUsersName;
-  private final PersonIdent serverIdent;
-
-  @Inject
-  Schema_144(
-      Provider<Schema_143> prior,
-      GitRepositoryManager repoManager,
-      AllUsersName allUsersName,
-      @GerritPersonIdent PersonIdent serverIdent) {
-    super(prior);
-    this.repoManager = repoManager;
-    this.allUsersName = allUsersName;
-    this.serverIdent = serverIdent;
-  }
-
-  @Override
-  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {
-    Set<ExternalId> toAdd = new HashSet<>();
-    try (Statement stmt = ((JdbcSchema) db).getConnection().createStatement();
-        ResultSet rs =
-            stmt.executeQuery(
-                "SELECT "
-                    + "account_id, "
-                    + "email_address, "
-                    + "password, "
-                    + "external_id "
-                    + "FROM account_external_ids")) {
-      while (rs.next()) {
-        Account.Id accountId = new Account.Id(rs.getInt(1));
-        String email = rs.getString(2);
-        String password = rs.getString(3);
-        String externalId = rs.getString(4);
-
-        toAdd.add(ExternalId.create(ExternalId.Key.parse(externalId), accountId, email, password));
-      }
-    }
-
-    try {
-      try (Repository repo = repoManager.openRepository(allUsersName);
-          RevWalk rw = new RevWalk(repo);
-          ObjectInserter ins = repo.newObjectInserter()) {
-        ObjectId rev = ExternalIdReader.readRevision(repo);
-
-        NoteMap noteMap = ExternalIdReader.readNoteMap(rw, rev);
-
-        for (ExternalId extId : toAdd) {
-          ExternalIdsUpdate.upsert(rw, ins, noteMap, extId);
-        }
-
-        ExternalIdsUpdate.commit(
-            allUsersName,
-            repo,
-            rw,
-            ins,
-            rev,
-            noteMap,
-            COMMIT_MSG,
-            serverIdent,
-            serverIdent,
-            null,
-            GitReferenceUpdated.DISABLED);
-      }
-    } catch (IOException | ConfigInvalidException e) {
-      throw new OrmException("Failed to migrate external IDs to NoteDb", e);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_147.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_147.java
deleted file mode 100644
index cac3e95..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_147.java
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.schema;
-
-import static java.util.stream.Collectors.toSet;
-
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.account.AccountsUpdate;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.HashSet;
-import java.util.Objects;
-import java.util.Set;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-
-/** Delete user branches for which no account exists. */
-public class Schema_147 extends SchemaVersion {
-  private final GitRepositoryManager repoManager;
-  private final AllUsersName allUsersName;
-  private final PersonIdent serverIdent;
-
-  @Inject
-  Schema_147(
-      Provider<Schema_146> prior,
-      GitRepositoryManager repoManager,
-      AllUsersName allUsersName,
-      @GerritPersonIdent PersonIdent serverIdent) {
-    super(prior);
-    this.repoManager = repoManager;
-    this.allUsersName = allUsersName;
-    this.serverIdent = serverIdent;
-  }
-
-  @Override
-  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {
-    try (Repository repo = repoManager.openRepository(allUsersName)) {
-      Set<Account.Id> accountIdsFromReviewDb = scanAccounts(db);
-      Set<Account.Id> accountIdsFromUserBranches =
-          repo.getRefDatabase().getRefs(RefNames.REFS_USERS).values().stream()
-              .map(r -> Account.Id.fromRef(r.getName()))
-              .filter(Objects::nonNull)
-              .collect(toSet());
-      accountIdsFromUserBranches.removeAll(accountIdsFromReviewDb);
-      for (Account.Id accountId : accountIdsFromUserBranches) {
-        AccountsUpdate.deleteUserBranch(
-            repo, allUsersName, GitReferenceUpdated.DISABLED, null, serverIdent, accountId);
-      }
-    } catch (IOException e) {
-      throw new OrmException("Failed to delete user branches for non-existing accounts.", e);
-    }
-  }
-
-  private Set<Account.Id> scanAccounts(ReviewDb db) throws SQLException {
-    try (Statement stmt = newStatement(db);
-        ResultSet rs = stmt.executeQuery("SELECT account_id FROM accounts")) {
-      Set<Account.Id> ids = new HashSet<>();
-      while (rs.next()) {
-        ids.add(new Account.Id(rs.getInt(1)));
-      }
-      return ids;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_148.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_148.java
deleted file mode 100644
index 47751cd..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_148.java
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.schema;
-
-import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
-
-import com.google.common.primitives.Ints;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.account.externalids.ExternalIdReader;
-import com.google.gerrit.server.account.externalids.ExternalIdsUpdate;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.sql.SQLException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.notes.Note;
-import org.eclipse.jgit.notes.NoteMap;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-public class Schema_148 extends SchemaVersion {
-  private static final String COMMIT_MSG = "Make account IDs of external IDs human-readable";
-
-  private final GitRepositoryManager repoManager;
-  private final AllUsersName allUsersName;
-  private final PersonIdent serverUser;
-
-  @Inject
-  Schema_148(
-      Provider<Schema_147> prior,
-      GitRepositoryManager repoManager,
-      AllUsersName allUsersName,
-      @GerritPersonIdent PersonIdent serverUser) {
-    super(prior);
-    this.repoManager = repoManager;
-    this.allUsersName = allUsersName;
-    this.serverUser = serverUser;
-  }
-
-  @Override
-  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {
-    try (Repository repo = repoManager.openRepository(allUsersName);
-        RevWalk rw = new RevWalk(repo);
-        ObjectInserter ins = repo.newObjectInserter()) {
-      ObjectId rev = ExternalIdReader.readRevision(repo);
-      NoteMap noteMap = ExternalIdReader.readNoteMap(rw, rev);
-      boolean dirty = false;
-      for (Note note : noteMap) {
-        byte[] raw =
-            rw.getObjectReader()
-                .open(note.getData(), OBJ_BLOB)
-                .getCachedBytes(ExternalIdReader.MAX_NOTE_SZ);
-        try {
-          ExternalId extId = ExternalId.parse(note.getName(), raw, note.getData());
-
-          if (needsUpdate(extId)) {
-            ExternalIdsUpdate.upsert(rw, ins, noteMap, extId);
-            dirty = true;
-          }
-        } catch (ConfigInvalidException e) {
-          ui.message(
-              String.format("Warning: Ignoring invalid external ID note %s", note.getName()));
-        }
-      }
-      if (dirty) {
-        ExternalIdsUpdate.commit(
-            allUsersName,
-            repo,
-            rw,
-            ins,
-            rev,
-            noteMap,
-            COMMIT_MSG,
-            serverUser,
-            serverUser,
-            null,
-            GitReferenceUpdated.DISABLED);
-      }
-    } catch (IOException e) {
-      throw new OrmException("Failed to update external IDs", e);
-    }
-  }
-
-  private static boolean needsUpdate(ExternalId extId) {
-    Config cfg = new Config();
-    cfg.setInt("externalId", extId.key().get(), "accountId", extId.accountId().get());
-    return Ints.tryParse(cfg.getString("externalId", extId.key().get(), "accountId")) == null;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_151.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_151.java
deleted file mode 100644
index 2015c14..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_151.java
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.schema;
-
-import com.google.common.collect.Streams;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.AccountGroupMemberAudit;
-import com.google.gerrit.reviewdb.client.AccountGroupMemberAudit.Key;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.ResultSet;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.sql.Timestamp;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Optional;
-
-/** A schema which adds the 'created on' field to groups. */
-public class Schema_151 extends SchemaVersion {
-  @Inject
-  protected Schema_151(Provider<Schema_150> prior) {
-    super(prior);
-  }
-
-  @Override
-  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException {
-    List<AccountGroup> accountGroups = db.accountGroups().all().toList();
-    for (AccountGroup accountGroup : accountGroups) {
-      ResultSet<AccountGroupMemberAudit> groupMemberAudits =
-          db.accountGroupMembersAudit().byGroup(accountGroup.getId());
-      Optional<Timestamp> firstTimeMentioned =
-          Streams.stream(groupMemberAudits)
-              .map(AccountGroupMemberAudit::getKey)
-              .map(Key::getAddedOn)
-              .min(Comparator.naturalOrder());
-      Timestamp createdOn =
-          firstTimeMentioned.orElseGet(() -> AccountGroup.auditCreationInstantTs());
-
-      accountGroup.setCreatedOn(createdOn);
-    }
-    db.accountGroups().update(accountGroups);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_154.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_154.java
deleted file mode 100644
index d4f8230..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_154.java
+++ /dev/null
@@ -1,150 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.schema;
-
-import static java.util.stream.Collectors.toMap;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.account.AccountConfig;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gwtorm.jdbc.JdbcSchema;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.ProgressMonitor;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.lib.TextProgressMonitor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Migrate accounts to NoteDb. */
-public class Schema_154 extends SchemaVersion {
-  private static final Logger log = LoggerFactory.getLogger(Schema_154.class);
-  private static final String TABLE = "accounts";
-  private static final Map<String, AccountSetter> ACCOUNT_FIELDS_MAP =
-      ImmutableMap.<String, AccountSetter>builder()
-          .put("full_name", (a, rs, field) -> a.setFullName(rs.getString(field)))
-          .put("preferred_email", (a, rs, field) -> a.setPreferredEmail(rs.getString(field)))
-          .put("status", (a, rs, field) -> a.setStatus(rs.getString(field)))
-          .put("inactive", (a, rs, field) -> a.setActive(rs.getString(field).equals("N")))
-          .build();
-
-  private final GitRepositoryManager repoManager;
-  private final AllUsersName allUsersName;
-  private final Provider<PersonIdent> serverIdent;
-
-  @Inject
-  Schema_154(
-      Provider<Schema_153> prior,
-      GitRepositoryManager repoManager,
-      AllUsersName allUsersName,
-      @GerritPersonIdent Provider<PersonIdent> serverIdent) {
-    super(prior);
-    this.repoManager = repoManager;
-    this.allUsersName = allUsersName;
-    this.serverIdent = serverIdent;
-  }
-
-  @Override
-  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {
-    try {
-      try (Repository repo = repoManager.openRepository(allUsersName)) {
-        ProgressMonitor pm = new TextProgressMonitor();
-        pm.beginTask("Collecting accounts", ProgressMonitor.UNKNOWN);
-        Set<Account> accounts = scanAccounts(db, pm);
-        pm.endTask();
-        pm.beginTask("Migrating accounts to NoteDb", accounts.size());
-        for (Account account : accounts) {
-          updateAccountInNoteDb(repo, account);
-          pm.update(1);
-        }
-        pm.endTask();
-      }
-    } catch (IOException | ConfigInvalidException e) {
-      throw new OrmException("Migrating accounts to NoteDb failed", e);
-    }
-  }
-
-  private Set<Account> scanAccounts(ReviewDb db, ProgressMonitor pm) throws SQLException {
-    Map<String, AccountSetter> fields = getFields(db);
-    if (fields.isEmpty()) {
-      log.warn("Only account_id and registered_on fields are migrated for accounts");
-    }
-
-    List<String> queryFields = new ArrayList<>();
-    queryFields.add("account_id");
-    queryFields.add("registered_on");
-    queryFields.addAll(fields.keySet());
-    String query = "SELECT " + String.join(", ", queryFields) + String.format(" FROM %s", TABLE);
-    try (Statement stmt = newStatement(db);
-        ResultSet rs = stmt.executeQuery(query)) {
-      Set<Account> s = new HashSet<>();
-      while (rs.next()) {
-        Account a = new Account(new Account.Id(rs.getInt(1)), rs.getTimestamp(2));
-        for (Map.Entry<String, AccountSetter> field : fields.entrySet()) {
-          field.getValue().set(a, rs, field.getKey());
-        }
-        s.add(a);
-        pm.update(1);
-      }
-      return s;
-    }
-  }
-
-  private Map<String, AccountSetter> getFields(ReviewDb db) throws SQLException {
-    JdbcSchema schema = (JdbcSchema) db;
-    Connection connection = schema.getConnection();
-    Set<String> columns = schema.getDialect().listColumns(connection, TABLE);
-    return ACCOUNT_FIELDS_MAP.entrySet().stream()
-        .filter(e -> columns.contains(e.getKey()))
-        .collect(toMap(Map.Entry::getKey, Map.Entry::getValue));
-  }
-
-  private void updateAccountInNoteDb(Repository allUsersRepo, Account account)
-      throws IOException, ConfigInvalidException {
-    MetaDataUpdate md =
-        new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, allUsersRepo);
-    PersonIdent ident = serverIdent.get();
-    md.getCommitBuilder().setAuthor(ident);
-    md.getCommitBuilder().setCommitter(ident);
-    AccountConfig accountConfig = new AccountConfig(null, account.getId());
-    accountConfig.load(allUsersRepo);
-    accountConfig.setAccount(account);
-    accountConfig.commit(md);
-  }
-
-  @FunctionalInterface
-  private interface AccountSetter {
-    void set(Account a, ResultSet rs, String field) throws SQLException;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_155.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_155.java
deleted file mode 100644
index 2bb2a33..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_155.java
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.schema;
-
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.Sequences;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.notedb.RepoSequence;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.sql.SQLException;
-
-/** Create account sequence in NoteDb */
-public class Schema_155 extends SchemaVersion {
-  private final GitRepositoryManager repoManager;
-  private final AllUsersName allUsersName;
-
-  @Inject
-  Schema_155(
-      Provider<Schema_154> prior, GitRepositoryManager repoManager, AllUsersName allUsersName) {
-    super(prior);
-    this.repoManager = repoManager;
-    this.allUsersName = allUsersName;
-  }
-
-  @Override
-  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {
-    @SuppressWarnings("deprecation")
-    RepoSequence.Seed accountSeed = () -> db.nextAccountId();
-    RepoSequence accountSeq =
-        new RepoSequence(
-            repoManager,
-            GitReferenceUpdated.DISABLED,
-            allUsersName,
-            Sequences.NAME_ACCOUNTS,
-            accountSeed,
-            1);
-
-    // consume one account ID to ensure that the account sequence is initialized in NoteDb
-    accountSeq.next();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_159.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_159.java
deleted file mode 100644
index f97453e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_159.java
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.schema;
-
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.StatementExecutor;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-
-/** Migrate draft changes to private or wip changes. */
-public class Schema_159 extends SchemaVersion {
-
-  private static enum DraftWorkflowMigrationStrategy {
-    PRIVATE,
-    WORK_IN_PROGRESS
-  }
-
-  @Inject
-  Schema_159(Provider<Schema_158> prior) {
-    super(prior);
-  }
-
-  @Override
-  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException {
-    DraftWorkflowMigrationStrategy strategy = DraftWorkflowMigrationStrategy.WORK_IN_PROGRESS;
-    if (ui.yesno(false, "Migrate draft changes to private changes (default is work-in-progress)")) {
-      strategy = DraftWorkflowMigrationStrategy.PRIVATE;
-    }
-    ui.message(
-        String.format("Replace draft changes with %s changes ...", strategy.name().toLowerCase()));
-    try (StatementExecutor e = newExecutor(db)) {
-      String column =
-          strategy == DraftWorkflowMigrationStrategy.PRIVATE ? "is_private" : "work_in_progress";
-      // Mark changes private/WIP and NEW if either:
-      // * they have status DRAFT
-      // * they have status NEW and have any draft patch sets
-      e.execute(
-          String.format(
-              "UPDATE changes "
-                  + "SET %s = 'Y', "
-                  + "    status = 'n', "
-                  + "    created_on = created_on "
-                  + "WHERE status = 'd' "
-                  + "  OR (status = 'n' "
-                  + "      AND EXISTS "
-                  + "        (SELECT * "
-                  + "         FROM patch_sets "
-                  + "         WHERE patch_sets.change_id = changes.change_id "
-                  + "           AND patch_sets.draft = 'Y')) ",
-              column));
-    }
-    ui.message("done");
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_160.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_160.java
deleted file mode 100644
index b78e333..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_160.java
+++ /dev/null
@@ -1,153 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.schema;
-
-import static com.google.gerrit.server.git.UserConfigSections.KEY_URL;
-import static com.google.gerrit.server.git.UserConfigSections.MY;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.account.Accounts;
-import com.google.gerrit.server.account.VersionedAccountPreferences;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.ProgressMonitor;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.lib.TextProgressMonitor;
-
-/**
- * Remove "My Drafts" menu items for all users and server-wide default preferences.
- *
- * <p>Since draft changes no longer exist, these menu items are obsolete.
- *
- * <p>Only matches menu items (with any name) where the URL exactly matches one of the following,
- * with or without leading {@code #}:
- *
- * <ul>
- *   <li>/q/is:draft
- *   <li>/q/owner:self+is:draft
- * </ul>
- *
- * In particular, this includes the <a
- * href="https://gerrit.googlesource.com/gerrit/+/v2.14.4/gerrit-server/src/main/java/com/google/gerrit/server/account/GeneralPreferencesLoader.java#144">default
- * from version 2.14 and earlier</a>.
- *
- * <p>Other menus containing {@code is:draft} in other positions are not affected; this is still a
- * valid predicate that matches no changes.
- */
-public class Schema_160 extends SchemaVersion {
-  @VisibleForTesting static final ImmutableList<String> DEFAULT_DRAFT_ITEMS;
-
-  static {
-    String ownerSelfIsDraft = "/q/owner:self+is:draft";
-    String isDraft = "/q/is:draft";
-    DEFAULT_DRAFT_ITEMS =
-        ImmutableList.of(ownerSelfIsDraft, '#' + ownerSelfIsDraft, isDraft, '#' + isDraft);
-  }
-
-  private final GitRepositoryManager repoManager;
-  private final AllUsersName allUsersName;
-  private final Provider<PersonIdent> serverIdent;
-
-  @Inject
-  Schema_160(
-      Provider<Schema_159> prior,
-      GitRepositoryManager repoManager,
-      AllUsersName allUsersName,
-      @GerritPersonIdent Provider<PersonIdent> serverIdent) {
-    super(prior);
-    this.repoManager = repoManager;
-    this.allUsersName = allUsersName;
-    this.serverIdent = serverIdent;
-  }
-
-  @Override
-  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException {
-    try {
-      try (Repository repo = repoManager.openRepository(allUsersName)) {
-        ProgressMonitor pm = new TextProgressMonitor();
-        pm.beginTask("Removing \"My Drafts\" menu items", ProgressMonitor.UNKNOWN);
-        for (Account.Id id : (Iterable<Account.Id>) Accounts.readUserRefs(repo)::iterator) {
-          removeMyDrafts(repo, RefNames.refsUsers(id), pm);
-        }
-        removeMyDrafts(repo, RefNames.REFS_USERS_DEFAULT, pm);
-        pm.endTask();
-      }
-    } catch (IOException | ConfigInvalidException e) {
-      throw new OrmException("Removing \"My Drafts\" menu items failed", e);
-    }
-  }
-
-  private void removeMyDrafts(Repository repo, String ref, ProgressMonitor pm)
-      throws IOException, ConfigInvalidException {
-    MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, repo);
-    PersonIdent ident = serverIdent.get();
-    md.getCommitBuilder().setAuthor(ident);
-    md.getCommitBuilder().setCommitter(ident);
-    Prefs prefs = new Prefs(ref);
-    prefs.load(repo);
-    prefs.removeMyDrafts();
-    prefs.commit(md);
-    if (prefs.dirty()) {
-      pm.update(1);
-    }
-  }
-
-  private static class Prefs extends VersionedAccountPreferences {
-    private boolean dirty;
-
-    Prefs(String ref) {
-      super(ref);
-    }
-
-    @Override
-    protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException {
-      if (!dirty) {
-        return false;
-      }
-      commit.setMessage("Remove \"My Drafts\" menu items");
-      return super.onSave(commit);
-    }
-
-    void removeMyDrafts() {
-      Config cfg = getConfig();
-      for (String item : cfg.getSubsections(MY)) {
-        String value = cfg.getString(MY, item, KEY_URL);
-        if (DEFAULT_DRAFT_ITEMS.contains(value)) {
-          cfg.unsetSection(MY, item);
-          dirty = true;
-        }
-      }
-    }
-
-    boolean dirty() {
-      return dirty;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_161.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_161.java
deleted file mode 100644
index 3de9855..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_161.java
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.schema;
-
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.primitives.Ints;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.StarredChangesUtil;
-import com.google.gerrit.server.StarredChangesUtil.IllegalLabelException;
-import com.google.gerrit.server.StarredChangesUtil.StarRef;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.util.List;
-import java.util.Objects;
-import java.util.Set;
-import org.eclipse.jgit.lib.BatchRefUpdate;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.lib.TextProgressMonitor;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.ReceiveCommand;
-
-public class Schema_161 extends SchemaVersion {
-  private static final String MUTE_LABEL = "mute";
-
-  private final GitRepositoryManager repoManager;
-  private final AllUsersName allUsersName;
-
-  @Inject
-  Schema_161(
-      Provider<Schema_160> prior, GitRepositoryManager repoManager, AllUsersName allUsersName) {
-    super(prior);
-    this.repoManager = repoManager;
-    this.allUsersName = allUsersName;
-  }
-
-  @Override
-  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException {
-    try (Repository git = repoManager.openRepository(allUsersName);
-        RevWalk rw = new RevWalk(git)) {
-      BatchRefUpdate bru = git.getRefDatabase().newBatchUpdate();
-      bru.setAllowNonFastForwards(true);
-
-      for (Ref ref : git.getRefDatabase().getRefs(RefNames.REFS_STARRED_CHANGES).values()) {
-        StarRef starRef = StarredChangesUtil.readLabels(git, ref.getName());
-
-        Set<Integer> mutedPatchSets =
-            StarredChangesUtil.getStarredPatchSets(starRef.labels(), MUTE_LABEL);
-        if (mutedPatchSets.isEmpty()) {
-          continue;
-        }
-
-        Set<Integer> reviewedPatchSets =
-            StarredChangesUtil.getStarredPatchSets(
-                starRef.labels(), StarredChangesUtil.REVIEWED_LABEL);
-        Set<Integer> unreviewedPatchSets =
-            StarredChangesUtil.getStarredPatchSets(
-                starRef.labels(), StarredChangesUtil.UNREVIEWED_LABEL);
-
-        List<String> newLabels =
-            starRef.labels().stream()
-                .map(
-                    l -> {
-                      if (l.startsWith(MUTE_LABEL)) {
-                        Integer mutedPatchSet = Ints.tryParse(l.substring(MUTE_LABEL.length() + 1));
-                        if (mutedPatchSet == null) {
-                          // unexpected format of mute label, must be a label that was manually
-                          // set, just leave it alone
-                          return l;
-                        }
-                        if (!reviewedPatchSets.contains(mutedPatchSet)
-                            && !unreviewedPatchSets.contains(mutedPatchSet)) {
-                          // convert mute label to reviewed label
-                          return StarredChangesUtil.REVIEWED_LABEL + "/" + mutedPatchSet;
-                        }
-                        // else patch set is muted but has either reviewed or unreviewed label
-                        // -> just drop the mute label
-                        return null;
-                      }
-                      return l;
-                    })
-                .filter(Objects::nonNull)
-                .collect(toList());
-
-        ObjectId id = StarredChangesUtil.writeLabels(git, newLabels);
-        bru.addCommand(new ReceiveCommand(ref.getTarget().getObjectId(), id, ref.getName()));
-      }
-      bru.execute(rw, new TextProgressMonitor());
-    } catch (IOException | IllegalLabelException ex) {
-      throw new OrmException(ex);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_87.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_87.java
deleted file mode 100644
index 8ab949e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_87.java
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.schema;
-
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.group.SystemGroupBackend;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-public class Schema_87 extends SchemaVersion {
-  @Inject
-  Schema_87(Provider<Schema_86> prior) {
-    super(prior);
-  }
-
-  @Override
-  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {
-    for (AccountGroup.Id id : scanSystemGroups(db)) {
-      AccountGroup group = db.accountGroups().get(id);
-      if (group != null && SystemGroupBackend.isSystemGroup(group.getGroupUUID())) {
-        db.accountGroups().delete(Collections.singleton(group));
-        db.accountGroupNames().deleteKeys(Collections.singleton(group.getNameKey()));
-      }
-    }
-  }
-
-  private Set<AccountGroup.Id> scanSystemGroups(ReviewDb db) throws SQLException {
-    try (Statement stmt = newStatement(db);
-        ResultSet rs =
-            stmt.executeQuery("SELECT group_id FROM account_groups WHERE group_type = 'SYSTEM'")) {
-      Set<AccountGroup.Id> ids = new HashSet<>();
-      while (rs.next()) {
-        ids.add(new AccountGroup.Id(rs.getInt(1)));
-      }
-      return ids;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStoreProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStoreProvider.java
deleted file mode 100644
index 88c2072..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStoreProvider.java
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.securestore;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.SiteLibraryLoaderUtil;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.nio.file.Path;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class SecureStoreProvider implements Provider<SecureStore> {
-  private static final Logger log = LoggerFactory.getLogger(SecureStoreProvider.class);
-
-  private final Path libdir;
-  private final Injector injector;
-  private final String className;
-
-  @Inject
-  protected SecureStoreProvider(
-      Injector injector, SitePaths sitePaths, @Nullable @SecureStoreClassName String className) {
-    this.injector = injector;
-    this.libdir = sitePaths.lib_dir;
-    this.className = className;
-  }
-
-  @Override
-  public synchronized SecureStore get() {
-    return injector.getInstance(getSecureStoreImpl());
-  }
-
-  @SuppressWarnings("unchecked")
-  private Class<? extends SecureStore> getSecureStoreImpl() {
-    if (Strings.isNullOrEmpty(className)) {
-      return DefaultSecureStore.class;
-    }
-
-    SiteLibraryLoaderUtil.loadSiteLib(libdir);
-    try {
-      return (Class<? extends SecureStore>) Class.forName(className);
-    } catch (ClassNotFoundException e) {
-      String msg = String.format("Cannot load secure store class: %s", className);
-      log.error(msg, e);
-      throw new RuntimeException(msg, e);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ssh/NoSshKeyCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/ssh/NoSshKeyCache.java
deleted file mode 100644
index 798ce38..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/ssh/NoSshKeyCache.java
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.server.ssh;
-
-import com.google.gerrit.common.errors.InvalidSshKeyException;
-import com.google.gerrit.reviewdb.client.AccountSshKey;
-import com.google.inject.AbstractModule;
-import com.google.inject.Module;
-import com.google.inject.Singleton;
-
-@Singleton
-public class NoSshKeyCache implements SshKeyCache, SshKeyCreator {
-
-  public static Module module() {
-    return new AbstractModule() {
-      @Override
-      protected void configure() {
-        bind(SshKeyCache.class).to(NoSshKeyCache.class);
-        bind(SshKeyCreator.class).to(NoSshKeyCache.class);
-      }
-    };
-  }
-
-  @Override
-  public void evict(String username) {}
-
-  @Override
-  public AccountSshKey create(AccountSshKey.Id id, String encoded) throws InvalidSshKeyException {
-    throw new InvalidSshKeyException();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshAddressesModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshAddressesModule.java
deleted file mode 100644
index 0e5b2f8..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshAddressesModule.java
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.ssh;
-
-import com.google.common.collect.Lists;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.util.SocketUtil;
-import com.google.inject.AbstractModule;
-import com.google.inject.Provides;
-import com.google.inject.Singleton;
-import java.net.InetSocketAddress;
-import java.net.SocketAddress;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class SshAddressesModule extends AbstractModule {
-  private static final Logger log = LoggerFactory.getLogger(SshAddressesModule.class);
-
-  public static final int DEFAULT_PORT = 29418;
-  public static final int IANA_SSH_PORT = 22;
-
-  @Override
-  protected void configure() {}
-
-  @Provides
-  @Singleton
-  @SshListenAddresses
-  public List<SocketAddress> getListenAddresses(@GerritServerConfig Config cfg) {
-    List<SocketAddress> listen = Lists.newArrayListWithExpectedSize(2);
-    String[] want = cfg.getStringList("sshd", null, "listenaddress");
-    if (want == null || want.length == 0) {
-      listen.add(new InetSocketAddress(DEFAULT_PORT));
-      return listen;
-    }
-
-    if (want.length == 1 && isOff(want[0])) {
-      return listen;
-    }
-
-    for (String desc : want) {
-      try {
-        listen.add(SocketUtil.resolve(desc, DEFAULT_PORT));
-      } catch (IllegalArgumentException e) {
-        log.error("Bad sshd.listenaddress: " + desc + ": " + e.getMessage());
-      }
-    }
-    return listen;
-  }
-
-  private static boolean isOff(String listenHostname) {
-    return "off".equalsIgnoreCase(listenHostname)
-        || "none".equalsIgnoreCase(listenHostname)
-        || "no".equalsIgnoreCase(listenHostname);
-  }
-
-  @Provides
-  @Singleton
-  @SshAdvertisedAddresses
-  List<String> getAdvertisedAddresses(
-      @GerritServerConfig Config cfg, @SshListenAddresses List<SocketAddress> listen) {
-    String[] want = cfg.getStringList("sshd", null, "advertisedaddress");
-    if (want.length > 0) {
-      return Arrays.asList(want);
-    }
-    List<InetSocketAddress> pub = new ArrayList<>();
-    List<InetSocketAddress> local = new ArrayList<>();
-
-    for (SocketAddress addr : listen) {
-      if (addr instanceof InetSocketAddress) {
-        InetSocketAddress inetAddr = (InetSocketAddress) addr;
-        if (inetAddr.getAddress().isLoopbackAddress()) {
-          local.add(inetAddr);
-        } else {
-          pub.add(inetAddr);
-        }
-      }
-    }
-    if (pub.isEmpty()) {
-      pub = local;
-    }
-    List<String> adv = Lists.newArrayListWithCapacity(pub.size());
-    for (InetSocketAddress addr : pub) {
-      adv.add(SocketUtil.format(addr, IANA_SSH_PORT));
-    }
-    return adv;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshKeyCreator.java b/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshKeyCreator.java
deleted file mode 100644
index a371490..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshKeyCreator.java
+++ /dev/null
@@ -1,22 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.ssh;
-
-import com.google.gerrit.common.errors.InvalidSshKeyException;
-import com.google.gerrit.reviewdb.client.AccountSshKey;
-
-public interface SshKeyCreator {
-  AccountSshKey create(AccountSshKey.Id id, String encoded) throws InvalidSshKeyException;
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/tools/ToolsCatalog.java b/gerrit-server/src/main/java/com/google/gerrit/server/tools/ToolsCatalog.java
deleted file mode 100644
index b616791..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/tools/ToolsCatalog.java
+++ /dev/null
@@ -1,231 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.server.tools;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.Version;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.SortedMap;
-import java.util.TreeMap;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.util.RawParseUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Listing of all client side tools stored on this server.
- *
- * <p>Clients may download these tools through our file server, as they are packaged with our own
- * software releases.
- */
-@Singleton
-public class ToolsCatalog {
-  private static final Logger log = LoggerFactory.getLogger(ToolsCatalog.class);
-
-  private final SortedMap<String, Entry> toc;
-
-  @Inject
-  ToolsCatalog() throws IOException {
-    this.toc = readToc();
-  }
-
-  /**
-   * Lookup an entry in the tools catalog.
-   *
-   * @param name path of the item, relative to the root of the catalog.
-   * @return the entry; null if the item is not part of the catalog.
-   */
-  @Nullable
-  public Entry get(@Nullable String name) {
-    if (Strings.isNullOrEmpty(name)) {
-      return null;
-    }
-    if (name.startsWith("/")) {
-      name = name.substring(1);
-    }
-    if (name.endsWith("/")) {
-      name = name.substring(0, name.length() - 1);
-    }
-    return toc.get(name);
-  }
-
-  private static SortedMap<String, Entry> readToc() throws IOException {
-    SortedMap<String, Entry> toc = new TreeMap<>();
-    final BufferedReader br =
-        new BufferedReader(new InputStreamReader(new ByteArrayInputStream(read("TOC")), UTF_8));
-    String line;
-    while ((line = br.readLine()) != null) {
-      if (line.length() > 0 && !line.startsWith("#")) {
-        final Entry e = new Entry(Entry.Type.FILE, line);
-        toc.put(e.getPath(), e);
-      }
-    }
-
-    final List<Entry> all = new ArrayList<>(toc.values());
-    for (Entry e : all) {
-      String path = dirOf(e.getPath());
-      while (path != null) {
-        Entry d = toc.get(path);
-        if (d == null) {
-          d = new Entry(Entry.Type.DIR, 0755, path);
-          toc.put(d.getPath(), d);
-        }
-        d.children.add(e);
-        path = dirOf(path);
-        e = d;
-      }
-    }
-
-    final Entry top = new Entry(Entry.Type.DIR, 0755, "");
-    for (Entry e : toc.values()) {
-      if (dirOf(e.getPath()) == null) {
-        top.children.add(e);
-      }
-    }
-    toc.put(top.getPath(), top);
-
-    return Collections.unmodifiableSortedMap(toc);
-  }
-
-  @Nullable
-  private static byte[] read(String path) {
-    String name = "root/" + path;
-    try (InputStream in = ToolsCatalog.class.getResourceAsStream(name)) {
-      if (in == null) {
-        return null;
-      }
-      final ByteArrayOutputStream out = new ByteArrayOutputStream();
-      final byte[] buf = new byte[8192];
-      int n;
-      while ((n = in.read(buf, 0, buf.length)) > 0) {
-        out.write(buf, 0, n);
-      }
-      return out.toByteArray();
-    } catch (Exception e) {
-      log.debug("Cannot read " + path, e);
-      return null;
-    }
-  }
-
-  @Nullable
-  private static String dirOf(String path) {
-    final int s = path.lastIndexOf('/');
-    return s < 0 ? null : path.substring(0, s);
-  }
-
-  /** A file served out of the tools root directory. */
-  public static class Entry {
-    public enum Type {
-      DIR,
-      FILE
-    }
-
-    private final Type type;
-    private final int mode;
-    private final String path;
-    private final List<Entry> children;
-
-    Entry(Type type, String line) {
-      int s = line.indexOf(' ');
-      String mode = line.substring(0, s);
-      String path = line.substring(s + 1);
-
-      this.type = type;
-      this.mode = Integer.parseInt(mode, 8);
-      this.path = path;
-      if (type == Type.FILE) {
-        this.children = Collections.emptyList();
-      } else {
-        this.children = new ArrayList<>();
-      }
-    }
-
-    Entry(Type type, int mode, String path) {
-      this.type = type;
-      this.mode = mode;
-      this.path = path;
-      this.children = new ArrayList<>();
-    }
-
-    public Type getType() {
-      return type;
-    }
-
-    /** @return the preferred UNIX file mode, e.g. {@code 0755}. */
-    public int getMode() {
-      return mode;
-    }
-
-    /** @return path of the entry, relative to the catalog root. */
-    public String getPath() {
-      return path;
-    }
-
-    /** @return name of the entry, within its parent directory. */
-    public String getName() {
-      final int s = path.lastIndexOf('/');
-      return s < 0 ? path : path.substring(s + 1);
-    }
-
-    /** @return collection of entries below this one, if this is a directory. */
-    public List<Entry> getChildren() {
-      return Collections.unmodifiableList(children);
-    }
-
-    /** @return a copy of the file's contents. */
-    public byte[] getBytes() {
-      byte[] data = read(getPath());
-
-      if (isScript(data)) {
-        // Embed Gerrit's version number into the top of the script.
-        //
-        final String version = Version.getVersion();
-        final int lf = RawParseUtils.nextLF(data, 0);
-        if (version != null && lf < data.length) {
-          byte[] versionHeader = Constants.encode("# From Gerrit Code Review " + version + "\n");
-
-          ByteArrayOutputStream buf = new ByteArrayOutputStream();
-          buf.write(data, 0, lf);
-          buf.write(versionHeader, 0, versionHeader.length);
-          buf.write(data, lf, data.length - lf);
-          data = buf.toByteArray();
-        }
-      }
-
-      return data;
-    }
-
-    private boolean isScript(byte[] data) {
-      return data != null
-          && data.length > 3 //
-          && data[0] == '#' //
-          && data[1] == '!' //
-          && data[2] == '/';
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/update/BatchUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/update/BatchUpdate.java
deleted file mode 100644
index cf88be0..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/update/BatchUpdate.java
+++ /dev/null
@@ -1,402 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.update;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.common.collect.ImmutableMultiset.toImmutableMultiset;
-
-import com.google.common.base.Throwables;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.MultimapBuilder;
-import com.google.common.collect.Multiset;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.config.FactoryModule;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.validators.OnSubmitValidators;
-import com.google.gerrit.server.notedb.NotesMigration;
-import com.google.gerrit.server.project.InvalidChangeOperationException;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.NoSuchRefException;
-import com.google.gerrit.server.util.RequestId;
-import com.google.inject.Inject;
-import com.google.inject.Module;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.TimeZone;
-import org.eclipse.jgit.lib.BatchRefUpdate;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.PushCertificate;
-import org.eclipse.jgit.transport.ReceiveCommand;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Helper for a set of updates that should be applied for a site.
- *
- * <p>An update operation can be divided into three phases:
- *
- * <ol>
- *   <li>Git reference updates
- *   <li>Database updates
- *   <li>Post-update steps
- *   <li>
- * </ol>
- *
- * A single conceptual operation, such as a REST API call or a merge operation, may make multiple
- * changes at each step, which all need to be serialized relative to each other. Moreover, for
- * consistency, <em>all</em> git ref updates must be performed before <em>any</em> database updates,
- * since database updates might refer to newly-created patch set refs. And all post-update steps,
- * such as hooks, should run only after all storage mutations have completed.
- *
- * <p>Depending on the backend used, each step might support batching, for example in a {@code
- * BatchRefUpdate} or one or more database transactions. All operations in one phase must complete
- * successfully before proceeding to the next phase.
- */
-public abstract class BatchUpdate implements AutoCloseable {
-  private static final Logger log = LoggerFactory.getLogger(BatchUpdate.class);
-
-  public static Module module() {
-    return new FactoryModule() {
-      @Override
-      public void configure() {
-        factory(ReviewDbBatchUpdate.AssistedFactory.class);
-        factory(NoteDbBatchUpdate.AssistedFactory.class);
-      }
-    };
-  }
-
-  @Singleton
-  public static class Factory {
-    private final NotesMigration migration;
-    private final ReviewDbBatchUpdate.AssistedFactory reviewDbBatchUpdateFactory;
-    private final NoteDbBatchUpdate.AssistedFactory noteDbBatchUpdateFactory;
-
-    // TODO(dborowitz): Make this non-injectable to force all callers to use RetryHelper.
-    @Inject
-    Factory(
-        NotesMigration migration,
-        ReviewDbBatchUpdate.AssistedFactory reviewDbBatchUpdateFactory,
-        NoteDbBatchUpdate.AssistedFactory noteDbBatchUpdateFactory) {
-      this.migration = migration;
-      this.reviewDbBatchUpdateFactory = reviewDbBatchUpdateFactory;
-      this.noteDbBatchUpdateFactory = noteDbBatchUpdateFactory;
-    }
-
-    public BatchUpdate create(
-        ReviewDb db, Project.NameKey project, CurrentUser user, Timestamp when) {
-      if (migration.disableChangeReviewDb()) {
-        return noteDbBatchUpdateFactory.create(db, project, user, when);
-      }
-      return reviewDbBatchUpdateFactory.create(db, project, user, when);
-    }
-
-    @SuppressWarnings({"rawtypes", "unchecked"})
-    public void execute(
-        Collection<BatchUpdate> updates,
-        BatchUpdateListener listener,
-        @Nullable RequestId requestId,
-        boolean dryRun)
-        throws UpdateException, RestApiException {
-      checkNotNull(listener);
-      checkDifferentProject(updates);
-      // It's safe to downcast all members of the input collection in this case, because the only
-      // way a caller could have gotten any BatchUpdates in the first place is to call the create
-      // method above, which always returns instances of the type we expect. Just to be safe,
-      // copy them into an ImmutableList so there is no chance the callee can pollute the input
-      // collection.
-      if (migration.disableChangeReviewDb()) {
-        ImmutableList<NoteDbBatchUpdate> noteDbUpdates =
-            (ImmutableList) ImmutableList.copyOf(updates);
-        NoteDbBatchUpdate.execute(noteDbUpdates, listener, requestId, dryRun);
-      } else {
-        ImmutableList<ReviewDbBatchUpdate> reviewDbUpdates =
-            (ImmutableList) ImmutableList.copyOf(updates);
-        ReviewDbBatchUpdate.execute(reviewDbUpdates, listener, requestId, dryRun);
-      }
-    }
-
-    private static void checkDifferentProject(Collection<BatchUpdate> updates) {
-      Multiset<Project.NameKey> projectCounts =
-          updates.stream().map(u -> u.project).collect(toImmutableMultiset());
-      checkArgument(
-          projectCounts.entrySet().size() == updates.size(),
-          "updates must all be for different projects, got: %s",
-          projectCounts);
-    }
-  }
-
-  static void setRequestIds(
-      Collection<? extends BatchUpdate> updates, @Nullable RequestId requestId) {
-    if (requestId != null) {
-      for (BatchUpdate u : updates) {
-        checkArgument(
-            u.requestId == null || u.requestId == requestId,
-            "refusing to overwrite RequestId %s in update with %s",
-            u.requestId,
-            requestId);
-        u.setRequestId(requestId);
-      }
-    }
-  }
-
-  static Order getOrder(Collection<? extends BatchUpdate> updates, BatchUpdateListener listener) {
-    Order o = null;
-    for (BatchUpdate u : updates) {
-      if (o == null) {
-        o = u.order;
-      } else if (u.order != o) {
-        throw new IllegalArgumentException("cannot mix execution orders");
-      }
-    }
-    if (o != Order.REPO_BEFORE_DB) {
-      checkArgument(
-          listener == BatchUpdateListener.NONE,
-          "BatchUpdateListener not supported for order %s",
-          o);
-    }
-    return o;
-  }
-
-  static boolean getUpdateChangesInParallel(Collection<? extends BatchUpdate> updates) {
-    checkArgument(!updates.isEmpty());
-    Boolean p = null;
-    for (BatchUpdate u : updates) {
-      if (p == null) {
-        p = u.updateChangesInParallel;
-      } else if (u.updateChangesInParallel != p) {
-        throw new IllegalArgumentException("cannot mix parallel and non-parallel operations");
-      }
-    }
-    // Properly implementing this would involve hoisting the parallel loop up
-    // even further. As of this writing, the only user is ReceiveCommits,
-    // which only executes a single BatchUpdate at a time. So bail for now.
-    checkArgument(
-        !p || updates.size() <= 1,
-        "cannot execute ChangeOps in parallel with more than 1 BatchUpdate");
-    return p;
-  }
-
-  static void wrapAndThrowException(Exception e) throws UpdateException, RestApiException {
-    Throwables.throwIfUnchecked(e);
-
-    // Propagate REST API exceptions thrown by operations; they commonly throw exceptions like
-    // ResourceConflictException to indicate an atomic update failure.
-    Throwables.throwIfInstanceOf(e, UpdateException.class);
-    Throwables.throwIfInstanceOf(e, RestApiException.class);
-
-    // Convert other common non-REST exception types with user-visible messages to corresponding
-    // REST exception types
-    if (e instanceof InvalidChangeOperationException) {
-      throw new ResourceConflictException(e.getMessage(), e);
-    } else if (e instanceof NoSuchChangeException
-        || e instanceof NoSuchRefException
-        || e instanceof NoSuchProjectException) {
-      throw new ResourceNotFoundException(e.getMessage(), e);
-    }
-
-    // Otherwise, wrap in a generic UpdateException, which does not include a user-visible message.
-    throw new UpdateException(e);
-  }
-
-  protected GitRepositoryManager repoManager;
-
-  protected final Project.NameKey project;
-  protected final CurrentUser user;
-  protected final Timestamp when;
-  protected final TimeZone tz;
-
-  protected final ListMultimap<Change.Id, BatchUpdateOp> ops =
-      MultimapBuilder.linkedHashKeys().arrayListValues().build();
-  protected final Map<Change.Id, Change> newChanges = new HashMap<>();
-  protected final List<RepoOnlyOp> repoOnlyOps = new ArrayList<>();
-
-  protected RepoView repoView;
-  protected BatchRefUpdate batchRefUpdate;
-  protected Order order;
-  protected OnSubmitValidators onSubmitValidators;
-  protected RequestId requestId;
-  protected PushCertificate pushCert;
-  protected String refLogMessage;
-
-  private boolean updateChangesInParallel;
-
-  protected BatchUpdate(
-      GitRepositoryManager repoManager,
-      PersonIdent serverIdent,
-      Project.NameKey project,
-      CurrentUser user,
-      Timestamp when) {
-    this.repoManager = repoManager;
-    this.project = project;
-    this.user = user;
-    this.when = when;
-    tz = serverIdent.getTimeZone();
-    order = Order.REPO_BEFORE_DB;
-  }
-
-  @Override
-  public void close() {
-    if (repoView != null) {
-      repoView.close();
-    }
-  }
-
-  public abstract void execute(BatchUpdateListener listener)
-      throws UpdateException, RestApiException;
-
-  public void execute() throws UpdateException, RestApiException {
-    execute(BatchUpdateListener.NONE);
-  }
-
-  protected abstract Context newContext();
-
-  public BatchUpdate setRequestId(RequestId requestId) {
-    this.requestId = requestId;
-    return this;
-  }
-
-  public BatchUpdate setRepository(Repository repo, RevWalk revWalk, ObjectInserter inserter) {
-    checkState(this.repoView == null, "repo already set");
-    repoView = new RepoView(repo, revWalk, inserter);
-    return this;
-  }
-
-  public BatchUpdate setPushCertificate(@Nullable PushCertificate pushCert) {
-    this.pushCert = pushCert;
-    return this;
-  }
-
-  public BatchUpdate setRefLogMessage(@Nullable String refLogMessage) {
-    this.refLogMessage = refLogMessage;
-    return this;
-  }
-
-  public BatchUpdate setOrder(Order order) {
-    this.order = order;
-    return this;
-  }
-
-  /**
-   * Add a validation step for intended ref operations, which will be performed at the end of {@link
-   * RepoOnlyOp#updateRepo(RepoContext)} step.
-   */
-  public BatchUpdate setOnSubmitValidators(OnSubmitValidators onSubmitValidators) {
-    this.onSubmitValidators = onSubmitValidators;
-    return this;
-  }
-
-  /**
-   * Execute {@link BatchUpdateOp#updateChange(ChangeContext)} in parallel for each change.
-   *
-   * <p>This improves performance of writing to multiple changes in separate ReviewDb transactions.
-   * When only NoteDb is used, updates to all changes are written in a single batch ref update, so
-   * parallelization is not used and this option is ignored.
-   */
-  public BatchUpdate updateChangesInParallel() {
-    this.updateChangesInParallel = true;
-    return this;
-  }
-
-  protected void initRepository() throws IOException {
-    if (repoView == null) {
-      repoView = new RepoView(repoManager, project);
-    }
-  }
-
-  protected RepoView getRepoView() throws IOException {
-    initRepository();
-    return repoView;
-  }
-
-  protected CurrentUser getUser() {
-    return user;
-  }
-
-  protected Optional<Account> getAccount() {
-    return user.isIdentifiedUser()
-        ? Optional.of(user.asIdentifiedUser().getAccount())
-        : Optional.empty();
-  }
-
-  protected RevWalk getRevWalk() throws IOException {
-    initRepository();
-    return repoView.getRevWalk();
-  }
-
-  public Map<String, ReceiveCommand> getRefUpdates() {
-    return repoView != null ? repoView.getCommands().getCommands() : ImmutableMap.of();
-  }
-
-  public BatchUpdate addOp(Change.Id id, BatchUpdateOp op) {
-    checkArgument(!(op instanceof InsertChangeOp), "use insertChange");
-    checkNotNull(op);
-    ops.put(id, op);
-    return this;
-  }
-
-  public BatchUpdate addRepoOnlyOp(RepoOnlyOp op) {
-    checkArgument(!(op instanceof BatchUpdateOp), "use addOp()");
-    repoOnlyOps.add(op);
-    return this;
-  }
-
-  public BatchUpdate insertChange(InsertChangeOp op) throws IOException {
-    Context ctx = newContext();
-    Change c = op.createChange(ctx);
-    checkArgument(
-        !newChanges.containsKey(c.getId()), "only one op allowed to create change %s", c.getId());
-    newChanges.put(c.getId(), c);
-    ops.get(c.getId()).add(0, op);
-    return this;
-  }
-
-  protected void logDebug(String msg, Throwable t) {
-    if (requestId != null && log.isDebugEnabled()) {
-      log.debug(requestId + msg, t);
-    }
-  }
-
-  protected void logDebug(String msg, Object... args) {
-    // Only log if there is a requestId assigned, since those are the
-    // expensive/complicated requests like MergeOp. Doing it every time would be
-    // noisy.
-    if (requestId != null && log.isDebugEnabled()) {
-      log.debug(requestId + msg, args);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/update/BatchUpdateReviewDb.java b/gerrit-server/src/main/java/com/google/gerrit/server/update/BatchUpdateReviewDb.java
deleted file mode 100644
index 21e1f92..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/update/BatchUpdateReviewDb.java
+++ /dev/null
@@ -1,99 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.update;
-
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.server.ChangeAccess;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.reviewdb.server.ReviewDbWrapper;
-import com.google.gwtorm.server.AtomicUpdate;
-
-public class BatchUpdateReviewDb extends ReviewDbWrapper {
-  private final ChangeAccess changesWrapper;
-
-  BatchUpdateReviewDb(ReviewDb delegate) {
-    super(delegate);
-    changesWrapper = new BatchUpdateChanges(delegate.changes());
-  }
-
-  public ReviewDb unsafeGetDelegate() {
-    return delegate;
-  }
-
-  @Override
-  public ChangeAccess changes() {
-    return changesWrapper;
-  }
-
-  @Override
-  public void commit() {
-    throw new UnsupportedOperationException(
-        "do not call commit; BatchUpdate always manages transactions");
-  }
-
-  @Override
-  public void rollback() {
-    throw new UnsupportedOperationException(
-        "do not call rollback; BatchUpdate always manages transactions");
-  }
-
-  private static class BatchUpdateChanges extends ChangeAccessWrapper {
-    private BatchUpdateChanges(ChangeAccess delegate) {
-      super(delegate);
-    }
-
-    @Override
-    public void insert(Iterable<Change> instances) {
-      throw new UnsupportedOperationException(
-          "do not call insert; change is automatically inserted");
-    }
-
-    @Override
-    public void upsert(Iterable<Change> instances) {
-      throw new UnsupportedOperationException(
-          "do not call upsert; existing changes are updated automatically,"
-              + " or use InsertChangeOp for insertion");
-    }
-
-    @Override
-    public void update(Iterable<Change> instances) {
-      throw new UnsupportedOperationException(
-          "do not call update; change is updated automatically");
-    }
-
-    @Override
-    public void beginTransaction(Change.Id key) {
-      throw new UnsupportedOperationException("updateChange is always called within a transaction");
-    }
-
-    @Override
-    public void deleteKeys(Iterable<Change.Id> keys) {
-      throw new UnsupportedOperationException(
-          "do not call deleteKeys; use ChangeContext#deleteChange()");
-    }
-
-    @Override
-    public void delete(Iterable<Change> instances) {
-      throw new UnsupportedOperationException(
-          "do not call delete; use ChangeContext#deleteChange()");
-    }
-
-    @Override
-    public Change atomicUpdate(Change.Id key, AtomicUpdate<Change> update) {
-      throw new UnsupportedOperationException(
-          "do not call atomicUpdate; updateChange is always called within a transaction");
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/update/ChainedReceiveCommands.java b/gerrit-server/src/main/java/com/google/gerrit/server/update/ChainedReceiveCommands.java
deleted file mode 100644
index f5f8b1d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/update/ChainedReceiveCommands.java
+++ /dev/null
@@ -1,125 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.update;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.gerrit.server.git.RefCache;
-import com.google.gerrit.server.git.RepoRefCache;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Optional;
-import org.eclipse.jgit.lib.BatchRefUpdate;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.transport.ReceiveCommand;
-
-/**
- * Collection of {@link ReceiveCommand}s that supports multiple updates per ref.
- *
- * <p>The underlying behavior of {@link BatchRefUpdate} is undefined (an implementations vary) when
- * more than one command per ref is added. This class works around that limitation by allowing
- * multiple updates per ref, as long as the previous new SHA-1 matches the next old SHA-1.
- */
-public class ChainedReceiveCommands implements RefCache {
-  private final Map<String, ReceiveCommand> commands = new LinkedHashMap<>();
-  private final RepoRefCache refCache;
-
-  public ChainedReceiveCommands(Repository repo) {
-    this(new RepoRefCache(repo));
-  }
-
-  public ChainedReceiveCommands(RepoRefCache refCache) {
-    this.refCache = checkNotNull(refCache);
-  }
-
-  public RepoRefCache getRepoRefCache() {
-    return refCache;
-  }
-
-  public boolean isEmpty() {
-    return commands.isEmpty();
-  }
-
-  /**
-   * Add a command.
-   *
-   * @param cmd command to add. If a command has been previously added for the same ref, the new
-   *     SHA-1 of the most recent previous command must match the old SHA-1 of this command.
-   */
-  public void add(ReceiveCommand cmd) {
-    checkArgument(!cmd.getOldId().equals(cmd.getNewId()), "ref update is a no-op: %s", cmd);
-    ReceiveCommand old = commands.get(cmd.getRefName());
-    if (old == null) {
-      commands.put(cmd.getRefName(), cmd);
-      return;
-    }
-    checkArgument(
-        old.getResult() == ReceiveCommand.Result.NOT_ATTEMPTED,
-        "cannot chain ref update %s after update %s with result %s",
-        cmd,
-        old,
-        old.getResult());
-    checkArgument(
-        cmd.getOldId().equals(old.getNewId()),
-        "cannot chain ref update %s after update %s with different new ID",
-        cmd,
-        old);
-    commands.put(
-        cmd.getRefName(), new ReceiveCommand(old.getOldId(), cmd.getNewId(), cmd.getRefName()));
-  }
-
-  /**
-   * Get the latest value of a ref according to this sequence of commands.
-   *
-   * <p>After the value for a ref is read from the repo once, it is cached as in {@link
-   * RepoRefCache}.
-   *
-   * @see RefCache#get(String)
-   */
-  @Override
-  public Optional<ObjectId> get(String refName) throws IOException {
-    ReceiveCommand cmd = commands.get(refName);
-    if (cmd != null) {
-      return !cmd.getNewId().equals(ObjectId.zeroId())
-          ? Optional.of(cmd.getNewId())
-          : Optional.empty();
-    }
-    return refCache.get(refName);
-  }
-
-  /**
-   * Add commands from this instance to a native JGit batch update.
-   *
-   * <p>Exactly one command per ref will be added to the update. The old SHA-1 will be the old SHA-1
-   * of the first command added to this instance for that ref; the new SHA-1 will be the new SHA-1
-   * of the last command.
-   *
-   * @param bru batch update
-   */
-  public void addTo(BatchRefUpdate bru) {
-    for (ReceiveCommand cmd : commands.values()) {
-      bru.addCommand(cmd);
-    }
-  }
-
-  /** @return an unmodifiable view of commands. */
-  public Map<String, ReceiveCommand> getCommands() {
-    return Collections.unmodifiableMap(commands);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/update/ChangeContext.java b/gerrit-server/src/main/java/com/google/gerrit/server/update/ChangeContext.java
deleted file mode 100644
index f017580..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/update/ChangeContext.java
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.update;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.ChangeUpdate;
-
-/**
- * Context for performing the {@link BatchUpdateOp#updateChange} phase.
- *
- * <p>A single {@code ChangeContext} corresponds to updating a single change; if a {@link
- * BatchUpdate} spans multiple changes, then multiple {@code ChangeContext} instances will be
- * created.
- */
-public interface ChangeContext extends Context {
-  /**
-   * Get an update for this change at a given patch set.
-   *
-   * <p>A single operation can modify changes at different patch sets. Commits in the NoteDb graph
-   * within this update are created in patch set order.
-   *
-   * <p>To get the current patch set ID, use {@link com.google.gerrit.server.PatchSetUtil#current}.
-   *
-   * @param psId patch set ID.
-   * @return handle for change updates.
-   */
-  ChangeUpdate getUpdate(PatchSet.Id psId);
-
-  /**
-   * Get the up-to-date notes for this change.
-   *
-   * <p>The change data is read within the same transaction that {@link
-   * BatchUpdateOp#updateChange(ChangeContext)} is executing.
-   *
-   * @return notes for this change.
-   */
-  ChangeNotes getNotes();
-
-  /**
-   * Don't bump the value of {@link Change#getLastUpdatedOn()}.
-   *
-   * <p>If called, don't bump the timestamp before storing to ReviewDb. Only has an effect in
-   * ReviewDb, and the only usage should be to match the behavior of NoteDb. Specifically, in NoteDb
-   * the timestamp is updated if and only if the change meta graph is updated, and is not updated
-   * when only drafts are modified.
-   */
-  void dontBumpLastUpdatedOn();
-
-  /**
-   * Instruct {@link BatchUpdate} to delete this change.
-   *
-   * <p>If called, all other updates are ignored.
-   */
-  void deleteChange();
-
-  /** @return change corresponding to {@link #getNotes()}. */
-  default Change getChange() {
-    return checkNotNull(getNotes().getChange());
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/update/ChangeUpdateExecutor.java b/gerrit-server/src/main/java/com/google/gerrit/server/update/ChangeUpdateExecutor.java
deleted file mode 100644
index 1d957cf..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/update/ChangeUpdateExecutor.java
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.update;
-
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-import com.google.common.util.concurrent.ListeningExecutorService;
-import com.google.inject.BindingAnnotation;
-import java.lang.annotation.Retention;
-
-/**
- * Marker on the global {@link ListeningExecutorService} used by asynchronous {@link BatchUpdate}s.
- */
-@Retention(RUNTIME)
-@BindingAnnotation
-public @interface ChangeUpdateExecutor {}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/update/Context.java b/gerrit-server/src/main/java/com/google/gerrit/server/update/Context.java
deleted file mode 100644
index f33536d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/update/Context.java
+++ /dev/null
@@ -1,140 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.update;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.TimeZone;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-/**
- * Context for performing a {@link BatchUpdate}.
- *
- * <p>A single update may span multiple changes, but they all belong to a single repo.
- */
-public interface Context {
-  /**
-   * Get the project name this update operates on.
-   *
-   * @return project.
-   */
-  Project.NameKey getProject();
-
-  /**
-   * Get a read-only view of the open repository for this project.
-   *
-   * <p>Will be opened lazily if necessary.
-   *
-   * @return repository instance.
-   * @throws IOException if an error occurred opening the repo.
-   */
-  RepoView getRepoView() throws IOException;
-
-  /**
-   * Get a walk for this project.
-   *
-   * <p>The repository will be opened lazily if necessary; callers should not close the walk.
-   *
-   * @return walk.
-   * @throws IOException if an error occurred opening the repo.
-   */
-  RevWalk getRevWalk() throws IOException;
-
-  /**
-   * Get the timestamp at which this update takes place.
-   *
-   * @return timestamp.
-   */
-  Timestamp getWhen();
-
-  /**
-   * Get the time zone in which this update takes place.
-   *
-   * <p>In the current implementation, this is always the time zone of the server.
-   *
-   * @return time zone.
-   */
-  TimeZone getTimeZone();
-
-  /**
-   * Get the ReviewDb database.
-   *
-   * <p>Callers should not manage transactions or call mutating methods on the Changes table.
-   * Mutations on other tables (including other entities in the change entity group) are fine.
-   *
-   * @return open database instance.
-   */
-  ReviewDb getDb();
-
-  /**
-   * Get the user performing the update.
-   *
-   * <p>In the current implementation, this is always an {@link IdentifiedUser} or {@link
-   * com.google.gerrit.server.InternalUser}.
-   *
-   * @return user.
-   */
-  CurrentUser getUser();
-
-  /**
-   * Get the order in which operations are executed in this update.
-   *
-   * @return order of operations.
-   */
-  Order getOrder();
-
-  /**
-   * Get the identified user performing the update.
-   *
-   * <p>Convenience method for {@code getUser().asIdentifiedUser()}.
-   *
-   * @see CurrentUser#asIdentifiedUser()
-   * @return user.
-   */
-  default IdentifiedUser getIdentifiedUser() {
-    return checkNotNull(getUser()).asIdentifiedUser();
-  }
-
-  /**
-   * Get the account of the user performing the update.
-   *
-   * <p>Convenience method for {@code getIdentifiedUser().getAccount()}.
-   *
-   * @see CurrentUser#asIdentifiedUser()
-   * @return account.
-   */
-  default Account getAccount() {
-    return getIdentifiedUser().getAccount();
-  }
-
-  /**
-   * Get the account ID of the user performing the update.
-   *
-   * <p>Convenience method for {@code getUser().getAccountId()}
-   *
-   * @see CurrentUser#getAccountId()
-   * @return account ID.
-   */
-  default Account.Id getAccountId() {
-    return getIdentifiedUser().getAccountId();
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/update/NoteDbBatchUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/update/NoteDbBatchUpdate.java
deleted file mode 100644
index a5fee41..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/update/NoteDbBatchUpdate.java
+++ /dev/null
@@ -1,456 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.update;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static java.util.Comparator.comparing;
-
-import com.google.common.base.Throwables;
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.index.change.ChangeIndexer;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.ChangeUpdate;
-import com.google.gerrit.server.notedb.NoteDbUpdateManager;
-import com.google.gerrit.server.util.RequestId;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.TimeZone;
-import java.util.TreeMap;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.ReceiveCommand;
-
-/**
- * {@link BatchUpdate} implementation using only NoteDb that updates code refs and meta refs in a
- * single {@link org.eclipse.jgit.lib.BatchRefUpdate}.
- *
- * <p>Used when {@code noteDb.changes.disableReviewDb=true}, at which point ReviewDb is not
- * consulted during updates.
- */
-class NoteDbBatchUpdate extends BatchUpdate {
-  interface AssistedFactory {
-    NoteDbBatchUpdate create(
-        ReviewDb db, Project.NameKey project, CurrentUser user, Timestamp when);
-  }
-
-  static void execute(
-      ImmutableList<NoteDbBatchUpdate> updates,
-      BatchUpdateListener listener,
-      @Nullable RequestId requestId,
-      boolean dryrun)
-      throws UpdateException, RestApiException {
-    if (updates.isEmpty()) {
-      return;
-    }
-    setRequestIds(updates, requestId);
-
-    try {
-      @SuppressWarnings("deprecation")
-      List<com.google.common.util.concurrent.CheckedFuture<?, IOException>> indexFutures =
-          new ArrayList<>();
-      List<ChangesHandle> handles = new ArrayList<>(updates.size());
-      Order order = getOrder(updates, listener);
-      try {
-        switch (order) {
-          case REPO_BEFORE_DB:
-            for (NoteDbBatchUpdate u : updates) {
-              u.executeUpdateRepo();
-            }
-            listener.afterUpdateRepos();
-            for (NoteDbBatchUpdate u : updates) {
-              handles.add(u.executeChangeOps(dryrun));
-            }
-            for (ChangesHandle h : handles) {
-              h.execute();
-              indexFutures.addAll(h.startIndexFutures());
-            }
-            listener.afterUpdateRefs();
-            listener.afterUpdateChanges();
-            break;
-
-          case DB_BEFORE_REPO:
-            // Call updateChange for each op before updateRepo, but defer executing the
-            // NoteDbUpdateManager until after calling updateRepo. They share an inserter and
-            // BatchRefUpdate, so it will all execute as a single batch. But we have to let
-            // NoteDbUpdateManager actually execute the update, since it has to interleave it
-            // properly with All-Users updates.
-            //
-            // TODO(dborowitz): This may still result in multiple updates to All-Users, but that's
-            // currently not a big deal because multi-change batches generally aren't affecting
-            // drafts anyway.
-            for (NoteDbBatchUpdate u : updates) {
-              handles.add(u.executeChangeOps(dryrun));
-            }
-            for (NoteDbBatchUpdate u : updates) {
-              u.executeUpdateRepo();
-            }
-            for (ChangesHandle h : handles) {
-              // TODO(dborowitz): This isn't quite good enough: in theory updateRepo may want to
-              // see the results of change meta commands, but they aren't actually added to the
-              // BatchUpdate until the body of execute. To fix this, execute needs to be split up
-              // into a method that returns a BatchRefUpdate before execution. Not a big deal at the
-              // moment, because this order is only used for deleting changes, and those updateRepo
-              // implementations definitely don't need to observe the updated change meta refs.
-              h.execute();
-              indexFutures.addAll(h.startIndexFutures());
-            }
-            break;
-          default:
-            throw new IllegalStateException("invalid execution order: " + order);
-        }
-      } finally {
-        for (ChangesHandle h : handles) {
-          h.close();
-        }
-      }
-
-      ChangeIndexer.allAsList(indexFutures).get();
-
-      // Fire ref update events only after all mutations are finished, since callers may assume a
-      // patch set ref being created means the change was created, or a branch advancing meaning
-      // some changes were closed.
-      updates.stream()
-          .filter(u -> u.batchRefUpdate != null)
-          .forEach(
-              u -> u.gitRefUpdated.fire(u.project, u.batchRefUpdate, u.getAccount().orElse(null)));
-
-      if (!dryrun) {
-        for (NoteDbBatchUpdate u : updates) {
-          u.executePostOps();
-        }
-      }
-    } catch (Exception e) {
-      wrapAndThrowException(e);
-    }
-  }
-
-  class ContextImpl implements Context {
-    @Override
-    public RepoView getRepoView() throws IOException {
-      return NoteDbBatchUpdate.this.getRepoView();
-    }
-
-    @Override
-    public RevWalk getRevWalk() throws IOException {
-      return getRepoView().getRevWalk();
-    }
-
-    @Override
-    public Project.NameKey getProject() {
-      return project;
-    }
-
-    @Override
-    public Timestamp getWhen() {
-      return when;
-    }
-
-    @Override
-    public TimeZone getTimeZone() {
-      return tz;
-    }
-
-    @Override
-    public ReviewDb getDb() {
-      return db;
-    }
-
-    @Override
-    public CurrentUser getUser() {
-      return user;
-    }
-
-    @Override
-    public Order getOrder() {
-      return order;
-    }
-  }
-
-  private class RepoContextImpl extends ContextImpl implements RepoContext {
-    @Override
-    public ObjectInserter getInserter() throws IOException {
-      return getRepoView().getInserterWrapper();
-    }
-
-    @Override
-    public void addRefUpdate(ReceiveCommand cmd) throws IOException {
-      getRepoView().getCommands().add(cmd);
-    }
-  }
-
-  private class ChangeContextImpl extends ContextImpl implements ChangeContext {
-    private final ChangeNotes notes;
-    private final Map<PatchSet.Id, ChangeUpdate> updates;
-
-    private boolean deleted;
-
-    protected ChangeContextImpl(ChangeNotes notes) {
-      this.notes = checkNotNull(notes);
-      updates = new TreeMap<>(comparing(PatchSet.Id::get));
-    }
-
-    @Override
-    public ChangeUpdate getUpdate(PatchSet.Id psId) {
-      ChangeUpdate u = updates.get(psId);
-      if (u == null) {
-        u = changeUpdateFactory.create(notes, user, when);
-        if (newChanges.containsKey(notes.getChangeId())) {
-          u.setAllowWriteToNewRef(true);
-        }
-        u.setPatchSetId(psId);
-        updates.put(psId, u);
-      }
-      return u;
-    }
-
-    @Override
-    public ChangeNotes getNotes() {
-      return notes;
-    }
-
-    @Override
-    public void dontBumpLastUpdatedOn() {
-      // Do nothing; NoteDb effectively updates timestamp if and only if a commit was written to the
-      // change meta ref.
-    }
-
-    @Override
-    public void deleteChange() {
-      deleted = true;
-    }
-  }
-
-  /** Per-change result status from {@link #executeChangeOps}. */
-  private enum ChangeResult {
-    SKIPPED,
-    UPSERTED,
-    DELETED;
-  }
-
-  private final ChangeNotes.Factory changeNotesFactory;
-  private final ChangeUpdate.Factory changeUpdateFactory;
-  private final NoteDbUpdateManager.Factory updateManagerFactory;
-  private final ChangeIndexer indexer;
-  private final GitReferenceUpdated gitRefUpdated;
-  private final ReviewDb db;
-
-  @Inject
-  NoteDbBatchUpdate(
-      GitRepositoryManager repoManager,
-      @GerritPersonIdent PersonIdent serverIdent,
-      ChangeNotes.Factory changeNotesFactory,
-      ChangeUpdate.Factory changeUpdateFactory,
-      NoteDbUpdateManager.Factory updateManagerFactory,
-      ChangeIndexer indexer,
-      GitReferenceUpdated gitRefUpdated,
-      @Assisted ReviewDb db,
-      @Assisted Project.NameKey project,
-      @Assisted CurrentUser user,
-      @Assisted Timestamp when) {
-    super(repoManager, serverIdent, project, user, when);
-    this.changeNotesFactory = changeNotesFactory;
-    this.changeUpdateFactory = changeUpdateFactory;
-    this.updateManagerFactory = updateManagerFactory;
-    this.indexer = indexer;
-    this.gitRefUpdated = gitRefUpdated;
-    this.db = db;
-  }
-
-  @Override
-  public void execute(BatchUpdateListener listener) throws UpdateException, RestApiException {
-    execute(ImmutableList.of(this), listener, requestId, false);
-  }
-
-  @Override
-  protected Context newContext() {
-    return new ContextImpl();
-  }
-
-  private void executeUpdateRepo() throws UpdateException, RestApiException {
-    try {
-      logDebug("Executing updateRepo on {} ops", ops.size());
-      RepoContextImpl ctx = new RepoContextImpl();
-      for (BatchUpdateOp op : ops.values()) {
-        op.updateRepo(ctx);
-      }
-
-      logDebug("Executing updateRepo on {} RepoOnlyOps", repoOnlyOps.size());
-      for (RepoOnlyOp op : repoOnlyOps) {
-        op.updateRepo(ctx);
-      }
-
-      if (onSubmitValidators != null && !getRefUpdates().isEmpty()) {
-        // Validation of refs has to take place here and not at the beginning of executeRefUpdates.
-        // Otherwise, failing validation in a second BatchUpdate object will happen *after* the
-        // first update's executeRefUpdates has finished, hence after first repo's refs have been
-        // updated, which is too late.
-        onSubmitValidators.validate(
-            project, ctx.getRevWalk().getObjectReader(), repoView.getCommands());
-      }
-    } catch (Exception e) {
-      Throwables.throwIfInstanceOf(e, RestApiException.class);
-      throw new UpdateException(e);
-    }
-  }
-
-  private class ChangesHandle implements AutoCloseable {
-    private final NoteDbUpdateManager manager;
-    private final boolean dryrun;
-    private final Map<Change.Id, ChangeResult> results;
-
-    ChangesHandle(NoteDbUpdateManager manager, boolean dryrun) {
-      this.manager = manager;
-      this.dryrun = dryrun;
-      results = new HashMap<>();
-    }
-
-    @Override
-    public void close() {
-      manager.close();
-    }
-
-    void setResult(Change.Id id, ChangeResult result) {
-      ChangeResult old = results.putIfAbsent(id, result);
-      checkArgument(old == null, "result for change %s already set: %s", id, old);
-    }
-
-    void execute() throws OrmException, IOException {
-      NoteDbBatchUpdate.this.batchRefUpdate = manager.execute(dryrun);
-    }
-
-    @SuppressWarnings("deprecation")
-    List<com.google.common.util.concurrent.CheckedFuture<?, IOException>> startIndexFutures() {
-      if (dryrun) {
-        return ImmutableList.of();
-      }
-      logDebug("Reindexing {} changes", results.size());
-      List<com.google.common.util.concurrent.CheckedFuture<?, IOException>> indexFutures =
-          new ArrayList<>(results.size());
-      for (Map.Entry<Change.Id, ChangeResult> e : results.entrySet()) {
-        Change.Id id = e.getKey();
-        switch (e.getValue()) {
-          case UPSERTED:
-            indexFutures.add(indexer.indexAsync(project, id));
-            break;
-          case DELETED:
-            indexFutures.add(indexer.deleteAsync(id));
-            break;
-          case SKIPPED:
-            break;
-          default:
-            throw new IllegalStateException("unexpected result: " + e.getValue());
-        }
-      }
-      return indexFutures;
-    }
-  }
-
-  private ChangesHandle executeChangeOps(boolean dryrun) throws Exception {
-    logDebug("Executing change ops");
-    initRepository();
-    Repository repo = repoView.getRepository();
-    checkState(
-        repo.getRefDatabase().performsAtomicTransactions(),
-        "cannot use NoteDb with a repository that does not support atomic batch ref updates: %s",
-        repo);
-
-    ChangesHandle handle =
-        new ChangesHandle(
-            updateManagerFactory
-                .create(project)
-                .setChangeRepo(
-                    repo, repoView.getRevWalk(), repoView.getInserter(), repoView.getCommands()),
-            dryrun);
-    if (user.isIdentifiedUser()) {
-      handle.manager.setRefLogIdent(user.asIdentifiedUser().newRefLogIdent(when, tz));
-    }
-    handle.manager.setRefLogMessage(refLogMessage);
-    handle.manager.setPushCertificate(pushCert);
-    for (Map.Entry<Change.Id, Collection<BatchUpdateOp>> e : ops.asMap().entrySet()) {
-      Change.Id id = e.getKey();
-      ChangeContextImpl ctx = newChangeContext(id);
-      boolean dirty = false;
-      logDebug("Applying {} ops for change {}", e.getValue().size(), id);
-      for (BatchUpdateOp op : e.getValue()) {
-        dirty |= op.updateChange(ctx);
-      }
-      if (!dirty) {
-        logDebug("No ops reported dirty, short-circuiting");
-        handle.setResult(id, ChangeResult.SKIPPED);
-        continue;
-      }
-      for (ChangeUpdate u : ctx.updates.values()) {
-        handle.manager.add(u);
-      }
-      if (ctx.deleted) {
-        logDebug("Change {} was deleted", id);
-        handle.manager.deleteChange(id);
-        handle.setResult(id, ChangeResult.DELETED);
-      } else {
-        handle.setResult(id, ChangeResult.UPSERTED);
-      }
-    }
-    return handle;
-  }
-
-  private ChangeContextImpl newChangeContext(Change.Id id) throws OrmException {
-    logDebug("Opening change {} for update", id);
-    Change c = newChanges.get(id);
-    boolean isNew = c != null;
-    if (!isNew) {
-      // Pass a synthetic change into ChangeNotes.Factory, which will take care of checking for
-      // existence and populating columns from the parsed notes state.
-      // TODO(dborowitz): This dance made more sense when using Reviewdb; consider a nicer way.
-      c = ChangeNotes.Factory.newNoteDbOnlyChange(project, id);
-    } else {
-      logDebug("Change {} is new", id);
-    }
-    ChangeNotes notes = changeNotesFactory.createForBatchUpdate(c, !isNew);
-    return new ChangeContextImpl(notes);
-  }
-
-  private void executePostOps() throws Exception {
-    ContextImpl ctx = new ContextImpl();
-    for (BatchUpdateOp op : ops.values()) {
-      op.postUpdate(ctx);
-    }
-
-    for (RepoOnlyOp op : repoOnlyOps) {
-      op.postUpdate(ctx);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/update/RefUpdateUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/update/RefUpdateUtil.java
deleted file mode 100644
index 86b4eef..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/update/RefUpdateUtil.java
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.update;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.gerrit.server.git.LockFailureException;
-import java.io.IOException;
-import org.eclipse.jgit.internal.JGitText;
-import org.eclipse.jgit.lib.BatchRefUpdate;
-import org.eclipse.jgit.lib.NullProgressMonitor;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.ReceiveCommand;
-
-/** Static utilities for working with JGit's ref update APIs. */
-public class RefUpdateUtil {
-  /**
-   * Execute a batch ref update, throwing a checked exception if not all updates succeeded.
-   *
-   * @param bru batch update; should already have been executed.
-   * @throws LockFailureException if the transaction was aborted due to lock failure; see {@link
-   *     #checkResults(BatchRefUpdate)} for details.
-   * @throws IOException if any result was not {@code OK}.
-   */
-  public static void executeChecked(BatchRefUpdate bru, RevWalk rw) throws IOException {
-    bru.execute(rw, NullProgressMonitor.INSTANCE);
-    checkResults(bru);
-  }
-
-  /**
-   * Check results of all commands in the update batch, reducing to a single exception if there was
-   * a failure.
-   *
-   * <p>Throws {@link LockFailureException} if at least one command failed with {@code
-   * LOCK_FAILURE}, and the entire transaction was aborted, i.e. any non-{@code LOCK_FAILURE}
-   * results, if there were any, failed with "transaction aborted".
-   *
-   * <p>In particular, if the underlying ref database does not {@link
-   * org.eclipse.jgit.lib.RefDatabase#performsAtomicTransactions() perform atomic transactions},
-   * then a combination of {@code LOCK_FAILURE} on one ref and {@code OK} or another result on other
-   * refs will <em>not</em> throw {@code LockFailureException}.
-   *
-   * @param bru batch update; should already have been executed.
-   * @throws LockFailureException if the transaction was aborted due to lock failure.
-   * @throws IOException if any result was not {@code OK}.
-   */
-  @VisibleForTesting
-  static void checkResults(BatchRefUpdate bru) throws IOException {
-    int lockFailure = 0;
-    int aborted = 0;
-    int failure = 0;
-
-    for (ReceiveCommand cmd : bru.getCommands()) {
-      if (cmd.getResult() != ReceiveCommand.Result.OK) {
-        failure++;
-      }
-      if (cmd.getResult() == ReceiveCommand.Result.LOCK_FAILURE) {
-        lockFailure++;
-      } else if (cmd.getResult() == ReceiveCommand.Result.REJECTED_OTHER_REASON
-          && JGitText.get().transactionAborted.equals(cmd.getMessage())) {
-        aborted++;
-      }
-    }
-
-    if (lockFailure + aborted == bru.getCommands().size()) {
-      throw new LockFailureException("Update aborted with one or more lock failures: " + bru, bru);
-    } else if (failure > 0) {
-      throw new IOException("Update failed: " + bru);
-    }
-  }
-
-  private RefUpdateUtil() {}
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/update/RepoView.java b/gerrit-server/src/main/java/com/google/gerrit/server/update/RepoView.java
deleted file mode 100644
index 8839dbe..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/update/RepoView.java
+++ /dev/null
@@ -1,234 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.update;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.common.collect.Maps;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Optional;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevWalk;
-
-/**
- * Restricted view of a {@link Repository} for use by {@link BatchUpdateOp} implementations.
- *
- * <p>This class serves two purposes in the context of {@link BatchUpdate}. First, the subset of
- * normal Repository functionality is purely read-only, which prevents implementors from modifying
- * the repository outside of {@link BatchUpdateOp#updateRepo}. Write operations can only be
- * performed by calling methods on {@link RepoContext}.
- *
- * <p>Second, the read methods take into account any pending operations on the repository that
- * implementations have staged using the write methods on {@link RepoContext}. Callers do not have
- * to worry about whether operations have been performed yet, and the implementation details may
- * differ between ReviewDb and NoteDb, but callers just don't need to care.
- */
-public class RepoView {
-  private final Repository repo;
-  private final RevWalk rw;
-  private final ObjectInserter inserter;
-  private final ObjectInserter inserterWrapper;
-  private final ChainedReceiveCommands commands;
-  private final boolean closeRepo;
-
-  RepoView(GitRepositoryManager repoManager, Project.NameKey project) throws IOException {
-    repo = repoManager.openRepository(project);
-    inserter = repo.newObjectInserter();
-    inserterWrapper = new NonFlushingInserter(inserter);
-    rw = new RevWalk(inserter.newReader());
-    commands = new ChainedReceiveCommands(repo);
-    closeRepo = true;
-  }
-
-  RepoView(Repository repo, RevWalk rw, ObjectInserter inserter) {
-    checkArgument(
-        rw.getObjectReader().getCreatedFromInserter() == inserter,
-        "expected RevWalk %s to be created by ObjectInserter %s",
-        rw,
-        inserter);
-    this.repo = checkNotNull(repo);
-    this.rw = checkNotNull(rw);
-    this.inserter = checkNotNull(inserter);
-    inserterWrapper = new NonFlushingInserter(inserter);
-    commands = new ChainedReceiveCommands(repo);
-    closeRepo = false;
-  }
-
-  /**
-   * Get this repo's configuration.
-   *
-   * <p>This is the storage-level config you would get with {@link Repository#getConfig()}, not, for
-   * example, the Gerrit-level project config.
-   *
-   * @return a defensive copy of the config; modifications have no effect on the underlying config.
-   */
-  public Config getConfig() {
-    return new Config(repo.getConfig());
-  }
-
-  /**
-   * Get an open revwalk on the repo.
-   *
-   * <p>Guaranteed to be able to read back any objects inserted in the repository via {@link
-   * RepoContext#getInserter()}, even if objects have not been flushed to the underlying repo. In
-   * particular this includes any object returned by {@link #getRef(String)}, even taking into
-   * account not-yet-executed commands.
-   *
-   * @return revwalk.
-   */
-  public RevWalk getRevWalk() {
-    return rw;
-  }
-
-  /**
-   * Read a single ref from the repo.
-   *
-   * <p>Takes into account any ref update commands added during the course of the update using
-   * {@link RepoContext#addRefUpdate}, even if they have not yet been executed on the underlying
-   * repo.
-   *
-   * <p>The results of individual ref lookups are cached: calling this method multiple times with
-   * the same ref name will return the same result (unless a command was added in the meantime). The
-   * repo is not reread.
-   *
-   * @param name exact ref name.
-   * @return the value of the ref, if present.
-   * @throws IOException if an error occurred.
-   */
-  public Optional<ObjectId> getRef(String name) throws IOException {
-    return getCommands().get(name);
-  }
-
-  /**
-   * Look up refs by prefix.
-   *
-   * <p>Takes into account any ref update commands added during the course of the update using
-   * {@link RepoContext#addRefUpdate}, even if they have not yet been executed on the underlying
-   * repo.
-   *
-   * <p>For any ref that has previously been accessed with {@link #getRef(String)}, the value in the
-   * result map will be that same cached value. Any refs that have <em>not</em> been previously
-   * accessed are re-scanned from the repo on each call.
-   *
-   * @param prefix ref prefix; must end in '/' or else be empty.
-   * @return a map of ref suffixes to SHA-1s. The refs are all under {@code prefix} and have the
-   *     prefix stripped; this matches the behavior of {@link
-   *     org.eclipse.jgit.lib.RefDatabase#getRefs(String)}.
-   * @throws IOException if an error occurred.
-   */
-  public Map<String, ObjectId> getRefs(String prefix) throws IOException {
-    Map<String, ObjectId> result =
-        new HashMap<>(
-            Maps.transformValues(repo.getRefDatabase().getRefs(prefix), Ref::getObjectId));
-
-    // First, overwrite any cached reads from the underlying RepoRefCache. If any of these differ,
-    // it's because a ref was updated after the RepoRefCache read it. It feels a little odd to
-    // prefer the *old* value in this case, but it would be weirder to be inconsistent with getRef.
-    //
-    // Mostly this doesn't matter. If the caller was intending to write to the ref, they lost a
-    // race, and they will get a lock failure. If they just want to read, well, the JGit interface
-    // doesn't currently guarantee that any snapshot of multiple refs is consistent, so they were
-    // probably out of luck anyway.
-    commands
-        .getRepoRefCache()
-        .getCachedRefs()
-        .forEach((k, v) -> updateRefIfPrefixMatches(result, prefix, k, v));
-
-    // Second, overwrite with any pending commands.
-    commands
-        .getCommands()
-        .values()
-        .forEach(
-            c ->
-                updateRefIfPrefixMatches(result, prefix, c.getRefName(), toOptional(c.getNewId())));
-
-    return result;
-  }
-
-  private static Optional<ObjectId> toOptional(ObjectId id) {
-    return id.equals(ObjectId.zeroId()) ? Optional.empty() : Optional.of(id);
-  }
-
-  private static void updateRefIfPrefixMatches(
-      Map<String, ObjectId> map, String prefix, String fullRefName, Optional<ObjectId> maybeId) {
-    if (!fullRefName.startsWith(prefix)) {
-      return;
-    }
-    String suffix = fullRefName.substring(prefix.length());
-    if (maybeId.isPresent()) {
-      map.put(suffix, maybeId.get());
-    } else {
-      map.remove(suffix);
-    }
-  }
-
-  // Not AutoCloseable so callers can't improperly close it. Plus it's never managed with a try
-  // block anyway.
-  void close() {
-    if (closeRepo) {
-      inserter.close();
-      rw.close();
-      repo.close();
-    }
-  }
-
-  Repository getRepository() {
-    return repo;
-  }
-
-  ObjectInserter getInserter() {
-    return inserter;
-  }
-
-  ObjectInserter getInserterWrapper() {
-    return inserterWrapper;
-  }
-
-  ChainedReceiveCommands getCommands() {
-    return commands;
-  }
-
-  private static class NonFlushingInserter extends ObjectInserter.Filter {
-    private final ObjectInserter delegate;
-
-    private NonFlushingInserter(ObjectInserter delegate) {
-      this.delegate = delegate;
-    }
-
-    @Override
-    protected ObjectInserter delegate() {
-      return delegate;
-    }
-
-    @Override
-    public void flush() {
-      // Do nothing.
-    }
-
-    @Override
-    public void close() {
-      // Do nothing; the delegate is closed separately.
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/update/RetryHelper.java b/gerrit-server/src/main/java/com/google/gerrit/server/update/RetryHelper.java
deleted file mode 100644
index 4cbaffd..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/update/RetryHelper.java
+++ /dev/null
@@ -1,214 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.update;
-
-import static com.google.common.base.MoreObjects.firstNonNull;
-import static java.util.concurrent.TimeUnit.MILLISECONDS;
-import static java.util.concurrent.TimeUnit.SECONDS;
-
-import com.github.rholder.retry.Attempt;
-import com.github.rholder.retry.RetryException;
-import com.github.rholder.retry.RetryListener;
-import com.github.rholder.retry.RetryerBuilder;
-import com.github.rholder.retry.StopStrategies;
-import com.github.rholder.retry.WaitStrategies;
-import com.github.rholder.retry.WaitStrategy;
-import com.google.auto.value.AutoValue;
-import com.google.common.base.Throwables;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.metrics.Counter0;
-import com.google.gerrit.metrics.Description;
-import com.google.gerrit.metrics.Histogram0;
-import com.google.gerrit.metrics.MetricMaker;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.git.LockFailureException;
-import com.google.gerrit.server.notedb.NotesMigration;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.time.Duration;
-import java.util.concurrent.ExecutionException;
-import org.eclipse.jgit.lib.Config;
-
-@Singleton
-public class RetryHelper {
-  public interface Action<T> {
-    T call(BatchUpdate.Factory updateFactory) throws Exception;
-  }
-
-  /**
-   * Options for retrying a single operation.
-   *
-   * <p>This class is similar in function to upstream's {@link RetryerBuilder}, but it exists as its
-   * own class in Gerrit for several reasons:
-   *
-   * <ul>
-   *   <li>Gerrit needs to support defaults for some of the options, such as a default timeout.
-   *       {@code RetryerBuilder} doesn't support calling the same setter multiple times, so doing
-   *       this with {@code RetryerBuilder} directly would not be easy.
-   *   <li>Gerrit explicitly does not want callers to have full control over all possible options,
-   *       so this class exposes a curated subset.
-   * </ul>
-   */
-  @AutoValue
-  public abstract static class Options {
-    @Nullable
-    abstract RetryListener listener();
-
-    @Nullable
-    abstract Duration timeout();
-
-    @AutoValue.Builder
-    public abstract static class Builder {
-      public abstract Builder listener(RetryListener listener);
-
-      public abstract Builder timeout(Duration timeout);
-
-      public abstract Options build();
-    }
-  }
-
-  @Singleton
-  private static class Metrics {
-    final Histogram0 attemptCounts;
-    final Counter0 timeoutCount;
-
-    @Inject
-    Metrics(MetricMaker metricMaker) {
-      attemptCounts =
-          metricMaker.newHistogram(
-              "batch_update/retry_attempt_counts",
-              new Description(
-                      "Distribution of number of attempts made by RetryHelper"
-                          + " (1 == single attempt, no retry)")
-                  .setCumulative()
-                  .setUnit("attempts"));
-      timeoutCount =
-          metricMaker.newCounter(
-              "batch_update/retry_timeout_count",
-              new Description("Number of executions of RetryHelper that ultimately timed out")
-                  .setCumulative()
-                  .setUnit("timeouts"));
-    }
-  }
-
-  public static Options.Builder options() {
-    return new AutoValue_RetryHelper_Options.Builder();
-  }
-
-  public static Options defaults() {
-    return options().build();
-  }
-
-  private final NotesMigration migration;
-  private final Metrics metrics;
-  private final BatchUpdate.Factory updateFactory;
-  private final Duration defaultTimeout;
-  private final WaitStrategy waitStrategy;
-
-  @Inject
-  RetryHelper(
-      @GerritServerConfig Config cfg,
-      Metrics metrics,
-      NotesMigration migration,
-      ReviewDbBatchUpdate.AssistedFactory reviewDbBatchUpdateFactory,
-      NoteDbBatchUpdate.AssistedFactory noteDbBatchUpdateFactory) {
-    this.metrics = metrics;
-    this.migration = migration;
-    this.updateFactory =
-        new BatchUpdate.Factory(migration, reviewDbBatchUpdateFactory, noteDbBatchUpdateFactory);
-    this.defaultTimeout =
-        Duration.ofMillis(
-            cfg.getTimeUnit("noteDb", null, "retryTimeout", SECONDS.toMillis(20), MILLISECONDS));
-    this.waitStrategy =
-        WaitStrategies.join(
-            WaitStrategies.exponentialWait(
-                cfg.getTimeUnit("noteDb", null, "retryMaxWait", SECONDS.toMillis(5), MILLISECONDS),
-                MILLISECONDS),
-            WaitStrategies.randomWait(50, MILLISECONDS));
-  }
-
-  public Duration getDefaultTimeout() {
-    return defaultTimeout;
-  }
-
-  public <T> T execute(Action<T> action) throws RestApiException, UpdateException {
-    return execute(action, defaults());
-  }
-
-  public <T> T execute(Action<T> action, Options opts) throws RestApiException, UpdateException {
-    MetricListener listener = null;
-    try {
-      RetryerBuilder<T> builder = RetryerBuilder.newBuilder();
-      if (migration.disableChangeReviewDb()) {
-        listener = new MetricListener(opts.listener());
-        builder
-            .withRetryListener(listener)
-            .withStopStrategy(
-                StopStrategies.stopAfterDelay(
-                    firstNonNull(opts.timeout(), defaultTimeout).toMillis(), MILLISECONDS))
-            .withWaitStrategy(waitStrategy)
-            .retryIfException(RetryHelper::isLockFailure);
-      } else {
-        // Either we aren't full-NoteDb, or the underlying ref storage doesn't support atomic
-        // transactions. Either way, retrying a partially-failed operation is not idempotent, so
-        // don't do it automatically. Let the end user decide whether they want to retry.
-      }
-      return builder.build().call(() -> action.call(updateFactory));
-    } catch (ExecutionException | RetryException e) {
-      if (e instanceof RetryException) {
-        metrics.timeoutCount.increment();
-      }
-      if (e.getCause() != null) {
-        Throwables.throwIfInstanceOf(e.getCause(), UpdateException.class);
-        Throwables.throwIfInstanceOf(e.getCause(), RestApiException.class);
-      }
-      throw new UpdateException(e);
-    } finally {
-      if (listener != null) {
-        metrics.attemptCounts.record(listener.getAttemptCount());
-      }
-    }
-  }
-
-  private static boolean isLockFailure(Throwable t) {
-    if (t instanceof UpdateException) {
-      t = t.getCause();
-    }
-    return t instanceof LockFailureException;
-  }
-
-  private static class MetricListener implements RetryListener {
-    private final RetryListener delegate;
-    private long attemptCount;
-
-    MetricListener(@Nullable RetryListener delegate) {
-      this.delegate = delegate;
-      attemptCount = 1;
-    }
-
-    @Override
-    public <V> void onRetry(Attempt<V> attempt) {
-      attemptCount = attempt.getAttemptNumber();
-      if (delegate != null) {
-        delegate.onRetry(attempt);
-      }
-    }
-
-    long getAttemptCount() {
-      return attemptCount;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/update/ReviewDbBatchUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/update/ReviewDbBatchUpdate.java
deleted file mode 100644
index 0cc994e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/update/ReviewDbBatchUpdate.java
+++ /dev/null
@@ -1,858 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.update;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static java.util.Comparator.comparing;
-import static java.util.concurrent.TimeUnit.NANOSECONDS;
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.base.Stopwatch;
-import com.google.common.base.Throwables;
-import com.google.common.collect.ImmutableList;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.ListeningExecutorService;
-import com.google.common.util.concurrent.MoreExecutors;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.restapi.ResourceConflictException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.metrics.Description;
-import com.google.gerrit.metrics.Description.Units;
-import com.google.gerrit.metrics.Field;
-import com.google.gerrit.metrics.MetricMaker;
-import com.google.gerrit.metrics.Timer1;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.reviewdb.server.ReviewDbWrapper;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.InsertedObject;
-import com.google.gerrit.server.git.LockFailureException;
-import com.google.gerrit.server.index.change.ChangeIndexer;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.ChangeUpdate;
-import com.google.gerrit.server.notedb.NoteDbChangeState;
-import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
-import com.google.gerrit.server.notedb.NoteDbUpdateManager;
-import com.google.gerrit.server.notedb.NoteDbUpdateManager.MismatchedStateException;
-import com.google.gerrit.server.notedb.NotesMigration;
-import com.google.gerrit.server.util.RequestId;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.TimeZone;
-import java.util.TreeMap;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import org.eclipse.jgit.lib.BatchRefUpdate;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.NullProgressMonitor;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.ReceiveCommand;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * {@link BatchUpdate} implementation that supports mixed ReviewDb/NoteDb operations, depending on
- * the migration state specified in {@link NotesMigration}.
- *
- * <p>When performing change updates in a mixed ReviewDb/NoteDb environment with ReviewDb primary,
- * the order of operations is very subtle:
- *
- * <ol>
- *   <li>Stage NoteDb updates to get the new NoteDb state, but do not write to the repo.
- *   <li>Write the new state in the Change entity, and commit this to ReviewDb.
- *   <li>Update NoteDb, ignoring any write failures.
- * </ol>
- *
- * The implementation in this class is well-tested, and it is strongly recommended that you not
- * attempt to reimplement this logic. Use {@code BatchUpdate} if at all possible.
- */
-class ReviewDbBatchUpdate extends BatchUpdate {
-  private static final Logger log = LoggerFactory.getLogger(ReviewDbBatchUpdate.class);
-
-  interface AssistedFactory {
-    ReviewDbBatchUpdate create(
-        ReviewDb db, Project.NameKey project, CurrentUser user, Timestamp when);
-  }
-
-  class ContextImpl implements Context {
-    @Override
-    public RepoView getRepoView() throws IOException {
-      return ReviewDbBatchUpdate.this.getRepoView();
-    }
-
-    @Override
-    public RevWalk getRevWalk() throws IOException {
-      return getRepoView().getRevWalk();
-    }
-
-    @Override
-    public Project.NameKey getProject() {
-      return project;
-    }
-
-    @Override
-    public Timestamp getWhen() {
-      return when;
-    }
-
-    @Override
-    public TimeZone getTimeZone() {
-      return tz;
-    }
-
-    @Override
-    public ReviewDb getDb() {
-      return db;
-    }
-
-    @Override
-    public CurrentUser getUser() {
-      return user;
-    }
-
-    @Override
-    public Order getOrder() {
-      return order;
-    }
-  }
-
-  private class RepoContextImpl extends ContextImpl implements RepoContext {
-    @Override
-    public ObjectInserter getInserter() throws IOException {
-      return getRepoView().getInserterWrapper();
-    }
-
-    @Override
-    public void addRefUpdate(ReceiveCommand cmd) throws IOException {
-      initRepository();
-      repoView.getCommands().add(cmd);
-    }
-  }
-
-  private class ChangeContextImpl extends ContextImpl implements ChangeContext {
-    private final ChangeNotes notes;
-    private final Map<PatchSet.Id, ChangeUpdate> updates;
-    private final ReviewDbWrapper dbWrapper;
-    private final Repository threadLocalRepo;
-    private final RevWalk threadLocalRevWalk;
-
-    private boolean deleted;
-    private boolean bumpLastUpdatedOn = true;
-
-    protected ChangeContextImpl(
-        ChangeNotes notes, ReviewDbWrapper dbWrapper, Repository repo, RevWalk rw) {
-      this.notes = checkNotNull(notes);
-      this.dbWrapper = dbWrapper;
-      this.threadLocalRepo = repo;
-      this.threadLocalRevWalk = rw;
-      updates = new TreeMap<>(comparing(PatchSet.Id::get));
-    }
-
-    @Override
-    public ReviewDb getDb() {
-      checkNotNull(dbWrapper);
-      return dbWrapper;
-    }
-
-    @Override
-    public RevWalk getRevWalk() {
-      return threadLocalRevWalk;
-    }
-
-    @Override
-    public ChangeUpdate getUpdate(PatchSet.Id psId) {
-      ChangeUpdate u = updates.get(psId);
-      if (u == null) {
-        u = changeUpdateFactory.create(notes, user, when);
-        if (newChanges.containsKey(notes.getChangeId())) {
-          u.setAllowWriteToNewRef(true);
-        }
-        u.setPatchSetId(psId);
-        updates.put(psId, u);
-      }
-      return u;
-    }
-
-    @Override
-    public ChangeNotes getNotes() {
-      return notes;
-    }
-
-    @Override
-    public void dontBumpLastUpdatedOn() {
-      bumpLastUpdatedOn = false;
-    }
-
-    @Override
-    public void deleteChange() {
-      deleted = true;
-    }
-  }
-
-  @Singleton
-  private static class Metrics {
-    final Timer1<Boolean> executeChangeOpsLatency;
-
-    @Inject
-    Metrics(MetricMaker metricMaker) {
-      executeChangeOpsLatency =
-          metricMaker.newTimer(
-              "batch_update/execute_change_ops",
-              new Description("BatchUpdate change update latency, excluding reindexing")
-                  .setCumulative()
-                  .setUnit(Units.MILLISECONDS),
-              Field.ofBoolean("success"));
-    }
-  }
-
-  static void execute(
-      ImmutableList<ReviewDbBatchUpdate> updates,
-      BatchUpdateListener listener,
-      @Nullable RequestId requestId,
-      boolean dryrun)
-      throws UpdateException, RestApiException {
-    if (updates.isEmpty()) {
-      return;
-    }
-    setRequestIds(updates, requestId);
-    try {
-      Order order = getOrder(updates, listener);
-      boolean updateChangesInParallel = getUpdateChangesInParallel(updates);
-      switch (order) {
-        case REPO_BEFORE_DB:
-          for (ReviewDbBatchUpdate u : updates) {
-            u.executeUpdateRepo();
-          }
-          listener.afterUpdateRepos();
-          for (ReviewDbBatchUpdate u : updates) {
-            u.executeRefUpdates(dryrun);
-          }
-          listener.afterUpdateRefs();
-          for (ReviewDbBatchUpdate u : updates) {
-            u.reindexChanges(u.executeChangeOps(updateChangesInParallel, dryrun));
-          }
-          listener.afterUpdateChanges();
-          break;
-        case DB_BEFORE_REPO:
-          for (ReviewDbBatchUpdate u : updates) {
-            u.reindexChanges(u.executeChangeOps(updateChangesInParallel, dryrun));
-          }
-          for (ReviewDbBatchUpdate u : updates) {
-            u.executeUpdateRepo();
-          }
-          for (ReviewDbBatchUpdate u : updates) {
-            u.executeRefUpdates(dryrun);
-          }
-          break;
-        default:
-          throw new IllegalStateException("invalid execution order: " + order);
-      }
-
-      ChangeIndexer.allAsList(
-              updates.stream().flatMap(u -> u.indexFutures.stream()).collect(toList()))
-          .get();
-
-      // Fire ref update events only after all mutations are finished, since callers may assume a
-      // patch set ref being created means the change was created, or a branch advancing meaning
-      // some changes were closed.
-      updates.stream()
-          .filter(u -> u.batchRefUpdate != null)
-          .forEach(
-              u -> u.gitRefUpdated.fire(u.project, u.batchRefUpdate, u.getAccount().orElse(null)));
-
-      if (!dryrun) {
-        for (ReviewDbBatchUpdate u : updates) {
-          u.executePostOps();
-        }
-      }
-    } catch (Exception e) {
-      wrapAndThrowException(e);
-    }
-  }
-
-  private final AllUsersName allUsers;
-  private final ChangeIndexer indexer;
-  private final ChangeNotes.Factory changeNotesFactory;
-  private final ChangeUpdate.Factory changeUpdateFactory;
-  private final GitReferenceUpdated gitRefUpdated;
-  private final ListeningExecutorService changeUpdateExector;
-  private final Metrics metrics;
-  private final NoteDbUpdateManager.Factory updateManagerFactory;
-  private final NotesMigration notesMigration;
-  private final ReviewDb db;
-  private final SchemaFactory<ReviewDb> schemaFactory;
-  private final long skewMs;
-
-  @SuppressWarnings("deprecation")
-  private final List<com.google.common.util.concurrent.CheckedFuture<?, IOException>> indexFutures =
-      new ArrayList<>();
-
-  @Inject
-  ReviewDbBatchUpdate(
-      @GerritServerConfig Config cfg,
-      AllUsersName allUsers,
-      ChangeIndexer indexer,
-      ChangeNotes.Factory changeNotesFactory,
-      @ChangeUpdateExecutor ListeningExecutorService changeUpdateExector,
-      ChangeUpdate.Factory changeUpdateFactory,
-      @GerritPersonIdent PersonIdent serverIdent,
-      GitReferenceUpdated gitRefUpdated,
-      GitRepositoryManager repoManager,
-      Metrics metrics,
-      NoteDbUpdateManager.Factory updateManagerFactory,
-      NotesMigration notesMigration,
-      SchemaFactory<ReviewDb> schemaFactory,
-      @Assisted ReviewDb db,
-      @Assisted Project.NameKey project,
-      @Assisted CurrentUser user,
-      @Assisted Timestamp when) {
-    super(repoManager, serverIdent, project, user, when);
-    this.allUsers = allUsers;
-    this.changeNotesFactory = changeNotesFactory;
-    this.changeUpdateExector = changeUpdateExector;
-    this.changeUpdateFactory = changeUpdateFactory;
-    this.gitRefUpdated = gitRefUpdated;
-    this.indexer = indexer;
-    this.metrics = metrics;
-    this.notesMigration = notesMigration;
-    this.schemaFactory = schemaFactory;
-    this.updateManagerFactory = updateManagerFactory;
-    this.db = db;
-    skewMs = NoteDbChangeState.getReadOnlySkew(cfg);
-  }
-
-  @Override
-  public void execute(BatchUpdateListener listener) throws UpdateException, RestApiException {
-    execute(ImmutableList.of(this), listener, requestId, false);
-  }
-
-  @Override
-  protected Context newContext() {
-    return new ContextImpl();
-  }
-
-  private void executeUpdateRepo() throws UpdateException, RestApiException {
-    try {
-      logDebug("Executing updateRepo on {} ops", ops.size());
-      RepoContextImpl ctx = new RepoContextImpl();
-      for (BatchUpdateOp op : ops.values()) {
-        op.updateRepo(ctx);
-      }
-
-      logDebug("Executing updateRepo on {} RepoOnlyOps", repoOnlyOps.size());
-      for (RepoOnlyOp op : repoOnlyOps) {
-        op.updateRepo(ctx);
-      }
-
-      if (onSubmitValidators != null && !getRefUpdates().isEmpty()) {
-        // Validation of refs has to take place here and not at the beginning of executeRefUpdates.
-        // Otherwise, failing validation in a second BatchUpdate object will happen *after* the
-        // first update's executeRefUpdates has finished, hence after first repo's refs have been
-        // updated, which is too late.
-        onSubmitValidators.validate(
-            project, ctx.getRevWalk().getObjectReader(), repoView.getCommands());
-      }
-
-      if (repoView != null) {
-        logDebug("Flushing inserter");
-        repoView.getInserter().flush();
-      } else {
-        logDebug("No objects to flush");
-      }
-    } catch (Exception e) {
-      Throwables.throwIfInstanceOf(e, RestApiException.class);
-      throw new UpdateException(e);
-    }
-  }
-
-  private void executeRefUpdates(boolean dryrun) throws IOException, RestApiException {
-    if (getRefUpdates().isEmpty()) {
-      logDebug("No ref updates to execute");
-      return;
-    }
-    // May not be opened if the caller added ref updates but no new objects.
-    // TODO(dborowitz): Really?
-    initRepository();
-    batchRefUpdate = repoView.getRepository().getRefDatabase().newBatchUpdate();
-    batchRefUpdate.setPushCertificate(pushCert);
-    batchRefUpdate.setRefLogMessage(refLogMessage, true);
-    batchRefUpdate.setAllowNonFastForwards(true);
-    repoView.getCommands().addTo(batchRefUpdate);
-    if (user.isIdentifiedUser()) {
-      batchRefUpdate.setRefLogIdent(user.asIdentifiedUser().newRefLogIdent(when, tz));
-    }
-    logDebug("Executing batch of {} ref updates", batchRefUpdate.getCommands().size());
-    if (dryrun) {
-      return;
-    }
-
-    // Force BatchRefUpdate to read newly referenced objects using a new RevWalk, rather than one
-    // that might have access to unflushed objects.
-    try (RevWalk updateRw = new RevWalk(repoView.getRepository())) {
-      batchRefUpdate.execute(updateRw, NullProgressMonitor.INSTANCE);
-    }
-    boolean ok = true;
-    for (ReceiveCommand cmd : batchRefUpdate.getCommands()) {
-      if (cmd.getResult() != ReceiveCommand.Result.OK) {
-        ok = false;
-        break;
-      }
-    }
-    if (!ok) {
-      throw new RestApiException("BatchRefUpdate failed: " + batchRefUpdate);
-    }
-  }
-
-  private List<ChangeTask> executeChangeOps(boolean parallel, boolean dryrun)
-      throws UpdateException, RestApiException {
-    List<ChangeTask> tasks;
-    boolean success = false;
-    Stopwatch sw = Stopwatch.createStarted();
-    try {
-      logDebug("Executing change ops (parallel? {})", parallel);
-      ListeningExecutorService executor =
-          parallel ? changeUpdateExector : MoreExecutors.newDirectExecutorService();
-
-      tasks = new ArrayList<>(ops.keySet().size());
-      try {
-        if (notesMigration.commitChangeWrites() && repoView != null) {
-          // A NoteDb change may have been rebuilt since the repo was originally
-          // opened, so make sure we see that.
-          logDebug("Preemptively scanning for repo changes");
-          repoView.getRepository().scanForRepoChanges();
-        }
-        if (!ops.isEmpty() && notesMigration.failChangeWrites()) {
-          // Fail fast before attempting any writes if changes are read-only, as
-          // this is a programmer error.
-          logDebug("Failing early due to read-only Changes table");
-          throw new OrmException(NoteDbUpdateManager.CHANGES_READ_ONLY);
-        }
-        List<ListenableFuture<?>> futures = new ArrayList<>(ops.keySet().size());
-        for (Map.Entry<Change.Id, Collection<BatchUpdateOp>> e : ops.asMap().entrySet()) {
-          ChangeTask task =
-              new ChangeTask(e.getKey(), e.getValue(), Thread.currentThread(), dryrun);
-          tasks.add(task);
-          if (!parallel) {
-            logDebug("Direct execution of task for ops: {}", ops);
-          }
-          futures.add(executor.submit(task));
-        }
-        if (parallel) {
-          logDebug(
-              "Waiting on futures for {} ops spanning {} changes", ops.size(), ops.keySet().size());
-        }
-        Futures.allAsList(futures).get();
-
-        if (notesMigration.commitChangeWrites()) {
-          if (!dryrun) {
-            executeNoteDbUpdates(tasks);
-          }
-        }
-        success = true;
-      } catch (ExecutionException | InterruptedException e) {
-        Throwables.throwIfInstanceOf(e.getCause(), UpdateException.class);
-        Throwables.throwIfInstanceOf(e.getCause(), RestApiException.class);
-        throw new UpdateException(e);
-      } catch (OrmException | IOException e) {
-        throw new UpdateException(e);
-      }
-    } finally {
-      metrics.executeChangeOpsLatency.record(success, sw.elapsed(NANOSECONDS), NANOSECONDS);
-    }
-    return tasks;
-  }
-
-  private void reindexChanges(List<ChangeTask> tasks) {
-    // Reindex changes.
-    for (ChangeTask task : tasks) {
-      if (task.deleted) {
-        indexFutures.add(indexer.deleteAsync(task.id));
-      } else if (task.dirty) {
-        indexFutures.add(indexer.indexAsync(project, task.id));
-      }
-    }
-  }
-
-  private void executeNoteDbUpdates(List<ChangeTask> tasks)
-      throws ResourceConflictException, IOException {
-    // Aggregate together all NoteDb ref updates from the ops we executed,
-    // possibly in parallel. Each task had its own NoteDbUpdateManager instance
-    // with its own thread-local copy of the repo(s), but each of those was just
-    // used for staging updates and was never executed.
-    //
-    // Use a new BatchRefUpdate as the original batchRefUpdate field is intended
-    // for use only by the updateRepo phase.
-    //
-    // See the comments in NoteDbUpdateManager#execute() for why we execute the
-    // updates on the change repo first.
-    logDebug("Executing NoteDb updates for {} changes", tasks.size());
-    try {
-      initRepository();
-      BatchRefUpdate changeRefUpdate = repoView.getRepository().getRefDatabase().newBatchUpdate();
-      boolean hasAllUsersCommands = false;
-      try (ObjectInserter ins = repoView.getRepository().newObjectInserter()) {
-        int objs = 0;
-        for (ChangeTask task : tasks) {
-          if (task.noteDbResult == null) {
-            logDebug("No-op update to {}", task.id);
-            continue;
-          }
-          for (ReceiveCommand cmd : task.noteDbResult.changeCommands()) {
-            changeRefUpdate.addCommand(cmd);
-          }
-          for (InsertedObject obj : task.noteDbResult.changeObjects()) {
-            objs++;
-            ins.insert(obj.type(), obj.data().toByteArray());
-          }
-          hasAllUsersCommands |= !task.noteDbResult.allUsersCommands().isEmpty();
-        }
-        logDebug(
-            "Collected {} objects and {} ref updates to change repo",
-            objs,
-            changeRefUpdate.getCommands().size());
-        executeNoteDbUpdate(getRevWalk(), ins, changeRefUpdate);
-      }
-
-      if (hasAllUsersCommands) {
-        try (Repository allUsersRepo = repoManager.openRepository(allUsers);
-            RevWalk allUsersRw = new RevWalk(allUsersRepo);
-            ObjectInserter allUsersIns = allUsersRepo.newObjectInserter()) {
-          int objs = 0;
-          BatchRefUpdate allUsersRefUpdate = allUsersRepo.getRefDatabase().newBatchUpdate();
-          for (ChangeTask task : tasks) {
-            for (ReceiveCommand cmd : task.noteDbResult.allUsersCommands()) {
-              allUsersRefUpdate.addCommand(cmd);
-            }
-            for (InsertedObject obj : task.noteDbResult.allUsersObjects()) {
-              allUsersIns.insert(obj.type(), obj.data().toByteArray());
-            }
-          }
-          logDebug(
-              "Collected {} objects and {} ref updates to All-Users",
-              objs,
-              allUsersRefUpdate.getCommands().size());
-          executeNoteDbUpdate(allUsersRw, allUsersIns, allUsersRefUpdate);
-        }
-      } else {
-        logDebug("No All-Users updates");
-      }
-    } catch (IOException e) {
-      if (tasks.stream().allMatch(t -> t.storage == PrimaryStorage.REVIEW_DB)) {
-        // Ignore all errors trying to update NoteDb at this point. We've already written the
-        // NoteDbChangeStates to ReviewDb, which means if any state is out of date it will be
-        // rebuilt the next time it is needed.
-        //
-        // Always log even without RequestId.
-        log.debug("Ignoring NoteDb update error after ReviewDb write", e);
-
-        // Otherwise, we can't prove it's safe to ignore the error, either because some change had
-        // NOTE_DB primary, or a task failed before determining the primary storage.
-      } else if (e instanceof LockFailureException) {
-        // LOCK_FAILURE is a special case indicating there was a conflicting write to a meta ref,
-        // although it happened too late for us to produce anything but a generic error message.
-        throw new ResourceConflictException("Updating change failed due to conflicting write", e);
-      }
-      throw e;
-    }
-  }
-
-  private void executeNoteDbUpdate(RevWalk rw, ObjectInserter ins, BatchRefUpdate bru)
-      throws IOException {
-    if (bru.getCommands().isEmpty()) {
-      logDebug("No commands, skipping flush and ref update");
-      return;
-    }
-    ins.flush();
-    bru.setAllowNonFastForwards(true);
-    bru.execute(rw, NullProgressMonitor.INSTANCE);
-    for (ReceiveCommand cmd : bru.getCommands()) {
-      // TODO(dborowitz): LOCK_FAILURE for NoteDb primary should be retried.
-      if (cmd.getResult() != ReceiveCommand.Result.OK) {
-        throw new IOException("Update failed: " + bru);
-      }
-    }
-  }
-
-  private class ChangeTask implements Callable<Void> {
-    final Change.Id id;
-    private final Collection<BatchUpdateOp> changeOps;
-    private final Thread mainThread;
-    private final boolean dryrun;
-
-    PrimaryStorage storage;
-    NoteDbUpdateManager.StagedResult noteDbResult;
-    boolean dirty;
-    boolean deleted;
-    private String taskId;
-
-    private ChangeTask(
-        Change.Id id, Collection<BatchUpdateOp> changeOps, Thread mainThread, boolean dryrun) {
-      this.id = id;
-      this.changeOps = changeOps;
-      this.mainThread = mainThread;
-      this.dryrun = dryrun;
-    }
-
-    @Override
-    public Void call() throws Exception {
-      taskId = id.toString() + "-" + Thread.currentThread().getId();
-      if (Thread.currentThread() == mainThread) {
-        initRepository();
-        Repository repo = repoView.getRepository();
-        try (RevWalk rw = new RevWalk(repo)) {
-          call(ReviewDbBatchUpdate.this.db, repo, rw);
-        }
-      } else {
-        // Possible optimization: allow Ops to declare whether they need to
-        // access the repo from updateChange, and don't open in this thread
-        // unless we need it. However, as of this writing the only operations
-        // that are executed in parallel are during ReceiveCommits, and they
-        // all need the repo open anyway. (The non-parallel case above does not
-        // reopen the repo.)
-        try (ReviewDb threadLocalDb = schemaFactory.open();
-            Repository repo = repoManager.openRepository(project);
-            RevWalk rw = new RevWalk(repo)) {
-          call(threadLocalDb, repo, rw);
-        }
-      }
-      return null;
-    }
-
-    private void call(ReviewDb db, Repository repo, RevWalk rw) throws Exception {
-      @SuppressWarnings("resource") // Not always opened.
-      NoteDbUpdateManager updateManager = null;
-      try {
-        db.changes().beginTransaction(id);
-        try {
-          ChangeContextImpl ctx = newChangeContext(db, repo, rw, id);
-          NoteDbChangeState oldState = NoteDbChangeState.parse(ctx.getChange());
-          NoteDbChangeState.checkNotReadOnly(oldState, skewMs);
-
-          storage = PrimaryStorage.of(oldState);
-          if (storage == PrimaryStorage.NOTE_DB && !notesMigration.readChanges()) {
-            throw new OrmException("must have NoteDb enabled to update change " + id);
-          }
-
-          // Call updateChange on each op.
-          logDebug("Calling updateChange on {} ops", changeOps.size());
-          for (BatchUpdateOp op : changeOps) {
-            dirty |= op.updateChange(ctx);
-          }
-          if (!dirty) {
-            logDebug("No ops reported dirty, short-circuiting");
-            return;
-          }
-          deleted = ctx.deleted;
-          if (deleted) {
-            logDebug("Change was deleted");
-          }
-
-          // Stage the NoteDb update and store its state in the Change.
-          if (notesMigration.commitChangeWrites()) {
-            updateManager = stageNoteDbUpdate(ctx, deleted);
-          }
-
-          if (storage == PrimaryStorage.REVIEW_DB) {
-            // If primary storage of this change is in ReviewDb, bump
-            // lastUpdatedOn or rowVersion and commit. Otherwise, don't waste
-            // time updating ReviewDb at all.
-            Iterable<Change> cs = changesToUpdate(ctx);
-            if (isNewChange(id)) {
-              // Insert rather than upsert in case of a race on change IDs.
-              logDebug("Inserting change");
-              db.changes().insert(cs);
-            } else if (deleted) {
-              logDebug("Deleting change");
-              db.changes().delete(cs);
-            } else {
-              logDebug("Updating change");
-              db.changes().update(cs);
-            }
-            if (!dryrun) {
-              db.commit();
-            }
-          } else {
-            logDebug("Skipping ReviewDb write since primary storage is {}", storage);
-          }
-        } finally {
-          db.rollback();
-        }
-
-        // Do not execute the NoteDbUpdateManager, as we don't want too much
-        // contention on the underlying repo, and we would rather use a single
-        // ObjectInserter/BatchRefUpdate later.
-        //
-        // TODO(dborowitz): May or may not be worth trying to batch together
-        // flushed inserters as well.
-        if (storage == PrimaryStorage.NOTE_DB) {
-          // Should have failed above if NoteDb is disabled.
-          checkState(notesMigration.commitChangeWrites());
-          noteDbResult = updateManager.stage().get(id);
-        } else if (notesMigration.commitChangeWrites()) {
-          try {
-            noteDbResult = updateManager.stage().get(id);
-          } catch (IOException ex) {
-            // Ignore all errors trying to update NoteDb at this point. We've
-            // already written the NoteDbChangeState to ReviewDb, which means
-            // if the state is out of date it will be rebuilt the next time it
-            // is needed.
-            log.debug("Ignoring NoteDb update error after ReviewDb write", ex);
-          }
-        }
-      } catch (Exception e) {
-        logDebug("Error updating change (should be rethrown)", e);
-        Throwables.propagateIfPossible(e, RestApiException.class);
-        throw new UpdateException(e);
-      } finally {
-        if (updateManager != null) {
-          updateManager.close();
-        }
-      }
-    }
-
-    private ChangeContextImpl newChangeContext(
-        ReviewDb db, Repository repo, RevWalk rw, Change.Id id) throws OrmException {
-      Change c = newChanges.get(id);
-      boolean isNew = c != null;
-      if (isNew) {
-        // New change: populate noteDbState.
-        checkState(c.getNoteDbState() == null, "noteDbState should not be filled in by callers");
-        if (notesMigration.changePrimaryStorage() == PrimaryStorage.NOTE_DB) {
-          c.setNoteDbState(NoteDbChangeState.NOTE_DB_PRIMARY_STATE);
-        }
-      } else {
-        // Existing change.
-        c = ChangeNotes.readOneReviewDbChange(db, id);
-        if (c == null) {
-          // Not in ReviewDb, but new changes are created with default primary
-          // storage as NOTE_DB, so we can assume that a missing change is
-          // NoteDb primary. Pass a synthetic change into ChangeNotes.Factory,
-          // which lets ChangeNotes take care of the existence check.
-          //
-          // TODO(dborowitz): This assumption is potentially risky, because
-          // it means once we turn this option on and start creating changes
-          // without writing anything to ReviewDb, we can't turn this option
-          // back off without making those changes inaccessible. The problem
-          // is we have no way of distinguishing a change that only exists in
-          // NoteDb because it only ever existed in NoteDb, from a change that
-          // only exists in NoteDb because it used to exist in ReviewDb and
-          // deleting from ReviewDb succeeded but deleting from NoteDb failed.
-          //
-          // TODO(dborowitz): We actually still have that problem anyway. Maybe
-          // we need a cutoff timestamp? Or maybe we need to start leaving
-          // tombstones in ReviewDb?
-          c = ChangeNotes.Factory.newNoteDbOnlyChange(project, id);
-        }
-        NoteDbChangeState.checkNotReadOnly(c, skewMs);
-      }
-      ChangeNotes notes = changeNotesFactory.createForBatchUpdate(c, !isNew);
-      return new ChangeContextImpl(notes, new BatchUpdateReviewDb(db), repo, rw);
-    }
-
-    private NoteDbUpdateManager stageNoteDbUpdate(ChangeContextImpl ctx, boolean deleted)
-        throws OrmException, IOException {
-      logDebug("Staging NoteDb update");
-      NoteDbUpdateManager updateManager =
-          updateManagerFactory
-              .create(ctx.getProject())
-              .setChangeRepo(
-                  ctx.threadLocalRepo,
-                  ctx.threadLocalRevWalk,
-                  null,
-                  new ChainedReceiveCommands(ctx.threadLocalRepo));
-      if (ctx.getUser().isIdentifiedUser()) {
-        updateManager.setRefLogIdent(
-            ctx.getUser().asIdentifiedUser().newRefLogIdent(ctx.getWhen(), tz));
-      }
-      for (ChangeUpdate u : ctx.updates.values()) {
-        updateManager.add(u);
-      }
-
-      Change c = ctx.getChange();
-      if (deleted) {
-        updateManager.deleteChange(c.getId());
-      }
-      try {
-        updateManager.stageAndApplyDelta(c);
-      } catch (MismatchedStateException ex) {
-        // Refused to apply update because NoteDb was out of sync, which can
-        // only happen if ReviewDb is the primary storage for this change.
-        //
-        // Go ahead with this ReviewDb update; it's still out of sync, but this
-        // is no worse than before, and it will eventually get rebuilt.
-        logDebug("Ignoring MismatchedStateException while staging");
-      }
-
-      return updateManager;
-    }
-
-    private boolean isNewChange(Change.Id id) {
-      return newChanges.containsKey(id);
-    }
-
-    private void logDebug(String msg, Throwable t) {
-      if (log.isDebugEnabled()) {
-        ReviewDbBatchUpdate.this.logDebug("[" + taskId + "]" + msg, t);
-      }
-    }
-
-    private void logDebug(String msg, Object... args) {
-      if (log.isDebugEnabled()) {
-        ReviewDbBatchUpdate.this.logDebug("[" + taskId + "]" + msg, args);
-      }
-    }
-  }
-
-  private static Iterable<Change> changesToUpdate(ChangeContextImpl ctx) {
-    Change c = ctx.getChange();
-    if (ctx.bumpLastUpdatedOn && c.getLastUpdatedOn().before(ctx.getWhen())) {
-      c.setLastUpdatedOn(ctx.getWhen());
-    }
-    return Collections.singleton(c);
-  }
-
-  private void executePostOps() throws Exception {
-    ContextImpl ctx = new ContextImpl();
-    for (BatchUpdateOp op : ops.values()) {
-      op.postUpdate(ctx);
-    }
-
-    for (RepoOnlyOp op : repoOnlyOps) {
-      op.postUpdate(ctx);
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/HostPlatform.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/HostPlatform.java
deleted file mode 100644
index 066bd4b..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/util/HostPlatform.java
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.util;
-
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-
-public final class HostPlatform {
-  private static final boolean win32 = compute("windows");
-  private static final boolean mac = compute("mac");
-
-  /** @return true if this JVM is running on a Windows platform. */
-  public static boolean isWin32() {
-    return win32;
-  }
-
-  public static boolean isMac() {
-    return mac;
-  }
-
-  private static boolean compute(String platform) {
-    final String osDotName =
-        AccessController.doPrivileged(
-            new PrivilegedAction<String>() {
-              @Override
-              public String run() {
-                return System.getProperty("os.name");
-              }
-            });
-    return osDotName != null && osDotName.toLowerCase().contains(platform);
-  }
-
-  private HostPlatform() {}
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/IdGenerator.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/IdGenerator.java
deleted file mode 100644
index a9a22d9..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/util/IdGenerator.java
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.util;
-
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.Random;
-import java.util.concurrent.atomic.AtomicInteger;
-
-/** Simple class to produce 4 billion keys randomly distributed. */
-@Singleton
-public class IdGenerator {
-  /** Format an id created by this class as a hex string. */
-  public static String format(int id) {
-    final char[] r = new char[8];
-    for (int p = 7; 0 <= p; p--) {
-      final int h = id & 0xf;
-      r[p] = h < 10 ? (char) ('0' + h) : (char) ('a' + (h - 10));
-      id >>= 4;
-    }
-    return new String(r);
-  }
-
-  private final AtomicInteger gen;
-
-  @Inject
-  IdGenerator() {
-    gen = new AtomicInteger(new Random().nextInt());
-  }
-
-  /** Produce the next identifier. */
-  public int next() {
-    return mix(gen.getAndIncrement());
-  }
-
-  private static final int salt = 0x9e3779b9;
-
-  static int mix(int in) {
-    return mix(salt, in);
-  }
-
-  /** A very simple bit permutation to mask a simple incrementer. */
-  public static int mix(int salt, int in) {
-    short v0 = hi16(in);
-    short v1 = lo16(in);
-    v0 += ((v1 << 2) + 0 ^ v1) + (salt ^ (v1 >>> 3)) + 1;
-    v1 += ((v0 << 2) + 2 ^ v0) + (salt ^ (v0 >>> 3)) + 3;
-    return result(v0, v1);
-  }
-
-  /* For testing only. */
-  static int unmix(int in) {
-    short v0 = hi16(in);
-    short v1 = lo16(in);
-    v1 -= ((v0 << 2) + 2 ^ v0) + (salt ^ (v0 >>> 3)) + 3;
-    v0 -= ((v1 << 2) + 0 ^ v1) + (salt ^ (v1 >>> 3)) + 1;
-    return result(v0, v1);
-  }
-
-  private static short hi16(int in) {
-    return (short)
-        ( //
-        ((in >>> 24 & 0xff))
-            | //
-            ((in >>> 16 & 0xff) << 8) //
-        );
-  }
-
-  private static short lo16(int in) {
-    return (short)
-        ( //
-        ((in >>> 8 & 0xff))
-            | //
-            ((in & 0xff) << 8) //
-        );
-  }
-
-  private static int result(short v0, short v1) {
-    return ((v0 & 0xff) << 24)
-        | //
-        (((v0 >>> 8) & 0xff) << 16)
-        | //
-        ((v1 & 0xff) << 8)
-        | //
-        ((v1 >>> 8) & 0xff);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/MagicBranch.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/MagicBranch.java
deleted file mode 100644
index e757d77..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/util/MagicBranch.java
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.server.util;
-
-import com.google.gerrit.common.data.Capable;
-import com.google.gerrit.reviewdb.client.Project;
-import java.io.IOException;
-import java.util.Map;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public final class MagicBranch {
-  private static final Logger log = LoggerFactory.getLogger(MagicBranch.class);
-
-  public static final String NEW_CHANGE = "refs/for/";
-  // TODO(xchangcheng): remove after 'repo' supports private/wip changes.
-  public static final String NEW_DRAFT_CHANGE = "refs/drafts/";
-  // TODO(xchangcheng): remove after migrating tools which are using this magic branch.
-  public static final String NEW_PUBLISH_CHANGE = "refs/publish/";
-
-  /** Extracts the destination from a ref name */
-  public static String getDestBranchName(String refName) {
-    String magicBranch = NEW_CHANGE;
-    if (refName.startsWith(NEW_DRAFT_CHANGE)) {
-      magicBranch = NEW_DRAFT_CHANGE;
-    } else if (refName.startsWith(NEW_PUBLISH_CHANGE)) {
-      magicBranch = NEW_PUBLISH_CHANGE;
-    }
-    return refName.substring(magicBranch.length());
-  }
-
-  /** Checks if the supplied ref name is a magic branch */
-  public static boolean isMagicBranch(String refName) {
-    return refName.startsWith(NEW_DRAFT_CHANGE)
-        || refName.startsWith(NEW_PUBLISH_CHANGE)
-        || refName.startsWith(NEW_CHANGE);
-  }
-
-  /** Returns the ref name prefix for a magic branch, {@code null} if the branch is not magic */
-  public static String getMagicRefNamePrefix(String refName) {
-    if (refName.startsWith(NEW_DRAFT_CHANGE)) {
-      return NEW_DRAFT_CHANGE;
-    }
-    if (refName.startsWith(NEW_PUBLISH_CHANGE)) {
-      return NEW_PUBLISH_CHANGE;
-    }
-    if (refName.startsWith(NEW_CHANGE)) {
-      return NEW_CHANGE;
-    }
-    return null;
-  }
-
-  /**
-   * Checks if a (magic branch)/branch_name reference exists in the destination repository and only
-   * returns Capable.OK if it does not match any.
-   *
-   * <p>These block the client from being able to even send us a pack file, as it is very unlikely
-   * the user passed the --force flag and the new commit is probably not going to fast-forward the
-   * branch.
-   */
-  public static Capable checkMagicBranchRefs(Repository repo, Project project) {
-    Capable result = checkMagicBranchRef(NEW_CHANGE, repo, project);
-    if (result != Capable.OK) {
-      return result;
-    }
-    result = checkMagicBranchRef(NEW_DRAFT_CHANGE, repo, project);
-    if (result != Capable.OK) {
-      return result;
-    }
-    result = checkMagicBranchRef(NEW_PUBLISH_CHANGE, repo, project);
-    if (result != Capable.OK) {
-      return result;
-    }
-
-    return Capable.OK;
-  }
-
-  private static Capable checkMagicBranchRef(String branchName, Repository repo, Project project) {
-    Map<String, Ref> blockingFors;
-    try {
-      blockingFors = repo.getRefDatabase().getRefs(branchName);
-    } catch (IOException err) {
-      String projName = project.getName();
-      log.warn("Cannot scan refs in '" + projName + "'", err);
-      return new Capable("Server process cannot read '" + projName + "'");
-    }
-    if (!blockingFors.isEmpty()) {
-      String projName = project.getName();
-      log.error(
-          "Repository '"
-              + projName
-              + "' needs the following refs removed to receive changes: "
-              + blockingFors.keySet());
-      return new Capable("One or more " + branchName + " names blocks change upload");
-    }
-
-    return Capable.OK;
-  }
-
-  private MagicBranch() {}
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/PluginLogFile.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/PluginLogFile.java
deleted file mode 100644
index 946a7e9..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/util/PluginLogFile.java
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.util;
-
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.gerrit.extensions.systemstatus.ServerInformation;
-import org.apache.log4j.AsyncAppender;
-import org.apache.log4j.Layout;
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
-
-public abstract class PluginLogFile implements LifecycleListener {
-
-  private final SystemLog systemLog;
-  private final ServerInformation serverInfo;
-  private final String logName;
-  private final Layout layout;
-
-  public PluginLogFile(
-      SystemLog systemLog, ServerInformation serverInfo, String logName, Layout layout) {
-    this.systemLog = systemLog;
-    this.serverInfo = serverInfo;
-    this.logName = logName;
-    this.layout = layout;
-  }
-
-  @Override
-  public void start() {
-    AsyncAppender asyncAppender = systemLog.createAsyncAppender(logName, layout, true);
-    Logger logger = LogManager.getLogger(logName);
-    logger.removeAppender(logName);
-    logger.addAppender(asyncAppender);
-    logger.setAdditivity(false);
-  }
-
-  @Override
-  public void stop() {
-    // stop is called when plugin is unloaded or when the server shutdown.
-    // Only clean up when the server is shutting down to prevent issue when a
-    // plugin is reloaded. The issue is that gerrit load the new plugin and then
-    // unload the old one so because loggers are static, the unload of the old
-    // plugin would remove the appenders just created by the new plugin.
-    if (serverInfo.getState() == ServerInformation.State.SHUTDOWN) {
-      LogManager.getLogger(logName).removeAllAppenders();
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/RegexListSearcher.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/RegexListSearcher.java
deleted file mode 100644
index 91cb709..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/util/RegexListSearcher.java
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.util;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.common.base.Function;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.primitives.Chars;
-import dk.brics.automaton.Automaton;
-import dk.brics.automaton.RegExp;
-import dk.brics.automaton.RunAutomaton;
-import java.util.Collections;
-import java.util.List;
-
-/** Helper to search sorted lists for elements matching a regex. */
-public abstract class RegexListSearcher<T> implements Function<T, String> {
-  public static RegexListSearcher<String> ofStrings(String re) {
-    return new RegexListSearcher<String>(re) {
-      @Override
-      public String apply(String in) {
-        return in;
-      }
-    };
-  }
-
-  private final RunAutomaton pattern;
-
-  private final String prefixBegin;
-  private final String prefixEnd;
-  private final int prefixLen;
-  private final boolean prefixOnly;
-
-  public RegexListSearcher(String re) {
-    if (re.startsWith("^")) {
-      re = re.substring(1);
-    }
-
-    if (re.endsWith("$") && !re.endsWith("\\$")) {
-      re = re.substring(0, re.length() - 1);
-    }
-
-    Automaton automaton = new RegExp(re).toAutomaton();
-    prefixBegin = automaton.getCommonPrefix();
-    prefixLen = prefixBegin.length();
-
-    if (0 < prefixLen) {
-      char max = Chars.checkedCast(prefixBegin.charAt(prefixLen - 1) + 1);
-      prefixEnd = prefixBegin.substring(0, prefixLen - 1) + max;
-      prefixOnly = re.equals(prefixBegin + ".*");
-    } else {
-      prefixEnd = "";
-      prefixOnly = false;
-    }
-
-    pattern = prefixOnly ? null : new RunAutomaton(automaton);
-  }
-
-  public Iterable<T> search(List<T> list) {
-    checkNotNull(list);
-    int begin;
-    int end;
-
-    if (0 < prefixLen) {
-      // Assumes many consecutive elements may have the same prefix, so the cost
-      // of two binary searches is less than iterating to find the endpoints.
-      begin = find(list, prefixBegin);
-      end = find(list, prefixEnd);
-    } else {
-      begin = 0;
-      end = list.size();
-    }
-
-    if (prefixOnly) {
-      return begin < end ? list.subList(begin, end) : ImmutableList.<T>of();
-    }
-
-    return Iterables.filter(list.subList(begin, end), x -> pattern.run(apply(x)));
-  }
-
-  public boolean hasMatch(List<T> list) {
-    return !Iterables.isEmpty(search(list));
-  }
-
-  private int find(List<T> list, String p) {
-    int r = Collections.binarySearch(Lists.transform(list, this), p);
-    return r < 0 ? -(r + 1) : r;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/RequestId.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/RequestId.java
deleted file mode 100644
index 8e8db12..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/util/RequestId.java
+++ /dev/null
@@ -1,70 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.util;
-
-import com.google.common.hash.Hasher;
-import com.google.common.hash.Hashing;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-
-/** Unique identifier for an end-user request, used in logs and similar. */
-public class RequestId {
-  private static final String MACHINE_ID;
-
-  static {
-    String id;
-    try {
-      id = InetAddress.getLocalHost().getHostAddress();
-    } catch (UnknownHostException e) {
-      id = "unknown";
-    }
-    MACHINE_ID = id;
-  }
-
-  public static RequestId forChange(Change c) {
-    return new RequestId(c.getId().toString());
-  }
-
-  public static RequestId forProject(Project.NameKey p) {
-    return new RequestId(p.toString());
-  }
-
-  private final String str;
-
-  private RequestId(String resourceId) {
-    Hasher h = Hashing.murmur3_128().newHasher();
-    h.putLong(Thread.currentThread().getId()).putUnencodedChars(MACHINE_ID);
-    str =
-        "["
-            + resourceId
-            + "-"
-            + TimeUtil.nowTs().getTime()
-            + "-"
-            + h.hash().toString().substring(0, 8)
-            + "]";
-  }
-
-  @Override
-  public String toString() {
-    return str;
-  }
-
-  public String toStringForStorage() {
-    return str.substring(1, str.length() - 1);
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/RequestScopePropagator.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/RequestScopePropagator.java
deleted file mode 100644
index 9c83549..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/util/RequestScopePropagator.java
+++ /dev/null
@@ -1,218 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server.util;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.common.base.Throwables;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.RequestCleanup;
-import com.google.gerrit.server.config.RequestScopedReviewDbProvider;
-import com.google.gerrit.server.git.ProjectRunnable;
-import com.google.inject.Key;
-import com.google.inject.Provider;
-import com.google.inject.Scope;
-import com.google.inject.servlet.ServletScopes;
-import java.util.concurrent.Callable;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledThreadPoolExecutor;
-
-/**
- * Base class for propagating request-scoped data between threads.
- *
- * <p>Request scopes are typically linked to a {@link ThreadLocal}, which is only available to the
- * current thread. In order to allow background work involving RequestScoped data, the ThreadLocal
- * data must be copied from the request thread to the new background thread.
- *
- * <p>Every type of RequestScope must provide an implementation of RequestScopePropagator. See
- * {@link #wrap(Callable)} for details on the implementation, usage, and restrictions.
- *
- * @see ThreadLocalRequestScopePropagator
- */
-public abstract class RequestScopePropagator {
-
-  private final Scope scope;
-  private final ThreadLocalRequestContext local;
-  private final Provider<RequestScopedReviewDbProvider> dbProviderProvider;
-
-  protected RequestScopePropagator(
-      Scope scope,
-      ThreadLocalRequestContext local,
-      Provider<RequestScopedReviewDbProvider> dbProviderProvider) {
-    this.scope = scope;
-    this.local = local;
-    this.dbProviderProvider = dbProviderProvider;
-  }
-
-  /**
-   * Ensures that the current request state is available when the passed in Callable is invoked.
-   *
-   * <p>If needed wraps the passed in Callable in a new {@link Callable} that propagates the current
-   * request state when the returned Callable is invoked. The method must be called in a request
-   * scope and the returned Callable may only be invoked in a thread that is not already in a
-   * request scope or is in the same request scope. The returned Callable will inherit toString()
-   * from the passed in Callable. A {@link ScheduledThreadPoolExecutor} does not accept a Callable,
-   * so there is no ProjectCallable implementation. Implementations of this method must be
-   * consistent with Guice's {@link ServletScopes#continueRequest(Callable, java.util.Map)}.
-   *
-   * <p>There are some limitations:
-   *
-   * <ul>
-   *   <li>Derived objects (i.e. anything marked created in a request scope) will not be
-   *       transported.
-   *   <li>State changes to the request scoped context after this method is called will not be seen
-   *       in the continued thread.
-   * </ul>
-   *
-   * @param callable the Callable to wrap.
-   * @return a new Callable which will execute in the current request scope.
-   */
-  @SuppressWarnings("javadoc") // See GuiceRequestScopePropagator#wrapImpl
-  public final <T> Callable<T> wrap(Callable<T> callable) {
-    final RequestContext callerContext = checkNotNull(local.getContext());
-    final Callable<T> wrapped = wrapImpl(context(callerContext, cleanup(callable)));
-    return new Callable<T>() {
-      @Override
-      public T call() throws Exception {
-        if (callerContext == local.getContext()) {
-          return callable.call();
-        }
-        return wrapped.call();
-      }
-
-      @Override
-      public String toString() {
-        return callable.toString();
-      }
-    };
-  }
-
-  /**
-   * Wraps runnable in a new {@link Runnable} that propagates the current request state when the
-   * runnable is invoked. The method must be called in a request scope and the returned Runnable may
-   * only be invoked in a thread that is not already in a request scope. The returned Runnable will
-   * inherit toString() from the passed in Runnable. Furthermore, if the passed runnable is of type
-   * {@link ProjectRunnable}, the returned runnable will be of the same type with the methods
-   * delegated.
-   *
-   * <p>See {@link #wrap(Callable)} for details on implementation and usage.
-   *
-   * @param runnable the Runnable to wrap.
-   * @return a new Runnable which will execute in the current request scope.
-   */
-  public final Runnable wrap(Runnable runnable) {
-    final Callable<Object> wrapped = wrap(Executors.callable(runnable));
-
-    if (runnable instanceof ProjectRunnable) {
-      return new ProjectRunnable() {
-        @Override
-        public void run() {
-          try {
-            wrapped.call();
-          } catch (Exception e) {
-            Throwables.throwIfUnchecked(e);
-            throw new RuntimeException(e); // Not possible.
-          }
-        }
-
-        @Override
-        public Project.NameKey getProjectNameKey() {
-          return ((ProjectRunnable) runnable).getProjectNameKey();
-        }
-
-        @Override
-        public String getRemoteName() {
-          return ((ProjectRunnable) runnable).getRemoteName();
-        }
-
-        @Override
-        public boolean hasCustomizedPrint() {
-          return ((ProjectRunnable) runnable).hasCustomizedPrint();
-        }
-
-        @Override
-        public String toString() {
-          return runnable.toString();
-        }
-      };
-    }
-    return new Runnable() {
-      @Override
-      public void run() {
-        try {
-          wrapped.call();
-        } catch (RuntimeException e) {
-          throw e;
-        } catch (Exception e) {
-          throw new RuntimeException(e); // Not possible.
-        }
-      }
-
-      @Override
-      public String toString() {
-        return runnable.toString();
-      }
-    };
-  }
-
-  /** @see #wrap(Callable) */
-  protected abstract <T> Callable<T> wrapImpl(Callable<T> callable);
-
-  protected <T> Callable<T> context(RequestContext context, Callable<T> callable) {
-    return () -> {
-      RequestContext old =
-          local.setContext(
-              new RequestContext() {
-                @Override
-                public CurrentUser getUser() {
-                  return context.getUser();
-                }
-
-                @Override
-                public Provider<ReviewDb> getReviewDbProvider() {
-                  return dbProviderProvider.get();
-                }
-              });
-      try {
-        return callable.call();
-      } finally {
-        local.setContext(old);
-      }
-    };
-  }
-
-  protected <T> Callable<T> cleanup(Callable<T> callable) {
-    return () -> {
-      RequestCleanup cleanup =
-          scope
-              .scope(
-                  Key.get(RequestCleanup.class),
-                  new Provider<RequestCleanup>() {
-                    @Override
-                    public RequestCleanup get() {
-                      return new RequestCleanup();
-                    }
-                  })
-              .get();
-      try {
-        return callable.call();
-      } finally {
-        cleanup.run();
-      }
-    };
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/SubmoduleSectionParser.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/SubmoduleSectionParser.java
deleted file mode 100644
index 6de2fef..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/util/SubmoduleSectionParser.java
+++ /dev/null
@@ -1,145 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.server.util;
-
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.SubmoduleSubscription;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.HashSet;
-import java.util.Set;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.Constants;
-
-/**
- * It parses from a configuration file submodule sections.
- *
- * <p>Example of submodule sections:
- *
- * <pre>
- * [submodule "project-a"]
- *     url = http://localhost/a
- *     path = a
- *     branch = .
- *
- * [submodule "project-b"]
- *     url = http://localhost/b
- *     path = b
- *     branch = refs/heads/test
- * </pre>
- */
-public class SubmoduleSectionParser {
-
-  private final Config bbc;
-  private final String canonicalWebUrl;
-  private final Branch.NameKey superProjectBranch;
-
-  public SubmoduleSectionParser(
-      Config bbc, String canonicalWebUrl, Branch.NameKey superProjectBranch) {
-    this.bbc = bbc;
-    this.canonicalWebUrl = canonicalWebUrl;
-    this.superProjectBranch = superProjectBranch;
-  }
-
-  public Set<SubmoduleSubscription> parseAllSections() {
-    Set<SubmoduleSubscription> parsedSubscriptions = new HashSet<>();
-    for (String id : bbc.getSubsections("submodule")) {
-      final SubmoduleSubscription subscription = parse(id);
-      if (subscription != null) {
-        parsedSubscriptions.add(subscription);
-      }
-    }
-    return parsedSubscriptions;
-  }
-
-  private SubmoduleSubscription parse(String id) {
-    final String url = bbc.getString("submodule", id, "url");
-    final String path = bbc.getString("submodule", id, "path");
-    String branch = bbc.getString("submodule", id, "branch");
-
-    try {
-      if (url != null
-          && url.length() > 0
-          && path != null
-          && path.length() > 0
-          && branch != null
-          && branch.length() > 0) {
-        // All required fields filled.
-        String project;
-
-        if (branch.equals(".")) {
-          branch = superProjectBranch.get();
-        }
-
-        // relative URL
-        if (url.startsWith("../")) {
-          // prefix with a slash for easier relative path walks
-          project = '/' + superProjectBranch.getParentKey().get();
-          String hostPart = url;
-          while (hostPart.startsWith("../")) {
-            int lastSlash = project.lastIndexOf('/');
-            if (lastSlash < 0) {
-              // too many levels up, ignore for now
-              return null;
-            }
-            project = project.substring(0, lastSlash);
-            hostPart = hostPart.substring(3);
-          }
-          project = project + "/" + hostPart;
-
-          // remove leading '/'
-          project = project.substring(1);
-        } else {
-          // It is actually an URI. It could be ssh://localhost/project-a.
-          URI targetServerURI = new URI(url);
-          URI thisServerURI = new URI(canonicalWebUrl);
-          String thisHost = thisServerURI.getHost();
-          String targetHost = targetServerURI.getHost();
-          if (thisHost == null || targetHost == null || !targetHost.equalsIgnoreCase(thisHost)) {
-            return null;
-          }
-          String p1 = targetServerURI.getPath();
-          String p2 = thisServerURI.getPath();
-          if (!p1.startsWith(p2)) {
-            // When we are running the server at
-            // http://server/my-gerrit/ but the subscription is for
-            // http://server/other-teams-gerrit/
-            return null;
-          }
-          // skip common part
-          project = p1.substring(p2.length());
-        }
-
-        while (project.startsWith("/")) {
-          project = project.substring(1);
-        }
-
-        if (project.endsWith(Constants.DOT_GIT_EXT)) {
-          project =
-              project.substring(
-                  0, //
-                  project.length() - Constants.DOT_GIT_EXT.length());
-        }
-        Project.NameKey projectKey = new Project.NameKey(project);
-        return new SubmoduleSubscription(
-            superProjectBranch, new Branch.NameKey(projectKey, branch), path);
-      }
-    } catch (URISyntaxException e) {
-      // Error in url syntax (in fact it is uri syntax)
-    }
-    return null;
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/SystemLog.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/SystemLog.java
deleted file mode 100644
index 43a0a26..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/util/SystemLog.java
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.util;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.common.Die;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.nio.file.Path;
-import org.apache.log4j.Appender;
-import org.apache.log4j.AsyncAppender;
-import org.apache.log4j.DailyRollingFileAppender;
-import org.apache.log4j.Layout;
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
-import org.apache.log4j.helpers.OnlyOnceErrorHandler;
-import org.apache.log4j.spi.ErrorHandler;
-import org.apache.log4j.spi.LoggingEvent;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class SystemLog {
-  private static final org.slf4j.Logger log = LoggerFactory.getLogger(SystemLog.class);
-
-  public static final String LOG4J_CONFIGURATION = "log4j.configuration";
-
-  private final SitePaths site;
-  private final Config config;
-
-  @Inject
-  public SystemLog(SitePaths site, @GerritServerConfig Config config) {
-    this.site = site;
-    this.config = config;
-  }
-
-  public static boolean shouldConfigure() {
-    return Strings.isNullOrEmpty(System.getProperty(LOG4J_CONFIGURATION));
-  }
-
-  public static Appender createAppender(Path logdir, String name, Layout layout) {
-    final DailyRollingFileAppender dst = new DailyRollingFileAppender();
-    dst.setName(name);
-    dst.setLayout(layout);
-    dst.setEncoding(UTF_8.name());
-    dst.setFile(resolve(logdir).resolve(name).toString());
-    dst.setImmediateFlush(true);
-    dst.setAppend(true);
-    dst.setErrorHandler(new DieErrorHandler());
-    dst.activateOptions();
-    dst.setErrorHandler(new OnlyOnceErrorHandler());
-    return dst;
-  }
-
-  public AsyncAppender createAsyncAppender(String name, Layout layout) {
-    return createAsyncAppender(name, layout, false);
-  }
-
-  public AsyncAppender createAsyncAppender(String name, Layout layout, boolean forPlugin) {
-    AsyncAppender async = new AsyncAppender();
-    async.setName(name);
-    async.setBlocking(true);
-    async.setBufferSize(config.getInt("core", "asyncLoggingBufferSize", 64));
-    async.setLocationInfo(false);
-
-    if (forPlugin || shouldConfigure()) {
-      async.addAppender(createAppender(site.logs_dir, name, layout));
-    } else {
-      Appender appender = LogManager.getLogger(name).getAppender(name);
-      if (appender != null) {
-        async.addAppender(appender);
-      } else {
-        log.warn("No appender with the name: {} was found. {} logging is disabled", name, name);
-      }
-    }
-    async.activateOptions();
-    return async;
-  }
-
-  private static Path resolve(Path p) {
-    try {
-      return p.toRealPath().normalize();
-    } catch (IOException e) {
-      return p.toAbsolutePath().normalize();
-    }
-  }
-
-  private static final class DieErrorHandler implements ErrorHandler {
-    @Override
-    public void error(String message, Exception e, int errorCode, LoggingEvent event) {
-      error(e != null ? e.getMessage() : message);
-    }
-
-    @Override
-    public void error(String message, Exception e, int errorCode) {
-      error(e != null ? e.getMessage() : message);
-    }
-
-    @Override
-    public void error(String message) {
-      throw new Die("Cannot open log file: " + message);
-    }
-
-    @Override
-    public void activateOptions() {}
-
-    @Override
-    public void setAppender(Appender appender) {}
-
-    @Override
-    public void setBackupAppender(Appender appender) {}
-
-    @Override
-    public void setLogger(Logger logger) {}
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/validators/OutgoingEmailValidationListener.java b/gerrit-server/src/main/java/com/google/gerrit/server/validators/OutgoingEmailValidationListener.java
deleted file mode 100644
index 9f152a5..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/validators/OutgoingEmailValidationListener.java
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.validators;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.extensions.annotations.ExtensionPoint;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.mail.send.EmailHeader;
-import java.util.Map;
-import java.util.Set;
-
-/** Listener to provide validation on outgoing email notification. */
-@ExtensionPoint
-public interface OutgoingEmailValidationListener {
-  /** Arguments supplied to validateOutgoingEmail. */
-  class Args {
-    // in arguments
-    public String messageClass;
-    @Nullable public String htmlBody;
-
-    // in/out arguments
-    public Address smtpFromAddress;
-    public Set<Address> smtpRcptTo;
-    public String body; // The text body of the email.
-    public Map<String, EmailHeader> headers;
-  }
-
-  /**
-   * Outgoing e-mail validation.
-   *
-   * <p>Invoked by Gerrit just before an e-mail is sent, after all e-mail templates have been
-   * applied.
-   *
-   * <p>Plugins may modify the following fields in args: - smtpFromAddress - smtpRcptTo - body -
-   * headers
-   *
-   * @param args E-mail properties. Some are mutable.
-   * @throws ValidationException if validation fails.
-   */
-  void validateOutgoingEmail(OutgoingEmailValidationListener.Args args) throws ValidationException;
-}
diff --git a/gerrit-server/src/main/java/gerrit/AbstractCommitUserIdentityPredicate.java b/gerrit-server/src/main/java/gerrit/AbstractCommitUserIdentityPredicate.java
deleted file mode 100644
index c2aaa76..0000000
--- a/gerrit-server/src/main/java/gerrit/AbstractCommitUserIdentityPredicate.java
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright (C) 2011 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 gerrit;
-
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.UserIdentity;
-import com.googlecode.prolog_cafe.exceptions.PrologException;
-import com.googlecode.prolog_cafe.lang.IntegerTerm;
-import com.googlecode.prolog_cafe.lang.Operation;
-import com.googlecode.prolog_cafe.lang.Predicate;
-import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.StructureTerm;
-import com.googlecode.prolog_cafe.lang.SymbolTerm;
-import com.googlecode.prolog_cafe.lang.Term;
-
-abstract class AbstractCommitUserIdentityPredicate extends Predicate.P3 {
-  private static final SymbolTerm user = SymbolTerm.intern("user", 1);
-  private static final SymbolTerm anonymous = SymbolTerm.intern("anonymous");
-
-  AbstractCommitUserIdentityPredicate(Term a1, Term a2, Term a3, Operation n) {
-    arg1 = a1;
-    arg2 = a2;
-    arg3 = a3;
-    cont = n;
-  }
-
-  protected Operation exec(Prolog engine, UserIdentity userId) throws PrologException {
-    engine.setB0();
-    Term a1 = arg1.dereference();
-    Term a2 = arg2.dereference();
-    Term a3 = arg3.dereference();
-
-    Term idTerm;
-    Term nameTerm = Prolog.Nil;
-    Term emailTerm = Prolog.Nil;
-
-    Account.Id id = userId.getAccount();
-    if (id == null) {
-      idTerm = anonymous;
-    } else {
-      idTerm = new IntegerTerm(id.get());
-    }
-
-    String name = userId.getName();
-    if (name != null && !name.equals("")) {
-      nameTerm = SymbolTerm.create(name);
-    }
-
-    String email = userId.getEmail();
-    if (email != null && !email.equals("")) {
-      emailTerm = SymbolTerm.create(email);
-    }
-
-    if (!a1.unify(new StructureTerm(user, idTerm), engine.trail)) {
-      return engine.fail();
-    }
-    if (!a2.unify(nameTerm, engine.trail)) {
-      return engine.fail();
-    }
-    if (!a3.unify(emailTerm, engine.trail)) {
-      return engine.fail();
-    }
-    return cont;
-  }
-}
diff --git a/gerrit-server/src/main/java/gerrit/PRED__check_user_label_3.java b/gerrit-server/src/main/java/gerrit/PRED__check_user_label_3.java
deleted file mode 100644
index e84b3ac..0000000
--- a/gerrit-server/src/main/java/gerrit/PRED__check_user_label_3.java
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright (C) 2017 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 gerrit;
-
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.rules.StoredValues;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.permissions.LabelPermission;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gwtorm.server.OrmException;
-import com.googlecode.prolog_cafe.exceptions.IllegalTypeException;
-import com.googlecode.prolog_cafe.exceptions.JavaException;
-import com.googlecode.prolog_cafe.exceptions.PInstantiationException;
-import com.googlecode.prolog_cafe.exceptions.PrologException;
-import com.googlecode.prolog_cafe.exceptions.SystemException;
-import com.googlecode.prolog_cafe.lang.IntegerTerm;
-import com.googlecode.prolog_cafe.lang.JavaObjectTerm;
-import com.googlecode.prolog_cafe.lang.Operation;
-import com.googlecode.prolog_cafe.lang.Predicate;
-import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.SymbolTerm;
-import com.googlecode.prolog_cafe.lang.Term;
-import com.googlecode.prolog_cafe.lang.VariableTerm;
-
-/**
- * Checks user can set label to val.
- *
- * <pre>
- *   '_check_user_label'(+Label, +CurrentUser, +Val)
- * </pre>
- */
-class PRED__check_user_label_3 extends Predicate.P3 {
-  PRED__check_user_label_3(Term a1, Term a2, Term a3, Operation n) {
-    arg1 = a1;
-    arg2 = a2;
-    arg3 = a3;
-    cont = n;
-  }
-
-  @Override
-  public Operation exec(Prolog engine) throws PrologException {
-    engine.setB0();
-    Term a1 = arg1.dereference();
-    Term a2 = arg2.dereference();
-    Term a3 = arg3.dereference();
-
-    if (a1 instanceof VariableTerm) {
-      throw new PInstantiationException(this, 1);
-    }
-    if (!(a1 instanceof SymbolTerm)) {
-      throw new IllegalTypeException(this, 1, "atom", a1);
-    }
-    String label = a1.name();
-
-    if (a2 instanceof VariableTerm) {
-      throw new PInstantiationException(this, 2);
-    }
-    if (!(a2 instanceof JavaObjectTerm) || !a2.convertible(CurrentUser.class)) {
-      throw new IllegalTypeException(this, 2, "CurrentUser)", a2);
-    }
-    CurrentUser user = (CurrentUser) ((JavaObjectTerm) a2).object();
-
-    if (a3 instanceof VariableTerm) {
-      throw new PInstantiationException(this, 3);
-    }
-    if (!(a3 instanceof IntegerTerm)) {
-      throw new IllegalTypeException(this, 3, "integer", a3);
-    }
-    short val = (short) ((IntegerTerm) a3).intValue();
-
-    try {
-      ChangeData cd = StoredValues.CHANGE_DATA.get(engine);
-      LabelType type = cd.getLabelTypes().byLabel(label);
-      if (type == null) {
-        return engine.fail();
-      }
-      StoredValues.PERMISSION_BACKEND
-          .get(engine)
-          .user(user)
-          .change(cd)
-          .check(new LabelPermission.WithValue(type, val));
-      return cont;
-    } catch (OrmException err) {
-      throw new JavaException(this, 1, err);
-    } catch (AuthException err) {
-      return engine.fail();
-    } catch (PermissionBackendException err) {
-      SystemException se = new SystemException(err.getMessage());
-      se.initCause(err);
-      throw se;
-    }
-  }
-}
diff --git a/gerrit-server/src/main/java/gerrit/PRED__load_commit_labels_1.java b/gerrit-server/src/main/java/gerrit/PRED__load_commit_labels_1.java
deleted file mode 100644
index 5a3d656..0000000
--- a/gerrit-server/src/main/java/gerrit/PRED__load_commit_labels_1.java
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2011 Google Inc. All Rights Reserved.
-
-package gerrit;
-
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.LabelTypes;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.rules.StoredValues;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gwtorm.server.OrmException;
-import com.googlecode.prolog_cafe.exceptions.JavaException;
-import com.googlecode.prolog_cafe.exceptions.PrologException;
-import com.googlecode.prolog_cafe.lang.IntegerTerm;
-import com.googlecode.prolog_cafe.lang.ListTerm;
-import com.googlecode.prolog_cafe.lang.Operation;
-import com.googlecode.prolog_cafe.lang.Predicate;
-import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.StructureTerm;
-import com.googlecode.prolog_cafe.lang.SymbolTerm;
-import com.googlecode.prolog_cafe.lang.Term;
-
-/** Exports list of {@code commit_label( label('Code-Review', 2), user(12345789) )}. */
-class PRED__load_commit_labels_1 extends Predicate.P1 {
-  private static final SymbolTerm sym_commit_label = SymbolTerm.intern("commit_label", 2);
-  private static final SymbolTerm sym_label = SymbolTerm.intern("label", 2);
-  private static final SymbolTerm sym_user = SymbolTerm.intern("user", 1);
-
-  PRED__load_commit_labels_1(Term a1, Operation n) {
-    arg1 = a1;
-    cont = n;
-  }
-
-  @Override
-  public Operation exec(Prolog engine) throws PrologException {
-    engine.setB0();
-    Term a1 = arg1.dereference();
-
-    Term listHead = Prolog.Nil;
-    try {
-      ChangeData cd = StoredValues.CHANGE_DATA.get(engine);
-      LabelTypes types = cd.getLabelTypes();
-
-      for (PatchSetApproval a : cd.currentApprovals()) {
-        LabelType t = types.byLabel(a.getLabelId());
-        if (t == null) {
-          continue;
-        }
-
-        StructureTerm labelTerm =
-            new StructureTerm(
-                sym_label, SymbolTerm.intern(t.getName()), new IntegerTerm(a.getValue()));
-
-        StructureTerm userTerm =
-            new StructureTerm(sym_user, new IntegerTerm(a.getAccountId().get()));
-
-        listHead = new ListTerm(new StructureTerm(sym_commit_label, labelTerm, userTerm), listHead);
-      }
-    } catch (OrmException err) {
-      throw new JavaException(this, 1, err);
-    }
-
-    if (!a1.unify(listHead, engine.trail)) {
-      return engine.fail();
-    }
-    return cont;
-  }
-}
diff --git a/gerrit-server/src/main/java/gerrit/PRED__user_label_range_4.java b/gerrit-server/src/main/java/gerrit/PRED__user_label_range_4.java
deleted file mode 100644
index f7f39da..0000000
--- a/gerrit-server/src/main/java/gerrit/PRED__user_label_range_4.java
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright (C) 2011 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 gerrit;
-
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.rules.StoredValues;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.permissions.LabelPermission;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gwtorm.server.OrmException;
-import com.googlecode.prolog_cafe.exceptions.IllegalTypeException;
-import com.googlecode.prolog_cafe.exceptions.JavaException;
-import com.googlecode.prolog_cafe.exceptions.PInstantiationException;
-import com.googlecode.prolog_cafe.exceptions.PrologException;
-import com.googlecode.prolog_cafe.exceptions.SystemException;
-import com.googlecode.prolog_cafe.lang.IntegerTerm;
-import com.googlecode.prolog_cafe.lang.JavaObjectTerm;
-import com.googlecode.prolog_cafe.lang.Operation;
-import com.googlecode.prolog_cafe.lang.Predicate;
-import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.SymbolTerm;
-import com.googlecode.prolog_cafe.lang.Term;
-import com.googlecode.prolog_cafe.lang.VariableTerm;
-import java.util.Set;
-
-/**
- * Resolves the valid range for a label on a CurrentUser.
- *
- * <pre>
- *   '_user_label_range'(+Label, +CurrentUser, -Min, -Max)
- * </pre>
- */
-class PRED__user_label_range_4 extends Predicate.P4 {
-  PRED__user_label_range_4(Term a1, Term a2, Term a3, Term a4, Operation n) {
-    arg1 = a1;
-    arg2 = a2;
-    arg3 = a3;
-    arg4 = a4;
-    cont = n;
-  }
-
-  @Override
-  public Operation exec(Prolog engine) throws PrologException {
-    engine.setB0();
-    Term a1 = arg1.dereference();
-    Term a2 = arg2.dereference();
-    Term a3 = arg3.dereference();
-    Term a4 = arg4.dereference();
-
-    if (a1 instanceof VariableTerm) {
-      throw new PInstantiationException(this, 1);
-    }
-    if (!(a1 instanceof SymbolTerm)) {
-      throw new IllegalTypeException(this, 1, "atom", a1);
-    }
-    String label = a1.name();
-
-    if (a2 instanceof VariableTerm) {
-      throw new PInstantiationException(this, 2);
-    }
-    if (!(a2 instanceof JavaObjectTerm) || !a2.convertible(CurrentUser.class)) {
-      throw new IllegalTypeException(this, 2, "CurrentUser)", a2);
-    }
-    CurrentUser user = (CurrentUser) ((JavaObjectTerm) a2).object();
-
-    Set<LabelPermission.WithValue> can;
-    try {
-      ChangeData cd = StoredValues.CHANGE_DATA.get(engine);
-      LabelType type = cd.getLabelTypes().byLabel(label);
-      if (type == null) {
-        return engine.fail();
-      }
-      can = StoredValues.PERMISSION_BACKEND.get(engine).user(user).change(cd).test(type);
-    } catch (OrmException err) {
-      throw new JavaException(this, 1, err);
-    } catch (PermissionBackendException err) {
-      SystemException se = new SystemException(err.getMessage());
-      se.initCause(err);
-      throw se;
-    }
-
-    int min = 0;
-    int max = 0;
-    for (LabelPermission.WithValue v : can) {
-      min = Math.min(min, v.value());
-      max = Math.max(max, v.value());
-    }
-
-    if (!a3.unify(new IntegerTerm(min), engine.trail)) {
-      return engine.fail();
-    }
-
-    if (!a4.unify(new IntegerTerm(max), engine.trail)) {
-      return engine.fail();
-    }
-
-    return cont;
-  }
-}
diff --git a/gerrit-server/src/main/java/gerrit/PRED_change_branch_1.java b/gerrit-server/src/main/java/gerrit/PRED_change_branch_1.java
deleted file mode 100644
index f050c7f..0000000
--- a/gerrit-server/src/main/java/gerrit/PRED_change_branch_1.java
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright (C) 2011 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 gerrit;
-
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.rules.StoredValues;
-import com.googlecode.prolog_cafe.exceptions.PrologException;
-import com.googlecode.prolog_cafe.lang.Operation;
-import com.googlecode.prolog_cafe.lang.Predicate;
-import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.SymbolTerm;
-import com.googlecode.prolog_cafe.lang.Term;
-
-public class PRED_change_branch_1 extends Predicate.P1 {
-  public PRED_change_branch_1(Term a1, Operation n) {
-    arg1 = a1;
-    cont = n;
-  }
-
-  @Override
-  public Operation exec(Prolog engine) throws PrologException {
-    engine.setB0();
-    Term a1 = arg1.dereference();
-
-    Branch.NameKey name = StoredValues.getChange(engine).getDest();
-
-    if (!a1.unify(SymbolTerm.create(name.get()), engine.trail)) {
-      return engine.fail();
-    }
-    return cont;
-  }
-}
diff --git a/gerrit-server/src/main/java/gerrit/PRED_change_owner_1.java b/gerrit-server/src/main/java/gerrit/PRED_change_owner_1.java
deleted file mode 100644
index b9dac68..0000000
--- a/gerrit-server/src/main/java/gerrit/PRED_change_owner_1.java
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (C) 2011 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 gerrit;
-
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.rules.StoredValues;
-import com.googlecode.prolog_cafe.exceptions.PrologException;
-import com.googlecode.prolog_cafe.lang.IntegerTerm;
-import com.googlecode.prolog_cafe.lang.Operation;
-import com.googlecode.prolog_cafe.lang.Predicate;
-import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.StructureTerm;
-import com.googlecode.prolog_cafe.lang.SymbolTerm;
-import com.googlecode.prolog_cafe.lang.Term;
-
-public class PRED_change_owner_1 extends Predicate.P1 {
-  private static final SymbolTerm user = SymbolTerm.intern("user", 1);
-
-  public PRED_change_owner_1(Term a1, Operation n) {
-    arg1 = a1;
-    cont = n;
-  }
-
-  @Override
-  public Operation exec(Prolog engine) throws PrologException {
-    engine.setB0();
-    Term a1 = arg1.dereference();
-
-    Account.Id ownerId = StoredValues.getChange(engine).getOwner();
-
-    if (!a1.unify(new StructureTerm(user, new IntegerTerm(ownerId.get())), engine.trail)) {
-      return engine.fail();
-    }
-    return cont;
-  }
-}
diff --git a/gerrit-server/src/main/java/gerrit/PRED_change_project_1.java b/gerrit-server/src/main/java/gerrit/PRED_change_project_1.java
deleted file mode 100644
index 568ef2b..0000000
--- a/gerrit-server/src/main/java/gerrit/PRED_change_project_1.java
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright (C) 2011 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 gerrit;
-
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.rules.StoredValues;
-import com.googlecode.prolog_cafe.exceptions.PrologException;
-import com.googlecode.prolog_cafe.lang.Operation;
-import com.googlecode.prolog_cafe.lang.Predicate;
-import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.SymbolTerm;
-import com.googlecode.prolog_cafe.lang.Term;
-
-public class PRED_change_project_1 extends Predicate.P1 {
-  public PRED_change_project_1(Term a1, Operation n) {
-    arg1 = a1;
-    cont = n;
-  }
-
-  @Override
-  public Operation exec(Prolog engine) throws PrologException {
-    engine.setB0();
-    Term a1 = arg1.dereference();
-
-    Project.NameKey name = StoredValues.getChange(engine).getProject();
-
-    if (!a1.unify(SymbolTerm.create(name.get()), engine.trail)) {
-      return engine.fail();
-    }
-    return cont;
-  }
-}
diff --git a/gerrit-server/src/main/java/gerrit/PRED_change_topic_1.java b/gerrit-server/src/main/java/gerrit/PRED_change_topic_1.java
deleted file mode 100644
index 534d097..0000000
--- a/gerrit-server/src/main/java/gerrit/PRED_change_topic_1.java
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright (C) 2011 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 gerrit;
-
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.rules.StoredValues;
-import com.googlecode.prolog_cafe.exceptions.PrologException;
-import com.googlecode.prolog_cafe.lang.Operation;
-import com.googlecode.prolog_cafe.lang.Predicate;
-import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.SymbolTerm;
-import com.googlecode.prolog_cafe.lang.Term;
-
-public class PRED_change_topic_1 extends Predicate.P1 {
-  public PRED_change_topic_1(Term a1, Operation n) {
-    arg1 = a1;
-    cont = n;
-  }
-
-  @Override
-  public Operation exec(Prolog engine) throws PrologException {
-    engine.setB0();
-    Term a1 = arg1.dereference();
-
-    Term topicTerm = Prolog.Nil;
-    Change change = StoredValues.getChange(engine);
-    String topic = change.getTopic();
-    if (topic != null) {
-      topicTerm = SymbolTerm.create(topic);
-    }
-
-    if (!a1.unify(topicTerm, engine.trail)) {
-      return engine.fail();
-    }
-    return cont;
-  }
-}
diff --git a/gerrit-server/src/main/java/gerrit/PRED_commit_author_3.java b/gerrit-server/src/main/java/gerrit/PRED_commit_author_3.java
deleted file mode 100644
index 51d0913..0000000
--- a/gerrit-server/src/main/java/gerrit/PRED_commit_author_3.java
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (C) 2011 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 gerrit;
-
-import com.google.gerrit.reviewdb.client.PatchSetInfo;
-import com.google.gerrit.reviewdb.client.UserIdentity;
-import com.google.gerrit.rules.StoredValues;
-import com.googlecode.prolog_cafe.exceptions.PrologException;
-import com.googlecode.prolog_cafe.lang.Operation;
-import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.Term;
-
-public class PRED_commit_author_3 extends AbstractCommitUserIdentityPredicate {
-  public PRED_commit_author_3(Term a1, Term a2, Term a3, Operation n) {
-    super(a1, a2, a3, n);
-  }
-
-  @Override
-  public Operation exec(Prolog engine) throws PrologException {
-    PatchSetInfo psInfo = StoredValues.PATCH_SET_INFO.get(engine);
-    UserIdentity author = psInfo.getAuthor();
-    return exec(engine, author);
-  }
-}
diff --git a/gerrit-server/src/main/java/gerrit/PRED_commit_committer_3.java b/gerrit-server/src/main/java/gerrit/PRED_commit_committer_3.java
deleted file mode 100644
index 7fa9ff4..0000000
--- a/gerrit-server/src/main/java/gerrit/PRED_commit_committer_3.java
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (C) 2011 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 gerrit;
-
-import com.google.gerrit.reviewdb.client.PatchSetInfo;
-import com.google.gerrit.reviewdb.client.UserIdentity;
-import com.google.gerrit.rules.StoredValues;
-import com.googlecode.prolog_cafe.exceptions.PrologException;
-import com.googlecode.prolog_cafe.lang.Operation;
-import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.Term;
-
-public class PRED_commit_committer_3 extends AbstractCommitUserIdentityPredicate {
-  public PRED_commit_committer_3(Term a1, Term a2, Term a3, Operation n) {
-    super(a1, a2, a3, n);
-  }
-
-  @Override
-  public Operation exec(Prolog engine) throws PrologException {
-    PatchSetInfo psInfo = StoredValues.PATCH_SET_INFO.get(engine);
-    UserIdentity committer = psInfo.getCommitter();
-    return exec(engine, committer);
-  }
-}
diff --git a/gerrit-server/src/main/java/gerrit/PRED_commit_delta_4.java b/gerrit-server/src/main/java/gerrit/PRED_commit_delta_4.java
deleted file mode 100644
index 97e5219..0000000
--- a/gerrit-server/src/main/java/gerrit/PRED_commit_delta_4.java
+++ /dev/null
@@ -1,172 +0,0 @@
-// Copyright (C) 2011 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 gerrit;
-
-import com.google.gerrit.reviewdb.client.Patch;
-import com.google.gerrit.rules.StoredValues;
-import com.google.gerrit.server.patch.PatchList;
-import com.google.gerrit.server.patch.PatchListEntry;
-import com.googlecode.prolog_cafe.exceptions.IllegalTypeException;
-import com.googlecode.prolog_cafe.exceptions.PInstantiationException;
-import com.googlecode.prolog_cafe.exceptions.PrologException;
-import com.googlecode.prolog_cafe.lang.JavaObjectTerm;
-import com.googlecode.prolog_cafe.lang.Operation;
-import com.googlecode.prolog_cafe.lang.Predicate;
-import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.SymbolTerm;
-import com.googlecode.prolog_cafe.lang.Term;
-import com.googlecode.prolog_cafe.lang.VariableTerm;
-import java.util.Iterator;
-import java.util.regex.Pattern;
-
-/**
- * Given a regular expression, checks it against the file list in the most recent patchset of a
- * change. For all files that match the regex, returns the (new) path of the file, the change type,
- * and the old path of the file if applicable (if the file was copied or renamed).
- *
- * <pre>
- *   'commit_delta'(+Regex, -ChangeType, -NewPath, -OldPath)
- * </pre>
- */
-public class PRED_commit_delta_4 extends Predicate.P4 {
-  private static final SymbolTerm add = SymbolTerm.intern("add");
-  private static final SymbolTerm modify = SymbolTerm.intern("modify");
-  private static final SymbolTerm delete = SymbolTerm.intern("delete");
-  private static final SymbolTerm rename = SymbolTerm.intern("rename");
-  private static final SymbolTerm copy = SymbolTerm.intern("copy");
-  static final Operation commit_delta_check = new PRED_commit_delta_check();
-  static final Operation commit_delta_next = new PRED_commit_delta_next();
-  static final Operation commit_delta_empty = new PRED_commit_delta_empty();
-
-  public PRED_commit_delta_4(Term a1, Term a2, Term a3, Term a4, Operation n) {
-    arg1 = a1;
-    arg2 = a2;
-    arg3 = a3;
-    arg4 = a4;
-    cont = n;
-  }
-
-  @Override
-  public Operation exec(Prolog engine) throws PrologException {
-    engine.cont = cont;
-    engine.setB0();
-
-    Term a1 = arg1.dereference();
-    if (a1 instanceof VariableTerm) {
-      throw new PInstantiationException(this, 1);
-    }
-    if (!(a1 instanceof SymbolTerm)) {
-      throw new IllegalTypeException(this, 1, "symbol", a1);
-    }
-    Pattern regex = Pattern.compile(a1.name());
-    engine.r1 = new JavaObjectTerm(regex);
-    engine.r2 = arg2;
-    engine.r3 = arg3;
-    engine.r4 = arg4;
-
-    PatchList pl = StoredValues.PATCH_LIST.get(engine);
-    Iterator<PatchListEntry> iter = pl.getPatches().iterator();
-
-    engine.r5 = new JavaObjectTerm(iter);
-
-    return engine.jtry5(commit_delta_check, commit_delta_next);
-  }
-
-  private static final class PRED_commit_delta_check extends Operation {
-    @Override
-    public Operation exec(Prolog engine) {
-      Term a1 = engine.r1;
-      Term a2 = engine.r2;
-      Term a3 = engine.r3;
-      Term a4 = engine.r4;
-      Term a5 = engine.r5;
-
-      Pattern regex = (Pattern) ((JavaObjectTerm) a1).object();
-      @SuppressWarnings("unchecked")
-      Iterator<PatchListEntry> iter = (Iterator<PatchListEntry>) ((JavaObjectTerm) a5).object();
-      while (iter.hasNext()) {
-        PatchListEntry patch = iter.next();
-        String newName = patch.getNewName();
-        String oldName = patch.getOldName();
-        Patch.ChangeType changeType = patch.getChangeType();
-
-        if (newName.equals("/COMMIT_MSG")) {
-          continue;
-        }
-
-        if (regex.matcher(newName).find() || (oldName != null && regex.matcher(oldName).find())) {
-          SymbolTerm changeSym = getTypeSymbol(changeType);
-          SymbolTerm newSym = SymbolTerm.create(newName);
-          SymbolTerm oldSym = Prolog.Nil;
-          if (oldName != null) {
-            oldSym = SymbolTerm.create(oldName);
-          }
-
-          if (!a2.unify(changeSym, engine.trail)) {
-            continue;
-          }
-          if (!a3.unify(newSym, engine.trail)) {
-            continue;
-          }
-          if (!a4.unify(oldSym, engine.trail)) {
-            continue;
-          }
-          return engine.cont;
-        }
-      }
-      return engine.fail();
-    }
-  }
-
-  private static final class PRED_commit_delta_next extends Operation {
-    @Override
-    public Operation exec(Prolog engine) {
-      return engine.trust(commit_delta_empty);
-    }
-  }
-
-  private static final class PRED_commit_delta_empty extends Operation {
-    @Override
-    public Operation exec(Prolog engine) {
-      Term a5 = engine.r5;
-
-      @SuppressWarnings("unchecked")
-      Iterator<PatchListEntry> iter = (Iterator<PatchListEntry>) ((JavaObjectTerm) a5).object();
-      if (!iter.hasNext()) {
-        return engine.fail();
-      }
-
-      return engine.jtry5(commit_delta_check, commit_delta_next);
-    }
-  }
-
-  private static SymbolTerm getTypeSymbol(Patch.ChangeType type) {
-    switch (type) {
-      case ADDED:
-        return add;
-      case MODIFIED:
-        return modify;
-      case DELETED:
-        return delete;
-      case RENAMED:
-        return rename;
-      case COPIED:
-        return copy;
-      case REWRITE:
-        break;
-    }
-    throw new IllegalArgumentException("ChangeType not recognized");
-  }
-}
diff --git a/gerrit-server/src/main/java/gerrit/PRED_commit_edits_2.java b/gerrit-server/src/main/java/gerrit/PRED_commit_edits_2.java
deleted file mode 100644
index 95c4aaef..0000000
--- a/gerrit-server/src/main/java/gerrit/PRED_commit_edits_2.java
+++ /dev/null
@@ -1,159 +0,0 @@
-// Copyright (C) 2011 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 gerrit;
-
-import com.google.gerrit.rules.StoredValues;
-import com.google.gerrit.server.patch.PatchList;
-import com.google.gerrit.server.patch.PatchListEntry;
-import com.google.gerrit.server.patch.Text;
-import com.googlecode.prolog_cafe.exceptions.IllegalTypeException;
-import com.googlecode.prolog_cafe.exceptions.JavaException;
-import com.googlecode.prolog_cafe.exceptions.PInstantiationException;
-import com.googlecode.prolog_cafe.exceptions.PrologException;
-import com.googlecode.prolog_cafe.lang.Operation;
-import com.googlecode.prolog_cafe.lang.Predicate;
-import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.SymbolTerm;
-import com.googlecode.prolog_cafe.lang.Term;
-import com.googlecode.prolog_cafe.lang.VariableTerm;
-import java.io.IOException;
-import java.util.List;
-import java.util.regex.Pattern;
-import org.eclipse.jgit.diff.Edit;
-import org.eclipse.jgit.errors.CorruptObjectException;
-import org.eclipse.jgit.errors.IncorrectObjectTypeException;
-import org.eclipse.jgit.errors.MissingObjectException;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevTree;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.treewalk.TreeWalk;
-
-/**
- * Returns true if any of the files that match FileNameRegex have edited lines that match EditRegex
- *
- * <pre>
- *   'commit_edits'(+FileNameRegex, +EditRegex)
- * </pre>
- */
-public class PRED_commit_edits_2 extends Predicate.P2 {
-  public PRED_commit_edits_2(Term a1, Term a2, Operation n) {
-    arg1 = a1;
-    arg2 = a2;
-    cont = n;
-  }
-
-  @Override
-  public Operation exec(Prolog engine) throws PrologException {
-    engine.setB0();
-
-    Term a1 = arg1.dereference();
-    Term a2 = arg2.dereference();
-
-    Pattern fileRegex = getRegexParameter(a1);
-    Pattern editRegex = getRegexParameter(a2);
-
-    PatchList pl = StoredValues.PATCH_LIST.get(engine);
-    Repository repo = StoredValues.REPOSITORY.get(engine);
-
-    try (ObjectReader reader = repo.newObjectReader();
-        RevWalk rw = new RevWalk(reader)) {
-      final RevTree aTree;
-      final RevTree bTree;
-      final RevCommit bCommit = rw.parseCommit(pl.getNewId());
-
-      if (pl.getOldId() != null) {
-        aTree = rw.parseTree(pl.getOldId());
-      } else {
-        // Octopus merge with unknown automatic merge result, since the
-        // web UI returns no files to match against, just fail.
-        return engine.fail();
-      }
-      bTree = bCommit.getTree();
-
-      for (PatchListEntry entry : pl.getPatches()) {
-        String newName = entry.getNewName();
-        String oldName = entry.getOldName();
-
-        if (newName.equals("/COMMIT_MSG")) {
-          continue;
-        }
-
-        if (fileRegex.matcher(newName).find()
-            || (oldName != null && fileRegex.matcher(oldName).find())) {
-          List<Edit> edits = entry.getEdits();
-
-          if (edits.isEmpty()) {
-            continue;
-          }
-          Text tA;
-          if (oldName != null) {
-            tA = load(aTree, oldName, reader);
-          } else {
-            tA = load(aTree, newName, reader);
-          }
-          Text tB = load(bTree, newName, reader);
-          for (Edit edit : edits) {
-            if (tA != Text.EMPTY) {
-              String aDiff = tA.getString(edit.getBeginA(), edit.getEndA(), true);
-              if (editRegex.matcher(aDiff).find()) {
-                return cont;
-              }
-            }
-            if (tB != Text.EMPTY) {
-              String bDiff = tB.getString(edit.getBeginB(), edit.getEndB(), true);
-              if (editRegex.matcher(bDiff).find()) {
-                return cont;
-              }
-            }
-          }
-        }
-      }
-    } catch (IOException err) {
-      throw new JavaException(this, 1, err);
-    }
-
-    return engine.fail();
-  }
-
-  private Pattern getRegexParameter(Term term) {
-    if (term instanceof VariableTerm) {
-      throw new PInstantiationException(this, 1);
-    }
-    if (!(term instanceof SymbolTerm)) {
-      throw new IllegalTypeException(this, 1, "symbol", term);
-    }
-    return Pattern.compile(term.name(), Pattern.MULTILINE);
-  }
-
-  private Text load(ObjectId tree, String path, ObjectReader reader)
-      throws MissingObjectException, IncorrectObjectTypeException, CorruptObjectException,
-          IOException {
-    if (path == null) {
-      return Text.EMPTY;
-    }
-    final TreeWalk tw = TreeWalk.forPath(reader, path, tree);
-    if (tw == null) {
-      return Text.EMPTY;
-    }
-    if (tw.getFileMode(0).getObjectType() != Constants.OBJ_BLOB) {
-      return Text.EMPTY;
-    }
-    return new Text(reader.open(tw.getObjectId(0), Constants.OBJ_BLOB));
-  }
-}
diff --git a/gerrit-server/src/main/java/gerrit/PRED_commit_message_1.java b/gerrit-server/src/main/java/gerrit/PRED_commit_message_1.java
deleted file mode 100644
index 16a5b13..0000000
--- a/gerrit-server/src/main/java/gerrit/PRED_commit_message_1.java
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (C) 2011 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 gerrit;
-
-import com.google.gerrit.reviewdb.client.PatchSetInfo;
-import com.google.gerrit.rules.StoredValues;
-import com.googlecode.prolog_cafe.exceptions.PrologException;
-import com.googlecode.prolog_cafe.lang.Operation;
-import com.googlecode.prolog_cafe.lang.Predicate;
-import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.SymbolTerm;
-import com.googlecode.prolog_cafe.lang.Term;
-
-/**
- * Returns the commit message as a symbol
- *
- * <pre>
- *   'commit_message'(-Msg)
- * </pre>
- */
-public class PRED_commit_message_1 extends Predicate.P1 {
-  public PRED_commit_message_1(Term a1, Operation n) {
-    arg1 = a1;
-    cont = n;
-  }
-
-  @Override
-  public Operation exec(Prolog engine) throws PrologException {
-    engine.setB0();
-    Term a1 = arg1.dereference();
-
-    PatchSetInfo psInfo = StoredValues.PATCH_SET_INFO.get(engine);
-
-    SymbolTerm msg = SymbolTerm.create(psInfo.getMessage());
-    if (!a1.unify(msg, engine.trail)) {
-      return engine.fail();
-    }
-    return cont;
-  }
-}
diff --git a/gerrit-server/src/main/java/gerrit/PRED_commit_stats_3.java b/gerrit-server/src/main/java/gerrit/PRED_commit_stats_3.java
deleted file mode 100644
index 6ed82e5..0000000
--- a/gerrit-server/src/main/java/gerrit/PRED_commit_stats_3.java
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright (C) 2012 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 gerrit;
-
-import com.google.gerrit.reviewdb.client.Patch;
-import com.google.gerrit.rules.StoredValues;
-import com.google.gerrit.server.patch.PatchList;
-import com.google.gerrit.server.patch.PatchListEntry;
-import com.googlecode.prolog_cafe.exceptions.PrologException;
-import com.googlecode.prolog_cafe.lang.IntegerTerm;
-import com.googlecode.prolog_cafe.lang.Operation;
-import com.googlecode.prolog_cafe.lang.Predicate;
-import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.Term;
-import java.util.List;
-
-/**
- * Exports basic commit statistics.
- *
- * <pre>
- *   'commit_stats'(-Files, -Insertions, -Deletions)
- * </pre>
- */
-public class PRED_commit_stats_3 extends Predicate.P3 {
-  public PRED_commit_stats_3(Term a1, Term a2, Term a3, Operation n) {
-    arg1 = a1;
-    arg2 = a2;
-    arg3 = a3;
-    cont = n;
-  }
-
-  @Override
-  public Operation exec(Prolog engine) throws PrologException {
-    engine.setB0();
-
-    Term a1 = arg1.dereference();
-    Term a2 = arg2.dereference();
-    Term a3 = arg3.dereference();
-
-    PatchList pl = StoredValues.PATCH_LIST.get(engine);
-    // Account for magic files
-    if (!a1.unify(
-        new IntegerTerm(pl.getPatches().size() - countMagicFiles(pl.getPatches())), engine.trail)) {
-      return engine.fail();
-    }
-    if (!a2.unify(new IntegerTerm(pl.getInsertions()), engine.trail)) {
-      return engine.fail();
-    }
-    if (!a3.unify(new IntegerTerm(pl.getDeletions()), engine.trail)) {
-      return engine.fail();
-    }
-    return cont;
-  }
-
-  private int countMagicFiles(List<PatchListEntry> entries) {
-    int count = 0;
-    for (PatchListEntry e : entries) {
-      if (Patch.isMagic(e.getNewName())) {
-        count++;
-      }
-    }
-    return count;
-  }
-}
diff --git a/gerrit-server/src/main/java/gerrit/PRED_current_user_1.java b/gerrit-server/src/main/java/gerrit/PRED_current_user_1.java
deleted file mode 100644
index 6dc1e52..0000000
--- a/gerrit-server/src/main/java/gerrit/PRED_current_user_1.java
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright (C) 2011 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 gerrit;
-
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.rules.StoredValues;
-import com.google.gerrit.server.AnonymousUser;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.PeerDaemonUser;
-import com.googlecode.prolog_cafe.exceptions.EvaluationException;
-import com.googlecode.prolog_cafe.exceptions.PrologException;
-import com.googlecode.prolog_cafe.lang.IntegerTerm;
-import com.googlecode.prolog_cafe.lang.Operation;
-import com.googlecode.prolog_cafe.lang.Predicate;
-import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.StructureTerm;
-import com.googlecode.prolog_cafe.lang.SymbolTerm;
-import com.googlecode.prolog_cafe.lang.Term;
-
-public class PRED_current_user_1 extends Predicate.P1 {
-  private static final SymbolTerm user = SymbolTerm.intern("user", 1);
-  private static final SymbolTerm anonymous = SymbolTerm.intern("anonymous");
-  private static final SymbolTerm peerDaemon = SymbolTerm.intern("peer_daemon");
-
-  public PRED_current_user_1(Term a1, Operation n) {
-    arg1 = a1;
-    cont = n;
-  }
-
-  @Override
-  public Operation exec(Prolog engine) throws PrologException {
-    engine.setB0();
-    Term a1 = arg1.dereference();
-
-    CurrentUser curUser = StoredValues.CURRENT_USER.getOrNull(engine);
-    if (curUser == null) {
-      throw new EvaluationException("Current user not available in this rule type");
-    }
-    Term resultTerm;
-
-    if (curUser.isIdentifiedUser()) {
-      Account.Id id = curUser.getAccountId();
-      resultTerm = new IntegerTerm(id.get());
-    } else if (curUser instanceof AnonymousUser) {
-      resultTerm = anonymous;
-    } else if (curUser instanceof PeerDaemonUser) {
-      resultTerm = peerDaemon;
-    } else {
-      throw new EvaluationException("Unknown user type");
-    }
-
-    if (!a1.unify(new StructureTerm(user, resultTerm), engine.trail)) {
-      return engine.fail();
-    }
-    return cont;
-  }
-}
diff --git a/gerrit-server/src/main/java/gerrit/PRED_current_user_2.java b/gerrit-server/src/main/java/gerrit/PRED_current_user_2.java
deleted file mode 100644
index 7da1ce8..0000000
--- a/gerrit-server/src/main/java/gerrit/PRED_current_user_2.java
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright (C) 2011 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 gerrit;
-
-import static com.googlecode.prolog_cafe.lang.SymbolTerm.intern;
-
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.rules.PrologEnvironment;
-import com.google.gerrit.rules.StoredValues;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.googlecode.prolog_cafe.exceptions.IllegalTypeException;
-import com.googlecode.prolog_cafe.exceptions.PInstantiationException;
-import com.googlecode.prolog_cafe.exceptions.PrologException;
-import com.googlecode.prolog_cafe.lang.IntegerTerm;
-import com.googlecode.prolog_cafe.lang.JavaObjectTerm;
-import com.googlecode.prolog_cafe.lang.Operation;
-import com.googlecode.prolog_cafe.lang.Predicate;
-import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.StructureTerm;
-import com.googlecode.prolog_cafe.lang.SymbolTerm;
-import com.googlecode.prolog_cafe.lang.Term;
-import com.googlecode.prolog_cafe.lang.VariableTerm;
-import java.util.Map;
-
-/**
- * Loads a CurrentUser object for a user identity.
- *
- * <p>Values are cached in the hash {@code current_user}, avoiding recreation during a single
- * evaluation.
- *
- * <pre>
- *   current_user(user(+AccountId), -CurrentUser).
- * </pre>
- */
-class PRED_current_user_2 extends Predicate.P2 {
-  private static final SymbolTerm user = intern("user", 1);
-  private static final SymbolTerm anonymous = intern("anonymous");
-
-  PRED_current_user_2(Term a1, Term a2, Operation n) {
-    arg1 = a1;
-    arg2 = a2;
-    cont = n;
-  }
-
-  @Override
-  public Operation exec(Prolog engine) throws PrologException {
-    engine.setB0();
-    Term a1 = arg1.dereference();
-    Term a2 = arg2.dereference();
-
-    if (a1 instanceof VariableTerm) {
-      throw new PInstantiationException(this, 1);
-    }
-
-    if (!a2.unify(createUser(engine, a1), engine.trail)) {
-      return engine.fail();
-    }
-
-    return cont;
-  }
-
-  public Term createUser(Prolog engine, Term key) {
-    if (!(key instanceof StructureTerm)
-        || key.arity() != 1
-        || !((StructureTerm) key).functor().equals(user)) {
-      throw new IllegalTypeException(this, 1, "user(int)", key);
-    }
-
-    Term idTerm = key.arg(0);
-    CurrentUser user;
-    if (idTerm instanceof IntegerTerm) {
-      Map<Account.Id, IdentifiedUser> cache = StoredValues.USERS.get(engine);
-      Account.Id accountId = new Account.Id(((IntegerTerm) idTerm).intValue());
-      user = cache.get(accountId);
-      if (user == null) {
-        IdentifiedUser.GenericFactory userFactory = userFactory(engine);
-        IdentifiedUser who = userFactory.create(accountId);
-        cache.put(accountId, who);
-        user = who;
-      }
-
-    } else if (idTerm.equals(anonymous)) {
-      user = StoredValues.ANONYMOUS_USER.get(engine);
-
-    } else {
-      throw new IllegalTypeException(this, 1, "user(int)", key);
-    }
-
-    return new JavaObjectTerm(user);
-  }
-
-  private static IdentifiedUser.GenericFactory userFactory(Prolog engine) {
-    return ((PrologEnvironment) engine.control).getArgs().getUserFactory();
-  }
-}
diff --git a/gerrit-server/src/main/java/gerrit/PRED_get_legacy_label_types_1.java b/gerrit-server/src/main/java/gerrit/PRED_get_legacy_label_types_1.java
deleted file mode 100644
index 2c76999..0000000
--- a/gerrit-server/src/main/java/gerrit/PRED_get_legacy_label_types_1.java
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright (C) 2011 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 gerrit;
-
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.LabelValue;
-import com.google.gerrit.rules.StoredValues;
-import com.google.gwtorm.server.OrmException;
-import com.googlecode.prolog_cafe.exceptions.JavaException;
-import com.googlecode.prolog_cafe.exceptions.PrologException;
-import com.googlecode.prolog_cafe.lang.IntegerTerm;
-import com.googlecode.prolog_cafe.lang.ListTerm;
-import com.googlecode.prolog_cafe.lang.Operation;
-import com.googlecode.prolog_cafe.lang.Predicate;
-import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.StructureTerm;
-import com.googlecode.prolog_cafe.lang.SymbolTerm;
-import com.googlecode.prolog_cafe.lang.Term;
-import java.util.List;
-
-/**
- * Obtain a list of label types from the server configuration.
- *
- * <p>Unifies to a Prolog list of: {@code label_type(Label, Fun, Min, Max)} where:
- *
- * <ul>
- *   <li>{@code Label} - the newer style label name
- *   <li>{@code Fun} - legacy function name
- *   <li>{@code Min, Max} - the smallest and largest configured values.
- * </ul>
- */
-class PRED_get_legacy_label_types_1 extends Predicate.P1 {
-  private static final SymbolTerm NONE = SymbolTerm.intern("none");
-
-  PRED_get_legacy_label_types_1(Term a1, Operation n) {
-    arg1 = a1;
-    cont = n;
-  }
-
-  @Override
-  public Operation exec(Prolog engine) throws PrologException {
-    engine.setB0();
-    Term a1 = arg1.dereference();
-    List<LabelType> list;
-    try {
-      list = StoredValues.CHANGE_DATA.get(engine).getLabelTypes().getLabelTypes();
-    } catch (OrmException err) {
-      throw new JavaException(this, 1, err);
-    }
-    Term head = Prolog.Nil;
-    for (int idx = list.size() - 1; 0 <= idx; idx--) {
-      head = new ListTerm(export(list.get(idx)), head);
-    }
-
-    if (!a1.unify(head, engine.trail)) {
-      return engine.fail();
-    }
-    return cont;
-  }
-
-  static final SymbolTerm symLabelType = SymbolTerm.intern("label_type", 4);
-
-  static Term export(LabelType type) {
-    LabelValue min = type.getMin();
-    LabelValue max = type.getMax();
-    return new StructureTerm(
-        symLabelType,
-        SymbolTerm.intern(type.getName()),
-        SymbolTerm.intern(type.getFunction().getFunctionName()),
-        min != null ? new IntegerTerm(min.getValue()) : NONE,
-        max != null ? new IntegerTerm(max.getValue()) : NONE);
-  }
-}
diff --git a/gerrit-server/src/main/java/gerrit/PRED_project_default_submit_type_1.java b/gerrit-server/src/main/java/gerrit/PRED_project_default_submit_type_1.java
deleted file mode 100644
index 1d96433..0000000
--- a/gerrit-server/src/main/java/gerrit/PRED_project_default_submit_type_1.java
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright (C) 2012 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 gerrit;
-
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.rules.StoredValues;
-import com.google.gerrit.server.project.ProjectState;
-import com.googlecode.prolog_cafe.exceptions.PrologException;
-import com.googlecode.prolog_cafe.lang.Operation;
-import com.googlecode.prolog_cafe.lang.Predicate;
-import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.SymbolTerm;
-import com.googlecode.prolog_cafe.lang.Term;
-
-public class PRED_project_default_submit_type_1 extends Predicate.P1 {
-
-  private static final SymbolTerm[] term;
-
-  static {
-    SubmitType[] val = SubmitType.values();
-    term = new SymbolTerm[val.length];
-    for (int i = 0; i < val.length; i++) {
-      term[i] = SymbolTerm.create(val[i].name());
-    }
-  }
-
-  public PRED_project_default_submit_type_1(Term a1, Operation n) {
-    arg1 = a1;
-    cont = n;
-  }
-
-  @Override
-  public Operation exec(Prolog engine) throws PrologException {
-    engine.setB0();
-    Term a1 = arg1.dereference();
-
-    ProjectState projectState = StoredValues.PROJECT_STATE.get(engine);
-    SubmitType submitType = projectState.getProject().getSubmitType();
-    if (!a1.unify(term[submitType.ordinal()], engine.trail)) {
-      return engine.fail();
-    }
-    return cont;
-  }
-}
diff --git a/gerrit-server/src/main/java/gerrit/PRED_pure_revert_1.java b/gerrit-server/src/main/java/gerrit/PRED_pure_revert_1.java
deleted file mode 100644
index f3721fb..0000000
--- a/gerrit-server/src/main/java/gerrit/PRED_pure_revert_1.java
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (C) 2017 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 gerrit;
-
-import com.google.gerrit.rules.StoredValues;
-import com.google.gwtorm.server.OrmException;
-import com.googlecode.prolog_cafe.exceptions.JavaException;
-import com.googlecode.prolog_cafe.exceptions.PrologException;
-import com.googlecode.prolog_cafe.lang.IntegerTerm;
-import com.googlecode.prolog_cafe.lang.Operation;
-import com.googlecode.prolog_cafe.lang.Predicate;
-import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.Term;
-
-/** Checks if change is a pure revert of the change it references in 'revertOf'. */
-public class PRED_pure_revert_1 extends Predicate.P1 {
-  public PRED_pure_revert_1(Term a1, Operation n) {
-    arg1 = a1;
-    cont = n;
-  }
-
-  @Override
-  public Operation exec(Prolog engine) throws PrologException {
-    engine.setB0();
-    Term a1 = arg1.dereference();
-
-    Boolean isPureRevert;
-    try {
-      isPureRevert = StoredValues.CHANGE_DATA.get(engine).isPureRevert();
-    } catch (OrmException e) {
-      throw new JavaException(this, 1, e);
-    }
-    if (!a1.unify(new IntegerTerm(Boolean.TRUE.equals(isPureRevert) ? 1 : 0), engine.trail)) {
-      return engine.fail();
-    }
-    return cont;
-  }
-}
diff --git a/gerrit-server/src/main/java/gerrit/PRED_unresolved_comments_count_1.java b/gerrit-server/src/main/java/gerrit/PRED_unresolved_comments_count_1.java
deleted file mode 100644
index 10d5520..0000000
--- a/gerrit-server/src/main/java/gerrit/PRED_unresolved_comments_count_1.java
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (C) 2017 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 gerrit;
-
-import com.google.gerrit.rules.StoredValues;
-import com.google.gwtorm.server.OrmException;
-import com.googlecode.prolog_cafe.exceptions.JavaException;
-import com.googlecode.prolog_cafe.exceptions.PrologException;
-import com.googlecode.prolog_cafe.lang.IntegerTerm;
-import com.googlecode.prolog_cafe.lang.Operation;
-import com.googlecode.prolog_cafe.lang.Predicate;
-import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.Term;
-
-public class PRED_unresolved_comments_count_1 extends Predicate.P1 {
-  public PRED_unresolved_comments_count_1(Term a1, Operation n) {
-    arg1 = a1;
-    cont = n;
-  }
-
-  @Override
-  public Operation exec(Prolog engine) throws PrologException {
-    engine.setB0();
-    Term a1 = arg1.dereference();
-
-    try {
-      Integer count = StoredValues.CHANGE_DATA.get(engine).unresolvedCommentCount();
-      if (!a1.unify(new IntegerTerm(count != null ? count : 0), engine.trail)) {
-        return engine.fail();
-      }
-    } catch (OrmException err) {
-      throw new JavaException(this, 1, err);
-    }
-    return cont;
-  }
-}
diff --git a/gerrit-server/src/main/java/gerrit/PRED_uploader_1.java b/gerrit-server/src/main/java/gerrit/PRED_uploader_1.java
deleted file mode 100644
index 77d31d9..0000000
--- a/gerrit-server/src/main/java/gerrit/PRED_uploader_1.java
+++ /dev/null
@@ -1,61 +0,0 @@
-// 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.
-
-package gerrit;
-
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.rules.StoredValues;
-import com.googlecode.prolog_cafe.exceptions.PrologException;
-import com.googlecode.prolog_cafe.lang.IntegerTerm;
-import com.googlecode.prolog_cafe.lang.Operation;
-import com.googlecode.prolog_cafe.lang.Predicate;
-import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.StructureTerm;
-import com.googlecode.prolog_cafe.lang.SymbolTerm;
-import com.googlecode.prolog_cafe.lang.Term;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class PRED_uploader_1 extends Predicate.P1 {
-  private static final Logger log = LoggerFactory.getLogger(PRED_uploader_1.class);
-
-  private static final SymbolTerm user = SymbolTerm.intern("user", 1);
-
-  public PRED_uploader_1(Term a1, Operation n) {
-    arg1 = a1;
-    cont = n;
-  }
-
-  @Override
-  public Operation exec(Prolog engine) throws PrologException {
-    engine.setB0();
-    Term a1 = arg1.dereference();
-
-    PatchSet patchSet = StoredValues.getPatchSet(engine);
-    if (patchSet == null) {
-      log.error(
-          "Failed to load current patch set of change "
-              + StoredValues.getChange(engine).getChangeId());
-      return engine.fail();
-    }
-
-    Account.Id uploaderId = patchSet.getUploader();
-
-    if (!a1.unify(new StructureTerm(user, new IntegerTerm(uploaderId.get())), engine.trail)) {
-      return engine.fail();
-    }
-    return cont;
-  }
-}
diff --git a/gerrit-server/src/main/prolog/gerrit_common.pl b/gerrit-server/src/main/prolog/gerrit_common.pl
deleted file mode 100644
index 8fd0657..0000000
--- a/gerrit-server/src/main/prolog/gerrit_common.pl
+++ /dev/null
@@ -1,510 +0,0 @@
-%% Copyright (C) 2011 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 gerrit.
-'$init' :- init.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%
-%% init:
-%%
-%%   Initialize the module's private state. These typically take the form of global
-%%   aliased hashes carrying "constant" data about the current change for any
-%%   predicate that needs to obtain it.
-%%
-init :-
-  define_hash(commit_labels).
-
-define_hash(A) :- hash_exists(A), !, hash_clear(A).
-define_hash(A) :- atom(A), !, new_hash(_, [alias(A)]).
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%
-%% commit_label/2:
-%%
-%% During rule evaluation of a change, this predicate is defined to
-%% be a table of labels that pertain to the commit of interest.
-%%
-%%   commit_label( label('Code-Review', 2), user(12345789) ).
-%%   commit_label( label('Verified', -1), user(8181) ).
-%%
-:- public commit_label/2.
-%%
-commit_label(L, User) :- L = label(H, _),
-  atom(H),
-  !,
-  hash_get(commit_labels, H, Cached),
-  ( [] == Cached ->
-    get_commit_labels(_),
-    hash_get(commit_labels, H, Rs), !
-    ;
-    Rs = Cached
-  ),
-  scan_commit_labels(Rs, L, User)
-  .
-commit_label(Label, User) :-
-  get_commit_labels(Rs),
-  scan_commit_labels(Rs, Label, User).
-
-scan_commit_labels([R | Rs], L, U) :- R = commit_label(L, U).
-scan_commit_labels([_ | Rs], L, U) :- scan_commit_labels(Rs, L, U).
-scan_commit_labels([], _, _) :- fail.
-
-get_commit_labels(Rs) :-
-  hash_contains_key(commit_labels, '$all'),
-  !,
-  hash_get(commit_labels, '$all', Rs)
-  .
-get_commit_labels(Rs) :-
-  '_load_commit_labels'(Rs),
-  set_commit_labels(Rs).
-
-set_commit_labels(Rs) :-
-  define_hash(commit_labels),
-  hash_put(commit_labels, '$all', Rs),
-  index_commit_labels(Rs).
-
-index_commit_labels([]).
-index_commit_labels([R | Rs]) :-
-  R = commit_label(label(H, _), _),
-  atom(H),
-  !,
-  hash_get(commit_labels, H, Tmp),
-  hash_put(commit_labels, H, [R | Tmp]),
-  index_commit_labels(Rs)
-  .
-index_commit_labels([_ | Rs]) :-
-  index_commit_labels(Rs).
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%
-%% check_user_label/3:
-%%
-%%   Check Who can set Label to Val.
-%%
-check_user_label(Label, Who, Val) :-
-  hash_get(commit_labels, '$fast_range', true), !,
-  atom(Label),
-  assume_range_from_label(Label, Who, Min, Max),
-  Min @=< Val, Val @=< Max.
-check_user_label(Label, Who, Val) :-
-  Who = user(_), !,
-  atom(Label),
-  current_user(Who, User),
-  '_check_user_label'(Label, User, Val).
-check_user_label(Label, test_user(Name), Val) :-
-  clause(user:test_grant(Label, test_user(Name), range(Min, Max)), _),
-  Min @=< Val, Val @=< Max
-  .
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%
-%% user_label_range/4:
-%%
-%%   Lookup the range allowed to be used.
-%%
-user_label_range(Label, Who, Min, Max) :-
-  hash_get(commit_labels, '$fast_range', true), !,
-  atom(Label),
-  assume_range_from_label(Label, Who, Min, Max).
-user_label_range(Label, Who, Min, Max) :-
-  Who = user(_), !,
-  atom(Label),
-  current_user(Who, User),
-  '_user_label_range'(Label, User, Min, Max).
-user_label_range(Label, test_user(Name), Min, Max) :-
-  clause(user:test_grant(Label, test_user(Name), range(Min, Max)), _)
-  .
-
-assume_range_from_label :-
-  hash_put(commit_labels, '$fast_range', true).
-
-assume_range_from_label(Label, Who, Min, Max) :-
-  commit_label(label(Label, Value), Who), !,
-  Min = Value, Max = Value.
-assume_range_from_label(_, _, 0, 0).
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%
-%% not_same/2:
-%%
-:- public not_same/2.
-%%
-not_same(ok(A), ok(B)) :- !, A \= B.
-not_same(label(_, ok(A)), label(_, ok(B))) :- !, A \= B.
-not_same(_, _).
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%
-%% can_submit/2:
-%%
-%%   Executes the SubmitRule for each solution until one where all of the
-%%   states has the format label(_, ok(_)) is found, then cut away any
-%%   remaining choice points leaving this as the last solution.
-%%
-:- public can_submit/2.
-%%
-can_submit(SubmitRule, S) :-
-  call_rule(SubmitRule, Tmp),
-  Tmp =.. [submit | Ls],
-  ( is_all_ok(Ls) -> S = ok(Tmp), ! ; S = not_ready(Tmp) ).
-
-call_rule(P:X, Arg) :- !, F =.. [X, Arg], P:F.
-call_rule(X, Arg) :- !, F =.. [X, Arg], F.
-
-is_all_ok([]).
-is_all_ok([label(_, ok(__)) | Ls]) :- is_all_ok(Ls).
-is_all_ok([label(_, may(__)) | Ls]) :- is_all_ok(Ls).
-is_all_ok(_) :- fail.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%
-%% locate_helper
-%%
-%%   Returns user:Func if it exists otherwise returns gerrit:Default
-
-locate_helper(Func, Default, Arity, user:Func) :-
-    '$compiled_predicate'(user, Func, Arity), !.
-locate_helper(Func, Default, Arity, user:Func) :-
-    listN(Arity, P), C =.. [Func | P], clause(user:C, _), !.
-locate_helper(Func, Default, _, gerrit:Default).
-
-listN(0, []).
-listN(N, [_|T]) :- N > 0, N1 is N - 1, listN(N1, T).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%
-%% locate_submit_rule/1:
-%%
-%%   Finds a submit_rule depending on what rules are available.
-%%   If none are available, use default_submit/1.
-%%
-:- public locate_submit_rule/1.
-%%
-
-locate_submit_rule(RuleName) :-
-  locate_helper(submit_rule, default_submit, 1, RuleName).
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%
-%% get_submit_type/2:
-%%
-%%   Executes the SubmitTypeRule and return the first solution
-%%
-:- public get_submit_type/2.
-%%
-get_submit_type(SubmitTypeRule, A) :-
-  call_rule(SubmitTypeRule, A), !.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%
-%% locate_submit_type/1:
-%%
-%%   Finds a submit_type_rule depending on what rules are available.
-%%   If none are available, use project_default_submit_type/1.
-%%
-:- public locate_submit_type/1.
-%%
-locate_submit_type(RuleName) :-
-  locate_helper(submit_type, project_default_submit_type, 1, RuleName).
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%
-%% default_submit/1:
-%%
-:- public default_submit/1.
-%%
-default_submit(P) :-
-  get_legacy_label_types(LabelTypes),
-  default_submit(LabelTypes, P).
-
-% Apply the old "all approval categories must be satisfied"
-% loop by scanning over all of the label types to build up the
-% submit record.
-%
-default_submit(LabelTypes, P) :-
-  default_submit(LabelTypes, [], Tmp),
-  reverse(Tmp, Ls),
-  P =.. [ submit | Ls].
-
-default_submit([], Out, Out).
-default_submit([Type | Types], Tmp, Out) :-
-  label_type(Label, Fun, Min, Max) = Type,
-  legacy_submit_rule(Fun, Label, Min, Max, Status),
-  R = label(Label, Status),
-  default_submit(Types, [R | Tmp], Out).
-
-
-%% legacy_submit_rule:
-%%
-%% Apply the old -2..+2 style logic.
-%%
-legacy_submit_rule('MaxWithBlock', Label, Min, Max, T) :- !, max_with_block(Label, Min, Max, T).
-legacy_submit_rule('AnyWithBlock', Label, Min, Max, T) :- !, any_with_block(Label, Min, T).
-legacy_submit_rule('MaxNoBlock', Label, Min, Max, T) :- !, max_no_block(Label, Max, T).
-legacy_submit_rule('NoBlock', Label, Min, Max, T) :- !, T = may(_).
-legacy_submit_rule('NoOp', Label, Min, Max, T) :- !, T = may(_).
-legacy_submit_rule('PatchSetLock', Label, Min, Max, T) :- !, T = may(_).
-legacy_submit_rule(Fun, Label, Min, Max, T) :- T = impossible(unsupported(Fun)).
-
-%% max_with_block:
-%%
-%% - The minimum is never used.
-%% - At least one maximum is used.
-%%
-:- public max_with_block/4.
-%%
-max_with_block(Min, Max, Label, label(Label, S)) :-
-  number(Min), number(Max), atom(Label),
-  !,
-  max_with_block(Label, Min, Max, S).
-max_with_block(Label, Min, Max, reject(Who)) :-
-  commit_label(label(Label, Min), Who),
-  !
-  .
-max_with_block(Label, Min, Max, ok(Who)) :-
-  \+ commit_label(label(Label, Min), _),
-  commit_label(label(Label, Max), Who),
-  !
-  .
-max_with_block(Label, Min, Max, need(Max)) :-
-  true
-  .
-
-%TODO Uncomment this clause when group suggesting is possible.
-%max_with_block(Label, Min, Max, need(Max, Group)) :-
-%  \+ check_label_range_permission(Label, Max, ok(_)),
-%  check_label_range_permission(Label, Max, ask(Group))
-%  .
-%max_with_block(Label, Min, Max, impossible(no_access)) :-
-%  \+ check_label_range_permission(Label, Max, ask(Group))
-%  .
-
-%% any_with_block:
-%%
-%% - The maximum is never used.
-%%
-any_with_block(Label, Min, reject(Who)) :-
-  Min < 0,
-  commit_label(label(Label, Min), Who),
-  !
-  .
-any_with_block(Label, Min, may(_)).
-
-
-%% max_no_block:
-%%
-%% - At least one maximum is used.
-%%
-max_no_block(Max, Label, label(Label, S)) :-
-  number(Max), atom(Label),
-  !,
-  max_no_block(Label, Max, S).
-max_no_block(Label, Max, ok(Who)) :-
-  commit_label(label(Label, Max), Who),
-  !
-  .
-max_no_block(Label, Max, need(Max)) :-
-  true
-  .
-%TODO Uncomment this clause when group suggesting is possible.
-%max_no_block(Label, Max, need(Max, Group)) :-
-%  check_label_range_permission(Label, Max, ask(Group))
-%  .
-%max_no_block(Label, Max, impossible(no_access)) :-
-%  \+ check_label_range_permission(Label, Max, ask(Group))
-%  .
-
-
-%% check_label_range_permission:
-%%
-check_label_range_permission(Label, ExpValue, ok(Who)) :-
-  commit_label(label(Label, ExpValue), Who),
-  check_user_label(Label, Who, ExpValue)
-  .
-%TODO Uncomment this clause when group suggesting is possible.
-%check_label_range_permission(Label, ExpValue, ask(Group)) :-
-%  grant_range(Label, Group, Min, Max),
-%  Min @=< ExpValue, ExpValue @=< Max
-%  .
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%
-%% filter_submit_results/3:
-%%
-%%   Executes the submit_filter against the given list of results,
-%%   returns a list of filtered results.
-%%
-:- public filter_submit_results/3.
-%%
-filter_submit_results(Filter, In, Out) :-
-    filter_submit_results(Filter, In, [], Tmp),
-    reverse(Tmp, Out).
-filter_submit_results(Filter, [I | In], Tmp, Out) :-
-    arg(1, I, R),
-    call_submit_filter(Filter, R, S),
-    !,
-    S =.. [submit | Ls],
-    ( is_all_ok(Ls) -> T = ok(S) ; T = not_ready(S) ),
-    filter_submit_results(Filter, In, [T | Tmp], Out).
-filter_submit_results(Filter, [_ | In], Tmp, Out) :-
-   filter_submit_results(Filter, In, Tmp, Out),
-   !
-   .
-filter_submit_results(Filter, [], Out, Out).
-
-call_submit_filter(P:X, R, S) :- !, F =.. [X, R, S], P:F.
-call_submit_filter(X, R, S) :- F =.. [X, R, S], F.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%
-%% filter_submit_type_results/3:
-%%
-%%   Executes the submit_type_filter against the result,
-%%   returns the filtered result.
-%%
-:- public filter_submit_type_results/3.
-%%
-filter_submit_type_results(Filter, In, Out) :- call_submit_filter(Filter, In, Out).
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%
-%% locate_submit_filter/1:
-%%
-%%   Finds a submit_filter if available.
-%%
-:- public locate_submit_filter/1.
-%%
-locate_submit_filter(FilterName) :-
-  locate_helper(submit_filter, noop_filter, 2, FilterName).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%
-%% noop_filter/2:
-%%
-:- public noop_filter/2.
-%%
-noop_filter(In, In).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%
-%% locate_submit_type_filter/1:
-%%
-%%   Finds a submit_type_filter if available.
-%%
-:- public locate_submit_type_filter/1.
-%%
-locate_submit_type_filter(FilterName) :-
-  locate_helper(submit_type_filter, noop_filter, 2, FilterName).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%
-%% find_label/3:
-%%
-%%   Finds labels successively and fails when there are no more results.
-%%
-:- public find_label/3.
-%%
-find_label([], _, _) :- !, fail.
-find_label(List, Name, Label) :-
-  List = [_ | _],
-  !,
-  find_label2(List, Name, Label).
-find_label(S, Name, Label) :-
-  S =.. [submit | Ls],
-  find_label2(Ls, Name, Label).
-
-find_label2([L | _ ], Name, L) :- L = label(Name, _).
-find_label2([_ | Ls], Name, L) :- find_label2(Ls, Name, L).
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%
-%% remove_label/3:
-%%
-%%   Removes all occurances of label(Name, Status).
-%%
-:- public remove_label/3.
-%%
-remove_label([], _, []) :- !.
-remove_label(List, Label, Out) :-
-  List = [_ | _],
-  !,
-  subtract1(List, Label, Out).
-remove_label(S, Label, Out) :-
-  S =.. [submit | Ls],
-  subtract1(Ls, Label, Tmp),
-  Out =.. [submit | Tmp].
-
-subtract1([], _, []) :- !.
-subtract1([E | L], E, R) :- !, subtract1(L, E, R).
-subtract1([H | L], E, [H | R]) :- subtract1(L, E, R).
-
-
-%% commit_author/1:
-%%
-:- public commit_author/1.
-%%
-commit_author(Author) :-
-  commit_author(Author, _, _).
-
-
-%% commit_committer/1:
-%%
-:- public commit_committer/1.
-%%
-commit_committer(Committer) :-
-  commit_committer(Committer, _, _).
-
-
-%% commit_delta/1:
-%%
-:- public commit_delta/1.
-%%
-commit_delta(Regex) :-
-  once(commit_delta(Regex, _, _, _)).
-
-
-%% commit_delta/3:
-%%
-:- public commit_delta/3.
-%%
-commit_delta(Regex, Type, Path) :-
-  commit_delta(Regex, TmpType, NewPath, OldPath),
-  split_commit_delta(TmpType, NewPath, OldPath, Type, Path).
-
-split_commit_delta(rename, NewPath, OldPath, delete, OldPath).
-split_commit_delta(rename, NewPath, OldPath, add, NewPath) :- !.
-split_commit_delta(copy, NewPath, OldPath, add, NewPath) :- !.
-split_commit_delta(Type, Path, _, Type, Path).
-
-
-%% commit_message_matches/1:
-%%
-:- public commit_message_matches/1.
-%%
-commit_message_matches(Pattern) :-
-  commit_message(Msg),
-  regex_matches(Pattern, Msg).
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/config/CapabilityConstants.properties b/gerrit-server/src/main/resources/com/google/gerrit/server/config/CapabilityConstants.properties
deleted file mode 100644
index 1de7eea..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/config/CapabilityConstants.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-accessDatabase = Access Database
-administrateServer = Administrate Server
-batchChangesLimit = Batch Changes Limit
-createAccount = Create Account
-createGroup = Create Group
-createProject = Create Project
-emailReviewers = Email Reviewers
-flushCaches = Flush Caches
-killTask = Kill Task
-maintainServer = Maintain Server
-modifyAccount = Modify Account
-priority = Priority
-queryLimit = Query Limit
-runAs = Run As
-runGC = Run Garbage Collection
-streamEvents = Stream Events
-viewAllAccounts = View All Accounts
-viewCaches = View Caches
-viewConnections = View Connections
-viewPlugins = View Plugins
-viewQueue = View Queue
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/Abandoned.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/Abandoned.soy
deleted file mode 100644
index 50c5fc3..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/Abandoned.soy
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * .Abandoned template will determine the contents of the email related to a
- * change being abandoned.
- * @param change
- * @param coverLetter
- * @param email
- * @param fromName
- */
-{template .Abandoned autoescape="strict" kind="text"}
-  {$fromName} has abandoned this change.
-  {if $email.changeUrl} ( {$email.changeUrl} ){/if}{\n}
-  {\n}
-  Change subject: {$change.subject}{\n}
-  ......................................................................{\n}
-  {if $coverLetter}
-    {\n}
-    {\n}
-    {$coverLetter}
-    {\n}
-  {/if}
-{/template}
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/AbandonedHtml.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/AbandonedHtml.soy
deleted file mode 100644
index c7d4699..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/AbandonedHtml.soy
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * @param coverLetter
- * @param email
- * @param fromName
- */
-{template .AbandonedHtml autoescape="strict" kind="html"}
-  <p>
-    {$fromName} <strong>abandoned</strong> this change.
-  </p>
-
-  {if $email.changeUrl}
-    <p>
-      {call .ViewChangeButton data="all" /}
-    </p>
-  {/if}
-
-  {if $coverLetter}
-    <div style="white-space:pre-wrap">{$coverLetter}</div>
-  {/if}
-{/template}
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/AddKey.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/AddKey.soy
deleted file mode 100644
index aa2b27d..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/AddKey.soy
+++ /dev/null
@@ -1,71 +0,0 @@
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * The .AddKey template will determine the contents of the email related to
- * adding a new SSH or GPG key to an account.
- * @param email
- */
-{template .AddKey autoescape="strict" kind="text"}
-  One or more new {$email.keyType} keys have been added to Gerrit Code Review at
-  {sp}{$email.gerritHost}:
-
-  {\n}
-  {\n}
-
-  {if $email.sshKey}
-    {$email.sshKey}
-  {elseif $email.gpgKeys}
-    {$email.gpgKeys}
-  {/if}
-
-  {\n}
-  {\n}
-
-  If this is not expected, please contact your Gerrit Administrators
-  immediately.
-
-  {\n}
-  {\n}
-
-  You can also manage your {$email.keyType} keys by visiting
-  {\n}
-  {if $email.sshKey}
-    {$email.gerritUrl}#/settings/ssh-keys
-  {elseif $email.gpgKeys}
-    {$email.gerritUrl}#/settings/gpg-keys
-  {/if}
-  {\n}
-  {if $email.userNameEmail}
-    (while signed in as {$email.userNameEmail})
-  {else}
-    (while signed in as {$email.email})
-  {/if}
-
-  {\n}
-  {\n}
-
-  If clicking the link above does not work, copy and paste the URL in a new
-  browser window instead.
-
-  {\n}
-  {\n}
-
-  This is a send-only email address.  Replies to this message will not be read
-  or answered.
-{/template}
\ No newline at end of file
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/AddKeyHtml.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/AddKeyHtml.soy
deleted file mode 100644
index 017fd6d..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/AddKeyHtml.soy
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * @param email
- */
-{template .AddKeyHtml autoescape="strict" kind="html"}
-  <p>
-    One or more new {$email.keyType} keys have been added to Gerrit Code Review
-    at {$email.gerritHost}:
-  </p>
-
-  {let $keyStyle kind="css"}
-    background: #f0f0f0;
-    border: 1px solid #ccc;
-    color: #555;
-    padding: 12px;
-    width: 400px;
-  {/let}
-
-  {if $email.sshKey}
-    <pre style="{$keyStyle}">{$email.sshKey}</pre>
-  {elseif $email.gpgKeys}
-    <pre style="{$keyStyle}">{$email.gpgKeys}</pre>
-  {/if}
-
-  <p>
-    If this is not expected, please contact your Gerrit Administrators
-    immediately.
-  </p>
-
-  <p>
-    You can also manage your {$email.keyType} keys by following{sp}
-    {if $email.sshKey}
-      <a href="{$email.gerritUrl}#/settings/ssh-keys">this link</a>
-    {elseif $email.gpgKeys}
-      <a href="{$email.gerritUrl}#/settings/gpg-keys">this link</a>
-    {/if}
-    {sp}
-    {if $email.userNameEmail}
-      (while signed in as {$email.userNameEmail})
-    {else}
-      (while signed in as {$email.email})
-    {/if}.
-  </p>
-
-  <p>
-    This is a send-only email address.  Replies to this message will not be read
-    or answered.
-  </p>
-{/template}
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/ChangeFooter.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/ChangeFooter.soy
deleted file mode 100644
index 37ac126..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/ChangeFooter.soy
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * The .ChangeFooter template will determine the contents of the footer text
- * that will be appended to ALL emails related to changes.
- * @param email
- */
-{template .ChangeFooter autoescape="strict" kind="text"}
-  --{sp}
-  {\n}
-
-  {if $email.changeUrl}
-    To view, visit {$email.changeUrl}{\n}
-  {/if}
-
-  {if $email.settingsUrl}
-    To unsubscribe, or for help writing mail filters,{sp}
-    visit {$email.settingsUrl}{\n}
-  {/if}
-
-  {if $email.changeUrl or $email.settingsUrl}
-    {\n}
-  {/if}
-{/template}
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/ChangeFooterHtml.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/ChangeFooterHtml.soy
deleted file mode 100644
index 00f21db..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/ChangeFooterHtml.soy
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * @param change
- * @param email
- */
-{template .ChangeFooterHtml autoescape="strict" kind="html"}
-  {if $email.changeUrl or $email.settingsUrl}
-    <p>
-      {if $email.changeUrl}
-        To view, visit{sp}
-        <a href="{$email.changeUrl}">change {$change.changeNumber}</a>.
-      {/if}
-      {if $email.changeUrl and $email.settingsUrl}{sp}{/if}
-      {if $email.settingsUrl}
-        To unsubscribe, or for help writing mail filters,{sp}
-        visit <a href="{$email.settingsUrl}">settings</a>.
-      {/if}
-    </p>
-  {/if}
-
-  {if $email.changeUrl}
-    <div itemscope itemtype="http://schema.org/EmailMessage">
-      <div itemscope itemprop="action" itemtype="http://schema.org/ViewAction">
-        <link itemprop="url" href="{$email.changeUrl}"/>
-        <meta itemprop="name" content="View Change"/>
-      </div>
-    </div>
-  {/if}
-{/template}
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/ChangeSubject.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/ChangeSubject.soy
deleted file mode 100644
index 98de6e7..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/ChangeSubject.soy
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * The .ChangeSubject template will determine the contents of the email subject
- * line for ALL emails related to changes.
- * @param branch
- * @param change
- * @param shortProjectName
- */
-{template .ChangeSubject autoescape="strict" kind="text"}
-  Change in {$shortProjectName}[{$branch.shortName}]: {$change.shortSubject}
-{/template}
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/Comment.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/Comment.soy
deleted file mode 100644
index 7bedc1c..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/Comment.soy
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * The .Comment template will determine the contents of the email related to a
- * user submitting comments on changes.
- * @param change
- * @param coverLetter
- * @param email
- * @param fromName
- * @param commentFiles
- */
-{template .Comment autoescape="strict" kind="text"}
-  {$fromName} has posted comments on this change.
-  {if $email.changeUrl} ( {$email.changeUrl} ){/if}{\n}
-  {\n}
-  Change subject: {$change.subject}{\n}
-  ......................................................................{\n}
-  {if $coverLetter}
-    {\n}
-    {\n}
-    {$coverLetter}{\n}
-    {\n}
-  {/if}
-
-  {foreach $group in $commentFiles}
-    {$group.link}{\n}
-    {$group.title}:{\n}
-    {\n}
-
-    {foreach $comment in $group.comments}
-      {if $comment.isRobotComment}
-        Robot Comment from {$comment.robotId} (run ID {$comment.robotRunId}):
-        {\n}
-      {/if}
-
-      {foreach $line in $comment.lines}
-        {if isFirst($line)}
-          {if $comment.startLine != 0}
-            {$comment.link}
-          {/if}{\n}
-          {$comment.linePrefix}
-        {else}
-          {$comment.linePrefixEmpty}
-        {/if}
-        {$line}{\n}
-      {/foreach}
-      {if length($comment.lines) == 0}
-        {$comment.linePrefix}{\n}
-      {/if}
-
-      {if $comment.parentMessage}
-        >{sp}{$comment.parentMessage}{\n}
-      {/if}
-      {$comment.message}{\n}
-      {\n}
-      {\n}
-    {/foreach}
-  {/foreach}
-  {\n}
-{/template}
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/CommentFooter.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/CommentFooter.soy
deleted file mode 100644
index 73fdfba..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/CommentFooter.soy
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * The .CommentFooter template will determine the contents of the footer text
- * that will be appended to emails related to a user submitting comments on
- * changes.
- */
-{template .CommentFooter autoescape="strict" kind="text"}
-{/template}
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/CommentFooterHtml.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/CommentFooterHtml.soy
deleted file mode 100644
index 7bf28e7..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/CommentFooterHtml.soy
+++ /dev/null
@@ -1,20 +0,0 @@
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-{template .CommentFooterHtml autoescape="strict" kind="html"}
-{/template}
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/CommentHtml.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/CommentHtml.soy
deleted file mode 100644
index 870ad46..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/CommentHtml.soy
+++ /dev/null
@@ -1,175 +0,0 @@
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * @param commentFiles
- * @param commentCount
- * @param email
- * @param labels
- * @param patchSet
- * @param patchSetCommentBlocks
- */
-{template .CommentHtml autoescape="strict" kind="html"}
-  {let $commentHeaderStyle kind="css"}
-    margin-bottom: 4px;
-  {/let}
-
-  {let $blockquoteStyle kind="css"}
-    border-left: 1px solid #aaa;
-    margin: 10px 0;
-    padding: 0 10px;
-  {/let}
-
-  {let $ulStyle kind="css"}
-    list-style: none;
-    padding: 0;
-  {/let}
-
-  {let $fileLiStyle kind="css"}
-    margin: 0;
-    padding: 0;
-  {/let}
-
-  {let $commentLiStyle kind="css"}
-    margin: 0;
-    padding: 0 0 0 16px;
-  {/let}
-
-  {let $voteStyle kind="css"}
-    border-radius: 3px;
-    display: inline-block;
-    margin: 0 2px;
-    padding: 4px;
-  {/let}
-
-  {let $positiveVoteStyle kind="css"}
-    {$voteStyle}
-    background-color: #d4ffd4;
-  {/let}
-
-  {let $negativeVoteStyle kind="css"}
-    {$voteStyle}
-    background-color: #ffd4d4;
-  {/let}
-
-  {let $neutralVoteStyle kind="css"}
-    {$voteStyle}
-    background-color: #ddd;
-  {/let}
-
-  {if $patchSetCommentBlocks}
-    {call .WikiFormat}{param content: $patchSetCommentBlocks /}{/call}
-  {/if}
-
-  {if length($labels) > 0}
-    <p>
-      Patch set {$patchSet.patchSetId}:
-      {foreach $label in $labels}
-        {if $label.value > 0}
-          <span style="{$positiveVoteStyle}">
-            {$label.label}{sp}+{$label.value}
-          </span>
-        {elseif $label.value < 0}
-          <span style="{$negativeVoteStyle}">
-            {$label.label}{sp}{$label.value}
-          </span>
-        {else}
-          <span style="{$neutralVoteStyle}">
-            -{$label.label}
-          </span>
-        {/if}
-      {/foreach}
-    </p>
-  {/if}
-
-  {if $email.changeUrl}
-    <p>
-      {call .ViewChangeButton data="all" /}
-    </p>
-  {/if}
-
-  {if $commentCount == 1}
-    <p>1 comment:</p>
-  {elseif $commentCount > 1}
-    <p>{$commentCount} comments:</p>
-  {/if}
-
-  <ul style="{$ulStyle}">
-    {foreach $group in $commentFiles}
-      <li style="{$fileLiStyle}">
-        <p>
-          <a href="{$group.link}">{$group.title}:</a>
-        </p>
-
-        <ul style="{$ulStyle}">
-          {foreach $comment in $group.comments}
-            <li style="{$commentLiStyle}">
-              {if $comment.isRobotComment}
-                <p style="{$commentHeaderStyle}">
-                  Robot Comment from{sp}
-                  {if $comment.robotUrl}<a href="{$comment.robotUrl}">{/if}
-                  {$comment.robotId}
-                  {if $comment.robotUrl}</a>{/if}{sp}
-                  (run ID {$comment.robotRunId}):
-                </p>
-              {/if}
-
-              <p style="{$commentHeaderStyle}">
-                <a href="{$comment.link}">
-                  {if $comment.startLine == 0}
-                    Patch Set #{$group.patchSetId}:
-                  {else}
-                    Patch Set #{$group.patchSetId},{sp}
-                    Line {$comment.startLine}:
-                  {/if}
-                </a>{sp}
-                {if length($comment.lines) == 1}
-                  <code style="font-family:monospace,monospace">
-                    {$comment.lines[0]}
-                  </code>
-                {/if}
-              </p>
-
-              {if length($comment.lines) > 1}
-                <p>
-                  <blockquote style="{$blockquoteStyle}">
-                    {call .Pre}{param content kind="html"}
-                      {foreach $line in $comment.lines}
-                        {$line}{\n}
-                      {/foreach}
-                    {/param}{/call}
-                  </blockquote>
-                </p>
-              {/if}
-
-              {if $comment.parentMessage}
-                <p>
-                  <blockquote style="{$blockquoteStyle}">
-                    {$comment.parentMessage}
-                  </blockquote>
-                </p>
-              {/if}
-
-              {call .WikiFormat}{param content: $comment.messageBlocks /}{/call}
-            </li>
-          {/foreach}
-        </ul>
-      </li>
-    {/foreach}
-  </ul>
-{/template}
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/DeleteReviewer.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/DeleteReviewer.soy
deleted file mode 100644
index 888ee4b..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/DeleteReviewer.soy
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * The .DeleteReviewer template will determine the contents of the email related
- * to removal of a reviewer (and the reviewer's votes) from reviews.
- * @param change
- * @param coverLetter
- * @param email
- * @param fromName
- */
-{template .DeleteReviewer autoescape="strict" kind="text"}
-  {$fromName} has removed{sp}
-  {foreach $reviewerName in $email.reviewerNames}
-    {if not isFirst($reviewerName)},{sp}{/if}
-    {$reviewerName}
-  {/foreach}{sp}
-  from this change.{sp}
-  {if $email.changeUrl} ( {$email.changeUrl} ){/if}{\n}
-  {\n}
-  Change subject: {$change.subject}{\n}
-  ......................................................................{\n}
-  {if $coverLetter}
-    {\n}
-    {\n}
-    {$coverLetter}
-    {\n}
-  {/if}
-{/template}
\ No newline at end of file
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/DeleteReviewerHtml.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/DeleteReviewerHtml.soy
deleted file mode 100644
index 5faa411..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/DeleteReviewerHtml.soy
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * @param email
- * @param fromName
- */
-{template .DeleteReviewerHtml autoescape="strict" kind="html"}
-  <p>
-    {$fromName}{sp}
-    <strong>
-      removed{sp}
-      {foreach $reviewerName in $email.reviewerNames}
-        {if not isFirst($reviewerName)}
-          {if isLast($reviewerName)}{sp}and{else},{/if}{sp}
-        {/if}
-        {$reviewerName}
-      {/foreach}
-    </strong>{sp}
-    from this change.
-  </p>
-
-  {if $email.changeUrl}
-    <p>
-      {call .ViewChangeButton data="all" /}
-    </p>
-  {/if}
-{/template}
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/DeleteVote.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/DeleteVote.soy
deleted file mode 100644
index b249ded..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/DeleteVote.soy
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * The .DeleteVote template will determine the contents of the email related
- * to removing votes on changes.
- * @param change
- * @param coverLetter
- * @param fromName
- */
-{template .DeleteVote autoescape="strict" kind="text"}
-  {$fromName} has removed a vote on this change.{\n}
-  {\n}
-  Change subject: {$change.subject}{\n}
-  ......................................................................{\n}
-  {if $coverLetter}
-    {\n}
-    {\n}
-    {$coverLetter}
-    {\n}
-  {/if}
-{/template}
\ No newline at end of file
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/DeleteVoteHtml.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/DeleteVoteHtml.soy
deleted file mode 100644
index 3d76ae2..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/DeleteVoteHtml.soy
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * @param coverLetter
- * @param email
- * @param fromName
- */
-{template .DeleteVoteHtml autoescape="strict" kind="html"}
-  <p>
-    {$fromName} <strong>removed a vote</strong> from this change.
-  </p>
-
-  {if $email.changeUrl}
-    <p>
-      {call .ViewChangeButton data="all" /}
-    </p>
-  {/if}
-
-  {if $coverLetter}
-    <div style="white-space:pre-wrap">{$coverLetter}</div>
-  {/if}
-{/template}
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/Footer.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/Footer.soy
deleted file mode 100644
index 24db2fd..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/Footer.soy
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * 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.
-*/
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * The .Footer template will determine the contents of the footer text
- * appended to the end of all outgoing emails after the ChangeFooter and
- * CommentFooter.
- * @param footers
- */
-{template .Footer autoescape="strict" kind="text"}
-  {foreach $footer in $footers}
-    {$footer}{\n}
-  {/foreach}
-{/template}
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/FooterHtml.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/FooterHtml.soy
deleted file mode 100644
index 9f9c503..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/FooterHtml.soy
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * 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.
-*/
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * @param footers
- */
-{template .FooterHtml autoescape="strict" kind="html"}
-  {\n}
-  {\n}
-  {foreach $footer in $footers}
-    <div style="display:none">{sp}{$footer}{sp}</div>{\n}
-  {/foreach}
-  {\n}
-{/template}
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/HeaderHtml.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/HeaderHtml.soy
deleted file mode 100644
index fdc3fee..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/HeaderHtml.soy
+++ /dev/null
@@ -1,20 +0,0 @@
-/**
- * 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.
-*/
-
-{namespace com.google.gerrit.server.mail.template}
-
-{template .HeaderHtml autoescape="strict" kind="html"}
-{/template}
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/Merged.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/Merged.soy
deleted file mode 100644
index d483264..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/Merged.soy
+++ /dev/null
@@ -1,42 +0,0 @@
-
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * The .Merged template will determine the contents of the email related to
- * a change successfully merged to the head.
- * @param change
- * @param email
- * @param fromName
- */
-{template .Merged autoescape="strict" kind="text"}
-  {$fromName} has submitted this change and it was merged.
-  {if $email.changeUrl} ( {$email.changeUrl} ){/if}{\n}
-  {\n}
-  Change subject: {$change.subject}{\n}
-  ......................................................................{\n}
-  {\n}
-  {$email.changeDetail}
-  {$email.approvals}
-  {if $email.includeDiff}
-    {\n}
-    {\n}
-    {$email.unifiedDiff}
-    {\n}
-  {/if}
-{/template}
\ No newline at end of file
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/MergedHtml.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/MergedHtml.soy
deleted file mode 100644
index 927601b..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/MergedHtml.soy
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * @param diffLines
- * @param email
- * @param fromName
- */
-{template .MergedHtml autoescape="strict" kind="html"}
-  <p>
-    {$fromName} <strong>merged</strong> this change.
-  </p>
-
-  {if $email.changeUrl}
-    <p>
-      {call .ViewChangeButton data="all" /}
-    </p>
-  {/if}
-
-  <div style="white-space:pre-wrap">{$email.approvals}</div>
-
-  {call .Pre}{param content: $email.changeDetail /}{/call}
-
-  {if $email.includeDiff}
-    {call .UnifiedDiff}{param diffLines: $diffLines /}{/call}
-  {/if}
-{/template}
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/NewChange.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/NewChange.soy
deleted file mode 100644
index 9f7429f..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/NewChange.soy
+++ /dev/null
@@ -1,81 +0,0 @@
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * The .NewChange template will determine the contents of the email related to a
- * user submitting a new change for review.
- * @param change
- * @param email
- * @param ownerName
- * @param patchSet
- * @param projectName
- */
-{template .NewChange autoescape="strict" kind="text"}
-  {if $email.reviewerNames}
-    Hello{sp}
-    {foreach $reviewerName in $email.reviewerNames}
-      {if not isFirst($reviewerName)},{sp}{/if}
-      {$reviewerName}
-    {/foreach},
-
-    {\n}
-    {\n}
-
-    I'd like you to do a code review.
-
-    {if $email.changeUrl}
-      {sp}Please visit
-
-      {\n}
-      {\n}
-
-      {sp}{sp}{sp}{sp}{$email.changeUrl}
-
-      {\n}
-      {\n}
-
-      to review the following change.
-    {/if}
-  {else}
-    {$ownerName} has uploaded this change for review.
-    {if $email.changeUrl} ( {$email.changeUrl}{/if}
-  {/if}{\n}
-
-  {\n}
-  {\n}
-
-  Change subject: {$change.subject}{\n}
-  ......................................................................{\n}
-
-  {\n}
-
-  {$email.changeDetail}{\n}
-
-  {if $email.sshHost}
-    {\n}
-    {sp}{sp}git pull ssh:{print '//'}{$email.sshHost}/{$projectName}
-        {sp}{$patchSet.refName}
-    {\n}
-  {/if}
-
-  {if $email.includeDiff}
-    {\n}
-    {$email.unifiedDiff}
-    {\n}
-  {/if}
-{/template}
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/NewChangeHtml.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/NewChangeHtml.soy
deleted file mode 100644
index 8026666..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/NewChangeHtml.soy
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * @param diffLines
- * @param email
- * @param fromName
- * @param ownerName
- * @param patchSet
- * @param projectName
- */
-{template .NewChangeHtml autoescape="strict" kind="html"}
-  <p>
-    {if $email.reviewerNames}
-      {$fromName} would like{sp}
-      {foreach $reviewerName in $email.reviewerNames}
-        {if not isFirst($reviewerName)}
-          {if isLast($reviewerName)}{sp}and{else},{/if}{sp}
-        {/if}
-        {$reviewerName}
-      {/foreach}{sp}
-      to <strong>review</strong> this change.
-    {else}
-      {$ownerName} has uploaded this change for <strong>review</strong>.
-    {/if}
-  </p>
-
-  {if $email.changeUrl}
-    <p>
-      {call .ViewChangeButton data="all" /}
-    </p>
-  {/if}
-
-  {call .Pre}{param content: $email.changeDetail /}{/call}
-
-  {if $email.sshHost}
-    {call .Pre}{param content kind="html"}
-      git pull ssh:{print '//'}{$email.sshHost}/{$projectName}
-          {sp}{$patchSet.refName}
-    {/param}{/call}
-  {/if}
-
-  {if $email.includeDiff}
-    {call .UnifiedDiff}{param diffLines: $diffLines /}{/call}
-  {/if}
-{/template}
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/Private.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/Private.soy
deleted file mode 100644
index b26535b..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/Private.soy
+++ /dev/null
@@ -1,121 +0,0 @@
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-/*
- * Private templates that cannot be overridden.
- */
-
-/**
- * Private template to generate "View Change" buttons.
- * @param email
- */
-{template .ViewChangeButton autoescape="strict" kind="html"}
-  <a href="{$email.changeUrl}">View Change</a>
-{/template}
-
-/**
- * Private template to render PRE block with consistent font-sizing.
- * @param content
- */
-{template .Pre autoescape="strict" kind="html"}
-  {let $preStyle kind="css"}
-    font-family: monospace,monospace; // Use this to avoid browsers scaling down
-                                      // monospace text.
-    white-space: pre-wrap;
-  {/let}
-  <pre style="{$preStyle}">{$content|changeNewlineToBr}</pre>
-{/template}
-
-/**
- * Take a list of unescaped comment blocks and emit safely escaped HTML to
- * render it nicely with wiki-like format.
- *
- * Each block is a map with a type key. When the type is 'paragraph', or 'pre',
- * it also has a 'text' key that maps to the unescaped text content for the
- * block. If the type is 'list', the map will have a 'items' key which maps to
- * list of unescaped list item strings. If the type is quote, the map will have
- * a 'quotedBlocks' key which maps to the blocks contained within the quote.
- *
- * This mechanism encodes as little structure as possible in order to depend on
- * the Soy autoescape mechanism for all of the content.
- *
- * @param content
- */
-{template .WikiFormat autoescape="strict" kind="html"}
-  {let $blockquoteStyle kind="css"}
-    border-left: 1px solid #aaa;
-    margin: 10px 0;
-    padding: 0 10px;
-  {/let}
-
-  {let $pStyle kind="css"}
-    white-space: pre-wrap;
-    word-wrap: break-word;
-  {/let}
-
-  {foreach $block in $content}
-    {if $block.type == 'paragraph'}
-      <p style="{$pStyle}">{$block.text|changeNewlineToBr}</p>
-    {elseif $block.type == 'quote'}
-      <blockquote style="{$blockquoteStyle}">
-        {call .WikiFormat}{param content: $block.quotedBlocks /}{/call}
-      </blockquote>
-    {elseif $block.type == 'pre'}
-      {call .Pre}{param content: $block.text /}{/call}
-    {elseif $block.type == 'list'}
-      <ul>
-        {foreach $item in $block.items}
-          <li>{$item}</li>
-        {/foreach}
-      </ul>
-    {/if}
-  {/foreach}
-{/template}
-
-/**
- * @param diffLines
- */
-{template .UnifiedDiff autoescape="strict" kind="html"}
-  {let $addStyle kind="css"}
-    color: hsl(120, 100%, 40%);
-  {/let}
-
-  {let $removeStyle kind="css"}
-    color: hsl(0, 100%, 40%);
-  {/let}
-
-  {let $preStyle kind="css"}
-    font-family: monospace,monospace; // Use this to avoid browsers scaling down
-                                      // monospace text.
-    white-space: pre-wrap;
-  {/let}
-
-  <pre style="{$preStyle}">
-    {foreach $line in $diffLines}
-      {if $line.type == 'add'}
-        <span style="{$addStyle}">
-      {elseif $line.type == 'remove'}
-        <span style="{$removeStyle}">
-      {else}
-        <span>
-      {/if}
-        {$line.text}
-      </span><br>
-    {/foreach}
-  </pre>
-{/template}
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/RegisterNewEmail.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/RegisterNewEmail.soy
deleted file mode 100644
index 2b30ae6..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/RegisterNewEmail.soy
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * The .RegisterNewEmail template will determine the contents of the email
- * related to registering new email accounts.
- * @param email
- */
-{template .RegisterNewEmail autoescape="strict" kind="text"}
-  Welcome to Gerrit Code Review at {$email.gerritHost}.{\n}
-
-  {\n}
-
-  To add a verified email address to your user account, please{\n}
-  click on the following link
-  {if $email.userNameEmail}
-    {sp}while signed in as {$email.userNameEmail}
-  {/if}:{\n}
-
-  {\n}
-
-  {$email.gerritUrl}#/VE/{$email.emailRegistrationToken}{\n}
-
-  {\n}
-
-  If you have received this mail in error, you do not need to take any{\n}
-  action to cancel the account.  The address will not be activated, and{\n}
-  you will not receive any further emails.{\n}
-
-  {\n}
-
-  If clicking the link above does not work, copy and paste the URL in a{\n}
-  new browser window instead.{\n}
-
-  {\n}
-
-  This is a send-only email address.  Replies to this message will not{\n}
-  be read or answered.{\n}
-{/template}
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/ReplacePatchSet.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/ReplacePatchSet.soy
deleted file mode 100644
index e41bdda..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/ReplacePatchSet.soy
+++ /dev/null
@@ -1,63 +0,0 @@
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * The .ReplacePatchSet template will determine the contents of the email
- * related to a user submitting a new patchset for a change.
- * @param change
- * @param email
- * @param fromEmail
- * @param fromName
- * @param patchSet
- * @param projectName
- */
-{template .ReplacePatchSet autoescape="strict" kind="text"}
-  {if $email.reviewerNames and $fromEmail == $change.ownerEmail}
-    Hello{sp}
-    {foreach $reviewerName in $email.reviewerNames}
-      {$reviewerName},{sp}
-    {/foreach}{\n}
-    {\n}
-    I'd like you to reexamine a change.
-    {if $email.changeUrl}
-      {sp}Please visit
-      {\n}
-      {\n}
-      {sp}{sp}{sp}{sp}{$email.changeUrl}
-      {\n}
-      {\n}
-      to look at the new patch set (#{$patchSet.patchSetId}).
-    {/if}
-  {else}
-    {$fromName} has uploaded a new patch set (#{$patchSet.patchSetId})
-    {if $fromEmail != $change.ownerEmail}
-      {sp}to the change originally created by {$change.ownerName}
-    {/if}.
-    {if $email.changeUrl} ( {$email.changeUrl} ){/if}
-  {/if}{\n}
-  {\n}
-  Change subject: {$change.subject}{\n}
-  ......................................................................{\n}
-  {\n}
-  {$email.changeDetail}{\n}
-  {if $email.sshHost}
-    {sp}{sp}git pull ssh:{print '//'}{$email.sshHost}/{$projectName}{sp}
-        {$patchSet.refName}
-    {\n}
-  {/if}
-{/template}
\ No newline at end of file
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/ReplacePatchSetHtml.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/ReplacePatchSetHtml.soy
deleted file mode 100644
index 05c60a1..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/ReplacePatchSetHtml.soy
+++ /dev/null
@@ -1,52 +0,0 @@
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * @param change
- * @param email
- * @param fromName
- * @param fromEmail
- * @param patchSet
- * @param projectName
- */
-{template .ReplacePatchSetHtml autoescape="strict" kind="html"}
-  <p>
-    {$fromName} <strong>uploaded patch set #{$patchSet.patchSetId}</strong>{sp}
-    to{sp}
-    {if $fromEmail == $change.ownerEmail}
-      this change.
-    {else}
-      the change originally created by {$change.ownerName}.
-    {/if}
-  </p>
-
-  {if $email.changeUrl}
-    <p>
-      {call .ViewChangeButton data="all" /}
-    </p>
-  {/if}
-
-  {call .Pre}{param content: $email.changeDetail /}{/call}
-
-  {if $email.sshHost}
-    {call .Pre}{param content kind="html"}
-      git pull ssh:{print '//'}{$email.sshHost}/{$projectName}{sp}
-          {$patchSet.refName}
-    {/param}{/call}
-  {/if}
-{/template}
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/Restored.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/Restored.soy
deleted file mode 100644
index 14ae0f3..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/Restored.soy
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * The .Restored template will determine the contents of the email related to a
- * change being restored.
- * @param change
- * @param coverLetter
- * @param email
- * @param fromName
- */
-{template .Restored autoescape="strict" kind="text"}
-  {$fromName} has restored this change.
-  {if $email.changeUrl} ( {$email.changeUrl} ){/if}{\n}
-  {\n}
-  Change subject: {$change.subject}{\n}
-  ......................................................................{\n}
-  {if $coverLetter}
-    {\n}
-    {\n}
-    {$coverLetter}
-    {\n}
-  {/if}
-{/template}
\ No newline at end of file
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/RestoredHtml.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/RestoredHtml.soy
deleted file mode 100644
index ea4f615..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/RestoredHtml.soy
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * @param email
- * @param fromName
- */
-{template .RestoredHtml autoescape="strict" kind="html"}
-  <p>
-    {$fromName} <strong>restored</strong> this change.
-  </p>
-
-  {if $email.changeUrl}
-    <p>
-      {call .ViewChangeButton data="all" /}
-    </p>
-  {/if}
-{/template}
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/Reverted.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/Reverted.soy
deleted file mode 100644
index cc3d2c9..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/Reverted.soy
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * The .Reverted template will determine the contents of the email related
- * to a change being reverted.
- * @param change
- * @param coverLetter
- * @param email
- * @param fromName
- */
-{template .Reverted autoescape="strict" kind="text"}
-  {$fromName} has created a revert of this change.
-  {if $email.changeUrl} ( {$email.changeUrl} ){/if}{\n}
-  {\n}
-  Change subject: {$change.subject}{\n}
-  ......................................................................{\n}
-  {if $coverLetter}
-    {\n}
-    {\n}
-    {$coverLetter}
-    {\n}
-  {/if}
-{/template}
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/RevertedHtml.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/RevertedHtml.soy
deleted file mode 100644
index ff3cf24..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/RevertedHtml.soy
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * @param email
- * @param fromName
- */
-{template .RevertedHtml autoescape="strict" kind="html"}
-  <p>
-    {$fromName} has <strong>created a revert</strong> of this change.
-  </p>
-
-  {if $email.changeUrl}
-    <p>
-      {call .ViewChangeButton data="all" /}
-    </p>
-  {/if}
-{/template}
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/SetAssignee.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/SetAssignee.soy
deleted file mode 100644
index ca4f267..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/SetAssignee.soy
+++ /dev/null
@@ -1,71 +0,0 @@
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * The .SetAssignee template will determine the contents of the email related
- * to a user being assigned to a change.
- * @param change
- * @param email
- * @param fromName
- * @param patchSet
- * @param projectName
- */
-{template .SetAssignee autoescape="strict" kind="text"}
-  Hello{sp}
-  {$email.assigneeName},
-
-  {\n}
-  {\n}
-
-  {$fromName} has assigned a change to you.
-
-  {sp}Please visit
-
-  {\n}
-  {\n}
-
-  {sp}{sp}{sp}{sp}{$email.changeUrl}
-
-  {\n}
-  {\n}
-
-  to view the change.
-
-  {\n}
-  {\n}
-
-  Change subject: {$change.subject}{\n}
-  ......................................................................{\n}
-
-  {\n}
-
-  {$email.changeDetail}{\n}
-
-  {if $email.sshHost}
-    {\n}
-    {sp}{sp}git pull ssh:{print '//'}{$email.sshHost}/{$projectName}
-        {sp}{$patchSet.refName}
-    {\n}
-  {/if}
-
-  {if $email.includeDiff}
-    {\n}
-    {$email.unifiedDiff}
-    {\n}
-  {/if}
-{/template}
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/SetAssigneeHtml.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/SetAssigneeHtml.soy
deleted file mode 100644
index 31cfbd6..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/SetAssigneeHtml.soy
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * @param diffLines
- * @param email
- * @param fromName
- * @param patchSet
- * @param projectName
- */
-{template .SetAssigneeHtml autoescape="strict" kind="html"}
-  <p>
-    {$fromName} has <strong>assigned</strong> a change to{sp}
-    {$email.assigneeName}.{sp}
-  </p>
-
-  {if $email.changeUrl}
-    <p>
-      {call .ViewChangeButton data="all" /}
-    </p>
-  {/if}
-
-  {call .Pre}{param content: $email.changeDetail /}{/call}
-
-  {if $email.sshHost}
-    {call .Pre}{param content kind="html"}
-      git pull ssh:{print '//'}{$email.sshHost}/{$projectName}
-          {sp}{$patchSet.refName}
-    {/param}{/call}
-  {/if}
-
-  {if $email.includeDiff}
-    {call .UnifiedDiff}{param diffLines: $diffLines /}{/call}
-  {/if}
-{/template}
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mime/mime-types.properties b/gerrit-server/src/main/resources/com/google/gerrit/server/mime/mime-types.properties
deleted file mode 100644
index 996e8a4..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mime/mime-types.properties
+++ /dev/null
@@ -1,255 +0,0 @@
-apl = text/apl
-as = text/x-gas
-asn = text/x-ttcn-asn
-asn1 = text/x-ttcn-asn
-asp = application/x-aspx
-aspx = application/x-aspx
-asterisk = text/x-asterisk
-b = text/x-brainfuck
-bash = text/x-sh
-bf = text/x-brainfuck
-bnf = text/x-ebnf
-bucklet = text/x-python
-bzl = text/x-python
-BUCK = text/x-python
-BUILD = text/x-python
-c = text/x-csrc
-cfg = text/x-ttcn-cfg
-cl = text/x-common-lisp
-clj = text/x-clojure
-cljs = text/x-clojurescript
-cmake = text/x-cmake
-cmake.in = text/x-cmake
-contributing.md = text/x-gfm
-CMakeLists.txt = text/x-cmake
-CONTRIBUTING.md = text/x-gfm
-cob = text/x-cobol
-coffee = text/x-coffeescript
-conf = text/plain
-config = text/x-ini
-cpy = text/x-cobol
-cr = text/x-crystal
-cs = text/x-csharp
-csharp = text/x-csharp
-css = text/css
-cpp = text/x-c++src
-cql = text/x-cassandra
-cxx = text/x-c++src
-cyp = application/x-cypher-query
-cypher = application/x-cypher-query
-c++ = text/x-c++src
-d = text/x-d
-dart = application/dart
-def = text/plain
-defs = text/x-python
-diff = text/x-diff
-django = text/x-django
-dtd = application/xml-dtd
-dyalog = text/apl
-dyl = text/x-dylan
-dylan = text/x-dylan
-Dockerfile = text/x-dockerfile
-dtd = application/xml-dtd
-e = text/x-eiffel
-ebnf = text/x-ebnf
-ecl = text/x-ecl
-el = text/x-common-lisp
-elm = text/x-elm
-ejs = application/x-ejs
-erb = application/x-erb
-erl = text/x-erlang
-es6 = text/jsx
-excel = text/x-spreadsheet
-extensions.conf = text/x-asterisk
-f = text/x-fortran
-factor = text/x-factor
-feathre = text/x-feature
-fcl = text/x-fcl
-for = text/x-fortran
-formula = text/x-spreadsheet
-forth = text/x-forth
-fth = text/x-forth
-frag = x-shader/x-fragment
-fs = text/x-fsharp
-fsharp = text/x-fsharp
-f77 = text/x-fortran
-f90 = text/x-fortran
-gitmodules = text/x-ini
-glsl = x-shader/x-vertex
-go = text/x-go
-gradle = text/x-groovy
-gradlew = text/x-sh
-groovy = text/x-groovy
-gss = text/x-gss
-h = text/x-csrc
-haml = text/x-haml
-hh = text/x-c++src
-history.md = text/x-gfm
-hpp = text/x-c++src
-hs = text/x-haskell
-htm = text/html
-html = text/html
-http = message/http
-hx = text/x-haxe
-hxml = text/x-hxml
-hxx = text/x-c++src
-h++ = text/x-c++src
-HISTORY.md = text/x-gfm
-in = text/x-properties
-ini = text/x-properties
-intr = text/x-dylan
-jade = text/x-pug
-java = text/x-java
-jl = text/x-julia
-jruby = text/x-ruby
-js = text/javascript
-json = application/json
-jsonld = application/ld+json
-jsx = text/jsx
-jsp = application/x-jsp
-kt = text/x-kotlin
-less = text/x-less
-lhs = text/x-literate-haskell
-lisp = text/x-common-lisp
-list = text/plain
-log = text/plain
-ls = text/x-livescript
-lsp = text/x-common-lisp
-lua = text/x-lua
-m = text/x-objectivec
-macruby = text/x-ruby
-map = application/json
-markdown = text/x-markdown
-mbox = application/mbox
-md = text/x-markdown
-mirc = text/mirc
-mkd = text/x-markdown
-ml = text/x-ocaml
-mli = text/x-ocaml
-mll = text/x-ocaml
-mly = text/x-ocaml
-mm = text/x-objectivec
-mo = text/x-modelica
-mps = text/x-mumps
-msc = text/x-mscgen
-mscgen = text/x-mscgen
-mscin = text/x-mscgen
-msgenny = text/x-msgenny
-nb = text/x-mathematica
-nginx.conf = text/x-nginx-conf
-nsh = text/x-nsis
-nsi = text/x-nsis
-nt = text/n-triples
-nut = text/x-squirrel
-oz = text/x-oz
-p = text/x-pascal
-pas = text/x-pascal
-patch = text/x-diff
-pgp = application/pgp
-php = text/x-php
-php3 = text/x-php
-php4 = text/x-php
-php5 = text/x-php
-phtml = text/x-php
-pig = text/x-pig
-pl = text/x-perl
-pls = text/x-plsql
-pm = text/x-perl
-pp = text/x-puppet
-pro = text/x-idl
-properties = text/x-ini
-proto = text/x-protobuf
-protobuf = text/x-protobuf
-ps1 = application/x-powershell
-psd1 = application/x-powershell
-psm1 = application/x-powershell
-pug = text/x-pug
-py = text/x-python
-pyw = text/x-python
-pyx = text/x-cython
-pxd = text/x-cython
-pxi = text/x-cython
-PKGBUILD = text/x-sh
-q = text/x-q
-r = text/r-src
-rake = text/x-ruby
-rb = text/x-ruby
-rbx = text/x-ruby
-readme.md = text/x-gfm
-rng = application/xml
-rpm = text/x-rpm-changes
-rq = application/sparql-query
-rs = text/x-rustsrc
-rss = application/xml
-rst = text/x-rst
-README.md = text/x-gfm
-s = text/x-gas
-sas = text/x-sas
-sass = text/x-sass
-scala = text/x-scala
-scm = text/x-scheme
-scss = text/x-scss
-sh = text/x-sh
-sieve = application/sieve
-siv = application/sieve
-slim = text/x-slim
-solr = text/x-solr
-soy = text/x-soy
-sparql = application/sparql-query
-sparul = applicatoin/sparql-query
-spec = text/x-rpm-spec
-spreadsheet = text/x-spreadsheet
-sql = text/x-sql
-ss = text/x-scheme
-st = text/x-stsrc
-stex = text/x-stex
-swift = text/x-swift
-tcl = text/x-tcl
-tex = text/x-latex
-text = text/plain
-textile = text/x-textile
-tiddly = text/x-tiddlywiki
-tiddlywiki = text/x-tiddlywiki
-tiki = text/tiki
-toml = text/x-toml
-tpl = text/x-smarty
-ts = application/typescript
-ttcn = text/x-ttcn
-ttcnpp = text/x-ttcn
-ttcn3 = text/x-ttcn
-ttl = text/turtle
-txt = text/plain
-twig = text/x-twig
-v = text/x-verilog
-vb = text/x-vb
-vbs = text/vbscript
-vert = x-shader/x-vertex
-vh = text/x-verilog
-vhd = text/x-vhdl
-vhdl = text/x-vhdl
-vm = text/velocity
-vtl = text/velocity
-webidl = text/x-webidl
-wsdl = application/xml
-xhtml = text/html
-xml = application/xml
-xsd = application/xml
-xsl = application/xml
-xquery = application/xquery
-xu = text/x-xu
-xy = application/xquery
-yaml = text/x-yaml
-yml = text/x-yaml
-ys = text/x-yacas
-zsh = text/x-sh
-z80 = text/x-z80
-1 = text/troff
-2 = text/troff
-3 = text/troff
-4 = text/troff
-4th = text/x-forth
-5 = text/troff
-6 = text/troff
-7 = text/troff
-8 = text/troff
-9 = text/troff
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/tools/root/hooks/commit-msg b/gerrit-server/src/main/resources/com/google/gerrit/server/tools/root/hooks/commit-msg
deleted file mode 100644
index 4c64559..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/tools/root/hooks/commit-msg
+++ /dev/null
@@ -1,193 +0,0 @@
-#!/bin/sh
-#
-# Part of Gerrit Code Review (https://www.gerritcodereview.com/)
-#
-# Copyright (C) 2009 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.
-#
-
-unset GREP_OPTIONS
-
-CHANGE_ID_AFTER="Bug|Depends-On|Issue|Test|Feature|Fixes|Fixed"
-MSG="$1"
-
-# Check for, and add if missing, a unique Change-Id
-#
-add_ChangeId() {
-	clean_message=`sed -e '
-		/^diff --git .*/{
-			s///
-			q
-		}
-		/^Signed-off-by:/d
-		/^#/d
-	' "$MSG" | git stripspace`
-	if test -z "$clean_message"
-	then
-		return
-	fi
-
-	# Do not add Change-Id to temp commits
-	if echo "$clean_message" | head -1 | grep -q '^\(fixup\|squash\)!'
-	then
-		return
-	fi
-
-	if test "false" = "`git config --bool --get gerrit.createChangeId`"
-	then
-		return
-	fi
-
-	# Does Change-Id: already exist? if so, exit (no change).
-	if grep -i '^Change-Id:' "$MSG" >/dev/null
-	then
-		return
-	fi
-
-	id=`_gen_ChangeId`
-	T="$MSG.tmp.$$"
-	AWK=awk
-	if [ -x /usr/xpg4/bin/awk ]; then
-		# Solaris AWK is just too broken
-		AWK=/usr/xpg4/bin/awk
-	fi
-
-	# Get core.commentChar from git config or use default symbol
-	commentChar=`git config --get core.commentChar`
-	commentChar=${commentChar:-#}
-
-	# How this works:
-	# - parse the commit message as (textLine+ blankLine*)*
-	# - assume textLine+ to be a footer until proven otherwise
-	# - exception: the first block is not footer (as it is the title)
-	# - read textLine+ into a variable
-	# - then count blankLines
-	# - once the next textLine appears, print textLine+ blankLine* as these
-	#   aren't footer
-	# - in END, the last textLine+ block is available for footer parsing
-	$AWK '
-	BEGIN {
-		if (match(ENVIRON["OS"], "Windows")) {
-			RS="\r?\n" # Required on recent Cygwin
-		}
-		# while we start with the assumption that textLine+
-		# is a footer, the first block is not.
-		isFooter = 0
-		footerComment = 0
-		blankLines = 0
-	}
-
-	# Skip lines starting with commentChar without any spaces before it.
-	/^'"$commentChar"'/ { next }
-
-	# Skip the line starting with the diff command and everything after it,
-	# up to the end of the file, assuming it is only patch data.
-	# If more than one line before the diff was empty, strip all but one.
-	/^diff --git / {
-		blankLines = 0
-		while (getline) { }
-		next
-	}
-
-	# Count blank lines outside footer comments
-	/^$/ && (footerComment == 0) {
-		blankLines++
-		next
-	}
-
-	# Catch footer comment
-	/^\[[a-zA-Z0-9-]+:/ && (isFooter == 1) {
-		footerComment = 1
-	}
-
-	/]$/ && (footerComment == 1) {
-		footerComment = 2
-	}
-
-	# We have a non-blank line after blank lines. Handle this.
-	(blankLines > 0) {
-		print lines
-		for (i = 0; i < blankLines; i++) {
-			print ""
-		}
-
-		lines = ""
-		blankLines = 0
-		isFooter = 1
-		footerComment = 0
-	}
-
-	# Detect that the current block is not the footer
-	(footerComment == 0) && (!/^\[?[a-zA-Z0-9-]+:/ || /^[a-zA-Z0-9-]+:\/\//) {
-		isFooter = 0
-	}
-
-	{
-		# We need this information about the current last comment line
-		if (footerComment == 2) {
-			footerComment = 0
-		}
-		if (lines != "") {
-			lines = lines "\n";
-		}
-		lines = lines $0
-	}
-
-	# Footer handling:
-	# If the last block is considered a footer, splice in the Change-Id at the
-	# right place.
-	# Look for the right place to inject Change-Id by considering
-	# CHANGE_ID_AFTER. Keys listed in it (case insensitive) come first,
-	# then Change-Id, then everything else (eg. Signed-off-by:).
-	#
-	# Otherwise just print the last block, a new line and the Change-Id as a
-	# block of its own.
-	END {
-		unprinted = 1
-		if (isFooter == 0) {
-			print lines "\n"
-			lines = ""
-		}
-		changeIdAfter = "^(" tolower("'"$CHANGE_ID_AFTER"'") "):"
-		numlines = split(lines, footer, "\n")
-		for (line = 1; line <= numlines; line++) {
-			if (unprinted && match(tolower(footer[line]), changeIdAfter) != 1) {
-				unprinted = 0
-				print "Change-Id: I'"$id"'"
-			}
-			print footer[line]
-		}
-		if (unprinted) {
-			print "Change-Id: I'"$id"'"
-		}
-	}' "$MSG" > "$T" && mv "$T" "$MSG" || rm -f "$T"
-}
-_gen_ChangeIdInput() {
-	echo "tree `git write-tree`"
-	if parent=`git rev-parse "HEAD^0" 2>/dev/null`
-	then
-		echo "parent $parent"
-	fi
-	echo "author `git var GIT_AUTHOR_IDENT`"
-	echo "committer `git var GIT_COMMITTER_IDENT`"
-	echo
-	printf '%s' "$clean_message"
-}
-_gen_ChangeId() {
-	_gen_ChangeIdInput |
-	git hash-object -t commit --stdin
-}
-
-
-add_ChangeId
diff --git a/gerrit-server/src/test/java/com/google/gerrit/rules/GerritCommonTest.java b/gerrit-server/src/test/java/com/google/gerrit/rules/GerritCommonTest.java
deleted file mode 100644
index 40596e8..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/rules/GerritCommonTest.java
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.rules;
-
-import static org.easymock.EasyMock.expect;
-
-import com.google.gerrit.common.data.LabelTypes;
-import com.google.gerrit.server.project.Util;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.inject.AbstractModule;
-import com.googlecode.prolog_cafe.exceptions.CompileException;
-import com.googlecode.prolog_cafe.exceptions.ReductionLimitException;
-import com.googlecode.prolog_cafe.lang.JavaObjectTerm;
-import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.StructureTerm;
-import com.googlecode.prolog_cafe.lang.SymbolTerm;
-import java.io.PushbackReader;
-import java.io.StringReader;
-import java.util.Arrays;
-import org.easymock.EasyMock;
-import org.eclipse.jgit.lib.Config;
-import org.junit.Before;
-import org.junit.Test;
-
-public class GerritCommonTest extends PrologTestCase {
-  @Before
-  public void setUp() throws Exception {
-    load(
-        "gerrit",
-        "gerrit_common_test.pl",
-        new AbstractModule() {
-          @Override
-          protected void configure() {
-            Config cfg = new Config();
-            cfg.setInt("rules", null, "reductionLimit", 1300);
-            cfg.setInt("rules", null, "compileReductionLimit", (int) 1e6);
-            bind(PrologEnvironment.Args.class)
-                .toInstance(
-                    new PrologEnvironment.Args(null, null, null, null, null, null, null, cfg));
-          }
-        });
-  }
-
-  @Override
-  protected void setUpEnvironment(PrologEnvironment env) throws Exception {
-    LabelTypes labelTypes = new LabelTypes(Arrays.asList(Util.codeReview(), Util.verified()));
-    ChangeData cd = EasyMock.createMock(ChangeData.class);
-    expect(cd.getLabelTypes()).andStubReturn(labelTypes);
-    EasyMock.replay(cd);
-    env.set(StoredValues.CHANGE_DATA, cd);
-  }
-
-  @Test
-  public void gerritCommon() throws Exception {
-    runPrologBasedTests();
-  }
-
-  @Test
-  public void reductionLimit() throws Exception {
-    PrologEnvironment env = envFactory.create(machine);
-    setUpEnvironment(env);
-
-    String script = "loopy :- b(5).\nb(N) :- N > 0, !, S = N - 1, b(S).\nb(_) :- true.\n";
-
-    SymbolTerm nameTerm = SymbolTerm.create("testReductionLimit");
-    JavaObjectTerm inTerm =
-        new JavaObjectTerm(new PushbackReader(new StringReader(script), Prolog.PUSHBACK_SIZE));
-    if (!env.execute(Prolog.BUILTIN, "consult_stream", nameTerm, inTerm)) {
-      throw new CompileException("Cannot consult " + nameTerm);
-    }
-
-    exception.expect(ReductionLimitException.class);
-    exception.expectMessage("exceeded reduction limit of 1300");
-    env.once(
-        Prolog.BUILTIN,
-        "call",
-        new StructureTerm(":", SymbolTerm.create("user"), SymbolTerm.create("loopy")));
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/rules/PrologTestCase.java b/gerrit-server/src/test/java/com/google/gerrit/rules/PrologTestCase.java
deleted file mode 100644
index c0a2192..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/rules/PrologTestCase.java
+++ /dev/null
@@ -1,187 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.rules;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth.assertWithMessage;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.testutil.GerritBaseTests;
-import com.google.inject.Guice;
-import com.google.inject.Module;
-import com.googlecode.prolog_cafe.exceptions.CompileException;
-import com.googlecode.prolog_cafe.lang.BufferingPrologControl;
-import com.googlecode.prolog_cafe.lang.JavaObjectTerm;
-import com.googlecode.prolog_cafe.lang.Prolog;
-import com.googlecode.prolog_cafe.lang.PrologClassLoader;
-import com.googlecode.prolog_cafe.lang.PrologMachineCopy;
-import com.googlecode.prolog_cafe.lang.StructureTerm;
-import com.googlecode.prolog_cafe.lang.SymbolTerm;
-import com.googlecode.prolog_cafe.lang.Term;
-import com.googlecode.prolog_cafe.lang.VariableTerm;
-import java.io.BufferedReader;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.PushbackReader;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/** Base class for any tests written in Prolog. */
-public abstract class PrologTestCase extends GerritBaseTests {
-  private static final SymbolTerm test_1 = SymbolTerm.intern("test", 1);
-
-  private String pkg;
-  private boolean hasSetup;
-  private boolean hasTeardown;
-  private List<Term> tests;
-  protected PrologMachineCopy machine;
-  protected PrologEnvironment.Factory envFactory;
-
-  protected void load(String pkg, String prologResource, Module... modules)
-      throws CompileException, IOException {
-    ArrayList<Module> moduleList = new ArrayList<>();
-    moduleList.add(new PrologModule.EnvironmentModule());
-    moduleList.addAll(Arrays.asList(modules));
-
-    envFactory = Guice.createInjector(moduleList).getInstance(PrologEnvironment.Factory.class);
-    PrologEnvironment env = envFactory.create(newMachine());
-    consult(env, getClass(), prologResource);
-
-    this.pkg = pkg;
-    hasSetup = has(env, "setup");
-    hasTeardown = has(env, "teardown");
-
-    StructureTerm head =
-        new StructureTerm(
-            ":", SymbolTerm.intern(pkg), new StructureTerm(test_1, new VariableTerm()));
-
-    tests = new ArrayList<>();
-    for (Term[] pair : env.all(Prolog.BUILTIN, "clause", head, new VariableTerm())) {
-      tests.add(pair[0]);
-    }
-    assertThat(tests).isNotEmpty();
-    machine = PrologMachineCopy.save(env);
-  }
-
-  /**
-   * Set up the Prolog environment.
-   *
-   * @param env Prolog environment.
-   */
-  protected void setUpEnvironment(PrologEnvironment env) throws Exception {}
-
-  private PrologMachineCopy newMachine() {
-    BufferingPrologControl ctl = new BufferingPrologControl();
-    ctl.setMaxDatabaseSize(16 * 1024);
-    ctl.setPrologClassLoader(new PrologClassLoader(getClass().getClassLoader()));
-    return PrologMachineCopy.save(ctl);
-  }
-
-  protected void consult(BufferingPrologControl env, Class<?> clazz, String prologResource)
-      throws CompileException, IOException {
-    try (InputStream in = clazz.getResourceAsStream(prologResource)) {
-      if (in == null) {
-        throw new FileNotFoundException(prologResource);
-      }
-      SymbolTerm pathTerm = SymbolTerm.create(prologResource);
-      JavaObjectTerm inTerm =
-          new JavaObjectTerm(
-              new PushbackReader(
-                  new BufferedReader(new InputStreamReader(in, UTF_8)), Prolog.PUSHBACK_SIZE));
-      if (!env.execute(Prolog.BUILTIN, "consult_stream", pathTerm, inTerm)) {
-        throw new CompileException("Cannot consult " + prologResource);
-      }
-    }
-  }
-
-  private boolean has(BufferingPrologControl env, String name) {
-    StructureTerm head = SymbolTerm.create(pkg, name, 0);
-    return env.execute(Prolog.BUILTIN, "clause", head, new VariableTerm());
-  }
-
-  public void runPrologBasedTests() throws Exception {
-    int errors = 0;
-    long start = TimeUtil.nowMs();
-
-    for (Term test : tests) {
-      PrologEnvironment env = envFactory.create(machine);
-      setUpEnvironment(env);
-      env.setEnabled(Prolog.Feature.IO, true);
-
-      System.out.format("Prolog %-60s ...", removePackage(test));
-      System.out.flush();
-
-      if (hasSetup) {
-        call(env, "setup");
-      }
-
-      List<Term> all = env.all(Prolog.BUILTIN, "call", test);
-
-      if (hasTeardown) {
-        call(env, "teardown");
-      }
-
-      System.out.println(all.size() == 1 ? "OK" : "FAIL");
-
-      if (all.size() > 0 && !test.equals(all.get(0))) {
-        for (Term t : all) {
-          Term head = ((StructureTerm) removePackage(t)).args()[0];
-          Term[] args = ((StructureTerm) head).args();
-          System.out.print("  Result: ");
-          for (int i = 0; i < args.length; i++) {
-            if (0 < i) {
-              System.out.print(", ");
-            }
-            System.out.print(args[i]);
-          }
-          System.out.println();
-        }
-        System.out.println();
-      }
-
-      if (all.size() != 1) {
-        errors++;
-      }
-    }
-
-    long end = TimeUtil.nowMs();
-    System.out.println("-------------------------------");
-    System.out.format(
-        "Prolog tests: %d, Failures: %d, Time elapsed %.3f sec",
-        tests.size(), errors, (end - start) / 1000.0);
-    System.out.println();
-
-    assertThat(errors).isEqualTo(0);
-  }
-
-  private void call(BufferingPrologControl env, String name) {
-    StructureTerm head = SymbolTerm.create(pkg, name, 0);
-    assertWithMessage("Cannot invoke " + pkg + ":" + name)
-        .that(env.execute(Prolog.BUILTIN, "call", head))
-        .isTrue();
-  }
-
-  private Term removePackage(Term test) {
-    Term name = test;
-    if (name instanceof StructureTerm && ":".equals(name.name())) {
-      name = name.arg(1);
-    }
-    return name;
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/IdentifiedUserTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/IdentifiedUserTest.java
deleted file mode 100644
index b32bdc6..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/IdentifiedUserTest.java
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.inject.Scopes.SINGLETON;
-
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.FakeRealm;
-import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.Realm;
-import com.google.gerrit.server.config.AnonymousCowardName;
-import com.google.gerrit.server.config.AnonymousCowardNameProvider;
-import com.google.gerrit.server.config.CanonicalWebUrl;
-import com.google.gerrit.server.config.DisableReverseDnsLookup;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.group.SystemGroupBackend;
-import com.google.gerrit.testutil.ConfigSuite;
-import com.google.gerrit.testutil.FakeAccountCache;
-import com.google.inject.AbstractModule;
-import com.google.inject.Guice;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-import org.eclipse.jgit.lib.Config;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(ConfigSuite.class)
-public class IdentifiedUserTest {
-  @ConfigSuite.Parameter public Config config;
-
-  private IdentifiedUser identifiedUser;
-
-  @Inject private IdentifiedUser.GenericFactory identifiedUserFactory;
-
-  private static final String[] TEST_CASES = {
-    "",
-    "FirstName.LastName@Corporation.com",
-    "!#$%&'+-/=.?^`{|}~@[IPv6:0123:4567:89AB:CDEF:0123:4567:89AB:CDEF]",
-  };
-
-  @Before
-  public void setUp() throws Exception {
-    final FakeAccountCache accountCache = new FakeAccountCache();
-    final Realm mockRealm =
-        new FakeRealm() {
-          HashSet<String> emails = new HashSet<>(Arrays.asList(TEST_CASES));
-
-          @Override
-          public boolean hasEmailAddress(IdentifiedUser who, String email) {
-            return emails.contains(email);
-          }
-
-          @Override
-          public Set<String> getEmailAddresses(IdentifiedUser who) {
-            return emails;
-          }
-        };
-
-    AbstractModule mod =
-        new AbstractModule() {
-          @Override
-          protected void configure() {
-            bind(Boolean.class)
-                .annotatedWith(DisableReverseDnsLookup.class)
-                .toInstance(Boolean.FALSE);
-            bind(Config.class).annotatedWith(GerritServerConfig.class).toInstance(config);
-            bind(String.class)
-                .annotatedWith(AnonymousCowardName.class)
-                .toProvider(AnonymousCowardNameProvider.class);
-            bind(String.class)
-                .annotatedWith(CanonicalWebUrl.class)
-                .toInstance("http://localhost:8080/");
-            bind(AccountCache.class).toInstance(accountCache);
-            bind(GroupBackend.class).to(SystemGroupBackend.class).in(SINGLETON);
-            bind(Realm.class).toInstance(mockRealm);
-          }
-        };
-
-    Injector injector = Guice.createInjector(mod);
-    injector.injectMembers(this);
-
-    Account account = new Account(new Account.Id(1), TimeUtil.nowTs());
-    Account.Id ownerId = account.getId();
-
-    identifiedUser = identifiedUserFactory.create(ownerId);
-
-    /* Trigger identifiedUser to load the email addresses from mockRealm */
-    identifiedUser.getEmailAddresses();
-  }
-
-  @Test
-  public void emailsExistence() {
-    assertThat(identifiedUser.hasEmailAddress(TEST_CASES[0])).isTrue();
-    assertThat(identifiedUser.hasEmailAddress(TEST_CASES[1].toLowerCase())).isTrue();
-    assertThat(identifiedUser.hasEmailAddress(TEST_CASES[1])).isTrue();
-    assertThat(identifiedUser.hasEmailAddress(TEST_CASES[1].toUpperCase())).isTrue();
-    /* assert again to test cached email address by IdentifiedUser.validEmails */
-    assertThat(identifiedUser.hasEmailAddress(TEST_CASES[1])).isTrue();
-
-    assertThat(identifiedUser.hasEmailAddress(TEST_CASES[2])).isTrue();
-    assertThat(identifiedUser.hasEmailAddress(TEST_CASES[2].toLowerCase())).isTrue();
-
-    assertThat(identifiedUser.hasEmailAddress("non-exist@email.com")).isFalse();
-    /* assert again to test cached email address by IdentifiedUser.invalidEmails */
-    assertThat(identifiedUser.hasEmailAddress("non-exist@email.com")).isFalse();
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/StringUtilTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/StringUtilTest.java
deleted file mode 100644
index acf2577..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/StringUtilTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.server;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Test;
-
-public class StringUtilTest {
-  /** Test the boundary condition that the first character of a string should be escaped. */
-  @Test
-  public void escapeFirstChar() {
-    assertEquals(StringUtil.escapeString("\tLeading tab"), "\\tLeading tab");
-  }
-
-  /** Test the boundary condition that the last character of a string should be escaped. */
-  @Test
-  public void escapeLastChar() {
-    assertEquals(StringUtil.escapeString("Trailing tab\t"), "Trailing tab\\t");
-  }
-
-  /** Test that various forms of input strings are escaped (or left as-is) in the expected way. */
-  @Test
-  public void escapeString() {
-    final String[] testPairs = {
-      "", "",
-      "plain string", "plain string",
-      "string with \"quotes\"", "string with \"quotes\"",
-      "string with 'quotes'", "string with 'quotes'",
-      "string with 'quotes'", "string with 'quotes'",
-      "C:\\Program Files\\MyProgram", "C:\\\\Program Files\\\\MyProgram",
-      "string\nwith\nnewlines", "string\\nwith\\nnewlines",
-      "string\twith\ttabs", "string\\twith\\ttabs",
-    };
-    for (int i = 0; i < testPairs.length; i += 2) {
-      assertEquals(StringUtil.escapeString(testPairs[i]), testPairs[i + 1]);
-    }
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/account/AuthorizedKeysTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/account/AuthorizedKeysTest.java
deleted file mode 100644
index 4b43197..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/account/AuthorizedKeysTest.java
+++ /dev/null
@@ -1,167 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.account;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountSshKey;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
-import org.junit.Test;
-
-public class AuthorizedKeysTest {
-  private static final String KEY1 =
-      "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCgug5VyMXQGnem2H1KVC4/HcRcD4zzBqS"
-          + "uJBRWVonSSoz3RoAZ7bWXCVVGwchtXwUURD689wFYdiPecOrWOUgeeyRq754YWRhU+W28"
-          + "vf8IZixgjCmiBhaL2gt3wff6pP+NXJpTSA4aeWE5DfNK5tZlxlSxqkKOS8JRSUeNQov5T"
-          + "w== john.doe@example.com";
-  private static final String KEY2 =
-      "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDm5yP7FmEoqzQRDyskX+9+N0q9GrvZeh5"
-          + "RG52EUpE4ms/Ujm3ewV1LoGzc/lYKJAIbdcZQNJ9+06EfWZaIRA3oOwAPe1eCnX+aLr8E"
-          + "6Tw2gDMQOGc5e9HfyXpC2pDvzauoZNYqLALOG3y/1xjo7IH8GYRS2B7zO/Mf9DdCcCKSf"
-          + "w== john.doe@example.com";
-  private static final String KEY3 =
-      "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCaS7RHEcZ/zjl9hkWkqnm29RNr2OQ/TZ5"
-          + "jk2qBVMH3BgzPsTsEs+7ag9tfD8OCj+vOcwm626mQBZoR2e3niHa/9gnHBHFtOrGfzKbp"
-          + "RjTWtiOZbB9HF+rqMVD+Dawo/oicX/dDg7VAgOFSPothe6RMhbgWf84UcK5aQd5eP5y+t"
-          + "Q== john.doe@example.com";
-  private static final String KEY4 =
-      "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDIJzW9BaAeO+upFletwwEBnGS15lJmS5i"
-          + "08/NiFef0jXtNNKcLtnd13bq8jOi5VA2is0bwof1c8YbwcvUkdFa8RL5aXoyZBpfYZsWs"
-          + "/YBLZGiHy5rjooMZQMnH37A50cBPnXr0AQz0WRBxLDBDyOZho+O/DfYAKv4rzPSQ3yw4+"
-          + "w== john.doe@example.com";
-  private static final String KEY5 =
-      "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCgBRKGhiXvY6D9sM+Vbth5Kate57YF7kD"
-          + "rqIyUiYIMJK93/AXc8qR/J/p3OIFQAxvLz1qozAur3j5HaiwvxVU19IiSA0vafdhaDLRi"
-          + "zRuEL5e/QOu9yGq9xkWApCmg6edpWAHG+Bx4AldU78MiZvzoB7gMMdxc9RmZ1gYj/DjxV"
-          + "w== john.doe@example.com";
-
-  @Test
-  public void test() throws Exception {
-    List<Optional<AccountSshKey>> keys = new ArrayList<>();
-    StringBuilder expected = new StringBuilder();
-    assertSerialization(keys, expected);
-    assertParse(expected, keys);
-
-    expected.append(addKey(keys, KEY1));
-    assertSerialization(keys, expected);
-    assertParse(expected, keys);
-
-    expected.append(addKey(keys, KEY2));
-    assertSerialization(keys, expected);
-    assertParse(expected, keys);
-
-    expected.append(addInvalidKey(keys, KEY3));
-    assertSerialization(keys, expected);
-    assertParse(expected, keys);
-
-    expected.append(addKey(keys, KEY4));
-    assertSerialization(keys, expected);
-    assertParse(expected, keys);
-
-    expected.append(addDeletedKey(keys));
-    assertSerialization(keys, expected);
-    assertParse(expected, keys);
-
-    expected.append(addKey(keys, KEY5));
-    assertSerialization(keys, expected);
-    assertParse(expected, keys);
-  }
-
-  @Test
-  public void parseWindowsLineEndings() throws Exception {
-    List<Optional<AccountSshKey>> keys = new ArrayList<>();
-    StringBuilder authorizedKeys = new StringBuilder();
-    authorizedKeys.append(toWindowsLineEndings(addKey(keys, KEY1)));
-    assertParse(authorizedKeys, keys);
-
-    authorizedKeys.append(toWindowsLineEndings(addKey(keys, KEY2)));
-    assertParse(authorizedKeys, keys);
-
-    authorizedKeys.append(toWindowsLineEndings(addInvalidKey(keys, KEY3)));
-    assertParse(authorizedKeys, keys);
-
-    authorizedKeys.append(toWindowsLineEndings(addKey(keys, KEY4)));
-    assertParse(authorizedKeys, keys);
-
-    authorizedKeys.append(toWindowsLineEndings(addDeletedKey(keys)));
-    assertParse(authorizedKeys, keys);
-
-    authorizedKeys.append(toWindowsLineEndings(addKey(keys, KEY5)));
-    assertParse(authorizedKeys, keys);
-  }
-
-  private static String toWindowsLineEndings(String s) {
-    return s.replaceAll("\n", "\r\n");
-  }
-
-  private static void assertSerialization(
-      List<Optional<AccountSshKey>> keys, StringBuilder expected) {
-    assertThat(AuthorizedKeys.serialize(keys)).isEqualTo(expected.toString());
-  }
-
-  private static void assertParse(
-      StringBuilder authorizedKeys, List<Optional<AccountSshKey>> expectedKeys) {
-    Account.Id accountId = new Account.Id(1);
-    List<Optional<AccountSshKey>> parsedKeys =
-        AuthorizedKeys.parse(accountId, authorizedKeys.toString());
-    assertThat(parsedKeys).containsExactlyElementsIn(expectedKeys);
-    int seq = 1;
-    for (Optional<AccountSshKey> sshKey : parsedKeys) {
-      if (sshKey.isPresent()) {
-        assertThat(sshKey.get().getAccount()).isEqualTo(accountId);
-        assertThat(sshKey.get().getKey().get()).isEqualTo(seq);
-      }
-      seq++;
-    }
-  }
-
-  /**
-   * Adds the given public key as new SSH key to the given list.
-   *
-   * @return the expected line for this key in the authorized_keys file
-   */
-  private static String addKey(List<Optional<AccountSshKey>> keys, String pub) {
-    AccountSshKey.Id keyId = new AccountSshKey.Id(new Account.Id(1), keys.size() + 1);
-    AccountSshKey key = new AccountSshKey(keyId, pub);
-    keys.add(Optional.of(key));
-    return key.getSshPublicKey() + "\n";
-  }
-
-  /**
-   * Adds the given public key as invalid SSH key to the given list.
-   *
-   * @return the expected line for this key in the authorized_keys file
-   */
-  private static String addInvalidKey(List<Optional<AccountSshKey>> keys, String pub) {
-    AccountSshKey.Id keyId = new AccountSshKey.Id(new Account.Id(1), keys.size() + 1);
-    AccountSshKey key = new AccountSshKey(keyId, pub);
-    key.setInvalid();
-    keys.add(Optional.of(key));
-    return AuthorizedKeys.INVALID_KEY_COMMENT_PREFIX + key.getSshPublicKey() + "\n";
-  }
-
-  /**
-   * Adds a deleted SSH key to the given list.
-   *
-   * @return the expected line for this key in the authorized_keys file
-   */
-  private static String addDeletedKey(List<Optional<AccountSshKey>> keys) {
-    keys.add(Optional.empty());
-    return AuthorizedKeys.DELETED_KEY_COMMENT + "\n";
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/account/UniversalGroupBackendTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/account/UniversalGroupBackendTest.java
deleted file mode 100644
index 5444c5b..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/account/UniversalGroupBackendTest.java
+++ /dev/null
@@ -1,138 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.account;
-
-import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
-import static com.google.gerrit.server.group.SystemGroupBackend.PROJECT_OWNERS;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-import static org.easymock.EasyMock.anyObject;
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.createNiceMock;
-import static org.easymock.EasyMock.eq;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.getCurrentArguments;
-import static org.easymock.EasyMock.not;
-import static org.easymock.EasyMock.replay;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.AccountGroup.UUID;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.group.SystemGroupBackend;
-import com.google.gerrit.testutil.GerritBaseTests;
-import java.util.Set;
-import org.easymock.IAnswer;
-import org.eclipse.jgit.lib.Config;
-import org.junit.Before;
-import org.junit.Test;
-
-public class UniversalGroupBackendTest extends GerritBaseTests {
-  private static final AccountGroup.UUID OTHER_UUID = new AccountGroup.UUID("other");
-
-  private UniversalGroupBackend backend;
-  private IdentifiedUser user;
-
-  private DynamicSet<GroupBackend> backends;
-
-  @Before
-  public void setup() {
-    user = createNiceMock(IdentifiedUser.class);
-    replay(user);
-    backends = new DynamicSet<>();
-    backends.add(new SystemGroupBackend(new Config()));
-    backend = new UniversalGroupBackend(backends);
-  }
-
-  @Test
-  public void handles() {
-    assertTrue(backend.handles(ANONYMOUS_USERS));
-    assertTrue(backend.handles(PROJECT_OWNERS));
-    assertFalse(backend.handles(OTHER_UUID));
-  }
-
-  @Test
-  public void get() {
-    assertEquals("Registered Users", backend.get(REGISTERED_USERS).getName());
-    assertEquals("Project Owners", backend.get(PROJECT_OWNERS).getName());
-    assertNull(backend.get(OTHER_UUID));
-  }
-
-  @Test
-  public void suggest() {
-    assertTrue(backend.suggest("X", null).isEmpty());
-    assertEquals(1, backend.suggest("project", null).size());
-    assertEquals(1, backend.suggest("reg", null).size());
-  }
-
-  @Test
-  public void sytemGroupMemberships() {
-    GroupMembership checker = backend.membershipsOf(user);
-    assertTrue(checker.contains(REGISTERED_USERS));
-    assertFalse(checker.contains(OTHER_UUID));
-    assertFalse(checker.contains(PROJECT_OWNERS));
-  }
-
-  @Test
-  public void knownGroups() {
-    GroupMembership checker = backend.membershipsOf(user);
-    Set<UUID> knownGroups = checker.getKnownGroups();
-    assertEquals(2, knownGroups.size());
-    assertTrue(knownGroups.contains(REGISTERED_USERS));
-    assertTrue(knownGroups.contains(ANONYMOUS_USERS));
-  }
-
-  @Test
-  public void otherMemberships() {
-    final AccountGroup.UUID handled = new AccountGroup.UUID("handled");
-    final AccountGroup.UUID notHandled = new AccountGroup.UUID("not handled");
-    final IdentifiedUser member = createNiceMock(IdentifiedUser.class);
-    final IdentifiedUser notMember = createNiceMock(IdentifiedUser.class);
-
-    GroupBackend backend = createMock(GroupBackend.class);
-    expect(backend.handles(handled)).andStubReturn(true);
-    expect(backend.handles(not(eq(handled)))).andStubReturn(false);
-    expect(backend.membershipsOf(anyObject(IdentifiedUser.class)))
-        .andStubAnswer(
-            new IAnswer<GroupMembership>() {
-              @Override
-              public GroupMembership answer() throws Throwable {
-                Object[] args = getCurrentArguments();
-                GroupMembership membership = createMock(GroupMembership.class);
-                expect(membership.contains(eq(handled))).andStubReturn(args[0] == member);
-                expect(membership.contains(not(eq(notHandled)))).andStubReturn(false);
-                replay(membership);
-                return membership;
-              }
-            });
-    replay(member, notMember, backend);
-
-    backends = new DynamicSet<>();
-    backends.add(backend);
-    backend = new UniversalGroupBackend(backends);
-
-    GroupMembership checker = backend.membershipsOf(member);
-    assertFalse(checker.contains(REGISTERED_USERS));
-    assertFalse(checker.contains(OTHER_UUID));
-    assertTrue(checker.contains(handled));
-    assertFalse(checker.contains(notHandled));
-    checker = backend.membershipsOf(notMember);
-    assertFalse(checker.contains(handled));
-    assertFalse(checker.contains(notHandled));
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/account/WatchConfigTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/account/WatchConfigTest.java
deleted file mode 100644
index cf61de2..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/account/WatchConfigTest.java
+++ /dev/null
@@ -1,186 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.account;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.account.WatchConfig.NotifyType;
-import com.google.gerrit.server.account.WatchConfig.NotifyValue;
-import com.google.gerrit.server.account.WatchConfig.ProjectWatchKey;
-import com.google.gerrit.server.git.ValidationError;
-import java.util.ArrayList;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.eclipse.jgit.lib.Config;
-import org.junit.Before;
-import org.junit.Test;
-
-public class WatchConfigTest implements ValidationError.Sink {
-  private List<ValidationError> validationErrors = new ArrayList<>();
-
-  @Before
-  public void setup() {
-    validationErrors.clear();
-  }
-
-  @Test
-  public void parseWatchConfig() throws Exception {
-    Config cfg = new Config();
-    cfg.fromText(
-        "[project \"myProject\"]\n"
-            + "  notify = * [ALL_COMMENTS, NEW_PATCHSETS]\n"
-            + "  notify = branch:master [NEW_CHANGES]\n"
-            + "  notify = branch:master [NEW_PATCHSETS]\n"
-            + "  notify = branch:foo []\n"
-            + "[project \"otherProject\"]\n"
-            + "  notify = [NEW_PATCHSETS]\n"
-            + "  notify = * [NEW_PATCHSETS, ALL_COMMENTS]\n");
-    Map<ProjectWatchKey, Set<NotifyType>> projectWatches =
-        WatchConfig.parse(new Account.Id(1000000), cfg, this);
-
-    assertThat(validationErrors).isEmpty();
-
-    Project.NameKey myProject = new Project.NameKey("myProject");
-    Project.NameKey otherProject = new Project.NameKey("otherProject");
-    Map<ProjectWatchKey, Set<NotifyType>> expectedProjectWatches = new HashMap<>();
-    expectedProjectWatches.put(
-        ProjectWatchKey.create(myProject, null),
-        EnumSet.of(NotifyType.ALL_COMMENTS, NotifyType.NEW_PATCHSETS));
-    expectedProjectWatches.put(
-        ProjectWatchKey.create(myProject, "branch:master"),
-        EnumSet.of(NotifyType.NEW_CHANGES, NotifyType.NEW_PATCHSETS));
-    expectedProjectWatches.put(
-        ProjectWatchKey.create(myProject, "branch:foo"), EnumSet.noneOf(NotifyType.class));
-    expectedProjectWatches.put(
-        ProjectWatchKey.create(otherProject, null), EnumSet.of(NotifyType.NEW_PATCHSETS));
-    expectedProjectWatches.put(
-        ProjectWatchKey.create(otherProject, null),
-        EnumSet.of(NotifyType.ALL_COMMENTS, NotifyType.NEW_PATCHSETS));
-    assertThat(projectWatches).containsExactlyEntriesIn(expectedProjectWatches);
-  }
-
-  @Test
-  public void parseInvalidWatchConfig() throws Exception {
-    Config cfg = new Config();
-    cfg.fromText(
-        "[project \"myProject\"]\n"
-            + "  notify = * [ALL_COMMENTS, NEW_PATCHSETS]\n"
-            + "  notify = branch:master [INVALID, NEW_CHANGES]\n"
-            + "[project \"otherProject\"]\n"
-            + "  notify = [NEW_PATCHSETS]\n");
-
-    WatchConfig.parse(new Account.Id(1000000), cfg, this);
-    assertThat(validationErrors).hasSize(1);
-    assertThat(validationErrors.get(0).getMessage())
-        .isEqualTo(
-            "watch.config: Invalid notify type INVALID in project watch of"
-                + " account 1000000 for project myProject: branch:master"
-                + " [INVALID, NEW_CHANGES]");
-  }
-
-  @Test
-  public void parseNotifyValue() throws Exception {
-    assertParseNotifyValue("* []", null, EnumSet.noneOf(NotifyType.class));
-    assertParseNotifyValue("* [ALL_COMMENTS]", null, EnumSet.of(NotifyType.ALL_COMMENTS));
-    assertParseNotifyValue("[]", null, EnumSet.noneOf(NotifyType.class));
-    assertParseNotifyValue(
-        "[ALL_COMMENTS, NEW_PATCHSETS]",
-        null,
-        EnumSet.of(NotifyType.ALL_COMMENTS, NotifyType.NEW_PATCHSETS));
-    assertParseNotifyValue("branch:master []", "branch:master", EnumSet.noneOf(NotifyType.class));
-    assertParseNotifyValue(
-        "branch:master || branch:stable []",
-        "branch:master || branch:stable",
-        EnumSet.noneOf(NotifyType.class));
-    assertParseNotifyValue(
-        "branch:master [ALL_COMMENTS]", "branch:master", EnumSet.of(NotifyType.ALL_COMMENTS));
-    assertParseNotifyValue(
-        "branch:master [ALL_COMMENTS, NEW_PATCHSETS]",
-        "branch:master",
-        EnumSet.of(NotifyType.ALL_COMMENTS, NotifyType.NEW_PATCHSETS));
-    assertParseNotifyValue("* [ALL]", null, EnumSet.of(NotifyType.ALL));
-
-    assertThat(validationErrors).isEmpty();
-  }
-
-  @Test
-  public void parseInvalidNotifyValue() {
-    assertParseNotifyValueFails("* [] illegal-characters-at-the-end");
-    assertParseNotifyValueFails("* [INVALID]");
-    assertParseNotifyValueFails("* [ALL_COMMENTS, UNKNOWN]");
-    assertParseNotifyValueFails("* [ALL_COMMENTS NEW_CHANGES]");
-    assertParseNotifyValueFails("* [ALL_COMMENTS, NEW_CHANGES");
-    assertParseNotifyValueFails("* ALL_COMMENTS, NEW_CHANGES]");
-  }
-
-  @Test
-  public void toNotifyValue() throws Exception {
-    assertToNotifyValue(null, EnumSet.noneOf(NotifyType.class), "* []");
-    assertToNotifyValue("*", EnumSet.noneOf(NotifyType.class), "* []");
-    assertToNotifyValue(null, EnumSet.of(NotifyType.ALL_COMMENTS), "* [ALL_COMMENTS]");
-    assertToNotifyValue("branch:master", EnumSet.noneOf(NotifyType.class), "branch:master []");
-    assertToNotifyValue(
-        "branch:master",
-        EnumSet.of(NotifyType.ALL_COMMENTS, NotifyType.NEW_PATCHSETS),
-        "branch:master [ALL_COMMENTS, NEW_PATCHSETS]");
-    assertToNotifyValue(
-        "branch:master",
-        EnumSet.of(
-            NotifyType.ABANDONED_CHANGES,
-            NotifyType.ALL_COMMENTS,
-            NotifyType.NEW_CHANGES,
-            NotifyType.NEW_PATCHSETS,
-            NotifyType.SUBMITTED_CHANGES),
-        "branch:master [ABANDONED_CHANGES, ALL_COMMENTS, NEW_CHANGES,"
-            + " NEW_PATCHSETS, SUBMITTED_CHANGES]");
-    assertToNotifyValue("*", EnumSet.of(NotifyType.ALL), "* [ALL]");
-  }
-
-  private void assertParseNotifyValue(
-      String notifyValue, String expectedFilter, Set<NotifyType> expectedNotifyTypes) {
-    NotifyValue nv = parseNotifyValue(notifyValue);
-    assertThat(nv.filter()).isEqualTo(expectedFilter);
-    assertThat(nv.notifyTypes()).containsExactlyElementsIn(expectedNotifyTypes);
-  }
-
-  private static void assertToNotifyValue(
-      String filter, Set<NotifyType> notifyTypes, String expectedNotifyValue) {
-    NotifyValue nv = NotifyValue.create(filter, notifyTypes);
-    assertThat(nv.toString()).isEqualTo(expectedNotifyValue);
-  }
-
-  private void assertParseNotifyValueFails(String notifyValue) {
-    assertThat(validationErrors).isEmpty();
-    parseNotifyValue(notifyValue);
-    assertThat(validationErrors)
-        .named("expected validation error for notifyValue: " + notifyValue)
-        .isNotEmpty();
-    validationErrors.clear();
-  }
-
-  private NotifyValue parseNotifyValue(String notifyValue) {
-    return NotifyValue.parse(new Account.Id(1000000), "project", notifyValue, this);
-  }
-
-  @Override
-  public void error(ValidationError error) {
-    validationErrors.add(error);
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/change/IncludedInResolverTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/change/IncludedInResolverTest.java
deleted file mode 100644
index e91c3b4..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/change/IncludedInResolverTest.java
+++ /dev/null
@@ -1,207 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.change;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import org.eclipse.jgit.api.Git;
-import org.eclipse.jgit.api.MergeCommand.FastForwardMode;
-import org.eclipse.jgit.junit.RepositoryTestCase;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevTag;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-public class IncludedInResolverTest extends RepositoryTestCase {
-
-  // Branch names
-  private static final String BRANCH_MASTER = "master";
-  private static final String BRANCH_1_0 = "rel-1.0";
-  private static final String BRANCH_1_3 = "rel-1.3";
-  private static final String BRANCH_2_0 = "rel-2.0";
-  private static final String BRANCH_2_5 = "rel-2.5";
-
-  // Tag names
-  private static final String TAG_1_0 = "1.0";
-  private static final String TAG_1_0_1 = "1.0.1";
-  private static final String TAG_1_3 = "1.3";
-  private static final String TAG_2_0_1 = "2.0.1";
-  private static final String TAG_2_0 = "2.0";
-  private static final String TAG_2_5 = "2.5";
-  private static final String TAG_2_5_ANNOTATED = "2.5-annotated";
-  private static final String TAG_2_5_ANNOTATED_TWICE = "2.5-annotated_twice";
-
-  // Commits
-  private RevCommit commit_initial;
-  private RevCommit commit_v1_3;
-  private RevCommit commit_v2_5;
-
-  private List<String> expTags = new ArrayList<>();
-  private List<String> expBranches = new ArrayList<>();
-
-  private RevWalk revWalk;
-
-  @Override
-  @Before
-  public void setUp() throws Exception {
-    super.setUp();
-
-    /*- The following graph will be created.
-
-     o   tag 2.5, 2.5_annotated, 2.5_annotated_twice
-     |\
-     | o tag 2.0.1
-     | o tag 2.0
-     o | tag 1.3
-     |/
-     o   c3
-
-     | o tag 1.0.1
-     |/
-     o   tag 1.0
-     o   c2
-     o   c1
-
-    */
-
-    // TODO(dborowitz): Use try/finally when this doesn't double-close the repo.
-    @SuppressWarnings("resource")
-    Git git = new Git(db);
-    revWalk = new RevWalk(db);
-    // Version 1.0
-    commit_initial = git.commit().setMessage("c1").call();
-    git.commit().setMessage("c2").call();
-    RevCommit commit_v1_0 = git.commit().setMessage("version 1.0").call();
-    git.tag().setName(TAG_1_0).setObjectId(commit_v1_0).call();
-    RevCommit c3 = git.commit().setMessage("c3").call();
-    // Version 1.01
-    createAndCheckoutBranch(commit_v1_0, BRANCH_1_0);
-    RevCommit commit_v1_0_1 = git.commit().setMessage("verREFS_HEADS_RELsion 1.0.1").call();
-    git.tag().setName(TAG_1_0_1).setObjectId(commit_v1_0_1).call();
-    // Version 1.3
-    createAndCheckoutBranch(c3, BRANCH_1_3);
-    commit_v1_3 = git.commit().setMessage("version 1.3").call();
-    git.tag().setName(TAG_1_3).setObjectId(commit_v1_3).call();
-    // Version 2.0
-    createAndCheckoutBranch(c3, BRANCH_2_0);
-    RevCommit commit_v2_0 = git.commit().setMessage("version 2.0").call();
-    git.tag().setName(TAG_2_0).setObjectId(commit_v2_0).call();
-    RevCommit commit_v2_0_1 = git.commit().setMessage("version 2.0.1").call();
-    git.tag().setName(TAG_2_0_1).setObjectId(commit_v2_0_1).call();
-
-    // Version 2.5
-    createAndCheckoutBranch(commit_v1_3, BRANCH_2_5);
-    git.merge()
-        .include(commit_v2_0_1)
-        .setCommit(false)
-        .setFastForward(FastForwardMode.NO_FF)
-        .call();
-    commit_v2_5 = git.commit().setMessage("version 2.5").call();
-    git.tag().setName(TAG_2_5).setObjectId(commit_v2_5).setAnnotated(false).call();
-    Ref ref_tag_2_5_annotated =
-        git.tag().setName(TAG_2_5_ANNOTATED).setObjectId(commit_v2_5).setAnnotated(true).call();
-    RevTag tag_2_5_annotated = revWalk.parseTag(ref_tag_2_5_annotated.getObjectId());
-    git.tag()
-        .setName(TAG_2_5_ANNOTATED_TWICE)
-        .setObjectId(tag_2_5_annotated)
-        .setAnnotated(true)
-        .call();
-  }
-
-  @Override
-  @After
-  public void tearDown() throws Exception {
-    revWalk.close();
-    super.tearDown();
-  }
-
-  @Test
-  public void resolveLatestCommit() throws Exception {
-    // Check tip commit
-    IncludedInResolver.Result detail = resolve(commit_v2_5);
-
-    // Check that only tags and branches which refer the tip are returned
-    expTags.add(TAG_2_5);
-    expTags.add(TAG_2_5_ANNOTATED);
-    expTags.add(TAG_2_5_ANNOTATED_TWICE);
-    assertEquals(expTags, detail.getTags());
-    expBranches.add(BRANCH_2_5);
-    assertEquals(expBranches, detail.getBranches());
-  }
-
-  @Test
-  public void resolveFirstCommit() throws Exception {
-    // Check first commit
-    IncludedInResolver.Result detail = resolve(commit_initial);
-
-    // Check whether all tags and branches are returned
-    expTags.add(TAG_1_0);
-    expTags.add(TAG_1_0_1);
-    expTags.add(TAG_1_3);
-    expTags.add(TAG_2_0);
-    expTags.add(TAG_2_0_1);
-    expTags.add(TAG_2_5);
-    expTags.add(TAG_2_5_ANNOTATED);
-    expTags.add(TAG_2_5_ANNOTATED_TWICE);
-    assertEquals(expTags, detail.getTags());
-
-    expBranches.add(BRANCH_MASTER);
-    expBranches.add(BRANCH_1_0);
-    expBranches.add(BRANCH_1_3);
-    expBranches.add(BRANCH_2_0);
-    expBranches.add(BRANCH_2_5);
-    assertEquals(expBranches, detail.getBranches());
-  }
-
-  @Test
-  public void resolveBetwixtCommit() throws Exception {
-    // Check a commit somewhere in the middle
-    IncludedInResolver.Result detail = resolve(commit_v1_3);
-
-    // Check whether all succeeding tags and branches are returned
-    expTags.add(TAG_1_3);
-    expTags.add(TAG_2_5);
-    expTags.add(TAG_2_5_ANNOTATED);
-    expTags.add(TAG_2_5_ANNOTATED_TWICE);
-    assertEquals(expTags, detail.getTags());
-
-    expBranches.add(BRANCH_1_3);
-    expBranches.add(BRANCH_2_5);
-    assertEquals(expBranches, detail.getBranches());
-  }
-
-  private IncludedInResolver.Result resolve(RevCommit commit) throws Exception {
-    return IncludedInResolver.resolve(db, revWalk, commit);
-  }
-
-  private void assertEquals(List<String> list1, List<String> list2) {
-    Collections.sort(list1);
-    Collections.sort(list2);
-    Assert.assertEquals(list1, list2);
-  }
-
-  private void createAndCheckoutBranch(ObjectId objectId, String branchName) throws IOException {
-    String fullBranchName = "refs/heads/" + branchName;
-    super.createBranch(objectId, fullBranchName);
-    super.checkoutBranch(fullBranchName);
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/change/WalkSorterTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/change/WalkSorterTest.java
deleted file mode 100644
index 37e4d3f..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/change/WalkSorterTest.java
+++ /dev/null
@@ -1,374 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.change;
-
-import static com.google.common.collect.Collections2.permutations;
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RevId;
-import com.google.gerrit.server.change.WalkSorter.PatchSetData;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.testutil.GerritBaseTests;
-import com.google.gerrit.testutil.InMemoryRepositoryManager;
-import com.google.gerrit.testutil.InMemoryRepositoryManager.Repo;
-import com.google.gerrit.testutil.TestChanges;
-import java.util.ArrayList;
-import java.util.List;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.junit.Before;
-import org.junit.Test;
-
-public class WalkSorterTest extends GerritBaseTests {
-  private Account.Id userId;
-  private InMemoryRepositoryManager repoManager;
-
-  @Before
-  public void setUp() {
-    userId = new Account.Id(1);
-    repoManager = new InMemoryRepositoryManager();
-  }
-
-  @Test
-  public void seriesOfChanges() throws Exception {
-    TestRepository<Repo> p = newRepo("p");
-    RevCommit c1_1 = p.commit().create();
-    RevCommit c2_1 = p.commit().parent(c1_1).create();
-    RevCommit c3_1 = p.commit().parent(c2_1).create();
-
-    ChangeData cd1 = newChange(p, c1_1);
-    ChangeData cd2 = newChange(p, c2_1);
-    ChangeData cd3 = newChange(p, c3_1);
-
-    List<ChangeData> changes = ImmutableList.of(cd1, cd2, cd3);
-    WalkSorter sorter = new WalkSorter(repoManager);
-
-    assertSorted(
-        sorter,
-        changes,
-        ImmutableList.of(
-            patchSetData(cd3, c3_1), patchSetData(cd2, c2_1), patchSetData(cd1, c1_1)));
-
-    // Add new patch sets whose commits are in reverse order, so output is in
-    // reverse order.
-    RevCommit c3_2 = p.commit().create();
-    RevCommit c2_2 = p.commit().parent(c3_2).create();
-    RevCommit c1_2 = p.commit().parent(c2_2).create();
-
-    addPatchSet(cd1, c1_2);
-    addPatchSet(cd2, c2_2);
-    addPatchSet(cd3, c3_2);
-
-    assertSorted(
-        sorter,
-        changes,
-        ImmutableList.of(
-            patchSetData(cd1, c1_2), patchSetData(cd2, c2_2), patchSetData(cd3, c3_2)));
-  }
-
-  @Test
-  public void subsetOfSeriesOfChanges() throws Exception {
-    TestRepository<Repo> p = newRepo("p");
-    RevCommit c1_1 = p.commit().create();
-    RevCommit c2_1 = p.commit().parent(c1_1).create();
-    RevCommit c3_1 = p.commit().parent(c2_1).create();
-
-    ChangeData cd1 = newChange(p, c1_1);
-    ChangeData cd3 = newChange(p, c3_1);
-
-    List<ChangeData> changes = ImmutableList.of(cd1, cd3);
-    WalkSorter sorter = new WalkSorter(repoManager);
-
-    assertSorted(
-        sorter, changes, ImmutableList.of(patchSetData(cd3, c3_1), patchSetData(cd1, c1_1)));
-  }
-
-  @Test
-  public void seriesOfChangesAtSameTimestamp() throws Exception {
-    TestRepository<Repo> p = newRepo("p");
-    RevCommit c0 = p.commit().tick(0).create();
-    RevCommit c1 = p.commit().tick(0).parent(c0).create();
-    RevCommit c2 = p.commit().tick(0).parent(c1).create();
-    RevCommit c3 = p.commit().tick(0).parent(c2).create();
-    RevCommit c4 = p.commit().tick(0).parent(c3).create();
-
-    RevWalk rw = p.getRevWalk();
-    rw.parseCommit(c1);
-    assertThat(rw.parseCommit(c2).getCommitTime()).isEqualTo(c1.getCommitTime());
-    assertThat(rw.parseCommit(c3).getCommitTime()).isEqualTo(c1.getCommitTime());
-    assertThat(rw.parseCommit(c4).getCommitTime()).isEqualTo(c1.getCommitTime());
-
-    ChangeData cd1 = newChange(p, c1);
-    ChangeData cd2 = newChange(p, c2);
-    ChangeData cd3 = newChange(p, c3);
-    ChangeData cd4 = newChange(p, c4);
-
-    List<ChangeData> changes = ImmutableList.of(cd1, cd2, cd3, cd4);
-    WalkSorter sorter = new WalkSorter(repoManager);
-
-    assertSorted(
-        sorter,
-        changes,
-        ImmutableList.of(
-            patchSetData(cd4, c4),
-            patchSetData(cd3, c3),
-            patchSetData(cd2, c2),
-            patchSetData(cd1, c1)));
-  }
-
-  @Test
-  public void seriesOfChangesWithReverseTimestamps() throws Exception {
-    TestRepository<Repo> p = newRepo("p");
-    RevCommit c0 = p.commit().tick(-1).create();
-    RevCommit c1 = p.commit().tick(-1).parent(c0).create();
-    RevCommit c2 = p.commit().tick(-1).parent(c1).create();
-    RevCommit c3 = p.commit().tick(-1).parent(c2).create();
-    RevCommit c4 = p.commit().tick(-1).parent(c3).create();
-
-    RevWalk rw = p.getRevWalk();
-    rw.parseCommit(c1);
-    assertThat(rw.parseCommit(c2).getCommitTime()).isLessThan(c1.getCommitTime());
-    assertThat(rw.parseCommit(c3).getCommitTime()).isLessThan(c2.getCommitTime());
-    assertThat(rw.parseCommit(c4).getCommitTime()).isLessThan(c3.getCommitTime());
-
-    ChangeData cd1 = newChange(p, c1);
-    ChangeData cd2 = newChange(p, c2);
-    ChangeData cd3 = newChange(p, c3);
-    ChangeData cd4 = newChange(p, c4);
-
-    List<ChangeData> changes = ImmutableList.of(cd1, cd2, cd3, cd4);
-    WalkSorter sorter = new WalkSorter(repoManager);
-
-    assertSorted(
-        sorter,
-        changes,
-        ImmutableList.of(
-            patchSetData(cd4, c4),
-            patchSetData(cd3, c3),
-            patchSetData(cd2, c2),
-            patchSetData(cd1, c1)));
-  }
-
-  @Test
-  public void subsetOfSeriesOfChangesWithReverseTimestamps() throws Exception {
-    TestRepository<Repo> p = newRepo("p");
-    RevCommit c0 = p.commit().tick(-1).create();
-    RevCommit c1 = p.commit().tick(-1).parent(c0).create();
-    RevCommit c2 = p.commit().tick(-1).parent(c1).create();
-    RevCommit c3 = p.commit().tick(-1).parent(c2).create();
-    RevCommit c4 = p.commit().tick(-1).parent(c3).create();
-
-    RevWalk rw = p.getRevWalk();
-    rw.parseCommit(c1);
-    assertThat(rw.parseCommit(c2).getCommitTime()).isLessThan(c1.getCommitTime());
-    assertThat(rw.parseCommit(c3).getCommitTime()).isLessThan(c2.getCommitTime());
-    assertThat(rw.parseCommit(c4).getCommitTime()).isLessThan(c3.getCommitTime());
-
-    ChangeData cd1 = newChange(p, c1);
-    ChangeData cd2 = newChange(p, c2);
-    ChangeData cd4 = newChange(p, c4);
-
-    List<ChangeData> changes = ImmutableList.of(cd1, cd2, cd4);
-    WalkSorter sorter = new WalkSorter(repoManager);
-    List<PatchSetData> expected =
-        ImmutableList.of(patchSetData(cd4, c4), patchSetData(cd2, c2), patchSetData(cd1, c1));
-
-    for (List<ChangeData> list : permutations(changes)) {
-      // Not inOrder(); since child of c2 is missing, partial topo sort isn't
-      // guaranteed to work.
-      assertThat(sorter.sort(list)).containsExactlyElementsIn(expected);
-    }
-  }
-
-  @Test
-  public void seriesOfChangesAtSameTimestampWithRootCommit() throws Exception {
-    TestRepository<Repo> p = newRepo("p");
-    RevCommit c1 = p.commit().tick(0).create();
-    RevCommit c2 = p.commit().tick(0).parent(c1).create();
-    RevCommit c3 = p.commit().tick(0).parent(c2).create();
-    RevCommit c4 = p.commit().tick(0).parent(c3).create();
-
-    RevWalk rw = p.getRevWalk();
-    rw.parseCommit(c1);
-    assertThat(rw.parseCommit(c2).getCommitTime()).isEqualTo(c1.getCommitTime());
-    assertThat(rw.parseCommit(c3).getCommitTime()).isEqualTo(c1.getCommitTime());
-    assertThat(rw.parseCommit(c4).getCommitTime()).isEqualTo(c1.getCommitTime());
-
-    ChangeData cd1 = newChange(p, c1);
-    ChangeData cd2 = newChange(p, c2);
-    ChangeData cd3 = newChange(p, c3);
-    ChangeData cd4 = newChange(p, c4);
-
-    List<ChangeData> changes = ImmutableList.of(cd1, cd2, cd3, cd4);
-    WalkSorter sorter = new WalkSorter(repoManager);
-
-    assertSorted(
-        sorter,
-        changes,
-        ImmutableList.of(
-            patchSetData(cd4, c4),
-            patchSetData(cd3, c3),
-            patchSetData(cd2, c2),
-            patchSetData(cd1, c1)));
-  }
-
-  @Test
-  public void projectsSortedByName() throws Exception {
-    TestRepository<Repo> pa = newRepo("a");
-    TestRepository<Repo> pb = newRepo("b");
-    RevCommit c1 = pa.commit().create();
-    RevCommit c2 = pb.commit().create();
-    RevCommit c3 = pa.commit().parent(c1).create();
-    RevCommit c4 = pb.commit().parent(c2).create();
-
-    ChangeData cd1 = newChange(pa, c1);
-    ChangeData cd2 = newChange(pb, c2);
-    ChangeData cd3 = newChange(pa, c3);
-    ChangeData cd4 = newChange(pb, c4);
-
-    assertSorted(
-        new WalkSorter(repoManager),
-        ImmutableList.of(cd1, cd2, cd3, cd4),
-        ImmutableList.of(
-            patchSetData(cd3, c3),
-            patchSetData(cd1, c1),
-            patchSetData(cd4, c4),
-            patchSetData(cd2, c2)));
-  }
-
-  @Test
-  public void restrictToPatchSets() throws Exception {
-    TestRepository<Repo> p = newRepo("p");
-    RevCommit c1_1 = p.commit().create();
-    RevCommit c2_1 = p.commit().parent(c1_1).create();
-
-    ChangeData cd1 = newChange(p, c1_1);
-    ChangeData cd2 = newChange(p, c2_1);
-
-    // Add new patch sets whose commits are in reverse order.
-    RevCommit c2_2 = p.commit().create();
-    RevCommit c1_2 = p.commit().parent(c2_2).create();
-
-    addPatchSet(cd1, c1_2);
-    addPatchSet(cd2, c2_2);
-
-    List<ChangeData> changes = ImmutableList.of(cd1, cd2);
-    WalkSorter sorter = new WalkSorter(repoManager);
-
-    assertSorted(
-        sorter, changes, ImmutableList.of(patchSetData(cd1, c1_2), patchSetData(cd2, c2_2)));
-
-    // If we restrict to PS1 of each change, the sorter uses that commit.
-    sorter.includePatchSets(
-        ImmutableSet.of(new PatchSet.Id(cd1.getId(), 1), new PatchSet.Id(cd2.getId(), 1)));
-    assertSorted(
-        sorter, changes, ImmutableList.of(patchSetData(cd2, 1, c2_1), patchSetData(cd1, 1, c1_1)));
-  }
-
-  @Test
-  public void restrictToPatchSetsOmittingWholeProject() throws Exception {
-    TestRepository<Repo> pa = newRepo("a");
-    TestRepository<Repo> pb = newRepo("b");
-    RevCommit c1 = pa.commit().create();
-    RevCommit c2 = pa.commit().create();
-
-    ChangeData cd1 = newChange(pa, c1);
-    ChangeData cd2 = newChange(pb, c2);
-
-    List<ChangeData> changes = ImmutableList.of(cd1, cd2);
-    WalkSorter sorter =
-        new WalkSorter(repoManager)
-            .includePatchSets(ImmutableSet.of(cd1.currentPatchSet().getId()));
-
-    assertSorted(sorter, changes, ImmutableList.of(patchSetData(cd1, c1)));
-  }
-
-  @Test
-  public void retainBody() throws Exception {
-    TestRepository<Repo> p = newRepo("p");
-    RevCommit c = p.commit().message("message").create();
-    ChangeData cd = newChange(p, c);
-
-    List<ChangeData> changes = ImmutableList.of(cd);
-    RevCommit actual =
-        new WalkSorter(repoManager).setRetainBody(true).sort(changes).iterator().next().commit();
-    assertThat(actual.getRawBuffer()).isNotNull();
-    assertThat(actual.getShortMessage()).isEqualTo("message");
-
-    actual =
-        new WalkSorter(repoManager).setRetainBody(false).sort(changes).iterator().next().commit();
-    assertThat(actual.getRawBuffer()).isNull();
-  }
-
-  @Test
-  public void oneChange() throws Exception {
-    TestRepository<Repo> p = newRepo("p");
-    RevCommit c = p.commit().create();
-    ChangeData cd = newChange(p, c);
-
-    List<ChangeData> changes = ImmutableList.of(cd);
-    WalkSorter sorter = new WalkSorter(repoManager);
-
-    assertSorted(sorter, changes, ImmutableList.of(patchSetData(cd, c)));
-  }
-
-  private ChangeData newChange(TestRepository<Repo> tr, ObjectId id) throws Exception {
-    Project.NameKey project = tr.getRepository().getDescription().getProject();
-    Change c = TestChanges.newChange(project, userId);
-    ChangeData cd = ChangeData.createForTest(project, c.getId(), 1);
-    cd.setChange(c);
-    cd.currentPatchSet().setRevision(new RevId(id.name()));
-    cd.setPatchSets(ImmutableList.of(cd.currentPatchSet()));
-    return cd;
-  }
-
-  private PatchSet addPatchSet(ChangeData cd, ObjectId id) throws Exception {
-    TestChanges.incrementPatchSet(cd.change());
-    PatchSet ps = new PatchSet(cd.change().currentPatchSetId());
-    ps.setRevision(new RevId(id.name()));
-    List<PatchSet> patchSets = new ArrayList<>(cd.patchSets());
-    patchSets.add(ps);
-    cd.setPatchSets(patchSets);
-    return ps;
-  }
-
-  private TestRepository<Repo> newRepo(String name) throws Exception {
-    return new TestRepository<>(repoManager.createRepository(new Project.NameKey(name)));
-  }
-
-  private static PatchSetData patchSetData(ChangeData cd, RevCommit commit) throws Exception {
-    return PatchSetData.create(cd, cd.currentPatchSet(), commit);
-  }
-
-  private static PatchSetData patchSetData(ChangeData cd, int psId, RevCommit commit)
-      throws Exception {
-    return PatchSetData.create(cd, cd.patchSet(new PatchSet.Id(cd.getId(), psId)), commit);
-  }
-
-  private static void assertSorted(
-      WalkSorter sorter, List<ChangeData> changes, List<PatchSetData> expected) throws Exception {
-    for (List<ChangeData> list : permutations(changes)) {
-      assertThat(sorter.sort(list)).containsExactlyElementsIn(expected).inOrder();
-    }
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/config/ConfigUtilTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/config/ConfigUtilTest.java
deleted file mode 100644
index fc0b1dcd..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/config/ConfigUtilTest.java
+++ /dev/null
@@ -1,197 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.server.config;
-
-import static com.google.common.truth.Truth.assertThat;
-import static java.util.concurrent.TimeUnit.DAYS;
-import static java.util.concurrent.TimeUnit.HOURS;
-import static java.util.concurrent.TimeUnit.MILLISECONDS;
-import static java.util.concurrent.TimeUnit.MINUTES;
-import static java.util.concurrent.TimeUnit.SECONDS;
-import static org.junit.Assert.assertEquals;
-
-import com.google.gerrit.extensions.client.Theme;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-import org.eclipse.jgit.lib.Config;
-import org.junit.Test;
-
-public class ConfigUtilTest {
-  private static final String SECT = "foo";
-  private static final String SUB = "bar";
-
-  static class SectionInfo {
-    public static final String CONSTANT = "42";
-    public transient String missing;
-    public int i;
-    public Integer ii;
-    public Integer id;
-    public long l;
-    public Long ll;
-    public Long ld;
-    public boolean b;
-    public Boolean bb;
-    public Boolean bd;
-    public String s;
-    public String sd;
-    public String nd;
-    public Theme t;
-    public Theme td;
-    public List<String> list;
-    public Map<String, String> map;
-
-    static SectionInfo defaults() {
-      SectionInfo i = new SectionInfo();
-      i.i = 1;
-      i.ii = 2;
-      i.id = 3;
-      i.l = 4L;
-      i.ll = 5L;
-      i.ld = 6L;
-      i.b = true;
-      i.bb = false;
-      i.bd = true;
-      i.s = "foo";
-      i.sd = "bar";
-      // i.nd = null; // Don't need to explicitly set it; it's null by default
-      i.t = Theme.DEFAULT;
-      i.td = Theme.DEFAULT;
-      return i;
-    }
-  }
-
-  @Test
-  public void storeLoadSection() throws Exception {
-    SectionInfo d = SectionInfo.defaults();
-    SectionInfo in = new SectionInfo();
-    in.missing = "42";
-    in.i = 1;
-    in.ii = 43;
-    in.l = 4L;
-    in.ll = -43L;
-    in.b = false;
-    in.bb = true;
-    in.bd = false;
-    in.s = "baz";
-    in.t = Theme.MIDNIGHT;
-
-    Config cfg = new Config();
-    ConfigUtil.storeSection(cfg, SECT, SUB, in, d);
-
-    assertThat(cfg.getString(SECT, SUB, "CONSTANT")).isNull();
-    assertThat(cfg.getString(SECT, SUB, "missing")).isNull();
-    assertThat(cfg.getBoolean(SECT, SUB, "b", false)).isEqualTo(in.b);
-    assertThat(cfg.getBoolean(SECT, SUB, "bb", false)).isEqualTo(in.bb);
-    assertThat(cfg.getInt(SECT, SUB, "i", 0)).isEqualTo(0);
-    assertThat(cfg.getInt(SECT, SUB, "ii", 0)).isEqualTo(in.ii);
-    assertThat(cfg.getLong(SECT, SUB, "l", 0L)).isEqualTo(0L);
-    assertThat(cfg.getLong(SECT, SUB, "ll", 0L)).isEqualTo(in.ll);
-    assertThat(cfg.getString(SECT, SUB, "s")).isEqualTo(in.s);
-    assertThat(cfg.getString(SECT, SUB, "sd")).isNull();
-    assertThat(cfg.getString(SECT, SUB, "nd")).isNull();
-
-    SectionInfo out = new SectionInfo();
-    ConfigUtil.loadSection(cfg, SECT, SUB, out, d, null);
-    assertThat(out.i).isEqualTo(in.i);
-    assertThat(out.ii).isEqualTo(in.ii);
-    assertThat(out.id).isEqualTo(d.id);
-    assertThat(out.l).isEqualTo(in.l);
-    assertThat(out.ll).isEqualTo(in.ll);
-    assertThat(out.ld).isEqualTo(d.ld);
-    assertThat(out.b).isEqualTo(in.b);
-    assertThat(out.bb).isEqualTo(in.bb);
-    assertThat(out.bd).isNull();
-    assertThat(out.s).isEqualTo(in.s);
-    assertThat(out.sd).isEqualTo(d.sd);
-    assertThat(out.nd).isNull();
-    assertThat(out.t).isEqualTo(in.t);
-    assertThat(out.td).isEqualTo(d.td);
-  }
-
-  @Test
-  public void mergeSection() throws Exception {
-    SectionInfo d = SectionInfo.defaults();
-    Config cfg = new Config();
-    ConfigUtil.storeSection(cfg, SECT, SUB, d, d);
-
-    SectionInfo in = new SectionInfo();
-    in.i = 42;
-
-    SectionInfo out = new SectionInfo();
-    ConfigUtil.loadSection(cfg, SECT, SUB, out, d, in);
-    // Check original values preserved
-    assertThat(out.id).isEqualTo(d.id);
-    // Check merged values
-    assertThat(out.i).isEqualTo(in.i);
-    // Check that boolean attribute not nullified
-    assertThat(out.bb).isFalse();
-  }
-
-  @Test
-  public void timeUnit() {
-    assertEquals(ms(0, MILLISECONDS), parse("0"));
-    assertEquals(ms(2, MILLISECONDS), parse("2ms"));
-    assertEquals(ms(200, MILLISECONDS), parse("200 milliseconds"));
-
-    assertEquals(ms(0, SECONDS), parse("0s"));
-    assertEquals(ms(2, SECONDS), parse("2s"));
-    assertEquals(ms(231, SECONDS), parse("231sec"));
-    assertEquals(ms(1, SECONDS), parse("1second"));
-    assertEquals(ms(300, SECONDS), parse("300 seconds"));
-
-    assertEquals(ms(2, MINUTES), parse("2m"));
-    assertEquals(ms(2, MINUTES), parse("2min"));
-    assertEquals(ms(1, MINUTES), parse("1 minute"));
-    assertEquals(ms(10, MINUTES), parse("10 minutes"));
-
-    assertEquals(ms(5, HOURS), parse("5h"));
-    assertEquals(ms(5, HOURS), parse("5hr"));
-    assertEquals(ms(1, HOURS), parse("1hour"));
-    assertEquals(ms(48, HOURS), parse("48hours"));
-
-    assertEquals(ms(5, HOURS), parse("5 h"));
-    assertEquals(ms(5, HOURS), parse("5 hr"));
-    assertEquals(ms(1, HOURS), parse("1 hour"));
-    assertEquals(ms(48, HOURS), parse("48 hours"));
-    assertEquals(ms(48, HOURS), parse("48 \t \r hours"));
-
-    assertEquals(ms(4, DAYS), parse("4d"));
-    assertEquals(ms(1, DAYS), parse("1day"));
-    assertEquals(ms(14, DAYS), parse("14days"));
-
-    assertEquals(ms(7, DAYS), parse("1w"));
-    assertEquals(ms(7, DAYS), parse("1week"));
-    assertEquals(ms(14, DAYS), parse("2w"));
-    assertEquals(ms(14, DAYS), parse("2weeks"));
-
-    assertEquals(ms(30, DAYS), parse("1mon"));
-    assertEquals(ms(30, DAYS), parse("1month"));
-    assertEquals(ms(60, DAYS), parse("2mon"));
-    assertEquals(ms(60, DAYS), parse("2months"));
-
-    assertEquals(ms(365, DAYS), parse("1y"));
-    assertEquals(ms(365, DAYS), parse("1year"));
-    assertEquals(ms(365 * 2, DAYS), parse("2years"));
-  }
-
-  private static long ms(int cnt, TimeUnit unit) {
-    return MILLISECONDS.convert(cnt, unit);
-  }
-
-  private static long parse(String string) {
-    return ConfigUtil.getTimeUnit(string, 1, MILLISECONDS);
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/config/GitwebConfigTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/config/GitwebConfigTest.java
deleted file mode 100644
index ab7da99..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/config/GitwebConfigTest.java
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.server.config;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import org.junit.Test;
-
-public class GitwebConfigTest {
-
-  private static final String VALID_CHARACTERS = "*()";
-  private static final String SOME_INVALID_CHARACTERS = "09AZaz$-_.+!',";
-
-  @Test
-  public void validPathSeparator() {
-    for (char c : VALID_CHARACTERS.toCharArray()) {
-      assertTrue("valid character rejected: " + c, GitwebConfig.isValidPathSeparator(c));
-    }
-  }
-
-  @Test
-  public void inalidPathSeparator() {
-    for (char c : SOME_INVALID_CHARACTERS.toCharArray()) {
-      assertFalse("invalid character accepted: " + c, GitwebConfig.isValidPathSeparator(c));
-    }
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/config/ListCapabilitiesTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/config/ListCapabilitiesTest.java
deleted file mode 100644
index 6fe48dc..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/config/ListCapabilitiesTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.config;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.extensions.annotations.Exports;
-import com.google.gerrit.extensions.config.CapabilityDefinition;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.server.config.ListCapabilities.CapabilityInfo;
-import com.google.inject.AbstractModule;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import java.util.Map;
-import org.junit.Before;
-import org.junit.Test;
-
-public class ListCapabilitiesTest {
-  private Injector injector;
-
-  @Before
-  public void setUp() throws Exception {
-    AbstractModule mod =
-        new AbstractModule() {
-          @Override
-          protected void configure() {
-            DynamicMap.mapOf(binder(), CapabilityDefinition.class);
-            bind(CapabilityDefinition.class)
-                .annotatedWith(Exports.named("printHello"))
-                .toInstance(
-                    new CapabilityDefinition() {
-                      @Override
-                      public String getDescription() {
-                        return "Print Hello";
-                      }
-                    });
-          }
-        };
-    injector = Guice.createInjector(mod);
-  }
-
-  @Test
-  public void list() throws Exception {
-    Map<String, CapabilityInfo> m =
-        injector.getInstance(ListCapabilities.class).apply(new ConfigResource());
-    for (String id : GlobalCapability.getAllNames()) {
-      assertTrue("contains " + id, m.containsKey(id));
-      assertEquals(id, m.get(id).id);
-      assertNotNull(id + " has name", m.get(id).name);
-    }
-
-    String pluginCapability = "gerrit-printHello";
-    assertTrue("contains " + pluginCapability, m.containsKey(pluginCapability));
-    assertEquals(pluginCapability, m.get(pluginCapability).id);
-    assertEquals("Print Hello", m.get(pluginCapability).name);
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/config/RepositoryConfigTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/config/RepositoryConfigTest.java
deleted file mode 100644
index b3faef4..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/config/RepositoryConfigTest.java
+++ /dev/null
@@ -1,206 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.config;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth8.assertThat;
-
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.reviewdb.client.Project.NameKey;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.List;
-import org.eclipse.jgit.lib.Config;
-import org.junit.Before;
-import org.junit.Test;
-
-public class RepositoryConfigTest {
-
-  private Config cfg;
-  private RepositoryConfig repoCfg;
-
-  @Before
-  public void setUp() throws Exception {
-    cfg = new Config();
-    repoCfg = new RepositoryConfig(cfg);
-  }
-
-  @Test
-  public void defaultSubmitTypeWhenNotConfigured() {
-    assertThat(repoCfg.getDefaultSubmitType(new NameKey("someProject")))
-        .isEqualTo(SubmitType.MERGE_IF_NECESSARY);
-  }
-
-  @Test
-  public void defaultSubmitTypeForStarFilter() {
-    configureDefaultSubmitType("*", SubmitType.CHERRY_PICK);
-    assertThat(repoCfg.getDefaultSubmitType(new NameKey("someProject")))
-        .isEqualTo(SubmitType.CHERRY_PICK);
-
-    configureDefaultSubmitType("*", SubmitType.FAST_FORWARD_ONLY);
-    assertThat(repoCfg.getDefaultSubmitType(new NameKey("someProject")))
-        .isEqualTo(SubmitType.FAST_FORWARD_ONLY);
-
-    configureDefaultSubmitType("*", SubmitType.REBASE_IF_NECESSARY);
-    assertThat(repoCfg.getDefaultSubmitType(new NameKey("someProject")))
-        .isEqualTo(SubmitType.REBASE_IF_NECESSARY);
-
-    configureDefaultSubmitType("*", SubmitType.REBASE_ALWAYS);
-    assertThat(repoCfg.getDefaultSubmitType(new NameKey("someProject")))
-        .isEqualTo(SubmitType.REBASE_ALWAYS);
-  }
-
-  @Test
-  public void defaultSubmitTypeForSpecificFilter() {
-    configureDefaultSubmitType("someProject", SubmitType.CHERRY_PICK);
-    assertThat(repoCfg.getDefaultSubmitType(new NameKey("someOtherProject")))
-        .isEqualTo(SubmitType.MERGE_IF_NECESSARY);
-    assertThat(repoCfg.getDefaultSubmitType(new NameKey("someProject")))
-        .isEqualTo(SubmitType.CHERRY_PICK);
-  }
-
-  @Test
-  public void defaultSubmitTypeForStartWithFilter() {
-    configureDefaultSubmitType("somePath/somePath/*", SubmitType.REBASE_IF_NECESSARY);
-    configureDefaultSubmitType("somePath/*", SubmitType.CHERRY_PICK);
-    configureDefaultSubmitType("*", SubmitType.MERGE_ALWAYS);
-
-    assertThat(repoCfg.getDefaultSubmitType(new NameKey("someProject")))
-        .isEqualTo(SubmitType.MERGE_ALWAYS);
-
-    assertThat(repoCfg.getDefaultSubmitType(new NameKey("somePath/someProject")))
-        .isEqualTo(SubmitType.CHERRY_PICK);
-
-    assertThat(repoCfg.getDefaultSubmitType(new NameKey("somePath/somePath/someProject")))
-        .isEqualTo(SubmitType.REBASE_IF_NECESSARY);
-  }
-
-  private void configureDefaultSubmitType(String projectFilter, SubmitType submitType) {
-    cfg.setString(
-        RepositoryConfig.SECTION_NAME,
-        projectFilter,
-        RepositoryConfig.DEFAULT_SUBMIT_TYPE_NAME,
-        submitType.toString());
-  }
-
-  @Test
-  public void ownerGroupsWhenNotConfigured() {
-    assertThat(repoCfg.getOwnerGroups(new NameKey("someProject"))).isEmpty();
-  }
-
-  @Test
-  public void ownerGroupsForStarFilter() {
-    ImmutableList<String> ownerGroups = ImmutableList.of("group1", "group2");
-    configureOwnerGroups("*", ownerGroups);
-    assertThat(repoCfg.getOwnerGroups(new NameKey("someProject")))
-        .containsExactlyElementsIn(ownerGroups);
-  }
-
-  @Test
-  public void ownerGroupsForSpecificFilter() {
-    ImmutableList<String> ownerGroups = ImmutableList.of("group1", "group2");
-    configureOwnerGroups("someProject", ownerGroups);
-    assertThat(repoCfg.getOwnerGroups(new NameKey("someOtherProject"))).isEmpty();
-    assertThat(repoCfg.getOwnerGroups(new NameKey("someProject")))
-        .containsExactlyElementsIn(ownerGroups);
-  }
-
-  @Test
-  public void ownerGroupsForStartWithFilter() {
-    ImmutableList<String> ownerGroups1 = ImmutableList.of("group1");
-    ImmutableList<String> ownerGroups2 = ImmutableList.of("group2");
-    ImmutableList<String> ownerGroups3 = ImmutableList.of("group3");
-
-    configureOwnerGroups("*", ownerGroups1);
-    configureOwnerGroups("somePath/*", ownerGroups2);
-    configureOwnerGroups("somePath/somePath/*", ownerGroups3);
-
-    assertThat(repoCfg.getOwnerGroups(new NameKey("someProject")))
-        .containsExactlyElementsIn(ownerGroups1);
-
-    assertThat(repoCfg.getOwnerGroups(new NameKey("somePath/someProject")))
-        .containsExactlyElementsIn(ownerGroups2);
-
-    assertThat(repoCfg.getOwnerGroups(new NameKey("somePath/somePath/someProject")))
-        .containsExactlyElementsIn(ownerGroups3);
-  }
-
-  private void configureOwnerGroups(String projectFilter, List<String> ownerGroups) {
-    cfg.setStringList(
-        RepositoryConfig.SECTION_NAME,
-        projectFilter,
-        RepositoryConfig.OWNER_GROUP_NAME,
-        ownerGroups);
-  }
-
-  @Test
-  public void basePathWhenNotConfigured() {
-    assertThat(repoCfg.getBasePath(new NameKey("someProject"))).isNull();
-  }
-
-  @Test
-  public void basePathForStarFilter() {
-    String basePath = "/someAbsolutePath/someDirectory";
-    configureBasePath("*", basePath);
-    assertThat(repoCfg.getBasePath(new NameKey("someProject")).toString()).isEqualTo(basePath);
-  }
-
-  @Test
-  public void basePathForSpecificFilter() {
-    String basePath = "/someAbsolutePath/someDirectory";
-    configureBasePath("someProject", basePath);
-    assertThat(repoCfg.getBasePath(new NameKey("someOtherProject"))).isNull();
-    assertThat(repoCfg.getBasePath(new NameKey("someProject")).toString()).isEqualTo(basePath);
-  }
-
-  @Test
-  public void basePathForStartWithFilter() {
-    String basePath1 = "/someAbsolutePath1/someDirectory";
-    String basePath2 = "someRelativeDirectory2";
-    String basePath3 = "/someAbsolutePath3/someDirectory";
-    String basePath4 = "/someAbsolutePath4/someDirectory";
-
-    configureBasePath("pro*", basePath1);
-    configureBasePath("project/project/*", basePath2);
-    configureBasePath("project/*", basePath3);
-    configureBasePath("*", basePath4);
-
-    assertThat(repoCfg.getBasePath(new NameKey("project1")).toString()).isEqualTo(basePath1);
-    assertThat(repoCfg.getBasePath(new NameKey("project/project/someProject")).toString())
-        .isEqualTo(basePath2);
-    assertThat(repoCfg.getBasePath(new NameKey("project/someProject")).toString())
-        .isEqualTo(basePath3);
-    assertThat(repoCfg.getBasePath(new NameKey("someProject")).toString()).isEqualTo(basePath4);
-  }
-
-  @Test
-  public void allBasePath() {
-    ImmutableList<Path> allBasePaths =
-        ImmutableList.of(
-            Paths.get("/someBasePath1"), Paths.get("/someBasePath2"), Paths.get("/someBasePath2"));
-
-    configureBasePath("*", allBasePaths.get(0).toString());
-    configureBasePath("project/*", allBasePaths.get(1).toString());
-    configureBasePath("project/project/*", allBasePaths.get(2).toString());
-
-    assertThat(repoCfg.getAllBasePaths()).isEqualTo(allBasePaths);
-  }
-
-  private void configureBasePath(String projectFilter, String basePath) {
-    cfg.setString(
-        RepositoryConfig.SECTION_NAME, projectFilter, RepositoryConfig.BASE_PATH_NAME, basePath);
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/config/ScheduleConfigTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/config/ScheduleConfigTest.java
deleted file mode 100644
index e6f36b9..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/config/ScheduleConfigTest.java
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.config;
-
-import static java.util.concurrent.TimeUnit.DAYS;
-import static java.util.concurrent.TimeUnit.HOURS;
-import static java.util.concurrent.TimeUnit.MILLISECONDS;
-import static java.util.concurrent.TimeUnit.MINUTES;
-import static org.junit.Assert.assertEquals;
-
-import java.util.concurrent.TimeUnit;
-import org.eclipse.jgit.lib.Config;
-import org.joda.time.DateTime;
-import org.junit.Test;
-
-public class ScheduleConfigTest {
-
-  // Friday June 13, 2014 10:00 UTC
-  private static final DateTime NOW = DateTime.parse("2014-06-13T10:00:00-00:00");
-
-  @Test
-  public void initialDelay() throws Exception {
-    assertEquals(ms(1, HOURS), initialDelay("11:00", "1h"));
-    assertEquals(ms(30, MINUTES), initialDelay("05:30", "1h"));
-    assertEquals(ms(30, MINUTES), initialDelay("09:30", "1h"));
-    assertEquals(ms(30, MINUTES), initialDelay("13:30", "1h"));
-    assertEquals(ms(59, MINUTES), initialDelay("13:59", "1h"));
-
-    assertEquals(ms(1, HOURS), initialDelay("11:00", "1d"));
-    assertEquals(ms(19, HOURS) + ms(30, MINUTES), initialDelay("05:30", "1d"));
-
-    assertEquals(ms(1, HOURS), initialDelay("11:00", "1w"));
-    assertEquals(ms(7, DAYS) - ms(4, HOURS) - ms(30, MINUTES), initialDelay("05:30", "1w"));
-
-    assertEquals(ms(3, DAYS) + ms(1, HOURS), initialDelay("Mon 11:00", "1w"));
-    assertEquals(ms(1, HOURS), initialDelay("Fri 11:00", "1w"));
-
-    assertEquals(ms(1, HOURS), initialDelay("Mon 11:00", "1d"));
-    assertEquals(ms(23, HOURS), initialDelay("Mon 09:00", "1d"));
-    assertEquals(ms(1, DAYS), initialDelay("Mon 10:00", "1d"));
-    assertEquals(ms(1, DAYS), initialDelay("Mon 10:00", "1d"));
-  }
-
-  @Test
-  public void customKeys() {
-    Config rc = new Config();
-    rc.setString("a", "b", "i", "1h");
-    rc.setString("a", "b", "s", "01:00");
-
-    ScheduleConfig s = new ScheduleConfig(rc, "a", "b", "i", "s", NOW);
-    assertEquals(ms(1, HOURS), s.getInterval());
-    assertEquals(ms(1, HOURS), s.getInitialDelay());
-
-    s = new ScheduleConfig(rc, "a", "b", "myInterval", "myStart", NOW);
-    assertEquals(s.getInterval(), ScheduleConfig.MISSING_CONFIG);
-    assertEquals(s.getInitialDelay(), ScheduleConfig.MISSING_CONFIG);
-  }
-
-  private static long initialDelay(String startTime, String interval) {
-    return new ScheduleConfig(config(startTime, interval), "section", "subsection", NOW)
-        .getInitialDelay();
-  }
-
-  private static Config config(String startTime, String interval) {
-    Config rc = new Config();
-    rc.setString("section", "subsection", "startTime", startTime);
-    rc.setString("section", "subsection", "interval", interval);
-    return rc;
-  }
-
-  private static long ms(int cnt, TimeUnit unit) {
-    return MILLISECONDS.convert(cnt, unit);
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/config/SitePathsTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/config/SitePathsTest.java
deleted file mode 100644
index 3fb278d..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/config/SitePathsTest.java
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.config;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.gerrit.extensions.common.PathSubject;
-import com.google.gerrit.server.util.HostPlatform;
-import com.google.gerrit.testutil.GerritBaseTests;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.NotDirectoryException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import org.junit.Test;
-
-public class SitePathsTest extends GerritBaseTests {
-  @Test
-  public void create_NotExisting() throws IOException {
-    final Path root = random();
-    final SitePaths site = new SitePaths(root);
-    assertThat(site.isNew).isTrue();
-    PathSubject.assertThat(site.site_path).isEqualTo(root);
-    PathSubject.assertThat(site.etc_dir).isEqualTo(root.resolve("etc"));
-  }
-
-  @Test
-  public void create_Empty() throws IOException {
-    final Path root = random();
-    try {
-      Files.createDirectory(root);
-
-      final SitePaths site = new SitePaths(root);
-      assertThat(site.isNew).isTrue();
-      PathSubject.assertThat(site.site_path).isEqualTo(root);
-    } finally {
-      Files.delete(root);
-    }
-  }
-
-  @Test
-  public void create_NonEmpty() throws IOException {
-    final Path root = random();
-    final Path txt = root.resolve("test.txt");
-    try {
-      Files.createDirectory(root);
-      Files.createFile(txt);
-
-      final SitePaths site = new SitePaths(root);
-      assertThat(site.isNew).isFalse();
-      PathSubject.assertThat(site.site_path).isEqualTo(root);
-    } finally {
-      Files.delete(txt);
-      Files.delete(root);
-    }
-  }
-
-  @Test
-  public void create_NotDirectory() throws IOException {
-    final Path root = random();
-    try {
-      Files.createFile(root);
-      exception.expect(NotDirectoryException.class);
-      new SitePaths(root);
-    } finally {
-      Files.delete(root);
-    }
-  }
-
-  @Test
-  public void resolve() throws IOException {
-    final Path root = random();
-    final SitePaths site = new SitePaths(root);
-
-    PathSubject.assertThat(site.resolve(null)).isNull();
-    PathSubject.assertThat(site.resolve("")).isNull();
-
-    PathSubject.assertThat(site.resolve("a")).isNotNull();
-    PathSubject.assertThat(site.resolve("a"))
-        .isEqualTo(root.resolve("a").toAbsolutePath().normalize());
-
-    final String pfx = HostPlatform.isWin32() ? "C:/" : "/";
-    PathSubject.assertThat(site.resolve(pfx + "a")).isNotNull();
-    PathSubject.assertThat(site.resolve(pfx + "a")).isEqualTo(Paths.get(pfx + "a"));
-  }
-
-  private static Path random() throws IOException {
-    Path tmp = Files.createTempFile("gerrit_test_", "_site");
-    Files.deleteIfExists(tmp);
-    return tmp;
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/edit/tree/ChangeFileContentModificationSubject.java b/gerrit-server/src/test/java/com/google/gerrit/server/edit/tree/ChangeFileContentModificationSubject.java
deleted file mode 100644
index 801b2b0..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/edit/tree/ChangeFileContentModificationSubject.java
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.edit.tree;
-
-import static com.google.common.truth.Truth.assertAbout;
-
-import com.google.common.io.CharStreams;
-import com.google.common.truth.FailureStrategy;
-import com.google.common.truth.StringSubject;
-import com.google.common.truth.Subject;
-import com.google.common.truth.SubjectFactory;
-import com.google.common.truth.Truth;
-import com.google.gerrit.extensions.restapi.RawInput;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.nio.charset.StandardCharsets;
-
-public class ChangeFileContentModificationSubject
-    extends Subject<ChangeFileContentModificationSubject, ChangeFileContentModification> {
-
-  private static final SubjectFactory<
-          ChangeFileContentModificationSubject, ChangeFileContentModification>
-      MODIFICATION_SUBJECT_FACTORY =
-          new SubjectFactory<
-              ChangeFileContentModificationSubject, ChangeFileContentModification>() {
-            @Override
-            public ChangeFileContentModificationSubject getSubject(
-                FailureStrategy failureStrategy, ChangeFileContentModification modification) {
-              return new ChangeFileContentModificationSubject(failureStrategy, modification);
-            }
-          };
-
-  public static ChangeFileContentModificationSubject assertThat(
-      ChangeFileContentModification modification) {
-    return assertAbout(MODIFICATION_SUBJECT_FACTORY).that(modification);
-  }
-
-  private ChangeFileContentModificationSubject(
-      FailureStrategy failureStrategy, ChangeFileContentModification modification) {
-    super(failureStrategy, modification);
-  }
-
-  public StringSubject filePath() {
-    isNotNull();
-    return Truth.assertThat(actual().getFilePath()).named("filePath");
-  }
-
-  public StringSubject newContent() throws IOException {
-    isNotNull();
-    RawInput newContent = actual().getNewContent();
-    Truth.assertThat(newContent).named("newContent").isNotNull();
-    String contentString =
-        CharStreams.toString(
-            new InputStreamReader(newContent.getInputStream(), StandardCharsets.UTF_8));
-    return Truth.assertThat(contentString).named("newContent");
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/edit/tree/TreeModificationSubject.java b/gerrit-server/src/test/java/com/google/gerrit/server/edit/tree/TreeModificationSubject.java
deleted file mode 100644
index ac4ebb8..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/edit/tree/TreeModificationSubject.java
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.edit.tree;
-
-import static com.google.common.truth.Truth.assertAbout;
-
-import com.google.common.truth.FailureStrategy;
-import com.google.common.truth.Subject;
-import com.google.common.truth.SubjectFactory;
-import com.google.gerrit.truth.ListSubject;
-import java.util.List;
-
-public class TreeModificationSubject extends Subject<TreeModificationSubject, TreeModification> {
-
-  private static final SubjectFactory<TreeModificationSubject, TreeModification>
-      TREE_MODIFICATION_SUBJECT_FACTORY =
-          new SubjectFactory<TreeModificationSubject, TreeModification>() {
-            @Override
-            public TreeModificationSubject getSubject(
-                FailureStrategy failureStrategy, TreeModification treeModification) {
-              return new TreeModificationSubject(failureStrategy, treeModification);
-            }
-          };
-
-  public static TreeModificationSubject assertThat(TreeModification treeModification) {
-    return assertAbout(TREE_MODIFICATION_SUBJECT_FACTORY).that(treeModification);
-  }
-
-  public static ListSubject<TreeModificationSubject, TreeModification> assertThatList(
-      List<TreeModification> treeModifications) {
-    return ListSubject.assertThat(treeModifications, TreeModificationSubject::assertThat)
-        .named("treeModifications");
-  }
-
-  private TreeModificationSubject(
-      FailureStrategy failureStrategy, TreeModification treeModification) {
-    super(failureStrategy, treeModification);
-  }
-
-  public ChangeFileContentModificationSubject asChangeFileContentModification() {
-    isInstanceOf(ChangeFileContentModification.class);
-    return ChangeFileContentModificationSubject.assertThat(
-        (ChangeFileContentModification) actual());
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/git/DestinationListTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/git/DestinationListTest.java
deleted file mode 100644
index e067632..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/git/DestinationListTest.java
+++ /dev/null
@@ -1,162 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.git;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.easymock.EasyMock.createNiceMock;
-import static org.easymock.EasyMock.replay;
-
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Project;
-import java.io.IOException;
-import java.util.HashSet;
-import java.util.Set;
-import junit.framework.TestCase;
-import org.junit.Test;
-
-public class DestinationListTest extends TestCase {
-  public static final String R_FOO = "refs/heads/foo";
-  public static final String R_BAR = "refs/heads/bar";
-
-  public static final String P_MY = "myproject";
-  public static final String P_SLASH = "my/project/with/slashes";
-  public static final String P_COMPLEX = " a/project/with spaces and \ttabs ";
-
-  public static final String L_FOO = R_FOO + "\t" + P_MY + "\n";
-  public static final String L_BAR = R_BAR + "\t" + P_SLASH + "\n";
-  public static final String L_FOO_PAD_F = " " + R_FOO + "\t" + P_MY + "\n";
-  public static final String L_FOO_PAD_E = R_FOO + " \t" + P_MY + "\n";
-  public static final String L_COMPLEX = R_FOO + "\t" + P_COMPLEX + "\n";
-  public static final String L_BAD = R_FOO + "\n";
-
-  public static final String HEADER = "# Ref\tProject\n";
-  public static final String HEADER_PROPER = "# Ref         \tProject\n";
-  public static final String C1 = "# A Simple Comment\n";
-  public static final String C2 = "# Comment with a tab\t and multi # # #\n";
-
-  public static final String F_SIMPLE = L_FOO + L_BAR;
-  public static final String F_PROPER = L_BAR + L_FOO; // alpha order
-  public static final String F_PAD_F = L_FOO_PAD_F + L_BAR;
-  public static final String F_PAD_E = L_FOO_PAD_E + L_BAR;
-
-  public static final String LABEL = "label";
-  public static final String LABEL2 = "another";
-
-  public static final Branch.NameKey B_FOO = dest(P_MY, R_FOO);
-  public static final Branch.NameKey B_BAR = dest(P_SLASH, R_BAR);
-  public static final Branch.NameKey B_COMPLEX = dest(P_COMPLEX, R_FOO);
-
-  public static final Set<Branch.NameKey> D_SIMPLE = new HashSet<>();
-
-  static {
-    D_SIMPLE.clear();
-    D_SIMPLE.add(B_FOO);
-    D_SIMPLE.add(B_BAR);
-  }
-
-  private static Branch.NameKey dest(String project, String ref) {
-    return new Branch.NameKey(new Project.NameKey(project), ref);
-  }
-
-  @Test
-  public void testParseSimple() throws Exception {
-    DestinationList dl = new DestinationList();
-    dl.parseLabel(LABEL, F_SIMPLE, null);
-    Set<Branch.NameKey> branches = dl.getDestinations(LABEL);
-    assertThat(branches).containsExactlyElementsIn(D_SIMPLE);
-  }
-
-  @Test
-  public void testParseWHeader() throws Exception {
-    DestinationList dl = new DestinationList();
-    dl.parseLabel(LABEL, HEADER + F_SIMPLE, null);
-    Set<Branch.NameKey> branches = dl.getDestinations(LABEL);
-    assertThat(branches).containsExactlyElementsIn(D_SIMPLE);
-  }
-
-  @Test
-  public void testParseWComments() throws Exception {
-    DestinationList dl = new DestinationList();
-    dl.parseLabel(LABEL, C1 + F_SIMPLE + C2, null);
-    Set<Branch.NameKey> branches = dl.getDestinations(LABEL);
-    assertThat(branches).containsExactlyElementsIn(D_SIMPLE);
-  }
-
-  @Test
-  public void testParseFooComment() throws Exception {
-    DestinationList dl = new DestinationList();
-    dl.parseLabel(LABEL, "#" + L_FOO + L_BAR, null);
-    Set<Branch.NameKey> branches = dl.getDestinations(LABEL);
-    assertThat(branches).doesNotContain(B_FOO);
-    assertThat(branches).contains(B_BAR);
-  }
-
-  @Test
-  public void testParsePaddedFronts() throws Exception {
-    DestinationList dl = new DestinationList();
-    dl.parseLabel(LABEL, F_PAD_F, null);
-    Set<Branch.NameKey> branches = dl.getDestinations(LABEL);
-    assertThat(branches).containsExactlyElementsIn(D_SIMPLE);
-  }
-
-  @Test
-  public void testParsePaddedEnds() throws Exception {
-    DestinationList dl = new DestinationList();
-    dl.parseLabel(LABEL, F_PAD_E, null);
-    Set<Branch.NameKey> branches = dl.getDestinations(LABEL);
-    assertThat(branches).containsExactlyElementsIn(D_SIMPLE);
-  }
-
-  @Test
-  public void testParseComplex() throws Exception {
-    DestinationList dl = new DestinationList();
-    dl.parseLabel(LABEL, L_COMPLEX, null);
-    Set<Branch.NameKey> branches = dl.getDestinations(LABEL);
-    assertThat(branches).contains(B_COMPLEX);
-  }
-
-  @Test(expected = IOException.class)
-  public void testParseBad() throws IOException {
-    ValidationError.Sink sink = createNiceMock(ValidationError.Sink.class);
-    replay(sink);
-    new DestinationList().parseLabel(LABEL, L_BAD, sink);
-  }
-
-  @Test
-  public void testParse2Labels() throws Exception {
-    DestinationList dl = new DestinationList();
-    dl.parseLabel(LABEL, F_SIMPLE, null);
-    Set<Branch.NameKey> branches = dl.getDestinations(LABEL);
-    assertThat(branches).containsExactlyElementsIn(D_SIMPLE);
-
-    dl.parseLabel(LABEL2, L_COMPLEX, null);
-    branches = dl.getDestinations(LABEL);
-    assertThat(branches).containsExactlyElementsIn(D_SIMPLE);
-    branches = dl.getDestinations(LABEL2);
-    assertThat(branches).contains(B_COMPLEX);
-  }
-
-  @Test
-  public void testAsText() throws Exception {
-    String text = HEADER_PROPER + "#\n" + F_PROPER;
-    DestinationList dl = new DestinationList();
-    dl.parseLabel(LABEL, F_SIMPLE, null);
-    String asText = dl.asText(LABEL);
-    assertThat(text).isEqualTo(asText);
-
-    dl.parseLabel(LABEL2, asText, null);
-    assertThat(text).isEqualTo(dl.asText(LABEL2));
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/git/GroupListTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/git/GroupListTest.java
deleted file mode 100644
index 30f0ed5..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/git/GroupListTest.java
+++ /dev/null
@@ -1,120 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.git;
-
-import static org.easymock.EasyMock.anyObject;
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.createNiceMock;
-import static org.easymock.EasyMock.expectLastCall;
-import static org.easymock.EasyMock.replay;
-import static org.easymock.EasyMock.verify;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Project;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Set;
-import org.junit.Before;
-import org.junit.Test;
-
-public class GroupListTest {
-  private static final Project.NameKey PROJECT = new Project.NameKey("project");
-  private static final String TEXT =
-      "# UUID                                  \tGroup Name\n"
-          + "#\n"
-          + "d96b998f8a66ff433af50befb975d0e2bb6e0999\tNon-Interactive Users\n"
-          + "ebe31c01aec2c9ac3b3c03e87a47450829ff4310\tAdministrators\n";
-
-  private GroupList groupList;
-
-  @Before
-  public void setup() throws IOException {
-    ValidationError.Sink sink = createNiceMock(ValidationError.Sink.class);
-    replay(sink);
-    groupList = GroupList.parse(PROJECT, TEXT, sink);
-  }
-
-  @Test
-  public void byUUID() throws Exception {
-    AccountGroup.UUID uuid = new AccountGroup.UUID("d96b998f8a66ff433af50befb975d0e2bb6e0999");
-
-    GroupReference groupReference = groupList.byUUID(uuid);
-
-    assertEquals(uuid, groupReference.getUUID());
-    assertEquals("Non-Interactive Users", groupReference.getName());
-  }
-
-  @Test
-  public void put() {
-    AccountGroup.UUID uuid = new AccountGroup.UUID("abc");
-    GroupReference groupReference = new GroupReference(uuid, "Hutzliputz");
-
-    groupList.put(uuid, groupReference);
-
-    assertEquals(3, groupList.references().size());
-    GroupReference found = groupList.byUUID(uuid);
-    assertEquals(groupReference, found);
-  }
-
-  @Test
-  public void references() throws Exception {
-    Collection<GroupReference> result = groupList.references();
-
-    assertEquals(2, result.size());
-    AccountGroup.UUID uuid = new AccountGroup.UUID("ebe31c01aec2c9ac3b3c03e87a47450829ff4310");
-    GroupReference expected = new GroupReference(uuid, "Administrators");
-
-    assertTrue(result.contains(expected));
-  }
-
-  @Test
-  public void uUIDs() throws Exception {
-    Set<AccountGroup.UUID> result = groupList.uuids();
-
-    assertEquals(2, result.size());
-    AccountGroup.UUID expected = new AccountGroup.UUID("ebe31c01aec2c9ac3b3c03e87a47450829ff4310");
-    assertTrue(result.contains(expected));
-  }
-
-  @Test
-  public void validationError() throws Exception {
-    ValidationError.Sink sink = createMock(ValidationError.Sink.class);
-    sink.error(anyObject(ValidationError.class));
-    expectLastCall().times(2);
-    replay(sink);
-    groupList = GroupList.parse(PROJECT, TEXT.replace("\t", "    "), sink);
-    verify(sink);
-  }
-
-  @Test
-  public void retainAll() throws Exception {
-    AccountGroup.UUID uuid = new AccountGroup.UUID("d96b998f8a66ff433af50befb975d0e2bb6e0999");
-    groupList.retainUUIDs(Collections.singleton(uuid));
-
-    assertNotNull(groupList.byUUID(uuid));
-    assertNull(groupList.byUUID(new AccountGroup.UUID("ebe31c01aec2c9ac3b3c03e87a47450829ff4310")));
-  }
-
-  @Test
-  public void asText() throws Exception {
-    assertTrue(TEXT.equals(groupList.asText()));
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/git/LabelNormalizerTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/git/LabelNormalizerTest.java
deleted file mode 100644
index 5453fad..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/git/LabelNormalizerTest.java
+++ /dev/null
@@ -1,227 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.git;
-
-import static com.google.gerrit.common.data.Permission.forLabel;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-import static com.google.gerrit.server.project.Util.allow;
-import static com.google.gerrit.server.project.Util.category;
-import static com.google.gerrit.server.project.Util.value;
-import static org.junit.Assert.assertEquals;
-
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.common.data.AccessSection;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.lifecycle.LifecycleManager;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.LabelId;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.client.PatchSetInfo;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountManager;
-import com.google.gerrit.server.account.AuthRequest;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.git.LabelNormalizer.Result;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.schema.SchemaCreator;
-import com.google.gerrit.server.util.RequestContext;
-import com.google.gerrit.server.util.ThreadLocalRequestContext;
-import com.google.gerrit.testutil.InMemoryDatabase;
-import com.google.gerrit.testutil.InMemoryModule;
-import com.google.inject.Guice;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.Provider;
-import com.google.inject.util.Providers;
-import java.util.List;
-import org.eclipse.jgit.lib.Repository;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-/** Unit tests for {@link LabelNormalizer}. */
-public class LabelNormalizerTest {
-  @Inject private AccountManager accountManager;
-  @Inject private AllProjectsName allProjects;
-  @Inject private GitRepositoryManager repoManager;
-  @Inject private IdentifiedUser.GenericFactory userFactory;
-  @Inject private InMemoryDatabase schemaFactory;
-  @Inject private LabelNormalizer norm;
-  @Inject private MetaDataUpdate.User metaDataUpdateFactory;
-  @Inject private ProjectCache projectCache;
-  @Inject private SchemaCreator schemaCreator;
-  @Inject protected ThreadLocalRequestContext requestContext;
-  @Inject private ChangeNotes.Factory changeNotesFactory;
-
-  private LifecycleManager lifecycle;
-  private ReviewDb db;
-  private Account.Id userId;
-  private IdentifiedUser user;
-  private Change change;
-  private ChangeNotes notes;
-
-  @Before
-  public void setUpInjector() throws Exception {
-    Injector injector = Guice.createInjector(new InMemoryModule());
-    injector.injectMembers(this);
-    lifecycle = new LifecycleManager();
-    lifecycle.add(injector);
-    lifecycle.start();
-
-    db = schemaFactory.open();
-    schemaCreator.create(db);
-    userId = accountManager.authenticate(AuthRequest.forUser("user")).getAccountId();
-    user = userFactory.create(userId);
-
-    requestContext.setContext(
-        new RequestContext() {
-          @Override
-          public CurrentUser getUser() {
-            return user;
-          }
-
-          @Override
-          public Provider<ReviewDb> getReviewDbProvider() {
-            return Providers.of(db);
-          }
-        });
-
-    configureProject();
-    setUpChange();
-  }
-
-  private void configureProject() throws Exception {
-    ProjectConfig pc = loadAllProjects();
-    for (AccessSection sec : pc.getAccessSections()) {
-      for (String label : pc.getLabelSections().keySet()) {
-        sec.removePermission(forLabel(label));
-      }
-    }
-    LabelType lt =
-        category("Verified", value(1, "Verified"), value(0, "No score"), value(-1, "Fails"));
-    pc.getLabelSections().put(lt.getName(), lt);
-    save(pc);
-  }
-
-  private void setUpChange() throws Exception {
-    change =
-        new Change(
-            new Change.Key("Iabcd1234abcd1234abcd1234abcd1234abcd1234"),
-            new Change.Id(1),
-            userId,
-            new Branch.NameKey(allProjects, "refs/heads/master"),
-            TimeUtil.nowTs());
-    PatchSetInfo ps = new PatchSetInfo(new PatchSet.Id(change.getId(), 1));
-    ps.setSubject("Test change");
-    change.setCurrentPatchSet(ps);
-    db.changes().insert(ImmutableList.of(change));
-    notes = changeNotesFactory.createChecked(db, change);
-  }
-
-  @After
-  public void tearDown() {
-    if (lifecycle != null) {
-      lifecycle.stop();
-    }
-    requestContext.setContext(null);
-    if (db != null) {
-      db.close();
-    }
-    InMemoryDatabase.drop(schemaFactory);
-  }
-
-  @Test
-  public void noNormalizeByPermission() throws Exception {
-    ProjectConfig pc = loadAllProjects();
-    allow(pc, forLabel("Code-Review"), -1, 1, REGISTERED_USERS, "refs/heads/*");
-    allow(pc, forLabel("Verified"), -1, 1, REGISTERED_USERS, "refs/heads/*");
-    save(pc);
-
-    PatchSetApproval cr = psa(userId, "Code-Review", 2);
-    PatchSetApproval v = psa(userId, "Verified", 1);
-    assertEquals(Result.create(list(cr, v), list(), list()), norm.normalize(notes, list(cr, v)));
-  }
-
-  @Test
-  public void normalizeByType() throws Exception {
-    ProjectConfig pc = loadAllProjects();
-    allow(pc, forLabel("Code-Review"), -5, 5, REGISTERED_USERS, "refs/heads/*");
-    allow(pc, forLabel("Verified"), -5, 5, REGISTERED_USERS, "refs/heads/*");
-    save(pc);
-
-    PatchSetApproval cr = psa(userId, "Code-Review", 5);
-    PatchSetApproval v = psa(userId, "Verified", 5);
-    assertEquals(
-        Result.create(list(), list(copy(cr, 2), copy(v, 1)), list()),
-        norm.normalize(notes, list(cr, v)));
-  }
-
-  @Test
-  public void emptyPermissionRangeKeepsResult() throws Exception {
-    PatchSetApproval cr = psa(userId, "Code-Review", 1);
-    PatchSetApproval v = psa(userId, "Verified", 1);
-    assertEquals(Result.create(list(cr, v), list(), list()), norm.normalize(notes, list(cr, v)));
-  }
-
-  @Test
-  public void explicitZeroVoteOnNonEmptyRangeIsPresent() throws Exception {
-    ProjectConfig pc = loadAllProjects();
-    allow(pc, forLabel("Code-Review"), -1, 1, REGISTERED_USERS, "refs/heads/*");
-    save(pc);
-
-    PatchSetApproval cr = psa(userId, "Code-Review", 0);
-    PatchSetApproval v = psa(userId, "Verified", 0);
-    assertEquals(Result.create(list(cr, v), list(), list()), norm.normalize(notes, list(cr, v)));
-  }
-
-  private ProjectConfig loadAllProjects() throws Exception {
-    try (Repository repo = repoManager.openRepository(allProjects)) {
-      ProjectConfig pc = new ProjectConfig(allProjects);
-      pc.load(repo);
-      return pc;
-    }
-  }
-
-  private void save(ProjectConfig pc) throws Exception {
-    try (MetaDataUpdate md = metaDataUpdateFactory.create(pc.getProject().getNameKey(), user)) {
-      pc.commit(md);
-      projectCache.evict(pc.getProject().getNameKey());
-    }
-  }
-
-  private PatchSetApproval psa(Account.Id accountId, String label, int value) {
-    return new PatchSetApproval(
-        new PatchSetApproval.Key(change.currentPatchSetId(), accountId, new LabelId(label)),
-        (short) value,
-        TimeUtil.nowTs());
-  }
-
-  private PatchSetApproval copy(PatchSetApproval src, int newValue) {
-    PatchSetApproval result = new PatchSetApproval(src.getKey().getParentKey(), src);
-    result.setValue((short) newValue);
-    return result;
-  }
-
-  private static List<PatchSetApproval> list(PatchSetApproval... psas) {
-    return ImmutableList.<PatchSetApproval>copyOf(psas);
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/git/LocalDiskRepositoryManagerTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/git/LocalDiskRepositoryManagerTest.java
deleted file mode 100644
index 286f694..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/git/LocalDiskRepositoryManagerTest.java
+++ /dev/null
@@ -1,251 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.git;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.TruthJUnit.assume;
-
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.util.HostPlatform;
-import com.google.gerrit.testutil.TempFileUtil;
-import com.google.gwtorm.client.KeyUtil;
-import com.google.gwtorm.server.StandardKeyEncoder;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import org.easymock.EasyMockSupport;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.lib.RepositoryCache;
-import org.eclipse.jgit.lib.RepositoryCache.FileKey;
-import org.eclipse.jgit.util.FS;
-import org.junit.Before;
-import org.junit.Test;
-
-public class LocalDiskRepositoryManagerTest extends EasyMockSupport {
-
-  static {
-    KeyUtil.setEncoderImpl(new StandardKeyEncoder());
-  }
-
-  private Config cfg;
-  private SitePaths site;
-  private LocalDiskRepositoryManager repoManager;
-
-  @Before
-  public void setUp() throws Exception {
-    site = new SitePaths(TempFileUtil.createTempDirectory().toPath());
-    site.resolve("git").toFile().mkdir();
-    cfg = new Config();
-    cfg.setString("gerrit", null, "basePath", "git");
-    repoManager = new LocalDiskRepositoryManager(site, cfg);
-  }
-
-  @Test(expected = IllegalStateException.class)
-  public void testThatNullBasePathThrowsAnException() {
-    new LocalDiskRepositoryManager(site, new Config());
-  }
-
-  @Test
-  public void projectCreation() throws Exception {
-    Project.NameKey projectA = new Project.NameKey("projectA");
-    try (Repository repo = repoManager.createRepository(projectA)) {
-      assertThat(repo).isNotNull();
-    }
-    try (Repository repo = repoManager.openRepository(projectA)) {
-      assertThat(repo).isNotNull();
-    }
-    assertThat(repoManager.list()).containsExactly(projectA);
-  }
-
-  @Test(expected = RepositoryNotFoundException.class)
-  public void testProjectCreationWithEmptyName() throws Exception {
-    repoManager.createRepository(new Project.NameKey(""));
-  }
-
-  @Test(expected = RepositoryNotFoundException.class)
-  public void testProjectCreationWithTrailingSlash() throws Exception {
-    repoManager.createRepository(new Project.NameKey("projectA/"));
-  }
-
-  @Test(expected = RepositoryNotFoundException.class)
-  public void testProjectCreationWithBackSlash() throws Exception {
-    repoManager.createRepository(new Project.NameKey("a\\projectA"));
-  }
-
-  @Test(expected = RepositoryNotFoundException.class)
-  public void testProjectCreationAbsolutePath() throws Exception {
-    repoManager.createRepository(new Project.NameKey("/projectA"));
-  }
-
-  @Test(expected = RepositoryNotFoundException.class)
-  public void testProjectCreationStartingWithDotDot() throws Exception {
-    repoManager.createRepository(new Project.NameKey("../projectA"));
-  }
-
-  @Test(expected = RepositoryNotFoundException.class)
-  public void testProjectCreationContainsDotDot() throws Exception {
-    repoManager.createRepository(new Project.NameKey("a/../projectA"));
-  }
-
-  @Test(expected = RepositoryNotFoundException.class)
-  public void testProjectCreationDotPathSegment() throws Exception {
-    repoManager.createRepository(new Project.NameKey("a/./projectA"));
-  }
-
-  @Test(expected = RepositoryNotFoundException.class)
-  public void testProjectCreationWithTwoSlashes() throws Exception {
-    repoManager.createRepository(new Project.NameKey("a//projectA"));
-  }
-
-  @Test(expected = RepositoryNotFoundException.class)
-  public void testProjectCreationWithPathSegmentEndingByDotGit() throws Exception {
-    repoManager.createRepository(new Project.NameKey("a/b.git/projectA"));
-  }
-
-  @Test(expected = RepositoryNotFoundException.class)
-  public void testProjectCreationWithQuestionMark() throws Exception {
-    repoManager.createRepository(new Project.NameKey("project?A"));
-  }
-
-  @Test(expected = RepositoryNotFoundException.class)
-  public void testProjectCreationWithPercentageSign() throws Exception {
-    repoManager.createRepository(new Project.NameKey("project%A"));
-  }
-
-  @Test(expected = RepositoryNotFoundException.class)
-  public void testProjectCreationWithWidlcard() throws Exception {
-    repoManager.createRepository(new Project.NameKey("project*A"));
-  }
-
-  @Test(expected = RepositoryNotFoundException.class)
-  public void testProjectCreationWithColon() throws Exception {
-    repoManager.createRepository(new Project.NameKey("project:A"));
-  }
-
-  @Test(expected = RepositoryNotFoundException.class)
-  public void testProjectCreationWithLessThatSign() throws Exception {
-    repoManager.createRepository(new Project.NameKey("project<A"));
-  }
-
-  @Test(expected = RepositoryNotFoundException.class)
-  public void testProjectCreationWithGreaterThatSign() throws Exception {
-    repoManager.createRepository(new Project.NameKey("project>A"));
-  }
-
-  @Test(expected = RepositoryNotFoundException.class)
-  public void testProjectCreationWithPipe() throws Exception {
-    repoManager.createRepository(new Project.NameKey("project|A"));
-  }
-
-  @Test(expected = RepositoryNotFoundException.class)
-  public void testProjectCreationWithDollarSign() throws Exception {
-    repoManager.createRepository(new Project.NameKey("project$A"));
-  }
-
-  @Test(expected = RepositoryNotFoundException.class)
-  public void testProjectCreationWithCarriageReturn() throws Exception {
-    repoManager.createRepository(new Project.NameKey("project\\rA"));
-  }
-
-  @Test(expected = IllegalStateException.class)
-  public void testProjectRecreation() throws Exception {
-    repoManager.createRepository(new Project.NameKey("a"));
-    repoManager.createRepository(new Project.NameKey("a"));
-  }
-
-  @Test(expected = IllegalStateException.class)
-  public void testProjectRecreationAfterRestart() throws Exception {
-    repoManager.createRepository(new Project.NameKey("a"));
-    LocalDiskRepositoryManager newRepoManager = new LocalDiskRepositoryManager(site, cfg);
-    newRepoManager.createRepository(new Project.NameKey("a"));
-  }
-
-  @Test
-  public void openRepositoryCreatedDirectlyOnDisk() throws Exception {
-    Project.NameKey projectA = new Project.NameKey("projectA");
-    createRepository(repoManager.getBasePath(projectA), projectA.get());
-    try (Repository repo = repoManager.openRepository(projectA)) {
-      assertThat(repo).isNotNull();
-    }
-    assertThat(repoManager.list()).containsExactly(projectA);
-  }
-
-  @Test(expected = RepositoryCaseMismatchException.class)
-  public void testNameCaseMismatch() throws Exception {
-    assume().that(HostPlatform.isWin32() || HostPlatform.isMac()).isTrue();
-    repoManager.createRepository(new Project.NameKey("a"));
-    repoManager.createRepository(new Project.NameKey("A"));
-  }
-
-  @Test(expected = RepositoryCaseMismatchException.class)
-  public void testNameCaseMismatchWithSymlink() throws Exception {
-    assume().that(HostPlatform.isWin32() || HostPlatform.isMac()).isTrue();
-    Project.NameKey name = new Project.NameKey("a");
-    repoManager.createRepository(name);
-    createSymLink(name, "b.git");
-    repoManager.createRepository(new Project.NameKey("B"));
-  }
-
-  @Test(expected = RepositoryCaseMismatchException.class)
-  public void testNameCaseMismatchAfterRestart() throws Exception {
-    assume().that(HostPlatform.isWin32() || HostPlatform.isMac()).isTrue();
-    Project.NameKey name = new Project.NameKey("a");
-    repoManager.createRepository(name);
-
-    LocalDiskRepositoryManager newRepoManager = new LocalDiskRepositoryManager(site, cfg);
-    newRepoManager.createRepository(new Project.NameKey("A"));
-  }
-
-  private void createSymLink(Project.NameKey project, String link) throws IOException {
-    Path base = repoManager.getBasePath(project);
-    Path projectDir = base.resolve(project.get() + ".git");
-    Path symlink = base.resolve(link);
-    Files.createSymbolicLink(symlink, projectDir);
-  }
-
-  @Test(expected = RepositoryNotFoundException.class)
-  public void testOpenRepositoryInvalidName() throws Exception {
-    repoManager.openRepository(new Project.NameKey("project%?|<>A"));
-  }
-
-  @Test
-  public void list() throws Exception {
-    Project.NameKey projectA = new Project.NameKey("projectA");
-    createRepository(repoManager.getBasePath(projectA), projectA.get());
-
-    Project.NameKey projectB = new Project.NameKey("path/projectB");
-    createRepository(repoManager.getBasePath(projectB), projectB.get());
-
-    Project.NameKey projectC = new Project.NameKey("anotherPath/path/projectC");
-    createRepository(repoManager.getBasePath(projectC), projectC.get());
-    // create an invalid git repo named only .git
-    repoManager.getBasePath(null).resolve(".git").toFile().mkdir();
-    // create an invalid repo name
-    createRepository(repoManager.getBasePath(null), "project?A");
-    assertThat(repoManager.list()).containsExactly(projectA, projectB, projectC);
-  }
-
-  private void createRepository(Path directory, String projectName) throws IOException {
-    String n = projectName + Constants.DOT_GIT_EXT;
-    FileKey loc = FileKey.exact(directory.resolve(n).toFile(), FS.DETECTED);
-    try (Repository db = RepositoryCache.open(loc, false)) {
-      db.create(true /* bare */);
-    }
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/git/MultiBaseLocalDiskRepositoryManagerTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/git/MultiBaseLocalDiskRepositoryManagerTest.java
deleted file mode 100644
index 842ddbd..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/git/MultiBaseLocalDiskRepositoryManagerTest.java
+++ /dev/null
@@ -1,164 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.git;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.easymock.EasyMock.createNiceMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
-import static org.easymock.EasyMock.reset;
-
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.config.RepositoryConfig;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.testutil.GerritBaseTests;
-import com.google.gerrit.testutil.TempFileUtil;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.SortedSet;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.lib.RepositoryCache;
-import org.eclipse.jgit.lib.RepositoryCache.FileKey;
-import org.eclipse.jgit.util.FS;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-public class MultiBaseLocalDiskRepositoryManagerTest extends GerritBaseTests {
-  private Config cfg;
-  private SitePaths site;
-  private MultiBaseLocalDiskRepositoryManager repoManager;
-  private RepositoryConfig configMock;
-
-  @Before
-  public void setUp() throws IOException {
-    site = new SitePaths(TempFileUtil.createTempDirectory().toPath());
-    site.resolve("git").toFile().mkdir();
-    cfg = new Config();
-    cfg.setString("gerrit", null, "basePath", "git");
-    configMock = createNiceMock(RepositoryConfig.class);
-    expect(configMock.getAllBasePaths()).andReturn(new ArrayList<Path>()).anyTimes();
-    replay(configMock);
-    repoManager = new MultiBaseLocalDiskRepositoryManager(site, cfg, configMock);
-  }
-
-  @After
-  public void tearDown() throws IOException {
-    TempFileUtil.cleanup();
-  }
-
-  @Test
-  public void defaultRepositoryLocation()
-      throws RepositoryCaseMismatchException, RepositoryNotFoundException, IOException {
-    Project.NameKey someProjectKey = new Project.NameKey("someProject");
-    Repository repo = repoManager.createRepository(someProjectKey);
-    assertThat(repo.getDirectory()).isNotNull();
-    assertThat(repo.getDirectory().exists()).isTrue();
-    assertThat(repo.getDirectory().getParent())
-        .isEqualTo(repoManager.getBasePath(someProjectKey).toAbsolutePath().toString());
-
-    repo = repoManager.openRepository(someProjectKey);
-    assertThat(repo.getDirectory()).isNotNull();
-    assertThat(repo.getDirectory().exists()).isTrue();
-    assertThat(repo.getDirectory().getParent())
-        .isEqualTo(repoManager.getBasePath(someProjectKey).toAbsolutePath().toString());
-
-    assertThat(repoManager.getBasePath(someProjectKey).toAbsolutePath().toString())
-        .isEqualTo(repoManager.getBasePath(someProjectKey).toAbsolutePath().toString());
-
-    SortedSet<Project.NameKey> repoList = repoManager.list();
-    assertThat(repoList).hasSize(1);
-    assertThat(repoList.toArray(new Project.NameKey[repoList.size()]))
-        .isEqualTo(new Project.NameKey[] {someProjectKey});
-  }
-
-  @Test
-  public void alternateRepositoryLocation() throws IOException {
-    Path alternateBasePath = TempFileUtil.createTempDirectory().toPath();
-    Project.NameKey someProjectKey = new Project.NameKey("someProject");
-    reset(configMock);
-    expect(configMock.getBasePath(someProjectKey)).andReturn(alternateBasePath).anyTimes();
-    expect(configMock.getAllBasePaths()).andReturn(Arrays.asList(alternateBasePath)).anyTimes();
-    replay(configMock);
-
-    Repository repo = repoManager.createRepository(someProjectKey);
-    assertThat(repo.getDirectory()).isNotNull();
-    assertThat(repo.getDirectory().exists()).isTrue();
-    assertThat(repo.getDirectory().getParent()).isEqualTo(alternateBasePath.toString());
-
-    repo = repoManager.openRepository(someProjectKey);
-    assertThat(repo.getDirectory()).isNotNull();
-    assertThat(repo.getDirectory().exists()).isTrue();
-    assertThat(repo.getDirectory().getParent()).isEqualTo(alternateBasePath.toString());
-
-    assertThat(repoManager.getBasePath(someProjectKey).toAbsolutePath().toString())
-        .isEqualTo(alternateBasePath.toString());
-
-    SortedSet<Project.NameKey> repoList = repoManager.list();
-    assertThat(repoList).hasSize(1);
-    assertThat(repoList.toArray(new Project.NameKey[repoList.size()]))
-        .isEqualTo(new Project.NameKey[] {someProjectKey});
-  }
-
-  @Test
-  public void listReturnRepoFromProperLocation() throws IOException {
-    Project.NameKey basePathProject = new Project.NameKey("basePathProject");
-    Project.NameKey altPathProject = new Project.NameKey("altPathProject");
-    Project.NameKey misplacedProject1 = new Project.NameKey("misplacedProject1");
-    Project.NameKey misplacedProject2 = new Project.NameKey("misplacedProject2");
-
-    Path alternateBasePath = TempFileUtil.createTempDirectory().toPath();
-
-    reset(configMock);
-    expect(configMock.getBasePath(altPathProject)).andReturn(alternateBasePath).anyTimes();
-    expect(configMock.getBasePath(misplacedProject2)).andReturn(alternateBasePath).anyTimes();
-    expect(configMock.getAllBasePaths()).andReturn(Arrays.asList(alternateBasePath)).anyTimes();
-    replay(configMock);
-
-    repoManager.createRepository(basePathProject);
-    repoManager.createRepository(altPathProject);
-    // create the misplaced ones without the repomanager otherwise they would
-    // end up at the proper place.
-    createRepository(repoManager.getBasePath(basePathProject), misplacedProject2);
-    createRepository(alternateBasePath, misplacedProject1);
-
-    SortedSet<Project.NameKey> repoList = repoManager.list();
-    assertThat(repoList).hasSize(2);
-    assertThat(repoList.toArray(new Project.NameKey[repoList.size()]))
-        .isEqualTo(new Project.NameKey[] {altPathProject, basePathProject});
-  }
-
-  private void createRepository(Path directory, Project.NameKey projectName) throws IOException {
-    String n = projectName.get() + Constants.DOT_GIT_EXT;
-    FileKey loc = FileKey.exact(directory.resolve(n).toFile(), FS.DETECTED);
-    try (Repository db = RepositoryCache.open(loc, false)) {
-      db.create(true /* bare */);
-    }
-  }
-
-  @Test(expected = IllegalStateException.class)
-  public void testRelativeAlternateLocation() {
-    configMock = createNiceMock(RepositoryConfig.class);
-    expect(configMock.getAllBasePaths()).andReturn(Arrays.asList(Paths.get("repos"))).anyTimes();
-    replay(configMock);
-    repoManager = new MultiBaseLocalDiskRepositoryManager(site, cfg, configMock);
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/git/ProjectConfigTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/git/ProjectConfigTest.java
deleted file mode 100644
index cae8fec..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/git/ProjectConfigTest.java
+++ /dev/null
@@ -1,540 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.server.git;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth.assertWithMessage;
-
-import com.google.common.collect.Iterables;
-import com.google.gerrit.common.data.AccessSection;
-import com.google.gerrit.common.data.ContributorAgreement;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.common.data.PermissionRule;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.config.PluginConfig;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.project.CommentLinkInfoImpl;
-import com.google.gwtorm.client.KeyUtil;
-import com.google.gwtorm.server.StandardKeyEncoder;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Map;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.IncorrectObjectTypeException;
-import org.eclipse.jgit.errors.MissingObjectException;
-import org.eclipse.jgit.junit.LocalDiskRepositoryTestCase;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.RefUpdate.Result;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevObject;
-import org.eclipse.jgit.util.RawParseUtils;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-public class ProjectConfigTest extends LocalDiskRepositoryTestCase {
-  private static final String LABEL_SCORES_CONFIG =
-      "  copyMinScore = "
-          + !LabelType.DEF_COPY_MIN_SCORE
-          + "\n" //
-          + "  copyMaxScore = "
-          + !LabelType.DEF_COPY_MAX_SCORE
-          + "\n" //
-          + "  copyAllScoresOnMergeFirstParentUpdate = "
-          + !LabelType.DEF_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE
-          + "\n" //
-          + "  copyAllScoresOnTrivialRebase = "
-          + !LabelType.DEF_COPY_ALL_SCORES_ON_TRIVIAL_REBASE
-          + "\n" //
-          + "  copyAllScoresIfNoCodeChange = "
-          + !LabelType.DEF_COPY_ALL_SCORES_IF_NO_CODE_CHANGE
-          + "\n" //
-          + "  copyAllScoresIfNoChange = "
-          + !LabelType.DEF_COPY_ALL_SCORES_IF_NO_CHANGE
-          + "\n";
-
-  private final GroupReference developers =
-      new GroupReference(new AccountGroup.UUID("X"), "Developers");
-  private final GroupReference staff = new GroupReference(new AccountGroup.UUID("Y"), "Staff");
-
-  private Repository db;
-  private TestRepository<Repository> util;
-
-  @BeforeClass
-  public static void setUpOnce() {
-    KeyUtil.setEncoderImpl(new StandardKeyEncoder());
-  }
-
-  @Override
-  @Before
-  public void setUp() throws Exception {
-    super.setUp();
-    db = createBareRepository();
-    util = new TestRepository<>(db);
-  }
-
-  @Test
-  public void readConfig() throws Exception {
-    RevCommit rev =
-        util.commit(
-            util.tree( //
-                util.file("groups", util.blob(group(developers))), //
-                util.file(
-                    "project.config",
-                    util.blob(
-                        "" //
-                            + "[access \"refs/heads/*\"]\n" //
-                            + "  exclusiveGroupPermissions = read submit create\n" //
-                            + "  submit = group Developers\n" //
-                            + "  push = group Developers\n" //
-                            + "  read = group Developers\n" //
-                            + "[accounts]\n" //
-                            + "  sameGroupVisibility = deny group Developers\n" //
-                            + "  sameGroupVisibility = block group Staff\n" //
-                            + "[contributor-agreement \"Individual\"]\n" //
-                            + "  description = A simple description\n" //
-                            + "  accepted = group Developers\n" //
-                            + "  accepted = group Staff\n" //
-                            + "  autoVerify = group Developers\n" //
-                            + "  agreementUrl = http://www.example.com/agree\n")) //
-                ));
-
-    ProjectConfig cfg = read(rev);
-    assertThat(cfg.getAccountsSection().getSameGroupVisibility()).hasSize(2);
-    ContributorAgreement ca = cfg.getContributorAgreement("Individual");
-    assertThat(ca.getName()).isEqualTo("Individual");
-    assertThat(ca.getDescription()).isEqualTo("A simple description");
-    assertThat(ca.getAgreementUrl()).isEqualTo("http://www.example.com/agree");
-    assertThat(ca.getAccepted()).hasSize(2);
-    assertThat(ca.getAccepted().get(0).getGroup()).isEqualTo(developers);
-    assertThat(ca.getAccepted().get(1).getGroup().getName()).isEqualTo("Staff");
-    assertThat(ca.getAutoVerify().getName()).isEqualTo("Developers");
-
-    AccessSection section = cfg.getAccessSection("refs/heads/*");
-    assertThat(section).isNotNull();
-    assertThat(cfg.getAccessSection("refs/*")).isNull();
-
-    Permission create = section.getPermission(Permission.CREATE);
-    Permission submit = section.getPermission(Permission.SUBMIT);
-    Permission read = section.getPermission(Permission.READ);
-    Permission push = section.getPermission(Permission.PUSH);
-
-    assertThat(create.getExclusiveGroup()).isTrue();
-    assertThat(submit.getExclusiveGroup()).isTrue();
-    assertThat(read.getExclusiveGroup()).isTrue();
-    assertThat(push.getExclusiveGroup()).isFalse();
-  }
-
-  @Test
-  public void readConfigLabelDefaultValue() throws Exception {
-    RevCommit rev =
-        util.commit(
-            util.tree( //
-                util.file("groups", util.blob(group(developers))), //
-                util.file(
-                    "project.config",
-                    util.blob(
-                        "" //
-                            + "[label \"CustomLabel\"]\n" //
-                            + "  value = -1 Negative\n" //
-                            + "  value =  0 No Score\n" //
-                            + "  value =  1 Positive\n")) //
-                ));
-
-    ProjectConfig cfg = read(rev);
-    Map<String, LabelType> labels = cfg.getLabelSections();
-    Short dv = labels.entrySet().iterator().next().getValue().getDefaultValue();
-    assertThat((int) dv).isEqualTo(0);
-  }
-
-  @Test
-  public void readConfigLabelDefaultValueInRange() throws Exception {
-    RevCommit rev =
-        util.commit(
-            util.tree( //
-                util.file("groups", util.blob(group(developers))), //
-                util.file(
-                    "project.config",
-                    util.blob(
-                        "" //
-                            + "[label \"CustomLabel\"]\n" //
-                            + "  value = -1 Negative\n" //
-                            + "  value =  0 No Score\n" //
-                            + "  value =  1 Positive\n" //
-                            + "  defaultValue = -1\n")) //
-                ));
-
-    ProjectConfig cfg = read(rev);
-    Map<String, LabelType> labels = cfg.getLabelSections();
-    Short dv = labels.entrySet().iterator().next().getValue().getDefaultValue();
-    assertThat((int) dv).isEqualTo(-1);
-  }
-
-  @Test
-  public void readConfigLabelDefaultValueNotInRange() throws Exception {
-    RevCommit rev =
-        util.commit(
-            util.tree( //
-                util.file("groups", util.blob(group(developers))), //
-                util.file(
-                    "project.config",
-                    util.blob(
-                        "" //
-                            + "[label \"CustomLabel\"]\n" //
-                            + "  value = -1 Negative\n" //
-                            + "  value =  0 No Score\n" //
-                            + "  value =  1 Positive\n" //
-                            + "  defaultValue = -2\n")) //
-                ));
-
-    ProjectConfig cfg = read(rev);
-    assertThat(cfg.getValidationErrors()).hasSize(1);
-    assertThat(Iterables.getOnlyElement(cfg.getValidationErrors()).getMessage())
-        .isEqualTo("project.config: Invalid defaultValue \"-2\" for label \"CustomLabel\"");
-  }
-
-  @Test
-  public void readConfigLabelScores() throws Exception {
-    RevCommit rev =
-        util.commit(
-            util.tree( //
-                util.file("groups", util.blob(group(developers))), //
-                util.file(
-                    "project.config",
-                    util.blob(
-                        "" //
-                            + "[label \"CustomLabel\"]\n" //
-                            + LABEL_SCORES_CONFIG)) //
-                ));
-
-    ProjectConfig cfg = read(rev);
-    Map<String, LabelType> labels = cfg.getLabelSections();
-    LabelType type = labels.entrySet().iterator().next().getValue();
-    assertThat(type.isCopyMinScore()).isNotEqualTo(LabelType.DEF_COPY_MIN_SCORE);
-    assertThat(type.isCopyMaxScore()).isNotEqualTo(LabelType.DEF_COPY_MAX_SCORE);
-    assertThat(type.isCopyAllScoresOnMergeFirstParentUpdate())
-        .isNotEqualTo(LabelType.DEF_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE);
-    assertThat(type.isCopyAllScoresOnTrivialRebase())
-        .isNotEqualTo(LabelType.DEF_COPY_ALL_SCORES_ON_TRIVIAL_REBASE);
-    assertThat(type.isCopyAllScoresIfNoCodeChange())
-        .isNotEqualTo(LabelType.DEF_COPY_ALL_SCORES_IF_NO_CODE_CHANGE);
-    assertThat(type.isCopyAllScoresIfNoChange())
-        .isNotEqualTo(LabelType.DEF_COPY_ALL_SCORES_IF_NO_CHANGE);
-  }
-
-  @Test
-  public void editConfig() throws Exception {
-    RevCommit rev =
-        util.commit(
-            util.tree( //
-                util.file("groups", util.blob(group(developers))), //
-                util.file(
-                    "project.config",
-                    util.blob(
-                        "" //
-                            + "[access \"refs/heads/*\"]\n" //
-                            + "  exclusiveGroupPermissions = read submit\n" //
-                            + "  submit = group Developers\n" //
-                            + "  upload = group Developers\n" //
-                            + "  read = group Developers\n" //
-                            + "[accounts]\n" //
-                            + "  sameGroupVisibility = deny group Developers\n" //
-                            + "  sameGroupVisibility = block group Staff\n" //
-                            + "[contributor-agreement \"Individual\"]\n" //
-                            + "  description = A simple description\n" //
-                            + "  accepted = group Developers\n" //
-                            + "  autoVerify = group Developers\n" //
-                            + "  agreementUrl = http://www.example.com/agree\n" //
-                            + "[label \"CustomLabel\"]\n" //
-                            + LABEL_SCORES_CONFIG)) //
-                ));
-    update(rev);
-
-    ProjectConfig cfg = read(rev);
-    AccessSection section = cfg.getAccessSection("refs/heads/*");
-    cfg.getAccountsSection()
-        .setSameGroupVisibility(Collections.singletonList(new PermissionRule(cfg.resolve(staff))));
-    Permission submit = section.getPermission(Permission.SUBMIT);
-    submit.add(new PermissionRule(cfg.resolve(staff)));
-    ContributorAgreement ca = cfg.getContributorAgreement("Individual");
-    ca.setAccepted(Collections.singletonList(new PermissionRule(cfg.resolve(staff))));
-    ca.setAutoVerify(null);
-    ca.setDescription("A new description");
-    rev = commit(cfg);
-    assertThat(text(rev, "project.config"))
-        .isEqualTo(
-            "" //
-                + "[access \"refs/heads/*\"]\n" //
-                + "  exclusiveGroupPermissions = read submit\n" //
-                + "  submit = group Developers\n" //
-                + "\tsubmit = group Staff\n" //
-                + "  upload = group Developers\n" //
-                + "  read = group Developers\n" //
-                + "[accounts]\n" //
-                + "  sameGroupVisibility = group Staff\n" //
-                + "[contributor-agreement \"Individual\"]\n" //
-                + "  description = A new description\n" //
-                + "  accepted = group Staff\n" //
-                + "  agreementUrl = http://www.example.com/agree\n"
-                + "[label \"CustomLabel\"]\n" //
-                + LABEL_SCORES_CONFIG
-                + "\tfunction = MaxWithBlock\n" // label gets this function when it is created
-                + "\tdefaultValue = 0\n"); //  label gets this value when it is created
-  }
-
-  @Test
-  public void editConfigMissingGroupTableEntry() throws Exception {
-    RevCommit rev =
-        util.commit(
-            util.tree( //
-                util.file("groups", util.blob(group(developers))), //
-                util.file(
-                    "project.config",
-                    util.blob(
-                        "" //
-                            + "[access \"refs/heads/*\"]\n" //
-                            + "  exclusiveGroupPermissions = read submit\n" //
-                            + "  submit = group People Who Can Submit\n" //
-                            + "  upload = group Developers\n" //
-                            + "  read = group Developers\n")) //
-                ));
-    update(rev);
-
-    ProjectConfig cfg = read(rev);
-    AccessSection section = cfg.getAccessSection("refs/heads/*");
-    Permission submit = section.getPermission(Permission.SUBMIT);
-    submit.add(new PermissionRule(cfg.resolve(staff)));
-    rev = commit(cfg);
-    assertThat(text(rev, "project.config"))
-        .isEqualTo(
-            "" //
-                + "[access \"refs/heads/*\"]\n" //
-                + "  exclusiveGroupPermissions = read submit\n" //
-                + "  submit = group People Who Can Submit\n" //
-                + "\tsubmit = group Staff\n" //
-                + "  upload = group Developers\n" //
-                + "  read = group Developers\n");
-  }
-
-  @Test
-  public void readExistingPluginConfig() throws Exception {
-    RevCommit rev =
-        util.commit(
-            util.tree( //
-                util.file(
-                    "project.config",
-                    util.blob(
-                        "" //
-                            + "[plugin \"somePlugin\"]\n" //
-                            + "  key1 = value1\n" //
-                            + "  key2 = value2a\n"
-                            + "  key2 = value2b\n")) //
-                ));
-    update(rev);
-
-    ProjectConfig cfg = read(rev);
-    PluginConfig pluginCfg = cfg.getPluginConfig("somePlugin");
-    assertThat(pluginCfg.getNames()).hasSize(2);
-    assertThat(pluginCfg.getString("key1")).isEqualTo("value1");
-    assertThat(pluginCfg.getStringList(("key2"))).isEqualTo(new String[] {"value2a", "value2b"});
-  }
-
-  @Test
-  public void readUnexistingPluginConfig() throws Exception {
-    ProjectConfig cfg = new ProjectConfig(new Project.NameKey("test"));
-    cfg.load(db);
-    PluginConfig pluginCfg = cfg.getPluginConfig("somePlugin");
-    assertThat(pluginCfg.getNames()).isEmpty();
-  }
-
-  @Test
-  public void editPluginConfig() throws Exception {
-    RevCommit rev =
-        util.commit(
-            util.tree( //
-                util.file(
-                    "project.config",
-                    util.blob(
-                        "" //
-                            + "[plugin \"somePlugin\"]\n" //
-                            + "  key1 = value1\n" //
-                            + "  key2 = value2a\n" //
-                            + "  key2 = value2b\n")) //
-                ));
-    update(rev);
-
-    ProjectConfig cfg = read(rev);
-    PluginConfig pluginCfg = cfg.getPluginConfig("somePlugin");
-    pluginCfg.setString("key1", "updatedValue1");
-    pluginCfg.setStringList("key2", Arrays.asList("updatedValue2a", "updatedValue2b"));
-    rev = commit(cfg);
-    assertThat(text(rev, "project.config"))
-        .isEqualTo(
-            "" //
-                + "[plugin \"somePlugin\"]\n" //
-                + "\tkey1 = updatedValue1\n" //
-                + "\tkey2 = updatedValue2a\n" //
-                + "\tkey2 = updatedValue2b\n");
-  }
-
-  @Test
-  public void readPluginConfigGroupReference() throws Exception {
-    RevCommit rev =
-        util.commit(
-            util.tree( //
-                util.file("groups", util.blob(group(developers))), //
-                util.file(
-                    "project.config",
-                    util.blob(
-                        "" //
-                            + "[plugin \"somePlugin\"]\n" //
-                            + "key1 = "
-                            + developers.toConfigValue()
-                            + "\n")) //
-                ));
-    update(rev);
-
-    ProjectConfig cfg = read(rev);
-    PluginConfig pluginCfg = cfg.getPluginConfig("somePlugin");
-    assertThat(pluginCfg.getNames()).hasSize(1);
-    assertThat(pluginCfg.getGroupReference("key1")).isEqualTo(developers);
-  }
-
-  @Test
-  public void readPluginConfigGroupReferenceNotInGroupsFile() throws Exception {
-    RevCommit rev =
-        util.commit(
-            util.tree( //
-                util.file("groups", util.blob(group(developers))), //
-                util.file(
-                    "project.config",
-                    util.blob(
-                        "" //
-                            + "[plugin \"somePlugin\"]\n" //
-                            + "key1 = "
-                            + staff.toConfigValue()
-                            + "\n")) //
-                ));
-    update(rev);
-
-    ProjectConfig cfg = read(rev);
-    assertThat(cfg.getValidationErrors()).hasSize(1);
-    assertThat(Iterables.getOnlyElement(cfg.getValidationErrors()).getMessage())
-        .isEqualTo(
-            "project.config: group \"" + staff.getName() + "\" not in " + GroupList.FILE_NAME);
-  }
-
-  @Test
-  public void editPluginConfigGroupReference() throws Exception {
-    RevCommit rev =
-        util.commit(
-            util.tree( //
-                util.file("groups", util.blob(group(developers))), //
-                util.file(
-                    "project.config",
-                    util.blob(
-                        "" //
-                            + "[plugin \"somePlugin\"]\n" //
-                            + "key1 = "
-                            + developers.toConfigValue()
-                            + "\n")) //
-                ));
-    update(rev);
-
-    ProjectConfig cfg = read(rev);
-    PluginConfig pluginCfg = cfg.getPluginConfig("somePlugin");
-    assertThat(pluginCfg.getNames()).hasSize(1);
-    assertThat(pluginCfg.getGroupReference("key1")).isEqualTo(developers);
-
-    pluginCfg.setGroupReference("key1", staff);
-    rev = commit(cfg);
-    assertThat(text(rev, "project.config"))
-        .isEqualTo(
-            "" //
-                + "[plugin \"somePlugin\"]\n" //
-                + "\tkey1 = "
-                + staff.toConfigValue()
-                + "\n");
-    assertThat(text(rev, "groups"))
-        .isEqualTo(
-            "# UUID\tGroup Name\n" //
-                + "#\n" //
-                + staff.getUUID().get()
-                + "     \t"
-                + staff.getName()
-                + "\n");
-  }
-
-  @Test
-  public void addCommentLink() throws Exception {
-    RevCommit rev = util.commit().create();
-    update(rev);
-
-    ProjectConfig cfg = read(rev);
-    CommentLinkInfoImpl cm = new CommentLinkInfoImpl("Test", "abc.*", null, "<a>link</a>", true);
-    cfg.addCommentLinkSection(cm);
-    rev = commit(cfg);
-    assertThat(text(rev, "project.config"))
-        .isEqualTo("[commentlink \"Test\"]\n\tmatch = abc.*\n\thtml = <a>link</a>\n");
-  }
-
-  private ProjectConfig read(RevCommit rev) throws IOException, ConfigInvalidException {
-    ProjectConfig cfg = new ProjectConfig(new Project.NameKey("test"));
-    cfg.load(db, rev);
-    return cfg;
-  }
-
-  private RevCommit commit(ProjectConfig cfg)
-      throws IOException, MissingObjectException, IncorrectObjectTypeException {
-    try (MetaDataUpdate md =
-        new MetaDataUpdate(GitReferenceUpdated.DISABLED, cfg.getProject().getNameKey(), db)) {
-      util.tick(5);
-      util.setAuthorAndCommitter(md.getCommitBuilder());
-      md.setMessage("Edit\n");
-      cfg.commit(md);
-
-      Ref ref = db.exactRef(RefNames.REFS_CONFIG);
-      return util.getRevWalk().parseCommit(ref.getObjectId());
-    }
-  }
-
-  private void update(RevCommit rev) throws Exception {
-    RefUpdate u = db.updateRef(RefNames.REFS_CONFIG);
-    u.disableRefLog();
-    u.setNewObjectId(rev);
-    Result result = u.forceUpdate();
-    assertWithMessage("Cannot update ref for test: " + result)
-        .that(result)
-        .isAnyOf(Result.FAST_FORWARD, Result.FORCED, Result.NEW, Result.NO_CHANGE);
-  }
-
-  private String text(RevCommit rev, String path) throws Exception {
-    RevObject blob = util.get(rev.getTree(), path);
-    byte[] data = db.open(blob).getCachedBytes(Integer.MAX_VALUE);
-    return RawParseUtils.decode(data);
-  }
-
-  private static String group(GroupReference g) {
-    return g.getUUID().get() + "\t" + g.getName() + "\n";
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/git/QueryListTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/git/QueryListTest.java
deleted file mode 100644
index 8d0f909..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/git/QueryListTest.java
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.git;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.easymock.EasyMock.createNiceMock;
-import static org.easymock.EasyMock.replay;
-
-import java.io.IOException;
-import junit.framework.TestCase;
-import org.junit.Test;
-
-public class QueryListTest extends TestCase {
-  public static final String Q_P = "project:foo";
-  public static final String Q_B = "branch:bar";
-  public static final String Q_COMPLEX = "branch:bar AND peers:'is:open\t'";
-
-  public static final String N_FOO = "foo";
-  public static final String N_BAR = "bar";
-
-  public static final String L_FOO = N_FOO + "\t" + Q_P + "\n";
-  public static final String L_BAR = N_BAR + "\t" + Q_B + "\n";
-  public static final String L_FOO_PROP = N_FOO + "   \t" + Q_P + "\n";
-  public static final String L_BAR_PROP = N_BAR + "   \t" + Q_B + "\n";
-  public static final String L_FOO_PAD_F = " " + N_FOO + "\t" + Q_P + "\n";
-  public static final String L_FOO_PAD_E = N_FOO + " \t" + Q_P + "\n";
-  public static final String L_BAR_PAD_F = N_BAR + "\t " + Q_B + "\n";
-  public static final String L_BAR_PAD_E = N_BAR + "\t" + Q_B + " \n";
-  public static final String L_COMPLEX = N_FOO + "\t" + Q_COMPLEX + "\t \n";
-  public static final String L_BAD = N_FOO + "\n";
-
-  public static final String HEADER = "# Name\tQuery\n";
-  public static final String C1 = "# A Simple Comment\n";
-  public static final String C2 = "# Comment with a tab\t and multi # # #\n";
-
-  public static final String F_SIMPLE = L_FOO + L_BAR;
-  public static final String F_PROPER = L_BAR_PROP + L_FOO_PROP; // alpha order
-  public static final String F_PAD_F = L_FOO_PAD_F + L_BAR_PAD_F;
-  public static final String F_PAD_E = L_FOO_PAD_E + L_BAR_PAD_E;
-
-  @Test
-  public void testParseSimple() throws Exception {
-    QueryList ql = QueryList.parse(F_SIMPLE, null);
-    assertThat(ql.getQuery(N_FOO)).isEqualTo(Q_P);
-    assertThat(ql.getQuery(N_BAR)).isEqualTo(Q_B);
-  }
-
-  @Test
-  public void testParseWHeader() throws Exception {
-    QueryList ql = QueryList.parse(HEADER + F_SIMPLE, null);
-    assertThat(ql.getQuery(N_FOO)).isEqualTo(Q_P);
-    assertThat(ql.getQuery(N_BAR)).isEqualTo(Q_B);
-  }
-
-  @Test
-  public void testParseWComments() throws Exception {
-    QueryList ql = QueryList.parse(C1 + F_SIMPLE + C2, null);
-    assertThat(ql.getQuery(N_FOO)).isEqualTo(Q_P);
-    assertThat(ql.getQuery(N_BAR)).isEqualTo(Q_B);
-  }
-
-  @Test
-  public void testParseFooComment() throws Exception {
-    QueryList ql = QueryList.parse("#" + L_FOO + L_BAR, null);
-    assertThat(ql.getQuery(N_FOO)).isNull();
-    assertThat(ql.getQuery(N_BAR)).isEqualTo(Q_B);
-  }
-
-  @Test
-  public void testParsePaddedFronts() throws Exception {
-    QueryList ql = QueryList.parse(F_PAD_F, null);
-    assertThat(ql.getQuery(N_FOO)).isEqualTo(Q_P);
-    assertThat(ql.getQuery(N_BAR)).isEqualTo(Q_B);
-  }
-
-  @Test
-  public void testParsePaddedEnds() throws Exception {
-    QueryList ql = QueryList.parse(F_PAD_E, null);
-    assertThat(ql.getQuery(N_FOO)).isEqualTo(Q_P);
-    assertThat(ql.getQuery(N_BAR)).isEqualTo(Q_B);
-  }
-
-  @Test
-  public void testParseComplex() throws Exception {
-    QueryList ql = QueryList.parse(L_COMPLEX, null);
-    assertThat(ql.getQuery(N_FOO)).isEqualTo(Q_COMPLEX);
-  }
-
-  @Test(expected = IOException.class)
-  public void testParseBad() throws Exception {
-    ValidationError.Sink sink = createNiceMock(ValidationError.Sink.class);
-    replay(sink);
-    QueryList.parse(L_BAD, sink);
-  }
-
-  @Test
-  public void testAsText() throws Exception {
-    String expectedText = HEADER + "#\n" + F_PROPER;
-    QueryList ql = QueryList.parse(F_SIMPLE, null);
-    String asText = ql.asText();
-    assertThat(asText).isEqualTo(expectedText);
-
-    ql = QueryList.parse(asText, null);
-    asText = ql.asText();
-    assertThat(asText).isEqualTo(expectedText);
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/index/account/AccountFieldTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/index/account/AccountFieldTest.java
deleted file mode 100644
index 6d4f122..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/index/account/AccountFieldTest.java
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.index.account;
-
-import static com.google.common.truth.Truth.assertThat;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Streams;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.config.AllUsersNameProvider;
-import com.google.gerrit.testutil.GerritBaseTests;
-import java.util.List;
-import org.eclipse.jgit.lib.ObjectId;
-import org.junit.Test;
-
-public class AccountFieldTest extends GerritBaseTests {
-  @Test
-  public void refStateFieldValues() throws Exception {
-    AllUsersName allUsersName = new AllUsersName(AllUsersNameProvider.DEFAULT);
-    Account account = new Account(new Account.Id(1), TimeUtil.nowTs());
-    String metaId = "0e39795bb25dc914118224995c53c5c36923a461";
-    account.setMetaId(metaId);
-    List<String> values =
-        toStrings(
-            AccountField.REF_STATE.get(
-                new AccountState(allUsersName, account, ImmutableSet.of(), ImmutableMap.of())));
-    assertThat(values).hasSize(1);
-    String expectedValue =
-        allUsersName.get() + ":" + RefNames.refsUsers(account.getId()) + ":" + metaId;
-    assertThat(Iterables.getOnlyElement(values)).isEqualTo(expectedValue);
-  }
-
-  @Test
-  public void externalIdStateFieldValues() throws Exception {
-    Account.Id id = new Account.Id(1);
-    Account account = new Account(id, TimeUtil.nowTs());
-    ExternalId extId1 =
-        ExternalId.create(
-            ExternalId.Key.create(ExternalId.SCHEME_MAILTO, "foo.bar@example.com"),
-            id,
-            "foo.bar@example.com",
-            null,
-            ObjectId.fromString("1b9a0cf038ea38a0ab08617c39aa8e28413a27ca"));
-    ExternalId extId2 =
-        ExternalId.create(
-            ExternalId.Key.create(ExternalId.SCHEME_USERNAME, "foo"),
-            id,
-            null,
-            "secret",
-            ObjectId.fromString("5b3a73dc9a668a5b89b5f049225261e3e3291d1a"));
-    List<String> values =
-        toStrings(
-            AccountField.EXTERNAL_ID_STATE.get(
-                new AccountState(
-                    null, account, ImmutableSet.of(extId1, extId2), ImmutableMap.of())));
-    String expectedValue1 = extId1.key().sha1().name() + ":" + extId1.blobId().name();
-    String expectedValue2 = extId2.key().sha1().name() + ":" + extId2.blobId().name();
-    assertThat(values).containsExactly(expectedValue1, expectedValue2);
-  }
-
-  private List<String> toStrings(Iterable<byte[]> values) {
-    return Streams.stream(values).map(v -> new String(v, UTF_8)).collect(toList());
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/index/change/ChangeFieldTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/index/change/ChangeFieldTest.java
deleted file mode 100644
index 7ae3944..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/index/change/ChangeFieldTest.java
+++ /dev/null
@@ -1,119 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.index.change;
-
-import static com.google.common.truth.Truth.assertThat;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.collect.HashBasedTable;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Table;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.common.data.SubmitRecord;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.ReviewerSet;
-import com.google.gerrit.server.notedb.ReviewerStateInternal;
-import com.google.gerrit.testutil.GerritBaseTests;
-import com.google.gerrit.testutil.TestTimeUtil;
-import java.sql.Timestamp;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-public class ChangeFieldTest extends GerritBaseTests {
-  @Before
-  public void setUp() {
-    TestTimeUtil.resetWithClockStep(1, TimeUnit.SECONDS);
-  }
-
-  @After
-  public void tearDown() {
-    TestTimeUtil.useSystemTime();
-  }
-
-  @Test
-  public void reviewerFieldValues() {
-    Table<ReviewerStateInternal, Account.Id, Timestamp> t = HashBasedTable.create();
-    Timestamp t1 = TimeUtil.nowTs();
-    t.put(ReviewerStateInternal.REVIEWER, new Account.Id(1), t1);
-    Timestamp t2 = TimeUtil.nowTs();
-    t.put(ReviewerStateInternal.CC, new Account.Id(2), t2);
-    ReviewerSet reviewers = ReviewerSet.fromTable(t);
-
-    List<String> values = ChangeField.getReviewerFieldValues(reviewers);
-    assertThat(values)
-        .containsExactly(
-            "REVIEWER,1", "REVIEWER,1," + t1.getTime(), "CC,2", "CC,2," + t2.getTime());
-
-    assertThat(ChangeField.parseReviewerFieldValues(values)).isEqualTo(reviewers);
-  }
-
-  @Test
-  public void formatSubmitRecordValues() {
-    assertThat(
-            ChangeField.formatSubmitRecordValues(
-                ImmutableList.of(
-                    record(
-                        SubmitRecord.Status.OK,
-                        label(SubmitRecord.Label.Status.MAY, "Label-1", null),
-                        label(SubmitRecord.Label.Status.OK, "Label-2", 1))),
-                new Account.Id(1)))
-        .containsExactly("OK", "MAY,label-1", "OK,label-2", "OK,label-2,0", "OK,label-2,1");
-  }
-
-  @Test
-  public void storedSubmitRecords() {
-    assertStoredRecordRoundTrip(record(SubmitRecord.Status.CLOSED));
-    assertStoredRecordRoundTrip(
-        record(
-            SubmitRecord.Status.OK,
-            label(SubmitRecord.Label.Status.MAY, "Label-1", null),
-            label(SubmitRecord.Label.Status.OK, "Label-2", 1)));
-  }
-
-  private static SubmitRecord record(SubmitRecord.Status status, SubmitRecord.Label... labels) {
-    SubmitRecord r = new SubmitRecord();
-    r.status = status;
-    if (labels.length > 0) {
-      r.labels = ImmutableList.copyOf(labels);
-    }
-    return r;
-  }
-
-  private static SubmitRecord.Label label(
-      SubmitRecord.Label.Status status, String label, Integer appliedBy) {
-    SubmitRecord.Label l = new SubmitRecord.Label();
-    l.status = status;
-    l.label = label;
-    if (appliedBy != null) {
-      l.appliedBy = new Account.Id(appliedBy);
-    }
-    return l;
-  }
-
-  private static void assertStoredRecordRoundTrip(SubmitRecord... records) {
-    List<SubmitRecord> recordList = ImmutableList.copyOf(records);
-    List<String> stored =
-        ChangeField.storedSubmitRecords(recordList).stream()
-            .map(s -> new String(s, UTF_8))
-            .collect(toList());
-    assertThat(ChangeField.parseSubmitRecords(stored))
-        .named("JSON %s" + stored)
-        .isEqualTo(recordList);
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/index/change/ChangeIndexRewriterTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/index/change/ChangeIndexRewriterTest.java
deleted file mode 100644
index 4a6663a..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/index/change/ChangeIndexRewriterTest.java
+++ /dev/null
@@ -1,262 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.index.change;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.common.data.GlobalCapability.DEFAULT_MAX_QUERY_LIMIT;
-import static com.google.gerrit.index.query.Predicate.and;
-import static com.google.gerrit.index.query.Predicate.or;
-import static com.google.gerrit.reviewdb.client.Change.Status.MERGED;
-import static com.google.gerrit.reviewdb.client.Change.Status.NEW;
-import static com.google.gerrit.server.index.change.IndexedChangeQuery.convertOptions;
-import static org.junit.Assert.assertEquals;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.index.IndexConfig;
-import com.google.gerrit.index.QueryOptions;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.index.query.QueryParseException;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.server.query.change.AndChangeSource;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.ChangeQueryBuilder;
-import com.google.gerrit.server.query.change.ChangeStatusPredicate;
-import com.google.gerrit.server.query.change.OrSource;
-import com.google.gerrit.testutil.GerritBaseTests;
-import java.util.Arrays;
-import java.util.EnumSet;
-import java.util.Set;
-import org.junit.Before;
-import org.junit.Test;
-
-public class ChangeIndexRewriterTest extends GerritBaseTests {
-  private static final IndexConfig CONFIG = IndexConfig.createDefault();
-
-  private FakeChangeIndex index;
-  private ChangeIndexCollection indexes;
-  private ChangeQueryBuilder queryBuilder;
-  private ChangeIndexRewriter rewrite;
-
-  @Before
-  public void setUp() throws Exception {
-    index = new FakeChangeIndex(FakeChangeIndex.V2);
-    indexes = new ChangeIndexCollection();
-    indexes.setSearchIndex(index);
-    queryBuilder = new FakeQueryBuilder(indexes);
-    rewrite = new ChangeIndexRewriter(indexes, IndexConfig.builder().maxTerms(3).build());
-  }
-
-  @Test
-  public void indexPredicate() throws Exception {
-    Predicate<ChangeData> in = parse("file:a");
-    assertThat(rewrite(in)).isEqualTo(query(in));
-  }
-
-  @Test
-  public void nonIndexPredicate() throws Exception {
-    Predicate<ChangeData> in = parse("foo:a");
-    Predicate<ChangeData> out = rewrite(in);
-    assertThat(AndChangeSource.class).isSameAs(out.getClass());
-    assertThat(out.getChildren())
-        .containsExactly(query(ChangeStatusPredicate.open()), in)
-        .inOrder();
-  }
-
-  @Test
-  public void indexPredicates() throws Exception {
-    Predicate<ChangeData> in = parse("file:a file:b");
-    assertThat(rewrite(in)).isEqualTo(query(in));
-  }
-
-  @Test
-  public void nonIndexPredicates() throws Exception {
-    Predicate<ChangeData> in = parse("foo:a OR foo:b");
-    Predicate<ChangeData> out = rewrite(in);
-    assertThat(AndChangeSource.class).isSameAs(out.getClass());
-    assertThat(out.getChildren())
-        .containsExactly(query(ChangeStatusPredicate.open()), in)
-        .inOrder();
-  }
-
-  @Test
-  public void oneIndexPredicate() throws Exception {
-    Predicate<ChangeData> in = parse("foo:a file:b");
-    Predicate<ChangeData> out = rewrite(in);
-    assertThat(AndChangeSource.class).isSameAs(out.getClass());
-    assertThat(out.getChildren()).containsExactly(query(in.getChild(1)), in.getChild(0)).inOrder();
-  }
-
-  @Test
-  public void threeLevelTreeWithAllIndexPredicates() throws Exception {
-    Predicate<ChangeData> in = parse("-status:abandoned (file:a OR file:b)");
-    assertThat(rewrite.rewrite(in, options(0, DEFAULT_MAX_QUERY_LIMIT))).isEqualTo(query(in));
-  }
-
-  @Test
-  public void threeLevelTreeWithSomeIndexPredicates() throws Exception {
-    Predicate<ChangeData> in = parse("-foo:a (file:b OR file:c)");
-    Predicate<ChangeData> out = rewrite(in);
-    assertThat(out.getClass()).isSameAs(AndChangeSource.class);
-    assertThat(out.getChildren()).containsExactly(query(in.getChild(1)), in.getChild(0)).inOrder();
-  }
-
-  @Test
-  public void multipleIndexPredicates() throws Exception {
-    Predicate<ChangeData> in = parse("file:a OR foo:b OR file:c OR foo:d");
-    Predicate<ChangeData> out = rewrite(in);
-    assertThat(out.getClass()).isSameAs(OrSource.class);
-    assertThat(out.getChildren())
-        .containsExactly(query(or(in.getChild(0), in.getChild(2))), in.getChild(1), in.getChild(3))
-        .inOrder();
-  }
-
-  @Test
-  public void indexAndNonIndexPredicates() throws Exception {
-    Predicate<ChangeData> in = parse("status:new bar:p file:a");
-    Predicate<ChangeData> out = rewrite(in);
-    assertThat(AndChangeSource.class).isSameAs(out.getClass());
-    assertThat(out.getChildren())
-        .containsExactly(query(and(in.getChild(0), in.getChild(2))), in.getChild(1))
-        .inOrder();
-  }
-
-  @Test
-  public void duplicateCompoundNonIndexOnlyPredicates() throws Exception {
-    Predicate<ChangeData> in = parse("status:new bar:p file:a");
-    Predicate<ChangeData> out = rewrite(in);
-    assertThat(out.getClass()).isEqualTo(AndChangeSource.class);
-    assertThat(out.getChildren())
-        .containsExactly(query(and(in.getChild(0), in.getChild(2))), in.getChild(1))
-        .inOrder();
-  }
-
-  @Test
-  public void duplicateCompoundIndexOnlyPredicates() throws Exception {
-    Predicate<ChangeData> in = parse("(status:new OR file:a) bar:p file:b");
-    Predicate<ChangeData> out = rewrite(in);
-    assertThat(out.getClass()).isEqualTo(AndChangeSource.class);
-    assertThat(out.getChildren())
-        .containsExactly(query(and(in.getChild(0), in.getChild(2))), in.getChild(1))
-        .inOrder();
-  }
-
-  @Test
-  public void optionsArgumentOverridesAllLimitPredicates() throws Exception {
-    Predicate<ChangeData> in = parse("limit:1 file:a limit:3");
-    Predicate<ChangeData> out = rewrite(in, options(0, 5));
-    assertThat(out.getClass()).isEqualTo(AndChangeSource.class);
-    assertThat(out.getChildren())
-        .containsExactly(query(in.getChild(1), 5), parse("limit:5"), parse("limit:5"))
-        .inOrder();
-  }
-
-  @Test
-  public void startIncreasesLimitInQueryButNotPredicate() throws Exception {
-    int n = 3;
-    Predicate<ChangeData> f = parse("file:a");
-    Predicate<ChangeData> l = parse("limit:" + n);
-    Predicate<ChangeData> in = andSource(f, l);
-    assertThat(rewrite.rewrite(in, options(0, n))).isEqualTo(andSource(query(f, 3), l));
-    assertThat(rewrite.rewrite(in, options(1, n))).isEqualTo(andSource(query(f, 4), l));
-    assertThat(rewrite.rewrite(in, options(2, n))).isEqualTo(andSource(query(f, 5), l));
-  }
-
-  @Test
-  public void getPossibleStatus() throws Exception {
-    Set<Change.Status> all = EnumSet.allOf(Change.Status.class);
-    assertThat(status("file:a")).isEqualTo(all);
-    assertThat(status("is:new")).containsExactly(NEW);
-    assertThat(status("is:new OR is:merged")).containsExactly(NEW, MERGED);
-    assertThat(status("is:new OR is:x")).isEqualTo(all);
-
-    assertThat(status("is:new is:merged")).isEmpty();
-    assertThat(status("(is:new) (is:merged)")).isEmpty();
-    assertThat(status("(is:new) (is:merged)")).isEmpty();
-    assertThat(status("is:new is:x")).containsExactly(NEW);
-  }
-
-  @Test
-  public void unsupportedIndexOperator() throws Exception {
-    Predicate<ChangeData> in = parse("status:merged file:a");
-    assertThat(rewrite(in)).isEqualTo(query(in));
-
-    indexes.setSearchIndex(new FakeChangeIndex(FakeChangeIndex.V1));
-
-    exception.expect(QueryParseException.class);
-    exception.expectMessage("Unsupported index predicate: file:a");
-    rewrite(in);
-  }
-
-  @Test
-  public void tooManyTerms() throws Exception {
-    String q = "file:a OR file:b OR file:c";
-    Predicate<ChangeData> in = parse(q);
-    assertEquals(query(in), rewrite(in));
-
-    exception.expect(QueryParseException.class);
-    exception.expectMessage("too many terms in query");
-    rewrite(parse(q + " OR file:d"));
-  }
-
-  @Test
-  public void testConvertOptions() throws Exception {
-    assertEquals(options(0, 3), convertOptions(options(0, 3)));
-    assertEquals(options(0, 4), convertOptions(options(1, 3)));
-    assertEquals(options(0, 5), convertOptions(options(2, 3)));
-  }
-
-  @Test
-  public void addingStartToLimitDoesNotExceedBackendLimit() throws Exception {
-    int max = CONFIG.maxLimit();
-    assertEquals(options(0, max), convertOptions(options(0, max)));
-    assertEquals(options(0, max), convertOptions(options(1, max)));
-    assertEquals(options(0, max), convertOptions(options(1, max - 1)));
-    assertEquals(options(0, max), convertOptions(options(2, max - 1)));
-  }
-
-  private Predicate<ChangeData> parse(String query) throws QueryParseException {
-    return queryBuilder.parse(query);
-  }
-
-  @SafeVarargs
-  private static AndChangeSource andSource(Predicate<ChangeData>... preds) {
-    return new AndChangeSource(Arrays.asList(preds));
-  }
-
-  private Predicate<ChangeData> rewrite(Predicate<ChangeData> in) throws QueryParseException {
-    return rewrite.rewrite(in, options(0, DEFAULT_MAX_QUERY_LIMIT));
-  }
-
-  private Predicate<ChangeData> rewrite(Predicate<ChangeData> in, QueryOptions opts)
-      throws QueryParseException {
-    return rewrite.rewrite(in, opts);
-  }
-
-  private IndexedChangeQuery query(Predicate<ChangeData> p) throws QueryParseException {
-    return query(p, DEFAULT_MAX_QUERY_LIMIT);
-  }
-
-  private IndexedChangeQuery query(Predicate<ChangeData> p, int limit) throws QueryParseException {
-    return new IndexedChangeQuery(index, p, options(0, limit));
-  }
-
-  private static QueryOptions options(int start, int limit) {
-    return IndexedChangeQuery.createOptions(CONFIG, start, limit, ImmutableSet.<String>of());
-  }
-
-  private Set<Change.Status> status(String query) throws QueryParseException {
-    return ChangeIndexRewriter.getPossibleStatus(parse(query));
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/index/change/FakeChangeIndex.java b/gerrit-server/src/test/java/com/google/gerrit/server/index/change/FakeChangeIndex.java
deleted file mode 100644
index 74e1c09..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/index/change/FakeChangeIndex.java
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.index.change;
-
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.index.FieldDef;
-import com.google.gerrit.index.QueryOptions;
-import com.google.gerrit.index.Schema;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.index.query.QueryParseException;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.ChangeDataSource;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.ResultSet;
-import org.junit.Ignore;
-
-@Ignore
-public class FakeChangeIndex implements ChangeIndex {
-  static Schema<ChangeData> V1 =
-      new Schema<>(1, ImmutableList.<FieldDef<ChangeData, ?>>of(ChangeField.STATUS));
-
-  static Schema<ChangeData> V2 =
-      new Schema<>(2, ImmutableList.of(ChangeField.STATUS, ChangeField.PATH, ChangeField.UPDATED));
-
-  private static class Source implements ChangeDataSource {
-    private final Predicate<ChangeData> p;
-
-    Source(Predicate<ChangeData> p) {
-      this.p = p;
-    }
-
-    @Override
-    public int getCardinality() {
-      return 1;
-    }
-
-    @Override
-    public boolean hasChange() {
-      throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public ResultSet<ChangeData> read() throws OrmException {
-      throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public String toString() {
-      return p.toString();
-    }
-  }
-
-  private final Schema<ChangeData> schema;
-
-  FakeChangeIndex(Schema<ChangeData> schema) {
-    this.schema = schema;
-  }
-
-  @Override
-  public void replace(ChangeData cd) {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public void delete(Change.Id id) {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public void deleteAll() {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public ChangeDataSource getSource(Predicate<ChangeData> p, QueryOptions opts)
-      throws QueryParseException {
-    return new FakeChangeIndex.Source(p);
-  }
-
-  @Override
-  public Schema<ChangeData> getSchema() {
-    return schema;
-  }
-
-  @Override
-  public void close() {}
-
-  @Override
-  public void markReady(boolean ready) {
-    throw new UnsupportedOperationException();
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/index/change/FakeQueryBuilder.java b/gerrit-server/src/test/java/com/google/gerrit/server/index/change/FakeQueryBuilder.java
deleted file mode 100644
index edd4abf..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/index/change/FakeQueryBuilder.java
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.index.change;
-
-import com.google.gerrit.index.query.OperatorPredicate;
-import com.google.gerrit.index.query.Predicate;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.ChangeQueryBuilder;
-import org.junit.Ignore;
-
-@Ignore
-public class FakeQueryBuilder extends ChangeQueryBuilder {
-  FakeQueryBuilder(ChangeIndexCollection indexes) {
-    super(
-        new FakeQueryBuilder.Definition<>(FakeQueryBuilder.class),
-        new ChangeQueryBuilder.Arguments(
-            null, null, null, null, null, null, null, null, null, null, null, null, null, null,
-            null, null, null, null, null, indexes, null, null, null, null, null, null, null));
-  }
-
-  @Operator
-  public Predicate<ChangeData> foo(String value) {
-    return predicate("foo", value);
-  }
-
-  @Operator
-  public Predicate<ChangeData> bar(String value) {
-    return predicate("bar", value);
-  }
-
-  private Predicate<ChangeData> predicate(String name, String value) {
-    return new OperatorPredicate<ChangeData>(name, value) {};
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/index/change/StalenessCheckerTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/index/change/StalenessCheckerTest.java
deleted file mode 100644
index b25ed2b..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/index/change/StalenessCheckerTest.java
+++ /dev/null
@@ -1,344 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.index.change;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth.assert_;
-import static com.google.gerrit.server.index.change.StalenessChecker.refsAreStale;
-import static com.google.gerrit.testutil.TestChanges.newChange;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.collect.ImmutableListMultimap;
-import com.google.common.collect.ImmutableSetMultimap;
-import com.google.common.collect.ListMultimap;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.index.RefState;
-import com.google.gerrit.server.index.change.StalenessChecker.RefStatePattern;
-import com.google.gerrit.server.notedb.NoteDbChangeState;
-import com.google.gerrit.testutil.GerritBaseTests;
-import com.google.gerrit.testutil.InMemoryRepositoryManager;
-import com.google.gwtorm.protobuf.CodecFactory;
-import com.google.gwtorm.protobuf.ProtobufCodec;
-import java.util.stream.Stream;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.junit.Before;
-import org.junit.Test;
-
-public class StalenessCheckerTest extends GerritBaseTests {
-  private static final String SHA1 = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef";
-  private static final String SHA2 = "badc0feebadc0feebadc0feebadc0feebadc0fee";
-
-  private static final Project.NameKey P1 = new Project.NameKey("project1");
-  private static final Project.NameKey P2 = new Project.NameKey("project2");
-
-  private static final Change.Id C = new Change.Id(1234);
-
-  private static final ProtobufCodec<Change> CHANGE_CODEC = CodecFactory.encoder(Change.class);
-
-  private GitRepositoryManager repoManager;
-  private Repository r1;
-  private Repository r2;
-  private TestRepository<Repository> tr1;
-  private TestRepository<Repository> tr2;
-
-  @Before
-  public void setUp() throws Exception {
-    repoManager = new InMemoryRepositoryManager();
-    r1 = repoManager.createRepository(P1);
-    tr1 = new TestRepository<>(r1);
-    r2 = repoManager.createRepository(P2);
-    tr2 = new TestRepository<>(r2);
-  }
-
-  @Test
-  public void parseStates() {
-    assertInvalidState(null);
-    assertInvalidState("");
-    assertInvalidState("project1:refs/heads/foo");
-    assertInvalidState("project1:refs/heads/foo:notasha");
-    assertInvalidState("project1:refs/heads/foo:");
-
-    assertThat(
-            StalenessChecker.parseStates(
-                byteArrays(
-                    P1 + ":refs/heads/foo:" + SHA1,
-                    P1 + ":refs/heads/bar:" + SHA2,
-                    P2 + ":refs/heads/baz:" + SHA1)))
-        .isEqualTo(
-            ImmutableSetMultimap.of(
-                P1, RefState.create("refs/heads/foo", SHA1),
-                P1, RefState.create("refs/heads/bar", SHA2),
-                P2, RefState.create("refs/heads/baz", SHA1)));
-  }
-
-  private static void assertInvalidState(String state) {
-    try {
-      StalenessChecker.parseStates(byteArrays(state));
-      assert_().fail("expected IllegalArgumentException");
-    } catch (IllegalArgumentException e) {
-      // Expected.
-    }
-  }
-
-  @Test
-  public void refStateToByteArray() {
-    assertThat(
-            new String(
-                RefState.create("refs/heads/foo", ObjectId.fromString(SHA1)).toByteArray(P1),
-                UTF_8))
-        .isEqualTo(P1 + ":refs/heads/foo:" + SHA1);
-    assertThat(
-            new String(RefState.create("refs/heads/foo", (ObjectId) null).toByteArray(P1), UTF_8))
-        .isEqualTo(P1 + ":refs/heads/foo:" + ObjectId.zeroId().name());
-  }
-
-  @Test
-  public void parsePatterns() {
-    assertInvalidPattern(null);
-    assertInvalidPattern("");
-    assertInvalidPattern("project:");
-    assertInvalidPattern("project:refs/heads/foo");
-    assertInvalidPattern("project:refs/he*ds/bar");
-    assertInvalidPattern("project:refs/(he)*ds/bar");
-    assertInvalidPattern("project:invalidrefname");
-
-    ListMultimap<Project.NameKey, RefStatePattern> r =
-        StalenessChecker.parsePatterns(
-            byteArrays(
-                P1 + ":refs/heads/*",
-                P2 + ":refs/heads/foo/*/bar",
-                P2 + ":refs/heads/foo/*-baz/*/quux"));
-
-    assertThat(r.keySet()).containsExactly(P1, P2);
-    RefStatePattern p = r.get(P1).get(0);
-    assertThat(p.pattern()).isEqualTo("refs/heads/*");
-    assertThat(p.prefix()).isEqualTo("refs/heads/");
-    assertThat(p.regex().pattern()).isEqualTo("^\\Qrefs/heads/\\E.*\\Q\\E$");
-    assertThat(p.match("refs/heads/foo")).isTrue();
-    assertThat(p.match("xrefs/heads/foo")).isFalse();
-    assertThat(p.match("refs/tags/foo")).isFalse();
-
-    p = r.get(P2).get(0);
-    assertThat(p.pattern()).isEqualTo("refs/heads/foo/*/bar");
-    assertThat(p.prefix()).isEqualTo("refs/heads/foo/");
-    assertThat(p.regex().pattern()).isEqualTo("^\\Qrefs/heads/foo/\\E.*\\Q/bar\\E$");
-    assertThat(p.match("refs/heads/foo//bar")).isTrue();
-    assertThat(p.match("refs/heads/foo/x/bar")).isTrue();
-    assertThat(p.match("refs/heads/foo/x/y/bar")).isTrue();
-    assertThat(p.match("refs/heads/foo/x/baz")).isFalse();
-
-    p = r.get(P2).get(1);
-    assertThat(p.pattern()).isEqualTo("refs/heads/foo/*-baz/*/quux");
-    assertThat(p.prefix()).isEqualTo("refs/heads/foo/");
-    assertThat(p.regex().pattern()).isEqualTo("^\\Qrefs/heads/foo/\\E.*\\Q-baz/\\E.*\\Q/quux\\E$");
-    assertThat(p.match("refs/heads/foo/-baz//quux")).isTrue();
-    assertThat(p.match("refs/heads/foo/x-baz/x/quux")).isTrue();
-    assertThat(p.match("refs/heads/foo/x/y-baz/x/y/quux")).isTrue();
-    assertThat(p.match("refs/heads/foo/x-baz/x/y")).isFalse();
-  }
-
-  @Test
-  public void refStatePatternToByteArray() {
-    assertThat(new String(RefStatePattern.create("refs/*").toByteArray(P1), UTF_8))
-        .isEqualTo(P1 + ":refs/*");
-  }
-
-  private static void assertInvalidPattern(String state) {
-    try {
-      StalenessChecker.parsePatterns(byteArrays(state));
-      assert_().fail("expected IllegalArgumentException");
-    } catch (IllegalArgumentException e) {
-      // Expected.
-    }
-  }
-
-  @Test
-  public void isStaleRefStatesOnly() throws Exception {
-    String ref1 = "refs/heads/foo";
-    ObjectId id1 = tr1.update(ref1, tr1.commit().message("commit 1"));
-    String ref2 = "refs/heads/bar";
-    ObjectId id2 = tr2.update(ref2, tr2.commit().message("commit 2"));
-
-    // Not stale.
-    assertThat(
-            refsAreStale(
-                repoManager,
-                C,
-                ImmutableSetMultimap.of(
-                    P1, RefState.create(ref1, id1.name()),
-                    P2, RefState.create(ref2, id2.name())),
-                ImmutableListMultimap.of()))
-        .isFalse();
-
-    // Wrong ref value.
-    assertThat(
-            refsAreStale(
-                repoManager,
-                C,
-                ImmutableSetMultimap.of(
-                    P1, RefState.create(ref1, SHA1),
-                    P2, RefState.create(ref2, id2.name())),
-                ImmutableListMultimap.of()))
-        .isTrue();
-
-    // Swapped repos.
-    assertThat(
-            refsAreStale(
-                repoManager,
-                C,
-                ImmutableSetMultimap.of(
-                    P1, RefState.create(ref1, id2.name()),
-                    P2, RefState.create(ref2, id1.name())),
-                ImmutableListMultimap.of()))
-        .isTrue();
-
-    // Two refs in same repo, not stale.
-    String ref3 = "refs/heads/baz";
-    ObjectId id3 = tr1.update(ref3, tr1.commit().message("commit 3"));
-    tr1.update(ref3, id3);
-    assertThat(
-            refsAreStale(
-                repoManager,
-                C,
-                ImmutableSetMultimap.of(
-                    P1, RefState.create(ref1, id1.name()),
-                    P1, RefState.create(ref3, id3.name())),
-                ImmutableListMultimap.of()))
-        .isFalse();
-
-    // Ignore ref not mentioned.
-    assertThat(
-            refsAreStale(
-                repoManager,
-                C,
-                ImmutableSetMultimap.of(P1, RefState.create(ref1, id1.name())),
-                ImmutableListMultimap.of()))
-        .isFalse();
-
-    // One ref wrong.
-    assertThat(
-            refsAreStale(
-                repoManager,
-                C,
-                ImmutableSetMultimap.of(
-                    P1, RefState.create(ref1, id1.name()),
-                    P1, RefState.create(ref3, SHA1)),
-                ImmutableListMultimap.of()))
-        .isTrue();
-  }
-
-  @Test
-  public void isStaleWithRefStatePatterns() throws Exception {
-    String ref1 = "refs/heads/foo";
-    ObjectId id1 = tr1.update(ref1, tr1.commit().message("commit 1"));
-
-    // ref1 is only ref matching pattern.
-    assertThat(
-            refsAreStale(
-                repoManager,
-                C,
-                ImmutableSetMultimap.of(P1, RefState.create(ref1, id1.name())),
-                ImmutableListMultimap.of(P1, RefStatePattern.create("refs/heads/*"))))
-        .isFalse();
-
-    // Now ref2 matches pattern, so stale unless ref2 is present in state map.
-    String ref2 = "refs/heads/bar";
-    ObjectId id2 = tr1.update(ref2, tr1.commit().message("commit 2"));
-    assertThat(
-            refsAreStale(
-                repoManager,
-                C,
-                ImmutableSetMultimap.of(P1, RefState.create(ref1, id1.name())),
-                ImmutableListMultimap.of(P1, RefStatePattern.create("refs/heads/*"))))
-        .isTrue();
-    assertThat(
-            refsAreStale(
-                repoManager,
-                C,
-                ImmutableSetMultimap.of(
-                    P1, RefState.create(ref1, id1.name()),
-                    P1, RefState.create(ref2, id2.name())),
-                ImmutableListMultimap.of(P1, RefStatePattern.create("refs/heads/*"))))
-        .isFalse();
-  }
-
-  @Test
-  public void isStaleWithNonPrefixPattern() throws Exception {
-    String ref1 = "refs/heads/foo";
-    ObjectId id1 = tr1.update(ref1, tr1.commit().message("commit 1"));
-    tr1.update("refs/heads/bar", tr1.commit().message("commit 2"));
-
-    // ref1 is only ref matching pattern.
-    assertThat(
-            refsAreStale(
-                repoManager,
-                C,
-                ImmutableSetMultimap.of(P1, RefState.create(ref1, id1.name())),
-                ImmutableListMultimap.of(P1, RefStatePattern.create("refs/*/foo"))))
-        .isFalse();
-
-    // Now ref2 matches pattern, so stale unless ref2 is present in state map.
-    String ref3 = "refs/other/foo";
-    ObjectId id3 = tr1.update(ref3, tr1.commit().message("commit 3"));
-    assertThat(
-            refsAreStale(
-                repoManager,
-                C,
-                ImmutableSetMultimap.of(P1, RefState.create(ref1, id1.name())),
-                ImmutableListMultimap.of(P1, RefStatePattern.create("refs/*/foo"))))
-        .isTrue();
-    assertThat(
-            refsAreStale(
-                repoManager,
-                C,
-                ImmutableSetMultimap.of(
-                    P1, RefState.create(ref1, id1.name()),
-                    P1, RefState.create(ref3, id3.name())),
-                ImmutableListMultimap.of(P1, RefStatePattern.create("refs/*/foo"))))
-        .isFalse();
-  }
-
-  @Test
-  public void reviewDbChangeIsStale() throws Exception {
-    Change indexChange = newChange(P1, new Account.Id(1));
-    indexChange.setNoteDbState(SHA1);
-
-    // Change is missing from ReviewDb but present in index.
-    assertThat(StalenessChecker.reviewDbChangeIsStale(indexChange, null)).isTrue();
-
-    // Change differs only in primary storage.
-    Change noteDbPrimary = clone(indexChange);
-    noteDbPrimary.setNoteDbState(NoteDbChangeState.NOTE_DB_PRIMARY_STATE);
-    assertThat(StalenessChecker.reviewDbChangeIsStale(indexChange, noteDbPrimary)).isTrue();
-
-    assertThat(StalenessChecker.reviewDbChangeIsStale(indexChange, clone(indexChange))).isFalse();
-
-    // Can't easily change row version to check true case.
-  }
-
-  private static Iterable<byte[]> byteArrays(String... strs) {
-    return Stream.of(strs).map(s -> s != null ? s.getBytes(UTF_8) : null).collect(toList());
-  }
-
-  private static Change clone(Change change) {
-    return CHANGE_CODEC.decode(CHANGE_CODEC.encodeToByteArray(change));
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/AddressTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/AddressTest.java
deleted file mode 100644
index 42e8a8e..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/AddressTest.java
+++ /dev/null
@@ -1,157 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.mail;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.fail;
-
-import com.google.gerrit.testutil.GerritBaseTests;
-import org.junit.Test;
-
-public class AddressTest extends GerritBaseTests {
-  @Test
-  public void parse_NameEmail1() {
-    final Address a = Address.parse("A U Thor <author@example.com>");
-    assertThat(a.name).isEqualTo("A U Thor");
-    assertThat(a.email).isEqualTo("author@example.com");
-  }
-
-  @Test
-  public void parse_NameEmail2() {
-    final Address a = Address.parse("A <a@b>");
-    assertThat(a.name).isEqualTo("A");
-    assertThat(a.email).isEqualTo("a@b");
-  }
-
-  @Test
-  public void parse_NameEmail3() {
-    final Address a = Address.parse("<a@b>");
-    assertThat(a.name).isNull();
-    assertThat(a.email).isEqualTo("a@b");
-  }
-
-  @Test
-  public void parse_NameEmail4() {
-    final Address a = Address.parse("A U Thor<author@example.com>");
-    assertThat(a.name).isEqualTo("A U Thor");
-    assertThat(a.email).isEqualTo("author@example.com");
-  }
-
-  @Test
-  public void parse_NameEmail5() {
-    final Address a = Address.parse("A U Thor  <author@example.com>");
-    assertThat(a.name).isEqualTo("A U Thor");
-    assertThat(a.email).isEqualTo("author@example.com");
-  }
-
-  @Test
-  public void parse_Email1() {
-    final Address a = Address.parse("author@example.com");
-    assertThat(a.name).isNull();
-    assertThat(a.email).isEqualTo("author@example.com");
-  }
-
-  @Test
-  public void parse_Email2() {
-    final Address a = Address.parse("a@b");
-    assertThat(a.name).isNull();
-    assertThat(a.email).isEqualTo("a@b");
-  }
-
-  @Test
-  public void parse_NewTLD() {
-    Address a = Address.parse("A U Thor <author@example.systems>");
-    assertThat(a.name).isEqualTo("A U Thor");
-    assertThat(a.email).isEqualTo("author@example.systems");
-  }
-
-  @Test
-  public void parseInvalid() {
-    assertInvalid("");
-    assertInvalid("a");
-    assertInvalid("a<");
-    assertInvalid("<a");
-    assertInvalid("<a>");
-    assertInvalid("a<a>");
-    assertInvalid("a <a>");
-
-    assertInvalid("a");
-    assertInvalid("a<@");
-    assertInvalid("<a@");
-    assertInvalid("<a@>");
-    assertInvalid("a<a@>");
-    assertInvalid("a <a@>");
-    assertInvalid("a <@a>");
-  }
-
-  private void assertInvalid(String in) {
-    try {
-      Address.parse(in);
-      fail("Expected IllegalArgumentException for " + in);
-    } catch (IllegalArgumentException e) {
-      assertThat(e.getMessage()).isEqualTo("Invalid email address: " + in);
-    }
-  }
-
-  @Test
-  public void toHeaderString_NameEmail1() {
-    assertThat(format("A", "a@a")).isEqualTo("A <a@a>");
-  }
-
-  @Test
-  public void toHeaderString_NameEmail2() {
-    assertThat(format("A B", "a@a")).isEqualTo("A B <a@a>");
-  }
-
-  @Test
-  public void toHeaderString_NameEmail3() {
-    assertThat(format("A B. C", "a@a")).isEqualTo("\"A B. C\" <a@a>");
-  }
-
-  @Test
-  public void toHeaderString_NameEmail4() {
-    assertThat(format("A B, C", "a@a")).isEqualTo("\"A B, C\" <a@a>");
-  }
-
-  @Test
-  public void toHeaderString_NameEmail5() {
-    assertThat(format("A \" C", "a@a")).isEqualTo("\"A \\\" C\" <a@a>");
-  }
-
-  @Test
-  public void toHeaderString_NameEmail6() {
-    assertThat(format("A \u20ac B", "a@a")).isEqualTo("=?UTF-8?Q?A_=E2=82=AC_B?= <a@a>");
-  }
-
-  @Test
-  public void toHeaderString_NameEmail7() {
-    assertThat(format("A \u20ac B (Code Review)", "a@a"))
-        .isEqualTo("=?UTF-8?Q?A_=E2=82=AC_B_=28Code_Review=29?= <a@a>");
-  }
-
-  @Test
-  public void toHeaderString_Email1() {
-    assertThat(format(null, "a@a")).isEqualTo("a@a");
-  }
-
-  @Test
-  public void toHeaderString_Email2() {
-    assertThat(format(null, "a,b@a")).isEqualTo("<a,b@a>");
-  }
-
-  private static String format(String name, String email) {
-    return new Address(name, email).toHeaderString();
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/AbstractParserTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/AbstractParserTest.java
deleted file mode 100644
index 19ad8bb..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/AbstractParserTest.java
+++ /dev/null
@@ -1,102 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.receive;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.server.mail.Address;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.List;
-import org.joda.time.DateTime;
-import org.junit.Ignore;
-
-@Ignore
-public class AbstractParserTest {
-  protected static final String CHANGE_URL = "https://gerrit-review.googlesource.com/#/changes/123";
-
-  protected static void assertChangeMessage(String message, MailComment comment) {
-    assertThat(comment.fileName).isNull();
-    assertThat(comment.message).isEqualTo(message);
-    assertThat(comment.inReplyTo).isNull();
-    assertThat(comment.type).isEqualTo(MailComment.CommentType.CHANGE_MESSAGE);
-  }
-
-  protected static void assertInlineComment(
-      String message, MailComment comment, Comment inReplyTo) {
-    assertThat(comment.fileName).isNull();
-    assertThat(comment.message).isEqualTo(message);
-    assertThat(comment.inReplyTo).isEqualTo(inReplyTo);
-    assertThat(comment.type).isEqualTo(MailComment.CommentType.INLINE_COMMENT);
-  }
-
-  protected static void assertFileComment(String message, MailComment comment, String file) {
-    assertThat(comment.fileName).isEqualTo(file);
-    assertThat(comment.message).isEqualTo(message);
-    assertThat(comment.inReplyTo).isNull();
-    assertThat(comment.type).isEqualTo(MailComment.CommentType.FILE_COMMENT);
-  }
-
-  protected static Comment newComment(String uuid, String file, String message, int line) {
-    Comment c =
-        new Comment(
-            new Comment.Key(uuid, file, 1),
-            new Account.Id(0),
-            new Timestamp(0L),
-            (short) 0,
-            message,
-            "",
-            false);
-    c.lineNbr = line;
-    return c;
-  }
-
-  protected static Comment newRangeComment(String uuid, String file, String message, int line) {
-    Comment c =
-        new Comment(
-            new Comment.Key(uuid, file, 1),
-            new Account.Id(0),
-            new Timestamp(0L),
-            (short) 0,
-            message,
-            "",
-            false);
-    c.range = new Comment.Range(line, 1, line + 1, 1);
-    c.lineNbr = line + 1;
-    return c;
-  }
-
-  /** Returns a MailMessage.Builder with all required fields populated. */
-  protected static MailMessage.Builder newMailMessageBuilder() {
-    MailMessage.Builder b = MailMessage.builder();
-    b.id("id");
-    b.from(new Address("Foo Bar", "foo@bar.com"));
-    b.dateReceived(new DateTime());
-    b.subject("");
-    return b;
-  }
-
-  /** Returns a List of default comments for testing. */
-  protected static List<Comment> defaultComments() {
-    List<Comment> comments = new ArrayList<>();
-    comments.add(newComment("c1", "gerrit-server/test.txt", "comment", 0));
-    comments.add(newComment("c2", "gerrit-server/test.txt", "comment", 2));
-    comments.add(newComment("c3", "gerrit-server/test.txt", "comment", 3));
-    comments.add(newRangeComment("c4", "gerrit-server/readme.txt", "comment", 3));
-    return comments;
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/GenericHtmlParserTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/GenericHtmlParserTest.java
deleted file mode 100644
index f78953d..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/GenericHtmlParserTest.java
+++ /dev/null
@@ -1,121 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.receive;
-
-/** Test parser for a generic Html email client response */
-public class GenericHtmlParserTest extends HtmlParserTest {
-  @Override
-  protected String newHtmlBody(
-      String changeMessage, String c1, String c2, String c3, String f1, String f2, String fc1) {
-    String email =
-        ""
-            + "<div dir=\"ltr\">"
-            + (changeMessage != null ? changeMessage : "")
-            + "<div class=\"extra\"><br><div class=\"quote\">"
-            + "On Fri, Nov 18, 2016 at 11:15 AM, foobar (Gerrit) noreply@gerrit.com"
-            + "<span dir=\"ltr\">&lt;<a href=\"mailto:noreply@gerrit.com\" "
-            + "target=\"_blank\">noreply@gerrit.com</a>&gt;</span> wrote:<br>"
-            + "<blockquote class=\"quote\" "
-            + "<p>foobar <strong>posted comments</strong> on this change.</p>"
-            + "<p><a href=\""
-            + CHANGE_URL
-            + "/1\" "
-            + "target=\"_blank\">View Change</a></p><div>Patch Set 2: CR-1\n"
-            + "\n"
-            + "(3 comments)</div><ul><li>"
-            + "<p>"
-            + // File #1: test.txt
-            "<a href=\""
-            + CHANGE_URL
-            + "/1/gerrit-server/test.txt\">"
-            + "File gerrit-server/<wbr>test.txt:</a></p>"
-            + commentBlock(f1)
-            + "<li><p>"
-            + "<a href=\""
-            + CHANGE_URL
-            + "/1/gerrit-server/test.txt\">"
-            + "Patch Set #2:</a> </p>"
-            + "<blockquote><pre>Some inline comment from Gerrit</pre>"
-            + "</blockquote><p>Some comment on file 1</p>"
-            + "</li>"
-            + commentBlock(fc1)
-            + "<li><p>"
-            + "<a href=\""
-            + CHANGE_URL
-            + "/1/gerrit-server/test.txt@2\">"
-            + "Patch Set #2, Line 31:</a> </p>"
-            + "<blockquote><pre>Some inline comment from Gerrit</pre>"
-            + "</blockquote><p>Some text from original comment</p>"
-            + "</li>"
-            + commentBlock(c1)
-            + ""
-            + // Inline comment #2
-            "<li><p>"
-            + "<a href=\""
-            + CHANGE_URL
-            + "/1/gerrit-server/test.txt@3\">"
-            + "Patch Set #2, Line 47:</a> </p>"
-            + "<blockquote><pre>Some comment posted on Gerrit</pre>"
-            + "</blockquote><p>Some more comments from Gerrit</p>"
-            + "</li>"
-            + commentBlock(c2)
-            + "<li><p>"
-            + "<a href=\""
-            + CHANGE_URL
-            + "/1/gerrit-server/test.txt@115\">"
-            + "Patch Set #2, Line 115:</a> <code>some code</code></p>"
-            + "<p>some comment</p></li></ul></li>"
-            + ""
-            + "<li><p>"
-            + // File #2: test.txt
-            "<a href=\""
-            + CHANGE_URL
-            + "/1/gerrit-server/readme.txt\">"
-            + "File gerrit-server/<wbr>readme.txt:</a></p>"
-            + commentBlock(f2)
-            + "<li><p>"
-            + "<a href=\""
-            + CHANGE_URL
-            + "/1/gerrit-server/readme.txt@3\">"
-            + "Patch Set #2, Line 31:</a> </p>"
-            + "<blockquote><pre>Some inline comment from Gerrit</pre>"
-            + "</blockquote><p>Some text from original comment</p>"
-            + "</li>"
-            + commentBlock(c3)
-            + ""
-            + // Inline comment #2
-            "</ul></li></ul>"
-            + ""
-            + // Footer
-            "<p>To view, visit <a href=\""
-            + CHANGE_URL
-            + "/1\">this change</a>. "
-            + "To unsubscribe, visit <a href=\"https://someurl\">settings</a>."
-            + "</p><p>Gerrit-MessageType: comment<br>"
-            + "Footer omitted</p>"
-            + "<div><div></div></div>"
-            + "<p>Gerrit-HasComments: Yes</p></blockquote></div><br></div></div>";
-    return email;
-  }
-
-  private static String commentBlock(String comment) {
-    if (comment == null) {
-      return "";
-    }
-    return "</ul></li></ul></blockquote><div>"
-        + comment
-        + "</div><blockquote class=\"quote\"><ul><li><ul>";
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/GmailHtmlParserTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/GmailHtmlParserTest.java
deleted file mode 100644
index e210847..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/GmailHtmlParserTest.java
+++ /dev/null
@@ -1,120 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.receive;
-
-public class GmailHtmlParserTest extends HtmlParserTest {
-  @Override
-  protected String newHtmlBody(
-      String changeMessage, String c1, String c2, String c3, String f1, String f2, String fc1) {
-    String email =
-        ""
-            + "<div class=\"gmail_default\" dir=\"ltr\">"
-            + (changeMessage != null ? changeMessage : "")
-            + "<div class=\"gmail_extra\"><br><div class=\"gmail_quote\">"
-            + "On Fri, Nov 18, 2016 at 11:15 AM, foobar (Gerrit) noreply@gerrit.com"
-            + "<span dir=\"ltr\">&lt;<a href=\"mailto:noreply@gerrit.com\" "
-            + "target=\"_blank\">noreply@gerrit.com</a>&gt;</span> wrote:<br>"
-            + "<blockquote class=\"gmail_quote\" "
-            + "<p>foobar <strong>posted comments</strong> on this change.</p>"
-            + "<p><a href=\""
-            + CHANGE_URL
-            + "/1\" "
-            + "target=\"_blank\">View Change</a></p><div>Patch Set 2: CR-1\n"
-            + "\n"
-            + "(3 comments)</div><ul><li>"
-            + "<p>"
-            + // File #1: test.txt
-            "<a href=\""
-            + CHANGE_URL
-            + "/1/gerrit-server/test.txt\">"
-            + "File gerrit-server/<wbr>test.txt:</a></p>"
-            + commentBlock(f1)
-            + "<li><p>"
-            + "<a href=\""
-            + CHANGE_URL
-            + "/1/gerrit-server/test.txt\">"
-            + "Patch Set #2:</a> </p>"
-            + "<blockquote><pre>Some inline comment from Gerrit</pre>"
-            + "</blockquote><p>Some comment on file 1</p>"
-            + "</li>"
-            + commentBlock(fc1)
-            + "<li><p>"
-            + "<a href=\""
-            + CHANGE_URL
-            + "/1/gerrit-server/test.txt@2\">"
-            + "Patch Set #2, Line 31:</a> </p>"
-            + "<blockquote><pre>Some inline comment from Gerrit</pre>"
-            + "</blockquote><p>Some text from original comment</p>"
-            + "</li>"
-            + commentBlock(c1)
-            + ""
-            + // Inline comment #2
-            "<li><p>"
-            + "<a href=\""
-            + CHANGE_URL
-            + "/1/gerrit-server/test.txt@3\">"
-            + "Patch Set #2, Line 47:</a> </p>"
-            + "<blockquote><pre>Some comment posted on Gerrit</pre>"
-            + "</blockquote><p>Some more comments from Gerrit</p>"
-            + "</li>"
-            + commentBlock(c2)
-            + "<li><p>"
-            + "<a href=\""
-            + CHANGE_URL
-            + "/1/gerrit-server/test.txt@115\">"
-            + "Patch Set #2, Line 115:</a> <code>some code</code></p>"
-            + "<p>some comment</p></li></ul></li>"
-            + ""
-            + "<li><p>"
-            + // File #2: test.txt
-            "<a href=\""
-            + CHANGE_URL
-            + "/1/gerrit-server/readme.txt\">"
-            + "File gerrit-server/<wbr>readme.txt:</a></p>"
-            + commentBlock(f2)
-            + "<li><p>"
-            + "<a href=\""
-            + CHANGE_URL
-            + "/1/gerrit-server/readme.txt@3\">"
-            + "Patch Set #2, Line 31:</a> </p>"
-            + "<blockquote><pre>Some inline comment from Gerrit</pre>"
-            + "</blockquote><p>Some text from original comment</p>"
-            + "</li>"
-            + commentBlock(c3)
-            + ""
-            + // Inline comment #2
-            "</ul></li></ul>"
-            + ""
-            + // Footer
-            "<p>To view, visit <a href=\""
-            + CHANGE_URL
-            + "/1\">this change</a>. "
-            + "To unsubscribe, visit <a href=\"https://someurl\">settings</a>."
-            + "</p><p>Gerrit-MessageType: comment<br>"
-            + "Footer omitted</p>"
-            + "<div><div></div></div>"
-            + "<p>Gerrit-HasComments: Yes</p></blockquote></div><br></div></div>";
-    return email;
-  }
-
-  private static String commentBlock(String comment) {
-    if (comment == null) {
-      return "";
-    }
-    return "</ul></li></ul></blockquote><div>"
-        + comment
-        + "</div><blockquote class=\"gmail_quote\"><ul><li><ul>";
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/HtmlParserTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/HtmlParserTest.java
deleted file mode 100644
index 0e0e8b0..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/HtmlParserTest.java
+++ /dev/null
@@ -1,142 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.receive;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.gerrit.reviewdb.client.Comment;
-import java.util.List;
-import org.junit.Ignore;
-import org.junit.Test;
-
-/**
- * Abstract parser test for HTML messages. Payload will be added through concrete implementations.
- */
-@Ignore
-public abstract class HtmlParserTest extends AbstractParserTest {
-  @Test
-  public void simpleChangeMessage() {
-    MailMessage.Builder b = newMailMessageBuilder();
-    b.htmlContent(newHtmlBody("Looks good to me", null, null, null, null, null, null));
-
-    List<Comment> comments = defaultComments();
-    List<MailComment> parsedComments = HtmlParser.parse(b.build(), comments, "");
-
-    assertThat(parsedComments).hasSize(1);
-    assertChangeMessage("Looks good to me", parsedComments.get(0));
-  }
-
-  @Test
-  public void simpleInlineComments() {
-    MailMessage.Builder b = newMailMessageBuilder();
-    b.htmlContent(
-        newHtmlBody(
-            "Looks good to me",
-            "I have a comment on this.&nbsp;",
-            null,
-            "Also have a comment here.",
-            null,
-            null,
-            null));
-
-    List<Comment> comments = defaultComments();
-    List<MailComment> parsedComments = HtmlParser.parse(b.build(), comments, CHANGE_URL);
-
-    assertThat(parsedComments).hasSize(3);
-    assertChangeMessage("Looks good to me", parsedComments.get(0));
-    assertInlineComment("I have a comment on this.", parsedComments.get(1), comments.get(1));
-    assertInlineComment("Also have a comment here.", parsedComments.get(2), comments.get(3));
-  }
-
-  @Test
-  public void simpleFileComment() {
-    MailMessage.Builder b = newMailMessageBuilder();
-    b.htmlContent(
-        newHtmlBody(
-            "Looks good to me",
-            null,
-            null,
-            "Also have a comment here.",
-            "This is a nice file",
-            null,
-            null));
-
-    List<Comment> comments = defaultComments();
-    List<MailComment> parsedComments = HtmlParser.parse(b.build(), comments, CHANGE_URL);
-
-    assertThat(parsedComments).hasSize(3);
-    assertChangeMessage("Looks good to me", parsedComments.get(0));
-    assertFileComment("This is a nice file", parsedComments.get(1), comments.get(1).key.filename);
-    assertInlineComment("Also have a comment here.", parsedComments.get(2), comments.get(3));
-  }
-
-  @Test
-  public void noComments() {
-    MailMessage.Builder b = newMailMessageBuilder();
-    b.htmlContent(newHtmlBody(null, null, null, null, null, null, null));
-
-    List<Comment> comments = defaultComments();
-    List<MailComment> parsedComments = HtmlParser.parse(b.build(), comments, CHANGE_URL);
-
-    assertThat(parsedComments).isEmpty();
-  }
-
-  @Test
-  public void noChangeMessage() {
-    MailMessage.Builder b = newMailMessageBuilder();
-    b.htmlContent(
-        newHtmlBody(
-            null, null, null, "Also have a comment here.", "This is a nice file", null, null));
-
-    List<Comment> comments = defaultComments();
-    List<MailComment> parsedComments = HtmlParser.parse(b.build(), comments, CHANGE_URL);
-
-    assertThat(parsedComments).hasSize(2);
-    assertFileComment("This is a nice file", parsedComments.get(0), comments.get(1).key.filename);
-    assertInlineComment("Also have a comment here.", parsedComments.get(1), comments.get(3));
-  }
-
-  @Test
-  public void commentsSpanningMultipleBlocks() {
-    String htmlMessage =
-        "This is a very long test comment. <div><br></div><div>Now this is a new paragraph yay.</div>";
-    String txtMessage = "This is a very long test comment.\n\nNow this is a new paragraph yay.";
-    MailMessage.Builder b = newMailMessageBuilder();
-    b.htmlContent(newHtmlBody(htmlMessage, null, null, htmlMessage, htmlMessage, null, null));
-
-    List<Comment> comments = defaultComments();
-    List<MailComment> parsedComments = HtmlParser.parse(b.build(), comments, CHANGE_URL);
-
-    assertThat(parsedComments).hasSize(3);
-    assertChangeMessage(txtMessage, parsedComments.get(0));
-    assertFileComment(txtMessage, parsedComments.get(1), comments.get(1).key.filename);
-    assertInlineComment(txtMessage, parsedComments.get(2), comments.get(3));
-  }
-
-  /**
-   * Create an html message body with the specified comments.
-   *
-   * @param changeMessage
-   * @param c1 Comment in reply to first comment.
-   * @param c2 Comment in reply to second comment.
-   * @param c3 Comment in reply to third comment.
-   * @param f1 Comment on file one.
-   * @param f2 Comment on file two.
-   * @param fc1 Comment in reply to a comment on file 1.
-   * @return A string with all inline comments and the original quoted email.
-   */
-  protected abstract String newHtmlBody(
-      String changeMessage, String c1, String c2, String c3, String f1, String f2, String fc1);
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/MetadataParserTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/MetadataParserTest.java
deleted file mode 100644
index 84bae96..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/MetadataParserTest.java
+++ /dev/null
@@ -1,117 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.receive;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.server.mail.MetadataName.toFooterWithDelimiter;
-import static com.google.gerrit.server.mail.MetadataName.toHeaderWithDelimiter;
-
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.mail.MetadataName;
-import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
-import org.junit.Test;
-
-public class MetadataParserTest {
-  @Test
-  public void parseMetadataFromHeader() {
-    // This tests if the metadata parser is able to parse metadata from the
-    // email headers of the message.
-    MailMessage.Builder b = MailMessage.builder();
-    b.id("");
-    b.dateReceived(new DateTime());
-    b.subject("");
-
-    b.addAdditionalHeader(toHeaderWithDelimiter(MetadataName.CHANGE_NUMBER) + "123");
-    b.addAdditionalHeader(toHeaderWithDelimiter(MetadataName.PATCH_SET) + "1");
-    b.addAdditionalHeader(toHeaderWithDelimiter(MetadataName.MESSAGE_TYPE) + "comment");
-    b.addAdditionalHeader(
-        toHeaderWithDelimiter(MetadataName.TIMESTAMP) + "Tue, 25 Oct 2016 02:11:35 -0700");
-
-    Address author = new Address("Diffy", "test@gerritcodereview.com");
-    b.from(author);
-
-    MailMetadata meta = MetadataParser.parse(b.build());
-    assertThat(meta.author).isEqualTo(author.getEmail());
-    assertThat(meta.changeNumber).isEqualTo(123);
-    assertThat(meta.patchSet).isEqualTo(1);
-    assertThat(meta.messageType).isEqualTo("comment");
-    assertThat(meta.timestamp.getTime())
-        .isEqualTo(new DateTime(2016, 10, 25, 9, 11, 35, 0, DateTimeZone.UTC).getMillis());
-  }
-
-  @Test
-  public void parseMetadataFromText() {
-    // This tests if the metadata parser is able to parse metadata from the
-    // the text body of the message.
-    MailMessage.Builder b = MailMessage.builder();
-    b.id("");
-    b.dateReceived(new DateTime());
-    b.subject("");
-
-    StringBuilder stringBuilder = new StringBuilder();
-    stringBuilder.append(toFooterWithDelimiter(MetadataName.CHANGE_NUMBER) + "123\r\n");
-    stringBuilder.append("> " + toFooterWithDelimiter(MetadataName.PATCH_SET) + "1\n");
-    stringBuilder.append(toFooterWithDelimiter(MetadataName.MESSAGE_TYPE) + "comment\n");
-    stringBuilder.append(
-        toFooterWithDelimiter(MetadataName.TIMESTAMP) + "Tue, 25 Oct 2016 02:11:35 -0700\r\n");
-    b.textContent(stringBuilder.toString());
-
-    Address author = new Address("Diffy", "test@gerritcodereview.com");
-    b.from(author);
-
-    MailMetadata meta = MetadataParser.parse(b.build());
-    assertThat(meta.author).isEqualTo(author.getEmail());
-    assertThat(meta.changeNumber).isEqualTo(123);
-    assertThat(meta.patchSet).isEqualTo(1);
-    assertThat(meta.messageType).isEqualTo("comment");
-    assertThat(meta.timestamp.getTime())
-        .isEqualTo(new DateTime(2016, 10, 25, 9, 11, 35, 0, DateTimeZone.UTC).getMillis());
-  }
-
-  @Test
-  public void parseMetadataFromHTML() {
-    // This tests if the metadata parser is able to parse metadata from the
-    // the HTML body of the message.
-    MailMessage.Builder b = MailMessage.builder();
-    b.id("");
-    b.dateReceived(new DateTime());
-    b.subject("");
-
-    StringBuilder stringBuilder = new StringBuilder();
-    stringBuilder.append(
-        "<div id\"someid\">" + toFooterWithDelimiter(MetadataName.CHANGE_NUMBER) + "123</div>");
-    stringBuilder.append("<div>" + toFooterWithDelimiter(MetadataName.PATCH_SET) + "1</div>");
-    stringBuilder.append(
-        "<div>" + toFooterWithDelimiter(MetadataName.MESSAGE_TYPE) + "comment</div>");
-    stringBuilder.append(
-        "<div>"
-            + toFooterWithDelimiter(MetadataName.TIMESTAMP)
-            + "Tue, 25 Oct 2016 02:11:35 -0700"
-            + "</div>");
-    b.htmlContent(stringBuilder.toString());
-
-    Address author = new Address("Diffy", "test@gerritcodereview.com");
-    b.from(author);
-
-    MailMetadata meta = MetadataParser.parse(b.build());
-    assertThat(meta.author).isEqualTo(author.getEmail());
-    assertThat(meta.changeNumber).isEqualTo(123);
-    assertThat(meta.patchSet).isEqualTo(1);
-    assertThat(meta.messageType).isEqualTo("comment");
-    assertThat(meta.timestamp.getTime())
-        .isEqualTo(new DateTime(2016, 10, 25, 9, 11, 35, 0, DateTimeZone.UTC).getMillis());
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/ParserUtilTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/ParserUtilTest.java
deleted file mode 100644
index dfa492c..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/ParserUtilTest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.receive;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import org.junit.Test;
-
-public class ParserUtilTest {
-  @Test
-  public void trimQuotationLineOnMessageWithoutQuoatationLine() throws Exception {
-    assertThat(ParserUtil.trimQuotation("One line")).isEqualTo("One line");
-    assertThat(ParserUtil.trimQuotation("Two\nlines")).isEqualTo("Two\nlines");
-    assertThat(ParserUtil.trimQuotation("Thr\nee\nlines")).isEqualTo("Thr\nee\nlines");
-  }
-
-  @Test
-  public void trimQuotationLineOnMixedMessages() throws Exception {
-    assertThat(
-            ParserUtil.trimQuotation(
-                "One line\n"
-                    + "On Thu, Feb 9, 2017 at 8:21 AM, ekempin (Gerrit)\n"
-                    + "<noreply-gerritcodereview-qUgXfQecoDLHwp0MldAzig@google.com> wrote:"))
-        .isEqualTo("One line");
-    assertThat(
-            ParserUtil.trimQuotation(
-                "One line\n"
-                    + "On Thu, Feb 9, 2017 at 8:21 AM, ekempin (Gerrit) "
-                    + "<noreply-gerritcodereview-qUgXfQecoDLHwp0MldAzig@google.com> wrote:"))
-        .isEqualTo("One line");
-  }
-
-  @Test
-  public void trimQuotationLineOnMessagesContainingQuoationLine() throws Exception {
-    assertThat(
-            ParserUtil.trimQuotation(
-                "On Thu, Feb 9, 2017 at 8:21 AM, ekempin (Gerrit)\n"
-                    + "<noreply-gerritcodereview-qUgXfQecoDLHwp0MldAzig@google.com> wrote:"))
-        .isEqualTo("");
-    assertThat(
-            ParserUtil.trimQuotation(
-                "On Thu, Feb 9, 2017 at 8:21 AM, ekempin (Gerrit) "
-                    + "<noreply-gerritcodereview-qUgXfQecoDLHwp0MldAzig@google.com> wrote:"))
-        .isEqualTo("");
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/RawMailParserTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/RawMailParserTest.java
deleted file mode 100644
index 4efa817..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/RawMailParserTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.receive;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.gerrit.server.mail.receive.data.AttachmentMessage;
-import com.google.gerrit.server.mail.receive.data.Base64HeaderMessage;
-import com.google.gerrit.server.mail.receive.data.HtmlMimeMessage;
-import com.google.gerrit.server.mail.receive.data.NonUTF8Message;
-import com.google.gerrit.server.mail.receive.data.QuotedPrintableHeaderMessage;
-import com.google.gerrit.server.mail.receive.data.RawMailMessage;
-import com.google.gerrit.server.mail.receive.data.SimpleTextMessage;
-import com.google.gerrit.testutil.GerritBaseTests;
-import org.junit.Test;
-
-public class RawMailParserTest extends GerritBaseTests {
-  @Test
-  public void parseEmail() throws Exception {
-    RawMailMessage[] messages =
-        new RawMailMessage[] {
-          new SimpleTextMessage(),
-          new Base64HeaderMessage(),
-          new QuotedPrintableHeaderMessage(),
-          new HtmlMimeMessage(),
-          new AttachmentMessage(),
-          new NonUTF8Message(),
-        };
-    for (RawMailMessage rawMailMessage : messages) {
-      if (rawMailMessage.rawChars() != null) {
-        // Assert Character to Mail Parser
-        MailMessage parsedMailMessage = RawMailParser.parse(rawMailMessage.rawChars());
-        assertMail(parsedMailMessage, rawMailMessage.expectedMailMessage());
-      }
-      if (rawMailMessage.raw() != null) {
-        // Assert String to Mail Parser
-        MailMessage parsedMailMessage = RawMailParser.parse(rawMailMessage.raw());
-        assertMail(parsedMailMessage, rawMailMessage.expectedMailMessage());
-      }
-    }
-  }
-
-  /**
-   * This method makes it easier to debug failing tests by checking each property individual instead
-   * of calling equals as it will immediately reveal the property that diverges between the two
-   * objects.
-   *
-   * @param have MailMessage retrieved from the parser
-   * @param want MailMessage that would be expected
-   */
-  private void assertMail(MailMessage have, MailMessage want) {
-    assertThat(have.id()).isEqualTo(want.id());
-    assertThat(have.to()).isEqualTo(want.to());
-    assertThat(have.from()).isEqualTo(want.from());
-    assertThat(have.cc()).isEqualTo(want.cc());
-    assertThat(have.dateReceived().getMillis()).isEqualTo(want.dateReceived().getMillis());
-    assertThat(have.additionalHeaders()).isEqualTo(want.additionalHeaders());
-    assertThat(have.subject()).isEqualTo(want.subject());
-    assertThat(have.textContent()).isEqualTo(want.textContent());
-    assertThat(have.htmlContent()).isEqualTo(want.htmlContent());
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/TextParserTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/TextParserTest.java
deleted file mode 100644
index 89e1f22..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/TextParserTest.java
+++ /dev/null
@@ -1,261 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.receive;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.gerrit.reviewdb.client.Comment;
-import java.util.List;
-import org.junit.Test;
-
-public class TextParserTest extends AbstractParserTest {
-  private static final String quotedFooter =
-      ""
-          + "> To view, visit https://gerrit-review.googlesource.com/123\n"
-          + "> To unsubscribe, visit https://gerrit-review.googlesource.com\n"
-          + "> \n"
-          + "> Gerrit-MessageType: comment\n"
-          + "> Gerrit-Change-Id: Ie1234021bf1e8d1425641af58fd648fc011db153\n"
-          + "> Gerrit-PatchSet: 1\n"
-          + "> Gerrit-Project: gerrit\n"
-          + "> Gerrit-Branch: master\n"
-          + "> Gerrit-Owner: Foo Bar <foo@bar.com>\n"
-          + "> Gerrit-HasComments: Yes";
-
-  @Test
-  public void simpleChangeMessage() {
-    MailMessage.Builder b = newMailMessageBuilder();
-    b.textContent("Looks good to me\n" + quotedFooter);
-
-    List<Comment> comments = defaultComments();
-    List<MailComment> parsedComments = TextParser.parse(b.build(), comments, CHANGE_URL);
-
-    assertThat(parsedComments).hasSize(1);
-    assertChangeMessage("Looks good to me", parsedComments.get(0));
-  }
-
-  @Test
-  public void simpleInlineComments() {
-    MailMessage.Builder b = newMailMessageBuilder();
-    b.textContent(
-        newPlaintextBody(
-                "Looks good to me",
-                "I have a comment on this.",
-                null,
-                "Also have a comment here.",
-                null,
-                null,
-                null)
-            + quotedFooter);
-
-    List<Comment> comments = defaultComments();
-    List<MailComment> parsedComments = TextParser.parse(b.build(), comments, CHANGE_URL);
-
-    assertThat(parsedComments).hasSize(3);
-    assertChangeMessage("Looks good to me", parsedComments.get(0));
-    assertInlineComment("I have a comment on this.", parsedComments.get(1), comments.get(1));
-    assertInlineComment("Also have a comment here.", parsedComments.get(2), comments.get(3));
-  }
-
-  @Test
-  public void simpleFileComment() {
-    MailMessage.Builder b = newMailMessageBuilder();
-    b.textContent(
-        newPlaintextBody(
-                "Looks good to me",
-                null,
-                null,
-                "Also have a comment here.",
-                "This is a nice file",
-                null,
-                null)
-            + quotedFooter);
-
-    List<Comment> comments = defaultComments();
-    List<MailComment> parsedComments = TextParser.parse(b.build(), comments, CHANGE_URL);
-
-    assertThat(parsedComments).hasSize(3);
-    assertChangeMessage("Looks good to me", parsedComments.get(0));
-    assertFileComment("This is a nice file", parsedComments.get(1), comments.get(1).key.filename);
-    assertInlineComment("Also have a comment here.", parsedComments.get(2), comments.get(3));
-  }
-
-  @Test
-  public void noComments() {
-    MailMessage.Builder b = newMailMessageBuilder();
-    b.textContent(newPlaintextBody(null, null, null, null, null, null, null) + quotedFooter);
-
-    List<Comment> comments = defaultComments();
-    List<MailComment> parsedComments = TextParser.parse(b.build(), comments, CHANGE_URL);
-
-    assertThat(parsedComments).isEmpty();
-  }
-
-  @Test
-  public void noChangeMessage() {
-    MailMessage.Builder b = newMailMessageBuilder();
-    b.textContent(
-        newPlaintextBody(
-                null, null, null, "Also have a comment here.", "This is a nice file", null, null)
-            + quotedFooter);
-
-    List<Comment> comments = defaultComments();
-    List<MailComment> parsedComments = TextParser.parse(b.build(), comments, CHANGE_URL);
-
-    assertThat(parsedComments).hasSize(2);
-    assertFileComment("This is a nice file", parsedComments.get(0), comments.get(1).key.filename);
-    assertInlineComment("Also have a comment here.", parsedComments.get(1), comments.get(3));
-  }
-
-  @Test
-  public void allCommentsGmail() {
-    MailMessage.Builder b = newMailMessageBuilder();
-    b.textContent(
-        (newPlaintextBody(
-                    "Looks good to me",
-                    null,
-                    null,
-                    "Also have a comment here.",
-                    "This is a nice file",
-                    null,
-                    null)
-                + quotedFooter)
-            .replace("> ", ">> "));
-
-    List<Comment> comments = defaultComments();
-    List<MailComment> parsedComments = TextParser.parse(b.build(), comments, CHANGE_URL);
-
-    assertThat(parsedComments).hasSize(3);
-    assertChangeMessage("Looks good to me", parsedComments.get(0));
-    assertFileComment("This is a nice file", parsedComments.get(1), comments.get(1).key.filename);
-    assertInlineComment("Also have a comment here.", parsedComments.get(2), comments.get(3));
-  }
-
-  @Test
-  public void replyToFileComment() {
-    MailMessage.Builder b = newMailMessageBuilder();
-    b.textContent(
-        newPlaintextBody(
-                "Looks good to me",
-                null,
-                null,
-                null,
-                null,
-                null,
-                "Comment in reply to file comment")
-            + quotedFooter);
-
-    List<Comment> comments = defaultComments();
-    List<MailComment> parsedComments = TextParser.parse(b.build(), comments, CHANGE_URL);
-
-    assertThat(parsedComments).hasSize(2);
-    assertChangeMessage("Looks good to me", parsedComments.get(0));
-    assertInlineComment("Comment in reply to file comment", parsedComments.get(1), comments.get(0));
-  }
-
-  @Test
-  public void squashComments() {
-    MailMessage.Builder b = newMailMessageBuilder();
-    b.textContent(
-        "Nice change\n> Some quoted content\nMy other comment on the same entity\n" + quotedFooter);
-
-    List<MailComment> parsedComments = TextParser.parse(b.build(), defaultComments(), CHANGE_URL);
-
-    assertThat(parsedComments).hasSize(1);
-    assertChangeMessage(
-        "Nice change\n\nMy other comment on the same entity", parsedComments.get(0));
-  }
-
-  /**
-   * Create a plaintext message body with the specified comments.
-   *
-   * @param changeMessage
-   * @param c1 Comment in reply to first inline comment.
-   * @param c2 Comment in reply to second inline comment.
-   * @param c3 Comment in reply to third inline comment.
-   * @param f1 Comment on file one.
-   * @param f2 Comment on file two.
-   * @param fc1 Comment in reply to a comment of file 1.
-   * @return A string with all inline comments and the original quoted email.
-   */
-  private static String newPlaintextBody(
-      String changeMessage, String c1, String c2, String c3, String f1, String f2, String fc1) {
-    return (changeMessage == null ? "" : changeMessage + "\n")
-        + "On Thu, Feb 9, 2017 at 8:21 AM, ekempin (Gerrit)\n"
-        + "<noreply-gerritcodereview-qUgXfQecoDLHwp0MldAzig@google.com> wrote: \n"
-        + "> Foo Bar has posted comments on this change. (  \n"
-        + "> "
-        + CHANGE_URL
-        + "/1 )\n"
-        + "> \n"
-        + "> Change subject: Test change\n"
-        + "> ...............................................................\n"
-        + "> \n"
-        + "> \n"
-        + "> Patch Set 1: Code-Review+1\n"
-        + "> \n"
-        + "> (3 comments)\n"
-        + "> \n"
-        + "> "
-        + CHANGE_URL
-        + "/1/gerrit-server/test.txt\n"
-        + "> File  \n"
-        + "> gerrit-server/test.txt:\n"
-        + (f1 == null ? "" : f1 + "\n")
-        + "> \n"
-        + "> Patch Set #4:\n"
-        + "> "
-        + CHANGE_URL
-        + "/1/gerrit-server/test.txt\n"
-        + "> \n"
-        + "> Some comment"
-        + "> \n"
-        + (fc1 == null ? "" : fc1 + "\n")
-        + "> "
-        + CHANGE_URL
-        + "/1/gerrit-server/test.txt@2\n"
-        + "> PS1, Line 2: throw new Exception(\"Object has unsupported: \" +\n"
-        + ">               :             entry.getValue() +\n"
-        + ">               :             \" must be java.util.Date\");\n"
-        + "> Should entry.getKey() be included in this message?\n"
-        + "> \n"
-        + (c1 == null ? "" : c1 + "\n")
-        + ">\n"
-        + "> \n"
-        + "> "
-        + CHANGE_URL
-        + "/1/gerrit-server/test.txt@3\n"
-        + "> PS1, Line 3: throw new Exception(\"Object has: \" +\n"
-        + ">               :             entry.getValue().getClass() +\n"
-        + ">              :             \" must be java.util.Date\");\n"
-        + "> same here\n"
-        + "> \n"
-        + (c2 == null ? "" : c2 + "\n")
-        + "> \n"
-        + "> "
-        + CHANGE_URL
-        + "/1/gerrit-server/readme.txt\n"
-        + "> File  \n"
-        + "> gerrit-server/readme.txt:\n"
-        + (f2 == null ? "" : f2 + "\n")
-        + "> \n"
-        + "> "
-        + CHANGE_URL
-        + "/1/gerrit-server/readme.txt@3\n"
-        + "> PS1, Line 3: E\n"
-        + "> Should this be EEE like in other places?\n"
-        + (c3 == null ? "" : c3 + "\n");
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/AttachmentMessage.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/AttachmentMessage.java
deleted file mode 100644
index be8d882..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/AttachmentMessage.java
+++ /dev/null
@@ -1,88 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.receive.data;
-
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.mail.receive.MailMessage;
-import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
-import org.junit.Ignore;
-
-/**
- * Provides a raw message payload and a parsed {@code MailMessage} to check that mime parts that are
- * neither text/plain, nor * text/html are dropped.
- */
-@Ignore
-public class AttachmentMessage extends RawMailMessage {
-  private static String raw =
-      "MIME-Version: 1.0\n"
-          + "Date: Tue, 25 Oct 2016 02:11:35 -0700\n"
-          + "Message-ID: <CAM7sg=3meaAVUxW3KXeJEVs8sv_ADw1BnvpcHHiYVR2TQQi__w"
-          + "@mail.gmail.com>\n"
-          + "Subject: Test Subject\n"
-          + "From: Patrick Hiesel <hiesel@google.com>\n"
-          + "To: Patrick Hiesel <hiesel@google.com>\n"
-          + "Content-Type: multipart/mixed; boundary=001a114e019a56962d054062708f\n"
-          + "\n"
-          + "--001a114e019a56962d054062708f\n"
-          + "Content-Type: multipart/alternative; boundary=001a114e019a5696250540"
-          + "62708d\n"
-          + "\n"
-          + "--001a114e019a569625054062708d\n"
-          + "Content-Type: text/plain; charset=UTF-8\n"
-          + "\n"
-          + "Contains unwanted attachment"
-          + "\n"
-          + "--001a114e019a569625054062708d\n"
-          + "Content-Type: text/html; charset=UTF-8\n"
-          + "\n"
-          + "<div dir=\"ltr\">Contains unwanted attachment</div>"
-          + "\n"
-          + "--001a114e019a569625054062708d--\n"
-          + "--001a114e019a56962d054062708f\n"
-          + "Content-Type: text/plain; charset=US-ASCII; name=\"test.txt\"\n"
-          + "Content-Disposition: attachment; filename=\"test.txt\"\n"
-          + "Content-Transfer-Encoding: base64\n"
-          + "X-Attachment-Id: f_iv264bt50\n"
-          + "\n"
-          + "VEVTVAo=\n"
-          + "--001a114e019a56962d054062708f--";
-
-  @Override
-  public String raw() {
-    return raw;
-  }
-
-  @Override
-  public int[] rawChars() {
-    return null;
-  }
-
-  @Override
-  public MailMessage expectedMailMessage() {
-    System.out.println("\uD83D\uDE1B test");
-    MailMessage.Builder expect = MailMessage.builder();
-    expect
-        .id("<CAM7sg=3meaAVUxW3KXeJEVs8sv_ADw1BnvpcHHiYVR2TQQi__w@mail.gmail.com>")
-        .from(new Address("Patrick Hiesel", "hiesel@google.com"))
-        .addTo(new Address("Patrick Hiesel", "hiesel@google.com"))
-        .textContent("Contains unwanted attachment")
-        .htmlContent("<div dir=\"ltr\">Contains unwanted attachment</div>")
-        .subject("Test Subject")
-        .addAdditionalHeader("MIME-Version: 1.0")
-        .dateReceived(new DateTime(2016, 10, 25, 9, 11, 35, 0, DateTimeZone.UTC));
-    return expect.build();
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/Base64HeaderMessage.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/Base64HeaderMessage.java
deleted file mode 100644
index affa3bd..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/Base64HeaderMessage.java
+++ /dev/null
@@ -1,64 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.receive.data;
-
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.mail.receive.MailMessage;
-import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
-import org.junit.Ignore;
-
-/** Tests parsing a Base64 encoded subject. */
-@Ignore
-public class Base64HeaderMessage extends RawMailMessage {
-  private static String textContent = "Some Text";
-  private static String raw =
-      ""
-          + "Date: Tue, 25 Oct 2016 02:11:35 -0700\n"
-          + "Message-ID: <001a114da7ae26e2eb053fe0c29c@google.com>\n"
-          + "Subject: =?UTF-8?B?8J+YmyB0ZXN0?=\n"
-          + "From: \"Jonathan Nieder (Gerrit)\" <noreply-gerritcodereview-"
-          + "CtTy0igsBrnvL7dKoWEIEg@google.com>\n"
-          + "To: ekempin <ekempin@google.com>\n"
-          + "Content-Type: text/plain; charset=UTF-8; format=flowed; delsp=yes\n"
-          + "\n"
-          + textContent;
-
-  @Override
-  public String raw() {
-    return raw;
-  }
-
-  @Override
-  public int[] rawChars() {
-    return null;
-  }
-
-  @Override
-  public MailMessage expectedMailMessage() {
-    MailMessage.Builder expect = MailMessage.builder();
-    expect
-        .id("<001a114da7ae26e2eb053fe0c29c@google.com>")
-        .from(
-            new Address(
-                "Jonathan Nieder (Gerrit)",
-                "noreply-gerritcodereview-CtTy0igsBrnvL7dKoWEIEg@google.com"))
-        .addTo(new Address("ekempin", "ekempin@google.com"))
-        .textContent(textContent)
-        .subject("\uD83D\uDE1B test")
-        .dateReceived(new DateTime(2016, 10, 25, 9, 11, 35, 0, DateTimeZone.UTC));
-    return expect.build();
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/HtmlMimeMessage.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/HtmlMimeMessage.java
deleted file mode 100644
index 487e9dd..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/HtmlMimeMessage.java
+++ /dev/null
@@ -1,104 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.receive.data;
-
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.mail.receive.MailMessage;
-import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
-import org.junit.Ignore;
-
-/** Tests a message containing mime/alternative (text + html) content. */
-@Ignore
-public class HtmlMimeMessage extends RawMailMessage {
-  private static String textContent = "Simple test";
-
-  // htmlContent is encoded in quoted-printable
-  private static String htmlContent =
-      "<div dir=3D\"ltr\">Test <span style"
-          + "=3D\"background-color:rgb(255,255,0)\">Messa=\n"
-          + "ge</span> in <u>HTML=C2=A0</u><a href=3D\"https://en.wikipedia.org/"
-          + "wiki/%C3%=\n9Cmlaut_(band)\" class=3D\"gmail-mw-redirect\" title=3D\""
-          + "=C3=9Cmlaut (band)\" st=\nyle=3D\"text-decoration:none;color:rgb(11,"
-          + "0,128);background-image:none;backg=\nround-position:initial;background"
-          + "-size:initial;background-repeat:initial;ba=\nckground-origin:initial;"
-          + "background-clip:initial;font-family:sans-serif;font=\n"
-          + "-size:14px\">=C3=9C</a></div>";
-
-  private static String unencodedHtmlContent =
-      ""
-          + "<div dir=\"ltr\">Test <span style=\"background-color:rgb(255,255,0)\">"
-          + "Message</span> in <u>HTML </u><a href=\"https://en.wikipedia.org/wiki/"
-          + "%C3%9Cmlaut_(band)\" class=\"gmail-mw-redirect\" title=\"Ümlaut "
-          + "(band)\" style=\"text-decoration:none;color:rgb(11,0,128);"
-          + "background-image:none;background-position:initial;background-size:"
-          + "initial;background-repeat:initial;background-origin:initial;background"
-          + "-clip:initial;font-family:sans-serif;font-size:14px\">Ü</a></div>";
-
-  private static String raw =
-      ""
-          + "MIME-Version: 1.0\n"
-          + "Date: Tue, 25 Oct 2016 02:11:35 -0700\n"
-          + "Message-ID: <001a114cd8be55b4ab053face5cd@google.com>\n"
-          + "Subject: Change in gerrit[master]: Implement receiver class structure "
-          + "and bindings\n"
-          + "From: \"ekempin (Gerrit)\" <noreply-gerritcodereview-qUgXfQecoDLHwp0Ml"
-          + "dAzig@google.com>\n"
-          + "To: Patrick Hiesel <hiesel@google.com>\n"
-          + "Cc: ekempin <ekempin@google.com>\n"
-          + "Content-Type: multipart/alternative; boundary=001a114cd8b"
-          + "e55b486053face5ca\n"
-          + "\n"
-          + "--001a114cd8be55b486053face5ca\n"
-          + "Content-Type: text/plain; charset=UTF-8; format=flowed; delsp=yes\n"
-          + "\n"
-          + textContent
-          + "\n"
-          + "--001a114cd8be55b486053face5ca\n"
-          + "Content-Type: text/html; charset=UTF-8\n"
-          + "Content-Transfer-Encoding: quoted-printable\n"
-          + "\n"
-          + htmlContent
-          + "\n"
-          + "--001a114cd8be55b486053face5ca--";
-
-  @Override
-  public String raw() {
-    return raw;
-  }
-
-  @Override
-  public int[] rawChars() {
-    return null;
-  }
-
-  @Override
-  public MailMessage expectedMailMessage() {
-    MailMessage.Builder expect = MailMessage.builder();
-    expect
-        .id("<001a114cd8be55b4ab053face5cd@google.com>")
-        .from(
-            new Address(
-                "ekempin (Gerrit)", "noreply-gerritcodereview-qUgXfQecoDLHwp0MldAzig@google.com"))
-        .addCc(new Address("ekempin", "ekempin@google.com"))
-        .addTo(new Address("Patrick Hiesel", "hiesel@google.com"))
-        .textContent(textContent)
-        .htmlContent(unencodedHtmlContent)
-        .subject("Change in gerrit[master]: Implement receiver class structure and bindings")
-        .addAdditionalHeader("MIME-Version: 1.0")
-        .dateReceived(new DateTime(2016, 10, 25, 9, 11, 35, 0, DateTimeZone.UTC));
-    return expect.build();
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/NonUTF8Message.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/NonUTF8Message.java
deleted file mode 100644
index 9f2af0d..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/NonUTF8Message.java
+++ /dev/null
@@ -1,68 +0,0 @@
-// 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.
-package com.google.gerrit.server.mail.receive.data;
-
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.mail.receive.MailMessage;
-import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
-import org.junit.Ignore;
-
-/** Tests that non-UTF8 encodings are handled correctly. */
-@Ignore
-public class NonUTF8Message extends RawMailMessage {
-  private static String textContent = "Some Text";
-  private static String raw =
-      ""
-          + "Date: Tue, 25 Oct 2016 02:11:35 -0700\n"
-          + "Message-ID: <001a114da7ae26e2eb053fe0c29c@google.com>\n"
-          + "Subject: =?UTF-8?B?8J+YmyB0ZXN0?=\n"
-          + "From: \"Jonathan Nieder (Gerrit)\" <noreply-gerritcodereview-"
-          + "CtTy0igsBrnvL7dKoWEIEg@google.com>\n"
-          + "To: ekempin <ekempin@google.com>\n"
-          + "Content-Type: text/plain; charset=UTF-8; format=flowed; delsp=yes\n"
-          + "\n"
-          + textContent;
-
-  @Override
-  public String raw() {
-    return null;
-  }
-
-  @Override
-  public int[] rawChars() {
-    int[] arr = new int[raw.length()];
-    int i = 0;
-    for (char c : raw.toCharArray()) {
-      arr[i++] = c;
-    }
-    return arr;
-  }
-
-  @Override
-  public MailMessage expectedMailMessage() {
-    MailMessage.Builder expect = MailMessage.builder();
-    expect
-        .id("<001a114da7ae26e2eb053fe0c29c@google.com>")
-        .from(
-            new Address(
-                "Jonathan Nieder (Gerrit)",
-                "noreply-gerritcodereview-CtTy0igsBrnvL7dKoWEIEg@google.com"))
-        .addTo(new Address("ekempin", "ekempin@google.com"))
-        .textContent(textContent)
-        .subject("\uD83D\uDE1B test")
-        .dateReceived(new DateTime(2016, 10, 25, 9, 11, 35, 0, DateTimeZone.UTC));
-    return expect.build();
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/QuotedPrintableHeaderMessage.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/QuotedPrintableHeaderMessage.java
deleted file mode 100644
index 2c17859..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/QuotedPrintableHeaderMessage.java
+++ /dev/null
@@ -1,65 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.receive.data;
-
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.mail.receive.MailMessage;
-import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
-import org.junit.Ignore;
-
-/** Tests parsing a quoted printable encoded subject */
-@Ignore
-public class QuotedPrintableHeaderMessage extends RawMailMessage {
-  private static String textContent = "Some Text";
-  private static String raw =
-      ""
-          + "Date: Tue, 25 Oct 2016 02:11:35 -0700\n"
-          + "Message-ID: <001a114da7ae26e2eb053fe0c29c@google.com>\n"
-          + "Subject: =?UTF-8?Q?=C3=A2me vulgaire?=\n"
-          + "From: \"Jonathan Nieder (Gerrit)\" <noreply-gerritcodereview-"
-          + "CtTy0igsBrnvL7dKoWEIEg@google.com>\n"
-          + "To: ekempin <ekempin@google.com>\n"
-          + "Content-Type: text/plain; charset=UTF-8; format=flowed; delsp=yes\n"
-          + "\n"
-          + textContent;
-
-  @Override
-  public String raw() {
-    return raw;
-  }
-
-  @Override
-  public int[] rawChars() {
-    return null;
-  }
-
-  @Override
-  public MailMessage expectedMailMessage() {
-    System.out.println("\uD83D\uDE1B test");
-    MailMessage.Builder expect = MailMessage.builder();
-    expect
-        .id("<001a114da7ae26e2eb053fe0c29c@google.com>")
-        .from(
-            new Address(
-                "Jonathan Nieder (Gerrit)",
-                "noreply-gerritcodereview-CtTy0igsBrnvL7dKoWEIEg@google.com"))
-        .addTo(new Address("ekempin", "ekempin@google.com"))
-        .textContent(textContent)
-        .subject("âme vulgaire")
-        .dateReceived(new DateTime(2016, 10, 25, 9, 11, 35, 0, DateTimeZone.UTC));
-    return expect.build();
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/RawMailMessage.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/RawMailMessage.java
deleted file mode 100644
index 2af82ad..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/RawMailMessage.java
+++ /dev/null
@@ -1,29 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.receive.data;
-
-import com.google.gerrit.server.mail.receive.MailMessage;
-import org.junit.Ignore;
-
-/** Base class for all email parsing tests. */
-@Ignore
-public abstract class RawMailMessage {
-  // Raw content to feed the parser
-  public abstract String raw();
-
-  public abstract int[] rawChars();
-  // Parsed representation for asserting the expected parser output
-  public abstract MailMessage expectedMailMessage();
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/SimpleTextMessage.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/SimpleTextMessage.java
deleted file mode 100644
index ce833d5..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/receive/data/SimpleTextMessage.java
+++ /dev/null
@@ -1,138 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.mail.receive.data;
-
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.mail.receive.MailMessage;
-import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
-import org.junit.Ignore;
-
-/** Tests parsing a simple text message with different headers. */
-@Ignore
-public class SimpleTextMessage extends RawMailMessage {
-  private static String textContent =
-      ""
-          + "Jonathan Nieder has posted comments on this change. (  \n"
-          + "https://gerrit-review.googlesource.com/90018 )\n"
-          + "\n"
-          + "Change subject: (Re)enable voting buttons for merged changes\n"
-          + "...........................................................\n"
-          + "\n"
-          + "\n"
-          + "Patch Set 2:\n"
-          + "\n"
-          + "This is producing NPEs server-side and 500s for the client.   \n"
-          + "when I try to load this change:\n"
-          + "\n"
-          + "  Error in GET /changes/90018/detail?O=10004\n"
-          + "  com.google.gwtorm.OrmException: java.lang.NullPointerException\n"
-          + "\tat com.google.gerrit.change.ChangeJson.format(ChangeJson.java:303)\n"
-          + "\tat com.google.gerrit.change.ChangeJson.format(ChangeJson.java:285)\n"
-          + "\tat com.google.gerrit.change.ChangeJson.format(ChangeJson.java:263)\n"
-          + "\tat com.google.gerrit.change.GetChange.apply(GetChange.java:50)\n"
-          + "\tat com.google.gerrit.change.GetDetail.apply(GetDetail.java:51)\n"
-          + "\tat com.google.gerrit.change.GetDetail.apply(GetDetail.java:26)\n"
-          + "\tat  \n"
-          + "com.google.gerrit.RestApiServlet.service(RestApiServlet.java:367)\n"
-          + "\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:717)\n"
-          + "[...]\n"
-          + "  Caused by: java.lang.NullPointerException\n"
-          + "\tat  \n"
-          + "com.google.gerrit.ChangeJson.setLabelScores(ChangeJson.java:670)\n"
-          + "\tat  \n"
-          + "com.google.gerrit.ChangeJson.labelsFor(ChangeJson.java:845)\n"
-          + "\tat  \n"
-          + "com.google.gerrit.change.ChangeJson.labelsFor(ChangeJson.java:598)\n"
-          + "\tat  \n"
-          + "com.google.gerrit.change.ChangeJson.toChange(ChangeJson.java:499)\n"
-          + "\tat com.google.gerrit.change.ChangeJson.format(ChangeJson.java:294)\n"
-          + "\t... 105 more\n"
-          + "-- \n"
-          + "To view, visit https://gerrit-review.googlesource.com/90018\n"
-          + "To unsubscribe, visit https://gerrit-review.googlesource.com\n"
-          + "\n"
-          + "Gerrit-MessageType: comment\n"
-          + "Gerrit-Change-Id: Iba501e00bee77be3bd0ced72f88fd04ba0accaed\n"
-          + "Gerrit-PatchSet: 2\n"
-          + "Gerrit-Project: gerrit\n"
-          + "Gerrit-Branch: master\n"
-          + "Gerrit-Owner: ekempin <ekempin@google.com>\n"
-          + "Gerrit-Reviewer: Dave Borowitz <dborowitz@google.com>\n"
-          + "Gerrit-Reviewer: Edwin Kempin <ekempin@google.com>\n"
-          + "Gerrit-Reviewer: GerritForge CI <gerritforge@gmail.com>\n"
-          + "Gerrit-Reviewer: Jonathan Nieder <jrn@google.com>\n"
-          + "Gerrit-Reviewer: Patrick Hiesel <hiesel@google.com>\n"
-          + "Gerrit-Reviewer: ekempin <ekempin@google.com>\n"
-          + "Gerrit-HasComments: No";
-
-  private static String raw =
-      ""
-          + "Authentication-Results: mx.google.com; dkim=pass header.i="
-          + "@google.com;\n"
-          + "Date: Tue, 25 Oct 2016 02:11:35 -0700\n"
-          + "In-Reply-To: <gerrit.1477487889000.Iba501e00bee77be3bd0ced"
-          + "72f88fd04ba0accaed@gerrit-review.googlesource.com>\n"
-          + "References: <gerrit.1477487889000.Iba501e00bee77be3bd0ced72f8"
-          + "8fd04ba0accaed@gerrit-review.googlesource.com>\n"
-          + "Message-ID: <001a114da7ae26e2eb053fe0c29c@google.com>\n"
-          + "Subject: Change in gerrit[master]: (Re)enable voting buttons for "
-          + "merged changes\n"
-          + "From: \"Jonathan Nieder (Gerrit)\" <noreply-gerritcodereview-CtTy0"
-          + "igsBrnvL7dKoWEIEg@google.com>\n"
-          + "To: ekempin <ekempin@google.com>\n"
-          + "Cc: Dave Borowitz <dborowitz@google.com>, Jonathan Nieder "
-          + "<jrn@google.com>, Patrick Hiesel <hiesel@google.com>\n"
-          + "Content-Type: text/plain; charset=UTF-8; format=flowed; delsp=yes\n"
-          + "\n"
-          + textContent;
-
-  @Override
-  public String raw() {
-    return raw;
-  }
-
-  @Override
-  public int[] rawChars() {
-    return null;
-  }
-
-  @Override
-  public MailMessage expectedMailMessage() {
-    MailMessage.Builder expect = MailMessage.builder();
-    expect
-        .id("<001a114da7ae26e2eb053fe0c29c@google.com>")
-        .from(
-            new Address(
-                "Jonathan Nieder (Gerrit)",
-                "noreply-gerritcodereview-CtTy0igsBrnvL7dKoWEIEg@google.com"))
-        .addTo(new Address("ekempin", "ekempin@google.com"))
-        .addCc(new Address("Dave Borowitz", "dborowitz@google.com"))
-        .addCc(new Address("Jonathan Nieder", "jrn@google.com"))
-        .addCc(new Address("Patrick Hiesel", "hiesel@google.com"))
-        .textContent(textContent)
-        .subject("Change in gerrit[master]: (Re)enable voting buttons for merged changes")
-        .dateReceived(new DateTime(2016, 10, 25, 9, 11, 35, 0, DateTimeZone.UTC))
-        .addAdditionalHeader(
-            "Authentication-Results: mx.google.com; dkim=pass header.i=@google.com;")
-        .addAdditionalHeader(
-            "In-Reply-To: <gerrit.1477487889000.Iba501e00bee"
-                + "77be3bd0ced72f88fd04ba0accaed@gerrit-review.googlesource.com>")
-        .addAdditionalHeader(
-            "References: <gerrit.1477487889000.Iba501e00bee"
-                + "77be3bd0ced72f88fd04ba0accaed@gerrit-review.googlesource.com>");
-    return expect.build();
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/send/FromAddressGeneratorProviderTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/send/FromAddressGeneratorProviderTest.java
deleted file mode 100644
index d65dd47..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/send/FromAddressGeneratorProviderTest.java
+++ /dev/null
@@ -1,393 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.mail.send;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.easymock.EasyMock.createStrictMock;
-import static org.easymock.EasyMock.eq;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
-import static org.easymock.EasyMock.verify;
-
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.config.AllUsersNameProvider;
-import com.google.gerrit.server.mail.Address;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.junit.Before;
-import org.junit.Test;
-
-public class FromAddressGeneratorProviderTest {
-  private Config config;
-  private PersonIdent ident;
-  private AccountCache accountCache;
-
-  @Before
-  public void setUp() throws Exception {
-    config = new Config();
-    ident = new PersonIdent("NAME", "e@email", 0, 0);
-    accountCache = createStrictMock(AccountCache.class);
-  }
-
-  private FromAddressGenerator create() {
-    return new FromAddressGeneratorProvider(config, "Anonymous Coward", ident, accountCache).get();
-  }
-
-  private void setFrom(String newFrom) {
-    config.setString("sendemail", null, "from", newFrom);
-  }
-
-  private void setDomains(List<String> domains) {
-    config.setStringList("sendemail", null, "allowedDomain", domains);
-  }
-
-  @Test
-  public void defaultIsMIXED() {
-    assertThat(create()).isInstanceOf(FromAddressGeneratorProvider.PatternGen.class);
-  }
-
-  @Test
-  public void selectUSER() {
-    setFrom("USER");
-    assertThat(create()).isInstanceOf(FromAddressGeneratorProvider.UserGen.class);
-
-    setFrom("user");
-    assertThat(create()).isInstanceOf(FromAddressGeneratorProvider.UserGen.class);
-
-    setFrom("uSeR");
-    assertThat(create()).isInstanceOf(FromAddressGeneratorProvider.UserGen.class);
-  }
-
-  @Test
-  public void USER_FullyConfiguredUser() {
-    setFrom("USER");
-
-    final String name = "A U. Thor";
-    final String email = "a.u.thor@test.example.com";
-    final Account.Id user = user(name, email);
-
-    replay(accountCache);
-    final Address r = create().from(user);
-    assertThat(r).isNotNull();
-    assertThat(r.getName()).isEqualTo(name);
-    assertThat(r.getEmail()).isEqualTo(email);
-    verify(accountCache);
-  }
-
-  @Test
-  public void USER_NoFullNameUser() {
-    setFrom("USER");
-
-    final String email = "a.u.thor@test.example.com";
-    final Account.Id user = user(null, email);
-
-    replay(accountCache);
-    final Address r = create().from(user);
-    assertThat(r).isNotNull();
-    assertThat(r.getName()).isNull();
-    assertThat(r.getEmail()).isEqualTo(email);
-    verify(accountCache);
-  }
-
-  @Test
-  public void USER_NoPreferredEmailUser() {
-    setFrom("USER");
-
-    final String name = "A U. Thor";
-    final Account.Id user = user(name, null);
-
-    replay(accountCache);
-    final Address r = create().from(user);
-    assertThat(r).isNotNull();
-    assertThat(r.getName()).isEqualTo(name + " (Code Review)");
-    assertThat(r.getEmail()).isEqualTo(ident.getEmailAddress());
-    verify(accountCache);
-  }
-
-  @Test
-  public void USER_NullUser() {
-    setFrom("USER");
-    replay(accountCache);
-    final Address r = create().from(null);
-    assertThat(r).isNotNull();
-    assertThat(r.getName()).isEqualTo(ident.getName());
-    assertThat(r.getEmail()).isEqualTo(ident.getEmailAddress());
-    verify(accountCache);
-  }
-
-  @Test
-  public void USERAllowDomain() {
-    setFrom("USER");
-    setDomains(Arrays.asList("*.example.com"));
-    final String name = "A U. Thor";
-    final String email = "a.u.thor@test.example.com";
-    final Account.Id user = user(name, email);
-
-    replay(accountCache);
-    final Address r = create().from(user);
-    assertThat(r).isNotNull();
-    assertThat(r.getName()).isEqualTo(name);
-    assertThat(r.getEmail()).isEqualTo(email);
-    verify(accountCache);
-  }
-
-  @Test
-  public void USERNoAllowDomain() {
-    setFrom("USER");
-    setDomains(Arrays.asList("example.com"));
-    final String name = "A U. Thor";
-    final String email = "a.u.thor@test.com";
-    final Account.Id user = user(name, email);
-
-    replay(accountCache);
-    final Address r = create().from(user);
-    assertThat(r).isNotNull();
-    assertThat(r.getName()).isEqualTo(name + " (Code Review)");
-    assertThat(r.getEmail()).isEqualTo(ident.getEmailAddress());
-    verify(accountCache);
-  }
-
-  @Test
-  public void USERAllowDomainTwice() {
-    setFrom("USER");
-    setDomains(Arrays.asList("example.com"));
-    setDomains(Arrays.asList("test.com"));
-    final String name = "A U. Thor";
-    final String email = "a.u.thor@test.com";
-    final Account.Id user = user(name, email);
-
-    replay(accountCache);
-    final Address r = create().from(user);
-    assertThat(r).isNotNull();
-    assertThat(r.getName()).isEqualTo(name);
-    assertThat(r.getEmail()).isEqualTo(email);
-    verify(accountCache);
-  }
-
-  @Test
-  public void USERAllowDomainTwiceReverse() {
-    setFrom("USER");
-    setDomains(Arrays.asList("test.com"));
-    setDomains(Arrays.asList("example.com"));
-    final String name = "A U. Thor";
-    final String email = "a.u.thor@test.com";
-    final Account.Id user = user(name, email);
-
-    replay(accountCache);
-    final Address r = create().from(user);
-    assertThat(r).isNotNull();
-    assertThat(r.getName()).isEqualTo(name + " (Code Review)");
-    assertThat(r.getEmail()).isEqualTo(ident.getEmailAddress());
-    verify(accountCache);
-  }
-
-  @Test
-  public void USERAllowTwoDomains() {
-    setFrom("USER");
-    setDomains(Arrays.asList("example.com", "test.com"));
-    final String name = "A U. Thor";
-    final String email = "a.u.thor@test.com";
-    final Account.Id user = user(name, email);
-
-    replay(accountCache);
-    final Address r = create().from(user);
-    assertThat(r).isNotNull();
-    assertThat(r.getName()).isEqualTo(name);
-    assertThat(r.getEmail()).isEqualTo(email);
-    verify(accountCache);
-  }
-
-  @Test
-  public void selectSERVER() {
-    setFrom("SERVER");
-    assertThat(create()).isInstanceOf(FromAddressGeneratorProvider.ServerGen.class);
-
-    setFrom("server");
-    assertThat(create()).isInstanceOf(FromAddressGeneratorProvider.ServerGen.class);
-
-    setFrom("sErVeR");
-    assertThat(create()).isInstanceOf(FromAddressGeneratorProvider.ServerGen.class);
-  }
-
-  @Test
-  public void SERVER_FullyConfiguredUser() {
-    setFrom("SERVER");
-
-    final String name = "A U. Thor";
-    final String email = "a.u.thor@test.example.com";
-    final Account.Id user = userNoLookup(name, email);
-
-    replay(accountCache);
-    final Address r = create().from(user);
-    assertThat(r).isNotNull();
-    assertThat(r.getName()).isEqualTo(ident.getName());
-    assertThat(r.getEmail()).isEqualTo(ident.getEmailAddress());
-    verify(accountCache);
-  }
-
-  @Test
-  public void SERVER_NullUser() {
-    setFrom("SERVER");
-    replay(accountCache);
-    final Address r = create().from(null);
-    assertThat(r).isNotNull();
-    assertThat(r.getName()).isEqualTo(ident.getName());
-    assertThat(r.getEmail()).isEqualTo(ident.getEmailAddress());
-    verify(accountCache);
-  }
-
-  @Test
-  public void selectMIXED() {
-    setFrom("MIXED");
-    assertThat(create()).isInstanceOf(FromAddressGeneratorProvider.PatternGen.class);
-
-    setFrom("mixed");
-    assertThat(create()).isInstanceOf(FromAddressGeneratorProvider.PatternGen.class);
-
-    setFrom("mIxEd");
-    assertThat(create()).isInstanceOf(FromAddressGeneratorProvider.PatternGen.class);
-  }
-
-  @Test
-  public void MIXED_FullyConfiguredUser() {
-    setFrom("MIXED");
-
-    final String name = "A U. Thor";
-    final String email = "a.u.thor@test.example.com";
-    final Account.Id user = user(name, email);
-
-    replay(accountCache);
-    final Address r = create().from(user);
-    assertThat(r).isNotNull();
-    assertThat(r.getName()).isEqualTo(name + " (Code Review)");
-    assertThat(r.getEmail()).isEqualTo(ident.getEmailAddress());
-    verify(accountCache);
-  }
-
-  @Test
-  public void MIXED_NoFullNameUser() {
-    setFrom("MIXED");
-
-    final String email = "a.u.thor@test.example.com";
-    final Account.Id user = user(null, email);
-
-    replay(accountCache);
-    final Address r = create().from(user);
-    assertThat(r).isNotNull();
-    assertThat(r.getName()).isEqualTo("Anonymous Coward (Code Review)");
-    assertThat(r.getEmail()).isEqualTo(ident.getEmailAddress());
-    verify(accountCache);
-  }
-
-  @Test
-  public void MIXED_NoPreferredEmailUser() {
-    setFrom("MIXED");
-
-    final String name = "A U. Thor";
-    final Account.Id user = user(name, null);
-
-    replay(accountCache);
-    final Address r = create().from(user);
-    assertThat(r).isNotNull();
-    assertThat(r.getName()).isEqualTo(name + " (Code Review)");
-    assertThat(r.getEmail()).isEqualTo(ident.getEmailAddress());
-    verify(accountCache);
-  }
-
-  @Test
-  public void MIXED_NullUser() {
-    setFrom("MIXED");
-    replay(accountCache);
-    final Address r = create().from(null);
-    assertThat(r).isNotNull();
-    assertThat(r.getName()).isEqualTo(ident.getName());
-    assertThat(r.getEmail()).isEqualTo(ident.getEmailAddress());
-    verify(accountCache);
-  }
-
-  @Test
-  public void CUSTOM_FullyConfiguredUser() {
-    setFrom("A ${user} B <my.server@email.address>");
-
-    final String name = "A U. Thor";
-    final String email = "a.u.thor@test.example.com";
-    final Account.Id user = user(name, email);
-
-    replay(accountCache);
-    final Address r = create().from(user);
-    assertThat(r).isNotNull();
-    assertThat(r.getName()).isEqualTo("A " + name + " B");
-    assertThat(r.getEmail()).isEqualTo("my.server@email.address");
-    verify(accountCache);
-  }
-
-  @Test
-  public void CUSTOM_NoFullNameUser() {
-    setFrom("A ${user} B <my.server@email.address>");
-
-    final String email = "a.u.thor@test.example.com";
-    final Account.Id user = user(null, email);
-
-    replay(accountCache);
-    final Address r = create().from(user);
-    assertThat(r).isNotNull();
-    assertThat(r.getName()).isEqualTo("A Anonymous Coward B");
-    assertThat(r.getEmail()).isEqualTo("my.server@email.address");
-    verify(accountCache);
-  }
-
-  @Test
-  public void CUSTOM_NullUser() {
-    setFrom("A ${user} B <my.server@email.address>");
-
-    replay(accountCache);
-    final Address r = create().from(null);
-    assertThat(r).isNotNull();
-    assertThat(r.getName()).isEqualTo(ident.getName());
-    assertThat(r.getEmail()).isEqualTo("my.server@email.address");
-    verify(accountCache);
-  }
-
-  private Account.Id user(String name, String email) {
-    final AccountState s = makeUser(name, email);
-    expect(accountCache.get(eq(s.getAccount().getId()))).andReturn(s);
-    return s.getAccount().getId();
-  }
-
-  private Account.Id userNoLookup(String name, String email) {
-    final AccountState s = makeUser(name, email);
-    return s.getAccount().getId();
-  }
-
-  private AccountState makeUser(String name, String email) {
-    final Account.Id userId = new Account.Id(42);
-    final Account account = new Account(userId, TimeUtil.nowTs());
-    account.setFullName(name);
-    account.setPreferredEmail(email);
-    return new AccountState(
-        new AllUsersName(AllUsersNameProvider.DEFAULT),
-        account,
-        Collections.emptySet(),
-        new HashMap<>());
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/AbstractChangeNotesTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/AbstractChangeNotesTest.java
deleted file mode 100644
index f03fb37..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/AbstractChangeNotesTest.java
+++ /dev/null
@@ -1,299 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.notedb;
-
-import static com.google.inject.Scopes.SINGLETON;
-import static java.util.concurrent.TimeUnit.SECONDS;
-
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.common.data.SubmitRecord;
-import com.google.gerrit.extensions.config.FactoryModule;
-import com.google.gerrit.metrics.DisabledMetricMaker;
-import com.google.gerrit.metrics.MetricMaker;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.CommentRange;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.InternalUser;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.FakeRealm;
-import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.Realm;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.config.AllUsersNameProvider;
-import com.google.gerrit.server.config.AnonymousCowardName;
-import com.google.gerrit.server.config.AnonymousCowardNameProvider;
-import com.google.gerrit.server.config.CanonicalWebUrl;
-import com.google.gerrit.server.config.DisableReverseDnsLookup;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.GerritServerId;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitModule;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.group.SystemGroupBackend;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.testutil.ConfigSuite;
-import com.google.gerrit.testutil.FakeAccountCache;
-import com.google.gerrit.testutil.GerritBaseTests;
-import com.google.gerrit.testutil.InMemoryRepositoryManager;
-import com.google.gerrit.testutil.TestChanges;
-import com.google.gerrit.testutil.TestTimeUtil;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Guice;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.TypeLiteral;
-import com.google.inject.util.Providers;
-import java.sql.Timestamp;
-import java.util.TimeZone;
-import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.runner.RunWith;
-
-@Ignore
-@RunWith(ConfigSuite.class)
-public abstract class AbstractChangeNotesTest extends GerritBaseTests {
-  @ConfigSuite.Default
-  public static Config changeNotesLegacy() {
-    Config cfg = new Config();
-    cfg.setBoolean("notedb", null, "writeJson", false);
-    return cfg;
-  }
-
-  @ConfigSuite.Config
-  public static Config changeNotesJson() {
-    Config cfg = new Config();
-    cfg.setBoolean("notedb", null, "writeJson", true);
-    return cfg;
-  }
-
-  @ConfigSuite.Parameter public Config testConfig;
-
-  private static final TimeZone TZ = TimeZone.getTimeZone("America/Los_Angeles");
-
-  protected Account.Id otherUserId;
-  protected FakeAccountCache accountCache;
-  protected IdentifiedUser changeOwner;
-  protected IdentifiedUser otherUser;
-  protected InMemoryRepository repo;
-  protected InMemoryRepositoryManager repoManager;
-  protected PersonIdent serverIdent;
-  protected InternalUser internalUser;
-  protected Project.NameKey project;
-  protected RevWalk rw;
-  protected TestRepository<InMemoryRepository> tr;
-
-  @Inject protected IdentifiedUser.GenericFactory userFactory;
-
-  @Inject protected NoteDbUpdateManager.Factory updateManagerFactory;
-
-  @Inject protected AllUsersName allUsers;
-
-  @Inject protected AbstractChangeNotes.Args args;
-
-  @Inject @GerritServerId private String serverId;
-
-  protected Injector injector;
-  private String systemTimeZone;
-
-  @Before
-  public void setUp() throws Exception {
-    setTimeForTesting();
-
-    serverIdent = new PersonIdent("Gerrit Server", "noreply@gerrit.com", TimeUtil.nowTs(), TZ);
-    project = new Project.NameKey("test-project");
-    repoManager = new InMemoryRepositoryManager();
-    repo = repoManager.createRepository(project);
-    tr = new TestRepository<>(repo);
-    rw = tr.getRevWalk();
-    accountCache = new FakeAccountCache();
-    Account co = new Account(new Account.Id(1), TimeUtil.nowTs());
-    co.setFullName("Change Owner");
-    co.setPreferredEmail("change@owner.com");
-    accountCache.put(co);
-    Account ou = new Account(new Account.Id(2), TimeUtil.nowTs());
-    ou.setFullName("Other Account");
-    ou.setPreferredEmail("other@account.com");
-    accountCache.put(ou);
-
-    injector =
-        Guice.createInjector(
-            new FactoryModule() {
-              @Override
-              public void configure() {
-                install(new GitModule());
-                install(NoteDbModule.forTest(testConfig));
-                bind(AllUsersName.class).toProvider(AllUsersNameProvider.class);
-                bind(String.class).annotatedWith(GerritServerId.class).toInstance("gerrit");
-                bind(GitRepositoryManager.class).toInstance(repoManager);
-                bind(ProjectCache.class).toProvider(Providers.<ProjectCache>of(null));
-                bind(Config.class).annotatedWith(GerritServerConfig.class).toInstance(testConfig);
-                bind(String.class)
-                    .annotatedWith(AnonymousCowardName.class)
-                    .toProvider(AnonymousCowardNameProvider.class);
-                bind(String.class)
-                    .annotatedWith(CanonicalWebUrl.class)
-                    .toInstance("http://localhost:8080/");
-                bind(Boolean.class)
-                    .annotatedWith(DisableReverseDnsLookup.class)
-                    .toInstance(Boolean.FALSE);
-                bind(Realm.class).to(FakeRealm.class);
-                bind(GroupBackend.class).to(SystemGroupBackend.class).in(SINGLETON);
-                bind(AccountCache.class).toInstance(accountCache);
-                bind(PersonIdent.class)
-                    .annotatedWith(GerritPersonIdent.class)
-                    .toInstance(serverIdent);
-                bind(GitReferenceUpdated.class).toInstance(GitReferenceUpdated.DISABLED);
-                bind(MetricMaker.class).to(DisabledMetricMaker.class);
-                bind(ReviewDb.class).toProvider(Providers.<ReviewDb>of(null));
-
-                MutableNotesMigration migration = MutableNotesMigration.newDisabled();
-                migration.setFrom(NotesMigrationState.FINAL);
-                bind(MutableNotesMigration.class).toInstance(migration);
-                bind(NotesMigration.class).to(MutableNotesMigration.class);
-
-                // Tests don't support ReviewDb at all, but bindings are required via NoteDbModule.
-                bind(new TypeLiteral<SchemaFactory<ReviewDb>>() {})
-                    .toInstance(
-                        () -> {
-                          throw new UnsupportedOperationException();
-                        });
-                bind(ChangeBundleReader.class)
-                    .toInstance(
-                        (db, id) -> {
-                          throw new UnsupportedOperationException();
-                        });
-              }
-            });
-
-    injector.injectMembers(this);
-    repoManager.createRepository(allUsers);
-    changeOwner = userFactory.create(co.getId());
-    otherUser = userFactory.create(ou.getId());
-    otherUserId = otherUser.getAccountId();
-    internalUser = new InternalUser();
-  }
-
-  private void setTimeForTesting() {
-    systemTimeZone = System.setProperty("user.timezone", "US/Eastern");
-    TestTimeUtil.resetWithClockStep(1, SECONDS);
-  }
-
-  @After
-  public void resetTime() {
-    TestTimeUtil.useSystemTime();
-    System.setProperty("user.timezone", systemTimeZone);
-  }
-
-  protected Change newChange(boolean workInProgress) throws Exception {
-    Change c = TestChanges.newChange(project, changeOwner.getAccountId());
-    ChangeUpdate u = newUpdate(c, changeOwner);
-    u.setChangeId(c.getKey().get());
-    u.setBranch(c.getDest().get());
-    u.setWorkInProgress(workInProgress);
-    u.commit();
-    return c;
-  }
-
-  protected Change newWorkInProgressChange() throws Exception {
-    return newChange(true);
-  }
-
-  protected Change newChange() throws Exception {
-    return newChange(false);
-  }
-
-  protected ChangeUpdate newUpdate(Change c, CurrentUser user) throws Exception {
-    ChangeUpdate update = TestChanges.newUpdate(injector, c, user);
-    update.setPatchSetId(c.currentPatchSetId());
-    update.setAllowWriteToNewRef(true);
-    return update;
-  }
-
-  protected ChangeNotes newNotes(Change c) throws OrmException {
-    return new ChangeNotes(args, c).load();
-  }
-
-  protected static SubmitRecord submitRecord(
-      String status, String errorMessage, SubmitRecord.Label... labels) {
-    SubmitRecord rec = new SubmitRecord();
-    rec.status = SubmitRecord.Status.valueOf(status);
-    rec.errorMessage = errorMessage;
-    if (labels.length > 0) {
-      rec.labels = ImmutableList.copyOf(labels);
-    }
-    return rec;
-  }
-
-  protected static SubmitRecord.Label submitLabel(
-      String name, String status, Account.Id appliedBy) {
-    SubmitRecord.Label label = new SubmitRecord.Label();
-    label.label = name;
-    label.status = SubmitRecord.Label.Status.valueOf(status);
-    label.appliedBy = appliedBy;
-    return label;
-  }
-
-  protected Comment newComment(
-      PatchSet.Id psId,
-      String filename,
-      String UUID,
-      CommentRange range,
-      int line,
-      IdentifiedUser commenter,
-      String parentUUID,
-      Timestamp t,
-      String message,
-      short side,
-      String commitSHA1,
-      boolean unresolved) {
-    Comment c =
-        new Comment(
-            new Comment.Key(UUID, filename, psId.get()),
-            commenter.getAccountId(),
-            t,
-            side,
-            message,
-            serverId,
-            unresolved);
-    c.lineNbr = line;
-    c.parentUuid = parentUUID;
-    c.revId = commitSHA1;
-    c.setRange(range);
-    return c;
-  }
-
-  protected static Timestamp truncate(Timestamp ts) {
-    return new Timestamp((ts.getTime() / 1000) * 1000);
-  }
-
-  protected static Timestamp after(Change c, long millis) {
-    return new Timestamp(c.getCreatedOn().getTime() + millis);
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeBundleTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeBundleTest.java
deleted file mode 100644
index 80a8ab9..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeBundleTest.java
+++ /dev/null
@@ -1,1972 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.notedb;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.common.TimeUtil.roundToSecond;
-import static com.google.gerrit.server.notedb.ChangeBundle.Source.NOTE_DB;
-import static com.google.gerrit.server.notedb.ChangeBundle.Source.REVIEW_DB;
-import static com.google.gerrit.server.notedb.ReviewerStateInternal.CC;
-import static com.google.gerrit.server.notedb.ReviewerStateInternal.REVIEWER;
-import static java.util.concurrent.TimeUnit.MILLISECONDS;
-import static java.util.concurrent.TimeUnit.SECONDS;
-
-import com.google.common.collect.HashBasedTable;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Table;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.LabelId;
-import com.google.gerrit.reviewdb.client.Patch;
-import com.google.gerrit.reviewdb.client.PatchLineComment;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RevId;
-import com.google.gerrit.server.ReviewerSet;
-import com.google.gerrit.server.notedb.rebuild.ChangeRebuilderImpl;
-import com.google.gerrit.testutil.GerritBaseTests;
-import com.google.gerrit.testutil.TestChanges;
-import com.google.gerrit.testutil.TestTimeUtil;
-import com.google.gwtorm.protobuf.CodecFactory;
-import com.google.gwtorm.protobuf.ProtobufCodec;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.TimeZone;
-import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-public class ChangeBundleTest extends GerritBaseTests {
-  private static final ProtobufCodec<Change> CHANGE_CODEC = CodecFactory.encoder(Change.class);
-  private static final ProtobufCodec<ChangeMessage> CHANGE_MESSAGE_CODEC =
-      CodecFactory.encoder(ChangeMessage.class);
-  private static final ProtobufCodec<PatchSet> PATCH_SET_CODEC =
-      CodecFactory.encoder(PatchSet.class);
-  private static final ProtobufCodec<PatchSetApproval> PATCH_SET_APPROVAL_CODEC =
-      CodecFactory.encoder(PatchSetApproval.class);
-  private static final ProtobufCodec<PatchLineComment> PATCH_LINE_COMMENT_CODEC =
-      CodecFactory.encoder(PatchLineComment.class);
-
-  private String systemTimeZoneProperty;
-  private TimeZone systemTimeZone;
-
-  private Project.NameKey project;
-  private Account.Id accountId;
-
-  @Before
-  public void setUp() {
-    String tz = "US/Eastern";
-    systemTimeZoneProperty = System.setProperty("user.timezone", tz);
-    systemTimeZone = TimeZone.getDefault();
-    TimeZone.setDefault(TimeZone.getTimeZone(tz));
-    long maxMs = ChangeRebuilderImpl.MAX_WINDOW_MS;
-    assertThat(maxMs).isGreaterThan(1000L);
-    TestTimeUtil.resetWithClockStep(maxMs * 2, MILLISECONDS);
-    project = new Project.NameKey("project");
-    accountId = new Account.Id(100);
-  }
-
-  @After
-  public void tearDown() {
-    TestTimeUtil.useSystemTime();
-    System.setProperty("user.timezone", systemTimeZoneProperty);
-    TimeZone.setDefault(systemTimeZone);
-  }
-
-  private void superWindowResolution() {
-    TestTimeUtil.setClockStep(ChangeRebuilderImpl.MAX_WINDOW_MS * 2, MILLISECONDS);
-    TimeUtil.nowTs();
-  }
-
-  private void subWindowResolution() {
-    TestTimeUtil.setClockStep(1, SECONDS);
-    TimeUtil.nowTs();
-  }
-
-  @Test
-  public void diffChangesDifferentIds() throws Exception {
-    Change c1 = TestChanges.newChange(project, accountId);
-    int id1 = c1.getId().get();
-    Change c2 = TestChanges.newChange(project, accountId);
-    int id2 = c2.getId().get();
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-
-    assertDiffs(
-        b1,
-        b2,
-        "changeId differs for Changes: {" + id1 + "} != {" + id2 + "}",
-        "createdOn differs for Changes: {2009-09-30 17:00:00.0} != {2009-09-30 17:00:06.0}",
-        "effective last updated time differs for Changes:"
-            + " {2009-09-30 17:00:00.0} != {2009-09-30 17:00:06.0}");
-  }
-
-  @Test
-  public void diffChangesSameId() throws Exception {
-    Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100));
-    Change c2 = clone(c1);
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-
-    assertNoDiffs(b1, b2);
-
-    c2.setTopic("topic");
-    assertDiffs(b1, b2, "topic differs for Change.Id " + c1.getId() + ": {null} != {topic}");
-  }
-
-  @Test
-  public void diffChangesMixedSourcesAllowsSlop() throws Exception {
-    subWindowResolution();
-    Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100));
-    Change c2 = clone(c1);
-    c2.setCreatedOn(TimeUtil.nowTs());
-    c2.setLastUpdatedOn(TimeUtil.nowTs());
-
-    // Both are ReviewDb, exact timestamp match is required.
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    assertDiffs(
-        b1,
-        b2,
-        "createdOn differs for Change.Id "
-            + c1.getId()
-            + ":"
-            + " {2009-09-30 17:00:01.0} != {2009-09-30 17:00:02.0}",
-        "effective last updated time differs for Change.Id "
-            + c1.getId()
-            + ":"
-            + " {2009-09-30 17:00:01.0} != {2009-09-30 17:00:03.0}");
-
-    // One NoteDb, slop is allowed.
-    b1 =
-        new ChangeBundle(
-            c1, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
-    b2 =
-        new ChangeBundle(
-            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    assertNoDiffs(b1, b2);
-    assertNoDiffs(b2, b1);
-
-    // But not too much slop.
-    superWindowResolution();
-    Change c3 = clone(c1);
-    c3.setLastUpdatedOn(TimeUtil.nowTs());
-    b1 =
-        new ChangeBundle(
-            c1, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
-    ChangeBundle b3 =
-        new ChangeBundle(
-            c3, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    String msg =
-        "effective last updated time differs for Change.Id "
-            + c1.getId()
-            + " in NoteDb vs. ReviewDb:"
-            + " {2009-09-30 17:00:01.0} != {2009-09-30 17:00:10.0}";
-    assertDiffs(b1, b3, msg);
-    assertDiffs(b3, b1, msg);
-  }
-
-  @Test
-  public void diffChangesIgnoresOriginalSubjectInReviewDb() throws Exception {
-    Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100));
-    c1.setCurrentPatchSet(c1.currentPatchSetId(), "Subject", "Original A");
-    Change c2 = clone(c1);
-    c2.setCurrentPatchSet(c2.currentPatchSetId(), c1.getSubject(), "Original B");
-
-    // Both ReviewDb, exact match required.
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    assertDiffs(
-        b1,
-        b2,
-        "originalSubject differs for Change.Id "
-            + c1.getId()
-            + ":"
-            + " {Original A} != {Original B}");
-
-    // Both NoteDb, exact match required.
-    b1 =
-        new ChangeBundle(
-            c1, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
-    b2 =
-        new ChangeBundle(
-            c2, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
-    assertDiffs(
-        b1,
-        b2,
-        "originalSubject differs for Change.Id "
-            + c1.getId()
-            + ":"
-            + " {Original A} != {Original B}");
-
-    // One ReviewDb, one NoteDb, original subject is ignored.
-    b1 =
-        new ChangeBundle(
-            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    b2 =
-        new ChangeBundle(
-            c2, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
-    assertNoDiffs(b1, b2);
-    assertNoDiffs(b2, b1);
-  }
-
-  @Test
-  public void diffChangesSanitizesSubjectsBeforeComparison() throws Exception {
-    Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100));
-    c1.setCurrentPatchSet(c1.currentPatchSetId(), "Subject\r\rbody", "Original");
-    Change c2 = clone(c1);
-    c2.setCurrentPatchSet(c2.currentPatchSetId(), "Subject  body", "Original");
-
-    // Both ReviewDb, exact match required
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    assertDiffs(
-        b1,
-        b2,
-        "subject differs for Change.Id "
-            + c1.getId()
-            + ":"
-            + " {Subject\r\rbody} != {Subject  body}");
-
-    // Both NoteDb, exact match required (although it should be impossible to
-    // create a NoteDb change with '\r' in the subject).
-    b1 =
-        new ChangeBundle(
-            c1, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
-    b2 =
-        new ChangeBundle(
-            c2, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
-    assertDiffs(
-        b1,
-        b2,
-        "subject differs for Change.Id "
-            + c1.getId()
-            + ":"
-            + " {Subject\r\rbody} != {Subject  body}");
-
-    // One ReviewDb, one NoteDb, '\r' is normalized to ' '.
-    b1 =
-        new ChangeBundle(
-            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    b2 =
-        new ChangeBundle(
-            c2, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
-    assertNoDiffs(b1, b2);
-    assertNoDiffs(b2, b1);
-  }
-
-  @Test
-  public void diffChangesConsidersEmptyReviewDbTopicEquivalentToNullInNoteDb() throws Exception {
-    Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100));
-    c1.setTopic("");
-    Change c2 = clone(c1);
-    c2.setTopic(null);
-
-    // Both ReviewDb, exact match required.
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    assertDiffs(b1, b2, "topic differs for Change.Id " + c1.getId() + ": {} != {null}");
-
-    // Topic ignored if ReviewDb is empty and NoteDb is null.
-    b1 =
-        new ChangeBundle(
-            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    b2 =
-        new ChangeBundle(
-            c2, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
-    assertNoDiffs(b1, b2);
-
-    // Exact match still required if NoteDb has empty value (not realistic).
-    b1 =
-        new ChangeBundle(
-            c1, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
-    b2 =
-        new ChangeBundle(
-            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    assertDiffs(b1, b2, "topic differs for Change.Id " + c1.getId() + ": {} != {null}");
-
-    // Null is not equal to a non-empty string.
-    Change c3 = clone(c1);
-    c3.setTopic("topic");
-    b1 =
-        new ChangeBundle(
-            c3, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    b2 =
-        new ChangeBundle(
-            c2, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
-    assertDiffs(b1, b2, "topic differs for Change.Id " + c1.getId() + ": {topic} != {null}");
-
-    // Null is equal to a string that is all whitespace.
-    Change c4 = clone(c1);
-    c4.setTopic("  ");
-    b1 =
-        new ChangeBundle(
-            c4, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    b2 =
-        new ChangeBundle(
-            c2, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
-    assertNoDiffs(b1, b2);
-    assertNoDiffs(b2, b1);
-  }
-
-  @Test
-  public void diffChangesIgnoresLeadingAndTrailingWhitespaceInReviewDbTopics() throws Exception {
-    Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100));
-    c1.setTopic(" abc ");
-    Change c2 = clone(c1);
-    c2.setTopic("abc");
-
-    // Both ReviewDb, exact match required.
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    assertDiffs(b1, b2, "topic differs for Change.Id " + c1.getId() + ": { abc } != {abc}");
-
-    // Leading whitespace in ReviewDb topic is ignored.
-    b1 =
-        new ChangeBundle(
-            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    b2 =
-        new ChangeBundle(
-            c2, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
-    assertNoDiffs(b1, b2);
-    assertNoDiffs(b2, b1);
-
-    // Must match except for the leading/trailing whitespace.
-    Change c3 = clone(c1);
-    c3.setTopic("cba");
-    b1 =
-        new ChangeBundle(
-            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    b2 =
-        new ChangeBundle(
-            c3, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
-    assertDiffs(b1, b2, "topic differs for Change.Id " + c1.getId() + ": { abc } != {cba}");
-  }
-
-  @Test
-  public void diffChangesTakesMaxEntityTimestampFromReviewDb() throws Exception {
-    Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100));
-    PatchSet ps = new PatchSet(c1.currentPatchSetId());
-    ps.setRevision(new RevId("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
-    ps.setUploader(accountId);
-    ps.setCreatedOn(TimeUtil.nowTs());
-    PatchSetApproval a =
-        new PatchSetApproval(
-            new PatchSetApproval.Key(c1.currentPatchSetId(), accountId, new LabelId("Code-Review")),
-            (short) 1,
-            TimeUtil.nowTs());
-
-    Change c2 = clone(c1);
-    c2.setLastUpdatedOn(a.getGranted());
-
-    // Both ReviewDb, exact match required.
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c1, messages(), patchSets(ps), approvals(a), comments(), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c2, messages(), patchSets(ps), approvals(a), comments(), reviewers(), REVIEW_DB);
-    assertDiffs(
-        b1,
-        b2,
-        "effective last updated time differs for Change.Id "
-            + c1.getId()
-            + ":"
-            + " {2009-09-30 17:00:00.0} != {2009-09-30 17:00:12.0}");
-
-    // NoteDb allows latest timestamp from all entities in bundle.
-    b2 =
-        new ChangeBundle(
-            c2, messages(), patchSets(ps), approvals(a), comments(), reviewers(), NOTE_DB);
-    assertNoDiffs(b1, b2);
-  }
-
-  @Test
-  public void diffChangesIgnoresChangeTimestampIfAnyOtherEntitiesExist() {
-    Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100));
-    PatchSet ps = new PatchSet(c1.currentPatchSetId());
-    ps.setRevision(new RevId("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
-    ps.setUploader(accountId);
-    ps.setCreatedOn(TimeUtil.nowTs());
-    PatchSetApproval a =
-        new PatchSetApproval(
-            new PatchSetApproval.Key(c1.currentPatchSetId(), accountId, new LabelId("Code-Review")),
-            (short) 1,
-            TimeUtil.nowTs());
-    c1.setLastUpdatedOn(a.getGranted());
-
-    Change c2 = clone(c1);
-    c2.setLastUpdatedOn(TimeUtil.nowTs());
-
-    // ReviewDb has later lastUpdatedOn timestamp than NoteDb, allowed since
-    // NoteDb matches the latest timestamp of a non-Change entity.
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c2, messages(), patchSets(ps), approvals(a), comments(), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c1, messages(), patchSets(ps), approvals(a), comments(), reviewers(), NOTE_DB);
-    assertThat(b1.getChange().getLastUpdatedOn()).isGreaterThan(b2.getChange().getLastUpdatedOn());
-    assertNoDiffs(b1, b2);
-
-    // Timestamps must actually match if Change is the only entity.
-    b1 =
-        new ChangeBundle(
-            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    b2 =
-        new ChangeBundle(
-            c1, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
-    assertDiffs(
-        b1,
-        b2,
-        "effective last updated time differs for Change.Id "
-            + c1.getId()
-            + " in NoteDb vs. ReviewDb:"
-            + " {2009-09-30 17:00:12.0} != {2009-09-30 17:00:18.0}");
-  }
-
-  @Test
-  public void diffChangesAllowsReviewDbSubjectToBePrefixOfNoteDbSubject() throws Exception {
-    Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100));
-    Change c2 = clone(c1);
-    c2.setCurrentPatchSet(
-        c1.currentPatchSetId(), c1.getSubject().substring(0, 10), c1.getOriginalSubject());
-    assertThat(c2.getSubject()).isNotEqualTo(c1.getSubject());
-
-    // Both ReviewDb, exact match required.
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    assertDiffs(
-        b1,
-        b2,
-        "subject differs for Change.Id " + c1.getId() + ": {Change subject} != {Change sub}");
-
-    // ReviewDb has shorter subject, allowed.
-    b1 =
-        new ChangeBundle(
-            c1, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
-    b2 =
-        new ChangeBundle(
-            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    assertNoDiffs(b1, b2);
-
-    // NoteDb has shorter subject, not allowed.
-    b1 =
-        new ChangeBundle(
-            c1, messages(), latest(c1), approvals(), comments(), reviewers(), REVIEW_DB);
-    b2 =
-        new ChangeBundle(c2, messages(), latest(c2), approvals(), comments(), reviewers(), NOTE_DB);
-    assertDiffs(
-        b1,
-        b2,
-        "subject differs for Change.Id " + c1.getId() + ": {Change subject} != {Change sub}");
-  }
-
-  @Test
-  public void diffChangesTrimsLeadingSpacesFromReviewDbComparingToNoteDb() throws Exception {
-    Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100));
-    Change c2 = clone(c1);
-    c2.setCurrentPatchSet(c1.currentPatchSetId(), "   " + c1.getSubject(), c1.getOriginalSubject());
-
-    // Both ReviewDb, exact match required.
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    assertDiffs(
-        b1,
-        b2,
-        "subject differs for Change.Id "
-            + c1.getId()
-            + ":"
-            + " {Change subject} != {   Change subject}");
-
-    // ReviewDb is missing leading spaces, allowed.
-    b1 =
-        new ChangeBundle(
-            c1, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
-    b2 =
-        new ChangeBundle(
-            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    assertNoDiffs(b1, b2);
-    assertNoDiffs(b2, b1);
-  }
-
-  @Test
-  public void diffChangesDoesntTrimLeadingNonSpaceWhitespaceFromSubject() throws Exception {
-    Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100));
-    Change c2 = clone(c1);
-    c2.setCurrentPatchSet(c1.currentPatchSetId(), "\t" + c1.getSubject(), c1.getOriginalSubject());
-
-    // Both ReviewDb.
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    assertDiffs(
-        b1,
-        b2,
-        "subject differs for Change.Id "
-            + c1.getId()
-            + ":"
-            + " {Change subject} != {\tChange subject}");
-
-    // One NoteDb.
-    b1 =
-        new ChangeBundle(c1, messages(), latest(c1), approvals(), comments(), reviewers(), NOTE_DB);
-    b2 =
-        new ChangeBundle(
-            c2, messages(), latest(c2), approvals(), comments(), reviewers(), REVIEW_DB);
-    assertDiffs(
-        b1,
-        b2,
-        "subject differs for Change.Id "
-            + c1.getId()
-            + ":"
-            + " {Change subject} != {\tChange subject}");
-    assertDiffs(
-        b2,
-        b1,
-        "subject differs for Change.Id "
-            + c1.getId()
-            + ":"
-            + " {\tChange subject} != {Change subject}");
-  }
-
-  @Test
-  public void diffChangesHandlesBuggyJGitSubjectExtraction() throws Exception {
-    Change c1 = TestChanges.newChange(project, accountId);
-    String buggySubject = "Subject\r \r Rest of message.";
-    c1.setCurrentPatchSet(c1.currentPatchSetId(), buggySubject, buggySubject);
-    Change c2 = clone(c1);
-    c2.setCurrentPatchSet(c2.currentPatchSetId(), "Subject", "Subject");
-
-    // Both ReviewDb.
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    assertDiffs(
-        b1,
-        b2,
-        "originalSubject differs for Change.Id "
-            + c1.getId()
-            + ":"
-            + " {Subject\r \r Rest of message.} != {Subject}",
-        "subject differs for Change.Id "
-            + c1.getId()
-            + ":"
-            + " {Subject\r \r Rest of message.} != {Subject}");
-
-    // NoteDb has correct subject without "\r ".
-    b1 =
-        new ChangeBundle(
-            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    b2 =
-        new ChangeBundle(
-            c2, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
-    assertNoDiffs(b1, b2);
-    assertNoDiffs(b2, b1);
-  }
-
-  @Test
-  public void diffChangesIgnoresInvalidCurrentPatchSetIdInReviewDb() throws Exception {
-    Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100));
-    Change c2 = clone(c1);
-    c2.setCurrentPatchSet(
-        new PatchSet.Id(c2.getId(), 0), "Unrelated subject", c2.getOriginalSubject());
-
-    // Both ReviewDb.
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    assertDiffs(
-        b1,
-        b2,
-        "currentPatchSetId differs for Change.Id " + c1.getId() + ": {1} != {0}",
-        "subject differs for Change.Id "
-            + c1.getId()
-            + ":"
-            + " {Change subject} != {Unrelated subject}");
-
-    // One NoteDb.
-    //
-    // This is based on a real corrupt change where all patch sets were deleted
-    // but the Change entity stuck around, resulting in a currentPatchSetId of 0
-    // after converting to NoteDb.
-    b1 =
-        new ChangeBundle(
-            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    b2 =
-        new ChangeBundle(
-            c2, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
-    assertNoDiffs(b1, b2);
-    assertNoDiffs(b2, b1);
-  }
-
-  @Test
-  public void diffChangesAllowsCreatedToMatchLastUpdated() throws Exception {
-    Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100));
-    c1.setCreatedOn(TimeUtil.nowTs());
-    assertThat(c1.getCreatedOn()).isGreaterThan(c1.getLastUpdatedOn());
-    Change c2 = clone(c1);
-    c2.setCreatedOn(c2.getLastUpdatedOn());
-
-    // Both ReviewDb.
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    assertDiffs(
-        b1,
-        b2,
-        "createdOn differs for Change.Id "
-            + c1.getId()
-            + ": {2009-09-30 17:00:06.0} != {2009-09-30 17:00:00.0}");
-
-    // One NoteDb.
-    b1 =
-        new ChangeBundle(
-            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
-    b2 =
-        new ChangeBundle(
-            c2, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
-    assertNoDiffs(b1, b2);
-    assertNoDiffs(b2, b1);
-  }
-
-  @Test
-  public void diffChangeMessageKeySets() throws Exception {
-    Change c = TestChanges.newChange(project, accountId);
-    int id = c.getId().get();
-    ChangeMessage cm1 =
-        new ChangeMessage(
-            new ChangeMessage.Key(c.getId(), "uuid1"),
-            accountId,
-            TimeUtil.nowTs(),
-            c.currentPatchSetId());
-    ChangeMessage cm2 =
-        new ChangeMessage(
-            new ChangeMessage.Key(c.getId(), "uuid2"),
-            accountId,
-            TimeUtil.nowTs(),
-            c.currentPatchSetId());
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c, messages(cm1), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c, messages(cm2), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
-
-    assertDiffs(
-        b1,
-        b2,
-        "ChangeMessage.Key sets differ:"
-            + " ["
-            + id
-            + ",uuid1] only in A; ["
-            + id
-            + ",uuid2] only in B");
-  }
-
-  @Test
-  public void diffChangeMessages() throws Exception {
-    Change c = TestChanges.newChange(project, accountId);
-    ChangeMessage cm1 =
-        new ChangeMessage(
-            new ChangeMessage.Key(c.getId(), "uuid"),
-            accountId,
-            TimeUtil.nowTs(),
-            c.currentPatchSetId());
-    cm1.setMessage("message 1");
-    ChangeMessage cm2 = clone(cm1);
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c, messages(cm1), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c, messages(cm2), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
-
-    assertNoDiffs(b1, b2);
-
-    cm2.setMessage("message 2");
-    assertDiffs(
-        b1,
-        b2,
-        "message differs for ChangeMessage.Key "
-            + c.getId()
-            + ",uuid:"
-            + " {message 1} != {message 2}");
-  }
-
-  @Test
-  public void diffChangeMessagesIgnoresUuids() throws Exception {
-    Change c = TestChanges.newChange(project, accountId);
-    int id = c.getId().get();
-    ChangeMessage cm1 =
-        new ChangeMessage(
-            new ChangeMessage.Key(c.getId(), "uuid1"),
-            accountId,
-            TimeUtil.nowTs(),
-            c.currentPatchSetId());
-    cm1.setMessage("message 1");
-    ChangeMessage cm2 = clone(cm1);
-    cm2.getKey().set("uuid2");
-
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c, messages(cm1), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c, messages(cm2), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
-    // Both are ReviewDb, exact UUID match is required.
-    assertDiffs(
-        b1,
-        b2,
-        "ChangeMessage.Key sets differ:"
-            + " ["
-            + id
-            + ",uuid1] only in A; ["
-            + id
-            + ",uuid2] only in B");
-
-    // One NoteDb, UUIDs are ignored.
-    b1 =
-        new ChangeBundle(
-            c, messages(cm1), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
-    b2 =
-        new ChangeBundle(
-            c, messages(cm2), latest(c), approvals(), comments(), reviewers(), NOTE_DB);
-    assertNoDiffs(b1, b2);
-  }
-
-  @Test
-  public void diffChangeMessagesWithDifferentCounts() throws Exception {
-    Change c = TestChanges.newChange(project, accountId);
-    int id = c.getId().get();
-    ChangeMessage cm1 =
-        new ChangeMessage(
-            new ChangeMessage.Key(c.getId(), "uuid1"),
-            accountId,
-            TimeUtil.nowTs(),
-            c.currentPatchSetId());
-    cm1.setMessage("message 1");
-    ChangeMessage cm2 =
-        new ChangeMessage(
-            new ChangeMessage.Key(c.getId(), "uuid2"),
-            accountId,
-            TimeUtil.nowTs(),
-            c.currentPatchSetId());
-    cm1.setMessage("message 2");
-
-    // Both ReviewDb: Uses same keySet diff as other types.
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c, messages(cm1, cm2), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c, messages(cm1), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
-    assertDiffs(
-        b1, b2, "ChangeMessage.Key sets differ: [" + id + ",uuid2] only in A; [] only in B");
-
-    // One NoteDb: UUIDs in keys can't be used for comparison, just diff counts.
-    b1 =
-        new ChangeBundle(
-            c, messages(cm1, cm2), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
-    b2 =
-        new ChangeBundle(
-            c, messages(cm1), latest(c), approvals(), comments(), reviewers(), NOTE_DB);
-    assertDiffs(b1, b2, "ChangeMessages differ for Change.Id " + id + "\nOnly in A:\n  " + cm2);
-    assertDiffs(b2, b1, "ChangeMessages differ for Change.Id " + id + "\nOnly in B:\n  " + cm2);
-  }
-
-  @Test
-  public void diffChangeMessagesMixedSourcesWithDifferences() throws Exception {
-    Change c = TestChanges.newChange(project, accountId);
-    int id = c.getId().get();
-    ChangeMessage cm1 =
-        new ChangeMessage(
-            new ChangeMessage.Key(c.getId(), "uuid1"),
-            accountId,
-            TimeUtil.nowTs(),
-            c.currentPatchSetId());
-    cm1.setMessage("message 1");
-    ChangeMessage cm2 = clone(cm1);
-    cm2.setMessage("message 2");
-    ChangeMessage cm3 = clone(cm1);
-    cm3.getKey().set("uuid2"); // Differs only in UUID.
-
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c, messages(cm1, cm3), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c, messages(cm2, cm3), latest(c), approvals(), comments(), reviewers(), NOTE_DB);
-    // Implementation happens to pair up cm1 in b1 with cm3 in b2 because it
-    // depends on iteration order and doesn't care about UUIDs. The important
-    // thing is that there's some diff.
-    assertDiffs(
-        b1,
-        b2,
-        "ChangeMessages differ for Change.Id "
-            + id
-            + "\n"
-            + "Only in A:\n  "
-            + cm3
-            + "\n"
-            + "Only in B:\n  "
-            + cm2);
-    assertDiffs(
-        b2,
-        b1,
-        "ChangeMessages differ for Change.Id "
-            + id
-            + "\n"
-            + "Only in A:\n  "
-            + cm2
-            + "\n"
-            + "Only in B:\n  "
-            + cm3);
-  }
-
-  @Test
-  public void diffChangeMessagesMixedSourcesAllowsSlop() throws Exception {
-    subWindowResolution();
-    Change c = TestChanges.newChange(project, accountId);
-    ChangeMessage cm1 =
-        new ChangeMessage(
-            new ChangeMessage.Key(c.getId(), "uuid1"),
-            accountId,
-            TimeUtil.nowTs(),
-            c.currentPatchSetId());
-    ChangeMessage cm2 = clone(cm1);
-    cm2.setWrittenOn(TimeUtil.nowTs());
-
-    // Both are ReviewDb, exact timestamp match is required.
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c, messages(cm1), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c, messages(cm2), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
-    assertDiffs(
-        b1,
-        b2,
-        "writtenOn differs for ChangeMessage.Key "
-            + c.getId()
-            + ",uuid1:"
-            + " {2009-09-30 17:00:02.0} != {2009-09-30 17:00:03.0}");
-
-    // One NoteDb, slop is allowed.
-    b1 =
-        new ChangeBundle(
-            c, messages(cm1), latest(c), approvals(), comments(), reviewers(), NOTE_DB);
-    b2 =
-        new ChangeBundle(
-            c, messages(cm2), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
-    assertNoDiffs(b1, b2);
-    assertNoDiffs(b2, b1);
-
-    // But not too much slop.
-    superWindowResolution();
-    ChangeMessage cm3 = clone(cm1);
-    cm3.setWrittenOn(TimeUtil.nowTs());
-    b1 =
-        new ChangeBundle(
-            c, messages(cm1), latest(c), approvals(), comments(), reviewers(), NOTE_DB);
-    ChangeBundle b3 =
-        new ChangeBundle(
-            c, messages(cm3), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
-    int id = c.getId().get();
-    assertDiffs(
-        b1,
-        b3,
-        "ChangeMessages differ for Change.Id "
-            + id
-            + "\n"
-            + "Only in A:\n  "
-            + cm1
-            + "\n"
-            + "Only in B:\n  "
-            + cm3);
-    assertDiffs(
-        b3,
-        b1,
-        "ChangeMessages differ for Change.Id "
-            + id
-            + "\n"
-            + "Only in A:\n  "
-            + cm3
-            + "\n"
-            + "Only in B:\n  "
-            + cm1);
-  }
-
-  @Test
-  public void diffChangeMessagesAllowsNullPatchSetIdFromReviewDb() throws Exception {
-    Change c = TestChanges.newChange(project, accountId);
-    int id = c.getId().get();
-    ChangeMessage cm1 =
-        new ChangeMessage(
-            new ChangeMessage.Key(c.getId(), "uuid"),
-            accountId,
-            TimeUtil.nowTs(),
-            c.currentPatchSetId());
-    cm1.setMessage("message 1");
-    ChangeMessage cm2 = clone(cm1);
-    cm2.setPatchSetId(null);
-
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c, messages(cm1), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c, messages(cm2), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
-
-    // Both are ReviewDb, exact patch set ID match is required.
-    assertDiffs(
-        b1,
-        b2,
-        "patchset differs for ChangeMessage.Key "
-            + c.getId()
-            + ",uuid:"
-            + " {"
-            + id
-            + ",1} != {null}");
-
-    // Null patch set ID on ReviewDb is ignored.
-    b1 =
-        new ChangeBundle(
-            c, messages(cm1), latest(c), approvals(), comments(), reviewers(), NOTE_DB);
-    b2 =
-        new ChangeBundle(
-            c, messages(cm2), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
-    assertNoDiffs(b1, b2);
-
-    // Null patch set ID on NoteDb is not ignored (but is not realistic).
-    b1 =
-        new ChangeBundle(
-            c, messages(cm1), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
-    b2 =
-        new ChangeBundle(
-            c, messages(cm2), latest(c), approvals(), comments(), reviewers(), NOTE_DB);
-    assertDiffs(
-        b1,
-        b2,
-        "ChangeMessages differ for Change.Id "
-            + id
-            + "\n"
-            + "Only in A:\n  "
-            + cm1
-            + "\n"
-            + "Only in B:\n  "
-            + cm2);
-    assertDiffs(
-        b2,
-        b1,
-        "ChangeMessages differ for Change.Id "
-            + id
-            + "\n"
-            + "Only in A:\n  "
-            + cm2
-            + "\n"
-            + "Only in B:\n  "
-            + cm1);
-  }
-
-  @Test
-  public void diffPatchSetIdSets() throws Exception {
-    Change c = TestChanges.newChange(project, accountId);
-    TestChanges.incrementPatchSet(c);
-
-    PatchSet ps1 = new PatchSet(new PatchSet.Id(c.getId(), 1));
-    ps1.setRevision(new RevId("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
-    ps1.setUploader(accountId);
-    ps1.setCreatedOn(TimeUtil.nowTs());
-    PatchSet ps2 = new PatchSet(new PatchSet.Id(c.getId(), 2));
-    ps2.setRevision(new RevId("badc0feebadc0feebadc0feebadc0feebadc0fee"));
-    ps2.setUploader(accountId);
-    ps2.setCreatedOn(TimeUtil.nowTs());
-
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c, messages(), patchSets(ps2), approvals(), comments(), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c, messages(), patchSets(ps1, ps2), approvals(), comments(), reviewers(), REVIEW_DB);
-
-    assertDiffs(b1, b2, "PatchSet.Id sets differ: [] only in A; [" + c.getId() + ",1] only in B");
-  }
-
-  @Test
-  public void diffPatchSets() throws Exception {
-    Change c = TestChanges.newChange(project, accountId);
-    PatchSet ps1 = new PatchSet(c.currentPatchSetId());
-    ps1.setRevision(new RevId("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
-    ps1.setUploader(accountId);
-    ps1.setCreatedOn(TimeUtil.nowTs());
-    PatchSet ps2 = clone(ps1);
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c, messages(), patchSets(ps1), approvals(), comments(), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c, messages(), patchSets(ps2), approvals(), comments(), reviewers(), REVIEW_DB);
-
-    assertNoDiffs(b1, b2);
-
-    ps2.setRevision(new RevId("badc0feebadc0feebadc0feebadc0feebadc0fee"));
-    assertDiffs(
-        b1,
-        b2,
-        "revision differs for PatchSet.Id "
-            + c.getId()
-            + ",1:"
-            + " {RevId{deadbeefdeadbeefdeadbeefdeadbeefdeadbeef}}"
-            + " != {RevId{badc0feebadc0feebadc0feebadc0feebadc0fee}}");
-  }
-
-  @Test
-  public void diffPatchSetsMixedSourcesAllowsSlop() throws Exception {
-    subWindowResolution();
-    Change c = TestChanges.newChange(project, accountId);
-    PatchSet ps1 = new PatchSet(c.currentPatchSetId());
-    ps1.setRevision(new RevId("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
-    ps1.setUploader(accountId);
-    ps1.setCreatedOn(roundToSecond(TimeUtil.nowTs()));
-    PatchSet ps2 = clone(ps1);
-    ps2.setCreatedOn(TimeUtil.nowTs());
-
-    // Both are ReviewDb, exact timestamp match is required.
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c, messages(), patchSets(ps1), approvals(), comments(), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c, messages(), patchSets(ps2), approvals(), comments(), reviewers(), REVIEW_DB);
-    assertDiffs(
-        b1,
-        b2,
-        "createdOn differs for PatchSet.Id "
-            + c.getId()
-            + ",1:"
-            + " {2009-09-30 17:00:02.0} != {2009-09-30 17:00:03.0}");
-
-    // One NoteDb, slop is allowed.
-    b1 =
-        new ChangeBundle(
-            c, messages(), patchSets(ps1), approvals(), comments(), reviewers(), NOTE_DB);
-    b2 =
-        new ChangeBundle(
-            c, messages(), patchSets(ps2), approvals(), comments(), reviewers(), REVIEW_DB);
-    assertNoDiffs(b1, b2);
-
-    // But not too much slop.
-    superWindowResolution();
-    PatchSet ps3 = clone(ps1);
-    ps3.setCreatedOn(TimeUtil.nowTs());
-    b1 =
-        new ChangeBundle(
-            c, messages(), patchSets(ps1), approvals(), comments(), reviewers(), NOTE_DB);
-    ChangeBundle b3 =
-        new ChangeBundle(
-            c, messages(), patchSets(ps3), approvals(), comments(), reviewers(), REVIEW_DB);
-    String msg =
-        "createdOn differs for PatchSet.Id "
-            + c.getId()
-            + ",1 in NoteDb vs. ReviewDb:"
-            + " {2009-09-30 17:00:02.0} != {2009-09-30 17:00:10.0}";
-    assertDiffs(b1, b3, msg);
-    assertDiffs(b3, b1, msg);
-  }
-
-  @Test
-  public void diffPatchSetsIgnoresTrailingNewlinesInPushCertificate() throws Exception {
-    subWindowResolution();
-    Change c = TestChanges.newChange(project, accountId);
-    PatchSet ps1 = new PatchSet(c.currentPatchSetId());
-    ps1.setRevision(new RevId("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
-    ps1.setUploader(accountId);
-    ps1.setCreatedOn(roundToSecond(TimeUtil.nowTs()));
-    ps1.setPushCertificate("some cert");
-    PatchSet ps2 = clone(ps1);
-    ps2.setPushCertificate(ps2.getPushCertificate() + "\n\n");
-
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c, messages(), patchSets(ps1), approvals(), comments(), reviewers(), NOTE_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c, messages(), patchSets(ps2), approvals(), comments(), reviewers(), REVIEW_DB);
-    assertNoDiffs(b1, b2);
-    assertNoDiffs(b2, b1);
-
-    b1 =
-        new ChangeBundle(
-            c, messages(), patchSets(ps1), approvals(), comments(), reviewers(), REVIEW_DB);
-    b2 =
-        new ChangeBundle(
-            c, messages(), patchSets(ps2), approvals(), comments(), reviewers(), NOTE_DB);
-    assertNoDiffs(b1, b2);
-    assertNoDiffs(b2, b1);
-  }
-
-  @Test
-  public void diffPatchSetsGreaterThanCurrent() throws Exception {
-    Change c = TestChanges.newChange(project, accountId);
-
-    PatchSet ps1 = new PatchSet(new PatchSet.Id(c.getId(), 1));
-    ps1.setRevision(new RevId("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
-    ps1.setUploader(accountId);
-    ps1.setCreatedOn(TimeUtil.nowTs());
-    PatchSet ps2 = new PatchSet(new PatchSet.Id(c.getId(), 2));
-    ps2.setRevision(new RevId("badc0feebadc0feebadc0feebadc0feebadc0fee"));
-    ps2.setUploader(accountId);
-    ps2.setCreatedOn(TimeUtil.nowTs());
-    assertThat(ps2.getId().get()).isGreaterThan(c.currentPatchSetId().get());
-
-    ChangeMessage cm1 =
-        new ChangeMessage(
-            new ChangeMessage.Key(c.getId(), "uuid1"),
-            accountId,
-            TimeUtil.nowTs(),
-            c.currentPatchSetId());
-    ChangeMessage cm2 =
-        new ChangeMessage(
-            new ChangeMessage.Key(c.getId(), "uuid2"),
-            accountId,
-            TimeUtil.nowTs(),
-            c.currentPatchSetId());
-
-    PatchSetApproval a1 =
-        new PatchSetApproval(
-            new PatchSetApproval.Key(ps1.getId(), accountId, new LabelId("Code-Review")),
-            (short) 1,
-            TimeUtil.nowTs());
-    PatchSetApproval a2 =
-        new PatchSetApproval(
-            new PatchSetApproval.Key(ps2.getId(), accountId, new LabelId("Code-Review")),
-            (short) 1,
-            TimeUtil.nowTs());
-
-    // Both ReviewDb.
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c, messages(cm1), patchSets(ps1), approvals(a1), comments(), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c,
-            messages(cm1, cm2),
-            patchSets(ps1, ps2),
-            approvals(a1, a2),
-            comments(),
-            reviewers(),
-            REVIEW_DB);
-    assertDiffs(
-        b1,
-        b2,
-        "ChangeMessage.Key sets differ: [] only in A; [" + cm2.getKey() + "] only in B",
-        "PatchSet.Id sets differ: [] only in A; [" + ps2.getId() + "] only in B",
-        "PatchSetApproval.Key sets differ: [] only in A; [" + a2.getKey() + "] only in B");
-
-    // One NoteDb.
-    b1 =
-        new ChangeBundle(
-            c, messages(cm1), patchSets(ps1), approvals(a1), comments(), reviewers(), NOTE_DB);
-    b2 =
-        new ChangeBundle(
-            c,
-            messages(cm1, cm2),
-            patchSets(ps1, ps2),
-            approvals(a1, a2),
-            comments(),
-            reviewers(),
-            REVIEW_DB);
-    assertDiffs(
-        b1,
-        b2,
-        "ChangeMessages differ for Change.Id " + c.getId() + "\nOnly in B:\n  " + cm2,
-        "PatchSet.Id sets differ: [] only in A; [" + ps2.getId() + "] only in B",
-        "PatchSetApproval.Key sets differ: [] only in A; [" + a2.getKey() + "] only in B");
-
-    // Both NoteDb.
-    b1 =
-        new ChangeBundle(
-            c, messages(cm1), patchSets(ps1), approvals(a1), comments(), reviewers(), NOTE_DB);
-    b2 =
-        new ChangeBundle(
-            c,
-            messages(cm1, cm2),
-            patchSets(ps1, ps2),
-            approvals(a1, a2),
-            comments(),
-            reviewers(),
-            NOTE_DB);
-    assertDiffs(
-        b1,
-        b2,
-        "ChangeMessages differ for Change.Id " + c.getId() + "\nOnly in B:\n  " + cm2,
-        "PatchSet.Id sets differ: [] only in A; [" + ps2.getId() + "] only in B",
-        "PatchSetApproval.Key sets differ: [] only in A; [" + a2.getKey() + "] only in B");
-  }
-
-  @Test
-  public void diffPatchSetsIgnoresLeadingAndTrailingWhitespaceInReviewDbDescriptions()
-      throws Exception {
-    Change c = TestChanges.newChange(project, accountId);
-
-    PatchSet ps1 = new PatchSet(new PatchSet.Id(c.getId(), 1));
-    ps1.setRevision(new RevId("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
-    ps1.setUploader(accountId);
-    ps1.setCreatedOn(TimeUtil.nowTs());
-    ps1.setDescription(" abc ");
-    PatchSet ps2 = clone(ps1);
-    ps2.setDescription("abc");
-
-    // Both ReviewDb, exact match required.
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c, messages(), patchSets(ps1), approvals(), comments(), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c, messages(), patchSets(ps2), approvals(), comments(), reviewers(), REVIEW_DB);
-    assertDiffs(
-        b1, b2, "description differs for PatchSet.Id " + ps1.getId() + ": { abc } != {abc}");
-
-    // Whitespace in ReviewDb description is ignored.
-    b1 =
-        new ChangeBundle(
-            c, messages(), patchSets(ps1), approvals(), comments(), reviewers(), REVIEW_DB);
-    b2 =
-        new ChangeBundle(
-            c, messages(), patchSets(ps2), approvals(), comments(), reviewers(), NOTE_DB);
-    assertNoDiffs(b1, b2);
-    assertNoDiffs(b2, b1);
-
-    // Must match except for the leading/trailing whitespace.
-    PatchSet ps3 = clone(ps1);
-    ps3.setDescription("cba");
-    b1 =
-        new ChangeBundle(
-            c, messages(), patchSets(ps1), approvals(), comments(), reviewers(), REVIEW_DB);
-    b2 =
-        new ChangeBundle(
-            c, messages(), patchSets(ps3), approvals(), comments(), reviewers(), NOTE_DB);
-    assertDiffs(
-        b1, b2, "description differs for PatchSet.Id " + ps1.getId() + ": { abc } != {cba}");
-  }
-
-  @Test
-  public void diffPatchSetsIgnoresCreatedOnWhenReviewDbIsNonMonotonic() throws Exception {
-    Change c = TestChanges.newChange(project, accountId);
-
-    Timestamp beforePs1 = TimeUtil.nowTs();
-
-    PatchSet goodPs1 = new PatchSet(new PatchSet.Id(c.getId(), 1));
-    goodPs1.setRevision(new RevId("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
-    goodPs1.setUploader(accountId);
-    goodPs1.setCreatedOn(TimeUtil.nowTs());
-    PatchSet goodPs2 = new PatchSet(new PatchSet.Id(c.getId(), 2));
-    goodPs2.setRevision(new RevId("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
-    goodPs2.setUploader(accountId);
-    goodPs2.setCreatedOn(TimeUtil.nowTs());
-    assertThat(goodPs2.getCreatedOn()).isGreaterThan(goodPs1.getCreatedOn());
-
-    PatchSet badPs2 = clone(goodPs2);
-    badPs2.setCreatedOn(beforePs1);
-    assertThat(badPs2.getCreatedOn()).isLessThan(goodPs1.getCreatedOn());
-
-    // Both ReviewDb, exact match required.
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c,
-            messages(),
-            patchSets(goodPs1, goodPs2),
-            approvals(),
-            comments(),
-            reviewers(),
-            REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c,
-            messages(),
-            patchSets(goodPs1, badPs2),
-            approvals(),
-            comments(),
-            reviewers(),
-            REVIEW_DB);
-    assertDiffs(
-        b1,
-        b2,
-        "createdOn differs for PatchSet.Id "
-            + badPs2.getId()
-            + ":"
-            + " {2009-09-30 17:00:18.0} != {2009-09-30 17:00:06.0}");
-
-    // Non-monotonic in ReviewDb but monotonic in NoteDb, timestamps are
-    // ignored, including for ps1.
-    PatchSet badPs1 = clone(goodPs1);
-    badPs1.setCreatedOn(TimeUtil.nowTs());
-    b1 =
-        new ChangeBundle(
-            c,
-            messages(),
-            patchSets(badPs1, badPs2),
-            approvals(),
-            comments(),
-            reviewers(),
-            REVIEW_DB);
-    b2 =
-        new ChangeBundle(
-            c,
-            messages(),
-            patchSets(goodPs1, goodPs2),
-            approvals(),
-            comments(),
-            reviewers(),
-            NOTE_DB);
-    assertNoDiffs(b1, b2);
-    assertNoDiffs(b2, b1);
-
-    // Non-monotonic in NoteDb but monotonic in ReviewDb, timestamps are not
-    // ignored.
-    b1 =
-        new ChangeBundle(
-            c,
-            messages(),
-            patchSets(goodPs1, goodPs2),
-            approvals(),
-            comments(),
-            reviewers(),
-            REVIEW_DB);
-    b2 =
-        new ChangeBundle(
-            c,
-            messages(),
-            patchSets(badPs1, badPs2),
-            approvals(),
-            comments(),
-            reviewers(),
-            NOTE_DB);
-    assertDiffs(
-        b1,
-        b2,
-        "createdOn differs for PatchSet.Id "
-            + badPs1.getId()
-            + " in NoteDb vs. ReviewDb:"
-            + " {2009-09-30 17:00:24.0} != {2009-09-30 17:00:12.0}",
-        "createdOn differs for PatchSet.Id "
-            + badPs2.getId()
-            + " in NoteDb vs. ReviewDb:"
-            + " {2009-09-30 17:00:06.0} != {2009-09-30 17:00:18.0}");
-  }
-
-  @Test
-  public void diffPatchSetsAllowsFirstPatchSetCreatedOnToMatchChangeCreatedOn() {
-    Change c = TestChanges.newChange(project, accountId);
-    c.setLastUpdatedOn(TimeUtil.nowTs());
-
-    PatchSet goodPs1 = new PatchSet(new PatchSet.Id(c.getId(), 1));
-    goodPs1.setRevision(new RevId("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
-    goodPs1.setUploader(accountId);
-    goodPs1.setCreatedOn(TimeUtil.nowTs());
-    assertThat(goodPs1.getCreatedOn()).isGreaterThan(c.getCreatedOn());
-
-    PatchSet ps1AtCreatedOn = clone(goodPs1);
-    ps1AtCreatedOn.setCreatedOn(c.getCreatedOn());
-
-    PatchSet goodPs2 = new PatchSet(new PatchSet.Id(c.getId(), 2));
-    goodPs2.setRevision(new RevId("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
-    goodPs2.setUploader(accountId);
-    goodPs2.setCreatedOn(TimeUtil.nowTs());
-
-    PatchSet ps2AtCreatedOn = clone(goodPs2);
-    ps2AtCreatedOn.setCreatedOn(c.getCreatedOn());
-
-    // Both ReviewDb, exact match required.
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c,
-            messages(),
-            patchSets(goodPs1, goodPs2),
-            approvals(),
-            comments(),
-            reviewers(),
-            REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c,
-            messages(),
-            patchSets(ps1AtCreatedOn, ps2AtCreatedOn),
-            approvals(),
-            comments(),
-            reviewers(),
-            REVIEW_DB);
-    assertDiffs(
-        b1,
-        b2,
-        "createdOn differs for PatchSet.Id "
-            + c.getId()
-            + ",1: {2009-09-30 17:00:12.0} != {2009-09-30 17:00:00.0}",
-        "createdOn differs for PatchSet.Id "
-            + c.getId()
-            + ",2: {2009-09-30 17:00:18.0} != {2009-09-30 17:00:00.0}");
-
-    // One ReviewDb, PS1 is allowed to match change createdOn, but PS2 isn't.
-    b1 =
-        new ChangeBundle(
-            c,
-            messages(),
-            patchSets(goodPs1, goodPs2),
-            approvals(),
-            comments(),
-            reviewers(),
-            REVIEW_DB);
-    b2 =
-        new ChangeBundle(
-            c,
-            messages(),
-            patchSets(ps1AtCreatedOn, ps2AtCreatedOn),
-            approvals(),
-            comments(),
-            reviewers(),
-            NOTE_DB);
-    assertDiffs(
-        b1,
-        b2,
-        "createdOn differs for PatchSet.Id "
-            + c.getId()
-            + ",2 in NoteDb vs. ReviewDb: {2009-09-30 17:00:00.0} != {2009-09-30 17:00:18.0}");
-    assertDiffs(
-        b2,
-        b1,
-        "createdOn differs for PatchSet.Id "
-            + c.getId()
-            + ",2 in NoteDb vs. ReviewDb: {2009-09-30 17:00:00.0} != {2009-09-30 17:00:18.0}");
-  }
-
-  @Test
-  public void diffPatchSetApprovalKeySets() throws Exception {
-    Change c = TestChanges.newChange(project, accountId);
-    int id = c.getId().get();
-    PatchSetApproval a1 =
-        new PatchSetApproval(
-            new PatchSetApproval.Key(c.currentPatchSetId(), accountId, new LabelId("Code-Review")),
-            (short) 1,
-            TimeUtil.nowTs());
-    PatchSetApproval a2 =
-        new PatchSetApproval(
-            new PatchSetApproval.Key(c.currentPatchSetId(), accountId, new LabelId("Verified")),
-            (short) 1,
-            TimeUtil.nowTs());
-
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c, messages(), latest(c), approvals(a1), comments(), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c, messages(), latest(c), approvals(a2), comments(), reviewers(), REVIEW_DB);
-
-    assertDiffs(
-        b1,
-        b2,
-        "PatchSetApproval.Key sets differ:"
-            + " ["
-            + id
-            + "%2C1,100,Code-Review] only in A;"
-            + " ["
-            + id
-            + "%2C1,100,Verified] only in B");
-  }
-
-  @Test
-  public void diffPatchSetApprovals() throws Exception {
-    Change c = TestChanges.newChange(project, accountId);
-    PatchSetApproval a1 =
-        new PatchSetApproval(
-            new PatchSetApproval.Key(c.currentPatchSetId(), accountId, new LabelId("Code-Review")),
-            (short) 1,
-            TimeUtil.nowTs());
-    PatchSetApproval a2 = clone(a1);
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c, messages(), latest(c), approvals(a1), comments(), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c, messages(), latest(c), approvals(a2), comments(), reviewers(), REVIEW_DB);
-
-    assertNoDiffs(b1, b2);
-
-    a2.setValue((short) -1);
-    assertDiffs(
-        b1,
-        b2,
-        "value differs for PatchSetApproval.Key "
-            + c.getId()
-            + "%2C1,100,Code-Review: {1} != {-1}");
-  }
-
-  @Test
-  public void diffPatchSetApprovalsMixedSourcesAllowsSlop() throws Exception {
-    Change c = TestChanges.newChange(project, accountId);
-    subWindowResolution();
-    PatchSetApproval a1 =
-        new PatchSetApproval(
-            new PatchSetApproval.Key(c.currentPatchSetId(), accountId, new LabelId("Code-Review")),
-            (short) 1,
-            roundToSecond(TimeUtil.nowTs()));
-    PatchSetApproval a2 = clone(a1);
-    a2.setGranted(TimeUtil.nowTs());
-
-    // Both are ReviewDb, exact timestamp match is required.
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c, messages(), latest(c), approvals(a1), comments(), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c, messages(), latest(c), approvals(a2), comments(), reviewers(), REVIEW_DB);
-    assertDiffs(
-        b1,
-        b2,
-        "granted differs for PatchSetApproval.Key "
-            + c.getId()
-            + "%2C1,100,Code-Review:"
-            + " {2009-09-30 17:00:07.0} != {2009-09-30 17:00:08.0}");
-
-    // One NoteDb, slop is allowed.
-    b1 =
-        new ChangeBundle(c, messages(), latest(c), approvals(a1), comments(), reviewers(), NOTE_DB);
-    b2 =
-        new ChangeBundle(
-            c, messages(), latest(c), approvals(a2), comments(), reviewers(), REVIEW_DB);
-    assertNoDiffs(b1, b2);
-
-    // But not too much slop.
-    superWindowResolution();
-    PatchSetApproval a3 = clone(a1);
-    a3.setGranted(TimeUtil.nowTs());
-    b1 =
-        new ChangeBundle(c, messages(), latest(c), approvals(a1), comments(), reviewers(), NOTE_DB);
-    ChangeBundle b3 =
-        new ChangeBundle(
-            c, messages(), latest(c), approvals(a3), comments(), reviewers(), REVIEW_DB);
-    String msg =
-        "granted differs for PatchSetApproval.Key "
-            + c.getId()
-            + "%2C1,100,Code-Review in NoteDb vs. ReviewDb:"
-            + " {2009-09-30 17:00:07.0} != {2009-09-30 17:00:15.0}";
-    assertDiffs(b1, b3, msg);
-    assertDiffs(b3, b1, msg);
-  }
-
-  @Test
-  public void diffPatchSetApprovalsAllowsTruncatedTimestampInNoteDb() throws Exception {
-    Change c = TestChanges.newChange(project, accountId);
-    PatchSetApproval a1 =
-        new PatchSetApproval(
-            new PatchSetApproval.Key(c.currentPatchSetId(), accountId, new LabelId("Code-Review")),
-            (short) 1,
-            c.getCreatedOn());
-    PatchSetApproval a2 = clone(a1);
-    a2.setGranted(
-        new Timestamp(
-            new DateTime(1900, 1, 1, 0, 0, 0, DateTimeZone.forTimeZone(TimeZone.getDefault()))
-                .getMillis()));
-
-    // Both are ReviewDb, exact match is required.
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c, messages(), latest(c), approvals(a1), comments(), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c, messages(), latest(c), approvals(a2), comments(), reviewers(), REVIEW_DB);
-    assertDiffs(
-        b1,
-        b2,
-        "granted differs for PatchSetApproval.Key "
-            + c.getId()
-            + "%2C1,100,Code-Review:"
-            + " {2009-09-30 17:00:00.0} != {1900-01-01 00:00:00.0}");
-
-    // Truncating NoteDb timestamp is allowed.
-    b1 =
-        new ChangeBundle(c, messages(), latest(c), approvals(a1), comments(), reviewers(), NOTE_DB);
-    b2 =
-        new ChangeBundle(
-            c, messages(), latest(c), approvals(a2), comments(), reviewers(), REVIEW_DB);
-    assertNoDiffs(b1, b2);
-    assertNoDiffs(b2, b1);
-  }
-
-  @Test
-  public void diffPatchSetApprovalsIgnoresPostSubmitBitOnZeroVote() throws Exception {
-    Change c = TestChanges.newChange(project, accountId);
-    c.setStatus(Change.Status.MERGED);
-    PatchSetApproval a1 =
-        new PatchSetApproval(
-            new PatchSetApproval.Key(c.currentPatchSetId(), accountId, new LabelId("Code-Review")),
-            (short) 0,
-            TimeUtil.nowTs());
-    a1.setPostSubmit(false);
-    PatchSetApproval a2 = clone(a1);
-    a2.setPostSubmit(true);
-
-    // Both are ReviewDb, exact match is required.
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c, messages(), latest(c), approvals(a1), comments(), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c, messages(), latest(c), approvals(a2), comments(), reviewers(), REVIEW_DB);
-    assertDiffs(
-        b1,
-        b2,
-        "postSubmit differs for PatchSetApproval.Key "
-            + c.getId()
-            + "%2C1,100,Code-Review:"
-            + " {false} != {true}");
-
-    // One NoteDb, postSubmit is ignored.
-    b1 =
-        new ChangeBundle(
-            c, messages(), latest(c), approvals(a1), comments(), reviewers(), REVIEW_DB);
-    b2 =
-        new ChangeBundle(c, messages(), latest(c), approvals(a2), comments(), reviewers(), NOTE_DB);
-    assertNoDiffs(b1, b2);
-    assertNoDiffs(b2, b1);
-
-    // postSubmit is not ignored if vote isn't 0.
-    a1.setValue((short) 1);
-    a2.setValue((short) 1);
-    assertDiffs(
-        b1,
-        b2,
-        "postSubmit differs for PatchSetApproval.Key "
-            + c.getId()
-            + "%2C1,100,Code-Review:"
-            + " {false} != {true}");
-    assertDiffs(
-        b2,
-        b1,
-        "postSubmit differs for PatchSetApproval.Key "
-            + c.getId()
-            + "%2C1,100,Code-Review:"
-            + " {true} != {false}");
-  }
-
-  @Test
-  public void diffReviewers() throws Exception {
-    Change c = TestChanges.newChange(project, accountId);
-    Timestamp now = TimeUtil.nowTs();
-    ReviewerSet r1 = reviewers(REVIEWER, new Account.Id(1), now);
-    ReviewerSet r2 = reviewers(REVIEWER, new Account.Id(2), now);
-
-    ChangeBundle b1 =
-        new ChangeBundle(c, messages(), latest(c), approvals(), comments(), r1, REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(c, messages(), latest(c), approvals(), comments(), r2, REVIEW_DB);
-    assertNoDiffs(b1, b1);
-    assertNoDiffs(b2, b2);
-    assertDiffs(b1, b2, "reviewer sets differ: [1] only in A; [2] only in B");
-  }
-
-  @Test
-  public void diffReviewersIgnoresStateAndTimestamp() throws Exception {
-    Change c = TestChanges.newChange(project, accountId);
-    ReviewerSet r1 = reviewers(REVIEWER, new Account.Id(1), TimeUtil.nowTs());
-    ReviewerSet r2 = reviewers(CC, new Account.Id(1), TimeUtil.nowTs());
-
-    ChangeBundle b1 =
-        new ChangeBundle(c, messages(), latest(c), approvals(), comments(), r1, REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(c, messages(), latest(c), approvals(), comments(), r2, REVIEW_DB);
-    assertNoDiffs(b1, b1);
-    assertNoDiffs(b2, b2);
-  }
-
-  @Test
-  public void diffPatchLineCommentKeySets() throws Exception {
-    Change c = TestChanges.newChange(project, accountId);
-    int id = c.getId().get();
-    PatchLineComment c1 =
-        new PatchLineComment(
-            new PatchLineComment.Key(new Patch.Key(c.currentPatchSetId(), "filename1"), "uuid1"),
-            5,
-            accountId,
-            null,
-            TimeUtil.nowTs());
-    PatchLineComment c2 =
-        new PatchLineComment(
-            new PatchLineComment.Key(new Patch.Key(c.currentPatchSetId(), "filename2"), "uuid2"),
-            5,
-            accountId,
-            null,
-            TimeUtil.nowTs());
-
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c, messages(), latest(c), approvals(), comments(c1), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c, messages(), latest(c), approvals(), comments(c2), reviewers(), REVIEW_DB);
-
-    assertDiffs(
-        b1,
-        b2,
-        "PatchLineComment.Key sets differ:"
-            + " ["
-            + id
-            + ",1,filename1,uuid1] only in A;"
-            + " ["
-            + id
-            + ",1,filename2,uuid2] only in B");
-  }
-
-  @Test
-  public void diffPatchLineComments() throws Exception {
-    Change c = TestChanges.newChange(project, accountId);
-    PatchLineComment c1 =
-        new PatchLineComment(
-            new PatchLineComment.Key(new Patch.Key(c.currentPatchSetId(), "filename"), "uuid"),
-            5,
-            accountId,
-            null,
-            TimeUtil.nowTs());
-    PatchLineComment c2 = clone(c1);
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c, messages(), latest(c), approvals(), comments(c1), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c, messages(), latest(c), approvals(), comments(c2), reviewers(), REVIEW_DB);
-
-    assertNoDiffs(b1, b2);
-
-    c2.setStatus(PatchLineComment.Status.PUBLISHED);
-    assertDiffs(
-        b1,
-        b2,
-        "status differs for PatchLineComment.Key " + c.getId() + ",1,filename,uuid: {d} != {P}");
-  }
-
-  @Test
-  public void diffPatchLineCommentsMixedSourcesAllowsSlop() throws Exception {
-    subWindowResolution();
-    Change c = TestChanges.newChange(project, accountId);
-    PatchLineComment c1 =
-        new PatchLineComment(
-            new PatchLineComment.Key(new Patch.Key(c.currentPatchSetId(), "filename"), "uuid"),
-            5,
-            accountId,
-            null,
-            roundToSecond(TimeUtil.nowTs()));
-    PatchLineComment c2 = clone(c1);
-    c2.setWrittenOn(TimeUtil.nowTs());
-
-    // Both are ReviewDb, exact timestamp match is required.
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c, messages(), latest(c), approvals(), comments(c1), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c, messages(), latest(c), approvals(), comments(c2), reviewers(), REVIEW_DB);
-    assertDiffs(
-        b1,
-        b2,
-        "writtenOn differs for PatchLineComment.Key "
-            + c.getId()
-            + ",1,filename,uuid:"
-            + " {2009-09-30 17:00:02.0} != {2009-09-30 17:00:03.0}");
-
-    // One NoteDb, slop is allowed.
-    b1 =
-        new ChangeBundle(c, messages(), latest(c), approvals(), comments(c1), reviewers(), NOTE_DB);
-    b2 =
-        new ChangeBundle(
-            c, messages(), latest(c), approvals(), comments(c2), reviewers(), REVIEW_DB);
-    assertNoDiffs(b1, b2);
-
-    // But not too much slop.
-    superWindowResolution();
-    PatchLineComment c3 = clone(c1);
-    c3.setWrittenOn(TimeUtil.nowTs());
-    b1 =
-        new ChangeBundle(c, messages(), latest(c), approvals(), comments(c1), reviewers(), NOTE_DB);
-    ChangeBundle b3 =
-        new ChangeBundle(
-            c, messages(), latest(c), approvals(), comments(c3), reviewers(), REVIEW_DB);
-    String msg =
-        "writtenOn differs for PatchLineComment.Key "
-            + c.getId()
-            + ",1,filename,uuid in NoteDb vs. ReviewDb:"
-            + " {2009-09-30 17:00:02.0} != {2009-09-30 17:00:10.0}";
-    assertDiffs(b1, b3, msg);
-    assertDiffs(b3, b1, msg);
-  }
-
-  @Test
-  public void diffPatchLineCommentsIgnoresCommentsOnInvalidPatchSet() throws Exception {
-    Change c = TestChanges.newChange(project, accountId);
-    PatchLineComment c1 =
-        new PatchLineComment(
-            new PatchLineComment.Key(new Patch.Key(c.currentPatchSetId(), "filename1"), "uuid1"),
-            5,
-            accountId,
-            null,
-            TimeUtil.nowTs());
-    PatchLineComment c2 =
-        new PatchLineComment(
-            new PatchLineComment.Key(
-                new Patch.Key(new PatchSet.Id(c.getId(), 0), "filename2"), "uuid2"),
-            5,
-            accountId,
-            null,
-            TimeUtil.nowTs());
-
-    ChangeBundle b1 =
-        new ChangeBundle(
-            c, messages(), latest(c), approvals(), comments(c1, c2), reviewers(), REVIEW_DB);
-    ChangeBundle b2 =
-        new ChangeBundle(
-            c, messages(), latest(c), approvals(), comments(c1), reviewers(), REVIEW_DB);
-    assertNoDiffs(b1, b2);
-  }
-
-  private static void assertNoDiffs(ChangeBundle a, ChangeBundle b) {
-    assertThat(a.differencesFrom(b)).isEmpty();
-    assertThat(b.differencesFrom(a)).isEmpty();
-  }
-
-  private static void assertDiffs(ChangeBundle a, ChangeBundle b, String first, String... rest) {
-    List<String> actual = a.differencesFrom(b);
-    if (actual.size() == 1 && rest.length == 0) {
-      // This error message is much easier to read.
-      assertThat(actual.get(0)).isEqualTo(first);
-    } else {
-      List<String> expected = new ArrayList<>(1 + rest.length);
-      expected.add(first);
-      Collections.addAll(expected, rest);
-      assertThat(actual).containsExactlyElementsIn(expected).inOrder();
-    }
-    assertThat(a).isNotEqualTo(b);
-  }
-
-  private static List<ChangeMessage> messages(ChangeMessage... ents) {
-    return Arrays.asList(ents);
-  }
-
-  private static List<PatchSet> patchSets(PatchSet... ents) {
-    return Arrays.asList(ents);
-  }
-
-  private static List<PatchSet> latest(Change c) {
-    PatchSet ps = new PatchSet(c.currentPatchSetId());
-    ps.setCreatedOn(c.getLastUpdatedOn());
-    return ImmutableList.of(ps);
-  }
-
-  private static List<PatchSetApproval> approvals(PatchSetApproval... ents) {
-    return Arrays.asList(ents);
-  }
-
-  private static ReviewerSet reviewers(Object... ents) {
-    checkArgument(ents.length % 3 == 0);
-    Table<ReviewerStateInternal, Account.Id, Timestamp> t = HashBasedTable.create();
-    for (int i = 0; i < ents.length; i += 3) {
-      t.put((ReviewerStateInternal) ents[i], (Account.Id) ents[i + 1], (Timestamp) ents[i + 2]);
-    }
-    return ReviewerSet.fromTable(t);
-  }
-
-  private static List<PatchLineComment> comments(PatchLineComment... ents) {
-    return Arrays.asList(ents);
-  }
-
-  private static Change clone(Change ent) {
-    return clone(CHANGE_CODEC, ent);
-  }
-
-  private static ChangeMessage clone(ChangeMessage ent) {
-    return clone(CHANGE_MESSAGE_CODEC, ent);
-  }
-
-  private static PatchSet clone(PatchSet ent) {
-    return clone(PATCH_SET_CODEC, ent);
-  }
-
-  private static PatchSetApproval clone(PatchSetApproval ent) {
-    return clone(PATCH_SET_APPROVAL_CODEC, ent);
-  }
-
-  private static PatchLineComment clone(PatchLineComment ent) {
-    return clone(PATCH_LINE_COMMENT_CODEC, ent);
-  }
-
-  private static <T> T clone(ProtobufCodec<T> codec, T obj) {
-    return codec.decode(codec.encodeToByteArray(obj));
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesParserTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesParserTest.java
deleted file mode 100644
index 5fa7a30..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesParserTest.java
+++ /dev/null
@@ -1,565 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.notedb;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.fail;
-
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.server.notedb.ChangeNotesCommit.ChangeNotesRevWalk;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-public class ChangeNotesParserTest extends AbstractChangeNotesTest {
-  private TestRepository<InMemoryRepository> testRepo;
-  private ChangeNotesRevWalk walk;
-
-  @Before
-  public void setUpTestRepo() throws Exception {
-    testRepo = new TestRepository<>(repo);
-    walk = ChangeNotesCommit.newRevWalk(repo);
-  }
-
-  @After
-  public void tearDownTestRepo() throws Exception {
-    walk.close();
-  }
-
-  @Test
-  public void parseAuthor() throws Exception {
-    assertParseSucceeds(
-        "Update change\n"
-            + "\n"
-            + "Branch: refs/heads/master\n"
-            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
-            + "Patch-set: 1\n"
-            + "Subject: This is a test change\n");
-    assertParseFails(
-        writeCommit(
-            "Update change\n\nPatch-set: 1\n",
-            new PersonIdent(
-                "Change Owner",
-                "owner@example.com",
-                serverIdent.getWhen(),
-                serverIdent.getTimeZone())));
-    assertParseFails(
-        writeCommit(
-            "Update change\n\nPatch-set: 1\n",
-            new PersonIdent(
-                "Change Owner", "x@gerrit", serverIdent.getWhen(), serverIdent.getTimeZone())));
-    assertParseFails(
-        writeCommit(
-            "Update change\n\nPatch-set: 1\n",
-            new PersonIdent(
-                "Change\n\u1234<Owner>",
-                "\n\nx<@>\u0002gerrit",
-                serverIdent.getWhen(),
-                serverIdent.getTimeZone())));
-  }
-
-  @Test
-  public void parseStatus() throws Exception {
-    assertParseSucceeds(
-        "Update change\n"
-            + "\n"
-            + "Branch: refs/heads/master\n"
-            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
-            + "Patch-set: 1\n"
-            + "Status: NEW\n"
-            + "Subject: This is a test change\n");
-    assertParseSucceeds(
-        "Update change\n"
-            + "\n"
-            + "Branch: refs/heads/master\n"
-            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
-            + "Patch-set: 1\n"
-            + "Status: new\n"
-            + "Subject: This is a test change\n");
-    assertParseFails("Update change\n\nPatch-set: 1\nStatus: OOPS\n");
-    assertParseFails("Update change\n\nPatch-set: 1\nStatus: NEW\nStatus: NEW\n");
-  }
-
-  @Test
-  public void parsePatchSetId() throws Exception {
-    assertParseSucceeds(
-        "Update change\n"
-            + "\n"
-            + "Branch: refs/heads/master\n"
-            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
-            + "Patch-set: 1\n"
-            + "Subject: This is a test change\n");
-    assertParseFails("Update change\n\n");
-    assertParseFails("Update change\n\nPatch-set: 1\nPatch-set: 1\n");
-    assertParseSucceeds(
-        "Update change\n"
-            + "\n"
-            + "Branch: refs/heads/master\n"
-            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
-            + "Patch-set: 1\n"
-            + "Subject: This is a test change\n");
-    assertParseFails("Update change\n\nPatch-set: x\n");
-  }
-
-  @Test
-  public void parseApproval() throws Exception {
-    assertParseSucceeds(
-        "Update change\n"
-            + "\n"
-            + "Branch: refs/heads/master\n"
-            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
-            + "Patch-set: 1\n"
-            + "Label: Label1=+1\n"
-            + "Label: Label2=1\n"
-            + "Label: Label3=0\n"
-            + "Label: Label4=-1\n"
-            + "Subject: This is a test change\n");
-    assertParseSucceeds(
-        "Update change\n"
-            + "\n"
-            + "Branch: refs/heads/master\n"
-            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
-            + "Patch-set: 1\n"
-            + "Label: -Label1\n"
-            + "Label: -Label1 Other Account <2@gerrit>\n"
-            + "Subject: This is a test change\n");
-    assertParseFails("Update change\n\nPatch-set: 1\nLabel: Label1=X\n");
-    assertParseFails("Update change\n\nPatch-set: 1\nLabel: Label1 = 1\n");
-    assertParseFails("Update change\n\nPatch-set: 1\nLabel: X+Y\n");
-    assertParseFails("Update change\n\nPatch-set: 1\nLabel: Label1 Other Account <2@gerrit>\n");
-    assertParseFails("Update change\n\nPatch-set: 1\nLabel: -Label!1\n");
-    assertParseFails("Update change\n\nPatch-set: 1\nLabel: -Label!1 Other Account <2@gerrit>\n");
-  }
-
-  @Test
-  public void parseSubmitRecords() throws Exception {
-    assertParseSucceeds(
-        "Update change\n"
-            + "\n"
-            + "Branch: refs/heads/master\n"
-            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
-            + "Patch-set: 1\n"
-            + "Subject: This is a test change\n"
-            + "Submitted-with: NOT_READY\n"
-            + "Submitted-with: OK: Verified: Change Owner <1@gerrit>\n"
-            + "Submitted-with: NEED: Code-Review\n"
-            + "Submitted-with: NOT_READY\n"
-            + "Submitted-with: OK: Verified: Change Owner <1@gerrit>\n"
-            + "Submitted-with: NEED: Alternative-Code-Review\n");
-    assertParseFails("Update change\n\nPatch-set: 1\nSubmitted-with: OOPS\n");
-    assertParseFails("Update change\n\nPatch-set: 1\nSubmitted-with: NEED: X+Y\n");
-    assertParseFails(
-        "Update change\n"
-            + "\n"
-            + "Patch-set: 1\n"
-            + "Submitted-with: OK: X+Y: Change Owner <1@gerrit>\n");
-    assertParseFails(
-        "Update change\n"
-            + "\n"
-            + "Patch-set: 1\n"
-            + "Submitted-with: OK: Code-Review: 1@gerrit\n");
-  }
-
-  @Test
-  public void parseSubmissionId() throws Exception {
-    assertParseSucceeds(
-        "Update change\n"
-            + "\n"
-            + "Branch: refs/heads/master\n"
-            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
-            + "Patch-set: 1\n"
-            + "Subject: This is a test change\n"
-            + "Submission-id: 1-1453387607626-96fabc25");
-    assertParseFails(
-        "Update change\n"
-            + "\n"
-            + "Patch-set: 1\n"
-            + "Submission-id: 1-1453387607626-96fabc25\n"
-            + "Submission-id: 1-1453387901516-5d1e2450");
-  }
-
-  @Test
-  public void parseReviewer() throws Exception {
-    assertParseSucceeds(
-        "Update change\n"
-            + "\n"
-            + "Branch: refs/heads/master\n"
-            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
-            + "Patch-set: 1\n"
-            + "Reviewer: Change Owner <1@gerrit>\n"
-            + "CC: Other Account <2@gerrit>\n"
-            + "Subject: This is a test change\n");
-    assertParseFails("Update change\n\nPatch-set: 1\nReviewer: 1@gerrit\n");
-  }
-
-  @Test
-  public void parseTopic() throws Exception {
-    assertParseSucceeds(
-        "Update change\n"
-            + "\n"
-            + "Branch: refs/heads/master\n"
-            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
-            + "Patch-set: 1\n"
-            + "Topic: Some Topic\n"
-            + "Subject: This is a test change\n");
-    assertParseSucceeds(
-        "Update change\n"
-            + "\n"
-            + "Branch: refs/heads/master\n"
-            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
-            + "Patch-set: 1\n"
-            + "Topic:\n"
-            + "Subject: This is a test change\n");
-    assertParseFails("Update change\n\nPatch-set: 1\nTopic: Some Topic\nTopic: Other Topic");
-  }
-
-  @Test
-  public void parseBranch() throws Exception {
-    assertParseSucceeds(
-        "Update change\n"
-            + "\n"
-            + "Branch: refs/heads/master\n"
-            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
-            + "Patch-set: 1\n"
-            + "Subject: This is a test change\n");
-    assertParseSucceeds(
-        "Update change\n"
-            + "\n"
-            + "Branch: master\n"
-            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
-            + "Patch-set: 1\n"
-            + "Subject: This is a test change\n");
-    assertParseFails(
-        "Update change\n"
-            + "\n"
-            + "Patch-set: 1\n"
-            + "Branch: refs/heads/master\n"
-            + "Branch: refs/heads/stable");
-  }
-
-  @Test
-  public void parseChangeId() throws Exception {
-    assertParseSucceeds(
-        "Update change\n"
-            + "\n"
-            + "Branch: refs/heads/master\n"
-            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
-            + "Patch-set: 1\n"
-            + "Subject: This is a test change\n");
-    assertParseFails(
-        "Update change\n"
-            + "\n"
-            + "Patch-set: 1\n"
-            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
-            + "Change-id: I159532ef4844d7c18f7f3fd37a0b275590d41b1b");
-  }
-
-  @Test
-  public void parseSubject() throws Exception {
-    assertParseSucceeds(
-        "Update change\n"
-            + "\n"
-            + "Patch-set: 1\n"
-            + "Branch: refs/heads/master\n"
-            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
-            + "Subject: Some subject of a change\n");
-    assertParseFails(
-        "Update change\n"
-            + "\n"
-            + "Patch-set: 1\n"
-            + "Subject: Some subject of a change\n"
-            + "Subject: Some other subject\n");
-  }
-
-  @Test
-  public void parseCommit() throws Exception {
-    assertParseSucceeds(
-        "Update change\n"
-            + "\n"
-            + "Patch-set: 2\n"
-            + "Branch: refs/heads/master\n"
-            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
-            + "Subject: Some subject of a change\n"
-            + "Commit: abcd1234abcd1234abcd1234abcd1234abcd1234");
-    assertParseFails(
-        "Update change\n"
-            + "\n"
-            + "Patch-set: 2\n"
-            + "Branch: refs/heads/master\n"
-            + "Subject: Some subject of a change\n"
-            + "Commit: abcd1234abcd1234abcd1234abcd1234abcd1234\n"
-            + "Commit: deadbeefdeadbeefdeadbeefdeadbeefdeadbeef");
-    assertParseFails(
-        "Update patch set 1\n"
-            + "Uploaded patch set 1.\n"
-            + "Patch-set: 2\n"
-            + "Branch: refs/heads/master\n"
-            + "Subject: Some subject of a change\n"
-            + "Commit: beef");
-  }
-
-  @Test
-  public void parsePatchSetState() throws Exception {
-    assertParseSucceeds(
-        "Update change\n"
-            + "\n"
-            + "Patch-set: 1 (PUBLISHED)\n"
-            + "Branch: refs/heads/master\n"
-            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
-            + "Subject: Some subject of a change\n");
-    assertParseFails(
-        "Update change\n"
-            + "\n"
-            + "Patch-set: 1 (DRAFT)\n"
-            + "Branch: refs/heads/master\n"
-            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
-            + "Subject: Some subject of a change\n");
-    assertParseSucceeds(
-        "Update change\n"
-            + "\n"
-            + "Patch-set: 1 (DELETED)\n"
-            + "Branch: refs/heads/master\n"
-            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
-            + "Subject: Some subject of a change\n");
-    assertParseFails(
-        "Update change\n"
-            + "\n"
-            + "Patch-set: 1 (NOT A STATUS)\n"
-            + "Branch: refs/heads/master\n"
-            + "Subject: Some subject of a change\n");
-  }
-
-  @Test
-  public void parsePatchSetGroups() throws Exception {
-    assertParseSucceeds(
-        "Update change\n"
-            + "\n"
-            + "Patch-set: 2\n"
-            + "Branch: refs/heads/master\n"
-            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
-            + "Commit: abcd1234abcd1234abcd1234abcd1234abcd1234\n"
-            + "Subject: Change subject\n"
-            + "Groups: a,b,c\n");
-    assertParseFails(
-        "Update change\n"
-            + "\n"
-            + "Patch-set: 2\n"
-            + "Branch: refs/heads/master\n"
-            + "Commit: abcd1234abcd1234abcd1234abcd1234abcd1234\n"
-            + "Subject: Change subject\n"
-            + "Groups: a,b,c\n"
-            + "Groups: d,e,f\n");
-  }
-
-  @Test
-  public void parseServerIdent() throws Exception {
-    String msg =
-        "Update change\n"
-            + "\n"
-            + "Patch-set: 1\n"
-            + "Branch: refs/heads/master\n"
-            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
-            + "Subject: Change subject\n";
-    assertParseSucceeds(msg);
-    assertParseSucceeds(writeCommit(msg, serverIdent));
-
-    msg =
-        "Update change\n"
-            + "\n"
-            + "With a message."
-            + "\n"
-            + "Patch-set: 1\n"
-            + "Branch: refs/heads/master\n"
-            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
-            + "Subject: Change subject\n";
-    assertParseSucceeds(msg);
-    assertParseSucceeds(writeCommit(msg, serverIdent));
-
-    msg =
-        "Update change\n"
-            + "\n"
-            + "Patch-set: 1\n"
-            + "Branch: refs/heads/master\n"
-            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
-            + "Subject: Change subject\n"
-            + "Label: Label1=+1\n";
-    assertParseSucceeds(msg);
-    assertParseFails(writeCommit(msg, serverIdent));
-  }
-
-  @Test
-  public void parseTag() throws Exception {
-    assertParseSucceeds(
-        "Update change\n"
-            + "\n"
-            + "Patch-set: 1\n"
-            + "Branch: refs/heads/master\n"
-            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
-            + "Subject: Change subject\n"
-            + "Tag:\n");
-    assertParseSucceeds(
-        "Update change\n"
-            + "\n"
-            + "Patch-set: 1\n"
-            + "Branch: refs/heads/master\n"
-            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
-            + "Subject: Change subject\n"
-            + "Tag: jenkins\n");
-    assertParseFails(
-        "Update change\n"
-            + "\n"
-            + "Patch-set: 1\n"
-            + "Branch: refs/heads/master\n"
-            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
-            + "Subject: Change subject\n"
-            + "Tag: ci\n"
-            + "Tag: jenkins\n");
-  }
-
-  @Test
-  public void parseWorkInProgress() throws Exception {
-    // Change created in WIP remains in WIP.
-    RevCommit commit = writeCommit("Update WIP change\n" + "\n" + "Patch-set: 1\n", true);
-    ChangeNotesState state = newParser(commit).parseAll();
-    assertThat(state.hasReviewStarted()).isFalse();
-
-    // Moving change out of WIP starts review.
-    commit =
-        writeCommit("New ready change\n" + "\n" + "Patch-set: 1\n" + "Work-in-progress: false\n");
-    state = newParser(commit).parseAll();
-    assertThat(state.hasReviewStarted()).isTrue();
-
-    // Change created not in WIP has always been in review started state.
-    state = assertParseSucceeds("New change that doesn't declare WIP\n" + "\n" + "Patch-set: 1\n");
-    assertThat(state.hasReviewStarted()).isTrue();
-  }
-
-  @Test
-  public void pendingReviewers() throws Exception {
-    // Change created in WIP.
-    RevCommit commit = writeCommit("Update WIP change\n" + "\n" + "Patch-set: 1\n", true);
-    ChangeNotesState state = newParser(commit).parseAll();
-    assertThat(state.pendingReviewers().all()).isEmpty();
-    assertThat(state.pendingReviewersByEmail().all()).isEmpty();
-
-    // Reviewers added while in WIP.
-    commit =
-        writeCommit(
-            "Add reviewers\n"
-                + "\n"
-                + "Patch-set: 1\n"
-                + "Reviewer: Change Owner "
-                + "<1@gerrit>\n",
-            true);
-    state = newParser(commit).parseAll();
-    assertThat(state.pendingReviewers().byState(ReviewerStateInternal.REVIEWER)).isNotEmpty();
-  }
-
-  @Test
-  public void caseInsensitiveFooters() throws Exception {
-    assertParseSucceeds(
-        "Update change\n"
-            + "\n"
-            + "BRaNch: refs/heads/master\n"
-            + "Change-ID: I577fb248e474018276351785930358ec0450e9f7\n"
-            + "patcH-set: 1\n"
-            + "subject: This is a test change\n");
-  }
-
-  @Test
-  public void currentPatchSet() throws Exception {
-    assertParseSucceeds("Update change\n\nPatch-set: 1\nCurrent: true");
-    assertParseSucceeds("Update change\n\nPatch-set: 1\nCurrent: tRUe");
-    assertParseFails("Update change\n\nPatch-set: 1\nCurrent: false");
-    assertParseFails("Update change\n\nPatch-set: 1\nCurrent: blah");
-  }
-
-  private RevCommit writeCommit(String body) throws Exception {
-    ChangeNoteUtil noteUtil = injector.getInstance(ChangeNoteUtil.class);
-    return writeCommit(
-        body,
-        noteUtil.newIdent(
-            changeOwner.getAccount(), TimeUtil.nowTs(), serverIdent, "Anonymous Coward"),
-        false);
-  }
-
-  private RevCommit writeCommit(String body, PersonIdent author) throws Exception {
-    return writeCommit(body, author, false);
-  }
-
-  private RevCommit writeCommit(String body, boolean initWorkInProgress) throws Exception {
-    ChangeNoteUtil noteUtil = injector.getInstance(ChangeNoteUtil.class);
-    return writeCommit(
-        body,
-        noteUtil.newIdent(
-            changeOwner.getAccount(), TimeUtil.nowTs(), serverIdent, "Anonymous Coward"),
-        initWorkInProgress);
-  }
-
-  private RevCommit writeCommit(String body, PersonIdent author, boolean initWorkInProgress)
-      throws Exception {
-    Change change = newChange(initWorkInProgress);
-    ChangeNotes notes = newNotes(change).load();
-    try (ObjectInserter ins = testRepo.getRepository().newObjectInserter()) {
-      CommitBuilder cb = new CommitBuilder();
-      cb.setParentId(notes.getRevision());
-      cb.setAuthor(author);
-      cb.setCommitter(new PersonIdent(serverIdent, author.getWhen()));
-      cb.setTreeId(testRepo.tree());
-      cb.setMessage(body);
-      ObjectId id = ins.insert(cb);
-      ins.flush();
-      RevCommit commit = walk.parseCommit(id);
-      walk.parseBody(commit);
-      return commit;
-    }
-  }
-
-  private ChangeNotesState assertParseSucceeds(String body) throws Exception {
-    return assertParseSucceeds(writeCommit(body));
-  }
-
-  private ChangeNotesState assertParseSucceeds(RevCommit commit) throws Exception {
-    return newParser(commit).parseAll();
-  }
-
-  private void assertParseFails(String body) throws Exception {
-    assertParseFails(writeCommit(body));
-  }
-
-  private void assertParseFails(RevCommit commit) throws Exception {
-    try {
-      newParser(commit).parseAll();
-      fail("Expected parse to fail:\n" + commit.getFullMessage());
-    } catch (ConfigInvalidException e) {
-      // Expected
-    }
-  }
-
-  private ChangeNotesParser newParser(ObjectId tip) throws Exception {
-    walk.reset();
-    ChangeNoteUtil noteUtil = injector.getInstance(ChangeNoteUtil.class);
-    return new ChangeNotesParser(newChange().getId(), tip, walk, noteUtil, args.metrics);
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesTest.java
deleted file mode 100644
index 0daaee8..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesTest.java
+++ /dev/null
@@ -1,3579 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.notedb;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth.assert_;
-import static com.google.gerrit.reviewdb.client.RefNames.changeMetaRef;
-import static com.google.gerrit.reviewdb.client.RefNames.refsDraftComments;
-import static com.google.gerrit.server.notedb.ReviewerStateInternal.CC;
-import static com.google.gerrit.server.notedb.ReviewerStateInternal.REMOVED;
-import static com.google.gerrit.server.notedb.ReviewerStateInternal.REVIEWER;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
-import static org.junit.Assert.fail;
-
-import com.google.common.base.Throwables;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableListMultimap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ImmutableTable;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.Lists;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.common.data.SubmitRecord;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gerrit.reviewdb.client.CommentRange;
-import com.google.gerrit.reviewdb.client.PatchLineComment.Status;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.client.RevId;
-import com.google.gerrit.reviewdb.server.ReviewDbUtil;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.ReviewerSet;
-import com.google.gerrit.server.config.GerritServerId;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.notedb.ChangeNotesCommit.ChangeNotesRevWalk;
-import com.google.gerrit.server.util.RequestId;
-import com.google.gerrit.testutil.TestChanges;
-import com.google.gerrit.testutil.TestTimeUtil;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.notes.Note;
-import org.eclipse.jgit.notes.NoteMap;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.junit.Test;
-
-public class ChangeNotesTest extends AbstractChangeNotesTest {
-  @Inject private DraftCommentNotes.Factory draftNotesFactory;
-
-  @Inject private ChangeNoteUtil noteUtil;
-
-  @Inject private @GerritServerId String serverId;
-
-  @Test
-  public void tagChangeMessage() throws Exception {
-    String tag = "jenkins";
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setChangeMessage("verification from jenkins");
-    update.setTag(tag);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-
-    assertThat(notes.getChangeMessages()).hasSize(1);
-    assertThat(notes.getChangeMessages().get(0).getTag()).isEqualTo(tag);
-  }
-
-  @Test
-  public void patchSetDescription() throws Exception {
-    String description = "descriptive";
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setPsDescription(description);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getCurrentPatchSet().getDescription()).isEqualTo(description);
-
-    description = "new, now more descriptive!";
-    update = newUpdate(c, changeOwner);
-    update.setPsDescription(description);
-    update.commit();
-
-    notes = newNotes(c);
-    assertThat(notes.getCurrentPatchSet().getDescription()).isEqualTo(description);
-  }
-
-  @Test
-  public void tagInlineComments() throws Exception {
-    String tag = "jenkins";
-    Change c = newChange();
-    RevCommit commit = tr.commit().message("PS2").create();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.putComment(
-        Status.PUBLISHED,
-        newComment(
-            c.currentPatchSetId(),
-            "a.txt",
-            "uuid1",
-            new CommentRange(1, 2, 3, 4),
-            1,
-            changeOwner,
-            null,
-            TimeUtil.nowTs(),
-            "Comment",
-            (short) 1,
-            commit.name(),
-            false));
-    update.setTag(tag);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-
-    ImmutableListMultimap<RevId, Comment> comments = notes.getComments();
-    assertThat(comments).hasSize(1);
-    assertThat(comments.entries().asList().get(0).getValue().tag).isEqualTo(tag);
-  }
-
-  @Test
-  public void tagApprovals() throws Exception {
-    String tag1 = "jenkins";
-    String tag2 = "ip";
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.putApproval("Verified", (short) -1);
-    update.setTag(tag1);
-    update.commit();
-
-    update = newUpdate(c, changeOwner);
-    update.putApproval("Verified", (short) 1);
-    update.setTag(tag2);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-
-    ImmutableListMultimap<PatchSet.Id, PatchSetApproval> approvals = notes.getApprovals();
-    assertThat(approvals).hasSize(1);
-    assertThat(approvals.entries().asList().get(0).getValue().getTag()).isEqualTo(tag2);
-  }
-
-  @Test
-  public void multipleTags() throws Exception {
-    String ipTag = "ip";
-    String coverageTag = "coverage";
-    String integrationTag = "integration";
-    Change c = newChange();
-
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.putApproval("Verified", (short) -1);
-    update.setChangeMessage("integration verification");
-    update.setTag(integrationTag);
-    update.commit();
-
-    RevCommit commit = tr.commit().message("PS2").create();
-    update = newUpdate(c, changeOwner);
-    update.putComment(
-        Status.PUBLISHED,
-        newComment(
-            c.currentPatchSetId(),
-            "a.txt",
-            "uuid1",
-            new CommentRange(1, 2, 3, 4),
-            1,
-            changeOwner,
-            null,
-            TimeUtil.nowTs(),
-            "Comment",
-            (short) 1,
-            commit.name(),
-            false));
-    update.setChangeMessage("coverage verification");
-    update.setTag(coverageTag);
-    update.commit();
-
-    update = newUpdate(c, changeOwner);
-    update.setChangeMessage("ip clear");
-    update.setTag(ipTag);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-
-    ImmutableListMultimap<PatchSet.Id, PatchSetApproval> approvals = notes.getApprovals();
-    assertThat(approvals).hasSize(1);
-    PatchSetApproval approval = approvals.entries().asList().get(0).getValue();
-    assertThat(approval.getTag()).isEqualTo(integrationTag);
-    assertThat(approval.getValue()).isEqualTo(-1);
-
-    ImmutableListMultimap<RevId, Comment> comments = notes.getComments();
-    assertThat(comments).hasSize(1);
-    assertThat(comments.entries().asList().get(0).getValue().tag).isEqualTo(coverageTag);
-
-    ImmutableList<ChangeMessage> messages = notes.getChangeMessages();
-    assertThat(messages).hasSize(3);
-    assertThat(messages.get(0).getTag()).isEqualTo(integrationTag);
-    assertThat(messages.get(1).getTag()).isEqualTo(coverageTag);
-    assertThat(messages.get(2).getTag()).isEqualTo(ipTag);
-  }
-
-  @Test
-  public void approvalsOnePatchSet() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.putApproval("Verified", (short) 1);
-    update.putApproval("Code-Review", (short) -1);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getApprovals().keySet()).containsExactly(c.currentPatchSetId());
-    List<PatchSetApproval> psas = notes.getApprovals().get(c.currentPatchSetId());
-    assertThat(psas).hasSize(2);
-
-    assertThat(psas.get(0).getPatchSetId()).isEqualTo(c.currentPatchSetId());
-    assertThat(psas.get(0).getAccountId().get()).isEqualTo(1);
-    assertThat(psas.get(0).getLabel()).isEqualTo("Code-Review");
-    assertThat(psas.get(0).getValue()).isEqualTo((short) -1);
-    assertThat(psas.get(0).getGranted()).isEqualTo(truncate(after(c, 2000)));
-
-    assertThat(psas.get(1).getPatchSetId()).isEqualTo(c.currentPatchSetId());
-    assertThat(psas.get(1).getAccountId().get()).isEqualTo(1);
-    assertThat(psas.get(1).getLabel()).isEqualTo("Verified");
-    assertThat(psas.get(1).getValue()).isEqualTo((short) 1);
-    assertThat(psas.get(1).getGranted()).isEqualTo(psas.get(0).getGranted());
-  }
-
-  @Test
-  public void approvalsMultiplePatchSets() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.putApproval("Code-Review", (short) -1);
-    update.commit();
-    PatchSet.Id ps1 = c.currentPatchSetId();
-
-    incrementPatchSet(c);
-    update = newUpdate(c, changeOwner);
-    update.putApproval("Code-Review", (short) 1);
-    update.commit();
-    PatchSet.Id ps2 = c.currentPatchSetId();
-
-    ChangeNotes notes = newNotes(c);
-    ListMultimap<PatchSet.Id, PatchSetApproval> psas = notes.getApprovals();
-    assertThat(psas).hasSize(2);
-
-    PatchSetApproval psa1 = Iterables.getOnlyElement(psas.get(ps1));
-    assertThat(psa1.getPatchSetId()).isEqualTo(ps1);
-    assertThat(psa1.getAccountId().get()).isEqualTo(1);
-    assertThat(psa1.getLabel()).isEqualTo("Code-Review");
-    assertThat(psa1.getValue()).isEqualTo((short) -1);
-    assertThat(psa1.getGranted()).isEqualTo(truncate(after(c, 2000)));
-
-    PatchSetApproval psa2 = Iterables.getOnlyElement(psas.get(ps2));
-    assertThat(psa2.getPatchSetId()).isEqualTo(ps2);
-    assertThat(psa2.getAccountId().get()).isEqualTo(1);
-    assertThat(psa2.getLabel()).isEqualTo("Code-Review");
-    assertThat(psa2.getValue()).isEqualTo((short) +1);
-    assertThat(psa2.getGranted()).isEqualTo(truncate(after(c, 4000)));
-  }
-
-  @Test
-  public void approvalsMultipleApprovals() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.putApproval("Code-Review", (short) -1);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    PatchSetApproval psa =
-        Iterables.getOnlyElement(notes.getApprovals().get(c.currentPatchSetId()));
-    assertThat(psa.getLabel()).isEqualTo("Code-Review");
-    assertThat(psa.getValue()).isEqualTo((short) -1);
-
-    update = newUpdate(c, changeOwner);
-    update.putApproval("Code-Review", (short) 1);
-    update.commit();
-
-    notes = newNotes(c);
-    psa = Iterables.getOnlyElement(notes.getApprovals().get(c.currentPatchSetId()));
-    assertThat(psa.getLabel()).isEqualTo("Code-Review");
-    assertThat(psa.getValue()).isEqualTo((short) 1);
-  }
-
-  @Test
-  public void approvalsMultipleUsers() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.putApproval("Code-Review", (short) -1);
-    update.commit();
-
-    update = newUpdate(c, otherUser);
-    update.putApproval("Code-Review", (short) 1);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getApprovals().keySet()).containsExactly(c.currentPatchSetId());
-    List<PatchSetApproval> psas = notes.getApprovals().get(c.currentPatchSetId());
-    assertThat(psas).hasSize(2);
-
-    assertThat(psas.get(0).getPatchSetId()).isEqualTo(c.currentPatchSetId());
-    assertThat(psas.get(0).getAccountId().get()).isEqualTo(1);
-    assertThat(psas.get(0).getLabel()).isEqualTo("Code-Review");
-    assertThat(psas.get(0).getValue()).isEqualTo((short) -1);
-    assertThat(psas.get(0).getGranted()).isEqualTo(truncate(after(c, 2000)));
-
-    assertThat(psas.get(1).getPatchSetId()).isEqualTo(c.currentPatchSetId());
-    assertThat(psas.get(1).getAccountId().get()).isEqualTo(2);
-    assertThat(psas.get(1).getLabel()).isEqualTo("Code-Review");
-    assertThat(psas.get(1).getValue()).isEqualTo((short) 1);
-    assertThat(psas.get(1).getGranted()).isEqualTo(truncate(after(c, 3000)));
-  }
-
-  @Test
-  public void approvalsTombstone() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.putApproval("Not-For-Long", (short) 1);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    PatchSetApproval psa =
-        Iterables.getOnlyElement(notes.getApprovals().get(c.currentPatchSetId()));
-    assertThat(psa.getAccountId().get()).isEqualTo(1);
-    assertThat(psa.getLabel()).isEqualTo("Not-For-Long");
-    assertThat(psa.getValue()).isEqualTo((short) 1);
-
-    update = newUpdate(c, changeOwner);
-    update.removeApproval("Not-For-Long");
-    update.commit();
-
-    notes = newNotes(c);
-    assertThat(notes.getApprovals())
-        .containsExactlyEntriesIn(
-            ImmutableListMultimap.of(
-                psa.getPatchSetId(),
-                new PatchSetApproval(psa.getKey(), (short) 0, update.getWhen())));
-  }
-
-  @Test
-  public void removeOtherUsersApprovals() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, otherUser);
-    update.putApproval("Not-For-Long", (short) 1);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    PatchSetApproval psa =
-        Iterables.getOnlyElement(notes.getApprovals().get(c.currentPatchSetId()));
-    assertThat(psa.getAccountId()).isEqualTo(otherUserId);
-    assertThat(psa.getLabel()).isEqualTo("Not-For-Long");
-    assertThat(psa.getValue()).isEqualTo((short) 1);
-
-    update = newUpdate(c, changeOwner);
-    update.removeApprovalFor(otherUserId, "Not-For-Long");
-    update.commit();
-
-    notes = newNotes(c);
-    assertThat(notes.getApprovals())
-        .containsExactlyEntriesIn(
-            ImmutableListMultimap.of(
-                psa.getPatchSetId(),
-                new PatchSetApproval(psa.getKey(), (short) 0, update.getWhen())));
-
-    // Add back approval on same label.
-    update = newUpdate(c, otherUser);
-    update.putApproval("Not-For-Long", (short) 2);
-    update.commit();
-
-    notes = newNotes(c);
-    psa = Iterables.getOnlyElement(notes.getApprovals().get(c.currentPatchSetId()));
-    assertThat(psa.getAccountId()).isEqualTo(otherUserId);
-    assertThat(psa.getLabel()).isEqualTo("Not-For-Long");
-    assertThat(psa.getValue()).isEqualTo((short) 2);
-  }
-
-  @Test
-  public void putOtherUsersApprovals() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.putApproval("Code-Review", (short) 1);
-    update.putApprovalFor(otherUser.getAccountId(), "Code-Review", (short) -1);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    List<PatchSetApproval> approvals =
-        ReviewDbUtil.intKeyOrdering()
-            .onResultOf(PatchSetApproval::getAccountId)
-            .sortedCopy(notes.getApprovals().get(c.currentPatchSetId()));
-    assertThat(approvals).hasSize(2);
-
-    assertThat(approvals.get(0).getAccountId()).isEqualTo(changeOwner.getAccountId());
-    assertThat(approvals.get(0).getLabel()).isEqualTo("Code-Review");
-    assertThat(approvals.get(0).getValue()).isEqualTo((short) 1);
-
-    assertThat(approvals.get(1).getAccountId()).isEqualTo(otherUser.getAccountId());
-    assertThat(approvals.get(1).getLabel()).isEqualTo("Code-Review");
-    assertThat(approvals.get(1).getValue()).isEqualTo((short) -1);
-  }
-
-  @Test
-  public void approvalsPostSubmit() throws Exception {
-    Change c = newChange();
-    RequestId submissionId = RequestId.forChange(c);
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.putApproval("Code-Review", (short) 1);
-    update.putApproval("Verified", (short) 1);
-    update.commit();
-
-    update = newUpdate(c, changeOwner);
-    update.merge(
-        submissionId,
-        ImmutableList.of(
-            submitRecord(
-                "NOT_READY",
-                null,
-                submitLabel("Verified", "OK", changeOwner.getAccountId()),
-                submitLabel("Code-Review", "NEED", null))));
-    update.commit();
-
-    update = newUpdate(c, changeOwner);
-    update.putApproval("Code-Review", (short) 2);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    List<PatchSetApproval> approvals = Lists.newArrayList(notes.getApprovals().values());
-    assertThat(approvals).hasSize(2);
-    assertThat(approvals.get(0).getLabel()).isEqualTo("Verified");
-    assertThat(approvals.get(0).getValue()).isEqualTo((short) 1);
-    assertThat(approvals.get(0).isPostSubmit()).isFalse();
-    assertThat(approvals.get(1).getLabel()).isEqualTo("Code-Review");
-    assertThat(approvals.get(1).getValue()).isEqualTo((short) 2);
-    assertThat(approvals.get(1).isPostSubmit()).isTrue();
-  }
-
-  @Test
-  public void approvalsDuringSubmit() throws Exception {
-    Change c = newChange();
-    RequestId submissionId = RequestId.forChange(c);
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.putApproval("Code-Review", (short) 1);
-    update.putApproval("Verified", (short) 1);
-    update.commit();
-
-    Account.Id ownerId = changeOwner.getAccountId();
-    Account.Id otherId = otherUser.getAccountId();
-    update = newUpdate(c, otherUser);
-    update.merge(
-        submissionId,
-        ImmutableList.of(
-            submitRecord(
-                "NOT_READY",
-                null,
-                submitLabel("Verified", "OK", ownerId),
-                submitLabel("Code-Review", "NEED", null))));
-    update.putApproval("Other-Label", (short) 1);
-    update.putApprovalFor(ownerId, "Code-Review", (short) 2);
-    update.commit();
-
-    update = newUpdate(c, otherUser);
-    update.putApproval("Other-Label", (short) 2);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-
-    List<PatchSetApproval> approvals = Lists.newArrayList(notes.getApprovals().values());
-    assertThat(approvals).hasSize(3);
-    assertThat(approvals.get(0).getAccountId()).isEqualTo(ownerId);
-    assertThat(approvals.get(0).getLabel()).isEqualTo("Verified");
-    assertThat(approvals.get(0).getValue()).isEqualTo(1);
-    assertThat(approvals.get(0).isPostSubmit()).isFalse();
-    assertThat(approvals.get(1).getAccountId()).isEqualTo(ownerId);
-    assertThat(approvals.get(1).getLabel()).isEqualTo("Code-Review");
-    assertThat(approvals.get(1).getValue()).isEqualTo(2);
-    assertThat(approvals.get(1).isPostSubmit()).isFalse(); // During submit.
-    assertThat(approvals.get(2).getAccountId()).isEqualTo(otherId);
-    assertThat(approvals.get(2).getLabel()).isEqualTo("Other-Label");
-    assertThat(approvals.get(2).getValue()).isEqualTo(2);
-    assertThat(approvals.get(2).isPostSubmit()).isTrue();
-  }
-
-  @Test
-  public void multipleReviewers() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.putReviewer(changeOwner.getAccount().getId(), REVIEWER);
-    update.putReviewer(otherUser.getAccount().getId(), REVIEWER);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    Timestamp ts = new Timestamp(update.getWhen().getTime());
-    assertThat(notes.getReviewers())
-        .isEqualTo(
-            ReviewerSet.fromTable(
-                ImmutableTable.<ReviewerStateInternal, Account.Id, Timestamp>builder()
-                    .put(REVIEWER, new Account.Id(1), ts)
-                    .put(REVIEWER, new Account.Id(2), ts)
-                    .build()));
-  }
-
-  @Test
-  public void reviewerTypes() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.putReviewer(changeOwner.getAccount().getId(), REVIEWER);
-    update.putReviewer(otherUser.getAccount().getId(), CC);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    Timestamp ts = new Timestamp(update.getWhen().getTime());
-    assertThat(notes.getReviewers())
-        .isEqualTo(
-            ReviewerSet.fromTable(
-                ImmutableTable.<ReviewerStateInternal, Account.Id, Timestamp>builder()
-                    .put(REVIEWER, new Account.Id(1), ts)
-                    .put(CC, new Account.Id(2), ts)
-                    .build()));
-  }
-
-  @Test
-  public void oneReviewerMultipleTypes() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.putReviewer(otherUser.getAccount().getId(), REVIEWER);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    Timestamp ts = new Timestamp(update.getWhen().getTime());
-    assertThat(notes.getReviewers())
-        .isEqualTo(ReviewerSet.fromTable(ImmutableTable.of(REVIEWER, new Account.Id(2), ts)));
-
-    update = newUpdate(c, otherUser);
-    update.putReviewer(otherUser.getAccount().getId(), CC);
-    update.commit();
-
-    notes = newNotes(c);
-    ts = new Timestamp(update.getWhen().getTime());
-    assertThat(notes.getReviewers())
-        .isEqualTo(ReviewerSet.fromTable(ImmutableTable.of(CC, new Account.Id(2), ts)));
-  }
-
-  @Test
-  public void removeReviewer() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.putReviewer(otherUser.getAccount().getId(), REVIEWER);
-    update.commit();
-
-    update = newUpdate(c, changeOwner);
-    update.putApproval("Code-Review", (short) 1);
-    update.commit();
-
-    update = newUpdate(c, otherUser);
-    update.putApproval("Code-Review", (short) 1);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    List<PatchSetApproval> psas = notes.getApprovals().get(c.currentPatchSetId());
-    assertThat(psas).hasSize(2);
-    assertThat(psas.get(0).getAccountId()).isEqualTo(changeOwner.getAccount().getId());
-    assertThat(psas.get(1).getAccountId()).isEqualTo(otherUser.getAccount().getId());
-
-    update = newUpdate(c, changeOwner);
-    update.removeReviewer(otherUser.getAccount().getId());
-    update.commit();
-
-    notes = newNotes(c);
-    psas = notes.getApprovals().get(c.currentPatchSetId());
-    assertThat(psas).hasSize(1);
-    assertThat(psas.get(0).getAccountId()).isEqualTo(changeOwner.getAccount().getId());
-  }
-
-  @Test
-  public void submitRecords() throws Exception {
-    Change c = newChange();
-    RequestId submissionId = RequestId.forChange(c);
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setSubjectForCommit("Submit patch set 1");
-
-    update.merge(
-        submissionId,
-        ImmutableList.of(
-            submitRecord(
-                "NOT_READY",
-                null,
-                submitLabel("Verified", "OK", changeOwner.getAccountId()),
-                submitLabel("Code-Review", "NEED", null)),
-            submitRecord(
-                "NOT_READY",
-                null,
-                submitLabel("Verified", "OK", changeOwner.getAccountId()),
-                submitLabel("Alternative-Code-Review", "NEED", null))));
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    List<SubmitRecord> recs = notes.getSubmitRecords();
-    assertThat(recs).hasSize(2);
-    assertThat(recs.get(0))
-        .isEqualTo(
-            submitRecord(
-                "NOT_READY",
-                null,
-                submitLabel("Verified", "OK", changeOwner.getAccountId()),
-                submitLabel("Code-Review", "NEED", null)));
-    assertThat(recs.get(1))
-        .isEqualTo(
-            submitRecord(
-                "NOT_READY",
-                null,
-                submitLabel("Verified", "OK", changeOwner.getAccountId()),
-                submitLabel("Alternative-Code-Review", "NEED", null)));
-    assertThat(notes.getChange().getSubmissionId()).isEqualTo(submissionId.toStringForStorage());
-  }
-
-  @Test
-  public void latestSubmitRecordsOnly() throws Exception {
-    Change c = newChange();
-    RequestId submissionId = RequestId.forChange(c);
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setSubjectForCommit("Submit patch set 1");
-    update.merge(
-        submissionId,
-        ImmutableList.of(
-            submitRecord("OK", null, submitLabel("Code-Review", "OK", otherUser.getAccountId()))));
-    update.commit();
-
-    incrementPatchSet(c);
-    update = newUpdate(c, changeOwner);
-    update.setSubjectForCommit("Submit patch set 2");
-    update.merge(
-        submissionId,
-        ImmutableList.of(
-            submitRecord(
-                "OK", null, submitLabel("Code-Review", "OK", changeOwner.getAccountId()))));
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getSubmitRecords())
-        .containsExactly(
-            submitRecord("OK", null, submitLabel("Code-Review", "OK", changeOwner.getAccountId())));
-    assertThat(notes.getChange().getSubmissionId()).isEqualTo(submissionId.toStringForStorage());
-  }
-
-  @Test
-  public void emptyChangeUpdate() throws Exception {
-    Change c = newChange();
-    Ref initial = repo.exactRef(changeMetaRef(c.getId()));
-    assertThat(initial).isNotNull();
-
-    // Empty update doesn't create a new commit.
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.commit();
-    assertThat(update.getResult()).isNull();
-
-    Ref updated = repo.exactRef(changeMetaRef(c.getId()));
-    assertThat(updated.getObjectId()).isEqualTo(initial.getObjectId());
-  }
-
-  @Test
-  public void assigneeCommit() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setAssignee(otherUserId);
-    ObjectId result = update.commit();
-    assertThat(result).isNotNull();
-    try (RevWalk rw = new RevWalk(repo)) {
-      RevCommit commit = rw.parseCommit(update.getResult());
-      rw.parseBody(commit);
-      String strIdent = otherUser.getName() + " <" + otherUserId + "@" + serverId + ">";
-      assertThat(commit.getFullMessage()).contains("Assignee: " + strIdent);
-    }
-  }
-
-  @Test
-  public void assigneeChangeNotes() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setAssignee(otherUserId);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getChange().getAssignee()).isEqualTo(otherUserId);
-
-    update = newUpdate(c, changeOwner);
-    update.setAssignee(changeOwner.getAccountId());
-    update.commit();
-
-    notes = newNotes(c);
-    assertThat(notes.getChange().getAssignee()).isEqualTo(changeOwner.getAccountId());
-  }
-
-  @Test
-  public void pastAssigneesChangeNotes() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setAssignee(otherUserId);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-
-    update = newUpdate(c, changeOwner);
-    update.setAssignee(changeOwner.getAccountId());
-    update.commit();
-
-    update = newUpdate(c, changeOwner);
-    update.setAssignee(otherUserId);
-    update.commit();
-
-    update = newUpdate(c, changeOwner);
-    update.removeAssignee();
-    update.commit();
-
-    notes = newNotes(c);
-    assertThat(notes.getPastAssignees()).hasSize(2);
-  }
-
-  @Test
-  public void hashtagCommit() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    LinkedHashSet<String> hashtags = new LinkedHashSet<>();
-    hashtags.add("tag1");
-    hashtags.add("tag2");
-    update.setHashtags(hashtags);
-    update.commit();
-    try (RevWalk walk = new RevWalk(repo)) {
-      RevCommit commit = walk.parseCommit(update.getResult());
-      walk.parseBody(commit);
-      assertThat(commit.getFullMessage()).contains("Hashtags: tag1,tag2\n");
-    }
-  }
-
-  @Test
-  public void hashtagChangeNotes() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    LinkedHashSet<String> hashtags = new LinkedHashSet<>();
-    hashtags.add("tag1");
-    hashtags.add("tag2");
-    update.setHashtags(hashtags);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getHashtags()).isEqualTo(hashtags);
-  }
-
-  @Test
-  public void topicChangeNotes() throws Exception {
-    Change c = newChange();
-
-    // initially topic is not set
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getChange().getTopic()).isNull();
-
-    // set topic
-    String topic = "myTopic";
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setTopic(topic);
-    update.commit();
-    notes = newNotes(c);
-    assertThat(notes.getChange().getTopic()).isEqualTo(topic);
-
-    // clear topic by setting empty string
-    update = newUpdate(c, changeOwner);
-    update.setTopic("");
-    update.commit();
-    notes = newNotes(c);
-    assertThat(notes.getChange().getTopic()).isNull();
-
-    // set other topic
-    topic = "otherTopic";
-    update = newUpdate(c, changeOwner);
-    update.setTopic(topic);
-    update.commit();
-    notes = newNotes(c);
-    assertThat(notes.getChange().getTopic()).isEqualTo(topic);
-
-    // clear topic by setting null
-    update = newUpdate(c, changeOwner);
-    update.setTopic(null);
-    update.commit();
-    notes = newNotes(c);
-    assertThat(notes.getChange().getTopic()).isNull();
-  }
-
-  @Test
-  public void changeIdChangeNotes() throws Exception {
-    Change c = newChange();
-
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getChange().getKey()).isEqualTo(c.getKey());
-
-    // An update doesn't affect the Change-Id
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setTopic("topic"); // Change something to get a new commit.
-    update.commit();
-    assertThat(notes.getChange().getKey()).isEqualTo(c.getKey());
-
-    // Trying to set another Change-Id fails
-    String otherChangeId = "I577fb248e474018276351785930358ec0450e9f7";
-    update = newUpdate(c, changeOwner);
-    exception.expect(IllegalArgumentException.class);
-    exception.expectMessage(
-        "The Change-Id was already set to "
-            + c.getKey()
-            + ", so we cannot set this Change-Id: "
-            + otherChangeId);
-    update.setChangeId(otherChangeId);
-  }
-
-  @Test
-  public void branchChangeNotes() throws Exception {
-    Change c = newChange();
-
-    ChangeNotes notes = newNotes(c);
-    Branch.NameKey expectedBranch = new Branch.NameKey(project, "refs/heads/master");
-    assertThat(notes.getChange().getDest()).isEqualTo(expectedBranch);
-
-    // An update doesn't affect the branch
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setTopic("topic"); // Change something to get a new commit.
-    update.commit();
-    assertThat(newNotes(c).getChange().getDest()).isEqualTo(expectedBranch);
-
-    // Set another branch
-    String otherBranch = "refs/heads/stable";
-    update = newUpdate(c, changeOwner);
-    update.setBranch(otherBranch);
-    update.commit();
-    assertThat(newNotes(c).getChange().getDest())
-        .isEqualTo(new Branch.NameKey(project, otherBranch));
-  }
-
-  @Test
-  public void ownerChangeNotes() throws Exception {
-    Change c = newChange();
-
-    assertThat(newNotes(c).getChange().getOwner()).isEqualTo(changeOwner.getAccountId());
-
-    // An update doesn't affect the owner
-    ChangeUpdate update = newUpdate(c, otherUser);
-    update.setTopic("topic"); // Change something to get a new commit.
-    update.commit();
-    assertThat(newNotes(c).getChange().getOwner()).isEqualTo(changeOwner.getAccountId());
-  }
-
-  @Test
-  public void createdOnChangeNotes() throws Exception {
-    Change c = newChange();
-
-    Timestamp createdOn = newNotes(c).getChange().getCreatedOn();
-    assertThat(createdOn).isNotNull();
-
-    // An update doesn't affect the createdOn timestamp.
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setTopic("topic"); // Change something to get a new commit.
-    update.commit();
-    assertThat(newNotes(c).getChange().getCreatedOn()).isEqualTo(createdOn);
-  }
-
-  @Test
-  public void lastUpdatedOnChangeNotes() throws Exception {
-    Change c = newChange();
-
-    ChangeNotes notes = newNotes(c);
-    Timestamp ts1 = notes.getChange().getLastUpdatedOn();
-    assertThat(ts1).isEqualTo(notes.getChange().getCreatedOn());
-
-    // Various kinds of updates that update the timestamp.
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setTopic("topic"); // Change something to get a new commit.
-    update.commit();
-    Timestamp ts2 = newNotes(c).getChange().getLastUpdatedOn();
-    assertThat(ts2).isGreaterThan(ts1);
-
-    update = newUpdate(c, changeOwner);
-    update.setChangeMessage("Some message");
-    update.commit();
-    Timestamp ts3 = newNotes(c).getChange().getLastUpdatedOn();
-    assertThat(ts3).isGreaterThan(ts2);
-
-    update = newUpdate(c, changeOwner);
-    update.setHashtags(ImmutableSet.of("foo"));
-    update.commit();
-    Timestamp ts4 = newNotes(c).getChange().getLastUpdatedOn();
-    assertThat(ts4).isGreaterThan(ts3);
-
-    incrementPatchSet(c);
-    Timestamp ts5 = newNotes(c).getChange().getLastUpdatedOn();
-    assertThat(ts5).isGreaterThan(ts4);
-
-    update = newUpdate(c, changeOwner);
-    update.putApproval("Code-Review", (short) 1);
-    update.commit();
-    Timestamp ts6 = newNotes(c).getChange().getLastUpdatedOn();
-    assertThat(ts6).isGreaterThan(ts5);
-
-    update = newUpdate(c, changeOwner);
-    update.setStatus(Change.Status.ABANDONED);
-    update.commit();
-    Timestamp ts7 = newNotes(c).getChange().getLastUpdatedOn();
-    assertThat(ts7).isGreaterThan(ts6);
-
-    update = newUpdate(c, changeOwner);
-    update.putReviewer(otherUser.getAccountId(), ReviewerStateInternal.REVIEWER);
-    update.commit();
-    Timestamp ts8 = newNotes(c).getChange().getLastUpdatedOn();
-    assertThat(ts8).isGreaterThan(ts7);
-
-    update = newUpdate(c, changeOwner);
-    update.setGroups(ImmutableList.of("a", "b"));
-    update.commit();
-    Timestamp ts9 = newNotes(c).getChange().getLastUpdatedOn();
-    assertThat(ts9).isGreaterThan(ts8);
-
-    // Finish off by merging the change.
-    update = newUpdate(c, changeOwner);
-    update.merge(
-        RequestId.forChange(c),
-        ImmutableList.of(
-            submitRecord(
-                "NOT_READY",
-                null,
-                submitLabel("Verified", "OK", changeOwner.getAccountId()),
-                submitLabel("Alternative-Code-Review", "NEED", null))));
-    update.commit();
-    Timestamp ts10 = newNotes(c).getChange().getLastUpdatedOn();
-    assertThat(ts10).isGreaterThan(ts9);
-  }
-
-  @Test
-  public void subjectLeadingWhitespaceChangeNotes() throws Exception {
-    Change c = TestChanges.newChange(project, changeOwner.getAccountId());
-    String trimmedSubj = c.getSubject();
-    c.setCurrentPatchSet(c.currentPatchSetId(), "  " + trimmedSubj, c.getOriginalSubject());
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setChangeId(c.getKey().get());
-    update.setBranch(c.getDest().get());
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getChange().getSubject()).isEqualTo(trimmedSubj);
-
-    String tabSubj = "\t\t" + trimmedSubj;
-
-    c = TestChanges.newChange(project, changeOwner.getAccountId());
-    c.setCurrentPatchSet(c.currentPatchSetId(), tabSubj, c.getOriginalSubject());
-    update = newUpdate(c, changeOwner);
-    update.setChangeId(c.getKey().get());
-    update.setBranch(c.getDest().get());
-    update.commit();
-
-    notes = newNotes(c);
-    assertThat(notes.getChange().getSubject()).isEqualTo(tabSubj);
-  }
-
-  @Test
-  public void commitChangeNotesUnique() throws Exception {
-    // PatchSetId -> RevId must be a one to one mapping
-    Change c = newChange();
-
-    ChangeNotes notes = newNotes(c);
-    PatchSet ps = notes.getCurrentPatchSet();
-    assertThat(ps).isNotNull();
-
-    // new revId for the same patch set, ps1
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    RevCommit commit = tr.commit().message("PS1 again").create();
-    update.setCommit(rw, commit);
-    update.commit();
-
-    try {
-      notes = newNotes(c);
-      fail("Expected IOException");
-    } catch (OrmException e) {
-      assertCause(
-          e,
-          ConfigInvalidException.class,
-          "Multiple revisions parsed for patch set 1:"
-              + " RevId{"
-              + commit.name()
-              + "} and "
-              + ps.getRevision().get());
-    }
-  }
-
-  @Test
-  public void patchSetChangeNotes() throws Exception {
-    Change c = newChange();
-
-    // ps1 created by newChange()
-    ChangeNotes notes = newNotes(c);
-    PatchSet ps1 = notes.getCurrentPatchSet();
-    assertThat(notes.getChange().currentPatchSetId()).isEqualTo(ps1.getId());
-    assertThat(notes.getChange().getSubject()).isEqualTo("Change subject");
-    assertThat(notes.getChange().getOriginalSubject()).isEqualTo("Change subject");
-    assertThat(ps1.getId()).isEqualTo(new PatchSet.Id(c.getId(), 1));
-    assertThat(ps1.getUploader()).isEqualTo(changeOwner.getAccountId());
-
-    // ps2 by other user
-    RevCommit commit = incrementPatchSet(c, otherUser);
-    notes = newNotes(c);
-    PatchSet ps2 = notes.getCurrentPatchSet();
-    assertThat(ps2.getId()).isEqualTo(new PatchSet.Id(c.getId(), 2));
-    assertThat(notes.getChange().getSubject()).isEqualTo("PS2");
-    assertThat(notes.getChange().getOriginalSubject()).isEqualTo("Change subject");
-    assertThat(notes.getChange().currentPatchSetId()).isEqualTo(ps2.getId());
-    assertThat(ps2.getRevision().get()).isNotEqualTo(ps1.getRevision());
-    assertThat(ps2.getRevision().get()).isEqualTo(commit.name());
-    assertThat(ps2.getUploader()).isEqualTo(otherUser.getAccountId());
-    assertThat(ps2.getCreatedOn()).isEqualTo(notes.getChange().getLastUpdatedOn());
-
-    // comment on ps1, current patch set is still ps2
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setPatchSetId(ps1.getId());
-    update.setChangeMessage("Comment on old patch set.");
-    update.commit();
-    notes = newNotes(c);
-    assertThat(notes.getChange().currentPatchSetId()).isEqualTo(ps2.getId());
-  }
-
-  @Test
-  public void patchSetStates() throws Exception {
-    Change c = newChange();
-    PatchSet.Id psId1 = c.currentPatchSetId();
-
-    incrementCurrentPatchSetFieldOnly(c);
-    PatchSet.Id psId2 = c.currentPatchSetId();
-    RevCommit commit = tr.commit().message("PS2").create();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setCommit(rw, commit);
-    update.putApproval("Code-Review", (short) 1);
-    update.setChangeMessage("This is a message");
-    update.putComment(
-        Status.PUBLISHED,
-        newComment(
-            c.currentPatchSetId(),
-            "a.txt",
-            "uuid1",
-            new CommentRange(1, 2, 3, 4),
-            1,
-            changeOwner,
-            null,
-            TimeUtil.nowTs(),
-            "Comment",
-            (short) 1,
-            commit.name(),
-            false));
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getPatchSets().keySet()).containsExactly(psId1, psId2);
-    assertThat(notes.getApprovals()).isNotEmpty();
-    assertThat(notes.getChangeMessagesByPatchSet()).isNotEmpty();
-    assertThat(notes.getChangeMessages()).isNotEmpty();
-    assertThat(notes.getComments()).isNotEmpty();
-
-    // publish ps2
-    update = newUpdate(c, changeOwner);
-    update.setPatchSetState(PatchSetState.PUBLISHED);
-    update.commit();
-
-    // delete ps2
-    update = newUpdate(c, changeOwner);
-    update.setPatchSetState(PatchSetState.DELETED);
-    update.commit();
-
-    notes = newNotes(c);
-    assertThat(notes.getPatchSets().keySet()).containsExactly(psId1);
-    assertThat(notes.getApprovals()).isEmpty();
-    assertThat(notes.getChangeMessagesByPatchSet()).isEmpty();
-    assertThat(notes.getChangeMessages()).isEmpty();
-    assertThat(notes.getComments()).isEmpty();
-  }
-
-  @Test
-  public void patchSetGroups() throws Exception {
-    Change c = newChange();
-    PatchSet.Id psId1 = c.currentPatchSetId();
-
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getPatchSets().get(psId1).getGroups()).isEmpty();
-
-    // ps1
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setGroups(ImmutableList.of("a", "b"));
-    update.commit();
-    notes = newNotes(c);
-    assertThat(notes.getPatchSets().get(psId1).getGroups()).containsExactly("a", "b").inOrder();
-
-    incrementCurrentPatchSetFieldOnly(c);
-    PatchSet.Id psId2 = c.currentPatchSetId();
-    update = newUpdate(c, changeOwner);
-    update.setCommit(rw, tr.commit().message("PS2").create());
-    update.setGroups(ImmutableList.of("d"));
-    update.commit();
-    notes = newNotes(c);
-    assertThat(notes.getPatchSets().get(psId2).getGroups()).containsExactly("d");
-    assertThat(notes.getPatchSets().get(psId1).getGroups()).containsExactly("a", "b").inOrder();
-  }
-
-  @Test
-  public void pushCertificate() throws Exception {
-    String pushCert =
-        "certificate version 0.1\n"
-            + "pusher This is not a real push cert\n"
-            + "-----BEGIN PGP SIGNATURE-----\n"
-            + "Version: GnuPG v1\n"
-            + "\n"
-            + "Nor is this a real signature.\n"
-            + "-----END PGP SIGNATURE-----\n";
-
-    // ps2 with push cert
-    Change c = newChange();
-    PatchSet.Id psId1 = c.currentPatchSetId();
-    incrementCurrentPatchSetFieldOnly(c);
-    PatchSet.Id psId2 = c.currentPatchSetId();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setPatchSetId(psId2);
-    RevCommit commit = tr.commit().message("PS2").create();
-    update.setCommit(rw, commit, pushCert);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    String note = readNote(notes, commit);
-    if (!testJson()) {
-      assertThat(note).isEqualTo(pushCert);
-    }
-    Map<PatchSet.Id, PatchSet> patchSets = notes.getPatchSets();
-    assertThat(patchSets.get(psId1).getPushCertificate()).isNull();
-    assertThat(patchSets.get(psId2).getPushCertificate()).isEqualTo(pushCert);
-    assertThat(notes.getComments()).isEmpty();
-
-    // comment on ps2
-    update = newUpdate(c, changeOwner);
-    update.setPatchSetId(psId2);
-    Timestamp ts = TimeUtil.nowTs();
-    update.putComment(
-        Status.PUBLISHED,
-        newComment(
-            psId2,
-            "a.txt",
-            "uuid1",
-            new CommentRange(1, 2, 3, 4),
-            1,
-            changeOwner,
-            null,
-            ts,
-            "Comment",
-            (short) 1,
-            commit.name(),
-            false));
-    update.commit();
-
-    notes = newNotes(c);
-
-    patchSets = notes.getPatchSets();
-    assertThat(patchSets.get(psId1).getPushCertificate()).isNull();
-    assertThat(patchSets.get(psId2).getPushCertificate()).isEqualTo(pushCert);
-    assertThat(notes.getComments()).isNotEmpty();
-
-    if (!testJson()) {
-      assertThat(readNote(notes, commit))
-          .isEqualTo(
-              pushCert
-                  + "Revision: "
-                  + commit.name()
-                  + "\n"
-                  + "Patch-set: 2\n"
-                  + "File: a.txt\n"
-                  + "\n"
-                  + "1:2-3:4\n"
-                  + ChangeNoteUtil.formatTime(serverIdent, ts)
-                  + "\n"
-                  + "Author: Change Owner <1@gerrit>\n"
-                  + "Unresolved: false\n"
-                  + "UUID: uuid1\n"
-                  + "Bytes: 7\n"
-                  + "Comment\n"
-                  + "\n");
-    }
-  }
-
-  @Test
-  public void emptyExceptSubject() throws Exception {
-    ChangeUpdate update = newUpdate(newChange(), changeOwner);
-    update.setSubjectForCommit("Create change");
-    assertThat(update.commit()).isNotNull();
-  }
-
-  @Test
-  public void multipleUpdatesInManager() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update1 = newUpdate(c, changeOwner);
-    update1.putApproval("Verified", (short) 1);
-
-    ChangeUpdate update2 = newUpdate(c, otherUser);
-    update2.putApproval("Code-Review", (short) 2);
-
-    try (NoteDbUpdateManager updateManager = updateManagerFactory.create(project)) {
-      updateManager.add(update1);
-      updateManager.add(update2);
-      updateManager.execute();
-    }
-
-    ChangeNotes notes = newNotes(c);
-    List<PatchSetApproval> psas = notes.getApprovals().get(c.currentPatchSetId());
-    assertThat(psas).hasSize(2);
-
-    assertThat(psas.get(0).getAccountId()).isEqualTo(changeOwner.getAccount().getId());
-    assertThat(psas.get(0).getLabel()).isEqualTo("Verified");
-    assertThat(psas.get(0).getValue()).isEqualTo((short) 1);
-
-    assertThat(psas.get(1).getAccountId()).isEqualTo(otherUser.getAccount().getId());
-    assertThat(psas.get(1).getLabel()).isEqualTo("Code-Review");
-    assertThat(psas.get(1).getValue()).isEqualTo((short) 2);
-  }
-
-  @Test
-  public void multipleUpdatesIncludingComments() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update1 = newUpdate(c, otherUser);
-    String uuid1 = "uuid1";
-    String message1 = "comment 1";
-    CommentRange range1 = new CommentRange(1, 1, 2, 1);
-    Timestamp time1 = TimeUtil.nowTs();
-    PatchSet.Id psId = c.currentPatchSetId();
-    RevCommit tipCommit;
-    try (NoteDbUpdateManager updateManager = updateManagerFactory.create(project)) {
-      Comment comment1 =
-          newComment(
-              psId,
-              "file1",
-              uuid1,
-              range1,
-              range1.getEndLine(),
-              otherUser,
-              null,
-              time1,
-              message1,
-              (short) 0,
-              "abcd1234abcd1234abcd1234abcd1234abcd1234",
-              false);
-      update1.setPatchSetId(psId);
-      update1.putComment(Status.PUBLISHED, comment1);
-      updateManager.add(update1);
-
-      ChangeUpdate update2 = newUpdate(c, otherUser);
-      update2.putApproval("Code-Review", (short) 2);
-      updateManager.add(update2);
-
-      updateManager.execute();
-    }
-
-    ChangeNotes notes = newNotes(c);
-    ObjectId tip = notes.getRevision();
-    tipCommit = rw.parseCommit(tip);
-
-    RevCommit commitWithApprovals = tipCommit;
-    assertThat(commitWithApprovals).isNotNull();
-    RevCommit commitWithComments = commitWithApprovals.getParent(0);
-    assertThat(commitWithComments).isNotNull();
-
-    try (ChangeNotesRevWalk rw = ChangeNotesCommit.newRevWalk(repo)) {
-      ChangeNotesParser notesWithComments =
-          new ChangeNotesParser(c.getId(), commitWithComments.copy(), rw, noteUtil, args.metrics);
-      ChangeNotesState state = notesWithComments.parseAll();
-      assertThat(state.approvals()).isEmpty();
-      assertThat(state.publishedComments()).hasSize(1);
-    }
-
-    try (ChangeNotesRevWalk rw = ChangeNotesCommit.newRevWalk(repo)) {
-      ChangeNotesParser notesWithApprovals =
-          new ChangeNotesParser(c.getId(), commitWithApprovals.copy(), rw, noteUtil, args.metrics);
-      ChangeNotesState state = notesWithApprovals.parseAll();
-      assertThat(state.approvals()).hasSize(1);
-      assertThat(state.publishedComments()).hasSize(1);
-    }
-  }
-
-  @Test
-  public void multipleUpdatesAcrossRefs() throws Exception {
-    Change c1 = newChange();
-    ChangeUpdate update1 = newUpdate(c1, changeOwner);
-    update1.putApproval("Verified", (short) 1);
-
-    Change c2 = newChange();
-    ChangeUpdate update2 = newUpdate(c2, otherUser);
-    update2.putApproval("Code-Review", (short) 2);
-
-    Ref initial1 = repo.exactRef(update1.getRefName());
-    assertThat(initial1).isNotNull();
-    Ref initial2 = repo.exactRef(update2.getRefName());
-    assertThat(initial2).isNotNull();
-
-    try (NoteDbUpdateManager updateManager = updateManagerFactory.create(project)) {
-      updateManager.add(update1);
-      updateManager.add(update2);
-      updateManager.execute();
-    }
-
-    Ref ref1 = repo.exactRef(update1.getRefName());
-    assertThat(ref1.getObjectId()).isEqualTo(update1.getResult());
-    assertThat(ref1.getObjectId()).isNotEqualTo(initial1.getObjectId());
-    Ref ref2 = repo.exactRef(update2.getRefName());
-    assertThat(ref2.getObjectId()).isEqualTo(update2.getResult());
-    assertThat(ref2.getObjectId()).isNotEqualTo(initial2.getObjectId());
-
-    PatchSetApproval approval1 =
-        newNotes(c1).getApprovals().get(c1.currentPatchSetId()).iterator().next();
-    assertThat(approval1.getLabel()).isEqualTo("Verified");
-
-    PatchSetApproval approval2 =
-        newNotes(c2).getApprovals().get(c2.currentPatchSetId()).iterator().next();
-    assertThat(approval2.getLabel()).isEqualTo("Code-Review");
-  }
-
-  @Test
-  public void changeMessageOnePatchSet() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.putReviewer(changeOwner.getAccount().getId(), REVIEWER);
-    update.setChangeMessage("Just a little code change.\n");
-    update.commit();
-    PatchSet.Id ps1 = c.currentPatchSetId();
-
-    ChangeNotes notes = newNotes(c);
-    ListMultimap<PatchSet.Id, ChangeMessage> changeMessages = notes.getChangeMessagesByPatchSet();
-    assertThat(changeMessages.keySet()).containsExactly(ps1);
-
-    ChangeMessage cm = Iterables.getOnlyElement(changeMessages.get(ps1));
-    assertThat(cm.getMessage()).isEqualTo("Just a little code change.\n");
-    assertThat(cm.getAuthor()).isEqualTo(changeOwner.getAccount().getId());
-    assertThat(cm.getPatchSetId()).isEqualTo(ps1);
-  }
-
-  @Test
-  public void noChangeMessage() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.putReviewer(changeOwner.getAccount().getId(), REVIEWER);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getChangeMessages()).isEmpty();
-  }
-
-  @Test
-  public void changeMessageWithTrailingDoubleNewline() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setChangeMessage("Testing trailing double newline\n\n");
-    update.commit();
-    PatchSet.Id ps1 = c.currentPatchSetId();
-
-    ChangeNotes notes = newNotes(c);
-    ListMultimap<PatchSet.Id, ChangeMessage> changeMessages = notes.getChangeMessagesByPatchSet();
-    assertThat(changeMessages).hasSize(1);
-
-    ChangeMessage cm1 = Iterables.getOnlyElement(changeMessages.get(ps1));
-    assertThat(cm1.getMessage()).isEqualTo("Testing trailing double newline\n\n");
-    assertThat(cm1.getAuthor()).isEqualTo(changeOwner.getAccount().getId());
-  }
-
-  @Test
-  public void changeMessageWithMultipleParagraphs() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setChangeMessage("Testing paragraph 1\n\nTesting paragraph 2\n\nTesting paragraph 3");
-    update.commit();
-    PatchSet.Id ps1 = c.currentPatchSetId();
-
-    ChangeNotes notes = newNotes(c);
-    ListMultimap<PatchSet.Id, ChangeMessage> changeMessages = notes.getChangeMessagesByPatchSet();
-    assertThat(changeMessages).hasSize(1);
-
-    ChangeMessage cm1 = Iterables.getOnlyElement(changeMessages.get(ps1));
-    assertThat(cm1.getMessage())
-        .isEqualTo(
-            "Testing paragraph 1\n"
-                + "\n"
-                + "Testing paragraph 2\n"
-                + "\n"
-                + "Testing paragraph 3");
-    assertThat(cm1.getAuthor()).isEqualTo(changeOwner.getAccount().getId());
-  }
-
-  @Test
-  public void changeMessagesMultiplePatchSets() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.putReviewer(changeOwner.getAccount().getId(), REVIEWER);
-    update.setChangeMessage("This is the change message for the first PS.");
-    update.commit();
-    PatchSet.Id ps1 = c.currentPatchSetId();
-
-    incrementPatchSet(c);
-    update = newUpdate(c, changeOwner);
-
-    update.setChangeMessage("This is the change message for the second PS.");
-    update.commit();
-    PatchSet.Id ps2 = c.currentPatchSetId();
-
-    ChangeNotes notes = newNotes(c);
-    ListMultimap<PatchSet.Id, ChangeMessage> changeMessages = notes.getChangeMessagesByPatchSet();
-    assertThat(changeMessages).hasSize(2);
-
-    ChangeMessage cm1 = Iterables.getOnlyElement(changeMessages.get(ps1));
-    assertThat(cm1.getMessage()).isEqualTo("This is the change message for the first PS.");
-    assertThat(cm1.getAuthor()).isEqualTo(changeOwner.getAccount().getId());
-
-    ChangeMessage cm2 = Iterables.getOnlyElement(changeMessages.get(ps2));
-    assertThat(cm1.getPatchSetId()).isEqualTo(ps1);
-    assertThat(cm2.getMessage()).isEqualTo("This is the change message for the second PS.");
-    assertThat(cm2.getAuthor()).isEqualTo(changeOwner.getAccount().getId());
-    assertThat(cm2.getPatchSetId()).isEqualTo(ps2);
-  }
-
-  @Test
-  public void changeMessageMultipleInOnePatchSet() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.putReviewer(changeOwner.getAccount().getId(), REVIEWER);
-    update.setChangeMessage("First change message.\n");
-    update.commit();
-
-    PatchSet.Id ps1 = c.currentPatchSetId();
-
-    update = newUpdate(c, changeOwner);
-    update.putReviewer(changeOwner.getAccount().getId(), REVIEWER);
-    update.setChangeMessage("Second change message.\n");
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    ListMultimap<PatchSet.Id, ChangeMessage> changeMessages = notes.getChangeMessagesByPatchSet();
-    assertThat(changeMessages.keySet()).hasSize(1);
-
-    List<ChangeMessage> cm = changeMessages.get(ps1);
-    assertThat(cm).hasSize(2);
-    assertThat(cm.get(0).getMessage()).isEqualTo("First change message.\n");
-    assertThat(cm.get(0).getAuthor()).isEqualTo(changeOwner.getAccount().getId());
-    assertThat(cm.get(0).getPatchSetId()).isEqualTo(ps1);
-    assertThat(cm.get(1).getMessage()).isEqualTo("Second change message.\n");
-    assertThat(cm.get(1).getAuthor()).isEqualTo(changeOwner.getAccount().getId());
-    assertThat(cm.get(1).getPatchSetId()).isEqualTo(ps1);
-  }
-
-  @Test
-  public void patchLineCommentsFileComment() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, otherUser);
-    PatchSet.Id psId = c.currentPatchSetId();
-    RevId revId = new RevId("abcd1234abcd1234abcd1234abcd1234abcd1234");
-
-    Comment comment =
-        newComment(
-            psId,
-            "file1",
-            "uuid",
-            null,
-            0,
-            otherUser,
-            null,
-            TimeUtil.nowTs(),
-            "message",
-            (short) 1,
-            revId.get(),
-            false);
-    update.setPatchSetId(psId);
-    update.putComment(Status.PUBLISHED, comment);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getComments()).isEqualTo(ImmutableListMultimap.of(revId, comment));
-  }
-
-  @Test
-  public void patchLineCommentsZeroColumns() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, otherUser);
-    PatchSet.Id psId = c.currentPatchSetId();
-    RevId revId = new RevId("abcd1234abcd1234abcd1234abcd1234abcd1234");
-    CommentRange range = new CommentRange(1, 0, 2, 0);
-
-    Comment comment =
-        newComment(
-            psId,
-            "file1",
-            "uuid",
-            range,
-            range.getEndLine(),
-            otherUser,
-            null,
-            TimeUtil.nowTs(),
-            "message",
-            (short) 1,
-            revId.get(),
-            false);
-    update.setPatchSetId(psId);
-    update.putComment(Status.PUBLISHED, comment);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getComments()).isEqualTo(ImmutableListMultimap.of(revId, comment));
-  }
-
-  @Test
-  public void patchLineCommentZeroRange() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, otherUser);
-    PatchSet.Id psId = c.currentPatchSetId();
-    RevId revId = new RevId("abcd1234abcd1234abcd1234abcd1234abcd1234");
-    CommentRange range = new CommentRange(0, 0, 0, 0);
-
-    Comment comment =
-        newComment(
-            psId,
-            "file",
-            "uuid",
-            range,
-            range.getEndLine(),
-            otherUser,
-            null,
-            TimeUtil.nowTs(),
-            "message",
-            (short) 1,
-            revId.get(),
-            false);
-    update.setPatchSetId(psId);
-    update.putComment(Status.PUBLISHED, comment);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getComments()).isEqualTo(ImmutableListMultimap.of(revId, comment));
-  }
-
-  @Test
-  public void patchLineCommentEmptyFilename() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, otherUser);
-    PatchSet.Id psId = c.currentPatchSetId();
-    RevId revId = new RevId("abcd1234abcd1234abcd1234abcd1234abcd1234");
-    CommentRange range = new CommentRange(1, 2, 3, 4);
-
-    Comment comment =
-        newComment(
-            psId,
-            "",
-            "uuid",
-            range,
-            range.getEndLine(),
-            otherUser,
-            null,
-            TimeUtil.nowTs(),
-            "message",
-            (short) 1,
-            revId.get(),
-            false);
-    update.setPatchSetId(psId);
-    update.putComment(Status.PUBLISHED, comment);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getComments()).isEqualTo(ImmutableListMultimap.of(revId, comment));
-  }
-
-  @Test
-  public void patchLineCommentNotesFormatSide1() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, otherUser);
-    String uuid1 = "uuid1";
-    String uuid2 = "uuid2";
-    String uuid3 = "uuid3";
-    String message1 = "comment 1";
-    String message2 = "comment 2";
-    String message3 = "comment 3";
-    CommentRange range1 = new CommentRange(1, 1, 2, 1);
-    Timestamp time1 = TimeUtil.nowTs();
-    Timestamp time2 = TimeUtil.nowTs();
-    Timestamp time3 = TimeUtil.nowTs();
-    PatchSet.Id psId = c.currentPatchSetId();
-
-    Comment comment1 =
-        newComment(
-            psId,
-            "file1",
-            uuid1,
-            range1,
-            range1.getEndLine(),
-            otherUser,
-            null,
-            time1,
-            message1,
-            (short) 1,
-            "abcd1234abcd1234abcd1234abcd1234abcd1234",
-            false);
-    update.setPatchSetId(psId);
-    update.putComment(Status.PUBLISHED, comment1);
-    update.commit();
-
-    update = newUpdate(c, otherUser);
-    CommentRange range2 = new CommentRange(2, 1, 3, 1);
-    Comment comment2 =
-        newComment(
-            psId,
-            "file1",
-            uuid2,
-            range2,
-            range2.getEndLine(),
-            otherUser,
-            null,
-            time2,
-            message2,
-            (short) 1,
-            "abcd1234abcd1234abcd1234abcd1234abcd1234",
-            false);
-    update.setPatchSetId(psId);
-    update.putComment(Status.PUBLISHED, comment2);
-    update.commit();
-
-    update = newUpdate(c, otherUser);
-    CommentRange range3 = new CommentRange(3, 0, 4, 1);
-    Comment comment3 =
-        newComment(
-            psId,
-            "file2",
-            uuid3,
-            range3,
-            range3.getEndLine(),
-            otherUser,
-            null,
-            time3,
-            message3,
-            (short) 1,
-            "abcd1234abcd1234abcd1234abcd1234abcd1234",
-            false);
-    update.setPatchSetId(psId);
-    update.putComment(Status.PUBLISHED, comment3);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-
-    try (RevWalk walk = new RevWalk(repo)) {
-      ArrayList<Note> notesInTree = Lists.newArrayList(notes.revisionNoteMap.noteMap.iterator());
-      Note note = Iterables.getOnlyElement(notesInTree);
-
-      byte[] bytes = walk.getObjectReader().open(note.getData(), Constants.OBJ_BLOB).getBytes();
-      String noteString = new String(bytes, UTF_8);
-
-      if (!testJson()) {
-        assertThat(noteString)
-            .isEqualTo(
-                "Revision: abcd1234abcd1234abcd1234abcd1234abcd1234\n"
-                    + "Patch-set: 1\n"
-                    + "File: file1\n"
-                    + "\n"
-                    + "1:1-2:1\n"
-                    + ChangeNoteUtil.formatTime(serverIdent, time1)
-                    + "\n"
-                    + "Author: Other Account <2@gerrit>\n"
-                    + "Unresolved: false\n"
-                    + "UUID: uuid1\n"
-                    + "Bytes: 9\n"
-                    + "comment 1\n"
-                    + "\n"
-                    + "2:1-3:1\n"
-                    + ChangeNoteUtil.formatTime(serverIdent, time2)
-                    + "\n"
-                    + "Author: Other Account <2@gerrit>\n"
-                    + "Unresolved: false\n"
-                    + "UUID: uuid2\n"
-                    + "Bytes: 9\n"
-                    + "comment 2\n"
-                    + "\n"
-                    + "File: file2\n"
-                    + "\n"
-                    + "3:0-4:1\n"
-                    + ChangeNoteUtil.formatTime(serverIdent, time3)
-                    + "\n"
-                    + "Author: Other Account <2@gerrit>\n"
-                    + "Unresolved: false\n"
-                    + "UUID: uuid3\n"
-                    + "Bytes: 9\n"
-                    + "comment 3\n"
-                    + "\n");
-      }
-    }
-  }
-
-  @Test
-  public void patchLineCommentNotesFormatSide0() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, otherUser);
-    String uuid1 = "uuid1";
-    String uuid2 = "uuid2";
-    String message1 = "comment 1";
-    String message2 = "comment 2";
-    CommentRange range1 = new CommentRange(1, 1, 2, 1);
-    Timestamp time1 = TimeUtil.nowTs();
-    Timestamp time2 = TimeUtil.nowTs();
-    PatchSet.Id psId = c.currentPatchSetId();
-
-    Comment comment1 =
-        newComment(
-            psId,
-            "file1",
-            uuid1,
-            range1,
-            range1.getEndLine(),
-            otherUser,
-            null,
-            time1,
-            message1,
-            (short) 0,
-            "abcd1234abcd1234abcd1234abcd1234abcd1234",
-            false);
-    update.setPatchSetId(psId);
-    update.putComment(Status.PUBLISHED, comment1);
-    update.commit();
-
-    update = newUpdate(c, otherUser);
-    CommentRange range2 = new CommentRange(2, 1, 3, 1);
-    Comment comment2 =
-        newComment(
-            psId,
-            "file1",
-            uuid2,
-            range2,
-            range2.getEndLine(),
-            otherUser,
-            null,
-            time2,
-            message2,
-            (short) 0,
-            "abcd1234abcd1234abcd1234abcd1234abcd1234",
-            false);
-    update.setPatchSetId(psId);
-    update.putComment(Status.PUBLISHED, comment2);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-
-    try (RevWalk walk = new RevWalk(repo)) {
-      ArrayList<Note> notesInTree = Lists.newArrayList(notes.revisionNoteMap.noteMap.iterator());
-      Note note = Iterables.getOnlyElement(notesInTree);
-
-      byte[] bytes = walk.getObjectReader().open(note.getData(), Constants.OBJ_BLOB).getBytes();
-      String noteString = new String(bytes, UTF_8);
-
-      if (!testJson()) {
-        assertThat(noteString)
-            .isEqualTo(
-                "Revision: abcd1234abcd1234abcd1234abcd1234abcd1234\n"
-                    + "Base-for-patch-set: 1\n"
-                    + "File: file1\n"
-                    + "\n"
-                    + "1:1-2:1\n"
-                    + ChangeNoteUtil.formatTime(serverIdent, time1)
-                    + "\n"
-                    + "Author: Other Account <2@gerrit>\n"
-                    + "Unresolved: false\n"
-                    + "UUID: uuid1\n"
-                    + "Bytes: 9\n"
-                    + "comment 1\n"
-                    + "\n"
-                    + "2:1-3:1\n"
-                    + ChangeNoteUtil.formatTime(serverIdent, time2)
-                    + "\n"
-                    + "Author: Other Account <2@gerrit>\n"
-                    + "Unresolved: false\n"
-                    + "UUID: uuid2\n"
-                    + "Bytes: 9\n"
-                    + "comment 2\n"
-                    + "\n");
-      }
-    }
-  }
-
-  @Test
-  public void patchLineCommentNotesResolvedChangesValue() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, otherUser);
-    String uuid1 = "uuid1";
-    String uuid2 = "uuid2";
-    String message1 = "comment 1";
-    String message2 = "comment 2";
-    CommentRange range1 = new CommentRange(1, 1, 2, 1);
-    Timestamp time1 = TimeUtil.nowTs();
-    Timestamp time2 = TimeUtil.nowTs();
-    PatchSet.Id psId = c.currentPatchSetId();
-
-    Comment comment1 =
-        newComment(
-            psId,
-            "file1",
-            uuid1,
-            range1,
-            range1.getEndLine(),
-            otherUser,
-            null,
-            time1,
-            message1,
-            (short) 0,
-            "abcd1234abcd1234abcd1234abcd1234abcd1234",
-            false);
-    update.setPatchSetId(psId);
-    update.putComment(Status.PUBLISHED, comment1);
-    update.commit();
-
-    update = newUpdate(c, otherUser);
-    Comment comment2 =
-        newComment(
-            psId,
-            "file1",
-            uuid2,
-            range1,
-            range1.getEndLine(),
-            otherUser,
-            uuid1,
-            time2,
-            message2,
-            (short) 0,
-            "abcd1234abcd1234abcd1234abcd1234abcd1234",
-            true);
-    update.setPatchSetId(psId);
-    update.putComment(Status.PUBLISHED, comment2);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-
-    try (RevWalk walk = new RevWalk(repo)) {
-      ArrayList<Note> notesInTree = Lists.newArrayList(notes.revisionNoteMap.noteMap.iterator());
-      Note note = Iterables.getOnlyElement(notesInTree);
-
-      byte[] bytes = walk.getObjectReader().open(note.getData(), Constants.OBJ_BLOB).getBytes();
-      String noteString = new String(bytes, UTF_8);
-
-      if (!testJson()) {
-        assertThat(noteString)
-            .isEqualTo(
-                "Revision: abcd1234abcd1234abcd1234abcd1234abcd1234\n"
-                    + "Base-for-patch-set: 1\n"
-                    + "File: file1\n"
-                    + "\n"
-                    + "1:1-2:1\n"
-                    + ChangeNoteUtil.formatTime(serverIdent, time1)
-                    + "\n"
-                    + "Author: Other Account <2@gerrit>\n"
-                    + "Unresolved: false\n"
-                    + "UUID: uuid1\n"
-                    + "Bytes: 9\n"
-                    + "comment 1\n"
-                    + "\n"
-                    + "1:1-2:1\n"
-                    + ChangeNoteUtil.formatTime(serverIdent, time2)
-                    + "\n"
-                    + "Author: Other Account <2@gerrit>\n"
-                    + "Parent: uuid1\n"
-                    + "Unresolved: true\n"
-                    + "UUID: uuid2\n"
-                    + "Bytes: 9\n"
-                    + "comment 2\n"
-                    + "\n");
-      }
-    }
-  }
-
-  @Test
-  public void patchLineCommentNotesFormatMultiplePatchSetsSameRevId() throws Exception {
-    Change c = newChange();
-    PatchSet.Id psId1 = c.currentPatchSetId();
-    incrementPatchSet(c);
-    PatchSet.Id psId2 = c.currentPatchSetId();
-    String uuid1 = "uuid1";
-    String uuid2 = "uuid2";
-    String uuid3 = "uuid3";
-    String message1 = "comment 1";
-    String message2 = "comment 2";
-    String message3 = "comment 3";
-    CommentRange range1 = new CommentRange(1, 1, 2, 1);
-    CommentRange range2 = new CommentRange(2, 1, 3, 1);
-    Timestamp time = TimeUtil.nowTs();
-    RevId revId = new RevId("abcd1234abcd1234abcd1234abcd1234abcd1234");
-
-    Comment comment1 =
-        newComment(
-            psId1,
-            "file1",
-            uuid1,
-            range1,
-            range1.getEndLine(),
-            otherUser,
-            null,
-            time,
-            message1,
-            (short) 0,
-            revId.get(),
-            false);
-    Comment comment2 =
-        newComment(
-            psId1,
-            "file1",
-            uuid2,
-            range2,
-            range2.getEndLine(),
-            otherUser,
-            null,
-            time,
-            message2,
-            (short) 0,
-            revId.get(),
-            false);
-    Comment comment3 =
-        newComment(
-            psId2,
-            "file1",
-            uuid3,
-            range1,
-            range1.getEndLine(),
-            otherUser,
-            null,
-            time,
-            message3,
-            (short) 0,
-            revId.get(),
-            false);
-
-    ChangeUpdate update = newUpdate(c, otherUser);
-    update.setPatchSetId(psId2);
-    update.putComment(Status.PUBLISHED, comment3);
-    update.putComment(Status.PUBLISHED, comment2);
-    update.putComment(Status.PUBLISHED, comment1);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-
-    try (RevWalk walk = new RevWalk(repo)) {
-      ArrayList<Note> notesInTree = Lists.newArrayList(notes.revisionNoteMap.noteMap.iterator());
-      Note note = Iterables.getOnlyElement(notesInTree);
-
-      byte[] bytes = walk.getObjectReader().open(note.getData(), Constants.OBJ_BLOB).getBytes();
-      String noteString = new String(bytes, UTF_8);
-      String timeStr = ChangeNoteUtil.formatTime(serverIdent, time);
-
-      if (!testJson()) {
-        assertThat(noteString)
-            .isEqualTo(
-                "Revision: abcd1234abcd1234abcd1234abcd1234abcd1234\n"
-                    + "Base-for-patch-set: 1\n"
-                    + "File: file1\n"
-                    + "\n"
-                    + "1:1-2:1\n"
-                    + timeStr
-                    + "\n"
-                    + "Author: Other Account <2@gerrit>\n"
-                    + "Unresolved: false\n"
-                    + "UUID: uuid1\n"
-                    + "Bytes: 9\n"
-                    + "comment 1\n"
-                    + "\n"
-                    + "2:1-3:1\n"
-                    + timeStr
-                    + "\n"
-                    + "Author: Other Account <2@gerrit>\n"
-                    + "Unresolved: false\n"
-                    + "UUID: uuid2\n"
-                    + "Bytes: 9\n"
-                    + "comment 2\n"
-                    + "\n"
-                    + "Base-for-patch-set: 2\n"
-                    + "File: file1\n"
-                    + "\n"
-                    + "1:1-2:1\n"
-                    + timeStr
-                    + "\n"
-                    + "Author: Other Account <2@gerrit>\n"
-                    + "Unresolved: false\n"
-                    + "UUID: uuid3\n"
-                    + "Bytes: 9\n"
-                    + "comment 3\n"
-                    + "\n");
-      }
-    }
-    assertThat(notes.getComments())
-        .isEqualTo(
-            ImmutableListMultimap.of(
-                revId, comment1,
-                revId, comment2,
-                revId, comment3));
-  }
-
-  @Test
-  public void patchLineCommentNotesFormatRealAuthor() throws Exception {
-    Change c = newChange();
-    CurrentUser ownerAsOtherUser = userFactory.runAs(null, otherUserId, changeOwner);
-    ChangeUpdate update = newUpdate(c, ownerAsOtherUser);
-    String uuid = "uuid";
-    String message = "comment";
-    CommentRange range = new CommentRange(1, 1, 2, 1);
-    Timestamp time = TimeUtil.nowTs();
-    PatchSet.Id psId = c.currentPatchSetId();
-    RevId revId = new RevId("abcd1234abcd1234abcd1234abcd1234abcd1234");
-
-    Comment comment =
-        newComment(
-            psId,
-            "file",
-            uuid,
-            range,
-            range.getEndLine(),
-            otherUser,
-            null,
-            time,
-            message,
-            (short) 1,
-            revId.get(),
-            false);
-    comment.setRealAuthor(changeOwner.getAccountId());
-    update.setPatchSetId(psId);
-    update.putComment(Status.PUBLISHED, comment);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-
-    try (RevWalk walk = new RevWalk(repo)) {
-      ArrayList<Note> notesInTree = Lists.newArrayList(notes.revisionNoteMap.noteMap.iterator());
-      Note note = Iterables.getOnlyElement(notesInTree);
-
-      byte[] bytes = walk.getObjectReader().open(note.getData(), Constants.OBJ_BLOB).getBytes();
-      String noteString = new String(bytes, UTF_8);
-
-      if (!testJson()) {
-        assertThat(noteString)
-            .isEqualTo(
-                "Revision: abcd1234abcd1234abcd1234abcd1234abcd1234\n"
-                    + "Patch-set: 1\n"
-                    + "File: file\n"
-                    + "\n"
-                    + "1:1-2:1\n"
-                    + ChangeNoteUtil.formatTime(serverIdent, time)
-                    + "\n"
-                    + "Author: Other Account <2@gerrit>\n"
-                    + "Real-author: Change Owner <1@gerrit>\n"
-                    + "Unresolved: false\n"
-                    + "UUID: uuid\n"
-                    + "Bytes: 7\n"
-                    + "comment\n"
-                    + "\n");
-      }
-    }
-    assertThat(notes.getComments()).isEqualTo(ImmutableListMultimap.of(revId, comment));
-  }
-
-  @Test
-  public void patchLineCommentNotesFormatWeirdUser() throws Exception {
-    Account account = new Account(new Account.Id(3), TimeUtil.nowTs());
-    account.setFullName("Weird\n\u0002<User>\n");
-    account.setPreferredEmail(" we\r\nird@ex>ample<.com");
-    accountCache.put(account);
-    IdentifiedUser user = userFactory.create(account.getId());
-
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, user);
-    String uuid = "uuid";
-    CommentRange range = new CommentRange(1, 1, 2, 1);
-    Timestamp time = TimeUtil.nowTs();
-    PatchSet.Id psId = c.currentPatchSetId();
-
-    Comment comment =
-        newComment(
-            psId,
-            "file1",
-            uuid,
-            range,
-            range.getEndLine(),
-            user,
-            null,
-            time,
-            "comment",
-            (short) 1,
-            "abcd1234abcd1234abcd1234abcd1234abcd1234",
-            false);
-    update.setPatchSetId(psId);
-    update.putComment(Status.PUBLISHED, comment);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-
-    try (RevWalk walk = new RevWalk(repo)) {
-      ArrayList<Note> notesInTree = Lists.newArrayList(notes.revisionNoteMap.noteMap.iterator());
-      Note note = Iterables.getOnlyElement(notesInTree);
-
-      byte[] bytes = walk.getObjectReader().open(note.getData(), Constants.OBJ_BLOB).getBytes();
-      String noteString = new String(bytes, UTF_8);
-      String timeStr = ChangeNoteUtil.formatTime(serverIdent, time);
-
-      if (!testJson()) {
-        assertThat(noteString)
-            .isEqualTo(
-                "Revision: abcd1234abcd1234abcd1234abcd1234abcd1234\n"
-                    + "Patch-set: 1\n"
-                    + "File: file1\n"
-                    + "\n"
-                    + "1:1-2:1\n"
-                    + timeStr
-                    + "\n"
-                    + "Author: Weird\u0002User <3@gerrit>\n"
-                    + "Unresolved: false\n"
-                    + "UUID: uuid\n"
-                    + "Bytes: 7\n"
-                    + "comment\n"
-                    + "\n");
-      }
-    }
-    assertThat(notes.getComments())
-        .isEqualTo(ImmutableListMultimap.of(new RevId(comment.revId), comment));
-  }
-
-  @Test
-  public void patchLineCommentMultipleOnePatchsetOneFileBothSides() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, otherUser);
-    String uuid1 = "uuid1";
-    String uuid2 = "uuid2";
-    String rev1 = "abcd1234abcd1234abcd1234abcd1234abcd1234";
-    String rev2 = "abcd4567abcd4567abcd4567abcd4567abcd4567";
-    String messageForBase = "comment for base";
-    String messageForPS = "comment for ps";
-    CommentRange range = new CommentRange(1, 1, 2, 1);
-    Timestamp now = TimeUtil.nowTs();
-    PatchSet.Id psId = c.currentPatchSetId();
-
-    Comment commentForBase =
-        newComment(
-            psId,
-            "filename",
-            uuid1,
-            range,
-            range.getEndLine(),
-            otherUser,
-            null,
-            now,
-            messageForBase,
-            (short) 0,
-            rev1,
-            false);
-    update.setPatchSetId(psId);
-    update.putComment(Status.PUBLISHED, commentForBase);
-    update.commit();
-
-    update = newUpdate(c, otherUser);
-    Comment commentForPS =
-        newComment(
-            psId,
-            "filename",
-            uuid2,
-            range,
-            range.getEndLine(),
-            otherUser,
-            null,
-            now,
-            messageForPS,
-            (short) 1,
-            rev2,
-            false);
-    update.setPatchSetId(psId);
-    update.putComment(Status.PUBLISHED, commentForPS);
-    update.commit();
-
-    assertThat(newNotes(c).getComments())
-        .containsExactlyEntriesIn(
-            ImmutableListMultimap.of(
-                new RevId(rev1), commentForBase,
-                new RevId(rev2), commentForPS));
-  }
-
-  @Test
-  public void patchLineCommentMultipleOnePatchsetOneFile() throws Exception {
-    Change c = newChange();
-    String uuid1 = "uuid1";
-    String uuid2 = "uuid2";
-    String rev = "abcd1234abcd1234abcd1234abcd1234abcd1234";
-    CommentRange range = new CommentRange(1, 1, 2, 1);
-    PatchSet.Id psId = c.currentPatchSetId();
-    String filename = "filename";
-    short side = (short) 1;
-
-    ChangeUpdate update = newUpdate(c, otherUser);
-    Timestamp timeForComment1 = TimeUtil.nowTs();
-    Timestamp timeForComment2 = TimeUtil.nowTs();
-    Comment comment1 =
-        newComment(
-            psId,
-            filename,
-            uuid1,
-            range,
-            range.getEndLine(),
-            otherUser,
-            null,
-            timeForComment1,
-            "comment 1",
-            side,
-            rev,
-            false);
-    update.setPatchSetId(psId);
-    update.putComment(Status.PUBLISHED, comment1);
-    update.commit();
-
-    update = newUpdate(c, otherUser);
-    Comment comment2 =
-        newComment(
-            psId,
-            filename,
-            uuid2,
-            range,
-            range.getEndLine(),
-            otherUser,
-            null,
-            timeForComment2,
-            "comment 2",
-            side,
-            rev,
-            false);
-    update.setPatchSetId(psId);
-    update.putComment(Status.PUBLISHED, comment2);
-    update.commit();
-
-    assertThat(newNotes(c).getComments())
-        .containsExactlyEntriesIn(
-            ImmutableListMultimap.of(
-                new RevId(rev), comment1,
-                new RevId(rev), comment2))
-        .inOrder();
-  }
-
-  @Test
-  public void patchLineCommentMultipleOnePatchsetMultipleFiles() throws Exception {
-    Change c = newChange();
-    String uuid = "uuid";
-    String rev = "abcd1234abcd1234abcd1234abcd1234abcd1234";
-    CommentRange range = new CommentRange(1, 1, 2, 1);
-    PatchSet.Id psId = c.currentPatchSetId();
-    String filename1 = "filename1";
-    String filename2 = "filename2";
-    short side = (short) 1;
-
-    ChangeUpdate update = newUpdate(c, otherUser);
-    Timestamp now = TimeUtil.nowTs();
-    Comment comment1 =
-        newComment(
-            psId,
-            filename1,
-            uuid,
-            range,
-            range.getEndLine(),
-            otherUser,
-            null,
-            now,
-            "comment 1",
-            side,
-            rev,
-            false);
-    update.setPatchSetId(psId);
-    update.putComment(Status.PUBLISHED, comment1);
-    update.commit();
-
-    update = newUpdate(c, otherUser);
-    Comment comment2 =
-        newComment(
-            psId,
-            filename2,
-            uuid,
-            range,
-            range.getEndLine(),
-            otherUser,
-            null,
-            now,
-            "comment 2",
-            side,
-            rev,
-            false);
-    update.setPatchSetId(psId);
-    update.putComment(Status.PUBLISHED, comment2);
-    update.commit();
-
-    assertThat(newNotes(c).getComments())
-        .containsExactlyEntriesIn(
-            ImmutableListMultimap.of(
-                new RevId(rev), comment1,
-                new RevId(rev), comment2))
-        .inOrder();
-  }
-
-  @Test
-  public void patchLineCommentMultiplePatchsets() throws Exception {
-    Change c = newChange();
-    String uuid = "uuid";
-    String rev1 = "abcd1234abcd1234abcd1234abcd1234abcd1234";
-    String rev2 = "abcd4567abcd4567abcd4567abcd4567abcd4567";
-    CommentRange range = new CommentRange(1, 1, 2, 1);
-    PatchSet.Id ps1 = c.currentPatchSetId();
-    String filename = "filename1";
-    short side = (short) 1;
-
-    ChangeUpdate update = newUpdate(c, otherUser);
-    Timestamp now = TimeUtil.nowTs();
-    Comment comment1 =
-        newComment(
-            ps1,
-            filename,
-            uuid,
-            range,
-            range.getEndLine(),
-            otherUser,
-            null,
-            now,
-            "comment on ps1",
-            side,
-            rev1,
-            false);
-    update.setPatchSetId(ps1);
-    update.putComment(Status.PUBLISHED, comment1);
-    update.commit();
-
-    incrementPatchSet(c);
-    PatchSet.Id ps2 = c.currentPatchSetId();
-
-    update = newUpdate(c, otherUser);
-    now = TimeUtil.nowTs();
-    Comment comment2 =
-        newComment(
-            ps2,
-            filename,
-            uuid,
-            range,
-            range.getEndLine(),
-            otherUser,
-            null,
-            now,
-            "comment on ps2",
-            side,
-            rev2,
-            false);
-    update.setPatchSetId(ps2);
-    update.putComment(Status.PUBLISHED, comment2);
-    update.commit();
-
-    assertThat(newNotes(c).getComments())
-        .containsExactlyEntriesIn(
-            ImmutableListMultimap.of(
-                new RevId(rev1), comment1,
-                new RevId(rev2), comment2));
-  }
-
-  @Test
-  public void patchLineCommentSingleDraftToPublished() throws Exception {
-    Change c = newChange();
-    String uuid = "uuid";
-    String rev = "abcd4567abcd4567abcd4567abcd4567abcd4567";
-    CommentRange range = new CommentRange(1, 1, 2, 1);
-    PatchSet.Id ps1 = c.currentPatchSetId();
-    String filename = "filename1";
-    short side = (short) 1;
-
-    ChangeUpdate update = newUpdate(c, otherUser);
-    Timestamp now = TimeUtil.nowTs();
-    Comment comment1 =
-        newComment(
-            ps1,
-            filename,
-            uuid,
-            range,
-            range.getEndLine(),
-            otherUser,
-            null,
-            now,
-            "comment on ps1",
-            side,
-            rev,
-            false);
-    update.setPatchSetId(ps1);
-    update.putComment(Status.DRAFT, comment1);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getDraftComments(otherUserId))
-        .containsExactlyEntriesIn(ImmutableListMultimap.of(new RevId(rev), comment1));
-    assertThat(notes.getComments()).isEmpty();
-
-    update = newUpdate(c, otherUser);
-    update.setPatchSetId(ps1);
-    update.putComment(Status.PUBLISHED, comment1);
-    update.commit();
-
-    notes = newNotes(c);
-    assertThat(notes.getDraftComments(otherUserId)).isEmpty();
-    assertThat(notes.getComments())
-        .containsExactlyEntriesIn(ImmutableListMultimap.of(new RevId(rev), comment1));
-  }
-
-  @Test
-  public void patchLineCommentMultipleDraftsSameSidePublishOne() throws Exception {
-    Change c = newChange();
-    String uuid1 = "uuid1";
-    String uuid2 = "uuid2";
-    String rev = "abcd4567abcd4567abcd4567abcd4567abcd4567";
-    CommentRange range1 = new CommentRange(1, 1, 2, 2);
-    CommentRange range2 = new CommentRange(2, 2, 3, 3);
-    String filename = "filename1";
-    short side = (short) 1;
-    Timestamp now = TimeUtil.nowTs();
-    PatchSet.Id psId = c.currentPatchSetId();
-
-    // Write two drafts on the same side of one patch set.
-    ChangeUpdate update = newUpdate(c, otherUser);
-    update.setPatchSetId(psId);
-    Comment comment1 =
-        newComment(
-            psId,
-            filename,
-            uuid1,
-            range1,
-            range1.getEndLine(),
-            otherUser,
-            null,
-            now,
-            "comment on ps1",
-            side,
-            rev,
-            false);
-    Comment comment2 =
-        newComment(
-            psId,
-            filename,
-            uuid2,
-            range2,
-            range2.getEndLine(),
-            otherUser,
-            null,
-            now,
-            "other on ps1",
-            side,
-            rev,
-            false);
-    update.putComment(Status.DRAFT, comment1);
-    update.putComment(Status.DRAFT, comment2);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getDraftComments(otherUserId))
-        .containsExactlyEntriesIn(
-            ImmutableListMultimap.of(
-                new RevId(rev), comment1,
-                new RevId(rev), comment2))
-        .inOrder();
-    assertThat(notes.getComments()).isEmpty();
-
-    // Publish first draft.
-    update = newUpdate(c, otherUser);
-    update.setPatchSetId(psId);
-    update.putComment(Status.PUBLISHED, comment1);
-    update.commit();
-
-    notes = newNotes(c);
-    assertThat(notes.getDraftComments(otherUserId))
-        .containsExactlyEntriesIn(ImmutableListMultimap.of(new RevId(rev), comment2));
-    assertThat(notes.getComments())
-        .containsExactlyEntriesIn(ImmutableListMultimap.of(new RevId(rev), comment1));
-  }
-
-  @Test
-  public void patchLineCommentsMultipleDraftsBothSidesPublishAll() throws Exception {
-    Change c = newChange();
-    String uuid1 = "uuid1";
-    String uuid2 = "uuid2";
-    String rev1 = "abcd1234abcd1234abcd1234abcd1234abcd1234";
-    String rev2 = "abcd4567abcd4567abcd4567abcd4567abcd4567";
-    CommentRange range1 = new CommentRange(1, 1, 2, 2);
-    CommentRange range2 = new CommentRange(2, 2, 3, 3);
-    String filename = "filename1";
-    Timestamp now = TimeUtil.nowTs();
-    PatchSet.Id psId = c.currentPatchSetId();
-
-    // Write two drafts, one on each side of the patchset.
-    ChangeUpdate update = newUpdate(c, otherUser);
-    update.setPatchSetId(psId);
-    Comment baseComment =
-        newComment(
-            psId,
-            filename,
-            uuid1,
-            range1,
-            range1.getEndLine(),
-            otherUser,
-            null,
-            now,
-            "comment on base",
-            (short) 0,
-            rev1,
-            false);
-    Comment psComment =
-        newComment(
-            psId,
-            filename,
-            uuid2,
-            range2,
-            range2.getEndLine(),
-            otherUser,
-            null,
-            now,
-            "comment on ps",
-            (short) 1,
-            rev2,
-            false);
-
-    update.putComment(Status.DRAFT, baseComment);
-    update.putComment(Status.DRAFT, psComment);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getDraftComments(otherUserId))
-        .containsExactlyEntriesIn(
-            ImmutableListMultimap.of(
-                new RevId(rev1), baseComment,
-                new RevId(rev2), psComment));
-    assertThat(notes.getComments()).isEmpty();
-
-    // Publish both comments.
-    update = newUpdate(c, otherUser);
-    update.setPatchSetId(psId);
-
-    update.putComment(Status.PUBLISHED, baseComment);
-    update.putComment(Status.PUBLISHED, psComment);
-    update.commit();
-
-    notes = newNotes(c);
-    assertThat(notes.getDraftComments(otherUserId)).isEmpty();
-    assertThat(notes.getComments())
-        .containsExactlyEntriesIn(
-            ImmutableListMultimap.of(
-                new RevId(rev1), baseComment,
-                new RevId(rev2), psComment));
-  }
-
-  @Test
-  public void patchLineCommentsDeleteAllDrafts() throws Exception {
-    Change c = newChange();
-    String uuid = "uuid";
-    String rev = "abcd1234abcd1234abcd1234abcd1234abcd1234";
-    ObjectId objId = ObjectId.fromString(rev);
-    CommentRange range = new CommentRange(1, 1, 2, 1);
-    PatchSet.Id psId = c.currentPatchSetId();
-    String filename = "filename";
-    short side = (short) 1;
-
-    ChangeUpdate update = newUpdate(c, otherUser);
-    Timestamp now = TimeUtil.nowTs();
-    Comment comment =
-        newComment(
-            psId,
-            filename,
-            uuid,
-            range,
-            range.getEndLine(),
-            otherUser,
-            null,
-            now,
-            "comment on ps1",
-            side,
-            rev,
-            false);
-    update.setPatchSetId(psId);
-    update.putComment(Status.DRAFT, comment);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getDraftComments(otherUserId)).hasSize(1);
-    assertThat(notes.getDraftCommentNotes().getNoteMap().contains(objId)).isTrue();
-
-    update = newUpdate(c, otherUser);
-    now = TimeUtil.nowTs();
-    update.setPatchSetId(psId);
-    update.deleteComment(comment);
-    update.commit();
-
-    notes = newNotes(c);
-    assertThat(notes.getDraftComments(otherUserId)).isEmpty();
-    assertThat(notes.getDraftCommentNotes().getNoteMap()).isNull();
-  }
-
-  @Test
-  public void patchLineCommentsDeleteAllDraftsForOneRevision() throws Exception {
-    Change c = newChange();
-    String uuid = "uuid";
-    String rev1 = "abcd1234abcd1234abcd1234abcd1234abcd1234";
-    String rev2 = "abcd4567abcd4567abcd4567abcd4567abcd4567";
-    ObjectId objId1 = ObjectId.fromString(rev1);
-    ObjectId objId2 = ObjectId.fromString(rev2);
-    CommentRange range = new CommentRange(1, 1, 2, 1);
-    PatchSet.Id ps1 = c.currentPatchSetId();
-    String filename = "filename1";
-    short side = (short) 1;
-
-    ChangeUpdate update = newUpdate(c, otherUser);
-    Timestamp now = TimeUtil.nowTs();
-    Comment comment1 =
-        newComment(
-            ps1,
-            filename,
-            uuid,
-            range,
-            range.getEndLine(),
-            otherUser,
-            null,
-            now,
-            "comment on ps1",
-            side,
-            rev1,
-            false);
-    update.setPatchSetId(ps1);
-    update.putComment(Status.DRAFT, comment1);
-    update.commit();
-
-    incrementPatchSet(c);
-    PatchSet.Id ps2 = c.currentPatchSetId();
-
-    update = newUpdate(c, otherUser);
-    now = TimeUtil.nowTs();
-    Comment comment2 =
-        newComment(
-            ps2,
-            filename,
-            uuid,
-            range,
-            range.getEndLine(),
-            otherUser,
-            null,
-            now,
-            "comment on ps2",
-            side,
-            rev2,
-            false);
-    update.setPatchSetId(ps2);
-    update.putComment(Status.DRAFT, comment2);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getDraftComments(otherUserId)).hasSize(2);
-
-    update = newUpdate(c, otherUser);
-    now = TimeUtil.nowTs();
-    update.setPatchSetId(ps2);
-    update.deleteComment(comment2);
-    update.commit();
-
-    notes = newNotes(c);
-    assertThat(notes.getDraftComments(otherUserId)).hasSize(1);
-    NoteMap noteMap = notes.getDraftCommentNotes().getNoteMap();
-    assertThat(noteMap.contains(objId1)).isTrue();
-    assertThat(noteMap.contains(objId2)).isFalse();
-  }
-
-  @Test
-  public void addingPublishedCommentDoesNotCreateNoOpCommitOnEmptyDraftRef() throws Exception {
-    Change c = newChange();
-    String uuid = "uuid";
-    String rev = "abcd4567abcd4567abcd4567abcd4567abcd4567";
-    CommentRange range = new CommentRange(1, 1, 2, 1);
-    PatchSet.Id ps1 = c.currentPatchSetId();
-    String filename = "filename1";
-    short side = (short) 1;
-
-    ChangeUpdate update = newUpdate(c, otherUser);
-    Timestamp now = TimeUtil.nowTs();
-    Comment comment =
-        newComment(
-            ps1,
-            filename,
-            uuid,
-            range,
-            range.getEndLine(),
-            otherUser,
-            null,
-            now,
-            "comment on ps1",
-            side,
-            rev,
-            false);
-    update.putComment(Status.PUBLISHED, comment);
-    update.commit();
-
-    assertThat(repo.exactRef(changeMetaRef(c.getId()))).isNotNull();
-    String draftRef = refsDraftComments(c.getId(), otherUser.getAccountId());
-    assertThat(exactRefAllUsers(draftRef)).isNull();
-  }
-
-  @Test
-  public void addingPublishedCommentDoesNotCreateNoOpCommitOnNonEmptyDraftRef() throws Exception {
-    Change c = newChange();
-    String rev = "abcd4567abcd4567abcd4567abcd4567abcd4567";
-    CommentRange range = new CommentRange(1, 1, 2, 1);
-    PatchSet.Id ps1 = c.currentPatchSetId();
-    String filename = "filename1";
-    short side = (short) 1;
-
-    ChangeUpdate update = newUpdate(c, otherUser);
-    Timestamp now = TimeUtil.nowTs();
-    Comment draft =
-        newComment(
-            ps1,
-            filename,
-            "uuid1",
-            range,
-            range.getEndLine(),
-            otherUser,
-            null,
-            now,
-            "draft comment on ps1",
-            side,
-            rev,
-            false);
-    update.putComment(Status.DRAFT, draft);
-    update.commit();
-
-    String draftRef = refsDraftComments(c.getId(), otherUser.getAccountId());
-    ObjectId old = exactRefAllUsers(draftRef);
-    assertThat(old).isNotNull();
-
-    update = newUpdate(c, otherUser);
-    Comment pub =
-        newComment(
-            ps1,
-            filename,
-            "uuid2",
-            range,
-            range.getEndLine(),
-            otherUser,
-            null,
-            now,
-            "comment on ps1",
-            side,
-            rev,
-            false);
-    update.putComment(Status.PUBLISHED, pub);
-    update.commit();
-
-    assertThat(exactRefAllUsers(draftRef)).isEqualTo(old);
-  }
-
-  @Test
-  public void fileComment() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, otherUser);
-    String uuid = "uuid";
-    String rev = "abcd1234abcd1234abcd1234abcd1234abcd1234";
-    String messageForBase = "comment for base";
-    Timestamp now = TimeUtil.nowTs();
-    PatchSet.Id psId = c.currentPatchSetId();
-
-    Comment comment =
-        newComment(
-            psId,
-            "filename",
-            uuid,
-            null,
-            0,
-            otherUser,
-            null,
-            now,
-            messageForBase,
-            (short) 0,
-            rev,
-            false);
-    update.setPatchSetId(psId);
-    update.putComment(Status.PUBLISHED, comment);
-    update.commit();
-
-    assertThat(newNotes(c).getComments())
-        .containsExactlyEntriesIn(ImmutableListMultimap.of(new RevId(rev), comment));
-  }
-
-  @Test
-  public void patchLineCommentNoRange() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, otherUser);
-    String uuid = "uuid";
-    String rev = "abcd1234abcd1234abcd1234abcd1234abcd1234";
-    String messageForBase = "comment for base";
-    Timestamp now = TimeUtil.nowTs();
-    PatchSet.Id psId = c.currentPatchSetId();
-
-    Comment comment =
-        newComment(
-            psId,
-            "filename",
-            uuid,
-            null,
-            1,
-            otherUser,
-            null,
-            now,
-            messageForBase,
-            (short) 0,
-            rev,
-            false);
-    update.setPatchSetId(psId);
-    update.putComment(Status.PUBLISHED, comment);
-    update.commit();
-
-    assertThat(newNotes(c).getComments())
-        .containsExactlyEntriesIn(ImmutableListMultimap.of(new RevId(rev), comment));
-  }
-
-  @Test
-  public void putCommentsForMultipleRevisions() throws Exception {
-    Change c = newChange();
-    String uuid = "uuid";
-    String rev1 = "abcd1234abcd1234abcd1234abcd1234abcd1234";
-    String rev2 = "abcd4567abcd4567abcd4567abcd4567abcd4567";
-    CommentRange range = new CommentRange(1, 1, 2, 1);
-    PatchSet.Id ps1 = c.currentPatchSetId();
-    String filename = "filename1";
-    short side = (short) 1;
-
-    incrementPatchSet(c);
-    PatchSet.Id ps2 = c.currentPatchSetId();
-
-    ChangeUpdate update = newUpdate(c, otherUser);
-    update.setPatchSetId(ps2);
-    Timestamp now = TimeUtil.nowTs();
-    Comment comment1 =
-        newComment(
-            ps1,
-            filename,
-            uuid,
-            range,
-            range.getEndLine(),
-            otherUser,
-            null,
-            now,
-            "comment on ps1",
-            side,
-            rev1,
-            false);
-    Comment comment2 =
-        newComment(
-            ps2,
-            filename,
-            uuid,
-            range,
-            range.getEndLine(),
-            otherUser,
-            null,
-            now,
-            "comment on ps2",
-            side,
-            rev2,
-            false);
-    update.putComment(Status.DRAFT, comment1);
-    update.putComment(Status.DRAFT, comment2);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getDraftComments(otherUserId)).hasSize(2);
-    assertThat(notes.getComments()).isEmpty();
-
-    update = newUpdate(c, otherUser);
-    update.setPatchSetId(ps2);
-    update.putComment(Status.PUBLISHED, comment1);
-    update.putComment(Status.PUBLISHED, comment2);
-    update.commit();
-
-    notes = newNotes(c);
-    assertThat(notes.getDraftComments(otherUserId)).isEmpty();
-    assertThat(notes.getComments()).hasSize(2);
-  }
-
-  @Test
-  public void publishSubsetOfCommentsOnRevision() throws Exception {
-    Change c = newChange();
-    RevId rev1 = new RevId("abcd1234abcd1234abcd1234abcd1234abcd1234");
-    CommentRange range = new CommentRange(1, 1, 2, 1);
-    PatchSet.Id ps1 = c.currentPatchSetId();
-    short side = (short) 1;
-
-    ChangeUpdate update = newUpdate(c, otherUser);
-    update.setPatchSetId(ps1);
-    Timestamp now = TimeUtil.nowTs();
-    Comment comment1 =
-        newComment(
-            ps1,
-            "file1",
-            "uuid1",
-            range,
-            range.getEndLine(),
-            otherUser,
-            null,
-            now,
-            "comment1",
-            side,
-            rev1.get(),
-            false);
-    Comment comment2 =
-        newComment(
-            ps1,
-            "file2",
-            "uuid2",
-            range,
-            range.getEndLine(),
-            otherUser,
-            null,
-            now,
-            "comment2",
-            side,
-            rev1.get(),
-            false);
-    update.putComment(Status.DRAFT, comment1);
-    update.putComment(Status.DRAFT, comment2);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getDraftComments(otherUserId).get(rev1)).containsExactly(comment1, comment2);
-    assertThat(notes.getComments()).isEmpty();
-
-    update = newUpdate(c, otherUser);
-    update.setPatchSetId(ps1);
-    update.putComment(Status.PUBLISHED, comment2);
-    update.commit();
-
-    notes = newNotes(c);
-    assertThat(notes.getDraftComments(otherUserId).get(rev1)).containsExactly(comment1);
-    assertThat(notes.getComments().get(rev1)).containsExactly(comment2);
-  }
-
-  @Test
-  public void updateWithServerIdent() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, internalUser);
-    update.setChangeMessage("A message.");
-    update.commit();
-
-    ChangeMessage msg = Iterables.getLast(newNotes(c).getChangeMessages());
-    assertThat(msg.getMessage()).isEqualTo("A message.");
-    assertThat(msg.getAuthor()).isNull();
-
-    update = newUpdate(c, internalUser);
-    exception.expect(IllegalStateException.class);
-    update.putApproval("Code-Review", (short) 1);
-  }
-
-  @Test
-  public void filterOutAndFixUpZombieDraftComments() throws Exception {
-    Change c = newChange();
-    RevId rev1 = new RevId("abcd1234abcd1234abcd1234abcd1234abcd1234");
-    CommentRange range = new CommentRange(1, 1, 2, 1);
-    PatchSet.Id ps1 = c.currentPatchSetId();
-    short side = (short) 1;
-
-    ChangeUpdate update = newUpdate(c, otherUser);
-    Timestamp now = TimeUtil.nowTs();
-    Comment comment1 =
-        newComment(
-            ps1,
-            "file1",
-            "uuid1",
-            range,
-            range.getEndLine(),
-            otherUser,
-            null,
-            now,
-            "comment on ps1",
-            side,
-            rev1.get(),
-            false);
-    Comment comment2 =
-        newComment(
-            ps1,
-            "file2",
-            "uuid2",
-            range,
-            range.getEndLine(),
-            otherUser,
-            null,
-            now,
-            "another comment",
-            side,
-            rev1.get(),
-            false);
-    update.putComment(Status.DRAFT, comment1);
-    update.putComment(Status.DRAFT, comment2);
-    update.commit();
-
-    String refName = refsDraftComments(c.getId(), otherUserId);
-    ObjectId oldDraftId = exactRefAllUsers(refName);
-
-    update = newUpdate(c, otherUser);
-    update.setPatchSetId(ps1);
-    update.putComment(Status.PUBLISHED, comment2);
-    update.commit();
-    assertThat(exactRefAllUsers(refName)).isNotNull();
-    assertThat(exactRefAllUsers(refName)).isNotEqualTo(oldDraftId);
-
-    // Re-add draft version of comment2 back to draft ref without updating
-    // change ref. Simulates the case where deleting the draft failed
-    // non-atomically after adding the published comment succeeded.
-    ChangeDraftUpdate draftUpdate = newUpdate(c, otherUser).createDraftUpdateIfNull();
-    draftUpdate.putComment(comment2);
-    try (NoteDbUpdateManager manager = updateManagerFactory.create(c.getProject())) {
-      manager.add(draftUpdate);
-      manager.execute();
-    }
-
-    // Looking at drafts directly shows the zombie comment.
-    DraftCommentNotes draftNotes = draftNotesFactory.create(c, otherUserId);
-    assertThat(draftNotes.load().getComments().get(rev1)).containsExactly(comment1, comment2);
-
-    // Zombie comment is filtered out of drafts via ChangeNotes.
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getDraftComments(otherUserId).get(rev1)).containsExactly(comment1);
-    assertThat(notes.getComments().get(rev1)).containsExactly(comment2);
-
-    update = newUpdate(c, otherUser);
-    update.setPatchSetId(ps1);
-    update.putComment(Status.PUBLISHED, comment1);
-    update.commit();
-
-    // Updating an unrelated comment causes the zombie comment to get fixed up.
-    assertThat(exactRefAllUsers(refName)).isNull();
-  }
-
-  @Test
-  public void updateCommentsInSequentialUpdates() throws Exception {
-    Change c = newChange();
-    CommentRange range = new CommentRange(1, 1, 2, 1);
-    String rev = "abcd1234abcd1234abcd1234abcd1234abcd1234";
-
-    ChangeUpdate update1 = newUpdate(c, otherUser);
-    Comment comment1 =
-        newComment(
-            c.currentPatchSetId(),
-            "filename",
-            "uuid1",
-            range,
-            range.getEndLine(),
-            otherUser,
-            null,
-            new Timestamp(update1.getWhen().getTime()),
-            "comment 1",
-            (short) 1,
-            rev,
-            false);
-    update1.putComment(Status.PUBLISHED, comment1);
-
-    ChangeUpdate update2 = newUpdate(c, otherUser);
-    Comment comment2 =
-        newComment(
-            c.currentPatchSetId(),
-            "filename",
-            "uuid2",
-            range,
-            range.getEndLine(),
-            otherUser,
-            null,
-            new Timestamp(update2.getWhen().getTime()),
-            "comment 2",
-            (short) 1,
-            rev,
-            false);
-    update2.putComment(Status.PUBLISHED, comment2);
-
-    try (NoteDbUpdateManager manager = updateManagerFactory.create(project)) {
-      manager.add(update1);
-      manager.add(update2);
-      manager.execute();
-    }
-
-    ChangeNotes notes = newNotes(c);
-    List<Comment> comments = notes.getComments().get(new RevId(rev));
-    assertThat(comments).hasSize(2);
-    assertThat(comments.get(0).message).isEqualTo("comment 1");
-    assertThat(comments.get(1).message).isEqualTo("comment 2");
-  }
-
-  @Test
-  public void realUser() throws Exception {
-    Change c = newChange();
-    CurrentUser ownerAsOtherUser = userFactory.runAs(null, otherUserId, changeOwner);
-    ChangeUpdate update = newUpdate(c, ownerAsOtherUser);
-    update.setChangeMessage("Message on behalf of other user");
-    update.commit();
-
-    ChangeMessage msg = Iterables.getLast(newNotes(c).getChangeMessages());
-    assertThat(msg.getMessage()).isEqualTo("Message on behalf of other user");
-    assertThat(msg.getAuthor()).isEqualTo(otherUserId);
-    assertThat(msg.getRealAuthor()).isEqualTo(changeOwner.getAccountId());
-  }
-
-  @Test
-  public void ignoreEntitiesBeyondCurrentPatchSet() throws Exception {
-    Change c = newChange();
-    ChangeNotes notes = newNotes(c);
-    int numMessages = notes.getChangeMessages().size();
-    int numPatchSets = notes.getPatchSets().size();
-    int numApprovals = notes.getApprovals().size();
-    int numComments = notes.getComments().size();
-
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setPatchSetId(new PatchSet.Id(c.getId(), c.currentPatchSetId().get() + 1));
-    update.setChangeMessage("Should be ignored");
-    update.putApproval("Code-Review", (short) 2);
-    CommentRange range = new CommentRange(1, 1, 2, 1);
-    Comment comment =
-        newComment(
-            update.getPatchSetId(),
-            "filename",
-            "uuid",
-            range,
-            range.getEndLine(),
-            changeOwner,
-            null,
-            new Timestamp(update.getWhen().getTime()),
-            "comment",
-            (short) 1,
-            "abcd1234abcd1234abcd1234abcd1234abcd1234",
-            false);
-    update.putComment(Status.PUBLISHED, comment);
-    update.commit();
-
-    notes = newNotes(c);
-    assertThat(notes.getChangeMessages()).hasSize(numMessages);
-    assertThat(notes.getPatchSets()).hasSize(numPatchSets);
-    assertThat(notes.getApprovals()).hasSize(numApprovals);
-    assertThat(notes.getComments()).hasSize(numComments);
-  }
-
-  @Test
-  public void currentPatchSet() throws Exception {
-    Change c = newChange();
-    assertThat(newNotes(c).getChange().currentPatchSetId().get()).isEqualTo(1);
-
-    incrementPatchSet(c);
-    assertThat(newNotes(c).getChange().currentPatchSetId().get()).isEqualTo(2);
-
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setPatchSetId(new PatchSet.Id(c.getId(), 1));
-    update.setCurrentPatchSet();
-    update.commit();
-    assertThat(newNotes(c).getChange().currentPatchSetId().get()).isEqualTo(1);
-
-    incrementPatchSet(c);
-    assertThat(newNotes(c).getChange().currentPatchSetId().get()).isEqualTo(3);
-
-    // Delete PS3, PS1 becomes current, as the most recent event explicitly set
-    // it to current.
-    update = newUpdate(c, changeOwner);
-    update.setPatchSetState(PatchSetState.DELETED);
-    update.commit();
-    assertThat(newNotes(c).getChange().currentPatchSetId().get()).isEqualTo(1);
-
-    // Delete PS1, PS2 becomes current.
-    update = newUpdate(c, changeOwner);
-    update.setPatchSetId(new PatchSet.Id(c.getId(), 1));
-    update.setPatchSetState(PatchSetState.DELETED);
-    update.commit();
-    assertThat(newNotes(c).getChange().currentPatchSetId().get()).isEqualTo(2);
-  }
-
-  @Test
-  public void readOnlyUntilExpires() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    Timestamp until = new Timestamp(TimeUtil.nowMs() + 10000);
-    update.setReadOnlyUntil(until);
-    update.commit();
-
-    update = newUpdate(c, changeOwner);
-    update.setTopic("failing-topic");
-    try {
-      update.commit();
-      assert_().fail("expected OrmException");
-    } catch (OrmException e) {
-      assertThat(e.getMessage()).contains("read-only until");
-    }
-
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getChange().getTopic()).isNotEqualTo("failing-topic");
-    assertThat(notes.getReadOnlyUntil()).isEqualTo(until);
-
-    TestTimeUtil.incrementClock(30, TimeUnit.SECONDS);
-    update = newUpdate(c, changeOwner);
-    update.setTopic("succeeding-topic");
-    update.commit();
-
-    // Write succeeded; lease still exists, even though it's expired.
-    notes = newNotes(c);
-    assertThat(notes.getChange().getTopic()).isEqualTo("succeeding-topic");
-    assertThat(notes.getReadOnlyUntil()).isEqualTo(until);
-
-    // New lease takes precedence.
-    update = newUpdate(c, changeOwner);
-    until = new Timestamp(TimeUtil.nowMs() + 10000);
-    update.setReadOnlyUntil(until);
-    update.commit();
-    assertThat(newNotes(c).getReadOnlyUntil()).isEqualTo(until);
-  }
-
-  @Test
-  public void readOnlyUntilCleared() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    Timestamp until = new Timestamp(TimeUtil.nowMs() + TimeUnit.DAYS.toMillis(30));
-    update.setReadOnlyUntil(until);
-    update.commit();
-
-    update = newUpdate(c, changeOwner);
-    update.setTopic("failing-topic");
-    try {
-      update.commit();
-      assert_().fail("expected OrmException");
-    } catch (OrmException e) {
-      assertThat(e.getMessage()).contains("read-only until");
-    }
-
-    // Sentinel timestamp of 0 can be written to clear lease.
-    update = newUpdate(c, changeOwner);
-    update.setReadOnlyUntil(new Timestamp(0));
-    update.commit();
-
-    update = newUpdate(c, changeOwner);
-    update.setTopic("succeeding-topic");
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getChange().getTopic()).isEqualTo("succeeding-topic");
-    assertThat(notes.getReadOnlyUntil()).isEqualTo(new Timestamp(0));
-  }
-
-  @Test
-  public void privateDefault() throws Exception {
-    Change c = newChange();
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.isPrivate()).isFalse();
-  }
-
-  @Test
-  public void privateSetPrivate() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setPrivate(true);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.isPrivate()).isTrue();
-  }
-
-  @Test
-  public void privateSetPrivateMultipleTimes() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setPrivate(true);
-    update.commit();
-
-    update = newUpdate(c, changeOwner);
-    update.setPrivate(false);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.isPrivate()).isFalse();
-  }
-
-  @Test
-  public void defaultReviewersByEmailIsEmpty() throws Exception {
-    Change c = newChange();
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getReviewersByEmail().all()).isEmpty();
-  }
-
-  @Test
-  public void putReviewerByEmail() throws Exception {
-    Address adr = new Address("Foo Bar", "foo.bar@gerritcodereview.com");
-
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.putReviewerByEmail(adr, ReviewerStateInternal.REVIEWER);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getReviewersByEmail().all()).containsExactly(adr);
-  }
-
-  @Test
-  public void putAndRemoveReviewerByEmail() throws Exception {
-    Address adr = new Address("Foo Bar", "foo.bar@gerritcodereview.com");
-
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.putReviewerByEmail(adr, ReviewerStateInternal.REVIEWER);
-    update.commit();
-
-    update = newUpdate(c, changeOwner);
-    update.removeReviewerByEmail(adr);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getReviewersByEmail().all()).isEmpty();
-  }
-
-  @Test
-  public void putRemoveAndAddBackReviewerByEmail() throws Exception {
-    Address adr = new Address("Foo Bar", "foo.bar@gerritcodereview.com");
-
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.putReviewerByEmail(adr, ReviewerStateInternal.REVIEWER);
-    update.commit();
-
-    update = newUpdate(c, changeOwner);
-    update.removeReviewerByEmail(adr);
-    update.commit();
-
-    update = newUpdate(c, changeOwner);
-    update.putReviewerByEmail(adr, ReviewerStateInternal.CC);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getReviewersByEmail().all()).containsExactly(adr);
-  }
-
-  @Test
-  public void putReviewerByEmailAndCcByEmail() throws Exception {
-    Address adrReviewer = new Address("Foo Bar", "foo.bar@gerritcodereview.com");
-    Address adrCc = new Address("Foo Bor", "foo.bar.2@gerritcodereview.com");
-
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.putReviewerByEmail(adrReviewer, ReviewerStateInternal.REVIEWER);
-    update.commit();
-
-    update = newUpdate(c, changeOwner);
-    update.putReviewerByEmail(adrCc, ReviewerStateInternal.CC);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getReviewersByEmail().byState(ReviewerStateInternal.REVIEWER))
-        .containsExactly(adrReviewer);
-    assertThat(notes.getReviewersByEmail().byState(ReviewerStateInternal.CC))
-        .containsExactly(adrCc);
-    assertThat(notes.getReviewersByEmail().all()).containsExactly(adrReviewer, adrCc);
-  }
-
-  @Test
-  public void putReviewerByEmailAndChangeToCc() throws Exception {
-    Address adr = new Address("Foo Bar", "foo.bar@gerritcodereview.com");
-
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.putReviewerByEmail(adr, ReviewerStateInternal.REVIEWER);
-    update.commit();
-
-    update = newUpdate(c, changeOwner);
-    update.putReviewerByEmail(adr, ReviewerStateInternal.CC);
-    update.commit();
-
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getReviewersByEmail().byState(ReviewerStateInternal.REVIEWER)).isEmpty();
-    assertThat(notes.getReviewersByEmail().byState(ReviewerStateInternal.CC)).containsExactly(adr);
-    assertThat(notes.getReviewersByEmail().all()).containsExactly(adr);
-  }
-
-  @Test
-  public void hasReviewStarted() throws Exception {
-    ChangeNotes notes = newNotes(newChange());
-    assertThat(notes.hasReviewStarted()).isTrue();
-
-    notes = newNotes(newWorkInProgressChange());
-    assertThat(notes.hasReviewStarted()).isFalse();
-
-    Change c = newWorkInProgressChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.commit();
-    notes = newNotes(c);
-    assertThat(notes.hasReviewStarted()).isFalse();
-
-    update = newUpdate(c, changeOwner);
-    update.setWorkInProgress(true);
-    update.commit();
-    notes = newNotes(c);
-    assertThat(notes.hasReviewStarted()).isFalse();
-
-    update = newUpdate(c, changeOwner);
-    update.setWorkInProgress(false);
-    update.commit();
-    notes = newNotes(c);
-    assertThat(notes.hasReviewStarted()).isTrue();
-
-    // Once review is started, setting WIP should have no impact.
-    c = newChange();
-    notes = newNotes(c);
-    assertThat(notes.hasReviewStarted()).isTrue();
-    update = newUpdate(c, changeOwner);
-    update.setWorkInProgress(true);
-    update.commit();
-    notes = newNotes(c);
-    assertThat(notes.hasReviewStarted()).isTrue();
-  }
-
-  @Test
-  public void pendingReviewers() throws Exception {
-    Address adr1 = new Address("Foo Bar1", "foo.bar1@gerritcodereview.com");
-    Address adr2 = new Address("Foo Bar2", "foo.bar2@gerritcodereview.com");
-    Account.Id ownerId = changeOwner.getAccount().getId();
-    Account.Id otherUserId = otherUser.getAccount().getId();
-
-    ChangeNotes notes = newNotes(newChange());
-    assertThat(notes.getPendingReviewers().asTable()).isEmpty();
-    assertThat(notes.getPendingReviewersByEmail().asTable()).isEmpty();
-
-    Change c = newWorkInProgressChange();
-    notes = newNotes(c);
-    assertThat(notes.getPendingReviewers().asTable()).isEmpty();
-    assertThat(notes.getPendingReviewersByEmail().asTable()).isEmpty();
-
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.putReviewer(ownerId, REVIEWER);
-    update.putReviewer(otherUserId, CC);
-    update.putReviewerByEmail(adr1, REVIEWER);
-    update.putReviewerByEmail(adr2, CC);
-    update.commit();
-    notes = newNotes(c);
-    assertThat(notes.getPendingReviewers().byState(REVIEWER)).containsExactly(ownerId);
-    assertThat(notes.getPendingReviewers().byState(CC)).containsExactly(otherUserId);
-    assertThat(notes.getPendingReviewers().byState(REMOVED)).isEmpty();
-    assertThat(notes.getPendingReviewersByEmail().byState(REVIEWER)).containsExactly(adr1);
-    assertThat(notes.getPendingReviewersByEmail().byState(CC)).containsExactly(adr2);
-    assertThat(notes.getPendingReviewersByEmail().byState(REMOVED)).isEmpty();
-
-    update = newUpdate(c, changeOwner);
-    update.removeReviewer(ownerId);
-    update.removeReviewerByEmail(adr1);
-    update.commit();
-    notes = newNotes(c);
-    assertThat(notes.getPendingReviewers().byState(REVIEWER)).isEmpty();
-    assertThat(notes.getPendingReviewers().byState(CC)).containsExactly(otherUserId);
-    assertThat(notes.getPendingReviewers().byState(REMOVED)).containsExactly(ownerId);
-    assertThat(notes.getPendingReviewersByEmail().byState(REVIEWER)).isEmpty();
-    assertThat(notes.getPendingReviewersByEmail().byState(CC)).containsExactly(adr2);
-    assertThat(notes.getPendingReviewersByEmail().byState(REMOVED)).containsExactly(adr1);
-
-    update = newUpdate(c, changeOwner);
-    update.setWorkInProgress(false);
-    update.commit();
-    notes = newNotes(c);
-    assertThat(notes.getPendingReviewers().asTable()).isEmpty();
-    assertThat(notes.getPendingReviewersByEmail().asTable()).isEmpty();
-
-    update = newUpdate(c, changeOwner);
-    update.putReviewer(ownerId, REVIEWER);
-    update.putReviewerByEmail(adr1, REVIEWER);
-    update.commit();
-    notes = newNotes(c);
-    assertThat(notes.getPendingReviewers().asTable()).isEmpty();
-    assertThat(notes.getPendingReviewersByEmail().asTable()).isEmpty();
-  }
-
-  @Test
-  public void revertOfIsNullByDefault() throws Exception {
-    Change c = newChange();
-    ChangeNotes notes = newNotes(c);
-    assertThat(notes.getRevertOf()).isNull();
-  }
-
-  @Test
-  public void setRevertOfPersistsValue() throws Exception {
-    Change changeToRevert = newChange();
-    Change c = TestChanges.newChange(project, changeOwner.getAccountId());
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setChangeId(c.getKey().get());
-    update.setRevertOf(changeToRevert.getId().get());
-    update.commit();
-    assertThat(newNotes(c).getRevertOf()).isEqualTo(changeToRevert.getId());
-  }
-
-  @Test
-  public void setRevertOfToCurrentChangeFails() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    exception.expect(IllegalArgumentException.class);
-    exception.expectMessage("A change cannot revert itself");
-    update.setRevertOf(c.getId().get());
-  }
-
-  @Test
-  public void setRevertOfOnChildCommitFails() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setRevertOf(newChange().getId().get());
-    exception.expect(OrmException.class);
-    exception.expectMessage("Given ChangeUpdate is only allowed on initial commit");
-    update.commit();
-  }
-
-  private boolean testJson() {
-    return noteUtil.getWriteJson();
-  }
-
-  private String readNote(ChangeNotes notes, ObjectId noteId) throws Exception {
-    ObjectId dataId = notes.revisionNoteMap.noteMap.getNote(noteId).getData();
-    return new String(rw.getObjectReader().open(dataId, OBJ_BLOB).getCachedBytes(), UTF_8);
-  }
-
-  private ObjectId exactRefAllUsers(String refName) throws Exception {
-    try (Repository allUsersRepo = repoManager.openRepository(allUsers)) {
-      Ref ref = allUsersRepo.exactRef(refName);
-      return ref != null ? ref.getObjectId() : null;
-    }
-  }
-
-  private void assertCause(
-      Throwable e, Class<? extends Throwable> expectedClass, String expectedMsg) {
-    Throwable cause = null;
-    for (Throwable t : Throwables.getCausalChain(e)) {
-      if (expectedClass.isAssignableFrom(t.getClass())) {
-        cause = t;
-        break;
-      }
-    }
-    assertThat(cause)
-        .named(
-            expectedClass.getSimpleName()
-                + " in causal chain of:\n"
-                + Throwables.getStackTraceAsString(e))
-        .isNotNull();
-    assertThat(cause.getMessage()).isEqualTo(expectedMsg);
-  }
-
-  private void incrementCurrentPatchSetFieldOnly(Change c) {
-    TestChanges.incrementPatchSet(c);
-  }
-
-  private RevCommit incrementPatchSet(Change c) throws Exception {
-    return incrementPatchSet(c, userFactory.create(c.getOwner()));
-  }
-
-  private RevCommit incrementPatchSet(Change c, IdentifiedUser user) throws Exception {
-    incrementCurrentPatchSetFieldOnly(c);
-    RevCommit commit = tr.commit().message("PS" + c.currentPatchSetId().get()).create();
-    ChangeUpdate update = newUpdate(c, user);
-    update.setCommit(rw, commit);
-    update.commit();
-    return tr.parseBody(commit);
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/CommentTimestampAdapterTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/CommentTimestampAdapterTest.java
deleted file mode 100644
index aa37d51..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/CommentTimestampAdapterTest.java
+++ /dev/null
@@ -1,173 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.notedb;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Comment;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import java.sql.Timestamp;
-import java.time.ZonedDateTime;
-import java.util.TimeZone;
-import java.util.concurrent.TimeUnit;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-public class CommentTimestampAdapterTest {
-  /** Arbitrary time outside of a DST transition, as an ISO instant. */
-  private static final String NON_DST_STR = "2017-02-07T10:20:30.123Z";
-
-  /** Arbitrary time outside of a DST transition, as a reasonable Java 8 representation. */
-  private static final ZonedDateTime NON_DST = ZonedDateTime.parse(NON_DST_STR);
-
-  /** {@link #NON_DST_STR} truncated to seconds. */
-  private static final String NON_DST_STR_TRUNC = "2017-02-07T10:20:30Z";
-
-  /** Arbitrary time outside of a DST transition, as an unreasonable Timestamp representation. */
-  private static final Timestamp NON_DST_TS = Timestamp.from(NON_DST.toInstant());
-
-  /** {@link #NON_DST_TS} truncated to seconds. */
-  private static final Timestamp NON_DST_TS_TRUNC =
-      Timestamp.from(ZonedDateTime.parse(NON_DST_STR_TRUNC).toInstant());
-
-  /**
-   * Real live ms since epoch timestamp of a comment that was posted during the PDT to PST
-   * transition in November 2013.
-   */
-  private static final long MID_DST_MS = 1383466224175L;
-
-  /**
-   * Ambiguous string representation of {@link #MID_DST_MS} that was actually stored in NoteDb for
-   * this comment.
-   */
-  private static final String MID_DST_STR = "Nov 3, 2013 1:10:24 AM";
-
-  private TimeZone systemTimeZone;
-  private Gson legacyGson;
-  private Gson gson;
-
-  @Before
-  public void setUp() {
-    systemTimeZone = TimeZone.getDefault();
-    TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles"));
-
-    // Match ChangeNoteUtil#gson as of 4e1f02db913d91f2988f559048e513e6093a1bce
-    legacyGson = new GsonBuilder().setPrettyPrinting().create();
-    gson = ChangeNoteUtil.newGson();
-  }
-
-  @After
-  public void tearDown() {
-    TimeZone.setDefault(systemTimeZone);
-  }
-
-  @Test
-  public void legacyGsonBehavesAsExpectedDuringDstTransition() {
-    long oneHourMs = TimeUnit.HOURS.toMillis(1);
-
-    String beforeJson = "\"Nov 3, 2013 12:10:24 AM\"";
-    Timestamp beforeTs = new Timestamp(MID_DST_MS - oneHourMs);
-    assertThat(legacyGson.toJson(beforeTs)).isEqualTo(beforeJson);
-
-    String ambiguousJson = '"' + MID_DST_STR + '"';
-    Timestamp duringTs = new Timestamp(MID_DST_MS);
-    assertThat(legacyGson.toJson(duringTs)).isEqualTo(ambiguousJson);
-
-    Timestamp afterTs = new Timestamp(MID_DST_MS + oneHourMs);
-    assertThat(legacyGson.toJson(afterTs)).isEqualTo(ambiguousJson);
-
-    Timestamp beforeTsTruncated = new Timestamp(beforeTs.getTime() / 1000 * 1000);
-    assertThat(legacyGson.fromJson(beforeJson, Timestamp.class)).isEqualTo(beforeTsTruncated);
-
-    // Gson just picks one, and it happens to be the one after the PST transition.
-    Timestamp afterTsTruncated = new Timestamp(afterTs.getTime() / 1000 * 1000);
-    assertThat(legacyGson.fromJson(ambiguousJson, Timestamp.class)).isEqualTo(afterTsTruncated);
-  }
-
-  @Test
-  public void legacyAdapterViaZonedDateTime() {
-    assertThat(legacyGson.toJson(NON_DST_TS)).isEqualTo("\"Feb 7, 2017 2:20:30 AM\"");
-  }
-
-  @Test
-  public void legacyAdapterCanParseOutputOfNewAdapter() {
-    String instantJson = gson.toJson(NON_DST_TS);
-    assertThat(instantJson).isEqualTo('"' + NON_DST_STR_TRUNC + '"');
-    Timestamp result = legacyGson.fromJson(instantJson, Timestamp.class);
-    assertThat(result).isEqualTo(NON_DST_TS_TRUNC);
-  }
-
-  @Test
-  public void newAdapterCanParseOutputOfLegacyAdapter() {
-    String legacyJson = legacyGson.toJson(NON_DST_TS);
-    assertThat(legacyJson).isEqualTo("\"Feb 7, 2017 2:20:30 AM\"");
-    assertThat(gson.fromJson(legacyJson, Timestamp.class))
-        .isEqualTo(new Timestamp(NON_DST_TS.getTime() / 1000 * 1000));
-  }
-
-  @Test
-  public void newAdapterDisagreesWithLegacyAdapterDuringDstTransition() {
-    String duringJson = legacyGson.toJson(new Timestamp(MID_DST_MS));
-    Timestamp duringTs = legacyGson.fromJson(duringJson, Timestamp.class);
-
-    // This is unfortunate, but it's just documenting the current behavior, there is no real good
-    // solution here. The goal is that all these changes will be rebuilt with proper UTC instant
-    // strings shortly after the new adapter is live.
-    Timestamp newDuringTs = gson.fromJson(duringJson, Timestamp.class);
-    assertThat(newDuringTs.toString()).isEqualTo(duringTs.toString());
-    assertThat(newDuringTs).isNotEqualTo(duringTs);
-  }
-
-  @Test
-  public void newAdapterRoundTrip() {
-    String json = gson.toJson(NON_DST_TS);
-    // Round-trip lossily truncates ms, but that's ok.
-    assertThat(json).isEqualTo('"' + NON_DST_STR_TRUNC + '"');
-    assertThat(gson.fromJson(json, Timestamp.class)).isEqualTo(NON_DST_TS_TRUNC);
-  }
-
-  @Test
-  public void nullSafety() {
-    assertThat(gson.toJson(null, Timestamp.class)).isEqualTo("null");
-    assertThat(gson.fromJson("null", Timestamp.class)).isNull();
-  }
-
-  @Test
-  public void newAdapterRoundTripOfWholeComment() {
-    Comment c =
-        new Comment(
-            new Comment.Key("uuid", "filename", 1),
-            new Account.Id(100),
-            NON_DST_TS,
-            (short) 0,
-            "message",
-            "serverId",
-            false);
-    c.lineNbr = 1;
-    c.revId = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef";
-
-    String json = gson.toJson(c);
-    assertThat(json).contains("\"writtenOn\": \"" + NON_DST_STR_TRUNC + "\",");
-
-    Comment result = gson.fromJson(json, Comment.class);
-    // Round-trip lossily truncates ms, but that's ok.
-    assertThat(result.writtenOn).isEqualTo(NON_DST_TS_TRUNC);
-    result.writtenOn = NON_DST_TS;
-    assertThat(result).isEqualTo(c);
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/CommitMessageOutputTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/CommitMessageOutputTest.java
deleted file mode 100644
index 83dcf61..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/CommitMessageOutputTest.java
+++ /dev/null
@@ -1,427 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.notedb;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.server.notedb.ReviewerStateInternal.CC;
-import static com.google.gerrit.server.notedb.ReviewerStateInternal.REVIEWER;
-
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.util.RequestId;
-import com.google.gerrit.testutil.ConfigSuite;
-import com.google.gerrit.testutil.TestChanges;
-import java.util.Date;
-import java.util.TimeZone;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(ConfigSuite.class)
-public class CommitMessageOutputTest extends AbstractChangeNotesTest {
-  @Test
-  public void approvalsCommitFormatSimple() throws Exception {
-    Change c = TestChanges.newChange(project, changeOwner.getAccountId(), 1);
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.putApproval("Verified", (short) 1);
-    update.putApproval("Code-Review", (short) -1);
-    update.putReviewer(changeOwner.getAccount().getId(), REVIEWER);
-    update.putReviewer(otherUser.getAccount().getId(), CC);
-    update.commit();
-    assertThat(update.getRefName()).isEqualTo("refs/changes/01/1/meta");
-
-    RevCommit commit = parseCommit(update.getResult());
-    assertBodyEquals(
-        "Update patch set 1\n"
-            + "\n"
-            + "Patch-set: 1\n"
-            + "Change-id: "
-            + c.getKey().get()
-            + "\n"
-            + "Subject: Change subject\n"
-            + "Branch: refs/heads/master\n"
-            + "Commit: "
-            + update.getCommit().name()
-            + "\n"
-            + "Reviewer: Change Owner <1@gerrit>\n"
-            + "CC: Other Account <2@gerrit>\n"
-            + "Label: Code-Review=-1\n"
-            + "Label: Verified=+1\n",
-        commit);
-
-    PersonIdent author = commit.getAuthorIdent();
-    assertThat(author.getName()).isEqualTo("Change Owner");
-    assertThat(author.getEmailAddress()).isEqualTo("1@gerrit");
-    assertThat(author.getWhen()).isEqualTo(new Date(c.getCreatedOn().getTime() + 1000));
-    assertThat(author.getTimeZone()).isEqualTo(TimeZone.getTimeZone("GMT-7:00"));
-
-    PersonIdent committer = commit.getCommitterIdent();
-    assertThat(committer.getName()).isEqualTo("Gerrit Server");
-    assertThat(committer.getEmailAddress()).isEqualTo("noreply@gerrit.com");
-    assertThat(committer.getWhen()).isEqualTo(author.getWhen());
-    assertThat(committer.getTimeZone()).isEqualTo(author.getTimeZone());
-  }
-
-  @Test
-  public void changeMessageCommitFormatSimple() throws Exception {
-    Change c = TestChanges.newChange(project, changeOwner.getAccountId(), 1);
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setChangeMessage("Just a little code change.\nHow about a new line");
-    update.commit();
-    assertThat(update.getRefName()).isEqualTo("refs/changes/01/1/meta");
-
-    assertBodyEquals(
-        "Update patch set 1\n"
-            + "\n"
-            + "Just a little code change.\n"
-            + "How about a new line\n"
-            + "\n"
-            + "Patch-set: 1\n"
-            + "Change-id: "
-            + c.getKey().get()
-            + "\n"
-            + "Subject: Change subject\n"
-            + "Branch: refs/heads/master\n"
-            + "Commit: "
-            + update.getCommit().name()
-            + "\n",
-        update.getResult());
-  }
-
-  @Test
-  public void changeWithRevision() throws Exception {
-    Change c = TestChanges.newChange(project, changeOwner.getAccountId(), 1);
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setChangeMessage("Foo");
-    RevCommit commit = tr.commit().message("Subject").create();
-    update.setCommit(rw, commit);
-    update.commit();
-    assertThat(update.getRefName()).isEqualTo("refs/changes/01/1/meta");
-
-    assertBodyEquals(
-        "Update patch set 1\n"
-            + "\n"
-            + "Foo\n"
-            + "\n"
-            + "Patch-set: 1\n"
-            + "Change-id: "
-            + c.getKey().get()
-            + "\n"
-            + "Subject: Subject\n"
-            + "Branch: refs/heads/master\n"
-            + "Commit: "
-            + commit.name()
-            + "\n",
-        update.getResult());
-  }
-
-  @Test
-  public void approvalTombstoneCommitFormat() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.removeApproval("Code-Review");
-    update.commit();
-
-    assertBodyEquals(
-        "Update patch set 1\n\nPatch-set: 1\nLabel: -Code-Review\n", update.getResult());
-  }
-
-  @Test
-  public void submitCommitFormat() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setSubjectForCommit("Submit patch set 1");
-
-    RequestId submissionId = RequestId.forChange(c);
-    update.merge(
-        submissionId,
-        ImmutableList.of(
-            submitRecord(
-                "NOT_READY",
-                null,
-                submitLabel("Verified", "OK", changeOwner.getAccountId()),
-                submitLabel("Code-Review", "NEED", null)),
-            submitRecord(
-                "NOT_READY",
-                null,
-                submitLabel("Verified", "OK", changeOwner.getAccountId()),
-                submitLabel("Alternative-Code-Review", "NEED", null))));
-    update.commit();
-
-    RevCommit commit = parseCommit(update.getResult());
-    assertBodyEquals(
-        "Submit patch set 1\n"
-            + "\n"
-            + "Patch-set: 1\n"
-            + "Status: merged\n"
-            + "Submission-id: "
-            + submissionId.toStringForStorage()
-            + "\n"
-            + "Submitted-with: NOT_READY\n"
-            + "Submitted-with: OK: Verified: Change Owner <1@gerrit>\n"
-            + "Submitted-with: NEED: Code-Review\n"
-            + "Submitted-with: NOT_READY\n"
-            + "Submitted-with: OK: Verified: Change Owner <1@gerrit>\n"
-            + "Submitted-with: NEED: Alternative-Code-Review\n",
-        commit);
-
-    PersonIdent author = commit.getAuthorIdent();
-    assertThat(author.getName()).isEqualTo("Change Owner");
-    assertThat(author.getEmailAddress()).isEqualTo("1@gerrit");
-    assertThat(author.getWhen()).isEqualTo(new Date(c.getCreatedOn().getTime() + 2000));
-    assertThat(author.getTimeZone()).isEqualTo(TimeZone.getTimeZone("GMT-7:00"));
-
-    PersonIdent committer = commit.getCommitterIdent();
-    assertThat(committer.getName()).isEqualTo("Gerrit Server");
-    assertThat(committer.getEmailAddress()).isEqualTo("noreply@gerrit.com");
-    assertThat(committer.getWhen()).isEqualTo(author.getWhen());
-    assertThat(committer.getTimeZone()).isEqualTo(author.getTimeZone());
-  }
-
-  @Test
-  public void anonymousUser() throws Exception {
-    Account anon = new Account(new Account.Id(3), TimeUtil.nowTs());
-    accountCache.put(anon);
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, userFactory.create(anon.getId()));
-    update.setChangeMessage("Comment on the change.");
-    update.commit();
-
-    RevCommit commit = parseCommit(update.getResult());
-    assertBodyEquals("Update patch set 1\n\nComment on the change.\n\nPatch-set: 1\n", commit);
-
-    PersonIdent author = commit.getAuthorIdent();
-    assertThat(author.getName()).isEqualTo("Anonymous Coward (3)");
-    assertThat(author.getEmailAddress()).isEqualTo("3@gerrit");
-  }
-
-  @Test
-  public void submitWithErrorMessage() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setSubjectForCommit("Submit patch set 1");
-
-    RequestId submissionId = RequestId.forChange(c);
-    update.merge(
-        submissionId, ImmutableList.of(submitRecord("RULE_ERROR", "Problem with patch set:\n1")));
-    update.commit();
-
-    assertBodyEquals(
-        "Submit patch set 1\n"
-            + "\n"
-            + "Patch-set: 1\n"
-            + "Status: merged\n"
-            + "Submission-id: "
-            + submissionId.toStringForStorage()
-            + "\n"
-            + "Submitted-with: RULE_ERROR Problem with patch set: 1\n",
-        update.getResult());
-  }
-
-  @Test
-  public void noChangeMessage() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.putReviewer(changeOwner.getAccount().getId(), REVIEWER);
-    update.commit();
-
-    assertBodyEquals(
-        "Update patch set 1\n\nPatch-set: 1\nReviewer: Change Owner <1@gerrit>\n",
-        update.getResult());
-  }
-
-  @Test
-  public void changeMessageWithTrailingDoubleNewline() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setChangeMessage("Testing trailing double newline\n\n");
-    update.commit();
-
-    assertBodyEquals(
-        "Update patch set 1\n"
-            + "\n"
-            + "Testing trailing double newline\n"
-            + "\n"
-            + "\n"
-            + "\n"
-            + "Patch-set: 1\n",
-        update.getResult());
-  }
-
-  @Test
-  public void changeMessageWithMultipleParagraphs() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setChangeMessage("Testing paragraph 1\n\nTesting paragraph 2\n\nTesting paragraph 3");
-    update.commit();
-
-    assertBodyEquals(
-        "Update patch set 1\n"
-            + "\n"
-            + "Testing paragraph 1\n"
-            + "\n"
-            + "Testing paragraph 2\n"
-            + "\n"
-            + "Testing paragraph 3\n"
-            + "\n"
-            + "Patch-set: 1\n",
-        update.getResult());
-  }
-
-  @Test
-  public void changeMessageWithTag() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setChangeMessage("Change message with tag");
-    update.setTag("jenkins");
-    update.commit();
-
-    assertBodyEquals(
-        "Update patch set 1\n"
-            + "\n"
-            + "Change message with tag\n"
-            + "\n"
-            + "Patch-set: 1\n"
-            + "Tag: jenkins\n",
-        update.getResult());
-  }
-
-  @Test
-  public void leadingWhitespace() throws Exception {
-    Change c = TestChanges.newChange(project, changeOwner.getAccountId());
-    c.setCurrentPatchSet(c.currentPatchSetId(), "  " + c.getSubject(), c.getOriginalSubject());
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setChangeId(c.getKey().get());
-    update.setBranch(c.getDest().get());
-    update.commit();
-
-    assertBodyEquals(
-        "Update patch set 1\n"
-            + "\n"
-            + "Patch-set: 1\n"
-            + "Change-id: "
-            + c.getKey().get()
-            + "\n"
-            + "Subject:   Change subject\n"
-            + "Branch: refs/heads/master\n"
-            + "Commit: "
-            + update.getCommit().name()
-            + "\n",
-        update.getResult());
-
-    c = TestChanges.newChange(project, changeOwner.getAccountId());
-    c.setCurrentPatchSet(c.currentPatchSetId(), "\t\t" + c.getSubject(), c.getOriginalSubject());
-    update = newUpdate(c, changeOwner);
-    update.setChangeId(c.getKey().get());
-    update.setBranch(c.getDest().get());
-    update.commit();
-
-    assertBodyEquals(
-        "Update patch set 1\n"
-            + "\n"
-            + "Patch-set: 1\n"
-            + "Change-id: "
-            + c.getKey().get()
-            + "\n"
-            + "Subject: \t\tChange subject\n"
-            + "Branch: refs/heads/master\n"
-            + "Commit: "
-            + update.getCommit().name()
-            + "\n",
-        update.getResult());
-  }
-
-  @Test
-  public void realUser() throws Exception {
-    Change c = newChange();
-    CurrentUser ownerAsOtherUser = userFactory.runAs(null, otherUserId, changeOwner);
-    ChangeUpdate update = newUpdate(c, ownerAsOtherUser);
-    update.setChangeMessage("Message on behalf of other user");
-    update.commit();
-
-    RevCommit commit = parseCommit(update.getResult());
-    PersonIdent author = commit.getAuthorIdent();
-    assertThat(author.getName()).isEqualTo("Other Account");
-    assertThat(author.getEmailAddress()).isEqualTo("2@gerrit");
-
-    assertBodyEquals(
-        "Update patch set 1\n"
-            + "\n"
-            + "Message on behalf of other user\n"
-            + "\n"
-            + "Patch-set: 1\n"
-            + "Real-user: Change Owner <1@gerrit>\n",
-        commit);
-  }
-
-  @Test
-  public void currentPatchSet() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.setCurrentPatchSet();
-    update.commit();
-
-    assertBodyEquals("Update patch set 1\n\nPatch-set: 1\nCurrent: true\n", update.getResult());
-  }
-
-  @Test
-  public void reviewerByEmail() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.putReviewerByEmail(
-        new Address("John Doe", "j.doe@gerritcodereview.com"), ReviewerStateInternal.REVIEWER);
-    update.commit();
-
-    assertBodyEquals(
-        "Update patch set 1\n\nPatch-set: 1\n"
-            + "Reviewer-email: John Doe <j.doe@gerritcodereview.com>\n",
-        update.getResult());
-  }
-
-  @Test
-  public void ccByEmail() throws Exception {
-    Change c = newChange();
-    ChangeUpdate update = newUpdate(c, changeOwner);
-    update.putReviewerByEmail(new Address("j.doe@gerritcodereview.com"), ReviewerStateInternal.CC);
-    update.commit();
-
-    assertBodyEquals(
-        "Update patch set 1\n\nPatch-set: 1\nCC-email: j.doe@gerritcodereview.com\n",
-        update.getResult());
-  }
-
-  private RevCommit parseCommit(ObjectId id) throws Exception {
-    if (id instanceof RevCommit) {
-      return (RevCommit) id;
-    }
-    try (RevWalk walk = new RevWalk(repo)) {
-      RevCommit commit = walk.parseCommit(id);
-      walk.parseBody(commit);
-      return commit;
-    }
-  }
-
-  private void assertBodyEquals(String expected, ObjectId commitId) throws Exception {
-    RevCommit commit = parseCommit(commitId);
-    assertThat(commit.getFullMessage()).isEqualTo(expected);
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/NoteDbChangeStateTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/NoteDbChangeStateTest.java
deleted file mode 100644
index 67ad65c..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/NoteDbChangeStateTest.java
+++ /dev/null
@@ -1,241 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.notedb;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth8.assertThat;
-import static com.google.gerrit.common.TimeUtil.nowTs;
-import static com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage.NOTE_DB;
-import static com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage.REVIEW_DB;
-import static com.google.gerrit.server.notedb.NoteDbChangeState.applyDelta;
-import static com.google.gerrit.server.notedb.NoteDbChangeState.parse;
-import static org.eclipse.jgit.lib.ObjectId.zeroId;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.notedb.NoteDbChangeState.Delta;
-import com.google.gerrit.server.notedb.NoteDbChangeState.RefState;
-import com.google.gerrit.testutil.GerritBaseTests;
-import com.google.gerrit.testutil.TestChanges;
-import com.google.gerrit.testutil.TestTimeUtil;
-import java.sql.Timestamp;
-import java.util.Optional;
-import java.util.concurrent.TimeUnit;
-import org.eclipse.jgit.lib.ObjectId;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-/** Unit tests for {@link NoteDbChangeState}. */
-public class NoteDbChangeStateTest extends GerritBaseTests {
-  ObjectId SHA1 = ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef");
-  ObjectId SHA2 = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
-  ObjectId SHA3 = ObjectId.fromString("badc0feebadc0feebadc0feebadc0feebadc0fee");
-
-  @Before
-  public void setUp() {
-    TestTimeUtil.resetWithClockStep(1, TimeUnit.SECONDS);
-  }
-
-  @After
-  public void tearDown() {
-    TestTimeUtil.useSystemTime();
-  }
-
-  @Test
-  public void parseReviewDbWithoutDrafts() {
-    NoteDbChangeState state = parse(new Change.Id(1), SHA1.name());
-    assertThat(state.getPrimaryStorage()).isEqualTo(REVIEW_DB);
-    assertThat(state.getChangeId()).isEqualTo(new Change.Id(1));
-    assertThat(state.getChangeMetaId()).isEqualTo(SHA1);
-    assertThat(state.getDraftIds()).isEmpty();
-    assertThat(state.getReadOnlyUntil()).isEmpty();
-    assertThat(state.toString()).isEqualTo(SHA1.name());
-
-    state = parse(new Change.Id(1), "R," + SHA1.name());
-    assertThat(state.getPrimaryStorage()).isEqualTo(REVIEW_DB);
-    assertThat(state.getChangeId()).isEqualTo(new Change.Id(1));
-    assertThat(state.getChangeMetaId()).isEqualTo(SHA1);
-    assertThat(state.getDraftIds()).isEmpty();
-    assertThat(state.getReadOnlyUntil()).isEmpty();
-    assertThat(state.toString()).isEqualTo(SHA1.name());
-  }
-
-  @Test
-  public void parseReviewDbWithDrafts() {
-    String str = SHA1.name() + ",2003=" + SHA2.name() + ",1001=" + SHA3.name();
-    String expected = SHA1.name() + ",1001=" + SHA3.name() + ",2003=" + SHA2.name();
-    NoteDbChangeState state = parse(new Change.Id(1), str);
-    assertThat(state.getPrimaryStorage()).isEqualTo(REVIEW_DB);
-    assertThat(state.getChangeId()).isEqualTo(new Change.Id(1));
-    assertThat(state.getChangeMetaId()).isEqualTo(SHA1);
-    assertThat(state.getDraftIds())
-        .containsExactly(
-            new Account.Id(1001), SHA3,
-            new Account.Id(2003), SHA2);
-    assertThat(state.getReadOnlyUntil()).isEmpty();
-    assertThat(state.toString()).isEqualTo(expected);
-
-    state = parse(new Change.Id(1), "R," + str);
-    assertThat(state.getPrimaryStorage()).isEqualTo(REVIEW_DB);
-    assertThat(state.getChangeId()).isEqualTo(new Change.Id(1));
-    assertThat(state.getChangeMetaId()).isEqualTo(SHA1);
-    assertThat(state.getDraftIds())
-        .containsExactly(
-            new Account.Id(1001), SHA3,
-            new Account.Id(2003), SHA2);
-    assertThat(state.getReadOnlyUntil()).isEmpty();
-    assertThat(state.toString()).isEqualTo(expected);
-  }
-
-  @Test
-  public void parseReadOnlyUntil() {
-    Timestamp ts = new Timestamp(12345);
-    String str = "R=12345," + SHA1.name();
-    NoteDbChangeState state = parse(new Change.Id(1), str);
-    assertThat(state.getPrimaryStorage()).isEqualTo(REVIEW_DB);
-    assertThat(state.getChangeId()).isEqualTo(new Change.Id(1));
-    assertThat(state.getChangeMetaId()).isEqualTo(SHA1);
-    assertThat(state.getReadOnlyUntil().get()).isEqualTo(ts);
-    assertThat(state.toString()).isEqualTo(str);
-
-    str = "N=12345";
-    state = parse(new Change.Id(1), str);
-    assertThat(state.getPrimaryStorage()).isEqualTo(NOTE_DB);
-    assertThat(state.getChangeId()).isEqualTo(new Change.Id(1));
-    assertThat(state.getRefState()).isEmpty();
-    assertThat(state.getReadOnlyUntil().get()).isEqualTo(ts);
-    assertThat(state.toString()).isEqualTo(str);
-  }
-
-  @Test
-  public void applyDeltaToNullWithNoNewMetaId() throws Exception {
-    Change c = newChange();
-    assertThat(c.getNoteDbState()).isNull();
-    applyDelta(c, Delta.create(c.getId(), noMetaId(), noDrafts()));
-    assertThat(c.getNoteDbState()).isNull();
-
-    applyDelta(c, Delta.create(c.getId(), noMetaId(), drafts(new Account.Id(1001), zeroId())));
-    assertThat(c.getNoteDbState()).isNull();
-  }
-
-  @Test
-  public void applyDeltaToMetaId() throws Exception {
-    Change c = newChange();
-    applyDelta(c, Delta.create(c.getId(), metaId(SHA1), noDrafts()));
-    assertThat(c.getNoteDbState()).isEqualTo(SHA1.name());
-
-    applyDelta(c, Delta.create(c.getId(), metaId(SHA2), noDrafts()));
-    assertThat(c.getNoteDbState()).isEqualTo(SHA2.name());
-
-    // No-op delta.
-    applyDelta(c, Delta.create(c.getId(), noMetaId(), noDrafts()));
-    assertThat(c.getNoteDbState()).isEqualTo(SHA2.name());
-
-    // Set to zero clears the field.
-    applyDelta(c, Delta.create(c.getId(), metaId(zeroId()), noDrafts()));
-    assertThat(c.getNoteDbState()).isNull();
-  }
-
-  @Test
-  public void applyDeltaToDrafts() throws Exception {
-    Change c = newChange();
-    applyDelta(c, Delta.create(c.getId(), metaId(SHA1), drafts(new Account.Id(1001), SHA2)));
-    assertThat(c.getNoteDbState()).isEqualTo(SHA1.name() + ",1001=" + SHA2.name());
-
-    applyDelta(c, Delta.create(c.getId(), noMetaId(), drafts(new Account.Id(2003), SHA3)));
-    assertThat(c.getNoteDbState())
-        .isEqualTo(SHA1.name() + ",1001=" + SHA2.name() + ",2003=" + SHA3.name());
-
-    applyDelta(c, Delta.create(c.getId(), noMetaId(), drafts(new Account.Id(2003), zeroId())));
-    assertThat(c.getNoteDbState()).isEqualTo(SHA1.name() + ",1001=" + SHA2.name());
-
-    applyDelta(c, Delta.create(c.getId(), metaId(SHA3), noDrafts()));
-    assertThat(c.getNoteDbState()).isEqualTo(SHA3.name() + ",1001=" + SHA2.name());
-  }
-
-  @Test
-  public void applyDeltaToReadOnly() throws Exception {
-    Timestamp ts = nowTs();
-    Change c = newChange();
-    NoteDbChangeState state =
-        new NoteDbChangeState(
-            c.getId(),
-            REVIEW_DB,
-            Optional.of(RefState.create(SHA1, ImmutableMap.of())),
-            Optional.of(new Timestamp(ts.getTime() + 10000)));
-    c.setNoteDbState(state.toString());
-    Delta delta = Delta.create(c.getId(), metaId(SHA2), noDrafts());
-    applyDelta(c, delta);
-    assertThat(NoteDbChangeState.parse(c))
-        .isEqualTo(
-            new NoteDbChangeState(
-                state.getChangeId(),
-                state.getPrimaryStorage(),
-                Optional.of(RefState.create(SHA2, ImmutableMap.of())),
-                state.getReadOnlyUntil()));
-  }
-
-  @Test
-  public void parseNoteDbPrimary() {
-    NoteDbChangeState state = parse(new Change.Id(1), "N");
-    assertThat(state.getPrimaryStorage()).isEqualTo(NOTE_DB);
-    assertThat(state.getRefState()).isEmpty();
-    assertThat(state.getReadOnlyUntil()).isEmpty();
-  }
-
-  @Test(expected = IllegalArgumentException.class)
-  public void parseInvalidPrimaryStorage() {
-    parse(new Change.Id(1), "X");
-  }
-
-  @Test
-  public void applyDeltaToNoteDbPrimaryIsNoOp() throws Exception {
-    Change c = newChange();
-    c.setNoteDbState("N");
-    applyDelta(c, Delta.create(c.getId(), metaId(SHA1), drafts(new Account.Id(1001), SHA2)));
-    assertThat(c.getNoteDbState()).isEqualTo("N");
-  }
-
-  private static Change newChange() {
-    return TestChanges.newChange(new Project.NameKey("project"), new Account.Id(12345));
-  }
-
-  // Static factory methods to avoid type arguments when using as method args.
-
-  private static Optional<ObjectId> noMetaId() {
-    return Optional.empty();
-  }
-
-  private static Optional<ObjectId> metaId(ObjectId id) {
-    return Optional.of(id);
-  }
-
-  private static ImmutableMap<Account.Id, ObjectId> noDrafts() {
-    return ImmutableMap.of();
-  }
-
-  private static ImmutableMap<Account.Id, ObjectId> drafts(Object... args) {
-    checkArgument(args.length % 2 == 0);
-    ImmutableMap.Builder<Account.Id, ObjectId> b = ImmutableMap.builder();
-    for (int i = 0; i < args.length / 2; i++) {
-      b.put((Account.Id) args[2 * i], (ObjectId) args[2 * i + 1]);
-    }
-    return b.build();
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/RepoSequenceTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/RepoSequenceTest.java
deleted file mode 100644
index 76be4569..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/RepoSequenceTest.java
+++ /dev/null
@@ -1,305 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.notedb;
-
-import static com.google.common.truth.Truth.assertThat;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
-import static org.junit.Assert.fail;
-
-import com.github.rholder.retry.Retryer;
-import com.github.rholder.retry.RetryerBuilder;
-import com.github.rholder.retry.StopStrategies;
-import com.google.common.util.concurrent.Runnables;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.testutil.InMemoryRepositoryManager;
-import com.google.gwtorm.server.OrmException;
-import java.io.IOException;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-import org.eclipse.jgit.errors.IncorrectObjectTypeException;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-
-public class RepoSequenceTest {
-  // Don't sleep in tests.
-  private static final Retryer<RefUpdate.Result> RETRYER =
-      RepoSequence.retryerBuilder().withBlockStrategy(t -> {}).build();
-
-  @Rule public ExpectedException exception = ExpectedException.none();
-
-  private InMemoryRepositoryManager repoManager;
-  private Project.NameKey project;
-
-  @Before
-  public void setUp() throws Exception {
-    repoManager = new InMemoryRepositoryManager();
-    project = new Project.NameKey("project");
-    repoManager.createRepository(project);
-  }
-
-  @Test
-  public void oneCaller() throws Exception {
-    int max = 20;
-    for (int batchSize = 1; batchSize <= 10; batchSize++) {
-      String name = "batch-size-" + batchSize;
-      RepoSequence s = newSequence(name, 1, batchSize);
-      for (int i = 1; i <= max; i++) {
-        try {
-          assertThat(s.next()).named("i=" + i + " for " + name).isEqualTo(i);
-        } catch (OrmException e) {
-          throw new AssertionError("failed batchSize=" + batchSize + ", i=" + i, e);
-        }
-      }
-      assertThat(s.acquireCount)
-          .named("acquireCount for " + name)
-          .isEqualTo(divCeil(max, batchSize));
-    }
-  }
-
-  @Test
-  public void oneCallerNoLoop() throws Exception {
-    RepoSequence s = newSequence("id", 1, 3);
-    assertThat(s.acquireCount).isEqualTo(0);
-
-    assertThat(s.next()).isEqualTo(1);
-    assertThat(s.acquireCount).isEqualTo(1);
-    assertThat(s.next()).isEqualTo(2);
-    assertThat(s.acquireCount).isEqualTo(1);
-    assertThat(s.next()).isEqualTo(3);
-    assertThat(s.acquireCount).isEqualTo(1);
-
-    assertThat(s.next()).isEqualTo(4);
-    assertThat(s.acquireCount).isEqualTo(2);
-    assertThat(s.next()).isEqualTo(5);
-    assertThat(s.acquireCount).isEqualTo(2);
-    assertThat(s.next()).isEqualTo(6);
-    assertThat(s.acquireCount).isEqualTo(2);
-
-    assertThat(s.next()).isEqualTo(7);
-    assertThat(s.acquireCount).isEqualTo(3);
-    assertThat(s.next()).isEqualTo(8);
-    assertThat(s.acquireCount).isEqualTo(3);
-    assertThat(s.next()).isEqualTo(9);
-    assertThat(s.acquireCount).isEqualTo(3);
-
-    assertThat(s.next()).isEqualTo(10);
-    assertThat(s.acquireCount).isEqualTo(4);
-  }
-
-  @Test
-  public void twoCallers() throws Exception {
-    RepoSequence s1 = newSequence("id", 1, 3);
-    RepoSequence s2 = newSequence("id", 1, 3);
-
-    // s1 acquires 1-3; s2 acquires 4-6.
-    assertThat(s1.next()).isEqualTo(1);
-    assertThat(s2.next()).isEqualTo(4);
-    assertThat(s1.next()).isEqualTo(2);
-    assertThat(s2.next()).isEqualTo(5);
-    assertThat(s1.next()).isEqualTo(3);
-    assertThat(s2.next()).isEqualTo(6);
-
-    // s2 acquires 7-9; s1 acquires 10-12.
-    assertThat(s2.next()).isEqualTo(7);
-    assertThat(s1.next()).isEqualTo(10);
-    assertThat(s2.next()).isEqualTo(8);
-    assertThat(s1.next()).isEqualTo(11);
-    assertThat(s2.next()).isEqualTo(9);
-    assertThat(s1.next()).isEqualTo(12);
-  }
-
-  @Test
-  public void populateEmptyRefWithStartValue() throws Exception {
-    RepoSequence s = newSequence("id", 1234, 10);
-    assertThat(s.next()).isEqualTo(1234);
-    assertThat(readBlob("id")).isEqualTo("1244");
-  }
-
-  @Test
-  public void startIsIgnoredIfRefIsPresent() throws Exception {
-    writeBlob("id", "1234");
-    RepoSequence s = newSequence("id", 3456, 10);
-    assertThat(s.next()).isEqualTo(1234);
-    assertThat(readBlob("id")).isEqualTo("1244");
-  }
-
-  @Test
-  public void retryOnLockFailure() throws Exception {
-    // Seed existing ref value.
-    writeBlob("id", "1");
-
-    AtomicBoolean doneBgUpdate = new AtomicBoolean(false);
-    Runnable bgUpdate =
-        () -> {
-          if (!doneBgUpdate.getAndSet(true)) {
-            writeBlob("id", "1234");
-          }
-        };
-
-    RepoSequence s = newSequence("id", 1, 10, bgUpdate, RETRYER);
-    assertThat(doneBgUpdate.get()).isFalse();
-    assertThat(s.next()).isEqualTo(1234);
-    // Single acquire call that results in 2 ref reads.
-    assertThat(s.acquireCount).isEqualTo(1);
-    assertThat(doneBgUpdate.get()).isTrue();
-  }
-
-  @Test
-  public void failOnInvalidValue() throws Exception {
-    ObjectId id = writeBlob("id", "not a number");
-    exception.expect(OrmException.class);
-    exception.expectMessage("invalid value in refs/sequences/id blob at " + id.name());
-    newSequence("id", 1, 3).next();
-  }
-
-  @Test
-  public void failOnWrongType() throws Exception {
-    try (Repository repo = repoManager.openRepository(project)) {
-      TestRepository<Repository> tr = new TestRepository<>(repo);
-      tr.branch(RefNames.REFS_SEQUENCES + "id").commit().create();
-      try {
-        newSequence("id", 1, 3).next();
-        fail();
-      } catch (OrmException e) {
-        assertThat(e.getCause()).isInstanceOf(ExecutionException.class);
-        assertThat(e.getCause().getCause()).isInstanceOf(IncorrectObjectTypeException.class);
-      }
-    }
-  }
-
-  @Test
-  public void failAfterRetryerGivesUp() throws Exception {
-    AtomicInteger bgCounter = new AtomicInteger(1234);
-    RepoSequence s =
-        newSequence(
-            "id",
-            1,
-            10,
-            () -> writeBlob("id", Integer.toString(bgCounter.getAndAdd(1000))),
-            RetryerBuilder.<RefUpdate.Result>newBuilder()
-                .withStopStrategy(StopStrategies.stopAfterAttempt(3))
-                .build());
-    exception.expect(OrmException.class);
-    exception.expectMessage("failed to update refs/sequences/id: LOCK_FAILURE");
-    s.next();
-  }
-
-  @Test
-  public void nextWithCountOneCaller() throws Exception {
-    RepoSequence s = newSequence("id", 1, 3);
-    assertThat(s.next(2)).containsExactly(1, 2).inOrder();
-    assertThat(s.acquireCount).isEqualTo(1);
-    assertThat(s.next(2)).containsExactly(3, 4).inOrder();
-    assertThat(s.acquireCount).isEqualTo(2);
-    assertThat(s.next(2)).containsExactly(5, 6).inOrder();
-    assertThat(s.acquireCount).isEqualTo(2);
-
-    assertThat(s.next(3)).containsExactly(7, 8, 9).inOrder();
-    assertThat(s.acquireCount).isEqualTo(3);
-    assertThat(s.next(3)).containsExactly(10, 11, 12).inOrder();
-    assertThat(s.acquireCount).isEqualTo(4);
-    assertThat(s.next(3)).containsExactly(13, 14, 15).inOrder();
-    assertThat(s.acquireCount).isEqualTo(5);
-
-    assertThat(s.next(7)).containsExactly(16, 17, 18, 19, 20, 21, 22).inOrder();
-    assertThat(s.acquireCount).isEqualTo(6);
-    assertThat(s.next(7)).containsExactly(23, 24, 25, 26, 27, 28, 29).inOrder();
-    assertThat(s.acquireCount).isEqualTo(7);
-    assertThat(s.next(7)).containsExactly(30, 31, 32, 33, 34, 35, 36).inOrder();
-    assertThat(s.acquireCount).isEqualTo(8);
-  }
-
-  @Test
-  public void nextWithCountMultipleCallers() throws Exception {
-    RepoSequence s1 = newSequence("id", 1, 3);
-    RepoSequence s2 = newSequence("id", 1, 4);
-
-    assertThat(s1.next(2)).containsExactly(1, 2).inOrder();
-    assertThat(s1.acquireCount).isEqualTo(1);
-
-    // s1 hasn't exhausted its last batch.
-    assertThat(s2.next(2)).containsExactly(4, 5).inOrder();
-    assertThat(s2.acquireCount).isEqualTo(1);
-
-    // s1 acquires again to cover this request, plus a whole new batch.
-    assertThat(s1.next(3)).containsExactly(3, 8, 9);
-    assertThat(s1.acquireCount).isEqualTo(2);
-
-    // s2 hasn't exhausted its last batch, do so now.
-    assertThat(s2.next(2)).containsExactly(6, 7);
-    assertThat(s2.acquireCount).isEqualTo(1);
-  }
-
-  private RepoSequence newSequence(String name, int start, int batchSize) {
-    return newSequence(name, start, batchSize, Runnables.doNothing(), RETRYER);
-  }
-
-  private RepoSequence newSequence(
-      String name,
-      final int start,
-      int batchSize,
-      Runnable afterReadRef,
-      Retryer<RefUpdate.Result> retryer) {
-    return new RepoSequence(
-        repoManager,
-        GitReferenceUpdated.DISABLED,
-        project,
-        name,
-        () -> start,
-        batchSize,
-        afterReadRef,
-        retryer);
-  }
-
-  private ObjectId writeBlob(String sequenceName, String value) {
-    String refName = RefNames.REFS_SEQUENCES + sequenceName;
-    try (Repository repo = repoManager.openRepository(project);
-        ObjectInserter ins = repo.newObjectInserter()) {
-      ObjectId newId = ins.insert(OBJ_BLOB, value.getBytes(UTF_8));
-      ins.flush();
-      RefUpdate ru = repo.updateRef(refName);
-      ru.setNewObjectId(newId);
-      assertThat(ru.forceUpdate()).isAnyOf(RefUpdate.Result.NEW, RefUpdate.Result.FORCED);
-      return newId;
-    } catch (IOException e) {
-      throw new RuntimeException(e);
-    }
-  }
-
-  private String readBlob(String sequenceName) throws Exception {
-    String refName = RefNames.REFS_SEQUENCES + sequenceName;
-    try (Repository repo = repoManager.openRepository(project);
-        RevWalk rw = new RevWalk(repo)) {
-      ObjectId id = repo.exactRef(refName).getObjectId();
-      return new String(rw.getObjectReader().open(id).getCachedBytes(), UTF_8);
-    }
-  }
-
-  private static long divCeil(float a, float b) {
-    return Math.round(Math.ceil(a / b));
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/rebuild/EventSorterTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/rebuild/EventSorterTest.java
deleted file mode 100644
index 1de82b1..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/rebuild/EventSorterTest.java
+++ /dev/null
@@ -1,231 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.notedb.rebuild;
-
-import static com.google.common.truth.Truth.assertThat;
-import static java.util.stream.Collectors.toList;
-import static org.junit.Assert.fail;
-
-import com.google.common.collect.Collections2;
-import com.google.common.collect.Lists;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.server.notedb.ChangeUpdate;
-import com.google.gerrit.testutil.TestTimeUtil;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Stream;
-import org.junit.Before;
-import org.junit.Test;
-
-public class EventSorterTest {
-  private class TestEvent extends Event {
-    protected TestEvent(Timestamp when) {
-      super(
-          new PatchSet.Id(new Change.Id(1), 1),
-          new Account.Id(1000),
-          new Account.Id(1000),
-          when,
-          changeCreatedOn,
-          null);
-    }
-
-    @Override
-    boolean uniquePerUpdate() {
-      return false;
-    }
-
-    @Override
-    void apply(ChangeUpdate update) {
-      throw new UnsupportedOperationException();
-    }
-
-    @SuppressWarnings("deprecation")
-    @Override
-    public String toString() {
-      return "E{" + when.getSeconds() + '}';
-    }
-  }
-
-  private Timestamp changeCreatedOn;
-
-  @Before
-  public void setUp() {
-    TestTimeUtil.resetWithClockStep(10, TimeUnit.SECONDS);
-    changeCreatedOn = TimeUtil.nowTs();
-  }
-
-  @Test
-  public void naturalSort() {
-    Event e1 = new TestEvent(TimeUtil.nowTs());
-    Event e2 = new TestEvent(TimeUtil.nowTs());
-    Event e3 = new TestEvent(TimeUtil.nowTs());
-
-    for (List<Event> events : Collections2.permutations(events(e1, e2, e3))) {
-      assertSorted(events, events(e1, e2, e3));
-    }
-  }
-
-  @Test
-  public void topoSortOneDep() {
-    List<Event> es;
-
-    // Input list is 0,1,2
-
-    // 0 depends on 1 => 1,0,2
-    es = threeEventsOneDep(0, 1);
-    assertSorted(es, events(es, 1, 0, 2));
-
-    // 1 depends on 0 => 0,1,2
-    es = threeEventsOneDep(1, 0);
-    assertSorted(es, events(es, 0, 1, 2));
-
-    // 0 depends on 2 => 1,2,0
-    es = threeEventsOneDep(0, 2);
-    assertSorted(es, events(es, 1, 2, 0));
-
-    // 2 depends on 0 => 0,1,2
-    es = threeEventsOneDep(2, 0);
-    assertSorted(es, events(es, 0, 1, 2));
-
-    // 1 depends on 2 => 0,2,1
-    es = threeEventsOneDep(1, 2);
-    assertSorted(es, events(es, 0, 2, 1));
-
-    // 2 depends on 1 => 0,1,2
-    es = threeEventsOneDep(2, 1);
-    assertSorted(es, events(es, 0, 1, 2));
-  }
-
-  private List<Event> threeEventsOneDep(int depFromIdx, int depOnIdx) {
-    List<Event> events =
-        Lists.newArrayList(
-            new TestEvent(TimeUtil.nowTs()),
-            new TestEvent(TimeUtil.nowTs()),
-            new TestEvent(TimeUtil.nowTs()));
-    events.get(depFromIdx).addDep(events.get(depOnIdx));
-    return events;
-  }
-
-  @Test
-  public void lastEventDependsOnFirstEvent() {
-    List<Event> events = new ArrayList<>();
-    for (int i = 0; i < 20; i++) {
-      events.add(new TestEvent(TimeUtil.nowTs()));
-    }
-    events.get(events.size() - 1).addDep(events.get(0));
-    assertSorted(events, events);
-  }
-
-  @Test
-  public void firstEventDependsOnLastEvent() {
-    List<Event> events = new ArrayList<>();
-    for (int i = 0; i < 20; i++) {
-      events.add(new TestEvent(TimeUtil.nowTs()));
-    }
-    events.get(0).addDep(events.get(events.size() - 1));
-
-    List<Event> expected = new ArrayList<>();
-    expected.addAll(events.subList(1, events.size()));
-    expected.add(events.get(0));
-    assertSorted(events, expected);
-  }
-
-  @Test
-  public void topoSortChainOfDeps() {
-    Event e1 = new TestEvent(TimeUtil.nowTs());
-    Event e2 = new TestEvent(TimeUtil.nowTs());
-    Event e3 = new TestEvent(TimeUtil.nowTs());
-    Event e4 = new TestEvent(TimeUtil.nowTs());
-    e1.addDep(e2);
-    e2.addDep(e3);
-    e3.addDep(e4);
-
-    assertSorted(events(e1, e2, e3, e4), events(e4, e3, e2, e1));
-  }
-
-  @Test
-  public void topoSortMultipleDeps() {
-    Event e1 = new TestEvent(TimeUtil.nowTs());
-    Event e2 = new TestEvent(TimeUtil.nowTs());
-    Event e3 = new TestEvent(TimeUtil.nowTs());
-    Event e4 = new TestEvent(TimeUtil.nowTs());
-    e1.addDep(e2);
-    e1.addDep(e4);
-    e2.addDep(e3);
-
-    // Processing 3 pops 2, processing 4 pops 1.
-    assertSorted(events(e2, e3, e1, e4), events(e3, e2, e4, e1));
-  }
-
-  @Test
-  public void topoSortMultipleDepsPreservesNaturalOrder() {
-    Event e1 = new TestEvent(TimeUtil.nowTs());
-    Event e2 = new TestEvent(TimeUtil.nowTs());
-    Event e3 = new TestEvent(TimeUtil.nowTs());
-    Event e4 = new TestEvent(TimeUtil.nowTs());
-    e1.addDep(e4);
-    e2.addDep(e4);
-    e3.addDep(e4);
-
-    // Processing 4 pops 1, 2, 3 in natural order.
-    assertSorted(events(e4, e3, e2, e1), events(e4, e1, e2, e3));
-  }
-
-  @Test
-  public void topoSortCycle() {
-    Event e1 = new TestEvent(TimeUtil.nowTs());
-    Event e2 = new TestEvent(TimeUtil.nowTs());
-
-    // Implementation is not really defined, but infinite looping would be bad.
-    // According to current implementation details, 2 pops 1, 1 pops 2 which was
-    // already seen.
-    assertSorted(events(e2, e1), events(e1, e2));
-  }
-
-  @Test
-  public void topoSortDepNotInInputList() {
-    Event e1 = new TestEvent(TimeUtil.nowTs());
-    Event e2 = new TestEvent(TimeUtil.nowTs());
-    Event e3 = new TestEvent(TimeUtil.nowTs());
-    e1.addDep(e3);
-
-    List<Event> events = events(e2, e1);
-    try {
-      new EventSorter(events).sort();
-      fail("expected IllegalArgumentException");
-    } catch (IllegalArgumentException e) {
-      // Expected.
-    }
-  }
-
-  private static List<Event> events(Event... es) {
-    return Lists.newArrayList(es);
-  }
-
-  private static List<Event> events(List<Event> in, Integer... indexes) {
-    return Stream.of(indexes).map(in::get).collect(toList());
-  }
-
-  private static void assertSorted(List<Event> unsorted, List<Event> expected) {
-    List<Event> actual = new ArrayList<>(unsorted);
-    new EventSorter(actual).sort();
-    assertThat(actual).named("sorted" + unsorted).isEqualTo(expected);
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/patch/PatchListTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/patch/PatchListTest.java
deleted file mode 100644
index 0a7b97cc..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/patch/PatchListTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.patch;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.gerrit.reviewdb.client.Patch;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.util.Arrays;
-import java.util.Comparator;
-import org.junit.Test;
-
-public class PatchListTest {
-  @Test
-  public void fileOrder() {
-    String[] names = {
-      "zzz", "def/g", "/!xxx", "abc", Patch.MERGE_LIST, "qrx", Patch.COMMIT_MSG,
-    };
-    String[] want = {
-      Patch.COMMIT_MSG, Patch.MERGE_LIST, "/!xxx", "abc", "def/g", "qrx", "zzz",
-    };
-
-    Arrays.sort(
-        names,
-        0,
-        names.length,
-        new Comparator<String>() {
-          @Override
-          public int compare(String o1, String o2) {
-            return PatchList.comparePaths(o1, o2);
-          }
-        });
-    assertThat(names).isEqualTo(want);
-  }
-
-  @Test
-  public void fileOrderNoMerge() {
-    String[] names = {
-      "zzz", "def/g", "/!xxx", "abc", "qrx", Patch.COMMIT_MSG,
-    };
-    String[] want = {
-      Patch.COMMIT_MSG, "/!xxx", "abc", "def/g", "qrx", "zzz",
-    };
-
-    Arrays.sort(
-        names,
-        0,
-        names.length,
-        new Comparator<String>() {
-          @Override
-          public int compare(String o1, String o2) {
-            return PatchList.comparePaths(o1, o2);
-          }
-        });
-    assertThat(names).isEqualTo(want);
-  }
-
-  @Test
-  public void largeObjectTombstoneCanBeSerializedAndDeserialized() throws Exception {
-    // Serialize
-    byte[] serializedObject;
-    try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        ObjectOutputStream objectStream = new ObjectOutputStream(baos)) {
-      objectStream.writeObject(new PatchListCacheImpl.LargeObjectTombstone());
-      serializedObject = baos.toByteArray();
-      assertThat(serializedObject).isNotNull();
-    }
-    // Deserialize
-    try (InputStream is = new ByteArrayInputStream(serializedObject);
-        ObjectInputStream ois = new ObjectInputStream(is)) {
-      assertThat(ois.readObject()).isInstanceOf(PatchListCacheImpl.LargeObjectTombstone.class);
-    }
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/project/CommitsCollectionTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/project/CommitsCollectionTest.java
deleted file mode 100644
index 7f1b233..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/project/CommitsCollectionTest.java
+++ /dev/null
@@ -1,266 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.project;
-
-import static com.google.gerrit.common.data.Permission.READ;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import com.google.gerrit.common.data.AccessSection;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.lifecycle.LifecycleManager;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountManager;
-import com.google.gerrit.server.account.AuthRequest;
-import com.google.gerrit.server.account.GroupCache;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.schema.SchemaCreator;
-import com.google.gerrit.server.util.RequestContext;
-import com.google.gerrit.server.util.ThreadLocalRequestContext;
-import com.google.gerrit.testutil.InMemoryDatabase;
-import com.google.gerrit.testutil.InMemoryModule;
-import com.google.gerrit.testutil.InMemoryRepositoryManager;
-import com.google.inject.Guice;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.Provider;
-import com.google.inject.util.Providers;
-import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-/** Unit tests for {@link CommitsCollection}. */
-public class CommitsCollectionTest {
-  @Inject private AccountManager accountManager;
-  @Inject private IdentifiedUser.GenericFactory userFactory;
-  @Inject private InMemoryDatabase schemaFactory;
-  @Inject private InMemoryRepositoryManager repoManager;
-  @Inject private SchemaCreator schemaCreator;
-  @Inject private ThreadLocalRequestContext requestContext;
-  @Inject protected ProjectCache projectCache;
-  @Inject protected MetaDataUpdate.Server metaDataUpdateFactory;
-  @Inject protected AllProjectsName allProjects;
-  @Inject protected GroupCache groupCache;
-  @Inject private CommitsCollection commits;
-
-  private LifecycleManager lifecycle;
-  private ReviewDb db;
-  private TestRepository<InMemoryRepository> repo;
-  private ProjectConfig project;
-  private IdentifiedUser user;
-  private AccountGroup.UUID admins;
-
-  @Before
-  public void setUp() throws Exception {
-    Injector injector = Guice.createInjector(new InMemoryModule());
-    injector.injectMembers(this);
-    lifecycle = new LifecycleManager();
-    lifecycle.add(injector);
-    lifecycle.start();
-
-    db = schemaFactory.open();
-    schemaCreator.create(db);
-    // Need to create at least one user to be admin before creating a "normal"
-    // registered user.
-    // See AccountManager#create().
-    accountManager.authenticate(AuthRequest.forUser("admin")).getAccountId();
-    admins = groupCache.get(new AccountGroup.NameKey("Administrators")).orElse(null).getGroupUUID();
-    setUpPermissions();
-
-    Account.Id userId = accountManager.authenticate(AuthRequest.forUser("user")).getAccountId();
-    user = userFactory.create(userId);
-
-    Project.NameKey name = new Project.NameKey("project");
-    InMemoryRepository inMemoryRepo = repoManager.createRepository(name);
-    project = new ProjectConfig(name);
-    project.load(inMemoryRepo);
-    repo = new TestRepository<>(inMemoryRepo);
-
-    requestContext.setContext(
-        new RequestContext() {
-          @Override
-          public CurrentUser getUser() {
-            return user;
-          }
-
-          @Override
-          public Provider<ReviewDb> getReviewDbProvider() {
-            return Providers.of(db);
-          }
-        });
-  }
-
-  @After
-  public void tearDown() {
-    if (repo != null) {
-      repo.getRepository().close();
-    }
-    if (lifecycle != null) {
-      lifecycle.stop();
-    }
-    requestContext.setContext(null);
-    if (db != null) {
-      db.close();
-    }
-    InMemoryDatabase.drop(schemaFactory);
-  }
-
-  @Test
-  public void canReadCommitWhenAllRefsVisible() throws Exception {
-    allow(project, READ, REGISTERED_USERS, "refs/*");
-    ObjectId id = repo.branch("master").commit().create();
-    ProjectState state = readProjectState();
-    RevWalk rw = repo.getRevWalk();
-    Repository r = repo.getRepository();
-
-    assertTrue(commits.canRead(state, r, rw.parseCommit(id)));
-  }
-
-  @Test
-  public void canReadCommitIfTwoRefsVisible() throws Exception {
-    allow(project, READ, REGISTERED_USERS, "refs/heads/branch1");
-    allow(project, READ, REGISTERED_USERS, "refs/heads/branch2");
-
-    ObjectId id1 = repo.branch("branch1").commit().create();
-    ObjectId id2 = repo.branch("branch2").commit().create();
-
-    ProjectState state = readProjectState();
-    RevWalk rw = repo.getRevWalk();
-    Repository r = repo.getRepository();
-
-    assertTrue(commits.canRead(state, r, rw.parseCommit(id1)));
-    assertTrue(commits.canRead(state, r, rw.parseCommit(id2)));
-  }
-
-  @Test
-  public void canReadCommitIfRefVisible() throws Exception {
-    allow(project, READ, REGISTERED_USERS, "refs/heads/branch1");
-    deny(project, READ, REGISTERED_USERS, "refs/heads/branch2");
-
-    ObjectId id1 = repo.branch("branch1").commit().create();
-    ObjectId id2 = repo.branch("branch2").commit().create();
-
-    ProjectState state = readProjectState();
-    RevWalk rw = repo.getRevWalk();
-    Repository r = repo.getRepository();
-
-    assertTrue(commits.canRead(state, r, rw.parseCommit(id1)));
-    assertFalse(commits.canRead(state, r, rw.parseCommit(id2)));
-  }
-
-  @Test
-  public void canReadCommitIfReachableFromVisibleRef() throws Exception {
-    allow(project, READ, REGISTERED_USERS, "refs/heads/branch1");
-    deny(project, READ, REGISTERED_USERS, "refs/heads/branch2");
-
-    RevCommit parent1 = repo.commit().create();
-    repo.branch("branch1").commit().parent(parent1).create();
-
-    RevCommit parent2 = repo.commit().create();
-    repo.branch("branch2").commit().parent(parent2).create();
-
-    ProjectState state = readProjectState();
-    RevWalk rw = repo.getRevWalk();
-    Repository r = repo.getRepository();
-    assertTrue(commits.canRead(state, r, rw.parseCommit(parent1)));
-    assertFalse(commits.canRead(state, r, rw.parseCommit(parent2)));
-  }
-
-  @Test
-  public void cannotReadAfterRollbackWithRestrictedRead() throws Exception {
-    allow(project, READ, REGISTERED_USERS, "refs/heads/branch1");
-
-    RevCommit parent1 = repo.commit().create();
-    ObjectId id1 = repo.branch("branch1").commit().parent(parent1).create();
-
-    ProjectState state = readProjectState();
-    RevWalk rw = repo.getRevWalk();
-    Repository r = repo.getRepository();
-
-    assertTrue(commits.canRead(state, r, rw.parseCommit(parent1)));
-    assertTrue(commits.canRead(state, r, rw.parseCommit(id1)));
-
-    repo.branch("branch1").update(parent1);
-    assertTrue(commits.canRead(state, r, rw.parseCommit(parent1)));
-    assertFalse(commits.canRead(state, r, rw.parseCommit(id1)));
-  }
-
-  @Test
-  public void canReadAfterRollbackWithAllRefsVisible() throws Exception {
-    allow(project, READ, REGISTERED_USERS, "refs/*");
-
-    RevCommit parent1 = repo.commit().create();
-    ObjectId id1 = repo.branch("branch1").commit().parent(parent1).create();
-
-    ProjectState state = readProjectState();
-    RevWalk rw = repo.getRevWalk();
-    Repository r = repo.getRepository();
-
-    assertTrue(commits.canRead(state, r, rw.parseCommit(parent1)));
-    assertTrue(commits.canRead(state, r, rw.parseCommit(id1)));
-
-    repo.branch("branch1").update(parent1);
-    assertTrue(commits.canRead(state, r, rw.parseCommit(parent1)));
-    assertFalse(commits.canRead(state, r, rw.parseCommit(id1)));
-  }
-
-  private ProjectState readProjectState() throws Exception {
-    return projectCache.get(project.getName());
-  }
-
-  protected void allow(ProjectConfig project, String permission, AccountGroup.UUID id, String ref)
-      throws Exception {
-    Util.allow(project, permission, id, ref);
-    saveProjectConfig(project);
-  }
-
-  protected void deny(ProjectConfig project, String permission, AccountGroup.UUID id, String ref)
-      throws Exception {
-    Util.deny(project, permission, id, ref);
-    saveProjectConfig(project);
-  }
-
-  protected void saveProjectConfig(ProjectConfig cfg) throws Exception {
-    try (MetaDataUpdate md = metaDataUpdateFactory.create(cfg.getName())) {
-      cfg.commit(md);
-    }
-    projectCache.evict(cfg.getProject());
-  }
-
-  private void setUpPermissions() throws Exception {
-    // Remove read permissions for all users besides admin, because by default
-    // Anonymous user group has ALLOW READ permission in refs/*.
-    // This method is idempotent, so is safe to call on every test setup.
-    ProjectConfig pc = projectCache.checkedGet(allProjects).getConfig();
-    for (AccessSection sec : pc.getAccessSections()) {
-      sec.removePermission(Permission.READ);
-    }
-    allow(pc, Permission.READ, admins, "refs/*");
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/project/RefControlTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/project/RefControlTest.java
deleted file mode 100644
index 1fc95c1..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/project/RefControlTest.java
+++ /dev/null
@@ -1,920 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.server.project;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.common.data.Permission.EDIT_TOPIC_NAME;
-import static com.google.gerrit.common.data.Permission.LABEL;
-import static com.google.gerrit.common.data.Permission.OWNER;
-import static com.google.gerrit.common.data.Permission.PUSH;
-import static com.google.gerrit.common.data.Permission.READ;
-import static com.google.gerrit.common.data.Permission.SUBMIT;
-import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
-import static com.google.gerrit.server.group.SystemGroupBackend.CHANGE_OWNER;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-import static com.google.gerrit.server.project.Util.ADMIN;
-import static com.google.gerrit.server.project.Util.DEVS;
-import static com.google.gerrit.server.project.Util.allow;
-import static com.google.gerrit.server.project.Util.block;
-import static com.google.gerrit.server.project.Util.deny;
-import static com.google.gerrit.server.project.Util.doNotInherit;
-import static com.google.gerrit.testutil.InMemoryRepositoryManager.newRepository;
-
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.collect.Lists;
-import com.google.gerrit.common.data.Capable;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.PermissionRange;
-import com.google.gerrit.common.data.PermissionRule;
-import com.google.gerrit.common.errors.InvalidNameException;
-import com.google.gerrit.extensions.api.projects.CommentLinkInfo;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.rules.PrologEnvironment;
-import com.google.gerrit.rules.RulesCache;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.account.CapabilityCollection;
-import com.google.gerrit.server.account.GroupMembership;
-import com.google.gerrit.server.account.ListGroupMembership;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.config.AllProjectsNameProvider;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.config.AllUsersNameProvider;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.git.TransferConfig;
-import com.google.gerrit.server.index.SingleVersionModule.SingleVersionListener;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.ProjectPermission;
-import com.google.gerrit.server.permissions.RefPermission;
-import com.google.gerrit.server.schema.SchemaCreator;
-import com.google.gerrit.server.util.RequestContext;
-import com.google.gerrit.server.util.ThreadLocalRequestContext;
-import com.google.gerrit.testutil.InMemoryDatabase;
-import com.google.gerrit.testutil.InMemoryModule;
-import com.google.gerrit.testutil.InMemoryRepositoryManager;
-import com.google.inject.Guice;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.Provider;
-import com.google.inject.util.Providers;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
-import org.eclipse.jgit.lib.Repository;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-public class RefControlTest {
-  private void assertAdminsAreOwnersAndDevsAreNot() {
-    ProjectControl uBlah = user(local, DEVS);
-    ProjectControl uAdmin = user(local, DEVS, ADMIN);
-
-    assertThat(uBlah.isOwner()).named("not owner").isFalse();
-    assertThat(uAdmin.isOwner()).named("is owner").isTrue();
-  }
-
-  private void assertOwner(String ref, ProjectControl u) {
-    assertThat(u.controlForRef(ref).isOwner()).named("OWN " + ref).isTrue();
-  }
-
-  private void assertNotOwner(ProjectControl u) {
-    assertThat(u.isOwner()).named("not owner").isFalse();
-  }
-
-  private void assertNotOwner(String ref, ProjectControl u) {
-    assertThat(u.controlForRef(ref).isOwner()).named("NOT OWN " + ref).isFalse();
-  }
-
-  private void assertCanAccess(ProjectControl u) {
-    boolean access = u.asForProject().testOrFalse(ProjectPermission.ACCESS);
-    assertThat(access).named("can access").isTrue();
-  }
-
-  private void assertAccessDenied(ProjectControl u) {
-    boolean access = u.asForProject().testOrFalse(ProjectPermission.ACCESS);
-    assertThat(access).named("cannot access").isFalse();
-  }
-
-  private void assertCanRead(String ref, ProjectControl u) {
-    assertThat(u.controlForRef(ref).isVisible()).named("can read " + ref).isTrue();
-  }
-
-  private void assertCannotRead(String ref, ProjectControl u) {
-    assertThat(u.controlForRef(ref).isVisible()).named("cannot read " + ref).isFalse();
-  }
-
-  private void assertCanSubmit(String ref, ProjectControl u) {
-    assertThat(u.controlForRef(ref).canSubmit(false)).named("can submit " + ref).isTrue();
-  }
-
-  private void assertCannotSubmit(String ref, ProjectControl u) {
-    assertThat(u.controlForRef(ref).canSubmit(false)).named("can submit " + ref).isFalse();
-  }
-
-  private void assertCanUpload(ProjectControl u) {
-    assertThat(u.canPushToAtLeastOneRef()).named("can upload").isEqualTo(Capable.OK);
-  }
-
-  private void assertCreateChange(String ref, ProjectControl u) {
-    boolean create = u.asForProject().ref(ref).testOrFalse(RefPermission.CREATE_CHANGE);
-    assertThat(create).named("can create change " + ref).isTrue();
-  }
-
-  private void assertCannotUpload(ProjectControl u) {
-    assertThat(u.canPushToAtLeastOneRef()).named("cannot upload").isNotEqualTo(Capable.OK);
-  }
-
-  private void assertCannotCreateChange(String ref, ProjectControl u) {
-    boolean create = u.asForProject().ref(ref).testOrFalse(RefPermission.CREATE_CHANGE);
-    assertThat(create).named("cannot create change " + ref).isFalse();
-  }
-
-  private void assertBlocked(String p, String ref, ProjectControl u) {
-    assertThat(u.controlForRef(ref).isBlocked(p)).named(p + " is blocked for " + ref).isTrue();
-  }
-
-  private void assertNotBlocked(String p, String ref, ProjectControl u) {
-    assertThat(u.controlForRef(ref).isBlocked(p)).named(p + " is blocked for " + ref).isFalse();
-  }
-
-  private void assertCanUpdate(String ref, ProjectControl u) {
-    boolean update = u.asForProject().ref(ref).testOrFalse(RefPermission.UPDATE);
-    assertThat(update).named("can update " + ref).isTrue();
-  }
-
-  private void assertCannotUpdate(String ref, ProjectControl u) {
-    boolean update = u.asForProject().ref(ref).testOrFalse(RefPermission.UPDATE);
-    assertThat(update).named("cannot update " + ref).isFalse();
-  }
-
-  private void assertCanForceUpdate(String ref, ProjectControl u) {
-    boolean update = u.asForProject().ref(ref).testOrFalse(RefPermission.FORCE_UPDATE);
-    assertThat(update).named("can force push " + ref).isTrue();
-  }
-
-  private void assertCannotForceUpdate(String ref, ProjectControl u) {
-    boolean update = u.asForProject().ref(ref).testOrFalse(RefPermission.FORCE_UPDATE);
-    assertThat(update).named("cannot force push " + ref).isFalse();
-  }
-
-  private void assertCanVote(int score, PermissionRange range) {
-    assertThat(range.contains(score)).named("can vote " + score).isTrue();
-  }
-
-  private void assertCannotVote(int score, PermissionRange range) {
-    assertThat(range.contains(score)).named("cannot vote " + score).isFalse();
-  }
-
-  private final AllProjectsName allProjectsName =
-      new AllProjectsName(AllProjectsNameProvider.DEFAULT);
-  private final AllUsersName allUsersName = new AllUsersName(AllUsersNameProvider.DEFAULT);
-  private final AccountGroup.UUID fixers = new AccountGroup.UUID("test.fixers");
-  private final Map<Project.NameKey, ProjectState> all = new HashMap<>();
-  private Project.NameKey localKey = new Project.NameKey("local");
-  private ProjectConfig local;
-  private Project.NameKey parentKey = new Project.NameKey("parent");
-  private ProjectConfig parent;
-  private InMemoryRepositoryManager repoManager;
-  private ProjectCache projectCache;
-  private PermissionCollection.Factory sectionSorter;
-  private ChangeControl.Factory changeControlFactory;
-  private ReviewDb db;
-
-  @Inject private PermissionBackend permissionBackend;
-  @Inject private CapabilityCollection.Factory capabilityCollectionFactory;
-  @Inject private SchemaCreator schemaCreator;
-  @Inject private SingleVersionListener singleVersionListener;
-  @Inject private InMemoryDatabase schemaFactory;
-  @Inject private ThreadLocalRequestContext requestContext;
-  @Inject private TransferConfig transferConfig;
-
-  @Before
-  public void setUp() throws Exception {
-    repoManager = new InMemoryRepositoryManager();
-    projectCache =
-        new ProjectCache() {
-          @Override
-          public ProjectState getAllProjects() {
-            return get(allProjectsName);
-          }
-
-          @Override
-          public ProjectState getAllUsers() {
-            return null;
-          }
-
-          @Override
-          public ProjectState get(Project.NameKey projectName) {
-            return all.get(projectName);
-          }
-
-          @Override
-          public void evict(Project p) {}
-
-          @Override
-          public void remove(Project p) {}
-
-          @Override
-          public void remove(Project.NameKey name) {}
-
-          @Override
-          public Iterable<Project.NameKey> all() {
-            return Collections.emptySet();
-          }
-
-          @Override
-          public Iterable<Project.NameKey> byName(String prefix) {
-            return Collections.emptySet();
-          }
-
-          @Override
-          public void onCreateProject(Project.NameKey newProjectName) {}
-
-          @Override
-          public Set<AccountGroup.UUID> guessRelevantGroupUUIDs() {
-            return Collections.emptySet();
-          }
-
-          @Override
-          public ProjectState checkedGet(Project.NameKey projectName) throws IOException {
-            return all.get(projectName);
-          }
-
-          @Override
-          public void evict(Project.NameKey p) {}
-
-          @Override
-          public ProjectState checkedGet(Project.NameKey projectName, boolean strict)
-              throws Exception {
-            return all.get(projectName);
-          }
-        };
-
-    Injector injector = Guice.createInjector(new InMemoryModule());
-    injector.injectMembers(this);
-
-    try {
-      Repository repo = repoManager.createRepository(allProjectsName);
-      ProjectConfig allProjects = new ProjectConfig(new Project.NameKey(allProjectsName.get()));
-      allProjects.load(repo);
-      LabelType cr = Util.codeReview();
-      allProjects.getLabelSections().put(cr.getName(), cr);
-      add(allProjects);
-    } catch (IOException | ConfigInvalidException e) {
-      throw new RuntimeException(e);
-    }
-
-    db = schemaFactory.open();
-    singleVersionListener.start();
-    try {
-      schemaCreator.create(db);
-    } finally {
-      singleVersionListener.stop();
-    }
-
-    Cache<SectionSortCache.EntryKey, SectionSortCache.EntryVal> c =
-        CacheBuilder.newBuilder().build();
-    sectionSorter = new PermissionCollection.Factory(new SectionSortCache(c));
-
-    parent = new ProjectConfig(parentKey);
-    parent.load(newRepository(parentKey));
-    add(parent);
-
-    local = new ProjectConfig(localKey);
-    local.load(newRepository(localKey));
-    add(local);
-    local.getProject().setParentName(parentKey);
-
-    requestContext.setContext(
-        new RequestContext() {
-          @Override
-          public CurrentUser getUser() {
-            return null;
-          }
-
-          @Override
-          public Provider<ReviewDb> getReviewDbProvider() {
-            return Providers.of(db);
-          }
-        });
-
-    changeControlFactory = injector.getInstance(ChangeControl.Factory.class);
-  }
-
-  @After
-  public void tearDown() {
-    requestContext.setContext(null);
-    if (db != null) {
-      db.close();
-    }
-    InMemoryDatabase.drop(schemaFactory);
-  }
-
-  @Test
-  public void ownerProject() {
-    allow(local, OWNER, ADMIN, "refs/*");
-
-    assertAdminsAreOwnersAndDevsAreNot();
-  }
-
-  @Test
-  public void denyOwnerProject() {
-    allow(local, OWNER, ADMIN, "refs/*");
-    deny(local, OWNER, DEVS, "refs/*");
-
-    assertAdminsAreOwnersAndDevsAreNot();
-  }
-
-  @Test
-  public void blockOwnerProject() {
-    allow(local, OWNER, ADMIN, "refs/*");
-    block(local, OWNER, DEVS, "refs/*");
-
-    assertAdminsAreOwnersAndDevsAreNot();
-  }
-
-  @Test
-  public void branchDelegation1() {
-    allow(local, OWNER, ADMIN, "refs/*");
-    allow(local, OWNER, DEVS, "refs/heads/x/*");
-
-    ProjectControl uDev = user(local, DEVS);
-    assertNotOwner(uDev);
-
-    assertOwner("refs/heads/x/*", uDev);
-    assertOwner("refs/heads/x/y", uDev);
-    assertOwner("refs/heads/x/y/*", uDev);
-
-    assertNotOwner("refs/*", uDev);
-    assertNotOwner("refs/heads/master", uDev);
-  }
-
-  @Test
-  public void branchDelegation2() {
-    allow(local, OWNER, ADMIN, "refs/*");
-    allow(local, OWNER, DEVS, "refs/heads/x/*");
-    allow(local, OWNER, fixers, "refs/heads/x/y/*");
-    doNotInherit(local, OWNER, "refs/heads/x/y/*");
-
-    ProjectControl uDev = user(local, DEVS);
-    assertNotOwner(uDev);
-
-    assertOwner("refs/heads/x/*", uDev);
-    assertOwner("refs/heads/x/y", uDev);
-    assertOwner("refs/heads/x/y/*", uDev);
-    assertNotOwner("refs/*", uDev);
-    assertNotOwner("refs/heads/master", uDev);
-
-    ProjectControl uFix = user(local, fixers);
-    assertNotOwner(uFix);
-
-    assertOwner("refs/heads/x/y/*", uFix);
-    assertOwner("refs/heads/x/y/bar", uFix);
-    assertNotOwner("refs/heads/x/*", uFix);
-    assertNotOwner("refs/heads/x/y", uFix);
-    assertNotOwner("refs/*", uFix);
-    assertNotOwner("refs/heads/master", uFix);
-  }
-
-  @Test
-  public void inheritRead_SingleBranchDeniesUpload() {
-    allow(parent, READ, REGISTERED_USERS, "refs/*");
-    allow(parent, PUSH, REGISTERED_USERS, "refs/for/refs/*");
-    allow(local, READ, REGISTERED_USERS, "refs/heads/foobar");
-    doNotInherit(local, READ, "refs/heads/foobar");
-    doNotInherit(local, PUSH, "refs/for/refs/heads/foobar");
-
-    ProjectControl u = user(local);
-    assertCanUpload(u);
-    assertCreateChange("refs/heads/master", u);
-    assertCannotCreateChange("refs/heads/foobar", u);
-  }
-
-  @Test
-  public void blockPushDrafts() {
-    allow(parent, PUSH, REGISTERED_USERS, "refs/for/refs/*");
-    block(parent, PUSH, ANONYMOUS_USERS, "refs/drafts/*");
-
-    ProjectControl u = user(local);
-    assertCreateChange("refs/heads/master", u);
-    assertBlocked(PUSH, "refs/drafts/refs/heads/master", u);
-  }
-
-  @Test
-  public void blockPushDraftsUnblockAdmin() {
-    block(parent, PUSH, ANONYMOUS_USERS, "refs/drafts/*");
-    allow(parent, PUSH, ADMIN, "refs/drafts/*");
-
-    ProjectControl u = user(local);
-    ProjectControl a = user(local, "a", ADMIN);
-    assertBlocked(PUSH, "refs/drafts/refs/heads/master", u);
-    assertNotBlocked(PUSH, "refs/drafts/refs/heads/master", a);
-  }
-
-  @Test
-  public void inheritRead_SingleBranchDoesNotOverrideInherited() {
-    allow(parent, READ, REGISTERED_USERS, "refs/*");
-    allow(parent, PUSH, REGISTERED_USERS, "refs/for/refs/*");
-    allow(local, READ, REGISTERED_USERS, "refs/heads/foobar");
-
-    ProjectControl u = user(local);
-    assertCanUpload(u);
-    assertCreateChange("refs/heads/master", u);
-    assertCreateChange("refs/heads/foobar", u);
-  }
-
-  @Test
-  public void inheritDuplicateSections() throws Exception {
-    allow(parent, READ, ADMIN, "refs/*");
-    allow(local, READ, DEVS, "refs/heads/*");
-    assertCanAccess(user(local, "a", ADMIN));
-
-    local = new ProjectConfig(localKey);
-    local.load(newRepository(localKey));
-    local.getProject().setParentName(parentKey);
-    allow(local, READ, DEVS, "refs/*");
-    assertCanAccess(user(local, "d", DEVS));
-  }
-
-  @Test
-  public void inheritRead_OverrideWithDeny() {
-    allow(parent, READ, REGISTERED_USERS, "refs/*");
-    deny(local, READ, REGISTERED_USERS, "refs/*");
-
-    assertAccessDenied(user(local));
-  }
-
-  @Test
-  public void inheritRead_AppendWithDenyOfRef() {
-    allow(parent, READ, REGISTERED_USERS, "refs/*");
-    deny(local, READ, REGISTERED_USERS, "refs/heads/*");
-
-    ProjectControl u = user(local);
-    assertCanAccess(u);
-    assertCanRead("refs/master", u);
-    assertCanRead("refs/tags/foobar", u);
-    assertCanRead("refs/heads/master", u);
-  }
-
-  @Test
-  public void inheritRead_OverridesAndDeniesOfRef() {
-    allow(parent, READ, REGISTERED_USERS, "refs/*");
-    deny(local, READ, REGISTERED_USERS, "refs/*");
-    allow(local, READ, REGISTERED_USERS, "refs/heads/*");
-
-    ProjectControl u = user(local);
-    assertCanAccess(u);
-    assertCannotRead("refs/foobar", u);
-    assertCannotRead("refs/tags/foobar", u);
-    assertCanRead("refs/heads/foobar", u);
-  }
-
-  @Test
-  public void inheritSubmit_OverridesAndDeniesOfRef() {
-    allow(parent, SUBMIT, REGISTERED_USERS, "refs/*");
-    deny(local, SUBMIT, REGISTERED_USERS, "refs/*");
-    allow(local, SUBMIT, REGISTERED_USERS, "refs/heads/*");
-
-    ProjectControl u = user(local);
-    assertCannotSubmit("refs/foobar", u);
-    assertCannotSubmit("refs/tags/foobar", u);
-    assertCanSubmit("refs/heads/foobar", u);
-  }
-
-  @Test
-  public void cannotUploadToAnyRef() {
-    allow(parent, READ, REGISTERED_USERS, "refs/*");
-    allow(local, READ, DEVS, "refs/heads/*");
-    allow(local, PUSH, DEVS, "refs/for/refs/heads/*");
-
-    ProjectControl u = user(local);
-    assertCannotUpload(u);
-    assertCannotCreateChange("refs/heads/master", u);
-  }
-
-  @Test
-  public void usernamePatternCanUploadToAnyRef() {
-    allow(local, PUSH, REGISTERED_USERS, "refs/heads/users/${username}/*");
-    ProjectControl u = user(local, "a-registered-user");
-    assertCanUpload(u);
-  }
-
-  @Test
-  public void usernamePatternNonRegex() {
-    allow(local, READ, DEVS, "refs/sb/${username}/heads/*");
-
-    ProjectControl u = user(local, "u", DEVS);
-    ProjectControl d = user(local, "d", DEVS);
-    assertCannotRead("refs/sb/d/heads/foobar", u);
-    assertCanRead("refs/sb/d/heads/foobar", d);
-  }
-
-  @Test
-  public void usernamePatternWithRegex() {
-    allow(local, READ, DEVS, "^refs/sb/${username}/heads/.*");
-
-    ProjectControl u = user(local, "d.v", DEVS);
-    ProjectControl d = user(local, "dev", DEVS);
-    assertCannotRead("refs/sb/dev/heads/foobar", u);
-    assertCanRead("refs/sb/dev/heads/foobar", d);
-  }
-
-  @Test
-  public void usernameEmailPatternWithRegex() {
-    allow(local, READ, DEVS, "^refs/sb/${username}/heads/.*");
-
-    ProjectControl u = user(local, "d.v@ger-rit.org", DEVS);
-    ProjectControl d = user(local, "dev@ger-rit.org", DEVS);
-    assertCannotRead("refs/sb/dev@ger-rit.org/heads/foobar", u);
-    assertCanRead("refs/sb/dev@ger-rit.org/heads/foobar", d);
-  }
-
-  @Test
-  public void sortWithRegex() {
-    allow(local, READ, DEVS, "^refs/heads/.*");
-    allow(parent, READ, ANONYMOUS_USERS, "^refs/heads/.*-QA-.*");
-
-    ProjectControl u = user(local, DEVS);
-    ProjectControl d = user(local, DEVS);
-    assertCanRead("refs/heads/foo-QA-bar", u);
-    assertCanRead("refs/heads/foo-QA-bar", d);
-  }
-
-  @Test
-  public void blockRule_ParentBlocksChild() {
-    allow(local, PUSH, DEVS, "refs/tags/*");
-    block(parent, PUSH, ANONYMOUS_USERS, "refs/tags/*");
-    ProjectControl u = user(local, DEVS);
-    assertCannotUpdate("refs/tags/V10", u);
-  }
-
-  @Test
-  public void blockRule_ParentBlocksChildEvenIfAlreadyBlockedInChild() {
-    allow(local, PUSH, DEVS, "refs/tags/*");
-    block(local, PUSH, ANONYMOUS_USERS, "refs/tags/*");
-    block(parent, PUSH, ANONYMOUS_USERS, "refs/tags/*");
-
-    ProjectControl u = user(local, DEVS);
-    assertCannotUpdate("refs/tags/V10", u);
-  }
-
-  @Test
-  public void blockLabelRange_ParentBlocksChild() {
-    allow(local, LABEL + "Code-Review", -2, +2, DEVS, "refs/heads/*");
-    block(parent, LABEL + "Code-Review", -2, +2, DEVS, "refs/heads/*");
-
-    ProjectControl u = user(local, DEVS);
-
-    PermissionRange range = u.controlForRef("refs/heads/master").getRange(LABEL + "Code-Review");
-    assertCanVote(-1, range);
-    assertCanVote(1, range);
-    assertCannotVote(-2, range);
-    assertCannotVote(2, range);
-  }
-
-  @Test
-  public void blockLabelRange_ParentBlocksChildEvenIfAlreadyBlockedInChild() {
-    allow(local, LABEL + "Code-Review", -2, +2, DEVS, "refs/heads/*");
-    block(local, LABEL + "Code-Review", -2, +2, DEVS, "refs/heads/*");
-    block(parent, LABEL + "Code-Review", -2, +2, DEVS, "refs/heads/*");
-
-    ProjectControl u = user(local, DEVS);
-
-    PermissionRange range = u.controlForRef("refs/heads/master").getRange(LABEL + "Code-Review");
-    assertCanVote(-1, range);
-    assertCanVote(1, range);
-    assertCannotVote(-2, range);
-    assertCannotVote(2, range);
-  }
-
-  @Test
-  public void inheritSubmit_AllowInChildDoesntAffectUnblockInParent() {
-    block(parent, SUBMIT, ANONYMOUS_USERS, "refs/heads/*");
-    allow(parent, SUBMIT, REGISTERED_USERS, "refs/heads/*");
-    allow(local, SUBMIT, REGISTERED_USERS, "refs/heads/*");
-
-    ProjectControl u = user(local);
-    assertNotBlocked(SUBMIT, "refs/heads/master", u);
-  }
-
-  @Test
-  public void unblockNoForce() {
-    block(local, PUSH, ANONYMOUS_USERS, "refs/heads/*");
-    allow(local, PUSH, DEVS, "refs/heads/*");
-
-    ProjectControl u = user(local, DEVS);
-    assertCanUpdate("refs/heads/master", u);
-  }
-
-  @Test
-  public void unblockForce() {
-    PermissionRule r = block(local, PUSH, ANONYMOUS_USERS, "refs/heads/*");
-    r.setForce(true);
-    allow(local, PUSH, DEVS, "refs/heads/*").setForce(true);
-
-    ProjectControl u = user(local, DEVS);
-    assertCanForceUpdate("refs/heads/master", u);
-  }
-
-  @Test
-  public void unblockForceWithAllowNoForce_NotPossible() {
-    PermissionRule r = block(local, PUSH, ANONYMOUS_USERS, "refs/heads/*");
-    r.setForce(true);
-    allow(local, PUSH, DEVS, "refs/heads/*");
-
-    ProjectControl u = user(local, DEVS);
-    assertCannotForceUpdate("refs/heads/master", u);
-  }
-
-  @Test
-  public void unblockMoreSpecificRef_Fails() {
-    block(local, PUSH, ANONYMOUS_USERS, "refs/heads/*");
-    allow(local, PUSH, DEVS, "refs/heads/master");
-
-    ProjectControl u = user(local, DEVS);
-    assertCannotUpdate("refs/heads/master", u);
-  }
-
-  @Test
-  public void unblockMoreSpecificRefInLocal_Fails() {
-    block(parent, PUSH, ANONYMOUS_USERS, "refs/heads/*");
-    allow(local, PUSH, DEVS, "refs/heads/master");
-
-    ProjectControl u = user(local, DEVS);
-    assertCannotUpdate("refs/heads/master", u);
-  }
-
-  @Test
-  public void unblockMoreSpecificRefWithExclusiveFlag() {
-    block(local, PUSH, ANONYMOUS_USERS, "refs/heads/*");
-    allow(local, PUSH, DEVS, "refs/heads/master", true);
-
-    ProjectControl u = user(local, DEVS);
-    assertCanUpdate("refs/heads/master", u);
-  }
-
-  @Test
-  public void unblockMoreSpecificRefInLocalWithExclusiveFlag_Fails() {
-    block(parent, PUSH, ANONYMOUS_USERS, "refs/heads/*");
-    allow(local, PUSH, DEVS, "refs/heads/master", true);
-
-    ProjectControl u = user(local, DEVS);
-    assertCannotUpdate("refs/heads/master", u);
-  }
-
-  @Test
-  public void unblockOtherPermissionWithMoreSpecificRefAndExclusiveFlag_Fails() {
-    block(local, PUSH, ANONYMOUS_USERS, "refs/heads/*");
-    allow(local, PUSH, DEVS, "refs/heads/master");
-    allow(local, SUBMIT, DEVS, "refs/heads/master", true);
-
-    ProjectControl u = user(local, DEVS);
-    assertCannotUpdate("refs/heads/master", u);
-  }
-
-  @Test
-  public void unblockLargerScope_Fails() {
-    block(local, PUSH, ANONYMOUS_USERS, "refs/heads/master");
-    allow(local, PUSH, DEVS, "refs/heads/*");
-
-    ProjectControl u = user(local, DEVS);
-    assertCannotUpdate("refs/heads/master", u);
-  }
-
-  @Test
-  public void unblockInLocal_Fails() {
-    block(parent, PUSH, ANONYMOUS_USERS, "refs/heads/*");
-    allow(local, PUSH, fixers, "refs/heads/*");
-
-    ProjectControl f = user(local, fixers);
-    assertCannotUpdate("refs/heads/master", f);
-  }
-
-  @Test
-  public void unblockInParentBlockInLocal() {
-    block(parent, PUSH, ANONYMOUS_USERS, "refs/heads/*");
-    allow(parent, PUSH, DEVS, "refs/heads/*");
-    block(local, PUSH, DEVS, "refs/heads/*");
-
-    ProjectControl d = user(local, DEVS);
-    assertCannotUpdate("refs/heads/master", d);
-  }
-
-  @Test
-  public void unblockForceEditTopicName() {
-    block(local, EDIT_TOPIC_NAME, ANONYMOUS_USERS, "refs/heads/*");
-    allow(local, EDIT_TOPIC_NAME, DEVS, "refs/heads/*").setForce(true);
-
-    ProjectControl u = user(local, DEVS);
-    assertThat(u.controlForRef("refs/heads/master").canForceEditTopicName())
-        .named("u can edit topic name")
-        .isTrue();
-  }
-
-  @Test
-  public void unblockInLocalForceEditTopicName_Fails() {
-    block(parent, EDIT_TOPIC_NAME, ANONYMOUS_USERS, "refs/heads/*");
-    allow(local, EDIT_TOPIC_NAME, DEVS, "refs/heads/*").setForce(true);
-
-    ProjectControl u = user(local, REGISTERED_USERS);
-    assertThat(u.controlForRef("refs/heads/master").canForceEditTopicName())
-        .named("u can't edit topic name")
-        .isFalse();
-  }
-
-  @Test
-  public void unblockRange() {
-    block(local, LABEL + "Code-Review", -1, +1, ANONYMOUS_USERS, "refs/heads/*");
-    allow(local, LABEL + "Code-Review", -2, +2, DEVS, "refs/heads/*");
-
-    ProjectControl u = user(local, DEVS);
-    PermissionRange range = u.controlForRef("refs/heads/master").getRange(LABEL + "Code-Review");
-    assertCanVote(-2, range);
-    assertCanVote(2, range);
-  }
-
-  @Test
-  public void unblockRangeOnMoreSpecificRef_Fails() {
-    block(local, LABEL + "Code-Review", -1, +1, ANONYMOUS_USERS, "refs/heads/*");
-    allow(local, LABEL + "Code-Review", -2, +2, DEVS, "refs/heads/master");
-
-    ProjectControl u = user(local, DEVS);
-    PermissionRange range = u.controlForRef("refs/heads/master").getRange(LABEL + "Code-Review");
-    assertCannotVote(-2, range);
-    assertCannotVote(2, range);
-  }
-
-  @Test
-  public void unblockRangeOnLargerScope_Fails() {
-    block(local, LABEL + "Code-Review", -1, +1, ANONYMOUS_USERS, "refs/heads/master");
-    allow(local, LABEL + "Code-Review", -2, +2, DEVS, "refs/heads/*");
-
-    ProjectControl u = user(local, DEVS);
-    PermissionRange range = u.controlForRef("refs/heads/master").getRange(LABEL + "Code-Review");
-    assertCannotVote(-2, range);
-    assertCannotVote(2, range);
-  }
-
-  @Test
-  public void unblockInLocalRange_Fails() {
-    block(parent, LABEL + "Code-Review", -1, 1, ANONYMOUS_USERS, "refs/heads/*");
-    allow(local, LABEL + "Code-Review", -2, +2, DEVS, "refs/heads/*");
-
-    ProjectControl u = user(local, DEVS);
-    PermissionRange range = u.controlForRef("refs/heads/master").getRange(LABEL + "Code-Review");
-    assertCannotVote(-2, range);
-    assertCannotVote(2, range);
-  }
-
-  @Test
-  public void unblockRangeForChangeOwner() {
-    allow(local, LABEL + "Code-Review", -2, +2, CHANGE_OWNER, "refs/heads/*");
-
-    ProjectControl u = user(local, DEVS);
-    PermissionRange range =
-        u.controlForRef("refs/heads/master").getRange(LABEL + "Code-Review", true);
-    assertCanVote(-2, range);
-    assertCanVote(2, range);
-  }
-
-  @Test
-  public void unblockRangeForNotChangeOwner() {
-    allow(local, LABEL + "Code-Review", -2, +2, CHANGE_OWNER, "refs/heads/*");
-
-    ProjectControl u = user(local, DEVS);
-    PermissionRange range = u.controlForRef("refs/heads/master").getRange(LABEL + "Code-Review");
-    assertCannotVote(-2, range);
-    assertCannotVote(2, range);
-  }
-
-  @Test
-  public void blockOwner() {
-    block(parent, OWNER, ANONYMOUS_USERS, "refs/*");
-    allow(local, OWNER, DEVS, "refs/*");
-
-    assertThat(user(local, DEVS).isOwner()).isFalse();
-  }
-
-  @Test
-  public void validateRefPatternsOK() throws Exception {
-    RefPattern.validate("refs/*");
-    RefPattern.validate("^refs/heads/*");
-    RefPattern.validate("^refs/tags/[0-9a-zA-Z-_.]+");
-    RefPattern.validate("refs/heads/review/${username}/*");
-  }
-
-  @Test(expected = InvalidNameException.class)
-  public void testValidateBadRefPatternDoubleCaret() throws Exception {
-    RefPattern.validate("^^refs/*");
-  }
-
-  @Test(expected = InvalidNameException.class)
-  public void testValidateBadRefPatternDanglingCharacter() throws Exception {
-    RefPattern.validate("^refs/heads/tmp/sdk/[0-9]{3,3}_R[1-9][A-Z][0-9]{3,3}*");
-  }
-
-  @Test
-  public void validateRefPatternNoDanglingCharacter() throws Exception {
-    RefPattern.validate("^refs/heads/tmp/sdk/[0-9]{3,3}_R[1-9][A-Z][0-9]{3,3}");
-  }
-
-  private InMemoryRepository add(ProjectConfig pc) {
-    PrologEnvironment.Factory envFactory = null;
-    ProjectControl.AssistedFactory projectControlFactory = null;
-    RulesCache rulesCache = null;
-    SitePaths sitePaths = null;
-    List<CommentLinkInfo> commentLinks = null;
-
-    InMemoryRepository repo;
-    try {
-      repo = repoManager.createRepository(pc.getName());
-      if (pc.getProject() == null) {
-        pc.load(repo);
-      }
-    } catch (IOException | ConfigInvalidException e) {
-      throw new RuntimeException(e);
-    }
-    all.put(
-        pc.getName(),
-        new ProjectState(
-            sitePaths,
-            projectCache,
-            allProjectsName,
-            allUsersName,
-            projectControlFactory,
-            envFactory,
-            repoManager,
-            rulesCache,
-            commentLinks,
-            capabilityCollectionFactory,
-            transferConfig,
-            pc));
-    return repo;
-  }
-
-  private ProjectControl user(ProjectConfig local, AccountGroup.UUID... memberOf) {
-    return user(local, null, memberOf);
-  }
-
-  private ProjectControl user(ProjectConfig local, String name, AccountGroup.UUID... memberOf) {
-    return new ProjectControl(
-        Collections.<AccountGroup.UUID>emptySet(),
-        Collections.<AccountGroup.UUID>emptySet(),
-        sectionSorter,
-        null, // commitsCollection
-        changeControlFactory,
-        permissionBackend,
-        new MockUser(name, memberOf),
-        newProjectState(local));
-  }
-
-  private ProjectState newProjectState(ProjectConfig local) {
-    add(local);
-    return all.get(local.getProject().getNameKey());
-  }
-
-  private static class MockUser extends CurrentUser {
-    private final String username;
-    private final GroupMembership groups;
-
-    MockUser(String name, AccountGroup.UUID[] groupId) {
-      username = name;
-      ArrayList<AccountGroup.UUID> groupIds = Lists.newArrayList(groupId);
-      groupIds.add(REGISTERED_USERS);
-      groupIds.add(ANONYMOUS_USERS);
-      groups = new ListGroupMembership(groupIds);
-    }
-
-    @Override
-    public GroupMembership getEffectiveGroups() {
-      return groups;
-    }
-
-    @Override
-    public String getUserName() {
-      return username;
-    }
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/project/Util.java b/gerrit-server/src/test/java/com/google/gerrit/server/project/Util.java
deleted file mode 100644
index 6604641..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/project/Util.java
+++ /dev/null
@@ -1,214 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.project;
-
-import com.google.gerrit.common.data.AccessSection;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.common.data.GroupReference;
-import com.google.gerrit.common.data.LabelFunction;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.LabelValue;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.common.data.PermissionRange;
-import com.google.gerrit.common.data.PermissionRule;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.git.ProjectConfig;
-import java.util.Arrays;
-
-public class Util {
-  public static final AccountGroup.UUID ADMIN = new AccountGroup.UUID("test.admin");
-  public static final AccountGroup.UUID DEVS = new AccountGroup.UUID("test.devs");
-
-  public static final LabelType codeReview() {
-    return category(
-        "Code-Review",
-        value(2, "Looks good to me, approved"),
-        value(1, "Looks good to me, but someone else must approve"),
-        value(0, "No score"),
-        value(-1, "I would prefer this is not merged as is"),
-        value(-2, "This shall not be merged"));
-  }
-
-  public static final LabelType verified() {
-    return category("Verified", value(1, "Verified"), value(0, "No score"), value(-1, "Fails"));
-  }
-
-  public static final LabelType patchSetLock() {
-    LabelType label =
-        category("Patch-Set-Lock", value(1, "Patch Set Locked"), value(0, "Patch Set Unlocked"));
-    label.setFunction(LabelFunction.PATCH_SET_LOCK);
-    return label;
-  }
-
-  public static LabelValue value(int value, String text) {
-    return new LabelValue((short) value, text);
-  }
-
-  public static LabelType category(String name, LabelValue... values) {
-    return new LabelType(name, Arrays.asList(values));
-  }
-
-  public static PermissionRule newRule(ProjectConfig project, AccountGroup.UUID groupUUID) {
-    GroupReference group = new GroupReference(groupUUID, groupUUID.get());
-    group = project.resolve(group);
-
-    return new PermissionRule(group);
-  }
-
-  public static PermissionRule allow(
-      ProjectConfig project,
-      String permissionName,
-      int min,
-      int max,
-      AccountGroup.UUID group,
-      String ref) {
-    PermissionRule rule = newRule(project, group);
-    rule.setMin(min);
-    rule.setMax(max);
-    return grant(project, permissionName, rule, ref);
-  }
-
-  public static PermissionRule block(
-      ProjectConfig project,
-      String permissionName,
-      int min,
-      int max,
-      AccountGroup.UUID group,
-      String ref) {
-    PermissionRule rule = newRule(project, group);
-    rule.setMin(min);
-    rule.setMax(max);
-    PermissionRule r = grant(project, permissionName, rule, ref);
-    r.setBlock();
-    return r;
-  }
-
-  public static PermissionRule allow(
-      ProjectConfig project, String permissionName, AccountGroup.UUID group, String ref) {
-    return grant(project, permissionName, newRule(project, group), ref);
-  }
-
-  public static PermissionRule allow(
-      ProjectConfig project,
-      String permissionName,
-      AccountGroup.UUID group,
-      String ref,
-      boolean exclusive) {
-    return grant(project, permissionName, newRule(project, group), ref, exclusive);
-  }
-
-  public static PermissionRule allow(
-      ProjectConfig project, String capabilityName, AccountGroup.UUID group) {
-    PermissionRule rule = newRule(project, group);
-    project
-        .getAccessSection(AccessSection.GLOBAL_CAPABILITIES, true)
-        .getPermission(capabilityName, true)
-        .add(rule);
-    if (GlobalCapability.hasRange(capabilityName)) {
-      PermissionRange.WithDefaults range = GlobalCapability.getRange(capabilityName);
-      if (range != null) {
-        rule.setRange(range.getDefaultMin(), range.getDefaultMax());
-      }
-    }
-    return rule;
-  }
-
-  public static PermissionRule remove(
-      ProjectConfig project, String capabilityName, AccountGroup.UUID group) {
-    PermissionRule rule = newRule(project, group);
-    project
-        .getAccessSection(AccessSection.GLOBAL_CAPABILITIES, true)
-        .getPermission(capabilityName, true)
-        .remove(rule);
-    return rule;
-  }
-
-  public static PermissionRule remove(
-      ProjectConfig project, String permissionName, AccountGroup.UUID group, String ref) {
-    PermissionRule rule = newRule(project, group);
-    project.getAccessSection(ref, true).getPermission(permissionName, true).remove(rule);
-    return rule;
-  }
-
-  public static PermissionRule block(
-      ProjectConfig project, String capabilityName, AccountGroup.UUID group) {
-    PermissionRule rule = newRule(project, group);
-    project
-        .getAccessSection(AccessSection.GLOBAL_CAPABILITIES, true)
-        .getPermission(capabilityName, true)
-        .add(rule);
-    return rule;
-  }
-
-  public static PermissionRule block(
-      ProjectConfig project, String permissionName, AccountGroup.UUID group, String ref) {
-    PermissionRule r = grant(project, permissionName, newRule(project, group), ref);
-    r.setBlock();
-    return r;
-  }
-
-  public static PermissionRule blockLabel(
-      ProjectConfig project, String labelName, AccountGroup.UUID group, String ref) {
-    return blockLabel(project, labelName, -1, 1, group, ref);
-  }
-
-  public static PermissionRule blockLabel(
-      ProjectConfig project,
-      String labelName,
-      int min,
-      int max,
-      AccountGroup.UUID group,
-      String ref) {
-    PermissionRule r = grant(project, Permission.LABEL + labelName, newRule(project, group), ref);
-    r.setBlock();
-    r.setRange(min, max);
-    return r;
-  }
-
-  public static PermissionRule deny(
-      ProjectConfig project, String permissionName, AccountGroup.UUID group, String ref) {
-    PermissionRule r = grant(project, permissionName, newRule(project, group), ref);
-    r.setDeny();
-    return r;
-  }
-
-  public static void doNotInherit(ProjectConfig project, String permissionName, String ref) {
-    project
-        .getAccessSection(ref, true) //
-        .getPermission(permissionName, true) //
-        .setExclusiveGroup(true);
-  }
-
-  private static PermissionRule grant(
-      ProjectConfig project, String permissionName, PermissionRule rule, String ref) {
-    return grant(project, permissionName, rule, ref, false);
-  }
-
-  private static PermissionRule grant(
-      ProjectConfig project,
-      String permissionName,
-      PermissionRule rule,
-      String ref,
-      boolean exclusive) {
-    Permission permission = project.getAccessSection(ref, true).getPermission(permissionName, true);
-    if (exclusive) {
-      permission.setExclusiveGroup(exclusive);
-    }
-    permission.add(rule);
-    return rule;
-  }
-
-  private Util() {}
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/account/AbstractQueryAccountsTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/account/AbstractQueryAccountsTest.java
deleted file mode 100644
index 05f6796..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/query/account/AbstractQueryAccountsTest.java
+++ /dev/null
@@ -1,672 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.query.account;
-
-import static com.google.common.truth.Truth.assertThat;
-import static java.util.stream.Collectors.toList;
-import static org.junit.Assert.fail;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.extensions.api.GerritApi;
-import com.google.gerrit.extensions.api.access.AccessSectionInfo;
-import com.google.gerrit.extensions.api.access.PermissionInfo;
-import com.google.gerrit.extensions.api.access.PermissionRuleInfo;
-import com.google.gerrit.extensions.api.access.ProjectAccessInput;
-import com.google.gerrit.extensions.api.accounts.Accounts.QueryRequest;
-import com.google.gerrit.extensions.api.groups.GroupInput;
-import com.google.gerrit.extensions.api.projects.ProjectInput;
-import com.google.gerrit.extensions.client.ListAccountsOption;
-import com.google.gerrit.extensions.client.ProjectWatchInfo;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.ChangeInput;
-import com.google.gerrit.extensions.common.GroupInfo;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.lifecycle.LifecycleManager;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.AnonymousUser;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.AccountConfig;
-import com.google.gerrit.server.account.AccountManager;
-import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.account.Accounts;
-import com.google.gerrit.server.account.AccountsUpdate;
-import com.google.gerrit.server.account.AuthRequest;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.index.account.AccountIndex;
-import com.google.gerrit.server.index.account.AccountIndexCollection;
-import com.google.gerrit.server.schema.SchemaCreator;
-import com.google.gerrit.server.util.ManualRequestContext;
-import com.google.gerrit.server.util.OneOffRequestContext;
-import com.google.gerrit.server.util.RequestContext;
-import com.google.gerrit.server.util.ThreadLocalRequestContext;
-import com.google.gerrit.testutil.ConfigSuite;
-import com.google.gerrit.testutil.GerritServerTests;
-import com.google.gerrit.testutil.InMemoryDatabase;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.Provider;
-import com.google.inject.util.Providers;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Repository;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-
-@Ignore
-public abstract class AbstractQueryAccountsTest extends GerritServerTests {
-  @ConfigSuite.Default
-  public static Config defaultConfig() {
-    Config cfg = new Config();
-    cfg.setInt("index", null, "maxPages", 10);
-    return cfg;
-  }
-
-  @Inject protected Accounts accounts;
-
-  @Inject protected AccountsUpdate.Server accountsUpdate;
-
-  @Inject protected AccountCache accountCache;
-
-  @Inject protected AccountManager accountManager;
-
-  @Inject protected GerritApi gApi;
-
-  @Inject @GerritPersonIdent Provider<PersonIdent> serverIdent;
-
-  @Inject protected IdentifiedUser.GenericFactory userFactory;
-
-  @Inject private Provider<AnonymousUser> anonymousUser;
-
-  @Inject protected InMemoryDatabase schemaFactory;
-
-  @Inject protected SchemaCreator schemaCreator;
-
-  @Inject protected ThreadLocalRequestContext requestContext;
-
-  @Inject protected OneOffRequestContext oneOffRequestContext;
-
-  @Inject protected Provider<InternalAccountQuery> queryProvider;
-
-  @Inject protected AllProjectsName allProjects;
-
-  @Inject protected AllUsersName allUsers;
-
-  @Inject protected GitRepositoryManager repoManager;
-
-  @Inject protected AccountIndexCollection accountIndexes;
-
-  protected LifecycleManager lifecycle;
-  protected Injector injector;
-  protected ReviewDb db;
-  protected AccountInfo currentUserInfo;
-  protected CurrentUser user;
-
-  protected abstract Injector createInjector();
-
-  @Before
-  public void setUpInjector() throws Exception {
-    lifecycle = new LifecycleManager();
-    injector = createInjector();
-    lifecycle.add(injector);
-    injector.injectMembers(this);
-    lifecycle.start();
-    initAfterLifecycleStart();
-    setUpDatabase();
-  }
-
-  @After
-  public void cleanUp() {
-    lifecycle.stop();
-    db.close();
-  }
-
-  protected void setUpDatabase() throws Exception {
-    db = schemaFactory.open();
-    schemaCreator.create(db);
-
-    Account.Id userId = createAccount("user", "User", "user@example.com", true);
-    user = userFactory.create(userId);
-    requestContext.setContext(newRequestContext(userId));
-    currentUserInfo = gApi.accounts().id(userId.get()).get();
-  }
-
-  protected void initAfterLifecycleStart() throws Exception {}
-
-  protected RequestContext newRequestContext(Account.Id requestUserId) {
-    final CurrentUser requestUser = userFactory.create(requestUserId);
-    return new RequestContext() {
-      @Override
-      public CurrentUser getUser() {
-        return requestUser;
-      }
-
-      @Override
-      public Provider<ReviewDb> getReviewDbProvider() {
-        return Providers.of(db);
-      }
-    };
-  }
-
-  protected void setAnonymous() {
-    requestContext.setContext(
-        new RequestContext() {
-          @Override
-          public CurrentUser getUser() {
-            return anonymousUser.get();
-          }
-
-          @Override
-          public Provider<ReviewDb> getReviewDbProvider() {
-            return Providers.of(db);
-          }
-        });
-  }
-
-  @After
-  public void tearDownInjector() {
-    if (lifecycle != null) {
-      lifecycle.stop();
-    }
-    requestContext.setContext(null);
-    if (db != null) {
-      db.close();
-    }
-    InMemoryDatabase.drop(schemaFactory);
-  }
-
-  @Test
-  public void byId() throws Exception {
-    AccountInfo user = newAccount("user");
-
-    assertQuery("9999999");
-    assertQuery(currentUserInfo._accountId, currentUserInfo);
-    assertQuery(user._accountId, user);
-  }
-
-  @Test
-  public void bySelf() throws Exception {
-    assertQuery("self", currentUserInfo);
-  }
-
-  @Test
-  public void byEmail() throws Exception {
-    AccountInfo user1 = newAccountWithEmail("user1", name("user1@example.com"));
-
-    String domain = name("test.com");
-    AccountInfo user2 = newAccountWithEmail("user2", "user2@" + domain);
-    AccountInfo user3 = newAccountWithEmail("user3", "user3@" + domain);
-
-    String prefix = name("prefix");
-    AccountInfo user4 = newAccountWithEmail("user4", prefix + "user4@example.com");
-
-    AccountInfo user5 = newAccountWithEmail("user5", name("user5MixedCase@example.com"));
-
-    assertQuery("notexisting@test.com");
-
-    assertQuery(currentUserInfo.email, currentUserInfo);
-    assertQuery("email:" + currentUserInfo.email, currentUserInfo);
-
-    assertQuery(user1.email, user1);
-    assertQuery("email:" + user1.email, user1);
-
-    assertQuery(domain, user2, user3);
-
-    assertQuery("email:" + prefix, user4);
-
-    assertQuery(user5.email, user5);
-    assertQuery("email:" + user5.email, user5);
-    assertQuery("email:" + user5.email.toUpperCase(), user5);
-  }
-
-  @Test
-  public void byUsername() throws Exception {
-    AccountInfo user1 = newAccount("myuser");
-
-    assertQuery("notexisting");
-    assertQuery("Not Existing");
-
-    assertQuery(user1.username, user1);
-    assertQuery("username:" + user1.username, user1);
-    assertQuery("username:" + user1.username.toUpperCase(), user1);
-  }
-
-  @Test
-  public void isActive() throws Exception {
-    String domain = name("test.com");
-    AccountInfo user1 = newAccountWithEmail("user1", "user1@" + domain);
-    AccountInfo user2 = newAccountWithEmail("user2", "user2@" + domain);
-    AccountInfo user3 = newAccount("user3", "user3@" + domain, false);
-    AccountInfo user4 = newAccount("user4", "user4@" + domain, false);
-
-    // by default only active accounts are returned
-    assertQuery(domain, user1, user2);
-    assertQuery("name:" + domain, user1, user2);
-
-    assertQuery("is:active name:" + domain, user1, user2);
-
-    assertQuery("is:inactive name:" + domain, user3, user4);
-  }
-
-  @Test
-  public void byName() throws Exception {
-    AccountInfo user1 = newAccountWithFullName("jdoe", "John Doe");
-    AccountInfo user2 = newAccountWithFullName("jroe", "Jane Roe");
-    AccountInfo user3 = newAccountWithFullName("user3", "Mr Selfish");
-
-    assertQuery("notexisting");
-    assertQuery("Not Existing");
-
-    assertQuery(quote(user1.name), user1);
-    assertQuery("name:" + quote(user1.name), user1);
-    assertQuery("John", user1);
-    assertQuery("john", user1);
-    assertQuery("Doe", user1);
-    assertQuery("doe", user1);
-    assertQuery("DOE", user1);
-    assertQuery("Jo Do", user1);
-    assertQuery("jo do", user1);
-    assertQuery("self", currentUserInfo, user3);
-    assertQuery("me", currentUserInfo);
-    assertQuery("name:John", user1);
-    assertQuery("name:john", user1);
-    assertQuery("name:Doe", user1);
-    assertQuery("name:doe", user1);
-    assertQuery("name:DOE", user1);
-    assertQuery("name:self", user3);
-
-    assertQuery(quote(user2.name), user2);
-    assertQuery("name:" + quote(user2.name), user2);
-  }
-
-  @Test
-  public void byCansee() throws Exception {
-    String domain = name("test.com");
-    AccountInfo user1 = newAccountWithEmail("account1", "account1@" + domain);
-    AccountInfo user2 = newAccountWithEmail("account2", "account2@" + domain);
-    AccountInfo user3 = newAccountWithEmail("account3", "account3@" + domain);
-
-    Project.NameKey p = createProject(name("p"));
-    ChangeInfo c = createChange(p);
-    assertQuery("name:" + domain + " cansee:" + c.changeId, user1, user2, user3);
-
-    GroupInfo group = createGroup(name("group"), user1, user2);
-    blockRead(p, group);
-    assertQuery("name:" + domain + " cansee:" + c.changeId, user3);
-  }
-
-  @Test
-  public void byWatchedProject() throws Exception {
-    Project.NameKey p = createProject(name("p"));
-    Project.NameKey p2 = createProject(name("p2"));
-    AccountInfo user1 = newAccountWithFullName("jdoe", "John Doe");
-    AccountInfo user2 = newAccountWithFullName("jroe", "Jane Roe");
-    AccountInfo user3 = newAccountWithFullName("user3", "Mr Selfish");
-
-    assertThat(queryProvider.get().byWatchedProject(p)).isEmpty();
-
-    watch(user1, p, null);
-    assertAccounts(queryProvider.get().byWatchedProject(p), user1);
-
-    watch(user2, p, "keyword");
-    assertAccounts(queryProvider.get().byWatchedProject(p), user1, user2);
-
-    watch(user3, p2, "keyword");
-    watch(user3, allProjects, "keyword");
-    assertAccounts(queryProvider.get().byWatchedProject(p), user1, user2);
-    assertAccounts(queryProvider.get().byWatchedProject(p2), user3);
-    assertAccounts(queryProvider.get().byWatchedProject(allProjects), user3);
-  }
-
-  @Test
-  public void byDeletedAccount() throws Exception {
-    AccountInfo user = newAccountWithFullName("jdoe", "John Doe");
-    Account.Id userId = Account.Id.parse(user._accountId.toString());
-    assertQuery("John", user);
-
-    for (AccountIndex index : accountIndexes.getWriteIndexes()) {
-      index.delete(userId);
-    }
-    assertQuery("John");
-  }
-
-  @Test
-  public void withLimit() throws Exception {
-    String domain = name("test.com");
-    AccountInfo user1 = newAccountWithEmail("user1", "user1@" + domain);
-    AccountInfo user2 = newAccountWithEmail("user2", "user2@" + domain);
-    AccountInfo user3 = newAccountWithEmail("user3", "user3@" + domain);
-
-    List<AccountInfo> result = assertQuery(domain, user1, user2, user3);
-    assertThat(Iterables.getLast(result)._moreAccounts).isNull();
-
-    result = assertQuery(newQuery(domain).withLimit(2), result.subList(0, 2));
-    assertThat(Iterables.getLast(result)._moreAccounts).isTrue();
-  }
-
-  @Test
-  public void withStart() throws Exception {
-    String domain = name("test.com");
-    AccountInfo user1 = newAccountWithEmail("user1", "user1@" + domain);
-    AccountInfo user2 = newAccountWithEmail("user2", "user2@" + domain);
-    AccountInfo user3 = newAccountWithEmail("user3", "user3@" + domain);
-
-    List<AccountInfo> result = assertQuery(domain, user1, user2, user3);
-    assertQuery(newQuery(domain).withStart(1), result.subList(1, 3));
-  }
-
-  @Test
-  public void withDetails() throws Exception {
-    AccountInfo user1 = newAccount("myuser", "My User", "my.user@example.com", true);
-
-    List<AccountInfo> result = assertQuery(user1.username, user1);
-    AccountInfo ai = result.get(0);
-    assertThat(ai._accountId).isEqualTo(user1._accountId);
-    assertThat(ai.name).isNull();
-    assertThat(ai.username).isNull();
-    assertThat(ai.email).isNull();
-    assertThat(ai.avatars).isNull();
-
-    result = assertQuery(newQuery(user1.username).withOption(ListAccountsOption.DETAILS), user1);
-    ai = result.get(0);
-    assertThat(ai._accountId).isEqualTo(user1._accountId);
-    assertThat(ai.name).isEqualTo(user1.name);
-    assertThat(ai.username).isEqualTo(user1.username);
-    assertThat(ai.email).isEqualTo(user1.email);
-    assertThat(ai.avatars).isNull();
-  }
-
-  @Test
-  public void withSecondaryEmails() throws Exception {
-    AccountInfo user1 = newAccount("myuser", "My User", "my.user@example.com", true);
-    String[] secondaryEmails = new String[] {"bar@example.com", "foo@example.com"};
-    addEmails(user1, secondaryEmails);
-
-    List<AccountInfo> result = assertQuery(user1.username, user1);
-    assertThat(result.get(0).secondaryEmails).isNull();
-
-    result = assertQuery(newQuery(user1.username).withOption(ListAccountsOption.DETAILS), user1);
-    assertThat(result.get(0).secondaryEmails).isNull();
-
-    result = assertQuery(newQuery(user1.username).withOption(ListAccountsOption.ALL_EMAILS), user1);
-    assertThat(result.get(0).secondaryEmails)
-        .containsExactlyElementsIn(Arrays.asList(secondaryEmails))
-        .inOrder();
-
-    result =
-        assertQuery(
-            newQuery(user1.username)
-                .withOptions(ListAccountsOption.DETAILS, ListAccountsOption.ALL_EMAILS),
-            user1);
-    assertThat(result.get(0).secondaryEmails)
-        .containsExactlyElementsIn(Arrays.asList(secondaryEmails))
-        .inOrder();
-  }
-
-  @Test
-  public void asAnonymous() throws Exception {
-    AccountInfo user1 = newAccount("user1");
-
-    setAnonymous();
-    assertQuery("9999999");
-    assertQuery("self");
-    assertQuery("username:" + user1.username, user1);
-  }
-
-  // reindex permissions are tested by {@link AccountIT#reindexPermissions}
-  @Test
-  public void reindex() throws Exception {
-    AccountInfo user1 = newAccountWithFullName("tester", "Test Usre");
-
-    // update account without reindex so that account index is stale
-    Account.Id accountId = new Account.Id(user1._accountId);
-    String newName = "Test User";
-    try (Repository repo = repoManager.openRepository(allUsers)) {
-      MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsers, repo);
-      PersonIdent ident = serverIdent.get();
-      md.getCommitBuilder().setAuthor(ident);
-      md.getCommitBuilder().setCommitter(ident);
-      AccountConfig accountConfig = new AccountConfig(null, accountId);
-      accountConfig.load(repo);
-      accountConfig.getAccount().setFullName(newName);
-      accountConfig.commit(md);
-    }
-
-    assertQuery("name:" + quote(user1.name), user1);
-    assertQuery("name:" + quote(newName));
-
-    gApi.accounts().id(user1.username).index();
-    assertQuery("name:" + quote(user1.name));
-    assertQuery("name:" + quote(newName), user1);
-  }
-
-  protected AccountInfo newAccount(String username) throws Exception {
-    return newAccountWithEmail(username, null);
-  }
-
-  protected AccountInfo newAccountWithEmail(String username, String email) throws Exception {
-    return newAccount(username, email, true);
-  }
-
-  protected AccountInfo newAccountWithFullName(String username, String fullName) throws Exception {
-    return newAccount(username, fullName, null, true);
-  }
-
-  protected AccountInfo newAccount(String username, String email, boolean active) throws Exception {
-    return newAccount(username, null, email, active);
-  }
-
-  protected AccountInfo newAccount(String username, String fullName, String email, boolean active)
-      throws Exception {
-    String uniqueName = name(username);
-
-    try {
-      gApi.accounts().id(uniqueName).get();
-      fail("user " + uniqueName + " already exists");
-    } catch (ResourceNotFoundException e) {
-      // expected: user does not exist yet
-    }
-
-    Account.Id id = createAccount(uniqueName, fullName, email, active);
-    return gApi.accounts().id(id.get()).get();
-  }
-
-  protected Project.NameKey createProject(String name) throws RestApiException {
-    ProjectInput in = new ProjectInput();
-    in.name = name;
-    in.createEmptyCommit = true;
-    gApi.projects().create(in);
-    return new Project.NameKey(name);
-  }
-
-  protected void blockRead(Project.NameKey project, GroupInfo group) throws RestApiException {
-    ProjectAccessInput in = new ProjectAccessInput();
-    in.add = new HashMap<>();
-
-    AccessSectionInfo a = new AccessSectionInfo();
-    PermissionInfo p = new PermissionInfo(null, null);
-    p.rules =
-        ImmutableMap.of(group.id, new PermissionRuleInfo(PermissionRuleInfo.Action.BLOCK, false));
-    a.permissions = ImmutableMap.of("read", p);
-    in.add = ImmutableMap.of("refs/*", a);
-
-    gApi.projects().name(project.get()).access(in);
-  }
-
-  protected ChangeInfo createChange(Project.NameKey project) throws RestApiException {
-    ChangeInput in = new ChangeInput();
-    in.subject = "A change";
-    in.project = project.get();
-    in.branch = "master";
-    return gApi.changes().create(in).get();
-  }
-
-  protected GroupInfo createGroup(String name, AccountInfo... members) throws RestApiException {
-    GroupInput in = new GroupInput();
-    in.name = name;
-    in.members =
-        Arrays.asList(members).stream().map(a -> String.valueOf(a._accountId)).collect(toList());
-    return gApi.groups().create(in).get();
-  }
-
-  protected void watch(AccountInfo account, Project.NameKey project, String filter)
-      throws RestApiException {
-    List<ProjectWatchInfo> projectsToWatch = new ArrayList<>();
-    ProjectWatchInfo pwi = new ProjectWatchInfo();
-    pwi.project = project.get();
-    pwi.filter = filter;
-    pwi.notifyAbandonedChanges = true;
-    pwi.notifyNewChanges = true;
-    pwi.notifyAllComments = true;
-    projectsToWatch.add(pwi);
-    gApi.accounts().id(account._accountId).setWatchedProjects(projectsToWatch);
-  }
-
-  protected String quote(String s) {
-    return "\"" + s + "\"";
-  }
-
-  protected String name(String name) {
-    if (name == null) {
-      return null;
-    }
-
-    String suffix = getSanitizedMethodName();
-    if (name.contains("@")) {
-      return name + "." + suffix;
-    }
-    return name + "_" + suffix;
-  }
-
-  private Account.Id createAccount(String username, String fullName, String email, boolean active)
-      throws Exception {
-    try (ManualRequestContext ctx = oneOffRequestContext.open()) {
-      Account.Id id = accountManager.authenticate(AuthRequest.forUser(username)).getAccountId();
-      if (email != null) {
-        accountManager.link(id, AuthRequest.forEmail(email));
-      }
-      accountsUpdate
-          .create()
-          .update(
-              id,
-              a -> {
-                a.setFullName(fullName);
-                a.setPreferredEmail(email);
-                a.setActive(active);
-              });
-      return id;
-    }
-  }
-
-  private void addEmails(AccountInfo account, String... emails) throws Exception {
-    Account.Id id = new Account.Id(account._accountId);
-    for (String email : emails) {
-      accountManager.link(id, AuthRequest.forEmail(email));
-    }
-    accountCache.evict(id);
-  }
-
-  protected QueryRequest newQuery(Object query) throws RestApiException {
-    return gApi.accounts().query(query.toString());
-  }
-
-  protected List<AccountInfo> assertQuery(Object query, AccountInfo... accounts) throws Exception {
-    return assertQuery(newQuery(query), accounts);
-  }
-
-  protected List<AccountInfo> assertQuery(QueryRequest query, AccountInfo... accounts)
-      throws Exception {
-    return assertQuery(query, Arrays.asList(accounts));
-  }
-
-  protected List<AccountInfo> assertQuery(QueryRequest query, List<AccountInfo> accounts)
-      throws Exception {
-    List<AccountInfo> result = query.get();
-    Iterable<Integer> ids = ids(result);
-    assertThat(ids)
-        .named(format(query, result, accounts))
-        .containsExactlyElementsIn(ids(accounts))
-        .inOrder();
-    return result;
-  }
-
-  protected void assertAccounts(List<AccountState> accounts, AccountInfo... expectedAccounts) {
-    assertThat(accounts.stream().map(a -> a.getAccount().getId().get()).collect(toList()))
-        .containsExactlyElementsIn(
-            Arrays.asList(expectedAccounts).stream().map(a -> a._accountId).collect(toList()));
-  }
-
-  private String format(
-      QueryRequest query, List<AccountInfo> actualIds, List<AccountInfo> expectedAccounts) {
-    StringBuilder b = new StringBuilder();
-    b.append("query '").append(query.getQuery()).append("' with expected accounts ");
-    b.append(format(expectedAccounts));
-    b.append(" and result ");
-    b.append(format(actualIds));
-    return b.toString();
-  }
-
-  private String format(Iterable<AccountInfo> accounts) {
-    StringBuilder b = new StringBuilder();
-    b.append("[");
-    Iterator<AccountInfo> it = accounts.iterator();
-    while (it.hasNext()) {
-      AccountInfo a = it.next();
-      b.append("{")
-          .append(a._accountId)
-          .append(", ")
-          .append("name=")
-          .append(a.name)
-          .append(", ")
-          .append("email=")
-          .append(a.email)
-          .append(", ")
-          .append("username=")
-          .append(a.username)
-          .append("}");
-      if (it.hasNext()) {
-        b.append(", ");
-      }
-    }
-    b.append("]");
-    return b.toString();
-  }
-
-  protected static Iterable<Integer> ids(AccountInfo... accounts) {
-    return ids(Arrays.asList(accounts));
-  }
-
-  protected static Iterable<Integer> ids(List<AccountInfo> accounts) {
-    return accounts.stream().map(a -> a._accountId).collect(toList());
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/account/LuceneQueryAccountsTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/account/LuceneQueryAccountsTest.java
deleted file mode 100644
index fa130ca..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/query/account/LuceneQueryAccountsTest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-// 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.
-
-package com.google.gerrit.server.query.account;
-
-import com.google.gerrit.server.index.account.AccountSchemaDefinitions;
-import com.google.gerrit.testutil.ConfigSuite;
-import com.google.gerrit.testutil.InMemoryModule;
-import com.google.gerrit.testutil.IndexVersions;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import java.util.List;
-import java.util.Map;
-import org.eclipse.jgit.lib.Config;
-
-public class LuceneQueryAccountsTest extends AbstractQueryAccountsTest {
-  @ConfigSuite.Configs
-  public static Map<String, Config> againstPreviousIndexVersion() {
-    // the current schema version is already tested by the inherited default config suite
-    List<Integer> schemaVersions =
-        IndexVersions.getWithoutLatest(AccountSchemaDefinitions.INSTANCE);
-    return IndexVersions.asConfigMap(
-        AccountSchemaDefinitions.INSTANCE, schemaVersions, "againstIndexVersion", defaultConfig());
-  }
-
-  @Override
-  protected Injector createInjector() {
-    Config luceneConfig = new Config(config);
-    InMemoryModule.setDefaults(luceneConfig);
-    return Guice.createInjector(new InMemoryModule(luceneConfig, notesMigration));
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java
deleted file mode 100644
index 215089a..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java
+++ /dev/null
@@ -1,2917 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.query.change;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.TruthJUnit.assume;
-import static com.google.gerrit.extensions.client.ListChangesOption.DETAILED_LABELS;
-import static com.google.gerrit.extensions.client.ListChangesOption.REVIEWED;
-import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
-import static com.google.gerrit.server.project.Util.category;
-import static com.google.gerrit.server.project.Util.value;
-import static java.util.concurrent.TimeUnit.HOURS;
-import static java.util.concurrent.TimeUnit.MILLISECONDS;
-import static java.util.concurrent.TimeUnit.MINUTES;
-import static java.util.concurrent.TimeUnit.SECONDS;
-import static java.util.stream.Collectors.toList;
-import static org.junit.Assert.fail;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Streams;
-import com.google.common.truth.ThrowableSubject;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.Permission;
-import com.google.gerrit.extensions.api.GerritApi;
-import com.google.gerrit.extensions.api.changes.AddReviewerInput;
-import com.google.gerrit.extensions.api.changes.AssigneeInput;
-import com.google.gerrit.extensions.api.changes.Changes.QueryRequest;
-import com.google.gerrit.extensions.api.changes.DraftInput;
-import com.google.gerrit.extensions.api.changes.HashtagsInput;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.api.changes.ReviewInput.DraftHandling;
-import com.google.gerrit.extensions.api.changes.ReviewInput.RobotCommentInput;
-import com.google.gerrit.extensions.api.changes.StarsInput;
-import com.google.gerrit.extensions.api.groups.GroupInput;
-import com.google.gerrit.extensions.api.projects.ConfigInput;
-import com.google.gerrit.extensions.api.projects.ProjectInput;
-import com.google.gerrit.extensions.client.InheritableBoolean;
-import com.google.gerrit.extensions.client.ProjectWatchInfo;
-import com.google.gerrit.extensions.client.ReviewerState;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.ChangeInput;
-import com.google.gerrit.extensions.common.ChangeMessageInfo;
-import com.google.gerrit.extensions.common.CommentInfo;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.index.FieldDef;
-import com.google.gerrit.index.IndexConfig;
-import com.google.gerrit.index.QueryOptions;
-import com.google.gerrit.index.Schema;
-import com.google.gerrit.lifecycle.LifecycleManager;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Patch;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.reviewdb.server.ReviewDbUtil;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.Sequences;
-import com.google.gerrit.server.StarredChangesUtil;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.AccountManager;
-import com.google.gerrit.server.account.Accounts;
-import com.google.gerrit.server.account.AccountsUpdate;
-import com.google.gerrit.server.account.AuthRequest;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.account.externalids.ExternalIdsUpdate;
-import com.google.gerrit.server.change.ChangeInserter;
-import com.google.gerrit.server.change.ChangeTriplet;
-import com.google.gerrit.server.change.PatchSetInserter;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.index.change.ChangeField;
-import com.google.gerrit.server.index.change.ChangeIndexCollection;
-import com.google.gerrit.server.index.change.ChangeIndexer;
-import com.google.gerrit.server.index.change.IndexedChangeQuery;
-import com.google.gerrit.server.index.change.StalenessChecker;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.NoteDbChangeState;
-import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.Util;
-import com.google.gerrit.server.schema.SchemaCreator;
-import com.google.gerrit.server.update.BatchUpdate;
-import com.google.gerrit.server.util.ManualRequestContext;
-import com.google.gerrit.server.util.OneOffRequestContext;
-import com.google.gerrit.server.util.RequestContext;
-import com.google.gerrit.server.util.ThreadLocalRequestContext;
-import com.google.gerrit.testutil.ConfigSuite;
-import com.google.gerrit.testutil.DisabledReviewDb;
-import com.google.gerrit.testutil.GerritServerTests;
-import com.google.gerrit.testutil.InMemoryDatabase;
-import com.google.gerrit.testutil.InMemoryRepositoryManager;
-import com.google.gerrit.testutil.InMemoryRepositoryManager.Repo;
-import com.google.gerrit.testutil.TestTimeUtil;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.Provider;
-import com.google.inject.util.Providers;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.concurrent.TimeUnit;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.util.SystemReader;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-
-@Ignore
-public abstract class AbstractQueryChangesTest extends GerritServerTests {
-  @ConfigSuite.Default
-  public static Config defaultConfig() {
-    Config cfg = new Config();
-    cfg.setInt("index", null, "maxPages", 10);
-    cfg.setString("trackingid", "query-bug", "footer", "Bug:");
-    cfg.setString("trackingid", "query-bug", "match", "QUERY\\d{2,8}");
-    cfg.setString("trackingid", "query-bug", "system", "querytests");
-    cfg.setString("trackingid", "query-feature", "footer", "Feature");
-    cfg.setString("trackingid", "query-feature", "match", "QUERY\\d{2,8}");
-    cfg.setString("trackingid", "query-feature", "system", "querytests");
-    return cfg;
-  }
-
-  @Inject protected Accounts accounts;
-  @Inject protected AccountCache accountCache;
-  @Inject protected AccountsUpdate.Server accountsUpdate;
-  @Inject protected AccountManager accountManager;
-  @Inject protected AllUsersName allUsersName;
-  @Inject protected BatchUpdate.Factory updateFactory;
-  @Inject protected ChangeInserter.Factory changeFactory;
-  @Inject protected ChangeQueryBuilder queryBuilder;
-  @Inject protected GerritApi gApi;
-  @Inject protected IdentifiedUser.GenericFactory userFactory;
-  @Inject protected ChangeIndexCollection indexes;
-  @Inject protected ChangeIndexer indexer;
-  @Inject protected IndexConfig indexConfig;
-  @Inject protected InMemoryRepositoryManager repoManager;
-  @Inject protected Provider<InternalChangeQuery> queryProvider;
-  @Inject protected ChangeNotes.Factory notesFactory;
-  @Inject protected OneOffRequestContext oneOffRequestContext;
-  @Inject protected PatchSetInserter.Factory patchSetFactory;
-  @Inject protected PatchSetUtil psUtil;
-  @Inject protected ChangeNotes.Factory changeNotesFactory;
-  @Inject protected Provider<ChangeQueryProcessor> queryProcessorProvider;
-  @Inject protected SchemaCreator schemaCreator;
-  @Inject protected SchemaFactory<ReviewDb> schemaFactory;
-  @Inject protected Sequences seq;
-  @Inject protected ThreadLocalRequestContext requestContext;
-  @Inject protected ProjectCache projectCache;
-  @Inject protected MetaDataUpdate.Server metaDataUpdateFactory;
-  @Inject protected ExternalIdsUpdate.Server externalIdsUpdate;
-  @Inject protected IdentifiedUser.GenericFactory identifiedUserFactory;
-
-  // Only for use in setting up/tearing down injector; other users should use schemaFactory.
-  @Inject private InMemoryDatabase inMemoryDatabase;
-
-  protected Injector injector;
-  protected LifecycleManager lifecycle;
-  protected ReviewDb db;
-  protected Account.Id userId;
-  protected CurrentUser user;
-
-  private String systemTimeZone;
-
-  protected abstract Injector createInjector();
-
-  @Before
-  public void setUpInjector() throws Exception {
-    lifecycle = new LifecycleManager();
-    injector = createInjector();
-    lifecycle.add(injector);
-    injector.injectMembers(this);
-    lifecycle.start();
-    initAfterLifecycleStart();
-    setUpDatabase();
-  }
-
-  @After
-  public void cleanUp() {
-    lifecycle.stop();
-    db.close();
-  }
-
-  protected void initAfterLifecycleStart() throws Exception {}
-
-  protected void setUpDatabase() throws Exception {
-    try (ReviewDb underlyingDb = inMemoryDatabase.getDatabase().open()) {
-      schemaCreator.create(underlyingDb);
-    }
-    db = schemaFactory.open();
-
-    userId = accountManager.authenticate(AuthRequest.forUser("user")).getAccountId();
-    String email = "user@example.com";
-    externalIdsUpdate.create().insert(ExternalId.createEmail(userId, email));
-    accountsUpdate.create().update(userId, a -> a.setPreferredEmail(email));
-    user = userFactory.create(userId);
-    requestContext.setContext(newRequestContext(userId));
-  }
-
-  protected RequestContext newRequestContext(Account.Id requestUserId) {
-    final CurrentUser requestUser = userFactory.create(requestUserId);
-    return new RequestContext() {
-      @Override
-      public CurrentUser getUser() {
-        return requestUser;
-      }
-
-      @Override
-      public Provider<ReviewDb> getReviewDbProvider() {
-        return Providers.of(db);
-      }
-    };
-  }
-
-  @After
-  public void tearDownInjector() {
-    if (lifecycle != null) {
-      lifecycle.stop();
-    }
-    requestContext.setContext(null);
-    if (db != null) {
-      db.close();
-    }
-    InMemoryDatabase.drop(inMemoryDatabase);
-  }
-
-  @Before
-  public void setTimeForTesting() {
-    resetTimeWithClockStep(1, SECONDS);
-  }
-
-  private void resetTimeWithClockStep(long clockStep, TimeUnit clockStepUnit) {
-    systemTimeZone = System.setProperty("user.timezone", "US/Eastern");
-    // TODO(dborowitz): Figure out why tests fail when stubbing out
-    // SystemReader.
-    TestTimeUtil.resetWithClockStep(clockStep, clockStepUnit);
-    SystemReader.setInstance(null);
-  }
-
-  @After
-  public void resetTime() {
-    TestTimeUtil.useSystemTime();
-    System.setProperty("user.timezone", systemTimeZone);
-  }
-
-  @Test
-  public void byId() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    Change change1 = insert(repo, newChange(repo));
-    Change change2 = insert(repo, newChange(repo));
-
-    assertQuery("12345");
-    assertQuery(change1.getId().get(), change1);
-    assertQuery(change2.getId().get(), change2);
-  }
-
-  @Test
-  public void byKey() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    Change change = insert(repo, newChange(repo));
-    String key = change.getKey().get();
-
-    assertQuery("I0000000000000000000000000000000000000000");
-    for (int i = 0; i <= 36; i++) {
-      String q = key.substring(0, 41 - i);
-      assertQuery(q, change);
-    }
-  }
-
-  @Test
-  public void byTriplet() throws Exception {
-    TestRepository<Repo> repo = createProject("iabcde");
-    Change change = insert(repo, newChangeForBranch(repo, "branch"));
-    String k = change.getKey().get();
-
-    assertQuery("iabcde~branch~" + k, change);
-    assertQuery("change:iabcde~branch~" + k, change);
-    assertQuery("iabcde~refs/heads/branch~" + k, change);
-    assertQuery("change:iabcde~refs/heads/branch~" + k, change);
-    assertQuery("iabcde~branch~" + k.substring(0, 10), change);
-    assertQuery("change:iabcde~branch~" + k.substring(0, 10), change);
-
-    assertQuery("foo~bar");
-    assertThatQueryException("change:foo~bar").hasMessageThat().isEqualTo("Invalid change format");
-    assertQuery("otherrepo~branch~" + k);
-    assertQuery("change:otherrepo~branch~" + k);
-    assertQuery("iabcde~otherbranch~" + k);
-    assertQuery("change:iabcde~otherbranch~" + k);
-    assertQuery("iabcde~branch~I0000000000000000000000000000000000000000");
-    assertQuery("change:iabcde~branch~I0000000000000000000000000000000000000000");
-  }
-
-  @Test
-  public void byStatus() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    ChangeInserter ins1 = newChangeWithStatus(repo, Change.Status.NEW);
-    Change change1 = insert(repo, ins1);
-    ChangeInserter ins2 = newChangeWithStatus(repo, Change.Status.MERGED);
-    Change change2 = insert(repo, ins2);
-
-    assertQuery("status:new", change1);
-    assertQuery("status:NEW", change1);
-    assertQuery("is:new", change1);
-    assertQuery("status:merged", change2);
-    assertQuery("is:merged", change2);
-    assertQuery("status:draft");
-    assertQuery("is:draft");
-  }
-
-  @Test
-  public void byStatusOpen() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    ChangeInserter ins1 = newChangeWithStatus(repo, Change.Status.NEW);
-    Change change1 = insert(repo, ins1);
-    insert(repo, newChangeWithStatus(repo, Change.Status.MERGED));
-
-    Change[] expected = new Change[] {change1};
-    assertQuery("status:open", expected);
-    assertQuery("status:OPEN", expected);
-    assertQuery("status:o", expected);
-    assertQuery("status:op", expected);
-    assertQuery("status:ope", expected);
-    assertQuery("status:pending", expected);
-    assertQuery("status:PENDING", expected);
-    assertQuery("status:p", expected);
-    assertQuery("status:pe", expected);
-    assertQuery("status:pen", expected);
-    assertQuery("is:open", expected);
-    assertQuery("is:pending", expected);
-  }
-
-  @Test
-  public void byStatusClosed() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    ChangeInserter ins1 = newChangeWithStatus(repo, Change.Status.MERGED);
-    Change change1 = insert(repo, ins1);
-    ChangeInserter ins2 = newChangeWithStatus(repo, Change.Status.ABANDONED);
-    Change change2 = insert(repo, ins2);
-    insert(repo, newChangeWithStatus(repo, Change.Status.NEW));
-
-    Change[] expected = new Change[] {change2, change1};
-    assertQuery("status:closed", expected);
-    assertQuery("status:CLOSED", expected);
-    assertQuery("status:c", expected);
-    assertQuery("status:cl", expected);
-    assertQuery("status:clo", expected);
-    assertQuery("status:clos", expected);
-    assertQuery("status:close", expected);
-    assertQuery("status:closed", expected);
-    assertQuery("is:closed", expected);
-  }
-
-  @Test
-  public void byStatusAbandoned() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    ChangeInserter ins1 = newChangeWithStatus(repo, Change.Status.MERGED);
-    insert(repo, ins1);
-    ChangeInserter ins2 = newChangeWithStatus(repo, Change.Status.ABANDONED);
-    Change change1 = insert(repo, ins2);
-    insert(repo, newChangeWithStatus(repo, Change.Status.NEW));
-
-    assertQuery("status:abandoned", change1);
-    assertQuery("status:ABANDONED", change1);
-    assertQuery("is:abandoned", change1);
-  }
-
-  @Test
-  public void byStatusPrefix() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    ChangeInserter ins1 = newChangeWithStatus(repo, Change.Status.NEW);
-    Change change1 = insert(repo, ins1);
-    insert(repo, newChangeWithStatus(repo, Change.Status.MERGED));
-
-    assertQuery("status:n", change1);
-    assertQuery("status:ne", change1);
-    assertQuery("status:new", change1);
-    assertQuery("status:N", change1);
-    assertQuery("status:nE", change1);
-    assertQuery("status:neW", change1);
-    assertQuery("status:nx");
-    assertQuery("status:newx");
-  }
-
-  @Test
-  public void byPrivate() throws Exception {
-    if (getSchemaVersion() < 40) {
-      assertMissingField(ChangeField.PRIVATE);
-      assertFailingQuery(
-          "is:private", "'is:private' operator is not supported by change index version");
-      return;
-    }
-
-    TestRepository<Repo> repo = createProject("repo");
-    Change change1 = insert(repo, newChange(repo), userId);
-    Account.Id user2 =
-        accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId();
-    Change change2 = insert(repo, newChange(repo), user2);
-
-    // No private changes.
-    assertQuery("is:open", change2, change1);
-    assertQuery("is:private");
-
-    gApi.changes().id(change1.getChangeId()).setPrivate(true, null);
-
-    // Change1 is not private, but should be still visible to its owner.
-    assertQuery("is:open", change1, change2);
-    assertQuery("is:private", change1);
-
-    // Switch request context to user2.
-    requestContext.setContext(newRequestContext(user2));
-    assertQuery("is:open", change2);
-    assertQuery("is:private");
-  }
-
-  @Test
-  public void byWip() throws Exception {
-    if (getSchemaVersion() < 42) {
-      assertMissingField(ChangeField.WIP);
-      assertFailingQuery("is:wip", "'is:wip' operator is not supported by change index version");
-      return;
-    }
-
-    TestRepository<Repo> repo = createProject("repo");
-    Change change1 = insert(repo, newChange(repo), userId);
-
-    assertQuery("is:open", change1);
-    assertQuery("is:wip");
-
-    gApi.changes().id(change1.getChangeId()).setWorkInProgress();
-
-    assertQuery("is:wip", change1);
-
-    gApi.changes().id(change1.getChangeId()).setReadyForReview();
-
-    assertQuery("is:wip");
-  }
-
-  @Test
-  public void excludeWipChangeFromReviewersDashboardsBeforeSchema42() throws Exception {
-    assume().that(getSchemaVersion()).isLessThan(42);
-
-    assertMissingField(ChangeField.WIP);
-    assertFailingQuery("is:wip", "'is:wip' operator is not supported by change index version");
-
-    Account.Id user1 = createAccount("user1");
-    TestRepository<Repo> repo = createProject("repo");
-    Change change1 = insert(repo, newChangeWorkInProgress(repo), userId);
-    assertQuery("reviewer:" + user1, change1);
-    gApi.changes().id(change1.getChangeId()).setWorkInProgress();
-    assertQuery("reviewer:" + user1, change1);
-  }
-
-  @Test
-  public void excludeWipChangeFromReviewersDashboards() throws Exception {
-    assume().that(getSchemaVersion()).isAtLeast(42);
-
-    Account.Id user1 = createAccount("user1");
-    TestRepository<Repo> repo = createProject("repo");
-    Change change1 = insert(repo, newChangeWorkInProgress(repo), userId);
-
-    assertQuery("is:wip", change1);
-    assertQuery("reviewer:" + user1);
-
-    gApi.changes().id(change1.getChangeId()).setReadyForReview();
-    assertQuery("is:wip");
-    assertQuery("reviewer:" + user1);
-
-    gApi.changes().id(change1.getChangeId()).setWorkInProgress();
-    assertQuery("is:wip", change1);
-    assertQuery("reviewer:" + user1);
-  }
-
-  @Test
-  public void byStartedBeforeSchema44() throws Exception {
-    assume().that(getSchemaVersion()).isLessThan(44);
-    assertMissingField(ChangeField.STARTED);
-    assertFailingQuery(
-        "is:started", "'is:started' operator is not supported by change index version");
-  }
-
-  @Test
-  public void byStarted() throws Exception {
-    assume().that(getSchemaVersion()).isAtLeast(44);
-
-    TestRepository<Repo> repo = createProject("repo");
-    Change change1 = insert(repo, newChangeWorkInProgress(repo));
-
-    assertQuery("is:started");
-
-    gApi.changes().id(change1.getChangeId()).setReadyForReview();
-    assertQuery("is:started", change1);
-
-    gApi.changes().id(change1.getChangeId()).setWorkInProgress();
-    assertQuery("is:started", change1);
-  }
-
-  private void assertReviewers(Collection<AccountInfo> reviewers, Object... expected)
-      throws Exception {
-    if (expected.length == 0) {
-      assertThat(reviewers).isNull();
-      return;
-    }
-
-    // Convert AccountInfos to strings, either account ID or email.
-    List<String> reviewerIds =
-        reviewers.stream()
-            .map(
-                ai -> {
-                  if (ai._accountId != null) {
-                    return ai._accountId.toString();
-                  }
-                  return ai.email;
-                })
-            .collect(toList());
-    assertThat(reviewerIds).containsExactly(expected);
-  }
-
-  @Test
-  public void restorePendingReviewers() throws Exception {
-    assume().that(getSchemaVersion()).isAtLeast(44);
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    Project.NameKey project = new Project.NameKey("repo");
-    TestRepository<Repo> repo = createProject(project.get());
-    ConfigInput conf = new ConfigInput();
-    conf.enableReviewerByEmail = InheritableBoolean.TRUE;
-    gApi.projects().name(project.get()).config(conf);
-    Change change1 = insert(repo, newChangeWorkInProgress(repo));
-    Account.Id user1 = createAccount("user1");
-    Account.Id user2 = createAccount("user2");
-    String email1 = "email1@example.com";
-    String email2 = "email2@example.com";
-
-    ReviewInput in =
-        ReviewInput.noScore()
-            .reviewer(user1.toString())
-            .reviewer(user2.toString(), ReviewerState.CC, false)
-            .reviewer(email1)
-            .reviewer(email2, ReviewerState.CC, false);
-    gApi.changes().id(change1.getId().get()).revision("current").review(in);
-
-    List<ChangeInfo> changeInfos =
-        assertQuery(newQuery("is:wip").withOption(DETAILED_LABELS), change1);
-    assertThat(changeInfos).isNotEmpty();
-
-    Map<ReviewerState, Collection<AccountInfo>> pendingReviewers =
-        changeInfos.get(0).pendingReviewers;
-    assertThat(pendingReviewers).isNotNull();
-
-    assertReviewers(
-        pendingReviewers.get(ReviewerState.REVIEWER), userId.toString(), user1.toString(), email1);
-    assertReviewers(pendingReviewers.get(ReviewerState.CC), user2.toString(), email2);
-    assertReviewers(pendingReviewers.get(ReviewerState.REMOVED));
-
-    // Pending reviewers may also be presented in the REMOVED state. Toggle the
-    // change to ready and then back to WIP and remove reviewers to produce.
-    assertThat(pendingReviewers.get(ReviewerState.REMOVED)).isNull();
-    gApi.changes().id(change1.getId().get()).setReadyForReview();
-    gApi.changes().id(change1.getId().get()).setWorkInProgress();
-    gApi.changes().id(change1.getId().get()).reviewer(user1.toString()).remove();
-    gApi.changes().id(change1.getId().get()).reviewer(user2.toString()).remove();
-    gApi.changes().id(change1.getId().get()).reviewer(email1).remove();
-    gApi.changes().id(change1.getId().get()).reviewer(email2).remove();
-
-    changeInfos = assertQuery(newQuery("is:wip").withOption(DETAILED_LABELS), change1);
-    assertThat(changeInfos).isNotEmpty();
-
-    pendingReviewers = changeInfos.get(0).pendingReviewers;
-    assertThat(pendingReviewers).isNotNull();
-    assertReviewers(pendingReviewers.get(ReviewerState.REVIEWER));
-    assertReviewers(pendingReviewers.get(ReviewerState.CC));
-    assertReviewers(
-        pendingReviewers.get(ReviewerState.REMOVED),
-        user1.toString(),
-        user2.toString(),
-        email1,
-        email2);
-  }
-
-  @Test
-  public void byCommit() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    ChangeInserter ins = newChange(repo);
-    Change change = insert(repo, ins);
-    String sha = ins.getCommitId().name();
-
-    assertQuery("0000000000000000000000000000000000000000");
-    assertQuery("commit:0000000000000000000000000000000000000000");
-    for (int i = 0; i <= 36; i++) {
-      String q = sha.substring(0, 40 - i);
-      assertQuery(q, change);
-      assertQuery("commit:" + q, change);
-    }
-  }
-
-  @Test
-  public void byOwner() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    Change change1 = insert(repo, newChange(repo), userId);
-    Account.Id user2 =
-        accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId();
-    Change change2 = insert(repo, newChange(repo), user2);
-
-    assertQuery("is:owner", change1);
-    assertQuery("owner:" + userId.get(), change1);
-    assertQuery("owner:" + user2, change2);
-
-    String nameEmail = user.asIdentifiedUser().getNameEmail();
-    assertQuery("owner: \"" + nameEmail + "\"", change1);
-  }
-
-  @Test
-  public void byAuthorExact() throws Exception {
-    assume().that(getSchema().hasField(ChangeField.EXACT_AUTHOR)).isTrue();
-    byAuthorOrCommitterExact("author:");
-  }
-
-  @Test
-  public void byAuthorFullText() throws Exception {
-    byAuthorOrCommitterFullText("author:");
-  }
-
-  @Test
-  public void byCommitterExact() throws Exception {
-    assume().that(getSchema().hasField(ChangeField.EXACT_COMMITTER)).isTrue();
-    byAuthorOrCommitterExact("committer:");
-  }
-
-  @Test
-  public void byCommitterFullText() throws Exception {
-    byAuthorOrCommitterFullText("committer:");
-  }
-
-  private void byAuthorOrCommitterExact(String searchOperator) throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    PersonIdent johnDoe = new PersonIdent("John Doe", "john.doe@example.com");
-    PersonIdent john = new PersonIdent("John", "john@example.com");
-    PersonIdent doeSmith = new PersonIdent("Doe Smith", "doe_smith@example.com");
-    Change change1 = createChange(repo, johnDoe);
-    Change change2 = createChange(repo, john);
-    Change change3 = createChange(repo, doeSmith);
-
-    // Only email address.
-    assertQuery(searchOperator + "john.doe@example.com", change1);
-    assertQuery(searchOperator + "john@example.com", change2);
-    assertQuery(searchOperator + "Doe_SmIth@example.com", change3); // Case insensitive.
-
-    // Right combination of email address and name.
-    assertQuery(searchOperator + "\"John Doe <john.doe@example.com>\"", change1);
-    assertQuery(searchOperator + "\" John <john@example.com> \"", change2);
-    assertQuery(searchOperator + "\"doE SMITH <doe_smitH@example.com>\"", change3);
-
-    // Wrong combination of email address and name.
-    assertQuery(searchOperator + "\"John <john.doe@example.com>\"");
-    assertQuery(searchOperator + "\"Doe John <john@example.com>\"");
-    assertQuery(searchOperator + "\"Doe John <doe_smith@example.com>\"");
-  }
-
-  private void byAuthorOrCommitterFullText(String searchOperator) throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    PersonIdent johnDoe = new PersonIdent("John Doe", "john.doe@example.com");
-    PersonIdent john = new PersonIdent("John", "john@example.com");
-    PersonIdent doeSmith = new PersonIdent("Doe Smith", "doe_smith@example.com");
-    Change change1 = createChange(repo, johnDoe);
-    Change change2 = createChange(repo, john);
-    Change change3 = createChange(repo, doeSmith);
-
-    // By exact name.
-    assertQuery(searchOperator + "\"John Doe\"", change1);
-    assertQuery(searchOperator + "\"john\"", change2, change1);
-    assertQuery(searchOperator + "\"Doe smith\"", change3);
-
-    // By name part.
-    assertQuery(searchOperator + "Doe", change3, change1);
-    assertQuery(searchOperator + "smith", change3);
-
-    // By wrong combination.
-    assertQuery(searchOperator + "\"John Smith\"");
-
-    // By invalid query.
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("invalid value");
-    // SchemaUtil.getNameParts will return an empty set for query only containing these characters.
-    assertQuery(searchOperator + "@.- /_");
-  }
-
-  private Change createChange(TestRepository<Repo> repo, PersonIdent person) throws Exception {
-    RevCommit commit =
-        repo.parseBody(repo.commit().message("message").author(person).committer(person).create());
-    return insert(repo, newChangeForCommit(repo, commit), null);
-  }
-
-  @Test
-  public void byOwnerIn() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    Change change1 = insert(repo, newChange(repo), userId);
-    Account.Id user2 =
-        accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId();
-    Change change2 = insert(repo, newChange(repo), user2);
-    Change change3 = insert(repo, newChange(repo), user2);
-    gApi.changes().id(change3.getId().get()).current().review(ReviewInput.approve());
-    gApi.changes().id(change3.getId().get()).current().submit();
-
-    assertQuery("ownerin:Administrators", change1);
-    assertQuery("ownerin:\"Registered Users\"", change2, change1);
-    assertQuery("ownerin:\"Registered Users\" project:repo", change3, change2, change1);
-    assertQuery("ownerin:\"Registered Users\" status:merged", change3);
-  }
-
-  @Test
-  public void byProject() throws Exception {
-    TestRepository<Repo> repo1 = createProject("repo1");
-    TestRepository<Repo> repo2 = createProject("repo2");
-    Change change1 = insert(repo1, newChange(repo1));
-    Change change2 = insert(repo2, newChange(repo2));
-
-    assertQuery("project:foo");
-    assertQuery("project:repo");
-    assertQuery("project:repo1", change1);
-    assertQuery("project:repo2", change2);
-  }
-
-  @Test
-  public void byParentProject() throws Exception {
-    TestRepository<Repo> repo1 = createProject("repo1");
-    TestRepository<Repo> repo2 = createProject("repo2", "repo1");
-    Change change1 = insert(repo1, newChange(repo1));
-    Change change2 = insert(repo2, newChange(repo2));
-
-    assertQuery("parentproject:repo1", change2, change1);
-    assertQuery("parentproject:repo2", change2);
-  }
-
-  @Test
-  public void byProjectPrefix() throws Exception {
-    TestRepository<Repo> repo1 = createProject("repo1");
-    TestRepository<Repo> repo2 = createProject("repo2");
-    Change change1 = insert(repo1, newChange(repo1));
-    Change change2 = insert(repo2, newChange(repo2));
-
-    assertQuery("projects:foo");
-    assertQuery("projects:repo1", change1);
-    assertQuery("projects:repo2", change2);
-    assertQuery("projects:repo", change2, change1);
-  }
-
-  @Test
-  public void byBranchAndRef() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    Change change1 = insert(repo, newChangeForBranch(repo, "master"));
-    Change change2 = insert(repo, newChangeForBranch(repo, "branch"));
-
-    assertQuery("branch:foo");
-    assertQuery("branch:master", change1);
-    assertQuery("branch:refs/heads/master", change1);
-    assertQuery("ref:master");
-    assertQuery("ref:refs/heads/master", change1);
-    assertQuery("branch:refs/heads/master", change1);
-    assertQuery("branch:branch", change2);
-    assertQuery("branch:refs/heads/branch", change2);
-    assertQuery("ref:branch");
-    assertQuery("ref:refs/heads/branch", change2);
-  }
-
-  @Test
-  public void byTopic() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    ChangeInserter ins1 = newChangeWithTopic(repo, "feature1");
-    Change change1 = insert(repo, ins1);
-
-    ChangeInserter ins2 = newChangeWithTopic(repo, "feature2");
-    Change change2 = insert(repo, ins2);
-
-    ChangeInserter ins3 = newChangeWithTopic(repo, "Cherrypick-feature2");
-    Change change3 = insert(repo, ins3);
-
-    ChangeInserter ins4 = newChangeWithTopic(repo, "feature2-fixup");
-    Change change4 = insert(repo, ins4);
-
-    ChangeInserter ins5 = newChangeWithTopic(repo, "https://gerrit.local");
-    Change change5 = insert(repo, ins5);
-
-    ChangeInserter ins6 = newChangeWithTopic(repo, "git_gerrit_training");
-    Change change6 = insert(repo, ins6);
-
-    Change change_no_topic = insert(repo, newChange(repo));
-
-    assertQuery("intopic:foo");
-    assertQuery("intopic:feature1", change1);
-    assertQuery("intopic:feature2", change4, change3, change2);
-    assertQuery("topic:feature2", change2);
-    assertQuery("intopic:feature2", change4, change3, change2);
-    assertQuery("intopic:fixup", change4);
-    assertQuery("intopic:gerrit", change6, change5);
-    assertQuery("topic:\"\"", change_no_topic);
-    assertQuery("intopic:\"\"", change_no_topic);
-  }
-
-  @Test
-  public void byTopicRegex() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-
-    ChangeInserter ins1 = newChangeWithTopic(repo, "feature1");
-    Change change1 = insert(repo, ins1);
-
-    ChangeInserter ins2 = newChangeWithTopic(repo, "Cherrypick-feature1");
-    Change change2 = insert(repo, ins2);
-
-    ChangeInserter ins3 = newChangeWithTopic(repo, "feature1-fixup");
-    Change change3 = insert(repo, ins3);
-
-    assertQuery("intopic:^feature1.*", change3, change1);
-    assertQuery("intopic:{^.*feature1$}", change2, change1);
-  }
-
-  @Test
-  public void byMessageExact() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    RevCommit commit1 = repo.parseBody(repo.commit().message("one").create());
-    Change change1 = insert(repo, newChangeForCommit(repo, commit1));
-    RevCommit commit2 = repo.parseBody(repo.commit().message("two").create());
-    Change change2 = insert(repo, newChangeForCommit(repo, commit2));
-
-    assertQuery("message:foo");
-    assertQuery("message:one", change1);
-    assertQuery("message:two", change2);
-  }
-
-  @Test
-  public void fullTextWithNumbers() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    RevCommit commit1 = repo.parseBody(repo.commit().message("12345 67890").create());
-    Change change1 = insert(repo, newChangeForCommit(repo, commit1));
-    RevCommit commit2 = repo.parseBody(repo.commit().message("12346 67891").create());
-    Change change2 = insert(repo, newChangeForCommit(repo, commit2));
-
-    assertQuery("message:1234");
-    assertQuery("message:12345", change1);
-    assertQuery("message:12346", change2);
-  }
-
-  @Test
-  public void byMessageMixedCase() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    RevCommit commit1 = repo.parseBody(repo.commit().message("Hello gerrit").create());
-    Change change1 = insert(repo, newChangeForCommit(repo, commit1));
-    RevCommit commit2 = repo.parseBody(repo.commit().message("Hello Gerrit").create());
-    Change change2 = insert(repo, newChangeForCommit(repo, commit2));
-
-    assertQuery("message:gerrit", change2, change1);
-    assertQuery("message:Gerrit", change2, change1);
-  }
-
-  @Test
-  public void byMessageSubstring() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    RevCommit commit1 = repo.parseBody(repo.commit().message("https://gerrit.local").create());
-    Change change1 = insert(repo, newChangeForCommit(repo, commit1));
-    assertQuery("message:gerrit", change1);
-  }
-
-  @Test
-  public void byLabel() throws Exception {
-    accountManager.authenticate(AuthRequest.forUser("anotheruser"));
-    TestRepository<Repo> repo = createProject("repo");
-    ChangeInserter ins = newChange(repo, null, null, null, null, false);
-    ChangeInserter ins2 = newChange(repo, null, null, null, null, false);
-    ChangeInserter ins3 = newChange(repo, null, null, null, null, false);
-    ChangeInserter ins4 = newChange(repo, null, null, null, null, false);
-    ChangeInserter ins5 = newChange(repo, null, null, null, null, false);
-
-    Change reviewMinus2Change = insert(repo, ins);
-    gApi.changes().id(reviewMinus2Change.getId().get()).current().review(ReviewInput.reject());
-
-    Change reviewMinus1Change = insert(repo, ins2);
-    gApi.changes().id(reviewMinus1Change.getId().get()).current().review(ReviewInput.dislike());
-
-    Change noLabelChange = insert(repo, ins3);
-
-    Change reviewPlus1Change = insert(repo, ins4);
-    gApi.changes().id(reviewPlus1Change.getId().get()).current().review(ReviewInput.recommend());
-
-    Change reviewPlus2Change = insert(repo, ins5);
-    gApi.changes().id(reviewPlus2Change.getId().get()).current().review(ReviewInput.approve());
-
-    Map<String, Short> m =
-        gApi.changes()
-            .id(reviewPlus1Change.getId().get())
-            .reviewer(user.getAccountId().toString())
-            .votes();
-    assertThat(m).hasSize(1);
-    assertThat(m).containsEntry("Code-Review", Short.valueOf((short) 1));
-
-    Map<Integer, Change> changes = new LinkedHashMap<>(5);
-    changes.put(2, reviewPlus2Change);
-    changes.put(1, reviewPlus1Change);
-    changes.put(0, noLabelChange);
-    changes.put(-1, reviewMinus1Change);
-    changes.put(-2, reviewMinus2Change);
-
-    assertQuery("label:Code-Review=-2", reviewMinus2Change);
-    assertQuery("label:Code-Review-2", reviewMinus2Change);
-    assertQuery("label:Code-Review=-1", reviewMinus1Change);
-    assertQuery("label:Code-Review-1", reviewMinus1Change);
-    assertQuery("label:Code-Review=0", noLabelChange);
-    assertQuery("label:Code-Review=+1", reviewPlus1Change);
-    assertQuery("label:Code-Review=1", reviewPlus1Change);
-    assertQuery("label:Code-Review+1", reviewPlus1Change);
-    assertQuery("label:Code-Review=+2", reviewPlus2Change);
-    assertQuery("label:Code-Review=2", reviewPlus2Change);
-    assertQuery("label:Code-Review+2", reviewPlus2Change);
-
-    assertQuery("label:Code-Review>-3", codeReviewInRange(changes, -2, 2));
-    assertQuery("label:Code-Review>=-2", codeReviewInRange(changes, -2, 2));
-    assertQuery("label:Code-Review>-2", codeReviewInRange(changes, -1, 2));
-    assertQuery("label:Code-Review>=-1", codeReviewInRange(changes, -1, 2));
-    assertQuery("label:Code-Review>-1", codeReviewInRange(changes, 0, 2));
-    assertQuery("label:Code-Review>=0", codeReviewInRange(changes, 0, 2));
-    assertQuery("label:Code-Review>0", codeReviewInRange(changes, 1, 2));
-    assertQuery("label:Code-Review>=1", codeReviewInRange(changes, 1, 2));
-    assertQuery("label:Code-Review>1", reviewPlus2Change);
-    assertQuery("label:Code-Review>=2", reviewPlus2Change);
-    assertQuery("label:Code-Review>2");
-
-    assertQuery("label:Code-Review<=2", codeReviewInRange(changes, -2, 2));
-    assertQuery("label:Code-Review<2", codeReviewInRange(changes, -2, 1));
-    assertQuery("label:Code-Review<=1", codeReviewInRange(changes, -2, 1));
-    assertQuery("label:Code-Review<1", codeReviewInRange(changes, -2, 0));
-    assertQuery("label:Code-Review<=0", codeReviewInRange(changes, -2, 0));
-    assertQuery("label:Code-Review<0", codeReviewInRange(changes, -2, -1));
-    assertQuery("label:Code-Review<=-1", codeReviewInRange(changes, -2, -1));
-    assertQuery("label:Code-Review<-1", reviewMinus2Change);
-    assertQuery("label:Code-Review<=-2", reviewMinus2Change);
-    assertQuery("label:Code-Review<-2");
-
-    assertQuery("label:Code-Review=+1,anotheruser");
-    assertQuery("label:Code-Review=+1,user", reviewPlus1Change);
-    assertQuery("label:Code-Review=+1,user=user", reviewPlus1Change);
-    assertQuery("label:Code-Review=+1,Administrators", reviewPlus1Change);
-    assertQuery("label:Code-Review=+1,group=Administrators", reviewPlus1Change);
-    assertQuery("label:Code-Review=+1,user=owner", reviewPlus1Change);
-    assertQuery("label:Code-Review=+1,owner", reviewPlus1Change);
-    assertQuery("label:Code-Review=+2,owner", reviewPlus2Change);
-    assertQuery("label:Code-Review=-2,owner", reviewMinus2Change);
-  }
-
-  @Test
-  public void byLabelMulti() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    Project.NameKey project =
-        new Project.NameKey(repo.getRepository().getDescription().getRepositoryName());
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-
-    LabelType verified =
-        category("Verified", value(1, "Passes"), value(0, "No score"), value(-1, "Failed"));
-    cfg.getLabelSections().put(verified.getName(), verified);
-
-    String heads = RefNames.REFS_HEADS + "*";
-    Util.allow(cfg, Permission.forLabel(Util.verified().getName()), -1, 1, REGISTERED_USERS, heads);
-
-    try (MetaDataUpdate md = metaDataUpdateFactory.create(project)) {
-      cfg.commit(md);
-    }
-    projectCache.evict(cfg.getProject());
-
-    ReviewInput reviewVerified = new ReviewInput().label("Verified", 1);
-    ChangeInserter ins = newChange(repo, null, null, null, null, false);
-    ChangeInserter ins2 = newChange(repo, null, null, null, null, false);
-    ChangeInserter ins3 = newChange(repo, null, null, null, null, false);
-    ChangeInserter ins4 = newChange(repo, null, null, null, null, false);
-    ChangeInserter ins5 = newChange(repo, null, null, null, null, false);
-
-    // CR+1
-    Change reviewCRplus1 = insert(repo, ins);
-    gApi.changes().id(reviewCRplus1.getId().get()).current().review(ReviewInput.recommend());
-
-    // CR+2
-    Change reviewCRplus2 = insert(repo, ins2);
-    gApi.changes().id(reviewCRplus2.getId().get()).current().review(ReviewInput.approve());
-
-    // CR+1 VR+1
-    Change reviewCRplus1VRplus1 = insert(repo, ins3);
-    gApi.changes().id(reviewCRplus1VRplus1.getId().get()).current().review(ReviewInput.recommend());
-    gApi.changes().id(reviewCRplus1VRplus1.getId().get()).current().review(reviewVerified);
-
-    // CR+2 VR+1
-    Change reviewCRplus2VRplus1 = insert(repo, ins4);
-    gApi.changes().id(reviewCRplus2VRplus1.getId().get()).current().review(ReviewInput.approve());
-    gApi.changes().id(reviewCRplus2VRplus1.getId().get()).current().review(reviewVerified);
-
-    // VR+1
-    Change reviewVRplus1 = insert(repo, ins5);
-    gApi.changes().id(reviewVRplus1.getId().get()).current().review(reviewVerified);
-
-    assertQuery("label:Code-Review=+1", reviewCRplus1VRplus1, reviewCRplus1);
-    assertQuery(
-        "label:Code-Review>=+1",
-        reviewCRplus2VRplus1,
-        reviewCRplus1VRplus1,
-        reviewCRplus2,
-        reviewCRplus1);
-    assertQuery("label:Code-Review>=+2", reviewCRplus2VRplus1, reviewCRplus2);
-
-    assertQuery(
-        "label:Code-Review>=+1 label:Verified=+1", reviewCRplus2VRplus1, reviewCRplus1VRplus1);
-    assertQuery("label:Code-Review>=+2 label:Verified=+1", reviewCRplus2VRplus1);
-  }
-
-  @Test
-  public void byLabelNotOwner() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    ChangeInserter ins = newChange(repo, null, null, null, null, false);
-    Account.Id user1 = createAccount("user1");
-
-    Change reviewPlus1Change = insert(repo, ins);
-
-    // post a review with user1
-    requestContext.setContext(newRequestContext(user1));
-    gApi.changes().id(reviewPlus1Change.getId().get()).current().review(ReviewInput.recommend());
-
-    assertQuery("label:Code-Review=+1,user=user1", reviewPlus1Change);
-    assertQuery("label:Code-Review=+1,owner");
-  }
-
-  private Change[] codeReviewInRange(Map<Integer, Change> changes, int start, int end) {
-    int size = 0;
-    Change[] range = new Change[end - start + 1];
-    for (int i : changes.keySet()) {
-      if (i >= start && i <= end) {
-        range[size] = changes.get(i);
-        size++;
-      }
-    }
-    return range;
-  }
-
-  private String createGroup(String name, String owner) throws Exception {
-    GroupInput in = new GroupInput();
-    in.name = name;
-    in.ownerId = owner;
-    gApi.groups().create(in);
-    return name;
-  }
-
-  private Account.Id createAccount(String name) throws Exception {
-    return accountManager.authenticate(AuthRequest.forUser(name)).getAccountId();
-  }
-
-  @Test
-  public void byLabelGroup() throws Exception {
-    Account.Id user1 = createAccount("user1");
-    createAccount("user2");
-    TestRepository<Repo> repo = createProject("repo");
-
-    // create group and add users
-    String g1 = createGroup("group1", "Administrators");
-    String g2 = createGroup("group2", "Administrators");
-    gApi.groups().id(g1).addMembers("user1");
-    gApi.groups().id(g2).addMembers("user2");
-
-    // create a change
-    Change change1 = insert(repo, newChange(repo), user1);
-
-    // post a review with user1
-    requestContext.setContext(newRequestContext(user1));
-    gApi.changes()
-        .id(change1.getId().get())
-        .current()
-        .review(new ReviewInput().label("Code-Review", 1));
-
-    // verify that query with user1 will return results.
-    requestContext.setContext(newRequestContext(userId));
-    assertQuery("label:Code-Review=+1,group1", change1);
-    assertQuery("label:Code-Review=+1,group=group1", change1);
-    assertQuery("label:Code-Review=+1,user=user1", change1);
-    assertQuery("label:Code-Review=+1,user=user2");
-    assertQuery("label:Code-Review=+1,group=group2");
-  }
-
-  @Test
-  public void limit() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    Change last = null;
-    int n = 5;
-    for (int i = 0; i < n; i++) {
-      last = insert(repo, newChange(repo));
-    }
-
-    for (int i = 1; i <= n + 2; i++) {
-      int expectedSize;
-      Boolean expectedMoreChanges;
-      if (i < n) {
-        expectedSize = i;
-        expectedMoreChanges = true;
-      } else {
-        expectedSize = n;
-        expectedMoreChanges = null;
-      }
-      String q = "status:new limit:" + i;
-      List<ChangeInfo> results = newQuery(q).get();
-      assertThat(results).named(q).hasSize(expectedSize);
-      assertThat(results.get(results.size() - 1)._moreChanges)
-          .named(q)
-          .isEqualTo(expectedMoreChanges);
-      assertThat(results.get(0)._number).isEqualTo(last.getId().get());
-    }
-  }
-
-  @Test
-  public void start() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    List<Change> changes = new ArrayList<>();
-    for (int i = 0; i < 2; i++) {
-      changes.add(insert(repo, newChange(repo)));
-    }
-
-    assertQuery("status:new", changes.get(1), changes.get(0));
-    assertQuery(newQuery("status:new").withStart(1), changes.get(0));
-    assertQuery(newQuery("status:new").withStart(2));
-    assertQuery(newQuery("status:new").withStart(3));
-  }
-
-  @Test
-  public void startWithLimit() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    List<Change> changes = new ArrayList<>();
-    for (int i = 0; i < 3; i++) {
-      changes.add(insert(repo, newChange(repo)));
-    }
-
-    assertQuery("status:new limit:2", changes.get(2), changes.get(1));
-    assertQuery(newQuery("status:new limit:2").withStart(1), changes.get(1), changes.get(0));
-    assertQuery(newQuery("status:new limit:2").withStart(2), changes.get(0));
-    assertQuery(newQuery("status:new limit:2").withStart(3));
-  }
-
-  @Test
-  public void maxPages() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    Change change = insert(repo, newChange(repo));
-
-    QueryRequest query = newQuery("status:new").withLimit(10);
-    assertQuery(query, change);
-    assertQuery(query.withStart(1));
-    assertQuery(query.withStart(99));
-    assertThatQueryException(query.withStart(100))
-        .hasMessageThat()
-        .isEqualTo("Cannot go beyond page 10 of results");
-    assertQuery(query.withLimit(100).withStart(100));
-  }
-
-  @Test
-  public void updateOrder() throws Exception {
-    resetTimeWithClockStep(2, MINUTES);
-    TestRepository<Repo> repo = createProject("repo");
-    List<ChangeInserter> inserters = new ArrayList<>();
-    List<Change> changes = new ArrayList<>();
-    for (int i = 0; i < 5; i++) {
-      inserters.add(newChange(repo));
-      changes.add(insert(repo, inserters.get(i)));
-    }
-
-    for (int i : ImmutableList.of(2, 0, 1, 4, 3)) {
-      gApi.changes()
-          .id(changes.get(i).getId().get())
-          .current()
-          .review(new ReviewInput().message("modifying " + i));
-    }
-
-    assertQuery(
-        "status:new",
-        changes.get(3),
-        changes.get(4),
-        changes.get(1),
-        changes.get(0),
-        changes.get(2));
-  }
-
-  @Test
-  public void updatedOrder() throws Exception {
-    resetTimeWithClockStep(1, SECONDS);
-    TestRepository<Repo> repo = createProject("repo");
-    ChangeInserter ins1 = newChange(repo);
-    Change change1 = insert(repo, ins1);
-    Change change2 = insert(repo, newChange(repo));
-
-    assertThat(lastUpdatedMs(change1)).isLessThan(lastUpdatedMs(change2));
-    assertQuery("status:new", change2, change1);
-
-    gApi.changes().id(change1.getId().get()).topic("new-topic");
-    change1 = notesFactory.create(db, change1.getProject(), change1.getId()).getChange();
-
-    assertThat(lastUpdatedMs(change1)).isGreaterThan(lastUpdatedMs(change2));
-    assertThat(lastUpdatedMs(change1) - lastUpdatedMs(change2))
-        .isAtLeast(MILLISECONDS.convert(1, SECONDS));
-
-    // change1 moved to the top.
-    assertQuery("status:new", change1, change2);
-  }
-
-  @Test
-  public void filterOutMoreThanOnePageOfResults() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    Change change = insert(repo, newChange(repo), userId);
-    Account.Id user2 =
-        accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId();
-    for (int i = 0; i < 5; i++) {
-      insert(repo, newChange(repo), user2);
-    }
-
-    assertQuery("status:new ownerin:Administrators", change);
-    assertQuery("status:new ownerin:Administrators limit:2", change);
-  }
-
-  @Test
-  public void filterOutAllResults() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    Account.Id user2 =
-        accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId();
-    for (int i = 0; i < 5; i++) {
-      insert(repo, newChange(repo), user2);
-    }
-
-    assertQuery("status:new ownerin:Administrators");
-    assertQuery("status:new ownerin:Administrators limit:2");
-  }
-
-  @Test
-  public void byFileExact() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    RevCommit commit =
-        repo.parseBody(
-            repo.commit()
-                .message("one")
-                .add("dir/file1", "contents1")
-                .add("dir/file2", "contents2")
-                .create());
-    Change change = insert(repo, newChangeForCommit(repo, commit));
-
-    assertQuery("file:file");
-    assertQuery("file:dir", change);
-    assertQuery("file:file1", change);
-    assertQuery("file:file2", change);
-    assertQuery("file:dir/file1", change);
-    assertQuery("file:dir/file2", change);
-  }
-
-  @Test
-  public void byFileRegex() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    RevCommit commit =
-        repo.parseBody(
-            repo.commit()
-                .message("one")
-                .add("dir/file1", "contents1")
-                .add("dir/file2", "contents2")
-                .create());
-    Change change = insert(repo, newChangeForCommit(repo, commit));
-
-    assertQuery("file:.*file.*");
-    assertQuery("file:^file.*"); // Whole path only.
-    assertQuery("file:^dir.file.*", change);
-  }
-
-  @Test
-  public void byPathExact() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    RevCommit commit =
-        repo.parseBody(
-            repo.commit()
-                .message("one")
-                .add("dir/file1", "contents1")
-                .add("dir/file2", "contents2")
-                .create());
-    Change change = insert(repo, newChangeForCommit(repo, commit));
-
-    assertQuery("path:file");
-    assertQuery("path:dir");
-    assertQuery("path:file1");
-    assertQuery("path:file2");
-    assertQuery("path:dir/file1", change);
-    assertQuery("path:dir/file2", change);
-  }
-
-  @Test
-  public void byPathRegex() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    RevCommit commit =
-        repo.parseBody(
-            repo.commit()
-                .message("one")
-                .add("dir/file1", "contents1")
-                .add("dir/file2", "contents2")
-                .create());
-    Change change = insert(repo, newChangeForCommit(repo, commit));
-
-    assertQuery("path:.*file.*");
-    assertQuery("path:^dir.file.*", change);
-  }
-
-  @Test
-  public void byComment() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    ChangeInserter ins = newChange(repo);
-    Change change = insert(repo, ins);
-
-    ReviewInput input = new ReviewInput();
-    input.message = "toplevel";
-    ReviewInput.CommentInput commentInput = new ReviewInput.CommentInput();
-    commentInput.line = 1;
-    commentInput.message = "inline";
-    input.comments =
-        ImmutableMap.<String, List<ReviewInput.CommentInput>>of(
-            Patch.COMMIT_MSG, ImmutableList.<ReviewInput.CommentInput>of(commentInput));
-    gApi.changes().id(change.getId().get()).current().review(input);
-
-    Map<String, List<CommentInfo>> comments =
-        gApi.changes().id(change.getId().get()).current().comments();
-    assertThat(comments).hasSize(1);
-    CommentInfo comment = Iterables.getOnlyElement(comments.get(Patch.COMMIT_MSG));
-    assertThat(comment.message).isEqualTo(commentInput.message);
-    ChangeMessageInfo lastMsg =
-        Iterables.getLast(gApi.changes().id(change.getId().get()).get().messages, null);
-    assertThat(lastMsg.message).isEqualTo("Patch Set 1:\n\n(1 comment)\n\n" + input.message);
-
-    assertQuery("comment:foo");
-    assertQuery("comment:toplevel", change);
-    assertQuery("comment:inline", change);
-  }
-
-  @Test
-  public void byAge() throws Exception {
-    long thirtyHoursInMs = MILLISECONDS.convert(30, HOURS);
-    resetTimeWithClockStep(thirtyHoursInMs, MILLISECONDS);
-    TestRepository<Repo> repo = createProject("repo");
-    long startMs = TestTimeUtil.START.getMillis();
-    Change change1 = insert(repo, newChange(repo), null, new Timestamp(startMs));
-    Change change2 = insert(repo, newChange(repo), null, new Timestamp(startMs + thirtyHoursInMs));
-
-    // Stop time so age queries use the same endpoint.
-    TestTimeUtil.setClockStep(0, MILLISECONDS);
-    TestTimeUtil.setClock(new Timestamp(startMs + 2 * thirtyHoursInMs));
-    long nowMs = TimeUtil.nowMs();
-
-    assertThat(lastUpdatedMs(change2) - lastUpdatedMs(change1)).isEqualTo(thirtyHoursInMs);
-    assertThat(nowMs - lastUpdatedMs(change2)).isEqualTo(thirtyHoursInMs);
-    assertThat(TimeUtil.nowMs()).isEqualTo(nowMs);
-
-    assertQuery("-age:1d");
-    assertQuery("-age:" + (30 * 60 - 1) + "m");
-    assertQuery("-age:2d", change2);
-    assertQuery("-age:3d", change2, change1);
-    assertQuery("age:3d");
-    assertQuery("age:2d", change1);
-    assertQuery("age:1d", change2, change1);
-  }
-
-  @Test
-  public void byBeforeUntil() throws Exception {
-    long thirtyHoursInMs = MILLISECONDS.convert(30, HOURS);
-    resetTimeWithClockStep(thirtyHoursInMs, MILLISECONDS);
-    TestRepository<Repo> repo = createProject("repo");
-    long startMs = TestTimeUtil.START.getMillis();
-    Change change1 = insert(repo, newChange(repo), null, new Timestamp(startMs));
-    Change change2 = insert(repo, newChange(repo), null, new Timestamp(startMs + thirtyHoursInMs));
-    TestTimeUtil.setClockStep(0, MILLISECONDS);
-
-    for (String predicate : Lists.newArrayList("before:", "until:")) {
-      assertQuery(predicate + "2009-09-29");
-      assertQuery(predicate + "2009-09-30");
-      assertQuery(predicate + "\"2009-09-30 16:59:00 -0400\"");
-      assertQuery(predicate + "\"2009-09-30 20:59:00 -0000\"");
-      assertQuery(predicate + "\"2009-09-30 20:59:00\"");
-      assertQuery(predicate + "\"2009-09-30 17:02:00 -0400\"", change1);
-      assertQuery(predicate + "\"2009-10-01 21:02:00 -0000\"", change1);
-      assertQuery(predicate + "\"2009-10-01 21:02:00\"", change1);
-      assertQuery(predicate + "2009-10-01", change1);
-      assertQuery(predicate + "2009-10-03", change2, change1);
-    }
-  }
-
-  @Test
-  public void byAfterSince() throws Exception {
-    long thirtyHoursInMs = MILLISECONDS.convert(30, HOURS);
-    resetTimeWithClockStep(thirtyHoursInMs, MILLISECONDS);
-    TestRepository<Repo> repo = createProject("repo");
-    long startMs = TestTimeUtil.START.getMillis();
-    Change change1 = insert(repo, newChange(repo), null, new Timestamp(startMs));
-    Change change2 = insert(repo, newChange(repo), null, new Timestamp(startMs + thirtyHoursInMs));
-    TestTimeUtil.setClockStep(0, MILLISECONDS);
-
-    for (String predicate : Lists.newArrayList("after:", "since:")) {
-      assertQuery(predicate + "2009-10-03");
-      assertQuery(predicate + "\"2009-10-01 20:59:59 -0400\"", change2);
-      assertQuery(predicate + "\"2009-10-01 20:59:59 -0000\"", change2);
-      assertQuery(predicate + "2009-10-01", change2);
-      assertQuery(predicate + "2009-09-30", change2, change1);
-    }
-  }
-
-  @Test
-  public void bySize() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-
-    // added = 3, deleted = 0, delta = 3
-    RevCommit commit1 = repo.parseBody(repo.commit().add("file1", "foo\n\foo\nfoo").create());
-    // added = 0, deleted = 2, delta = 2
-    RevCommit commit2 = repo.parseBody(repo.commit().parent(commit1).add("file1", "foo").create());
-
-    Change change1 = insert(repo, newChangeForCommit(repo, commit1));
-    Change change2 = insert(repo, newChangeForCommit(repo, commit2));
-
-    assertQuery("added:>4");
-    assertQuery("-added:<=4");
-
-    assertQuery("added:3", change1);
-    assertQuery("-(added:<3 OR added>3)", change1);
-
-    assertQuery("added:>2", change1);
-    assertQuery("-added:<=2", change1);
-
-    assertQuery("added:>=3", change1);
-    assertQuery("-added:<3", change1);
-
-    assertQuery("added:<1", change2);
-    assertQuery("-added:>=1", change2);
-
-    assertQuery("added:<=0", change2);
-    assertQuery("-added:>0", change2);
-
-    assertQuery("deleted:>3");
-    assertQuery("-deleted:<=3");
-
-    assertQuery("deleted:2", change2);
-    assertQuery("-(deleted:<2 OR deleted>2)", change2);
-
-    assertQuery("deleted:>1", change2);
-    assertQuery("-deleted:<=1", change2);
-
-    assertQuery("deleted:>=2", change2);
-    assertQuery("-deleted:<2", change2);
-
-    assertQuery("deleted:<1", change1);
-    assertQuery("-deleted:>=1", change1);
-
-    assertQuery("deleted:<=0", change1);
-
-    for (String str : Lists.newArrayList("delta:", "size:")) {
-      assertQuery(str + "<2");
-      assertQuery(str + "3", change1);
-      assertQuery(str + ">2", change1);
-      assertQuery(str + ">=3", change1);
-      assertQuery(str + "<3", change2);
-      assertQuery(str + "<=2", change2);
-    }
-  }
-
-  private List<Change> setUpHashtagChanges() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    Change change1 = insert(repo, newChange(repo));
-    Change change2 = insert(repo, newChange(repo));
-
-    HashtagsInput in = new HashtagsInput();
-    in.add = ImmutableSet.of("foo");
-    gApi.changes().id(change1.getId().get()).setHashtags(in);
-
-    in.add = ImmutableSet.of("foo", "bar", "a tag", "ACamelCaseTag");
-    gApi.changes().id(change2.getId().get()).setHashtags(in);
-
-    return ImmutableList.of(change1, change2);
-  }
-
-  @Test
-  public void byHashtagWithNoteDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-    List<Change> changes = setUpHashtagChanges();
-    assertQuery("hashtag:foo", changes.get(1), changes.get(0));
-    assertQuery("hashtag:bar", changes.get(1));
-    assertQuery("hashtag:\"a tag\"", changes.get(1));
-    assertQuery("hashtag:\"a tag \"", changes.get(1));
-    assertQuery("hashtag:\" a tag \"", changes.get(1));
-    assertQuery("hashtag:\"#a tag\"", changes.get(1));
-    assertQuery("hashtag:\"# #a tag\"", changes.get(1));
-    assertQuery("hashtag:acamelcasetag", changes.get(1));
-    assertQuery("hashtag:ACamelCaseTAg", changes.get(1));
-  }
-
-  @Test
-  public void byHashtagWithoutNoteDb() throws Exception {
-    assume().that(notesMigration.readChanges()).isFalse();
-
-    notesMigration.setWriteChanges(true);
-    notesMigration.setReadChanges(true);
-    db.close();
-    db = schemaFactory.open();
-    List<Change> changes;
-    try {
-      changes = setUpHashtagChanges();
-      notesMigration.setWriteChanges(false);
-      notesMigration.setReadChanges(false);
-    } finally {
-      db.close();
-    }
-    db = schemaFactory.open();
-    for (Change c : changes) {
-      indexer.index(db, c); // Reindex without hashtag field.
-    }
-    assertQuery("hashtag:foo");
-    assertQuery("hashtag:bar");
-    assertQuery("hashtag:\" bar \"");
-    assertQuery("hashtag:\"a tag\"");
-    assertQuery("hashtag:\" a tag \"");
-    assertQuery("hashtag:#foo");
-    assertQuery("hashtag:\"# #foo\"");
-  }
-
-  @Test
-  public void byDefault() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-
-    Change change1 = insert(repo, newChange(repo));
-
-    RevCommit commit2 = repo.parseBody(repo.commit().message("foosubject").create());
-    Change change2 = insert(repo, newChangeForCommit(repo, commit2));
-
-    RevCommit commit3 = repo.parseBody(repo.commit().add("Foo.java", "foo contents").create());
-    Change change3 = insert(repo, newChangeForCommit(repo, commit3));
-
-    ChangeInserter ins4 = newChange(repo);
-    Change change4 = insert(repo, ins4);
-    ReviewInput ri4 = new ReviewInput();
-    ri4.message = "toplevel";
-    ri4.labels = ImmutableMap.<String, Short>of("Code-Review", (short) 1);
-    gApi.changes().id(change4.getId().get()).current().review(ri4);
-
-    ChangeInserter ins5 = newChangeWithTopic(repo, "feature5");
-    Change change5 = insert(repo, ins5);
-
-    Change change6 = insert(repo, newChangeForBranch(repo, "branch6"));
-
-    assertQuery(change1.getId().get(), change1);
-    assertQuery(ChangeTriplet.format(change1), change1);
-    assertQuery("foosubject", change2);
-    assertQuery("Foo.java", change3);
-    assertQuery("Code-Review+1", change4);
-    assertQuery("toplevel", change4);
-    assertQuery("feature5", change5);
-    assertQuery("branch6", change6);
-    assertQuery("refs/heads/branch6", change6);
-
-    Change[] expected = new Change[] {change6, change5, change4, change3, change2, change1};
-    assertQuery("user@example.com", expected);
-    assertQuery("repo", expected);
-  }
-
-  @Test
-  public void byDefaultWithCommitPrefix() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    RevCommit commit = repo.parseBody(repo.commit().message("message").create());
-    Change change = insert(repo, newChangeForCommit(repo, commit));
-
-    assertQuery(commit.getId().getName().substring(0, 6), change);
-  }
-
-  @Test
-  public void visible() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    Change change1 = insert(repo, newChange(repo));
-    Change change2 = insert(repo, newChange(repo));
-
-    gApi.changes().id(change2.getChangeId()).setPrivate(true, "private");
-
-    String q = "project:repo";
-    assertQuery(q, change2, change1);
-
-    // Second user cannot see first user's private change.
-    Account.Id user2 =
-        accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId();
-    assertQuery(q + " visibleto:" + user2.get(), change1);
-
-    requestContext.setContext(
-        newRequestContext(
-            accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId()));
-    assertQuery("is:visible", change1);
-  }
-
-  @Test
-  public void byCommentBy() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    Change change1 = insert(repo, newChange(repo));
-    Change change2 = insert(repo, newChange(repo));
-
-    int user2 =
-        accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId().get();
-
-    ReviewInput input = new ReviewInput();
-    input.message = "toplevel";
-    ReviewInput.CommentInput comment = new ReviewInput.CommentInput();
-    comment.line = 1;
-    comment.message = "inline";
-    input.comments =
-        ImmutableMap.<String, List<ReviewInput.CommentInput>>of(
-            Patch.COMMIT_MSG, ImmutableList.<ReviewInput.CommentInput>of(comment));
-    gApi.changes().id(change1.getId().get()).current().review(input);
-
-    input = new ReviewInput();
-    input.message = "toplevel";
-    gApi.changes().id(change2.getId().get()).current().review(input);
-
-    assertQuery("commentby:" + userId.get(), change2, change1);
-    assertQuery("commentby:" + user2);
-  }
-
-  @Test
-  public void byDraftBy() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    Change change1 = insert(repo, newChange(repo));
-    Change change2 = insert(repo, newChange(repo));
-
-    assertQuery("has:draft");
-
-    DraftInput in = new DraftInput();
-    in.line = 1;
-    in.message = "nit: trailing whitespace";
-    in.path = Patch.COMMIT_MSG;
-    gApi.changes().id(change1.getId().get()).current().createDraft(in);
-
-    in = new DraftInput();
-    in.line = 2;
-    in.message = "nit: point in the end of the statement";
-    in.path = Patch.COMMIT_MSG;
-    gApi.changes().id(change2.getId().get()).current().createDraft(in);
-
-    int user2 =
-        accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId().get();
-
-    assertQuery("has:draft", change2, change1);
-    assertQuery("draftby:" + userId.get(), change2, change1);
-    assertQuery("draftby:" + user2);
-  }
-
-  @Test
-  public void byDraftByExcludesZombieDrafts() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    Project.NameKey project = new Project.NameKey("repo");
-    TestRepository<Repo> repo = createProject(project.get());
-    Change change = insert(repo, newChange(repo));
-    Change.Id id = change.getId();
-
-    DraftInput in = new DraftInput();
-    in.line = 1;
-    in.message = "nit: trailing whitespace";
-    in.path = Patch.COMMIT_MSG;
-    gApi.changes().id(id.get()).current().createDraft(in);
-
-    assertQuery("draftby:" + userId, change);
-    assertQuery("commentby:" + userId);
-
-    TestRepository<Repo> allUsers = new TestRepository<>(repoManager.openRepository(allUsersName));
-
-    Ref draftsRef = allUsers.getRepository().exactRef(RefNames.refsDraftComments(id, userId));
-    assertThat(draftsRef).isNotNull();
-
-    ReviewInput rin = ReviewInput.dislike();
-    rin.drafts = DraftHandling.PUBLISH_ALL_REVISIONS;
-    gApi.changes().id(id.get()).current().review(rin);
-
-    assertQuery("draftby:" + userId);
-    assertQuery("commentby:" + userId, change);
-    assertThat(allUsers.getRepository().exactRef(draftsRef.getName())).isNull();
-
-    // Re-add drafts ref and ensure it gets filtered out during indexing.
-    allUsers.update(draftsRef.getName(), draftsRef.getObjectId());
-    assertThat(allUsers.getRepository().exactRef(draftsRef.getName())).isNotNull();
-
-    if (PrimaryStorage.of(change) == PrimaryStorage.REVIEW_DB
-        && !notesMigration.disableChangeReviewDb()) {
-      // Record draft ref in noteDbState as well.
-      ReviewDb db = ReviewDbUtil.unwrapDb(this.db);
-      change = db.changes().get(id);
-      NoteDbChangeState.applyDelta(
-          change,
-          NoteDbChangeState.Delta.create(
-              id, Optional.empty(), ImmutableMap.of(userId, draftsRef.getObjectId())));
-      db.changes().update(Collections.singleton(change));
-    }
-
-    indexer.index(db, project, id);
-    assertQuery("draftby:" + userId);
-  }
-
-  @Test
-  public void byStarredBy() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    Change change1 = insert(repo, newChange(repo));
-    Change change2 = insert(repo, newChange(repo));
-    insert(repo, newChange(repo));
-
-    gApi.accounts().self().starChange(change1.getId().toString());
-    gApi.accounts().self().starChange(change2.getId().toString());
-
-    int user2 =
-        accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId().get();
-
-    assertQuery("starredby:self", change2, change1);
-    assertQuery("starredby:" + user2);
-  }
-
-  @Test
-  public void byStar() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    Change change1 = insert(repo, newChange(repo));
-    Change change2 = insert(repo, newChangeWithStatus(repo, Change.Status.MERGED));
-    Change change3 = insert(repo, newChangeWithStatus(repo, Change.Status.MERGED));
-    Change change4 = insert(repo, newChange(repo));
-
-    gApi.accounts()
-        .self()
-        .setStars(
-            change1.getId().toString(),
-            new StarsInput(new HashSet<>(Arrays.asList("red", "blue"))));
-    gApi.accounts()
-        .self()
-        .setStars(
-            change2.getId().toString(),
-            new StarsInput(
-                new HashSet<>(Arrays.asList(StarredChangesUtil.DEFAULT_LABEL, "green", "blue"))));
-
-    gApi.accounts()
-        .self()
-        .setStars(
-            change4.getId().toString(), new StarsInput(new HashSet<>(Arrays.asList("ignore"))));
-
-    // check labeled stars
-    assertQuery("star:red", change1);
-    assertQuery("star:blue", change2, change1);
-    assertQuery("has:stars", change4, change2, change1);
-
-    // check default star
-    assertQuery("has:star", change2);
-    assertQuery("is:starred", change2);
-    assertQuery("starredby:self", change2);
-    assertQuery("star:" + StarredChangesUtil.DEFAULT_LABEL, change2);
-
-    // check ignored
-    assertQuery("is:ignored", change4);
-    assertQuery("-is:ignored", change3, change2, change1);
-  }
-
-  @Test
-  public void byIgnore() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    Account.Id user2 =
-        accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId();
-    Change change1 = insert(repo, newChange(repo), user2);
-    Change change2 = insert(repo, newChange(repo), user2);
-
-    gApi.changes().id(change1.getId().toString()).ignore(true);
-    assertQuery("is:ignored", change1);
-    assertQuery("-is:ignored", change2);
-
-    gApi.changes().id(change1.getId().toString()).ignore(false);
-    assertQuery("is:ignored");
-    assertQuery("-is:ignored", change2, change1);
-  }
-
-  @Test
-  public void byFrom() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    Change change1 = insert(repo, newChange(repo));
-
-    Account.Id user2 =
-        accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId();
-    Change change2 = insert(repo, newChange(repo), user2);
-
-    ReviewInput input = new ReviewInput();
-    input.message = "toplevel";
-    ReviewInput.CommentInput comment = new ReviewInput.CommentInput();
-    comment.line = 1;
-    comment.message = "inline";
-    input.comments =
-        ImmutableMap.<String, List<ReviewInput.CommentInput>>of(
-            Patch.COMMIT_MSG, ImmutableList.<ReviewInput.CommentInput>of(comment));
-    gApi.changes().id(change2.getId().get()).current().review(input);
-
-    assertQuery("from:" + userId.get(), change2, change1);
-    assertQuery("from:" + user2, change2);
-  }
-
-  @Test
-  public void conflicts() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    RevCommit commit1 =
-        repo.parseBody(
-            repo.commit()
-                .add("file1", "contents1")
-                .add("dir/file2", "contents2")
-                .add("dir/file3", "contents3")
-                .create());
-    RevCommit commit2 = repo.parseBody(repo.commit().add("file1", "contents1").create());
-    RevCommit commit3 =
-        repo.parseBody(repo.commit().add("dir/file2", "contents2 different").create());
-    RevCommit commit4 = repo.parseBody(repo.commit().add("file4", "contents4").create());
-    Change change1 = insert(repo, newChangeForCommit(repo, commit1));
-    Change change2 = insert(repo, newChangeForCommit(repo, commit2));
-    Change change3 = insert(repo, newChangeForCommit(repo, commit3));
-    Change change4 = insert(repo, newChangeForCommit(repo, commit4));
-
-    assertQuery("conflicts:" + change1.getId().get(), change3);
-    assertQuery("conflicts:" + change2.getId().get());
-    assertQuery("conflicts:" + change3.getId().get(), change1);
-    assertQuery("conflicts:" + change4.getId().get());
-  }
-
-  @Test
-  public void mergeable() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    RevCommit commit1 = repo.parseBody(repo.commit().add("file1", "contents1").create());
-    RevCommit commit2 = repo.parseBody(repo.commit().add("file1", "contents2").create());
-    Change change1 = insert(repo, newChangeForCommit(repo, commit1));
-    Change change2 = insert(repo, newChangeForCommit(repo, commit2));
-
-    assertQuery("conflicts:" + change1.getId().get(), change2);
-    assertQuery("conflicts:" + change2.getId().get(), change1);
-    assertQuery("is:mergeable", change2, change1);
-
-    gApi.changes().id(change1.getChangeId()).revision("current").review(ReviewInput.approve());
-    gApi.changes().id(change1.getChangeId()).revision("current").submit();
-
-    assertQuery("status:open conflicts:" + change2.getId().get());
-    assertQuery("status:open is:mergeable");
-    assertQuery("status:open -is:mergeable", change2);
-  }
-
-  @Test
-  public void reviewedBy() throws Exception {
-    resetTimeWithClockStep(2, MINUTES);
-    TestRepository<Repo> repo = createProject("repo");
-    Change change1 = insert(repo, newChange(repo));
-    Change change2 = insert(repo, newChange(repo));
-    Change change3 = insert(repo, newChange(repo));
-
-    gApi.changes().id(change1.getId().get()).current().review(new ReviewInput().message("comment"));
-
-    Account.Id user2 =
-        accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId();
-    requestContext.setContext(newRequestContext(user2));
-
-    gApi.changes().id(change2.getId().get()).current().review(new ReviewInput().message("comment"));
-
-    PatchSet.Id ps3_1 = change3.currentPatchSetId();
-    change3 = newPatchSet(repo, change3);
-    assertThat(change3.currentPatchSetId()).isNotEqualTo(ps3_1);
-    // Response to previous patch set still counts as reviewing.
-    gApi.changes()
-        .id(change3.getId().get())
-        .revision(ps3_1.get())
-        .review(new ReviewInput().message("comment"));
-
-    List<ChangeInfo> actual;
-    actual = assertQuery(newQuery("is:reviewed").withOption(REVIEWED), change3, change2);
-    assertThat(actual.get(0).reviewed).isTrue();
-    assertThat(actual.get(1).reviewed).isTrue();
-
-    actual = assertQuery(newQuery("-is:reviewed").withOption(REVIEWED), change1);
-    assertThat(actual.get(0).reviewed).isNull();
-
-    actual = assertQuery("reviewedby:" + userId.get());
-
-    actual =
-        assertQuery(newQuery("reviewedby:" + user2.get()).withOption(REVIEWED), change3, change2);
-    assertThat(actual.get(0).reviewed).isTrue();
-    assertThat(actual.get(1).reviewed).isTrue();
-  }
-
-  @Test
-  public void reviewerAndCc() throws Exception {
-    Account.Id user1 = createAccount("user1");
-    TestRepository<Repo> repo = createProject("repo");
-    Change change1 = insert(repo, newChange(repo));
-    Change change2 = insert(repo, newChange(repo));
-    Change change3 = insert(repo, newChange(repo));
-    insert(repo, newChange(repo));
-
-    AddReviewerInput rin = new AddReviewerInput();
-    rin.reviewer = user1.toString();
-    rin.state = ReviewerState.REVIEWER;
-    gApi.changes().id(change1.getId().get()).addReviewer(rin);
-
-    rin = new AddReviewerInput();
-    rin.reviewer = user1.toString();
-    rin.state = ReviewerState.CC;
-    gApi.changes().id(change2.getId().get()).addReviewer(rin);
-
-    assertQuery("is:reviewer");
-    assertQuery("reviewer:self");
-    gApi.changes().id(change3.getChangeId()).revision("current").review(ReviewInput.recommend());
-    assertQuery("is:reviewer", change3);
-    assertQuery("reviewer:self", change3);
-
-    requestContext.setContext(newRequestContext(user1));
-    if (notesMigration.readChanges()) {
-      assertQuery("reviewer:" + user1, change1);
-      assertQuery("cc:" + user1, change2);
-      assertQuery("is:cc", change2);
-      assertQuery("cc:self", change2);
-    } else {
-      assertQuery("reviewer:" + user1, change2, change1);
-      assertQuery("cc:" + user1);
-      assertQuery("is:cc");
-      assertQuery("cc:self");
-    }
-  }
-
-  @Test
-  public void byReviewed() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    Account.Id otherUser =
-        accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId();
-    Change change1 = insert(repo, newChange(repo));
-    Change change2 = insert(repo, newChange(repo));
-
-    assertQuery("is:reviewed");
-    assertQuery("status:reviewed");
-    assertQuery("-is:reviewed", change2, change1);
-    assertQuery("-status:reviewed", change2, change1);
-
-    requestContext.setContext(newRequestContext(otherUser));
-    gApi.changes().id(change1.getChangeId()).current().review(ReviewInput.recommend());
-
-    assertQuery("is:reviewed", change1);
-    assertQuery("status:reviewed", change1);
-    assertQuery("-is:reviewed", change2);
-    assertQuery("-status:reviewed", change2);
-  }
-
-  @Test
-  public void reviewerin() throws Exception {
-    Account.Id user1 = accountManager.authenticate(AuthRequest.forUser("user1")).getAccountId();
-    Account.Id user2 = accountManager.authenticate(AuthRequest.forUser("user2")).getAccountId();
-    Account.Id user3 = accountManager.authenticate(AuthRequest.forUser("user3")).getAccountId();
-    TestRepository<Repo> repo = createProject("repo");
-
-    Change change1 = insert(repo, newChange(repo));
-    Change change2 = insert(repo, newChange(repo));
-    Change change3 = insert(repo, newChange(repo));
-
-    AddReviewerInput rin = new AddReviewerInput();
-    rin.reviewer = user1.toString();
-    rin.state = ReviewerState.REVIEWER;
-    gApi.changes().id(change1.getId().get()).addReviewer(rin);
-
-    rin = new AddReviewerInput();
-    rin.reviewer = user2.toString();
-    rin.state = ReviewerState.REVIEWER;
-    gApi.changes().id(change2.getId().get()).addReviewer(rin);
-
-    rin = new AddReviewerInput();
-    rin.reviewer = user3.toString();
-    rin.state = ReviewerState.CC;
-    gApi.changes().id(change3.getId().get()).addReviewer(rin);
-
-    String group = gApi.groups().create("foo").get().name;
-    gApi.groups().id(group).addMembers(user2.toString(), user3.toString());
-
-    List<String> members =
-        gApi.groups().id(group).members().stream()
-            .map(a -> a._accountId.toString())
-            .collect(toList());
-    assertThat(members).contains(user2.toString());
-
-    if (notesMigration.readChanges()) {
-      // CC and REVIEWER are separate in NoteDB
-      assertQuery("reviewerin:\"Registered Users\"", change2, change1);
-      assertQuery("reviewerin:" + group, change2);
-    } else {
-      // CC and REVIEWER are the same in ReviewDb
-      assertQuery("reviewerin:\"Registered Users\"", change3, change2, change1);
-      assertQuery("reviewerin:" + group, change3, change2);
-    }
-
-    gApi.changes().id(change2.getId().get()).current().review(ReviewInput.approve());
-    gApi.changes().id(change2.getId().get()).current().submit();
-
-    if (notesMigration.readChanges()) {
-      // CC and REVIEWER are separate in NoteDB
-      assertQuery("reviewerin:" + group);
-      assertQuery("project:repo reviewerin:" + group, change2);
-      assertQuery("status:merged reviewerin:" + group, change2);
-    } else {
-      // CC and REVIEWER are the same in ReviewDb
-      assertQuery("reviewerin:" + group, change3);
-      assertQuery("project:repo reviewerin:" + group, change2, change3);
-      assertQuery("status:merged reviewerin:" + group, change2);
-    }
-  }
-
-  @Test
-  public void reviewerAndCcByEmail() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    Project.NameKey project = new Project.NameKey("repo");
-    TestRepository<Repo> repo = createProject(project.get());
-    ConfigInput conf = new ConfigInput();
-    conf.enableReviewerByEmail = InheritableBoolean.TRUE;
-    gApi.projects().name(project.get()).config(conf);
-
-    String userByEmail = "un.registered@reviewer.com";
-    String userByEmailWithName = "John Doe <" + userByEmail + ">";
-
-    Change change1 = insert(repo, newChange(repo));
-    Change change2 = insert(repo, newChange(repo));
-    insert(repo, newChange(repo));
-
-    AddReviewerInput rin = new AddReviewerInput();
-    rin.reviewer = userByEmailWithName;
-    rin.state = ReviewerState.REVIEWER;
-    gApi.changes().id(change1.getId().get()).addReviewer(rin);
-
-    rin = new AddReviewerInput();
-    rin.reviewer = userByEmailWithName;
-    rin.state = ReviewerState.CC;
-    gApi.changes().id(change2.getId().get()).addReviewer(rin);
-
-    if (getSchemaVersion() >= 41) {
-      assertQuery("reviewer:\"" + userByEmailWithName + "\"", change1);
-      assertQuery("cc:\"" + userByEmailWithName + "\"", change2);
-
-      // Omitting the name:
-      assertQuery("reviewer:\"" + userByEmail + "\"", change1);
-      assertQuery("cc:\"" + userByEmail + "\"", change2);
-    } else {
-      assertMissingField(ChangeField.REVIEWER_BY_EMAIL);
-
-      assertFailingQuery(
-          "reviewer:\"" + userByEmailWithName + "\"", "User " + userByEmailWithName + " not found");
-      assertFailingQuery(
-          "cc:\"" + userByEmailWithName + "\"", "User " + userByEmailWithName + " not found");
-
-      // Omitting the name:
-      assertFailingQuery("reviewer:\"" + userByEmail + "\"", "User " + userByEmail + " not found");
-      assertFailingQuery("cc:\"" + userByEmail + "\"", "User " + userByEmail + " not found");
-    }
-  }
-
-  @Test
-  public void reviewerAndCcByEmailWithQueryForDifferentUser() throws Exception {
-    assume().that(notesMigration.readChanges()).isTrue();
-
-    Project.NameKey project = new Project.NameKey("repo");
-    TestRepository<Repo> repo = createProject(project.get());
-    ConfigInput conf = new ConfigInput();
-    conf.enableReviewerByEmail = InheritableBoolean.TRUE;
-    gApi.projects().name(project.get()).config(conf);
-
-    String userByEmail = "John Doe <un.registered@reviewer.com>";
-
-    Change change1 = insert(repo, newChange(repo));
-    Change change2 = insert(repo, newChange(repo));
-    insert(repo, newChange(repo));
-
-    AddReviewerInput rin = new AddReviewerInput();
-    rin.reviewer = userByEmail;
-    rin.state = ReviewerState.REVIEWER;
-    gApi.changes().id(change1.getId().get()).addReviewer(rin);
-
-    rin = new AddReviewerInput();
-    rin.reviewer = userByEmail;
-    rin.state = ReviewerState.CC;
-    gApi.changes().id(change2.getId().get()).addReviewer(rin);
-
-    if (getSchemaVersion() >= 41) {
-      assertQuery("reviewer:\"someone@example.com\"");
-      assertQuery("cc:\"someone@example.com\"");
-    } else {
-      assertMissingField(ChangeField.REVIEWER_BY_EMAIL);
-
-      String someoneEmail = "someone@example.com";
-      assertFailingQuery(
-          "reviewer:\"" + someoneEmail + "\"", "User " + someoneEmail + " not found");
-      assertFailingQuery("cc:\"" + someoneEmail + "\"", "User " + someoneEmail + " not found");
-    }
-  }
-
-  @Test
-  public void submitRecords() throws Exception {
-    Account.Id user1 = createAccount("user1");
-    TestRepository<Repo> repo = createProject("repo");
-    Change change1 = insert(repo, newChange(repo));
-    Change change2 = insert(repo, newChange(repo));
-
-    gApi.changes().id(change1.getId().get()).current().review(ReviewInput.approve());
-    requestContext.setContext(newRequestContext(user1));
-    gApi.changes().id(change2.getId().get()).current().review(ReviewInput.recommend());
-    requestContext.setContext(newRequestContext(user.getAccountId()));
-
-    assertQuery("is:submittable", change1);
-    assertQuery("-is:submittable", change2);
-    assertQuery("submittable:ok", change1);
-    assertQuery("submittable:not_ready", change2);
-
-    assertQuery("label:CodE-RevieW=ok", change1);
-    assertQuery("label:CodE-RevieW=ok,user=user", change1);
-    assertQuery("label:CodE-RevieW=ok,Administrators", change1);
-    assertQuery("label:CodE-RevieW=ok,group=Administrators", change1);
-    assertQuery("label:CodE-RevieW=ok,owner", change1);
-    assertQuery("label:CodE-RevieW=ok,user1");
-    assertQuery("label:CodE-RevieW=need", change2);
-    // NEED records don't have associated users.
-    assertQuery("label:CodE-RevieW=need,user1");
-    assertQuery("label:CodE-RevieW=need,user");
-
-    gApi.changes().id(change1.getId().get()).current().submit();
-    assertQuery("submittable:ok");
-    assertQuery("submittable:closed", change1);
-  }
-
-  @Test
-  public void hasEdit() throws Exception {
-    Account.Id user1 = createAccount("user1");
-    Account.Id user2 = createAccount("user2");
-    TestRepository<Repo> repo = createProject("repo");
-    Change change1 = insert(repo, newChange(repo));
-    String changeId1 = change1.getKey().get();
-    Change change2 = insert(repo, newChange(repo));
-    String changeId2 = change2.getKey().get();
-
-    requestContext.setContext(newRequestContext(user1));
-    assertQuery("has:edit");
-    gApi.changes().id(changeId1).edit().create();
-    gApi.changes().id(changeId2).edit().create();
-
-    requestContext.setContext(newRequestContext(user2));
-    assertQuery("has:edit");
-    gApi.changes().id(changeId2).edit().create();
-
-    requestContext.setContext(newRequestContext(user1));
-    assertQuery("has:edit", change2, change1);
-
-    requestContext.setContext(newRequestContext(user2));
-    assertQuery("has:edit", change2);
-  }
-
-  @Test
-  public void byUnresolved() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    Change change1 = insert(repo, newChange(repo));
-    Change change2 = insert(repo, newChange(repo));
-    Change change3 = insert(repo, newChange(repo));
-
-    // Change1 has one resolved comment (unresolvedcount = 0)
-    // Change2 has one unresolved comment (unresolvedcount = 1)
-    // Change3 has one resolved comment and one unresolved comment (unresolvedcount = 1)
-    addComment(change1.getChangeId(), "comment 1", false);
-    addComment(change2.getChangeId(), "comment 2", true);
-    addComment(change3.getChangeId(), "comment 3", false);
-    addComment(change3.getChangeId(), "comment 4", true);
-
-    assertQuery("has:unresolved", change3, change2);
-
-    assertQuery("unresolved:0", change1);
-    List<ChangeInfo> changeInfos = assertQuery("unresolved:>=0", change3, change2, change1);
-    assertThat(changeInfos.get(0).unresolvedCommentCount).isEqualTo(1); // Change3
-    assertThat(changeInfos.get(1).unresolvedCommentCount).isEqualTo(1); // Change2
-    assertThat(changeInfos.get(2).unresolvedCommentCount).isEqualTo(0); // Change1
-    assertQuery("unresolved:>0", change3, change2);
-
-    assertQuery("unresolved:<1", change1);
-    assertQuery("unresolved:<=1", change3, change2, change1);
-    assertQuery("unresolved:1", change3, change2);
-    assertQuery("unresolved:>1");
-    assertQuery("unresolved:>=1", change3, change2);
-  }
-
-  @Test
-  public void byCommitsOnBranchNotMerged() throws Exception {
-    TestRepository<Repo> tr = createProject("repo");
-    testByCommitsOnBranchNotMerged(tr, ImmutableSet.of());
-  }
-
-  @Test
-  public void byCommitsOnBranchNotMergedSkipsMissingChanges() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    ObjectId missing =
-        repo.branch(new PatchSet.Id(new Change.Id(987654), 1).toRefName())
-            .commit()
-            .message("No change for this commit")
-            .insertChangeId()
-            .create()
-            .copy();
-    testByCommitsOnBranchNotMerged(repo, ImmutableSet.of(missing));
-  }
-
-  private void testByCommitsOnBranchNotMerged(TestRepository<Repo> repo, Collection<ObjectId> extra)
-      throws Exception {
-    int n = 10;
-    List<String> shas = new ArrayList<>(n + extra.size());
-    extra.forEach(i -> shas.add(i.name()));
-    List<Integer> expectedIds = new ArrayList<>(n);
-    Branch.NameKey dest = null;
-    for (int i = 0; i < n; i++) {
-      ChangeInserter ins = newChange(repo);
-      insert(repo, ins);
-      if (dest == null) {
-        dest = ins.getChange().getDest();
-      }
-      shas.add(ins.getCommitId().name());
-      expectedIds.add(ins.getChange().getId().get());
-    }
-
-    for (int i = 1; i <= 11; i++) {
-      Iterable<ChangeData> cds =
-          queryProvider.get().byCommitsOnBranchNotMerged(repo.getRepository(), db, dest, shas, i);
-      Iterable<Integer> ids = FluentIterable.from(cds).transform(in -> in.getId().get());
-      String name = "limit " + i;
-      assertThat(ids).named(name).hasSize(n);
-      assertThat(ids).named(name).containsExactlyElementsIn(expectedIds);
-    }
-  }
-
-  @Test
-  public void prepopulatedFields() throws Exception {
-    assume().that(notesMigration.readChanges()).isFalse();
-    TestRepository<Repo> repo = createProject("repo");
-    Change change = insert(repo, newChange(repo));
-
-    db = new DisabledReviewDb();
-    requestContext.setContext(newRequestContext(userId));
-    // Use QueryProcessor directly instead of API so we get ChangeDatas back.
-    List<ChangeData> cds =
-        queryProcessorProvider
-            .get()
-            .query(queryBuilder.parse(change.getId().toString()))
-            .entities();
-    assertThat(cds).hasSize(1);
-
-    ChangeData cd = cds.get(0);
-    cd.change();
-    cd.patchSets();
-    cd.currentApprovals();
-    cd.changedLines();
-    cd.reviewedBy();
-    cd.reviewers();
-    cd.unresolvedCommentCount();
-
-    // TODO(dborowitz): Swap out GitRepositoryManager somehow? Will probably be
-    // necessary for NoteDb anyway.
-    cd.isMergeable();
-
-    exception.expect(DisabledReviewDb.Disabled.class);
-    cd.messages();
-  }
-
-  @Test
-  public void prepopulateOnlyRequestedFields() throws Exception {
-    assume().that(notesMigration.readChanges()).isFalse();
-    TestRepository<Repo> repo = createProject("repo");
-    Change change = insert(repo, newChange(repo));
-
-    db = new DisabledReviewDb();
-    requestContext.setContext(newRequestContext(userId));
-    // Use QueryProcessor directly instead of API so we get ChangeDatas back.
-    List<ChangeData> cds =
-        queryProcessorProvider
-            .get()
-            .setRequestedFields(
-                ImmutableSet.of(ChangeField.PATCH_SET.getName(), ChangeField.CHANGE.getName()))
-            .query(queryBuilder.parse(change.getId().toString()))
-            .entities();
-    assertThat(cds).hasSize(1);
-
-    ChangeData cd = cds.get(0);
-    cd.change();
-    cd.patchSets();
-
-    exception.expect(DisabledReviewDb.Disabled.class);
-    cd.currentApprovals();
-  }
-
-  @Test
-  public void reindexIfStale() throws Exception {
-    Account.Id user = createAccount("user");
-    Project.NameKey project = new Project.NameKey("repo");
-    TestRepository<Repo> repo = createProject(project.get());
-    Change change = insert(repo, newChange(repo));
-    String changeId = change.getKey().get();
-    ChangeNotes notes = notesFactory.create(db, change.getProject(), change.getId());
-    PatchSet ps = psUtil.get(db, notes, change.currentPatchSetId());
-
-    requestContext.setContext(newRequestContext(user));
-    gApi.changes().id(changeId).edit().create();
-    assertQuery("has:edit", change);
-    assertThat(indexer.reindexIfStale(project, change.getId()).get()).isFalse();
-
-    // Delete edit ref behind index's back.
-    RefUpdate ru =
-        repo.getRepository().updateRef(RefNames.refsEdit(user, change.getId(), ps.getId()));
-    ru.setForceUpdate(true);
-    assertThat(ru.delete()).isEqualTo(RefUpdate.Result.FORCED);
-
-    // Index is stale.
-    assertQuery("has:edit", change);
-    assertThat(indexer.reindexIfStale(project, change.getId()).get()).isTrue();
-    assertQuery("has:edit");
-  }
-
-  @Test
-  public void refStateFields() throws Exception {
-    // This test method manages primary storage manually.
-    assume().that(notesMigration.changePrimaryStorage()).isEqualTo(PrimaryStorage.REVIEW_DB);
-    Account.Id user = createAccount("user");
-    Project.NameKey project = new Project.NameKey("repo");
-    TestRepository<Repo> repo = createProject(project.get());
-    String path = "file";
-    RevCommit commit = repo.parseBody(repo.commit().message("one").add(path, "contents").create());
-    Change change = insert(repo, newChangeForCommit(repo, commit));
-    Change.Id id = change.getId();
-    int c = id.get();
-    String changeId = change.getKey().get();
-    requestContext.setContext(newRequestContext(user));
-
-    // Ensure one of each type of supported ref is present for the change. If
-    // any more refs are added, update this test to reflect them.
-
-    // Edit
-    gApi.changes().id(changeId).edit().create();
-
-    // Star
-    gApi.accounts().self().starChange(change.getId().toString());
-
-    if (notesMigration.readChanges()) {
-      // Robot comment.
-      ReviewInput rin = new ReviewInput();
-      RobotCommentInput rcin = new RobotCommentInput();
-      rcin.robotId = "happyRobot";
-      rcin.robotRunId = "1";
-      rcin.line = 1;
-      rcin.message = "nit: trailing whitespace";
-      rcin.path = path;
-      rin.robotComments = ImmutableMap.of(path, ImmutableList.of(rcin));
-      gApi.changes().id(c).current().review(rin);
-    }
-
-    // Draft.
-    DraftInput din = new DraftInput();
-    din.path = path;
-    din.line = 1;
-    din.message = "draft";
-    gApi.changes().id(c).current().createDraft(din);
-
-    if (notesMigration.readChanges()) {
-      // Force NoteDb primary.
-      change = ReviewDbUtil.unwrapDb(db).changes().get(id);
-      change.setNoteDbState(NoteDbChangeState.NOTE_DB_PRIMARY_STATE);
-      ReviewDbUtil.unwrapDb(db).changes().update(Collections.singleton(change));
-      indexer.index(db, change);
-    }
-
-    QueryOptions opts =
-        IndexedChangeQuery.createOptions(indexConfig, 0, 1, StalenessChecker.FIELDS);
-    ChangeData cd = indexes.getSearchIndex().get(id, opts).get();
-
-    String cs = RefNames.shard(c);
-    int u = user.get();
-    String us = RefNames.shard(u);
-
-    List<String> expectedStates =
-        Lists.newArrayList(
-            "repo:refs/users/" + us + "/edit-" + c + "/1",
-            "All-Users:refs/starred-changes/" + cs + "/" + u);
-    if (notesMigration.readChanges()) {
-      expectedStates.add("repo:refs/changes/" + cs + "/meta");
-      expectedStates.add("repo:refs/changes/" + cs + "/robot-comments");
-      expectedStates.add("All-Users:refs/draft-comments/" + cs + "/" + u);
-    }
-    assertThat(
-            cd.getRefStates().stream()
-                .map(String::new)
-                // Omit SHA-1, we're just concerned with the project/ref names.
-                .map(s -> s.substring(0, s.lastIndexOf(':')))
-                .collect(toList()))
-        .containsExactlyElementsIn(expectedStates);
-
-    List<String> expectedPatterns = Lists.newArrayList("repo:refs/users/*/edit-" + c + "/*");
-    expectedPatterns.add("All-Users:refs/starred-changes/" + cs + "/*");
-    if (notesMigration.readChanges()) {
-      expectedPatterns.add("All-Users:refs/draft-comments/" + cs + "/*");
-    }
-    assertThat(cd.getRefStatePatterns().stream().map(String::new).collect(toList()))
-        .containsExactlyElementsIn(expectedPatterns);
-  }
-
-  @Test
-  public void watched() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    ChangeInserter ins1 = newChangeWithStatus(repo, Change.Status.NEW);
-    Change change1 = insert(repo, ins1);
-
-    TestRepository<Repo> repo2 = createProject("repo2");
-
-    ChangeInserter ins2 = newChangeWithStatus(repo2, Change.Status.NEW);
-    insert(repo2, ins2);
-
-    assertQuery("is:watched");
-    assertQuery("watchedby:self");
-
-    List<ProjectWatchInfo> projectsToWatch = new ArrayList<>();
-    ProjectWatchInfo pwi = new ProjectWatchInfo();
-    pwi.project = "repo";
-    pwi.filter = null;
-    pwi.notifyAbandonedChanges = true;
-    pwi.notifyNewChanges = true;
-    pwi.notifyAllComments = true;
-    projectsToWatch.add(pwi);
-    gApi.accounts().self().setWatchedProjects(projectsToWatch);
-
-    assertQuery("is:watched", change1);
-    assertQuery("watchedby:self", change1);
-  }
-
-  @Test
-  public void trackingid() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    RevCommit commit1 =
-        repo.parseBody(repo.commit().message("Change one\n\nBug:QUERY123").create());
-    Change change1 = insert(repo, newChangeForCommit(repo, commit1));
-    RevCommit commit2 =
-        repo.parseBody(repo.commit().message("Change two\n\nFeature:QUERY456").create());
-    Change change2 = insert(repo, newChangeForCommit(repo, commit2));
-
-    assertQuery("tr:QUERY123", change1);
-    assertQuery("bug:QUERY123", change1);
-    assertQuery("tr:QUERY456", change2);
-    assertQuery("bug:QUERY456", change2);
-    assertQuery("tr:QUERY-123");
-    assertQuery("bug:QUERY-123");
-    assertQuery("tr:QUERY12");
-    assertQuery("bug:QUERY12");
-    assertQuery("tr:QUERY789");
-    assertQuery("bug:QUERY789");
-  }
-
-  @Test
-  public void selfAndMe() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    Change change1 = insert(repo, newChange(repo));
-    Change change2 = insert(repo, newChange(repo), userId);
-    insert(repo, newChange(repo));
-    gApi.accounts().self().starChange(change1.getId().toString());
-    gApi.accounts().self().starChange(change2.getId().toString());
-
-    assertQuery("starredby:self", change2, change1);
-    assertQuery("starredby:me", change2, change1);
-  }
-
-  @Test
-  public void defaultFieldWithManyUsers() throws Exception {
-    for (int i = 0; i < ChangeQueryBuilder.MAX_ACCOUNTS_PER_DEFAULT_FIELD * 2; i++) {
-      createAccount("user" + i, "User " + i, "user" + i + "@example.com", true);
-    }
-    assertQuery("us");
-  }
-
-  @Test
-  public void revertOf() throws Exception {
-    if (getSchemaVersion() < 45) {
-      assertMissingField(ChangeField.REVERT_OF);
-      assertFailingQuery(
-          "revertof:1", "'revertof' operator is not supported by change index version");
-      return;
-    }
-
-    TestRepository<Repo> repo = createProject("repo");
-    // Create two commits and revert second commit (initial commit can't be reverted)
-    Change initial = insert(repo, newChange(repo));
-    gApi.changes().id(initial.getChangeId()).current().review(ReviewInput.approve());
-    gApi.changes().id(initial.getChangeId()).current().submit();
-
-    ChangeInfo changeToRevert =
-        gApi.changes().create(new ChangeInput("repo", "master", "commit to revert")).get();
-    gApi.changes().id(changeToRevert.id).current().review(ReviewInput.approve());
-    gApi.changes().id(changeToRevert.id).current().submit();
-
-    ChangeInfo changeThatReverts = gApi.changes().id(changeToRevert.id).revert().get();
-    assertQueryByIds(
-        "revertof:" + changeToRevert._number, new Change.Id(changeThatReverts._number));
-  }
-
-  @Test
-  public void assignee() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    Change change1 = insert(repo, newChange(repo));
-    Change change2 = insert(repo, newChange(repo));
-
-    AssigneeInput input = new AssigneeInput();
-    input.assignee = user.getUserName();
-    gApi.changes().id(change1.getChangeId()).setAssignee(input);
-
-    assertQuery("is:assigned", change1);
-    assertQuery("-is:assigned", change2);
-    assertQuery("is:unassigned", change2);
-    assertQuery("-is:unassigned", change1);
-    assertQuery("assignee:" + user.getUserName(), change1);
-    assertQuery("-assignee:" + user.getUserName(), change2);
-  }
-
-  @Test
-  public void userDestination() throws Exception {
-    TestRepository<Repo> repo1 = createProject("repo1");
-    Change change1 = insert(repo1, newChange(repo1));
-    TestRepository<Repo> repo2 = createProject("repo2");
-    Change change2 = insert(repo2, newChange(repo2));
-
-    assertThatQueryException("destination:foo")
-        .hasMessageThat()
-        .isEqualTo("Unknown named destination: foo");
-
-    String destination1 = "refs/heads/master\trepo1";
-    String destination2 = "refs/heads/master\trepo2";
-    String destination3 = "refs/heads/master\trepo1\nrefs/heads/master\trepo2";
-    String destination4 = "refs/heads/master\trepo3";
-    String destination5 = "refs/heads/other\trepo1";
-
-    TestRepository<Repo> allUsers = new TestRepository<>(repoManager.openRepository(allUsersName));
-    String refsUsers = RefNames.refsUsers(userId);
-    allUsers.branch(refsUsers).commit().add("destinations/destination1", destination1).create();
-    allUsers.branch(refsUsers).commit().add("destinations/destination2", destination2).create();
-    allUsers.branch(refsUsers).commit().add("destinations/destination3", destination3).create();
-    allUsers.branch(refsUsers).commit().add("destinations/destination4", destination4).create();
-    allUsers.branch(refsUsers).commit().add("destinations/destination5", destination5).create();
-
-    Ref userRef = allUsers.getRepository().exactRef(refsUsers);
-    assertThat(userRef).isNotNull();
-
-    assertQuery("destination:destination1", change1);
-    assertQuery("destination:destination2", change2);
-    assertQuery("destination:destination3", change2, change1);
-    assertQuery("destination:destination4");
-    assertQuery("destination:destination5");
-  }
-
-  @Test
-  public void userQuery() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    Change change1 = insert(repo, newChange(repo));
-    Change change2 = insert(repo, newChangeForBranch(repo, "stable"));
-
-    String queries =
-        "query1\tproject:repo\n"
-            + "query2\tproject:repo status:open\n"
-            + "query3\tproject:repo branch:stable\n"
-            + "query4\tproject:repo branch:other";
-
-    TestRepository<Repo> allUsers = new TestRepository<>(repoManager.openRepository(allUsersName));
-    String refsUsers = RefNames.refsUsers(userId);
-    allUsers.branch(refsUsers).commit().add("queries", queries).create();
-
-    Ref userRef = allUsers.getRepository().exactRef(refsUsers);
-    assertThat(userRef).isNotNull();
-
-    assertThatQueryException("query:foo").hasMessageThat().isEqualTo("Unknown named query: foo");
-
-    assertQuery("query:query1", change2, change1);
-    assertQuery("query:query2", change2, change1);
-    gApi.changes().id(change1.getChangeId()).revision("current").review(ReviewInput.approve());
-    gApi.changes().id(change1.getChangeId()).revision("current").submit();
-    assertQuery("query:query2", change2);
-    assertQuery("query:query3", change2);
-    assertQuery("query:query4");
-  }
-
-  @Test
-  public void byOwnerInvalidQuery() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    insert(repo, newChange(repo), userId);
-    String nameEmail = user.asIdentifiedUser().getNameEmail();
-    assertQuery("owner: \"" + nameEmail + "\"\\");
-  }
-
-  @Test
-  public void byDeletedChange() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    Change change = insert(repo, newChange(repo));
-
-    String query = "change:" + change.getId();
-    assertQuery(query, change);
-
-    gApi.changes().id(change.getChangeId()).delete();
-    assertQuery(query);
-  }
-
-  @Test
-  public void byUrlEncodedProject() throws Exception {
-    TestRepository<Repo> repo = createProject("repo+foo");
-    Change change = insert(repo, newChange(repo));
-    assertQuery("project:repo+foo", change);
-  }
-
-  protected ChangeInserter newChange(TestRepository<Repo> repo) throws Exception {
-    return newChange(repo, null, null, null, null, false);
-  }
-
-  protected ChangeInserter newChangeForCommit(TestRepository<Repo> repo, RevCommit commit)
-      throws Exception {
-    return newChange(repo, commit, null, null, null, false);
-  }
-
-  protected ChangeInserter newChangeForBranch(TestRepository<Repo> repo, String branch)
-      throws Exception {
-    return newChange(repo, null, branch, null, null, false);
-  }
-
-  protected ChangeInserter newChangeWithStatus(TestRepository<Repo> repo, Change.Status status)
-      throws Exception {
-    return newChange(repo, null, null, status, null, false);
-  }
-
-  protected ChangeInserter newChangeWithTopic(TestRepository<Repo> repo, String topic)
-      throws Exception {
-    return newChange(repo, null, null, null, topic, false);
-  }
-
-  protected ChangeInserter newChangeWorkInProgress(TestRepository<Repo> repo) throws Exception {
-    return newChange(repo, null, null, null, null, true);
-  }
-
-  protected ChangeInserter newChange(
-      TestRepository<Repo> repo,
-      @Nullable RevCommit commit,
-      @Nullable String branch,
-      @Nullable Change.Status status,
-      @Nullable String topic,
-      boolean workInProgress)
-      throws Exception {
-    if (commit == null) {
-      commit = repo.parseBody(repo.commit().message("message").create());
-    }
-
-    branch = MoreObjects.firstNonNull(branch, "refs/heads/master");
-    if (!branch.startsWith("refs/heads/")) {
-      branch = "refs/heads/" + branch;
-    }
-
-    Change.Id id = new Change.Id(seq.nextChangeId());
-    ChangeInserter ins =
-        changeFactory
-            .create(id, commit, branch)
-            .setValidate(false)
-            .setStatus(status)
-            .setTopic(topic)
-            .setWorkInProgress(workInProgress);
-    return ins;
-  }
-
-  protected Change insert(TestRepository<Repo> repo, ChangeInserter ins) throws Exception {
-    return insert(repo, ins, null, TimeUtil.nowTs());
-  }
-
-  protected Change insert(TestRepository<Repo> repo, ChangeInserter ins, @Nullable Account.Id owner)
-      throws Exception {
-    return insert(repo, ins, owner, TimeUtil.nowTs());
-  }
-
-  protected Change insert(
-      TestRepository<Repo> repo,
-      ChangeInserter ins,
-      @Nullable Account.Id owner,
-      Timestamp createdOn)
-      throws Exception {
-    Project.NameKey project =
-        new Project.NameKey(repo.getRepository().getDescription().getRepositoryName());
-    Account.Id ownerId = owner != null ? owner : userId;
-    IdentifiedUser user = userFactory.create(ownerId);
-    try (BatchUpdate bu = updateFactory.create(db, project, user, createdOn)) {
-      bu.insertChange(ins);
-      bu.execute();
-      return ins.getChange();
-    }
-  }
-
-  protected Change newPatchSet(TestRepository<Repo> repo, Change c) throws Exception {
-    // Add a new file so the patch set is not a trivial rebase, to avoid default
-    // Code-Review label copying.
-    int n = c.currentPatchSetId().get() + 1;
-    RevCommit commit =
-        repo.parseBody(repo.commit().message("message").add("file" + n, "contents " + n).create());
-
-    PatchSetInserter inserter =
-        patchSetFactory
-            .create(changeNotesFactory.createChecked(db, c), new PatchSet.Id(c.getId(), n), commit)
-            .setNotify(NotifyHandling.NONE)
-            .setFireRevisionCreated(false)
-            .setValidate(false);
-    try (BatchUpdate bu = updateFactory.create(db, c.getProject(), user, TimeUtil.nowTs());
-        ObjectInserter oi = repo.getRepository().newObjectInserter();
-        ObjectReader reader = oi.newReader();
-        RevWalk rw = new RevWalk(reader)) {
-      bu.setRepository(repo.getRepository(), rw, oi);
-      bu.addOp(c.getId(), inserter);
-      bu.execute();
-    }
-
-    return inserter.getChange();
-  }
-
-  protected ThrowableSubject assertThatQueryException(Object query) throws Exception {
-    return assertThatQueryException(newQuery(query));
-  }
-
-  protected ThrowableSubject assertThatQueryException(QueryRequest query) throws Exception {
-    try {
-      query.get();
-      throw new AssertionError("expected BadRequestException for query: " + query);
-    } catch (BadRequestException e) {
-      return assertThat(e);
-    }
-  }
-
-  protected TestRepository<Repo> createProject(String name) throws Exception {
-    gApi.projects().create(name).get();
-    return new TestRepository<>(repoManager.openRepository(new Project.NameKey(name)));
-  }
-
-  protected TestRepository<Repo> createProject(String name, String parent) throws Exception {
-    ProjectInput input = new ProjectInput();
-    input.name = name;
-    input.parent = parent;
-    gApi.projects().create(input).get();
-    return new TestRepository<>(repoManager.openRepository(new Project.NameKey(name)));
-  }
-
-  protected QueryRequest newQuery(Object query) {
-    return gApi.changes().query(query.toString());
-  }
-
-  protected List<ChangeInfo> assertQuery(Object query, Change... changes) throws Exception {
-    return assertQuery(newQuery(query), changes);
-  }
-
-  protected List<ChangeInfo> assertQueryByIds(Object query, Change.Id... changes) throws Exception {
-    return assertQueryByIds(newQuery(query), changes);
-  }
-
-  protected List<ChangeInfo> assertQuery(QueryRequest query, Change... changes) throws Exception {
-    return assertQueryByIds(
-        query, Arrays.stream(changes).map(Change::getId).toArray(Change.Id[]::new));
-  }
-
-  protected List<ChangeInfo> assertQueryByIds(QueryRequest query, Change.Id... changes)
-      throws Exception {
-    List<ChangeInfo> result = query.get();
-    Iterable<Change.Id> ids = ids(result);
-    assertThat(ids)
-        .named(format(query, ids, changes))
-        .containsExactlyElementsIn(Arrays.asList(changes))
-        .inOrder();
-    return result;
-  }
-
-  private String format(
-      QueryRequest query, Iterable<Change.Id> actualIds, Change.Id... expectedChanges)
-      throws RestApiException {
-    StringBuilder b = new StringBuilder();
-    b.append("query '").append(query.getQuery()).append("' with expected changes ");
-    b.append(format(Arrays.asList(expectedChanges)));
-    b.append(" and result ");
-    b.append(format(actualIds));
-    return b.toString();
-  }
-
-  private String format(Iterable<Change.Id> changeIds) throws RestApiException {
-    return format(changeIds.iterator());
-  }
-
-  private String format(Iterator<Change.Id> changeIds) throws RestApiException {
-    StringBuilder b = new StringBuilder();
-    b.append("[");
-    while (changeIds.hasNext()) {
-      Change.Id id = changeIds.next();
-      ChangeInfo c = gApi.changes().id(id.get()).get();
-      b.append("{")
-          .append(id)
-          .append(" (")
-          .append(c.changeId)
-          .append("), ")
-          .append("dest=")
-          .append(new Branch.NameKey(new Project.NameKey(c.project), c.branch))
-          .append(", ")
-          .append("status=")
-          .append(c.status)
-          .append(", ")
-          .append("lastUpdated=")
-          .append(c.updated.getTime())
-          .append("}");
-      if (changeIds.hasNext()) {
-        b.append(", ");
-      }
-    }
-    b.append("]");
-    return b.toString();
-  }
-
-  protected static Iterable<Change.Id> ids(Change... changes) {
-    return Arrays.stream(changes).map(c -> c.getId()).collect(toList());
-  }
-
-  protected static Iterable<Change.Id> ids(Iterable<ChangeInfo> changes) {
-    return Streams.stream(changes).map(c -> new Change.Id(c._number)).collect(toList());
-  }
-
-  protected static long lastUpdatedMs(Change c) {
-    return c.getLastUpdatedOn().getTime();
-  }
-
-  private void addComment(int changeId, String message, Boolean unresolved) throws Exception {
-    ReviewInput input = new ReviewInput();
-    ReviewInput.CommentInput comment = new ReviewInput.CommentInput();
-    comment.line = 1;
-    comment.message = message;
-    comment.unresolved = unresolved;
-    input.comments =
-        ImmutableMap.<String, List<ReviewInput.CommentInput>>of(
-            Patch.COMMIT_MSG, ImmutableList.<ReviewInput.CommentInput>of(comment));
-    gApi.changes().id(changeId).current().review(input);
-  }
-
-  private Account.Id createAccount(String username, String fullName, String email, boolean active)
-      throws Exception {
-    try (ManualRequestContext ctx = oneOffRequestContext.open()) {
-      Account.Id id = accountManager.authenticate(AuthRequest.forUser(username)).getAccountId();
-      if (email != null) {
-        accountManager.link(id, AuthRequest.forEmail(email));
-      }
-      accountsUpdate
-          .create()
-          .update(
-              id,
-              a -> {
-                a.setFullName(fullName);
-                a.setPreferredEmail(email);
-                a.setActive(active);
-              });
-      return id;
-    }
-  }
-
-  protected void assertMissingField(FieldDef<ChangeData, ?> field) {
-    assertThat(getSchema().hasField(field))
-        .named("schema %s has field %s", getSchemaVersion(), field.getName())
-        .isFalse();
-  }
-
-  protected void assertFailingQuery(String query, String expectedMessage) throws Exception {
-    try {
-      assertQuery(query);
-      fail("expected BadRequestException for query '" + query + "'");
-    } catch (BadRequestException e) {
-      assertThat(e.getMessage()).isEqualTo(expectedMessage);
-    }
-  }
-
-  protected int getSchemaVersion() {
-    return getSchema().getVersion();
-  }
-
-  protected Schema<ChangeData> getSchema() {
-    return indexes.getSearchIndex().getSchema();
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/ChangeDataTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/ChangeDataTest.java
deleted file mode 100644
index def0b08..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/ChangeDataTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.server.query.change;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.testutil.TestChanges;
-import org.junit.Test;
-
-public class ChangeDataTest {
-  @Test
-  public void setPatchSetsClearsCurrentPatchSet() throws Exception {
-    Project.NameKey project = new Project.NameKey("project");
-    ChangeData cd = ChangeData.createForTest(project, new Change.Id(1), 1);
-    cd.setChange(TestChanges.newChange(project, new Account.Id(1000)));
-    PatchSet curr1 = cd.currentPatchSet();
-    int currId = curr1.getId().get();
-    PatchSet ps1 = new PatchSet(new PatchSet.Id(cd.getId(), currId + 1));
-    PatchSet ps2 = new PatchSet(new PatchSet.Id(cd.getId(), currId + 2));
-    cd.setPatchSets(ImmutableList.of(ps1, ps2));
-    PatchSet curr2 = cd.currentPatchSet();
-    assertThat(curr2).isNotSameAs(curr1);
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/LuceneQueryChangesTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/LuceneQueryChangesTest.java
deleted file mode 100644
index 96c3d24..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/LuceneQueryChangesTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.server.query.change;
-
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.server.index.change.ChangeSchemaDefinitions;
-import com.google.gerrit.testutil.ConfigSuite;
-import com.google.gerrit.testutil.InMemoryModule;
-import com.google.gerrit.testutil.InMemoryRepositoryManager.Repo;
-import com.google.gerrit.testutil.IndexVersions;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import java.util.List;
-import java.util.Map;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.junit.Test;
-
-public class LuceneQueryChangesTest extends AbstractQueryChangesTest {
-  @ConfigSuite.Configs
-  public static Map<String, Config> againstPreviousIndexVersion() {
-    // the current schema version is already tested by the inherited default config suite
-    List<Integer> schemaVersions = IndexVersions.getWithoutLatest(ChangeSchemaDefinitions.INSTANCE);
-    return IndexVersions.asConfigMap(
-        ChangeSchemaDefinitions.INSTANCE, schemaVersions, "againstIndexVersion", defaultConfig());
-  }
-
-  @Override
-  protected Injector createInjector() {
-    Config luceneConfig = new Config(config);
-    InMemoryModule.setDefaults(luceneConfig);
-    return Guice.createInjector(new InMemoryModule(luceneConfig, notesMigration));
-  }
-
-  @Test
-  public void fullTextWithSpecialChars() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    RevCommit commit1 = repo.parseBody(repo.commit().message("foo_bar_foo").create());
-    Change change1 = insert(repo, newChangeForCommit(repo, commit1));
-    RevCommit commit2 = repo.parseBody(repo.commit().message("one.two.three").create());
-    Change change2 = insert(repo, newChangeForCommit(repo, commit2));
-
-    assertQuery("message:foo_ba");
-    assertQuery("message:bar", change1);
-    assertQuery("message:foo_bar", change1);
-    assertQuery("message:foo bar", change1);
-    assertQuery("message:two", change2);
-    assertQuery("message:one.two", change2);
-    assertQuery("message:one two", change2);
-  }
-
-  @Test
-  @Override
-  public void byOwnerInvalidQuery() throws Exception {
-    TestRepository<Repo> repo = createProject("repo");
-    Change change1 = insert(repo, newChange(repo), userId);
-    String nameEmail = user.asIdentifiedUser().getNameEmail();
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("Cannot create full-text query with value: \\");
-    assertQuery("owner: \"" + nameEmail + "\"\\", change1);
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/group/AbstractQueryGroupsTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/group/AbstractQueryGroupsTest.java
deleted file mode 100644
index b057267..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/query/group/AbstractQueryGroupsTest.java
+++ /dev/null
@@ -1,577 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.query.group;
-
-import static com.google.common.truth.Truth.assertThat;
-import static java.util.stream.Collectors.toList;
-import static org.junit.Assert.fail;
-
-import com.google.common.base.CharMatcher;
-import com.google.gerrit.extensions.api.GerritApi;
-import com.google.gerrit.extensions.api.accounts.AccountInput;
-import com.google.gerrit.extensions.api.groups.GroupInput;
-import com.google.gerrit.extensions.api.groups.Groups.QueryRequest;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.common.GroupInfo;
-import com.google.gerrit.extensions.restapi.BadRequestException;
-import com.google.gerrit.index.FieldDef;
-import com.google.gerrit.index.Schema;
-import com.google.gerrit.lifecycle.LifecycleManager;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.AnonymousUser;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.AccountManager;
-import com.google.gerrit.server.account.Accounts;
-import com.google.gerrit.server.account.AccountsUpdate;
-import com.google.gerrit.server.account.AuthRequest;
-import com.google.gerrit.server.account.GroupCache;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.group.GroupsUpdate;
-import com.google.gerrit.server.group.InternalGroup;
-import com.google.gerrit.server.group.ServerInitiated;
-import com.google.gerrit.server.index.group.GroupField;
-import com.google.gerrit.server.index.group.GroupIndex;
-import com.google.gerrit.server.index.group.GroupIndexCollection;
-import com.google.gerrit.server.schema.SchemaCreator;
-import com.google.gerrit.server.util.ManualRequestContext;
-import com.google.gerrit.server.util.OneOffRequestContext;
-import com.google.gerrit.server.util.RequestContext;
-import com.google.gerrit.server.util.ThreadLocalRequestContext;
-import com.google.gerrit.testutil.ConfigSuite;
-import com.google.gerrit.testutil.GerritServerTests;
-import com.google.gerrit.testutil.InMemoryDatabase;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.Provider;
-import com.google.inject.util.Providers;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import org.eclipse.jgit.lib.Config;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-
-@Ignore
-public abstract class AbstractQueryGroupsTest extends GerritServerTests {
-  @ConfigSuite.Default
-  public static Config defaultConfig() {
-    Config cfg = new Config();
-    cfg.setInt("index", null, "maxPages", 10);
-    return cfg;
-  }
-
-  @Inject protected Accounts accounts;
-
-  @Inject protected AccountsUpdate.Server accountsUpdate;
-
-  @Inject protected AccountCache accountCache;
-
-  @Inject protected AccountManager accountManager;
-
-  @Inject protected GerritApi gApi;
-
-  @Inject protected IdentifiedUser.GenericFactory userFactory;
-
-  @Inject private Provider<AnonymousUser> anonymousUser;
-
-  @Inject protected InMemoryDatabase schemaFactory;
-
-  @Inject protected SchemaCreator schemaCreator;
-
-  @Inject protected ThreadLocalRequestContext requestContext;
-
-  @Inject protected OneOffRequestContext oneOffRequestContext;
-
-  @Inject protected AllProjectsName allProjects;
-
-  @Inject protected GroupCache groupCache;
-
-  @Inject @ServerInitiated protected Provider<GroupsUpdate> groupsUpdateProvider;
-
-  @Inject protected GroupIndexCollection indexes;
-
-  @Inject private GroupIndexCollection groupIndexes;
-
-  protected LifecycleManager lifecycle;
-  protected Injector injector;
-  protected ReviewDb db;
-  protected AccountInfo currentUserInfo;
-  protected CurrentUser user;
-
-  protected abstract Injector createInjector();
-
-  @Before
-  public void setUpInjector() throws Exception {
-    lifecycle = new LifecycleManager();
-    injector = createInjector();
-    lifecycle.add(injector);
-    injector.injectMembers(this);
-    lifecycle.start();
-    initAfterLifecycleStart();
-    setUpDatabase();
-  }
-
-  @After
-  public void cleanUp() {
-    lifecycle.stop();
-    db.close();
-  }
-
-  protected void setUpDatabase() throws Exception {
-    db = schemaFactory.open();
-    schemaCreator.create(db);
-
-    Account.Id userId =
-        createAccountOutsideRequestContext("user", "User", "user@example.com", true);
-    user = userFactory.create(userId);
-    requestContext.setContext(newRequestContext(userId));
-    currentUserInfo = gApi.accounts().id(userId.get()).get();
-  }
-
-  protected void initAfterLifecycleStart() throws Exception {}
-
-  protected RequestContext newRequestContext(Account.Id requestUserId) {
-    final CurrentUser requestUser = userFactory.create(requestUserId);
-    return new RequestContext() {
-      @Override
-      public CurrentUser getUser() {
-        return requestUser;
-      }
-
-      @Override
-      public Provider<ReviewDb> getReviewDbProvider() {
-        return Providers.of(db);
-      }
-    };
-  }
-
-  protected void setAnonymous() {
-    requestContext.setContext(
-        new RequestContext() {
-          @Override
-          public CurrentUser getUser() {
-            return anonymousUser.get();
-          }
-
-          @Override
-          public Provider<ReviewDb> getReviewDbProvider() {
-            return Providers.of(db);
-          }
-        });
-  }
-
-  @After
-  public void tearDownInjector() {
-    if (lifecycle != null) {
-      lifecycle.stop();
-    }
-    if (requestContext != null) {
-      requestContext.setContext(null);
-    }
-    if (db != null) {
-      db.close();
-    }
-    InMemoryDatabase.drop(schemaFactory);
-  }
-
-  @Test
-  public void byUuid() throws Exception {
-    assertQuery("uuid:6d70856bc40ded50f2585c4c0f7e179f3544a272");
-    assertQuery("uuid:non-existing");
-
-    GroupInfo group = createGroup(name("group"));
-    assertQuery("uuid:" + group.id, group);
-
-    GroupInfo admins = gApi.groups().id("Administrators").get();
-    assertQuery("uuid:" + admins.id, admins);
-  }
-
-  @Test
-  public void byName() throws Exception {
-    assertQuery("name:non-existing");
-
-    GroupInfo group = createGroup(name("Group"));
-    assertQuery("name:" + group.name, group);
-    assertQuery("name:" + group.name.toLowerCase(Locale.US));
-
-    // only exact match
-    GroupInfo groupWithHyphen = createGroup(name("group-with-hyphen"));
-    createGroup(name("group-no-match-with-hyphen"));
-    assertQuery("name:" + groupWithHyphen.name, groupWithHyphen);
-  }
-
-  @Test
-  public void byInname() throws Exception {
-    String namePart = getSanitizedMethodName();
-    namePart = CharMatcher.is('_').removeFrom(namePart);
-
-    GroupInfo group1 = createGroup("group-" + namePart);
-    GroupInfo group2 = createGroup("group-" + namePart + "-2");
-    GroupInfo group3 = createGroup("group-" + namePart + "3");
-    assertQuery("inname:" + namePart, group1, group2, group3);
-    assertQuery("inname:" + namePart.toUpperCase(Locale.US), group1, group2, group3);
-    assertQuery("inname:" + namePart.toLowerCase(Locale.US), group1, group2, group3);
-  }
-
-  @Test
-  public void byDescription() throws Exception {
-    GroupInfo group1 = createGroupWithDescription(name("group1"), "This is a test group.");
-    GroupInfo group2 = createGroupWithDescription(name("group2"), "ANOTHER TEST GROUP.");
-    createGroupWithDescription(name("group3"), "Maintainers of project foo.");
-    assertQuery("description:test", group1, group2);
-
-    assertQuery("description:non-existing");
-
-    exception.expect(BadRequestException.class);
-    exception.expectMessage("description operator requires a value");
-    assertQuery("description:\"\"");
-  }
-
-  @Test
-  public void byOwner() throws Exception {
-    GroupInfo ownerGroup = createGroup(name("owner-group"));
-    GroupInfo group = createGroupWithOwner(name("group"), ownerGroup);
-    createGroup(name("group2"));
-
-    assertQuery("owner:" + group.id);
-
-    // ownerGroup owns itself
-    assertQuery("owner:" + ownerGroup.id, group, ownerGroup);
-    assertQuery("owner:" + ownerGroup.name, group, ownerGroup);
-  }
-
-  @Test
-  public void byIsVisibleToAll() throws Exception {
-    assertQuery("is:visibletoall");
-
-    GroupInfo groupThatIsVisibleToAll =
-        createGroupThatIsVisibleToAll(name("group-that-is-visible-to-all"));
-    createGroup(name("group"));
-
-    assertQuery("is:visibletoall", groupThatIsVisibleToAll);
-  }
-
-  @Test
-  public void byMember() throws Exception {
-    if (getSchemaVersion() < 4) {
-      assertMissingField(GroupField.MEMBER);
-      assertFailingQuery(
-          "member:someName", "'member' operator is not supported by group index version");
-      return;
-    }
-
-    AccountInfo user1 = createAccount("user1", "User1", "user1@example.com");
-    AccountInfo user2 = createAccount("user2", "User2", "user2@example.com");
-
-    GroupInfo group1 = createGroup(name("group1"), user1);
-    GroupInfo group2 = createGroup(name("group2"), user2);
-    GroupInfo group3 = createGroup(name("group3"), user1);
-
-    assertQuery("member:" + user1.name, group1, group3);
-    assertQuery("member:" + user1.email, group1, group3);
-
-    gApi.groups().id(group3.id).removeMembers(user1.username);
-    gApi.groups().id(group2.id).addMembers(user1.username);
-
-    assertQuery("member:" + user1.name, group1, group2);
-  }
-
-  @Test
-  public void bySubgroups() throws Exception {
-    if (getSchemaVersion() < 4) {
-      assertMissingField(GroupField.SUBGROUP);
-      assertFailingQuery(
-          "subgroup:someGroupName", "'subgroup' operator is not supported by group index version");
-      return;
-    }
-
-    GroupInfo superParentGroup = createGroup(name("superParentGroup"));
-    GroupInfo parentGroup1 = createGroup(name("parentGroup1"));
-    GroupInfo parentGroup2 = createGroup(name("parentGroup2"));
-    GroupInfo subGroup = createGroup(name("subGroup"));
-
-    gApi.groups().id(superParentGroup.id).addGroups(parentGroup1.id, parentGroup2.id);
-    gApi.groups().id(parentGroup1.id).addGroups(subGroup.id);
-    gApi.groups().id(parentGroup2.id).addGroups(subGroup.id);
-
-    assertQuery("subgroup:" + subGroup.id, parentGroup1, parentGroup2);
-    assertQuery("subgroup:" + parentGroup1.id, superParentGroup);
-
-    gApi.groups().id(superParentGroup.id).addGroups(subGroup.id);
-    gApi.groups().id(parentGroup1.id).removeGroups(subGroup.id);
-
-    assertQuery("subgroup:" + subGroup.id, superParentGroup, parentGroup2);
-  }
-
-  @Test
-  public void byDefaultField() throws Exception {
-    GroupInfo group1 = createGroup(name("foo-group"));
-    GroupInfo group2 = createGroup(name("group2"));
-    GroupInfo group3 =
-        createGroupWithDescription(
-            name("group3"), "decription that contains foo and the UUID of group2: " + group2.id);
-
-    assertQuery("non-existing");
-    assertQuery("foo", group1, group3);
-    assertQuery(group2.id, group2, group3);
-  }
-
-  @Test
-  public void withLimit() throws Exception {
-    GroupInfo group1 = createGroup(name("group1"));
-    GroupInfo group2 = createGroup(name("group2"));
-    GroupInfo group3 = createGroup(name("group3"));
-
-    String query = "uuid:" + group1.id + " OR uuid:" + group2.id + " OR uuid:" + group3.id;
-    List<GroupInfo> result = assertQuery(query, group1, group2, group3);
-    assertThat(result.get(result.size() - 1)._moreGroups).isNull();
-
-    result = assertQuery(newQuery(query).withLimit(2), result.subList(0, 2));
-    assertThat(result.get(result.size() - 1)._moreGroups).isTrue();
-  }
-
-  @Test
-  public void withStart() throws Exception {
-    GroupInfo group1 = createGroup(name("group1"));
-    GroupInfo group2 = createGroup(name("group2"));
-    GroupInfo group3 = createGroup(name("group3"));
-
-    String query = "uuid:" + group1.id + " OR uuid:" + group2.id + " OR uuid:" + group3.id;
-    List<GroupInfo> result = assertQuery(query, group1, group2, group3);
-
-    assertQuery(newQuery(query).withStart(1), result.subList(1, 3));
-  }
-
-  @Test
-  public void asAnonymous() throws Exception {
-    GroupInfo group = createGroup(name("group"));
-
-    setAnonymous();
-    assertQuery("uuid:" + group.id);
-  }
-
-  // reindex permissions are tested by {@link GroupsIT#reindexPermissions}
-  @Test
-  public void reindex() throws Exception {
-    GroupInfo group1 = createGroupWithDescription(name("group"), "barX");
-
-    // update group in the database so that group index is stale
-    String newDescription = "barY";
-    AccountGroup.UUID groupUuid = new AccountGroup.UUID(group1.id);
-    groupsUpdateProvider
-        .get()
-        .updateGroupInDb(db, groupUuid, group -> group.setDescription(newDescription));
-
-    assertQuery("description:" + group1.description, group1);
-    assertQuery("description:" + newDescription);
-
-    gApi.groups().id(group1.id).index();
-    assertQuery("description:" + group1.description);
-    assertQuery("description:" + newDescription, group1);
-  }
-
-  @Test
-  public void byDeletedGroup() throws Exception {
-    GroupInfo group = createGroup(name("group"));
-    String query = "uuid:" + group.id;
-    assertQuery(query, group);
-
-    AccountGroup account = db.accountGroups().get(new AccountGroup.Id(group.groupId));
-    for (GroupIndex index : groupIndexes.getWriteIndexes()) {
-      index.delete(account.getGroupUUID());
-    }
-    assertQuery(query);
-  }
-
-  private Account.Id createAccountOutsideRequestContext(
-      String username, String fullName, String email, boolean active) throws Exception {
-    try (ManualRequestContext ctx = oneOffRequestContext.open()) {
-      Account.Id id = accountManager.authenticate(AuthRequest.forUser(username)).getAccountId();
-      if (email != null) {
-        accountManager.link(id, AuthRequest.forEmail(email));
-      }
-      accountsUpdate
-          .create()
-          .update(
-              id,
-              a -> {
-                a.setFullName(fullName);
-                a.setPreferredEmail(email);
-                a.setActive(active);
-              });
-      return id;
-    }
-  }
-
-  protected AccountInfo createAccount(String username, String fullName, String email)
-      throws Exception {
-    String uniqueName = name(username);
-    AccountInput accountInput = new AccountInput();
-    accountInput.username = uniqueName;
-    accountInput.name = fullName;
-    accountInput.email = email;
-    return gApi.accounts().create(accountInput).get();
-  }
-
-  protected GroupInfo createGroup(String name, AccountInfo... members) throws Exception {
-    return createGroupWithDescription(name, null, members);
-  }
-
-  protected GroupInfo createGroupWithDescription(
-      String name, String description, AccountInfo... members) throws Exception {
-    GroupInput in = new GroupInput();
-    in.name = name;
-    in.description = description;
-    in.members =
-        Arrays.asList(members).stream().map(a -> String.valueOf(a._accountId)).collect(toList());
-    return gApi.groups().create(in).get();
-  }
-
-  protected GroupInfo createGroupWithOwner(String name, GroupInfo ownerGroup) throws Exception {
-    GroupInput in = new GroupInput();
-    in.name = name;
-    in.ownerId = ownerGroup.id;
-    return gApi.groups().create(in).get();
-  }
-
-  protected GroupInfo createGroupThatIsVisibleToAll(String name) throws Exception {
-    GroupInput in = new GroupInput();
-    in.name = name;
-    in.visibleToAll = true;
-    return gApi.groups().create(in).get();
-  }
-
-  protected GroupInfo getGroup(AccountGroup.UUID uuid) throws Exception {
-    return gApi.groups().id(uuid.get()).get();
-  }
-
-  protected List<GroupInfo> assertQuery(Object query, GroupInfo... groups) throws Exception {
-    return assertQuery(newQuery(query), groups);
-  }
-
-  protected List<GroupInfo> assertQuery(QueryRequest query, GroupInfo... groups) throws Exception {
-    return assertQuery(query, Arrays.asList(groups));
-  }
-
-  protected List<GroupInfo> assertQuery(QueryRequest query, List<GroupInfo> groups)
-      throws Exception {
-    List<GroupInfo> result = query.get();
-    Iterable<String> uuids = uuids(result);
-    assertThat(uuids).named(format(query, result, groups)).containsExactlyElementsIn(uuids(groups));
-    return result;
-  }
-
-  protected QueryRequest newQuery(Object query) {
-    return gApi.groups().query(query.toString());
-  }
-
-  protected String format(
-      QueryRequest query, List<GroupInfo> actualGroups, List<GroupInfo> expectedGroups) {
-    StringBuilder b = new StringBuilder();
-    b.append("query '").append(query.getQuery()).append("' with expected groups ");
-    b.append(format(expectedGroups));
-    b.append(" and result ");
-    b.append(format(actualGroups));
-    return b.toString();
-  }
-
-  protected String format(Iterable<GroupInfo> groups) {
-    StringBuilder b = new StringBuilder();
-    b.append("[");
-    Iterator<GroupInfo> it = groups.iterator();
-    while (it.hasNext()) {
-      GroupInfo g = it.next();
-      b.append("{")
-          .append(g.id)
-          .append(", ")
-          .append("name=")
-          .append(g.name)
-          .append(", ")
-          .append("groupId=")
-          .append(g.groupId)
-          .append(", ")
-          .append("url=")
-          .append(g.url)
-          .append(", ")
-          .append("ownerId=")
-          .append(g.ownerId)
-          .append(", ")
-          .append("owner=")
-          .append(g.owner)
-          .append(", ")
-          .append("description=")
-          .append(g.description)
-          .append(", ")
-          .append("visibleToAll=")
-          .append(toBoolean(g.options.visibleToAll))
-          .append("}");
-      if (it.hasNext()) {
-        b.append(", ");
-      }
-    }
-    b.append("]");
-    return b.toString();
-  }
-
-  protected static boolean toBoolean(Boolean b) {
-    return b == null ? false : b;
-  }
-
-  protected static Iterable<String> ids(GroupInfo... groups) {
-    return uuids(Arrays.asList(groups));
-  }
-
-  protected static Iterable<String> uuids(List<GroupInfo> groups) {
-    return groups.stream().map(g -> g.id).collect(toList());
-  }
-
-  protected String name(String name) {
-    if (name == null) {
-      return null;
-    }
-
-    return name + "_" + getSanitizedMethodName();
-  }
-
-  protected void assertMissingField(FieldDef<InternalGroup, ?> field) {
-    assertThat(getSchema().hasField(field))
-        .named("schema %s has field %s", getSchemaVersion(), field.getName())
-        .isFalse();
-  }
-
-  protected void assertFailingQuery(String query, String expectedMessage) throws Exception {
-    try {
-      assertQuery(query);
-      fail("expected BadRequestException for query '" + query + "'");
-    } catch (BadRequestException e) {
-      assertThat(e.getMessage()).isEqualTo(expectedMessage);
-    }
-  }
-
-  protected int getSchemaVersion() {
-    return getSchema().getVersion();
-  }
-
-  protected Schema<InternalGroup> getSchema() {
-    return indexes.getSearchIndex().getSchema();
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/group/LuceneQueryGroupsTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/group/LuceneQueryGroupsTest.java
deleted file mode 100644
index 001a897..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/query/group/LuceneQueryGroupsTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.query.group;
-
-import com.google.gerrit.server.index.group.GroupSchemaDefinitions;
-import com.google.gerrit.testutil.ConfigSuite;
-import com.google.gerrit.testutil.InMemoryModule;
-import com.google.gerrit.testutil.IndexVersions;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import java.util.List;
-import java.util.Map;
-import org.eclipse.jgit.lib.Config;
-
-public class LuceneQueryGroupsTest extends AbstractQueryGroupsTest {
-  @ConfigSuite.Configs
-  public static Map<String, Config> againstPreviousIndexVersion() {
-    // the current schema version is already tested by the inherited default config suite
-    List<Integer> schemaVersions = IndexVersions.getWithoutLatest(GroupSchemaDefinitions.INSTANCE);
-    return IndexVersions.asConfigMap(
-        GroupSchemaDefinitions.INSTANCE, schemaVersions, "againstIndexVersion", defaultConfig());
-  }
-
-  @Override
-  protected Injector createInjector() {
-    Config luceneConfig = new Config(config);
-    InMemoryModule.setDefaults(luceneConfig);
-    return Guice.createInjector(new InMemoryModule(luceneConfig, notesMigration));
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaCreatorTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaCreatorTest.java
deleted file mode 100644
index 3cd1696..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaCreatorTest.java
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.schema;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.common.data.LabelFunction;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.LabelTypes;
-import com.google.gerrit.common.data.LabelValue;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.testutil.InMemoryDatabase;
-import com.google.gerrit.testutil.InMemoryModule;
-import com.google.gwtorm.jdbc.JdbcSchema;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.io.File;
-import java.io.IOException;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import org.eclipse.jgit.lib.Repository;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-public class SchemaCreatorTest {
-  @Inject private AllProjectsName allProjects;
-
-  @Inject private GitRepositoryManager repoManager;
-
-  @Inject private InMemoryDatabase db;
-
-  @Before
-  public void setUp() throws Exception {
-    new InMemoryModule().inject(this);
-  }
-
-  @After
-  public void tearDown() throws Exception {
-    InMemoryDatabase.drop(db);
-  }
-
-  @Test
-  public void getCauses_CreateSchema() throws OrmException, SQLException, IOException {
-    // Initially the schema should be empty.
-    String[] types = {"TABLE", "VIEW"};
-    try (JdbcSchema d = (JdbcSchema) db.open();
-        ResultSet rs = d.getConnection().getMetaData().getTables(null, null, null, types)) {
-      assertThat(rs.next()).isFalse();
-    }
-
-    // Create the schema using the current schema version.
-    //
-    db.create();
-    db.assertSchemaVersion();
-
-    // By default sitePath is set to the current working directory.
-    //
-    File sitePath = new File(".").getAbsoluteFile();
-    if (sitePath.getName().equals(".")) {
-      sitePath = sitePath.getParentFile();
-    }
-    assertThat(db.getSystemConfig().sitePath).isEqualTo(sitePath.getCanonicalPath());
-  }
-
-  private LabelTypes getLabelTypes() throws Exception {
-    db.create();
-    ProjectConfig c = new ProjectConfig(allProjects);
-    try (Repository repo = repoManager.openRepository(allProjects)) {
-      c.load(repo);
-      return new LabelTypes(ImmutableList.copyOf(c.getLabelSections().values()));
-    }
-  }
-
-  @Test
-  public void createSchema_LabelTypes() throws Exception {
-    List<String> labels = new ArrayList<>();
-    for (LabelType label : getLabelTypes().getLabelTypes()) {
-      labels.add(label.getName());
-    }
-    assertThat(labels).containsExactly("Code-Review");
-  }
-
-  @Test
-  public void createSchema_Label_CodeReview() throws Exception {
-    LabelType codeReview = getLabelTypes().byLabel("Code-Review");
-    assertThat(codeReview).isNotNull();
-    assertThat(codeReview.getName()).isEqualTo("Code-Review");
-    assertThat(codeReview.getDefaultValue()).isEqualTo(0);
-    assertThat(codeReview.getFunction()).isEqualTo(LabelFunction.MAX_WITH_BLOCK);
-    assertThat(codeReview.isCopyMinScore()).isTrue();
-    assertValueRange(codeReview, 2, 1, 0, -1, -2);
-  }
-
-  private void assertValueRange(LabelType label, Integer... range) {
-    assertThat(label.getValuesAsList()).containsExactlyElementsIn(Arrays.asList(range)).inOrder();
-    assertThat(label.getMax().getValue()).isEqualTo(range[0]);
-    assertThat(label.getMin().getValue()).isEqualTo(range[range.length - 1]);
-    for (LabelValue v : label.getValues()) {
-      assertThat(Strings.isNullOrEmpty(v.getText())).isFalse();
-    }
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaUpdaterTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaUpdaterTest.java
deleted file mode 100644
index 5b86f46..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaUpdaterTest.java
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.schema;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.gerrit.extensions.config.FactoryModule;
-import com.google.gerrit.lifecycle.LifecycleManager;
-import com.google.gerrit.reviewdb.client.SystemConfig;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.GerritPersonIdentProvider;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.config.AnonymousCowardName;
-import com.google.gerrit.server.config.AnonymousCowardNameProvider;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.group.SystemGroupBackend;
-import com.google.gerrit.server.notedb.NotesMigration;
-import com.google.gerrit.testutil.InMemoryDatabase;
-import com.google.gerrit.testutil.InMemoryH2Type;
-import com.google.gerrit.testutil.InMemoryRepositoryManager;
-import com.google.gerrit.testutil.TestUpdateUI;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Guice;
-import com.google.inject.Key;
-import com.google.inject.ProvisionException;
-import com.google.inject.TypeLiteral;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.UUID;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-public class SchemaUpdaterTest {
-  private LifecycleManager lifecycle;
-  private InMemoryDatabase db;
-
-  @Before
-  public void setUp() throws Exception {
-    lifecycle = new LifecycleManager();
-    db = InMemoryDatabase.newDatabase(lifecycle);
-    lifecycle.start();
-  }
-
-  @After
-  public void tearDown() throws Exception {
-    if (lifecycle != null) {
-      lifecycle.stop();
-    }
-    InMemoryDatabase.drop(db);
-  }
-
-  @Test
-  public void update() throws OrmException, FileNotFoundException, IOException {
-    db.create();
-
-    final Path site = Paths.get(UUID.randomUUID().toString());
-    final SitePaths paths = new SitePaths(site);
-    SchemaUpdater u =
-        Guice.createInjector(
-                new FactoryModule() {
-                  @Override
-                  protected void configure() {
-                    TypeLiteral<SchemaFactory<ReviewDb>> schemaFactory =
-                        new TypeLiteral<SchemaFactory<ReviewDb>>() {};
-                    bind(schemaFactory).to(NotesMigrationSchemaFactory.class);
-                    bind(Key.get(schemaFactory, ReviewDbFactory.class)).toInstance(db);
-                    bind(SitePaths.class).toInstance(paths);
-
-                    Config cfg = new Config();
-                    cfg.setString("user", null, "name", "Gerrit Code Review");
-                    cfg.setString("user", null, "email", "gerrit@localhost");
-
-                    bind(Config.class) //
-                        .annotatedWith(GerritServerConfig.class) //
-                        .toInstance(cfg);
-
-                    bind(PersonIdent.class) //
-                        .annotatedWith(GerritPersonIdent.class) //
-                        .toProvider(GerritPersonIdentProvider.class);
-
-                    bind(AllProjectsName.class).toInstance(new AllProjectsName("All-Projects"));
-                    bind(AllUsersName.class).toInstance(new AllUsersName("All-Users"));
-
-                    bind(GitRepositoryManager.class).toInstance(new InMemoryRepositoryManager());
-
-                    bind(String.class) //
-                        .annotatedWith(AnonymousCowardName.class) //
-                        .toProvider(AnonymousCowardNameProvider.class);
-
-                    bind(DataSourceType.class).to(InMemoryH2Type.class);
-
-                    bind(SystemGroupBackend.class);
-                    install(new NotesMigration.Module());
-                  }
-                })
-            .getInstance(SchemaUpdater.class);
-
-    for (SchemaVersion s = u.getLatestSchemaVersion(); s.getVersionNbr() > 1; s = s.getPrior()) {
-      try {
-        assertThat(s.getPrior().getVersionNbr())
-            .named(
-                "schema %s has prior version %s. Not true that",
-                s.getVersionNbr(), s.getPrior().getVersionNbr())
-            .isEqualTo(s.getVersionNbr() - 1);
-      } catch (ProvisionException e) {
-        // Ignored
-        // The oldest supported schema version doesn't have a prior schema
-        // version.
-        break;
-      }
-    }
-
-    u.update(new TestUpdateUI());
-
-    db.assertSchemaVersion();
-    final SystemConfig sc = db.getSystemConfig();
-    assertThat(sc.sitePath).isEqualTo(paths.site_path.toAbsolutePath().toString());
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/schema/Schema_150_to_151_Test.java b/gerrit-server/src/test/java/com/google/gerrit/server/schema/Schema_150_to_151_Test.java
deleted file mode 100644
index dcd1ae5..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/schema/Schema_150_to_151_Test.java
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.schema;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.api.groups.GroupInput;
-import com.google.gerrit.extensions.common.GroupInfo;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.AccountGroup.Id;
-import com.google.gerrit.reviewdb.client.AccountGroupMemberAudit;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.group.CreateGroup;
-import com.google.gerrit.testutil.SchemaUpgradeTestEnvironment;
-import com.google.gerrit.testutil.TestUpdateUI;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.ResultSet;
-import com.google.inject.Inject;
-import java.sql.Timestamp;
-import java.time.Instant;
-import java.time.LocalDateTime;
-import java.time.Month;
-import java.time.ZoneOffset;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-public class Schema_150_to_151_Test {
-
-  @Rule public SchemaUpgradeTestEnvironment testEnv = new SchemaUpgradeTestEnvironment();
-
-  @Inject private CreateGroup.Factory createGroupFactory;
-  @Inject private Schema_151 schema151;
-
-  private ReviewDb db;
-
-  @Before
-  public void setUp() throws Exception {
-    testEnv.getInjector().injectMembers(this);
-    db = testEnv.getDb();
-  }
-
-  @Test
-  public void createdOnIsPopulatedForGroupsCreatedAfterAudit() throws Exception {
-    Timestamp testStartTime = TimeUtil.nowTs();
-    AccountGroup.Id groupId = createGroup("Group for schema migration");
-    setCreatedOnToVeryOldTimestamp(groupId);
-
-    schema151.migrateData(db, new TestUpdateUI());
-
-    AccountGroup group = db.accountGroups().get(groupId);
-    assertThat(group.getCreatedOn()).isAtLeast(testStartTime);
-  }
-
-  @Test
-  public void createdOnIsPopulatedForGroupsCreatedBeforeAudit() throws Exception {
-    AccountGroup.Id groupId = createGroup("Ancient group for schema migration");
-    setCreatedOnToVeryOldTimestamp(groupId);
-    removeAuditEntriesFor(groupId);
-
-    schema151.migrateData(db, new TestUpdateUI());
-
-    AccountGroup group = db.accountGroups().get(groupId);
-    assertThat(group.getCreatedOn()).isEqualTo(AccountGroup.auditCreationInstantTs());
-  }
-
-  private AccountGroup.Id createGroup(String name) throws Exception {
-    GroupInput groupInput = new GroupInput();
-    groupInput.name = name;
-    GroupInfo groupInfo =
-        createGroupFactory.create(name).apply(TopLevelResource.INSTANCE, groupInput);
-    return new Id(groupInfo.groupId);
-  }
-
-  private void setCreatedOnToVeryOldTimestamp(Id groupId) throws OrmException {
-    AccountGroup group = db.accountGroups().get(groupId);
-    Instant instant = LocalDateTime.of(1800, Month.JANUARY, 1, 0, 0).toInstant(ZoneOffset.UTC);
-    group.setCreatedOn(Timestamp.from(instant));
-    db.accountGroups().update(ImmutableList.of(group));
-  }
-
-  private void removeAuditEntriesFor(AccountGroup.Id groupId) throws Exception {
-    ResultSet<AccountGroupMemberAudit> groupMemberAudits =
-        db.accountGroupMembersAudit().byGroup(groupId);
-    db.accountGroupMembersAudit().delete(groupMemberAudits);
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/schema/Schema_159_to_160_Test.java b/gerrit-server/src/test/java/com/google/gerrit/server/schema/Schema_159_to_160_Test.java
deleted file mode 100644
index 14d8b36..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/schema/Schema_159_to_160_Test.java
+++ /dev/null
@@ -1,222 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.schema;
-
-import static com.google.common.base.MoreObjects.firstNonNull;
-import static com.google.common.collect.ImmutableMap.toImmutableMap;
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth8.assertThat;
-import static com.google.gerrit.reviewdb.client.RefNames.REFS_USERS_DEFAULT;
-import static com.google.gerrit.server.account.VersionedAccountPreferences.PREFERENCES;
-import static com.google.gerrit.server.git.UserConfigSections.KEY_URL;
-import static com.google.gerrit.server.git.UserConfigSections.MY;
-import static com.google.gerrit.server.schema.Schema_160.DEFAULT_DRAFT_ITEMS;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.extensions.api.GerritApi;
-import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
-import com.google.gerrit.extensions.client.MenuItem;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.VersionedAccountPreferences;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.testutil.SchemaUpgradeTestEnvironment;
-import com.google.gerrit.testutil.TestUpdateUI;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.util.List;
-import java.util.Optional;
-import java.util.function.Supplier;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.BlobBasedConfig;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-public class Schema_159_to_160_Test {
-  @Rule public SchemaUpgradeTestEnvironment testEnv = new SchemaUpgradeTestEnvironment();
-
-  @Inject private AccountCache accountCache;
-  @Inject private AllUsersName allUsersName;
-  @Inject private GerritApi gApi;
-  @Inject private GitRepositoryManager repoManager;
-  @Inject private Provider<IdentifiedUser> userProvider;
-  @Inject private Schema_160 schema160;
-
-  private ReviewDb db;
-  private Account.Id accountId;
-
-  @Before
-  public void setUp() throws Exception {
-    testEnv.getInjector().injectMembers(this);
-    db = testEnv.getDb();
-    accountId = userProvider.get().getAccountId();
-  }
-
-  @Test
-  public void skipUnmodified() throws Exception {
-    ObjectId oldMetaId = metaRef(accountId);
-    ImmutableSet<String> fromNoteDb = myMenusFromNoteDb(accountId);
-    ImmutableSet<String> fromApi = myMenusFromApi(accountId);
-    for (String item : DEFAULT_DRAFT_ITEMS) {
-      assertThat(fromNoteDb).doesNotContain(item);
-      assertThat(fromApi).doesNotContain(item);
-    }
-
-    schema160.migrateData(db, new TestUpdateUI());
-
-    assertThat(metaRef(accountId)).isEqualTo(oldMetaId);
-  }
-
-  @Test
-  public void deleteItems() throws Exception {
-    ObjectId oldMetaId = metaRef(accountId);
-    ImmutableSet<String> defaultNames = myMenusFromApi(accountId);
-
-    GeneralPreferencesInfo prefs = gApi.accounts().id(accountId.get()).getPreferences();
-    prefs.my.add(0, new MenuItem("Something else", DEFAULT_DRAFT_ITEMS.get(0) + "+is:mergeable"));
-    for (int i = 0; i < DEFAULT_DRAFT_ITEMS.size(); i++) {
-      prefs.my.add(new MenuItem("Draft entry " + i, DEFAULT_DRAFT_ITEMS.get(i)));
-    }
-    gApi.accounts().id(accountId.get()).setPreferences(prefs);
-
-    List<String> oldNames =
-        ImmutableList.<String>builder()
-            .add("Something else")
-            .addAll(defaultNames)
-            .add("Draft entry 0")
-            .add("Draft entry 1")
-            .add("Draft entry 2")
-            .add("Draft entry 3")
-            .build();
-    assertThat(myMenusFromApi(accountId)).containsExactlyElementsIn(oldNames).inOrder();
-
-    schema160.migrateData(db, new TestUpdateUI());
-    accountCache.evict(accountId);
-    testEnv.setApiUser(accountId);
-
-    assertThat(metaRef(accountId)).isNotEqualTo(oldMetaId);
-
-    List<String> newNames =
-        ImmutableList.<String>builder().add("Something else").addAll(defaultNames).build();
-    assertThat(myMenusFromNoteDb(accountId)).containsExactlyElementsIn(newNames).inOrder();
-    assertThat(myMenusFromApi(accountId)).containsExactlyElementsIn(newNames).inOrder();
-  }
-
-  @Test
-  public void skipNonExistentRefsUsersDefault() throws Exception {
-    assertThat(readRef(REFS_USERS_DEFAULT)).isEmpty();
-    schema160.migrateData(db, new TestUpdateUI());
-    assertThat(readRef(REFS_USERS_DEFAULT)).isEmpty();
-  }
-
-  @Test
-  public void deleteDefaultItem() throws Exception {
-    assertThat(readRef(REFS_USERS_DEFAULT)).isEmpty();
-    ImmutableSet<String> defaultNames = defaultMenusFromApi();
-
-    // Setting *any* preference causes preferences.config to contain the full set of "my" sections.
-    // This mimics real-world behavior prior to the 2.15 upgrade; see Issue 8439 for details.
-    GeneralPreferencesInfo prefs = gApi.config().server().getDefaultPreferences();
-    prefs.signedOffBy = !firstNonNull(prefs.signedOffBy, false);
-    gApi.config().server().setDefaultPreferences(prefs);
-
-    try (Repository repo = repoManager.openRepository(allUsersName)) {
-      Config cfg = new BlobBasedConfig(null, repo, readRef(REFS_USERS_DEFAULT).get(), PREFERENCES);
-      assertThat(cfg.getSubsections("my")).containsExactlyElementsIn(defaultNames).inOrder();
-
-      // Add more defaults directly in git, the SetPreferences endpoint doesn't respect the "my"
-      // field in the input in 2.15 and earlier.
-      cfg.setString("my", "Drafts", "url", "#/q/owner:self+is:draft");
-      cfg.setString("my", "Something else", "url", "#/q/owner:self+is:draft+is:mergeable");
-      cfg.setString("my", "Totally not drafts", "url", "#/q/owner:self+is:draft");
-      new TestRepository<>(repo)
-          .branch(REFS_USERS_DEFAULT)
-          .commit()
-          .add(PREFERENCES, cfg.toText())
-          .create();
-    }
-
-    List<String> oldNames =
-        ImmutableList.<String>builder()
-            .addAll(defaultNames)
-            .add("Drafts")
-            .add("Something else")
-            .add("Totally not drafts")
-            .build();
-    assertThat(defaultMenusFromApi()).containsExactlyElementsIn(oldNames).inOrder();
-
-    schema160.migrateData(db, new TestUpdateUI());
-
-    assertThat(readRef(REFS_USERS_DEFAULT)).isPresent();
-
-    List<String> newNames =
-        ImmutableList.<String>builder().addAll(defaultNames).add("Something else").build();
-    assertThat(myMenusFromNoteDb(VersionedAccountPreferences::forDefault).keySet())
-        .containsExactlyElementsIn(newNames)
-        .inOrder();
-    assertThat(defaultMenusFromApi()).containsExactlyElementsIn(newNames).inOrder();
-  }
-
-  private ImmutableSet<String> myMenusFromNoteDb(Account.Id id) throws Exception {
-    return myMenusFromNoteDb(() -> VersionedAccountPreferences.forUser(id)).keySet();
-  }
-
-  // Raw config values, bypassing the defaults set by GeneralPreferencesLoader.
-  private ImmutableMap<String, String> myMenusFromNoteDb(
-      Supplier<VersionedAccountPreferences> prefsSupplier) throws Exception {
-    try (Repository repo = repoManager.openRepository(allUsersName)) {
-      VersionedAccountPreferences prefs = prefsSupplier.get();
-      prefs.load(repo);
-      Config cfg = prefs.getConfig();
-      return cfg.getSubsections(MY).stream()
-          .collect(toImmutableMap(i -> i, i -> cfg.getString(MY, i, KEY_URL)));
-    }
-  }
-
-  private ImmutableSet<String> myMenusFromApi(Account.Id id) throws Exception {
-    return myMenus(gApi.accounts().id(id.get()).getPreferences()).keySet();
-  }
-
-  private ImmutableSet<String> defaultMenusFromApi() throws Exception {
-    return myMenus(gApi.config().server().getDefaultPreferences()).keySet();
-  }
-
-  private static ImmutableMap<String, String> myMenus(GeneralPreferencesInfo prefs) {
-
-    return prefs.my.stream().collect(toImmutableMap(i -> i.name, i -> i.url));
-  }
-
-  private ObjectId metaRef(Account.Id id) throws Exception {
-    return readRef(RefNames.refsUsers(id))
-        .orElseThrow(() -> new AssertionError("missing ref for account " + id));
-  }
-
-  private Optional<ObjectId> readRef(String ref) throws Exception {
-    try (Repository repo = repoManager.openRepository(allUsersName)) {
-      return Optional.ofNullable(repo.exactRef(ref)).map(Ref::getObjectId);
-    }
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/tools/hooks/CommitMsgHookTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/tools/hooks/CommitMsgHookTest.java
deleted file mode 100644
index bd54ddc..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/tools/hooks/CommitMsgHookTest.java
+++ /dev/null
@@ -1,666 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.tools.hooks;
-
-import static com.google.common.truth.Truth.assertWithMessage;
-import static com.google.common.truth.TruthJUnit.assume;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import com.google.gerrit.server.util.HostPlatform;
-import java.io.File;
-import java.io.IOException;
-import java.util.Date;
-import java.util.TimeZone;
-import org.eclipse.jgit.dircache.DirCacheBuilder;
-import org.eclipse.jgit.dircache.DirCacheEntry;
-import org.eclipse.jgit.lib.CommitBuilder;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.FileMode;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.RefUpdate.Result;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-public class CommitMsgHookTest extends HookTestCase {
-  private final String SOB1 = "Signed-off-by: J Author <ja@example.com>\n";
-  private final String SOB2 = "Signed-off-by: J Committer <jc@example.com>\n";
-
-  @BeforeClass
-  public static void skipIfWin32Platform() {
-    assume().that(HostPlatform.isWin32()).isFalse();
-  }
-
-  @Override
-  @Before
-  public void setUp() throws Exception {
-    super.setUp();
-    final Date when = author.getWhen();
-    final TimeZone tz = author.getTimeZone();
-
-    author = new PersonIdent("J. Author", "ja@example.com");
-    author = new PersonIdent(author, when, tz);
-
-    committer = new PersonIdent("J. Committer", "jc@example.com");
-    committer = new PersonIdent(committer, when, tz);
-  }
-
-  @Test
-  public void emptyMessages() throws Exception {
-    // Empty input must yield empty output so commit will abort.
-    // Note we must consider different commit templates formats.
-    //
-    hookDoesNotModify("");
-    hookDoesNotModify(" ");
-    hookDoesNotModify("\n");
-    hookDoesNotModify("\n\n");
-    hookDoesNotModify("  \n  ");
-
-    hookDoesNotModify("#");
-    hookDoesNotModify("#\n");
-    hookDoesNotModify("# on branch master\n# Untracked files:\n");
-    hookDoesNotModify("\n# on branch master\n# Untracked files:\n");
-    hookDoesNotModify("\n\n# on branch master\n# Untracked files:\n");
-
-    hookDoesNotModify(
-        "\n# on branch master\ndiff --git a/src b/src\n"
-            + "new file mode 100644\nindex 0000000..c78b7f0\n");
-  }
-
-  @Test
-  public void changeIdAlreadySet() throws Exception {
-    // If a Change-Id is already present in the footer, the hook must
-    // not modify the message but instead must leave the identity alone.
-    //
-    hookDoesNotModify(
-        "a\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: Iaeac9b4149291060228ef0154db2985a31111335\n");
-    hookDoesNotModify(
-        "fix: this thing\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: I388bdaf52ed05b55e62a22d0a20d2c1ae0d33e7e\n");
-    hookDoesNotModify(
-        "fix-a-widget: this thing\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: Id3bc5359d768a6400450283e12bdfb6cd135ea4b\n");
-    hookDoesNotModify(
-        "FIX: this thing\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: I1b55098b5a2cce0b3f3da783dda50d5f79f873fa\n");
-    hookDoesNotModify(
-        "Fix-A-Widget: this thing\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: I4f4e2e1e8568ddc1509baecb8c1270a1fb4b6da7\n");
-  }
-
-  @Test
-  public void timeAltersId() throws Exception {
-    assertEquals(
-        "a\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: I7fc3876fee63c766a2063df97fbe04a2dddd8d7c\n", //
-        call("a\n"));
-
-    tick();
-    assertEquals(
-        "a\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: I3251906b99dda598a58a6346d8126237ee1ea800\n", //
-        call("a\n"));
-
-    tick();
-    assertEquals(
-        "a\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: I69adf9208d828f41a3d7e41afbca63aff37c0c5c\n", //
-        call("a\n"));
-  }
-
-  @Test
-  public void firstParentAltersId() throws Exception {
-    assertEquals(
-        "a\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: I7fc3876fee63c766a2063df97fbe04a2dddd8d7c\n", //
-        call("a\n"));
-
-    setHEAD();
-    assertEquals(
-        "a\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: I51e86482bde7f92028541aaf724d3a3f996e7ea2\n", //
-        call("a\n"));
-  }
-
-  @Test
-  public void dirCacheAltersId() throws Exception {
-    assertEquals(
-        "a\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: I7fc3876fee63c766a2063df97fbe04a2dddd8d7c\n", //
-        call("a\n"));
-
-    final DirCacheBuilder builder = repository.lockDirCache().builder();
-    builder.add(file("A"));
-    assertTrue(builder.commit());
-
-    assertEquals(
-        "a\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: If56597ea9759f23b070677ea6f064c60c38da631\n", //
-        call("a\n"));
-  }
-
-  @Test
-  public void singleLineMessages() throws Exception {
-    assertEquals(
-        "a\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: I7fc3876fee63c766a2063df97fbe04a2dddd8d7c\n", //
-        call("a\n"));
-
-    assertEquals(
-        "fix: this thing\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: I0f13d0e6c739ca3ae399a05a93792e80feb97f37\n", //
-        call("fix: this thing\n"));
-    assertEquals(
-        "fix-a-widget: this thing\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: I1a1a0c751e4273d532e4046a501a612b9b8a775e\n", //
-        call("fix-a-widget: this thing\n"));
-
-    assertEquals(
-        "FIX: this thing\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: If816d944c57d3893b60cf10c65931fead1290d97\n", //
-        call("FIX: this thing\n"));
-    assertEquals(
-        "Fix-A-Widget: this thing\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: I3e18d00cbda2ba1f73aeb63ed8c7d57d7fd16c76\n", //
-        call("Fix-A-Widget: this thing\n"));
-  }
-
-  @Test
-  public void multiLineMessagesWithoutFooter() throws Exception {
-    assertEquals(
-        "a\n"
-            + //
-            "\n"
-            + //
-            "b\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: Id0b4f42d3d6fc1569595c9b97cb665e738486f5d\n", //
-        call("a\n\nb\n"));
-
-    assertEquals(
-        "a\n"
-            + //
-            "\n"
-            + //
-            "b\nc\nd\ne\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: I7d237b20058a0f46cc3f5fabc4a0476877289d75\n", //
-        call("a\n\nb\nc\nd\ne\n"));
-
-    assertEquals(
-        "a\n"
-            + //
-            "\n"
-            + //
-            "b\nc\nd\ne\n"
-            + //
-            "\n"
-            + //
-            "f\ng\nh\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: I382e662f47bf164d6878b7fe61637873ab7fa4e8\n", //
-        call("a\n\nb\nc\nd\ne\n\nf\ng\nh\n"));
-  }
-
-  @Test
-  public void singleLineMessagesWithSignedOffBy() throws Exception {
-    assertEquals(
-        "a\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: I7fc3876fee63c766a2063df97fbe04a2dddd8d7c\n"
-            + //
-            SOB1, //
-        call("a\n\n" + SOB1));
-
-    assertEquals(
-        "a\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: I7fc3876fee63c766a2063df97fbe04a2dddd8d7c\n"
-            + //
-            SOB1
-            + //
-            SOB2, //
-        call("a\n\n" + SOB1 + SOB2));
-  }
-
-  @Test
-  public void multiLineMessagesWithSignedOffBy() throws Exception {
-    assertEquals(
-        "a\n"
-            + //
-            "\n"
-            + //
-            "b\nc\nd\ne\n"
-            + //
-            "\n"
-            + //
-            "f\ng\nh\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: I382e662f47bf164d6878b7fe61637873ab7fa4e8\n"
-            + //
-            SOB1, //
-        call("a\n\nb\nc\nd\ne\n\nf\ng\nh\n\n" + SOB1));
-
-    assertEquals(
-        "a\n"
-            + //
-            "\n"
-            + //
-            "b\nc\nd\ne\n"
-            + //
-            "\n"
-            + //
-            "f\ng\nh\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: I382e662f47bf164d6878b7fe61637873ab7fa4e8\n"
-            + //
-            SOB1
-            + //
-            SOB2, //
-        call(
-            "a\n"
-                + //
-                "\n"
-                + //
-                "b\nc\nd\ne\n"
-                + //
-                "\n"
-                + //
-                "f\ng\nh\n"
-                + //
-                "\n"
-                + //
-                SOB1
-                + //
-                SOB2));
-
-    assertEquals(
-        "a\n"
-            + //
-            "\n"
-            + //
-            "b: not a footer\nc\nd\ne\n"
-            + //
-            "\n"
-            + //
-            "f\ng\nh\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: I8869aabd44b3017cd55d2d7e0d546a03e3931ee2\n"
-            + //
-            SOB1
-            + //
-            SOB2, //
-        call(
-            "a\n"
-                + //
-                "\n"
-                + //
-                "b: not a footer\nc\nd\ne\n"
-                + //
-                "\n"
-                + //
-                "f\ng\nh\n"
-                + //
-                "\n"
-                + //
-                SOB1
-                + //
-                SOB2));
-  }
-
-  @Test
-  public void noteInMiddle() throws Exception {
-    assertEquals(
-        "a\n"
-            + //
-            "\n"
-            + //
-            "NOTE: This\n"
-            + //
-            "does not fix it.\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: I988a127969a6ee5e58db546aab74fc46e66847f8\n", //
-        call(
-            "a\n"
-                + //
-                "\n"
-                + //
-                "NOTE: This\n"
-                + //
-                "does not fix it.\n"));
-  }
-
-  @Test
-  public void kernelStyleFooter() throws Exception {
-    assertEquals(
-        "a\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: I1bd787f9e7590a2ac82b02c404c955ffb21877c4\n"
-            + //
-            SOB1
-            + //
-            "[ja: Fixed\n"
-            + //
-            "     the indentation]\n"
-            + //
-            SOB2, //
-        call(
-            "a\n"
-                + //
-                "\n"
-                + //
-                SOB1
-                + //
-                "[ja: Fixed\n"
-                + //
-                "     the indentation]\n"
-                + //
-                SOB2));
-  }
-
-  @Test
-  public void changeIdAfterBugOrIssue() throws Exception {
-    assertEquals(
-        "a\n"
-            + //
-            "\n"
-            + //
-            "Bug: 42\n"
-            + //
-            "Change-Id: I8c0321227c4324e670b9ae8cf40eccc87af21b1b\n"
-            + //
-            SOB1, //
-        call(
-            "a\n"
-                + //
-                "\n"
-                + //
-                "Bug: 42\n"
-                + //
-                SOB1));
-
-    assertEquals(
-        "a\n"
-            + //
-            "\n"
-            + //
-            "Issue: 42\n"
-            + //
-            "Change-Id: Ie66e07d89ae5b114c0975b49cf326e90331dd822\n"
-            + //
-            SOB1, //
-        call(
-            "a\n"
-                + //
-                "\n"
-                + //
-                "Issue: 42\n"
-                + //
-                SOB1));
-  }
-
-  @Test
-  public void commitDashV() throws Exception {
-    assertEquals(
-        "a\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: I7fc3876fee63c766a2063df97fbe04a2dddd8d7c\n"
-            + //
-            SOB1
-            + //
-            SOB2, //
-        call(
-            "a\n"
-                + //
-                "\n"
-                + //
-                SOB1
-                + //
-                SOB2
-                + //
-                "\n"
-                + //
-                "# on branch master\n"
-                + //
-                "diff --git a/src b/src\n"
-                + //
-                "new file mode 100644\n"
-                + //
-                "index 0000000..c78b7f0\n"));
-  }
-
-  @Test
-  public void withEndingURL() throws Exception {
-    assertEquals(
-        "a\n"
-            + //
-            "\n"
-            + //
-            "http://example.com/ fixes this\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: I3b7e4e16b503ce00f07ba6ad01d97a356dad7701\n", //
-        call(
-            "a\n"
-                + //
-                "\n"
-                + //
-                "http://example.com/ fixes this\n"));
-    assertEquals(
-        "a\n"
-            + //
-            "\n"
-            + //
-            "https://example.com/ fixes this\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: I62b9039e2fc0dce274af55e8f99312a8a80a805d\n", //
-        call(
-            "a\n"
-                + //
-                "\n"
-                + //
-                "https://example.com/ fixes this\n"));
-    assertEquals(
-        "a\n"
-            + //
-            "\n"
-            + //
-            "ftp://example.com/ fixes this\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: I71b05dc1f6b9a5540a53a693e64d58b65a8910e8\n", //
-        call(
-            "a\n"
-                + //
-                "\n"
-                + //
-                "ftp://example.com/ fixes this\n"));
-    assertEquals(
-        "a\n"
-            + //
-            "\n"
-            + //
-            "git://example.com/ fixes this\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: Id34e942baa68d790633737d815ddf11bac9183e5\n", //
-        call(
-            "a\n"
-                + //
-                "\n"
-                + //
-                "git://example.com/ fixes this\n"));
-  }
-
-  @Test
-  public void withFalseTags() throws Exception {
-    assertEquals(
-        "foo\n"
-            + //
-            "\n"
-            + //
-            "FakeLine:\n"
-            + //
-            "  foo\n"
-            + //
-            "  bar\n"
-            + //
-            "\n"
-            + //
-            "Change-Id: I67632a37fd2e08a35f766f52fc9a47f4ea868c55\n"
-            + //
-            "RealTag: abc\n", //
-        call(
-            "foo\n"
-                + //
-                "\n"
-                + //
-                "FakeLine:\n"
-                + //
-                "  foo\n"
-                + //
-                "  bar\n"
-                + //
-                "\n"
-                + //
-                "RealTag: abc\n"));
-  }
-
-  private void hookDoesNotModify(String in) throws Exception {
-    assertEquals(in, call(in));
-  }
-
-  private String call(String body) throws Exception {
-    final File tmp = write(body);
-    try {
-      final File hook = getHook("commit-msg");
-      assertEquals(0, runHook(repository, hook, tmp.getAbsolutePath()));
-      return read(tmp);
-    } finally {
-      tmp.delete();
-    }
-  }
-
-  private DirCacheEntry file(String name) throws IOException {
-    try (ObjectInserter oi = repository.newObjectInserter()) {
-      final DirCacheEntry e = new DirCacheEntry(name);
-      e.setFileMode(FileMode.REGULAR_FILE);
-      e.setObjectId(oi.insert(Constants.OBJ_BLOB, Constants.encode(name)));
-      oi.flush();
-      return e;
-    }
-  }
-
-  private void setHEAD() throws Exception {
-    try (ObjectInserter oi = repository.newObjectInserter()) {
-      final CommitBuilder commit = new CommitBuilder();
-      commit.setTreeId(oi.insert(Constants.OBJ_TREE, new byte[] {}));
-      commit.setAuthor(author);
-      commit.setCommitter(committer);
-      commit.setMessage("test\n");
-      ObjectId commitId = oi.insert(commit);
-
-      final RefUpdate ref = repository.updateRef(Constants.HEAD);
-      ref.setNewObjectId(commitId);
-      Result result = ref.forceUpdate();
-      assertWithMessage(Constants.HEAD + " did not change: " + ref.getResult())
-          .that(result)
-          .isAnyOf(Result.FAST_FORWARD, Result.FORCED, Result.NEW, Result.NO_CHANGE);
-    }
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/tools/hooks/HookTestCase.java b/gerrit-server/src/test/java/com/google/gerrit/server/tools/hooks/HookTestCase.java
deleted file mode 100644
index ac1ce53..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/tools/hooks/HookTestCase.java
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright (C) 2009 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.
-//
-// Portions related to finding the hook script to execute are:
-// Copyright (C) 2008, Imran M Yousuf <imyousuf@smartitengineering.com>
-//
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or
-// without modification, are permitted provided that the following
-// conditions are met:
-//
-// - Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//
-// - Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following
-// disclaimer in the documentation and/or other materials provided
-// with the distribution.
-//
-// - Neither the name of the Git Development Community nor the
-// names of its contributors may be used to endorse or promote
-// products derived from this software without specific prior
-// written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-// CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
-// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
-// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-package com.google.gerrit.server.tools.hooks;
-
-import static com.google.common.truth.Truth.assertWithMessage;
-
-import com.google.common.io.ByteStreams;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.URL;
-import java.nio.file.Files;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-import org.eclipse.jgit.junit.LocalDiskRepositoryTestCase;
-import org.eclipse.jgit.lib.Repository;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Ignore;
-
-@Ignore
-public abstract class HookTestCase extends LocalDiskRepositoryTestCase {
-  protected Repository repository;
-  private final Map<String, File> hooks = new TreeMap<>();
-  private final List<File> cleanup = new ArrayList<>();
-
-  @Override
-  @Before
-  public void setUp() throws Exception {
-    super.setUp();
-    repository = createWorkRepository();
-  }
-
-  @Override
-  @After
-  public void tearDown() throws Exception {
-    super.tearDown();
-    for (File p : cleanup) {
-      if (!p.delete()) {
-        p.deleteOnExit();
-      }
-    }
-    cleanup.clear();
-  }
-
-  protected File getHook(String name) throws IOException {
-    File hook = hooks.get(name);
-    if (hook != null) {
-      return hook;
-    }
-
-    String scproot = "com/google/gerrit/server/tools/root";
-    String path = scproot + "/hooks/" + name;
-    String errorMessage = "Cannot locate " + path + " in CLASSPATH";
-    URL url = cl().getResource(path);
-    assertWithMessage(errorMessage).that(url).isNotNull();
-
-    String protocol = url.getProtocol();
-    assertWithMessage("Cannot invoke " + url).that(protocol).isAnyOf("file", "jar");
-
-    if ("file".equals(protocol)) {
-      hook = new File(url.getPath());
-      assertWithMessage(errorMessage).that(hook.isFile()).isTrue();
-      long time = hook.lastModified();
-      hook.setExecutable(true);
-      hook.setLastModified(time);
-      hooks.put(name, hook);
-    } else if ("jar".equals(protocol)) {
-      try (InputStream in = url.openStream()) {
-        hook = File.createTempFile("hook_", ".sh");
-        cleanup.add(hook);
-        try (OutputStream out = Files.newOutputStream(hook.toPath())) {
-          ByteStreams.copy(in, out);
-        }
-      }
-      hook.setExecutable(true);
-      hooks.put(name, hook);
-    }
-    return hook;
-  }
-
-  private ClassLoader cl() {
-    return HookTestCase.class.getClassLoader();
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/update/BatchUpdateTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/update/BatchUpdateTest.java
deleted file mode 100644
index dba3b3d..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/update/BatchUpdateTest.java
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.update;
-
-import static org.junit.Assert.assertEquals;
-
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.lifecycle.LifecycleManager;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountManager;
-import com.google.gerrit.server.account.AuthRequest;
-import com.google.gerrit.server.schema.SchemaCreator;
-import com.google.gerrit.server.util.RequestContext;
-import com.google.gerrit.server.util.ThreadLocalRequestContext;
-import com.google.gerrit.testutil.InMemoryDatabase;
-import com.google.gerrit.testutil.InMemoryModule;
-import com.google.gerrit.testutil.InMemoryRepositoryManager;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Guice;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.Provider;
-import com.google.inject.util.Providers;
-import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-public class BatchUpdateTest {
-  @Inject private AccountManager accountManager;
-  @Inject private IdentifiedUser.GenericFactory userFactory;
-  @Inject private SchemaFactory<ReviewDb> schemaFactory;
-  @Inject private InMemoryRepositoryManager repoManager;
-  @Inject private SchemaCreator schemaCreator;
-  @Inject private ThreadLocalRequestContext requestContext;
-  @Inject private BatchUpdate.Factory batchUpdateFactory;
-
-  // Only for use in setting up/tearing down injector; other users should use schemaFactory.
-  @Inject private InMemoryDatabase inMemoryDatabase;
-
-  private LifecycleManager lifecycle;
-  private ReviewDb db;
-  private TestRepository<InMemoryRepository> repo;
-  private Project.NameKey project;
-  private IdentifiedUser user;
-
-  @Before
-  public void setUp() throws Exception {
-    Injector injector = Guice.createInjector(new InMemoryModule());
-    injector.injectMembers(this);
-    lifecycle = new LifecycleManager();
-    lifecycle.add(injector);
-    lifecycle.start();
-
-    try (ReviewDb underlyingDb = inMemoryDatabase.getDatabase().open()) {
-      schemaCreator.create(underlyingDb);
-    }
-    db = schemaFactory.open();
-    Account.Id userId = accountManager.authenticate(AuthRequest.forUser("user")).getAccountId();
-    user = userFactory.create(userId);
-
-    project = new Project.NameKey("test");
-
-    InMemoryRepository inMemoryRepo = repoManager.createRepository(project);
-    repo = new TestRepository<>(inMemoryRepo);
-
-    requestContext.setContext(
-        new RequestContext() {
-          @Override
-          public CurrentUser getUser() {
-            return user;
-          }
-
-          @Override
-          public Provider<ReviewDb> getReviewDbProvider() {
-            return Providers.of(db);
-          }
-        });
-  }
-
-  @After
-  public void tearDown() {
-    if (repo != null) {
-      repo.getRepository().close();
-    }
-    if (lifecycle != null) {
-      lifecycle.stop();
-    }
-    requestContext.setContext(null);
-    if (db != null) {
-      db.close();
-    }
-    InMemoryDatabase.drop(inMemoryDatabase);
-  }
-
-  @Test
-  public void addRefUpdateFromFastForwardCommit() throws Exception {
-    final RevCommit masterCommit = repo.branch("master").commit().create();
-    final RevCommit branchCommit = repo.branch("branch").commit().parent(masterCommit).create();
-
-    try (BatchUpdate bu = batchUpdateFactory.create(db, project, user, TimeUtil.nowTs())) {
-      bu.addRepoOnlyOp(
-          new RepoOnlyOp() {
-            @Override
-            public void updateRepo(RepoContext ctx) throws Exception {
-              ctx.addRefUpdate(masterCommit.getId(), branchCommit.getId(), "refs/heads/master");
-            }
-          });
-      bu.execute();
-    }
-
-    assertEquals(
-        repo.getRepository().exactRef("refs/heads/master").getObjectId(), branchCommit.getId());
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/update/RefUpdateUtilTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/update/RefUpdateUtilTest.java
deleted file mode 100644
index 286827a..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/update/RefUpdateUtilTest.java
+++ /dev/null
@@ -1,118 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.update;
-
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth.assert_;
-
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.server.git.LockFailureException;
-import java.io.IOException;
-import java.util.function.Consumer;
-import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
-import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
-import org.eclipse.jgit.lib.BatchRefUpdate;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.transport.ReceiveCommand;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@RunWith(JUnit4.class)
-public class RefUpdateUtilTest {
-  private static final Consumer<ReceiveCommand> OK = c -> c.setResult(ReceiveCommand.Result.OK);
-  private static final Consumer<ReceiveCommand> LOCK_FAILURE =
-      c -> c.setResult(ReceiveCommand.Result.LOCK_FAILURE);
-  private static final Consumer<ReceiveCommand> REJECTED =
-      c -> c.setResult(ReceiveCommand.Result.REJECTED_OTHER_REASON);
-  private static final Consumer<ReceiveCommand> ABORTED =
-      c -> {
-        c.setResult(ReceiveCommand.Result.NOT_ATTEMPTED);
-        ReceiveCommand.abort(ImmutableList.of(c));
-        checkState(
-            c.getResult() != ReceiveCommand.Result.NOT_ATTEMPTED
-                && c.getResult() != ReceiveCommand.Result.LOCK_FAILURE
-                && c.getResult() != ReceiveCommand.Result.OK,
-            "unexpected state after abort: %s",
-            c);
-      };
-
-  @Test
-  public void checkBatchRefUpdateResults() throws Exception {
-    checkResults(OK);
-    checkResults(OK, OK);
-
-    assertIoException(REJECTED);
-    assertIoException(OK, REJECTED);
-    assertIoException(LOCK_FAILURE, REJECTED);
-    assertIoException(LOCK_FAILURE, OK);
-    assertIoException(LOCK_FAILURE, REJECTED, OK);
-    assertIoException(LOCK_FAILURE, LOCK_FAILURE, REJECTED);
-    assertIoException(LOCK_FAILURE, ABORTED, REJECTED);
-    assertIoException(LOCK_FAILURE, ABORTED, OK);
-
-    assertLockFailureException(LOCK_FAILURE);
-    assertLockFailureException(LOCK_FAILURE, LOCK_FAILURE);
-    assertLockFailureException(LOCK_FAILURE, LOCK_FAILURE, ABORTED);
-    assertLockFailureException(LOCK_FAILURE, LOCK_FAILURE, ABORTED, ABORTED);
-    assertLockFailureException(ABORTED);
-    assertLockFailureException(ABORTED, ABORTED);
-  }
-
-  @SafeVarargs
-  private static void checkResults(Consumer<ReceiveCommand>... resultSetters) throws Exception {
-    RefUpdateUtil.checkResults(newBatchRefUpdate(resultSetters));
-  }
-
-  @SafeVarargs
-  private static void assertIoException(Consumer<ReceiveCommand>... resultSetters) {
-    try {
-      RefUpdateUtil.checkResults(newBatchRefUpdate(resultSetters));
-      assert_().fail("expected IOException");
-    } catch (IOException e) {
-      assertThat(e).isNotInstanceOf(LockFailureException.class);
-    }
-  }
-
-  @SafeVarargs
-  private static void assertLockFailureException(Consumer<ReceiveCommand>... resultSetters)
-      throws Exception {
-    try {
-      RefUpdateUtil.checkResults(newBatchRefUpdate(resultSetters));
-      assert_().fail("expected LockFailureException");
-    } catch (LockFailureException e) {
-      // Expected.
-    }
-  }
-
-  @SafeVarargs
-  private static BatchRefUpdate newBatchRefUpdate(Consumer<ReceiveCommand>... resultSetters) {
-    try (Repository repo = new InMemoryRepository(new DfsRepositoryDescription("repo"))) {
-      BatchRefUpdate bru = repo.getRefDatabase().newBatchUpdate();
-      for (int i = 0; i < resultSetters.length; i++) {
-        ReceiveCommand cmd =
-            new ReceiveCommand(
-                ObjectId.fromString(String.format("%039x1", i)),
-                ObjectId.fromString(String.format("%039x2", i)),
-                "refs/heads/branch" + i);
-        bru.addCommand(cmd);
-        resultSetters[i].accept(cmd);
-      }
-      return bru;
-    }
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/update/RepoViewTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/update/RepoViewTest.java
deleted file mode 100644
index 0ea9f83..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/update/RepoViewTest.java
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.server.update;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth8.assertThat;
-import static org.eclipse.jgit.lib.Constants.R_HEADS;
-
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.testutil.InMemoryRepositoryManager;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.lib.StoredConfig;
-import org.eclipse.jgit.transport.ReceiveCommand;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-public class RepoViewTest {
-  private static final String MASTER = "refs/heads/master";
-  private static final String BRANCH = "refs/heads/branch";
-
-  private Repository repo;
-  private TestRepository<?> tr;
-  private RepoView view;
-
-  @Before
-  public void setUp() throws Exception {
-    InMemoryRepositoryManager repoManager = new InMemoryRepositoryManager();
-    Project.NameKey project = new Project.NameKey("project");
-    repo = repoManager.createRepository(project);
-    tr = new TestRepository<>(repo);
-    tr.branch(MASTER).commit().create();
-    view = new RepoView(repoManager, project);
-  }
-
-  @After
-  public void tearDown() {
-    view.close();
-    repo.close();
-  }
-
-  @Test
-  public void getConfigIsDefensiveCopy() throws Exception {
-    StoredConfig orig = repo.getConfig();
-    orig.setString("a", "config", "option", "yes");
-    orig.save();
-
-    Config copy = view.getConfig();
-    copy.setString("a", "config", "option", "no");
-
-    assertThat(orig.getString("a", "config", "option")).isEqualTo("yes");
-    assertThat(repo.getConfig().getString("a", "config", "option")).isEqualTo("yes");
-  }
-
-  @Test
-  public void getRef() throws Exception {
-    ObjectId oldMaster = repo.exactRef(MASTER).getObjectId();
-    assertThat(repo.exactRef(MASTER).getObjectId()).isEqualTo(oldMaster);
-    assertThat(repo.exactRef(BRANCH)).isNull();
-    assertThat(view.getRef(MASTER)).hasValue(oldMaster);
-    assertThat(view.getRef(BRANCH)).isEmpty();
-
-    tr.branch(MASTER).commit().create();
-    tr.branch(BRANCH).commit().create();
-    assertThat(repo.exactRef(MASTER).getObjectId()).isNotEqualTo(oldMaster);
-    assertThat(repo.exactRef(BRANCH)).isNotNull();
-    assertThat(view.getRef(MASTER)).hasValue(oldMaster);
-    assertThat(view.getRef(BRANCH)).isEmpty();
-  }
-
-  @Test
-  public void getRefsRescansWhenNotCaching() throws Exception {
-    ObjectId oldMaster = repo.exactRef(MASTER).getObjectId();
-    assertThat(view.getRefs(R_HEADS)).containsExactly("master", oldMaster);
-
-    ObjectId newBranch = tr.branch(BRANCH).commit().create();
-    assertThat(view.getRefs(R_HEADS)).containsExactly("master", oldMaster, "branch", newBranch);
-  }
-
-  @Test
-  public void getRefsUsesCachedValueMatchingGetRef() throws Exception {
-    ObjectId master1 = repo.exactRef(MASTER).getObjectId();
-    assertThat(view.getRefs(R_HEADS)).containsExactly("master", master1);
-    assertThat(view.getRef(MASTER)).hasValue(master1);
-
-    // Doesn't reflect new value for master.
-    ObjectId master2 = tr.branch(MASTER).commit().create();
-    assertThat(repo.exactRef(MASTER).getObjectId()).isEqualTo(master2);
-    assertThat(view.getRefs(R_HEADS)).containsExactly("master", master1);
-
-    // Branch wasn't previously cached, so does reflect new value.
-    ObjectId branch1 = tr.branch(BRANCH).commit().create();
-    assertThat(view.getRefs(R_HEADS)).containsExactly("master", master1, "branch", branch1);
-
-    // Looking up branch causes it to be cached.
-    assertThat(view.getRef(BRANCH)).hasValue(branch1);
-    ObjectId branch2 = tr.branch(BRANCH).commit().create();
-    assertThat(repo.exactRef(BRANCH).getObjectId()).isEqualTo(branch2);
-    assertThat(view.getRefs(R_HEADS)).containsExactly("master", master1, "branch", branch1);
-  }
-
-  @Test
-  public void getRefsReflectsCommands() throws Exception {
-    ObjectId master1 = repo.exactRef(MASTER).getObjectId();
-    assertThat(view.getRefs(R_HEADS)).containsExactly("master", master1);
-
-    ObjectId master2 = tr.commit().create();
-    view.getCommands().add(new ReceiveCommand(master1, master2, MASTER));
-
-    assertThat(repo.exactRef(MASTER).getObjectId()).isEqualTo(master1);
-    assertThat(view.getRef(MASTER)).hasValue(master2);
-    assertThat(view.getRefs(R_HEADS)).containsExactly("master", master2);
-
-    view.getCommands().add(new ReceiveCommand(master2, ObjectId.zeroId(), MASTER));
-
-    assertThat(repo.exactRef(MASTER).getObjectId()).isEqualTo(master1);
-    assertThat(view.getRef(MASTER)).isEmpty();
-    assertThat(view.getRefs(R_HEADS)).isEmpty();
-  }
-
-  @Test
-  public void getRefsOverwritesCachedValueWithCommand() throws Exception {
-    ObjectId master1 = repo.exactRef(MASTER).getObjectId();
-    assertThat(view.getRef(MASTER)).hasValue(master1);
-
-    ObjectId master2 = tr.commit().create();
-    view.getCommands().add(new ReceiveCommand(master1, master2, MASTER));
-
-    assertThat(repo.exactRef(MASTER).getObjectId()).isEqualTo(master1);
-    assertThat(view.getRef(MASTER)).hasValue(master2);
-    assertThat(view.getRefs(R_HEADS)).containsExactly("master", master2);
-
-    view.getCommands().add(new ReceiveCommand(master2, ObjectId.zeroId(), MASTER));
-
-    assertThat(repo.exactRef(MASTER).getObjectId()).isEqualTo(master1);
-    assertThat(view.getRef(MASTER)).isEmpty();
-    assertThat(view.getRefs(R_HEADS)).isEmpty();
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/util/IdGeneratorTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/util/IdGeneratorTest.java
deleted file mode 100644
index 39afcac..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/util/IdGeneratorTest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.util;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import java.util.HashSet;
-import org.junit.Test;
-
-public class IdGeneratorTest {
-  @Test
-  public void test1234() {
-    final HashSet<Integer> seen = new HashSet<>();
-    for (int i = 0; i < 1 << 16; i++) {
-      final int e = IdGenerator.mix(i);
-      assertTrue("no duplicates", seen.add(e));
-      assertEquals("mirror image", i, IdGenerator.unmix(e));
-    }
-    assertEquals(0x801234ab, IdGenerator.unmix(IdGenerator.mix(0x801234ab)));
-    assertEquals(0xc0ffee12, IdGenerator.unmix(IdGenerator.mix(0xc0ffee12)));
-    assertEquals(0xdeadbeef, IdGenerator.unmix(IdGenerator.mix(0xdeadbeef)));
-    assertEquals(0x0b966b11, IdGenerator.unmix(IdGenerator.mix(0x0b966b11)));
-  }
-
-  @Test
-  public void format() {
-    assertEquals("0000000f", IdGenerator.format(0xf));
-    assertEquals("801234ab", IdGenerator.format(0x801234ab));
-    assertEquals("deadbeef", IdGenerator.format(0xdeadbeef));
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/util/ParboiledTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/util/ParboiledTest.java
deleted file mode 100644
index 3bcfb56..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/util/ParboiledTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.util;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.parboiled.BaseParser;
-import org.parboiled.Parboiled;
-import org.parboiled.Rule;
-import org.parboiled.annotations.BuildParseTree;
-import org.parboiled.parserunners.ReportingParseRunner;
-import org.parboiled.support.ParseTreeUtils;
-import org.parboiled.support.ParsingResult;
-
-public class ParboiledTest {
-
-  private static final String EXPECTED =
-      "[Expression] '42'\n"
-          + "  [Term] '42'\n"
-          + "    [Factor] '42'\n"
-          + "      [Number] '42'\n"
-          + "        [0..9] '4'\n"
-          + "        [0..9] '2'\n"
-          + "    [zeroOrMore]\n"
-          + "  [zeroOrMore]\n";
-
-  private CalculatorParser parser;
-
-  @Before
-  public void setUp() {
-    parser = Parboiled.createParser(CalculatorParser.class);
-  }
-
-  @Test
-  public void test() {
-    ParsingResult<String> result = new ReportingParseRunner<String>(parser.Expression()).run("42");
-    assertThat(result.isSuccess()).isTrue();
-    // next test is optional; we could stop here.
-    assertThat(ParseTreeUtils.printNodeTree(result)).isEqualTo(EXPECTED);
-  }
-
-  @BuildParseTree
-  static class CalculatorParser extends BaseParser<Object> {
-    Rule Expression() {
-      return sequence(Term(), zeroOrMore(anyOf("+-"), Term()));
-    }
-
-    Rule Term() {
-      return sequence(Factor(), zeroOrMore(anyOf("*/"), Factor()));
-    }
-
-    Rule Factor() {
-      return firstOf(Number(), sequence('(', Expression(), ')'));
-    }
-
-    Rule Number() {
-      return oneOrMore(charRange('0', '9'));
-    }
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/util/RegexListSearcherTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/util/RegexListSearcherTest.java
deleted file mode 100644
index dc8c0d8..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/util/RegexListSearcherTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.server.util;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Ordering;
-import java.util.List;
-import org.junit.Test;
-
-public class RegexListSearcherTest {
-  private static final ImmutableList<String> EMPTY = ImmutableList.of();
-
-  @Test
-  public void emptyList() {
-    assertSearchReturns(EMPTY, "pat", EMPTY);
-  }
-
-  @Test
-  public void hasMatch() {
-    List<String> list = ImmutableList.of("bar", "foo", "quux");
-    assertTrue(RegexListSearcher.ofStrings("foo").hasMatch(list));
-    assertFalse(RegexListSearcher.ofStrings("xyz").hasMatch(list));
-  }
-
-  @Test
-  public void anchors() {
-    List<String> list = ImmutableList.of("foo");
-    assertSearchReturns(list, "^f.*", list);
-    assertSearchReturns(list, "^f.*o$", list);
-    assertSearchReturns(list, "f.*o$", list);
-    assertSearchReturns(list, "f.*o$", list);
-    assertSearchReturns(EMPTY, "^.*\\$", list);
-  }
-
-  @Test
-  public void noCommonPrefix() {
-    List<String> list = ImmutableList.of("bar", "foo", "quux");
-    assertSearchReturns(ImmutableList.of("foo"), "f.*", list);
-    assertSearchReturns(ImmutableList.of("foo"), ".*o.*", list);
-    assertSearchReturns(ImmutableList.of("bar", "foo", "quux"), ".*[aou].*", list);
-  }
-
-  @Test
-  public void commonPrefix() {
-    List<String> list = ImmutableList.of("bar", "baz", "foo1", "foo2", "foo3", "quux");
-    assertSearchReturns(ImmutableList.of("bar", "baz"), "b.*", list);
-    assertSearchReturns(ImmutableList.of("foo1", "foo2"), "foo[12]", list);
-    assertSearchReturns(ImmutableList.of("foo1", "foo2", "foo3"), "foo.*", list);
-    assertSearchReturns(ImmutableList.of("quux"), "q.*", list);
-  }
-
-  private void assertSearchReturns(List<?> expected, String re, List<String> inputs) {
-    assertTrue(Ordering.natural().isOrdered(inputs));
-    assertEquals(expected, ImmutableList.copyOf(RegexListSearcher.ofStrings(re).search(inputs)));
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/util/SocketUtilTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/util/SocketUtilTest.java
deleted file mode 100644
index 473c44d..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/server/util/SocketUtilTest.java
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.server.util;
-
-import static com.google.gerrit.server.util.SocketUtil.hostname;
-import static com.google.gerrit.server.util.SocketUtil.isIPv6;
-import static com.google.gerrit.server.util.SocketUtil.parse;
-import static com.google.gerrit.server.util.SocketUtil.resolve;
-import static java.net.InetAddress.getByName;
-import static java.net.InetSocketAddress.createUnresolved;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import com.google.gerrit.testutil.GerritBaseTests;
-import java.net.Inet4Address;
-import java.net.Inet6Address;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.UnknownHostException;
-import org.junit.Test;
-
-public class SocketUtilTest extends GerritBaseTests {
-  @Test
-  public void testIsIPv6() throws UnknownHostException {
-    final InetAddress ipv6 = getByName("1:2:3:4:5:6:7:8");
-    assertTrue(ipv6 instanceof Inet6Address);
-    assertTrue(isIPv6(ipv6));
-
-    final InetAddress ipv4 = getByName("127.0.0.1");
-    assertTrue(ipv4 instanceof Inet4Address);
-    assertFalse(isIPv6(ipv4));
-  }
-
-  @Test
-  public void testHostname() {
-    assertEquals("*", hostname(new InetSocketAddress(80)));
-    assertEquals("localhost", hostname(new InetSocketAddress("localhost", 80)));
-    assertEquals("foo", hostname(createUnresolved("foo", 80)));
-  }
-
-  @Test
-  public void testFormat() throws UnknownHostException {
-    assertEquals("*:1234", SocketUtil.format(new InetSocketAddress(1234), 80));
-    assertEquals("*", SocketUtil.format(new InetSocketAddress(80), 80));
-
-    assertEquals("foo:1234", SocketUtil.format(createUnresolved("foo", 1234), 80));
-    assertEquals("foo", SocketUtil.format(createUnresolved("foo", 80), 80));
-
-    assertEquals(
-        "[1:2:3:4:5:6:7:8]:1234", //
-        SocketUtil.format(new InetSocketAddress(getByName("1:2:3:4:5:6:7:8"), 1234), 80));
-    assertEquals(
-        "[1:2:3:4:5:6:7:8]", //
-        SocketUtil.format(new InetSocketAddress(getByName("1:2:3:4:5:6:7:8"), 80), 80));
-
-    assertEquals(
-        "localhost:1234", //
-        SocketUtil.format(new InetSocketAddress("localhost", 1234), 80));
-    assertEquals(
-        "localhost", //
-        SocketUtil.format(new InetSocketAddress("localhost", 80), 80));
-  }
-
-  @Test
-  public void testParse() {
-    assertEquals(new InetSocketAddress(1234), parse("*:1234", 80));
-    assertEquals(new InetSocketAddress(80), parse("*", 80));
-    assertEquals(new InetSocketAddress(1234), parse(":1234", 80));
-    assertEquals(new InetSocketAddress(80), parse("", 80));
-
-    assertEquals(
-        createUnresolved("1:2:3:4:5:6:7:8", 1234), //
-        parse("[1:2:3:4:5:6:7:8]:1234", 80));
-    assertEquals(
-        createUnresolved("1:2:3:4:5:6:7:8", 80), //
-        parse("[1:2:3:4:5:6:7:8]", 80));
-
-    assertEquals(
-        createUnresolved("localhost", 1234), //
-        parse("[localhost]:1234", 80));
-    assertEquals(
-        createUnresolved("localhost", 80), //
-        parse("[localhost]", 80));
-
-    assertEquals(
-        createUnresolved("foo.bar.example.com", 1234), //
-        parse("[foo.bar.example.com]:1234", 80));
-    assertEquals(
-        createUnresolved("foo.bar.example.com", 80), //
-        parse("[foo.bar.example.com]", 80));
-  }
-
-  @Test
-  public void testParseInvalidIPv6() {
-    exception.expect(IllegalArgumentException.class);
-    exception.expectMessage("invalid IPv6: [:3");
-    parse("[:3", 80);
-  }
-
-  @Test
-  public void testParseInvalidPort() {
-    exception.expect(IllegalArgumentException.class);
-    exception.expectMessage("invalid port: localhost:A");
-    parse("localhost:A", 80);
-  }
-
-  @Test
-  public void testResolve() throws UnknownHostException {
-    assertEquals(new InetSocketAddress(1234), resolve("*:1234", 80));
-    assertEquals(new InetSocketAddress(80), resolve("*", 80));
-    assertEquals(new InetSocketAddress(1234), resolve(":1234", 80));
-    assertEquals(new InetSocketAddress(80), resolve("", 80));
-
-    assertEquals(
-        new InetSocketAddress(getByName("1:2:3:4:5:6:7:8"), 1234), //
-        resolve("[1:2:3:4:5:6:7:8]:1234", 80));
-    assertEquals(
-        new InetSocketAddress(getByName("1:2:3:4:5:6:7:8"), 80), //
-        resolve("[1:2:3:4:5:6:7:8]", 80));
-
-    assertEquals(
-        new InetSocketAddress(getByName("localhost"), 1234), //
-        resolve("[localhost]:1234", 80));
-    assertEquals(
-        new InetSocketAddress(getByName("localhost"), 80), //
-        resolve("[localhost]", 80));
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/ConfigSuite.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/ConfigSuite.java
deleted file mode 100644
index 255cd3e..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/testutil/ConfigSuite.java
+++ /dev/null
@@ -1,309 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.testutil;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static java.util.stream.Collectors.toSet;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import java.lang.annotation.Annotation;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.util.List;
-import java.util.Map;
-import org.junit.runner.Runner;
-import org.junit.runners.BlockJUnit4ClassRunner;
-import org.junit.runners.Suite;
-import org.junit.runners.model.FrameworkMethod;
-import org.junit.runners.model.InitializationError;
-
-/**
- * Suite to run tests with different {@code gerrit.config} values.
- *
- * <p>For each {@link Config} method in the class and base classes, a new group of tests is created
- * with the {@link Parameter} field set to the config.
- *
- * <pre>
- * {@literal @}RunWith(ConfigSuite.class)
- * public abstract class MyAbstractTest {
- *   {@literal @}ConfigSuite.Parameter
- *   protected Config cfg;
- *
- *   {@literal @}ConfigSuite.Config
- *   public static Config firstConfig() {
- *     Config cfg = new Config();
- *     cfg.setString("gerrit", null, "testValue", "a");
- *   }
- * }
- *
- * public class MyTest extends MyAbstractTest {
- *   {@literal @}ConfigSuite.Config
- *   public static Config secondConfig() {
- *     Config cfg = new Config();
- *     cfg.setString("gerrit", null, "testValue", "b");
- *   }
- *
- *   {@literal @}Test
- *   public void myTest() {
- *     // Test using cfg.
- *   }
- * }
- * </pre>
- *
- * This creates a suite of tests with three groups:
- *
- * <ul>
- *   <li><strong>default</strong>: {@code MyTest.myTest}
- *   <li><strong>firstConfig</strong>: {@code MyTest.myTest[firstConfig]}
- *   <li><strong>secondConfig</strong>: {@code MyTest.myTest[secondConfig]}
- * </ul>
- *
- * Additionally, config values used by <strong>default</strong> can be set in a method annotated
- * with {@code @ConfigSuite.Default}.
- *
- * <p>In addition groups of tests for different configurations can be defined by annotating a method
- * that returns a Map&lt;String, Config&gt; with {@link Configs}. The map keys define the test suite
- * names, while the values define the configurations for the test suites.
- *
- * <pre>
- * {@literal @}ConfigSuite.Configs
- * public static Map&lt;String, Config&gt; configs() {
- *   Config cfgA = new Config();
- *   cfgA.setString("gerrit", null, "testValue", "a");
- *   Config cfgB = new Config();
- *   cfgB.setString("gerrit", null, "testValue", "b");
- *   return ImmutableMap.of("testWithValueA", cfgA, "testWithValueB", cfgB);
- * }
- * </pre>
- *
- * <p>The name of the config method corresponding to the currently-running test can be stored in a
- * field annotated with {@code @ConfigSuite.Name}.
- */
-public class ConfigSuite extends Suite {
-  public static final String DEFAULT = "default";
-
-  @Target({METHOD})
-  @Retention(RUNTIME)
-  public static @interface Default {}
-
-  @Target({METHOD})
-  @Retention(RUNTIME)
-  public static @interface Config {}
-
-  @Target({METHOD})
-  @Retention(RUNTIME)
-  public static @interface Configs {}
-
-  @Target({FIELD})
-  @Retention(RUNTIME)
-  public static @interface Parameter {}
-
-  @Target({FIELD})
-  @Retention(RUNTIME)
-  public static @interface Name {}
-
-  private static class ConfigRunner extends BlockJUnit4ClassRunner {
-    private final org.eclipse.jgit.lib.Config cfg;
-    private final Field parameterField;
-    private final Field nameField;
-    private final String name;
-
-    private ConfigRunner(
-        Class<?> clazz,
-        Field parameterField,
-        Field nameField,
-        String name,
-        org.eclipse.jgit.lib.Config cfg)
-        throws InitializationError {
-      super(clazz);
-      this.parameterField = parameterField;
-      this.nameField = nameField;
-      this.name = name;
-      this.cfg = cfg;
-    }
-
-    @Override
-    public Object createTest() throws Exception {
-      Object test = getTestClass().getJavaClass().getDeclaredConstructor().newInstance();
-      parameterField.set(test, new org.eclipse.jgit.lib.Config(cfg));
-      if (nameField != null) {
-        nameField.set(test, name);
-      }
-      return test;
-    }
-
-    @Override
-    protected String getName() {
-      return MoreObjects.firstNonNull(name, DEFAULT);
-    }
-
-    @Override
-    protected String testName(FrameworkMethod method) {
-      String n = method.getName();
-      return name == null ? n : n + "[" + name + "]";
-    }
-  }
-
-  private static List<Runner> runnersFor(Class<?> clazz) {
-    Method defaultConfig = getDefaultConfig(clazz);
-    List<Method> configs = getConfigs(clazz);
-    Map<String, org.eclipse.jgit.lib.Config> configMap =
-        callConfigMapMethod(getConfigMap(clazz), configs);
-
-    Field parameterField = getOnlyField(clazz, Parameter.class);
-    checkArgument(parameterField != null, "No @ConfigSuite.Parameter found");
-    Field nameField = getOnlyField(clazz, Name.class);
-    List<Runner> result = Lists.newArrayListWithCapacity(configs.size() + 1);
-    try {
-      result.add(
-          new ConfigRunner(
-              clazz, parameterField, nameField, null, callConfigMethod(defaultConfig)));
-      for (Method m : configs) {
-        result.add(
-            new ConfigRunner(clazz, parameterField, nameField, m.getName(), callConfigMethod(m)));
-      }
-      for (Map.Entry<String, org.eclipse.jgit.lib.Config> e : configMap.entrySet()) {
-        result.add(new ConfigRunner(clazz, parameterField, nameField, e.getKey(), e.getValue()));
-      }
-      return result;
-    } catch (InitializationError e) {
-      System.err.println("Errors initializing runners:");
-      for (Throwable t : e.getCauses()) {
-        t.printStackTrace();
-      }
-      throw new RuntimeException(e);
-    }
-  }
-
-  private static Method getDefaultConfig(Class<?> clazz) {
-    return getAnnotatedMethod(clazz, Default.class);
-  }
-
-  private static Method getConfigMap(Class<?> clazz) {
-    return getAnnotatedMethod(clazz, Configs.class);
-  }
-
-  private static <T extends Annotation> Method getAnnotatedMethod(
-      Class<?> clazz, Class<T> annotationClass) {
-    Method result = null;
-    for (Method m : clazz.getMethods()) {
-      T ann = m.getAnnotation(annotationClass);
-      if (ann != null) {
-        checkArgument(result == null, "Multiple methods annotated with %s: %s, %s", ann, result, m);
-        result = m;
-      }
-    }
-    return result;
-  }
-
-  private static List<Method> getConfigs(Class<?> clazz) {
-    List<Method> result = Lists.newArrayListWithExpectedSize(3);
-    for (Method m : clazz.getMethods()) {
-      Config ann = m.getAnnotation(Config.class);
-      if (ann != null) {
-        checkArgument(!m.getName().equals(DEFAULT), "%s cannot be named %s", ann, DEFAULT);
-        result.add(m);
-      }
-    }
-    return result;
-  }
-
-  private static org.eclipse.jgit.lib.Config callConfigMethod(Method m) {
-    if (m == null) {
-      return new org.eclipse.jgit.lib.Config();
-    }
-    checkArgument(
-        org.eclipse.jgit.lib.Config.class.isAssignableFrom(m.getReturnType()),
-        "%s must return Config",
-        m);
-    checkArgument((m.getModifiers() & Modifier.STATIC) != 0, "%s must be static", m);
-    checkArgument(m.getParameterTypes().length == 0, "%s must take no parameters", m);
-    try {
-      return (org.eclipse.jgit.lib.Config) m.invoke(null);
-    } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
-      throw new IllegalArgumentException(e);
-    }
-  }
-
-  private static Map<String, org.eclipse.jgit.lib.Config> callConfigMapMethod(
-      Method m, List<Method> configs) {
-    if (m == null) {
-      return ImmutableMap.of();
-    }
-    checkArgument(Map.class.isAssignableFrom(m.getReturnType()), "%s must return Map", m);
-    Type[] types = ((ParameterizedType) m.getGenericReturnType()).getActualTypeArguments();
-    checkArgument(
-        String.class.isAssignableFrom((Class<?>) types[0]),
-        "The map returned by %s must have String as key",
-        m);
-    checkArgument(
-        org.eclipse.jgit.lib.Config.class.isAssignableFrom((Class<?>) types[1]),
-        "The map returned by %s must have Config as value",
-        m);
-    checkArgument((m.getModifiers() & Modifier.STATIC) != 0, "%s must be static", m);
-    checkArgument(m.getParameterTypes().length == 0, "%s must take no parameters", m);
-    try {
-      @SuppressWarnings("unchecked")
-      Map<String, org.eclipse.jgit.lib.Config> configMap =
-          (Map<String, org.eclipse.jgit.lib.Config>) m.invoke(null);
-      checkArgument(
-          !configMap.containsKey(DEFAULT),
-          "The map returned by %s cannot contain key %s (duplicate test suite name)",
-          m,
-          DEFAULT);
-      for (String name : configs.stream().map(cm -> cm.getName()).collect(toSet())) {
-        checkArgument(
-            !configMap.containsKey(name),
-            "The map returned by %s cannot contain key %s (duplicate test suite name)",
-            m,
-            name);
-      }
-      return configMap;
-    } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
-      throw new IllegalArgumentException(e);
-    }
-  }
-
-  private static Field getOnlyField(Class<?> clazz, Class<? extends Annotation> ann) {
-    List<Field> fields = Lists.newArrayListWithExpectedSize(1);
-    for (Field f : clazz.getFields()) {
-      if (f.getAnnotation(ann) != null) {
-        fields.add(f);
-      }
-    }
-    checkArgument(
-        fields.size() <= 1,
-        "expected 1 @ConfigSuite.%s field, found: %s",
-        ann.getSimpleName(),
-        fields);
-    return Iterables.getFirst(fields, null);
-  }
-
-  public ConfigSuite(Class<?> clazz) throws InitializationError {
-    super(clazz, runnersFor(clazz));
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/DisabledReviewDb.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/DisabledReviewDb.java
deleted file mode 100644
index 123645e..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/testutil/DisabledReviewDb.java
+++ /dev/null
@@ -1,153 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.testutil;
-
-import com.google.gerrit.reviewdb.server.AccountGroupAccess;
-import com.google.gerrit.reviewdb.server.AccountGroupByIdAccess;
-import com.google.gerrit.reviewdb.server.AccountGroupByIdAudAccess;
-import com.google.gerrit.reviewdb.server.AccountGroupMemberAccess;
-import com.google.gerrit.reviewdb.server.AccountGroupMemberAuditAccess;
-import com.google.gerrit.reviewdb.server.AccountGroupNameAccess;
-import com.google.gerrit.reviewdb.server.ChangeAccess;
-import com.google.gerrit.reviewdb.server.ChangeMessageAccess;
-import com.google.gerrit.reviewdb.server.PatchLineCommentAccess;
-import com.google.gerrit.reviewdb.server.PatchSetAccess;
-import com.google.gerrit.reviewdb.server.PatchSetApprovalAccess;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.reviewdb.server.SchemaVersionAccess;
-import com.google.gerrit.reviewdb.server.SystemConfigAccess;
-import com.google.gwtorm.server.Access;
-import com.google.gwtorm.server.StatementExecutor;
-
-/** ReviewDb that is disabled for testing. */
-public class DisabledReviewDb implements ReviewDb {
-  public static class Disabled extends RuntimeException {
-    private static final long serialVersionUID = 1L;
-
-    private Disabled() {
-      super("ReviewDb is disabled for this test");
-    }
-  }
-
-  @Override
-  public void close() {
-    // Do nothing.
-  }
-
-  @Override
-  public void commit() {
-    throw new Disabled();
-  }
-
-  @Override
-  public void rollback() {
-    throw new Disabled();
-  }
-
-  @Override
-  public void updateSchema(StatementExecutor e) {
-    throw new Disabled();
-  }
-
-  @Override
-  public void pruneSchema(StatementExecutor e) {
-    throw new Disabled();
-  }
-
-  @Override
-  public Access<?, ?>[] allRelations() {
-    throw new Disabled();
-  }
-
-  @Override
-  public SchemaVersionAccess schemaVersion() {
-    throw new Disabled();
-  }
-
-  @Override
-  public SystemConfigAccess systemConfig() {
-    throw new Disabled();
-  }
-
-  @Override
-  public AccountGroupAccess accountGroups() {
-    throw new Disabled();
-  }
-
-  @Override
-  public AccountGroupNameAccess accountGroupNames() {
-    throw new Disabled();
-  }
-
-  @Override
-  public AccountGroupMemberAccess accountGroupMembers() {
-    throw new Disabled();
-  }
-
-  @Override
-  public AccountGroupMemberAuditAccess accountGroupMembersAudit() {
-    throw new Disabled();
-  }
-
-  @Override
-  public ChangeAccess changes() {
-    throw new Disabled();
-  }
-
-  @Override
-  public PatchSetApprovalAccess patchSetApprovals() {
-    throw new Disabled();
-  }
-
-  @Override
-  public ChangeMessageAccess changeMessages() {
-    throw new Disabled();
-  }
-
-  @Override
-  public PatchSetAccess patchSets() {
-    throw new Disabled();
-  }
-
-  @Override
-  public PatchLineCommentAccess patchComments() {
-    throw new Disabled();
-  }
-
-  @Override
-  public AccountGroupByIdAccess accountGroupById() {
-    throw new Disabled();
-  }
-
-  @Override
-  public AccountGroupByIdAudAccess accountGroupByIdAud() {
-    throw new Disabled();
-  }
-
-  @Override
-  public int nextAccountId() {
-    throw new Disabled();
-  }
-
-  @Override
-  public int nextAccountGroupId() {
-    throw new Disabled();
-  }
-
-  @Override
-  public int nextChangeId() {
-    throw new Disabled();
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/FakeAccountCache.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/FakeAccountCache.java
deleted file mode 100644
index b1711e2..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/testutil/FakeAccountCache.java
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.testutil;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.config.AllUsersNameProvider;
-import java.util.HashMap;
-import java.util.Map;
-
-/** Fake implementation of {@link AccountCache} for testing. */
-public class FakeAccountCache implements AccountCache {
-  private final Map<Account.Id, AccountState> byId;
-  private final Map<String, AccountState> byUsername;
-
-  public FakeAccountCache() {
-    byId = new HashMap<>();
-    byUsername = new HashMap<>();
-  }
-
-  @Override
-  public synchronized AccountState get(Account.Id accountId) {
-    AccountState state = byId.get(accountId);
-    if (state != null) {
-      return state;
-    }
-    return newState(new Account(accountId, TimeUtil.nowTs()));
-  }
-
-  @Override
-  @Nullable
-  public synchronized AccountState getOrNull(Account.Id accountId) {
-    return byId.get(accountId);
-  }
-
-  @Override
-  public synchronized AccountState getByUsername(String username) {
-    return byUsername.get(username);
-  }
-
-  @Override
-  public synchronized void evict(Account.Id accountId) {
-    byId.remove(accountId);
-  }
-
-  @Override
-  public synchronized void evictAllNoReindex() {
-    byId.clear();
-    byUsername.clear();
-  }
-
-  public synchronized void put(Account account) {
-    AccountState state = newState(account);
-    byId.put(account.getId(), state);
-    if (account.getUserName() != null) {
-      byUsername.put(account.getUserName(), state);
-    }
-  }
-
-  private static AccountState newState(Account account) {
-    return new AccountState(
-        new AllUsersName(AllUsersNameProvider.DEFAULT),
-        account,
-        ImmutableSet.of(),
-        new HashMap<>());
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/FakeAuditService.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/FakeAuditService.java
deleted file mode 100644
index 1eb5bdb..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/testutil/FakeAuditService.java
+++ /dev/null
@@ -1,89 +0,0 @@
-// 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.
-
-package com.google.gerrit.testutil;
-
-import com.google.gerrit.audit.AuditEvent;
-import com.google.gerrit.audit.AuditService;
-import com.google.gerrit.audit.GroupMemberAuditListener;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroupById;
-import com.google.gerrit.reviewdb.client.AccountGroupMember;
-import com.google.inject.AbstractModule;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-@Singleton
-public class FakeAuditService implements AuditService {
-
-  private final DynamicSet<GroupMemberAuditListener> groupMemberAuditListeners;
-
-  public static class Module extends AbstractModule {
-    @Override
-    public void configure() {
-      DynamicSet.setOf(binder(), GroupMemberAuditListener.class);
-      bind(AuditService.class).to(FakeAuditService.class);
-    }
-  }
-
-  @Inject
-  public FakeAuditService(DynamicSet<GroupMemberAuditListener> groupMemberAuditListeners) {
-    this.groupMemberAuditListeners = groupMemberAuditListeners;
-  }
-
-  public List<AuditEvent> auditEvents = new ArrayList<>();
-
-  public void clearEvents() {
-    auditEvents.clear();
-  }
-
-  @Override
-  public void dispatch(AuditEvent action) {
-    auditEvents.add(action);
-  }
-
-  @Override
-  public void dispatchAddAccountsToGroup(Account.Id actor, Collection<AccountGroupMember> added) {
-    for (GroupMemberAuditListener auditListener : groupMemberAuditListeners) {
-      auditListener.onAddAccountsToGroup(actor, added);
-    }
-  }
-
-  @Override
-  public void dispatchDeleteAccountsFromGroup(
-      Account.Id actor, Collection<AccountGroupMember> removed) {
-    for (GroupMemberAuditListener auditListener : groupMemberAuditListeners) {
-      auditListener.onDeleteAccountsFromGroup(actor, removed);
-    }
-  }
-
-  @Override
-  public void dispatchAddGroupsToGroup(Account.Id actor, Collection<AccountGroupById> added) {
-    for (GroupMemberAuditListener auditListener : groupMemberAuditListeners) {
-      auditListener.onAddGroupsToGroup(actor, added);
-    }
-  }
-
-  @Override
-  public void dispatchDeleteGroupsFromGroup(
-      Account.Id actor, Collection<AccountGroupById> removed) {
-    for (GroupMemberAuditListener auditListener : groupMemberAuditListeners) {
-      auditListener.onDeleteGroupsFromGroup(actor, removed);
-    }
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/FakeEmailSender.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/FakeEmailSender.java
deleted file mode 100644
index 427e3ef..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/testutil/FakeEmailSender.java
+++ /dev/null
@@ -1,172 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.testutil;
-
-import static java.util.stream.Collectors.toList;
-
-import com.google.auto.value.AutoValue;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.errors.EmailException;
-import com.google.gerrit.server.git.WorkQueue;
-import com.google.gerrit.server.mail.Address;
-import com.google.gerrit.server.mail.send.EmailHeader;
-import com.google.gerrit.server.mail.send.EmailSender;
-import com.google.inject.AbstractModule;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ExecutionException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Email sender implementation that records messages in memory.
- *
- * <p>This class is mostly threadsafe. The only exception is that not all {@link EmailHeader}
- * subclasses are immutable. In particular, if a caller holds a reference to an {@code AddressList}
- * and mutates it after sending, the message returned by {@link #getMessages()} may or may not
- * reflect mutations.
- */
-@Singleton
-public class FakeEmailSender implements EmailSender {
-  private static final Logger log = LoggerFactory.getLogger(FakeEmailSender.class);
-
-  public static class Module extends AbstractModule {
-    @Override
-    public void configure() {
-      bind(EmailSender.class).to(FakeEmailSender.class);
-    }
-  }
-
-  @AutoValue
-  public abstract static class Message {
-    private static Message create(
-        Address from,
-        Collection<Address> rcpt,
-        Map<String, EmailHeader> headers,
-        String body,
-        String htmlBody) {
-      return new AutoValue_FakeEmailSender_Message(
-          from, ImmutableList.copyOf(rcpt), ImmutableMap.copyOf(headers), body, htmlBody);
-    }
-
-    public abstract Address from();
-
-    public abstract ImmutableList<Address> rcpt();
-
-    public abstract ImmutableMap<String, EmailHeader> headers();
-
-    public abstract String body();
-
-    @Nullable
-    public abstract String htmlBody();
-  }
-
-  private final WorkQueue workQueue;
-  private final List<Message> messages;
-  private int messagesRead;
-
-  @Inject
-  FakeEmailSender(WorkQueue workQueue) {
-    this.workQueue = workQueue;
-    messages = Collections.synchronizedList(new ArrayList<Message>());
-    messagesRead = 0;
-  }
-
-  @Override
-  public boolean isEnabled() {
-    return true;
-  }
-
-  @Override
-  public boolean canEmail(String address) {
-    return true;
-  }
-
-  @Override
-  public void send(
-      Address from, Collection<Address> rcpt, Map<String, EmailHeader> headers, String body)
-      throws EmailException {
-    send(from, rcpt, headers, body, null);
-  }
-
-  @Override
-  public void send(
-      Address from,
-      Collection<Address> rcpt,
-      Map<String, EmailHeader> headers,
-      String body,
-      String htmlBody)
-      throws EmailException {
-    messages.add(Message.create(from, rcpt, headers, body, htmlBody));
-  }
-
-  public void clear() {
-    waitForEmails();
-    synchronized (messages) {
-      messages.clear();
-      messagesRead = 0;
-    }
-  }
-
-  public synchronized @Nullable Message peekMessage() {
-    if (messagesRead >= messages.size()) {
-      return null;
-    }
-    return messages.get(messagesRead);
-  }
-
-  public synchronized @Nullable Message nextMessage() {
-    Message msg = peekMessage();
-    messagesRead++;
-    return msg;
-  }
-
-  public ImmutableList<Message> getMessages() {
-    waitForEmails();
-    synchronized (messages) {
-      return ImmutableList.copyOf(messages);
-    }
-  }
-
-  public List<Message> getMessages(String changeId, String type) {
-    final String idFooter = "\nGerrit-Change-Id: " + changeId + "\n";
-    final String typeFooter = "\nGerrit-MessageType: " + type + "\n";
-    return getMessages().stream()
-        .filter(in -> in.body().contains(idFooter) && in.body().contains(typeFooter))
-        .collect(toList());
-  }
-
-  private void waitForEmails() {
-    // TODO(dborowitz): This is brittle; consider forcing emails to use
-    // a single thread in tests (tricky because most callers just use the
-    // default executor).
-    for (WorkQueue.Task<?> task : workQueue.getTasks()) {
-      if (task.toString().contains("send-email")) {
-        try {
-          task.get();
-        } catch (ExecutionException | InterruptedException e) {
-          log.warn("error finishing email task", e);
-        }
-      }
-    }
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/GerritBaseTests.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/GerritBaseTests.java
deleted file mode 100644
index 44e5d74..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/testutil/GerritBaseTests.java
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.testutil;
-
-import com.google.common.base.CharMatcher;
-import com.google.gwtorm.client.KeyUtil;
-import com.google.gwtorm.server.StandardKeyEncoder;
-import org.junit.Ignore;
-import org.junit.Rule;
-import org.junit.rules.ExpectedException;
-import org.junit.rules.TestName;
-
-@Ignore
-public abstract class GerritBaseTests {
-  static {
-    KeyUtil.setEncoderImpl(new StandardKeyEncoder());
-  }
-
-  @Rule public ExpectedException exception = ExpectedException.none();
-  @Rule public final TestName testName = new TestName();
-
-  protected String getSanitizedMethodName() {
-    String name = testName.getMethodName().toLowerCase();
-    name =
-        CharMatcher.inRange('a', 'z')
-            .or(CharMatcher.inRange('A', 'Z'))
-            .or(CharMatcher.inRange('0', '9'))
-            .negate()
-            .replaceFrom(name, '_');
-    name = CharMatcher.is('_').trimTrailingFrom(name);
-    return name;
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/GerritServerTests.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/GerritServerTests.java
deleted file mode 100644
index b84b8ed..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/testutil/GerritServerTests.java
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.testutil;
-
-import com.google.gerrit.server.notedb.MutableNotesMigration;
-import org.eclipse.jgit.lib.Config;
-import org.junit.Rule;
-import org.junit.rules.TestRule;
-import org.junit.runner.Description;
-import org.junit.runner.RunWith;
-import org.junit.runners.model.Statement;
-
-@RunWith(ConfigSuite.class)
-public class GerritServerTests extends GerritBaseTests {
-  @ConfigSuite.Parameter public Config config;
-
-  @ConfigSuite.Name private String configName;
-
-  protected MutableNotesMigration notesMigration;
-
-  @Rule
-  public TestRule testRunner =
-      new TestRule() {
-        @Override
-        public Statement apply(Statement base, Description description) {
-          return new Statement() {
-            @Override
-            public void evaluate() throws Throwable {
-              beforeTest();
-              try {
-                base.evaluate();
-              } finally {
-                afterTest();
-              }
-            }
-          };
-        }
-      };
-
-  public void beforeTest() throws Exception {
-    notesMigration = NoteDbMode.newNotesMigrationFromEnv();
-  }
-
-  public void afterTest() {
-    NoteDbMode.resetFromEnv(notesMigration);
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryDatabase.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryDatabase.java
deleted file mode 100644
index 21b21ef..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryDatabase.java
+++ /dev/null
@@ -1,178 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.testutil;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.gerrit.lifecycle.LifecycleManager;
-import com.google.gerrit.pgm.init.index.elasticsearch.ElasticIndexModuleOnInit;
-import com.google.gerrit.pgm.init.index.lucene.LuceneIndexModuleOnInit;
-import com.google.gerrit.reviewdb.client.CurrentSchemaVersion;
-import com.google.gerrit.reviewdb.client.SystemConfig;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.index.IndexModule;
-import com.google.gerrit.server.schema.SchemaCreator;
-import com.google.gerrit.server.schema.SchemaVersion;
-import com.google.gwtorm.jdbc.Database;
-import com.google.gwtorm.jdbc.SimpleDataSource;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.AbstractModule;
-import com.google.inject.Guice;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import java.io.IOException;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.Properties;
-import javax.sql.DataSource;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-
-/**
- * An in-memory test instance of {@link ReviewDb} database.
- *
- * <p>Test classes should create one instance of this class for each unique test database they want
- * to use. When the tests needing this instance are complete, ensure that {@link
- * #drop(InMemoryDatabase)} is called to free the resources so the JVM running the unit tests
- * doesn't run out of heap space.
- */
-public class InMemoryDatabase implements SchemaFactory<ReviewDb> {
-  public static InMemoryDatabase newDatabase(LifecycleManager lifecycle) {
-    Injector injector = Guice.createInjector(new InMemoryModule());
-    lifecycle.add(injector);
-    return injector.getInstance(InMemoryDatabase.class);
-  }
-
-  private static int dbCnt;
-
-  private static synchronized DataSource newDataSource() throws SQLException {
-    final Properties p = new Properties();
-    p.setProperty("driver", org.h2.Driver.class.getName());
-    p.setProperty("url", "jdbc:h2:mem:Test_" + (++dbCnt));
-    return new SimpleDataSource(p);
-  }
-
-  /** Drop the database from memory; does nothing if the instance was null. */
-  public static void drop(InMemoryDatabase db) {
-    if (db != null) {
-      db.drop();
-    }
-  }
-
-  private final SchemaCreator schemaCreator;
-
-  private Connection openHandle;
-  private Database<ReviewDb> database;
-  private boolean created;
-
-  @Inject
-  InMemoryDatabase(Injector injector) throws OrmException {
-    Injector childInjector =
-        injector.createChildInjector(
-            new AbstractModule() {
-              @Override
-              protected void configure() {
-                switch (IndexModule.getIndexType(injector)) {
-                  case LUCENE:
-                    install(new LuceneIndexModuleOnInit());
-                    break;
-                  case ELASTICSEARCH:
-                    install(new ElasticIndexModuleOnInit());
-                    break;
-                  default:
-                    throw new IllegalStateException("unsupported index.type");
-                }
-              }
-            });
-    this.schemaCreator = childInjector.getInstance(SchemaCreator.class);
-    initDatabase();
-  }
-
-  InMemoryDatabase(SchemaCreator schemaCreator) throws OrmException {
-    this.schemaCreator = schemaCreator;
-    initDatabase();
-  }
-
-  private void initDatabase() throws OrmException {
-    try {
-      DataSource dataSource = newDataSource();
-
-      // Open one connection. This will peg the database into memory
-      // until someone calls drop on us, allowing subsequent connections
-      // opened against the same URL to go to the same set of tables.
-      //
-      openHandle = dataSource.getConnection();
-
-      // Build the access layer around the connection factory.
-      //
-      database = new Database<>(dataSource, ReviewDb.class);
-
-    } catch (SQLException e) {
-      throw new OrmException(e);
-    }
-  }
-
-  public Database<ReviewDb> getDatabase() {
-    return database;
-  }
-
-  @Override
-  public ReviewDb open() throws OrmException {
-    return getDatabase().open();
-  }
-
-  /** Ensure the database schema has been created and initialized. */
-  public InMemoryDatabase create() throws OrmException {
-    if (!created) {
-      created = true;
-      try (ReviewDb c = open()) {
-        schemaCreator.create(c);
-      } catch (IOException | ConfigInvalidException e) {
-        throw new OrmException("Cannot create in-memory database", e);
-      }
-    }
-    return this;
-  }
-
-  /** Drop this database from memory so it no longer exists. */
-  public void drop() {
-    if (openHandle != null) {
-      try {
-        openHandle.close();
-      } catch (SQLException e) {
-        System.err.println("WARNING: Cannot close database connection");
-        e.printStackTrace(System.err);
-      }
-      openHandle = null;
-      database = null;
-    }
-  }
-
-  public SystemConfig getSystemConfig() throws OrmException {
-    try (ReviewDb c = open()) {
-      return c.systemConfig().get(new SystemConfig.Key());
-    }
-  }
-
-  public CurrentSchemaVersion getSchemaVersion() throws OrmException {
-    try (ReviewDb c = open()) {
-      return c.schemaVersion().get(new CurrentSchemaVersion.Key());
-    }
-  }
-
-  public void assertSchemaVersion() throws OrmException {
-    assertThat(getSchemaVersion().versionNbr).isEqualTo(SchemaVersion.getBinaryVersion());
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryH2Type.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryH2Type.java
deleted file mode 100644
index 7edfa1a..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryH2Type.java
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.testutil;
-
-import com.google.gerrit.server.schema.BaseDataSourceType;
-
-public class InMemoryH2Type extends BaseDataSourceType {
-
-  protected InMemoryH2Type() {
-    super(null);
-  }
-
-  @Override
-  public String getUrl() {
-    // not used
-    throw new UnsupportedOperationException();
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryModule.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryModule.java
deleted file mode 100644
index 8835150..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryModule.java
+++ /dev/null
@@ -1,314 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.testutil;
-
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.inject.Scopes.SINGLETON;
-
-import com.google.common.util.concurrent.ListeningExecutorService;
-import com.google.common.util.concurrent.MoreExecutors;
-import com.google.gerrit.audit.AuditModule;
-import com.google.gerrit.extensions.client.AuthType;
-import com.google.gerrit.extensions.config.FactoryModule;
-import com.google.gerrit.extensions.systemstatus.ServerInformation;
-import com.google.gerrit.gpg.GpgModule;
-import com.google.gerrit.index.SchemaDefinitions;
-import com.google.gerrit.metrics.DisabledMetricMaker;
-import com.google.gerrit.metrics.MetricMaker;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.GerritPersonIdent;
-import com.google.gerrit.server.GerritPersonIdentProvider;
-import com.google.gerrit.server.cache.h2.H2CacheModule;
-import com.google.gerrit.server.cache.mem.DefaultMemoryCacheModule;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.config.AllProjectsNameProvider;
-import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.config.AllUsersNameProvider;
-import com.google.gerrit.server.config.AnonymousCowardName;
-import com.google.gerrit.server.config.AnonymousCowardNameProvider;
-import com.google.gerrit.server.config.CanonicalWebUrlModule;
-import com.google.gerrit.server.config.CanonicalWebUrlProvider;
-import com.google.gerrit.server.config.GerritGlobalModule;
-import com.google.gerrit.server.config.GerritOptions;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.GerritServerId;
-import com.google.gerrit.server.config.SitePath;
-import com.google.gerrit.server.config.TrackingFooters;
-import com.google.gerrit.server.config.TrackingFootersProvider;
-import com.google.gerrit.server.git.GarbageCollection;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.PerThreadRequestScope;
-import com.google.gerrit.server.git.SearchingChangeCacheImpl;
-import com.google.gerrit.server.git.SendEmailExecutor;
-import com.google.gerrit.server.index.IndexModule.IndexType;
-import com.google.gerrit.server.index.account.AccountSchemaDefinitions;
-import com.google.gerrit.server.index.account.AllAccountsIndexer;
-import com.google.gerrit.server.index.change.AllChangesIndexer;
-import com.google.gerrit.server.index.change.ChangeSchemaDefinitions;
-import com.google.gerrit.server.index.group.AllGroupsIndexer;
-import com.google.gerrit.server.index.group.GroupSchemaDefinitions;
-import com.google.gerrit.server.mail.SignedTokenEmailTokenVerifier;
-import com.google.gerrit.server.notedb.ChangeBundleReader;
-import com.google.gerrit.server.notedb.GwtormChangeBundleReader;
-import com.google.gerrit.server.notedb.MutableNotesMigration;
-import com.google.gerrit.server.notedb.NotesMigration;
-import com.google.gerrit.server.patch.DiffExecutor;
-import com.google.gerrit.server.plugins.PluginRestApiModule;
-import com.google.gerrit.server.plugins.ServerInformationImpl;
-import com.google.gerrit.server.project.DefaultPermissionBackendModule;
-import com.google.gerrit.server.schema.DataSourceType;
-import com.google.gerrit.server.schema.InMemoryAccountPatchReviewStore;
-import com.google.gerrit.server.schema.NotesMigrationSchemaFactory;
-import com.google.gerrit.server.schema.ReviewDbFactory;
-import com.google.gerrit.server.schema.SchemaCreator;
-import com.google.gerrit.server.securestore.DefaultSecureStore;
-import com.google.gerrit.server.securestore.SecureStore;
-import com.google.gerrit.server.ssh.NoSshKeyCache;
-import com.google.gerrit.server.update.ChangeUpdateExecutor;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.AbstractModule;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import com.google.inject.Key;
-import com.google.inject.Module;
-import com.google.inject.Provider;
-import com.google.inject.Provides;
-import com.google.inject.ProvisionException;
-import com.google.inject.Singleton;
-import com.google.inject.TypeLiteral;
-import com.google.inject.servlet.RequestScoped;
-import com.google.inject.util.Providers;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.ExecutorService;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.lib.PersonIdent;
-
-public class InMemoryModule extends FactoryModule {
-  public static Config newDefaultConfig() {
-    Config cfg = new Config();
-    setDefaults(cfg);
-    return cfg;
-  }
-
-  public static void setDefaults(Config cfg) {
-    cfg.setEnum("auth", null, "type", AuthType.DEVELOPMENT_BECOME_ANY_ACCOUNT);
-    cfg.setString("gerrit", null, "allProjects", "Test-Projects");
-    cfg.setString("gerrit", null, "basePath", "git");
-    cfg.setString("gerrit", null, "canonicalWebUrl", "http://test/");
-    cfg.setString("user", null, "name", "Gerrit Code Review");
-    cfg.setString("user", null, "email", "gerrit@localhost");
-    cfg.unset("cache", null, "directory");
-    cfg.setString("index", null, "type", "lucene");
-    cfg.setBoolean("index", "lucene", "testInmemory", true);
-    cfg.setInt("sendemail", null, "threadPoolSize", 0);
-    cfg.setBoolean("receive", null, "enableSignedPush", false);
-    cfg.setString("receive", null, "certNonceSeed", "sekret");
-  }
-
-  private final Config cfg;
-  private final MutableNotesMigration notesMigration;
-
-  public InMemoryModule() {
-    this(newDefaultConfig(), NoteDbMode.newNotesMigrationFromEnv());
-  }
-
-  public InMemoryModule(Config cfg, MutableNotesMigration notesMigration) {
-    this.cfg = cfg;
-    this.notesMigration = notesMigration;
-  }
-
-  public void inject(Object instance) {
-    Guice.createInjector(this).injectMembers(instance);
-  }
-
-  @Override
-  protected void configure() {
-    // Do NOT bind @RemotePeer, as it is bound in a child injector of
-    // ChangeMergeQueue (bound via GerritGlobalModule below), so there cannot be
-    // a binding in the parent injector. If you need @RemotePeer, you must bind
-    // it in a child injector of the one containing InMemoryModule. But unless
-    // you really need to test something request-scoped, you likely don't
-    // actually need it.
-
-    // For simplicity, don't create child injectors, just use this one to get a
-    // few required modules.
-    Injector cfgInjector =
-        Guice.createInjector(
-            new AbstractModule() {
-              @Override
-              protected void configure() {
-                bind(Config.class).annotatedWith(GerritServerConfig.class).toInstance(cfg);
-              }
-            });
-    bind(MetricMaker.class).to(DisabledMetricMaker.class);
-    install(cfgInjector.getInstance(GerritGlobalModule.class));
-    install(new DefaultPermissionBackendModule());
-    install(new SearchingChangeCacheImpl.Module());
-    factory(GarbageCollection.Factory.class);
-    install(new AuditModule());
-
-    bindScope(RequestScoped.class, PerThreadRequestScope.REQUEST);
-
-    // TODO(dborowitz): Use jimfs.
-    bind(Path.class).annotatedWith(SitePath.class).toInstance(Paths.get("."));
-    bind(Config.class).annotatedWith(GerritServerConfig.class).toInstance(cfg);
-    bind(GerritOptions.class).toInstance(new GerritOptions(cfg, false, false, false));
-    bind(PersonIdent.class)
-        .annotatedWith(GerritPersonIdent.class)
-        .toProvider(GerritPersonIdentProvider.class);
-    bind(String.class)
-        .annotatedWith(AnonymousCowardName.class)
-        .toProvider(AnonymousCowardNameProvider.class);
-    bind(String.class).annotatedWith(GerritServerId.class).toInstance("gerrit");
-    bind(AllProjectsName.class).toProvider(AllProjectsNameProvider.class);
-    bind(AllUsersName.class).toProvider(AllUsersNameProvider.class);
-    bind(GitRepositoryManager.class).to(InMemoryRepositoryManager.class);
-    bind(InMemoryRepositoryManager.class).in(SINGLETON);
-    bind(TrackingFooters.class).toProvider(TrackingFootersProvider.class).in(SINGLETON);
-    bind(MutableNotesMigration.class).toInstance(notesMigration);
-    bind(NotesMigration.class).to(MutableNotesMigration.class);
-    bind(ListeningExecutorService.class)
-        .annotatedWith(ChangeUpdateExecutor.class)
-        .toInstance(MoreExecutors.newDirectExecutorService());
-    bind(DataSourceType.class).to(InMemoryH2Type.class);
-    bind(ChangeBundleReader.class).to(GwtormChangeBundleReader.class);
-    bind(SecureStore.class).to(DefaultSecureStore.class);
-
-    TypeLiteral<SchemaFactory<ReviewDb>> schemaFactory =
-        new TypeLiteral<SchemaFactory<ReviewDb>>() {};
-    bind(schemaFactory).to(NotesMigrationSchemaFactory.class);
-    bind(Key.get(schemaFactory, ReviewDbFactory.class)).to(InMemoryDatabase.class);
-
-    install(NoSshKeyCache.module());
-    install(
-        new CanonicalWebUrlModule() {
-          @Override
-          protected Class<? extends Provider<String>> provider() {
-            return CanonicalWebUrlProvider.class;
-          }
-        });
-    // Replacement of DiffExecutorModule to not use thread pool in the tests
-    install(
-        new AbstractModule() {
-          @Override
-          protected void configure() {}
-
-          @Provides
-          @Singleton
-          @DiffExecutor
-          public ExecutorService createDiffExecutor() {
-            return MoreExecutors.newDirectExecutorService();
-          }
-        });
-    install(new DefaultMemoryCacheModule());
-    install(new H2CacheModule());
-    install(new FakeEmailSender.Module());
-    install(new SignedTokenEmailTokenVerifier.Module());
-    install(new GpgModule(cfg));
-    install(new InMemoryAccountPatchReviewStore.Module());
-
-    bind(AllAccountsIndexer.class).toProvider(Providers.of(null));
-    bind(AllChangesIndexer.class).toProvider(Providers.of(null));
-    bind(AllGroupsIndexer.class).toProvider(Providers.of(null));
-
-    IndexType indexType = null;
-    try {
-      indexType = cfg.getEnum("index", null, "type", IndexType.LUCENE);
-    } catch (IllegalArgumentException e) {
-      // Custom index type, caller must provide their own module.
-    }
-    if (indexType != null) {
-      switch (indexType) {
-        case LUCENE:
-          install(luceneIndexModule());
-          break;
-        case ELASTICSEARCH:
-          install(elasticIndexModule());
-          break;
-        default:
-          throw new ProvisionException("index type unsupported in tests: " + indexType);
-      }
-    }
-    bind(ServerInformationImpl.class);
-    bind(ServerInformation.class).to(ServerInformationImpl.class);
-    install(new PluginRestApiModule());
-  }
-
-  @Provides
-  @Singleton
-  @SendEmailExecutor
-  public ExecutorService createSendEmailExecutor() {
-    return MoreExecutors.newDirectExecutorService();
-  }
-
-  @Provides
-  @Singleton
-  InMemoryDatabase getInMemoryDatabase(SchemaCreator schemaCreator) throws OrmException {
-    return new InMemoryDatabase(schemaCreator);
-  }
-
-  private Module luceneIndexModule() {
-    return indexModule("com.google.gerrit.lucene.LuceneIndexModule");
-  }
-
-  private Module elasticIndexModule() {
-    return indexModule("com.google.gerrit.elasticsearch.ElasticIndexModule");
-  }
-
-  private Module indexModule(String moduleClassName) {
-    try {
-      Class<?> clazz = Class.forName(moduleClassName);
-      Method m = clazz.getMethod("singleVersionWithExplicitVersions", Map.class, int.class);
-      return (Module) m.invoke(null, getSingleSchemaVersions(), 0);
-    } catch (ClassNotFoundException
-        | SecurityException
-        | NoSuchMethodException
-        | IllegalArgumentException
-        | IllegalAccessException
-        | InvocationTargetException e) {
-      e.printStackTrace();
-      ProvisionException pe = new ProvisionException(e.getMessage());
-      pe.initCause(e);
-      throw pe;
-    }
-  }
-
-  private Map<String, Integer> getSingleSchemaVersions() {
-    Map<String, Integer> singleVersions = new HashMap<>();
-    putSchemaVersion(singleVersions, AccountSchemaDefinitions.INSTANCE);
-    putSchemaVersion(singleVersions, ChangeSchemaDefinitions.INSTANCE);
-    putSchemaVersion(singleVersions, GroupSchemaDefinitions.INSTANCE);
-    return singleVersions;
-  }
-
-  private void putSchemaVersion(
-      Map<String, Integer> singleVersions, SchemaDefinitions<?> schemaDef) {
-    String schemaName = schemaDef.getName();
-    int version = cfg.getInt("index", "lucene", schemaName + "TestVersion", -1);
-    if (version > 0) {
-      checkState(
-          !singleVersions.containsKey(schemaName),
-          "version for schema %s was alreay set",
-          schemaName);
-      singleVersions.put(schemaName, version);
-    }
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryRepositoryManager.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryRepositoryManager.java
deleted file mode 100644
index e0c51b7..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryRepositoryManager.java
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.testutil;
-
-import com.google.common.collect.ImmutableSortedSet;
-import com.google.common.collect.Sets;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.RepositoryCaseMismatchException;
-import com.google.inject.Inject;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.SortedSet;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.internal.storage.dfs.DfsRepository;
-import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
-import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
-
-/** Repository manager that uses in-memory repositories. */
-public class InMemoryRepositoryManager implements GitRepositoryManager {
-  public static InMemoryRepository newRepository(Project.NameKey name) {
-    return new Repo(name);
-  }
-
-  public static class Description extends DfsRepositoryDescription {
-    private final Project.NameKey name;
-
-    private Description(Project.NameKey name) {
-      super(name.get());
-      this.name = name;
-    }
-
-    public Project.NameKey getProject() {
-      return name;
-    }
-  }
-
-  public static class Repo extends InMemoryRepository {
-    private String description;
-
-    private Repo(Project.NameKey name) {
-      super(new Description(name));
-      setPerformsAtomicTransactions(true);
-    }
-
-    @Override
-    public Description getDescription() {
-      return (Description) super.getDescription();
-    }
-
-    @Override
-    public String getGitwebDescription() {
-      return description;
-    }
-
-    @Override
-    public void setGitwebDescription(String d) {
-      description = d;
-    }
-  }
-
-  private final Map<String, Repo> repos;
-
-  @Inject
-  public InMemoryRepositoryManager() {
-    this.repos = new HashMap<>();
-  }
-
-  @Override
-  public synchronized Repo openRepository(Project.NameKey name) throws RepositoryNotFoundException {
-    return get(name);
-  }
-
-  @Override
-  public synchronized Repo createRepository(Project.NameKey name)
-      throws RepositoryCaseMismatchException, RepositoryNotFoundException {
-    Repo repo;
-    try {
-      repo = get(name);
-      if (!repo.getDescription().getRepositoryName().equals(name.get())) {
-        throw new RepositoryCaseMismatchException(name);
-      }
-    } catch (RepositoryNotFoundException e) {
-      repo = new Repo(name);
-      repos.put(normalize(name), repo);
-    }
-    return repo;
-  }
-
-  @Override
-  public synchronized SortedSet<Project.NameKey> list() {
-    SortedSet<Project.NameKey> names = Sets.newTreeSet();
-    for (DfsRepository repo : repos.values()) {
-      names.add(new Project.NameKey(repo.getDescription().getRepositoryName()));
-    }
-    return ImmutableSortedSet.copyOf(names);
-  }
-
-  public synchronized void deleteRepository(Project.NameKey name) {
-    repos.remove(normalize(name));
-  }
-
-  private synchronized Repo get(Project.NameKey name) throws RepositoryNotFoundException {
-    Repo repo = repos.get(normalize(name));
-    if (repo != null) {
-      repo.incrementOpen();
-      return repo;
-    }
-    throw new RepositoryNotFoundException(name.get());
-  }
-
-  private static String normalize(Project.NameKey name) {
-    return name.get().toLowerCase();
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/IndexVersions.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/IndexVersions.java
deleted file mode 100644
index a8569ed..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/testutil/IndexVersions.java
+++ /dev/null
@@ -1,145 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.testutil;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static java.util.stream.Collectors.toMap;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Splitter;
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
-import com.google.common.primitives.Ints;
-import com.google.gerrit.index.Schema;
-import com.google.gerrit.index.SchemaDefinitions;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.SortedMap;
-import org.eclipse.jgit.lib.Config;
-
-public class IndexVersions {
-  static final String ALL = "all";
-  static final String CURRENT = "current";
-  static final String PREVIOUS = "previous";
-
-  /**
-   * Returns the index versions from {@link IndexVersions#get(SchemaDefinitions)} without the latest
-   * schema version.
-   *
-   * @param schemaDef the schema definition
-   * @return the index versions from {@link IndexVersions#get(SchemaDefinitions)} without the latest
-   *     schema version
-   */
-  public static <V> ImmutableList<Integer> getWithoutLatest(SchemaDefinitions<V> schemaDef) {
-    List<Integer> schemaVersions = new ArrayList<>(get(schemaDef));
-    schemaVersions.remove(Integer.valueOf(schemaDef.getLatest().getVersion()));
-    return ImmutableList.copyOf(schemaVersions);
-  }
-
-  /**
-   * Returns the schema versions against which the query tests should be executed.
-   *
-   * <p>The schema versions are read from the '<schema-name>_INDEX_VERSIONS' env var if it is set,
-   * e.g. 'ACCOUNTS_INDEX_VERSIONS', 'CHANGES_INDEX_VERSIONS', 'GROUPS_INDEX_VERSIONS'.
-   *
-   * <p>If schema versions were not specified by an env var, they are read from the
-   * 'gerrit.index.<schema-name>.versions' system property, e.g. 'gerrit.index.accounts.version',
-   * 'gerrit.index.changes.version', 'gerrit.index.groups.version'.
-   *
-   * <p>As value a comma-separated list of schema versions is expected. {@code current} can be used
-   * for the latest schema version and {@code previous} is resolved to the second last schema
-   * version. Alternatively the value can also be {@code all} for all schema versions.
-   *
-   * <p>If schema versions were neither specified by an env var nor by a system property, the
-   * current and the second last schema versions are returned. If there is no other schema version
-   * than the current schema version, only the current schema version is returned.
-   *
-   * @param schemaDef the schema definition
-   * @return the schema versions against which the query tests should be executed
-   * @throws IllegalArgumentException if the value of the env var or system property is invalid or
-   *     if any of the specified schema versions doesn't exist
-   */
-  public static <V> ImmutableList<Integer> get(SchemaDefinitions<V> schemaDef) {
-    String envVar = schemaDef.getName().toUpperCase() + "_INDEX_VERSIONS";
-    String value = System.getenv(envVar);
-    if (!Strings.isNullOrEmpty(value)) {
-      return get(schemaDef, "env variable " + envVar, value);
-    }
-
-    String systemProperty = "gerrit.index." + schemaDef.getName().toLowerCase() + ".versions";
-    value = System.getProperty(systemProperty);
-    return get(schemaDef, "system property " + systemProperty, value);
-  }
-
-  @VisibleForTesting
-  static <V> ImmutableList<Integer> get(SchemaDefinitions<V> schemaDef, String name, String value) {
-    if (value != null) {
-      value = value.trim();
-    }
-
-    SortedMap<Integer, Schema<V>> schemas = schemaDef.getSchemas();
-    if (!Strings.isNullOrEmpty(value)) {
-      if (ALL.equals(value)) {
-        return ImmutableList.copyOf(schemas.keySet());
-      }
-
-      List<Integer> versions = new ArrayList<>();
-      for (String s : Splitter.on(',').trimResults().split(value)) {
-        if (CURRENT.equals(s)) {
-          versions.add(schemaDef.getLatest().getVersion());
-        } else if (PREVIOUS.equals(s)) {
-          checkArgument(schemaDef.getPrevious() != null, "previous version does not exist");
-          versions.add(schemaDef.getPrevious().getVersion());
-        } else {
-          Integer version = Ints.tryParse(s);
-          checkArgument(version != null, "Invalid value for %s: %s", name, s);
-          checkArgument(
-              schemas.containsKey(version),
-              "Index version %s that was specified by %s not found." + " Possible versions are: %s",
-              version,
-              name,
-              schemas.keySet());
-          versions.add(version);
-        }
-      }
-      return ImmutableList.copyOf(versions);
-    }
-
-    List<Integer> schemaVersions = new ArrayList<>(2);
-    if (schemaDef.getPrevious() != null) {
-      schemaVersions.add(schemaDef.getPrevious().getVersion());
-    }
-    schemaVersions.add(schemaDef.getLatest().getVersion());
-    return ImmutableList.copyOf(schemaVersions);
-  }
-
-  public static <V> Map<String, Config> asConfigMap(
-      SchemaDefinitions<V> schemaDef,
-      List<Integer> schemaVersions,
-      String testSuiteNamePrefix,
-      Config baseConfig) {
-    return schemaVersions.stream()
-        .collect(
-            toMap(
-                i -> testSuiteNamePrefix + i,
-                i -> {
-                  Config cfg = baseConfig;
-                  cfg.setInt(
-                      "index", "lucene", schemaDef.getName().toLowerCase() + "TestVersion", i);
-                  return cfg;
-                }));
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/IndexVersionsTest.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/IndexVersionsTest.java
deleted file mode 100644
index d3c889a..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/testutil/IndexVersionsTest.java
+++ /dev/null
@@ -1,140 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.testutil;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.TruthJUnit.assume;
-import static com.google.gerrit.testutil.IndexVersions.ALL;
-import static com.google.gerrit.testutil.IndexVersions.CURRENT;
-import static com.google.gerrit.testutil.IndexVersions.PREVIOUS;
-
-import com.google.gerrit.server.index.change.ChangeSchemaDefinitions;
-import java.util.ArrayList;
-import java.util.List;
-import org.junit.Test;
-
-public class IndexVersionsTest extends GerritBaseTests {
-  private static final ChangeSchemaDefinitions SCHEMA_DEF = ChangeSchemaDefinitions.INSTANCE;
-
-  @Test
-  public void noValue() {
-    List<Integer> expected = new ArrayList<>();
-    if (SCHEMA_DEF.getPrevious() != null) {
-      expected.add(SCHEMA_DEF.getPrevious().getVersion());
-    }
-    expected.add(SCHEMA_DEF.getLatest().getVersion());
-
-    assertThat(get(null)).containsExactlyElementsIn(expected).inOrder();
-  }
-
-  @Test
-  public void emptyValue() {
-    List<Integer> expected = new ArrayList<>();
-    if (SCHEMA_DEF.getPrevious() != null) {
-      expected.add(SCHEMA_DEF.getPrevious().getVersion());
-    }
-    expected.add(SCHEMA_DEF.getLatest().getVersion());
-
-    assertThat(get("")).containsExactlyElementsIn(expected).inOrder();
-  }
-
-  @Test
-  public void all() {
-    assertThat(get(ALL)).containsExactlyElementsIn(SCHEMA_DEF.getSchemas().keySet()).inOrder();
-  }
-
-  @Test
-  public void current() {
-    assertThat(get(CURRENT)).containsExactly(SCHEMA_DEF.getLatest().getVersion());
-  }
-
-  @Test
-  public void previous() {
-    assume().that(SCHEMA_DEF.getPrevious()).isNotNull();
-
-    assertThat(get(PREVIOUS)).containsExactly(SCHEMA_DEF.getPrevious().getVersion());
-  }
-
-  @Test
-  public void versionNumber() {
-    assume().that(SCHEMA_DEF.getPrevious()).isNotNull();
-
-    assertThat(get(Integer.toString(SCHEMA_DEF.getPrevious().getVersion())))
-        .containsExactly(SCHEMA_DEF.getPrevious().getVersion());
-  }
-
-  @Test
-  public void invalid() {
-    assertIllegalArgument("foo", "Invalid value for test: foo");
-  }
-
-  @Test
-  public void currentAndPrevious() {
-    if (SCHEMA_DEF.getPrevious() == null) {
-      assertIllegalArgument(CURRENT + "," + PREVIOUS, "previous version does not exist");
-      return;
-    }
-
-    assertThat(get(CURRENT + "," + PREVIOUS))
-        .containsExactly(SCHEMA_DEF.getLatest().getVersion(), SCHEMA_DEF.getPrevious().getVersion())
-        .inOrder();
-    assertThat(get(PREVIOUS + "," + CURRENT))
-        .containsExactly(SCHEMA_DEF.getPrevious().getVersion(), SCHEMA_DEF.getLatest().getVersion())
-        .inOrder();
-  }
-
-  @Test
-  public void currentAndVersionNumber() {
-    assume().that(SCHEMA_DEF.getPrevious()).isNotNull();
-
-    assertThat(get(CURRENT + "," + SCHEMA_DEF.getPrevious().getVersion()))
-        .containsExactly(SCHEMA_DEF.getLatest().getVersion(), SCHEMA_DEF.getPrevious().getVersion())
-        .inOrder();
-    assertThat(get(SCHEMA_DEF.getPrevious().getVersion() + "," + CURRENT))
-        .containsExactly(SCHEMA_DEF.getPrevious().getVersion(), SCHEMA_DEF.getLatest().getVersion())
-        .inOrder();
-  }
-
-  @Test
-  public void currentAndAll() {
-    assertIllegalArgument(CURRENT + "," + ALL, "Invalid value for test: " + ALL);
-  }
-
-  @Test
-  public void currentAndInvalid() {
-    assertIllegalArgument(CURRENT + ",foo", "Invalid value for test: foo");
-  }
-
-  @Test
-  public void nonExistingVersion() {
-    int nonExistingVersion = SCHEMA_DEF.getLatest().getVersion() + 1;
-    assertIllegalArgument(
-        Integer.toString(nonExistingVersion),
-        "Index version "
-            + nonExistingVersion
-            + " that was specified by test not found. Possible versions are: "
-            + SCHEMA_DEF.getSchemas().keySet());
-  }
-
-  private static List<Integer> get(String value) {
-    return IndexVersions.get(ChangeSchemaDefinitions.INSTANCE, "test", value);
-  }
-
-  private void assertIllegalArgument(String value, String expectedMessage) {
-    exception.expect(IllegalArgumentException.class);
-    exception.expectMessage(expectedMessage);
-    get(value);
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/NoteDbChecker.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/NoteDbChecker.java
deleted file mode 100644
index 5ce0810..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/testutil/NoteDbChecker.java
+++ /dev/null
@@ -1,226 +0,0 @@
-// 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.
-
-package com.google.gerrit.testutil;
-
-import static com.google.common.truth.Truth.assertThat;
-import static java.util.Comparator.comparing;
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.base.Joiner;
-import com.google.common.collect.ImmutableListMultimap;
-import com.google.common.collect.ListMultimap;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.reviewdb.server.ReviewDbUtil;
-import com.google.gerrit.server.CommentsUtil;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.notedb.ChangeBundle;
-import com.google.gerrit.server.notedb.ChangeBundleReader;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.MutableNotesMigration;
-import com.google.gerrit.server.notedb.rebuild.ChangeRebuilder;
-import com.google.gwtorm.client.IntKey;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.OrmRuntimeException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Stream;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.Repository;
-import org.junit.runner.Description;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class NoteDbChecker {
-  static final Logger log = LoggerFactory.getLogger(NoteDbChecker.class);
-
-  private final Provider<ReviewDb> dbProvider;
-  private final GitRepositoryManager repoManager;
-  private final MutableNotesMigration notesMigration;
-  private final ChangeBundleReader bundleReader;
-  private final ChangeNotes.Factory notesFactory;
-  private final ChangeRebuilder changeRebuilder;
-  private final CommentsUtil commentsUtil;
-
-  @Inject
-  NoteDbChecker(
-      Provider<ReviewDb> dbProvider,
-      GitRepositoryManager repoManager,
-      MutableNotesMigration notesMigration,
-      ChangeBundleReader bundleReader,
-      ChangeNotes.Factory notesFactory,
-      ChangeRebuilder changeRebuilder,
-      CommentsUtil commentsUtil) {
-    this.dbProvider = dbProvider;
-    this.repoManager = repoManager;
-    this.bundleReader = bundleReader;
-    this.notesMigration = notesMigration;
-    this.notesFactory = notesFactory;
-    this.changeRebuilder = changeRebuilder;
-    this.commentsUtil = commentsUtil;
-  }
-
-  public void rebuildAndCheckAllChanges() throws Exception {
-    rebuildAndCheckChanges(
-        getUnwrappedDb().changes().all().toList().stream().map(Change::getId),
-        ImmutableListMultimap.of());
-  }
-
-  public void rebuildAndCheckChanges(Change.Id... changeIds) throws Exception {
-    rebuildAndCheckChanges(Arrays.stream(changeIds), ImmutableListMultimap.of());
-  }
-
-  private void rebuildAndCheckChanges(
-      Stream<Change.Id> changeIds, ListMultimap<Change.Id, String> expectedDiffs) throws Exception {
-    ReviewDb db = getUnwrappedDb();
-
-    List<ChangeBundle> allExpected = readExpected(changeIds);
-
-    boolean oldWrite = notesMigration.rawWriteChangesSetting();
-    boolean oldRead = notesMigration.readChanges();
-    try {
-      notesMigration.setWriteChanges(true);
-      notesMigration.setReadChanges(true);
-      List<String> msgs = new ArrayList<>();
-      for (ChangeBundle expected : allExpected) {
-        Change c = expected.getChange();
-        try {
-          changeRebuilder.rebuild(db, c.getId());
-        } catch (RepositoryNotFoundException e) {
-          msgs.add("Repository not found for change, cannot convert: " + c);
-        }
-      }
-
-      checkActual(allExpected, expectedDiffs, msgs);
-    } finally {
-      notesMigration.setReadChanges(oldRead);
-      notesMigration.setWriteChanges(oldWrite);
-    }
-  }
-
-  public void checkChanges(Change.Id... changeIds) throws Exception {
-    checkActual(
-        readExpected(Arrays.stream(changeIds)), ImmutableListMultimap.of(), new ArrayList<>());
-  }
-
-  public void rebuildAndCheckChange(Change.Id changeId, String... expectedDiff) throws Exception {
-    ImmutableListMultimap.Builder<Change.Id, String> b = ImmutableListMultimap.builder();
-    b.putAll(changeId, Arrays.asList(expectedDiff));
-    rebuildAndCheckChanges(Stream.of(changeId), b.build());
-  }
-
-  public void assertNoChangeRef(Project.NameKey project, Change.Id changeId) throws Exception {
-    try (Repository repo = repoManager.openRepository(project)) {
-      assertThat(repo.exactRef(RefNames.changeMetaRef(changeId))).isNull();
-    }
-  }
-
-  public void assertNoReviewDbChanges(Description desc) throws Exception {
-    ReviewDb db = getUnwrappedDb();
-    assertThat(db.changes().all().toList()).named("Changes in " + desc.getTestClass()).isEmpty();
-    assertThat(db.changeMessages().all().toList())
-        .named("ChangeMessages in " + desc.getTestClass())
-        .isEmpty();
-    assertThat(db.patchSets().all().toList())
-        .named("PatchSets in " + desc.getTestClass())
-        .isEmpty();
-    assertThat(db.patchSetApprovals().all().toList())
-        .named("PatchSetApprovals in " + desc.getTestClass())
-        .isEmpty();
-    assertThat(db.patchComments().all().toList())
-        .named("PatchLineComments in " + desc.getTestClass())
-        .isEmpty();
-  }
-
-  private List<ChangeBundle> readExpected(Stream<Change.Id> changeIds) throws Exception {
-    boolean old = notesMigration.readChanges();
-    try {
-      notesMigration.setReadChanges(false);
-      return changeIds
-          .sorted(comparing(IntKey::get))
-          .map(this::readBundleUnchecked)
-          .collect(toList());
-    } finally {
-      notesMigration.setReadChanges(old);
-    }
-  }
-
-  private ChangeBundle readBundleUnchecked(Change.Id id) {
-    try {
-      return bundleReader.fromReviewDb(getUnwrappedDb(), id);
-    } catch (OrmException e) {
-      throw new OrmRuntimeException(e);
-    }
-  }
-
-  private void checkActual(
-      List<ChangeBundle> allExpected,
-      ListMultimap<Change.Id, String> expectedDiffs,
-      List<String> msgs)
-      throws Exception {
-    ReviewDb db = getUnwrappedDb();
-    boolean oldRead = notesMigration.readChanges();
-    boolean oldWrite = notesMigration.rawWriteChangesSetting();
-    try {
-      notesMigration.setWriteChanges(true);
-      notesMigration.setReadChanges(true);
-      for (ChangeBundle expected : allExpected) {
-        Change c = expected.getChange();
-        ChangeBundle actual;
-        try {
-          actual =
-              ChangeBundle.fromNotes(
-                  commentsUtil, notesFactory.create(db, c.getProject(), c.getId()));
-        } catch (Throwable t) {
-          String msg = "Error converting change: " + c;
-          msgs.add(msg);
-          log.error(msg, t);
-          continue;
-        }
-        List<String> diff = expected.differencesFrom(actual);
-        List<String> expectedDiff = expectedDiffs.get(c.getId());
-        if (!diff.equals(expectedDiff)) {
-          msgs.add("Differences between ReviewDb and NoteDb for " + c + ":");
-          msgs.addAll(diff);
-          if (!expectedDiff.isEmpty()) {
-            msgs.add("Expected differences:");
-            msgs.addAll(expectedDiff);
-          }
-          msgs.add("");
-        } else {
-          System.err.println("NoteDb conversion of change " + c.getId() + " successful");
-        }
-      }
-    } finally {
-      notesMigration.setReadChanges(oldRead);
-      notesMigration.setWriteChanges(oldWrite);
-    }
-    if (!msgs.isEmpty()) {
-      throw new AssertionError(Joiner.on('\n').join(msgs));
-    }
-  }
-
-  private ReviewDb getUnwrappedDb() {
-    ReviewDb db = dbProvider.get();
-    return ReviewDbUtil.unwrapDb(db);
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/NoteDbMode.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/NoteDbMode.java
deleted file mode 100644
index 078ce43..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/testutil/NoteDbMode.java
+++ /dev/null
@@ -1,87 +0,0 @@
-// 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.
-
-package com.google.gerrit.testutil;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import com.google.common.base.Enums;
-import com.google.common.base.Strings;
-import com.google.gerrit.server.notedb.MutableNotesMigration;
-import com.google.gerrit.server.notedb.NotesMigrationState;
-
-public enum NoteDbMode {
-  /** NoteDb is disabled. */
-  OFF(NotesMigrationState.REVIEW_DB),
-
-  /** Writing data to NoteDb is enabled. */
-  WRITE(NotesMigrationState.WRITE),
-
-  /** Reading and writing all data to NoteDb is enabled. */
-  READ_WRITE(NotesMigrationState.READ_WRITE_WITH_SEQUENCE_REVIEW_DB_PRIMARY),
-
-  /** Changes are created with their primary storage as NoteDb. */
-  PRIMARY(NotesMigrationState.READ_WRITE_WITH_SEQUENCE_NOTE_DB_PRIMARY),
-
-  /** All change tables are entirely disabled, and code/meta ref updates are fused. */
-  ON(NotesMigrationState.NOTE_DB),
-
-  /**
-   * Run tests with NoteDb disabled, then convert ReviewDb to NoteDb and check that the results
-   * match.
-   */
-  CHECK(NotesMigrationState.REVIEW_DB);
-
-  private static final String ENV_VAR = "GERRIT_NOTEDB";
-  private static final String SYS_PROP = "gerrit.notedb";
-
-  public static NoteDbMode get() {
-    String value = System.getenv(ENV_VAR);
-    if (Strings.isNullOrEmpty(value)) {
-      value = System.getProperty(SYS_PROP);
-    }
-    if (Strings.isNullOrEmpty(value)) {
-      return OFF;
-    }
-    value = value.toUpperCase().replace("-", "_");
-    NoteDbMode mode = Enums.getIfPresent(NoteDbMode.class, value).orNull();
-    if (!Strings.isNullOrEmpty(System.getenv(ENV_VAR))) {
-      checkArgument(
-          mode != null, "Invalid value for env variable %s: %s", ENV_VAR, System.getenv(ENV_VAR));
-    } else {
-      checkArgument(
-          mode != null,
-          "Invalid value for system property %s: %s",
-          SYS_PROP,
-          System.getProperty(SYS_PROP));
-    }
-    return mode;
-  }
-
-  public static MutableNotesMigration newNotesMigrationFromEnv() {
-    MutableNotesMigration m = MutableNotesMigration.newDisabled();
-    resetFromEnv(m);
-    return m;
-  }
-
-  public static void resetFromEnv(MutableNotesMigration migration) {
-    migration.setFrom(get().state);
-  }
-
-  private final NotesMigrationState state;
-
-  private NoteDbMode(NotesMigrationState state) {
-    this.state = state;
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/SchemaUpgradeTestEnvironment.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/SchemaUpgradeTestEnvironment.java
deleted file mode 100644
index adcde40..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/testutil/SchemaUpgradeTestEnvironment.java
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.testutil;
-
-import com.google.gerrit.lifecycle.LifecycleManager;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountManager;
-import com.google.gerrit.server.account.AuthRequest;
-import com.google.gerrit.server.schema.SchemaCreator;
-import com.google.gerrit.server.util.RequestContext;
-import com.google.gerrit.server.util.ThreadLocalRequestContext;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Guice;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.Provider;
-import com.google.inject.util.Providers;
-import org.junit.rules.TestRule;
-import org.junit.runner.Description;
-import org.junit.runners.model.Statement;
-
-public final class SchemaUpgradeTestEnvironment implements TestRule {
-  @Inject private AccountManager accountManager;
-  @Inject private IdentifiedUser.GenericFactory userFactory;
-  @Inject private SchemaFactory<ReviewDb> schemaFactory;
-  @Inject private SchemaCreator schemaCreator;
-  @Inject private ThreadLocalRequestContext requestContext;
-  // Only for use in setting up/tearing down injector.
-  @Inject private InMemoryDatabase inMemoryDatabase;
-
-  private ReviewDb db;
-  private Injector injector;
-  private LifecycleManager lifecycle;
-
-  @Override
-  public Statement apply(Statement statement, Description description) {
-    return new Statement() {
-      @Override
-      public void evaluate() throws Throwable {
-        try {
-          setUp();
-          statement.evaluate();
-        } finally {
-          tearDown();
-        }
-      }
-    };
-  }
-
-  public ReviewDb getDb() {
-    return db;
-  }
-
-  public Injector getInjector() {
-    return injector;
-  }
-
-  public void setApiUser(Account.Id id) {
-    IdentifiedUser user = userFactory.create(id);
-    requestContext.setContext(
-        new RequestContext() {
-          @Override
-          public CurrentUser getUser() {
-            return user;
-          }
-
-          @Override
-          public Provider<ReviewDb> getReviewDbProvider() {
-            return Providers.of(db);
-          }
-        });
-  }
-
-  private void setUp() throws Exception {
-    injector = Guice.createInjector(new InMemoryModule());
-    injector.injectMembers(this);
-    lifecycle = new LifecycleManager();
-    lifecycle.add(injector);
-    lifecycle.start();
-
-    try (ReviewDb underlyingDb = inMemoryDatabase.getDatabase().open()) {
-      schemaCreator.create(underlyingDb);
-    }
-    db = schemaFactory.open();
-    setApiUser(accountManager.authenticate(AuthRequest.forUser("user")).getAccountId());
-  }
-
-  private void tearDown() {
-    if (lifecycle != null) {
-      lifecycle.stop();
-    }
-    if (requestContext != null) {
-      requestContext.setContext(null);
-    }
-    if (db != null) {
-      db.close();
-    }
-    InMemoryDatabase.drop(inMemoryDatabase);
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/SshMode.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/SshMode.java
deleted file mode 100644
index 0bf643cc..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/testutil/SshMode.java
+++ /dev/null
@@ -1,64 +0,0 @@
-// 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.
-
-package com.google.gerrit.testutil;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import com.google.common.base.Enums;
-import com.google.common.base.Strings;
-
-/**
- * Whether to enable/disable tests using SSH by inspecting the global environment.
- *
- * <p>Acceptance tests should generally not inspect this directly, since SSH may also be disabled on
- * a per-class or per-method basis. Inject {@code @SshEnabled boolean} instead.
- */
-public enum SshMode {
-  /** Tests annotated with UseSsh will be disabled. */
-  NO,
-
-  /** Tests annotated with UseSsh will be enabled. */
-  YES;
-
-  private static final String ENV_VAR = "GERRIT_USE_SSH";
-  private static final String SYS_PROP = "gerrit.use.ssh";
-
-  public static SshMode get() {
-    String value = System.getenv(ENV_VAR);
-    if (Strings.isNullOrEmpty(value)) {
-      value = System.getProperty(SYS_PROP);
-    }
-    if (Strings.isNullOrEmpty(value)) {
-      return YES;
-    }
-    value = value.toUpperCase();
-    SshMode mode = Enums.getIfPresent(SshMode.class, value).orNull();
-    if (!Strings.isNullOrEmpty(System.getenv(ENV_VAR))) {
-      checkArgument(
-          mode != null, "Invalid value for env variable %s: %s", ENV_VAR, System.getenv(ENV_VAR));
-    } else {
-      checkArgument(
-          mode != null,
-          "Invalid value for system property %s: %s",
-          SYS_PROP,
-          System.getProperty(SYS_PROP));
-    }
-    return mode;
-  }
-
-  public static boolean useSsh() {
-    return get() == YES;
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/TempFileUtil.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/TempFileUtil.java
deleted file mode 100644
index f90a4fe..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/testutil/TempFileUtil.java
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.testutil;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-public class TempFileUtil {
-  private static List<File> allDirsCreated = new ArrayList<>();
-
-  public static synchronized File createTempDirectory() throws IOException {
-    File tmp = File.createTempFile("gerrit_test_", "").getCanonicalFile();
-    if (!tmp.delete() || !tmp.mkdir()) {
-      throw new IOException("Cannot create " + tmp.getPath());
-    }
-    allDirsCreated.add(tmp);
-    return tmp;
-  }
-
-  public static synchronized void cleanup() throws IOException {
-    for (File dir : allDirsCreated) {
-      recursivelyDelete(dir);
-    }
-    allDirsCreated.clear();
-  }
-
-  public static void recursivelyDelete(File dir) throws IOException {
-    if (!dir.getPath().equals(dir.getCanonicalPath())) {
-      // Directory symlink reaching outside of temporary space.
-      return;
-    }
-    File[] contents = dir.listFiles();
-    if (contents != null) {
-      for (File d : contents) {
-        if (d.isDirectory()) {
-          recursivelyDelete(d);
-        } else {
-          deleteNowOrOnExit(d);
-        }
-      }
-    }
-    deleteNowOrOnExit(dir);
-  }
-
-  private static void deleteNowOrOnExit(File dir) {
-    if (!dir.delete()) {
-      dir.deleteOnExit();
-    }
-  }
-
-  private TempFileUtil() {}
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/TestChanges.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/TestChanges.java
deleted file mode 100644
index a47a0e5..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/testutil/TestChanges.java
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.testutil;
-
-import static com.google.common.base.MoreObjects.firstNonNull;
-
-import com.google.common.collect.Ordering;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.config.FactoryModule;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSetInfo;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RevId;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.notedb.AbstractChangeNotes;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.notedb.ChangeUpdate;
-import com.google.gerrit.server.notedb.NotesMigration;
-import com.google.inject.Injector;
-import java.util.TimeZone;
-import java.util.concurrent.atomic.AtomicInteger;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.PersonIdent;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-
-/**
- * Utility functions to create and manipulate Change, ChangeUpdate, and ChangeControl objects for
- * testing.
- */
-public class TestChanges {
-  private static final AtomicInteger nextChangeId = new AtomicInteger(1);
-
-  public static Change newChange(Project.NameKey project, Account.Id userId) {
-    return newChange(project, userId, nextChangeId.getAndIncrement());
-  }
-
-  public static Change newChange(Project.NameKey project, Account.Id userId, int id) {
-    Change.Id changeId = new Change.Id(id);
-    Change c =
-        new Change(
-            new Change.Key("Iabcd1234abcd1234abcd1234abcd1234abcd1234"),
-            changeId,
-            userId,
-            new Branch.NameKey(project, "master"),
-            TimeUtil.nowTs());
-    incrementPatchSet(c);
-    return c;
-  }
-
-  public static PatchSet newPatchSet(PatchSet.Id id, ObjectId revision, Account.Id userId) {
-    return newPatchSet(id, revision.name(), userId);
-  }
-
-  public static PatchSet newPatchSet(PatchSet.Id id, String revision, Account.Id userId) {
-    PatchSet ps = new PatchSet(id);
-    ps.setRevision(new RevId(revision));
-    ps.setUploader(userId);
-    ps.setCreatedOn(TimeUtil.nowTs());
-    return ps;
-  }
-
-  public static ChangeUpdate newUpdate(Injector injector, Change c, CurrentUser user)
-      throws Exception {
-    injector =
-        injector.createChildInjector(
-            new FactoryModule() {
-              @Override
-              public void configure() {
-                bind(CurrentUser.class).toInstance(user);
-              }
-            });
-    ChangeUpdate update =
-        injector
-            .getInstance(ChangeUpdate.Factory.class)
-            .create(
-                new ChangeNotes(injector.getInstance(AbstractChangeNotes.Args.class), c).load(),
-                user,
-                TimeUtil.nowTs(),
-                Ordering.<String>natural());
-
-    ChangeNotes notes = update.getNotes();
-    boolean hasPatchSets = notes.getPatchSets() != null && !notes.getPatchSets().isEmpty();
-    NotesMigration migration = injector.getInstance(NotesMigration.class);
-    if (hasPatchSets || !migration.readChanges()) {
-      return update;
-    }
-
-    // Change doesn't exist yet. NoteDb requires that there be a commit for the
-    // first patch set, so create one.
-    GitRepositoryManager repoManager = injector.getInstance(GitRepositoryManager.class);
-    try (Repository repo = repoManager.openRepository(c.getProject())) {
-      TestRepository<Repository> tr = new TestRepository<>(repo);
-      PersonIdent ident =
-          user.asIdentifiedUser().newCommitterIdent(update.getWhen(), TimeZone.getDefault());
-      TestRepository<Repository>.CommitBuilder cb =
-          tr.commit()
-              .author(ident)
-              .committer(ident)
-              .message(firstNonNull(c.getSubject(), "Test change"));
-      Ref parent = repo.exactRef(c.getDest().get());
-      if (parent != null) {
-        cb.parent(tr.getRevWalk().parseCommit(parent.getObjectId()));
-      }
-      update.setBranch(c.getDest().get());
-      update.setChangeId(c.getKey().get());
-      update.setCommit(tr.getRevWalk(), cb.create());
-      return update;
-    }
-  }
-
-  public static void incrementPatchSet(Change change) {
-    PatchSet.Id curr = change.currentPatchSetId();
-    PatchSetInfo ps =
-        new PatchSetInfo(new PatchSet.Id(change.getId(), curr != null ? curr.get() + 1 : 1));
-    ps.setSubject("Change subject");
-    change.setCurrentPatchSet(ps);
-  }
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/TestTimeUtil.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/TestTimeUtil.java
deleted file mode 100644
index 7921204..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/testutil/TestTimeUtil.java
+++ /dev/null
@@ -1,147 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.testutil;
-
-import static com.google.common.base.Preconditions.checkState;
-import static java.util.concurrent.TimeUnit.MILLISECONDS;
-
-import java.sql.Timestamp;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicLong;
-import org.eclipse.jgit.lib.Config;
-import org.eclipse.jgit.storage.file.FileBasedConfig;
-import org.eclipse.jgit.util.FS;
-import org.eclipse.jgit.util.SystemReader;
-import org.joda.time.DateTime;
-import org.joda.time.DateTimeUtils;
-import org.joda.time.DateTimeUtils.MillisProvider;
-import org.joda.time.DateTimeZone;
-
-/** Static utility methods for dealing with dates and times in tests. */
-public class TestTimeUtil {
-  public static final DateTime START =
-      new DateTime(2009, 9, 30, 17, 0, 0, DateTimeZone.forOffsetHours(-4));
-
-  private static Long clockStepMs;
-  private static AtomicLong clockMs;
-
-  /**
-   * Reset the clock to a known start point, then set the clock step.
-   *
-   * <p>The clock is initially set to 2009/09/30 17:00:00 -0400.
-   *
-   * @param clockStep amount to increment clock by on each lookup.
-   * @param clockStepUnit time unit for {@code clockStep}.
-   */
-  public static synchronized void resetWithClockStep(long clockStep, TimeUnit clockStepUnit) {
-    // Set an arbitrary start point so tests are more repeatable.
-    clockMs = new AtomicLong(START.getMillis());
-    setClockStep(clockStep, clockStepUnit);
-  }
-
-  /**
-   * Set the clock step used by {@link com.google.gerrit.common.TimeUtil}.
-   *
-   * @param clockStep amount to increment clock by on each lookup.
-   * @param clockStepUnit time unit for {@code clockStep}.
-   */
-  public static synchronized void setClockStep(long clockStep, TimeUnit clockStepUnit) {
-    checkState(clockMs != null, "call resetWithClockStep first");
-    clockStepMs = MILLISECONDS.convert(clockStep, clockStepUnit);
-
-    DateTimeUtils.setCurrentMillisProvider(
-        new MillisProvider() {
-          @Override
-          public long getMillis() {
-            return clockMs.getAndAdd(clockStepMs);
-          }
-        });
-
-    SystemReader.setInstance(null);
-    final SystemReader defaultReader = SystemReader.getInstance();
-    SystemReader r =
-        new SystemReader() {
-          @Override
-          public String getHostname() {
-            return defaultReader.getHostname();
-          }
-
-          @Override
-          public String getenv(String variable) {
-            return defaultReader.getenv(variable);
-          }
-
-          @Override
-          public String getProperty(String key) {
-            return defaultReader.getProperty(key);
-          }
-
-          @Override
-          public FileBasedConfig openUserConfig(Config parent, FS fs) {
-            return defaultReader.openUserConfig(parent, fs);
-          }
-
-          @Override
-          public FileBasedConfig openSystemConfig(Config parent, FS fs) {
-            return defaultReader.openSystemConfig(parent, fs);
-          }
-
-          @Override
-          public long getCurrentTime() {
-            return clockMs.getAndAdd(clockStepMs);
-          }
-
-          @Override
-          public int getTimezone(long when) {
-            return defaultReader.getTimezone(when);
-          }
-        };
-    SystemReader.setInstance(r);
-  }
-
-  /**
-   * Set the clock to a specific timestamp.
-   *
-   * @param ts time to set
-   */
-  public static synchronized void setClock(Timestamp ts) {
-    checkState(clockMs != null, "call resetWithClockStep first");
-    clockMs.set(ts.getTime());
-  }
-
-  /**
-   * Increment the clock once by a given amount.
-   *
-   * @param clockStep amount to increment clock by.
-   * @param clockStepUnit time unit for {@code clockStep}.
-   */
-  public static synchronized void incrementClock(long clockStep, TimeUnit clockStepUnit) {
-    checkState(clockMs != null, "call resetWithClockStep first");
-    clockMs.addAndGet(clockStepUnit.toMillis(clockStep));
-  }
-
-  /**
-   * Reset the clock to use the actual system clock.
-   *
-   * <p>As a side effect, resets the {@link SystemReader} to the original default instance.
-   */
-  public static synchronized void useSystemTime() {
-    clockMs = null;
-    DateTimeUtils.setCurrentMillisSystem();
-    SystemReader.setInstance(null);
-  }
-
-  private TestTimeUtil() {}
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/TestUpdateUI.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/TestUpdateUI.java
deleted file mode 100644
index d4acbcb..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/testutil/TestUpdateUI.java
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.testutil;
-
-import com.google.gerrit.server.schema.UpdateUI;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.StatementExecutor;
-import java.util.List;
-import java.util.Set;
-
-public class TestUpdateUI implements UpdateUI {
-  @Override
-  public void message(String message) {}
-
-  @Override
-  public boolean yesno(boolean defaultValue, String message) {
-    return defaultValue;
-  }
-
-  @Override
-  public void waitForUser() {}
-
-  @Override
-  public String readString(String defaultValue, Set<String> allowedValues, String message) {
-    return defaultValue;
-  }
-
-  @Override
-  public boolean isBatch() {
-    return true;
-  }
-
-  @Override
-  public void pruneSchema(StatementExecutor e, List<String> pruneList) throws OrmException {
-    for (String sql : pruneList) {
-      e.execute(sql);
-    }
-  }
-}
diff --git a/gerrit-sshd/BUILD b/gerrit-sshd/BUILD
deleted file mode 100644
index 611df61..0000000
--- a/gerrit-sshd/BUILD
+++ /dev/null
@@ -1,57 +0,0 @@
-load("//tools/bzl:junit.bzl", "junit_tests")
-
-SRCS = glob(["src/main/java/**/*.java"])
-
-java_library(
-    name = "sshd",
-    srcs = SRCS,
-    visibility = ["//visibility:public"],
-    deps = [
-        "//gerrit-cache-h2:cache-h2",
-        "//gerrit-cache-mem:mem",
-        "//gerrit-common:annotations",
-        "//gerrit-common:server",
-        "//gerrit-extension-api:api",
-        "//gerrit-lucene:lucene",
-        "//gerrit-patch-jgit:server",
-        "//gerrit-reviewdb:server",
-        "//gerrit-server:metrics",
-        "//gerrit-server:receive",
-        "//gerrit-server:server",
-        "//gerrit-util-cli:cli",
-        "//lib:args4j",
-        "//lib:gson",
-        "//lib:guava",
-        "//lib:gwtorm",
-        "//lib:jsch",
-        "//lib:servlet-api-3_1",
-        "//lib/auto:auto-value",
-        "//lib/auto:auto-value-annotations",
-        "//lib/bouncycastle:bcprov-neverlink",
-        "//lib/commons:codec",
-        "//lib/dropwizard:dropwizard-core",
-        "//lib/guice",
-        "//lib/guice:guice-assistedinject",
-        "//lib/guice:guice-servlet",  # SSH should not depend on servlet
-        "//lib/jgit/org.eclipse.jgit.archive:jgit-archive",
-        "//lib/jgit/org.eclipse.jgit:jgit",
-        "//lib/log:api",
-        "//lib/log:log4j",
-        "//lib/mina:core",
-        "//lib/mina:sshd",
-    ],
-)
-
-junit_tests(
-    name = "sshd_tests",
-    srcs = glob(
-        ["src/test/java/**/*.java"],
-    ),
-    deps = [
-        ":sshd",
-        "//gerrit-extension-api:api",
-        "//gerrit-server:server",
-        "//lib:truth",
-        "//lib/mina:sshd",
-    ],
-)
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AbstractGitCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AbstractGitCommand.java
deleted file mode 100644
index 0b48cf5..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AbstractGitCommand.java
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.sshd;
-
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.AccessPath;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.sshd.SshScope.Context;
-import com.google.inject.Inject;
-import java.io.IOException;
-import org.apache.sshd.server.Environment;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.Repository;
-import org.kohsuke.args4j.Argument;
-
-public abstract class AbstractGitCommand extends BaseCommand {
-  @Argument(index = 0, metaVar = "PROJECT.git", required = true, usage = "project name")
-  protected ProjectControl projectControl;
-
-  @Inject private SshScope sshScope;
-
-  @Inject private GitRepositoryManager repoManager;
-
-  @Inject private SshSession session;
-
-  @Inject private SshScope.Context context;
-
-  @Inject private IdentifiedUser user;
-
-  @Inject private IdentifiedUser.GenericFactory userFactory;
-
-  protected Repository repo;
-  protected ProjectState state;
-  protected Project.NameKey projectName;
-  protected Project project;
-
-  @Override
-  public void start(Environment env) {
-    Context ctx = context.subContext(newSession(), context.getCommandLine());
-    final Context old = sshScope.set(ctx);
-    try {
-      startThread(
-          new ProjectCommandRunnable() {
-            @Override
-            public void executeParseCommand() throws Exception {
-              parseCommandLine();
-            }
-
-            @Override
-            public void run() throws Exception {
-              AbstractGitCommand.this.service();
-            }
-
-            @Override
-            public Project.NameKey getProjectName() {
-              Project project = projectControl.getProjectState().getProject();
-              return project.getNameKey();
-            }
-          },
-          AccessPath.GIT);
-    } finally {
-      sshScope.set(old);
-    }
-  }
-
-  private SshSession newSession() {
-    SshSession n =
-        new SshSession(
-            session,
-            session.getRemoteAddress(),
-            userFactory.create(session.getRemoteAddress(), user.getAccountId()));
-    return n;
-  }
-
-  private void service() throws IOException, PermissionBackendException, Failure {
-    state = projectControl.getProjectState();
-    project = state.getProject();
-    projectName = project.getNameKey();
-
-    try {
-      repo = repoManager.openRepository(projectName);
-    } catch (RepositoryNotFoundException e) {
-      throw new Failure(1, "fatal: '" + project.getName() + "': not a git archive", e);
-    }
-
-    try {
-      runImpl();
-    } finally {
-      repo.close();
-    }
-  }
-
-  protected abstract void runImpl() throws IOException, PermissionBackendException, Failure;
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AliasCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AliasCommand.java
deleted file mode 100644
index 0ac7765..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AliasCommand.java
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.sshd;
-
-import com.google.common.base.Throwables;
-import com.google.common.util.concurrent.Atomics;
-import com.google.gerrit.extensions.api.access.GlobalOrPluginPermission;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import java.io.IOException;
-import java.util.LinkedList;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicReference;
-import org.apache.sshd.server.Command;
-import org.apache.sshd.server.Environment;
-
-/** Command that executes some other command. */
-public class AliasCommand extends BaseCommand {
-  private final DispatchCommandProvider root;
-  private final CurrentUser currentUser;
-  private final PermissionBackend permissionBackend;
-  private final CommandName command;
-  private final AtomicReference<Command> atomicCmd;
-
-  AliasCommand(
-      @CommandName(Commands.ROOT) DispatchCommandProvider root,
-      PermissionBackend permissionBackend,
-      CurrentUser currentUser,
-      CommandName command) {
-    this.root = root;
-    this.permissionBackend = permissionBackend;
-    this.currentUser = currentUser;
-    this.command = command;
-    this.atomicCmd = Atomics.newReference();
-  }
-
-  @Override
-  public void start(Environment env) throws IOException {
-    try {
-      begin(env);
-    } catch (Failure e) {
-      String msg = e.getMessage();
-      if (!msg.endsWith("\n")) {
-        msg += "\n";
-      }
-      err.write(msg.getBytes(ENC));
-      err.flush();
-      onExit(e.exitCode);
-    }
-  }
-
-  private void begin(Environment env) throws IOException, Failure {
-    Map<String, CommandProvider> map = root.getMap();
-    for (String name : chain(command)) {
-      CommandProvider p = map.get(name);
-      if (p == null) {
-        throw die(getName() + ": not found");
-      }
-
-      Command cmd = p.getProvider().get();
-      if (!(cmd instanceof DispatchCommand)) {
-        throw die(getName() + ": not found");
-      }
-      map = ((DispatchCommand) cmd).getMap();
-    }
-
-    CommandProvider p = map.get(command.value());
-    if (p == null) {
-      throw die(getName() + ": not found");
-    }
-
-    Command cmd = p.getProvider().get();
-    checkRequiresCapability(cmd);
-    if (cmd instanceof BaseCommand) {
-      BaseCommand bc = (BaseCommand) cmd;
-      bc.setName(getName());
-      bc.setArguments(getArguments());
-    }
-    provideStateTo(cmd);
-    atomicCmd.set(cmd);
-    cmd.start(env);
-  }
-
-  @Override
-  public void destroy() {
-    Command cmd = atomicCmd.getAndSet(null);
-    if (cmd != null) {
-      try {
-        cmd.destroy();
-      } catch (Exception e) {
-        Throwables.throwIfUnchecked(e);
-        throw new RuntimeException(e);
-      }
-    }
-  }
-
-  private void checkRequiresCapability(Command cmd) throws Failure {
-    try {
-      Set<GlobalOrPluginPermission> check = GlobalPermission.fromAnnotation(cmd.getClass());
-      try {
-        permissionBackend.user(currentUser).checkAny(check);
-      } catch (AuthException err) {
-        throw new UnloggedFailure(BaseCommand.STATUS_NOT_ADMIN, "fatal: " + err.getMessage());
-      }
-    } catch (PermissionBackendException err) {
-      throw new Failure(1, "fatal: permissions unavailable", err);
-    }
-  }
-
-  private static LinkedList<String> chain(CommandName command) {
-    LinkedList<String> chain = new LinkedList<>();
-    while (command != null) {
-      chain.addFirst(command.value());
-      command = Commands.parentOf(command);
-    }
-    chain.removeLast();
-    return chain;
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AliasCommandProvider.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AliasCommandProvider.java
deleted file mode 100644
index 0ef0473..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AliasCommandProvider.java
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.sshd;
-
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import org.apache.sshd.server.Command;
-
-/** Resolves an alias to another command. */
-public class AliasCommandProvider implements Provider<Command> {
-  private final CommandName command;
-
-  @Inject
-  @CommandName(Commands.ROOT)
-  private DispatchCommandProvider root;
-
-  @Inject private PermissionBackend permissionBackend;
-  @Inject private CurrentUser currentUser;
-
-  public AliasCommandProvider(CommandName command) {
-    this.command = command;
-  }
-
-  @Override
-  public Command get() {
-    return new AliasCommand(root, permissionBackend, currentUser, command);
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/BaseCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/BaseCommand.java
deleted file mode 100644
index 220b0d3..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/BaseCommand.java
+++ /dev/null
@@ -1,596 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.sshd;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.base.Joiner;
-import com.google.common.util.concurrent.Atomics;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.annotations.PluginName;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.AccessPath;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.DynamicOptions;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.RequestCleanup;
-import com.google.gerrit.server.git.ProjectRunnable;
-import com.google.gerrit.server.git.WorkQueue.CancelableRunnable;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.sshd.SshScope.Context;
-import com.google.gerrit.util.cli.CmdLineParser;
-import com.google.gerrit.util.cli.EndOfOptionsHandler;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InterruptedIOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.nio.charset.Charset;
-import java.util.concurrent.Future;
-import java.util.concurrent.ScheduledThreadPoolExecutor;
-import java.util.concurrent.atomic.AtomicReference;
-import org.apache.sshd.common.SshException;
-import org.apache.sshd.server.Command;
-import org.apache.sshd.server.Environment;
-import org.apache.sshd.server.ExitCallback;
-import org.kohsuke.args4j.Argument;
-import org.kohsuke.args4j.CmdLineException;
-import org.kohsuke.args4j.Option;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public abstract class BaseCommand implements Command {
-  private static final Logger log = LoggerFactory.getLogger(BaseCommand.class);
-  public static final Charset ENC = UTF_8;
-
-  private static final int PRIVATE_STATUS = 1 << 30;
-  static final int STATUS_CANCEL = PRIVATE_STATUS | 1;
-  static final int STATUS_NOT_FOUND = PRIVATE_STATUS | 2;
-  public static final int STATUS_NOT_ADMIN = PRIVATE_STATUS | 3;
-
-  @Option(name = "--", usage = "end of options", handler = EndOfOptionsHandler.class)
-  private boolean endOfOptions;
-
-  protected InputStream in;
-  protected OutputStream out;
-  protected OutputStream err;
-
-  private ExitCallback exit;
-
-  @Inject private SshScope sshScope;
-
-  @Inject private CmdLineParser.Factory cmdLineParserFactory;
-
-  @Inject private RequestCleanup cleanup;
-
-  @Inject @CommandExecutor private ScheduledThreadPoolExecutor executor;
-
-  @Inject private PermissionBackend permissionBackend;
-  @Inject private CurrentUser user;
-
-  @Inject private SshScope.Context context;
-
-  /** Commands declared by a plugin can be scoped by the plugin name. */
-  @Inject(optional = true)
-  @PluginName
-  private String pluginName;
-
-  @Inject private Injector injector;
-
-  @Inject private DynamicMap<DynamicOptions.DynamicBean> dynamicBeans = null;
-
-  /** The task, as scheduled on a worker thread. */
-  private final AtomicReference<Future<?>> task;
-
-  /** Text of the command line which lead up to invoking this instance. */
-  private String commandName = "";
-
-  /** Unparsed command line options. */
-  private String[] argv;
-
-  /** trimmed command line arguments. */
-  private String[] trimmedArgv;
-
-  public BaseCommand() {
-    task = Atomics.newReference();
-  }
-
-  @Override
-  public void setInputStream(InputStream in) {
-    this.in = in;
-  }
-
-  @Override
-  public void setOutputStream(OutputStream out) {
-    this.out = out;
-  }
-
-  @Override
-  public void setErrorStream(OutputStream err) {
-    this.err = err;
-  }
-
-  @Override
-  public void setExitCallback(ExitCallback callback) {
-    this.exit = callback;
-  }
-
-  @Nullable
-  protected String getPluginName() {
-    return pluginName;
-  }
-
-  protected String getName() {
-    return commandName;
-  }
-
-  void setName(String prefix) {
-    this.commandName = prefix;
-  }
-
-  public String[] getArguments() {
-    return argv;
-  }
-
-  public void setArguments(String[] argv) {
-    this.argv = argv;
-  }
-
-  /**
-   * Trim the argument if it is spanning multiple lines.
-   *
-   * @return the arguments where all the multiple-line fields are trimmed.
-   */
-  protected String[] getTrimmedArguments() {
-    if (trimmedArgv == null && argv != null) {
-      trimmedArgv = new String[argv.length];
-      for (int i = 0; i < argv.length; i++) {
-        String arg = argv[i];
-        int indexOfMultiLine = arg.indexOf("\n");
-        if (indexOfMultiLine > -1) {
-          arg = arg.substring(0, indexOfMultiLine).concat(" [trimmed]");
-        }
-        trimmedArgv[i] = arg;
-      }
-    }
-    return trimmedArgv;
-  }
-
-  @Override
-  public void destroy() {
-    Future<?> future = task.getAndSet(null);
-    if (future != null && !future.isDone()) {
-      future.cancel(true);
-    }
-  }
-
-  /**
-   * Pass all state into the command, then run its start method.
-   *
-   * <p>This method copies all critical state, like the input and output streams, into the supplied
-   * command. The caller must still invoke {@code cmd.start()} if wants to pass control to the
-   * command.
-   *
-   * @param cmd the command that will receive the current state.
-   */
-  protected void provideStateTo(Command cmd) {
-    cmd.setInputStream(in);
-    cmd.setOutputStream(out);
-    cmd.setErrorStream(err);
-    cmd.setExitCallback(exit);
-  }
-
-  /**
-   * Parses the command line argument, injecting parsed values into fields.
-   *
-   * <p>This method must be explicitly invoked to cause a parse.
-   *
-   * @throws UnloggedFailure if the command line arguments were invalid.
-   * @see Option
-   * @see Argument
-   */
-  protected void parseCommandLine() throws UnloggedFailure {
-    parseCommandLine(this);
-  }
-
-  /**
-   * Parses the command line argument, injecting parsed values into fields.
-   *
-   * <p>This method must be explicitly invoked to cause a parse.
-   *
-   * @param options object whose fields declare Option and Argument annotations to describe the
-   *     parameters of the command. Usually {@code this}.
-   * @throws UnloggedFailure if the command line arguments were invalid.
-   * @see Option
-   * @see Argument
-   */
-  protected void parseCommandLine(Object options) throws UnloggedFailure {
-    final CmdLineParser clp = newCmdLineParser(options);
-    DynamicOptions pluginOptions = new DynamicOptions(options, injector, dynamicBeans);
-    pluginOptions.parseDynamicBeans(clp);
-    pluginOptions.setDynamicBeans();
-    pluginOptions.onBeanParseStart();
-    try {
-      clp.parseArgument(argv);
-    } catch (IllegalArgumentException | CmdLineException err) {
-      if (!clp.wasHelpRequestedByOption()) {
-        throw new UnloggedFailure(1, "fatal: " + err.getMessage());
-      }
-    }
-
-    if (clp.wasHelpRequestedByOption()) {
-      StringWriter msg = new StringWriter();
-      clp.printDetailedUsage(commandName, msg);
-      msg.write(usage());
-      throw new UnloggedFailure(1, msg.toString());
-    }
-    pluginOptions.onBeanParseEnd();
-  }
-
-  protected String usage() {
-    return "";
-  }
-
-  /** Construct a new parser for this command's received command line. */
-  protected CmdLineParser newCmdLineParser(Object options) {
-    return cmdLineParserFactory.create(options);
-  }
-
-  /**
-   * Spawn a function into its own thread.
-   *
-   * <p>Typically this should be invoked within {@link Command#start(Environment)}, such as:
-   *
-   * <pre>
-   * startThread(new CommandRunnable() {
-   *   public void run() throws Exception {
-   *     runImp();
-   *   }
-   * },
-   * accessPath);
-   * </pre>
-   *
-   * <p>If the function throws an exception, it is translated to a simple message for the client, a
-   * non-zero exit code, and the stack trace is logged.
-   *
-   * @param thunk the runnable to execute on the thread, performing the command's logic.
-   * @param accessPath the path used by the end user for running the SSH command
-   */
-  protected void startThread(final CommandRunnable thunk, AccessPath accessPath) {
-    final TaskThunk tt = new TaskThunk(thunk, accessPath);
-
-    if (isAdminHighPriorityCommand()) {
-      // Admin commands should not block the main work threads (there
-      // might be an interactive shell there), nor should they wait
-      // for the main work threads.
-      //
-      new Thread(tt, tt.toString()).start();
-    } else {
-      task.set(executor.submit(tt));
-    }
-  }
-
-  private boolean isAdminHighPriorityCommand() {
-    if (getClass().getAnnotation(AdminHighPriorityCommand.class) != null) {
-      try {
-        permissionBackend.user(user).check(GlobalPermission.ADMINISTRATE_SERVER);
-        return true;
-      } catch (AuthException | PermissionBackendException e) {
-        return false;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * Terminate this command and return a result code to the remote client.
-   *
-   * <p>Commands should invoke this at most once. Once invoked, the command may lose access to
-   * request based resources as any callbacks previously registered with {@link RequestCleanup} will
-   * fire.
-   *
-   * @param rc exit code for the remote client.
-   */
-  protected void onExit(int rc) {
-    exit.onExit(rc);
-    if (cleanup != null) {
-      cleanup.run();
-    }
-  }
-
-  /** Wrap the supplied output stream in a UTF-8 encoded PrintWriter. */
-  protected static PrintWriter toPrintWriter(OutputStream o) {
-    return new PrintWriter(new BufferedWriter(new OutputStreamWriter(o, ENC)));
-  }
-
-  private int handleError(Throwable e) {
-    if ((e.getClass() == IOException.class && "Pipe closed".equals(e.getMessage()))
-        || //
-        (e.getClass() == SshException.class && "Already closed".equals(e.getMessage()))
-        || //
-        e.getClass() == InterruptedIOException.class) {
-      // This is sshd telling us the client just dropped off while
-      // we were waiting for a read or a write to complete. Either
-      // way its not really a fatal error. Don't log it.
-      //
-      return 127;
-    }
-
-    if (!(e instanceof UnloggedFailure)) {
-      final StringBuilder m = new StringBuilder();
-      m.append("Internal server error");
-      if (user.isIdentifiedUser()) {
-        final IdentifiedUser u = user.asIdentifiedUser();
-        m.append(" (user ");
-        m.append(u.getAccount().getUserName());
-        m.append(" account ");
-        m.append(u.getAccountId());
-        m.append(")");
-      }
-      m.append(" during ");
-      m.append(context.getCommandLine());
-      log.error(m.toString(), e);
-    }
-
-    if (e instanceof Failure) {
-      final Failure f = (Failure) e;
-      try {
-        err.write((f.getMessage() + "\n").getBytes(ENC));
-        err.flush();
-      } catch (IOException e2) {
-        // Ignored
-      } catch (Throwable e2) {
-        log.warn("Cannot send failure message to client", e2);
-      }
-      return f.exitCode;
-    }
-
-    try {
-      err.write("fatal: internal server error\n".getBytes(ENC));
-      err.flush();
-    } catch (IOException e2) {
-      // Ignored
-    } catch (Throwable e2) {
-      log.warn("Cannot send internal server error message to client", e2);
-    }
-    return 128;
-  }
-
-  protected UnloggedFailure die(String msg) {
-    return new UnloggedFailure(1, "fatal: " + msg);
-  }
-
-  protected UnloggedFailure die(Throwable why) {
-    return new UnloggedFailure(1, "fatal: " + why.getMessage(), why);
-  }
-
-  protected void writeError(String type, String msg) {
-    try {
-      err.write((type + ": " + msg + "\n").getBytes(ENC));
-    } catch (IOException e) {
-      // Ignored
-    }
-  }
-
-  protected String getTaskDescription() {
-    String[] ta = getTrimmedArguments();
-    if (ta != null) {
-      return commandName + " " + Joiner.on(" ").join(ta);
-    }
-    return commandName;
-  }
-
-  private String getTaskName() {
-    StringBuilder m = new StringBuilder();
-    m.append(getTaskDescription());
-    if (user.isIdentifiedUser()) {
-      IdentifiedUser u = user.asIdentifiedUser();
-      m.append(" (").append(u.getAccount().getUserName()).append(")");
-    }
-    return m.toString();
-  }
-
-  private final class TaskThunk implements CancelableRunnable, ProjectRunnable {
-    private final CommandRunnable thunk;
-    private final String taskName;
-    private final AccessPath accessPath;
-    private Project.NameKey projectName;
-
-    private TaskThunk(final CommandRunnable thunk, AccessPath accessPath) {
-      this.thunk = thunk;
-      this.taskName = getTaskName();
-      this.accessPath = accessPath;
-    }
-
-    @Override
-    public void cancel() {
-      synchronized (this) {
-        final Context old = sshScope.set(context);
-        try {
-          onExit(STATUS_CANCEL);
-        } finally {
-          sshScope.set(old);
-        }
-      }
-    }
-
-    @Override
-    public void run() {
-      synchronized (this) {
-        final Thread thisThread = Thread.currentThread();
-        final String thisName = thisThread.getName();
-        int rc = 0;
-        context.getSession().setAccessPath(accessPath);
-        final Context old = sshScope.set(context);
-        try {
-          context.started = TimeUtil.nowMs();
-          thisThread.setName("SSH " + taskName);
-
-          if (thunk instanceof ProjectCommandRunnable) {
-            ((ProjectCommandRunnable) thunk).executeParseCommand();
-            projectName = ((ProjectCommandRunnable) thunk).getProjectName();
-          }
-
-          try {
-            thunk.run();
-          } catch (NoSuchProjectException e) {
-            throw new UnloggedFailure(1, e.getMessage());
-          } catch (NoSuchChangeException e) {
-            throw new UnloggedFailure(1, e.getMessage() + " no such change");
-          }
-
-          out.flush();
-          err.flush();
-        } catch (Throwable e) {
-          try {
-            out.flush();
-          } catch (Throwable e2) {
-            // Ignored
-          }
-          try {
-            err.flush();
-          } catch (Throwable e2) {
-            // Ignored
-          }
-          rc = handleError(e);
-        } finally {
-          try {
-            onExit(rc);
-          } finally {
-            sshScope.set(old);
-            thisThread.setName(thisName);
-          }
-        }
-      }
-    }
-
-    @Override
-    public String toString() {
-      return taskName;
-    }
-
-    @Override
-    public Project.NameKey getProjectNameKey() {
-      return projectName;
-    }
-
-    @Override
-    public String getRemoteName() {
-      return null;
-    }
-
-    @Override
-    public boolean hasCustomizedPrint() {
-      return false;
-    }
-  }
-
-  /** Runnable function which can throw an exception. */
-  @FunctionalInterface
-  public interface CommandRunnable {
-    void run() throws Exception;
-  }
-
-  /** Runnable function which can retrieve a project name related to the task */
-  public interface ProjectCommandRunnable extends CommandRunnable {
-    // execute parser command before running, in order to be able to retrieve
-    // project name
-    void executeParseCommand() throws Exception;
-
-    Project.NameKey getProjectName();
-  }
-
-  /** Thrown from {@link CommandRunnable#run()} with client message and code. */
-  public static class Failure extends Exception {
-    private static final long serialVersionUID = 1L;
-
-    final int exitCode;
-
-    /**
-     * Create a new failure.
-     *
-     * @param exitCode exit code to return the client, which indicates the failure status of this
-     *     command. Should be between 1 and 255, inclusive.
-     * @param msg message to also send to the client's stderr.
-     */
-    public Failure(int exitCode, String msg) {
-      this(exitCode, msg, null);
-    }
-
-    /**
-     * Create a new failure.
-     *
-     * @param exitCode exit code to return the client, which indicates the failure status of this
-     *     command. Should be between 1 and 255, inclusive.
-     * @param msg message to also send to the client's stderr.
-     * @param why stack trace to include in the server's log, but is not sent to the client's
-     *     stderr.
-     */
-    public Failure(int exitCode, String msg, Throwable why) {
-      super(msg, why);
-      this.exitCode = exitCode;
-    }
-  }
-
-  /** Thrown from {@link CommandRunnable#run()} with client message and code. */
-  public static class UnloggedFailure extends Failure {
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * Create a new failure.
-     *
-     * @param msg message to also send to the client's stderr.
-     */
-    public UnloggedFailure(String msg) {
-      this(1, msg);
-    }
-
-    /**
-     * Create a new failure.
-     *
-     * @param exitCode exit code to return the client, which indicates the failure status of this
-     *     command. Should be between 1 and 255, inclusive.
-     * @param msg message to also send to the client's stderr.
-     */
-    public UnloggedFailure(int exitCode, String msg) {
-      this(exitCode, msg, null);
-    }
-
-    /**
-     * Create a new failure.
-     *
-     * @param exitCode exit code to return the client, which indicates the failure status of this
-     *     command. Should be between 1 and 255, inclusive.
-     * @param msg message to also send to the client's stderr.
-     * @param why stack trace to include in the server's log, but is not sent to the client's
-     *     stderr.
-     */
-    public UnloggedFailure(int exitCode, String msg, Throwable why) {
-      super(exitCode, msg, why);
-    }
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/ChangeArgumentParser.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/ChangeArgumentParser.java
deleted file mode 100644
index 1c55f48..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/ChangeArgumentParser.java
+++ /dev/null
@@ -1,138 +0,0 @@
-// 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.
-
-package com.google.gerrit.sshd;
-
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ChangeFinder;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.change.ChangeResource;
-import com.google.gerrit.server.change.ChangesCollection;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.permissions.ChangePermission;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.sshd.BaseCommand.UnloggedFailure;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-public class ChangeArgumentParser {
-  private final CurrentUser currentUser;
-  private final ChangesCollection changesCollection;
-  private final ChangeFinder changeFinder;
-  private final ReviewDb db;
-  private final ChangeNotes.Factory changeNotesFactory;
-  private final PermissionBackend permissionBackend;
-
-  @Inject
-  ChangeArgumentParser(
-      CurrentUser currentUser,
-      ChangesCollection changesCollection,
-      ChangeFinder changeFinder,
-      ReviewDb db,
-      ChangeNotes.Factory changeNotesFactory,
-      PermissionBackend permissionBackend) {
-    this.currentUser = currentUser;
-    this.changesCollection = changesCollection;
-    this.changeFinder = changeFinder;
-    this.db = db;
-    this.changeNotesFactory = changeNotesFactory;
-    this.permissionBackend = permissionBackend;
-  }
-
-  public void addChange(String id, Map<Change.Id, ChangeResource> changes)
-      throws UnloggedFailure, OrmException, PermissionBackendException {
-    addChange(id, changes, null);
-  }
-
-  public void addChange(
-      String id, Map<Change.Id, ChangeResource> changes, ProjectControl projectControl)
-      throws UnloggedFailure, OrmException, PermissionBackendException {
-    addChange(id, changes, projectControl, true);
-  }
-
-  public void addChange(
-      String id,
-      Map<Change.Id, ChangeResource> changes,
-      ProjectControl projectControl,
-      boolean useIndex)
-      throws UnloggedFailure, OrmException, PermissionBackendException {
-    List<ChangeNotes> matched = useIndex ? changeFinder.find(id) : changeFromNotesFactory(id);
-    List<ChangeNotes> toAdd = new ArrayList<>(changes.size());
-    boolean canMaintainServer;
-    try {
-      permissionBackend.user(currentUser).check(GlobalPermission.MAINTAIN_SERVER);
-      canMaintainServer = true;
-    } catch (AuthException | PermissionBackendException e) {
-      canMaintainServer = false;
-    }
-    for (ChangeNotes notes : matched) {
-      if (!changes.containsKey(notes.getChangeId())
-          && inProject(projectControl, notes.getProjectName())
-          && (canMaintainServer
-              || permissionBackend
-                  .user(currentUser)
-                  .change(notes)
-                  .database(db)
-                  .test(ChangePermission.READ))) {
-        toAdd.add(notes);
-      }
-    }
-
-    if (toAdd.isEmpty()) {
-      throw new UnloggedFailure(1, "\"" + id + "\" no such change");
-    } else if (toAdd.size() > 1) {
-      throw new UnloggedFailure(1, "\"" + id + "\" matches multiple changes");
-    }
-    Change.Id cId = toAdd.get(0).getChangeId();
-    ChangeResource changeResource;
-    try {
-      changeResource = changesCollection.parse(cId);
-    } catch (ResourceNotFoundException e) {
-      throw new UnloggedFailure(1, "\"" + id + "\" no such change");
-    }
-    changes.put(cId, changeResource);
-  }
-
-  private List<ChangeNotes> changeFromNotesFactory(String id) throws OrmException, UnloggedFailure {
-    return changeNotesFactory.create(db, parseId(id));
-  }
-
-  private List<Change.Id> parseId(String id) throws UnloggedFailure {
-    try {
-      return Arrays.asList(new Change.Id(Integer.parseInt(id)));
-    } catch (NumberFormatException e) {
-      throw new UnloggedFailure(2, "Invalid change ID " + id, e);
-    }
-  }
-
-  private boolean inProject(ProjectControl projectControl, Project.NameKey project) {
-    if (projectControl != null) {
-      return projectControl.getProject().getNameKey().equals(project);
-    }
-
-    // No --project option, so they want every project.
-    return true;
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandFactoryProvider.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandFactoryProvider.java
deleted file mode 100644
index e0f458b..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandFactoryProvider.java
+++ /dev/null
@@ -1,312 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.sshd;
-
-import com.google.common.util.concurrent.Atomics;
-import com.google.common.util.concurrent.ThreadFactoryBuilder;
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.git.WorkQueue;
-import com.google.gerrit.sshd.SshScope.Context;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicReference;
-import org.apache.sshd.server.Command;
-import org.apache.sshd.server.CommandFactory;
-import org.apache.sshd.server.Environment;
-import org.apache.sshd.server.ExitCallback;
-import org.apache.sshd.server.SessionAware;
-import org.apache.sshd.server.session.ServerSession;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Creates a CommandFactory using commands registered by {@link CommandModule}. */
-@Singleton
-class CommandFactoryProvider implements Provider<CommandFactory>, LifecycleListener {
-  private static final Logger logger = LoggerFactory.getLogger(CommandFactoryProvider.class);
-
-  private final DispatchCommandProvider dispatcher;
-  private final SshLog log;
-  private final SshScope sshScope;
-  private final ScheduledExecutorService startExecutor;
-  private final ExecutorService destroyExecutor;
-  private final SchemaFactory<ReviewDb> schemaFactory;
-  private final DynamicItem<SshCreateCommandInterceptor> createCommandInterceptor;
-
-  @Inject
-  CommandFactoryProvider(
-      @CommandName(Commands.ROOT) DispatchCommandProvider d,
-      @GerritServerConfig Config cfg,
-      WorkQueue workQueue,
-      SshLog l,
-      SshScope s,
-      SchemaFactory<ReviewDb> sf,
-      DynamicItem<SshCreateCommandInterceptor> i) {
-    dispatcher = d;
-    log = l;
-    sshScope = s;
-    schemaFactory = sf;
-    createCommandInterceptor = i;
-
-    int threads = cfg.getInt("sshd", "commandStartThreads", 2);
-    startExecutor = workQueue.createQueue(threads, "SshCommandStart", true);
-    destroyExecutor =
-        Executors.newSingleThreadExecutor(
-            new ThreadFactoryBuilder()
-                .setNameFormat("SshCommandDestroy-%s")
-                .setDaemon(true)
-                .build());
-  }
-
-  @Override
-  public void start() {}
-
-  @Override
-  public void stop() {
-    destroyExecutor.shutdownNow();
-  }
-
-  @Override
-  public CommandFactory get() {
-    return new CommandFactory() {
-      @Override
-      public Command createCommand(String requestCommand) {
-        String c = requestCommand;
-        SshCreateCommandInterceptor interceptor = createCommandInterceptor.get();
-        if (interceptor != null) {
-          c = interceptor.intercept(c);
-        }
-        return new Trampoline(c);
-      }
-    };
-  }
-
-  private class Trampoline implements Command, SessionAware {
-    private final String commandLine;
-    private final String[] argv;
-    private InputStream in;
-    private OutputStream out;
-    private OutputStream err;
-    private ExitCallback exit;
-    private Environment env;
-    private Context ctx;
-    private DispatchCommand cmd;
-    private final AtomicBoolean logged;
-    private final AtomicReference<Future<?>> task;
-
-    Trampoline(String cmdLine) {
-      commandLine = cmdLine;
-      argv = split(cmdLine);
-      logged = new AtomicBoolean();
-      task = Atomics.newReference();
-    }
-
-    @Override
-    public void setInputStream(InputStream in) {
-      this.in = in;
-    }
-
-    @Override
-    public void setOutputStream(OutputStream out) {
-      this.out = out;
-    }
-
-    @Override
-    public void setErrorStream(OutputStream err) {
-      this.err = err;
-    }
-
-    @Override
-    public void setExitCallback(ExitCallback callback) {
-      this.exit = callback;
-    }
-
-    @Override
-    public void setSession(ServerSession session) {
-      final SshSession s = session.getAttribute(SshSession.KEY);
-      this.ctx = sshScope.newContext(schemaFactory, s, commandLine);
-    }
-
-    @Override
-    public void start(Environment env) throws IOException {
-      this.env = env;
-      final Context ctx = this.ctx;
-      task.set(
-          startExecutor.submit(
-              new Runnable() {
-                @Override
-                public void run() {
-                  try {
-                    onStart();
-                  } catch (Exception e) {
-                    logger.warn(
-                        "Cannot start command \""
-                            + ctx.getCommandLine()
-                            + "\" for user "
-                            + ctx.getSession().getUsername(),
-                        e);
-                  }
-                }
-
-                @Override
-                public String toString() {
-                  return "start (user " + ctx.getSession().getUsername() + ")";
-                }
-              }));
-    }
-
-    private void onStart() throws IOException {
-      synchronized (this) {
-        final Context old = sshScope.set(ctx);
-        try {
-          cmd = dispatcher.get();
-          cmd.setArguments(argv);
-          cmd.setInputStream(in);
-          cmd.setOutputStream(out);
-          cmd.setErrorStream(err);
-          cmd.setExitCallback(
-              new ExitCallback() {
-                @Override
-                public void onExit(int rc, String exitMessage) {
-                  exit.onExit(translateExit(rc), exitMessage);
-                  log(rc);
-                }
-
-                @Override
-                public void onExit(int rc) {
-                  exit.onExit(translateExit(rc));
-                  log(rc);
-                }
-              });
-          cmd.start(env);
-        } finally {
-          sshScope.set(old);
-        }
-      }
-    }
-
-    private int translateExit(int rc) {
-      switch (rc) {
-        case BaseCommand.STATUS_NOT_ADMIN:
-          return 1;
-
-        case BaseCommand.STATUS_CANCEL:
-          return 15 /* SIGKILL */;
-
-        case BaseCommand.STATUS_NOT_FOUND:
-          return 127 /* POSIX not found */;
-
-        default:
-          return rc;
-      }
-    }
-
-    private void log(int rc) {
-      if (logged.compareAndSet(false, true)) {
-        log.onExecute(cmd, rc, ctx.getSession());
-      }
-    }
-
-    @Override
-    public void destroy() {
-      Future<?> future = task.getAndSet(null);
-      if (future != null) {
-        future.cancel(true);
-        destroyExecutor.execute(this::onDestroy);
-      }
-    }
-
-    private void onDestroy() {
-      synchronized (this) {
-        if (cmd != null) {
-          final Context old = sshScope.set(ctx);
-          try {
-            cmd.destroy();
-            log(BaseCommand.STATUS_CANCEL);
-          } finally {
-            ctx = null;
-            cmd = null;
-            sshScope.set(old);
-          }
-        }
-      }
-    }
-  }
-
-  /** Split a command line into a string array. */
-  public static String[] split(String commandLine) {
-    final List<String> list = new ArrayList<>();
-    boolean inquote = false;
-    boolean inDblQuote = false;
-    StringBuilder r = new StringBuilder();
-    for (int ip = 0; ip < commandLine.length(); ) {
-      final char b = commandLine.charAt(ip++);
-      switch (b) {
-        case '\t':
-        case ' ':
-          if (inquote || inDblQuote) {
-            r.append(b);
-          } else if (r.length() > 0) {
-            list.add(r.toString());
-            r = new StringBuilder();
-          }
-          continue;
-        case '\"':
-          if (inquote) {
-            r.append(b);
-          } else {
-            inDblQuote = !inDblQuote;
-          }
-          continue;
-        case '\'':
-          if (inDblQuote) {
-            r.append(b);
-          } else {
-            inquote = !inquote;
-          }
-          continue;
-        case '\\':
-          if (inquote || ip == commandLine.length()) {
-            r.append(b); // literal within a quote
-          } else {
-            r.append(commandLine.charAt(ip++));
-          }
-          continue;
-        default:
-          r.append(b);
-          continue;
-      }
-    }
-    if (r.length() > 0) {
-      list.add(r.toString());
-    }
-    return list.toArray(new String[list.size()]);
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandModule.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandModule.java
deleted file mode 100644
index 93aab0b..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandModule.java
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.sshd;
-
-import com.google.gerrit.lifecycle.LifecycleModule;
-import com.google.inject.binder.LinkedBindingBuilder;
-import org.apache.sshd.server.Command;
-
-/** Module to register commands in the SSH daemon. */
-public abstract class CommandModule extends LifecycleModule {
-  protected boolean slaveMode;
-
-  /**
-   * Configure a command to be invoked by name.
-   *
-   * @param name the name of the command the client will provide in order to call the command.
-   * @return a binding that must be bound to a non-singleton provider for a {@link Command} object.
-   */
-  protected LinkedBindingBuilder<Command> command(String name) {
-    return bind(Commands.key(name));
-  }
-
-  /**
-   * Configure a command to be invoked by name.
-   *
-   * @param name the name of the command the client will provide in order to call the command.
-   * @return a binding that must be bound to a non-singleton provider for a {@link Command} object.
-   */
-  protected LinkedBindingBuilder<Command> command(CommandName name) {
-    return bind(Commands.key(name));
-  }
-
-  /**
-   * Configure a command to be invoked by name.
-   *
-   * @param parent context of the parent command, that this command is a subcommand of.
-   * @param name the name of the command the client will provide in order to call the command.
-   * @return a binding that must be bound to a non-singleton provider for a {@link Command} object.
-   */
-  protected LinkedBindingBuilder<Command> command(CommandName parent, String name) {
-    return bind(Commands.key(parent, name));
-  }
-
-  /**
-   * Configure a command to be invoked by name. The command is bound to the passed class.
-   *
-   * @param parent context of the parent command, that this command is a subcommand of.
-   * @param clazz class of the command with {@link CommandMetaData} annotation to retrieve the name
-   *     and the description from
-   */
-  protected void command(CommandName parent, Class<? extends BaseCommand> clazz) {
-    CommandMetaData meta = clazz.getAnnotation(CommandMetaData.class);
-    if (meta == null) {
-      throw new IllegalStateException("no CommandMetaData annotation found");
-    }
-    if (meta.runsAt().isSupported(slaveMode)) {
-      bind(Commands.key(parent, meta.name(), meta.description())).to(clazz);
-    }
-  }
-
-  /**
-   * Alias one command to another. The alias is bound to the passed class.
-   *
-   * @param parent context of the parent command, that this command is a subcommand of.
-   * @param name the name of the command the client will provide in order to call the command.
-   * @param clazz class of the command with {@link CommandMetaData} annotation to retrieve the
-   *     description from
-   */
-  protected void alias(final CommandName parent, String name, Class<? extends BaseCommand> clazz) {
-    CommandMetaData meta = clazz.getAnnotation(CommandMetaData.class);
-    if (meta == null) {
-      throw new IllegalStateException("no CommandMetaData annotation found");
-    }
-    bind(Commands.key(parent, name, meta.description())).to(clazz);
-  }
-
-  /**
-   * Alias one command to another.
-   *
-   * @param from the new command name that when called will actually delegate to {@code to}'s
-   *     implementation.
-   * @param to name of an already registered command that will perform the action when {@code from}
-   *     is invoked by a client.
-   */
-  protected void alias(String from, String to) {
-    bind(Commands.key(from)).to(Commands.key(to));
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandProvider.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandProvider.java
deleted file mode 100644
index 61c36cb..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandProvider.java
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.sshd;
-
-import com.google.inject.Provider;
-import org.apache.sshd.server.Command;
-
-final class CommandProvider {
-
-  private final Provider<Command> provider;
-  private final String description;
-
-  CommandProvider(Provider<Command> p, String d) {
-    this.provider = p;
-    this.description = d;
-  }
-
-  public Provider<Command> getProvider() {
-    return provider;
-  }
-
-  public String getDescription() {
-    return description;
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/Commands.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/Commands.java
deleted file mode 100644
index 43d2c50..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/Commands.java
+++ /dev/null
@@ -1,138 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.sshd;
-
-import com.google.auto.value.AutoAnnotation;
-import com.google.inject.Key;
-import java.lang.annotation.Annotation;
-import org.apache.sshd.server.Command;
-
-/** Utilities to support {@link CommandName} construction. */
-public class Commands {
-  /** Magic value signaling the top level. */
-  public static final String ROOT = "";
-
-  /** Magic value signaling the top level. */
-  public static final CommandName CMD_ROOT = named(ROOT);
-
-  public static Key<Command> key(String name) {
-    return key(named(name));
-  }
-
-  public static Key<Command> key(CommandName name) {
-    return Key.get(Command.class, name);
-  }
-
-  public static Key<Command> key(CommandName parent, String name) {
-    return Key.get(Command.class, named(parent, name));
-  }
-
-  public static Key<Command> key(CommandName parent, String name, String descr) {
-    return Key.get(Command.class, named(parent, name, descr));
-  }
-
-  /** Create a CommandName annotation for the supplied name. */
-  @AutoAnnotation
-  public static CommandName named(String value) {
-    return new AutoAnnotation_Commands_named(value);
-  }
-
-  /** Create a CommandName annotation for the supplied name. */
-  public static CommandName named(CommandName parent, String name) {
-    return new NestedCommandNameImpl(parent, name);
-  }
-
-  /** Create a CommandName annotation for the supplied name and description. */
-  public static CommandName named(CommandName parent, String name, String descr) {
-    return new NestedCommandNameImpl(parent, name, descr);
-  }
-
-  /** Return the name of this command, possibly including any parents. */
-  public static String nameOf(CommandName name) {
-    if (name instanceof NestedCommandNameImpl) {
-      return nameOf(((NestedCommandNameImpl) name).parent) + " " + name.value();
-    }
-    return name.value();
-  }
-
-  /** Is the second command a direct child of the first command? */
-  public static boolean isChild(CommandName parent, CommandName name) {
-    if (name instanceof NestedCommandNameImpl) {
-      return parent.equals(((NestedCommandNameImpl) name).parent);
-    }
-    if (parent == CMD_ROOT) {
-      return true;
-    }
-    return false;
-  }
-
-  static CommandName parentOf(CommandName name) {
-    if (name instanceof NestedCommandNameImpl) {
-      return ((NestedCommandNameImpl) name).parent;
-    }
-    return null;
-  }
-
-  static final class NestedCommandNameImpl implements CommandName {
-    private final CommandName parent;
-    private final String name;
-    private final String descr;
-
-    NestedCommandNameImpl(CommandName parent, String name) {
-      this.parent = parent;
-      this.name = name;
-      this.descr = "";
-    }
-
-    NestedCommandNameImpl(CommandName parent, String name, String descr) {
-      this.parent = parent;
-      this.name = name;
-      this.descr = descr;
-    }
-
-    @Override
-    public String value() {
-      return name;
-    }
-
-    public String descr() {
-      return descr;
-    }
-
-    @Override
-    public Class<? extends Annotation> annotationType() {
-      return CommandName.class;
-    }
-
-    @Override
-    public int hashCode() {
-      return parent.hashCode() * 31 + value().hashCode();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-      return obj instanceof NestedCommandNameImpl
-          && parent.equals(((NestedCommandNameImpl) obj).parent)
-          && value().equals(((NestedCommandNameImpl) obj).value());
-    }
-
-    @Override
-    public String toString() {
-      return "CommandName[" + nameOf(this) + "]";
-    }
-  }
-
-  private Commands() {}
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DatabasePubKeyAuth.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DatabasePubKeyAuth.java
deleted file mode 100644
index 7e0406a..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DatabasePubKeyAuth.java
+++ /dev/null
@@ -1,223 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.sshd;
-
-import static java.nio.charset.StandardCharsets.ISO_8859_1;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.base.Preconditions;
-import com.google.gerrit.common.FileUtil;
-import com.google.gerrit.reviewdb.client.AccountSshKey;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.PeerDaemonUser;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.inject.Inject;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.NoSuchFileException;
-import java.nio.file.Path;
-import java.security.KeyPair;
-import java.security.PublicKey;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Locale;
-import java.util.Set;
-import org.apache.commons.codec.binary.Base64;
-import org.apache.sshd.common.SshException;
-import org.apache.sshd.common.keyprovider.KeyPairProvider;
-import org.apache.sshd.common.util.buffer.ByteArrayBuffer;
-import org.apache.sshd.server.auth.pubkey.PublickeyAuthenticator;
-import org.apache.sshd.server.session.ServerSession;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Authenticates by public key through {@link AccountSshKey} entities. */
-class DatabasePubKeyAuth implements PublickeyAuthenticator {
-  private static final Logger log = LoggerFactory.getLogger(DatabasePubKeyAuth.class);
-
-  private final SshKeyCacheImpl sshKeyCache;
-  private final SshLog sshLog;
-  private final IdentifiedUser.GenericFactory userFactory;
-  private final PeerDaemonUser.Factory peerFactory;
-  private final Config config;
-  private final SshScope sshScope;
-  private final Set<PublicKey> myHostKeys;
-  private volatile PeerKeyCache peerKeyCache;
-
-  @Inject
-  DatabasePubKeyAuth(
-      SshKeyCacheImpl skc,
-      SshLog l,
-      IdentifiedUser.GenericFactory uf,
-      PeerDaemonUser.Factory pf,
-      SitePaths site,
-      KeyPairProvider hostKeyProvider,
-      @GerritServerConfig Config cfg,
-      SshScope s) {
-    sshKeyCache = skc;
-    sshLog = l;
-    userFactory = uf;
-    peerFactory = pf;
-    config = cfg;
-    sshScope = s;
-    myHostKeys = myHostKeys(hostKeyProvider);
-    peerKeyCache = new PeerKeyCache(site.peer_keys);
-  }
-
-  private static Set<PublicKey> myHostKeys(KeyPairProvider p) {
-    final Set<PublicKey> keys = new HashSet<>(6);
-    addPublicKey(keys, p, KeyPairProvider.SSH_ED25519);
-    addPublicKey(keys, p, KeyPairProvider.ECDSA_SHA2_NISTP256);
-    addPublicKey(keys, p, KeyPairProvider.ECDSA_SHA2_NISTP384);
-    addPublicKey(keys, p, KeyPairProvider.ECDSA_SHA2_NISTP521);
-    addPublicKey(keys, p, KeyPairProvider.SSH_RSA);
-    addPublicKey(keys, p, KeyPairProvider.SSH_DSS);
-    return keys;
-  }
-
-  private static void addPublicKey(
-      final Collection<PublicKey> out, KeyPairProvider p, String type) {
-    final KeyPair pair = p.loadKey(type);
-    if (pair != null && pair.getPublic() != null) {
-      out.add(pair.getPublic());
-    }
-  }
-
-  @Override
-  public boolean authenticate(String username, PublicKey suppliedKey, ServerSession session) {
-    SshSession sd = session.getAttribute(SshSession.KEY);
-    Preconditions.checkState(sd.getUser() == null);
-    if (PeerDaemonUser.USER_NAME.equals(username)) {
-      if (myHostKeys.contains(suppliedKey) || getPeerKeys().contains(suppliedKey)) {
-        PeerDaemonUser user = peerFactory.create(sd.getRemoteAddress());
-        return SshUtil.success(username, session, sshScope, sshLog, sd, user);
-      }
-      sd.authenticationError(username, "no-matching-key");
-      return false;
-    }
-
-    if (config.getBoolean("auth", "userNameToLowerCase", false)) {
-      username = username.toLowerCase(Locale.US);
-    }
-
-    Iterable<SshKeyCacheEntry> keyList = sshKeyCache.get(username);
-    SshKeyCacheEntry key = find(keyList, suppliedKey);
-    if (key == null) {
-      String err;
-      if (keyList == SshKeyCacheImpl.NO_SUCH_USER) {
-        err = "user-not-found";
-      } else if (keyList == SshKeyCacheImpl.NO_KEYS) {
-        err = "key-list-empty";
-      } else {
-        err = "no-matching-key";
-      }
-      sd.authenticationError(username, err);
-      return false;
-    }
-
-    // Double check that all of the keys are for the same user account.
-    // This should have been true when the cache factory method loaded
-    // the list into memory, but we want to be extra paranoid about our
-    // security check to ensure there aren't two users sharing the same
-    // user name on the server.
-    //
-    for (SshKeyCacheEntry otherKey : keyList) {
-      if (!key.getAccount().equals(otherKey.getAccount())) {
-        sd.authenticationError(username, "keys-cross-accounts");
-        return false;
-      }
-    }
-
-    IdentifiedUser cu = SshUtil.createUser(sd, userFactory, key.getAccount());
-    if (!cu.getAccount().isActive()) {
-      sd.authenticationError(username, "inactive-account");
-      return false;
-    }
-
-    return SshUtil.success(username, session, sshScope, sshLog, sd, cu);
-  }
-
-  private Set<PublicKey> getPeerKeys() {
-    PeerKeyCache p = peerKeyCache;
-    if (!p.isCurrent()) {
-      p = p.reload();
-      peerKeyCache = p;
-    }
-    return p.keys;
-  }
-
-  private SshKeyCacheEntry find(Iterable<SshKeyCacheEntry> keyList, PublicKey suppliedKey) {
-    for (SshKeyCacheEntry k : keyList) {
-      if (k.match(suppliedKey)) {
-        return k;
-      }
-    }
-    return null;
-  }
-
-  private static class PeerKeyCache {
-    private final Path path;
-    private final long modified;
-    final Set<PublicKey> keys;
-
-    PeerKeyCache(Path path) {
-      this.path = path;
-      this.modified = FileUtil.lastModified(path);
-      this.keys = read(path);
-    }
-
-    private static Set<PublicKey> read(Path path) {
-      try (BufferedReader br = Files.newBufferedReader(path, UTF_8)) {
-        final Set<PublicKey> keys = new HashSet<>();
-        String line;
-        while ((line = br.readLine()) != null) {
-          line = line.trim();
-          if (line.startsWith("#") || line.isEmpty()) {
-            continue;
-          }
-
-          try {
-            byte[] bin = Base64.decodeBase64(line.getBytes(ISO_8859_1));
-            keys.add(new ByteArrayBuffer(bin).getRawPublicKey());
-          } catch (RuntimeException | SshException e) {
-            logBadKey(path, line, e);
-          }
-        }
-        return Collections.unmodifiableSet(keys);
-      } catch (NoSuchFileException noFile) {
-        return Collections.emptySet();
-      } catch (IOException err) {
-        log.error("Cannot read " + path, err);
-        return Collections.emptySet();
-      }
-    }
-
-    private static void logBadKey(Path path, String line, Exception e) {
-      log.warn("Invalid key in " + path + ":\n  " + line, e);
-    }
-
-    boolean isCurrent() {
-      return modified == FileUtil.lastModified(path);
-    }
-
-    PeerKeyCache reload() {
-      return new PeerKeyCache(path);
-    }
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DispatchCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DispatchCommand.java
deleted file mode 100644
index 3f2e258..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DispatchCommand.java
+++ /dev/null
@@ -1,187 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.sshd;
-
-import com.google.common.base.Strings;
-import com.google.common.base.Throwables;
-import com.google.common.collect.Sets;
-import com.google.common.util.concurrent.Atomics;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.args4j.SubcommandHandler;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.io.IOException;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicReference;
-import org.apache.sshd.server.Command;
-import org.apache.sshd.server.Environment;
-import org.kohsuke.args4j.Argument;
-
-/** Command that dispatches to a subcommand from its command table. */
-final class DispatchCommand extends BaseCommand {
-  interface Factory {
-    DispatchCommand create(Map<String, CommandProvider> map);
-  }
-
-  private final CurrentUser currentUser;
-  private final PermissionBackend permissionBackend;
-  private final Map<String, CommandProvider> commands;
-  private final AtomicReference<Command> atomicCmd;
-
-  @Argument(index = 0, required = false, metaVar = "COMMAND", handler = SubcommandHandler.class)
-  private String commandName;
-
-  @Argument(index = 1, multiValued = true, metaVar = "ARG")
-  private List<String> args = new ArrayList<>();
-
-  @Inject
-  DispatchCommand(
-      CurrentUser user,
-      PermissionBackend permissionBackend,
-      @Assisted Map<String, CommandProvider> all) {
-    this.currentUser = user;
-    this.permissionBackend = permissionBackend;
-    commands = all;
-    atomicCmd = Atomics.newReference();
-  }
-
-  Map<String, CommandProvider> getMap() {
-    return commands;
-  }
-
-  @Override
-  public void start(Environment env) throws IOException {
-    try {
-      parseCommandLine();
-      if (Strings.isNullOrEmpty(commandName)) {
-        StringWriter msg = new StringWriter();
-        msg.write(usage());
-        throw die(msg.toString());
-      }
-
-      final CommandProvider p = commands.get(commandName);
-      if (p == null) {
-        String msg =
-            (getName().isEmpty() ? "Gerrit Code Review" : getName())
-                + ": "
-                + commandName
-                + ": not found";
-        throw die(msg);
-      }
-
-      final Command cmd = p.getProvider().get();
-      checkRequiresCapability(cmd);
-      if (cmd instanceof BaseCommand) {
-        final BaseCommand bc = (BaseCommand) cmd;
-        if (getName().isEmpty()) {
-          bc.setName(commandName);
-        } else {
-          bc.setName(getName() + " " + commandName);
-        }
-        bc.setArguments(args.toArray(new String[args.size()]));
-
-      } else if (!args.isEmpty()) {
-        throw die(commandName + " does not take arguments");
-      }
-
-      provideStateTo(cmd);
-      atomicCmd.set(cmd);
-      cmd.start(env);
-
-    } catch (UnloggedFailure e) {
-      String msg = e.getMessage();
-      if (!msg.endsWith("\n")) {
-        msg += "\n";
-      }
-      err.write(msg.getBytes(ENC));
-      err.flush();
-      onExit(e.exitCode);
-    }
-  }
-
-  private void checkRequiresCapability(Command cmd) throws UnloggedFailure {
-    String pluginName = null;
-    if (cmd instanceof BaseCommand) {
-      pluginName = ((BaseCommand) cmd).getPluginName();
-    }
-    try {
-      permissionBackend
-          .user(currentUser)
-          .checkAny(GlobalPermission.fromAnnotation(pluginName, cmd.getClass()));
-    } catch (AuthException e) {
-      throw new UnloggedFailure(BaseCommand.STATUS_NOT_ADMIN, e.getMessage());
-    } catch (PermissionBackendException e) {
-      throw new UnloggedFailure(1, "fatal: permission check unavailable", e);
-    }
-  }
-
-  @Override
-  public void destroy() {
-    Command cmd = atomicCmd.getAndSet(null);
-    if (cmd != null) {
-      try {
-        cmd.destroy();
-      } catch (Exception e) {
-        Throwables.throwIfUnchecked(e);
-        throw new RuntimeException(e);
-      }
-    }
-  }
-
-  @Override
-  protected String usage() {
-    final StringBuilder usage = new StringBuilder();
-    usage.append("Available commands");
-    if (!getName().isEmpty()) {
-      usage.append(" of ");
-      usage.append(getName());
-    }
-    usage.append(" are:\n");
-    usage.append("\n");
-
-    int maxLength = -1;
-    for (String name : commands.keySet()) {
-      maxLength = Math.max(maxLength, name.length());
-    }
-    String format = "%-" + maxLength + "s   %s";
-    for (String name : Sets.newTreeSet(commands.keySet())) {
-      final CommandProvider p = commands.get(name);
-      usage.append("   ");
-      usage.append(String.format(format, name, Strings.nullToEmpty(p.getDescription())));
-      usage.append("\n");
-    }
-    usage.append("\n");
-
-    usage.append("See '");
-    if (getName().indexOf(' ') < 0) {
-      usage.append(getName());
-      usage.append(' ');
-    }
-    usage.append("COMMAND --help' for more information.\n");
-    usage.append("\n");
-    return usage.toString();
-  }
-
-  public String getCommandName() {
-    return commandName;
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DispatchCommandProvider.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DispatchCommandProvider.java
deleted file mode 100644
index c782d2f..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DispatchCommandProvider.java
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.sshd;
-
-import com.google.common.collect.Maps;
-import com.google.gerrit.extensions.registration.RegistrationHandle;
-import com.google.inject.Binding;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.Provider;
-import com.google.inject.TypeLiteral;
-import java.lang.annotation.Annotation;
-import java.util.List;
-import java.util.concurrent.ConcurrentMap;
-import org.apache.sshd.server.Command;
-
-/** Creates DispatchCommand using commands registered by {@link CommandModule}. */
-public class DispatchCommandProvider implements Provider<DispatchCommand> {
-  @Inject private Injector injector;
-
-  @Inject private DispatchCommand.Factory factory;
-
-  private final CommandName parent;
-  private volatile ConcurrentMap<String, CommandProvider> map;
-
-  public DispatchCommandProvider(CommandName cn) {
-    this.parent = cn;
-  }
-
-  @Override
-  public DispatchCommand get() {
-    return factory.create(getMap());
-  }
-
-  public RegistrationHandle register(CommandName name, Provider<Command> cmd) {
-    final ConcurrentMap<String, CommandProvider> m = getMap();
-    final CommandProvider commandProvider = new CommandProvider(cmd, null);
-    if (m.putIfAbsent(name.value(), commandProvider) != null) {
-      throw new IllegalArgumentException(name.value() + " exists");
-    }
-    return new RegistrationHandle() {
-      @Override
-      public void remove() {
-        m.remove(name.value(), commandProvider);
-      }
-    };
-  }
-
-  public RegistrationHandle replace(CommandName name, Provider<Command> cmd) {
-    final ConcurrentMap<String, CommandProvider> m = getMap();
-    final CommandProvider commandProvider = new CommandProvider(cmd, null);
-    m.put(name.value(), commandProvider);
-    return new RegistrationHandle() {
-      @Override
-      public void remove() {
-        m.remove(name.value(), commandProvider);
-      }
-    };
-  }
-
-  ConcurrentMap<String, CommandProvider> getMap() {
-    if (map == null) {
-      synchronized (this) {
-        if (map == null) {
-          map = createMap();
-        }
-      }
-    }
-    return map;
-  }
-
-  @SuppressWarnings("unchecked")
-  private ConcurrentMap<String, CommandProvider> createMap() {
-    ConcurrentMap<String, CommandProvider> m = Maps.newConcurrentMap();
-    for (Binding<?> b : allCommands()) {
-      final Annotation annotation = b.getKey().getAnnotation();
-      if (annotation instanceof CommandName) {
-        final CommandName n = (CommandName) annotation;
-        if (!Commands.CMD_ROOT.equals(n) && Commands.isChild(parent, n)) {
-          String descr = null;
-          if (annotation instanceof Commands.NestedCommandNameImpl) {
-            Commands.NestedCommandNameImpl impl = ((Commands.NestedCommandNameImpl) annotation);
-            descr = impl.descr();
-          }
-          m.put(n.value(), new CommandProvider((Provider<Command>) b.getProvider(), descr));
-        }
-      }
-    }
-    return m;
-  }
-
-  private static final TypeLiteral<Command> type = new TypeLiteral<Command>() {};
-
-  private List<Binding<Command>> allCommands() {
-    return injector.findBindingsByType(type);
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/GerritGSSAuthenticator.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/GerritGSSAuthenticator.java
deleted file mode 100644
index 8e4be78..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/GerritGSSAuthenticator.java
+++ /dev/null
@@ -1,80 +0,0 @@
-// 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.
-
-package com.google.gerrit.sshd;
-
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.IdentifiedUser.GenericFactory;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import java.util.Locale;
-import org.apache.sshd.server.auth.gss.GSSAuthenticator;
-import org.apache.sshd.server.session.ServerSession;
-import org.eclipse.jgit.lib.Config;
-
-/** Authenticates users with kerberos (gssapi-with-mic). */
-@Singleton
-class GerritGSSAuthenticator extends GSSAuthenticator {
-  private final AccountCache accounts;
-  private final SshScope sshScope;
-  private final SshLog sshLog;
-  private final GenericFactory userFactory;
-  private final Config config;
-
-  @Inject
-  GerritGSSAuthenticator(
-      AccountCache accounts,
-      SshScope sshScope,
-      SshLog sshLog,
-      IdentifiedUser.GenericFactory userFactory,
-      @GerritServerConfig Config config) {
-    this.accounts = accounts;
-    this.sshScope = sshScope;
-    this.sshLog = sshLog;
-    this.userFactory = userFactory;
-    this.config = config;
-  }
-
-  @Override
-  public boolean validateIdentity(ServerSession session, String identity) {
-    final SshSession sd = session.getAttribute(SshSession.KEY);
-    int at = identity.indexOf('@');
-    String username;
-    if (at == -1) {
-      username = identity;
-    } else {
-      username = identity.substring(0, at);
-    }
-    if (config.getBoolean("auth", "userNameToLowerCase", false)) {
-      username = username.toLowerCase(Locale.US);
-    }
-    AccountState state = accounts.getByUsername(username);
-    Account account = state == null ? null : state.getAccount();
-    boolean active = account != null && account.isActive();
-    if (active) {
-      return SshUtil.success(
-          username,
-          session,
-          sshScope,
-          sshLog,
-          sd,
-          SshUtil.createUser(sd, userFactory, account.getId()));
-    }
-    return false;
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/HostKeyProvider.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/HostKeyProvider.java
deleted file mode 100644
index c0b6d5a..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/HostKeyProvider.java
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.sshd;
-
-import com.google.gerrit.server.config.SitePaths;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.ProvisionException;
-import java.io.File;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.sshd.common.keyprovider.FileKeyPairProvider;
-import org.apache.sshd.common.keyprovider.KeyPairProvider;
-import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider;
-
-class HostKeyProvider implements Provider<KeyPairProvider> {
-  private final SitePaths site;
-
-  @Inject
-  HostKeyProvider(SitePaths site) {
-    this.site = site;
-  }
-
-  @Override
-  public KeyPairProvider get() {
-    Path objKey = site.ssh_key;
-    Path rsaKey = site.ssh_rsa;
-    Path dsaKey = site.ssh_dsa;
-    Path ecdsaKey_256 = site.ssh_ecdsa_256;
-    Path ecdsaKey_384 = site.ssh_ecdsa_384;
-    Path ecdsaKey_521 = site.ssh_ecdsa_521;
-    Path ed25519Key = site.ssh_ed25519;
-
-    final List<File> stdKeys = new ArrayList<>(6);
-    if (Files.exists(rsaKey)) {
-      stdKeys.add(rsaKey.toAbsolutePath().toFile());
-    }
-    if (Files.exists(dsaKey)) {
-      stdKeys.add(dsaKey.toAbsolutePath().toFile());
-    }
-    if (Files.exists(ecdsaKey_256)) {
-      stdKeys.add(ecdsaKey_256.toAbsolutePath().toFile());
-    }
-    if (Files.exists(ecdsaKey_384)) {
-      stdKeys.add(ecdsaKey_384.toAbsolutePath().toFile());
-    }
-    if (Files.exists(ecdsaKey_521)) {
-      stdKeys.add(ecdsaKey_521.toAbsolutePath().toFile());
-    }
-    if (Files.exists(ed25519Key)) {
-      stdKeys.add(ed25519Key.toAbsolutePath().toFile());
-    }
-
-    if (Files.exists(objKey)) {
-      if (stdKeys.isEmpty()) {
-        SimpleGeneratorHostKeyProvider p = new SimpleGeneratorHostKeyProvider();
-        p.setPath(objKey.toAbsolutePath());
-        return p;
-      }
-      // Both formats of host key exist, we don't know which format
-      // should be authoritative. Complain and abort.
-      //
-      stdKeys.add(objKey.toAbsolutePath().toFile());
-      throw new ProvisionException("Multiple host keys exist: " + stdKeys);
-    }
-    if (stdKeys.isEmpty()) {
-      throw new ProvisionException("No SSH keys under " + site.etc_dir);
-    }
-    FileKeyPairProvider kp = new FileKeyPairProvider();
-    kp.setFiles(stdKeys);
-    return kp;
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/NoShell.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/NoShell.java
deleted file mode 100644
index aec85d4..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/NoShell.java
+++ /dev/null
@@ -1,192 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.sshd;
-
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.config.CanonicalWebUrl;
-import com.google.gerrit.server.ssh.SshInfo;
-import com.google.gerrit.sshd.SshScope.Context;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import org.apache.sshd.common.Factory;
-import org.apache.sshd.server.Command;
-import org.apache.sshd.server.Environment;
-import org.apache.sshd.server.ExitCallback;
-import org.apache.sshd.server.SessionAware;
-import org.apache.sshd.server.session.ServerSession;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.util.SystemReader;
-
-/**
- * Dummy shell which prints a message and terminates.
- *
- * <p>This implementation is used to ensure clients who try to SSH directly to this server without
- * supplying a command will get a reasonable error message, but cannot continue further.
- */
-class NoShell implements Factory<Command> {
-  private final Provider<SendMessage> shell;
-
-  @Inject
-  NoShell(Provider<SendMessage> shell) {
-    this.shell = shell;
-  }
-
-  @Override
-  public Command create() {
-    return shell.get();
-  }
-
-  static class SendMessage implements Command, SessionAware {
-    private final Provider<MessageFactory> messageFactory;
-    private final SchemaFactory<ReviewDb> schemaFactory;
-    private final SshScope sshScope;
-
-    private InputStream in;
-    private OutputStream out;
-    private OutputStream err;
-    private ExitCallback exit;
-    private Context context;
-
-    @Inject
-    SendMessage(
-        Provider<MessageFactory> messageFactory, SchemaFactory<ReviewDb> sf, SshScope sshScope) {
-      this.messageFactory = messageFactory;
-      this.schemaFactory = sf;
-      this.sshScope = sshScope;
-    }
-
-    @Override
-    public void setInputStream(InputStream in) {
-      this.in = in;
-    }
-
-    @Override
-    public void setOutputStream(OutputStream out) {
-      this.out = out;
-    }
-
-    @Override
-    public void setErrorStream(OutputStream err) {
-      this.err = err;
-    }
-
-    @Override
-    public void setExitCallback(ExitCallback callback) {
-      this.exit = callback;
-    }
-
-    @Override
-    public void setSession(ServerSession session) {
-      SshSession s = session.getAttribute(SshSession.KEY);
-      this.context = sshScope.newContext(schemaFactory, s, "");
-    }
-
-    @Override
-    public void start(Environment env) throws IOException {
-      Context old = sshScope.set(context);
-      String message;
-      try {
-        message = messageFactory.get().getMessage();
-      } finally {
-        sshScope.set(old);
-      }
-      err.write(Constants.encode(message));
-      err.flush();
-
-      in.close();
-      out.close();
-      err.close();
-      exit.onExit(127);
-    }
-
-    @Override
-    public void destroy() {}
-  }
-
-  static class MessageFactory {
-    private final IdentifiedUser user;
-    private final SshInfo sshInfo;
-    private final Provider<String> urlProvider;
-
-    @Inject
-    MessageFactory(
-        IdentifiedUser user, SshInfo sshInfo, @CanonicalWebUrl Provider<String> urlProvider) {
-      this.user = user;
-      this.sshInfo = sshInfo;
-      this.urlProvider = urlProvider;
-    }
-
-    String getMessage() {
-      StringBuilder msg = new StringBuilder();
-
-      msg.append("\r\n");
-      msg.append("  ****    Welcome to Gerrit Code Review    ****\r\n");
-      msg.append("\r\n");
-
-      Account account = user.getAccount();
-      String name = account.getFullName();
-      if (name == null || name.isEmpty()) {
-        name = user.getUserName();
-      }
-      msg.append("  Hi ");
-      msg.append(name);
-      msg.append(", you have successfully connected over SSH.");
-      msg.append("\r\n");
-      msg.append("\r\n");
-
-      msg.append("  Unfortunately, interactive shells are disabled.\r\n");
-      msg.append("  To clone a hosted Git repository, use:\r\n");
-      msg.append("\r\n");
-
-      if (!sshInfo.getHostKeys().isEmpty()) {
-        String host = sshInfo.getHostKeys().get(0).getHost();
-        if (host.startsWith("*:")) {
-          host = getGerritHost() + host.substring(1);
-        }
-
-        msg.append("  git clone ssh://");
-        msg.append(user.getUserName());
-        msg.append("@");
-        msg.append(host);
-        msg.append("/");
-        msg.append("REPOSITORY_NAME.git");
-        msg.append("\r\n");
-      }
-
-      msg.append("\r\n");
-      return msg.toString();
-    }
-
-    private String getGerritHost() {
-      String url = urlProvider.get();
-      if (url != null) {
-        try {
-          return new URL(url).getHost();
-        } catch (MalformedURLException e) {
-          // Ignored
-        }
-      }
-      return SystemReader.getInstance().getHostname();
-    }
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/PluginCommandModule.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/PluginCommandModule.java
deleted file mode 100644
index b0116e4..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/PluginCommandModule.java
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.sshd;
-
-import com.google.common.base.Preconditions;
-import com.google.gerrit.extensions.annotations.PluginName;
-import com.google.inject.Inject;
-import com.google.inject.binder.LinkedBindingBuilder;
-import org.apache.sshd.server.Command;
-
-public abstract class PluginCommandModule extends CommandModule {
-  private CommandName command;
-
-  @Inject
-  void setPluginName(@PluginName String name) {
-    this.command = Commands.named(name);
-  }
-
-  @Override
-  protected final void configure() {
-    Preconditions.checkState(command != null, "@PluginName must be provided");
-    bind(Commands.key(command)).toProvider(new DispatchCommandProvider(command));
-    configureCommands();
-  }
-
-  protected abstract void configureCommands();
-
-  @Override
-  protected LinkedBindingBuilder<Command> command(String subCmd) {
-    return bind(Commands.key(command, subCmd));
-  }
-
-  protected void command(Class<? extends BaseCommand> clazz) {
-    command(command, clazz);
-  }
-
-  protected void alias(String name, Class<? extends BaseCommand> clazz) {
-    alias(command, name, clazz);
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SingleCommandPluginModule.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SingleCommandPluginModule.java
deleted file mode 100644
index 079661a..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SingleCommandPluginModule.java
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.sshd;
-
-import com.google.common.base.Preconditions;
-import com.google.gerrit.extensions.annotations.PluginName;
-import com.google.inject.Inject;
-import com.google.inject.binder.LinkedBindingBuilder;
-import org.apache.sshd.server.Command;
-
-/**
- * Binds one SSH command to the plugin name itself.
- *
- * <p>Cannot be combined with {@link PluginCommandModule}.
- */
-public abstract class SingleCommandPluginModule extends CommandModule {
-  private CommandName command;
-
-  @Inject
-  void setPluginName(@PluginName String name) {
-    this.command = Commands.named(name);
-  }
-
-  @Override
-  protected final void configure() {
-    Preconditions.checkState(command != null, "@PluginName must be provided");
-    configure(bind(Commands.key(command)));
-  }
-
-  protected abstract void configure(LinkedBindingBuilder<Command> bind);
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshAutoRegisterModuleGenerator.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshAutoRegisterModuleGenerator.java
deleted file mode 100644
index 0fdde81..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshAutoRegisterModuleGenerator.java
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.sshd;
-
-import static com.google.gerrit.server.plugins.AutoRegisterUtil.calculateBindAnnotation;
-
-import com.google.common.base.Preconditions;
-import com.google.common.collect.LinkedListMultimap;
-import com.google.common.collect.ListMultimap;
-import com.google.gerrit.extensions.annotations.Export;
-import com.google.gerrit.server.plugins.InvalidPluginException;
-import com.google.gerrit.server.plugins.ModuleGenerator;
-import com.google.inject.AbstractModule;
-import com.google.inject.Module;
-import com.google.inject.TypeLiteral;
-import java.lang.annotation.Annotation;
-import java.util.HashMap;
-import java.util.Map;
-import org.apache.sshd.server.Command;
-
-class SshAutoRegisterModuleGenerator extends AbstractModule implements ModuleGenerator {
-  private final Map<String, Class<Command>> commands = new HashMap<>();
-  private final ListMultimap<TypeLiteral<?>, Class<?>> listeners = LinkedListMultimap.create();
-  private CommandName command;
-
-  @Override
-  protected void configure() {
-    bind(Commands.key(command)).toProvider(new DispatchCommandProvider(command));
-    for (Map.Entry<String, Class<Command>> e : commands.entrySet()) {
-      bind(Commands.key(command, e.getKey())).to(e.getValue());
-    }
-    for (Map.Entry<TypeLiteral<?>, Class<?>> e : listeners.entries()) {
-      @SuppressWarnings("unchecked")
-      TypeLiteral<Object> type = (TypeLiteral<Object>) e.getKey();
-
-      @SuppressWarnings("unchecked")
-      Class<Object> impl = (Class<Object>) e.getValue();
-
-      Annotation n = calculateBindAnnotation(impl);
-      bind(type).annotatedWith(n).to(impl);
-    }
-  }
-
-  @Override
-  public void setPluginName(String name) {
-    command = Commands.named(name);
-  }
-
-  @SuppressWarnings("unchecked")
-  @Override
-  public void export(Export export, Class<?> type) throws InvalidPluginException {
-    Preconditions.checkState(command != null, "pluginName must be provided");
-    if (Command.class.isAssignableFrom(type)) {
-      Class<Command> old = commands.get(export.value());
-      if (old != null) {
-        throw new InvalidPluginException(
-            String.format(
-                "@Export(\"%s\") has duplicate bindings:\n  %s\n  %s",
-                export.value(), old.getName(), type.getName()));
-      }
-      commands.put(export.value(), (Class<Command>) type);
-    } else {
-      throw new InvalidPluginException(
-          String.format(
-              "Class %s with @Export(\"%s\") must extend %s or implement %s",
-              type.getName(), export.value(), SshCommand.class.getName(), Command.class.getName()));
-    }
-  }
-
-  @Override
-  public void listen(TypeLiteral<?> tl, Class<?> clazz) {
-    listeners.put(tl, clazz);
-  }
-
-  @Override
-  public Module create() throws InvalidPluginException {
-    Preconditions.checkState(command != null, "pluginName must be provided");
-    return !commands.isEmpty() ? this : null;
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshCommand.java
deleted file mode 100644
index b4e44d3..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshCommand.java
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.sshd;
-
-import com.google.gerrit.server.AccessPath;
-import java.io.IOException;
-import java.io.PrintWriter;
-import org.apache.sshd.server.Environment;
-
-public abstract class SshCommand extends BaseCommand {
-  protected PrintWriter stdout;
-  protected PrintWriter stderr;
-
-  @Override
-  public void start(Environment env) throws IOException {
-    startThread(
-        new CommandRunnable() {
-          @Override
-          public void run() throws Exception {
-            parseCommandLine();
-            stdout = toPrintWriter(out);
-            stderr = toPrintWriter(err);
-            try {
-              SshCommand.this.run();
-            } finally {
-              stdout.flush();
-              stderr.flush();
-            }
-          }
-        },
-        AccessPath.SSH_COMMAND);
-  }
-
-  protected abstract void run() throws UnloggedFailure, Failure, Exception;
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshDaemon.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshDaemon.java
deleted file mode 100644
index 31b01c9..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshDaemon.java
+++ /dev/null
@@ -1,801 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.sshd;
-
-import static com.google.gerrit.server.ssh.SshAddressesModule.IANA_SSH_PORT;
-import static java.util.concurrent.TimeUnit.MILLISECONDS;
-import static java.util.concurrent.TimeUnit.SECONDS;
-import static org.apache.sshd.common.channel.ChannelOutputStream.WAIT_FOR_SPACE_TIMEOUT;
-
-import com.google.common.base.Strings;
-import com.google.common.base.Supplier;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.common.Version;
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.gerrit.metrics.Counter0;
-import com.google.gerrit.metrics.Description;
-import com.google.gerrit.metrics.MetricMaker;
-import com.google.gerrit.server.config.ConfigUtil;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.ssh.SshAdvertisedAddresses;
-import com.google.gerrit.server.ssh.SshInfo;
-import com.google.gerrit.server.ssh.SshListenAddresses;
-import com.google.gerrit.server.util.IdGenerator;
-import com.google.gerrit.server.util.SocketUtil;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.jcraft.jsch.HostKey;
-import com.jcraft.jsch.JSchException;
-import java.io.File;
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.SocketAddress;
-import java.net.UnknownHostException;
-import java.nio.file.FileStore;
-import java.nio.file.FileSystem;
-import java.nio.file.Path;
-import java.nio.file.PathMatcher;
-import java.nio.file.WatchService;
-import java.nio.file.attribute.UserPrincipalLookupService;
-import java.nio.file.spi.FileSystemProvider;
-import java.security.InvalidKeyException;
-import java.security.KeyPair;
-import java.security.PublicKey;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.atomic.AtomicInteger;
-import org.apache.mina.transport.socket.SocketSessionConfig;
-import org.apache.sshd.common.BaseBuilder;
-import org.apache.sshd.common.NamedFactory;
-import org.apache.sshd.common.channel.RequestHandler;
-import org.apache.sshd.common.cipher.Cipher;
-import org.apache.sshd.common.compression.BuiltinCompressions;
-import org.apache.sshd.common.compression.Compression;
-import org.apache.sshd.common.file.FileSystemFactory;
-import org.apache.sshd.common.forward.DefaultTcpipForwarderFactory;
-import org.apache.sshd.common.future.CloseFuture;
-import org.apache.sshd.common.future.SshFutureListener;
-import org.apache.sshd.common.io.AbstractIoServiceFactory;
-import org.apache.sshd.common.io.IoAcceptor;
-import org.apache.sshd.common.io.IoServiceFactory;
-import org.apache.sshd.common.io.IoServiceFactoryFactory;
-import org.apache.sshd.common.io.IoSession;
-import org.apache.sshd.common.io.mina.MinaServiceFactoryFactory;
-import org.apache.sshd.common.io.mina.MinaSession;
-import org.apache.sshd.common.io.nio2.Nio2ServiceFactoryFactory;
-import org.apache.sshd.common.kex.KeyExchange;
-import org.apache.sshd.common.keyprovider.KeyPairProvider;
-import org.apache.sshd.common.mac.Mac;
-import org.apache.sshd.common.random.Random;
-import org.apache.sshd.common.random.SingletonRandomFactory;
-import org.apache.sshd.common.session.ConnectionService;
-import org.apache.sshd.common.session.Session;
-import org.apache.sshd.common.util.buffer.Buffer;
-import org.apache.sshd.common.util.buffer.ByteArrayBuffer;
-import org.apache.sshd.common.util.net.SshdSocketAddress;
-import org.apache.sshd.common.util.security.SecurityUtils;
-import org.apache.sshd.server.Command;
-import org.apache.sshd.server.CommandFactory;
-import org.apache.sshd.server.ServerBuilder;
-import org.apache.sshd.server.SshServer;
-import org.apache.sshd.server.auth.UserAuth;
-import org.apache.sshd.server.auth.gss.GSSAuthenticator;
-import org.apache.sshd.server.auth.gss.UserAuthGSSFactory;
-import org.apache.sshd.server.auth.pubkey.PublickeyAuthenticator;
-import org.apache.sshd.server.auth.pubkey.UserAuthPublicKeyFactory;
-import org.apache.sshd.server.forward.ForwardingFilter;
-import org.apache.sshd.server.global.CancelTcpipForwardHandler;
-import org.apache.sshd.server.global.KeepAliveHandler;
-import org.apache.sshd.server.global.NoMoreSessionsHandler;
-import org.apache.sshd.server.global.TcpipForwardHandler;
-import org.apache.sshd.server.session.ServerSessionImpl;
-import org.apache.sshd.server.session.SessionFactory;
-import org.bouncycastle.crypto.prng.RandomGenerator;
-import org.bouncycastle.crypto.prng.VMPCRandomGenerator;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * SSH daemon to communicate with Gerrit.
- *
- * <p>Use a Git URL such as <code>ssh://${email}@${host}:${port}/${path}</code>, e.g. {@code
- * ssh://sop@google.com@gerrit.com:8010/tools/gerrit.git} to access the SSH daemon itself.
- *
- * <p>Versions of Git before 1.5.3 may require setting the username and port properties in the
- * user's {@code ~/.ssh/config} file, and using a host alias through a URL such as {@code
- * gerrit-alias:/tools/gerrit.git}:
- *
- * <pre>{@code
- * Host gerrit-alias
- *  User sop@google.com
- *  Hostname gerrit.com
- *  Port 8010
- * }</pre>
- */
-@Singleton
-public class SshDaemon extends SshServer implements SshInfo, LifecycleListener {
-  private static final Logger sshDaemonLog = LoggerFactory.getLogger(SshDaemon.class);
-
-  public enum SshSessionBackend {
-    MINA,
-    NIO2
-  }
-
-  private final List<SocketAddress> listen;
-  private final List<String> advertised;
-  private final boolean keepAlive;
-  private final List<HostKey> hostKeys;
-  private volatile IoAcceptor daemonAcceptor;
-  private final Config cfg;
-
-  @Inject
-  SshDaemon(
-      CommandFactory commandFactory,
-      NoShell noShell,
-      PublickeyAuthenticator userAuth,
-      GerritGSSAuthenticator kerberosAuth,
-      KeyPairProvider hostKeyProvider,
-      IdGenerator idGenerator,
-      @GerritServerConfig Config cfg,
-      SshLog sshLog,
-      @SshListenAddresses List<SocketAddress> listen,
-      @SshAdvertisedAddresses List<String> advertised,
-      MetricMaker metricMaker) {
-    setPort(IANA_SSH_PORT /* never used */);
-
-    this.cfg = cfg;
-    this.listen = listen;
-    this.advertised = advertised;
-    keepAlive = cfg.getBoolean("sshd", "tcpkeepalive", true);
-
-    getProperties()
-        .put(
-            SERVER_IDENTIFICATION,
-            "GerritCodeReview_"
-                + Version.getVersion() //
-                + " ("
-                + super.getVersion()
-                + ")");
-
-    getProperties().put(MAX_AUTH_REQUESTS, String.valueOf(cfg.getInt("sshd", "maxAuthTries", 6)));
-
-    getProperties()
-        .put(
-            AUTH_TIMEOUT,
-            String.valueOf(
-                MILLISECONDS.convert(
-                    ConfigUtil.getTimeUnit(cfg, "sshd", null, "loginGraceTime", 120, SECONDS),
-                    SECONDS)));
-
-    long idleTimeoutSeconds = ConfigUtil.getTimeUnit(cfg, "sshd", null, "idleTimeout", 0, SECONDS);
-    getProperties().put(IDLE_TIMEOUT, String.valueOf(SECONDS.toMillis(idleTimeoutSeconds)));
-    getProperties().put(NIO2_READ_TIMEOUT, String.valueOf(SECONDS.toMillis(idleTimeoutSeconds)));
-
-    long rekeyTimeLimit =
-        ConfigUtil.getTimeUnit(cfg, "sshd", null, "rekeyTimeLimit", 3600, SECONDS);
-    getProperties().put(REKEY_TIME_LIMIT, String.valueOf(SECONDS.toMillis(rekeyTimeLimit)));
-
-    getProperties()
-        .put(
-            REKEY_BYTES_LIMIT,
-            String.valueOf(cfg.getLong("sshd", "rekeyBytesLimit", 1024 * 1024 * 1024 /* 1GB */)));
-
-    long waitTimeoutSeconds = ConfigUtil.getTimeUnit(cfg, "sshd", null, "waitTimeout", 30, SECONDS);
-    getProperties()
-        .put(WAIT_FOR_SPACE_TIMEOUT, String.valueOf(SECONDS.toMillis(waitTimeoutSeconds)));
-
-    final int maxConnectionsPerUser = cfg.getInt("sshd", "maxConnectionsPerUser", 64);
-    if (0 < maxConnectionsPerUser) {
-      getProperties().put(MAX_CONCURRENT_SESSIONS, String.valueOf(maxConnectionsPerUser));
-    }
-
-    final String kerberosKeytab = cfg.getString("sshd", null, "kerberosKeytab");
-    final String kerberosPrincipal = cfg.getString("sshd", null, "kerberosPrincipal");
-
-    final boolean enableCompression = cfg.getBoolean("sshd", "enableCompression", false);
-
-    SshSessionBackend backend = cfg.getEnum("sshd", null, "backend", SshSessionBackend.NIO2);
-
-    System.setProperty(
-        IoServiceFactoryFactory.class.getName(),
-        backend == SshSessionBackend.MINA
-            ? MinaServiceFactoryFactory.class.getName()
-            : Nio2ServiceFactoryFactory.class.getName());
-
-    initProviderBouncyCastle(cfg);
-    initCiphers(cfg);
-    initKeyExchanges(cfg);
-    initMacs(cfg);
-    initSignatures();
-    initChannels();
-    initForwarding();
-    initFileSystemFactory();
-    initSubsystems();
-    initCompression(enableCompression);
-    initUserAuth(userAuth, kerberosAuth, kerberosKeytab, kerberosPrincipal);
-    setKeyPairProvider(hostKeyProvider);
-    setCommandFactory(commandFactory);
-    setShellFactory(noShell);
-
-    final AtomicInteger connected = new AtomicInteger();
-    metricMaker.newCallbackMetric(
-        "sshd/sessions/connected",
-        Integer.class,
-        new Description("Currently connected SSH sessions").setGauge().setUnit("sessions"),
-        new Supplier<Integer>() {
-          @Override
-          public Integer get() {
-            return connected.get();
-          }
-        });
-
-    final Counter0 sessionsCreated =
-        metricMaker.newCounter(
-            "sshd/sessions/created",
-            new Description("Rate of new SSH sessions").setRate().setUnit("sessions"));
-
-    final Counter0 authFailures =
-        metricMaker.newCounter(
-            "sshd/sessions/authentication_failures",
-            new Description("Rate of SSH authentication failures").setRate().setUnit("failures"));
-
-    setSessionFactory(
-        new SessionFactory(this) {
-          @Override
-          protected ServerSessionImpl createSession(IoSession io) throws Exception {
-            connected.incrementAndGet();
-            sessionsCreated.increment();
-            if (io instanceof MinaSession) {
-              if (((MinaSession) io).getSession().getConfig() instanceof SocketSessionConfig) {
-                ((SocketSessionConfig) ((MinaSession) io).getSession().getConfig())
-                    .setKeepAlive(keepAlive);
-              }
-            }
-
-            ServerSessionImpl s = super.createSession(io);
-            int id = idGenerator.next();
-            SocketAddress peer = io.getRemoteAddress();
-            final SshSession sd = new SshSession(id, peer);
-            s.setAttribute(SshSession.KEY, sd);
-
-            // Log a session close without authentication as a failure.
-            //
-            s.addCloseFutureListener(
-                new SshFutureListener<CloseFuture>() {
-                  @Override
-                  public void operationComplete(CloseFuture future) {
-                    connected.decrementAndGet();
-                    if (sd.isAuthenticationError()) {
-                      authFailures.increment();
-                      sshLog.onAuthFail(sd);
-                    }
-                  }
-                });
-            return s;
-          }
-
-          @Override
-          protected ServerSessionImpl doCreateSession(IoSession ioSession) throws Exception {
-            return new ServerSessionImpl(getServer(), ioSession);
-          }
-        });
-    setGlobalRequestHandlers(
-        Arrays.<RequestHandler<ConnectionService>>asList(
-            new KeepAliveHandler(),
-            new NoMoreSessionsHandler(),
-            new TcpipForwardHandler(),
-            new CancelTcpipForwardHandler()));
-
-    hostKeys = computeHostKeys();
-  }
-
-  @Override
-  public List<HostKey> getHostKeys() {
-    return hostKeys;
-  }
-
-  public IoAcceptor getIoAcceptor() {
-    return daemonAcceptor;
-  }
-
-  @Override
-  public synchronized void start() {
-    if (daemonAcceptor == null && !listen.isEmpty()) {
-      checkConfig();
-      if (getSessionFactory() == null) {
-        setSessionFactory(createSessionFactory());
-      }
-      setupSessionTimeout(getSessionFactory());
-      daemonAcceptor = createAcceptor();
-
-      try {
-        String listenAddress = cfg.getString("sshd", null, "listenAddress");
-        boolean rewrite = !Strings.isNullOrEmpty(listenAddress) && listenAddress.endsWith(":0");
-        daemonAcceptor.bind(listen);
-        if (rewrite) {
-          SocketAddress bound = Iterables.getOnlyElement(daemonAcceptor.getBoundAddresses());
-          cfg.setString("sshd", null, "listenAddress", format((InetSocketAddress) bound));
-        }
-      } catch (IOException e) {
-        throw new IllegalStateException("Cannot bind to " + addressList(), e);
-      }
-
-      sshDaemonLog.info(String.format("Started Gerrit %s on %s", getVersion(), addressList()));
-    }
-  }
-
-  private static String format(InetSocketAddress s) {
-    return String.format("%s:%d", s.getAddress().getHostAddress(), s.getPort());
-  }
-
-  @Override
-  public synchronized void stop() {
-    if (daemonAcceptor != null) {
-      try {
-        daemonAcceptor.close(true).await();
-        shutdownExecutors();
-        sshDaemonLog.info("Stopped Gerrit SSHD");
-      } catch (IOException e) {
-        sshDaemonLog.warn("Exception caught while closing", e);
-      } finally {
-        daemonAcceptor = null;
-      }
-    }
-  }
-
-  private void shutdownExecutors() {
-    if (executor != null) {
-      executor.shutdownNow();
-    }
-
-    IoServiceFactory serviceFactory = getIoServiceFactory();
-    if (serviceFactory instanceof AbstractIoServiceFactory) {
-      shutdownServiceFactoryExecutor((AbstractIoServiceFactory) serviceFactory);
-    }
-  }
-
-  private void shutdownServiceFactoryExecutor(AbstractIoServiceFactory ioServiceFactory) {
-    ioServiceFactory.close(true);
-    ExecutorService serviceFactoryExecutor = ioServiceFactory.getExecutorService();
-    if (serviceFactoryExecutor != null && serviceFactoryExecutor != executor) {
-      serviceFactoryExecutor.shutdownNow();
-    }
-  }
-
-  @Override
-  protected void checkConfig() {
-    super.checkConfig();
-    if (myHostKeys().isEmpty()) {
-      throw new IllegalStateException("No SSHD host key");
-    }
-  }
-
-  private List<HostKey> computeHostKeys() {
-    if (listen.isEmpty()) {
-      return Collections.emptyList();
-    }
-
-    final List<PublicKey> keys = myHostKeys();
-    final List<HostKey> r = new ArrayList<>();
-    for (PublicKey pub : keys) {
-      final Buffer buf = new ByteArrayBuffer();
-      buf.putRawPublicKey(pub);
-      final byte[] keyBin = buf.getCompactData();
-
-      for (String addr : advertised) {
-        try {
-          r.add(new HostKey(addr, keyBin));
-        } catch (JSchException e) {
-          sshDaemonLog.warn(
-              String.format(
-                  "Cannot format SSHD host key [%s]: %s", pub.getAlgorithm(), e.getMessage()));
-        }
-      }
-    }
-    return Collections.unmodifiableList(r);
-  }
-
-  private List<PublicKey> myHostKeys() {
-    final KeyPairProvider p = getKeyPairProvider();
-    final List<PublicKey> keys = new ArrayList<>(6);
-    addPublicKey(keys, p, KeyPairProvider.SSH_ED25519);
-    addPublicKey(keys, p, KeyPairProvider.ECDSA_SHA2_NISTP256);
-    addPublicKey(keys, p, KeyPairProvider.ECDSA_SHA2_NISTP384);
-    addPublicKey(keys, p, KeyPairProvider.ECDSA_SHA2_NISTP521);
-    addPublicKey(keys, p, KeyPairProvider.SSH_RSA);
-    addPublicKey(keys, p, KeyPairProvider.SSH_DSS);
-    return keys;
-  }
-
-  private static void addPublicKey(
-      final Collection<PublicKey> out, KeyPairProvider p, String type) {
-    final KeyPair pair = p.loadKey(type);
-    if (pair != null && pair.getPublic() != null) {
-      out.add(pair.getPublic());
-    }
-  }
-
-  private String addressList() {
-    final StringBuilder r = new StringBuilder();
-    for (Iterator<SocketAddress> i = listen.iterator(); i.hasNext(); ) {
-      r.append(SocketUtil.format(i.next(), IANA_SSH_PORT));
-      if (i.hasNext()) {
-        r.append(", ");
-      }
-    }
-    return r.toString();
-  }
-
-  @SuppressWarnings("unchecked")
-  private void initKeyExchanges(Config cfg) {
-    List<NamedFactory<KeyExchange>> a = ServerBuilder.setUpDefaultKeyExchanges(true);
-    setKeyExchangeFactories(
-        filter(cfg, "kex", (NamedFactory<KeyExchange>[]) a.toArray(new NamedFactory<?>[a.size()])));
-  }
-
-  private void initProviderBouncyCastle(Config cfg) {
-    NamedFactory<Random> factory;
-    if (cfg.getBoolean("sshd", null, "testUseInsecureRandom", false)) {
-      factory = new InsecureBouncyCastleRandom.Factory();
-    } else {
-      factory = SecurityUtils.getRandomFactory();
-    }
-    setRandomFactory(new SingletonRandomFactory(factory));
-  }
-
-  private static class InsecureBouncyCastleRandom implements Random {
-    private static class Factory implements NamedFactory<Random> {
-      @Override
-      public String getName() {
-        return "INSECURE_bouncycastle";
-      }
-
-      @Override
-      public Random create() {
-        return new InsecureBouncyCastleRandom();
-      }
-    }
-
-    private final RandomGenerator random;
-
-    private InsecureBouncyCastleRandom() {
-      random = new VMPCRandomGenerator();
-      random.addSeedMaterial(1234);
-    }
-
-    @Override
-    public String getName() {
-      return "InsecureBouncyCastleRandom";
-    }
-
-    @Override
-    public void fill(byte[] bytes, int start, int len) {
-      random.nextBytes(bytes, start, len);
-    }
-
-    @Override
-    public void fill(byte[] bytes) {
-      random.nextBytes(bytes);
-    }
-
-    @Override
-    public int random(int n) {
-      if (n > 0) {
-        if ((n & -n) == n) {
-          return (int) ((n * (long) next(31)) >> 31);
-        }
-        int bits;
-        int val;
-        do {
-          bits = next(31);
-          val = bits % n;
-        } while (bits - val + (n - 1) < 0);
-        return val;
-      }
-      throw new IllegalArgumentException();
-    }
-
-    protected final int next(int numBits) {
-      int bytes = (numBits + 7) / 8;
-      byte[] next = new byte[bytes];
-      int ret = 0;
-      random.nextBytes(next);
-      for (int i = 0; i < bytes; i++) {
-        ret = (next[i] & 0xFF) | (ret << 8);
-      }
-      return ret >>> (bytes * 8 - numBits);
-    }
-  }
-
-  @SuppressWarnings("unchecked")
-  private void initCiphers(Config cfg) {
-    final List<NamedFactory<Cipher>> a = BaseBuilder.setUpDefaultCiphers(true);
-
-    for (Iterator<NamedFactory<Cipher>> i = a.iterator(); i.hasNext(); ) {
-      final NamedFactory<Cipher> f = i.next();
-      try {
-        final Cipher c = f.create();
-        final byte[] key = new byte[c.getBlockSize()];
-        final byte[] iv = new byte[c.getIVSize()];
-        c.init(Cipher.Mode.Encrypt, key, iv);
-      } catch (InvalidKeyException e) {
-        sshDaemonLog.warn(
-            "Disabling cipher "
-                + f.getName()
-                + ": "
-                + e.getMessage()
-                + "; try installing unlimited cryptography extension");
-        i.remove();
-      } catch (Exception e) {
-        sshDaemonLog.warn("Disabling cipher " + f.getName() + ": " + e.getMessage());
-        i.remove();
-      }
-    }
-
-    a.add(null);
-    setCipherFactories(
-        filter(cfg, "cipher", (NamedFactory<Cipher>[]) a.toArray(new NamedFactory<?>[a.size()])));
-  }
-
-  @SuppressWarnings("unchecked")
-  private void initMacs(Config cfg) {
-    List<NamedFactory<Mac>> m = BaseBuilder.setUpDefaultMacs(true);
-    setMacFactories(
-        filter(cfg, "mac", (NamedFactory<Mac>[]) m.toArray(new NamedFactory<?>[m.size()])));
-  }
-
-  @SafeVarargs
-  private static <T> List<NamedFactory<T>> filter(
-      final Config cfg, String key, NamedFactory<T>... avail) {
-    final ArrayList<NamedFactory<T>> def = new ArrayList<>();
-    for (NamedFactory<T> n : avail) {
-      if (n == null) {
-        break;
-      }
-      def.add(n);
-    }
-
-    final String[] want = cfg.getStringList("sshd", null, key);
-    if (want == null || want.length == 0) {
-      return def;
-    }
-
-    boolean didClear = false;
-    for (String setting : want) {
-      String name = setting.trim();
-      boolean add = true;
-      if (name.startsWith("-")) {
-        add = false;
-        name = name.substring(1).trim();
-      } else if (name.startsWith("+")) {
-        name = name.substring(1).trim();
-      } else if (!didClear) {
-        didClear = true;
-        def.clear();
-      }
-
-      final NamedFactory<T> n = find(name, avail);
-      if (n == null) {
-        final StringBuilder msg = new StringBuilder();
-        msg.append("sshd.").append(key).append(" = ").append(name).append(" unsupported; only ");
-        for (int i = 0; i < avail.length; i++) {
-          if (avail[i] == null) {
-            continue;
-          }
-          if (i > 0) {
-            msg.append(", ");
-          }
-          msg.append(avail[i].getName());
-        }
-        msg.append(" is supported");
-        sshDaemonLog.error(msg.toString());
-      } else if (add) {
-        if (!def.contains(n)) {
-          def.add(n);
-        }
-      } else {
-        def.remove(n);
-      }
-    }
-
-    return def;
-  }
-
-  @SafeVarargs
-  private static <T> NamedFactory<T> find(String name, NamedFactory<T>... avail) {
-    for (NamedFactory<T> n : avail) {
-      if (n != null && name.equals(n.getName())) {
-        return n;
-      }
-    }
-    return null;
-  }
-
-  private void initSignatures() {
-    setSignatureFactories(BaseBuilder.setUpDefaultSignatures(true));
-  }
-
-  private void initCompression(boolean enableCompression) {
-    List<NamedFactory<Compression>> compressionFactories = new ArrayList<>();
-
-    // Always support no compression over SSHD.
-    compressionFactories.add(BuiltinCompressions.none);
-
-    // In the general case, we want to disable transparent compression, since
-    // the majority of our data transfer is highly compressed Git pack files
-    // and we cannot make them any smaller than they already are.
-    //
-    // However, if there are CPU in abundance and the server is reachable through
-    // slow networks, gits with huge amount of refs can benefit from SSH-compression
-    // since git does not compress the ref announcement during the handshake.
-    //
-    // Compression can be especially useful when Gerrit slaves are being used
-    // for the larger clones and fetches and the master server mostly takes small
-    // receive-packs.
-
-    if (enableCompression) {
-      compressionFactories.add(BuiltinCompressions.zlib);
-    }
-
-    setCompressionFactories(compressionFactories);
-  }
-
-  private void initChannels() {
-    setChannelFactories(ServerBuilder.DEFAULT_CHANNEL_FACTORIES);
-  }
-
-  private void initSubsystems() {
-    setSubsystemFactories(Collections.<NamedFactory<Command>>emptyList());
-  }
-
-  private void initUserAuth(
-      final PublickeyAuthenticator pubkey,
-      final GSSAuthenticator kerberosAuthenticator,
-      String kerberosKeytab,
-      String kerberosPrincipal) {
-    List<NamedFactory<UserAuth>> authFactories = new ArrayList<>();
-    if (kerberosKeytab != null) {
-      authFactories.add(UserAuthGSSFactory.INSTANCE);
-      sshDaemonLog.info("Enabling kerberos with keytab " + kerberosKeytab);
-      if (!new File(kerberosKeytab).canRead()) {
-        sshDaemonLog.error(
-            "Keytab "
-                + kerberosKeytab
-                + " does not exist or is not readable; further errors are possible");
-      }
-      kerberosAuthenticator.setKeytabFile(kerberosKeytab);
-      if (kerberosPrincipal == null) {
-        try {
-          kerberosPrincipal = "host/" + InetAddress.getLocalHost().getCanonicalHostName();
-        } catch (UnknownHostException e) {
-          kerberosPrincipal = "host/localhost";
-        }
-      }
-      sshDaemonLog.info("Using kerberos principal " + kerberosPrincipal);
-      if (!kerberosPrincipal.startsWith("host/")) {
-        sshDaemonLog.warn(
-            "Host principal does not start with host/ "
-                + "which most SSH clients will supply automatically");
-      }
-      kerberosAuthenticator.setServicePrincipalName(kerberosPrincipal);
-      setGSSAuthenticator(kerberosAuthenticator);
-    }
-    authFactories.add(UserAuthPublicKeyFactory.INSTANCE);
-    setUserAuthFactories(authFactories);
-    setPublickeyAuthenticator(pubkey);
-  }
-
-  private void initForwarding() {
-    setTcpipForwardingFilter(
-        new ForwardingFilter() {
-          @Override
-          public boolean canForwardAgent(Session session, String requestType) {
-            return false;
-          }
-
-          @Override
-          public boolean canForwardX11(Session session, String requestType) {
-            return false;
-          }
-
-          @Override
-          public boolean canListen(SshdSocketAddress address, Session session) {
-            return false;
-          }
-
-          @Override
-          public boolean canConnect(Type type, SshdSocketAddress address, Session session) {
-            return false;
-          }
-        });
-    setTcpipForwarderFactory(new DefaultTcpipForwarderFactory());
-  }
-
-  private void initFileSystemFactory() {
-    setFileSystemFactory(
-        new FileSystemFactory() {
-          @Override
-          public FileSystem createFileSystem(Session session) throws IOException {
-            return new FileSystem() {
-              @Override
-              public void close() throws IOException {}
-
-              @Override
-              public Iterable<FileStore> getFileStores() {
-                return null;
-              }
-
-              @Override
-              public Path getPath(String arg0, String... arg1) {
-                return null;
-              }
-
-              @Override
-              public PathMatcher getPathMatcher(String arg0) {
-                return null;
-              }
-
-              @Override
-              public Iterable<Path> getRootDirectories() {
-                return null;
-              }
-
-              @Override
-              public String getSeparator() {
-                return null;
-              }
-
-              @Override
-              public UserPrincipalLookupService getUserPrincipalLookupService() {
-                return null;
-              }
-
-              @Override
-              public boolean isOpen() {
-                return false;
-              }
-
-              @Override
-              public boolean isReadOnly() {
-                return false;
-              }
-
-              @Override
-              public WatchService newWatchService() throws IOException {
-                return null;
-              }
-
-              @Override
-              public FileSystemProvider provider() {
-                return null;
-              }
-
-              @Override
-              public Set<String> supportedFileAttributeViews() {
-                return null;
-              }
-            };
-          }
-        });
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshKeyCacheEntry.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshKeyCacheEntry.java
deleted file mode 100644
index 1a5e137..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshKeyCacheEntry.java
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.sshd;
-
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountSshKey;
-import java.security.PublicKey;
-
-class SshKeyCacheEntry {
-  private final AccountSshKey.Id id;
-  private final PublicKey publicKey;
-
-  SshKeyCacheEntry(AccountSshKey.Id i, PublicKey k) {
-    id = i;
-    publicKey = k;
-  }
-
-  Account.Id getAccount() {
-    return id.getParentKey();
-  }
-
-  boolean match(PublicKey inkey) {
-    return publicKey.equals(inkey);
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshKeyCacheImpl.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshKeyCacheImpl.java
deleted file mode 100644
index 6a68211..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshKeyCacheImpl.java
+++ /dev/null
@@ -1,145 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.sshd;
-
-import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_USERNAME;
-
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import com.google.gerrit.reviewdb.client.AccountSshKey;
-import com.google.gerrit.server.account.VersionedAuthorizedKeys;
-import com.google.gerrit.server.account.externalids.ExternalId;
-import com.google.gerrit.server.account.externalids.ExternalIds;
-import com.google.gerrit.server.cache.CacheModule;
-import com.google.gerrit.server.ssh.SshKeyCache;
-import com.google.gerrit.server.ssh.SshKeyCreator;
-import com.google.inject.Inject;
-import com.google.inject.Module;
-import com.google.inject.Singleton;
-import com.google.inject.TypeLiteral;
-import com.google.inject.name.Named;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.ExecutionException;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Provides the {@link SshKeyCacheEntry}. */
-@Singleton
-public class SshKeyCacheImpl implements SshKeyCache {
-  private static final Logger log = LoggerFactory.getLogger(SshKeyCacheImpl.class);
-  private static final String CACHE_NAME = "sshkeys";
-
-  static final Iterable<SshKeyCacheEntry> NO_SUCH_USER = none();
-  static final Iterable<SshKeyCacheEntry> NO_KEYS = none();
-
-  public static Module module() {
-    return new CacheModule() {
-      @Override
-      protected void configure() {
-        cache(CACHE_NAME, String.class, new TypeLiteral<Iterable<SshKeyCacheEntry>>() {})
-            .loader(Loader.class);
-        bind(SshKeyCacheImpl.class);
-        bind(SshKeyCache.class).to(SshKeyCacheImpl.class);
-        bind(SshKeyCreator.class).to(SshKeyCreatorImpl.class);
-      }
-    };
-  }
-
-  private static Iterable<SshKeyCacheEntry> none() {
-    return Collections.unmodifiableCollection(Arrays.asList(new SshKeyCacheEntry[0]));
-  }
-
-  private final LoadingCache<String, Iterable<SshKeyCacheEntry>> cache;
-
-  @Inject
-  SshKeyCacheImpl(@Named(CACHE_NAME) LoadingCache<String, Iterable<SshKeyCacheEntry>> cache) {
-    this.cache = cache;
-  }
-
-  Iterable<SshKeyCacheEntry> get(String username) {
-    try {
-      return cache.get(username);
-    } catch (ExecutionException e) {
-      log.warn("Cannot load SSH keys for " + username, e);
-      return Collections.emptyList();
-    }
-  }
-
-  @Override
-  public void evict(String username) {
-    if (username != null) {
-      cache.invalidate(username);
-    }
-  }
-
-  static class Loader extends CacheLoader<String, Iterable<SshKeyCacheEntry>> {
-    private final ExternalIds externalIds;
-    private final VersionedAuthorizedKeys.Accessor authorizedKeys;
-
-    @Inject
-    Loader(ExternalIds externalIds, VersionedAuthorizedKeys.Accessor authorizedKeys) {
-      this.externalIds = externalIds;
-      this.authorizedKeys = authorizedKeys;
-    }
-
-    @Override
-    public Iterable<SshKeyCacheEntry> load(String username) throws Exception {
-      ExternalId user = externalIds.get(ExternalId.Key.create(SCHEME_USERNAME, username));
-      if (user == null) {
-        return NO_SUCH_USER;
-      }
-
-      List<SshKeyCacheEntry> kl = new ArrayList<>(4);
-      for (AccountSshKey k : authorizedKeys.getKeys(user.accountId())) {
-        if (k.isValid()) {
-          add(kl, k);
-        }
-      }
-
-      if (kl.isEmpty()) {
-        return NO_KEYS;
-      }
-      return Collections.unmodifiableList(kl);
-    }
-
-    private void add(List<SshKeyCacheEntry> kl, AccountSshKey k) {
-      try {
-        kl.add(new SshKeyCacheEntry(k.getKey(), SshUtil.parse(k)));
-      } catch (OutOfMemoryError e) {
-        // This is the only case where we assume the problem has nothing
-        // to do with the key object, and instead we must abort this load.
-        //
-        throw e;
-      } catch (Throwable e) {
-        markInvalid(k);
-      }
-    }
-
-    private void markInvalid(AccountSshKey k) {
-      try {
-        log.info("Flagging SSH key " + k.getKey() + " invalid");
-        authorizedKeys.markKeyInvalid(k.getAccount(), k.getKey().get());
-        k.setInvalid();
-      } catch (IOException | ConfigInvalidException e) {
-        log.error("Failed to mark SSH key" + k.getKey() + " invalid", e);
-      }
-    }
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshKeyCreatorImpl.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshKeyCreatorImpl.java
deleted file mode 100644
index 637f98e..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshKeyCreatorImpl.java
+++ /dev/null
@@ -1,43 +0,0 @@
-// 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.
-
-package com.google.gerrit.sshd;
-
-import com.google.gerrit.common.errors.InvalidSshKeyException;
-import com.google.gerrit.reviewdb.client.AccountSshKey;
-import com.google.gerrit.server.ssh.SshKeyCreator;
-import java.security.NoSuchAlgorithmException;
-import java.security.NoSuchProviderException;
-import java.security.spec.InvalidKeySpecException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class SshKeyCreatorImpl implements SshKeyCreator {
-  private static final Logger log = LoggerFactory.getLogger(SshKeyCreatorImpl.class);
-
-  @Override
-  public AccountSshKey create(AccountSshKey.Id id, String encoded) throws InvalidSshKeyException {
-    try {
-      AccountSshKey key = new AccountSshKey(id, SshUtil.toOpenSshPublicKey(encoded));
-      SshUtil.parse(key);
-      return key;
-    } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
-      throw new InvalidSshKeyException();
-
-    } catch (NoSuchProviderException e) {
-      log.error("Cannot parse SSH key", e);
-      throw new InvalidSshKeyException();
-    }
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshLog.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshLog.java
deleted file mode 100644
index 12064c8..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshLog.java
+++ /dev/null
@@ -1,291 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.sshd;
-
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.MultimapBuilder;
-import com.google.gerrit.audit.AuditService;
-import com.google.gerrit.audit.SshAuditEvent;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.PeerDaemonUser;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.util.IdGenerator;
-import com.google.gerrit.server.util.SystemLog;
-import com.google.gerrit.sshd.SshScope.Context;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import org.apache.log4j.AsyncAppender;
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
-import org.apache.log4j.spi.LoggingEvent;
-import org.eclipse.jgit.lib.Config;
-
-@Singleton
-class SshLog implements LifecycleListener {
-  private static final Logger log = Logger.getLogger(SshLog.class);
-  private static final String LOG_NAME = "sshd_log";
-  private static final String P_SESSION = "session";
-  private static final String P_USER_NAME = "userName";
-  private static final String P_ACCOUNT_ID = "accountId";
-  private static final String P_WAIT = "queueWaitTime";
-  private static final String P_EXEC = "executionTime";
-  private static final String P_STATUS = "status";
-  private static final String P_AGENT = "agent";
-
-  private final Provider<SshSession> session;
-  private final Provider<Context> context;
-  private final AsyncAppender async;
-  private final AuditService auditService;
-
-  @Inject
-  SshLog(
-      final Provider<SshSession> session,
-      final Provider<Context> context,
-      SystemLog systemLog,
-      @GerritServerConfig Config config,
-      AuditService auditService) {
-    this.session = session;
-    this.context = context;
-    this.auditService = auditService;
-
-    if (!config.getBoolean("sshd", "requestLog", true)) {
-      async = null;
-      return;
-    }
-    async = systemLog.createAsyncAppender(LOG_NAME, new SshLogLayout());
-  }
-
-  @Override
-  public void start() {}
-
-  @Override
-  public void stop() {
-    if (async != null) {
-      async.close();
-    }
-  }
-
-  void onLogin() {
-    LoggingEvent entry = log("LOGIN FROM " + session.get().getRemoteAddressAsString());
-    if (async != null) {
-      async.append(entry);
-    }
-    audit(context.get(), "0", "LOGIN");
-  }
-
-  void onAuthFail(SshSession sd) {
-    final LoggingEvent event =
-        new LoggingEvent( //
-            Logger.class.getName(), // fqnOfCategoryClass
-            log, // logger
-            TimeUtil.nowMs(), // when
-            Level.INFO, // level
-            "AUTH FAILURE FROM " + sd.getRemoteAddressAsString(), // message text
-            "SSHD", // thread name
-            null, // exception information
-            null, // current NDC string
-            null, // caller location
-            null // MDC properties
-            );
-
-    event.setProperty(P_SESSION, id(sd.getSessionId()));
-    event.setProperty(P_USER_NAME, sd.getUsername());
-
-    final String error = sd.getAuthenticationError();
-    if (error != null) {
-      event.setProperty(P_STATUS, error);
-    }
-    if (async != null) {
-      async.append(event);
-    }
-    audit(null, "FAIL", "AUTH");
-  }
-
-  void onExecute(DispatchCommand dcmd, int exitValue, SshSession sshSession) {
-    final Context ctx = context.get();
-    ctx.finished = TimeUtil.nowMs();
-
-    String cmd = extractWhat(dcmd);
-
-    final LoggingEvent event = log(cmd);
-    event.setProperty(P_WAIT, (ctx.started - ctx.created) + "ms");
-    event.setProperty(P_EXEC, (ctx.finished - ctx.started) + "ms");
-
-    final String status;
-    switch (exitValue) {
-      case BaseCommand.STATUS_CANCEL:
-        status = "killed";
-        break;
-
-      case BaseCommand.STATUS_NOT_FOUND:
-        status = "not-found";
-        break;
-
-      case BaseCommand.STATUS_NOT_ADMIN:
-        status = "not-admin";
-        break;
-
-      default:
-        status = String.valueOf(exitValue);
-        break;
-    }
-    event.setProperty(P_STATUS, status);
-    String peerAgent = sshSession.getPeerAgent();
-    if (peerAgent != null) {
-      event.setProperty(P_AGENT, peerAgent);
-    }
-
-    if (async != null) {
-      async.append(event);
-    }
-    audit(context.get(), status, dcmd);
-  }
-
-  private ListMultimap<String, ?> extractParameters(DispatchCommand dcmd) {
-    if (dcmd == null) {
-      return MultimapBuilder.hashKeys(0).arrayListValues(0).build();
-    }
-    String[] cmdArgs = dcmd.getArguments();
-    String paramName = null;
-    int argPos = 0;
-    ListMultimap<String, String> parms = MultimapBuilder.hashKeys().arrayListValues().build();
-    for (int i = 2; i < cmdArgs.length; i++) {
-      String arg = cmdArgs[i];
-      // -- stop parameters parsing
-      if (arg.equals("--")) {
-        for (i++; i < cmdArgs.length; i++) {
-          parms.put("$" + argPos++, cmdArgs[i]);
-        }
-        break;
-      }
-      // --param=value
-      int eqPos = arg.indexOf('=');
-      if (arg.startsWith("--") && eqPos > 0) {
-        parms.put(arg.substring(0, eqPos), arg.substring(eqPos + 1));
-        continue;
-      }
-      // -p value or --param value
-      if (arg.startsWith("-")) {
-        if (paramName != null) {
-          parms.put(paramName, null);
-        }
-        paramName = arg;
-        continue;
-      }
-      // value
-      if (paramName == null) {
-        parms.put("$" + argPos++, arg);
-      } else {
-        parms.put(paramName, arg);
-        paramName = null;
-      }
-    }
-    if (paramName != null) {
-      parms.put(paramName, null);
-    }
-    return parms;
-  }
-
-  void onLogout() {
-    LoggingEvent entry = log("LOGOUT");
-    if (async != null) {
-      async.append(entry);
-    }
-    audit(context.get(), "0", "LOGOUT");
-  }
-
-  private LoggingEvent log(String msg) {
-    final SshSession sd = session.get();
-    final CurrentUser user = sd.getUser();
-
-    final LoggingEvent event =
-        new LoggingEvent( //
-            Logger.class.getName(), // fqnOfCategoryClass
-            log, // logger
-            TimeUtil.nowMs(), // when
-            Level.INFO, // level
-            msg, // message text
-            "SSHD", // thread name
-            null, // exception information
-            null, // current NDC string
-            null, // caller location
-            null // MDC properties
-            );
-
-    event.setProperty(P_SESSION, id(sd.getSessionId()));
-
-    String userName = "-";
-    String accountId = "-";
-
-    if (user != null && user.isIdentifiedUser()) {
-      IdentifiedUser u = user.asIdentifiedUser();
-      userName = u.getAccount().getUserName();
-      accountId = "a/" + u.getAccountId().toString();
-
-    } else if (user instanceof PeerDaemonUser) {
-      userName = PeerDaemonUser.USER_NAME;
-    }
-
-    event.setProperty(P_USER_NAME, userName);
-    event.setProperty(P_ACCOUNT_ID, accountId);
-
-    return event;
-  }
-
-  private static String id(int id) {
-    return IdGenerator.format(id);
-  }
-
-  void audit(Context ctx, Object result, String cmd) {
-    audit(ctx, result, cmd, null);
-  }
-
-  void audit(Context ctx, Object result, DispatchCommand cmd) {
-    audit(ctx, result, extractWhat(cmd), extractParameters(cmd));
-  }
-
-  private void audit(Context ctx, Object result, String cmd, ListMultimap<String, ?> params) {
-    String sessionId;
-    CurrentUser currentUser;
-    long created;
-    if (ctx == null) {
-      sessionId = null;
-      currentUser = null;
-      created = TimeUtil.nowMs();
-    } else {
-      SshSession session = ctx.getSession();
-      sessionId = IdGenerator.format(session.getSessionId());
-      currentUser = session.getUser();
-      created = ctx.created;
-    }
-    auditService.dispatch(new SshAuditEvent(sessionId, currentUser, cmd, created, params, result));
-  }
-
-  private String extractWhat(DispatchCommand dcmd) {
-    if (dcmd == null) {
-      return "Command was already destroyed";
-    }
-    StringBuilder commandName = new StringBuilder(dcmd.getCommandName());
-    String[] args = dcmd.getArguments();
-    for (int i = 1; i < args.length; i++) {
-      commandName.append(".").append(args[i]);
-    }
-    return commandName.toString();
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshModule.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshModule.java
deleted file mode 100644
index 4134496..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshModule.java
+++ /dev/null
@@ -1,138 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.sshd;
-
-import static com.google.gerrit.extensions.registration.PrivateInternals_DynamicTypes.registerInParentInjectors;
-import static com.google.inject.Scopes.SINGLETON;
-
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.lifecycle.LifecycleModule;
-import com.google.gerrit.server.DynamicOptions;
-import com.google.gerrit.server.PeerDaemonUser;
-import com.google.gerrit.server.RemotePeer;
-import com.google.gerrit.server.config.GerritRequestModule;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.git.QueueProvider;
-import com.google.gerrit.server.git.receive.AsyncReceiveCommits;
-import com.google.gerrit.server.plugins.ModuleGenerator;
-import com.google.gerrit.server.plugins.ReloadPluginListener;
-import com.google.gerrit.server.plugins.StartPluginListener;
-import com.google.gerrit.server.ssh.SshInfo;
-import com.google.gerrit.server.util.RequestScopePropagator;
-import com.google.gerrit.sshd.commands.QueryShell;
-import com.google.inject.Inject;
-import com.google.inject.internal.UniqueAnnotations;
-import com.google.inject.servlet.RequestScoped;
-import java.net.SocketAddress;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.ScheduledThreadPoolExecutor;
-import org.apache.sshd.server.CommandFactory;
-import org.apache.sshd.server.auth.gss.GSSAuthenticator;
-import org.apache.sshd.server.auth.pubkey.PublickeyAuthenticator;
-import org.eclipse.jgit.lib.Config;
-
-/** Configures standard dependencies for {@link SshDaemon}. */
-public class SshModule extends LifecycleModule {
-  private final Map<String, String> aliases;
-
-  @Inject
-  SshModule(@GerritServerConfig Config cfg) {
-    aliases = new HashMap<>();
-    for (String name : cfg.getNames("ssh-alias", true)) {
-      aliases.put(name, cfg.getString("ssh-alias", null, name));
-    }
-  }
-
-  @Override
-  protected void configure() {
-    bindScope(RequestScoped.class, SshScope.REQUEST);
-    bind(RequestScopePropagator.class).to(SshScope.Propagator.class);
-    bind(SshScope.class).in(SINGLETON);
-
-    configureRequestScope();
-    install(new AsyncReceiveCommits.Module());
-    configureAliases();
-
-    bind(SshLog.class);
-    bind(SshInfo.class).to(SshDaemon.class).in(SINGLETON);
-    factory(DispatchCommand.Factory.class);
-    factory(QueryShell.Factory.class);
-    factory(PeerDaemonUser.Factory.class);
-
-    bind(DispatchCommandProvider.class)
-        .annotatedWith(Commands.CMD_ROOT)
-        .toInstance(new DispatchCommandProvider(Commands.CMD_ROOT));
-    bind(CommandFactoryProvider.class);
-    bind(CommandFactory.class).toProvider(CommandFactoryProvider.class);
-    bind(ScheduledThreadPoolExecutor.class)
-        .annotatedWith(StreamCommandExecutor.class)
-        .toProvider(StreamCommandExecutorProvider.class)
-        .in(SINGLETON);
-    bind(QueueProvider.class).to(CommandExecutorQueueProvider.class);
-
-    bind(GSSAuthenticator.class).to(GerritGSSAuthenticator.class);
-    bind(PublickeyAuthenticator.class).to(CachingPublicKeyAuthenticator.class);
-
-    bind(ModuleGenerator.class).to(SshAutoRegisterModuleGenerator.class);
-    bind(SshPluginStarterCallback.class);
-    bind(StartPluginListener.class)
-        .annotatedWith(UniqueAnnotations.create())
-        .to(SshPluginStarterCallback.class);
-
-    bind(ReloadPluginListener.class)
-        .annotatedWith(UniqueAnnotations.create())
-        .to(SshPluginStarterCallback.class);
-
-    DynamicMap.mapOf(binder(), DynamicOptions.DynamicBean.class);
-    DynamicItem.itemOf(binder(), SshCreateCommandInterceptor.class);
-
-    listener().toInstance(registerInParentInjectors());
-    listener().to(SshLog.class);
-    listener().to(SshDaemon.class);
-    listener().to(CommandFactoryProvider.class);
-  }
-
-  private void configureAliases() {
-    CommandName gerrit = Commands.named("gerrit");
-    for (Map.Entry<String, String> e : aliases.entrySet()) {
-      String name = e.getKey();
-      String[] dest = e.getValue().split("[ \\t]+");
-      CommandName cmd = Commands.named(dest[0]);
-      for (int i = 1; i < dest.length; i++) {
-        cmd = Commands.named(cmd, dest[i]);
-      }
-      bind(Commands.key(gerrit, name)).toProvider(new AliasCommandProvider(cmd));
-    }
-  }
-
-  private void configureRequestScope() {
-    bind(SshScope.Context.class).toProvider(SshScope.ContextProvider.class);
-
-    bind(SshSession.class).toProvider(SshScope.SshSessionProvider.class).in(SshScope.REQUEST);
-    bind(SocketAddress.class)
-        .annotatedWith(RemotePeer.class)
-        .toProvider(SshRemotePeerProvider.class)
-        .in(SshScope.REQUEST);
-
-    bind(ScheduledThreadPoolExecutor.class)
-        .annotatedWith(CommandExecutor.class)
-        .toProvider(CommandExecutorProvider.class)
-        .in(SshScope.REQUEST);
-
-    install(new GerritRequestModule());
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshPluginStarterCallback.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshPluginStarterCallback.java
deleted file mode 100644
index 1a54f1d..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshPluginStarterCallback.java
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.sshd;
-
-import com.google.gerrit.extensions.registration.DynamicMap;
-import com.google.gerrit.server.DynamicOptions;
-import com.google.gerrit.server.plugins.Plugin;
-import com.google.gerrit.server.plugins.ReloadPluginListener;
-import com.google.gerrit.server.plugins.StartPluginListener;
-import com.google.inject.Inject;
-import com.google.inject.Key;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import org.apache.sshd.server.Command;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-class SshPluginStarterCallback implements StartPluginListener, ReloadPluginListener {
-  private static final Logger log = LoggerFactory.getLogger(SshPluginStarterCallback.class);
-
-  private final DispatchCommandProvider root;
-  private final DynamicMap<DynamicOptions.DynamicBean> dynamicBeans;
-
-  @Inject
-  SshPluginStarterCallback(
-      @CommandName(Commands.ROOT) DispatchCommandProvider root,
-      DynamicMap<DynamicOptions.DynamicBean> dynamicBeans) {
-    this.root = root;
-    this.dynamicBeans = dynamicBeans;
-  }
-
-  @Override
-  public void onStartPlugin(Plugin plugin) {
-    Provider<Command> cmd = load(plugin);
-    if (cmd != null) {
-      plugin.add(root.register(Commands.named(plugin.getName()), cmd));
-    }
-  }
-
-  @Override
-  public void onReloadPlugin(Plugin oldPlugin, Plugin newPlugin) {
-    Provider<Command> cmd = load(newPlugin);
-    if (cmd != null) {
-      newPlugin.add(root.replace(Commands.named(newPlugin.getName()), cmd));
-    }
-  }
-
-  private Provider<Command> load(Plugin plugin) {
-    if (plugin.getSshInjector() != null) {
-      Key<Command> key = Commands.key(plugin.getName());
-      try {
-        return plugin.getSshInjector().getProvider(key);
-      } catch (RuntimeException err) {
-        if (!providesDynamicOptions(plugin)) {
-          log.warn(
-              "Plugin {} did not define its top-level command nor any DynamicOptions",
-              plugin.getName(),
-              err);
-        }
-      }
-    }
-    return null;
-  }
-
-  private boolean providesDynamicOptions(Plugin plugin) {
-    return dynamicBeans.plugins().contains(plugin.getName());
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshScope.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshScope.java
deleted file mode 100644
index 2659831..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshScope.java
+++ /dev/null
@@ -1,201 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.sshd;
-
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.RequestCleanup;
-import com.google.gerrit.server.config.RequestScopedReviewDbProvider;
-import com.google.gerrit.server.util.RequestContext;
-import com.google.gerrit.server.util.ThreadLocalRequestContext;
-import com.google.gerrit.server.util.ThreadLocalRequestScopePropagator;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Inject;
-import com.google.inject.Key;
-import com.google.inject.OutOfScopeException;
-import com.google.inject.Provider;
-import com.google.inject.Scope;
-import com.google.inject.util.Providers;
-import java.util.HashMap;
-import java.util.Map;
-
-/** Guice scopes for state during an SSH connection. */
-public class SshScope {
-  private static final Key<RequestCleanup> RC_KEY = Key.get(RequestCleanup.class);
-
-  private static final Key<RequestScopedReviewDbProvider> DB_KEY =
-      Key.get(RequestScopedReviewDbProvider.class);
-
-  class Context implements RequestContext {
-    private final RequestCleanup cleanup = new RequestCleanup();
-    private final Map<Key<?>, Object> map = new HashMap<>();
-    private final SchemaFactory<ReviewDb> schemaFactory;
-    private final SshSession session;
-    private final String commandLine;
-
-    final long created;
-    volatile long started;
-    volatile long finished;
-
-    private Context(SchemaFactory<ReviewDb> sf, SshSession s, String c, long at) {
-      schemaFactory = sf;
-      session = s;
-      commandLine = c;
-      created = started = finished = at;
-      map.put(RC_KEY, cleanup);
-      map.put(DB_KEY, new RequestScopedReviewDbProvider(schemaFactory, Providers.of(cleanup)));
-    }
-
-    private Context(Context p, SshSession s, String c) {
-      this(p.schemaFactory, s, c, p.created);
-      started = p.started;
-      finished = p.finished;
-    }
-
-    String getCommandLine() {
-      return commandLine;
-    }
-
-    SshSession getSession() {
-      return session;
-    }
-
-    @Override
-    public CurrentUser getUser() {
-      CurrentUser user = session.getUser();
-      if (user != null && user.isIdentifiedUser()) {
-        IdentifiedUser identifiedUser = userFactory.create(user.getAccountId());
-        identifiedUser.setAccessPath(user.getAccessPath());
-        return identifiedUser;
-      }
-      return user;
-    }
-
-    @Override
-    public Provider<ReviewDb> getReviewDbProvider() {
-      return (RequestScopedReviewDbProvider) map.get(DB_KEY);
-    }
-
-    synchronized <T> T get(Key<T> key, Provider<T> creator) {
-      @SuppressWarnings("unchecked")
-      T t = (T) map.get(key);
-      if (t == null) {
-        t = creator.get();
-        map.put(key, t);
-      }
-      return t;
-    }
-
-    synchronized Context subContext(SshSession newSession, String newCommandLine) {
-      Context ctx = new Context(this, newSession, newCommandLine);
-      ctx.cleanup.add(cleanup);
-      return ctx;
-    }
-  }
-
-  static class ContextProvider implements Provider<Context> {
-    @Override
-    public Context get() {
-      return requireContext();
-    }
-  }
-
-  public static class SshSessionProvider implements Provider<SshSession> {
-    @Override
-    public SshSession get() {
-      return requireContext().getSession();
-    }
-  }
-
-  static class Propagator extends ThreadLocalRequestScopePropagator<Context> {
-    private final SshScope sshScope;
-
-    @Inject
-    Propagator(
-        SshScope sshScope,
-        ThreadLocalRequestContext local,
-        Provider<RequestScopedReviewDbProvider> dbProviderProvider) {
-      super(REQUEST, current, local, dbProviderProvider);
-      this.sshScope = sshScope;
-    }
-
-    @Override
-    protected Context continuingContext(Context ctx) {
-      // The cleanup is not chained, since the RequestScopePropagator executors
-      // the Context's cleanup when finished executing.
-      return sshScope.newContinuingContext(ctx);
-    }
-  }
-
-  private static final ThreadLocal<Context> current = new ThreadLocal<>();
-
-  private static Context requireContext() {
-    final Context ctx = current.get();
-    if (ctx == null) {
-      throw new OutOfScopeException("Not in command/request");
-    }
-    return ctx;
-  }
-
-  private final ThreadLocalRequestContext local;
-  private final IdentifiedUser.RequestFactory userFactory;
-
-  @Inject
-  SshScope(ThreadLocalRequestContext local, IdentifiedUser.RequestFactory userFactory) {
-    this.local = local;
-    this.userFactory = userFactory;
-  }
-
-  Context newContext(SchemaFactory<ReviewDb> sf, SshSession s, String cmd) {
-    return new Context(sf, s, cmd, TimeUtil.nowMs());
-  }
-
-  private Context newContinuingContext(Context ctx) {
-    return new Context(ctx, ctx.getSession(), ctx.getCommandLine());
-  }
-
-  Context set(Context ctx) {
-    Context old = current.get();
-    current.set(ctx);
-    local.setContext(ctx);
-    return old;
-  }
-
-  /** Returns exactly one instance per command executed. */
-  public static final Scope REQUEST =
-      new Scope() {
-        @Override
-        public <T> Provider<T> scope(Key<T> key, Provider<T> creator) {
-          return new Provider<T>() {
-            @Override
-            public T get() {
-              return requireContext().get(key, creator);
-            }
-
-            @Override
-            public String toString() {
-              return String.format("%s[%s]", creator, REQUEST);
-            }
-          };
-        }
-
-        @Override
-        public String toString() {
-          return "SshScopes.REQUEST";
-        }
-      };
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshUtil.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshUtil.java
deleted file mode 100644
index ab0ffcf..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshUtil.java
+++ /dev/null
@@ -1,164 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.sshd;
-
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountSshKey;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.sshd.SshScope.Context;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.StringReader;
-import java.security.NoSuchAlgorithmException;
-import java.security.NoSuchProviderException;
-import java.security.PublicKey;
-import java.security.interfaces.DSAPublicKey;
-import java.security.interfaces.RSAPublicKey;
-import java.security.spec.InvalidKeySpecException;
-import org.apache.commons.codec.binary.Base64;
-import org.apache.sshd.common.SshException;
-import org.apache.sshd.common.future.CloseFuture;
-import org.apache.sshd.common.future.SshFutureListener;
-import org.apache.sshd.common.keyprovider.KeyPairProvider;
-import org.apache.sshd.common.util.buffer.ByteArrayBuffer;
-import org.apache.sshd.server.session.ServerSession;
-import org.eclipse.jgit.lib.Constants;
-
-/** Utilities to support SSH operations. */
-public class SshUtil {
-  /**
-   * Parse a public key into its Java type.
-   *
-   * @param key the account key to parse.
-   * @return the valid public key object.
-   * @throws InvalidKeySpecException the key supplied is not a valid SSH key.
-   * @throws NoSuchAlgorithmException the JVM is missing the key algorithm.
-   * @throws NoSuchProviderException the JVM is missing the provider.
-   */
-  public static PublicKey parse(AccountSshKey key)
-      throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchProviderException {
-    try {
-      final String s = key.getEncodedKey();
-      if (s == null) {
-        throw new InvalidKeySpecException("No key string");
-      }
-      final byte[] bin = Base64.decodeBase64(Constants.encodeASCII(s));
-      return new ByteArrayBuffer(bin).getRawPublicKey();
-    } catch (RuntimeException | SshException e) {
-      throw new InvalidKeySpecException("Cannot parse key", e);
-    }
-  }
-
-  /**
-   * Convert an RFC 4716 style key to an OpenSSH style key.
-   *
-   * @param keyStr the key string to convert.
-   * @return {@code keyStr} if conversion failed; otherwise the converted key, in OpenSSH key
-   *     format.
-   */
-  public static String toOpenSshPublicKey(String keyStr) {
-    try {
-      final StringBuilder strBuf = new StringBuilder();
-      final BufferedReader br = new BufferedReader(new StringReader(keyStr));
-      String line = br.readLine(); // BEGIN SSH2 line...
-      if (line == null || !line.equals("---- BEGIN SSH2 PUBLIC KEY ----")) {
-        return keyStr;
-      }
-
-      while ((line = br.readLine()) != null) {
-        if (line.indexOf(':') == -1) {
-          strBuf.append(line);
-          break;
-        }
-      }
-
-      while ((line = br.readLine()) != null) {
-        if (line.startsWith("---- ")) {
-          break;
-        }
-        strBuf.append(line);
-      }
-
-      final PublicKey key =
-          new ByteArrayBuffer(Base64.decodeBase64(Constants.encodeASCII(strBuf.toString())))
-              .getRawPublicKey();
-      if (key instanceof RSAPublicKey) {
-        strBuf.insert(0, KeyPairProvider.SSH_RSA + " ");
-
-      } else if (key instanceof DSAPublicKey) {
-        strBuf.insert(0, KeyPairProvider.SSH_DSS + " ");
-
-      } else {
-        return keyStr;
-      }
-
-      strBuf.append(' ');
-      strBuf.append("converted-key");
-      return strBuf.toString();
-    } catch (IOException e) {
-      return keyStr;
-    } catch (RuntimeException re) {
-      return keyStr;
-    }
-  }
-
-  public static boolean success(
-      final String username,
-      final ServerSession session,
-      final SshScope sshScope,
-      final SshLog sshLog,
-      final SshSession sd,
-      final CurrentUser user) {
-    if (sd.getUser() == null) {
-      sd.authenticationSuccess(username, user);
-
-      // If this is the first time we've authenticated this
-      // session, record a login event in the log and add
-      // a close listener to record a logout event.
-      //
-      Context ctx = sshScope.newContext(null, sd, null);
-      Context old = sshScope.set(ctx);
-      try {
-        sshLog.onLogin();
-      } finally {
-        sshScope.set(old);
-      }
-
-      session.addCloseFutureListener(
-          new SshFutureListener<CloseFuture>() {
-            @Override
-            public void operationComplete(CloseFuture future) {
-              final Context ctx = sshScope.newContext(null, sd, null);
-              final Context old = sshScope.set(ctx);
-              try {
-                sshLog.onLogout();
-              } finally {
-                sshScope.set(old);
-              }
-            }
-          });
-    }
-
-    return true;
-  }
-
-  public static IdentifiedUser createUser(
-      final SshSession sd,
-      final IdentifiedUser.GenericFactory userFactory,
-      final Account.Id account) {
-    return userFactory.create(sd.getRemoteAddress(), account);
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SuExec.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SuExec.java
deleted file mode 100644
index 54371c1..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SuExec.java
+++ /dev/null
@@ -1,172 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.sshd;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.base.Throwables;
-import com.google.common.util.concurrent.Atomics;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.PeerDaemonUser;
-import com.google.gerrit.server.config.AuthConfig;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.sshd.SshScope.Context;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.net.SocketAddress;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicReference;
-import org.apache.sshd.server.Command;
-import org.apache.sshd.server.Environment;
-import org.kohsuke.args4j.Argument;
-import org.kohsuke.args4j.Option;
-
-/**
- * Executes any other command as a different user identity.
- *
- * <p>The calling user must be authenticated as a {@link PeerDaemonUser}, which usually requires
- * public key authentication using this daemon's private host key, or a key on this daemon's peer
- * host key ring.
- */
-public final class SuExec extends BaseCommand {
-  private final SshScope sshScope;
-  private final DispatchCommandProvider dispatcher;
-  private final PermissionBackend permissionBackend;
-
-  private boolean enableRunAs;
-  private CurrentUser caller;
-  private SshSession session;
-  private IdentifiedUser.GenericFactory userFactory;
-  private SshScope.Context callingContext;
-
-  @Option(name = "--as", required = true)
-  private Account.Id accountId;
-
-  @Option(name = "--from")
-  private SocketAddress peerAddress;
-
-  @Argument(index = 0, multiValued = true, metaVar = "COMMAND")
-  private List<String> args = new ArrayList<>();
-
-  private final AtomicReference<Command> atomicCmd;
-
-  @Inject
-  SuExec(
-      final SshScope sshScope,
-      @CommandName(Commands.ROOT) final DispatchCommandProvider dispatcher,
-      PermissionBackend permissionBackend,
-      final CurrentUser caller,
-      final SshSession session,
-      final IdentifiedUser.GenericFactory userFactory,
-      final SshScope.Context callingContext,
-      AuthConfig config) {
-    this.sshScope = sshScope;
-    this.dispatcher = dispatcher;
-    this.permissionBackend = permissionBackend;
-    this.caller = caller;
-    this.session = session;
-    this.userFactory = userFactory;
-    this.callingContext = callingContext;
-    this.enableRunAs = config.isRunAsEnabled();
-    atomicCmd = Atomics.newReference();
-  }
-
-  @Override
-  public void start(Environment env) throws IOException {
-    try {
-      checkCanRunAs();
-      parseCommandLine();
-
-      final Context ctx = callingContext.subContext(newSession(), join(args));
-      final Context old = sshScope.set(ctx);
-      try {
-        final BaseCommand cmd = dispatcher.get();
-        cmd.setArguments(args.toArray(new String[args.size()]));
-        provideStateTo(cmd);
-        atomicCmd.set(cmd);
-        cmd.start(env);
-      } finally {
-        sshScope.set(old);
-      }
-    } catch (UnloggedFailure e) {
-      String msg = e.getMessage();
-      if (!msg.endsWith("\n")) {
-        msg += "\n";
-      }
-      err.write(msg.getBytes(UTF_8));
-      err.flush();
-      onExit(1);
-    }
-  }
-
-  private void checkCanRunAs() throws UnloggedFailure {
-    if (caller instanceof PeerDaemonUser) {
-      // OK.
-    } else if (!enableRunAs) {
-      throw die("suexec disabled by auth.enableRunAs = false");
-    } else {
-      try {
-        permissionBackend.user(caller).check(GlobalPermission.RUN_AS);
-      } catch (AuthException e) {
-        throw die("suexec not permitted");
-      } catch (PermissionBackendException e) {
-        throw die("suexec not available: " + e);
-      }
-    }
-  }
-
-  private SshSession newSession() {
-    final SocketAddress peer;
-    if (peerAddress == null) {
-      peer = session.getRemoteAddress();
-    } else {
-      peer = peerAddress;
-    }
-    if (caller instanceof PeerDaemonUser) {
-      caller = null;
-    }
-    return new SshSession(session, peer, userFactory.runAs(peer, accountId, caller));
-  }
-
-  private static String join(List<String> args) {
-    StringBuilder r = new StringBuilder();
-    for (String a : args) {
-      if (r.length() > 0) {
-        r.append(" ");
-      }
-      r.append(a);
-    }
-    return r.toString();
-  }
-
-  @Override
-  public void destroy() {
-    Command cmd = atomicCmd.getAndSet(null);
-    if (cmd != null) {
-      try {
-        cmd.destroy();
-      } catch (Exception e) {
-        Throwables.throwIfUnchecked(e);
-        throw new RuntimeException(e);
-      }
-    }
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/AdminQueryShell.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/AdminQueryShell.java
deleted file mode 100644
index ef1cd81..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/AdminQueryShell.java
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.sshd.commands;
-
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.sshd.AdminHighPriorityCommand;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.inject.Inject;
-import org.kohsuke.args4j.Option;
-
-/** Opens a query processor. */
-@AdminHighPriorityCommand
-@RequiresCapability(GlobalCapability.ACCESS_DATABASE)
-@CommandMetaData(name = "gsql", description = "Administrative interface to active database")
-final class AdminQueryShell extends SshCommand {
-  @Inject private PermissionBackend permissionBackend;
-  @Inject private QueryShell.Factory factory;
-  @Inject private IdentifiedUser currentUser;
-
-  @Option(name = "--format", usage = "Set output format")
-  private QueryShell.OutputFormat format = QueryShell.OutputFormat.PRETTY;
-
-  @Option(name = "-c", metaVar = "SQL QUERY", usage = "Query to execute")
-  private String query;
-
-  @Override
-  protected void run() throws Failure {
-    try {
-      permissionBackend.user(currentUser).check(GlobalPermission.ACCESS_DATABASE);
-    } catch (AuthException err) {
-      throw die(err.getMessage());
-    } catch (PermissionBackendException e) {
-      throw new Failure(1, "unavailable", e);
-    }
-
-    QueryShell shell = factory.create(in, out);
-    shell.setOutputFormat(format);
-    if (query != null) {
-      shell.execute(query);
-    } else {
-      shell.run();
-    }
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/AdminSetParent.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/AdminSetParent.java
deleted file mode 100644
index 22eafd6..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/AdminSetParent.java
+++ /dev/null
@@ -1,226 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.sshd.commands;
-
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
-import com.google.gerrit.extensions.common.ProjectInfo;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.git.MetaDataUpdate;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.ListChildProjects;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.server.project.ProjectResource;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.kohsuke.args4j.Argument;
-import org.kohsuke.args4j.Option;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
-@CommandMetaData(
-    name = "set-project-parent",
-    description = "Change the project permissions are inherited from")
-final class AdminSetParent extends SshCommand {
-  private static final Logger log = LoggerFactory.getLogger(AdminSetParent.class);
-
-  @Option(
-      name = "--parent",
-      aliases = {"-p"},
-      metaVar = "NAME",
-      usage = "new parent project")
-  private ProjectControl newParent;
-
-  @Option(
-      name = "--children-of",
-      metaVar = "NAME",
-      usage = "parent project for which the child projects should be reparented")
-  private ProjectControl oldParent;
-
-  @Option(
-      name = "--exclude",
-      metaVar = "NAME",
-      usage = "child project of old parent project which should not be reparented")
-  private List<ProjectControl> excludedChildren = new ArrayList<>();
-
-  @Argument(
-      index = 0,
-      required = false,
-      multiValued = true,
-      metaVar = "NAME",
-      usage = "projects to modify")
-  private List<ProjectControl> children = new ArrayList<>();
-
-  @Inject private ProjectCache projectCache;
-
-  @Inject private MetaDataUpdate.User metaDataUpdateFactory;
-
-  @Inject private AllProjectsName allProjectsName;
-
-  @Inject private ListChildProjects listChildProjects;
-
-  private Project.NameKey newParentKey;
-
-  @Override
-  protected void run() throws Failure {
-    if (oldParent == null && children.isEmpty()) {
-      throw die(
-          "child projects have to be specified as "
-              + "arguments or the --children-of option has to be set");
-    }
-    if (oldParent == null && !excludedChildren.isEmpty()) {
-      throw die("--exclude can only be used together with --children-of");
-    }
-
-    final StringBuilder err = new StringBuilder();
-    final Set<Project.NameKey> grandParents = new HashSet<>();
-
-    grandParents.add(allProjectsName);
-
-    if (newParent != null) {
-      newParentKey = newParent.getProject().getNameKey();
-
-      // Catalog all grandparents of the "parent", we want to
-      // catch a cycle in the parent pointers before it occurs.
-      //
-      Project.NameKey gp = newParent.getProject().getParent();
-      while (gp != null && grandParents.add(gp)) {
-        final ProjectState s = projectCache.get(gp);
-        if (s != null) {
-          gp = s.getProject().getParent();
-        } else {
-          break;
-        }
-      }
-    }
-
-    final List<Project.NameKey> childProjects = new ArrayList<>();
-    for (ProjectControl pc : children) {
-      childProjects.add(pc.getProject().getNameKey());
-    }
-    if (oldParent != null) {
-      try {
-        childProjects.addAll(getChildrenForReparenting(oldParent));
-      } catch (PermissionBackendException e) {
-        throw new Failure(1, "permissions unavailable", e);
-      }
-    }
-
-    for (Project.NameKey nameKey : childProjects) {
-      final String name = nameKey.get();
-
-      if (allProjectsName.equals(nameKey)) {
-        // Don't allow the wild card project to have a parent.
-        //
-        err.append("error: Cannot set parent of '").append(name).append("'\n");
-        continue;
-      }
-
-      if (grandParents.contains(nameKey) || nameKey.equals(newParentKey)) {
-        // Try to avoid creating a cycle in the parent pointers.
-        //
-        err.append("error: Cycle exists between '")
-            .append(name)
-            .append("' and '")
-            .append(newParentKey != null ? newParentKey.get() : allProjectsName.get())
-            .append("'\n");
-        continue;
-      }
-
-      try (MetaDataUpdate md = metaDataUpdateFactory.create(nameKey)) {
-        ProjectConfig config = ProjectConfig.read(md);
-        config.getProject().setParentName(newParentKey);
-        md.setMessage(
-            "Inherit access from "
-                + (newParentKey != null ? newParentKey.get() : allProjectsName.get())
-                + "\n");
-        config.commit(md);
-      } catch (RepositoryNotFoundException notFound) {
-        err.append("error: Project ").append(name).append(" not found\n");
-      } catch (IOException | ConfigInvalidException e) {
-        final String msg = "Cannot update project " + name;
-        log.error(msg, e);
-        err.append("error: ").append(msg).append("\n");
-      }
-
-      projectCache.evict(nameKey);
-    }
-
-    if (err.length() > 0) {
-      while (err.charAt(err.length() - 1) == '\n') {
-        err.setLength(err.length() - 1);
-      }
-      throw die(err.toString());
-    }
-  }
-
-  /**
-   * Returns the children of the specified parent project that should be reparented. The returned
-   * list of child projects does not contain projects that were specified to be excluded from
-   * reparenting.
-   */
-  private List<Project.NameKey> getChildrenForReparenting(ProjectControl parent)
-      throws PermissionBackendException {
-    final List<Project.NameKey> childProjects = new ArrayList<>();
-    final List<Project.NameKey> excluded = new ArrayList<>(excludedChildren.size());
-    for (ProjectControl excludedChild : excludedChildren) {
-      excluded.add(excludedChild.getProject().getNameKey());
-    }
-    final List<Project.NameKey> automaticallyExcluded = new ArrayList<>(excludedChildren.size());
-    if (newParentKey != null) {
-      automaticallyExcluded.addAll(getAllParents(newParentKey));
-    }
-    for (ProjectInfo child : listChildProjects.apply(new ProjectResource(parent))) {
-      final Project.NameKey childName = new Project.NameKey(child.name);
-      if (!excluded.contains(childName)) {
-        if (!automaticallyExcluded.contains(childName)) {
-          childProjects.add(childName);
-        } else {
-          stdout.println(
-              "Automatically excluded '"
-                  + childName
-                  + "' "
-                  + "from reparenting because it is in the parent "
-                  + "line of the new parent '"
-                  + newParentKey
-                  + "'.");
-        }
-      }
-    }
-    return childProjects;
-  }
-
-  private Set<Project.NameKey> getAllParents(Project.NameKey projectName) {
-    ProjectState ps = projectCache.get(projectName);
-    if (ps == null) {
-      return Collections.emptySet();
-    }
-    return ps.parents().transform(s -> s.getNameKey()).toSet();
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ApproveOption.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ApproveOption.java
deleted file mode 100644
index 633eaa0..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ApproveOption.java
+++ /dev/null
@@ -1,158 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.sshd.commands;
-
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.LabelValue;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.AnnotatedElement;
-import org.kohsuke.args4j.CmdLineException;
-import org.kohsuke.args4j.CmdLineParser;
-import org.kohsuke.args4j.Option;
-import org.kohsuke.args4j.OptionDef;
-import org.kohsuke.args4j.spi.FieldSetter;
-import org.kohsuke.args4j.spi.OneArgumentOptionHandler;
-import org.kohsuke.args4j.spi.OptionHandler;
-import org.kohsuke.args4j.spi.Setter;
-
-final class ApproveOption implements Option, Setter<Short> {
-  private final String name;
-  private final String usage;
-  private final LabelType type;
-
-  private Short value;
-
-  ApproveOption(String name, String usage, LabelType type) {
-    this.name = name;
-    this.usage = usage;
-    this.type = type;
-  }
-
-  @Override
-  public String[] aliases() {
-    return new String[0];
-  }
-
-  @Override
-  public String[] depends() {
-    return new String[] {};
-  }
-
-  @Override
-  public boolean hidden() {
-    return false;
-  }
-
-  @Override
-  public Class<? extends OptionHandler<Short>> handler() {
-    return Handler.class;
-  }
-
-  @Override
-  public String metaVar() {
-    return "N";
-  }
-
-  @Override
-  public String name() {
-    return name;
-  }
-
-  @Override
-  public boolean required() {
-    return false;
-  }
-
-  @Override
-  public String usage() {
-    return usage;
-  }
-
-  public Short value() {
-    return value;
-  }
-
-  @Override
-  public Class<? extends Annotation> annotationType() {
-    return null;
-  }
-
-  @Override
-  public FieldSetter asFieldSetter() {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public AnnotatedElement asAnnotatedElement() {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public void addValue(Short val) {
-    this.value = val;
-  }
-
-  @Override
-  public Class<Short> getType() {
-    return Short.class;
-  }
-
-  @Override
-  public boolean isMultiValued() {
-    return false;
-  }
-
-  String getLabelName() {
-    return type.getName();
-  }
-
-  public static class Handler extends OneArgumentOptionHandler<Short> {
-    private final ApproveOption cmdOption;
-
-    // CS IGNORE RedundantModifier FOR NEXT 1 LINES. REASON: needed by org.kohsuke.args4j.Option
-    public Handler(CmdLineParser parser, OptionDef option, Setter<Short> setter) {
-      super(parser, option, setter);
-      this.cmdOption = (ApproveOption) setter;
-    }
-
-    @Override
-    protected Short parse(String token) throws NumberFormatException, CmdLineException {
-      String argument = token;
-      if (argument.startsWith("+")) {
-        argument = argument.substring(1);
-      }
-
-      final short value = Short.parseShort(argument);
-      final LabelValue min = cmdOption.type.getMin();
-      final LabelValue max = cmdOption.type.getMax();
-
-      if (value < min.getValue() || value > max.getValue()) {
-        final String name = cmdOption.name();
-        final String e =
-            "\""
-                + token
-                + "\" must be in range "
-                + min.formatValue()
-                + ".."
-                + max.formatValue()
-                + " for \""
-                + name
-                + "\"";
-        throw new CmdLineException(owner, e);
-      }
-      return value;
-    }
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/BanCommitCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/BanCommitCommand.java
deleted file mode 100644
index 3699073..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/BanCommitCommand.java
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.sshd.commands;
-
-import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER;
-
-import com.google.common.base.Joiner;
-import com.google.common.collect.Lists;
-import com.google.gerrit.server.project.BanCommit;
-import com.google.gerrit.server.project.BanCommit.BanResultInfo;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.server.project.ProjectResource;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.inject.Inject;
-import java.util.ArrayList;
-import java.util.List;
-import org.eclipse.jgit.lib.ObjectId;
-import org.kohsuke.args4j.Argument;
-import org.kohsuke.args4j.Option;
-
-@CommandMetaData(
-    name = "ban-commit",
-    description = "Ban a commit from a project's repository",
-    runsAt = MASTER)
-public class BanCommitCommand extends SshCommand {
-  @Option(
-      name = "--reason",
-      aliases = {"-r"},
-      metaVar = "REASON",
-      usage = "reason for banning the commit")
-  private String reason;
-
-  @Argument(
-      index = 0,
-      required = true,
-      metaVar = "PROJECT",
-      usage = "name of the project for which the commit should be banned")
-  private ProjectControl projectControl;
-
-  @Argument(
-      index = 1,
-      required = true,
-      multiValued = true,
-      metaVar = "COMMIT",
-      usage = "commit(s) that should be banned")
-  private List<ObjectId> commitsToBan = new ArrayList<>();
-
-  @Inject private BanCommit banCommit;
-
-  @Override
-  protected void run() throws Failure {
-    try {
-      BanCommit.Input input =
-          BanCommit.Input.fromCommits(Lists.transform(commitsToBan, ObjectId::getName));
-      input.reason = reason;
-
-      BanResultInfo r = banCommit.apply(new ProjectResource(projectControl), input);
-      printCommits(r.newlyBanned, "The following commits were banned");
-      printCommits(r.alreadyBanned, "The following commits were already banned");
-      printCommits(r.ignored, "The following ids do not represent commits and were ignored");
-    } catch (Exception e) {
-      throw die(e);
-    }
-  }
-
-  private void printCommits(List<String> commits, String message) {
-    if (commits != null && !commits.isEmpty()) {
-      stdout.print(message + ":\n");
-      stdout.print(Joiner.on(",\n").join(commits));
-      stdout.print("\n\n");
-    }
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/BaseTestPrologCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/BaseTestPrologCommand.java
deleted file mode 100644
index e66422a..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/BaseTestPrologCommand.java
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.sshd.commands;
-
-import com.google.gerrit.extensions.common.TestSubmitRuleInput;
-import com.google.gerrit.extensions.common.TestSubmitRuleInput.Filters;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.server.OutputFormat;
-import com.google.gerrit.server.change.ChangesCollection;
-import com.google.gerrit.server.change.RevisionResource;
-import com.google.gerrit.server.change.Revisions;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.inject.Inject;
-import java.nio.ByteBuffer;
-import org.eclipse.jgit.util.IO;
-import org.eclipse.jgit.util.RawParseUtils;
-import org.kohsuke.args4j.Argument;
-import org.kohsuke.args4j.Option;
-
-abstract class BaseTestPrologCommand extends SshCommand {
-  private TestSubmitRuleInput input = new TestSubmitRuleInput();
-
-  @Inject private ChangesCollection changes;
-
-  @Inject private Revisions revisions;
-
-  @Argument(index = 0, required = true, usage = "ChangeId to load in prolog environment")
-  protected String changeId;
-
-  @Option(
-      name = "-s",
-      usage =
-          "Read prolog script from stdin instead of reading rules.pl from the refs/meta/config branch")
-  protected boolean useStdin;
-
-  @Option(
-      name = "--no-filters",
-      aliases = {"-n"},
-      usage = "Don't run the submit_filter/2 from the parent projects")
-  void setNoFilters(boolean no) {
-    input.filters = no ? Filters.SKIP : Filters.RUN;
-  }
-
-  protected abstract RestModifyView<RevisionResource, TestSubmitRuleInput> createView();
-
-  @Override
-  protected final void run() throws UnloggedFailure {
-    try {
-      RevisionResource revision =
-          revisions.parse(
-              changes.parse(TopLevelResource.INSTANCE, IdString.fromUrl(changeId)),
-              IdString.fromUrl("current"));
-      if (useStdin) {
-        ByteBuffer buf = IO.readWholeStream(in, 4096);
-        input.rule = RawParseUtils.decode(buf.array(), buf.arrayOffset(), buf.limit());
-      }
-      Object result = createView().apply(revision, input);
-      OutputFormat.JSON.newGson().toJson(result, stdout);
-      stdout.print('\n');
-    } catch (Exception e) {
-      throw die("Processing of prolog script failed: " + e);
-    }
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CloseConnection.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CloseConnection.java
deleted file mode 100644
index 4640211..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CloseConnection.java
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.sshd.commands;
-
-import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;
-
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
-import com.google.gerrit.sshd.AdminHighPriorityCommand;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.gerrit.sshd.SshDaemon;
-import com.google.gerrit.sshd.SshSession;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.sshd.common.future.CloseFuture;
-import org.apache.sshd.common.io.IoAcceptor;
-import org.apache.sshd.common.io.IoSession;
-import org.apache.sshd.common.session.helpers.AbstractSession;
-import org.kohsuke.args4j.Argument;
-import org.kohsuke.args4j.Option;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Close specified SSH connections */
-@AdminHighPriorityCommand
-@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
-@CommandMetaData(
-    name = "close-connection",
-    description = "Close the specified SSH connection",
-    runsAt = MASTER_OR_SLAVE)
-final class CloseConnection extends SshCommand {
-
-  private static final Logger log = LoggerFactory.getLogger(CloseConnection.class);
-
-  @Inject private SshDaemon sshDaemon;
-
-  @Argument(
-      index = 0,
-      multiValued = true,
-      required = true,
-      metaVar = "SESSION_ID",
-      usage = "List of SSH session IDs to be closed")
-  private final List<String> sessionIds = new ArrayList<>();
-
-  @Option(name = "--wait", usage = "wait for connection to close before exiting")
-  private boolean wait;
-
-  @Override
-  protected void run() throws Failure {
-    IoAcceptor acceptor = sshDaemon.getIoAcceptor();
-    if (acceptor == null) {
-      throw new Failure(1, "fatal: sshd no longer running");
-    }
-    for (String sessionId : sessionIds) {
-      boolean connectionFound = false;
-      int id = (int) Long.parseLong(sessionId, 16);
-      for (IoSession io : acceptor.getManagedSessions().values()) {
-        AbstractSession serverSession = AbstractSession.getSession(io, true);
-        SshSession sshSession =
-            serverSession != null ? serverSession.getAttribute(SshSession.KEY) : null;
-        if (sshSession != null && sshSession.getSessionId() == id) {
-          connectionFound = true;
-          stdout.println("closing connection " + sessionId + "...");
-          CloseFuture future = io.close(true);
-          if (wait) {
-            try {
-              future.await();
-              stdout.println("closed connection " + sessionId);
-            } catch (IOException e) {
-              log.warn("Wait for connection to close interrupted: " + e.getMessage());
-            }
-          }
-          break;
-        }
-      }
-      if (!connectionFound) {
-        stderr.print("close connection " + sessionId + ": no such connection\n");
-      }
-    }
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateAccountCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateAccountCommand.java
deleted file mode 100644
index 93b5695..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateAccountCommand.java
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.sshd.commands;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.collect.Lists;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
-import com.google.gerrit.extensions.api.accounts.AccountInput;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.account.CreateAccount;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
-import java.util.List;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.kohsuke.args4j.Argument;
-import org.kohsuke.args4j.Option;
-
-/** Create a new user account. * */
-@RequiresCapability(GlobalCapability.CREATE_ACCOUNT)
-@CommandMetaData(name = "create-account", description = "Create a new batch/role account")
-final class CreateAccountCommand extends SshCommand {
-  @Option(
-      name = "--group",
-      aliases = {"-g"},
-      metaVar = "GROUP",
-      usage = "groups to add account to")
-  private List<AccountGroup.Id> groups = new ArrayList<>();
-
-  @Option(name = "--full-name", metaVar = "NAME", usage = "display name of the account")
-  private String fullName;
-
-  @Option(name = "--email", metaVar = "EMAIL", usage = "email address of the account")
-  private String email;
-
-  @Option(name = "--ssh-key", metaVar = "-|KEY", usage = "public key for SSH authentication")
-  private String sshKey;
-
-  @Option(
-      name = "--http-password",
-      metaVar = "PASSWORD",
-      usage = "password for HTTP authentication")
-  private String httpPassword;
-
-  @Argument(index = 0, required = true, metaVar = "USERNAME", usage = "name of the user account")
-  private String username;
-
-  @Inject private CreateAccount.Factory createAccountFactory;
-
-  @Override
-  protected void run() throws OrmException, IOException, ConfigInvalidException, UnloggedFailure {
-    AccountInput input = new AccountInput();
-    input.username = username;
-    input.email = email;
-    input.name = fullName;
-    input.sshKey = readSshKey();
-    input.httpPassword = httpPassword;
-    input.groups = Lists.transform(groups, AccountGroup.Id::toString);
-    try {
-      createAccountFactory.create(username).apply(TopLevelResource.INSTANCE, input);
-    } catch (RestApiException e) {
-      throw die(e.getMessage());
-    }
-  }
-
-  private String readSshKey() throws IOException {
-    if (sshKey == null) {
-      return null;
-    }
-    if ("-".equals(sshKey)) {
-      sshKey = "";
-      BufferedReader br = new BufferedReader(new InputStreamReader(in, UTF_8));
-      String line;
-      while ((line = br.readLine()) != null) {
-        sshKey += line + "\n";
-      }
-    }
-    return sshKey;
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateBranchCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateBranchCommand.java
deleted file mode 100644
index 46cfc9a..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateBranchCommand.java
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.sshd.commands;
-
-import com.google.gerrit.extensions.api.GerritApi;
-import com.google.gerrit.extensions.api.projects.BranchInput;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.inject.Inject;
-import org.kohsuke.args4j.Argument;
-
-/** Create a new branch. * */
-@CommandMetaData(name = "create-branch", description = "Create a new branch")
-public final class CreateBranchCommand extends SshCommand {
-
-  @Argument(index = 0, required = true, metaVar = "PROJECT", usage = "name of the project")
-  private ProjectControl project;
-
-  @Argument(index = 1, required = true, metaVar = "NAME", usage = "name of branch to be created")
-  private String name;
-
-  @Argument(
-      index = 2,
-      required = true,
-      metaVar = "REVISION",
-      usage = "base revision of the new branch")
-  private String revision;
-
-  @Inject GerritApi gApi;
-
-  @Override
-  protected void run() throws UnloggedFailure {
-    try {
-      BranchInput in = new BranchInput();
-      in.revision = revision;
-      gApi.projects().name(project.getProject().getNameKey().get()).branch(name).create(in);
-    } catch (RestApiException e) {
-      throw die(e);
-    }
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateGroupCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateGroupCommand.java
deleted file mode 100644
index 1855f41..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateGroupCommand.java
+++ /dev/null
@@ -1,147 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.sshd.commands;
-
-import static java.util.stream.Collectors.toList;
-
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
-import com.google.gerrit.extensions.api.groups.GroupInput;
-import com.google.gerrit.extensions.common.GroupInfo;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.group.AddMembers;
-import com.google.gerrit.server.group.AddSubgroups;
-import com.google.gerrit.server.group.CreateGroup;
-import com.google.gerrit.server.group.GroupResource;
-import com.google.gerrit.server.group.GroupsCollection;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.util.HashSet;
-import java.util.Set;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.kohsuke.args4j.Argument;
-import org.kohsuke.args4j.Option;
-
-/**
- * Creates a new group.
- *
- * <p>Optionally, puts an initial set of user in the newly created group.
- */
-@RequiresCapability(GlobalCapability.CREATE_GROUP)
-@CommandMetaData(name = "create-group", description = "Create a new account group")
-final class CreateGroupCommand extends SshCommand {
-  @Option(
-      name = "--owner",
-      aliases = {"-o"},
-      metaVar = "GROUP",
-      usage = "owning group, if not specified the group will be self-owning")
-  private AccountGroup.Id ownerGroupId;
-
-  @Option(
-      name = "--description",
-      aliases = {"-d"},
-      metaVar = "DESC",
-      usage = "description of group")
-  private String groupDescription = "";
-
-  @Argument(index = 0, required = true, metaVar = "GROUP", usage = "name of group to be created")
-  private String groupName;
-
-  private final Set<Account.Id> initialMembers = new HashSet<>();
-
-  @Option(
-      name = "--member",
-      aliases = {"-m"},
-      metaVar = "USERNAME",
-      usage = "initial set of users to become members of the group")
-  void addMember(Account.Id id) {
-    initialMembers.add(id);
-  }
-
-  @Option(name = "--visible-to-all", usage = "to make the group visible to all registered users")
-  private boolean visibleToAll;
-
-  private final Set<AccountGroup.UUID> initialGroups = new HashSet<>();
-
-  @Option(
-      name = "--group",
-      aliases = "-g",
-      metaVar = "GROUP",
-      usage = "initial set of groups to be included in the group")
-  void addGroup(AccountGroup.UUID id) {
-    initialGroups.add(id);
-  }
-
-  @Inject private CreateGroup.Factory createGroupFactory;
-
-  @Inject private GroupsCollection groups;
-
-  @Inject private AddMembers addMembers;
-
-  @Inject private AddSubgroups addSubgroups;
-
-  @Override
-  protected void run() throws Failure, OrmException, IOException, ConfigInvalidException {
-    try {
-      GroupResource rsrc = createGroup();
-
-      if (!initialMembers.isEmpty()) {
-        addMembers(rsrc);
-      }
-
-      if (!initialGroups.isEmpty()) {
-        addSubgroups(rsrc);
-      }
-    } catch (RestApiException e) {
-      throw die(e);
-    }
-  }
-
-  private GroupResource createGroup()
-      throws RestApiException, OrmException, IOException, ConfigInvalidException {
-    GroupInput input = new GroupInput();
-    input.description = groupDescription;
-    input.visibleToAll = visibleToAll;
-
-    if (ownerGroupId != null) {
-      input.ownerId = String.valueOf(ownerGroupId.get());
-    }
-
-    GroupInfo group = createGroupFactory.create(groupName).apply(TopLevelResource.INSTANCE, input);
-    return groups.parse(TopLevelResource.INSTANCE, IdString.fromUrl(group.id));
-  }
-
-  private void addMembers(GroupResource rsrc)
-      throws RestApiException, OrmException, IOException, ConfigInvalidException {
-    AddMembers.Input input =
-        AddMembers.Input.fromMembers(
-            initialMembers.stream().map(Object::toString).collect(toList()));
-    addMembers.apply(rsrc, input);
-  }
-
-  private void addSubgroups(GroupResource rsrc) throws RestApiException, OrmException, IOException {
-    AddSubgroups.Input input =
-        AddSubgroups.Input.fromGroups(
-            initialGroups.stream().map(AccountGroup.UUID::get).collect(toList()));
-    addSubgroups.apply(rsrc, input);
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateProjectCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateProjectCommand.java
deleted file mode 100644
index 8ccf864..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateProjectCommand.java
+++ /dev/null
@@ -1,240 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.sshd.commands;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Splitter;
-import com.google.common.collect.Lists;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
-import com.google.gerrit.extensions.api.GerritApi;
-import com.google.gerrit.extensions.api.projects.ConfigValue;
-import com.google.gerrit.extensions.api.projects.ProjectInput;
-import com.google.gerrit.extensions.client.InheritableBoolean;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.server.project.SuggestParentCandidates;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.inject.Inject;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.kohsuke.args4j.Argument;
-import org.kohsuke.args4j.Option;
-
-/** Create a new project. * */
-@RequiresCapability(GlobalCapability.CREATE_PROJECT)
-@CommandMetaData(
-    name = "create-project",
-    description = "Create a new project and associated Git repository")
-final class CreateProjectCommand extends SshCommand {
-  @Option(
-      name = "--suggest-parents",
-      aliases = {"-S"},
-      usage =
-          "suggest parent candidates, "
-              + "if this option is used all other options and arguments are ignored")
-  private boolean suggestParent;
-
-  @Option(
-      name = "--owner",
-      aliases = {"-o"},
-      usage = "owner(s) of project")
-  private List<AccountGroup.UUID> ownerIds;
-
-  @Option(
-      name = "--parent",
-      aliases = {"-p"},
-      metaVar = "NAME",
-      usage = "parent project")
-  private ProjectControl newParent;
-
-  @Option(name = "--permissions-only", usage = "create project for use only as parent")
-  private boolean permissionsOnly;
-
-  @Option(
-      name = "--description",
-      aliases = {"-d"},
-      metaVar = "DESCRIPTION",
-      usage = "description of project")
-  private String projectDescription = "";
-
-  @Option(
-      name = "--submit-type",
-      aliases = {"-t"},
-      usage = "project submit type")
-  private SubmitType submitType;
-
-  @Option(name = "--contributor-agreements", usage = "if contributor agreement is required")
-  private InheritableBoolean contributorAgreements = InheritableBoolean.INHERIT;
-
-  @Option(name = "--signed-off-by", usage = "if signed-off-by is required")
-  private InheritableBoolean signedOffBy = InheritableBoolean.INHERIT;
-
-  @Option(name = "--content-merge", usage = "allow automatic conflict resolving within files")
-  private InheritableBoolean contentMerge = InheritableBoolean.INHERIT;
-
-  @Option(name = "--change-id", usage = "if change-id is required")
-  private InheritableBoolean requireChangeID = InheritableBoolean.INHERIT;
-
-  @Option(
-      name = "--new-change-for-all-not-in-target",
-      usage = "if a new change will be created for every commit not in target branch")
-  private InheritableBoolean createNewChangeForAllNotInTarget = InheritableBoolean.INHERIT;
-
-  @Option(
-      name = "--use-contributor-agreements",
-      aliases = {"--ca"},
-      usage = "if contributor agreement is required")
-  void setUseContributorArgreements(@SuppressWarnings("unused") boolean on) {
-    contributorAgreements = InheritableBoolean.TRUE;
-  }
-
-  @Option(
-      name = "--use-signed-off-by",
-      aliases = {"--so"},
-      usage = "if signed-off-by is required")
-  void setUseSignedOffBy(@SuppressWarnings("unused") boolean on) {
-    signedOffBy = InheritableBoolean.TRUE;
-  }
-
-  @Option(name = "--use-content-merge", usage = "allow automatic conflict resolving within files")
-  void setUseContentMerge(@SuppressWarnings("unused") boolean on) {
-    contentMerge = InheritableBoolean.TRUE;
-  }
-
-  @Option(
-      name = "--require-change-id",
-      aliases = {"--id"},
-      usage = "if change-id is required")
-  void setRequireChangeId(@SuppressWarnings("unused") boolean on) {
-    requireChangeID = InheritableBoolean.TRUE;
-  }
-
-  @Option(
-      name = "--create-new-change-for-all-not-in-target",
-      aliases = {"--ncfa"},
-      usage = "if a new change will be created for every commit not in target branch")
-  void setNewChangeForAllNotInTarget(@SuppressWarnings("unused") boolean on) {
-    createNewChangeForAllNotInTarget = InheritableBoolean.TRUE;
-  }
-
-  @Option(
-      name = "--branch",
-      aliases = {"-b"},
-      metaVar = "BRANCH",
-      usage = "initial branch name\n(default: master)")
-  private List<String> branch;
-
-  @Option(name = "--empty-commit", usage = "to create initial empty commit")
-  private boolean createEmptyCommit;
-
-  @Option(name = "--max-object-size-limit", usage = "max Git object size for this project")
-  private String maxObjectSizeLimit;
-
-  @Option(
-      name = "--plugin-config",
-      usage = "plugin configuration parameter with format '<plugin-name>.<parameter-name>=<value>'")
-  private List<String> pluginConfigValues;
-
-  @Argument(index = 0, metaVar = "NAME", usage = "name of project to be created")
-  private String projectName;
-
-  @Inject private GerritApi gApi;
-
-  @Inject private SuggestParentCandidates suggestParentCandidates;
-
-  @Override
-  protected void run() throws Failure {
-    try {
-      if (!suggestParent) {
-        if (projectName == null) {
-          throw die("Project name is required.");
-        }
-
-        ProjectInput input = new ProjectInput();
-        input.name = projectName;
-        if (ownerIds != null) {
-          input.owners = Lists.transform(ownerIds, AccountGroup.UUID::get);
-        }
-        if (newParent != null) {
-          input.parent = newParent.getProject().getName();
-        }
-        input.permissionsOnly = permissionsOnly;
-        input.description = projectDescription;
-        input.submitType = submitType;
-        input.useContributorAgreements = contributorAgreements;
-        input.useSignedOffBy = signedOffBy;
-        input.useContentMerge = contentMerge;
-        input.requireChangeId = requireChangeID;
-        input.createNewChangeForAllNotInTarget = createNewChangeForAllNotInTarget;
-        input.branches = branch;
-        input.createEmptyCommit = createEmptyCommit;
-        input.maxObjectSizeLimit = maxObjectSizeLimit;
-        if (pluginConfigValues != null) {
-          input.pluginConfigValues = parsePluginConfigValues(pluginConfigValues);
-        }
-
-        gApi.projects().create(input);
-      } else {
-        for (Project.NameKey parent : suggestParentCandidates.getNameKeys()) {
-          stdout.print(parent.get() + '\n');
-        }
-      }
-    } catch (RestApiException err) {
-      throw die(err);
-    } catch (PermissionBackendException err) {
-      throw new Failure(1, "permissions unavailable", err);
-    }
-  }
-
-  @VisibleForTesting
-  Map<String, Map<String, ConfigValue>> parsePluginConfigValues(List<String> pluginConfigValues)
-      throws UnloggedFailure {
-    Map<String, Map<String, ConfigValue>> m = new HashMap<>();
-    for (String pluginConfigValue : pluginConfigValues) {
-      String[] s = pluginConfigValue.split("=");
-      String[] s2 = s[0].split("\\.");
-      if (s.length != 2 || s2.length != 2) {
-        throw die(
-            "Invalid plugin config value '"
-                + pluginConfigValue
-                + "', expected format '<plugin-name>.<parameter-name>=<value>'"
-                + " or '<plugin-name>.<parameter-name>=<value1,value2,...>'");
-      }
-      ConfigValue value = new ConfigValue();
-      String v = s[1];
-      if (v.contains(",")) {
-        value.values = Lists.newArrayList(Splitter.on(",").split(v));
-      } else {
-        value.value = v;
-      }
-      String pluginName = s2[0];
-      String paramName = s2[1];
-      Map<String, ConfigValue> l = m.get(pluginName);
-      if (l == null) {
-        l = new HashMap<>();
-        m.put(pluginName, l);
-      }
-      l.put(paramName, value);
-    }
-    return m;
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/DefaultCommandModule.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/DefaultCommandModule.java
deleted file mode 100644
index ba99155..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/DefaultCommandModule.java
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.sshd.commands;
-
-import com.google.gerrit.reviewdb.client.CoreDownloadSchemes;
-import com.google.gerrit.server.config.DownloadConfig;
-import com.google.gerrit.sshd.CommandModule;
-import com.google.gerrit.sshd.CommandName;
-import com.google.gerrit.sshd.Commands;
-import com.google.gerrit.sshd.DispatchCommandProvider;
-import com.google.gerrit.sshd.SuExec;
-import com.google.gerrit.sshd.plugin.LfsPluginAuthCommand;
-
-/** Register the commands a Gerrit server supports. */
-public class DefaultCommandModule extends CommandModule {
-  private final DownloadConfig downloadConfig;
-  private final LfsPluginAuthCommand.Module lfsPluginAuthModule;
-
-  public DefaultCommandModule(
-      boolean slave, DownloadConfig downloadCfg, LfsPluginAuthCommand.Module module) {
-    slaveMode = slave;
-    downloadConfig = downloadCfg;
-    lfsPluginAuthModule = module;
-  }
-
-  @Override
-  protected void configure() {
-    CommandName git = Commands.named("git");
-    CommandName gerrit = Commands.named("gerrit");
-    CommandName logging = Commands.named(gerrit, "logging");
-    CommandName plugin = Commands.named(gerrit, "plugin");
-    CommandName testSubmit = Commands.named(gerrit, "test-submit");
-
-    command(gerrit).toProvider(new DispatchCommandProvider(gerrit));
-    command(gerrit, AproposCommand.class);
-    command(gerrit, BanCommitCommand.class);
-    command(gerrit, CloseConnection.class);
-    command(gerrit, FlushCaches.class);
-    command(gerrit, ListProjectsCommand.class);
-    command(gerrit, ListMembersCommand.class);
-    command(gerrit, ListGroupsCommand.class);
-    command(gerrit, LsUserRefs.class);
-    command(gerrit, Query.class);
-    command(gerrit, ShowCaches.class);
-    command(gerrit, ShowConnections.class);
-    command(gerrit, ShowQueue.class);
-    command(gerrit, StreamEvents.class);
-    command(gerrit, VersionCommand.class);
-    command(gerrit, GarbageCollectionCommand.class);
-
-    command(gerrit, "plugin").toProvider(new DispatchCommandProvider(plugin));
-    command(plugin, PluginLsCommand.class);
-    command(plugin, PluginEnableCommand.class);
-    command(plugin, PluginInstallCommand.class);
-    command(plugin, PluginReloadCommand.class);
-    command(plugin, PluginRemoveCommand.class);
-    alias(plugin, "add", PluginInstallCommand.class);
-    alias(plugin, "rm", PluginRemoveCommand.class);
-
-    command(git).toProvider(new DispatchCommandProvider(git));
-
-    command("ps").to(ShowQueue.class);
-    command("kill").to(KillCommand.class);
-    command("scp").to(ScpCommand.class);
-
-    // Honor the legacy hyphenated forms as aliases for the non-hyphenated forms
-    if (sshEnabled()) {
-      command("git-upload-pack").to(Commands.key(git, "upload-pack"));
-      command(git, "upload-pack").to(Upload.class);
-      command("git-upload-archive").to(Commands.key(git, "upload-archive"));
-      command(git, "upload-archive").to(UploadArchive.class);
-    }
-    command("suexec").to(SuExec.class);
-    listener().to(ShowCaches.StartupListener.class);
-
-    command(gerrit, CreateAccountCommand.class);
-    command(gerrit, CreateGroupCommand.class);
-    command(gerrit, CreateProjectCommand.class);
-    command(gerrit, SetHeadCommand.class);
-    command(gerrit, AdminQueryShell.class);
-
-    if (slaveMode) {
-      command("git-receive-pack").to(NotSupportedInSlaveModeFailureCommand.class);
-      command("gerrit-receive-pack").to(NotSupportedInSlaveModeFailureCommand.class);
-      command(git, "receive-pack").to(NotSupportedInSlaveModeFailureCommand.class);
-    } else {
-      if (sshEnabled()) {
-        command("git-receive-pack").to(Commands.key(git, "receive-pack"));
-        command("gerrit-receive-pack").to(Commands.key(git, "receive-pack"));
-        command(git, "receive-pack").to(Commands.key(gerrit, "receive-pack"));
-      }
-      command(gerrit, "test-submit").toProvider(new DispatchCommandProvider(testSubmit));
-    }
-    command(gerrit, Receive.class);
-
-    command(gerrit, RenameGroupCommand.class);
-    command(gerrit, ReviewCommand.class);
-    command(gerrit, SetProjectCommand.class);
-    command(gerrit, SetReviewersCommand.class);
-
-    command(gerrit, SetMembersCommand.class);
-    command(gerrit, CreateBranchCommand.class);
-    command(gerrit, SetAccountCommand.class);
-    command(gerrit, AdminSetParent.class);
-
-    command(testSubmit, TestSubmitRuleCommand.class);
-    command(testSubmit, TestSubmitTypeCommand.class);
-
-    command(logging).toProvider(new DispatchCommandProvider(logging));
-    command(logging, SetLoggingLevelCommand.class);
-    command(logging, ListLoggingLevelCommand.class);
-    alias(logging, "ls", ListLoggingLevelCommand.class);
-    alias(logging, "set", SetLoggingLevelCommand.class);
-
-    install(lfsPluginAuthModule);
-  }
-
-  private boolean sshEnabled() {
-    return downloadConfig.getDownloadSchemes().contains(CoreDownloadSchemes.SSH);
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/FlushCaches.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/FlushCaches.java
deleted file mode 100644
index d9c892d..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/FlushCaches.java
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.sshd.commands;
-
-import static com.google.gerrit.common.data.GlobalCapability.FLUSH_CACHES;
-import static com.google.gerrit.common.data.GlobalCapability.MAINTAIN_SERVER;
-import static com.google.gerrit.server.config.PostCaches.Operation.FLUSH;
-import static com.google.gerrit.server.config.PostCaches.Operation.FLUSH_ALL;
-import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;
-
-import com.google.gerrit.extensions.annotations.RequiresAnyCapability;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.server.config.ConfigResource;
-import com.google.gerrit.server.config.ListCaches;
-import com.google.gerrit.server.config.ListCaches.OutputFormat;
-import com.google.gerrit.server.config.PostCaches;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.inject.Inject;
-import java.util.ArrayList;
-import java.util.List;
-import org.kohsuke.args4j.Option;
-
-/** Causes the caches to purge all entries and reload. */
-@RequiresAnyCapability({FLUSH_CACHES, MAINTAIN_SERVER})
-@CommandMetaData(
-    name = "flush-caches",
-    description = "Flush some/all server caches from memory",
-    runsAt = MASTER_OR_SLAVE)
-final class FlushCaches extends SshCommand {
-  @Option(name = "--cache", usage = "flush named cache", metaVar = "NAME")
-  private List<String> caches = new ArrayList<>();
-
-  @Option(name = "--all", usage = "flush all caches")
-  private boolean all;
-
-  @Option(name = "--list", usage = "list available caches")
-  private boolean list;
-
-  @Inject private ListCaches listCaches;
-
-  @Inject private PostCaches postCaches;
-
-  @Override
-  protected void run() throws Failure {
-    try {
-      if (list) {
-        if (all || caches.size() > 0) {
-          throw die("cannot use --list with --all or --cache");
-        }
-        doList();
-        return;
-      }
-
-      if (all && caches.size() > 0) {
-        throw die("cannot combine --all and --cache");
-      } else if (!all && caches.size() == 1 && caches.contains("all")) {
-        caches.clear();
-        all = true;
-      } else if (!all && caches.isEmpty()) {
-        all = true;
-      }
-
-      if (all) {
-        postCaches.apply(new ConfigResource(), new PostCaches.Input(FLUSH_ALL));
-      } else {
-        postCaches.apply(new ConfigResource(), new PostCaches.Input(FLUSH, caches));
-      }
-    } catch (RestApiException e) {
-      throw die(e.getMessage());
-    } catch (PermissionBackendException e) {
-      throw new Failure(1, "unavailable", e);
-    }
-  }
-
-  @SuppressWarnings("unchecked")
-  private void doList() {
-    for (String name :
-        (List<String>) listCaches.setFormat(OutputFormat.LIST).apply(new ConfigResource())) {
-      stderr.print(name);
-      stderr.print('\n');
-    }
-    stderr.flush();
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/GarbageCollectionCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/GarbageCollectionCommand.java
deleted file mode 100644
index c4b4d60..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/GarbageCollectionCommand.java
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.sshd.commands;
-
-import static com.google.gerrit.common.data.GlobalCapability.MAINTAIN_SERVER;
-import static com.google.gerrit.common.data.GlobalCapability.RUN_GC;
-import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;
-
-import com.google.common.collect.Lists;
-import com.google.gerrit.common.data.GarbageCollectionResult;
-import com.google.gerrit.extensions.annotations.RequiresAnyCapability;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.git.GarbageCollection;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.inject.Inject;
-import java.util.ArrayList;
-import java.util.List;
-import org.kohsuke.args4j.Argument;
-import org.kohsuke.args4j.Option;
-
-/** Runs the Git garbage collection. */
-@RequiresAnyCapability({RUN_GC, MAINTAIN_SERVER})
-@CommandMetaData(name = "gc", description = "Run Git garbage collection", runsAt = MASTER_OR_SLAVE)
-public class GarbageCollectionCommand extends SshCommand {
-
-  @Option(name = "--all", usage = "runs the Git garbage collection for all projects")
-  private boolean all;
-
-  @Option(name = "--show-progress", usage = "progress information is shown")
-  private boolean showProgress;
-
-  @Option(name = "--aggressive", usage = "run aggressive garbage collection")
-  private boolean aggressive;
-
-  @Argument(
-      index = 0,
-      required = false,
-      multiValued = true,
-      metaVar = "NAME",
-      usage = "projects for which the Git garbage collection should be run")
-  private List<ProjectControl> projects = new ArrayList<>();
-
-  @Inject private ProjectCache projectCache;
-
-  @Inject private GarbageCollection.Factory garbageCollectionFactory;
-
-  @Override
-  public void run() throws Exception {
-    verifyCommandLine();
-    runGC();
-  }
-
-  private void verifyCommandLine() throws UnloggedFailure {
-    if (!all && projects.isEmpty()) {
-      throw die("needs projects as command arguments or --all option");
-    }
-    if (all && !projects.isEmpty()) {
-      throw die("either specify projects as command arguments or use --all option");
-    }
-  }
-
-  private void runGC() {
-    List<Project.NameKey> projectNames;
-    if (all) {
-      projectNames = Lists.newArrayList(projectCache.all());
-    } else {
-      projectNames = Lists.newArrayListWithCapacity(projects.size());
-      for (ProjectControl pc : projects) {
-        projectNames.add(pc.getProject().getNameKey());
-      }
-    }
-
-    GarbageCollectionResult result =
-        garbageCollectionFactory
-            .create()
-            .run(projectNames, aggressive, showProgress ? stdout : null);
-    if (result.hasErrors()) {
-      for (GarbageCollectionResult.Error e : result.getErrors()) {
-        String msg;
-        switch (e.getType()) {
-          case REPOSITORY_NOT_FOUND:
-            msg = "error: project \"" + e.getProjectName() + "\" not found";
-            break;
-          case GC_ALREADY_SCHEDULED:
-            msg =
-                "error: garbage collection for project \""
-                    + e.getProjectName()
-                    + "\" was already scheduled";
-            break;
-          case GC_FAILED:
-            msg = "error: garbage collection for project \"" + e.getProjectName() + "\" failed";
-            break;
-          default:
-            msg =
-                "error: garbage collection for project \""
-                    + e.getProjectName()
-                    + "\" failed: "
-                    + e.getType();
-        }
-        stdout.print(msg + "\n");
-      }
-    }
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/IndexChangesCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/IndexChangesCommand.java
deleted file mode 100644
index b624ee1..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/IndexChangesCommand.java
+++ /dev/null
@@ -1,68 +0,0 @@
-// 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.
-
-package com.google.gerrit.sshd.commands;
-
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.server.change.ChangeResource;
-import com.google.gerrit.server.change.Index;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.sshd.ChangeArgumentParser;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import org.kohsuke.args4j.Argument;
-
-@CommandMetaData(name = "changes", description = "Index changes")
-final class IndexChangesCommand extends SshCommand {
-  @Inject private Index index;
-
-  @Inject private ChangeArgumentParser changeArgumentParser;
-
-  @Argument(
-      index = 0,
-      required = true,
-      multiValued = true,
-      metaVar = "CHANGE",
-      usage = "changes to index")
-  void addChange(String token) {
-    try {
-      changeArgumentParser.addChange(token, changes, null, false);
-    } catch (UnloggedFailure | OrmException | PermissionBackendException e) {
-      writeError("warning", e.getMessage());
-    }
-  }
-
-  private Map<Change.Id, ChangeResource> changes = new LinkedHashMap<>();
-
-  @Override
-  protected void run() throws UnloggedFailure {
-    boolean ok = true;
-    for (ChangeResource rsrc : changes.values()) {
-      try {
-        index.apply(rsrc, new Index.Input());
-      } catch (Exception e) {
-        ok = false;
-        writeError(
-            "error", String.format("failed to index change %s: %s", rsrc.getId(), e.getMessage()));
-      }
-    }
-    if (!ok) {
-      throw die("failed to index one or more changes");
-    }
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/IndexCommandsModule.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/IndexCommandsModule.java
deleted file mode 100644
index 599c9dc..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/IndexCommandsModule.java
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.sshd.commands;
-
-import com.google.gerrit.server.index.VersionManager;
-import com.google.gerrit.sshd.CommandModule;
-import com.google.gerrit.sshd.CommandName;
-import com.google.gerrit.sshd.Commands;
-import com.google.gerrit.sshd.DispatchCommandProvider;
-import com.google.inject.Injector;
-import com.google.inject.Key;
-
-public class IndexCommandsModule extends CommandModule {
-
-  private final Injector injector;
-
-  public IndexCommandsModule(Injector injector) {
-    this.injector = injector;
-  }
-
-  @Override
-  protected void configure() {
-    CommandName gerrit = Commands.named("gerrit");
-    CommandName index = Commands.named(gerrit, "index");
-    command(index).toProvider(new DispatchCommandProvider(index));
-    if (injector.getExistingBinding(Key.get(VersionManager.class)) != null) {
-      command(index, IndexActivateCommand.class);
-      command(index, IndexStartCommand.class);
-    }
-    command(index, IndexChangesCommand.class);
-    command(index, IndexProjectCommand.class);
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/IndexProjectCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/IndexProjectCommand.java
deleted file mode 100644
index 9c8c01c..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/IndexProjectCommand.java
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.sshd.commands;
-
-import static com.google.gerrit.common.data.GlobalCapability.MAINTAIN_SERVER;
-
-import com.google.gerrit.extensions.annotations.RequiresAnyCapability;
-import com.google.gerrit.server.project.Index;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.server.project.ProjectResource;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.inject.Inject;
-import java.util.ArrayList;
-import java.util.List;
-import org.kohsuke.args4j.Argument;
-
-@RequiresAnyCapability({MAINTAIN_SERVER})
-@CommandMetaData(name = "project", description = "Index changes of a project")
-final class IndexProjectCommand extends SshCommand {
-
-  @Inject private Index index;
-
-  @Argument(
-      index = 0,
-      required = true,
-      multiValued = true,
-      metaVar = "PROJECT",
-      usage = "projects for which the changes should be indexed")
-  private List<ProjectControl> projects = new ArrayList<>();
-
-  @Override
-  protected void run() throws UnloggedFailure, Failure, Exception {
-    if (projects.isEmpty()) {
-      throw die("needs at least one project as command arguments");
-    }
-    projects.stream().forEach(this::index);
-  }
-
-  private void index(ProjectControl projectControl) {
-    try {
-      index.apply(new ProjectResource(projectControl), null);
-    } catch (Exception e) {
-      writeError(
-          "error",
-          String.format(
-              "Unable to index %s: %s", projectControl.getProject().getName(), e.getMessage()));
-    }
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/KillCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/KillCommand.java
deleted file mode 100644
index 3465a9c..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/KillCommand.java
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.sshd.commands;
-
-import static com.google.gerrit.common.data.GlobalCapability.KILL_TASK;
-import static com.google.gerrit.common.data.GlobalCapability.MAINTAIN_SERVER;
-
-import com.google.gerrit.extensions.annotations.RequiresAnyCapability;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.server.config.ConfigResource;
-import com.google.gerrit.server.config.DeleteTask;
-import com.google.gerrit.server.config.TaskResource;
-import com.google.gerrit.server.config.TasksCollection;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.sshd.AdminHighPriorityCommand;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.inject.Inject;
-import java.util.ArrayList;
-import java.util.List;
-import org.kohsuke.args4j.Argument;
-
-/** Kill a task in the work queue. */
-@AdminHighPriorityCommand
-@RequiresAnyCapability({KILL_TASK, MAINTAIN_SERVER})
-final class KillCommand extends SshCommand {
-  @Inject private TasksCollection tasksCollection;
-
-  @Inject private DeleteTask deleteTask;
-
-  @Argument(index = 0, multiValued = true, required = true, metaVar = "ID")
-  private final List<String> taskIds = new ArrayList<>();
-
-  @Override
-  protected void run() {
-    ConfigResource cfgRsrc = new ConfigResource();
-    for (String id : taskIds) {
-      try {
-        TaskResource taskRsrc = tasksCollection.parse(cfgRsrc, IdString.fromDecoded(id));
-        deleteTask.apply(taskRsrc, null);
-      } catch (AuthException | ResourceNotFoundException | PermissionBackendException e) {
-        stderr.print("kill: " + id + ": No such task\n");
-      }
-    }
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListGroupsCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListGroupsCommand.java
deleted file mode 100644
index 59bfa06..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListGroupsCommand.java
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.sshd.commands;
-
-import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Strings;
-import com.google.gerrit.extensions.common.GroupInfo;
-import com.google.gerrit.extensions.restapi.Url;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.account.GroupCache;
-import com.google.gerrit.server.group.InternalGroup;
-import com.google.gerrit.server.group.ListGroups;
-import com.google.gerrit.server.ioutil.ColumnFormatter;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.gerrit.util.cli.Options;
-import com.google.inject.Inject;
-import java.util.Optional;
-import org.kohsuke.args4j.Option;
-
-@CommandMetaData(
-    name = "ls-groups",
-    description = "List groups visible to the caller",
-    runsAt = MASTER_OR_SLAVE)
-public class ListGroupsCommand extends SshCommand {
-  @Inject private GroupCache groupCache;
-
-  @Inject @Options public ListGroups listGroups;
-
-  @Option(
-      name = "--verbose",
-      aliases = {"-v"},
-      usage =
-          "verbose output format with tab-separated columns for the "
-              + "group name, UUID, description, owner group name, "
-              + "owner group UUID, and whether the group is visible to all")
-  private boolean verboseOutput;
-
-  @Override
-  public void run() throws Exception {
-    if (listGroups.getUser() != null && !listGroups.getProjects().isEmpty()) {
-      throw die("--user and --project options are not compatible.");
-    }
-
-    ColumnFormatter formatter = new ColumnFormatter(stdout, '\t');
-    for (GroupInfo info : listGroups.get()) {
-      formatter.addColumn(MoreObjects.firstNonNull(info.name, "n/a"));
-      if (verboseOutput) {
-        Optional<InternalGroup> group =
-            info.ownerId != null
-                ? groupCache.get(new AccountGroup.UUID(Url.decode(info.ownerId)))
-                : Optional.empty();
-
-        formatter.addColumn(Url.decode(info.id));
-        formatter.addColumn(Strings.nullToEmpty(info.description));
-        formatter.addColumn(group.map(InternalGroup::getName).orElse("n/a"));
-        formatter.addColumn(group.map(g -> g.getGroupUUID().get()).orElse(""));
-        formatter.addColumn(
-            Boolean.toString(MoreObjects.firstNonNull(info.options.visibleToAll, Boolean.FALSE)));
-      }
-      formatter.nextLine();
-    }
-    formatter.finish();
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListMembersCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListMembersCommand.java
deleted file mode 100644
index 568c431b..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListMembersCommand.java
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.sshd.commands;
-
-import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Strings;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.account.AccountLoader;
-import com.google.gerrit.server.account.GroupCache;
-import com.google.gerrit.server.account.GroupControl;
-import com.google.gerrit.server.group.InternalGroup;
-import com.google.gerrit.server.group.ListMembers;
-import com.google.gerrit.server.ioutil.ColumnFormatter;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.io.PrintWriter;
-import java.util.List;
-import java.util.Optional;
-import org.kohsuke.args4j.Argument;
-
-/** Implements a command that allows the user to see the members of a group. */
-@CommandMetaData(
-    name = "ls-members",
-    description = "List the members of a given group",
-    runsAt = MASTER_OR_SLAVE)
-public class ListMembersCommand extends SshCommand {
-  @Inject ListMembersCommandImpl impl;
-
-  @Override
-  public void run() throws Exception {
-    impl.display(stdout);
-  }
-
-  @Override
-  protected void parseCommandLine() throws UnloggedFailure {
-    parseCommandLine(impl);
-  }
-
-  private static class ListMembersCommandImpl extends ListMembers {
-    @Argument(required = true, usage = "the name of the group", metaVar = "GROUPNAME")
-    private String name;
-
-    private final GroupCache groupCache;
-
-    @Inject
-    protected ListMembersCommandImpl(
-        GroupCache groupCache,
-        GroupControl.Factory groupControlFactory,
-        AccountLoader.Factory accountLoaderFactory) {
-      super(groupCache, groupControlFactory, accountLoaderFactory);
-      this.groupCache = groupCache;
-    }
-
-    void display(PrintWriter writer) throws OrmException {
-      Optional<InternalGroup> group = groupCache.get(new AccountGroup.NameKey(name));
-      String errorText = "Group not found or not visible\n";
-
-      if (!group.isPresent()) {
-        writer.write(errorText);
-        writer.flush();
-        return;
-      }
-
-      List<AccountInfo> members = apply(group.get().getGroupUUID());
-      ColumnFormatter formatter = new ColumnFormatter(writer, '\t');
-      formatter.addColumn("id");
-      formatter.addColumn("username");
-      formatter.addColumn("full name");
-      formatter.addColumn("email");
-      formatter.nextLine();
-      for (AccountInfo member : members) {
-        if (member == null) {
-          continue;
-        }
-
-        formatter.addColumn(Integer.toString(member._accountId));
-        formatter.addColumn(MoreObjects.firstNonNull(member.username, "n/a"));
-        formatter.addColumn(MoreObjects.firstNonNull(Strings.emptyToNull(member.name), "n/a"));
-        formatter.addColumn(MoreObjects.firstNonNull(member.email, "n/a"));
-        formatter.nextLine();
-      }
-
-      formatter.finish();
-    }
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListProjectsCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListProjectsCommand.java
deleted file mode 100644
index db0929e..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListProjectsCommand.java
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.sshd.commands;
-
-import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;
-
-import com.google.gerrit.server.project.ListProjects;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.gerrit.util.cli.Options;
-import com.google.inject.Inject;
-import java.util.List;
-
-@CommandMetaData(
-    name = "ls-projects",
-    description = "List projects visible to the caller",
-    runsAt = MASTER_OR_SLAVE)
-public class ListProjectsCommand extends SshCommand {
-  @Inject @Options public ListProjects impl;
-
-  @Override
-  public void run() throws Exception {
-    if (!impl.getFormat().isJson()) {
-      List<String> showBranch = impl.getShowBranch();
-      if (impl.isShowTree() && (showBranch != null) && !showBranch.isEmpty()) {
-        throw die("--tree and --show-branch options are not compatible.");
-      }
-      if (impl.isShowTree() && impl.isShowDescription()) {
-        throw die("--tree and --description options are not compatible.");
-      }
-    }
-    impl.display(out);
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/LsUserRefs.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/LsUserRefs.java
deleted file mode 100644
index 8927850..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/LsUserRefs.java
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.sshd.commands;
-
-import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;
-import static org.eclipse.jgit.lib.RefDatabase.ALL;
-
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.server.account.AccountResolver;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.git.VisibleRefFilter;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.server.util.ManualRequestContext;
-import com.google.gerrit.server.util.OneOffRequestContext;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.util.Map;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.Repository;
-import org.kohsuke.args4j.Option;
-
-@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
-@CommandMetaData(
-    name = "ls-user-refs",
-    description = "List refs visible to a specific user",
-    runsAt = MASTER_OR_SLAVE)
-public class LsUserRefs extends SshCommand {
-  @Inject private AccountResolver accountResolver;
-  @Inject private OneOffRequestContext requestContext;
-  @Inject private VisibleRefFilter.Factory refFilterFactory;
-  @Inject private GitRepositoryManager repoManager;
-
-  @Option(
-      name = "--project",
-      aliases = {"-p"},
-      metaVar = "PROJECT",
-      required = true,
-      usage = "project for which the refs should be listed")
-  private ProjectControl projectControl;
-
-  @Option(
-      name = "--user",
-      aliases = {"-u"},
-      metaVar = "USER",
-      required = true,
-      usage = "user for which the groups should be listed")
-  private String userName;
-
-  @Option(name = "--only-refs-heads", usage = "list only refs under refs/heads")
-  private boolean onlyRefsHeads;
-
-  @Override
-  protected void run() throws Failure {
-    Account userAccount;
-    try {
-      userAccount = accountResolver.find(userName);
-    } catch (OrmException | IOException | ConfigInvalidException e) {
-      throw die(e);
-    }
-    if (userAccount == null) {
-      stdout.print("No single user could be found when searching for: " + userName + '\n');
-      stdout.flush();
-      return;
-    }
-
-    Project.NameKey projectName = projectControl.getProject().getNameKey();
-    try (Repository repo = repoManager.openRepository(projectName);
-        ManualRequestContext ctx = requestContext.openAs(userAccount.getId())) {
-      try {
-        Map<String, Ref> refsMap =
-            refFilterFactory
-                .create(projectControl.getProjectState(), repo)
-                .filter(repo.getRefDatabase().getRefs(ALL), false);
-
-        for (String ref : refsMap.keySet()) {
-          if (!onlyRefsHeads || ref.startsWith(RefNames.REFS_HEADS)) {
-            stdout.println(ref);
-          }
-        }
-      } catch (IOException e) {
-        throw new Failure(1, "fatal: Error reading refs: '" + projectName, e);
-      }
-    } catch (RepositoryNotFoundException e) {
-      throw die("'" + projectName + "': not a git archive");
-    } catch (IOException | OrmException e) {
-      throw die("Error opening: '" + projectName);
-    }
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/NotSupportedInSlaveModeFailureCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/NotSupportedInSlaveModeFailureCommand.java
deleted file mode 100644
index 39e6d4a..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/NotSupportedInSlaveModeFailureCommand.java
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.sshd.commands;
-
-import com.google.gerrit.sshd.SshCommand;
-
-/* Failure command, that produces verbose failure message in slave mode */
-public class NotSupportedInSlaveModeFailureCommand extends SshCommand {
-  @Override
-  protected void run() throws UnloggedFailure {
-    throw die(getName() + ": is not supported in slave mode");
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PatchSetParser.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PatchSetParser.java
deleted file mode 100644
index c3613b1..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PatchSetParser.java
+++ /dev/null
@@ -1,165 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.sshd.commands;
-
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RevId;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ChangeFinder;
-import com.google.gerrit.server.PatchSetUtil;
-import com.google.gerrit.server.notedb.ChangeNotes;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.server.query.change.ChangeData;
-import com.google.gerrit.server.query.change.InternalChangeQuery;
-import com.google.gerrit.sshd.BaseCommand.UnloggedFailure;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import java.util.ArrayList;
-import java.util.List;
-
-@Singleton
-public class PatchSetParser {
-  private final Provider<ReviewDb> db;
-  private final Provider<InternalChangeQuery> queryProvider;
-  private final ChangeNotes.Factory notesFactory;
-  private final PatchSetUtil psUtil;
-  private final ChangeFinder changeFinder;
-
-  @Inject
-  PatchSetParser(
-      Provider<ReviewDb> db,
-      Provider<InternalChangeQuery> queryProvider,
-      ChangeNotes.Factory notesFactory,
-      PatchSetUtil psUtil,
-      ChangeFinder changeFinder) {
-    this.db = db;
-    this.queryProvider = queryProvider;
-    this.notesFactory = notesFactory;
-    this.psUtil = psUtil;
-    this.changeFinder = changeFinder;
-  }
-
-  public PatchSet parsePatchSet(String token, ProjectControl projectControl, String branch)
-      throws UnloggedFailure, OrmException {
-    // By commit?
-    //
-    if (token.matches("^([0-9a-fA-F]{4," + RevId.LEN + "})$")) {
-      InternalChangeQuery query = queryProvider.get();
-      List<ChangeData> cds;
-      if (projectControl != null) {
-        Project.NameKey p = projectControl.getProject().getNameKey();
-        if (branch != null) {
-          cds = query.byBranchCommit(p.get(), branch, token);
-        } else {
-          cds = query.byProjectCommit(p, token);
-        }
-      } else {
-        cds = query.byCommit(token);
-      }
-      List<PatchSet> matches = new ArrayList<>(cds.size());
-      for (ChangeData cd : cds) {
-        Change c = cd.change();
-        if (!(inProject(c, projectControl) && inBranch(c, branch))) {
-          continue;
-        }
-        for (PatchSet ps : cd.patchSets()) {
-          if (ps.getRevision().matches(token)) {
-            matches.add(ps);
-          }
-        }
-      }
-
-      switch (matches.size()) {
-        case 1:
-          return matches.iterator().next();
-        case 0:
-          throw error("\"" + token + "\" no such patch set");
-        default:
-          throw error("\"" + token + "\" matches multiple patch sets");
-      }
-    }
-
-    // By older style change,patchset?
-    //
-    if (token.matches("^[1-9][0-9]*,[1-9][0-9]*$")) {
-      PatchSet.Id patchSetId;
-      try {
-        patchSetId = PatchSet.Id.parse(token);
-      } catch (IllegalArgumentException e) {
-        throw error("\"" + token + "\" is not a valid patch set");
-      }
-      ChangeNotes notes = getNotes(projectControl, patchSetId.getParentKey());
-      PatchSet patchSet = psUtil.get(db.get(), notes, patchSetId);
-      if (patchSet == null) {
-        throw error("\"" + token + "\" no such patch set");
-      }
-      if (projectControl != null || branch != null) {
-        Change change = notes.getChange();
-        if (!inProject(change, projectControl)) {
-          throw error(
-              "change "
-                  + change.getId()
-                  + " not in project "
-                  + projectControl.getProject().getName());
-        }
-        if (!inBranch(change, branch)) {
-          throw error("change " + change.getId() + " not in branch " + branch);
-        }
-      }
-      return patchSet;
-    }
-
-    throw error("\"" + token + "\" is not a valid patch set");
-  }
-
-  private ChangeNotes getNotes(@Nullable ProjectControl projectControl, Change.Id changeId)
-      throws OrmException, UnloggedFailure {
-    if (projectControl != null) {
-      return notesFactory.create(db.get(), projectControl.getProject().getNameKey(), changeId);
-    }
-    try {
-      ChangeNotes notes = changeFinder.findOne(changeId);
-      return notesFactory.create(db.get(), notes.getProjectName(), changeId);
-    } catch (NoSuchChangeException e) {
-      throw error("\"" + changeId + "\" no such change");
-    }
-  }
-
-  private static boolean inProject(Change change, ProjectControl projectControl) {
-    if (projectControl == null) {
-      // No --project option, so they want every project.
-      return true;
-    }
-    return projectControl.getProject().getNameKey().equals(change.getProject());
-  }
-
-  private static boolean inBranch(Change change, String branch) {
-    if (branch == null) {
-      // No --branch option, so they want every branch.
-      return true;
-    }
-    return change.getDest().get().equals(branch);
-  }
-
-  public static UnloggedFailure error(String msg) {
-    return new UnloggedFailure(1, msg);
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginEnableCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginEnableCommand.java
deleted file mode 100644
index d7c8f3a..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginEnableCommand.java
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.sshd.commands;
-
-import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;
-
-import com.google.common.collect.Sets;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
-import com.google.gerrit.server.plugins.PluginInstallException;
-import com.google.gerrit.server.plugins.PluginLoader;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.inject.Inject;
-import java.util.List;
-import org.kohsuke.args4j.Argument;
-
-@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
-@CommandMetaData(name = "enable", description = "Enable plugins", runsAt = MASTER_OR_SLAVE)
-final class PluginEnableCommand extends SshCommand {
-  @Argument(index = 0, metaVar = "NAME", required = true, usage = "plugin(s) to enable")
-  List<String> names;
-
-  @Inject private PluginLoader loader;
-
-  @Override
-  protected void run() throws UnloggedFailure {
-    if (!loader.isRemoteAdminEnabled()) {
-      throw die("remote plugin administration is disabled");
-    }
-    if (names != null && !names.isEmpty()) {
-      try {
-        loader.enablePlugins(Sets.newHashSet(names));
-      } catch (PluginInstallException e) {
-        e.printStackTrace(stderr);
-        throw die("plugin failed to enable");
-      }
-    }
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginInstallCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginInstallCommand.java
deleted file mode 100644
index f649c75..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginInstallCommand.java
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.sshd.commands;
-
-import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
-import com.google.gerrit.server.plugins.PluginInstallException;
-import com.google.gerrit.server.plugins.PluginLoader;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.inject.Inject;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.nio.file.Files;
-import org.kohsuke.args4j.Argument;
-import org.kohsuke.args4j.Option;
-
-@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
-@CommandMetaData(name = "install", description = "Install/Add a plugin", runsAt = MASTER_OR_SLAVE)
-final class PluginInstallCommand extends SshCommand {
-  @Option(
-      name = "--name",
-      aliases = {"-n"},
-      usage = "install under name")
-  private String name;
-
-  @Option(name = "-")
-  void useInput(@SuppressWarnings("unused") boolean on) {
-    source = "-";
-  }
-
-  @Argument(index = 0, metaVar = "-|URL", usage = "JAR to load")
-  private String source;
-
-  @Inject private PluginLoader loader;
-
-  @SuppressWarnings("resource")
-  @Override
-  protected void run() throws UnloggedFailure {
-    if (!loader.isRemoteAdminEnabled()) {
-      throw die("remote installation is disabled");
-    }
-    if (Strings.isNullOrEmpty(source)) {
-      throw die("Argument \"-|URL\" is required");
-    }
-    if (Strings.isNullOrEmpty(name) && "-".equalsIgnoreCase(source)) {
-      throw die("--name required when source is stdin");
-    }
-
-    if (Strings.isNullOrEmpty(name)) {
-      int s = source.lastIndexOf('/');
-      if (0 <= s) {
-        name = source.substring(s + 1);
-      } else {
-        name = source;
-      }
-    }
-
-    InputStream data;
-    if ("-".equalsIgnoreCase(source)) {
-      data = in;
-    } else if (new File(source).isFile() && source.equals(new File(source).getAbsolutePath())) {
-      try {
-        data = Files.newInputStream(new File(source).toPath());
-      } catch (IOException e) {
-        throw die("cannot read " + source);
-      }
-    } else {
-      try {
-        data = new URL(source).openStream();
-      } catch (MalformedURLException e) {
-        throw die("invalid url " + source);
-      } catch (IOException e) {
-        throw die("cannot read " + source);
-      }
-    }
-    try {
-      loader.installPluginFromStream(name, data);
-    } catch (IOException e) {
-      throw die("cannot install plugin");
-    } catch (PluginInstallException e) {
-      e.printStackTrace(stderr);
-      String msg = String.format("Plugin failed to install. Cause: %s", e.getMessage());
-      throw die(msg);
-    } finally {
-      try {
-        data.close();
-      } catch (IOException err) {
-        // Ignored
-      }
-    }
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginReloadCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginReloadCommand.java
deleted file mode 100644
index 0f2c912..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginReloadCommand.java
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.sshd.commands;
-
-import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;
-
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
-import com.google.gerrit.server.plugins.InvalidPluginException;
-import com.google.gerrit.server.plugins.PluginInstallException;
-import com.google.gerrit.server.plugins.PluginLoader;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.inject.Inject;
-import java.util.List;
-import org.kohsuke.args4j.Argument;
-
-@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
-@CommandMetaData(name = "reload", description = "Reload/Restart plugins", runsAt = MASTER_OR_SLAVE)
-final class PluginReloadCommand extends SshCommand {
-  @Argument(index = 0, metaVar = "NAME", usage = "plugins to reload/restart")
-  private List<String> names;
-
-  @Inject private PluginLoader loader;
-
-  @Override
-  protected void run() throws UnloggedFailure {
-    if (!loader.isRemoteAdminEnabled()) {
-      throw die("remote plugin administration is disabled");
-    }
-    if (names == null || names.isEmpty()) {
-      loader.rescan();
-    } else {
-      try {
-        loader.reload(names);
-      } catch (InvalidPluginException | PluginInstallException e) {
-        throw die(e.getMessage());
-      }
-    }
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginRemoveCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginRemoveCommand.java
deleted file mode 100644
index 8a38739..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginRemoveCommand.java
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.sshd.commands;
-
-import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;
-
-import com.google.common.collect.Sets;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
-import com.google.gerrit.server.plugins.PluginLoader;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.inject.Inject;
-import java.util.List;
-import org.kohsuke.args4j.Argument;
-
-@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
-@CommandMetaData(name = "remove", description = "Disable plugins", runsAt = MASTER_OR_SLAVE)
-final class PluginRemoveCommand extends SshCommand {
-  @Argument(index = 0, metaVar = "NAME", required = true, usage = "plugin to remove")
-  List<String> names;
-
-  @Inject private PluginLoader loader;
-
-  @Override
-  protected void run() throws UnloggedFailure {
-    if (!loader.isRemoteAdminEnabled()) {
-      throw die("remote plugin administration is disabled");
-    }
-    if (names != null && !names.isEmpty()) {
-      loader.disablePlugins(Sets.newHashSet(names));
-    }
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Query.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Query.java
deleted file mode 100644
index 3fe0396..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Query.java
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.sshd.commands;
-
-import com.google.gerrit.server.query.change.OutputStreamQuery;
-import com.google.gerrit.server.query.change.OutputStreamQuery.OutputFormat;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.inject.Inject;
-import java.util.List;
-import org.kohsuke.args4j.Argument;
-import org.kohsuke.args4j.Option;
-
-@CommandMetaData(name = "query", description = "Query the change database")
-public class Query extends SshCommand {
-  @Inject private OutputStreamQuery processor;
-
-  @Option(name = "--format", metaVar = "FMT", usage = "Output display format")
-  void setFormat(OutputFormat format) {
-    processor.setOutput(out, format);
-  }
-
-  @Option(name = "--current-patch-set", usage = "Include information about current patch set")
-  void setCurrentPatchSet(boolean on) {
-    processor.setIncludeCurrentPatchSet(on);
-  }
-
-  @Option(name = "--patch-sets", usage = "Include information about all patch sets")
-  void setPatchSets(boolean on) {
-    processor.setIncludePatchSets(on);
-  }
-
-  @Option(
-      name = "--all-approvals",
-      usage = "Include information about all patch sets and approvals")
-  void setApprovals(boolean on) {
-    if (on) {
-      processor.setIncludePatchSets(on);
-    }
-    processor.setIncludeApprovals(on);
-  }
-
-  @Option(name = "--comments", usage = "Include patch set and inline comments")
-  void setComments(boolean on) {
-    processor.setIncludeComments(on);
-  }
-
-  @Option(name = "--files", usage = "Include file list on patch sets")
-  void setFiles(boolean on) {
-    processor.setIncludeFiles(on);
-  }
-
-  @Option(name = "--commit-message", usage = "Include the full commit message for a change")
-  void setCommitMessage(boolean on) {
-    processor.setIncludeCommitMessage(on);
-  }
-
-  @Option(name = "--dependencies", usage = "Include depends-on and needed-by information")
-  void setDependencies(boolean on) {
-    processor.setIncludeDependencies(on);
-  }
-
-  @Option(name = "--all-reviewers", usage = "Include all reviewers")
-  void setAllReviewers(boolean on) {
-    processor.setIncludeAllReviewers(on);
-  }
-
-  @Option(name = "--submit-records", usage = "Include submit and label status")
-  void setSubmitRecords(boolean on) {
-    processor.setIncludeSubmitRecords(on);
-  }
-
-  @Option(
-      name = "--start",
-      aliases = {"-S"},
-      usage = "Number of changes to skip")
-  void setStart(int start) {
-    processor.setStart(start);
-  }
-
-  @Argument(
-      index = 0,
-      required = true,
-      multiValued = true,
-      metaVar = "QUERY",
-      usage = "Query to execute")
-  private List<String> query;
-
-  @Override
-  protected void run() throws Exception {
-    processor.query(join(query, " "));
-  }
-
-  @Override
-  protected void parseCommandLine() throws UnloggedFailure {
-    processor.setOutput(out, OutputFormat.TEXT);
-    super.parseCommandLine();
-    if (processor.getIncludeFiles()
-        && !(processor.getIncludePatchSets() || processor.getIncludeCurrentPatchSet())) {
-      throw die("--files option needs --patch-sets or --current-patch-set");
-    }
-  }
-
-  private static String join(List<String> list, String sep) {
-    StringBuilder r = new StringBuilder();
-    for (int i = 0; i < list.size(); i++) {
-      if (i > 0) {
-        r.append(sep);
-      }
-      r.append(list.get(i));
-    }
-    return r.toString();
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/QueryShell.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/QueryShell.java
deleted file mode 100644
index 9651f39..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/QueryShell.java
+++ /dev/null
@@ -1,781 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.sshd.commands;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.common.Version;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.reviewdb.server.ReviewDbUtil;
-import com.google.gerrit.server.schema.ReviewDbFactory;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonObject;
-import com.google.gwtorm.jdbc.JdbcSchema;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.sql.Connection;
-import java.sql.DatabaseMetaData;
-import java.sql.ResultSet;
-import java.sql.ResultSetMetaData;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-/** Simple interactive SQL query tool. */
-public class QueryShell {
-  public interface Factory {
-    QueryShell create(@Assisted InputStream in, @Assisted OutputStream out);
-  }
-
-  public enum OutputFormat {
-    PRETTY,
-    JSON,
-    JSON_SINGLE
-  }
-
-  private final BufferedReader in;
-  private final PrintWriter out;
-  private final SchemaFactory<ReviewDb> dbFactory;
-  private OutputFormat outputFormat = OutputFormat.PRETTY;
-
-  private ReviewDb db;
-  private Connection connection;
-  private Statement statement;
-
-  @Inject
-  QueryShell(
-      @ReviewDbFactory final SchemaFactory<ReviewDb> dbFactory,
-      @Assisted final InputStream in,
-      @Assisted final OutputStream out) {
-    this.dbFactory = dbFactory;
-    this.in = new BufferedReader(new InputStreamReader(in, UTF_8));
-    this.out = new PrintWriter(new OutputStreamWriter(out, UTF_8));
-  }
-
-  public void setOutputFormat(OutputFormat fmt) {
-    outputFormat = fmt;
-  }
-
-  public void run() {
-    try {
-      db = ReviewDbUtil.unwrapDb(dbFactory.open());
-      try {
-        connection = ((JdbcSchema) db).getConnection();
-        connection.setAutoCommit(true);
-
-        statement = connection.createStatement();
-        try {
-          showBanner();
-          readEvalPrintLoop();
-        } finally {
-          statement.close();
-          statement = null;
-        }
-      } finally {
-        db.close();
-        db = null;
-      }
-    } catch (OrmException | SQLException err) {
-      out.println("fatal: Cannot open connection: " + err.getMessage());
-    } finally {
-      out.flush();
-    }
-  }
-
-  public void execute(String query) {
-    try {
-      db = dbFactory.open();
-      try {
-        connection = ((JdbcSchema) db).getConnection();
-        connection.setAutoCommit(true);
-
-        statement = connection.createStatement();
-        try {
-          executeStatement(query);
-        } finally {
-          statement.close();
-          statement = null;
-        }
-      } finally {
-        db.close();
-        db = null;
-      }
-    } catch (OrmException | SQLException err) {
-      out.println("fatal: Cannot open connection: " + err.getMessage());
-    } finally {
-      out.flush();
-    }
-  }
-
-  private void readEvalPrintLoop() {
-    final StringBuilder buffer = new StringBuilder();
-    boolean executed = false;
-    for (; ; ) {
-      if (outputFormat == OutputFormat.PRETTY) {
-        print(buffer.length() == 0 || executed ? "gerrit> " : "     -> ");
-      }
-      String line = readLine();
-      if (line == null) {
-        return;
-      }
-
-      if (line.startsWith("\\")) {
-        // Shell command, check the various cases we recognize
-        //
-        line = line.substring(1);
-        if (line.equals("h") || line.equals("?")) {
-          showHelp();
-
-        } else if (line.equals("q")) {
-          if (outputFormat == OutputFormat.PRETTY) {
-            println("Bye");
-          }
-          return;
-
-        } else if (line.equals("r")) {
-          buffer.setLength(0);
-          executed = false;
-
-        } else if (line.equals("p")) {
-          println(buffer.toString());
-
-        } else if (line.equals("g")) {
-          if (buffer.length() > 0) {
-            executeStatement(buffer.toString());
-            executed = true;
-          }
-
-        } else if (line.equals("d")) {
-          listTables();
-
-        } else if (line.startsWith("d ")) {
-          showTable(line.substring(2).trim());
-
-        } else {
-          final String msg = "'\\" + line + "' not supported";
-          switch (outputFormat) {
-            case JSON_SINGLE:
-            case JSON:
-              {
-                final JsonObject err = new JsonObject();
-                err.addProperty("type", "error");
-                err.addProperty("message", msg);
-                println(err.toString());
-                break;
-              }
-            case PRETTY:
-            default:
-              println("ERROR: " + msg);
-              println("");
-              showHelp();
-              break;
-          }
-        }
-        continue;
-      }
-
-      if (executed) {
-        buffer.setLength(0);
-        executed = false;
-      }
-      if (buffer.length() > 0) {
-        buffer.append('\n');
-      }
-      buffer.append(line);
-
-      if (buffer.length() > 0 && buffer.charAt(buffer.length() - 1) == ';') {
-        executeStatement(buffer.toString());
-        executed = true;
-      }
-    }
-  }
-
-  private void listTables() {
-    final DatabaseMetaData meta;
-    try {
-      meta = connection.getMetaData();
-    } catch (SQLException e) {
-      error(e);
-      return;
-    }
-
-    final String[] types = {"TABLE", "VIEW"};
-    try (ResultSet rs = meta.getTables(null, null, null, types)) {
-      if (outputFormat == OutputFormat.PRETTY) {
-        println("                     List of relations");
-      }
-      showResultSet(
-          rs,
-          false,
-          0,
-          Identity.create(rs, "TABLE_SCHEM"),
-          Identity.create(rs, "TABLE_NAME"),
-          Identity.create(rs, "TABLE_TYPE"));
-    } catch (SQLException e) {
-      error(e);
-    }
-
-    println("");
-  }
-
-  private void showTable(String tableName) {
-    final DatabaseMetaData meta;
-    try {
-      meta = connection.getMetaData();
-
-      if (meta.storesUpperCaseIdentifiers()) {
-        tableName = tableName.toUpperCase();
-      } else if (meta.storesLowerCaseIdentifiers()) {
-        tableName = tableName.toLowerCase();
-      }
-    } catch (SQLException e) {
-      error(e);
-      return;
-    }
-
-    try (ResultSet rs = meta.getColumns(null, null, tableName, null)) {
-      if (!rs.next()) {
-        throw new SQLException("Table " + tableName + " not found");
-      }
-
-      if (outputFormat == OutputFormat.PRETTY) {
-        println("                     Table " + tableName);
-      }
-      showResultSet(
-          rs,
-          true,
-          0,
-          Identity.create(rs, "COLUMN_NAME"),
-          new Function("TYPE") {
-            @Override
-            String apply(ResultSet rs) throws SQLException {
-              String type = rs.getString("TYPE_NAME");
-              switch (rs.getInt("DATA_TYPE")) {
-                case java.sql.Types.CHAR:
-                case java.sql.Types.VARCHAR:
-                  type += "(" + rs.getInt("COLUMN_SIZE") + ")";
-                  break;
-              }
-
-              String def = rs.getString("COLUMN_DEF");
-              if (def != null && !def.isEmpty()) {
-                type += " DEFAULT " + def;
-              }
-
-              int nullable = rs.getInt("NULLABLE");
-              if (nullable == DatabaseMetaData.columnNoNulls) {
-                type += " NOT NULL";
-              }
-              return type;
-            }
-          });
-    } catch (SQLException e) {
-      error(e);
-      return;
-    }
-
-    try (ResultSet rs = meta.getIndexInfo(null, null, tableName, false, true)) {
-      Map<String, IndexInfo> indexes = new TreeMap<>();
-      while (rs.next()) {
-        final String indexName = rs.getString("INDEX_NAME");
-        IndexInfo def = indexes.get(indexName);
-        if (def == null) {
-          def = new IndexInfo();
-          def.name = indexName;
-          indexes.put(indexName, def);
-        }
-
-        if (!rs.getBoolean("NON_UNIQUE")) {
-          def.unique = true;
-        }
-
-        final int pos = rs.getInt("ORDINAL_POSITION");
-        final String col = rs.getString("COLUMN_NAME");
-        String desc = rs.getString("ASC_OR_DESC");
-        if ("D".equals(desc)) {
-          desc = " DESC";
-        } else {
-          desc = "";
-        }
-        def.addColumn(pos, col + desc);
-
-        String filter = rs.getString("FILTER_CONDITION");
-        if (filter != null && !filter.isEmpty()) {
-          def.filter.append(filter);
-        }
-      }
-
-      if (outputFormat == OutputFormat.PRETTY) {
-        println("");
-        println("Indexes on " + tableName + ":");
-        for (IndexInfo def : indexes.values()) {
-          println("  " + def);
-        }
-      }
-    } catch (SQLException e) {
-      error(e);
-      return;
-    }
-
-    println("");
-  }
-
-  private void executeStatement(String sql) {
-    final long start = TimeUtil.nowMs();
-    final boolean hasResultSet;
-    try {
-      hasResultSet = statement.execute(sql);
-    } catch (SQLException e) {
-      error(e);
-      return;
-    }
-
-    try {
-      if (hasResultSet) {
-        try (ResultSet rs = statement.getResultSet()) {
-          showResultSet(rs, false, start);
-        }
-
-      } else {
-        final int updateCount = statement.getUpdateCount();
-        final long ms = TimeUtil.nowMs() - start;
-        switch (outputFormat) {
-          case JSON_SINGLE:
-          case JSON:
-            {
-              final JsonObject tail = new JsonObject();
-              tail.addProperty("type", "update-stats");
-              tail.addProperty("rowCount", updateCount);
-              tail.addProperty("runTimeMilliseconds", ms);
-              println(tail.toString());
-              break;
-            }
-
-          case PRETTY:
-          default:
-            println("UPDATE " + updateCount + "; " + ms + " ms");
-            break;
-        }
-      }
-    } catch (SQLException e) {
-      error(e);
-    }
-  }
-
-  /**
-   * Outputs a result set to stdout.
-   *
-   * @param rs ResultSet to show.
-   * @param alreadyOnRow true if rs is already on the first row. false otherwise.
-   * @param start Timestamp in milliseconds when executing the statement started. This timestamp is
-   *     used to compute statistics about the statement. If no statistics should be shown, set it to
-   *     0.
-   * @param show Functions to map columns
-   * @throws SQLException
-   */
-  private void showResultSet(ResultSet rs, boolean alreadyOnRow, long start, Function... show)
-      throws SQLException {
-    switch (outputFormat) {
-      case JSON_SINGLE:
-      case JSON:
-        showResultSetJson(rs, alreadyOnRow, start, show);
-        break;
-      case PRETTY:
-      default:
-        showResultSetPretty(rs, alreadyOnRow, start, show);
-        break;
-    }
-  }
-
-  /**
-   * Outputs a result set to stdout in Json format.
-   *
-   * @param rs ResultSet to show.
-   * @param alreadyOnRow true if rs is already on the first row. false otherwise.
-   * @param start Timestamp in milliseconds when executing the statement started. This timestamp is
-   *     used to compute statistics about the statement. If no statistics should be shown, set it to
-   *     0.
-   * @param show Functions to map columns
-   * @throws SQLException
-   */
-  private void showResultSetJson(
-      final ResultSet rs, boolean alreadyOnRow, long start, Function... show) throws SQLException {
-    JsonArray collector = new JsonArray();
-    final ResultSetMetaData meta = rs.getMetaData();
-    final Function[] columnMap;
-    if (show != null && 0 < show.length) {
-      columnMap = show;
-
-    } else {
-      final int colCnt = meta.getColumnCount();
-      columnMap = new Function[colCnt];
-      for (int colId = 0; colId < colCnt; colId++) {
-        final int p = colId + 1;
-        final String name = meta.getColumnLabel(p);
-        columnMap[colId] = new Identity(p, name);
-      }
-    }
-
-    int rowCnt = 0;
-    while (alreadyOnRow || rs.next()) {
-      final JsonObject row = new JsonObject();
-      final JsonObject cols = new JsonObject();
-      for (Function function : columnMap) {
-        String v = function.apply(rs);
-        if (v == null) {
-          continue;
-        }
-        cols.addProperty(function.name.toLowerCase(), v);
-      }
-      row.addProperty("type", "row");
-      row.add("columns", cols);
-      switch (outputFormat) {
-        case JSON:
-          println(row.toString());
-          break;
-        case JSON_SINGLE:
-          collector.add(row);
-          break;
-        case PRETTY:
-        default:
-          final JsonObject obj = new JsonObject();
-          obj.addProperty("type", "error");
-          obj.addProperty("message", "Unsupported Json variant");
-          println(obj.toString());
-          return;
-      }
-      alreadyOnRow = false;
-      rowCnt++;
-    }
-
-    JsonObject tail = null;
-    if (start != 0) {
-      tail = new JsonObject();
-      tail.addProperty("type", "query-stats");
-      tail.addProperty("rowCount", rowCnt);
-      final long ms = TimeUtil.nowMs() - start;
-      tail.addProperty("runTimeMilliseconds", ms);
-    }
-
-    switch (outputFormat) {
-      case JSON:
-        if (tail != null) {
-          println(tail.toString());
-        }
-        break;
-      case JSON_SINGLE:
-        if (tail != null) {
-          collector.add(tail);
-        }
-        println(collector.toString());
-        break;
-      case PRETTY:
-      default:
-        final JsonObject obj = new JsonObject();
-        obj.addProperty("type", "error");
-        obj.addProperty("message", "Unsupported Json variant");
-        println(obj.toString());
-    }
-  }
-
-  /**
-   * Outputs a result set to stdout in plain text format.
-   *
-   * @param rs ResultSet to show.
-   * @param alreadyOnRow true if rs is already on the first row. false otherwise.
-   * @param start Timestamp in milliseconds when executing the statement started. This timestamp is
-   *     used to compute statistics about the statement. If no statistics should be shown, set it to
-   *     0.
-   * @param show Functions to map columns
-   * @throws SQLException
-   */
-  private void showResultSetPretty(
-      final ResultSet rs, boolean alreadyOnRow, long start, Function... show) throws SQLException {
-    final ResultSetMetaData meta = rs.getMetaData();
-
-    final Function[] columnMap;
-    if (show != null && 0 < show.length) {
-      columnMap = show;
-
-    } else {
-      final int colCnt = meta.getColumnCount();
-      columnMap = new Function[colCnt];
-      for (int colId = 0; colId < colCnt; colId++) {
-        final int p = colId + 1;
-        final String name = meta.getColumnLabel(p);
-        columnMap[colId] = new Identity(p, name);
-      }
-    }
-
-    final int colCnt = columnMap.length;
-    final int[] widths = new int[colCnt];
-    for (int c = 0; c < colCnt; c++) {
-      widths[c] = columnMap[c].name.length();
-    }
-
-    final List<String[]> rows = new ArrayList<>();
-    while (alreadyOnRow || rs.next()) {
-      final String[] row = new String[columnMap.length];
-      for (int c = 0; c < colCnt; c++) {
-        row[c] = columnMap[c].apply(rs);
-        if (row[c] == null) {
-          row[c] = "NULL";
-        }
-        widths[c] = Math.max(widths[c], row[c].length());
-      }
-      rows.add(row);
-      alreadyOnRow = false;
-    }
-
-    final StringBuilder b = new StringBuilder();
-    for (int c = 0; c < colCnt; c++) {
-      if (0 < c) {
-        b.append(" | ");
-      }
-
-      String n = columnMap[c].name;
-      if (widths[c] < n.length()) {
-        n = n.substring(0, widths[c]);
-      }
-      b.append(n);
-
-      if (c < colCnt - 1) {
-        for (int pad = n.length(); pad < widths[c]; pad++) {
-          b.append(' ');
-        }
-      }
-    }
-    println(" " + b.toString());
-
-    b.setLength(0);
-    for (int c = 0; c < colCnt; c++) {
-      if (0 < c) {
-        b.append("-+-");
-      }
-      for (int pad = 0; pad < widths[c]; pad++) {
-        b.append('-');
-      }
-    }
-    println(" " + b.toString());
-
-    boolean dataTruncated = false;
-    for (String[] row : rows) {
-      b.setLength(0);
-      b.append(' ');
-
-      for (int c = 0; c < colCnt; c++) {
-        final int max = widths[c];
-        if (0 < c) {
-          b.append(" | ");
-        }
-
-        String s = row[c];
-        if (1 < colCnt && max < s.length()) {
-          s = s.substring(0, max);
-          dataTruncated = true;
-        }
-        b.append(s);
-
-        if (c < colCnt - 1) {
-          for (int pad = s.length(); pad < max; pad++) {
-            b.append(' ');
-          }
-        }
-      }
-      println(b.toString());
-    }
-
-    if (dataTruncated) {
-      warning("some column data was truncated");
-    }
-
-    if (start != 0) {
-      final int rowCount = rows.size();
-      final long ms = TimeUtil.nowMs() - start;
-      println("(" + rowCount + (rowCount == 1 ? " row" : " rows") + "; " + ms + " ms)");
-    }
-  }
-
-  private void warning(String msg) {
-    switch (outputFormat) {
-      case JSON_SINGLE:
-      case JSON:
-        {
-          final JsonObject obj = new JsonObject();
-          obj.addProperty("type", "warning");
-          obj.addProperty("message", msg);
-          println(obj.toString());
-          break;
-        }
-
-      case PRETTY:
-      default:
-        println("WARNING: " + msg);
-        break;
-    }
-  }
-
-  private void error(SQLException err) {
-    switch (outputFormat) {
-      case JSON_SINGLE:
-      case JSON:
-        {
-          final JsonObject obj = new JsonObject();
-          obj.addProperty("type", "error");
-          obj.addProperty("message", err.getMessage());
-          println(obj.toString());
-          break;
-        }
-
-      case PRETTY:
-      default:
-        println("ERROR: " + err.getMessage());
-        break;
-    }
-  }
-
-  private void print(String s) {
-    out.print(s);
-    out.flush();
-  }
-
-  private void println(String s) {
-    out.print(s);
-    out.print('\n');
-    out.flush();
-  }
-
-  private String readLine() {
-    try {
-      return in.readLine();
-    } catch (IOException e) {
-      return null;
-    }
-  }
-
-  private void showBanner() {
-    if (outputFormat == OutputFormat.PRETTY) {
-      println("Welcome to Gerrit Code Review " + Version.getVersion());
-      try {
-        print("(");
-        print(connection.getMetaData().getDatabaseProductName());
-        print(" ");
-        print(connection.getMetaData().getDatabaseProductVersion());
-        println(")");
-      } catch (SQLException err) {
-        error(err);
-      }
-      println("");
-      println("Type '\\h' for help.  Type '\\r' to clear the buffer.");
-      println("");
-    }
-  }
-
-  private void showHelp() {
-    final StringBuilder help = new StringBuilder();
-    help.append("General\n");
-    help.append("  \\q        quit\n");
-
-    help.append("\n");
-    help.append("Query Buffer\n");
-    help.append("  \\g        execute the query buffer\n");
-    help.append("  \\p        display the current buffer\n");
-    help.append("  \\r        clear the query buffer\n");
-
-    help.append("\n");
-    help.append("Informational\n");
-    help.append("  \\d        list all tables\n");
-    help.append("  \\d NAME   describe table\n");
-
-    help.append("\n");
-    print(help.toString());
-  }
-
-  private abstract static class Function {
-    final String name;
-
-    Function(String name) {
-      this.name = name;
-    }
-
-    abstract String apply(ResultSet rs) throws SQLException;
-  }
-
-  private static class Identity extends Function {
-    static Identity create(ResultSet rs, String name) throws SQLException {
-      return new Identity(rs.findColumn(name), name);
-    }
-
-    final int colId;
-
-    Identity(int colId, String name) {
-      super(name);
-      this.colId = colId;
-    }
-
-    @Override
-    String apply(ResultSet rs) throws SQLException {
-      return rs.getString(colId);
-    }
-  }
-
-  private static class IndexInfo {
-    String name;
-    boolean unique;
-    final Map<Integer, String> columns = new TreeMap<>();
-    final StringBuilder filter = new StringBuilder();
-
-    void addColumn(int pos, String column) {
-      columns.put(Integer.valueOf(pos), column);
-    }
-
-    @Override
-    public String toString() {
-      final StringBuilder r = new StringBuilder();
-      r.append(name);
-      if (unique) {
-        r.append(" UNIQUE");
-      }
-      r.append(" (");
-      boolean first = true;
-      for (String c : columns.values()) {
-        if (!first) {
-          r.append(", ");
-        }
-        r.append(c);
-        first = false;
-      }
-      r.append(")");
-      if (filter.length() > 0) {
-        r.append(" WHERE ");
-        r.append(filter);
-      }
-      return r.toString();
-    }
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Receive.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Receive.java
deleted file mode 100644
index 262e57a..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Receive.java
+++ /dev/null
@@ -1,174 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.sshd.commands;
-
-import com.google.common.collect.MultimapBuilder;
-import com.google.common.collect.SetMultimap;
-import com.google.gerrit.common.data.Capable;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.git.VisibleRefFilter;
-import com.google.gerrit.server.git.receive.AsyncReceiveCommits;
-import com.google.gerrit.server.notedb.ReviewerStateInternal;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.ProjectPermission;
-import com.google.gerrit.sshd.AbstractGitCommand;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshSession;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import org.eclipse.jgit.errors.TooLargeObjectInPackException;
-import org.eclipse.jgit.errors.UnpackException;
-import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.RefDatabase;
-import org.eclipse.jgit.transport.AdvertiseRefsHook;
-import org.eclipse.jgit.transport.ReceivePack;
-import org.kohsuke.args4j.Option;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Receives change upload over SSH using the Git receive-pack protocol. */
-@CommandMetaData(
-    name = "receive-pack",
-    description = "Standard Git server side command for client side git push")
-final class Receive extends AbstractGitCommand {
-  private static final Logger log = LoggerFactory.getLogger(Receive.class);
-
-  @Inject private AsyncReceiveCommits.Factory factory;
-  @Inject private IdentifiedUser currentUser;
-  @Inject private SshSession session;
-  @Inject private PermissionBackend permissionBackend;
-
-  private final SetMultimap<ReviewerStateInternal, Account.Id> reviewers =
-      MultimapBuilder.hashKeys(2).hashSetValues().build();
-
-  @Option(
-      name = "--reviewer",
-      aliases = {"--re"},
-      metaVar = "EMAIL",
-      usage = "request reviewer for change(s)")
-  void addReviewer(Account.Id id) {
-    reviewers.put(ReviewerStateInternal.REVIEWER, id);
-  }
-
-  @Option(
-      name = "--cc",
-      aliases = {},
-      metaVar = "EMAIL",
-      usage = "CC user on change(s)")
-  void addCC(Account.Id id) {
-    reviewers.put(ReviewerStateInternal.CC, id);
-  }
-
-  @Override
-  protected void runImpl() throws IOException, Failure {
-    try {
-      permissionBackend
-          .user(currentUser)
-          .project(project.getNameKey())
-          .check(ProjectPermission.RUN_RECEIVE_PACK);
-    } catch (AuthException e) {
-      throw new Failure(1, "fatal: receive-pack not permitted on this server");
-    } catch (PermissionBackendException e) {
-      throw new Failure(1, "fatal: unable to check permissions " + e);
-    }
-
-    AsyncReceiveCommits arc = factory.create(projectControl, repo, null, reviewers);
-
-    Capable r = arc.canUpload();
-    if (r != Capable.OK) {
-      throw die(r.getMessage());
-    }
-
-    ReceivePack rp = arc.getReceivePack();
-    try {
-      rp.receive(in, out, err);
-      session.setPeerAgent(rp.getPeerUserAgent());
-    } catch (UnpackException badStream) {
-      // In case this was caused by the user pushing an object whose size
-      // is larger than the receive.maxObjectSizeLimit gerrit.config parameter
-      // we want to present this error to the user
-      if (badStream.getCause() instanceof TooLargeObjectInPackException) {
-        StringBuilder msg = new StringBuilder();
-        msg.append("Receive error on project \"")
-            .append(projectControl.getProject().getName())
-            .append("\"");
-        msg.append(" (user ");
-        msg.append(currentUser.getAccount().getUserName());
-        msg.append(" account ");
-        msg.append(currentUser.getAccountId());
-        msg.append("): ");
-        msg.append(badStream.getCause().getMessage());
-        log.info(msg.toString());
-        throw new UnloggedFailure(128, "error: " + badStream.getCause().getMessage());
-      }
-
-      // This may have been triggered by branch level access controls.
-      // Log what the heck is going on, as detailed as we can.
-      //
-      StringBuilder msg = new StringBuilder();
-      msg.append("Unpack error on project \"")
-          .append(projectControl.getProject().getName())
-          .append("\":\n");
-
-      msg.append("  AdvertiseRefsHook: ").append(rp.getAdvertiseRefsHook());
-      if (rp.getAdvertiseRefsHook() == AdvertiseRefsHook.DEFAULT) {
-        msg.append("DEFAULT");
-      } else if (rp.getAdvertiseRefsHook() instanceof VisibleRefFilter) {
-        msg.append("VisibleRefFilter");
-      } else {
-        msg.append(rp.getAdvertiseRefsHook().getClass());
-      }
-      msg.append("\n");
-
-      if (rp.getAdvertiseRefsHook() instanceof VisibleRefFilter) {
-        Map<String, Ref> adv = rp.getAdvertisedRefs();
-        msg.append("  Visible references (").append(adv.size()).append("):\n");
-        for (Ref ref : adv.values()) {
-          msg.append("  - ")
-              .append(ref.getObjectId().abbreviate(8).name())
-              .append(" ")
-              .append(ref.getName())
-              .append("\n");
-        }
-
-        Map<String, Ref> allRefs = rp.getRepository().getRefDatabase().getRefs(RefDatabase.ALL);
-        List<Ref> hidden = new ArrayList<>();
-        for (Ref ref : allRefs.values()) {
-          if (!adv.containsKey(ref.getName())) {
-            hidden.add(ref);
-          }
-        }
-
-        msg.append("  Hidden references (").append(hidden.size()).append("):\n");
-        for (Ref ref : hidden) {
-          msg.append("  - ")
-              .append(ref.getObjectId().abbreviate(8).name())
-              .append(" ")
-              .append(ref.getName())
-              .append("\n");
-        }
-      }
-
-      IOException detail = new IOException(msg.toString(), badStream);
-      throw new Failure(128, "fatal: Unpack error, check server log", detail);
-    }
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/RenameGroupCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/RenameGroupCommand.java
deleted file mode 100644
index 53b6b32..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/RenameGroupCommand.java
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.sshd.commands;
-
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.server.group.GroupResource;
-import com.google.gerrit.server.group.GroupsCollection;
-import com.google.gerrit.server.group.PutName;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.io.IOException;
-import org.kohsuke.args4j.Argument;
-
-@CommandMetaData(name = "rename-group", description = "Rename an account group")
-public class RenameGroupCommand extends SshCommand {
-  @Argument(
-      index = 0,
-      required = true,
-      metaVar = "GROUP",
-      usage = "name of the group to be renamed")
-  private String groupName;
-
-  @Argument(index = 1, required = true, metaVar = "NEWNAME", usage = "new name of the group")
-  private String newGroupName;
-
-  @Inject private GroupsCollection groups;
-
-  @Inject private PutName putName;
-
-  @Override
-  protected void run() throws Failure {
-    try {
-      GroupResource rsrc = groups.parse(TopLevelResource.INSTANCE, IdString.fromDecoded(groupName));
-      PutName.Input input = new PutName.Input();
-      input.name = newGroupName;
-      putName.apply(rsrc, input);
-    } catch (RestApiException | OrmException | IOException e) {
-      throw die(e);
-    }
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ReviewCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ReviewCommand.java
deleted file mode 100644
index a9899b5..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ReviewCommand.java
+++ /dev/null
@@ -1,343 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.sshd.commands;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.base.Strings;
-import com.google.common.io.CharStreams;
-import com.google.gerrit.common.data.LabelType;
-import com.google.gerrit.common.data.LabelValue;
-import com.google.gerrit.extensions.api.GerritApi;
-import com.google.gerrit.extensions.api.changes.AbandonInput;
-import com.google.gerrit.extensions.api.changes.ChangeApi;
-import com.google.gerrit.extensions.api.changes.MoveInput;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.api.changes.RestoreInput;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
-import com.google.gerrit.extensions.api.changes.RevisionApi;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.server.OutputFormat;
-import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.server.project.ProjectState;
-import com.google.gerrit.server.util.LabelVote;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.gerrit.util.cli.CmdLineParser;
-import com.google.gson.JsonSyntaxException;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-import org.kohsuke.args4j.Argument;
-import org.kohsuke.args4j.Option;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@CommandMetaData(name = "review", description = "Apply reviews to one or more patch sets")
-public class ReviewCommand extends SshCommand {
-  private static final Logger log = LoggerFactory.getLogger(ReviewCommand.class);
-
-  @Override
-  protected final CmdLineParser newCmdLineParser(Object options) {
-    final CmdLineParser parser = super.newCmdLineParser(options);
-    for (ApproveOption c : optionList) {
-      parser.addOption(c, c);
-    }
-    return parser;
-  }
-
-  private final Set<PatchSet> patchSets = new HashSet<>();
-
-  @Argument(
-      index = 0,
-      required = true,
-      multiValued = true,
-      metaVar = "{COMMIT | CHANGE,PATCHSET}",
-      usage = "list of commits or patch sets to review")
-  void addPatchSetId(String token) {
-    try {
-      PatchSet ps = psParser.parsePatchSet(token, projectControl, branch);
-      patchSets.add(ps);
-    } catch (UnloggedFailure e) {
-      throw new IllegalArgumentException(e.getMessage(), e);
-    } catch (OrmException e) {
-      throw new IllegalArgumentException("database error", e);
-    }
-  }
-
-  @Option(
-      name = "--project",
-      aliases = "-p",
-      usage = "project containing the specified patch set(s)")
-  private ProjectControl projectControl;
-
-  @Option(name = "--branch", aliases = "-b", usage = "branch containing the specified patch set(s)")
-  private String branch;
-
-  @Option(
-      name = "--message",
-      aliases = "-m",
-      usage = "cover message to publish on change(s)",
-      metaVar = "MESSAGE")
-  private String changeComment;
-
-  @Option(
-      name = "--notify",
-      aliases = "-n",
-      usage = "Who to send email notifications to after the review is stored.",
-      metaVar = "NOTIFYHANDLING")
-  private NotifyHandling notify;
-
-  @Option(name = "--abandon", usage = "abandon the specified change(s)")
-  private boolean abandonChange;
-
-  @Option(name = "--restore", usage = "restore the specified abandoned change(s)")
-  private boolean restoreChange;
-
-  @Option(name = "--rebase", usage = "rebase the specified change(s)")
-  private boolean rebaseChange;
-
-  @Option(name = "--move", usage = "move the specified change(s)", metaVar = "BRANCH")
-  private String moveToBranch;
-
-  @Option(name = "--submit", aliases = "-s", usage = "submit the specified patch set(s)")
-  private boolean submitChange;
-
-  @Option(name = "--json", aliases = "-j", usage = "read review input json from stdin")
-  private boolean json;
-
-  @Option(
-      name = "--tag",
-      aliases = "-t",
-      usage = "applies a tag to the given review",
-      metaVar = "TAG")
-  private String changeTag;
-
-  @Option(
-      name = "--label",
-      aliases = "-l",
-      usage = "custom label(s) to assign",
-      metaVar = "LABEL=VALUE")
-  void addLabel(String token) {
-    LabelVote v = LabelVote.parseWithEquals(token);
-    LabelType.checkName(v.label()); // Disallow SUBM.
-    customLabels.put(v.label(), v.value());
-  }
-
-  @Inject private ProjectCache projectCache;
-
-  @Inject private AllProjectsName allProjects;
-
-  @Inject private GerritApi gApi;
-
-  @Inject private PatchSetParser psParser;
-
-  private List<ApproveOption> optionList;
-  private Map<String, Short> customLabels;
-
-  @Override
-  protected void run() throws UnloggedFailure {
-    if (abandonChange) {
-      if (restoreChange) {
-        throw die("abandon and restore actions are mutually exclusive");
-      }
-      if (submitChange) {
-        throw die("abandon and submit actions are mutually exclusive");
-      }
-      if (rebaseChange) {
-        throw die("abandon and rebase actions are mutually exclusive");
-      }
-      if (moveToBranch != null) {
-        throw die("abandon and move actions are mutually exclusive");
-      }
-    }
-    if (json) {
-      if (restoreChange) {
-        throw die("json and restore actions are mutually exclusive");
-      }
-      if (submitChange) {
-        throw die("json and submit actions are mutually exclusive");
-      }
-      if (abandonChange) {
-        throw die("json and abandon actions are mutually exclusive");
-      }
-      if (changeComment != null) {
-        throw die("json and message are mutually exclusive");
-      }
-      if (rebaseChange) {
-        throw die("json and rebase actions are mutually exclusive");
-      }
-      if (moveToBranch != null) {
-        throw die("json and move actions are mutually exclusive");
-      }
-      if (changeTag != null) {
-        throw die("json and tag actions are mutually exclusive");
-      }
-    }
-    if (rebaseChange) {
-      if (submitChange) {
-        throw die("rebase and submit actions are mutually exclusive");
-      }
-    }
-
-    boolean ok = true;
-    ReviewInput input = null;
-    if (json) {
-      input = reviewFromJson();
-    }
-
-    for (PatchSet patchSet : patchSets) {
-      try {
-        if (input != null) {
-          applyReview(patchSet, input);
-        } else {
-          reviewPatchSet(patchSet);
-        }
-      } catch (RestApiException | UnloggedFailure e) {
-        ok = false;
-        writeError("error", e.getMessage() + "\n");
-      } catch (NoSuchChangeException e) {
-        ok = false;
-        writeError("error", "no such change " + patchSet.getId().getParentKey().get());
-      } catch (Exception e) {
-        ok = false;
-        writeError("fatal", "internal server error while reviewing " + patchSet.getId() + "\n");
-        log.error("internal error while reviewing " + patchSet.getId(), e);
-      }
-    }
-
-    if (!ok) {
-      throw die("one or more reviews failed; review output above");
-    }
-  }
-
-  private void applyReview(PatchSet patchSet, ReviewInput review) throws RestApiException {
-    gApi.changes()
-        .id(patchSet.getId().getParentKey().get())
-        .revision(patchSet.getRevision().get())
-        .review(review);
-  }
-
-  private ReviewInput reviewFromJson() throws UnloggedFailure {
-    try (InputStreamReader r = new InputStreamReader(in, UTF_8)) {
-      return OutputFormat.JSON.newGson().fromJson(CharStreams.toString(r), ReviewInput.class);
-    } catch (IOException | JsonSyntaxException e) {
-      writeError("error", e.getMessage() + '\n');
-      throw die("internal error while reading review input");
-    }
-  }
-
-  private void reviewPatchSet(PatchSet patchSet) throws Exception {
-
-    ReviewInput review = new ReviewInput();
-    review.message = Strings.emptyToNull(changeComment);
-    review.tag = Strings.emptyToNull(changeTag);
-    review.notify = notify;
-    review.labels = new TreeMap<>();
-    review.drafts = ReviewInput.DraftHandling.PUBLISH;
-    for (ApproveOption ao : optionList) {
-      Short v = ao.value();
-      if (v != null) {
-        review.labels.put(ao.getLabelName(), v);
-      }
-    }
-    review.labels.putAll(customLabels);
-
-    // We don't need to add the review comment when abandoning/restoring.
-    if (abandonChange || restoreChange || moveToBranch != null) {
-      review.message = null;
-    }
-
-    try {
-      if (abandonChange) {
-        AbandonInput input = new AbandonInput();
-        input.message = Strings.emptyToNull(changeComment);
-        applyReview(patchSet, review);
-        changeApi(patchSet).abandon(input);
-      } else if (restoreChange) {
-        RestoreInput input = new RestoreInput();
-        input.message = Strings.emptyToNull(changeComment);
-        changeApi(patchSet).restore(input);
-        applyReview(patchSet, review);
-      } else {
-        applyReview(patchSet, review);
-      }
-
-      if (moveToBranch != null) {
-        MoveInput moveInput = new MoveInput();
-        moveInput.destinationBranch = moveToBranch;
-        moveInput.message = Strings.emptyToNull(changeComment);
-        changeApi(patchSet).move(moveInput);
-      }
-
-      if (rebaseChange) {
-        revisionApi(patchSet).rebase();
-      }
-
-      if (submitChange) {
-        revisionApi(patchSet).submit();
-      }
-
-    } catch (IllegalStateException | RestApiException e) {
-      throw die(e);
-    }
-  }
-
-  private ChangeApi changeApi(PatchSet patchSet) throws RestApiException {
-    return gApi.changes().id(patchSet.getId().getParentKey().get());
-  }
-
-  private RevisionApi revisionApi(PatchSet patchSet) throws RestApiException {
-    return changeApi(patchSet).revision(patchSet.getRevision().get());
-  }
-
-  @Override
-  protected void parseCommandLine() throws UnloggedFailure {
-    optionList = new ArrayList<>();
-    customLabels = new HashMap<>();
-
-    ProjectState allProjectsState;
-    try {
-      allProjectsState = projectCache.checkedGet(allProjects);
-    } catch (IOException e) {
-      throw die("missing " + allProjects.get());
-    }
-
-    for (LabelType type : allProjectsState.getLabelTypes().getLabelTypes()) {
-      StringBuilder usage = new StringBuilder("score for ").append(type.getName()).append("\n");
-
-      for (LabelValue v : type.getValues()) {
-        usage.append(v.format()).append("\n");
-      }
-
-      final String name = "--" + type.getName().toLowerCase();
-      optionList.add(new ApproveOption(name, usage.toString(), type));
-    }
-
-    super.parseCommandLine();
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ScpCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ScpCommand.java
deleted file mode 100644
index 0d20305..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ScpCommand.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to you 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.
- */
-
-/*
- * NB: This code was primarly ripped out of MINA SSHD.
- *
- * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
- */
-package com.google.gerrit.sshd.commands;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.gerrit.server.AccessPath;
-import com.google.gerrit.server.tools.ToolsCatalog;
-import com.google.gerrit.server.tools.ToolsCatalog.Entry;
-import com.google.gerrit.sshd.BaseCommand;
-import com.google.inject.Inject;
-import java.io.ByteArrayOutputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import org.apache.sshd.server.Environment;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-final class ScpCommand extends BaseCommand {
-  private static final String TYPE_DIR = "D";
-  private static final String TYPE_FILE = "C";
-  private static final Logger log = LoggerFactory.getLogger(ScpCommand.class);
-
-  private boolean opt_r;
-  private boolean opt_t;
-  private boolean opt_f;
-  private String root;
-
-  @Inject private ToolsCatalog toc;
-  private IOException error;
-
-  @Override
-  public void setArguments(String[] args) {
-    root = "";
-    for (int i = 0; i < args.length; i++) {
-      if (args[i].charAt(0) == '-') {
-        for (int j = 1; j < args[i].length(); j++) {
-          switch (args[i].charAt(j)) {
-            case 'f':
-              opt_f = true;
-              break;
-            case 'p':
-              break;
-            case 'r':
-              opt_r = true;
-              break;
-            case 't':
-              opt_t = true;
-              break;
-            case 'v':
-              break;
-          }
-        }
-      } else if (i == args.length - 1) {
-        root = args[args.length - 1];
-      }
-    }
-    if (!opt_f && !opt_t) {
-      error = new IOException("Either -f or -t option should be set");
-    }
-  }
-
-  @Override
-  public void start(Environment env) {
-    startThread(this::runImp, AccessPath.SSH_COMMAND);
-  }
-
-  private void runImp() {
-    try {
-      readAck();
-      if (error != null) {
-        throw error;
-      }
-
-      if (opt_f) {
-        if (root.startsWith("/")) {
-          root = root.substring(1);
-        }
-        if (root.endsWith("/")) {
-          root = root.substring(0, root.length() - 1);
-        }
-        if (root.equals(".")) {
-          root = "";
-        }
-
-        final Entry ent = toc.get(root);
-        if (ent == null) {
-          throw new IOException(root + " not found");
-
-        } else if (Entry.Type.FILE == ent.getType()) {
-          readFile(ent);
-
-        } else if (Entry.Type.DIR == ent.getType()) {
-          if (!opt_r) {
-            throw new IOException(root + " not a regular file");
-          }
-          readDir(ent);
-        } else {
-          throw new IOException(root + " not supported");
-        }
-      } else {
-        throw new IOException("Unsupported mode");
-      }
-    } catch (IOException e) {
-      if (e.getClass() == IOException.class && "Pipe closed".equals(e.getMessage())) {
-        // Ignore a pipe closed error, its the user disconnecting from us
-        // while we are waiting for them to stalk.
-        //
-        return;
-      }
-
-      try {
-        out.write(2);
-        out.write(e.getMessage().getBytes(UTF_8));
-        out.write('\n');
-        out.flush();
-      } catch (IOException e2) {
-        // Ignore
-      }
-      log.debug("Error in scp command", e);
-    }
-  }
-
-  private String readLine() throws IOException {
-    ByteArrayOutputStream baos = new ByteArrayOutputStream();
-    for (; ; ) {
-      int c = in.read();
-      if (c == '\n') {
-        return baos.toString();
-      } else if (c == -1) {
-        throw new IOException("End of stream");
-      } else {
-        baos.write(c);
-      }
-    }
-  }
-
-  private void readFile(Entry ent) throws IOException {
-    byte[] data = ent.getBytes();
-    if (data == null) {
-      throw new FileNotFoundException(ent.getPath());
-    }
-
-    header(ent, data.length);
-    readAck();
-
-    out.write(data);
-    ack();
-    readAck();
-  }
-
-  private void readDir(Entry dir) throws IOException {
-    header(dir, 0);
-    readAck();
-
-    for (Entry e : dir.getChildren()) {
-      if (Entry.Type.DIR == e.getType()) {
-        readDir(e);
-      } else {
-        readFile(e);
-      }
-    }
-
-    out.write("E\n".getBytes(UTF_8));
-    out.flush();
-    readAck();
-  }
-
-  private void header(Entry dir, int len) throws IOException, UnsupportedEncodingException {
-    final StringBuilder buf = new StringBuilder();
-    switch (dir.getType()) {
-      case DIR:
-        buf.append(TYPE_DIR);
-        break;
-      case FILE:
-        buf.append(TYPE_FILE);
-        break;
-    }
-    buf.append("0").append(Integer.toOctalString(dir.getMode())); // perms
-    buf.append(" ");
-    buf.append(len); // length
-    buf.append(" ");
-    buf.append(dir.getName());
-    buf.append("\n");
-    out.write(buf.toString().getBytes(UTF_8));
-    out.flush();
-  }
-
-  private void ack() throws IOException {
-    out.write(0);
-    out.flush();
-  }
-
-  private void readAck() throws IOException {
-    switch (in.read()) {
-      case 0:
-        break;
-      case 1:
-        log.debug("Received warning: " + readLine());
-        break;
-      case 2:
-        throw new IOException("Received nack: " + readLine());
-    }
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetAccountCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetAccountCommand.java
deleted file mode 100644
index 3fbf81d..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetAccountCommand.java
+++ /dev/null
@@ -1,361 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.sshd.commands;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.common.RawInputUtil;
-import com.google.gerrit.common.errors.EmailException;
-import com.google.gerrit.extensions.api.accounts.EmailInput;
-import com.google.gerrit.extensions.common.EmailInfo;
-import com.google.gerrit.extensions.common.SshKeyInfo;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountSshKey;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountResource;
-import com.google.gerrit.server.account.AddSshKey;
-import com.google.gerrit.server.account.CreateEmail;
-import com.google.gerrit.server.account.DeleteActive;
-import com.google.gerrit.server.account.DeleteEmail;
-import com.google.gerrit.server.account.DeleteSshKey;
-import com.google.gerrit.server.account.GetEmails;
-import com.google.gerrit.server.account.GetSshKeys;
-import com.google.gerrit.server.account.PutActive;
-import com.google.gerrit.server.account.PutHttpPassword;
-import com.google.gerrit.server.account.PutName;
-import com.google.gerrit.server.account.PutPreferred;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.UnsupportedEncodingException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.kohsuke.args4j.Argument;
-import org.kohsuke.args4j.Option;
-
-/** Set a user's account settings. * */
-@CommandMetaData(name = "set-account", description = "Change an account's settings")
-final class SetAccountCommand extends SshCommand {
-
-  @Argument(
-      index = 0,
-      required = true,
-      metaVar = "USER",
-      usage = "full name, email-address, ssh username or account id")
-  private Account.Id id;
-
-  @Option(name = "--full-name", metaVar = "NAME", usage = "display name of the account")
-  private String fullName;
-
-  @Option(name = "--active", usage = "set account's state to active")
-  private boolean active;
-
-  @Option(name = "--inactive", usage = "set account's state to inactive")
-  private boolean inactive;
-
-  @Option(name = "--add-email", metaVar = "EMAIL", usage = "email addresses to add to the account")
-  private List<String> addEmails = new ArrayList<>();
-
-  @Option(
-      name = "--delete-email",
-      metaVar = "EMAIL",
-      usage = "email addresses to delete from the account")
-  private List<String> deleteEmails = new ArrayList<>();
-
-  @Option(
-      name = "--preferred-email",
-      metaVar = "EMAIL",
-      usage = "a registered email address from the account")
-  private String preferredEmail;
-
-  @Option(name = "--add-ssh-key", metaVar = "-|KEY", usage = "public keys to add to the account")
-  private List<String> addSshKeys = new ArrayList<>();
-
-  @Option(
-      name = "--delete-ssh-key",
-      metaVar = "-|KEY",
-      usage = "public keys to delete from the account")
-  private List<String> deleteSshKeys = new ArrayList<>();
-
-  @Option(
-      name = "--http-password",
-      metaVar = "PASSWORD",
-      usage = "password for HTTP authentication for the account")
-  private String httpPassword;
-
-  @Option(name = "--clear-http-password", usage = "clear HTTP password for the account")
-  private boolean clearHttpPassword;
-
-  @Option(name = "--generate-http-password", usage = "generate a new HTTP password for the account")
-  private boolean generateHttpPassword;
-
-  @Inject private IdentifiedUser.GenericFactory genericUserFactory;
-
-  @Inject private CreateEmail.Factory createEmailFactory;
-
-  @Inject private GetEmails getEmails;
-
-  @Inject private DeleteEmail deleteEmail;
-
-  @Inject private PutPreferred putPreferred;
-
-  @Inject private PutName putName;
-
-  @Inject private PutHttpPassword putHttpPassword;
-
-  @Inject private PutActive putActive;
-
-  @Inject private DeleteActive deleteActive;
-
-  @Inject private AddSshKey addSshKey;
-
-  @Inject private GetSshKeys getSshKeys;
-
-  @Inject private DeleteSshKey deleteSshKey;
-
-  @Inject private PermissionBackend permissionBackend;
-
-  @Inject private Provider<CurrentUser> userProvider;
-
-  private IdentifiedUser user;
-  private AccountResource rsrc;
-
-  @Override
-  public void run() throws Exception {
-    user = genericUserFactory.create(id);
-
-    validate();
-    setAccount();
-  }
-
-  private void validate() throws UnloggedFailure {
-    PermissionBackend.WithUser userPermission = permissionBackend.user(userProvider);
-
-    boolean isAdmin = userPermission.testOrFalse(GlobalPermission.ADMINISTRATE_SERVER);
-    boolean canModifyAccount =
-        isAdmin || userPermission.testOrFalse(GlobalPermission.MODIFY_ACCOUNT);
-
-    if (!user.hasSameAccountId(userProvider.get()) && !canModifyAccount) {
-      throw die(
-          "Setting another user's account information requries 'modify account' or 'administrate server' capabilities.");
-    }
-    if (active || inactive) {
-      if (!canModifyAccount) {
-        throw die(
-            "--active and --inactive require 'modify account' or 'administrate server' capabilities.");
-      }
-      if (active && inactive) {
-        throw die("--active and --inactive options are mutually exclusive.");
-      }
-    }
-
-    if (generateHttpPassword && clearHttpPassword) {
-      throw die("--generate-http-password and --clear-http-password are mutually exclusive.");
-    }
-    if (!Strings.isNullOrEmpty(httpPassword)) { // gave --http-password
-      if (!isAdmin) {
-        throw die("--http-password requires 'administrate server' capabilities.");
-      }
-      if (generateHttpPassword) {
-        throw die("--http-password and --generate-http-password options are mutually exclusive.");
-      }
-      if (clearHttpPassword) {
-        throw die("--http-password and --clear-http-password options are mutually exclusive.");
-      }
-    }
-    if (addSshKeys.contains("-") && deleteSshKeys.contains("-")) {
-      throw die("Only one option may use the stdin");
-    }
-    if (deleteSshKeys.contains("ALL")) {
-      deleteSshKeys = Collections.singletonList("ALL");
-    }
-    if (deleteEmails.contains("ALL")) {
-      deleteEmails = Collections.singletonList("ALL");
-    }
-    if (deleteEmails.contains(preferredEmail)) {
-      throw die(
-          "--preferred-email and --delete-email options are mutually "
-              + "exclusive for the same email address.");
-    }
-  }
-
-  private void setAccount()
-      throws OrmException, IOException, UnloggedFailure, ConfigInvalidException,
-          PermissionBackendException {
-    rsrc = new AccountResource(user);
-    try {
-      for (String email : addEmails) {
-        addEmail(email);
-      }
-
-      for (String email : deleteEmails) {
-        deleteEmail(email);
-      }
-
-      if (preferredEmail != null) {
-        putPreferred(preferredEmail);
-      }
-
-      if (fullName != null) {
-        PutName.Input in = new PutName.Input();
-        in.name = fullName;
-        putName.apply(rsrc, in);
-      }
-
-      if (httpPassword != null || clearHttpPassword || generateHttpPassword) {
-        PutHttpPassword.Input in = new PutHttpPassword.Input();
-        in.httpPassword = httpPassword;
-        if (generateHttpPassword) {
-          in.generate = true;
-        }
-        Response<String> resp = putHttpPassword.apply(rsrc, in);
-        if (generateHttpPassword) {
-          stdout.print("New password: " + resp.value() + "\n");
-        }
-      }
-
-      if (active) {
-        putActive.apply(rsrc, null);
-      } else if (inactive) {
-        try {
-          deleteActive.apply(rsrc, null);
-        } catch (ResourceNotFoundException e) {
-          // user is already inactive
-        }
-      }
-
-      addSshKeys = readSshKey(addSshKeys);
-      if (!addSshKeys.isEmpty()) {
-        addSshKeys(addSshKeys);
-      }
-
-      deleteSshKeys = readSshKey(deleteSshKeys);
-      if (!deleteSshKeys.isEmpty()) {
-        deleteSshKeys(deleteSshKeys);
-      }
-    } catch (RestApiException e) {
-      throw die(e.getMessage());
-    }
-  }
-
-  private void addSshKeys(List<String> sshKeys)
-      throws RestApiException, OrmException, IOException, ConfigInvalidException,
-          PermissionBackendException {
-    for (String sshKey : sshKeys) {
-      AddSshKey.Input in = new AddSshKey.Input();
-      in.raw = RawInputUtil.create(sshKey.getBytes(UTF_8), "plain/text");
-      addSshKey.apply(rsrc, in);
-    }
-  }
-
-  private void deleteSshKeys(List<String> sshKeys)
-      throws RestApiException, OrmException, RepositoryNotFoundException, IOException,
-          ConfigInvalidException, PermissionBackendException {
-    List<SshKeyInfo> infos = getSshKeys.apply(rsrc);
-    if (sshKeys.contains("ALL")) {
-      for (SshKeyInfo i : infos) {
-        deleteSshKey(i);
-      }
-    } else {
-      for (String sshKey : sshKeys) {
-        for (SshKeyInfo i : infos) {
-          if (sshKey.trim().equals(i.sshPublicKey) || sshKey.trim().equals(i.comment)) {
-            deleteSshKey(i);
-          }
-        }
-      }
-    }
-  }
-
-  private void deleteSshKey(SshKeyInfo i)
-      throws AuthException, OrmException, RepositoryNotFoundException, IOException,
-          ConfigInvalidException, PermissionBackendException {
-    AccountSshKey sshKey =
-        new AccountSshKey(new AccountSshKey.Id(user.getAccountId(), i.seq), i.sshPublicKey);
-    deleteSshKey.apply(new AccountResource.SshKey(user, sshKey), null);
-  }
-
-  private void addEmail(String email)
-      throws UnloggedFailure, RestApiException, OrmException, IOException, ConfigInvalidException,
-          PermissionBackendException {
-    EmailInput in = new EmailInput();
-    in.email = email;
-    in.noConfirmation = true;
-    try {
-      createEmailFactory.create(email).apply(rsrc, in);
-    } catch (EmailException e) {
-      throw die(e.getMessage());
-    }
-  }
-
-  private void deleteEmail(String email)
-      throws RestApiException, OrmException, IOException, ConfigInvalidException,
-          PermissionBackendException {
-    if (email.equals("ALL")) {
-      List<EmailInfo> emails = getEmails.apply(rsrc);
-      for (EmailInfo e : emails) {
-        deleteEmail.apply(new AccountResource.Email(user, e.email), new DeleteEmail.Input());
-      }
-    } else {
-      deleteEmail.apply(new AccountResource.Email(user, email), new DeleteEmail.Input());
-    }
-  }
-
-  private void putPreferred(String email)
-      throws RestApiException, OrmException, IOException, PermissionBackendException,
-          ConfigInvalidException {
-    for (EmailInfo e : getEmails.apply(rsrc)) {
-      if (e.email.equals(email)) {
-        putPreferred.apply(new AccountResource.Email(user, email), null);
-        return;
-      }
-    }
-    stderr.println("preferred email not found: " + email);
-  }
-
-  private List<String> readSshKey(List<String> sshKeys)
-      throws UnsupportedEncodingException, IOException {
-    if (!sshKeys.isEmpty()) {
-      int idx = sshKeys.indexOf("-");
-      if (idx >= 0) {
-        StringBuilder sshKey = new StringBuilder();
-        BufferedReader br = new BufferedReader(new InputStreamReader(in, UTF_8));
-        String line;
-        while ((line = br.readLine()) != null) {
-          sshKey.append(line).append("\n");
-        }
-        sshKeys.set(idx, sshKey.toString());
-      }
-    }
-    return sshKeys;
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetHeadCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetHeadCommand.java
deleted file mode 100644
index ce4116d..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetHeadCommand.java
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.sshd.commands;
-
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.server.project.ProjectResource;
-import com.google.gerrit.server.project.SetHead;
-import com.google.gerrit.server.project.SetHead.Input;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.inject.Inject;
-import org.kohsuke.args4j.Argument;
-import org.kohsuke.args4j.Option;
-
-@CommandMetaData(name = "set-head", description = "Change HEAD reference for a project")
-public class SetHeadCommand extends SshCommand {
-
-  @Argument(index = 0, required = true, metaVar = "NAME", usage = "name of the project")
-  private ProjectControl project;
-
-  @Option(name = "--new-head", required = true, metaVar = "REF", usage = "new HEAD reference")
-  private String newHead;
-
-  private final SetHead setHead;
-
-  @Inject
-  SetHeadCommand(SetHead setHead) {
-    this.setHead = setHead;
-  }
-
-  @Override
-  protected void run() throws Exception {
-    Input input = new SetHead.Input();
-    input.ref = newHead;
-    try {
-      setHead.apply(new ProjectResource(project), input);
-    } catch (UnprocessableEntityException e) {
-      throw die(e);
-    }
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetMembersCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetMembersCommand.java
deleted file mode 100644
index 982c495..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetMembersCommand.java
+++ /dev/null
@@ -1,162 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.sshd.commands;
-
-import static java.util.stream.Collectors.joining;
-import static java.util.stream.Collectors.toList;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.collect.Streams;
-import com.google.gerrit.extensions.restapi.IdString;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.GroupCache;
-import com.google.gerrit.server.group.AddMembers;
-import com.google.gerrit.server.group.AddSubgroups;
-import com.google.gerrit.server.group.DeleteMembers;
-import com.google.gerrit.server.group.DeleteSubgroups;
-import com.google.gerrit.server.group.GroupResource;
-import com.google.gerrit.server.group.GroupsCollection;
-import com.google.gerrit.server.group.InternalGroup;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.util.ArrayList;
-import java.util.List;
-import org.kohsuke.args4j.Argument;
-import org.kohsuke.args4j.Option;
-
-@CommandMetaData(
-    name = "set-members",
-    description = "Modify members of specific group or number of groups")
-public class SetMembersCommand extends SshCommand {
-
-  @Option(
-      name = "--add",
-      aliases = {"-a"},
-      metaVar = "USER",
-      usage = "users that should be added as group member")
-  private List<Account.Id> accountsToAdd = new ArrayList<>();
-
-  @Option(
-      name = "--remove",
-      aliases = {"-r"},
-      metaVar = "USER",
-      usage = "users that should be removed from the group")
-  private List<Account.Id> accountsToRemove = new ArrayList<>();
-
-  @Option(
-      name = "--include",
-      aliases = {"-i"},
-      metaVar = "GROUP",
-      usage = "group that should be included as group member")
-  private List<AccountGroup.UUID> groupsToInclude = new ArrayList<>();
-
-  @Option(
-      name = "--exclude",
-      aliases = {"-e"},
-      metaVar = "GROUP",
-      usage = "group that should be excluded from the group")
-  private List<AccountGroup.UUID> groupsToRemove = new ArrayList<>();
-
-  @Argument(
-      index = 0,
-      required = true,
-      multiValued = true,
-      metaVar = "GROUP",
-      usage = "groups to modify")
-  private List<AccountGroup.UUID> groups = new ArrayList<>();
-
-  @Inject private AddMembers addMembers;
-
-  @Inject private DeleteMembers deleteMembers;
-
-  @Inject private AddSubgroups addSubgroups;
-
-  @Inject private DeleteSubgroups deleteSubgroups;
-
-  @Inject private GroupsCollection groupsCollection;
-
-  @Inject private GroupCache groupCache;
-
-  @Inject private AccountCache accountCache;
-
-  @Override
-  protected void run() throws UnloggedFailure, Failure, Exception {
-    try {
-      for (AccountGroup.UUID groupUuid : groups) {
-        GroupResource resource =
-            groupsCollection.parse(TopLevelResource.INSTANCE, IdString.fromUrl(groupUuid.get()));
-        if (!accountsToRemove.isEmpty()) {
-          deleteMembers.apply(resource, fromMembers(accountsToRemove));
-          reportMembersAction("removed from", resource, accountsToRemove);
-        }
-        if (!groupsToRemove.isEmpty()) {
-          deleteSubgroups.apply(resource, fromGroups(groupsToRemove));
-          reportGroupsAction("excluded from", resource, groupsToRemove);
-        }
-        if (!accountsToAdd.isEmpty()) {
-          addMembers.apply(resource, fromMembers(accountsToAdd));
-          reportMembersAction("added to", resource, accountsToAdd);
-        }
-        if (!groupsToInclude.isEmpty()) {
-          addSubgroups.apply(resource, fromGroups(groupsToInclude));
-          reportGroupsAction("included to", resource, groupsToInclude);
-        }
-      }
-    } catch (RestApiException e) {
-      throw die(e.getMessage());
-    }
-  }
-
-  private void reportMembersAction(
-      String action, GroupResource group, List<Account.Id> accountIdList)
-      throws UnsupportedEncodingException, IOException {
-    String names =
-        accountIdList.stream()
-            .map(
-                accountId ->
-                    MoreObjects.firstNonNull(
-                        accountCache.get(accountId).getAccount().getPreferredEmail(), "n/a"))
-            .collect(joining(", "));
-    out.write(
-        String.format("Members %s group %s: %s\n", action, group.getName(), names).getBytes(ENC));
-  }
-
-  private void reportGroupsAction(
-      String action, GroupResource group, List<AccountGroup.UUID> groupUuidList)
-      throws UnsupportedEncodingException, IOException {
-    String names =
-        groupUuidList.stream()
-            .map(uuid -> groupCache.get(uuid).map(InternalGroup::getName))
-            .flatMap(Streams::stream)
-            .collect(joining(", "));
-    out.write(
-        String.format("Groups %s group %s: %s\n", action, group.getName(), names).getBytes(ENC));
-  }
-
-  private AddSubgroups.Input fromGroups(List<AccountGroup.UUID> accounts) {
-    return AddSubgroups.Input.fromGroups(accounts.stream().map(Object::toString).collect(toList()));
-  }
-
-  private AddMembers.Input fromMembers(List<Account.Id> accounts) {
-    return AddMembers.Input.fromMembers(accounts.stream().map(Object::toString).collect(toList()));
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetProjectCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetProjectCommand.java
deleted file mode 100644
index 6b3fcf2..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetProjectCommand.java
+++ /dev/null
@@ -1,157 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.sshd.commands;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.extensions.api.projects.ConfigInput;
-import com.google.gerrit.extensions.client.InheritableBoolean;
-import com.google.gerrit.extensions.client.ProjectState;
-import com.google.gerrit.extensions.client.SubmitType;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.server.project.ProjectResource;
-import com.google.gerrit.server.project.PutConfig;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.inject.Inject;
-import org.kohsuke.args4j.Argument;
-import org.kohsuke.args4j.Option;
-
-@CommandMetaData(name = "set-project", description = "Change a project's settings")
-final class SetProjectCommand extends SshCommand {
-  @Argument(index = 0, required = true, metaVar = "NAME", usage = "name of the project")
-  private ProjectControl projectControl;
-
-  @Option(
-      name = "--description",
-      aliases = {"-d"},
-      metaVar = "DESCRIPTION",
-      usage = "description of project")
-  private String projectDescription;
-
-  @Option(
-      name = "--submit-type",
-      aliases = {"-t"},
-      usage = "project submit type\n(default: MERGE_IF_NECESSARY)")
-  private SubmitType submitType;
-
-  @Option(name = "--contributor-agreements", usage = "if contributor agreement is required")
-  private InheritableBoolean contributorAgreements;
-
-  @Option(name = "--signed-off-by", usage = "if signed-off-by is required")
-  private InheritableBoolean signedOffBy;
-
-  @Option(name = "--content-merge", usage = "allow automatic conflict resolving within files")
-  private InheritableBoolean contentMerge;
-
-  @Option(name = "--change-id", usage = "if change-id is required")
-  private InheritableBoolean requireChangeID;
-
-  @Option(
-      name = "--use-contributor-agreements",
-      aliases = {"--ca"},
-      usage = "if contributor agreement is required")
-  void setUseContributorArgreements(@SuppressWarnings("unused") boolean on) {
-    contributorAgreements = InheritableBoolean.TRUE;
-  }
-
-  @Option(
-      name = "--no-contributor-agreements",
-      aliases = {"--nca"},
-      usage = "if contributor agreement is not required")
-  void setNoContributorArgreements(@SuppressWarnings("unused") boolean on) {
-    contributorAgreements = InheritableBoolean.FALSE;
-  }
-
-  @Option(
-      name = "--use-signed-off-by",
-      aliases = {"--so"},
-      usage = "if signed-off-by is required")
-  void setUseSignedOffBy(@SuppressWarnings("unused") boolean on) {
-    signedOffBy = InheritableBoolean.TRUE;
-  }
-
-  @Option(
-      name = "--no-signed-off-by",
-      aliases = {"--nso"},
-      usage = "if signed-off-by is not required")
-  void setNoSignedOffBy(@SuppressWarnings("unused") boolean on) {
-    signedOffBy = InheritableBoolean.FALSE;
-  }
-
-  @Option(name = "--use-content-merge", usage = "allow automatic conflict resolving within files")
-  void setUseContentMerge(@SuppressWarnings("unused") boolean on) {
-    contentMerge = InheritableBoolean.TRUE;
-  }
-
-  @Option(
-      name = "--no-content-merge",
-      usage = "don't allow automatic conflict resolving within files")
-  void setNoContentMerge(@SuppressWarnings("unused") boolean on) {
-    contentMerge = InheritableBoolean.FALSE;
-  }
-
-  @Option(
-      name = "--require-change-id",
-      aliases = {"--id"},
-      usage = "if change-id is required")
-  void setRequireChangeId(@SuppressWarnings("unused") boolean on) {
-    requireChangeID = InheritableBoolean.TRUE;
-  }
-
-  @Option(
-      name = "--no-change-id",
-      aliases = {"--nid"},
-      usage = "if change-id is not required")
-  void setNoChangeId(@SuppressWarnings("unused") boolean on) {
-    requireChangeID = InheritableBoolean.FALSE;
-  }
-
-  @Option(
-      name = "--project-state",
-      aliases = {"--ps"},
-      usage = "project's visibility state")
-  private ProjectState state;
-
-  @Option(name = "--max-object-size-limit", usage = "max Git object size for this project")
-  private String maxObjectSizeLimit;
-
-  @Inject private PutConfig putConfig;
-
-  @Override
-  protected void run() throws Failure {
-    ConfigInput configInput = new ConfigInput();
-    configInput.requireChangeId = requireChangeID;
-    configInput.submitType = submitType;
-    configInput.useContentMerge = contentMerge;
-    configInput.useContributorAgreements = contributorAgreements;
-    configInput.useSignedOffBy = signedOffBy;
-    configInput.state = state;
-    configInput.maxObjectSizeLimit = maxObjectSizeLimit;
-    // Description is different to other parameters, null won't result in
-    // keeping the existing description, it would delete it.
-    if (Strings.emptyToNull(projectDescription) != null) {
-      configInput.description = projectDescription;
-    } else {
-      configInput.description = projectControl.getProject().getDescription();
-    }
-
-    try {
-      putConfig.apply(new ProjectResource(projectControl), configInput);
-    } catch (RestApiException e) {
-      throw die(e);
-    }
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetReviewersCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetReviewersCommand.java
deleted file mode 100644
index 52a790b..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetReviewersCommand.java
+++ /dev/null
@@ -1,156 +0,0 @@
-// Copyright (C) 2011 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.google.gerrit.sshd.commands;
-
-import com.google.gerrit.extensions.api.changes.AddReviewerInput;
-import com.google.gerrit.extensions.api.changes.DeleteReviewerInput;
-import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.server.change.ChangeResource;
-import com.google.gerrit.server.change.DeleteReviewer;
-import com.google.gerrit.server.change.PostReviewers;
-import com.google.gerrit.server.change.ReviewerResource;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.sshd.ChangeArgumentParser;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.kohsuke.args4j.Argument;
-import org.kohsuke.args4j.Option;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@CommandMetaData(name = "set-reviewers", description = "Add or remove reviewers on a change")
-public class SetReviewersCommand extends SshCommand {
-  private static final Logger log = LoggerFactory.getLogger(SetReviewersCommand.class);
-
-  @Option(name = "--project", aliases = "-p", usage = "project containing the change")
-  private ProjectControl projectControl;
-
-  @Option(
-      name = "--add",
-      aliases = {"-a"},
-      metaVar = "REVIEWER",
-      usage = "user or group that should be added as reviewer")
-  private List<String> toAdd = new ArrayList<>();
-
-  @Option(
-      name = "--remove",
-      aliases = {"-r"},
-      metaVar = "REVIEWER",
-      usage = "user that should be removed from the reviewer list")
-  void optionRemove(Account.Id who) {
-    toRemove.add(who);
-  }
-
-  @Argument(
-      index = 0,
-      required = true,
-      multiValued = true,
-      metaVar = "CHANGE",
-      usage = "changes to modify")
-  void addChange(String token) {
-    try {
-      changeArgumentParser.addChange(token, changes, projectControl);
-    } catch (UnloggedFailure e) {
-      throw new IllegalArgumentException(e.getMessage(), e);
-    } catch (OrmException e) {
-      throw new IllegalArgumentException("database is down", e);
-    } catch (PermissionBackendException e) {
-      throw new IllegalArgumentException("can't check permissions", e);
-    }
-  }
-
-  @Inject private ReviewerResource.Factory reviewerFactory;
-
-  @Inject private PostReviewers postReviewers;
-
-  @Inject private DeleteReviewer deleteReviewer;
-
-  @Inject private ChangeArgumentParser changeArgumentParser;
-
-  private Set<Account.Id> toRemove = new HashSet<>();
-
-  private Map<Change.Id, ChangeResource> changes = new LinkedHashMap<>();
-
-  @Override
-  protected void run() throws UnloggedFailure {
-    boolean ok = true;
-    for (ChangeResource rsrc : changes.values()) {
-      try {
-        ok &= modifyOne(rsrc);
-      } catch (Exception err) {
-        ok = false;
-        log.error("Error updating reviewers on change " + rsrc.getId(), err);
-        writeError("fatal", "internal error while updating " + rsrc.getId());
-      }
-    }
-
-    if (!ok) {
-      throw die("one or more updates failed; review output above");
-    }
-  }
-
-  private boolean modifyOne(ChangeResource changeRsrc) throws Exception {
-    boolean ok = true;
-
-    // Remove reviewers
-    //
-    for (Account.Id reviewer : toRemove) {
-      ReviewerResource rsrc = reviewerFactory.create(changeRsrc, reviewer);
-      String error = null;
-      try {
-        deleteReviewer.apply(rsrc, new DeleteReviewerInput());
-      } catch (ResourceNotFoundException e) {
-        error = String.format("could not remove %s: not found", reviewer);
-      } catch (Exception e) {
-        error = String.format("could not remove %s: %s", reviewer, e.getMessage());
-      }
-      if (error != null) {
-        ok = false;
-        writeError("error", error);
-      }
-    }
-
-    // Add reviewers
-    //
-    for (String reviewer : toAdd) {
-      AddReviewerInput input = new AddReviewerInput();
-      input.reviewer = reviewer;
-      input.confirmed = true;
-      String error;
-      try {
-        error = postReviewers.apply(changeRsrc, input).error;
-      } catch (Exception e) {
-        error = String.format("could not add %s: %s", reviewer, e.getMessage());
-      }
-      if (error != null) {
-        ok = false;
-        writeError("error", error);
-      }
-    }
-
-    return ok;
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ShowCaches.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ShowCaches.java
deleted file mode 100644
index 20e77c7..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ShowCaches.java
+++ /dev/null
@@ -1,345 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.sshd.commands;
-
-import static com.google.gerrit.common.data.GlobalCapability.MAINTAIN_SERVER;
-import static com.google.gerrit.common.data.GlobalCapability.VIEW_CACHES;
-import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.common.Version;
-import com.google.gerrit.extensions.annotations.RequiresAnyCapability;
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.config.ConfigResource;
-import com.google.gerrit.server.config.GetSummary;
-import com.google.gerrit.server.config.GetSummary.JvmSummaryInfo;
-import com.google.gerrit.server.config.GetSummary.MemSummaryInfo;
-import com.google.gerrit.server.config.GetSummary.SummaryInfo;
-import com.google.gerrit.server.config.GetSummary.TaskSummaryInfo;
-import com.google.gerrit.server.config.GetSummary.ThreadSummaryInfo;
-import com.google.gerrit.server.config.ListCaches;
-import com.google.gerrit.server.config.ListCaches.CacheInfo;
-import com.google.gerrit.server.config.ListCaches.CacheType;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.gerrit.sshd.SshDaemon;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.text.SimpleDateFormat;
-import java.util.Collection;
-import java.util.Date;
-import java.util.Map;
-import java.util.Map.Entry;
-import org.apache.sshd.common.io.IoAcceptor;
-import org.apache.sshd.common.io.IoSession;
-import org.apache.sshd.common.io.mina.MinaSession;
-import org.apache.sshd.server.Environment;
-import org.kohsuke.args4j.Option;
-
-/** Show the current cache states. */
-@RequiresAnyCapability({VIEW_CACHES, MAINTAIN_SERVER})
-@CommandMetaData(
-    name = "show-caches",
-    description = "Display current cache statistics",
-    runsAt = MASTER_OR_SLAVE)
-final class ShowCaches extends SshCommand {
-  private static volatile long serverStarted;
-
-  static class StartupListener implements LifecycleListener {
-    @Override
-    public void start() {
-      serverStarted = TimeUtil.nowMs();
-    }
-
-    @Override
-    public void stop() {}
-  }
-
-  @Option(name = "--gc", usage = "perform Java GC before printing memory stats")
-  private boolean gc;
-
-  @Option(name = "--show-jvm", usage = "show details about the JVM")
-  private boolean showJVM;
-
-  @Option(name = "--show-threads", usage = "show detailed thread counts")
-  private boolean showThreads;
-
-  @Inject private SshDaemon daemon;
-  @Inject private ListCaches listCaches;
-  @Inject private GetSummary getSummary;
-  @Inject private CurrentUser self;
-  @Inject private PermissionBackend permissionBackend;
-
-  @Option(
-      name = "--width",
-      aliases = {"-w"},
-      metaVar = "COLS",
-      usage = "width of output table")
-  private int columns = 80;
-
-  private int nw;
-
-  @Override
-  public void start(Environment env) throws IOException {
-    String s = env.getEnv().get(Environment.ENV_COLUMNS);
-    if (s != null && !s.isEmpty()) {
-      try {
-        columns = Integer.parseInt(s);
-      } catch (NumberFormatException err) {
-        columns = 80;
-      }
-    }
-    super.start(env);
-  }
-
-  @Override
-  protected void run() throws UnloggedFailure {
-    nw = columns - 50;
-    Date now = new Date();
-    stdout.format(
-        "%-25s %-20s      now  %16s\n",
-        "Gerrit Code Review",
-        Version.getVersion() != null ? Version.getVersion() : "",
-        new SimpleDateFormat("HH:mm:ss   zzz").format(now));
-    stdout.format("%-25s %-20s   uptime %16s\n", "", "", uptime(now.getTime() - serverStarted));
-    stdout.print('\n');
-
-    stdout.print(
-        String.format( //
-            "%1s %-" + nw + "s|%-21s|  %-5s |%-9s|\n" //
-            ,
-            "" //
-            ,
-            "Name" //
-            ,
-            "Entries" //
-            ,
-            "AvgGet" //
-            ,
-            "Hit Ratio" //
-            ));
-    stdout.print(
-        String.format( //
-            "%1s %-" + nw + "s|%6s %6s %7s|  %-5s  |%-4s %-4s|\n" //
-            ,
-            "" //
-            ,
-            "" //
-            ,
-            "Mem" //
-            ,
-            "Disk" //
-            ,
-            "Space" //
-            ,
-            "" //
-            ,
-            "Mem" //
-            ,
-            "Disk" //
-            ));
-    stdout.print("--");
-    for (int i = 0; i < nw; i++) {
-      stdout.print('-');
-    }
-    stdout.print("+---------------------+---------+---------+\n");
-
-    Collection<CacheInfo> caches = getCaches();
-    printMemoryCoreCaches(caches);
-    printMemoryPluginCaches(caches);
-    printDiskCaches(caches);
-    stdout.print('\n');
-
-    boolean showJvm;
-    try {
-      permissionBackend.user(self).check(GlobalPermission.MAINTAIN_SERVER);
-      showJvm = true;
-    } catch (AuthException | PermissionBackendException e) {
-      // Silently ignore and do not display detailed JVM information.
-      showJvm = false;
-    }
-    if (showJvm) {
-      sshSummary();
-
-      SummaryInfo summary = getSummary.setGc(gc).setJvm(showJVM).apply(new ConfigResource());
-      taskSummary(summary.taskSummary);
-      memSummary(summary.memSummary);
-      threadSummary(summary.threadSummary);
-
-      if (showJVM && summary.jvmSummary != null) {
-        jvmSummary(summary.jvmSummary);
-      }
-    }
-
-    stdout.flush();
-  }
-
-  private Collection<CacheInfo> getCaches() {
-    @SuppressWarnings("unchecked")
-    Map<String, CacheInfo> caches = (Map<String, CacheInfo>) listCaches.apply(new ConfigResource());
-    for (Map.Entry<String, CacheInfo> entry : caches.entrySet()) {
-      CacheInfo cache = entry.getValue();
-      cache.name = entry.getKey();
-    }
-    return caches.values();
-  }
-
-  private void printMemoryCoreCaches(Collection<CacheInfo> caches) {
-    for (CacheInfo cache : caches) {
-      if (!cache.name.contains("-") && CacheType.MEM.equals(cache.type)) {
-        printCache(cache);
-      }
-    }
-  }
-
-  private void printMemoryPluginCaches(Collection<CacheInfo> caches) {
-    for (CacheInfo cache : caches) {
-      if (cache.name.contains("-") && CacheType.MEM.equals(cache.type)) {
-        printCache(cache);
-      }
-    }
-  }
-
-  private void printDiskCaches(Collection<CacheInfo> caches) {
-    for (CacheInfo cache : caches) {
-      if (CacheType.DISK.equals(cache.type)) {
-        printCache(cache);
-      }
-    }
-  }
-
-  private void printCache(CacheInfo cache) {
-    stdout.print(
-        String.format(
-            "%1s %-" + nw + "s|%6s %6s %7s| %7s |%4s %4s|\n",
-            CacheType.DISK.equals(cache.type) ? "D" : "",
-            cache.name,
-            nullToEmpty(cache.entries.mem),
-            nullToEmpty(cache.entries.disk),
-            Strings.nullToEmpty(cache.entries.space),
-            Strings.nullToEmpty(cache.averageGet),
-            formatAsPercent(cache.hitRatio.mem),
-            formatAsPercent(cache.hitRatio.disk)));
-  }
-
-  private static String nullToEmpty(Long l) {
-    return l != null ? String.valueOf(l) : "";
-  }
-
-  private static String formatAsPercent(Integer i) {
-    return i != null ? String.valueOf(i) + "%" : "";
-  }
-
-  private void memSummary(MemSummaryInfo memSummary) {
-    stdout.format(
-        "Mem: %s total = %s used + %s free + %s buffers\n",
-        memSummary.total, memSummary.used, memSummary.free, memSummary.buffers);
-    stdout.format("     %s max\n", memSummary.max);
-    stdout.format("    %8d open files\n", nullToZero(memSummary.openFiles));
-    stdout.print('\n');
-  }
-
-  private void threadSummary(ThreadSummaryInfo threadSummary) {
-    stdout.format(
-        "Threads: %d CPUs available, %d threads\n", threadSummary.cpus, threadSummary.threads);
-
-    if (showThreads) {
-      stdout.print(String.format("  %22s", ""));
-      for (Thread.State s : Thread.State.values()) {
-        stdout.print(String.format(" %14s", s.name()));
-      }
-      stdout.print('\n');
-      for (Entry<String, Map<Thread.State, Integer>> e : threadSummary.counts.entrySet()) {
-        stdout.print(String.format("  %-22s", e.getKey()));
-        for (Thread.State s : Thread.State.values()) {
-          stdout.print(String.format(" %14d", nullToZero(e.getValue().get(s))));
-        }
-        stdout.print('\n');
-      }
-    }
-    stdout.print('\n');
-  }
-
-  private void taskSummary(TaskSummaryInfo taskSummary) {
-    stdout.format(
-        "Tasks: %4d  total = %4d running +   %4d ready + %4d sleeping\n",
-        nullToZero(taskSummary.total),
-        nullToZero(taskSummary.running),
-        nullToZero(taskSummary.ready),
-        nullToZero(taskSummary.sleeping));
-  }
-
-  private static int nullToZero(Integer i) {
-    return i != null ? i : 0;
-  }
-
-  private void sshSummary() {
-    IoAcceptor acceptor = daemon.getIoAcceptor();
-    if (acceptor == null) {
-      return;
-    }
-
-    long now = TimeUtil.nowMs();
-    Collection<IoSession> list = acceptor.getManagedSessions().values();
-    long oldest = now;
-
-    for (IoSession s : list) {
-      if (s instanceof MinaSession) {
-        MinaSession minaSession = (MinaSession) s;
-        oldest = Math.min(oldest, minaSession.getSession().getCreationTime());
-      }
-    }
-
-    stdout.format(
-        "SSH:   %4d  users, oldest session started %s ago\n", list.size(), uptime(now - oldest));
-  }
-
-  private void jvmSummary(JvmSummaryInfo jvmSummary) {
-    stdout.format("JVM: %s %s %s\n", jvmSummary.vmVendor, jvmSummary.vmName, jvmSummary.vmVersion);
-    stdout.format("  on %s %s %s\n", jvmSummary.osName, jvmSummary.osVersion, jvmSummary.osArch);
-    stdout.format("  running as %s on %s\n", jvmSummary.user, Strings.nullToEmpty(jvmSummary.host));
-    stdout.format("  cwd  %s\n", jvmSummary.currentWorkingDirectory);
-    stdout.format("  site %s\n", jvmSummary.site);
-  }
-
-  private String uptime(long uptimeMillis) {
-    if (uptimeMillis < 1000) {
-      return String.format("%3d ms", uptimeMillis);
-    }
-
-    long uptime = uptimeMillis / 1000L;
-
-    long min = uptime / 60;
-    if (min < 60) {
-      return String.format("%2d min %2d sec", min, uptime - min * 60);
-    }
-
-    long hr = uptime / 3600;
-    if (hr < 24) {
-      min = (uptime - hr * 3600) / 60;
-      return String.format("%2d hrs %2d min", hr, min);
-    }
-
-    long days = uptime / (24 * 3600);
-    hr = (uptime - (days * 24 * 3600)) / 3600;
-    return String.format("%4d days %2d hrs", days, hr);
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ShowConnections.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ShowConnections.java
deleted file mode 100644
index d3bb8fe..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ShowConnections.java
+++ /dev/null
@@ -1,241 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.sshd.commands;
-
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;
-
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.util.IdGenerator;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.gerrit.sshd.SshDaemon;
-import com.google.gerrit.sshd.SshSession;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.SocketAddress;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.List;
-import org.apache.sshd.common.io.IoAcceptor;
-import org.apache.sshd.common.io.IoSession;
-import org.apache.sshd.common.io.mina.MinaAcceptor;
-import org.apache.sshd.common.io.mina.MinaSession;
-import org.apache.sshd.common.io.nio2.Nio2Acceptor;
-import org.apache.sshd.common.session.helpers.AbstractSession;
-import org.apache.sshd.server.Environment;
-import org.kohsuke.args4j.Option;
-
-/** Show the current SSH connections. */
-@RequiresCapability(GlobalCapability.VIEW_CONNECTIONS)
-@CommandMetaData(
-    name = "show-connections",
-    description = "Display active client SSH connections",
-    runsAt = MASTER_OR_SLAVE)
-final class ShowConnections extends SshCommand {
-  @Option(
-      name = "--numeric",
-      aliases = {"-n"},
-      usage = "don't resolve names")
-  private boolean numeric;
-
-  @Option(
-      name = "--wide",
-      aliases = {"-w"},
-      usage = "display without line width truncation")
-  private boolean wide;
-
-  @Inject private SshDaemon daemon;
-
-  private int hostNameWidth;
-  private int columns = 80;
-
-  @Override
-  public void start(Environment env) throws IOException {
-    String s = env.getEnv().get(Environment.ENV_COLUMNS);
-    if (s != null && !s.isEmpty()) {
-      try {
-        columns = Integer.parseInt(s);
-      } catch (NumberFormatException err) {
-        columns = 80;
-      }
-    }
-    super.start(env);
-  }
-
-  @Override
-  protected void run() throws Failure {
-    final IoAcceptor acceptor = daemon.getIoAcceptor();
-    if (acceptor == null) {
-      throw new Failure(1, "fatal: sshd no longer running");
-    }
-
-    final List<IoSession> list = new ArrayList<>(acceptor.getManagedSessions().values());
-    Collections.sort(
-        list,
-        new Comparator<IoSession>() {
-          @Override
-          public int compare(IoSession arg0, IoSession arg1) {
-            if (arg0 instanceof MinaSession) {
-              MinaSession mArg0 = (MinaSession) arg0;
-              MinaSession mArg1 = (MinaSession) arg1;
-              if (mArg0.getSession().getCreationTime() < mArg1.getSession().getCreationTime()) {
-                return -1;
-              } else if (mArg0.getSession().getCreationTime()
-                  > mArg1.getSession().getCreationTime()) {
-                return 1;
-              }
-            }
-            return (int) (arg0.getId() - arg1.getId());
-          }
-        });
-
-    hostNameWidth = wide ? Integer.MAX_VALUE : columns - 9 - 9 - 10 - 32;
-
-    if (getBackend().equals("mina")) {
-      long now = TimeUtil.nowMs();
-      stdout.print(
-          String.format(
-              "%-8s %8s %8s   %-15s %s\n", "Session", "Start", "Idle", "User", "Remote Host"));
-      stdout.print("--------------------------------------------------------------\n");
-      for (IoSession io : list) {
-        checkState(io instanceof MinaSession, "expected MinaSession");
-        MinaSession minaSession = (MinaSession) io;
-        long start = minaSession.getSession().getCreationTime();
-        long idle = now - minaSession.getSession().getLastIoTime();
-        AbstractSession s = AbstractSession.getSession(io, true);
-        SshSession sd = s != null ? s.getAttribute(SshSession.KEY) : null;
-
-        stdout.print(
-            String.format(
-                "%8s %8s %8s   %-15.15s %s\n",
-                id(sd),
-                time(now, start),
-                age(idle),
-                username(sd),
-                hostname(io.getRemoteAddress())));
-      }
-    } else {
-      stdout.print(String.format("%-8s   %-15s %s\n", "Session", "User", "Remote Host"));
-      stdout.print("--------------------------------------------------------------\n");
-      for (IoSession io : list) {
-        AbstractSession s = AbstractSession.getSession(io, true);
-        SshSession sd = s != null ? s.getAttribute(SshSession.KEY) : null;
-
-        stdout.print(
-            String.format(
-                "%8s   %-15.15s %s\n", id(sd), username(sd), hostname(io.getRemoteAddress())));
-      }
-    }
-
-    stdout.print("--\n");
-    stdout.print("SSHD Backend: " + getBackend() + "\n");
-  }
-
-  private String getBackend() {
-    IoAcceptor acceptor = daemon.getIoAcceptor();
-    if (acceptor == null) {
-      return "";
-    } else if (acceptor instanceof MinaAcceptor) {
-      return "mina";
-    } else if (acceptor instanceof Nio2Acceptor) {
-      return "nio2";
-    } else {
-      return "unknown";
-    }
-  }
-
-  private static String id(SshSession sd) {
-    return sd != null ? IdGenerator.format(sd.getSessionId()) : "";
-  }
-
-  private static String time(long now, long time) {
-    if (now - time < 24 * 60 * 60 * 1000L) {
-      return new SimpleDateFormat("HH:mm:ss").format(new Date(time));
-    }
-    return new SimpleDateFormat("MMM-dd").format(new Date(time));
-  }
-
-  private static String age(long age) {
-    age /= 1000;
-
-    final int sec = (int) (age % 60);
-    age /= 60;
-
-    final int min = (int) (age % 60);
-    age /= 60;
-
-    final int hr = (int) (age % 60);
-    return String.format("%02d:%02d:%02d", hr, min, sec);
-  }
-
-  private String username(SshSession sd) {
-    if (sd == null) {
-      return "";
-    }
-
-    final CurrentUser user = sd.getUser();
-    if (user != null && user.isIdentifiedUser()) {
-      IdentifiedUser u = user.asIdentifiedUser();
-
-      if (!numeric) {
-        String name = u.getAccount().getUserName();
-        if (name != null && !name.isEmpty()) {
-          return name;
-        }
-      }
-
-      return "a/" + u.getAccountId().toString();
-    }
-    return "";
-  }
-
-  private String hostname(SocketAddress remoteAddress) {
-    if (remoteAddress == null) {
-      return "?";
-    }
-    String host = null;
-    if (remoteAddress instanceof InetSocketAddress) {
-      final InetSocketAddress sa = (InetSocketAddress) remoteAddress;
-      final InetAddress in = sa.getAddress();
-      if (numeric) {
-        return in.getHostAddress();
-      }
-      if (in != null) {
-        host = in.getCanonicalHostName();
-      } else {
-        host = sa.getHostName();
-      }
-    }
-    if (host == null) {
-      host = remoteAddress.toString();
-    }
-
-    if (host.length() > hostNameWidth) {
-      return host.substring(0, hostNameWidth);
-    }
-
-    return host;
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ShowQueue.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ShowQueue.java
deleted file mode 100644
index 84c460f..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ShowQueue.java
+++ /dev/null
@@ -1,209 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.sshd.commands;
-
-import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.collect.LinkedListMultimap;
-import com.google.common.collect.ListMultimap;
-import com.google.gerrit.common.TimeUtil;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.config.ConfigResource;
-import com.google.gerrit.server.config.ListTasks;
-import com.google.gerrit.server.config.ListTasks.TaskInfo;
-import com.google.gerrit.server.git.WorkQueue;
-import com.google.gerrit.server.git.WorkQueue.Task;
-import com.google.gerrit.server.permissions.GlobalPermission;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.sshd.AdminHighPriorityCommand;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.List;
-import java.util.concurrent.ScheduledThreadPoolExecutor;
-import org.apache.sshd.server.Environment;
-import org.kohsuke.args4j.Option;
-
-/** Display the current work queue. */
-@AdminHighPriorityCommand
-@CommandMetaData(
-    name = "show-queue",
-    description = "Display the background work queues",
-    runsAt = MASTER_OR_SLAVE)
-final class ShowQueue extends SshCommand {
-  @Option(
-      name = "--wide",
-      aliases = {"-w"},
-      usage = "display without line width truncation")
-  private boolean wide;
-
-  @Option(
-      name = "--by-queue",
-      aliases = {"-q"},
-      usage = "group tasks by queue and print queue info")
-  private boolean groupByQueue;
-
-  @Inject private PermissionBackend permissionBackend;
-  @Inject private ListTasks listTasks;
-  @Inject private IdentifiedUser currentUser;
-  @Inject private WorkQueue workQueue;
-
-  private int columns = 80;
-  private int maxCommandWidth;
-
-  @Override
-  public void start(Environment env) throws IOException {
-    String s = env.getEnv().get(Environment.ENV_COLUMNS);
-    if (s != null && !s.isEmpty()) {
-      try {
-        columns = Integer.parseInt(s);
-      } catch (NumberFormatException err) {
-        columns = 80;
-      }
-    }
-    super.start(env);
-  }
-
-  @Override
-  protected void run() throws Failure {
-    maxCommandWidth = wide ? Integer.MAX_VALUE : columns - 8 - 12 - 12 - 4 - 4;
-    stdout.print(
-        String.format(
-            "%-8s %-12s %-12s %-4s %s\n", //
-            "Task", "State", "StartTime", "", "Command"));
-    stdout.print(
-        "------------------------------------------------------------------------------\n");
-
-    List<TaskInfo> tasks;
-    try {
-      tasks = listTasks.apply(new ConfigResource());
-    } catch (AuthException e) {
-      throw die(e);
-    } catch (PermissionBackendException e) {
-      throw new Failure(1, "permission backend unavailable", e);
-    }
-
-    boolean viewAll = permissionBackend.user(currentUser).testOrFalse(GlobalPermission.VIEW_QUEUE);
-    long now = TimeUtil.nowMs();
-    if (groupByQueue) {
-      ListMultimap<String, TaskInfo> byQueue = byQueue(tasks);
-      for (String queueName : byQueue.keySet()) {
-        ScheduledThreadPoolExecutor e = workQueue.getExecutor(queueName);
-        stdout.print(String.format("Queue: %s\n", queueName));
-        print(byQueue.get(queueName), now, viewAll, e.getCorePoolSize());
-      }
-    } else {
-      print(tasks, now, viewAll, 0);
-    }
-  }
-
-  private ListMultimap<String, TaskInfo> byQueue(List<TaskInfo> tasks) {
-    ListMultimap<String, TaskInfo> byQueue = LinkedListMultimap.create();
-    for (TaskInfo task : tasks) {
-      byQueue.put(task.queueName, task);
-    }
-    return byQueue;
-  }
-
-  private void print(List<TaskInfo> tasks, long now, boolean viewAll, int threadPoolSize) {
-    for (TaskInfo task : tasks) {
-      String start;
-      switch (task.state) {
-        case DONE:
-        case CANCELLED:
-        case RUNNING:
-        case READY:
-          start = format(task.state);
-          break;
-        case OTHER:
-        case SLEEPING:
-        default:
-          start = time(now, task.delay);
-          break;
-      }
-
-      // Shows information about tasks depending on the user rights
-      if (viewAll || task.projectName == null) {
-        String command =
-            task.command.length() < maxCommandWidth
-                ? task.command
-                : task.command.substring(0, maxCommandWidth);
-
-        stdout.print(
-            String.format(
-                "%8s %-12s %-12s %-4s %s\n",
-                task.id, start, startTime(task.startTime), "", command));
-      } else {
-        String remoteName =
-            task.remoteName != null ? task.remoteName + "/" + task.projectName : task.projectName;
-
-        stdout.print(
-            String.format(
-                "%8s %-12s %-4s %s\n",
-                task.id,
-                start,
-                startTime(task.startTime),
-                MoreObjects.firstNonNull(remoteName, "n/a")));
-      }
-    }
-    stdout.print(
-        "------------------------------------------------------------------------------\n");
-    stdout.print("  " + tasks.size() + " tasks");
-    if (threadPoolSize > 0) {
-      stdout.print(", " + threadPoolSize + " worker threads");
-    }
-    stdout.print("\n\n");
-  }
-
-  private static String time(long now, long delay) {
-    Date when = new Date(now + delay);
-    return format(when, delay);
-  }
-
-  private static String startTime(Date when) {
-    return format(when, TimeUtil.nowMs() - when.getTime());
-  }
-
-  private static String format(Date when, long timeFromNow) {
-    if (timeFromNow < 24 * 60 * 60 * 1000L) {
-      return new SimpleDateFormat("HH:mm:ss.SSS").format(when);
-    }
-    return new SimpleDateFormat("MMM-dd HH:mm").format(when);
-  }
-
-  private static String format(Task.State state) {
-    switch (state) {
-      case DONE:
-        return "....... done";
-      case CANCELLED:
-        return "..... killed";
-      case RUNNING:
-        return "";
-      case READY:
-        return "waiting ....";
-      case SLEEPING:
-        return "sleeping";
-      case OTHER:
-      default:
-        return state.toString();
-    }
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/StreamEvents.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/StreamEvents.java
deleted file mode 100644
index e842210..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/StreamEvents.java
+++ /dev/null
@@ -1,290 +0,0 @@
-// Copyright (C) 2010 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.google.gerrit.sshd.commands;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.base.Supplier;
-import com.google.gerrit.common.UserScopedEventListener;
-import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.registration.RegistrationHandle;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.events.Event;
-import com.google.gerrit.server.events.EventTypes;
-import com.google.gerrit.server.events.ProjectNameKeySerializer;
-import com.google.gerrit.server.events.SupplierSerializer;
-import com.google.gerrit.server.git.WorkQueue.CancelableRunnable;
-import com.google.gerrit.sshd.BaseCommand;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.StreamCommandExecutor;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.Future;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ScheduledThreadPoolExecutor;
-import org.apache.sshd.server.Environment;
-import org.kohsuke.args4j.Option;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@RequiresCapability(GlobalCapability.STREAM_EVENTS)
-@CommandMetaData(name = "stream-events", description = "Monitor events occurring in real time")
-final class StreamEvents extends BaseCommand {
-  private static final Logger log = LoggerFactory.getLogger(StreamEvents.class);
-
-  /** Maximum number of events that may be queued up for each connection. */
-  private static final int MAX_EVENTS = 128;
-
-  /** Number of events to write before yielding off the thread. */
-  private static final int BATCH_SIZE = 32;
-
-  @Option(
-      name = "--subscribe",
-      aliases = {"-s"},
-      metaVar = "SUBSCRIBE",
-      usage = "subscribe to specific stream-events")
-  private List<String> subscribedToEvents = new ArrayList<>();
-
-  @Inject private IdentifiedUser currentUser;
-
-  @Inject private DynamicSet<UserScopedEventListener> eventListeners;
-
-  @Inject @StreamCommandExecutor private ScheduledThreadPoolExecutor pool;
-
-  /** Queue of events to stream to the connected user. */
-  private final LinkedBlockingQueue<Event> queue = new LinkedBlockingQueue<>(MAX_EVENTS);
-
-  private Gson gson;
-
-  private RegistrationHandle eventListenerRegistration;
-
-  /** Special event to notify clients they missed other events. */
-  private static final class DroppedOutputEvent extends Event {
-    private static final String TYPE = "dropped-output";
-
-    DroppedOutputEvent() {
-      super(TYPE);
-    }
-  }
-
-  static {
-    EventTypes.register(DroppedOutputEvent.TYPE, DroppedOutputEvent.class);
-  }
-
-  private final CancelableRunnable writer =
-      new CancelableRunnable() {
-        @Override
-        public void run() {
-          writeEvents();
-        }
-
-        @Override
-        public void cancel() {
-          onExit(0);
-        }
-
-        @Override
-        public String toString() {
-          return "Stream Events (" + currentUser.getAccount().getUserName() + ")";
-        }
-      };
-
-  /** True if {@link DroppedOutputEvent} needs to be sent. */
-  private volatile boolean dropped;
-
-  /** Lock to protect {@link #queue}, {@link #task}, {@link #done}. */
-  private final Object taskLock = new Object();
-
-  /** True if no more messages should be sent to the output. */
-  private boolean done;
-
-  /**
-   * Currently scheduled task to spin out {@link #queue}.
-   *
-   * <p>This field is usually {@code null}, unless there is at least one object present inside of
-   * {@link #queue} ready for delivery. Tasks are only started when there are events to be sent.
-   */
-  private Future<?> task;
-
-  private PrintWriter stdout;
-
-  @Override
-  public void start(Environment env) throws IOException {
-    try {
-      parseCommandLine();
-    } catch (UnloggedFailure e) {
-      String msg = e.getMessage();
-      if (!msg.endsWith("\n")) {
-        msg += "\n";
-      }
-      err.write(msg.getBytes(UTF_8));
-      err.flush();
-      onExit(1);
-      return;
-    }
-
-    stdout = toPrintWriter(out);
-    eventListenerRegistration =
-        eventListeners.add(
-            new UserScopedEventListener() {
-              @Override
-              public void onEvent(Event event) {
-                if (subscribedToEvents.isEmpty() || subscribedToEvents.contains(event.getType())) {
-                  offer(event);
-                }
-              }
-
-              @Override
-              public CurrentUser getUser() {
-                return currentUser;
-              }
-            });
-
-    gson =
-        new GsonBuilder()
-            .registerTypeAdapter(Supplier.class, new SupplierSerializer())
-            .registerTypeAdapter(Project.NameKey.class, new ProjectNameKeySerializer())
-            .create();
-  }
-
-  private void removeEventListenerRegistration() {
-    if (eventListenerRegistration != null) {
-      eventListenerRegistration.remove();
-    }
-  }
-
-  @Override
-  protected void onExit(int rc) {
-    removeEventListenerRegistration();
-
-    synchronized (taskLock) {
-      done = true;
-    }
-
-    super.onExit(rc);
-  }
-
-  @Override
-  public void destroy() {
-    removeEventListenerRegistration();
-
-    final boolean exit;
-    synchronized (taskLock) {
-      if (task != null) {
-        task.cancel(true);
-        exit = false; // onExit will be invoked by the task cancellation.
-      } else {
-        exit = !done;
-      }
-      done = true;
-    }
-    if (exit) {
-      onExit(0);
-    }
-  }
-
-  private void offer(Event event) {
-    synchronized (taskLock) {
-      if (!queue.offer(event)) {
-        dropped = true;
-      }
-
-      if (task == null && !done) {
-        task = pool.submit(writer);
-      }
-    }
-  }
-
-  private Event poll() {
-    synchronized (taskLock) {
-      Event event = queue.poll();
-      if (event == null) {
-        task = null;
-      }
-      return event;
-    }
-  }
-
-  private void writeEvents() {
-    int processed = 0;
-
-    while (processed < BATCH_SIZE) {
-      if (Thread.interrupted() || stdout.checkError()) {
-        // The other side either requested a shutdown by calling our
-        // destroy() above, or it closed the stream and is no longer
-        // accepting output. Either way terminate this instance.
-        //
-        removeEventListenerRegistration();
-        flush();
-        onExit(0);
-        return;
-      }
-
-      if (dropped) {
-        write(new DroppedOutputEvent());
-        dropped = false;
-      }
-
-      final Event event = poll();
-      if (event == null) {
-        break;
-      }
-
-      write(event);
-      processed++;
-    }
-
-    flush();
-
-    if (BATCH_SIZE <= processed) {
-      // We processed the limit, but more might remain in the queue.
-      // Schedule the write task again so we will come back here and
-      // can process more events.
-      //
-      synchronized (taskLock) {
-        task = pool.submit(writer);
-      }
-    }
-  }
-
-  private void write(Object message) {
-    String msg = null;
-    try {
-      msg = gson.toJson(message) + "\n";
-    } catch (Exception e) {
-      log.warn("Could not deserialize the msg: ", e);
-    }
-    if (msg != null) {
-      synchronized (stdout) {
-        stdout.print(msg);
-      }
-    }
-  }
-
-  private void flush() {
-    synchronized (stdout) {
-      stdout.flush();
-    }
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/TestSubmitRuleCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/TestSubmitRuleCommand.java
deleted file mode 100644
index a7d529b..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/TestSubmitRuleCommand.java
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.sshd.commands;
-
-import com.google.gerrit.extensions.common.TestSubmitRuleInput;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.server.change.RevisionResource;
-import com.google.gerrit.server.change.TestSubmitRule;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.inject.Inject;
-
-/** Command that allows testing of prolog submit-rules in a live instance. */
-@CommandMetaData(name = "rule", description = "Test prolog submit rules")
-final class TestSubmitRuleCommand extends BaseTestPrologCommand {
-  @Inject private TestSubmitRule view;
-
-  @Override
-  protected RestModifyView<RevisionResource, TestSubmitRuleInput> createView() {
-    return view;
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/TestSubmitTypeCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/TestSubmitTypeCommand.java
deleted file mode 100644
index ebe8925..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/TestSubmitTypeCommand.java
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (C) 2012 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.google.gerrit.sshd.commands;
-
-import com.google.gerrit.extensions.common.TestSubmitRuleInput;
-import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.server.change.RevisionResource;
-import com.google.gerrit.server.change.TestSubmitType;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.inject.Inject;
-
-@CommandMetaData(name = "type", description = "Test prolog submit type")
-final class TestSubmitTypeCommand extends BaseTestPrologCommand {
-  @Inject private TestSubmitType view;
-
-  @Override
-  protected RestModifyView<RevisionResource, TestSubmitRuleInput> createView() {
-    return view;
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Upload.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Upload.java
deleted file mode 100644
index 7049c7f..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Upload.java
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright (C) 2008 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.google.gerrit.sshd.commands;
-
-import com.google.common.collect.Lists;
-import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.server.git.TransferConfig;
-import com.google.gerrit.server.git.UploadPackInitializer;
-import com.google.gerrit.server.git.VisibleRefFilter;
-import com.google.gerrit.server.git.validators.UploadValidationException;
-import com.google.gerrit.server.git.validators.UploadValidators;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.ProjectPermission;
-import com.google.gerrit.sshd.AbstractGitCommand;
-import com.google.gerrit.sshd.SshSession;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.util.List;
-import org.eclipse.jgit.transport.PostUploadHook;
-import org.eclipse.jgit.transport.PostUploadHookChain;
-import org.eclipse.jgit.transport.PreUploadHook;
-import org.eclipse.jgit.transport.PreUploadHookChain;
-import org.eclipse.jgit.transport.UploadPack;
-
-/** Publishes Git repositories over SSH using the Git upload-pack protocol. */
-final class Upload extends AbstractGitCommand {
-  @Inject private TransferConfig config;
-  @Inject private VisibleRefFilter.Factory refFilterFactory;
-  @Inject private DynamicSet<PreUploadHook> preUploadHooks;
-  @Inject private DynamicSet<PostUploadHook> postUploadHooks;
-  @Inject private DynamicSet<UploadPackInitializer> uploadPackInitializers;
-  @Inject private UploadValidators.Factory uploadValidatorsFactory;
-  @Inject private SshSession session;
-  @Inject private PermissionBackend permissionBackend;
-
-  @Override
-  protected void runImpl() throws IOException, Failure {
-    try {
-      permissionBackend
-          .user(projectControl.getUser())
-          .project(projectControl.getProject().getNameKey())
-          .check(ProjectPermission.RUN_UPLOAD_PACK);
-    } catch (AuthException e) {
-      throw new Failure(1, "fatal: upload-pack not permitted on this server");
-    } catch (PermissionBackendException e) {
-      throw new Failure(1, "fatal: unable to check permissions " + e);
-    }
-
-    final UploadPack up = new UploadPack(repo);
-    up.setAdvertiseRefsHook(refFilterFactory.create(projectControl.getProjectState(), repo));
-    up.setPackConfig(config.getPackConfig());
-    up.setTimeout(config.getTimeout());
-    up.setPostUploadHook(PostUploadHookChain.newChain(Lists.newArrayList(postUploadHooks)));
-
-    List<PreUploadHook> allPreUploadHooks = Lists.newArrayList(preUploadHooks);
-    allPreUploadHooks.add(
-        uploadValidatorsFactory.create(project, repo, session.getRemoteAddressAsString()));
-    up.setPreUploadHook(PreUploadHookChain.newChain(allPreUploadHooks));
-    for (UploadPackInitializer initializer : uploadPackInitializers) {
-      initializer.init(projectControl.getProject().getNameKey(), up);
-    }
-    try {
-      up.upload(in, out, err);
-      session.setPeerAgent(up.getPeerUserAgent());
-    } catch (UploadValidationException e) {
-      // UploadValidationException is used by the UploadValidators to
-      // stop the uploadPack. We do not want this exception to go beyond this
-      // point otherwise it would print a stacktrace in the logs and return an
-      // internal server error to the client.
-      if (!e.isOutput()) {
-        up.sendMessage(e.getMessage());
-      }
-    }
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/UploadArchive.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/UploadArchive.java
deleted file mode 100644
index f90650f..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/UploadArchive.java
+++ /dev/null
@@ -1,254 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.sshd.commands;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.change.AllowedFormats;
-import com.google.gerrit.server.change.ArchiveFormat;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.permissions.PermissionBackendException;
-import com.google.gerrit.server.permissions.ProjectPermission;
-import com.google.gerrit.server.project.CommitsCollection;
-import com.google.gerrit.sshd.AbstractGitCommand;
-import com.google.inject.Inject;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import org.eclipse.jgit.api.ArchiveCommand;
-import org.eclipse.jgit.api.errors.GitAPIException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.transport.PacketLineIn;
-import org.eclipse.jgit.transport.PacketLineOut;
-import org.eclipse.jgit.transport.SideBandOutputStream;
-import org.kohsuke.args4j.Argument;
-import org.kohsuke.args4j.CmdLineException;
-import org.kohsuke.args4j.CmdLineParser;
-import org.kohsuke.args4j.Option;
-
-/** Allows getting archives for Git repositories over SSH using the Git upload-archive protocol. */
-public class UploadArchive extends AbstractGitCommand {
-  /**
-   * Options for parsing Git commands.
-   *
-   * <p>These options are not passed on command line, but received through input stream in pkt-line
-   * format.
-   */
-  static class Options {
-    @Option(
-        name = "-f",
-        aliases = {"--format"},
-        usage =
-            "Format of the"
-                + " resulting archive: tar or zip... If this option is not given, and"
-                + " the output file is specified, the format is inferred from the"
-                + " filename if possible (e.g. writing to \"foo.zip\" makes the output"
-                + " to be in the zip format). Otherwise the output format is tar.")
-    private String format = "tar";
-
-    @Option(name = "--prefix", usage = "Prepend <prefix>/ to each filename in the archive.")
-    private String prefix;
-
-    @Option(name = "-0", usage = "Store the files instead of deflating them.")
-    private boolean level0;
-
-    @Option(name = "-1")
-    private boolean level1;
-
-    @Option(name = "-2")
-    private boolean level2;
-
-    @Option(name = "-3")
-    private boolean level3;
-
-    @Option(name = "-4")
-    private boolean level4;
-
-    @Option(name = "-5")
-    private boolean level5;
-
-    @Option(name = "-6")
-    private boolean level6;
-
-    @Option(name = "-7")
-    private boolean level7;
-
-    @Option(name = "-8")
-    private boolean level8;
-
-    @Option(
-        name = "-9",
-        usage =
-            "Highest and slowest compression level. You "
-                + "can specify any number from 1 to 9 to adjust compression speed and "
-                + "ratio.")
-    private boolean level9;
-
-    @Argument(index = 0, required = true, usage = "The tree or commit to produce an archive for.")
-    private String treeIsh = "master";
-
-    @Argument(
-        index = 1,
-        multiValued = true,
-        usage =
-            "Without an optional path parameter, all files and subdirectories of "
-                + "the current working directory are included in the archive. If one "
-                + "or more paths are specified, only these are included.")
-    private List<String> path;
-  }
-
-  @Inject private PermissionBackend permissionBackend;
-  @Inject private CommitsCollection commits;
-  @Inject private IdentifiedUser user;
-  @Inject private AllowedFormats allowedFormats;
-  private Options options = new Options();
-
-  /**
-   * Read and parse arguments from input stream. This method gets the arguments from input stream,
-   * in Pkt-line format, then parses them to fill the options object.
-   */
-  protected void readArguments() throws IOException, Failure {
-    String argCmd = "argument ";
-    List<String> args = new ArrayList<>();
-
-    // Read arguments in Pkt-Line format
-    PacketLineIn packetIn = new PacketLineIn(in);
-    for (; ; ) {
-      String s = packetIn.readString();
-      if (s == PacketLineIn.END) {
-        break;
-      }
-      if (!s.startsWith(argCmd)) {
-        throw new Failure(1, "fatal: 'argument' token or flush expected");
-      }
-      String[] parts = s.substring(argCmd.length()).split("=", 2);
-      for (String p : parts) {
-        args.add(p);
-      }
-    }
-
-    try {
-      // Parse them into the 'options' field
-      CmdLineParser parser = new CmdLineParser(options);
-      parser.parseArgument(args);
-      if (options.path == null || Arrays.asList(".").equals(options.path)) {
-        options.path = Collections.emptyList();
-      }
-    } catch (CmdLineException e) {
-      throw new Failure(2, "fatal: unable to parse arguments, " + e);
-    }
-  }
-
-  @Override
-  protected void runImpl() throws IOException, PermissionBackendException, Failure {
-    PacketLineOut packetOut = new PacketLineOut(out);
-    packetOut.setFlushOnEnd(true);
-    packetOut.writeString("ACK");
-    packetOut.end();
-
-    try {
-      // Parse Git arguments
-      readArguments();
-
-      ArchiveFormat f = allowedFormats.getExtensions().get("." + options.format);
-      if (f == null) {
-        throw new Failure(3, "fatal: upload-archive not permitted");
-      }
-
-      // Find out the object to get from the specified reference and paths
-      ObjectId treeId = repo.resolve(options.treeIsh);
-      if (treeId == null) {
-        throw new Failure(4, "fatal: reference not found");
-      }
-
-      // Verify the user has permissions to read the specified tree.
-      if (!canRead(treeId)) {
-        throw new Failure(5, "fatal: cannot perform upload-archive operation");
-      }
-
-      // The archive is sent in DATA sideband channel
-      try (SideBandOutputStream sidebandOut =
-          new SideBandOutputStream(
-              SideBandOutputStream.CH_DATA, SideBandOutputStream.MAX_BUF, out)) {
-        new ArchiveCommand(repo)
-            .setFormat(f.name())
-            .setFormatOptions(getFormatOptions(f))
-            .setTree(treeId)
-            .setPaths(options.path.toArray(new String[0]))
-            .setPrefix(options.prefix)
-            .setOutputStream(sidebandOut)
-            .call();
-        sidebandOut.flush();
-      } catch (GitAPIException e) {
-        throw new Failure(7, "fatal: git api exception, " + e);
-      }
-    } catch (Failure f) {
-      // Report the error in ERROR sideband channel
-      try (SideBandOutputStream sidebandError =
-          new SideBandOutputStream(
-              SideBandOutputStream.CH_ERROR, SideBandOutputStream.MAX_BUF, out)) {
-        sidebandError.write(f.getMessage().getBytes(UTF_8));
-        sidebandError.flush();
-      }
-      throw f;
-    } finally {
-      // In any case, cleanly close the packetOut channel
-      packetOut.end();
-    }
-  }
-
-  private Map<String, Object> getFormatOptions(ArchiveFormat f) {
-    if (f == ArchiveFormat.ZIP) {
-      int value =
-          Arrays.asList(
-                  options.level0,
-                  options.level1,
-                  options.level2,
-                  options.level3,
-                  options.level4,
-                  options.level5,
-                  options.level6,
-                  options.level7,
-                  options.level8,
-                  options.level9)
-              .indexOf(true);
-      if (value >= 0) {
-        return ImmutableMap.<String, Object>of("level", Integer.valueOf(value));
-      }
-    }
-    return Collections.emptyMap();
-  }
-
-  private boolean canRead(ObjectId revId) throws IOException, PermissionBackendException {
-    try {
-      permissionBackend.user(user).project(projectName).check(ProjectPermission.READ);
-      return true;
-    } catch (AuthException e) {
-      // Check reachability of the specific revision.
-      try (RevWalk rw = new RevWalk(repo)) {
-        RevCommit commit = rw.parseCommit(revId);
-        return commits.canRead(state, repo, commit);
-      }
-    }
-  }
-}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/plugin/LfsPluginAuthCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/plugin/LfsPluginAuthCommand.java
deleted file mode 100644
index b44f0fc..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/plugin/LfsPluginAuthCommand.java
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.sshd.plugin;
-
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.sshd.CommandModule;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.util.ArrayList;
-import java.util.List;
-import org.eclipse.jgit.lib.Config;
-import org.kohsuke.args4j.Argument;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class LfsPluginAuthCommand extends SshCommand {
-  private static final Logger log = LoggerFactory.getLogger(LfsPluginAuthCommand.class);
-  private static final String CONFIGURATION_ERROR =
-      "Server configuration error: LFS auth over SSH is not properly configured.";
-
-  public interface LfsSshPluginAuth {
-    String authenticate(CurrentUser user, List<String> args) throws UnloggedFailure, Failure;
-  }
-
-  public static class Module extends CommandModule {
-    private final boolean pluginProvided;
-
-    @Inject
-    Module(@GerritServerConfig Config cfg) {
-      pluginProvided = cfg.getString("lfs", null, "plugin") != null;
-    }
-
-    @Override
-    protected void configure() {
-      if (pluginProvided) {
-        command("git-lfs-authenticate").to(LfsPluginAuthCommand.class);
-        DynamicItem.itemOf(binder(), LfsSshPluginAuth.class);
-      }
-    }
-  }
-
-  private final DynamicItem<LfsSshPluginAuth> auth;
-  private final Provider<CurrentUser> user;
-
-  @Argument(index = 0, multiValued = true, metaVar = "PARAMS")
-  private List<String> args = new ArrayList<>();
-
-  @Inject
-  LfsPluginAuthCommand(DynamicItem<LfsSshPluginAuth> auth, Provider<CurrentUser> user) {
-    this.auth = auth;
-    this.user = user;
-  }
-
-  @Override
-  protected void run() throws UnloggedFailure, Exception {
-    LfsSshPluginAuth pluginAuth = auth.get();
-    if (pluginAuth == null) {
-      log.warn(CONFIGURATION_ERROR);
-      throw new UnloggedFailure(1, CONFIGURATION_ERROR);
-    }
-
-    stdout.print(pluginAuth.authenticate(user.get(), args));
-  }
-}
diff --git a/gerrit-test-util/BUILD b/gerrit-test-util/BUILD
deleted file mode 100644
index 55954ba..0000000
--- a/gerrit-test-util/BUILD
+++ /dev/null
@@ -1,10 +0,0 @@
-java_library(
-    name = "test_util",
-    testonly = 1,
-    srcs = glob(["src/main/java/**/*.java"]),
-    visibility = ["//visibility:public"],
-    deps = [
-        "//gerrit-extension-api:api",
-        "//lib:truth",
-    ],
-)
diff --git a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/client/RangeSubject.java b/gerrit-test-util/src/main/java/com/google/gerrit/extensions/client/RangeSubject.java
deleted file mode 100644
index 70f5ec6..0000000
--- a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/client/RangeSubject.java
+++ /dev/null
@@ -1,72 +0,0 @@
-// 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.
-
-package com.google.gerrit.extensions.client;
-
-import static com.google.common.truth.Truth.assertAbout;
-
-import com.google.common.truth.FailureStrategy;
-import com.google.common.truth.IntegerSubject;
-import com.google.common.truth.Subject;
-import com.google.common.truth.SubjectFactory;
-import com.google.common.truth.Truth;
-
-public class RangeSubject extends Subject<RangeSubject, Comment.Range> {
-
-  private static final SubjectFactory<RangeSubject, Comment.Range> RANGE_SUBJECT_FACTORY =
-      new SubjectFactory<RangeSubject, Comment.Range>() {
-        @Override
-        public RangeSubject getSubject(FailureStrategy failureStrategy, Comment.Range range) {
-          return new RangeSubject(failureStrategy, range);
-        }
-      };
-
-  public static RangeSubject assertThat(Comment.Range range) {
-    return assertAbout(RANGE_SUBJECT_FACTORY).that(range);
-  }
-
-  private RangeSubject(FailureStrategy failureStrategy, Comment.Range range) {
-    super(failureStrategy, range);
-  }
-
-  public IntegerSubject startLine() {
-    return Truth.assertThat(actual().startLine).named("startLine");
-  }
-
-  public IntegerSubject startCharacter() {
-    return Truth.assertThat(actual().startCharacter).named("startCharacter");
-  }
-
-  public IntegerSubject endLine() {
-    return Truth.assertThat(actual().endLine).named("endLine");
-  }
-
-  public IntegerSubject endCharacter() {
-    return Truth.assertThat(actual().endCharacter).named("endCharacter");
-  }
-
-  public void isValid() {
-    isNotNull();
-    if (!actual().isValid()) {
-      fail("is valid");
-    }
-  }
-
-  public void isInvalid() {
-    isNotNull();
-    if (actual().isValid()) {
-      fail("is invalid");
-    }
-  }
-}
diff --git a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/CommitInfoSubject.java b/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/CommitInfoSubject.java
deleted file mode 100644
index b2717af..0000000
--- a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/CommitInfoSubject.java
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.extensions.common;
-
-import static com.google.common.truth.Truth.assertAbout;
-
-import com.google.common.truth.FailureStrategy;
-import com.google.common.truth.StringSubject;
-import com.google.common.truth.Subject;
-import com.google.common.truth.SubjectFactory;
-import com.google.common.truth.Truth;
-import com.google.gerrit.truth.ListSubject;
-
-public class CommitInfoSubject extends Subject<CommitInfoSubject, CommitInfo> {
-
-  private static final SubjectFactory<CommitInfoSubject, CommitInfo> COMMIT_INFO_SUBJECT_FACTORY =
-      new SubjectFactory<CommitInfoSubject, CommitInfo>() {
-        @Override
-        public CommitInfoSubject getSubject(
-            FailureStrategy failureStrategy, CommitInfo commitInfo) {
-          return new CommitInfoSubject(failureStrategy, commitInfo);
-        }
-      };
-
-  public static CommitInfoSubject assertThat(CommitInfo commitInfo) {
-    return assertAbout(COMMIT_INFO_SUBJECT_FACTORY).that(commitInfo);
-  }
-
-  private CommitInfoSubject(FailureStrategy failureStrategy, CommitInfo commitInfo) {
-    super(failureStrategy, commitInfo);
-  }
-
-  public StringSubject commit() {
-    isNotNull();
-    CommitInfo commitInfo = actual();
-    return Truth.assertThat(commitInfo.commit).named("commit");
-  }
-
-  public ListSubject<CommitInfoSubject, CommitInfo> parents() {
-    isNotNull();
-    CommitInfo commitInfo = actual();
-    return ListSubject.assertThat(commitInfo.parents, CommitInfoSubject::assertThat)
-        .named("parents");
-  }
-
-  public GitPersonSubject committer() {
-    isNotNull();
-    CommitInfo commitInfo = actual();
-    return GitPersonSubject.assertThat(commitInfo.committer).named("committer");
-  }
-}
diff --git a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/ContentEntrySubject.java b/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/ContentEntrySubject.java
deleted file mode 100644
index be5b6a9..0000000
--- a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/ContentEntrySubject.java
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.extensions.common;
-
-import static com.google.common.truth.Truth.assertAbout;
-
-import com.google.common.truth.FailureStrategy;
-import com.google.common.truth.IterableSubject;
-import com.google.common.truth.StringSubject;
-import com.google.common.truth.Subject;
-import com.google.common.truth.SubjectFactory;
-import com.google.common.truth.Truth;
-import com.google.gerrit.extensions.common.DiffInfo.ContentEntry;
-import com.google.gerrit.truth.ListSubject;
-
-public class ContentEntrySubject extends Subject<ContentEntrySubject, ContentEntry> {
-
-  private static final SubjectFactory<ContentEntrySubject, ContentEntry> DIFF_INFO_SUBJECT_FACTORY =
-      new SubjectFactory<ContentEntrySubject, ContentEntry>() {
-        @Override
-        public ContentEntrySubject getSubject(
-            FailureStrategy failureStrategy, ContentEntry contentEntry) {
-          return new ContentEntrySubject(failureStrategy, contentEntry);
-        }
-      };
-
-  public static ContentEntrySubject assertThat(ContentEntry contentEntry) {
-    return assertAbout(DIFF_INFO_SUBJECT_FACTORY).that(contentEntry);
-  }
-
-  private ContentEntrySubject(FailureStrategy failureStrategy, ContentEntry contentEntry) {
-    super(failureStrategy, contentEntry);
-  }
-
-  public void isDueToRebase() {
-    isNotNull();
-    ContentEntry contentEntry = actual();
-    Truth.assertWithMessage("Entry should be marked 'dueToRebase'")
-        .that(contentEntry.dueToRebase)
-        .named("dueToRebase")
-        .isTrue();
-  }
-
-  public void isNotDueToRebase() {
-    isNotNull();
-    ContentEntry contentEntry = actual();
-    Truth.assertWithMessage("Entry should not be marked 'dueToRebase'")
-        .that(contentEntry.dueToRebase)
-        .named("dueToRebase")
-        .isNull();
-  }
-
-  public ListSubject<StringSubject, String> commonLines() {
-    isNotNull();
-    ContentEntry contentEntry = actual();
-    return ListSubject.assertThat(contentEntry.ab, Truth::assertThat).named("common lines");
-  }
-
-  public ListSubject<StringSubject, String> linesOfA() {
-    isNotNull();
-    ContentEntry contentEntry = actual();
-    return ListSubject.assertThat(contentEntry.a, Truth::assertThat).named("lines of 'a'");
-  }
-
-  public ListSubject<StringSubject, String> linesOfB() {
-    isNotNull();
-    ContentEntry contentEntry = actual();
-    return ListSubject.assertThat(contentEntry.b, Truth::assertThat).named("lines of 'b'");
-  }
-
-  public IterableSubject intralineEditsOfA() {
-    isNotNull();
-    ContentEntry contentEntry = actual();
-    return Truth.assertThat(contentEntry.editA).named("intraline edits of 'a'");
-  }
-
-  public IterableSubject intralineEditsOfB() {
-    isNotNull();
-    ContentEntry contentEntry = actual();
-    return Truth.assertThat(contentEntry.editB).named("intraline edits of 'b'");
-  }
-}
diff --git a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/DiffInfoSubject.java b/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/DiffInfoSubject.java
deleted file mode 100644
index 1b1b847..0000000
--- a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/DiffInfoSubject.java
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.extensions.common;
-
-import static com.google.common.truth.Truth.assertAbout;
-
-import com.google.common.truth.ComparableSubject;
-import com.google.common.truth.FailureStrategy;
-import com.google.common.truth.Subject;
-import com.google.common.truth.SubjectFactory;
-import com.google.common.truth.Truth;
-import com.google.gerrit.extensions.common.DiffInfo.ContentEntry;
-import com.google.gerrit.truth.ListSubject;
-
-public class DiffInfoSubject extends Subject<DiffInfoSubject, DiffInfo> {
-
-  private static final SubjectFactory<DiffInfoSubject, DiffInfo> DIFF_INFO_SUBJECT_FACTORY =
-      new SubjectFactory<DiffInfoSubject, DiffInfo>() {
-        @Override
-        public DiffInfoSubject getSubject(FailureStrategy failureStrategy, DiffInfo diffInfo) {
-          return new DiffInfoSubject(failureStrategy, diffInfo);
-        }
-      };
-
-  public static DiffInfoSubject assertThat(DiffInfo diffInfo) {
-    return assertAbout(DIFF_INFO_SUBJECT_FACTORY).that(diffInfo);
-  }
-
-  private DiffInfoSubject(FailureStrategy failureStrategy, DiffInfo diffInfo) {
-    super(failureStrategy, diffInfo);
-  }
-
-  public ListSubject<ContentEntrySubject, ContentEntry> content() {
-    isNotNull();
-    DiffInfo diffInfo = actual();
-    return ListSubject.assertThat(diffInfo.content, ContentEntrySubject::assertThat)
-        .named("content");
-  }
-
-  public ComparableSubject<?, ChangeType> changeType() {
-    isNotNull();
-    DiffInfo diffInfo = actual();
-    return Truth.assertThat(diffInfo.changeType).named("changeType");
-  }
-}
diff --git a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/EditInfoSubject.java b/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/EditInfoSubject.java
deleted file mode 100644
index 95b2158..0000000
--- a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/EditInfoSubject.java
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.extensions.common;
-
-import static com.google.common.truth.Truth.assertAbout;
-
-import com.google.common.truth.FailureStrategy;
-import com.google.common.truth.StringSubject;
-import com.google.common.truth.Subject;
-import com.google.common.truth.SubjectFactory;
-import com.google.common.truth.Truth;
-import com.google.gerrit.truth.OptionalSubject;
-import java.util.Optional;
-
-public class EditInfoSubject extends Subject<EditInfoSubject, EditInfo> {
-
-  private static final SubjectFactory<EditInfoSubject, EditInfo> EDIT_INFO_SUBJECT_FACTORY =
-      new SubjectFactory<EditInfoSubject, EditInfo>() {
-        @Override
-        public EditInfoSubject getSubject(FailureStrategy failureStrategy, EditInfo editInfo) {
-          return new EditInfoSubject(failureStrategy, editInfo);
-        }
-      };
-
-  public static EditInfoSubject assertThat(EditInfo editInfo) {
-    return assertAbout(EDIT_INFO_SUBJECT_FACTORY).that(editInfo);
-  }
-
-  public static OptionalSubject<EditInfoSubject, EditInfo> assertThat(
-      Optional<EditInfo> editInfoOptional) {
-    return OptionalSubject.assertThat(editInfoOptional, EditInfoSubject::assertThat);
-  }
-
-  private EditInfoSubject(FailureStrategy failureStrategy, EditInfo editInfo) {
-    super(failureStrategy, editInfo);
-  }
-
-  public CommitInfoSubject commit() {
-    isNotNull();
-    EditInfo editInfo = actual();
-    return CommitInfoSubject.assertThat(editInfo.commit).named("commit");
-  }
-
-  public StringSubject baseRevision() {
-    isNotNull();
-    EditInfo editInfo = actual();
-    return Truth.assertThat(editInfo.baseRevision).named("baseRevision");
-  }
-}
diff --git a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/FileInfoSubject.java b/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/FileInfoSubject.java
deleted file mode 100644
index f8cdb34..0000000
--- a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/FileInfoSubject.java
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.extensions.common;
-
-import static com.google.common.truth.Truth.assertAbout;
-
-import com.google.common.truth.ComparableSubject;
-import com.google.common.truth.FailureStrategy;
-import com.google.common.truth.IntegerSubject;
-import com.google.common.truth.Subject;
-import com.google.common.truth.SubjectFactory;
-import com.google.common.truth.Truth;
-
-public class FileInfoSubject extends Subject<FileInfoSubject, FileInfo> {
-
-  private static final SubjectFactory<FileInfoSubject, FileInfo> FILE_INFO_SUBJECT_FACTORY =
-      new SubjectFactory<FileInfoSubject, FileInfo>() {
-        @Override
-        public FileInfoSubject getSubject(FailureStrategy failureStrategy, FileInfo fileInfo) {
-          return new FileInfoSubject(failureStrategy, fileInfo);
-        }
-      };
-
-  public static FileInfoSubject assertThat(FileInfo fileInfo) {
-    return assertAbout(FILE_INFO_SUBJECT_FACTORY).that(fileInfo);
-  }
-
-  private FileInfoSubject(FailureStrategy failureStrategy, FileInfo fileInfo) {
-    super(failureStrategy, fileInfo);
-  }
-
-  public IntegerSubject linesInserted() {
-    isNotNull();
-    FileInfo fileInfo = actual();
-    return Truth.assertThat(fileInfo.linesInserted).named("linesInserted");
-  }
-
-  public IntegerSubject linesDeleted() {
-    isNotNull();
-    FileInfo fileInfo = actual();
-    return Truth.assertThat(fileInfo.linesDeleted).named("linesDeleted");
-  }
-
-  public ComparableSubject<?, Character> status() {
-    isNotNull();
-    FileInfo fileInfo = actual();
-    return Truth.assertThat(fileInfo.status).named("status");
-  }
-}
diff --git a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/FixReplacementInfoSubject.java b/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/FixReplacementInfoSubject.java
deleted file mode 100644
index f798622..0000000
--- a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/FixReplacementInfoSubject.java
+++ /dev/null
@@ -1,59 +0,0 @@
-// 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.
-
-package com.google.gerrit.extensions.common;
-
-import static com.google.common.truth.Truth.assertAbout;
-
-import com.google.common.truth.FailureStrategy;
-import com.google.common.truth.StringSubject;
-import com.google.common.truth.Subject;
-import com.google.common.truth.SubjectFactory;
-import com.google.common.truth.Truth;
-import com.google.gerrit.extensions.client.RangeSubject;
-
-public class FixReplacementInfoSubject
-    extends Subject<FixReplacementInfoSubject, FixReplacementInfo> {
-
-  private static final SubjectFactory<FixReplacementInfoSubject, FixReplacementInfo>
-      FIX_REPLACEMENT_INFO_SUBJECT_FACTORY =
-          new SubjectFactory<FixReplacementInfoSubject, FixReplacementInfo>() {
-            @Override
-            public FixReplacementInfoSubject getSubject(
-                FailureStrategy failureStrategy, FixReplacementInfo fixReplacementInfo) {
-              return new FixReplacementInfoSubject(failureStrategy, fixReplacementInfo);
-            }
-          };
-
-  public static FixReplacementInfoSubject assertThat(FixReplacementInfo fixReplacementInfo) {
-    return assertAbout(FIX_REPLACEMENT_INFO_SUBJECT_FACTORY).that(fixReplacementInfo);
-  }
-
-  private FixReplacementInfoSubject(
-      FailureStrategy failureStrategy, FixReplacementInfo fixReplacementInfo) {
-    super(failureStrategy, fixReplacementInfo);
-  }
-
-  public StringSubject path() {
-    return Truth.assertThat(actual().path).named("path");
-  }
-
-  public RangeSubject range() {
-    return RangeSubject.assertThat(actual().range).named("range");
-  }
-
-  public StringSubject replacement() {
-    return Truth.assertThat(actual().replacement).named("replacement");
-  }
-}
diff --git a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/FixSuggestionInfoSubject.java b/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/FixSuggestionInfoSubject.java
deleted file mode 100644
index 9af4d1f..0000000
--- a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/FixSuggestionInfoSubject.java
+++ /dev/null
@@ -1,63 +0,0 @@
-// 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.
-
-package com.google.gerrit.extensions.common;
-
-import static com.google.common.truth.Truth.assertAbout;
-
-import com.google.common.truth.FailureStrategy;
-import com.google.common.truth.StringSubject;
-import com.google.common.truth.Subject;
-import com.google.common.truth.SubjectFactory;
-import com.google.common.truth.Truth;
-import com.google.gerrit.truth.ListSubject;
-
-public class FixSuggestionInfoSubject extends Subject<FixSuggestionInfoSubject, FixSuggestionInfo> {
-
-  private static final SubjectFactory<FixSuggestionInfoSubject, FixSuggestionInfo>
-      FIX_SUGGESTION_INFO_SUBJECT_FACTORY =
-          new SubjectFactory<FixSuggestionInfoSubject, FixSuggestionInfo>() {
-            @Override
-            public FixSuggestionInfoSubject getSubject(
-                FailureStrategy failureStrategy, FixSuggestionInfo fixSuggestionInfo) {
-              return new FixSuggestionInfoSubject(failureStrategy, fixSuggestionInfo);
-            }
-          };
-
-  public static FixSuggestionInfoSubject assertThat(FixSuggestionInfo fixSuggestionInfo) {
-    return assertAbout(FIX_SUGGESTION_INFO_SUBJECT_FACTORY).that(fixSuggestionInfo);
-  }
-
-  private FixSuggestionInfoSubject(
-      FailureStrategy failureStrategy, FixSuggestionInfo fixSuggestionInfo) {
-    super(failureStrategy, fixSuggestionInfo);
-  }
-
-  public StringSubject fixId() {
-    return Truth.assertThat(actual().fixId).named("fixId");
-  }
-
-  public ListSubject<FixReplacementInfoSubject, FixReplacementInfo> replacements() {
-    return ListSubject.assertThat(actual().replacements, FixReplacementInfoSubject::assertThat)
-        .named("replacements");
-  }
-
-  public FixReplacementInfoSubject onlyReplacement() {
-    return replacements().onlyElement();
-  }
-
-  public StringSubject description() {
-    return Truth.assertThat(actual().description).named("description");
-  }
-}
diff --git a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/GitPersonSubject.java b/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/GitPersonSubject.java
deleted file mode 100644
index 9ef06dc..0000000
--- a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/GitPersonSubject.java
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.extensions.common;
-
-import static com.google.common.truth.Truth.assertAbout;
-
-import com.google.common.truth.ComparableSubject;
-import com.google.common.truth.FailureStrategy;
-import com.google.common.truth.Subject;
-import com.google.common.truth.SubjectFactory;
-import com.google.common.truth.Truth;
-import java.sql.Timestamp;
-
-public class GitPersonSubject extends Subject<GitPersonSubject, GitPerson> {
-
-  private static final SubjectFactory<GitPersonSubject, GitPerson> GIT_PERSON_SUBJECT_FACTORY =
-      new SubjectFactory<GitPersonSubject, GitPerson>() {
-        @Override
-        public GitPersonSubject getSubject(FailureStrategy failureStrategy, GitPerson gitPerson) {
-          return new GitPersonSubject(failureStrategy, gitPerson);
-        }
-      };
-
-  public static GitPersonSubject assertThat(GitPerson gitPerson) {
-    return assertAbout(GIT_PERSON_SUBJECT_FACTORY).that(gitPerson);
-  }
-
-  private GitPersonSubject(FailureStrategy failureStrategy, GitPerson gitPerson) {
-    super(failureStrategy, gitPerson);
-  }
-
-  public ComparableSubject<?, Timestamp> creationDate() {
-    isNotNull();
-    GitPerson gitPerson = actual();
-    return Truth.assertThat(gitPerson.date).named("creationDate");
-  }
-}
diff --git a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/PathSubject.java b/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/PathSubject.java
deleted file mode 100644
index 307c19e..0000000
--- a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/PathSubject.java
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.extensions.common;
-
-import static com.google.common.truth.Truth.assertAbout;
-
-import com.google.common.truth.FailureStrategy;
-import com.google.common.truth.Subject;
-import com.google.common.truth.SubjectFactory;
-import java.nio.file.Path;
-
-public class PathSubject extends Subject<PathSubject, Path> {
-  private static final SubjectFactory<PathSubject, Path> PATH_SUBJECT_FACTORY =
-      new SubjectFactory<PathSubject, Path>() {
-        @Override
-        public PathSubject getSubject(FailureStrategy failureStrategy, Path path) {
-          return new PathSubject(failureStrategy, path);
-        }
-      };
-
-  private PathSubject(FailureStrategy failureStrategy, Path path) {
-    super(failureStrategy, path);
-  }
-
-  public static PathSubject assertThat(Path path) {
-    return assertAbout(PATH_SUBJECT_FACTORY).that(path);
-  }
-}
diff --git a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/RobotCommentInfoSubject.java b/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/RobotCommentInfoSubject.java
deleted file mode 100644
index afa1b9b..0000000
--- a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/common/RobotCommentInfoSubject.java
+++ /dev/null
@@ -1,60 +0,0 @@
-// 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.
-
-package com.google.gerrit.extensions.common;
-
-import static com.google.common.truth.Truth.assertAbout;
-
-import com.google.common.truth.FailureStrategy;
-import com.google.common.truth.Subject;
-import com.google.common.truth.SubjectFactory;
-import com.google.gerrit.truth.ListSubject;
-import java.util.List;
-
-public class RobotCommentInfoSubject extends Subject<RobotCommentInfoSubject, RobotCommentInfo> {
-
-  private static final SubjectFactory<RobotCommentInfoSubject, RobotCommentInfo>
-      ROBOT_COMMENT_INFO_SUBJECT_FACTORY =
-          new SubjectFactory<RobotCommentInfoSubject, RobotCommentInfo>() {
-            @Override
-            public RobotCommentInfoSubject getSubject(
-                FailureStrategy failureStrategy, RobotCommentInfo robotCommentInfo) {
-              return new RobotCommentInfoSubject(failureStrategy, robotCommentInfo);
-            }
-          };
-
-  public static ListSubject<RobotCommentInfoSubject, RobotCommentInfo> assertThatList(
-      List<RobotCommentInfo> robotCommentInfos) {
-    return ListSubject.assertThat(robotCommentInfos, RobotCommentInfoSubject::assertThat)
-        .named("robotCommentInfos");
-  }
-
-  public static RobotCommentInfoSubject assertThat(RobotCommentInfo robotCommentInfo) {
-    return assertAbout(ROBOT_COMMENT_INFO_SUBJECT_FACTORY).that(robotCommentInfo);
-  }
-
-  private RobotCommentInfoSubject(
-      FailureStrategy failureStrategy, RobotCommentInfo robotCommentInfo) {
-    super(failureStrategy, robotCommentInfo);
-  }
-
-  public ListSubject<FixSuggestionInfoSubject, FixSuggestionInfo> fixSuggestions() {
-    return ListSubject.assertThat(actual().fixSuggestions, FixSuggestionInfoSubject::assertThat)
-        .named("fixSuggestions");
-  }
-
-  public FixSuggestionInfoSubject onlyFixSuggestion() {
-    return fixSuggestions().onlyElement();
-  }
-}
diff --git a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/restapi/BinaryResultSubject.java b/gerrit-test-util/src/main/java/com/google/gerrit/extensions/restapi/BinaryResultSubject.java
deleted file mode 100644
index 30ac496..0000000
--- a/gerrit-test-util/src/main/java/com/google/gerrit/extensions/restapi/BinaryResultSubject.java
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.extensions.restapi;
-
-import static com.google.common.truth.Truth.assertAbout;
-
-import com.google.common.truth.FailureStrategy;
-import com.google.common.truth.PrimitiveByteArraySubject;
-import com.google.common.truth.StringSubject;
-import com.google.common.truth.Subject;
-import com.google.common.truth.SubjectFactory;
-import com.google.common.truth.Truth;
-import com.google.gerrit.truth.OptionalSubject;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.Optional;
-
-public class BinaryResultSubject extends Subject<BinaryResultSubject, BinaryResult> {
-
-  private static final SubjectFactory<BinaryResultSubject, BinaryResult>
-      BINARY_RESULT_SUBJECT_FACTORY =
-          new SubjectFactory<BinaryResultSubject, BinaryResult>() {
-            @Override
-            public BinaryResultSubject getSubject(
-                FailureStrategy failureStrategy, BinaryResult binaryResult) {
-              return new BinaryResultSubject(failureStrategy, binaryResult);
-            }
-          };
-
-  public static BinaryResultSubject assertThat(BinaryResult binaryResult) {
-    return assertAbout(BINARY_RESULT_SUBJECT_FACTORY).that(binaryResult);
-  }
-
-  public static OptionalSubject<BinaryResultSubject, BinaryResult> assertThat(
-      Optional<BinaryResult> binaryResultOptional) {
-    return OptionalSubject.assertThat(binaryResultOptional, BinaryResultSubject::assertThat);
-  }
-
-  private BinaryResultSubject(FailureStrategy failureStrategy, BinaryResult binaryResult) {
-    super(failureStrategy, binaryResult);
-  }
-
-  public StringSubject asString() throws IOException {
-    isNotNull();
-    // We shouldn't close the BinaryResult within this method as it might still
-    // be used afterwards. Besides, closing it doesn't have an effect for most
-    // implementations of a BinaryResult.
-    BinaryResult binaryResult = actual();
-    return Truth.assertThat(binaryResult.asString());
-  }
-
-  public PrimitiveByteArraySubject bytes() throws IOException {
-    isNotNull();
-    // We shouldn't close the BinaryResult within this method as it might still
-    // be used afterwards. Besides, closing it doesn't have an effect for most
-    // implementations of a BinaryResult.
-    BinaryResult binaryResult = actual();
-    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
-    binaryResult.writeTo(byteArrayOutputStream);
-    byte[] bytes = byteArrayOutputStream.toByteArray();
-    return Truth.assertThat(bytes);
-  }
-}
diff --git a/gerrit-test-util/src/main/java/com/google/gerrit/truth/ListSubject.java b/gerrit-test-util/src/main/java/com/google/gerrit/truth/ListSubject.java
deleted file mode 100644
index e7f1074..0000000
--- a/gerrit-test-util/src/main/java/com/google/gerrit/truth/ListSubject.java
+++ /dev/null
@@ -1,90 +0,0 @@
-// 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.
-
-package com.google.gerrit.truth;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.truth.Truth.assertAbout;
-
-import com.google.common.truth.FailureStrategy;
-import com.google.common.truth.IterableSubject;
-import com.google.common.truth.Subject;
-import com.google.common.truth.SubjectFactory;
-import java.util.List;
-import java.util.function.Function;
-
-public class ListSubject<S extends Subject<S, E>, E> extends IterableSubject {
-
-  private final Function<E, S> elementAssertThatFunction;
-
-  @SuppressWarnings("unchecked")
-  public static <S extends Subject<S, E>, E> ListSubject<S, E> assertThat(
-      List<E> list, Function<E, S> elementAssertThatFunction) {
-    // The ListSubjectFactory always returns ListSubjects.
-    // -> Casting is appropriate.
-    return (ListSubject<S, E>)
-        assertAbout(new ListSubjectFactory<>(elementAssertThatFunction)).that(list);
-  }
-
-  private ListSubject(
-      FailureStrategy failureStrategy, List<E> list, Function<E, S> elementAssertThatFunction) {
-    super(failureStrategy, list);
-    this.elementAssertThatFunction = elementAssertThatFunction;
-  }
-
-  public S element(int index) {
-    checkArgument(index >= 0, "index(%s) must be >= 0", index);
-    // The constructor only accepts lists.
-    // -> Casting is appropriate.
-    @SuppressWarnings("unchecked")
-    List<E> list = (List<E>) actual();
-    isNotNull();
-    if (index >= list.size()) {
-      fail("has an element at index " + index);
-    }
-    return elementAssertThatFunction.apply(list.get(index));
-  }
-
-  public S onlyElement() {
-    isNotNull();
-    hasSize(1);
-    return element(0);
-  }
-
-  @SuppressWarnings("unchecked")
-  @Override
-  public ListSubject<S, E> named(String s, Object... objects) {
-    // This object is returned which is of type ListSubject.
-    // -> Casting is appropriate.
-    return (ListSubject<S, E>) super.named(s, objects);
-  }
-
-  private static class ListSubjectFactory<S extends Subject<S, T>, T>
-      extends SubjectFactory<IterableSubject, Iterable<?>> {
-
-    private Function<T, S> elementAssertThatFunction;
-
-    ListSubjectFactory(Function<T, S> elementAssertThatFunction) {
-      this.elementAssertThatFunction = elementAssertThatFunction;
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public ListSubject<S, T> getSubject(FailureStrategy failureStrategy, Iterable<?> objects) {
-      // The constructor of ListSubject only accepts lists.
-      // -> Casting is appropriate.
-      return new ListSubject<>(failureStrategy, (List<T>) objects, elementAssertThatFunction);
-    }
-  }
-}
diff --git a/gerrit-test-util/src/main/java/com/google/gerrit/truth/OptionalSubject.java b/gerrit-test-util/src/main/java/com/google/gerrit/truth/OptionalSubject.java
deleted file mode 100644
index 49e91a8..0000000
--- a/gerrit-test-util/src/main/java/com/google/gerrit/truth/OptionalSubject.java
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright (C) 2017 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.google.gerrit.truth;
-
-import static com.google.common.truth.Truth.assertAbout;
-
-import com.google.common.truth.DefaultSubject;
-import com.google.common.truth.FailureStrategy;
-import com.google.common.truth.Subject;
-import com.google.common.truth.SubjectFactory;
-import com.google.common.truth.Truth;
-import java.util.Optional;
-import java.util.function.Function;
-
-public class OptionalSubject<S extends Subject<S, ? super T>, T>
-    extends Subject<OptionalSubject<S, T>, Optional<T>> {
-
-  private final Function<? super T, ? extends S> valueAssertThatFunction;
-
-  public static <S extends Subject<S, ? super T>, T> OptionalSubject<S, T> assertThat(
-      Optional<T> optional, Function<? super T, ? extends S> elementAssertThatFunction) {
-    OptionalSubjectFactory<S, T> optionalSubjectFactory =
-        new OptionalSubjectFactory<>(elementAssertThatFunction);
-    return assertAbout(optionalSubjectFactory).that(optional);
-  }
-
-  public static OptionalSubject<DefaultSubject, ?> assertThat(Optional<?> optional) {
-    // Unfortunately, we need to cast to DefaultSubject as Truth.assertThat()
-    // only returns Subject<DefaultSubject, Object>. There shouldn't be a way
-    // for that method not to return a DefaultSubject because the generic type
-    // definitions of a Subject are quite strict.
-    Function<Object, DefaultSubject> valueAssertThatFunction =
-        value -> (DefaultSubject) Truth.assertThat(value);
-    return assertThat(optional, valueAssertThatFunction);
-  }
-
-  private OptionalSubject(
-      FailureStrategy failureStrategy,
-      Optional<T> optional,
-      Function<? super T, ? extends S> valueAssertThatFunction) {
-    super(failureStrategy, optional);
-    this.valueAssertThatFunction = valueAssertThatFunction;
-  }
-
-  public void isPresent() {
-    isNotNull();
-    Optional<T> optional = actual();
-    if (!optional.isPresent()) {
-      fail("has a value");
-    }
-  }
-
-  public void isAbsent() {
-    isNotNull();
-    Optional<T> optional = actual();
-    if (optional.isPresent()) {
-      fail("does not have a value");
-    }
-  }
-
-  public void isEmpty() {
-    isAbsent();
-  }
-
-  public S value() {
-    isNotNull();
-    isPresent();
-    Optional<T> optional = actual();
-    return valueAssertThatFunction.apply(optional.get());
-  }
-
-  private static class OptionalSubjectFactory<S extends Subject<S, ? super T>, T>
-      extends SubjectFactory<OptionalSubject<S, T>, Optional<T>> {
-
-    private Function<? super T, ? extends S> valueAssertThatFunction;
-
-    OptionalSubjectFactory(Function<? super T, ? extends S> valueAssertThatFunction) {
-      this.valueAssertThatFunction = valueAssertThatFunction;
-    }
-
-    @Override
-    public OptionalSubject<S, T> getSubject(FailureStrategy failureStrategy, Optional<T> optional) {
-      return new OptionalSubject<>(failureStrategy, optional, valueAssertThatFunction);
-    }
-  }
-}
diff --git a/gerrit-util-cli/BUILD b/gerrit-util-cli/BUILD
deleted file mode 100644
index bb282f4..0000000
--- a/gerrit-util-cli/BUILD
+++ /dev/null
@@ -1,13 +0,0 @@
-java_library(
-    name = "cli",
-    srcs = glob(["src/main/java/**/*.java"]),
-    visibility = ["//visibility:public"],
-    deps = [
-        "//gerrit-common:annotations",
-        "//gerrit-common:server",
-        "//lib:args4j",
-        "//lib:guava",
-        "//lib/guice",
-        "//lib/guice:guice-assistedinject",
-    ],
-)
diff --git a/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/CmdLineParser.java b/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/CmdLineParser.java
deleted file mode 100644
index f2d07ed..0000000
--- a/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/CmdLineParser.java
+++ /dev/null
@@ -1,571 +0,0 @@
-/*
- * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
- *
- * (Taken from JGit org.eclipse.jgit.pgm.opt.CmdLineParser.)
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * - Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * - Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * - Neither the name of the Git Development Community nor the names of its
- * contributors may be used to endorse or promote products derived from this
- * software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-package com.google.gerrit.util.cli;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.Lists;
-import com.google.common.collect.MultimapBuilder;
-import com.google.inject.Inject;
-import com.google.inject.assistedinject.Assisted;
-import java.io.StringWriter;
-import java.io.Writer;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.AnnotatedElement;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.ResourceBundle;
-import java.util.Set;
-import org.kohsuke.args4j.Argument;
-import org.kohsuke.args4j.CmdLineException;
-import org.kohsuke.args4j.IllegalAnnotationError;
-import org.kohsuke.args4j.NamedOptionDef;
-import org.kohsuke.args4j.Option;
-import org.kohsuke.args4j.OptionDef;
-import org.kohsuke.args4j.spi.BooleanOptionHandler;
-import org.kohsuke.args4j.spi.EnumOptionHandler;
-import org.kohsuke.args4j.spi.FieldSetter;
-import org.kohsuke.args4j.spi.MethodSetter;
-import org.kohsuke.args4j.spi.OptionHandler;
-import org.kohsuke.args4j.spi.Setter;
-import org.kohsuke.args4j.spi.Setters;
-
-/**
- * Extended command line parser which handles --foo=value arguments.
- *
- * <p>The args4j package does not natively handle --foo=value and instead prefers to see --foo value
- * on the command line. Many users are used to the GNU style --foo=value long option, so we convert
- * from the GNU style format to the args4j style format prior to invoking args4j for parsing.
- */
-public class CmdLineParser {
-  public interface Factory {
-    CmdLineParser create(Object bean);
-  }
-
-  private final OptionHandlers handlers;
-  private final MyParser parser;
-
-  @SuppressWarnings("rawtypes")
-  private Map<String, OptionHandler> options;
-
-  /**
-   * Creates a new command line owner that parses arguments/options and set them into the given
-   * object.
-   *
-   * @param bean instance of a class annotated by {@link org.kohsuke.args4j.Option} and {@link
-   *     org.kohsuke.args4j.Argument}. this object will receive values.
-   * @throws IllegalAnnotationError if the option bean class is using args4j annotations
-   *     incorrectly.
-   */
-  @Inject
-  public CmdLineParser(OptionHandlers handlers, @Assisted final Object bean)
-      throws IllegalAnnotationError {
-    this.handlers = handlers;
-    this.parser = new MyParser(bean);
-  }
-
-  public void addArgument(Setter<?> setter, Argument a) {
-    parser.addArgument(setter, a);
-  }
-
-  public void addOption(Setter<?> setter, Option o) {
-    parser.addOption(setter, o);
-  }
-
-  public void printSingleLineUsage(Writer w, ResourceBundle rb) {
-    parser.printSingleLineUsage(w, rb);
-  }
-
-  public void printUsage(Writer out, ResourceBundle rb) {
-    parser.printUsage(out, rb);
-  }
-
-  public void printDetailedUsage(String name, StringWriter out) {
-    out.write(name);
-    printSingleLineUsage(out, null);
-    out.write('\n');
-    out.write('\n');
-    printUsage(out, null);
-    out.write('\n');
-  }
-
-  public void printQueryStringUsage(String name, StringWriter out) {
-    out.write(name);
-
-    char next = '?';
-    List<NamedOptionDef> booleans = new ArrayList<>();
-    for (@SuppressWarnings("rawtypes") OptionHandler handler : parser.optionsList) {
-      if (handler.option instanceof NamedOptionDef) {
-        NamedOptionDef n = (NamedOptionDef) handler.option;
-
-        if (handler instanceof BooleanOptionHandler) {
-          booleans.add(n);
-          continue;
-        }
-
-        if (!n.required()) {
-          out.write('[');
-        }
-        out.write(next);
-        next = '&';
-        if (n.name().startsWith("--")) {
-          out.write(n.name().substring(2));
-        } else if (n.name().startsWith("-")) {
-          out.write(n.name().substring(1));
-        } else {
-          out.write(n.name());
-        }
-        out.write('=');
-
-        out.write(metaVar(handler, n));
-        if (!n.required()) {
-          out.write(']');
-        }
-        if (n.isMultiValued()) {
-          out.write('*');
-        }
-      }
-    }
-    for (NamedOptionDef n : booleans) {
-      if (!n.required()) {
-        out.write('[');
-      }
-      out.write(next);
-      next = '&';
-      if (n.name().startsWith("--")) {
-        out.write(n.name().substring(2));
-      } else if (n.name().startsWith("-")) {
-        out.write(n.name().substring(1));
-      } else {
-        out.write(n.name());
-      }
-      if (!n.required()) {
-        out.write(']');
-      }
-    }
-  }
-
-  private static String metaVar(OptionHandler<?> handler, NamedOptionDef n) {
-    String var = n.metaVar();
-    if (Strings.isNullOrEmpty(var)) {
-      var = handler.getDefaultMetaVariable();
-      if (handler instanceof EnumOptionHandler) {
-        var = var.substring(1, var.length() - 1).replace(" ", "");
-      }
-    }
-    return var;
-  }
-
-  public boolean wasHelpRequestedByOption() {
-    return parser.help.value;
-  }
-
-  public void parseArgument(String... args) throws CmdLineException {
-    List<String> tmp = Lists.newArrayListWithCapacity(args.length);
-    for (int argi = 0; argi < args.length; argi++) {
-      final String str = args[argi];
-      if (str.equals("--")) {
-        while (argi < args.length) {
-          tmp.add(args[argi++]);
-        }
-        break;
-      }
-
-      if (str.startsWith("--")) {
-        final int eq = str.indexOf('=');
-        if (eq > 0) {
-          tmp.add(str.substring(0, eq));
-          tmp.add(str.substring(eq + 1));
-          continue;
-        }
-      }
-
-      tmp.add(str);
-    }
-    parser.parseArgument(tmp.toArray(new String[tmp.size()]));
-  }
-
-  public void parseOptionMap(Map<String, String[]> parameters) throws CmdLineException {
-    ListMultimap<String, String> map = MultimapBuilder.hashKeys().arrayListValues().build();
-    for (Map.Entry<String, String[]> ent : parameters.entrySet()) {
-      for (String val : ent.getValue()) {
-        map.put(ent.getKey(), val);
-      }
-    }
-    parseOptionMap(map);
-  }
-
-  public void parseOptionMap(ListMultimap<String, String> params) throws CmdLineException {
-    List<String> tmp = Lists.newArrayListWithCapacity(2 * params.size());
-    for (String key : params.keySet()) {
-      String name = makeOption(key);
-
-      if (isBoolean(name)) {
-        boolean on = false;
-        for (String value : params.get(key)) {
-          on = toBoolean(key, value);
-        }
-        if (on) {
-          tmp.add(name);
-        }
-      } else {
-        for (String value : params.get(key)) {
-          tmp.add(name);
-          tmp.add(value);
-        }
-      }
-    }
-    parser.parseArgument(tmp.toArray(new String[tmp.size()]));
-  }
-
-  public boolean isBoolean(String name) {
-    return findHandler(makeOption(name)) instanceof BooleanOptionHandler;
-  }
-
-  public void parseWithPrefix(String prefix, Object bean) {
-    parser.parseWithPrefix(prefix, bean);
-  }
-
-  private String makeOption(String name) {
-    if (!name.startsWith("-")) {
-      if (name.length() == 1) {
-        name = "-" + name;
-      } else {
-        name = "--" + name;
-      }
-    }
-    return name;
-  }
-
-  @SuppressWarnings("rawtypes")
-  private OptionHandler findHandler(String name) {
-    if (options == null) {
-      options = index(parser.optionsList);
-    }
-    return options.get(name);
-  }
-
-  @SuppressWarnings("rawtypes")
-  private static Map<String, OptionHandler> index(List<OptionHandler> in) {
-    Map<String, OptionHandler> m = new HashMap<>();
-    for (OptionHandler handler : in) {
-      if (handler.option instanceof NamedOptionDef) {
-        NamedOptionDef def = (NamedOptionDef) handler.option;
-        if (!def.isArgument()) {
-          m.put(def.name(), handler);
-          for (String alias : def.aliases()) {
-            m.put(alias, handler);
-          }
-        }
-      }
-    }
-    return m;
-  }
-
-  private boolean toBoolean(String name, String value) throws CmdLineException {
-    if ("true".equals(value)
-        || "t".equals(value)
-        || "yes".equals(value)
-        || "y".equals(value)
-        || "on".equals(value)
-        || "1".equals(value)
-        || value == null
-        || "".equals(value)) {
-      return true;
-    }
-
-    if ("false".equals(value)
-        || "f".equals(value)
-        || "no".equals(value)
-        || "n".equals(value)
-        || "off".equals(value)
-        || "0".equals(value)) {
-      return false;
-    }
-
-    throw new CmdLineException(parser, String.format("invalid boolean \"%s=%s\"", name, value));
-  }
-
-  private static class PrefixedOption implements Option {
-    String prefix;
-    Option o;
-
-    PrefixedOption(String prefix, Option o) {
-      this.prefix = prefix;
-      this.o = o;
-    }
-
-    @Override
-    public String name() {
-      return getPrefixedName(prefix, o.name());
-    }
-
-    @Override
-    public String[] aliases() {
-      String[] prefixedAliases = new String[o.aliases().length];
-      for (int i = 0; i < prefixedAliases.length; i++) {
-        prefixedAliases[i] = getPrefixedName(prefix, o.aliases()[i]);
-      }
-      return prefixedAliases;
-    }
-
-    @Override
-    public String usage() {
-      return o.usage();
-    }
-
-    @Override
-    public String metaVar() {
-      return o.metaVar();
-    }
-
-    @Override
-    public boolean required() {
-      return o.required();
-    }
-
-    @Override
-    public boolean hidden() {
-      return o.hidden();
-    }
-
-    @SuppressWarnings("rawtypes")
-    @Override
-    public Class<? extends OptionHandler> handler() {
-      return o.handler();
-    }
-
-    @Override
-    public String[] depends() {
-      return o.depends();
-    }
-
-    @Override
-    public Class<? extends Annotation> annotationType() {
-      return o.annotationType();
-    }
-
-    private static String getPrefixedName(String prefix, String name) {
-      return prefix + name;
-    }
-  }
-
-  private class MyParser extends org.kohsuke.args4j.CmdLineParser {
-    @SuppressWarnings("rawtypes")
-    private List<OptionHandler> optionsList;
-
-    private HelpOption help;
-
-    MyParser(Object bean) {
-      super(bean);
-      parseAdditionalOptions(bean, new HashSet<>());
-      ensureOptionsInitialized();
-    }
-
-    // NOTE: Argument annotations on bean are ignored.
-    public void parseWithPrefix(String prefix, Object bean) {
-      parseWithPrefix(prefix, bean, new HashSet<>());
-    }
-
-    private void parseWithPrefix(String prefix, Object bean, Set<Object> parsedBeans) {
-      if (!parsedBeans.add(bean)) {
-        return;
-      }
-      // recursively process all the methods/fields.
-      for (Class<?> c = bean.getClass(); c != null; c = c.getSuperclass()) {
-        for (Method m : c.getDeclaredMethods()) {
-          Option o = m.getAnnotation(Option.class);
-          if (o != null) {
-            addOption(new MethodSetter(this, bean, m), new PrefixedOption(prefix, o));
-          }
-        }
-        for (Field f : c.getDeclaredFields()) {
-          Option o = f.getAnnotation(Option.class);
-          if (o != null) {
-            addOption(Setters.create(f, bean), new PrefixedOption(prefix, o));
-          }
-          if (f.isAnnotationPresent(Options.class)) {
-            try {
-              parseWithPrefix(
-                  prefix + f.getAnnotation(Options.class).prefix(), f.get(bean), parsedBeans);
-            } catch (IllegalAccessException e) {
-              throw new IllegalAnnotationError(e);
-            }
-          }
-        }
-      }
-    }
-
-    private void parseAdditionalOptions(Object bean, Set<Object> parsedBeans) {
-      for (Class<?> c = bean.getClass(); c != null; c = c.getSuperclass()) {
-        for (Field f : c.getDeclaredFields()) {
-          if (f.isAnnotationPresent(Options.class)) {
-            Object additionalBean = null;
-            try {
-              additionalBean = f.get(bean);
-            } catch (IllegalAccessException e) {
-              throw new IllegalAnnotationError(e);
-            }
-            parseWithPrefix(f.getAnnotation(Options.class).prefix(), additionalBean, parsedBeans);
-          }
-        }
-      }
-    }
-
-    @SuppressWarnings({"unchecked", "rawtypes"})
-    @Override
-    protected OptionHandler createOptionHandler(OptionDef option, Setter setter) {
-      if (isHandlerSpecified(option) || isEnum(setter) || isPrimitive(setter)) {
-        return add(super.createOptionHandler(option, setter));
-      }
-
-      OptionHandlerFactory<?> factory = handlers.get(setter.getType());
-      if (factory != null) {
-        return factory.create(this, option, setter);
-      }
-      return add(super.createOptionHandler(option, setter));
-    }
-
-    @SuppressWarnings("rawtypes")
-    private OptionHandler add(OptionHandler handler) {
-      ensureOptionsInitialized();
-      optionsList.add(handler);
-      return handler;
-    }
-
-    private void ensureOptionsInitialized() {
-      if (optionsList == null) {
-        help = new HelpOption();
-        optionsList = new ArrayList<>();
-        addOption(help, help);
-      }
-    }
-
-    private boolean isHandlerSpecified(OptionDef option) {
-      return option.handler() != OptionHandler.class;
-    }
-
-    private <T> boolean isEnum(Setter<T> setter) {
-      return Enum.class.isAssignableFrom(setter.getType());
-    }
-
-    private <T> boolean isPrimitive(Setter<T> setter) {
-      return setter.getType().isPrimitive();
-    }
-  }
-
-  private static class HelpOption implements Option, Setter<Boolean> {
-    private boolean value;
-
-    @Override
-    public String name() {
-      return "--help";
-    }
-
-    @Override
-    public String[] aliases() {
-      return new String[] {"-h"};
-    }
-
-    @Override
-    public String[] depends() {
-      return new String[] {};
-    }
-
-    @Override
-    public boolean hidden() {
-      return false;
-    }
-
-    @Override
-    public String usage() {
-      return "display this help text";
-    }
-
-    @Override
-    public void addValue(Boolean val) {
-      value = val;
-    }
-
-    @Override
-    public Class<? extends OptionHandler<Boolean>> handler() {
-      return BooleanOptionHandler.class;
-    }
-
-    @Override
-    public String metaVar() {
-      return "";
-    }
-
-    @Override
-    public boolean required() {
-      return false;
-    }
-
-    @Override
-    public Class<? extends Annotation> annotationType() {
-      return Option.class;
-    }
-
-    @Override
-    public FieldSetter asFieldSetter() {
-      throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public AnnotatedElement asAnnotatedElement() {
-      throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public Class<Boolean> getType() {
-      return Boolean.class;
-    }
-
-    @Override
-    public boolean isMultiValued() {
-      return false;
-    }
-  }
-
-  public CmdLineException reject(String message) {
-    return new CmdLineException(parser, message);
-  }
-}
diff --git a/gerrit-util-http/BUILD b/gerrit-util-http/BUILD
deleted file mode 100644
index 47cc62e..0000000
--- a/gerrit-util-http/BUILD
+++ /dev/null
@@ -1,40 +0,0 @@
-load("//tools/bzl:junit.bzl", "junit_tests")
-
-java_library(
-    name = "http",
-    srcs = glob(["src/main/java/**/*.java"]),
-    visibility = ["//visibility:public"],
-    deps = ["//lib:servlet-api-3_1"],
-)
-
-TESTUTIL_SRCS = glob(["src/test/**/testutil/**/*.java"])
-
-java_library(
-    name = "testutil",
-    testonly = 1,
-    srcs = TESTUTIL_SRCS,
-    visibility = ["//visibility:public"],
-    deps = [
-        "//gerrit-extension-api:api",
-        "//lib:guava",
-        "//lib:servlet-api-3_1",
-        "//lib/httpcomponents:httpclient",
-        "//lib/jgit/org.eclipse.jgit:jgit",
-    ],
-)
-
-junit_tests(
-    name = "http_tests",
-    srcs = glob(
-        ["src/test/java/**/*.java"],
-        exclude = TESTUTIL_SRCS,
-    ),
-    deps = [
-        ":http",
-        ":testutil",
-        "//lib:junit",
-        "//lib:servlet-api-3_1-without-neverlink",
-        "//lib:truth",
-        "//lib/easymock",
-    ],
-)
diff --git a/gerrit-util-http/src/test/java/com/google/gerrit/util/http/testutil/FakeHttpServletRequest.java b/gerrit-util-http/src/test/java/com/google/gerrit/util/http/testutil/FakeHttpServletRequest.java
deleted file mode 100644
index 56734ff..0000000
--- a/gerrit-util-http/src/test/java/com/google/gerrit/util/http/testutil/FakeHttpServletRequest.java
+++ /dev/null
@@ -1,463 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.util.http.testutil;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.base.Splitter;
-import com.google.common.base.Strings;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.LinkedListMultimap;
-import com.google.common.collect.ListMultimap;
-import com.google.common.collect.Maps;
-import java.io.BufferedReader;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import java.security.Principal;
-import java.time.Instant;
-import java.time.format.DateTimeFormatter;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import javax.servlet.AsyncContext;
-import javax.servlet.DispatcherType;
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletInputStream;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
-import javax.servlet.http.HttpUpgradeHandler;
-import javax.servlet.http.Part;
-
-/** Simple fake implementation of {@link HttpServletRequest}. */
-public class FakeHttpServletRequest implements HttpServletRequest {
-  public static final String SERVLET_PATH = "/b";
-  public static final DateTimeFormatter rfcDateformatter =
-      DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss ZZZ");
-
-  private final Map<String, Object> attributes;
-  private final ListMultimap<String, String> headers;
-
-  private ListMultimap<String, String> parameters;
-  private String queryString;
-  private String hostName;
-  private int port;
-  private String contextPath;
-  private String servletPath;
-  private String path;
-
-  public FakeHttpServletRequest() {
-    this("gerrit.example.com", 80, "", SERVLET_PATH);
-  }
-
-  public FakeHttpServletRequest(String hostName, int port, String contextPath, String servletPath) {
-    this.hostName = checkNotNull(hostName, "hostName");
-    checkArgument(port > 0);
-    this.port = port;
-    this.contextPath = checkNotNull(contextPath, "contextPath");
-    this.servletPath = checkNotNull(servletPath, "servletPath");
-    attributes = Maps.newConcurrentMap();
-    parameters = LinkedListMultimap.create();
-    headers = LinkedListMultimap.create();
-  }
-
-  @Override
-  public Object getAttribute(String name) {
-    return attributes.get(name);
-  }
-
-  @Override
-  public Enumeration<String> getAttributeNames() {
-    return Collections.enumeration(attributes.keySet());
-  }
-
-  @Override
-  public String getCharacterEncoding() {
-    return UTF_8.name();
-  }
-
-  @Override
-  public int getContentLength() {
-    return -1;
-  }
-
-  @Override
-  public String getContentType() {
-    return null;
-  }
-
-  @Override
-  public ServletInputStream getInputStream() {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public String getLocalAddr() {
-    return "1.2.3.4";
-  }
-
-  @Override
-  public String getLocalName() {
-    return hostName;
-  }
-
-  @Override
-  public int getLocalPort() {
-    return port;
-  }
-
-  @Override
-  public Locale getLocale() {
-    return Locale.US;
-  }
-
-  @Override
-  public Enumeration<Locale> getLocales() {
-    return Collections.enumeration(Collections.singleton(Locale.US));
-  }
-
-  @Override
-  public String getParameter(String name) {
-    return Iterables.getFirst(parameters.get(name), null);
-  }
-
-  @Override
-  public Map<String, String[]> getParameterMap() {
-    return Collections.unmodifiableMap(
-        Maps.transformValues(parameters.asMap(), vs -> vs.toArray(new String[0])));
-  }
-
-  @Override
-  public Enumeration<String> getParameterNames() {
-    return Collections.enumeration(parameters.keySet());
-  }
-
-  @Override
-  public String[] getParameterValues(String name) {
-    return parameters.get(name).toArray(new String[0]);
-  }
-
-  public void setQueryString(String qs) {
-    this.queryString = qs;
-    ListMultimap<String, String> params = LinkedListMultimap.create();
-    for (String entry : Splitter.on('&').split(qs)) {
-      List<String> kv = Splitter.on('=').limit(2).splitToList(entry);
-      try {
-        params.put(
-            URLDecoder.decode(kv.get(0), UTF_8.name()),
-            kv.size() == 2 ? URLDecoder.decode(kv.get(1), UTF_8.name()) : "");
-      } catch (UnsupportedEncodingException e) {
-        throw new IllegalArgumentException(e);
-      }
-    }
-    parameters = params;
-  }
-
-  @Override
-  public String getProtocol() {
-    return "HTTP/1.1";
-  }
-
-  @Override
-  public BufferedReader getReader() {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  @Deprecated
-  public String getRealPath(String path) {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public String getRemoteAddr() {
-    return "5.6.7.8";
-  }
-
-  @Override
-  public String getRemoteHost() {
-    return "remotehost";
-  }
-
-  @Override
-  public int getRemotePort() {
-    return 1234;
-  }
-
-  @Override
-  public RequestDispatcher getRequestDispatcher(String path) {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public String getScheme() {
-    return port == 443 ? "https" : "http";
-  }
-
-  @Override
-  public String getServerName() {
-    return hostName;
-  }
-
-  @Override
-  public int getServerPort() {
-    return port;
-  }
-
-  @Override
-  public boolean isSecure() {
-    return port == 443;
-  }
-
-  @Override
-  public void removeAttribute(String name) {
-    attributes.remove(name);
-  }
-
-  @Override
-  public void setAttribute(String name, Object value) {
-    attributes.put(name, value);
-  }
-
-  @Override
-  public void setCharacterEncoding(String env) throws UnsupportedOperationException {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public String getAuthType() {
-    return null;
-  }
-
-  @Override
-  public String getContextPath() {
-    return contextPath;
-  }
-
-  @Override
-  public Cookie[] getCookies() {
-    return new Cookie[0];
-  }
-
-  @Override
-  public long getDateHeader(String name) {
-    String v = getHeader(name);
-    return v == null ? 0 : rfcDateformatter.parse(v, Instant::from).getEpochSecond();
-  }
-
-  @Override
-  public String getHeader(String name) {
-    return Iterables.getFirst(headers.get(name), null);
-  }
-
-  @Override
-  public Enumeration<String> getHeaderNames() {
-    return Collections.enumeration(headers.keySet());
-  }
-
-  @Override
-  public Enumeration<String> getHeaders(String name) {
-    return Collections.enumeration(headers.get(name));
-  }
-
-  @Override
-  public int getIntHeader(String name) {
-    return Integer.parseInt(getHeader(name));
-  }
-
-  @Override
-  public String getMethod() {
-    return "GET";
-  }
-
-  @Override
-  public String getPathInfo() {
-    return path;
-  }
-
-  public FakeHttpServletRequest setPathInfo(String path) {
-    this.path = path;
-    return this;
-  }
-
-  @Override
-  public String getPathTranslated() {
-    return path;
-  }
-
-  @Override
-  public String getQueryString() {
-    return queryString;
-  }
-
-  @Override
-  public String getRemoteUser() {
-    return null;
-  }
-
-  @Override
-  public String getRequestURI() {
-    String uri = contextPath + servletPath + path;
-    if (!Strings.isNullOrEmpty(queryString)) {
-      uri += '?' + queryString;
-    }
-    return uri;
-  }
-
-  @Override
-  public StringBuffer getRequestURL() {
-    return null;
-  }
-
-  @Override
-  public String getRequestedSessionId() {
-    return null;
-  }
-
-  @Override
-  public String getServletPath() {
-    return servletPath;
-  }
-
-  @Override
-  public HttpSession getSession() {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public HttpSession getSession(boolean create) {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public Principal getUserPrincipal() {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public boolean isRequestedSessionIdFromCookie() {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public boolean isRequestedSessionIdFromURL() {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  @Deprecated
-  public boolean isRequestedSessionIdFromUrl() {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public boolean isRequestedSessionIdValid() {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public boolean isUserInRole(String role) {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public AsyncContext getAsyncContext() {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public DispatcherType getDispatcherType() {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public ServletContext getServletContext() {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public boolean isAsyncStarted() {
-    return false;
-  }
-
-  @Override
-  public boolean isAsyncSupported() {
-    return false;
-  }
-
-  @Override
-  public AsyncContext startAsync() {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public AsyncContext startAsync(ServletRequest req, ServletResponse res) {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public boolean authenticate(HttpServletResponse res) {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public Part getPart(String name) {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public Collection<Part> getParts() {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public void login(String username, String password) {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public void logout() {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public long getContentLengthLong() {
-    return getContentLength();
-  }
-
-  @Override
-  public String changeSessionId() {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public <T extends HttpUpgradeHandler> T upgrade(Class<T> httpUpgradeHandlerClass) {
-    throw new UnsupportedOperationException();
-  }
-
-  public FakeHttpServletRequest addHeader(String name, String value) {
-    headers.put(name, value);
-    return this;
-  }
-}
diff --git a/gerrit-util-http/src/test/java/com/google/gerrit/util/http/testutil/FakeHttpServletResponse.java b/gerrit-util-http/src/test/java/com/google/gerrit/util/http/testutil/FakeHttpServletResponse.java
deleted file mode 100644
index f6b3e30..0000000
--- a/gerrit-util-http/src/test/java/com/google/gerrit/util/http/testutil/FakeHttpServletResponse.java
+++ /dev/null
@@ -1,285 +0,0 @@
-// Copyright (C) 2015 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.google.gerrit.util.http.testutil;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.common.collect.Iterables;
-import com.google.common.collect.LinkedListMultimap;
-import com.google.common.collect.ListMultimap;
-import com.google.common.net.HttpHeaders;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.nio.charset.Charset;
-import java.util.Collection;
-import java.util.Locale;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.WriteListener;
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletResponse;
-import org.eclipse.jgit.util.RawParseUtils;
-
-/** Simple fake implementation of {@link HttpServletResponse}. */
-public class FakeHttpServletResponse implements HttpServletResponse {
-  private final ByteArrayOutputStream actualBody = new ByteArrayOutputStream();
-  private final ListMultimap<String, String> headers = LinkedListMultimap.create();
-
-  private int status = SC_OK;
-  private boolean committed;
-  private ServletOutputStream outputStream;
-  private PrintWriter writer;
-
-  public FakeHttpServletResponse() {}
-
-  @Override
-  public synchronized void flushBuffer() throws IOException {
-    if (outputStream != null) {
-      outputStream.flush();
-    }
-    if (writer != null) {
-      writer.flush();
-    }
-  }
-
-  @Override
-  public int getBufferSize() {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public String getCharacterEncoding() {
-    return UTF_8.name();
-  }
-
-  @Override
-  public String getContentType() {
-    return null;
-  }
-
-  @Override
-  public Locale getLocale() {
-    return Locale.US;
-  }
-
-  @Override
-  public synchronized ServletOutputStream getOutputStream() {
-    checkState(writer == null, "getWriter() already called");
-    if (outputStream == null) {
-      outputStream =
-          new ServletOutputStream() {
-            @Override
-            public void write(int c) throws IOException {
-              actualBody.write(c);
-            }
-
-            @Override
-            public boolean isReady() {
-              return true;
-            }
-
-            @Override
-            public void setWriteListener(WriteListener listener) {
-              throw new UnsupportedOperationException();
-            }
-          };
-    }
-    return outputStream;
-  }
-
-  @Override
-  public synchronized PrintWriter getWriter() {
-    checkState(outputStream == null, "getOutputStream() already called");
-    if (writer == null) {
-      writer = new PrintWriter(new OutputStreamWriter(actualBody, UTF_8));
-    }
-    return writer;
-  }
-
-  @Override
-  public synchronized boolean isCommitted() {
-    return committed;
-  }
-
-  @Override
-  public void reset() {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public void resetBuffer() {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public void setBufferSize(int sz) {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public void setCharacterEncoding(String name) {
-    checkArgument(UTF_8.equals(Charset.forName(name)), "unsupported charset: %s", name);
-  }
-
-  @Override
-  public void setContentLength(int length) {
-    setContentLengthLong(length);
-  }
-
-  @Override
-  public void setContentLengthLong(long length) {
-    headers.removeAll(HttpHeaders.CONTENT_LENGTH);
-    addHeader(HttpHeaders.CONTENT_LENGTH, Long.toString(length));
-  }
-
-  @Override
-  public void setContentType(String type) {
-    headers.removeAll(HttpHeaders.CONTENT_TYPE);
-    addHeader(HttpHeaders.CONTENT_TYPE, type);
-  }
-
-  @Override
-  public void setLocale(Locale locale) {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public void addCookie(Cookie cookie) {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public void addDateHeader(String name, long value) {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public void addHeader(String name, String value) {
-    headers.put(name.toLowerCase(), value);
-  }
-
-  @Override
-  public void addIntHeader(String name, int value) {
-    addHeader(name, Integer.toString(value));
-  }
-
-  @Override
-  public boolean containsHeader(String name) {
-    return headers.containsKey(name.toLowerCase());
-  }
-
-  @Override
-  public String encodeRedirectURL(String url) {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  @Deprecated
-  public String encodeRedirectUrl(String url) {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public String encodeURL(String url) {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  @Deprecated
-  public String encodeUrl(String url) {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
-  public synchronized void sendError(int sc) {
-    status = sc;
-    committed = true;
-  }
-
-  @Override
-  public synchronized void sendError(int sc, String msg) {
-    status = sc;
-    committed = true;
-  }
-
-  @Override
-  public synchronized void sendRedirect(String loc) {
-    status = SC_FOUND;
-    setHeader(HttpHeaders.LOCATION, loc);
-    committed = true;
-  }
-
-  @Override
-  public void setDateHeader(String name, long value) {
-    setHeader(name, Long.toString(value));
-  }
-
-  @Override
-  public void setHeader(String name, String value) {
-    headers.removeAll(name.toLowerCase());
-    addHeader(name, value);
-  }
-
-  @Override
-  public void setIntHeader(String name, int value) {
-    headers.removeAll(name.toLowerCase());
-    addIntHeader(name, value);
-  }
-
-  @Override
-  public synchronized void setStatus(int sc) {
-    status = sc;
-    committed = true;
-  }
-
-  @Override
-  @Deprecated
-  public synchronized void setStatus(int sc, String msg) {
-    status = sc;
-    committed = true;
-  }
-
-  @Override
-  public synchronized int getStatus() {
-    return status;
-  }
-
-  @Override
-  public String getHeader(String name) {
-    return Iterables.getFirst(headers.get(checkNotNull(name.toLowerCase())), null);
-  }
-
-  @Override
-  public Collection<String> getHeaderNames() {
-    return headers.keySet();
-  }
-
-  @Override
-  public Collection<String> getHeaders(String name) {
-    return headers.get(checkNotNull(name.toLowerCase()));
-  }
-
-  public byte[] getActualBody() {
-    return actualBody.toByteArray();
-  }
-
-  public String getActualBodyString() {
-    return RawParseUtils.decode(getActualBody());
-  }
-}
diff --git a/gerrit-util-ssl/BUILD b/gerrit-util-ssl/BUILD
deleted file mode 100644
index ce53a26..0000000
--- a/gerrit-util-ssl/BUILD
+++ /dev/null
@@ -1,5 +0,0 @@
-java_library(
-    name = "ssl",
-    srcs = glob(["src/main/java/**/*.java"]),
-    visibility = ["//visibility:public"],
-)
diff --git a/gerrit-war/BUILD b/gerrit-war/BUILD
deleted file mode 100644
index 82a2e21..0000000
--- a/gerrit-war/BUILD
+++ /dev/null
@@ -1,74 +0,0 @@
-load("//tools/bzl:genrule2.bzl", "genrule2")
-
-java_library(
-    name = "init",
-    srcs = glob(["src/main/java/**/*.java"]),
-    visibility = ["//visibility:public"],
-    deps = [
-        "//gerrit-cache-h2:cache-h2",
-        "//gerrit-cache-mem:mem",
-        "//gerrit-elasticsearch:elasticsearch",
-        "//gerrit-extension-api:api",
-        "//gerrit-gpg:gpg",
-        "//gerrit-httpd:httpd",
-        "//gerrit-lucene:lucene",
-        "//gerrit-oauth:oauth",
-        "//gerrit-openid:openid",
-        "//gerrit-pgm:http",
-        "//gerrit-pgm:init",
-        "//gerrit-pgm:init-api",
-        "//gerrit-pgm:util",
-        "//gerrit-reviewdb:server",
-        "//gerrit-server:module",
-        "//gerrit-server:prolog-common",
-        "//gerrit-server:receive",
-        "//gerrit-server:server",
-        "//gerrit-sshd:sshd",
-        "//lib:guava",
-        "//lib:gwtorm",
-        "//lib:servlet-api-3_1",
-        "//lib/guice",
-        "//lib/guice:guice-servlet",
-        "//lib/jgit/org.eclipse.jgit:jgit",
-        "//lib/log:api",
-    ],
-)
-
-genrule2(
-    name = "webapp_assets",
-    srcs = glob(["src/main/webapp/**/*"]),
-    outs = ["webapp_assets.zip"],
-    cmd = "cd gerrit-war/src/main/webapp; zip -qr $$ROOT/$@ .",
-    visibility = ["//visibility:public"],
-)
-
-java_import(
-    name = "log4j-config",
-    jars = [":log4j-config__jar"],
-    visibility = ["//visibility:public"],
-)
-
-genrule2(
-    name = "log4j-config__jar",
-    srcs = ["src/main/resources/log4j.properties"],
-    outs = ["log4j-config.jar"],
-    cmd = "cd gerrit-war/src/main/resources && zip -9Dqr $$ROOT/$@ .",
-)
-
-java_import(
-    name = "version",
-    jars = [":gen_version"],
-    visibility = ["//visibility:public"],
-)
-
-genrule2(
-    name = "gen_version",
-    outs = ["gen_version.jar"],
-    cmd = " && ".join([
-        "cd $$TMP",
-        "mkdir -p com/google/gerrit/common",
-        "cat $$ROOT/$(location //:version.txt) >com/google/gerrit/common/Version",
-        "zip -9Dqr $$ROOT/$@ .",
-    ]),
-    tools = ["//:version.txt"],
-)
diff --git a/gerrit-war/pom.xml b/gerrit-war/pom.xml
deleted file mode 100644
index 2f9fa52..0000000
--- a/gerrit-war/pom.xml
+++ /dev/null
@@ -1,83 +0,0 @@
-<project>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>com.google.gerrit</groupId>
-  <artifactId>gerrit-war</artifactId>
-  <version>2.15.12-SNAPSHOT</version>
-  <packaging>war</packaging>
-  <name>Gerrit Code Review - WAR</name>
-  <description>Gerrit WAR</description>
-  <url>https://www.gerritcodereview.com/</url>
-
-  <licenses>
-    <license>
-      <name>The Apache Software License, Version 2.0</name>
-      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
-      <distribution>repo</distribution>
-    </license>
-  </licenses>
-
-  <scm>
-    <url>https://gerrit.googlesource.com/gerrit</url>
-    <connection>https://gerrit.googlesource.com/gerrit</connection>
-  </scm>
-
-  <developers>
-    <developer>
-      <name>Alice Kober-Sotzek</name>
-    </developer>
-    <developer>
-      <name>Ben Rohlfs</name>
-    </developer>
-    <developer>
-      <name>Dave Borowitz</name>
-    </developer>
-    <developer>
-      <name>David Ostrovsky</name>
-    </developer>
-    <developer>
-      <name>David Pursehouse</name>
-    </developer>
-    <developer>
-      <name>Edwin Kempin</name>
-    </developer>
-    <developer>
-      <name>Han-Wen Nienhuys</name>
-    </developer>
-    <developer>
-      <name>Hugo Arès</name>
-    </developer>
-    <developer>
-      <name>Luca Milanesio</name>
-    </developer>
-    <developer>
-      <name>Marco Miller</name>
-    </developer>
-    <developer>
-      <name>Martin Fick</name>
-    </developer>
-    <developer>
-      <name>Ole Rehmsen</name>
-    </developer>
-    <developer>
-      <name>Patrick Hiesel</name>
-    </developer>
-    <developer>
-      <name>Saša Živkov</name>
-    </developer>
-  </developers>
-
-  <mailingLists>
-    <mailingList>
-      <name>Repo and Gerrit Discussion</name>
-      <post>repo-discuss@googlegroups.com</post>
-      <subscribe>https://groups.google.com/forum/#!forum/repo-discuss</subscribe>
-      <unsubscribe>https://groups.google.com/forum/#!forum/repo-discuss</unsubscribe>
-      <archive>https://groups.google.com/forum/#!forum/repo-discuss</archive>
-    </mailingList>
-  </mailingLists>
-
-  <issueManagement>
-    <url>https://bugs.chromium.org/p/gerrit/issues/list</url>
-    <system>Gerrit Issue Tracker</system>
-  </issueManagement>
-</project>
diff --git a/gerrit-war/src/main/java/com/google/gerrit/httpd/ReviewDbDataSourceProvider.java b/gerrit-war/src/main/java/com/google/gerrit/httpd/ReviewDbDataSourceProvider.java
deleted file mode 100644
index 616030e..0000000
--- a/gerrit-war/src/main/java/com/google/gerrit/httpd/ReviewDbDataSourceProvider.java
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.httpd;
-
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.inject.Provider;
-import com.google.inject.ProvisionException;
-import com.google.inject.Singleton;
-import javax.naming.InitialContext;
-import javax.naming.NamingException;
-import javax.sql.DataSource;
-
-/** Provides access to the {@code ReviewDb} DataSource. */
-@Singleton
-final class ReviewDbDataSourceProvider implements Provider<DataSource>, LifecycleListener {
-  private DataSource ds;
-
-  @Override
-  public synchronized DataSource get() {
-    if (ds == null) {
-      ds = open();
-    }
-    return ds;
-  }
-
-  @Override
-  public void start() {}
-
-  @Override
-  public synchronized void stop() {
-    if (ds != null) {
-      closeDataSource(ds);
-    }
-  }
-
-  private DataSource open() {
-    final String dsName = "java:comp/env/jdbc/ReviewDb";
-    try {
-      return (DataSource) new InitialContext().lookup(dsName);
-    } catch (NamingException namingErr) {
-      throw new ProvisionException("No DataSource " + dsName, namingErr);
-    }
-  }
-
-  private void closeDataSource(DataSource ds) {
-    try {
-      Class<?> type = Class.forName("org.apache.commons.dbcp.BasicDataSource");
-      if (type.isInstance(ds)) {
-        type.getMethod("close").invoke(ds);
-        return;
-      }
-    } catch (Throwable bad) {
-      // Oh well, its not a Commons DBCP pooled connection.
-    }
-
-    try {
-      Class<?> type = Class.forName("com.mchange.v2.c3p0.DataSources");
-      if (type.isInstance(ds)) {
-        type.getMethod("destroy", DataSource.class).invoke(null, ds);
-      }
-    } catch (Throwable bad) {
-      // Oh well, its not a c3p0 pooled connection.
-    }
-  }
-}
diff --git a/gerrit-war/src/main/java/com/google/gerrit/httpd/SiteInitializer.java b/gerrit-war/src/main/java/com/google/gerrit/httpd/SiteInitializer.java
deleted file mode 100644
index 07e662b..0000000
--- a/gerrit-war/src/main/java/com/google/gerrit/httpd/SiteInitializer.java
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright (C) 2013 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.google.gerrit.httpd;
-
-import com.google.gerrit.pgm.init.BaseInit;
-import com.google.gerrit.pgm.init.PluginsDistribution;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.List;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public final class SiteInitializer {
-  private static final Logger LOG = LoggerFactory.getLogger(SiteInitializer.class);
-
-  private final String sitePath;
-  private final String initPath;
-  private final PluginsDistribution pluginsDistribution;
-  private final List<String> pluginsToInstall;
-
-  SiteInitializer(
-      String sitePath,
-      String initPath,
-      PluginsDistribution pluginsDistribution,
-      List<String> pluginsToInstall) {
-    this.sitePath = sitePath;
-    this.initPath = initPath;
-    this.pluginsDistribution = pluginsDistribution;
-    this.pluginsToInstall = pluginsToInstall;
-  }
-
-  public void init() {
-    try {
-      if (sitePath != null) {
-        Path site = Paths.get(sitePath);
-        LOG.info("Initializing site at " + site.toRealPath().normalize());
-        new BaseInit(site, false, true, pluginsDistribution, pluginsToInstall).run();
-        return;
-      }
-
-      try (Connection conn = connectToDb()) {
-        Path site = getSiteFromReviewDb(conn);
-        if (site == null && initPath != null) {
-          site = Paths.get(initPath);
-        }
-        if (site != null) {
-          LOG.info("Initializing site at " + site.toRealPath().normalize());
-          new BaseInit(
-                  site,
-                  new ReviewDbDataSourceProvider(),
-                  false,
-                  false,
-                  pluginsDistribution,
-                  pluginsToInstall)
-              .run();
-        }
-      }
-    } catch (Exception e) {
-      LOG.error("Site init failed", e);
-      throw new RuntimeException(e);
-    }
-  }
-
-  private Connection connectToDb() throws SQLException {
-    return new ReviewDbDataSourceProvider().get().getConnection();
-  }
-
-  private Path getSiteFromReviewDb(Connection conn) {
-    try (Statement stmt = conn.createStatement();
-        ResultSet rs = stmt.executeQuery("SELECT site_path FROM system_config")) {
-      if (rs.next()) {
-        return Paths.get(rs.getString(1));
-      }
-    } catch (SQLException e) {
-      return null;
-    }
-    return null;
-  }
-}
diff --git a/gerrit-war/src/main/java/com/google/gerrit/httpd/SitePathFromSystemConfigProvider.java b/gerrit-war/src/main/java/com/google/gerrit/httpd/SitePathFromSystemConfigProvider.java
deleted file mode 100644
index e1eb9de..0000000
--- a/gerrit-war/src/main/java/com/google/gerrit/httpd/SitePathFromSystemConfigProvider.java
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.httpd;
-
-import com.google.gerrit.reviewdb.client.SystemConfig;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.config.SitePath;
-import com.google.gerrit.server.schema.ReviewDbFactory;
-import com.google.gwtorm.server.OrmException;
-import com.google.gwtorm.server.SchemaFactory;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.List;
-
-/** Provides {@link Path} annotated with {@link SitePath}. */
-class SitePathFromSystemConfigProvider implements Provider<Path> {
-  private final Path path;
-
-  @Inject
-  SitePathFromSystemConfigProvider(@ReviewDbFactory SchemaFactory<ReviewDb> schemaFactory)
-      throws OrmException {
-    path = read(schemaFactory);
-  }
-
-  @Override
-  public Path get() {
-    return path;
-  }
-
-  private static Path read(SchemaFactory<ReviewDb> schemaFactory) throws OrmException {
-    try (ReviewDb db = schemaFactory.open()) {
-      List<SystemConfig> all = db.systemConfig().all().toList();
-      switch (all.size()) {
-        case 1:
-          return Paths.get(all.get(0).sitePath);
-        case 0:
-          throw new OrmException("system_config table is empty");
-        default:
-          throw new OrmException(
-              "system_config must have exactly 1 row; found " + all.size() + " rows instead");
-      }
-    }
-  }
-}
diff --git a/gerrit-war/src/main/java/com/google/gerrit/httpd/UnzippedDistribution.java b/gerrit-war/src/main/java/com/google/gerrit/httpd/UnzippedDistribution.java
deleted file mode 100644
index ec92fba..0000000
--- a/gerrit-war/src/main/java/com/google/gerrit/httpd/UnzippedDistribution.java
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright (C) 2014 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.google.gerrit.httpd;
-
-import static com.google.gerrit.pgm.init.InitPlugins.JAR;
-import static com.google.gerrit.pgm.init.InitPlugins.PLUGIN_DIR;
-
-import com.google.gerrit.pgm.init.PluginsDistribution;
-import com.google.inject.Singleton;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.Files;
-import java.util.ArrayList;
-import java.util.List;
-import javax.servlet.ServletContext;
-
-@Singleton
-class UnzippedDistribution implements PluginsDistribution {
-
-  private ServletContext servletContext;
-  private File pluginsDir;
-
-  UnzippedDistribution(ServletContext servletContext) {
-    this.servletContext = servletContext;
-  }
-
-  @Override
-  public void foreach(Processor processor) throws FileNotFoundException, IOException {
-    File[] list = getPluginsDir().listFiles();
-    if (list != null) {
-      for (File p : list) {
-        String pluginJarName = p.getName();
-        String pluginName = pluginJarName.substring(0, pluginJarName.length() - JAR.length());
-        try (InputStream in = Files.newInputStream(p.toPath())) {
-          processor.process(pluginName, in);
-        }
-      }
-    }
-  }
-
-  @Override
-  public List<String> listPluginNames() throws FileNotFoundException {
-    List<String> names = new ArrayList<>();
-    String[] list = getPluginsDir().list();
-    if (list != null) {
-      for (String pluginJarName : list) {
-        String pluginName = pluginJarName.substring(0, pluginJarName.length() - JAR.length());
-        names.add(pluginName);
-      }
-    }
-    return names;
-  }
-
-  private File getPluginsDir() {
-    if (pluginsDir == null) {
-      File root = new File(servletContext.getRealPath(""));
-      pluginsDir = new File(root, PLUGIN_DIR);
-    }
-    return pluginsDir;
-  }
-}
diff --git a/gerrit-war/src/main/java/com/google/gerrit/httpd/WebAppInitializer.java b/gerrit-war/src/main/java/com/google/gerrit/httpd/WebAppInitializer.java
deleted file mode 100644
index 28c9137..0000000
--- a/gerrit-war/src/main/java/com/google/gerrit/httpd/WebAppInitializer.java
+++ /dev/null
@@ -1,462 +0,0 @@
-// Copyright (C) 2009 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.google.gerrit.httpd;
-
-import static com.google.inject.Scopes.SINGLETON;
-import static com.google.inject.Stage.PRODUCTION;
-
-import com.google.common.base.Splitter;
-import com.google.gerrit.common.EventBroker;
-import com.google.gerrit.elasticsearch.ElasticIndexModule;
-import com.google.gerrit.extensions.client.AuthType;
-import com.google.gerrit.gpg.GpgModule;
-import com.google.gerrit.httpd.auth.oauth.OAuthModule;
-import com.google.gerrit.httpd.auth.openid.OpenIdModule;
-import com.google.gerrit.httpd.plugins.HttpPluginModule;
-import com.google.gerrit.httpd.raw.StaticModule;
-import com.google.gerrit.lifecycle.LifecycleManager;
-import com.google.gerrit.lifecycle.LifecycleModule;
-import com.google.gerrit.lucene.LuceneIndexModule;
-import com.google.gerrit.metrics.dropwizard.DropWizardMetricMaker;
-import com.google.gerrit.pgm.util.LogFileCompressor;
-import com.google.gerrit.server.LibModuleLoader;
-import com.google.gerrit.server.ModuleOverloader;
-import com.google.gerrit.server.StartupChecks;
-import com.google.gerrit.server.account.AccountDeactivator;
-import com.google.gerrit.server.account.InternalAccountDirectory;
-import com.google.gerrit.server.cache.h2.H2CacheModule;
-import com.google.gerrit.server.cache.mem.DefaultMemoryCacheModule;
-import com.google.gerrit.server.change.ChangeCleanupRunner;
-import com.google.gerrit.server.config.AuthConfig;
-import com.google.gerrit.server.config.AuthConfigModule;
-import com.google.gerrit.server.config.CanonicalWebUrlModule;
-import com.google.gerrit.server.config.DownloadConfig;
-import com.google.gerrit.server.config.GerritGlobalModule;
-import com.google.gerrit.server.config.GerritOptions;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.GerritServerConfigModule;
-import com.google.gerrit.server.config.RestCacheAdminModule;
-import com.google.gerrit.server.config.SitePath;
-import com.google.gerrit.server.events.StreamEventsApiListener;
-import com.google.gerrit.server.git.GarbageCollectionModule;
-import com.google.gerrit.server.git.GitRepositoryManagerModule;
-import com.google.gerrit.server.git.SearchingChangeCacheImpl;
-import com.google.gerrit.server.git.WorkQueue;
-import com.google.gerrit.server.git.receive.ReceiveCommitsExecutorModule;
-import com.google.gerrit.server.index.IndexModule;
-import com.google.gerrit.server.index.IndexModule.IndexType;
-import com.google.gerrit.server.index.OnlineUpgrader;
-import com.google.gerrit.server.index.VersionManager;
-import com.google.gerrit.server.mail.SignedTokenEmailTokenVerifier;
-import com.google.gerrit.server.mail.receive.MailReceiver;
-import com.google.gerrit.server.mail.send.SmtpEmailSender;
-import com.google.gerrit.server.mime.MimeUtil2Module;
-import com.google.gerrit.server.notedb.NotesMigration;
-import com.google.gerrit.server.patch.DiffExecutorModule;
-import com.google.gerrit.server.plugins.PluginGuiceEnvironment;
-import com.google.gerrit.server.plugins.PluginModule;
-import com.google.gerrit.server.plugins.PluginRestApiModule;
-import com.google.gerrit.server.project.DefaultPermissionBackendModule;
-import com.google.gerrit.server.schema.DataSourceModule;
-import com.google.gerrit.server.schema.DataSourceProvider;
-import com.google.gerrit.server.schema.DataSourceType;
-import com.google.gerrit.server.schema.DatabaseModule;
-import com.google.gerrit.server.schema.JdbcAccountPatchReviewStore;
-import com.google.gerrit.server.schema.SchemaModule;
-import com.google.gerrit.server.schema.SchemaVersionCheck;
-import com.google.gerrit.server.securestore.SecureStoreClassName;
-import com.google.gerrit.server.ssh.NoSshModule;
-import com.google.gerrit.server.ssh.SshAddressesModule;
-import com.google.gerrit.sshd.SshHostKeyModule;
-import com.google.gerrit.sshd.SshKeyCacheImpl;
-import com.google.gerrit.sshd.SshModule;
-import com.google.gerrit.sshd.commands.DefaultCommandModule;
-import com.google.gerrit.sshd.commands.IndexCommandsModule;
-import com.google.gerrit.sshd.plugin.LfsPluginAuthCommand;
-import com.google.inject.AbstractModule;
-import com.google.inject.CreationException;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import com.google.inject.Key;
-import com.google.inject.Module;
-import com.google.inject.Provider;
-import com.google.inject.name.Names;
-import com.google.inject.servlet.GuiceFilter;
-import com.google.inject.servlet.GuiceServletContextListener;
-import com.google.inject.spi.Message;
-import com.google.inject.util.Providers;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.sql.DataSource;
-import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/** Configures the web application environment for Gerrit Code Review. */
-public class WebAppInitializer extends GuiceServletContextListener implements Filter {
-  private static final Logger log = LoggerFactory.getLogger(WebAppInitializer.class);
-
-  private Path sitePath;
-  private Injector dbInjector;
-  private Injector cfgInjector;
-  private Config config;
-  private Injector sysInjector;
-  private Injector webInjector;
-  private Injector sshInjector;
-  private LifecycleManager manager;
-  private GuiceFilter filter;
-
-  private ServletContext servletContext;
-  private IndexType indexType;
-
-  @Override
-  public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
-      throws IOException, ServletException {
-    filter.doFilter(req, res, chain);
-  }
-
-  private synchronized void init() {
-    if (manager == null) {
-      final String path = System.getProperty("gerrit.site_path");
-      if (path != null) {
-        sitePath = Paths.get(path);
-      }
-
-      if (System.getProperty("gerrit.init") != null) {
-        List<String> pluginsToInstall;
-        String installPlugins = System.getProperty("gerrit.install_plugins");
-        if (installPlugins == null) {
-          pluginsToInstall = null;
-        } else {
-          pluginsToInstall =
-              Splitter.on(",").trimResults().omitEmptyStrings().splitToList(installPlugins);
-        }
-        new SiteInitializer(
-                path,
-                System.getProperty("gerrit.init_path"),
-                new UnzippedDistribution(servletContext),
-                pluginsToInstall)
-            .init();
-      }
-
-      try {
-        dbInjector = createDbInjector();
-      } catch (CreationException ce) {
-        final Message first = ce.getErrorMessages().iterator().next();
-        final StringBuilder buf = new StringBuilder();
-        buf.append(first.getMessage());
-        Throwable why = first.getCause();
-        while (why != null) {
-          buf.append("\n  caused by ");
-          buf.append(why.toString());
-          why = why.getCause();
-        }
-        if (first.getCause() != null) {
-          buf.append("\n");
-          buf.append("\nResolve above errors before continuing.");
-          buf.append("\nComplete stack trace follows:");
-        }
-        log.error(buf.toString(), first.getCause());
-        throw new CreationException(Collections.singleton(first));
-      }
-
-      cfgInjector = createCfgInjector();
-      initIndexType();
-      config = cfgInjector.getInstance(Key.get(Config.class, GerritServerConfig.class));
-      sysInjector = createSysInjector();
-      if (!sshdOff()) {
-        sshInjector = createSshInjector();
-      }
-      webInjector = createWebInjector();
-
-      PluginGuiceEnvironment env = sysInjector.getInstance(PluginGuiceEnvironment.class);
-      env.setDbCfgInjector(dbInjector, cfgInjector);
-      if (sshInjector != null) {
-        env.setSshInjector(sshInjector);
-      }
-      env.setHttpInjector(webInjector);
-
-      // Push the Provider<HttpServletRequest> down into the canonical
-      // URL provider. Its optional for that provider, but since we can
-      // supply one we should do so, in case the administrator has not
-      // setup the canonical URL in the configuration file.
-      //
-      // Note we have to do this manually as Guice failed to do the
-      // injection here because the HTTP environment is not visible
-      // to the core server modules.
-      //
-      sysInjector
-          .getInstance(HttpCanonicalWebUrlProvider.class)
-          .setHttpServletRequest(webInjector.getProvider(HttpServletRequest.class));
-
-      filter = webInjector.getInstance(GuiceFilter.class);
-      manager = new LifecycleManager();
-      manager.add(dbInjector);
-      manager.add(cfgInjector);
-      manager.add(sysInjector);
-      if (sshInjector != null) {
-        manager.add(sshInjector);
-      }
-      manager.add(webInjector);
-    }
-  }
-
-  private boolean sshdOff() {
-    return new SshAddressesModule().getListenAddresses(config).isEmpty();
-  }
-
-  private Injector createDbInjector() {
-    final List<Module> modules = new ArrayList<>();
-    AbstractModule secureStore = createSecureStoreModule();
-    modules.add(secureStore);
-    if (sitePath != null) {
-      Module sitePathModule =
-          new AbstractModule() {
-            @Override
-            protected void configure() {
-              bind(Path.class).annotatedWith(SitePath.class).toInstance(sitePath);
-            }
-          };
-      modules.add(sitePathModule);
-
-      Module configModule = new GerritServerConfigModule();
-      modules.add(configModule);
-
-      Injector cfgInjector = Guice.createInjector(sitePathModule, configModule, secureStore);
-      Config cfg = cfgInjector.getInstance(Key.get(Config.class, GerritServerConfig.class));
-      String dbType = cfg.getString("database", null, "type");
-
-      final DataSourceType dst =
-          Guice.createInjector(new DataSourceModule(), configModule, sitePathModule, secureStore)
-              .getInstance(Key.get(DataSourceType.class, Names.named(dbType.toLowerCase())));
-      modules.add(
-          new LifecycleModule() {
-            @Override
-            protected void configure() {
-              bind(DataSourceType.class).toInstance(dst);
-              bind(DataSourceProvider.Context.class)
-                  .toInstance(DataSourceProvider.Context.MULTI_USER);
-              bind(Key.get(DataSource.class, Names.named("ReviewDb")))
-                  .toProvider(DataSourceProvider.class)
-                  .in(SINGLETON);
-              listener().to(DataSourceProvider.class);
-            }
-          });
-
-    } else {
-      modules.add(
-          new LifecycleModule() {
-            @Override
-            protected void configure() {
-              bind(Key.get(DataSource.class, Names.named("ReviewDb")))
-                  .toProvider(ReviewDbDataSourceProvider.class)
-                  .in(SINGLETON);
-              listener().to(ReviewDbDataSourceProvider.class);
-            }
-          });
-
-      // If we didn't get the site path from the system property
-      // we need to get it from the database, as that's our old
-      // method of locating the site path on disk.
-      //
-      modules.add(
-          new AbstractModule() {
-            @Override
-            protected void configure() {
-              bind(Path.class)
-                  .annotatedWith(SitePath.class)
-                  .toProvider(SitePathFromSystemConfigProvider.class)
-                  .in(SINGLETON);
-            }
-          });
-      modules.add(new GerritServerConfigModule());
-    }
-    modules.add(new DatabaseModule());
-    modules.add(new NotesMigration.Module());
-    modules.add(new DropWizardMetricMaker.ApiModule());
-    return Guice.createInjector(PRODUCTION, modules);
-  }
-
-  private Injector createCfgInjector() {
-    final List<Module> modules = new ArrayList<>();
-    modules.add(new SchemaModule());
-    modules.add(SchemaVersionCheck.module());
-    modules.add(new AuthConfigModule());
-    return dbInjector.createChildInjector(modules);
-  }
-
-  private Injector createSysInjector() {
-    final List<Module> modules = new ArrayList<>();
-    modules.add(new DropWizardMetricMaker.RestModule());
-    modules.add(new LogFileCompressor.Module());
-    modules.add(new EventBroker.Module());
-    modules.add(new JdbcAccountPatchReviewStore.Module(config));
-    modules.add(cfgInjector.getInstance(GitRepositoryManagerModule.class));
-    modules.add(new StreamEventsApiListener.Module());
-    modules.add(new ReceiveCommitsExecutorModule());
-    modules.add(new DiffExecutorModule());
-    modules.add(new MimeUtil2Module());
-    modules.add(cfgInjector.getInstance(GerritGlobalModule.class));
-    modules.add(new SearchingChangeCacheImpl.Module());
-    modules.add(new InternalAccountDirectory.Module());
-    modules.add(new DefaultPermissionBackendModule());
-    modules.add(new DefaultMemoryCacheModule());
-    modules.add(new H2CacheModule());
-    modules.add(cfgInjector.getInstance(MailReceiver.Module.class));
-    modules.add(new SmtpEmailSender.Module());
-    modules.add(new SignedTokenEmailTokenVerifier.Module());
-    modules.add(new RestCacheAdminModule());
-    modules.add(new GpgModule(config));
-    modules.add(new StartupChecks.Module());
-
-    // Index module shutdown must happen before work queue shutdown, otherwise
-    // work queue can get stuck waiting on index futures that will never return.
-    modules.add(createIndexModule());
-
-    modules.add(new PluginModule());
-    if (VersionManager.getOnlineUpgrade(config)) {
-      modules.add(new OnlineUpgrader.Module());
-    }
-
-    modules.add(new PluginRestApiModule());
-    modules.add(new WorkQueue.Module());
-    modules.add(
-        new CanonicalWebUrlModule() {
-          @Override
-          protected Class<? extends Provider<String>> provider() {
-            return HttpCanonicalWebUrlProvider.class;
-          }
-        });
-    modules.add(SshKeyCacheImpl.module());
-    modules.add(
-        new AbstractModule() {
-          @Override
-          protected void configure() {
-            bind(GerritOptions.class).toInstance(new GerritOptions(config, false, false, false));
-          }
-        });
-    modules.add(new GarbageCollectionModule());
-    modules.add(new ChangeCleanupRunner.Module());
-    modules.add(new AccountDeactivator.Module());
-    return cfgInjector.createChildInjector(
-        ModuleOverloader.override(modules, LibModuleLoader.loadModules(cfgInjector)));
-  }
-
-  private Module createIndexModule() {
-    switch (indexType) {
-      case LUCENE:
-        return LuceneIndexModule.latestVersion();
-      case ELASTICSEARCH:
-        return ElasticIndexModule.latestVersion();
-      default:
-        throw new IllegalStateException("unsupported index.type = " + indexType);
-    }
-  }
-
-  private void initIndexType() {
-    indexType = IndexModule.getIndexType(cfgInjector);
-  }
-
-  private Injector createSshInjector() {
-    final List<Module> modules = new ArrayList<>();
-    modules.add(sysInjector.getInstance(SshModule.class));
-    modules.add(new SshHostKeyModule());
-    modules.add(
-        new DefaultCommandModule(
-            false,
-            sysInjector.getInstance(DownloadConfig.class),
-            sysInjector.getInstance(LfsPluginAuthCommand.Module.class)));
-    modules.add(new IndexCommandsModule(sysInjector));
-    return sysInjector.createChildInjector(modules);
-  }
-
-  private Injector createWebInjector() {
-    final List<Module> modules = new ArrayList<>();
-    modules.add(RequestContextFilter.module());
-    modules.add(RequestMetricsFilter.module());
-    modules.add(sysInjector.getInstance(GerritAuthModule.class));
-    modules.add(sysInjector.getInstance(GitOverHttpModule.class));
-    modules.add(AllRequestFilter.module());
-    modules.add(sysInjector.getInstance(WebModule.class));
-    modules.add(sysInjector.getInstance(RequireSslFilter.Module.class));
-    if (sshInjector != null) {
-      modules.add(sshInjector.getInstance(WebSshGlueModule.class));
-    } else {
-      modules.add(new NoSshModule());
-    }
-    modules.add(H2CacheBasedWebSession.module());
-    modules.add(new HttpPluginModule());
-
-    AuthConfig authConfig = cfgInjector.getInstance(AuthConfig.class);
-    if (authConfig.getAuthType() == AuthType.OPENID) {
-      modules.add(new OpenIdModule());
-    } else if (authConfig.getAuthType() == AuthType.OAUTH) {
-      modules.add(new OAuthModule());
-    }
-    modules.add(sysInjector.getInstance(GetUserFilter.Module.class));
-
-    // StaticModule contains a "/*" wildcard, place it last.
-    modules.add(sysInjector.getInstance(StaticModule.class));
-
-    return sysInjector.createChildInjector(modules);
-  }
-
-  @Override
-  protected Injector getInjector() {
-    init();
-    return webInjector;
-  }
-
-  @Override
-  public void init(FilterConfig cfg) throws ServletException {
-    servletContext = cfg.getServletContext();
-    contextInitialized(new ServletContextEvent(servletContext));
-    init();
-    manager.start();
-  }
-
-  @Override
-  public void destroy() {
-    if (manager != null) {
-      manager.stop();
-      manager = null;
-    }
-  }
-
-  private AbstractModule createSecureStoreModule() {
-    return new AbstractModule() {
-      @Override
-      public void configure() {
-        String secureStoreClassName = GerritServerConfigModule.getSecureStoreClassName(sitePath);
-        bind(String.class)
-            .annotatedWith(SecureStoreClassName.class)
-            .toProvider(Providers.of(secureStoreClassName));
-      }
-    };
-  }
-}
diff --git a/gerrit-war/src/main/resources/log4j.properties b/gerrit-war/src/main/resources/log4j.properties
deleted file mode 100644
index 8bc9bb2..0000000
--- a/gerrit-war/src/main/resources/log4j.properties
+++ /dev/null
@@ -1,54 +0,0 @@
-# Copyright (C) 2008 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.
-#
-log4j.rootCategory=INFO, stderr
-log4j.appender.stderr=org.apache.log4j.ConsoleAppender
-log4j.appender.stderr.target=System.err
-log4j.appender.stderr.layout=org.apache.log4j.PatternLayout
-log4j.appender.stderr.layout.ConversionPattern=[%d] [%t] %-5p %c %x: %m%n
-
-# Silence non-critical messages from MINA SSHD.
-#
-log4j.logger.org.apache.mina=WARN
-log4j.logger.org.apache.sshd.common=WARN
-log4j.logger.org.apache.sshd.server=WARN
-log4j.logger.org.apache.sshd.common.keyprovider.FileKeyPairProvider=INFO
-log4j.logger.com.google.gerrit.sshd.GerritServerSession=WARN
-
-# Silence non-critical messages from mime-util.
-#
-log4j.logger.eu.medsea.mimeutil=WARN
-
-# Silence non-critical messages from openid4java
-#
-log4j.logger.org.apache.http=WARN
-log4j.logger.org.apache.xml=WARN
-log4j.logger.org.openid4java=WARN
-log4j.logger.org.openid4java.consumer.ConsumerManager=FATAL
-log4j.logger.org.openid4java.discovery.Discovery=ERROR
-log4j.logger.org.openid4java.server.RealmVerifier=ERROR
-log4j.logger.org.openid4java.message.AuthSuccess=ERROR
-
-# Silence non-critical messages from c3p0 (if used).
-#
-log4j.logger.com.mchange.v2.c3p0=WARN
-log4j.logger.com.mchange.v2.resourcepool=WARN
-log4j.logger.com.mchange.v2.sql=WARN
-
-# Silence non-critical messages from Velocity
-#
-log4j.logger.velocity=WARN
-
-# Silence non-critical messages from apache.http
-log4j.logger.org.apache.http=WARN
diff --git a/gerrit-war/src/main/webapp/WEB-INF/web.xml b/gerrit-war/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index 386eb07..0000000
--- a/gerrit-war/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<web-app>
-  <resource-ref>
-    <res-ref-name>jdbc/ReviewDb</res-ref-name>
-    <res-type>javax.sql.DataSource</res-type>
-    <res-auth>Container</res-auth>
-  </resource-ref>
-
-  <filter>
-    <filter-name>guiceFilter</filter-name>
-    <filter-class>com.google.gerrit.httpd.WebAppInitializer</filter-class>
-  </filter>
-  <filter-mapping>
-    <filter-name>guiceFilter</filter-name>
-    <url-pattern>/*</url-pattern>
-  </filter-mapping>
-</web-app>
diff --git a/java/BUILD b/java/BUILD
new file mode 100644
index 0000000..4fc4d79
--- /dev/null
+++ b/java/BUILD
@@ -0,0 +1,12 @@
+java_binary(
+    name = "gerrit-main-class",
+    main_class = "Main",
+    visibility = ["//visibility:public"],
+    runtime_deps = [":gerrit-main-class-lib"],
+)
+
+java_library(
+    name = "gerrit-main-class-lib",
+    srcs = ["Main.java"],
+    deps = ["//java/com/google/gerrit/launcher"],
+)
diff --git a/java/Main.java b/java/Main.java
new file mode 100644
index 0000000..11d8234
--- /dev/null
+++ b/java/Main.java
@@ -0,0 +1,78 @@
+// Copyright (C) 2009 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.
+
+public final class Main {
+  private static final String FLOGGER_BACKEND_PROPERTY = "flogger.backend_factory";
+  private static final String FLOGGER_LOGGING_CONTEXT = "flogger.logging_context";
+
+  // We don't do any real work here because we need to import
+  // the archive lookup code and we cannot import a class in
+  // the default package. So this is just a tiny springboard
+  // to jump into the real main code.
+  //
+
+  public static void main(String[] argv) throws Exception {
+    if (onSupportedJavaVersion()) {
+      configureFloggerBackend();
+      com.google.gerrit.launcher.GerritLauncher.main(argv);
+
+    } else {
+      System.exit(1);
+    }
+  }
+
+  private static boolean onSupportedJavaVersion() {
+    final String version = System.getProperty("java.specification.version");
+    if (1.8 <= parse(version)) {
+      return true;
+    }
+    System.err.println("fatal: Gerrit Code Review requires Java 8 or later");
+    System.err.println("       (trying to run on Java " + version + ")");
+    return false;
+  }
+
+  private static void configureFloggerBackend() {
+    System.setProperty(
+        FLOGGER_LOGGING_CONTEXT, "com.google.gerrit.server.logging.LoggingContext#getInstance");
+
+    if (System.getProperty(FLOGGER_BACKEND_PROPERTY) != null) {
+      // Flogger backend is already configured
+      return;
+    }
+
+    // Configure log4j backend
+    System.setProperty(
+        FLOGGER_BACKEND_PROPERTY,
+        "com.google.common.flogger.backend.log4j.Log4jBackendFactory#getInstance");
+  }
+
+  private static double parse(String version) {
+    if (version == null || version.length() == 0) {
+      return 0.0;
+    }
+
+    try {
+      final int fd = version.indexOf('.');
+      final int sd = version.indexOf('.', fd + 1);
+      if (0 < sd) {
+        version = version.substring(0, sd);
+      }
+      return Double.parseDouble(version);
+    } catch (NumberFormatException e) {
+      return 0.0;
+    }
+  }
+
+  private Main() {}
+}
diff --git a/java/com/google/gerrit/acceptance/AbstractDaemonTest.java b/java/com/google/gerrit/acceptance/AbstractDaemonTest.java
new file mode 100644
index 0000000..d163395
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/AbstractDaemonTest.java
@@ -0,0 +1,1696 @@
+// Copyright (C) 2013 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.google.gerrit.acceptance;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assert_;
+import static com.google.common.truth.Truth8.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static com.google.gerrit.extensions.api.changes.SubmittedTogetherOption.NON_VISIBLE_CHANGES;
+import static com.google.gerrit.reviewdb.client.Patch.COMMIT_MSG;
+import static com.google.gerrit.reviewdb.client.Patch.MERGE_LIST;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static com.google.gerrit.server.project.testing.Util.category;
+import static com.google.gerrit.server.project.testing.Util.value;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.stream.Collectors.toList;
+import static org.eclipse.jgit.lib.Constants.HEAD;
+
+import com.github.rholder.retry.BlockStrategy;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.jimfs.Jimfs;
+import com.google.common.primitives.Chars;
+import com.google.gerrit.acceptance.AcceptanceTestRequestScope.Context;
+import com.google.gerrit.acceptance.testsuite.account.TestSshKeys;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.ContributorAgreement;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.data.LabelFunction;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.LabelValue;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.common.data.PermissionRule;
+import com.google.gerrit.common.data.PermissionRule.Action;
+import com.google.gerrit.extensions.api.GerritApi;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.changes.RevisionApi;
+import com.google.gerrit.extensions.api.changes.SubmittedTogetherInfo;
+import com.google.gerrit.extensions.api.groups.GroupApi;
+import com.google.gerrit.extensions.api.groups.GroupInput;
+import com.google.gerrit.extensions.api.projects.BranchApi;
+import com.google.gerrit.extensions.api.projects.BranchInput;
+import com.google.gerrit.extensions.api.projects.ProjectInput;
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.extensions.client.ListChangesOption;
+import com.google.gerrit.extensions.client.ProjectWatchInfo;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.ChangeType;
+import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.common.DiffInfo;
+import com.google.gerrit.extensions.common.EditInfo;
+import com.google.gerrit.extensions.restapi.BinaryResult;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.index.project.ProjectIndex;
+import com.google.gerrit.index.project.ProjectIndexCollection;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.mail.EmailHeader;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.AnonymousUser;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.OutputFormat;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.account.Accounts;
+import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.account.GroupCache;
+import com.google.gerrit.server.change.BatchAbandon;
+import com.google.gerrit.server.change.ChangeFinder;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.FileContentUtil;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.CanonicalWebUrl;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.PluginConfigFactory;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gerrit.server.index.account.AccountIndex;
+import com.google.gerrit.server.index.account.AccountIndexCollection;
+import com.google.gerrit.server.index.account.AccountIndexer;
+import com.google.gerrit.server.index.change.ChangeIndex;
+import com.google.gerrit.server.index.change.ChangeIndexCollection;
+import com.google.gerrit.server.index.change.ChangeIndexer;
+import com.google.gerrit.server.notedb.ChangeNoteUtil;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.MutableNotesMigration;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.server.project.testing.Util;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gerrit.server.restapi.change.Revisions;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.gerrit.testing.FakeEmailSender;
+import com.google.gerrit.testing.FakeEmailSender.Message;
+import com.google.gerrit.testing.FakeGroupAuditService;
+import com.google.gerrit.testing.NoteDbMode;
+import com.google.gerrit.testing.SshMode;
+import com.google.gerrit.testing.TempFileUtil;
+import com.google.gson.Gson;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.Inject;
+import com.google.inject.Module;
+import com.google.inject.Provider;
+import com.jcraft.jsch.KeyPair;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.file.DirectoryStream;
+import java.nio.file.FileSystem;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.regex.Pattern;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.NullProgressMonitor;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevSort;
+import org.eclipse.jgit.revwalk.RevTree;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.FetchResult;
+import org.eclipse.jgit.transport.RefSpec;
+import org.eclipse.jgit.transport.Transport;
+import org.eclipse.jgit.transport.TransportBundleStream;
+import org.eclipse.jgit.transport.URIish;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.rules.ExpectedException;
+import org.junit.rules.TestRule;
+import org.junit.runner.Description;
+import org.junit.runner.RunWith;
+import org.junit.runners.model.Statement;
+
+@RunWith(ConfigSuite.class)
+public abstract class AbstractDaemonTest {
+  private static GerritServer commonServer;
+  private static Description firstTest;
+
+  @ConfigSuite.Parameter public Config baseConfig;
+  @ConfigSuite.Name private String configName;
+
+  @Rule public ExpectedException exception = ExpectedException.none();
+
+  @Rule
+  public TestRule testRunner =
+      new TestRule() {
+        @Override
+        public Statement apply(Statement base, Description description) {
+          return new Statement() {
+            @Override
+            public void evaluate() throws Throwable {
+              if (firstTest == null) {
+                firstTest = description;
+              }
+              beforeTest(description);
+              ProjectResetter.Config input = resetProjects();
+              if (input == null) {
+                input = defaultResetProjects();
+              }
+
+              try (ProjectResetter resetter = projectResetter.builder().build(input)) {
+                AbstractDaemonTest.this.resetter = resetter;
+                base.evaluate();
+              } finally {
+                AbstractDaemonTest.this.resetter = null;
+                afterTest();
+              }
+            }
+          };
+        }
+      };
+
+  @Inject @CanonicalWebUrl protected Provider<String> canonicalWebUrl;
+  @Inject @GerritPersonIdent protected Provider<PersonIdent> serverIdent;
+  @Inject @GerritServerConfig protected Config cfg;
+  @Inject protected AcceptanceTestRequestScope atrScope;
+  @Inject protected AccountCache accountCache;
+  @Inject protected AccountCreator accountCreator;
+  @Inject protected Accounts accounts;
+  @Inject protected AllProjectsName allProjects;
+  @Inject protected AllUsersName allUsers;
+  @Inject protected BatchUpdate.Factory batchUpdateFactory;
+  @Inject protected ChangeData.Factory changeDataFactory;
+  @Inject protected ChangeFinder changeFinder;
+  @Inject protected ChangeIndexer indexer;
+  @Inject protected ChangeNoteUtil changeNoteUtil;
+  @Inject protected ChangeResource.Factory changeResourceFactory;
+  @Inject protected FakeEmailSender sender;
+  @Inject protected FakeGroupAuditService auditService;
+  @Inject protected GerritApi gApi;
+  @Inject protected GitRepositoryManager repoManager;
+  @Inject protected GroupBackend groupBackend;
+  @Inject protected GroupCache groupCache;
+  @Inject protected IdentifiedUser.GenericFactory identifiedUserFactory;
+  @Inject protected MetaDataUpdate.Server metaDataUpdateFactory;
+  @Inject protected PatchSetUtil psUtil;
+  @Inject protected ProjectCache projectCache;
+  @Inject protected ProjectResetter.Builder.Factory projectResetter;
+  @Inject protected Provider<InternalChangeQuery> queryProvider;
+  @Inject protected PushOneCommit.Factory pushFactory;
+  @Inject protected PluginConfigFactory pluginConfig;
+  @Inject protected Revisions revisions;
+  @Inject protected SystemGroupBackend systemGroupBackend;
+  @Inject protected MutableNotesMigration notesMigration;
+  @Inject protected ChangeNotes.Factory notesFactory;
+  @Inject protected BatchAbandon batchAbandon;
+  @Inject protected TestSshKeys sshKeys;
+
+  protected EventRecorder eventRecorder;
+  protected GerritServer server;
+  protected Project.NameKey project;
+  protected RestSession adminRestSession;
+  protected RestSession userRestSession;
+  protected ReviewDb db;
+  protected SshSession adminSshSession;
+  protected SshSession userSshSession;
+  protected TestAccount admin;
+  protected TestAccount user;
+  protected TestRepository<InMemoryRepository> testRepo;
+  protected String resourcePrefix;
+  protected Description description;
+  protected boolean testRequiresSsh;
+  protected BlockStrategy noSleepBlockStrategy = t -> {}; // Don't sleep in tests.
+
+  @Inject private ChangeIndexCollection changeIndexes;
+  @Inject private AccountIndexCollection accountIndexes;
+  @Inject private ProjectIndexCollection projectIndexes;
+  @Inject private EventRecorder.Factory eventRecorderFactory;
+  @Inject private InProcessProtocol inProcessProtocol;
+  @Inject private Provider<AnonymousUser> anonymousUser;
+  @Inject private SchemaFactory<ReviewDb> reviewDbProvider;
+  @Inject private AccountIndexer accountIndexer;
+
+  private ProjectResetter resetter;
+  private List<Repository> toClose;
+
+  @Before
+  public void clearSender() {
+    sender.clear();
+  }
+
+  @Before
+  public void startEventRecorder() {
+    eventRecorder = eventRecorderFactory.create(admin);
+  }
+
+  @Before
+  public void assumeSshIfRequired() {
+    if (testRequiresSsh) {
+      // If the test uses ssh, we use assume() to make sure ssh is enabled on
+      // the test suite. JUnit will skip tests annotated with @UseSsh if we
+      // disable them using the command line flag.
+      assume().that(SshMode.useSsh()).isTrue();
+    }
+  }
+
+  @After
+  public void closeEventRecorder() {
+    eventRecorder.close();
+  }
+
+  @AfterClass
+  public static void stopCommonServer() throws Exception {
+    if (commonServer != null) {
+      try {
+        commonServer.close();
+      } catch (Throwable t) {
+        throw new AssertionError(
+            "Error stopping common server in "
+                + (firstTest != null ? firstTest.getTestClass().getName() : "unknown test class"),
+            t);
+      } finally {
+        commonServer = null;
+      }
+    }
+    TempFileUtil.cleanup();
+  }
+
+  /** Controls which project and branches should be reset after each test case. */
+  protected ProjectResetter.Config resetProjects() {
+    return null;
+  }
+
+  private ProjectResetter.Config defaultResetProjects() {
+    return new ProjectResetter.Config()
+        // Don't reset all refs so that refs/sequences/changes is not touched and change IDs are
+        // not reused.
+        .reset(allProjects, RefNames.REFS_CONFIG)
+        // Don't reset refs/sequences/accounts so that account IDs are not reused.
+        .reset(
+            allUsers,
+            RefNames.REFS_CONFIG,
+            RefNames.REFS_USERS + "*",
+            RefNames.REFS_EXTERNAL_IDS,
+            RefNames.REFS_GROUPNAMES,
+            RefNames.REFS_GROUPS + "*",
+            RefNames.REFS_STARRED_CHANGES + "*",
+            RefNames.REFS_DRAFT_COMMENTS + "*");
+  }
+
+  protected void restartAsSlave() throws Exception {
+    closeSsh();
+    server = GerritServer.restartAsSlave(server);
+    server.getTestInjector().injectMembers(this);
+    if (resetter != null) {
+      server.getTestInjector().injectMembers(resetter);
+    }
+    initSsh();
+  }
+
+  protected void evictAndReindexAccount(Account.Id accountId) throws IOException {
+    accountCache.evict(accountId);
+    accountIndexer.index(accountId);
+  }
+
+  protected static Config submitWholeTopicEnabledConfig() {
+    Config cfg = new Config();
+    cfg.setBoolean("change", null, "submitWholeTopic", true);
+    return cfg;
+  }
+
+  protected boolean isSubmitWholeTopicEnabled() {
+    return cfg.getBoolean("change", null, "submitWholeTopic", false);
+  }
+
+  protected boolean isContributorAgreementsEnabled() {
+    return cfg.getBoolean("auth", null, "contributorAgreements", false);
+  }
+
+  protected void beforeTest(Description description) throws Exception {
+    this.description = description;
+    GerritServer.Description classDesc =
+        GerritServer.Description.forTestClass(description, configName);
+    GerritServer.Description methodDesc =
+        GerritServer.Description.forTestMethod(description, configName);
+
+    testRequiresSsh = classDesc.useSshAnnotation() || methodDesc.useSshAnnotation();
+    if (!testRequiresSsh) {
+      baseConfig.setString("sshd", null, "listenAddress", "off");
+    }
+
+    baseConfig.setInt("index", null, "batchThreads", -1);
+
+    baseConfig.setInt("receive", null, "changeUpdateThreads", 4);
+    Module module = createModule();
+    if (classDesc.equals(methodDesc) && !classDesc.sandboxed() && !methodDesc.sandboxed()) {
+      if (commonServer == null) {
+        commonServer = GerritServer.initAndStart(classDesc, baseConfig, module);
+      }
+      server = commonServer;
+    } else {
+      server = GerritServer.initAndStart(methodDesc, baseConfig, module);
+    }
+
+    server.getTestInjector().injectMembers(this);
+    Transport.register(inProcessProtocol);
+    toClose = Collections.synchronizedList(new ArrayList<Repository>());
+
+    db = reviewDbProvider.open();
+
+    admin = accountCreator.admin();
+    user = accountCreator.user();
+
+    // Evict and reindex accounts in case tests modify them.
+    evictAndReindexAccount(admin.getId());
+    evictAndReindexAccount(user.getId());
+
+    adminRestSession = new RestSession(server, admin);
+    userRestSession = new RestSession(server, user);
+
+    initSsh();
+
+    resourcePrefix =
+        UNSAFE_PROJECT_NAME
+            .matcher(description.getClassName() + "_" + description.getMethodName() + "_")
+            .replaceAll("");
+
+    Context ctx = newRequestContext(admin);
+    atrScope.set(ctx);
+    ProjectInput in = projectInput(description);
+    gApi.projects().create(in);
+    project = new Project.NameKey(in.name);
+    testRepo = cloneProject(project, getCloneAsAccount(description));
+  }
+
+  /** Override to bind an additional Guice module */
+  public Module createModule() {
+    return null;
+  }
+
+  protected void initSsh() throws Exception {
+    if (testRequiresSsh
+        && SshMode.useSsh()
+        && (adminSshSession == null || userSshSession == null)) {
+      // Create Ssh sessions
+      KeyPair adminKeyPair = sshKeys.getKeyPair(admin);
+      GitUtil.initSsh(adminKeyPair);
+      Context ctx = newRequestContext(user);
+      atrScope.set(ctx);
+      userSshSession = ctx.getSession();
+      userSshSession.open();
+      ctx = newRequestContext(admin);
+      atrScope.set(ctx);
+      adminSshSession = ctx.getSession();
+      adminSshSession.open();
+    }
+  }
+
+  private TestAccount getCloneAsAccount(Description description) {
+    TestProjectInput ann = description.getAnnotation(TestProjectInput.class);
+    return accountCreator.get(ann != null ? ann.cloneAs() : "admin");
+  }
+
+  /** Generate default project properties based on test description */
+  private ProjectInput projectInput(Description description) {
+    ProjectInput in = new ProjectInput();
+    TestProjectInput ann = description.getAnnotation(TestProjectInput.class);
+    in.name = name("project");
+    if (ann != null) {
+      in.parent = Strings.emptyToNull(ann.parent());
+      in.description = Strings.emptyToNull(ann.description());
+      in.createEmptyCommit = ann.createEmptyCommit();
+      in.submitType = ann.submitType();
+      in.useContentMerge = ann.useContributorAgreements();
+      in.useSignedOffBy = ann.useSignedOffBy();
+      in.useContentMerge = ann.useContentMerge();
+      in.rejectEmptyCommit = ann.rejectEmptyCommit();
+      in.enableSignedPush = ann.enableSignedPush();
+      in.requireSignedPush = ann.requireSignedPush();
+    } else {
+      // Defaults should match TestProjectConfig, omitting nullable values.
+      in.createEmptyCommit = true;
+    }
+    updateProjectInput(in);
+    return in;
+  }
+
+  /**
+   * Modify a project input before creating the initial test project.
+   *
+   * @param in input; may be modified in place.
+   */
+  protected void updateProjectInput(ProjectInput in) {
+    // Default implementation does nothing.
+  }
+
+  private static final Pattern UNSAFE_PROJECT_NAME = Pattern.compile("[^a-zA-Z0-9._/-]+");
+
+  protected Git git() {
+    return testRepo.git();
+  }
+
+  protected InMemoryRepository repo() {
+    return testRepo.getRepository();
+  }
+
+  /**
+   * Return a resource name scoped to this test method.
+   *
+   * <p>Test methods in a single class by default share a running server. For any resource name you
+   * require to be unique to a test method, wrap it in a call to this method.
+   *
+   * @param name resource name (group, project, topic, etc.)
+   * @return name prefixed by a string unique to this test method.
+   */
+  protected String name(String name) {
+    return resourcePrefix + name;
+  }
+
+  protected Project.NameKey createProject(String nameSuffix) throws RestApiException {
+    return createProject(nameSuffix, null);
+  }
+
+  protected Project.NameKey createProject(String nameSuffix, Project.NameKey parent)
+      throws RestApiException {
+    // Default for createEmptyCommit should match TestProjectConfig.
+    return createProject(nameSuffix, parent, true, null);
+  }
+
+  protected Project.NameKey createProject(
+      String nameSuffix, Project.NameKey parent, boolean createEmptyCommit)
+      throws RestApiException {
+    // Default for createEmptyCommit should match TestProjectConfig.
+    return createProject(nameSuffix, parent, createEmptyCommit, null);
+  }
+
+  protected Project.NameKey createProject(
+      String nameSuffix, Project.NameKey parent, boolean createEmptyCommit, SubmitType submitType)
+      throws RestApiException {
+    ProjectInput in = new ProjectInput();
+    in.name = name(nameSuffix);
+    in.parent = parent != null ? parent.get() : null;
+    in.submitType = submitType;
+    in.createEmptyCommit = createEmptyCommit;
+    gApi.projects().create(in);
+    return new Project.NameKey(in.name);
+  }
+
+  protected TestRepository<InMemoryRepository> cloneProject(Project.NameKey p) throws Exception {
+    return cloneProject(p, admin);
+  }
+
+  protected TestRepository<InMemoryRepository> cloneProject(
+      Project.NameKey p, TestAccount testAccount) throws Exception {
+    return GitUtil.cloneProject(p, registerRepoConnection(p, testAccount));
+  }
+
+  /**
+   * Register a repository connection over the test protocol.
+   *
+   * @return a URI string that can be used to connect to this repository for both fetch and push.
+   */
+  protected String registerRepoConnection(Project.NameKey p, TestAccount testAccount)
+      throws Exception {
+    InProcessProtocol.Context ctx =
+        new InProcessProtocol.Context(
+            reviewDbProvider, identifiedUserFactory, testAccount.getId(), p);
+    Repository repo = repoManager.openRepository(p);
+    toClose.add(repo);
+    return inProcessProtocol.register(ctx, repo).toString();
+  }
+
+  protected void afterTest() throws Exception {
+    Transport.unregister(inProcessProtocol);
+    for (Repository repo : toClose) {
+      repo.close();
+    }
+    db.close();
+    closeSsh();
+    if (server != commonServer) {
+      server.close();
+      server = null;
+    }
+    NoteDbMode.resetFromEnv(notesMigration);
+  }
+
+  protected void closeSsh() {
+    if (adminSshSession != null) {
+      adminSshSession.close();
+      adminSshSession = null;
+    }
+    if (userSshSession != null) {
+      userSshSession.close();
+      userSshSession = null;
+    }
+  }
+
+  protected TestRepository<?>.CommitBuilder commitBuilder() throws Exception {
+    return testRepo.branch("HEAD").commit().insertChangeId();
+  }
+
+  protected TestRepository<?>.CommitBuilder amendBuilder() throws Exception {
+    ObjectId head = repo().exactRef("HEAD").getObjectId();
+    TestRepository<?>.CommitBuilder b = testRepo.amendRef("HEAD");
+    Optional<String> id = GitUtil.getChangeId(testRepo, head);
+    // TestRepository behaves like "git commit --amend -m foo", which does not
+    // preserve an existing Change-Id. Tests probably want this.
+    if (id.isPresent()) {
+      b.insertChangeId(id.get().substring(1));
+    } else {
+      b.insertChangeId();
+    }
+    return b;
+  }
+
+  protected PushOneCommit.Result createChange() throws Exception {
+    return createChange("refs/for/master");
+  }
+
+  protected PushOneCommit.Result createChange(String ref) throws Exception {
+    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
+    PushOneCommit.Result result = push.to(ref);
+    result.assertOkStatus();
+    return result;
+  }
+
+  protected PushOneCommit.Result createMergeCommitChange(String ref) throws Exception {
+    return createMergeCommitChange(ref, "foo");
+  }
+
+  protected PushOneCommit.Result createMergeCommitChange(String ref, String file) throws Exception {
+    ObjectId initial = repo().exactRef(HEAD).getLeaf().getObjectId();
+
+    PushOneCommit.Result p1 =
+        pushFactory
+            .create(
+                db,
+                admin.getIdent(),
+                testRepo,
+                "parent 1",
+                ImmutableMap.of(file, "foo-1", "bar", "bar-1"))
+            .to(ref);
+
+    // reset HEAD in order to create a sibling of the first change
+    testRepo.reset(initial);
+
+    PushOneCommit.Result p2 =
+        pushFactory
+            .create(
+                db,
+                admin.getIdent(),
+                testRepo,
+                "parent 2",
+                ImmutableMap.of(file, "foo-2", "bar", "bar-2"))
+            .to(ref);
+
+    PushOneCommit m =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            testRepo,
+            "merge",
+            ImmutableMap.of(file, "foo-1", "bar", "bar-2"));
+    m.setParents(ImmutableList.of(p1.getCommit(), p2.getCommit()));
+    PushOneCommit.Result result = m.to(ref);
+    result.assertOkStatus();
+    return result;
+  }
+
+  protected PushOneCommit.Result createCommitAndPush(
+      TestRepository<InMemoryRepository> repo,
+      String ref,
+      String commitMsg,
+      String fileName,
+      String content)
+      throws Exception {
+    PushOneCommit.Result result =
+        pushFactory.create(db, admin.getIdent(), repo, commitMsg, fileName, content).to(ref);
+    result.assertOkStatus();
+    return result;
+  }
+
+  protected PushOneCommit.Result createChangeWithTopic(
+      TestRepository<InMemoryRepository> repo,
+      String topic,
+      String commitMsg,
+      String fileName,
+      String content)
+      throws Exception {
+    assertThat(topic).isNotEmpty();
+    return createCommitAndPush(
+        repo, "refs/for/master%topic=" + name(topic), commitMsg, fileName, content);
+  }
+
+  protected PushOneCommit.Result createChange(String subject, String fileName, String content)
+      throws Exception {
+    PushOneCommit push =
+        pushFactory.create(db, admin.getIdent(), testRepo, subject, fileName, content);
+    return push.to("refs/for/master");
+  }
+
+  protected PushOneCommit.Result createChange(
+      TestRepository<?> repo,
+      String branch,
+      String subject,
+      String fileName,
+      String content,
+      String topic)
+      throws Exception {
+    PushOneCommit push = pushFactory.create(db, admin.getIdent(), repo, subject, fileName, content);
+    return push.to("refs/for/" + branch + "%topic=" + name(topic));
+  }
+
+  protected BranchApi createBranch(Branch.NameKey branch) throws Exception {
+    return gApi.projects()
+        .name(branch.getParentKey().get())
+        .branch(branch.get())
+        .create(new BranchInput());
+  }
+
+  protected BranchApi createBranchWithRevision(Branch.NameKey branch, String revision)
+      throws Exception {
+    BranchInput in = new BranchInput();
+    in.revision = revision;
+    return gApi.projects().name(branch.getParentKey().get()).branch(branch.get()).create(in);
+  }
+
+  private static final List<Character> RANDOM =
+      Chars.asList(new char[] {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'});
+
+  protected PushOneCommit.Result amendChange(String changeId) throws Exception {
+    return amendChange(changeId, "refs/for/master", admin, testRepo);
+  }
+
+  protected PushOneCommit.Result amendChange(
+      String changeId, String ref, TestAccount testAccount, TestRepository<?> repo)
+      throws Exception {
+    Collections.shuffle(RANDOM);
+    return amendChange(
+        changeId,
+        ref,
+        testAccount,
+        repo,
+        PushOneCommit.SUBJECT,
+        PushOneCommit.FILE_NAME,
+        new String(Chars.toArray(RANDOM)));
+  }
+
+  protected PushOneCommit.Result amendChange(
+      String changeId, String subject, String fileName, String content) throws Exception {
+    return amendChange(changeId, "refs/for/master", admin, testRepo, subject, fileName, content);
+  }
+
+  protected PushOneCommit.Result amendChange(
+      String changeId,
+      String ref,
+      TestAccount testAccount,
+      TestRepository<?> repo,
+      String subject,
+      String fileName,
+      String content)
+      throws Exception {
+    PushOneCommit push =
+        pushFactory.create(db, testAccount.getIdent(), repo, subject, fileName, content, changeId);
+    return push.to(ref);
+  }
+
+  protected void merge(PushOneCommit.Result r) throws Exception {
+    revision(r).review(ReviewInput.approve());
+    revision(r).submit();
+  }
+
+  protected ChangeInfo info(String id) throws RestApiException {
+    return gApi.changes().id(id).info();
+  }
+
+  protected Optional<EditInfo> getEdit(String id) throws RestApiException {
+    return gApi.changes().id(id).edit().get();
+  }
+
+  protected ChangeInfo get(String id, ListChangesOption... options) throws RestApiException {
+    return gApi.changes().id(id).get(options);
+  }
+
+  protected List<ChangeInfo> query(String q) throws RestApiException {
+    return gApi.changes().query(q).get();
+  }
+
+  private Context newRequestContext(TestAccount account) {
+    return atrScope.newContext(
+        reviewDbProvider,
+        new SshSession(sshKeys, server, account),
+        identifiedUserFactory.create(account.getId()));
+  }
+
+  /**
+   * Enforce a new request context for the current API user.
+   *
+   * <p>This recreates the IdentifiedUser, hence everything which is cached in the IdentifiedUser is
+   * reloaded (e.g. the email addresses of the user).
+   */
+  protected Context resetCurrentApiUser() {
+    return atrScope.set(newRequestContext(atrScope.get().getSession().getAccount()));
+  }
+
+  protected Context setApiUser(TestAccount account) {
+    return atrScope.set(newRequestContext(account));
+  }
+
+  protected Context setApiUserAnonymous() {
+    return atrScope.set(atrScope.newContext(reviewDbProvider, null, anonymousUser.get()));
+  }
+
+  protected Account getAccount(Account.Id accountId) {
+    return getAccountState(accountId).getAccount();
+  }
+
+  protected AccountState getAccountState(Account.Id accountId) {
+    Optional<AccountState> accountState = accountCache.get(accountId);
+    assertThat(accountState).named("account %s", accountId.get()).isPresent();
+    return accountState.get();
+  }
+
+  protected Context disableDb() {
+    notesMigration.setFailOnLoadForTest(true);
+    return atrScope.disableDb();
+  }
+
+  protected void enableDb(Context preDisableContext) {
+    notesMigration.setFailOnLoadForTest(false);
+    atrScope.set(preDisableContext);
+  }
+
+  protected void disableChangeIndexWrites() {
+    for (ChangeIndex i : changeIndexes.getWriteIndexes()) {
+      if (!(i instanceof ReadOnlyChangeIndex)) {
+        changeIndexes.addWriteIndex(new ReadOnlyChangeIndex(i));
+      }
+    }
+  }
+
+  protected void enableChangeIndexWrites() {
+    for (ChangeIndex i : changeIndexes.getWriteIndexes()) {
+      if (i instanceof ReadOnlyChangeIndex) {
+        changeIndexes.addWriteIndex(((ReadOnlyChangeIndex) i).unwrap());
+      }
+    }
+  }
+
+  protected AutoCloseable disableChangeIndex() {
+    disableChangeIndexWrites();
+    ChangeIndex searchIndex = changeIndexes.getSearchIndex();
+    if (!(searchIndex instanceof DisabledChangeIndex)) {
+      changeIndexes.setSearchIndex(new DisabledChangeIndex(searchIndex), false);
+    }
+
+    return new AutoCloseable() {
+      @Override
+      public void close() throws Exception {
+        enableChangeIndexWrites();
+        ChangeIndex searchIndex = changeIndexes.getSearchIndex();
+        if (searchIndex instanceof DisabledChangeIndex) {
+          changeIndexes.setSearchIndex(((DisabledChangeIndex) searchIndex).unwrap(), false);
+        }
+      }
+    };
+  }
+
+  protected AutoCloseable disableAccountIndex() {
+    AccountIndex searchIndex = accountIndexes.getSearchIndex();
+    if (!(searchIndex instanceof DisabledAccountIndex)) {
+      accountIndexes.setSearchIndex(new DisabledAccountIndex(searchIndex), false);
+    }
+
+    return new AutoCloseable() {
+      @Override
+      public void close() {
+        AccountIndex searchIndex = accountIndexes.getSearchIndex();
+        if (searchIndex instanceof DisabledAccountIndex) {
+          accountIndexes.setSearchIndex(((DisabledAccountIndex) searchIndex).unwrap(), false);
+        }
+      }
+    };
+  }
+
+  protected AutoCloseable disableProjectIndex() {
+    disableProjectIndexWrites();
+    ProjectIndex searchIndex = projectIndexes.getSearchIndex();
+    if (!(searchIndex instanceof DisabledProjectIndex)) {
+      projectIndexes.setSearchIndex(new DisabledProjectIndex(searchIndex), false);
+    }
+
+    return new AutoCloseable() {
+      @Override
+      public void close() {
+        enableProjectIndexWrites();
+        ProjectIndex searchIndex = projectIndexes.getSearchIndex();
+        if (searchIndex instanceof DisabledProjectIndex) {
+          projectIndexes.setSearchIndex(((DisabledProjectIndex) searchIndex).unwrap(), false);
+        }
+      }
+    };
+  }
+
+  protected void disableProjectIndexWrites() {
+    for (ProjectIndex i : projectIndexes.getWriteIndexes()) {
+      if (!(i instanceof DisabledProjectIndex)) {
+        projectIndexes.addWriteIndex(new DisabledProjectIndex(i));
+      }
+    }
+  }
+
+  protected void enableProjectIndexWrites() {
+    for (ProjectIndex i : projectIndexes.getWriteIndexes()) {
+      if (i instanceof DisabledProjectIndex) {
+        projectIndexes.addWriteIndex(((DisabledProjectIndex) i).unwrap());
+      }
+    }
+  }
+
+  protected static Gson newGson() {
+    return OutputFormat.JSON_COMPACT.newGson();
+  }
+
+  protected RevisionApi revision(PushOneCommit.Result r) throws Exception {
+    return gApi.changes().id(r.getChangeId()).current();
+  }
+
+  protected void allow(String ref, String permission, AccountGroup.UUID id) throws Exception {
+    allow(project, ref, permission, id);
+  }
+
+  protected void allow(Project.NameKey p, String ref, String permission, AccountGroup.UUID id)
+      throws Exception {
+    try (ProjectConfigUpdate u = updateProject(p)) {
+      Util.allow(u.getConfig(), permission, id, ref);
+      u.save();
+    }
+  }
+
+  protected void allowGlobalCapabilities(AccountGroup.UUID id, String... capabilityNames)
+      throws Exception {
+    allowGlobalCapabilities(id, Arrays.asList(capabilityNames));
+  }
+
+  protected void allowGlobalCapabilities(AccountGroup.UUID id, Iterable<String> capabilityNames)
+      throws Exception {
+    try (ProjectConfigUpdate u = updateProject(allProjects)) {
+      for (String capabilityName : capabilityNames) {
+        Util.allow(u.getConfig(), capabilityName, id);
+      }
+      u.save();
+    }
+  }
+
+  protected void removeGlobalCapabilities(AccountGroup.UUID id, String... capabilityNames)
+      throws Exception {
+    removeGlobalCapabilities(id, Arrays.asList(capabilityNames));
+  }
+
+  protected void removeGlobalCapabilities(AccountGroup.UUID id, Iterable<String> capabilityNames)
+      throws Exception {
+    try (ProjectConfigUpdate u = updateProject(allProjects)) {
+      for (String capabilityName : capabilityNames) {
+        Util.remove(u.getConfig(), capabilityName, id);
+      }
+      u.save();
+    }
+  }
+
+  protected void setUseContributorAgreements(InheritableBoolean value) throws Exception {
+    try (MetaDataUpdate md = metaDataUpdateFactory.create(project)) {
+      ProjectConfig config = ProjectConfig.read(md);
+      config.getProject().setBooleanConfig(BooleanProjectConfig.USE_CONTRIBUTOR_AGREEMENTS, value);
+      config.commit(md);
+      projectCache.evict(config.getProject());
+    }
+  }
+
+  protected void setUseSignedOffBy(InheritableBoolean value) throws Exception {
+    try (MetaDataUpdate md = metaDataUpdateFactory.create(project)) {
+      ProjectConfig config = ProjectConfig.read(md);
+      config.getProject().setBooleanConfig(BooleanProjectConfig.USE_SIGNED_OFF_BY, value);
+      config.commit(md);
+      projectCache.evict(config.getProject());
+    }
+  }
+
+  protected void setRequireChangeId(InheritableBoolean value) throws Exception {
+    try (MetaDataUpdate md = metaDataUpdateFactory.create(project)) {
+      ProjectConfig config = ProjectConfig.read(md);
+      config.getProject().setBooleanConfig(BooleanProjectConfig.REQUIRE_CHANGE_ID, value);
+      config.commit(md);
+      projectCache.evict(config.getProject());
+    }
+  }
+
+  protected void deny(String ref, String permission, AccountGroup.UUID id) throws Exception {
+    deny(project, ref, permission, id);
+  }
+
+  protected void deny(Project.NameKey p, String ref, String permission, AccountGroup.UUID id)
+      throws Exception {
+    try (ProjectConfigUpdate u = updateProject(p)) {
+      Util.deny(u.getConfig(), permission, id, ref);
+      u.save();
+    }
+  }
+
+  protected PermissionRule block(String ref, String permission, AccountGroup.UUID id)
+      throws Exception {
+    return block(project, ref, permission, id);
+  }
+
+  protected PermissionRule block(
+      Project.NameKey project, String ref, String permission, AccountGroup.UUID id)
+      throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      PermissionRule rule = Util.block(u.getConfig(), permission, id, ref);
+      u.save();
+      return rule;
+    }
+  }
+
+  protected void blockLabel(
+      String label, int min, int max, AccountGroup.UUID id, String ref, Project.NameKey project)
+      throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      Util.block(u.getConfig(), Permission.LABEL + label, min, max, id, ref);
+      u.save();
+    }
+  }
+
+  protected void grant(Project.NameKey project, String ref, String permission)
+      throws RepositoryNotFoundException, IOException, ConfigInvalidException {
+    grant(project, ref, permission, false);
+  }
+
+  protected void grant(Project.NameKey project, String ref, String permission, boolean force)
+      throws RepositoryNotFoundException, IOException, ConfigInvalidException {
+    grant(project, ref, permission, force, adminGroupUuid());
+  }
+
+  protected void grant(
+      Project.NameKey project,
+      String ref,
+      String permission,
+      boolean force,
+      AccountGroup.UUID groupUUID)
+      throws RepositoryNotFoundException, IOException, ConfigInvalidException {
+    try (MetaDataUpdate md = metaDataUpdateFactory.create(project)) {
+      md.setMessage(String.format("Grant %s on %s", permission, ref));
+      ProjectConfig config = ProjectConfig.read(md);
+      AccessSection s = config.getAccessSection(ref, true);
+      Permission p = s.getPermission(permission, true);
+      PermissionRule rule = Util.newRule(config, groupUUID);
+      rule.setForce(force);
+      p.add(rule);
+      config.commit(md);
+      projectCache.evict(config.getProject());
+    }
+  }
+
+  protected void grantLabel(
+      String label,
+      int min,
+      int max,
+      Project.NameKey project,
+      String ref,
+      boolean force,
+      AccountGroup.UUID groupUUID,
+      boolean exclusive)
+      throws RepositoryNotFoundException, IOException, ConfigInvalidException {
+    String permission = Permission.LABEL + label;
+    try (MetaDataUpdate md = metaDataUpdateFactory.create(project)) {
+      md.setMessage(String.format("Grant %s on %s", permission, ref));
+      ProjectConfig config = ProjectConfig.read(md);
+      AccessSection s = config.getAccessSection(ref, true);
+      Permission p = s.getPermission(permission, true);
+      p.setExclusiveGroup(exclusive);
+      PermissionRule rule = Util.newRule(config, groupUUID);
+      rule.setForce(force);
+      rule.setMin(min);
+      rule.setMax(max);
+      p.add(rule);
+      config.commit(md);
+      projectCache.evict(config.getProject());
+    }
+  }
+
+  protected void removePermission(Project.NameKey project, String ref, String permission)
+      throws IOException, ConfigInvalidException {
+    try (MetaDataUpdate md = metaDataUpdateFactory.create(project)) {
+      md.setMessage(String.format("Remove %s on %s", permission, ref));
+      ProjectConfig config = ProjectConfig.read(md);
+      AccessSection s = config.getAccessSection(ref, true);
+      Permission p = s.getPermission(permission, true);
+      p.clearRules();
+      config.commit(md);
+      projectCache.evict(config.getProject());
+    }
+  }
+
+  protected void blockRead(String ref) throws Exception {
+    block(ref, Permission.READ, REGISTERED_USERS);
+  }
+
+  protected PushOneCommit.Result pushTo(String ref) throws Exception {
+    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
+    return push.to(ref);
+  }
+
+  protected void approve(String id) throws Exception {
+    gApi.changes().id(id).revision("current").review(ReviewInput.approve());
+  }
+
+  protected void recommend(String id) throws Exception {
+    gApi.changes().id(id).revision("current").review(ReviewInput.recommend());
+  }
+
+  protected void assertSubmittedTogether(String chId, String... expected) throws Exception {
+    List<ChangeInfo> actual = gApi.changes().id(chId).submittedTogether();
+    SubmittedTogetherInfo info =
+        gApi.changes().id(chId).submittedTogether(EnumSet.of(NON_VISIBLE_CHANGES));
+
+    assertThat(info.nonVisibleChanges).isEqualTo(0);
+    assertThat(Iterables.transform(actual, i1 -> i1.changeId))
+        .containsExactly((Object[]) expected)
+        .inOrder();
+    assertThat(Iterables.transform(info.changes, i -> i.changeId))
+        .containsExactly((Object[]) expected)
+        .inOrder();
+  }
+
+  protected PatchSet getPatchSet(PatchSet.Id psId) throws OrmException {
+    return changeDataFactory.create(db, project, psId.getParentKey()).patchSet(psId);
+  }
+
+  protected IdentifiedUser user(TestAccount testAccount) {
+    return identifiedUserFactory.create(testAccount.getId());
+  }
+
+  protected RevisionResource parseCurrentRevisionResource(String changeId) throws Exception {
+    ChangeResource cr = parseChangeResource(changeId);
+    int psId = cr.getChange().currentPatchSetId().get();
+    return revisions.parse(cr, IdString.fromDecoded(Integer.toString(psId)));
+  }
+
+  protected RevisionResource parseRevisionResource(String changeId, int n) throws Exception {
+    return revisions.parse(
+        parseChangeResource(changeId), IdString.fromDecoded(Integer.toString(n)));
+  }
+
+  protected RevisionResource parseRevisionResource(PushOneCommit.Result r) throws Exception {
+    PatchSet.Id psId = r.getPatchSetId();
+    return parseRevisionResource(psId.getParentKey().toString(), psId.get());
+  }
+
+  protected ChangeResource parseChangeResource(String changeId) throws Exception {
+    List<ChangeNotes> notes = changeFinder.find(changeId);
+    assertThat(notes).hasSize(1);
+    return changeResourceFactory.create(notes.get(0), atrScope.get().getUser());
+  }
+
+  protected String createGroup(String name) throws Exception {
+    return createGroup(name, "Administrators");
+  }
+
+  protected String createGroupWithRealName(String name) throws Exception {
+    GroupInput in = new GroupInput();
+    in.name = name;
+    in.ownerId = "Administrators";
+    gApi.groups().create(in);
+    return name;
+  }
+
+  protected String createGroup(String name, String owner) throws Exception {
+    name = name(name);
+    GroupInput in = new GroupInput();
+    in.name = name;
+    in.ownerId = owner;
+    gApi.groups().create(in);
+    return name;
+  }
+
+  protected RevCommit getHead(Repository repo, String name) throws Exception {
+    try (RevWalk rw = new RevWalk(repo)) {
+      Ref r = repo.exactRef(name);
+      return r != null ? rw.parseCommit(r.getObjectId()) : null;
+    }
+  }
+
+  protected RevCommit getHead(Repository repo) throws Exception {
+    return getHead(repo, "HEAD");
+  }
+
+  protected RevCommit getRemoteHead(Project.NameKey project, String branch) throws Exception {
+    try (Repository repo = repoManager.openRepository(project)) {
+      return getHead(repo, branch.startsWith(Constants.R_REFS) ? branch : "refs/heads/" + branch);
+    }
+  }
+
+  protected RevCommit getRemoteHead(String project, String branch) throws Exception {
+    return getRemoteHead(new Project.NameKey(project), branch);
+  }
+
+  protected RevCommit getRemoteHead() throws Exception {
+    return getRemoteHead(project, "master");
+  }
+
+  protected void assertMailReplyTo(Message message, String email) throws Exception {
+    assertThat(message.headers()).containsKey("Reply-To");
+    EmailHeader.String replyTo = (EmailHeader.String) message.headers().get("Reply-To");
+    assertThat(replyTo.getString()).contains(email);
+  }
+
+  protected ContributorAgreement configureContributorAgreement(boolean autoVerify)
+      throws Exception {
+    ContributorAgreement ca;
+    if (autoVerify) {
+      String g = createGroup("cla-test-group");
+      GroupApi groupApi = gApi.groups().id(g);
+      groupApi.description("CLA test group");
+      InternalGroup caGroup = group(new AccountGroup.UUID(groupApi.detail().id));
+      GroupReference groupRef = new GroupReference(caGroup.getGroupUUID(), caGroup.getName());
+      PermissionRule rule = new PermissionRule(groupRef);
+      rule.setAction(PermissionRule.Action.ALLOW);
+      ca = new ContributorAgreement("cla-test");
+      ca.setAutoVerify(groupRef);
+      ca.setAccepted(ImmutableList.of(rule));
+    } else {
+      ca = new ContributorAgreement("cla-test-no-auto-verify");
+    }
+    ca.setDescription("description");
+    ca.setAgreementUrl("agreement-url");
+
+    try (ProjectConfigUpdate u = updateProject(allProjects)) {
+      u.getConfig().replace(ca);
+      u.save();
+      return ca;
+    }
+  }
+
+  protected Map<Branch.NameKey, ObjectId> fetchFromSubmitPreview(String changeId) throws Exception {
+    try (BinaryResult result = gApi.changes().id(changeId).current().submitPreview()) {
+      return fetchFromBundles(result);
+    }
+  }
+
+  /**
+   * Fetches each bundle into a newly cloned repository, then it applies the bundle, and returns the
+   * resulting tree id.
+   *
+   * <p>Omits NoteDb meta refs.
+   */
+  protected Map<Branch.NameKey, ObjectId> fetchFromBundles(BinaryResult bundles) throws Exception {
+    assertThat(bundles.getContentType()).isEqualTo("application/x-zip");
+
+    FileSystem fs = Jimfs.newFileSystem();
+    Path previewPath = fs.getPath("preview.zip");
+    try (OutputStream out = Files.newOutputStream(previewPath)) {
+      bundles.writeTo(out);
+    }
+    Map<Branch.NameKey, ObjectId> ret = new HashMap<>();
+    try (FileSystem zipFs = FileSystems.newFileSystem(previewPath, null);
+        DirectoryStream<Path> dirStream =
+            Files.newDirectoryStream(Iterables.getOnlyElement(zipFs.getRootDirectories()))) {
+      for (Path p : dirStream) {
+        if (!Files.isRegularFile(p)) {
+          continue;
+        }
+        String bundleName = p.getFileName().toString();
+        int len = bundleName.length();
+        assertThat(bundleName).endsWith(".git");
+        String repoName = bundleName.substring(0, len - 4);
+        Project.NameKey proj = new Project.NameKey(repoName);
+        TestRepository<?> localRepo = cloneProject(proj);
+
+        try (InputStream bundleStream = Files.newInputStream(p);
+            TransportBundleStream tbs =
+                new TransportBundleStream(
+                    localRepo.getRepository(), new URIish(bundleName), bundleStream)) {
+          FetchResult fr =
+              tbs.fetch(
+                  NullProgressMonitor.INSTANCE,
+                  Arrays.asList(new RefSpec("refs/*:refs/preview/*")));
+          for (Ref r : fr.getAdvertisedRefs()) {
+            String refName = r.getName();
+            if (RefNames.isNoteDbMetaRef(refName)) {
+              continue;
+            }
+            RevCommit c = localRepo.getRevWalk().parseCommit(r.getObjectId());
+            ret.put(new Branch.NameKey(proj, refName), c.getTree().copy());
+          }
+        }
+      }
+    }
+    assertThat(ret).isNotEmpty();
+    return ret;
+  }
+
+  /** Assert that the given branches have the given tree ids. */
+  protected void assertTrees(Project.NameKey proj, Map<Branch.NameKey, ObjectId> trees)
+      throws Exception {
+    TestRepository<?> localRepo = cloneProject(proj);
+    GitUtil.fetch(localRepo, "refs/*:refs/*");
+    Map<Branch.NameKey, RevTree> refValues = new HashMap<>();
+
+    for (Branch.NameKey b : trees.keySet()) {
+      if (!b.getParentKey().equals(proj)) {
+        continue;
+      }
+
+      Ref r = localRepo.getRepository().exactRef(b.get());
+      assertThat(r).isNotNull();
+      RevWalk rw = localRepo.getRevWalk();
+      RevCommit c = rw.parseCommit(r.getObjectId());
+      refValues.put(b, c.getTree());
+
+      assertThat(trees.get(b)).isEqualTo(refValues.get(b));
+    }
+    assertThat(refValues.keySet()).containsAnyIn(trees.keySet());
+  }
+
+  protected void assertDiffForNewFile(
+      DiffInfo diff, RevCommit commit, String path, String expectedContentSideB) throws Exception {
+    List<String> expectedLines = ImmutableList.copyOf(expectedContentSideB.split("\n", -1));
+
+    assertThat(diff.binary).isNull();
+    assertThat(diff.changeType).isEqualTo(ChangeType.ADDED);
+    assertThat(diff.diffHeader).isNotNull();
+    assertThat(diff.intralineStatus).isNull();
+    assertThat(diff.webLinks).isNull();
+
+    assertThat(diff.metaA).isNull();
+    assertThat(diff.metaB).isNotNull();
+    assertThat(diff.metaB.commitId).isEqualTo(commit.name());
+
+    String expectedContentType = "text/plain";
+    if (COMMIT_MSG.equals(path)) {
+      expectedContentType = FileContentUtil.TEXT_X_GERRIT_COMMIT_MESSAGE;
+    } else if (MERGE_LIST.equals(path)) {
+      expectedContentType = FileContentUtil.TEXT_X_GERRIT_MERGE_LIST;
+    }
+    assertThat(diff.metaB.contentType).isEqualTo(expectedContentType);
+
+    assertThat(diff.metaB.lines).isEqualTo(expectedLines.size());
+    assertThat(diff.metaB.name).isEqualTo(path);
+    assertThat(diff.metaB.webLinks).isNull();
+
+    assertThat(diff.content).hasSize(1);
+    DiffInfo.ContentEntry contentEntry = diff.content.get(0);
+    assertThat(contentEntry.b).containsExactlyElementsIn(expectedLines).inOrder();
+    assertThat(contentEntry.a).isNull();
+    assertThat(contentEntry.ab).isNull();
+    assertThat(contentEntry.common).isNull();
+    assertThat(contentEntry.editA).isNull();
+    assertThat(contentEntry.editB).isNull();
+    assertThat(contentEntry.skip).isNull();
+  }
+
+  protected void assertPermitted(ChangeInfo info, String label, Integer... expected) {
+    assertThat(info.permittedLabels).isNotNull();
+    Collection<String> strs = info.permittedLabels.get(label);
+    if (expected.length == 0) {
+      assertThat(strs).isNull();
+    } else {
+      assertThat(strs.stream().map(s -> Integer.valueOf(s.trim())).collect(toList()))
+          .containsExactlyElementsIn(Arrays.asList(expected));
+    }
+  }
+
+  protected void assertPermissions(
+      Project.NameKey project,
+      GroupReference groupReference,
+      String ref,
+      boolean exclusive,
+      String... permissionNames)
+      throws IOException {
+    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
+    AccessSection accessSection = cfg.getAccessSection(ref);
+    assertThat(accessSection).isNotNull();
+    for (String permissionName : permissionNames) {
+      Permission permission = accessSection.getPermission(permissionName);
+      assertPermission(permission, permissionName, exclusive, null);
+      assertPermissionRule(
+          permission.getRule(groupReference), groupReference, Action.ALLOW, false, 0, 0);
+    }
+  }
+
+  protected void assertPermission(
+      Permission permission,
+      String expectedName,
+      boolean expectedExclusive,
+      @Nullable String expectedLabelName) {
+    assertThat(permission).isNotNull();
+    assertThat(permission.getName()).isEqualTo(expectedName);
+    assertThat(permission.getExclusiveGroup()).isEqualTo(expectedExclusive);
+    assertThat(permission.getLabel()).isEqualTo(expectedLabelName);
+  }
+
+  protected void assertPermissionRule(
+      PermissionRule rule,
+      GroupReference expectedGroupReference,
+      Action expectedAction,
+      boolean expectedForce,
+      int expectedMin,
+      int expectedMax) {
+    assertThat(rule.getGroup()).isEqualTo(expectedGroupReference);
+    assertThat(rule.getAction()).isEqualTo(expectedAction);
+    assertThat(rule.getForce()).isEqualTo(expectedForce);
+    assertThat(rule.getMin()).isEqualTo(expectedMin);
+    assertThat(rule.getMax()).isEqualTo(expectedMax);
+  }
+
+  protected InternalGroup group(AccountGroup.UUID groupUuid) {
+    InternalGroup group = groupCache.get(groupUuid).orElse(null);
+    assertThat(group).named(groupUuid.get()).isNotNull();
+    return group;
+  }
+
+  protected GroupReference groupRef(AccountGroup.UUID groupUuid) {
+    GroupDescription.Basic groupDescription = groupBackend.get(groupUuid);
+    return new GroupReference(groupDescription.getGroupUUID(), groupDescription.getName());
+  }
+
+  protected InternalGroup group(String groupName) {
+    InternalGroup group = groupCache.get(new AccountGroup.NameKey(groupName)).orElse(null);
+    assertThat(group).named(groupName).isNotNull();
+    return group;
+  }
+
+  protected GroupReference groupRef(String groupName) {
+    InternalGroup group = groupCache.get(new AccountGroup.NameKey(groupName)).orElse(null);
+    assertThat(group).isNotNull();
+    return new GroupReference(group.getGroupUUID(), group.getName());
+  }
+
+  protected AccountGroup.UUID groupUuid(String groupName) {
+    return group(groupName).getGroupUUID();
+  }
+
+  protected InternalGroup adminGroup() {
+    return group("Administrators");
+  }
+
+  protected GroupReference adminGroupRef() {
+    return groupRef("Administrators");
+  }
+
+  protected AccountGroup.UUID adminGroupUuid() {
+    return groupUuid("Administrators");
+  }
+
+  protected void assertGroupDoesNotExist(String groupName) {
+    InternalGroup group = groupCache.get(new AccountGroup.NameKey(groupName)).orElse(null);
+    assertThat(group).named(groupName).isNull();
+  }
+
+  protected void assertNotifyTo(TestAccount expected) {
+    assertNotifyTo(expected.email, expected.fullName);
+  }
+
+  protected void assertNotifyTo(String expectedEmail, String expectedFullname) {
+    Address expectedAddress = new Address(expectedFullname, expectedEmail);
+    assertThat(sender.getMessages()).hasSize(1);
+    Message m = sender.getMessages().get(0);
+    assertThat(m.rcpt()).containsExactly(expectedAddress);
+    assertThat(((EmailHeader.AddressList) m.headers().get("To")).getAddressList())
+        .containsExactly(expectedAddress);
+    assertThat(m.headers().get("Cc").isEmpty()).isTrue();
+  }
+
+  protected void assertNotifyCc(TestAccount expected) {
+    assertNotifyCc(expected.emailAddress);
+  }
+
+  protected void assertNotifyCc(String expectedEmail, String expectedFullname) {
+    Address expectedAddress = new Address(expectedFullname, expectedEmail);
+    assertNotifyCc(expectedAddress);
+  }
+
+  protected void assertNotifyCc(Address expectedAddress) {
+    assertThat(sender.getMessages()).hasSize(1);
+    Message m = sender.getMessages().get(0);
+    assertThat(m.rcpt()).containsExactly(expectedAddress);
+    assertThat(m.headers().get("To").isEmpty()).isTrue();
+    assertThat(((EmailHeader.AddressList) m.headers().get("Cc")).getAddressList())
+        .containsExactly(expectedAddress);
+  }
+
+  protected void assertNotifyBcc(TestAccount expected) {
+    assertThat(sender.getMessages()).hasSize(1);
+    Message m = sender.getMessages().get(0);
+    assertThat(m.rcpt()).containsExactly(expected.emailAddress);
+    assertThat(m.headers().get("To").isEmpty()).isTrue();
+    assertThat(m.headers().get("Cc").isEmpty()).isTrue();
+  }
+
+  protected void assertNotifyBcc(String expectedEmail, String expectedFullName) {
+    assertThat(sender.getMessages()).hasSize(1);
+    Message m = sender.getMessages().get(0);
+    assertThat(m.rcpt()).containsExactly(new Address(expectedFullName, expectedEmail));
+    assertThat(m.headers().get("To").isEmpty()).isTrue();
+    assertThat(m.headers().get("Cc").isEmpty()).isTrue();
+  }
+
+  protected interface ProjectWatchInfoConfiguration {
+    void configure(ProjectWatchInfo pwi);
+  }
+
+  protected void watch(String project, ProjectWatchInfoConfiguration config)
+      throws RestApiException {
+    ProjectWatchInfo pwi = new ProjectWatchInfo();
+    pwi.project = project;
+    config.configure(pwi);
+    gApi.accounts().self().setWatchedProjects(ImmutableList.of(pwi));
+  }
+
+  protected void watch(PushOneCommit.Result r, ProjectWatchInfoConfiguration config)
+      throws OrmException, RestApiException {
+    watch(r.getChange().project().get(), config);
+  }
+
+  protected void watch(String project, String filter) throws RestApiException {
+    watch(
+        project,
+        pwi -> {
+          pwi.filter = filter;
+          pwi.notifyAbandonedChanges = true;
+          pwi.notifyNewChanges = true;
+          pwi.notifyAllComments = true;
+        });
+  }
+
+  protected void watch(String project) throws RestApiException {
+    watch(project, (String) null);
+  }
+
+  protected void assertContent(PushOneCommit.Result pushResult, String path, String expectedContent)
+      throws Exception {
+    BinaryResult bin =
+        gApi.changes()
+            .id(pushResult.getChangeId())
+            .revision(pushResult.getCommit().name())
+            .file(path)
+            .content();
+    ByteArrayOutputStream os = new ByteArrayOutputStream();
+    bin.writeTo(os);
+    String res = new String(os.toByteArray(), UTF_8);
+    assertThat(res).isEqualTo(expectedContent);
+  }
+
+  protected RevCommit createNewCommitWithoutChangeId(String branch, String file, String content)
+      throws Exception {
+    try (Repository repo = repoManager.openRepository(project);
+        RevWalk walk = new RevWalk(repo)) {
+      Ref ref = repo.exactRef(branch);
+      RevCommit tip = null;
+      if (ref != null) {
+        tip = walk.parseCommit(ref.getObjectId());
+      }
+      TestRepository<?> testSrcRepo = new TestRepository<>(repo);
+      TestRepository<?>.BranchBuilder builder = testSrcRepo.branch(branch);
+      RevCommit revCommit =
+          tip == null
+              ? builder.commit().message("commit 1").add(file, content).create()
+              : builder.commit().parent(tip).message("commit 1").add(file, content).create();
+      assertThat(GitUtil.getChangeId(testSrcRepo, revCommit)).isEmpty();
+      return revCommit;
+    }
+  }
+
+  protected RevCommit parseCurrentRevision(RevWalk rw, String changeId) throws Exception {
+    return rw.parseCommit(
+        ObjectId.fromString(get(changeId, ListChangesOption.CURRENT_REVISION).currentRevision));
+  }
+
+  protected void configLabel(String label, LabelFunction func) throws Exception {
+    configLabel(label, func, ImmutableList.of());
+  }
+
+  protected void configLabel(String label, LabelFunction func, List<String> refPatterns)
+      throws Exception {
+    configLabel(
+        project,
+        label,
+        func,
+        refPatterns,
+        value(1, "Passes"),
+        value(0, "No score"),
+        value(-1, "Failed"));
+  }
+
+  protected void configLabel(
+      Project.NameKey project, String label, LabelFunction func, LabelValue... value)
+      throws Exception {
+    configLabel(project, label, func, ImmutableList.of(), value);
+  }
+
+  private void configLabel(
+      Project.NameKey project,
+      String label,
+      LabelFunction func,
+      List<String> refPatterns,
+      LabelValue... value)
+      throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      LabelType labelType = category(label, value);
+      labelType.setFunction(func);
+      labelType.setRefPatterns(refPatterns);
+      u.getConfig().getLabelSections().put(labelType.getName(), labelType);
+      u.save();
+    }
+  }
+
+  protected void fail(@Nullable String format, Object... args) {
+    assert_().fail(format, args);
+  }
+
+  protected void enableCreateNewChangeForAllNotInTarget() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      u.getConfig()
+          .getProject()
+          .setBooleanConfig(
+              BooleanProjectConfig.CREATE_NEW_CHANGE_FOR_ALL_NOT_IN_TARGET,
+              InheritableBoolean.TRUE);
+      u.save();
+    }
+  }
+
+  protected ProjectConfigUpdate updateProject(Project.NameKey projectName) throws Exception {
+    return new ProjectConfigUpdate(projectName);
+  }
+
+  protected class ProjectConfigUpdate implements AutoCloseable {
+    private final ProjectConfig projectConfig;
+    private MetaDataUpdate metaDataUpdate;
+
+    private ProjectConfigUpdate(Project.NameKey projectName) throws Exception {
+      metaDataUpdate = metaDataUpdateFactory.create(projectName);
+      projectConfig = ProjectConfig.read(metaDataUpdate);
+    }
+
+    public ProjectConfig getConfig() {
+      return projectConfig;
+    }
+
+    public void save() throws Exception {
+      metaDataUpdate.setAuthor(identifiedUserFactory.create(admin.getId()));
+      projectConfig.commit(metaDataUpdate);
+      metaDataUpdate.close();
+      metaDataUpdate = null;
+      projectCache.evict(projectConfig.getProject());
+    }
+
+    @Override
+    public void close() {
+      if (metaDataUpdate != null) {
+        metaDataUpdate.close();
+      }
+    }
+  }
+
+  protected List<RevCommit> getChangeMetaCommitsInReverseOrder(Change.Id changeId)
+      throws IOException {
+    try (Repository repo = repoManager.openRepository(project);
+        RevWalk revWalk = new RevWalk(repo)) {
+      revWalk.sort(RevSort.TOPO);
+      revWalk.sort(RevSort.REVERSE);
+      Ref metaRef = repo.exactRef(RefNames.changeMetaRef(changeId));
+      revWalk.markStart(revWalk.parseCommit(metaRef.getObjectId()));
+      return Lists.newArrayList(revWalk);
+    }
+  }
+
+  protected List<CommentInfo> getChangeSortedComments(int changeNum) throws Exception {
+    List<CommentInfo> comments = new ArrayList<>();
+    Map<String, List<CommentInfo>> commentsMap = gApi.changes().id(changeNum).comments();
+    for (Map.Entry<String, List<CommentInfo>> e : commentsMap.entrySet()) {
+      for (CommentInfo c : e.getValue()) {
+        c.path = e.getKey(); // Set the comment's path field.
+        comments.add(c);
+      }
+    }
+    comments.sort(Comparator.comparing(c -> c.id));
+    return comments;
+  }
+}
diff --git a/java/com/google/gerrit/acceptance/AbstractNotificationTest.java b/java/com/google/gerrit/acceptance/AbstractNotificationTest.java
new file mode 100644
index 0000000..c33bb7a
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/AbstractNotificationTest.java
@@ -0,0 +1,527 @@
+// Copyright (C) 2017 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.google.gerrit.acceptance;
+
+import static com.google.common.truth.Fact.fact;
+import static com.google.common.truth.Truth.assertAbout;
+import static com.google.gerrit.extensions.api.changes.RecipientType.BCC;
+import static com.google.gerrit.extensions.api.changes.RecipientType.CC;
+import static com.google.gerrit.extensions.api.changes.RecipientType.TO;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.base.Joiner;
+import com.google.common.collect.ImmutableList;
+import com.google.common.truth.FailureMetadata;
+import com.google.common.truth.Subject;
+import com.google.common.truth.Truth;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.api.changes.RecipientType;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.changes.ReviewResult;
+import com.google.gerrit.extensions.api.projects.ConfigInput;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo.EmailStrategy;
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.extensions.client.ReviewerState;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.mail.EmailHeader;
+import com.google.gerrit.mail.EmailHeader.AddressList;
+import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gerrit.testing.FakeEmailSender;
+import com.google.gerrit.testing.FakeEmailSender.Message;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Function;
+import org.eclipse.jgit.junit.TestRepository;
+import org.junit.After;
+import org.junit.Before;
+
+public abstract class AbstractNotificationTest extends AbstractDaemonTest {
+  @Before
+  public void enableReviewerByEmail() throws Exception {
+    setApiUser(admin);
+    ConfigInput conf = new ConfigInput();
+    conf.enableReviewerByEmail = InheritableBoolean.TRUE;
+    gApi.projects().name(project.get()).config(conf);
+  }
+
+  @Override
+  protected ProjectResetter.Config resetProjects() {
+    // Don't reset anything so that stagedUsers can be cached across all tests.
+    // Without this caching these tests become much too slow.
+    return new ProjectResetter.Config();
+  }
+
+  protected static FakeEmailSenderSubject assertThat(FakeEmailSender sender) {
+    return assertAbout(FakeEmailSenderSubject::new).that(sender);
+  }
+
+  protected void setEmailStrategy(TestAccount account, EmailStrategy strategy) throws Exception {
+    setEmailStrategy(account, strategy, true);
+  }
+
+  protected void setEmailStrategy(TestAccount account, EmailStrategy strategy, boolean record)
+      throws Exception {
+    if (record) {
+      accountsModifyingEmailStrategy.add(account);
+    }
+    setApiUser(account);
+    GeneralPreferencesInfo prefs = gApi.accounts().self().getPreferences();
+    prefs.emailStrategy = strategy;
+    gApi.accounts().self().setPreferences(prefs);
+  }
+
+  protected static class FakeEmailSenderSubject
+      extends Subject<FakeEmailSenderSubject, FakeEmailSender> {
+    private Message message;
+    private StagedUsers users;
+    private Map<RecipientType, List<String>> recipients = new HashMap<>();
+    private Set<String> accountedFor = new HashSet<>();
+
+    FakeEmailSenderSubject(FailureMetadata failureMetadata, FakeEmailSender target) {
+      super(failureMetadata, target);
+    }
+
+    public FakeEmailSenderSubject notSent() {
+      if (actual().peekMessage() != null) {
+        failWithoutActual(fact("expected message", "sent"));
+      }
+      return this;
+    }
+
+    public FakeEmailSenderSubject sent(String messageType, StagedUsers users) {
+      message = actual().nextMessage();
+      if (message == null) {
+        failWithoutActual(fact("expected message", "not sent"));
+      }
+      recipients = new HashMap<>();
+      recipients.put(TO, parseAddresses(message, "To"));
+      recipients.put(CC, parseAddresses(message, "Cc"));
+      recipients.put(
+          BCC,
+          message.rcpt().stream()
+              .map(Address::getEmail)
+              .filter(e -> !recipients.get(TO).contains(e) && !recipients.get(CC).contains(e))
+              .collect(toList()));
+      this.users = users;
+      if (!message.headers().containsKey("X-Gerrit-MessageType")) {
+        failWithoutActual(
+            fact("expected to have message sent with", "X-Gerrit-MessageType header"));
+      }
+      EmailHeader header = message.headers().get("X-Gerrit-MessageType");
+      if (!header.equals(new EmailHeader.String(messageType))) {
+        failWithoutActual(fact("expected message of type", messageType));
+      }
+
+      // Return a named subject that displays a human-readable table of
+      // recipients.
+      return named(recipientMapToString(recipients, users::emailToName));
+    }
+
+    private static String recipientMapToString(
+        Map<RecipientType, List<String>> recipients, Function<String, String> emailToName) {
+      StringBuilder buf = new StringBuilder();
+      buf.append('[');
+      for (RecipientType type : ImmutableList.of(TO, CC, BCC)) {
+        buf.append('\n');
+        buf.append(type);
+        buf.append(':');
+        String delim = " ";
+        for (String r : recipients.get(type)) {
+          buf.append(delim);
+          buf.append(emailToName.apply(r));
+          delim = ", ";
+        }
+      }
+      buf.append("\n]");
+      return buf.toString();
+    }
+
+    List<String> parseAddresses(Message msg, String headerName) {
+      EmailHeader header = msg.headers().get(headerName);
+      if (header == null) {
+        return ImmutableList.of();
+      }
+      Truth.assertThat(header).isInstanceOf(AddressList.class);
+      AddressList addrList = (AddressList) header;
+      return addrList.getAddressList().stream().map(Address::getEmail).collect(toList());
+    }
+
+    public FakeEmailSenderSubject to(String... emails) {
+      return rcpt(users.supportReviewersByEmail ? TO : null, emails);
+    }
+
+    public FakeEmailSenderSubject cc(String... emails) {
+      return rcpt(users.supportReviewersByEmail ? CC : null, emails);
+    }
+
+    public FakeEmailSenderSubject bcc(String... emails) {
+      return rcpt(users.supportReviewersByEmail ? BCC : null, emails);
+    }
+
+    private FakeEmailSenderSubject rcpt(@Nullable RecipientType type, String[] emails) {
+      for (String email : emails) {
+        rcpt(type, email);
+      }
+      return this;
+    }
+
+    private void rcpt(@Nullable RecipientType type, String email) {
+      rcpt(TO, email, TO.equals(type));
+      rcpt(CC, email, CC.equals(type));
+      rcpt(BCC, email, BCC.equals(type));
+    }
+
+    private void rcpt(@Nullable RecipientType type, String email, boolean expected) {
+      if (recipients.get(type).contains(email) != expected) {
+        failWithoutActual(
+            fact(
+                expected ? "should notify" : "shouldn't notify",
+                type + ": " + users.emailToName(email)));
+      }
+      if (expected) {
+        accountedFor.add(email);
+      }
+    }
+
+    public FakeEmailSenderSubject noOneElse() {
+      for (Map.Entry<NotifyType, TestAccount> watchEntry : users.watchers.entrySet()) {
+        if (!accountedFor.contains(watchEntry.getValue().email)) {
+          notTo(watchEntry.getKey());
+        }
+      }
+
+      Map<RecipientType, List<String>> unaccountedFor = new HashMap<>();
+      boolean ok = true;
+      for (Map.Entry<RecipientType, List<String>> entry : recipients.entrySet()) {
+        unaccountedFor.put(entry.getKey(), new ArrayList<>());
+        for (String address : entry.getValue()) {
+          if (!accountedFor.contains(address)) {
+            unaccountedFor.get(entry.getKey()).add(address);
+            ok = false;
+          }
+        }
+      }
+      if (!ok) {
+        failWithoutActual(
+            fact(
+                "expected assertions for",
+                recipientMapToString(unaccountedFor, e -> users.emailToName(e))));
+      }
+      return this;
+    }
+
+    public FakeEmailSenderSubject notTo(String... emails) {
+      return rcpt(null, emails);
+    }
+
+    public FakeEmailSenderSubject to(TestAccount... accounts) {
+      return rcpt(TO, accounts);
+    }
+
+    public FakeEmailSenderSubject cc(TestAccount... accounts) {
+      return rcpt(CC, accounts);
+    }
+
+    public FakeEmailSenderSubject bcc(TestAccount... accounts) {
+      return rcpt(BCC, accounts);
+    }
+
+    public FakeEmailSenderSubject notTo(TestAccount... accounts) {
+      return rcpt(null, accounts);
+    }
+
+    private FakeEmailSenderSubject rcpt(@Nullable RecipientType type, TestAccount[] accounts) {
+      for (TestAccount account : accounts) {
+        rcpt(type, account);
+      }
+      return this;
+    }
+
+    private void rcpt(@Nullable RecipientType type, TestAccount account) {
+      rcpt(type, account.email);
+    }
+
+    public FakeEmailSenderSubject to(NotifyType... watches) {
+      return rcpt(TO, watches);
+    }
+
+    public FakeEmailSenderSubject cc(NotifyType... watches) {
+      return rcpt(CC, watches);
+    }
+
+    public FakeEmailSenderSubject bcc(NotifyType... watches) {
+      return rcpt(BCC, watches);
+    }
+
+    public FakeEmailSenderSubject notTo(NotifyType... watches) {
+      return rcpt(null, watches);
+    }
+
+    private FakeEmailSenderSubject rcpt(@Nullable RecipientType type, NotifyType[] watches) {
+      for (NotifyType watch : watches) {
+        rcpt(type, watch);
+      }
+      return this;
+    }
+
+    private void rcpt(@Nullable RecipientType type, NotifyType watch) {
+      if (!users.watchers.containsKey(watch)) {
+        failWithoutActual(fact("expected to be configured to watch", watch));
+      }
+      rcpt(type, users.watchers.get(watch));
+    }
+  }
+
+  private static final Map<String, StagedUsers> stagedUsers = new HashMap<>();
+
+  // TestAccount doesn't implement hashCode/equals, so this set is according
+  // to object identity. That's fine for our purposes.
+  private Set<TestAccount> accountsModifyingEmailStrategy = new HashSet<>();
+
+  @After
+  public void resetEmailStrategies() throws Exception {
+    for (TestAccount account : accountsModifyingEmailStrategy) {
+      setEmailStrategy(account, EmailStrategy.ENABLED, false);
+    }
+    accountsModifyingEmailStrategy.clear();
+  }
+
+  protected class StagedUsers {
+    public final TestAccount owner;
+    public final TestAccount author;
+    public final TestAccount uploader;
+    public final TestAccount reviewer;
+    public final TestAccount ccer;
+    public final TestAccount starrer;
+    public final TestAccount assignee;
+    public final TestAccount watchingProjectOwner;
+    public final String reviewerByEmail = "reviewerByEmail@example.com";
+    public final String ccerByEmail = "ccByEmail@example.com";
+    private final Map<NotifyType, TestAccount> watchers = new HashMap<>();
+    private final Map<String, TestAccount> accountsByEmail = new HashMap<>();
+
+    public boolean supportReviewersByEmail;
+
+    private String usersCacheKey() {
+      return description.getClassName();
+    }
+
+    private TestAccount evictAndCopy(TestAccount account) throws IOException {
+      evictAndReindexAccount(account.id);
+      return account;
+    }
+
+    public StagedUsers() throws Exception {
+      synchronized (stagedUsers) {
+        if (stagedUsers.containsKey(usersCacheKey())) {
+          StagedUsers existing = stagedUsers.get(usersCacheKey());
+          owner = evictAndCopy(existing.owner);
+          author = evictAndCopy(existing.author);
+          uploader = evictAndCopy(existing.uploader);
+          reviewer = evictAndCopy(existing.reviewer);
+          ccer = evictAndCopy(existing.ccer);
+          starrer = evictAndCopy(existing.starrer);
+          assignee = evictAndCopy(existing.assignee);
+          watchingProjectOwner = evictAndCopy(existing.watchingProjectOwner);
+          watchers.putAll(existing.watchers);
+          return;
+        }
+
+        owner = testAccount("owner");
+        reviewer = testAccount("reviewer");
+        author = testAccount("author");
+        uploader = testAccount("uploader");
+        ccer = testAccount("ccer");
+        starrer = testAccount("starrer");
+        assignee = testAccount("assignee");
+
+        watchingProjectOwner = testAccount("watchingProjectOwner", "Administrators");
+        setApiUser(watchingProjectOwner);
+        watch(allProjects.get(), pwi -> pwi.notifyNewChanges = true);
+
+        for (NotifyType watch : NotifyType.values()) {
+          if (watch == NotifyType.ALL) {
+            continue;
+          }
+          TestAccount watcher = testAccount(watch.toString());
+          setApiUser(watcher);
+          watch(
+              allProjects.get(),
+              pwi -> {
+                pwi.notifyAllComments = watch.equals(NotifyType.ALL_COMMENTS);
+                pwi.notifyAbandonedChanges = watch.equals(NotifyType.ABANDONED_CHANGES);
+                pwi.notifyNewChanges = watch.equals(NotifyType.NEW_CHANGES);
+                pwi.notifyNewPatchSets = watch.equals(NotifyType.NEW_PATCHSETS);
+                pwi.notifySubmittedChanges = watch.equals(NotifyType.SUBMITTED_CHANGES);
+              });
+          watchers.put(watch, watcher);
+        }
+
+        stagedUsers.put(usersCacheKey(), this);
+      }
+    }
+
+    private String email(String username) {
+      // Email validator rejects usernames longer than 64 bytes.
+      if (username.length() > 64) {
+        username = username.substring(username.length() - 64);
+        if (username.startsWith(".")) {
+          username = username.substring(1);
+        }
+      }
+      return username + "@example.com";
+    }
+
+    public TestAccount testAccount(String name) throws Exception {
+      String username = name(name);
+      TestAccount account = accountCreator.create(username, email(username), name);
+      accountsByEmail.put(account.email, account);
+      return account;
+    }
+
+    public TestAccount testAccount(String name, String groupName) throws Exception {
+      String username = name(name);
+      TestAccount account = accountCreator.create(username, email(username), name, groupName);
+      accountsByEmail.put(account.email, account);
+      return account;
+    }
+
+    String emailToName(String email) {
+      if (accountsByEmail.containsKey(email)) {
+        return accountsByEmail.get(email).fullName;
+      }
+      return email;
+    }
+
+    protected void addReviewers(PushOneCommit.Result r) throws Exception {
+      ReviewInput in =
+          ReviewInput.noScore()
+              .reviewer(reviewer.email)
+              .reviewer(reviewerByEmail)
+              .reviewer(ccer.email, ReviewerState.CC, false)
+              .reviewer(ccerByEmail, ReviewerState.CC, false);
+      ReviewResult result = gApi.changes().id(r.getChangeId()).revision("current").review(in);
+      supportReviewersByEmail = true;
+      if (result.reviewers.values().stream().anyMatch(v -> v.error != null)) {
+        supportReviewersByEmail = false;
+        in =
+            ReviewInput.noScore()
+                .reviewer(reviewer.email)
+                .reviewer(ccer.email, ReviewerState.CC, false);
+        result = gApi.changes().id(r.getChangeId()).revision("current").review(in);
+      }
+      Truth.assertThat(result.reviewers.values().stream().allMatch(v -> v.error == null)).isTrue();
+    }
+  }
+
+  protected interface PushOptionGenerator {
+    List<String> pushOptions(StagedUsers users);
+  }
+
+  protected class StagedPreChange extends StagedUsers {
+    public final TestRepository<?> repo;
+    protected final PushOneCommit.Result result;
+    public final String changeId;
+
+    StagedPreChange(String ref) throws Exception {
+      this(ref, null);
+    }
+
+    StagedPreChange(String ref, @Nullable PushOptionGenerator pushOptionGenerator)
+        throws Exception {
+      super();
+      List<String> pushOptions = null;
+      if (pushOptionGenerator != null) {
+        pushOptions = pushOptionGenerator.pushOptions(this);
+      }
+      if (pushOptions != null) {
+        ref = ref + '%' + Joiner.on(',').join(pushOptions);
+      }
+      setApiUser(owner);
+      repo = cloneProject(project, owner);
+      PushOneCommit push = pushFactory.create(db, owner.getIdent(), repo);
+      result = push.to(ref);
+      result.assertOkStatus();
+      changeId = result.getChangeId();
+    }
+  }
+
+  protected StagedPreChange stagePreChange(String ref) throws Exception {
+    return new StagedPreChange(ref);
+  }
+
+  protected StagedPreChange stagePreChange(
+      String ref, @Nullable PushOptionGenerator pushOptionGenerator) throws Exception {
+    return new StagedPreChange(ref, pushOptionGenerator);
+  }
+
+  protected class StagedChange extends StagedPreChange {
+    StagedChange(String ref) throws Exception {
+      super(ref);
+
+      setApiUser(starrer);
+      gApi.accounts().self().starChange(result.getChangeId());
+
+      setApiUser(owner);
+      addReviewers(result);
+      sender.clear();
+    }
+  }
+
+  protected StagedChange stageReviewableChange() throws Exception {
+    return new StagedChange("refs/for/master");
+  }
+
+  protected StagedChange stageWipChange() throws Exception {
+    return new StagedChange("refs/for/master%wip");
+  }
+
+  protected StagedChange stageReviewableWipChange() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    setApiUser(sc.owner);
+    gApi.changes().id(sc.changeId).setWorkInProgress();
+    return sc;
+  }
+
+  protected StagedChange stageAbandonedReviewableChange() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    setApiUser(sc.owner);
+    gApi.changes().id(sc.changeId).abandon();
+    sender.clear();
+    return sc;
+  }
+
+  protected StagedChange stageAbandonedReviewableWipChange() throws Exception {
+    StagedChange sc = stageReviewableWipChange();
+    setApiUser(sc.owner);
+    gApi.changes().id(sc.changeId).abandon();
+    sender.clear();
+    return sc;
+  }
+
+  protected StagedChange stageAbandonedWipChange() throws Exception {
+    StagedChange sc = stageWipChange();
+    setApiUser(sc.owner);
+    gApi.changes().id(sc.changeId).abandon();
+    sender.clear();
+    return sc;
+  }
+}
diff --git a/java/com/google/gerrit/acceptance/AcceptanceTestRequestScope.java b/java/com/google/gerrit/acceptance/AcceptanceTestRequestScope.java
new file mode 100644
index 0000000..9a3e811
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/AcceptanceTestRequestScope.java
@@ -0,0 +1,207 @@
+// Copyright (C) 2013 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.google.gerrit.acceptance;
+
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.RequestCleanup;
+import com.google.gerrit.server.config.RequestScopedReviewDbProvider;
+import com.google.gerrit.server.util.RequestContext;
+import com.google.gerrit.server.util.ThreadLocalRequestContext;
+import com.google.gerrit.server.util.ThreadLocalRequestScopePropagator;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.testing.DisabledReviewDb;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.Inject;
+import com.google.inject.Key;
+import com.google.inject.OutOfScopeException;
+import com.google.inject.Provider;
+import com.google.inject.Scope;
+import com.google.inject.util.Providers;
+import java.util.HashMap;
+import java.util.Map;
+
+/** Guice scopes for state during an Acceptance Test connection. */
+public class AcceptanceTestRequestScope {
+  private static final Key<RequestCleanup> RC_KEY = Key.get(RequestCleanup.class);
+
+  private static final Key<RequestScopedReviewDbProvider> DB_KEY =
+      Key.get(RequestScopedReviewDbProvider.class);
+
+  public static class Context implements RequestContext {
+    private final RequestCleanup cleanup = new RequestCleanup();
+    private final Map<Key<?>, Object> map = new HashMap<>();
+    private final SchemaFactory<ReviewDb> schemaFactory;
+    private final SshSession session;
+    private final CurrentUser user;
+
+    final long created;
+    volatile long started;
+    volatile long finished;
+
+    private Context(SchemaFactory<ReviewDb> sf, SshSession s, CurrentUser u, long at) {
+      schemaFactory = sf;
+      session = s;
+      user = u;
+      created = started = finished = at;
+      map.put(RC_KEY, cleanup);
+      map.put(DB_KEY, new RequestScopedReviewDbProvider(schemaFactory, Providers.of(cleanup)));
+    }
+
+    private Context(Context p, SshSession s, CurrentUser c) {
+      this(p.schemaFactory, s, c, p.created);
+      started = p.started;
+      finished = p.finished;
+    }
+
+    SshSession getSession() {
+      return session;
+    }
+
+    @Override
+    public CurrentUser getUser() {
+      if (user == null) {
+        throw new IllegalStateException("user == null, forgot to set it?");
+      }
+      return user;
+    }
+
+    @Override
+    public Provider<ReviewDb> getReviewDbProvider() {
+      return (RequestScopedReviewDbProvider) map.get(DB_KEY);
+    }
+
+    synchronized <T> T get(Key<T> key, Provider<T> creator) {
+      @SuppressWarnings("unchecked")
+      T t = (T) map.get(key);
+      if (t == null) {
+        t = creator.get();
+        map.put(key, t);
+      }
+      return t;
+    }
+  }
+
+  static class ContextProvider implements Provider<Context> {
+    @Override
+    public Context get() {
+      return requireContext();
+    }
+  }
+
+  static class SshSessionProvider implements Provider<SshSession> {
+    @Override
+    public SshSession get() {
+      return requireContext().getSession();
+    }
+  }
+
+  static class Propagator extends ThreadLocalRequestScopePropagator<Context> {
+    private final AcceptanceTestRequestScope atrScope;
+
+    @Inject
+    Propagator(
+        AcceptanceTestRequestScope atrScope,
+        ThreadLocalRequestContext local,
+        Provider<RequestScopedReviewDbProvider> dbProviderProvider) {
+      super(REQUEST, current, local, dbProviderProvider);
+      this.atrScope = atrScope;
+    }
+
+    @Override
+    protected Context continuingContext(Context ctx) {
+      // The cleanup is not chained, since the RequestScopePropagator executors
+      // the Context's cleanup when finished executing.
+      return atrScope.newContinuingContext(ctx);
+    }
+  }
+
+  private static final ThreadLocal<Context> current = new ThreadLocal<>();
+
+  private static Context requireContext() {
+    final Context ctx = current.get();
+    if (ctx == null) {
+      throw new OutOfScopeException("Not in command/request");
+    }
+    return ctx;
+  }
+
+  private final ThreadLocalRequestContext local;
+
+  @Inject
+  AcceptanceTestRequestScope(ThreadLocalRequestContext local) {
+    this.local = local;
+  }
+
+  public Context newContext(SchemaFactory<ReviewDb> sf, SshSession s, CurrentUser user) {
+    return new Context(sf, s, user, TimeUtil.nowMs());
+  }
+
+  private Context newContinuingContext(Context ctx) {
+    return new Context(ctx, ctx.getSession(), ctx.getUser());
+  }
+
+  public Context set(Context ctx) {
+    Context old = current.get();
+    current.set(ctx);
+    local.setContext(ctx);
+    return old;
+  }
+
+  public Context get() {
+    return current.get();
+  }
+
+  public Context disableDb() {
+    Context old = current.get();
+    SchemaFactory<ReviewDb> sf = DisabledReviewDb::new;
+    Context ctx = new Context(sf, old.session, old.user, old.created);
+
+    current.set(ctx);
+    local.setContext(ctx);
+    return old;
+  }
+
+  public Context reopenDb() {
+    // Setting a new context with the same fields is enough to get the ReviewDb
+    // provider to reopen the database.
+    Context old = current.get();
+    return set(new Context(old.schemaFactory, old.session, old.user, old.created));
+  }
+
+  /** Returns exactly one instance per command executed. */
+  static final Scope REQUEST =
+      new Scope() {
+        @Override
+        public <T> Provider<T> scope(Key<T> key, Provider<T> creator) {
+          return new Provider<T>() {
+            @Override
+            public T get() {
+              return requireContext().get(key, creator);
+            }
+
+            @Override
+            public String toString() {
+              return String.format("%s[%s]", creator, REQUEST);
+            }
+          };
+        }
+
+        @Override
+        public String toString() {
+          return "Acceptance Test Scope.REQUEST";
+        }
+      };
+}
diff --git a/java/com/google/gerrit/acceptance/AccountCreator.java b/java/com/google/gerrit/acceptance/AccountCreator.java
new file mode 100644
index 0000000..b8a8776
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/AccountCreator.java
@@ -0,0 +1,167 @@
+// Copyright (C) 2013 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.google.gerrit.acceptance;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.errors.NoSuchGroupException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.Sequences;
+import com.google.gerrit.server.ServerInitiated;
+import com.google.gerrit.server.account.AccountsUpdate;
+import com.google.gerrit.server.account.GroupCache;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.group.db.GroupsUpdate;
+import com.google.gerrit.server.group.db.InternalGroupUpdate;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class AccountCreator {
+  private final Map<String, TestAccount> accounts;
+
+  private final Sequences sequences;
+  private final Provider<AccountsUpdate> accountsUpdateProvider;
+  private final GroupCache groupCache;
+  private final Provider<GroupsUpdate> groupsUpdateProvider;
+
+  @Inject
+  AccountCreator(
+      Sequences sequences,
+      @ServerInitiated Provider<AccountsUpdate> accountsUpdateProvider,
+      GroupCache groupCache,
+      @ServerInitiated Provider<GroupsUpdate> groupsUpdateProvider) {
+    accounts = new HashMap<>();
+    this.sequences = sequences;
+    this.accountsUpdateProvider = accountsUpdateProvider;
+    this.groupCache = groupCache;
+    this.groupsUpdateProvider = groupsUpdateProvider;
+  }
+
+  public synchronized TestAccount create(
+      @Nullable String username,
+      @Nullable String email,
+      @Nullable String fullName,
+      String... groupNames)
+      throws Exception {
+
+    TestAccount account = accounts.get(username);
+    if (account != null) {
+      return account;
+    }
+    Account.Id id = new Account.Id(sequences.nextAccountId());
+
+    List<ExternalId> extIds = new ArrayList<>(2);
+    String httpPass = null;
+    if (username != null) {
+      httpPass = "http-pass";
+      extIds.add(ExternalId.createUsername(username, id, httpPass));
+    }
+
+    if (email != null) {
+      extIds.add(ExternalId.createEmail(id, email));
+    }
+
+    accountsUpdateProvider
+        .get()
+        .insert(
+            "Create Test Account",
+            id,
+            u -> u.setFullName(fullName).setPreferredEmail(email).addExternalIds(extIds));
+
+    if (groupNames != null) {
+      for (String n : groupNames) {
+        AccountGroup.NameKey k = new AccountGroup.NameKey(n);
+        Optional<InternalGroup> group = groupCache.get(k);
+        if (!group.isPresent()) {
+          throw new NoSuchGroupException(n);
+        }
+        addGroupMember(group.get().getGroupUUID(), id);
+      }
+    }
+
+    account = new TestAccount(id, username, email, fullName, httpPass);
+    if (username != null) {
+      accounts.put(username, account);
+    }
+    return account;
+  }
+
+  public TestAccount create(@Nullable String username, String group) throws Exception {
+    return create(username, null, username, group);
+  }
+
+  public TestAccount create() throws Exception {
+    return create(null);
+  }
+
+  public TestAccount create(@Nullable String username) throws Exception {
+    return create(username, null, username, (String[]) null);
+  }
+
+  public TestAccount admin() throws Exception {
+    return create("admin", "admin@example.com", "Administrator", "Administrators");
+  }
+
+  public TestAccount admin2() throws Exception {
+    return create("admin2", "admin2@example.com", "Administrator2", "Administrators");
+  }
+
+  public TestAccount user() throws Exception {
+    return create("user", "user@example.com", "User");
+  }
+
+  public TestAccount user2() throws Exception {
+    return create("user2", "user2@example.com", "User2");
+  }
+
+  public TestAccount get(String username) {
+    return requireNonNull(
+        accounts.get(username), () -> String.format("No TestAccount created for %s ", username));
+  }
+
+  public void evict(Collection<Account.Id> ids) {
+    accounts.values().removeIf(a -> ids.contains(a.id));
+  }
+
+  public ImmutableList<TestAccount> getAll() {
+    return ImmutableList.copyOf(accounts.values());
+  }
+
+  private void addGroupMember(AccountGroup.UUID groupUuid, Account.Id accountId)
+      throws OrmException, IOException, NoSuchGroupException, ConfigInvalidException {
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder()
+            .setMemberModification(memberIds -> Sets.union(memberIds, ImmutableSet.of(accountId)))
+            .build();
+    groupsUpdateProvider.get().updateGroup(groupUuid, groupUpdate);
+  }
+}
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AssertUtil.java b/java/com/google/gerrit/acceptance/AssertUtil.java
similarity index 100%
rename from gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AssertUtil.java
rename to java/com/google/gerrit/acceptance/AssertUtil.java
diff --git a/java/com/google/gerrit/acceptance/BUILD b/java/com/google/gerrit/acceptance/BUILD
new file mode 100644
index 0000000..57f166a
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/BUILD
@@ -0,0 +1,136 @@
+load("//tools/bzl:java.bzl", "java_library2")
+load("//tools/bzl:javadoc.bzl", "java_doc")
+
+java_library(
+    name = "lib",
+    testonly = True,
+    resource_strip_prefix = "resources",
+    resources = ["//resources/com/google/gerrit/acceptance"],
+    visibility = ["//visibility:public"],
+    exports = [
+        ":framework-lib",
+        "//java/com/google/gerrit/common:annotations",
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/extensions/common/testing:common-test-util",
+        "//java/com/google/gerrit/extensions/restapi/testing:restapi-test-util",
+        "//java/com/google/gerrit/git/testing",
+        "//java/com/google/gerrit/gpg/testing:gpg-test-util",
+        "//java/com/google/gerrit/httpd",
+        "//java/com/google/gerrit/index",
+        "//java/com/google/gerrit/launcher",
+        "//java/com/google/gerrit/lucene",
+        "//java/com/google/gerrit/mail",
+        "//java/com/google/gerrit/metrics",
+        "//java/com/google/gerrit/pgm",
+        "//java/com/google/gerrit/pgm/init",
+        "//java/com/google/gerrit/pgm/util",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/server/git/receive",
+        "//java/com/google/gerrit/server/project/testing:project-test-util",
+        "//java/com/google/gerrit/server/restapi",
+        "//java/com/google/gerrit/sshd",
+        "//java/com/google/gerrit/testing:gerrit-test-util",
+        "//lib:args4j",
+        "//lib:gson",
+        "//lib:guava-retrying",
+        "//lib:gwtjsonrpc",
+        "//lib:gwtorm",
+        "//lib:h2",
+        "//lib:jimfs",
+        "//lib:jsch",
+        "//lib:servlet-api-3_1-without-neverlink",
+        "//lib/bouncycastle:bcpg",
+        "//lib/bouncycastle:bcprov",
+        "//lib/commons:compress",
+        "//lib/flogger:api",
+        "//lib/guice",
+        "//lib/guice:guice-assistedinject",
+        "//lib/guice:guice-servlet",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/mina:sshd",
+        "//prolog:gerrit-prolog-common",
+    ],
+)
+
+java_binary(
+    name = "framework",
+    testonly = True,
+    main_class = "Dummy",
+    visibility = ["//visibility:public"],
+    runtime_deps = [":framework-lib"],
+)
+
+java_library2(
+    name = "framework-lib",
+    testonly = True,
+    srcs = glob(["**/*.java"]),
+    exported_deps = [
+        "//java/com/google/gerrit/gpg",
+        "//java/com/google/gerrit/httpd/auth/openid",
+        "//java/com/google/gerrit/index:query_exception",
+        "//java/com/google/gerrit/launcher",
+        "//java/com/google/gerrit/lifecycle",
+        "//java/com/google/gerrit/pgm:daemon",
+        "//java/com/google/gerrit/pgm/http/jetty",
+        "//java/com/google/gerrit/pgm/util",
+        "//java/com/google/gerrit/server/group/testing",
+        "//java/com/google/gerrit/server/project/testing:project-test-util",
+        "//java/com/google/gerrit/testing:gerrit-test-util",
+        "//lib:guava",
+        "//lib:jimfs",
+        "//lib/auto:auto-value",
+        "//lib/auto:auto-value-annotations",
+        "//lib/httpcomponents:fluent-hc",
+        "//lib/httpcomponents:httpclient",
+        "//lib/httpcomponents:httpcore",
+        "//lib/jetty:servlet",
+        "//lib/jgit/org.eclipse.jgit.junit:junit",
+        "//lib/log:impl-log4j",
+        "//lib/log:log4j",
+        "//lib/truth",
+        "//lib/truth:truth-java8-extension",
+        "//prolog:gerrit-prolog-common",
+    ],
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/common:annotations",
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/httpd",
+        "//java/com/google/gerrit/index",
+        "//java/com/google/gerrit/index/project",
+        "//java/com/google/gerrit/lucene",
+        "//java/com/google/gerrit/mail",
+        "//java/com/google/gerrit/metrics",
+        "//java/com/google/gerrit/pgm/init",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/server/git/receive",
+        "//java/com/google/gerrit/server/restapi",
+        "//java/com/google/gerrit/server/schema",
+        "//java/com/google/gerrit/server/util/time",
+        "//lib:gson",
+        "//lib:guava-retrying",
+        "//lib:gwtorm",
+        "//lib:jsch",
+        "//lib:servlet-api-3_1",
+        "//lib/greenmail",
+        "//lib/guice",
+        "//lib/guice:guice-assistedinject",
+        "//lib/guice:guice-servlet",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/mail",
+        "//lib/mina:sshd",
+    ],
+)
+
+java_doc(
+    name = "framework-javadoc",
+    testonly = True,
+    libs = [":framework-lib"],
+    pkgs = ["com.google.gerrit.acceptance"],
+    title = "Gerrit Acceptance Test Framework Documentation",
+    visibility = ["//visibility:public"],
+)
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/ChangeIndexedCounter.java b/java/com/google/gerrit/acceptance/ChangeIndexedCounter.java
similarity index 100%
rename from gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/ChangeIndexedCounter.java
rename to java/com/google/gerrit/acceptance/ChangeIndexedCounter.java
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/ConfigAnnotationParser.java b/java/com/google/gerrit/acceptance/ConfigAnnotationParser.java
similarity index 100%
rename from gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/ConfigAnnotationParser.java
rename to java/com/google/gerrit/acceptance/ConfigAnnotationParser.java
diff --git a/java/com/google/gerrit/acceptance/DisabledAccountIndex.java b/java/com/google/gerrit/acceptance/DisabledAccountIndex.java
new file mode 100644
index 0000000..91baafb
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/DisabledAccountIndex.java
@@ -0,0 +1,71 @@
+// 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.
+
+package com.google.gerrit.acceptance;
+
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.index.query.DataSource;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.index.account.AccountIndex;
+
+/** This class wraps an index and assumes the search index can't handle any queries. */
+public class DisabledAccountIndex implements AccountIndex {
+  private final AccountIndex index;
+
+  public DisabledAccountIndex(AccountIndex index) {
+    this.index = index;
+  }
+
+  public AccountIndex unwrap() {
+    return index;
+  }
+
+  @Override
+  public Schema<AccountState> getSchema() {
+    return index.getSchema();
+  }
+
+  @Override
+  public void close() {
+    index.close();
+  }
+
+  @Override
+  public void replace(AccountState obj) {
+    throw new UnsupportedOperationException("AccountIndex is disabled");
+  }
+
+  @Override
+  public void delete(Account.Id key) {
+    throw new UnsupportedOperationException("AccountIndex is disabled");
+  }
+
+  @Override
+  public void deleteAll() {
+    throw new UnsupportedOperationException("AccountIndex is disabled");
+  }
+
+  @Override
+  public DataSource<AccountState> getSource(Predicate<AccountState> p, QueryOptions opts) {
+    throw new UnsupportedOperationException("AccountIndex is disabled");
+  }
+
+  @Override
+  public void markReady(boolean ready) {
+    throw new UnsupportedOperationException("AccountIndex is disabled");
+  }
+}
diff --git a/java/com/google/gerrit/acceptance/DisabledChangeIndex.java b/java/com/google/gerrit/acceptance/DisabledChangeIndex.java
new file mode 100644
index 0000000..0d473af
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/DisabledChangeIndex.java
@@ -0,0 +1,86 @@
+// Copyright (C) 2017 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.google.gerrit.acceptance;
+
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.index.query.DataSource;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Change.Id;
+import com.google.gerrit.server.index.change.ChangeIndex;
+import com.google.gerrit.server.query.change.ChangeData;
+import java.io.IOException;
+import java.util.Optional;
+
+/**
+ * This class wraps an index and assumes the search index can't handle any queries. However, it does
+ * return the current schema as the assumption is that we need a search index for starting Gerrit in
+ * the first place and only later lose the index connection (making it so that we can't send
+ * requests there anymore).
+ */
+public class DisabledChangeIndex implements ChangeIndex {
+  private final ChangeIndex index;
+
+  public DisabledChangeIndex(ChangeIndex index) {
+    this.index = index;
+  }
+
+  public ChangeIndex unwrap() {
+    return index;
+  }
+
+  @Override
+  public Schema<ChangeData> getSchema() {
+    return index.getSchema();
+  }
+
+  @Override
+  public void close() {
+    index.close();
+  }
+
+  @Override
+  public void replace(ChangeData obj) throws IOException {
+    throw new UnsupportedOperationException("ChangeIndex is disabled");
+  }
+
+  @Override
+  public void delete(Id key) throws IOException {
+    throw new UnsupportedOperationException("ChangeIndex is disabled");
+  }
+
+  @Override
+  public void deleteAll() throws IOException {
+    throw new UnsupportedOperationException("ChangeIndex is disabled");
+  }
+
+  @Override
+  public DataSource<ChangeData> getSource(Predicate<ChangeData> p, QueryOptions opts)
+      throws QueryParseException {
+    throw new UnsupportedOperationException("ChangeIndex is disabled");
+  }
+
+  @Override
+  public void markReady(boolean ready) throws IOException {
+    throw new UnsupportedOperationException("ChangeIndex is disabled");
+  }
+
+  @Override
+  public Optional<ChangeData> get(Change.Id key, QueryOptions opts) throws IOException {
+    throw new UnsupportedOperationException("ChangeIndex is disabled");
+  }
+}
diff --git a/java/com/google/gerrit/acceptance/DisabledProjectIndex.java b/java/com/google/gerrit/acceptance/DisabledProjectIndex.java
new file mode 100644
index 0000000..2524a76
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/DisabledProjectIndex.java
@@ -0,0 +1,76 @@
+// 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.
+
+package com.google.gerrit.acceptance;
+
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.index.project.ProjectData;
+import com.google.gerrit.index.project.ProjectIndex;
+import com.google.gerrit.index.query.DataSource;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.reviewdb.client.Project;
+
+/**
+ * This class wraps an index and assumes the search index can't handle any queries. However, it does
+ * return the current schema as the assumption is that we need a search index for starting Gerrit in
+ * the first place and only later lose the index connection (making it so that we can't send
+ * requests there anymore).
+ */
+public class DisabledProjectIndex implements ProjectIndex {
+  private final ProjectIndex index;
+
+  public DisabledProjectIndex(ProjectIndex index) {
+    this.index = index;
+  }
+
+  public ProjectIndex unwrap() {
+    return index;
+  }
+
+  @Override
+  public Schema<ProjectData> getSchema() {
+    return index.getSchema();
+  }
+
+  @Override
+  public void close() {
+    index.close();
+  }
+
+  @Override
+  public void replace(ProjectData obj) {
+    throw new UnsupportedOperationException("ProjectIndex is disabled");
+  }
+
+  @Override
+  public void delete(Project.NameKey key) {
+    throw new UnsupportedOperationException("ProjectIndex is disabled");
+  }
+
+  @Override
+  public void deleteAll() {
+    throw new UnsupportedOperationException("ProjectIndex is disabled");
+  }
+
+  @Override
+  public DataSource<ProjectData> getSource(Predicate<ProjectData> p, QueryOptions opts) {
+    throw new UnsupportedOperationException("ProjectIndex is disabled");
+  }
+
+  @Override
+  public void markReady(boolean ready) {
+    throw new UnsupportedOperationException("ProjectIndex is disabled");
+  }
+}
diff --git a/java/com/google/gerrit/acceptance/EventRecorder.java b/java/com/google/gerrit/acceptance/EventRecorder.java
new file mode 100644
index 0000000..1af71b8
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/EventRecorder.java
@@ -0,0 +1,233 @@
+// 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.
+
+package com.google.gerrit.acceptance;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.LinkedListMultimap;
+import com.google.common.collect.ListMultimap;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.data.RefUpdateAttribute;
+import com.google.gerrit.server.events.ChangeDeletedEvent;
+import com.google.gerrit.server.events.ChangeMergedEvent;
+import com.google.gerrit.server.events.Event;
+import com.google.gerrit.server.events.RefEvent;
+import com.google.gerrit.server.events.RefUpdatedEvent;
+import com.google.gerrit.server.events.ReviewerDeletedEvent;
+import com.google.gerrit.server.events.UserScopedEventListener;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.revwalk.RevCommit;
+
+public class EventRecorder {
+  private final RegistrationHandle eventListenerRegistration;
+  private final ListMultimap<String, RefEvent> recordedEvents;
+
+  @Singleton
+  public static class Factory {
+    private final DynamicSet<UserScopedEventListener> eventListeners;
+    private final IdentifiedUser.GenericFactory userFactory;
+
+    @Inject
+    Factory(
+        DynamicSet<UserScopedEventListener> eventListeners,
+        IdentifiedUser.GenericFactory userFactory) {
+      this.eventListeners = eventListeners;
+      this.userFactory = userFactory;
+    }
+
+    public EventRecorder create(TestAccount user) {
+      return new EventRecorder(eventListeners, userFactory.create(user.id));
+    }
+  }
+
+  public EventRecorder(DynamicSet<UserScopedEventListener> eventListeners, IdentifiedUser user) {
+    recordedEvents = LinkedListMultimap.create();
+
+    eventListenerRegistration =
+        eventListeners.add(
+            "gerrit",
+            new UserScopedEventListener() {
+              @Override
+              public void onEvent(Event e) {
+                if (e instanceof ReviewerDeletedEvent) {
+                  recordedEvents.put(ReviewerDeletedEvent.TYPE, (ReviewerDeletedEvent) e);
+                } else if (e instanceof ChangeDeletedEvent) {
+                  recordedEvents.put(ChangeDeletedEvent.TYPE, (ChangeDeletedEvent) e);
+                } else if (e instanceof RefEvent) {
+                  RefEvent event = (RefEvent) e;
+                  String key =
+                      refEventKey(
+                          event.getType(), event.getProjectNameKey().get(), event.getRefName());
+                  recordedEvents.put(key, event);
+                }
+              }
+
+              @Override
+              public CurrentUser getUser() {
+                return user;
+              }
+            });
+  }
+
+  private static String refEventKey(String type, String project, String ref) {
+    return String.format("%s-%s-%s", type, project, ref);
+  }
+
+  private ImmutableList<RefUpdatedEvent> getRefUpdatedEvents(
+      String project, String refName, int expectedSize) {
+    String key = refEventKey(RefUpdatedEvent.TYPE, project, refName);
+    if (expectedSize == 0) {
+      assertThat(recordedEvents).doesNotContainKey(key);
+      return ImmutableList.of();
+    }
+
+    assertThat(recordedEvents).containsKey(key);
+    ImmutableList<RefUpdatedEvent> events =
+        FluentIterable.from(recordedEvents.get(key))
+            .transform(RefUpdatedEvent.class::cast)
+            .toList();
+    assertThat(events).hasSize(expectedSize);
+    return events;
+  }
+
+  private ImmutableList<ChangeMergedEvent> getChangeMergedEvents(
+      String project, String branch, int expectedSize) {
+    String key = refEventKey(ChangeMergedEvent.TYPE, project, branch);
+    if (expectedSize == 0) {
+      assertThat(recordedEvents).doesNotContainKey(key);
+      return ImmutableList.of();
+    }
+
+    assertThat(recordedEvents).containsKey(key);
+    ImmutableList<ChangeMergedEvent> events =
+        FluentIterable.from(recordedEvents.get(key))
+            .transform(ChangeMergedEvent.class::cast)
+            .toList();
+    assertThat(events).hasSize(expectedSize);
+    return events;
+  }
+
+  private ImmutableList<ReviewerDeletedEvent> getReviewerDeletedEvents(int expectedSize) {
+    String key = ReviewerDeletedEvent.TYPE;
+    if (expectedSize == 0) {
+      assertThat(recordedEvents).doesNotContainKey(key);
+      return ImmutableList.of();
+    }
+    assertThat(recordedEvents).containsKey(key);
+    ImmutableList<ReviewerDeletedEvent> events =
+        FluentIterable.from(recordedEvents.get(key))
+            .transform(ReviewerDeletedEvent.class::cast)
+            .toList();
+    assertThat(events).hasSize(expectedSize);
+    return events;
+  }
+
+  private ImmutableList<ChangeDeletedEvent> getChangeDeletedEvents(int expectedSize) {
+    String key = ChangeDeletedEvent.TYPE;
+    if (expectedSize == 0) {
+      assertThat(recordedEvents).doesNotContainKey(key);
+      return ImmutableList.of();
+    }
+    assertThat(recordedEvents).containsKey(key);
+    ImmutableList<ChangeDeletedEvent> events =
+        FluentIterable.from(recordedEvents.get(key))
+            .transform(ChangeDeletedEvent.class::cast)
+            .toList();
+    assertThat(events).hasSize(expectedSize);
+    return events;
+  }
+
+  public void assertNoRefUpdatedEvents(String project, String branch) throws Exception {
+    getRefUpdatedEvents(project, branch, 0);
+  }
+
+  public void assertRefUpdatedEvents(String project, String branch, String... expected)
+      throws Exception {
+    ImmutableList<RefUpdatedEvent> events =
+        getRefUpdatedEvents(project, branch, expected.length / 2);
+    int i = 0;
+    for (RefUpdatedEvent event : events) {
+      RefUpdateAttribute actual = event.refUpdate.get();
+      String oldRev = expected[i] == null ? ObjectId.zeroId().name() : expected[i];
+      String newRev = expected[i + 1] == null ? ObjectId.zeroId().name() : expected[i + 1];
+      assertThat(actual.oldRev).isEqualTo(oldRev);
+      assertThat(actual.newRev).isEqualTo(newRev);
+      i += 2;
+    }
+  }
+
+  public void assertRefUpdatedEvents(String project, String branch, RevCommit... expected)
+      throws Exception {
+    ImmutableList<RefUpdatedEvent> events =
+        getRefUpdatedEvents(project, branch, expected.length / 2);
+    int i = 0;
+    for (RefUpdatedEvent event : events) {
+      RefUpdateAttribute actual = event.refUpdate.get();
+      String oldRev = expected[i] == null ? ObjectId.zeroId().name() : expected[i].name();
+      String newRev = expected[i + 1] == null ? ObjectId.zeroId().name() : expected[i + 1].name();
+      assertThat(actual.oldRev).isEqualTo(oldRev);
+      assertThat(actual.newRev).isEqualTo(newRev);
+      i += 2;
+    }
+  }
+
+  public void assertChangeMergedEvents(String project, String branch, String... expected)
+      throws Exception {
+    ImmutableList<ChangeMergedEvent> events =
+        getChangeMergedEvents(project, branch, expected.length / 2);
+    int i = 0;
+    for (ChangeMergedEvent event : events) {
+      String id = event.change.get().id;
+      assertThat(id).isEqualTo(expected[i]);
+      assertThat(event.newRev).isEqualTo(expected[i + 1]);
+      i += 2;
+    }
+  }
+
+  public void assertReviewerDeletedEvents(String... expected) {
+    ImmutableList<ReviewerDeletedEvent> events = getReviewerDeletedEvents(expected.length / 2);
+    int i = 0;
+    for (ReviewerDeletedEvent event : events) {
+      String id = event.change.get().id;
+      assertThat(id).isEqualTo(expected[i]);
+      String reviewer = event.reviewer.get().email;
+      assertThat(reviewer).isEqualTo(expected[i + 1]);
+      i += 2;
+    }
+  }
+
+  public void assertChangeDeletedEvents(String... expected) {
+    ImmutableList<ChangeDeletedEvent> events = getChangeDeletedEvents(expected.length / 2);
+    int i = 0;
+    for (ChangeDeletedEvent event : events) {
+      String id = event.change.get().id;
+      assertThat(id).isEqualTo(expected[i]);
+      String reviewer = event.deleter.get().email;
+      assertThat(reviewer).isEqualTo(expected[i + 1]);
+      i += 2;
+    }
+  }
+
+  public void close() {
+    eventListenerRegistration.remove();
+  }
+}
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/GcAssert.java b/java/com/google/gerrit/acceptance/GcAssert.java
similarity index 100%
rename from gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/GcAssert.java
rename to java/com/google/gerrit/acceptance/GcAssert.java
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/GerritConfig.java b/java/com/google/gerrit/acceptance/GerritConfig.java
similarity index 100%
rename from gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/GerritConfig.java
rename to java/com/google/gerrit/acceptance/GerritConfig.java
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/GerritConfigs.java b/java/com/google/gerrit/acceptance/GerritConfigs.java
similarity index 100%
rename from gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/GerritConfigs.java
rename to java/com/google/gerrit/acceptance/GerritConfigs.java
diff --git a/java/com/google/gerrit/acceptance/GerritServer.java b/java/com/google/gerrit/acceptance/GerritServer.java
new file mode 100644
index 0000000..050de49
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/GerritServer.java
@@ -0,0 +1,676 @@
+// Copyright (C) 2013 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.google.gerrit.acceptance;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkState;
+import static java.util.Objects.requireNonNull;
+import static org.apache.log4j.Logger.getLogger;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.gerrit.acceptance.testsuite.account.AccountOperations;
+import com.google.gerrit.acceptance.testsuite.account.AccountOperationsImpl;
+import com.google.gerrit.acceptance.testsuite.group.GroupOperations;
+import com.google.gerrit.acceptance.testsuite.group.GroupOperationsImpl;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.config.FactoryModule;
+import com.google.gerrit.lucene.LuceneIndexModule;
+import com.google.gerrit.pgm.Daemon;
+import com.google.gerrit.pgm.Init;
+import com.google.gerrit.server.config.GerritRuntime;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.SitePath;
+import com.google.gerrit.server.git.receive.AsyncReceiveCommits;
+import com.google.gerrit.server.ssh.NoSshModule;
+import com.google.gerrit.server.util.ManualRequestContext;
+import com.google.gerrit.server.util.OneOffRequestContext;
+import com.google.gerrit.server.util.SocketUtil;
+import com.google.gerrit.server.util.SystemLog;
+import com.google.gerrit.testing.FakeEmailSender;
+import com.google.gerrit.testing.FakeGroupAuditService;
+import com.google.gerrit.testing.InMemoryDatabase;
+import com.google.gerrit.testing.InMemoryRepositoryManager;
+import com.google.gerrit.testing.NoteDbChecker;
+import com.google.gerrit.testing.NoteDbMode;
+import com.google.gerrit.testing.SshMode;
+import com.google.gerrit.testing.TempFileUtil;
+import com.google.inject.AbstractModule;
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import com.google.inject.Module;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.URI;
+import java.nio.file.Path;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+import java.util.concurrent.BrokenBarrierException;
+import java.util.concurrent.CyclicBarrier;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Stream;
+import org.apache.log4j.ConsoleAppender;
+import org.apache.log4j.Level;
+import org.apache.log4j.LogManager;
+import org.apache.log4j.Logger;
+import org.apache.log4j.PatternLayout;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.RepositoryCache;
+import org.eclipse.jgit.util.FS;
+
+public class GerritServer implements AutoCloseable {
+  public static class StartupException extends Exception {
+    private static final long serialVersionUID = 1L;
+
+    StartupException(String msg, Throwable cause) {
+      super(msg, cause);
+    }
+  }
+
+  @AutoValue
+  public abstract static class Description {
+    public static Description forTestClass(
+        org.junit.runner.Description testDesc, String configName) {
+      return new AutoValue_GerritServer_Description(
+          testDesc,
+          configName,
+          !has(UseLocalDisk.class, testDesc.getTestClass()) && !forceLocalDisk(),
+          !has(NoHttpd.class, testDesc.getTestClass()),
+          has(Sandboxed.class, testDesc.getTestClass()),
+          has(UseSsh.class, testDesc.getTestClass()),
+          null, // @GerritConfig is only valid on methods.
+          null, // @GerritConfigs is only valid on methods.
+          null, // @GlobalPluginConfig is only valid on methods.
+          null, // @GlobalPluginConfigs is only valid on methods.
+          getLogLevelThresholdAnnotation(testDesc));
+    }
+
+    public static Description forTestMethod(
+        org.junit.runner.Description testDesc, String configName) {
+      return new AutoValue_GerritServer_Description(
+          testDesc,
+          configName,
+          (testDesc.getAnnotation(UseLocalDisk.class) == null
+                  && !has(UseLocalDisk.class, testDesc.getTestClass()))
+              && !forceLocalDisk(),
+          testDesc.getAnnotation(NoHttpd.class) == null
+              && !has(NoHttpd.class, testDesc.getTestClass()),
+          testDesc.getAnnotation(Sandboxed.class) != null
+              || has(Sandboxed.class, testDesc.getTestClass()),
+          testDesc.getAnnotation(UseSsh.class) != null
+              || has(UseSsh.class, testDesc.getTestClass()),
+          testDesc.getAnnotation(GerritConfig.class),
+          testDesc.getAnnotation(GerritConfigs.class),
+          testDesc.getAnnotation(GlobalPluginConfig.class),
+          testDesc.getAnnotation(GlobalPluginConfigs.class),
+          getLogLevelThresholdAnnotation(testDesc));
+    }
+
+    private static boolean has(Class<? extends Annotation> annotation, Class<?> clazz) {
+      for (; clazz != null; clazz = clazz.getSuperclass()) {
+        if (clazz.getAnnotation(annotation) != null) {
+          return true;
+        }
+      }
+      return false;
+    }
+
+    private static Level getLogLevelThresholdAnnotation(org.junit.runner.Description testDesc) {
+      LogThreshold logLevelThreshold = testDesc.getTestClass().getAnnotation(LogThreshold.class);
+      if (logLevelThreshold == null) {
+        return Level.DEBUG;
+      }
+      return Level.toLevel(logLevelThreshold.level());
+    }
+
+    abstract org.junit.runner.Description testDescription();
+
+    @Nullable
+    abstract String configName();
+
+    abstract boolean memory();
+
+    abstract boolean httpd();
+
+    abstract boolean sandboxed();
+
+    abstract boolean useSshAnnotation();
+
+    boolean useSsh() {
+      return useSshAnnotation() && SshMode.useSsh();
+    }
+
+    @Nullable
+    abstract GerritConfig config();
+
+    @Nullable
+    abstract GerritConfigs configs();
+
+    @Nullable
+    abstract GlobalPluginConfig pluginConfig();
+
+    @Nullable
+    abstract GlobalPluginConfigs pluginConfigs();
+
+    abstract Level logLevelThreshold();
+
+    private void checkValidAnnotations() {
+      if (configs() != null && config() != null) {
+        throw new IllegalStateException("Use either @GerritConfigs or @GerritConfig not both");
+      }
+      if (pluginConfigs() != null && pluginConfig() != null) {
+        throw new IllegalStateException(
+            "Use either @GlobalPluginConfig or @GlobalPluginConfigs not both");
+      }
+      if ((pluginConfigs() != null || pluginConfig() != null) && memory()) {
+        throw new IllegalStateException("Must use @UseLocalDisk with @GlobalPluginConfig(s)");
+      }
+    }
+
+    private Config buildConfig(Config baseConfig) {
+      if (configs() != null) {
+        return ConfigAnnotationParser.parse(baseConfig, configs());
+      } else if (config() != null) {
+        return ConfigAnnotationParser.parse(baseConfig, config());
+      } else {
+        return baseConfig;
+      }
+    }
+
+    private Map<String, Config> buildPluginConfigs() {
+      if (pluginConfigs() != null) {
+        return ConfigAnnotationParser.parse(pluginConfigs());
+      } else if (pluginConfig() != null) {
+        return ConfigAnnotationParser.parse(pluginConfig());
+      }
+      return new HashMap<>();
+    }
+  }
+
+  private static final ImmutableMap<String, Level> LOG_LEVELS =
+      ImmutableMap.<String, Level>builder()
+          .put("com.google.gerrit", Level.DEBUG)
+
+          // Silence non-critical messages from MINA SSHD.
+          .put("org.apache.mina", Level.WARN)
+          .put("org.apache.sshd.common", Level.WARN)
+          .put("org.apache.sshd.server", Level.WARN)
+          .put("org.apache.sshd.common.keyprovider.FileKeyPairProvider", Level.INFO)
+          .put("com.google.gerrit.sshd.GerritServerSession", Level.WARN)
+
+          // Silence non-critical messages from mime-util.
+          .put("eu.medsea.mimeutil", Level.WARN)
+
+          // Silence non-critical messages from openid4java.
+          .put("org.apache.xml", Level.WARN)
+          .put("org.openid4java", Level.WARN)
+          .put("org.openid4java.consumer.ConsumerManager", Level.FATAL)
+          .put("org.openid4java.discovery.Discovery", Level.ERROR)
+          .put("org.openid4java.server.RealmVerifier", Level.ERROR)
+          .put("org.openid4java.message.AuthSuccess", Level.ERROR)
+
+          // Silence non-critical messages from c3p0 (if used).
+          .put("com.mchange.v2.c3p0", Level.WARN)
+          .put("com.mchange.v2.resourcepool", Level.WARN)
+          .put("com.mchange.v2.sql", Level.WARN)
+
+          // Silence non-critical messages from apache.http.
+          .put("org.apache.http", Level.WARN)
+
+          // Silence non-critical messages from Jetty.
+          .put("org.eclipse.jetty", Level.WARN)
+
+          // Silence non-critical messages from JGit.
+          .put("org.eclipse.jgit.transport.PacketLineIn", Level.WARN)
+          .put("org.eclipse.jgit.transport.PacketLineOut", Level.WARN)
+          .build();
+
+  private static boolean forceLocalDisk() {
+    String value = Strings.nullToEmpty(System.getenv("GERRIT_FORCE_LOCAL_DISK"));
+    if (value.isEmpty()) {
+      value = Strings.nullToEmpty(System.getProperty("gerrit.forceLocalDisk"));
+    }
+    switch (value.trim().toLowerCase(Locale.US)) {
+      case "1":
+      case "yes":
+      case "true":
+        return true;
+      default:
+        return false;
+    }
+  }
+
+  /**
+   * Initializes on-disk site but does not start server.
+   *
+   * @param desc server description
+   * @param baseConfig default config values; merged with config from {@code desc} and then written
+   *     into {@code site/etc/gerrit.config}.
+   * @param site temp directory where site will live.
+   * @throws Exception
+   */
+  public static void init(Description desc, Config baseConfig, Path site) throws Exception {
+    checkArgument(!desc.memory(), "can't initialize site path for in-memory test: %s", desc);
+    Config cfg = desc.buildConfig(baseConfig);
+    Map<String, Config> pluginConfigs = desc.buildPluginConfigs();
+
+    MergeableFileBasedConfig gerritConfig =
+        new MergeableFileBasedConfig(
+            site.resolve("etc").resolve("gerrit.config").toFile(), FS.DETECTED);
+    gerritConfig.load();
+    gerritConfig.merge(cfg);
+    mergeTestConfig(gerritConfig);
+    gerritConfig.save();
+
+    Init init = new Init();
+    int rc =
+        init.main(
+            new String[] {
+              "-d", site.toString(), "--batch", "--no-auto-start", "--skip-plugins",
+            });
+    if (rc != 0) {
+      throw new RuntimeException("Couldn't initialize site");
+    }
+
+    for (String pluginName : pluginConfigs.keySet()) {
+      MergeableFileBasedConfig pluginCfg =
+          new MergeableFileBasedConfig(
+              site.resolve("etc").resolve(pluginName + ".config").toFile(), FS.DETECTED);
+      pluginCfg.load();
+      pluginCfg.merge(pluginConfigs.get(pluginName));
+      pluginCfg.save();
+    }
+  }
+
+  /**
+   * Initializes new Gerrit site and returns started server.
+   *
+   * <p>A new temporary directory for the site will be created with {@link TempFileUtil}, even in
+   * the server is otherwise configured in-memory. Closing the server stops the daemon but does not
+   * delete the temporary directory. Callers may either get the directory with {@link
+   * #getSitePath()} and delete it manually, or call {@link TempFileUtil#cleanup()}.
+   *
+   * @param desc server description.
+   * @param baseConfig default config values; merged with config from {@code desc}.
+   * @param testSysModule additional Guice module to use.
+   * @return started server.
+   * @throws Exception
+   */
+  public static GerritServer initAndStart(
+      Description desc, Config baseConfig, @Nullable Module testSysModule) throws Exception {
+    Path site = TempFileUtil.createTempDirectory().toPath();
+    try {
+      if (!desc.memory()) {
+        init(desc, baseConfig, site);
+      }
+      return start(desc, baseConfig, site, testSysModule, null, null);
+    } catch (Exception e) {
+      TempFileUtil.recursivelyDelete(site.toFile());
+      throw e;
+    }
+  }
+
+  /**
+   * Starts Gerrit server from existing on-disk site.
+   *
+   * @param desc server description.
+   * @param baseConfig default config values; merged with config from {@code desc}.
+   * @param site existing temporary directory for site. Required, but may be empty, for in-memory
+   *     servers. For on-disk servers, assumes that {@link #init} was previously called to
+   *     initialize this directory. Can be retrieved from the returned instance via {@link
+   *     #getSitePath()}.
+   * @param testSysModule optional additional module to add to the system injector.
+   * @param inMemoryRepoManager {@link InMemoryRepositoryManager} that should be used if the site is
+   *     started in memory
+   * @param inMemoryDatabaseInstance {@link com.google.gerrit.testing.InMemoryDatabase.Instance}
+   *     that should be used if the site is started in memory
+   * @param additionalArgs additional command-line arguments for the daemon program; only allowed if
+   *     the test is not in-memory.
+   * @return started server.
+   * @throws Exception
+   */
+  public static GerritServer start(
+      Description desc,
+      Config baseConfig,
+      Path site,
+      @Nullable Module testSysModule,
+      @Nullable InMemoryRepositoryManager inMemoryRepoManager,
+      @Nullable InMemoryDatabase.Instance inMemoryDatabaseInstance,
+      String... additionalArgs)
+      throws Exception {
+    checkArgument(site != null, "site is required (even for in-memory server");
+    desc.checkValidAnnotations();
+    configureLogging(desc.logLevelThreshold());
+    CyclicBarrier serverStarted = new CyclicBarrier(2);
+    Daemon daemon =
+        new Daemon(
+            () -> {
+              try {
+                serverStarted.await();
+              } catch (InterruptedException | BrokenBarrierException e) {
+                throw new RuntimeException(e);
+              }
+            },
+            site);
+    daemon.setEmailModuleForTesting(new FakeEmailSender.Module());
+    daemon.setAuditEventModuleForTesting(new FakeGroupAuditService.Module());
+    if (testSysModule != null) {
+      daemon.addAdditionalSysModuleForTesting(testSysModule);
+    }
+    daemon.setEnableSshd(desc.useSsh());
+
+    if (desc.memory()) {
+      checkArgument(additionalArgs.length == 0, "cannot pass args to in-memory server");
+      return startInMemory(
+          desc, site, baseConfig, daemon, inMemoryRepoManager, inMemoryDatabaseInstance);
+    }
+    return startOnDisk(desc, site, daemon, serverStarted, additionalArgs);
+  }
+
+  private static GerritServer startInMemory(
+      Description desc,
+      Path site,
+      Config baseConfig,
+      Daemon daemon,
+      @Nullable InMemoryRepositoryManager inMemoryRepoManager,
+      @Nullable InMemoryDatabase.Instance inMemoryDatabaseInstance)
+      throws Exception {
+    Config cfg = desc.buildConfig(baseConfig);
+    daemon.setSlave(isSlave(baseConfig) || cfg.getBoolean("container", "slave", false));
+    mergeTestConfig(cfg);
+    // Set the log4j configuration to an invalid one to prevent system logs
+    // from getting configured and creating log files.
+    System.setProperty(SystemLog.LOG4J_CONFIGURATION, "invalidConfiguration");
+    cfg.setBoolean("httpd", null, "requestLog", false);
+    cfg.setBoolean("sshd", null, "requestLog", false);
+    cfg.setBoolean("index", "lucene", "testInmemory", true);
+    cfg.setBoolean("index", null, "onlineUpgrade", false);
+    cfg.setString("gitweb", null, "cgi", "");
+    daemon.setEnableHttpd(desc.httpd());
+    daemon.setLuceneModule(LuceneIndexModule.singleVersionAllLatest(0, isSlave(baseConfig)));
+    daemon.setDatabaseForTesting(
+        ImmutableList.<Module>of(
+            new InMemoryTestingDatabaseModule(
+                cfg, site, inMemoryRepoManager, inMemoryDatabaseInstance),
+            new AbstractModule() {
+              @Override
+              protected void configure() {
+                bind(GerritRuntime.class).toInstance(GerritRuntime.DAEMON);
+              }
+            }));
+    daemon.addAdditionalSysModuleForTesting(
+        new ReindexProjectsAtStartup.Module(), new ReindexGroupsAtStartup.Module());
+    daemon.start();
+    return new GerritServer(desc, null, createTestInjector(daemon), daemon, null);
+  }
+
+  private static boolean isSlave(Config baseConfig) {
+    return baseConfig.getBoolean("container", "slave", false);
+  }
+
+  private static GerritServer startOnDisk(
+      Description desc,
+      Path site,
+      Daemon daemon,
+      CyclicBarrier serverStarted,
+      String[] additionalArgs)
+      throws Exception {
+    requireNonNull(site);
+    ExecutorService daemonService = Executors.newSingleThreadExecutor();
+    String[] args =
+        Stream.concat(
+                Stream.of(
+                    "-d", site.toString(), "--headless", "--console-log", "--show-stack-trace"),
+                Arrays.stream(additionalArgs))
+            .toArray(String[]::new);
+    @SuppressWarnings("unused")
+    Future<?> possiblyIgnoredError =
+        daemonService.submit(
+            () -> {
+              int rc = daemon.main(args);
+              if (rc != 0) {
+                System.err.println("Failed to start Gerrit daemon");
+                serverStarted.reset();
+              }
+              return null;
+            });
+    try {
+      serverStarted.await();
+    } catch (BrokenBarrierException e) {
+      daemon.stop();
+      throw new StartupException("Failed to start Gerrit daemon; see log", e);
+    }
+    System.out.println("Gerrit Server Started");
+
+    return new GerritServer(desc, site, createTestInjector(daemon), daemon, daemonService);
+  }
+
+  private static void configureLogging(Level threshold) {
+    LogManager.resetConfiguration();
+
+    PatternLayout layout = new PatternLayout();
+    layout.setConversionPattern("%-5p %c %x: %m%n");
+
+    ConsoleAppender dst = new ConsoleAppender();
+    dst.setLayout(layout);
+    dst.setTarget("System.err");
+    dst.setThreshold(threshold);
+    dst.activateOptions();
+
+    Logger root = LogManager.getRootLogger();
+    root.removeAllAppenders();
+    root.addAppender(dst);
+
+    LOG_LEVELS.entrySet().stream().forEach(e -> getLogger(e.getKey()).setLevel(e.getValue()));
+  }
+
+  private static void mergeTestConfig(Config cfg) {
+    String forceEphemeralPort = String.format("%s:0", getLocalHost().getHostName());
+    String url = "http://" + forceEphemeralPort + "/";
+    cfg.setString("gerrit", null, "canonicalWebUrl", url);
+    cfg.setString("httpd", null, "listenUrl", url);
+
+    if (cfg.getString("sshd", null, "listenAddress") == null) {
+      cfg.setString("sshd", null, "listenAddress", forceEphemeralPort);
+    }
+    cfg.setBoolean("sshd", null, "testUseInsecureRandom", true);
+    cfg.unset("cache", null, "directory");
+    cfg.setString("gerrit", null, "basePath", "git");
+    cfg.setBoolean("sendemail", null, "enable", true);
+    cfg.setInt("sendemail", null, "threadPoolSize", 0);
+    cfg.setInt("cache", "projects", "checkFrequency", 0);
+    cfg.setInt("plugins", null, "checkFrequency", 0);
+
+    cfg.setInt("sshd", null, "threads", 1);
+    cfg.setInt("sshd", null, "commandStartThreads", 1);
+    cfg.setInt("receive", null, "threadPoolSize", 1);
+    cfg.setInt("index", null, "threads", 1);
+    cfg.setBoolean("index", null, "reindexAfterRefUpdate", false);
+
+    NoteDbMode.newNotesMigrationFromEnv().setConfigValues(cfg);
+  }
+
+  private static Injector createTestInjector(Daemon daemon) throws Exception {
+    Injector sysInjector = get(daemon, "sysInjector");
+    Module module =
+        new FactoryModule() {
+          @Override
+          protected void configure() {
+            bindConstant().annotatedWith(SshEnabled.class).to(daemon.getEnableSshd());
+            bind(AccountCreator.class);
+            bind(AccountOperations.class).to(AccountOperationsImpl.class);
+            bind(GroupOperations.class).to(GroupOperationsImpl.class);
+            factory(PushOneCommit.Factory.class);
+            install(InProcessProtocol.module());
+            install(new NoSshModule());
+            install(new AsyncReceiveCommits.Module());
+            factory(ProjectResetter.Builder.Factory.class);
+          }
+        };
+    return sysInjector.createChildInjector(module);
+  }
+
+  @SuppressWarnings("unchecked")
+  private static <T> T get(Object obj, String field)
+      throws SecurityException, NoSuchFieldException, IllegalArgumentException,
+          IllegalAccessException {
+    Field f = obj.getClass().getDeclaredField(field);
+    f.setAccessible(true);
+    return (T) f.get(obj);
+  }
+
+  private static InetAddress getLocalHost() {
+    return InetAddress.getLoopbackAddress();
+  }
+
+  private final Description desc;
+  private final Path sitePath;
+
+  private Daemon daemon;
+  private ExecutorService daemonService;
+  private Injector testInjector;
+  private String url;
+  private InetSocketAddress sshdAddress;
+  private InetSocketAddress httpAddress;
+
+  private GerritServer(
+      Description desc,
+      @Nullable Path sitePath,
+      Injector testInjector,
+      Daemon daemon,
+      @Nullable ExecutorService daemonService) {
+    this.desc = requireNonNull(desc);
+    this.sitePath = sitePath;
+    this.testInjector = requireNonNull(testInjector);
+    this.daemon = requireNonNull(daemon);
+    this.daemonService = daemonService;
+
+    Config cfg = testInjector.getInstance(Key.get(Config.class, GerritServerConfig.class));
+    url = cfg.getString("gerrit", null, "canonicalWebUrl");
+    URI uri = URI.create(url);
+
+    String addr = cfg.getString("sshd", null, "listenAddress");
+    // We do not use InitSshd.isOff to avoid coupling GerritServer to the SSH code.
+    if (!"off".equalsIgnoreCase(addr)) {
+      sshdAddress = SocketUtil.resolve(cfg.getString("sshd", null, "listenAddress"), 0);
+    }
+    httpAddress = new InetSocketAddress(uri.getHost(), uri.getPort());
+  }
+
+  String getUrl() {
+    return url;
+  }
+
+  InetSocketAddress getSshdAddress() {
+    return sshdAddress;
+  }
+
+  InetSocketAddress getHttpAddress() {
+    return httpAddress;
+  }
+
+  public Injector getTestInjector() {
+    return testInjector;
+  }
+
+  Description getDescription() {
+    return desc;
+  }
+
+  public static GerritServer restartAsSlave(GerritServer server) throws Exception {
+    checkState(server.desc.sandboxed(), "restarting as slave requires @Sandboxed");
+
+    Path site = server.testInjector.getInstance(Key.get(Path.class, SitePath.class));
+
+    Config cfg = server.testInjector.getInstance(Key.get(Config.class, GerritServerConfig.class));
+    cfg.setBoolean("container", null, "slave", true);
+
+    InMemoryRepositoryManager inMemoryRepoManager = null;
+    if (hasBinding(server.testInjector, InMemoryRepositoryManager.class)) {
+      inMemoryRepoManager = server.testInjector.getInstance(InMemoryRepositoryManager.class);
+    }
+
+    InMemoryDatabase.Instance dbInstance = null;
+    if (hasBinding(server.testInjector, InMemoryDatabase.class)) {
+      InMemoryDatabase inMemoryDatabase = server.testInjector.getInstance(InMemoryDatabase.class);
+      dbInstance = inMemoryDatabase.getDbInstance();
+      dbInstance.setKeepOpen(true);
+    }
+    try {
+      server.close();
+      server.daemon.stop();
+      return start(server.desc, cfg, site, null, inMemoryRepoManager, dbInstance);
+    } finally {
+      if (dbInstance != null) {
+        dbInstance.setKeepOpen(false);
+      }
+    }
+  }
+
+  private static boolean hasBinding(Injector injector, Class<?> clazz) {
+    return injector.getExistingBinding(Key.get(clazz)) != null;
+  }
+
+  @Override
+  public void close() throws Exception {
+    try {
+      checkNoteDbState();
+    } finally {
+      daemon.getLifecycleManager().stop();
+      if (daemonService != null) {
+        System.out.println("Gerrit Server Shutdown");
+        daemonService.shutdownNow();
+        daemonService.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
+      }
+      RepositoryCache.clear();
+    }
+  }
+
+  public Path getSitePath() {
+    return sitePath;
+  }
+
+  private void checkNoteDbState() throws Exception {
+    NoteDbMode mode = NoteDbMode.get();
+    if (mode != NoteDbMode.CHECK && mode != NoteDbMode.PRIMARY) {
+      return;
+    }
+    NoteDbChecker checker = testInjector.getInstance(NoteDbChecker.class);
+    OneOffRequestContext oneOffRequestContext =
+        testInjector.getInstance(OneOffRequestContext.class);
+    try (ManualRequestContext ctx = oneOffRequestContext.open()) {
+      if (mode == NoteDbMode.CHECK) {
+        checker.rebuildAndCheckAllChanges();
+      } else if (mode == NoteDbMode.PRIMARY) {
+        checker.assertNoReviewDbChanges(desc.testDescription());
+      }
+    }
+  }
+
+  @Override
+  public String toString() {
+    return MoreObjects.toStringHelper(this).addValue(desc).toString();
+  }
+}
diff --git a/java/com/google/gerrit/acceptance/GitUtil.java b/java/com/google/gerrit/acceptance/GitUtil.java
new file mode 100644
index 0000000..cdfdae7
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/GitUtil.java
@@ -0,0 +1,241 @@
+// Copyright (C) 2013 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.google.gerrit.acceptance;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.primitives.Ints;
+import com.google.gerrit.acceptance.testsuite.account.TestSshKeys;
+import com.google.gerrit.common.FooterConstants;
+import com.google.gerrit.reviewdb.client.Project;
+import com.jcraft.jsch.JSch;
+import com.jcraft.jsch.JSchException;
+import com.jcraft.jsch.KeyPair;
+import com.jcraft.jsch.Session;
+import java.io.IOException;
+import java.util.List;
+import java.util.Optional;
+import java.util.Properties;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.eclipse.jgit.api.FetchCommand;
+import org.eclipse.jgit.api.PushCommand;
+import org.eclipse.jgit.api.TagCommand;
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.transport.FetchResult;
+import org.eclipse.jgit.transport.JschConfigSessionFactory;
+import org.eclipse.jgit.transport.OpenSshConfig.Host;
+import org.eclipse.jgit.transport.PushResult;
+import org.eclipse.jgit.transport.RefSpec;
+import org.eclipse.jgit.transport.RemoteRefUpdate;
+import org.eclipse.jgit.transport.SshSessionFactory;
+import org.eclipse.jgit.util.FS;
+
+public class GitUtil {
+  private static final AtomicInteger testRepoCount = new AtomicInteger();
+  private static final int TEST_REPO_WINDOW_DAYS = 2;
+
+  public static void initSsh(KeyPair keyPair) {
+    final Properties config = new Properties();
+    config.put("StrictHostKeyChecking", "no");
+    JSch.setConfig(config);
+
+    // register a JschConfigSessionFactory that adds the private key as identity
+    // to the JSch instance of JGit so that SSH communication via JGit can
+    // succeed
+    SshSessionFactory.setInstance(
+        new JschConfigSessionFactory() {
+          @Override
+          protected void configure(Host hc, Session session) {
+            try {
+              final JSch jsch = getJSch(hc, FS.DETECTED);
+              jsch.addIdentity(
+                  "KeyPair", TestSshKeys.privateKey(keyPair), keyPair.getPublicKeyBlob(), null);
+            } catch (JSchException e) {
+              throw new RuntimeException(e);
+            }
+          }
+        });
+  }
+
+  /**
+   * Create a new {@link TestRepository} with a distinct commit clock.
+   *
+   * <p>It is very easy for tests to create commits with identical subjects and trees; if such
+   * commits also have identical authors/committers, then the computed Change-Id is identical as
+   * well. Tests may generally assume that Change-Ids are unique, so to ensure this, we provision
+   * TestRepository instances with non-overlapping commit clock times.
+   *
+   * <p>Space test repos 1 day apart, which allows for about 86k ticks per repo before overlapping,
+   * and about 8k instances per process before hitting JGit's year 2038 limit.
+   *
+   * @param repo repository to wrap.
+   * @return wrapped test repository with distinct commit time space.
+   */
+  public static <R extends Repository> TestRepository<R> newTestRepository(R repo)
+      throws IOException {
+    TestRepository<R> tr = new TestRepository<>(repo);
+    tr.tick(
+        Ints.checkedCast(
+            TimeUnit.SECONDS.convert(
+                testRepoCount.getAndIncrement() * TEST_REPO_WINDOW_DAYS, TimeUnit.DAYS)));
+    return tr;
+  }
+
+  public static TestRepository<InMemoryRepository> cloneProject(Project.NameKey project, String uri)
+      throws Exception {
+    DfsRepositoryDescription desc = new DfsRepositoryDescription("clone of " + project.get());
+
+    FS fs = FS.detect();
+
+    // Avoid leaking user state into our tests.
+    fs.setUserHome(null);
+
+    InMemoryRepository dest =
+        new InMemoryRepository.Builder()
+            .setRepositoryDescription(desc)
+            // SshTransport depends on a real FS to read ~/.ssh/config, but
+            // InMemoryRepository by default uses a null FS.
+            // TODO(dborowitz): Remove when we no longer depend on SSH.
+            .setFS(fs)
+            .build();
+    Config cfg = dest.getConfig();
+    cfg.setString("remote", "origin", "url", uri);
+    cfg.setString("remote", "origin", "fetch", "+refs/heads/*:refs/remotes/origin/*");
+    TestRepository<InMemoryRepository> testRepo = newTestRepository(dest);
+    FetchResult result = testRepo.git().fetch().setRemote("origin").call();
+    String originMaster = "refs/remotes/origin/master";
+    if (result.getTrackingRefUpdate(originMaster) != null) {
+      testRepo.reset(originMaster);
+    }
+    return testRepo;
+  }
+
+  public static TestRepository<InMemoryRepository> cloneProject(
+      Project.NameKey project, SshSession sshSession) throws Exception {
+    return cloneProject(project, sshSession.getUrl() + "/" + project.get());
+  }
+
+  public static Ref createAnnotatedTag(TestRepository<?> testRepo, String name, PersonIdent tagger)
+      throws GitAPIException {
+    TagCommand cmd =
+        testRepo.git().tag().setName(name).setAnnotated(true).setMessage(name).setTagger(tagger);
+    return cmd.call();
+  }
+
+  public static Ref updateAnnotatedTag(TestRepository<?> testRepo, String name, PersonIdent tagger)
+      throws GitAPIException {
+    TagCommand tc = testRepo.git().tag().setName(name);
+    return tc.setAnnotated(true).setMessage(name).setTagger(tagger).setForceUpdate(true).call();
+  }
+
+  public static void fetch(TestRepository<?> testRepo, String spec) throws GitAPIException {
+    FetchCommand fetch = testRepo.git().fetch();
+    fetch.setRefSpecs(new RefSpec(spec));
+    fetch.call();
+  }
+
+  public static PushResult pushHead(TestRepository<?> testRepo, String ref) throws GitAPIException {
+    return pushHead(testRepo, ref, false);
+  }
+
+  public static PushResult pushHead(TestRepository<?> testRepo, String ref, boolean pushTags)
+      throws GitAPIException {
+    return pushHead(testRepo, ref, pushTags, false);
+  }
+
+  public static PushResult pushHead(
+      TestRepository<?> testRepo, String ref, boolean pushTags, boolean force)
+      throws GitAPIException {
+    return pushOne(testRepo, "HEAD", ref, pushTags, force, null);
+  }
+
+  public static PushResult pushHead(
+      TestRepository<?> testRepo,
+      String ref,
+      boolean pushTags,
+      boolean force,
+      List<String> pushOptions)
+      throws GitAPIException {
+    return pushOne(testRepo, "HEAD", ref, pushTags, force, pushOptions);
+  }
+
+  public static PushResult deleteRef(TestRepository<?> testRepo, String ref)
+      throws GitAPIException {
+    return pushOne(testRepo, "", ref, false, true, null);
+  }
+
+  public static PushResult pushOne(
+      TestRepository<?> testRepo,
+      String source,
+      String target,
+      boolean pushTags,
+      boolean force,
+      List<String> pushOptions)
+      throws GitAPIException {
+    PushCommand pushCmd = testRepo.git().push();
+    pushCmd.setForce(force);
+    pushCmd.setPushOptions(pushOptions);
+    pushCmd.setRefSpecs(new RefSpec((source != null ? source : "") + ":" + target));
+    if (pushTags) {
+      pushCmd.setPushTags();
+    }
+    Iterable<PushResult> r = pushCmd.call();
+    return Iterables.getOnlyElement(r);
+  }
+
+  public static void assertPushOk(PushResult result, String ref) {
+    RemoteRefUpdate rru = result.getRemoteUpdate(ref);
+    assertThat(rru.getStatus()).named(rru.toString()).isEqualTo(RemoteRefUpdate.Status.OK);
+  }
+
+  public static void assertPushRejected(PushResult result, String ref, String expectedMessage) {
+    RemoteRefUpdate rru = result.getRemoteUpdate(ref);
+    assertThat(rru.getStatus())
+        .named(rru.toString())
+        .isEqualTo(RemoteRefUpdate.Status.REJECTED_OTHER_REASON);
+    assertThat(rru.getMessage()).isEqualTo(expectedMessage);
+  }
+
+  public static PushResult pushTag(TestRepository<?> testRepo, String tag) throws GitAPIException {
+    return pushTag(testRepo, tag, false);
+  }
+
+  public static PushResult pushTag(TestRepository<?> testRepo, String tag, boolean force)
+      throws GitAPIException {
+    PushCommand pushCmd = testRepo.git().push();
+    pushCmd.setForce(force);
+    pushCmd.setRefSpecs(new RefSpec("refs/tags/" + tag + ":refs/tags/" + tag));
+    Iterable<PushResult> r = pushCmd.call();
+    return Iterables.getOnlyElement(r);
+  }
+
+  public static Optional<String> getChangeId(TestRepository<?> tr, ObjectId id) throws IOException {
+    RevCommit c = tr.getRevWalk().parseCommit(id);
+    tr.getRevWalk().parseBody(c);
+    return Lists.reverse(c.getFooterLines(FooterConstants.CHANGE_ID)).stream().findFirst();
+  }
+}
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/GlobalPluginConfig.java b/java/com/google/gerrit/acceptance/GlobalPluginConfig.java
similarity index 100%
rename from gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/GlobalPluginConfig.java
rename to java/com/google/gerrit/acceptance/GlobalPluginConfig.java
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/GlobalPluginConfigs.java b/java/com/google/gerrit/acceptance/GlobalPluginConfigs.java
similarity index 100%
rename from gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/GlobalPluginConfigs.java
rename to java/com/google/gerrit/acceptance/GlobalPluginConfigs.java
diff --git a/java/com/google/gerrit/acceptance/HttpResponse.java b/java/com/google/gerrit/acceptance/HttpResponse.java
new file mode 100644
index 0000000..88079a4
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/HttpResponse.java
@@ -0,0 +1,84 @@
+// Copyright (C) 2014 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.google.gerrit.acceptance;
+
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ImmutableList;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import org.apache.http.Header;
+import org.eclipse.jgit.util.IO;
+import org.eclipse.jgit.util.RawParseUtils;
+
+public class HttpResponse {
+
+  protected org.apache.http.HttpResponse response;
+  protected Reader reader;
+
+  HttpResponse(org.apache.http.HttpResponse response) {
+    this.response = response;
+  }
+
+  public Reader getReader() throws IllegalStateException, IOException {
+    if (reader == null && response.getEntity() != null) {
+      reader = new InputStreamReader(response.getEntity().getContent(), UTF_8);
+    }
+    return reader;
+  }
+
+  public void consume() throws IllegalStateException, IOException {
+    Reader reader = getReader();
+    if (reader != null) {
+      while (reader.read() != -1) {}
+    }
+  }
+
+  public int getStatusCode() {
+    return response.getStatusLine().getStatusCode();
+  }
+
+  public String getContentType() {
+    return getHeader("X-FYI-Content-Type");
+  }
+
+  public String getHeader(String name) {
+    Header hdr = response.getFirstHeader(name);
+    return hdr != null ? hdr.getValue() : null;
+  }
+
+  public ImmutableList<String> getHeaders(String name) {
+    return Arrays.asList(response.getHeaders(name)).stream()
+        .map(Header::getValue)
+        .collect(toImmutableList());
+  }
+
+  public boolean hasContent() {
+    requireNonNull(response, "Response is not initialized.");
+    return response.getEntity() != null;
+  }
+
+  public String getEntityContent() throws IOException {
+    requireNonNull(response, "Response is not initialized.");
+    requireNonNull(response.getEntity(), "Response.Entity is not initialized.");
+    ByteBuffer buf = IO.readWholeStream(response.getEntity().getContent(), 1024);
+    return RawParseUtils.decode(buf.array(), buf.arrayOffset(), buf.limit()).trim();
+  }
+}
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/HttpSession.java b/java/com/google/gerrit/acceptance/HttpSession.java
similarity index 100%
rename from gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/HttpSession.java
rename to java/com/google/gerrit/acceptance/HttpSession.java
diff --git a/java/com/google/gerrit/acceptance/InMemoryTestingDatabaseModule.java b/java/com/google/gerrit/acceptance/InMemoryTestingDatabaseModule.java
new file mode 100644
index 0000000..6ee5c09
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/InMemoryTestingDatabaseModule.java
@@ -0,0 +1,140 @@
+// Copyright (C) 2013 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.google.gerrit.acceptance;
+
+import static com.google.inject.Scopes.SINGLETON;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.lifecycle.LifecycleModule;
+import com.google.gerrit.metrics.DisabledMetricMaker;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.SitePath;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.config.TrackingFooters;
+import com.google.gerrit.server.config.TrackingFootersProvider;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.notedb.ChangeBundleReader;
+import com.google.gerrit.server.notedb.GwtormChangeBundleReader;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gerrit.server.schema.DataSourceType;
+import com.google.gerrit.server.schema.NotesMigrationSchemaFactory;
+import com.google.gerrit.server.schema.ReviewDbFactory;
+import com.google.gerrit.server.schema.SchemaModule;
+import com.google.gerrit.server.schema.SchemaVersion;
+import com.google.gerrit.testing.InMemoryDatabase;
+import com.google.gerrit.testing.InMemoryH2Type;
+import com.google.gerrit.testing.InMemoryRepositoryManager;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.OrmRuntimeException;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.Inject;
+import com.google.inject.Key;
+import com.google.inject.ProvisionException;
+import com.google.inject.TypeLiteral;
+import com.google.inject.util.Providers;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import org.eclipse.jgit.lib.Config;
+
+class InMemoryTestingDatabaseModule extends LifecycleModule {
+  private final Config cfg;
+  private final Path sitePath;
+  @Nullable private final InMemoryRepositoryManager repoManager;
+  @Nullable private final InMemoryDatabase.Instance inMemoryDatabaseInstance;
+
+  InMemoryTestingDatabaseModule(
+      Config cfg,
+      Path sitePath,
+      @Nullable InMemoryRepositoryManager repoManager,
+      @Nullable InMemoryDatabase.Instance inMemoryDatabaseInstance) {
+    this.cfg = cfg;
+    this.sitePath = sitePath;
+    this.repoManager = repoManager;
+    this.inMemoryDatabaseInstance = inMemoryDatabaseInstance;
+    makeSiteDirs(sitePath);
+  }
+
+  @Override
+  protected void configure() {
+    bind(Config.class).annotatedWith(GerritServerConfig.class).toInstance(cfg);
+
+    // TODO(dborowitz): Use jimfs.
+    bind(Path.class).annotatedWith(SitePath.class).toInstance(sitePath);
+
+    if (repoManager != null) {
+      bind(GitRepositoryManager.class).toInstance(repoManager);
+    } else {
+      bind(GitRepositoryManager.class).to(InMemoryRepositoryManager.class);
+      bind(InMemoryRepositoryManager.class).in(SINGLETON);
+    }
+
+    bind(MetricMaker.class).to(DisabledMetricMaker.class);
+    bind(DataSourceType.class).to(InMemoryH2Type.class);
+
+    install(new NotesMigration.Module());
+    TypeLiteral<SchemaFactory<ReviewDb>> schemaFactory =
+        new TypeLiteral<SchemaFactory<ReviewDb>>() {};
+    bind(schemaFactory).to(NotesMigrationSchemaFactory.class);
+    bind(InMemoryDatabase.Instance.class).toProvider(Providers.of(inMemoryDatabaseInstance));
+    bind(Key.get(schemaFactory, ReviewDbFactory.class)).to(InMemoryDatabase.class);
+    bind(InMemoryDatabase.class).in(SINGLETON);
+    bind(ChangeBundleReader.class).to(GwtormChangeBundleReader.class);
+
+    listener().to(CreateDatabase.class);
+
+    bind(SitePaths.class);
+    bind(TrackingFooters.class).toProvider(TrackingFootersProvider.class).in(SINGLETON);
+
+    install(new SchemaModule());
+    bind(SchemaVersion.class).to(SchemaVersion.C);
+
+    install(new SshdModule());
+  }
+
+  static class CreateDatabase implements LifecycleListener {
+    private final InMemoryDatabase mem;
+
+    @Inject
+    CreateDatabase(InMemoryDatabase mem) {
+      this.mem = mem;
+    }
+
+    @Override
+    public void start() {
+      try {
+        mem.create();
+      } catch (OrmException e) {
+        throw new OrmRuntimeException(e);
+      }
+    }
+
+    @Override
+    public void stop() {
+      mem.getDbInstance().drop();
+    }
+  }
+
+  private static void makeSiteDirs(Path p) {
+    try {
+      Files.createDirectories(p.resolve("etc"));
+    } catch (IOException e) {
+      throw new ProvisionException(e.getMessage(), e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/acceptance/InProcessProtocol.java b/java/com/google/gerrit/acceptance/InProcessProtocol.java
new file mode 100644
index 0000000..de8d10c
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/InProcessProtocol.java
@@ -0,0 +1,358 @@
+// Copyright (C) 2015 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.google.gerrit.acceptance;
+
+import com.google.common.collect.Lists;
+import com.google.gerrit.acceptance.InProcessProtocol.Context;
+import com.google.gerrit.common.data.Capable;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.AccessPath;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.RemotePeer;
+import com.google.gerrit.server.RequestCleanup;
+import com.google.gerrit.server.config.GerritRequestModule;
+import com.google.gerrit.server.config.RequestScopedReviewDbProvider;
+import com.google.gerrit.server.git.DefaultAdvertiseRefsHook;
+import com.google.gerrit.server.git.ReceivePackInitializer;
+import com.google.gerrit.server.git.TransferConfig;
+import com.google.gerrit.server.git.UploadPackInitializer;
+import com.google.gerrit.server.git.receive.AsyncReceiveCommits;
+import com.google.gerrit.server.git.validators.UploadValidators;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackend.RefFilterOptions;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.util.RequestContext;
+import com.google.gerrit.server.util.RequestScopePropagator;
+import com.google.gerrit.server.util.ThreadLocalRequestContext;
+import com.google.gerrit.server.util.ThreadLocalRequestScopePropagator;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.AbstractModule;
+import com.google.inject.Inject;
+import com.google.inject.Key;
+import com.google.inject.Module;
+import com.google.inject.OutOfScopeException;
+import com.google.inject.Provider;
+import com.google.inject.Provides;
+import com.google.inject.Scope;
+import com.google.inject.servlet.RequestScoped;
+import com.google.inject.util.Providers;
+import java.io.IOException;
+import java.net.SocketAddress;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.transport.PostReceiveHook;
+import org.eclipse.jgit.transport.PostReceiveHookChain;
+import org.eclipse.jgit.transport.PreUploadHook;
+import org.eclipse.jgit.transport.PreUploadHookChain;
+import org.eclipse.jgit.transport.ReceivePack;
+import org.eclipse.jgit.transport.TestProtocol;
+import org.eclipse.jgit.transport.UploadPack;
+import org.eclipse.jgit.transport.resolver.ReceivePackFactory;
+import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException;
+import org.eclipse.jgit.transport.resolver.UploadPackFactory;
+
+class InProcessProtocol extends TestProtocol<Context> {
+  static Module module() {
+    return new AbstractModule() {
+      @Override
+      public void configure() {
+        install(new GerritRequestModule());
+        bind(RequestScopePropagator.class).to(Propagator.class);
+        bindScope(RequestScoped.class, InProcessProtocol.REQUEST);
+      }
+
+      @Provides
+      @RemotePeer
+      SocketAddress getSocketAddress() {
+        // TODO(dborowitz): Could potentially fake this with thread ID or
+        // something.
+        throw new OutOfScopeException("No remote peer in acceptance tests");
+      }
+    };
+  }
+
+  private static final Scope REQUEST =
+      new Scope() {
+        @Override
+        public <T> Provider<T> scope(Key<T> key, Provider<T> creator) {
+          return new Provider<T>() {
+            @Override
+            public T get() {
+              Context ctx = current.get();
+              if (ctx == null) {
+                throw new OutOfScopeException("Not in TestProtocol scope");
+              }
+              return ctx.get(key, creator);
+            }
+
+            @Override
+            public String toString() {
+              return String.format("%s[%s]", creator, REQUEST);
+            }
+          };
+        }
+
+        @Override
+        public String toString() {
+          return "InProcessProtocol.REQUEST";
+        }
+      };
+
+  private static class Propagator extends ThreadLocalRequestScopePropagator<Context> {
+    @Inject
+    Propagator(
+        ThreadLocalRequestContext local,
+        Provider<RequestScopedReviewDbProvider> dbProviderProvider) {
+      super(REQUEST, current, local, dbProviderProvider);
+    }
+
+    @Override
+    protected Context continuingContext(Context ctx) {
+      return ctx.newContinuingContext();
+    }
+  }
+
+  private static final ThreadLocal<Context> current = new ThreadLocal<>();
+
+  // TODO(dborowitz): Merge this with AcceptanceTestRequestScope.
+  /**
+   * Multi-purpose session/context object.
+   *
+   * <p>Confusingly, Gerrit has two ideas of what a "context" object is: one for Guice {@link
+   * RequestScoped}, and one for its own simplified version of request scoping using {@link
+   * ThreadLocalRequestContext}. This class provides both, in essence just delegating the {@code
+   * ThreadLocalRequestContext} scoping to the Guice scoping mechanism.
+   *
+   * <p>It is also used as the session type for {@code UploadPackFactory} and {@code
+   * ReceivePackFactory}, since, after all, it encapsulates all the information about a single
+   * request.
+   */
+  static class Context implements RequestContext {
+    private static final Key<RequestScopedReviewDbProvider> DB_KEY =
+        Key.get(RequestScopedReviewDbProvider.class);
+    private static final Key<RequestCleanup> RC_KEY = Key.get(RequestCleanup.class);
+    private static final Key<CurrentUser> USER_KEY = Key.get(CurrentUser.class);
+
+    private final SchemaFactory<ReviewDb> schemaFactory;
+    private final IdentifiedUser.GenericFactory userFactory;
+    private final Account.Id accountId;
+    private final Project.NameKey project;
+    private final RequestCleanup cleanup;
+    private final Map<Key<?>, Object> map;
+
+    Context(
+        SchemaFactory<ReviewDb> schemaFactory,
+        IdentifiedUser.GenericFactory userFactory,
+        Account.Id accountId,
+        Project.NameKey project) {
+      this.schemaFactory = schemaFactory;
+      this.userFactory = userFactory;
+      this.accountId = accountId;
+      this.project = project;
+      map = new HashMap<>();
+      cleanup = new RequestCleanup();
+      map.put(DB_KEY, new RequestScopedReviewDbProvider(schemaFactory, Providers.of(cleanup)));
+      map.put(RC_KEY, cleanup);
+
+      IdentifiedUser user = userFactory.create(accountId);
+      user.setAccessPath(AccessPath.GIT);
+      map.put(USER_KEY, user);
+    }
+
+    private Context newContinuingContext() {
+      return new Context(schemaFactory, userFactory, accountId, project);
+    }
+
+    @Override
+    public CurrentUser getUser() {
+      return get(USER_KEY, null);
+    }
+
+    @Override
+    public Provider<ReviewDb> getReviewDbProvider() {
+      return get(DB_KEY, null);
+    }
+
+    private synchronized <T> T get(Key<T> key, Provider<T> creator) {
+      @SuppressWarnings("unchecked")
+      T t = (T) map.get(key);
+      if (t == null) {
+        t = creator.get();
+        map.put(key, t);
+      }
+      return t;
+    }
+  }
+
+  private static class Upload implements UploadPackFactory<Context> {
+    private final TransferConfig transferConfig;
+    private final DynamicSet<UploadPackInitializer> uploadPackInitializers;
+    private final DynamicSet<PreUploadHook> preUploadHooks;
+    private final UploadValidators.Factory uploadValidatorsFactory;
+    private final ThreadLocalRequestContext threadContext;
+    private final ProjectCache projectCache;
+    private final PermissionBackend permissionBackend;
+
+    @Inject
+    Upload(
+        TransferConfig transferConfig,
+        DynamicSet<UploadPackInitializer> uploadPackInitializers,
+        DynamicSet<PreUploadHook> preUploadHooks,
+        UploadValidators.Factory uploadValidatorsFactory,
+        ThreadLocalRequestContext threadContext,
+        ProjectCache projectCache,
+        PermissionBackend permissionBackend) {
+      this.transferConfig = transferConfig;
+      this.uploadPackInitializers = uploadPackInitializers;
+      this.preUploadHooks = preUploadHooks;
+      this.uploadValidatorsFactory = uploadValidatorsFactory;
+      this.threadContext = threadContext;
+      this.projectCache = projectCache;
+      this.permissionBackend = permissionBackend;
+    }
+
+    @Override
+    public UploadPack create(Context req, Repository repo) throws ServiceNotAuthorizedException {
+      // Set the request context, but don't bother unsetting, since we don't
+      // have an easy way to run code when this instance is done being used.
+      // Each operation is run in its own thread, so we don't need to recover
+      // its original context anyway.
+      threadContext.setContext(req);
+      current.set(req);
+
+      PermissionBackend.ForProject perm = permissionBackend.currentUser().project(req.project);
+      try {
+        perm.check(ProjectPermission.RUN_UPLOAD_PACK);
+      } catch (AuthException e) {
+        throw new ServiceNotAuthorizedException();
+      } catch (PermissionBackendException e) {
+        throw new RuntimeException(e);
+      }
+
+      ProjectState projectState;
+      try {
+        projectState = projectCache.checkedGet(req.project);
+      } catch (IOException e) {
+        throw new RuntimeException(e);
+      }
+      if (projectState == null) {
+        throw new RuntimeException("can't load project state for " + req.project.get());
+      }
+      UploadPack up = new UploadPack(repo);
+      up.setPackConfig(transferConfig.getPackConfig());
+      up.setTimeout(transferConfig.getTimeout());
+      up.setAdvertiseRefsHook(new DefaultAdvertiseRefsHook(perm, RefFilterOptions.defaults()));
+      List<PreUploadHook> hooks = Lists.newArrayList(preUploadHooks);
+      hooks.add(uploadValidatorsFactory.create(projectState.getProject(), repo, "localhost-test"));
+      up.setPreUploadHook(PreUploadHookChain.newChain(hooks));
+      for (UploadPackInitializer initializer : uploadPackInitializers) {
+        initializer.init(req.project, up);
+      }
+      return up;
+    }
+  }
+
+  private static class Receive implements ReceivePackFactory<Context> {
+    private final Provider<CurrentUser> userProvider;
+    private final ProjectCache projectCache;
+    private final AsyncReceiveCommits.Factory factory;
+    private final TransferConfig config;
+    private final DynamicSet<ReceivePackInitializer> receivePackInitializers;
+    private final DynamicSet<PostReceiveHook> postReceiveHooks;
+    private final ThreadLocalRequestContext threadContext;
+    private final PermissionBackend permissionBackend;
+
+    @Inject
+    Receive(
+        Provider<CurrentUser> userProvider,
+        ProjectCache projectCache,
+        AsyncReceiveCommits.Factory factory,
+        TransferConfig config,
+        DynamicSet<ReceivePackInitializer> receivePackInitializers,
+        DynamicSet<PostReceiveHook> postReceiveHooks,
+        ThreadLocalRequestContext threadContext,
+        PermissionBackend permissionBackend) {
+      this.userProvider = userProvider;
+      this.projectCache = projectCache;
+      this.factory = factory;
+      this.config = config;
+      this.receivePackInitializers = receivePackInitializers;
+      this.postReceiveHooks = postReceiveHooks;
+      this.threadContext = threadContext;
+      this.permissionBackend = permissionBackend;
+    }
+
+    @Override
+    public ReceivePack create(Context req, Repository db) throws ServiceNotAuthorizedException {
+      // Set the request context, but don't bother unsetting, since we don't
+      // have an easy way to run code when this instance is done being used.
+      // Each operation is run in its own thread, so we don't need to recover
+      // its original context anyway.
+      threadContext.setContext(req);
+      current.set(req);
+      try {
+        permissionBackend
+            .currentUser()
+            .project(req.project)
+            .check(ProjectPermission.RUN_RECEIVE_PACK);
+      } catch (AuthException e) {
+        throw new ServiceNotAuthorizedException();
+      } catch (PermissionBackendException e) {
+        throw new RuntimeException(e);
+      }
+      try {
+        IdentifiedUser identifiedUser = userProvider.get().asIdentifiedUser();
+        ProjectState projectState = projectCache.checkedGet(req.project);
+        if (projectState == null) {
+          throw new RuntimeException(String.format("project %s not found", req.project));
+        }
+
+        AsyncReceiveCommits arc = factory.create(projectState, identifiedUser, db, null);
+        if (arc.canUpload() != Capable.OK) {
+          throw new ServiceNotAuthorizedException();
+        }
+
+        ReceivePack rp = arc.getReceivePack();
+        rp.setRefLogIdent(identifiedUser.newRefLogIdent());
+        rp.setTimeout(config.getTimeout());
+        rp.setMaxObjectSizeLimit(config.getMaxObjectSizeLimit());
+
+        for (ReceivePackInitializer initializer : receivePackInitializers) {
+          initializer.init(projectState.getNameKey(), rp);
+        }
+
+        rp.setPostReceiveHook(PostReceiveHookChain.newChain(Lists.newArrayList(postReceiveHooks)));
+        return rp;
+      } catch (IOException | PermissionBackendException e) {
+        throw new RuntimeException(e);
+      }
+    }
+  }
+
+  @Inject
+  InProcessProtocol(Upload uploadPackFactory, Receive receivePackFactory) {
+    super(uploadPackFactory, receivePackFactory);
+  }
+}
diff --git a/java/com/google/gerrit/acceptance/LightweightPluginDaemonTest.java b/java/com/google/gerrit/acceptance/LightweightPluginDaemonTest.java
new file mode 100644
index 0000000..7e50b83
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/LightweightPluginDaemonTest.java
@@ -0,0 +1,74 @@
+// 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.
+
+package com.google.gerrit.acceptance;
+
+import com.google.gerrit.server.PluginUser;
+import com.google.gerrit.server.plugins.PluginGuiceEnvironment;
+import com.google.gerrit.server.plugins.TestServerPlugin;
+import com.google.inject.Inject;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.rules.TemporaryFolder;
+
+public class LightweightPluginDaemonTest extends AbstractDaemonTest {
+  @Inject private PluginGuiceEnvironment env;
+
+  @Inject private PluginUser.Factory pluginUserFactory;
+
+  @Rule public TemporaryFolder tempDataDir = new TemporaryFolder();
+
+  protected TestServerPlugin plugin;
+
+  @Before
+  public void setUpTestPlugin() throws Exception {
+    TestPlugin testPlugin = getTestPlugin(getClass());
+    String name = testPlugin.name();
+    plugin =
+        new TestServerPlugin(
+            name,
+            canonicalWebUrl.get() + "plugins/" + name,
+            pluginUserFactory.create(name),
+            getClass().getClassLoader(),
+            testPlugin.sysModule(),
+            testPlugin.httpModule(),
+            testPlugin.sshModule(),
+            tempDataDir.getRoot().toPath());
+
+    plugin.start(env);
+    env.onStartPlugin(plugin);
+  }
+
+  @After
+  public void tearDownTestPlugin() {
+    if (plugin != null) {
+      // plugin will be null if the plugin test requires ssh, but the command
+      // line flag says we are running tests without ssh as the assume()
+      // statement in AbstractDaemonTest will prevent the execution of setUp()
+      // in this class
+      plugin.stop(env);
+      env.onStopPlugin(plugin);
+    }
+  }
+
+  private static TestPlugin getTestPlugin(Class<?> clazz) {
+    for (; clazz != null; clazz = clazz.getSuperclass()) {
+      if (clazz.getAnnotation(TestPlugin.class) != null) {
+        return clazz.getAnnotation(TestPlugin.class);
+      }
+    }
+    throw new IllegalStateException("TestPlugin annotation missing");
+  }
+}
diff --git a/java/com/google/gerrit/acceptance/LogThreshold.java b/java/com/google/gerrit/acceptance/LogThreshold.java
new file mode 100644
index 0000000..36831f3
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/LogThreshold.java
@@ -0,0 +1,29 @@
+// 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.google.gerrit.acceptance;
+
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+@Target({TYPE, METHOD})
+@Retention(RUNTIME)
+@Inherited
+public @interface LogThreshold {
+  String level() default "DEBUG";
+}
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/MergeableFileBasedConfig.java b/java/com/google/gerrit/acceptance/MergeableFileBasedConfig.java
similarity index 100%
rename from gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/MergeableFileBasedConfig.java
rename to java/com/google/gerrit/acceptance/MergeableFileBasedConfig.java
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/NoHttpd.java b/java/com/google/gerrit/acceptance/NoHttpd.java
similarity index 100%
rename from gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/NoHttpd.java
rename to java/com/google/gerrit/acceptance/NoHttpd.java
diff --git a/java/com/google/gerrit/acceptance/ProjectResetter.java b/java/com/google/gerrit/acceptance/ProjectResetter.java
new file mode 100644
index 0000000..cc263c6
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/ProjectResetter.java
@@ -0,0 +1,414 @@
+// Copyright (C) 2017 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.google.gerrit.acceptance;
+
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.gerrit.reviewdb.client.RefNames.REFS_USERS;
+import static java.util.stream.Collectors.toSet;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Multimap;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.collect.Sets;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.index.RefState;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.GroupCache;
+import com.google.gerrit.server.account.GroupIncludeCache;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.index.account.AccountIndexer;
+import com.google.gerrit.server.index.group.GroupIndexer;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.RefPatternMatcher;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Stream;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.Repository;
+
+/**
+ * Saves the states of given projects and resets the project states on close.
+ *
+ * <p>Saving the project states is done by saving the states of all refs in the project. On close
+ * those refs are reset to the saved states. Refs that were newly created are deleted.
+ *
+ * <p>By providing ref patterns per project it can be controlled which refs should be reset on
+ * close.
+ *
+ * <p>If resetting touches {@code refs/meta/config} branches the corresponding projects are evicted
+ * from the project cache.
+ *
+ * <p>If resetting touches user branches or the {@code refs/meta/external-ids} branch the
+ * corresponding accounts are evicted from the account cache and also if needed from the cache in
+ * {@link AccountCreator}.
+ *
+ * <p>At the moment this class has the following limitations:
+ *
+ * <ul>
+ *   <li>Resetting group branches doesn't evict the corresponding groups from the group cache.
+ *   <li>Changes are not reindexed if change meta refs are reset.
+ *   <li>Changes are not reindexed if starred-changes refs in All-Users are reset.
+ *   <li>If accounts are deleted changes may still refer to these accounts (e.g. as reviewers).
+ * </ul>
+ *
+ * Primarily this class is intended to reset the states of the All-Projects and All-Users projects
+ * after each test. These projects rarely contain changes and it's currently not a problem if these
+ * changes get stale. For creating changes each test gets a brand new project. Since this project is
+ * not used outside of the test method that creates it, it doesn't need to be reset.
+ */
+public class ProjectResetter implements AutoCloseable {
+  public static class Builder {
+    public interface Factory {
+      Builder builder();
+    }
+
+    private final GitRepositoryManager repoManager;
+    private final AllUsersName allUsersName;
+    @Nullable private final AccountCreator accountCreator;
+    @Nullable private final AccountCache accountCache;
+    @Nullable private final AccountIndexer accountIndexer;
+    @Nullable private final GroupCache groupCache;
+    @Nullable private final GroupIncludeCache groupIncludeCache;
+    @Nullable private final GroupIndexer groupIndexer;
+    @Nullable private final ProjectCache projectCache;
+
+    @Inject
+    public Builder(
+        GitRepositoryManager repoManager,
+        AllUsersName allUsersName,
+        @Nullable AccountCreator accountCreator,
+        @Nullable AccountCache accountCache,
+        @Nullable AccountIndexer accountIndexer,
+        @Nullable GroupCache groupCache,
+        @Nullable GroupIncludeCache groupIncludeCache,
+        @Nullable GroupIndexer groupIndexer,
+        @Nullable ProjectCache projectCache) {
+      this.repoManager = repoManager;
+      this.allUsersName = allUsersName;
+      this.accountCreator = accountCreator;
+      this.accountCache = accountCache;
+      this.accountIndexer = accountIndexer;
+      this.groupCache = groupCache;
+      this.groupIncludeCache = groupIncludeCache;
+      this.groupIndexer = groupIndexer;
+      this.projectCache = projectCache;
+    }
+
+    public ProjectResetter build(ProjectResetter.Config input) throws IOException {
+      return new ProjectResetter(
+          repoManager,
+          allUsersName,
+          accountCreator,
+          accountCache,
+          accountIndexer,
+          groupCache,
+          groupIncludeCache,
+          groupIndexer,
+          projectCache,
+          input.refsByProject);
+    }
+  }
+
+  public static class Config {
+    private final Multimap<Project.NameKey, String> refsByProject;
+
+    public Config() {
+      this.refsByProject = MultimapBuilder.hashKeys().arrayListValues().build();
+    }
+
+    public Config reset(Project.NameKey project, String... refPatterns) {
+      List<String> refPatternList = Arrays.asList(refPatterns);
+      if (refPatternList.isEmpty()) {
+        refPatternList = ImmutableList.of(RefNames.REFS + "*");
+      }
+      refsByProject.putAll(project, refPatternList);
+      return this;
+    }
+  }
+
+  @Inject private GitRepositoryManager repoManager;
+  @Inject private AllUsersName allUsersName;
+  @Inject @Nullable private AccountCreator accountCreator;
+  @Inject @Nullable private AccountCache accountCache;
+  @Inject @Nullable private GroupCache groupCache;
+  @Inject @Nullable private GroupIncludeCache groupIncludeCache;
+  @Inject @Nullable private GroupIndexer groupIndexer;
+  @Inject @Nullable private AccountIndexer accountIndexer;
+  @Inject @Nullable private ProjectCache projectCache;
+
+  private final Multimap<Project.NameKey, String> refsPatternByProject;
+
+  // State to which to reset to.
+  private final Multimap<Project.NameKey, RefState> savedRefStatesByProject;
+
+  // Results of the resetting
+  private Multimap<Project.NameKey, String> keptRefsByProject;
+  private Multimap<Project.NameKey, String> restoredRefsByProject;
+  private Multimap<Project.NameKey, String> deletedRefsByProject;
+
+  private ProjectResetter(
+      GitRepositoryManager repoManager,
+      AllUsersName allUsersName,
+      @Nullable AccountCreator accountCreator,
+      @Nullable AccountCache accountCache,
+      @Nullable AccountIndexer accountIndexer,
+      @Nullable GroupCache groupCache,
+      @Nullable GroupIncludeCache groupIncludeCache,
+      @Nullable GroupIndexer groupIndexer,
+      @Nullable ProjectCache projectCache,
+      Multimap<Project.NameKey, String> refPatternByProject)
+      throws IOException {
+    this.repoManager = repoManager;
+    this.allUsersName = allUsersName;
+    this.accountCreator = accountCreator;
+    this.accountCache = accountCache;
+    this.accountIndexer = accountIndexer;
+    this.groupCache = groupCache;
+    this.groupIndexer = groupIndexer;
+    this.groupIncludeCache = groupIncludeCache;
+    this.projectCache = projectCache;
+    this.refsPatternByProject = refPatternByProject;
+    this.savedRefStatesByProject = readRefStates();
+  }
+
+  @Override
+  public void close() throws Exception {
+    keptRefsByProject = MultimapBuilder.hashKeys().arrayListValues().build();
+    restoredRefsByProject = MultimapBuilder.hashKeys().arrayListValues().build();
+    deletedRefsByProject = MultimapBuilder.hashKeys().arrayListValues().build();
+
+    restoreRefs();
+    deleteNewlyCreatedRefs();
+    evictCachesAndReindex();
+  }
+
+  /** Read the states of all matching refs. */
+  private Multimap<Project.NameKey, RefState> readRefStates() throws IOException {
+    Multimap<Project.NameKey, RefState> refStatesByProject =
+        MultimapBuilder.hashKeys().arrayListValues().build();
+    for (Map.Entry<Project.NameKey, Collection<String>> e :
+        refsPatternByProject.asMap().entrySet()) {
+      try (Repository repo = repoManager.openRepository(e.getKey())) {
+        Collection<Ref> refs = repo.getRefDatabase().getRefs();
+        for (String refPattern : e.getValue()) {
+          RefPatternMatcher matcher = RefPatternMatcher.getMatcher(refPattern);
+          for (Ref ref : refs) {
+            if (matcher.match(ref.getName(), null)) {
+              refStatesByProject.put(e.getKey(), RefState.create(ref.getName(), ref.getObjectId()));
+            }
+          }
+        }
+      }
+    }
+    return refStatesByProject;
+  }
+
+  private void restoreRefs() throws IOException {
+    for (Map.Entry<Project.NameKey, Collection<RefState>> e :
+        savedRefStatesByProject.asMap().entrySet()) {
+      try (Repository repo = repoManager.openRepository(e.getKey())) {
+        for (RefState refState : e.getValue()) {
+          if (refState.match(repo)) {
+            keptRefsByProject.put(e.getKey(), refState.ref());
+            continue;
+          }
+          Ref ref = repo.exactRef(refState.ref());
+          RefUpdate updateRef = repo.updateRef(refState.ref());
+          updateRef.setExpectedOldObjectId(ref != null ? ref.getObjectId() : ObjectId.zeroId());
+          updateRef.setNewObjectId(refState.id());
+          updateRef.setForceUpdate(true);
+          RefUpdate.Result result = updateRef.update();
+          checkState(
+              result == RefUpdate.Result.FORCED || result == RefUpdate.Result.NEW,
+              "resetting branch %s in %s failed",
+              refState.ref(),
+              e.getKey());
+          restoredRefsByProject.put(e.getKey(), refState.ref());
+        }
+      }
+    }
+  }
+
+  private void deleteNewlyCreatedRefs() throws IOException {
+    for (Map.Entry<Project.NameKey, Collection<String>> e :
+        refsPatternByProject.asMap().entrySet()) {
+      try (Repository repo = repoManager.openRepository(e.getKey())) {
+        Collection<Ref> nonRestoredRefs =
+            repo.getRefDatabase().getRefs().stream()
+                .filter(
+                    r ->
+                        !keptRefsByProject.containsEntry(e.getKey(), r.getName())
+                            && !restoredRefsByProject.containsEntry(e.getKey(), r.getName()))
+                .collect(toSet());
+        for (String refPattern : e.getValue()) {
+          RefPatternMatcher matcher = RefPatternMatcher.getMatcher(refPattern);
+          for (Ref ref : nonRestoredRefs) {
+            if (matcher.match(ref.getName(), null)
+                && !deletedRefsByProject.containsEntry(e.getKey(), ref.getName())) {
+              RefUpdate updateRef = repo.updateRef(ref.getName());
+              updateRef.setExpectedOldObjectId(ref.getObjectId());
+              updateRef.setNewObjectId(ObjectId.zeroId());
+              updateRef.setForceUpdate(true);
+              RefUpdate.Result result = updateRef.delete();
+              checkState(
+                  result == RefUpdate.Result.FORCED,
+                  "deleting branch %s in %s failed",
+                  ref.getName(),
+                  e.getKey());
+              deletedRefsByProject.put(e.getKey(), ref.getName());
+            }
+          }
+        }
+      }
+    }
+  }
+
+  private void evictCachesAndReindex() throws IOException {
+    evictAndReindexProjects();
+    evictAndReindexAccounts();
+    evictAndReindexGroups();
+
+    // TODO(ekempin): Reindex changes if starred-changes refs in All-Users were modified.
+  }
+
+  /** Evict projects for which the config was changed. */
+  private void evictAndReindexProjects() throws IOException {
+    if (projectCache == null) {
+      return;
+    }
+
+    for (Project.NameKey project :
+        Sets.union(
+            projectsWithConfigChanges(restoredRefsByProject),
+            projectsWithConfigChanges(deletedRefsByProject))) {
+      projectCache.evict(project);
+    }
+  }
+
+  private Set<Project.NameKey> projectsWithConfigChanges(
+      Multimap<Project.NameKey, String> projects) {
+    return projects.entries().stream()
+        .filter(e -> e.getValue().equals(RefNames.REFS_CONFIG))
+        .map(Map.Entry::getKey)
+        .collect(toSet());
+  }
+
+  /** Evict accounts that were modified. */
+  private void evictAndReindexAccounts() throws IOException {
+    Set<Account.Id> deletedAccounts = accountIds(deletedRefsByProject.get(allUsersName).stream());
+    if (accountCreator != null) {
+      accountCreator.evict(deletedAccounts);
+    }
+    if (accountCache != null || accountIndexer != null) {
+      Set<Account.Id> modifiedAccounts =
+          new HashSet<>(accountIds(restoredRefsByProject.get(allUsersName).stream()));
+
+      if (restoredRefsByProject.get(allUsersName).contains(RefNames.REFS_EXTERNAL_IDS)
+          || deletedRefsByProject.get(allUsersName).contains(RefNames.REFS_EXTERNAL_IDS)) {
+        // The external IDs have been modified but we don't know which accounts were affected.
+        // Make sure all accounts are evicted and reindexed.
+        try (Repository repo = repoManager.openRepository(allUsersName)) {
+          for (Account.Id id : accountIds(repo)) {
+            evictAndReindexAccount(id);
+          }
+        }
+
+        // Remove deleted accounts from the cache and index.
+        for (Account.Id id : deletedAccounts) {
+          evictAndReindexAccount(id);
+        }
+      } else {
+        // Evict and reindex all modified and deleted accounts.
+        for (Account.Id id : Sets.union(modifiedAccounts, deletedAccounts)) {
+          evictAndReindexAccount(id);
+        }
+      }
+    }
+  }
+
+  /** Evict groups that were modified. */
+  private void evictAndReindexGroups() throws IOException {
+    if (groupCache != null || groupIndexer != null) {
+      Set<AccountGroup.UUID> modifiedGroups =
+          new HashSet<>(groupUUIDs(restoredRefsByProject.get(allUsersName)));
+      Set<AccountGroup.UUID> deletedGroups =
+          new HashSet<>(groupUUIDs(deletedRefsByProject.get(allUsersName)));
+
+      // Evict and reindex all modified and deleted groups.
+      for (AccountGroup.UUID uuid : Sets.union(modifiedGroups, deletedGroups)) {
+        evictAndReindexGroup(uuid);
+      }
+    }
+  }
+
+  private void evictAndReindexAccount(Account.Id accountId) throws IOException {
+    if (accountCache != null) {
+      accountCache.evict(accountId);
+    }
+    if (groupIncludeCache != null) {
+      groupIncludeCache.evictGroupsWithMember(accountId);
+    }
+    if (accountIndexer != null) {
+      accountIndexer.index(accountId);
+    }
+  }
+
+  private void evictAndReindexGroup(AccountGroup.UUID uuid) throws IOException {
+    if (groupCache != null) {
+      groupCache.evict(uuid);
+    }
+
+    if (groupIncludeCache != null) {
+      groupIncludeCache.evictParentGroupsOf(uuid);
+    }
+
+    if (groupIndexer != null) {
+      groupIndexer.index(uuid);
+    }
+  }
+
+  private static Set<Account.Id> accountIds(Repository repo) throws IOException {
+    return accountIds(repo.getRefDatabase().getRefsByPrefix(REFS_USERS).stream().map(Ref::getName));
+  }
+
+  private static Set<Account.Id> accountIds(Stream<String> refs) {
+    return refs.filter(r -> r.startsWith(REFS_USERS))
+        .map(Account.Id::fromRef)
+        .filter(Objects::nonNull)
+        .collect(toSet());
+  }
+
+  private Set<AccountGroup.UUID> groupUUIDs(Collection<String> refs) {
+    return refs.stream()
+        .filter(RefNames::isRefsGroups)
+        .map(AccountGroup.UUID::fromRef)
+        .filter(Objects::nonNull)
+        .collect(toSet());
+  }
+}
diff --git a/java/com/google/gerrit/acceptance/PushOneCommit.java b/java/com/google/gerrit/acceptance/PushOneCommit.java
new file mode 100644
index 0000000..5e45df2
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/PushOneCommit.java
@@ -0,0 +1,513 @@
+// Copyright (C) 2013 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.google.gerrit.acceptance;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.acceptance.GitUtil.pushHead;
+import static java.util.stream.Collectors.toList;
+import static org.junit.Assert.assertEquals;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Sets;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gerrit.server.notedb.ReviewerStateInternal;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.Assisted;
+import com.google.inject.assistedinject.AssistedInject;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Stream;
+import org.eclipse.jgit.api.TagCommand;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.transport.PushResult;
+import org.eclipse.jgit.transport.RemoteRefUpdate;
+import org.eclipse.jgit.transport.RemoteRefUpdate.Status;
+
+public class PushOneCommit {
+  public static final String SUBJECT = "test commit";
+  public static final String FILE_NAME = "a.txt";
+  public static final String FILE_CONTENT = "some content";
+  public static final String PATCH_FILE_ONLY =
+      "diff --git a/a.txt b/a.txt\n"
+          + "new file mode 100644\n"
+          + "index 0000000..f0eec86\n"
+          + "--- /dev/null\n"
+          + "+++ b/a.txt\n"
+          + "@@ -0,0 +1 @@\n"
+          + "+some content\n"
+          + "\\ No newline at end of file\n";
+  public static final String PATCH =
+      "From %s Mon Sep 17 00:00:00 2001\n"
+          + "From: Administrator <admin@example.com>\n"
+          + "Date: %s\n"
+          + "Subject: [PATCH] test commit\n"
+          + "\n"
+          + "Change-Id: %s\n"
+          + "---\n"
+          + "\n"
+          + PATCH_FILE_ONLY;
+
+  public interface Factory {
+    PushOneCommit create(ReviewDb db, PersonIdent i, TestRepository<?> testRepo);
+
+    PushOneCommit create(
+        ReviewDb db,
+        PersonIdent i,
+        TestRepository<?> testRepo,
+        @Assisted("changeId") String changeId);
+
+    PushOneCommit create(
+        ReviewDb db,
+        PersonIdent i,
+        TestRepository<?> testRepo,
+        @Assisted("subject") String subject,
+        @Assisted("fileName") String fileName,
+        @Assisted("content") String content);
+
+    PushOneCommit create(
+        ReviewDb db,
+        PersonIdent i,
+        TestRepository<?> testRepo,
+        @Assisted String subject,
+        @Assisted Map<String, String> files);
+
+    PushOneCommit create(
+        ReviewDb db,
+        PersonIdent i,
+        TestRepository<?> testRepo,
+        @Assisted("subject") String subject,
+        @Assisted("fileName") String fileName,
+        @Assisted("content") String content,
+        @Assisted("changeId") String changeId);
+  }
+
+  public static class Tag {
+    public String name;
+
+    public Tag(String name) {
+      this.name = name;
+    }
+  }
+
+  public static class AnnotatedTag extends Tag {
+    public String message;
+    public PersonIdent tagger;
+
+    public AnnotatedTag(String name, String message, PersonIdent tagger) {
+      super(name);
+      this.message = message;
+      this.tagger = tagger;
+    }
+  }
+
+  private static final AtomicInteger CHANGE_ID_COUNTER = new AtomicInteger();
+
+  private static String nextChangeId() {
+    // Tests use a variety of mechanisms for setting temporary timestamps, so we can't guarantee
+    // that the PersonIdent (or any other field used by the Change-Id generator) for any two test
+    // methods in the same acceptance test class are going to be different. But tests generally
+    // assume that Change-Ids are unique unless otherwise specified. So, don't even bother trying to
+    // reuse JGit's Change-Id generator, just do the simplest possible thing and convert a counter
+    // to hex.
+    return String.format("%040x", CHANGE_ID_COUNTER.incrementAndGet());
+  }
+
+  private final ChangeNotes.Factory notesFactory;
+  private final ApprovalsUtil approvalsUtil;
+  private final Provider<InternalChangeQuery> queryProvider;
+  private final NotesMigration notesMigration;
+  private final ReviewDb db;
+  private final TestRepository<?> testRepo;
+
+  private final String subject;
+  private final Map<String, String> files;
+  private String changeId;
+  private Tag tag;
+  private boolean force;
+  private List<String> pushOptions;
+
+  private final TestRepository<?>.CommitBuilder commitBuilder;
+
+  @AssistedInject
+  PushOneCommit(
+      ChangeNotes.Factory notesFactory,
+      ApprovalsUtil approvalsUtil,
+      Provider<InternalChangeQuery> queryProvider,
+      NotesMigration notesMigration,
+      @Assisted ReviewDb db,
+      @Assisted PersonIdent i,
+      @Assisted TestRepository<?> testRepo)
+      throws Exception {
+    this(
+        notesFactory,
+        approvalsUtil,
+        queryProvider,
+        notesMigration,
+        db,
+        i,
+        testRepo,
+        SUBJECT,
+        FILE_NAME,
+        FILE_CONTENT);
+  }
+
+  @AssistedInject
+  PushOneCommit(
+      ChangeNotes.Factory notesFactory,
+      ApprovalsUtil approvalsUtil,
+      Provider<InternalChangeQuery> queryProvider,
+      NotesMigration notesMigration,
+      @Assisted ReviewDb db,
+      @Assisted PersonIdent i,
+      @Assisted TestRepository<?> testRepo,
+      @Assisted("changeId") String changeId)
+      throws Exception {
+    this(
+        notesFactory,
+        approvalsUtil,
+        queryProvider,
+        notesMigration,
+        db,
+        i,
+        testRepo,
+        SUBJECT,
+        FILE_NAME,
+        FILE_CONTENT,
+        changeId);
+  }
+
+  @AssistedInject
+  PushOneCommit(
+      ChangeNotes.Factory notesFactory,
+      ApprovalsUtil approvalsUtil,
+      Provider<InternalChangeQuery> queryProvider,
+      NotesMigration notesMigration,
+      @Assisted ReviewDb db,
+      @Assisted PersonIdent i,
+      @Assisted TestRepository<?> testRepo,
+      @Assisted("subject") String subject,
+      @Assisted("fileName") String fileName,
+      @Assisted("content") String content)
+      throws Exception {
+    this(
+        notesFactory,
+        approvalsUtil,
+        queryProvider,
+        notesMigration,
+        db,
+        i,
+        testRepo,
+        subject,
+        fileName,
+        content,
+        null);
+  }
+
+  @AssistedInject
+  PushOneCommit(
+      ChangeNotes.Factory notesFactory,
+      ApprovalsUtil approvalsUtil,
+      Provider<InternalChangeQuery> queryProvider,
+      NotesMigration notesMigration,
+      @Assisted ReviewDb db,
+      @Assisted PersonIdent i,
+      @Assisted TestRepository<?> testRepo,
+      @Assisted String subject,
+      @Assisted Map<String, String> files)
+      throws Exception {
+    this(
+        notesFactory,
+        approvalsUtil,
+        queryProvider,
+        notesMigration,
+        db,
+        i,
+        testRepo,
+        subject,
+        files,
+        null);
+  }
+
+  @AssistedInject
+  PushOneCommit(
+      ChangeNotes.Factory notesFactory,
+      ApprovalsUtil approvalsUtil,
+      Provider<InternalChangeQuery> queryProvider,
+      NotesMigration notesMigration,
+      @Assisted ReviewDb db,
+      @Assisted PersonIdent i,
+      @Assisted TestRepository<?> testRepo,
+      @Assisted("subject") String subject,
+      @Assisted("fileName") String fileName,
+      @Assisted("content") String content,
+      @Nullable @Assisted("changeId") String changeId)
+      throws Exception {
+    this(
+        notesFactory,
+        approvalsUtil,
+        queryProvider,
+        notesMigration,
+        db,
+        i,
+        testRepo,
+        subject,
+        ImmutableMap.of(fileName, content),
+        changeId);
+  }
+
+  private PushOneCommit(
+      ChangeNotes.Factory notesFactory,
+      ApprovalsUtil approvalsUtil,
+      Provider<InternalChangeQuery> queryProvider,
+      NotesMigration notesMigration,
+      ReviewDb db,
+      PersonIdent i,
+      TestRepository<?> testRepo,
+      String subject,
+      Map<String, String> files,
+      String changeId)
+      throws Exception {
+    this.db = db;
+    this.testRepo = testRepo;
+    this.notesFactory = notesFactory;
+    this.approvalsUtil = approvalsUtil;
+    this.queryProvider = queryProvider;
+    this.notesMigration = notesMigration;
+    this.subject = subject;
+    this.files = files;
+    this.changeId = changeId;
+    if (changeId != null) {
+      commitBuilder = testRepo.amendRef("HEAD").insertChangeId(changeId.substring(1));
+    } else {
+      commitBuilder = testRepo.branch("HEAD").commit().insertChangeId(nextChangeId());
+    }
+    commitBuilder.message(subject).author(i).committer(new PersonIdent(i, testRepo.getDate()));
+  }
+
+  public PushOneCommit setParents(List<RevCommit> parents) throws Exception {
+    commitBuilder.noParents();
+    for (RevCommit p : parents) {
+      commitBuilder.parent(p);
+    }
+    return this;
+  }
+
+  public PushOneCommit setParent(RevCommit parent) throws Exception {
+    commitBuilder.noParents();
+    commitBuilder.parent(parent);
+    return this;
+  }
+
+  public Result to(String ref) throws Exception {
+    for (Map.Entry<String, String> e : files.entrySet()) {
+      commitBuilder.add(e.getKey(), e.getValue());
+    }
+    return execute(ref);
+  }
+
+  public Result rm(String ref) throws Exception {
+    for (String fileName : files.keySet()) {
+      commitBuilder.rm(fileName);
+    }
+    return execute(ref);
+  }
+
+  public Result execute(String ref) throws Exception {
+    RevCommit c = commitBuilder.create();
+    if (changeId == null) {
+      changeId = GitUtil.getChangeId(testRepo, c).get();
+    }
+    if (tag != null) {
+      TagCommand tagCommand = testRepo.git().tag().setName(tag.name);
+      if (tag instanceof AnnotatedTag) {
+        AnnotatedTag annotatedTag = (AnnotatedTag) tag;
+        tagCommand
+            .setAnnotated(true)
+            .setMessage(annotatedTag.message)
+            .setTagger(annotatedTag.tagger);
+      } else {
+        tagCommand.setAnnotated(false);
+      }
+      tagCommand.call();
+    }
+    return new Result(ref, pushHead(testRepo, ref, tag != null, force, pushOptions), c, subject);
+  }
+
+  public void setTag(Tag tag) {
+    this.tag = tag;
+  }
+
+  public void setForce(boolean force) {
+    this.force = force;
+  }
+
+  public List<String> getPushOptions() {
+    return pushOptions;
+  }
+
+  public void setPushOptions(List<String> pushOptions) {
+    this.pushOptions = pushOptions;
+  }
+
+  public void noParents() {
+    commitBuilder.noParents();
+  }
+
+  public class Result {
+    private final String ref;
+    private final PushResult result;
+    private final RevCommit commit;
+    private final String resSubj;
+
+    private Result(String ref, PushResult resSubj, RevCommit commit, String subject) {
+      this.ref = ref;
+      this.result = resSubj;
+      this.commit = commit;
+      this.resSubj = subject;
+    }
+
+    public ChangeData getChange() throws OrmException {
+      return Iterables.getOnlyElement(queryProvider.get().byKeyPrefix(changeId));
+    }
+
+    public PatchSet getPatchSet() throws OrmException {
+      return getChange().currentPatchSet();
+    }
+
+    public PatchSet.Id getPatchSetId() throws OrmException {
+      return getChange().change().currentPatchSetId();
+    }
+
+    public String getChangeId() {
+      return changeId;
+    }
+
+    public RevCommit getCommit() {
+      return commit;
+    }
+
+    public void assertPushOptions(List<String> pushOptions) {
+      assertEquals(pushOptions, getPushOptions());
+    }
+
+    public void assertChange(
+        Change.Status expectedStatus, String expectedTopic, TestAccount... expectedReviewers)
+        throws OrmException {
+      assertChange(
+          expectedStatus, expectedTopic, Arrays.asList(expectedReviewers), ImmutableList.of());
+    }
+
+    public void assertChange(
+        Change.Status expectedStatus,
+        String expectedTopic,
+        List<TestAccount> expectedReviewers,
+        List<TestAccount> expectedCcs)
+        throws OrmException {
+      Change c = getChange().change();
+      assertThat(c.getSubject()).isEqualTo(resSubj);
+      assertThat(c.getStatus()).isEqualTo(expectedStatus);
+      assertThat(Strings.emptyToNull(c.getTopic())).isEqualTo(expectedTopic);
+      if (notesMigration.readChanges()) {
+        assertReviewers(c, ReviewerStateInternal.REVIEWER, expectedReviewers);
+        assertReviewers(c, ReviewerStateInternal.CC, expectedCcs);
+      } else {
+        assertReviewers(
+            c,
+            ReviewerStateInternal.REVIEWER,
+            Stream.concat(expectedReviewers.stream(), expectedCcs.stream()).collect(toList()));
+      }
+    }
+
+    private void assertReviewers(
+        Change c, ReviewerStateInternal state, List<TestAccount> expectedReviewers)
+        throws OrmException {
+      Iterable<Account.Id> actualIds =
+          approvalsUtil.getReviewers(db, notesFactory.createChecked(db, c)).byState(state);
+      assertThat(actualIds)
+          .containsExactlyElementsIn(Sets.newHashSet(TestAccount.ids(expectedReviewers)));
+    }
+
+    public void assertOkStatus() {
+      assertStatus(Status.OK, null);
+    }
+
+    public void assertErrorStatus(String expectedMessage) {
+      assertStatus(Status.REJECTED_OTHER_REASON, expectedMessage);
+    }
+
+    public void assertErrorStatus() {
+      RemoteRefUpdate refUpdate = result.getRemoteUpdate(ref);
+      assertThat(refUpdate).isNotNull();
+      assertThat(refUpdate.getStatus())
+          .named(message(refUpdate))
+          .isEqualTo(Status.REJECTED_OTHER_REASON);
+    }
+
+    private void assertStatus(Status expectedStatus, String expectedMessage) {
+      RemoteRefUpdate refUpdate = result.getRemoteUpdate(ref);
+      assertThat(refUpdate).isNotNull();
+      assertThat(refUpdate.getStatus()).named(message(refUpdate)).isEqualTo(expectedStatus);
+      if (expectedMessage == null) {
+        assertThat(refUpdate.getMessage()).isNull();
+      } else {
+        assertThat(refUpdate.getMessage()).contains(expectedMessage);
+      }
+    }
+
+    public void assertMessage(String expectedMessage) {
+      RemoteRefUpdate refUpdate = result.getRemoteUpdate(ref);
+      assertThat(refUpdate).isNotNull();
+      assertThat(message(refUpdate).toLowerCase()).contains(expectedMessage.toLowerCase());
+    }
+
+    public void assertNotMessage(String message) {
+      RemoteRefUpdate refUpdate = result.getRemoteUpdate(ref);
+      assertThat(message(refUpdate).toLowerCase()).doesNotContain(message.toLowerCase());
+    }
+
+    public String getMessage() {
+      RemoteRefUpdate refUpdate = result.getRemoteUpdate(ref);
+      assertThat(refUpdate).isNotNull();
+      return message(refUpdate);
+    }
+
+    private String message(RemoteRefUpdate refUpdate) {
+      StringBuilder b = new StringBuilder();
+      if (refUpdate.getMessage() != null) {
+        b.append(refUpdate.getMessage());
+        b.append("\n");
+      }
+      b.append(result.getMessages());
+      return b.toString();
+    }
+  }
+}
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/ReadOnlyChangeIndex.java b/java/com/google/gerrit/acceptance/ReadOnlyChangeIndex.java
similarity index 100%
rename from gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/ReadOnlyChangeIndex.java
rename to java/com/google/gerrit/acceptance/ReadOnlyChangeIndex.java
diff --git a/java/com/google/gerrit/acceptance/ReindexGroupsAtStartup.java b/java/com/google/gerrit/acceptance/ReindexGroupsAtStartup.java
new file mode 100644
index 0000000..84e798c
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/ReindexGroupsAtStartup.java
@@ -0,0 +1,79 @@
+// 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.google.gerrit.acceptance;
+
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.lifecycle.LifecycleModule;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.group.db.Groups;
+import com.google.gerrit.server.index.group.GroupIndexer;
+import com.google.inject.Inject;
+import com.google.inject.Scopes;
+import java.io.IOException;
+import java.util.stream.Stream;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Config;
+
+/** Reindex all groups at Gerrit daemon startup. */
+public class ReindexGroupsAtStartup implements LifecycleListener {
+  private final GroupIndexer groupIndexer;
+  private final Groups groups;
+  private final Config cfg;
+
+  public static class Module extends LifecycleModule {
+    @Override
+    protected void configure() {
+      listener().to(ReindexGroupsAtStartup.class).in(Scopes.SINGLETON);
+    }
+  }
+
+  @Inject
+  public ReindexGroupsAtStartup(
+      GroupIndexer groupIndexer, Groups groups, @GerritServerConfig Config cfg) {
+    this.groupIndexer = groupIndexer;
+    this.groups = groups;
+    this.cfg = cfg;
+  }
+
+  @Override
+  public void start() {
+    // Gerrit slaves without a reindex
+    if (cfg.getBoolean("container", "slave", false)
+        && !cfg.getBoolean("index", "scheduledIndexer", "runOnStartup", true)) {
+      return;
+    }
+
+    Stream<GroupReference> allGroupReferences;
+    try {
+      allGroupReferences = groups.getAllGroupReferences();
+    } catch (ConfigInvalidException | IOException e) {
+      throw new IllegalStateException("Unable to reindex groups, tests may fail", e);
+    }
+
+    allGroupReferences.forEach(
+        group -> {
+          try {
+            groupIndexer.index(group.getUUID());
+          } catch (IOException e) {
+            throw new IllegalStateException(
+                String.format("Unable to index %s, tests may fail", group), e);
+          }
+        });
+  }
+
+  @Override
+  public void stop() {}
+}
diff --git a/java/com/google/gerrit/acceptance/ReindexProjectsAtStartup.java b/java/com/google/gerrit/acceptance/ReindexProjectsAtStartup.java
new file mode 100644
index 0000000..f585f81
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/ReindexProjectsAtStartup.java
@@ -0,0 +1,59 @@
+// 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.google.gerrit.acceptance;
+
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.index.project.ProjectIndexer;
+import com.google.gerrit.lifecycle.LifecycleModule;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.inject.Inject;
+import com.google.inject.Scopes;
+import java.io.IOException;
+
+/** Reindex all projects at Gerrit daemon startup. */
+public class ReindexProjectsAtStartup implements LifecycleListener {
+  private final ProjectIndexer projectIndexer;
+  private final GitRepositoryManager repoMgr;
+
+  public static class Module extends LifecycleModule {
+    @Override
+    protected void configure() {
+      listener().to(ReindexProjectsAtStartup.class).in(Scopes.SINGLETON);
+    }
+  }
+
+  @Inject
+  public ReindexProjectsAtStartup(ProjectIndexer projectIndexer, GitRepositoryManager repoMgr) {
+    this.projectIndexer = projectIndexer;
+    this.repoMgr = repoMgr;
+  }
+
+  @Override
+  public void start() {
+    repoMgr.list().stream()
+        .forEach(
+            projectName -> {
+              try {
+                projectIndexer.index(projectName);
+              } catch (IOException e) {
+                throw new IllegalStateException(
+                    String.format("Unable to index %s, tests may fail", projectName), e);
+              }
+            });
+  }
+
+  @Override
+  public void stop() {}
+}
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/RestResponse.java b/java/com/google/gerrit/acceptance/RestResponse.java
similarity index 100%
rename from gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/RestResponse.java
rename to java/com/google/gerrit/acceptance/RestResponse.java
diff --git a/java/com/google/gerrit/acceptance/RestSession.java b/java/com/google/gerrit/acceptance/RestSession.java
new file mode 100644
index 0000000..e77e527
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/RestSession.java
@@ -0,0 +1,121 @@
+// Copyright (C) 2013 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.google.gerrit.acceptance;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.net.HttpHeaders;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.restapi.RawInput;
+import com.google.gerrit.server.OutputFormat;
+import java.io.IOException;
+import org.apache.http.Header;
+import org.apache.http.client.fluent.Request;
+import org.apache.http.entity.BufferedHttpEntity;
+import org.apache.http.entity.InputStreamEntity;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.message.BasicHeader;
+
+public class RestSession extends HttpSession {
+
+  public RestSession(GerritServer server, @Nullable TestAccount account) {
+    super(server, account);
+  }
+
+  public RestResponse get(String endPoint) throws IOException {
+    return getWithHeader(endPoint, null);
+  }
+
+  public RestResponse getJsonAccept(String endPoint) throws IOException {
+    return getWithHeader(endPoint, new BasicHeader(HttpHeaders.ACCEPT, "application/json"));
+  }
+
+  public RestResponse getWithHeader(String endPoint, Header header) throws IOException {
+    Request get = Request.Get(getUrl(endPoint));
+    if (header != null) {
+      get.addHeader(header);
+    }
+    return execute(get);
+  }
+
+  public RestResponse head(String endPoint) throws IOException {
+    return execute(Request.Head(getUrl(endPoint)));
+  }
+
+  public RestResponse put(String endPoint) throws IOException {
+    return put(endPoint, null);
+  }
+
+  public RestResponse put(String endPoint, Object content) throws IOException {
+    return putWithHeader(endPoint, null, content);
+  }
+
+  public RestResponse putWithHeader(String endPoint, Header header) throws IOException {
+    return putWithHeader(endPoint, header, null);
+  }
+
+  public RestResponse putWithHeader(String endPoint, Header header, Object content)
+      throws IOException {
+    Request put = Request.Put(getUrl(endPoint));
+    if (header != null) {
+      put.addHeader(header);
+    }
+    if (content != null) {
+      put.addHeader(new BasicHeader("Content-Type", "application/json"));
+      put.body(new StringEntity(OutputFormat.JSON_COMPACT.newGson().toJson(content), UTF_8));
+    }
+    return execute(put);
+  }
+
+  public RestResponse putRaw(String endPoint, RawInput stream) throws IOException {
+    requireNonNull(stream);
+    Request put = Request.Put(getUrl(endPoint));
+    put.addHeader(new BasicHeader("Content-Type", stream.getContentType()));
+    put.body(
+        new BufferedHttpEntity(
+            new InputStreamEntity(stream.getInputStream(), stream.getContentLength())));
+    return execute(put);
+  }
+
+  public RestResponse post(String endPoint) throws IOException {
+    return post(endPoint, null);
+  }
+
+  public RestResponse post(String endPoint, Object content) throws IOException {
+    return postWithHeader(endPoint, null, content);
+  }
+
+  public RestResponse postWithHeader(String endPoint, Header header, Object content)
+      throws IOException {
+    Request post = Request.Post(getUrl(endPoint));
+    if (header != null) {
+      post.addHeader(header);
+    }
+    if (content != null) {
+      post.addHeader(new BasicHeader("Content-Type", "application/json"));
+      post.body(new StringEntity(OutputFormat.JSON_COMPACT.newGson().toJson(content), UTF_8));
+    }
+    return execute(post);
+  }
+
+  public RestResponse delete(String endPoint) throws IOException {
+    return execute(Request.Delete(getUrl(endPoint)));
+  }
+
+  private String getUrl(String endPoint) {
+    return url + (account != null ? "/a" : "") + endPoint;
+  }
+}
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/Sandboxed.java b/java/com/google/gerrit/acceptance/Sandboxed.java
similarity index 100%
rename from gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/Sandboxed.java
rename to java/com/google/gerrit/acceptance/Sandboxed.java
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/SshEnabled.java b/java/com/google/gerrit/acceptance/SshEnabled.java
similarity index 100%
rename from gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/SshEnabled.java
rename to java/com/google/gerrit/acceptance/SshEnabled.java
diff --git a/java/com/google/gerrit/acceptance/SshSession.java b/java/com/google/gerrit/acceptance/SshSession.java
new file mode 100644
index 0000000..52d7f28
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/SshSession.java
@@ -0,0 +1,138 @@
+// Copyright (C) 2013 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.google.gerrit.acceptance;
+
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.gerrit.acceptance.testsuite.account.TestSshKeys;
+import com.jcraft.jsch.ChannelExec;
+import com.jcraft.jsch.JSch;
+import com.jcraft.jsch.KeyPair;
+import com.jcraft.jsch.Session;
+import java.io.InputStream;
+import java.net.InetSocketAddress;
+import java.util.Scanner;
+
+public class SshSession {
+  private final TestSshKeys sshKeys;
+  private final InetSocketAddress addr;
+  private final TestAccount account;
+  private Session session;
+  private String error;
+
+  public SshSession(TestSshKeys sshKeys, GerritServer server, TestAccount account) {
+    this.sshKeys = sshKeys;
+    this.addr = server.getSshdAddress();
+    this.account = account;
+  }
+
+  public void open() throws Exception {
+    getSession();
+  }
+
+  @SuppressWarnings("resource")
+  public String exec(String command, InputStream opt) throws Exception {
+    ChannelExec channel = (ChannelExec) getSession().openChannel("exec");
+    try {
+      channel.setCommand(command);
+      channel.setInputStream(opt);
+      InputStream in = channel.getInputStream();
+      InputStream err = channel.getErrStream();
+      channel.connect();
+
+      Scanner s = new Scanner(err, UTF_8.name()).useDelimiter("\\A");
+      error = s.hasNext() ? s.next() : null;
+
+      s = new Scanner(in, UTF_8.name()).useDelimiter("\\A");
+      return s.hasNext() ? s.next() : "";
+    } finally {
+      channel.disconnect();
+    }
+  }
+
+  public InputStream exec2(String command, InputStream opt) throws Exception {
+    ChannelExec channel = (ChannelExec) getSession().openChannel("exec");
+    channel.setCommand(command);
+    channel.setInputStream(opt);
+    InputStream in = channel.getInputStream();
+    channel.connect();
+    return in;
+  }
+
+  public String exec(String command) throws Exception {
+    return exec(command, null);
+  }
+
+  private boolean hasError() {
+    return error != null;
+  }
+
+  public String getError() {
+    return error;
+  }
+
+  public void assertSuccess() {
+    assertWithMessage(getError()).that(hasError()).isFalse();
+  }
+
+  public void assertFailure() {
+    assertThat(hasError()).isTrue();
+  }
+
+  public void assertFailure(String error) {
+    assertThat(hasError()).isTrue();
+    assertThat(getError()).contains(error);
+  }
+
+  public void close() {
+    if (session != null) {
+      session.disconnect();
+      session = null;
+    }
+  }
+
+  private Session getSession() throws Exception {
+    if (session == null) {
+      KeyPair keyPair = sshKeys.getKeyPair(account);
+      JSch jsch = new JSch();
+      jsch.addIdentity(
+          "KeyPair", TestSshKeys.privateKey(keyPair), keyPair.getPublicKeyBlob(), null);
+      session =
+          jsch.getSession(account.username, addr.getAddress().getHostAddress(), addr.getPort());
+      session.setConfig("StrictHostKeyChecking", "no");
+      session.connect();
+    }
+    return session;
+  }
+
+  public String getUrl() {
+    checkState(session != null, "session must be opened");
+    StringBuilder b = new StringBuilder();
+    b.append("ssh://");
+    b.append(session.getUserName());
+    b.append("@");
+    b.append(session.getHost());
+    b.append(":");
+    b.append(session.getPort());
+    return b.toString();
+  }
+
+  public TestAccount getAccount() {
+    return account;
+  }
+}
diff --git a/java/com/google/gerrit/acceptance/SshdModule.java b/java/com/google/gerrit/acceptance/SshdModule.java
new file mode 100644
index 0000000..185d6e2
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/SshdModule.java
@@ -0,0 +1,41 @@
+// 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.
+
+package com.google.gerrit.acceptance;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Provides;
+import com.google.inject.Singleton;
+import org.apache.sshd.common.keyprovider.KeyPairProvider;
+import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider;
+
+public class SshdModule extends AbstractModule {
+
+  @Provides
+  @Singleton
+  KeyPairProvider createHostKey() {
+    return getHostKeys();
+  }
+
+  private static SimpleGeneratorHostKeyProvider keys;
+
+  private static synchronized KeyPairProvider getHostKeys() {
+    if (keys == null) {
+      keys = new SimpleGeneratorHostKeyProvider();
+      keys.setAlgorithm("RSA");
+      keys.loadKeys();
+    }
+    return keys;
+  }
+}
diff --git a/java/com/google/gerrit/acceptance/StandaloneSiteTest.java b/java/com/google/gerrit/acceptance/StandaloneSiteTest.java
new file mode 100644
index 0000000..a50de1a
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/StandaloneSiteTest.java
@@ -0,0 +1,228 @@
+// Copyright (C) 2017 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.google.gerrit.acceptance;
+
+import static com.google.common.truth.Truth.assertThat;
+import static java.util.stream.Collectors.joining;
+import static org.junit.Assert.fail;
+
+import com.google.common.collect.Streams;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.api.GerritApi;
+import com.google.gerrit.extensions.api.groups.GroupInput;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.launcher.GerritLauncher;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.util.ManualRequestContext;
+import com.google.gerrit.server.util.OneOffRequestContext;
+import com.google.gerrit.server.util.RequestContext;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.inject.Injector;
+import com.google.inject.Module;
+import com.google.inject.Provider;
+import java.io.File;
+import java.util.Arrays;
+import java.util.Collections;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.storage.file.FileBasedConfig;
+import org.eclipse.jgit.util.FS;
+import org.eclipse.jgit.util.SystemReader;
+import org.junit.Rule;
+import org.junit.rules.RuleChain;
+import org.junit.rules.TemporaryFolder;
+import org.junit.rules.TestRule;
+import org.junit.runner.Description;
+import org.junit.runner.RunWith;
+import org.junit.runners.model.Statement;
+
+@RunWith(ConfigSuite.class)
+@UseLocalDisk
+public abstract class StandaloneSiteTest {
+  protected class ServerContext implements RequestContext, AutoCloseable {
+    private final GerritServer server;
+    private final ManualRequestContext ctx;
+
+    private ServerContext(GerritServer server) throws Exception {
+      this.server = server;
+      Injector i = server.getTestInjector();
+      if (adminId == null) {
+        adminId = i.getInstance(AccountCreator.class).admin().getId();
+      }
+      ctx = i.getInstance(OneOffRequestContext.class).openAs(adminId);
+      GerritApi gApi = i.getInstance(GerritApi.class);
+
+      try {
+        // ServerContext ctor is called multiple times but the group can be only created once
+        gApi.groups().id("Group");
+      } catch (ResourceNotFoundException e) {
+        GroupInput in = new GroupInput();
+        in.members = Collections.singletonList("admin");
+        in.name = "Group";
+        gApi.groups().create(in);
+      }
+    }
+
+    @Override
+    public CurrentUser getUser() {
+      return ctx.getUser();
+    }
+
+    @Override
+    public Provider<ReviewDb> getReviewDbProvider() {
+      return ctx.getReviewDbProvider();
+    }
+
+    public Injector getInjector() {
+      return server.getTestInjector();
+    }
+
+    @Override
+    public void close() throws Exception {
+      try {
+        ctx.close();
+      } finally {
+        server.close();
+      }
+    }
+  }
+
+  @ConfigSuite.Parameter public Config baseConfig;
+  @ConfigSuite.Name private String configName;
+
+  private final TemporaryFolder tempSiteDir = new TemporaryFolder();
+
+  private final TestRule testRunner =
+      new TestRule() {
+        @Override
+        public Statement apply(Statement base, Description description) {
+          return new Statement() {
+            @Override
+            public void evaluate() throws Throwable {
+              try {
+                beforeTest(description);
+                base.evaluate();
+              } finally {
+                afterTest();
+              }
+            }
+          };
+        }
+      };
+
+  @Rule public RuleChain ruleChain = RuleChain.outerRule(tempSiteDir).around(testRunner);
+
+  protected SitePaths sitePaths;
+  protected Account.Id adminId;
+
+  private GerritServer.Description serverDesc;
+  private SystemReader oldSystemReader;
+
+  private void beforeTest(Description description) throws Exception {
+    // SystemReader must be overridden before creating any repos, since they read the user/system
+    // configs at initialization time, and are then stored in the RepositoryCache forever.
+    oldSystemReader = setFakeSystemReader(tempSiteDir.getRoot());
+
+    serverDesc = GerritServer.Description.forTestMethod(description, configName);
+    sitePaths = new SitePaths(tempSiteDir.getRoot().toPath());
+    GerritServer.init(serverDesc, baseConfig, sitePaths.site_path);
+  }
+
+  private static SystemReader setFakeSystemReader(File tempDir) {
+    SystemReader oldSystemReader = SystemReader.getInstance();
+    SystemReader.setInstance(
+        new SystemReader() {
+          @Override
+          public String getHostname() {
+            return oldSystemReader.getHostname();
+          }
+
+          @Override
+          public String getenv(String variable) {
+            return oldSystemReader.getenv(variable);
+          }
+
+          @Override
+          public String getProperty(String key) {
+            return oldSystemReader.getProperty(key);
+          }
+
+          @Override
+          public FileBasedConfig openUserConfig(Config parent, FS fs) {
+            return new FileBasedConfig(parent, new File(tempDir, "user.config"), FS.detect());
+          }
+
+          @Override
+          public FileBasedConfig openSystemConfig(Config parent, FS fs) {
+            return new FileBasedConfig(parent, new File(tempDir, "system.config"), FS.detect());
+          }
+
+          @Override
+          public long getCurrentTime() {
+            return oldSystemReader.getCurrentTime();
+          }
+
+          @Override
+          public int getTimezone(long when) {
+            return oldSystemReader.getTimezone(when);
+          }
+        });
+    return oldSystemReader;
+  }
+
+  private void afterTest() throws Exception {
+    SystemReader.setInstance(oldSystemReader);
+    oldSystemReader = null;
+  }
+
+  protected ServerContext startServer() throws Exception {
+    return startServer(null);
+  }
+
+  protected ServerContext startServer(@Nullable Module testSysModule, String... additionalArgs)
+      throws Exception {
+    return new ServerContext(startImpl(testSysModule, additionalArgs));
+  }
+
+  protected void assertServerStartupFails() throws Exception {
+    try (GerritServer server = startImpl(null)) {
+      fail("expected server startup to fail");
+    } catch (GerritServer.StartupException e) {
+      // Expected.
+    }
+  }
+
+  private GerritServer startImpl(@Nullable Module testSysModule, String... additionalArgs)
+      throws Exception {
+    return GerritServer.start(
+        serverDesc, baseConfig, sitePaths.site_path, testSysModule, null, null, additionalArgs);
+  }
+
+  protected static void runGerrit(String... args) throws Exception {
+    // Use invokeProgram with the current classloader, rather than mainImpl, which would create a
+    // new classloader. This is necessary so that static state, particularly the SystemReader, is
+    // shared with the test method.
+    assertThat(GerritLauncher.invokeProgram(StandaloneSiteTest.class.getClassLoader(), args))
+        .named("gerrit.war " + Arrays.stream(args).collect(joining(" ")))
+        .isEqualTo(0);
+  }
+
+  @SafeVarargs
+  protected static void runGerrit(Iterable<String>... multiArgs) throws Exception {
+    runGerrit(Arrays.stream(multiArgs).flatMap(Streams::stream).toArray(String[]::new));
+  }
+}
diff --git a/java/com/google/gerrit/acceptance/TestAccount.java b/java/com/google/gerrit/acceptance/TestAccount.java
new file mode 100644
index 0000000..5ce44ff
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/TestAccount.java
@@ -0,0 +1,74 @@
+// Copyright (C) 2013 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.google.gerrit.acceptance;
+
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.net.InetAddresses;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.reviewdb.client.Account;
+import java.net.InetSocketAddress;
+import java.util.Arrays;
+import java.util.List;
+import org.apache.http.client.utils.URIBuilder;
+import org.eclipse.jgit.lib.PersonIdent;
+
+public class TestAccount {
+  public static List<Account.Id> ids(List<TestAccount> accounts) {
+    return accounts.stream().map(a -> a.id).collect(toList());
+  }
+
+  public static List<String> names(List<TestAccount> accounts) {
+    return accounts.stream().map(a -> a.fullName).collect(toList());
+  }
+
+  public static List<String> names(TestAccount... accounts) {
+    return names(Arrays.asList(accounts));
+  }
+
+  public final Account.Id id;
+  public final String username;
+  public final String email;
+  public final Address emailAddress;
+  public final String fullName;
+  public final String httpPassword;
+
+  TestAccount(Account.Id id, String username, String email, String fullName, String httpPassword) {
+    this.id = id;
+    this.username = username;
+    this.email = email;
+    this.emailAddress = new Address(fullName, email);
+    this.fullName = fullName;
+    this.httpPassword = httpPassword;
+  }
+
+  public PersonIdent getIdent() {
+    return new PersonIdent(fullName, email);
+  }
+
+  public String getHttpUrl(GerritServer server) {
+    InetSocketAddress addr = server.getHttpAddress();
+    return new URIBuilder()
+        .setScheme("http")
+        .setUserInfo(username, httpPassword)
+        .setHost(InetAddresses.toUriString(addr.getAddress()))
+        .setPort(addr.getPort())
+        .toString();
+  }
+
+  public Account.Id getId() {
+    return id;
+  }
+}
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/TestPlugin.java b/java/com/google/gerrit/acceptance/TestPlugin.java
similarity index 100%
rename from gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/TestPlugin.java
rename to java/com/google/gerrit/acceptance/TestPlugin.java
diff --git a/java/com/google/gerrit/acceptance/TestProjectInput.java b/java/com/google/gerrit/acceptance/TestProjectInput.java
new file mode 100644
index 0000000..0a3686b
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/TestProjectInput.java
@@ -0,0 +1,58 @@
+// Copyright (C) 2015 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.google.gerrit.acceptance;
+
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.extensions.client.SubmitType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+@Target({METHOD})
+@Retention(RUNTIME)
+public @interface TestProjectInput {
+  // Fields from ProjectInput for creating the project.
+
+  String parent() default "";
+
+  boolean createEmptyCommit() default true;
+
+  String description() default "";
+
+  // These may be null in a ProjectInput, but annotations do not allow null
+  // default values. Thus these defaults should match ProjectConfig.
+  SubmitType submitType() default SubmitType.MERGE_IF_NECESSARY;
+
+  InheritableBoolean useContributorAgreements() default InheritableBoolean.INHERIT;
+
+  InheritableBoolean useSignedOffBy() default InheritableBoolean.INHERIT;
+
+  InheritableBoolean useContentMerge() default InheritableBoolean.INHERIT;
+
+  InheritableBoolean requireChangeId() default InheritableBoolean.INHERIT;
+
+  InheritableBoolean rejectEmptyCommit() default InheritableBoolean.INHERIT;
+
+  InheritableBoolean enableSignedPush() default InheritableBoolean.INHERIT;
+
+  InheritableBoolean requireSignedPush() default InheritableBoolean.INHERIT;
+
+  // Fields specific to acceptance test behavior.
+
+  /** Username to use for initial clone, passed to {@link AccountCreator}. */
+  String cloneAs() default "admin";
+}
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/UseLocalDisk.java b/java/com/google/gerrit/acceptance/UseLocalDisk.java
similarity index 100%
rename from gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/UseLocalDisk.java
rename to java/com/google/gerrit/acceptance/UseLocalDisk.java
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/UseSsh.java b/java/com/google/gerrit/acceptance/UseSsh.java
similarity index 100%
rename from gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/UseSsh.java
rename to java/com/google/gerrit/acceptance/UseSsh.java
diff --git a/java/com/google/gerrit/acceptance/testsuite/ThrowingConsumer.java b/java/com/google/gerrit/acceptance/testsuite/ThrowingConsumer.java
new file mode 100644
index 0000000..5efdc81
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/testsuite/ThrowingConsumer.java
@@ -0,0 +1,20 @@
+// 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.
+
+package com.google.gerrit.acceptance.testsuite;
+
+@FunctionalInterface
+public interface ThrowingConsumer<T> {
+  void accept(T t) throws Exception;
+}
diff --git a/java/com/google/gerrit/acceptance/testsuite/ThrowingFunction.java b/java/com/google/gerrit/acceptance/testsuite/ThrowingFunction.java
new file mode 100644
index 0000000..d41672a
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/testsuite/ThrowingFunction.java
@@ -0,0 +1,21 @@
+// 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.
+
+package com.google.gerrit.acceptance.testsuite;
+
+@FunctionalInterface
+public interface ThrowingFunction<T, R> {
+
+  R apply(T value) throws Exception;
+}
diff --git a/java/com/google/gerrit/acceptance/testsuite/account/AccountOperations.java b/java/com/google/gerrit/acceptance/testsuite/account/AccountOperations.java
new file mode 100644
index 0000000..61b7599
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/testsuite/account/AccountOperations.java
@@ -0,0 +1,99 @@
+// 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.
+
+package com.google.gerrit.acceptance.testsuite.account;
+
+import com.google.gerrit.reviewdb.client.Account;
+
+/**
+ * An aggregation of operations on accounts for test purposes.
+ *
+ * <p>To execute the operations, no Gerrit permissions are necessary.
+ *
+ * <p><strong>Note:</strong> This interface is not implemented using the REST or extension API.
+ * Hence, it cannot be used for testing those APIs.
+ */
+public interface AccountOperations {
+
+  /**
+   * Starts the fluent chain for a querying or modifying an account. Please see the methods of
+   * {@link MoreAccountOperations} for details on possible operations.
+   *
+   * @return an aggregation of operations on a specific account
+   */
+  MoreAccountOperations account(Account.Id accountId);
+
+  /**
+   * Starts the fluent chain to create an account. The returned builder can be used to specify the
+   * attributes of the new account. To create the account for real, {@link
+   * TestAccountCreation.Builder#create()} must be called.
+   *
+   * <p>Example:
+   *
+   * <pre>
+   * Account.Id createdAccountId = accountOperations
+   *     .newAccount()
+   *     .username("janedoe")
+   *     .preferredEmail("janedoe@example.com")
+   *     .fullname("Jane Doe")
+   *     .create();
+   * </pre>
+   *
+   * <p><strong>Note:</strong> If another account with the provided user name or preferred email
+   * address already exists, the creation of the account will fail.
+   *
+   * @return a builder to create the new account
+   */
+  TestAccountCreation.Builder newAccount();
+
+  /** An aggregation of methods on a specific account. */
+  interface MoreAccountOperations {
+
+    /**
+     * Checks whether the account exists.
+     *
+     * @return {@code true} if the account exists
+     */
+    boolean exists() throws Exception;
+
+    /**
+     * Retrieves the account.
+     *
+     * <p><strong>Note:</strong> This call will fail with an exception if the requested account
+     * doesn't exist. If you want to check for the existence of an account, use {@link #exists()}
+     * instead.
+     *
+     * @return the corresponding {@code TestAccount}
+     */
+    TestAccount get() throws Exception;
+
+    /**
+     * Starts the fluent chain to update an account. The returned builder can be used to specify how
+     * the attributes of the account should be modified. To update the account for real, {@link
+     * TestAccountUpdate.Builder#update()} must be called.
+     *
+     * <p>Example:
+     *
+     * <pre>
+     * TestAccount updatedAccount = accountOperations.forUpdate().status("on vacation").update();
+     * </pre>
+     *
+     * <p><strong>Note:</strong> The update will fail with an exception if the account to update
+     * doesn't exist. If you want to check for the existence of an account, use {@link #exists()}.
+     *
+     * @return a builder to update the account
+     */
+    TestAccountUpdate.Builder forUpdate();
+  }
+}
diff --git a/java/com/google/gerrit/acceptance/testsuite/account/AccountOperationsImpl.java b/java/com/google/gerrit/acceptance/testsuite/account/AccountOperationsImpl.java
new file mode 100644
index 0000000..ebbcfe4
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/testsuite/account/AccountOperationsImpl.java
@@ -0,0 +1,166 @@
+// 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.
+
+package com.google.gerrit.acceptance.testsuite.account;
+
+import static com.google.common.base.Preconditions.checkState;
+
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.Sequences;
+import com.google.gerrit.server.ServerInitiated;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.account.Accounts;
+import com.google.gerrit.server.account.AccountsUpdate;
+import com.google.gerrit.server.account.InternalAccountUpdate;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.util.Optional;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+/**
+ * The implementation of {@code AccountOperations}.
+ *
+ * <p>There is only one implementation of {@code AccountOperations}. Nevertheless, we keep the
+ * separation between interface and implementation to enhance clarity.
+ */
+public class AccountOperationsImpl implements AccountOperations {
+  private final Accounts accounts;
+  private final AccountsUpdate accountsUpdate;
+  private final Sequences seq;
+
+  @Inject
+  public AccountOperationsImpl(
+      Accounts accounts, @ServerInitiated AccountsUpdate accountsUpdate, Sequences seq) {
+    this.accounts = accounts;
+    this.accountsUpdate = accountsUpdate;
+    this.seq = seq;
+  }
+
+  @Override
+  public MoreAccountOperations account(Account.Id accountId) {
+    return new MoreAccountOperationsImpl(accountId);
+  }
+
+  @Override
+  public TestAccountCreation.Builder newAccount() {
+    return TestAccountCreation.builder(this::createAccount);
+  }
+
+  private Account.Id createAccount(TestAccountCreation accountCreation) throws Exception {
+    AccountsUpdate.AccountUpdater accountUpdater =
+        (account, updateBuilder) ->
+            fillBuilder(updateBuilder, accountCreation, account.getAccount().getId());
+    AccountState createdAccount = createAccount(accountUpdater);
+    return createdAccount.getAccount().getId();
+  }
+
+  private AccountState createAccount(AccountsUpdate.AccountUpdater accountUpdater)
+      throws OrmException, IOException, ConfigInvalidException {
+    Account.Id accountId = new Account.Id(seq.nextAccountId());
+    return accountsUpdate.insert("Create Test Account", accountId, accountUpdater);
+  }
+
+  private static void fillBuilder(
+      InternalAccountUpdate.Builder builder,
+      TestAccountCreation accountCreation,
+      Account.Id accountId) {
+    accountCreation.fullname().ifPresent(builder::setFullName);
+    accountCreation.preferredEmail().ifPresent(e -> setPreferredEmail(builder, accountId, e));
+    String httpPassword = accountCreation.httpPassword().orElse(null);
+    accountCreation.username().ifPresent(u -> setUsername(builder, accountId, u, httpPassword));
+    accountCreation.status().ifPresent(builder::setStatus);
+    accountCreation.active().ifPresent(builder::setActive);
+  }
+
+  private static InternalAccountUpdate.Builder setPreferredEmail(
+      InternalAccountUpdate.Builder builder, Account.Id accountId, String preferredEmail) {
+    return builder
+        .setPreferredEmail(preferredEmail)
+        .addExternalId(ExternalId.createEmail(accountId, preferredEmail));
+  }
+
+  private static InternalAccountUpdate.Builder setUsername(
+      InternalAccountUpdate.Builder builder,
+      Account.Id accountId,
+      String username,
+      String httpPassword) {
+    return builder.addExternalId(ExternalId.createUsername(username, accountId, httpPassword));
+  }
+
+  private class MoreAccountOperationsImpl implements MoreAccountOperations {
+    private final Account.Id accountId;
+
+    MoreAccountOperationsImpl(Account.Id accountId) {
+      this.accountId = accountId;
+    }
+
+    @Override
+    public boolean exists() throws Exception {
+      return accounts.get(accountId).isPresent();
+    }
+
+    @Override
+    public TestAccount get() throws Exception {
+      AccountState account =
+          accounts
+              .get(accountId)
+              .orElseThrow(
+                  () -> new IllegalStateException("Tried to get non-existing test account"));
+      return toTestAccount(account);
+    }
+
+    private TestAccount toTestAccount(AccountState accountState) {
+      Account account = accountState.getAccount();
+      return TestAccount.builder()
+          .accountId(account.getId())
+          .preferredEmail(Optional.ofNullable(account.getPreferredEmail()))
+          .fullname(Optional.ofNullable(account.getFullName()))
+          .username(accountState.getUserName())
+          .active(accountState.getAccount().isActive())
+          .build();
+    }
+
+    @Override
+    public TestAccountUpdate.Builder forUpdate() {
+      return TestAccountUpdate.builder(this::updateAccount);
+    }
+
+    private void updateAccount(TestAccountUpdate accountUpdate)
+        throws OrmException, IOException, ConfigInvalidException {
+      AccountsUpdate.AccountUpdater accountUpdater =
+          (account, updateBuilder) -> fillBuilder(updateBuilder, accountUpdate, accountId);
+      Optional<AccountState> updatedAccount = updateAccount(accountUpdater);
+      checkState(updatedAccount.isPresent(), "Tried to update non-existing test account");
+    }
+
+    private Optional<AccountState> updateAccount(AccountsUpdate.AccountUpdater accountUpdater)
+        throws OrmException, IOException, ConfigInvalidException {
+      return accountsUpdate.update("Update Test Account", accountId, accountUpdater);
+    }
+
+    private void fillBuilder(
+        InternalAccountUpdate.Builder builder,
+        TestAccountUpdate accountUpdate,
+        Account.Id accountId) {
+      accountUpdate.fullname().ifPresent(builder::setFullName);
+      accountUpdate.preferredEmail().ifPresent(e -> setPreferredEmail(builder, accountId, e));
+      String httpPassword = accountUpdate.httpPassword().orElse(null);
+      accountUpdate.username().ifPresent(u -> setUsername(builder, accountId, u, httpPassword));
+      accountUpdate.status().ifPresent(builder::setStatus);
+      accountUpdate.active().ifPresent(builder::setActive);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/acceptance/testsuite/account/TestAccount.java b/java/com/google/gerrit/acceptance/testsuite/account/TestAccount.java
new file mode 100644
index 0000000..e7ffeec
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/testsuite/account/TestAccount.java
@@ -0,0 +1,51 @@
+// 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.
+
+package com.google.gerrit.acceptance.testsuite.account;
+
+import com.google.auto.value.AutoValue;
+import com.google.gerrit.reviewdb.client.Account;
+import java.util.Optional;
+
+@AutoValue
+public abstract class TestAccount {
+  public abstract Account.Id accountId();
+
+  public abstract Optional<String> fullname();
+
+  public abstract Optional<String> preferredEmail();
+
+  public abstract Optional<String> username();
+
+  public abstract boolean active();
+
+  static Builder builder() {
+    return new AutoValue_TestAccount.Builder();
+  }
+
+  @AutoValue.Builder
+  abstract static class Builder {
+    abstract Builder accountId(Account.Id accountId);
+
+    abstract Builder fullname(Optional<String> fullname);
+
+    abstract Builder preferredEmail(Optional<String> fullname);
+
+    abstract Builder username(Optional<String> username);
+
+    abstract Builder active(boolean active);
+
+    abstract TestAccount build();
+  }
+}
diff --git a/java/com/google/gerrit/acceptance/testsuite/account/TestAccountCreation.java b/java/com/google/gerrit/acceptance/testsuite/account/TestAccountCreation.java
new file mode 100644
index 0000000..ab32409
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/testsuite/account/TestAccountCreation.java
@@ -0,0 +1,96 @@
+// 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.
+
+package com.google.gerrit.acceptance.testsuite.account;
+
+import com.google.auto.value.AutoValue;
+import com.google.gerrit.acceptance.testsuite.ThrowingFunction;
+import com.google.gerrit.reviewdb.client.Account;
+import java.util.Optional;
+
+@AutoValue
+public abstract class TestAccountCreation {
+  public abstract Optional<String> fullname();
+
+  public abstract Optional<String> httpPassword();
+
+  public abstract Optional<String> preferredEmail();
+
+  public abstract Optional<String> username();
+
+  public abstract Optional<String> status();
+
+  public abstract Optional<Boolean> active();
+
+  abstract ThrowingFunction<TestAccountCreation, Account.Id> accountCreator();
+
+  public static Builder builder(ThrowingFunction<TestAccountCreation, Account.Id> accountCreator) {
+    return new AutoValue_TestAccountCreation.Builder()
+        .accountCreator(accountCreator)
+        .httpPassword("http-pass");
+  }
+
+  @AutoValue.Builder
+  public abstract static class Builder {
+    public abstract Builder fullname(String fullname);
+
+    public Builder clearFullname() {
+      return fullname("");
+    }
+
+    public abstract Builder httpPassword(String httpPassword);
+
+    public Builder clearHttpPassword() {
+      return httpPassword("");
+    }
+
+    public abstract Builder preferredEmail(String preferredEmail);
+
+    public Builder clearPreferredEmail() {
+      return preferredEmail("");
+    }
+
+    public abstract Builder username(String username);
+
+    public Builder clearUsername() {
+      return username("");
+    }
+
+    public abstract Builder status(String status);
+
+    public Builder clearStatus() {
+      return status("");
+    }
+
+    abstract Builder active(boolean active);
+
+    public Builder active() {
+      return active(true);
+    }
+
+    public Builder inactive() {
+      return active(false);
+    }
+
+    abstract Builder accountCreator(
+        ThrowingFunction<TestAccountCreation, Account.Id> accountCreator);
+
+    abstract TestAccountCreation autoBuild();
+
+    public Account.Id create() throws Exception {
+      TestAccountCreation accountUpdate = autoBuild();
+      return accountUpdate.accountCreator().apply(accountUpdate);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/acceptance/testsuite/account/TestAccountUpdate.java b/java/com/google/gerrit/acceptance/testsuite/account/TestAccountUpdate.java
new file mode 100644
index 0000000..251f452
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/testsuite/account/TestAccountUpdate.java
@@ -0,0 +1,94 @@
+// 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.
+
+package com.google.gerrit.acceptance.testsuite.account;
+
+import com.google.auto.value.AutoValue;
+import com.google.gerrit.acceptance.testsuite.ThrowingConsumer;
+import java.util.Optional;
+
+@AutoValue
+public abstract class TestAccountUpdate {
+  public abstract Optional<String> fullname();
+
+  public abstract Optional<String> httpPassword();
+
+  public abstract Optional<String> preferredEmail();
+
+  public abstract Optional<String> username();
+
+  public abstract Optional<String> status();
+
+  public abstract Optional<Boolean> active();
+
+  abstract ThrowingConsumer<TestAccountUpdate> accountUpdater();
+
+  public static Builder builder(ThrowingConsumer<TestAccountUpdate> accountUpdater) {
+    return new AutoValue_TestAccountUpdate.Builder()
+        .accountUpdater(accountUpdater)
+        .httpPassword("http-pass");
+  }
+
+  @AutoValue.Builder
+  public abstract static class Builder {
+    public abstract Builder fullname(String fullname);
+
+    public Builder clearFullname() {
+      return fullname("");
+    }
+
+    public abstract Builder httpPassword(String httpPassword);
+
+    public Builder clearHttpPassword() {
+      return httpPassword("");
+    }
+
+    public abstract Builder preferredEmail(String preferredEmail);
+
+    public Builder clearPreferredEmail() {
+      return preferredEmail("");
+    }
+
+    public abstract Builder username(String username);
+
+    public Builder clearUsername() {
+      return username("");
+    }
+
+    public abstract Builder status(String status);
+
+    public Builder clearStatus() {
+      return status("");
+    }
+
+    abstract Builder active(boolean active);
+
+    public Builder active() {
+      return active(true);
+    }
+
+    public Builder inactive() {
+      return active(false);
+    }
+
+    abstract Builder accountUpdater(ThrowingConsumer<TestAccountUpdate> accountUpdater);
+
+    abstract TestAccountUpdate autoBuild();
+
+    public void update() throws Exception {
+      TestAccountUpdate accountUpdate = autoBuild();
+      accountUpdate.accountUpdater().accept(accountUpdate);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/acceptance/testsuite/account/TestSshKeys.java b/java/com/google/gerrit/acceptance/testsuite/account/TestSshKeys.java
new file mode 100644
index 0000000..0cb5cf3
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/testsuite/account/TestSshKeys.java
@@ -0,0 +1,112 @@
+// 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.
+
+package com.google.gerrit.acceptance.testsuite.account;
+
+import static com.google.common.base.Preconditions.checkState;
+import static java.nio.charset.StandardCharsets.US_ASCII;
+
+import com.google.gerrit.acceptance.SshEnabled;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.account.VersionedAuthorizedKeys;
+import com.google.gerrit.server.ssh.SshKeyCache;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.jcraft.jsch.JSch;
+import com.jcraft.jsch.JSchException;
+import com.jcraft.jsch.KeyPair;
+import java.io.ByteArrayOutputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.HashMap;
+import java.util.Map;
+
+@Singleton
+public class TestSshKeys {
+  private final Map<String, KeyPair> sshKeyPairs;
+
+  private final VersionedAuthorizedKeys.Accessor authorizedKeys;
+  private final SshKeyCache sshKeyCache;
+  private final boolean sshEnabled;
+
+  @Inject
+  TestSshKeys(
+      VersionedAuthorizedKeys.Accessor authorizedKeys,
+      SshKeyCache sshKeyCache,
+      @SshEnabled boolean sshEnabled) {
+    this.authorizedKeys = authorizedKeys;
+    this.sshKeyCache = sshKeyCache;
+    this.sshEnabled = sshEnabled;
+    this.sshKeyPairs = new HashMap<>();
+  }
+
+  // TODO(ekempin): Remove this method when com.google.gerrit.acceptance.TestAccount is gone
+  public KeyPair getKeyPair(com.google.gerrit.acceptance.TestAccount account) throws Exception {
+    checkState(sshEnabled, "Requested SSH key pair, but SSH is disabled");
+    checkState(
+        account.username != null,
+        "Requested SSH key pair for account %s, but username is not set",
+        account.id);
+
+    String username = account.username;
+    KeyPair keyPair = sshKeyPairs.get(username);
+    if (keyPair == null) {
+      keyPair = createKeyPair(account.id, username, account.email);
+      sshKeyPairs.put(username, keyPair);
+    }
+    return keyPair;
+  }
+
+  public KeyPair getKeyPair(TestAccount account) throws Exception {
+    checkState(sshEnabled, "Requested SSH key pair, but SSH is disabled");
+    checkState(
+        account.username().isPresent(),
+        "Requested SSH key pair for account %s, but username is not set",
+        account.accountId());
+
+    String username = account.username().get();
+    KeyPair keyPair = sshKeyPairs.get(username);
+    if (keyPair == null) {
+      keyPair = createKeyPair(account.accountId(), username, account.preferredEmail().orElse(null));
+      sshKeyPairs.put(username, keyPair);
+    }
+    return keyPair;
+  }
+
+  private KeyPair createKeyPair(Account.Id accountId, String username, @Nullable String email)
+      throws Exception {
+    KeyPair keyPair = genSshKey();
+    authorizedKeys.addKey(accountId, publicKey(keyPair, email));
+    sshKeyCache.evict(username);
+    return keyPair;
+  }
+
+  public static KeyPair genSshKey() throws JSchException {
+    JSch jsch = new JSch();
+    return KeyPair.genKeyPair(jsch, KeyPair.ECDSA, 256);
+  }
+
+  public static String publicKey(KeyPair sshKey, @Nullable String comment)
+      throws UnsupportedEncodingException {
+    ByteArrayOutputStream out = new ByteArrayOutputStream();
+    sshKey.writePublicKey(out, comment);
+    return out.toString(US_ASCII.name()).trim();
+  }
+
+  public static byte[] privateKey(KeyPair keyPair) {
+    ByteArrayOutputStream out = new ByteArrayOutputStream();
+    keyPair.writePrivateKey(out);
+    return out.toByteArray();
+  }
+}
diff --git a/java/com/google/gerrit/acceptance/testsuite/group/GroupOperations.java b/java/com/google/gerrit/acceptance/testsuite/group/GroupOperations.java
new file mode 100644
index 0000000..f75ca2e
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/testsuite/group/GroupOperations.java
@@ -0,0 +1,97 @@
+// 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.
+
+package com.google.gerrit.acceptance.testsuite.group;
+
+import com.google.gerrit.reviewdb.client.AccountGroup;
+
+/**
+ * An aggregation of operations on groups for test purposes.
+ *
+ * <p>To execute the operations, no Gerrit permissions are necessary.
+ *
+ * <p><strong>Note:</strong> This interface is not implemented using the REST or extension API.
+ * Hence, it cannot be used for testing those APIs.
+ */
+public interface GroupOperations {
+  /**
+   * Starts the fluent chain for querying or modifying a group. Please see the methods of {@link
+   * MoreGroupOperations} for details on possible operations.
+   *
+   * @return an aggregation of operations on a specific group
+   */
+  MoreGroupOperations group(AccountGroup.UUID groupUuid);
+
+  /**
+   * Starts the fluent chain to create a group. The returned builder can be used to specify the
+   * attributes of the new group. To create the group for real, {@link
+   * TestGroupCreation.Builder#create()} must be called.
+   *
+   * <p>Example:
+   *
+   * <pre>
+   * AccountGroup.UUID createdGroupUuid = groupOperations
+   *     .newGroup()
+   *     .name("verifiers")
+   *     .description("All verifiers of this server")
+   *     .create();
+   * </pre>
+   *
+   * <p><strong>Note:</strong> If another group with the provided name already exists, the creation
+   * of the group will fail.
+   *
+   * @return a builder to create the new group
+   */
+  TestGroupCreation.Builder newGroup();
+
+  /** An aggregation of methods on a specific group. */
+  interface MoreGroupOperations {
+
+    /**
+     * Checks whether the group exists.
+     *
+     * @return {@code true} if the group exists
+     */
+    boolean exists() throws Exception;
+
+    /**
+     * Retrieves the group.
+     *
+     * <p><strong>Note:</strong> This call will fail with an exception if the requested group
+     * doesn't exist. If you want to check for the existence of a group, use {@link #exists()}
+     * instead.
+     *
+     * @return the corresponding {@code TestGroup}
+     */
+    TestGroup get() throws Exception;
+
+    /**
+     * Starts the fluent chain to update a group. The returned builder can be used to specify how
+     * the attributes of the group should be modified. To update the group for real, {@link
+     * TestGroupUpdate.Builder#update()} must be called.
+     *
+     * <p>Example:
+     *
+     * <pre>
+     * groupOperations.forUpdate().description("Another description for this group").update();
+     * </pre>
+     *
+     * <p><strong>Note:</strong> The update will fail with an exception if the group to update
+     * doesn't exist. If you want to check for the existence of a group, use {@link #exists()}.
+     *
+     * @return a builder to update the group
+     */
+    TestGroupUpdate.Builder forUpdate();
+  }
+}
diff --git a/java/com/google/gerrit/acceptance/testsuite/group/GroupOperationsImpl.java b/java/com/google/gerrit/acceptance/testsuite/group/GroupOperationsImpl.java
new file mode 100644
index 0000000..f9769c5
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/testsuite/group/GroupOperationsImpl.java
@@ -0,0 +1,159 @@
+// 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.
+
+package com.google.gerrit.acceptance.testsuite.group;
+
+import static com.google.common.base.Preconditions.checkState;
+
+import com.google.gerrit.common.errors.NoSuchGroupException;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.Sequences;
+import com.google.gerrit.server.ServerInitiated;
+import com.google.gerrit.server.account.GroupUUID;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.group.db.Groups;
+import com.google.gerrit.server.group.db.GroupsUpdate;
+import com.google.gerrit.server.group.db.InternalGroupCreation;
+import com.google.gerrit.server.group.db.InternalGroupUpdate;
+import com.google.gwtorm.server.OrmDuplicateKeyException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.util.Optional;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.PersonIdent;
+
+/**
+ * The implementation of {@code GroupOperations}.
+ *
+ * <p>There is only one implementation of {@code GroupOperations}. Nevertheless, we keep the
+ * separation between interface and implementation to enhance clarity.
+ */
+public class GroupOperationsImpl implements GroupOperations {
+  private final Groups groups;
+  private final GroupsUpdate groupsUpdate;
+  private final Sequences seq;
+  private final PersonIdent serverIdent;
+
+  @Inject
+  public GroupOperationsImpl(
+      Groups groups,
+      @ServerInitiated GroupsUpdate groupsUpdate,
+      Sequences seq,
+      @GerritPersonIdent PersonIdent serverIdent) {
+    this.groups = groups;
+    this.groupsUpdate = groupsUpdate;
+    this.seq = seq;
+    this.serverIdent = serverIdent;
+  }
+
+  @Override
+  public MoreGroupOperations group(AccountGroup.UUID groupUuid) {
+    return new MoreGroupOperationsImpl(groupUuid);
+  }
+
+  @Override
+  public TestGroupCreation.Builder newGroup() {
+    return TestGroupCreation.builder(this::createNewGroup);
+  }
+
+  private AccountGroup.UUID createNewGroup(TestGroupCreation groupCreation)
+      throws ConfigInvalidException, IOException, OrmException {
+    InternalGroupCreation internalGroupCreation = toInternalGroupCreation(groupCreation);
+    InternalGroupUpdate internalGroupUpdate = toInternalGroupUpdate(groupCreation);
+    InternalGroup internalGroup =
+        groupsUpdate.createGroup(internalGroupCreation, internalGroupUpdate);
+    return internalGroup.getGroupUUID();
+  }
+
+  private InternalGroupCreation toInternalGroupCreation(TestGroupCreation groupCreation)
+      throws OrmException {
+    AccountGroup.Id groupId = new AccountGroup.Id(seq.nextGroupId());
+    String groupName = groupCreation.name().orElse("group-with-id-" + groupId.get());
+    AccountGroup.UUID groupUuid = GroupUUID.make(groupName, serverIdent);
+    AccountGroup.NameKey nameKey = new AccountGroup.NameKey(groupName);
+    return InternalGroupCreation.builder()
+        .setId(groupId)
+        .setGroupUUID(groupUuid)
+        .setNameKey(nameKey)
+        .build();
+  }
+
+  private static InternalGroupUpdate toInternalGroupUpdate(TestGroupCreation groupCreation) {
+    InternalGroupUpdate.Builder builder = InternalGroupUpdate.builder();
+    groupCreation.description().ifPresent(builder::setDescription);
+    groupCreation.ownerGroupUuid().ifPresent(builder::setOwnerGroupUUID);
+    groupCreation.visibleToAll().ifPresent(builder::setVisibleToAll);
+    builder.setMemberModification(originalMembers -> groupCreation.members());
+    builder.setSubgroupModification(originalSubgroups -> groupCreation.subgroups());
+    return builder.build();
+  }
+
+  private class MoreGroupOperationsImpl implements MoreGroupOperations {
+    private final AccountGroup.UUID groupUuid;
+
+    MoreGroupOperationsImpl(AccountGroup.UUID groupUuid) {
+      this.groupUuid = groupUuid;
+    }
+
+    @Override
+    public boolean exists() throws Exception {
+      return groups.getGroup(groupUuid).isPresent();
+    }
+
+    @Override
+    public TestGroup get() throws Exception {
+      Optional<InternalGroup> group = groups.getGroup(groupUuid);
+      checkState(group.isPresent(), "Tried to get non-existing test group");
+      return toTestGroup(group.get());
+    }
+
+    private TestGroup toTestGroup(InternalGroup internalGroup) {
+      return TestGroup.builder()
+          .groupUuid(internalGroup.getGroupUUID())
+          .groupId(internalGroup.getId())
+          .nameKey(internalGroup.getNameKey())
+          .description(Optional.ofNullable(internalGroup.getDescription()))
+          .ownerGroupUuid(internalGroup.getOwnerGroupUUID())
+          .visibleToAll(internalGroup.isVisibleToAll())
+          .createdOn(internalGroup.getCreatedOn())
+          .members(internalGroup.getMembers())
+          .subgroups(internalGroup.getSubgroups())
+          .build();
+    }
+
+    @Override
+    public TestGroupUpdate.Builder forUpdate() {
+      return TestGroupUpdate.builder(this::updateGroup);
+    }
+
+    private void updateGroup(TestGroupUpdate groupUpdate)
+        throws OrmDuplicateKeyException, NoSuchGroupException, ConfigInvalidException, IOException {
+      InternalGroupUpdate internalGroupUpdate = toInternalGroupUpdate(groupUpdate);
+      groupsUpdate.updateGroup(groupUuid, internalGroupUpdate);
+    }
+
+    private InternalGroupUpdate toInternalGroupUpdate(TestGroupUpdate groupUpdate) {
+      InternalGroupUpdate.Builder builder = InternalGroupUpdate.builder();
+      groupUpdate.name().map(AccountGroup.NameKey::new).ifPresent(builder::setName);
+      groupUpdate.description().ifPresent(builder::setDescription);
+      groupUpdate.ownerGroupUuid().ifPresent(builder::setOwnerGroupUUID);
+      groupUpdate.visibleToAll().ifPresent(builder::setVisibleToAll);
+      builder.setMemberModification(groupUpdate.memberModification()::apply);
+      builder.setSubgroupModification(groupUpdate.subgroupModification()::apply);
+      return builder.build();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/acceptance/testsuite/group/TestGroup.java b/java/com/google/gerrit/acceptance/testsuite/group/TestGroup.java
new file mode 100644
index 0000000..b450304
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/testsuite/group/TestGroup.java
@@ -0,0 +1,78 @@
+// 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.
+
+package com.google.gerrit.acceptance.testsuite.group;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import java.sql.Timestamp;
+import java.util.Optional;
+
+@AutoValue
+public abstract class TestGroup {
+
+  public abstract AccountGroup.UUID groupUuid();
+
+  public abstract AccountGroup.Id groupId();
+
+  public String name() {
+    return nameKey().get();
+  }
+
+  public abstract AccountGroup.NameKey nameKey();
+
+  public abstract Optional<String> description();
+
+  public abstract AccountGroup.UUID ownerGroupUuid();
+
+  public abstract boolean visibleToAll();
+
+  public abstract Timestamp createdOn();
+
+  public abstract ImmutableSet<Account.Id> members();
+
+  public abstract ImmutableSet<AccountGroup.UUID> subgroups();
+
+  static Builder builder() {
+    return new AutoValue_TestGroup.Builder();
+  }
+
+  @AutoValue.Builder
+  abstract static class Builder {
+
+    public abstract Builder groupUuid(AccountGroup.UUID groupUuid);
+
+    public abstract Builder groupId(AccountGroup.Id id);
+
+    public abstract Builder nameKey(AccountGroup.NameKey name);
+
+    public abstract Builder description(String description);
+
+    public abstract Builder description(Optional<String> description);
+
+    public abstract Builder ownerGroupUuid(AccountGroup.UUID ownerGroupUuid);
+
+    public abstract Builder visibleToAll(boolean visibleToAll);
+
+    public abstract Builder createdOn(Timestamp createdOn);
+
+    public abstract Builder members(ImmutableSet<Account.Id> members);
+
+    public abstract Builder subgroups(ImmutableSet<AccountGroup.UUID> subgroups);
+
+    abstract TestGroup build();
+  }
+}
diff --git a/java/com/google/gerrit/acceptance/testsuite/group/TestGroupCreation.java b/java/com/google/gerrit/acceptance/testsuite/group/TestGroupCreation.java
new file mode 100644
index 0000000..efed720
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/testsuite/group/TestGroupCreation.java
@@ -0,0 +1,112 @@
+// 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.
+
+package com.google.gerrit.acceptance.testsuite.group;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+import com.google.gerrit.acceptance.testsuite.ThrowingFunction;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import java.util.Optional;
+import java.util.Set;
+
+@AutoValue
+public abstract class TestGroupCreation {
+
+  public abstract Optional<String> name();
+
+  public abstract Optional<String> description();
+
+  public abstract Optional<AccountGroup.UUID> ownerGroupUuid();
+
+  public abstract Optional<Boolean> visibleToAll();
+
+  public abstract ImmutableSet<Account.Id> members();
+
+  public abstract ImmutableSet<AccountGroup.UUID> subgroups();
+
+  abstract ThrowingFunction<TestGroupCreation, AccountGroup.UUID> groupCreator();
+
+  public static Builder builder(
+      ThrowingFunction<TestGroupCreation, AccountGroup.UUID> groupCreator) {
+    return new AutoValue_TestGroupCreation.Builder().groupCreator(groupCreator);
+  }
+
+  @AutoValue.Builder
+  public abstract static class Builder {
+
+    public abstract Builder name(String name);
+
+    public abstract Builder description(String description);
+
+    public Builder clearDescription() {
+      return description("");
+    }
+
+    public abstract Builder ownerGroupUuid(AccountGroup.UUID ownerGroupUuid);
+
+    public abstract Builder visibleToAll(boolean visibleToAll);
+
+    public Builder clearMembers() {
+      return members(ImmutableSet.of());
+    }
+
+    public Builder members(Account.Id member1, Account.Id... otherMembers) {
+      return members(Sets.union(ImmutableSet.of(member1), ImmutableSet.copyOf(otherMembers)));
+    }
+
+    public abstract Builder members(Set<Account.Id> members);
+
+    abstract ImmutableSet.Builder<Account.Id> membersBuilder();
+
+    public Builder addMember(Account.Id member) {
+      membersBuilder().add(member);
+      return this;
+    }
+
+    public Builder clearSubgroups() {
+      return subgroups(ImmutableSet.of());
+    }
+
+    public Builder subgroups(AccountGroup.UUID subgroup1, AccountGroup.UUID... otherSubgroups) {
+      return subgroups(Sets.union(ImmutableSet.of(subgroup1), ImmutableSet.copyOf(otherSubgroups)));
+    }
+
+    public abstract Builder subgroups(Set<AccountGroup.UUID> subgroups);
+
+    abstract ImmutableSet.Builder<AccountGroup.UUID> subgroupsBuilder();
+
+    public Builder addSubgroup(AccountGroup.UUID subgroup) {
+      subgroupsBuilder().add(subgroup);
+      return this;
+    }
+
+    abstract Builder groupCreator(
+        ThrowingFunction<TestGroupCreation, AccountGroup.UUID> groupCreator);
+
+    abstract TestGroupCreation autoBuild();
+
+    /**
+     * Executes the group creation as specified.
+     *
+     * @return the UUID of the created group
+     */
+    public AccountGroup.UUID create() throws Exception {
+      TestGroupCreation groupCreation = autoBuild();
+      return groupCreation.groupCreator().apply(groupCreation);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/acceptance/testsuite/group/TestGroupUpdate.java b/java/com/google/gerrit/acceptance/testsuite/group/TestGroupUpdate.java
new file mode 100644
index 0000000..095a270
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/testsuite/group/TestGroupUpdate.java
@@ -0,0 +1,134 @@
+// 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.
+
+package com.google.gerrit.acceptance.testsuite.group;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+import com.google.gerrit.acceptance.testsuite.ThrowingConsumer;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.Function;
+
+@AutoValue
+public abstract class TestGroupUpdate {
+
+  public abstract Optional<String> name();
+
+  public abstract Optional<String> description();
+
+  public abstract Optional<AccountGroup.UUID> ownerGroupUuid();
+
+  public abstract Optional<Boolean> visibleToAll();
+
+  public abstract Function<ImmutableSet<Account.Id>, Set<Account.Id>> memberModification();
+
+  public abstract Function<ImmutableSet<AccountGroup.UUID>, Set<AccountGroup.UUID>>
+      subgroupModification();
+
+  abstract ThrowingConsumer<TestGroupUpdate> groupUpdater();
+
+  public static Builder builder(ThrowingConsumer<TestGroupUpdate> groupUpdater) {
+    return new AutoValue_TestGroupUpdate.Builder()
+        .groupUpdater(groupUpdater)
+        .memberModification(in -> in)
+        .subgroupModification(in -> in);
+  }
+
+  @AutoValue.Builder
+  public abstract static class Builder {
+
+    public abstract Builder name(String name);
+
+    public abstract Builder description(String description);
+
+    public Builder clearDescription() {
+      return description("");
+    }
+
+    public abstract Builder ownerGroupUuid(AccountGroup.UUID ownerGroupUUID);
+
+    public abstract Builder visibleToAll(boolean visibleToAll);
+
+    abstract Builder memberModification(
+        Function<ImmutableSet<Account.Id>, Set<Account.Id>> memberModification);
+
+    abstract Function<ImmutableSet<Account.Id>, Set<Account.Id>> memberModification();
+
+    public Builder clearMembers() {
+      return memberModification(originalMembers -> ImmutableSet.of());
+    }
+
+    public Builder addMember(Account.Id member) {
+      Function<ImmutableSet<Account.Id>, Set<Account.Id>> previousModification =
+          memberModification();
+      memberModification(
+          originalMembers ->
+              Sets.union(previousModification.apply(originalMembers), ImmutableSet.of(member)));
+      return this;
+    }
+
+    public Builder removeMember(Account.Id member) {
+      Function<ImmutableSet<Account.Id>, Set<Account.Id>> previousModification =
+          memberModification();
+      memberModification(
+          originalMembers ->
+              Sets.difference(
+                  previousModification.apply(originalMembers), ImmutableSet.of(member)));
+      return this;
+    }
+
+    abstract Builder subgroupModification(
+        Function<ImmutableSet<AccountGroup.UUID>, Set<AccountGroup.UUID>> subgroupModification);
+
+    abstract Function<ImmutableSet<AccountGroup.UUID>, Set<AccountGroup.UUID>>
+        subgroupModification();
+
+    public Builder clearSubgroups() {
+      return subgroupModification(originalMembers -> ImmutableSet.of());
+    }
+
+    public Builder addSubgroup(AccountGroup.UUID subgroup) {
+      Function<ImmutableSet<AccountGroup.UUID>, Set<AccountGroup.UUID>> previousModification =
+          subgroupModification();
+      subgroupModification(
+          originalSubgroups ->
+              Sets.union(previousModification.apply(originalSubgroups), ImmutableSet.of(subgroup)));
+      return this;
+    }
+
+    public Builder removeSubgroup(AccountGroup.UUID subgroup) {
+      Function<ImmutableSet<AccountGroup.UUID>, Set<AccountGroup.UUID>> previousModification =
+          subgroupModification();
+      subgroupModification(
+          originalSubgroups ->
+              Sets.difference(
+                  previousModification.apply(originalSubgroups), ImmutableSet.of(subgroup)));
+      return this;
+    }
+
+    abstract Builder groupUpdater(ThrowingConsumer<TestGroupUpdate> groupUpdater);
+
+    abstract TestGroupUpdate autoBuild();
+
+    /** Executes the group update as specified. */
+    public void update() throws Exception {
+      TestGroupUpdate groupUpdater = autoBuild();
+      groupUpdater.groupUpdater().accept(groupUpdater);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/asciidoctor/AsciiDoctor.java b/java/com/google/gerrit/asciidoctor/AsciiDoctor.java
new file mode 100644
index 0000000..5779070
--- /dev/null
+++ b/java/com/google/gerrit/asciidoctor/AsciiDoctor.java
@@ -0,0 +1,219 @@
+// Copyright (C) 2013 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.google.gerrit.asciidoctor;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.io.ByteStreams;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+import org.asciidoctor.Asciidoctor;
+import org.asciidoctor.AttributesBuilder;
+import org.asciidoctor.Options;
+import org.asciidoctor.OptionsBuilder;
+import org.asciidoctor.SafeMode;
+import org.asciidoctor.internal.JRubyAsciidoctor;
+import org.kohsuke.args4j.Argument;
+import org.kohsuke.args4j.CmdLineException;
+import org.kohsuke.args4j.CmdLineParser;
+import org.kohsuke.args4j.Option;
+import org.kohsuke.args4j.ParserProperties;
+
+public class AsciiDoctor {
+
+  private static final String DOCTYPE = "article";
+  private static final String ERUBY = "erb";
+  private static final String REVNUMBER_NAME = "revnumber";
+
+  @Option(name = "-b", usage = "set output format backend")
+  private String backend = "html5";
+
+  @Option(name = "-z", usage = "output zip file")
+  private String zipFile;
+
+  @Option(name = "--in-ext", usage = "extension for input files")
+  private String inExt = ".txt";
+
+  @Option(name = "--out-ext", usage = "extension for output files")
+  private String outExt = ".html";
+
+  @Option(name = "--base-dir", usage = "base directory")
+  private File basedir;
+
+  @Option(name = "--tmp", usage = "temporary output path")
+  private File tmpdir;
+
+  @Option(name = "--mktmp", usage = "create a temporary output path")
+  private boolean mktmp;
+
+  @Option(name = "-a", usage = "a list of attributes, in the form key or key=value pair")
+  private List<String> attributes = new ArrayList<>();
+
+  @Option(
+      name = "--bazel",
+      usage = "bazel mode: generate multiple output files instead of a single zip file")
+  private boolean bazel;
+
+  @Option(name = "--revnumber-file", usage = "the file contains revnumber string")
+  private File revnumberFile;
+
+  @Argument(usage = "input files")
+  private List<String> inputFiles = new ArrayList<>();
+
+  private String revnumber;
+
+  public static String mapInFileToOutFile(String inFile, String inExt, String outExt) {
+    String basename = new File(inFile).getName();
+    if (basename.endsWith(inExt)) {
+      basename = basename.substring(0, basename.length() - inExt.length());
+    } else {
+      // Strip out the last extension
+      int pos = basename.lastIndexOf('.');
+      if (pos > 0) {
+        basename = basename.substring(0, pos);
+      }
+    }
+    return basename + outExt;
+  }
+
+  private Options createOptions(File base, File outputFile) {
+    OptionsBuilder optionsBuilder = OptionsBuilder.options();
+
+    optionsBuilder
+        .backend(backend)
+        .docType(DOCTYPE)
+        .eruby(ERUBY)
+        .safe(SafeMode.UNSAFE)
+        .baseDir(base)
+        .toFile(outputFile);
+
+    AttributesBuilder attributesBuilder = AttributesBuilder.attributes();
+    attributesBuilder.attributes(getAttributes());
+    if (revnumber != null) {
+      attributesBuilder.attribute(REVNUMBER_NAME, revnumber);
+    }
+    optionsBuilder.attributes(attributesBuilder.get());
+
+    return optionsBuilder.get();
+  }
+
+  private Map<String, Object> getAttributes() {
+    Map<String, Object> attributeValues = new HashMap<>();
+
+    for (String attribute : attributes) {
+      int equalsIndex = attribute.indexOf('=');
+      if (equalsIndex > -1) {
+        String name = attribute.substring(0, equalsIndex);
+        String value = attribute.substring(equalsIndex + 1, attribute.length());
+
+        attributeValues.put(name, value);
+      } else {
+        attributeValues.put(attribute, "");
+      }
+    }
+
+    return attributeValues;
+  }
+
+  private void invoke(String... parameters) throws IOException {
+    CmdLineParser parser = new CmdLineParser(this, ParserProperties.defaults().withAtSyntax(false));
+    try {
+      parser.parseArgument(parameters);
+      if (inputFiles.isEmpty()) {
+        throw new IllegalArgumentException("asciidoctor: FAILED: input file missing");
+      }
+    } catch (CmdLineException | IllegalArgumentException e) {
+      System.err.println(e.getMessage());
+      parser.printUsage(System.err);
+      System.exit(1);
+      return;
+    }
+
+    if (revnumberFile != null) {
+      try (BufferedReader reader = Files.newBufferedReader(revnumberFile.toPath(), UTF_8)) {
+        revnumber = reader.readLine();
+      }
+    }
+
+    if (mktmp) {
+      tmpdir = Files.createTempDirectory("asciidoctor-").toFile();
+    }
+
+    if (bazel) {
+      renderFiles(inputFiles, null);
+    } else {
+      try (ZipOutputStream zip = new ZipOutputStream(Files.newOutputStream(Paths.get(zipFile)))) {
+        renderFiles(inputFiles, zip);
+
+        File[] cssFiles =
+            tmpdir.listFiles(
+                new FilenameFilter() {
+                  @Override
+                  public boolean accept(File dir, String name) {
+                    return name.endsWith(".css");
+                  }
+                });
+        for (File css : cssFiles) {
+          zipFile(css, css.getName(), zip);
+        }
+      }
+    }
+  }
+
+  private void renderFiles(List<String> inputFiles, ZipOutputStream zip) throws IOException {
+    Asciidoctor asciidoctor = JRubyAsciidoctor.create();
+    for (String inputFile : inputFiles) {
+      String outName = mapInFileToOutFile(inputFile, inExt, outExt);
+      File out = bazel ? new File(outName) : new File(tmpdir, outName);
+      if (!bazel) {
+        out.getParentFile().mkdirs();
+      }
+      File input = new File(inputFile);
+      Options options = createOptions(basedir != null ? basedir : input.getParentFile(), out);
+      asciidoctor.renderFile(input, options);
+      if (zip != null) {
+        zipFile(out, outName, zip);
+      }
+    }
+  }
+
+  public static void zipFile(File file, String name, ZipOutputStream zip) throws IOException {
+    zip.putNextEntry(new ZipEntry(name));
+    try (InputStream input = Files.newInputStream(file.toPath())) {
+      ByteStreams.copy(input, zip);
+    }
+    zip.closeEntry();
+  }
+
+  public static void main(String[] args) {
+    try {
+      new AsciiDoctor().invoke(args);
+    } catch (IOException e) {
+      System.err.println(e.getMessage());
+      System.exit(1);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/asciidoctor/BUILD b/java/com/google/gerrit/asciidoctor/BUILD
new file mode 100644
index 0000000..f5178a0
--- /dev/null
+++ b/java/com/google/gerrit/asciidoctor/BUILD
@@ -0,0 +1,38 @@
+java_binary(
+    name = "asciidoc",
+    main_class = "com.google.gerrit.asciidoctor.AsciiDoctor",
+    visibility = ["//visibility:public"],
+    runtime_deps = [":asciidoc_lib"],
+)
+
+java_library(
+    name = "asciidoc_lib",
+    srcs = ["AsciiDoctor.java"],
+    visibility = ["//tools/eclipse:__pkg__"],
+    deps = [
+        "//lib:args4j",
+        "//lib:guava",
+        "//lib/asciidoctor",
+    ],
+)
+
+java_binary(
+    name = "doc_indexer",
+    main_class = "com.google.gerrit.asciidoctor.DocIndexer",
+    visibility = ["//visibility:public"],
+    runtime_deps = [":doc_indexer_lib"],
+)
+
+java_library(
+    name = "doc_indexer_lib",
+    srcs = ["DocIndexer.java"],
+    visibility = ["//tools/eclipse:__pkg__"],
+    deps = [
+        ":asciidoc_lib",
+        "//java/com/google/gerrit/server:constants",
+        "//lib:args4j",
+        "//lib:guava",
+        "//lib/lucene:lucene-analyzers-common",
+        "//lib/lucene:lucene-core-and-backward-codecs",
+    ],
+)
diff --git a/java/com/google/gerrit/asciidoctor/DocIndexer.java b/java/com/google/gerrit/asciidoctor/DocIndexer.java
new file mode 100644
index 0000000..513bdd7
--- /dev/null
+++ b/java/com/google/gerrit/asciidoctor/DocIndexer.java
@@ -0,0 +1,163 @@
+// Copyright (C) 2013 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.google.gerrit.asciidoctor;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.gerrit.server.documentation.Constants;
+import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.jar.JarEntry;
+import java.util.jar.JarOutputStream;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+import org.apache.lucene.analysis.CharArraySet;
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field;
+import org.apache.lucene.document.StringField;
+import org.apache.lucene.document.TextField;
+import org.apache.lucene.index.IndexWriter;
+import org.apache.lucene.index.IndexWriterConfig;
+import org.apache.lucene.index.IndexWriterConfig.OpenMode;
+import org.apache.lucene.store.IndexInput;
+import org.apache.lucene.store.RAMDirectory;
+import org.kohsuke.args4j.Argument;
+import org.kohsuke.args4j.CmdLineException;
+import org.kohsuke.args4j.CmdLineParser;
+import org.kohsuke.args4j.Option;
+import org.kohsuke.args4j.ParserProperties;
+
+public class DocIndexer {
+  private static final Pattern SECTION_HEADER = Pattern.compile("^=+ (.*)");
+
+  @Option(name = "-o", usage = "output JAR file")
+  private String outFile;
+
+  @Option(name = "--prefix", usage = "prefix for the html filepath")
+  private String prefix = "";
+
+  @Option(name = "--in-ext", usage = "extension for input files")
+  private String inExt = ".txt";
+
+  @Option(name = "--out-ext", usage = "extension for output files")
+  private String outExt = ".html";
+
+  @Argument(usage = "input files")
+  private List<String> inputFiles = new ArrayList<>();
+
+  private void invoke(String... parameters) throws IOException {
+    CmdLineParser parser = new CmdLineParser(this, ParserProperties.defaults().withAtSyntax(false));
+    try {
+      parser.parseArgument(parameters);
+      if (inputFiles.isEmpty()) {
+        throw new IllegalArgumentException("FAILED: input file missing");
+      }
+    } catch (CmdLineException | IllegalArgumentException e) {
+      System.err.println(e.getMessage());
+      parser.printUsage(System.err);
+      System.exit(1);
+      return;
+    }
+
+    try (JarOutputStream jar = new JarOutputStream(Files.newOutputStream(Paths.get(outFile)))) {
+      byte[] compressedIndex = zip(index());
+      JarEntry entry = new JarEntry(String.format("%s/%s", Constants.PACKAGE, Constants.INDEX_ZIP));
+      entry.setSize(compressedIndex.length);
+      jar.putNextEntry(entry);
+      jar.write(compressedIndex);
+      jar.closeEntry();
+    }
+  }
+
+  private RAMDirectory index()
+      throws IOException, UnsupportedEncodingException, FileNotFoundException {
+    RAMDirectory directory = new RAMDirectory();
+    IndexWriterConfig config = new IndexWriterConfig(new StandardAnalyzer(CharArraySet.EMPTY_SET));
+    config.setOpenMode(OpenMode.CREATE);
+    config.setCommitOnClose(true);
+    try (IndexWriter iwriter = new IndexWriter(directory, config)) {
+      for (String inputFile : inputFiles) {
+        File file = new File(inputFile);
+        if (file.length() == 0) {
+          continue;
+        }
+
+        String title;
+        try (BufferedReader titleReader = Files.newBufferedReader(file.toPath(), UTF_8)) {
+          title = titleReader.readLine();
+          if (title != null && title.startsWith("[[")) {
+            // Generally the first line of the txt is the title. In a few cases the
+            // first line is a "[[tag]]" and the second line is the title.
+            title = titleReader.readLine();
+          }
+        }
+        Matcher matcher = SECTION_HEADER.matcher(title);
+        if (matcher.matches()) {
+          title = matcher.group(1);
+        }
+
+        String outputFile = AsciiDoctor.mapInFileToOutFile(inputFile, inExt, outExt);
+        try (BufferedReader reader = Files.newBufferedReader(file.toPath(), UTF_8)) {
+          Document doc = new Document();
+          doc.add(new TextField(Constants.DOC_FIELD, reader));
+          doc.add(new StringField(Constants.URL_FIELD, prefix + outputFile, Field.Store.YES));
+          doc.add(new TextField(Constants.TITLE_FIELD, title, Field.Store.YES));
+          iwriter.addDocument(doc);
+        }
+      }
+    }
+    return directory;
+  }
+
+  private byte[] zip(RAMDirectory dir) throws IOException {
+    ByteArrayOutputStream buf = new ByteArrayOutputStream();
+    try (ZipOutputStream zip = new ZipOutputStream(buf)) {
+      for (String name : dir.listAll()) {
+        try (IndexInput in = dir.openInput(name, null)) {
+          int len = (int) in.length();
+          byte[] tmp = new byte[len];
+          ZipEntry entry = new ZipEntry(name);
+          entry.setSize(len);
+          in.readBytes(tmp, 0, len);
+          zip.putNextEntry(entry);
+          zip.write(tmp, 0, len);
+          zip.closeEntry();
+        }
+      }
+    }
+
+    return buf.toByteArray();
+  }
+
+  public static void main(String[] args) {
+    try {
+      new DocIndexer().invoke(args);
+    } catch (IOException e) {
+      System.err.println(e.getMessage());
+      System.exit(1);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/common/BUILD b/java/com/google/gerrit/common/BUILD
new file mode 100644
index 0000000..aa99a4f
--- /dev/null
+++ b/java/com/google/gerrit/common/BUILD
@@ -0,0 +1,71 @@
+load("//tools/bzl:gwt.bzl", "gwt_module")
+
+ANNOTATIONS = [
+    "Nullable.java",
+    "audit/Audit.java",
+    "auth/SignInRequired.java",
+]
+
+java_library(
+    name = "annotations",
+    srcs = ANNOTATIONS,
+    visibility = ["//visibility:public"],
+)
+
+gwt_module(
+    name = "client",
+    srcs = glob(["**/*.java"]),
+    exported_deps = [
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/prettify:client",
+        "//lib:guava",
+        "//lib:gwtorm-client",
+        "//lib:servlet-api-3_1",
+        "//lib/auto:auto-value",
+        "//lib/auto:auto-value-annotations",
+        "//lib/flogger:api",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+    ],
+    gwt_xml = "Common.gwt.xml",
+    visibility = ["//visibility:public"],
+)
+
+java_library(
+    name = "server",
+    srcs = glob(
+        ["**/*.java"],
+        exclude = ANNOTATIONS,
+    ),
+    visibility = ["//visibility:public"],
+    deps = [
+        ":annotations",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/prettify:server",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/org/eclipse/jgit:server",
+        "//lib:guava",
+        "//lib:gwtjsonrpc",
+        "//lib:gwtorm",
+        "//lib:servlet-api-3_1",
+        "//lib/auto:auto-value",
+        "//lib/auto:auto-value-annotations",
+        "//lib/flogger:api",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+    ],
+)
+
+# ":version" should not be in the dependency graph of the acceptance
+# tests to avoid spurious test re-runs. That's because the content of
+# //:version.txt is changed when the outcome of `git describe` is changed.
+java_library(
+    name = "version",
+    resources = [":Version"],
+    visibility = ["//visibility:public"],
+)
+
+genrule(
+    name = "gen_version",
+    srcs = ["//:version.txt"],
+    outs = ["Version"],
+    cmd = "cat $< > $@",
+)
diff --git a/java/com/google/gerrit/common/Common.gwt.xml b/java/com/google/gerrit/common/Common.gwt.xml
new file mode 100644
index 0000000..56bbb84
--- /dev/null
+++ b/java/com/google/gerrit/common/Common.gwt.xml
@@ -0,0 +1,24 @@
+<!--
+ Copyright (C) 2009 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.
+-->
+<module>
+  <inherits name='com.google.gerrit.reviewdb.ReviewDB' />
+  <inherits name='com.google.gwtjsonrpc.GWTJSONRPC'/>
+  <inherits name="com.google.gwt.logging.Logging"/>
+  <source path="">
+    <exclude name='**/testing/**/*.java'/>
+    <include name='**/*.java'/>
+  </source>
+</module>
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/Die.java b/java/com/google/gerrit/common/Die.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/Die.java
rename to java/com/google/gerrit/common/Die.java
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/FileUtil.java b/java/com/google/gerrit/common/FileUtil.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/FileUtil.java
rename to java/com/google/gerrit/common/FileUtil.java
diff --git a/java/com/google/gerrit/common/FooterConstants.java b/java/com/google/gerrit/common/FooterConstants.java
new file mode 100644
index 0000000..d76c92b
--- /dev/null
+++ b/java/com/google/gerrit/common/FooterConstants.java
@@ -0,0 +1,33 @@
+// Copyright (C) 2014 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.google.gerrit.common;
+
+import com.google.common.annotations.GwtIncompatible;
+import org.eclipse.jgit.revwalk.FooterKey;
+
+@GwtIncompatible("Unemulated com.google.gerrit.common.FooterConstants")
+public class FooterConstants {
+  /** The change ID as used to track patch sets. */
+  public static final FooterKey CHANGE_ID = new FooterKey("Change-Id");
+
+  /** The footer telling us who reviewed the change. */
+  public static final FooterKey REVIEWED_BY = new FooterKey("Reviewed-by");
+
+  /** The footer telling us the URL where the review took place. */
+  public static final FooterKey REVIEWED_ON = new FooterKey("Reviewed-on");
+
+  /** The footer telling us who tested the change. */
+  public static final FooterKey TESTED_BY = new FooterKey("Tested-by");
+}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/FormatUtil.java b/java/com/google/gerrit/common/FormatUtil.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/FormatUtil.java
rename to java/com/google/gerrit/common/FormatUtil.java
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/IoUtil.java b/java/com/google/gerrit/common/IoUtil.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/IoUtil.java
rename to java/com/google/gerrit/common/IoUtil.java
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/Nullable.java b/java/com/google/gerrit/common/Nullable.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/Nullable.java
rename to java/com/google/gerrit/common/Nullable.java
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/PageLinks.java b/java/com/google/gerrit/common/PageLinks.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/PageLinks.java
rename to java/com/google/gerrit/common/PageLinks.java
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/PluginData.java b/java/com/google/gerrit/common/PluginData.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/PluginData.java
rename to java/com/google/gerrit/common/PluginData.java
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/ProjectAccessUtil.java b/java/com/google/gerrit/common/ProjectAccessUtil.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/ProjectAccessUtil.java
rename to java/com/google/gerrit/common/ProjectAccessUtil.java
diff --git a/java/com/google/gerrit/common/ProjectUtil.java b/java/com/google/gerrit/common/ProjectUtil.java
new file mode 100644
index 0000000..e9d3781
--- /dev/null
+++ b/java/com/google/gerrit/common/ProjectUtil.java
@@ -0,0 +1,43 @@
+// Copyright (C) 2013 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.google.gerrit.common;
+
+public class ProjectUtil {
+  public static String sanitizeProjectName(String name) {
+    name = stripGitSuffix(name);
+    name = stripTrailingSlash(name);
+    return name;
+  }
+
+  public static String stripGitSuffix(String name) {
+    if (name.endsWith(".git")) {
+      // Be nice and drop the trailing ".git" suffix, which we never keep
+      // in our database, but clients might mistakenly provide anyway.
+      //
+      name = name.substring(0, name.length() - 4);
+      name = stripTrailingSlash(name);
+    }
+    return name;
+  }
+
+  private static String stripTrailingSlash(String name) {
+    while (name.endsWith("/")) {
+      name = name.substring(0, name.length() - 1);
+    }
+    return name;
+  }
+
+  private ProjectUtil() {}
+}
diff --git a/java/com/google/gerrit/common/RawInputUtil.java b/java/com/google/gerrit/common/RawInputUtil.java
new file mode 100644
index 0000000..e102eab
--- /dev/null
+++ b/java/com/google/gerrit/common/RawInputUtil.java
@@ -0,0 +1,77 @@
+// 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.
+
+package com.google.gerrit.common;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.annotations.GwtIncompatible;
+import com.google.gerrit.extensions.restapi.RawInput;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import javax.servlet.http.HttpServletRequest;
+
+@GwtIncompatible("Unemulated classes in java.io and javax.servlet")
+public class RawInputUtil {
+  public static RawInput create(String content) {
+    return create(content.getBytes(UTF_8));
+  }
+
+  public static RawInput create(byte[] bytes, String contentType) {
+    requireNonNull(bytes);
+    checkArgument(bytes.length > 0);
+    return new RawInput() {
+      @Override
+      public InputStream getInputStream() throws IOException {
+        return new ByteArrayInputStream(bytes);
+      }
+
+      @Override
+      public String getContentType() {
+        return contentType;
+      }
+
+      @Override
+      public long getContentLength() {
+        return bytes.length;
+      }
+    };
+  }
+
+  public static RawInput create(byte[] bytes) {
+    return create(bytes, "application/octet-stream");
+  }
+
+  public static RawInput create(HttpServletRequest req) {
+    return new RawInput() {
+      @Override
+      public String getContentType() {
+        return req.getContentType();
+      }
+
+      @Override
+      public long getContentLength() {
+        return req.getContentLength();
+      }
+
+      @Override
+      public InputStream getInputStream() throws IOException {
+        return req.getInputStream();
+      }
+    };
+  }
+}
diff --git a/java/com/google/gerrit/common/SiteLibraryLoaderUtil.java b/java/com/google/gerrit/common/SiteLibraryLoaderUtil.java
new file mode 100644
index 0000000..cf86f74
--- /dev/null
+++ b/java/com/google/gerrit/common/SiteLibraryLoaderUtil.java
@@ -0,0 +1,77 @@
+// Copyright (C) 2014 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.google.gerrit.common;
+
+import static com.google.common.flogger.LazyArgs.lazy;
+import static com.google.gerrit.common.FileUtil.lastModified;
+import static java.util.stream.Collectors.joining;
+
+import com.google.common.annotations.GwtIncompatible;
+import com.google.common.collect.ComparisonChain;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Ordering;
+import com.google.common.flogger.FluentLogger;
+import java.io.IOException;
+import java.nio.file.DirectoryStream;
+import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
+import java.nio.file.Path;
+import java.util.List;
+
+@GwtIncompatible("Unemulated classes in java.nio and Guava")
+public final class SiteLibraryLoaderUtil {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static void loadSiteLib(Path libdir) {
+    try {
+      List<Path> jars = listJars(libdir);
+      IoUtil.loadJARs(jars);
+      logger.atFine().log("Loaded site libraries: %s", lazy(() -> jarList(jars)));
+    } catch (IOException e) {
+      logger.atSevere().withCause(e).log("Error scanning lib directory %s", libdir);
+    }
+  }
+
+  private static String jarList(List<Path> jars) {
+    return jars.stream().map(p -> p.getFileName().toString()).collect(joining(","));
+  }
+
+  public static List<Path> listJars(Path dir) throws IOException {
+    DirectoryStream.Filter<Path> filter =
+        new DirectoryStream.Filter<Path>() {
+          @Override
+          public boolean accept(Path entry) throws IOException {
+            String name = entry.getFileName().toString();
+            return (name.endsWith(".jar") || name.endsWith(".zip")) && Files.isRegularFile(entry);
+          }
+        };
+    try (DirectoryStream<Path> jars = Files.newDirectoryStream(dir, filter)) {
+      return new Ordering<Path>() {
+        @Override
+        public int compare(Path a, Path b) {
+          // Sort by reverse last-modified time so newer JARs are first.
+          return ComparisonChain.start()
+              .compare(lastModified(b), lastModified(a))
+              .compare(a, b)
+              .result();
+        }
+      }.sortedCopy(jars);
+    } catch (NoSuchFileException nsfe) {
+      return ImmutableList.of();
+    }
+  }
+
+  private SiteLibraryLoaderUtil() {}
+}
diff --git a/java/com/google/gerrit/common/Version.java b/java/com/google/gerrit/common/Version.java
new file mode 100644
index 0000000..b8d3b67
--- /dev/null
+++ b/java/com/google/gerrit/common/Version.java
@@ -0,0 +1,65 @@
+// Copyright (C) 2009 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.google.gerrit.common;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.annotations.GwtIncompatible;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.flogger.FluentLogger;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+@GwtIncompatible("Unemulated com.google.gerrit.common.Version")
+public class Version {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  @VisibleForTesting static final String DEV = "(dev)";
+
+  private static final String VERSION;
+
+  public static String getVersion() {
+    return VERSION;
+  }
+
+  static {
+    VERSION = loadVersion();
+  }
+
+  private static String loadVersion() {
+    try (InputStream in = Version.class.getResourceAsStream("Version")) {
+      if (in == null) {
+        return DEV;
+      }
+      try (BufferedReader r = new BufferedReader(new InputStreamReader(in, UTF_8))) {
+        String vs = r.readLine();
+        if (vs != null && vs.startsWith("v")) {
+          vs = vs.substring(1);
+        }
+        if (vs != null && vs.isEmpty()) {
+          vs = null;
+        }
+        return vs;
+      }
+    } catch (IOException e) {
+      logger.atSevere().withCause(e).log(e.getMessage());
+      return "(unknown version)";
+    }
+  }
+
+  private Version() {}
+}
diff --git a/java/com/google/gerrit/common/audit/Audit.java b/java/com/google/gerrit/common/audit/Audit.java
new file mode 100644
index 0000000..a791e97
--- /dev/null
+++ b/java/com/google/gerrit/common/audit/Audit.java
@@ -0,0 +1,35 @@
+// Copyright (C) 2012 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.google.gerrit.common.audit;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Audit annotation for JSON/RPC interfaces.
+ *
+ * <p>Flag with @Audit all the JSON/RPC methods to be traced in audit-trail and submitted to the
+ * GroupAuditService.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.METHOD})
+public @interface Audit {
+  String action() default "";
+
+  /** List of positions of parameters to be obfuscated in audit-trail (i.e. passwords) */
+  int[] obfuscate() default {};
+}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/auth/SignInRequired.java b/java/com/google/gerrit/common/auth/SignInRequired.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/auth/SignInRequired.java
rename to java/com/google/gerrit/common/auth/SignInRequired.java
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/auth/openid/OpenIdUrls.java b/java/com/google/gerrit/common/auth/openid/OpenIdUrls.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/auth/openid/OpenIdUrls.java
rename to java/com/google/gerrit/common/auth/openid/OpenIdUrls.java
diff --git a/java/com/google/gerrit/common/data/AccessSection.java b/java/com/google/gerrit/common/data/AccessSection.java
new file mode 100644
index 0000000..49948f8f
--- /dev/null
+++ b/java/com/google/gerrit/common/data/AccessSection.java
@@ -0,0 +1,168 @@
+// Copyright (C) 2010 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.google.gerrit.common.data;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Project;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/** Portion of a {@link Project} describing access rules. */
+public class AccessSection extends RefConfigSection implements Comparable<AccessSection> {
+  /** Special name given to the global capabilities; not a valid reference. */
+  public static final String GLOBAL_CAPABILITIES = "GLOBAL_CAPABILITIES";
+
+  protected List<Permission> permissions;
+
+  protected AccessSection() {}
+
+  public AccessSection(String refPattern) {
+    super(refPattern);
+  }
+
+  // TODO(ekempin): Make this method return an ImmutableList once the GWT UI is gone.
+  public List<Permission> getPermissions() {
+    if (permissions == null) {
+      return new ArrayList<>();
+    }
+    return new ArrayList<>(permissions);
+  }
+
+  public void setPermissions(List<Permission> list) {
+    requireNonNull(list);
+
+    Set<String> names = new HashSet<>();
+    for (Permission p : list) {
+      if (!names.add(p.getName().toLowerCase())) {
+        throw new IllegalArgumentException();
+      }
+    }
+
+    permissions = new ArrayList<>(list);
+  }
+
+  @Nullable
+  public Permission getPermission(String name) {
+    return getPermission(name, false);
+  }
+
+  @Nullable
+  public Permission getPermission(String name, boolean create) {
+    requireNonNull(name);
+
+    if (permissions != null) {
+      for (Permission p : permissions) {
+        if (p.getName().equalsIgnoreCase(name)) {
+          return p;
+        }
+      }
+    }
+
+    if (create) {
+      if (permissions == null) {
+        permissions = new ArrayList<>();
+      }
+
+      Permission p = new Permission(name);
+      permissions.add(p);
+      return p;
+    }
+
+    return null;
+  }
+
+  public void addPermission(Permission permission) {
+    requireNonNull(permission);
+
+    if (permissions == null) {
+      permissions = new ArrayList<>();
+    }
+
+    for (Permission p : permissions) {
+      if (p.getName().equalsIgnoreCase(permission.getName())) {
+        throw new IllegalArgumentException();
+      }
+    }
+
+    permissions.add(permission);
+  }
+
+  public void remove(Permission permission) {
+    requireNonNull(permission);
+    removePermission(permission.getName());
+  }
+
+  public void removePermission(String name) {
+    requireNonNull(name);
+
+    if (permissions != null) {
+      permissions.removeIf(permission -> name.equalsIgnoreCase(permission.getName()));
+    }
+  }
+
+  public void mergeFrom(AccessSection section) {
+    requireNonNull(section);
+
+    for (Permission src : section.getPermissions()) {
+      Permission dst = getPermission(src.getName());
+      if (dst != null) {
+        dst.mergeFrom(src);
+      } else {
+        permissions.add(src);
+      }
+    }
+  }
+
+  @Override
+  public int compareTo(AccessSection o) {
+    return comparePattern().compareTo(o.comparePattern());
+  }
+
+  private String comparePattern() {
+    if (getName().startsWith(REGEX_PREFIX)) {
+      return getName().substring(REGEX_PREFIX.length());
+    }
+    return getName();
+  }
+
+  @Override
+  public String toString() {
+    return "AccessSection[" + getName() + "]";
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (!super.equals(obj) || !(obj instanceof AccessSection)) {
+      return false;
+    }
+    return new HashSet<>(getPermissions())
+        .equals(new HashSet<>(((AccessSection) obj).getPermissions()));
+  }
+
+  @Override
+  public int hashCode() {
+    int hashCode = super.hashCode();
+    if (permissions != null) {
+      for (Permission permission : permissions) {
+        hashCode += permission.hashCode();
+      }
+    }
+    return hashCode;
+  }
+}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/Capable.java b/java/com/google/gerrit/common/data/Capable.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/data/Capable.java
rename to java/com/google/gerrit/common/data/Capable.java
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/CommentDetail.java b/java/com/google/gerrit/common/data/CommentDetail.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/data/CommentDetail.java
rename to java/com/google/gerrit/common/data/CommentDetail.java
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/ContributorAgreement.java b/java/com/google/gerrit/common/data/ContributorAgreement.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/data/ContributorAgreement.java
rename to java/com/google/gerrit/common/data/ContributorAgreement.java
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/FilenameComparator.java b/java/com/google/gerrit/common/data/FilenameComparator.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/data/FilenameComparator.java
rename to java/com/google/gerrit/common/data/FilenameComparator.java
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/GarbageCollectionResult.java b/java/com/google/gerrit/common/data/GarbageCollectionResult.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/data/GarbageCollectionResult.java
rename to java/com/google/gerrit/common/data/GarbageCollectionResult.java
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/GitwebType.java b/java/com/google/gerrit/common/data/GitwebType.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/data/GitwebType.java
rename to java/com/google/gerrit/common/data/GitwebType.java
diff --git a/java/com/google/gerrit/common/data/GlobalCapability.java b/java/com/google/gerrit/common/data/GlobalCapability.java
new file mode 100644
index 0000000..3e11256
--- /dev/null
+++ b/java/com/google/gerrit/common/data/GlobalCapability.java
@@ -0,0 +1,201 @@
+// Copyright (C) 2011 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.google.gerrit.common.data;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+/** Server wide capabilities. Represented as {@link Permission} objects. */
+public class GlobalCapability {
+  /** Ability to access the database (with gsql). */
+  public static final String ACCESS_DATABASE = "accessDatabase";
+
+  /**
+   * Denotes the server's administrators.
+   *
+   * <p>This is similar to UNIX root, or Windows SYSTEM account. Any user that has this capability
+   * can perform almost any other action, or can grant themselves the power to perform any other
+   * action on the site. Most of the other capabilities and permissions fall-back to the predicate
+   * "OR user has capability ADMINISTRATE_SERVER".
+   */
+  public static final String ADMINISTRATE_SERVER = "administrateServer";
+
+  /** Maximum number of changes that may be pushed in a batch. */
+  public static final String BATCH_CHANGES_LIMIT = "batchChangesLimit";
+
+  /**
+   * Default maximum number of changes that may be pushed in a batch, 0 means no limit. This is just
+   * used as a suggestion for prepopulating the field in the access UI.
+   */
+  public static final int DEFAULT_MAX_BATCH_CHANGES_LIMIT = 0;
+
+  /** Can create any account on the server. */
+  public static final String CREATE_ACCOUNT = "createAccount";
+
+  /** Can create any group on the server. */
+  public static final String CREATE_GROUP = "createGroup";
+
+  /** Can create any project on the server. */
+  public static final String CREATE_PROJECT = "createProject";
+
+  /**
+   * Denotes who may email change reviewers and watchers.
+   *
+   * <p>This can be used to deny build bots from emailing reviewers and people who watch the change.
+   * Instead, only the authors of the change and those who starred it will be emailed. The allow
+   * rules are evaluated before deny rules, however the default is to allow emailing, if no explicit
+   * rule is matched.
+   */
+  public static final String EMAIL_REVIEWERS = "emailReviewers";
+
+  /** Can flush any cache except the active web_sessions cache. */
+  public static final String FLUSH_CACHES = "flushCaches";
+
+  /** Can terminate any task using the kill command. */
+  public static final String KILL_TASK = "killTask";
+
+  /**
+   * Can perform limited server maintenance.
+   *
+   * <p>Includes tasks such as reindexing changes and flushing caches that may need to be performed
+   * regularly. Does <strong>not</strong> grant arbitrary read/write/ACL management permissions as
+   * does {@link #ADMINISTRATE_SERVER}.
+   */
+  public static final String MAINTAIN_SERVER = "maintainServer";
+
+  /** Can modify any account on the server. */
+  public static final String MODIFY_ACCOUNT = "modifyAccount";
+
+  /** Queue a user can access to submit their tasks to. */
+  public static final String PRIORITY = "priority";
+
+  /** Maximum result limit per executed query. */
+  public static final String QUERY_LIMIT = "queryLimit";
+
+  /** Default result limit per executed query. */
+  public static final int DEFAULT_MAX_QUERY_LIMIT = 500;
+
+  /** Can impersonate any user to see which refs they can read. */
+  public static final String READ_AS = "readAs";
+
+  /** Ability to impersonate another user. */
+  public static final String RUN_AS = "runAs";
+
+  /** Can run the Git garbage collection. */
+  public static final String RUN_GC = "runGC";
+
+  /** Can perform streaming of Gerrit events. */
+  public static final String STREAM_EVENTS = "streamEvents";
+
+  /** Can view all accounts, regardless of {@code accounts.visibility}. */
+  public static final String VIEW_ALL_ACCOUNTS = "viewAllAccounts";
+
+  /** Can view the server's current cache states. */
+  public static final String VIEW_CACHES = "viewCaches";
+
+  /** Can view open connections to the server's SSH port. */
+  public static final String VIEW_CONNECTIONS = "viewConnections";
+
+  /** Can view all installed plugins. */
+  public static final String VIEW_PLUGINS = "viewPlugins";
+
+  /** Can view all pending tasks in the queue (not just the filtered set). */
+  public static final String VIEW_QUEUE = "viewQueue";
+
+  /** Can query permissions for any (project, user) pair */
+  public static final String VIEW_ACCESS = "viewAccess";
+
+  private static final List<String> NAMES_ALL;
+  private static final List<String> NAMES_LC;
+  private static final String[] RANGE_NAMES = {
+    QUERY_LIMIT, BATCH_CHANGES_LIMIT,
+  };
+
+  static {
+    NAMES_ALL = new ArrayList<>();
+    NAMES_ALL.add(ACCESS_DATABASE);
+    NAMES_ALL.add(ADMINISTRATE_SERVER);
+    NAMES_ALL.add(BATCH_CHANGES_LIMIT);
+    NAMES_ALL.add(CREATE_ACCOUNT);
+    NAMES_ALL.add(CREATE_GROUP);
+    NAMES_ALL.add(CREATE_PROJECT);
+    NAMES_ALL.add(EMAIL_REVIEWERS);
+    NAMES_ALL.add(FLUSH_CACHES);
+    NAMES_ALL.add(KILL_TASK);
+    NAMES_ALL.add(MAINTAIN_SERVER);
+    NAMES_ALL.add(MODIFY_ACCOUNT);
+    NAMES_ALL.add(PRIORITY);
+    NAMES_ALL.add(QUERY_LIMIT);
+    NAMES_ALL.add(READ_AS);
+    NAMES_ALL.add(RUN_AS);
+    NAMES_ALL.add(RUN_GC);
+    NAMES_ALL.add(STREAM_EVENTS);
+    NAMES_ALL.add(VIEW_ALL_ACCOUNTS);
+    NAMES_ALL.add(VIEW_CACHES);
+    NAMES_ALL.add(VIEW_CONNECTIONS);
+    NAMES_ALL.add(VIEW_PLUGINS);
+    NAMES_ALL.add(VIEW_QUEUE);
+    NAMES_ALL.add(VIEW_ACCESS);
+
+    NAMES_LC = new ArrayList<>(NAMES_ALL.size());
+    for (String name : NAMES_ALL) {
+      NAMES_LC.add(name.toLowerCase());
+    }
+  }
+
+  /** @return all valid capability names. */
+  public static Collection<String> getAllNames() {
+    return Collections.unmodifiableList(NAMES_ALL);
+  }
+
+  /** @return true if the name is recognized as a capability name. */
+  public static boolean isGlobalCapability(String varName) {
+    return NAMES_LC.contains(varName.toLowerCase());
+  }
+
+  /** @return true if the capability should have a range attached. */
+  public static boolean hasRange(String varName) {
+    for (String n : RANGE_NAMES) {
+      if (n.equalsIgnoreCase(varName)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  public static List<String> getRangeNames() {
+    return Collections.unmodifiableList(Arrays.asList(RANGE_NAMES));
+  }
+
+  /** @return the valid range for the capability if it has one, otherwise null. */
+  public static PermissionRange.WithDefaults getRange(String varName) {
+    if (QUERY_LIMIT.equalsIgnoreCase(varName)) {
+      return new PermissionRange.WithDefaults(
+          varName, 0, Integer.MAX_VALUE, 0, DEFAULT_MAX_QUERY_LIMIT);
+    }
+    if (BATCH_CHANGES_LIMIT.equalsIgnoreCase(varName)) {
+      return new PermissionRange.WithDefaults(
+          varName, 0, Integer.MAX_VALUE, 0, DEFAULT_MAX_BATCH_CHANGES_LIMIT);
+    }
+    return null;
+  }
+
+  private GlobalCapability() {
+    // Utility class, do not create instances.
+  }
+}
diff --git a/java/com/google/gerrit/common/data/GroupDescription.java b/java/com/google/gerrit/common/data/GroupDescription.java
new file mode 100644
index 0000000..d22b94b
--- /dev/null
+++ b/java/com/google/gerrit/common/data/GroupDescription.java
@@ -0,0 +1,68 @@
+// Copyright (C) 2012 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.google.gerrit.common.data;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import java.sql.Timestamp;
+import java.util.Set;
+
+/** Group methods exposed by the GroupBackend. */
+public class GroupDescription {
+  /** The Basic information required to be exposed by any Group. */
+  public interface Basic {
+    /** @return the non-null UUID of the group. */
+    AccountGroup.UUID getGroupUUID();
+
+    /** @return the non-null name of the group. */
+    String getName();
+
+    /**
+     * @return optional email address to send to the group's members. If provided, Gerrit will use
+     *     this email address to send change notifications to the group.
+     */
+    @Nullable
+    String getEmailAddress();
+
+    /**
+     * @return optional URL to information about the group. Typically a URL to a web page that
+     *     permits users to apply to join the group, or manage their membership.
+     */
+    @Nullable
+    String getUrl();
+  }
+
+  /** The extended information exposed by internal groups. */
+  public interface Internal extends Basic {
+
+    AccountGroup.Id getId();
+
+    @Nullable
+    String getDescription();
+
+    AccountGroup.UUID getOwnerGroupUUID();
+
+    boolean isVisibleToAll();
+
+    Timestamp getCreatedOn();
+
+    Set<Account.Id> getMembers();
+
+    Set<AccountGroup.UUID> getSubgroups();
+  }
+
+  private GroupDescription() {}
+}
diff --git a/java/com/google/gerrit/common/data/GroupDetail.java b/java/com/google/gerrit/common/data/GroupDetail.java
new file mode 100644
index 0000000..1ac06db
--- /dev/null
+++ b/java/com/google/gerrit/common/data/GroupDetail.java
@@ -0,0 +1,37 @@
+// Copyright (C) 2008 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.google.gerrit.common.data;
+
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import java.util.Set;
+
+public class GroupDetail {
+  private Set<Account.Id> members;
+  private Set<AccountGroup.UUID> includes;
+
+  public GroupDetail(Set<Account.Id> members, Set<AccountGroup.UUID> includes) {
+    this.members = members;
+    this.includes = includes;
+  }
+
+  public Set<Account.Id> getMembers() {
+    return members;
+  }
+
+  public Set<AccountGroup.UUID> getIncludes() {
+    return includes;
+  }
+}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/GroupInfo.java b/java/com/google/gerrit/common/data/GroupInfo.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/data/GroupInfo.java
rename to java/com/google/gerrit/common/data/GroupInfo.java
diff --git a/java/com/google/gerrit/common/data/GroupReference.java b/java/com/google/gerrit/common/data/GroupReference.java
new file mode 100644
index 0000000..e5b0965
--- /dev/null
+++ b/java/com/google/gerrit/common/data/GroupReference.java
@@ -0,0 +1,108 @@
+// Copyright (C) 2010 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.google.gerrit.common.data;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+
+/** Describes a group within a projects {@link AccessSection}s. */
+public class GroupReference implements Comparable<GroupReference> {
+
+  private static final String PREFIX = "group ";
+
+  public static GroupReference forGroup(GroupDescription.Basic group) {
+    return new GroupReference(group.getGroupUUID(), group.getName());
+  }
+
+  public static boolean isGroupReference(String configValue) {
+    return configValue != null && configValue.startsWith(PREFIX);
+  }
+
+  @Nullable
+  public static String extractGroupName(String configValue) {
+    if (!isGroupReference(configValue)) {
+      return null;
+    }
+    return configValue.substring(PREFIX.length()).trim();
+  }
+
+  protected String uuid;
+  protected String name;
+
+  protected GroupReference() {}
+
+  /**
+   * Create a group reference.
+   *
+   * @param uuid UUID of the group, may be {@code null} if the group name couldn't be resolved
+   * @param name the group name, must not be {@code null}
+   */
+  public GroupReference(@Nullable AccountGroup.UUID uuid, String name) {
+    setUUID(uuid);
+    setName(name);
+  }
+
+  @Nullable
+  public AccountGroup.UUID getUUID() {
+    return uuid != null ? new AccountGroup.UUID(uuid) : null;
+  }
+
+  public void setUUID(@Nullable AccountGroup.UUID newUUID) {
+    uuid = newUUID != null ? newUUID.get() : null;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String newName) {
+    if (newName == null) {
+      throw new NullPointerException();
+    }
+    this.name = newName;
+  }
+
+  @Override
+  public int compareTo(GroupReference o) {
+    return uuid(this).compareTo(uuid(o));
+  }
+
+  private static String uuid(GroupReference a) {
+    if (a.getUUID() != null && a.getUUID().get() != null) {
+      return a.getUUID().get();
+    }
+
+    return "?";
+  }
+
+  @Override
+  public int hashCode() {
+    return uuid(this).hashCode();
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    return o instanceof GroupReference && compareTo((GroupReference) o) == 0;
+  }
+
+  public String toConfigValue() {
+    return PREFIX + name;
+  }
+
+  @Override
+  public String toString() {
+    return "Group[" + getName() + " / " + getUUID() + "]";
+  }
+}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/HostPageData.java b/java/com/google/gerrit/common/data/HostPageData.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/data/HostPageData.java
rename to java/com/google/gerrit/common/data/HostPageData.java
diff --git a/java/com/google/gerrit/common/data/LabelFunction.java b/java/com/google/gerrit/common/data/LabelFunction.java
new file mode 100644
index 0000000..7d13c70
--- /dev/null
+++ b/java/com/google/gerrit/common/data/LabelFunction.java
@@ -0,0 +1,123 @@
+// Copyright (C) 2017 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.google.gerrit.common.data;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Optional;
+
+/**
+ * Functions for determining submittability based on label votes.
+ *
+ * <p>Only describes built-in label functions. Admins can extend the logic arbitrarily using Prolog
+ * rules, in which case the choice of function in the project config is ignored.
+ *
+ * <p>Function semantics are documented in {@code config-labels.txt}, and actual behavior is
+ * implemented both in Prolog in {@code gerrit_common.pl} and in the {@link #check} method.
+ */
+public enum LabelFunction {
+  ANY_WITH_BLOCK("AnyWithBlock", true, false, false),
+  MAX_WITH_BLOCK("MaxWithBlock", true, true, true),
+  MAX_NO_BLOCK("MaxNoBlock", false, true, true),
+  NO_BLOCK("NoBlock"),
+  NO_OP("NoOp"),
+  PATCH_SET_LOCK("PatchSetLock");
+
+  public static final Map<String, LabelFunction> ALL;
+
+  static {
+    Map<String, LabelFunction> all = new LinkedHashMap<>();
+    for (LabelFunction f : values()) {
+      all.put(f.getFunctionName(), f);
+    }
+    ALL = Collections.unmodifiableMap(all);
+  }
+
+  public static Optional<LabelFunction> parse(@Nullable String str) {
+    return Optional.ofNullable(ALL.get(str));
+  }
+
+  private final String name;
+  private final boolean isBlock;
+  private final boolean isRequired;
+  private final boolean requiresMaxValue;
+
+  LabelFunction(String name) {
+    this(name, false, false, false);
+  }
+
+  LabelFunction(String name, boolean isBlock, boolean isRequired, boolean requiresMaxValue) {
+    this.name = name;
+    this.isBlock = isBlock;
+    this.isRequired = isRequired;
+    this.requiresMaxValue = requiresMaxValue;
+  }
+
+  /** The function name as defined in documentation and {@code project.config}. */
+  public String getFunctionName() {
+    return name;
+  }
+
+  /** Whether the label is a "block" label, meaning a minimum vote will prevent submission. */
+  public boolean isBlock() {
+    return isBlock;
+  }
+
+  /** Whether the label is a mandatory label, meaning absence of votes will prevent submission. */
+  public boolean isRequired() {
+    return isRequired;
+  }
+
+  /** Whether the label requires a vote with the maximum value to allow submission. */
+  public boolean isMaxValueRequired() {
+    return requiresMaxValue;
+  }
+
+  public SubmitRecord.Label check(LabelType labelType, Iterable<PatchSetApproval> approvals) {
+    SubmitRecord.Label submitRecordLabel = new SubmitRecord.Label();
+    submitRecordLabel.label = labelType.getName();
+
+    submitRecordLabel.status = SubmitRecord.Label.Status.MAY;
+    if (isRequired) {
+      submitRecordLabel.status = SubmitRecord.Label.Status.NEED;
+    }
+
+    for (PatchSetApproval a : approvals) {
+      if (a.getValue() == 0) {
+        continue;
+      }
+
+      if (isBlock && labelType.isMaxNegative(a)) {
+        submitRecordLabel.appliedBy = a.getAccountId();
+        submitRecordLabel.status = SubmitRecord.Label.Status.REJECT;
+        return submitRecordLabel;
+      }
+
+      if (labelType.isMaxPositive(a) || !requiresMaxValue) {
+        submitRecordLabel.appliedBy = a.getAccountId();
+
+        submitRecordLabel.status = SubmitRecord.Label.Status.MAY;
+        if (isRequired) {
+          submitRecordLabel.status = SubmitRecord.Label.Status.OK;
+        }
+      }
+    }
+
+    return submitRecordLabel;
+  }
+}
diff --git a/java/com/google/gerrit/common/data/LabelType.java b/java/com/google/gerrit/common/data/LabelType.java
new file mode 100644
index 0000000..ff7d25b
--- /dev/null
+++ b/java/com/google/gerrit/common/data/LabelType.java
@@ -0,0 +1,324 @@
+// Copyright (C) 2008 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.google.gerrit.common.data;
+
+import static java.util.Comparator.comparing;
+import static java.util.stream.Collectors.collectingAndThen;
+import static java.util.stream.Collectors.toList;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.LabelId;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class LabelType {
+  public static final boolean DEF_ALLOW_POST_SUBMIT = true;
+  public static final boolean DEF_CAN_OVERRIDE = true;
+  public static final boolean DEF_COPY_ALL_SCORES_IF_NO_CHANGE = true;
+  public static final boolean DEF_COPY_ALL_SCORES_IF_NO_CODE_CHANGE = false;
+  public static final boolean DEF_COPY_ALL_SCORES_ON_TRIVIAL_REBASE = false;
+  public static final boolean DEF_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE = false;
+  public static final boolean DEF_COPY_MAX_SCORE = false;
+  public static final boolean DEF_COPY_MIN_SCORE = false;
+  public static final boolean DEF_IGNORE_SELF_APPROVAL = false;
+
+  public static LabelType withDefaultValues(String name) {
+    checkName(name);
+    List<LabelValue> values = new ArrayList<>(2);
+    values.add(new LabelValue((short) 0, "Rejected"));
+    values.add(new LabelValue((short) 1, "Approved"));
+    return new LabelType(name, values);
+  }
+
+  public static String checkName(String name) {
+    checkNameInternal(name);
+    if ("SUBM".equals(name)) {
+      throw new IllegalArgumentException("Reserved label name \"" + name + "\"");
+    }
+    return name;
+  }
+
+  public static String checkNameInternal(String name) {
+    if (name == null || name.isEmpty()) {
+      throw new IllegalArgumentException("Empty label name");
+    }
+    for (int i = 0; i < name.length(); i++) {
+      char c = name.charAt(i);
+      if ((i == 0 && c == '-')
+          || !((c >= 'a' && c <= 'z')
+              || (c >= 'A' && c <= 'Z')
+              || (c >= '0' && c <= '9')
+              || c == '-')) {
+        throw new IllegalArgumentException("Illegal label name \"" + name + "\"");
+      }
+    }
+    return name;
+  }
+
+  private static List<LabelValue> sortValues(List<LabelValue> values) {
+    values = new ArrayList<>(values);
+    if (values.isEmpty()) {
+      return Collections.emptyList();
+    }
+    values = values.stream().sorted(comparing(LabelValue::getValue)).collect(toList());
+    short v = values.get(0).getValue();
+    short i = 0;
+    ArrayList<LabelValue> result = new ArrayList<>();
+    // Fill in any missing values with empty text.
+    while (i < values.size()) {
+      while (v < values.get(i).getValue()) {
+        result.add(new LabelValue(v++, ""));
+      }
+      v++;
+      result.add(values.get(i++));
+    }
+    result.trimToSize();
+    return Collections.unmodifiableList(result);
+  }
+
+  protected String name;
+
+  // String rather than LabelFunction for backwards compatibility with GWT JSON interface.
+  protected String functionName;
+
+  protected boolean copyMinScore;
+  protected boolean copyMaxScore;
+  protected boolean copyAllScoresOnMergeFirstParentUpdate;
+  protected boolean copyAllScoresOnTrivialRebase;
+  protected boolean copyAllScoresIfNoCodeChange;
+  protected boolean copyAllScoresIfNoChange;
+  protected boolean allowPostSubmit;
+  protected boolean ignoreSelfApproval;
+  protected short defaultValue;
+
+  protected List<LabelValue> values;
+  protected short maxNegative;
+  protected short maxPositive;
+
+  private transient boolean canOverride;
+  private transient List<String> refPatterns;
+  private transient Map<Short, LabelValue> byValue;
+
+  protected LabelType() {}
+
+  public LabelType(String name, List<LabelValue> valueList) {
+    this.name = checkName(name);
+    canOverride = true;
+    values = sortValues(valueList);
+    defaultValue = 0;
+
+    functionName = LabelFunction.MAX_WITH_BLOCK.getFunctionName();
+
+    maxNegative = Short.MIN_VALUE;
+    maxPositive = Short.MAX_VALUE;
+    if (values.size() > 0) {
+      if (values.get(0).getValue() < 0) {
+        maxNegative = values.get(0).getValue();
+      }
+      if (values.get(values.size() - 1).getValue() > 0) {
+        maxPositive = values.get(values.size() - 1).getValue();
+      }
+    }
+    setCanOverride(DEF_CAN_OVERRIDE);
+    setCopyAllScoresIfNoChange(DEF_COPY_ALL_SCORES_IF_NO_CHANGE);
+    setCopyAllScoresIfNoCodeChange(DEF_COPY_ALL_SCORES_IF_NO_CODE_CHANGE);
+    setCopyAllScoresOnTrivialRebase(DEF_COPY_ALL_SCORES_ON_TRIVIAL_REBASE);
+    setCopyAllScoresOnMergeFirstParentUpdate(DEF_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE);
+    setCopyMaxScore(DEF_COPY_MAX_SCORE);
+    setCopyMinScore(DEF_COPY_MIN_SCORE);
+    setAllowPostSubmit(DEF_ALLOW_POST_SUBMIT);
+    setIgnoreSelfApproval(DEF_IGNORE_SELF_APPROVAL);
+
+    byValue = new HashMap<>();
+    for (LabelValue v : values) {
+      byValue.put(v.getValue(), v);
+    }
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public boolean matches(PatchSetApproval psa) {
+    return psa.getLabelId().get().equalsIgnoreCase(name);
+  }
+
+  public LabelFunction getFunction() {
+    if (functionName == null) {
+      return null;
+    }
+    return LabelFunction.parse(functionName)
+        .orElseThrow(() -> new IllegalStateException("Unsupported functionName: " + functionName));
+  }
+
+  public void setFunction(@Nullable LabelFunction function) {
+    this.functionName = function != null ? function.getFunctionName() : null;
+  }
+
+  public boolean canOverride() {
+    return canOverride;
+  }
+
+  public List<String> getRefPatterns() {
+    return refPatterns;
+  }
+
+  public void setCanOverride(boolean canOverride) {
+    this.canOverride = canOverride;
+  }
+
+  public boolean allowPostSubmit() {
+    return allowPostSubmit;
+  }
+
+  public void setAllowPostSubmit(boolean allowPostSubmit) {
+    this.allowPostSubmit = allowPostSubmit;
+  }
+
+  public boolean ignoreSelfApproval() {
+    return ignoreSelfApproval;
+  }
+
+  public void setIgnoreSelfApproval(boolean ignoreSelfApproval) {
+    this.ignoreSelfApproval = ignoreSelfApproval;
+  }
+
+  public void setRefPatterns(List<String> refPatterns) {
+    if (refPatterns != null) {
+      this.refPatterns =
+          refPatterns.stream().collect(collectingAndThen(toList(), Collections::unmodifiableList));
+    } else {
+      this.refPatterns = null;
+    }
+  }
+
+  public List<LabelValue> getValues() {
+    return values;
+  }
+
+  public LabelValue getMin() {
+    if (values.isEmpty()) {
+      return null;
+    }
+    return values.get(0);
+  }
+
+  public LabelValue getMax() {
+    if (values.isEmpty()) {
+      return null;
+    }
+    return values.get(values.size() - 1);
+  }
+
+  public short getDefaultValue() {
+    return defaultValue;
+  }
+
+  public void setDefaultValue(short defaultValue) {
+    this.defaultValue = defaultValue;
+  }
+
+  public boolean isCopyMinScore() {
+    return copyMinScore;
+  }
+
+  public void setCopyMinScore(boolean copyMinScore) {
+    this.copyMinScore = copyMinScore;
+  }
+
+  public boolean isCopyMaxScore() {
+    return copyMaxScore;
+  }
+
+  public void setCopyMaxScore(boolean copyMaxScore) {
+    this.copyMaxScore = copyMaxScore;
+  }
+
+  public boolean isCopyAllScoresOnMergeFirstParentUpdate() {
+    return copyAllScoresOnMergeFirstParentUpdate;
+  }
+
+  public void setCopyAllScoresOnMergeFirstParentUpdate(
+      boolean copyAllScoresOnMergeFirstParentUpdate) {
+    this.copyAllScoresOnMergeFirstParentUpdate = copyAllScoresOnMergeFirstParentUpdate;
+  }
+
+  public boolean isCopyAllScoresOnTrivialRebase() {
+    return copyAllScoresOnTrivialRebase;
+  }
+
+  public void setCopyAllScoresOnTrivialRebase(boolean copyAllScoresOnTrivialRebase) {
+    this.copyAllScoresOnTrivialRebase = copyAllScoresOnTrivialRebase;
+  }
+
+  public boolean isCopyAllScoresIfNoCodeChange() {
+    return copyAllScoresIfNoCodeChange;
+  }
+
+  public void setCopyAllScoresIfNoCodeChange(boolean copyAllScoresIfNoCodeChange) {
+    this.copyAllScoresIfNoCodeChange = copyAllScoresIfNoCodeChange;
+  }
+
+  public boolean isCopyAllScoresIfNoChange() {
+    return copyAllScoresIfNoChange;
+  }
+
+  public void setCopyAllScoresIfNoChange(boolean copyAllScoresIfNoChange) {
+    this.copyAllScoresIfNoChange = copyAllScoresIfNoChange;
+  }
+
+  public boolean isMaxNegative(PatchSetApproval ca) {
+    return maxNegative == ca.getValue();
+  }
+
+  public boolean isMaxPositive(PatchSetApproval ca) {
+    return maxPositive == ca.getValue();
+  }
+
+  public LabelValue getValue(short value) {
+    return byValue.get(value);
+  }
+
+  public LabelValue getValue(PatchSetApproval ca) {
+    return byValue.get(ca.getValue());
+  }
+
+  public LabelId getLabelId() {
+    return new LabelId(name);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder(name).append('[');
+    LabelValue min = getMin();
+    LabelValue max = getMax();
+    if (min != null && max != null) {
+      sb.append(
+          new PermissionRange(Permission.forLabel(name), min.getValue(), max.getValue())
+              .toString()
+              .trim());
+    } else if (min != null) {
+      sb.append(min.formatValue().trim());
+    } else if (max != null) {
+      sb.append(max.formatValue().trim());
+    }
+    sb.append(']');
+    return sb.toString();
+  }
+}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelTypes.java b/java/com/google/gerrit/common/data/LabelTypes.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/data/LabelTypes.java
rename to java/com/google/gerrit/common/data/LabelTypes.java
diff --git a/java/com/google/gerrit/common/data/LabelValue.java b/java/com/google/gerrit/common/data/LabelValue.java
new file mode 100644
index 0000000..c0ba781
--- /dev/null
+++ b/java/com/google/gerrit/common/data/LabelValue.java
@@ -0,0 +1,78 @@
+// Copyright (C) 2013 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.google.gerrit.common.data;
+
+import java.util.Objects;
+
+public class LabelValue {
+  public static String formatValue(short value) {
+    if (value < 0) {
+      return Short.toString(value);
+    } else if (value == 0) {
+      return " 0";
+    } else {
+      return "+" + Short.toString(value);
+    }
+  }
+
+  protected short value;
+  protected String text;
+
+  public LabelValue(short value, String text) {
+    this.value = value;
+    this.text = text;
+  }
+
+  protected LabelValue() {}
+
+  public short getValue() {
+    return value;
+  }
+
+  public String getText() {
+    return text;
+  }
+
+  public String formatValue() {
+    return formatValue(value);
+  }
+
+  public String format() {
+    StringBuilder sb = new StringBuilder(formatValue());
+    if (!text.isEmpty()) {
+      sb.append(' ').append(text);
+    }
+    return sb.toString();
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (!(o instanceof LabelValue)) {
+      return false;
+    }
+    LabelValue v = (LabelValue) o;
+    return value == v.value && Objects.equals(text, v.text);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(value, text);
+  }
+
+  @Override
+  public String toString() {
+    return format();
+  }
+}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/ParameterizedString.java b/java/com/google/gerrit/common/data/ParameterizedString.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/data/ParameterizedString.java
rename to java/com/google/gerrit/common/data/ParameterizedString.java
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/PatchScript.java b/java/com/google/gerrit/common/data/PatchScript.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/data/PatchScript.java
rename to java/com/google/gerrit/common/data/PatchScript.java
diff --git a/java/com/google/gerrit/common/data/Permission.java b/java/com/google/gerrit/common/data/Permission.java
new file mode 100644
index 0000000..de6108e
--- /dev/null
+++ b/java/com/google/gerrit/common/data/Permission.java
@@ -0,0 +1,301 @@
+// Copyright (C) 2010 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.google.gerrit.common.data;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+
+/** A single permission within an {@link AccessSection} of a project. */
+public class Permission implements Comparable<Permission> {
+  public static final String ABANDON = "abandon";
+  public static final String ADD_PATCH_SET = "addPatchSet";
+  public static final String CREATE = "create";
+  public static final String CREATE_SIGNED_TAG = "createSignedTag";
+  public static final String CREATE_TAG = "createTag";
+  public static final String DELETE = "delete";
+  public static final String DELETE_CHANGES = "deleteChanges";
+  public static final String DELETE_OWN_CHANGES = "deleteOwnChanges";
+  public static final String EDIT_ASSIGNEE = "editAssignee";
+  public static final String EDIT_HASHTAGS = "editHashtags";
+  public static final String EDIT_TOPIC_NAME = "editTopicName";
+  public static final String FORGE_AUTHOR = "forgeAuthor";
+  public static final String FORGE_COMMITTER = "forgeCommitter";
+  public static final String FORGE_SERVER = "forgeServerAsCommitter";
+  public static final String LABEL = "label-";
+  public static final String LABEL_AS = "labelAs-";
+  public static final String OWNER = "owner";
+  public static final String PUSH = "push";
+  public static final String PUSH_MERGE = "pushMerge";
+  public static final String READ = "read";
+  public static final String REBASE = "rebase";
+  public static final String REMOVE_REVIEWER = "removeReviewer";
+  public static final String SUBMIT = "submit";
+  public static final String SUBMIT_AS = "submitAs";
+  public static final String VIEW_PRIVATE_CHANGES = "viewPrivateChanges";
+
+  private static final List<String> NAMES_LC;
+  private static final int LABEL_INDEX;
+  private static final int LABEL_AS_INDEX;
+
+  static {
+    NAMES_LC = new ArrayList<>();
+    NAMES_LC.add(ABANDON.toLowerCase());
+    NAMES_LC.add(ADD_PATCH_SET.toLowerCase());
+    NAMES_LC.add(CREATE.toLowerCase());
+    NAMES_LC.add(CREATE_SIGNED_TAG.toLowerCase());
+    NAMES_LC.add(CREATE_TAG.toLowerCase());
+    NAMES_LC.add(DELETE.toLowerCase());
+    NAMES_LC.add(DELETE_CHANGES.toLowerCase());
+    NAMES_LC.add(DELETE_OWN_CHANGES.toLowerCase());
+    NAMES_LC.add(EDIT_ASSIGNEE.toLowerCase());
+    NAMES_LC.add(EDIT_HASHTAGS.toLowerCase());
+    NAMES_LC.add(EDIT_TOPIC_NAME.toLowerCase());
+    NAMES_LC.add(FORGE_AUTHOR.toLowerCase());
+    NAMES_LC.add(FORGE_COMMITTER.toLowerCase());
+    NAMES_LC.add(FORGE_SERVER.toLowerCase());
+    NAMES_LC.add(LABEL.toLowerCase());
+    NAMES_LC.add(LABEL_AS.toLowerCase());
+    NAMES_LC.add(OWNER.toLowerCase());
+    NAMES_LC.add(PUSH.toLowerCase());
+    NAMES_LC.add(PUSH_MERGE.toLowerCase());
+    NAMES_LC.add(READ.toLowerCase());
+    NAMES_LC.add(REBASE.toLowerCase());
+    NAMES_LC.add(REMOVE_REVIEWER.toLowerCase());
+    NAMES_LC.add(SUBMIT.toLowerCase());
+    NAMES_LC.add(SUBMIT_AS.toLowerCase());
+    NAMES_LC.add(VIEW_PRIVATE_CHANGES.toLowerCase());
+
+    LABEL_INDEX = NAMES_LC.indexOf(Permission.LABEL);
+    LABEL_AS_INDEX = NAMES_LC.indexOf(Permission.LABEL_AS.toLowerCase());
+  }
+
+  /** @return true if the name is recognized as a permission name. */
+  public static boolean isPermission(String varName) {
+    return isLabel(varName) || isLabelAs(varName) || NAMES_LC.contains(varName.toLowerCase());
+  }
+
+  public static boolean hasRange(String varName) {
+    return isLabel(varName) || isLabelAs(varName);
+  }
+
+  /** @return true if the permission name is actually for a review label. */
+  public static boolean isLabel(String varName) {
+    return varName.startsWith(LABEL) && LABEL.length() < varName.length();
+  }
+
+  /** @return true if the permission is for impersonated review labels. */
+  public static boolean isLabelAs(String var) {
+    return var.startsWith(LABEL_AS) && LABEL_AS.length() < var.length();
+  }
+
+  /** @return permission name for the given review label. */
+  public static String forLabel(String labelName) {
+    return LABEL + labelName;
+  }
+
+  /** @return permission name to apply a label for another user. */
+  public static String forLabelAs(String labelName) {
+    return LABEL_AS + labelName;
+  }
+
+  public static String extractLabel(String varName) {
+    if (isLabel(varName)) {
+      return varName.substring(LABEL.length());
+    } else if (isLabelAs(varName)) {
+      return varName.substring(LABEL_AS.length());
+    }
+    return null;
+  }
+
+  public static boolean canBeOnAllProjects(String ref, String permissionName) {
+    if (AccessSection.ALL.equals(ref)) {
+      return !OWNER.equals(permissionName);
+    }
+    return true;
+  }
+
+  protected String name;
+  protected boolean exclusiveGroup;
+  protected List<PermissionRule> rules;
+
+  protected Permission() {}
+
+  public Permission(String name) {
+    this.name = name;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public String getLabel() {
+    return extractLabel(getName());
+  }
+
+  public boolean getExclusiveGroup() {
+    // Only permit exclusive group behavior on non OWNER permissions,
+    // otherwise an owner might lose access to a delegated subspace.
+    //
+    return exclusiveGroup && !OWNER.equals(getName());
+  }
+
+  public void setExclusiveGroup(boolean newExclusiveGroup) {
+    exclusiveGroup = newExclusiveGroup;
+  }
+
+  // TODO(ekempin): Make this method return an ImmutableList once the GWT UI is gone.
+  public List<PermissionRule> getRules() {
+    if (rules == null) {
+      return new ArrayList<>();
+    }
+    return new ArrayList<>(rules);
+  }
+
+  public void setRules(List<PermissionRule> list) {
+    rules = new ArrayList<>(list);
+  }
+
+  public void add(PermissionRule rule) {
+    initRules();
+    rules.add(rule);
+  }
+
+  public void remove(PermissionRule rule) {
+    if (rule != null) {
+      removeRule(rule.getGroup());
+    }
+  }
+
+  public void removeRule(GroupReference group) {
+    if (rules != null) {
+      rules.removeIf(permissionRule -> sameGroup(permissionRule, group));
+    }
+  }
+
+  public void clearRules() {
+    if (rules != null) {
+      rules.clear();
+    }
+  }
+
+  public PermissionRule getRule(GroupReference group) {
+    return getRule(group, false);
+  }
+
+  public PermissionRule getRule(GroupReference group, boolean create) {
+    initRules();
+
+    for (PermissionRule r : rules) {
+      if (sameGroup(r, group)) {
+        return r;
+      }
+    }
+
+    if (create) {
+      PermissionRule r = new PermissionRule(group);
+      rules.add(r);
+      return r;
+    }
+    return null;
+  }
+
+  void mergeFrom(Permission src) {
+    for (PermissionRule srcRule : src.getRules()) {
+      PermissionRule dstRule = getRule(srcRule.getGroup());
+      if (dstRule != null) {
+        dstRule.mergeFrom(srcRule);
+      } else {
+        add(srcRule);
+      }
+    }
+  }
+
+  private static boolean sameGroup(PermissionRule rule, GroupReference group) {
+    if (group.getUUID() != null) {
+      return group.getUUID().equals(rule.getGroup().getUUID());
+
+    } else if (group.getName() != null) {
+      return group.getName().equals(rule.getGroup().getName());
+
+    } else {
+      return false;
+    }
+  }
+
+  private void initRules() {
+    if (rules == null) {
+      rules = new ArrayList<>(4);
+    }
+  }
+
+  @Override
+  public int compareTo(Permission b) {
+    int cmp = index(this) - index(b);
+    if (cmp == 0) {
+      cmp = getName().compareTo(b.getName());
+    }
+    return cmp;
+  }
+
+  private static int index(Permission a) {
+    if (isLabel(a.getName())) {
+      return LABEL_INDEX;
+    } else if (isLabelAs(a.getName())) {
+      return LABEL_AS_INDEX;
+    }
+
+    int index = NAMES_LC.indexOf(a.getName().toLowerCase());
+    return 0 <= index ? index : NAMES_LC.size();
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (!(obj instanceof Permission)) {
+      return false;
+    }
+
+    final Permission other = (Permission) obj;
+    if (!name.equals(other.name) || exclusiveGroup != other.exclusiveGroup) {
+      return false;
+    }
+    return new HashSet<>(getRules()).equals(new HashSet<>(other.getRules()));
+  }
+
+  @Override
+  public int hashCode() {
+    return name.hashCode();
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder bldr = new StringBuilder();
+    bldr.append(name).append(" ");
+    if (exclusiveGroup) {
+      bldr.append("[exclusive] ");
+    }
+    bldr.append("[");
+    Iterator<PermissionRule> it = getRules().iterator();
+    while (it.hasNext()) {
+      bldr.append(it.next());
+      if (it.hasNext()) {
+        bldr.append(", ");
+      }
+    }
+    bldr.append("]");
+    return bldr.toString();
+  }
+}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/PermissionRange.java b/java/com/google/gerrit/common/data/PermissionRange.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/data/PermissionRange.java
rename to java/com/google/gerrit/common/data/PermissionRange.java
diff --git a/java/com/google/gerrit/common/data/PermissionRule.java b/java/com/google/gerrit/common/data/PermissionRule.java
new file mode 100644
index 0000000..8ab0a55
--- /dev/null
+++ b/java/com/google/gerrit/common/data/PermissionRule.java
@@ -0,0 +1,296 @@
+// Copyright (C) 2010 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.google.gerrit.common.data;
+
+public class PermissionRule implements Comparable<PermissionRule> {
+  public static final String FORCE_PUSH = "Force Push";
+  public static final String FORCE_EDIT = "Force Edit";
+
+  public enum Action {
+    ALLOW,
+    DENY,
+    BLOCK,
+
+    INTERACTIVE,
+    BATCH
+  }
+
+  protected Action action = Action.ALLOW;
+  protected boolean force;
+  protected int min;
+  protected int max;
+  protected GroupReference group;
+
+  public PermissionRule() {}
+
+  public PermissionRule(GroupReference group) {
+    this.group = group;
+  }
+
+  public Action getAction() {
+    return action;
+  }
+
+  public void setAction(Action action) {
+    if (action == null) {
+      throw new NullPointerException("action");
+    }
+    this.action = action;
+  }
+
+  public boolean isDeny() {
+    return action == Action.DENY;
+  }
+
+  public void setDeny() {
+    action = Action.DENY;
+  }
+
+  public boolean isBlock() {
+    return action == Action.BLOCK;
+  }
+
+  public void setBlock() {
+    action = Action.BLOCK;
+  }
+
+  public boolean getForce() {
+    return force;
+  }
+
+  public void setForce(boolean newForce) {
+    force = newForce;
+  }
+
+  public int getMin() {
+    return min;
+  }
+
+  public void setMin(int min) {
+    this.min = min;
+  }
+
+  public void setMax(int max) {
+    this.max = max;
+  }
+
+  public int getMax() {
+    return max;
+  }
+
+  public void setRange(int newMin, int newMax) {
+    if (newMax < newMin) {
+      min = newMax;
+      max = newMin;
+    } else {
+      min = newMin;
+      max = newMax;
+    }
+  }
+
+  public GroupReference getGroup() {
+    return group;
+  }
+
+  public void setGroup(GroupReference newGroup) {
+    group = newGroup;
+  }
+
+  void mergeFrom(PermissionRule src) {
+    if (getAction() != src.getAction()) {
+      if (getAction() == Action.BLOCK || src.getAction() == Action.BLOCK) {
+        setAction(Action.BLOCK);
+
+      } else if (getAction() == Action.DENY || src.getAction() == Action.DENY) {
+        setAction(Action.DENY);
+
+      } else if (getAction() == Action.BATCH || src.getAction() == Action.BATCH) {
+        setAction(Action.BATCH);
+      }
+    }
+
+    setForce(getForce() || src.getForce());
+    setRange(Math.min(getMin(), src.getMin()), Math.max(getMax(), src.getMax()));
+  }
+
+  @Override
+  public int compareTo(PermissionRule o) {
+    int cmp = action(this) - action(o);
+    if (cmp == 0) {
+      cmp = range(o) - range(this);
+    }
+    if (cmp == 0) {
+      cmp = group(this).compareTo(group(o));
+    }
+    return cmp;
+  }
+
+  private static int action(PermissionRule a) {
+    switch (a.getAction()) {
+      case DENY:
+        return 0;
+      case ALLOW:
+      case BATCH:
+      case BLOCK:
+      case INTERACTIVE:
+      default:
+        return 1 + a.getAction().ordinal();
+    }
+  }
+
+  private static int range(PermissionRule a) {
+    return Math.abs(a.getMin()) + Math.abs(a.getMax());
+  }
+
+  private static String group(PermissionRule a) {
+    return a.getGroup().getName() != null ? a.getGroup().getName() : "";
+  }
+
+  @Override
+  public String toString() {
+    return asString(true);
+  }
+
+  public String asString(boolean canUseRange) {
+    StringBuilder r = new StringBuilder();
+
+    switch (getAction()) {
+      case ALLOW:
+        break;
+
+      case DENY:
+        r.append("deny ");
+        break;
+
+      case BLOCK:
+        r.append("block ");
+        break;
+
+      case INTERACTIVE:
+        r.append("interactive ");
+        break;
+
+      case BATCH:
+        r.append("batch ");
+        break;
+    }
+
+    if (getForce()) {
+      r.append("+force ");
+    }
+
+    if (canUseRange && (getMin() != 0 || getMax() != 0)) {
+      if (0 <= getMin()) {
+        r.append('+');
+      }
+      r.append(getMin());
+      r.append("..");
+      if (0 <= getMax()) {
+        r.append('+');
+      }
+      r.append(getMax());
+      r.append(' ');
+    }
+
+    r.append(getGroup().toConfigValue());
+
+    return r.toString();
+  }
+
+  public static PermissionRule fromString(String src, boolean mightUseRange) {
+    final String orig = src;
+    final PermissionRule rule = new PermissionRule();
+
+    src = src.trim();
+
+    if (src.startsWith("deny ")) {
+      rule.setAction(Action.DENY);
+      src = src.substring("deny ".length()).trim();
+
+    } else if (src.startsWith("block ")) {
+      rule.setAction(Action.BLOCK);
+      src = src.substring("block ".length()).trim();
+
+    } else if (src.startsWith("interactive ")) {
+      rule.setAction(Action.INTERACTIVE);
+      src = src.substring("interactive ".length()).trim();
+
+    } else if (src.startsWith("batch ")) {
+      rule.setAction(Action.BATCH);
+      src = src.substring("batch ".length()).trim();
+    }
+
+    if (src.startsWith("+force ")) {
+      rule.setForce(true);
+      src = src.substring("+force ".length()).trim();
+    }
+
+    if (mightUseRange && !GroupReference.isGroupReference(src)) {
+      int sp = src.indexOf(' ');
+      String range = src.substring(0, sp);
+
+      if (range.matches("^([+-]?\\d+)\\.\\.([+-]?\\d+)$")) {
+        int dotdot = range.indexOf("..");
+        int min = parseInt(range.substring(0, dotdot));
+        int max = parseInt(range.substring(dotdot + 2));
+        rule.setRange(min, max);
+      } else {
+        throw new IllegalArgumentException("Invalid range in rule: " + orig);
+      }
+
+      src = src.substring(sp + 1).trim();
+    }
+
+    String groupName = GroupReference.extractGroupName(src);
+    if (groupName != null) {
+      GroupReference group = new GroupReference();
+      group.setName(groupName);
+      rule.setGroup(group);
+    } else {
+      throw new IllegalArgumentException("Rule must include group: " + orig);
+    }
+
+    return rule;
+  }
+
+  public boolean hasRange() {
+    return getMin() != 0 || getMax() != 0;
+  }
+
+  public static int parseInt(String value) {
+    if (value.startsWith("+")) {
+      value = value.substring(1);
+    }
+    return Integer.parseInt(value);
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (!(obj instanceof PermissionRule)) {
+      return false;
+    }
+    final PermissionRule other = (PermissionRule) obj;
+    return action.equals(other.action)
+        && force == other.force
+        && min == other.min
+        && max == other.max
+        && group.equals(other.group);
+  }
+
+  @Override
+  public int hashCode() {
+    return group.hashCode();
+  }
+}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectAccess.java b/java/com/google/gerrit/common/data/ProjectAccess.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectAccess.java
rename to java/com/google/gerrit/common/data/ProjectAccess.java
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectAdminService.java b/java/com/google/gerrit/common/data/ProjectAdminService.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectAdminService.java
rename to java/com/google/gerrit/common/data/ProjectAdminService.java
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/RefConfigSection.java b/java/com/google/gerrit/common/data/RefConfigSection.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/data/RefConfigSection.java
rename to java/com/google/gerrit/common/data/RefConfigSection.java
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/SshHostKey.java b/java/com/google/gerrit/common/data/SshHostKey.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/data/SshHostKey.java
rename to java/com/google/gerrit/common/data/SshHostKey.java
diff --git a/java/com/google/gerrit/common/data/SubmitRecord.java b/java/com/google/gerrit/common/data/SubmitRecord.java
new file mode 100644
index 0000000..8638d6d
--- /dev/null
+++ b/java/com/google/gerrit/common/data/SubmitRecord.java
@@ -0,0 +1,189 @@
+// Copyright (C) 2011 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.google.gerrit.common.data;
+
+import com.google.common.annotations.GwtIncompatible;
+import com.google.gerrit.reviewdb.client.Account;
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
+
+/** Describes the state and edits required to submit a change. */
+public class SubmitRecord {
+  public static boolean allRecordsOK(Collection<SubmitRecord> in) {
+    if (in == null || in.isEmpty()) {
+      // If the list is null or empty, it means that this Gerrit installation does not
+      // have any form of validation rules.
+      // Hence, the permission system should be used to determine if the change can be merged
+      // or not.
+      return true;
+    }
+
+    // The change can be submitted, unless at least one plugin prevents it.
+    return in.stream().map(SubmitRecord::status).allMatch(SubmitRecord.Status::allowsSubmission);
+  }
+
+  public enum Status {
+    // NOTE: These values are persisted in the index, so deleting or changing
+    // the name of any values requires a schema upgrade.
+
+    /** The change is ready for submission. */
+    OK,
+
+    /** Something is preventing this change from being submitted. */
+    NOT_READY,
+
+    /** The change has been closed. */
+    CLOSED,
+
+    /** The change was submitted bypassing submit rules. */
+    FORCED,
+
+    /**
+     * An internal server error occurred preventing computation.
+     *
+     * <p>Additional detail may be available in {@link SubmitRecord#errorMessage}.
+     */
+    RULE_ERROR;
+
+    private boolean allowsSubmission() {
+      return this == OK || this == FORCED;
+    }
+  }
+
+  public Status status;
+  public List<Label> labels;
+  @GwtIncompatible public List<SubmitRequirement> requirements;
+  public String errorMessage;
+
+  public static class Label {
+    public enum Status {
+      // NOTE: These values are persisted in the index, so deleting or changing
+      // the name of any values requires a schema upgrade.
+
+      /**
+       * This label provides what is necessary for submission.
+       *
+       * <p>If provided, {@link Label#appliedBy} describes the user account that applied this label
+       * to the change.
+       */
+      OK,
+
+      /**
+       * This label prevents the change from being submitted.
+       *
+       * <p>If provided, {@link Label#appliedBy} describes the user account that applied this label
+       * to the change.
+       */
+      REJECT,
+
+      /** The label is required for submission, but has not been satisfied. */
+      NEED,
+
+      /**
+       * The label may be set, but it's neither necessary for submission nor does it block
+       * submission if set.
+       */
+      MAY,
+
+      /**
+       * The label is required for submission, but is impossible to complete. The likely cause is
+       * access has not been granted correctly by the project owner or site administrator.
+       */
+      IMPOSSIBLE
+    }
+
+    public String label;
+    public Status status;
+    public Account.Id appliedBy;
+
+    @Override
+    public String toString() {
+      StringBuilder sb = new StringBuilder();
+      sb.append(label).append(": ").append(status);
+      if (appliedBy != null) {
+        sb.append(" by ").append(appliedBy);
+      }
+      return sb.toString();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+      if (o instanceof Label) {
+        Label l = (Label) o;
+        return Objects.equals(label, l.label)
+            && Objects.equals(status, l.status)
+            && Objects.equals(appliedBy, l.appliedBy);
+      }
+      return false;
+    }
+
+    @Override
+    public int hashCode() {
+      return Objects.hash(label, status, appliedBy);
+    }
+  }
+
+  @GwtIncompatible
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append(status);
+    if (status == Status.RULE_ERROR && errorMessage != null) {
+      sb.append('(').append(errorMessage).append(')');
+    }
+    sb.append('[');
+    if (labels != null) {
+      String delimiter = "";
+      for (Label label : labels) {
+        sb.append(delimiter).append(label);
+        delimiter = ", ";
+      }
+    }
+    sb.append("],[");
+    if (requirements != null) {
+      String delimiter = "";
+      for (SubmitRequirement requirement : requirements) {
+        sb.append(delimiter).append(requirement);
+        delimiter = ", ";
+      }
+    }
+    sb.append(']');
+    return sb.toString();
+  }
+
+  @GwtIncompatible
+  @Override
+  public boolean equals(Object o) {
+    if (o instanceof SubmitRecord) {
+      SubmitRecord r = (SubmitRecord) o;
+      return Objects.equals(status, r.status)
+          && Objects.equals(labels, r.labels)
+          && Objects.equals(errorMessage, r.errorMessage)
+          && Objects.equals(requirements, r.requirements);
+    }
+    return false;
+  }
+
+  @GwtIncompatible
+  @Override
+  public int hashCode() {
+    return Objects.hash(status, labels, errorMessage, requirements);
+  }
+
+  private Status status() {
+    return status;
+  }
+}
diff --git a/java/com/google/gerrit/common/data/SubmitRequirement.java b/java/com/google/gerrit/common/data/SubmitRequirement.java
new file mode 100644
index 0000000..0c978ca
--- /dev/null
+++ b/java/com/google/gerrit/common/data/SubmitRequirement.java
@@ -0,0 +1,79 @@
+// 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.
+
+package com.google.gerrit.common.data;
+
+import static com.google.common.base.Preconditions.checkState;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.annotations.GwtIncompatible;
+import com.google.common.base.CharMatcher;
+import com.google.common.collect.ImmutableMap;
+import java.util.Map;
+
+/** Describes a requirement to submit a change. */
+@GwtIncompatible
+@AutoValue
+@AutoValue.CopyAnnotations
+public abstract class SubmitRequirement {
+  private static final CharMatcher TYPE_MATCHER =
+      CharMatcher.inRange('a', 'z')
+          .or(CharMatcher.inRange('A', 'Z'))
+          .or(CharMatcher.inRange('0', '9'))
+          .or(CharMatcher.anyOf("-_"));
+
+  @AutoValue.Builder
+  public abstract static class Builder {
+    public abstract Builder setType(String value);
+
+    public abstract Builder setFallbackText(String value);
+
+    public Builder setData(Map<String, String> value) {
+      return setData(ImmutableMap.copyOf(value));
+    }
+
+    public Builder addCustomValue(String key, String value) {
+      dataBuilder().put(key, value);
+      return this;
+    }
+
+    public SubmitRequirement build() {
+      SubmitRequirement requirement = autoBuild();
+      checkState(
+          validateType(requirement.type()),
+          "SubmitRequirement's type contains non alphanumerical symbols.");
+      return requirement;
+    }
+
+    abstract Builder setData(ImmutableMap<String, String> value);
+
+    abstract ImmutableMap.Builder<String, String> dataBuilder();
+
+    abstract SubmitRequirement autoBuild();
+  }
+
+  public abstract String fallbackText();
+
+  public abstract String type();
+
+  public abstract ImmutableMap<String, String> data();
+
+  public static Builder builder() {
+    return new AutoValue_SubmitRequirement.Builder();
+  }
+
+  private static boolean validateType(String type) {
+    return TYPE_MATCHER.matchesAllOf(type);
+  }
+}
diff --git a/java/com/google/gerrit/common/data/SubmitTypeRecord.java b/java/com/google/gerrit/common/data/SubmitTypeRecord.java
new file mode 100644
index 0000000..d16da96
--- /dev/null
+++ b/java/com/google/gerrit/common/data/SubmitTypeRecord.java
@@ -0,0 +1,77 @@
+// Copyright (C) 2012 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.google.gerrit.common.data;
+
+import com.google.gerrit.extensions.client.SubmitType;
+
+/** Describes the submit type for a change. */
+public class SubmitTypeRecord {
+  public enum Status {
+    /** The type was computed successfully */
+    OK,
+
+    /**
+     * An internal server error occurred preventing computation.
+     *
+     * <p>Additional detail may be available in {@link SubmitTypeRecord#errorMessage}
+     */
+    RULE_ERROR
+  }
+
+  public static SubmitTypeRecord OK(SubmitType type) {
+    return new SubmitTypeRecord(Status.OK, type, null);
+  }
+
+  public static SubmitTypeRecord error(String err) {
+    return new SubmitTypeRecord(SubmitTypeRecord.Status.RULE_ERROR, null, err);
+  }
+
+  /** Status enum value of the record. */
+  public final Status status;
+
+  /** Submit type of the record; never null if {@link #status} is {@code OK}. */
+  public final SubmitType type;
+
+  /** Submit type of the record; always null if {@link #status} is {@code OK}. */
+  public final String errorMessage;
+
+  private SubmitTypeRecord(Status status, SubmitType type, String errorMessage) {
+    if (type == SubmitType.INHERIT) {
+      throw new IllegalArgumentException("Cannot output submit type " + type);
+    }
+    this.status = status;
+    this.type = type;
+    this.errorMessage = errorMessage;
+  }
+
+  public boolean isOk() {
+    return status == Status.OK;
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append(status);
+    if (status == Status.RULE_ERROR && errorMessage != null) {
+      sb.append('(').append(errorMessage).append(")");
+    }
+    if (type != null) {
+      sb.append('[');
+      sb.append(type.name());
+      sb.append(']');
+    }
+    return sb.toString();
+  }
+}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/SubscribeSection.java b/java/com/google/gerrit/common/data/SubscribeSection.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/data/SubscribeSection.java
rename to java/com/google/gerrit/common/data/SubscribeSection.java
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/SystemInfoService.java b/java/com/google/gerrit/common/data/SystemInfoService.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/data/SystemInfoService.java
rename to java/com/google/gerrit/common/data/SystemInfoService.java
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/WebLinkInfoCommon.java b/java/com/google/gerrit/common/data/WebLinkInfoCommon.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/data/WebLinkInfoCommon.java
rename to java/com/google/gerrit/common/data/WebLinkInfoCommon.java
diff --git a/java/com/google/gerrit/common/data/testing/BUILD b/java/com/google/gerrit/common/data/testing/BUILD
new file mode 100644
index 0000000..32815d5
--- /dev/null
+++ b/java/com/google/gerrit/common/data/testing/BUILD
@@ -0,0 +1,11 @@
+java_library(
+    name = "common-data-test-util",
+    testonly = True,
+    srcs = glob(["**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//lib/truth",
+    ],
+)
diff --git a/java/com/google/gerrit/common/data/testing/GroupReferenceSubject.java b/java/com/google/gerrit/common/data/testing/GroupReferenceSubject.java
new file mode 100644
index 0000000..1988d66
--- /dev/null
+++ b/java/com/google/gerrit/common/data/testing/GroupReferenceSubject.java
@@ -0,0 +1,48 @@
+// 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.
+
+package com.google.gerrit.common.data.testing;
+
+import static com.google.common.truth.Truth.assertAbout;
+
+import com.google.common.truth.ComparableSubject;
+import com.google.common.truth.FailureMetadata;
+import com.google.common.truth.StringSubject;
+import com.google.common.truth.Subject;
+import com.google.common.truth.Truth;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+
+public class GroupReferenceSubject extends Subject<GroupReferenceSubject, GroupReference> {
+
+  public static GroupReferenceSubject assertThat(GroupReference group) {
+    return assertAbout(GroupReferenceSubject::new).that(group);
+  }
+
+  private GroupReferenceSubject(FailureMetadata metadata, GroupReference group) {
+    super(metadata, group);
+  }
+
+  public ComparableSubject<?, AccountGroup.UUID> groupUuid() {
+    isNotNull();
+    GroupReference group = actual();
+    return Truth.assertThat(group.getUUID()).named("groupUuid");
+  }
+
+  public StringSubject name() {
+    isNotNull();
+    GroupReference group = actual();
+    return Truth.assertThat(group.getName()).named("name");
+  }
+}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/errors/EmailException.java b/java/com/google/gerrit/common/errors/EmailException.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/errors/EmailException.java
rename to java/com/google/gerrit/common/errors/EmailException.java
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/errors/InvalidNameException.java b/java/com/google/gerrit/common/errors/InvalidNameException.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/errors/InvalidNameException.java
rename to java/com/google/gerrit/common/errors/InvalidNameException.java
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/errors/InvalidSshKeyException.java b/java/com/google/gerrit/common/errors/InvalidSshKeyException.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/errors/InvalidSshKeyException.java
rename to java/com/google/gerrit/common/errors/InvalidSshKeyException.java
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/errors/NameAlreadyUsedException.java b/java/com/google/gerrit/common/errors/NameAlreadyUsedException.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/errors/NameAlreadyUsedException.java
rename to java/com/google/gerrit/common/errors/NameAlreadyUsedException.java
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/errors/NoSuchAccountException.java b/java/com/google/gerrit/common/errors/NoSuchAccountException.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/errors/NoSuchAccountException.java
rename to java/com/google/gerrit/common/errors/NoSuchAccountException.java
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/errors/NoSuchEntityException.java b/java/com/google/gerrit/common/errors/NoSuchEntityException.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/errors/NoSuchEntityException.java
rename to java/com/google/gerrit/common/errors/NoSuchEntityException.java
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/errors/NoSuchGroupException.java b/java/com/google/gerrit/common/errors/NoSuchGroupException.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/errors/NoSuchGroupException.java
rename to java/com/google/gerrit/common/errors/NoSuchGroupException.java
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/errors/NotSignedInException.java b/java/com/google/gerrit/common/errors/NotSignedInException.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/errors/NotSignedInException.java
rename to java/com/google/gerrit/common/errors/NotSignedInException.java
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/errors/UpdateParentFailedException.java b/java/com/google/gerrit/common/errors/UpdateParentFailedException.java
similarity index 100%
rename from gerrit-common/src/main/java/com/google/gerrit/common/errors/UpdateParentFailedException.java
rename to java/com/google/gerrit/common/errors/UpdateParentFailedException.java
diff --git a/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java b/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java
new file mode 100644
index 0000000..5b18368
--- /dev/null
+++ b/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java
@@ -0,0 +1,424 @@
+// Copyright (C) 2014 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.google.gerrit.elasticsearch;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.gson.FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.apache.commons.codec.binary.Base64.decodeBase64;
+
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Lists;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.io.CharStreams;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.elasticsearch.ElasticMapping.MappingProperties;
+import com.google.gerrit.elasticsearch.builders.QueryBuilder;
+import com.google.gerrit.elasticsearch.builders.SearchSourceBuilder;
+import com.google.gerrit.elasticsearch.bulk.DeleteRequest;
+import com.google.gerrit.index.FieldDef;
+import com.google.gerrit.index.FieldType;
+import com.google.gerrit.index.Index;
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.index.query.DataSource;
+import com.google.gerrit.index.query.FieldBundle;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.index.IndexUtils;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.google.gwtorm.protobuf.ProtobufCodec;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.ResultSet;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.sql.Timestamp;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Function;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpStatus;
+import org.apache.http.StatusLine;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.ContentType;
+import org.apache.http.nio.entity.NStringEntity;
+import org.elasticsearch.client.Request;
+import org.elasticsearch.client.Response;
+
+abstract class AbstractElasticIndex<K, V> implements Index<K, V> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  protected static final String BULK = "_bulk";
+  protected static final String MAPPINGS = "mappings";
+  protected static final String ORDER = "order";
+  protected static final String SEARCH = "_search";
+  protected static final String SETTINGS = "settings";
+
+  protected static <T> List<T> decodeProtos(
+      JsonObject doc, String fieldName, ProtobufCodec<T> codec) {
+    JsonArray field = doc.getAsJsonArray(fieldName);
+    if (field == null) {
+      return null;
+    }
+    return FluentIterable.from(field)
+        .transform(i -> codec.decode(decodeBase64(i.toString())))
+        .toList();
+  }
+
+  static String getContent(Response response) throws IOException {
+    HttpEntity responseEntity = response.getEntity();
+    String content = "";
+    if (responseEntity != null) {
+      InputStream contentStream = responseEntity.getContent();
+      try (Reader reader = new InputStreamReader(contentStream, UTF_8)) {
+        content = CharStreams.toString(reader);
+      }
+    }
+    return content;
+  }
+
+  private final ElasticConfiguration config;
+  private final Schema<V> schema;
+  private final SitePaths sitePaths;
+  private final String indexNameRaw;
+
+  protected final String type;
+  protected final ElasticRestClientProvider client;
+  protected final String indexName;
+  protected final Gson gson;
+  protected final ElasticQueryBuilder queryBuilder;
+
+  AbstractElasticIndex(
+      ElasticConfiguration config,
+      SitePaths sitePaths,
+      Schema<V> schema,
+      ElasticRestClientProvider client,
+      String indexName,
+      String indexType) {
+    this.config = config;
+    this.sitePaths = sitePaths;
+    this.schema = schema;
+    this.gson = new GsonBuilder().setFieldNamingPolicy(LOWER_CASE_WITH_UNDERSCORES).create();
+    this.queryBuilder = new ElasticQueryBuilder();
+    this.indexName = config.getIndexName(indexName, schema.getVersion());
+    this.indexNameRaw = indexName;
+    this.client = client;
+    this.type = client.adapter().getType(indexType);
+  }
+
+  AbstractElasticIndex(
+      ElasticConfiguration cfg,
+      SitePaths sitePaths,
+      Schema<V> schema,
+      ElasticRestClientProvider client,
+      String indexName) {
+    this(cfg, sitePaths, schema, client, indexName, indexName);
+  }
+
+  @Override
+  public Schema<V> getSchema() {
+    return schema;
+  }
+
+  @Override
+  public void close() {
+    // Do nothing. Client is closed by the provider.
+  }
+
+  @Override
+  public void markReady(boolean ready) throws IOException {
+    IndexUtils.setReady(sitePaths, indexNameRaw, schema.getVersion(), ready);
+  }
+
+  @Override
+  public void delete(K id) throws IOException {
+    String uri = getURI(type, BULK);
+    Response response = postRequest(uri, getDeleteActions(id), getRefreshParam());
+    int statusCode = response.getStatusLine().getStatusCode();
+    if (statusCode != HttpStatus.SC_OK) {
+      throw new IOException(
+          String.format("Failed to delete %s from index %s: %s", id, indexName, statusCode));
+    }
+  }
+
+  @Override
+  public void deleteAll() throws IOException {
+    // Delete the index, if it exists.
+    String endpoint = indexName + client.adapter().indicesExistParam();
+    Response response = performRequest("HEAD", endpoint);
+    int statusCode = response.getStatusLine().getStatusCode();
+    if (statusCode == HttpStatus.SC_OK) {
+      response = performRequest("DELETE", indexName);
+      statusCode = response.getStatusLine().getStatusCode();
+      if (statusCode != HttpStatus.SC_OK) {
+        throw new IOException(
+            String.format("Failed to delete index %s: %s", indexName, statusCode));
+      }
+    }
+
+    // Recreate the index.
+    String indexCreationFields = concatJsonString(getSettings(), getMappings());
+    response =
+        performRequest(
+            "PUT", indexName + client.adapter().includeTypeNameParam(), indexCreationFields);
+    statusCode = response.getStatusLine().getStatusCode();
+    if (statusCode != HttpStatus.SC_OK) {
+      String error = String.format("Failed to create index %s: %s", indexName, statusCode);
+      throw new IOException(error);
+    }
+  }
+
+  protected abstract String getDeleteActions(K id);
+
+  protected abstract String getMappings();
+
+  private String getSettings() {
+    return gson.toJson(ImmutableMap.of(SETTINGS, ElasticSetting.createSetting(config)));
+  }
+
+  protected abstract String getId(V v);
+
+  protected String getMappingsForSingleType(String candidateType, MappingProperties properties) {
+    return getMappingsFor(client.adapter().getType(candidateType), properties);
+  }
+
+  protected String getMappingsFor(String type, MappingProperties properties) {
+    JsonObject mappingType = new JsonObject();
+    mappingType.add(type, gson.toJsonTree(properties));
+    JsonObject mappings = new JsonObject();
+    mappings.add(MAPPINGS, gson.toJsonTree(mappingType));
+    return gson.toJson(mappings);
+  }
+
+  protected String delete(String type, K id) {
+    return new DeleteRequest(id.toString(), indexName, type, client.adapter()).toString();
+  }
+
+  protected abstract V fromDocument(JsonObject doc, Set<String> fields);
+
+  protected FieldBundle toFieldBundle(JsonObject doc) {
+    Map<String, FieldDef<V, ?>> allFields = getSchema().getFields();
+    ListMultimap<String, Object> rawFields = ArrayListMultimap.create();
+    for (Map.Entry<String, JsonElement> element :
+        doc.get(client.adapter().rawFieldsKey()).getAsJsonObject().entrySet()) {
+      checkArgument(
+          allFields.containsKey(element.getKey()), "Unrecognized field " + element.getKey());
+      FieldType<?> type = allFields.get(element.getKey()).getType();
+      Iterable<JsonElement> innerItems =
+          element.getValue().isJsonArray()
+              ? element.getValue().getAsJsonArray()
+              : Collections.singleton(element.getValue());
+      for (JsonElement inner : innerItems) {
+        if (type == FieldType.EXACT || type == FieldType.FULL_TEXT || type == FieldType.PREFIX) {
+          rawFields.put(element.getKey(), inner.getAsString());
+        } else if (type == FieldType.INTEGER || type == FieldType.INTEGER_RANGE) {
+          rawFields.put(element.getKey(), inner.getAsInt());
+        } else if (type == FieldType.LONG) {
+          rawFields.put(element.getKey(), inner.getAsLong());
+        } else if (type == FieldType.TIMESTAMP) {
+          rawFields.put(element.getKey(), new Timestamp(inner.getAsLong()));
+        } else if (type == FieldType.STORED_ONLY) {
+          rawFields.put(element.getKey(), Base64.decodeBase64(inner.getAsString()));
+        } else {
+          throw FieldType.badFieldType(type);
+        }
+      }
+    }
+    return new FieldBundle(rawFields);
+  }
+
+  protected String toAction(String type, String id, String action) {
+    JsonObject properties = new JsonObject();
+    properties.addProperty("_id", id);
+    properties.addProperty("_index", indexName);
+    properties.addProperty("_type", type);
+
+    JsonObject jsonAction = new JsonObject();
+    jsonAction.add(action, properties);
+    return jsonAction.toString() + System.lineSeparator();
+  }
+
+  protected void addNamedElement(String name, JsonObject element, JsonArray array) {
+    JsonObject arrayElement = new JsonObject();
+    arrayElement.add(name, element);
+    array.add(arrayElement);
+  }
+
+  protected Map<String, String> getRefreshParam() {
+    Map<String, String> params = new HashMap<>();
+    params.put("refresh", "true");
+    return params;
+  }
+
+  protected String getSearch(SearchSourceBuilder searchSource, JsonArray sortArray) {
+    JsonObject search = new JsonParser().parse(searchSource.toString()).getAsJsonObject();
+    search.add("sort", sortArray);
+    return gson.toJson(search);
+  }
+
+  protected JsonArray getSortArray(String idFieldName) {
+    JsonObject properties = new JsonObject();
+    properties.addProperty(ORDER, "asc");
+    client.adapter().setIgnoreUnmapped(properties);
+
+    JsonArray sortArray = new JsonArray();
+    addNamedElement(idFieldName, properties, sortArray);
+    return sortArray;
+  }
+
+  protected String getURI(String type, String request) throws UnsupportedEncodingException {
+    String encodedIndexName = URLEncoder.encode(indexName, UTF_8.toString());
+    if (SEARCH.equals(request) && client.adapter().omitTypeFromSearch()) {
+      return encodedIndexName + "/" + request;
+    }
+    String encodedType = URLEncoder.encode(type, UTF_8.toString());
+    return encodedIndexName + "/" + encodedType + "/" + request;
+  }
+
+  protected Response postRequest(String uri, Object payload) throws IOException {
+    return performRequest("POST", uri, payload);
+  }
+
+  protected Response postRequest(String uri, Object payload, Map<String, String> params)
+      throws IOException {
+    return performRequest("POST", uri, payload, params);
+  }
+
+  private String concatJsonString(String target, String addition) {
+    return target.substring(0, target.length() - 1) + "," + addition.substring(1);
+  }
+
+  private Response performRequest(String method, String uri) throws IOException {
+    return performRequest(method, uri, null);
+  }
+
+  private Response performRequest(String method, String uri, @Nullable Object payload)
+      throws IOException {
+    return performRequest(method, uri, payload, Collections.emptyMap());
+  }
+
+  private Response performRequest(
+      String method, String uri, @Nullable Object payload, Map<String, String> params)
+      throws IOException {
+    Request request = new Request(method, uri.startsWith("/") ? uri : "/" + uri);
+    if (payload != null) {
+      String payloadStr = payload instanceof String ? (String) payload : payload.toString();
+      request.setEntity(new NStringEntity(payloadStr, ContentType.APPLICATION_JSON));
+    }
+    for (Map.Entry<String, String> entry : params.entrySet()) {
+      request.addParameter(entry.getKey(), entry.getValue());
+    }
+    return client.get().performRequest(request);
+  }
+
+  protected class ElasticQuerySource implements DataSource<V> {
+    private final QueryOptions opts;
+    private final String search;
+    private final String index;
+
+    ElasticQuerySource(Predicate<V> p, QueryOptions opts, String index, JsonArray sortArray)
+        throws QueryParseException {
+      this.opts = opts;
+      this.index = index;
+      QueryBuilder qb = queryBuilder.toQueryBuilder(p);
+      SearchSourceBuilder searchSource =
+          new SearchSourceBuilder(client.adapter())
+              .query(qb)
+              .from(opts.start())
+              .size(opts.limit())
+              .fields(Lists.newArrayList(opts.fields()));
+      search = getSearch(searchSource, sortArray);
+    }
+
+    @Override
+    public int getCardinality() {
+      return 10;
+    }
+
+    @Override
+    public ResultSet<V> read() throws OrmException {
+      return readImpl((doc) -> AbstractElasticIndex.this.fromDocument(doc, opts.fields()));
+    }
+
+    @Override
+    public ResultSet<FieldBundle> readRaw() throws OrmException {
+      return readImpl(AbstractElasticIndex.this::toFieldBundle);
+    }
+
+    private <T> ResultSet<T> readImpl(Function<JsonObject, T> mapper) throws OrmException {
+      try {
+        List<T> results = Collections.emptyList();
+        String uri = getURI(index, SEARCH);
+        Response response =
+            performRequest(HttpPost.METHOD_NAME, uri, search, Collections.emptyMap());
+        StatusLine statusLine = response.getStatusLine();
+        if (statusLine.getStatusCode() == HttpStatus.SC_OK) {
+          String content = getContent(response);
+          JsonObject obj =
+              new JsonParser().parse(content).getAsJsonObject().getAsJsonObject("hits");
+          if (obj.get("hits") != null) {
+            JsonArray json = obj.getAsJsonArray("hits");
+            results = Lists.newArrayListWithCapacity(json.size());
+            for (int i = 0; i < json.size(); i++) {
+              T mapperResult = mapper.apply(json.get(i).getAsJsonObject());
+              if (mapperResult != null) {
+                results.add(mapperResult);
+              }
+            }
+          }
+        } else {
+          logger.atSevere().log(statusLine.getReasonPhrase());
+        }
+        final List<T> r = Collections.unmodifiableList(results);
+        return new ResultSet<T>() {
+          @Override
+          public Iterator<T> iterator() {
+            return r.iterator();
+          }
+
+          @Override
+          public List<T> toList() {
+            return r;
+          }
+
+          @Override
+          public void close() {
+            // Do nothing.
+          }
+        };
+      } catch (IOException e) {
+        throw new OrmException(e);
+      }
+    }
+  }
+}
diff --git a/java/com/google/gerrit/elasticsearch/BUILD b/java/com/google/gerrit/elasticsearch/BUILD
new file mode 100644
index 0000000..8d23051
--- /dev/null
+++ b/java/com/google/gerrit/elasticsearch/BUILD
@@ -0,0 +1,31 @@
+java_library(
+    name = "elasticsearch",
+    srcs = glob(["**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/common:annotations",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/index",
+        "//java/com/google/gerrit/index:query_exception",
+        "//java/com/google/gerrit/index/project",
+        "//java/com/google/gerrit/lifecycle",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//lib:gson",
+        "//lib:guava",
+        "//lib:gwtorm",
+        "//lib:protobuf",
+        "//lib/commons:codec",
+        "//lib/commons:lang",
+        "//lib/elasticsearch-rest-client",
+        "//lib/flogger:api",
+        "//lib/guice",
+        "//lib/guice:guice-assistedinject",
+        "//lib/httpcomponents:httpasyncclient",
+        "//lib/httpcomponents:httpclient",
+        "//lib/httpcomponents:httpcore",
+        "//lib/httpcomponents:httpcore-nio",
+        "//lib/jackson:jackson-core",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+    ],
+)
diff --git a/java/com/google/gerrit/elasticsearch/ElasticAccountIndex.java b/java/com/google/gerrit/elasticsearch/ElasticAccountIndex.java
new file mode 100644
index 0000000..d0b70ae
--- /dev/null
+++ b/java/com/google/gerrit/elasticsearch/ElasticAccountIndex.java
@@ -0,0 +1,129 @@
+// 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.
+
+package com.google.gerrit.elasticsearch;
+
+import static com.google.gerrit.server.index.account.AccountField.ID;
+
+import com.google.gerrit.elasticsearch.ElasticMapping.MappingProperties;
+import com.google.gerrit.elasticsearch.bulk.BulkRequest;
+import com.google.gerrit.elasticsearch.bulk.IndexRequest;
+import com.google.gerrit.elasticsearch.bulk.UpdateRequest;
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.index.query.DataSource;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.index.IndexUtils;
+import com.google.gerrit.server.index.account.AccountField;
+import com.google.gerrit.server.index.account.AccountIndex;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.util.Set;
+import org.apache.http.HttpStatus;
+import org.elasticsearch.client.Response;
+
+public class ElasticAccountIndex extends AbstractElasticIndex<Account.Id, AccountState>
+    implements AccountIndex {
+  static class AccountMapping {
+    final MappingProperties accounts;
+
+    AccountMapping(Schema<AccountState> schema, ElasticQueryAdapter adapter) {
+      this.accounts = ElasticMapping.createMapping(schema, adapter);
+    }
+  }
+
+  private static final String ACCOUNTS = "accounts";
+
+  private final AccountMapping mapping;
+  private final Provider<AccountCache> accountCache;
+  private final Schema<AccountState> schema;
+
+  @Inject
+  ElasticAccountIndex(
+      ElasticConfiguration cfg,
+      SitePaths sitePaths,
+      Provider<AccountCache> accountCache,
+      ElasticRestClientProvider client,
+      @Assisted Schema<AccountState> schema) {
+    super(cfg, sitePaths, schema, client, ACCOUNTS);
+    this.accountCache = accountCache;
+    this.mapping = new AccountMapping(schema, client.adapter());
+    this.schema = schema;
+  }
+
+  @Override
+  public void replace(AccountState as) throws IOException {
+    BulkRequest bulk =
+        new IndexRequest(getId(as), indexName, type, client.adapter())
+            .add(new UpdateRequest<>(schema, as));
+
+    String uri = getURI(type, BULK);
+    Response response = postRequest(uri, bulk, getRefreshParam());
+    int statusCode = response.getStatusLine().getStatusCode();
+    if (statusCode != HttpStatus.SC_OK) {
+      throw new IOException(
+          String.format(
+              "Failed to replace account %s in index %s: %s",
+              as.getAccount().getId(), indexName, statusCode));
+    }
+  }
+
+  @Override
+  public DataSource<AccountState> getSource(Predicate<AccountState> p, QueryOptions opts)
+      throws QueryParseException {
+    JsonArray sortArray = getSortArray(AccountField.ID.getName());
+    return new ElasticQuerySource(p, opts.filterFields(IndexUtils::accountFields), type, sortArray);
+  }
+
+  @Override
+  protected String getDeleteActions(Account.Id a) {
+    return delete(type, a);
+  }
+
+  @Override
+  protected String getMappings() {
+    return getMappingsForSingleType(ACCOUNTS, mapping.accounts);
+  }
+
+  @Override
+  protected String getId(AccountState as) {
+    return as.getAccount().getId().toString();
+  }
+
+  @Override
+  protected AccountState fromDocument(JsonObject json, Set<String> fields) {
+    JsonElement source = json.get("_source");
+    if (source == null) {
+      source = json.getAsJsonObject().get("fields");
+    }
+
+    Account.Id id = new Account.Id(source.getAsJsonObject().get(ID.getName()).getAsInt());
+    // Use the AccountCache rather than depending on any stored fields in the document (of which
+    // there shouldn't be any). The most expensive part to compute anyway is the effective group
+    // IDs, and we don't have a good way to reindex when those change.
+    // If the account doesn't exist return an empty AccountState to represent the missing account
+    // to account the fact that the account exists in the index.
+    return accountCache.get().getEvenIfMissing(id);
+  }
+}
diff --git a/java/com/google/gerrit/elasticsearch/ElasticChangeIndex.java b/java/com/google/gerrit/elasticsearch/ElasticChangeIndex.java
new file mode 100644
index 0000000..1224c61
--- /dev/null
+++ b/java/com/google/gerrit/elasticsearch/ElasticChangeIndex.java
@@ -0,0 +1,434 @@
+// Copyright (C) 2014 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.google.gerrit.elasticsearch;
+
+import static com.google.gerrit.reviewdb.server.ReviewDbCodecs.APPROVAL_CODEC;
+import static com.google.gerrit.reviewdb.server.ReviewDbCodecs.CHANGE_CODEC;
+import static com.google.gerrit.reviewdb.server.ReviewDbCodecs.PATCH_SET_CODEC;
+import static com.google.gerrit.server.index.change.ChangeIndexRewriter.CLOSED_STATUSES;
+import static com.google.gerrit.server.index.change.ChangeIndexRewriter.OPEN_STATUSES;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Objects.requireNonNull;
+import static org.apache.commons.codec.binary.Base64.decodeBase64;
+
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.collect.Sets;
+import com.google.gerrit.elasticsearch.ElasticMapping.MappingProperties;
+import com.google.gerrit.elasticsearch.bulk.BulkRequest;
+import com.google.gerrit.elasticsearch.bulk.DeleteRequest;
+import com.google.gerrit.elasticsearch.bulk.IndexRequest;
+import com.google.gerrit.elasticsearch.bulk.UpdateRequest;
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.index.query.DataSource;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Change.Id;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ReviewerByEmailSet;
+import com.google.gerrit.server.ReviewerSet;
+import com.google.gerrit.server.StarredChangesUtil;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.index.IndexUtils;
+import com.google.gerrit.server.index.change.ChangeField;
+import com.google.gerrit.server.index.change.ChangeIndex;
+import com.google.gerrit.server.index.change.ChangeIndexRewriter;
+import com.google.gerrit.server.project.SubmitRuleOptions;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.http.HttpStatus;
+import org.elasticsearch.client.Response;
+
+/** Secondary index implementation using Elasticsearch. */
+class ElasticChangeIndex extends AbstractElasticIndex<Change.Id, ChangeData>
+    implements ChangeIndex {
+  static class ChangeMapping {
+    final MappingProperties changes;
+    final MappingProperties openChanges;
+    final MappingProperties closedChanges;
+
+    ChangeMapping(Schema<ChangeData> schema, ElasticQueryAdapter adapter) {
+      MappingProperties mapping = ElasticMapping.createMapping(schema, adapter);
+      this.changes = mapping;
+      this.openChanges = mapping;
+      this.closedChanges = mapping;
+    }
+  }
+
+  private static final String CHANGES = "changes";
+  private static final String OPEN_CHANGES = "open_" + CHANGES;
+  private static final String CLOSED_CHANGES = "closed_" + CHANGES;
+
+  private final ChangeMapping mapping;
+  private final Provider<ReviewDb> db;
+  private final ChangeData.Factory changeDataFactory;
+  private final Schema<ChangeData> schema;
+
+  @Inject
+  ElasticChangeIndex(
+      ElasticConfiguration cfg,
+      Provider<ReviewDb> db,
+      ChangeData.Factory changeDataFactory,
+      SitePaths sitePaths,
+      ElasticRestClientProvider clientBuilder,
+      @Assisted Schema<ChangeData> schema) {
+    super(cfg, sitePaths, schema, clientBuilder, CHANGES);
+    this.db = db;
+    this.changeDataFactory = changeDataFactory;
+    this.schema = schema;
+    mapping = new ChangeMapping(schema, client.adapter());
+  }
+
+  @Override
+  public void replace(ChangeData cd) throws IOException {
+    String deleteIndex;
+    String insertIndex;
+
+    try {
+      if (cd.change().getStatus().isOpen()) {
+        insertIndex = OPEN_CHANGES;
+        deleteIndex = CLOSED_CHANGES;
+      } else {
+        insertIndex = CLOSED_CHANGES;
+        deleteIndex = OPEN_CHANGES;
+      }
+    } catch (OrmException e) {
+      throw new IOException(e);
+    }
+
+    ElasticQueryAdapter adapter = client.adapter();
+    BulkRequest bulk =
+        new IndexRequest(getId(cd), indexName, adapter.getType(insertIndex), adapter)
+            .add(new UpdateRequest<>(schema, cd));
+    if (!adapter.usePostV5Type()) {
+      bulk.add(new DeleteRequest(cd.getId().toString(), indexName, deleteIndex, adapter));
+    }
+
+    String uri = getURI(type, BULK);
+    Response response = postRequest(uri, bulk, getRefreshParam());
+    int statusCode = response.getStatusLine().getStatusCode();
+    if (statusCode != HttpStatus.SC_OK) {
+      throw new IOException(
+          String.format(
+              "Failed to replace change %s in index %s: %s", cd.getId(), indexName, statusCode));
+    }
+  }
+
+  @Override
+  public DataSource<ChangeData> getSource(Predicate<ChangeData> p, QueryOptions opts)
+      throws QueryParseException {
+    Set<Change.Status> statuses = ChangeIndexRewriter.getPossibleStatus(p);
+    List<String> indexes = Lists.newArrayListWithCapacity(2);
+    if (client.adapter().usePostV5Type()) {
+      if (!Sets.intersection(statuses, OPEN_STATUSES).isEmpty()
+          || !Sets.intersection(statuses, CLOSED_STATUSES).isEmpty()) {
+        indexes.add(ElasticQueryAdapter.POST_V5_TYPE);
+      }
+    } else {
+      if (!Sets.intersection(statuses, OPEN_STATUSES).isEmpty()) {
+        indexes.add(OPEN_CHANGES);
+      }
+      if (!Sets.intersection(statuses, CLOSED_STATUSES).isEmpty()) {
+        indexes.add(CLOSED_CHANGES);
+      }
+    }
+
+    QueryOptions filteredOpts = opts.filterFields(IndexUtils::changeFields);
+    return new ElasticQuerySource(p, filteredOpts, getURI(indexes), getSortArray());
+  }
+
+  private JsonArray getSortArray() {
+    JsonObject properties = new JsonObject();
+    properties.addProperty(ORDER, "desc");
+    client.adapter().setIgnoreUnmapped(properties);
+
+    JsonArray sortArray = new JsonArray();
+    addNamedElement(ChangeField.UPDATED.getName(), properties, sortArray);
+    addNamedElement(ChangeField.LEGACY_ID.getName(), properties, sortArray);
+    return sortArray;
+  }
+
+  private String getURI(List<String> types) {
+    return String.join(",", types);
+  }
+
+  @Override
+  protected String getDeleteActions(Id c) {
+    if (client.adapter().usePostV5Type()) {
+      return delete(ElasticQueryAdapter.POST_V5_TYPE, c);
+    }
+    return delete(OPEN_CHANGES, c) + delete(CLOSED_CHANGES, c);
+  }
+
+  @Override
+  protected String getMappings() {
+    if (client.adapter().usePostV5Type()) {
+      return getMappingsFor(ElasticQueryAdapter.POST_V5_TYPE, mapping.changes);
+    }
+    return gson.toJson(ImmutableMap.of(MAPPINGS, mapping));
+  }
+
+  @Override
+  protected String getId(ChangeData cd) {
+    return cd.getId().toString();
+  }
+
+  @Override
+  protected ChangeData fromDocument(JsonObject json, Set<String> fields) {
+    JsonElement sourceElement = json.get("_source");
+    if (sourceElement == null) {
+      sourceElement = json.getAsJsonObject().get("fields");
+    }
+    JsonObject source = sourceElement.getAsJsonObject();
+    JsonElement c = source.get(ChangeField.CHANGE.getName());
+
+    if (c == null) {
+      int id = source.get(ChangeField.LEGACY_ID.getName()).getAsInt();
+      // IndexUtils#changeFields ensures either CHANGE or PROJECT is always present.
+      String projectName = requireNonNull(source.get(ChangeField.PROJECT.getName()).getAsString());
+      return changeDataFactory.create(
+          db.get(), new Project.NameKey(projectName), new Change.Id(id));
+    }
+
+    ChangeData cd =
+        changeDataFactory.create(
+            db.get(), CHANGE_CODEC.decode(Base64.decodeBase64(c.getAsString())));
+
+    // Any decoding that is done here must also be done in {@link LuceneChangeIndex}.
+
+    // Patch sets.
+    cd.setPatchSets(decodeProtos(source, ChangeField.PATCH_SET.getName(), PATCH_SET_CODEC));
+
+    // Approvals.
+    if (source.get(ChangeField.APPROVAL.getName()) != null) {
+      cd.setCurrentApprovals(decodeProtos(source, ChangeField.APPROVAL.getName(), APPROVAL_CODEC));
+    } else if (fields.contains(ChangeField.APPROVAL.getName())) {
+      cd.setCurrentApprovals(Collections.emptyList());
+    }
+
+    // Added & Deleted.
+    JsonElement addedElement = source.get(ChangeField.ADDED.getName());
+    JsonElement deletedElement = source.get(ChangeField.DELETED.getName());
+    if (addedElement != null && deletedElement != null) {
+      // Changed lines.
+      int added = addedElement.getAsInt();
+      int deleted = deletedElement.getAsInt();
+      cd.setChangedLines(added, deleted);
+    }
+
+    // Star.
+    JsonElement starredElement = source.get(ChangeField.STAR.getName());
+    if (starredElement != null) {
+      ListMultimap<Account.Id, String> stars = MultimapBuilder.hashKeys().arrayListValues().build();
+      JsonArray starBy = starredElement.getAsJsonArray();
+      if (starBy.size() > 0) {
+        for (int i = 0; i < starBy.size(); i++) {
+          String[] indexableFields = starBy.get(i).getAsString().split(":");
+          Optional<Account.Id> id = Account.Id.tryParse(indexableFields[0]);
+          if (id.isPresent()) {
+            stars.put(id.get(), indexableFields[1]);
+          }
+        }
+      }
+      cd.setStars(stars);
+    }
+
+    // Mergeable.
+    JsonElement mergeableElement = source.get(ChangeField.MERGEABLE.getName());
+    if (mergeableElement != null) {
+      String mergeable = mergeableElement.getAsString();
+      if ("1".equals(mergeable)) {
+        cd.setMergeable(true);
+      } else if ("0".equals(mergeable)) {
+        cd.setMergeable(false);
+      }
+    }
+
+    // Reviewed-by.
+    if (source.get(ChangeField.REVIEWEDBY.getName()) != null) {
+      JsonArray reviewedBy = source.get(ChangeField.REVIEWEDBY.getName()).getAsJsonArray();
+      if (reviewedBy.size() > 0) {
+        Set<Account.Id> accounts = Sets.newHashSetWithExpectedSize(reviewedBy.size());
+        for (int i = 0; i < reviewedBy.size(); i++) {
+          int aId = reviewedBy.get(i).getAsInt();
+          if (reviewedBy.size() == 1 && aId == ChangeField.NOT_REVIEWED) {
+            break;
+          }
+          accounts.add(new Account.Id(aId));
+        }
+        cd.setReviewedBy(accounts);
+      }
+    } else if (fields.contains(ChangeField.REVIEWEDBY.getName())) {
+      cd.setReviewedBy(Collections.emptySet());
+    }
+
+    // Hashtag.
+    if (source.get(ChangeField.HASHTAG.getName()) != null) {
+      JsonArray hashtagArray = source.get(ChangeField.HASHTAG.getName()).getAsJsonArray();
+      if (hashtagArray.size() > 0) {
+        Set<String> hashtags = Sets.newHashSetWithExpectedSize(hashtagArray.size());
+        for (int i = 0; i < hashtagArray.size(); i++) {
+          hashtags.add(hashtagArray.get(i).getAsString());
+        }
+        cd.setHashtags(hashtags);
+      }
+    } else if (fields.contains(ChangeField.HASHTAG.getName())) {
+      cd.setHashtags(Collections.emptySet());
+    }
+
+    // Star.
+    if (source.get(ChangeField.STAR.getName()) != null) {
+      JsonArray starArray = source.get(ChangeField.STAR.getName()).getAsJsonArray();
+      if (starArray.size() > 0) {
+        ListMultimap<Account.Id, String> stars =
+            MultimapBuilder.hashKeys().arrayListValues().build();
+        for (int i = 0; i < starArray.size(); i++) {
+          StarredChangesUtil.StarField starField =
+              StarredChangesUtil.StarField.parse(starArray.get(i).getAsString());
+          stars.put(starField.accountId(), starField.label());
+        }
+        cd.setStars(stars);
+      }
+    } else if (fields.contains(ChangeField.STAR.getName())) {
+      cd.setStars(ImmutableListMultimap.of());
+    }
+
+    // Reviewer.
+    if (source.get(ChangeField.REVIEWER.getName()) != null) {
+      cd.setReviewers(
+          ChangeField.parseReviewerFieldValues(
+              cd.getId(),
+              FluentIterable.from(source.get(ChangeField.REVIEWER.getName()).getAsJsonArray())
+                  .transform(JsonElement::getAsString)));
+    } else if (fields.contains(ChangeField.REVIEWER.getName())) {
+      cd.setReviewers(ReviewerSet.empty());
+    }
+
+    // Reviewer-by-email.
+    if (source.get(ChangeField.REVIEWER_BY_EMAIL.getName()) != null) {
+      cd.setReviewersByEmail(
+          ChangeField.parseReviewerByEmailFieldValues(
+              cd.getId(),
+              FluentIterable.from(
+                      source.get(ChangeField.REVIEWER_BY_EMAIL.getName()).getAsJsonArray())
+                  .transform(JsonElement::getAsString)));
+    } else if (fields.contains(ChangeField.REVIEWER_BY_EMAIL.getName())) {
+      cd.setReviewersByEmail(ReviewerByEmailSet.empty());
+    }
+
+    // Pending-reviewer.
+    if (source.get(ChangeField.PENDING_REVIEWER.getName()) != null) {
+      cd.setPendingReviewers(
+          ChangeField.parseReviewerFieldValues(
+              cd.getId(),
+              FluentIterable.from(
+                      source.get(ChangeField.PENDING_REVIEWER.getName()).getAsJsonArray())
+                  .transform(JsonElement::getAsString)));
+    } else if (fields.contains(ChangeField.PENDING_REVIEWER.getName())) {
+      cd.setPendingReviewers(ReviewerSet.empty());
+    }
+
+    // Pending-reviewer-by-email.
+    if (source.get(ChangeField.PENDING_REVIEWER_BY_EMAIL.getName()) != null) {
+      cd.setPendingReviewersByEmail(
+          ChangeField.parseReviewerByEmailFieldValues(
+              cd.getId(),
+              FluentIterable.from(
+                      source.get(ChangeField.PENDING_REVIEWER_BY_EMAIL.getName()).getAsJsonArray())
+                  .transform(JsonElement::getAsString)));
+    } else if (fields.contains(ChangeField.PENDING_REVIEWER_BY_EMAIL.getName())) {
+      cd.setPendingReviewersByEmail(ReviewerByEmailSet.empty());
+    }
+
+    // Stored-submit-record-strict.
+    decodeSubmitRecords(
+        source,
+        ChangeField.STORED_SUBMIT_RECORD_STRICT.getName(),
+        ChangeField.SUBMIT_RULE_OPTIONS_STRICT,
+        cd);
+
+    // Stored-submit-record-leniant.
+    decodeSubmitRecords(
+        source,
+        ChangeField.STORED_SUBMIT_RECORD_LENIENT.getName(),
+        ChangeField.SUBMIT_RULE_OPTIONS_LENIENT,
+        cd);
+
+    // Ref-state.
+    if (fields.contains(ChangeField.REF_STATE.getName())) {
+      cd.setRefStates(getByteArray(source, ChangeField.REF_STATE.getName()));
+    }
+
+    // Ref-state-pattern.
+    if (fields.contains(ChangeField.REF_STATE_PATTERN.getName())) {
+      cd.setRefStatePatterns(getByteArray(source, ChangeField.REF_STATE_PATTERN.getName()));
+    }
+
+    // Unresolved-comment-count.
+    decodeUnresolvedCommentCount(source, ChangeField.UNRESOLVED_COMMENT_COUNT.getName(), cd);
+
+    return cd;
+  }
+
+  private Iterable<byte[]> getByteArray(JsonObject source, String name) {
+    JsonElement element = source.get(name);
+    return element != null
+        ? Iterables.transform(element.getAsJsonArray(), e -> Base64.decodeBase64(e.getAsString()))
+        : Collections.emptyList();
+  }
+
+  private void decodeSubmitRecords(
+      JsonObject doc, String fieldName, SubmitRuleOptions opts, ChangeData out) {
+    JsonArray records = doc.getAsJsonArray(fieldName);
+    if (records == null) {
+      return;
+    }
+    ChangeField.parseSubmitRecords(
+        FluentIterable.from(records)
+            .transform(i -> new String(decodeBase64(i.toString()), UTF_8))
+            .toList(),
+        opts,
+        out);
+  }
+
+  private void decodeUnresolvedCommentCount(JsonObject doc, String fieldName, ChangeData out) {
+    JsonElement count = doc.get(fieldName);
+    if (count == null) {
+      return;
+    }
+    out.setUnresolvedCommentCount(count.getAsInt());
+  }
+}
diff --git a/java/com/google/gerrit/elasticsearch/ElasticConfiguration.java b/java/com/google/gerrit/elasticsearch/ElasticConfiguration.java
new file mode 100644
index 0000000..6863238
--- /dev/null
+++ b/java/com/google/gerrit/elasticsearch/ElasticConfiguration.java
@@ -0,0 +1,116 @@
+// Copyright (C) 2017 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.google.gerrit.elasticsearch;
+
+import static com.google.common.base.MoreObjects.firstNonNull;
+
+import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.inject.Inject;
+import com.google.inject.ProvisionException;
+import com.google.inject.Singleton;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import org.apache.http.HttpHost;
+import org.eclipse.jgit.lib.Config;
+
+@Singleton
+class ElasticConfiguration {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  static final String SECTION_ELASTICSEARCH = "elasticsearch";
+  static final String KEY_PASSWORD = "password";
+  static final String KEY_USERNAME = "username";
+  static final String KEY_MAX_RETRY_TIMEOUT = "maxRetryTimeout";
+  static final String KEY_PREFIX = "prefix";
+  static final String KEY_SERVER = "server";
+  static final String KEY_NUMBER_OF_SHARDS = "numberOfShards";
+  static final String KEY_NUMBER_OF_REPLICAS = "numberOfReplicas";
+  static final String DEFAULT_PORT = "9200";
+  static final String DEFAULT_USERNAME = "elastic";
+  static final int DEFAULT_MAX_RETRY_TIMEOUT_MS = 30000;
+  static final int DEFAULT_NUMBER_OF_SHARDS = 5;
+  static final int DEFAULT_NUMBER_OF_REPLICAS = 1;
+  static final TimeUnit MAX_RETRY_TIMEOUT_UNIT = TimeUnit.MILLISECONDS;
+
+  private final Config cfg;
+  private final List<HttpHost> hosts;
+
+  final String username;
+  final String password;
+  final int maxRetryTimeout;
+  final int numberOfShards;
+  final int numberOfReplicas;
+  final String prefix;
+
+  @Inject
+  ElasticConfiguration(@GerritServerConfig Config cfg) {
+    this.cfg = cfg;
+    this.password = cfg.getString(SECTION_ELASTICSEARCH, null, KEY_PASSWORD);
+    this.username =
+        password == null
+            ? null
+            : firstNonNull(
+                cfg.getString(SECTION_ELASTICSEARCH, null, KEY_USERNAME), DEFAULT_USERNAME);
+    this.maxRetryTimeout =
+        (int)
+            cfg.getTimeUnit(
+                SECTION_ELASTICSEARCH,
+                null,
+                KEY_MAX_RETRY_TIMEOUT,
+                DEFAULT_MAX_RETRY_TIMEOUT_MS,
+                MAX_RETRY_TIMEOUT_UNIT);
+    this.prefix = Strings.nullToEmpty(cfg.getString(SECTION_ELASTICSEARCH, null, KEY_PREFIX));
+    this.numberOfShards =
+        cfg.getInt(SECTION_ELASTICSEARCH, null, KEY_NUMBER_OF_SHARDS, DEFAULT_NUMBER_OF_SHARDS);
+    this.numberOfReplicas =
+        cfg.getInt(SECTION_ELASTICSEARCH, null, KEY_NUMBER_OF_REPLICAS, DEFAULT_NUMBER_OF_REPLICAS);
+    this.hosts = new ArrayList<>();
+    for (String server : cfg.getStringList(SECTION_ELASTICSEARCH, null, KEY_SERVER)) {
+      try {
+        URI uri = new URI(server);
+        int port = uri.getPort();
+        HttpHost httpHost =
+            new HttpHost(
+                uri.getHost(), port == -1 ? Integer.valueOf(DEFAULT_PORT) : port, uri.getScheme());
+        this.hosts.add(httpHost);
+      } catch (URISyntaxException | IllegalArgumentException e) {
+        logger.atSevere().log("Invalid server URI %s: %s", server, e.getMessage());
+      }
+    }
+
+    if (hosts.isEmpty()) {
+      throw new ProvisionException("No valid Elasticsearch servers configured");
+    }
+
+    logger.atInfo().log("Elasticsearch servers: %s", hosts);
+  }
+
+  Config getConfig() {
+    return cfg;
+  }
+
+  HttpHost[] getHosts() {
+    return hosts.toArray(new HttpHost[hosts.size()]);
+  }
+
+  String getIndexName(String name, int schemaVersion) {
+    return String.format("%s%s_%04d", prefix, name, schemaVersion);
+  }
+}
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticException.java b/java/com/google/gerrit/elasticsearch/ElasticException.java
similarity index 100%
rename from gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticException.java
rename to java/com/google/gerrit/elasticsearch/ElasticException.java
diff --git a/java/com/google/gerrit/elasticsearch/ElasticGroupIndex.java b/java/com/google/gerrit/elasticsearch/ElasticGroupIndex.java
new file mode 100644
index 0000000..e74f208
--- /dev/null
+++ b/java/com/google/gerrit/elasticsearch/ElasticGroupIndex.java
@@ -0,0 +1,126 @@
+// Copyright (C) 2017 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.google.gerrit.elasticsearch;
+
+import com.google.gerrit.elasticsearch.ElasticMapping.MappingProperties;
+import com.google.gerrit.elasticsearch.bulk.BulkRequest;
+import com.google.gerrit.elasticsearch.bulk.IndexRequest;
+import com.google.gerrit.elasticsearch.bulk.UpdateRequest;
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.index.query.DataSource;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.account.GroupCache;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.index.IndexUtils;
+import com.google.gerrit.server.index.group.GroupField;
+import com.google.gerrit.server.index.group.GroupIndex;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.util.Set;
+import org.apache.http.HttpStatus;
+import org.elasticsearch.client.Response;
+
+public class ElasticGroupIndex extends AbstractElasticIndex<AccountGroup.UUID, InternalGroup>
+    implements GroupIndex {
+  static class GroupMapping {
+    final MappingProperties groups;
+
+    GroupMapping(Schema<InternalGroup> schema, ElasticQueryAdapter adapter) {
+      this.groups = ElasticMapping.createMapping(schema, adapter);
+    }
+  }
+
+  private static final String GROUPS = "groups";
+
+  private final GroupMapping mapping;
+  private final Provider<GroupCache> groupCache;
+  private final Schema<InternalGroup> schema;
+
+  @Inject
+  ElasticGroupIndex(
+      ElasticConfiguration cfg,
+      SitePaths sitePaths,
+      Provider<GroupCache> groupCache,
+      ElasticRestClientProvider client,
+      @Assisted Schema<InternalGroup> schema) {
+    super(cfg, sitePaths, schema, client, GROUPS);
+    this.groupCache = groupCache;
+    this.mapping = new GroupMapping(schema, client.adapter());
+    this.schema = schema;
+  }
+
+  @Override
+  public void replace(InternalGroup group) throws IOException {
+    BulkRequest bulk =
+        new IndexRequest(getId(group), indexName, type, client.adapter())
+            .add(new UpdateRequest<>(schema, group));
+
+    String uri = getURI(type, BULK);
+    Response response = postRequest(uri, bulk, getRefreshParam());
+    int statusCode = response.getStatusLine().getStatusCode();
+    if (statusCode != HttpStatus.SC_OK) {
+      throw new IOException(
+          String.format(
+              "Failed to replace group %s in index %s: %s",
+              group.getGroupUUID().get(), indexName, statusCode));
+    }
+  }
+
+  @Override
+  public DataSource<InternalGroup> getSource(Predicate<InternalGroup> p, QueryOptions opts)
+      throws QueryParseException {
+    JsonArray sortArray = getSortArray(GroupField.UUID.getName());
+    return new ElasticQuerySource(p, opts.filterFields(IndexUtils::groupFields), type, sortArray);
+  }
+
+  @Override
+  protected String getDeleteActions(AccountGroup.UUID g) {
+    return delete(type, g);
+  }
+
+  @Override
+  protected String getMappings() {
+    return getMappingsForSingleType(GROUPS, mapping.groups);
+  }
+
+  @Override
+  protected String getId(InternalGroup group) {
+    return group.getGroupUUID().get();
+  }
+
+  @Override
+  protected InternalGroup fromDocument(JsonObject json, Set<String> fields) {
+    JsonElement source = json.get("_source");
+    if (source == null) {
+      source = json.getAsJsonObject().get("fields");
+    }
+
+    AccountGroup.UUID uuid =
+        new AccountGroup.UUID(
+            source.getAsJsonObject().get(GroupField.UUID.getName()).getAsString());
+    // Use the GroupCache rather than depending on any stored fields in the
+    // document (of which there shouldn't be any).
+    return groupCache.get().get(uuid).orElse(null);
+  }
+}
diff --git a/java/com/google/gerrit/elasticsearch/ElasticIndexModule.java b/java/com/google/gerrit/elasticsearch/ElasticIndexModule.java
new file mode 100644
index 0000000..15d6126
--- /dev/null
+++ b/java/com/google/gerrit/elasticsearch/ElasticIndexModule.java
@@ -0,0 +1,69 @@
+// Copyright (C) 2014 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.google.gerrit.elasticsearch;
+
+import com.google.gerrit.index.project.ProjectIndex;
+import com.google.gerrit.server.index.AbstractIndexModule;
+import com.google.gerrit.server.index.VersionManager;
+import com.google.gerrit.server.index.account.AccountIndex;
+import com.google.gerrit.server.index.change.ChangeIndex;
+import com.google.gerrit.server.index.group.GroupIndex;
+import java.util.Map;
+
+public class ElasticIndexModule extends AbstractIndexModule {
+  public static ElasticIndexModule singleVersionWithExplicitVersions(
+      Map<String, Integer> versions, int threads, boolean slave) {
+    return new ElasticIndexModule(versions, threads, slave);
+  }
+
+  public static ElasticIndexModule latestVersion(boolean slave) {
+    return new ElasticIndexModule(null, 0, slave);
+  }
+
+  private ElasticIndexModule(Map<String, Integer> singleVersions, int threads, boolean slave) {
+    super(singleVersions, threads, slave);
+  }
+
+  @Override
+  public void configure() {
+    super.configure();
+    install(ElasticRestClientProvider.module());
+  }
+
+  @Override
+  protected Class<? extends AccountIndex> getAccountIndex() {
+    return ElasticAccountIndex.class;
+  }
+
+  @Override
+  protected Class<? extends ChangeIndex> getChangeIndex() {
+    return ElasticChangeIndex.class;
+  }
+
+  @Override
+  protected Class<? extends GroupIndex> getGroupIndex() {
+    return ElasticGroupIndex.class;
+  }
+
+  @Override
+  protected Class<? extends ProjectIndex> getProjectIndex() {
+    return ElasticProjectIndex.class;
+  }
+
+  @Override
+  protected Class<? extends VersionManager> getVersionManager() {
+    return ElasticIndexVersionManager.class;
+  }
+}
diff --git a/java/com/google/gerrit/elasticsearch/ElasticIndexVersionDiscovery.java b/java/com/google/gerrit/elasticsearch/ElasticIndexVersionDiscovery.java
new file mode 100644
index 0000000..100022a
--- /dev/null
+++ b/java/com/google/gerrit/elasticsearch/ElasticIndexVersionDiscovery.java
@@ -0,0 +1,61 @@
+// Copyright (C) 2017 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.google.gerrit.elasticsearch;
+
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gson.JsonParser;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.List;
+import org.apache.http.HttpStatus;
+import org.apache.http.StatusLine;
+import org.elasticsearch.client.Request;
+import org.elasticsearch.client.Response;
+
+@Singleton
+class ElasticIndexVersionDiscovery {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final ElasticRestClientProvider client;
+
+  @Inject
+  ElasticIndexVersionDiscovery(ElasticRestClientProvider client) {
+    this.client = client;
+  }
+
+  List<String> discover(String prefix, String indexName) throws IOException {
+    String name = prefix + indexName + "_";
+    Request request = new Request("GET", client.adapter().getVersionDiscoveryUrl(name));
+    Response response = client.get().performRequest(request);
+
+    StatusLine statusLine = response.getStatusLine();
+    if (statusLine.getStatusCode() != HttpStatus.SC_OK) {
+      String message =
+          String.format(
+              "Failed to discover index versions for %s: %d: %s",
+              name, statusLine.getStatusCode(), statusLine.getReasonPhrase());
+      logger.atSevere().log(message);
+      throw new IOException(message);
+    }
+
+    return new JsonParser()
+        .parse(AbstractElasticIndex.getContent(response)).getAsJsonObject().entrySet().stream()
+            .map(e -> e.getKey().replace(name, ""))
+            .collect(toList());
+  }
+}
diff --git a/java/com/google/gerrit/elasticsearch/ElasticIndexVersionManager.java b/java/com/google/gerrit/elasticsearch/ElasticIndexVersionManager.java
new file mode 100644
index 0000000..8011efa
--- /dev/null
+++ b/java/com/google/gerrit/elasticsearch/ElasticIndexVersionManager.java
@@ -0,0 +1,82 @@
+// Copyright (C) 2017 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.google.gerrit.elasticsearch;
+
+import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.primitives.Ints;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.index.Index;
+import com.google.gerrit.index.IndexDefinition;
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.index.GerritIndexStatus;
+import com.google.gerrit.server.index.OnlineUpgradeListener;
+import com.google.gerrit.server.index.VersionManager;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.List;
+import java.util.TreeMap;
+import org.eclipse.jgit.lib.Config;
+
+@Singleton
+public class ElasticIndexVersionManager extends VersionManager {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final String prefix;
+  private final ElasticIndexVersionDiscovery versionDiscovery;
+
+  @Inject
+  ElasticIndexVersionManager(
+      @GerritServerConfig Config cfg,
+      SitePaths sitePaths,
+      DynamicSet<OnlineUpgradeListener> listeners,
+      Collection<IndexDefinition<?, ?, ?>> defs,
+      ElasticIndexVersionDiscovery versionDiscovery) {
+    super(sitePaths, listeners, defs, VersionManager.getOnlineUpgrade(cfg));
+    this.versionDiscovery = versionDiscovery;
+    prefix = Strings.nullToEmpty(cfg.getString("elasticsearch", null, "prefix"));
+  }
+
+  @Override
+  protected <K, V, I extends Index<K, V>> TreeMap<Integer, Version<V>> scanVersions(
+      IndexDefinition<K, V, I> def, GerritIndexStatus cfg) {
+    TreeMap<Integer, Version<V>> versions = new TreeMap<>();
+    try {
+      List<String> discovered = versionDiscovery.discover(prefix, def.getName());
+      logger.atFine().log("Discovered versions for %s: %s", def.getName(), discovered);
+      for (String version : discovered) {
+        Integer v = Ints.tryParse(version);
+        if (v == null || version.length() != 4) {
+          logger.atWarning().log("Unrecognized version in index %s: %s", def.getName(), version);
+          continue;
+        }
+        versions.put(v, new Version<>(null, v, true, cfg.getReady(def.getName(), v)));
+      }
+    } catch (IOException e) {
+      logger.atSevere().withCause(e).log("Error scanning index: %s", def.getName());
+    }
+
+    for (Schema<V> schema : def.getSchemas().values()) {
+      int v = schema.getVersion();
+      boolean exists = versions.containsKey(v);
+      versions.put(v, new Version<>(schema, v, exists, cfg.getReady(def.getName(), v)));
+    }
+    return versions;
+  }
+}
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticMapping.java b/java/com/google/gerrit/elasticsearch/ElasticMapping.java
similarity index 100%
rename from gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticMapping.java
rename to java/com/google/gerrit/elasticsearch/ElasticMapping.java
diff --git a/java/com/google/gerrit/elasticsearch/ElasticProjectIndex.java b/java/com/google/gerrit/elasticsearch/ElasticProjectIndex.java
new file mode 100644
index 0000000..8510559
--- /dev/null
+++ b/java/com/google/gerrit/elasticsearch/ElasticProjectIndex.java
@@ -0,0 +1,124 @@
+// Copyright (C) 2017 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.google.gerrit.elasticsearch;
+
+import com.google.gerrit.elasticsearch.ElasticMapping.MappingProperties;
+import com.google.gerrit.elasticsearch.bulk.BulkRequest;
+import com.google.gerrit.elasticsearch.bulk.IndexRequest;
+import com.google.gerrit.elasticsearch.bulk.UpdateRequest;
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.index.project.ProjectData;
+import com.google.gerrit.index.project.ProjectField;
+import com.google.gerrit.index.project.ProjectIndex;
+import com.google.gerrit.index.query.DataSource;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.index.IndexUtils;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.util.Set;
+import org.apache.http.HttpStatus;
+import org.elasticsearch.client.Response;
+
+public class ElasticProjectIndex extends AbstractElasticIndex<Project.NameKey, ProjectData>
+    implements ProjectIndex {
+  static class ProjectMapping {
+    MappingProperties projects;
+
+    ProjectMapping(Schema<ProjectData> schema, ElasticQueryAdapter adapter) {
+      this.projects = ElasticMapping.createMapping(schema, adapter);
+    }
+  }
+
+  static final String PROJECTS = "projects";
+
+  private final ProjectMapping mapping;
+  private final Provider<ProjectCache> projectCache;
+  private final Schema<ProjectData> schema;
+
+  @Inject
+  ElasticProjectIndex(
+      ElasticConfiguration cfg,
+      SitePaths sitePaths,
+      Provider<ProjectCache> projectCache,
+      ElasticRestClientProvider client,
+      @Assisted Schema<ProjectData> schema) {
+    super(cfg, sitePaths, schema, client, PROJECTS);
+    this.projectCache = projectCache;
+    this.schema = schema;
+    this.mapping = new ProjectMapping(schema, client.adapter());
+  }
+
+  @Override
+  public void replace(ProjectData projectState) throws IOException {
+    BulkRequest bulk =
+        new IndexRequest(projectState.getProject().getName(), indexName, type, client.adapter())
+            .add(new UpdateRequest<>(schema, projectState));
+
+    String uri = getURI(type, BULK);
+    Response response = postRequest(uri, bulk, getRefreshParam());
+    int statusCode = response.getStatusLine().getStatusCode();
+    if (statusCode != HttpStatus.SC_OK) {
+      throw new IOException(
+          String.format(
+              "Failed to replace project %s in index %s: %s",
+              projectState.getProject().getName(), indexName, statusCode));
+    }
+  }
+
+  @Override
+  public DataSource<ProjectData> getSource(Predicate<ProjectData> p, QueryOptions opts)
+      throws QueryParseException {
+    JsonArray sortArray = getSortArray(ProjectField.NAME.getName());
+    return new ElasticQuerySource(p, opts.filterFields(IndexUtils::projectFields), type, sortArray);
+  }
+
+  @Override
+  protected String getDeleteActions(Project.NameKey nameKey) {
+    return delete(type, nameKey);
+  }
+
+  @Override
+  protected String getMappings() {
+    return getMappingsForSingleType(PROJECTS, mapping.projects);
+  }
+
+  @Override
+  protected String getId(ProjectData projectState) {
+    return projectState.getProject().getName();
+  }
+
+  @Override
+  protected ProjectData fromDocument(JsonObject json, Set<String> fields) {
+    JsonElement source = json.get("_source");
+    if (source == null) {
+      source = json.getAsJsonObject().get("fields");
+    }
+
+    Project.NameKey nameKey =
+        new Project.NameKey(
+            source.getAsJsonObject().get(ProjectField.NAME.getName()).getAsString());
+    return projectCache.get().get(nameKey).toProjectData();
+  }
+}
diff --git a/java/com/google/gerrit/elasticsearch/ElasticQueryAdapter.java b/java/com/google/gerrit/elasticsearch/ElasticQueryAdapter.java
new file mode 100644
index 0000000..23b6ffd
--- /dev/null
+++ b/java/com/google/gerrit/elasticsearch/ElasticQueryAdapter.java
@@ -0,0 +1,104 @@
+// 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.
+
+package com.google.gerrit.elasticsearch;
+
+import com.google.gson.JsonObject;
+
+public class ElasticQueryAdapter {
+  static final String POST_V5_TYPE = "_doc";
+
+  private final boolean ignoreUnmapped;
+  private final boolean usePostV5Type;
+  private final boolean omitTypeFromSearch;
+
+  private final String searchFilteringName;
+  private final String indicesExistParam;
+  private final String exactFieldType;
+  private final String stringFieldType;
+  private final String indexProperty;
+  private final String rawFieldsKey;
+  private final String versionDiscoveryUrl;
+  private final String includeTypeNameParam;
+
+  ElasticQueryAdapter(ElasticVersion version) {
+    this.ignoreUnmapped = false;
+    this.usePostV5Type = version.isV6OrLater();
+    this.omitTypeFromSearch = version.isV7OrLater();
+    this.versionDiscoveryUrl = version.isV6OrLater() ? "/%s*" : "/%s*/_aliases";
+    this.searchFilteringName = "_source";
+    this.indicesExistParam = "?allow_no_indices=false";
+    this.exactFieldType = "keyword";
+    this.stringFieldType = "text";
+    this.indexProperty = "true";
+    this.rawFieldsKey = "_source";
+    this.includeTypeNameParam = version.isV7OrLater() ? "?include_type_name=true" : "";
+  }
+
+  void setIgnoreUnmapped(JsonObject properties) {
+    if (ignoreUnmapped) {
+      properties.addProperty("ignore_unmapped", true);
+    }
+  }
+
+  public void setType(JsonObject properties, String type) {
+    if (!usePostV5Type) {
+      properties.addProperty("_type", type);
+    }
+  }
+
+  public String searchFilteringName() {
+    return searchFilteringName;
+  }
+
+  String indicesExistParam() {
+    return indicesExistParam;
+  }
+
+  String exactFieldType() {
+    return exactFieldType;
+  }
+
+  String stringFieldType() {
+    return stringFieldType;
+  }
+
+  String indexProperty() {
+    return indexProperty;
+  }
+
+  String rawFieldsKey() {
+    return rawFieldsKey;
+  }
+
+  boolean usePostV5Type() {
+    return usePostV5Type;
+  }
+
+  boolean omitTypeFromSearch() {
+    return omitTypeFromSearch;
+  }
+
+  String getType(String type) {
+    return usePostV5Type() ? POST_V5_TYPE : type;
+  }
+
+  String getVersionDiscoveryUrl(String name) {
+    return String.format(versionDiscoveryUrl, name);
+  }
+
+  String includeTypeNameParam() {
+    return includeTypeNameParam;
+  }
+}
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticQueryBuilder.java b/java/com/google/gerrit/elasticsearch/ElasticQueryBuilder.java
similarity index 100%
rename from gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticQueryBuilder.java
rename to java/com/google/gerrit/elasticsearch/ElasticQueryBuilder.java
diff --git a/java/com/google/gerrit/elasticsearch/ElasticRestClientProvider.java b/java/com/google/gerrit/elasticsearch/ElasticRestClientProvider.java
new file mode 100644
index 0000000..e9839b7
--- /dev/null
+++ b/java/com/google/gerrit/elasticsearch/ElasticRestClientProvider.java
@@ -0,0 +1,148 @@
+// 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.
+
+package com.google.gerrit.elasticsearch;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.lifecycle.LifecycleModule;
+import com.google.gson.JsonParser;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.apache.http.HttpStatus;
+import org.apache.http.StatusLine;
+import org.apache.http.auth.AuthScope;
+import org.apache.http.auth.UsernamePasswordCredentials;
+import org.apache.http.client.CredentialsProvider;
+import org.apache.http.impl.client.BasicCredentialsProvider;
+import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
+import org.elasticsearch.client.Request;
+import org.elasticsearch.client.Response;
+import org.elasticsearch.client.RestClient;
+import org.elasticsearch.client.RestClientBuilder;
+
+@Singleton
+class ElasticRestClientProvider implements Provider<RestClient>, LifecycleListener {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final ElasticConfiguration cfg;
+
+  private volatile RestClient client;
+  private ElasticQueryAdapter adapter;
+
+  @Inject
+  ElasticRestClientProvider(ElasticConfiguration cfg) {
+    this.cfg = cfg;
+  }
+
+  public static LifecycleModule module() {
+    return new LifecycleModule() {
+      @Override
+      protected void configure() {
+        listener().to(ElasticRestClientProvider.class);
+      }
+    };
+  }
+
+  @Override
+  public RestClient get() {
+    if (client == null) {
+      synchronized (this) {
+        if (client == null) {
+          client = build();
+          ElasticVersion version = getVersion();
+          logger.atInfo().log("Elasticsearch integration version %s", version);
+          adapter = new ElasticQueryAdapter(version);
+        }
+      }
+    }
+    return client;
+  }
+
+  @Override
+  public void start() {}
+
+  @Override
+  public void stop() {
+    if (client != null) {
+      try {
+        client.close();
+      } catch (IOException e) {
+        // Ignore. We can't do anything about it.
+      }
+    }
+  }
+
+  ElasticQueryAdapter adapter() {
+    get(); // Make sure we're connected
+    return adapter;
+  }
+
+  public static class FailedToGetVersion extends ElasticException {
+    private static final long serialVersionUID = 1L;
+    private static final String MESSAGE = "Failed to get Elasticsearch version";
+
+    FailedToGetVersion(StatusLine status) {
+      super(String.format("%s: %d %s", MESSAGE, status.getStatusCode(), status.getReasonPhrase()));
+    }
+
+    FailedToGetVersion(Throwable cause) {
+      super(MESSAGE, cause);
+    }
+  }
+
+  private ElasticVersion getVersion() throws ElasticException {
+    try {
+      Response response = client.performRequest(new Request("GET", "/"));
+      StatusLine statusLine = response.getStatusLine();
+      if (statusLine.getStatusCode() != HttpStatus.SC_OK) {
+        throw new FailedToGetVersion(statusLine);
+      }
+      String version =
+          new JsonParser()
+              .parse(AbstractElasticIndex.getContent(response))
+              .getAsJsonObject()
+              .get("version")
+              .getAsJsonObject()
+              .get("number")
+              .getAsString();
+      logger.atInfo().log("Connected to Elasticsearch version %s", version);
+      return ElasticVersion.forVersion(version);
+    } catch (IOException e) {
+      throw new FailedToGetVersion(e);
+    }
+  }
+
+  private RestClient build() {
+    RestClientBuilder builder = RestClient.builder(cfg.getHosts());
+    builder.setMaxRetryTimeoutMillis(cfg.maxRetryTimeout);
+    setConfiguredCredentialsIfAny(builder);
+    return builder.build();
+  }
+
+  private void setConfiguredCredentialsIfAny(RestClientBuilder builder) {
+    String username = cfg.username;
+    String password = cfg.password;
+    if (username != null && password != null) {
+      CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
+      credentialsProvider.setCredentials(
+          AuthScope.ANY, new UsernamePasswordCredentials(username, password));
+      builder.setHttpClientConfigCallback(
+          (HttpAsyncClientBuilder httpClientBuilder) ->
+              httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider));
+    }
+  }
+}
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticSetting.java b/java/com/google/gerrit/elasticsearch/ElasticSetting.java
similarity index 100%
rename from gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticSetting.java
rename to java/com/google/gerrit/elasticsearch/ElasticSetting.java
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticVersion.java b/java/com/google/gerrit/elasticsearch/ElasticVersion.java
similarity index 100%
rename from gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticVersion.java
rename to java/com/google/gerrit/elasticsearch/ElasticVersion.java
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/builders/BoolQueryBuilder.java b/java/com/google/gerrit/elasticsearch/builders/BoolQueryBuilder.java
similarity index 100%
rename from gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/builders/BoolQueryBuilder.java
rename to java/com/google/gerrit/elasticsearch/builders/BoolQueryBuilder.java
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/builders/ExistsQueryBuilder.java b/java/com/google/gerrit/elasticsearch/builders/ExistsQueryBuilder.java
similarity index 100%
rename from gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/builders/ExistsQueryBuilder.java
rename to java/com/google/gerrit/elasticsearch/builders/ExistsQueryBuilder.java
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/builders/MatchAllQueryBuilder.java b/java/com/google/gerrit/elasticsearch/builders/MatchAllQueryBuilder.java
similarity index 100%
rename from gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/builders/MatchAllQueryBuilder.java
rename to java/com/google/gerrit/elasticsearch/builders/MatchAllQueryBuilder.java
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/builders/MatchQueryBuilder.java b/java/com/google/gerrit/elasticsearch/builders/MatchQueryBuilder.java
similarity index 100%
rename from gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/builders/MatchQueryBuilder.java
rename to java/com/google/gerrit/elasticsearch/builders/MatchQueryBuilder.java
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/builders/QueryBuilder.java b/java/com/google/gerrit/elasticsearch/builders/QueryBuilder.java
similarity index 100%
rename from gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/builders/QueryBuilder.java
rename to java/com/google/gerrit/elasticsearch/builders/QueryBuilder.java
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/builders/QueryBuilders.java b/java/com/google/gerrit/elasticsearch/builders/QueryBuilders.java
similarity index 100%
rename from gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/builders/QueryBuilders.java
rename to java/com/google/gerrit/elasticsearch/builders/QueryBuilders.java
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/builders/QuerySourceBuilder.java b/java/com/google/gerrit/elasticsearch/builders/QuerySourceBuilder.java
similarity index 100%
rename from gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/builders/QuerySourceBuilder.java
rename to java/com/google/gerrit/elasticsearch/builders/QuerySourceBuilder.java
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/builders/RangeQueryBuilder.java b/java/com/google/gerrit/elasticsearch/builders/RangeQueryBuilder.java
similarity index 100%
rename from gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/builders/RangeQueryBuilder.java
rename to java/com/google/gerrit/elasticsearch/builders/RangeQueryBuilder.java
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/builders/RegexpQueryBuilder.java b/java/com/google/gerrit/elasticsearch/builders/RegexpQueryBuilder.java
similarity index 100%
rename from gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/builders/RegexpQueryBuilder.java
rename to java/com/google/gerrit/elasticsearch/builders/RegexpQueryBuilder.java
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/builders/SearchSourceBuilder.java b/java/com/google/gerrit/elasticsearch/builders/SearchSourceBuilder.java
similarity index 100%
rename from gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/builders/SearchSourceBuilder.java
rename to java/com/google/gerrit/elasticsearch/builders/SearchSourceBuilder.java
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/builders/TermQueryBuilder.java b/java/com/google/gerrit/elasticsearch/builders/TermQueryBuilder.java
similarity index 100%
rename from gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/builders/TermQueryBuilder.java
rename to java/com/google/gerrit/elasticsearch/builders/TermQueryBuilder.java
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/builders/XContentBuilder.java b/java/com/google/gerrit/elasticsearch/builders/XContentBuilder.java
similarity index 100%
rename from gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/builders/XContentBuilder.java
rename to java/com/google/gerrit/elasticsearch/builders/XContentBuilder.java
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/bulk/ActionRequest.java b/java/com/google/gerrit/elasticsearch/bulk/ActionRequest.java
similarity index 100%
rename from gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/bulk/ActionRequest.java
rename to java/com/google/gerrit/elasticsearch/bulk/ActionRequest.java
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/bulk/BulkRequest.java b/java/com/google/gerrit/elasticsearch/bulk/BulkRequest.java
similarity index 100%
rename from gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/bulk/BulkRequest.java
rename to java/com/google/gerrit/elasticsearch/bulk/BulkRequest.java
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/bulk/DeleteRequest.java b/java/com/google/gerrit/elasticsearch/bulk/DeleteRequest.java
similarity index 100%
rename from gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/bulk/DeleteRequest.java
rename to java/com/google/gerrit/elasticsearch/bulk/DeleteRequest.java
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/bulk/IndexRequest.java b/java/com/google/gerrit/elasticsearch/bulk/IndexRequest.java
similarity index 100%
rename from gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/bulk/IndexRequest.java
rename to java/com/google/gerrit/elasticsearch/bulk/IndexRequest.java
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/bulk/UpdateRequest.java b/java/com/google/gerrit/elasticsearch/bulk/UpdateRequest.java
similarity index 100%
rename from gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/bulk/UpdateRequest.java
rename to java/com/google/gerrit/elasticsearch/bulk/UpdateRequest.java
diff --git a/java/com/google/gerrit/extensions/BUILD b/java/com/google/gerrit/extensions/BUILD
new file mode 100644
index 0000000..ea08f99
--- /dev/null
+++ b/java/com/google/gerrit/extensions/BUILD
@@ -0,0 +1,58 @@
+load("//lib/jgit:jgit.bzl", "JGIT_DOC_URL")
+load("//lib:guava.bzl", "GUAVA_DOC_URL")
+load("//tools/bzl:gwt.bzl", "gwt_module")
+load("//tools/bzl:javadoc.bzl", "java_doc")
+
+EXT_API_SRCS = glob(["client/*.java"])
+
+gwt_module(
+    name = "client",
+    srcs = EXT_API_SRCS,
+    gwt_xml = "Extensions.gwt.xml",
+    visibility = ["//visibility:public"],
+)
+
+java_binary(
+    name = "extension-api",
+    main_class = "Dummy",
+    visibility = ["//visibility:public"],
+    runtime_deps = [":lib"],
+)
+
+java_library(
+    name = "lib",
+    visibility = ["//visibility:public"],
+    exports = [
+        ":api",
+        "//lib:guava",
+        "//lib:servlet-api-3_1",
+        "//lib/guice",
+        "//lib/guice:guice-assistedinject",
+        "//lib/guice:guice-servlet",
+    ],
+)
+
+#TODO(davido): There is no provided_deps argument to java_library rule
+java_library(
+    name = "api",
+    srcs = glob(["**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/common:annotations",
+        "//lib:guava",
+        "//lib/guice",
+        "//lib/guice:guice-assistedinject",
+    ],
+)
+
+java_doc(
+    name = "extension-api-javadoc",
+    external_docs = [
+        JGIT_DOC_URL,
+        GUAVA_DOC_URL,
+    ],
+    libs = [":api"],
+    pkgs = ["com.google.gerrit.extensions"],
+    title = "Gerrit Review Extension API Documentation",
+    visibility = ["//visibility:public"],
+)
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/Extensions.gwt.xml b/java/com/google/gerrit/extensions/Extensions.gwt.xml
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/Extensions.gwt.xml
rename to java/com/google/gerrit/extensions/Extensions.gwt.xml
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/CapabilityScope.java b/java/com/google/gerrit/extensions/annotations/CapabilityScope.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/CapabilityScope.java
rename to java/com/google/gerrit/extensions/annotations/CapabilityScope.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/Export.java b/java/com/google/gerrit/extensions/annotations/Export.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/Export.java
rename to java/com/google/gerrit/extensions/annotations/Export.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/ExportImpl.java b/java/com/google/gerrit/extensions/annotations/ExportImpl.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/ExportImpl.java
rename to java/com/google/gerrit/extensions/annotations/ExportImpl.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/Exports.java b/java/com/google/gerrit/extensions/annotations/Exports.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/Exports.java
rename to java/com/google/gerrit/extensions/annotations/Exports.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/ExtensionPoint.java b/java/com/google/gerrit/extensions/annotations/ExtensionPoint.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/ExtensionPoint.java
rename to java/com/google/gerrit/extensions/annotations/ExtensionPoint.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/Listen.java b/java/com/google/gerrit/extensions/annotations/Listen.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/Listen.java
rename to java/com/google/gerrit/extensions/annotations/Listen.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/PluginCanonicalWebUrl.java b/java/com/google/gerrit/extensions/annotations/PluginCanonicalWebUrl.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/PluginCanonicalWebUrl.java
rename to java/com/google/gerrit/extensions/annotations/PluginCanonicalWebUrl.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/PluginData.java b/java/com/google/gerrit/extensions/annotations/PluginData.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/PluginData.java
rename to java/com/google/gerrit/extensions/annotations/PluginData.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/PluginName.java b/java/com/google/gerrit/extensions/annotations/PluginName.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/PluginName.java
rename to java/com/google/gerrit/extensions/annotations/PluginName.java
diff --git a/java/com/google/gerrit/extensions/annotations/RemoveAfter.java b/java/com/google/gerrit/extensions/annotations/RemoveAfter.java
new file mode 100644
index 0000000..aa31dd0
--- /dev/null
+++ b/java/com/google/gerrit/extensions/annotations/RemoveAfter.java
@@ -0,0 +1,37 @@
+// 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.
+
+package com.google.gerrit.extensions.annotations;
+
+import static java.lang.annotation.RetentionPolicy.SOURCE;
+
+import com.google.inject.BindingAnnotation;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+/**
+ * Annotation for features that are deprecated, but still present to adhere to the one-release-grace
+ * period we promised to users.
+ */
+@Target({ElementType.PARAMETER, ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
+@Retention(SOURCE)
+@BindingAnnotation
+public @interface RemoveAfter {
+  /**
+   * Version after which the annotated functionality can be removed. Once the referenced version was
+   * branched off, the annotated code can be removed.
+   */
+  String value();
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/RequiresAnyCapability.java b/java/com/google/gerrit/extensions/annotations/RequiresAnyCapability.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/RequiresAnyCapability.java
rename to java/com/google/gerrit/extensions/annotations/RequiresAnyCapability.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/RequiresCapability.java b/java/com/google/gerrit/extensions/annotations/RequiresCapability.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/RequiresCapability.java
rename to java/com/google/gerrit/extensions/annotations/RequiresCapability.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/RootRelative.java b/java/com/google/gerrit/extensions/annotations/RootRelative.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/RootRelative.java
rename to java/com/google/gerrit/extensions/annotations/RootRelative.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/GerritApi.java b/java/com/google/gerrit/extensions/api/GerritApi.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/GerritApi.java
rename to java/com/google/gerrit/extensions/api/GerritApi.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/access/AccessSectionInfo.java b/java/com/google/gerrit/extensions/api/access/AccessSectionInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/access/AccessSectionInfo.java
rename to java/com/google/gerrit/extensions/api/access/AccessSectionInfo.java
diff --git a/java/com/google/gerrit/extensions/api/access/GerritPermission.java b/java/com/google/gerrit/extensions/api/access/GerritPermission.java
new file mode 100644
index 0000000..02afbdc
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/access/GerritPermission.java
@@ -0,0 +1,33 @@
+// 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.
+
+package com.google.gerrit.extensions.api.access;
+
+import java.util.Locale;
+
+/** Gerrit permission for hosts, projects, refs, changes, labels and plugins. */
+public interface GerritPermission {
+  /**
+   * A description in the context of an exception message.
+   *
+   * <p>Should be grammatical when used in the construction "not permitted: [description] on
+   * [resource]", although individual {@code PermissionBackend} implementations may vary the
+   * wording.
+   */
+  String describeForException();
+
+  static String describeEnumValue(Enum<?> value) {
+    return value.name().toLowerCase(Locale.US).replace('_', ' ');
+  }
+}
diff --git a/java/com/google/gerrit/extensions/api/access/GlobalOrPluginPermission.java b/java/com/google/gerrit/extensions/api/access/GlobalOrPluginPermission.java
new file mode 100644
index 0000000..95b887d
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/access/GlobalOrPluginPermission.java
@@ -0,0 +1,20 @@
+// Copyright (C) 2017 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.google.gerrit.extensions.api.access;
+
+/**
+ * A {@link com.google.gerrit.server.permissions.GlobalPermission} or a {@link PluginPermission}.
+ */
+public interface GlobalOrPluginPermission extends GerritPermission {}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/access/PermissionInfo.java b/java/com/google/gerrit/extensions/api/access/PermissionInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/access/PermissionInfo.java
rename to java/com/google/gerrit/extensions/api/access/PermissionInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/access/PermissionRuleInfo.java b/java/com/google/gerrit/extensions/api/access/PermissionRuleInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/access/PermissionRuleInfo.java
rename to java/com/google/gerrit/extensions/api/access/PermissionRuleInfo.java
diff --git a/java/com/google/gerrit/extensions/api/access/PluginPermission.java b/java/com/google/gerrit/extensions/api/access/PluginPermission.java
new file mode 100644
index 0000000..1dc5cb6
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/access/PluginPermission.java
@@ -0,0 +1,72 @@
+// Copyright (C) 2017 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.google.gerrit.extensions.api.access;
+
+import static java.util.Objects.requireNonNull;
+
+import java.util.Objects;
+
+/** A global capability type permission used by a plugin. */
+public class PluginPermission implements GlobalOrPluginPermission {
+  private final String pluginName;
+  private final String capability;
+  private final boolean fallBackToAdmin;
+
+  public PluginPermission(String pluginName, String capability) {
+    this(pluginName, capability, true);
+  }
+
+  public PluginPermission(String pluginName, String capability, boolean fallBackToAdmin) {
+    this.pluginName = requireNonNull(pluginName, "pluginName");
+    this.capability = requireNonNull(capability, "capability");
+    this.fallBackToAdmin = fallBackToAdmin;
+  }
+
+  public String pluginName() {
+    return pluginName;
+  }
+
+  public String capability() {
+    return capability;
+  }
+
+  public boolean fallBackToAdmin() {
+    return fallBackToAdmin;
+  }
+
+  @Override
+  public String describeForException() {
+    return capability + " for plugin " + pluginName;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(pluginName, capability);
+  }
+
+  @Override
+  public boolean equals(Object other) {
+    if (other instanceof PluginPermission) {
+      PluginPermission b = (PluginPermission) other;
+      return pluginName.equals(b.pluginName) && capability.equals(b.capability);
+    }
+    return false;
+  }
+
+  @Override
+  public String toString() {
+    return "PluginPermission[plugin=" + pluginName + ", capability=" + capability + ']';
+  }
+}
diff --git a/java/com/google/gerrit/extensions/api/access/ProjectAccessInfo.java b/java/com/google/gerrit/extensions/api/access/ProjectAccessInfo.java
new file mode 100644
index 0000000..8273d84
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/access/ProjectAccessInfo.java
@@ -0,0 +1,36 @@
+// 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.
+
+package com.google.gerrit.extensions.api.access;
+
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.extensions.common.WebLinkInfo;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public class ProjectAccessInfo {
+  public String revision;
+  public ProjectInfo inheritsFrom;
+  public Map<String, AccessSectionInfo> local;
+  public Boolean isOwner;
+  public Set<String> ownerOf;
+  public Boolean canUpload;
+  public Boolean canAdd;
+  public Boolean canAddTags;
+  public Boolean configVisible;
+  public Map<String, GroupInfo> groups;
+  public List<WebLinkInfo> configWebLinks;
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/access/ProjectAccessInput.java b/java/com/google/gerrit/extensions/api/access/ProjectAccessInput.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/access/ProjectAccessInput.java
rename to java/com/google/gerrit/extensions/api/access/ProjectAccessInput.java
diff --git a/java/com/google/gerrit/extensions/api/accounts/AccountApi.java b/java/com/google/gerrit/extensions/api/accounts/AccountApi.java
new file mode 100644
index 0000000..056565e
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/accounts/AccountApi.java
@@ -0,0 +1,321 @@
+// Copyright (C) 2014 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.google.gerrit.extensions.api.accounts;
+
+import com.google.gerrit.extensions.api.changes.StarsInput;
+import com.google.gerrit.extensions.client.DiffPreferencesInfo;
+import com.google.gerrit.extensions.client.EditPreferencesInfo;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
+import com.google.gerrit.extensions.client.ProjectWatchInfo;
+import com.google.gerrit.extensions.common.AccountDetailInfo;
+import com.google.gerrit.extensions.common.AccountExternalIdInfo;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.AgreementInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.EmailInfo;
+import com.google.gerrit.extensions.common.GpgKeyInfo;
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.extensions.common.SshKeyInfo;
+import com.google.gerrit.extensions.restapi.NotImplementedException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedSet;
+
+public interface AccountApi {
+  AccountInfo get() throws RestApiException;
+
+  AccountDetailInfo detail() throws RestApiException;
+
+  boolean getActive() throws RestApiException;
+
+  void setActive(boolean active) throws RestApiException;
+
+  String getAvatarUrl(int size) throws RestApiException;
+
+  GeneralPreferencesInfo getPreferences() throws RestApiException;
+
+  GeneralPreferencesInfo setPreferences(GeneralPreferencesInfo in) throws RestApiException;
+
+  DiffPreferencesInfo getDiffPreferences() throws RestApiException;
+
+  DiffPreferencesInfo setDiffPreferences(DiffPreferencesInfo in) throws RestApiException;
+
+  EditPreferencesInfo getEditPreferences() throws RestApiException;
+
+  EditPreferencesInfo setEditPreferences(EditPreferencesInfo in) throws RestApiException;
+
+  List<ProjectWatchInfo> getWatchedProjects() throws RestApiException;
+
+  List<ProjectWatchInfo> setWatchedProjects(List<ProjectWatchInfo> in) throws RestApiException;
+
+  void deleteWatchedProjects(List<ProjectWatchInfo> in) throws RestApiException;
+
+  void starChange(String changeId) throws RestApiException;
+
+  void unstarChange(String changeId) throws RestApiException;
+
+  void setStars(String changeId, StarsInput input) throws RestApiException;
+
+  SortedSet<String> getStars(String changeId) throws RestApiException;
+
+  List<ChangeInfo> getStarredChanges() throws RestApiException;
+
+  List<GroupInfo> getGroups() throws RestApiException;
+
+  List<EmailInfo> getEmails() throws RestApiException;
+
+  void addEmail(EmailInput input) throws RestApiException;
+
+  void deleteEmail(String email) throws RestApiException;
+
+  EmailApi createEmail(EmailInput emailInput) throws RestApiException;
+
+  EmailApi email(String email) throws RestApiException;
+
+  void setStatus(String status) throws RestApiException;
+
+  List<SshKeyInfo> listSshKeys() throws RestApiException;
+
+  SshKeyInfo addSshKey(String key) throws RestApiException;
+
+  void deleteSshKey(int seq) throws RestApiException;
+
+  Map<String, GpgKeyInfo> listGpgKeys() throws RestApiException;
+
+  Map<String, GpgKeyInfo> putGpgKeys(List<String> add, List<String> remove) throws RestApiException;
+
+  GpgKeyApi gpgKey(String id) throws RestApiException;
+
+  List<AgreementInfo> listAgreements() throws RestApiException;
+
+  void signAgreement(String agreementName) throws RestApiException;
+
+  void index() throws RestApiException;
+
+  List<AccountExternalIdInfo> getExternalIds() throws RestApiException;
+
+  void deleteExternalIds(List<String> externalIds) throws RestApiException;
+
+  List<DeletedDraftCommentInfo> deleteDraftComments(DeleteDraftCommentsInput input)
+      throws RestApiException;
+
+  void setName(String name) throws RestApiException;
+
+  /**
+   * A default implementation which allows source compatibility when adding new methods to the
+   * interface.
+   */
+  class NotImplemented implements AccountApi {
+    @Override
+    public AccountInfo get() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public AccountDetailInfo detail() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public boolean getActive() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void setActive(boolean active) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public String getAvatarUrl(int size) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public GeneralPreferencesInfo getPreferences() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public GeneralPreferencesInfo setPreferences(GeneralPreferencesInfo in)
+        throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public DiffPreferencesInfo getDiffPreferences() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public DiffPreferencesInfo setDiffPreferences(DiffPreferencesInfo in) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public EditPreferencesInfo getEditPreferences() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public EditPreferencesInfo setEditPreferences(EditPreferencesInfo in) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public List<ProjectWatchInfo> getWatchedProjects() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public List<ProjectWatchInfo> setWatchedProjects(List<ProjectWatchInfo> in)
+        throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void deleteWatchedProjects(List<ProjectWatchInfo> in) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void starChange(String changeId) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void unstarChange(String changeId) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void setStars(String changeId, StarsInput input) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public SortedSet<String> getStars(String changeId) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public List<ChangeInfo> getStarredChanges() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public List<GroupInfo> getGroups() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public List<EmailInfo> getEmails() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void addEmail(EmailInput input) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void deleteEmail(String email) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public EmailApi createEmail(EmailInput input) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public EmailApi email(String email) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void setStatus(String status) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public List<SshKeyInfo> listSshKeys() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public SshKeyInfo addSshKey(String key) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void deleteSshKey(int seq) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public Map<String, GpgKeyInfo> putGpgKeys(List<String> add, List<String> remove)
+        throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public GpgKeyApi gpgKey(String id) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public Map<String, GpgKeyInfo> listGpgKeys() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public List<AgreementInfo> listAgreements() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void signAgreement(String agreementName) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void index() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public List<AccountExternalIdInfo> getExternalIds() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void deleteExternalIds(List<String> externalIds) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public List<DeletedDraftCommentInfo> deleteDraftComments(DeleteDraftCommentsInput input)
+        throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void setName(String name) throws RestApiException {
+      throw new NotImplementedException();
+    }
+  }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/AccountInput.java b/java/com/google/gerrit/extensions/api/accounts/AccountInput.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/AccountInput.java
rename to java/com/google/gerrit/extensions/api/accounts/AccountInput.java
diff --git a/java/com/google/gerrit/extensions/api/accounts/Accounts.java b/java/com/google/gerrit/extensions/api/accounts/Accounts.java
new file mode 100644
index 0000000..db7f506
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/accounts/Accounts.java
@@ -0,0 +1,264 @@
+// Copyright (C) 2014 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.google.gerrit.extensions.api.accounts;
+
+import com.google.gerrit.extensions.client.ListAccountsOption;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.restapi.NotImplementedException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import java.util.Arrays;
+import java.util.EnumSet;
+import java.util.List;
+
+public interface Accounts {
+  /**
+   * Look up an account by ID.
+   *
+   * <p><strong>Note:</strong> This method eagerly reads the account. Methods that mutate the
+   * account do not necessarily re-read the account. Therefore, calling a getter method on an
+   * instance after calling a mutation method on that same instance is not guaranteed to reflect the
+   * mutation. It is not recommended to store references to {@code AccountApi} instances.
+   *
+   * @param id any identifier supported by the REST API, including numeric ID, email, or username.
+   * @return API for accessing the account.
+   * @throws RestApiException if an error occurred.
+   */
+  AccountApi id(String id) throws RestApiException;
+
+  /** @see #id(String) */
+  AccountApi id(int id) throws RestApiException;
+
+  /**
+   * Look up the account of the current in-scope user.
+   *
+   * @see #id(String)
+   */
+  AccountApi self() throws RestApiException;
+
+  /** Create a new account with the given username and default options. */
+  AccountApi create(String username) throws RestApiException;
+
+  /** Create a new account. */
+  AccountApi create(AccountInput input) throws RestApiException;
+
+  /**
+   * Suggest users for a given query.
+   *
+   * <p>Example code: {@code suggestAccounts().withQuery("Reviewer").withLimit(5).get()}
+   *
+   * @return API for setting parameters and getting result.
+   */
+  SuggestAccountsRequest suggestAccounts() throws RestApiException;
+
+  /**
+   * Suggest users for a given query.
+   *
+   * <p>Shortcut API for {@code suggestAccounts().withQuery(String)}.
+   *
+   * @see #suggestAccounts()
+   */
+  SuggestAccountsRequest suggestAccounts(String query) throws RestApiException;
+
+  /**
+   * Query users.
+   *
+   * <p>Example code: {@code query().withQuery("name:John email:example.com").withLimit(5).get()}
+   *
+   * @return API for setting parameters and getting result.
+   */
+  QueryRequest query() throws RestApiException;
+
+  /**
+   * Query users.
+   *
+   * <p>Shortcut API for {@code query().withQuery(String)}.
+   *
+   * @see #query()
+   */
+  QueryRequest query(String query) throws RestApiException;
+
+  /**
+   * API for setting parameters and getting result. Used for {@code suggestAccounts()}.
+   *
+   * @see #suggestAccounts()
+   */
+  abstract class SuggestAccountsRequest {
+    private String query;
+    private int limit;
+
+    /** Execute query and return a list of accounts. */
+    public abstract List<AccountInfo> get() throws RestApiException;
+
+    /**
+     * Set query.
+     *
+     * @param query needs to be in human-readable form.
+     */
+    public SuggestAccountsRequest withQuery(String query) {
+      this.query = query;
+      return this;
+    }
+
+    /**
+     * Set limit for returned list of accounts. Optional; server-default is used when not provided.
+     */
+    public SuggestAccountsRequest withLimit(int limit) {
+      this.limit = limit;
+      return this;
+    }
+
+    public String getQuery() {
+      return query;
+    }
+
+    public int getLimit() {
+      return limit;
+    }
+  }
+
+  /**
+   * API for setting parameters and getting result. Used for {@code query()}.
+   *
+   * @see #query()
+   */
+  abstract class QueryRequest {
+    private String query;
+    private int limit;
+    private int start;
+    private boolean suggest;
+    private EnumSet<ListAccountsOption> options = EnumSet.noneOf(ListAccountsOption.class);
+
+    /** Execute query and return a list of accounts. */
+    public abstract List<AccountInfo> get() throws RestApiException;
+
+    /**
+     * Set query.
+     *
+     * @param query needs to be in human-readable form.
+     */
+    public QueryRequest withQuery(String query) {
+      this.query = query;
+      return this;
+    }
+
+    /**
+     * Set limit for returned list of accounts. Optional; server-default is used when not provided.
+     */
+    public QueryRequest withLimit(int limit) {
+      this.limit = limit;
+      return this;
+    }
+
+    /** Set number of accounts to skip. Optional; no accounts are skipped when not provided. */
+    public QueryRequest withStart(int start) {
+      this.start = start;
+      return this;
+    }
+
+    public QueryRequest withSuggest(boolean suggest) {
+      this.suggest = suggest;
+      return this;
+    }
+
+    /** Set an option on the request, appending to existing options. */
+    public QueryRequest withOption(ListAccountsOption options) {
+      this.options.add(options);
+      return this;
+    }
+
+    /** Set options on the request, appending to existing options. */
+    public QueryRequest withOptions(ListAccountsOption... options) {
+      this.options.addAll(Arrays.asList(options));
+      return this;
+    }
+
+    /** Set options on the request, replacing existing options. */
+    public QueryRequest withOptions(EnumSet<ListAccountsOption> options) {
+      this.options = options;
+      return this;
+    }
+
+    public String getQuery() {
+      return query;
+    }
+
+    public int getLimit() {
+      return limit;
+    }
+
+    public int getStart() {
+      return start;
+    }
+
+    public boolean getSuggest() {
+      return suggest;
+    }
+
+    public EnumSet<ListAccountsOption> getOptions() {
+      return options;
+    }
+  }
+
+  /**
+   * A default implementation which allows source compatibility when adding new methods to the
+   * interface.
+   */
+  class NotImplemented implements Accounts {
+    @Override
+    public AccountApi id(String id) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public AccountApi id(int id) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public AccountApi self() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public AccountApi create(String username) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public AccountApi create(AccountInput input) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public SuggestAccountsRequest suggestAccounts() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public SuggestAccountsRequest suggestAccounts(String query) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public QueryRequest query() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public QueryRequest query(String query) throws RestApiException {
+      throw new NotImplementedException();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/extensions/api/accounts/AgreementInput.java b/java/com/google/gerrit/extensions/api/accounts/AgreementInput.java
new file mode 100644
index 0000000..9f35eed
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/accounts/AgreementInput.java
@@ -0,0 +1,23 @@
+// 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.
+
+package com.google.gerrit.extensions.api.accounts;
+
+import com.google.gerrit.extensions.restapi.DefaultInput;
+
+/** This entity contains information for registering a new contributor agreement. */
+public class AgreementInput {
+  /* The agreement name. */
+  @DefaultInput public String name;
+}
diff --git a/java/com/google/gerrit/extensions/api/accounts/DeleteDraftCommentsInput.java b/java/com/google/gerrit/extensions/api/accounts/DeleteDraftCommentsInput.java
new file mode 100644
index 0000000..113f3d4
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/accounts/DeleteDraftCommentsInput.java
@@ -0,0 +1,35 @@
+// 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.
+
+package com.google.gerrit.extensions.api.accounts;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.restapi.DefaultInput;
+
+public class DeleteDraftCommentsInput {
+  /**
+   * Delete comments only on changes that match this query.
+   *
+   * <p>If null or empty, delete comments on all changes.
+   */
+  @DefaultInput public String query;
+
+  public DeleteDraftCommentsInput() {
+    this(null);
+  }
+
+  public DeleteDraftCommentsInput(@Nullable String query) {
+    this.query = query;
+  }
+}
diff --git a/java/com/google/gerrit/extensions/api/accounts/DeletedDraftCommentInfo.java b/java/com/google/gerrit/extensions/api/accounts/DeletedDraftCommentInfo.java
new file mode 100644
index 0000000..c15d5bc
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/accounts/DeletedDraftCommentInfo.java
@@ -0,0 +1,24 @@
+// 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.
+
+package com.google.gerrit.extensions.api.accounts;
+
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.CommentInfo;
+import java.util.List;
+
+public class DeletedDraftCommentInfo {
+  public ChangeInfo change;
+  public List<CommentInfo> deleted;
+}
diff --git a/java/com/google/gerrit/extensions/api/accounts/EmailApi.java b/java/com/google/gerrit/extensions/api/accounts/EmailApi.java
new file mode 100644
index 0000000..da038c3
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/accounts/EmailApi.java
@@ -0,0 +1,48 @@
+// 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.
+
+package com.google.gerrit.extensions.api.accounts;
+
+import com.google.gerrit.extensions.common.EmailInfo;
+import com.google.gerrit.extensions.restapi.NotImplementedException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+
+public interface EmailApi {
+  EmailInfo get() throws RestApiException;
+
+  void delete() throws RestApiException;
+
+  void setPreferred() throws RestApiException;
+
+  /**
+   * A default implementation which allows source compatibility when adding new methods to the
+   * interface.
+   */
+  class NotImplemented implements EmailApi {
+    @Override
+    public EmailInfo get() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void delete() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void setPreferred() throws RestApiException {
+      throw new NotImplementedException();
+    }
+  }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/EmailInput.java b/java/com/google/gerrit/extensions/api/accounts/EmailInput.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/EmailInput.java
rename to java/com/google/gerrit/extensions/api/accounts/EmailInput.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/GpgKeyApi.java b/java/com/google/gerrit/extensions/api/accounts/GpgKeyApi.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/GpgKeyApi.java
rename to java/com/google/gerrit/extensions/api/accounts/GpgKeyApi.java
diff --git a/java/com/google/gerrit/extensions/api/accounts/GpgKeysInput.java b/java/com/google/gerrit/extensions/api/accounts/GpgKeysInput.java
new file mode 100644
index 0000000..8fb587a
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/accounts/GpgKeysInput.java
@@ -0,0 +1,22 @@
+// Copyright (C) 2017 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.google.gerrit.extensions.api.accounts;
+
+import java.util.List;
+
+public class GpgKeysInput {
+  public List<String> add;
+  public List<String> delete;
+}
diff --git a/java/com/google/gerrit/extensions/api/accounts/SshKeyInput.java b/java/com/google/gerrit/extensions/api/accounts/SshKeyInput.java
new file mode 100644
index 0000000..46dd858
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/accounts/SshKeyInput.java
@@ -0,0 +1,21 @@
+// Copyright (C) 2017 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.google.gerrit.extensions.api.accounts;
+
+import com.google.gerrit.extensions.restapi.RawInput;
+
+public class SshKeyInput {
+  public RawInput raw;
+}
diff --git a/java/com/google/gerrit/extensions/api/accounts/StatusInput.java b/java/com/google/gerrit/extensions/api/accounts/StatusInput.java
new file mode 100644
index 0000000..951c049
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/accounts/StatusInput.java
@@ -0,0 +1,27 @@
+// Copyright (C) 2017 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.google.gerrit.extensions.api.accounts;
+
+import com.google.gerrit.extensions.restapi.DefaultInput;
+
+public class StatusInput {
+  public @DefaultInput String status;
+
+  public StatusInput(String status) {
+    this.status = status;
+  }
+
+  public StatusInput() {}
+}
diff --git a/java/com/google/gerrit/extensions/api/accounts/UsernameInput.java b/java/com/google/gerrit/extensions/api/accounts/UsernameInput.java
new file mode 100644
index 0000000..f774ddc
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/accounts/UsernameInput.java
@@ -0,0 +1,21 @@
+// Copyright (C) 2017 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.google.gerrit.extensions.api.accounts;
+
+import com.google.gerrit.extensions.restapi.DefaultInput;
+
+public class UsernameInput {
+  @DefaultInput public String username;
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/AbandonInput.java b/java/com/google/gerrit/extensions/api/changes/AbandonInput.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/AbandonInput.java
rename to java/com/google/gerrit/extensions/api/changes/AbandonInput.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ActionVisitor.java b/java/com/google/gerrit/extensions/api/changes/ActionVisitor.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ActionVisitor.java
rename to java/com/google/gerrit/extensions/api/changes/ActionVisitor.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/AddReviewerInput.java b/java/com/google/gerrit/extensions/api/changes/AddReviewerInput.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/AddReviewerInput.java
rename to java/com/google/gerrit/extensions/api/changes/AddReviewerInput.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/AddReviewerResult.java b/java/com/google/gerrit/extensions/api/changes/AddReviewerResult.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/AddReviewerResult.java
rename to java/com/google/gerrit/extensions/api/changes/AddReviewerResult.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/AssigneeInput.java b/java/com/google/gerrit/extensions/api/changes/AssigneeInput.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/AssigneeInput.java
rename to java/com/google/gerrit/extensions/api/changes/AssigneeInput.java
diff --git a/java/com/google/gerrit/extensions/api/changes/ChangeApi.java b/java/com/google/gerrit/extensions/api/changes/ChangeApi.java
new file mode 100644
index 0000000..4f16e19
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/changes/ChangeApi.java
@@ -0,0 +1,646 @@
+// Copyright (C) 2013 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.google.gerrit.extensions.api.changes;
+
+import com.google.common.collect.Sets;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.client.ListChangesOption;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.ChangeMessageInfo;
+import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.common.CommitMessageInput;
+import com.google.gerrit.extensions.common.EditInfo;
+import com.google.gerrit.extensions.common.MergePatchSetInput;
+import com.google.gerrit.extensions.common.PureRevertInfo;
+import com.google.gerrit.extensions.common.RobotCommentInfo;
+import com.google.gerrit.extensions.common.SuggestedReviewerInfo;
+import com.google.gerrit.extensions.restapi.NotImplementedException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import java.util.Arrays;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public interface ChangeApi {
+  String id();
+
+  /**
+   * Look up the current revision for the change.
+   *
+   * <p><strong>Note:</strong> This method eagerly reads the revision. Methods that mutate the
+   * revision do not necessarily re-read the revision. Therefore, calling a getter method on an
+   * instance after calling a mutation method on that same instance is not guaranteed to reflect the
+   * mutation. It is not recommended to store references to {@code RevisionApi} instances.
+   *
+   * @return API for accessing the revision.
+   * @throws RestApiException if an error occurred.
+   */
+  RevisionApi current() throws RestApiException;
+
+  /**
+   * Look up a revision of a change by number.
+   *
+   * @see #current()
+   */
+  RevisionApi revision(int id) throws RestApiException;
+
+  /**
+   * Look up a revision of a change by commit SHA-1.
+   *
+   * @see #current()
+   */
+  RevisionApi revision(String id) throws RestApiException;
+
+  /**
+   * Look up the reviewer of the change.
+   *
+   * <p>
+   *
+   * @param id ID of the account, can be a string of the format "Full Name
+   *     &lt;mail@example.com&gt;", just the email address, a full name if it is unique, an account
+   *     ID, a user name or 'self' for the calling user.
+   * @return API for accessing the reviewer.
+   * @throws RestApiException if id is not account ID or is a user that isn't known to be a reviewer
+   *     for this change.
+   */
+  ReviewerApi reviewer(String id) throws RestApiException;
+
+  void abandon() throws RestApiException;
+
+  void abandon(AbandonInput in) throws RestApiException;
+
+  void restore() throws RestApiException;
+
+  void restore(RestoreInput in) throws RestApiException;
+
+  void move(String destination) throws RestApiException;
+
+  void move(MoveInput in) throws RestApiException;
+
+  void setPrivate(boolean value, @Nullable String message) throws RestApiException;
+
+  default void setPrivate(boolean value) throws RestApiException {
+    setPrivate(value, null);
+  }
+
+  void setWorkInProgress(@Nullable String message) throws RestApiException;
+
+  void setReadyForReview(@Nullable String message) throws RestApiException;
+
+  default void setWorkInProgress() throws RestApiException {
+    setWorkInProgress(null);
+  }
+
+  default void setReadyForReview() throws RestApiException {
+    setReadyForReview(null);
+  }
+
+  /**
+   * Ignore or un-ignore this change.
+   *
+   * @param ignore ignore the change if true
+   */
+  void ignore(boolean ignore) throws RestApiException;
+
+  /**
+   * Check if this change is ignored.
+   *
+   * @return true if the change is ignored
+   */
+  boolean ignored() throws RestApiException;
+
+  /**
+   * Mark this change as reviewed/unreviewed.
+   *
+   * @param reviewed flag to decide if this change should be marked as reviewed ({@code true}) or
+   *     unreviewed ({@code false})
+   */
+  void markAsReviewed(boolean reviewed) throws RestApiException;
+
+  /**
+   * Create a new change that reverts this change.
+   *
+   * @see Changes#id(int)
+   */
+  ChangeApi revert() throws RestApiException;
+
+  /**
+   * Create a new change that reverts this change.
+   *
+   * @see Changes#id(int)
+   */
+  ChangeApi revert(RevertInput in) throws RestApiException;
+
+  /** Create a merge patch set for the change. */
+  ChangeInfo createMergePatchSet(MergePatchSetInput in) throws RestApiException;
+
+  List<ChangeInfo> submittedTogether() throws RestApiException;
+
+  SubmittedTogetherInfo submittedTogether(EnumSet<SubmittedTogetherOption> options)
+      throws RestApiException;
+
+  SubmittedTogetherInfo submittedTogether(
+      EnumSet<ListChangesOption> listOptions, EnumSet<SubmittedTogetherOption> submitOptions)
+      throws RestApiException;
+
+  /** Publishes a draft change. */
+  @Deprecated
+  void publish() throws RestApiException;
+
+  /** Rebase the current revision of a change using default options. */
+  void rebase() throws RestApiException;
+
+  /** Rebase the current revision of a change. */
+  void rebase(RebaseInput in) throws RestApiException;
+
+  /** Deletes a change. */
+  void delete() throws RestApiException;
+
+  String topic() throws RestApiException;
+
+  void topic(String topic) throws RestApiException;
+
+  IncludedInInfo includedIn() throws RestApiException;
+
+  AddReviewerResult addReviewer(AddReviewerInput in) throws RestApiException;
+
+  AddReviewerResult addReviewer(String in) throws RestApiException;
+
+  SuggestedReviewersRequest suggestReviewers() throws RestApiException;
+
+  SuggestedReviewersRequest suggestReviewers(String query) throws RestApiException;
+
+  /**
+   * Retrieve reviewers ({@code ReviewerState.REVIEWER} and {@code ReviewerState.CC}) on the change.
+   */
+  List<ReviewerInfo> reviewers() throws RestApiException;
+
+  ChangeInfo get(EnumSet<ListChangesOption> options) throws RestApiException;
+
+  default ChangeInfo get(Iterable<ListChangesOption> options) throws RestApiException {
+    return get(Sets.newEnumSet(options, ListChangesOption.class));
+  }
+
+  default ChangeInfo get(ListChangesOption... options) throws RestApiException {
+    return get(Arrays.asList(options));
+  }
+
+  /**
+   * {@link #get(ListChangesOption...)} with all options included, except for the following.
+   *
+   * <ul>
+   *   <li>{@code CHECK} is omitted, to skip consistency checks.
+   *   <li>{@code SKIP_MERGEABLE} is omitted, so the {@code mergeable} bit <em>is</em> set.
+   * </ul>
+   */
+  ChangeInfo get() throws RestApiException;
+
+  /** {@link #get(ListChangesOption...)} with no options included. */
+  ChangeInfo info() throws RestApiException;
+
+  /**
+   * Retrieve change edit when exists.
+   *
+   * @deprecated Replaced by {@link ChangeApi#edit()} in combination with {@link
+   *     ChangeEditApi#get()}.
+   */
+  @Deprecated
+  EditInfo getEdit() throws RestApiException;
+
+  /**
+   * Provides access to an API regarding the change edit of this change.
+   *
+   * @return a {@code ChangeEditApi} for the change edit of this change
+   * @throws RestApiException if the API isn't accessible
+   */
+  ChangeEditApi edit() throws RestApiException;
+
+  /** Create a new patch set with a new commit message. */
+  void setMessage(String message) throws RestApiException;
+
+  /** Create a new patch set with a new commit message. */
+  void setMessage(CommitMessageInput in) throws RestApiException;
+
+  /** Set hashtags on a change */
+  void setHashtags(HashtagsInput input) throws RestApiException;
+
+  /**
+   * Get hashtags on a change.
+   *
+   * @return hashtags
+   * @throws RestApiException
+   */
+  Set<String> getHashtags() throws RestApiException;
+
+  /** Set the assignee of a change. */
+  AccountInfo setAssignee(AssigneeInput input) throws RestApiException;
+
+  /** Get the assignee of a change. */
+  AccountInfo getAssignee() throws RestApiException;
+
+  /** Get all past assignees. */
+  List<AccountInfo> getPastAssignees() throws RestApiException;
+
+  /**
+   * Delete the assignee of a change.
+   *
+   * @return the assignee that was deleted, or null if there was no assignee.
+   */
+  AccountInfo deleteAssignee() throws RestApiException;
+
+  /**
+   * Get all published comments on a change.
+   *
+   * @return comments in a map keyed by path; comments have the {@code revision} field set to
+   *     indicate their patch set.
+   * @throws RestApiException
+   */
+  Map<String, List<CommentInfo>> comments() throws RestApiException;
+
+  /**
+   * Get all robot comments on a change.
+   *
+   * @return robot comments in a map keyed by path; robot comments have the {@code revision} field
+   *     set to indicate their patch set.
+   * @throws RestApiException
+   */
+  Map<String, List<RobotCommentInfo>> robotComments() throws RestApiException;
+
+  /**
+   * Get all draft comments for the current user on a change.
+   *
+   * @return drafts in a map keyed by path; comments have the {@code revision} field set to indicate
+   *     their patch set.
+   * @throws RestApiException
+   */
+  Map<String, List<CommentInfo>> drafts() throws RestApiException;
+
+  ChangeInfo check() throws RestApiException;
+
+  ChangeInfo check(FixInput fix) throws RestApiException;
+
+  void index() throws RestApiException;
+
+  /** Check if this change is a pure revert of the change stored in revertOf. */
+  PureRevertInfo pureRevert() throws RestApiException;
+
+  /** Check if this change is a pure revert of claimedOriginal (SHA1 in 40 digit hex). */
+  PureRevertInfo pureRevert(String claimedOriginal) throws RestApiException;
+
+  /**
+   * Get all messages of a change with detailed account info.
+   *
+   * @return a list of messages sorted by their creation time.
+   * @throws RestApiException
+   */
+  List<ChangeMessageInfo> messages() throws RestApiException;
+
+  /**
+   * Look up a change message of a change by its id.
+   *
+   * @param id the id of the change message. Note that in NoteDb, this id is the {@code ObjectId} of
+   *     a commit on the change meta branch. In ReviewDb, it's a UUID generated randomly. That means
+   *     a change message id could be different between NoteDb and ReviewDb.
+   * @return API for accessing a change message.
+   * @throws RestApiException if the id is invalid.
+   */
+  ChangeMessageApi message(String id) throws RestApiException;
+
+  abstract class SuggestedReviewersRequest {
+    private String query;
+    private int limit;
+
+    public abstract List<SuggestedReviewerInfo> get() throws RestApiException;
+
+    public SuggestedReviewersRequest withQuery(String query) {
+      this.query = query;
+      return this;
+    }
+
+    public SuggestedReviewersRequest withLimit(int limit) {
+      this.limit = limit;
+      return this;
+    }
+
+    public String getQuery() {
+      return query;
+    }
+
+    public int getLimit() {
+      return limit;
+    }
+  }
+
+  /**
+   * A default implementation which allows source compatibility when adding new methods to the
+   * interface.
+   */
+  class NotImplemented implements ChangeApi {
+    @Override
+    public String id() {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public RevisionApi current() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public RevisionApi revision(int id) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ReviewerApi reviewer(String id) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public RevisionApi revision(String id) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void abandon() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void abandon(AbandonInput in) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void restore() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void restore(RestoreInput in) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void move(String destination) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void move(MoveInput in) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void setPrivate(boolean value, @Nullable String message) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void setWorkInProgress(String message) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void setReadyForReview(String message) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ChangeApi revert() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ChangeApi revert(RevertInput in) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void publish() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Deprecated
+    @Override
+    public void rebase() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void rebase(RebaseInput in) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void delete() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public String topic() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void topic(String topic) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public IncludedInInfo includedIn() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public AddReviewerResult addReviewer(AddReviewerInput in) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public AddReviewerResult addReviewer(String in) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public SuggestedReviewersRequest suggestReviewers() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public SuggestedReviewersRequest suggestReviewers(String query) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public List<ReviewerInfo> reviewers() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ChangeInfo get(EnumSet<ListChangesOption> options) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ChangeInfo get() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ChangeInfo info() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void setMessage(String message) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void setMessage(CommitMessageInput in) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public EditInfo getEdit() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ChangeEditApi edit() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void setHashtags(HashtagsInput input) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public Set<String> getHashtags() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public AccountInfo setAssignee(AssigneeInput input) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public AccountInfo getAssignee() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public List<AccountInfo> getPastAssignees() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public AccountInfo deleteAssignee() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public Map<String, List<CommentInfo>> comments() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public Map<String, List<RobotCommentInfo>> robotComments() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public Map<String, List<CommentInfo>> drafts() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ChangeInfo check() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ChangeInfo check(FixInput fix) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void index() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public List<ChangeInfo> submittedTogether() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public SubmittedTogetherInfo submittedTogether(EnumSet<SubmittedTogetherOption> options)
+        throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public SubmittedTogetherInfo submittedTogether(
+        EnumSet<ListChangesOption> a, EnumSet<SubmittedTogetherOption> b) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ChangeInfo createMergePatchSet(MergePatchSetInput in) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void ignore(boolean ignore) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public boolean ignored() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void markAsReviewed(boolean reviewed) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public PureRevertInfo pureRevert() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public PureRevertInfo pureRevert(String claimedOriginal) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public List<ChangeMessageInfo> messages() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ChangeMessageApi message(String id) throws RestApiException {
+      throw new NotImplementedException();
+    }
+  }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ChangeEditApi.java b/java/com/google/gerrit/extensions/api/changes/ChangeEditApi.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ChangeEditApi.java
rename to java/com/google/gerrit/extensions/api/changes/ChangeEditApi.java
diff --git a/java/com/google/gerrit/extensions/api/changes/ChangeMessageApi.java b/java/com/google/gerrit/extensions/api/changes/ChangeMessageApi.java
new file mode 100644
index 0000000..66356f1
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/changes/ChangeMessageApi.java
@@ -0,0 +1,49 @@
+// 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.
+
+package com.google.gerrit.extensions.api.changes;
+
+import com.google.gerrit.extensions.common.ChangeMessageInfo;
+import com.google.gerrit.extensions.restapi.NotImplementedException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+
+/** Interface for change message APIs. */
+public interface ChangeMessageApi {
+  /** Gets one change message. */
+  ChangeMessageInfo get() throws RestApiException;
+
+  /**
+   * Deletes a change message by replacing its message. For NoteDb, it's implemented by rewriting
+   * the commit history of change meta branch.
+   *
+   * @return the change message with its message updated.
+   */
+  ChangeMessageInfo delete(DeleteChangeMessageInput input) throws RestApiException;
+
+  /**
+   * A default implementation which allows source compatibility when adding new methods to the
+   * interface.
+   */
+  class NotImplemented implements ChangeMessageApi {
+    @Override
+    public ChangeMessageInfo get() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ChangeMessageInfo delete(DeleteChangeMessageInput input) throws RestApiException {
+      throw new NotImplementedException();
+    }
+  }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/Changes.java b/java/com/google/gerrit/extensions/api/changes/Changes.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/Changes.java
rename to java/com/google/gerrit/extensions/api/changes/Changes.java
diff --git a/java/com/google/gerrit/extensions/api/changes/CherryPickInput.java b/java/com/google/gerrit/extensions/api/changes/CherryPickInput.java
new file mode 100644
index 0000000..5ac67e7
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/changes/CherryPickInput.java
@@ -0,0 +1,32 @@
+// Copyright (C) 2013 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.google.gerrit.extensions.api.changes;
+
+import java.util.Map;
+
+public class CherryPickInput {
+  public String message;
+  // Cherry-pick destination branch, which will be the destination of the newly created change.
+  public String destination;
+  // 40-hex digit SHA-1 of the commit which will be the parent commit of the newly created change.
+  public String base;
+  public Integer parent;
+
+  public NotifyHandling notify = NotifyHandling.NONE;
+  public Map<RecipientType, NotifyInfo> notifyDetails;
+
+  public boolean keepReviewers;
+  public boolean allowConflicts;
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/CommentApi.java b/java/com/google/gerrit/extensions/api/changes/CommentApi.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/CommentApi.java
rename to java/com/google/gerrit/extensions/api/changes/CommentApi.java
diff --git a/java/com/google/gerrit/extensions/api/changes/DeleteChangeMessageInput.java b/java/com/google/gerrit/extensions/api/changes/DeleteChangeMessageInput.java
new file mode 100644
index 0000000..ece5a61
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/changes/DeleteChangeMessageInput.java
@@ -0,0 +1,31 @@
+// 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.
+
+package com.google.gerrit.extensions.api.changes;
+
+import com.google.gerrit.extensions.restapi.DefaultInput;
+
+/** Input for deleting a change message. */
+public class DeleteChangeMessageInput {
+  /** An optional reason for deleting the change message. */
+  @DefaultInput public String reason;
+
+  public DeleteChangeMessageInput() {
+    this.reason = "";
+  }
+
+  public DeleteChangeMessageInput(String reason) {
+    this.reason = reason;
+  }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/DeleteCommentInput.java b/java/com/google/gerrit/extensions/api/changes/DeleteCommentInput.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/DeleteCommentInput.java
rename to java/com/google/gerrit/extensions/api/changes/DeleteCommentInput.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/DeleteReviewerInput.java b/java/com/google/gerrit/extensions/api/changes/DeleteReviewerInput.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/DeleteReviewerInput.java
rename to java/com/google/gerrit/extensions/api/changes/DeleteReviewerInput.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/DeleteVoteInput.java b/java/com/google/gerrit/extensions/api/changes/DeleteVoteInput.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/DeleteVoteInput.java
rename to java/com/google/gerrit/extensions/api/changes/DeleteVoteInput.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/DraftApi.java b/java/com/google/gerrit/extensions/api/changes/DraftApi.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/DraftApi.java
rename to java/com/google/gerrit/extensions/api/changes/DraftApi.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/DraftInput.java b/java/com/google/gerrit/extensions/api/changes/DraftInput.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/DraftInput.java
rename to java/com/google/gerrit/extensions/api/changes/DraftInput.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/FileApi.java b/java/com/google/gerrit/extensions/api/changes/FileApi.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/FileApi.java
rename to java/com/google/gerrit/extensions/api/changes/FileApi.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/FixInput.java b/java/com/google/gerrit/extensions/api/changes/FixInput.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/FixInput.java
rename to java/com/google/gerrit/extensions/api/changes/FixInput.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/HashtagsInput.java b/java/com/google/gerrit/extensions/api/changes/HashtagsInput.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/HashtagsInput.java
rename to java/com/google/gerrit/extensions/api/changes/HashtagsInput.java
diff --git a/java/com/google/gerrit/extensions/api/changes/IncludedInInfo.java b/java/com/google/gerrit/extensions/api/changes/IncludedInInfo.java
new file mode 100644
index 0000000..8fe47bd
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/changes/IncludedInInfo.java
@@ -0,0 +1,34 @@
+// Copyright (C) 2017 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.google.gerrit.extensions.api.changes;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+public class IncludedInInfo {
+  public List<String> branches;
+  public List<String> tags;
+  public Map<String, Collection<String>> external;
+
+  public IncludedInInfo(
+      Collection<String> branches,
+      Collection<String> tags,
+      Map<String, Collection<String>> external) {
+    this.branches = new ArrayList<>(branches);
+    this.tags = new ArrayList<>(tags);
+    this.external = external;
+  }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/MoveInput.java b/java/com/google/gerrit/extensions/api/changes/MoveInput.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/MoveInput.java
rename to java/com/google/gerrit/extensions/api/changes/MoveInput.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/NotifyHandling.java b/java/com/google/gerrit/extensions/api/changes/NotifyHandling.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/NotifyHandling.java
rename to java/com/google/gerrit/extensions/api/changes/NotifyHandling.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/NotifyInfo.java b/java/com/google/gerrit/extensions/api/changes/NotifyInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/NotifyInfo.java
rename to java/com/google/gerrit/extensions/api/changes/NotifyInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/PublishChangeEditInput.java b/java/com/google/gerrit/extensions/api/changes/PublishChangeEditInput.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/PublishChangeEditInput.java
rename to java/com/google/gerrit/extensions/api/changes/PublishChangeEditInput.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RebaseInput.java b/java/com/google/gerrit/extensions/api/changes/RebaseInput.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RebaseInput.java
rename to java/com/google/gerrit/extensions/api/changes/RebaseInput.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RecipientType.java b/java/com/google/gerrit/extensions/api/changes/RecipientType.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RecipientType.java
rename to java/com/google/gerrit/extensions/api/changes/RecipientType.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RelatedChangeAndCommitInfo.java b/java/com/google/gerrit/extensions/api/changes/RelatedChangeAndCommitInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RelatedChangeAndCommitInfo.java
rename to java/com/google/gerrit/extensions/api/changes/RelatedChangeAndCommitInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RelatedChangesInfo.java b/java/com/google/gerrit/extensions/api/changes/RelatedChangesInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RelatedChangesInfo.java
rename to java/com/google/gerrit/extensions/api/changes/RelatedChangesInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RestoreInput.java b/java/com/google/gerrit/extensions/api/changes/RestoreInput.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RestoreInput.java
rename to java/com/google/gerrit/extensions/api/changes/RestoreInput.java
diff --git a/java/com/google/gerrit/extensions/api/changes/RevertInput.java b/java/com/google/gerrit/extensions/api/changes/RevertInput.java
new file mode 100644
index 0000000..c1be9b0
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/changes/RevertInput.java
@@ -0,0 +1,27 @@
+// Copyright (C) 2013 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.google.gerrit.extensions.api.changes;
+
+import com.google.gerrit.extensions.restapi.DefaultInput;
+import java.util.Map;
+
+public class RevertInput {
+  @DefaultInput public String message;
+
+  /** Who to send email notifications to after change is created. */
+  public NotifyHandling notify = NotifyHandling.ALL;
+
+  public Map<RecipientType, NotifyInfo> notifyDetails;
+}
diff --git a/java/com/google/gerrit/extensions/api/changes/ReviewInput.java b/java/com/google/gerrit/extensions/api/changes/ReviewInput.java
new file mode 100644
index 0000000..b140064
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/changes/ReviewInput.java
@@ -0,0 +1,173 @@
+// Copyright (C) 2013 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.google.gerrit.extensions.api.changes;
+
+import static com.google.gerrit.extensions.client.ReviewerState.REVIEWER;
+
+import com.google.gerrit.extensions.client.Comment;
+import com.google.gerrit.extensions.client.ReviewerState;
+import com.google.gerrit.extensions.common.FixSuggestionInfo;
+import com.google.gerrit.extensions.restapi.DefaultInput;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/** Input passed to {@code POST /changes/[id]/revisions/[id]/review}. */
+public class ReviewInput {
+  @DefaultInput public String message;
+
+  public String tag;
+
+  public Map<String, Short> labels;
+  public Map<String, List<CommentInput>> comments;
+  public Map<String, List<RobotCommentInput>> robotComments;
+
+  /**
+   * How to process draft comments already in the database that were not also described in this
+   * input request.
+   *
+   * <p>If not set, the default is {@link DraftHandling#KEEP}. If {@link #onBehalfOf} is set, then
+   * no other value besides {@code KEEP} is allowed.
+   */
+  public DraftHandling drafts;
+
+  /** Who to send email notifications to after review is stored. */
+  public NotifyHandling notify;
+
+  public Map<RecipientType, NotifyInfo> notifyDetails;
+
+  /** If true check to make sure that the comments being posted aren't already present. */
+  public boolean omitDuplicateComments;
+
+  /**
+   * Account ID, name, email address or username of another user. The review will be posted/updated
+   * on behalf of this named user instead of the caller. Caller must have the labelAs-$NAME
+   * permission granted for each label that appears in {@link #labels}. This is in addition to the
+   * named user also needing to have permission to use the labels.
+   */
+  public String onBehalfOf;
+
+  /** Reviewers that should be added to this change. */
+  public List<AddReviewerInput> reviewers;
+
+  /**
+   * If true mark the change as work in progress. It is an error for both {@link #workInProgress}
+   * and {@link #ready} to be true.
+   */
+  public boolean workInProgress;
+
+  /**
+   * If true mark the change as ready for review. It is an error for both {@link #workInProgress}
+   * and {@link #ready} to be true.
+   */
+  public boolean ready;
+
+  public enum DraftHandling {
+    /** Leave pending drafts alone. */
+    KEEP,
+
+    /** Publish pending drafts on this revision only. */
+    PUBLISH,
+
+    /** Publish pending drafts on all revisions. */
+    PUBLISH_ALL_REVISIONS
+  }
+
+  public static class CommentInput extends Comment {}
+
+  public static class RobotCommentInput extends CommentInput {
+    public String robotId;
+    public String robotRunId;
+    public String url;
+    public Map<String, String> properties;
+    public List<FixSuggestionInfo> fixSuggestions;
+  }
+
+  public ReviewInput message(String msg) {
+    message = msg != null && !msg.isEmpty() ? msg : null;
+    return this;
+  }
+
+  public ReviewInput label(String name, short value) {
+    if (name == null || name.isEmpty()) {
+      throw new IllegalArgumentException();
+    }
+    if (labels == null) {
+      labels = new LinkedHashMap<>(4);
+    }
+    labels.put(name, value);
+    return this;
+  }
+
+  public ReviewInput label(String name, int value) {
+    if (value < Short.MIN_VALUE || value > Short.MAX_VALUE) {
+      throw new IllegalArgumentException();
+    }
+    return label(name, (short) value);
+  }
+
+  public ReviewInput label(String name) {
+    return label(name, (short) 1);
+  }
+
+  public ReviewInput reviewer(String reviewer) {
+    return reviewer(reviewer, REVIEWER, false);
+  }
+
+  public ReviewInput reviewer(String reviewer, ReviewerState state, boolean confirmed) {
+    AddReviewerInput input = new AddReviewerInput();
+    input.reviewer = reviewer;
+    input.state = state;
+    input.confirmed = confirmed;
+    if (reviewers == null) {
+      reviewers = new ArrayList<>();
+    }
+    reviewers.add(input);
+    return this;
+  }
+
+  public ReviewInput setWorkInProgress(boolean workInProgress) {
+    this.workInProgress = workInProgress;
+    ready = !workInProgress;
+    return this;
+  }
+
+  public ReviewInput setReady(boolean ready) {
+    this.ready = ready;
+    workInProgress = !ready;
+    return this;
+  }
+
+  public static ReviewInput recommend() {
+    return new ReviewInput().label("Code-Review", 1);
+  }
+
+  public static ReviewInput dislike() {
+    return new ReviewInput().label("Code-Review", -1);
+  }
+
+  public static ReviewInput noScore() {
+    return new ReviewInput().label("Code-Review", 0);
+  }
+
+  public static ReviewInput approve() {
+    return new ReviewInput().label("Code-Review", 2);
+  }
+
+  public static ReviewInput reject() {
+    return new ReviewInput().label("Code-Review", -2);
+  }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewResult.java b/java/com/google/gerrit/extensions/api/changes/ReviewResult.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewResult.java
rename to java/com/google/gerrit/extensions/api/changes/ReviewResult.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewerApi.java b/java/com/google/gerrit/extensions/api/changes/ReviewerApi.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewerApi.java
rename to java/com/google/gerrit/extensions/api/changes/ReviewerApi.java
diff --git a/java/com/google/gerrit/extensions/api/changes/ReviewerInfo.java b/java/com/google/gerrit/extensions/api/changes/ReviewerInfo.java
new file mode 100644
index 0000000..3c32d29
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/changes/ReviewerInfo.java
@@ -0,0 +1,45 @@
+// 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.
+
+package com.google.gerrit.extensions.api.changes;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.common.AccountInfo;
+import java.util.Map;
+
+/** Account and approval details for an added reviewer. */
+public class ReviewerInfo extends AccountInfo {
+  /**
+   * {@link Map} of label name to initial value for each approval the reviewer is responsible for.
+   */
+  @Nullable public Map<String, String> approvals;
+
+  public static ReviewerInfo byEmail(@Nullable String name, String email) {
+    ReviewerInfo info = new ReviewerInfo();
+    info.name = name;
+    info.email = email;
+    return info;
+  }
+
+  public ReviewerInfo(Integer id) {
+    super(id);
+  }
+
+  @Override
+  public String toString() {
+    return username != null ? username : email;
+  }
+
+  private ReviewerInfo() {}
+}
diff --git a/java/com/google/gerrit/extensions/api/changes/RevisionApi.java b/java/com/google/gerrit/extensions/api/changes/RevisionApi.java
new file mode 100644
index 0000000..0eaa75e
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/changes/RevisionApi.java
@@ -0,0 +1,405 @@
+// Copyright (C) 2013 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.google.gerrit.extensions.api.changes;
+
+import com.google.common.collect.ListMultimap;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.extensions.common.ActionInfo;
+import com.google.gerrit.extensions.common.ApprovalInfo;
+import com.google.gerrit.extensions.common.CherryPickChangeInfo;
+import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.common.CommitInfo;
+import com.google.gerrit.extensions.common.EditInfo;
+import com.google.gerrit.extensions.common.FileInfo;
+import com.google.gerrit.extensions.common.MergeableInfo;
+import com.google.gerrit.extensions.common.RobotCommentInfo;
+import com.google.gerrit.extensions.common.TestSubmitRuleInfo;
+import com.google.gerrit.extensions.common.TestSubmitRuleInput;
+import com.google.gerrit.extensions.restapi.BinaryResult;
+import com.google.gerrit.extensions.restapi.NotImplementedException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public interface RevisionApi {
+  @Deprecated
+  void delete() throws RestApiException;
+
+  String description() throws RestApiException;
+
+  void description(String description) throws RestApiException;
+
+  ReviewResult review(ReviewInput in) throws RestApiException;
+
+  void submit() throws RestApiException;
+
+  void submit(SubmitInput in) throws RestApiException;
+
+  BinaryResult submitPreview() throws RestApiException;
+
+  BinaryResult submitPreview(String format) throws RestApiException;
+
+  @Deprecated
+  void publish() throws RestApiException;
+
+  ChangeApi cherryPick(CherryPickInput in) throws RestApiException;
+
+  CherryPickChangeInfo cherryPickAsInfo(CherryPickInput in) throws RestApiException;
+
+  ChangeApi rebase() throws RestApiException;
+
+  ChangeApi rebase(RebaseInput in) throws RestApiException;
+
+  boolean canRebase() throws RestApiException;
+
+  RevisionReviewerApi reviewer(String id) throws RestApiException;
+
+  void setReviewed(String path, boolean reviewed) throws RestApiException;
+
+  Set<String> reviewed() throws RestApiException;
+
+  Map<String, FileInfo> files() throws RestApiException;
+
+  Map<String, FileInfo> files(String base) throws RestApiException;
+
+  Map<String, FileInfo> files(int parentNum) throws RestApiException;
+
+  List<String> queryFiles(String query) throws RestApiException;
+
+  FileApi file(String path);
+
+  CommitInfo commit(boolean addLinks) throws RestApiException;
+
+  MergeableInfo mergeable() throws RestApiException;
+
+  MergeableInfo mergeableOtherBranches() throws RestApiException;
+
+  Map<String, List<CommentInfo>> comments() throws RestApiException;
+
+  Map<String, List<RobotCommentInfo>> robotComments() throws RestApiException;
+
+  Map<String, List<CommentInfo>> drafts() throws RestApiException;
+
+  List<CommentInfo> commentsAsList() throws RestApiException;
+
+  List<CommentInfo> draftsAsList() throws RestApiException;
+
+  List<RobotCommentInfo> robotCommentsAsList() throws RestApiException;
+
+  /**
+   * Applies the indicated fix by creating a new change edit or integrating the fix with the
+   * existing change edit. If no change edit exists before this call, the fix must refer to the
+   * current patch set. If a change edit exists, the fix must refer to the patch set on which the
+   * change edit is based.
+   *
+   * @param fixId the ID of the fix which should be applied
+   * @throws RestApiException if the fix couldn't be applied
+   */
+  EditInfo applyFix(String fixId) throws RestApiException;
+
+  DraftApi createDraft(DraftInput in) throws RestApiException;
+
+  DraftApi draft(String id) throws RestApiException;
+
+  CommentApi comment(String id) throws RestApiException;
+
+  RobotCommentApi robotComment(String id) throws RestApiException;
+
+  String etag() throws RestApiException;
+
+  /** Returns patch of revision. */
+  BinaryResult patch() throws RestApiException;
+
+  BinaryResult patch(String path) throws RestApiException;
+
+  Map<String, ActionInfo> actions() throws RestApiException;
+
+  SubmitType submitType() throws RestApiException;
+
+  SubmitType testSubmitType(TestSubmitRuleInput in) throws RestApiException;
+
+  List<TestSubmitRuleInfo> testSubmitRule(TestSubmitRuleInput in) throws RestApiException;
+
+  MergeListRequest getMergeList() throws RestApiException;
+
+  RelatedChangesInfo related() throws RestApiException;
+
+  /** Returns votes on the revision. */
+  ListMultimap<String, ApprovalInfo> votes() throws RestApiException;
+
+  abstract class MergeListRequest {
+    private boolean addLinks;
+    private int uninterestingParent = 1;
+
+    public abstract List<CommitInfo> get() throws RestApiException;
+
+    public MergeListRequest withLinks() {
+      this.addLinks = true;
+      return this;
+    }
+
+    public MergeListRequest withUninterestingParent(int uninterestingParent) {
+      this.uninterestingParent = uninterestingParent;
+      return this;
+    }
+
+    public boolean getAddLinks() {
+      return addLinks;
+    }
+
+    public int getUninterestingParent() {
+      return uninterestingParent;
+    }
+  }
+
+  /**
+   * A default implementation which allows source compatibility when adding new methods to the
+   * interface.
+   */
+  class NotImplemented implements RevisionApi {
+    @Deprecated
+    @Override
+    public void delete() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ReviewResult review(ReviewInput in) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void submit() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void submit(SubmitInput in) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Deprecated
+    @Override
+    public void publish() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ChangeApi cherryPick(CherryPickInput in) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public CherryPickChangeInfo cherryPickAsInfo(CherryPickInput in) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ChangeApi rebase() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ChangeApi rebase(RebaseInput in) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public boolean canRebase() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public RevisionReviewerApi reviewer(String id) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void setReviewed(String path, boolean reviewed) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public Set<String> reviewed() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public MergeableInfo mergeable() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public MergeableInfo mergeableOtherBranches() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public Map<String, FileInfo> files(String base) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public Map<String, FileInfo> files(int parentNum) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public Map<String, FileInfo> files() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public List<String> queryFiles(String query) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public FileApi file(String path) {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public CommitInfo commit(boolean addLinks) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public Map<String, List<CommentInfo>> comments() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public Map<String, List<RobotCommentInfo>> robotComments() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public List<CommentInfo> commentsAsList() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public List<CommentInfo> draftsAsList() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public List<RobotCommentInfo> robotCommentsAsList() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public EditInfo applyFix(String fixId) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public Map<String, List<CommentInfo>> drafts() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public DraftApi createDraft(DraftInput in) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public DraftApi draft(String id) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public CommentApi comment(String id) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public RobotCommentApi robotComment(String id) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public BinaryResult patch() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public BinaryResult patch(String path) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public Map<String, ActionInfo> actions() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public SubmitType submitType() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public BinaryResult submitPreview() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public BinaryResult submitPreview(String format) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public SubmitType testSubmitType(TestSubmitRuleInput in) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public List<TestSubmitRuleInfo> testSubmitRule(TestSubmitRuleInput in) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public MergeListRequest getMergeList() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public RelatedChangesInfo related() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ListMultimap<String, ApprovalInfo> votes() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void description(String description) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public String description() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public String etag() throws RestApiException {
+      throw new NotImplementedException();
+    }
+  }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevisionReviewerApi.java b/java/com/google/gerrit/extensions/api/changes/RevisionReviewerApi.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevisionReviewerApi.java
rename to java/com/google/gerrit/extensions/api/changes/RevisionReviewerApi.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RobotCommentApi.java b/java/com/google/gerrit/extensions/api/changes/RobotCommentApi.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RobotCommentApi.java
rename to java/com/google/gerrit/extensions/api/changes/RobotCommentApi.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/StarsInput.java b/java/com/google/gerrit/extensions/api/changes/StarsInput.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/StarsInput.java
rename to java/com/google/gerrit/extensions/api/changes/StarsInput.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/SubmitInput.java b/java/com/google/gerrit/extensions/api/changes/SubmitInput.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/SubmitInput.java
rename to java/com/google/gerrit/extensions/api/changes/SubmitInput.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/SubmittedTogetherInfo.java b/java/com/google/gerrit/extensions/api/changes/SubmittedTogetherInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/SubmittedTogetherInfo.java
rename to java/com/google/gerrit/extensions/api/changes/SubmittedTogetherInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/SubmittedTogetherOption.java b/java/com/google/gerrit/extensions/api/changes/SubmittedTogetherOption.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/SubmittedTogetherOption.java
rename to java/com/google/gerrit/extensions/api/changes/SubmittedTogetherOption.java
diff --git a/java/com/google/gerrit/extensions/api/changes/TopicInput.java b/java/com/google/gerrit/extensions/api/changes/TopicInput.java
new file mode 100644
index 0000000..12240d2
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/changes/TopicInput.java
@@ -0,0 +1,21 @@
+// Copyright (C) 2017 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.google.gerrit.extensions.api.changes;
+
+import com.google.gerrit.extensions.restapi.DefaultInput;
+
+public class TopicInput {
+  @DefaultInput public String topic;
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/config/AccessCheckInfo.java b/java/com/google/gerrit/extensions/api/config/AccessCheckInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/config/AccessCheckInfo.java
rename to java/com/google/gerrit/extensions/api/config/AccessCheckInfo.java
diff --git a/java/com/google/gerrit/extensions/api/config/AccessCheckInput.java b/java/com/google/gerrit/extensions/api/config/AccessCheckInput.java
new file mode 100644
index 0000000..cc53b63
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/config/AccessCheckInput.java
@@ -0,0 +1,25 @@
+// Copyright (C) 2017 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.google.gerrit.extensions.api.config;
+
+import com.google.gerrit.common.Nullable;
+
+public class AccessCheckInput {
+  public String account;
+  @Nullable public String ref;
+
+  // If permission is given, ref must also be given.
+  @Nullable public String permission;
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/config/Config.java b/java/com/google/gerrit/extensions/api/config/Config.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/config/Config.java
rename to java/com/google/gerrit/extensions/api/config/Config.java
diff --git a/java/com/google/gerrit/extensions/api/config/ConfigUpdateEntryInfo.java b/java/com/google/gerrit/extensions/api/config/ConfigUpdateEntryInfo.java
new file mode 100644
index 0000000..4ebf7b2
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/config/ConfigUpdateEntryInfo.java
@@ -0,0 +1,21 @@
+// 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.
+
+package com.google.gerrit.extensions.api.config;
+
+public class ConfigUpdateEntryInfo {
+  public String configKey;
+  public String oldValue;
+  public String newValue;
+}
diff --git a/java/com/google/gerrit/extensions/api/config/ConsistencyCheckInfo.java b/java/com/google/gerrit/extensions/api/config/ConsistencyCheckInfo.java
new file mode 100644
index 0000000..2c166d0
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/config/ConsistencyCheckInfo.java
@@ -0,0 +1,90 @@
+// Copyright (C) 2017 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.google.gerrit.extensions.api.config;
+
+import java.util.List;
+import java.util.Objects;
+
+public class ConsistencyCheckInfo {
+  public CheckAccountsResultInfo checkAccountsResult;
+  public CheckAccountExternalIdsResultInfo checkAccountExternalIdsResult;
+  public CheckGroupsResultInfo checkGroupsResult;
+
+  public static class CheckAccountsResultInfo {
+    public List<ConsistencyProblemInfo> problems;
+
+    public CheckAccountsResultInfo(List<ConsistencyProblemInfo> problems) {
+      this.problems = problems;
+    }
+  }
+
+  public static class CheckAccountExternalIdsResultInfo {
+    public List<ConsistencyProblemInfo> problems;
+
+    public CheckAccountExternalIdsResultInfo(List<ConsistencyProblemInfo> problems) {
+      this.problems = problems;
+    }
+  }
+
+  public static class CheckGroupsResultInfo {
+    public List<ConsistencyProblemInfo> problems;
+
+    public CheckGroupsResultInfo(List<ConsistencyProblemInfo> problems) {
+      this.problems = problems;
+    }
+  }
+
+  public static class ConsistencyProblemInfo {
+    public enum Status {
+      ERROR,
+      WARNING,
+    }
+
+    public final Status status;
+    public final String message;
+
+    public ConsistencyProblemInfo(Status status, String message) {
+      this.status = status;
+      this.message = message;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+      if (o instanceof ConsistencyProblemInfo) {
+        ConsistencyProblemInfo other = ((ConsistencyProblemInfo) o);
+        return Objects.equals(status, other.status) && Objects.equals(message, other.message);
+      }
+      return false;
+    }
+
+    @Override
+    public int hashCode() {
+      return Objects.hash(status, message);
+    }
+
+    @Override
+    public String toString() {
+      return status.name() + ": " + message;
+    }
+
+    public static ConsistencyProblemInfo warning(String fmt, Object... args) {
+      return new ConsistencyProblemInfo(Status.WARNING, String.format(fmt, args));
+    }
+
+    public static ConsistencyProblemInfo error(String fmt, Object... args) {
+      return new ConsistencyProblemInfo(Status.ERROR, String.format(fmt, args));
+    }
+  }
+}
diff --git a/java/com/google/gerrit/extensions/api/config/ConsistencyCheckInput.java b/java/com/google/gerrit/extensions/api/config/ConsistencyCheckInput.java
new file mode 100644
index 0000000..fbc7e27
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/config/ConsistencyCheckInput.java
@@ -0,0 +1,27 @@
+// Copyright (C) 2017 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.google.gerrit.extensions.api.config;
+
+public class ConsistencyCheckInput {
+  public CheckAccountsInput checkAccounts;
+  public CheckAccountExternalIdsInput checkAccountExternalIds;
+  public CheckGroupsInput checkGroups;
+
+  public static class CheckAccountsInput {}
+
+  public static class CheckAccountExternalIdsInput {}
+
+  public static class CheckGroupsInput {}
+}
diff --git a/java/com/google/gerrit/extensions/api/config/Server.java b/java/com/google/gerrit/extensions/api/config/Server.java
new file mode 100644
index 0000000..5ec63af
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/config/Server.java
@@ -0,0 +1,97 @@
+// Copyright (C) 2015 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.google.gerrit.extensions.api.config;
+
+import com.google.gerrit.extensions.client.DiffPreferencesInfo;
+import com.google.gerrit.extensions.client.EditPreferencesInfo;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
+import com.google.gerrit.extensions.common.ServerInfo;
+import com.google.gerrit.extensions.restapi.NotImplementedException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+
+public interface Server {
+  /** @return Version of server. */
+  String getVersion() throws RestApiException;
+
+  ServerInfo getInfo() throws RestApiException;
+
+  GeneralPreferencesInfo getDefaultPreferences() throws RestApiException;
+
+  GeneralPreferencesInfo setDefaultPreferences(GeneralPreferencesInfo in) throws RestApiException;
+
+  DiffPreferencesInfo getDefaultDiffPreferences() throws RestApiException;
+
+  DiffPreferencesInfo setDefaultDiffPreferences(DiffPreferencesInfo in) throws RestApiException;
+
+  EditPreferencesInfo getDefaultEditPreferences() throws RestApiException;
+
+  EditPreferencesInfo setDefaultEditPreferences(EditPreferencesInfo in) throws RestApiException;
+
+  ConsistencyCheckInfo checkConsistency(ConsistencyCheckInput in) throws RestApiException;
+
+  /**
+   * A default implementation which allows source compatibility when adding new methods to the
+   * interface.
+   */
+  class NotImplemented implements Server {
+    @Override
+    public String getVersion() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ServerInfo getInfo() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public GeneralPreferencesInfo getDefaultPreferences() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public GeneralPreferencesInfo setDefaultPreferences(GeneralPreferencesInfo in)
+        throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public DiffPreferencesInfo getDefaultDiffPreferences() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public DiffPreferencesInfo setDefaultDiffPreferences(DiffPreferencesInfo in)
+        throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public EditPreferencesInfo getDefaultEditPreferences() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public EditPreferencesInfo setDefaultEditPreferences(EditPreferencesInfo in)
+        throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ConsistencyCheckInfo checkConsistency(ConsistencyCheckInput in) throws RestApiException {
+      throw new NotImplementedException();
+    }
+  }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/groups/GroupApi.java b/java/com/google/gerrit/extensions/api/groups/GroupApi.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/groups/GroupApi.java
rename to java/com/google/gerrit/extensions/api/groups/GroupApi.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/groups/GroupInput.java b/java/com/google/gerrit/extensions/api/groups/GroupInput.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/groups/GroupInput.java
rename to java/com/google/gerrit/extensions/api/groups/GroupInput.java
diff --git a/java/com/google/gerrit/extensions/api/groups/Groups.java b/java/com/google/gerrit/extensions/api/groups/Groups.java
new file mode 100644
index 0000000..86c2d77
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/groups/Groups.java
@@ -0,0 +1,326 @@
+// Copyright (C) 2015 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.google.gerrit.extensions.api.groups;
+
+import com.google.gerrit.extensions.client.ListGroupsOption;
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.extensions.restapi.NotImplementedException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.Map;
+
+public interface Groups {
+  /**
+   * Look up a group by ID.
+   *
+   * <p><strong>Note:</strong> This method eagerly reads the group. Methods that mutate the group do
+   * not necessarily re-read the group. Therefore, calling a getter method on an instance after
+   * calling a mutation method on that same instance is not guaranteed to reflect the mutation. It
+   * is not recommended to store references to {@code groupApi} instances.
+   *
+   * @param id any identifier supported by the REST API, including group name or UUID.
+   * @return API for accessing the group.
+   * @throws RestApiException if an error occurred.
+   */
+  GroupApi id(String id) throws RestApiException;
+
+  /** Create a new group with the given name and default options. */
+  GroupApi create(String name) throws RestApiException;
+
+  /** Create a new group. */
+  GroupApi create(GroupInput input) throws RestApiException;
+
+  /** @return new request for listing groups. */
+  ListRequest list();
+
+  /**
+   * Query groups.
+   *
+   * <p>Example code: {@code query().withQuery("inname:test").withLimit(10).get()}
+   *
+   * @return API for setting parameters and getting result.
+   */
+  QueryRequest query();
+
+  /**
+   * Query groups.
+   *
+   * <p>Shortcut API for {@code query().withQuery(String)}.
+   *
+   * @see #query()
+   */
+  QueryRequest query(String query);
+
+  abstract class ListRequest {
+    private final EnumSet<ListGroupsOption> options = EnumSet.noneOf(ListGroupsOption.class);
+    private final List<String> projects = new ArrayList<>();
+    private final List<String> groups = new ArrayList<>();
+
+    private boolean visibleToAll;
+    private String user;
+    private boolean owned;
+    private int limit;
+    private int start;
+    private String substring;
+    private String suggest;
+    private String regex;
+    private String ownedBy;
+
+    public List<GroupInfo> get() throws RestApiException {
+      Map<String, GroupInfo> map = getAsMap();
+      List<GroupInfo> result = new ArrayList<>(map.size());
+      for (Map.Entry<String, GroupInfo> e : map.entrySet()) {
+        // ListGroups "helpfully" nulls out names when converting to a map.
+        e.getValue().name = e.getKey();
+        result.add(e.getValue());
+      }
+      return Collections.unmodifiableList(result);
+    }
+
+    public abstract Map<String, GroupInfo> getAsMap() throws RestApiException;
+
+    public ListRequest addOption(ListGroupsOption option) {
+      options.add(option);
+      return this;
+    }
+
+    public ListRequest addOptions(ListGroupsOption... options) {
+      return addOptions(Arrays.asList(options));
+    }
+
+    public ListRequest addOptions(Iterable<ListGroupsOption> options) {
+      for (ListGroupsOption option : options) {
+        this.options.add(option);
+      }
+      return this;
+    }
+
+    public ListRequest withProject(String project) {
+      projects.add(project);
+      return this;
+    }
+
+    public ListRequest addGroup(String uuid) {
+      groups.add(uuid);
+      return this;
+    }
+
+    public ListRequest withVisibleToAll(boolean visible) {
+      visibleToAll = visible;
+      return this;
+    }
+
+    public ListRequest withUser(String user) {
+      this.user = user;
+      return this;
+    }
+
+    public ListRequest withOwned(boolean owned) {
+      this.owned = owned;
+      return this;
+    }
+
+    public ListRequest withLimit(int limit) {
+      this.limit = limit;
+      return this;
+    }
+
+    public ListRequest withStart(int start) {
+      this.start = start;
+      return this;
+    }
+
+    public ListRequest withSubstring(String substring) {
+      this.substring = substring;
+      return this;
+    }
+
+    public ListRequest withRegex(String regex) {
+      this.regex = regex;
+      return this;
+    }
+
+    public ListRequest withSuggest(String suggest) {
+      this.suggest = suggest;
+      return this;
+    }
+
+    public ListRequest withOwnedBy(String ownedBy) {
+      this.ownedBy = ownedBy;
+      return this;
+    }
+
+    public EnumSet<ListGroupsOption> getOptions() {
+      return options;
+    }
+
+    public List<String> getProjects() {
+      return Collections.unmodifiableList(projects);
+    }
+
+    public List<String> getGroups() {
+      return Collections.unmodifiableList(groups);
+    }
+
+    public boolean getVisibleToAll() {
+      return visibleToAll;
+    }
+
+    public String getUser() {
+      return user;
+    }
+
+    public boolean getOwned() {
+      return owned;
+    }
+
+    public int getLimit() {
+      return limit;
+    }
+
+    public int getStart() {
+      return start;
+    }
+
+    public String getSubstring() {
+      return substring;
+    }
+
+    public String getRegex() {
+      return regex;
+    }
+
+    public String getSuggest() {
+      return suggest;
+    }
+
+    public String getOwnedBy() {
+      return ownedBy;
+    }
+  }
+
+  /**
+   * API for setting parameters and getting result. Used for {@code query()}.
+   *
+   * @see #query()
+   */
+  abstract class QueryRequest {
+    private String query;
+    private int limit;
+    private int start;
+    private EnumSet<ListGroupsOption> options = EnumSet.noneOf(ListGroupsOption.class);
+
+    /** Execute query and returns the matched groups as list. */
+    public abstract List<GroupInfo> get() throws RestApiException;
+
+    /**
+     * Set query.
+     *
+     * @param query needs to be in human-readable form.
+     */
+    public QueryRequest withQuery(String query) {
+      this.query = query;
+      return this;
+    }
+
+    /**
+     * Set limit for returned list of groups. Optional; server-default is used when not provided.
+     */
+    public QueryRequest withLimit(int limit) {
+      this.limit = limit;
+      return this;
+    }
+
+    /** Set number of groups to skip. Optional; no groups are skipped when not provided. */
+    public QueryRequest withStart(int start) {
+      this.start = start;
+      return this;
+    }
+
+    /** Set an option on the request, appending to existing options. */
+    public QueryRequest withOption(ListGroupsOption options) {
+      this.options.add(options);
+      return this;
+    }
+
+    /** Set options on the request, appending to existing options. */
+    public QueryRequest withOptions(ListGroupsOption... options) {
+      this.options.addAll(Arrays.asList(options));
+      return this;
+    }
+
+    /** Set options on the request, replacing existing options. */
+    public QueryRequest withOptions(EnumSet<ListGroupsOption> options) {
+      this.options = options;
+      return this;
+    }
+
+    public String getQuery() {
+      return query;
+    }
+
+    public int getLimit() {
+      return limit;
+    }
+
+    public int getStart() {
+      return start;
+    }
+
+    public EnumSet<ListGroupsOption> getOptions() {
+      return options;
+    }
+  }
+
+  /**
+   * A default implementation which allows source compatibility when adding new methods to the
+   * interface.
+   */
+  class NotImplemented implements Groups {
+    @Override
+    public GroupApi id(String id) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public GroupApi create(String name) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public GroupApi create(GroupInput input) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ListRequest list() {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public QueryRequest query() {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public QueryRequest query(String query) {
+      throw new NotImplementedException();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/extensions/api/groups/OwnerInput.java b/java/com/google/gerrit/extensions/api/groups/OwnerInput.java
new file mode 100644
index 0000000..8b0006e
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/groups/OwnerInput.java
@@ -0,0 +1,21 @@
+// Copyright (C) 2017 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.google.gerrit.extensions.api.groups;
+
+import com.google.gerrit.extensions.restapi.DefaultInput;
+
+public class OwnerInput {
+  @DefaultInput public String owner;
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/lfs/LfsDefinitions.java b/java/com/google/gerrit/extensions/api/lfs/LfsDefinitions.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/lfs/LfsDefinitions.java
rename to java/com/google/gerrit/extensions/api/lfs/LfsDefinitions.java
diff --git a/java/com/google/gerrit/extensions/api/plugins/InstallPluginInput.java b/java/com/google/gerrit/extensions/api/plugins/InstallPluginInput.java
new file mode 100644
index 0000000..f0ef07c
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/plugins/InstallPluginInput.java
@@ -0,0 +1,23 @@
+// 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.
+
+package com.google.gerrit.extensions.api.plugins;
+
+import com.google.gerrit.extensions.restapi.DefaultInput;
+import com.google.gerrit.extensions.restapi.RawInput;
+
+public class InstallPluginInput {
+  public @DefaultInput String url;
+  public RawInput raw;
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/plugins/PluginApi.java b/java/com/google/gerrit/extensions/api/plugins/PluginApi.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/plugins/PluginApi.java
rename to java/com/google/gerrit/extensions/api/plugins/PluginApi.java
diff --git a/java/com/google/gerrit/extensions/api/plugins/Plugins.java b/java/com/google/gerrit/extensions/api/plugins/Plugins.java
new file mode 100644
index 0000000..6c2d6db
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/plugins/Plugins.java
@@ -0,0 +1,139 @@
+// Copyright (C) 2017 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.google.gerrit.extensions.api.plugins;
+
+import com.google.gerrit.extensions.common.PluginInfo;
+import com.google.gerrit.extensions.restapi.NotImplementedException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedMap;
+
+public interface Plugins {
+
+  ListRequest list() throws RestApiException;
+
+  PluginApi name(String name) throws RestApiException;
+
+  @Deprecated
+  PluginApi install(String name, com.google.gerrit.extensions.common.InstallPluginInput input)
+      throws RestApiException;
+
+  PluginApi install(String name, InstallPluginInput input) throws RestApiException;
+
+  abstract class ListRequest {
+    private boolean all;
+    private int limit;
+    private int start;
+    private String substring;
+    private String prefix;
+    private String regex;
+
+    public List<PluginInfo> get() throws RestApiException {
+      Map<String, PluginInfo> map = getAsMap();
+      List<PluginInfo> result = new ArrayList<>(map.size());
+      for (Map.Entry<String, PluginInfo> e : map.entrySet()) {
+        result.add(e.getValue());
+      }
+      return result;
+    }
+
+    public abstract SortedMap<String, PluginInfo> getAsMap() throws RestApiException;
+
+    public ListRequest all() {
+      this.all = true;
+      return this;
+    }
+
+    public boolean getAll() {
+      return all;
+    }
+
+    public ListRequest limit(int limit) {
+      this.limit = limit;
+      return this;
+    }
+
+    public int getLimit() {
+      return limit;
+    }
+
+    public ListRequest start(int start) {
+      this.start = start;
+      return this;
+    }
+
+    public int getStart() {
+      return start;
+    }
+
+    public ListRequest substring(String substring) {
+      this.substring = substring;
+      return this;
+    }
+
+    public String getSubstring() {
+      return substring;
+    }
+
+    public ListRequest prefix(String prefix) {
+      this.prefix = prefix;
+      return this;
+    }
+
+    public String getPrefix() {
+      return prefix;
+    }
+
+    public ListRequest regex(String regex) {
+      this.regex = regex;
+      return this;
+    }
+
+    public String getRegex() {
+      return regex;
+    }
+  }
+
+  /**
+   * A default implementation which allows source compatibility when adding new methods to the
+   * interface.
+   */
+  class NotImplemented implements Plugins {
+    @Override
+    public ListRequest list() {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public PluginApi name(String name) {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    @Deprecated
+    public PluginApi install(
+        String name, com.google.gerrit.extensions.common.InstallPluginInput input)
+        throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public PluginApi install(String name, InstallPluginInput input) {
+      throw new NotImplementedException();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/extensions/api/projects/BanCommitInput.java b/java/com/google/gerrit/extensions/api/projects/BanCommitInput.java
new file mode 100644
index 0000000..b0f674f
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/projects/BanCommitInput.java
@@ -0,0 +1,33 @@
+// Copyright (C) 2017 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.google.gerrit.extensions.api.projects;
+
+import com.google.common.collect.Lists;
+import java.util.List;
+
+public class BanCommitInput {
+  public List<String> commits;
+  public String reason;
+
+  public static BanCommitInput fromCommits(String firstCommit, String... moreCommits) {
+    return fromCommits(Lists.asList(firstCommit, moreCommits));
+  }
+
+  public static BanCommitInput fromCommits(List<String> commits) {
+    BanCommitInput in = new BanCommitInput();
+    in.commits = commits;
+    return in;
+  }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/BranchApi.java b/java/com/google/gerrit/extensions/api/projects/BranchApi.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/BranchApi.java
rename to java/com/google/gerrit/extensions/api/projects/BranchApi.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/BranchInfo.java b/java/com/google/gerrit/extensions/api/projects/BranchInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/BranchInfo.java
rename to java/com/google/gerrit/extensions/api/projects/BranchInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/BranchInput.java b/java/com/google/gerrit/extensions/api/projects/BranchInput.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/BranchInput.java
rename to java/com/google/gerrit/extensions/api/projects/BranchInput.java
diff --git a/java/com/google/gerrit/extensions/api/projects/CheckProjectInput.java b/java/com/google/gerrit/extensions/api/projects/CheckProjectInput.java
new file mode 100644
index 0000000..145b200
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/projects/CheckProjectInput.java
@@ -0,0 +1,33 @@
+// 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.
+
+package com.google.gerrit.extensions.api.projects;
+
+public class CheckProjectInput {
+  public AutoCloseableChangesCheckInput autoCloseableChangesCheck;
+
+  public static class AutoCloseableChangesCheckInput {
+    /** Whether auto-closeable changes should be fixed by setting their status to MERGED. */
+    public Boolean fix;
+
+    /** Branch that should be checked for auto-closeable changes. */
+    public String branch;
+
+    /** Number of commits to skip. */
+    public Integer skipCommits;
+
+    /** Maximum number of commits to walk. */
+    public Integer maxCommits;
+  }
+}
diff --git a/java/com/google/gerrit/extensions/api/projects/CheckProjectResultInfo.java b/java/com/google/gerrit/extensions/api/projects/CheckProjectResultInfo.java
new file mode 100644
index 0000000..e685122
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/projects/CheckProjectResultInfo.java
@@ -0,0 +1,26 @@
+// 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.
+
+package com.google.gerrit.extensions.api.projects;
+
+import com.google.gerrit.extensions.common.ChangeInfo;
+import java.util.List;
+
+public class CheckProjectResultInfo {
+  public AutoCloseableChangesCheckResult autoCloseableChangesCheckResult;
+
+  public static class AutoCloseableChangesCheckResult {
+    public List<ChangeInfo> autoCloseableChanges;
+  }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ChildProjectApi.java b/java/com/google/gerrit/extensions/api/projects/ChildProjectApi.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ChildProjectApi.java
rename to java/com/google/gerrit/extensions/api/projects/ChildProjectApi.java
diff --git a/java/com/google/gerrit/extensions/api/projects/CommentLinkInfo.java b/java/com/google/gerrit/extensions/api/projects/CommentLinkInfo.java
new file mode 100644
index 0000000..23849e4
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/projects/CommentLinkInfo.java
@@ -0,0 +1,58 @@
+// 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.
+
+package com.google.gerrit.extensions.api.projects;
+
+import com.google.common.base.MoreObjects;
+import java.util.Objects;
+
+public class CommentLinkInfo {
+  public String match;
+  public String link;
+  public String html;
+  public Boolean enabled; // null means true
+
+  public transient String name;
+
+  @Override
+  public boolean equals(Object o) {
+    if (o == this) {
+      return true;
+    }
+    if (o instanceof CommentLinkInfo) {
+      CommentLinkInfo that = (CommentLinkInfo) o;
+      return Objects.equals(this.match, that.match)
+          && Objects.equals(this.link, that.link)
+          && Objects.equals(this.html, that.html)
+          && Objects.equals(this.enabled, that.enabled);
+    }
+    return false;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(match, link, html, enabled);
+  }
+
+  @Override
+  public String toString() {
+    return MoreObjects.toStringHelper(this)
+        .add("name", name)
+        .add("match", match)
+        .add("link", link)
+        .add("html", html)
+        .add("enabled", enabled)
+        .toString();
+  }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/CommitApi.java b/java/com/google/gerrit/extensions/api/projects/CommitApi.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/CommitApi.java
rename to java/com/google/gerrit/extensions/api/projects/CommitApi.java
diff --git a/java/com/google/gerrit/extensions/api/projects/ConfigInfo.java b/java/com/google/gerrit/extensions/api/projects/ConfigInfo.java
new file mode 100644
index 0000000..08ba486
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/projects/ConfigInfo.java
@@ -0,0 +1,94 @@
+// 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.
+
+package com.google.gerrit.extensions.api.projects;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.extensions.client.ProjectState;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.extensions.common.ActionInfo;
+import java.util.List;
+import java.util.Map;
+
+public class ConfigInfo {
+  public String description;
+
+  public InheritedBooleanInfo useContributorAgreements;
+  public InheritedBooleanInfo useContentMerge;
+  public InheritedBooleanInfo useSignedOffBy;
+  public InheritedBooleanInfo createNewChangeForAllNotInTarget;
+  public InheritedBooleanInfo requireChangeId;
+  public InheritedBooleanInfo enableSignedPush;
+  public InheritedBooleanInfo requireSignedPush;
+  public InheritedBooleanInfo rejectImplicitMerges;
+  public InheritedBooleanInfo privateByDefault;
+  public InheritedBooleanInfo workInProgressByDefault;
+  public InheritedBooleanInfo enableReviewerByEmail;
+  public InheritedBooleanInfo matchAuthorToCommitterDate;
+  public InheritedBooleanInfo rejectEmptyCommit;
+
+  public MaxObjectSizeLimitInfo maxObjectSizeLimit;
+  @Deprecated // Equivalent to defaultSubmitType.value
+  public SubmitType submitType;
+  public SubmitTypeInfo defaultSubmitType;
+  public ProjectState state;
+  public Map<String, Map<String, ConfigParameterInfo>> pluginConfig;
+  public Map<String, ActionInfo> actions;
+
+  public Map<String, CommentLinkInfo> commentlinks;
+  public ThemeInfo theme;
+
+  public Map<String, List<String>> extensionPanelNames;
+
+  public static class InheritedBooleanInfo {
+    public Boolean value;
+    public InheritableBoolean configuredValue;
+    public Boolean inheritedValue;
+  }
+
+  public static class MaxObjectSizeLimitInfo {
+    /** The effective value in bytes. Null if not set. */
+    @Nullable public String value;
+
+    /** The value configured explicitly on the project as a formatted string. Null if not set. */
+    @Nullable public String configuredValue;
+
+    /**
+     * Whether the value was inherited or overridden from the project's parent hierarchy or global
+     * config. Null if not inherited or overridden.
+     */
+    @Nullable public String summary;
+  }
+
+  public static class ConfigParameterInfo {
+    public String displayName;
+    public String description;
+    public String warning;
+    public ProjectConfigEntryType type;
+    public String value;
+    public Boolean editable;
+    public Boolean inheritable;
+    public String configuredValue;
+    public String inheritedValue;
+    public List<String> permittedValues;
+    public List<String> values;
+  }
+
+  public static class SubmitTypeInfo {
+    public SubmitType value;
+    public SubmitType configuredValue;
+    public SubmitType inheritedValue;
+  }
+}
diff --git a/java/com/google/gerrit/extensions/api/projects/ConfigInput.java b/java/com/google/gerrit/extensions/api/projects/ConfigInput.java
new file mode 100644
index 0000000..1a6d77b
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/projects/ConfigInput.java
@@ -0,0 +1,41 @@
+// 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.
+
+package com.google.gerrit.extensions.api.projects;
+
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.extensions.client.ProjectState;
+import com.google.gerrit.extensions.client.SubmitType;
+import java.util.Map;
+
+public class ConfigInput {
+  public String description;
+  public InheritableBoolean useContributorAgreements;
+  public InheritableBoolean useContentMerge;
+  public InheritableBoolean useSignedOffBy;
+  public InheritableBoolean createNewChangeForAllNotInTarget;
+  public InheritableBoolean requireChangeId;
+  public InheritableBoolean enableSignedPush;
+  public InheritableBoolean requireSignedPush;
+  public InheritableBoolean rejectImplicitMerges;
+  public InheritableBoolean privateByDefault;
+  public InheritableBoolean workInProgressByDefault;
+  public InheritableBoolean enableReviewerByEmail;
+  public InheritableBoolean matchAuthorToCommitterDate;
+  public InheritableBoolean rejectEmptyCommit;
+  public String maxObjectSizeLimit;
+  public SubmitType submitType;
+  public ProjectState state;
+  public Map<String, Map<String, ConfigValue>> pluginConfigValues;
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ConfigValue.java b/java/com/google/gerrit/extensions/api/projects/ConfigValue.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ConfigValue.java
rename to java/com/google/gerrit/extensions/api/projects/ConfigValue.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/DashboardApi.java b/java/com/google/gerrit/extensions/api/projects/DashboardApi.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/DashboardApi.java
rename to java/com/google/gerrit/extensions/api/projects/DashboardApi.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/DashboardInfo.java b/java/com/google/gerrit/extensions/api/projects/DashboardInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/DashboardInfo.java
rename to java/com/google/gerrit/extensions/api/projects/DashboardInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/DashboardSectionInfo.java b/java/com/google/gerrit/extensions/api/projects/DashboardSectionInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/DashboardSectionInfo.java
rename to java/com/google/gerrit/extensions/api/projects/DashboardSectionInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/DeleteBranchesInput.java b/java/com/google/gerrit/extensions/api/projects/DeleteBranchesInput.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/DeleteBranchesInput.java
rename to java/com/google/gerrit/extensions/api/projects/DeleteBranchesInput.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/DeleteTagsInput.java b/java/com/google/gerrit/extensions/api/projects/DeleteTagsInput.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/DeleteTagsInput.java
rename to java/com/google/gerrit/extensions/api/projects/DeleteTagsInput.java
diff --git a/java/com/google/gerrit/extensions/api/projects/DescriptionInput.java b/java/com/google/gerrit/extensions/api/projects/DescriptionInput.java
new file mode 100644
index 0000000..672602d
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/projects/DescriptionInput.java
@@ -0,0 +1,19 @@
+// Copyright (C) 2015 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.google.gerrit.extensions.api.projects;
+
+public class DescriptionInput extends com.google.gerrit.extensions.common.DescriptionInput {
+  public String commitMessage;
+}
diff --git a/java/com/google/gerrit/extensions/api/projects/HeadInput.java b/java/com/google/gerrit/extensions/api/projects/HeadInput.java
new file mode 100644
index 0000000..606cf52
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/projects/HeadInput.java
@@ -0,0 +1,21 @@
+// Copyright (C) 2017 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.google.gerrit.extensions.api.projects;
+
+import com.google.gerrit.extensions.restapi.DefaultInput;
+
+public class HeadInput {
+  @DefaultInput public String ref;
+}
diff --git a/java/com/google/gerrit/extensions/api/projects/IndexProjectInput.java b/java/com/google/gerrit/extensions/api/projects/IndexProjectInput.java
new file mode 100644
index 0000000..1b962c1
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/projects/IndexProjectInput.java
@@ -0,0 +1,20 @@
+// 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.
+
+package com.google.gerrit.extensions.api.projects;
+
+public class IndexProjectInput {
+  public Boolean indexChildren;
+  public Boolean async;
+}
diff --git a/java/com/google/gerrit/extensions/api/projects/ParentInput.java b/java/com/google/gerrit/extensions/api/projects/ParentInput.java
new file mode 100644
index 0000000..6e481ae
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/projects/ParentInput.java
@@ -0,0 +1,22 @@
+// Copyright (C) 2017 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.google.gerrit.extensions.api.projects;
+
+import com.google.gerrit.extensions.restapi.DefaultInput;
+
+public class ParentInput {
+  @DefaultInput public String parent;
+  public String commitMessage;
+}
diff --git a/java/com/google/gerrit/extensions/api/projects/ProjectApi.java b/java/com/google/gerrit/extensions/api/projects/ProjectApi.java
new file mode 100644
index 0000000..3d70996
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/projects/ProjectApi.java
@@ -0,0 +1,374 @@
+// Copyright (C) 2013 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.google.gerrit.extensions.api.projects;
+
+import com.google.gerrit.extensions.api.access.ProjectAccessInfo;
+import com.google.gerrit.extensions.api.access.ProjectAccessInput;
+import com.google.gerrit.extensions.api.config.AccessCheckInfo;
+import com.google.gerrit.extensions.api.config.AccessCheckInput;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.extensions.restapi.NotImplementedException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import java.util.List;
+
+public interface ProjectApi {
+  ProjectApi create() throws RestApiException;
+
+  ProjectApi create(ProjectInput in) throws RestApiException;
+
+  ProjectInfo get() throws RestApiException;
+
+  String description() throws RestApiException;
+
+  void description(DescriptionInput in) throws RestApiException;
+
+  ProjectAccessInfo access() throws RestApiException;
+
+  ProjectAccessInfo access(ProjectAccessInput p) throws RestApiException;
+
+  ChangeInfo accessChange(ProjectAccessInput p) throws RestApiException;
+
+  AccessCheckInfo checkAccess(AccessCheckInput in) throws RestApiException;
+
+  CheckProjectResultInfo check(CheckProjectInput in) throws RestApiException;
+
+  ConfigInfo config() throws RestApiException;
+
+  ConfigInfo config(ConfigInput in) throws RestApiException;
+
+  ListRefsRequest<BranchInfo> branches();
+
+  ListRefsRequest<TagInfo> tags();
+
+  void deleteBranches(DeleteBranchesInput in) throws RestApiException;
+
+  void deleteTags(DeleteTagsInput in) throws RestApiException;
+
+  abstract class ListRefsRequest<T extends RefInfo> {
+    protected int limit;
+    protected int start;
+    protected String substring;
+    protected String regex;
+
+    public abstract List<T> get() throws RestApiException;
+
+    public ListRefsRequest<T> withLimit(int limit) {
+      this.limit = limit;
+      return this;
+    }
+
+    public ListRefsRequest<T> withStart(int start) {
+      this.start = start;
+      return this;
+    }
+
+    public ListRefsRequest<T> withSubstring(String substring) {
+      this.substring = substring;
+      return this;
+    }
+
+    public ListRefsRequest<T> withRegex(String regex) {
+      this.regex = regex;
+      return this;
+    }
+
+    public int getLimit() {
+      return limit;
+    }
+
+    public int getStart() {
+      return start;
+    }
+
+    public String getSubstring() {
+      return substring;
+    }
+
+    public String getRegex() {
+      return regex;
+    }
+  }
+
+  List<ProjectInfo> children() throws RestApiException;
+
+  List<ProjectInfo> children(boolean recursive) throws RestApiException;
+
+  List<ProjectInfo> children(int limit) throws RestApiException;
+
+  ChildProjectApi child(String name) throws RestApiException;
+
+  /**
+   * Look up a branch by refname.
+   *
+   * <p><strong>Note:</strong> This method eagerly reads the branch. Methods that mutate the branch
+   * do not necessarily re-read the branch. Therefore, calling a getter method on an instance after
+   * calling a mutation method on that same instance is not guaranteed to reflect the mutation. It
+   * is not recommended to store references to {@code BranchApi} instances.
+   *
+   * @param ref branch name, with or without "refs/heads/" prefix.
+   * @throws RestApiException if a problem occurred reading the project.
+   * @return API for accessing the branch.
+   */
+  BranchApi branch(String ref) throws RestApiException;
+
+  /**
+   * Look up a tag by refname.
+   *
+   * <p>
+   *
+   * @param ref tag name, with or without "refs/tags/" prefix.
+   * @throws RestApiException if a problem occurred reading the project.
+   * @return API for accessing the tag.
+   */
+  TagApi tag(String ref) throws RestApiException;
+
+  /**
+   * Lookup a commit by its {@code ObjectId} string.
+   *
+   * @param commit the {@code ObjectId} string.
+   * @return API for accessing the commit.
+   */
+  CommitApi commit(String commit) throws RestApiException;
+
+  /**
+   * Lookup a dashboard by its name.
+   *
+   * @param name the name.
+   * @return API for accessing the dashboard.
+   */
+  DashboardApi dashboard(String name) throws RestApiException;
+
+  /**
+   * Get the project's default dashboard.
+   *
+   * @return API for accessing the dashboard.
+   */
+  DashboardApi defaultDashboard() throws RestApiException;
+
+  /**
+   * Set the project's default dashboard.
+   *
+   * @param name the dashboard to set as default.
+   */
+  void defaultDashboard(String name) throws RestApiException;
+
+  /** Remove the project's default dashboard. */
+  void removeDefaultDashboard() throws RestApiException;
+
+  abstract class ListDashboardsRequest {
+    public abstract List<DashboardInfo> get() throws RestApiException;
+  }
+
+  ListDashboardsRequest dashboards() throws RestApiException;
+
+  /** Get the name of the branch to which {@code HEAD} points. */
+  String head() throws RestApiException;
+
+  /**
+   * Set the project's {@code HEAD}.
+   *
+   * @param head the HEAD
+   */
+  void head(String head) throws RestApiException;
+
+  /** Get the name of the project's parent. */
+  String parent() throws RestApiException;
+
+  /**
+   * Set the project's parent.
+   *
+   * @param parent the parent
+   */
+  void parent(String parent) throws RestApiException;
+
+  /**
+   * Reindex the project and children in case {@code indexChildren} is specified.
+   *
+   * @param indexChildren decides if children should be indexed recursively
+   */
+  void index(boolean indexChildren) throws RestApiException;
+
+  /**
+   * A default implementation which allows source compatibility when adding new methods to the
+   * interface.
+   */
+  class NotImplemented implements ProjectApi {
+    @Override
+    public ProjectApi create() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ProjectApi create(ProjectInput in) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ProjectInfo get() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public String description() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ProjectAccessInfo access() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ProjectAccessInfo access(ProjectAccessInput p) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ChangeInfo accessChange(ProjectAccessInput input) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public AccessCheckInfo checkAccess(AccessCheckInput in) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public CheckProjectResultInfo check(CheckProjectInput in) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ConfigInfo config() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ConfigInfo config(ConfigInput in) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void description(DescriptionInput in) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ListRefsRequest<BranchInfo> branches() {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ListRefsRequest<TagInfo> tags() {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public List<ProjectInfo> children() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public List<ProjectInfo> children(boolean recursive) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public List<ProjectInfo> children(int limit) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ChildProjectApi child(String name) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public BranchApi branch(String ref) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public TagApi tag(String ref) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void deleteBranches(DeleteBranchesInput in) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void deleteTags(DeleteTagsInput in) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public CommitApi commit(String commit) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public DashboardApi dashboard(String name) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public DashboardApi defaultDashboard() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ListDashboardsRequest dashboards() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void defaultDashboard(String name) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void removeDefaultDashboard() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public String head() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void head(String head) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public String parent() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void parent(String parent) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public void index(boolean indexChildren) throws RestApiException {
+      throw new NotImplementedException();
+    }
+  }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectConfigEntryType.java b/java/com/google/gerrit/extensions/api/projects/ProjectConfigEntryType.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectConfigEntryType.java
rename to java/com/google/gerrit/extensions/api/projects/ProjectConfigEntryType.java
diff --git a/java/com/google/gerrit/extensions/api/projects/ProjectInput.java b/java/com/google/gerrit/extensions/api/projects/ProjectInput.java
new file mode 100644
index 0000000..e61d316
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/projects/ProjectInput.java
@@ -0,0 +1,41 @@
+// Copyright (C) 2014 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.google.gerrit.extensions.api.projects;
+
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.extensions.client.SubmitType;
+import java.util.List;
+import java.util.Map;
+
+public class ProjectInput {
+  public String name;
+  public String parent;
+  public String description;
+  public boolean permissionsOnly;
+  public boolean createEmptyCommit;
+  public SubmitType submitType;
+  public List<String> branches;
+  public List<String> owners;
+  public InheritableBoolean useContributorAgreements;
+  public InheritableBoolean useSignedOffBy;
+  public InheritableBoolean useContentMerge;
+  public InheritableBoolean requireChangeId;
+  public InheritableBoolean createNewChangeForAllNotInTarget;
+  public InheritableBoolean rejectEmptyCommit;
+  public InheritableBoolean enableSignedPush;
+  public InheritableBoolean requireSignedPush;
+  public String maxObjectSizeLimit;
+  public Map<String, Map<String, ConfigValue>> pluginConfigValues;
+}
diff --git a/java/com/google/gerrit/extensions/api/projects/Projects.java b/java/com/google/gerrit/extensions/api/projects/Projects.java
new file mode 100644
index 0000000..85ec26f
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/projects/Projects.java
@@ -0,0 +1,298 @@
+// Copyright (C) 2013 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.google.gerrit.extensions.api.projects;
+
+import com.google.gerrit.extensions.client.ProjectState;
+import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.extensions.restapi.NotImplementedException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedMap;
+
+public interface Projects {
+  /**
+   * Look up a project by name.
+   *
+   * <p><strong>Note:</strong> This method eagerly reads the project. Methods that mutate the
+   * project do not necessarily re-read the project. Therefore, calling a getter method on an
+   * instance after calling a mutation method on that same instance is not guaranteed to reflect the
+   * mutation. It is not recommended to store references to {@code ProjectApi} instances.
+   *
+   * @param name project name.
+   * @return API for accessing the project.
+   * @throws RestApiException if an error occurred.
+   */
+  ProjectApi name(String name) throws RestApiException;
+
+  /**
+   * Create a project using the default configuration.
+   *
+   * @param name project name.
+   * @return API for accessing the newly-created project.
+   * @throws RestApiException if an error occurred.
+   */
+  ProjectApi create(String name) throws RestApiException;
+
+  /**
+   * Create a project.
+   *
+   * @param in project creation input; name must be set.
+   * @return API for accessing the newly-created project.
+   * @throws RestApiException if an error occurred.
+   */
+  ProjectApi create(ProjectInput in) throws RestApiException;
+
+  ListRequest list();
+
+  /**
+   * Query projects.
+   *
+   * <p>Example code: {@code query().withQuery("name:project").get()}
+   *
+   * @return API for setting parameters and getting result.
+   */
+  QueryRequest query();
+
+  /**
+   * Query projects.
+   *
+   * <p>Shortcut API for {@code query().withQuery(String)}.
+   *
+   * @see #query()
+   */
+  QueryRequest query(String query);
+
+  abstract class ListRequest {
+    public enum FilterType {
+      CODE,
+      PARENT_CANDIDATES,
+      PERMISSIONS,
+      ALL
+    }
+
+    private final List<String> branches = new ArrayList<>();
+    private boolean description;
+    private String prefix;
+    private String substring;
+    private String regex;
+    private int limit;
+    private int start;
+    private boolean showTree;
+    private boolean all;
+    private FilterType type = FilterType.ALL;
+    private ProjectState state = null;
+
+    public List<ProjectInfo> get() throws RestApiException {
+      Map<String, ProjectInfo> map = getAsMap();
+      List<ProjectInfo> result = new ArrayList<>(map.size());
+      for (Map.Entry<String, ProjectInfo> e : map.entrySet()) {
+        // ListProjects "helpfully" nulls out names when converting to a map.
+        e.getValue().name = e.getKey();
+        result.add(e.getValue());
+      }
+      return Collections.unmodifiableList(result);
+    }
+
+    public abstract SortedMap<String, ProjectInfo> getAsMap() throws RestApiException;
+
+    public ListRequest withDescription(boolean description) {
+      this.description = description;
+      return this;
+    }
+
+    public ListRequest withPrefix(String prefix) {
+      this.prefix = prefix;
+      return this;
+    }
+
+    public ListRequest withSubstring(String substring) {
+      this.substring = substring;
+      return this;
+    }
+
+    public ListRequest withRegex(String regex) {
+      this.regex = regex;
+      return this;
+    }
+
+    public ListRequest withLimit(int limit) {
+      this.limit = limit;
+      return this;
+    }
+
+    public ListRequest withStart(int start) {
+      this.start = start;
+      return this;
+    }
+
+    public ListRequest addShowBranch(String branch) {
+      branches.add(branch);
+      return this;
+    }
+
+    public ListRequest withTree(boolean show) {
+      showTree = show;
+      return this;
+    }
+
+    public ListRequest withType(FilterType type) {
+      this.type = type != null ? type : FilterType.ALL;
+      return this;
+    }
+
+    public ListRequest withAll(boolean all) {
+      this.all = all;
+      return this;
+    }
+
+    public ListRequest withState(ProjectState state) {
+      this.state = state;
+      return this;
+    }
+
+    public boolean getDescription() {
+      return description;
+    }
+
+    public String getPrefix() {
+      return prefix;
+    }
+
+    public String getSubstring() {
+      return substring;
+    }
+
+    public String getRegex() {
+      return regex;
+    }
+
+    public int getLimit() {
+      return limit;
+    }
+
+    public int getStart() {
+      return start;
+    }
+
+    public List<String> getBranches() {
+      return Collections.unmodifiableList(branches);
+    }
+
+    public boolean getShowTree() {
+      return showTree;
+    }
+
+    public FilterType getFilterType() {
+      return type;
+    }
+
+    public boolean isAll() {
+      return all;
+    }
+
+    public ProjectState getState() {
+      return state;
+    }
+  }
+
+  /**
+   * API for setting parameters and getting result. Used for {@code query()}.
+   *
+   * @see #query()
+   */
+  abstract class QueryRequest {
+    private String query;
+    private int limit;
+    private int start;
+
+    /** Execute query and returns the matched projects as list. */
+    public abstract List<ProjectInfo> get() throws RestApiException;
+
+    /**
+     * Set query.
+     *
+     * @param query needs to be in human-readable form.
+     */
+    public QueryRequest withQuery(String query) {
+      this.query = query;
+      return this;
+    }
+
+    /**
+     * Set limit for returned list of projects. Optional; server-default is used when not provided.
+     */
+    public QueryRequest withLimit(int limit) {
+      this.limit = limit;
+      return this;
+    }
+
+    /** Set number of projects to skip. Optional; no projects are skipped when not provided. */
+    public QueryRequest withStart(int start) {
+      this.start = start;
+      return this;
+    }
+
+    public String getQuery() {
+      return query;
+    }
+
+    public int getLimit() {
+      return limit;
+    }
+
+    public int getStart() {
+      return start;
+    }
+  }
+
+  /**
+   * A default implementation which allows source compatibility when adding new methods to the
+   * interface.
+   */
+  class NotImplemented implements Projects {
+    @Override
+    public ProjectApi name(String name) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ProjectApi create(ProjectInput in) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ProjectApi create(String name) throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public ListRequest list() {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public QueryRequest query() {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public QueryRequest query(String query) {
+      throw new NotImplementedException();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/extensions/api/projects/RefInfo.java b/java/com/google/gerrit/extensions/api/projects/RefInfo.java
new file mode 100644
index 0000000..dde6e4b
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/projects/RefInfo.java
@@ -0,0 +1,32 @@
+// Copyright (C) 2015 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.google.gerrit.extensions.api.projects;
+
+import com.google.common.base.MoreObjects;
+
+public class RefInfo {
+  public String ref;
+  public String revision;
+  public Boolean canDelete;
+
+  @Override
+  public String toString() {
+    return MoreObjects.toStringHelper(this)
+        .add("ref", ref)
+        .add("revision", revision)
+        .add("canDelete", canDelete)
+        .toString();
+  }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ReflogEntryInfo.java b/java/com/google/gerrit/extensions/api/projects/ReflogEntryInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ReflogEntryInfo.java
rename to java/com/google/gerrit/extensions/api/projects/ReflogEntryInfo.java
diff --git a/java/com/google/gerrit/extensions/api/projects/SetDashboardInput.java b/java/com/google/gerrit/extensions/api/projects/SetDashboardInput.java
new file mode 100644
index 0000000..0083c0e
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/projects/SetDashboardInput.java
@@ -0,0 +1,22 @@
+// Copyright (C) 2017 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.google.gerrit.extensions.api.projects;
+
+import com.google.gerrit.extensions.restapi.DefaultInput;
+
+public class SetDashboardInput {
+  @DefaultInput public String id;
+  public String commitMessage;
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/TagApi.java b/java/com/google/gerrit/extensions/api/projects/TagApi.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/TagApi.java
rename to java/com/google/gerrit/extensions/api/projects/TagApi.java
diff --git a/java/com/google/gerrit/extensions/api/projects/TagInfo.java b/java/com/google/gerrit/extensions/api/projects/TagInfo.java
new file mode 100644
index 0000000..a6269fe
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/projects/TagInfo.java
@@ -0,0 +1,76 @@
+// Copyright (C) 2014 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.google.gerrit.extensions.api.projects;
+
+import com.google.gerrit.extensions.common.GitPerson;
+import com.google.gerrit.extensions.common.WebLinkInfo;
+import java.sql.Timestamp;
+import java.util.List;
+
+public class TagInfo extends RefInfo {
+  public String object;
+  public String message;
+  public GitPerson tagger;
+  public Timestamp created;
+  public List<WebLinkInfo> webLinks;
+
+  public TagInfo(
+      String ref,
+      String revision,
+      Boolean canDelete,
+      List<WebLinkInfo> webLinks,
+      Timestamp created) {
+    this.ref = ref;
+    this.revision = revision;
+    this.canDelete = canDelete;
+    this.webLinks = webLinks;
+    this.created = created;
+  }
+
+  public TagInfo(String ref, String revision, Boolean canDelete, List<WebLinkInfo> webLinks) {
+    this(ref, revision, canDelete, webLinks, null);
+  }
+
+  public TagInfo(
+      String ref,
+      String revision,
+      String object,
+      String message,
+      GitPerson tagger,
+      Boolean canDelete,
+      List<WebLinkInfo> webLinks,
+      Timestamp created) {
+    this(ref, revision, canDelete, webLinks, created);
+    this.object = object;
+    this.message = message;
+    this.tagger = tagger;
+    this.webLinks = webLinks;
+  }
+
+  public TagInfo(
+      String ref,
+      String revision,
+      String object,
+      String message,
+      GitPerson tagger,
+      Boolean canDelete,
+      List<WebLinkInfo> webLinks) {
+    this(ref, revision, object, message, tagger, canDelete, webLinks, null);
+    this.object = object;
+    this.message = message;
+    this.tagger = tagger;
+    this.webLinks = webLinks;
+  }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/TagInput.java b/java/com/google/gerrit/extensions/api/projects/TagInput.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/TagInput.java
rename to java/com/google/gerrit/extensions/api/projects/TagInput.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ThemeInfo.java b/java/com/google/gerrit/extensions/api/projects/ThemeInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ThemeInfo.java
rename to java/com/google/gerrit/extensions/api/projects/ThemeInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/auth/oauth/OAuthLoginProvider.java b/java/com/google/gerrit/extensions/auth/oauth/OAuthLoginProvider.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/auth/oauth/OAuthLoginProvider.java
rename to java/com/google/gerrit/extensions/auth/oauth/OAuthLoginProvider.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/auth/oauth/OAuthServiceProvider.java b/java/com/google/gerrit/extensions/auth/oauth/OAuthServiceProvider.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/auth/oauth/OAuthServiceProvider.java
rename to java/com/google/gerrit/extensions/auth/oauth/OAuthServiceProvider.java
diff --git a/java/com/google/gerrit/extensions/auth/oauth/OAuthToken.java b/java/com/google/gerrit/extensions/auth/oauth/OAuthToken.java
new file mode 100644
index 0000000..8d5e744
--- /dev/null
+++ b/java/com/google/gerrit/extensions/auth/oauth/OAuthToken.java
@@ -0,0 +1,118 @@
+// Copyright (C) 2015 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.google.gerrit.extensions.auth.oauth;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
+import com.google.gerrit.common.Nullable;
+import java.io.Serializable;
+import java.util.Objects;
+
+/**
+ * OAuth token.
+ *
+ * <p>Only implements {@link Serializable} for backwards compatibility; new extensions should not
+ * depend on the serialized format.
+ */
+public class OAuthToken implements Serializable {
+
+  private static final long serialVersionUID = 1L;
+
+  private final String token;
+  private final String secret;
+  private final String raw;
+
+  /**
+   * Time of expiration of this token, or {@code Long#MAX_VALUE} if this token never expires, or
+   * time of expiration is unknown.
+   */
+  private final long expiresAt;
+
+  /**
+   * The identifier of the OAuth provider that issued this token in the form {@code
+   * "plugin-name:provider-name"}, or {@code null}. The empty string {@code ""} is treated the same
+   * as {@code null}.
+   */
+  private final String providerId;
+
+  public OAuthToken(String token, String secret, String raw) {
+    this(token, secret, raw, Long.MAX_VALUE, null);
+  }
+
+  public OAuthToken(
+      String token, String secret, String raw, long expiresAt, @Nullable String providerId) {
+    this.token = requireNonNull(token, "token");
+    this.secret = requireNonNull(secret, "secret");
+    this.raw = requireNonNull(raw, "raw");
+    this.expiresAt = expiresAt;
+    this.providerId = Strings.emptyToNull(providerId);
+  }
+
+  public String getToken() {
+    return token;
+  }
+
+  public String getSecret() {
+    return secret;
+  }
+
+  public String getRaw() {
+    return raw;
+  }
+
+  public long getExpiresAt() {
+    return expiresAt;
+  }
+
+  public boolean isExpired() {
+    return System.currentTimeMillis() > expiresAt;
+  }
+
+  @Nullable
+  public String getProviderId() {
+    return providerId;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (!(o instanceof OAuthToken)) {
+      return false;
+    }
+    OAuthToken t = (OAuthToken) o;
+    return token.equals(t.token)
+        && secret.equals(t.secret)
+        && raw.equals(t.raw)
+        && expiresAt == t.expiresAt
+        && Objects.equals(providerId, t.providerId);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(token, secret, raw, expiresAt, providerId);
+  }
+
+  @Override
+  public String toString() {
+    return MoreObjects.toStringHelper(this)
+        .add("token", token)
+        .add("secret", secret)
+        .add("raw", raw)
+        .add("expiresAt", expiresAt)
+        .add("providerId", providerId)
+        .toString();
+  }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/auth/oauth/OAuthTokenEncrypter.java b/java/com/google/gerrit/extensions/auth/oauth/OAuthTokenEncrypter.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/auth/oauth/OAuthTokenEncrypter.java
rename to java/com/google/gerrit/extensions/auth/oauth/OAuthTokenEncrypter.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/auth/oauth/OAuthUserInfo.java b/java/com/google/gerrit/extensions/auth/oauth/OAuthUserInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/auth/oauth/OAuthUserInfo.java
rename to java/com/google/gerrit/extensions/auth/oauth/OAuthUserInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/auth/oauth/OAuthVerifier.java b/java/com/google/gerrit/extensions/auth/oauth/OAuthVerifier.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/auth/oauth/OAuthVerifier.java
rename to java/com/google/gerrit/extensions/auth/oauth/OAuthVerifier.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/AccountFieldName.java b/java/com/google/gerrit/extensions/client/AccountFieldName.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/AccountFieldName.java
rename to java/com/google/gerrit/extensions/client/AccountFieldName.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/AuthType.java b/java/com/google/gerrit/extensions/client/AuthType.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/AuthType.java
rename to java/com/google/gerrit/extensions/client/AuthType.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/ChangeEditDetailOption.java b/java/com/google/gerrit/extensions/client/ChangeEditDetailOption.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/ChangeEditDetailOption.java
rename to java/com/google/gerrit/extensions/client/ChangeEditDetailOption.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/ChangeKind.java b/java/com/google/gerrit/extensions/client/ChangeKind.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/ChangeKind.java
rename to java/com/google/gerrit/extensions/client/ChangeKind.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/ChangeStatus.java b/java/com/google/gerrit/extensions/client/ChangeStatus.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/ChangeStatus.java
rename to java/com/google/gerrit/extensions/client/ChangeStatus.java
diff --git a/java/com/google/gerrit/extensions/client/Comment.java b/java/com/google/gerrit/extensions/client/Comment.java
new file mode 100644
index 0000000..3bca4bb
--- /dev/null
+++ b/java/com/google/gerrit/extensions/client/Comment.java
@@ -0,0 +1,132 @@
+// Copyright (C) 2014 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.google.gerrit.extensions.client;
+
+import java.sql.Timestamp;
+import java.util.Comparator;
+import java.util.Objects;
+
+public abstract class Comment {
+  /**
+   * Patch set number containing this commit.
+   *
+   * <p>Only set in contexts where comments may come from multiple patch sets.
+   */
+  public Integer patchSet;
+
+  public String id;
+  public String path;
+  public Side side;
+  public Integer parent;
+  public Integer line; // value 0 or null indicates a file comment, normal lines start at 1
+  public Range range;
+  public String inReplyTo;
+  public Timestamp updated;
+  public String message;
+  public Boolean unresolved;
+
+  public static class Range implements Comparable<Range> {
+    private static final Comparator<Range> RANGE_COMPARATOR =
+        Comparator.<Range>comparingInt(range -> range.startLine)
+            .thenComparingInt(range -> range.startCharacter)
+            .thenComparingInt(range -> range.endLine)
+            .thenComparingInt(range -> range.endCharacter);
+
+    // Start position is inclusive; end position is exclusive.
+    public int startLine; // 1-based
+    public int startCharacter; // 0-based
+    public int endLine; // 1-based
+    public int endCharacter; // 0-based
+
+    public boolean isValid() {
+      return startLine > 0
+          && startCharacter >= 0
+          && endLine > 0
+          && endCharacter >= 0
+          && startLine <= endLine
+          && (startLine != endLine || startCharacter <= endCharacter);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+      if (o instanceof Range) {
+        Range r = (Range) o;
+        return Objects.equals(startLine, r.startLine)
+            && Objects.equals(startCharacter, r.startCharacter)
+            && Objects.equals(endLine, r.endLine)
+            && Objects.equals(endCharacter, r.endCharacter);
+      }
+      return false;
+    }
+
+    @Override
+    public int hashCode() {
+      return Objects.hash(startLine, startCharacter, endLine, endCharacter);
+    }
+
+    @Override
+    public String toString() {
+      return "Range{"
+          + "startLine="
+          + startLine
+          + ", startCharacter="
+          + startCharacter
+          + ", endLine="
+          + endLine
+          + ", endCharacter="
+          + endCharacter
+          + '}';
+    }
+
+    @Override
+    public int compareTo(Range otherRange) {
+      return RANGE_COMPARATOR.compare(this, otherRange);
+    }
+  }
+
+  public short side() {
+    if (side == Side.PARENT) {
+      return (short) (parent == null ? 0 : -parent.shortValue());
+    }
+    return 1;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o != null && getClass() == o.getClass()) {
+      Comment c = (Comment) o;
+      return Objects.equals(patchSet, c.patchSet)
+          && Objects.equals(id, c.id)
+          && Objects.equals(path, c.path)
+          && Objects.equals(side, c.side)
+          && Objects.equals(parent, c.parent)
+          && Objects.equals(line, c.line)
+          && Objects.equals(range, c.range)
+          && Objects.equals(inReplyTo, c.inReplyTo)
+          && Objects.equals(updated, c.updated)
+          && Objects.equals(message, c.message)
+          && Objects.equals(unresolved, c.unresolved);
+    }
+    return false;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(patchSet, id, path, side, parent, line, range, inReplyTo, updated, message);
+  }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/DiffPreferencesInfo.java b/java/com/google/gerrit/extensions/client/DiffPreferencesInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/DiffPreferencesInfo.java
rename to java/com/google/gerrit/extensions/client/DiffPreferencesInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/EditPreferencesInfo.java b/java/com/google/gerrit/extensions/client/EditPreferencesInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/EditPreferencesInfo.java
rename to java/com/google/gerrit/extensions/client/EditPreferencesInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/GeneralPreferencesInfo.java b/java/com/google/gerrit/extensions/client/GeneralPreferencesInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/GeneralPreferencesInfo.java
rename to java/com/google/gerrit/extensions/client/GeneralPreferencesInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/GerritTopMenu.java b/java/com/google/gerrit/extensions/client/GerritTopMenu.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/GerritTopMenu.java
rename to java/com/google/gerrit/extensions/client/GerritTopMenu.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/GitBasicAuthPolicy.java b/java/com/google/gerrit/extensions/client/GitBasicAuthPolicy.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/GitBasicAuthPolicy.java
rename to java/com/google/gerrit/extensions/client/GitBasicAuthPolicy.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/InheritableBoolean.java b/java/com/google/gerrit/extensions/client/InheritableBoolean.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/InheritableBoolean.java
rename to java/com/google/gerrit/extensions/client/InheritableBoolean.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/KeyMapType.java b/java/com/google/gerrit/extensions/client/KeyMapType.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/KeyMapType.java
rename to java/com/google/gerrit/extensions/client/KeyMapType.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/ListAccountsOption.java b/java/com/google/gerrit/extensions/client/ListAccountsOption.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/ListAccountsOption.java
rename to java/com/google/gerrit/extensions/client/ListAccountsOption.java
diff --git a/java/com/google/gerrit/extensions/client/ListChangesOption.java b/java/com/google/gerrit/extensions/client/ListChangesOption.java
new file mode 100644
index 0000000..5e4a3a7
--- /dev/null
+++ b/java/com/google/gerrit/extensions/client/ListChangesOption.java
@@ -0,0 +1,117 @@
+// Copyright (C) 2012 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.google.gerrit.extensions.client;
+
+import java.util.EnumSet;
+import java.util.Set;
+
+/** Output options available for retrieval of change details. */
+public enum ListChangesOption {
+  LABELS(0),
+  DETAILED_LABELS(8),
+
+  /** Return information on the current patch set of the change. */
+  CURRENT_REVISION(1),
+  ALL_REVISIONS(2),
+
+  /** If revisions are included, parse the commit object. */
+  CURRENT_COMMIT(3),
+  ALL_COMMITS(4),
+
+  /** If a patch set is included, include the files of the patch set. */
+  CURRENT_FILES(5),
+  ALL_FILES(6),
+
+  /** If accounts are included, include detailed account info. */
+  DETAILED_ACCOUNTS(7),
+
+  /** Include messages associated with the change. */
+  MESSAGES(9),
+
+  /** Include allowed actions client could perform. */
+  CURRENT_ACTIONS(10),
+
+  /** Set the reviewed boolean for the caller. */
+  REVIEWED(11),
+
+  /** Not used anymore, kept for backward compatibility */
+  @Deprecated
+  DRAFT_COMMENTS(12),
+
+  /** Include download commands for the caller. */
+  DOWNLOAD_COMMANDS(13),
+
+  /** Include patch set weblinks. */
+  WEB_LINKS(14),
+
+  /** Include consistency check results. */
+  CHECK(15),
+
+  /** Include allowed change actions client could perform. */
+  CHANGE_ACTIONS(16),
+
+  /** Include a copy of commit messages including review footers. */
+  COMMIT_FOOTERS(17),
+
+  /** Include push certificate information along with any patch sets. */
+  PUSH_CERTIFICATES(18),
+
+  /** Include change's reviewer updates. */
+  REVIEWER_UPDATES(19),
+
+  /** Set the submittable boolean. */
+  SUBMITTABLE(20),
+
+  /** If tracking Ids are included, include detailed tracking Ids info. */
+  TRACKING_IDS(21),
+
+  /** Skip mergeability data */
+  SKIP_MERGEABLE(22);
+
+  private final int value;
+
+  ListChangesOption(int v) {
+    this.value = v;
+  }
+
+  public int getValue() {
+    return value;
+  }
+
+  public static EnumSet<ListChangesOption> fromBits(int v) {
+    EnumSet<ListChangesOption> r = EnumSet.noneOf(ListChangesOption.class);
+    for (ListChangesOption o : ListChangesOption.values()) {
+      if ((v & (1 << o.value)) != 0) {
+        r.add(o);
+        v &= ~(1 << o.value);
+      }
+      if (v == 0) {
+        return r;
+      }
+    }
+    if (v != 0) {
+      throw new IllegalArgumentException("unknown " + Integer.toHexString(v));
+    }
+    return r;
+  }
+
+  public static int toBits(Set<ListChangesOption> set) {
+    int r = 0;
+    for (ListChangesOption o : set) {
+      r |= 1 << o.value;
+    }
+    return r;
+  }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/ListGroupsOption.java b/java/com/google/gerrit/extensions/client/ListGroupsOption.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/ListGroupsOption.java
rename to java/com/google/gerrit/extensions/client/ListGroupsOption.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/MenuItem.java b/java/com/google/gerrit/extensions/client/MenuItem.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/MenuItem.java
rename to java/com/google/gerrit/extensions/client/MenuItem.java
diff --git a/java/com/google/gerrit/extensions/client/ProjectState.java b/java/com/google/gerrit/extensions/client/ProjectState.java
new file mode 100644
index 0000000..4aee69c
--- /dev/null
+++ b/java/com/google/gerrit/extensions/client/ProjectState.java
@@ -0,0 +1,43 @@
+// Copyright (C) 2014 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.google.gerrit.extensions.client;
+
+public enum ProjectState {
+  /** Permits reading project state and contents as well as mutating data. */
+  ACTIVE(true, true),
+  /** Permits reading project state and contents. Does not permit any modifications. */
+  READ_ONLY(true, false),
+  /**
+   * Hides the project as if it was deleted, but makes requests fail with an error message that
+   * reveals the project's existence.
+   */
+  HIDDEN(false, false);
+
+  private final boolean permitsRead;
+  private final boolean permitsWrite;
+
+  ProjectState(boolean permitsRead, boolean permitsWrite) {
+    this.permitsRead = permitsRead;
+    this.permitsWrite = permitsWrite;
+  }
+
+  public boolean permitsRead() {
+    return permitsRead;
+  }
+
+  public boolean permitsWrite() {
+    return permitsWrite;
+  }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/ProjectWatchInfo.java b/java/com/google/gerrit/extensions/client/ProjectWatchInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/ProjectWatchInfo.java
rename to java/com/google/gerrit/extensions/client/ProjectWatchInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/ReviewerState.java b/java/com/google/gerrit/extensions/client/ReviewerState.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/ReviewerState.java
rename to java/com/google/gerrit/extensions/client/ReviewerState.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/Side.java b/java/com/google/gerrit/extensions/client/Side.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/Side.java
rename to java/com/google/gerrit/extensions/client/Side.java
diff --git a/java/com/google/gerrit/extensions/client/SubmitType.java b/java/com/google/gerrit/extensions/client/SubmitType.java
new file mode 100644
index 0000000..0e2f362
--- /dev/null
+++ b/java/com/google/gerrit/extensions/client/SubmitType.java
@@ -0,0 +1,25 @@
+// Copyright (C) 2014 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.google.gerrit.extensions.client;
+
+public enum SubmitType {
+  INHERIT,
+  FAST_FORWARD_ONLY,
+  MERGE_IF_NECESSARY,
+  REBASE_IF_NECESSARY,
+  REBASE_ALWAYS,
+  MERGE_ALWAYS,
+  CHERRY_PICK;
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/Theme.java b/java/com/google/gerrit/extensions/client/Theme.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/Theme.java
rename to java/com/google/gerrit/extensions/client/Theme.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/UiType.java b/java/com/google/gerrit/extensions/client/UiType.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/UiType.java
rename to java/com/google/gerrit/extensions/client/UiType.java
diff --git a/java/com/google/gerrit/extensions/common/AccountDetailInfo.java b/java/com/google/gerrit/extensions/common/AccountDetailInfo.java
new file mode 100644
index 0000000..a498ab0
--- /dev/null
+++ b/java/com/google/gerrit/extensions/common/AccountDetailInfo.java
@@ -0,0 +1,26 @@
+// 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.
+
+package com.google.gerrit.extensions.common;
+
+import java.sql.Timestamp;
+
+public class AccountDetailInfo extends AccountInfo {
+  public Timestamp registeredOn;
+  public Boolean inactive;
+
+  public AccountDetailInfo(Integer id) {
+    super(id);
+  }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AccountExternalIdInfo.java b/java/com/google/gerrit/extensions/common/AccountExternalIdInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AccountExternalIdInfo.java
rename to java/com/google/gerrit/extensions/common/AccountExternalIdInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AccountInfo.java b/java/com/google/gerrit/extensions/common/AccountInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AccountInfo.java
rename to java/com/google/gerrit/extensions/common/AccountInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AccountVisibility.java b/java/com/google/gerrit/extensions/common/AccountVisibility.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AccountVisibility.java
rename to java/com/google/gerrit/extensions/common/AccountVisibility.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AccountsInfo.java b/java/com/google/gerrit/extensions/common/AccountsInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AccountsInfo.java
rename to java/com/google/gerrit/extensions/common/AccountsInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ActionInfo.java b/java/com/google/gerrit/extensions/common/ActionInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ActionInfo.java
rename to java/com/google/gerrit/extensions/common/ActionInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AgreementInfo.java b/java/com/google/gerrit/extensions/common/AgreementInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AgreementInfo.java
rename to java/com/google/gerrit/extensions/common/AgreementInfo.java
diff --git a/java/com/google/gerrit/extensions/common/ApprovalInfo.java b/java/com/google/gerrit/extensions/common/ApprovalInfo.java
new file mode 100644
index 0000000..e40004b
--- /dev/null
+++ b/java/com/google/gerrit/extensions/common/ApprovalInfo.java
@@ -0,0 +1,43 @@
+// Copyright (C) 2014 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.google.gerrit.extensions.common;
+
+import com.google.gerrit.common.Nullable;
+import java.sql.Timestamp;
+
+public class ApprovalInfo extends AccountInfo {
+  public String tag;
+  public Integer value;
+  public Timestamp date;
+  public Boolean postSubmit;
+  public VotingRangeInfo permittedVotingRange;
+
+  public ApprovalInfo(Integer id) {
+    super(id);
+  }
+
+  public ApprovalInfo(
+      Integer id,
+      Integer value,
+      @Nullable VotingRangeInfo permittedVotingRange,
+      @Nullable String tag,
+      Timestamp date) {
+    super(id);
+    this.value = value;
+    this.permittedVotingRange = permittedVotingRange;
+    this.date = date;
+    this.tag = tag;
+  }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AuthInfo.java b/java/com/google/gerrit/extensions/common/AuthInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AuthInfo.java
rename to java/com/google/gerrit/extensions/common/AuthInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AvatarInfo.java b/java/com/google/gerrit/extensions/common/AvatarInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AvatarInfo.java
rename to java/com/google/gerrit/extensions/common/AvatarInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/BlameInfo.java b/java/com/google/gerrit/extensions/common/BlameInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/BlameInfo.java
rename to java/com/google/gerrit/extensions/common/BlameInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeConfigInfo.java b/java/com/google/gerrit/extensions/common/ChangeConfigInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeConfigInfo.java
rename to java/com/google/gerrit/extensions/common/ChangeConfigInfo.java
diff --git a/java/com/google/gerrit/extensions/common/ChangeInfo.java b/java/com/google/gerrit/extensions/common/ChangeInfo.java
new file mode 100644
index 0000000..945c239
--- /dev/null
+++ b/java/com/google/gerrit/extensions/common/ChangeInfo.java
@@ -0,0 +1,76 @@
+// Copyright (C) 2014 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.google.gerrit.extensions.common;
+
+import com.google.gerrit.extensions.client.ChangeStatus;
+import com.google.gerrit.extensions.client.ReviewerState;
+import com.google.gerrit.extensions.client.SubmitType;
+import java.sql.Timestamp;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+public class ChangeInfo {
+  // ActionJson#copy(List, ChangeInfo) must be adapted if new fields are added that are not
+  // protected by any ListChangesOption.
+  public String id;
+  public String project;
+  public String branch;
+  public String topic;
+  public AccountInfo assignee;
+  public Collection<String> hashtags;
+  public String changeId;
+  public String subject;
+  public ChangeStatus status;
+  public Timestamp created;
+  public Timestamp updated;
+  public Timestamp submitted;
+  public AccountInfo submitter;
+  public Boolean starred;
+  public Collection<String> stars;
+  public Boolean reviewed;
+  public SubmitType submitType;
+  public Boolean mergeable;
+  public Boolean submittable;
+  public Integer insertions;
+  public Integer deletions;
+  public Integer unresolvedCommentCount;
+  public Boolean isPrivate;
+  public Boolean workInProgress;
+  public Boolean hasReviewStarted;
+  public Integer revertOf;
+
+  public int _number;
+
+  public AccountInfo owner;
+
+  public Map<String, ActionInfo> actions;
+  public Map<String, LabelInfo> labels;
+  public Map<String, Collection<String>> permittedLabels;
+  public Collection<AccountInfo> removableReviewers;
+  public Map<ReviewerState, Collection<AccountInfo>> reviewers;
+  public Map<ReviewerState, Collection<AccountInfo>> pendingReviewers;
+  public Collection<ReviewerUpdateInfo> reviewerUpdates;
+  public Collection<ChangeMessageInfo> messages;
+
+  public String currentRevision;
+  public Map<String, RevisionInfo> revisions;
+  public Boolean _moreChanges;
+
+  public List<ProblemInfo> problems;
+  public List<PluginDefinedInfo> plugins;
+  public Collection<TrackingIdInfo> trackingIds;
+  public Collection<SubmitRequirementInfo> requirements;
+}
diff --git a/java/com/google/gerrit/extensions/common/ChangeInput.java b/java/com/google/gerrit/extensions/common/ChangeInput.java
new file mode 100644
index 0000000..36dd8f2
--- /dev/null
+++ b/java/com/google/gerrit/extensions/common/ChangeInput.java
@@ -0,0 +1,57 @@
+// 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.
+
+package com.google.gerrit.extensions.common;
+
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.api.changes.NotifyInfo;
+import com.google.gerrit.extensions.api.changes.RecipientType;
+import com.google.gerrit.extensions.client.ChangeStatus;
+import java.util.Map;
+
+public class ChangeInput {
+  public String project;
+  public String branch;
+  public String subject;
+
+  public String topic;
+  public ChangeStatus status;
+  public Boolean isPrivate;
+  public Boolean workInProgress;
+  public String baseChange;
+  public String baseCommit;
+  public Boolean newBranch;
+  public MergeInput merge;
+
+  public ChangeInput() {}
+
+  /**
+   * Creates a new {@code ChangeInput} with the minimal attributes required for a successful
+   * creation of a new change.
+   *
+   * @param project the project name for the new change
+   * @param branch the branch name for the new change
+   * @param subject the subject (commit message) for the new change
+   */
+  public ChangeInput(String project, String branch, String subject) {
+    this.project = project;
+    this.branch = branch;
+    this.subject = subject;
+  }
+
+  /** Who to send email notifications to after change is created. */
+  public NotifyHandling notify = NotifyHandling.ALL;
+
+  public Map<RecipientType, NotifyInfo> notifyDetails;
+}
diff --git a/java/com/google/gerrit/extensions/common/ChangeMessageInfo.java b/java/com/google/gerrit/extensions/common/ChangeMessageInfo.java
new file mode 100644
index 0000000..07ad71b
--- /dev/null
+++ b/java/com/google/gerrit/extensions/common/ChangeMessageInfo.java
@@ -0,0 +1,68 @@
+// Copyright (C) 2014 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.google.gerrit.extensions.common;
+
+import java.sql.Timestamp;
+import java.util.Objects;
+
+public class ChangeMessageInfo {
+  public String id;
+  public String tag;
+  public AccountInfo author;
+  public AccountInfo realAuthor;
+  public Timestamp date;
+  public String message;
+  public Integer _revisionNumber;
+
+  @Override
+  public boolean equals(Object o) {
+    if (o instanceof ChangeMessageInfo) {
+      ChangeMessageInfo cmi = (ChangeMessageInfo) o;
+      return Objects.equals(id, cmi.id)
+          && Objects.equals(tag, cmi.tag)
+          && Objects.equals(author, cmi.author)
+          && Objects.equals(realAuthor, cmi.realAuthor)
+          && Objects.equals(date, cmi.date)
+          && Objects.equals(message, cmi.message)
+          && Objects.equals(_revisionNumber, cmi._revisionNumber);
+    }
+    return false;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(id, tag, author, realAuthor, date, message, _revisionNumber);
+  }
+
+  @Override
+  public String toString() {
+    return "ChangeMessageInfo{"
+        + "id="
+        + id
+        + ", tag="
+        + tag
+        + ", author="
+        + author
+        + ", realAuthor="
+        + realAuthor
+        + ", date="
+        + date
+        + ", _revisionNumber"
+        + _revisionNumber
+        + ", message=["
+        + message
+        + "]}";
+  }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeType.java b/java/com/google/gerrit/extensions/common/ChangeType.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeType.java
rename to java/com/google/gerrit/extensions/common/ChangeType.java
diff --git a/java/com/google/gerrit/extensions/common/CherryPickChangeInfo.java b/java/com/google/gerrit/extensions/common/CherryPickChangeInfo.java
new file mode 100644
index 0000000..5e2b902
--- /dev/null
+++ b/java/com/google/gerrit/extensions/common/CherryPickChangeInfo.java
@@ -0,0 +1,19 @@
+// 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.
+
+package com.google.gerrit.extensions.common;
+
+public class CherryPickChangeInfo extends ChangeInfo {
+  public Boolean containsGitConflicts;
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/CommentInfo.java b/java/com/google/gerrit/extensions/common/CommentInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/CommentInfo.java
rename to java/com/google/gerrit/extensions/common/CommentInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/CommitInfo.java b/java/com/google/gerrit/extensions/common/CommitInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/CommitInfo.java
rename to java/com/google/gerrit/extensions/common/CommitInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/CommitMessageInput.java b/java/com/google/gerrit/extensions/common/CommitMessageInput.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/CommitMessageInput.java
rename to java/com/google/gerrit/extensions/common/CommitMessageInput.java
diff --git a/java/com/google/gerrit/extensions/common/DescriptionInput.java b/java/com/google/gerrit/extensions/common/DescriptionInput.java
new file mode 100644
index 0000000..c0733dc
--- /dev/null
+++ b/java/com/google/gerrit/extensions/common/DescriptionInput.java
@@ -0,0 +1,21 @@
+// Copyright (C) 2017 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.google.gerrit.extensions.common;
+
+import com.google.gerrit.extensions.restapi.DefaultInput;
+
+public class DescriptionInput {
+  @DefaultInput public String description;
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DiffInfo.java b/java/com/google/gerrit/extensions/common/DiffInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DiffInfo.java
rename to java/com/google/gerrit/extensions/common/DiffInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DiffWebLinkInfo.java b/java/com/google/gerrit/extensions/common/DiffWebLinkInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DiffWebLinkInfo.java
rename to java/com/google/gerrit/extensions/common/DiffWebLinkInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DownloadInfo.java b/java/com/google/gerrit/extensions/common/DownloadInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DownloadInfo.java
rename to java/com/google/gerrit/extensions/common/DownloadInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DownloadSchemeInfo.java b/java/com/google/gerrit/extensions/common/DownloadSchemeInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DownloadSchemeInfo.java
rename to java/com/google/gerrit/extensions/common/DownloadSchemeInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/EditInfo.java b/java/com/google/gerrit/extensions/common/EditInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/EditInfo.java
rename to java/com/google/gerrit/extensions/common/EditInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/EmailInfo.java b/java/com/google/gerrit/extensions/common/EmailInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/EmailInfo.java
rename to java/com/google/gerrit/extensions/common/EmailInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/FetchInfo.java b/java/com/google/gerrit/extensions/common/FetchInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/FetchInfo.java
rename to java/com/google/gerrit/extensions/common/FetchInfo.java
diff --git a/java/com/google/gerrit/extensions/common/FileInfo.java b/java/com/google/gerrit/extensions/common/FileInfo.java
new file mode 100644
index 0000000..32c5bd5
--- /dev/null
+++ b/java/com/google/gerrit/extensions/common/FileInfo.java
@@ -0,0 +1,47 @@
+// Copyright (C) 2014 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.google.gerrit.extensions.common;
+
+import java.util.Objects;
+
+public class FileInfo {
+  public Character status;
+  public Boolean binary;
+  public String oldPath;
+  public Integer linesInserted;
+  public Integer linesDeleted;
+  public long sizeDelta;
+  public long size;
+
+  @Override
+  public boolean equals(Object o) {
+    if (o instanceof FileInfo) {
+      FileInfo fileInfo = (FileInfo) o;
+      return Objects.equals(status, fileInfo.status)
+          && Objects.equals(binary, fileInfo.binary)
+          && Objects.equals(oldPath, fileInfo.oldPath)
+          && Objects.equals(linesInserted, fileInfo.linesInserted)
+          && Objects.equals(linesDeleted, fileInfo.linesDeleted)
+          && Objects.equals(sizeDelta, fileInfo.sizeDelta)
+          && Objects.equals(size, fileInfo.size);
+    }
+    return false;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(status, binary, oldPath, linesInserted, linesDeleted, sizeDelta, size);
+  }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/FixReplacementInfo.java b/java/com/google/gerrit/extensions/common/FixReplacementInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/FixReplacementInfo.java
rename to java/com/google/gerrit/extensions/common/FixReplacementInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/FixSuggestionInfo.java b/java/com/google/gerrit/extensions/common/FixSuggestionInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/FixSuggestionInfo.java
rename to java/com/google/gerrit/extensions/common/FixSuggestionInfo.java
diff --git a/java/com/google/gerrit/extensions/common/GerritInfo.java b/java/com/google/gerrit/extensions/common/GerritInfo.java
new file mode 100644
index 0000000..ef1d679
--- /dev/null
+++ b/java/com/google/gerrit/extensions/common/GerritInfo.java
@@ -0,0 +1,30 @@
+// 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.
+
+package com.google.gerrit.extensions.common;
+
+import com.google.gerrit.extensions.client.UiType;
+import java.util.Set;
+
+public class GerritInfo {
+  public String allProjects;
+  public String allUsers;
+  public Boolean docSearch;
+  public String docUrl;
+  public Boolean editGpgKeys;
+  public String reportBugUrl;
+  public String reportBugText;
+  public Set<UiType> webUis;
+  public String primaryWeblinkName;
+}
diff --git a/java/com/google/gerrit/extensions/common/GitPerson.java b/java/com/google/gerrit/extensions/common/GitPerson.java
new file mode 100644
index 0000000..8ed919e
--- /dev/null
+++ b/java/com/google/gerrit/extensions/common/GitPerson.java
@@ -0,0 +1,56 @@
+// Copyright (C) 2014 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.google.gerrit.extensions.common;
+
+import java.sql.Timestamp;
+import java.util.Objects;
+
+public class GitPerson {
+  public String name;
+  public String email;
+  public Timestamp date;
+  public int tz;
+
+  @Override
+  public boolean equals(Object o) {
+    if (!(o instanceof GitPerson)) {
+      return false;
+    }
+    GitPerson p = (GitPerson) o;
+    return Objects.equals(name, p.name)
+        && Objects.equals(email, p.email)
+        && Objects.equals(date, p.date)
+        && tz == p.tz;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(name, email, date, tz);
+  }
+
+  @Override
+  public String toString() {
+    return getClass().getSimpleName()
+        + "{name="
+        + name
+        + ", email="
+        + email
+        + ", date="
+        + date
+        + ", tz="
+        + tz
+        + "}";
+  }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GpgKeyInfo.java b/java/com/google/gerrit/extensions/common/GpgKeyInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GpgKeyInfo.java
rename to java/com/google/gerrit/extensions/common/GpgKeyInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GroupAuditEventInfo.java b/java/com/google/gerrit/extensions/common/GroupAuditEventInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GroupAuditEventInfo.java
rename to java/com/google/gerrit/extensions/common/GroupAuditEventInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GroupBaseInfo.java b/java/com/google/gerrit/extensions/common/GroupBaseInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GroupBaseInfo.java
rename to java/com/google/gerrit/extensions/common/GroupBaseInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GroupInfo.java b/java/com/google/gerrit/extensions/common/GroupInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GroupInfo.java
rename to java/com/google/gerrit/extensions/common/GroupInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GroupOptionsInfo.java b/java/com/google/gerrit/extensions/common/GroupOptionsInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GroupOptionsInfo.java
rename to java/com/google/gerrit/extensions/common/GroupOptionsInfo.java
diff --git a/java/com/google/gerrit/extensions/common/HttpPasswordInput.java b/java/com/google/gerrit/extensions/common/HttpPasswordInput.java
new file mode 100644
index 0000000..246c7cf
--- /dev/null
+++ b/java/com/google/gerrit/extensions/common/HttpPasswordInput.java
@@ -0,0 +1,20 @@
+// Copyright (C) 2017 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.google.gerrit.extensions.common;
+
+public class HttpPasswordInput {
+  public String httpPassword;
+  public boolean generate;
+}
diff --git a/java/com/google/gerrit/extensions/common/Input.java b/java/com/google/gerrit/extensions/common/Input.java
new file mode 100644
index 0000000..68f864c
--- /dev/null
+++ b/java/com/google/gerrit/extensions/common/Input.java
@@ -0,0 +1,20 @@
+// Copyright (C) 2017 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.google.gerrit.extensions.common;
+
+/** A generic empty input. */
+public class Input {
+  public Input() {}
+}
diff --git a/java/com/google/gerrit/extensions/common/InstallPluginInput.java b/java/com/google/gerrit/extensions/common/InstallPluginInput.java
new file mode 100644
index 0000000..9cefb0f
--- /dev/null
+++ b/java/com/google/gerrit/extensions/common/InstallPluginInput.java
@@ -0,0 +1,25 @@
+// Copyright (C) 2017 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.google.gerrit.extensions.common;
+
+import com.google.gerrit.extensions.restapi.DefaultInput;
+import com.google.gerrit.extensions.restapi.RawInput;
+
+/** @deprecated use {@link com.google.gerrit.extensions.api.plugins.InstallPluginInput}. */
+@Deprecated
+public class InstallPluginInput {
+  public @DefaultInput String url;
+  public RawInput raw;
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/LabelInfo.java b/java/com/google/gerrit/extensions/common/LabelInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/LabelInfo.java
rename to java/com/google/gerrit/extensions/common/LabelInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/LabelTypeInfo.java b/java/com/google/gerrit/extensions/common/LabelTypeInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/LabelTypeInfo.java
rename to java/com/google/gerrit/extensions/common/LabelTypeInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/MergeInput.java b/java/com/google/gerrit/extensions/common/MergeInput.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/MergeInput.java
rename to java/com/google/gerrit/extensions/common/MergeInput.java
diff --git a/java/com/google/gerrit/extensions/common/MergePatchSetInput.java b/java/com/google/gerrit/extensions/common/MergePatchSetInput.java
new file mode 100644
index 0000000..53f5e07
--- /dev/null
+++ b/java/com/google/gerrit/extensions/common/MergePatchSetInput.java
@@ -0,0 +1,22 @@
+// 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.
+
+package com.google.gerrit.extensions.common;
+
+public class MergePatchSetInput {
+  public String subject;
+  public boolean inheritParent;
+  public String baseChange;
+  public MergeInput merge;
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/MergeableInfo.java b/java/com/google/gerrit/extensions/common/MergeableInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/MergeableInfo.java
rename to java/com/google/gerrit/extensions/common/MergeableInfo.java
diff --git a/java/com/google/gerrit/extensions/common/NameInput.java b/java/com/google/gerrit/extensions/common/NameInput.java
new file mode 100644
index 0000000..463eee1
--- /dev/null
+++ b/java/com/google/gerrit/extensions/common/NameInput.java
@@ -0,0 +1,21 @@
+// Copyright (C) 2017 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.google.gerrit.extensions.common;
+
+import com.google.gerrit.extensions.restapi.DefaultInput;
+
+public class NameInput {
+  @DefaultInput public String name;
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/PluginConfigInfo.java b/java/com/google/gerrit/extensions/common/PluginConfigInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/PluginConfigInfo.java
rename to java/com/google/gerrit/extensions/common/PluginConfigInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/PluginDefinedInfo.java b/java/com/google/gerrit/extensions/common/PluginDefinedInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/PluginDefinedInfo.java
rename to java/com/google/gerrit/extensions/common/PluginDefinedInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/PluginInfo.java b/java/com/google/gerrit/extensions/common/PluginInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/PluginInfo.java
rename to java/com/google/gerrit/extensions/common/PluginInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ProblemInfo.java b/java/com/google/gerrit/extensions/common/ProblemInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ProblemInfo.java
rename to java/com/google/gerrit/extensions/common/ProblemInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ProjectInfo.java b/java/com/google/gerrit/extensions/common/ProjectInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ProjectInfo.java
rename to java/com/google/gerrit/extensions/common/ProjectInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/PureRevertInfo.java b/java/com/google/gerrit/extensions/common/PureRevertInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/PureRevertInfo.java
rename to java/com/google/gerrit/extensions/common/PureRevertInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/PushCertificateInfo.java b/java/com/google/gerrit/extensions/common/PushCertificateInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/PushCertificateInfo.java
rename to java/com/google/gerrit/extensions/common/PushCertificateInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/RangeInfo.java b/java/com/google/gerrit/extensions/common/RangeInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/RangeInfo.java
rename to java/com/google/gerrit/extensions/common/RangeInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ReceiveInfo.java b/java/com/google/gerrit/extensions/common/ReceiveInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ReceiveInfo.java
rename to java/com/google/gerrit/extensions/common/ReceiveInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ReviewerUpdateInfo.java b/java/com/google/gerrit/extensions/common/ReviewerUpdateInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ReviewerUpdateInfo.java
rename to java/com/google/gerrit/extensions/common/ReviewerUpdateInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/RevisionInfo.java b/java/com/google/gerrit/extensions/common/RevisionInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/RevisionInfo.java
rename to java/com/google/gerrit/extensions/common/RevisionInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/RobotCommentInfo.java b/java/com/google/gerrit/extensions/common/RobotCommentInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/RobotCommentInfo.java
rename to java/com/google/gerrit/extensions/common/RobotCommentInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ServerInfo.java b/java/com/google/gerrit/extensions/common/ServerInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ServerInfo.java
rename to java/com/google/gerrit/extensions/common/ServerInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SshKeyInfo.java b/java/com/google/gerrit/extensions/common/SshKeyInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SshKeyInfo.java
rename to java/com/google/gerrit/extensions/common/SshKeyInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SshdInfo.java b/java/com/google/gerrit/extensions/common/SshdInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SshdInfo.java
rename to java/com/google/gerrit/extensions/common/SshdInfo.java
diff --git a/java/com/google/gerrit/extensions/common/SubmitRequirementInfo.java b/java/com/google/gerrit/extensions/common/SubmitRequirementInfo.java
new file mode 100644
index 0000000..53f0375
--- /dev/null
+++ b/java/com/google/gerrit/extensions/common/SubmitRequirementInfo.java
@@ -0,0 +1,64 @@
+// 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.
+
+package com.google.gerrit.extensions.common;
+
+import com.google.common.base.MoreObjects;
+import java.util.Map;
+import java.util.Objects;
+
+public class SubmitRequirementInfo {
+  public final String status;
+  public final String fallbackText;
+  public final String type;
+  public final Map<String, String> data;
+
+  public SubmitRequirementInfo(
+      String status, String fallbackText, String type, Map<String, String> data) {
+    this.status = status;
+    this.fallbackText = fallbackText;
+    this.type = type;
+    this.data = data;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof SubmitRequirementInfo)) {
+      return false;
+    }
+    SubmitRequirementInfo that = (SubmitRequirementInfo) o;
+    return Objects.equals(status, that.status)
+        && Objects.equals(fallbackText, that.fallbackText)
+        && Objects.equals(type, that.type)
+        && Objects.equals(data, that.data);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(status, fallbackText, type, data);
+  }
+
+  @Override
+  public String toString() {
+    return MoreObjects.toStringHelper(this)
+        .add("status", status)
+        .add("fallbackText", fallbackText)
+        .add("type", type)
+        .add("data", data)
+        .toString();
+  }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SuggestInfo.java b/java/com/google/gerrit/extensions/common/SuggestInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SuggestInfo.java
rename to java/com/google/gerrit/extensions/common/SuggestInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SuggestedReviewerInfo.java b/java/com/google/gerrit/extensions/common/SuggestedReviewerInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SuggestedReviewerInfo.java
rename to java/com/google/gerrit/extensions/common/SuggestedReviewerInfo.java
diff --git a/java/com/google/gerrit/extensions/common/TestSubmitRuleInfo.java b/java/com/google/gerrit/extensions/common/TestSubmitRuleInfo.java
new file mode 100644
index 0000000..bd7ebcb
--- /dev/null
+++ b/java/com/google/gerrit/extensions/common/TestSubmitRuleInfo.java
@@ -0,0 +1,70 @@
+// 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.
+
+package com.google.gerrit.extensions.common;
+
+import com.google.common.base.MoreObjects;
+import java.util.Map;
+import java.util.Objects;
+
+public class TestSubmitRuleInfo {
+  /** @see com.google.gerrit.common.data.SubmitRecord.Status */
+  public String status;
+
+  public String errorMessage;
+  public Map<String, AccountInfo> ok;
+  public Map<String, AccountInfo> reject;
+  public Map<String, None> need;
+  public Map<String, AccountInfo> may;
+  public Map<String, None> impossible;
+
+  public static class None {
+    private None() {}
+
+    public static None INSTANCE = new None();
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (o instanceof TestSubmitRuleInfo) {
+      TestSubmitRuleInfo other = (TestSubmitRuleInfo) o;
+      return Objects.equals(status, other.status)
+          && Objects.equals(errorMessage, other.errorMessage)
+          && Objects.equals(ok, other.ok)
+          && Objects.equals(reject, other.reject)
+          && Objects.equals(need, other.need)
+          && Objects.equals(may, other.may)
+          && Objects.equals(impossible, other.impossible);
+    }
+    return false;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(status, errorMessage, ok, reject, need, may, impossible);
+  }
+
+  @Override
+  public String toString() {
+    return MoreObjects.toStringHelper(this)
+        .add("status", status)
+        .add("errorMessage", errorMessage)
+        .add("ok", ok)
+        .add("reject", reject)
+        .add("need", need)
+        .add("may", may)
+        .add("impossible", impossible)
+        .toString();
+  }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/TestSubmitRuleInput.java b/java/com/google/gerrit/extensions/common/TestSubmitRuleInput.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/TestSubmitRuleInput.java
rename to java/com/google/gerrit/extensions/common/TestSubmitRuleInput.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/TrackingIdInfo.java b/java/com/google/gerrit/extensions/common/TrackingIdInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/TrackingIdInfo.java
rename to java/com/google/gerrit/extensions/common/TrackingIdInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/UserConfigInfo.java b/java/com/google/gerrit/extensions/common/UserConfigInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/UserConfigInfo.java
rename to java/com/google/gerrit/extensions/common/UserConfigInfo.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/VotingRangeInfo.java b/java/com/google/gerrit/extensions/common/VotingRangeInfo.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/VotingRangeInfo.java
rename to java/com/google/gerrit/extensions/common/VotingRangeInfo.java
diff --git a/java/com/google/gerrit/extensions/common/WebLinkInfo.java b/java/com/google/gerrit/extensions/common/WebLinkInfo.java
new file mode 100644
index 0000000..84fd970
--- /dev/null
+++ b/java/com/google/gerrit/extensions/common/WebLinkInfo.java
@@ -0,0 +1,67 @@
+// Copyright (C) 2014 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.google.gerrit.extensions.common;
+
+import com.google.gerrit.extensions.webui.WebLink.Target;
+import java.util.Objects;
+
+public class WebLinkInfo {
+  public String name;
+  public String imageUrl;
+  public String url;
+  public String target;
+
+  public WebLinkInfo(String name, String imageUrl, String url, String target) {
+    this.name = name;
+    this.imageUrl = imageUrl;
+    this.url = url;
+    this.target = target;
+  }
+
+  public WebLinkInfo(String name, String imageUrl, String url) {
+    this(name, imageUrl, url, Target.SELF);
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (!(o instanceof WebLinkInfo)) {
+      return false;
+    }
+    WebLinkInfo i = (WebLinkInfo) o;
+    return Objects.equals(name, i.name)
+        && Objects.equals(imageUrl, i.imageUrl)
+        && Objects.equals(url, i.url)
+        && Objects.equals(target, i.target);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(name, imageUrl, url, target);
+  }
+
+  @Override
+  public String toString() {
+    return getClass().getSimpleName()
+        + "{name="
+        + name
+        + ", imageUrl="
+        + imageUrl
+        + ", url="
+        + url
+        + ", target"
+        + target
+        + "}";
+  }
+}
diff --git a/java/com/google/gerrit/extensions/common/testing/BUILD b/java/com/google/gerrit/extensions/common/testing/BUILD
new file mode 100644
index 0000000..6679104
--- /dev/null
+++ b/java/com/google/gerrit/extensions/common/testing/BUILD
@@ -0,0 +1,12 @@
+java_library(
+    name = "common-test-util",
+    testonly = True,
+    srcs = glob(["**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/truth",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/truth",
+    ],
+)
diff --git a/java/com/google/gerrit/extensions/common/testing/CommitInfoSubject.java b/java/com/google/gerrit/extensions/common/testing/CommitInfoSubject.java
new file mode 100644
index 0000000..6dd5ce4
--- /dev/null
+++ b/java/com/google/gerrit/extensions/common/testing/CommitInfoSubject.java
@@ -0,0 +1,66 @@
+// Copyright (C) 2017 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.google.gerrit.extensions.common.testing;
+
+import static com.google.common.truth.Truth.assertAbout;
+
+import com.google.common.truth.FailureMetadata;
+import com.google.common.truth.StringSubject;
+import com.google.common.truth.Subject;
+import com.google.common.truth.Truth;
+import com.google.gerrit.extensions.common.CommitInfo;
+import com.google.gerrit.truth.ListSubject;
+
+public class CommitInfoSubject extends Subject<CommitInfoSubject, CommitInfo> {
+
+  public static CommitInfoSubject assertThat(CommitInfo commitInfo) {
+    return assertAbout(CommitInfoSubject::new).that(commitInfo);
+  }
+
+  private CommitInfoSubject(FailureMetadata failureMetadata, CommitInfo commitInfo) {
+    super(failureMetadata, commitInfo);
+  }
+
+  public StringSubject commit() {
+    isNotNull();
+    CommitInfo commitInfo = actual();
+    return Truth.assertThat(commitInfo.commit).named("commit");
+  }
+
+  public ListSubject<CommitInfoSubject, CommitInfo> parents() {
+    isNotNull();
+    CommitInfo commitInfo = actual();
+    return ListSubject.assertThat(commitInfo.parents, CommitInfoSubject::assertThat)
+        .named("parents");
+  }
+
+  public GitPersonSubject committer() {
+    isNotNull();
+    CommitInfo commitInfo = actual();
+    return GitPersonSubject.assertThat(commitInfo.committer).named("committer");
+  }
+
+  public GitPersonSubject author() {
+    isNotNull();
+    CommitInfo commitInfo = actual();
+    return GitPersonSubject.assertThat(commitInfo.author).named("author");
+  }
+
+  public StringSubject message() {
+    isNotNull();
+    CommitInfo commitInfo = actual();
+    return Truth.assertThat(commitInfo.message).named("message");
+  }
+}
diff --git a/java/com/google/gerrit/extensions/common/testing/ContentEntrySubject.java b/java/com/google/gerrit/extensions/common/testing/ContentEntrySubject.java
new file mode 100644
index 0000000..5fc8ba6
--- /dev/null
+++ b/java/com/google/gerrit/extensions/common/testing/ContentEntrySubject.java
@@ -0,0 +1,91 @@
+// Copyright (C) 2017 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.google.gerrit.extensions.common.testing;
+
+import static com.google.common.truth.Truth.assertAbout;
+
+import com.google.common.truth.FailureMetadata;
+import com.google.common.truth.IntegerSubject;
+import com.google.common.truth.IterableSubject;
+import com.google.common.truth.StringSubject;
+import com.google.common.truth.Subject;
+import com.google.common.truth.Truth;
+import com.google.gerrit.extensions.common.DiffInfo.ContentEntry;
+import com.google.gerrit.truth.ListSubject;
+
+public class ContentEntrySubject extends Subject<ContentEntrySubject, ContentEntry> {
+
+  public static ContentEntrySubject assertThat(ContentEntry contentEntry) {
+    return assertAbout(ContentEntrySubject::new).that(contentEntry);
+  }
+
+  private ContentEntrySubject(FailureMetadata failureMetadata, ContentEntry contentEntry) {
+    super(failureMetadata, contentEntry);
+  }
+
+  public void isDueToRebase() {
+    isNotNull();
+    ContentEntry contentEntry = actual();
+    Truth.assertWithMessage("Entry should be marked 'dueToRebase'")
+        .that(contentEntry.dueToRebase)
+        .named("dueToRebase")
+        .isTrue();
+  }
+
+  public void isNotDueToRebase() {
+    isNotNull();
+    ContentEntry contentEntry = actual();
+    Truth.assertWithMessage("Entry should not be marked 'dueToRebase'")
+        .that(contentEntry.dueToRebase)
+        .named("dueToRebase")
+        .isNull();
+  }
+
+  public ListSubject<StringSubject, String> commonLines() {
+    isNotNull();
+    ContentEntry contentEntry = actual();
+    return ListSubject.assertThat(contentEntry.ab, Truth::assertThat).named("common lines");
+  }
+
+  public ListSubject<StringSubject, String> linesOfA() {
+    isNotNull();
+    ContentEntry contentEntry = actual();
+    return ListSubject.assertThat(contentEntry.a, Truth::assertThat).named("lines of 'a'");
+  }
+
+  public ListSubject<StringSubject, String> linesOfB() {
+    isNotNull();
+    ContentEntry contentEntry = actual();
+    return ListSubject.assertThat(contentEntry.b, Truth::assertThat).named("lines of 'b'");
+  }
+
+  public IterableSubject intralineEditsOfA() {
+    isNotNull();
+    ContentEntry contentEntry = actual();
+    return Truth.assertThat(contentEntry.editA).named("intraline edits of 'a'");
+  }
+
+  public IterableSubject intralineEditsOfB() {
+    isNotNull();
+    ContentEntry contentEntry = actual();
+    return Truth.assertThat(contentEntry.editB).named("intraline edits of 'b'");
+  }
+
+  public IntegerSubject numberOfSkippedLines() {
+    isNotNull();
+    ContentEntry contentEntry = actual();
+    return Truth.assertThat(contentEntry.skip).named("number of skipped lines");
+  }
+}
diff --git a/java/com/google/gerrit/extensions/common/testing/DiffInfoSubject.java b/java/com/google/gerrit/extensions/common/testing/DiffInfoSubject.java
new file mode 100644
index 0000000..057a1a2
--- /dev/null
+++ b/java/com/google/gerrit/extensions/common/testing/DiffInfoSubject.java
@@ -0,0 +1,62 @@
+// Copyright (C) 2017 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.google.gerrit.extensions.common.testing;
+
+import static com.google.common.truth.Truth.assertAbout;
+
+import com.google.common.truth.ComparableSubject;
+import com.google.common.truth.FailureMetadata;
+import com.google.common.truth.Subject;
+import com.google.common.truth.Truth;
+import com.google.gerrit.extensions.common.ChangeType;
+import com.google.gerrit.extensions.common.DiffInfo;
+import com.google.gerrit.extensions.common.DiffInfo.ContentEntry;
+import com.google.gerrit.truth.ListSubject;
+
+public class DiffInfoSubject extends Subject<DiffInfoSubject, DiffInfo> {
+
+  public static DiffInfoSubject assertThat(DiffInfo diffInfo) {
+    return assertAbout(DiffInfoSubject::new).that(diffInfo);
+  }
+
+  private DiffInfoSubject(FailureMetadata failureMetadata, DiffInfo diffInfo) {
+    super(failureMetadata, diffInfo);
+  }
+
+  public ListSubject<ContentEntrySubject, ContentEntry> content() {
+    isNotNull();
+    DiffInfo diffInfo = actual();
+    return ListSubject.assertThat(diffInfo.content, ContentEntrySubject::assertThat)
+        .named("content");
+  }
+
+  public ComparableSubject<?, ChangeType> changeType() {
+    isNotNull();
+    DiffInfo diffInfo = actual();
+    return Truth.assertThat(diffInfo.changeType).named("changeType");
+  }
+
+  public FileMetaSubject metaA() {
+    isNotNull();
+    DiffInfo diffInfo = actual();
+    return FileMetaSubject.assertThat(diffInfo.metaA).named("metaA");
+  }
+
+  public FileMetaSubject metaB() {
+    isNotNull();
+    DiffInfo diffInfo = actual();
+    return FileMetaSubject.assertThat(diffInfo.metaB).named("metaB");
+  }
+}
diff --git a/java/com/google/gerrit/extensions/common/testing/EditInfoSubject.java b/java/com/google/gerrit/extensions/common/testing/EditInfoSubject.java
new file mode 100644
index 0000000..84ad61c
--- /dev/null
+++ b/java/com/google/gerrit/extensions/common/testing/EditInfoSubject.java
@@ -0,0 +1,53 @@
+// Copyright (C) 2017 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.google.gerrit.extensions.common.testing;
+
+import static com.google.common.truth.Truth.assertAbout;
+
+import com.google.common.truth.FailureMetadata;
+import com.google.common.truth.StringSubject;
+import com.google.common.truth.Subject;
+import com.google.common.truth.Truth;
+import com.google.gerrit.extensions.common.EditInfo;
+import com.google.gerrit.truth.OptionalSubject;
+import java.util.Optional;
+
+public class EditInfoSubject extends Subject<EditInfoSubject, EditInfo> {
+
+  public static EditInfoSubject assertThat(EditInfo editInfo) {
+    return assertAbout(EditInfoSubject::new).that(editInfo);
+  }
+
+  public static OptionalSubject<EditInfoSubject, EditInfo> assertThat(
+      Optional<EditInfo> editInfoOptional) {
+    return OptionalSubject.assertThat(editInfoOptional, EditInfoSubject::assertThat);
+  }
+
+  private EditInfoSubject(FailureMetadata failureMetadata, EditInfo editInfo) {
+    super(failureMetadata, editInfo);
+  }
+
+  public CommitInfoSubject commit() {
+    isNotNull();
+    EditInfo editInfo = actual();
+    return CommitInfoSubject.assertThat(editInfo.commit).named("commit");
+  }
+
+  public StringSubject baseRevision() {
+    isNotNull();
+    EditInfo editInfo = actual();
+    return Truth.assertThat(editInfo.baseRevision).named("baseRevision");
+  }
+}
diff --git a/java/com/google/gerrit/extensions/common/testing/FileInfoSubject.java b/java/com/google/gerrit/extensions/common/testing/FileInfoSubject.java
new file mode 100644
index 0000000..b088016
--- /dev/null
+++ b/java/com/google/gerrit/extensions/common/testing/FileInfoSubject.java
@@ -0,0 +1,53 @@
+// Copyright (C) 2017 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.google.gerrit.extensions.common.testing;
+
+import static com.google.common.truth.Truth.assertAbout;
+
+import com.google.common.truth.ComparableSubject;
+import com.google.common.truth.FailureMetadata;
+import com.google.common.truth.IntegerSubject;
+import com.google.common.truth.Subject;
+import com.google.common.truth.Truth;
+import com.google.gerrit.extensions.common.FileInfo;
+
+public class FileInfoSubject extends Subject<FileInfoSubject, FileInfo> {
+
+  public static FileInfoSubject assertThat(FileInfo fileInfo) {
+    return assertAbout(FileInfoSubject::new).that(fileInfo);
+  }
+
+  private FileInfoSubject(FailureMetadata failureMetadata, FileInfo fileInfo) {
+    super(failureMetadata, fileInfo);
+  }
+
+  public IntegerSubject linesInserted() {
+    isNotNull();
+    FileInfo fileInfo = actual();
+    return Truth.assertThat(fileInfo.linesInserted).named("linesInserted");
+  }
+
+  public IntegerSubject linesDeleted() {
+    isNotNull();
+    FileInfo fileInfo = actual();
+    return Truth.assertThat(fileInfo.linesDeleted).named("linesDeleted");
+  }
+
+  public ComparableSubject<?, Character> status() {
+    isNotNull();
+    FileInfo fileInfo = actual();
+    return Truth.assertThat(fileInfo.status).named("status");
+  }
+}
diff --git a/java/com/google/gerrit/extensions/common/testing/FileMetaSubject.java b/java/com/google/gerrit/extensions/common/testing/FileMetaSubject.java
new file mode 100644
index 0000000..e77eef1
--- /dev/null
+++ b/java/com/google/gerrit/extensions/common/testing/FileMetaSubject.java
@@ -0,0 +1,40 @@
+// 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.
+
+package com.google.gerrit.extensions.common.testing;
+
+import static com.google.common.truth.Truth.assertAbout;
+
+import com.google.common.truth.FailureMetadata;
+import com.google.common.truth.IntegerSubject;
+import com.google.common.truth.Subject;
+import com.google.common.truth.Truth;
+import com.google.gerrit.extensions.common.DiffInfo.FileMeta;
+
+public class FileMetaSubject extends Subject<FileMetaSubject, FileMeta> {
+
+  public static FileMetaSubject assertThat(FileMeta fileMeta) {
+    return assertAbout(FileMetaSubject::new).that(fileMeta);
+  }
+
+  private FileMetaSubject(FailureMetadata failureMetadata, FileMeta fileMeta) {
+    super(failureMetadata, fileMeta);
+  }
+
+  public IntegerSubject totalLineCount() {
+    isNotNull();
+    FileMeta fileMeta = actual();
+    return Truth.assertThat(fileMeta.lines).named("total line count");
+  }
+}
diff --git a/java/com/google/gerrit/extensions/common/testing/FixReplacementInfoSubject.java b/java/com/google/gerrit/extensions/common/testing/FixReplacementInfoSubject.java
new file mode 100644
index 0000000..b56d399
--- /dev/null
+++ b/java/com/google/gerrit/extensions/common/testing/FixReplacementInfoSubject.java
@@ -0,0 +1,48 @@
+// 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.
+
+package com.google.gerrit.extensions.common.testing;
+
+import static com.google.common.truth.Truth.assertAbout;
+
+import com.google.common.truth.FailureMetadata;
+import com.google.common.truth.StringSubject;
+import com.google.common.truth.Subject;
+import com.google.common.truth.Truth;
+import com.google.gerrit.extensions.common.FixReplacementInfo;
+
+public class FixReplacementInfoSubject
+    extends Subject<FixReplacementInfoSubject, FixReplacementInfo> {
+
+  public static FixReplacementInfoSubject assertThat(FixReplacementInfo fixReplacementInfo) {
+    return assertAbout(FixReplacementInfoSubject::new).that(fixReplacementInfo);
+  }
+
+  private FixReplacementInfoSubject(
+      FailureMetadata failureMetadata, FixReplacementInfo fixReplacementInfo) {
+    super(failureMetadata, fixReplacementInfo);
+  }
+
+  public StringSubject path() {
+    return Truth.assertThat(actual().path).named("path");
+  }
+
+  public RangeSubject range() {
+    return RangeSubject.assertThat(actual().range).named("range");
+  }
+
+  public StringSubject replacement() {
+    return Truth.assertThat(actual().replacement).named("replacement");
+  }
+}
diff --git a/java/com/google/gerrit/extensions/common/testing/FixSuggestionInfoSubject.java b/java/com/google/gerrit/extensions/common/testing/FixSuggestionInfoSubject.java
new file mode 100644
index 0000000..7a6da9c
--- /dev/null
+++ b/java/com/google/gerrit/extensions/common/testing/FixSuggestionInfoSubject.java
@@ -0,0 +1,54 @@
+// 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.
+
+package com.google.gerrit.extensions.common.testing;
+
+import static com.google.common.truth.Truth.assertAbout;
+
+import com.google.common.truth.FailureMetadata;
+import com.google.common.truth.StringSubject;
+import com.google.common.truth.Subject;
+import com.google.common.truth.Truth;
+import com.google.gerrit.extensions.common.FixReplacementInfo;
+import com.google.gerrit.extensions.common.FixSuggestionInfo;
+import com.google.gerrit.truth.ListSubject;
+
+public class FixSuggestionInfoSubject extends Subject<FixSuggestionInfoSubject, FixSuggestionInfo> {
+
+  public static FixSuggestionInfoSubject assertThat(FixSuggestionInfo fixSuggestionInfo) {
+    return assertAbout(FixSuggestionInfoSubject::new).that(fixSuggestionInfo);
+  }
+
+  private FixSuggestionInfoSubject(
+      FailureMetadata failureMetadata, FixSuggestionInfo fixSuggestionInfo) {
+    super(failureMetadata, fixSuggestionInfo);
+  }
+
+  public StringSubject fixId() {
+    return Truth.assertThat(actual().fixId).named("fixId");
+  }
+
+  public ListSubject<FixReplacementInfoSubject, FixReplacementInfo> replacements() {
+    return ListSubject.assertThat(actual().replacements, FixReplacementInfoSubject::assertThat)
+        .named("replacements");
+  }
+
+  public FixReplacementInfoSubject onlyReplacement() {
+    return replacements().onlyElement();
+  }
+
+  public StringSubject description() {
+    return Truth.assertThat(actual().description).named("description");
+  }
+}
diff --git a/java/com/google/gerrit/extensions/common/testing/GitPersonSubject.java b/java/com/google/gerrit/extensions/common/testing/GitPersonSubject.java
new file mode 100644
index 0000000..cdbef34
--- /dev/null
+++ b/java/com/google/gerrit/extensions/common/testing/GitPersonSubject.java
@@ -0,0 +1,80 @@
+// Copyright (C) 2017 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.google.gerrit.extensions.common.testing;
+
+import static com.google.common.truth.Truth.assertAbout;
+
+import com.google.common.truth.ComparableSubject;
+import com.google.common.truth.FailureMetadata;
+import com.google.common.truth.IntegerSubject;
+import com.google.common.truth.StringSubject;
+import com.google.common.truth.Subject;
+import com.google.common.truth.Truth;
+import com.google.gerrit.extensions.common.GitPerson;
+import java.sql.Timestamp;
+import java.util.Date;
+import org.eclipse.jgit.lib.PersonIdent;
+
+public class GitPersonSubject extends Subject<GitPersonSubject, GitPerson> {
+
+  public static GitPersonSubject assertThat(GitPerson gitPerson) {
+    return assertAbout(GitPersonSubject::new).that(gitPerson);
+  }
+
+  private GitPersonSubject(FailureMetadata failureMetadata, GitPerson gitPerson) {
+    super(failureMetadata, gitPerson);
+  }
+
+  public StringSubject name() {
+    isNotNull();
+    GitPerson gitPerson = actual();
+    return Truth.assertThat(gitPerson.name).named("name");
+  }
+
+  public StringSubject email() {
+    isNotNull();
+    GitPerson gitPerson = actual();
+    return Truth.assertThat(gitPerson.email).named("email");
+  }
+
+  public ComparableSubject<?, Timestamp> date() {
+    isNotNull();
+    GitPerson gitPerson = actual();
+    return Truth.assertThat(gitPerson.date).named("date");
+  }
+
+  public IntegerSubject tz() {
+    isNotNull();
+    GitPerson gitPerson = actual();
+    return Truth.assertThat(gitPerson.tz).named("tz");
+  }
+
+  public void hasSameDateAs(GitPerson other) {
+    isNotNull();
+    assertThat(other).named("other").isNotNull();
+    date().isEqualTo(other.date);
+    tz().isEqualTo(other.tz);
+  }
+
+  public void matches(PersonIdent ident) {
+    isNotNull();
+    name().isEqualTo(ident.getName());
+    email().isEqualTo(ident.getEmailAddress());
+    Truth.assertThat(new Date(actual().date.getTime()))
+        .named("rounded date")
+        .isEqualTo(ident.getWhen());
+    tz().isEqualTo(ident.getTimeZoneOffset());
+  }
+}
diff --git a/java/com/google/gerrit/extensions/common/testing/RangeSubject.java b/java/com/google/gerrit/extensions/common/testing/RangeSubject.java
new file mode 100644
index 0000000..db7f0d1
--- /dev/null
+++ b/java/com/google/gerrit/extensions/common/testing/RangeSubject.java
@@ -0,0 +1,65 @@
+// 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.
+
+package com.google.gerrit.extensions.common.testing;
+
+import static com.google.common.truth.Fact.fact;
+import static com.google.common.truth.Truth.assertAbout;
+
+import com.google.common.truth.FailureMetadata;
+import com.google.common.truth.IntegerSubject;
+import com.google.common.truth.Subject;
+import com.google.common.truth.Truth;
+import com.google.gerrit.extensions.client.Comment;
+
+public class RangeSubject extends Subject<RangeSubject, Comment.Range> {
+
+  public static RangeSubject assertThat(Comment.Range range) {
+    return assertAbout(RangeSubject::new).that(range);
+  }
+
+  private RangeSubject(FailureMetadata failureMetadata, Comment.Range range) {
+    super(failureMetadata, range);
+  }
+
+  public IntegerSubject startLine() {
+    return Truth.assertThat(actual().startLine).named("startLine");
+  }
+
+  public IntegerSubject startCharacter() {
+    return Truth.assertThat(actual().startCharacter).named("startCharacter");
+  }
+
+  public IntegerSubject endLine() {
+    return Truth.assertThat(actual().endLine).named("endLine");
+  }
+
+  public IntegerSubject endCharacter() {
+    return Truth.assertThat(actual().endCharacter).named("endCharacter");
+  }
+
+  public void isValid() {
+    isNotNull();
+    if (!actual().isValid()) {
+      failWithoutActual(fact("expected", "valid"));
+    }
+  }
+
+  public void isInvalid() {
+    isNotNull();
+    if (actual().isValid()) {
+      failWithoutActual(fact("expected", "not valid"));
+    }
+  }
+}
diff --git a/java/com/google/gerrit/extensions/common/testing/RobotCommentInfoSubject.java b/java/com/google/gerrit/extensions/common/testing/RobotCommentInfoSubject.java
new file mode 100644
index 0000000..c2bed86
--- /dev/null
+++ b/java/com/google/gerrit/extensions/common/testing/RobotCommentInfoSubject.java
@@ -0,0 +1,51 @@
+// 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.
+
+package com.google.gerrit.extensions.common.testing;
+
+import static com.google.common.truth.Truth.assertAbout;
+
+import com.google.common.truth.FailureMetadata;
+import com.google.common.truth.Subject;
+import com.google.gerrit.extensions.common.FixSuggestionInfo;
+import com.google.gerrit.extensions.common.RobotCommentInfo;
+import com.google.gerrit.truth.ListSubject;
+import java.util.List;
+
+public class RobotCommentInfoSubject extends Subject<RobotCommentInfoSubject, RobotCommentInfo> {
+
+  public static ListSubject<RobotCommentInfoSubject, RobotCommentInfo> assertThatList(
+      List<RobotCommentInfo> robotCommentInfos) {
+    return ListSubject.assertThat(robotCommentInfos, RobotCommentInfoSubject::assertThat)
+        .named("robotCommentInfos");
+  }
+
+  public static RobotCommentInfoSubject assertThat(RobotCommentInfo robotCommentInfo) {
+    return assertAbout(RobotCommentInfoSubject::new).that(robotCommentInfo);
+  }
+
+  private RobotCommentInfoSubject(
+      FailureMetadata failureMetadata, RobotCommentInfo robotCommentInfo) {
+    super(failureMetadata, robotCommentInfo);
+  }
+
+  public ListSubject<FixSuggestionInfoSubject, FixSuggestionInfo> fixSuggestions() {
+    return ListSubject.assertThat(actual().fixSuggestions, FixSuggestionInfoSubject::assertThat)
+        .named("fixSuggestions");
+  }
+
+  public FixSuggestionInfoSubject onlyFixSuggestion() {
+    return fixSuggestions().onlyElement();
+  }
+}
diff --git a/java/com/google/gerrit/extensions/conditions/BooleanCondition.java b/java/com/google/gerrit/extensions/conditions/BooleanCondition.java
new file mode 100644
index 0000000..162dd99
--- /dev/null
+++ b/java/com/google/gerrit/extensions/conditions/BooleanCondition.java
@@ -0,0 +1,320 @@
+// Copyright (C) 2017 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.google.gerrit.extensions.conditions;
+
+import com.google.common.collect.Iterables;
+import java.util.Collections;
+
+/** Delayed evaluation of a boolean condition. */
+public abstract class BooleanCondition {
+  public static final BooleanCondition TRUE = new Value(true);
+  public static final BooleanCondition FALSE = new Value(false);
+
+  public static BooleanCondition valueOf(boolean a) {
+    return a ? TRUE : FALSE;
+  }
+
+  public static BooleanCondition and(BooleanCondition a, BooleanCondition b) {
+    return a == FALSE || b == FALSE ? FALSE : new And(a, b);
+  }
+
+  public static BooleanCondition and(boolean a, BooleanCondition b) {
+    return and(valueOf(a), b);
+  }
+
+  public static BooleanCondition or(BooleanCondition a, BooleanCondition b) {
+    return a == TRUE || b == TRUE ? TRUE : new Or(a, b);
+  }
+
+  public static BooleanCondition or(boolean a, BooleanCondition b) {
+    return or(valueOf(a), b);
+  }
+
+  public static BooleanCondition not(BooleanCondition bc) {
+    return bc == TRUE ? FALSE : bc == FALSE ? TRUE : new Not(bc);
+  }
+
+  BooleanCondition() {}
+
+  /** @return evaluate the condition and return its value. */
+  public abstract boolean value();
+
+  /**
+   * Recursively collect all children of type {@code type}.
+   *
+   * @param type implementation type of the conditions to collect and return.
+   * @return non-null, unmodifiable iteration of children of type {@code type}.
+   */
+  public abstract <T> Iterable<T> children(Class<T> type);
+
+  /**
+   * Reduce evaluation tree by cutting off branches that evaluate trivially and replacing them with
+   * a leave note corresponding to the value the branch evaluated to.
+   *
+   * <p><code>
+   * Example 1 (T=True, F=False, C=non-trivial check):
+   *      OR
+   *     /  \    =>    T
+   *    C   T
+   * Example 2 (cuts off a not-trivial check):
+   *      AND
+   *     /  \    =>    F
+   *    C   F
+   * Example 3:
+   *      AND
+   *     /  \    =>    F
+   *    T   F
+   * </code>
+   *
+   * <p>There is no guarantee that the resulting tree is minimal. The only guarantee made is that
+   * branches that evaluate trivially will be cut off and replaced by primitive values.
+   */
+  public abstract BooleanCondition reduce();
+
+  /**
+   * Check if the condition evaluates to either {@code true} or {@code false} without providing
+   * additional information to the evaluation tree, e.g. through checks to a remote service such as
+   * {@code PermissionBackend}.
+   *
+   * <p>In this case, the tree can be reduced to skip all non-trivial checks resulting in a
+   * performance gain.
+   */
+  protected abstract boolean evaluatesTrivially();
+
+  private static final class And extends BooleanCondition {
+    private final BooleanCondition a;
+    private final BooleanCondition b;
+
+    And(BooleanCondition a, BooleanCondition b) {
+      this.a = a;
+      this.b = b;
+    }
+
+    @Override
+    public boolean value() {
+      if (evaluatesTriviallyToExpectedValue(a, false)
+          || evaluatesTriviallyToExpectedValue(b, false)) {
+        return false;
+      }
+      return a.value() && b.value();
+    }
+
+    @Override
+    public <T> Iterable<T> children(Class<T> type) {
+      return Iterables.concat(a.children(type), b.children(type));
+    }
+
+    @Override
+    public BooleanCondition reduce() {
+      if (evaluatesTrivially()) {
+        return Value.valueOf(value());
+      }
+      return new And(a.reduce(), b.reduce());
+    }
+
+    @Override
+    public int hashCode() {
+      return a.hashCode() * 31 + b.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object other) {
+      if (other instanceof And) {
+        And o = (And) other;
+        return a.equals(o.a) && b.equals(o.b);
+      }
+      return false;
+    }
+
+    @Override
+    public String toString() {
+      return "(" + maybeTrim(a, getClass()) + " && " + maybeTrim(a, getClass()) + ")";
+    }
+
+    @Override
+    protected boolean evaluatesTrivially() {
+      return evaluatesTriviallyToExpectedValue(a, false)
+          || evaluatesTriviallyToExpectedValue(b, false)
+          || (a.evaluatesTrivially() && b.evaluatesTrivially());
+    }
+  }
+
+  private static final class Or extends BooleanCondition {
+    private final BooleanCondition a;
+    private final BooleanCondition b;
+
+    Or(BooleanCondition a, BooleanCondition b) {
+      this.a = a;
+      this.b = b;
+    }
+
+    @Override
+    public boolean value() {
+      if (evaluatesTriviallyToExpectedValue(a, true)
+          || evaluatesTriviallyToExpectedValue(b, true)) {
+        return true;
+      }
+      return a.value() || b.value();
+    }
+
+    @Override
+    public <T> Iterable<T> children(Class<T> type) {
+      return Iterables.concat(a.children(type), b.children(type));
+    }
+
+    @Override
+    public BooleanCondition reduce() {
+      if (evaluatesTrivially()) {
+        return Value.valueOf(value());
+      }
+      return new Or(a.reduce(), b.reduce());
+    }
+
+    @Override
+    public int hashCode() {
+      return a.hashCode() * 31 + b.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object other) {
+      if (other instanceof Or) {
+        Or o = (Or) other;
+        return a.equals(o.a) && b.equals(o.b);
+      }
+      return false;
+    }
+
+    @Override
+    public String toString() {
+      return "(" + maybeTrim(a, getClass()) + " || " + maybeTrim(a, getClass()) + ")";
+    }
+
+    @Override
+    protected boolean evaluatesTrivially() {
+      return evaluatesTriviallyToExpectedValue(a, true)
+          || evaluatesTriviallyToExpectedValue(b, true)
+          || (a.evaluatesTrivially() && b.evaluatesTrivially());
+    }
+  }
+
+  private static final class Not extends BooleanCondition {
+    private final BooleanCondition cond;
+
+    Not(BooleanCondition bc) {
+      cond = bc;
+    }
+
+    @Override
+    public boolean value() {
+      return !cond.value();
+    }
+
+    @Override
+    public <T> Iterable<T> children(Class<T> type) {
+      return cond.children(type);
+    }
+
+    @Override
+    public BooleanCondition reduce() {
+      if (evaluatesTrivially()) {
+        return Value.valueOf(value());
+      }
+      return this;
+    }
+
+    @Override
+    public int hashCode() {
+      return cond.hashCode() * 31;
+    }
+
+    @Override
+    public boolean equals(Object other) {
+      return other instanceof Not ? cond.equals(((Not) other).cond) : false;
+    }
+
+    @Override
+    public String toString() {
+      return "!" + cond;
+    }
+
+    @Override
+    protected boolean evaluatesTrivially() {
+      return cond.evaluatesTrivially();
+    }
+  }
+
+  private static final class Value extends BooleanCondition {
+    private final boolean value;
+
+    Value(boolean v) {
+      value = v;
+    }
+
+    @Override
+    public boolean value() {
+      return value;
+    }
+
+    @Override
+    public <T> Iterable<T> children(Class<T> type) {
+      return Collections.emptyList();
+    }
+
+    @Override
+    public BooleanCondition reduce() {
+      return this;
+    }
+
+    @Override
+    public int hashCode() {
+      return value ? 1 : 0;
+    }
+
+    @Override
+    public boolean equals(Object other) {
+      return other instanceof Value ? value == ((Value) other).value : false;
+    }
+
+    @Override
+    public String toString() {
+      return Boolean.toString(value);
+    }
+
+    @Override
+    protected boolean evaluatesTrivially() {
+      return true;
+    }
+  }
+
+  /**
+   * Helper for use in toString methods. Remove leading '(' and trailing ')' if the type is the same
+   * as the parent.
+   */
+  static String maybeTrim(BooleanCondition cond, Class<? extends BooleanCondition> type) {
+    String s = cond.toString();
+    if (cond.getClass() == type
+        && s.length() > 2
+        && s.charAt(0) == '('
+        && s.charAt(s.length() - 1) == ')') {
+      s = s.substring(1, s.length() - 1);
+    }
+    return s;
+  }
+
+  private static boolean evaluatesTriviallyToExpectedValue(
+      BooleanCondition cond, boolean expectedValue) {
+    return cond.evaluatesTrivially() && (cond.value() == expectedValue);
+  }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/conditions/PrivateInternals_BooleanCondition.java b/java/com/google/gerrit/extensions/conditions/PrivateInternals_BooleanCondition.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/conditions/PrivateInternals_BooleanCondition.java
rename to java/com/google/gerrit/extensions/conditions/PrivateInternals_BooleanCondition.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/CapabilityDefinition.java b/java/com/google/gerrit/extensions/config/CapabilityDefinition.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/CapabilityDefinition.java
rename to java/com/google/gerrit/extensions/config/CapabilityDefinition.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/CloneCommand.java b/java/com/google/gerrit/extensions/config/CloneCommand.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/CloneCommand.java
rename to java/com/google/gerrit/extensions/config/CloneCommand.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/DownloadCommand.java b/java/com/google/gerrit/extensions/config/DownloadCommand.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/DownloadCommand.java
rename to java/com/google/gerrit/extensions/config/DownloadCommand.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/DownloadScheme.java b/java/com/google/gerrit/extensions/config/DownloadScheme.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/DownloadScheme.java
rename to java/com/google/gerrit/extensions/config/DownloadScheme.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/ExternalIncludedIn.java b/java/com/google/gerrit/extensions/config/ExternalIncludedIn.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/ExternalIncludedIn.java
rename to java/com/google/gerrit/extensions/config/ExternalIncludedIn.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/FactoryModule.java b/java/com/google/gerrit/extensions/config/FactoryModule.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/FactoryModule.java
rename to java/com/google/gerrit/extensions/config/FactoryModule.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/AccountIndexedListener.java b/java/com/google/gerrit/extensions/events/AccountIndexedListener.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/AccountIndexedListener.java
rename to java/com/google/gerrit/extensions/events/AccountIndexedListener.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/AgreementSignupListener.java b/java/com/google/gerrit/extensions/events/AgreementSignupListener.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/AgreementSignupListener.java
rename to java/com/google/gerrit/extensions/events/AgreementSignupListener.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/AssigneeChangedListener.java b/java/com/google/gerrit/extensions/events/AssigneeChangedListener.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/AssigneeChangedListener.java
rename to java/com/google/gerrit/extensions/events/AssigneeChangedListener.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ChangeAbandonedListener.java b/java/com/google/gerrit/extensions/events/ChangeAbandonedListener.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ChangeAbandonedListener.java
rename to java/com/google/gerrit/extensions/events/ChangeAbandonedListener.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ChangeDeletedListener.java b/java/com/google/gerrit/extensions/events/ChangeDeletedListener.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ChangeDeletedListener.java
rename to java/com/google/gerrit/extensions/events/ChangeDeletedListener.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ChangeEvent.java b/java/com/google/gerrit/extensions/events/ChangeEvent.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ChangeEvent.java
rename to java/com/google/gerrit/extensions/events/ChangeEvent.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ChangeIndexedListener.java b/java/com/google/gerrit/extensions/events/ChangeIndexedListener.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ChangeIndexedListener.java
rename to java/com/google/gerrit/extensions/events/ChangeIndexedListener.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ChangeMergedListener.java b/java/com/google/gerrit/extensions/events/ChangeMergedListener.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ChangeMergedListener.java
rename to java/com/google/gerrit/extensions/events/ChangeMergedListener.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ChangeRestoredListener.java b/java/com/google/gerrit/extensions/events/ChangeRestoredListener.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ChangeRestoredListener.java
rename to java/com/google/gerrit/extensions/events/ChangeRestoredListener.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ChangeRevertedListener.java b/java/com/google/gerrit/extensions/events/ChangeRevertedListener.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ChangeRevertedListener.java
rename to java/com/google/gerrit/extensions/events/ChangeRevertedListener.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/CommentAddedListener.java b/java/com/google/gerrit/extensions/events/CommentAddedListener.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/CommentAddedListener.java
rename to java/com/google/gerrit/extensions/events/CommentAddedListener.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/GarbageCollectorListener.java b/java/com/google/gerrit/extensions/events/GarbageCollectorListener.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/GarbageCollectorListener.java
rename to java/com/google/gerrit/extensions/events/GarbageCollectorListener.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/GerritEvent.java b/java/com/google/gerrit/extensions/events/GerritEvent.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/GerritEvent.java
rename to java/com/google/gerrit/extensions/events/GerritEvent.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/GitReferenceUpdatedListener.java b/java/com/google/gerrit/extensions/events/GitReferenceUpdatedListener.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/GitReferenceUpdatedListener.java
rename to java/com/google/gerrit/extensions/events/GitReferenceUpdatedListener.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/GroupIndexedListener.java b/java/com/google/gerrit/extensions/events/GroupIndexedListener.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/GroupIndexedListener.java
rename to java/com/google/gerrit/extensions/events/GroupIndexedListener.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/HashtagsEditedListener.java b/java/com/google/gerrit/extensions/events/HashtagsEditedListener.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/HashtagsEditedListener.java
rename to java/com/google/gerrit/extensions/events/HashtagsEditedListener.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/HeadUpdatedListener.java b/java/com/google/gerrit/extensions/events/HeadUpdatedListener.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/HeadUpdatedListener.java
rename to java/com/google/gerrit/extensions/events/HeadUpdatedListener.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/LifecycleListener.java b/java/com/google/gerrit/extensions/events/LifecycleListener.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/LifecycleListener.java
rename to java/com/google/gerrit/extensions/events/LifecycleListener.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/NewProjectCreatedListener.java b/java/com/google/gerrit/extensions/events/NewProjectCreatedListener.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/NewProjectCreatedListener.java
rename to java/com/google/gerrit/extensions/events/NewProjectCreatedListener.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/PluginEventListener.java b/java/com/google/gerrit/extensions/events/PluginEventListener.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/PluginEventListener.java
rename to java/com/google/gerrit/extensions/events/PluginEventListener.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/PrivateStateChangedListener.java b/java/com/google/gerrit/extensions/events/PrivateStateChangedListener.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/PrivateStateChangedListener.java
rename to java/com/google/gerrit/extensions/events/PrivateStateChangedListener.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ProjectDeletedListener.java b/java/com/google/gerrit/extensions/events/ProjectDeletedListener.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ProjectDeletedListener.java
rename to java/com/google/gerrit/extensions/events/ProjectDeletedListener.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ProjectEvent.java b/java/com/google/gerrit/extensions/events/ProjectEvent.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ProjectEvent.java
rename to java/com/google/gerrit/extensions/events/ProjectEvent.java
diff --git a/java/com/google/gerrit/extensions/events/ProjectIndexedListener.java b/java/com/google/gerrit/extensions/events/ProjectIndexedListener.java
new file mode 100644
index 0000000..93a610b
--- /dev/null
+++ b/java/com/google/gerrit/extensions/events/ProjectIndexedListener.java
@@ -0,0 +1,28 @@
+// Copyright (C) 2017 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.google.gerrit.extensions.events;
+
+import com.google.gerrit.extensions.annotations.ExtensionPoint;
+
+/** Notified whenever a project is indexed */
+@ExtensionPoint
+public interface ProjectIndexedListener {
+  /**
+   * Invoked when a project is indexed
+   *
+   * @param project name of the project
+   */
+  void onProjectIndexed(String project);
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ReviewerAddedListener.java b/java/com/google/gerrit/extensions/events/ReviewerAddedListener.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ReviewerAddedListener.java
rename to java/com/google/gerrit/extensions/events/ReviewerAddedListener.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ReviewerDeletedListener.java b/java/com/google/gerrit/extensions/events/ReviewerDeletedListener.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/ReviewerDeletedListener.java
rename to java/com/google/gerrit/extensions/events/ReviewerDeletedListener.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/RevisionCreatedListener.java b/java/com/google/gerrit/extensions/events/RevisionCreatedListener.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/RevisionCreatedListener.java
rename to java/com/google/gerrit/extensions/events/RevisionCreatedListener.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/RevisionEvent.java b/java/com/google/gerrit/extensions/events/RevisionEvent.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/RevisionEvent.java
rename to java/com/google/gerrit/extensions/events/RevisionEvent.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/TopicEditedListener.java b/java/com/google/gerrit/extensions/events/TopicEditedListener.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/TopicEditedListener.java
rename to java/com/google/gerrit/extensions/events/TopicEditedListener.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/UsageDataPublishedListener.java b/java/com/google/gerrit/extensions/events/UsageDataPublishedListener.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/UsageDataPublishedListener.java
rename to java/com/google/gerrit/extensions/events/UsageDataPublishedListener.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/VoteDeletedListener.java b/java/com/google/gerrit/extensions/events/VoteDeletedListener.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/VoteDeletedListener.java
rename to java/com/google/gerrit/extensions/events/VoteDeletedListener.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/WorkInProgressStateChangedListener.java b/java/com/google/gerrit/extensions/events/WorkInProgressStateChangedListener.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/events/WorkInProgressStateChangedListener.java
rename to java/com/google/gerrit/extensions/events/WorkInProgressStateChangedListener.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/persistence/DataSourceInterceptor.java b/java/com/google/gerrit/extensions/persistence/DataSourceInterceptor.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/persistence/DataSourceInterceptor.java
rename to java/com/google/gerrit/extensions/persistence/DataSourceInterceptor.java
diff --git a/java/com/google/gerrit/extensions/registration/DynamicItem.java b/java/com/google/gerrit/extensions/registration/DynamicItem.java
new file mode 100644
index 0000000..67982d9
--- /dev/null
+++ b/java/com/google/gerrit/extensions/registration/DynamicItem.java
@@ -0,0 +1,257 @@
+// Copyright (C) 2012 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.google.gerrit.extensions.registration;
+
+import com.google.gerrit.common.Nullable;
+import com.google.inject.Binder;
+import com.google.inject.Key;
+import com.google.inject.Provider;
+import com.google.inject.ProvisionException;
+import com.google.inject.Scopes;
+import com.google.inject.TypeLiteral;
+import com.google.inject.binder.LinkedBindingBuilder;
+import com.google.inject.util.Providers;
+import com.google.inject.util.Types;
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * A single item that can be modified as plugins reload.
+ *
+ * <p>DynamicItems are always mapped as singletons in Guice. Items store a Provider internally, and
+ * resolve the provider to an instance on demand. This enables registrations to decide between
+ * singleton and non-singleton members. If multiple plugins try to provide the same Provider, an
+ * exception is thrown.
+ */
+public class DynamicItem<T> {
+  /**
+   * Declare a singleton {@code DynamicItem<T>} with a binder.
+   *
+   * <p>Items must be defined in a Guice module before they can be bound:
+   *
+   * <pre>
+   *   DynamicItem.itemOf(binder(), Interface.class);
+   *   DynamicItem.bind(binder(), Interface.class).to(Impl.class);
+   * </pre>
+   *
+   * @param binder a new binder created in the module.
+   * @param member type of entry to store.
+   */
+  public static <T> void itemOf(Binder binder, Class<T> member) {
+    itemOf(binder, TypeLiteral.get(member));
+  }
+
+  /**
+   * Declare a singleton {@code DynamicItem<T>} with a binder.
+   *
+   * <p>Items must be defined in a Guice module before they can be bound:
+   *
+   * <pre>
+   *   DynamicSet.itemOf(binder(), new TypeLiteral&lt;Thing&lt;Foo&gt;&gt;() {});
+   * </pre>
+   *
+   * @param binder a new binder created in the module.
+   * @param member type of entry to store.
+   */
+  public static <T> void itemOf(Binder binder, TypeLiteral<T> member) {
+    Key<DynamicItem<T>> key = keyFor(member);
+    binder.bind(key).toProvider(new DynamicItemProvider<>(member, key)).in(Scopes.SINGLETON);
+  }
+
+  /**
+   * Construct a single {@code DynamicItem<T>} with a fixed value.
+   *
+   * <p>Primarily useful for passing {@code DynamicItem}s to constructors in tests.
+   *
+   * @param member type of item.
+   * @param item item to store.
+   */
+  public static <T> DynamicItem<T> itemOf(Class<T> member, T item) {
+    return new DynamicItem<>(
+        keyFor(TypeLiteral.get(member)), Providers.of(item), PluginName.GERRIT);
+  }
+
+  @SuppressWarnings("unchecked")
+  private static <T> Key<DynamicItem<T>> keyFor(TypeLiteral<T> member) {
+    return (Key<DynamicItem<T>>)
+        Key.get(Types.newParameterizedType(DynamicItem.class, member.getType()));
+  }
+
+  /**
+   * Bind one implementation as the item using a unique annotation.
+   *
+   * @param binder a new binder created in the module.
+   * @param type type of entry to store.
+   * @return a binder to continue configuring the new item.
+   */
+  public static <T> LinkedBindingBuilder<T> bind(Binder binder, Class<T> type) {
+    return bind(binder, TypeLiteral.get(type));
+  }
+
+  /**
+   * Bind one implementation as the item.
+   *
+   * @param binder a new binder created in the module.
+   * @param type type of entry to store.
+   * @return a binder to continue configuring the new item.
+   */
+  public static <T> LinkedBindingBuilder<T> bind(Binder binder, TypeLiteral<T> type) {
+    return binder.bind(type);
+  }
+
+  private final Key<DynamicItem<T>> key;
+  private final AtomicReference<Extension<T>> ref;
+
+  DynamicItem(Key<DynamicItem<T>> key, Provider<T> provider, String pluginName) {
+    Extension<T> in = null;
+    if (provider != null) {
+      in = new Extension<>(pluginName, provider);
+    }
+    this.key = key;
+    this.ref = new AtomicReference<>(in);
+  }
+
+  @Nullable
+  public Extension<T> getEntry() {
+    return ref.get();
+  }
+
+  /**
+   * Get the configured item, or null.
+   *
+   * @return the configured item instance; null if no implementation has been bound to the item.
+   *     This is common if no plugin registered an implementation for the type.
+   */
+  @Nullable
+  public T get() {
+    Extension<T> item = ref.get();
+    return item != null ? item.get() : null;
+  }
+
+  /**
+   * Get the name of the plugin that has bound the configured item, or null.
+   *
+   * @return the name of the plugin that has bound the configured item; null if no implementation
+   *     has been bound to the item. This is common if no plugin registered an implementation for
+   *     the type.
+   */
+  @Nullable
+  public String getPluginName() {
+    Extension<T> item = ref.get();
+    return item != null ? item.getPluginName() : null;
+  }
+
+  /**
+   * Set the element to provide.
+   *
+   * @param item the item to use. Must not be null.
+   * @param pluginName the name of the plugin providing the item.
+   * @return handle to remove the item at a later point in time.
+   */
+  public RegistrationHandle set(T item, String pluginName) {
+    return set(Providers.of(item), pluginName);
+  }
+
+  /**
+   * Set the element to provide.
+   *
+   * @param impl the item to add to the collection. Must not be null.
+   * @param pluginName name of the source providing the implementation.
+   * @return handle to remove the item at a later point in time.
+   */
+  public RegistrationHandle set(Provider<T> impl, String pluginName) {
+    final Extension<T> item = new Extension<>(pluginName, impl);
+    Extension<T> old = null;
+    while (!ref.compareAndSet(old, item)) {
+      old = ref.get();
+      if (old != null && !PluginName.GERRIT.equals(old.getPluginName())) {
+        throw new ProvisionException(
+            String.format(
+                "%s already provided by %s, ignoring plugin %s",
+                key.getTypeLiteral(), old.getPluginName(), pluginName));
+      }
+    }
+
+    final Extension<T> defaultItem = old;
+    return new RegistrationHandle() {
+      @Override
+      public void remove() {
+        ref.compareAndSet(item, defaultItem);
+      }
+    };
+  }
+
+  /**
+   * Set the element that may be hot-replaceable in the future.
+   *
+   * @param key unique description from the item's Guice binding. This can be later obtained from
+   *     the registration handle to facilitate matching with the new equivalent instance during a
+   *     hot reload.
+   * @param impl the item to set as our value right now. Must not be null.
+   * @param pluginName the name of the plugin providing the item.
+   * @return a handle that can remove this item later, or hot-swap the item.
+   */
+  public ReloadableRegistrationHandle<T> set(Key<T> key, Provider<T> impl, String pluginName) {
+    final Extension<T> item = new Extension<>(pluginName, impl);
+    Extension<T> old = null;
+    while (!ref.compareAndSet(old, item)) {
+      old = ref.get();
+      if (old != null
+          && !PluginName.GERRIT.equals(old.getPluginName())
+          && !pluginName.equals(old.getPluginName())) {
+        // We allow to replace:
+        // 1. Gerrit core items, e.g. websession cache
+        //    can be replaced by plugin implementation
+        // 2. Reload of current plugin
+        throw new ProvisionException(
+            String.format(
+                "%s already provided by %s, ignoring plugin %s",
+                this.key.getTypeLiteral(), old.getPluginName(), pluginName));
+      }
+    }
+    return new ReloadableHandle(key, item, old);
+  }
+
+  private class ReloadableHandle implements ReloadableRegistrationHandle<T> {
+    private final Key<T> handleKey;
+    private final Extension<T> item;
+    private final Extension<T> defaultItem;
+
+    ReloadableHandle(Key<T> handleKey, Extension<T> item, Extension<T> defaultItem) {
+      this.handleKey = handleKey;
+      this.item = item;
+      this.defaultItem = defaultItem;
+    }
+
+    @Override
+    public Key<T> getKey() {
+      return handleKey;
+    }
+
+    @Override
+    public void remove() {
+      ref.compareAndSet(item, defaultItem);
+    }
+
+    @Override
+    @Nullable
+    public ReloadableHandle replace(Key<T> newKey, Provider<T> newItem) {
+      Extension<T> n = new Extension<>(item.getPluginName(), newItem);
+      if (ref.compareAndSet(item, n)) {
+        return new ReloadableHandle(newKey, n, defaultItem);
+      }
+      return null;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/extensions/registration/DynamicItemProvider.java b/java/com/google/gerrit/extensions/registration/DynamicItemProvider.java
new file mode 100644
index 0000000..d8dd1f9
--- /dev/null
+++ b/java/com/google/gerrit/extensions/registration/DynamicItemProvider.java
@@ -0,0 +1,56 @@
+// Copyright (C) 2012 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.google.gerrit.extensions.registration;
+
+import com.google.inject.Binding;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import com.google.inject.Provider;
+import com.google.inject.ProvisionException;
+import com.google.inject.TypeLiteral;
+import java.util.List;
+
+class DynamicItemProvider<T> implements Provider<DynamicItem<T>> {
+  private final TypeLiteral<T> type;
+  private final Key<DynamicItem<T>> key;
+
+  @Inject private Injector injector;
+
+  DynamicItemProvider(TypeLiteral<T> type, Key<DynamicItem<T>> key) {
+    this.type = type;
+    this.key = key;
+  }
+
+  @Override
+  public DynamicItem<T> get() {
+    return new DynamicItem<>(key, find(injector, type), PluginName.GERRIT);
+  }
+
+  private static <T> Provider<T> find(Injector src, TypeLiteral<T> type) {
+    List<Binding<T>> bindings = src.findBindingsByType(type);
+    if (bindings != null && bindings.size() == 1) {
+      return bindings.get(0).getProvider();
+    } else if (bindings != null && bindings.size() > 1) {
+      throw new ProvisionException(
+          String.format(
+              "Multiple providers bound for DynamicItem<%s>\n"
+                  + "This is not allowed; check the server configuration.",
+              type));
+    } else {
+      return null;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/extensions/registration/DynamicMap.java b/java/com/google/gerrit/extensions/registration/DynamicMap.java
new file mode 100644
index 0000000..48b1279
--- /dev/null
+++ b/java/com/google/gerrit/extensions/registration/DynamicMap.java
@@ -0,0 +1,191 @@
+// Copyright (C) 2012 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.google.gerrit.extensions.registration;
+
+import com.google.inject.Binder;
+import com.google.inject.Key;
+import com.google.inject.Provider;
+import com.google.inject.ProvisionException;
+import com.google.inject.Scopes;
+import com.google.inject.TypeLiteral;
+import com.google.inject.util.Types;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.SortedSet;
+import java.util.TreeMap;
+import java.util.TreeSet;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+/**
+ * A map of members that can be modified as plugins reload.
+ *
+ * <p>Maps index their members by plugin name and export name.
+ *
+ * <p>DynamicMaps are always mapped as singletons in Guice. Maps store Providers internally, and
+ * resolve the provider to an instance on demand. This enables registrations to decide between
+ * singleton and non-singleton members.
+ */
+public abstract class DynamicMap<T> implements Iterable<Extension<T>> {
+  /**
+   * Declare a singleton {@code DynamicMap<T>} with a binder.
+   *
+   * <p>Maps must be defined in a Guice module before they can be bound:
+   *
+   * <pre>
+   * DynamicMap.mapOf(binder(), Interface.class);
+   * bind(Interface.class)
+   *   .annotatedWith(Exports.named(&quot;foo&quot;))
+   *   .to(Impl.class);
+   * </pre>
+   *
+   * @param binder a new binder created in the module.
+   * @param member type of value in the map.
+   */
+  public static <T> void mapOf(Binder binder, Class<T> member) {
+    mapOf(binder, TypeLiteral.get(member));
+  }
+
+  /**
+   * Declare a singleton {@code DynamicMap<T>} with a binder.
+   *
+   * <p>Maps must be defined in a Guice module before they can be bound:
+   *
+   * <pre>
+   * DynamicMap.mapOf(binder(), new TypeLiteral&lt;Thing&lt;Bar&gt;&gt;(){});
+   * bind(new TypeLiteral&lt;Thing&lt;Bar&gt;&gt;() {})
+   *   .annotatedWith(Exports.named(&quot;foo&quot;))
+   *   .to(Impl.class);
+   * </pre>
+   *
+   * @param binder a new binder created in the module.
+   * @param member type of value in the map.
+   */
+  public static <T> void mapOf(Binder binder, TypeLiteral<T> member) {
+    @SuppressWarnings("unchecked")
+    Key<DynamicMap<T>> key =
+        (Key<DynamicMap<T>>)
+            Key.get(Types.newParameterizedType(DynamicMap.class, member.getType()));
+    binder.bind(key).toProvider(new DynamicMapProvider<>(member)).in(Scopes.SINGLETON);
+  }
+
+  /** Returns an empty DynamicMap instance * */
+  public static <T> DynamicMap<T> emptyMap() {
+    return new PrivateInternals_DynamicMapImpl<>();
+  }
+
+  final ConcurrentMap<NamePair, Provider<T>> items;
+
+  DynamicMap() {
+    items =
+        new ConcurrentHashMap<>(
+            16 /* initial size */,
+            0.75f /* load factor */,
+            1 /* concurrency level of 1, load/unload is single threaded */);
+  }
+
+  /**
+   * Lookup an implementation by name.
+   *
+   * @param pluginName local name of the plugin providing the item.
+   * @param exportName name the plugin exports the item as.
+   * @return the implementation. Null if the plugin is not running, or if the plugin does not export
+   *     this name.
+   * @throws ProvisionException if the registered provider is unable to obtain an instance of the
+   *     requested implementation.
+   */
+  public T get(String pluginName, String exportName) throws ProvisionException {
+    Provider<T> p = items.get(new NamePair(pluginName, exportName));
+    return p != null ? p.get() : null;
+  }
+
+  /**
+   * Get the names of all running plugins supplying this type.
+   *
+   * @return sorted set of active plugins that supply at least one item.
+   */
+  public SortedSet<String> plugins() {
+    SortedSet<String> r = new TreeSet<>();
+    for (NamePair p : items.keySet()) {
+      r.add(p.pluginName);
+    }
+    return Collections.unmodifiableSortedSet(r);
+  }
+
+  /**
+   * Get the items exported by a single plugin.
+   *
+   * @param pluginName name of the plugin.
+   * @return items exported by a plugin, keyed by the export name.
+   */
+  public SortedMap<String, Provider<T>> byPlugin(String pluginName) {
+    SortedMap<String, Provider<T>> r = new TreeMap<>();
+    for (Map.Entry<NamePair, Provider<T>> e : items.entrySet()) {
+      if (e.getKey().pluginName.equals(pluginName)) {
+        r.put(e.getKey().exportName, e.getValue());
+      }
+    }
+    return Collections.unmodifiableSortedMap(r);
+  }
+
+  /** Iterate through all entries in an undefined order. */
+  @Override
+  public Iterator<Extension<T>> iterator() {
+    final Iterator<Map.Entry<NamePair, Provider<T>>> i = items.entrySet().iterator();
+    return new Iterator<Extension<T>>() {
+      @Override
+      public boolean hasNext() {
+        return i.hasNext();
+      }
+
+      @Override
+      public Extension<T> next() {
+        Map.Entry<NamePair, Provider<T>> e = i.next();
+        return new Extension<>(e.getKey().pluginName, e.getKey().exportName, e.getValue());
+      }
+
+      @Override
+      public void remove() {
+        throw new UnsupportedOperationException();
+      }
+    };
+  }
+
+  static class NamePair {
+    private final String pluginName;
+    private final String exportName;
+
+    NamePair(String pn, String en) {
+      pluginName = pn;
+      exportName = en;
+    }
+
+    @Override
+    public int hashCode() {
+      return pluginName.hashCode() * 31 + exportName.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object other) {
+      if (other instanceof NamePair) {
+        NamePair np = (NamePair) other;
+        return pluginName.equals(np.pluginName) && exportName.equals(np.exportName);
+      }
+      return false;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/extensions/registration/DynamicMapProvider.java b/java/com/google/gerrit/extensions/registration/DynamicMapProvider.java
new file mode 100644
index 0000000..9d96131
--- /dev/null
+++ b/java/com/google/gerrit/extensions/registration/DynamicMapProvider.java
@@ -0,0 +1,46 @@
+// Copyright (C) 2012 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.google.gerrit.extensions.registration;
+
+import com.google.inject.Binding;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Provider;
+import com.google.inject.TypeLiteral;
+import java.util.List;
+
+class DynamicMapProvider<T> implements Provider<DynamicMap<T>> {
+  private final TypeLiteral<T> type;
+
+  @Inject private Injector injector;
+
+  DynamicMapProvider(TypeLiteral<T> type) {
+    this.type = type;
+  }
+
+  @Override
+  public DynamicMap<T> get() {
+    PrivateInternals_DynamicMapImpl<T> m = new PrivateInternals_DynamicMapImpl<>();
+    List<Binding<T>> bindings = injector.findBindingsByType(type);
+    if (bindings != null) {
+      for (Binding<T> b : bindings) {
+        if (b.getKey().getAnnotation() != null) {
+          m.put(PluginName.GERRIT, b.getKey(), b.getProvider());
+        }
+      }
+    }
+    return m;
+  }
+}
diff --git a/java/com/google/gerrit/extensions/registration/DynamicSet.java b/java/com/google/gerrit/extensions/registration/DynamicSet.java
new file mode 100644
index 0000000..8c2e566
--- /dev/null
+++ b/java/com/google/gerrit/extensions/registration/DynamicSet.java
@@ -0,0 +1,326 @@
+// Copyright (C) 2012 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.google.gerrit.extensions.registration;
+
+import static com.google.common.collect.ImmutableSet.toImmutableSet;
+import static com.google.common.collect.ImmutableSortedSet.toImmutableSortedSet;
+import static java.util.Comparator.naturalOrder;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableSortedSet;
+import com.google.inject.Binder;
+import com.google.inject.Key;
+import com.google.inject.Provider;
+import com.google.inject.Scopes;
+import com.google.inject.TypeLiteral;
+import com.google.inject.binder.LinkedBindingBuilder;
+import com.google.inject.internal.UniqueAnnotations;
+import com.google.inject.name.Named;
+import com.google.inject.util.Providers;
+import com.google.inject.util.Types;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * A set of members that can be modified as plugins reload.
+ *
+ * <p>DynamicSets are always mapped as singletons in Guice. Sets store Providers internally, and
+ * resolve the provider to an instance on demand. This enables registrations to decide between
+ * singleton and non-singleton members.
+ */
+public class DynamicSet<T> implements Iterable<T> {
+  /**
+   * Declare a singleton {@code DynamicSet<T>} with a binder.
+   *
+   * <p>Sets must be defined in a Guice module before they can be bound:
+   *
+   * <pre>
+   *   DynamicSet.setOf(binder(), Interface.class);
+   *   DynamicSet.bind(binder(), Interface.class).to(Impl.class);
+   * </pre>
+   *
+   * @param binder a new binder created in the module.
+   * @param member type of entry in the set.
+   */
+  public static <T> void setOf(Binder binder, Class<T> member) {
+    binder.disableCircularProxies();
+    setOf(binder, TypeLiteral.get(member));
+  }
+
+  /**
+   * Declare a singleton {@code DynamicSet<T>} with a binder.
+   *
+   * <p>Sets must be defined in a Guice module before they can be bound:
+   *
+   * <pre>
+   *   DynamicSet.setOf(binder(), new TypeLiteral&lt;Thing&lt;Foo&gt;&gt;() {});
+   * </pre>
+   *
+   * @param binder a new binder created in the module.
+   * @param member type of entry in the set.
+   */
+  public static <T> void setOf(Binder binder, TypeLiteral<T> member) {
+    @SuppressWarnings("unchecked")
+    Key<DynamicSet<T>> key =
+        (Key<DynamicSet<T>>)
+            Key.get(Types.newParameterizedType(DynamicSet.class, member.getType()));
+    binder.disableCircularProxies();
+    binder.bind(key).toProvider(new DynamicSetProvider<>(member)).in(Scopes.SINGLETON);
+  }
+
+  /**
+   * Bind one implementation into the set using a unique annotation.
+   *
+   * @param binder a new binder created in the module.
+   * @param type type of entries in the set.
+   * @return a binder to continue configuring the new set member.
+   */
+  public static <T> LinkedBindingBuilder<T> bind(Binder binder, Class<T> type) {
+    binder.disableCircularProxies();
+    return bind(binder, TypeLiteral.get(type));
+  }
+
+  /**
+   * Bind one implementation into the set using a unique annotation.
+   *
+   * @param binder a new binder created in the module.
+   * @param type type of entries in the set.
+   * @return a binder to continue configuring the new set member.
+   */
+  public static <T> LinkedBindingBuilder<T> bind(Binder binder, TypeLiteral<T> type) {
+    binder.disableCircularProxies();
+    return binder.bind(type).annotatedWith(UniqueAnnotations.create());
+  }
+
+  /**
+   * Bind a named implementation into the set.
+   *
+   * @param binder a new binder created in the module.
+   * @param type type of entries in the set.
+   * @param name {@code @Named} annotation to apply instead of a unique annotation.
+   * @return a binder to continue configuring the new set member.
+   */
+  public static <T> LinkedBindingBuilder<T> bind(Binder binder, Class<T> type, Named name) {
+    binder.disableCircularProxies();
+    return bind(binder, TypeLiteral.get(type));
+  }
+
+  /**
+   * Bind a named implementation into the set.
+   *
+   * @param binder a new binder created in the module.
+   * @param type type of entries in the set.
+   * @param name {@code @Named} annotation to apply instead of a unique annotation.
+   * @return a binder to continue configuring the new set member.
+   */
+  public static <T> LinkedBindingBuilder<T> bind(Binder binder, TypeLiteral<T> type, Named name) {
+    binder.disableCircularProxies();
+    return binder.bind(type).annotatedWith(name);
+  }
+
+  public static <T> DynamicSet<T> emptySet() {
+    return new DynamicSet<>(Collections.<AtomicReference<Extension<T>>>emptySet());
+  }
+
+  private final CopyOnWriteArrayList<AtomicReference<Extension<T>>> items;
+
+  DynamicSet(Collection<AtomicReference<Extension<T>>> base) {
+    items = new CopyOnWriteArrayList<>(base);
+  }
+
+  public DynamicSet() {
+    this(Collections.emptySet());
+  }
+
+  @Override
+  public Iterator<T> iterator() {
+    Iterator<Extension<T>> entryIterator = entries().iterator();
+    return new Iterator<T>() {
+      @Override
+      public boolean hasNext() {
+        return entryIterator.hasNext();
+      }
+
+      @Override
+      public T next() {
+        Extension<T> next = entryIterator.next();
+        return next != null ? next.getProvider().get() : null;
+      }
+    };
+  }
+
+  public Iterable<Extension<T>> entries() {
+    final Iterator<AtomicReference<Extension<T>>> itr = items.iterator();
+    return new Iterable<Extension<T>>() {
+      @Override
+      public Iterator<Extension<T>> iterator() {
+        return new Iterator<Extension<T>>() {
+          private Extension<T> next;
+
+          @Override
+          public boolean hasNext() {
+            while (next == null && itr.hasNext()) {
+              Extension<T> p = itr.next().get();
+              if (p != null) {
+                next = p;
+              }
+            }
+            return next != null;
+          }
+
+          @Override
+          public Extension<T> next() {
+            if (hasNext()) {
+              Extension<T> result = next;
+              next = null;
+              return result;
+            }
+            throw new NoSuchElementException();
+          }
+
+          @Override
+          public void remove() {
+            throw new UnsupportedOperationException();
+          }
+        };
+      }
+    };
+  }
+
+  /**
+   * Returns {@code true} if this set contains the given item.
+   *
+   * @param item item to check whether or not it is contained.
+   * @return {@code true} if this set contains the given item.
+   */
+  public boolean contains(T item) {
+    Iterator<T> iterator = iterator();
+    while (iterator.hasNext()) {
+      T candidate = iterator.next();
+      if (candidate == item) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Get the names of all running plugins supplying this type.
+   *
+   * @return sorted set of active plugins that supply at least one item.
+   */
+  public ImmutableSortedSet<String> plugins() {
+    return items.stream()
+        .map(i -> i.get().getPluginName())
+        .collect(toImmutableSortedSet(naturalOrder()));
+  }
+
+  /**
+   * Get the items exported by a single plugin.
+   *
+   * @param pluginName name of the plugin.
+   * @return items exported by a plugin.
+   */
+  public ImmutableSet<Provider<T>> byPlugin(String pluginName) {
+    return items.stream()
+        .filter(i -> i.get().getPluginName().equals(pluginName))
+        .map(i -> i.get().getProvider())
+        .collect(toImmutableSet());
+  }
+
+  /**
+   * Add one new element to the set.
+   *
+   * @param item the item to add to the collection. Must not be null.
+   * @return handle to remove the item at a later point in time.
+   */
+  public RegistrationHandle add(String pluginName, T item) {
+    return add(pluginName, Providers.of(item));
+  }
+
+  /**
+   * Add one new element to the set.
+   *
+   * @param item the item to add to the collection. Must not be null.
+   * @return handle to remove the item at a later point in time.
+   */
+  public RegistrationHandle add(String pluginName, Provider<T> item) {
+    final AtomicReference<Extension<T>> ref =
+        new AtomicReference<>(new Extension<>(pluginName, item));
+    items.add(ref);
+    return new RegistrationHandle() {
+      @Override
+      public void remove() {
+        if (ref.compareAndSet(ref.get(), null)) {
+          items.remove(ref);
+        }
+      }
+    };
+  }
+
+  /**
+   * Add one new element that may be hot-replaceable in the future.
+   *
+   * @param pluginName unique name of the plugin providing the item.
+   * @param key unique description from the item's Guice binding. This can be later obtained from
+   *     the registration handle to facilitate matching with the new equivalent instance during a
+   *     hot reload.
+   * @param item the item to add to the collection right now. Must not be null.
+   * @return a handle that can remove this item later, or hot-swap the item without it ever leaving
+   *     the collection.
+   */
+  public ReloadableRegistrationHandle<T> add(String pluginName, Key<T> key, Provider<T> item) {
+    AtomicReference<Extension<T>> ref = new AtomicReference<>(new Extension<>(pluginName, item));
+    items.add(ref);
+    return new ReloadableHandle(ref, key, ref.get());
+  }
+
+  private class ReloadableHandle implements ReloadableRegistrationHandle<T> {
+    private final AtomicReference<Extension<T>> ref;
+    private final Key<T> key;
+    private final Extension<T> item;
+
+    ReloadableHandle(AtomicReference<Extension<T>> ref, Key<T> key, Extension<T> item) {
+      this.ref = ref;
+      this.key = key;
+      this.item = item;
+    }
+
+    @Override
+    public void remove() {
+      if (ref.compareAndSet(item, null)) {
+        items.remove(ref);
+      }
+    }
+
+    @Override
+    public Key<T> getKey() {
+      return key;
+    }
+
+    @Override
+    public ReloadableHandle replace(Key<T> newKey, Provider<T> newItem) {
+      Extension<T> n = new Extension<>(item.getPluginName(), newItem);
+      if (ref.compareAndSet(item, n)) {
+        return new ReloadableHandle(ref, newKey, n);
+      }
+      return null;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/extensions/registration/DynamicSetProvider.java b/java/com/google/gerrit/extensions/registration/DynamicSetProvider.java
new file mode 100644
index 0000000..832933b
--- /dev/null
+++ b/java/com/google/gerrit/extensions/registration/DynamicSetProvider.java
@@ -0,0 +1,55 @@
+// Copyright (C) 2012 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.google.gerrit.extensions.registration;
+
+import com.google.inject.Binding;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Provider;
+import com.google.inject.TypeLiteral;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicReference;
+
+class DynamicSetProvider<T> implements Provider<DynamicSet<T>> {
+  private final TypeLiteral<T> type;
+
+  @Inject private Injector injector;
+
+  DynamicSetProvider(TypeLiteral<T> type) {
+    this.type = type;
+  }
+
+  @Override
+  public DynamicSet<T> get() {
+    return new DynamicSet<>(find(injector, type));
+  }
+
+  private static <T> List<AtomicReference<Extension<T>>> find(Injector src, TypeLiteral<T> type) {
+    List<Binding<T>> bindings = src.findBindingsByType(type);
+    int cnt = bindings != null ? bindings.size() : 0;
+    if (cnt == 0) {
+      return Collections.emptyList();
+    }
+    List<AtomicReference<Extension<T>>> r = new ArrayList<>(cnt);
+    for (Binding<T> b : bindings) {
+      if (b.getKey().getAnnotation() != null) {
+        r.add(new AtomicReference<>(new Extension<>(PluginName.GERRIT, b.getProvider())));
+      }
+    }
+    return r;
+  }
+}
diff --git a/java/com/google/gerrit/extensions/registration/Extension.java b/java/com/google/gerrit/extensions/registration/Extension.java
new file mode 100644
index 0000000..aaec201
--- /dev/null
+++ b/java/com/google/gerrit/extensions/registration/Extension.java
@@ -0,0 +1,61 @@
+// 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.
+
+package com.google.gerrit.extensions.registration;
+
+import com.google.gerrit.common.Nullable;
+import com.google.inject.Provider;
+
+/**
+ * An extension that is provided by a plugin.
+ *
+ * <p>Contains the name of the plugin that provides the extension, the extension point
+ * implementation and optionally the export name under which the extension was exported.
+ *
+ * <p>An export name is only available if this extension is an entry in a {@link DynamicMap}.
+ *
+ * @param <T> Type of extension point that this extension implements
+ */
+public class Extension<T> {
+  private final String pluginName;
+  private final @Nullable String exportName;
+  private final Provider<T> provider;
+
+  protected Extension(String pluginName, Provider<T> provider) {
+    this(pluginName, null, provider);
+  }
+
+  protected Extension(String pluginName, @Nullable String exportName, Provider<T> provider) {
+    this.pluginName = pluginName;
+    this.exportName = exportName;
+    this.provider = provider;
+  }
+
+  public String getPluginName() {
+    return pluginName;
+  }
+
+  @Nullable
+  public String getExportName() {
+    return exportName;
+  }
+
+  public Provider<T> getProvider() {
+    return provider;
+  }
+
+  public T get() {
+    return provider.get();
+  }
+}
diff --git a/java/com/google/gerrit/extensions/registration/PluginName.java b/java/com/google/gerrit/extensions/registration/PluginName.java
new file mode 100644
index 0000000..c110d45
--- /dev/null
+++ b/java/com/google/gerrit/extensions/registration/PluginName.java
@@ -0,0 +1,22 @@
+// 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.
+
+package com.google.gerrit.extensions.registration;
+
+public class PluginName {
+  /** Name that is used as plugin name if Gerrit core implements a plugin extension point. */
+  public static final String GERRIT = "gerrit";
+
+  private PluginName() {}
+}
diff --git a/java/com/google/gerrit/extensions/registration/PrivateInternals_DynamicMapImpl.java b/java/com/google/gerrit/extensions/registration/PrivateInternals_DynamicMapImpl.java
new file mode 100644
index 0000000..cef9e0c
--- /dev/null
+++ b/java/com/google/gerrit/extensions/registration/PrivateInternals_DynamicMapImpl.java
@@ -0,0 +1,95 @@
+// Copyright (C) 2012 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.google.gerrit.extensions.registration;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.gerrit.extensions.annotations.Export;
+import com.google.inject.Key;
+import com.google.inject.Provider;
+
+/** <b>DO NOT USE</b> */
+public class PrivateInternals_DynamicMapImpl<T> extends DynamicMap<T> {
+  PrivateInternals_DynamicMapImpl() {}
+
+  /**
+   * Store one new element into the map.
+   *
+   * @param pluginName unique name of the plugin providing the export.
+   * @param exportName name the plugin has exported the item as.
+   * @param item the item to add to the collection. Must not be null.
+   * @return handle to remove the item at a later point in time.
+   */
+  public RegistrationHandle put(String pluginName, String exportName, Provider<T> item) {
+    requireNonNull(item);
+    final NamePair key = new NamePair(pluginName, exportName);
+    items.put(key, item);
+    return new RegistrationHandle() {
+      @Override
+      public void remove() {
+        items.remove(key, item);
+      }
+    };
+  }
+
+  /**
+   * Store one new element that may be hot-replaceable in the future.
+   *
+   * @param pluginName unique name of the plugin providing the export.
+   * @param key unique description from the item's Guice binding. This can be later obtained from
+   *     the registration handle to facilitate matching with the new equivalent instance during a
+   *     hot reload. The key must use an {@link Export} annotation.
+   * @param item the item to add to the collection right now. Must not be null.
+   * @return a handle that can remove this item later, or hot-swap the item without it ever leaving
+   *     the collection.
+   */
+  public ReloadableRegistrationHandle<T> put(String pluginName, Key<T> key, Provider<T> item) {
+    requireNonNull(item);
+    String exportName = ((Export) key.getAnnotation()).value();
+    NamePair np = new NamePair(pluginName, exportName);
+    items.put(np, item);
+    return new ReloadableHandle(np, key, item);
+  }
+
+  private class ReloadableHandle implements ReloadableRegistrationHandle<T> {
+    private final NamePair np;
+    private final Key<T> key;
+    private final Provider<T> item;
+
+    ReloadableHandle(NamePair np, Key<T> key, Provider<T> item) {
+      this.np = np;
+      this.key = key;
+      this.item = item;
+    }
+
+    @Override
+    public void remove() {
+      items.remove(np, item);
+    }
+
+    @Override
+    public Key<T> getKey() {
+      return key;
+    }
+
+    @Override
+    public ReloadableHandle replace(Key<T> newKey, Provider<T> newItem) {
+      if (items.replace(np, item, newItem)) {
+        return new ReloadableHandle(np, newKey, newItem);
+      }
+      return null;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/extensions/registration/PrivateInternals_DynamicTypes.java b/java/com/google/gerrit/extensions/registration/PrivateInternals_DynamicTypes.java
new file mode 100644
index 0000000..fd31fcd
--- /dev/null
+++ b/java/com/google/gerrit/extensions/registration/PrivateInternals_DynamicTypes.java
@@ -0,0 +1,205 @@
+// Copyright (C) 2012 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.google.gerrit.extensions.registration;
+
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.inject.Binding;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import com.google.inject.TypeLiteral;
+import java.lang.reflect.ParameterizedType;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/** <b>DO NOT USE</b> */
+public class PrivateInternals_DynamicTypes {
+  public static Map<TypeLiteral<?>, DynamicItem<?>> dynamicItemsOf(Injector src) {
+    Map<TypeLiteral<?>, DynamicItem<?>> m = new HashMap<>();
+    for (Map.Entry<Key<?>, Binding<?>> e : src.getBindings().entrySet()) {
+      TypeLiteral<?> type = e.getKey().getTypeLiteral();
+      if (type.getRawType() == DynamicItem.class) {
+        ParameterizedType p = (ParameterizedType) type.getType();
+        m.put(
+            TypeLiteral.get(p.getActualTypeArguments()[0]),
+            (DynamicItem<?>) e.getValue().getProvider().get());
+      }
+    }
+    if (m.isEmpty()) {
+      return Collections.emptyMap();
+    }
+    return Collections.unmodifiableMap(m);
+  }
+
+  public static Map<TypeLiteral<?>, DynamicSet<?>> dynamicSetsOf(Injector src) {
+    Map<TypeLiteral<?>, DynamicSet<?>> m = new HashMap<>();
+    for (Map.Entry<Key<?>, Binding<?>> e : src.getBindings().entrySet()) {
+      TypeLiteral<?> type = e.getKey().getTypeLiteral();
+      if (type.getRawType() == DynamicSet.class) {
+        ParameterizedType p = (ParameterizedType) type.getType();
+        m.put(
+            TypeLiteral.get(p.getActualTypeArguments()[0]),
+            (DynamicSet<?>) e.getValue().getProvider().get());
+      }
+    }
+    if (m.isEmpty()) {
+      return Collections.emptyMap();
+    }
+    return Collections.unmodifiableMap(m);
+  }
+
+  public static Map<TypeLiteral<?>, DynamicMap<?>> dynamicMapsOf(Injector src) {
+    Map<TypeLiteral<?>, DynamicMap<?>> m = new HashMap<>();
+    for (Map.Entry<Key<?>, Binding<?>> e : src.getBindings().entrySet()) {
+      TypeLiteral<?> type = e.getKey().getTypeLiteral();
+      if (type.getRawType() == DynamicMap.class) {
+        ParameterizedType p = (ParameterizedType) type.getType();
+        m.put(
+            TypeLiteral.get(p.getActualTypeArguments()[0]),
+            (DynamicMap<?>) e.getValue().getProvider().get());
+      }
+    }
+    if (m.isEmpty()) {
+      return Collections.emptyMap();
+    }
+    return Collections.unmodifiableMap(m);
+  }
+
+  public static List<RegistrationHandle> attachItems(
+      Injector src, String pluginName, Map<TypeLiteral<?>, DynamicItem<?>> items) {
+    if (src == null || items == null || items.isEmpty()) {
+      return Collections.emptyList();
+    }
+
+    List<RegistrationHandle> handles = new ArrayList<>(4);
+    try {
+      for (Map.Entry<TypeLiteral<?>, DynamicItem<?>> e : items.entrySet()) {
+        @SuppressWarnings("unchecked")
+        TypeLiteral<Object> type = (TypeLiteral<Object>) e.getKey();
+
+        @SuppressWarnings("unchecked")
+        DynamicItem<Object> item = (DynamicItem<Object>) e.getValue();
+
+        for (Binding<Object> b : bindings(src, type)) {
+          handles.add(item.set(b.getKey(), b.getProvider(), pluginName));
+        }
+      }
+    } catch (RuntimeException | Error e) {
+      remove(handles);
+      throw e;
+    }
+    return handles;
+  }
+
+  public static List<RegistrationHandle> attachSets(
+      Injector src, String pluginName, Map<TypeLiteral<?>, DynamicSet<?>> sets) {
+    if (src == null || sets == null || sets.isEmpty()) {
+      return Collections.emptyList();
+    }
+
+    List<RegistrationHandle> handles = new ArrayList<>(4);
+    try {
+      for (Map.Entry<TypeLiteral<?>, DynamicSet<?>> e : sets.entrySet()) {
+        @SuppressWarnings("unchecked")
+        TypeLiteral<Object> type = (TypeLiteral<Object>) e.getKey();
+
+        @SuppressWarnings("unchecked")
+        DynamicSet<Object> set = (DynamicSet<Object>) e.getValue();
+
+        for (Binding<Object> b : bindings(src, type)) {
+          if (b.getKey().getAnnotation() != null) {
+            handles.add(set.add(pluginName, b.getKey(), b.getProvider()));
+          }
+        }
+      }
+    } catch (RuntimeException | Error e) {
+      remove(handles);
+      throw e;
+    }
+    return handles;
+  }
+
+  public static List<RegistrationHandle> attachMaps(
+      Injector src, String pluginName, Map<TypeLiteral<?>, DynamicMap<?>> maps) {
+    if (src == null || maps == null || maps.isEmpty()) {
+      return Collections.emptyList();
+    }
+
+    List<RegistrationHandle> handles = new ArrayList<>(4);
+    try {
+      for (Map.Entry<TypeLiteral<?>, DynamicMap<?>> e : maps.entrySet()) {
+        @SuppressWarnings("unchecked")
+        TypeLiteral<Object> type = (TypeLiteral<Object>) e.getKey();
+
+        @SuppressWarnings("unchecked")
+        PrivateInternals_DynamicMapImpl<Object> map =
+            (PrivateInternals_DynamicMapImpl<Object>) e.getValue();
+
+        for (Binding<Object> b : bindings(src, type)) {
+          if (b.getKey().getAnnotation() != null) {
+            handles.add(map.put(pluginName, b.getKey(), b.getProvider()));
+          }
+        }
+      }
+    } catch (RuntimeException | Error e) {
+      remove(handles);
+      throw e;
+    }
+    return handles;
+  }
+
+  public static LifecycleListener registerInParentInjectors() {
+    return new LifecycleListener() {
+      private List<RegistrationHandle> handles;
+
+      @Inject private Injector self;
+
+      @Override
+      public void start() {
+        handles = new ArrayList<>(4);
+        Injector parent = self.getParent();
+        while (parent != null) {
+          handles.addAll(attachSets(self, PluginName.GERRIT, dynamicSetsOf(parent)));
+          handles.addAll(attachMaps(self, PluginName.GERRIT, dynamicMapsOf(parent)));
+          parent = parent.getParent();
+        }
+        if (handles.isEmpty()) {
+          handles = null;
+        }
+      }
+
+      @Override
+      public void stop() {
+        remove(handles);
+        handles = null;
+      }
+    };
+  }
+
+  private static void remove(List<RegistrationHandle> handles) {
+    if (handles != null) {
+      for (RegistrationHandle handle : handles) {
+        handle.remove();
+      }
+    }
+  }
+
+  private static <T> List<Binding<T>> bindings(Injector src, TypeLiteral<T> type) {
+    return src.findBindingsByType(type);
+  }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/RegistrationHandle.java b/java/com/google/gerrit/extensions/registration/RegistrationHandle.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/RegistrationHandle.java
rename to java/com/google/gerrit/extensions/registration/RegistrationHandle.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/ReloadableRegistrationHandle.java b/java/com/google/gerrit/extensions/registration/ReloadableRegistrationHandle.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/ReloadableRegistrationHandle.java
rename to java/com/google/gerrit/extensions/registration/ReloadableRegistrationHandle.java
diff --git a/java/com/google/gerrit/extensions/restapi/AuthException.java b/java/com/google/gerrit/extensions/restapi/AuthException.java
new file mode 100644
index 0000000..fe1744b
--- /dev/null
+++ b/java/com/google/gerrit/extensions/restapi/AuthException.java
@@ -0,0 +1,55 @@
+// Copyright (C) 2012 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.google.gerrit.extensions.restapi;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+import com.google.common.base.Strings;
+import java.util.Optional;
+
+/** Caller cannot perform the request operation (HTTP 403 Forbidden). */
+public class AuthException extends RestApiException {
+  private static final long serialVersionUID = 1L;
+
+  private Optional<String> advice = Optional.empty();
+
+  /** @param msg message to return to the client. */
+  public AuthException(String msg) {
+    super(msg);
+  }
+
+  /**
+   * @param msg message to return to the client.
+   * @param cause cause of this exception.
+   */
+  public AuthException(String msg, Throwable cause) {
+    super(msg, cause);
+  }
+
+  public void setAdvice(String advice) {
+    checkArgument(!Strings.isNullOrEmpty(advice));
+    this.advice = Optional.of(advice);
+  }
+
+  /**
+   * Advice that the user can follow to acquire authorization to perform the action.
+   *
+   * <p>This may be long-form text with newlines, and may be printed to a terminal, for example in
+   * the message stream in response to a push.
+   */
+  public Optional<String> getAdvice() {
+    return advice;
+  }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/BadRequestException.java b/java/com/google/gerrit/extensions/restapi/BadRequestException.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/BadRequestException.java
rename to java/com/google/gerrit/extensions/restapi/BadRequestException.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/BinaryResult.java b/java/com/google/gerrit/extensions/restapi/BinaryResult.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/BinaryResult.java
rename to java/com/google/gerrit/extensions/restapi/BinaryResult.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/CacheControl.java b/java/com/google/gerrit/extensions/restapi/CacheControl.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/CacheControl.java
rename to java/com/google/gerrit/extensions/restapi/CacheControl.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/ChildCollection.java b/java/com/google/gerrit/extensions/restapi/ChildCollection.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/ChildCollection.java
rename to java/com/google/gerrit/extensions/restapi/ChildCollection.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/DefaultInput.java b/java/com/google/gerrit/extensions/restapi/DefaultInput.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/DefaultInput.java
rename to java/com/google/gerrit/extensions/restapi/DefaultInput.java
diff --git a/java/com/google/gerrit/extensions/restapi/DeprecatedIdentifierException.java b/java/com/google/gerrit/extensions/restapi/DeprecatedIdentifierException.java
new file mode 100644
index 0000000..aa28cfc
--- /dev/null
+++ b/java/com/google/gerrit/extensions/restapi/DeprecatedIdentifierException.java
@@ -0,0 +1,25 @@
+// Copyright (C) 2017 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.google.gerrit.extensions.restapi;
+
+/** Named resource was accessed using a deprecated identifier. */
+public class DeprecatedIdentifierException extends BadRequestException {
+  private static final long serialVersionUID = 1L;
+
+  /** Requested resource using a deprecated identifier. */
+  public DeprecatedIdentifierException(String msg) {
+    super(msg);
+  }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/ETagView.java b/java/com/google/gerrit/extensions/restapi/ETagView.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/ETagView.java
rename to java/com/google/gerrit/extensions/restapi/ETagView.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/IdString.java b/java/com/google/gerrit/extensions/restapi/IdString.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/IdString.java
rename to java/com/google/gerrit/extensions/restapi/IdString.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/MergeConflictException.java b/java/com/google/gerrit/extensions/restapi/MergeConflictException.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/MergeConflictException.java
rename to java/com/google/gerrit/extensions/restapi/MergeConflictException.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/MethodNotAllowedException.java b/java/com/google/gerrit/extensions/restapi/MethodNotAllowedException.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/MethodNotAllowedException.java
rename to java/com/google/gerrit/extensions/restapi/MethodNotAllowedException.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/NeedsParams.java b/java/com/google/gerrit/extensions/restapi/NeedsParams.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/NeedsParams.java
rename to java/com/google/gerrit/extensions/restapi/NeedsParams.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/NotImplementedException.java b/java/com/google/gerrit/extensions/restapi/NotImplementedException.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/NotImplementedException.java
rename to java/com/google/gerrit/extensions/restapi/NotImplementedException.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/PreconditionFailedException.java b/java/com/google/gerrit/extensions/restapi/PreconditionFailedException.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/PreconditionFailedException.java
rename to java/com/google/gerrit/extensions/restapi/PreconditionFailedException.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RawInput.java b/java/com/google/gerrit/extensions/restapi/RawInput.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RawInput.java
rename to java/com/google/gerrit/extensions/restapi/RawInput.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/ResourceConflictException.java b/java/com/google/gerrit/extensions/restapi/ResourceConflictException.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/ResourceConflictException.java
rename to java/com/google/gerrit/extensions/restapi/ResourceConflictException.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/ResourceNotFoundException.java b/java/com/google/gerrit/extensions/restapi/ResourceNotFoundException.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/ResourceNotFoundException.java
rename to java/com/google/gerrit/extensions/restapi/ResourceNotFoundException.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/Response.java b/java/com/google/gerrit/extensions/restapi/Response.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/Response.java
rename to java/com/google/gerrit/extensions/restapi/Response.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestApiException.java b/java/com/google/gerrit/extensions/restapi/RestApiException.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestApiException.java
rename to java/com/google/gerrit/extensions/restapi/RestApiException.java
diff --git a/java/com/google/gerrit/extensions/restapi/RestApiModule.java b/java/com/google/gerrit/extensions/restapi/RestApiModule.java
new file mode 100644
index 0000000..85bd5a1
--- /dev/null
+++ b/java/com/google/gerrit/extensions/restapi/RestApiModule.java
@@ -0,0 +1,286 @@
+// Copyright (C) 2012 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.google.gerrit.extensions.restapi;
+
+import com.google.gerrit.extensions.annotations.Export;
+import com.google.gerrit.extensions.annotations.Exports;
+import com.google.gerrit.extensions.config.FactoryModule;
+import com.google.inject.Provider;
+import com.google.inject.TypeLiteral;
+import com.google.inject.binder.LinkedBindingBuilder;
+import com.google.inject.binder.ScopedBindingBuilder;
+
+/** Guice DSL for binding {@link RestView} implementations. */
+public abstract class RestApiModule extends FactoryModule {
+  protected static final String GET = "GET";
+  protected static final String PUT = "PUT";
+  protected static final String DELETE = "DELETE";
+  protected static final String POST = "POST";
+  protected static final String CREATE = "CREATE";
+  protected static final String DELETE_MISSING = "DELETE_MISSING";
+  protected static final String DELETE_ON_COLLECTION = "DELETE_ON_COLLECTION";
+  protected static final String POST_ON_COLLECTION = "POST_ON_COLLECTION";
+
+  protected <R extends RestResource> ReadViewBinder<R> get(TypeLiteral<RestView<R>> viewType) {
+    return get(viewType, "/");
+  }
+
+  protected <R extends RestResource> ModifyViewBinder<R> put(TypeLiteral<RestView<R>> viewType) {
+    return put(viewType, "/");
+  }
+
+  protected <R extends RestResource> ModifyViewBinder<R> post(TypeLiteral<RestView<R>> viewType) {
+    return post(viewType, "/");
+  }
+
+  protected <R extends RestResource> ModifyViewBinder<R> delete(TypeLiteral<RestView<R>> viewType) {
+    return delete(viewType, "/");
+  }
+
+  protected <R extends RestResource> RestCollectionViewBinder<R> postOnCollection(
+      TypeLiteral<RestView<R>> viewType) {
+    return new RestCollectionViewBinder<>(
+        bind(viewType).annotatedWith(export(POST_ON_COLLECTION, "/")));
+  }
+
+  /**
+   * Creates a binder that allows to bind a REST view to handle {@code DELETE} on the REST
+   * collection of the provided view type.
+   *
+   * <p>This binding is ignored if the provided view type belongs to a root collection.
+   *
+   * @param viewType the type of the resources in the REST collection on which {@code DELETE} should
+   *     be handled
+   * @return binder that allows to bind an implementation for the REST view that should handle
+   *     {@code DELETE} on the REST collection of the provided view type
+   */
+  protected <R extends RestResource> RestCollectionViewBinder<R> deleteOnCollection(
+      TypeLiteral<RestView<R>> viewType) {
+    return new RestCollectionViewBinder<>(
+        bind(viewType).annotatedWith(export(DELETE_ON_COLLECTION, "/")));
+  }
+
+  protected <R extends RestResource> CreateViewBinder<R> create(TypeLiteral<RestView<R>> viewType) {
+    return new CreateViewBinder<>(bind(viewType).annotatedWith(export(CREATE, "/")));
+  }
+
+  protected <R extends RestResource> DeleteViewBinder<R> deleteMissing(
+      TypeLiteral<RestView<R>> viewType) {
+    return new DeleteViewBinder<>(bind(viewType).annotatedWith(export(DELETE_MISSING, "/")));
+  }
+
+  protected <R extends RestResource> ReadViewBinder<R> get(
+      TypeLiteral<RestView<R>> viewType, String name) {
+    return new ReadViewBinder<>(view(viewType, GET, name));
+  }
+
+  protected <R extends RestResource> ModifyViewBinder<R> put(
+      TypeLiteral<RestView<R>> viewType, String name) {
+    return new ModifyViewBinder<>(view(viewType, PUT, name));
+  }
+
+  protected <R extends RestResource> ModifyViewBinder<R> post(
+      TypeLiteral<RestView<R>> viewType, String name) {
+    return new ModifyViewBinder<>(view(viewType, POST, name));
+  }
+
+  protected <R extends RestResource> ModifyViewBinder<R> delete(
+      TypeLiteral<RestView<R>> viewType, String name) {
+    return new ModifyViewBinder<>(view(viewType, DELETE, name));
+  }
+
+  protected <P extends RestResource> ChildCollectionBinder<P> child(
+      TypeLiteral<RestView<P>> type, String name) {
+    return new ChildCollectionBinder<>(view(type, GET, name));
+  }
+
+  private <R extends RestResource> LinkedBindingBuilder<RestView<R>> view(
+      TypeLiteral<RestView<R>> viewType, String method, String name) {
+    return bind(viewType).annotatedWith(export(method, name));
+  }
+
+  private static Export export(String method, String name) {
+    if (name.length() > 1 && name.startsWith("/")) {
+      // Views may be bound as "/" to mean the resource itself, or
+      // as "status" as in "/type/{id}/status". Don't bind "/status"
+      // if the caller asked for that, bind what the server expects.
+      name = name.substring(1);
+    }
+    return Exports.named(method + "." + name);
+  }
+
+  public static class ReadViewBinder<P extends RestResource> {
+    private final LinkedBindingBuilder<RestView<P>> binder;
+
+    private ReadViewBinder(LinkedBindingBuilder<RestView<P>> binder) {
+      this.binder = binder;
+    }
+
+    public <T extends RestReadView<P>> ScopedBindingBuilder to(Class<T> impl) {
+      return binder.to(impl);
+    }
+
+    public <T extends RestReadView<P>> void toInstance(T impl) {
+      binder.toInstance(impl);
+    }
+
+    public <T extends RestReadView<P>> ScopedBindingBuilder toProvider(
+        Class<? extends Provider<? extends T>> providerType) {
+      return binder.toProvider(providerType);
+    }
+
+    public <T extends RestReadView<P>> ScopedBindingBuilder toProvider(
+        Provider<? extends T> provider) {
+      return binder.toProvider(provider);
+    }
+  }
+
+  public static class ModifyViewBinder<P extends RestResource> {
+    private final LinkedBindingBuilder<RestView<P>> binder;
+
+    private ModifyViewBinder(LinkedBindingBuilder<RestView<P>> binder) {
+      this.binder = binder;
+    }
+
+    public <T extends RestModifyView<P, ?>> ScopedBindingBuilder to(Class<T> impl) {
+      return binder.to(impl);
+    }
+
+    public <T extends RestModifyView<P, ?>> void toInstance(T impl) {
+      binder.toInstance(impl);
+    }
+
+    public <T extends RestModifyView<P, ?>> ScopedBindingBuilder toProvider(
+        Class<? extends Provider<? extends T>> providerType) {
+      return binder.toProvider(providerType);
+    }
+
+    public <T extends RestModifyView<P, ?>> ScopedBindingBuilder toProvider(
+        Provider<? extends T> provider) {
+      return binder.toProvider(provider);
+    }
+  }
+
+  public static class RestCollectionViewBinder<C extends RestResource> {
+    private final LinkedBindingBuilder<RestView<C>> binder;
+
+    private RestCollectionViewBinder(LinkedBindingBuilder<RestView<C>> binder) {
+      this.binder = binder;
+    }
+
+    public <P extends RestResource, T extends RestCollectionModifyView<P, C, ?>>
+        ScopedBindingBuilder to(Class<T> impl) {
+      return binder.to(impl);
+    }
+
+    public <P extends RestResource, T extends RestCollectionModifyView<P, C, ?>> void toInstance(
+        T impl) {
+      binder.toInstance(impl);
+    }
+
+    public <P extends RestResource, T extends RestCollectionModifyView<P, C, ?>>
+        ScopedBindingBuilder toProvider(Class<? extends Provider<? extends T>> providerType) {
+      return binder.toProvider(providerType);
+    }
+
+    public <P extends RestResource, T extends RestCollectionModifyView<P, C, ?>>
+        ScopedBindingBuilder toProvider(Provider<? extends T> provider) {
+      return binder.toProvider(provider);
+    }
+  }
+
+  public static class CreateViewBinder<C extends RestResource> {
+    private final LinkedBindingBuilder<RestView<C>> binder;
+
+    private CreateViewBinder(LinkedBindingBuilder<RestView<C>> binder) {
+      this.binder = binder;
+    }
+
+    public <P extends RestResource, T extends RestCollectionCreateView<P, C, ?>>
+        ScopedBindingBuilder to(Class<T> impl) {
+      return binder.to(impl);
+    }
+
+    public <P extends RestResource, T extends RestCollectionCreateView<P, C, ?>> void toInstance(
+        T impl) {
+      binder.toInstance(impl);
+    }
+
+    public <P extends RestResource, T extends RestCollectionCreateView<P, C, ?>>
+        ScopedBindingBuilder toProvider(Class<? extends Provider<? extends T>> providerType) {
+      return binder.toProvider(providerType);
+    }
+
+    public <P extends RestResource, T extends RestCollectionCreateView<P, C, ?>>
+        ScopedBindingBuilder toProvider(Provider<? extends T> provider) {
+      return binder.toProvider(provider);
+    }
+  }
+
+  public static class DeleteViewBinder<C extends RestResource> {
+    private final LinkedBindingBuilder<RestView<C>> binder;
+
+    private DeleteViewBinder(LinkedBindingBuilder<RestView<C>> binder) {
+      this.binder = binder;
+    }
+
+    public <P extends RestResource, T extends RestCollectionDeleteMissingView<P, C, ?>>
+        ScopedBindingBuilder to(Class<T> impl) {
+      return binder.to(impl);
+    }
+
+    public <P extends RestResource, T extends RestCollectionDeleteMissingView<P, C, ?>>
+        void toInstance(T impl) {
+      binder.toInstance(impl);
+    }
+
+    public <P extends RestResource, T extends RestCollectionDeleteMissingView<P, C, ?>>
+        ScopedBindingBuilder toProvider(Class<? extends Provider<? extends T>> providerType) {
+      return binder.toProvider(providerType);
+    }
+
+    public <P extends RestResource, T extends RestCollectionDeleteMissingView<P, C, ?>>
+        ScopedBindingBuilder toProvider(Provider<? extends T> provider) {
+      return binder.toProvider(provider);
+    }
+  }
+
+  public static class ChildCollectionBinder<P extends RestResource> {
+    private final LinkedBindingBuilder<RestView<P>> binder;
+
+    private ChildCollectionBinder(LinkedBindingBuilder<RestView<P>> binder) {
+      this.binder = binder;
+    }
+
+    public <C extends RestResource, T extends ChildCollection<P, C>> ScopedBindingBuilder to(
+        Class<T> impl) {
+      return binder.to(impl);
+    }
+
+    public <C extends RestResource, T extends ChildCollection<P, C>> void toInstance(T impl) {
+      binder.toInstance(impl);
+    }
+
+    public <C extends RestResource, T extends ChildCollection<P, C>>
+        ScopedBindingBuilder toProvider(Class<? extends Provider<? extends T>> providerType) {
+      return binder.toProvider(providerType);
+    }
+
+    public <C extends RestResource, T extends ChildCollection<P, C>>
+        ScopedBindingBuilder toProvider(Provider<? extends T> provider) {
+      return binder.toProvider(provider);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/extensions/restapi/RestCollection.java b/java/com/google/gerrit/extensions/restapi/RestCollection.java
new file mode 100644
index 0000000..e79bde4
--- /dev/null
+++ b/java/com/google/gerrit/extensions/restapi/RestCollection.java
@@ -0,0 +1,96 @@
+// Copyright (C) 2012 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.google.gerrit.extensions.restapi;
+
+import com.google.gerrit.extensions.registration.DynamicMap;
+
+/**
+ * A collection of resources accessible through a REST API.
+ *
+ * <p>To build a collection declare a resource, the map in a module, and the collection itself
+ * accepting the map:
+ *
+ * <pre>
+ * public class MyResource implements RestResource {
+ *   public static final TypeLiteral&lt;RestView&lt;MyResource&gt;&gt; MY_KIND =
+ *       new TypeLiteral&lt;RestView&lt;MyResource&gt;&gt;() {};
+ * }
+ *
+ * public class MyModule extends AbstractModule {
+ *   &#064;Override
+ *   protected void configure() {
+ *     DynamicMap.mapOf(binder(), MyResource.MY_KIND);
+ *
+ *     get(MyResource.MY_KIND, &quot;action&quot;).to(MyAction.class);
+ *   }
+ * }
+ *
+ * public class MyCollection extends RestCollection&lt;TopLevelResource, MyResource&gt; {
+ *   private final DynamicMap&lt;RestView&lt;MyResource&gt;&gt; views;
+ *
+ *   &#064;Inject
+ *   MyCollection(DynamicMap&lt;RestView&lt;MyResource&gt;&gt; views) {
+ *     this.views = views;
+ *   }
+ *
+ *   public DynamicMap&lt;RestView&lt;MyResource&gt;&gt; views() {
+ *     return views;
+ *   }
+ * }
+ * </pre>
+ *
+ * <p>To build a nested collection, implement {@link ChildCollection}.
+ *
+ * @param <P> type of the parent resource. For a top level collection this should always be {@link
+ *     TopLevelResource}.
+ * @param <R> type of resource operated on by each view.
+ */
+public interface RestCollection<P extends RestResource, R extends RestResource> {
+  /**
+   * Create a view to list the contents of the collection.
+   *
+   * <p>The returned view should accept the parent type to scope the search, and may want to take a
+   * "q" parameter option to narrow the results.
+   *
+   * @return view to list the collection.
+   * @throws ResourceNotFoundException if the collection doesn't support listing.
+   * @throws AuthException if the collection requires authentication.
+   * @throws RestApiException if the collection cannot be listed.
+   */
+  RestView<P> list() throws RestApiException;
+
+  /**
+   * Parse a path component into a resource handle.
+   *
+   * @param parent the handle to the collection.
+   * @param id string identifier supplied by the client. In a URL such as {@code
+   *     /changes/1234/abandon} this string is {@code "1234"}.
+   * @return a resource handle for the identified object.
+   * @throws ResourceNotFoundException the object does not exist, or the caller is not permitted to
+   *     know if the resource exists.
+   * @throws Exception if the implementation had any errors converting to a resource handle. This
+   *     results in an HTTP 500 Internal Server Error.
+   */
+  R parse(P parent, IdString id) throws ResourceNotFoundException, Exception;
+
+  /**
+   * Get the views that support this collection.
+   *
+   * <p>Within a resource the views are accessed as {@code RESOURCE/plugin~view}.
+   *
+   * @return map of views.
+   */
+  DynamicMap<RestView<R>> views();
+}
diff --git a/java/com/google/gerrit/extensions/restapi/RestCollectionCreateView.java b/java/com/google/gerrit/extensions/restapi/RestCollectionCreateView.java
new file mode 100644
index 0000000..25cdb76
--- /dev/null
+++ b/java/com/google/gerrit/extensions/restapi/RestCollectionCreateView.java
@@ -0,0 +1,45 @@
+// 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.
+
+package com.google.gerrit.extensions.restapi;
+
+/**
+ * RestView that supports accepting input and creating a resource.
+ *
+ * <p>The input must be supplied as JSON as the body of the HTTP request. Create views can be
+ * invoked by the HTTP methods {@code PUT} and {@code POST}.
+ *
+ * <p>The RestCreateView is only invoked when the parse method of the {@code RestCollection} throws
+ * {@link ResourceNotFoundException}, and hence the resource doesn't exist yet.
+ *
+ * @param <P> type of the parent resource
+ * @param <C> type of the child resource that is created
+ * @param <I> type of input the JSON parser will parse the input into.
+ */
+public interface RestCollectionCreateView<P extends RestResource, C extends RestResource, I>
+    extends RestCollectionView<P, C, I> {
+
+  /**
+   * Process the view operation by creating the resource.
+   *
+   * @param parentResource parent resource of the resource that should be created
+   * @param input input after parsing from request.
+   * @return result to return to the client. Use {@link BinaryResult} to avoid automatic conversion
+   *     to JSON.
+   * @throws RestApiException if the resource creation is rejected
+   * @throws Exception the implementation of the view failed. The exception will be logged and HTTP
+   *     500 Internal Server Error will be returned to the client.
+   */
+  Object apply(P parentResource, IdString id, I input) throws Exception;
+}
diff --git a/java/com/google/gerrit/extensions/restapi/RestCollectionDeleteMissingView.java b/java/com/google/gerrit/extensions/restapi/RestCollectionDeleteMissingView.java
new file mode 100644
index 0000000..7e5649c
--- /dev/null
+++ b/java/com/google/gerrit/extensions/restapi/RestCollectionDeleteMissingView.java
@@ -0,0 +1,49 @@
+// 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.
+
+package com.google.gerrit.extensions.restapi;
+
+/**
+ * RestView that supports accepting input and deleting a resource that is missing.
+ *
+ * <p>The RestDeleteMissingView solely exists to support a special case for creating a change edit
+ * by deleting a path in the non-existing change edit. This interface should not be used for new
+ * REST API's.
+ *
+ * <p>The input must be supplied as JSON as the body of the HTTP request. Delete views can be
+ * invoked by the HTTP method {@code DELETE}.
+ *
+ * <p>The RestDeleteMissingView is only invoked when the parse method of the {@code RestCollection}
+ * throws {@link ResourceNotFoundException}, and hence the resource doesn't exist yet.
+ *
+ * @param <P> type of the parent resource
+ * @param <C> type of the child resource that id deleted
+ * @param <I> type of input the JSON parser will parse the input into.
+ */
+public interface RestCollectionDeleteMissingView<P extends RestResource, C extends RestResource, I>
+    extends RestCollectionView<P, C, I> {
+
+  /**
+   * Process the view operation by deleting the resource.
+   *
+   * @param parentResource parent resource of the resource that should be deleted
+   * @param input input after parsing from request.
+   * @return result to return to the client. Use {@link BinaryResult} to avoid automatic conversion
+   *     to JSON.
+   * @throws RestApiException if the resource creation is rejected
+   * @throws Exception the implementation of the view failed. The exception will be logged and HTTP
+   *     500 Internal Server Error will be returned to the client.
+   */
+  Object apply(P parentResource, IdString id, I input) throws Exception;
+}
diff --git a/java/com/google/gerrit/extensions/restapi/RestCollectionModifyView.java b/java/com/google/gerrit/extensions/restapi/RestCollectionModifyView.java
new file mode 100644
index 0000000..acabf96
--- /dev/null
+++ b/java/com/google/gerrit/extensions/restapi/RestCollectionModifyView.java
@@ -0,0 +1,32 @@
+// 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.
+
+package com.google.gerrit.extensions.restapi;
+
+/**
+ * RestView on a RestCollection that supports accepting input.
+ *
+ * <p>The input must be supplied as JSON as the body of the HTTP request. RestCollectionModifyViews
+ * can be invoked by the HTTP methods {@code POST} and {@code DELETE} ({@code DELETE} is only
+ * supported on child collections).
+ *
+ * @param <P> type of the parent resource
+ * @param <C> type of the child resource
+ * @param <I> type of input the JSON parser will parse the input into.
+ */
+public interface RestCollectionModifyView<P extends RestResource, C extends RestResource, I>
+    extends RestCollectionView<P, C, I> {
+
+  Object apply(P parentResource, I input) throws Exception;
+}
diff --git a/java/com/google/gerrit/extensions/restapi/RestCollectionView.java b/java/com/google/gerrit/extensions/restapi/RestCollectionView.java
new file mode 100644
index 0000000..c29a58f
--- /dev/null
+++ b/java/com/google/gerrit/extensions/restapi/RestCollectionView.java
@@ -0,0 +1,22 @@
+// 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.
+
+package com.google.gerrit.extensions.restapi;
+
+/**
+ * Any type of view on {@link RestCollection}, see {@link RestCollectionModifyView} for updates and
+ * deletes and {@link RestCollectionCreateView} for member creation.
+ */
+public interface RestCollectionView<P extends RestResource, C extends RestResource, I>
+    extends RestView<C> {}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestModifyView.java b/java/com/google/gerrit/extensions/restapi/RestModifyView.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestModifyView.java
rename to java/com/google/gerrit/extensions/restapi/RestModifyView.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestReadView.java b/java/com/google/gerrit/extensions/restapi/RestReadView.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestReadView.java
rename to java/com/google/gerrit/extensions/restapi/RestReadView.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestResource.java b/java/com/google/gerrit/extensions/restapi/RestResource.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestResource.java
rename to java/com/google/gerrit/extensions/restapi/RestResource.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestView.java b/java/com/google/gerrit/extensions/restapi/RestView.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestView.java
rename to java/com/google/gerrit/extensions/restapi/RestView.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/TopLevelResource.java b/java/com/google/gerrit/extensions/restapi/TopLevelResource.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/TopLevelResource.java
rename to java/com/google/gerrit/extensions/restapi/TopLevelResource.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/UnprocessableEntityException.java b/java/com/google/gerrit/extensions/restapi/UnprocessableEntityException.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/UnprocessableEntityException.java
rename to java/com/google/gerrit/extensions/restapi/UnprocessableEntityException.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/Url.java b/java/com/google/gerrit/extensions/restapi/Url.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/Url.java
rename to java/com/google/gerrit/extensions/restapi/Url.java
diff --git a/java/com/google/gerrit/extensions/restapi/testing/BUILD b/java/com/google/gerrit/extensions/restapi/testing/BUILD
new file mode 100644
index 0000000..3417cae2
--- /dev/null
+++ b/java/com/google/gerrit/extensions/restapi/testing/BUILD
@@ -0,0 +1,11 @@
+java_library(
+    name = "restapi-test-util",
+    testonly = True,
+    srcs = glob(["**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/truth",
+        "//lib/truth",
+    ],
+)
diff --git a/java/com/google/gerrit/extensions/restapi/testing/BinaryResultSubject.java b/java/com/google/gerrit/extensions/restapi/testing/BinaryResultSubject.java
new file mode 100644
index 0000000..1867308
--- /dev/null
+++ b/java/com/google/gerrit/extensions/restapi/testing/BinaryResultSubject.java
@@ -0,0 +1,65 @@
+// Copyright (C) 2017 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.google.gerrit.extensions.restapi.testing;
+
+import static com.google.common.truth.Truth.assertAbout;
+
+import com.google.common.truth.FailureMetadata;
+import com.google.common.truth.PrimitiveByteArraySubject;
+import com.google.common.truth.StringSubject;
+import com.google.common.truth.Subject;
+import com.google.common.truth.Truth;
+import com.google.gerrit.extensions.restapi.BinaryResult;
+import com.google.gerrit.truth.OptionalSubject;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Optional;
+
+public class BinaryResultSubject extends Subject<BinaryResultSubject, BinaryResult> {
+
+  public static BinaryResultSubject assertThat(BinaryResult binaryResult) {
+    return assertAbout(BinaryResultSubject::new).that(binaryResult);
+  }
+
+  public static OptionalSubject<BinaryResultSubject, BinaryResult> assertThat(
+      Optional<BinaryResult> binaryResultOptional) {
+    return OptionalSubject.assertThat(binaryResultOptional, BinaryResultSubject::assertThat);
+  }
+
+  private BinaryResultSubject(FailureMetadata failureMetadata, BinaryResult binaryResult) {
+    super(failureMetadata, binaryResult);
+  }
+
+  public StringSubject asString() throws IOException {
+    isNotNull();
+    // We shouldn't close the BinaryResult within this method as it might still
+    // be used afterwards. Besides, closing it doesn't have an effect for most
+    // implementations of a BinaryResult.
+    BinaryResult binaryResult = actual();
+    return Truth.assertThat(binaryResult.asString());
+  }
+
+  public PrimitiveByteArraySubject bytes() throws IOException {
+    isNotNull();
+    // We shouldn't close the BinaryResult within this method as it might still
+    // be used afterwards. Besides, closing it doesn't have an effect for most
+    // implementations of a BinaryResult.
+    BinaryResult binaryResult = actual();
+    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+    binaryResult.writeTo(byteArrayOutputStream);
+    byte[] bytes = byteArrayOutputStream.toByteArray();
+    return Truth.assertThat(bytes);
+  }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/systemstatus/MessageOfTheDay.java b/java/com/google/gerrit/extensions/systemstatus/MessageOfTheDay.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/systemstatus/MessageOfTheDay.java
rename to java/com/google/gerrit/extensions/systemstatus/MessageOfTheDay.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/systemstatus/ServerInformation.java b/java/com/google/gerrit/extensions/systemstatus/ServerInformation.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/systemstatus/ServerInformation.java
rename to java/com/google/gerrit/extensions/systemstatus/ServerInformation.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/BranchWebLink.java b/java/com/google/gerrit/extensions/webui/BranchWebLink.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/BranchWebLink.java
rename to java/com/google/gerrit/extensions/webui/BranchWebLink.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/DiffWebLink.java b/java/com/google/gerrit/extensions/webui/DiffWebLink.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/DiffWebLink.java
rename to java/com/google/gerrit/extensions/webui/DiffWebLink.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/FileHistoryWebLink.java b/java/com/google/gerrit/extensions/webui/FileHistoryWebLink.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/FileHistoryWebLink.java
rename to java/com/google/gerrit/extensions/webui/FileHistoryWebLink.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/FileWebLink.java b/java/com/google/gerrit/extensions/webui/FileWebLink.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/FileWebLink.java
rename to java/com/google/gerrit/extensions/webui/FileWebLink.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/GwtPlugin.java b/java/com/google/gerrit/extensions/webui/GwtPlugin.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/GwtPlugin.java
rename to java/com/google/gerrit/extensions/webui/GwtPlugin.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/JavaScriptPlugin.java b/java/com/google/gerrit/extensions/webui/JavaScriptPlugin.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/JavaScriptPlugin.java
rename to java/com/google/gerrit/extensions/webui/JavaScriptPlugin.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/ParentWebLink.java b/java/com/google/gerrit/extensions/webui/ParentWebLink.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/ParentWebLink.java
rename to java/com/google/gerrit/extensions/webui/ParentWebLink.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/PatchSetWebLink.java b/java/com/google/gerrit/extensions/webui/PatchSetWebLink.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/PatchSetWebLink.java
rename to java/com/google/gerrit/extensions/webui/PatchSetWebLink.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/PrivateInternals_UiActionDescription.java b/java/com/google/gerrit/extensions/webui/PrivateInternals_UiActionDescription.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/PrivateInternals_UiActionDescription.java
rename to java/com/google/gerrit/extensions/webui/PrivateInternals_UiActionDescription.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/ProjectWebLink.java b/java/com/google/gerrit/extensions/webui/ProjectWebLink.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/ProjectWebLink.java
rename to java/com/google/gerrit/extensions/webui/ProjectWebLink.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/TagWebLink.java b/java/com/google/gerrit/extensions/webui/TagWebLink.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/TagWebLink.java
rename to java/com/google/gerrit/extensions/webui/TagWebLink.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/TopMenu.java b/java/com/google/gerrit/extensions/webui/TopMenu.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/TopMenu.java
rename to java/com/google/gerrit/extensions/webui/TopMenu.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/UiAction.java b/java/com/google/gerrit/extensions/webui/UiAction.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/UiAction.java
rename to java/com/google/gerrit/extensions/webui/UiAction.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/UiResult.java b/java/com/google/gerrit/extensions/webui/UiResult.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/UiResult.java
rename to java/com/google/gerrit/extensions/webui/UiResult.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/WebLink.java b/java/com/google/gerrit/extensions/webui/WebLink.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/WebLink.java
rename to java/com/google/gerrit/extensions/webui/WebLink.java
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/WebUiPlugin.java b/java/com/google/gerrit/extensions/webui/WebUiPlugin.java
similarity index 100%
rename from gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/WebUiPlugin.java
rename to java/com/google/gerrit/extensions/webui/WebUiPlugin.java
diff --git a/java/com/google/gerrit/git/testing/BUILD b/java/com/google/gerrit/git/testing/BUILD
new file mode 100644
index 0000000..497510d
--- /dev/null
+++ b/java/com/google/gerrit/git/testing/BUILD
@@ -0,0 +1,14 @@
+package(default_testonly = True)
+
+java_library(
+    name = "testing",
+    srcs = glob(["*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/common:annotations",
+        "//lib:guava",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/truth",
+        "//lib/truth:truth-java8-extension",
+    ],
+)
diff --git a/java/com/google/gerrit/git/testing/PushResultSubject.java b/java/com/google/gerrit/git/testing/PushResultSubject.java
new file mode 100644
index 0000000..929e182
--- /dev/null
+++ b/java/com/google/gerrit/git/testing/PushResultSubject.java
@@ -0,0 +1,179 @@
+// 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.
+
+package com.google.gerrit.git.testing;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.truth.Truth.assertAbout;
+import static java.util.stream.Collectors.joining;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Splitter;
+import com.google.common.base.Strings;
+import com.google.common.base.Throwables;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Maps;
+import com.google.common.truth.FailureMetadata;
+import com.google.common.truth.Subject;
+import com.google.common.truth.Truth;
+import com.google.common.truth.Truth8;
+import com.google.gerrit.common.Nullable;
+import java.util.Arrays;
+import org.eclipse.jgit.transport.PushResult;
+import org.eclipse.jgit.transport.RemoteRefUpdate;
+
+public class PushResultSubject extends Subject<PushResultSubject, PushResult> {
+  public static PushResultSubject assertThat(PushResult actual) {
+    return assertAbout(PushResultSubject::new).that(actual);
+  }
+
+  private PushResultSubject(FailureMetadata metadata, PushResult actual) {
+    super(metadata, actual);
+  }
+
+  public void hasNoMessages() {
+    Truth.assertWithMessage("expected no messages")
+        .that(Strings.nullToEmpty(trimMessages()))
+        .isEqualTo("");
+  }
+
+  public void hasMessages(String... expectedLines) {
+    checkArgument(expectedLines.length > 0, "use hasNoMessages()");
+    isNotNull();
+    Truth.assertThat(trimMessages()).isEqualTo(Arrays.stream(expectedLines).collect(joining("\n")));
+  }
+
+  public void containsMessages(String... expectedLines) {
+    checkArgument(expectedLines.length > 0, "use hasNoMessages()");
+    isNotNull();
+    Iterable<String> got = Splitter.on("\n").split(trimMessages());
+    Truth.assertThat(got).containsAllIn(expectedLines).inOrder();
+  }
+
+  private String trimMessages() {
+    return trimMessages(actual().getMessages());
+  }
+
+  @VisibleForTesting
+  @Nullable
+  static String trimMessages(@Nullable String msg) {
+    if (msg == null) {
+      return null;
+    }
+    int idx = msg.indexOf("Processing changes:");
+    if (idx >= 0) {
+      msg = msg.substring(0, idx);
+    }
+    return msg.trim();
+  }
+
+  public void hasProcessed(ImmutableMap<String, Integer> expected) {
+    ImmutableMap<String, Integer> actual;
+    String messages = actual().getMessages();
+    try {
+      actual = parseProcessed(messages);
+    } catch (RuntimeException e) {
+      Truth.assert_()
+          .fail(
+              "failed to parse \"Processing changes\" line from messages: %s\n%s",
+              messages, Throwables.getStackTraceAsString(e));
+      return;
+    }
+    Truth.assertThat(actual)
+        .named("processed commands")
+        .containsExactlyEntriesIn(expected)
+        .inOrder();
+  }
+
+  @VisibleForTesting
+  static ImmutableMap<String, Integer> parseProcessed(@Nullable String messages) {
+    if (messages == null) {
+      return ImmutableMap.of();
+    }
+    String toSplit = messages.trim();
+    String prefix = "Processing changes: ";
+    int idx = toSplit.lastIndexOf(prefix);
+    if (idx < 0) {
+      return ImmutableMap.of();
+    }
+    toSplit = toSplit.substring(idx + prefix.length());
+    if (toSplit.equals("done")) {
+      return ImmutableMap.of();
+    }
+    String done = ", done";
+    if (toSplit.endsWith(done)) {
+      toSplit = toSplit.substring(0, toSplit.length() - done.length());
+    }
+    return ImmutableMap.copyOf(
+        Maps.transformValues(
+            Splitter.on(',').trimResults().withKeyValueSeparator(':').split(toSplit),
+            // trimResults() doesn't trim values in the map.
+            v -> Integer.parseInt(v.trim())));
+  }
+
+  public RemoteRefUpdateSubject ref(String refName) {
+    return assertAbout(
+            (FailureMetadata m, RemoteRefUpdate a) -> new RemoteRefUpdateSubject(refName, m, a))
+        .that(actual().getRemoteUpdate(refName));
+  }
+
+  public RemoteRefUpdateSubject onlyRef(String refName) {
+    Truth8.assertThat(actual().getRemoteUpdates().stream().map(RemoteRefUpdate::getRemoteName))
+        .named("set of refs")
+        .containsExactly(refName);
+    return ref(refName);
+  }
+
+  public static class RemoteRefUpdateSubject
+      extends Subject<RemoteRefUpdateSubject, RemoteRefUpdate> {
+    private final String refName;
+
+    private RemoteRefUpdateSubject(
+        String refName, FailureMetadata metadata, RemoteRefUpdate actual) {
+      super(metadata, actual);
+      this.refName = refName;
+      named("ref update for %s", refName).isNotNull();
+    }
+
+    public void hasStatus(RemoteRefUpdate.Status status) {
+      RemoteRefUpdate u = actual();
+      Truth.assertThat(u.getStatus())
+          .named(
+              "status of ref update for %s%s",
+              refName, u.getMessage() != null ? ": " + u.getMessage() : "")
+          .isEqualTo(status);
+    }
+
+    public void hasNoMessage() {
+      Truth.assertThat(actual().getMessage())
+          .named("message of ref update for %s", refName)
+          .isNull();
+    }
+
+    public void hasMessage(String expected) {
+      Truth.assertThat(actual().getMessage())
+          .named("message of ref update for %s", refName)
+          .isEqualTo(expected);
+    }
+
+    public void isOk() {
+      hasStatus(RemoteRefUpdate.Status.OK);
+    }
+
+    public void isRejected(String expectedMessage) {
+      hasStatus(RemoteRefUpdate.Status.REJECTED_OTHER_REASON);
+      hasMessage(expectedMessage);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/gpg/BUILD b/java/com/google/gerrit/gpg/BUILD
new file mode 100644
index 0000000..0aa6ca2
--- /dev/null
+++ b/java/com/google/gerrit/gpg/BUILD
@@ -0,0 +1,19 @@
+java_library(
+    name = "gpg",
+    srcs = glob(["**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//lib:guava",
+        "//lib:gwtorm",
+        "//lib/bouncycastle:bcpg-neverlink",
+        "//lib/bouncycastle:bcprov-neverlink",
+        "//lib/flogger:api",
+        "//lib/guice",
+        "//lib/guice:guice-assistedinject",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+    ],
+)
diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/BouncyCastleUtil.java b/java/com/google/gerrit/gpg/BouncyCastleUtil.java
similarity index 100%
rename from gerrit-gpg/src/main/java/com/google/gerrit/gpg/BouncyCastleUtil.java
rename to java/com/google/gerrit/gpg/BouncyCastleUtil.java
diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/CheckResult.java b/java/com/google/gerrit/gpg/CheckResult.java
similarity index 100%
rename from gerrit-gpg/src/main/java/com/google/gerrit/gpg/CheckResult.java
rename to java/com/google/gerrit/gpg/CheckResult.java
diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/Fingerprint.java b/java/com/google/gerrit/gpg/Fingerprint.java
similarity index 100%
rename from gerrit-gpg/src/main/java/com/google/gerrit/gpg/Fingerprint.java
rename to java/com/google/gerrit/gpg/Fingerprint.java
diff --git a/java/com/google/gerrit/gpg/GerritPublicKeyChecker.java b/java/com/google/gerrit/gpg/GerritPublicKeyChecker.java
new file mode 100644
index 0000000..b6ecbc5
--- /dev/null
+++ b/java/com/google/gerrit/gpg/GerritPublicKeyChecker.java
@@ -0,0 +1,254 @@
+// Copyright (C) 2015 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.google.gerrit.gpg;
+
+import static com.google.gerrit.gpg.PublicKeyStore.keyIdToString;
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_GPGKEY;
+
+import com.google.common.base.CharMatcher;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Maps;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.io.BaseEncoding;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.UrlFormatter;
+import com.google.gerrit.server.query.account.InternalAccountQuery;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import org.bouncycastle.openpgp.PGPException;
+import org.bouncycastle.openpgp.PGPPublicKey;
+import org.bouncycastle.openpgp.PGPSignature;
+import org.bouncycastle.openpgp.operator.bc.BcPGPContentVerifierBuilderProvider;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.transport.PushCertificateIdent;
+
+/**
+ * Checker for GPG public keys including Gerrit-specific checks.
+ *
+ * <p>For Gerrit, keys must contain a self-signed user ID certification matching a trusted external
+ * ID in the database, or an email address thereof.
+ */
+public class GerritPublicKeyChecker extends PublicKeyChecker {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  @Singleton
+  public static class Factory {
+    private final Provider<InternalAccountQuery> accountQueryProvider;
+    private final DynamicItem<UrlFormatter> urlFormatter;
+    private final IdentifiedUser.GenericFactory userFactory;
+    private final int maxTrustDepth;
+    private final ImmutableMap<Long, Fingerprint> trusted;
+
+    @Inject
+    Factory(
+        @GerritServerConfig Config cfg,
+        Provider<InternalAccountQuery> accountQueryProvider,
+        IdentifiedUser.GenericFactory userFactory,
+        DynamicItem<UrlFormatter> urlFormatter) {
+      this.accountQueryProvider = accountQueryProvider;
+      this.urlFormatter = urlFormatter;
+      this.userFactory = userFactory;
+      this.maxTrustDepth = cfg.getInt("receive", null, "maxTrustDepth", 0);
+
+      String[] strs = cfg.getStringList("receive", null, "trustedKey");
+      if (strs.length != 0) {
+        Map<Long, Fingerprint> fps = Maps.newHashMapWithExpectedSize(strs.length);
+        for (String str : strs) {
+          str = CharMatcher.whitespace().removeFrom(str).toUpperCase();
+          Fingerprint fp = new Fingerprint(BaseEncoding.base16().decode(str));
+          fps.put(fp.getId(), fp);
+        }
+        trusted = ImmutableMap.copyOf(fps);
+      } else {
+        trusted = null;
+      }
+    }
+
+    public GerritPublicKeyChecker create() {
+      return new GerritPublicKeyChecker(this);
+    }
+
+    public GerritPublicKeyChecker create(IdentifiedUser expectedUser, PublicKeyStore store) {
+      GerritPublicKeyChecker checker = new GerritPublicKeyChecker(this);
+      checker.setExpectedUser(expectedUser);
+      checker.setStore(store);
+      return checker;
+    }
+  }
+
+  private final Provider<InternalAccountQuery> accountQueryProvider;
+  private final DynamicItem<UrlFormatter> urlFormatter;
+  private final IdentifiedUser.GenericFactory userFactory;
+
+  private IdentifiedUser expectedUser;
+
+  private GerritPublicKeyChecker(Factory factory) {
+    this.accountQueryProvider = factory.accountQueryProvider;
+    this.urlFormatter = factory.urlFormatter;
+    this.userFactory = factory.userFactory;
+    if (factory.trusted != null) {
+      enableTrust(factory.maxTrustDepth, factory.trusted);
+    }
+  }
+
+  /**
+   * Set the expected user for this checker.
+   *
+   * <p>If set, the top-level key passed to {@link #check(PGPPublicKey)} must belong to the given
+   * user. (Other keys checked in the course of verifying the web of trust are checked against the
+   * set of identities in the database belonging to the same user as the key.)
+   */
+  public GerritPublicKeyChecker setExpectedUser(IdentifiedUser expectedUser) {
+    this.expectedUser = expectedUser;
+    return this;
+  }
+
+  @Override
+  public CheckResult checkCustom(PGPPublicKey key, int depth) {
+    try {
+      if (depth == 0 && expectedUser != null) {
+        return checkIdsForExpectedUser(key);
+      }
+      return checkIdsForArbitraryUser(key);
+    } catch (PGPException | OrmException e) {
+      String msg = "Error checking user IDs for key";
+      logger.atWarning().withCause(e).log("%s %s", msg, keyIdToString(key.getKeyID()));
+      return CheckResult.bad(msg);
+    }
+  }
+
+  private CheckResult checkIdsForExpectedUser(PGPPublicKey key) throws PGPException {
+    Set<String> allowedUserIds = getAllowedUserIds(expectedUser);
+    if (allowedUserIds.isEmpty()) {
+      Optional<String> settings = urlFormatter.get().getSettingsUrl("Identities");
+      return CheckResult.bad(
+          "No identities found for user"
+              + (settings.isPresent() ? "; check " + settings.get() : ""));
+    }
+    if (hasAllowedUserId(key, allowedUserIds)) {
+      return CheckResult.trusted();
+    }
+    return CheckResult.bad(missingUserIds(allowedUserIds));
+  }
+
+  private CheckResult checkIdsForArbitraryUser(PGPPublicKey key) throws PGPException, OrmException {
+    List<AccountState> accountStates = accountQueryProvider.get().byExternalId(toExtIdKey(key));
+    if (accountStates.isEmpty()) {
+      return CheckResult.bad("Key is not associated with any users");
+    }
+    if (accountStates.size() > 1) {
+      return CheckResult.bad("Key is associated with multiple users");
+    }
+    IdentifiedUser user = userFactory.create(accountStates.get(0));
+
+    Set<String> allowedUserIds = getAllowedUserIds(user);
+    if (allowedUserIds.isEmpty()) {
+      return CheckResult.bad("No identities found for user");
+    }
+    if (hasAllowedUserId(key, allowedUserIds)) {
+      return CheckResult.trusted();
+    }
+    return CheckResult.bad("Key does not contain any valid certifications for user's identities");
+  }
+
+  private boolean hasAllowedUserId(PGPPublicKey key, Set<String> allowedUserIds)
+      throws PGPException {
+    Iterator<String> userIds = key.getUserIDs();
+    while (userIds.hasNext()) {
+      String userId = userIds.next();
+      if (isAllowed(userId, allowedUserIds)) {
+        Iterator<PGPSignature> sigs = getSignaturesForId(key, userId);
+        while (sigs.hasNext()) {
+          if (isValidCertification(key, sigs.next(), userId)) {
+            return true;
+          }
+        }
+      }
+    }
+
+    return false;
+  }
+
+  private Iterator<PGPSignature> getSignaturesForId(PGPPublicKey key, String userId) {
+    Iterator<PGPSignature> result = key.getSignaturesForID(userId);
+    return result != null ? result : Collections.emptyIterator();
+  }
+
+  private Set<String> getAllowedUserIds(IdentifiedUser user) {
+    Set<String> result = new HashSet<>();
+    result.addAll(user.getEmailAddresses());
+    for (ExternalId extId : user.state().getExternalIds()) {
+      if (extId.isScheme(SCHEME_GPGKEY)) {
+        continue; // Omit GPG keys.
+      }
+      result.add(extId.key().get());
+    }
+    return result;
+  }
+
+  private static boolean isAllowed(String userId, Set<String> allowedUserIds) {
+    return allowedUserIds.contains(userId)
+        || allowedUserIds.contains(PushCertificateIdent.parse(userId).getEmailAddress());
+  }
+
+  private static boolean isValidCertification(PGPPublicKey key, PGPSignature sig, String userId)
+      throws PGPException {
+    if (sig.getSignatureType() != PGPSignature.DEFAULT_CERTIFICATION
+        && sig.getSignatureType() != PGPSignature.POSITIVE_CERTIFICATION) {
+      return false;
+    }
+    if (sig.getKeyID() != key.getKeyID()) {
+      return false;
+    }
+    // TODO(dborowitz): Handle certification revocations:
+    // - Is there a revocation by either this key or another key trusted by the
+    //   server?
+    // - Does such a revocation postdate all other valid certifications?
+
+    sig.init(new BcPGPContentVerifierBuilderProvider(), key);
+    return sig.verifyCertification(userId, key);
+  }
+
+  private static String missingUserIds(Set<String> allowedUserIds) {
+    StringBuilder sb =
+        new StringBuilder(
+            "Key must contain a valid certification for one of the following identities:\n");
+    Iterator<String> sorted = allowedUserIds.stream().sorted().iterator();
+    while (sorted.hasNext()) {
+      sb.append("  ").append(sorted.next());
+      if (sorted.hasNext()) {
+        sb.append('\n');
+      }
+    }
+    return sb.toString();
+  }
+
+  static ExternalId.Key toExtIdKey(PGPPublicKey key) {
+    return ExternalId.Key.create(SCHEME_GPGKEY, BaseEncoding.base16().encode(key.getFingerprint()));
+  }
+}
diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/GerritPushCertificateChecker.java b/java/com/google/gerrit/gpg/GerritPushCertificateChecker.java
similarity index 100%
rename from gerrit-gpg/src/main/java/com/google/gerrit/gpg/GerritPushCertificateChecker.java
rename to java/com/google/gerrit/gpg/GerritPushCertificateChecker.java
diff --git a/java/com/google/gerrit/gpg/GpgModule.java b/java/com/google/gerrit/gpg/GpgModule.java
new file mode 100644
index 0000000..45c1ab5
--- /dev/null
+++ b/java/com/google/gerrit/gpg/GpgModule.java
@@ -0,0 +1,49 @@
+// Copyright (C) 2015 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.google.gerrit.gpg;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.config.FactoryModule;
+import com.google.gerrit.gpg.api.GpgApiModule;
+import com.google.gerrit.server.EnableSignedPush;
+import org.eclipse.jgit.lib.Config;
+
+public class GpgModule extends FactoryModule {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final Config cfg;
+
+  public GpgModule(Config cfg) {
+    this.cfg = cfg;
+  }
+
+  @Override
+  protected void configure() {
+    boolean configEnableSignedPush = cfg.getBoolean("receive", null, "enableSignedPush", false);
+    boolean configEditGpgKeys = cfg.getBoolean("gerrit", null, "editGpgKeys", true);
+    boolean havePgp = BouncyCastleUtil.havePGP();
+    boolean enableSignedPush = configEnableSignedPush && havePgp;
+    bindConstant().annotatedWith(EnableSignedPush.class).to(enableSignedPush);
+
+    if (configEnableSignedPush && !havePgp) {
+      logger.atInfo().log("Bouncy Castle PGP not installed; signed push verification is disabled");
+    }
+    if (enableSignedPush) {
+      install(new SignedPushModule());
+      factory(GerritPushCertificateChecker.Factory.class);
+    }
+    install(new GpgApiModule(enableSignedPush && configEditGpgKeys));
+  }
+}
diff --git a/java/com/google/gerrit/gpg/PublicKeyChecker.java b/java/com/google/gerrit/gpg/PublicKeyChecker.java
new file mode 100644
index 0000000..07b42f1
--- /dev/null
+++ b/java/com/google/gerrit/gpg/PublicKeyChecker.java
@@ -0,0 +1,472 @@
+// Copyright (C) 2015 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.google.gerrit.gpg;
+
+import static com.google.common.flogger.LazyArgs.lazy;
+import static com.google.gerrit.extensions.common.GpgKeyInfo.Status.BAD;
+import static com.google.gerrit.extensions.common.GpgKeyInfo.Status.OK;
+import static com.google.gerrit.extensions.common.GpgKeyInfo.Status.TRUSTED;
+import static com.google.gerrit.gpg.PublicKeyStore.keyIdToString;
+import static com.google.gerrit.gpg.PublicKeyStore.keyToString;
+import static org.bouncycastle.bcpg.SignatureSubpacketTags.REVOCATION_KEY;
+import static org.bouncycastle.bcpg.SignatureSubpacketTags.REVOCATION_REASON;
+import static org.bouncycastle.bcpg.sig.RevocationReasonTags.KEY_COMPROMISED;
+import static org.bouncycastle.bcpg.sig.RevocationReasonTags.KEY_RETIRED;
+import static org.bouncycastle.bcpg.sig.RevocationReasonTags.KEY_SUPERSEDED;
+import static org.bouncycastle.bcpg.sig.RevocationReasonTags.NO_REASON;
+import static org.bouncycastle.openpgp.PGPSignature.DIRECT_KEY;
+import static org.bouncycastle.openpgp.PGPSignature.KEY_REVOCATION;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.common.GpgKeyInfo.Status;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.bouncycastle.bcpg.SignatureSubpacket;
+import org.bouncycastle.bcpg.SignatureSubpacketTags;
+import org.bouncycastle.bcpg.sig.RevocationKey;
+import org.bouncycastle.bcpg.sig.RevocationReason;
+import org.bouncycastle.openpgp.PGPException;
+import org.bouncycastle.openpgp.PGPPublicKey;
+import org.bouncycastle.openpgp.PGPPublicKeyRing;
+import org.bouncycastle.openpgp.PGPPublicKeyRingCollection;
+import org.bouncycastle.openpgp.PGPSignature;
+import org.bouncycastle.openpgp.operator.bc.BcPGPContentVerifierBuilderProvider;
+
+/** Checker for GPG public keys for use in a push certificate. */
+public class PublicKeyChecker {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  // https://tools.ietf.org/html/rfc4880#section-5.2.3.13
+  private static final int COMPLETE_TRUST = 120;
+
+  private PublicKeyStore store;
+  private Map<Long, Fingerprint> trusted;
+  private int maxTrustDepth;
+  private Date effectiveTime = new Date();
+
+  /**
+   * Enable web-of-trust checks.
+   *
+   * <p>If enabled, a store must be set with {@link #setStore(PublicKeyStore)}. (These methods are
+   * separate since the store is a closeable resource that may not be available when reading trusted
+   * keys from a config.)
+   *
+   * @param maxTrustDepth maximum depth to search while looking for a trusted key.
+   * @param trusted ultimately trusted key fingerprints, keyed by fingerprint; may not be empty. To
+   *     construct a map, see {@link Fingerprint#byId(Iterable)}.
+   * @return a reference to this object.
+   */
+  public PublicKeyChecker enableTrust(int maxTrustDepth, Map<Long, Fingerprint> trusted) {
+    if (maxTrustDepth <= 0) {
+      throw new IllegalArgumentException("maxTrustDepth must be positive, got: " + maxTrustDepth);
+    }
+    if (trusted == null || trusted.isEmpty()) {
+      throw new IllegalArgumentException("at least one trusted key is required");
+    }
+    this.maxTrustDepth = maxTrustDepth;
+    this.trusted = trusted;
+    return this;
+  }
+
+  /** Disable web-of-trust checks. */
+  public PublicKeyChecker disableTrust() {
+    trusted = null;
+    return this;
+  }
+
+  /** Set the public key store for reading keys referenced in signatures. */
+  public PublicKeyChecker setStore(PublicKeyStore store) {
+    if (store == null) {
+      throw new IllegalArgumentException("PublicKeyStore is required");
+    }
+    this.store = store;
+    return this;
+  }
+
+  /**
+   * Set the effective time for checking the key.
+   *
+   * <p>If set, check whether the key should be considered valid (e.g. unexpired) as of this time.
+   *
+   * @param effectiveTime effective time.
+   * @return a reference to this object.
+   */
+  public PublicKeyChecker setEffectiveTime(Date effectiveTime) {
+    this.effectiveTime = effectiveTime;
+    return this;
+  }
+
+  protected Date getEffectiveTime() {
+    return effectiveTime;
+  }
+
+  /**
+   * Check a public key.
+   *
+   * @param key the public key.
+   * @return the result of the check.
+   */
+  public final CheckResult check(PGPPublicKey key) {
+    if (store == null) {
+      throw new IllegalStateException("PublicKeyStore is required");
+    }
+    return check(key, 0, true, trusted != null ? new HashSet<Fingerprint>() : null);
+  }
+
+  /**
+   * Perform custom checks.
+   *
+   * <p>Default implementation reports no problems, but may be overridden by subclasses.
+   *
+   * @param key the public key.
+   * @param depth the depth from the initial key passed to {@link #check( PGPPublicKey)}: 0 if this
+   *     was the initial key, up to a maximum of {@code maxTrustDepth}.
+   * @return the result of the custom check.
+   */
+  public CheckResult checkCustom(PGPPublicKey key, int depth) {
+    return CheckResult.ok();
+  }
+
+  private CheckResult check(PGPPublicKey key, int depth, boolean expand, Set<Fingerprint> seen) {
+    CheckResult basicResult = checkBasic(key, effectiveTime);
+    CheckResult customResult = checkCustom(key, depth);
+    CheckResult trustResult = checkWebOfTrust(key, store, depth, seen);
+    if (!expand && !trustResult.isTrusted()) {
+      trustResult = CheckResult.create(trustResult.getStatus(), "Key is not trusted");
+    }
+
+    List<String> problems =
+        new ArrayList<>(
+            basicResult.getProblems().size()
+                + customResult.getProblems().size()
+                + trustResult.getProblems().size());
+    problems.addAll(basicResult.getProblems());
+    problems.addAll(customResult.getProblems());
+    problems.addAll(trustResult.getProblems());
+
+    Status status;
+    if (basicResult.getStatus() == BAD
+        || customResult.getStatus() == BAD
+        || trustResult.getStatus() == BAD) {
+      // Any BAD result and the final result is BAD.
+      status = BAD;
+    } else if (trustResult.getStatus() == TRUSTED) {
+      // basicResult is BAD or OK, whereas trustResult is BAD or TRUSTED. If
+      // TRUSTED, we trust the final result.
+      status = TRUSTED;
+    } else {
+      // All results were OK or better, but trustResult was not TRUSTED. Don't
+      // let subclasses bypass checkWebOfTrust by returning TRUSTED; just return
+      // OK here.
+      status = OK;
+    }
+    return CheckResult.create(status, problems);
+  }
+
+  private CheckResult checkBasic(PGPPublicKey key, Date now) {
+    List<String> problems = new ArrayList<>(2);
+    gatherRevocationProblems(key, now, problems);
+
+    long validMs = key.getValidSeconds() * 1000;
+    if (validMs != 0) {
+      long msSinceCreation = now.getTime() - key.getCreationTime().getTime();
+      if (msSinceCreation > validMs) {
+        problems.add("Key is expired");
+      }
+    }
+    return CheckResult.create(problems);
+  }
+
+  private void gatherRevocationProblems(PGPPublicKey key, Date now, List<String> problems) {
+    try {
+      List<PGPSignature> revocations = new ArrayList<>();
+      Map<Long, RevocationKey> revokers = new HashMap<>();
+      PGPSignature selfRevocation = scanRevocations(key, now, revocations, revokers);
+      if (selfRevocation != null) {
+        RevocationReason reason = getRevocationReason(selfRevocation);
+        if (isRevocationValid(selfRevocation, reason, now)) {
+          problems.add(reasonToString(reason));
+        }
+      } else {
+        checkRevocations(key, revocations, revokers, problems);
+      }
+    } catch (PGPException | IOException e) {
+      problems.add("Error checking key revocation");
+    }
+  }
+
+  private static boolean isRevocationValid(
+      PGPSignature revocation, RevocationReason reason, Date now) {
+    // RFC4880 states:
+    // "If a key has been revoked because of a compromise, all signatures
+    // created by that key are suspect. However, if it was merely superseded or
+    // retired, old signatures are still valid."
+    //
+    // Note that GnuPG does not implement this correctly, as it does not
+    // consider the revocation reason and timestamp when checking whether a
+    // signature (data or certification) is valid.
+    return reason.getRevocationReason() == KEY_COMPROMISED
+        || revocation.getCreationTime().before(now);
+  }
+
+  private PGPSignature scanRevocations(
+      PGPPublicKey key, Date now, List<PGPSignature> revocations, Map<Long, RevocationKey> revokers)
+      throws PGPException {
+    @SuppressWarnings("unchecked")
+    Iterator<PGPSignature> allSigs = key.getSignatures();
+    while (allSigs.hasNext()) {
+      PGPSignature sig = allSigs.next();
+      switch (sig.getSignatureType()) {
+        case KEY_REVOCATION:
+          if (sig.getKeyID() == key.getKeyID()) {
+            sig.init(new BcPGPContentVerifierBuilderProvider(), key);
+            if (sig.verifyCertification(key)) {
+              return sig;
+            }
+          } else {
+            RevocationReason reason = getRevocationReason(sig);
+            if (reason != null && isRevocationValid(sig, reason, now)) {
+              revocations.add(sig);
+            }
+          }
+          break;
+        case DIRECT_KEY:
+          RevocationKey r = getRevocationKey(key, sig);
+          if (r != null) {
+            revokers.put(Fingerprint.getId(r.getFingerprint()), r);
+          }
+          break;
+      }
+    }
+    return null;
+  }
+
+  private RevocationKey getRevocationKey(PGPPublicKey key, PGPSignature sig) throws PGPException {
+    if (sig.getKeyID() != key.getKeyID()) {
+      return null;
+    }
+    SignatureSubpacket sub = sig.getHashedSubPackets().getSubpacket(REVOCATION_KEY);
+    if (sub == null) {
+      return null;
+    }
+    sig.init(new BcPGPContentVerifierBuilderProvider(), key);
+    if (!sig.verifyCertification(key)) {
+      return null;
+    }
+
+    return new RevocationKey(sub.isCritical(), sub.isLongLength(), sub.getData());
+  }
+
+  private void checkRevocations(
+      PGPPublicKey key,
+      List<PGPSignature> revocations,
+      Map<Long, RevocationKey> revokers,
+      List<String> problems)
+      throws PGPException, IOException {
+    for (PGPSignature revocation : revocations) {
+      RevocationKey revoker = revokers.get(revocation.getKeyID());
+      if (revoker == null) {
+        continue; // Not a designated revoker.
+      }
+      byte[] rfp = revoker.getFingerprint();
+      PGPPublicKeyRing revokerKeyRing = store.get(rfp);
+      if (revokerKeyRing == null) {
+        // Revoker is authorized and there is a revocation signature by this
+        // revoker, but the key is not in the store so we can't verify the
+        // signature.
+        logger.atInfo().log(
+            "Key %s is revoked by %s, which is not in the store. Assuming revocation is valid.",
+            lazy(() -> Fingerprint.toString(key.getFingerprint())),
+            lazy(() -> Fingerprint.toString(rfp)));
+        problems.add(reasonToString(getRevocationReason(revocation)));
+        continue;
+      }
+      PGPPublicKey rk = revokerKeyRing.getPublicKey();
+      if (rk.getAlgorithm() != revoker.getAlgorithm()) {
+        continue;
+      }
+      if (!checkBasic(rk, revocation.getCreationTime()).isOk()) {
+        // Revoker's key was expired or revoked at time of revocation, so the
+        // revocation is invalid.
+        continue;
+      }
+      revocation.init(new BcPGPContentVerifierBuilderProvider(), rk);
+      if (revocation.verifyCertification(key)) {
+        problems.add(reasonToString(getRevocationReason(revocation)));
+      }
+    }
+  }
+
+  private static RevocationReason getRevocationReason(PGPSignature sig) {
+    if (sig.getSignatureType() != KEY_REVOCATION) {
+      throw new IllegalArgumentException(
+          "Expected KEY_REVOCATION signature, got " + sig.getSignatureType());
+    }
+    SignatureSubpacket sub = sig.getHashedSubPackets().getSubpacket(REVOCATION_REASON);
+    if (sub == null) {
+      return null;
+    }
+    return new RevocationReason(sub.isCritical(), sub.isLongLength(), sub.getData());
+  }
+
+  private static String reasonToString(RevocationReason reason) {
+    StringBuilder r = new StringBuilder("Key is revoked (");
+    if (reason == null) {
+      return r.append("no reason provided)").toString();
+    }
+    switch (reason.getRevocationReason()) {
+      case NO_REASON:
+        r.append("no reason code specified");
+        break;
+      case KEY_SUPERSEDED:
+        r.append("superseded");
+        break;
+      case KEY_COMPROMISED:
+        r.append("key material has been compromised");
+        break;
+      case KEY_RETIRED:
+        r.append("retired and no longer valid");
+        break;
+      default:
+        r.append("reason code ").append(Integer.toString(reason.getRevocationReason())).append(')');
+        break;
+    }
+    r.append(')');
+    String desc = reason.getRevocationDescription();
+    if (!desc.isEmpty()) {
+      r.append(": ").append(desc);
+    }
+    return r.toString();
+  }
+
+  private CheckResult checkWebOfTrust(
+      PGPPublicKey key, PublicKeyStore store, int depth, Set<Fingerprint> seen) {
+    if (trusted == null) {
+      // Trust checking not configured, server trusts all OK keys.
+      return CheckResult.trusted();
+    }
+    Fingerprint fp = new Fingerprint(key.getFingerprint());
+    if (seen.contains(fp)) {
+      return CheckResult.ok("Key is trusted in a cycle");
+    }
+    seen.add(fp);
+
+    Fingerprint trustedFp = trusted.get(key.getKeyID());
+    if (trustedFp != null && trustedFp.equals(fp)) {
+      return CheckResult.trusted(); // Directly trusted.
+    } else if (depth >= maxTrustDepth) {
+      return CheckResult.ok("No path of depth <= " + maxTrustDepth + " to a trusted key");
+    }
+
+    List<CheckResult> signerResults = new ArrayList<>();
+    Iterator<String> userIds = key.getUserIDs();
+    while (userIds.hasNext()) {
+      String userId = userIds.next();
+
+      // Don't check the timestamp of these certifications. This allows admins
+      // to correct untrusted keys by signing them with a trusted key, such that
+      // older signatures created by those keys retroactively appear valid.
+      Iterator<PGPSignature> sigs = key.getSignaturesForID(userId);
+
+      while (sigs.hasNext()) {
+        PGPSignature sig = sigs.next();
+        // TODO(dborowitz): Handle CERTIFICATION_REVOCATION.
+        if (sig.getSignatureType() != PGPSignature.DEFAULT_CERTIFICATION
+            && sig.getSignatureType() != PGPSignature.POSITIVE_CERTIFICATION) {
+          continue; // Not a certification.
+        }
+
+        PGPPublicKey signer = getSigner(store, sig, userId, key, signerResults);
+        // TODO(dborowitz): Require self certification.
+        if (signer == null || Arrays.equals(signer.getFingerprint(), key.getFingerprint())) {
+          continue;
+        }
+        String subpacketProblem = checkTrustSubpacket(sig, depth);
+        if (subpacketProblem == null) {
+          CheckResult signerResult = check(signer, depth + 1, false, seen);
+          if (signerResult.isTrusted()) {
+            return CheckResult.trusted();
+          }
+        }
+        signerResults.add(
+            CheckResult.ok(
+                "Certification by " + keyToString(signer) + " is valid, but key is not trusted"));
+      }
+    }
+
+    List<String> problems = new ArrayList<>();
+    problems.add("No path to a trusted key");
+    for (CheckResult signerResult : signerResults) {
+      problems.addAll(signerResult.getProblems());
+    }
+    return CheckResult.create(OK, problems);
+  }
+
+  private static PGPPublicKey getSigner(
+      PublicKeyStore store,
+      PGPSignature sig,
+      String userId,
+      PGPPublicKey key,
+      List<CheckResult> results) {
+    try {
+      PGPPublicKeyRingCollection signers = store.get(sig.getKeyID());
+      if (!signers.getKeyRings().hasNext()) {
+        results.add(
+            CheckResult.ok(
+                "Key "
+                    + keyIdToString(sig.getKeyID())
+                    + " used for certification is not in store"));
+        return null;
+      }
+      PGPPublicKey signer = PublicKeyStore.getSigner(signers, sig, userId, key);
+      if (signer == null) {
+        results.add(
+            CheckResult.ok("Certification by " + keyIdToString(sig.getKeyID()) + " is not valid"));
+        return null;
+      }
+      return signer;
+    } catch (PGPException | IOException e) {
+      results.add(
+          CheckResult.ok("Error checking certification by " + keyIdToString(sig.getKeyID())));
+      return null;
+    }
+  }
+
+  private String checkTrustSubpacket(PGPSignature sig, int depth) {
+    SignatureSubpacket trustSub =
+        sig.getHashedSubPackets().getSubpacket(SignatureSubpacketTags.TRUST_SIG);
+    if (trustSub == null || trustSub.getData().length != 2) {
+      return "Certification is missing trust information";
+    }
+    byte amount = trustSub.getData()[1];
+    if (amount < COMPLETE_TRUST) {
+      return "Certification does not fully trust key";
+    }
+    byte level = trustSub.getData()[0];
+    int required = depth + 1;
+    if (level < required) {
+      return "Certification trusts to depth " + level + ", but depth " + required + " is required";
+    }
+    return null;
+  }
+}
diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/PublicKeyStore.java b/java/com/google/gerrit/gpg/PublicKeyStore.java
similarity index 100%
rename from gerrit-gpg/src/main/java/com/google/gerrit/gpg/PublicKeyStore.java
rename to java/com/google/gerrit/gpg/PublicKeyStore.java
diff --git a/java/com/google/gerrit/gpg/PushCertificateChecker.java b/java/com/google/gerrit/gpg/PushCertificateChecker.java
new file mode 100644
index 0000000..82b3892
--- /dev/null
+++ b/java/com/google/gerrit/gpg/PushCertificateChecker.java
@@ -0,0 +1,216 @@
+// Copyright (C) 2015 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.google.gerrit.gpg;
+
+import static com.google.gerrit.extensions.common.GpgKeyInfo.Status.BAD;
+import static com.google.gerrit.extensions.common.GpgKeyInfo.Status.OK;
+import static com.google.gerrit.extensions.common.GpgKeyInfo.Status.TRUSTED;
+import static com.google.gerrit.gpg.PublicKeyStore.keyIdToString;
+import static com.google.gerrit.gpg.PublicKeyStore.keyToString;
+
+import com.google.common.base.Joiner;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.common.GpgKeyInfo.Status;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import org.bouncycastle.bcpg.ArmoredInputStream;
+import org.bouncycastle.openpgp.PGPException;
+import org.bouncycastle.openpgp.PGPObjectFactory;
+import org.bouncycastle.openpgp.PGPPublicKey;
+import org.bouncycastle.openpgp.PGPPublicKeyRingCollection;
+import org.bouncycastle.openpgp.PGPSignature;
+import org.bouncycastle.openpgp.PGPSignatureList;
+import org.bouncycastle.openpgp.bc.BcPGPObjectFactory;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.transport.PushCertificate;
+import org.eclipse.jgit.transport.PushCertificate.NonceStatus;
+
+/** Checker for push certificates. */
+public abstract class PushCertificateChecker {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static class Result {
+    private final PGPPublicKey key;
+    private final CheckResult checkResult;
+
+    private Result(PGPPublicKey key, CheckResult checkResult) {
+      this.key = key;
+      this.checkResult = checkResult;
+    }
+
+    public PGPPublicKey getPublicKey() {
+      return key;
+    }
+
+    public CheckResult getCheckResult() {
+      return checkResult;
+    }
+  }
+
+  private final PublicKeyChecker publicKeyChecker;
+
+  private boolean checkNonce;
+
+  protected PushCertificateChecker(PublicKeyChecker publicKeyChecker) {
+    this.publicKeyChecker = publicKeyChecker;
+    checkNonce = true;
+  }
+
+  /** Set whether to check the status of the nonce; defaults to true. */
+  public PushCertificateChecker setCheckNonce(boolean checkNonce) {
+    this.checkNonce = checkNonce;
+    return this;
+  }
+
+  /**
+   * Check a push certificate.
+   *
+   * @return result of the check.
+   */
+  public final Result check(PushCertificate cert) {
+    if (checkNonce && cert.getNonceStatus() != NonceStatus.OK) {
+      return new Result(null, CheckResult.bad("Invalid nonce"));
+    }
+    List<CheckResult> results = new ArrayList<>(2);
+    Result sigResult = null;
+    try {
+      PGPSignature sig = readSignature(cert);
+      if (sig != null) {
+        @SuppressWarnings("resource")
+        Repository repo = getRepository();
+        try (PublicKeyStore store = new PublicKeyStore(repo)) {
+          sigResult = checkSignature(sig, cert, store);
+          results.add(checkCustom(repo));
+        } finally {
+          if (shouldClose(repo)) {
+            repo.close();
+          }
+        }
+      } else {
+        results.add(CheckResult.bad("Invalid signature format"));
+      }
+    } catch (PGPException | IOException e) {
+      String msg = "Internal error checking push certificate";
+      logger.atSevere().withCause(e).log(msg);
+      results.add(CheckResult.bad(msg));
+    }
+
+    return combine(sigResult, results);
+  }
+
+  private static Result combine(Result sigResult, List<CheckResult> results) {
+    // Combine results:
+    //  - If any input result is BAD, the final result is bad.
+    //  - If sigResult is TRUSTED and no other result is BAD, the final result
+    //    is TRUSTED.
+    //  - Otherwise, the result is OK.
+    List<String> problems = new ArrayList<>();
+    boolean bad = false;
+    for (CheckResult result : results) {
+      problems.addAll(result.getProblems());
+      bad |= result.getStatus() == BAD;
+    }
+    Status status = bad ? BAD : OK;
+
+    PGPPublicKey key;
+    if (sigResult != null) {
+      key = sigResult.getPublicKey();
+      CheckResult cr = sigResult.getCheckResult();
+      problems.addAll(cr.getProblems());
+      if (cr.getStatus() == BAD) {
+        status = BAD;
+      } else if (!bad && cr.getStatus() == TRUSTED) {
+        status = TRUSTED;
+      }
+    } else {
+      key = null;
+    }
+    return new Result(key, CheckResult.create(status, problems));
+  }
+
+  /**
+   * Get the repository that this checker should operate on.
+   *
+   * <p>This method is called once per call to {@link #check(PushCertificate)}.
+   *
+   * @return the repository.
+   * @throws IOException if an error occurred reading the repository.
+   */
+  protected abstract Repository getRepository() throws IOException;
+
+  /**
+   * @param repo a repository previously returned by {@link #getRepository()}.
+   * @return whether this repository should be closed before returning from {@link
+   *     #check(PushCertificate)}.
+   */
+  protected abstract boolean shouldClose(Repository repo);
+
+  /**
+   * Perform custom checks.
+   *
+   * <p>Default implementation reports no problems, but may be overridden by subclasses.
+   *
+   * @param repo a repository previously returned by {@link #getRepository()}.
+   * @return the result of the custom check.
+   */
+  protected CheckResult checkCustom(Repository repo) {
+    return CheckResult.ok();
+  }
+
+  private PGPSignature readSignature(PushCertificate cert) throws IOException {
+    ArmoredInputStream in =
+        new ArmoredInputStream(new ByteArrayInputStream(Constants.encode(cert.getSignature())));
+    PGPObjectFactory factory = new BcPGPObjectFactory(in);
+    Object obj;
+    while ((obj = factory.nextObject()) != null) {
+      if (obj instanceof PGPSignatureList) {
+        PGPSignatureList sigs = (PGPSignatureList) obj;
+        if (!sigs.isEmpty()) {
+          return sigs.get(0);
+        }
+      }
+    }
+    return null;
+  }
+
+  private Result checkSignature(PGPSignature sig, PushCertificate cert, PublicKeyStore store)
+      throws PGPException, IOException {
+    PGPPublicKeyRingCollection keys = store.get(sig.getKeyID());
+    if (!keys.getKeyRings().hasNext()) {
+      return new Result(
+          null,
+          CheckResult.bad("No public keys found for key ID " + keyIdToString(sig.getKeyID())));
+    }
+    PGPPublicKey signer = PublicKeyStore.getSigner(keys, sig, Constants.encode(cert.toText()));
+    if (signer == null) {
+      return new Result(
+          null, CheckResult.bad("Signature by " + keyIdToString(sig.getKeyID()) + " is not valid"));
+    }
+    CheckResult result =
+        publicKeyChecker.setStore(store).setEffectiveTime(sig.getCreationTime()).check(signer);
+    if (!result.getProblems().isEmpty()) {
+      StringBuilder err =
+          new StringBuilder("Invalid public key ")
+              .append(keyToString(signer))
+              .append(":\n  ")
+              .append(Joiner.on("\n  ").join(result.getProblems()));
+      return new Result(signer, CheckResult.create(result.getStatus(), err.toString()));
+    }
+    return new Result(signer, result);
+  }
+}
diff --git a/java/com/google/gerrit/gpg/SignedPushModule.java b/java/com/google/gerrit/gpg/SignedPushModule.java
new file mode 100644
index 0000000..a051861
--- /dev/null
+++ b/java/com/google/gerrit/gpg/SignedPushModule.java
@@ -0,0 +1,160 @@
+// Copyright (C) 2015 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.google.gerrit.gpg;
+
+import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.EnableSignedPush;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.ReceivePackInitializer;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.inject.AbstractModule;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.ProvisionException;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.transport.PreReceiveHook;
+import org.eclipse.jgit.transport.PreReceiveHookChain;
+import org.eclipse.jgit.transport.ReceivePack;
+import org.eclipse.jgit.transport.SignedPushConfig;
+
+class SignedPushModule extends AbstractModule {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  @Override
+  protected void configure() {
+    if (!BouncyCastleUtil.havePGP()) {
+      throw new ProvisionException("Bouncy Castle PGP not installed");
+    }
+    bind(PublicKeyStore.class).toProvider(StoreProvider.class);
+    DynamicSet.bind(binder(), ReceivePackInitializer.class).to(Initializer.class);
+  }
+
+  @Singleton
+  private static class Initializer implements ReceivePackInitializer {
+    private final SignedPushConfig signedPushConfig;
+    private final SignedPushPreReceiveHook hook;
+    private final ProjectCache projectCache;
+
+    @Inject
+    Initializer(
+        @GerritServerConfig Config cfg,
+        @EnableSignedPush boolean enableSignedPush,
+        SignedPushPreReceiveHook hook,
+        ProjectCache projectCache) {
+      this.hook = hook;
+      this.projectCache = projectCache;
+
+      if (enableSignedPush) {
+        String seed = cfg.getString("receive", null, "certNonceSeed");
+        if (Strings.isNullOrEmpty(seed)) {
+          seed = randomString(64);
+        }
+        signedPushConfig = new SignedPushConfig();
+        signedPushConfig.setCertNonceSeed(seed);
+        signedPushConfig.setCertNonceSlopLimit(
+            cfg.getInt("receive", null, "certNonceSlop", 5 * 60));
+      } else {
+        signedPushConfig = null;
+      }
+    }
+
+    @Override
+    public void init(Project.NameKey project, ReceivePack rp) {
+      ProjectState ps = projectCache.get(project);
+      if (!ps.is(BooleanProjectConfig.ENABLE_SIGNED_PUSH)) {
+        rp.setSignedPushConfig(null);
+        return;
+      } else if (signedPushConfig == null) {
+        logger.atSevere().log(
+            "receive.enableSignedPush is true for project %s but"
+                + " false in gerrit.config, so signed push verification is"
+                + " disabled",
+            project.get());
+        rp.setSignedPushConfig(null);
+        return;
+      }
+      rp.setSignedPushConfig(signedPushConfig);
+
+      List<PreReceiveHook> hooks = new ArrayList<>(3);
+      if (ps.is(BooleanProjectConfig.REQUIRE_SIGNED_PUSH)) {
+        hooks.add(SignedPushPreReceiveHook.Required.INSTANCE);
+      }
+      hooks.add(hook);
+      hooks.add(rp.getPreReceiveHook());
+      rp.setPreReceiveHook(PreReceiveHookChain.newChain(hooks));
+    }
+  }
+
+  @Singleton
+  private static class StoreProvider implements Provider<PublicKeyStore> {
+    private final GitRepositoryManager repoManager;
+    private final AllUsersName allUsers;
+
+    @Inject
+    StoreProvider(GitRepositoryManager repoManager, AllUsersName allUsers) {
+      this.repoManager = repoManager;
+      this.allUsers = allUsers;
+    }
+
+    @Override
+    public PublicKeyStore get() {
+      final Repository repo;
+      try {
+        repo = repoManager.openRepository(allUsers);
+      } catch (IOException e) {
+        throw new ProvisionException("Cannot open " + allUsers, e);
+      }
+      return new PublicKeyStore(repo) {
+        @Override
+        public void close() {
+          try {
+            super.close();
+          } finally {
+            repo.close();
+          }
+        }
+      };
+    }
+  }
+
+  private static String randomString(int len) {
+    Random random;
+    try {
+      random = SecureRandom.getInstance("SHA1PRNG");
+    } catch (NoSuchAlgorithmException e) {
+      throw new IllegalStateException(e);
+    }
+    StringBuilder sb = new StringBuilder(len);
+    for (int i = 0; i < len; i++) {
+      sb.append((char) random.nextInt());
+    }
+    return sb.toString();
+  }
+}
diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/SignedPushPreReceiveHook.java b/java/com/google/gerrit/gpg/SignedPushPreReceiveHook.java
similarity index 100%
rename from gerrit-gpg/src/main/java/com/google/gerrit/gpg/SignedPushPreReceiveHook.java
rename to java/com/google/gerrit/gpg/SignedPushPreReceiveHook.java
diff --git a/java/com/google/gerrit/gpg/api/GpgApiAdapterImpl.java b/java/com/google/gerrit/gpg/api/GpgApiAdapterImpl.java
new file mode 100644
index 0000000..967259a
--- /dev/null
+++ b/java/com/google/gerrit/gpg/api/GpgApiAdapterImpl.java
@@ -0,0 +1,114 @@
+// Copyright (C) 2015 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.google.gerrit.gpg.api;
+
+import com.google.gerrit.extensions.api.accounts.GpgKeyApi;
+import com.google.gerrit.extensions.api.accounts.GpgKeysInput;
+import com.google.gerrit.extensions.common.GpgKeyInfo;
+import com.google.gerrit.extensions.common.PushCertificateInfo;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.gpg.GerritPushCertificateChecker;
+import com.google.gerrit.gpg.PushCertificateChecker;
+import com.google.gerrit.gpg.server.GpgKeys;
+import com.google.gerrit.gpg.server.PostGpgKeys;
+import com.google.gerrit.server.GpgException;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.GpgApiAdapter;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import org.bouncycastle.openpgp.PGPException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.transport.PushCertificate;
+import org.eclipse.jgit.transport.PushCertificateParser;
+
+public class GpgApiAdapterImpl implements GpgApiAdapter {
+  private final Provider<PostGpgKeys> postGpgKeys;
+  private final Provider<GpgKeys> gpgKeys;
+  private final GpgKeyApiImpl.Factory gpgKeyApiFactory;
+  private final GerritPushCertificateChecker.Factory pushCertCheckerFactory;
+
+  @Inject
+  GpgApiAdapterImpl(
+      Provider<PostGpgKeys> postGpgKeys,
+      Provider<GpgKeys> gpgKeys,
+      GpgKeyApiImpl.Factory gpgKeyApiFactory,
+      GerritPushCertificateChecker.Factory pushCertCheckerFactory) {
+    this.postGpgKeys = postGpgKeys;
+    this.gpgKeys = gpgKeys;
+    this.gpgKeyApiFactory = gpgKeyApiFactory;
+    this.pushCertCheckerFactory = pushCertCheckerFactory;
+  }
+
+  @Override
+  public boolean isEnabled() {
+    return true;
+  }
+
+  @Override
+  public Map<String, GpgKeyInfo> listGpgKeys(AccountResource account)
+      throws RestApiException, GpgException {
+    try {
+      return gpgKeys.get().list().apply(account);
+    } catch (OrmException | PGPException | IOException e) {
+      throw new GpgException(e);
+    }
+  }
+
+  @Override
+  public Map<String, GpgKeyInfo> putGpgKeys(
+      AccountResource account, List<String> add, List<String> delete)
+      throws RestApiException, GpgException {
+    GpgKeysInput in = new GpgKeysInput();
+    in.add = add;
+    in.delete = delete;
+    try {
+      return postGpgKeys.get().apply(account, in);
+    } catch (PGPException | OrmException | IOException | ConfigInvalidException e) {
+      throw new GpgException(e);
+    }
+  }
+
+  @Override
+  public GpgKeyApi gpgKey(AccountResource account, IdString idStr)
+      throws RestApiException, GpgException {
+    try {
+      return gpgKeyApiFactory.create(gpgKeys.get().parse(account, idStr));
+    } catch (PGPException | OrmException | IOException e) {
+      throw new GpgException(e);
+    }
+  }
+
+  @Override
+  public PushCertificateInfo checkPushCertificate(String certStr, IdentifiedUser expectedUser)
+      throws GpgException {
+    try {
+      PushCertificate cert = PushCertificateParser.fromString(certStr);
+      PushCertificateChecker.Result result =
+          pushCertCheckerFactory.create(expectedUser).setCheckNonce(false).check(cert);
+      PushCertificateInfo info = new PushCertificateInfo();
+      info.certificate = certStr;
+      info.key = GpgKeys.toJson(result.getPublicKey(), result.getCheckResult());
+      return info;
+    } catch (IOException e) {
+      throw new GpgException(e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/gpg/api/GpgApiModule.java b/java/com/google/gerrit/gpg/api/GpgApiModule.java
new file mode 100644
index 0000000..f0d34f3
--- /dev/null
+++ b/java/com/google/gerrit/gpg/api/GpgApiModule.java
@@ -0,0 +1,89 @@
+// Copyright (C) 2015 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.google.gerrit.gpg.api;
+
+import static com.google.gerrit.gpg.server.GpgKey.GPG_KEY_KIND;
+import static com.google.gerrit.server.account.AccountResource.ACCOUNT_KIND;
+
+import com.google.gerrit.extensions.api.accounts.GpgKeyApi;
+import com.google.gerrit.extensions.common.GpgKeyInfo;
+import com.google.gerrit.extensions.common.PushCertificateInfo;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.NotImplementedException;
+import com.google.gerrit.extensions.restapi.RestApiModule;
+import com.google.gerrit.gpg.server.DeleteGpgKey;
+import com.google.gerrit.gpg.server.GpgKeys;
+import com.google.gerrit.gpg.server.PostGpgKeys;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.GpgApiAdapter;
+import java.util.List;
+import java.util.Map;
+
+public class GpgApiModule extends RestApiModule {
+  private final boolean enabled;
+
+  public GpgApiModule(boolean enabled) {
+    this.enabled = enabled;
+  }
+
+  @Override
+  protected void configure() {
+    if (!enabled) {
+      bind(GpgApiAdapter.class).to(NoGpgApi.class);
+      return;
+    }
+    bind(GpgApiAdapter.class).to(GpgApiAdapterImpl.class);
+    factory(GpgKeyApiImpl.Factory.class);
+
+    DynamicMap.mapOf(binder(), GPG_KEY_KIND);
+
+    child(ACCOUNT_KIND, "gpgkeys").to(GpgKeys.class);
+    post(ACCOUNT_KIND, "gpgkeys").to(PostGpgKeys.class);
+    get(GPG_KEY_KIND).to(GpgKeys.Get.class);
+    delete(GPG_KEY_KIND).to(DeleteGpgKey.class);
+  }
+
+  private static class NoGpgApi implements GpgApiAdapter {
+    private static final String MSG = "GPG key APIs disabled";
+
+    @Override
+    public boolean isEnabled() {
+      return false;
+    }
+
+    @Override
+    public Map<String, GpgKeyInfo> listGpgKeys(AccountResource account) {
+      throw new NotImplementedException(MSG);
+    }
+
+    @Override
+    public Map<String, GpgKeyInfo> putGpgKeys(
+        AccountResource account, List<String> add, List<String> delete) {
+      throw new NotImplementedException(MSG);
+    }
+
+    @Override
+    public GpgKeyApi gpgKey(AccountResource account, IdString idStr) {
+      throw new NotImplementedException(MSG);
+    }
+
+    @Override
+    public PushCertificateInfo checkPushCertificate(String certStr, IdentifiedUser expectedUser) {
+      throw new NotImplementedException(MSG);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/gpg/api/GpgKeyApiImpl.java b/java/com/google/gerrit/gpg/api/GpgKeyApiImpl.java
new file mode 100644
index 0000000..25b472d
--- /dev/null
+++ b/java/com/google/gerrit/gpg/api/GpgKeyApiImpl.java
@@ -0,0 +1,64 @@
+// Copyright (C) 2015 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.google.gerrit.gpg.api;
+
+import com.google.gerrit.extensions.api.accounts.GpgKeyApi;
+import com.google.gerrit.extensions.common.GpgKeyInfo;
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.gpg.server.DeleteGpgKey;
+import com.google.gerrit.gpg.server.GpgKey;
+import com.google.gerrit.gpg.server.GpgKeys;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import org.bouncycastle.openpgp.PGPException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+public class GpgKeyApiImpl implements GpgKeyApi {
+  public interface Factory {
+    GpgKeyApiImpl create(GpgKey rsrc);
+  }
+
+  private final GpgKeys.Get get;
+  private final DeleteGpgKey delete;
+  private final GpgKey rsrc;
+
+  @Inject
+  GpgKeyApiImpl(GpgKeys.Get get, DeleteGpgKey delete, @Assisted GpgKey rsrc) {
+    this.get = get;
+    this.delete = delete;
+    this.rsrc = rsrc;
+  }
+
+  @Override
+  public GpgKeyInfo get() throws RestApiException {
+    try {
+      return get.apply(rsrc);
+    } catch (IOException e) {
+      throw new RestApiException("Cannot get GPG key", e);
+    }
+  }
+
+  @Override
+  public void delete() throws RestApiException {
+    try {
+      delete.apply(rsrc, new Input());
+    } catch (PGPException | OrmException | IOException | ConfigInvalidException e) {
+      throw new RestApiException("Cannot delete GPG key", e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/gpg/server/DeleteGpgKey.java b/java/com/google/gerrit/gpg/server/DeleteGpgKey.java
new file mode 100644
index 0000000..a636a8b
--- /dev/null
+++ b/java/com/google/gerrit/gpg/server/DeleteGpgKey.java
@@ -0,0 +1,111 @@
+// Copyright (C) 2015 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.google.gerrit.gpg.server;
+
+import static com.google.gerrit.gpg.PublicKeyStore.keyIdToString;
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_GPGKEY;
+
+import com.google.common.io.BaseEncoding;
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.gpg.PublicKeyStore;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.UserInitiated;
+import com.google.gerrit.server.account.AccountsUpdate;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.account.externalids.ExternalIds;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.Optional;
+import org.bouncycastle.openpgp.PGPException;
+import org.bouncycastle.openpgp.PGPPublicKey;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.RefUpdate;
+
+public class DeleteGpgKey implements RestModifyView<GpgKey, Input> {
+
+  private final Provider<PersonIdent> serverIdent;
+  private final Provider<PublicKeyStore> storeProvider;
+  private final Provider<AccountsUpdate> accountsUpdateProvider;
+  private final ExternalIds externalIds;
+
+  @Inject
+  DeleteGpgKey(
+      @GerritPersonIdent Provider<PersonIdent> serverIdent,
+      Provider<PublicKeyStore> storeProvider,
+      @UserInitiated Provider<AccountsUpdate> accountsUpdateProvider,
+      ExternalIds externalIds) {
+    this.serverIdent = serverIdent;
+    this.storeProvider = storeProvider;
+    this.accountsUpdateProvider = accountsUpdateProvider;
+    this.externalIds = externalIds;
+  }
+
+  @Override
+  public Response<?> apply(GpgKey rsrc, Input input)
+      throws RestApiException, PGPException, OrmException, IOException, ConfigInvalidException {
+    PGPPublicKey key = rsrc.getKeyRing().getPublicKey();
+    String fingerprint = BaseEncoding.base16().encode(key.getFingerprint());
+    Optional<ExternalId> extId = externalIds.get(ExternalId.Key.create(SCHEME_GPGKEY, fingerprint));
+    if (!extId.isPresent()) {
+      throw new ResourceNotFoundException(fingerprint);
+    }
+
+    accountsUpdateProvider
+        .get()
+        .update(
+            "Delete GPG Key via API",
+            rsrc.getUser().getAccountId(),
+            u -> u.deleteExternalId(extId.get()));
+
+    try (PublicKeyStore store = storeProvider.get()) {
+      store.remove(rsrc.getKeyRing().getPublicKey().getFingerprint());
+
+      CommitBuilder cb = new CommitBuilder();
+      PersonIdent committer = serverIdent.get();
+      cb.setAuthor(rsrc.getUser().newCommitterIdent(committer.getWhen(), committer.getTimeZone()));
+      cb.setCommitter(committer);
+      cb.setMessage("Delete public key " + keyIdToString(key.getKeyID()));
+
+      RefUpdate.Result saveResult = store.save(cb);
+      switch (saveResult) {
+        case NO_CHANGE:
+        case FAST_FORWARD:
+          break;
+        case FORCED:
+        case IO_FAILURE:
+        case LOCK_FAILURE:
+        case NEW:
+        case NOT_ATTEMPTED:
+        case REJECTED:
+        case REJECTED_CURRENT_BRANCH:
+        case RENAMED:
+        case REJECTED_MISSING_OBJECT:
+        case REJECTED_OTHER_REASON:
+        default:
+          throw new ResourceConflictException("Failed to delete public key: " + saveResult);
+      }
+    }
+    return Response.none();
+  }
+}
diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/GpgKey.java b/java/com/google/gerrit/gpg/server/GpgKey.java
similarity index 100%
rename from gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/GpgKey.java
rename to java/com/google/gerrit/gpg/server/GpgKey.java
diff --git a/java/com/google/gerrit/gpg/server/GpgKeys.java b/java/com/google/gerrit/gpg/server/GpgKeys.java
new file mode 100644
index 0000000..e555f07
--- /dev/null
+++ b/java/com/google/gerrit/gpg/server/GpgKeys.java
@@ -0,0 +1,249 @@
+// Copyright (C) 2015 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.google.gerrit.gpg.server;
+
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_GPGKEY;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.base.CharMatcher;
+import com.google.common.collect.ImmutableList;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.io.BaseEncoding;
+import com.google.gerrit.extensions.common.GpgKeyInfo;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ChildCollection;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.gpg.BouncyCastleUtil;
+import com.google.gerrit.gpg.CheckResult;
+import com.google.gerrit.gpg.Fingerprint;
+import com.google.gerrit.gpg.GerritPublicKeyChecker;
+import com.google.gerrit.gpg.PublicKeyChecker;
+import com.google.gerrit.gpg.PublicKeyStore;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.account.externalids.ExternalIds;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import org.bouncycastle.bcpg.ArmoredOutputStream;
+import org.bouncycastle.openpgp.PGPException;
+import org.bouncycastle.openpgp.PGPPublicKey;
+import org.bouncycastle.openpgp.PGPPublicKeyRing;
+import org.eclipse.jgit.util.NB;
+
+@Singleton
+public class GpgKeys implements ChildCollection<AccountResource, GpgKey> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final DynamicMap<RestView<GpgKey>> views;
+  private final Provider<CurrentUser> self;
+  private final Provider<PublicKeyStore> storeProvider;
+  private final GerritPublicKeyChecker.Factory checkerFactory;
+  private final ExternalIds externalIds;
+
+  @Inject
+  GpgKeys(
+      DynamicMap<RestView<GpgKey>> views,
+      Provider<CurrentUser> self,
+      Provider<PublicKeyStore> storeProvider,
+      GerritPublicKeyChecker.Factory checkerFactory,
+      ExternalIds externalIds) {
+    this.views = views;
+    this.self = self;
+    this.storeProvider = storeProvider;
+    this.checkerFactory = checkerFactory;
+    this.externalIds = externalIds;
+  }
+
+  @Override
+  public ListGpgKeys list() throws ResourceNotFoundException, AuthException {
+    return new ListGpgKeys();
+  }
+
+  @Override
+  public GpgKey parse(AccountResource parent, IdString id)
+      throws ResourceNotFoundException, PGPException, OrmException, IOException {
+    checkVisible(self, parent);
+
+    ExternalId gpgKeyExtId = findGpgKey(id.get(), getGpgExtIds(parent));
+    byte[] fp = parseFingerprint(gpgKeyExtId);
+    try (PublicKeyStore store = storeProvider.get()) {
+      long keyId = keyId(fp);
+      for (PGPPublicKeyRing keyRing : store.get(keyId)) {
+        PGPPublicKey key = keyRing.getPublicKey();
+        if (Arrays.equals(key.getFingerprint(), fp)) {
+          return new GpgKey(parent.getUser(), keyRing);
+        }
+      }
+    }
+
+    throw new ResourceNotFoundException(id);
+  }
+
+  static ExternalId findGpgKey(String str, Iterable<ExternalId> existingExtIds)
+      throws ResourceNotFoundException {
+    str = CharMatcher.whitespace().removeFrom(str).toUpperCase();
+    if ((str.length() != 8 && str.length() != 40)
+        || !CharMatcher.anyOf("0123456789ABCDEF").matchesAllOf(str)) {
+      throw new ResourceNotFoundException(str);
+    }
+    ExternalId gpgKeyExtId = null;
+    for (ExternalId extId : existingExtIds) {
+      String fpStr = extId.key().id();
+      if (!fpStr.endsWith(str)) {
+        continue;
+      } else if (gpgKeyExtId != null) {
+        throw new ResourceNotFoundException("Multiple keys found for " + str);
+      }
+      gpgKeyExtId = extId;
+      if (str.length() == 40) {
+        break;
+      }
+    }
+    if (gpgKeyExtId == null) {
+      throw new ResourceNotFoundException(str);
+    }
+    return gpgKeyExtId;
+  }
+
+  static byte[] parseFingerprint(ExternalId gpgKeyExtId) {
+    return BaseEncoding.base16().decode(gpgKeyExtId.key().id());
+  }
+
+  @Override
+  public DynamicMap<RestView<GpgKey>> views() {
+    return views;
+  }
+
+  public class ListGpgKeys implements RestReadView<AccountResource> {
+    @Override
+    public Map<String, GpgKeyInfo> apply(AccountResource rsrc)
+        throws OrmException, PGPException, IOException, ResourceNotFoundException {
+      checkVisible(self, rsrc);
+      Map<String, GpgKeyInfo> keys = new HashMap<>();
+      try (PublicKeyStore store = storeProvider.get()) {
+        for (ExternalId extId : getGpgExtIds(rsrc)) {
+          byte[] fp = parseFingerprint(extId);
+          boolean found = false;
+          for (PGPPublicKeyRing keyRing : store.get(keyId(fp))) {
+            if (Arrays.equals(keyRing.getPublicKey().getFingerprint(), fp)) {
+              found = true;
+              GpgKeyInfo info =
+                  toJson(
+                      keyRing.getPublicKey(), checkerFactory.create(rsrc.getUser(), store), store);
+              keys.put(info.id, info);
+              info.id = null;
+              break;
+            }
+          }
+          if (!found) {
+            logger.atWarning().log(
+                "No public key stored for fingerprint %s", Fingerprint.toString(fp));
+          }
+        }
+      }
+      return keys;
+    }
+  }
+
+  @Singleton
+  public static class Get implements RestReadView<GpgKey> {
+    private final Provider<PublicKeyStore> storeProvider;
+    private final GerritPublicKeyChecker.Factory checkerFactory;
+
+    @Inject
+    Get(Provider<PublicKeyStore> storeProvider, GerritPublicKeyChecker.Factory checkerFactory) {
+      this.storeProvider = storeProvider;
+      this.checkerFactory = checkerFactory;
+    }
+
+    @Override
+    public GpgKeyInfo apply(GpgKey rsrc) throws IOException {
+      try (PublicKeyStore store = storeProvider.get()) {
+        return toJson(
+            rsrc.getKeyRing().getPublicKey(),
+            checkerFactory.create().setExpectedUser(rsrc.getUser()),
+            store);
+      }
+    }
+  }
+
+  private Iterable<ExternalId> getGpgExtIds(AccountResource rsrc) throws IOException {
+    return externalIds.byAccount(rsrc.getUser().getAccountId(), SCHEME_GPGKEY);
+  }
+
+  private static long keyId(byte[] fp) {
+    return NB.decodeInt64(fp, fp.length - 8);
+  }
+
+  static void checkVisible(Provider<CurrentUser> self, AccountResource rsrc)
+      throws ResourceNotFoundException {
+    if (!BouncyCastleUtil.havePGP()) {
+      throw new ResourceNotFoundException("GPG not enabled");
+    }
+    if (!self.get().hasSameAccountId(rsrc.getUser())) {
+      throw new ResourceNotFoundException();
+    }
+  }
+
+  public static GpgKeyInfo toJson(PGPPublicKey key, CheckResult checkResult) throws IOException {
+    GpgKeyInfo info = new GpgKeyInfo();
+
+    if (key != null) {
+      info.id = PublicKeyStore.keyIdToString(key.getKeyID());
+      info.fingerprint = Fingerprint.toString(key.getFingerprint());
+      Iterator<String> userIds = key.getUserIDs();
+      info.userIds = ImmutableList.copyOf(userIds);
+
+      try (ByteArrayOutputStream out = new ByteArrayOutputStream(4096)) {
+        try (ArmoredOutputStream aout = new ArmoredOutputStream(out)) {
+          // This is not exactly the key stored in the store, but is equivalent. In
+          // particular, it will have a Bouncy Castle version string. The armored
+          // stream reader in PublicKeyStore doesn't give us an easy way to extract
+          // the original ASCII armor.
+          key.encode(aout);
+        }
+        info.key = new String(out.toByteArray(), UTF_8);
+      }
+    }
+
+    info.status = checkResult.getStatus();
+    info.problems = checkResult.getProblems();
+
+    return info;
+  }
+
+  static GpgKeyInfo toJson(PGPPublicKey key, PublicKeyChecker checker, PublicKeyStore store)
+      throws IOException {
+    return toJson(key, checker.setStore(store).check(key));
+  }
+
+  public static void toJson(GpgKeyInfo info, CheckResult checkResult) {
+    info.status = checkResult.getStatus();
+    info.problems = checkResult.getProblems();
+  }
+}
diff --git a/java/com/google/gerrit/gpg/server/PostGpgKeys.java b/java/com/google/gerrit/gpg/server/PostGpgKeys.java
new file mode 100644
index 0000000..7d08fca
--- /dev/null
+++ b/java/com/google/gerrit/gpg/server/PostGpgKeys.java
@@ -0,0 +1,293 @@
+// Copyright (C) 2015 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.google.gerrit.gpg.server;
+
+import static com.google.gerrit.gpg.PublicKeyStore.keyIdToString;
+import static com.google.gerrit.gpg.PublicKeyStore.keyToString;
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_GPGKEY;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.base.Joiner;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.io.BaseEncoding;
+import com.google.gerrit.common.errors.EmailException;
+import com.google.gerrit.extensions.api.accounts.GpgKeysInput;
+import com.google.gerrit.extensions.common.GpgKeyInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.gpg.CheckResult;
+import com.google.gerrit.gpg.Fingerprint;
+import com.google.gerrit.gpg.GerritPublicKeyChecker;
+import com.google.gerrit.gpg.PublicKeyChecker;
+import com.google.gerrit.gpg.PublicKeyStore;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.UserInitiated;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.account.AccountsUpdate;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.account.externalids.ExternalIds;
+import com.google.gerrit.server.mail.send.AddKeySender;
+import com.google.gerrit.server.query.account.InternalAccountQuery;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import org.bouncycastle.bcpg.ArmoredInputStream;
+import org.bouncycastle.openpgp.PGPException;
+import org.bouncycastle.openpgp.PGPPublicKey;
+import org.bouncycastle.openpgp.PGPPublicKeyRing;
+import org.bouncycastle.openpgp.PGPRuntimeOperationException;
+import org.bouncycastle.openpgp.bc.BcPGPObjectFactory;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.RefUpdate;
+
+@Singleton
+public class PostGpgKeys implements RestModifyView<AccountResource, GpgKeysInput> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final Provider<PersonIdent> serverIdent;
+  private final Provider<CurrentUser> self;
+  private final Provider<PublicKeyStore> storeProvider;
+  private final GerritPublicKeyChecker.Factory checkerFactory;
+  private final AddKeySender.Factory addKeyFactory;
+  private final Provider<InternalAccountQuery> accountQueryProvider;
+  private final ExternalIds externalIds;
+  private final Provider<AccountsUpdate> accountsUpdateProvider;
+
+  @Inject
+  PostGpgKeys(
+      @GerritPersonIdent Provider<PersonIdent> serverIdent,
+      Provider<CurrentUser> self,
+      Provider<PublicKeyStore> storeProvider,
+      GerritPublicKeyChecker.Factory checkerFactory,
+      AddKeySender.Factory addKeyFactory,
+      Provider<InternalAccountQuery> accountQueryProvider,
+      ExternalIds externalIds,
+      @UserInitiated Provider<AccountsUpdate> accountsUpdateProvider) {
+    this.serverIdent = serverIdent;
+    this.self = self;
+    this.storeProvider = storeProvider;
+    this.checkerFactory = checkerFactory;
+    this.addKeyFactory = addKeyFactory;
+    this.accountQueryProvider = accountQueryProvider;
+    this.externalIds = externalIds;
+    this.accountsUpdateProvider = accountsUpdateProvider;
+  }
+
+  @Override
+  public Map<String, GpgKeyInfo> apply(AccountResource rsrc, GpgKeysInput input)
+      throws ResourceNotFoundException, BadRequestException, ResourceConflictException,
+          PGPException, OrmException, IOException, ConfigInvalidException {
+    GpgKeys.checkVisible(self, rsrc);
+
+    Collection<ExternalId> existingExtIds =
+        externalIds.byAccount(rsrc.getUser().getAccountId(), SCHEME_GPGKEY);
+    try (PublicKeyStore store = storeProvider.get()) {
+      Map<ExternalId, Fingerprint> toRemove = readKeysToRemove(input, existingExtIds);
+      Collection<Fingerprint> fingerprintsToRemove = toRemove.values();
+      List<PGPPublicKeyRing> newKeys = readKeysToAdd(input, fingerprintsToRemove);
+      List<ExternalId> newExtIds = new ArrayList<>(existingExtIds.size());
+
+      for (PGPPublicKeyRing keyRing : newKeys) {
+        PGPPublicKey key = keyRing.getPublicKey();
+        ExternalId.Key extIdKey = toExtIdKey(key.getFingerprint());
+        Account account = getAccountByExternalId(extIdKey);
+        if (account != null) {
+          if (!account.getId().equals(rsrc.getUser().getAccountId())) {
+            throw new ResourceConflictException("GPG key already associated with another account");
+          }
+        } else {
+          newExtIds.add(ExternalId.create(extIdKey, rsrc.getUser().getAccountId()));
+        }
+      }
+
+      storeKeys(rsrc, newKeys, fingerprintsToRemove);
+
+      accountsUpdateProvider
+          .get()
+          .update(
+              "Update GPG Keys via API",
+              rsrc.getUser().getAccountId(),
+              u -> u.replaceExternalIds(toRemove.keySet(), newExtIds));
+      return toJson(newKeys, fingerprintsToRemove, store, rsrc.getUser());
+    }
+  }
+
+  private Map<ExternalId, Fingerprint> readKeysToRemove(
+      GpgKeysInput input, Collection<ExternalId> existingExtIds) {
+    if (input.delete == null || input.delete.isEmpty()) {
+      return ImmutableMap.of();
+    }
+    Map<ExternalId, Fingerprint> fingerprints =
+        Maps.newHashMapWithExpectedSize(input.delete.size());
+    for (String id : input.delete) {
+      try {
+        ExternalId gpgKeyExtId = GpgKeys.findGpgKey(id, existingExtIds);
+        fingerprints.put(gpgKeyExtId, new Fingerprint(GpgKeys.parseFingerprint(gpgKeyExtId)));
+      } catch (ResourceNotFoundException e) {
+        // Skip removal.
+      }
+    }
+    return fingerprints;
+  }
+
+  private List<PGPPublicKeyRing> readKeysToAdd(GpgKeysInput input, Collection<Fingerprint> toRemove)
+      throws BadRequestException, IOException {
+    if (input.add == null || input.add.isEmpty()) {
+      return ImmutableList.of();
+    }
+    List<PGPPublicKeyRing> keyRings = new ArrayList<>(input.add.size());
+    for (String armored : input.add) {
+      try (InputStream in = new ByteArrayInputStream(armored.getBytes(UTF_8));
+          ArmoredInputStream ain = new ArmoredInputStream(in)) {
+        @SuppressWarnings("unchecked")
+        List<Object> objs = Lists.newArrayList(new BcPGPObjectFactory(ain));
+        if (objs.size() != 1 || !(objs.get(0) instanceof PGPPublicKeyRing)) {
+          throw new BadRequestException("Expected exactly one PUBLIC KEY BLOCK");
+        }
+        PGPPublicKeyRing keyRing = (PGPPublicKeyRing) objs.get(0);
+        if (toRemove.contains(new Fingerprint(keyRing.getPublicKey().getFingerprint()))) {
+          throw new BadRequestException(
+              "Cannot both add and delete key: " + keyToString(keyRing.getPublicKey()));
+        }
+        keyRings.add(keyRing);
+      } catch (PGPRuntimeOperationException e) {
+        throw new BadRequestException("Failed to parse GPG keys", e);
+      }
+    }
+    return keyRings;
+  }
+
+  private void storeKeys(
+      AccountResource rsrc, List<PGPPublicKeyRing> keyRings, Collection<Fingerprint> toRemove)
+      throws BadRequestException, ResourceConflictException, PGPException, IOException {
+    try (PublicKeyStore store = storeProvider.get()) {
+      List<String> addedKeys = new ArrayList<>();
+      for (PGPPublicKeyRing keyRing : keyRings) {
+        PGPPublicKey key = keyRing.getPublicKey();
+        // Don't check web of trust; admins can fill in certifications later.
+        CheckResult result = checkerFactory.create(rsrc.getUser(), store).disableTrust().check(key);
+        if (!result.isOk()) {
+          throw new BadRequestException(
+              String.format(
+                  "Problems with public key %s:\n%s",
+                  keyToString(key), Joiner.on('\n').join(result.getProblems())));
+        }
+        addedKeys.add(PublicKeyStore.keyToString(key));
+        store.add(keyRing);
+      }
+      for (Fingerprint fp : toRemove) {
+        store.remove(fp.get());
+      }
+      CommitBuilder cb = new CommitBuilder();
+      PersonIdent committer = serverIdent.get();
+      cb.setAuthor(rsrc.getUser().newCommitterIdent(committer.getWhen(), committer.getTimeZone()));
+      cb.setCommitter(committer);
+
+      RefUpdate.Result saveResult = store.save(cb);
+      switch (saveResult) {
+        case NEW:
+        case FAST_FORWARD:
+        case FORCED:
+          try {
+            addKeyFactory.create(rsrc.getUser(), addedKeys).send();
+          } catch (EmailException e) {
+            logger.atSevere().withCause(e).log(
+                "Cannot send GPG key added message to %s",
+                rsrc.getUser().getAccount().getPreferredEmail());
+          }
+          break;
+        case NO_CHANGE:
+          break;
+        case IO_FAILURE:
+        case LOCK_FAILURE:
+        case NOT_ATTEMPTED:
+        case REJECTED:
+        case REJECTED_CURRENT_BRANCH:
+        case RENAMED:
+        case REJECTED_MISSING_OBJECT:
+        case REJECTED_OTHER_REASON:
+        default:
+          // TODO(dborowitz): Backoff and retry on LOCK_FAILURE.
+          throw new ResourceConflictException("Failed to save public keys: " + saveResult);
+      }
+    }
+  }
+
+  private ExternalId.Key toExtIdKey(byte[] fp) {
+    return ExternalId.Key.create(SCHEME_GPGKEY, BaseEncoding.base16().encode(fp));
+  }
+
+  private Account getAccountByExternalId(ExternalId.Key extIdKey) throws OrmException {
+    List<AccountState> accountStates = accountQueryProvider.get().byExternalId(extIdKey);
+
+    if (accountStates.isEmpty()) {
+      return null;
+    }
+
+    if (accountStates.size() > 1) {
+      StringBuilder msg = new StringBuilder();
+      msg.append("GPG key ")
+          .append(extIdKey.get())
+          .append(" associated with multiple accounts: ")
+          .append(Lists.transform(accountStates, AccountState.ACCOUNT_ID_FUNCTION));
+      throw new IllegalStateException(msg.toString());
+    }
+
+    return accountStates.get(0).getAccount();
+  }
+
+  private Map<String, GpgKeyInfo> toJson(
+      Collection<PGPPublicKeyRing> keys,
+      Collection<Fingerprint> deleted,
+      PublicKeyStore store,
+      IdentifiedUser user)
+      throws IOException {
+    // Unlike when storing keys, include web-of-trust checks when producing
+    // result JSON, so the user at least knows of any issues.
+    PublicKeyChecker checker = checkerFactory.create(user, store);
+    Map<String, GpgKeyInfo> infos = Maps.newHashMapWithExpectedSize(keys.size() + deleted.size());
+    for (PGPPublicKeyRing keyRing : keys) {
+      PGPPublicKey key = keyRing.getPublicKey();
+      CheckResult result = checker.check(key);
+      GpgKeyInfo info = GpgKeys.toJson(key, result);
+      infos.put(info.id, info);
+      info.id = null;
+    }
+    for (Fingerprint fp : deleted) {
+      infos.put(keyIdToString(fp.getId()), new GpgKeyInfo());
+    }
+    return infos;
+  }
+}
diff --git a/java/com/google/gerrit/gpg/testing/BUILD b/java/com/google/gerrit/gpg/testing/BUILD
new file mode 100644
index 0000000..0282d3a
--- /dev/null
+++ b/java/com/google/gerrit/gpg/testing/BUILD
@@ -0,0 +1,12 @@
+java_library(
+    name = "gpg-test-util",
+    testonly = True,
+    srcs = glob(["**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/gpg",
+        "//lib:guava",
+        "//lib/bouncycastle:bcpg-neverlink",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+    ],
+)
diff --git a/java/com/google/gerrit/gpg/testing/TestKey.java b/java/com/google/gerrit/gpg/testing/TestKey.java
new file mode 100644
index 0000000..f7405f7
--- /dev/null
+++ b/java/com/google/gerrit/gpg/testing/TestKey.java
@@ -0,0 +1,94 @@
+// Copyright (C) 2015 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.google.gerrit.gpg.testing;
+
+import static com.google.gerrit.gpg.PublicKeyStore.keyIdToString;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import org.bouncycastle.bcpg.ArmoredInputStream;
+import org.bouncycastle.openpgp.PGPException;
+import org.bouncycastle.openpgp.PGPPrivateKey;
+import org.bouncycastle.openpgp.PGPPublicKey;
+import org.bouncycastle.openpgp.PGPPublicKeyRing;
+import org.bouncycastle.openpgp.PGPSecretKey;
+import org.bouncycastle.openpgp.PGPSecretKeyRing;
+import org.bouncycastle.openpgp.operator.bc.BcKeyFingerprintCalculator;
+import org.bouncycastle.openpgp.operator.bc.BcPBESecretKeyDecryptorBuilder;
+import org.bouncycastle.openpgp.operator.bc.BcPGPDigestCalculatorProvider;
+import org.eclipse.jgit.lib.Constants;
+
+public class TestKey {
+  private final String pubArmored;
+  private final String secArmored;
+  private final PGPPublicKeyRing pubRing;
+  private final PGPSecretKeyRing secRing;
+
+  public TestKey(String pubArmored, String secArmored) {
+    this.pubArmored = pubArmored;
+    this.secArmored = secArmored;
+    BcKeyFingerprintCalculator fc = new BcKeyFingerprintCalculator();
+    try {
+      this.pubRing = new PGPPublicKeyRing(newStream(pubArmored), fc);
+      this.secRing = new PGPSecretKeyRing(newStream(secArmored), fc);
+    } catch (PGPException | IOException e) {
+      throw new AssertionError(e);
+    }
+  }
+
+  public String getPublicKeyArmored() {
+    return pubArmored;
+  }
+
+  public String getSecretKeyArmored() {
+    return secArmored;
+  }
+
+  public PGPPublicKeyRing getPublicKeyRing() {
+    return pubRing;
+  }
+
+  public PGPPublicKey getPublicKey() {
+    return pubRing.getPublicKey();
+  }
+
+  public PGPSecretKey getSecretKey() {
+    return secRing.getSecretKey();
+  }
+
+  public long getKeyId() {
+    return getPublicKey().getKeyID();
+  }
+
+  public String getKeyIdString() {
+    return keyIdToString(getPublicKey().getKeyID());
+  }
+
+  public String getFirstUserId() {
+    return getPublicKey().getUserIDs().next();
+  }
+
+  public PGPPrivateKey getPrivateKey() throws PGPException {
+    return getSecretKey()
+        .extractPrivateKey(
+            new BcPBESecretKeyDecryptorBuilder(new BcPGPDigestCalculatorProvider())
+                // All test keys have no passphrase.
+                .build(new char[0]));
+  }
+
+  private static ArmoredInputStream newStream(String armored) throws IOException {
+    return new ArmoredInputStream(new ByteArrayInputStream(Constants.encode(armored)));
+  }
+}
diff --git a/java/com/google/gerrit/gpg/testing/TestKeys.java b/java/com/google/gerrit/gpg/testing/TestKeys.java
new file mode 100644
index 0000000..00acedb
--- /dev/null
+++ b/java/com/google/gerrit/gpg/testing/TestKeys.java
@@ -0,0 +1,1032 @@
+// Copyright (C) 2015 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.google.gerrit.gpg.testing;
+
+import com.google.common.collect.ImmutableList;
+
+/** Common test keys used by a variety of tests. */
+public class TestKeys {
+  public static ImmutableList<TestKey> allValidKeys() {
+    return ImmutableList.of(
+        validKeyWithoutExpiration(), validKeyWithExpiration(), validKeyWithSecondUserId());
+  }
+
+  /**
+   * A valid key with no expiration.
+   *
+   * <pre>
+   * pub   2048R/46328A8C 2015-07-08
+   *       Key fingerprint = 04AE A7ED 2F82 1133 E5B1  28D1 ED06 25DC 4632 8A8C
+   * uid                  Testuser One &lt;test1@example.com&gt;
+   * sub   2048R/F0AF69C0 2015-07-08
+   * </pre>
+   */
+  public static TestKey validKeyWithoutExpiration() {
+    return new TestKey(
+        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "mQENBFWdTIkBCADOaygDKjLuRX6LXAvBAYB91cmTf1MSlmEy+qsG3c9ijjQixPkr\n"
+            + "atdYkocrrT2S0R9UGjksTOI2WN5S0lQfLA1RSk63KURQE+OF+IfNqdD6nQdLBs1w\n"
+            + "va+GDj/uvuI05I0oXf/M7POdFphutrS4EUDBnFPj6ns/0C2sTRTxliD+Y9Y9a84V\n"
+            + "DfVVUbJB6wc3LP3L6ImT+cSM7dLq3hZHya+9FNeYPmPYnBrkJyqf2NDd38Sddsro\n"
+            + "7smw/GgCZHnnuVNS4C7NsHr6900VKC+JDtdx+fqptixcAEJWiGoQfWqU+hYmia3p\n"
+            + "9+Xw02+3FcjOT6ONUCmHX+xlz0pXW4iIYlPpABEBAAG0IFRlc3R1c2VyIE9uZSA8\n"
+            + "dGVzdDFAZXhhbXBsZS5jb20+iQE4BBMBAgAiBQJVnUyJAhsDBgsJCAcDAgYVCAIJ\n"
+            + "CgsEFgIDAQIeAQIXgAAKCRDtBiXcRjKKjHblB/9RaFO5+GTDIphAL/aVj2u+d8Lq\n"
+            + "yUpBrDp3P06QDGpKGFMAovBuh+NLH76VKNIzQLQC8rdTj651fLcLMuJ1enQ3Rblg\n"
+            + "RKr1oc+wqqtFHr4QyOQjE/N3C9GQjEzfqn4qnp5KtZxYFnlvU5NGehid7M1HTZMx\n"
+            + "jRcHbM9KQnsE5Z4fh4wmN5ynG+5nbaF4O9otPOpFzYRvIhxFmHscWyOgRaMZiYEX\n"
+            + "7Qkzze+scAlc9E/EWRJQIFcxnxV/SYIT4qCTT1g2aKA8OCBO/ZTOleH8SzvTODjy\n"
+            + "W0lGHnh/ZqH6XGVcGUaJZZ2uHTck1+czuVVShNcXPW1W20T6E9UqzHbJHN0guQEN\n"
+            + "BFWdTIkBCACoLVdPr3gpQwzI+2NGXjdtoyqYoPlgfeyI2M1XQD/7+rLZTbi14ZjN\n"
+            + "vYkS/+/oGtVEmiYOiAVTwmkjCYkKGDgNcCiJVekiPAN6JryVv488wRc999b5LpFE\n"
+            + "fhLGwI0YxjcS4KFFnpMC3wSb6tJUnHRLVoE5d8icdiaOpgYdp7uqWkSx2oxqHgIb\n"
+            + "nuyrk3ydEcS4ZeGD+w+taIxMc9F1DS9kiXALD7xWgUkmqZLEQoNgF6KlwCHXRd3m\n"
+            + "rBCo97sE95yKcq98ZMIWuQtTcEccZsN/6jlsei+9RI0tqs+FbZnIFm/go9zk11Vl\n"
+            + "IQ9QFSj6ruqoKrYvNZuDDLD1lHvZPD4/ABEBAAGJAR8EGAECAAkFAlWdTIkCGwwA\n"
+            + "CgkQ7QYl3EYyiox+HAf/Z/OCQO3jxALAcn3oUb1g/IlHm6qZv7RJOFUsj/16fGiF\n"
+            + "rRTP15zMXzyqV+L/LGV/owvOsdD/o7boZz4C/U98COx0Nl1jOrmPATOl+xqsgpEj\n"
+            + "Fhk+eAR7exO2XxW+u2g4cYoSMosIOX5w1GrdsxQeaZDwiSJMEOR2cVLs3YI19Ci/\n"
+            + "FuzActZ0wJNk0nlNF6l8CAbzwN6pM9OIc/iBIwDjz92KUco0NF8XKZnxqhH4wfHB\n"
+            + "PGkTx8RwOvELUTDMtvYnG5R0QtND0RbOnmp4ZVZmeOjKSLo1mZliUZB1H2PPSxrA\n"
+            + "0oLr8+wLntz1SU7uS4ddvhSQW+j2M/0pa352KUwmrw==\n"
+            + "=o/aU\n"
+            + "-----END PGP PUBLIC KEY BLOCK-----\n",
+        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "lQOYBFWdTIkBCADOaygDKjLuRX6LXAvBAYB91cmTf1MSlmEy+qsG3c9ijjQixPkr\n"
+            + "atdYkocrrT2S0R9UGjksTOI2WN5S0lQfLA1RSk63KURQE+OF+IfNqdD6nQdLBs1w\n"
+            + "va+GDj/uvuI05I0oXf/M7POdFphutrS4EUDBnFPj6ns/0C2sTRTxliD+Y9Y9a84V\n"
+            + "DfVVUbJB6wc3LP3L6ImT+cSM7dLq3hZHya+9FNeYPmPYnBrkJyqf2NDd38Sddsro\n"
+            + "7smw/GgCZHnnuVNS4C7NsHr6900VKC+JDtdx+fqptixcAEJWiGoQfWqU+hYmia3p\n"
+            + "9+Xw02+3FcjOT6ONUCmHX+xlz0pXW4iIYlPpABEBAAEAB/wLoOXEJ+Buo+OZHjpb\n"
+            + "SSZf8GdGs+mOJoKbSJvR6zT/rFsrikUvOPmgt8B9qWjKmJVXO5L09+/Wd/MuX0L1\n"
+            + "7plhdvowP1bl2/j5VyLvZx2qwKXkiCGStFzrBGp9nKtJp4Z8O69pb//ZXaiAtDJC\n"
+            + "HFa1kYT4VgFTevrXtg/z/C0np4Yjx0mZpw4nfISEeHCiYCyRa/B8R1+Pc4uIcoSo\n"
+            + "G3aq6Ow9m/LGvw0MRO5qHvqoF41TLPQpGKjKEsCBKHF1qh0tOOUHnLGrvbmdFnGr\n"
+            + "UXJpRkLdRTnj8ufvA4XVZhImzL+lD+ALtjlV14xh8nsNKYL42880GFl5Cl0OtBcE\n"
+            + "lgQBBADPJ6kHdvUYOe0zugRdukBSYLkZcYwRiphom7dZuavYICIu6B14ljEONzVD\n"
+            + "mPhi2lDOawZOURKwYd9S4K11XWLsTYe7XEwkc+1Fpvu4L/JqnJTTnnvbx05ZsqD5\n"
+            + "j9tybPlrTuLrf2ctfcC03Z55wfo6azsbf89yrr6QX0+l9dlkYQQA/xcMdQJ0Z5vm\n"
+            + "kvyaCPsQzJc/8noVO9PMv7xJm14gJWK7Px3y2eBidzpCbVVFnGWW6CPb3qKerB5U\n"
+            + "pwcF4gCFWyP9C2YtnB0hgqixIPfR+UO8gpqdY6MP8NPspoXouffRn+Zic/P6Cxje\n"
+            + "/MGxNQBeRtqb2IGh1xZ8v/8tmmmxHIkEAP74HkGETcXmlj3/6RlwTBUAovPARSn7\n"
+            + "LDtOCPezg6mQmble1BvnTnAwOHKJVqjx+3qsGqMe8OGGXAxZPSU1xSmOShBFrpDp\n"
+            + "xArE67arE17pT1lyD/gmHRuqnNMvgRrwz1mDm3G2ohWkCVixEiB+8vPQfbZrJBgQ\n"
+            + "WxOF4RCo2WWyRKa0IFRlc3R1c2VyIE9uZSA8dGVzdDFAZXhhbXBsZS5jb20+iQE4\n"
+            + "BBMBAgAiBQJVnUyJAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRDtBiXc\n"
+            + "RjKKjHblB/9RaFO5+GTDIphAL/aVj2u+d8LqyUpBrDp3P06QDGpKGFMAovBuh+NL\n"
+            + "H76VKNIzQLQC8rdTj651fLcLMuJ1enQ3RblgRKr1oc+wqqtFHr4QyOQjE/N3C9GQ\n"
+            + "jEzfqn4qnp5KtZxYFnlvU5NGehid7M1HTZMxjRcHbM9KQnsE5Z4fh4wmN5ynG+5n\n"
+            + "baF4O9otPOpFzYRvIhxFmHscWyOgRaMZiYEX7Qkzze+scAlc9E/EWRJQIFcxnxV/\n"
+            + "SYIT4qCTT1g2aKA8OCBO/ZTOleH8SzvTODjyW0lGHnh/ZqH6XGVcGUaJZZ2uHTck\n"
+            + "1+czuVVShNcXPW1W20T6E9UqzHbJHN0gnQOYBFWdTIkBCACoLVdPr3gpQwzI+2NG\n"
+            + "XjdtoyqYoPlgfeyI2M1XQD/7+rLZTbi14ZjNvYkS/+/oGtVEmiYOiAVTwmkjCYkK\n"
+            + "GDgNcCiJVekiPAN6JryVv488wRc999b5LpFEfhLGwI0YxjcS4KFFnpMC3wSb6tJU\n"
+            + "nHRLVoE5d8icdiaOpgYdp7uqWkSx2oxqHgIbnuyrk3ydEcS4ZeGD+w+taIxMc9F1\n"
+            + "DS9kiXALD7xWgUkmqZLEQoNgF6KlwCHXRd3mrBCo97sE95yKcq98ZMIWuQtTcEcc\n"
+            + "ZsN/6jlsei+9RI0tqs+FbZnIFm/go9zk11VlIQ9QFSj6ruqoKrYvNZuDDLD1lHvZ\n"
+            + "PD4/ABEBAAEAB/4kQnJauehcbRpqktjaqSGmP9HFSp+50CyZbLUJJM8m0uyQsZMr\n"
+            + "k9JQOZc+Q3RERNTKj7m41Fbhsj7c0Qd856/eJdp3kdBME0hko8lxN/X4EWGjeLYe\n"
+            + "z41+iPgfZhCF0Oa66TecPQ5RRihGPaDPoVPpkmMWMt9L7KVviBg1eJ6bobVIY5hu\n"
+            + "a7KFJHZQcCI1OvdJ0cx89KDSbnH8iMM6Kmw1bE3D2FEaWctuKLBo5PNRgyTJvdBd\n"
+            + "PSf56/Rc6csPqmOntQi2Yn8n47eCOTclHNuygSTJeHPpymVuWbhMq6fhJat/xA+V\n"
+            + "kyT8I2c45RQb0dKId+wEytjbKw8AI6Q3GXqhBADOhsr9M+JWc4MpD43mCDZACN4v\n"
+            + "RBRxSrJvO/V6HqQPmKYRmr9Gk3vxgF0zCf5zB1QeBiXpTpShxV87RIbUYReOyavp\n"
+            + "87zH6/SkRxQJiBEpQh5Fu5CoAaxGOivxbPqdWHrBY6jvqkrRoMPNiFJ6/ty5w9jx\n"
+            + "i9kGm9PelQGu2SdLNwQA0HbGo8sC8h5TSTEDCkFHRYzVYONx+32AlkCsJX9mEt0E\n"
+            + "nG8d97Ay24JsbnuXSq04FJrqzjOVyHLUffpXnAGELJZVNCIparSyqIaj43UG/oPc\n"
+            + "ICPmR7zI9G49ICUPSzI7+S2+BwjbiHRQcP0zmxbH92G4abYwKfk7dsDpGyVM+TkD\n"
+            + "/2nUiV0CRqnGipeiLWNjW/Md0ufkwqBvCWxrtxj0rQCyvBOVg3B6DocVNzgOOYa1\n"
+            + "ji3We5A9mSP40JBmMfk2veFrDdsGn4G+OpzMxKQtNfYemqjALfZ2zTdax0mXPXy6\n"
+            + "Gl0jUgSGrxGm8QnRLsrRx7G7ZKnvkcS+YsdQ8dbtzvJtQfiJAR8EGAECAAkFAlWd\n"
+            + "TIkCGwwACgkQ7QYl3EYyiox+HAf/Z/OCQO3jxALAcn3oUb1g/IlHm6qZv7RJOFUs\n"
+            + "j/16fGiFrRTP15zMXzyqV+L/LGV/owvOsdD/o7boZz4C/U98COx0Nl1jOrmPATOl\n"
+            + "+xqsgpEjFhk+eAR7exO2XxW+u2g4cYoSMosIOX5w1GrdsxQeaZDwiSJMEOR2cVLs\n"
+            + "3YI19Ci/FuzActZ0wJNk0nlNF6l8CAbzwN6pM9OIc/iBIwDjz92KUco0NF8XKZnx\n"
+            + "qhH4wfHBPGkTx8RwOvELUTDMtvYnG5R0QtND0RbOnmp4ZVZmeOjKSLo1mZliUZB1\n"
+            + "H2PPSxrA0oLr8+wLntz1SU7uS4ddvhSQW+j2M/0pa352KUwmrw==\n"
+            + "=MuAn\n"
+            + "-----END PGP PRIVATE KEY BLOCK-----\n");
+  }
+
+  /**
+   * A valid key expiring in 2065.
+   *
+   * <pre>
+   * pub   2048R/378A0AED 2015-07-08 [expires: 2065-06-25]
+   *       Key fingerprint = C378 369A CBCD 34CC 138D  90B1 4531 1A6F 378A 0AED
+   * uid                  Testuser Two &lt;test2@example.com&gt;
+   * sub   2048R/46D4F204 2015-07-08 [expires: 2065-06-25]
+   * </pre>
+   */
+  public static final TestKey validKeyWithExpiration() {
+    return new TestKey(
+        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "mQENBFWdTP8BCADRxNpasIv0jtNXTK6VYIS2VJ2Xk0ZD6gtxeoXCpjQ+TsB9fxh3\n"
+            + "vAMPt2Zu5LqoGwygKOJj1zquG8xk7GUCCHJk3+qG8xxB1xGtSz2vLyfRm7fOZmHj\n"
+            + "3W/C/25lynSPDrfvcwvwA4PN8iP5EWbWU10L6WOZGMwwwtVDUSEouSOw2LEepxLV\n"
+            + "rkKuZcyHaivheDbUlZliwe9rGXd4hh1h4qyNQWG3q+ytlL28sVkOzUh6IMBTvqhe\n"
+            + "IRsvxvaVSLV8jRVKfUTqw0g57ft4ZD2/L46yUTXzr9aUCBjTNxvWLlyboqql/D8P\n"
+            + "inp51h3cvAg7NW5RdG1GEYmylH8SygT5utPxABEBAAG0IFRlc3R1c2VyIFR3byA8\n"
+            + "dGVzdDJAZXhhbXBsZS5jb20+iQE+BBMBAgAoBQJVnUz/AhsDBQld/A8ABgsJCAcD\n"
+            + "AgYVCAIJCgsEFgIDAQIeAQIXgAAKCRBFMRpvN4oK7UZqCACWwQL/YvBK4b0m+R0d\n"
+            + "UdvAXeBx7DwOAnAodis9ZVqChb7RxcZQxF1Ti9mtCBPPQGuEs5wE2Ocrrq+L13r6\n"
+            + "bgW+1WOB1tZSDVxwL1PnZFw/SyADRIDCZrOHiAkp82UnZwWAkk39GzNJtt1wTYDZ\n"
+            + "FMTFUr2SPscXk1k7muS+ZfEFwNPD4tODo/poJKDYEJ80Z5UXXFQLDtsfdeIXMFIT\n"
+            + "449CYoq8XBMBfvyWl/LLpw0r3JI6pV/YdH3Oeuz8XkkEVzRxaxB6Zmeo5jSwjR/T\n"
+            + "8TKDGwwiuwiiT3SfkFSVdcjKulRuXSRNs1Ouf7/UC3cq4bG2WXWa85X1+HQRm7iu\n"
+            + "RHSOuQENBFWdTP8BCADhhGxAA0pX5yBHwIgM1j0gw2h5nSsopDrO6t/sbRUcNxnR\n"
+            + "tBScgKZnP0sjRTYEUIwmZuseHMBohtVCuMaDt06qyZDvDk/98j3AeE5t2dgFnOIe\n"
+            + "qCrm/6aejbFcQOpxe6U29KJRCAxuwNtB15X1VH1Kj7B0gRSTu13n/5sUsi2lunoZ\n"
+            + "oIvpIe9tZH4aXitCY2MCQH+hTyCyNBzlEa44kWz6LxUsPdo7I6rXkTr6Ot7wQh+9\n"
+            + "7HCe042GIq65h0apgujyjhJidjch5ur1mngaSNSEyvbji2MGC+cd3wAIstG5a7xP\n"
+            + "d9MncY5Q/eH+hn96694k5bckottSyGm/3f2Ihfj1ABEBAAGJASUEGAECAA8FAlWd\n"
+            + "TP8CGwwFCV38DwAACgkQRTEabzeKCu1FNwgAif4eK2v7R3QubL2S6wmb1nsgRMgV\n"
+            + "YoxGBeUk2EK6WZ5IPor93ySd0ixRVNMRmJ8BLH3EMjZQTzkDG+BH6zFyxo6lLHw9\n"
+            + "NxQjI06tqQWgyyK0mEweVwB/zqtxiB4lNUpsNbqOZWnBJ3d6o1SsnD2Q3uwvP5fb\n"
+            + "fSIgdmUk3c0VMdgA+KzWjPD/PJIPujE+ckHhjn5cbDNw35/FuyhkLJfqlOG7SPvM\n"
+            + "NmCdJ1Pcqju9t7sf6b0BGPDOCL4gpuWKK7HJz9WxngNb3FSziLbyPLk13ynADO+v\n"
+            + "EOR44LPyXE9kVxPusazsXlt9ayTOhELhwzw7sGFFu8E17Cpn7GnVj3tN9A==\n"
+            + "=1e/A\n"
+            + "-----END PGP PUBLIC KEY BLOCK-----\n",
+        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "lQOYBFWdTP8BCADRxNpasIv0jtNXTK6VYIS2VJ2Xk0ZD6gtxeoXCpjQ+TsB9fxh3\n"
+            + "vAMPt2Zu5LqoGwygKOJj1zquG8xk7GUCCHJk3+qG8xxB1xGtSz2vLyfRm7fOZmHj\n"
+            + "3W/C/25lynSPDrfvcwvwA4PN8iP5EWbWU10L6WOZGMwwwtVDUSEouSOw2LEepxLV\n"
+            + "rkKuZcyHaivheDbUlZliwe9rGXd4hh1h4qyNQWG3q+ytlL28sVkOzUh6IMBTvqhe\n"
+            + "IRsvxvaVSLV8jRVKfUTqw0g57ft4ZD2/L46yUTXzr9aUCBjTNxvWLlyboqql/D8P\n"
+            + "inp51h3cvAg7NW5RdG1GEYmylH8SygT5utPxABEBAAEAB/0WW33OVqzEBwj9b/3X\n"
+            + "i+75I/Gb+yVtDZ/km2NwSJie33PirE4mTNKitTBkt1oxmphw5Yqji4gEkI/rXcqy\n"
+            + "OcY/fCIZ+gVT+yE2MCPF7Se4Tnl7tSvPxoUn6mOQ09AygyYVjlSCY02EAL/WxwUH\n"
+            + "6OCs6VYlNiBlPg7O2vHGzlzAd1aMmlG3ytlhb0SIbilaJn/wlQ2SEGySjIAP1qRH\n"
+            + "UXsTfW7oAjdqAY1CbCWg/0FnMBF+DnChH634dbLrS2OefcB70l61trEfRcHbMNTv\n"
+            + "9nVxDDCpaIdxsOfgWpe0GMG1qddRAxBIOVjNUFOL22xEFyaXnt/uagUtKQ7yejci\n"
+            + "bgTFBADcuhsfQaBX1G095iG2qr8Rx2T5GqNf9oZA+rbweWegqIH7MUXHI1KKwwJx\n"
+            + "C+rR5AgnxTSP614XI/AWB/txdelm8z0jLobpS6B1vzM2vRQ7hpwjJ3UvUkoQ5uYL\n"
+            + "DjaBqQi0w1cPJA79H0Yujc1zgdhATymz0uDL1BC2bHLIMuhelwQA80p07G1w8HLQ\n"
+            + "bTdgNwtDBMKIw39/ZyQy8ppxmpD4J6zf25r95g3er0r+njrHsa+72LnvexbedpKA\n"
+            + "4eiDJPN+l5jJOEWfL2WtGcqJ01bdFBPcl73tuwDJJtieUlKZH0jRjykuuUX8F+tJ\n"
+            + "yrmVoIGtawoeLKq3hMMOK4xi+sh3OrcD+wXIU24eO3YfUde5bhyaQplNMU5smIU0\n"
+            + "+looOEmFsZcTONgoN+FKrnm2TY9d4FHZ+QgtnksWHmmLxQJPtp9rHJ5BgdxMBPcK\n"
+            + "3w5GXRuWlOmqmnAb6vp0Q0yzVDLKCcwba0S23m3tbjZsLDcI7MG/knsp9gtL676D\n"
+            + "AsrpeF2+Apj0OwG0IFRlc3R1c2VyIFR3byA8dGVzdDJAZXhhbXBsZS5jb20+iQE+\n"
+            + "BBMBAgAoBQJVnUz/AhsDBQld/A8ABgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK\n"
+            + "CRBFMRpvN4oK7UZqCACWwQL/YvBK4b0m+R0dUdvAXeBx7DwOAnAodis9ZVqChb7R\n"
+            + "xcZQxF1Ti9mtCBPPQGuEs5wE2Ocrrq+L13r6bgW+1WOB1tZSDVxwL1PnZFw/SyAD\n"
+            + "RIDCZrOHiAkp82UnZwWAkk39GzNJtt1wTYDZFMTFUr2SPscXk1k7muS+ZfEFwNPD\n"
+            + "4tODo/poJKDYEJ80Z5UXXFQLDtsfdeIXMFIT449CYoq8XBMBfvyWl/LLpw0r3JI6\n"
+            + "pV/YdH3Oeuz8XkkEVzRxaxB6Zmeo5jSwjR/T8TKDGwwiuwiiT3SfkFSVdcjKulRu\n"
+            + "XSRNs1Ouf7/UC3cq4bG2WXWa85X1+HQRm7iuRHSOnQOYBFWdTP8BCADhhGxAA0pX\n"
+            + "5yBHwIgM1j0gw2h5nSsopDrO6t/sbRUcNxnRtBScgKZnP0sjRTYEUIwmZuseHMBo\n"
+            + "htVCuMaDt06qyZDvDk/98j3AeE5t2dgFnOIeqCrm/6aejbFcQOpxe6U29KJRCAxu\n"
+            + "wNtB15X1VH1Kj7B0gRSTu13n/5sUsi2lunoZoIvpIe9tZH4aXitCY2MCQH+hTyCy\n"
+            + "NBzlEa44kWz6LxUsPdo7I6rXkTr6Ot7wQh+97HCe042GIq65h0apgujyjhJidjch\n"
+            + "5ur1mngaSNSEyvbji2MGC+cd3wAIstG5a7xPd9MncY5Q/eH+hn96694k5bckottS\n"
+            + "yGm/3f2Ihfj1ABEBAAEAB/wP5H+mcTTrhe+57sEHuo9bQDocG+3fMtesHlRCept6\n"
+            + "vg1VQG4Va2GOtCCs7yMz4aNGz4jxOdB7bUkZJyFiRehG0+ahWi5b9JbSegf46Nm2\n"
+            + "54vt4icH2WtaEB04JaD/91k4yrunnzwVEAVDmhhIzjf4KbEjPLeBA7rF7zb0Gexq\n"
+            + "mdxEGO/6KdeQ6KOxkpWEqIIdl/mAGsYCprHeKL/XL+KXYr92nEbUcltmt59TTnoo\n"
+            + "00BQCPuHCdpcUd5nuaxpCZLM+BEpxtj0sinz0ofuWU9RI4K00R01MKXWMucdOhTZ\n"
+            + "kUy5dMx8wA07xbjkE/nH86N76Mty133OB7G3lBBDfO4PBADulfLzbjXUnS1kTKeP\n"
+            + "j/HF1E9qafzTDS/QD55OVajDq66A6zaOazKbURHNZmIqpLO4715+iNtrZQUEP3e1\n"
+            + "mwngeizvAv9luA9kJ1YDTCfsS5H5cYzavhfwuqBu7fQBm/PQqZplQuPCxgXEIBaY\n"
+            + "M0uvR0I/FSwFrepRN2IA6dAkrwQA8fpJEg8C9OLFzDf0rxV3eWwEelemN4E50Obu\n"
+            + "nxtg9IJWZ+QIWkRVLJ8if5+p85s2ieCw8hzEF0FyNfWUnfW5eoN4/j50loR4EbZS\n"
+            + "qOpUJGwr8ezyQN8PpduDOe9OQnUYAv9FY9Rk46L4937GDF2w5gdxyNdKO8yG+Z3A\n"
+            + "6/0DLZsEAOQsRUXIl1XLjkdugfFQ8V9Fv3AYWJt+8zknwcQ+Z3uOtyY2muCi9hX2\n"
+            + "BtuPojjwmN6x8wntMaUkzYHVSdz/cdx+na7VNS2kZHfnECWZGR6IHyRTJN5612yi\n"
+            + "e4MIdTE+BgL1HPq+VIPlMBehEksC5qM0WSq8baMsacGMYeAL8ntoRuyJASUEGAEC\n"
+            + "AA8FAlWdTP8CGwwFCV38DwAACgkQRTEabzeKCu1FNwgAif4eK2v7R3QubL2S6wmb\n"
+            + "1nsgRMgVYoxGBeUk2EK6WZ5IPor93ySd0ixRVNMRmJ8BLH3EMjZQTzkDG+BH6zFy\n"
+            + "xo6lLHw9NxQjI06tqQWgyyK0mEweVwB/zqtxiB4lNUpsNbqOZWnBJ3d6o1SsnD2Q\n"
+            + "3uwvP5fbfSIgdmUk3c0VMdgA+KzWjPD/PJIPujE+ckHhjn5cbDNw35/FuyhkLJfq\n"
+            + "lOG7SPvMNmCdJ1Pcqju9t7sf6b0BGPDOCL4gpuWKK7HJz9WxngNb3FSziLbyPLk1\n"
+            + "3ynADO+vEOR44LPyXE9kVxPusazsXlt9ayTOhELhwzw7sGFFu8E17Cpn7GnVj3tN\n"
+            + "9A==\n"
+            + "=qbV3\n"
+            + "-----END PGP PRIVATE KEY BLOCK-----\n");
+  }
+
+  /**
+   * A key that expired in 2006.
+   *
+   * <pre>
+   * pub   2048R/17DE1ACD 2005-07-08 [expired: 2006-07-08]
+   *       Key fingerprint = 1D9E EB79 DD38 B049 939D  9CAF 3CEC 781B 17DE 1ACD
+   * uid                  Testuser Three &lt;test3@example.com&gt;
+   * </pre>
+   */
+  public static final TestKey expiredKey() {
+    return new TestKey(
+        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "mQENBELOp0UBCACxholOPWuKhK+TYb88nvLUSCMvTLIFEpb5u3Eavr0wiluEzq6H\n"
+            + "55nswAD3dQm8DWxA7yUlEYjPr5btpw7V9441bb1+qtgZMJ10RTdEb/WjyctdGA99\n"
+            + "uOKBEarWbt8W+w6lyJ9NXy5bS/x5EwHHfoTFp4ff6ffHI5hbx1a00K8oxmitgd0X\n"
+            + "Mx86UmauFNJYupZOZG9gEcP4RbRp7e2pm4Jy1WLEOeg9Fdgm5e5Hj2nMkCSZ9BKV\n"
+            + "cxuOllSVzM/Zp0/4+RS9R57jKo3/V74Whwh9yQNgL9UxdNk7L0eGqvaT3EjXxjOc\n"
+            + "RCeJiucGN/0W2iq+V01/QGspp4SKtAogWBozABEBAAG0IlRlc3R1c2VyIFRocmVl\n"
+            + "IDx0ZXN0M0BleGFtcGxlLmNvbT6JAT4EEwECACgFAkLOp0UCGwMFCQHhM4AGCwkI\n"
+            + "BwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEDzseBsX3hrNYg0H/2CMm5/JDQNSuRFC\n"
+            + "ECWLrcOeimuvwbmkonNzOkvKbGXl73GStISAksRWAHBQED1rEPC0NkFCDeVZO7df\n"
+            + "SYLlsqKwV6uSh05Ra0F5XeniC12YpAyzoQyCGRS2wLaS822j0zUPXA8XLaO2blCu\n"
+            + "R+8sNu/oecMRcFK4S9NaApi3vdqBNhLiN1/Lpqn1LfB8uIO+eaUf4PmCWbaPgzSk\n"
+            + "qcPfKZmocNXdgLV5Q80n3hc2y2nrl+vDW2M+eVZuDHAok2BOD9uGKFfLAbaXLbX5\n"
+            + "btBW2L0UHtoEyiqkRfD6lX2laSLQmA6+eup7e4GS+s0vXBuVh8XEYddV6Yjt8H7/\n"
+            + "2thO41K5AQ0EQs6nRQEIAM/833UHK1DuFlOm7/n18dRMvs7BkXvg+hPquKWMG3be\n"
+            + "eE4sh1NG5DbRCdo6iacZLarWr3FDz7J9+wswRhtHCh3pGHEuaJk52vRjQxlkNh5F\n"
+            + "p5u2R4WF546bWqX45xPdLfHVTPyWB9q7aVxE+6Q+MHa6lMoyTVnTVCOy3nshiihw\n"
+            + "dxLsxaga+QmaL0bAR+dRcO6ucj7TDQXz1AJAVp26c0LXV9iErhFuuybUZKT0a9Aj\n"
+            + "FoumMZ6l+k30sSdjSjpBMsNvPos0dTPPRXUMu77o5sj+pHa4o8WctgB3o7BHQELp\n"
+            + "KgujZ2sKC9Nm395u6Q4cqUWihzb/Y7rIRuNHJarI7vUAEQEAAYkBJQQYAQIADwUC\n"
+            + "Qs6nRQIbDAUJAeEzgAAKCRA87HgbF94azRiBB/4vAyOOjUjK3lDWjHGs7mvEWJI/\n"
+            + "1MeLlGPswCSInJBa+HMiMI4tzq+hu5ejGThojNbmnL96GdzfDkMlP4Feyxb2rjtb\n"
+            + "NrD/R5tlXHmjX/QLzep4LCeMziP80fu8qUeiOej/Ecdny0w365PlMdt10RaYR8VE\n"
+            + "ZX/DAie6JfElnfQcG5q8TIOH3i71qxV+kIoPqKWfQ0MXrNEJ3BYFfDGdUt8U1Kq9\n"
+            + "OuIHVRgGS7mMSyjgNqqp7MBeMY+PFFZaZel5yoYVjb9d3L8XvVv2eoa/jPj5FUEU\n"
+            + "kE9uxNmwaD1PiV8DvBTYI+eQL4qzfu+3NTG2SfgQYtj5oiGHw8aL3U6QHDJb\n"
+            + "=d/Xp\n"
+            + "-----END PGP PUBLIC KEY BLOCK-----\n",
+        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "lQOYBELOp0UBCACxholOPWuKhK+TYb88nvLUSCMvTLIFEpb5u3Eavr0wiluEzq6H\n"
+            + "55nswAD3dQm8DWxA7yUlEYjPr5btpw7V9441bb1+qtgZMJ10RTdEb/WjyctdGA99\n"
+            + "uOKBEarWbt8W+w6lyJ9NXy5bS/x5EwHHfoTFp4ff6ffHI5hbx1a00K8oxmitgd0X\n"
+            + "Mx86UmauFNJYupZOZG9gEcP4RbRp7e2pm4Jy1WLEOeg9Fdgm5e5Hj2nMkCSZ9BKV\n"
+            + "cxuOllSVzM/Zp0/4+RS9R57jKo3/V74Whwh9yQNgL9UxdNk7L0eGqvaT3EjXxjOc\n"
+            + "RCeJiucGN/0W2iq+V01/QGspp4SKtAogWBozABEBAAEAB/4hGI3ckkLMTjRVa7G1\n"
+            + "YYSv4sr8dHXz0CVpZXKOo+Stef3Z4pZTK/BcXOdROvaXooD+EheAs6Yn4fpnT+/K\n"
+            + "IB7ZAx6C0OL8vz17gbPuBFltMZ/COUwaCi/gFCUfWQgqRp/SdHaOfCIuTxpAkDSS\n"
+            + "tpmWJ8eDDSFudMpgweb+SrF9DkCwp+FgUbzDRzO1aqzuu8PGihCHQt/pkhNHQ63/\n"
+            + "srDDqk6lIxxZHhv9+ucr3plDuijkvAa5/QDudQlucKDLtTPSD40UcqYnpg/V/RJU\n"
+            + "eBK0ZXmCIHpG9beHW/xdlwrK3eY4Z2sVDMm9TeeHmRYOCr5wQCyeLpMdAt0Ijk6a\n"
+            + "nINhBADI2lRodgnLvUKbOvVocz8WQjG1IXlL8iXSNuuHONijPXZiWh7XdkNxr9fm\n"
+            + "jRqzvZzYsWGT6MnirX2eXaEWJsWJHxTxJuiuOk0V/iGnV/d+jFduoKXNmB5k/ZB3\n"
+            + "6zySi7+STKNyIvnMATVsRoI/cNUwfmx53m6trFg581CnSiA82QQA4kSPw9OXmTKj\n"
+            + "ctlHrWsapWu+66pDVZw62lW6lvrd7t+m8liNb6VJuTnwIKVXJOQtUo1+GSMs0+YK\n"
+            + "wnd9FGq4jT8l0qBO4K/8B1HxppLC2S0ntC+CusxWMUDbdC2xg+G2W3oLwq3iamgz\n"
+            + "LvPTy1Pzs9PqDd6FXIdzieFy6J8W1+sEAKS3vjh7Z/PIVULZhdaohAd5Igd67S/Z\n"
+            + "BMWYNbBuJTnnb7DiOllLZSd2lR7IAKPKsUd6UY8uskOxI81hI116zNx17mIGFIIq\n"
+            + "DdDgRbvzMNEgNlOxg/BD01kXOS4fhnT2F6ca3VGTgUtOdcdF3M9MtePWQLBzEDPz\n"
+            + "8nx3O20HDupuQmG0IlRlc3R1c2VyIFRocmVlIDx0ZXN0M0BleGFtcGxlLmNvbT6J\n"
+            + "AT4EEwECACgFAkLOp0UCGwMFCQHhM4AGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheA\n"
+            + "AAoJEDzseBsX3hrNYg0H/2CMm5/JDQNSuRFCECWLrcOeimuvwbmkonNzOkvKbGXl\n"
+            + "73GStISAksRWAHBQED1rEPC0NkFCDeVZO7dfSYLlsqKwV6uSh05Ra0F5XeniC12Y\n"
+            + "pAyzoQyCGRS2wLaS822j0zUPXA8XLaO2blCuR+8sNu/oecMRcFK4S9NaApi3vdqB\n"
+            + "NhLiN1/Lpqn1LfB8uIO+eaUf4PmCWbaPgzSkqcPfKZmocNXdgLV5Q80n3hc2y2nr\n"
+            + "l+vDW2M+eVZuDHAok2BOD9uGKFfLAbaXLbX5btBW2L0UHtoEyiqkRfD6lX2laSLQ\n"
+            + "mA6+eup7e4GS+s0vXBuVh8XEYddV6Yjt8H7/2thO41KdA5gEQs6nRQEIAM/833UH\n"
+            + "K1DuFlOm7/n18dRMvs7BkXvg+hPquKWMG3beeE4sh1NG5DbRCdo6iacZLarWr3FD\n"
+            + "z7J9+wswRhtHCh3pGHEuaJk52vRjQxlkNh5Fp5u2R4WF546bWqX45xPdLfHVTPyW\n"
+            + "B9q7aVxE+6Q+MHa6lMoyTVnTVCOy3nshiihwdxLsxaga+QmaL0bAR+dRcO6ucj7T\n"
+            + "DQXz1AJAVp26c0LXV9iErhFuuybUZKT0a9AjFoumMZ6l+k30sSdjSjpBMsNvPos0\n"
+            + "dTPPRXUMu77o5sj+pHa4o8WctgB3o7BHQELpKgujZ2sKC9Nm395u6Q4cqUWihzb/\n"
+            + "Y7rIRuNHJarI7vUAEQEAAQAH+gNBKDf7FDzwdM37Sz8Ej7OsPcIbekzPcOpV3mzM\n"
+            + "u/NIuOY0QSvW7KRE8hwFlXjVZocJU/Z4Qqw+12pN55LusiRUrOq8eKuJIbl4QikI\n"
+            + "Dea8XUqM+CKJPV3YZXs6YVdIuzrRBSLgsB/Glff5JlzkEjsRYVmmnto8edETL/MK\n"
+            + "S9ClJqQiFKE4b01+Eh9oB/DfxzsiEf/a+rdRnWRh/jtpEwgeXcfmjhf+0zrzChu2\n"
+            + "ylQQ5QOuwQNKJP6DvRu/W5pOaKH9tPDR31SccDJDdnDUzBD7oSsXl06DcfMNEa8q\n"
+            + "PaNHLDDRNnqTEhwYSJ4r2emDFMxg7Kky+aatUNjAYk9vkgMEANnvumgr6/KCLWKc\n"
+            + "D3fZE09N7BveGBBDQBYNGPFtx60WbKrSY3e2RSfgWbyEXkzwm1VlB2869T1we0rL\n"
+            + "z6eV/TK5rrJQxJFHZ/anMxbQY0sCiOgqi6PKT03RTpA2N803hTym+oypy+5T6BFM\n"
+            + "rtjXvwIZN/BgAE2JjA70crTAd1mvBAD0UFNAU9oE7K7sgDbni4EhxmDyaviBHfxV\n"
+            + "PJP1ICUXAcEzAsz2T/L5TqZUD+LfYIkbf8wk2/mPZFfrCrQgCrzWn7KV1SHXkhf4\n"
+            + "4Sg6Y6p0g0Jl3mWRPiQ6ALlOVQIkp5V8z4b0hTF2c4oct1Pzaeq+ZkahyvrhW06P\n"
+            + "iaucRZb+mwP/aVTpkd4n/FyKCcbf9/KniYJ+Ou1OunsBQr/jzN+r0PKCb8l/ksig\n"
+            + "i/M0NGetemq9CxYsJDAyJs1aO4SWgx5LbfcMmyXDuJ3sL0ztFLOES31Mih3ZJebg\n"
+            + "xPpj2bB/67i2zeYRcjxQ116y23gOa2TWM8EE4TW7F/mQjw4fIPJ93ClBMIkBJQQY\n"
+            + "AQIADwUCQs6nRQIbDAUJAeEzgAAKCRA87HgbF94azRiBB/4vAyOOjUjK3lDWjHGs\n"
+            + "7mvEWJI/1MeLlGPswCSInJBa+HMiMI4tzq+hu5ejGThojNbmnL96GdzfDkMlP4Fe\n"
+            + "yxb2rjtbNrD/R5tlXHmjX/QLzep4LCeMziP80fu8qUeiOej/Ecdny0w365PlMdt1\n"
+            + "0RaYR8VEZX/DAie6JfElnfQcG5q8TIOH3i71qxV+kIoPqKWfQ0MXrNEJ3BYFfDGd\n"
+            + "Ut8U1Kq9OuIHVRgGS7mMSyjgNqqp7MBeMY+PFFZaZel5yoYVjb9d3L8XvVv2eoa/\n"
+            + "jPj5FUEUkE9uxNmwaD1PiV8DvBTYI+eQL4qzfu+3NTG2SfgQYtj5oiGHw8aL3U6Q\n"
+            + "HDJb\n"
+            + "=RrXv\n"
+            + "-----END PGP PRIVATE KEY BLOCK-----\n");
+  }
+
+  /**
+   * A self-revoked key with no expiration.
+   *
+   * <pre>
+   * pub   2048R/7CA87821 2015-07-08 [revoked: 2015-07-08]
+   *       Key fingerprint = E328 CAB1 1F7E B1BC 1451  ABA5 0855 2A17 7CA8 7821
+   * uid                  Testuser Four &lt;test4@example.com&gt;
+   * </pre>
+   */
+  public static final TestKey selfRevokedKey() {
+    return new TestKey(
+        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "mQENBFWdTZwBCAC1jukp5mlitfq2sAmdtx1s1VbWh+buDbBY2kWcxbbssczozFUP\n"
+            + "Ii67wPwjRbn3GM5+jY3GMsqKIrdyDlxeTxGWoU/qa2YkCQzgFGD/XJBqkVpP6osm\n"
+            + "qFYSP0xST1iBkatkMHq5KMjrX2q2bGVLlchLF9eHrWSefMcfff1Vs/Y8F2RCo38y\n"
+            + "gH88mbcvgyC+zq6Q2T3h5RiLK2IaZDNsn3uUoIMYHxI6oYtXXMSXRJlLJvamXVrB\n"
+            + "7QAq8L8cNikJjZMz+bHtLtGDyVVp9tqo4yvMrHe6BYmBUte3tPYQlDVdEo7UqepR\n"
+            + "uT7JbBOGBoD+9ngDrDggPUBAoa0h3VNOTyoDABEBAAGJAR8EIAECAAkFAlWdVXkC\n"
+            + "HQIACgkQCFUqF3yoeCH4lgf/aBdTYqnwL1lreHbQaUXI0/B2zlMuoptoi/x+xjIB\n"
+            + "7RszzaN3w0n4/87kUN2koNtgNymv2ccKTR1PiX+obscJhsWzNbz3/Cjtr/IpEQRd\n"
+            + "E6qRptHDk0U2cHW4BYDSltndOktICdhWCWYLDxJHGjdyXqqqdEEFJ24u2fUJ3yF3\n"
+            + "NF2Bxa6llrmLb2fVeVYBzQSztQopKRWP9nt3ySoeJQqRWjNBN2j7cC93nrLHZTvB\n"
+            + "L/sWuTq5ecbXeeNVzxoBd21jmGrIUPNwGdDKdbTB0CjpLpVHOTwGByeRKQXhMlQB\n"
+            + "pK96wUpxxtShtOjNjN1s9GEyLHwDiHSuHNYs/AxxFzf9nbQhVGVzdHVzZXIgRm91\n"
+            + "ciA8dGVzdDRAZXhhbXBsZS5jb20+iQE4BBMBAgAiBQJVnU2cAhsDBgsJCAcDAgYV\n"
+            + "CAIJCgsEFgIDAQIeAQIXgAAKCRAIVSoXfKh4IXsHCACSm9RIdxxqibAaxh+nm6w5\n"
+            + "F5a6Hju5cdmkk9albDoQYh2eM8E5NdDq+r0qSSe2+ujDaQ4C95DZNJQESvIcHHHb\n"
+            + "9AECrBfS8Yk86rX8hxVeYQczMkB9LdBHximTSoOr8L/eAxBE/VXDwust6EAe6Q1A\n"
+            + "a3tlTTvCfcmw4PipvtP7F6UzFaq+QU6fvARpBATOcvVc2JU4JQOrxuNEQ2PKrSti\n"
+            + "75S5mnVWm0pRebM+EorWBtlA0eOAeLNqCp87UwLdvUyOTRZT4DJ51eTxfrFADXrI\n"
+            + "9/ejs3/YxCPYxaPicAlcldduuajU/s+9ifrUn0Npg2ILl8mQkNzqeerlBeecUV4E\n"
+            + "uQENBFWdTZwBCADEOsK+mFQ/2uds9znkmAqrk24waVBpyPGrTTXtXX0dKhtQAsh6\n"
+            + "QkZGkjLTnKxEsa9syqVckw+1JtCh44SP1gjqDUoShpBz5wIuksZ7q96Hx+F0TVG/\n"
+            + "njS6GrWvwKhL2Lb9hYfdlrZiYtOOi0iiOzud25H/Ms15kC8tuQm7NWtANJJF4Sxo\n"
+            + "Bxor6L/F4zunEkTL0L9/dp4qVrw23fJVKE38cSdxjB0u1qSDzLV/u0QJqlYxJAiE\n"
+            + "ciwQN2uVnTY1/XSpouMy6LvbYU7B2uU/WohNmH3RiN/fQ6jJm4x+fCZ8+zqXMiZn\n"
+            + "G2fPkwmxxK9cl64YnNGcTwsVt6BMbCHk9jHxABEBAAGJAR8EGAECAAkFAlWdTZwC\n"
+            + "GwwACgkQCFUqF3yoeCGOdwf/TmoxH3pFBm/MDhY5Ct5FO0KvsgQk2ZgDa68HyQ8j\n"
+            + "QYi1FUCtyDjsxf5KTfyvzpzcTpS7cyOwcJNtTj6UixwATkcivvYWYoOXghAsTo4f\n"
+            + "1+j/x6ECq1+nYE6NpcAN7VRJpYMk2UO2qlhHCesTPGzsHchL7mwiYdhGrdiWGTpd\n"
+            + "KI9WfOYDZZ9ZSw/QINJUyTRxrDnauOvVbhbAXc7jdKCkRQRZpsNlF//1Stg6nstj\n"
+            + "FJ7SrjVdsMJNlihT6fG5ujmrty1/6b1VCLkIQfW5cWvzRzTBFytq7i4PVKh3u7Oz\n"
+            + "tt9lf8s50zt2uBE/AKMkyE6IJLsBWpJPk7iFKkHGDx044Q==\n"
+            + "=477N\n"
+            + "-----END PGP PUBLIC KEY BLOCK-----\n",
+        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "lQOYBFWdTZwBCAC1jukp5mlitfq2sAmdtx1s1VbWh+buDbBY2kWcxbbssczozFUP\n"
+            + "Ii67wPwjRbn3GM5+jY3GMsqKIrdyDlxeTxGWoU/qa2YkCQzgFGD/XJBqkVpP6osm\n"
+            + "qFYSP0xST1iBkatkMHq5KMjrX2q2bGVLlchLF9eHrWSefMcfff1Vs/Y8F2RCo38y\n"
+            + "gH88mbcvgyC+zq6Q2T3h5RiLK2IaZDNsn3uUoIMYHxI6oYtXXMSXRJlLJvamXVrB\n"
+            + "7QAq8L8cNikJjZMz+bHtLtGDyVVp9tqo4yvMrHe6BYmBUte3tPYQlDVdEo7UqepR\n"
+            + "uT7JbBOGBoD+9ngDrDggPUBAoa0h3VNOTyoDABEBAAEAB/4jqeZoOiACaV/Nygeh\n"
+            + "iOpJSiDsNDbrFRpKYdnhwT69APIQ2q5sshi+/dopbZVpkeBiIJk0UR7TAp3JVEPV\n"
+            + "rK92SMqjcCRYuMRkMeyZzMt7e4DjiN17ov6BSBjMZFSs4vnpTNKWk4ngHlaebe15\n"
+            + "6vq0sYK/XpKQxU7yAzQjxR190P/F+QEL98zVG/9uqM8PupfdSm4Smp2cIpfta+JD\n"
+            + "mO23HC6jAEm2RFwklovzgK3rbIjyiMuowIkAKx5xxRvpxMHf1l566b9zJrRi0xau\n"
+            + "vp4J/lnBJtTMzCbsaaFxhrj23xvTXaWR+UkaGPCv7wheXQ9K7NAHwmH8YrR+cZx7\n"
+            + "KbDlBADUTHZ+OhNslx/rkjRWrFuK9p49x7qxQc26kcqlGPbW6KOAMdUpwneQbhCG\n"
+            + "a36E/GAZgsgQ4SUqn37EVCtd2Y9Dp0inPAujcZXSwgDHev6ea7fzbxT9KLtEgvQN\n"
+            + "0vrFJDCPIt0wzGqNDw4wgFjF2rAafBO//Wu5K5QLW4hfzSguRQQA2u6DpVja/FYY\n"
+            + "UHVh2HLiB8th4T+qogOsBe5mKEsGRPXtAh7QzJu36C4PJyHeNlmlMx+15cCFnovj\n"
+            + "6cLpGn6ZP4okLyq2+VsW7wh/Vir+UZHoAO/cZRlOc1PsaQconcxxq30SsbaRQrAd\n"
+            + "YargKlXU7HMFiK34nkidBV6vVW0+P6cD/jYRInM983KXqX5bYvqsM1Zyvvlu6otD\n"
+            + "nG0F/nQYT7oaKKR46quDa+xHMxK8/Vu1+TabzY8XapnoYFaFvrl/d2rUBEZSoury\n"
+            + "z2yfTyeomft9MGGQsCGAJ95bVDT+jBoohnYwfwdC7HG3qk0aK/TxFyUqvMOX7SFe\n"
+            + "YT55n3HlD9InST+0IVRlc3R1c2VyIEZvdXIgPHRlc3Q0QGV4YW1wbGUuY29tPokB\n"
+            + "OAQTAQIAIgUCVZ1NnAIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQCFUq\n"
+            + "F3yoeCF7BwgAkpvUSHccaomwGsYfp5usOReWuh47uXHZpJPWpWw6EGIdnjPBOTXQ\n"
+            + "6vq9Kkkntvrow2kOAveQ2TSUBEryHBxx2/QBAqwX0vGJPOq1/IcVXmEHMzJAfS3Q\n"
+            + "R8Ypk0qDq/C/3gMQRP1Vw8LrLehAHukNQGt7ZU07wn3JsOD4qb7T+xelMxWqvkFO\n"
+            + "n7wEaQQEznL1XNiVOCUDq8bjRENjyq0rYu+UuZp1VptKUXmzPhKK1gbZQNHjgHiz\n"
+            + "agqfO1MC3b1Mjk0WU+AyedXk8X6xQA16yPf3o7N/2MQj2MWj4nAJXJXXbrmo1P7P\n"
+            + "vYn61J9DaYNiC5fJkJDc6nnq5QXnnFFeBJ0DmARVnU2cAQgAxDrCvphUP9rnbPc5\n"
+            + "5JgKq5NuMGlQacjxq0017V19HSobUALIekJGRpIy05ysRLGvbMqlXJMPtSbQoeOE\n"
+            + "j9YI6g1KEoaQc+cCLpLGe6veh8fhdE1Rv540uhq1r8CoS9i2/YWH3Za2YmLTjotI\n"
+            + "ojs7nduR/zLNeZAvLbkJuzVrQDSSReEsaAcaK+i/xeM7pxJEy9C/f3aeKla8Nt3y\n"
+            + "VShN/HEncYwdLtakg8y1f7tECapWMSQIhHIsEDdrlZ02Nf10qaLjMui722FOwdrl\n"
+            + "P1qITZh90Yjf30OoyZuMfnwmfPs6lzImZxtnz5MJscSvXJeuGJzRnE8LFbegTGwh\n"
+            + "5PYx8QARAQABAAf8CeTumd6jbN7USXXDyQdzjkguR6mfwN29dcY8YF4U52oOm3+w\n"
+            + "bR23XmqTvoDJXONatZEYOm093wP4hBktP3Vq2KZX5Ew9r2JoBUIoWOcHHvCQqSUW\n"
+            + "6KMJBJNBMv3zXnOscmcPvTgStS5HfYn/XRLAhEqkd2ov2x/OiS8p0vM0F7YYSOdu\n"
+            + "X6/nHeBCM5QSJl00kgcaeQYdIGL0bPv9DnoeAC2/yITEvtvs+MHZ7FjH8A45QjWn\n"
+            + "DwfVoLg7WOc3wJtqJ55/r/2pylrWz0YYM8s6I3gbDilCF+Wb8tEIOaWJEwY73J1/\n"
+            + "KQG5qlO3/hBlO80DtzNmi3ylRUuzGhTxQfvemwQA3EuZ+E48LJ3dwtdJhh5mFlWI\n"
+            + "Ket21e5v1mqMxuLhf5/2CYcifM08u3EsEUdIr7egF25Sea8otqmCYcG8FuB37VY/\n"
+            + "Hd4G/+YVVaaAB8EU6u64YfSswhzr0R2qWVLtkJr0EAephzdPdoUEtKDSdTxnXiDV\n"
+            + "3vSqLWtZekScLa979uMEAOQIodJwxSvveKQWILjK67ZJr56X8YQZWA6rFsr1xMY0\n"
+            + "N0GH+5k0k+tr4wT3H9uk9ZM1Z11G3c01mhzCNg5roFoKtftKUZRKxmbfjjDmAofl\n"
+            + "bA6EZ0WHLdOwDLLTuXK09IsjjSHq0YHOxIlgFzIreuoxtz27bEEGhVFQg7xb0Lgb\n"
+            + "A/9LP8i32L7/CHsuN0q4YjhJkkaB6JWUQMFqWwoAXALG3rnw/CGRYHmHpiAuSeHR\n"
+            + "dSlZzndVi5poNC/d27msTx7ZuWlN7nOyywHBCTWV/nstm2I9rDhrHK7Axgq0Vv0y\n"
+            + "bWAurUmEgDJHU3ZpsNVt4e30FooXIDLR4cnpRM7tILv39D4giQEfBBgBAgAJBQJV\n"
+            + "nU2cAhsMAAoJEAhVKhd8qHghjncH/05qMR96RQZvzA4WOQreRTtCr7IEJNmYA2uv\n"
+            + "B8kPI0GItRVArcg47MX+Sk38r86c3E6Uu3MjsHCTbU4+lIscAE5HIr72FmKDl4IQ\n"
+            + "LE6OH9fo/8ehAqtfp2BOjaXADe1USaWDJNlDtqpYRwnrEzxs7B3IS+5sImHYRq3Y\n"
+            + "lhk6XSiPVnzmA2WfWUsP0CDSVMk0caw52rjr1W4WwF3O43SgpEUEWabDZRf/9UrY\n"
+            + "Op7LYxSe0q41XbDCTZYoU+nxubo5q7ctf+m9VQi5CEH1uXFr80c0wRcrau4uD1So\n"
+            + "d7uzs7bfZX/LOdM7drgRPwCjJMhOiCS7AVqST5O4hSpBxg8dOOE=\n"
+            + "=5aNq\n"
+            + "-----END PGP PRIVATE KEY BLOCK-----\n");
+  }
+
+  /**
+   * A key with an additional user ID.
+   *
+   * <pre>
+   * pub   2048R/98C51DBF 2015-07-30
+   *       Key fingerprint = 42B3 294D 1924 D7EB AF4A  A99F 5024 BB44 98C5 1DBF
+   * uid                  foo:myId
+   * uid                  Testuser Five <test5@example.com>
+   * sub   2048R/C781A9E3 2015-07-30
+   * </pre>
+   */
+  public static TestKey validKeyWithSecondUserId() {
+    return new TestKey(
+        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "mQENBFW6jd4BCACrf+BZS3lntuWq2DWPOG07/BUWhx3RSoiS3JBuKEDmlsjswKcp\n"
+            + "JHT+p2tqH52XbujMlzNjAQcZjJwfOMt6Fg7zd3F8cwYQdCE/W5dpMs/mqdeEz6GL\n"
+            + "VJDZ0Y5wwz54ZQHp91Xq6uejxt5qffeTQk5cToQZ0RVx3iwBc+2P3iYJqMFmJzj8\n"
+            + "djabEoF4D50iI5tY8moE83VcXJ5Y4xn+5Z5AThmlfrMP6gIdG0b4lEe1tsnJC6AG\n"
+            + "GUU6VkzK6E1Tp93Y0brtWpJKi9Gt6eUqvWhZtPEdFVCFbLTpezUdRFEuaFbGg5pn\n"
+            + "9K/DceahFmquDJOHVgawt6erlq/ie7QEEld/ABEBAAG0IVRlc3R1c2VyIEZpdmUg\n"
+            + "PHRlc3Q1QGV4YW1wbGUuY29tPokBOAQTAQIAIgUCVbqN3gIbAwYLCQgHAwIGFQgC\n"
+            + "CQoLBBYCAwECHgECF4AACgkQUCS7RJjFHb+/MAf9FKZatGcuOIoYqwGQQneyc63v\n"
+            + "3H/PyhvYF1nuKNftmhqIiUHec9RaUHQkgam6LRoonkDfIpNlQVRv2XBV2VOAOFVO\n"
+            + "RyQ/Tv7/xtpqGZqivV0yn2ZXbCceA627Vz7gP4gkO0ZJ0JsYJTc/5wO+nVG5Lohu\n"
+            + "/zdUofEbFAvcXs+Z1uXnUDdeGn47Lf1xZ2XOHOI0aQW4DdNaFoAd+AOTe0W3iB6W\n"
+            + "paCIGno69CyNHNnWjJCSD33oLVaXyvbgw5UoyITvSqRnPyLGIc6dsqDLT59ok0Fk\n"
+            + "t4jtiGu9aze4n59GbtSjmWQgzbLCQWhK9K7UCcSLYNKXVyMha2WapBO156V027QI\n"
+            + "Zm9vOm15SWSJATgEEwECACIFAlW6jwYCGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4B\n"
+            + "AheAAAoJEFAku0SYxR2/zZUH/1BwPsResHLDSmo6UdQyQGxvV0NcwBqGAPSLHr+S\n"
+            + "PHEaHEIYvOywNfWXquYrECa/5iIrXuTQmCH0q8WRcz1UapDCeD8Ui82r+3O8m6gk\n"
+            + "hIR5VAeza+x/fGWhG342PvtpDU7JycDA3KMCTWtcAM89tFhffzuEQ3f5p5cMTtZk\n"
+            + "/23iegXbHd61vojYO17QYEj+qp9l0VNiyFymPL3qr5bVj/xn/mXFj+asj0L2ypIj\n"
+            + "zC36FkhzW5EX2xgV9Cl9zu7kLMTm+yM+jxbMLskYkG8z/D+xBQsoX8tEIPlxHLhB\n"
+            + "miEmVuZrp91ArRMWa3B7PYz7hQzs+M/bxKXcmWxacggTOvy5AQ0EVbqN3gEIAOlq\n"
+            + "mwdiXW0BQP/iQvIweP1taNypAvdjI2fpnXkUfBT5X/+E/RjYOHQEAzy8nEkS+Y0l\n"
+            + "MLwKt3S0IVRvdeXxlpL6Tl+P8DkcD5H+uvACrg9rtgbbNSoQtc9/3bknG9hea6xi\n"
+            + "6SBH1k9Y2RInIrwWslfKmuNkyZVhxPKypasBsvyhOWLlpCngGiCa74KJ1th1WKa2\n"
+            + "aaDqcbieBTc1mtsXR6kBhJZqK+JYBoHriUQMs7nyXxn2qyv6Lehs/tHlrBZ7j16S\n"
+            + "faQzYoBi1edVrpFr/CuGk6RNKxG9vi/uAA9q2cLCMjjyfMH4g0G2l0HuDPQLA9wi\n"
+            + "BfusEC+OceaeFKtS9ykAEQEAAYkBHwQYAQIACQUCVbqN3gIbDAAKCRBQJLtEmMUd\n"
+            + "vw/DB/9Qx9m1eSdddqz/fk16wJf7Ncr2teVvdQOjRf/qo43KDKxEzeepjgypG1br\n"
+            + "St7U4/MlPygJLBDB4pXp0kaKt+S/aqLpEGSGzQ1FysM8oY6K0e1Kbf6nMaQS8ATG\n"
+            + "aD377FrUJ42NV4JS+NGlwaM9PhpRVm5n8iCzRs9HtlTyfCBkNGDjGOSdWcah2m6T\n"
+            + "fEQdD+XVDN1ZC8zAnc8FW28YOTeTjX079okP6ZCjLJ16VZ7eiHFkrNbS9Dl4SPNK\n"
+            + "eElvsZLBaf8t4RQXFFKwRq4BW+zS8zm9E2H6bZ9yGrmgIREzyRPpwU98g8yrabu0\n"
+            + "54w16Vp/SVViJs7nTMSug0WREyd2\n"
+            + "=ldwB\n"
+            + "-----END PGP PUBLIC KEY BLOCK-----\n",
+        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "lQOYBFW6jd4BCACrf+BZS3lntuWq2DWPOG07/BUWhx3RSoiS3JBuKEDmlsjswKcp\n"
+            + "JHT+p2tqH52XbujMlzNjAQcZjJwfOMt6Fg7zd3F8cwYQdCE/W5dpMs/mqdeEz6GL\n"
+            + "VJDZ0Y5wwz54ZQHp91Xq6uejxt5qffeTQk5cToQZ0RVx3iwBc+2P3iYJqMFmJzj8\n"
+            + "djabEoF4D50iI5tY8moE83VcXJ5Y4xn+5Z5AThmlfrMP6gIdG0b4lEe1tsnJC6AG\n"
+            + "GUU6VkzK6E1Tp93Y0brtWpJKi9Gt6eUqvWhZtPEdFVCFbLTpezUdRFEuaFbGg5pn\n"
+            + "9K/DceahFmquDJOHVgawt6erlq/ie7QEEld/ABEBAAEAB/9MIlrQiWb+Gf3fWFh+\n"
+            + "mkg0Bva9p4IfNX1n5S7hGFGnjGzqXaRX6W1e16gh1qM5ZO1IVh9j5kLmnrt4SNhb\n"
+            + "/Irqnq3s14trpoJUBC81bm9JMUESHrLSjdo4OIWJncOP4xd0bG7h+SKYXGLE1+Me\n"
+            + "pqLu65RNebqRcFYM1xAxfCdaxatcz+LrW5ZX+6T/Gh/VCHRkkzzVIZO1dDBbyU2C\n"
+            + "JrNcfHSvNrjzfqYHtwfsk/lwcuY9pqkYcuwZ2IM+iWKit+WyCR2BzOpG/Sva1t8b\n"
+            + "7B7ituQCFMCv5IiaAoaSKX/t/0ucWCoT1ttih8LdwgEE0kgij/ZUfRxCiL9HmtLy\n"
+            + "ad9BBADBGYWv6NiTQiBG7+MZ+twCjlSL7vq8iENhQYZShGHF9z+ju7m8U1dteLny\n"
+            + "pC3NcNfCgWyy+8lRn1e6Oe6m7xL83LL3HJT5nIy9mpsCw/TIrrkzkoE+VpkEIL/o\n"
+            + "Yeoxauah4SU7laVD29aAQZ3TqwSwx0sJwPjsj73WjjqtzJfFkQQA410ghqMbQZN1\n"
+            + "yJzXgVAj162ZwTi961N5iYmqTiBtqGz1UfaNBJWdJMkCmhMTsiOtm1h4zUQRuEH+\n"
+            + "yq1xhKOGf15dB/cLSMj2KpVVlvgLoVmYDugSER8Q23juilY7iaf0bqo9q1sTHpn9\n"
+            + "O7Oin/9J3sz+ic45vDh4aa74sOzfhA8EAJwAFEWLrGSxtnYJR5vQNstHIH1wtQ5G\n"
+            + "ZUZ57y9CbDkKrfCQvd0JOBjfUDz+N8qiamNIqfhQBtlhIDYgtswiG+iGP/2G0l6S\n"
+            + "j9DHNe2CYPUKgy+zQiRnyNGE2XUfcE+HuNDfu3AryPqaD8vLLw8TnsAgis3bRGg+\n"
+            + "hhrAC1NyKfDXTg20IVRlc3R1c2VyIEZpdmUgPHRlc3Q1QGV4YW1wbGUuY29tPokB\n"
+            + "OAQTAQIAIgUCVbqN3gIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQUCS7\n"
+            + "RJjFHb+/MAf9FKZatGcuOIoYqwGQQneyc63v3H/PyhvYF1nuKNftmhqIiUHec9Ra\n"
+            + "UHQkgam6LRoonkDfIpNlQVRv2XBV2VOAOFVORyQ/Tv7/xtpqGZqivV0yn2ZXbCce\n"
+            + "A627Vz7gP4gkO0ZJ0JsYJTc/5wO+nVG5Lohu/zdUofEbFAvcXs+Z1uXnUDdeGn47\n"
+            + "Lf1xZ2XOHOI0aQW4DdNaFoAd+AOTe0W3iB6WpaCIGno69CyNHNnWjJCSD33oLVaX\n"
+            + "yvbgw5UoyITvSqRnPyLGIc6dsqDLT59ok0Fkt4jtiGu9aze4n59GbtSjmWQgzbLC\n"
+            + "QWhK9K7UCcSLYNKXVyMha2WapBO156V0250DmARVuo3eAQgA6WqbB2JdbQFA/+JC\n"
+            + "8jB4/W1o3KkC92MjZ+mdeRR8FPlf/4T9GNg4dAQDPLycSRL5jSUwvAq3dLQhVG91\n"
+            + "5fGWkvpOX4/wORwPkf668AKuD2u2Bts1KhC1z3/duScb2F5rrGLpIEfWT1jZEici\n"
+            + "vBayV8qa42TJlWHE8rKlqwGy/KE5YuWkKeAaIJrvgonW2HVYprZpoOpxuJ4FNzWa\n"
+            + "2xdHqQGElmor4lgGgeuJRAyzufJfGfarK/ot6Gz+0eWsFnuPXpJ9pDNigGLV51Wu\n"
+            + "kWv8K4aTpE0rEb2+L+4AD2rZwsIyOPJ8wfiDQbaXQe4M9AsD3CIF+6wQL45x5p4U\n"
+            + "q1L3KQARAQABAAf8C+2DsJPpPEnFHY5dZ2zssd6mbihA2414YLYCcw6F7Lh1nGQa\n"
+            + "XuulruAJnk/xGJbco8bTv7g4ecE+tsbfWnnG/QnHeYCsgO6bKRXATcWFSYpyidUn\n"
+            + "2VdzQwBAv1ZtSNhCXlPLn/erzvA2X4QadUwfnvbehWJAHt8ZJmHUr3FtyRUHEdCK\n"
+            + "2EXsBWnzPCcqHZOMvcbSINSqBFGzVXkOZsMFvPTNIUYRHz8NbJT/OPiOmyBshXpS\n"
+            + "t8w3QqZhBcTT3NZo3kgxN1RygaTa10ytB2cxTCVuD8hmUBaV9gakdfMYkVJds7/T\n"
+            + "ZY3It68F0vitBnqpppZQ+NFgr/vwVg0p3gbmAQQA79zsWPvyIqYvyJhmiKvLIpev\n"
+            + "569ho8tC9xx+IZ5WnjN8ZADlb9brAdA9cqGfBgZkpZUhngCRVOYUIco+m2NYkEJm\n"
+            + "BsSTTM77dqU55DRloJ3FtBwCPXHkwg9P/FHMMYYGyLpQTSB92hXk8yomo+ozX7kx\n"
+            + "DtUHZIrir/rr0lQe+GkEAPkep9V5jBmfHMArnfji7Nfb1/ZjrSAaK+rtqczgm+6j\n"
+            + "ubY/0DpM/6gm+/8X27WFw2m45ncH3qNvOe4Qm40EmgmHkXsdQyU0Fv7uXc9nBYoo\n"
+            + "G6s7DWLY4VAqWwPsvbqgpSp/qdGn9nlcJjjY1HtfU7HM3xysT7TJ2YVhYHlJdjDB\n"
+            + "A/0alBcYtHvaCJaRLWX4UiashbfETWAf/4oHlERjkXj64qOdsGnD6CD99t9x91Ue\n"
+            + "pClPsLDFvY8/HxWX7STA9pQZAa2ZdJd8b58Rgy9TBShw2mbz2S6Cbw77pP/WEjtJ\n"
+            + "pJuS2gDp70H01fYRaw7YH32CfUr1VeEv7hTjk/SNVteIZkkOiQEfBBgBAgAJBQJV\n"
+            + "uo3eAhsMAAoJEFAku0SYxR2/D8MH/1DH2bV5J112rP9+TXrAl/s1yva15W91A6NF\n"
+            + "/+qjjcoMrETN56mODKkbVutK3tTj8yU/KAksEMHilenSRoq35L9qoukQZIbNDUXK\n"
+            + "wzyhjorR7Upt/qcxpBLwBMZoPfvsWtQnjY1XglL40aXBoz0+GlFWbmfyILNGz0e2\n"
+            + "VPJ8IGQ0YOMY5J1ZxqHabpN8RB0P5dUM3VkLzMCdzwVbbxg5N5ONfTv2iQ/pkKMs\n"
+            + "nXpVnt6IcWSs1tL0OXhI80p4SW+xksFp/y3hFBcUUrBGrgFb7NLzOb0TYfptn3Ia\n"
+            + "uaAhETPJE+nBT3yDzKtpu7TnjDXpWn9JVWImzudMxK6DRZETJ3Y=\n"
+            + "=uND5\n"
+            + "-----END PGP PRIVATE KEY BLOCK-----\n");
+  }
+
+  /**
+   * A key revoked by a valid key, due to key compromise.
+   *
+   * <p>Revoked by {@link #validKeyWithoutExpiration()}.
+   *
+   * <pre>
+   * pub   2048R/3434B39F 2015-10-20 [revoked: 2015-10-20]
+   *       Key fingerprint = 931F 047D 7D01 DDEF 367A  8D90 8C4F D28E 3434 B39F
+   * uid                  Testuser Six &lt;test6@example.com&gt;
+   * </pre>
+   */
+  public static TestKey revokedCompromisedKey() throws Exception {
+    return new TestKey(
+        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "mQENBFYmpXkBCACqaLz51DcWQmfOJnat9iHSySfSHwbKfVvoN43Ba2cf/D/PadRc\n"
+            + "HLgc+91k2yk1kV1LnMdvUGj5zZ84ZqrQx3f1WeItnzZpqxtmQS/GSxCp9EY/s7w6\n"
+            + "5i86R/k9Tzgvk0B7dKZJXbM/OWxxDkkxHWE3Un9wreX7bDU5b9D2knHRiNFqH9ZJ\n"
+            + "KqDIFZqH9WTUxNZcHz20sTCRIMfvsAwf2vRU5N5xTu4Mbk6JFc7BAj7h1f/mYEPo\n"
+            + "CTyB1jV/DSDVdn1FjJVocSg6W/CvsYF9hKFYjJHl4VXdePTpnOjHhJLL0QWk0TMe\n"
+            + "xYeUi/xDr5DeMxTmi7F7BFaQEF+KmUM46e+9ABEBAAGJATAEIAECABoFAlYmq1gT\n"
+            + "HQJ0ZXN0NiBjb21wcm9taXNlZAAKCRDtBiXcRjKKjIm6B/9YwkyG4w+9KUNESywM\n"
+            + "bxC2WWGWrFcQGoKxixzt0uT251UY8qxa1IED0wnLsIQmffTQcnrK3B9svd4HhQlk\n"
+            + "pheKQ3w5iluLeGmGljhDBdAVyS07jYoFUGTXjwzPAgJ3Dxzul8Q8Zj+fOmRcfsP9\n"
+            + "72kl6g2yEEbevnydWIiOj/vWHVLFb54G8bwXTNwH/FXQsHuPYxXZifwyDwdwEQMq\n"
+            + "0VTZcrukgeJ+VbSSuq+uX4I3+kJw5hL49KYAQltQBmTo3yhuY/Q+LkgcBv/umtY/\n"
+            + "DrUqSCBV1bTnfq5SfaObkUu22HWjrtSFSjnXYyh+wyTG3AXG3N9VPrjGQIJIW1j6\n"
+            + "9QM0iQE3BB8BAgAhBQJWJqYUFwyAAQSup+0vghEz5bEo0e0GJdxGMoqMAgcAAAoJ\n"
+            + "EIxP0o40NLOfYd4H/3GpfxfJ+nMzBChn1JqFrKOqqYiOO4sUwubXzpRO33V2jUrU\n"
+            + "V75PTWG/6NlgDbPfKFcU0qZud6M2EQxSS9/I20i/MpRB7qJnWMM/6HxdMDJ0o/pN\n"
+            + "4ImIGj38QTIWx0DS9n3bwlcobl7ZlM8g2N1kv5jQPEuurffeJRS4ny4pEvCCm2IS\n"
+            + "SGOuB0DVtYHGDrJLQ0k4mDkEJuU8fP5un8mN8I8eAINlsTFpsTswMXMiptZTm5SI\n"
+            + "5QZlG3m5MvvckngYdhynvCWc6JHGt1EHXlI4A5Qetr/4FbNE4uYcEEhyzBy4WQfi\n"
+            + "QCPiIzzm3O4cMnr9N+5HzYqRhu2OveYm86G2Rxq0IFRlc3R1c2VyIFNpeCA8dGVz\n"
+            + "dDZAZXhhbXBsZS5jb20+iQE4BBMBAgAiBQJWJqV5AhsDBgsJCAcDAgYVCAIJCgsE\n"
+            + "FgIDAQIeAQIXgAAKCRCMT9KONDSzn2XtB/4wl4ctc3cW9Fwp17cktFi6md8fjRiR\n"
+            + "wE/ruVKIKmAHzeMLBoZn4LZVunyNCRGLZfP+MUs4JhLkp8ioTzUB7xPl9k94FXel\n"
+            + "bObn9F0T7htjFLiFAOMeykneylk2kalTt6IBKtaOPn+V6onBwO+YHbwt+xLMhAWj\n"
+            + "Z/WA0TIC1RIukdzWErhd+9lG8B9kupGC5bPo/AgCPoajPhS1qLrth+lCsNJXT/Rt\n"
+            + "k6Jx5omypxMXPzgzNtULMFONszaRnHnrCHQg/yJZDCw3ffW5ShfyfWdFM65jgEKo\n"
+            + "nMKLzy9XV+BM6IJQlgHCBAP8WHKSf4qMG4/hEWLrwA/bTQ7w0DSV88msuQENBFYm\n"
+            + "pXkBCACzIMFDC6kcV58uvF3XwOrS3DmKNPDNzO/4Ay/iOxZbm+9NP8QWEEm+AzCt\n"
+            + "ZMfYdZ8C3DjuzxkhcacI/E5agZICds6bs0+VS7VKEeNYp/UrTF9pkZNXseCrJPgr\n"
+            + "U31eoGVc5bE5c0TGLhAjbMKtR5LZFMpAXgpA7hXJSSuAXGs8gjkJkYSJYnJwIOyd\n"
+            + "xOi5jmnE/U5QuMjBG0bwxFXxkaDa5mcebJ/6C8mgkKyATbQkCe7YJGl1JLK4vY28\n"
+            + "ybSMhMDtZiwgvKzd+HcQr+xUQvmgSMApJaMxKPHRA1IrP/STXUEAjcGfk/HCz/0j\n"
+            + "7mJG2cvCxeOMAmp/pTzhSoXiqUNlABEBAAGJAR8EGAECAAkFAlYmpXkCGwwACgkQ\n"
+            + "jE/SjjQ0s5/kVAf/QvHOhuoBSlSxPcgvnvCl8V3zbNR1P9lgjYGwMsvLhwCT7Wvm\n"
+            + "mkUKvtT913uER93N8xJD2svGhKabpiPj9/eo0p3p64dicijsP1UQfpmWKPa/V9sv\n"
+            + "zep08cpDl/eczSiLqgcTXCoZeewWXoQGqqoXnwa4lwQv4Zvj7TTCN2wRzoGwbRcm\n"
+            + "G2hmc27uOwA+hXbF+bLe6HOZR/7U93j8a22g2X9OgST/QCsLgyiUSw3YYaEan9tn\n"
+            + "wuEgAEY/rchOvgeXe5Sl0wTFLHH6OS4BBGgc1LRKnSCM2dgZqvhOOxOvuuieBWY6\n"
+            + "tULvIEIjNNP8Qizfc4u2O8h7HP2b3yYSrp9MMQ==\n"
+            + "=Dxr7\n"
+            + "-----END PGP PUBLIC KEY BLOCK-----\n",
+        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "lQOYBFYmpXkBCACqaLz51DcWQmfOJnat9iHSySfSHwbKfVvoN43Ba2cf/D/PadRc\n"
+            + "HLgc+91k2yk1kV1LnMdvUGj5zZ84ZqrQx3f1WeItnzZpqxtmQS/GSxCp9EY/s7w6\n"
+            + "5i86R/k9Tzgvk0B7dKZJXbM/OWxxDkkxHWE3Un9wreX7bDU5b9D2knHRiNFqH9ZJ\n"
+            + "KqDIFZqH9WTUxNZcHz20sTCRIMfvsAwf2vRU5N5xTu4Mbk6JFc7BAj7h1f/mYEPo\n"
+            + "CTyB1jV/DSDVdn1FjJVocSg6W/CvsYF9hKFYjJHl4VXdePTpnOjHhJLL0QWk0TMe\n"
+            + "xYeUi/xDr5DeMxTmi7F7BFaQEF+KmUM46e+9ABEBAAEAB/wOspbuA1A3AsY6QRYG\n"
+            + "Xg6/w+rD1Do9N7+4ESaQUqej2hlU1d9jjHSSx2RqgP6WaLG/xkdrQeez9/iuICjG\n"
+            + "dhXSGw0He05xobjswl2RAENxLSjr8KAhAl57a97C23TQoaYzn7WB6Wt+3gCM5bsJ\n"
+            + "WevbHinwuYb2/ve+OvcudSYM+Nhtpv0DoTaizhi9wzc3g/XLbturlpdCffbw4y+h\n"
+            + "gBPd/t3cc/0Ams8Wi2RlmDOoe73ls23nBHcNomgydyIYBn7U5Z3v3YkPNp9VBiXx\n"
+            + "rC4mDtB1ugucMhqjRNAYqinaLP35CiBTU/IB0WLu7ZyytnjY5frly1ShAG8wFL0B\n"
+            + "MOMxBADJjGy1NwGSd/7eMeYyYThyhXDxo5so91/O1+RLnSUVv/Nz6VOPp2TtuVN5\n"
+            + "uTJkpSXtUFyWbf8mkQiFz4++vHW5E/Q6+KomXRalK7JeBzeFMtax64ykQHID9cSu\n"
+            + "TaSHBhOEEeZZuf6BlulYEJEBHYK6EFlPJn+cpZtTFaqDoKh22QQA2HKjfyeppNre\n"
+            + "WRFJ9h1x1hBlSRR+XIPYmDmZUjL37jQUlw8iF+txPclfyNBw2I2Om+Jhcf25peOx\n"
+            + "ow4yvjt8r3qDjNhI2zLE9u4zrQ9xU8CUingT0t4k3NO2vigpKlmp1/w2IHSMctry\n"
+            + "v1v3+BAS8qGIYDY1lgI7QBvle5hxGYUD/00zMyHOIgYg/cM5sR0qafesoj9kRff5\n"
+            + "UMnSy1dw+pGMv6GqKGbcZDoC060hUO9GhQRPZXF8PlYzD30lOLS2Uw4mPXjOmQVv\n"
+            + "lDiyl/vLkfkVfP/alYH0FW6mErDrjtHhrZewqDm3iPLGMVGfGCJsL+N37VBSe+jr\n"
+            + "4rZCnjk/Jo5JRoKJATcEHwECACEFAlYmphQXDIABBK6n7S+CETPlsSjR7QYl3EYy\n"
+            + "iowCBwAACgkQjE/SjjQ0s59h3gf/cal/F8n6czMEKGfUmoWso6qpiI47ixTC5tfO\n"
+            + "lE7fdXaNStRXvk9NYb/o2WANs98oVxTSpm53ozYRDFJL38jbSL8ylEHuomdYwz/o\n"
+            + "fF0wMnSj+k3giYgaPfxBMhbHQNL2fdvCVyhuXtmUzyDY3WS/mNA8S66t994lFLif\n"
+            + "LikS8IKbYhJIY64HQNW1gcYOsktDSTiYOQQm5Tx8/m6fyY3wjx4Ag2WxMWmxOzAx\n"
+            + "cyKm1lOblIjlBmUbebky+9ySeBh2HKe8JZzokca3UQdeUjgDlB62v/gVs0Ti5hwQ\n"
+            + "SHLMHLhZB+JAI+IjPObc7hwyev037kfNipGG7Y695ibzobZHGrQgVGVzdHVzZXIg\n"
+            + "U2l4IDx0ZXN0NkBleGFtcGxlLmNvbT6JATgEEwECACIFAlYmpXkCGwMGCwkIBwMC\n"
+            + "BhUIAgkKCwQWAgMBAh4BAheAAAoJEIxP0o40NLOfZe0H/jCXhy1zdxb0XCnXtyS0\n"
+            + "WLqZ3x+NGJHAT+u5UogqYAfN4wsGhmfgtlW6fI0JEYtl8/4xSzgmEuSnyKhPNQHv\n"
+            + "E+X2T3gVd6Vs5uf0XRPuG2MUuIUA4x7KSd7KWTaRqVO3ogEq1o4+f5XqicHA75gd\n"
+            + "vC37EsyEBaNn9YDRMgLVEi6R3NYSuF372UbwH2S6kYLls+j8CAI+hqM+FLWouu2H\n"
+            + "6UKw0ldP9G2TonHmibKnExc/ODM21QswU42zNpGceesIdCD/IlkMLDd99blKF/J9\n"
+            + "Z0UzrmOAQqicwovPL1dX4EzoglCWAcIEA/xYcpJ/iowbj+ERYuvAD9tNDvDQNJXz\n"
+            + "yaydA5gEVialeQEIALMgwUMLqRxXny68XdfA6tLcOYo08M3M7/gDL+I7Flub700/\n"
+            + "xBYQSb4DMK1kx9h1nwLcOO7PGSFxpwj8TlqBkgJ2zpuzT5VLtUoR41in9StMX2mR\n"
+            + "k1ex4Ksk+CtTfV6gZVzlsTlzRMYuECNswq1HktkUykBeCkDuFclJK4BcazyCOQmR\n"
+            + "hIlicnAg7J3E6LmOacT9TlC4yMEbRvDEVfGRoNrmZx5sn/oLyaCQrIBNtCQJ7tgk\n"
+            + "aXUksri9jbzJtIyEwO1mLCC8rN34dxCv7FRC+aBIwCklozEo8dEDUis/9JNdQQCN\n"
+            + "wZ+T8cLP/SPuYkbZy8LF44wCan+lPOFKheKpQ2UAEQEAAQAH/A1Os+Tb9yiGnuoN\n"
+            + "LuiSKa/YEgNBOxmC7dnuPK6xJpBQNZc200WzWJMf8AwVpl4foNxIyYb+Rjbsl1Ts\n"
+            + "z5JcOWFq+57oE5O7D+EMkqf5tFZO4nC4kqprac41HSW02mW/A0DDRKcIt/WEIwlK\n"
+            + "sWzHmjJ736moAtl/holRYQS0ePgB8bUPDQcFovH6X3SUxlPGTYD1DEX+WNvYRk3r\n"
+            + "pa9YXH65qbG9CEJIFTmwZIRDl+CBtBlN/fKadyMJr9fXtv7Fu9hNsK1K1pUtLqCa\n"
+            + "nc22Zak+o+LCPlZ8vmw/UmOGtp2iZlEragmh2rOywp0dHF7gsdlgoafQf8Q4NIag\n"
+            + "TFyHf1kEAMSOKUUwLBEmPnDVfoEOt5spQLVtlF8sh/Okk9zVazWmw0n/b1Ef72z6\n"
+            + "EZqCW9/XhH5pXfKJeV+08hroHI6a5UESa7/xOIx50TaQdRqjwGciMnH2LJcpIU/L\n"
+            + "f0cGXcnTLKt4Z2GeSPKFTj4VzwmwH5F/RYdc5eiVb7VNoy9DC5RZBADpTVH5pklS\n"
+            + "44VDJIcwSNy1LBEU3oj+Nu+sufCimJ5B7HLokoJtm6q8VQRga5hN1TZkdQcLy+b2\n"
+            + "wzxHYoIsIsYFfG/mqLZ3LJNDFqze1/Kj987DYSUGeNYexMN2Fkzbo35Jf0cpOiao\n"
+            + "390JFOS7qecUak5/yJ/V4xy8/nds37617QP9GWlFBykDoESBC2AIz8wXcpUBVNeH\n"
+            + "BNSthmC+PJPhsS6jTQuipqtXUZBgZBrMHp/bA8gTOkI4rPXycH3+ACbuQMAjbFny\n"
+            + "Kt69lPHD8VWw/82E4EY2J9LmHli+2BcATz89ouC4kqC5zF90qJseviSZPihpnFxA\n"
+            + "1UqMU2ZjsPb4CM9C/YkBHwQYAQIACQUCVialeQIbDAAKCRCMT9KONDSzn+RUB/9C\n"
+            + "8c6G6gFKVLE9yC+e8KXxXfNs1HU/2WCNgbAyy8uHAJPta+aaRQq+1P3Xe4RH3c3z\n"
+            + "EkPay8aEppumI+P396jSnenrh2JyKOw/VRB+mZYo9r9X2y/N6nTxykOX95zNKIuq\n"
+            + "BxNcKhl57BZehAaqqhefBriXBC/hm+PtNMI3bBHOgbBtFyYbaGZzbu47AD6FdsX5\n"
+            + "st7oc5lH/tT3ePxrbaDZf06BJP9AKwuDKJRLDdhhoRqf22fC4SAARj+tyE6+B5d7\n"
+            + "lKXTBMUscfo5LgEEaBzUtEqdIIzZ2Bmq+E47E6+66J4FZjq1Qu8gQiM00/xCLN9z\n"
+            + "i7Y7yHsc/ZvfJhKun0wx\n"
+            + "=M/kw\n"
+            + "-----END PGP PRIVATE KEY BLOCK-----\n");
+  }
+
+  /**
+   * A key revoked by a valid key, due to no longer being used.
+   *
+   * <p>Revoked by {@link #validKeyWithoutExpiration()}.
+   *
+   * <pre>
+   * pub   2048R/3D6C52D0 2015-10-20 [revoked: 2015-10-20]
+   *       Key fingerprint = 32DB 6C31 2ED7 A98D 11B2  43EA FAD2 ABE2 3D6C 52D0
+   * uid                  Testuser Seven &lt;test7@example.com&gt;
+   * </pre>
+   */
+  public static TestKey revokedNoLongerUsedKey() throws Exception {
+    return new TestKey(
+        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "mQENBFYmq3EBCAC9ssY6QhFsnZqKEPlQrx8Zomblj8qV93/B448isOT2L6OVY7UC\n"
+            + "kKPj6afW5UDkYeyZSmLZfTrpePcbAB8FB3uvd/AS9mHC+6zuBlwlkl9xIXlwUXQP\n"
+            + "KER4LKYNTP21AM+/vTJm4+u26tlZECIZlez31KEeqM30EAm+/pO8VkEp8+1ImfLv\n"
+            + "otndIjMoq9gxJvn6KZeexJT2eKCsSa20vVsmAhuFjLZitU3lEjIROfDiyHUZ2cZ+\n"
+            + "qynfppJCKlHJRu/T9L/yxDFVUFDFSajNzSfjG1g3FEveDITyAhRetVfZbhyJptnV\n"
+            + "jfiHSQkLamPsBmMoKfP+aO5SfsTHTJvxgLUdABEBAAGJAS0EIAECABcFAlYmq8AQ\n"
+            + "HQN0ZXN0NyBub3QgdXNlZAAKCRDtBiXcRjKKjPKqB/sF+ypJZaZ5M4jFdoH/YA3s\n"
+            + "4+VkA/NbLKcrlMI0lbnIrax02jdyTo7rBUJfTwuBs5QeQ25+VfaBcz9fWSv4Z8Bk\n"
+            + "9+w61bQZLQkExZ9W7hnhaapyR0aT0rY48KGtHOPNoMQu9Si+RnRiI024jMUUjrau\n"
+            + "w/exgCteY261VtCPRgyZOlpbX43rsBhF8ott0ZzSfLwaNTHhsjFsD1uH6TSFO8La\n"
+            + "/H1nO31sORlY3+rCGiQVuYIJD1qI7bEjDHYO0nq/f7JjfYKmVBg9grwLsX3h1qZ2\n"
+            + "L3Yz+0eCi7/6T/Sm7PavQ+EGL7+WBXX3qJpwc+EFNHs6VxQp86k6csba0c5mNcaQ\n"
+            + "iQE3BB8BAgAhBQJWJqusFwyAAQSup+0vghEz5bEo0e0GJdxGMoqMAgcAAAoJEPrS\n"
+            + "q+I9bFLQ2BYH/jm+t7pZuv8WqZdb8FiBa9CFfhcSKjYarMHjBw7GxWZJMd5VR4DC\n"
+            + "r4T/ZSAGRKBRKQ2uXrkm9H0NPDp0c/UKCHtQMFDnqTk7B63mwSR1d7W0qaRPXYQ1\n"
+            + "bbatnzkEDOj0e+rX6aiqVRMo/q6uMNUFl6UMrUZPSNB5PVRQWPnQ7K11mw3vg0e5\n"
+            + "ycqJbyFvER6EtyDUXGBo8a5/4bK8VBNBMTAIy6GeGpeSM5b7cpQk7/j4dXugCJAV\n"
+            + "fhFNUOgLduoIKM4u+VcFjk3Km/YxOtGi1dLqCbTX/0LiCRA9mgQpyNVyA+Sm48LM\n"
+            + "LUkbcrN/F3SHX1ao/5lm19r8Biu1ziQnLgC0IlRlc3R1c2VyIFNldmVuIDx0ZXN0\n"
+            + "N0BleGFtcGxlLmNvbT6JATgEEwECACIFAlYmq3ECGwMGCwkIBwMCBhUIAgkKCwQW\n"
+            + "AgMBAh4BAheAAAoJEPrSq+I9bFLQvjQH/0K7aBsGU2U/rm4I+u+uPa6BnFTYQJqg\n"
+            + "034pwdD0WfM3M/XgVh7ERjnR9ZViCMVej+K3kW5d2DNaXu5vVpcD6L6jjWwiJHBw\n"
+            + "LIcmpqQrL0TdoCr4F4FKQnBbcH1fNvP8A/hLDHB3k3ERPvEFIo1AkVuK4s/v7yZY\n"
+            + "HAowX0r4ok4ndu/wAc0HI1FkApkAfh18JDTuui53dkKhnkDp7Xnfm/ElAZYjB7Se\n"
+            + "ivxOD9vdhViWSx1VhttPZo5hSyJrEYaJ5u9hsXNUN85DxgLqCmS1v8n3pN1lVY/Q\n"
+            + "TYXtgocakQgHGEG0Tl6a3xpNkn9ihnyCr80mHCxXTyUUBGfygccelB+5AQ0EViar\n"
+            + "cQEIAKxwXb6HGV9QjepADyWW7GMxc2JVZ7pZM2sdf8wrgnQqV2G1rc9gAgwTX4jt\n"
+            + "OY0vSKT1vBq09ZXS3qpYHi/Wwft0KkaX/a7e6vKabDSfhilxC2LuGz2+56f6UOzj\n"
+            + "ggwf5k4LFTQvkDUZumwPjoeC2hqQO3Q/9PW39C6GnvsCr5L0MRdO3PbVJM7lJaOk\n"
+            + "MbGwgysErWgiZXKlxMpIvffIsLC4BAxnjXaCy6zHuBcPMPaRMs7sDRBzeuTV2wnX\n"
+            + "Sd+IXZgdpd1hF7VkuXenzwOqvBGS66C3ILW0ZTFaOtgrloIkTvtYEcJFWvxqWl2F\n"
+            + "+JQ5V6eu2aJ3HIGyr9L1R8MUA6EAEQEAAYkBHwQYAQIACQUCViarcQIbDAAKCRD6\n"
+            + "0qviPWxS0M0PB/9Rbk4/pNW67+uE1lwtaIG7uFiMbJqu8jK6MkD8GdayflroWEZA\n"
+            + "x0Xow9HL8UaRfeRPTZMrDRpjl+fJIXT5qnlB0FPmzSXAKr3piC8migBcbp5m6hWh\n"
+            + "c3ScAqWOeMt9j0TTWHh4hKS8Q+lK392ht65cI/kpFhxm9EEaXmajplNL/2G3PVrl\n"
+            + "fFUgCdOn2DYdVSgJsfBhkcoiy17G3vqtb+We6ulhziae4SIrkUSqdYmRjiFyvqZz\n"
+            + "tmMEoF6CQNCUb1NK0TsSDeIdDacYjUwyq0Qj6TaXrWcbC3kW0GtWoFTNIiX4q9bN\n"
+            + "+B6paw/s8P7XCWznTBRdlFWWgrhcpzQ8fefC\n"
+            + "=CHer\n"
+            + "-----END PGP PUBLIC KEY BLOCK-----\n",
+        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "lQOYBFYmq3EBCAC9ssY6QhFsnZqKEPlQrx8Zomblj8qV93/B448isOT2L6OVY7UC\n"
+            + "kKPj6afW5UDkYeyZSmLZfTrpePcbAB8FB3uvd/AS9mHC+6zuBlwlkl9xIXlwUXQP\n"
+            + "KER4LKYNTP21AM+/vTJm4+u26tlZECIZlez31KEeqM30EAm+/pO8VkEp8+1ImfLv\n"
+            + "otndIjMoq9gxJvn6KZeexJT2eKCsSa20vVsmAhuFjLZitU3lEjIROfDiyHUZ2cZ+\n"
+            + "qynfppJCKlHJRu/T9L/yxDFVUFDFSajNzSfjG1g3FEveDITyAhRetVfZbhyJptnV\n"
+            + "jfiHSQkLamPsBmMoKfP+aO5SfsTHTJvxgLUdABEBAAEAB/9AdCtFJSidcolNKwpC\n"
+            + "/1V+VL9IdYxcWx02CDccjuUkvrgCrL+WcQW2jS/hZMChOKJ2zR78DcBEDr1LF8Xy\n"
+            + "ZAIC8yoHj15VLUUrFM8fVvYFzt1fq9VWxxRIjscW0teLNgzgdYzYB84RtwcFa2Vi\n"
+            + "sx2ycTUTYUClEgP1uLMCtX3rnibJh4vR+lVgnDtKSoh4CLAlW6grAAVdw5sSuV7Q\n"
+            + "i9EJcPezGw1RvBU5PooqNDG6kyw/QqsAS4q3WP4uVJKK1e7S9oqXFEN8k/zfllI0\n"
+            + "SSkoyP2flzz71rJF/wQMfJ8uf/CelKXd+gPO4FbCWiZSTLe20JR23qiOyvZkfCwg\n"
+            + "eFmzBADIJUzspDrg5yaqE+HMc8U3O9G9FHoDSweZTbhiq3aK0BqMAn34u0ps6chy\n"
+            + "VMO6aPWVzgcSHNfTlzpjuN9lwDoimYBH5vZa1HlCHt5eeqTORixkxSerOmILabTi\n"
+            + "QWq5JPdJwYZiSvK45G5k3G37RTd6/QyhTlRYXj59RXYajrYngwQA8qMZRkRYcTop\n"
+            + "aG+5M0x44k6NgIyH7Ap+2vRPpDdUlHs+z+6iRvoutkSfKHeZUYBQjgt+tScfn1hM\n"
+            + "BRB+x146ecmSVh/Dh8yu6uCrhitFlKpyJqNptZo5o+sH41zjefpMd/bc8rtHTw3n\n"
+            + "GiFl57ZbXbze2O8UimUVgRI2DtOebt8EAJHM/8vZahzF0chzL4sNVAb8FcNYxAyn\n"
+            + "95VpnWeAtKX7f0bqUvIN4BNV++o6JdMNvBoYEQpKeQIda7QM59hNiS8f/bxkRikF\n"
+            + "OiHB5YGy2zRX5T1G5rVQ0YqrOu959eEwdGZmOQ8GOqq5B/NoHXUtotV6SGE3R+Tl\n"
+            + "grlV4U5/PT0fM3KJATcEHwECACEFAlYmq6wXDIABBK6n7S+CETPlsSjR7QYl3EYy\n"
+            + "iowCBwAACgkQ+tKr4j1sUtDYFgf+Ob63ulm6/xapl1vwWIFr0IV+FxIqNhqsweMH\n"
+            + "DsbFZkkx3lVHgMKvhP9lIAZEoFEpDa5euSb0fQ08OnRz9QoIe1AwUOepOTsHrebB\n"
+            + "JHV3tbSppE9dhDVttq2fOQQM6PR76tfpqKpVEyj+rq4w1QWXpQytRk9I0Hk9VFBY\n"
+            + "+dDsrXWbDe+DR7nJyolvIW8RHoS3INRcYGjxrn/hsrxUE0ExMAjLoZ4al5Izlvty\n"
+            + "lCTv+Ph1e6AIkBV+EU1Q6At26ggozi75VwWOTcqb9jE60aLV0uoJtNf/QuIJED2a\n"
+            + "BCnI1XID5KbjwswtSRtys38XdIdfVqj/mWbX2vwGK7XOJCcuALQiVGVzdHVzZXIg\n"
+            + "U2V2ZW4gPHRlc3Q3QGV4YW1wbGUuY29tPokBOAQTAQIAIgUCViarcQIbAwYLCQgH\n"
+            + "AwIGFQgCCQoLBBYCAwECHgECF4AACgkQ+tKr4j1sUtC+NAf/QrtoGwZTZT+ubgj6\n"
+            + "7649roGcVNhAmqDTfinB0PRZ8zcz9eBWHsRGOdH1lWIIxV6P4reRbl3YM1pe7m9W\n"
+            + "lwPovqONbCIkcHAshyampCsvRN2gKvgXgUpCcFtwfV828/wD+EsMcHeTcRE+8QUi\n"
+            + "jUCRW4riz+/vJlgcCjBfSviiTid27/ABzQcjUWQCmQB+HXwkNO66Lnd2QqGeQOnt\n"
+            + "ed+b8SUBliMHtJ6K/E4P292FWJZLHVWG209mjmFLImsRhonm72Gxc1Q3zkPGAuoK\n"
+            + "ZLW/yfek3WVVj9BNhe2ChxqRCAcYQbROXprfGk2Sf2KGfIKvzSYcLFdPJRQEZ/KB\n"
+            + "xx6UH50DmARWJqtxAQgArHBdvocZX1CN6kAPJZbsYzFzYlVnulkzax1/zCuCdCpX\n"
+            + "YbWtz2ACDBNfiO05jS9IpPW8GrT1ldLeqlgeL9bB+3QqRpf9rt7q8ppsNJ+GKXEL\n"
+            + "Yu4bPb7np/pQ7OOCDB/mTgsVNC+QNRm6bA+Oh4LaGpA7dD/09bf0Loae+wKvkvQx\n"
+            + "F07c9tUkzuUlo6QxsbCDKwStaCJlcqXEyki998iwsLgEDGeNdoLLrMe4Fw8w9pEy\n"
+            + "zuwNEHN65NXbCddJ34hdmB2l3WEXtWS5d6fPA6q8EZLroLcgtbRlMVo62CuWgiRO\n"
+            + "+1gRwkVa/GpaXYX4lDlXp67ZonccgbKv0vVHwxQDoQARAQABAAf5Ae8xa1mPns1E\n"
+            + "B5yCrvzDl79Dw0F1rED46IWIW/ghpVTzmFHV6ngcvcRFM5TZquxHXSuxLv7YVxRq\n"
+            + "UVszXNJaEwyJYYkDRwAS1E2IKN+gknwapm2eWkchySAajUsQt+XEYHFpDPtQRlA3\n"
+            + "Z6PrCOPJDOLmT9Zcf0R6KurGrhvTGrZkKU6ZCFqZWETfZy5cPfq2qxtw3YEUI+eT\n"
+            + "09AgMmPJ9nDPI3cA69tvy/phVFgpglsS76qgd6uFJ5kcDoIB+YepmJoHnzJeowYt\n"
+            + "lvnmmyGqmVS/KCgvILaD0c73Dp2X0BN64hSZHa3nUU67WbKJzo2OXr+yr0hvofcf\n"
+            + "8vhKJe5+2wQAy+rRKSAOPaFiKT8ZenRucx1pTJLoB8JdediOdR4dtXB2Z59Ze7N3\n"
+            + "sedfrJn1ao+jJEpnKeudlDq7oa9THd7ZojN4gBF/lz0duzfertuQ/MrHaTPeK8YI\n"
+            + "dEPg3SgYVOLDBptaKmo0xr2f6aslGLPHgxCgzOcLuuUNGKJSigZvhdMEANh7VKsX\n"
+            + "nb5shZh+KRET84us/uu74q4iIfc8Q10oXuN9+IPlqfAIclo4uMhvo5rtI9ApFtxs\n"
+            + "oZzqqc+gt+OAbn/fHeb61eT36BA+r61Ka+erxkpWU5r1BPVIqq+biTY/HHchqroJ\n"
+            + "aw81qWudO9h5a0yP1alDiBSwhZWIMCKzp6Q7A/472amrSzgs7u8ToQ/2THDxaMf3\n"
+            + "Se0HgMrIT1/+5es2CWiEoZGSZTXlimDYXJULu/DFC7ia7kXOLrMsO85bEi7SHagA\n"
+            + "eO+mAw3xP3OuNkZDt9x4qtal28fNIz22DH5qg2wtsGdCWXz5C6OdcrtQ736kNxa2\n"
+            + "5QemZ/0VWxHPnvXz40RtiQEfBBgBAgAJBQJWJqtxAhsMAAoJEPrSq+I9bFLQzQ8H\n"
+            + "/1FuTj+k1brv64TWXC1ogbu4WIxsmq7yMroyQPwZ1rJ+WuhYRkDHRejD0cvxRpF9\n"
+            + "5E9NkysNGmOX58khdPmqeUHQU+bNJcAqvemILyaKAFxunmbqFaFzdJwCpY54y32P\n"
+            + "RNNYeHiEpLxD6Urf3aG3rlwj+SkWHGb0QRpeZqOmU0v/Ybc9WuV8VSAJ06fYNh1V\n"
+            + "KAmx8GGRyiLLXsbe+q1v5Z7q6WHOJp7hIiuRRKp1iZGOIXK+pnO2YwSgXoJA0JRv\n"
+            + "U0rROxIN4h0NpxiNTDKrRCPpNpetZxsLeRbQa1agVM0iJfir1s34HqlrD+zw/tcJ\n"
+            + "bOdMFF2UVZaCuFynNDx958I=\n"
+            + "=aoJv\n"
+            + "-----END PGP PRIVATE KEY BLOCK-----\n");
+  }
+
+  /**
+   * Key revoked by an expired key, after that key's expiration.
+   *
+   * <p>Revoked by {@link #expiredKey()}.
+   *
+   * <pre>
+   * pub   2048R/78BF7D7E 2005-08-01 [revoked: 2015-10-20]
+   *       Key fingerprint = 916F AB22 5BE7 7585 F59A  994C 001A DF8B 78BF 7D7E
+   * uid                  Testuser Eight &lt;test8@example.com&gt;
+   * </pre>
+   */
+  public static TestKey keyRevokedByExpiredKeyAfterExpiration() throws Exception {
+    return new TestKey(
+        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "mQENBELuRwABCAC56yhFKybBtuKT4nyb7RdLE98pZR54aGjcDcKH3VKVyBF8Z4Kx\n"
+            + "ptd7Sre0mLPCQiNWVOmCT+JG7GKVE6YeFmyXDUnhX9w4+HAeDEh23S4u9JvwWaF+\n"
+            + "wlJ6jLq/oe5gdT1F6Y2yqNpQ6CztOw52Ko9KSYz7/1zBMPcCkl/4k15ee4iebVdq\n"
+            + "c7qT5Qt49Poiozh0DI5prPQ624uckHkz2mXshjWQVuHWwrkIkCJZ2I/KQN2kBjKw\n"
+            + "/ALxumaWmiB9lQ0nIwLuGzHCh0Xg5RxuCrK8fJp47Aza3ikVuYlNzSxhJVav3OtK\n"
+            + "gftBihQXUlY3Uy/4QTCeH/BdVs5OALtXL3VhABEBAAGJAS0EIAECABcFAlYmr4kQ\n"
+            + "HQN0ZXN0OCBub3QgdXNlZAAKCRA87HgbF94azQJ5B/0TeQk7TSChNp+NqCKPTuw0\n"
+            + "wpflDyc+5ru/Gcs4r358cWzgiLUb3M0Q1+M8CF13BFQdrxT05vjheI9o5PCn3b//\n"
+            + "AHV8m+QFSnRi2J3QslbvuOqOnipz7vc7lyZ7q1sWNC33YN+ZcGZiMuu5HJi9iadf\n"
+            + "ZL7AdInpUb4Zb+XKphbMokDcN3yw7rqSMMcx+rKytUAqUnt9qvaSLrIH/zeazxlp\n"
+            + "YG4jaN53WPfLCcGG+Rw56mW+eCQD2rmzaNHCw8Qr+19sokXLB7OML+rd1wNwZT4q\n"
+            + "stWnL+nOj8ZkbFV0w3zClDYaARr7H+vTckwVStyDVRbnpRitSAtJwbRDzZBaS4Vx\n"
+            + "iQE3BB8BAgAhBQJC7lUQFwyAAR2e63ndOLBJk52crzzseBsX3hrNAgcAAAoJEAAa\n"
+            + "34t4v31+AS4H/0x3Y9E3q9DR5FCuYTXG4BHyrALo2WKoP0CfUWL98Fw9Txl0hF+9\n"
+            + "5wriNlnmd2zvM0quHs78x4/xehQO88cw0lqPx3RARq/ju5/VbOjoNlcHvfGYZiEd\n"
+            + "yWOwHu7O8sZrenFDjeDglD6NArrjncOcC51XIPSSTLvVQpSauQ1FS4tan5Q4aWMb\n"
+            + "s4DzE+Vqu2xMkO/X9toYAZKzyWP29OckpouMbt3GUnS6/o0A8Z7jVX+XOIk3XolP\n"
+            + "Li9tzTQB12Xl23mgFvearDoguR2Bu2SbmTJtdiXz8L3S54kGvxVqak5uOP2dagzU\n"
+            + "vBiqR4SVoAdGoXt6TI6mpA+qdYmPMG8v21S0IlRlc3R1c2VyIEVpZ2h0IDx0ZXN0\n"
+            + "OEBleGFtcGxlLmNvbT6JATgEEwECACIFAkLuRwACGwMGCwkIBwMCBhUIAgkKCwQW\n"
+            + "AgMBAh4BAheAAAoJEAAa34t4v31+8/sIAIuqd+dU8k9c5VQ12k7IfZGGYQHF2Mk/\n"
+            + "8FNuP7hFP/VOXBK3QIxIfGEOHbDX6uIxudYMaDmn2UJbdIqJd8NuQByh1gqXdX/x\n"
+            + "nteUa+4e7U6uTjkp/Ij5UzRed8suINA3NzVOy6qwCu3DTOXIZcjiOZtOA5GTqG6Z\n"
+            + "naDP0hwDssJp+LXIYTJgsvneJQFGSdQhhJSv19oV0JPSbb6Zc7gEIHtPcaJHjuZQ\n"
+            + "Ev+TRcRrI9HPTF0MvgOYgIDo2sbcSFV+8moKsHMC+j1Hmuuqgm/1yKGIZrt0V75s\n"
+            + "D9HYu0tiS3+Wlsry3y1hg/2XBQbwgh6sT/jWkpWar7+uzNxO5GdFYrC5AQ0EQu5H\n"
+            + "AAEIALPFTedbfyK+9B35Uo9cPsmFa3mT3qp/bAQtnOjiTTTiIO3tu0ALnaBjf6On\n"
+            + "fAV1HmGz6hRMRK4LGyHkNTaGDNNPoXO7+t9DWycSHmsCL5d5zp7VevQE8MPR8zHK\n"
+            + "Il2YQlCzdy5TWSUhunKd4guDNZ9GiOS6NQ9feYZ9DQ1kzC8nnu7jLkR2zNT02sYU\n"
+            + "kuOCZUktQhVNszUlavdIFjvToZo3RPcdb/E3kTTy2R9xi89AXjWZf3lSAZe3igkL\n"
+            + "jhwsd+u3RRx0ptOJym7zYl5ZdUZk4QrS7FPI6zEBpjawbS4/r6uEW89P3QAkanDI\n"
+            + "ridIAZP8awLZU3uSPtMwPIJpao0AEQEAAYkBHwQYAQIACQUCQu5HAAIbDAAKCRAA\n"
+            + "Gt+LeL99fqpHB/wOXhdMNtgeVW38bLk8YhcEB23FW6fDjFjBJb9m/yqRTh5CIeG2\n"
+            + "bm29ofT4PTamPb8Gt+YuDLnQQ3K2jURakxNDcYwiurvR/oHVdxsBRU7Px7UPeZk3\n"
+            + "BG5VnIJRT198dF7MWFJ+x5wHbNXwM8DDvUwTjXLH/TlGl1XIheSTHCYd9Pra4ejE\n"
+            + "ockkrDaZlPCQdTwY+P7K2ieb5tsqNpJkQeBrglF2bemY/CtQHnM9qwa6ZJqkyYNR\n"
+            + "F1nkSYn36BPuNpytYw1CaQV9GbePugPHtshECLwA160QzqISQUcJlKXttUqUGnoO\n"
+            + "0d0PyzZT3676mQwmFoebMR9vACAeHjvDxD4F\n"
+            + "=ihWb\n"
+            + "-----END PGP PUBLIC KEY BLOCK-----\n",
+        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "lQOYBELuRwABCAC56yhFKybBtuKT4nyb7RdLE98pZR54aGjcDcKH3VKVyBF8Z4Kx\n"
+            + "ptd7Sre0mLPCQiNWVOmCT+JG7GKVE6YeFmyXDUnhX9w4+HAeDEh23S4u9JvwWaF+\n"
+            + "wlJ6jLq/oe5gdT1F6Y2yqNpQ6CztOw52Ko9KSYz7/1zBMPcCkl/4k15ee4iebVdq\n"
+            + "c7qT5Qt49Poiozh0DI5prPQ624uckHkz2mXshjWQVuHWwrkIkCJZ2I/KQN2kBjKw\n"
+            + "/ALxumaWmiB9lQ0nIwLuGzHCh0Xg5RxuCrK8fJp47Aza3ikVuYlNzSxhJVav3OtK\n"
+            + "gftBihQXUlY3Uy/4QTCeH/BdVs5OALtXL3VhABEBAAEAB/wLr88oGuxsoqIHRQZL\n"
+            + "eGm9jc4aQGmcDMcjpwdGilhrwyfrO6f84hWbQdD+rJcnI8hsH7oOd5ZMGkWfpJyt\n"
+            + "eUAh9iNB5ChYGfDVSLUg6KojqDtprj6vNMihvLkr/OI6xL/hZksikwfnLFMPpgXU\n"
+            + "knwPocQ3nn+egsUSL7CR8/SLiIm4MC0brer6jhDxB5LKweExNlfTe4c0MDeYTsWt\n"
+            + "0WGzNPlvRZQXRotJzqemt3wdNZXUnCKR0n7pSQ8EhZr2O6NXr+mUgp6PIOE/3un2\n"
+            + "YGiBEf5uy3qEFe7FjEGIHz+Z3ySRdUDfHOk82TKAzynoJIxRUvLIYVNw4eFB3l5U\n"
+            + "s1w5BADUzfciG7RVLa8UFKJfqQ/5M06QmdS1v1/hMQXg38+3vKe8RgfSSnMJ08Sc\n"
+            + "eAEsmugwpNXAxgRKHcmWzN3NMBHhE3KiyiogWaMGqmSo6swFpu0+dwMvZSxMlfD+\n"
+            + "ka/BWt8YsUdrqW06ow39aTgCV+icbNRV81C7NKe7u0X1JDx2CQQA36gbdo62h/Wd\n"
+            + "gJI8kdz/se3xrt8x6RoWvOnWPNmsZR5XkDqAMTL1dWiEEA/dQTphMcgAe9z3WaP+\n"
+            + "F1TPAfounbiurGCcS3kxJ5tY7ojyU7nYz4DA/V2OU0C/LUoLXhttG5HM+m/i3qn4\n"
+            + "K9bBoWIQY1ijliS7cTSwNqd6IHaQGpkEAMnp5GwSGhY+kUuLw06hmH4xnsuf6agz\n"
+            + "AfhbPylB2nf/ZaX6dt6/mFEAkvQNahcoWEskfS3LGCD8jHm8PvF8K0mciXPDweq2\n"
+            + "gW3/irE0RXNwn3Oa222VSvcgUlocBm9InkfvpFXh20OYFe3dFH7uYkwUqIHJeXjw\n"
+            + "TjpXUX/vC5QJQOyJATcEHwECACEFAkLuVRAXDIABHZ7red04sEmTnZyvPOx4Gxfe\n"
+            + "Gs0CBwAACgkQABrfi3i/fX4BLgf/THdj0Ter0NHkUK5hNcbgEfKsAujZYqg/QJ9R\n"
+            + "Yv3wXD1PGXSEX73nCuI2WeZ3bO8zSq4ezvzHj/F6FA7zxzDSWo/HdEBGr+O7n9Vs\n"
+            + "6Og2Vwe98ZhmIR3JY7Ae7s7yxmt6cUON4OCUPo0CuuOdw5wLnVcg9JJMu9VClJq5\n"
+            + "DUVLi1qflDhpYxuzgPMT5Wq7bEyQ79f22hgBkrPJY/b05ySmi4xu3cZSdLr+jQDx\n"
+            + "nuNVf5c4iTdeiU8uL23NNAHXZeXbeaAW95qsOiC5HYG7ZJuZMm12JfPwvdLniQa/\n"
+            + "FWpqTm44/Z1qDNS8GKpHhJWgB0ahe3pMjqakD6p1iY8wby/bVLQiVGVzdHVzZXIg\n"
+            + "RWlnaHQgPHRlc3Q4QGV4YW1wbGUuY29tPokBOAQTAQIAIgUCQu5HAAIbAwYLCQgH\n"
+            + "AwIGFQgCCQoLBBYCAwECHgECF4AACgkQABrfi3i/fX7z+wgAi6p351TyT1zlVDXa\n"
+            + "Tsh9kYZhAcXYyT/wU24/uEU/9U5cErdAjEh8YQ4dsNfq4jG51gxoOafZQlt0iol3\n"
+            + "w25AHKHWCpd1f/Ge15Rr7h7tTq5OOSn8iPlTNF53yy4g0Dc3NU7LqrAK7cNM5chl\n"
+            + "yOI5m04DkZOobpmdoM/SHAOywmn4tchhMmCy+d4lAUZJ1CGElK/X2hXQk9Jtvplz\n"
+            + "uAQge09xokeO5lAS/5NFxGsj0c9MXQy+A5iAgOjaxtxIVX7yagqwcwL6PUea66qC\n"
+            + "b/XIoYhmu3RXvmwP0di7S2JLf5aWyvLfLWGD/ZcFBvCCHqxP+NaSlZqvv67M3E7k\n"
+            + "Z0VisJ0DmARC7kcAAQgAs8VN51t/Ir70HflSj1w+yYVreZPeqn9sBC2c6OJNNOIg\n"
+            + "7e27QAudoGN/o6d8BXUeYbPqFExErgsbIeQ1NoYM00+hc7v630NbJxIeawIvl3nO\n"
+            + "ntV69ATww9HzMcoiXZhCULN3LlNZJSG6cp3iC4M1n0aI5Lo1D195hn0NDWTMLyee\n"
+            + "7uMuRHbM1PTaxhSS44JlSS1CFU2zNSVq90gWO9OhmjdE9x1v8TeRNPLZH3GLz0Be\n"
+            + "NZl/eVIBl7eKCQuOHCx367dFHHSm04nKbvNiXll1RmThCtLsU8jrMQGmNrBtLj+v\n"
+            + "q4Rbz0/dACRqcMiuJ0gBk/xrAtlTe5I+0zA8gmlqjQARAQABAAf+JNVkZOcGYaQm\n"
+            + "eI3BMMaBxuCjaMG3ec+p3iFKaR0VHKTIgneXSkQXA+nfGTUT4DpjAznN2GLYH6D+\n"
+            + "6i7MCGPm9NT4C7KUcHJoltTLjrlf7vVyNHEhRCZO/pBh9+2mpO6xh799x+wj88u5\n"
+            + "XAqlah50OjJFkjfk70VsrPWqWvgwLejkaQpGbE+pdL+vjy+ol5FHzidzmJvsXDR1\n"
+            + "I1as0vBu5g2XPpexyVanmHJglZdZX07OPYQBhxQKuPXT/2/IRnXsXEpitk4IyJT0\n"
+            + "U5D/iedEUldhBByep1lBcJnAap0CP7iuu2CYhRp6V2wVvdweNPng5Eo7f7LNyjnX\n"
+            + "UMAeaeCjAQQA1A0iKtg3Grxc9+lpFl1znc2/kO3p6ixM13uUvci+yGFNJJninnxo\n"
+            + "99KXEzqqVD0zerjiyyegQmzpITE/+hFIOJZInxEH08WQwZstV/KYeRSJkXf0Um48\n"
+            + "E+Zrh8fpJVW1w3ZCw9Ee2yE6fEhAA4w66+50pM+vBXanWOrG1HDrkxEEANkHc2Rz\n"
+            + "YJsO4v63xo/7/njLSQ31miOglb99ACKBA0Yl/jvj2KqLcomKILqvK3DKP+BHNq86\n"
+            + "LUBUglyKjKuj0wkSWT0tCnfgLzysUpowcoyFhJ36KzAz8hjqIn3TQpMF21HvkZdG\n"
+            + "Mtkcyhu5UDvbfOuWOBaKIeNQWCWv1rNzMme9A/9zU1+esEhKwGWEqa3/B/Te/xQh\n"
+            + "alk180n74sTZid6lXD8o8cEei0CUq7zBSV0P8v6kk8PP9/XyLRl3Rqa95fESUWrL\n"
+            + "xD6TBY1JlHBZS+N6rN/7Ilf5EXSELmnbDFsVxkNGp4elKxajvZxC6uEWYBu62AYy\n"
+            + "wS0dj8mZR3faCEps90YXiQEfBBgBAgAJBQJC7kcAAhsMAAoJEAAa34t4v31+qkcH\n"
+            + "/A5eF0w22B5VbfxsuTxiFwQHbcVbp8OMWMElv2b/KpFOHkIh4bZubb2h9Pg9NqY9\n"
+            + "vwa35i4MudBDcraNRFqTE0NxjCK6u9H+gdV3GwFFTs/HtQ95mTcEblWcglFPX3x0\n"
+            + "XsxYUn7HnAds1fAzwMO9TBONcsf9OUaXVciF5JMcJh30+trh6MShySSsNpmU8JB1\n"
+            + "PBj4/sraJ5vm2yo2kmRB4GuCUXZt6Zj8K1Aecz2rBrpkmqTJg1EXWeRJiffoE+42\n"
+            + "nK1jDUJpBX0Zt4+6A8e2yEQIvADXrRDOohJBRwmUpe21SpQaeg7R3Q/LNlPfrvqZ\n"
+            + "DCYWh5sxH28AIB4eO8PEPgU=\n"
+            + "=cSfw\n"
+            + "-----END PGP PRIVATE KEY BLOCK-----\n");
+  }
+
+  /**
+   * Key revoked by an expired key, before that key's expiration.
+   *
+   * <p>Revoked by {@link #expiredKey()}.
+   *
+   * <pre>
+   * pub   2048R/C43BF2E1 2005-08-01 [revoked: 2005-08-01]
+   *       Key fingerprint = 916D 6AD6 36A5 CBA6 B5A6  7274 6040 8661 C43B F2E1
+   * uid                  Testuser Nine &lt;test9@example.com&gt;
+   * </pre>
+   */
+  public static TestKey keyRevokedByExpiredKeyBeforeExpiration() throws Exception {
+    return new TestKey(
+        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "mQENBELuRwABCADnf2z5dqp3BMFlpd6iUs5dhROrslfzswak1LmbGirK2IPIl4NX\n"
+            + "arAi76xXK9BcF/Cqcj/X/WqFKBd/qMGxwdvwbSN6PVBP6T1jvuVgrPTjd4x5xPUD\n"
+            + "xZ5VPy9hgQXs+1mugTkHYVTU8GI1eGpZ8Oj3PJIgVyqGxGkjWmcz5APbVIRan6L1\n"
+            + "482bZTidH9Nd9YnYlXNgiJcaOPAVBwO/j/myocQCIohvIo4IT8vc/ODhRgfwA0gD\n"
+            + "GVK+tXwT4f4x3qjG/YRpOOZZjBS09B/gJ9QfEnR6WNxg/Tm3T0uipoISOhR+cP/V\n"
+            + "e5o/73SM+w+WlILk/xpbbOfyCxD4Q3lb8EZFABEBAAGJAS0EIAECABcFAkLuYyAQ\n"
+            + "HQN0ZXN0OSBub3QgdXNlZAAKCRA87HgbF94azV2BB/9Rc1j3XOxKbDyUFAORAGnE\n"
+            + "ezQtpOmQhaSUhFC35GFOdTg4eX53FTFSXLJQleTVzvE+eVkQI5tvUZ+SqHoyjnhU\n"
+            + "DpWlmfRUQy4GTUjUTkpFOK07TVTjhUQwaAxN13UZgByopVKc7hLf+uh1xkRJIqAJ\n"
+            + "Tx6LIFZiSIGwStDO6TJlhl1e8h45J3rAV4N+DsGpMy9S4uYOU7erJDupdXK739/l\n"
+            + "VBsP2SeT85iuAv+4A9Jq3+iq+cjK9q3QZCw1O6iI2v3seAWCI6HH3tVw4THr+M6T\n"
+            + "EdTGmyESjdAl+f7/uK0QNfqIMpvUf+AvMakrLi7WOeDs8mpUIjonpeQVLfz6I0Zo\n"
+            + "iQE3BB8BAgAhBQJC7lUQFwyAAR2e63ndOLBJk52crzzseBsX3hrNAgcAAAoJEGBA\n"
+            + "hmHEO/LhHjUH/R/7+iNBLAfKYbpprkWy/8eXVEJhxfh6DI/ppsKLIA+687gX74R9\n"
+            + "6CM5k6fZDjeND26ZEA0rDZmYrbnGUfsu55aeM0/+jiSOZJ2uTlrLXiHMurbNY0pT\n"
+            + "xv215muhumPBzuL1jsAK2Kc/4oE7Z46jaStsPCvDOcx9PW76wR8/uCPvHVz5H/A7\n"
+            + "3erXAloC43jupXwZB32VZq8L0kZNVfuEsjHUcu3GUoZdGfTb4/Qq5a1FK+CGhwWC\n"
+            + "OwpUWZEIUImwUv4FNE4iNFYEHaHLU9fotmIxIkH8TC4NcO+GvkEyMyJ6NVkBBDP2\n"
+            + "EarncWAJxDBlx1CO4ET+/ULvzDnAcYuTc6G0IVRlc3R1c2VyIE5pbmUgPHRlc3Q5\n"
+            + "QGV4YW1wbGUuY29tPokBOAQTAQIAIgUCQu5HAAIbAwYLCQgHAwIGFQgCCQoLBBYC\n"
+            + "AwECHgECF4AACgkQYECGYcQ78uG78ggA1TjeOZtaXjXNG8Bx2sl4W+ypylWWB6yc\n"
+            + "IeR0suLhVlisZ33yOtV4MsvZw0TJNyYmFXiskPTyOcP8RJjS+a41IHc33i13MUnN\n"
+            + "RI5cqhqsWRhf9chlm7XqXtqv57IjojG9vgSUeZdXSTMdHIDDHAjJ/ryBXflzprSw\n"
+            + "2Sab8OXjLkyo9z6ZytFyfXSc8TNiWU6Duollh/bWIsgPETIe2wGn8LcFiVMfPpsI\n"
+            + "RhkphOdTJb+W/zQwLHUcS22A4xsJtBxIXTH/QSG3lAaw8IRbl25EIpaEAF+gExCr\n"
+            + "QM0haAVMmGgYYWpMHXrDhB7ff3kAiqD2qmhSySA6NLmTO+6qGPYJg7kBDQRC7kcA\n"
+            + "AQgA2wqE3DypQhTcYl26dXc9DZzABRQa6KFRqQbhmUBz95cQpAamQjrwOyl2fg84\n"
+            + "b9o9t+DuZcdLzLF/gPVSznOcNUV9mJNdLAxBPPOMUrP/+Snb83FkNpCscrXhIqSf\n"
+            + "BU5D+FOb3bEI2WTJ7lLe8oCrWPE3JIDVCrpAWgZk9puAk1Z7ZFaHsS6ezsZP0YIM\n"
+            + "qTWdoX0zHMPMnr9GG08c0mniXtvfcgtOCeIRU4WZws28sGYCoLeQXsHVDal+gcLp\n"
+            + "1enPh6dfEWBJuhhBBajzm53fzV2a7khEdffggVVylHPLpvms2nIqoearDQtVNpSK\n"
+            + "uhNiykJSMIUn/Y6g5LMySmL+MwARAQABiQEfBBgBAgAJBQJC7kcAAhsMAAoJEGBA\n"
+            + "hmHEO/LhdwcH/0wAxT1NGaR2boMjpTouVUcnEcEzHc0dSwuu+06mLRggSdAfBC8C\n"
+            + "9fdlAYHQ5tp1sRuPwLfQZjo8wLxJ+wLASnIPLaGrtpEHkIKvDwHqwkOXvXeGD/Bh\n"
+            + "40NbJUa7Ec3Jpo+FPFlM8hDsUyHf8IhUAdRd4d+znOVEaZ6S7c1RrtoVTUqzi59n\n"
+            + "nC6ZewL/Jp+znKZlMTM3X1onAGhd+/XdrS52LM8pE3xRjbTLTYWcjnjyLbm0yoO8\n"
+            + "G3yCfIibAaII4a/jGON2X9ZUwaFNIqJ4iIc8Nme86rD/flXsu6Zv+NXVQWylrIG/\n"
+            + "REW68wsnWjwTtrPG8bqo6cCsOzqGYVt81eU=\n"
+            + "=FnZg\n"
+            + "-----END PGP PUBLIC KEY BLOCK-----\n",
+        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "lQOYBELuRwABCADnf2z5dqp3BMFlpd6iUs5dhROrslfzswak1LmbGirK2IPIl4NX\n"
+            + "arAi76xXK9BcF/Cqcj/X/WqFKBd/qMGxwdvwbSN6PVBP6T1jvuVgrPTjd4x5xPUD\n"
+            + "xZ5VPy9hgQXs+1mugTkHYVTU8GI1eGpZ8Oj3PJIgVyqGxGkjWmcz5APbVIRan6L1\n"
+            + "482bZTidH9Nd9YnYlXNgiJcaOPAVBwO/j/myocQCIohvIo4IT8vc/ODhRgfwA0gD\n"
+            + "GVK+tXwT4f4x3qjG/YRpOOZZjBS09B/gJ9QfEnR6WNxg/Tm3T0uipoISOhR+cP/V\n"
+            + "e5o/73SM+w+WlILk/xpbbOfyCxD4Q3lb8EZFABEBAAEAB/9GTcWLkUU9tf0B4LjX\n"
+            + "NSyk7ChIKXZadVEcN9pSR0Udq1mCTrk9kBID2iPNqWmyvjaBnQbUkoqJ+93/EAIa\n"
+            + "+NPRlWOD2SEN07ioFS5WCNCqUAEibfU2+woVu4WpJ+TjzoWy4F2wZxe7P3Gj6Xjq\n"
+            + "7aXih8uc9Lveh8GiUe8rrCCbt+BH1RzuV/khZw+2ZDPMCx7yfcfKobc3NWx75WLh\n"
+            + "pki512fawSC6eJHRI50ilPrqAmmhcccfwPji9P+oPj2S6wlhe5kp3R5yU85fWy3b\n"
+            + "C8AtLTfZIn4v6NAtBaurGEjRjzeNEGMJHxnRPWvFc4iD+xvPg6SNPJM/bbTE+yZ3\n"
+            + "16W1BADxjAQLMuGpemaVmOpZ3K02hcNjwniEK2QPp11BnfoQCIwegON+sUD/6AuZ\n"
+            + "S1vOVvS3//eGbPaMM45FK/SQAVHpC9IOL4Tql0C8B6csRhFL824yPfc3WDb4kayQ\n"
+            + "T5oLjlJ0W2r7tWcBcREEzZT6gNi4KI7C4oFF6tU9lsQJuQyAbwQA9Vl6VW/7oG0W\n"
+            + "CC+lcHJc+4rxUB3yak7d4mEccTNb+crOBRH/7dKZOe7A6Fz+ra++MmucDUzsAx0K\n"
+            + "MGT9Xoi5+CBBaNr+Y2lB9fF20N7eRNzQ3Xrz2OPl4cmU4gfECTZ1vZaKlmB+Vt8C\n"
+            + "E/nn49QGRI+BNBOdW+2aEpPoENczFosEAJXi5Cn2l0jOswDD7FU2PER1wfVY629i\n"
+            + "bICunudOSo64GKQslKkQWktc57DgdOQnH15qW1nVO7Z4H0GBxjSTRCu7Z7q08/qM\n"
+            + "ueWIvJ85HcFhOCl+vITOn0fZV0p8/IwsWz8G9h5bb2QgMAwDSdhnLuK/cXaGM09w\n"
+            + "n6k8O2rCvDtXRjqJATcEHwECACEFAkLuVRAXDIABHZ7red04sEmTnZyvPOx4Gxfe\n"
+            + "Gs0CBwAACgkQYECGYcQ78uEeNQf9H/v6I0EsB8phummuRbL/x5dUQmHF+HoMj+mm\n"
+            + "wosgD7rzuBfvhH3oIzmTp9kON40PbpkQDSsNmZitucZR+y7nlp4zT/6OJI5kna5O\n"
+            + "WsteIcy6ts1jSlPG/bXma6G6Y8HO4vWOwArYpz/igTtnjqNpK2w8K8M5zH09bvrB\n"
+            + "Hz+4I+8dXPkf8Dvd6tcCWgLjeO6lfBkHfZVmrwvSRk1V+4SyMdRy7cZShl0Z9Nvj\n"
+            + "9CrlrUUr4IaHBYI7ClRZkQhQibBS/gU0TiI0VgQdoctT1+i2YjEiQfxMLg1w74a+\n"
+            + "QTIzIno1WQEEM/YRqudxYAnEMGXHUI7gRP79Qu/MOcBxi5NzobQhVGVzdHVzZXIg\n"
+            + "TmluZSA8dGVzdDlAZXhhbXBsZS5jb20+iQE4BBMBAgAiBQJC7kcAAhsDBgsJCAcD\n"
+            + "AgYVCAIJCgsEFgIDAQIeAQIXgAAKCRBgQIZhxDvy4bvyCADVON45m1peNc0bwHHa\n"
+            + "yXhb7KnKVZYHrJwh5HSy4uFWWKxnffI61Xgyy9nDRMk3JiYVeKyQ9PI5w/xEmNL5\n"
+            + "rjUgdzfeLXcxSc1EjlyqGqxZGF/1yGWbtepe2q/nsiOiMb2+BJR5l1dJMx0cgMMc\n"
+            + "CMn+vIFd+XOmtLDZJpvw5eMuTKj3PpnK0XJ9dJzxM2JZToO6iWWH9tYiyA8RMh7b\n"
+            + "AafwtwWJUx8+mwhGGSmE51Mlv5b/NDAsdRxLbYDjGwm0HEhdMf9BIbeUBrDwhFuX\n"
+            + "bkQiloQAX6ATEKtAzSFoBUyYaBhhakwdesOEHt9/eQCKoPaqaFLJIDo0uZM77qoY\n"
+            + "9gmDnQOYBELuRwABCADbCoTcPKlCFNxiXbp1dz0NnMAFFBrooVGpBuGZQHP3lxCk\n"
+            + "BqZCOvA7KXZ+Dzhv2j234O5lx0vMsX+A9VLOc5w1RX2Yk10sDEE884xSs//5Kdvz\n"
+            + "cWQ2kKxyteEipJ8FTkP4U5vdsQjZZMnuUt7ygKtY8TckgNUKukBaBmT2m4CTVntk\n"
+            + "VoexLp7Oxk/RggypNZ2hfTMcw8yev0YbTxzSaeJe299yC04J4hFThZnCzbywZgKg\n"
+            + "t5BewdUNqX6BwunV6c+Hp18RYEm6GEEFqPObnd/NXZruSER19+CBVXKUc8um+aza\n"
+            + "ciqh5qsNC1U2lIq6E2LKQlIwhSf9jqDkszJKYv4zABEBAAEAB/0c76POOw6aazUT\n"
+            + "TZHUnhQ+WHHJefbKuoeWI7w+dD7y+02NzaRoZW7XnJ+fAZW8Dlb5k/O1FayUIEgE\n"
+            + "GjnT336dpE4g5NQkfdifG7Fy5NKGRkWx6viJI3g/OHsYX3+ebNDFMmO0gq7067/9\n"
+            + "WuHsTpvUMRwkF1zi1j4AETjZ7IBXdjuSCSu8OhEwr3d+WXibEmY5ec/d24l/APJx\n"
+            + "c3RMHw9PiDQeAKrByS6N10/yFgRpnouVx3wC7zFmhVewNV476Nyg34OvRoc+lCtk\n"
+            + "ixKdua6KuUJzGRWxgw+q2JD4goXxe0v2qU2KSU63gOYi0kg9tpwpn98lDNQykgmJ\n"
+            + "aQYdNIZJBADdlbkg9qbH1DREs7UF4jXN/SoYRbTh9639GfA4zkbfPmh/RmVIIEKd\n"
+            + "QN7qWK/Xy1bUS9vDzRfFgmoYGtqMmygOOFsVtfm8Y18lSXopN/3vhtai+dn+04Ef\n"
+            + "dl1irmGvm3p7y9Jh3s6uYTEJok0MywA7qBHvgSTVtc1PcZc6j6Bz1QQA/Q+nqyZY\n"
+            + "fLimt4KVYO1y6kSHgEqzggLTxyfGMW5RplTA0V1zCwjM6S+QWNqRxVNdB9Kkzn+S\n"
+            + "YDKHLYs8lXO2zvf8Yk9M7glgqvT4rJ51Zn2rc6lg1YUwFBXup5idTsuZwtqkvvKJ\n"
+            + "eS7L3cSBCqJMRjk47Y3V8zkrrN/HcYmyFecD/A+HPf4eSweUS025Bb+eCk4gTHbR\n"
+            + "uwmnKq7npk2XY4m0A/QdYF9dEWlpadsAr+ZwNQB3f21nQgKG0BudfL4FmpeW9RMt\n"
+            + "35aSIaV7RkxYOt5HEvjFRvLbeL1YYaj+D0dvz8SP1AUPvpWIVlQ03OjRlPyrPW50\n"
+            + "LoqyP8PTb6svnHvmQseJAR8EGAECAAkFAkLuRwACGwwACgkQYECGYcQ78uF3Bwf/\n"
+            + "TADFPU0ZpHZugyOlOi5VRycRwTMdzR1LC677TqYtGCBJ0B8ELwL192UBgdDm2nWx\n"
+            + "G4/At9BmOjzAvEn7AsBKcg8toau2kQeQgq8PAerCQ5e9d4YP8GHjQ1slRrsRzcmm\n"
+            + "j4U8WUzyEOxTId/wiFQB1F3h37Oc5URpnpLtzVGu2hVNSrOLn2ecLpl7Av8mn7Oc\n"
+            + "pmUxMzdfWicAaF379d2tLnYszykTfFGNtMtNhZyOePItubTKg7wbfIJ8iJsBogjh\n"
+            + "r+MY43Zf1lTBoU0ioniIhzw2Z7zqsP9+Vey7pm/41dVBbKWsgb9ERbrzCydaPBO2\n"
+            + "s8bxuqjpwKw7OoZhW3zV5Q==\n"
+            + "=JxsF\n"
+            + "-----END PGP PRIVATE KEY BLOCK-----\n");
+  }
+}
diff --git a/java/com/google/gerrit/gpg/testing/TestTrustKeys.java b/java/com/google/gerrit/gpg/testing/TestTrustKeys.java
new file mode 100644
index 0000000..0f83f71
--- /dev/null
+++ b/java/com/google/gerrit/gpg/testing/TestTrustKeys.java
@@ -0,0 +1,1039 @@
+// Copyright (C) 2015 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.google.gerrit.gpg.testing;
+
+/**
+ * Test keys specific to web-of-trust checks.
+ *
+ * <p>In the following diagrams, the notation <code>M---N</code> indicates N trusts M, and an 'x'
+ * indicates the key is expired.
+ *
+ * <p>
+ *
+ * <pre>
+ *  A---Bx
+ *   \
+ *    \---C---D
+ *         \
+ *          \---Ex
+ *
+ *  D and E trust C to be a valid introducer of depth 2.
+ *
+ * F---G---F, in a cycle.
+ *
+ * H---I---J, but J is only trusted to length 1.
+ * </pre>
+ */
+public class TestTrustKeys {
+  /**
+   * pub 2048R/9FD0D396 2010-08-29 Key fingerprint = E401 17FC 4BF4 17BD 8F93 DEB1 D25A D07A 9FD0
+   * D396 uid Testuser A &lt;testa@example.com&gt; sub 2048R/F5C099DB 2010-08-29
+   */
+  public static TestKey keyA() throws Exception {
+    return new TestKey(
+        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "mQENBEx6npoBCACp0vHePNPeLzm0HM35i70bRChyZXu/ARxOHZHNbh6hWJkq5saI\n"
+            + "zuzZoaqXAr3xZwHftTULlkgoJIt40x6VCT8EBnUHTkOqoHTsFnXg2kNuhFvmn0OX\n"
+            + "7RQFlR1SGoQG4fEy6t/GlOwEknpNSIMLkbDMP2FzEkLVWtlIe2hqqawVIgqzyO3k\n"
+            + "HaQxW8gWyyTx0qeSdSi4DyFZIzdyu/aZa7sj/MhO3DB3UwubW6yE+PMcAVrJD+0d\n"
+            + "EToMT7i8Erncc+xEzuXAoQUHaQfOXV4DG5qSgVpKaLxJ/ABWUri0eMPhj0cT4iDx\n"
+            + "eNTL7cZ4h72B1uJs8byDN74PHrypNiVE+IRHABEBAAG0HlRlc3R1c2VyIEEgPHRl\n"
+            + "c3RhQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTHqemgIbAwYLCQgHAwIGFQgCCQoL\n"
+            + "BBYCAwECHgECF4AACgkQ0lrQep/Q05ZxMAf+OoRzXWbGfv7kZb7xdrVyAUTAV4bU\n"
+            + "UvLoJZUIQ1ckPBcty2LUvY7l9efgp3c57nvTD6U98dVnsKfaW4PT0CRXlpl1IFyh\n"
+            + "kgbInFS5rO+cJMQn1KyC+FfiwyGNii630SwiHyWRG5+XQ6Iptx9JELwWUMCLJxFp\n"
+            + "B8DZQKlNnvdl+YUgEeQOkWTXfTSaBATdXHiZhskiumnTOGO24jSg8CrZc5O/n6fC\n"
+            + "CgEsAFWL7fnO0ii6EW1JH5btLHPxL9QI+5DJIypgOhGI1lqZW9KrpfmJ3w6N1Gek\n"
+            + "GBda98DmzxxxZ9iyq1cELAAiQMjkvws67cOs/hwXNn9YaK74dzhb49MLGIkBIAQQ\n"
+            + "AQIACgUCTHqf0QMFAXgACgkQV2Bph7AH1JCO/Qf+PBJqeWS7p32+K5r1cA7AeCB2\n"
+            + "pcHs78wLjnSxuimf0l+JItb9JQAKjzcdZTKVGkUivkq3zhsPCCtssgSav2wlG59F\n"
+            + "TaqtpGOxvGjc8TKWHW1TrPhV86wh0yUempKTMWfdZ0RAJVG3krAj60bzUsQNK41/\n"
+            + "0EZi4JI+sm/TRlwQcmEzdaGxhFSJqiJyaBWbPL8AQNA2iRyjMKNeGCrgapEl2IkW\n"
+            + "2ST+/yUPI/485LS0uU1+TLB+NhiJ6j5PoiVqYD+ul8WJ+cy1vvcp1GCQpbRv1yXY\n"
+            + "4GB1mw0JPIinVE1q+eKKQxN38zARPqyupiIuBQaqX9NCHCAdNtFc3kJQ7Nm83YkB\n"
+            + "IAQQAQIACgUCTHqkCwMFAXgACgkQZB8Rk9JP5GfGVQgArMBVQo3AD56p4g5A+DRA\n"
+            + "h0KdQMt4hs/dl+2GLAi+nK0wwuHrHvr9kcZNiQNMtu+YiwvxMpJ/JvXRwOp4wbEx\n"
+            + "6P6Uzp18R2sqbV4agnL5tXFZXfsa3OR2NLm56Ox1ReHnZtAcC6qa1nHqt9z2sTt1\n"
+            + "vh7IfK8GDU/3M3z4XBXPpmpZPAczqujuO/yshz84O6oc3noXfRUJRklbkhNC3WyS\n"
+            + "u5+3nupq4GwIYehQQpxBTD9xXj4hl3KfUnctg/MkgUGweEK3oZ22kObTLJttTP9t\n"
+            + "9q/hLkVyDtFhGorcsYbNZyupm3xhddzYovkReePwOO4WA7VeRqRdiYDU1UjIKvv4\n"
+            + "TrkBDQRMep6aAQgA3NQtBhS8yiEGN8rT4hGtuuprVd5jQVprLz4ImcI2+Gt71+CR\n"
+            + "gv/BZ0zzFp3VPjTGRusungJYkKKOGpEpERiqEG1X/ZyL7EzoyT+iKIMDsVJgmyDN\n"
+            + "cryHTejlKA8Z6GQ1hPlOIws22oLq5zQXxD9pzMDuabHl/s/bYlU5qXc7LhxdtrmT\n"
+            + "b2uBP9a+eneWKrz8OfgtS5m9DgqJ6Bjl0TvbeVJgKHX42pqzJlBTCn3hJjJosy8x\n"
+            + "4qTbqMraENnl9y+qynM7atoHX6TPWsD7vWtWvi+FA5OWGEe3rof8o/sJSj05DQUn\n"
+            + "i8mmSiCYW/tUklPPXOvPRP0GZ/GhBzIUtE3jBwARAQABiQEfBBgBAgAJBQJMep6a\n"
+            + "AhsMAAoJENJa0Hqf0NOW/gkH/jm9FL+S53NjrthdbNjffryhp7KhTmYAsRk3Hc3X\n"
+            + "4TBj3upecarJynpvsz5HlLi/OxDRR6L2yfjKk6/2iKAbV56mdnnu5xG3TG8++naL\n"
+            + "7n/s9TGBhgknb6+vGhSMZ/1dpQ6wkiyuEmgKJo8DzHAh3k3VATHiBeSD7fNSsgtK\n"
+            + "gzK0hi53IFRFDDPYiCca+SS6/pA2zF56JWGETiIa8rSHIQaK4hNJ38vgKOZM80vQ\n"
+            + "fp+CxvJkYY71Yc94oQByaQzrXod7xnukp5SXe/N3BYTFCWoaSTRUI/THRywWwKqa\n"
+            + "rUsttYrqs/EQSy0X3kZ7CAm04uzA8csNyxapEVRvJxbrt5I=\n"
+            + "=DAMW\n"
+            + "-----END PGP PUBLIC KEY BLOCK-----\n",
+        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "lQOYBEx6npoBCACp0vHePNPeLzm0HM35i70bRChyZXu/ARxOHZHNbh6hWJkq5saI\n"
+            + "zuzZoaqXAr3xZwHftTULlkgoJIt40x6VCT8EBnUHTkOqoHTsFnXg2kNuhFvmn0OX\n"
+            + "7RQFlR1SGoQG4fEy6t/GlOwEknpNSIMLkbDMP2FzEkLVWtlIe2hqqawVIgqzyO3k\n"
+            + "HaQxW8gWyyTx0qeSdSi4DyFZIzdyu/aZa7sj/MhO3DB3UwubW6yE+PMcAVrJD+0d\n"
+            + "EToMT7i8Erncc+xEzuXAoQUHaQfOXV4DG5qSgVpKaLxJ/ABWUri0eMPhj0cT4iDx\n"
+            + "eNTL7cZ4h72B1uJs8byDN74PHrypNiVE+IRHABEBAAEAB/9BbaG9Bz9zd0tqjrx2\n"
+            + "u/VQR3qz1FCQXtuqZu8RMC+B5zIf2si71clf8c7ZHnfSxWZt65Ez1SMYwDeyBdje\n"
+            + "/7B1Gw3Ekk00tFxHx0GEL2NSdZE4sbynkHIp0nD4/HlIc41rmh08E405F7wiAWFn\n"
+            + "uCpfDr47SNpR/A4BxHYOvi8r9pBxn/fXiHluqYROit0Z4tfKDCvQ47k+wqVD5nOt\n"
+            + "BEbHDfEwUMibgTuJ1qPyHf6HDlSdTQSfYV8QW1/UbHWus9QikfjGfLJpX0Rv3UG+\n"
+            + "WXHmowpRDVixj74UQCYXQ/AZi/OBlcS8PRY6EZV4RLyEWlZrdzKViNLOTUbJNHvA\n"
+            + "ZAQVBADQND7CIO6z4k8e9Z8Lf4iLWP9iIbH9R7ArTZr2mX1vkwp+sk0BNQurL/BQ\n"
+            + "jUHOJZnouwkc+C3pQi/JvGvAe1fLHPA0+NKe/tcuDXMk+L1HH6XmDgKtByac41AR\n"
+            + "txxqhaECNeK9OKXAXaEvenkGFMcqQV3QMiF2q5VlmFxSSXydEwQA0M8tCowz0iZF\n"
+            + "i3fGuuZDTN3Ut4u6Uf9FiLcR4ye2Aa5ppO8vlNjObNqpHz0UqdDjB+e3O/n7BUx3\n"
+            + "A5PRZNQvcMbhgr2U3zjWvFMHS3YuxbuIaZ1Vj69vpOAGkUc98v4i0/3Lk7Lijpto\n"
+            + "n40S0eCVo+eccHA4HRvS5XSdNGHVJn0EAMzfBt3DalOlHm+PrAiZdVdp5IfbJwJv\n"
+            + "xkyI++0p4VaYTZhOxjswTs6vgv30FBmHAlx1FzoUOKLaOhxPyLgamFd9YG+ab4DK\n"
+            + "chc4TxIj3kkx3/m6JufW8DWhKyAJNZ/MW+Iqop5pUIeTbOBlNyaflK+XxjkP71rP\n"
+            + "2gZx4pjYjK5EPDy0HlRlc3R1c2VyIEEgPHRlc3RhQGV4YW1wbGUuY29tPokBOAQT\n"
+            + "AQIAIgUCTHqemgIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQ0lrQep/Q\n"
+            + "05ZxMAf+OoRzXWbGfv7kZb7xdrVyAUTAV4bUUvLoJZUIQ1ckPBcty2LUvY7l9efg\n"
+            + "p3c57nvTD6U98dVnsKfaW4PT0CRXlpl1IFyhkgbInFS5rO+cJMQn1KyC+FfiwyGN\n"
+            + "ii630SwiHyWRG5+XQ6Iptx9JELwWUMCLJxFpB8DZQKlNnvdl+YUgEeQOkWTXfTSa\n"
+            + "BATdXHiZhskiumnTOGO24jSg8CrZc5O/n6fCCgEsAFWL7fnO0ii6EW1JH5btLHPx\n"
+            + "L9QI+5DJIypgOhGI1lqZW9KrpfmJ3w6N1GekGBda98DmzxxxZ9iyq1cELAAiQMjk\n"
+            + "vws67cOs/hwXNn9YaK74dzhb49MLGJ0DmARMep6aAQgA3NQtBhS8yiEGN8rT4hGt\n"
+            + "uuprVd5jQVprLz4ImcI2+Gt71+CRgv/BZ0zzFp3VPjTGRusungJYkKKOGpEpERiq\n"
+            + "EG1X/ZyL7EzoyT+iKIMDsVJgmyDNcryHTejlKA8Z6GQ1hPlOIws22oLq5zQXxD9p\n"
+            + "zMDuabHl/s/bYlU5qXc7LhxdtrmTb2uBP9a+eneWKrz8OfgtS5m9DgqJ6Bjl0Tvb\n"
+            + "eVJgKHX42pqzJlBTCn3hJjJosy8x4qTbqMraENnl9y+qynM7atoHX6TPWsD7vWtW\n"
+            + "vi+FA5OWGEe3rof8o/sJSj05DQUni8mmSiCYW/tUklPPXOvPRP0GZ/GhBzIUtE3j\n"
+            + "BwARAQABAAf+KQOPSS3Y0oHHsd0N9VLrPWgEf3JKZPzyI1gWKNiVdRYhbjrbS8VM\n"
+            + "mm8ERxMRY/hRSyKrCdXNtS87zVtgkThPfbWRPh0xL7YpFhenena63Ng78RPqlIDH\n"
+            + "cITs6r/DRBI4jnXvOTr/+R2Pm1llgKF2ePzsSt0rpmPcjyrdBsiKSUnLGxm4tGtW\n"
+            + "wVoEjy3+MRN2ULyTO8Pe4URKTtUkkb23iuQuJZy+k+SfH+H0/3oEb8ERRE3UXNG7\n"
+            + "BIbaj71nsx8+H8+x8ffRm1s5Unn86AJ418oEhxNzQk59NnrrlJ4HH9NNbjjzI3JE\n"
+            + "intSQKhFJsvMARdzX062yartQtnm1v6jwQQA65rpMMHCoh9pxvL6yagw3WjQLEPw\n"
+            + "vOGpD9ossBvcv/SfAe7SgJsx6J6X0IIW6EKIjyRhWTIfK/rVR0cmUFTGStib+y22\n"
+            + "BPcQmt/Oiw9rdUfOmDrnosPC0SB+19tKw1v1AfW5swpJnGBCkGz9UfX4Fr/eTS3e\n"
+            + "2KaMq+r1KALSUVkEAO/x0SWOiBRH3X1ETNE9nLTP6u2W3TAvrd+dXyP7JjXWZPB8\n"
+            + "NOwT7qidvUlhTbxdR7xWNI1W924Ywwgs43cAPGyq95pjdzhvi0Xxab7124UK+MS3\n"
+            + "V4WBvjOYYW8pkdMOydRLETXSkco2mDCRTiVKe3Zi7p+lKlVJj4xrFUPUnetfBADH\n"
+            + "EPwYeeZ8sQnW644J75eoph2e5KLRJaOy5GMPRLNmq+ODtJxdoIGpfQnEA35nSlze\n"
+            + "Ea+1UvLBlWyF+p08bNfnXHp3j5ugucAYbVEs4ptUwTB3vFt7eJ8rkx9GYcuBFiwm\n"
+            + "H47rg7QmS1mWDLyX6v2pI9brsb1SCgBL+oi9CyjypkjqiQEfBBgBAgAJBQJMep6a\n"
+            + "AhsMAAoJENJa0Hqf0NOW/gkH/jm9FL+S53NjrthdbNjffryhp7KhTmYAsRk3Hc3X\n"
+            + "4TBj3upecarJynpvsz5HlLi/OxDRR6L2yfjKk6/2iKAbV56mdnnu5xG3TG8++naL\n"
+            + "7n/s9TGBhgknb6+vGhSMZ/1dpQ6wkiyuEmgKJo8DzHAh3k3VATHiBeSD7fNSsgtK\n"
+            + "gzK0hi53IFRFDDPYiCca+SS6/pA2zF56JWGETiIa8rSHIQaK4hNJ38vgKOZM80vQ\n"
+            + "fp+CxvJkYY71Yc94oQByaQzrXod7xnukp5SXe/N3BYTFCWoaSTRUI/THRywWwKqa\n"
+            + "rUsttYrqs/EQSy0X3kZ7CAm04uzA8csNyxapEVRvJxbrt5I=\n"
+            + "=FLdD\n"
+            + "-----END PGP PRIVATE KEY BLOCK-----\n");
+  }
+
+  /**
+   * pub 2048R/B007D490 2010-08-29 [expired: 2011-08-29] Key fingerprint = 355D 5B98 FECE 6199 83CD
+   * C91D 5760 6987 B007 D490 uid Testuser B &lt;testb@example.com&gt;
+   */
+  public static TestKey keyB() throws Exception {
+    return new TestKey(
+        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "mQENBEx6ntMBCADG7j/nuI+VvvNbPY9nnfLrAc3KTj0Z+DMxxUMYoZNLjTw1szQ0\n"
+            + "PuKKACiiSA9Oyj4R0aIhWdIR9iYxp6gQdje3yewzoqMwE+t5onYDpdX9QDFXyEzF\n"
+            + "UPWCjA7OSji1G6fyWakiYxKseqyRXOdHXI5TqMikBalmSpwwvmik0cfRGO+l6qvM\n"
+            + "mVJlcn6mkZB0d8WOPV8j8rFxmVSPn9SVP9L8HaFWv1uI9EY3zXbfNeDNgNeTWIMY\n"
+            + "75saINBA2LALBQ54u52GoSbaR8ukZYAjjkif3WIFI8B9xREwjUBLFy3E357aGyLZ\n"
+            + "jE8nsmPk4MDxDaeDNoSHJjcxtDWQJBub3u1zABEBAAG0HlRlc3R1c2VyIEIgPHRl\n"
+            + "c3RiQGV4YW1wbGUuY29tPokBPgQTAQIAKAUCTHqe0wIbAwUJAeEzgAYLCQgHAwIG\n"
+            + "FQgCCQoLBBYCAwECHgECF4AACgkQV2Bph7AH1JD0nQf/Vm+/Mvl99/y3Qw10S6et\n"
+            + "H6NYWDUeAKXe9mfXBJ39HdtlF50jZ5NzSwksAOSQtQZJ3tQQeElXB29cZDvAscva\n"
+            + "RiTtt+KUxDZSYbEHrC0EO7w0Wi5ltwaWdXnoitMOgPZ/grL7UpUbL8rB1evfLbhm\n"
+            + "AqC/6kgHuXeY/7EAzwU3o0wKbmfx1sh8AyQSi4unUwIDCV1RIAP0+ZfJSg0WwGoS\n"
+            + "JB5+lKajtIE6kMn9m8CWM66/zxSCY3XLcoXvjVxCYPwwgYSyje8dDxxOI+x7uj2I\n"
+            + "IjM5RHQ9hTsR7NQ9JUTFmpKZlcdah93NZLKJAFLUtOPjMa5d5t2O0ZOxZ5ftlhHp\n"
+            + "Q7kBDQRMep7TAQgAwOuLBXnACIsd879ld/vLcn8umpKV8MIUjrqOMjR0rNKpCUDw\n"
+            + "LxL4uVh3q/ksESHnQPPqxFYkgeA66SYrx4jwZjbZ5vv9BW99LHe8lSahqrJA9A9g\n"
+            + "5iw5hH+2ZWrGlu3P65UdQUJW+JaDx1IIBt3BbmdGDuKF/ESsy9qxEKq7tKqHI2JL\n"
+            + "Ed+6OIwWblU7ZogfiNpgZJ0lapxTe84mGsD0TowGTu5re/8wIJf1f2q4PuG+L9OZ\n"
+            + "0ZD5i9s1MAxdw4OD+705owPCQnqsr18nH9aUBHWJn9NCXb3jL7QGaId84Yq8SRlK\n"
+            + "wHSRtHLLJoowJ5fXw5UbZcUtRUergxFRwae87wARAQABiQElBBgBAgAPBQJMep7T\n"
+            + "AhsMBQkB4TOAAAoJEFdgaYewB9SQMbsH/iu1HY7OMJxd8EkfxairRNec/v9uEvYQ\n"
+            + "XqfEPw/Hihdef1TY8vB69ymAPd89e1PRDj1m+0/RivO045qFP7lbWMkjKeR9dXXe\n"
+            + "UzIEsTUJ1CNnA7C3fo11NBVg59E0d84bMKQx7n4AZkljgKFKghUb6OJZiWRdh+8W\n"
+            + "0I95JI2R7nMYw3L8/sSGxt+Vjhs9acB1DldbyYbJitYA4fhVZQH9zgeuhQqdCULQ\n"
+            + "ZexpkQqvG0o4iJKO4yeJNHdeM+NwH38wXfzydtEv6Dxz/YZSTwt08p97l6DQ//H7\n"
+            + "wek1LcqeX47YFa9Ftns8Y8fjh4S8Kyi1F6BhZKbsdDqg2hA+0AFv7LA=\n"
+            + "=tmW1\n"
+            + "-----END PGP PUBLIC KEY BLOCK-----\n",
+        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "lQOYBEx6ntMBCADG7j/nuI+VvvNbPY9nnfLrAc3KTj0Z+DMxxUMYoZNLjTw1szQ0\n"
+            + "PuKKACiiSA9Oyj4R0aIhWdIR9iYxp6gQdje3yewzoqMwE+t5onYDpdX9QDFXyEzF\n"
+            + "UPWCjA7OSji1G6fyWakiYxKseqyRXOdHXI5TqMikBalmSpwwvmik0cfRGO+l6qvM\n"
+            + "mVJlcn6mkZB0d8WOPV8j8rFxmVSPn9SVP9L8HaFWv1uI9EY3zXbfNeDNgNeTWIMY\n"
+            + "75saINBA2LALBQ54u52GoSbaR8ukZYAjjkif3WIFI8B9xREwjUBLFy3E357aGyLZ\n"
+            + "jE8nsmPk4MDxDaeDNoSHJjcxtDWQJBub3u1zABEBAAEAB/wPPV1Om92pc9F3jJsZ\n"
+            + "2F3YZxukLfjnA76tnMEWd/pYGrUhdV3AdY4r/aB0njSeApxdXRlLQ3L2cUxdGCJQ\n"
+            + "mzM1ies7IXCC/w5WaShwAG+zpmFL/5+cq3vDc9tb2Q/IasVOVFQYEE2el7SfW5Cp\n"
+            + "mjZFGR8V1wvdNvC0Q0IHrmfdECYSeftzZBEj7CcoGc2pF5zpCG0XQxq7K6cEeSf5\n"
+            + "TKf//UVHgyBCIso6mzgP5k6DGw2d64843CPhhlHEbirUu/wNnbm1SqJ5xFL2VatH\n"
+            + "w7ij4V/hbgnP0GQkbY5+p/PU74P7fx/Ee8D8mF2HmEKRy6ZQY/SAnrjsAURBYR5S\n"
+            + "GF5RBADfhOYEgseWr81lq6Y1oM4YQz+pXRIZk34BagOJsL767B7+uwhvmxBJKIOS\n"
+            + "nRIxfV8GlvT22hrbqsRRyusoIlo2ZUat94IMAL6Oqm6VFm71PT3z9+ukWK43FIXf\n"
+            + "Bsz4swSV001398e3jpSizI6fGW7LRxvnua+NPN+xJLmDVcsPvwQA49ajm48NorD9\n"
+            + "bIWG87+2ScNTVOnHKryR+/LrGWA0f3G6LUsHZPKHNBdFZ4yza2QtEKw95L3K9D4y\n"
+            + "jIeKGwSRYJPb5oh5tSge58pxwP88eI9J4dL+XF1nsG0vYF9B41+qG1TCsPyUJTp6\n"
+            + "ry7NAgWrbpsZpjB0yJ1kFva3iS/hD00EAMu66p1CtsosoDHhekvRZp8a3svd+8uf\n"
+            + "YEKkEKXZuNNmJJktJBSA2FK1RKl9bV8wuG0Pi1/k39egLO3QTjruWUbSggT+aibR\n"
+            + "RW3hU7G+Z5IBOU3p+kTFLat6+TBg0XhCjJ+Eq366nZy1QIfqTCixIaDwrutZd6DC\n"
+            + "BXOjdoG6ZvLcQia0HlRlc3R1c2VyIEIgPHRlc3RiQGV4YW1wbGUuY29tPokBPgQT\n"
+            + "AQIAKAUCTHqe0wIbAwUJAeEzgAYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQ\n"
+            + "V2Bph7AH1JD0nQf/Vm+/Mvl99/y3Qw10S6etH6NYWDUeAKXe9mfXBJ39HdtlF50j\n"
+            + "Z5NzSwksAOSQtQZJ3tQQeElXB29cZDvAscvaRiTtt+KUxDZSYbEHrC0EO7w0Wi5l\n"
+            + "twaWdXnoitMOgPZ/grL7UpUbL8rB1evfLbhmAqC/6kgHuXeY/7EAzwU3o0wKbmfx\n"
+            + "1sh8AyQSi4unUwIDCV1RIAP0+ZfJSg0WwGoSJB5+lKajtIE6kMn9m8CWM66/zxSC\n"
+            + "Y3XLcoXvjVxCYPwwgYSyje8dDxxOI+x7uj2IIjM5RHQ9hTsR7NQ9JUTFmpKZlcda\n"
+            + "h93NZLKJAFLUtOPjMa5d5t2O0ZOxZ5ftlhHpQ50DmARMep7TAQgAwOuLBXnACIsd\n"
+            + "879ld/vLcn8umpKV8MIUjrqOMjR0rNKpCUDwLxL4uVh3q/ksESHnQPPqxFYkgeA6\n"
+            + "6SYrx4jwZjbZ5vv9BW99LHe8lSahqrJA9A9g5iw5hH+2ZWrGlu3P65UdQUJW+JaD\n"
+            + "x1IIBt3BbmdGDuKF/ESsy9qxEKq7tKqHI2JLEd+6OIwWblU7ZogfiNpgZJ0lapxT\n"
+            + "e84mGsD0TowGTu5re/8wIJf1f2q4PuG+L9OZ0ZD5i9s1MAxdw4OD+705owPCQnqs\n"
+            + "r18nH9aUBHWJn9NCXb3jL7QGaId84Yq8SRlKwHSRtHLLJoowJ5fXw5UbZcUtRUer\n"
+            + "gxFRwae87wARAQABAAf8DAVBKsyswfuFGMB2vpSiVxaEnV3/2LoHFOOb45XwJSqV\n"
+            + "HL3+mThJ5iaUglMqw0CFC7+HA8fIS41grlFSDgNC02OcjS9rUxDg0En/pp17Gks0\n"
+            + "D+D7bSwZQ1+/yi7ug836lBe89GmBSMj8GgnK9T6RBGOL8nZ72b2ftK4CNWMmAfo4\n"
+            + "NZUy+rnnziV5WoYrkFZhl3dMMd3nITILBy9eYUoiKJl8O1b8amhrNkB/PEMAV7jc\n"
+            + "260XEQ9fgzMMe5/oT8pzIOGyrB+QO5rMu9pGVJ1qeMzTiZjjHXE2CEaEbvEk0F4l\n"
+            + "6w2gp5C6O5GoMpCOPwCy7dOYX5ETdO4Ppjnrob2XEQQAwus5q+EFoBVG8vfEf56x\n"
+            + "czkC15+0VcMe/IM8l/ur/oF1NUlAnPCq7WfgdELvGNszW7R+A625yXJJf7LJE/y/\n"
+            + "5GUGHAK60FUa0ElbVEn0A6kDcvll0dM6rKPQvFguaFpBKXre6k17cdOrf9hasfJk\n"
+            + "+lzaHlh9hJgoM30pAwG4+n8EAP1f+TEkEfVFo4Uy84eO6xVkYVndopDU1gCpfW1a\n"
+            + "84SA2PNjU3vkdIoFsEvOmf1xlfYeDYn37dikFPEZDsHBUzELDMewAXRgmVvnMJrj\n"
+            + "8Zq4FbEQSVjyz3qJOGk5V999qqoVMRXdnlQs5IXgZauPsnIqi5TRQZOMhbaiOVBO\n"
+            + "kqWRBAC9FhxypA3t9j1zGTFDppWmcBxpVzGGsgmzGO+WTVyk6szbZgTsf2+R+gTJ\n"
+            + "ZKVVzE6Mu+iZmPbrn/x7LWzKJuavRz0xSrvCYbIxYyheFz5LOPFHLF181h1g79gY\n"
+            + "E5Tz7uwu3jIldM7rY5RhxS6V5GGDVSfA+/Dsk6Iaujs6Hs7y30C0iQElBBgBAgAP\n"
+            + "BQJMep7TAhsMBQkB4TOAAAoJEFdgaYewB9SQMbsH/iu1HY7OMJxd8EkfxairRNec\n"
+            + "/v9uEvYQXqfEPw/Hihdef1TY8vB69ymAPd89e1PRDj1m+0/RivO045qFP7lbWMkj\n"
+            + "KeR9dXXeUzIEsTUJ1CNnA7C3fo11NBVg59E0d84bMKQx7n4AZkljgKFKghUb6OJZ\n"
+            + "iWRdh+8W0I95JI2R7nMYw3L8/sSGxt+Vjhs9acB1DldbyYbJitYA4fhVZQH9zgeu\n"
+            + "hQqdCULQZexpkQqvG0o4iJKO4yeJNHdeM+NwH38wXfzydtEv6Dxz/YZSTwt08p97\n"
+            + "l6DQ//H7wek1LcqeX47YFa9Ftns8Y8fjh4S8Kyi1F6BhZKbsdDqg2hA+0AFv7LA=\n"
+            + "=uFLT\n"
+            + "-----END PGP PRIVATE KEY BLOCK-----\n");
+  }
+
+  /**
+   * pub 2048R/D24FE467 2010-08-29 Key fingerprint = 6C21 10AC F4FC 1C7B F270 C00E 641F 1193 D24F
+   * E467 uid Testuser C &lt;testc@example.com&gt; sub 2048R/DBECD4FA 2010-08-29
+   */
+  public static TestKey keyC() throws Exception {
+    return new TestKey(
+        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "mQENBEx6nuMBCADd077pyfsDGbGhHh+7xzipWihMJRrzQnpbSeVJIxA/Js+Z2MW8\n"
+            + "9J98AgnjONjGVlLqtp11O8Bp9xgdoGYWvFl2CrooQrCe+70JORHE30MJT+61mgLQ\n"
+            + "jm9l2WmIIcuzNwoTOKqWlXuaRIKddXMVbwr++Enl/9znx81FCf1KioDijeeHzVZb\n"
+            + "IjELLCtLlhwhGlYNy6LfNhSY+rNHOomIM9CUXkGZU7JvTe3M1plUzYYIFu3tttZI\n"
+            + "b6e1FSfR60yZ/f88fLacloc3fSrPWA261R/gHuFfLCdTt/I3EcYE+x33LZnSSOgz\n"
+            + "v/JtAuFlCaF/oNRTJHeRbALeri+FxBYule15ABEBAAG0HlRlc3R1c2VyIEMgPHRl\n"
+            + "c3RjQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTHqe4wIbAwYLCQgHAwIGFQgCCQoL\n"
+            + "BBYCAwECHgECF4AACgkQZB8Rk9JP5GcEIgf/cMvYBwH8ENrWec366Txaaeh/TO6n\n"
+            + "4v4P2LUR4/hcrNpHx3+9ikznkyF/b8OCsOE+KstvOO6i9vuRGVBPmfoALVv8iCGs\n"
+            + "5MXZJskjACXOqQav0I7ZY5rDJxuOKq6DrxtpHNxK8n0D1PEZllyk/OZVBAcjL2vu\n"
+            + "WC6ujP3jbMKaV0+heFqOVIghQjdA4McLH2u1XLOGEZdp7hLfmTnClmfzbnslFBSQ\n"
+            + "xU2g3jCq2k2zAPhn+jOGCL0987QGj1e6pHRXdUxcfnLRyNadRied0HO/clIb8vdt\n"
+            + "UaexujHjgg+1KDxj4PBAftN2lRtnnsSG9z4T31aTFz5YVG+pq8UXk9ohCokBIAQQ\n"
+            + "AQIACgUCTHqkKQMFAngACgkQqZHi1Q/dNnexiQf/ba9LcR76+tVvos1cxrGO3VkD\n"
+            + "3R1pvIWsb37/NTypWCvrFhsy4OUEy3bVCfJcqfwdY3Q2XixB9kuKo3qCSom1EjGg\n"
+            + "Qhr5ZsrB3qYqaa6S0AeVusmIwArEr9uuMUDjXhKlUALDX8HfXWGy2UmjNJkkT8Jm\n"
+            + "GtISS4KOfXUuZY04DttvbukEnyxAiLU9V0BnzrI9DARh0gEjqjUZAVyP5lOXJJxt\n"
+            + "sau95mOe8E61GELXPkxDLrnCboX7ys2OxcFO6S7q1xJPkki2SVq0y0k5oY/3jktw\n"
+            + "jO8uC3n7NiyW+BYJK6+zj3u3iA+o0YGm+i6F7aneJEaJrFqRj9L1vbojvuH0cYkB\n"
+            + "IAQQAQIACgUCTHqkOwMFAngACgkQOwm5f0tDh+7dSQf+PnEUftNSOuLVLoJ+2tyD\n"
+            + "DPJpcLIavNCyNR3hCGL86NXRUxOrmYgDVVv8pJuYB6aUTm69rFFZlzNwqQN5pBiX\n"
+            + "Zr3NM1jgJT6gKfXddcg1p/X2S9+xn4RN92R0fn0kEjM65fpE1Do+YWHOuHDZEOrx\n"
+            + "L8OaSo8lr19+r27fn09/HBhz2lOyTYzsdTjHeWdxPVQ3JNiVX11k7iKsttdYtM/V\n"
+            + "mAHzzd54Kvt5So/2qLIAcfSmUe9DQAdmcEcJQpQ2veND9uwccX7tH0cH4n9Cp16o\n"
+            + "quJ2pxWzOvKR3zxSw+cRxyIS4VjT6k+UsG3Lw55QZgdb5IEaJfezPj+tOhQlQz0f\n"
+            + "VrkBDQRMep7jAQgAw+67ahlOGnkF6mTtmg6MOGzAbRQ11MNrORnNtGOccNgtlgrO\n"
+            + "Y8TBqw1HkJ56v26E1FxfRh69CUGkYVXx0tMw0QbI+unX35ce5hJD4aWa8bOA1vfw\n"
+            + "474p/NpI+czWsFvcdOu5K6xIGXHShaQQyf2FQ9QeIFrU60qfaBL5jzuLyujCACqU\n"
+            + "46QGgBgeUjaT54LjrWSdn/Jtsbpv0MPv3Ea8fMdtSMkkBsDkF55jaJDFYq+xbs+e\n"
+            + "IKBjTwtSvrUisnLAC0Z9YY21GXGI3DGYqpVXz+Fe5xMTX1a6K3VKEmxmX2m/ebhm\n"
+            + "1p6EqjAJguOjJbJJQHKHMOol0zU6ANB6SgP26wARAQABiQEfBBgBAgAJBQJMep7j\n"
+            + "AhsMAAoJEGQfEZPST+Rn7AcH/32HACPLdxINsi8OSWa8OccMG5XEUvHTZjmdwVT2\n"
+            + "czMss8nwgifU9D4hEVRu1MWpiyxUgegW94wuSh4PWIVOVd18PmzAYc73aYgonakb\n"
+            + "M+MDIqGVvAH8QtHo79sqZ9vrkQaQXB3Y8cq+WxDQZyl8KLXP2icmq1Rl6Q6+i9oS\n"
+            + "pFe88Wr0cGaTblkfDbbWcih3C6tKAfcFwLLg8u4jYfXjZg/E9eAJf0dIFcQSQoHd\n"
+            + "O8hVXaZwx/rYXA8UFwAuROo2nu6SIof1lrH92p+now95d5zUZ5BYnKVd3uXsln0j\n"
+            + "z585UPQKS2J8PUy9IirmahgTyEYFwO64kZ2B4hYOE2g+rYw=\n"
+            + "=LtMR\n"
+            + "-----END PGP PUBLIC KEY BLOCK-----\n",
+        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "lQOYBEx6nuMBCADd077pyfsDGbGhHh+7xzipWihMJRrzQnpbSeVJIxA/Js+Z2MW8\n"
+            + "9J98AgnjONjGVlLqtp11O8Bp9xgdoGYWvFl2CrooQrCe+70JORHE30MJT+61mgLQ\n"
+            + "jm9l2WmIIcuzNwoTOKqWlXuaRIKddXMVbwr++Enl/9znx81FCf1KioDijeeHzVZb\n"
+            + "IjELLCtLlhwhGlYNy6LfNhSY+rNHOomIM9CUXkGZU7JvTe3M1plUzYYIFu3tttZI\n"
+            + "b6e1FSfR60yZ/f88fLacloc3fSrPWA261R/gHuFfLCdTt/I3EcYE+x33LZnSSOgz\n"
+            + "v/JtAuFlCaF/oNRTJHeRbALeri+FxBYule15ABEBAAEAB/sFPLoJDG1eV5QpqEZf\n"
+            + "m/QMOTOn8ZJ9xraQvXFvV7zgVXxJBvTLMbuACrnHnoiCrULS+w8Dt66Nfz7s4yQJ\n"
+            + "5SDtFX2AlMDVWL7wBEPgF1UpN6ox1CzSa6HOaygaUFGeKHO20WDjV4HmBLhQkKIa\n"
+            + "vKbghHA/4Nm1s1z3BHB8GtdGZ1VHc+s1DhPK5w+WHqYpLYjpNmI9yJg3gclEqEG9\n"
+            + "XzBqTZm9mPJRBdDMOD0xLa4nUD3Dkrjimqod3X7EuXE6sT2DuGVa1nuynk/8gIyO\n"
+            + "uS6crY7YJzEQUtQJ2n3y/h+QnZFo9UFuIVpgsxhBDsCnYNFWNR91Q0IM6PohHvqx\n"
+            + "BtFhBADsax1Bc0obP+bIkeAXltGlUYqm3bjOgVZ87XR0qe4TGwXGe8T1Yjfc8rj0\n"
+            + "cfBYCud201r/05CgchojMnTWlFLg308bSIZ9YvN3oOVay8nZ7h62dUIs45zebw3R\n"
+            + "SHwvjE5Sm/VWIdLrUUW1aGfk/VPudNMMMu2C64ev8DF/iwYjoQQA8DM+9oPvFJPA\n"
+            + "kLYg71tP2iIE5GbFqkiIEx59eQUxTsn6ubEfREjI99QliAdcKbyRHc3jc68NopLB\n"
+            + "41L7ny0j6VKuEszOYhhQ0qQK/jlI461aG14qHAylhuQTLrjpsUPE+WelBm9bxli0\n"
+            + "gA8F81WLOvJ2HzuMYVrj3tjGl3AHetkEAI77VKxGCGRzK63qBnmLwQEvqbphpgxH\n"
+            + "ANNAsg5HuWtDUgk85t2nrIgL1kfhu++CfP9duN/qU4dw/bgJaKOamWTfLBwST8qe\n"
+            + "3F8omovi1vLzHVpmvQp6Ly4wggJ4Gl/n0DNFopKw20V8ZTiRYtuLS43H7VsczE+8\n"
+            + "NKjy01EgHDMAP8O0HlRlc3R1c2VyIEMgPHRlc3RjQGV4YW1wbGUuY29tPokBOAQT\n"
+            + "AQIAIgUCTHqe4wIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQZB8Rk9JP\n"
+            + "5GcEIgf/cMvYBwH8ENrWec366Txaaeh/TO6n4v4P2LUR4/hcrNpHx3+9ikznkyF/\n"
+            + "b8OCsOE+KstvOO6i9vuRGVBPmfoALVv8iCGs5MXZJskjACXOqQav0I7ZY5rDJxuO\n"
+            + "Kq6DrxtpHNxK8n0D1PEZllyk/OZVBAcjL2vuWC6ujP3jbMKaV0+heFqOVIghQjdA\n"
+            + "4McLH2u1XLOGEZdp7hLfmTnClmfzbnslFBSQxU2g3jCq2k2zAPhn+jOGCL0987QG\n"
+            + "j1e6pHRXdUxcfnLRyNadRied0HO/clIb8vdtUaexujHjgg+1KDxj4PBAftN2lRtn\n"
+            + "nsSG9z4T31aTFz5YVG+pq8UXk9ohCp0DmARMep7jAQgAw+67ahlOGnkF6mTtmg6M\n"
+            + "OGzAbRQ11MNrORnNtGOccNgtlgrOY8TBqw1HkJ56v26E1FxfRh69CUGkYVXx0tMw\n"
+            + "0QbI+unX35ce5hJD4aWa8bOA1vfw474p/NpI+czWsFvcdOu5K6xIGXHShaQQyf2F\n"
+            + "Q9QeIFrU60qfaBL5jzuLyujCACqU46QGgBgeUjaT54LjrWSdn/Jtsbpv0MPv3Ea8\n"
+            + "fMdtSMkkBsDkF55jaJDFYq+xbs+eIKBjTwtSvrUisnLAC0Z9YY21GXGI3DGYqpVX\n"
+            + "z+Fe5xMTX1a6K3VKEmxmX2m/ebhm1p6EqjAJguOjJbJJQHKHMOol0zU6ANB6SgP2\n"
+            + "6wARAQABAAf9HIsMy8S/92SmE018vQgILrgjwursz1Vgq22HkBNALm2acSnwgzbz\n"
+            + "V8M+0mH5U9ClPSKae+aXzLS+s7IHi++u7uSO0YQmKgZ5PonD+ygFoyxumo0oOfqc\n"
+            + "DJ/oKFaforWJ2jv05S3bRbRVN5l9G0/5jWC7ZXnrXBOqQUkdCLFjXhMPq3zg2Yy3\n"
+            + "XSU83dVteOtrYRZqv33umZNCdk44z6kQOvh9tgSCL/aZ3d7AqjRK99I/IYY1IuVN\n"
+            + "qreFriVcJ0EzlnbPCnva+ReWAd2zt5VEClGu9J0CVnHmZNlwfmbFSiUN1hiMonkr\n"
+            + "sFImlw3adfJ7dsi/GzCC4147ep6jXw7QwQQAzwkeRWR9xc3ndrnXqUbQmgQkAD3D\n"
+            + "p2cwPygyLr0UDBDVX0z+8GKeBhNs3KIFXwUs6GxmDodHh0t4HUJeVLs7ur5ZATqo\n"
+            + "Bx50cSUOoaeSHRFVwicdJRtVgTTQ4UwwmKcLLJe2fWv6hnmyInK7Lp8ThLGQgqo8\n"
+            + "UWg3cdfzCvhKSvsEAPJFYhsFA/E92xUpzP8oYs3AA4mUXB+F0eObe9gqv8lAE6SX\n"
+            + "gB5kWhcd+MGddUGJuJV2LRrgOx3nXu3m3n35AH6iAY4Qi9URPzi/K659oefUU1c5\n"
+            + "BFArHX9bN1k1cOvH28tpQ38eAxaMygLqyR5Q5VbtZ5tYqLKCvHVs3I8lekDRA/4i\n"
+            + "e0vlu34qenppPANPm+Vq/7cSlG3XY4ioxwC/j6Y+92u90DXbbGatOg1SqGSwn1VP\n"
+            + "S034m7bDCNoWOXL0yAcbXrLZV74AyfvVOYOs/WtehehzWeTQRT5lkxX5+xGc1/h6\n"
+            + "9HQvsKKnUK8n1oc5aM5xzRVkU9+kcmqYqXqyOHnIbDbPiQEfBBgBAgAJBQJMep7j\n"
+            + "AhsMAAoJEGQfEZPST+Rn7AcH/32HACPLdxINsi8OSWa8OccMG5XEUvHTZjmdwVT2\n"
+            + "czMss8nwgifU9D4hEVRu1MWpiyxUgegW94wuSh4PWIVOVd18PmzAYc73aYgonakb\n"
+            + "M+MDIqGVvAH8QtHo79sqZ9vrkQaQXB3Y8cq+WxDQZyl8KLXP2icmq1Rl6Q6+i9oS\n"
+            + "pFe88Wr0cGaTblkfDbbWcih3C6tKAfcFwLLg8u4jYfXjZg/E9eAJf0dIFcQSQoHd\n"
+            + "O8hVXaZwx/rYXA8UFwAuROo2nu6SIof1lrH92p+now95d5zUZ5BYnKVd3uXsln0j\n"
+            + "z585UPQKS2J8PUy9IirmahgTyEYFwO64kZ2B4hYOE2g+rYw=\n"
+            + "=5pIh\n"
+            + "-----END PGP PRIVATE KEY BLOCK-----\n");
+  }
+
+  /**
+   * pub 2048R/0FDD3677 2010-08-29 Key fingerprint = C96C 5E9D 669C 448A D1B9 BEB5 A991 E2D5 0FDD
+   * 3677 uid Testuser D &lt;testd@example.com&gt; sub 2048R/CAB81AE0 2010-08-29
+   */
+  public static TestKey keyD() throws Exception {
+    return new TestKey(
+        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "mQENBEx6nwkBCADuztv2tGhjPljwW46qEhth7ZnkdhYXuctZ6lNQuy5LMaEECE3C\n"
+            + "jvVKY+nBrgsLY2Trts+q+mdooBWvxy/qe5PAQTcPR83KjVS4fYwNMBgeRxBEZAZg\n"
+            + "DFwRRCsRrHost+cMgtzLocQ+vL3+9yTRAIe/WmYwbEDXg/c9JSC7kQbZqaAaOshO\n"
+            + "cIOyeB8/QoYee0fEnBzHMmcd0SB1YpwIvRG6v61lXmgpQ9CbovvXO6ZZyEyCX784\n"
+            + "9xprzqP1y03DPrbhuhBAY8EMf3KGJA1dEcU4+lbGEgmlOe2YSbWoLs7mRLFcq5xx\n"
+            + "JroYMtvXF04k4ZHNZAnT3IZc+lJyCqOp4vXpABEBAAG0HlRlc3R1c2VyIEQgPHRl\n"
+            + "c3RkQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTHqfCQIbAwYLCQgHAwIGFQgCCQoL\n"
+            + "BBYCAwECHgECF4AACgkQqZHi1Q/dNne/0wgApuPzh4J8p2quCK1ScsJHlgGRojGq\n"
+            + "IDPhZFtPn0p2IAkqr5sAhvZAjd3u9A2DqQ7pwOX7gnGRE7dSrK69IAjfbRMc5k16\n"
+            + "aBK2ADq2YgPEmTToots1A0Tj+LaCFOXYUtEkgAC+RfFIkCdt8z86GIr0kg19Q/vY\n"
+            + "I/LtvThAk28D8yIfDnW49Mc4GGq+qvrOytBaGu3dzW0mjYWGEyl0fdSjNqtKyWN7\n"
+            + "Qw70Kqysaoy1KiPRAgwiPQfMCEx6pVaXuAfgRKaJ18kCNOldpajLgQv6yeY7mhgu\n"
+            + "Q3Qe7xQlAtVObxskcTH2CWggl2dPqSMNieLK0g/ER8PIReGDCBXNSJ4qYbkBDQRM\n"
+            + "ep8JAQgAw/o1nhJPLGlIfEMzOGU0Jjj+DwEyB3QIEEc+WKRvgtGsJ4cbZdaGWBJq\n"
+            + "jSo7e9XC9jA2ih0+Gld0vWV7S0LZ84xXxQeadC+AZBFR+b9ga4aUFIji8Tdi2dWX\n"
+            + "QmY76hHIaF8rs6aJB7lRig735VRLxVHOb194t9KLUzZiEKqd71BvLQyuLqAfTEsT\n"
+            + "GRHgmydaxZbGXz+Z57jbQgm11CQEHX1dtS8uqWb64xrV5GAeuEhRj4R6Yiy7OPNi\n"
+            + "xXHxryH2Jd34pA0cGHYVcTgVjXuZ9FFP2SnXuxABONGAIaJuqg7ozYBa2kOdr0DN\n"
+            + "5Pxy5ocR7R2ZoN0pYD5+Cc7oGHjuCQARAQABiQEfBBgBAgAJBQJMep8JAhsMAAoJ\n"
+            + "EKmR4tUP3TZ369QIAKPlfX2TUfhP3otYiaa24zBJ/cvGljGiSfX0KrausBHH161j\n"
+            + "lraJfLzpe7vSOZhwZwgIY/eKoErAkJwVnX1+dLuOcHaqRDi5gnLqa6Yg9a2LWb4z\n"
+            + "rvgsvbiNUs1o9htOcvcpv7e3UUUcRa8lO+aNkO+VoI6DI8RJ3wIfJayboePRXdfr\n"
+            + "8g9of0jSdIOzlaaBPxA2wYSWXm4kv7QXzZooxuGqhn0+JKuq2+oO9y5QUig+c3oG\n"
+            + "a5mpVblmv5ZL6Gc36kCbeEC8j6JkNT4wnceQwpNUNYtPU186cjy3rAD4C58w0Uvp\n"
+            + "HZZSTc0syLOShQr//We39LUNaX6WF3NmyF8K/OM=\n"
+            + "=YDhQ\n"
+            + "-----END PGP PUBLIC KEY BLOCK-----\n",
+        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "lQOYBEx6nwkBCADuztv2tGhjPljwW46qEhth7ZnkdhYXuctZ6lNQuy5LMaEECE3C\n"
+            + "jvVKY+nBrgsLY2Trts+q+mdooBWvxy/qe5PAQTcPR83KjVS4fYwNMBgeRxBEZAZg\n"
+            + "DFwRRCsRrHost+cMgtzLocQ+vL3+9yTRAIe/WmYwbEDXg/c9JSC7kQbZqaAaOshO\n"
+            + "cIOyeB8/QoYee0fEnBzHMmcd0SB1YpwIvRG6v61lXmgpQ9CbovvXO6ZZyEyCX784\n"
+            + "9xprzqP1y03DPrbhuhBAY8EMf3KGJA1dEcU4+lbGEgmlOe2YSbWoLs7mRLFcq5xx\n"
+            + "JroYMtvXF04k4ZHNZAnT3IZc+lJyCqOp4vXpABEBAAEAB/0Yf+FiLHz/HYDbW9FF\n"
+            + "kmj7wXgFz7WRho6dsWQNxr5HmZZWxxFPMgJpONnc9GGOsApFAnLIrDraqX3AFFPO\n"
+            + "nxH36djfuPKcYqZ77Olm2vXGeWzqT0a2KN5zKQawH/1CxDUwe+Zx/60V8KAfXbSJ\n"
+            + "up+ymnAcbKa0VYYSYFI82/KTdthJ1jFMNtXkaLskpM8TrDBCgd38m8Dpb5GCrDVY\n"
+            + "faZgkHokTTrvaTcx7ebGOxlOcbfzOPMJyFiz6lHf4JGr5ZVQXymaAG18kRDFxXHm\n"
+            + "AskOJIxnMdcy2IzNximht2CIgRuGznyPoeh/j8KFONKIKf3N6dVfV12uIvGOVV+D\n"
+            + "/ZQZBAD2dennp3Z4IsOWkgHTG3bloOVcIY5n+WvliQY/5G3psKdKeaGZxt6MhMSj\n"
+            + "sJEiUgveYTt5PxvQc5jmFEyjEQJmDAHo3RbycdFVvICrKIhKFyIlcVFCOSwDvLAW\n"
+            + "aZhu/m47jGnnYZ+bDzZl4X8L7Zu8e3TStEiVhjYTRqJfdEdMVQQA+A0ehIhIa1mJ\n"
+            + "ytGKWQVxn9BwKTP583vf2qPzul7yDEsYdGfoA0QGUicVwV4NNK3vK3FQM9MBSevp\n"
+            + "JFpxh2bRS/tgd5tFDyRqekTcagMqTxnJoIpCPUvj5D+WXsS1Kwrcm7OpWoNHOcjD\n"
+            + "Hbhk/966QALO+T6BTVLx32/72jtQ10UD/RsqQfRDzlQUOd6ZYOlH5qCb1+f8f3qJ\n"
+            + "yUmudrmjj8unBK3QbBVrxZ1h9AyaI5evFmsMlLKdTp0y49CmrSQmgEnUYzvBDjse\n"
+            + "/jYanpRKnt69HeZFilHLIF+HBbQfSM66UVXVoJSNTJIsncVa0IcGoZTpCUVOng3/\n"
+            + "MLfW4sh9NX1yRIi0HlRlc3R1c2VyIEQgPHRlc3RkQGV4YW1wbGUuY29tPokBOAQT\n"
+            + "AQIAIgUCTHqfCQIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQqZHi1Q/d\n"
+            + "Nne/0wgApuPzh4J8p2quCK1ScsJHlgGRojGqIDPhZFtPn0p2IAkqr5sAhvZAjd3u\n"
+            + "9A2DqQ7pwOX7gnGRE7dSrK69IAjfbRMc5k16aBK2ADq2YgPEmTToots1A0Tj+LaC\n"
+            + "FOXYUtEkgAC+RfFIkCdt8z86GIr0kg19Q/vYI/LtvThAk28D8yIfDnW49Mc4GGq+\n"
+            + "qvrOytBaGu3dzW0mjYWGEyl0fdSjNqtKyWN7Qw70Kqysaoy1KiPRAgwiPQfMCEx6\n"
+            + "pVaXuAfgRKaJ18kCNOldpajLgQv6yeY7mhguQ3Qe7xQlAtVObxskcTH2CWggl2dP\n"
+            + "qSMNieLK0g/ER8PIReGDCBXNSJ4qYZ0DmARMep8JAQgAw/o1nhJPLGlIfEMzOGU0\n"
+            + "Jjj+DwEyB3QIEEc+WKRvgtGsJ4cbZdaGWBJqjSo7e9XC9jA2ih0+Gld0vWV7S0LZ\n"
+            + "84xXxQeadC+AZBFR+b9ga4aUFIji8Tdi2dWXQmY76hHIaF8rs6aJB7lRig735VRL\n"
+            + "xVHOb194t9KLUzZiEKqd71BvLQyuLqAfTEsTGRHgmydaxZbGXz+Z57jbQgm11CQE\n"
+            + "HX1dtS8uqWb64xrV5GAeuEhRj4R6Yiy7OPNixXHxryH2Jd34pA0cGHYVcTgVjXuZ\n"
+            + "9FFP2SnXuxABONGAIaJuqg7ozYBa2kOdr0DN5Pxy5ocR7R2ZoN0pYD5+Cc7oGHju\n"
+            + "CQARAQABAAf/QiN/k9y+/pB7h4BQWXCCNIIYb6zqGuzUSdYZWuYHwiEL1f05SFmp\n"
+            + "VjDE5+ZAU+8U0Gv+BAeRbWdlfQOyI/ioQJL1DggeXqanUF4uCbjGDBPLhtCZsmmM\n"
+            + "QVLdrOl+v+SHe33e7E7AQSyQMaUSkUEtHycYIasZPQRfw9H/L3u9OEWXkMUbPso5\n"
+            + "L0A0StkcsM1isYfC8ApnF4zSTWHO9uqnc+qE4qChCqsGvaSIyLKEpVe4F0vEkbrq\n"
+            + "3usVp3cxJd9apN+JjMoC9dHJcQahgfJZ1jzgJ3rueRxrGZV+keo8VmyrDGFCerX9\n"
+            + "6Ke3RPMHN/evCHyPMtHC82QKYuy4ZTvldwQAyzbNKIIpNjyHRc/hXLMBUtnW0VYS\n"
+            + "dELA1VBMmT/d6Xx6pI9gg9HCjDx+DuQRych7ShxrYLL1pNQD8jwEJhZIeUpSgIFD\n"
+            + "BXdwkiGbmdrU5N0tBhxp8kRcqcGbL68zC9S0X2hNju6Dxu9hbG8ZAdYaCdAavVy0\n"
+            + "O6E66+T0cLRBinsEAPbiL/0rpV15DdITwD3hvzhYDyURE+yxQZe9ngS1uoui3mGn\n"
+            + "bLc/L/nbHf2Z91ViSsUaqJjpb2/eDsJtGJ9pFlFLTndujkA62CktJytD9DIYLlYD\n"
+            + "huXlsKvZkNZEZNDKLC5Tg8YR/28Opz0/ZFzfVuJAQqg7+iWkxklG3SvN71RLA/9x\n"
+            + "wun1AEw6tLJ2R2j8+yXIt8UaWExqAviT/JgZELVXdCTqcYuOmktsM2z+2D+OyUtP\n"
+            + "7+Yyz7MGQKMAU+V/1uOK4YqwUJrcGy501o9Of+xm+5DASsK1oM5e9sBdmNewdLHL\n"
+            + "ZJEllURrEC6zCE/4zzs7qUfakH4l4ZJgjRL6va+ED0HfiQEfBBgBAgAJBQJMep8J\n"
+            + "AhsMAAoJEKmR4tUP3TZ369QIAKPlfX2TUfhP3otYiaa24zBJ/cvGljGiSfX0Krau\n"
+            + "sBHH161jlraJfLzpe7vSOZhwZwgIY/eKoErAkJwVnX1+dLuOcHaqRDi5gnLqa6Yg\n"
+            + "9a2LWb4zrvgsvbiNUs1o9htOcvcpv7e3UUUcRa8lO+aNkO+VoI6DI8RJ3wIfJayb\n"
+            + "oePRXdfr8g9of0jSdIOzlaaBPxA2wYSWXm4kv7QXzZooxuGqhn0+JKuq2+oO9y5Q\n"
+            + "Uig+c3oGa5mpVblmv5ZL6Gc36kCbeEC8j6JkNT4wnceQwpNUNYtPU186cjy3rAD4\n"
+            + "C58w0UvpHZZSTc0syLOShQr//We39LUNaX6WF3NmyF8K/OM=\n"
+            + "=e1xT\n"
+            + "-----END PGP PRIVATE KEY BLOCK-----\n");
+  }
+
+  /**
+   * pub 2048R/4B4387EE 2010-08-29 [expired: 2011-08-29] Key fingerprint = F01D 677C 8BDB 854E 1054
+   * 406E 3B09 B97F 4B43 87EE uid Testuser E &lt;teste@example.com&gt;
+   */
+  public static TestKey keyE() throws Exception {
+    return new TestKey(
+        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "mQENBEx6nxoBCADjYOWOFa7ZBJpRuNspRoXBTK0LiK5zqN894b87LgIYEgUM6q5J\n"
+            + "yLNo43x7V+ow1/7BEq0JUAMSQ3uRn2jqXiJskSXvwlFYcTVFb0gY09CSD0ptHvda\n"
+            + "zqYOuM/MU1l9jqmlM+pDw/z0pLTKYmAHi6pKJ64pqccMHPUZHpLywyzSNX+JM86I\n"
+            + "K5KAsyGArtgpT9vfci3idNeXjhMR8rfLPDFbdGvGFOZrYv0cfgTbBpVEWeHjs2FR\n"
+            + "4vHG133AdjdZcvA9Y9VW34ZLeiyBEeFix7+HPVS82rko2kQxZu1UZRu340maKDAo\n"
+            + "+UVirgo0FQ8nNUR+c9oNKgiZtO39IAPJv/WZABEBAAG0HlRlc3R1c2VyIEUgPHRl\n"
+            + "c3RlQGV4YW1wbGUuY29tPokBPgQTAQIAKAUCTHqfGgIbAwUJAeEzgAYLCQgHAwIG\n"
+            + "FQgCCQoLBBYCAwECHgECF4AACgkQOwm5f0tDh+6Fowf9FZgntlW4qc7BHe8zYJ0q\n"
+            + "zoLZrHwCFcaeO3kz53y5Lz3+plMuqVDjoQDOt8DxsPHrXWKiu0qBTjZ28ztN3ef6\n"
+            + "f0MpguTGclvFroevUct0xiyox5r1DfMT8JRvqsojE1XPscR2zJzIgEg3OCPuksT9\n"
+            + "EsHsF+/3RBbsXbQgDpW38g0GzIJI4AiQ/yvG2ON9awN2kzIWoBkthVCGy54lCTGj\n"
+            + "yPhatE7Zu2ABNcerIDstupWww2Psec6pGbPPci8ojc90fzalk3UMXcXHD7m8cTJS\n"
+            + "kgHScOzTElIQqOA1+w6uiHy2oAn+qW7534j6p9Tj+DrSIzUXBedGjXZevaKaurVy\n"
+            + "KLkBDQRMep8aAQgAn5r6toYnEzwDeig8r+t89vqOFtohYcmtyeLeTiTTdAz/xWBW\n"
+            + "HUlqV8sglQ9aINpGtBf37v13RhtU3WkUv8cZMQoRM8P2H3cKDNwkucFO6uKSEQO5\n"
+            + "FdzTm4C4WaoE7QiTRbiekwh7O54mz4Wup6LHuEFQEcSpdRUp8w/qaJIHG9EJad1q\n"
+            + "UEsKNnITW+mWHY3+ccK1hgqPwOPqO3/8QtaipekKOYAtOb+57c1jtDFBZnYIkant\n"
+            + "oKs+kRw0DykXFTyFOMYqaleBMcVG+u7ljwAq18L8Ev+qVIpBIZ5eQ5+6p1w9B69h\n"
+            + "RH0Ebn50ebpoqKOXhN4/bu/wq596y0o4xDB0GQARAQABiQElBBgBAgAPBQJMep8a\n"
+            + "AhsMBQkB4TOAAAoJEDsJuX9LQ4fu0/wH/35/22xina8ktbvGV/kB0pH2LBqeXN/b\n"
+            + "CLdA+CDzfwMDzqG0kU39EJ3Fbux7fj4uMaeiYfbO9U85+NOuDmeH41B2dM9S1AzE\n"
+            + "H+/OiCp/Zf1fdd1qXhsA4Xe5vc/VD9oso9OrZK5CM5u0TPmYFijfVDPNgag6mPnD\n"
+            + "zd8JCsuEj4VEy6NF1KcoCc8edQ8AZ4L6ZQ6qiV24gxLnh8xImVr5YjBKDUCdrl79\n"
+            + "0u4wekfgapSx9Sw9Ycz5dFOL07OOHPiKZwUG0f8td6oJX4Ddxset5JAm1pPcLQHR\n"
+            + "6PRx0hI/Tz7rsAI6O37/BEM15+MVGIgOSLL/SRIpOa0L8qmuUhhS6Bg=\n"
+            + "=uA5x\n"
+            + "-----END PGP PUBLIC KEY BLOCK-----\n",
+        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "lQOYBEx6nxoBCADjYOWOFa7ZBJpRuNspRoXBTK0LiK5zqN894b87LgIYEgUM6q5J\n"
+            + "yLNo43x7V+ow1/7BEq0JUAMSQ3uRn2jqXiJskSXvwlFYcTVFb0gY09CSD0ptHvda\n"
+            + "zqYOuM/MU1l9jqmlM+pDw/z0pLTKYmAHi6pKJ64pqccMHPUZHpLywyzSNX+JM86I\n"
+            + "K5KAsyGArtgpT9vfci3idNeXjhMR8rfLPDFbdGvGFOZrYv0cfgTbBpVEWeHjs2FR\n"
+            + "4vHG133AdjdZcvA9Y9VW34ZLeiyBEeFix7+HPVS82rko2kQxZu1UZRu340maKDAo\n"
+            + "+UVirgo0FQ8nNUR+c9oNKgiZtO39IAPJv/WZABEBAAEAB/4xKKzYqDVyM/2NN5Mi\n"
+            + "fF3EqegruzRESzlgrqLij5LiU1sGLOLbjunC/pPWMu6t+rTYV0pT3hmb5D0eAcH0\n"
+            + "EcANiuAR0wg1P9yNk36Z54mLWoTzzKMb3dunCSvb+BU8AREKZ4v5dLEGz2lK7DPo\n"
+            + "zbhWaffMiClBpC0VbjfFBo91LrVUVnhRglBYKdPLQm/Lhw5cNCYOw194ZturO+cC\n"
+            + "iQZhGSy52HMoMs4Wr470CeFZvvWaiDCirVLcj4UhMsVANFKsahMARm9c+QrGrkRP\n"
+            + "+654f8M9ptapcQYpGOMmaeZVnpocONXOTkiJd7Hhr4PRUY+QS8C8F0LbmL2ERQbL\n"
+            + "F65RBADkIelztY/8Xy2S0jsW7+xF2ziz9riOR87G6b0wrXDdFz4GHPzLvwsdXOeN\n"
+            + "cODic14d9bf5jtXr9hgbAzx55ANDjOl3jK5qil8Z9qwsrNK9Mz0wT1acQXBwf/5D\n"
+            + "hI/whBK1FsH7Y+wdX64XA3EXmclxB8GZf1JsGXF3jNH30vyS7QQA/ydoMMw8ja9L\n"
+            + "j6MxHtVHcE4A4j6tFljLDuf8icOwwNUfb7SsHTDjUI2+30ZJOv+qISrthsASCSj3\n"
+            + "AN87CGdVR62Xe923DNdW8/moKKDILNaESyOi27qhI5qWrVRgNB5QwbQcSoClUxbj\n"
+            + "V7YZSfrZkiI+GE1gh1QPMOVyCUmqu90D+wc0x0wUj8emX/4xbbujOa5RAvNcNvnD\n"
+            + "mOB2CfPWD10TEeOOlHBhuoy2/GdIl76W0szJaxnzcV82VArllSciCBzpSfkExDZ6\n"
+            + "08hA8GpOsuOmAAPwXWZsb8YZbJeM0ULMgUCGHgvUj1/pGsCVA6c7sPAdkCfAFlmO\n"
+            + "smC9bvpS2VHZPuG0HlRlc3R1c2VyIEUgPHRlc3RlQGV4YW1wbGUuY29tPokBPgQT\n"
+            + "AQIAKAUCTHqfGgIbAwUJAeEzgAYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQ\n"
+            + "Owm5f0tDh+6Fowf9FZgntlW4qc7BHe8zYJ0qzoLZrHwCFcaeO3kz53y5Lz3+plMu\n"
+            + "qVDjoQDOt8DxsPHrXWKiu0qBTjZ28ztN3ef6f0MpguTGclvFroevUct0xiyox5r1\n"
+            + "DfMT8JRvqsojE1XPscR2zJzIgEg3OCPuksT9EsHsF+/3RBbsXbQgDpW38g0GzIJI\n"
+            + "4AiQ/yvG2ON9awN2kzIWoBkthVCGy54lCTGjyPhatE7Zu2ABNcerIDstupWww2Ps\n"
+            + "ec6pGbPPci8ojc90fzalk3UMXcXHD7m8cTJSkgHScOzTElIQqOA1+w6uiHy2oAn+\n"
+            + "qW7534j6p9Tj+DrSIzUXBedGjXZevaKaurVyKJ0DmARMep8aAQgAn5r6toYnEzwD\n"
+            + "eig8r+t89vqOFtohYcmtyeLeTiTTdAz/xWBWHUlqV8sglQ9aINpGtBf37v13RhtU\n"
+            + "3WkUv8cZMQoRM8P2H3cKDNwkucFO6uKSEQO5FdzTm4C4WaoE7QiTRbiekwh7O54m\n"
+            + "z4Wup6LHuEFQEcSpdRUp8w/qaJIHG9EJad1qUEsKNnITW+mWHY3+ccK1hgqPwOPq\n"
+            + "O3/8QtaipekKOYAtOb+57c1jtDFBZnYIkantoKs+kRw0DykXFTyFOMYqaleBMcVG\n"
+            + "+u7ljwAq18L8Ev+qVIpBIZ5eQ5+6p1w9B69hRH0Ebn50ebpoqKOXhN4/bu/wq596\n"
+            + "y0o4xDB0GQARAQABAAf7Bk9bQCIXo2QJAyhaFd5qh10qhu7CyRnvG/8zKMW98mWd\n"
+            + "KxF+9hNz99qZBCuiNZBLoU0dST6OG6By/3nrDxXxAgZS3cgOj/nl1NJTRWDGHPUu\n"
+            + "LywFgj7Dwu8Y2rqlDTX8lJIS+t8n+BhtkmDHoesGmFtErh8nT/CxQuHLM60qSMgv\n"
+            + "6mSmtOkM+2KfiA5z2o1fDWXjDieW+hdgDPxkaB835wfuDn/Dsn1ch1XHON0xSyTo\n"
+            + "+c35nFXoK1pAXaoalAxZNxcXCAM3NhU37Ih4GejM0K7sSgK72HmgxtNYF77DrTIM\n"
+            + "m5+3960ri1JUuEaJ7ZcqbpKxy/GDldNCYBTx07QMzQQAyYQ+ujT9Pj8zfp1jMLRs\n"
+            + "Xn9GsvYawjo+AIZuHeUmmIXfEoyNmsEUoGHnz9ROLnJzanW5XEStiTys8tHJPIkz\n"
+            + "zL0Ce0oUF93ln0z/jQBIKaSzYB7PMmYCd7ueF94aKqAOrQ/QBb+6JsVjGAtLUoTv\n"
+            + "ey09hGYMogiBV1r0MB2Rsa8EAMrB5VKVQF6+q0XuP6ljFQRaumi4lH7PoQ65E7UD\n"
+            + "6YpyQpLBOE7dV+fHizdUuwsD/wyAOu0EskV1ZLXvXzyk10r3PRoFdpHOvijwZBGt\n"
+            + "jiOiVvK1vkQKDMBczOe74+DaknKn6HzgCsXmLgfk+P8BtLOJnCYsbS9IbnImy2vi\n"
+            + "aJC3A/9wOOK+po8C7JPHVIEfxbe7nwHOoi/h7T4uPrlq/gcQRquqGhQ16nDGYZvX\n"
+            + "ny9aPQ3NcvDR69RM2AaXav03bHVxfhVEyGjP5jLZz7956e4LlnKrsuEhDLfiv30i\n"
+            + "qCC7zNHNA99s5u25vt8AuPVVHfSQ++jifabfv5lU4FHqmK8/4EAoiQElBBgBAgAP\n"
+            + "BQJMep8aAhsMBQkB4TOAAAoJEDsJuX9LQ4fu0/wH/35/22xina8ktbvGV/kB0pH2\n"
+            + "LBqeXN/bCLdA+CDzfwMDzqG0kU39EJ3Fbux7fj4uMaeiYfbO9U85+NOuDmeH41B2\n"
+            + "dM9S1AzEH+/OiCp/Zf1fdd1qXhsA4Xe5vc/VD9oso9OrZK5CM5u0TPmYFijfVDPN\n"
+            + "gag6mPnDzd8JCsuEj4VEy6NF1KcoCc8edQ8AZ4L6ZQ6qiV24gxLnh8xImVr5YjBK\n"
+            + "DUCdrl790u4wekfgapSx9Sw9Ycz5dFOL07OOHPiKZwUG0f8td6oJX4Ddxset5JAm\n"
+            + "1pPcLQHR6PRx0hI/Tz7rsAI6O37/BEM15+MVGIgOSLL/SRIpOa0L8qmuUhhS6Bg=\n"
+            + "=HTKj\n"
+            + "-----END PGP PRIVATE KEY BLOCK-----\n");
+  }
+
+  /**
+   * pub 2048R/31FA48C4 2010-09-01 Key fingerprint = 85CE F045 8113 42DA 14A4 42AA 4A9F AC70 31FA
+   * 48C4 uid Testuser F &lt;testf@example.com&gt; sub 2048R/50FF7D5C 2010-09-01
+   */
+  public static TestKey keyF() throws Exception {
+    return new TestKey(
+        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "mQENBEx+aQkBCADycHmQ8wC4GzaDIvw4uv6/HiTWOUmuLcT06PpsvNBdR2sQ6Vyy\n"
+            + "w1SAnaPmskdgxE7TXpDrwIWPmIkg8KzSfPAap6qZy5zyE1ABQa9yD9v6wsew+lM5\n"
+            + "3UdBO6HQodpWSJMbeR48mUQ96z72B7Lb2GvhFLxvcn5od9jQhbQXfb2k67l33hgR\n"
+            + "D427lxXa+qnmL9pMRGhRw6QATFX+icHxsPfpKnzuk0aY3feJm4+jr4RgHP4djH3i\n"
+            + "NZbv3ibZ24Dj3CK07PwbhqUhZwMqueWbo3ChYjLkRGT/UosNTN0EbHjqBMl4N9OT\n"
+            + "Pl2CM6kuzuaLz3ZeAf48B29GX4rAXfuJTKBbABEBAAG0HlRlc3R1c2VyIEYgPHRl\n"
+            + "c3RmQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTH5pCQIbAwYLCQgHAwIGFQgCCQoL\n"
+            + "BBYCAwECHgECF4AACgkQSp+scDH6SMRfqggAh//U/l4JuwFgWx14mo0SB9YWU81L\n"
+            + "EgUYUd2MUzvX4p/HIFQa0c7stj68Za40+O0tG/J0RCMNb7piM9JFii+MQZzOVuza\n"
+            + "4bbO59D9qboc7Anvx9hGlfIdinT+n5rwX9kZvD2D7GMskm8ZgovkvNwNKcW+5W/4\n"
+            + "ciWqCJKE/Fp9XsooJgN94pJfgDQ2WBL5KDx1aGt4wZXhH2Atl6a6oVZJIH4SaizD\n"
+            + "jau7F4vc7hBfbcDhxFcrVX1QMpzpl352cIx6KVw4FRWvQ8VKkga4JiQwosfvCT2Z\n"
+            + "pdMwy3cARynv8BWLc4Uexf88QIeClP9ZhoVeMqvHMfUb3d6Q5362VdZqI4kBIAQQ\n"
+            + "AQIACgUCTH5xcgMFCngACgkQiptSk+LTK6UqsAgAlsEmzC3Xxv4o5ui95AFbWZGi\n"
+            + "es5rI9WoW2P+6OqVUy1E8+5HdlJ8wUbU1H7JAdFTjY9rH3vKXCXsTetF4z0cupER\n"
+            + "Rkx06M9/jl5OSw8i9bPNNJFobHwiiNO00ctC1tT5oUVXVsfPQHlEbMofv8jehfgC\n"
+            + "gMqH/ve/aafKFfYCZkNHugRgLzxeDpXp3IdyXoSAFGiULnGvMDN7n61QOvEYOw2Z\n"
+            + "i63ql+bL2oj4G+/bNOkdYkuIBN4F/P45P7xy80MSOvkMH7IG/aFTKMNQGWSykKwI\n"
+            + "FRkC+y+F5Oqf/WD30GvbSA7q013sb6nHYvsaHS/48cgIJ5TSVd0LTlrF9uv43bkB\n"
+            + "DQRMfmkJAQgAzc1uAF4x16Cx4GtHI0Hvm+v7bUEUtBw2XzyOKu883XC5JmGcY18y\n"
+            + "YItRpchAtmacDpu0/2925/mWF7aS9RMgSYI/1D9LaTeimISM3iGFY35kt78NGZwJ\n"
+            + "DeCPJPI1sbOU0njfrCPTbOQuRDJ6evaBNX9HYArSEp0ygruJdOUYgnepCt4A7W95\n"
+            + "EKp9KPo7XV1K8y86vrKbgpJ+NnEi7dzMqVxnhO4wAWqb6HYcKLrEc2gVnLtzHkBl\n"
+            + "Y/6dOP15jgQKql1/yQIXae/WGT24n/VeaKqrbSmDNkhW5eW5o1Bkgy/M98oNHXd0\n"
+            + "nVrT8Lyf6un5TwMy+vk0l5AjMMtIZKS0GQARAQABiQEfBBgBAgAJBQJMfmkJAhsM\n"
+            + "AAoJEEqfrHAx+kjEvDAH/iO6BHQfFa+kqjfYD3NE+FNosXv3jiXOU7SCD2MG3AwD\n"
+            + "YqM+v1n4UvvMLLdEbtboht1Btys1vuyNM3RAmR45oh9Dfuc4SKtVzSCkKs85jNvH\n"
+            + "7Ik8gxZ9ARzJbawNzTLFyLwDdcdX42Umuvh49Pn7Nc7FDYcZLffEcTh9sZ7KyxLY\n"
+            + "qcjtnblx5oOQnYnpBbM61GvgNXC8Z+g9fg0oHRouKXKE/HDKbsN0siEf9XJFJTKd\n"
+            + "Eg1NgoyKWdaV4+pU/fTzZUvvDqOSRx8he5w64dvW9o7WdARq/3vPvHgy0O8fMTSI\n"
+            + "tmcHxCU8l0jptJz181N36Uhmjyc9oC4dn9ceSn6VDbg=\n"
+            + "=WDx2\n"
+            + "-----END PGP PUBLIC KEY BLOCK-----\n",
+        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "lQOYBEx+aQkBCADycHmQ8wC4GzaDIvw4uv6/HiTWOUmuLcT06PpsvNBdR2sQ6Vyy\n"
+            + "w1SAnaPmskdgxE7TXpDrwIWPmIkg8KzSfPAap6qZy5zyE1ABQa9yD9v6wsew+lM5\n"
+            + "3UdBO6HQodpWSJMbeR48mUQ96z72B7Lb2GvhFLxvcn5od9jQhbQXfb2k67l33hgR\n"
+            + "D427lxXa+qnmL9pMRGhRw6QATFX+icHxsPfpKnzuk0aY3feJm4+jr4RgHP4djH3i\n"
+            + "NZbv3ibZ24Dj3CK07PwbhqUhZwMqueWbo3ChYjLkRGT/UosNTN0EbHjqBMl4N9OT\n"
+            + "Pl2CM6kuzuaLz3ZeAf48B29GX4rAXfuJTKBbABEBAAEAB/4vTP+C5s5snS6ZDlHc\n"
+            + "datvOV/hhgLYn2huiigV4A7dLCp4/bbOz+pkP51zTLQ9bn+coLYwsPq+Bfo3OY3W\n"
+            + "cXbdFHpmEEJaPqdc32ZuICcAuVEBuA1V3FTjJtHO5U02iWleMlbSZurYE9ZQZTch\n"
+            + "yotdulB7hACivENKh9OXw7ok+1GZVvBGA8tpIwzLZo0Pkb2lDQHaL0GXAjlMNzwg\n"
+            + "cCPFtzjNu6K4g58nuYrjGiE+yWPMJgfo4fTGXcapqXgvh1tKIVxwr2YQSyEOqfMH\n"
+            + "8EwgBj5NPwv0UXAivQUkTaguUJXrlJLtS3mp45nCEAlGT4PNoMyPdvPEf62gND7C\n"
+            + "y9K1BAD493ADPAx9pWCSQI9wp4ARUelTzwHgZ6fRVIzmwO6MuZN1PrtiOLCwY5Jw\n"
+            + "r+97VvMmem7Ya3khP4vz0IiN7p1oCR5nJazk2eRaQNuim0aB0lqrTsli8OXtBlgQ\n"
+            + "5WtLcRi5798Jw8coczc5OftZKhu1SbQZ1VdDdmTbMTAsSRtMjQQA+UnU6FYJZBjE\n"
+            + "NHNheV6+k45HXHubcCm4Ka3kJK88zbZzyt+nrBLEtElosxDCqT8WbiAH7qmpnd/r\n"
+            + "ly7ryIX08etuWVYnx0Xa02cKQ6TzNcbxijeGQYGHIE0RK29nRo8zRWVmbCydqJz1\n"
+            + "5cHgcvoTu7DWWjM5QEZlLPQytJeAyocEAM6AiWDXYVZVnCB9w0wwK/9cX0v3tfYv\n"
+            + "QrJZCT3/YKxJWnMZ+LgHYO0w1B0YwGEeVTnmXODDy5mRh9lxV1aZnwKCwMR1tXTx\n"
+            + "G1potBR0GJxI2xpMb/MJPxeJCAZPu8NncRpl/8v0stiGnkpYCNR/k3JV5jEXq0u6\n"
+            + "4pDSzRGehOHnOqu0HlRlc3R1c2VyIEYgPHRlc3RmQGV4YW1wbGUuY29tPokBOAQT\n"
+            + "AQIAIgUCTH5pCQIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQSp+scDH6\n"
+            + "SMRfqggAh//U/l4JuwFgWx14mo0SB9YWU81LEgUYUd2MUzvX4p/HIFQa0c7stj68\n"
+            + "Za40+O0tG/J0RCMNb7piM9JFii+MQZzOVuza4bbO59D9qboc7Anvx9hGlfIdinT+\n"
+            + "n5rwX9kZvD2D7GMskm8ZgovkvNwNKcW+5W/4ciWqCJKE/Fp9XsooJgN94pJfgDQ2\n"
+            + "WBL5KDx1aGt4wZXhH2Atl6a6oVZJIH4SaizDjau7F4vc7hBfbcDhxFcrVX1QMpzp\n"
+            + "l352cIx6KVw4FRWvQ8VKkga4JiQwosfvCT2ZpdMwy3cARynv8BWLc4Uexf88QIeC\n"
+            + "lP9ZhoVeMqvHMfUb3d6Q5362VdZqI50DmARMfmkJAQgAzc1uAF4x16Cx4GtHI0Hv\n"
+            + "m+v7bUEUtBw2XzyOKu883XC5JmGcY18yYItRpchAtmacDpu0/2925/mWF7aS9RMg\n"
+            + "SYI/1D9LaTeimISM3iGFY35kt78NGZwJDeCPJPI1sbOU0njfrCPTbOQuRDJ6evaB\n"
+            + "NX9HYArSEp0ygruJdOUYgnepCt4A7W95EKp9KPo7XV1K8y86vrKbgpJ+NnEi7dzM\n"
+            + "qVxnhO4wAWqb6HYcKLrEc2gVnLtzHkBlY/6dOP15jgQKql1/yQIXae/WGT24n/Ve\n"
+            + "aKqrbSmDNkhW5eW5o1Bkgy/M98oNHXd0nVrT8Lyf6un5TwMy+vk0l5AjMMtIZKS0\n"
+            + "GQARAQABAAf/T22JFmhESUnSTOBqeK+Sd/WIOJ7lDCxVScVXwzdJINfIBYmnr2yG\n"
+            + "x18NuHOEkkEg2rx6ixksZZRcurMynZZvoB8+Xj69bpLT1JRXv8VlM0SNP6NjPW6M\n"
+            + "ygfQhzxZv8ck2WRgQxIin8SjHJv0zG9F5+1DEUyrzhZQb8dMYkqm/nbZ1FDnMu4F\n"
+            + "1qUZxKx0hU70tAXfywtpH9NQs8jwenUjiXA00k6A48BF7gartYtcGnEG9mk+Z+lh\n"
+            + "/uD+z5j3/ym9XqOJPpFIWhMYTLueSD5yrCT34VdIc1xBOjjtxBsCCbgSFZaewCpB\n"
+            + "5usRr2I4+CK3vbAMny5Hk+/RYZdFQkCA5wQA2JusdhwqPjfzxtcxz13Vu1ZzKR41\n"
+            + "kkno/boGh5afBlf7kL/5FXDhGVVvHMvXtQntU1kHgOcE8b2Jfy38gNGkd3TAh4Oj\n"
+            + "fLavcYyn+9tEkjRVdOeU0P9fszDA1cW5Gjuv6GkbCUSQrv68TKp/mWiTlYm+FT3a\n"
+            + "RSIz2gEyOZNkTzsEAPM6sU/VOwpJ2ppOa5+290sptjSbRNYjKlQ66nHZnbafzLz5\n"
+            + "tKpRc0BzG/N2lXwlVl5+3oXSSSbWhJscA8EFwSnAx8Id10zW5NAEfxNuqxxEXlJg\n"
+            + "kOhqwJ1JMz32xlZFRZYxSdXSycYrX/AhV7I7RQxgC48X9udMb8LIXYq0lzy7A/9p\n"
+            + "Skd2Me9JotuTN3OaR42hXozLx+yERBBEWuI3WXovWRD8b8gCfWL3P40d2UVnjFmP\n"
+            + "TZ8p9aHAd2srWgaPSZaSsHtIyI6dQGScMEOKEaCJxYvF/wuvx/MABDatcaJhMaAc\n"
+            + "W/0w+gb8Lr2hbuRhBSP754V3Amma6LxsmLRAwB6ioT7NiQEfBBgBAgAJBQJMfmkJ\n"
+            + "AhsMAAoJEEqfrHAx+kjEvDAH/iO6BHQfFa+kqjfYD3NE+FNosXv3jiXOU7SCD2MG\n"
+            + "3AwDYqM+v1n4UvvMLLdEbtboht1Btys1vuyNM3RAmR45oh9Dfuc4SKtVzSCkKs85\n"
+            + "jNvH7Ik8gxZ9ARzJbawNzTLFyLwDdcdX42Umuvh49Pn7Nc7FDYcZLffEcTh9sZ7K\n"
+            + "yxLYqcjtnblx5oOQnYnpBbM61GvgNXC8Z+g9fg0oHRouKXKE/HDKbsN0siEf9XJF\n"
+            + "JTKdEg1NgoyKWdaV4+pU/fTzZUvvDqOSRx8he5w64dvW9o7WdARq/3vPvHgy0O8f\n"
+            + "MTSItmcHxCU8l0jptJz181N36Uhmjyc9oC4dn9ceSn6VDbg=\n"
+            + "=ZLpl\n"
+            + "-----END PGP PRIVATE KEY BLOCK-----\n");
+  }
+
+  /**
+   * pub 2048R/E2D32BA5 2010-09-01 Key fingerprint = CB2B 665B 88DA D56A 7009 C15D 8A9B 5293 E2D3
+   * 2BA5 uid Testuser G &lt;testg@example.com&gt; sub 2048R/829DAE8D 2010-09-01
+   */
+  public static TestKey keyG() throws Exception {
+    return new TestKey(
+        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "mQENBEx+aRYBCAC77YjBScTjRFHtZvk0yyAy8KAXopbCdMBQs7S7iidFMMxhs0Uu\n"
+            + "D7GeleyVusLFJfEM0Ul0b0pLgfJx9j3cot4BTl71OqnawHp4ktuqFyTjhhYy8kBe\n"
+            + "4mliNP36WW7fYXh+f5SZqDQ6rgyoJCOmiUlosb6CM2yUPH3oDtOKg/9Z0iMUcXfQ\n"
+            + "y+bxRKSQmDtiSIS7hwUZmQoo30iAZNygMBLnYyVau3YFan+xyBMCFLa2/pfE0qaU\n"
+            + "QMy67XP8uP7DXlepfc4Lk/qa/2WnAqmuTT2ty9MG+X8M8LuiPuMWfOEx8ICUWB9s\n"
+            + "kCCMWCagS7EUIPhp6AOqjMqEWGOyLmclkGCJABEBAAG0HlRlc3R1c2VyIEcgPHRl\n"
+            + "c3RnQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTH5pFgIbAwYLCQgHAwIGFQgCCQoL\n"
+            + "BBYCAwECHgECF4AACgkQiptSk+LTK6VSwQf/WnIYkLZoARZIUfH61EDlkUPv8+6G\n"
+            + "1YY3YgFFMjeOKybu47eU3QtATEaKHphvKqFtxdNyEtmti1Zx7Cq2LzReY1KoQQ5E\n"
+            + "OlKeyxVmXAuAqoRWesxuG318rVTrozCqSdKPCHLcC26M5sO+Gd2sKbA4DjoSyfrE\n"
+            + "zEOVS1NA9dtZ7WBMXr8gjH//ob7dvuptSAlADaLYYaJugcmbzkRGRbfiCQHqv30I\n"
+            + "+81d7RAeSx8XS38YEWm2IvBLpiS/d7A/2AQ25SHxf+QMMWt83+uOuEVa9rEOraid\n"
+            + "ZC6T8vnSRu1TKkX/60LnJvAw9tigmedi21O6Gpz3H3uGyjuk9o18+m8dJokBIAQQ\n"
+            + "AQIACgUCTH5xfAMFCngACgkQSp+scDH6SMT42gf9H7K0jp6PF1vD5t90bcjtnP/t\n"
+            + "CkOXgfL3lJK/l0KMkoDzyO5z898PP8IAnAj1veJ2fNPsRP903/3K8kd9/31kBriC\n"
+            + "poTVPWBmeLut16TgSDxAQPDLsBPcKe2VadhszOQwhfmdsUlCXwXcwbiAjweXwKh+\n"
+            + "00UoW1GLnPw0T387ttCjHsLe972SVUPFxb6NUkA7val62qxDKg+6MRcf6tDs8sN8\n"
+            + "orhYgh9VJcI3Iw8qK1wHI0CenNie0U5xEkZ5U6W4lfhnL5sggjoAeVeAVLiQ4eiP\n"
+            + "sFrq4TOYq9qfuThYiRaSuTLXzuWG5NVs7NyXxOGFSkwzXrQsBo+LuPwjSCERLbkB\n"
+            + "DQRMfmkWAQgA1O0I9vfZNSRuYTx++SkJccXXqL4neVWEnQ4Ws9tzfSG0Rch3Gb/d\n"
+            + "+ckDtJhlQOdaayTVX7h5k8tTGx0myg6OjG2UM6i+aTgFAzwGnBh/N3p5tTaJhRCF\n"
+            + "x1IapX0N7ijq6rQPPCISc3CUZhCVBTnp5dk3c0/hNxsyYXlI1AwuoMabygzTFN/c\n"
+            + "b1bXp0UTTVrdN+Sj5hHVDvpxyaljLa77I0V+lI3bCil9VhQ9h/TP4C2iK3ZdXOMb\n"
+            + "uW7ANhd+I9LWulmExZIiD9RIsHvB3bDu32g1847uT+DUynKETbZWlZS0Q93Aly1N\n"
+            + "lBIkvOCVCBt+VatzZ8oBV8vbk5R41W1HywARAQABiQEfBBgBAgAJBQJMfmkWAhsM\n"
+            + "AAoJEIqbUpPi0yul/doH+wR+o6UCdD6OZxGMx7d0a7yDJqQFkFf2DRsJvY2suug0\n"
+            + "CMJZRWiA+hIin5P6Brn/eb5nTdWgzlrHxkvb68YkevHALdOvmrYNQFXbb9uWGgEf\n"
+            + "3qERdI8ayJsSTqYsTqyuh9YVz21kADxTHN3JkJ4evjHpyz0Xbtq+oDADg+uswj1b\n"
+            + "ihHthFif54vNMEIW9rX9T7ufhXKamr4LuGwKTPTxV8gEPW4h4ZoQwFKV2qOjR+su\n"
+            + "tHnuXVL24kTnv8CHXUVzJXVTNz7i7fAJTgWc9drH6Ktp3XHfLDBwzT5/5ZhyxGJk\n"
+            + "Qq2Jm/Q8mNkXi34H2DeQ3VPtjtMLr9JR9pf6ivmvUag=\n"
+            + "=34GE\n"
+            + "-----END PGP PUBLIC KEY BLOCK-----\n",
+        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "lQOXBEx+aRYBCAC77YjBScTjRFHtZvk0yyAy8KAXopbCdMBQs7S7iidFMMxhs0Uu\n"
+            + "D7GeleyVusLFJfEM0Ul0b0pLgfJx9j3cot4BTl71OqnawHp4ktuqFyTjhhYy8kBe\n"
+            + "4mliNP36WW7fYXh+f5SZqDQ6rgyoJCOmiUlosb6CM2yUPH3oDtOKg/9Z0iMUcXfQ\n"
+            + "y+bxRKSQmDtiSIS7hwUZmQoo30iAZNygMBLnYyVau3YFan+xyBMCFLa2/pfE0qaU\n"
+            + "QMy67XP8uP7DXlepfc4Lk/qa/2WnAqmuTT2ty9MG+X8M8LuiPuMWfOEx8ICUWB9s\n"
+            + "kCCMWCagS7EUIPhp6AOqjMqEWGOyLmclkGCJABEBAAEAB/QJiwZmylg1MkL2y0Pc\n"
+            + "anQ4If//M0J0nXkmn/mNjHZyDQhT7caVkDZ01ygsck9xs3uKKxaP0xbyvqaRIvAB\n"
+            + "REQBzPkFevUlJqERfmOpP4OgCi8WZzbdmqG/WvGKxP/cWBbGVbQ2GVSNpkj+QNeO\n"
+            + "nWoc5unFstbQsEG0hww2/Hz7EppYoBvDrDLY1EPKzr0r6sk1O5gk3VWOqMEJVCh+\n"
+            + "K7EV4pPGmzMrfZQ0jSwRpr0HhzzhDYR7+QUbxr4OS5PoSJDFh0+A5kqFagyupe7A\n"
+            + "96L3Lh7wJBQJsOe5xjOu3lkFp+3vU+Mq7VzO9Fnp9BCwjb4mEjI39bJdGeeOVCWR\n"
+            + "sYEEAMjmftMhIHrjGRlbZVrLcZY8Du4CFQqImb2Tluo/6siIEurVp4F2swZFm7fw\n"
+            + "B2v09GGJ6zKpauJuxlbwo3CFnxbk24W39F/SixZLggLPtNOXdSrLIQrQ1AXu5ucQ\n"
+            + "oCnXS5FaVkD3Rtd53hSMIf2xJiSRKGp/1X9hga/phScud7URBADveDh1oEmwl3gc\n"
+            + "gorhABLYV7cPrARteQRV13tYWcuAZ6WjqNlbbW2mzBE7KTh4bgTzIX0uQ6SZ7bPl\n"
+            + "RmuKQHrdOO9vFGiSf3zDnIg8fhqSyy2SNrC/e7teuaguGCrg5GrP5izBAsiwvXbt\n"
+            + "ST3OG7c8Ky717JGTiUeTJoe4IaET+QP/SB4uQzVTrbXjBNtq1KqL/CT7l2ABnXsn\n"
+            + "psaVwHOMmY/wP+PiazMEDvLInDAu7R8oLNGqYR+7UYmYeAGmWgrc0L3yFVC01tTG\n"
+            + "bk7Yt/V5KRKVO2I9x+2CP0v0EqW4BNOJzbx5TJ5lBFLMTvbviOdsoDXw0S98HIHB\n"
+            + "T1bFFmhVeulCDLQeVGVzdHVzZXIgRyA8dGVzdGdAZXhhbXBsZS5jb20+iQE4BBMB\n"
+            + "AgAiBQJMfmkWAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRCKm1KT4tMr\n"
+            + "pVLBB/9achiQtmgBFkhR8frUQOWRQ+/z7obVhjdiAUUyN44rJu7jt5TdC0BMRooe\n"
+            + "mG8qoW3F03IS2a2LVnHsKrYvNF5jUqhBDkQ6Up7LFWZcC4CqhFZ6zG4bfXytVOuj\n"
+            + "MKpJ0o8IctwLbozmw74Z3awpsDgOOhLJ+sTMQ5VLU0D121ntYExevyCMf/+hvt2+\n"
+            + "6m1ICUANothhom6ByZvOREZFt+IJAeq/fQj7zV3tEB5LHxdLfxgRabYi8EumJL93\n"
+            + "sD/YBDblIfF/5Awxa3zf6464RVr2sQ6tqJ1kLpPy+dJG7VMqRf/rQucm8DD22KCZ\n"
+            + "52LbU7oanPcfe4bKO6T2jXz6bx0mnQOYBEx+aRYBCADU7Qj299k1JG5hPH75KQlx\n"
+            + "xdeovid5VYSdDhaz23N9IbRFyHcZv935yQO0mGVA51prJNVfuHmTy1MbHSbKDo6M\n"
+            + "bZQzqL5pOAUDPAacGH83enm1NomFEIXHUhqlfQ3uKOrqtA88IhJzcJRmEJUFOenl\n"
+            + "2TdzT+E3GzJheUjUDC6gxpvKDNMU39xvVtenRRNNWt035KPmEdUO+nHJqWMtrvsj\n"
+            + "RX6UjdsKKX1WFD2H9M/gLaIrdl1c4xu5bsA2F34j0ta6WYTFkiIP1Eiwe8HdsO7f\n"
+            + "aDXzju5P4NTKcoRNtlaVlLRD3cCXLU2UEiS84JUIG35Vq3NnygFXy9uTlHjVbUfL\n"
+            + "ABEBAAEAB/48KLaaNJ+xhJgNMA797crF0uyiOAumG/PqfeMLMQs5xQ6OktuXsl6Q\n"
+            + "pus9mLsu8c7Zq9//efsbt1xFMmDVwPQkmAdB60DVMKc16T1C2CcFcTy25vBG4Mqz\n"
+            + "bK6rqCAJ9JSe+H2/cy78X8gF6FR6VAkSUGN62IxcyfnbkW1yv/hiowZ5pQpGVjBH\n"
+            + "sjfu+6HGZhdJIyzrjnVjTJhXNCodtKq1lQGuL2t3ZB6osOXEsFtsI6lQF2s6QZZd\n"
+            + "MUOpSO+X1Rb5TCpWpR/Yj43sH6Tq7LZWEml9fV4wKe2PQWmFW+L8eZCwbYEz6GgZ\n"
+            + "w2pMoMxxOZJsOMOq4LFs4r9qaNQI+sU1BADZhx42JjqBIUsq0OhQcCizjCbPURNw\n"
+            + "7HRfPV8SQkldzmccVzGwFIKQqAVglNdT9AQefUQzx84CRqmWaROXaypkulOB79gM\n"
+            + "R/C/aXOdWz9/dGJ9fT/gcgq1vg9zt7dPE5QIYlhmNdfQPt6R50bUTXe22N2UYL98\n"
+            + "n1pQrhAdlsbT3QQA+pWPXQE4k3Hm7pwCycM2d4TmOIfB6YiaxjMNsZiepV4bqWPX\n"
+            + "iaHh0gw1f8Av6zmMncQELKRspA8Zrj3ZzB/OvNwfpgpqmjS0LyH4u8fGttm7y3In\n"
+            + "/NxZO33omf5vdB2yptzE6DegtsvS94ux6zp01SuzgCXjQbiSjb/VDL0/A8cD/1sQ\n"
+            + "PQGP1yrhn8aX/HAxgJv8cdI6ZnrSUW+G8RnhX281dl5a9so8APchhqeXspYFX6DJ\n"
+            + "Br6MqNkX69a7jthdLZCxaa3hGInr+A/nPVkNEHhjQ8a/kI+28ChRWndofme10hje\n"
+            + "QISFfGuMf6ULK9uo4d1MzGlstfcNRecizfniKby3SBmJAR8EGAECAAkFAkx+aRYC\n"
+            + "GwwACgkQiptSk+LTK6X92gf7BH6jpQJ0Po5nEYzHt3RrvIMmpAWQV/YNGwm9jay6\n"
+            + "6DQIwllFaID6EiKfk/oGuf95vmdN1aDOWsfGS9vrxiR68cAt06+atg1AVdtv25Ya\n"
+            + "AR/eoRF0jxrImxJOpixOrK6H1hXPbWQAPFMc3cmQnh6+MenLPRdu2r6gMAOD66zC\n"
+            + "PVuKEe2EWJ/ni80wQhb2tf1Pu5+Fcpqavgu4bApM9PFXyAQ9biHhmhDAUpXao6NH\n"
+            + "6y60ee5dUvbiROe/wIddRXMldVM3PuLt8AlOBZz12sfoq2ndcd8sMHDNPn/lmHLE\n"
+            + "YmRCrYmb9DyY2ReLfgfYN5DdU+2O0wuv0lH2l/qK+a9RqA==\n"
+            + "=T1WV\n"
+            + "-----END PGP PRIVATE KEY BLOCK-----\n");
+  }
+
+  /**
+   * pub 2048R/080E5723 2010-09-01 Key fingerprint = 2957 ABE4 937D A84A 2E5D 31DB 65C4 33C4 080E
+   * 5723 uid Testuser H &lt;testh@example.com&gt; sub 2048R/68C7C262 2010-09-01
+   */
+  public static TestKey keyH() throws Exception {
+    return new TestKey(
+        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "mQENBEx+aSUBCADzpZ1h9awUQR1ChzrMhtoE1ltyTlJpS1G5HFEov9QNxVDTjpB8\n"
+            + "PMdb20NNdk/7g6E+ETpCBJGPoC4/TPFDiqe+UI7cRrRZJVbInkCbflYycLTUt9qW\n"
+            + "5c7IuyZA1+cSYaKp3jYccFZfIWvfTWDLWyUozTs9t1TsI28s3r5fBPvrZ+F1nYv/\n"
+            + "xpSkx3Zsxnn7QJTnd63rZdp0RdfJmF2rXERwR6XVtuLj5CqrFoLxy6OrSOl4am4J\n"
+            + "C2HRWhskB21LpdRtloY8bz0DOn6W6JUFRmSxQ1kbPClOXaiNhzMI0fD/KFnHImgR\n"
+            + "IKbbQyHHsKHBjNyn+zTIm5zUL6JMZMf9PoSZABEBAAG0HlRlc3R1c2VyIEggPHRl\n"
+            + "c3RoQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTH5pJQIbAwYLCQgHAwIGFQgCCQoL\n"
+            + "BBYCAwECHgECF4AACgkQZcQzxAgOVyORcAf/QaHVlyhlBnU4edujW2uG/PFrZvwK\n"
+            + "fqOKW0QqQ7kVN8okKhnFv4y11IwLIzL9mOLYe2+Zyv3I3bz4X8Xw+MsBF6sMWLLf\n"
+            + "9ieu4Wz/5ScVu0PxY36kgV0AQRiLXk802Vk4t9jElCp9qx/dDln7f3879LLb3wNt\n"
+            + "fajne8EH0hjR4E3joPoG+IXSvSzWcPoZTmAZOKHPcRS8iqy0Ao8/UuQWYCedI/4R\n"
+            + "S1IJaByk8mmkMkqqV0kuPyDkvGpqhfh9zFYh97LuKcJktRTEBp3YMvuGcBDBwofG\n"
+            + "vYIVEMr7Ci5rowRQO/sxJfI1zNSWterWC46v6tOb9IvenOgP0/dQxlU82YkBIAQQ\n"
+            + "AQIACgUCTH5xmAMFAXgACgkQ0CLaOl6a7dCYuQf/V2i3Ih5Dqze0Rz5zoTD56/J7\n"
+            + "0SA4/SFm5eDUirY5B9BohkyxoMVG04uyjUmVs62ree7N0IASmeiF/wkBUZ/r/rr/\n"
+            + "0ntGj43y+1JpuSEohZOfgZJryDKRqyVWhRbeBj0g/SzxIQ1lEt2iHFvdSlfFVd+a\n"
+            + "SH1uDDjT/ZATKfAXcgeajUirWorJRaldue7O4oFe67fMLy36ewvpaMVZ+SpxH4CC\n"
+            + "Owq4Ls3dIAg2C5GQK8G0G7FwT1M26EPg66C79EGYkaxprgrilWE6l7QHc484TY1L\n"
+            + "ys04qKoPRnBinmrRxgRyyimvDN/+nd1jdM6nMe1gVLL3s5Vgo0fJMwNhDZMtdrkB\n"
+            + "DQRMfmklAQgAyajPVMt+OXO1ow7xzb0aZYNa5Xdv+w50JzVeWI0boPOuOmq6RCc1\n"
+            + "3NhOmBzx3CKH6zbSRoLBCZWM3cs1EQbl+8noaxq6YQVWiaROX8U7CThYA50jONP/\n"
+            + "qEk655QFsP8Bq96Z5AT/MflxEMayOtQywUFREF4/olhXvJOdurZfQPGnIis35NUc\n"
+            + "IaubI+gGVsluqWBohLOgqzyF7GMlv+Y2JZE5JKGSTO7ZosyI+OCNdZ6X2CJdDPZ1\n"
+            + "325QHYkmqiMJtb73AYTXurL7NNTxdxQVOnfvwXXW4mgHwPEHr8PU30+2xgo1ktrr\n"
+            + "rpFsd0o2UFhybTe7w1z2sAO1gP5s1bbGlwARAQABiQEfBBgBAgAJBQJMfmklAhsM\n"
+            + "AAoJEGXEM8QIDlcjqkQIAI78nwAgO5EgrUDoFikH6d36Kie9SHleaYcSX2c95Vqc\n"
+            + "umuiSAhaulGX0gM/jwvZkoawSyWIq+O2sPSc9F7VzdYdEnWVj2J5BpVx83TRPrTu\n"
+            + "72tsJ97op6JZz+Q8HwTLYJBmyW3/TEKh+iRL9CBtfTVywodZa58j41vCkx37NFPw\n"
+            + "plglT/Se1/US1rWYTH3Kfqo5zNARLUYzAdcxEpjwXWOvqnybn86KfMwqiOunz8eq\n"
+            + "MnTQYECfUrhX2WrbEAjCSc6/LfrTv/S+cO0rvulO/R97gG99pZdWSUjZypU5KLbp\n"
+            + "MBh0qq2wQxO2iagNXE6ms3kV/XihvCpXo9RArmldmW0=\n"
+            + "=lddL\n"
+            + "-----END PGP PUBLIC KEY BLOCK-----\n",
+        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "lQOYBEx+aSUBCADzpZ1h9awUQR1ChzrMhtoE1ltyTlJpS1G5HFEov9QNxVDTjpB8\n"
+            + "PMdb20NNdk/7g6E+ETpCBJGPoC4/TPFDiqe+UI7cRrRZJVbInkCbflYycLTUt9qW\n"
+            + "5c7IuyZA1+cSYaKp3jYccFZfIWvfTWDLWyUozTs9t1TsI28s3r5fBPvrZ+F1nYv/\n"
+            + "xpSkx3Zsxnn7QJTnd63rZdp0RdfJmF2rXERwR6XVtuLj5CqrFoLxy6OrSOl4am4J\n"
+            + "C2HRWhskB21LpdRtloY8bz0DOn6W6JUFRmSxQ1kbPClOXaiNhzMI0fD/KFnHImgR\n"
+            + "IKbbQyHHsKHBjNyn+zTIm5zUL6JMZMf9PoSZABEBAAEAB/wPPOigp4d9VcwxbLkz\n"
+            + "8OwiONDLz5OuY6hHCjsWMBcgTFqffI9TQc7bExW8ur1KVuNm+RdaaSQ8ZhF2YobF\n"
+            + "SV7v02R36NEfMStiDSmvv+E+stdQZXY9kT5TRgcgr5ATUXllo9DhCvKP7Qxs0Q9Q\n"
+            + "cJEcoedGVxiv0xCBLyYbVbm2sW+GJYjq0R5loaOy/Swbt5vOKQsajU8iyA4czSE8\n"
+            + "Ryr63OtwZ1TZsxekj//HKcngnptYY/FT5TPe4uzw8g1tJTIg/OZXrm8CahWzpfE3\n"
+            + "q8lGafhd0GjLftA9ffIHF0cAUs7HklMrgIKGdVPXfQmPzqDpmH5FO2y6QmqTG0v6\n"
+            + "JYW9BAD4Iobwh80MT3JZhJ0jGYMdi07cRyFN+hRwVKgNcBTdx3QGpGJatcyumD0C\n"
+            + "Yn/aXAn+XUkewSgYhdj9sSRodnWGoavdWELxUQkktsdiFg2/rnqmpqRXTGfR/tDh\n"
+            + "ohD2JaPrsavmUF6ShT3stGp8nUN+n6Bhd+QosaCZm5TC1CtA7QQA+16rrNNdP8XN\n"
+            + "MvpQRqJM5ljH0haqR/yD8vdCCZjk23hBk3YsXwSrhSbPzMeZC2FcDqkQTraTxrSG\n"
+            + "U0+xK3NjKKtbzCjQFH4cy4zdNMUX04OWopLGOEnnvTYukGtXT4lZQ9qm8ZBPh5a4\n"
+            + "cXfWy3ovjvRbxUuFOWm0gOfIoRcuWN0D/isTjqPmjihCuWkKTfa3xoq+dD7ynYhg\n"
+            + "Yu3UKfCqbNVor59ZrB4AkQiaVIDLKim3E1XDMS+IukmTuNVXpJeqK32tAYbEduHM\n"
+            + "7kwEq7SgVh34QvryKjCC/EUkDcjSQ+xlUaKl8QKYOdwtH97zZYK6QixB4uNQ6CuM\n"
+            + "75dqTZ6iQw7jQA+0HlRlc3R1c2VyIEggPHRlc3RoQGV4YW1wbGUuY29tPokBOAQT\n"
+            + "AQIAIgUCTH5pJQIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQZcQzxAgO\n"
+            + "VyORcAf/QaHVlyhlBnU4edujW2uG/PFrZvwKfqOKW0QqQ7kVN8okKhnFv4y11IwL\n"
+            + "IzL9mOLYe2+Zyv3I3bz4X8Xw+MsBF6sMWLLf9ieu4Wz/5ScVu0PxY36kgV0AQRiL\n"
+            + "Xk802Vk4t9jElCp9qx/dDln7f3879LLb3wNtfajne8EH0hjR4E3joPoG+IXSvSzW\n"
+            + "cPoZTmAZOKHPcRS8iqy0Ao8/UuQWYCedI/4RS1IJaByk8mmkMkqqV0kuPyDkvGpq\n"
+            + "hfh9zFYh97LuKcJktRTEBp3YMvuGcBDBwofGvYIVEMr7Ci5rowRQO/sxJfI1zNSW\n"
+            + "terWC46v6tOb9IvenOgP0/dQxlU82Z0DmARMfmklAQgAyajPVMt+OXO1ow7xzb0a\n"
+            + "ZYNa5Xdv+w50JzVeWI0boPOuOmq6RCc13NhOmBzx3CKH6zbSRoLBCZWM3cs1EQbl\n"
+            + "+8noaxq6YQVWiaROX8U7CThYA50jONP/qEk655QFsP8Bq96Z5AT/MflxEMayOtQy\n"
+            + "wUFREF4/olhXvJOdurZfQPGnIis35NUcIaubI+gGVsluqWBohLOgqzyF7GMlv+Y2\n"
+            + "JZE5JKGSTO7ZosyI+OCNdZ6X2CJdDPZ1325QHYkmqiMJtb73AYTXurL7NNTxdxQV\n"
+            + "OnfvwXXW4mgHwPEHr8PU30+2xgo1ktrrrpFsd0o2UFhybTe7w1z2sAO1gP5s1bbG\n"
+            + "lwARAQABAAf8C3vFcrqz0Wm5ajOrqV+fZTB5uJ94jP9htengGYLPk/bMcR8qxD7H\n"
+            + "XnAi6Z6cV0DQJKDWkJVZkMYnY2ny96lA53mz9oVrH6NCLkxg+istFXVT7cDBBLdt\n"
+            + "05N3+z/+ovmiirr+YHG4Zowh2Ca4d4kl6sNhbmEvlnsZY++0B7Hi8ru2KgFBag2g\n"
+            + "wDmeVt2+ANJNfJ4uIHUEG+sDSDL4+rxQlBTMhxfVY5+zjbvzPlTf2jyAgDa5zGN2\n"
+            + "vRjB33Z0lbdZTeW7HsJcDsXaS77lKnQeWMmHSvpOXvFSIjnrWpxcMpg8hGY5e5UC\n"
+            + "zLCk+nucY/Od1NbtFYu/e7fl9/n3YnT7AQQA0v/t43Ut3go9vRlb47NN/KpJYL1N\n"
+            + "hh9F/SRzFwWxS+79CiZkf/bgmdJe4XkkS7QJMv+nXhtcko/gfzoaCrvIWIAyvhYa\n"
+            + "7tEbqH+iZ0eaLrQf7bu89Jmp2UNRT1EHLzm38eJ8gg7eNu+SjIhs3wART1KB7GvT\n"
+            + "YmpN5caJA2t2OaEEAPSq7CbvlPDc0qomQSs+NrDnhAv89mQEeksZRmhVa0o4Z7EO\n"
+            + "84DzM+Vxho5fn9h0LtxthhuKWKT8uYN/Qu4Y42cKQuRgMx09+GGwc4GWSC6gJPeP\n"
+            + "oKVJCdZx0l9u8fWQb37gnyH34WDxPvdQx3e4iw/dvruNzu17zmPndkdcyEU3BACD\n"
+            + "yXo21SEflFcfrO16VsITXWc9yweKTSD8Mq7wg2GG6eJPopgtwCLZSlYjnehxD2w2\n"
+            + "38lyr6jGPyITvalVwH6R//676Q2osbQ948Dv2ZcxaTlyla4RyY6E33hsnV9m8ZmM\n"
+            + "PUoNJvFSkKCuPy1N5zaYgUAPKwbEkc3qG+bZm+x2WU2biQEfBBgBAgAJBQJMfmkl\n"
+            + "AhsMAAoJEGXEM8QIDlcjqkQIAI78nwAgO5EgrUDoFikH6d36Kie9SHleaYcSX2c9\n"
+            + "5VqcumuiSAhaulGX0gM/jwvZkoawSyWIq+O2sPSc9F7VzdYdEnWVj2J5BpVx83TR\n"
+            + "PrTu72tsJ97op6JZz+Q8HwTLYJBmyW3/TEKh+iRL9CBtfTVywodZa58j41vCkx37\n"
+            + "NFPwplglT/Se1/US1rWYTH3Kfqo5zNARLUYzAdcxEpjwXWOvqnybn86KfMwqiOun\n"
+            + "z8eqMnTQYECfUrhX2WrbEAjCSc6/LfrTv/S+cO0rvulO/R97gG99pZdWSUjZypU5\n"
+            + "KLbpMBh0qq2wQxO2iagNXE6ms3kV/XihvCpXo9RArmldmW0=\n"
+            + "=voB9\n"
+            + "-----END PGP PRIVATE KEY BLOCK-----\n");
+  }
+
+  /**
+   * pub 2048R/5E9AEDD0 2010-09-01 Key fingerprint = 818D 5D0B 4AE2 A4FE A4C3 C44D D022 DA3A 5E9A
+   * EDD0 uid Testuser I &lt;testi@example.com&gt; sub 2048R/0884E452 2010-09-01
+   */
+  public static TestKey keyI() throws Exception {
+    return new TestKey(
+        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "mQENBEx+aTEBCAC6dFperkew4ZowIfEyAjScjPBggcbw5XUXxLCF0nBRjWH+HvuI\n"
+            + "CGwznRyeuTiy5yyB9/CcvTLTkEs8qIyJUJoikm7QpaVVL6imVq1HD1xcOJpV1FV1\n"
+            + "eFu562xCRDUqD6KQf54N04V9TMDyubhPkQYbx1H2gq+uBEo9d1w6AsSMgaUn3xH/\n"
+            + "xYe+INxcP6jFT2OKc36x+8ipP6pc8Hba1X90JwadOcJlwEyJfJKs7hYHTaYn+I6+\n"
+            + "4w0Y//WebhT4ocsYIiOYrENQUcic+vL3fkwwJCloyDBCGxr7w7Gn4Pe3peTCl4Sp\n"
+            + "vIIoYnHPW4h3Nyh8qAlBNDw7dCPS9LP7wRdNABEBAAG0HlRlc3R1c2VyIEkgPHRl\n"
+            + "c3RpQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTH5pMQIbAwYLCQgHAwIGFQgCCQoL\n"
+            + "BBYCAwECHgECF4AACgkQ0CLaOl6a7dAjNQf/fLmGeKgaesawP53UeioQ8hgDEFKP\n"
+            + "BddNQP248NpReZ1rg3h8Q21PQJVKrtDYn94WJi5NTqUtk9rtx9SiqKaEc3wzIpLc\n"
+            + "nIYrgGLWot5nq+5V1nY9t9QAiJJDrmm2/3tX+jTWW6CpuLih7IsD+gJmpZkY6PfM\n"
+            + "T+teKEeh5E1XBbu10fwDwMJta+043/TiljInjER1f/b41EnSjI6YXFnxnyiLeDgD\n"
+            + "A1QIIzB/W2ccGqphzJriDETDJhKFZIeqvjylZofgCLyMRSyZtsu+b4pfBK3hMpu5\n"
+            + "aaYylaM1BWOpAiqUmGUKqxN/o9EGx4wvsMxK6xgiZe5UdQPaoDcFCsEMg4kBIAQQ\n"
+            + "AQIACgUCTH5xrAMFAXgACgkQoTk8RsLmoZiu2Af8D4PnyWkosYYkcmU4T7CvIHGW\n"
+            + "Qnx4KsnYWaAqYrYrorL6R+f8SZ5caGwj05UOvHnqx/Ij0a1Zv4MpEuzB0se1XkyQ\n"
+            + "eCLdAIKVodfiepsCHyqW6/mc9LV2qKS1HF5x5LwDkI1atOuPt/O14fch4E0beTbl\n"
+            + "FXzGo7YdpH8RunV8l+i3FxxTcUtUkij3Ro4EMwVF/6YG8gBOd08GxWspEQWBH3GK\n"
+            + "k7Repj4IPwXCoEfU1H+XJNPaM5cnt+L87QfbhNOWmHmWhhrOmZg160joODON8w8x\n"
+            + "j3gma9Cp6luPDEQC3XnsEup3BdCdIciG5JS6JA/2GDeulg+eS4x9Xkmmp6nzObkB\n"
+            + "DQRMfmkxAQgAxeT+bUBbADga+lYtkmtYVbuG7uWjwdg9TR6qWKD7n37mcu6OgNNl\n"
+            + "rPaHoClvOL20fcArZ8wT/FbjvDI6ZHn22YA19OvAR+Eqmf3D7qTmebchnCu955Pk\n"
+            + "X7AOOpKfX48qoYq8BoskZDnbFidm5YKfIin3CNDdlQbd3na+ihGCuv0KoGzefuAH\n"
+            + "cITeYEUESh7HLzQ9/pMES9eCgdTEkwYD5NJjfkLnj2kZtDsSiNnENZ0TIlyKOBMn\n"
+            + "ixgsARDjLrkqyTg79thWALiqVBXUKn2NBtMkK5xTDc/7q3nIw4InYMIrLtntSu1w\n"
+            + "pn1gXbdg1HFl5BgqEB9Fp0k02YvrSiiVswARAQABiQEfBBgBAgAJBQJMfmkxAhsM\n"
+            + "AAoJENAi2jpemu3QFPoH/1ynX1j1QWL8TfJFPoB3vXivwGURs3J7LsywHTRjpQVQ\n"
+            + "vxQvKTzB1+woUxtEbdjKgMbvY/ShHSlEZKVV9l3ZihrNewHA1GMHrDtBGXcNRP9B\n"
+            + "RfJHTrDzjUxrEEwu4QIq71o4tS89NvQmlYYi7O4ThtVB4hYSwl436+vAT9ybIQkU\n"
+            + "OjCkYrKye6JHs1K4BnVuWcOVujQwW4H8QFbddcWF49uN6DSqrwDFsjFog6wL7u6V\n"
+            + "UL5upRBP/RZWA4HKJVF2tS0Ptr6xLTmf4Tp5n10CGFYkPcRp9biVyeVRJBW4uZf0\n"
+            + "EDsn9J5rNG0pWtgnhAEi6smoT4fADTOzpOovUiTSQhQ=\n"
+            + "=SiG3\n"
+            + "-----END PGP PUBLIC KEY BLOCK-----\n",
+        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "lQOYBEx+aTEBCAC6dFperkew4ZowIfEyAjScjPBggcbw5XUXxLCF0nBRjWH+HvuI\n"
+            + "CGwznRyeuTiy5yyB9/CcvTLTkEs8qIyJUJoikm7QpaVVL6imVq1HD1xcOJpV1FV1\n"
+            + "eFu562xCRDUqD6KQf54N04V9TMDyubhPkQYbx1H2gq+uBEo9d1w6AsSMgaUn3xH/\n"
+            + "xYe+INxcP6jFT2OKc36x+8ipP6pc8Hba1X90JwadOcJlwEyJfJKs7hYHTaYn+I6+\n"
+            + "4w0Y//WebhT4ocsYIiOYrENQUcic+vL3fkwwJCloyDBCGxr7w7Gn4Pe3peTCl4Sp\n"
+            + "vIIoYnHPW4h3Nyh8qAlBNDw7dCPS9LP7wRdNABEBAAEAB/oCD6EKLvjXgItlqdm/\n"
+            + "X+OWMYHDCtuRCMW7+2gEw/TxfLeGJaOHWxAouwUIArEEb/hjdaRfIg4wdJUxmyPX\n"
+            + "WyNqUdupkjdXNa7RNaesIi0ilrdZOn7NlHWJCCXwKt2R0jd2p8PDED6CWaE1+76I\n"
+            + "/IuwOHDTD8MABke3KvHDXMxjzdeuRbm670Aqz6zTVY+BZG1GH63Ef5JEyezMgAU5\n"
+            + "42+v+OgD0W0/jCxF7jt2ddP9QiOzu0q65mI4qlOuSebxjH8P7ye0LU9EuWVgAcwc\n"
+            + "YJh2lk3eH8bCWTwlIHj4+8MYgY5i510I5xfY3sWuylw/qtFP9vYjisrysadcUExc\n"
+            + "QUxFBADXQSCmvtgRoSLiGfQv2y2qInx67eJw8pUXFEIJKdOFOhX4vogT9qPWQAms\n"
+            + "/vSshcsAPgpZJZ8MNeGpMGLAGm8y4D2zWWd9YLNmVXsPu7EyrDpXlKHCFnsQfOGN\n"
+            + "c5j8u4CHBn1cS/Yk53S+6Yge2jvnOjVNFmxB0ocs0Y5zbdTJYwQA3b+hQebH7NNr\n"
+            + "FlPwthRZS0TiX5+qkE9tE/0mpRrUN3iS9bnF0IXRmHFp7Hz+EsVbA2Re2A5HIHnQ\n"
+            + "/BSpAsSHRhjU3MH4gzwfg9W43eZGVfofSY6IlUCIcd1bGjSAjJgmfhjU7ofS59i/\n"
+            + "DjzP1jBfXdjOEUQULTkXjHPqO7j4048D/jqMwZNY3AawTMjqKr9nGK49aWv/OVdy\n"
+            + "6xGn4dRJNk3gnnIvjAEFy5+HHbUCJ2lA3X2AssQ9tvbuyDnoSL5/G+zEYtyRuAC5\n"
+            + "9TLQQRmy4qjsYC5TwfoUwFbgqRsmGUcjj2wtE+gb1S8P/zudYrEqOD3K60Y5qXcn\n"
+            + "S3PHgJ++5TzFQba0HlRlc3R1c2VyIEkgPHRlc3RpQGV4YW1wbGUuY29tPokBOAQT\n"
+            + "AQIAIgUCTH5pMQIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQ0CLaOl6a\n"
+            + "7dAjNQf/fLmGeKgaesawP53UeioQ8hgDEFKPBddNQP248NpReZ1rg3h8Q21PQJVK\n"
+            + "rtDYn94WJi5NTqUtk9rtx9SiqKaEc3wzIpLcnIYrgGLWot5nq+5V1nY9t9QAiJJD\n"
+            + "rmm2/3tX+jTWW6CpuLih7IsD+gJmpZkY6PfMT+teKEeh5E1XBbu10fwDwMJta+04\n"
+            + "3/TiljInjER1f/b41EnSjI6YXFnxnyiLeDgDA1QIIzB/W2ccGqphzJriDETDJhKF\n"
+            + "ZIeqvjylZofgCLyMRSyZtsu+b4pfBK3hMpu5aaYylaM1BWOpAiqUmGUKqxN/o9EG\n"
+            + "x4wvsMxK6xgiZe5UdQPaoDcFCsEMg50DmARMfmkxAQgAxeT+bUBbADga+lYtkmtY\n"
+            + "VbuG7uWjwdg9TR6qWKD7n37mcu6OgNNlrPaHoClvOL20fcArZ8wT/FbjvDI6ZHn2\n"
+            + "2YA19OvAR+Eqmf3D7qTmebchnCu955PkX7AOOpKfX48qoYq8BoskZDnbFidm5YKf\n"
+            + "Iin3CNDdlQbd3na+ihGCuv0KoGzefuAHcITeYEUESh7HLzQ9/pMES9eCgdTEkwYD\n"
+            + "5NJjfkLnj2kZtDsSiNnENZ0TIlyKOBMnixgsARDjLrkqyTg79thWALiqVBXUKn2N\n"
+            + "BtMkK5xTDc/7q3nIw4InYMIrLtntSu1wpn1gXbdg1HFl5BgqEB9Fp0k02YvrSiiV\n"
+            + "swARAQABAAf/VXp4O5CUvh9956vZu2kKmt2Jhx9CALT6pZkdU3MVvOr/d517iEHH\n"
+            + "pVJHevLqy8OFdtvO4+LOryyI6f14I3ZbHc+3frdmMqYb1LA8NZScyO5FYkOyn5jO\n"
+            + "CFbvjnVOyeP5MhXO6bSoX3JuI7+ZPoGRYxxlTDWLwJdatoDsBI9TvJhVekyAchTH\n"
+            + "Tyt3NQIvLXqHvKU/8WAgclBKeL/y/idep1BrJ4cIJ+EFp0agEG0WpRRUAYjwfE3P\n"
+            + "aSEV0NOoB8rapPW3XuEjO+ZTht+NYvqgPIdTjwXZGFPYnwvEuz772Th4pO3o/PdF\n"
+            + "2cljvRn3qo+lSVnJ0Ki2pb+LukJSIdfHgQQA1DBdm29a/3dBla2y6wxlSXW/3WBp\n"
+            + "51Vpd8SBuwdVrNNQMwPmf1L93YskJnUKSTo7MwgrYZFWf7QzgfD/cHXr8QK2C1TP\n"
+            + "czUC0/uFCm8pPQoOt/osp3PjDAzGgUAMFXCgLtb04P2JqbFvtse5oTFWrKqmscTG\n"
+            + "KnEBkzfgy37U0iMEAO7BEgXCYvqyztHmQATqJfbpxgQGqk738UW6qWwG8mK6aT5V\n"
+            + "OidZvrWqJ3WeIKmEhoJlY2Ky1ZTuJfeQuVucqzNWlZy2yzDijs+t3v4pFGajv4nV\n"
+            + "ivGvlb/O/QoHBuF/9K36lIIqcZstfa2UIYRqkkdEz2JHWJsr81VvCw2Gb38xA/sG\n"
+            + "hqErrIgSBPRCJObM/gb9rJ6dbA5SNY5trc778EjS1myhyPhGOaOmYbdQMONUqLo2\n"
+            + "q1UZo1G7oaI1Um9v5MXN1yZNX/kvx1TMldZEEixrhCIob81eXSpEUfs+Mz2RqvqT\n"
+            + "YsYquYQNPrPXWZQwTJV6fpsBQUMeE/pmlisaSAijHkXPiQEfBBgBAgAJBQJMfmkx\n"
+            + "AhsMAAoJENAi2jpemu3QFPoH/1ynX1j1QWL8TfJFPoB3vXivwGURs3J7LsywHTRj\n"
+            + "pQVQvxQvKTzB1+woUxtEbdjKgMbvY/ShHSlEZKVV9l3ZihrNewHA1GMHrDtBGXcN\n"
+            + "RP9BRfJHTrDzjUxrEEwu4QIq71o4tS89NvQmlYYi7O4ThtVB4hYSwl436+vAT9yb\n"
+            + "IQkUOjCkYrKye6JHs1K4BnVuWcOVujQwW4H8QFbddcWF49uN6DSqrwDFsjFog6wL\n"
+            + "7u6VUL5upRBP/RZWA4HKJVF2tS0Ptr6xLTmf4Tp5n10CGFYkPcRp9biVyeVRJBW4\n"
+            + "uZf0EDsn9J5rNG0pWtgnhAEi6smoT4fADTOzpOovUiTSQhQ=\n"
+            + "=RcWw\n"
+            + "-----END PGP PRIVATE KEY BLOCK-----\n");
+  }
+
+  /**
+   * pub 2048R/C2E6A198 2010-09-01 Key fingerprint = 83AB CE4D 6845 D6DA F7FB AA47 A139 3C46 C2E6
+   * A198 uid Testuser J &lt;testj@example.com&gt; sub 2048R/863E8ABF 2010-09-01
+   */
+  public static TestKey keyJ() throws Exception {
+    return new TestKey(
+        "-----BEGIN PGP PUBLIC KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "mQENBEx+aUgBCADczNio9UWnUggUZkdqJye57497oD9vNo9rmtR+i1TkMpVeWaMH\n"
+            + "UWrm1twzIPV9D4lAWLJoG2cYF6nXG1JxsKc9mOIZ6O1WfsopMUU0p+EfU8H/cvdM\n"
+            + "/iccYS6OnNL4/xR1R7hlA4+b/jaOZfzdS3i5jwOf+TtCk7c5qOuFhraiVQ9H1G86\n"
+            + "+LsiWVeXEFc/FXxnESRmbaZFNJrAdJl23eKXRC6az0S5FwMVBvUhRpLwIGDbVT/0\n"
+            + "/QwaNUOq3bYwudPREFLg/1HtBuxNhRdV6mCrit+tsPan9o0/WtsHuq8n4/pqOKBc\n"
+            + "RRmOIQR9SEohE2TuVT3XVFpMXa4a4CBuNXjTABEBAAG0HlRlc3R1c2VyIEogPHRl\n"
+            + "c3RqQGV4YW1wbGUuY29tPokBOAQTAQIAIgUCTH5pSAIbAwYLCQgHAwIGFQgCCQoL\n"
+            + "BBYCAwECHgECF4AACgkQoTk8RsLmoZi0BggAlnbCwmwaLwcpU9YcOE9/8KF56dIs\n"
+            + "XhdxzqdP91UmhVT0df1OBhgTqFkKprBLCT+B9yBClsnyXMatkvuhQG6C7lw9toMO\n"
+            + "TITRPZoFJe3Ezi+HRRPqAPubIcSgeILuilvFhkoUOgoC1ubmVPgcGBLb8tdvI3bA\n"
+            + "svq+n2jaYUlgL5N6ZNRNakc07e8vH5SeKiD8ZntJlTU49fkxzlawtDaI3+GhyUiB\n"
+            + "0Ah8pl143DFNAq8CfvQCPKwX4WFPkEflh0LlgaEPJUZ/H6KxKXXF8SC9cD2VIii8\n"
+            + "Yrue8y9T+j5y699A0GCptb1IKrgxbfhgD//3g3l1eXsEwn2cwFNCt7pZFLkBDQRM\n"
+            + "fmlIAQgA3E2pM6oDJGgfxbqSfykuRtTbiAi7JEd1DNvEe6gJ7qkBLM4ipILBD0qR\n"
+            + "qCwL37E4/3nMsZjA7GIFLQj2DrFW3aEEKwR/zdh7R67lo9CunCY+FPWTuOkCG8Sh\n"
+            + "3RLpbAV6I61NG/wDznW30vmKNJDgPpkzYj8u0T4MtpywEgxTxCqWZKCufWDRfNAy\n"
+            + "IBLt+piG+bcYKfw9pS8PvXPQMNIi4U2pu3hb/BHC3Y1A8FVpEe4CFV7rWb/K2Ydx\n"
+            + "eBxwwxm9sBxF+vhlI+ZEeb9JxGH6jYlc6twD4e6p3KqusAKLKiLsS5uLQnpMGGZ8\n"
+            + "vcpTSfyHjG2QHc3qG9S/yDCZjhhe2QARAQABiQEfBBgBAgAJBQJMfmlIAhsMAAoJ\n"
+            + "EKE5PEbC5qGYClMIANTdZ+/g/FPl1Lm0tO1CSnHVHekeGNA9n3L6SGiSZQJjEDo0\n"
+            + "gsye5xgxh5JGKf7CqbEFfeLC9Jx5W5EN4dVFudncIlC/SutfRzdt5W8CLXMl0c41\n"
+            + "5FmtpWNStk3MglkcjE5PrRRrSiRc45S0e2kIPb8eiVKg98/rCToC9+Qn3pMi/fcM\n"
+            + "LVpYE+dhvB5EhOSwBWWgvWXzeLhv5CnBKxH0ItHhNwvt8qPOHgQAJKPc6dV888xn\n"
+            + "Sew62LFefHPnGTHLP8RRgVIvZBG5IoovxSz89QGHQZiC4xv00I7zNwmtr6eEcl+y\n"
+            + "BkUK9QWITEBHUDqR+cbVa2dRr3fUHwRP7G2G+ow=\n"
+            + "=ucAX\n"
+            + "-----END PGP PUBLIC KEY BLOCK-----\n",
+        "-----BEGIN PGP PRIVATE KEY BLOCK-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "lQOYBEx+aUgBCADczNio9UWnUggUZkdqJye57497oD9vNo9rmtR+i1TkMpVeWaMH\n"
+            + "UWrm1twzIPV9D4lAWLJoG2cYF6nXG1JxsKc9mOIZ6O1WfsopMUU0p+EfU8H/cvdM\n"
+            + "/iccYS6OnNL4/xR1R7hlA4+b/jaOZfzdS3i5jwOf+TtCk7c5qOuFhraiVQ9H1G86\n"
+            + "+LsiWVeXEFc/FXxnESRmbaZFNJrAdJl23eKXRC6az0S5FwMVBvUhRpLwIGDbVT/0\n"
+            + "/QwaNUOq3bYwudPREFLg/1HtBuxNhRdV6mCrit+tsPan9o0/WtsHuq8n4/pqOKBc\n"
+            + "RRmOIQR9SEohE2TuVT3XVFpMXa4a4CBuNXjTABEBAAEAB/9sW1MQR53xKP6yFCeD\n"
+            + "3sdOJlSB1PiMeXgU1JznpTT58CEBdnfdRYVy14qkxM30m8U9gMm88YW8exBscgoZ\n"
+            + "pRnNztNW58phokNPx9AwsRp3p0ETPbZDYI6NDNwuPKQEchn2HEZPvFmjsjPP2hkn\n"
+            + "+Lu8RIUA4uzEFX3bnBxJIP1L2AztqyTgHDfXS4/nqerO/cheXhN7j1TUyRO4hinp\n"
+            + "C3WXaxm2kpQXFP2ktq2eu7YPFoW6I6HzHVDN2Z7fD/NzfmR2h4gcIaSDEjIs893N\n"
+            + "b3hsYiOTYwVFX9TBWLr9rSWyrjR4sWelFuMZpjQ53qq+rBm/+8knoNtoWgZFhbR0\n"
+            + "WJyRBADlBuX8kveqLl31QShgw+6TwTHXI40GiCA6DHwZiTstOO6d2KDNq2nHdtuo\n"
+            + "HBvSKYP4a2na39JKb7YfuSMg16QvxQNd7BQWz+NzbGLQEGuX455OD3TE74ZfVElo\n"
+            + "2H/i51hSjOdWihJVNBGlcDYPgb7oLLTbPdKXxptRM1+wrk2//QQA9s3pw2O3lSbV\n"
+            + "U8JyL/FhdyhDvRDuiNBPnB4O/Ynnzz8YSFwSdSE/u8FpguFWdh+UdSrdwE+Ux8kj\n"
+            + "W/miXaqTxUeKnpzOkiO5O2fLvAeriO3rU9KfBER03+NJo4weSorLXzeU4SWkw63N\n"
+            + "OiY3fc67Nj+l8qi1tmoEJyHUomuy7Q8EAOfBvMzGsQQJ12k+4gOSXN9DTWUa85P6\n"
+            + "IphFHC2cpTDy30IRR55sI6Mf3GpC+KzxEyw7WXjlTensEJAHMpyVVRhv6uF0eMaY\n"
+            + "+QGS+vyCgtUfGIwM5Teu6NjeqyShJDTC8qnM+75JgCNu6gZ2F2iTeY+tM3zE1auq\n"
+            + "po1pUACVm7qwR6u0HlRlc3R1c2VyIEogPHRlc3RqQGV4YW1wbGUuY29tPokBOAQT\n"
+            + "AQIAIgUCTH5pSAIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQoTk8RsLm\n"
+            + "oZi0BggAlnbCwmwaLwcpU9YcOE9/8KF56dIsXhdxzqdP91UmhVT0df1OBhgTqFkK\n"
+            + "prBLCT+B9yBClsnyXMatkvuhQG6C7lw9toMOTITRPZoFJe3Ezi+HRRPqAPubIcSg\n"
+            + "eILuilvFhkoUOgoC1ubmVPgcGBLb8tdvI3bAsvq+n2jaYUlgL5N6ZNRNakc07e8v\n"
+            + "H5SeKiD8ZntJlTU49fkxzlawtDaI3+GhyUiB0Ah8pl143DFNAq8CfvQCPKwX4WFP\n"
+            + "kEflh0LlgaEPJUZ/H6KxKXXF8SC9cD2VIii8Yrue8y9T+j5y699A0GCptb1IKrgx\n"
+            + "bfhgD//3g3l1eXsEwn2cwFNCt7pZFJ0DmARMfmlIAQgA3E2pM6oDJGgfxbqSfyku\n"
+            + "RtTbiAi7JEd1DNvEe6gJ7qkBLM4ipILBD0qRqCwL37E4/3nMsZjA7GIFLQj2DrFW\n"
+            + "3aEEKwR/zdh7R67lo9CunCY+FPWTuOkCG8Sh3RLpbAV6I61NG/wDznW30vmKNJDg\n"
+            + "PpkzYj8u0T4MtpywEgxTxCqWZKCufWDRfNAyIBLt+piG+bcYKfw9pS8PvXPQMNIi\n"
+            + "4U2pu3hb/BHC3Y1A8FVpEe4CFV7rWb/K2YdxeBxwwxm9sBxF+vhlI+ZEeb9JxGH6\n"
+            + "jYlc6twD4e6p3KqusAKLKiLsS5uLQnpMGGZ8vcpTSfyHjG2QHc3qG9S/yDCZjhhe\n"
+            + "2QARAQABAAf7BUTPxk/u/vi935DpBXoXRKHZnLM3bFuIexCGQ74rQqR2qazUMH8o\n"
+            + "SFEsaBJpm2WyR47J5WqSHNi5SxPT2AUdNFeh/39hxY61Q6SuBFED+WMRbHrKbURR\n"
+            + "WjPiFuwus02eAkAYFWfBFY0n9/BcAhicQa90MTRj+RZb/EHa+GDdbgDatpwEK22z\n"
+            + "pPb3t/D2TC7ModizelngBN7bdp4Vqna/vMLhsiE+FqL+Ob0KiLkDxtcjZljc9xLK\n"
+            + "B7ZuGH/AZfhF08OAxUcsJdu5cF3viBT+HeSI4OUvdfxPFX98U/SFfuW4mPdHPEI9\n"
+            + "438pdjDUIpJFtcnROtZdS2o6C9ohHa5BUwQA52P8AKKRfg7LpaFMvtKkNORnscac\n"
+            + "1qvXLqAXaMeSsvyU5o1GNvSgbhFzDcXbAFJcXdOo2XgT7JzW/6v1uW9AuQPAkYhr\n"
+            + "ep0uE3mewlzWHZR41MQRaMGN4l80RN6ju4c/Ei+OMHYp2DUfZFDBXbxwWpN8tNoR\n"
+            + "S1X+rOL5RsQgkrcEAPO7zthR+GQnIgJC3c9Las9JkPywCxddjoWZoyt6yITVjIso\n"
+            + "IGD0SJppAkOS3Vdb+raydLuN7HmbpPFnvzyc+RdSt+YCGUObrHb/z9MfahzDNG3S\n"
+            + "VwUQEIl+L6glhwscQOCz80MCcYMFMk4TiankvChRFF5Wil//8QnaonH4bcrvA/46\n"
+            + "VB+ZaEdR+Z8IkYIf7oHLJNEwaH+kRTBQ2x5F9Gnwr9SL6AXAkNkvYD4in/+Bw35r\n"
+            + "o9zGirQQvNrvH3JlZ5PWp1/9rRl2Tefaaf8P2ij/Ky2poBLAhPwK56JXHLt5v+BZ\n"
+            + "mQwhY+teJnbfCwiiS0OeWtpVY/tDVU7wYOd2RIhVfkUziQEfBBgBAgAJBQJMfmlI\n"
+            + "AhsMAAoJEKE5PEbC5qGYClMIANTdZ+/g/FPl1Lm0tO1CSnHVHekeGNA9n3L6SGiS\n"
+            + "ZQJjEDo0gsye5xgxh5JGKf7CqbEFfeLC9Jx5W5EN4dVFudncIlC/SutfRzdt5W8C\n"
+            + "LXMl0c415FmtpWNStk3MglkcjE5PrRRrSiRc45S0e2kIPb8eiVKg98/rCToC9+Qn\n"
+            + "3pMi/fcMLVpYE+dhvB5EhOSwBWWgvWXzeLhv5CnBKxH0ItHhNwvt8qPOHgQAJKPc\n"
+            + "6dV888xnSew62LFefHPnGTHLP8RRgVIvZBG5IoovxSz89QGHQZiC4xv00I7zNwmt\n"
+            + "r6eEcl+yBkUK9QWITEBHUDqR+cbVa2dRr3fUHwRP7G2G+ow=\n"
+            + "=NiQI\n"
+            + "-----END PGP PRIVATE KEY BLOCK-----\n");
+  }
+
+  private TestTrustKeys() {}
+}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/AdvertisedObjectsCacheKey.java b/java/com/google/gerrit/httpd/AdvertisedObjectsCacheKey.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/AdvertisedObjectsCacheKey.java
rename to java/com/google/gerrit/httpd/AdvertisedObjectsCacheKey.java
diff --git a/java/com/google/gerrit/httpd/AllRequestFilter.java b/java/com/google/gerrit/httpd/AllRequestFilter.java
new file mode 100644
index 0000000..9d171d5
--- /dev/null
+++ b/java/com/google/gerrit/httpd/AllRequestFilter.java
@@ -0,0 +1,174 @@
+// Copyright (C) 2012 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.google.gerrit.httpd;
+
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.server.plugins.Plugin;
+import com.google.gerrit.server.plugins.StopPluginListener;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.google.inject.internal.UniqueAnnotations;
+import com.google.inject.servlet.ServletModule;
+import java.io.IOException;
+import java.util.Iterator;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+
+/** Filters all HTTP requests passing through the server. */
+public abstract class AllRequestFilter implements Filter {
+  public static ServletModule module() {
+    return new ServletModule() {
+      @Override
+      protected void configureServlets() {
+        DynamicSet.setOf(binder(), AllRequestFilter.class);
+        filter("/*").through(FilterProxy.class);
+
+        bind(StopPluginListener.class)
+            .annotatedWith(UniqueAnnotations.create())
+            .to(FilterProxy.class);
+      }
+    };
+  }
+
+  @Singleton
+  static class FilterProxy implements Filter, StopPluginListener {
+    private final DynamicSet<AllRequestFilter> filters;
+
+    private DynamicSet<AllRequestFilter> initializedFilters;
+    private FilterConfig filterConfig;
+
+    @Inject
+    FilterProxy(DynamicSet<AllRequestFilter> filters) {
+      this.filters = filters;
+      this.initializedFilters = new DynamicSet<>();
+      this.filterConfig = null;
+    }
+
+    /**
+     * Initializes a filter if needed
+     *
+     * @param filter The filter that should get initialized
+     * @return {@code true} iff filter is now initialized
+     * @throws ServletException if filter itself fails to init
+     */
+    private synchronized boolean initFilterIfNeeded(AllRequestFilter filter)
+        throws ServletException {
+      boolean ret = true;
+      if (filters.contains(filter)) {
+        // Regardless of whether or not the caller checked filter's
+        // containment in initializedFilters, we better re-check as we're now
+        // synchronized.
+        if (!initializedFilters.contains(filter)) {
+          filter.init(filterConfig);
+          initializedFilters.add("gerrit", filter);
+        }
+      } else {
+        ret = false;
+      }
+      return ret;
+    }
+
+    private synchronized void cleanUpInitializedFilters() {
+      Iterable<AllRequestFilter> filtersToCleanUp = initializedFilters;
+      initializedFilters = new DynamicSet<>();
+      for (AllRequestFilter filter : filtersToCleanUp) {
+        if (filters.contains(filter)) {
+          initializedFilters.add("gerrit", filter);
+        } else {
+          filter.destroy();
+        }
+      }
+    }
+
+    @Override
+    public void doFilter(ServletRequest req, ServletResponse res, FilterChain last)
+        throws IOException, ServletException {
+      final Iterator<AllRequestFilter> itr = filters.iterator();
+      new FilterChain() {
+        @Override
+        public void doFilter(ServletRequest req, ServletResponse res)
+            throws IOException, ServletException {
+          while (itr.hasNext()) {
+            AllRequestFilter filter = itr.next();
+            // To avoid {@code synchronized} on the whole filtering (and
+            // thereby killing concurrency), we start the below disjunction
+            // with an unsynchronized check for containment. This
+            // unsynchronized check is always correct if no filters got
+            // initialized/cleaned concurrently behind our back.
+            // The case of concurrently initialized filters is saved by the
+            // call to initFilterIfNeeded. So that's fine too.
+            // The case of concurrently cleaned filters between the {@code if}
+            // condition and the call to {@code doFilter} is not saved by
+            // anything. If a filter is getting removed concurrently while
+            // another thread is in those two lines, doFilter might (but need
+            // not) fail.
+            //
+            // Since this failure only occurs if a filter is deleted
+            // (e.g.: a plugin reloaded) exactly when a thread is in those
+            // two lines, and it only breaks a single request, we're ok with
+            // it, given that this is really both really improbable and also
+            // the "proper" fix for it would basically kill concurrency of
+            // webrequests.
+            if (initializedFilters.contains(filter) || initFilterIfNeeded(filter)) {
+              filter.doFilter(req, res, this);
+              return;
+            }
+          }
+          last.doFilter(req, res);
+        }
+      }.doFilter(req, res);
+    }
+
+    @Override
+    public void init(FilterConfig config) throws ServletException {
+      // Plugins that provide AllRequestFilters might get loaded later at
+      // runtime, long after this init method had been called. To allow to
+      // correctly init such plugins' AllRequestFilters, we keep the
+      // FilterConfig around, and reuse it to lazy init the AllRequestFilters.
+      filterConfig = config;
+
+      for (AllRequestFilter f : filters) {
+        initFilterIfNeeded(f);
+      }
+    }
+
+    @Override
+    public synchronized void destroy() {
+      Iterable<AllRequestFilter> filtersToDestroy = initializedFilters;
+      initializedFilters = new DynamicSet<>();
+      for (AllRequestFilter filter : filtersToDestroy) {
+        filter.destroy();
+      }
+    }
+
+    @Override
+    public void onStopPlugin(Plugin plugin) {
+      // In order to allow properly garbage collection, we need to scrub
+      // initializedFilters clean of filters stemming from plugins as they
+      // get unloaded.
+      cleanUpInitializedFilters();
+    }
+  }
+
+  @Override
+  public void init(FilterConfig config) throws ServletException {}
+
+  @Override
+  public void destroy() {}
+}
diff --git a/java/com/google/gerrit/httpd/BUILD b/java/com/google/gerrit/httpd/BUILD
new file mode 100644
index 0000000..2294d0e
--- /dev/null
+++ b/java/com/google/gerrit/httpd/BUILD
@@ -0,0 +1,47 @@
+java_library(
+    name = "httpd",
+    srcs = glob(["**/*.java"]),
+    resource_strip_prefix = "resources",
+    resources = [
+        "//resources/com/google/gerrit/httpd",
+        "//resources/com/google/gerrit/httpd/raw",
+    ],
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/common:annotations",
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/launcher",
+        "//java/com/google/gerrit/lifecycle",
+        "//java/com/google/gerrit/metrics",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/server/audit",
+        "//java/com/google/gerrit/server/git/receive",
+        "//java/com/google/gerrit/server/ioutil",
+        "//java/com/google/gerrit/server/logging",
+        "//java/com/google/gerrit/server/restapi",
+        "//java/com/google/gerrit/server/util/time",
+        "//java/com/google/gerrit/util/cli",
+        "//java/com/google/gerrit/util/http",
+        "//java/org/eclipse/jgit:server",
+        "//lib:args4j",
+        "//lib:gson",
+        "//lib:guava",
+        "//lib:gwtjsonrpc",
+        "//lib:gwtorm",
+        "//lib:jsch",
+        "//lib:servlet-api-3_1",
+        "//lib:soy",
+        "//lib/auto:auto-value",
+        "//lib/auto:auto-value-annotations",
+        "//lib/commons:codec",
+        "//lib/commons:lang",
+        "//lib/flogger:api",
+        "//lib/guice",
+        "//lib/guice:guice-assistedinject",
+        "//lib/guice:guice-servlet",
+        "//lib/jgit/org.eclipse.jgit.http.server:jgit-servlet",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+    ],
+)
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/CacheBasedWebSession.java b/java/com/google/gerrit/httpd/CacheBasedWebSession.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/CacheBasedWebSession.java
rename to java/com/google/gerrit/httpd/CacheBasedWebSession.java
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/CanonicalWebUrl.java b/java/com/google/gerrit/httpd/CanonicalWebUrl.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/CanonicalWebUrl.java
rename to java/com/google/gerrit/httpd/CanonicalWebUrl.java
diff --git a/java/com/google/gerrit/httpd/ContainerAuthFilter.java b/java/com/google/gerrit/httpd/ContainerAuthFilter.java
new file mode 100644
index 0000000..d13f2f6
--- /dev/null
+++ b/java/com/google/gerrit/httpd/ContainerAuthFilter.java
@@ -0,0 +1,134 @@
+// Copyright (C) 2011 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.google.gerrit.httpd;
+
+import static com.google.common.base.MoreObjects.firstNonNull;
+import static com.google.common.base.Strings.emptyToNull;
+import static com.google.common.net.HttpHeaders.AUTHORIZATION;
+import static com.google.gerrit.extensions.api.lfs.LfsDefinitions.CONTENTTYPE_VND_GIT_LFS_JSON;
+import static com.google.gerrit.httpd.GerritAuthModule.NOT_AUTHORIZED_LFS_URL_REGEX;
+import static javax.servlet.http.HttpServletResponse.SC_FORBIDDEN;
+import static javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.httpd.restapi.RestApiServlet;
+import com.google.gerrit.server.AccessPath;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.config.AuthConfig;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Locale;
+import java.util.Optional;
+import java.util.regex.Pattern;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.eclipse.jgit.lib.Config;
+
+/**
+ * Trust the authentication which is done by the container.
+ *
+ * <p>Check whether the container has already authenticated the user. If yes, then lookup the
+ * account and set the account ID in our current session.
+ *
+ * <p>This filter should only be configured to run, when authentication is configured to trust
+ * container authentication. This filter is intended to protect the {@link GitOverHttpServlet} and
+ * its handled URLs, which provide remote repository access over HTTP. It also protects {@link
+ * RestApiServlet}.
+ */
+@Singleton
+class ContainerAuthFilter implements Filter {
+  private static final String LFS_AUTH_PREFIX = "Ssh: ";
+  private static final Pattern LFS_ENDPOINT = Pattern.compile(NOT_AUTHORIZED_LFS_URL_REGEX);
+
+  private final DynamicItem<WebSession> session;
+  private final AccountCache accountCache;
+  private final Config config;
+  private final String loginHttpHeader;
+
+  @Inject
+  ContainerAuthFilter(
+      DynamicItem<WebSession> session,
+      AccountCache accountCache,
+      AuthConfig authConfig,
+      @GerritServerConfig Config config) {
+    this.session = session;
+    this.accountCache = accountCache;
+    this.config = config;
+
+    loginHttpHeader = firstNonNull(emptyToNull(authConfig.getLoginHttpHeader()), AUTHORIZATION);
+  }
+
+  @Override
+  public void init(FilterConfig config) {}
+
+  @Override
+  public void destroy() {}
+
+  @Override
+  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+      throws IOException, ServletException {
+    HttpServletRequest req = (HttpServletRequest) request;
+    HttpServletResponse rsp = (HttpServletResponse) response;
+
+    if (verify(req, rsp)) {
+      chain.doFilter(req, response);
+    }
+  }
+
+  private boolean verify(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
+    String username = RemoteUserUtil.getRemoteUser(req, loginHttpHeader);
+    if (username == null) {
+      if (isLfsOverSshRequest(req)) {
+        // LFS-over-SSH auth request cannot be authorized by container
+        // therefore let it go through the filter
+        return true;
+      }
+      rsp.sendError(SC_FORBIDDEN);
+      return false;
+    }
+    if (config.getBoolean("auth", "userNameToLowerCase", false)) {
+      username = username.toLowerCase(Locale.US);
+    }
+    Optional<AccountState> who =
+        accountCache.getByUsername(username).filter(a -> a.getAccount().isActive());
+    if (!who.isPresent()) {
+      rsp.sendError(SC_UNAUTHORIZED);
+      return false;
+    }
+    WebSession ws = session.get();
+    ws.setUserAccountId(who.get().getAccount().getId());
+    ws.setAccessPathOk(AccessPath.GIT, true);
+    ws.setAccessPathOk(AccessPath.REST_API, true);
+    return true;
+  }
+
+  private static boolean isLfsOverSshRequest(HttpServletRequest req) {
+    String hdr = req.getHeader(AUTHORIZATION);
+    return CONTENTTYPE_VND_GIT_LFS_JSON.equals(req.getContentType())
+        && !Strings.isNullOrEmpty(hdr)
+        && hdr.startsWith(LFS_AUTH_PREFIX)
+        && LFS_ENDPOINT.matcher(req.getRequestURI()).matches();
+  }
+}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/CookieBase64.java b/java/com/google/gerrit/httpd/CookieBase64.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/CookieBase64.java
rename to java/com/google/gerrit/httpd/CookieBase64.java
diff --git a/java/com/google/gerrit/httpd/DirectChangeByCommit.java b/java/com/google/gerrit/httpd/DirectChangeByCommit.java
new file mode 100644
index 0000000..152a83d
--- /dev/null
+++ b/java/com/google/gerrit/httpd/DirectChangeByCommit.java
@@ -0,0 +1,57 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+
+package com.google.gerrit.httpd;
+
+import com.google.common.base.CharMatcher;
+import com.google.common.collect.ImmutableList;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.PageLinks;
+import com.google.gerrit.extensions.api.changes.Changes;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.List;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@Singleton
+class DirectChangeByCommit extends HttpServlet {
+  private static final long serialVersionUID = 1L;
+
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final Changes changes;
+
+  @Inject
+  DirectChangeByCommit(Changes changes) {
+    this.changes = changes;
+  }
+
+  @Override
+  protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
+    String query = CharMatcher.is('/').trimTrailingFrom(req.getPathInfo());
+    List<ChangeInfo> results;
+    try {
+      results = changes.query(query).withLimit(2).get();
+    } catch (RestApiException e) {
+      logger.atWarning().withCause(e).log("Cannot process query by URL: /r/%s", query);
+      results = ImmutableList.of();
+    }
+    String token;
+    if (results.size() == 1) {
+      // If exactly one change matches, link to that change.
+      // TODO Link to a specific patch set, if one matched.
+      ChangeInfo ci = results.iterator().next();
+      token = PageLinks.toChange(new Project.NameKey(ci.project), new Change.Id(ci._number));
+    } else {
+      // Otherwise, link to the query page.
+      token = PageLinks.toChangeQuery(query);
+    }
+    UrlModule.toGerrit(token, req, rsp);
+  }
+}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GerritAuthModule.java b/java/com/google/gerrit/httpd/GerritAuthModule.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/GerritAuthModule.java
rename to java/com/google/gerrit/httpd/GerritAuthModule.java
diff --git a/java/com/google/gerrit/httpd/GetUserFilter.java b/java/com/google/gerrit/httpd/GetUserFilter.java
new file mode 100644
index 0000000..2199411
--- /dev/null
+++ b/java/com/google/gerrit/httpd/GetUserFilter.java
@@ -0,0 +1,103 @@
+// Copyright (C) 2012 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.google.gerrit.httpd;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import com.google.inject.servlet.ServletModule;
+import java.io.IOException;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletResponse;
+import org.eclipse.jgit.lib.Config;
+
+/**
+ * Stores user as a request attribute and/or response header, so servlets and reverse proxies can
+ * access it outside of the request/response scope.
+ */
+@Singleton
+public class GetUserFilter implements Filter {
+
+  public static final String USER_ATTR_KEY = "User";
+
+  public static class Module extends ServletModule {
+
+    private final boolean reqEnabled;
+    private final boolean resEnabled;
+
+    @Inject
+    Module(@GerritServerConfig Config cfg) {
+      reqEnabled = cfg.getBoolean("http", "addUserAsRequestAttribute", true);
+      resEnabled = cfg.getBoolean("http", "addUserAsResponseHeader", false);
+    }
+
+    @Override
+    protected void configureServlets() {
+      if (resEnabled || reqEnabled) {
+        ImmutableMap.Builder<String, String> initParams = ImmutableMap.builder();
+        if (reqEnabled) {
+          initParams.put("reqEnabled", "");
+        }
+        if (resEnabled) {
+          initParams.put("resEnabled", "");
+        }
+        filter("/*").through(GetUserFilter.class, initParams.build());
+      }
+    }
+  }
+
+  private final Provider<CurrentUser> userProvider;
+
+  private boolean reqEnabled;
+  private boolean resEnabled;
+
+  @Inject
+  GetUserFilter(Provider<CurrentUser> userProvider) {
+    this.userProvider = userProvider;
+  }
+
+  @Override
+  public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
+      throws IOException, ServletException {
+    CurrentUser user = userProvider.get();
+    if (user != null && user.isIdentifiedUser()) {
+      String loggableName = user.asIdentifiedUser().getLoggableName();
+      if (reqEnabled) {
+        req.setAttribute(USER_ATTR_KEY, loggableName);
+      }
+      if (resEnabled && resp instanceof HttpServletResponse) {
+        ((HttpServletResponse) resp).addHeader(USER_ATTR_KEY, loggableName);
+      }
+    }
+    chain.doFilter(req, resp);
+  }
+
+  @Override
+  public void destroy() {}
+
+  @Override
+  public void init(FilterConfig arg0) {
+    reqEnabled = arg0.getInitParameter("reqEnabled") != null ? true : false;
+    resEnabled = arg0.getInitParameter("resEnabled") != null ? true : false;
+  }
+}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitOverHttpModule.java b/java/com/google/gerrit/httpd/GitOverHttpModule.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitOverHttpModule.java
rename to java/com/google/gerrit/httpd/GitOverHttpModule.java
diff --git a/java/com/google/gerrit/httpd/GitOverHttpServlet.java b/java/com/google/gerrit/httpd/GitOverHttpServlet.java
new file mode 100644
index 0000000..08ff8a7
--- /dev/null
+++ b/java/com/google/gerrit/httpd/GitOverHttpServlet.java
@@ -0,0 +1,483 @@
+// Copyright (C) 2010 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.google.gerrit.httpd;
+
+import com.google.common.cache.Cache;
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Lists;
+import com.google.gerrit.common.data.Capable;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.AccessPath;
+import com.google.gerrit.server.AnonymousUser;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.audit.HttpAuditEvent;
+import com.google.gerrit.server.cache.CacheModule;
+import com.google.gerrit.server.git.DefaultAdvertiseRefsHook;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.TransferConfig;
+import com.google.gerrit.server.git.UploadPackInitializer;
+import com.google.gerrit.server.git.receive.AsyncReceiveCommits;
+import com.google.gerrit.server.git.validators.UploadValidators;
+import com.google.gerrit.server.group.GroupAuditService;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackend.RefFilterOptions;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.inject.AbstractModule;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import com.google.inject.TypeLiteral;
+import com.google.inject.name.Named;
+import java.io.IOException;
+import java.time.Duration;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.http.server.GitServlet;
+import org.eclipse.jgit.http.server.GitSmartHttpTools;
+import org.eclipse.jgit.http.server.ServletUtils;
+import org.eclipse.jgit.http.server.resolver.AsIsFileService;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.transport.PostUploadHook;
+import org.eclipse.jgit.transport.PostUploadHookChain;
+import org.eclipse.jgit.transport.PreUploadHook;
+import org.eclipse.jgit.transport.PreUploadHookChain;
+import org.eclipse.jgit.transport.ReceivePack;
+import org.eclipse.jgit.transport.ServiceMayNotContinueException;
+import org.eclipse.jgit.transport.UploadPack;
+import org.eclipse.jgit.transport.resolver.ReceivePackFactory;
+import org.eclipse.jgit.transport.resolver.RepositoryResolver;
+import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException;
+import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
+import org.eclipse.jgit.transport.resolver.UploadPackFactory;
+
+/** Serves Git repositories over HTTP. */
+@Singleton
+public class GitOverHttpServlet extends GitServlet {
+  private static final long serialVersionUID = 1L;
+
+  private static final String ATT_STATE = ProjectState.class.getName();
+  private static final String ATT_ARC = AsyncReceiveCommits.class.getName();
+  private static final String ID_CACHE = "adv_bases";
+
+  public static final String URL_REGEX;
+
+  static {
+    StringBuilder url = new StringBuilder();
+    url.append("^(?:/a)?(?:/p/|/)(.*/(?:info/refs");
+    for (String name : GitSmartHttpTools.VALID_SERVICES) {
+      url.append('|').append(name);
+    }
+    url.append("))$");
+    URL_REGEX = url.toString();
+  }
+
+  static class Module extends AbstractModule {
+
+    private final boolean enableReceive;
+
+    Module(boolean enableReceive) {
+      this.enableReceive = enableReceive;
+    }
+
+    @Override
+    protected void configure() {
+      bind(Resolver.class);
+      bind(UploadFactory.class);
+      bind(UploadFilter.class);
+      bind(new TypeLiteral<ReceivePackFactory<HttpServletRequest>>() {})
+          .to(enableReceive ? ReceiveFactory.class : DisabledReceiveFactory.class);
+      bind(ReceiveFilter.class);
+      install(
+          new CacheModule() {
+            @Override
+            protected void configure() {
+              cache(ID_CACHE, AdvertisedObjectsCacheKey.class, new TypeLiteral<Set<ObjectId>>() {})
+                  .maximumWeight(4096)
+                  .expireAfterWrite(Duration.ofMinutes(10));
+            }
+          });
+    }
+  }
+
+  @Inject
+  GitOverHttpServlet(
+      Resolver resolver,
+      UploadFactory upload,
+      UploadFilter uploadFilter,
+      ReceivePackFactory<HttpServletRequest> receive,
+      ReceiveFilter receiveFilter) {
+    setRepositoryResolver(resolver);
+    setAsIsFileService(AsIsFileService.DISABLED);
+
+    setUploadPackFactory(upload);
+    addUploadPackFilter(uploadFilter);
+
+    setReceivePackFactory(receive);
+    addReceivePackFilter(receiveFilter);
+  }
+
+  private static String extractWhat(HttpServletRequest request) {
+    StringBuilder commandName = new StringBuilder(request.getRequestURL());
+    if (request.getQueryString() != null) {
+      commandName.append("?").append(request.getQueryString());
+    }
+    return commandName.toString();
+  }
+
+  private static ListMultimap<String, String> extractParameters(HttpServletRequest request) {
+
+    ListMultimap<String, String> multiMap = ArrayListMultimap.create();
+    if (request.getQueryString() != null) {
+      request
+          .getParameterMap()
+          .forEach(
+              (k, v) -> {
+                for (int i = 0; i < v.length; i++) {
+                  multiMap.put(k, v[i]);
+                }
+              });
+    }
+    return multiMap;
+  }
+
+  static class Resolver implements RepositoryResolver<HttpServletRequest> {
+    private final GitRepositoryManager manager;
+    private final PermissionBackend permissionBackend;
+    private final Provider<CurrentUser> userProvider;
+    private final ProjectCache projectCache;
+
+    @Inject
+    Resolver(
+        GitRepositoryManager manager,
+        PermissionBackend permissionBackend,
+        Provider<CurrentUser> userProvider,
+        ProjectCache projectCache) {
+      this.manager = manager;
+      this.permissionBackend = permissionBackend;
+      this.userProvider = userProvider;
+      this.projectCache = projectCache;
+    }
+
+    @Override
+    public Repository open(HttpServletRequest req, String projectName)
+        throws RepositoryNotFoundException, ServiceNotAuthorizedException,
+            ServiceNotEnabledException, ServiceMayNotContinueException {
+      while (projectName.endsWith("/")) {
+        projectName = projectName.substring(0, projectName.length() - 1);
+      }
+
+      if (projectName.endsWith(".git")) {
+        // Be nice and drop the trailing ".git" suffix, which we never keep
+        // in our database, but clients might mistakenly provide anyway.
+        //
+        projectName = projectName.substring(0, projectName.length() - 4);
+        while (projectName.endsWith("/")) {
+          projectName = projectName.substring(0, projectName.length() - 1);
+        }
+      }
+
+      CurrentUser user = userProvider.get();
+      user.setAccessPath(AccessPath.GIT);
+
+      try {
+        Project.NameKey nameKey = new Project.NameKey(projectName);
+        ProjectState state = projectCache.checkedGet(nameKey);
+        if (state == null || !state.statePermitsRead()) {
+          throw new RepositoryNotFoundException(nameKey.get());
+        }
+        req.setAttribute(ATT_STATE, state);
+
+        try {
+          permissionBackend.user(user).project(nameKey).check(ProjectPermission.ACCESS);
+        } catch (AuthException e) {
+          if (user instanceof AnonymousUser) {
+            throw new ServiceNotAuthorizedException();
+          }
+          throw new ServiceNotEnabledException(e.getMessage());
+        }
+
+        return manager.openRepository(nameKey);
+      } catch (IOException | PermissionBackendException err) {
+        throw new ServiceMayNotContinueException(projectName + " unavailable", err);
+      }
+    }
+  }
+
+  static class UploadFactory implements UploadPackFactory<HttpServletRequest> {
+    private final TransferConfig config;
+    private final DynamicSet<PreUploadHook> preUploadHooks;
+    private final DynamicSet<PostUploadHook> postUploadHooks;
+    private final DynamicSet<UploadPackInitializer> uploadPackInitializers;
+
+    @Inject
+    UploadFactory(
+        TransferConfig tc,
+        DynamicSet<PreUploadHook> preUploadHooks,
+        DynamicSet<PostUploadHook> postUploadHooks,
+        DynamicSet<UploadPackInitializer> uploadPackInitializers) {
+      this.config = tc;
+      this.preUploadHooks = preUploadHooks;
+      this.postUploadHooks = postUploadHooks;
+      this.uploadPackInitializers = uploadPackInitializers;
+    }
+
+    @Override
+    public UploadPack create(HttpServletRequest req, Repository repo) {
+      UploadPack up = new UploadPack(repo);
+      up.setPackConfig(config.getPackConfig());
+      up.setTimeout(config.getTimeout());
+      up.setPreUploadHook(PreUploadHookChain.newChain(Lists.newArrayList(preUploadHooks)));
+      up.setPostUploadHook(PostUploadHookChain.newChain(Lists.newArrayList(postUploadHooks)));
+      ProjectState state = (ProjectState) req.getAttribute(ATT_STATE);
+      for (UploadPackInitializer initializer : uploadPackInitializers) {
+        initializer.init(state.getNameKey(), up);
+      }
+      return up;
+    }
+  }
+
+  static class UploadFilter implements Filter {
+    private final UploadValidators.Factory uploadValidatorsFactory;
+    private final PermissionBackend permissionBackend;
+    private final Provider<CurrentUser> userProvider;
+    private final GroupAuditService groupAuditService;
+
+    @Inject
+    UploadFilter(
+        UploadValidators.Factory uploadValidatorsFactory,
+        PermissionBackend permissionBackend,
+        Provider<CurrentUser> userProvider,
+        GroupAuditService groupAuditService) {
+      this.uploadValidatorsFactory = uploadValidatorsFactory;
+      this.permissionBackend = permissionBackend;
+      this.userProvider = userProvider;
+      this.groupAuditService = groupAuditService;
+    }
+
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain next)
+        throws IOException, ServletException {
+      // The Resolver above already checked READ access for us.
+      Repository repo = ServletUtils.getRepository(request);
+      ProjectState state = (ProjectState) request.getAttribute(ATT_STATE);
+      UploadPack up = (UploadPack) request.getAttribute(ServletUtils.ATTRIBUTE_HANDLER);
+      PermissionBackend.ForProject perm =
+          permissionBackend.currentUser().project(state.getNameKey());
+      try {
+        perm.check(ProjectPermission.RUN_UPLOAD_PACK);
+      } catch (AuthException e) {
+        GitSmartHttpTools.sendError(
+            (HttpServletRequest) request,
+            (HttpServletResponse) response,
+            HttpServletResponse.SC_FORBIDDEN,
+            "upload-pack not permitted on this server");
+        return;
+      } catch (PermissionBackendException e) {
+        throw new ServletException(e);
+      } finally {
+        HttpServletRequest httpRequest = (HttpServletRequest) request;
+        HttpServletResponse httpResponse = (HttpServletResponse) response;
+        groupAuditService.dispatch(
+            new HttpAuditEvent(
+                httpRequest.getSession().getId(),
+                userProvider.get(),
+                extractWhat(httpRequest),
+                TimeUtil.nowMs(),
+                extractParameters(httpRequest),
+                httpRequest.getMethod(),
+                httpRequest,
+                httpResponse.getStatus(),
+                httpResponse));
+      }
+
+      // We use getRemoteHost() here instead of getRemoteAddr() because REMOTE_ADDR
+      // may have been overridden by a proxy server -- we'll try to avoid this.
+      UploadValidators uploadValidators =
+          uploadValidatorsFactory.create(state.getProject(), repo, request.getRemoteHost());
+      up.setPreUploadHook(
+          PreUploadHookChain.newChain(Lists.newArrayList(up.getPreUploadHook(), uploadValidators)));
+      up.setAdvertiseRefsHook(new DefaultAdvertiseRefsHook(perm, RefFilterOptions.defaults()));
+      next.doFilter(request, response);
+    }
+
+    @Override
+    public void init(FilterConfig config) {}
+
+    @Override
+    public void destroy() {}
+  }
+
+  static class ReceiveFactory implements ReceivePackFactory<HttpServletRequest> {
+    private final AsyncReceiveCommits.Factory factory;
+    private final Provider<CurrentUser> userProvider;
+
+    @Inject
+    ReceiveFactory(AsyncReceiveCommits.Factory factory, Provider<CurrentUser> userProvider) {
+      this.factory = factory;
+      this.userProvider = userProvider;
+    }
+
+    @Override
+    public ReceivePack create(HttpServletRequest req, Repository db)
+        throws ServiceNotAuthorizedException {
+      final ProjectState state = (ProjectState) req.getAttribute(ATT_STATE);
+
+      if (!(userProvider.get().isIdentifiedUser())) {
+        // Anonymous users are not permitted to push.
+        throw new ServiceNotAuthorizedException();
+      }
+
+      AsyncReceiveCommits arc =
+          factory.create(state, userProvider.get().asIdentifiedUser(), db, null);
+      ReceivePack rp = arc.getReceivePack();
+      req.setAttribute(ATT_ARC, arc);
+      return rp;
+    }
+  }
+
+  static class DisabledReceiveFactory implements ReceivePackFactory<HttpServletRequest> {
+    @Override
+    public ReceivePack create(HttpServletRequest req, Repository db)
+        throws ServiceNotEnabledException {
+      throw new ServiceNotEnabledException();
+    }
+  }
+
+  static class ReceiveFilter implements Filter {
+    private final Cache<AdvertisedObjectsCacheKey, Set<ObjectId>> cache;
+    private final PermissionBackend permissionBackend;
+    private final Provider<CurrentUser> userProvider;
+    private final GroupAuditService groupAuditService;
+
+    @Inject
+    ReceiveFilter(
+        @Named(ID_CACHE) Cache<AdvertisedObjectsCacheKey, Set<ObjectId>> cache,
+        PermissionBackend permissionBackend,
+        Provider<CurrentUser> userProvider,
+        GroupAuditService groupAuditService) {
+      this.cache = cache;
+      this.permissionBackend = permissionBackend;
+      this.userProvider = userProvider;
+      this.groupAuditService = groupAuditService;
+    }
+
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+        throws IOException, ServletException {
+      boolean isGet = "GET".equalsIgnoreCase(((HttpServletRequest) request).getMethod());
+
+      AsyncReceiveCommits arc = (AsyncReceiveCommits) request.getAttribute(ATT_ARC);
+
+      // Send refs down the wire.
+      ReceivePack rp = arc.getReceivePack();
+      rp.getAdvertiseRefsHook().advertiseRefs(rp);
+
+      ProjectState state = (ProjectState) request.getAttribute(ATT_STATE);
+      Capable canUpload;
+      try {
+        permissionBackend
+            .currentUser()
+            .project(state.getNameKey())
+            .check(ProjectPermission.RUN_RECEIVE_PACK);
+        canUpload = arc.canUpload();
+      } catch (AuthException e) {
+        GitSmartHttpTools.sendError(
+            (HttpServletRequest) request,
+            (HttpServletResponse) response,
+            HttpServletResponse.SC_FORBIDDEN,
+            "receive-pack not permitted on this server");
+        return;
+      } catch (PermissionBackendException e) {
+        throw new RuntimeException(e);
+      } finally {
+        HttpServletRequest httpRequest = (HttpServletRequest) request;
+        HttpServletResponse httpResponse = (HttpServletResponse) response;
+        groupAuditService.dispatch(
+            new HttpAuditEvent(
+                httpRequest.getSession().getId(),
+                userProvider.get(),
+                extractWhat(httpRequest),
+                TimeUtil.nowMs(),
+                extractParameters(httpRequest),
+                httpRequest.getMethod(),
+                httpRequest,
+                httpResponse.getStatus(),
+                httpResponse));
+      }
+
+      if (canUpload != Capable.OK) {
+        GitSmartHttpTools.sendError(
+            (HttpServletRequest) request,
+            (HttpServletResponse) response,
+            HttpServletResponse.SC_FORBIDDEN,
+            "\n" + canUpload.getMessage());
+        return;
+      }
+
+      if (!rp.isCheckReferencedObjectsAreReachable()) {
+        chain.doFilter(request, response);
+        return;
+      }
+
+      if (!(userProvider.get().isIdentifiedUser())) {
+        chain.doFilter(request, response);
+        return;
+      }
+
+      AdvertisedObjectsCacheKey cacheKey =
+          AdvertisedObjectsCacheKey.create(userProvider.get().getAccountId(), state.getNameKey());
+
+      if (isGet) {
+        cache.invalidate(cacheKey);
+      } else {
+        Set<ObjectId> ids = cache.getIfPresent(cacheKey);
+        if (ids != null) {
+          rp.getAdvertisedObjects().addAll(ids);
+          cache.invalidate(cacheKey);
+        }
+      }
+
+      chain.doFilter(request, response);
+
+      if (isGet) {
+        cache.put(cacheKey, Collections.unmodifiableSet(new HashSet<>(rp.getAdvertisedObjects())));
+      }
+    }
+
+    @Override
+    public void init(FilterConfig arg0) {}
+
+    @Override
+    public void destroy() {}
+  }
+}
diff --git a/java/com/google/gerrit/httpd/GwtCacheControlFilter.java b/java/com/google/gerrit/httpd/GwtCacheControlFilter.java
new file mode 100644
index 0000000..5ac3d2f
--- /dev/null
+++ b/java/com/google/gerrit/httpd/GwtCacheControlFilter.java
@@ -0,0 +1,104 @@
+// Copyright (C) 2008 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.google.gerrit.httpd;
+
+import com.google.gerrit.util.http.CacheHeaders;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Forces GWT resources to cache for a very long time.
+ *
+ * <p>GWT compiled JavaScript and ImageBundles can be cached indefinitely by a browser and/or an
+ * edge proxy, as they never contain user-specific data and are named by a unique checksum. If their
+ * content is ever modified then the URL changes, so user agents would request a different resource.
+ * We force these resources to have very long expiration times.
+ *
+ * <p>To use, add the following block to your {@code web.xml}:
+ *
+ * <pre>
+ * &lt;filter&gt;
+ *     &lt;filter-name&gt;CacheControl&lt;/filter-name&gt;
+ *     &lt;filter-class&gt;com.google.gwtexpui.server.CacheControlFilter&lt;/filter-class&gt;
+ *   &lt;/filter&gt;
+ *   &lt;filter-mapping&gt;
+ *     &lt;filter-name&gt;CacheControl&lt;/filter-name&gt;
+ *     &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
+ *   &lt;/filter-mapping&gt;
+ * </pre>
+ */
+@Singleton
+class GwtCacheControlFilter implements Filter {
+  @Override
+  public void init(FilterConfig config) {}
+
+  @Override
+  public void destroy() {}
+
+  @Override
+  public void doFilter(final ServletRequest sreq, ServletResponse srsp, FilterChain chain)
+      throws IOException, ServletException {
+    final HttpServletRequest req = (HttpServletRequest) sreq;
+    final HttpServletResponse rsp = (HttpServletResponse) srsp;
+    final String pathInfo = pathInfo(req);
+
+    if (cacheForever(pathInfo, req)) {
+      CacheHeaders.setCacheable(req, rsp, 365, TimeUnit.DAYS);
+    } else if (nocache(pathInfo)) {
+      CacheHeaders.setNotCacheable(rsp);
+    }
+
+    chain.doFilter(req, rsp);
+  }
+
+  private static boolean cacheForever(String pathInfo, HttpServletRequest req) {
+    if (pathInfo.endsWith(".cache.html")
+        || pathInfo.endsWith(".cache.gif")
+        || pathInfo.endsWith(".cache.png")
+        || pathInfo.endsWith(".cache.css")
+        || pathInfo.endsWith(".cache.jar")
+        || pathInfo.endsWith(".cache.swf")
+        || pathInfo.endsWith(".cache.txt")
+        || pathInfo.endsWith(".cache.js")) {
+      return true;
+    } else if (pathInfo.endsWith(".nocache.js")) {
+      final String v = req.getParameter("content");
+      return v != null && v.length() > 20;
+    }
+    return false;
+  }
+
+  private static boolean nocache(String pathInfo) {
+    if (pathInfo.endsWith(".nocache.js")) {
+      return true;
+    }
+    return false;
+  }
+
+  private static String pathInfo(HttpServletRequest req) {
+    final String uri = req.getRequestURI();
+    final String ctx = req.getContextPath();
+    return uri.startsWith(ctx) ? uri.substring(ctx.length()) : uri;
+  }
+}
diff --git a/java/com/google/gerrit/httpd/H2CacheBasedWebSession.java b/java/com/google/gerrit/httpd/H2CacheBasedWebSession.java
new file mode 100644
index 0000000..caced27
--- /dev/null
+++ b/java/com/google/gerrit/httpd/H2CacheBasedWebSession.java
@@ -0,0 +1,66 @@
+// Copyright (C) 2009 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.google.gerrit.httpd;
+
+import com.google.common.cache.Cache;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.httpd.WebSessionManager.Val;
+import com.google.gerrit.server.AnonymousUser;
+import com.google.gerrit.server.IdentifiedUser.RequestFactory;
+import com.google.gerrit.server.cache.CacheModule;
+import com.google.gerrit.server.config.AuthConfig;
+import com.google.inject.Inject;
+import com.google.inject.Module;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.FactoryModuleBuilder;
+import com.google.inject.name.Named;
+import com.google.inject.servlet.RequestScoped;
+import java.time.Duration;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@RequestScoped
+public class H2CacheBasedWebSession extends CacheBasedWebSession {
+  public static Module module() {
+    return new CacheModule() {
+      @Override
+      protected void configure() {
+        persist(WebSessionManager.CACHE_NAME, String.class, Val.class)
+            .maximumWeight(1024) // reasonable default for many sites
+            // expire sessions if they are inactive
+            .expireAfterWrite(Duration.ofMinutes(CacheBasedWebSession.MAX_AGE_MINUTES));
+        install(new FactoryModuleBuilder().build(WebSessionManagerFactory.class));
+        DynamicItem.itemOf(binder(), WebSession.class);
+        DynamicItem.bind(binder(), WebSession.class)
+            .to(H2CacheBasedWebSession.class)
+            .in(RequestScoped.class);
+      }
+    };
+  }
+
+  @Inject
+  H2CacheBasedWebSession(
+      HttpServletRequest request,
+      @Nullable HttpServletResponse response,
+      WebSessionManagerFactory managerFactory,
+      @Named(WebSessionManager.CACHE_NAME) Cache<String, Val> cache,
+      AuthConfig authConfig,
+      Provider<AnonymousUser> anonymousProvider,
+      RequestFactory identified) {
+    super(
+        request, response, managerFactory.create(cache), authConfig, anonymousProvider, identified);
+  }
+}
diff --git a/java/com/google/gerrit/httpd/HtmlDomUtil.java b/java/com/google/gerrit/httpd/HtmlDomUtil.java
new file mode 100644
index 0000000..25ae71c
--- /dev/null
+++ b/java/com/google/gerrit/httpd/HtmlDomUtil.java
@@ -0,0 +1,218 @@
+// Copyright (C) 2008 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.google.gerrit.httpd;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.io.ByteStreams;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringWriter;
+import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
+import java.nio.file.Path;
+import java.util.zip.GZIPOutputStream;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpression;
+import javax.xml.xpath.XPathExpressionException;
+import javax.xml.xpath.XPathFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+/** Utility functions to deal with HTML using W3C DOM operations. */
+public class HtmlDomUtil {
+  /** Standard character encoding we prefer (UTF-8). */
+  public static final Charset ENC = UTF_8;
+
+  /** DOCTYPE for a standards mode HTML document. */
+  public static final String HTML_STRICT =
+      "-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd";
+
+  /** Convert a document to a UTF-8 byte sequence. */
+  public static byte[] toUTF8(Document hostDoc) throws IOException {
+    return toString(hostDoc).getBytes(ENC);
+  }
+
+  /** Compress the document. */
+  public static byte[] compress(byte[] raw) throws IOException {
+    ByteArrayOutputStream out = new ByteArrayOutputStream();
+    GZIPOutputStream gz = new GZIPOutputStream(out);
+    gz.write(raw);
+    gz.finish();
+    gz.flush();
+    return out.toByteArray();
+  }
+
+  /** Convert a document to a String, assuming later encoding to UTF-8. */
+  public static String toString(Document hostDoc) throws IOException {
+    try {
+      StringWriter out = new StringWriter();
+      DOMSource domSource = new DOMSource(hostDoc);
+      StreamResult streamResult = new StreamResult(out);
+      TransformerFactory tf = TransformerFactory.newInstance();
+      Transformer serializer = tf.newTransformer();
+      serializer.setOutputProperty(OutputKeys.ENCODING, ENC.name());
+      serializer.setOutputProperty(OutputKeys.METHOD, "html");
+      serializer.setOutputProperty(OutputKeys.INDENT, "no");
+      serializer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, HtmlDomUtil.HTML_STRICT);
+      serializer.transform(domSource, streamResult);
+      return out.toString();
+    } catch (TransformerException e) {
+      throw new IOException("Error transforming page", e);
+    }
+  }
+
+  /** Find an element by its "id" attribute; null if no element is found. */
+  public static Element find(Node parent, String name) {
+    NodeList list = parent.getChildNodes();
+    for (int i = 0; i < list.getLength(); i++) {
+      Node n = list.item(i);
+      if (n instanceof Element) {
+        Element e = (Element) n;
+        if (name.equals(e.getAttribute("id"))) {
+          return e;
+        }
+      }
+      Element r = find(n, name);
+      if (r != null) {
+        return r;
+      }
+    }
+    return null;
+  }
+
+  /** Append an HTML &lt;input type="hidden"&gt; to the form. */
+  public static void addHidden(Element form, String name, String value) {
+    Element in = form.getOwnerDocument().createElement("input");
+    in.setAttribute("type", "hidden");
+    in.setAttribute("name", name);
+    in.setAttribute("value", value);
+    form.appendChild(in);
+  }
+
+  /** Construct a new empty document. */
+  public static Document newDocument() {
+    try {
+      return newBuilder().newDocument();
+    } catch (ParserConfigurationException e) {
+      throw new RuntimeException("Cannot create new document", e);
+    }
+  }
+
+  /** Clone a document so it can be safely modified on a per-request basis. */
+  public static Document clone(Document doc) throws IOException {
+    Document d;
+    try {
+      d = newBuilder().newDocument();
+    } catch (ParserConfigurationException e) {
+      throw new IOException("Cannot clone document");
+    }
+    Node n = d.importNode(doc.getDocumentElement(), true);
+    d.appendChild(n);
+    return d;
+  }
+
+  /** Parse an XHTML file from our CLASSPATH and return the instance. */
+  public static Document parseFile(Class<?> context, String name) throws IOException {
+    try (InputStream in = context.getResourceAsStream(name)) {
+      if (in == null) {
+        return null;
+      }
+      Document doc = newBuilder().parse(in);
+      compact(doc);
+      return doc;
+    } catch (SAXException | ParserConfigurationException | IOException e) {
+      throw new IOException("Error reading " + name, e);
+    }
+  }
+
+  private static void compact(Document doc) {
+    try {
+      String expr = "//text()[normalize-space(.) = '']";
+      XPathFactory xp = XPathFactory.newInstance();
+      XPathExpression e = xp.newXPath().compile(expr);
+      NodeList empty = (NodeList) e.evaluate(doc, XPathConstants.NODESET);
+      for (int i = 0; i < empty.getLength(); i++) {
+        Node node = empty.item(i);
+        node.getParentNode().removeChild(node);
+      }
+    } catch (XPathExpressionException e) {
+      // Don't do the whitespace removal.
+    }
+  }
+
+  /** Read a Read a UTF-8 text file from our CLASSPATH and return it. */
+  public static String readFile(Class<?> context, String name) throws IOException {
+    try (InputStream in = context.getResourceAsStream(name)) {
+      if (in == null) {
+        return null;
+      }
+      return new String(ByteStreams.toByteArray(in), ENC);
+    } catch (IOException e) {
+      throw new IOException("Error reading " + name, e);
+    }
+  }
+
+  /** Parse an XHTML file from the local drive and return the instance. */
+  public static Document parseFile(Path path) throws IOException {
+    try (InputStream in = Files.newInputStream(path)) {
+      Document doc = newBuilder().parse(in);
+      compact(doc);
+      return doc;
+    } catch (NoSuchFileException e) {
+      return null;
+    } catch (SAXException | ParserConfigurationException | IOException e) {
+      throw new IOException("Error reading " + path, e);
+    }
+  }
+
+  /** Read a UTF-8 text file from the local drive. */
+  public static String readFile(Path parentDir, String name) throws IOException {
+    if (parentDir == null) {
+      return null;
+    }
+    Path path = parentDir.resolve(name);
+    try (InputStream in = Files.newInputStream(path)) {
+      return new String(ByteStreams.toByteArray(in), ENC);
+    } catch (NoSuchFileException e) {
+      return null;
+    } catch (IOException e) {
+      throw new IOException("Error reading " + path, e);
+    }
+  }
+
+  private static DocumentBuilder newBuilder() throws ParserConfigurationException {
+    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+    factory.setValidating(false);
+    factory.setExpandEntityReferences(false);
+    factory.setIgnoringComments(true);
+    factory.setCoalescing(true);
+    return factory.newDocumentBuilder();
+  }
+}
diff --git a/java/com/google/gerrit/httpd/HttpCanonicalWebUrlProvider.java b/java/com/google/gerrit/httpd/HttpCanonicalWebUrlProvider.java
new file mode 100644
index 0000000..6943faa
--- /dev/null
+++ b/java/com/google/gerrit/httpd/HttpCanonicalWebUrlProvider.java
@@ -0,0 +1,76 @@
+// Copyright (C) 2009 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.google.gerrit.httpd;
+
+import com.google.gerrit.server.config.CanonicalWebUrlProvider;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.inject.Inject;
+import com.google.inject.OutOfScopeException;
+import com.google.inject.Provider;
+import com.google.inject.ProvisionException;
+import java.util.Optional;
+import javax.servlet.http.HttpServletRequest;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.util.SystemReader;
+
+/** Sets {@code CanonicalWebUrl} to current HTTP request if not configured. */
+public class HttpCanonicalWebUrlProvider extends CanonicalWebUrlProvider {
+  private Provider<HttpServletRequest> requestProvider;
+
+  @Inject
+  HttpCanonicalWebUrlProvider(@GerritServerConfig Config config) {
+    super(config);
+  }
+
+  @Inject(optional = true)
+  public void setHttpServletRequest(Provider<HttpServletRequest> hsr) {
+    requestProvider = hsr;
+  }
+
+  @Override
+  public String get() {
+    String canonicalUrl = super.get();
+    if (canonicalUrl != null) {
+      return canonicalUrl;
+    }
+
+    return guessUrlFromHttpRequest()
+        .orElseGet(() -> "http://" + SystemReader.getInstance().getHostname() + '/');
+  }
+
+  private Optional<String> guessUrlFromHttpRequest() {
+    if (requestProvider == null) {
+      // We have no way of guessing our HTTP url.
+      return Optional.empty();
+    }
+
+    // No canonical URL configured? Maybe we can get a reasonable
+    // guess from the incoming HTTP request, if we are currently
+    // inside of an HTTP request scope.
+    //
+    final HttpServletRequest req;
+    try {
+      req = requestProvider.get();
+    } catch (ProvisionException noWeb) {
+      if (noWeb.getCause() instanceof OutOfScopeException) {
+        // We can't obtain the request as we are not inside of
+        // an HTTP request scope. Callers must handle null.
+        return Optional.empty();
+      }
+      throw noWeb;
+    }
+    return Optional.of(CanonicalWebUrl.computeFromRequest(req));
+  }
+}
diff --git a/java/com/google/gerrit/httpd/HttpLogoutServlet.java b/java/com/google/gerrit/httpd/HttpLogoutServlet.java
new file mode 100644
index 0000000..1eaaba3
--- /dev/null
+++ b/java/com/google/gerrit/httpd/HttpLogoutServlet.java
@@ -0,0 +1,88 @@
+// Copyright (C) 2009 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.google.gerrit.httpd;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.server.AuditEvent;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.config.AuthConfig;
+import com.google.gerrit.server.config.CanonicalWebUrl;
+import com.google.gerrit.server.group.GroupAuditService;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@Singleton
+public class HttpLogoutServlet extends HttpServlet {
+  private static final long serialVersionUID = 1L;
+
+  private final DynamicItem<WebSession> webSession;
+  private final Provider<String> urlProvider;
+  private final String logoutUrl;
+  private final GroupAuditService audit;
+
+  @Inject
+  protected HttpLogoutServlet(
+      AuthConfig authConfig,
+      DynamicItem<WebSession> webSession,
+      @CanonicalWebUrl @Nullable Provider<String> urlProvider,
+      GroupAuditService audit) {
+    this.webSession = webSession;
+    this.urlProvider = urlProvider;
+    this.logoutUrl = authConfig.getLogoutURL();
+    this.audit = audit;
+  }
+
+  protected void doLogout(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
+    webSession.get().logout();
+    if (logoutUrl != null) {
+      rsp.sendRedirect(logoutUrl);
+    } else {
+      String url = urlProvider.get();
+      if (Strings.isNullOrEmpty(url)) {
+        url = req.getContextPath();
+      }
+      if (Strings.isNullOrEmpty(url)) {
+        url = "/";
+      }
+      if (!url.endsWith("/")) {
+        url += "/";
+      }
+      rsp.sendRedirect(url);
+    }
+  }
+
+  @Override
+  protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
+
+    final String sid = webSession.get().getSessionId();
+    final CurrentUser currentUser = webSession.get().getUser();
+    final String what = "sign out";
+    final long when = TimeUtil.nowMs();
+
+    try {
+      doLogout(req, rsp);
+    } finally {
+      audit.dispatch(new AuditEvent(sid, currentUser, what, when, null, null));
+    }
+  }
+}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpRemotePeerProvider.java b/java/com/google/gerrit/httpd/HttpRemotePeerProvider.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpRemotePeerProvider.java
rename to java/com/google/gerrit/httpd/HttpRemotePeerProvider.java
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpRequestContext.java b/java/com/google/gerrit/httpd/HttpRequestContext.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpRequestContext.java
rename to java/com/google/gerrit/httpd/HttpRequestContext.java
diff --git a/java/com/google/gerrit/httpd/HttpServletResponseRecorder.java b/java/com/google/gerrit/httpd/HttpServletResponseRecorder.java
new file mode 100644
index 0000000..397d093
--- /dev/null
+++ b/java/com/google/gerrit/httpd/HttpServletResponseRecorder.java
@@ -0,0 +1,89 @@
+// 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.
+
+package com.google.gerrit.httpd;
+
+import com.google.common.flogger.FluentLogger;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpServletResponseWrapper;
+
+/**
+ * HttpServletResponse wrapper to allow response status code override.
+ *
+ * <p>Differently from the normal HttpServletResponse, this class allows multiple filters to
+ * override the response http status code.
+ */
+public class HttpServletResponseRecorder extends HttpServletResponseWrapper {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+  private static final String LOCATION_HEADER = "Location";
+
+  private int status;
+  private String statusMsg = "";
+  private Map<String, String> headers = new HashMap<>();
+
+  /**
+   * Constructs a response recorder wrapping the given response.
+   *
+   * @param response the response to be wrapped
+   */
+  public HttpServletResponseRecorder(HttpServletResponse response) {
+    super(response);
+  }
+
+  @Override
+  public void sendError(int sc) throws IOException {
+    this.status = sc;
+  }
+
+  @Override
+  public void sendError(int sc, String msg) throws IOException {
+    this.status = sc;
+    this.statusMsg = msg;
+  }
+
+  @Override
+  public void sendRedirect(String location) throws IOException {
+    this.status = SC_MOVED_TEMPORARILY;
+    setHeader(LOCATION_HEADER, location);
+  }
+
+  @Override
+  public void setHeader(String name, String value) {
+    super.setHeader(name, value);
+    headers.put(name, value);
+  }
+
+  @SuppressWarnings("all")
+  // @Override is omitted for backwards compatibility with servlet-api 2.5
+  // TODO: Remove @SuppressWarnings and add @Override when Google upgrades
+  //       to servlet-api 3.1
+  public int getStatus() {
+    return status;
+  }
+
+  void play() throws IOException {
+    if (status != 0) {
+      logger.atFine().log("Replaying %s %s", status, statusMsg);
+
+      if (status == SC_MOVED_TEMPORARILY) {
+        super.sendRedirect(headers.get(LOCATION_HEADER));
+      } else {
+        super.sendError(status, statusMsg);
+      }
+    }
+  }
+}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/LoginUrlToken.java b/java/com/google/gerrit/httpd/LoginUrlToken.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/LoginUrlToken.java
rename to java/com/google/gerrit/httpd/LoginUrlToken.java
diff --git a/java/com/google/gerrit/httpd/ProjectBasicAuthFilter.java b/java/com/google/gerrit/httpd/ProjectBasicAuthFilter.java
new file mode 100644
index 0000000..818827c
--- /dev/null
+++ b/java/com/google/gerrit/httpd/ProjectBasicAuthFilter.java
@@ -0,0 +1,251 @@
+// Copyright (C) 2012 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.google.gerrit.httpd;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.client.GitBasicAuthPolicy;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.AccessPath;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountException;
+import com.google.gerrit.server.account.AccountManager;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.account.AuthRequest;
+import com.google.gerrit.server.account.AuthResult;
+import com.google.gerrit.server.account.AuthenticationFailedException;
+import com.google.gerrit.server.auth.NoSuchUserException;
+import com.google.gerrit.server.config.AuthConfig;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Locale;
+import java.util.Optional;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpServletResponseWrapper;
+import org.apache.commons.codec.binary.Base64;
+
+/**
+ * Authenticates the current user by HTTP basic authentication.
+ *
+ * <p>The current HTTP request is authenticated by looking up the username and password from the
+ * Base64 encoded Authorization header and validating them against any username/password configured
+ * authentication system in Gerrit. This filter is intended only to protect the {@link
+ * GitOverHttpServlet} and its handled URLs, which provide remote repository access over HTTP.
+ *
+ * @see <a href="http://www.ietf.org/rfc/rfc2617.txt">RFC 2617</a>
+ */
+@Singleton
+class ProjectBasicAuthFilter implements Filter {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static final String REALM_NAME = "Gerrit Code Review";
+  private static final String AUTHORIZATION = "Authorization";
+  private static final String LIT_BASIC = "Basic ";
+
+  private final DynamicItem<WebSession> session;
+  private final AccountCache accountCache;
+  private final AccountManager accountManager;
+  private final AuthConfig authConfig;
+
+  @Inject
+  ProjectBasicAuthFilter(
+      DynamicItem<WebSession> session,
+      AccountCache accountCache,
+      AccountManager accountManager,
+      AuthConfig authConfig) {
+    this.session = session;
+    this.accountCache = accountCache;
+    this.accountManager = accountManager;
+    this.authConfig = authConfig;
+  }
+
+  @Override
+  public void init(FilterConfig config) {}
+
+  @Override
+  public void destroy() {}
+
+  @Override
+  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+      throws IOException, ServletException {
+    HttpServletRequest req = (HttpServletRequest) request;
+    Response rsp = new Response((HttpServletResponse) response);
+
+    if (verify(req, rsp)) {
+      chain.doFilter(req, rsp);
+    }
+  }
+
+  private boolean verify(HttpServletRequest req, Response rsp) throws IOException {
+    final String hdr = req.getHeader(AUTHORIZATION);
+    if (hdr == null || !hdr.startsWith(LIT_BASIC)) {
+      // Allow an anonymous connection through, or it might be using a
+      // session cookie instead of basic authentication.
+      return true;
+    }
+
+    final byte[] decoded = Base64.decodeBase64(hdr.substring(LIT_BASIC.length()));
+    String usernamePassword = new String(decoded, encoding(req));
+    int splitPos = usernamePassword.indexOf(':');
+    if (splitPos < 1) {
+      rsp.sendError(SC_UNAUTHORIZED);
+      return false;
+    }
+
+    String username = usernamePassword.substring(0, splitPos);
+    String password = usernamePassword.substring(splitPos + 1);
+    if (Strings.isNullOrEmpty(password)) {
+      rsp.sendError(SC_UNAUTHORIZED);
+      return false;
+    }
+    if (authConfig.isUserNameToLowerCase()) {
+      username = username.toLowerCase(Locale.US);
+    }
+
+    Optional<AccountState> accountState =
+        accountCache.getByUsername(username).filter(a -> a.getAccount().isActive());
+    if (!accountState.isPresent()) {
+      logger.atWarning().log(
+          "Authentication failed for %s: account inactive or not provisioned in Gerrit", username);
+      rsp.sendError(SC_UNAUTHORIZED);
+      return false;
+    }
+
+    AccountState who = accountState.get();
+    GitBasicAuthPolicy gitBasicAuthPolicy = authConfig.getGitBasicAuthPolicy();
+    if (gitBasicAuthPolicy == GitBasicAuthPolicy.HTTP
+        || gitBasicAuthPolicy == GitBasicAuthPolicy.HTTP_LDAP) {
+      if (who.checkPassword(password, username)) {
+        return succeedAuthentication(who);
+      }
+    }
+
+    if (gitBasicAuthPolicy == GitBasicAuthPolicy.HTTP) {
+      return failAuthentication(rsp, username, req);
+    }
+
+    AuthRequest whoAuth = AuthRequest.forUser(username);
+    whoAuth.setPassword(password);
+
+    try {
+      AuthResult whoAuthResult = accountManager.authenticate(whoAuth);
+      setUserIdentified(whoAuthResult.getAccountId());
+      return true;
+    } catch (NoSuchUserException e) {
+      if (who.checkPassword(password, username)) {
+        return succeedAuthentication(who);
+      }
+      logger.atWarning().withCause(e).log(authenticationFailedMsg(username, req));
+      rsp.sendError(SC_UNAUTHORIZED);
+      return false;
+    } catch (AuthenticationFailedException e) {
+      // This exception is thrown if the user provided wrong credentials, we don't need to log a
+      // stacktrace for it.
+      logger.atWarning().log(authenticationFailedMsg(username, req) + ": %s", e.getMessage());
+      rsp.sendError(SC_UNAUTHORIZED);
+      return false;
+    } catch (AccountException e) {
+      logger.atWarning().withCause(e).log(authenticationFailedMsg(username, req));
+      rsp.sendError(SC_UNAUTHORIZED);
+      return false;
+    }
+  }
+
+  private boolean succeedAuthentication(AccountState who) {
+    setUserIdentified(who.getAccount().getId());
+    return true;
+  }
+
+  private boolean failAuthentication(Response rsp, String username, HttpServletRequest req)
+      throws IOException {
+    logger.atWarning().log(
+        authenticationFailedMsg(username, req)
+            + ": password does not match the one stored in Gerrit");
+    rsp.sendError(SC_UNAUTHORIZED);
+    return false;
+  }
+
+  static String authenticationFailedMsg(String username, HttpServletRequest req) {
+    return String.format("Authentication from %s failed for %s", req.getRemoteAddr(), username);
+  }
+
+  private void setUserIdentified(Account.Id id) {
+    WebSession ws = session.get();
+    ws.setUserAccountId(id);
+    ws.setAccessPathOk(AccessPath.GIT, true);
+    ws.setAccessPathOk(AccessPath.REST_API, true);
+  }
+
+  private String encoding(HttpServletRequest req) {
+    return MoreObjects.firstNonNull(req.getCharacterEncoding(), UTF_8.name());
+  }
+
+  static class Response extends HttpServletResponseWrapper {
+    private static final String WWW_AUTHENTICATE = "WWW-Authenticate";
+
+    Response(HttpServletResponse rsp) {
+      super(rsp);
+    }
+
+    private void status(int sc) {
+      if (sc == SC_UNAUTHORIZED) {
+        StringBuilder v = new StringBuilder();
+        v.append(LIT_BASIC);
+        v.append("realm=\"").append(REALM_NAME).append("\"");
+        setHeader(WWW_AUTHENTICATE, v.toString());
+      } else if (containsHeader(WWW_AUTHENTICATE)) {
+        setHeader(WWW_AUTHENTICATE, null);
+      }
+    }
+
+    @Override
+    public void sendError(int sc, String msg) throws IOException {
+      status(sc);
+      super.sendError(sc, msg);
+    }
+
+    @Override
+    public void sendError(int sc) throws IOException {
+      status(sc);
+      super.sendError(sc);
+    }
+
+    @Override
+    @Deprecated
+    public void setStatus(int sc, String sm) {
+      status(sc);
+      super.setStatus(sc, sm);
+    }
+
+    @Override
+    public void setStatus(int sc) {
+      status(sc);
+      super.setStatus(sc);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/httpd/ProjectOAuthFilter.java b/java/com/google/gerrit/httpd/ProjectOAuthFilter.java
new file mode 100644
index 0000000..30ebe6e
--- /dev/null
+++ b/java/com/google/gerrit/httpd/ProjectOAuthFilter.java
@@ -0,0 +1,341 @@
+// Copyright (C) 2015 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.google.gerrit.httpd;
+
+import static com.google.gerrit.httpd.ProjectBasicAuthFilter.authenticationFailedMsg;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
+import com.google.common.collect.Iterables;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.auth.oauth.OAuthLoginProvider;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.registration.Extension;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.AccessPath;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountException;
+import com.google.gerrit.server.account.AccountManager;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.account.AuthRequest;
+import com.google.gerrit.server.account.AuthResult;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.Locale;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpServletResponseWrapper;
+import org.apache.commons.codec.binary.Base64;
+import org.eclipse.jgit.lib.Config;
+
+/**
+ * Authenticates the current user with an OAuth2 server.
+ *
+ * @see <a href="https://tools.ietf.org/rfc/rfc6750.txt">RFC 6750</a>
+ */
+@Singleton
+class ProjectOAuthFilter implements Filter {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final String REALM_NAME = "Gerrit Code Review";
+  private static final String AUTHORIZATION = "Authorization";
+  private static final String BASIC = "Basic ";
+  private static final String GIT_COOKIE_PREFIX = "git-";
+
+  private final DynamicItem<WebSession> session;
+  private final DynamicMap<OAuthLoginProvider> loginProviders;
+  private final AccountCache accountCache;
+  private final AccountManager accountManager;
+  private final String gitOAuthProvider;
+  private final boolean userNameToLowerCase;
+
+  private String defaultAuthPlugin;
+  private String defaultAuthProvider;
+
+  @Inject
+  ProjectOAuthFilter(
+      DynamicItem<WebSession> session,
+      DynamicMap<OAuthLoginProvider> pluginsProvider,
+      AccountCache accountCache,
+      AccountManager accountManager,
+      @GerritServerConfig Config gerritConfig) {
+    this.session = session;
+    this.loginProviders = pluginsProvider;
+    this.accountCache = accountCache;
+    this.accountManager = accountManager;
+    this.gitOAuthProvider = gerritConfig.getString("auth", null, "gitOAuthProvider");
+    this.userNameToLowerCase = gerritConfig.getBoolean("auth", null, "userNameToLowerCase", false);
+  }
+
+  @Override
+  public void init(FilterConfig config) throws ServletException {
+    if (Strings.isNullOrEmpty(gitOAuthProvider)) {
+      pickOnlyProvider();
+    } else {
+      pickConfiguredProvider();
+    }
+  }
+
+  @Override
+  public void destroy() {}
+
+  @Override
+  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+      throws IOException, ServletException {
+    HttpServletRequest req = (HttpServletRequest) request;
+    Response rsp = new Response((HttpServletResponse) response);
+    if (verify(req, rsp)) {
+      chain.doFilter(req, rsp);
+    }
+  }
+
+  private boolean verify(HttpServletRequest req, Response rsp) throws IOException {
+    AuthInfo authInfo;
+
+    // first check if there is a BASIC authentication header
+    String hdr = req.getHeader(AUTHORIZATION);
+    if (hdr != null && hdr.startsWith(BASIC)) {
+      authInfo = extractAuthInfo(hdr, encoding(req));
+      if (authInfo == null) {
+        rsp.sendError(SC_UNAUTHORIZED);
+        return false;
+      }
+    } else {
+      // if there is no BASIC authentication header, check if there is
+      // a cookie starting with the prefix "git-"
+      Cookie cookie = findGitCookie(req);
+      if (cookie != null) {
+        authInfo = extractAuthInfo(cookie);
+        if (authInfo == null) {
+          rsp.sendError(SC_UNAUTHORIZED);
+          return false;
+        }
+      } else {
+        // if there is no authentication information at all, it might be
+        // an anonymous connection, or there might be a session cookie
+        return true;
+      }
+    }
+
+    // if there is authentication information but no secret => 401
+    if (Strings.isNullOrEmpty(authInfo.tokenOrSecret)) {
+      rsp.sendError(SC_UNAUTHORIZED);
+      return false;
+    }
+
+    Optional<AccountState> who =
+        accountCache.getByUsername(authInfo.username).filter(a -> a.getAccount().isActive());
+    if (!who.isPresent()) {
+      logger.atWarning().log(
+          authenticationFailedMsg(authInfo.username, req)
+              + ": account inactive or not provisioned in Gerrit");
+      rsp.sendError(SC_UNAUTHORIZED);
+      return false;
+    }
+
+    Account account = who.get().getAccount();
+    AuthRequest authRequest = AuthRequest.forExternalUser(authInfo.username);
+    authRequest.setEmailAddress(account.getPreferredEmail());
+    authRequest.setDisplayName(account.getFullName());
+    authRequest.setPassword(authInfo.tokenOrSecret);
+    authRequest.setAuthPlugin(authInfo.pluginName);
+    authRequest.setAuthProvider(authInfo.exportName);
+
+    try {
+      AuthResult authResult = accountManager.authenticate(authRequest);
+      WebSession ws = session.get();
+      ws.setUserAccountId(authResult.getAccountId());
+      ws.setAccessPathOk(AccessPath.GIT, true);
+      ws.setAccessPathOk(AccessPath.REST_API, true);
+      return true;
+    } catch (AccountException e) {
+      logger.atWarning().withCause(e).log(authenticationFailedMsg(authInfo.username, req));
+      rsp.sendError(SC_UNAUTHORIZED);
+      return false;
+    }
+  }
+
+  /**
+   * Picks the only installed OAuth provider. If there is a multiude of providers available, the
+   * actual provider must be determined from the authentication request.
+   *
+   * @throws ServletException if there is no {@code OAuthLoginProvider} installed at all.
+   */
+  private void pickOnlyProvider() throws ServletException {
+    try {
+      Extension<OAuthLoginProvider> loginProvider = Iterables.getOnlyElement(loginProviders);
+      defaultAuthPlugin = loginProvider.getPluginName();
+      defaultAuthProvider = loginProvider.getExportName();
+    } catch (NoSuchElementException e) {
+      throw new ServletException("No OAuth login provider installed");
+    } catch (IllegalArgumentException e) {
+      // multiple providers found => do not pick any
+    }
+  }
+
+  /**
+   * Picks the {@code OAuthLoginProvider} configured with <tt>auth.gitOAuthProvider</tt>.
+   *
+   * @throws ServletException if the configured provider was not found.
+   */
+  private void pickConfiguredProvider() throws ServletException {
+    int splitPos = gitOAuthProvider.lastIndexOf(':');
+    if (splitPos < 1 || splitPos == gitOAuthProvider.length() - 1) {
+      // no colon at all or leading/trailing colon: malformed providerId
+      throw new ServletException(
+          "OAuth login provider configuration is"
+              + " invalid: Must be of the form pluginName:providerName");
+    }
+    defaultAuthPlugin = gitOAuthProvider.substring(0, splitPos);
+    defaultAuthProvider = gitOAuthProvider.substring(splitPos + 1);
+    OAuthLoginProvider provider = loginProviders.get(defaultAuthPlugin, defaultAuthProvider);
+    if (provider == null) {
+      throw new ServletException(
+          "Configured OAuth login provider " + gitOAuthProvider + " wasn't installed");
+    }
+  }
+
+  private AuthInfo extractAuthInfo(String hdr, String encoding)
+      throws UnsupportedEncodingException {
+    byte[] decoded = Base64.decodeBase64(hdr.substring(BASIC.length()));
+    String usernamePassword = new String(decoded, encoding);
+    int splitPos = usernamePassword.indexOf(':');
+    if (splitPos < 1 || splitPos == usernamePassword.length() - 1) {
+      return null;
+    }
+    return new AuthInfo(
+        usernamePassword.substring(0, splitPos),
+        usernamePassword.substring(splitPos + 1),
+        defaultAuthPlugin,
+        defaultAuthProvider);
+  }
+
+  private AuthInfo extractAuthInfo(Cookie cookie) throws UnsupportedEncodingException {
+    String username =
+        URLDecoder.decode(cookie.getName().substring(GIT_COOKIE_PREFIX.length()), UTF_8.name());
+    String value = cookie.getValue();
+    int splitPos = value.lastIndexOf('@');
+    if (splitPos < 1 || splitPos == value.length() - 1) {
+      // no providerId in the cookie value => assume default provider
+      // note: a leading/trailing at sign is considered to belong to
+      // the access token rather than being a separator
+      return new AuthInfo(username, cookie.getValue(), defaultAuthPlugin, defaultAuthProvider);
+    }
+    String token = value.substring(0, splitPos);
+    String providerId = value.substring(splitPos + 1);
+    splitPos = providerId.lastIndexOf(':');
+    if (splitPos < 1 || splitPos == providerId.length() - 1) {
+      // no colon at all or leading/trailing colon: malformed providerId
+      return null;
+    }
+    String pluginName = providerId.substring(0, splitPos);
+    String exportName = providerId.substring(splitPos + 1);
+    OAuthLoginProvider provider = loginProviders.get(pluginName, exportName);
+    if (provider == null) {
+      return null;
+    }
+    return new AuthInfo(username, token, pluginName, exportName);
+  }
+
+  private static String encoding(HttpServletRequest req) {
+    return MoreObjects.firstNonNull(req.getCharacterEncoding(), UTF_8.name());
+  }
+
+  private static Cookie findGitCookie(HttpServletRequest req) {
+    Cookie[] cookies = req.getCookies();
+    if (cookies != null) {
+      for (Cookie cookie : cookies) {
+        if (cookie.getName().startsWith(GIT_COOKIE_PREFIX)) {
+          return cookie;
+        }
+      }
+    }
+    return null;
+  }
+
+  private class AuthInfo {
+    private final String username;
+    private final String tokenOrSecret;
+    private final String pluginName;
+    private final String exportName;
+
+    private AuthInfo(String username, String tokenOrSecret, String pluginName, String exportName) {
+      this.username = userNameToLowerCase ? username.toLowerCase(Locale.US) : username;
+      this.tokenOrSecret = tokenOrSecret;
+      this.pluginName = pluginName;
+      this.exportName = exportName;
+    }
+  }
+
+  private static class Response extends HttpServletResponseWrapper {
+    private static final String WWW_AUTHENTICATE = "WWW-Authenticate";
+
+    Response(HttpServletResponse rsp) {
+      super(rsp);
+    }
+
+    private void status(int sc) {
+      if (sc == SC_UNAUTHORIZED) {
+        StringBuilder v = new StringBuilder();
+        v.append(BASIC);
+        v.append("realm=\"").append(REALM_NAME).append("\"");
+        setHeader(WWW_AUTHENTICATE, v.toString());
+      } else if (containsHeader(WWW_AUTHENTICATE)) {
+        setHeader(WWW_AUTHENTICATE, null);
+      }
+    }
+
+    @Override
+    public void sendError(int sc, String msg) throws IOException {
+      status(sc);
+      super.sendError(sc, msg);
+    }
+
+    @Override
+    public void sendError(int sc) throws IOException {
+      status(sc);
+      super.sendError(sc);
+    }
+
+    @Override
+    @Deprecated
+    public void setStatus(int sc, String sm) {
+      status(sc);
+      super.setStatus(sc, sm);
+    }
+
+    @Override
+    public void setStatus(int sc) {
+      status(sc);
+      super.setStatus(sc);
+    }
+  }
+}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProxyProperties.java b/java/com/google/gerrit/httpd/ProxyProperties.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProxyProperties.java
rename to java/com/google/gerrit/httpd/ProxyProperties.java
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProxyPropertiesProvider.java b/java/com/google/gerrit/httpd/ProxyPropertiesProvider.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProxyPropertiesProvider.java
rename to java/com/google/gerrit/httpd/ProxyPropertiesProvider.java
diff --git a/java/com/google/gerrit/httpd/QueryDocumentationFilter.java b/java/com/google/gerrit/httpd/QueryDocumentationFilter.java
new file mode 100644
index 0000000..c41a7b9
--- /dev/null
+++ b/java/com/google/gerrit/httpd/QueryDocumentationFilter.java
@@ -0,0 +1,71 @@
+// Copyright (C) 2013 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.google.gerrit.httpd;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.httpd.restapi.RestApiServlet;
+import com.google.gerrit.server.documentation.QueryDocumentationExecutor;
+import com.google.gerrit.server.documentation.QueryDocumentationExecutor.DocQueryException;
+import com.google.gerrit.server.documentation.QueryDocumentationExecutor.DocResult;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.List;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@Singleton
+public class QueryDocumentationFilter implements Filter {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final QueryDocumentationExecutor searcher;
+
+  @Inject
+  QueryDocumentationFilter(QueryDocumentationExecutor searcher) {
+    this.searcher = searcher;
+  }
+
+  @Override
+  public void init(FilterConfig filterConfig) {}
+
+  @Override
+  public void destroy() {}
+
+  @Override
+  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+      throws IOException, ServletException {
+    HttpServletRequest req = (HttpServletRequest) request;
+    if ("GET".equals(req.getMethod()) && !Strings.isNullOrEmpty(req.getParameter("q"))) {
+      HttpServletResponse rsp = (HttpServletResponse) response;
+      try {
+        List<DocResult> result = searcher.doQuery(request.getParameter("q"));
+        RestApiServlet.replyJson(req, rsp, false, ImmutableListMultimap.of(), result);
+      } catch (DocQueryException e) {
+        logger.atSevere().withCause(e).log("Doc search failed");
+        rsp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+      }
+    } else {
+      chain.doFilter(request, response);
+    }
+  }
+}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RemoteUserUtil.java b/java/com/google/gerrit/httpd/RemoteUserUtil.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/RemoteUserUtil.java
rename to java/com/google/gerrit/httpd/RemoteUserUtil.java
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RequestContextFilter.java b/java/com/google/gerrit/httpd/RequestContextFilter.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/RequestContextFilter.java
rename to java/com/google/gerrit/httpd/RequestContextFilter.java
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RequestMetrics.java b/java/com/google/gerrit/httpd/RequestMetrics.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/RequestMetrics.java
rename to java/com/google/gerrit/httpd/RequestMetrics.java
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RequestMetricsFilter.java b/java/com/google/gerrit/httpd/RequestMetricsFilter.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/RequestMetricsFilter.java
rename to java/com/google/gerrit/httpd/RequestMetricsFilter.java
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RequireIdentifiedUserFilter.java b/java/com/google/gerrit/httpd/RequireIdentifiedUserFilter.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/RequireIdentifiedUserFilter.java
rename to java/com/google/gerrit/httpd/RequireIdentifiedUserFilter.java
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RequireSslFilter.java b/java/com/google/gerrit/httpd/RequireSslFilter.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/RequireSslFilter.java
rename to java/com/google/gerrit/httpd/RequireSslFilter.java
diff --git a/java/com/google/gerrit/httpd/RunAsFilter.java b/java/com/google/gerrit/httpd/RunAsFilter.java
new file mode 100644
index 0000000..f3bf5af
--- /dev/null
+++ b/java/com/google/gerrit/httpd/RunAsFilter.java
@@ -0,0 +1,129 @@
+// Copyright (C) 2013 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.google.gerrit.httpd;
+
+import static com.google.gerrit.httpd.restapi.RestApiServlet.replyError;
+import static javax.servlet.http.HttpServletResponse.SC_FORBIDDEN;
+import static javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.AccountResolver;
+import com.google.gerrit.server.config.AuthConfig;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.google.inject.servlet.ServletModule;
+import java.io.IOException;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+/** Allows running a request as another user account. */
+@Singleton
+class RunAsFilter implements Filter {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+  private static final String RUN_AS = "X-Gerrit-RunAs";
+
+  static class Module extends ServletModule {
+    @Override
+    protected void configureServlets() {
+      filter("/*").through(RunAsFilter.class);
+    }
+  }
+
+  private final boolean enabled;
+  private final DynamicItem<WebSession> session;
+  private final PermissionBackend permissionBackend;
+  private final AccountResolver accountResolver;
+
+  @Inject
+  RunAsFilter(
+      AuthConfig config,
+      DynamicItem<WebSession> session,
+      PermissionBackend permissionBackend,
+      AccountResolver accountResolver) {
+    this.enabled = config.isRunAsEnabled();
+    this.session = session;
+    this.permissionBackend = permissionBackend;
+    this.accountResolver = accountResolver;
+  }
+
+  @Override
+  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+      throws IOException, ServletException {
+    HttpServletRequest req = (HttpServletRequest) request;
+    HttpServletResponse res = (HttpServletResponse) response;
+
+    String runas = req.getHeader(RUN_AS);
+    if (runas != null) {
+      if (!enabled) {
+        replyError(req, res, SC_FORBIDDEN, RUN_AS + " disabled by auth.enableRunAs = false", null);
+        return;
+      }
+
+      CurrentUser self = session.get().getUser();
+      try {
+        if (!self.isIdentifiedUser()) {
+          // Always disallow for anonymous users, even if permitted by the ACL,
+          // because that would be crazy.
+          throw new AuthException("denied");
+        }
+        permissionBackend.user(self).check(GlobalPermission.RUN_AS);
+      } catch (AuthException e) {
+        replyError(req, res, SC_FORBIDDEN, "not permitted to use " + RUN_AS, null);
+        return;
+      } catch (PermissionBackendException e) {
+        logger.atWarning().withCause(e).log("cannot check runAs");
+        replyError(req, res, SC_INTERNAL_SERVER_ERROR, RUN_AS + " unavailable", null);
+        return;
+      }
+
+      Account target;
+      try {
+        target = accountResolver.find(runas);
+      } catch (OrmException | IOException | ConfigInvalidException e) {
+        logger.atWarning().withCause(e).log("cannot resolve account for %s", RUN_AS);
+        replyError(req, res, SC_INTERNAL_SERVER_ERROR, "cannot resolve " + RUN_AS, e);
+        return;
+      }
+      if (target == null) {
+        replyError(req, res, SC_FORBIDDEN, "no account matches " + RUN_AS, null);
+        return;
+      }
+      session.get().setUserAccountId(target.getId());
+    }
+
+    chain.doFilter(req, res);
+  }
+
+  @Override
+  public void init(FilterConfig filterConfig) {}
+
+  @Override
+  public void destroy() {}
+}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/UniversalWebLoginFilter.java b/java/com/google/gerrit/httpd/UniversalWebLoginFilter.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/UniversalWebLoginFilter.java
rename to java/com/google/gerrit/httpd/UniversalWebLoginFilter.java
diff --git a/java/com/google/gerrit/httpd/UrlModule.java b/java/com/google/gerrit/httpd/UrlModule.java
new file mode 100644
index 0000000..94855b9
--- /dev/null
+++ b/java/com/google/gerrit/httpd/UrlModule.java
@@ -0,0 +1,293 @@
+// Copyright (C) 2009 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.google.gerrit.httpd;
+
+import static com.google.inject.Scopes.SINGLETON;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.common.PageLinks;
+import com.google.gerrit.extensions.client.AuthType;
+import com.google.gerrit.httpd.raw.CatServlet;
+import com.google.gerrit.httpd.raw.HostPageServlet;
+import com.google.gerrit.httpd.raw.LegacyGerritServlet;
+import com.google.gerrit.httpd.raw.SshInfoServlet;
+import com.google.gerrit.httpd.raw.ToolServlet;
+import com.google.gerrit.httpd.restapi.AccessRestApiServlet;
+import com.google.gerrit.httpd.restapi.AccountsRestApiServlet;
+import com.google.gerrit.httpd.restapi.ChangesRestApiServlet;
+import com.google.gerrit.httpd.restapi.ConfigRestApiServlet;
+import com.google.gerrit.httpd.restapi.GroupsRestApiServlet;
+import com.google.gerrit.httpd.restapi.ProjectsRestApiServlet;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.config.AuthConfig;
+import com.google.gerrit.server.config.GerritOptions;
+import com.google.inject.Key;
+import com.google.inject.Provider;
+import com.google.inject.internal.UniqueAnnotations;
+import com.google.inject.servlet.ServletModule;
+import java.io.IOException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.eclipse.jgit.lib.Constants;
+
+class UrlModule extends ServletModule {
+  private GerritOptions options;
+  private AuthConfig authConfig;
+
+  UrlModule(GerritOptions options, AuthConfig authConfig) {
+    this.options = options;
+    this.authConfig = authConfig;
+  }
+
+  @Override
+  protected void configureServlets() {
+    filter("/*").through(GwtCacheControlFilter.class);
+
+    if (options.enableGwtUi()) {
+      filter("/").through(XsrfCookieFilter.class);
+      filter("/accounts/self/detail").through(XsrfCookieFilter.class);
+      serve("/").with(HostPageServlet.class);
+      serve("/Gerrit").with(LegacyGerritServlet.class);
+      serve("/Gerrit/*").with(legacyGerritScreen());
+      // Forward PolyGerrit URLs to their respective GWT equivalents.
+      serveRegex("^/(c|q|x|admin|dashboard|settings)/(.*)").with(gerritUrl());
+    }
+    serve("/cat/*").with(CatServlet.class);
+
+    if (authConfig.getAuthType() != AuthType.OAUTH && authConfig.getAuthType() != AuthType.OPENID) {
+      serve("/logout").with(HttpLogoutServlet.class);
+      serve("/signout").with(HttpLogoutServlet.class);
+    }
+    serve("/ssh_info").with(SshInfoServlet.class);
+
+    serve("/Main.class").with(notFound());
+    serve("/com/google/gerrit/launcher/*").with(notFound());
+    serve("/servlet/*").with(notFound());
+
+    serve("/all").with(query("status:merged"));
+    serve("/mine").with(screen(PageLinks.MINE));
+    serve("/open").with(query("status:open"));
+    serve("/watched").with(query("is:watched status:open"));
+    serve("/starred").with(query("is:starred"));
+
+    serveRegex("^/settings/?$").with(screen(PageLinks.SETTINGS));
+    serveRegex("^/register$").with(registerScreen(false));
+    serveRegex("^/register/(.+)$").with(registerScreen(true));
+    serveRegex("^/([1-9][0-9]*)/?$").with(directChangeById());
+    serveRegex("^/p/(.*)$").with(queryProjectNew());
+    serveRegex("^/r/(.+)/?$").with(DirectChangeByCommit.class);
+
+    filter("/a/*").through(RequireIdentifiedUserFilter.class);
+
+    // Must be after RequireIdentifiedUserFilter so auth happens before checking
+    // for RunAs capability.
+    install(new RunAsFilter.Module());
+
+    serveRegex("^/(?:a/)?tools/(.*)$").with(ToolServlet.class);
+
+    // Bind servlets for REST root collections.
+    // The '/plugins/' root collection is already handled by HttpPluginServlet
+    // which is bound in HttpPluginModule. We cannot bind it here again although
+    // this means that plugins can't add REST views on PLUGIN_KIND.
+    serveRegex("^/(?:a/)?access/(.*)$").with(AccessRestApiServlet.class);
+    serveRegex("^/(?:a/)?accounts/(.*)$").with(AccountsRestApiServlet.class);
+    serveRegex("^/(?:a/)?changes/(.*)$").with(ChangesRestApiServlet.class);
+    serveRegex("^/(?:a/)?config/(.*)$").with(ConfigRestApiServlet.class);
+    serveRegex("^/(?:a/)?groups/(.*)?$").with(GroupsRestApiServlet.class);
+    serveRegex("^/(?:a/)?projects/(.*)?$").with(ProjectsRestApiServlet.class);
+
+    serveRegex("^/Documentation$").with(redirectDocumentation());
+    serveRegex("^/Documentation/$").with(redirectDocumentation());
+    filter("/Documentation/*").through(QueryDocumentationFilter.class);
+  }
+
+  private Key<HttpServlet> notFound() {
+    return key(
+        new HttpServlet() {
+          private static final long serialVersionUID = 1L;
+
+          @Override
+          protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
+            rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
+          }
+        });
+  }
+
+  private Key<HttpServlet> gerritUrl() {
+    return key(
+        new HttpServlet() {
+          private static final long serialVersionUID = 1L;
+
+          @Override
+          protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
+            String path = req.getRequestURI().substring(req.getContextPath().length());
+            toGerrit(path, req, rsp, true);
+          }
+        });
+  }
+
+  private Key<HttpServlet> screen(String target) {
+    return key(
+        new HttpServlet() {
+          private static final long serialVersionUID = 1L;
+
+          @Override
+          protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
+            toGerrit(target, req, rsp);
+          }
+        });
+  }
+
+  private Key<HttpServlet> legacyGerritScreen() {
+    return key(
+        new HttpServlet() {
+          private static final long serialVersionUID = 1L;
+
+          @Override
+          protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
+            final String token = req.getPathInfo().substring(1);
+            toGerrit(token, req, rsp);
+          }
+        });
+  }
+
+  private Key<HttpServlet> directChangeById() {
+    return key(
+        new HttpServlet() {
+          private static final long serialVersionUID = 1L;
+
+          @Override
+          protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
+            try {
+              String idString = req.getPathInfo();
+              if (idString.endsWith("/")) {
+                idString = idString.substring(0, idString.length() - 1);
+              }
+              Change.Id id = Change.Id.parse(idString);
+              // User accessed Gerrit with /1234, so we have no project yet.
+              // TODO(hiesel) Replace with a preflight request to obtain project before we deprecate
+              // the numeric change id.
+              toGerrit(PageLinks.toChange(null, id), req, rsp);
+            } catch (IllegalArgumentException err) {
+              rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
+            }
+          }
+        });
+  }
+
+  private Key<HttpServlet> queryProjectNew() {
+    return key(
+        new HttpServlet() {
+          private static final long serialVersionUID = 1L;
+
+          @Override
+          protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
+            String name = req.getPathInfo();
+            if (Strings.isNullOrEmpty(name)) {
+              toGerrit(PageLinks.ADMIN_PROJECTS, req, rsp);
+              return;
+            }
+
+            while (name.endsWith("/")) {
+              name = name.substring(0, name.length() - 1);
+            }
+            if (name.endsWith(Constants.DOT_GIT_EXT)) {
+              name =
+                  name.substring(
+                      0, //
+                      name.length() - Constants.DOT_GIT_EXT.length());
+            }
+            while (name.endsWith("/")) {
+              name = name.substring(0, name.length() - 1);
+            }
+            Project.NameKey project = new Project.NameKey(name);
+            toGerrit(
+                PageLinks.toChangeQuery(PageLinks.projectQuery(project, Change.Status.NEW)),
+                req,
+                rsp);
+          }
+        });
+  }
+
+  private Key<HttpServlet> query(String query) {
+    return key(
+        new HttpServlet() {
+          private static final long serialVersionUID = 1L;
+
+          @Override
+          protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
+            toGerrit(PageLinks.toChangeQuery(query), req, rsp);
+          }
+        });
+  }
+
+  private Key<HttpServlet> key(HttpServlet servlet) {
+    final Key<HttpServlet> srv = Key.get(HttpServlet.class, UniqueAnnotations.create());
+    bind(srv)
+        .toProvider(
+            new Provider<HttpServlet>() {
+              @Override
+              public HttpServlet get() {
+                return servlet;
+              }
+            })
+        .in(SINGLETON);
+    return srv;
+  }
+
+  private Key<HttpServlet> registerScreen(final Boolean slash) {
+    return key(
+        new HttpServlet() {
+          private static final long serialVersionUID = 1L;
+
+          @Override
+          protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
+            String path = String.format("/register%s", slash ? req.getPathInfo() : "");
+            toGerrit(path, req, rsp);
+          }
+        });
+  }
+
+  private Key<HttpServlet> redirectDocumentation() {
+    return key(
+        new HttpServlet() {
+          private static final long serialVersionUID = 1L;
+
+          @Override
+          protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
+            String path = "/Documentation/index.html";
+            toGerrit(path, req, rsp);
+          }
+        });
+  }
+
+  static void toGerrit(String target, HttpServletRequest req, HttpServletResponse rsp)
+      throws IOException {
+    toGerrit(target, req, rsp, false);
+  }
+
+  static void toGerrit(String target, HttpServletRequest req, HttpServletResponse rsp, boolean gwt)
+      throws IOException {
+    final StringBuilder url = new StringBuilder();
+    url.append(req.getContextPath());
+    if (gwt) {
+      url.append("/#");
+    }
+    url.append(target);
+    rsp.sendRedirect(url.toString());
+  }
+}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebLoginListener.java b/java/com/google/gerrit/httpd/WebLoginListener.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebLoginListener.java
rename to java/com/google/gerrit/httpd/WebLoginListener.java
diff --git a/java/com/google/gerrit/httpd/WebModule.java b/java/com/google/gerrit/httpd/WebModule.java
new file mode 100644
index 0000000..d115f43
--- /dev/null
+++ b/java/com/google/gerrit/httpd/WebModule.java
@@ -0,0 +1,115 @@
+// Copyright (C) 2009 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.google.gerrit.httpd;
+
+import static com.google.gerrit.extensions.registration.PrivateInternals_DynamicTypes.registerInParentInjectors;
+
+import com.google.gerrit.httpd.auth.become.BecomeAnyAccountModule;
+import com.google.gerrit.httpd.auth.container.HttpAuthModule;
+import com.google.gerrit.httpd.auth.container.HttpsClientSslCertModule;
+import com.google.gerrit.httpd.auth.ldap.LdapAuthModule;
+import com.google.gerrit.httpd.gitweb.GitwebModule;
+import com.google.gerrit.httpd.rpc.UiRpcModule;
+import com.google.gerrit.lifecycle.LifecycleModule;
+import com.google.gerrit.server.RemotePeer;
+import com.google.gerrit.server.config.AuthConfig;
+import com.google.gerrit.server.config.GerritOptions;
+import com.google.gerrit.server.config.GerritRequestModule;
+import com.google.gerrit.server.config.GitwebCgiConfig;
+import com.google.gerrit.server.git.receive.AsyncReceiveCommits;
+import com.google.gerrit.server.util.GuiceRequestScopePropagator;
+import com.google.gerrit.server.util.RequestScopePropagator;
+import com.google.inject.Inject;
+import com.google.inject.ProvisionException;
+import com.google.inject.servlet.RequestScoped;
+import java.net.SocketAddress;
+
+public class WebModule extends LifecycleModule {
+  private final AuthConfig authConfig;
+  private final GitwebCgiConfig gitwebCgiConfig;
+  private final GerritOptions options;
+
+  @Inject
+  WebModule(AuthConfig authConfig, GerritOptions options, GitwebCgiConfig gitwebCgiConfig) {
+    this.authConfig = authConfig;
+    this.options = options;
+    this.gitwebCgiConfig = gitwebCgiConfig;
+  }
+
+  @Override
+  protected void configure() {
+    bind(RequestScopePropagator.class).to(GuiceRequestScopePropagator.class);
+    bind(HttpRequestContext.class);
+
+    installAuthModule();
+    if (options.enableMasterFeatures()) {
+      install(new UrlModule(options, authConfig));
+      if (options.enableGwtUi()) {
+        install(new UiRpcModule());
+      }
+    }
+    install(new GerritRequestModule());
+    install(new GitOverHttpServlet.Module(options.enableMasterFeatures()));
+
+    if (gitwebCgiConfig.getGitwebCgi() != null) {
+      install(new GitwebModule());
+    }
+
+    install(new AsyncReceiveCommits.Module());
+
+    bind(SocketAddress.class)
+        .annotatedWith(RemotePeer.class)
+        .toProvider(HttpRemotePeerProvider.class)
+        .in(RequestScoped.class);
+
+    bind(ProxyProperties.class).toProvider(ProxyPropertiesProvider.class);
+
+    listener().toInstance(registerInParentInjectors());
+
+    install(UniversalWebLoginFilter.module());
+  }
+
+  private void installAuthModule() {
+    switch (authConfig.getAuthType()) {
+      case HTTP:
+      case HTTP_LDAP:
+        install(new HttpAuthModule(authConfig));
+        break;
+
+      case CLIENT_SSL_CERT_LDAP:
+        install(new HttpsClientSslCertModule());
+        break;
+
+      case LDAP:
+      case LDAP_BIND:
+        install(new LdapAuthModule());
+        break;
+
+      case DEVELOPMENT_BECOME_ANY_ACCOUNT:
+        install(new BecomeAnyAccountModule());
+        break;
+
+      case OAUTH:
+        // OAuth support is bound in WebAppInitializer and Daemon.
+      case OPENID:
+      case OPENID_SSO:
+        // OpenID support is bound in WebAppInitializer and Daemon.
+      case CUSTOM_EXTENSION:
+        break;
+      default:
+        throw new ProvisionException("Unsupported loginType: " + authConfig.getAuthType());
+    }
+  }
+}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSession.java b/java/com/google/gerrit/httpd/WebSession.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSession.java
rename to java/com/google/gerrit/httpd/WebSession.java
diff --git a/java/com/google/gerrit/httpd/WebSessionManager.java b/java/com/google/gerrit/httpd/WebSessionManager.java
new file mode 100644
index 0000000..cb1e965
--- /dev/null
+++ b/java/com/google/gerrit/httpd/WebSessionManager.java
@@ -0,0 +1,310 @@
+// Copyright (C) 2009 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.google.gerrit.httpd;
+
+import static com.google.gerrit.httpd.CacheBasedWebSession.MAX_AGE_MINUTES;
+import static com.google.gerrit.server.ioutil.BasicSerialization.readFixInt64;
+import static com.google.gerrit.server.ioutil.BasicSerialization.readString;
+import static com.google.gerrit.server.ioutil.BasicSerialization.readVarInt32;
+import static com.google.gerrit.server.ioutil.BasicSerialization.writeBytes;
+import static com.google.gerrit.server.ioutil.BasicSerialization.writeFixInt64;
+import static com.google.gerrit.server.ioutil.BasicSerialization.writeString;
+import static com.google.gerrit.server.ioutil.BasicSerialization.writeVarInt32;
+import static com.google.gerrit.server.util.time.TimeUtil.nowMs;
+import static java.util.concurrent.TimeUnit.HOURS;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.MINUTES;
+import static java.util.concurrent.TimeUnit.SECONDS;
+
+import com.google.common.cache.Cache;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.config.ConfigUtil;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.security.SecureRandom;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.lib.Config;
+
+public class WebSessionManager {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+  public static final String CACHE_NAME = "web_sessions";
+
+  private final long sessionMaxAgeMillis;
+  private final SecureRandom prng;
+  private final Cache<String, Val> self;
+
+  @Inject
+  WebSessionManager(@GerritServerConfig Config cfg, @Assisted Cache<String, Val> cache) {
+    prng = new SecureRandom();
+    self = cache;
+
+    sessionMaxAgeMillis =
+        SECONDS.toMillis(
+            ConfigUtil.getTimeUnit(
+                cfg,
+                "cache",
+                CACHE_NAME,
+                "maxAge",
+                SECONDS.convert(MAX_AGE_MINUTES, MINUTES),
+                SECONDS));
+    if (sessionMaxAgeMillis < MINUTES.toMillis(5)) {
+      logger.atWarning().log(
+          "cache.%s.maxAge is set to %d milliseconds; it should be at least 5 minutes.",
+          CACHE_NAME, sessionMaxAgeMillis);
+    }
+  }
+
+  Key createKey(Account.Id who) {
+    return new Key(newUniqueToken(who));
+  }
+
+  private String newUniqueToken(Account.Id who) {
+    try {
+      final int nonceLen = 20;
+      final ByteArrayOutputStream buf;
+      final byte[] rnd = new byte[nonceLen];
+      prng.nextBytes(rnd);
+
+      buf = new ByteArrayOutputStream(3 + nonceLen);
+      writeVarInt32(buf, (int) Val.serialVersionUID);
+      writeVarInt32(buf, who.get());
+      writeBytes(buf, rnd);
+
+      return CookieBase64.encode(buf.toByteArray());
+    } catch (IOException e) {
+      throw new RuntimeException("Cannot produce new account cookie", e);
+    }
+  }
+
+  Val createVal(Key key, Val val) {
+    Account.Id who = val.getAccountId();
+    boolean remember = val.isPersistentCookie();
+    ExternalId.Key lastLogin = val.getExternalId();
+    return createVal(key, who, remember, lastLogin, val.sessionId, val.auth);
+  }
+
+  Val createVal(
+      Key key,
+      Account.Id who,
+      boolean remember,
+      ExternalId.Key lastLogin,
+      String sid,
+      String auth) {
+    // Refresh the cookie every hour or when it is half-expired.
+    // This reduces the odds that the user session will be kicked
+    // early but also avoids us needing to refresh the cookie on
+    // every single request.
+    //
+    final long halfAgeRefresh = sessionMaxAgeMillis >>> 1;
+    final long minRefresh = MILLISECONDS.convert(1, HOURS);
+    final long refresh = Math.min(halfAgeRefresh, minRefresh);
+    final long now = nowMs();
+    final long refreshCookieAt = now + refresh;
+    final long expiresAt = now + sessionMaxAgeMillis;
+    if (sid == null) {
+      sid = newUniqueToken(who);
+    }
+    if (auth == null) {
+      auth = newUniqueToken(who);
+    }
+
+    Val val = new Val(who, refreshCookieAt, remember, lastLogin, expiresAt, sid, auth);
+    self.put(key.token, val);
+    return val;
+  }
+
+  int getCookieAge(Val val) {
+    if (val.isPersistentCookie()) {
+      // Client may store the cookie until we would remove it from our
+      // own cache, after which it will certainly be invalid.
+      //
+      return (int) MILLISECONDS.toSeconds(sessionMaxAgeMillis);
+    }
+    // Client should not store the cookie, as the user asked for us
+    // to not remember them long-term. Sending -1 as the age will
+    // cause the cookie to be only for this "browser session", which
+    // is usually until the user exits their browser.
+    //
+    return -1;
+  }
+
+  Val get(Key key) {
+    Val val = self.getIfPresent(key.token);
+    if (val != null && val.expiresAt <= nowMs()) {
+      self.invalidate(key.token);
+      return null;
+    }
+    return val;
+  }
+
+  void destroy(Key key) {
+    self.invalidate(key.token);
+  }
+
+  static final class Key {
+    private transient String token;
+
+    Key(String t) {
+      token = t;
+    }
+
+    String getToken() {
+      return token;
+    }
+
+    @Override
+    public int hashCode() {
+      return token.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+      return obj instanceof Key && token.equals(((Key) obj).token);
+    }
+  }
+
+  public static final class Val implements Serializable {
+    static final long serialVersionUID = 2L;
+
+    private transient Account.Id accountId;
+    private transient long refreshCookieAt;
+    private transient boolean persistentCookie;
+    private transient ExternalId.Key externalId;
+    private transient long expiresAt;
+    private transient String sessionId;
+    private transient String auth;
+
+    Val(
+        Account.Id accountId,
+        long refreshCookieAt,
+        boolean persistentCookie,
+        ExternalId.Key externalId,
+        long expiresAt,
+        String sessionId,
+        String auth) {
+      this.accountId = accountId;
+      this.refreshCookieAt = refreshCookieAt;
+      this.persistentCookie = persistentCookie;
+      this.externalId = externalId;
+      this.expiresAt = expiresAt;
+      this.sessionId = sessionId;
+      this.auth = auth;
+    }
+
+    public long getExpiresAt() {
+      return expiresAt;
+    }
+
+    Account.Id getAccountId() {
+      return accountId;
+    }
+
+    ExternalId.Key getExternalId() {
+      return externalId;
+    }
+
+    String getSessionId() {
+      return sessionId;
+    }
+
+    String getAuth() {
+      return auth;
+    }
+
+    boolean needsCookieRefresh() {
+      return refreshCookieAt <= nowMs();
+    }
+
+    boolean isPersistentCookie() {
+      return persistentCookie;
+    }
+
+    private void writeObject(ObjectOutputStream out) throws IOException {
+      writeVarInt32(out, 1);
+      writeVarInt32(out, accountId.get());
+
+      writeVarInt32(out, 2);
+      writeFixInt64(out, refreshCookieAt);
+
+      writeVarInt32(out, 3);
+      writeVarInt32(out, persistentCookie ? 1 : 0);
+
+      if (externalId != null) {
+        writeVarInt32(out, 4);
+        writeString(out, externalId.toString());
+      }
+
+      if (sessionId != null) {
+        writeVarInt32(out, 5);
+        writeString(out, sessionId);
+      }
+
+      writeVarInt32(out, 6);
+      writeFixInt64(out, expiresAt);
+
+      if (auth != null) {
+        writeVarInt32(out, 7);
+        writeString(out, auth);
+      }
+
+      writeVarInt32(out, 0);
+    }
+
+    private void readObject(ObjectInputStream in) throws IOException {
+      PARSE:
+      for (; ; ) {
+        final int tag = readVarInt32(in);
+        switch (tag) {
+          case 0:
+            break PARSE;
+          case 1:
+            accountId = new Account.Id(readVarInt32(in));
+            continue;
+          case 2:
+            refreshCookieAt = readFixInt64(in);
+            continue;
+          case 3:
+            persistentCookie = readVarInt32(in) != 0;
+            continue;
+          case 4:
+            externalId = ExternalId.Key.parse(readString(in));
+            continue;
+          case 5:
+            sessionId = readString(in);
+            continue;
+          case 6:
+            expiresAt = readFixInt64(in);
+            continue;
+          case 7:
+            auth = readString(in);
+            continue;
+          default:
+            throw new IOException("Unknown tag found in object: " + tag);
+        }
+      }
+      if (expiresAt == 0) {
+        expiresAt = refreshCookieAt + TimeUnit.HOURS.toMillis(2);
+      }
+    }
+  }
+}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSessionManagerFactory.java b/java/com/google/gerrit/httpd/WebSessionManagerFactory.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSessionManagerFactory.java
rename to java/com/google/gerrit/httpd/WebSessionManagerFactory.java
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSshGlueModule.java b/java/com/google/gerrit/httpd/WebSshGlueModule.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSshGlueModule.java
rename to java/com/google/gerrit/httpd/WebSshGlueModule.java
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/XsrfCookieFilter.java b/java/com/google/gerrit/httpd/XsrfCookieFilter.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/XsrfCookieFilter.java
rename to java/com/google/gerrit/httpd/XsrfCookieFilter.java
diff --git a/java/com/google/gerrit/httpd/auth/become/BecomeAnyAccountLoginServlet.java b/java/com/google/gerrit/httpd/auth/become/BecomeAnyAccountLoginServlet.java
new file mode 100644
index 0000000..9cf8b58
--- /dev/null
+++ b/java/com/google/gerrit/httpd/auth/become/BecomeAnyAccountLoginServlet.java
@@ -0,0 +1,255 @@
+// Copyright (C) 2009 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.google.gerrit.httpd.auth.become;
+
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_USERNAME;
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_UUID;
+
+import com.google.gerrit.common.PageLinks;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.httpd.HtmlDomUtil;
+import com.google.gerrit.httpd.LoginUrlToken;
+import com.google.gerrit.httpd.WebSession;
+import com.google.gerrit.httpd.template.SiteHeaderFooter;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountException;
+import com.google.gerrit.server.account.AccountManager;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.account.Accounts;
+import com.google.gerrit.server.account.AuthRequest;
+import com.google.gerrit.server.account.AuthResult;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.query.account.InternalAccountQuery;
+import com.google.gerrit.util.http.CacheHeaders;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.Writer;
+import java.util.List;
+import java.util.Optional;
+import java.util.UUID;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+@Singleton
+class BecomeAnyAccountLoginServlet extends HttpServlet {
+  private static final long serialVersionUID = 1L;
+
+  private final DynamicItem<WebSession> webSession;
+  private final SchemaFactory<ReviewDb> schema;
+  private final Accounts accounts;
+  private final AccountCache accountCache;
+  private final AccountManager accountManager;
+  private final SiteHeaderFooter headers;
+  private final Provider<InternalAccountQuery> queryProvider;
+
+  @Inject
+  BecomeAnyAccountLoginServlet(
+      DynamicItem<WebSession> ws,
+      SchemaFactory<ReviewDb> sf,
+      Accounts a,
+      AccountCache ac,
+      AccountManager am,
+      SiteHeaderFooter shf,
+      Provider<InternalAccountQuery> qp) {
+    webSession = ws;
+    schema = sf;
+    accounts = a;
+    accountCache = ac;
+    accountManager = am;
+    headers = shf;
+    queryProvider = qp;
+  }
+
+  @Override
+  protected void doGet(HttpServletRequest req, HttpServletResponse rsp)
+      throws IOException, ServletException {
+    doPost(req, rsp);
+  }
+
+  @Override
+  protected void doPost(HttpServletRequest req, HttpServletResponse rsp)
+      throws IOException, ServletException {
+    CacheHeaders.setNotCacheable(rsp);
+
+    final AuthResult res;
+    if ("create_account".equals(req.getParameter("action"))) {
+      res = create();
+
+    } else if (req.getParameter("user_name") != null) {
+      res = byUserName(req.getParameter("user_name"));
+
+    } else if (req.getParameter("preferred_email") != null) {
+      res = byPreferredEmail(req.getParameter("preferred_email")).orElse(null);
+
+    } else if (req.getParameter("account_id") != null) {
+      res = byAccountId(req.getParameter("account_id")).orElse(null);
+
+    } else {
+      byte[] raw;
+      try {
+        raw = prepareHtmlOutput();
+      } catch (OrmException e) {
+        throw new ServletException(e);
+      }
+      rsp.setContentType("text/html");
+      rsp.setCharacterEncoding(HtmlDomUtil.ENC.name());
+      rsp.setContentLength(raw.length);
+      try (OutputStream out = rsp.getOutputStream()) {
+        out.write(raw);
+      }
+      return;
+    }
+
+    if (res != null) {
+      webSession.get().login(res, false);
+      final StringBuilder rdr = new StringBuilder();
+      rdr.append(req.getContextPath());
+      rdr.append("/");
+
+      if (res.isNew()) {
+        rdr.append('#' + PageLinks.REGISTER);
+      } else {
+        rdr.append(LoginUrlToken.getToken(req));
+      }
+      rsp.sendRedirect(rdr.toString());
+
+    } else {
+      rsp.setContentType("text/html");
+      rsp.setCharacterEncoding(HtmlDomUtil.ENC.name());
+      try (Writer out = rsp.getWriter()) {
+        out.write("<html>");
+        out.write("<body>");
+        out.write("<h1>Account Not Found</h1>");
+        out.write("</body>");
+        out.write("</html>");
+      }
+    }
+  }
+
+  private byte[] prepareHtmlOutput() throws IOException, OrmException {
+    final String pageName = "BecomeAnyAccount.html";
+    Document doc = headers.parse(getClass(), pageName);
+    if (doc == null) {
+      throw new FileNotFoundException("No " + pageName + " in webapp");
+    }
+
+    Element userlistElement = HtmlDomUtil.find(doc, "userlist");
+    try (ReviewDb db = schema.open()) {
+      for (Account.Id accountId : accounts.firstNIds(100)) {
+        Optional<AccountState> accountState = accountCache.get(accountId);
+        if (!accountState.isPresent()) {
+          continue;
+        }
+        Account account = accountState.get().getAccount();
+        String displayName;
+        if (accountState.get().getUserName().isPresent()) {
+          displayName = accountState.get().getUserName().get();
+        } else if (account.getFullName() != null && !account.getFullName().isEmpty()) {
+          displayName = account.getFullName();
+        } else if (account.getPreferredEmail() != null) {
+          displayName = account.getPreferredEmail();
+        } else {
+          displayName = accountId.toString();
+        }
+
+        Element linkElement = doc.createElement("a");
+        linkElement.setAttribute("href", "?account_id=" + account.getId().toString());
+        linkElement.setTextContent(displayName);
+        userlistElement.appendChild(linkElement);
+        userlistElement.appendChild(doc.createElement("br"));
+      }
+    }
+
+    return HtmlDomUtil.toUTF8(doc);
+  }
+
+  private Optional<AuthResult> auth(Optional<AccountState> account) {
+    return account.map(a -> new AuthResult(a.getAccount().getId(), null, false));
+  }
+
+  private AuthResult auth(Account.Id account) {
+    if (account != null) {
+      return new AuthResult(account, null, false);
+    }
+    return null;
+  }
+
+  private AuthResult byUserName(String userName) {
+    try {
+      List<AccountState> accountStates =
+          queryProvider.get().byExternalId(SCHEME_USERNAME, userName);
+      if (accountStates.isEmpty()) {
+        getServletContext().log("No accounts with username " + userName + " found");
+        return null;
+      }
+      if (accountStates.size() > 1) {
+        getServletContext().log("Multiple accounts with username " + userName + " found");
+        return null;
+      }
+      return auth(accountStates.get(0).getAccount().getId());
+    } catch (OrmException e) {
+      getServletContext().log("cannot query account index", e);
+      return null;
+    }
+  }
+
+  private Optional<AuthResult> byPreferredEmail(String email) {
+    try (ReviewDb db = schema.open()) {
+      Optional<AccountState> match =
+          queryProvider.get().byPreferredEmail(email).stream().findFirst();
+      return auth(match);
+    } catch (OrmException e) {
+      getServletContext().log("cannot query database", e);
+      return Optional.empty();
+    }
+  }
+
+  private Optional<AuthResult> byAccountId(String idStr) {
+    Optional<Account.Id> id = Account.Id.tryParse(idStr);
+    if (!id.isPresent()) {
+      return Optional.empty();
+    }
+
+    try {
+      return auth(accounts.get(id.get()));
+    } catch (IOException | ConfigInvalidException e) {
+      getServletContext().log("cannot query database", e);
+      return Optional.empty();
+    }
+  }
+
+  private AuthResult create() throws IOException {
+    try {
+      return accountManager.authenticate(
+          new AuthRequest(ExternalId.Key.create(SCHEME_UUID, UUID.randomUUID().toString())));
+    } catch (AccountException e) {
+      getServletContext().log("cannot create new account", e);
+      return null;
+    }
+  }
+}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/become/BecomeAnyAccountModule.java b/java/com/google/gerrit/httpd/auth/become/BecomeAnyAccountModule.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/become/BecomeAnyAccountModule.java
rename to java/com/google/gerrit/httpd/auth/become/BecomeAnyAccountModule.java
diff --git a/java/com/google/gerrit/httpd/auth/container/HttpAuthFilter.java b/java/com/google/gerrit/httpd/auth/container/HttpAuthFilter.java
new file mode 100644
index 0000000..0b3c29d
--- /dev/null
+++ b/java/com/google/gerrit/httpd/auth/container/HttpAuthFilter.java
@@ -0,0 +1,170 @@
+// Copyright (C) 2009 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.google.gerrit.httpd.auth.container;
+
+import static com.google.common.base.MoreObjects.firstNonNull;
+import static com.google.common.base.Strings.emptyToNull;
+import static com.google.common.net.HttpHeaders.AUTHORIZATION;
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_GERRIT;
+import static java.nio.charset.StandardCharsets.ISO_8859_1;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.httpd.HtmlDomUtil;
+import com.google.gerrit.httpd.RemoteUserUtil;
+import com.google.gerrit.httpd.WebSession;
+import com.google.gerrit.httpd.raw.HostPageServlet;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.config.AuthConfig;
+import com.google.gerrit.util.http.CacheHeaders;
+import com.google.gwtjsonrpc.server.RPCServletUtils;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Locale;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Watches request for the host page and requires login if not yet signed in.
+ *
+ * <p>If HTTP authentication has been enabled on this server this filter is bound in front of the
+ * {@link HostPageServlet} and redirects users who are not yet signed in to visit {@code /login/},
+ * so the web container can force login. This redirect is performed with JavaScript, such that any
+ * existing anchor token in the URL can be rewritten and preserved through the authentication
+ * process of any enterprise single sign-on solutions.
+ */
+@Singleton
+class HttpAuthFilter implements Filter {
+  private final DynamicItem<WebSession> sessionProvider;
+  private final byte[] signInRaw;
+  private final byte[] signInGzip;
+  private final String loginHeader;
+  private final String displaynameHeader;
+  private final String emailHeader;
+  private final String externalIdHeader;
+  private final boolean userNameToLowerCase;
+
+  @Inject
+  HttpAuthFilter(DynamicItem<WebSession> webSession, AuthConfig authConfig) throws IOException {
+    this.sessionProvider = webSession;
+
+    final String pageName = "LoginRedirect.html";
+    final String doc = HtmlDomUtil.readFile(getClass(), pageName);
+    if (doc == null) {
+      throw new FileNotFoundException("No " + pageName + " in webapp");
+    }
+
+    signInRaw = doc.getBytes(HtmlDomUtil.ENC);
+    signInGzip = HtmlDomUtil.compress(signInRaw);
+    loginHeader = firstNonNull(emptyToNull(authConfig.getLoginHttpHeader()), AUTHORIZATION);
+    displaynameHeader = emptyToNull(authConfig.getHttpDisplaynameHeader());
+    emailHeader = emptyToNull(authConfig.getHttpEmailHeader());
+    externalIdHeader = emptyToNull(authConfig.getHttpExternalIdHeader());
+    userNameToLowerCase = authConfig.isUserNameToLowerCase();
+  }
+
+  @Override
+  public void doFilter(final ServletRequest request, ServletResponse response, FilterChain chain)
+      throws IOException, ServletException {
+    if (isSessionValid((HttpServletRequest) request)) {
+      chain.doFilter(request, response);
+    } else {
+      // Not signed in yet. Since the browser state might have an anchor
+      // token which we want to capture and carry through the auth process
+      // we send back JavaScript now to capture that, and do the real work
+      // of redirecting to the authentication area.
+      //
+      final HttpServletRequest req = (HttpServletRequest) request;
+      final HttpServletResponse rsp = (HttpServletResponse) response;
+      final byte[] tosend;
+      if (RPCServletUtils.acceptsGzipEncoding(req)) {
+        rsp.setHeader("Content-Encoding", "gzip");
+        tosend = signInGzip;
+      } else {
+        tosend = signInRaw;
+      }
+
+      CacheHeaders.setNotCacheable(rsp);
+      rsp.setContentType("text/html");
+      rsp.setCharacterEncoding(HtmlDomUtil.ENC.name());
+      rsp.setContentLength(tosend.length);
+      try (OutputStream out = rsp.getOutputStream()) {
+        out.write(tosend);
+      }
+    }
+  }
+
+  private boolean isSessionValid(HttpServletRequest req) {
+    WebSession session = sessionProvider.get();
+    if (session.isSignedIn()) {
+      String user = getRemoteUser(req);
+      return user == null || correctUser(user, session);
+    }
+    return false;
+  }
+
+  private static boolean correctUser(String user, WebSession session) {
+    ExternalId.Key id = session.getLastLoginExternalId();
+    return id != null && id.equals(ExternalId.Key.create(SCHEME_GERRIT, user));
+  }
+
+  String getRemoteUser(HttpServletRequest req) {
+    String remoteUser = RemoteUserUtil.getRemoteUser(req, loginHeader);
+    return (userNameToLowerCase && remoteUser != null)
+        ? remoteUser.toLowerCase(Locale.US)
+        : remoteUser;
+  }
+
+  String getRemoteDisplayname(HttpServletRequest req) {
+    if (displaynameHeader != null) {
+      String raw = req.getHeader(displaynameHeader);
+      return emptyToNull(new String(raw.getBytes(ISO_8859_1), UTF_8));
+    }
+    return null;
+  }
+
+  String getRemoteEmail(HttpServletRequest req) {
+    if (emailHeader != null) {
+      return emptyToNull(req.getHeader(emailHeader));
+    }
+    return null;
+  }
+
+  String getRemoteExternalIdToken(HttpServletRequest req) {
+    if (externalIdHeader != null) {
+      return emptyToNull(req.getHeader(externalIdHeader));
+    }
+    return null;
+  }
+
+  String getLoginHeader() {
+    return loginHeader;
+  }
+
+  @Override
+  public void init(FilterConfig filterConfig) {}
+
+  @Override
+  public void destroy() {}
+}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpAuthModule.java b/java/com/google/gerrit/httpd/auth/container/HttpAuthModule.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpAuthModule.java
rename to java/com/google/gerrit/httpd/auth/container/HttpAuthModule.java
diff --git a/java/com/google/gerrit/httpd/auth/container/HttpLoginServlet.java b/java/com/google/gerrit/httpd/auth/container/HttpLoginServlet.java
new file mode 100644
index 0000000..fd2f628
--- /dev/null
+++ b/java/com/google/gerrit/httpd/auth/container/HttpLoginServlet.java
@@ -0,0 +1,183 @@
+// Copyright (C) 2009 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.google.gerrit.httpd.auth.container;
+
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_EXTERNAL;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.PageLinks;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.httpd.CanonicalWebUrl;
+import com.google.gerrit.httpd.HtmlDomUtil;
+import com.google.gerrit.httpd.LoginUrlToken;
+import com.google.gerrit.httpd.WebSession;
+import com.google.gerrit.server.account.AccountException;
+import com.google.gerrit.server.account.AccountManager;
+import com.google.gerrit.server.account.AuthRequest;
+import com.google.gerrit.server.account.AuthResult;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.config.AuthConfig;
+import com.google.gerrit.util.http.CacheHeaders;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * Initializes the user session if HTTP authentication is enabled.
+ *
+ * <p>If HTTP authentication has been enabled this servlet binds to {@code /login/} and initializes
+ * the user session based on user information contained in the HTTP request.
+ */
+@Singleton
+class HttpLoginServlet extends HttpServlet {
+  private static final long serialVersionUID = 1L;
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final DynamicItem<WebSession> webSession;
+  private final CanonicalWebUrl urlProvider;
+  private final AccountManager accountManager;
+  private final HttpAuthFilter authFilter;
+  private final AuthConfig authConfig;
+
+  @Inject
+  HttpLoginServlet(
+      final DynamicItem<WebSession> webSession,
+      final CanonicalWebUrl urlProvider,
+      final AccountManager accountManager,
+      final HttpAuthFilter authFilter,
+      final AuthConfig authConfig) {
+    this.webSession = webSession;
+    this.urlProvider = urlProvider;
+    this.accountManager = accountManager;
+    this.authFilter = authFilter;
+    this.authConfig = authConfig;
+  }
+
+  @Override
+  protected void doGet(HttpServletRequest req, HttpServletResponse rsp)
+      throws ServletException, IOException {
+    final String token = LoginUrlToken.getToken(req);
+
+    CacheHeaders.setNotCacheable(rsp);
+    final String user = authFilter.getRemoteUser(req);
+    if (user == null || "".equals(user)) {
+      logger.atSevere().log(
+          "Unable to authenticate user by %s request header."
+              + " Check container or server configuration.",
+          authFilter.getLoginHeader());
+
+      final Document doc =
+          HtmlDomUtil.parseFile( //
+              HttpLoginServlet.class, "ConfigurationError.html");
+
+      replace(doc, "loginHeader", authFilter.getLoginHeader());
+      replace(doc, "ServerName", req.getServerName());
+      replace(doc, "ServerPort", ":" + req.getServerPort());
+      replace(doc, "ContextPath", req.getContextPath());
+
+      final byte[] bin = HtmlDomUtil.toUTF8(doc);
+      rsp.setStatus(HttpServletResponse.SC_FORBIDDEN);
+      rsp.setContentType("text/html");
+      rsp.setCharacterEncoding(UTF_8.name());
+      rsp.setContentLength(bin.length);
+      try (ServletOutputStream out = rsp.getOutputStream()) {
+        out.write(bin);
+      }
+      return;
+    }
+
+    final AuthRequest areq = AuthRequest.forUser(user);
+    areq.setDisplayName(authFilter.getRemoteDisplayname(req));
+    areq.setEmailAddress(authFilter.getRemoteEmail(req));
+    final AuthResult arsp;
+    try {
+      arsp = accountManager.authenticate(areq);
+    } catch (AccountException e) {
+      logger.atSevere().withCause(e).log("Unable to authenticate user \"%s\"", user);
+      rsp.sendError(HttpServletResponse.SC_FORBIDDEN);
+      return;
+    }
+
+    String remoteExternalId = authFilter.getRemoteExternalIdToken(req);
+    if (remoteExternalId != null) {
+      try {
+        logger.atFine().log(
+            "Associating external identity \"%s\" to user \"%s\"", remoteExternalId, user);
+        updateRemoteExternalId(arsp, remoteExternalId);
+      } catch (AccountException | OrmException | ConfigInvalidException e) {
+        logger.atSevere().withCause(e).log(
+            "Unable to associate external identity \"%s\" to user \"%s\"", remoteExternalId, user);
+        rsp.sendError(HttpServletResponse.SC_FORBIDDEN);
+        return;
+      }
+    }
+
+    final StringBuilder rdr = new StringBuilder();
+    if (arsp.isNew() && authConfig.getRegisterPageUrl() != null) {
+      rdr.append(authConfig.getRegisterPageUrl());
+    } else {
+      rdr.append(urlProvider.get(req));
+      if (arsp.isNew() && !token.startsWith(PageLinks.REGISTER + "/")) {
+        rdr.append('#' + PageLinks.REGISTER);
+      }
+      rdr.append(token);
+    }
+
+    webSession.get().login(arsp, true /* persistent cookie */);
+    rsp.sendRedirect(rdr.toString());
+  }
+
+  private void updateRemoteExternalId(AuthResult arsp, String remoteAuthToken)
+      throws AccountException, OrmException, IOException, ConfigInvalidException {
+    accountManager.updateLink(
+        arsp.getAccountId(),
+        new AuthRequest(ExternalId.Key.create(SCHEME_EXTERNAL, remoteAuthToken)));
+  }
+
+  private void replace(Document doc, String name, String value) {
+    Element e = HtmlDomUtil.find(doc, name);
+    if (e != null) {
+      e.setTextContent(value);
+    } else {
+      replaceByClass(doc, name, value);
+    }
+  }
+
+  private void replaceByClass(Node parent, String name, String value) {
+    final NodeList list = parent.getChildNodes();
+    for (int i = 0; i < list.getLength(); i++) {
+      final Node n = list.item(i);
+      if (n instanceof Element) {
+        final Element e = (Element) n;
+        if (name.equals(e.getAttribute("class"))) {
+          e.setTextContent(value);
+        }
+      }
+      replaceByClass(n, name, value);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/httpd/auth/container/HttpsClientSslCertAuthFilter.java b/java/com/google/gerrit/httpd/auth/container/HttpsClientSslCertAuthFilter.java
new file mode 100644
index 0000000..40807c0
--- /dev/null
+++ b/java/com/google/gerrit/httpd/auth/container/HttpsClientSslCertAuthFilter.java
@@ -0,0 +1,88 @@
+// Copyright (C) 2010 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.google.gerrit.httpd.auth.container;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.httpd.WebSession;
+import com.google.gerrit.server.account.AccountException;
+import com.google.gerrit.server.account.AccountManager;
+import com.google.gerrit.server.account.AuthRequest;
+import com.google.gerrit.server.account.AuthResult;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.security.cert.X509Certificate;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+
+@Singleton
+class HttpsClientSslCertAuthFilter implements Filter {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final Pattern REGEX_USERID = Pattern.compile("CN=([^,]*)");
+
+  private final DynamicItem<WebSession> webSession;
+  private final AccountManager accountManager;
+
+  @Inject
+  HttpsClientSslCertAuthFilter(
+      final DynamicItem<WebSession> webSession, AccountManager accountManager) {
+    this.webSession = webSession;
+    this.accountManager = accountManager;
+  }
+
+  @Override
+  public void destroy() {}
+
+  @Override
+  public void doFilter(ServletRequest req, ServletResponse rsp, FilterChain chain)
+      throws IOException, ServletException {
+    X509Certificate[] certs =
+        (X509Certificate[]) req.getAttribute("javax.servlet.request.X509Certificate");
+    if (certs == null || certs.length == 0) {
+      throw new ServletException(
+          "Couldn't get the attribute javax.servlet.request.X509Certificate from the request");
+    }
+    String name = certs[0].getSubjectDN().getName();
+    Matcher m = REGEX_USERID.matcher(name);
+    String userName;
+    if (m.find()) {
+      userName = m.group(1);
+    } else {
+      throw new ServletException("Couldn't extract username from your certificate");
+    }
+    final AuthRequest areq = AuthRequest.forUser(userName);
+    final AuthResult arsp;
+    try {
+      arsp = accountManager.authenticate(areq);
+    } catch (AccountException e) {
+      String err = "Unable to authenticate user \"" + userName + "\"";
+      logger.atSevere().withCause(e).log(err);
+      throw new ServletException(err, e);
+    }
+    webSession.get().login(arsp, true);
+    chain.doFilter(req, rsp);
+  }
+
+  @Override
+  public void init(FilterConfig arg0) throws ServletException {}
+}
diff --git a/java/com/google/gerrit/httpd/auth/container/HttpsClientSslCertLoginServlet.java b/java/com/google/gerrit/httpd/auth/container/HttpsClientSslCertLoginServlet.java
new file mode 100644
index 0000000..f21c96e
--- /dev/null
+++ b/java/com/google/gerrit/httpd/auth/container/HttpsClientSslCertLoginServlet.java
@@ -0,0 +1,58 @@
+// Copyright (C) 2011 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.google.gerrit.httpd.auth.container;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.httpd.LoginUrlToken;
+import com.google.gerrit.server.config.CanonicalWebUrl;
+import com.google.gerrit.util.http.CacheHeaders;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Servlet bound to {@code /login/*} to redirect after client SSL certificate login.
+ *
+ * <p>When using client SSL certificate one should normally never see the sign in dialog. However,
+ * this will happen if users session gets invalidated in some way. Like in other authentication
+ * types, we need to force page to fully reload in order to initialize a new session and create a
+ * valid xsrfKey.
+ */
+@Singleton
+public class HttpsClientSslCertLoginServlet extends HttpServlet {
+  private static final long serialVersionUID = 1L;
+
+  private final Provider<String> urlProvider;
+
+  @Inject
+  public HttpsClientSslCertLoginServlet(
+      @CanonicalWebUrl @Nullable final Provider<String> urlProvider) {
+    this.urlProvider = urlProvider;
+  }
+
+  @Override
+  protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
+    final StringBuilder rdr = new StringBuilder();
+    rdr.append(urlProvider.get());
+    rdr.append(LoginUrlToken.getToken(req));
+
+    CacheHeaders.setNotCacheable(rsp);
+    rsp.sendRedirect(rdr.toString());
+  }
+}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpsClientSslCertModule.java b/java/com/google/gerrit/httpd/auth/container/HttpsClientSslCertModule.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpsClientSslCertModule.java
rename to java/com/google/gerrit/httpd/auth/container/HttpsClientSslCertModule.java
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/ldap/LdapAuthModule.java b/java/com/google/gerrit/httpd/auth/ldap/LdapAuthModule.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/ldap/LdapAuthModule.java
rename to java/com/google/gerrit/httpd/auth/ldap/LdapAuthModule.java
diff --git a/java/com/google/gerrit/httpd/auth/ldap/LdapLoginServlet.java b/java/com/google/gerrit/httpd/auth/ldap/LdapLoginServlet.java
new file mode 100644
index 0000000..a09866e
--- /dev/null
+++ b/java/com/google/gerrit/httpd/auth/ldap/LdapLoginServlet.java
@@ -0,0 +1,154 @@
+// Copyright (C) 2009 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.google.gerrit.httpd.auth.ldap;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.httpd.CanonicalWebUrl;
+import com.google.gerrit.httpd.HtmlDomUtil;
+import com.google.gerrit.httpd.LoginUrlToken;
+import com.google.gerrit.httpd.WebSession;
+import com.google.gerrit.httpd.template.SiteHeaderFooter;
+import com.google.gerrit.server.account.AccountException;
+import com.google.gerrit.server.account.AccountManager;
+import com.google.gerrit.server.account.AccountUserNameException;
+import com.google.gerrit.server.account.AuthRequest;
+import com.google.gerrit.server.account.AuthResult;
+import com.google.gerrit.server.account.AuthenticationFailedException;
+import com.google.gerrit.server.auth.AuthenticationUnavailableException;
+import com.google.gerrit.util.http.CacheHeaders;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/** Handles username/password based authentication against the directory. */
+@Singleton
+class LdapLoginServlet extends HttpServlet {
+  private static final long serialVersionUID = 1L;
+
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final AccountManager accountManager;
+  private final DynamicItem<WebSession> webSession;
+  private final CanonicalWebUrl urlProvider;
+  private final SiteHeaderFooter headers;
+
+  @Inject
+  LdapLoginServlet(
+      AccountManager accountManager,
+      DynamicItem<WebSession> webSession,
+      CanonicalWebUrl urlProvider,
+      SiteHeaderFooter headers) {
+    this.accountManager = accountManager;
+    this.webSession = webSession;
+    this.urlProvider = urlProvider;
+    this.headers = headers;
+  }
+
+  private void sendForm(
+      HttpServletRequest req, HttpServletResponse res, @Nullable String errorMessage)
+      throws IOException {
+    String self = req.getRequestURI();
+    String cancel = MoreObjects.firstNonNull(urlProvider.get(req), "/");
+    cancel += LoginUrlToken.getToken(req);
+
+    Document doc = headers.parse(LdapLoginServlet.class, "LoginForm.html");
+    HtmlDomUtil.find(doc, "hostName").setTextContent(req.getServerName());
+    HtmlDomUtil.find(doc, "login_form").setAttribute("action", self);
+    HtmlDomUtil.find(doc, "cancel_link").setAttribute("href", cancel);
+
+    Element emsg = HtmlDomUtil.find(doc, "error_message");
+    if (Strings.isNullOrEmpty(errorMessage)) {
+      emsg.getParentNode().removeChild(emsg);
+    } else {
+      emsg.setTextContent(errorMessage);
+    }
+
+    byte[] bin = HtmlDomUtil.toUTF8(doc);
+    res.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+    res.setContentType("text/html");
+    res.setCharacterEncoding(UTF_8.name());
+    res.setContentLength(bin.length);
+    try (ServletOutputStream out = res.getOutputStream()) {
+      out.write(bin);
+    }
+  }
+
+  @Override
+  protected void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
+    sendForm(req, res, null);
+  }
+
+  @Override
+  protected void doPost(HttpServletRequest req, HttpServletResponse res)
+      throws ServletException, IOException {
+    req.setCharacterEncoding(UTF_8.name());
+    String username = Strings.nullToEmpty(req.getParameter("username")).trim();
+    String password = Strings.nullToEmpty(req.getParameter("password"));
+    String remember = Strings.nullToEmpty(req.getParameter("rememberme"));
+    if (username.isEmpty() || password.isEmpty()) {
+      sendForm(req, res, "Invalid username or password.");
+      return;
+    }
+
+    AuthRequest areq = AuthRequest.forUser(username);
+    areq.setPassword(password);
+
+    AuthResult ares;
+    try {
+      ares = accountManager.authenticate(areq);
+    } catch (AccountUserNameException e) {
+      sendForm(req, res, e.getMessage());
+      return;
+    } catch (AuthenticationUnavailableException e) {
+      sendForm(req, res, "Authentication unavailable at this time.");
+      return;
+    } catch (AuthenticationFailedException e) {
+      // This exception is thrown if the user provided wrong credentials, we don't need to log a
+      // stacktrace for it.
+      logger.atWarning().log("'%s' failed to sign in: %s", username, e.getMessage());
+      sendForm(req, res, "Invalid username or password.");
+      return;
+    } catch (AccountException e) {
+      logger.atWarning().withCause(e).log("'%s' failed to sign in", username);
+      sendForm(req, res, "Authentication failed.");
+      return;
+    } catch (RuntimeException e) {
+      logger.atSevere().withCause(e).log("LDAP authentication failed");
+      sendForm(req, res, "Authentication unavailable at this time.");
+      return;
+    }
+
+    StringBuilder dest = new StringBuilder();
+    dest.append(urlProvider.get(req));
+    dest.append(LoginUrlToken.getToken(req));
+
+    CacheHeaders.setNotCacheable(res);
+    webSession.get().login(ares, "1".equals(remember));
+    res.sendRedirect(dest.toString());
+  }
+}
diff --git a/java/com/google/gerrit/httpd/auth/oauth/BUILD b/java/com/google/gerrit/httpd/auth/oauth/BUILD
new file mode 100644
index 0000000..7315ce1
--- /dev/null
+++ b/java/com/google/gerrit/httpd/auth/oauth/BUILD
@@ -0,0 +1,24 @@
+java_library(
+    name = "oauth",
+    srcs = glob(["**/*.java"]),
+    resource_strip_prefix = "resources",
+    resources = ["//resources/com/google/gerrit/httpd/auth/oauth"],
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/common:annotations",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/httpd",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/server/audit",
+        "//lib:gson",
+        "//lib:guava",
+        "//lib:gwtorm",
+        "//lib:servlet-api-3_1",
+        "//lib/commons:codec",
+        "//lib/flogger:api",
+        "//lib/guice",
+        "//lib/guice:guice-servlet",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+    ],
+)
diff --git a/java/com/google/gerrit/httpd/auth/oauth/OAuthLogoutServlet.java b/java/com/google/gerrit/httpd/auth/oauth/OAuthLogoutServlet.java
new file mode 100644
index 0000000..f468ecb
--- /dev/null
+++ b/java/com/google/gerrit/httpd/auth/oauth/OAuthLogoutServlet.java
@@ -0,0 +1,55 @@
+// Copyright (C) 2015 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.google.gerrit.httpd.auth.oauth;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.httpd.HttpLogoutServlet;
+import com.google.gerrit.httpd.WebSession;
+import com.google.gerrit.server.config.AuthConfig;
+import com.google.gerrit.server.config.CanonicalWebUrl;
+import com.google.gerrit.server.group.GroupAuditService;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@Singleton
+class OAuthLogoutServlet extends HttpLogoutServlet {
+  private static final long serialVersionUID = 1L;
+
+  private final Provider<OAuthSession> oauthSession;
+
+  @Inject
+  OAuthLogoutServlet(
+      AuthConfig authConfig,
+      DynamicItem<WebSession> webSession,
+      @CanonicalWebUrl @Nullable Provider<String> urlProvider,
+      GroupAuditService audit,
+      Provider<OAuthSession> oauthSession) {
+    super(authConfig, webSession, urlProvider, audit);
+    this.oauthSession = oauthSession;
+  }
+
+  @Override
+  protected void doLogout(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
+    super.doLogout(req, rsp);
+    if (req.getSession(false) != null) {
+      oauthSession.get().logout();
+    }
+  }
+}
diff --git a/gerrit-oauth/src/main/java/com/google/gerrit/httpd/auth/oauth/OAuthModule.java b/java/com/google/gerrit/httpd/auth/oauth/OAuthModule.java
similarity index 100%
rename from gerrit-oauth/src/main/java/com/google/gerrit/httpd/auth/oauth/OAuthModule.java
rename to java/com/google/gerrit/httpd/auth/oauth/OAuthModule.java
diff --git a/java/com/google/gerrit/httpd/auth/oauth/OAuthSession.java b/java/com/google/gerrit/httpd/auth/oauth/OAuthSession.java
new file mode 100644
index 0000000..b780fa0
--- /dev/null
+++ b/java/com/google/gerrit/httpd/auth/oauth/OAuthSession.java
@@ -0,0 +1,271 @@
+// Copyright (C) 2015 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.google.gerrit.httpd.auth.oauth;
+
+import static javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED;
+
+import com.google.common.base.CharMatcher;
+import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.auth.oauth.OAuthServiceProvider;
+import com.google.gerrit.extensions.auth.oauth.OAuthToken;
+import com.google.gerrit.extensions.auth.oauth.OAuthUserInfo;
+import com.google.gerrit.extensions.auth.oauth.OAuthVerifier;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.extensions.restapi.Url;
+import com.google.gerrit.httpd.CanonicalWebUrl;
+import com.google.gerrit.httpd.WebSession;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountException;
+import com.google.gerrit.server.account.AccountManager;
+import com.google.gerrit.server.account.AuthRequest;
+import com.google.gerrit.server.account.AuthResult;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.auth.oauth.OAuthTokenCache;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.servlet.SessionScoped;
+import java.io.IOException;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.util.Optional;
+import javax.servlet.ServletRequest;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.apache.commons.codec.binary.Base64;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@SessionScoped
+/* OAuth protocol implementation */
+class OAuthSession {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final SecureRandom randomState = newRandomGenerator();
+  private final String state;
+  private final DynamicItem<WebSession> webSession;
+  private final Provider<IdentifiedUser> identifiedUser;
+  private final AccountManager accountManager;
+  private final CanonicalWebUrl urlProvider;
+  private final OAuthTokenCache tokenCache;
+  private OAuthServiceProvider serviceProvider;
+  private OAuthUserInfo user;
+  private Account.Id accountId;
+  private String redirectToken;
+  private boolean linkMode;
+
+  @Inject
+  OAuthSession(
+      DynamicItem<WebSession> webSession,
+      Provider<IdentifiedUser> identifiedUser,
+      AccountManager accountManager,
+      CanonicalWebUrl urlProvider,
+      OAuthTokenCache tokenCache) {
+    this.state = generateRandomState();
+    this.identifiedUser = identifiedUser;
+    this.webSession = webSession;
+    this.accountManager = accountManager;
+    this.urlProvider = urlProvider;
+    this.tokenCache = tokenCache;
+  }
+
+  boolean isLoggedIn() {
+    return user != null;
+  }
+
+  boolean isOAuthFinal(HttpServletRequest request) {
+    return Strings.emptyToNull(request.getParameter("code")) != null;
+  }
+
+  boolean login(
+      HttpServletRequest request, HttpServletResponse response, OAuthServiceProvider oauth)
+      throws IOException {
+    logger.atFine().log("Login %s", this);
+
+    if (isOAuthFinal(request)) {
+      if (!checkState(request)) {
+        response.sendError(HttpServletResponse.SC_NOT_FOUND);
+        return false;
+      }
+
+      logger.atFine().log("Login-Retrieve-User %s", this);
+      OAuthToken token = oauth.getAccessToken(new OAuthVerifier(request.getParameter("code")));
+      user = oauth.getUserInfo(token);
+
+      if (isLoggedIn()) {
+        logger.atFine().log("Login-SUCCESS %s", this);
+        authenticateAndRedirect(request, response, token);
+        return true;
+      }
+      response.sendError(SC_UNAUTHORIZED);
+      return false;
+    }
+    logger.atFine().log("Login-PHASE1 %s", this);
+    redirectToken = request.getRequestURI();
+    // We are here in content of filter.
+    // Due to this Jetty limitation:
+    // https://bz.apache.org/bugzilla/show_bug.cgi?id=28323
+    // we cannot use LoginUrlToken.getToken() method,
+    // because it relies on getPathInfo() and it is always null here.
+    redirectToken = redirectToken.substring(request.getContextPath().length());
+    response.sendRedirect(oauth.getAuthorizationUrl() + "&state=" + state);
+    return false;
+  }
+
+  private void authenticateAndRedirect(
+      HttpServletRequest req, HttpServletResponse rsp, OAuthToken token) throws IOException {
+    AuthRequest areq = new AuthRequest(ExternalId.Key.parse(user.getExternalId()));
+    AuthResult arsp;
+    try {
+      String claimedIdentifier = user.getClaimedIdentity();
+      if (!Strings.isNullOrEmpty(claimedIdentifier)) {
+        if (!authenticateWithIdentityClaimedDuringHandshake(areq, rsp, claimedIdentifier)) {
+          return;
+        }
+      } else if (linkMode) {
+        if (!authenticateWithLinkedIdentity(areq, rsp)) {
+          return;
+        }
+      }
+      areq.setUserName(user.getUserName());
+      areq.setEmailAddress(user.getEmailAddress());
+      areq.setDisplayName(user.getDisplayName());
+      arsp = accountManager.authenticate(areq);
+
+      accountId = arsp.getAccountId();
+      tokenCache.put(accountId, token);
+    } catch (AccountException e) {
+      logger.atSevere().withCause(e).log("Unable to authenticate user \"%s\"", user);
+      rsp.sendError(HttpServletResponse.SC_FORBIDDEN);
+      return;
+    }
+
+    webSession.get().login(arsp, true);
+    String suffix = redirectToken.substring(OAuthWebFilter.GERRIT_LOGIN.length() + 1);
+    suffix = CharMatcher.anyOf("/").trimLeadingFrom(Url.decode(suffix));
+    StringBuilder rdr = new StringBuilder(urlProvider.get(req));
+    rdr.append(suffix);
+    rsp.sendRedirect(rdr.toString());
+  }
+
+  private boolean authenticateWithIdentityClaimedDuringHandshake(
+      AuthRequest req, HttpServletResponse rsp, String claimedIdentifier)
+      throws AccountException, IOException {
+    Optional<Account.Id> claimedId = accountManager.lookup(claimedIdentifier);
+    Optional<Account.Id> actualId = accountManager.lookup(user.getExternalId());
+    if (claimedId.isPresent() && actualId.isPresent()) {
+      if (claimedId.get().equals(actualId.get())) {
+        // Both link to the same account, that's what we expected.
+        logger.atFine().log("OAuth2: claimed identity equals current id");
+      } else {
+        // This is (for now) a fatal error. There are two records
+        // for what might be the same user.
+        //
+        logger.atSevere().log(
+            "OAuth accounts disagree over user identity:\n"
+                + "  Claimed ID: %s is %s\n"
+                + "  Delgate ID: %s is %s",
+            claimedId.get(), claimedIdentifier, actualId.get(), user.getExternalId());
+        rsp.sendError(HttpServletResponse.SC_FORBIDDEN);
+        return false;
+      }
+    } else if (claimedId.isPresent() && !actualId.isPresent()) {
+      // Claimed account already exists: link to it.
+      //
+      logger.atInfo().log("OAuth2: linking claimed identity to %s", claimedId.get().toString());
+      try {
+        accountManager.link(claimedId.get(), req);
+      } catch (OrmException | ConfigInvalidException e) {
+        logger.atSevere().log(
+            "Cannot link: %s to user identity:\n  Claimed ID: %s is %s",
+            user.getExternalId(), claimedId.get(), claimedIdentifier);
+        rsp.sendError(HttpServletResponse.SC_FORBIDDEN);
+        return false;
+      }
+    }
+    return true;
+  }
+
+  private boolean authenticateWithLinkedIdentity(AuthRequest areq, HttpServletResponse rsp)
+      throws AccountException, IOException {
+    try {
+      accountManager.link(identifiedUser.get().getAccountId(), areq);
+    } catch (OrmException | ConfigInvalidException e) {
+      logger.atSevere().log(
+          "Cannot link: %s to user identity: %s",
+          user.getExternalId(), identifiedUser.get().getAccountId());
+      rsp.sendError(HttpServletResponse.SC_FORBIDDEN);
+      return false;
+    } finally {
+      linkMode = false;
+    }
+    return true;
+  }
+
+  void logout() {
+    if (accountId != null) {
+      tokenCache.remove(accountId);
+      accountId = null;
+    }
+    user = null;
+    redirectToken = null;
+    serviceProvider = null;
+  }
+
+  private boolean checkState(ServletRequest request) {
+    String s = Strings.nullToEmpty(request.getParameter("state"));
+    if (!s.equals(state)) {
+      logger.atSevere().log("Illegal request state '%s' on OAuthProtocol %s", s, this);
+      return false;
+    }
+    return true;
+  }
+
+  private static SecureRandom newRandomGenerator() {
+    try {
+      return SecureRandom.getInstance("SHA1PRNG");
+    } catch (NoSuchAlgorithmException e) {
+      throw new IllegalArgumentException("No SecureRandom available for GitHub authentication", e);
+    }
+  }
+
+  private static String generateRandomState() {
+    byte[] state = new byte[32];
+    randomState.nextBytes(state);
+    return Base64.encodeBase64URLSafeString(state);
+  }
+
+  @Override
+  public String toString() {
+    return "OAuthSession [token=" + tokenCache.get(accountId) + ", user=" + user + "]";
+  }
+
+  public void setServiceProvider(OAuthServiceProvider provider) {
+    this.serviceProvider = provider;
+  }
+
+  public OAuthServiceProvider getServiceProvider() {
+    return serviceProvider;
+  }
+
+  public void setLinkMode(boolean linkMode) {
+    this.linkMode = linkMode;
+  }
+
+  public boolean isLinkMode() {
+    return linkMode;
+  }
+}
diff --git a/java/com/google/gerrit/httpd/auth/oauth/OAuthWebFilter.java b/java/com/google/gerrit/httpd/auth/oauth/OAuthWebFilter.java
new file mode 100644
index 0000000..2642a543
--- /dev/null
+++ b/java/com/google/gerrit/httpd/auth/oauth/OAuthWebFilter.java
@@ -0,0 +1,194 @@
+// Copyright (C) 2015 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.google.gerrit.httpd.auth.oauth;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
+import com.google.common.collect.Iterables;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.auth.oauth.OAuthServiceProvider;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.httpd.HtmlDomUtil;
+import com.google.gerrit.httpd.LoginUrlToken;
+import com.google.gerrit.httpd.template.SiteHeaderFooter;
+import com.google.gerrit.server.config.CanonicalWebUrl;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.SortedSet;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+@Singleton
+/* OAuth web filter uses active OAuth session to perform OAuth requests */
+class OAuthWebFilter implements Filter {
+  static final String GERRIT_LOGIN = "/login";
+
+  private final Provider<String> urlProvider;
+  private final Provider<OAuthSession> oauthSessionProvider;
+  private final DynamicMap<OAuthServiceProvider> oauthServiceProviders;
+  private final SiteHeaderFooter header;
+  private OAuthServiceProvider ssoProvider;
+
+  @Inject
+  OAuthWebFilter(
+      @CanonicalWebUrl @Nullable Provider<String> urlProvider,
+      DynamicMap<OAuthServiceProvider> oauthServiceProviders,
+      Provider<OAuthSession> oauthSessionProvider,
+      SiteHeaderFooter header) {
+    this.urlProvider = urlProvider;
+    this.oauthServiceProviders = oauthServiceProviders;
+    this.oauthSessionProvider = oauthSessionProvider;
+    this.header = header;
+  }
+
+  @Override
+  public void init(FilterConfig filterConfig) throws ServletException {
+    pickSSOServiceProvider();
+  }
+
+  @Override
+  public void destroy() {}
+
+  @Override
+  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+      throws IOException, ServletException {
+    HttpServletRequest httpRequest = (HttpServletRequest) request;
+    HttpServletResponse httpResponse = (HttpServletResponse) response;
+
+    OAuthSession oauthSession = oauthSessionProvider.get();
+    if (request.getParameter("link") != null) {
+      oauthSession.setLinkMode(true);
+      oauthSession.setServiceProvider(null);
+    }
+
+    String provider = httpRequest.getParameter("provider");
+    OAuthServiceProvider service =
+        ssoProvider == null ? oauthSession.getServiceProvider() : ssoProvider;
+
+    if (isGerritLogin(httpRequest) || oauthSession.isOAuthFinal(httpRequest)) {
+      if (service == null && Strings.isNullOrEmpty(provider)) {
+        selectProvider(httpRequest, httpResponse, null);
+        return;
+      }
+      if (service == null) {
+        service = findService(provider);
+      }
+      oauthSession.setServiceProvider(service);
+      oauthSession.login(httpRequest, httpResponse, service);
+    } else {
+      chain.doFilter(httpRequest, response);
+    }
+  }
+
+  private OAuthServiceProvider findService(String providerId) throws ServletException {
+    Set<String> plugins = oauthServiceProviders.plugins();
+    for (String pluginName : plugins) {
+      Map<String, Provider<OAuthServiceProvider>> m = oauthServiceProviders.byPlugin(pluginName);
+      for (Map.Entry<String, Provider<OAuthServiceProvider>> e : m.entrySet()) {
+        if (providerId.equals(String.format("%s_%s", pluginName, e.getKey()))) {
+          return e.getValue().get();
+        }
+      }
+    }
+    throw new ServletException("No provider found for: " + providerId);
+  }
+
+  private void selectProvider(
+      HttpServletRequest req, HttpServletResponse res, @Nullable String errorMessage)
+      throws IOException {
+    String self = req.getRequestURI();
+    String cancel = MoreObjects.firstNonNull(urlProvider != null ? urlProvider.get() : "/", "/");
+    cancel += LoginUrlToken.getToken(req);
+
+    Document doc = header.parse(OAuthWebFilter.class, "LoginForm.html");
+    HtmlDomUtil.find(doc, "hostName").setTextContent(req.getServerName());
+    HtmlDomUtil.find(doc, "login_form").setAttribute("action", self);
+    HtmlDomUtil.find(doc, "cancel_link").setAttribute("href", cancel);
+
+    Element emsg = HtmlDomUtil.find(doc, "error_message");
+    if (Strings.isNullOrEmpty(errorMessage)) {
+      emsg.getParentNode().removeChild(emsg);
+    } else {
+      emsg.setTextContent(errorMessage);
+    }
+
+    Element providers = HtmlDomUtil.find(doc, "providers");
+
+    Set<String> plugins = oauthServiceProviders.plugins();
+    for (String pluginName : plugins) {
+      Map<String, Provider<OAuthServiceProvider>> m = oauthServiceProviders.byPlugin(pluginName);
+      for (Map.Entry<String, Provider<OAuthServiceProvider>> e : m.entrySet()) {
+        addProvider(providers, pluginName, e.getKey(), e.getValue().get().getName());
+      }
+    }
+
+    sendHtml(res, doc);
+  }
+
+  private static void addProvider(Element form, String pluginName, String id, String serviceName) {
+    Element div = form.getOwnerDocument().createElement("div");
+    div.setAttribute("id", id);
+    Element hyperlink = form.getOwnerDocument().createElement("a");
+    hyperlink.setAttribute("href", String.format("?provider=%s_%s", pluginName, id));
+    hyperlink.setTextContent(serviceName + " (" + pluginName + " plugin)");
+    div.appendChild(hyperlink);
+    form.appendChild(div);
+  }
+
+  private static void sendHtml(HttpServletResponse res, Document doc) throws IOException {
+    byte[] bin = HtmlDomUtil.toUTF8(doc);
+    res.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+    res.setContentType("text/html");
+    res.setCharacterEncoding(UTF_8.name());
+    res.setContentLength(bin.length);
+    try (ServletOutputStream out = res.getOutputStream()) {
+      out.write(bin);
+    }
+  }
+
+  private void pickSSOServiceProvider() throws ServletException {
+    SortedSet<String> plugins = oauthServiceProviders.plugins();
+    if (plugins.isEmpty()) {
+      throw new ServletException("OAuth service provider wasn't installed");
+    }
+    if (plugins.size() == 1) {
+      SortedMap<String, Provider<OAuthServiceProvider>> services =
+          oauthServiceProviders.byPlugin(Iterables.getOnlyElement(plugins));
+      if (services.size() == 1) {
+        ssoProvider = Iterables.getOnlyElement(services.values()).get();
+      }
+    }
+  }
+
+  private static boolean isGerritLogin(HttpServletRequest request) {
+    return request.getRequestURI().contains(GERRIT_LOGIN);
+  }
+}
diff --git a/java/com/google/gerrit/httpd/auth/openid/BUILD b/java/com/google/gerrit/httpd/auth/openid/BUILD
new file mode 100644
index 0000000..f80e9d5
--- /dev/null
+++ b/java/com/google/gerrit/httpd/auth/openid/BUILD
@@ -0,0 +1,27 @@
+java_library(
+    name = "openid",
+    srcs = glob(["**/*.java"]),
+    resource_strip_prefix = "resources",
+    resources = ["//resources/com/google/gerrit/httpd/auth/openid"],
+    visibility = ["//visibility:public"],
+    deps = [
+        # We want all these deps to be provided_deps
+        "//java/com/google/gerrit/common:annotations",
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/httpd",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/util/http",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/server/audit",
+        "//lib:guava",
+        "//lib:gwtorm",
+        "//lib:servlet-api-3_1",
+        "//lib/commons:codec",
+        "//lib/flogger:api",
+        "//lib/guice",
+        "//lib/guice:guice-servlet",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/openid:consumer",
+    ],
+)
diff --git a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/DiscoveryResult.java b/java/com/google/gerrit/httpd/auth/openid/DiscoveryResult.java
similarity index 100%
rename from gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/DiscoveryResult.java
rename to java/com/google/gerrit/httpd/auth/openid/DiscoveryResult.java
diff --git a/java/com/google/gerrit/httpd/auth/openid/LoginForm.java b/java/com/google/gerrit/httpd/auth/openid/LoginForm.java
new file mode 100644
index 0000000..283cd50
--- /dev/null
+++ b/java/com/google/gerrit/httpd/auth/openid/LoginForm.java
@@ -0,0 +1,370 @@
+// Copyright (C) 2009 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.google.gerrit.httpd.auth.openid;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.PageLinks;
+import com.google.gerrit.common.auth.openid.OpenIdUrls;
+import com.google.gerrit.extensions.auth.oauth.OAuthServiceProvider;
+import com.google.gerrit.extensions.client.AuthType;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.Url;
+import com.google.gerrit.httpd.HtmlDomUtil;
+import com.google.gerrit.httpd.LoginUrlToken;
+import com.google.gerrit.httpd.template.SiteHeaderFooter;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.config.AuthConfig;
+import com.google.gerrit.server.config.CanonicalWebUrl;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.eclipse.jgit.lib.Config;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/** Handles OpenID based login flow. */
+@Singleton
+class LoginForm extends HttpServlet {
+  private static final long serialVersionUID = 1L;
+
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final ImmutableMap<String, String> ALL_PROVIDERS =
+      ImmutableMap.of(
+          "launchpad", OpenIdUrls.URL_LAUNCHPAD,
+          "yahoo", OpenIdUrls.URL_YAHOO);
+
+  private final ImmutableSet<String> suggestProviders;
+  private final Provider<String> urlProvider;
+  private final Provider<OAuthSessionOverOpenID> oauthSessionProvider;
+  private final OpenIdServiceImpl impl;
+  private final int maxRedirectUrlLength;
+  private final String ssoUrl;
+  private final SiteHeaderFooter header;
+  private final Provider<CurrentUser> currentUserProvider;
+  private final DynamicMap<OAuthServiceProvider> oauthServiceProviders;
+
+  @Inject
+  LoginForm(
+      @CanonicalWebUrl @Nullable Provider<String> urlProvider,
+      @GerritServerConfig Config config,
+      AuthConfig authConfig,
+      OpenIdServiceImpl impl,
+      SiteHeaderFooter header,
+      Provider<OAuthSessionOverOpenID> oauthSessionProvider,
+      Provider<CurrentUser> currentUserProvider,
+      DynamicMap<OAuthServiceProvider> oauthServiceProviders) {
+    this.urlProvider = urlProvider;
+    this.impl = impl;
+    this.header = header;
+    this.maxRedirectUrlLength = config.getInt("openid", "maxRedirectUrlLength", 10);
+    this.oauthSessionProvider = oauthSessionProvider;
+    this.currentUserProvider = currentUserProvider;
+    this.oauthServiceProviders = oauthServiceProviders;
+
+    if (urlProvider == null || Strings.isNullOrEmpty(urlProvider.get())) {
+      logger.atSevere().log("gerrit.canonicalWebUrl must be set in gerrit.config");
+    }
+
+    if (authConfig.getAuthType() == AuthType.OPENID_SSO) {
+      suggestProviders = ImmutableSet.of();
+      ssoUrl = authConfig.getOpenIdSsoUrl();
+    } else {
+      Set<String> providers = new HashSet<>();
+      for (Map.Entry<String, String> e : ALL_PROVIDERS.entrySet()) {
+        if (impl.isAllowedOpenID(e.getValue())) {
+          providers.add(e.getKey());
+        }
+      }
+      suggestProviders = ImmutableSet.copyOf(providers);
+      ssoUrl = null;
+    }
+  }
+
+  @Override
+  protected void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
+    if (ssoUrl != null) {
+      String token = LoginUrlToken.getToken(req);
+      SignInMode mode;
+      if (PageLinks.REGISTER.equals(token)) {
+        mode = SignInMode.REGISTER;
+        token = PageLinks.MINE;
+      } else {
+        mode = SignInMode.SIGN_IN;
+      }
+      discover(req, res, false, ssoUrl, false, token, mode);
+    } else {
+      String id = Strings.nullToEmpty(req.getParameter("id")).trim();
+      if (!id.isEmpty()) {
+        doPost(req, res);
+      } else {
+        boolean link = req.getParameter("link") != null;
+        sendForm(req, res, link, null);
+      }
+    }
+  }
+
+  @Override
+  protected void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException {
+    boolean link = req.getParameter("link") != null;
+    String id = Strings.nullToEmpty(req.getParameter("id")).trim();
+    if (id.isEmpty()) {
+      sendForm(req, res, link, null);
+      return;
+    }
+    if (!id.startsWith("http://") && !id.startsWith("https://")) {
+      id = "http://" + id;
+    }
+    if ((ssoUrl != null && !ssoUrl.equals(id)) || !impl.isAllowedOpenID(id)) {
+      sendForm(req, res, link, "OpenID provider not permitted by site policy.");
+      return;
+    }
+
+    boolean remember = "1".equals(req.getParameter("rememberme"));
+    String token = LoginUrlToken.getToken(req);
+    SignInMode mode;
+    if (link) {
+      mode = SignInMode.LINK_IDENTIY;
+    } else if (PageLinks.REGISTER.equals(token)) {
+      mode = SignInMode.REGISTER;
+      token = PageLinks.MINE;
+    } else {
+      mode = SignInMode.SIGN_IN;
+    }
+
+    logger.atFine().log("mode \"%s\"", mode);
+    OAuthServiceProvider oauthProvider = lookupOAuthServiceProvider(id);
+
+    if (oauthProvider == null) {
+      logger.atFine().log("OpenId provider \"%s\"", id);
+      discover(req, res, link, id, remember, token, mode);
+    } else {
+      logger.atFine().log("OAuth provider \"%s\"", id);
+      OAuthSessionOverOpenID oauthSession = oauthSessionProvider.get();
+      if (!currentUserProvider.get().isIdentifiedUser() && oauthSession.isLoggedIn()) {
+        oauthSession.logout();
+      }
+      if ((isGerritLogin(req) || oauthSession.isOAuthFinal(req))) {
+        oauthSession.setServiceProvider(oauthProvider);
+        oauthSession.setLinkMode(link);
+        oauthSession.login(req, res, oauthProvider);
+      }
+    }
+  }
+
+  private void discover(
+      HttpServletRequest req,
+      HttpServletResponse res,
+      boolean link,
+      String id,
+      boolean remember,
+      String token,
+      SignInMode mode)
+      throws IOException {
+    if (ssoUrl != null) {
+      remember = false;
+    }
+
+    DiscoveryResult r = impl.discover(req, id, mode, remember, token);
+    switch (r.status) {
+      case VALID:
+        redirect(r, res);
+        break;
+
+      case NO_PROVIDER:
+        sendForm(req, res, link, "Provider is not supported, or was incorrectly entered.");
+        break;
+
+      case ERROR:
+        sendForm(req, res, link, "Unable to connect with OpenID provider.");
+        break;
+    }
+  }
+
+  private void redirect(DiscoveryResult r, HttpServletResponse res) throws IOException {
+    StringBuilder url = new StringBuilder();
+    url.append(r.providerUrl);
+    if (r.providerArgs != null && !r.providerArgs.isEmpty()) {
+      boolean first = true;
+      for (Map.Entry<String, String> arg : r.providerArgs.entrySet()) {
+        if (first) {
+          url.append('?');
+          first = false;
+        } else {
+          url.append('&');
+        }
+        url.append(Url.encode(arg.getKey())).append('=').append(Url.encode(arg.getValue()));
+      }
+    }
+    if (url.length() <= maxRedirectUrlLength) {
+      res.sendRedirect(url.toString());
+      return;
+    }
+
+    Document doc = HtmlDomUtil.parseFile(LoginForm.class, "RedirectForm.html");
+    Element form = HtmlDomUtil.find(doc, "redirect_form");
+    form.setAttribute("action", r.providerUrl);
+    if (r.providerArgs != null && !r.providerArgs.isEmpty()) {
+      for (Map.Entry<String, String> arg : r.providerArgs.entrySet()) {
+        Element in = doc.createElement("input");
+        in.setAttribute("type", "hidden");
+        in.setAttribute("name", arg.getKey());
+        in.setAttribute("value", arg.getValue());
+        form.appendChild(in);
+      }
+    }
+    sendHtml(res, doc);
+  }
+
+  private void sendForm(
+      HttpServletRequest req, HttpServletResponse res, boolean link, @Nullable String errorMessage)
+      throws IOException {
+    String self = req.getRequestURI();
+    String cancel = MoreObjects.firstNonNull(urlProvider != null ? urlProvider.get() : "/", "/");
+    cancel += LoginUrlToken.getToken(req);
+
+    Document doc = header.parse(LoginForm.class, "LoginForm.html");
+    HtmlDomUtil.find(doc, "hostName").setTextContent(req.getServerName());
+    HtmlDomUtil.find(doc, "login_form").setAttribute("action", self);
+    HtmlDomUtil.find(doc, "cancel_link").setAttribute("href", cancel);
+
+    if (!link || ssoUrl != null) {
+      Element input = HtmlDomUtil.find(doc, "f_link");
+      input.getParentNode().removeChild(input);
+    }
+
+    String last = getLastId(req);
+    if (last != null) {
+      HtmlDomUtil.find(doc, "f_openid").setAttribute("value", last);
+    }
+
+    Element emsg = HtmlDomUtil.find(doc, "error_message");
+    if (Strings.isNullOrEmpty(errorMessage)) {
+      emsg.getParentNode().removeChild(emsg);
+    } else {
+      emsg.setTextContent(errorMessage);
+    }
+
+    for (String name : ALL_PROVIDERS.keySet()) {
+      Element div = HtmlDomUtil.find(doc, "provider_" + name);
+      if (div == null) {
+        continue;
+      }
+      if (!suggestProviders.contains(name)) {
+        div.getParentNode().removeChild(div);
+        continue;
+      }
+      Element a = HtmlDomUtil.find(div, "id_" + name);
+      if (a == null) {
+        div.getParentNode().removeChild(div);
+        continue;
+      }
+      StringBuilder u = new StringBuilder();
+      u.append(self).append(a.getAttribute("href"));
+      if (link) {
+        u.append("&link");
+      }
+      a.setAttribute("href", u.toString());
+    }
+
+    // OAuth: Add plugin based providers
+    Element providers = HtmlDomUtil.find(doc, "providers");
+    Set<String> plugins = oauthServiceProviders.plugins();
+    for (String pluginName : plugins) {
+      Map<String, Provider<OAuthServiceProvider>> m = oauthServiceProviders.byPlugin(pluginName);
+      for (Map.Entry<String, Provider<OAuthServiceProvider>> e : m.entrySet()) {
+        addProvider(providers, link, pluginName, e.getKey(), e.getValue().get().getName());
+      }
+    }
+
+    sendHtml(res, doc);
+  }
+
+  private void sendHtml(HttpServletResponse res, Document doc) throws IOException {
+    byte[] bin = HtmlDomUtil.toUTF8(doc);
+    res.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+    res.setContentType("text/html");
+    res.setCharacterEncoding(UTF_8.name());
+    res.setContentLength(bin.length);
+    try (ServletOutputStream out = res.getOutputStream()) {
+      out.write(bin);
+    }
+  }
+
+  private static void addProvider(
+      Element form, boolean link, String pluginName, String id, String serviceName) {
+    Element div = form.getOwnerDocument().createElement("div");
+    div.setAttribute("id", id);
+    Element hyperlink = form.getOwnerDocument().createElement("a");
+    StringBuilder u = new StringBuilder(String.format("?id=%s_%s", pluginName, id));
+    if (link) {
+      u.append("&link");
+    }
+    hyperlink.setAttribute("href", u.toString());
+
+    hyperlink.setTextContent(serviceName + " (" + pluginName + " plugin)");
+    div.appendChild(hyperlink);
+    form.appendChild(div);
+  }
+
+  private OAuthServiceProvider lookupOAuthServiceProvider(String providerId) {
+    if (providerId.startsWith("http://")) {
+      providerId = providerId.substring("http://".length());
+    }
+    Set<String> plugins = oauthServiceProviders.plugins();
+    for (String pluginName : plugins) {
+      Map<String, Provider<OAuthServiceProvider>> m = oauthServiceProviders.byPlugin(pluginName);
+      for (Map.Entry<String, Provider<OAuthServiceProvider>> e : m.entrySet()) {
+        if (providerId.equals(String.format("%s_%s", pluginName, e.getKey()))) {
+          return e.getValue().get();
+        }
+      }
+    }
+    return null;
+  }
+
+  private static String getLastId(HttpServletRequest req) {
+    Cookie[] cookies = req.getCookies();
+    if (cookies != null) {
+      for (Cookie c : cookies) {
+        if (OpenIdUrls.LASTID_COOKIE.equals(c.getName())) {
+          return c.getValue();
+        }
+      }
+    }
+    return null;
+  }
+
+  private static boolean isGerritLogin(HttpServletRequest request) {
+    return request.getRequestURI().contains(OAuthSessionOverOpenID.GERRIT_LOGIN);
+  }
+}
diff --git a/java/com/google/gerrit/httpd/auth/openid/OAuthOverOpenIDLogoutServlet.java b/java/com/google/gerrit/httpd/auth/openid/OAuthOverOpenIDLogoutServlet.java
new file mode 100644
index 0000000..d75805c
--- /dev/null
+++ b/java/com/google/gerrit/httpd/auth/openid/OAuthOverOpenIDLogoutServlet.java
@@ -0,0 +1,55 @@
+// Copyright (C) 2015 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.google.gerrit.httpd.auth.openid;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.httpd.HttpLogoutServlet;
+import com.google.gerrit.httpd.WebSession;
+import com.google.gerrit.server.config.AuthConfig;
+import com.google.gerrit.server.config.CanonicalWebUrl;
+import com.google.gerrit.server.group.GroupAuditService;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@Singleton
+class OAuthOverOpenIDLogoutServlet extends HttpLogoutServlet {
+  private static final long serialVersionUID = 1L;
+
+  private final Provider<OAuthSessionOverOpenID> oauthSession;
+
+  @Inject
+  OAuthOverOpenIDLogoutServlet(
+      AuthConfig authConfig,
+      DynamicItem<WebSession> webSession,
+      @CanonicalWebUrl @Nullable Provider<String> urlProvider,
+      GroupAuditService audit,
+      Provider<OAuthSessionOverOpenID> oauthSession) {
+    super(authConfig, webSession, urlProvider, audit);
+    this.oauthSession = oauthSession;
+  }
+
+  @Override
+  protected void doLogout(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
+    super.doLogout(req, rsp);
+    if (req.getSession(false) != null) {
+      oauthSession.get().logout();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/httpd/auth/openid/OAuthSessionOverOpenID.java b/java/com/google/gerrit/httpd/auth/openid/OAuthSessionOverOpenID.java
new file mode 100644
index 0000000..a51a0ab
--- /dev/null
+++ b/java/com/google/gerrit/httpd/auth/openid/OAuthSessionOverOpenID.java
@@ -0,0 +1,256 @@
+// Copyright (C) 2015 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.google.gerrit.httpd.auth.openid;
+
+import static javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED;
+
+import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.auth.oauth.OAuthServiceProvider;
+import com.google.gerrit.extensions.auth.oauth.OAuthToken;
+import com.google.gerrit.extensions.auth.oauth.OAuthUserInfo;
+import com.google.gerrit.extensions.auth.oauth.OAuthVerifier;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.extensions.restapi.Url;
+import com.google.gerrit.httpd.CanonicalWebUrl;
+import com.google.gerrit.httpd.LoginUrlToken;
+import com.google.gerrit.httpd.WebSession;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountException;
+import com.google.gerrit.server.account.AccountManager;
+import com.google.gerrit.server.account.AuthResult;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.servlet.SessionScoped;
+import java.io.IOException;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.util.Optional;
+import javax.servlet.ServletRequest;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.apache.commons.codec.binary.Base64;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+/** OAuth protocol implementation */
+@SessionScoped
+class OAuthSessionOverOpenID {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  static final String GERRIT_LOGIN = "/login";
+  private static final SecureRandom randomState = newRandomGenerator();
+  private final String state;
+  private final DynamicItem<WebSession> webSession;
+  private final Provider<IdentifiedUser> identifiedUser;
+  private final AccountManager accountManager;
+  private final CanonicalWebUrl urlProvider;
+  private OAuthServiceProvider serviceProvider;
+  private OAuthToken token;
+  private OAuthUserInfo user;
+  private String redirectToken;
+  private boolean linkMode;
+
+  @Inject
+  OAuthSessionOverOpenID(
+      DynamicItem<WebSession> webSession,
+      Provider<IdentifiedUser> identifiedUser,
+      AccountManager accountManager,
+      CanonicalWebUrl urlProvider) {
+    this.state = generateRandomState();
+    this.webSession = webSession;
+    this.identifiedUser = identifiedUser;
+    this.accountManager = accountManager;
+    this.urlProvider = urlProvider;
+  }
+
+  boolean isLoggedIn() {
+    return token != null && user != null;
+  }
+
+  boolean isOAuthFinal(HttpServletRequest request) {
+    return Strings.emptyToNull(request.getParameter("code")) != null;
+  }
+
+  boolean login(
+      HttpServletRequest request, HttpServletResponse response, OAuthServiceProvider oauth)
+      throws IOException {
+    logger.atFine().log("Login %s", this);
+
+    if (isOAuthFinal(request)) {
+      if (!checkState(request)) {
+        response.sendError(HttpServletResponse.SC_NOT_FOUND);
+        return false;
+      }
+
+      logger.atFine().log("Login-Retrieve-User %s", this);
+      token = oauth.getAccessToken(new OAuthVerifier(request.getParameter("code")));
+      user = oauth.getUserInfo(token);
+
+      if (isLoggedIn()) {
+        logger.atFine().log("Login-SUCCESS %s", this);
+        authenticateAndRedirect(request, response);
+        return true;
+      }
+      response.sendError(SC_UNAUTHORIZED);
+      return false;
+    }
+    logger.atFine().log("Login-PHASE1 %s", this);
+    redirectToken = LoginUrlToken.getToken(request);
+    response.sendRedirect(oauth.getAuthorizationUrl() + "&state=" + state);
+    return false;
+  }
+
+  private void authenticateAndRedirect(HttpServletRequest req, HttpServletResponse rsp)
+      throws IOException {
+    com.google.gerrit.server.account.AuthRequest areq =
+        new com.google.gerrit.server.account.AuthRequest(
+            ExternalId.Key.parse(user.getExternalId()));
+    AuthResult arsp;
+    try {
+      String claimedIdentifier = user.getClaimedIdentity();
+      Optional<Account.Id> actualId = accountManager.lookup(user.getExternalId());
+      Optional<Account.Id> claimedId = Optional.empty();
+
+      // We try to retrieve claimed identity.
+      // For some reason, for example staging instance
+      // it may deviate from the really old OpenID identity.
+      // What we want to avoid in any event is to create new
+      // account instead of linking to the existing one.
+      // That why we query it here, not to lose linking mode.
+      if (!Strings.isNullOrEmpty(claimedIdentifier)) {
+        claimedId = accountManager.lookup(claimedIdentifier);
+        if (!claimedId.isPresent()) {
+          logger.atFine().log("Claimed identity is unknown");
+        }
+      }
+
+      // Use case 1: claimed identity was provided during handshake phase
+      // and user account exists for this identity
+      if (claimedId.isPresent()) {
+        logger.atFine().log("Claimed identity is set and is known");
+        if (actualId.isPresent()) {
+          if (claimedId.get().equals(actualId.get())) {
+            // Both link to the same account, that's what we expected.
+            logger.atFine().log("Both link to the same account. All is fine.");
+          } else {
+            // This is (for now) a fatal error. There are two records
+            // for what might be the same user. The admin would have to
+            // link the accounts manually.
+            logger.atFine().log(
+                "OAuth accounts disagree over user identity:\n"
+                    + "  Claimed ID: %s is %s\n"
+                    + "  Delgate ID: %s is %s",
+                claimedId.get(), claimedIdentifier, actualId.get(), user.getExternalId());
+            rsp.sendError(HttpServletResponse.SC_FORBIDDEN);
+            return;
+          }
+        } else {
+          // Claimed account already exists: link to it.
+          logger.atFine().log("Claimed account already exists: link to it.");
+          try {
+            accountManager.link(claimedId.get(), areq);
+          } catch (OrmException | ConfigInvalidException e) {
+            logger.atSevere().log(
+                "Cannot link: %s to user identity:\n  Claimed ID: %s is %s",
+                user.getExternalId(), claimedId.get(), claimedIdentifier);
+            rsp.sendError(HttpServletResponse.SC_FORBIDDEN);
+            return;
+          }
+        }
+      } else if (linkMode) {
+        // Use case 2: link mode activated from the UI
+        Account.Id accountId = identifiedUser.get().getAccountId();
+        try {
+          logger.atFine().log("Linking \"%s\" to \"%s\"", user.getExternalId(), accountId);
+          accountManager.link(accountId, areq);
+        } catch (OrmException | ConfigInvalidException e) {
+          logger.atSevere().log(
+              "Cannot link: %s to user identity: %s", user.getExternalId(), accountId);
+          rsp.sendError(HttpServletResponse.SC_FORBIDDEN);
+          return;
+        } finally {
+          linkMode = false;
+        }
+      }
+      areq.setUserName(user.getUserName());
+      areq.setEmailAddress(user.getEmailAddress());
+      areq.setDisplayName(user.getDisplayName());
+      arsp = accountManager.authenticate(areq);
+    } catch (AccountException e) {
+      logger.atSevere().withCause(e).log("Unable to authenticate user \"%s\"", user);
+      rsp.sendError(HttpServletResponse.SC_FORBIDDEN);
+      return;
+    }
+
+    webSession.get().login(arsp, true);
+    StringBuilder rdr = new StringBuilder(urlProvider.get(req));
+    rdr.append(Url.decode(redirectToken));
+    rsp.sendRedirect(rdr.toString());
+  }
+
+  void logout() {
+    token = null;
+    user = null;
+    redirectToken = null;
+    serviceProvider = null;
+  }
+
+  private boolean checkState(ServletRequest request) {
+    String s = Strings.nullToEmpty(request.getParameter("state"));
+    if (!s.equals(state)) {
+      logger.atSevere().log("Illegal request state '%s' on OAuthProtocol %s", s, this);
+      return false;
+    }
+    return true;
+  }
+
+  private static SecureRandom newRandomGenerator() {
+    try {
+      return SecureRandom.getInstance("SHA1PRNG");
+    } catch (NoSuchAlgorithmException e) {
+      throw new IllegalArgumentException("No SecureRandom available for GitHub authentication", e);
+    }
+  }
+
+  private static String generateRandomState() {
+    byte[] state = new byte[32];
+    randomState.nextBytes(state);
+    return Base64.encodeBase64URLSafeString(state);
+  }
+
+  @Override
+  public String toString() {
+    return "OAuthSession [token=" + token + ", user=" + user + "]";
+  }
+
+  public void setServiceProvider(OAuthServiceProvider provider) {
+    this.serviceProvider = provider;
+  }
+
+  public OAuthServiceProvider getServiceProvider() {
+    return serviceProvider;
+  }
+
+  public void setLinkMode(boolean linkMode) {
+    this.linkMode = linkMode;
+  }
+
+  public boolean isLinkMode() {
+    return linkMode;
+  }
+}
diff --git a/java/com/google/gerrit/httpd/auth/openid/OAuthWebFilterOverOpenID.java b/java/com/google/gerrit/httpd/auth/openid/OAuthWebFilterOverOpenID.java
new file mode 100644
index 0000000..2e8585d
--- /dev/null
+++ b/java/com/google/gerrit/httpd/auth/openid/OAuthWebFilterOverOpenID.java
@@ -0,0 +1,95 @@
+// Copyright (C) 2015 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.google.gerrit.httpd.auth.openid;
+
+import com.google.common.collect.Iterables;
+import com.google.gerrit.extensions.auth.oauth.OAuthServiceProvider;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.SortedMap;
+import java.util.SortedSet;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/** OAuth web filter uses active OAuth session to perform OAuth requests */
+@Singleton
+class OAuthWebFilterOverOpenID implements Filter {
+  static final String GERRIT_LOGIN = "/login";
+
+  private final Provider<OAuthSessionOverOpenID> oauthSessionProvider;
+  private final DynamicMap<OAuthServiceProvider> oauthServiceProviders;
+  private OAuthServiceProvider ssoProvider;
+
+  @Inject
+  OAuthWebFilterOverOpenID(
+      DynamicMap<OAuthServiceProvider> oauthServiceProviders,
+      Provider<OAuthSessionOverOpenID> oauthSessionProvider) {
+    this.oauthServiceProviders = oauthServiceProviders;
+    this.oauthSessionProvider = oauthSessionProvider;
+  }
+
+  @Override
+  public void init(FilterConfig filterConfig) throws ServletException {
+    pickSSOServiceProvider();
+  }
+
+  @Override
+  public void destroy() {}
+
+  @Override
+  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+      throws IOException, ServletException {
+    HttpServletRequest httpRequest = (HttpServletRequest) request;
+    HttpServletResponse httpResponse = (HttpServletResponse) response;
+
+    OAuthSessionOverOpenID oauthSession = oauthSessionProvider.get();
+    OAuthServiceProvider service =
+        ssoProvider == null ? oauthSession.getServiceProvider() : ssoProvider;
+
+    if (isGerritLogin(httpRequest) || oauthSession.isOAuthFinal(httpRequest)) {
+      if (service == null) {
+        throw new IllegalStateException("service is unknown");
+      }
+      oauthSession.setServiceProvider(service);
+      oauthSession.login(httpRequest, httpResponse, service);
+    } else {
+      chain.doFilter(httpRequest, response);
+    }
+  }
+
+  private void pickSSOServiceProvider() {
+    SortedSet<String> plugins = oauthServiceProviders.plugins();
+    if (plugins.size() == 1) {
+      SortedMap<String, Provider<OAuthServiceProvider>> services =
+          oauthServiceProviders.byPlugin(Iterables.getOnlyElement(plugins));
+      if (services.size() == 1) {
+        ssoProvider = Iterables.getOnlyElement(services.values()).get();
+      }
+    }
+  }
+
+  private static boolean isGerritLogin(HttpServletRequest request) {
+    return request.getRequestURI().contains(GERRIT_LOGIN);
+  }
+}
diff --git a/java/com/google/gerrit/httpd/auth/openid/OpenIdLoginServlet.java b/java/com/google/gerrit/httpd/auth/openid/OpenIdLoginServlet.java
new file mode 100644
index 0000000..1536741
--- /dev/null
+++ b/java/com/google/gerrit/httpd/auth/openid/OpenIdLoginServlet.java
@@ -0,0 +1,53 @@
+// Copyright (C) 2008 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.google.gerrit.httpd.auth.openid;
+
+import com.google.gerrit.util.http.CacheHeaders;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/** Handles the {@code /OpenID} URL for web based single-sign-on. */
+@Singleton
+class OpenIdLoginServlet extends HttpServlet {
+  private static final long serialVersionUID = 1L;
+
+  private final OpenIdServiceImpl impl;
+
+  @Inject
+  OpenIdLoginServlet(OpenIdServiceImpl i) {
+    impl = i;
+  }
+
+  @Override
+  public void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
+    doPost(req, rsp);
+  }
+
+  @Override
+  public void doPost(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
+    try {
+      CacheHeaders.setNotCacheable(rsp);
+      impl.doAuth(req, rsp);
+    } catch (Exception e) {
+      getServletContext().log("Unexpected error during authentication", e);
+      rsp.reset();
+      rsp.sendError(500);
+    }
+  }
+}
diff --git a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OpenIdModule.java b/java/com/google/gerrit/httpd/auth/openid/OpenIdModule.java
similarity index 100%
rename from gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OpenIdModule.java
rename to java/com/google/gerrit/httpd/auth/openid/OpenIdModule.java
diff --git a/java/com/google/gerrit/httpd/auth/openid/OpenIdServiceImpl.java b/java/com/google/gerrit/httpd/auth/openid/OpenIdServiceImpl.java
new file mode 100644
index 0000000..28256cf
--- /dev/null
+++ b/java/com/google/gerrit/httpd/auth/openid/OpenIdServiceImpl.java
@@ -0,0 +1,569 @@
+// Copyright (C) 2009 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.google.gerrit.httpd.auth.openid;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.PageLinks;
+import com.google.gerrit.common.auth.openid.OpenIdUrls;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.extensions.restapi.Url;
+import com.google.gerrit.httpd.CanonicalWebUrl;
+import com.google.gerrit.httpd.ProxyProperties;
+import com.google.gerrit.httpd.WebSession;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.UrlEncoded;
+import com.google.gerrit.server.account.AccountException;
+import com.google.gerrit.server.account.AccountManager;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.auth.openid.OpenIdProviderPattern;
+import com.google.gerrit.server.config.AuthConfig;
+import com.google.gerrit.server.config.ConfigUtil;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gwtorm.client.KeyUtil;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.net.URL;
+import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.TimeUnit;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.eclipse.jgit.lib.Config;
+import org.openid4java.consumer.ConsumerException;
+import org.openid4java.consumer.ConsumerManager;
+import org.openid4java.consumer.VerificationResult;
+import org.openid4java.discovery.DiscoveryException;
+import org.openid4java.discovery.DiscoveryInformation;
+import org.openid4java.message.AuthRequest;
+import org.openid4java.message.Message;
+import org.openid4java.message.MessageException;
+import org.openid4java.message.MessageExtension;
+import org.openid4java.message.ParameterList;
+import org.openid4java.message.ax.AxMessage;
+import org.openid4java.message.ax.FetchRequest;
+import org.openid4java.message.ax.FetchResponse;
+import org.openid4java.message.pape.PapeMessage;
+import org.openid4java.message.pape.PapeRequest;
+import org.openid4java.message.pape.PapeResponse;
+import org.openid4java.message.sreg.SRegMessage;
+import org.openid4java.message.sreg.SRegRequest;
+import org.openid4java.message.sreg.SRegResponse;
+import org.openid4java.util.HttpClientFactory;
+
+@Singleton
+class OpenIdServiceImpl {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  static final String RETURN_URL = "OpenID";
+
+  private static final String P_MODE = "gerrit.mode";
+  private static final String P_TOKEN = "gerrit.token";
+  private static final String P_REMEMBER = "gerrit.remember";
+  private static final String P_CLAIMED = "gerrit.claimed";
+  private static final int LASTID_AGE = 365 * 24 * 60 * 60; // seconds
+
+  private static final String OPENID_MODE = "openid.mode";
+  private static final String OMODE_CANCEL = "cancel";
+
+  private static final String SCHEMA_EMAIL = "http://schema.openid.net/contact/email";
+  private static final String SCHEMA_FIRSTNAME = "http://schema.openid.net/namePerson/first";
+  private static final String SCHEMA_LASTNAME = "http://schema.openid.net/namePerson/last";
+
+  private final DynamicItem<WebSession> webSession;
+  private final Provider<IdentifiedUser> identifiedUser;
+  private final CanonicalWebUrl urlProvider;
+  private final AccountManager accountManager;
+  private final ConsumerManager manager;
+  private final List<OpenIdProviderPattern> allowedOpenIDs;
+  private final List<String> openIdDomains;
+
+  /** Maximum age, in seconds, before forcing re-authentication of account. */
+  private final int papeMaxAuthAge;
+
+  @Inject
+  OpenIdServiceImpl(
+      DynamicItem<WebSession> cf,
+      Provider<IdentifiedUser> iu,
+      CanonicalWebUrl up,
+      @GerritServerConfig Config config,
+      AuthConfig ac,
+      AccountManager am,
+      ProxyProperties proxyProperties) {
+
+    if (proxyProperties.getProxyUrl() != null) {
+      final org.openid4java.util.ProxyProperties proxy = new org.openid4java.util.ProxyProperties();
+      URL url = proxyProperties.getProxyUrl();
+      proxy.setProxyHostName(url.getHost());
+      proxy.setProxyPort(url.getPort());
+      proxy.setUserName(proxyProperties.getUsername());
+      proxy.setPassword(proxyProperties.getPassword());
+      HttpClientFactory.setProxyProperties(proxy);
+    }
+
+    webSession = cf;
+    identifiedUser = iu;
+    urlProvider = up;
+    accountManager = am;
+    manager = new ConsumerManager();
+    allowedOpenIDs = ac.getAllowedOpenIDs();
+    openIdDomains = ac.getOpenIdDomains();
+    papeMaxAuthAge =
+        (int)
+            ConfigUtil.getTimeUnit(
+                config, //
+                "auth",
+                null,
+                "maxOpenIdSessionAge",
+                -1,
+                TimeUnit.SECONDS);
+  }
+
+  @SuppressWarnings("unchecked")
+  DiscoveryResult discover(
+      HttpServletRequest req,
+      String openidIdentifier,
+      SignInMode mode,
+      boolean remember,
+      String returnToken) {
+    final State state;
+    state = init(req, openidIdentifier, mode, remember, returnToken);
+    if (state == null) {
+      return new DiscoveryResult(DiscoveryResult.Status.NO_PROVIDER);
+    }
+
+    final AuthRequest aReq;
+    try {
+      aReq = manager.authenticate(state.discovered, state.retTo.toString());
+      logger.atFine().log("OpenID: openid-realm=%s", state.contextUrl);
+      aReq.setRealm(state.contextUrl);
+
+      if (requestRegistration(aReq)) {
+        final SRegRequest sregReq = SRegRequest.createFetchRequest();
+        sregReq.addAttribute("fullname", true);
+        sregReq.addAttribute("email", true);
+        aReq.addExtension(sregReq);
+
+        final FetchRequest fetch = FetchRequest.createFetchRequest();
+        fetch.addAttribute("FirstName", SCHEMA_FIRSTNAME, true);
+        fetch.addAttribute("LastName", SCHEMA_LASTNAME, true);
+        fetch.addAttribute("Email", SCHEMA_EMAIL, true);
+        aReq.addExtension(fetch);
+      }
+
+      if (0 <= papeMaxAuthAge) {
+        final PapeRequest pape = PapeRequest.createPapeRequest();
+        pape.setMaxAuthAge(papeMaxAuthAge);
+        aReq.addExtension(pape);
+      }
+    } catch (MessageException | ConsumerException e) {
+      logger.atSevere().withCause(e).log("Cannot create OpenID redirect for %s" + openidIdentifier);
+      return new DiscoveryResult(DiscoveryResult.Status.ERROR);
+    }
+
+    return new DiscoveryResult(aReq.getDestinationUrl(false), aReq.getParameterMap());
+  }
+
+  private boolean requestRegistration(AuthRequest aReq) {
+    if (AuthRequest.SELECT_ID.equals(aReq.getIdentity())) {
+      // We don't know anything about the identity, as the provider
+      // will offer the user a way to indicate their identity. Skip
+      // any database query operation and assume we must ask for the
+      // registration information, in case the identity is new to us.
+      //
+      return true;
+    }
+
+    // We might already have this account on file. Look for it.
+    //
+    try {
+      return accountManager.lookup(aReq.getIdentity()) == null;
+    } catch (AccountException e) {
+      logger.atWarning().withCause(e).log("Cannot determine if user account exists");
+      return true;
+    }
+  }
+
+  /** Called by {@link OpenIdLoginServlet} doGet, doPost */
+  void doAuth(HttpServletRequest req, HttpServletResponse rsp) throws Exception {
+    if (OMODE_CANCEL.equals(req.getParameter(OPENID_MODE))) {
+      cancel(req, rsp);
+      return;
+    }
+
+    // Process the authentication response.
+    //
+    final SignInMode mode = signInMode(req);
+    final String openidIdentifier = req.getParameter("openid.identity");
+    final String claimedIdentifier = req.getParameter(P_CLAIMED);
+    final String returnToken = req.getParameter(P_TOKEN);
+    final boolean remember = "1".equals(req.getParameter(P_REMEMBER));
+    final String rediscoverIdentifier =
+        claimedIdentifier != null ? claimedIdentifier : openidIdentifier;
+    final State state;
+
+    if (!isAllowedOpenID(rediscoverIdentifier)
+        || !isAllowedOpenID(openidIdentifier)
+        || (claimedIdentifier != null && !isAllowedOpenID(claimedIdentifier))) {
+      cancelWithError(req, rsp, "Provider not allowed");
+      return;
+    }
+
+    state = init(req, rediscoverIdentifier, mode, remember, returnToken);
+    if (state == null) {
+      // Re-discovery must have failed, we can't run a login.
+      //
+      cancel(req, rsp);
+      return;
+    }
+
+    final String returnTo = req.getParameter("openid.return_to");
+    if (returnTo != null && returnTo.contains("openid.rpnonce=")) {
+      // Some providers (claimid.com) seem to embed these request
+      // parameters into our return_to URL, and then give us them
+      // in the return_to request parameter. But not all.
+      //
+      state.retTo.put("openid.rpnonce", req.getParameter("openid.rpnonce"));
+      state.retTo.put("openid.rpsig", req.getParameter("openid.rpsig"));
+    }
+
+    final VerificationResult result =
+        manager.verify(
+            state.retTo.toString(), new ParameterList(req.getParameterMap()), state.discovered);
+    if (result.getVerifiedId() == null /* authentication failure */) {
+      if ("Nonce verification failed.".equals(result.getStatusMsg())) {
+        // We might be suffering from clock skew on this system.
+        //
+        logger.atSevere().log(
+            "OpenID failure: %s  Likely caused by clock skew on this server,"
+                + " install/configure NTP.",
+            result.getStatusMsg());
+        cancelWithError(req, rsp, result.getStatusMsg());
+
+      } else if (result.getStatusMsg() != null) {
+        // Authentication failed.
+        //
+        logger.atSevere().log("OpenID failure: %s", result.getStatusMsg());
+        cancelWithError(req, rsp, result.getStatusMsg());
+
+      } else {
+        // Assume authentication was canceled.
+        //
+        cancel(req, rsp);
+      }
+      return;
+    }
+
+    final Message authRsp = result.getAuthResponse();
+    SRegResponse sregRsp = null;
+    FetchResponse fetchRsp = null;
+
+    if (0 <= papeMaxAuthAge) {
+      PapeResponse ext;
+      boolean unsupported = false;
+
+      try {
+        ext = (PapeResponse) authRsp.getExtension(PapeMessage.OPENID_NS_PAPE);
+      } catch (MessageException err) {
+        // Far too many providers are unable to provide PAPE extensions
+        // right now. Instead of blocking all of them log the error and
+        // let the authentication complete anyway.
+        //
+        logger.atSevere().log("Invalid PAPE response %s: %s", openidIdentifier, err);
+        unsupported = true;
+        ext = null;
+      }
+      if (!unsupported && ext == null) {
+        logger.atSevere().log("No PAPE extension response from %s", openidIdentifier);
+        cancelWithError(req, rsp, "OpenID provider does not support PAPE.");
+        return;
+      }
+    }
+
+    if (authRsp.hasExtension(SRegMessage.OPENID_NS_SREG)) {
+      final MessageExtension ext = authRsp.getExtension(SRegMessage.OPENID_NS_SREG);
+      if (ext instanceof SRegResponse) {
+        sregRsp = (SRegResponse) ext;
+      }
+    }
+
+    if (authRsp.hasExtension(AxMessage.OPENID_NS_AX)) {
+      final MessageExtension ext = authRsp.getExtension(AxMessage.OPENID_NS_AX);
+      if (ext instanceof FetchResponse) {
+        fetchRsp = (FetchResponse) ext;
+      }
+    }
+
+    final com.google.gerrit.server.account.AuthRequest areq =
+        new com.google.gerrit.server.account.AuthRequest(ExternalId.Key.parse(openidIdentifier));
+
+    if (sregRsp != null) {
+      areq.setDisplayName(sregRsp.getAttributeValue("fullname"));
+      areq.setEmailAddress(sregRsp.getAttributeValue("email"));
+
+    } else if (fetchRsp != null) {
+      final String firstName = fetchRsp.getAttributeValue("FirstName");
+      final String lastName = fetchRsp.getAttributeValue("LastName");
+      final StringBuilder n = new StringBuilder();
+      if (firstName != null && firstName.length() > 0) {
+        n.append(firstName);
+      }
+      if (lastName != null && lastName.length() > 0) {
+        if (n.length() > 0) {
+          n.append(' ');
+        }
+        n.append(lastName);
+      }
+      areq.setDisplayName(n.length() > 0 ? n.toString() : null);
+      areq.setEmailAddress(fetchRsp.getAttributeValue("Email"));
+    }
+
+    if (openIdDomains != null && openIdDomains.size() > 0) {
+      // Administrator limited email domains, which can be used for OpenID.
+      // Login process will only work if the passed email matches one
+      // of these domains.
+      //
+      final String email = areq.getEmailAddress();
+      int emailAtIndex = email.lastIndexOf('@');
+      if (emailAtIndex >= 0 && emailAtIndex < email.length() - 1) {
+        final String emailDomain = email.substring(emailAtIndex);
+
+        boolean match = false;
+        for (String domain : openIdDomains) {
+          if (emailDomain.equalsIgnoreCase(domain)) {
+            match = true;
+            break;
+          }
+        }
+
+        if (!match) {
+          logger.atSevere().log("Domain disallowed: %s", emailDomain);
+          cancelWithError(req, rsp, "Domain disallowed");
+          return;
+        }
+      }
+    }
+
+    if (claimedIdentifier != null) {
+      // The user used a claimed identity which has delegated to the verified
+      // identity we have in our AuthRequest above. We still should have a
+      // link between the two, so set one up if not present.
+      //
+      Optional<Account.Id> claimedId = accountManager.lookup(claimedIdentifier);
+      Optional<Account.Id> actualId = accountManager.lookup(areq.getExternalIdKey().get());
+
+      if (claimedId.isPresent() && actualId.isPresent()) {
+        if (claimedId.get().equals(actualId.get())) {
+          // Both link to the same account, that's what we expected.
+        } else {
+          // This is (for now) a fatal error. There are two records
+          // for what might be the same user.
+          //
+          logger.atSevere().log(
+              "OpenID accounts disagree over user identity:\n"
+                  + "  Claimed ID: %s is %s\n"
+                  + "  Delgate ID: %s is %s",
+              claimedId.get(), claimedIdentifier, actualId.get(), areq.getExternalIdKey());
+          cancelWithError(req, rsp, "Contact site administrator");
+          return;
+        }
+
+      } else if (!claimedId.isPresent() && actualId.isPresent()) {
+        // Older account, the actual was already created but the claimed
+        // was missing due to a bug in Gerrit. Link the claimed.
+        //
+        final com.google.gerrit.server.account.AuthRequest linkReq =
+            new com.google.gerrit.server.account.AuthRequest(
+                ExternalId.Key.parse(claimedIdentifier));
+        linkReq.setDisplayName(areq.getDisplayName());
+        linkReq.setEmailAddress(areq.getEmailAddress());
+        accountManager.link(actualId.get(), linkReq);
+
+      } else if (claimedId.isPresent() && !actualId.isPresent()) {
+        // Claimed account already exists, but it smells like the user has
+        // changed their delegate to point to a different provider. Link
+        // the new provider.
+        //
+        accountManager.link(claimedId.get(), areq);
+
+      } else {
+        // Both are null, we are going to create a new account below.
+      }
+    }
+
+    try {
+      final com.google.gerrit.server.account.AuthResult arsp;
+      switch (mode) {
+        case REGISTER:
+        case SIGN_IN:
+          arsp = accountManager.authenticate(areq);
+
+          final Cookie lastId = new Cookie(OpenIdUrls.LASTID_COOKIE, "");
+          lastId.setPath(req.getContextPath() + "/login/");
+          if (remember) {
+            lastId.setValue(rediscoverIdentifier);
+            lastId.setMaxAge(LASTID_AGE);
+          } else {
+            lastId.setMaxAge(0);
+          }
+          rsp.addCookie(lastId);
+          webSession.get().login(arsp, remember);
+          if (arsp.isNew() && claimedIdentifier != null) {
+            final com.google.gerrit.server.account.AuthRequest linkReq =
+                new com.google.gerrit.server.account.AuthRequest(
+                    ExternalId.Key.parse(claimedIdentifier));
+            linkReq.setDisplayName(areq.getDisplayName());
+            linkReq.setEmailAddress(areq.getEmailAddress());
+            accountManager.link(arsp.getAccountId(), linkReq);
+          }
+          callback(arsp.isNew(), req, rsp);
+          break;
+
+        case LINK_IDENTIY:
+          {
+            arsp = accountManager.link(identifiedUser.get().getAccountId(), areq);
+            webSession.get().login(arsp, remember);
+            callback(false, req, rsp);
+            break;
+          }
+      }
+    } catch (AccountException e) {
+      logger.atSevere().withCause(e).log("OpenID authentication failure");
+      cancelWithError(req, rsp, "Contact site administrator");
+    }
+  }
+
+  private boolean isSignIn(SignInMode mode) {
+    switch (mode) {
+      case SIGN_IN:
+      case REGISTER:
+        return true;
+      case LINK_IDENTIY:
+      default:
+        return false;
+    }
+  }
+
+  private static SignInMode signInMode(HttpServletRequest req) {
+    try {
+      return SignInMode.valueOf(req.getParameter(P_MODE));
+    } catch (RuntimeException e) {
+      return SignInMode.SIGN_IN;
+    }
+  }
+
+  private void callback(final boolean isNew, HttpServletRequest req, HttpServletResponse rsp)
+      throws IOException {
+    String token = req.getParameter(P_TOKEN);
+    if (token == null || token.isEmpty() || token.startsWith("/SignInFailure,")) {
+      token = PageLinks.MINE;
+    }
+
+    final StringBuilder rdr = new StringBuilder();
+    rdr.append(urlProvider.get(req));
+    String nextToken = Url.decode(token);
+    if (isNew && !token.startsWith(PageLinks.REGISTER + "/")) {
+      rdr.append('#' + PageLinks.REGISTER);
+      if (nextToken.startsWith("#")) {
+        // Need to strip the leading # off the token to fix registration page redirect
+        nextToken = nextToken.substring(1);
+      }
+    }
+    rdr.append(nextToken);
+    rsp.sendRedirect(rdr.toString());
+  }
+
+  private void cancel(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
+    if (isSignIn(signInMode(req))) {
+      webSession.get().logout();
+    }
+    callback(false, req, rsp);
+  }
+
+  private void cancelWithError(
+      final HttpServletRequest req, HttpServletResponse rsp, String errorDetail)
+      throws IOException {
+    final SignInMode mode = signInMode(req);
+    if (isSignIn(mode)) {
+      webSession.get().logout();
+    }
+    final StringBuilder rdr = new StringBuilder();
+    rdr.append(urlProvider.get(req));
+    rdr.append('#');
+    rdr.append("SignInFailure");
+    rdr.append(',');
+    rdr.append(mode.name());
+    rdr.append(',');
+    rdr.append(errorDetail != null ? KeyUtil.encode(errorDetail) : "");
+    rsp.sendRedirect(rdr.toString());
+  }
+
+  private State init(
+      HttpServletRequest req,
+      final String openidIdentifier,
+      final SignInMode mode,
+      final boolean remember,
+      final String returnToken) {
+    final List<?> list;
+    try {
+      list = manager.discover(openidIdentifier);
+    } catch (DiscoveryException e) {
+      logger.atSevere().withCause(e).log("Cannot discover OpenID %s", openidIdentifier);
+      return null;
+    }
+    if (list == null || list.isEmpty()) {
+      return null;
+    }
+
+    final String contextUrl = urlProvider.get(req);
+    final DiscoveryInformation discovered = manager.associate(list);
+    final UrlEncoded retTo = new UrlEncoded(contextUrl + RETURN_URL);
+    retTo.put(P_MODE, mode.name());
+    if (returnToken != null && returnToken.length() > 0) {
+      retTo.put(P_TOKEN, returnToken);
+    }
+    if (remember) {
+      retTo.put(P_REMEMBER, "1");
+    }
+    if (discovered.hasClaimedIdentifier()) {
+      retTo.put(P_CLAIMED, discovered.getClaimedIdentifier().getIdentifier());
+    }
+    return new State(discovered, retTo, contextUrl);
+  }
+
+  boolean isAllowedOpenID(String id) {
+    for (OpenIdProviderPattern pattern : allowedOpenIDs) {
+      if (pattern.matches(id)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  private static class State {
+    final DiscoveryInformation discovered;
+    final UrlEncoded retTo;
+    final String contextUrl;
+
+    State(DiscoveryInformation d, UrlEncoded r, String c) {
+      discovered = d;
+      retTo = r;
+      contextUrl = c;
+    }
+  }
+}
diff --git a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/SignInMode.java b/java/com/google/gerrit/httpd/auth/openid/SignInMode.java
similarity index 100%
rename from gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/SignInMode.java
rename to java/com/google/gerrit/httpd/auth/openid/SignInMode.java
diff --git a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/XrdsFilter.java b/java/com/google/gerrit/httpd/auth/openid/XrdsFilter.java
similarity index 100%
rename from gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/XrdsFilter.java
rename to java/com/google/gerrit/httpd/auth/openid/XrdsFilter.java
diff --git a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/XrdsServlet.java b/java/com/google/gerrit/httpd/auth/openid/XrdsServlet.java
similarity index 100%
rename from gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/XrdsServlet.java
rename to java/com/google/gerrit/httpd/auth/openid/XrdsServlet.java
diff --git a/java/com/google/gerrit/httpd/gitweb/GitLogoServlet.java b/java/com/google/gerrit/httpd/gitweb/GitLogoServlet.java
new file mode 100644
index 0000000..0344bc7
--- /dev/null
+++ b/java/com/google/gerrit/httpd/gitweb/GitLogoServlet.java
@@ -0,0 +1,81 @@
+// Copyright (C) 2009 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.google.gerrit.httpd.gitweb;
+
+import static com.google.gerrit.common.FileUtil.lastModified;
+
+import com.google.common.io.ByteStreams;
+import com.google.gerrit.server.config.GitwebCgiConfig;
+import com.google.gerrit.util.http.CacheHeaders;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
+import java.nio.file.Path;
+import java.util.concurrent.TimeUnit;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@Singleton
+class GitLogoServlet extends HttpServlet {
+  private static final long serialVersionUID = 1L;
+
+  private final long modified;
+  private final byte[] raw;
+
+  @Inject
+  GitLogoServlet(GitwebCgiConfig cfg) throws IOException {
+    byte[] png;
+    Path src = cfg.getGitLogoPng();
+    if (src != null) {
+      try (InputStream in = Files.newInputStream(src)) {
+        png = ByteStreams.toByteArray(in);
+      } catch (NoSuchFileException e) {
+        png = null;
+      }
+      modified = lastModified(src);
+    } else {
+      modified = -1;
+      png = null;
+    }
+    raw = png;
+  }
+
+  @Override
+  protected long getLastModified(HttpServletRequest req) {
+    return modified;
+  }
+
+  @Override
+  protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
+    if (raw != null) {
+      rsp.setContentType("image/png");
+      rsp.setContentLength(raw.length);
+      rsp.setDateHeader("Last-Modified", modified);
+      CacheHeaders.setCacheable(req, rsp, 5, TimeUnit.MINUTES);
+
+      try (ServletOutputStream os = rsp.getOutputStream()) {
+        os.write(raw);
+      }
+    } else {
+      CacheHeaders.setNotCacheable(rsp);
+      rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/httpd/gitweb/GitwebCssServlet.java b/java/com/google/gerrit/httpd/gitweb/GitwebCssServlet.java
new file mode 100644
index 0000000..0074035
--- /dev/null
+++ b/java/com/google/gerrit/httpd/gitweb/GitwebCssServlet.java
@@ -0,0 +1,112 @@
+// Copyright (C) 2009 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.google.gerrit.httpd.gitweb;
+
+import static com.google.gerrit.common.FileUtil.lastModified;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.gerrit.httpd.HtmlDomUtil;
+import com.google.gerrit.server.config.GitwebCgiConfig;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.util.http.CacheHeaders;
+import com.google.gwtjsonrpc.server.RPCServletUtils;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.concurrent.TimeUnit;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+abstract class GitwebCssServlet extends HttpServlet {
+  private static final long serialVersionUID = 1L;
+
+  @Singleton
+  static class Site extends GitwebCssServlet {
+    private static final long serialVersionUID = 1L;
+
+    @Inject
+    Site(SitePaths paths) throws IOException {
+      super(paths.site_css);
+    }
+  }
+
+  @Singleton
+  static class Default extends GitwebCssServlet {
+    private static final long serialVersionUID = 1L;
+
+    @Inject
+    Default(GitwebCgiConfig gwcc) throws IOException {
+      super(gwcc.getGitwebCss());
+    }
+  }
+
+  private final long modified;
+  private final byte[] raw_css;
+  private final byte[] gz_css;
+
+  GitwebCssServlet(Path src) throws IOException {
+    if (src != null) {
+      final Path dir = src.getParent();
+      final String name = src.getFileName().toString();
+      final String raw = HtmlDomUtil.readFile(dir, name);
+      if (raw != null) {
+        modified = lastModified(src);
+        raw_css = raw.getBytes(UTF_8);
+        gz_css = HtmlDomUtil.compress(raw_css);
+      } else {
+        modified = -1L;
+        raw_css = null;
+        gz_css = null;
+      }
+    } else {
+      modified = -1;
+      raw_css = null;
+      gz_css = null;
+    }
+  }
+
+  @Override
+  protected long getLastModified(HttpServletRequest req) {
+    return modified;
+  }
+
+  @Override
+  protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
+    if (raw_css != null) {
+      rsp.setContentType("text/css");
+      rsp.setCharacterEncoding(UTF_8.name());
+      final byte[] toSend;
+      if (RPCServletUtils.acceptsGzipEncoding(req)) {
+        rsp.setHeader("Content-Encoding", "gzip");
+        toSend = gz_css;
+      } else {
+        toSend = raw_css;
+      }
+      rsp.setContentLength(toSend.length);
+      rsp.setDateHeader("Last-Modified", modified);
+      CacheHeaders.setCacheable(req, rsp, 5, TimeUnit.MINUTES);
+
+      try (ServletOutputStream os = rsp.getOutputStream()) {
+        os.write(toSend);
+      }
+    } else {
+      CacheHeaders.setNotCacheable(rsp);
+      rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/httpd/gitweb/GitwebJavaScriptServlet.java b/java/com/google/gerrit/httpd/gitweb/GitwebJavaScriptServlet.java
new file mode 100644
index 0000000..d035036
--- /dev/null
+++ b/java/com/google/gerrit/httpd/gitweb/GitwebJavaScriptServlet.java
@@ -0,0 +1,81 @@
+// Copyright (C) 2010 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.google.gerrit.httpd.gitweb;
+
+import static com.google.gerrit.common.FileUtil.lastModified;
+
+import com.google.common.io.ByteStreams;
+import com.google.gerrit.server.config.GitwebCgiConfig;
+import com.google.gerrit.util.http.CacheHeaders;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
+import java.nio.file.Path;
+import java.util.concurrent.TimeUnit;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@Singleton
+class GitwebJavaScriptServlet extends HttpServlet {
+  private static final long serialVersionUID = 1L;
+
+  private final long modified;
+  private final byte[] raw;
+
+  @Inject
+  GitwebJavaScriptServlet(GitwebCgiConfig gitwebCgiConfig) throws IOException {
+    byte[] png;
+    Path src = gitwebCgiConfig.getGitwebJs();
+    if (src != null) {
+      try (InputStream in = Files.newInputStream(src)) {
+        png = ByteStreams.toByteArray(in);
+      } catch (NoSuchFileException e) {
+        png = null;
+      }
+      modified = lastModified(src);
+    } else {
+      modified = -1;
+      png = null;
+    }
+    raw = png;
+  }
+
+  @Override
+  protected long getLastModified(HttpServletRequest req) {
+    return modified;
+  }
+
+  @Override
+  protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
+    if (raw != null) {
+      rsp.setContentType("text/javascript");
+      rsp.setContentLength(raw.length);
+      rsp.setDateHeader("Last-Modified", modified);
+      CacheHeaders.setCacheable(req, rsp, 5, TimeUnit.MINUTES);
+
+      try (ServletOutputStream os = rsp.getOutputStream()) {
+        os.write(raw);
+      }
+    } else {
+      CacheHeaders.setNotCacheable(rsp);
+      rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
+    }
+  }
+}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebModule.java b/java/com/google/gerrit/httpd/gitweb/GitwebModule.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebModule.java
rename to java/com/google/gerrit/httpd/gitweb/GitwebModule.java
diff --git a/java/com/google/gerrit/httpd/gitweb/GitwebServlet.java b/java/com/google/gerrit/httpd/gitweb/GitwebServlet.java
new file mode 100644
index 0000000..6cb094f
--- /dev/null
+++ b/java/com/google/gerrit/httpd/gitweb/GitwebServlet.java
@@ -0,0 +1,766 @@
+// Copyright (C) 2009 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.
+
+// CGI environment and execution management portions are:
+//
+// ========================================================================
+// Copyright (c) 2006-2009 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+
+package com.google.gerrit.httpd.gitweb;
+
+import static java.nio.charset.StandardCharsets.ISO_8859_1;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.base.CharMatcher;
+import com.google.common.base.Splitter;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.PageLinks;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.Url;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.AnonymousUser;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.GitwebCgiConfig;
+import com.google.gerrit.server.config.GitwebConfig;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.LocalDiskRepositoryManager;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.ssh.SshInfo;
+import com.google.gerrit.util.http.CacheHeaders;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.ProvisionException;
+import com.google.inject.Singleton;
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
+import java.io.EOFException;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.Repository;
+
+/** Invokes {@code gitweb.cgi} for the project given in {@code p}. */
+@Singleton
+class GitwebServlet extends HttpServlet {
+  private static final long serialVersionUID = 1L;
+
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final String PROJECT_LIST_ACTION = "project_list";
+
+  private final Set<String> deniedActions;
+  private final int bufferSize = 8192;
+  private final Path gitwebCgi;
+  private final URI gitwebUrl;
+  private final LocalDiskRepositoryManager repoManager;
+  private final ProjectCache projectCache;
+  private final PermissionBackend permissionBackend;
+  private final Provider<AnonymousUser> anonymousUserProvider;
+  private final Provider<CurrentUser> userProvider;
+  private final EnvList _env;
+
+  @Inject
+  GitwebServlet(
+      GitRepositoryManager repoManager,
+      ProjectCache projectCache,
+      PermissionBackend permissionBackend,
+      Provider<CurrentUser> userProvider,
+      SitePaths site,
+      @GerritServerConfig Config cfg,
+      SshInfo sshInfo,
+      Provider<AnonymousUser> anonymousUserProvider,
+      GitwebConfig gitwebConfig,
+      GitwebCgiConfig gitwebCgiConfig)
+      throws IOException {
+    if (!(repoManager instanceof LocalDiskRepositoryManager)) {
+      throw new ProvisionException("Gitweb can only be used with LocalDiskRepositoryManager");
+    }
+    this.repoManager = (LocalDiskRepositoryManager) repoManager;
+    this.projectCache = projectCache;
+    this.permissionBackend = permissionBackend;
+    this.anonymousUserProvider = anonymousUserProvider;
+    this.userProvider = userProvider;
+    this.gitwebCgi = gitwebCgiConfig.getGitwebCgi();
+    this.deniedActions = new HashSet<>();
+
+    final String url = gitwebConfig.getUrl();
+    if ((url != null) && (!url.equals("gitweb"))) {
+      URI uri = null;
+      try {
+        uri = new URI(url);
+      } catch (URISyntaxException e) {
+        logger.atSevere().log("Invalid gitweb.url: %s", url);
+      }
+      gitwebUrl = uri;
+    } else {
+      gitwebUrl = null;
+    }
+
+    deniedActions.add("forks");
+    deniedActions.add("opml");
+    deniedActions.add("project_index");
+
+    _env = new EnvList();
+    makeSiteConfig(site, cfg, sshInfo);
+
+    if (!_env.envMap.containsKey("SystemRoot")) {
+      String os = System.getProperty("os.name");
+      if (os != null && os.toLowerCase().contains("windows")) {
+        String sysroot = System.getenv("SystemRoot");
+        if (sysroot == null || sysroot.isEmpty()) {
+          sysroot = "C:\\WINDOWS";
+        }
+        _env.set("SystemRoot", sysroot);
+      }
+    }
+
+    if (!_env.envMap.containsKey("PATH")) {
+      _env.set("PATH", System.getenv("PATH"));
+    }
+  }
+
+  private void makeSiteConfig(SitePaths site, Config cfg, SshInfo sshInfo) throws IOException {
+    if (!Files.exists(site.tmp_dir)) {
+      Files.createDirectories(site.tmp_dir);
+    }
+    Path myconf = Files.createTempFile(site.tmp_dir, "gitweb_config", ".perl");
+
+    // To make our configuration file only readable or writable by us;
+    // this reduces the chances of someone tampering with the file.
+    //
+    // TODO(dborowitz): Is there a portable way to do this with NIO?
+    File myconfFile = myconf.toFile();
+    myconfFile.setWritable(false, false /* all */);
+    myconfFile.setReadable(false, false /* all */);
+    myconfFile.setExecutable(false, false /* all */);
+
+    myconfFile.setWritable(true, true /* owner only */);
+    myconfFile.setReadable(true, true /* owner only */);
+
+    myconfFile.deleteOnExit();
+
+    _env.set("GIT_DIR", ".");
+    _env.set("GITWEB_CONFIG", myconf.toAbsolutePath().toString());
+
+    try (PrintWriter p = new PrintWriter(Files.newBufferedWriter(myconf, UTF_8))) {
+      p.print("# Autogenerated by Gerrit Code Review \n");
+      p.print("# DO NOT EDIT\n");
+      p.print("\n");
+
+      // We are mounted at the same level in the context as the main
+      // UI, so we can include the same header and footer scheme.
+      //
+      Path hdr = site.site_header;
+      if (Files.isRegularFile(hdr)) {
+        p.print("$site_header = " + quoteForPerl(hdr) + ";\n");
+      }
+      Path ftr = site.site_footer;
+      if (Files.isRegularFile(ftr)) {
+        p.print("$site_footer = " + quoteForPerl(ftr) + ";\n");
+      }
+
+      // Top level should return to Gerrit's UI.
+      //
+      p.print("$home_link = $ENV{'GERRIT_CONTEXT_PATH'};\n");
+      p.print("$home_link_str = 'Code Review';\n");
+
+      p.print("$favicon = 'favicon.ico';\n");
+      p.print("$logo = 'gitweb-logo.png';\n");
+      p.print("$javascript = 'gitweb.js';\n");
+      p.print("@stylesheets = ('gitweb-default.css');\n");
+      Path css = site.site_css;
+      if (Files.isRegularFile(css)) {
+        p.print("push @stylesheets, 'gitweb-site.css';\n");
+      }
+
+      // Try to make the title match Gerrit's normal window title
+      // scheme of host followed by 'Code Review'.
+      //
+      p.print("$site_name = $home_link_str;\n");
+      p.print("$site_name = qq{$1 $site_name} if ");
+      p.print("$ENV{'SERVER_NAME'} =~ m,^([^.]+(?:\\.[^.]+)?)(?:\\.|$),;\n");
+
+      // Assume by default that XSS is a problem, and try to prevent it.
+      //
+      p.print("$prevent_xss = 1;\n");
+
+      // Generate URLs using smart http://
+      //
+      p.print("{\n");
+      p.print("  my $secure = $ENV{'HTTPS'} =~ /^ON$/i;\n");
+      p.print("  my $http_url = $secure ? 'https://' : 'http://';\n");
+      p.print("  $http_url .= qq{$ENV{'GERRIT_USER_NAME'}@}\n");
+      p.print("    unless $ENV{'GERRIT_ANONYMOUS_READ'};\n");
+      p.print("  $http_url .= $ENV{'SERVER_NAME'};\n");
+      p.print("  $http_url .= qq{:$ENV{'SERVER_PORT'}}\n");
+      p.print("    if (( $secure && $ENV{'SERVER_PORT'} != 443)\n");
+      p.print("     || (!$secure && $ENV{'SERVER_PORT'} != 80)\n");
+      p.print("    );\n");
+      p.print("  my $context = $ENV{'GERRIT_CONTEXT_PATH'};\n");
+      p.print("  chop($context);\n");
+      p.print("  $http_url .= qq{$context};\n");
+      p.print("  $http_url .= qq{/a}\n");
+      p.print("    unless $ENV{'GERRIT_ANONYMOUS_READ'};\n");
+      p.print("  push @git_base_url_list, $http_url;\n");
+      p.print("}\n");
+
+      // Generate URLs using anonymous git://
+      //
+      String url = cfg.getString("gerrit", null, "canonicalGitUrl");
+      if (url != null) {
+        if (url.endsWith("/")) {
+          url = url.substring(0, url.length() - 1);
+        }
+        p.print("if ($ENV{'GERRIT_ANONYMOUS_READ'}) {\n");
+        p.print("  push @git_base_url_list, ");
+        p.print(quoteForPerl(url));
+        p.print(";\n");
+        p.print("}\n");
+      }
+
+      // Generate URLs using authenticated ssh://
+      //
+      if (sshInfo != null && !sshInfo.getHostKeys().isEmpty()) {
+        String sshAddr = sshInfo.getHostKeys().get(0).getHost();
+        p.print("if ($ENV{'GERRIT_USER_NAME'}) {\n");
+        p.print("  push @git_base_url_list, join('', 'ssh://'");
+        p.print(", $ENV{'GERRIT_USER_NAME'}");
+        p.print(", '@'");
+        if (sshAddr.startsWith("*:") || "".equals(sshAddr)) {
+          p.print(", $ENV{'SERVER_NAME'}");
+        }
+        if (sshAddr.startsWith("*")) {
+          sshAddr = sshAddr.substring(1);
+        }
+        p.print(", " + quoteForPerl(sshAddr));
+        p.print(");\n");
+        p.print("}\n");
+      }
+
+      // Link back to Gerrit (when possible, to matching review record).
+      // Supported gitweb's hash values are:
+      // - (missing),
+      // - HEAD,
+      // - refs/heads/<branch>,
+      // - refs/changes/*/<change>/*,
+      // - <revision>.
+      //
+      p.print("sub add_review_link {\n");
+      p.print("  my $h = shift;\n");
+      p.print("  my $q;\n");
+      p.print("  if (!$h || $h eq 'HEAD') {\n");
+      p.print("    $q = qq{#/q/project:$ENV{'GERRIT_PROJECT_NAME'}};\n");
+      p.print("  } elsif ($h =~ /^refs\\/heads\\/([-\\w]+)$/) {\n");
+      p.print("    $q = qq{#/q/project:$ENV{'GERRIT_PROJECT_NAME'}");
+      p.print("+branch:$1};\n"); // wrapped
+      p.print("  } elsif ($h =~ /^refs\\/changes\\/\\d{2}\\/(\\d+)\\/\\d+$/) ");
+      p.print("{\n"); // wrapped
+      p.print("    $q = qq{#/c/$1};\n");
+      p.print("  } else {\n");
+      p.print("    $q = qq{#/q/$h};\n");
+      p.print("  }\n");
+      p.print("  my $r = qq{$ENV{'GERRIT_CONTEXT_PATH'}$q};\n");
+      p.print("  push @{$feature{'actions'}{'default'}},\n");
+      p.print("      ('review',$r,'commitdiff');\n");
+      p.print("}\n");
+      p.print("if ($cgi->param('hb')) {\n");
+      p.print("  add_review_link(scalar $cgi->param('hb'));\n");
+      p.print("} elsif ($cgi->param('h')) {\n");
+      p.print("  add_review_link(scalar $cgi->param('h'));\n");
+      p.print("} else {\n");
+      p.print("  add_review_link();\n");
+      p.print("}\n");
+
+      // If the administrator has created a site-specific gitweb_config,
+      // load that before we perform any final overrides.
+      //
+      Path sitecfg = site.site_gitweb;
+      if (Files.isRegularFile(sitecfg)) {
+        p.print("$GITWEB_CONFIG = " + quoteForPerl(sitecfg) + ";\n");
+        p.print("if (-e $GITWEB_CONFIG) {\n");
+        p.print("  do " + quoteForPerl(sitecfg) + ";\n");
+        p.print("}\n");
+      }
+
+      p.print("$projectroot = $ENV{'GITWEB_PROJECTROOT'};\n");
+
+      // Permit exporting only the project we were started for.
+      // We use the name under $projectroot in case symlinks
+      // were involved in the path.
+      //
+      p.print("$export_auth_hook = sub {\n");
+      p.print("    my $dir = shift;\n");
+      p.print("    my $name = $ENV{'GERRIT_PROJECT_NAME'};\n");
+      p.print("    my $allow = qq{$projectroot/$name.git};\n");
+      p.print("    return $dir eq $allow;\n");
+      p.print("  };\n");
+
+      // Do not allow the administrator to enable path info, its
+      // not a URL format we currently support.
+      //
+      p.print("$feature{'pathinfo'}{'override'} = 0;\n");
+      p.print("$feature{'pathinfo'}{'default'} = [0];\n");
+
+      // We don't do forking, so don't allow it to be enabled.
+      //
+      p.print("$feature{'forks'}{'override'} = 0;\n");
+      p.print("$feature{'forks'}{'default'} = [0];\n");
+    }
+
+    myconfFile.setReadOnly();
+  }
+
+  private static String quoteForPerl(Path value) {
+    return quoteForPerl(value.toAbsolutePath().toString());
+  }
+
+  private static String quoteForPerl(String value) {
+    if (value == null || value.isEmpty()) {
+      return "''";
+    }
+    if (!value.contains("'")) {
+      return "'" + value + "'";
+    }
+    if (!value.contains("{") && !value.contains("}")) {
+      return "q{" + value + "}";
+    }
+    throw new IllegalArgumentException("Cannot quote in Perl: " + value);
+  }
+
+  @Override
+  protected void service(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
+    if (req.getQueryString() == null || req.getQueryString().isEmpty()) {
+      // No query string? They want the project list, which we don't
+      // currently support. Return to Gerrit's own web UI.
+      //
+      rsp.sendRedirect(req.getContextPath() + "/");
+      return;
+    }
+
+    final Map<String, String> params = getParameters(req);
+    String a = params.get("a");
+    if (a != null) {
+      if (deniedActions.contains(a)) {
+        rsp.sendError(HttpServletResponse.SC_FORBIDDEN);
+        return;
+      }
+
+      if (a.equals(PROJECT_LIST_ACTION)) {
+        rsp.sendRedirect(
+            req.getContextPath()
+                + "/#"
+                + PageLinks.ADMIN_PROJECTS
+                + "?filter="
+                + Url.encode(params.get("pf") + "/"));
+        return;
+      }
+    }
+
+    String name = params.get("p");
+    if (name == null) {
+      rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
+      return;
+    }
+    if (name.endsWith(".git")) {
+      name = name.substring(0, name.length() - 4);
+    }
+
+    Project.NameKey nameKey = new Project.NameKey(name);
+    ProjectState projectState;
+    try {
+      projectState = projectCache.checkedGet(nameKey);
+      if (projectState == null) {
+        sendErrorOrRedirect(req, rsp, HttpServletResponse.SC_NOT_FOUND);
+        return;
+      }
+
+      projectState.checkStatePermitsRead();
+      permissionBackend.user(userProvider.get()).project(nameKey).check(ProjectPermission.READ);
+    } catch (AuthException e) {
+      sendErrorOrRedirect(req, rsp, HttpServletResponse.SC_NOT_FOUND);
+      return;
+    } catch (IOException | PermissionBackendException err) {
+      logger.atSevere().withCause(err).log("cannot load %s", name);
+      rsp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+      return;
+    } catch (ResourceConflictException e) {
+      sendErrorOrRedirect(req, rsp, HttpServletResponse.SC_CONFLICT);
+      return;
+    }
+
+    try (Repository repo = repoManager.openRepository(nameKey)) {
+      CacheHeaders.setNotCacheable(rsp);
+      exec(req, rsp, projectState);
+    } catch (RepositoryNotFoundException e) {
+      getServletContext().log("Cannot open repository", e);
+      rsp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+    }
+  }
+
+  /**
+   * Sends error response if the user is authenticated. Or redirect the user to the login page. By
+   * doing this, anonymous users cannot infer the existence of a resource from the status code.
+   */
+  private void sendErrorOrRedirect(HttpServletRequest req, HttpServletResponse rsp, int statusCode)
+      throws IOException {
+    if (userProvider.get().isIdentifiedUser()) {
+      rsp.sendError(statusCode);
+    } else {
+      rsp.sendRedirect(getLoginRedirectUrl(req));
+    }
+  }
+
+  private static String getLoginRedirectUrl(HttpServletRequest req) {
+    String contextPath = req.getContextPath();
+    String loginUrl = contextPath + "/login/";
+    String token = req.getRequestURI();
+    if (!contextPath.isEmpty()) {
+      token = token.substring(contextPath.length());
+    }
+
+    String queryString = req.getQueryString();
+    if (queryString != null && !queryString.isEmpty()) {
+      token = token + "?" + queryString;
+    }
+    return (loginUrl + Url.encode(token));
+  }
+
+  private static Map<String, String> getParameters(HttpServletRequest req) {
+    final Map<String, String> params = new HashMap<>();
+    for (String pair : Splitter.on(CharMatcher.anyOf("&;")).split(req.getQueryString())) {
+      final int eq = pair.indexOf('=');
+      if (0 < eq) {
+        String name = pair.substring(0, eq);
+        String value = pair.substring(eq + 1);
+
+        name = Url.decode(name);
+        value = Url.decode(value);
+        params.put(name, value);
+      }
+    }
+    return params;
+  }
+
+  private void exec(HttpServletRequest req, HttpServletResponse rsp, ProjectState projectState)
+      throws IOException {
+    final Process proc =
+        Runtime.getRuntime()
+            .exec(
+                new String[] {gitwebCgi.toAbsolutePath().toString()},
+                makeEnv(req, projectState),
+                gitwebCgi.toAbsolutePath().getParent().toFile());
+
+    copyStderrToLog(proc.getErrorStream());
+    if (0 < req.getContentLength()) {
+      copyContentToCGI(req, proc.getOutputStream());
+    } else {
+      proc.getOutputStream().close();
+    }
+
+    try (InputStream in = new BufferedInputStream(proc.getInputStream(), bufferSize)) {
+      readCgiHeaders(rsp, in);
+
+      try (OutputStream out = rsp.getOutputStream()) {
+        final byte[] buf = new byte[bufferSize];
+        int n;
+        while ((n = in.read(buf)) > 0) {
+          out.write(buf, 0, n);
+        }
+      }
+    } catch (IOException e) {
+      // The browser has probably closed its input stream. We don't
+      // want to continue executing this request.
+      //
+      proc.destroy();
+      return;
+    }
+
+    try {
+      proc.waitFor();
+
+      final int status = proc.exitValue();
+      if (0 != status) {
+        logger.atSevere().log("Non-zero exit status (%d) from %s", status, gitwebCgi);
+        if (!rsp.isCommitted()) {
+          rsp.sendError(500);
+        }
+      }
+    } catch (InterruptedException ie) {
+      logger.atFine().log("CGI: interrupted waiting for CGI to terminate");
+    }
+  }
+
+  private String[] makeEnv(HttpServletRequest req, ProjectState projectState) {
+    final EnvList env = new EnvList(_env);
+    final int contentLength = Math.max(0, req.getContentLength());
+
+    // These ones are from "The WWW Common Gateway Interface Version 1.1"
+    //
+    env.set("AUTH_TYPE", req.getAuthType());
+    env.set("CONTENT_LENGTH", Integer.toString(contentLength));
+    env.set("CONTENT_TYPE", req.getContentType());
+    env.set("GATEWAY_INTERFACE", "CGI/1.1");
+    env.set("PATH_INFO", req.getPathInfo());
+    env.set("PATH_TRANSLATED", null);
+    env.set("QUERY_STRING", req.getQueryString());
+    env.set("REMOTE_ADDR", req.getRemoteAddr());
+    env.set("REMOTE_HOST", req.getRemoteHost());
+    env.set("HTTPS", req.isSecure() ? "ON" : "OFF");
+
+    // The identity information reported about the connection by a
+    // RFC 1413 [11] request to the remote agent, if
+    // available. Servers MAY choose not to support this feature, or
+    // not to request the data for efficiency reasons.
+    // "REMOTE_IDENT" => "NYI"
+    //
+    env.set("REQUEST_METHOD", req.getMethod());
+    env.set("SCRIPT_NAME", req.getContextPath() + req.getServletPath());
+    env.set("SCRIPT_FILENAME", gitwebCgi.toAbsolutePath().toString());
+    env.set("SERVER_NAME", req.getServerName());
+    env.set("SERVER_PORT", Integer.toString(req.getServerPort()));
+    env.set("SERVER_PROTOCOL", req.getProtocol());
+    env.set("SERVER_SOFTWARE", getServletContext().getServerInfo());
+
+    final Enumeration<String> hdrs = enumerateHeaderNames(req);
+    while (hdrs.hasMoreElements()) {
+      final String name = hdrs.nextElement();
+      final String value = req.getHeader(name);
+      env.set("HTTP_" + name.toUpperCase().replace('-', '_'), value);
+    }
+
+    Project.NameKey nameKey = projectState.getNameKey();
+    env.set("GERRIT_CONTEXT_PATH", req.getContextPath() + "/");
+    env.set("GERRIT_PROJECT_NAME", nameKey.get());
+
+    env.set("GITWEB_PROJECTROOT", repoManager.getBasePath(nameKey).toAbsolutePath().toString());
+
+    if (projectState.statePermitsRead()
+        && permissionBackend
+            .user(anonymousUserProvider.get())
+            .project(nameKey)
+            .testOrFalse(ProjectPermission.READ)) {
+      env.set("GERRIT_ANONYMOUS_READ", "1");
+    }
+
+    String remoteUser = null;
+    if (userProvider.get().isIdentifiedUser()) {
+      IdentifiedUser u = userProvider.get().asIdentifiedUser();
+      Optional<String> user = u.getUserName();
+      env.set("GERRIT_USER_NAME", user.orElse(null));
+      remoteUser = user.orElseGet(() -> "account-" + u.getAccountId());
+    }
+    env.set("REMOTE_USER", remoteUser);
+
+    // Override CGI settings using alternative URI provided by gitweb.url.
+    // This is required to trick gitweb into thinking that it's served under
+    // different URL. Setting just $my_uri on the perl's side isn't enough,
+    // because few actions (atom, blobdiff_plain, commitdiff_plain) rely on
+    // URL returned by $cgi->self_url().
+    //
+    if (gitwebUrl != null) {
+      int schemePort = -1;
+
+      if (gitwebUrl.getScheme() != null) {
+        if (gitwebUrl.getScheme().equals("http")) {
+          env.set("HTTPS", "OFF");
+          schemePort = 80;
+        } else {
+          env.set("HTTPS", "ON");
+          schemePort = 443;
+        }
+      }
+
+      if (gitwebUrl.getHost() != null) {
+        env.set("SERVER_NAME", gitwebUrl.getHost());
+        env.set("HTTP_HOST", gitwebUrl.getHost());
+      }
+
+      if (gitwebUrl.getPort() != -1) {
+        env.set("SERVER_PORT", Integer.toString(gitwebUrl.getPort()));
+      } else if (schemePort != -1) {
+        env.set("SERVER_PORT", Integer.toString(schemePort));
+      }
+
+      if (gitwebUrl.getPath() != null) {
+        env.set("SCRIPT_NAME", gitwebUrl.getPath().isEmpty() ? "/" : gitwebUrl.getPath());
+      }
+    }
+
+    return env.getEnvArray();
+  }
+
+  private void copyContentToCGI(HttpServletRequest req, OutputStream dst) throws IOException {
+    final int contentLength = req.getContentLength();
+    final InputStream src = req.getInputStream();
+    new Thread(
+            () -> {
+              try {
+                try {
+                  final byte[] buf = new byte[bufferSize];
+                  int remaining = contentLength;
+                  while (0 < remaining) {
+                    final int max = Math.max(buf.length, remaining);
+                    final int n = src.read(buf, 0, max);
+                    if (n < 0) {
+                      throw new EOFException("Expected " + remaining + " more bytes");
+                    }
+                    dst.write(buf, 0, n);
+                    remaining -= n;
+                  }
+                } finally {
+                  dst.close();
+                }
+              } catch (IOException e) {
+                logger.atSevere().withCause(e).log("Unexpected error copying input to CGI");
+              }
+            },
+            "Gitweb-InputFeeder")
+        .start();
+  }
+
+  private void copyStderrToLog(InputStream in) {
+    new Thread(
+            () -> {
+              try (BufferedReader br =
+                  new BufferedReader(new InputStreamReader(in, ISO_8859_1.name()))) {
+                String err =
+                    br.lines()
+                        .filter(s -> !s.isEmpty())
+                        .map(s -> "CGI: " + s)
+                        .collect(Collectors.joining("\n"))
+                        .trim();
+                if (!err.isEmpty()) {
+                  logger.atSevere().log(err);
+                }
+              } catch (IOException e) {
+                logger.atSevere().withCause(e).log("Unexpected error copying stderr from CGI");
+              }
+            },
+            "Gitweb-ErrorLogger")
+        .start();
+  }
+
+  private static Enumeration<String> enumerateHeaderNames(HttpServletRequest req) {
+    return req.getHeaderNames();
+  }
+
+  private void readCgiHeaders(HttpServletResponse res, InputStream in) throws IOException {
+    String line;
+    while (!(line = readLine(in)).isEmpty()) {
+      if (line.startsWith("HTTP")) {
+        // CGI believes it is a non-parsed-header CGI. We refuse
+        // to support that here so abort.
+        //
+        throw new IOException("NPH CGI not supported: " + line);
+      }
+
+      final int sep = line.indexOf(':');
+      if (sep < 0) {
+        throw new IOException("CGI returned invalid header: " + line);
+      }
+
+      final String key = line.substring(0, sep).trim();
+      final String value = line.substring(sep + 1).trim();
+      if ("Location".equalsIgnoreCase(key)) {
+        res.sendRedirect(value);
+
+      } else if ("Status".equalsIgnoreCase(key)) {
+        final List<String> token = Splitter.on(' ').splitToList(value);
+        final int status = Integer.parseInt(token.get(0));
+        res.setStatus(status);
+
+      } else {
+        res.addHeader(key, value);
+      }
+    }
+  }
+
+  private String readLine(InputStream in) throws IOException {
+    final StringBuilder buf = new StringBuilder();
+    int b;
+    while ((b = in.read()) != -1 && b != '\n') {
+      buf.append((char) b);
+    }
+    return buf.toString().trim();
+  }
+
+  /** private utility class that manages the Environment passed to exec. */
+  private static class EnvList {
+    private Map<String, String> envMap;
+
+    EnvList() {
+      envMap = new HashMap<>();
+    }
+
+    EnvList(EnvList l) {
+      envMap = new HashMap<>(l.envMap);
+    }
+
+    /** Set a name/value pair, null values will be treated as an empty String */
+    public void set(String name, String value) {
+      if (value == null) {
+        value = "";
+      }
+      envMap.put(name, name + "=" + value);
+    }
+
+    /** Get representation suitable for passing to exec. */
+    public String[] getEnvArray() {
+      return envMap.values().toArray(new String[envMap.size()]);
+    }
+
+    @Override
+    public String toString() {
+      return envMap.toString();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/httpd/init/BUILD b/java/com/google/gerrit/httpd/init/BUILD
new file mode 100644
index 0000000..d557c0e
--- /dev/null
+++ b/java/com/google/gerrit/httpd/init/BUILD
@@ -0,0 +1,37 @@
+java_library(
+    name = "init",
+    srcs = glob(["**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/elasticsearch",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/gpg",
+        "//java/com/google/gerrit/httpd",
+        "//java/com/google/gerrit/httpd/auth/oauth",
+        "//java/com/google/gerrit/httpd/auth/openid",
+        "//java/com/google/gerrit/lifecycle",
+        "//java/com/google/gerrit/lucene",
+        "//java/com/google/gerrit/metrics/dropwizard",
+        "//java/com/google/gerrit/pgm/init",
+        "//java/com/google/gerrit/pgm/util",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/server:module",
+        "//java/com/google/gerrit/server/api",
+        "//java/com/google/gerrit/server/audit",
+        "//java/com/google/gerrit/server/cache/h2",
+        "//java/com/google/gerrit/server/cache/mem",
+        "//java/com/google/gerrit/server/git/receive",
+        "//java/com/google/gerrit/server/restapi",
+        "//java/com/google/gerrit/server/schema",
+        "//java/com/google/gerrit/sshd",
+        "//lib:guava",
+        "//lib:gwtorm",
+        "//lib:servlet-api-3_1",
+        "//lib/flogger:api",
+        "//lib/guice",
+        "//lib/guice:guice-servlet",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//prolog:gerrit-prolog-common",
+    ],
+)
diff --git a/java/com/google/gerrit/httpd/init/ReviewDbDataSourceProvider.java b/java/com/google/gerrit/httpd/init/ReviewDbDataSourceProvider.java
new file mode 100644
index 0000000..6e65780
--- /dev/null
+++ b/java/com/google/gerrit/httpd/init/ReviewDbDataSourceProvider.java
@@ -0,0 +1,77 @@
+// Copyright (C) 2009 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.google.gerrit.httpd.init;
+
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.inject.Provider;
+import com.google.inject.ProvisionException;
+import com.google.inject.Singleton;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import javax.sql.DataSource;
+
+/** Provides access to the {@code ReviewDb} DataSource. */
+@Singleton
+final class ReviewDbDataSourceProvider implements Provider<DataSource>, LifecycleListener {
+  private DataSource ds;
+
+  @Override
+  public synchronized DataSource get() {
+    if (ds == null) {
+      ds = open();
+    }
+    return ds;
+  }
+
+  @Override
+  public void start() {}
+
+  @Override
+  public synchronized void stop() {
+    if (ds != null) {
+      closeDataSource(ds);
+    }
+  }
+
+  private DataSource open() {
+    final String dsName = "java:comp/env/jdbc/ReviewDb";
+    try {
+      return (DataSource) new InitialContext().lookup(dsName);
+    } catch (NamingException namingErr) {
+      throw new ProvisionException("No DataSource " + dsName, namingErr);
+    }
+  }
+
+  private void closeDataSource(DataSource ds) {
+    try {
+      Class<?> type = Class.forName("org.apache.commons.dbcp.BasicDataSource");
+      if (type.isInstance(ds)) {
+        type.getMethod("close").invoke(ds);
+        return;
+      }
+    } catch (Throwable bad) {
+      // Oh well, its not a Commons DBCP pooled connection.
+    }
+
+    try {
+      Class<?> type = Class.forName("com.mchange.v2.c3p0.DataSources");
+      if (type.isInstance(ds)) {
+        type.getMethod("destroy", DataSource.class).invoke(null, ds);
+      }
+    } catch (Throwable bad) {
+      // Oh well, its not a c3p0 pooled connection.
+    }
+  }
+}
diff --git a/java/com/google/gerrit/httpd/init/SiteInitializer.java b/java/com/google/gerrit/httpd/init/SiteInitializer.java
new file mode 100644
index 0000000..67510cd
--- /dev/null
+++ b/java/com/google/gerrit/httpd/init/SiteInitializer.java
@@ -0,0 +1,79 @@
+// Copyright (C) 2013 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.google.gerrit.httpd.init;
+
+import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.pgm.init.BaseInit;
+import com.google.gerrit.pgm.init.PluginsDistribution;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+
+public final class SiteInitializer {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+  private static final String GERRIT_SITE_PATH = "gerrit.site_path";
+
+  private final String sitePath;
+  private final String initPath;
+  private final PluginsDistribution pluginsDistribution;
+  private final List<String> pluginsToInstall;
+
+  SiteInitializer(
+      String sitePath,
+      String initPath,
+      PluginsDistribution pluginsDistribution,
+      List<String> pluginsToInstall) {
+    this.sitePath = sitePath;
+    this.initPath = initPath;
+    this.pluginsDistribution = pluginsDistribution;
+    this.pluginsToInstall = pluginsToInstall;
+  }
+
+  public void init() {
+    try {
+      if (sitePath != null) {
+        Path site = Paths.get(sitePath);
+        logger.atInfo().log("Initializing site at %s", site.toRealPath().normalize());
+        new BaseInit(site, false, true, pluginsDistribution, pluginsToInstall).run();
+        return;
+      }
+
+      String path = System.getProperty(GERRIT_SITE_PATH);
+      Path site = null;
+      if (!Strings.isNullOrEmpty(path)) {
+        site = Paths.get(path);
+      }
+
+      if (site == null && initPath != null) {
+        site = Paths.get(initPath);
+      }
+      if (site != null) {
+        logger.atInfo().log("Initializing site at %s", site.toRealPath().normalize());
+        new BaseInit(
+                site,
+                new ReviewDbDataSourceProvider(),
+                false,
+                false,
+                pluginsDistribution,
+                pluginsToInstall)
+            .run();
+      }
+    } catch (Exception e) {
+      logger.atSevere().withCause(e).log("Site init failed");
+      throw new RuntimeException(e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/httpd/init/UnzippedDistribution.java b/java/com/google/gerrit/httpd/init/UnzippedDistribution.java
new file mode 100644
index 0000000..9c0142c
--- /dev/null
+++ b/java/com/google/gerrit/httpd/init/UnzippedDistribution.java
@@ -0,0 +1,75 @@
+// Copyright (C) 2014 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.google.gerrit.httpd.init;
+
+import static com.google.gerrit.pgm.init.InitPlugins.JAR;
+import static com.google.gerrit.pgm.init.InitPlugins.PLUGIN_DIR;
+
+import com.google.gerrit.pgm.init.PluginsDistribution;
+import com.google.inject.Singleton;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.util.ArrayList;
+import java.util.List;
+import javax.servlet.ServletContext;
+
+@Singleton
+class UnzippedDistribution implements PluginsDistribution {
+
+  private ServletContext servletContext;
+  private File pluginsDir;
+
+  UnzippedDistribution(ServletContext servletContext) {
+    this.servletContext = servletContext;
+  }
+
+  @Override
+  public void foreach(Processor processor) throws FileNotFoundException, IOException {
+    File[] list = getPluginsDir().listFiles();
+    if (list != null) {
+      for (File p : list) {
+        String pluginJarName = p.getName();
+        String pluginName = pluginJarName.substring(0, pluginJarName.length() - JAR.length());
+        try (InputStream in = Files.newInputStream(p.toPath())) {
+          processor.process(pluginName, in);
+        }
+      }
+    }
+  }
+
+  @Override
+  public List<String> listPluginNames() throws FileNotFoundException {
+    List<String> names = new ArrayList<>();
+    String[] list = getPluginsDir().list();
+    if (list != null) {
+      for (String pluginJarName : list) {
+        String pluginName = pluginJarName.substring(0, pluginJarName.length() - JAR.length());
+        names.add(pluginName);
+      }
+    }
+    return names;
+  }
+
+  private File getPluginsDir() {
+    if (pluginsDir == null) {
+      File root = new File(servletContext.getRealPath(""));
+      pluginsDir = new File(root, PLUGIN_DIR);
+    }
+    return pluginsDir;
+  }
+}
diff --git a/java/com/google/gerrit/httpd/init/WebAppInitializer.java b/java/com/google/gerrit/httpd/init/WebAppInitializer.java
new file mode 100644
index 0000000..aadfeba
--- /dev/null
+++ b/java/com/google/gerrit/httpd/init/WebAppInitializer.java
@@ -0,0 +1,480 @@
+// Copyright (C) 2009 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.google.gerrit.httpd.init;
+
+import static com.google.inject.Scopes.SINGLETON;
+import static com.google.inject.Stage.PRODUCTION;
+
+import com.google.common.base.Splitter;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.elasticsearch.ElasticIndexModule;
+import com.google.gerrit.extensions.client.AuthType;
+import com.google.gerrit.gpg.GpgModule;
+import com.google.gerrit.httpd.AllRequestFilter;
+import com.google.gerrit.httpd.GerritAuthModule;
+import com.google.gerrit.httpd.GetUserFilter;
+import com.google.gerrit.httpd.GitOverHttpModule;
+import com.google.gerrit.httpd.H2CacheBasedWebSession;
+import com.google.gerrit.httpd.HttpCanonicalWebUrlProvider;
+import com.google.gerrit.httpd.RequestContextFilter;
+import com.google.gerrit.httpd.RequestMetricsFilter;
+import com.google.gerrit.httpd.RequireSslFilter;
+import com.google.gerrit.httpd.WebModule;
+import com.google.gerrit.httpd.WebSshGlueModule;
+import com.google.gerrit.httpd.auth.oauth.OAuthModule;
+import com.google.gerrit.httpd.auth.openid.OpenIdModule;
+import com.google.gerrit.httpd.plugins.HttpPluginModule;
+import com.google.gerrit.httpd.raw.StaticModule;
+import com.google.gerrit.lifecycle.LifecycleManager;
+import com.google.gerrit.lifecycle.LifecycleModule;
+import com.google.gerrit.lucene.LuceneIndexModule;
+import com.google.gerrit.metrics.dropwizard.DropWizardMetricMaker;
+import com.google.gerrit.pgm.util.LogFileCompressor;
+import com.google.gerrit.server.LibModuleLoader;
+import com.google.gerrit.server.ModuleOverloader;
+import com.google.gerrit.server.StartupChecks;
+import com.google.gerrit.server.account.AccountDeactivator;
+import com.google.gerrit.server.account.InternalAccountDirectory;
+import com.google.gerrit.server.api.GerritApiModule;
+import com.google.gerrit.server.api.PluginApiModule;
+import com.google.gerrit.server.audit.AuditModule;
+import com.google.gerrit.server.cache.h2.H2CacheModule;
+import com.google.gerrit.server.cache.mem.DefaultMemoryCacheModule;
+import com.google.gerrit.server.change.ChangeCleanupRunner;
+import com.google.gerrit.server.config.AuthConfig;
+import com.google.gerrit.server.config.AuthConfigModule;
+import com.google.gerrit.server.config.CanonicalWebUrlModule;
+import com.google.gerrit.server.config.DefaultUrlFormatter;
+import com.google.gerrit.server.config.DownloadConfig;
+import com.google.gerrit.server.config.GerritGlobalModule;
+import com.google.gerrit.server.config.GerritInstanceNameModule;
+import com.google.gerrit.server.config.GerritOptions;
+import com.google.gerrit.server.config.GerritRuntime;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.GerritServerConfigModule;
+import com.google.gerrit.server.config.SitePath;
+import com.google.gerrit.server.config.SysExecutorModule;
+import com.google.gerrit.server.events.EventBroker;
+import com.google.gerrit.server.events.StreamEventsApiListener;
+import com.google.gerrit.server.git.GarbageCollectionModule;
+import com.google.gerrit.server.git.GitRepositoryManagerModule;
+import com.google.gerrit.server.git.SearchingChangeCacheImpl;
+import com.google.gerrit.server.git.WorkQueue;
+import com.google.gerrit.server.index.IndexModule;
+import com.google.gerrit.server.index.IndexModule.IndexType;
+import com.google.gerrit.server.index.OnlineUpgrader;
+import com.google.gerrit.server.index.VersionManager;
+import com.google.gerrit.server.mail.SignedTokenEmailTokenVerifier;
+import com.google.gerrit.server.mail.receive.MailReceiver;
+import com.google.gerrit.server.mail.send.SmtpEmailSender;
+import com.google.gerrit.server.mime.MimeUtil2Module;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gerrit.server.patch.DiffExecutorModule;
+import com.google.gerrit.server.permissions.DefaultPermissionBackendModule;
+import com.google.gerrit.server.plugins.PluginGuiceEnvironment;
+import com.google.gerrit.server.plugins.PluginModule;
+import com.google.gerrit.server.project.DefaultProjectNameLockManager;
+import com.google.gerrit.server.restapi.RestApiModule;
+import com.google.gerrit.server.schema.DataSourceModule;
+import com.google.gerrit.server.schema.DataSourceProvider;
+import com.google.gerrit.server.schema.DataSourceType;
+import com.google.gerrit.server.schema.DatabaseModule;
+import com.google.gerrit.server.schema.JdbcAccountPatchReviewStore;
+import com.google.gerrit.server.schema.SchemaModule;
+import com.google.gerrit.server.schema.SchemaVersionCheck;
+import com.google.gerrit.server.securestore.SecureStoreClassName;
+import com.google.gerrit.server.ssh.NoSshModule;
+import com.google.gerrit.server.ssh.SshAddressesModule;
+import com.google.gerrit.server.submit.LocalMergeSuperSetComputation;
+import com.google.gerrit.sshd.SshHostKeyModule;
+import com.google.gerrit.sshd.SshKeyCacheImpl;
+import com.google.gerrit.sshd.SshModule;
+import com.google.gerrit.sshd.commands.DefaultCommandModule;
+import com.google.gerrit.sshd.commands.IndexCommandsModule;
+import com.google.gerrit.sshd.plugin.LfsPluginAuthCommand;
+import com.google.inject.AbstractModule;
+import com.google.inject.CreationException;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import com.google.inject.Module;
+import com.google.inject.Provider;
+import com.google.inject.ProvisionException;
+import com.google.inject.name.Names;
+import com.google.inject.servlet.GuiceFilter;
+import com.google.inject.servlet.GuiceServletContextListener;
+import com.google.inject.spi.Message;
+import com.google.inject.util.Providers;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.sql.DataSource;
+import org.eclipse.jgit.lib.Config;
+
+/** Configures the web application environment for Gerrit Code Review. */
+public class WebAppInitializer extends GuiceServletContextListener implements Filter {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final String GERRIT_SITE_PATH = "gerrit.site_path";
+
+  private Path sitePath;
+  private Injector dbInjector;
+  private Injector cfgInjector;
+  private Config config;
+  private Injector sysInjector;
+  private Injector webInjector;
+  private Injector sshInjector;
+  private LifecycleManager manager;
+  private GuiceFilter filter;
+
+  private ServletContext servletContext;
+  private IndexType indexType;
+
+  @Override
+  public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
+      throws IOException, ServletException {
+    filter.doFilter(req, res, chain);
+  }
+
+  private synchronized void init() {
+    if (manager == null) {
+      String path = System.getProperty(GERRIT_SITE_PATH);
+      if (path != null) {
+        sitePath = Paths.get(path);
+      } else {
+        throw new ProvisionException(GERRIT_SITE_PATH + " must be defined");
+      }
+
+      if (System.getProperty("gerrit.init") != null) {
+        List<String> pluginsToInstall;
+        String installPlugins = System.getProperty("gerrit.install_plugins");
+        if (installPlugins == null) {
+          pluginsToInstall = null;
+        } else {
+          pluginsToInstall =
+              Splitter.on(",").trimResults().omitEmptyStrings().splitToList(installPlugins);
+        }
+        new SiteInitializer(
+                path,
+                System.getProperty(GERRIT_SITE_PATH),
+                new UnzippedDistribution(servletContext),
+                pluginsToInstall)
+            .init();
+      }
+
+      try {
+        dbInjector = createDbInjector();
+      } catch (CreationException ce) {
+        final Message first = ce.getErrorMessages().iterator().next();
+        final StringBuilder buf = new StringBuilder();
+        buf.append(first.getMessage());
+        Throwable why = first.getCause();
+        while (why != null) {
+          buf.append("\n  caused by ");
+          buf.append(why.toString());
+          why = why.getCause();
+        }
+        if (first.getCause() != null) {
+          buf.append("\n");
+          buf.append("\nResolve above errors before continuing.");
+          buf.append("\nComplete stack trace follows:");
+        }
+        logger.atSevere().withCause(first.getCause()).log(buf.toString());
+        throw new CreationException(Collections.singleton(first));
+      }
+
+      cfgInjector = createCfgInjector();
+      initIndexType();
+      config = cfgInjector.getInstance(Key.get(Config.class, GerritServerConfig.class));
+      sysInjector = createSysInjector();
+      if (!sshdOff()) {
+        sshInjector = createSshInjector();
+      }
+      webInjector = createWebInjector();
+
+      PluginGuiceEnvironment env = sysInjector.getInstance(PluginGuiceEnvironment.class);
+      env.setDbCfgInjector(dbInjector, cfgInjector);
+      if (sshInjector != null) {
+        env.setSshInjector(sshInjector);
+      }
+      env.setHttpInjector(webInjector);
+
+      // Push the Provider<HttpServletRequest> down into the canonical
+      // URL provider. Its optional for that provider, but since we can
+      // supply one we should do so, in case the administrator has not
+      // setup the canonical URL in the configuration file.
+      //
+      // Note we have to do this manually as Guice failed to do the
+      // injection here because the HTTP environment is not visible
+      // to the core server modules.
+      //
+      sysInjector
+          .getInstance(HttpCanonicalWebUrlProvider.class)
+          .setHttpServletRequest(webInjector.getProvider(HttpServletRequest.class));
+
+      filter = webInjector.getInstance(GuiceFilter.class);
+      manager = new LifecycleManager();
+      manager.add(dbInjector);
+      manager.add(cfgInjector);
+      manager.add(sysInjector);
+      if (sshInjector != null) {
+        manager.add(sshInjector);
+      }
+      manager.add(webInjector);
+    }
+  }
+
+  private boolean sshdOff() {
+    return new SshAddressesModule().getListenAddresses(config).isEmpty();
+  }
+
+  private Injector createDbInjector() {
+    final List<Module> modules = new ArrayList<>();
+    AbstractModule secureStore = createSecureStoreModule();
+    modules.add(secureStore);
+    if (sitePath != null) {
+      Module sitePathModule =
+          new AbstractModule() {
+            @Override
+            protected void configure() {
+              bind(Path.class).annotatedWith(SitePath.class).toInstance(sitePath);
+            }
+          };
+      modules.add(sitePathModule);
+
+      Module configModule = new GerritServerConfigModule();
+      modules.add(configModule);
+
+      Injector cfgInjector = Guice.createInjector(sitePathModule, configModule, secureStore);
+      Config cfg = cfgInjector.getInstance(Key.get(Config.class, GerritServerConfig.class));
+      String dbType = cfg.getString("database", null, "type");
+
+      final DataSourceType dst =
+          Guice.createInjector(new DataSourceModule(), configModule, sitePathModule, secureStore)
+              .getInstance(Key.get(DataSourceType.class, Names.named(dbType.toLowerCase())));
+      modules.add(
+          new LifecycleModule() {
+            @Override
+            protected void configure() {
+              bind(DataSourceType.class).toInstance(dst);
+              bind(DataSourceProvider.Context.class)
+                  .toInstance(DataSourceProvider.Context.MULTI_USER);
+              bind(Key.get(DataSource.class, Names.named("ReviewDb")))
+                  .toProvider(DataSourceProvider.class)
+                  .in(SINGLETON);
+              listener().to(DataSourceProvider.class);
+            }
+          });
+
+    } else {
+      modules.add(
+          new LifecycleModule() {
+            @Override
+            protected void configure() {
+              bind(Key.get(DataSource.class, Names.named("ReviewDb")))
+                  .toProvider(ReviewDbDataSourceProvider.class)
+                  .in(SINGLETON);
+              listener().to(ReviewDbDataSourceProvider.class);
+            }
+          });
+      modules.add(new GerritServerConfigModule());
+    }
+    modules.add(new DatabaseModule());
+    modules.add(new NotesMigration.Module());
+    modules.add(new DropWizardMetricMaker.ApiModule());
+    return Guice.createInjector(PRODUCTION, modules);
+  }
+
+  private Injector createCfgInjector() {
+    final List<Module> modules = new ArrayList<>();
+    modules.add(new SchemaModule());
+    modules.add(SchemaVersionCheck.module());
+    modules.add(new AuthConfigModule());
+    return dbInjector.createChildInjector(modules);
+  }
+
+  private Injector createSysInjector() {
+    final List<Module> modules = new ArrayList<>();
+    modules.add(new DropWizardMetricMaker.RestModule());
+    modules.add(new LogFileCompressor.Module());
+    modules.add(new EventBroker.Module());
+    modules.add(new JdbcAccountPatchReviewStore.Module(config));
+    modules.add(cfgInjector.getInstance(GitRepositoryManagerModule.class));
+    modules.add(new StreamEventsApiListener.Module());
+    modules.add(new SysExecutorModule());
+    modules.add(new DiffExecutorModule());
+    modules.add(new MimeUtil2Module());
+    modules.add(cfgInjector.getInstance(GerritGlobalModule.class));
+    modules.add(new GerritApiModule());
+    modules.add(new PluginApiModule());
+    modules.add(new SearchingChangeCacheImpl.Module());
+    modules.add(new InternalAccountDirectory.Module());
+    modules.add(new DefaultPermissionBackendModule());
+    modules.add(new DefaultMemoryCacheModule());
+    modules.add(new H2CacheModule());
+    modules.add(cfgInjector.getInstance(MailReceiver.Module.class));
+    modules.add(new SmtpEmailSender.Module());
+    modules.add(new SignedTokenEmailTokenVerifier.Module());
+    modules.add(new LocalMergeSuperSetComputation.Module());
+    modules.add(new AuditModule());
+    modules.add(new GpgModule(config));
+    modules.add(new StartupChecks.Module());
+
+    // Index module shutdown must happen before work queue shutdown, otherwise
+    // work queue can get stuck waiting on index futures that will never return.
+    modules.add(createIndexModule());
+
+    modules.add(new PluginModule());
+    if (VersionManager.getOnlineUpgrade(config)) {
+      modules.add(new OnlineUpgrader.Module());
+    }
+
+    modules.add(new RestApiModule());
+    modules.add(new WorkQueue.Module());
+    modules.add(new GerritInstanceNameModule());
+    modules.add(
+        new CanonicalWebUrlModule() {
+          @Override
+          protected Class<? extends Provider<String>> provider() {
+            return HttpCanonicalWebUrlProvider.class;
+          }
+        });
+    modules.add(new DefaultUrlFormatter.Module());
+
+    modules.add(SshKeyCacheImpl.module());
+    modules.add(
+        new AbstractModule() {
+          @Override
+          protected void configure() {
+            bind(GerritOptions.class).toInstance(new GerritOptions(config, false, false, false));
+            bind(GerritRuntime.class).toInstance(GerritRuntime.DAEMON);
+          }
+        });
+    modules.add(new GarbageCollectionModule());
+    modules.add(new ChangeCleanupRunner.Module());
+    modules.add(new AccountDeactivator.Module());
+    modules.add(new DefaultProjectNameLockManager.Module());
+    return cfgInjector.createChildInjector(
+        ModuleOverloader.override(modules, LibModuleLoader.loadModules(cfgInjector)));
+  }
+
+  private Module createIndexModule() {
+    switch (indexType) {
+      case LUCENE:
+        return LuceneIndexModule.latestVersion(false);
+      case ELASTICSEARCH:
+        return ElasticIndexModule.latestVersion(false);
+      default:
+        throw new IllegalStateException("unsupported index.type = " + indexType);
+    }
+  }
+
+  private void initIndexType() {
+    indexType = IndexModule.getIndexType(cfgInjector);
+  }
+
+  private Injector createSshInjector() {
+    final List<Module> modules = new ArrayList<>();
+    modules.add(sysInjector.getInstance(SshModule.class));
+    modules.add(new SshHostKeyModule());
+    modules.add(
+        new DefaultCommandModule(
+            false,
+            sysInjector.getInstance(DownloadConfig.class),
+            sysInjector.getInstance(LfsPluginAuthCommand.Module.class)));
+    modules.add(new IndexCommandsModule(sysInjector));
+    return sysInjector.createChildInjector(modules);
+  }
+
+  private Injector createWebInjector() {
+    final List<Module> modules = new ArrayList<>();
+    modules.add(RequestContextFilter.module());
+    modules.add(RequestMetricsFilter.module());
+    modules.add(sysInjector.getInstance(GerritAuthModule.class));
+    modules.add(sysInjector.getInstance(GitOverHttpModule.class));
+    modules.add(AllRequestFilter.module());
+    modules.add(sysInjector.getInstance(WebModule.class));
+    modules.add(sysInjector.getInstance(RequireSslFilter.Module.class));
+    if (sshInjector != null) {
+      modules.add(sshInjector.getInstance(WebSshGlueModule.class));
+    } else {
+      modules.add(new NoSshModule());
+    }
+    modules.add(H2CacheBasedWebSession.module());
+    modules.add(new HttpPluginModule());
+
+    AuthConfig authConfig = cfgInjector.getInstance(AuthConfig.class);
+    if (authConfig.getAuthType() == AuthType.OPENID) {
+      modules.add(new OpenIdModule());
+    } else if (authConfig.getAuthType() == AuthType.OAUTH) {
+      modules.add(new OAuthModule());
+    }
+    modules.add(sysInjector.getInstance(GetUserFilter.Module.class));
+
+    // StaticModule contains a "/*" wildcard, place it last.
+    GerritOptions opts = sysInjector.getInstance(GerritOptions.class);
+    if (opts.enableMasterFeatures()) {
+      modules.add(sysInjector.getInstance(StaticModule.class));
+    }
+
+    return sysInjector.createChildInjector(modules);
+  }
+
+  @Override
+  protected Injector getInjector() {
+    init();
+    return webInjector;
+  }
+
+  @Override
+  public void init(FilterConfig cfg) throws ServletException {
+    servletContext = cfg.getServletContext();
+    contextInitialized(new ServletContextEvent(servletContext));
+    init();
+    manager.start();
+  }
+
+  @Override
+  public void destroy() {
+    if (manager != null) {
+      manager.stop();
+      manager = null;
+    }
+  }
+
+  private AbstractModule createSecureStoreModule() {
+    return new AbstractModule() {
+      @Override
+      public void configure() {
+        String secureStoreClassName = GerritServerConfigModule.getSecureStoreClassName(sitePath);
+        bind(String.class)
+            .annotatedWith(SecureStoreClassName.class)
+            .toProvider(Providers.of(secureStoreClassName));
+      }
+    };
+  }
+}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/ContextMapper.java b/java/com/google/gerrit/httpd/plugins/ContextMapper.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/ContextMapper.java
rename to java/com/google/gerrit/httpd/plugins/ContextMapper.java
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpAutoRegisterModuleGenerator.java b/java/com/google/gerrit/httpd/plugins/HttpAutoRegisterModuleGenerator.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpAutoRegisterModuleGenerator.java
rename to java/com/google/gerrit/httpd/plugins/HttpAutoRegisterModuleGenerator.java
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginModule.java b/java/com/google/gerrit/httpd/plugins/HttpPluginModule.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginModule.java
rename to java/com/google/gerrit/httpd/plugins/HttpPluginModule.java
diff --git a/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java b/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java
new file mode 100644
index 0000000..74cadd3
--- /dev/null
+++ b/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java
@@ -0,0 +1,736 @@
+// Copyright (C) 2012 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.google.gerrit.httpd.plugins;
+
+import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS;
+import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS;
+import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN;
+import static com.google.common.net.HttpHeaders.ORIGIN;
+import static com.google.common.net.HttpHeaders.VARY;
+import static com.google.gerrit.common.FileUtil.lastModified;
+import static com.google.gerrit.server.plugins.PluginEntry.ATTR_CHARACTER_ENCODING;
+import static com.google.gerrit.server.plugins.PluginEntry.ATTR_CONTENT_TYPE;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.base.CharMatcher;
+import com.google.common.base.Joiner;
+import com.google.common.base.Splitter;
+import com.google.common.base.Strings;
+import com.google.common.cache.Cache;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.io.ByteStreams;
+import com.google.common.net.HttpHeaders;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import com.google.gerrit.httpd.resources.Resource;
+import com.google.gerrit.httpd.resources.ResourceKey;
+import com.google.gerrit.httpd.resources.SmallResource;
+import com.google.gerrit.httpd.restapi.RestApiServlet;
+import com.google.gerrit.server.config.CanonicalWebUrl;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.documentation.MarkdownFormatter;
+import com.google.gerrit.server.mime.MimeUtilFileTypeRegistry;
+import com.google.gerrit.server.plugins.Plugin;
+import com.google.gerrit.server.plugins.Plugin.ApiType;
+import com.google.gerrit.server.plugins.PluginContentScanner;
+import com.google.gerrit.server.plugins.PluginEntry;
+import com.google.gerrit.server.plugins.PluginsCollection;
+import com.google.gerrit.server.plugins.ReloadPluginListener;
+import com.google.gerrit.server.plugins.StartPluginListener;
+import com.google.gerrit.server.ssh.SshInfo;
+import com.google.gerrit.util.http.CacheHeaders;
+import com.google.gerrit.util.http.RequestUtil;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import com.google.inject.name.Named;
+import com.google.inject.servlet.GuiceFilter;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.ConcurrentMap;
+import java.util.function.Predicate;
+import java.util.jar.Attributes;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.apache.commons.lang.StringUtils;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.util.IO;
+import org.eclipse.jgit.util.RawParseUtils;
+
+@Singleton
+class HttpPluginServlet extends HttpServlet implements StartPluginListener, ReloadPluginListener {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final int SMALL_RESOURCE = 128 * 1024;
+  private static final long serialVersionUID = 1L;
+
+  private final MimeUtilFileTypeRegistry mimeUtil;
+  private final Provider<String> webUrl;
+  private final Cache<ResourceKey, Resource> resourceCache;
+  private final String sshHost;
+  private final int sshPort;
+  private final RestApiServlet managerApi;
+
+  private List<Plugin> pending = new ArrayList<>();
+  private ContextMapper wrapper;
+  private final ConcurrentMap<String, PluginHolder> plugins = Maps.newConcurrentMap();
+  private final Pattern allowOrigin;
+
+  @Inject
+  HttpPluginServlet(
+      MimeUtilFileTypeRegistry mimeUtil,
+      @CanonicalWebUrl Provider<String> webUrl,
+      @Named(HttpPluginModule.PLUGIN_RESOURCES) Cache<ResourceKey, Resource> cache,
+      SshInfo sshInfo,
+      RestApiServlet.Globals globals,
+      PluginsCollection plugins,
+      @GerritServerConfig Config cfg) {
+    this.mimeUtil = mimeUtil;
+    this.webUrl = webUrl;
+    this.resourceCache = cache;
+    this.managerApi = new RestApiServlet(globals, plugins);
+
+    String sshHost = "review.example.com";
+    int sshPort = 29418;
+    if (!sshInfo.getHostKeys().isEmpty()) {
+      String host = sshInfo.getHostKeys().get(0).getHost();
+      int c = host.lastIndexOf(':');
+      if (0 <= c) {
+        sshHost = host.substring(0, c);
+        sshPort = Integer.parseInt(host.substring(c + 1));
+      } else {
+        sshHost = host;
+        sshPort = 22;
+      }
+    }
+    this.sshHost = sshHost;
+    this.sshPort = sshPort;
+    this.allowOrigin = makeAllowOrigin(cfg);
+  }
+
+  @Override
+  public synchronized void init(ServletConfig config) throws ServletException {
+    super.init(config);
+
+    wrapper = new ContextMapper(config.getServletContext().getContextPath());
+    for (Plugin plugin : pending) {
+      install(plugin);
+    }
+    pending = null;
+  }
+
+  @Override
+  public synchronized void onStartPlugin(Plugin plugin) {
+    if (pending != null) {
+      pending.add(plugin);
+    } else {
+      install(plugin);
+    }
+  }
+
+  @Override
+  public void onReloadPlugin(Plugin oldPlugin, Plugin newPlugin) {
+    install(newPlugin);
+  }
+
+  private void install(Plugin plugin) {
+    GuiceFilter filter = load(plugin);
+    final String name = plugin.getName();
+    final PluginHolder holder = new PluginHolder(plugin, filter);
+    plugin.add(
+        new RegistrationHandle() {
+          @Override
+          public void remove() {
+            plugins.remove(name, holder);
+          }
+        });
+    plugins.put(name, holder);
+  }
+
+  private GuiceFilter load(Plugin plugin) {
+    if (plugin.getHttpInjector() != null) {
+      final String name = plugin.getName();
+      final GuiceFilter filter;
+      try {
+        filter = plugin.getHttpInjector().getInstance(GuiceFilter.class);
+      } catch (RuntimeException e) {
+        logger.atWarning().withCause(e).log("Plugin %s cannot load GuiceFilter", name);
+        return null;
+      }
+
+      try {
+        ServletContext ctx = PluginServletContext.create(plugin, wrapper.getFullPath(name));
+        filter.init(new WrappedFilterConfig(ctx));
+      } catch (ServletException e) {
+        logger.atWarning().withCause(e).log("Plugin %s failed to initialize HTTP", name);
+        return null;
+      }
+
+      plugin.add(filter::destroy);
+      return filter;
+    }
+    return null;
+  }
+
+  @Override
+  public void service(HttpServletRequest req, HttpServletResponse res)
+      throws IOException, ServletException {
+    List<String> parts =
+        Lists.newArrayList(
+            Splitter.on('/')
+                .limit(3)
+                .omitEmptyStrings()
+                .split(Strings.nullToEmpty(RequestUtil.getEncodedPathInfo(req))));
+
+    if (isApiCall(req, parts)) {
+      managerApi.service(req, res);
+      return;
+    }
+
+    String name = parts.get(0);
+    final PluginHolder holder = plugins.get(name);
+    if (holder == null) {
+      CacheHeaders.setNotCacheable(res);
+      res.sendError(HttpServletResponse.SC_NOT_FOUND);
+      return;
+    }
+
+    HttpServletRequest wr = wrapper.create(req, name);
+    FilterChain chain =
+        new FilterChain() {
+          @Override
+          public void doFilter(ServletRequest req, ServletResponse res) throws IOException {
+            onDefault(holder, (HttpServletRequest) req, (HttpServletResponse) res);
+          }
+        };
+    if (holder.filter != null) {
+      holder.filter.doFilter(wr, res, chain);
+    } else {
+      chain.doFilter(wr, res);
+    }
+  }
+
+  private static boolean isApiCall(HttpServletRequest req, List<String> parts) {
+    String method = req.getMethod();
+    int cnt = parts.size();
+    return cnt == 0
+        || (cnt == 1 && ("PUT".equals(method) || "DELETE".equals(method)))
+        || (cnt == 2 && parts.get(1).startsWith("gerrit~"));
+  }
+
+  private void onDefault(PluginHolder holder, HttpServletRequest req, HttpServletResponse res)
+      throws IOException {
+    if (!"GET".equals(req.getMethod()) && !"HEAD".equals(req.getMethod())) {
+      CacheHeaders.setNotCacheable(res);
+      res.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+      return;
+    }
+
+    String pathInfo = RequestUtil.getEncodedPathInfo(req);
+    if (pathInfo.length() < 1) {
+      Resource.NOT_FOUND.send(req, res);
+      return;
+    }
+
+    checkCors(req, res);
+
+    String file = pathInfo.substring(1);
+    PluginResourceKey key = PluginResourceKey.create(holder.plugin, file);
+    Resource rsc = resourceCache.getIfPresent(key);
+    if (rsc != null && req.getHeader(HttpHeaders.IF_MODIFIED_SINCE) == null) {
+      rsc.send(req, res);
+      return;
+    }
+
+    String uri = req.getRequestURI();
+    if ("".equals(file)) {
+      res.sendRedirect(uri + holder.docPrefix + "index.html");
+      return;
+    }
+
+    if (file.startsWith(holder.staticPrefix)) {
+      if (holder.plugin.getApiType() == ApiType.JS) {
+        sendJsPlugin(holder.plugin, key, req, res);
+      } else {
+        PluginContentScanner scanner = holder.plugin.getContentScanner();
+        Optional<PluginEntry> entry = scanner.getEntry(file);
+        if (entry.isPresent()) {
+          if (hasUpToDateCachedResource(rsc, entry.get().getTime())) {
+            rsc.send(req, res);
+          } else {
+            sendResource(scanner, entry.get(), key, res);
+          }
+        } else {
+          resourceCache.put(key, Resource.NOT_FOUND);
+          Resource.NOT_FOUND.send(req, res);
+        }
+      }
+    } else if (file.equals(holder.docPrefix.substring(0, holder.docPrefix.length() - 1))) {
+      res.sendRedirect(uri + "/index.html");
+    } else if (file.startsWith(holder.docPrefix) && file.endsWith("/")) {
+      res.sendRedirect(uri + "index.html");
+    } else if (file.startsWith(holder.docPrefix)) {
+      PluginContentScanner scanner = holder.plugin.getContentScanner();
+      Optional<PluginEntry> entry = scanner.getEntry(file);
+      if (!entry.isPresent()) {
+        entry = findSource(scanner, file);
+      }
+      if (!entry.isPresent() && file.endsWith("/index.html")) {
+        String pfx = file.substring(0, file.length() - "index.html".length());
+        long pluginLastModified = lastModified(holder.plugin.getSrcFile());
+        if (hasUpToDateCachedResource(rsc, pluginLastModified)) {
+          rsc.send(req, res);
+        } else {
+          sendAutoIndex(scanner, pfx, holder.plugin.getName(), key, res, pluginLastModified);
+        }
+      } else if (entry.isPresent() && entry.get().getName().endsWith(".md")) {
+        if (hasUpToDateCachedResource(rsc, entry.get().getTime())) {
+          rsc.send(req, res);
+        } else {
+          sendMarkdownAsHtml(scanner, entry.get(), holder.plugin.getName(), key, res);
+        }
+      } else if (entry.isPresent()) {
+        if (hasUpToDateCachedResource(rsc, entry.get().getTime())) {
+          rsc.send(req, res);
+        } else {
+          sendResource(scanner, entry.get(), key, res);
+        }
+      } else {
+        resourceCache.put(key, Resource.NOT_FOUND);
+        Resource.NOT_FOUND.send(req, res);
+      }
+    } else {
+      resourceCache.put(key, Resource.NOT_FOUND);
+      Resource.NOT_FOUND.send(req, res);
+    }
+  }
+
+  private static Pattern makeAllowOrigin(Config cfg) {
+    String[] allow = cfg.getStringList("site", null, "allowOriginRegex");
+    if (allow.length > 0) {
+      return Pattern.compile(Joiner.on('|').join(allow));
+    }
+    return null;
+  }
+
+  private void checkCors(HttpServletRequest req, HttpServletResponse res) {
+    String origin = req.getHeader(ORIGIN);
+    if (!Strings.isNullOrEmpty(origin) && isOriginAllowed(origin)) {
+      res.addHeader(VARY, ORIGIN);
+      setCorsHeaders(res, origin);
+    }
+  }
+
+  private void setCorsHeaders(HttpServletResponse res, String origin) {
+    res.setHeader(ACCESS_CONTROL_ALLOW_ORIGIN, origin);
+    res.setHeader(ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
+    res.setHeader(ACCESS_CONTROL_ALLOW_METHODS, "GET, HEAD");
+  }
+
+  private boolean isOriginAllowed(String origin) {
+    return allowOrigin == null || allowOrigin.matcher(origin).matches();
+  }
+
+  private boolean hasUpToDateCachedResource(Resource cachedResource, long lastUpdateTime) {
+    return cachedResource != null && cachedResource.isUnchanged(lastUpdateTime);
+  }
+
+  private void appendEntriesSection(
+      PluginContentScanner scanner,
+      List<PluginEntry> entries,
+      String sectionTitle,
+      StringBuilder md,
+      String prefix,
+      int nameOffset)
+      throws IOException {
+    if (!entries.isEmpty()) {
+      md.append("## ").append(sectionTitle).append(" ##\n");
+      for (PluginEntry entry : entries) {
+        String rsrc = entry.getName().substring(prefix.length());
+        String entryTitle;
+        if (rsrc.endsWith(".html")) {
+          entryTitle = rsrc.substring(nameOffset, rsrc.length() - 5).replace('-', ' ');
+        } else if (rsrc.endsWith(".md")) {
+          entryTitle = extractTitleFromMarkdown(scanner, entry);
+          if (Strings.isNullOrEmpty(entryTitle)) {
+            entryTitle = rsrc.substring(nameOffset, rsrc.length() - 3).replace('-', ' ');
+          }
+        } else {
+          entryTitle = rsrc.substring(nameOffset).replace('-', ' ');
+        }
+        md.append(String.format("* [%s](%s)\n", entryTitle, rsrc));
+      }
+      md.append("\n");
+    }
+  }
+
+  private void sendAutoIndex(
+      PluginContentScanner scanner,
+      final String prefix,
+      final String pluginName,
+      PluginResourceKey cacheKey,
+      HttpServletResponse res,
+      long lastModifiedTime)
+      throws IOException {
+    List<PluginEntry> cmds = new ArrayList<>();
+    List<PluginEntry> servlets = new ArrayList<>();
+    List<PluginEntry> restApis = new ArrayList<>();
+    List<PluginEntry> docs = new ArrayList<>();
+    PluginEntry about = null;
+
+    Predicate<PluginEntry> filter =
+        entry -> {
+          String name = entry.getName();
+          Optional<Long> size = entry.getSize();
+          if (name.startsWith(prefix)
+              && (name.endsWith(".md") || name.endsWith(".html"))
+              && size.isPresent()) {
+            if (size.get() <= 0 || size.get() > SMALL_RESOURCE) {
+              logger.atWarning().log(
+                  "Plugin %s: %s omitted from document index. " + "Size %d out of range (0,%d).",
+                  pluginName, name.substring(prefix.length()), size.get(), SMALL_RESOURCE);
+              return false;
+            }
+            return true;
+          }
+          return false;
+        };
+
+    List<PluginEntry> entries =
+        Collections.list(scanner.entries()).stream().filter(filter).collect(toList());
+    for (PluginEntry entry : entries) {
+      String name = entry.getName().substring(prefix.length());
+      if (name.startsWith("cmd-")) {
+        cmds.add(entry);
+      } else if (name.startsWith("servlet-")) {
+        servlets.add(entry);
+      } else if (name.startsWith("rest-api-")) {
+        restApis.add(entry);
+      } else if (name.startsWith("about.")) {
+        if (about == null) {
+          about = entry;
+        } else {
+          logger.atWarning().log(
+              "Plugin %s: Multiple 'about' documents found; using %s",
+              pluginName, about.getName().substring(prefix.length()));
+        }
+      } else {
+        docs.add(entry);
+      }
+    }
+
+    cmds.sort(PluginEntry.COMPARATOR_BY_NAME);
+    docs.sort(PluginEntry.COMPARATOR_BY_NAME);
+
+    StringBuilder md = new StringBuilder();
+    md.append(String.format("# Plugin %s #\n", pluginName));
+    md.append("\n");
+    appendPluginInfoTable(md, scanner.getManifest().getMainAttributes());
+
+    if (about != null) {
+      InputStreamReader isr = new InputStreamReader(scanner.getInputStream(about), UTF_8);
+      StringBuilder aboutContent = new StringBuilder();
+      try (BufferedReader reader = new BufferedReader(isr)) {
+        String line;
+        while ((line = reader.readLine()) != null) {
+          line = StringUtils.stripEnd(line, null);
+          if (line.isEmpty()) {
+            aboutContent.append("\n");
+          } else {
+            aboutContent.append(line).append("\n");
+          }
+        }
+      }
+
+      // Only append the About section if there was anything in it
+      if (aboutContent.toString().trim().length() > 0) {
+        md.append("## About ##\n");
+        md.append("\n").append(aboutContent);
+      }
+    }
+
+    appendEntriesSection(scanner, docs, "Documentation", md, prefix, 0);
+    appendEntriesSection(scanner, servlets, "Servlets", md, prefix, "servlet-".length());
+    appendEntriesSection(scanner, restApis, "REST APIs", md, prefix, "rest-api-".length());
+    appendEntriesSection(scanner, cmds, "Commands", md, prefix, "cmd-".length());
+
+    sendMarkdownAsHtml(md.toString(), pluginName, cacheKey, res, lastModifiedTime);
+  }
+
+  private void sendMarkdownAsHtml(
+      String md,
+      String pluginName,
+      PluginResourceKey cacheKey,
+      HttpServletResponse res,
+      long lastModifiedTime)
+      throws UnsupportedEncodingException, IOException {
+    Map<String, String> macros = new HashMap<>();
+    macros.put("PLUGIN", pluginName);
+    macros.put("SSH_HOST", sshHost);
+    macros.put("SSH_PORT", "" + sshPort);
+    String url = webUrl.get();
+    if (Strings.isNullOrEmpty(url)) {
+      url = "http://review.example.com/";
+    }
+    macros.put("URL", url);
+
+    Matcher m = Pattern.compile("(\\\\)?@([A-Z_]+)@").matcher(md);
+    StringBuffer sb = new StringBuffer();
+    while (m.find()) {
+      String key = m.group(2);
+      String val = macros.get(key);
+      if (m.group(1) != null) {
+        m.appendReplacement(sb, "@" + key + "@");
+      } else if (val != null) {
+        m.appendReplacement(sb, val);
+      } else {
+        m.appendReplacement(sb, "@" + key + "@");
+      }
+    }
+    m.appendTail(sb);
+
+    byte[] html = new MarkdownFormatter().markdownToDocHtml(sb.toString(), UTF_8.name());
+    resourceCache.put(
+        cacheKey,
+        new SmallResource(html)
+            .setContentType("text/html")
+            .setCharacterEncoding(UTF_8.name())
+            .setLastModified(lastModifiedTime));
+    res.setContentType("text/html");
+    res.setCharacterEncoding(UTF_8.name());
+    res.setContentLength(html.length);
+    res.setDateHeader("Last-Modified", lastModifiedTime);
+    res.getOutputStream().write(html);
+  }
+
+  private static void appendPluginInfoTable(StringBuilder html, Attributes main) {
+    if (main != null) {
+      String t = main.getValue(Attributes.Name.IMPLEMENTATION_TITLE);
+      String n = main.getValue(Attributes.Name.IMPLEMENTATION_VENDOR);
+      String v = main.getValue(Attributes.Name.IMPLEMENTATION_VERSION);
+      String a = main.getValue("Gerrit-ApiVersion");
+
+      html.append("<table class=\"plugin_info\">");
+      if (!Strings.isNullOrEmpty(t)) {
+        html.append("<tr><th>Name</th><td>").append(t).append("</td></tr>\n");
+      }
+      if (!Strings.isNullOrEmpty(n)) {
+        html.append("<tr><th>Vendor</th><td>").append(n).append("</td></tr>\n");
+      }
+      if (!Strings.isNullOrEmpty(v)) {
+        html.append("<tr><th>Version</th><td>").append(v).append("</td></tr>\n");
+      }
+      if (!Strings.isNullOrEmpty(a)) {
+        html.append("<tr><th>API Version</th><td>").append(a).append("</td></tr>\n");
+      }
+      html.append("</table>\n");
+    }
+  }
+
+  private static String extractTitleFromMarkdown(PluginContentScanner scanner, PluginEntry entry)
+      throws IOException {
+    String charEnc = null;
+    Map<Object, String> atts = entry.getAttrs();
+    if (atts != null) {
+      charEnc = Strings.emptyToNull(atts.get(ATTR_CHARACTER_ENCODING));
+    }
+    if (charEnc == null) {
+      charEnc = UTF_8.name();
+    }
+    return new MarkdownFormatter()
+        .extractTitleFromMarkdown(readWholeEntry(scanner, entry), charEnc);
+  }
+
+  private static Optional<PluginEntry> findSource(PluginContentScanner scanner, String file)
+      throws IOException {
+    if (file.endsWith(".html")) {
+      int d = file.lastIndexOf('.');
+      return scanner.getEntry(file.substring(0, d) + ".md");
+    }
+    return Optional.empty();
+  }
+
+  private void sendMarkdownAsHtml(
+      PluginContentScanner scanner,
+      PluginEntry entry,
+      String pluginName,
+      PluginResourceKey key,
+      HttpServletResponse res)
+      throws IOException {
+    byte[] rawmd = readWholeEntry(scanner, entry);
+    String encoding = null;
+    Map<Object, String> atts = entry.getAttrs();
+    if (atts != null) {
+      encoding = Strings.emptyToNull(atts.get(ATTR_CHARACTER_ENCODING));
+    }
+
+    String txtmd =
+        RawParseUtils.decode(Charset.forName(encoding != null ? encoding : UTF_8.name()), rawmd);
+    long time = entry.getTime();
+    if (0 < time) {
+      res.setDateHeader("Last-Modified", time);
+    }
+    sendMarkdownAsHtml(txtmd, pluginName, key, res, time);
+  }
+
+  private void sendResource(
+      PluginContentScanner scanner,
+      PluginEntry entry,
+      PluginResourceKey key,
+      HttpServletResponse res)
+      throws IOException {
+    byte[] data = null;
+    Optional<Long> size = entry.getSize();
+    if (size.isPresent() && size.get() <= SMALL_RESOURCE) {
+      data = readWholeEntry(scanner, entry);
+    }
+
+    String contentType = null;
+    String charEnc = null;
+    Map<Object, String> atts = entry.getAttrs();
+    if (atts != null) {
+      contentType = Strings.emptyToNull(atts.get(ATTR_CONTENT_TYPE));
+      charEnc = Strings.emptyToNull(atts.get(ATTR_CHARACTER_ENCODING));
+    }
+    if (contentType == null) {
+      contentType = mimeUtil.getMimeType(entry.getName(), data).toString();
+      if ("application/octet-stream".equals(contentType) && entry.getName().endsWith(".js")) {
+        contentType = "application/javascript";
+      } else if ("application/x-pointplus".equals(contentType)
+          && entry.getName().endsWith(".css")) {
+        contentType = "text/css";
+      }
+    }
+
+    long time = entry.getTime();
+    if (0 < time) {
+      res.setDateHeader("Last-Modified", time);
+    }
+    if (size.isPresent()) {
+      res.setHeader("Content-Length", size.get().toString());
+    }
+    res.setContentType(contentType);
+    if (charEnc != null) {
+      res.setCharacterEncoding(charEnc);
+    }
+    if (data != null) {
+      resourceCache.put(
+          key,
+          new SmallResource(data)
+              .setContentType(contentType)
+              .setCharacterEncoding(charEnc)
+              .setLastModified(time));
+      res.getOutputStream().write(data);
+    } else {
+      writeToResponse(res, scanner.getInputStream(entry));
+    }
+  }
+
+  private void sendJsPlugin(
+      Plugin plugin, PluginResourceKey key, HttpServletRequest req, HttpServletResponse res)
+      throws IOException {
+    Path path = plugin.getSrcFile();
+    if (req.getRequestURI().endsWith(getJsPluginPath(plugin)) && Files.exists(path)) {
+      res.setHeader("Content-Length", Long.toString(Files.size(path)));
+      if (path.toString().toLowerCase(Locale.US).endsWith(".html")) {
+        res.setContentType("text/html");
+      } else {
+        res.setContentType("application/javascript");
+      }
+      writeToResponse(res, Files.newInputStream(path));
+    } else {
+      resourceCache.put(key, Resource.NOT_FOUND);
+      Resource.NOT_FOUND.send(req, res);
+    }
+  }
+
+  private static String getJsPluginPath(Plugin plugin) {
+    return String.format(
+        "/plugins/%s/static/%s", plugin.getName(), plugin.getSrcFile().getFileName());
+  }
+
+  private void writeToResponse(HttpServletResponse res, InputStream inputStream)
+      throws IOException {
+    try (InputStream in = inputStream;
+        OutputStream out = res.getOutputStream()) {
+      ByteStreams.copy(in, out);
+    }
+  }
+
+  private static byte[] readWholeEntry(PluginContentScanner scanner, PluginEntry entry)
+      throws IOException {
+    try (InputStream in = scanner.getInputStream(entry)) {
+      return IO.readWholeStream(in, entry.getSize().get().intValue()).array();
+    }
+  }
+
+  private static class PluginHolder {
+    final Plugin plugin;
+    final GuiceFilter filter;
+    final String staticPrefix;
+    final String docPrefix;
+
+    PluginHolder(Plugin plugin, GuiceFilter filter) {
+      this.plugin = plugin;
+      this.filter = filter;
+      this.staticPrefix = getPrefix(plugin, "Gerrit-HttpStaticPrefix", "static/");
+      this.docPrefix = getPrefix(plugin, "Gerrit-HttpDocumentationPrefix", "Documentation/");
+    }
+
+    private static String getPrefix(Plugin plugin, String attr, String def) {
+      Path path = plugin.getSrcFile();
+      PluginContentScanner scanner = plugin.getContentScanner();
+      if (path == null || scanner == PluginContentScanner.EMPTY) {
+        return def;
+      }
+      try {
+        String prefix = scanner.getManifest().getMainAttributes().getValue(attr);
+        if (prefix != null) {
+          return CharMatcher.is('/').trimFrom(prefix) + "/";
+        }
+        return def;
+      } catch (IOException e) {
+        logger.atWarning().withCause(e).log(
+            "Error getting %s for plugin %s, using default", attr, plugin.getName());
+        return null;
+      }
+    }
+  }
+}
diff --git a/java/com/google/gerrit/httpd/plugins/LfsPluginServlet.java b/java/com/google/gerrit/httpd/plugins/LfsPluginServlet.java
new file mode 100644
index 0000000..67ee3ba
--- /dev/null
+++ b/java/com/google/gerrit/httpd/plugins/LfsPluginServlet.java
@@ -0,0 +1,160 @@
+// Copyright (C) 2015 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.google.gerrit.httpd.plugins;
+
+import static com.google.gerrit.extensions.api.lfs.LfsDefinitions.CONTENTTYPE_VND_GIT_LFS_JSON;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static javax.servlet.http.HttpServletResponse.SC_NOT_IMPLEMENTED;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import com.google.gerrit.httpd.resources.Resource;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.plugins.Plugin;
+import com.google.gerrit.server.plugins.ReloadPluginListener;
+import com.google.gerrit.server.plugins.StartPluginListener;
+import com.google.gerrit.util.http.CacheHeaders;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.google.inject.servlet.GuiceFilter;
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicReference;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.eclipse.jgit.lib.Config;
+
+@Singleton
+public class LfsPluginServlet extends HttpServlet
+    implements StartPluginListener, ReloadPluginListener {
+  private static final long serialVersionUID = 1L;
+
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final String MESSAGE_LFS_NOT_CONFIGURED =
+      "{\"message\":\"No LFS plugin is configured to handle LFS requests.\"}";
+
+  private List<Plugin> pending = new ArrayList<>();
+  private final String pluginName;
+  private final FilterChain chain;
+  private AtomicReference<GuiceFilter> filter;
+
+  @Inject
+  LfsPluginServlet(@GerritServerConfig Config cfg) {
+    this.pluginName = cfg.getString("lfs", null, "plugin");
+    this.chain =
+        new FilterChain() {
+          @Override
+          public void doFilter(ServletRequest req, ServletResponse res) throws IOException {
+            Resource.NOT_FOUND.send((HttpServletRequest) req, (HttpServletResponse) res);
+          }
+        };
+    this.filter = new AtomicReference<>();
+  }
+
+  @Override
+  protected void service(HttpServletRequest req, HttpServletResponse res)
+      throws ServletException, IOException {
+    if (filter.get() == null) {
+      responseLfsNotConfigured(res);
+      return;
+    }
+    filter.get().doFilter(req, res, chain);
+  }
+
+  @Override
+  public synchronized void init(ServletConfig config) throws ServletException {
+    super.init(config);
+
+    for (Plugin plugin : pending) {
+      install(plugin);
+    }
+    pending = null;
+  }
+
+  @Override
+  public synchronized void onStartPlugin(Plugin plugin) {
+    if (pending != null) {
+      pending.add(plugin);
+    } else {
+      install(plugin);
+    }
+  }
+
+  @Override
+  public void onReloadPlugin(Plugin oldPlugin, Plugin newPlugin) {
+    install(newPlugin);
+  }
+
+  private void responseLfsNotConfigured(HttpServletResponse res) throws IOException {
+    CacheHeaders.setNotCacheable(res);
+    res.setContentType(CONTENTTYPE_VND_GIT_LFS_JSON);
+    res.setStatus(SC_NOT_IMPLEMENTED);
+    Writer w = new BufferedWriter(new OutputStreamWriter(res.getOutputStream(), UTF_8));
+    w.write(MESSAGE_LFS_NOT_CONFIGURED);
+    w.flush();
+  }
+
+  private void install(Plugin plugin) {
+    if (!plugin.getName().equals(pluginName)) {
+      return;
+    }
+    final GuiceFilter guiceFilter = load(plugin);
+    plugin.add(
+        new RegistrationHandle() {
+          @Override
+          public void remove() {
+            filter.compareAndSet(guiceFilter, null);
+          }
+        });
+    filter.set(guiceFilter);
+  }
+
+  private GuiceFilter load(Plugin plugin) {
+    if (plugin.getHttpInjector() != null) {
+      final String name = plugin.getName();
+      final GuiceFilter guiceFilter;
+      try {
+        guiceFilter = plugin.getHttpInjector().getInstance(GuiceFilter.class);
+      } catch (RuntimeException e) {
+        logger.atWarning().withCause(e).log("Plugin %s cannot load GuiceFilter", name);
+        return null;
+      }
+
+      try {
+        ServletContext ctx = PluginServletContext.create(plugin, "/");
+        guiceFilter.init(new WrappedFilterConfig(ctx));
+      } catch (ServletException e) {
+        logger.atWarning().withCause(e).log("Plugin %s failed to initialize HTTP", name);
+        return null;
+      }
+
+      plugin.add(guiceFilter::destroy);
+      return guiceFilter;
+    }
+    return null;
+  }
+}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/PluginResourceKey.java b/java/com/google/gerrit/httpd/plugins/PluginResourceKey.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/PluginResourceKey.java
rename to java/com/google/gerrit/httpd/plugins/PluginResourceKey.java
diff --git a/java/com/google/gerrit/httpd/plugins/PluginServletContext.java b/java/com/google/gerrit/httpd/plugins/PluginServletContext.java
new file mode 100644
index 0000000..6a8ef32
--- /dev/null
+++ b/java/com/google/gerrit/httpd/plugins/PluginServletContext.java
@@ -0,0 +1,257 @@
+// Copyright (C) 2012 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.google.gerrit.httpd.plugins;
+
+import com.google.common.collect.Maps;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Version;
+import com.google.gerrit.server.plugins.Plugin;
+import java.io.InputStream;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.net.URL;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.Set;
+import java.util.concurrent.ConcurrentMap;
+import javax.servlet.RequestDispatcher;
+import javax.servlet.Servlet;
+import javax.servlet.ServletContext;
+
+class PluginServletContext {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  static ServletContext create(Plugin plugin, String contextPath) {
+    return (ServletContext)
+        Proxy.newProxyInstance(
+            PluginServletContext.class.getClassLoader(),
+            new Class<?>[] {ServletContext.class, API.class},
+            new Handler(plugin, contextPath));
+  }
+
+  private PluginServletContext() {}
+
+  private static class Handler implements InvocationHandler, API {
+    private final Plugin plugin;
+    private final String contextPath;
+    private final ConcurrentMap<String, Object> attributes;
+
+    Handler(Plugin plugin, String contextPath) {
+      this.plugin = plugin;
+      this.contextPath = contextPath;
+      this.attributes = Maps.newConcurrentMap();
+    }
+
+    @Override
+    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+      Method handler;
+      try {
+        handler = API.class.getDeclaredMethod(method.getName(), method.getParameterTypes());
+      } catch (NoSuchMethodException e) {
+        throw new NoSuchMethodError(
+            String.format(
+                "%s does not implement %s", PluginServletContext.class, method.toGenericString()));
+      }
+      return handler.invoke(this, args);
+    }
+
+    @Override
+    public String getContextPath() {
+      return contextPath;
+    }
+
+    @Override
+    public String getInitParameter(String name) {
+      return null;
+    }
+
+    @SuppressWarnings("rawtypes")
+    @Override
+    public Enumeration getInitParameterNames() {
+      return Collections.enumeration(Collections.emptyList());
+    }
+
+    @Override
+    public ServletContext getContext(String name) {
+      return null;
+    }
+
+    @Override
+    public RequestDispatcher getNamedDispatcher(String name) {
+      return null;
+    }
+
+    @Override
+    public RequestDispatcher getRequestDispatcher(String name) {
+      return null;
+    }
+
+    @Override
+    public URL getResource(String name) {
+      return null;
+    }
+
+    @Override
+    public InputStream getResourceAsStream(String name) {
+      return null;
+    }
+
+    @SuppressWarnings("rawtypes")
+    @Override
+    public Set getResourcePaths(String name) {
+      return null;
+    }
+
+    @Override
+    public Servlet getServlet(String name) {
+      return null;
+    }
+
+    @Override
+    public String getRealPath(String name) {
+      return null;
+    }
+
+    @Override
+    public String getServletContextName() {
+      return plugin.getName();
+    }
+
+    @SuppressWarnings("rawtypes")
+    @Override
+    public Enumeration getServletNames() {
+      return Collections.enumeration(Collections.emptyList());
+    }
+
+    @SuppressWarnings("rawtypes")
+    @Override
+    public Enumeration getServlets() {
+      return Collections.enumeration(Collections.emptyList());
+    }
+
+    @Override
+    public void log(Exception reason, String msg) {
+      log(msg, reason);
+    }
+
+    @Override
+    public void log(String msg) {
+      log(msg, null);
+    }
+
+    @Override
+    public void log(String msg, Throwable reason) {
+      logger.atWarning().withCause(reason).log("[plugin %s] %s", plugin.getName(), msg);
+    }
+
+    @Override
+    public Object getAttribute(String name) {
+      return attributes.get(name);
+    }
+
+    @Override
+    public Enumeration<String> getAttributeNames() {
+      return Collections.enumeration(attributes.keySet());
+    }
+
+    @Override
+    public void setAttribute(String name, Object value) {
+      attributes.put(name, value);
+    }
+
+    @Override
+    public void removeAttribute(String name) {
+      attributes.remove(name);
+    }
+
+    @Override
+    public String getMimeType(String file) {
+      return null;
+    }
+
+    @Override
+    public int getMajorVersion() {
+      return 2;
+    }
+
+    @Override
+    public int getMinorVersion() {
+      return 5;
+    }
+
+    @Override
+    public String getServerInfo() {
+      String v = Version.getVersion();
+      return "Gerrit Code Review/" + (v != null ? v : "dev");
+    }
+  }
+
+  interface API {
+    String getContextPath();
+
+    String getInitParameter(String name);
+
+    @SuppressWarnings("rawtypes")
+    Enumeration getInitParameterNames();
+
+    ServletContext getContext(String name);
+
+    RequestDispatcher getNamedDispatcher(String name);
+
+    RequestDispatcher getRequestDispatcher(String name);
+
+    URL getResource(String name);
+
+    InputStream getResourceAsStream(String name);
+
+    @SuppressWarnings("rawtypes")
+    Set getResourcePaths(String name);
+
+    Servlet getServlet(String name);
+
+    String getRealPath(String name);
+
+    String getServletContextName();
+
+    @SuppressWarnings("rawtypes")
+    Enumeration getServletNames();
+
+    @SuppressWarnings("rawtypes")
+    Enumeration getServlets();
+
+    void log(Exception reason, String msg);
+
+    void log(String msg);
+
+    void log(String msg, Throwable reason);
+
+    Object getAttribute(String name);
+
+    Enumeration<String> getAttributeNames();
+
+    void setAttribute(String name, Object value);
+
+    void removeAttribute(String name);
+
+    String getMimeType(String file);
+
+    int getMajorVersion();
+
+    int getMinorVersion();
+
+    String getServerInfo();
+  }
+}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/WrappedFilterConfig.java b/java/com/google/gerrit/httpd/plugins/WrappedFilterConfig.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/WrappedFilterConfig.java
rename to java/com/google/gerrit/httpd/plugins/WrappedFilterConfig.java
diff --git a/java/com/google/gerrit/httpd/raw/BazelBuild.java b/java/com/google/gerrit/httpd/raw/BazelBuild.java
new file mode 100644
index 0000000..430f0b5
--- /dev/null
+++ b/java/com/google/gerrit/httpd/raw/BazelBuild.java
@@ -0,0 +1,164 @@
+// 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.
+
+package com.google.gerrit.httpd.raw;
+
+import static com.google.common.base.MoreObjects.firstNonNull;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.base.Joiner;
+import com.google.common.escape.Escaper;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.html.HtmlEscapers;
+import com.google.common.io.ByteStreams;
+import com.google.gerrit.launcher.GerritLauncher;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.util.http.CacheHeaders;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InterruptedIOException;
+import java.io.PrintWriter;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+import javax.servlet.http.HttpServletResponse;
+import org.eclipse.jgit.util.RawParseUtils;
+
+public class BazelBuild {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final Path sourceRoot;
+
+  public BazelBuild(Path sourceRoot) {
+    this.sourceRoot = sourceRoot;
+  }
+
+  // builds the given label.
+  public void build(Label label) throws IOException, BuildFailureException {
+    ProcessBuilder proc = newBuildProcess(label);
+    proc.directory(sourceRoot.toFile()).redirectErrorStream(true);
+    logger.atInfo().log("building %s", label.fullName());
+    long start = TimeUtil.nowMs();
+    Process rebuild = proc.start();
+    byte[] out;
+    try (InputStream in = rebuild.getInputStream()) {
+      out = ByteStreams.toByteArray(in);
+    } finally {
+      rebuild.getOutputStream().close();
+    }
+
+    int status;
+    try {
+      status = rebuild.waitFor();
+    } catch (InterruptedException e) {
+      throw new InterruptedIOException(
+          "interrupted waiting for: " + Joiner.on(' ').join(proc.command()));
+    }
+    if (status != 0) {
+      logger.atWarning().log("build failed: %s", new String(out, UTF_8));
+      throw new BuildFailureException(out);
+    }
+
+    long time = TimeUtil.nowMs() - start;
+    logger.atInfo().log("UPDATED    %s in %.3fs", label.fullName(), time / 1000.0);
+  }
+
+  // Represents a label in bazel.
+  static class Label {
+    protected final String pkg;
+    protected final String name;
+
+    public String fullName() {
+      return "//" + pkg + ":" + name;
+    }
+
+    @Override
+    public String toString() {
+      return fullName();
+    }
+
+    // Label in Bazel style.
+    Label(String pkg, String name) {
+      this.name = name;
+      this.pkg = pkg;
+    }
+  }
+
+  static class BuildFailureException extends Exception {
+    private static final long serialVersionUID = 1L;
+
+    final byte[] why;
+
+    BuildFailureException(byte[] why) {
+      this.why = why;
+    }
+
+    public void display(String rule, HttpServletResponse res) throws IOException {
+      res.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+      res.setContentType("text/html");
+      res.setCharacterEncoding(UTF_8.name());
+      CacheHeaders.setNotCacheable(res);
+
+      Escaper html = HtmlEscapers.htmlEscaper();
+      try (PrintWriter w = res.getWriter()) {
+        w.write("<html><title>BUILD FAILED</title><body>");
+        w.format("<h1>%s FAILED</h1>", html.escape(rule));
+        w.write("<pre>");
+        w.write(html.escape(RawParseUtils.decode(why)));
+        w.write("</pre>");
+        w.write("</body></html>");
+      }
+    }
+  }
+
+  private ProcessBuilder newBuildProcess(Label label) throws IOException {
+    Properties properties = GerritLauncher.loadBuildProperties(sourceRoot.resolve(".bazel_path"));
+    String bazel = firstNonNull(properties.getProperty("bazel"), "bazel");
+    List<String> cmd = new ArrayList<>();
+    cmd.add(bazel);
+    cmd.add("build");
+    if (GerritLauncher.isJdk9OrLater()) {
+      String v = GerritLauncher.getJdkVersionPostJdk8();
+      cmd.add("--host_java_toolchain=@bazel_tools//tools/jdk:toolchain_java" + v);
+      cmd.add("--java_toolchain=@bazel_tools//tools/jdk:toolchain_java" + v);
+    }
+    cmd.add(label.fullName());
+    ProcessBuilder proc = new ProcessBuilder(cmd);
+    if (properties.containsKey("PATH")) {
+      proc.environment().put("PATH", properties.getProperty("PATH"));
+    }
+    return proc;
+  }
+
+  /** returns the root relative path to the artifact for the given label */
+  public Path targetPath(Label l) {
+    return sourceRoot.resolve("bazel-bin").resolve(l.pkg).resolve(l.name);
+  }
+
+  /** Label for the agent specific GWT zip. */
+  public Label gwtZipLabel(String agent) {
+    return new Label("gerrit-gwtui", "ui_" + agent + ".zip");
+  }
+
+  /** Label for the polygerrit component zip. */
+  public Label polygerritComponents() {
+    return new Label("polygerrit-ui", "polygerrit_components.bower_components.zip");
+  }
+
+  /** Label for the fonts zip file. */
+  public Label fontZipLabel() {
+    return new Label("polygerrit-ui", "fonts.zip");
+  }
+}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/BowerComponentsDevServlet.java b/java/com/google/gerrit/httpd/raw/BowerComponentsDevServlet.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/BowerComponentsDevServlet.java
rename to java/com/google/gerrit/httpd/raw/BowerComponentsDevServlet.java
diff --git a/java/com/google/gerrit/httpd/raw/CatServlet.java b/java/com/google/gerrit/httpd/raw/CatServlet.java
new file mode 100644
index 0000000..70ae3ae
--- /dev/null
+++ b/java/com/google/gerrit/httpd/raw/CatServlet.java
@@ -0,0 +1,170 @@
+// Copyright (C) 2009 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.google.gerrit.httpd.raw;
+
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.Url;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.edit.ChangeEdit;
+import com.google.gerrit.server.edit.ChangeEditUtil;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Optional;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.eclipse.jgit.lib.ObjectId;
+
+/**
+ * Exports a single version of a patch as a normal file download.
+ *
+ * <p>This can be relatively unsafe with Microsoft Internet Explorer 6.0 as the browser will (rather
+ * incorrectly) treat an HTML or JavaScript file its supposed to download as though it was served by
+ * this site, and will execute it with the site's own protection domain. This opens a massive
+ * security hole so we package the content into a zip file.
+ */
+@Singleton
+public class CatServlet extends HttpServlet {
+  private static final long serialVersionUID = 1L;
+
+  private final Provider<ReviewDb> requestDb;
+  private final ChangeEditUtil changeEditUtil;
+  private final PatchSetUtil psUtil;
+  private final ChangeNotes.Factory changeNotesFactory;
+  private final PermissionBackend permissionBackend;
+  private final ProjectCache projectCache;
+
+  @Inject
+  CatServlet(
+      Provider<ReviewDb> sf,
+      ChangeEditUtil ceu,
+      PatchSetUtil psu,
+      ChangeNotes.Factory cnf,
+      PermissionBackend pb,
+      ProjectCache pc) {
+    requestDb = sf;
+    changeEditUtil = ceu;
+    psUtil = psu;
+    changeNotesFactory = cnf;
+    permissionBackend = pb;
+    projectCache = pc;
+  }
+
+  @Override
+  protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
+    String keyStr = req.getPathInfo();
+
+    // We shouldn't have to do this extra decode pass, but somehow we
+    // are now receiving our "^1" suffix as "%5E1", which confuses us
+    // downstream. Other times we get our embedded "," as "%2C", which
+    // is equally bad. And yet when these happen a "%2F" is left as-is,
+    // rather than escaped as "%252F", which makes me feel really really
+    // uncomfortable with a blind decode right here.
+    //
+    keyStr = Url.decode(keyStr);
+
+    if (!keyStr.startsWith("/")) {
+      rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
+      return;
+    }
+    keyStr = keyStr.substring(1);
+
+    final Patch.Key patchKey;
+    final int side;
+    {
+      final int c = keyStr.lastIndexOf('^');
+      if (c == 0) {
+        rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
+        return;
+      }
+
+      if (c < 0) {
+        side = 0;
+      } else {
+        try {
+          side = Integer.parseInt(keyStr.substring(c + 1));
+          keyStr = keyStr.substring(0, c);
+        } catch (NumberFormatException e) {
+          rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
+          return;
+        }
+      }
+
+      try {
+        patchKey = Patch.Key.parse(keyStr);
+      } catch (NumberFormatException e) {
+        rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
+        return;
+      }
+    }
+
+    final Change.Id changeId = patchKey.getParentKey().getParentKey();
+    String revision;
+    try {
+      ChangeNotes notes = changeNotesFactory.createChecked(changeId);
+      permissionBackend
+          .currentUser()
+          .change(notes)
+          .database(requestDb)
+          .check(ChangePermission.READ);
+      projectCache.checkedGet(notes.getProjectName()).checkStatePermitsRead();
+      if (patchKey.getParentKey().get() == 0) {
+        // change edit
+        Optional<ChangeEdit> edit = changeEditUtil.byChange(notes);
+        if (edit.isPresent()) {
+          revision = ObjectId.toString(edit.get().getEditCommit());
+        } else {
+          rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
+          return;
+        }
+      } else {
+        PatchSet patchSet = psUtil.get(requestDb.get(), notes, patchKey.getParentKey());
+        if (patchSet == null) {
+          rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
+          return;
+        }
+        revision = patchSet.getRevision().get();
+      }
+    } catch (ResourceConflictException | NoSuchChangeException | AuthException e) {
+      rsp.sendError(HttpServletResponse.SC_NOT_FOUND);
+      return;
+    } catch (OrmException | PermissionBackendException | IOException e) {
+      getServletContext().log("Cannot query database", e);
+      rsp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+      return;
+    }
+
+    String path = patchKey.getFileName();
+    String restUrl =
+        String.format(
+            "%s/changes/%d/revisions/%s/files/%s/download?parent=%d",
+            req.getContextPath(), changeId.get(), revision, Url.encode(path), side);
+    rsp.sendRedirect(restUrl);
+  }
+}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/DirectoryDocServlet.java b/java/com/google/gerrit/httpd/raw/DirectoryDocServlet.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/DirectoryDocServlet.java
rename to java/com/google/gerrit/httpd/raw/DirectoryDocServlet.java
diff --git a/java/com/google/gerrit/httpd/raw/DirectoryGwtUiServlet.java b/java/com/google/gerrit/httpd/raw/DirectoryGwtUiServlet.java
new file mode 100644
index 0000000..8ac1601
--- /dev/null
+++ b/java/com/google/gerrit/httpd/raw/DirectoryGwtUiServlet.java
@@ -0,0 +1,54 @@
+// Copyright (C) 2015 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.google.gerrit.httpd.raw;
+
+import com.google.common.cache.Cache;
+import com.google.gerrit.server.util.time.TimeUtil;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.attribute.FileTime;
+
+class DirectoryGwtUiServlet extends ResourceServlet {
+  private static final long serialVersionUID = 1L;
+
+  private static final FileTime NOW = FileTime.fromMillis(TimeUtil.nowMs());
+
+  private final Path ui;
+
+  DirectoryGwtUiServlet(Cache<Path, Resource> cache, Path unpackedWar, boolean dev)
+      throws IOException {
+    super(cache, false);
+    ui = unpackedWar.resolve("gerrit_ui");
+    if (!Files.exists(ui)) {
+      Files.createDirectory(ui);
+    }
+    if (dev) {
+      ui.toFile().deleteOnExit();
+    }
+  }
+
+  @Override
+  protected Path getResourcePath(String pathInfo) {
+    return ui.resolve(pathInfo);
+  }
+
+  @Override
+  protected FileTime getLastModifiedTime(Path p) {
+    // Return initialization time of this class, since the GWT outputs from the
+    // build process all have mtimes of 1980/1/1.
+    return NOW;
+  }
+}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/FontsDevServlet.java b/java/com/google/gerrit/httpd/raw/FontsDevServlet.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/FontsDevServlet.java
rename to java/com/google/gerrit/httpd/raw/FontsDevServlet.java
diff --git a/java/com/google/gerrit/httpd/raw/HostPageServlet.java b/java/com/google/gerrit/httpd/raw/HostPageServlet.java
new file mode 100644
index 0000000..b593723
--- /dev/null
+++ b/java/com/google/gerrit/httpd/raw/HostPageServlet.java
@@ -0,0 +1,411 @@
+// Copyright (C) 2008 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.google.gerrit.httpd.raw;
+
+import static com.google.gerrit.common.FileUtil.lastModified;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.hash.Hasher;
+import com.google.common.hash.Hashing;
+import com.google.common.primitives.Bytes;
+import com.google.gerrit.common.Version;
+import com.google.gerrit.common.data.HostPageData;
+import com.google.gerrit.extensions.client.DiffPreferencesInfo;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.systemstatus.MessageOfTheDay;
+import com.google.gerrit.extensions.webui.WebUiPlugin;
+import com.google.gerrit.httpd.HtmlDomUtil;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.config.ConfigUtil;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.restapi.account.GetDiffPreferences;
+import com.google.gerrit.util.http.CacheHeaders;
+import com.google.gwtjsonrpc.server.JsonServlet;
+import com.google.gwtjsonrpc.server.RPCServletUtils;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.StringWriter;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Config;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/** Sends the Gerrit host page to clients. */
+@Singleton
+public class HostPageServlet extends HttpServlet {
+  private static final long serialVersionUID = 1L;
+
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final String HPD_ID = "gerrit_hostpagedata";
+  private static final int DEFAULT_JS_LOAD_TIMEOUT = 5000;
+
+  private final Provider<CurrentUser> currentUser;
+  private final DynamicSet<WebUiPlugin> plugins;
+  private final DynamicSet<MessageOfTheDay> messages;
+  private final HostPageData.Theme signedOutTheme;
+  private final HostPageData.Theme signedInTheme;
+  private final SitePaths site;
+  private final Document template;
+  private final String noCacheName;
+  private final boolean refreshHeaderFooter;
+  private final SiteStaticDirectoryServlet staticServlet;
+  private final boolean isNoteDbEnabled;
+  private final Integer pluginsLoadTimeout;
+  private final boolean canLoadInIFrame;
+  private final GetDiffPreferences getDiff;
+  private volatile Page page;
+
+  @Inject
+  HostPageServlet(
+      Provider<CurrentUser> cu,
+      SitePaths sp,
+      ThemeFactory themeFactory,
+      ServletContext servletContext,
+      DynamicSet<WebUiPlugin> webUiPlugins,
+      DynamicSet<MessageOfTheDay> motd,
+      @GerritServerConfig Config cfg,
+      SiteStaticDirectoryServlet ss,
+      NotesMigration migration,
+      GetDiffPreferences diffPref)
+      throws IOException, ServletException {
+    currentUser = cu;
+    plugins = webUiPlugins;
+    messages = motd;
+    signedOutTheme = themeFactory.getSignedOutTheme();
+    signedInTheme = themeFactory.getSignedInTheme();
+    site = sp;
+    refreshHeaderFooter = cfg.getBoolean("site", "refreshHeaderFooter", true);
+    staticServlet = ss;
+    isNoteDbEnabled = migration.readChanges();
+    pluginsLoadTimeout = getPluginsLoadTimeout(cfg);
+    canLoadInIFrame = cfg.getBoolean("gerrit", "canLoadInIFrame", false);
+    getDiff = diffPref;
+
+    String pageName = "HostPage.html";
+    template = HtmlDomUtil.parseFile(getClass(), pageName);
+    if (template == null) {
+      throw new FileNotFoundException("No " + pageName + " in webapp");
+    }
+
+    if (HtmlDomUtil.find(template, "gerrit_module") == null) {
+      throw new ServletException("No gerrit_module in " + pageName);
+    }
+    if (HtmlDomUtil.find(template, HPD_ID) == null) {
+      throw new ServletException("No " + HPD_ID + " in " + pageName);
+    }
+
+    String src = "gerrit_ui/gerrit_ui.nocache.js";
+    try (InputStream in = servletContext.getResourceAsStream("/" + src)) {
+      if (in != null) {
+        Hasher md = Hashing.murmur3_128().newHasher();
+        byte[] buf = new byte[1024];
+        int n;
+        while ((n = in.read(buf)) > 0) {
+          md.putBytes(buf, 0, n);
+        }
+        src += "?content=" + md.hash().toString();
+      } else {
+        logger.atFine().log("No %s in webapp root; keeping noncache.js URL", src);
+      }
+    } catch (IOException e) {
+      throw new IOException("Failed reading " + src, e);
+    }
+
+    noCacheName = src;
+    page = new Page();
+  }
+
+  private static int getPluginsLoadTimeout(Config cfg) {
+    long cfgValue =
+        ConfigUtil.getTimeUnit(
+            cfg, "plugins", null, "jsLoadTimeout", DEFAULT_JS_LOAD_TIMEOUT, TimeUnit.MILLISECONDS);
+    if (cfgValue < 0) {
+      return 0;
+    }
+    return (int) cfgValue;
+  }
+
+  private void json(Object data, StringWriter w) {
+    JsonServlet.defaultGsonBuilder().create().toJson(data, w);
+  }
+
+  private Page get() {
+    Page p = page;
+    try {
+      if (refreshHeaderFooter && p.isStale()) {
+        p = new Page();
+        page = p;
+      }
+    } catch (IOException e) {
+      logger.atSevere().withCause(e).log("Cannot refresh site header/footer");
+    }
+    return p;
+  }
+
+  @Override
+  protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
+    Page.Content page = select(req);
+    StringWriter w = new StringWriter();
+    CurrentUser user = currentUser.get();
+    if (user.isIdentifiedUser()) {
+      w.write(HPD_ID + ".accountDiffPref=");
+      json(getDiffPreferences(user.asIdentifiedUser()), w);
+      w.write(";");
+
+      w.write(HPD_ID + ".theme=");
+      json(signedInTheme, w);
+      w.write(";");
+    } else {
+      w.write(HPD_ID + ".theme=");
+      json(signedOutTheme, w);
+      w.write(";");
+    }
+    plugins(w);
+    messages(w);
+
+    byte[] hpd = w.toString().getBytes(UTF_8);
+    byte[] raw = Bytes.concat(page.part1, hpd, page.part2);
+    byte[] tosend;
+    if (RPCServletUtils.acceptsGzipEncoding(req)) {
+      rsp.setHeader("Content-Encoding", "gzip");
+      tosend = HtmlDomUtil.compress(raw);
+    } else {
+      tosend = raw;
+    }
+
+    CacheHeaders.setNotCacheable(rsp);
+    rsp.setContentType("text/html");
+    rsp.setCharacterEncoding(HtmlDomUtil.ENC.name());
+    rsp.setContentLength(tosend.length);
+    try (OutputStream out = rsp.getOutputStream()) {
+      out.write(tosend);
+    }
+  }
+
+  private DiffPreferencesInfo getDiffPreferences(IdentifiedUser user) {
+    try {
+      return getDiff.apply(new AccountResource(user));
+    } catch (RestApiException
+        | ConfigInvalidException
+        | IOException
+        | PermissionBackendException e) {
+      logger.atWarning().withCause(e).log("Cannot query account diff preferences");
+    }
+    return DiffPreferencesInfo.defaults();
+  }
+
+  private void plugins(StringWriter w) {
+    List<String> urls = new ArrayList<>();
+    for (WebUiPlugin u : plugins) {
+      urls.add(String.format("plugins/%s/%s", u.getPluginName(), u.getJavaScriptResourcePath()));
+    }
+    if (!urls.isEmpty()) {
+      w.write(HPD_ID + ".plugins=");
+      json(urls, w);
+      w.write(";");
+    }
+  }
+
+  private void messages(StringWriter w) {
+    List<HostPageData.Message> list = new ArrayList<>(2);
+    for (MessageOfTheDay motd : messages) {
+      String html = motd.getHtmlMessage();
+      if (!Strings.isNullOrEmpty(html)) {
+        HostPageData.Message m = new HostPageData.Message();
+        m.id = motd.getMessageId();
+        m.redisplay = motd.getRedisplay();
+        m.html = html;
+        list.add(m);
+      }
+    }
+    if (!list.isEmpty()) {
+      w.write(HPD_ID + ".messages=");
+      json(list, w);
+      w.write(";");
+    }
+  }
+
+  private Page.Content select(HttpServletRequest req) {
+    Page pg = get();
+    if ("1".equals(req.getParameter("dbg"))) {
+      return pg.debug;
+    }
+    return pg.opt;
+  }
+
+  private void insertETags(Element e) {
+    if ("img".equalsIgnoreCase(e.getTagName()) || "script".equalsIgnoreCase(e.getTagName())) {
+      String src = e.getAttribute("src");
+      if (src != null && src.startsWith("static/")) {
+        String name = src.substring("static/".length());
+        ResourceServlet.Resource r = staticServlet.getResource(name);
+        if (r != null) {
+          e.setAttribute("src", src + "?e=" + r.etag);
+        }
+      }
+    }
+
+    for (Node n = e.getFirstChild(); n != null; n = n.getNextSibling()) {
+      if (n instanceof Element) {
+        insertETags((Element) n);
+      }
+    }
+  }
+
+  private static class FileInfo {
+    private final Path path;
+    private final long time;
+
+    FileInfo(Path p) {
+      path = p;
+      time = lastModified(path);
+    }
+
+    boolean isStale() {
+      return time != lastModified(path);
+    }
+  }
+
+  private class Page {
+    private final FileInfo css;
+    private final FileInfo header;
+    private final FileInfo footer;
+    private final Content opt;
+    private final Content debug;
+
+    Page() throws IOException {
+      Document hostDoc = HtmlDomUtil.clone(template);
+
+      css = injectCssFile(hostDoc, "gerrit_sitecss", site.site_css);
+      header = injectXmlFile(hostDoc, "gerrit_header", site.site_header);
+      footer = injectXmlFile(hostDoc, "gerrit_footer", site.site_footer);
+
+      HostPageData pageData = new HostPageData();
+      pageData.version = Version.getVersion();
+      pageData.isNoteDbEnabled = isNoteDbEnabled;
+      pageData.pluginsLoadTimeout = pluginsLoadTimeout;
+      pageData.canLoadInIFrame = canLoadInIFrame;
+
+      StringWriter w = new StringWriter();
+      w.write("var " + HPD_ID + "=");
+      json(pageData, w);
+      w.write(";");
+
+      Element data = HtmlDomUtil.find(hostDoc, HPD_ID);
+      asScript(data);
+      data.appendChild(hostDoc.createTextNode(w.toString()));
+      data.appendChild(hostDoc.createComment(HPD_ID));
+
+      Element nocache = HtmlDomUtil.find(hostDoc, "gerrit_module");
+      asScript(nocache);
+      nocache.removeAttribute("id");
+      nocache.setAttribute("src", noCacheName);
+      opt = new Content(hostDoc);
+
+      nocache.setAttribute("src", "gerrit_ui/dbg_gerrit_ui.nocache.js");
+      debug = new Content(hostDoc);
+    }
+
+    boolean isStale() {
+      return css.isStale() || header.isStale() || footer.isStale();
+    }
+
+    private void asScript(Element scriptNode) {
+      scriptNode.setAttribute("type", "text/javascript");
+      scriptNode.setAttribute("language", "javascript");
+    }
+
+    class Content {
+      final byte[] part1;
+      final byte[] part2;
+
+      Content(Document hostDoc) throws IOException {
+        String raw = HtmlDomUtil.toString(hostDoc);
+        int p = raw.indexOf("<!--" + HPD_ID);
+        if (p < 0) {
+          throw new IOException("No tag in transformed host page HTML");
+        }
+        part1 = raw.substring(0, p).getBytes(UTF_8);
+        part2 = raw.substring(raw.indexOf('>', p) + 1).getBytes(UTF_8);
+      }
+    }
+
+    private FileInfo injectCssFile(Document hostDoc, String id, Path src) throws IOException {
+      FileInfo info = new FileInfo(src);
+      Element banner = HtmlDomUtil.find(hostDoc, id);
+      if (banner == null) {
+        return info;
+      }
+
+      while (banner.getFirstChild() != null) {
+        banner.removeChild(banner.getFirstChild());
+      }
+
+      String css = HtmlDomUtil.readFile(src.getParent(), src.getFileName().toString());
+      if (css == null) {
+        return info;
+      }
+
+      banner.appendChild(hostDoc.createCDATASection("\n" + css + "\n"));
+      return info;
+    }
+
+    private FileInfo injectXmlFile(Document hostDoc, String id, Path src) throws IOException {
+      FileInfo info = new FileInfo(src);
+      Element banner = HtmlDomUtil.find(hostDoc, id);
+      if (banner == null) {
+        return info;
+      }
+
+      while (banner.getFirstChild() != null) {
+        banner.removeChild(banner.getFirstChild());
+      }
+
+      Document html = HtmlDomUtil.parseFile(src);
+      if (html == null) {
+        return info;
+      }
+
+      Element content = html.getDocumentElement();
+      insertETags(content);
+      banner.appendChild(hostDoc.importNode(content, true));
+      return info;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/httpd/raw/IndexServlet.java b/java/com/google/gerrit/httpd/raw/IndexServlet.java
new file mode 100644
index 0000000..a414e84
--- /dev/null
+++ b/java/com/google/gerrit/httpd/raw/IndexServlet.java
@@ -0,0 +1,99 @@
+// Copyright (C) 2017 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.google.gerrit.httpd.raw;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static javax.servlet.http.HttpServletResponse.SC_OK;
+
+import com.google.common.base.Strings;
+import com.google.common.io.Resources;
+import com.google.gerrit.common.Nullable;
+import com.google.template.soy.SoyFileSet;
+import com.google.template.soy.data.SanitizedContent;
+import com.google.template.soy.data.SoyMapData;
+import com.google.template.soy.data.UnsafeSanitizedContentOrdainer;
+import com.google.template.soy.tofu.SoyTofu;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public class IndexServlet extends HttpServlet {
+  private static final long serialVersionUID = 1L;
+  protected final byte[] indexSource;
+
+  IndexServlet(
+      @Nullable String canonicalURL, @Nullable String cdnPath, @Nullable String faviconPath)
+      throws URISyntaxException {
+    String resourcePath = "com/google/gerrit/httpd/raw/PolyGerritIndexHtml.soy";
+    SoyFileSet.Builder builder = SoyFileSet.builder();
+    builder.add(Resources.getResource(resourcePath));
+    SoyTofu.Renderer renderer =
+        builder
+            .build()
+            .compileToTofu()
+            .newRenderer("com.google.gerrit.httpd.raw.Index")
+            .setContentKind(SanitizedContent.ContentKind.HTML)
+            .setData(getTemplateData(canonicalURL, cdnPath, faviconPath));
+    indexSource = renderer.render().getBytes(UTF_8);
+  }
+
+  @Override
+  protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
+    rsp.setCharacterEncoding(UTF_8.name());
+    rsp.setContentType("text/html");
+    rsp.setStatus(SC_OK);
+    try (OutputStream w = rsp.getOutputStream()) {
+      w.write(indexSource);
+    }
+  }
+
+  static String computeCanonicalPath(@Nullable String canonicalURL) throws URISyntaxException {
+    if (Strings.isNullOrEmpty(canonicalURL)) {
+      return "";
+    }
+
+    // If we serving from a sub-directory rather than root, determine the path
+    // from the cannonical web URL.
+    URI uri = new URI(canonicalURL);
+    return uri.getPath().replaceAll("/$", "");
+  }
+
+  static SoyMapData getTemplateData(String canonicalURL, String cdnPath, String faviconPath)
+      throws URISyntaxException {
+    String canonicalPath = computeCanonicalPath(canonicalURL);
+
+    String staticPath = "";
+    if (cdnPath != null) {
+      staticPath = cdnPath;
+    } else if (canonicalPath != null) {
+      staticPath = canonicalPath;
+    }
+
+    // The resource path must be typed as safe for use in a script src.
+    // TODO(wyatta): Upgrade this to use an appropriate safe URL type.
+    SanitizedContent sanitizedStaticPath =
+        UnsafeSanitizedContentOrdainer.ordainAsSafe(
+            staticPath, SanitizedContent.ContentKind.TRUSTED_RESOURCE_URI);
+
+    return new SoyMapData(
+        "canonicalPath", canonicalPath,
+        "staticResourcePath", sanitizedStaticPath,
+        "faviconPath", faviconPath);
+  }
+}
diff --git a/java/com/google/gerrit/httpd/raw/LegacyGerritServlet.java b/java/com/google/gerrit/httpd/raw/LegacyGerritServlet.java
new file mode 100644
index 0000000..7bc56a6
--- /dev/null
+++ b/java/com/google/gerrit/httpd/raw/LegacyGerritServlet.java
@@ -0,0 +1,74 @@
+// Copyright (C) 2009 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.google.gerrit.httpd.raw;
+
+import com.google.gerrit.httpd.HtmlDomUtil;
+import com.google.gerrit.util.http.CacheHeaders;
+import com.google.gwtjsonrpc.server.RPCServletUtils;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.OutputStream;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Redirects from {@code /Gerrit#foo} to {@code /#foo} in JavaScript.
+ *
+ * <p>This redirect exists to convert the older /Gerrit URL into the more modern URL format which
+ * does not use a servlet name for the host page. We cannot do the redirect here in the server side,
+ * as it would lose any history token that appears in the URL. Instead we send an HTML page which
+ * instructs the browser to replace the URL, but preserve the history token.
+ */
+@Singleton
+public class LegacyGerritServlet extends HttpServlet {
+  private static final long serialVersionUID = 1L;
+
+  private final byte[] raw;
+  private final byte[] compressed;
+
+  @Inject
+  LegacyGerritServlet() throws IOException {
+    final String pageName = "LegacyGerrit.html";
+    final String doc = HtmlDomUtil.readFile(getClass(), pageName);
+    if (doc == null) {
+      throw new FileNotFoundException("No " + pageName + " in webapp");
+    }
+
+    raw = doc.getBytes(HtmlDomUtil.ENC);
+    compressed = HtmlDomUtil.compress(raw);
+  }
+
+  @Override
+  protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
+    final byte[] tosend;
+    if (RPCServletUtils.acceptsGzipEncoding(req)) {
+      rsp.setHeader("Content-Encoding", "gzip");
+      tosend = compressed;
+    } else {
+      tosend = raw;
+    }
+
+    CacheHeaders.setNotCacheable(rsp);
+    rsp.setContentType("text/html");
+    rsp.setCharacterEncoding(HtmlDomUtil.ENC.name());
+    rsp.setContentLength(tosend.length);
+    try (OutputStream out = rsp.getOutputStream()) {
+      out.write(tosend);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/httpd/raw/PolyGerritUiServlet.java b/java/com/google/gerrit/httpd/raw/PolyGerritUiServlet.java
new file mode 100644
index 0000000..c7d23de
--- /dev/null
+++ b/java/com/google/gerrit/httpd/raw/PolyGerritUiServlet.java
@@ -0,0 +1,52 @@
+// Copyright (C) 2015 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.google.gerrit.httpd.raw;
+
+import com.google.common.cache.Cache;
+import com.google.gerrit.server.util.time.TimeUtil;
+import java.io.IOException;
+import java.nio.file.FileSystems;
+import java.nio.file.Path;
+import java.nio.file.attribute.FileTime;
+
+class PolyGerritUiServlet extends ResourceServlet {
+  private static final long serialVersionUID = 1L;
+
+  private static final FileTime NOW = FileTime.fromMillis(TimeUtil.nowMs());
+
+  private final Path ui;
+
+  PolyGerritUiServlet(Cache<Path, Resource> cache, Path ui) {
+    super(cache, true);
+    this.ui = ui;
+  }
+
+  @Override
+  protected Path getResourcePath(String pathInfo) {
+    return ui.resolve(pathInfo);
+  }
+
+  @Override
+  protected FileTime getLastModifiedTime(Path p) throws IOException {
+    if (ui.getFileSystem().equals(FileSystems.getDefault())) {
+      // Assets are being served from disk, so we can trust the mtime.
+      return super.getLastModifiedTime(p);
+    }
+    // Assume this FileSystem is serving from a WAR. All WAR outputs from the build process have
+    // mtimes of 1980/1/1, so we can't trust it, and return the initialization time of this class
+    // instead.
+    return NOW;
+  }
+}
diff --git a/java/com/google/gerrit/httpd/raw/RecompileGwtUiFilter.java b/java/com/google/gerrit/httpd/raw/RecompileGwtUiFilter.java
new file mode 100644
index 0000000..c6c3367
--- /dev/null
+++ b/java/com/google/gerrit/httpd/raw/RecompileGwtUiFilter.java
@@ -0,0 +1,126 @@
+// Copyright (C) 2015 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.google.gerrit.httpd.raw;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+class RecompileGwtUiFilter implements Filter {
+  private final boolean gwtuiRecompile =
+      System.getProperty("gerrit.disable-gwtui-recompile") == null;
+  private final UserAgentRule rule = new UserAgentRule();
+  private final Set<String> uaInitialized = new HashSet<>();
+  private final Path unpackedWar;
+  private final BazelBuild builder;
+
+  private String lastAgent;
+  private long lastTime;
+
+  RecompileGwtUiFilter(BazelBuild builder, Path unpackedWar) {
+    this.builder = builder;
+    this.unpackedWar = unpackedWar;
+  }
+
+  @Override
+  public void doFilter(ServletRequest request, ServletResponse res, FilterChain chain)
+      throws IOException, ServletException {
+    String agent = rule.select((HttpServletRequest) request);
+    if (unpackedWar != null && (gwtuiRecompile || !uaInitialized.contains(agent))) {
+      BazelBuild.Label label = builder.gwtZipLabel(agent);
+      File zip = builder.targetPath(label).toFile();
+
+      synchronized (this) {
+        try {
+          builder.build(label);
+        } catch (BazelBuild.BuildFailureException e) {
+          e.display(label.toString(), (HttpServletResponse) res);
+          return;
+        }
+
+        if (!agent.equals(lastAgent) || lastTime != zip.lastModified()) {
+          lastAgent = agent;
+          lastTime = zip.lastModified();
+          unpack(zip, unpackedWar.toFile());
+        }
+      }
+      uaInitialized.add(agent);
+    }
+    chain.doFilter(request, res);
+  }
+
+  @Override
+  public void init(FilterConfig config) {}
+
+  @Override
+  public void destroy() {}
+
+  private static void unpack(File srcwar, File dstwar) throws IOException {
+    try (ZipFile zf = new ZipFile(srcwar)) {
+      final Enumeration<? extends ZipEntry> e = zf.entries();
+      while (e.hasMoreElements()) {
+        final ZipEntry ze = e.nextElement();
+        final String name = ze.getName();
+
+        if (ze.isDirectory()
+            || name.startsWith("WEB-INF/")
+            || name.startsWith("META-INF/")
+            || name.startsWith("com/google/gerrit/launcher/")
+            || name.equals("Main.class")) {
+          continue;
+        }
+
+        final File rawtmp = new File(dstwar, name);
+        mkdir(rawtmp.getParentFile());
+        rawtmp.deleteOnExit();
+
+        try (OutputStream rawout = Files.newOutputStream(rawtmp.toPath());
+            InputStream in = zf.getInputStream(ze)) {
+          final byte[] buf = new byte[4096];
+          int n;
+          while ((n = in.read(buf, 0, buf.length)) > 0) {
+            rawout.write(buf, 0, n);
+          }
+        }
+      }
+    }
+  }
+
+  private static void mkdir(File dir) throws IOException {
+    if (!dir.isDirectory()) {
+      mkdir(dir.getParentFile());
+      if (!dir.mkdir()) {
+        throw new IOException("Cannot mkdir " + dir.getAbsolutePath());
+      }
+      dir.deleteOnExit();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/httpd/raw/ResourceServlet.java b/java/com/google/gerrit/httpd/raw/ResourceServlet.java
new file mode 100644
index 0000000..4b44af4
--- /dev/null
+++ b/java/com/google/gerrit/httpd/raw/ResourceServlet.java
@@ -0,0 +1,335 @@
+// Copyright (C) 2015 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.google.gerrit.httpd.raw;
+
+import static com.google.common.net.HttpHeaders.CONTENT_ENCODING;
+import static com.google.common.net.HttpHeaders.ETAG;
+import static com.google.common.net.HttpHeaders.IF_MODIFIED_SINCE;
+import static com.google.common.net.HttpHeaders.IF_NONE_MATCH;
+import static com.google.common.net.HttpHeaders.LAST_MODIFIED;
+import static java.util.Objects.requireNonNull;
+import static java.util.concurrent.TimeUnit.DAYS;
+import static java.util.concurrent.TimeUnit.MINUTES;
+import static javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
+import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND;
+import static javax.servlet.http.HttpServletResponse.SC_NOT_MODIFIED;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.CharMatcher;
+import com.google.common.cache.Cache;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.hash.Hashing;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.httpd.HtmlDomUtil;
+import com.google.gerrit.server.UsedAt;
+import com.google.gerrit.util.http.CacheHeaders;
+import com.google.gwtjsonrpc.server.RPCServletUtils;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
+import java.nio.file.Path;
+import java.nio.file.attribute.FileTime;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.zip.GZIPOutputStream;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Base class for serving static resources.
+ *
+ * <p>Supports caching, ETags, basic content type detection, and limited gzip compression.
+ */
+public abstract class ResourceServlet extends HttpServlet {
+  private static final long serialVersionUID = 1L;
+
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final int CACHE_FILE_SIZE_LIMIT_BYTES = 100 << 10;
+
+  private static final String JS = "application/x-javascript";
+  private static final ImmutableMap<String, String> MIME_TYPES =
+      ImmutableMap.<String, String>builder()
+          .put("css", "text/css")
+          .put("gif", "image/gif")
+          .put("htm", "text/html")
+          .put("html", "text/html")
+          .put("ico", "image/x-icon")
+          .put("jpeg", "image/jpeg")
+          .put("jpg", "image/jpeg")
+          .put("js", JS)
+          .put("pdf", "application/pdf")
+          .put("png", "image/png")
+          .put("rtf", "text/rtf")
+          .put("svg", "image/svg+xml")
+          .put("text", "text/plain")
+          .put("tif", "image/tiff")
+          .put("tiff", "image/tiff")
+          .put("txt", "text/plain")
+          .put("woff", "font/woff")
+          .put("woff2", "font/woff2")
+          .build();
+
+  protected static String contentType(String name) {
+    int dot = name.lastIndexOf('.');
+    String ext = 0 < dot ? name.substring(dot + 1) : "";
+    String type = MIME_TYPES.get(ext);
+    return type != null ? type : "application/octet-stream";
+  }
+
+  private final Cache<Path, Resource> cache;
+  private final boolean refresh;
+  private final boolean cacheOnClient;
+  private final int cacheFileSizeLimitBytes;
+
+  protected ResourceServlet(Cache<Path, Resource> cache, boolean refresh) {
+    this(cache, refresh, true, CACHE_FILE_SIZE_LIMIT_BYTES);
+  }
+
+  protected ResourceServlet(Cache<Path, Resource> cache, boolean refresh, boolean cacheOnClient) {
+    this(cache, refresh, cacheOnClient, CACHE_FILE_SIZE_LIMIT_BYTES);
+  }
+
+  @VisibleForTesting
+  ResourceServlet(
+      Cache<Path, Resource> cache,
+      boolean refresh,
+      boolean cacheOnClient,
+      int cacheFileSizeLimitBytes) {
+    this.cache = requireNonNull(cache, "cache");
+    this.refresh = refresh;
+    this.cacheOnClient = cacheOnClient;
+    this.cacheFileSizeLimitBytes = cacheFileSizeLimitBytes;
+  }
+
+  /**
+   * Get the resource path on the filesystem that should be served for this request.
+   *
+   * @param pathInfo result of {@link HttpServletRequest#getPathInfo()}.
+   * @return path where static content can be found.
+   * @throws IOException if an error occurred resolving the resource.
+   */
+  protected abstract Path getResourcePath(String pathInfo) throws IOException;
+
+  protected FileTime getLastModifiedTime(Path p) throws IOException {
+    return Files.getLastModifiedTime(p);
+  }
+
+  @Override
+  protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
+    String name;
+    if (req.getPathInfo() == null) {
+      name = "/";
+    } else {
+      name = CharMatcher.is('/').trimFrom(req.getPathInfo());
+    }
+    if (isUnreasonableName(name)) {
+      notFound(rsp);
+      return;
+    }
+    Path p = getResourcePath(name);
+    if (p == null) {
+      notFound(rsp);
+      return;
+    }
+
+    Resource r = cache.getIfPresent(p);
+    try {
+      if (r == null) {
+        if (maybeStream(p, req, rsp)) {
+          return; // Bypass cache for large resource.
+        }
+        r = cache.get(p, newLoader(p));
+      }
+      if (refresh && r.isStale(p, this)) {
+        cache.invalidate(p);
+        r = cache.get(p, newLoader(p));
+      }
+    } catch (ExecutionException e) {
+      logger.atWarning().withCause(e).log("Cannot load static resource %s", req.getPathInfo());
+      CacheHeaders.setNotCacheable(rsp);
+      rsp.setStatus(SC_INTERNAL_SERVER_ERROR);
+      return;
+    }
+    if (r == Resource.NOT_FOUND) {
+      notFound(rsp); // Cached not found response.
+      return;
+    }
+
+    String e = req.getParameter("e");
+    if (e != null && !r.etag.equals(e)) {
+      CacheHeaders.setNotCacheable(rsp);
+      rsp.setStatus(SC_NOT_FOUND);
+      return;
+    } else if (cacheOnClient && r.etag.equals(req.getHeader(IF_NONE_MATCH))) {
+      rsp.setStatus(SC_NOT_MODIFIED);
+      return;
+    }
+
+    byte[] tosend = r.raw;
+    if (!r.contentType.equals(JS) && RPCServletUtils.acceptsGzipEncoding(req)) {
+      byte[] gz = HtmlDomUtil.compress(tosend);
+      if ((gz.length + 24) < tosend.length) {
+        rsp.setHeader(CONTENT_ENCODING, "gzip");
+        tosend = gz;
+      }
+    }
+
+    if (cacheOnClient) {
+      rsp.setHeader(ETAG, r.etag);
+    } else {
+      CacheHeaders.setNotCacheable(rsp);
+    }
+    if (!CacheHeaders.hasCacheHeader(rsp)) {
+      if (e != null && r.etag.equals(e)) {
+        CacheHeaders.setCacheable(req, rsp, 360, DAYS, false);
+      } else {
+        CacheHeaders.setCacheable(req, rsp, 15, MINUTES, refresh);
+      }
+    }
+    rsp.setContentType(r.contentType);
+    rsp.setContentLength(tosend.length);
+    try (OutputStream out = rsp.getOutputStream()) {
+      out.write(tosend);
+    }
+  }
+
+  @Nullable
+  Resource getResource(String name) {
+    try {
+      Path p = getResourcePath(name);
+      if (p == null) {
+        logger.atWarning().log("Path doesn't exist %s", name);
+        return null;
+      }
+      return cache.get(p, newLoader(p));
+    } catch (ExecutionException | IOException e) {
+      logger.atWarning().withCause(e).log("Cannot load static resource %s", name);
+      return null;
+    }
+  }
+
+  private static void notFound(HttpServletResponse rsp) {
+    rsp.setStatus(SC_NOT_FOUND);
+    CacheHeaders.setNotCacheable(rsp);
+  }
+
+  /**
+   * Maybe stream a path to the response, depending on the properties of the file and cache headers
+   * in the request.
+   *
+   * @param p path to stream
+   * @param req HTTP request.
+   * @param rsp HTTP response.
+   * @return true if the response was written (either the file contents or an error); false if the
+   *     path is too small to stream and should be cached.
+   */
+  private boolean maybeStream(Path p, HttpServletRequest req, HttpServletResponse rsp)
+      throws IOException {
+    try {
+      if (Files.size(p) < cacheFileSizeLimitBytes) {
+        return false;
+      }
+    } catch (NoSuchFileException e) {
+      cache.put(p, Resource.NOT_FOUND);
+      notFound(rsp);
+      return true;
+    }
+
+    long lastModified = getLastModifiedTime(p).toMillis();
+    if (req.getDateHeader(IF_MODIFIED_SINCE) >= lastModified) {
+      rsp.setStatus(SC_NOT_MODIFIED);
+      return true;
+    }
+
+    if (lastModified > 0) {
+      rsp.setDateHeader(LAST_MODIFIED, lastModified);
+    }
+    if (!CacheHeaders.hasCacheHeader(rsp)) {
+      CacheHeaders.setCacheable(req, rsp, 15, MINUTES, refresh);
+    }
+    rsp.setContentType(contentType(p.toString()));
+
+    OutputStream out = rsp.getOutputStream();
+    GZIPOutputStream gz = null;
+    if (RPCServletUtils.acceptsGzipEncoding(req)) {
+      rsp.setHeader(CONTENT_ENCODING, "gzip");
+      gz = new GZIPOutputStream(out);
+      out = gz;
+    }
+    Files.copy(p, out);
+    if (gz != null) {
+      gz.finish();
+    }
+    return true;
+  }
+
+  private static boolean isUnreasonableName(String name) {
+    return name.length() < 1
+        || name.contains("\\") // no windows/dos style paths
+        || name.startsWith("../") // no "../etc/passwd"
+        || name.contains("/../") // no "foo/../etc/passwd"
+        || name.contains("/./") // "foo/./foo" is insane to ask
+        || name.contains("//"); // windows UNC path can be "//..."
+  }
+
+  private Callable<Resource> newLoader(Path p) {
+    return () -> {
+      try {
+        return new Resource(
+            getLastModifiedTime(p), contentType(p.toString()), Files.readAllBytes(p));
+      } catch (NoSuchFileException e) {
+        return Resource.NOT_FOUND;
+      }
+    };
+  }
+
+  public static class Resource {
+    static final Resource NOT_FOUND = new Resource(FileTime.fromMillis(0), "", new byte[] {});
+
+    final FileTime lastModified;
+    final String contentType;
+    final String etag;
+    final byte[] raw;
+
+    Resource(FileTime lastModified, String contentType, byte[] raw) {
+      this.lastModified = requireNonNull(lastModified, "lastModified");
+      this.contentType = requireNonNull(contentType, "contentType");
+      this.raw = requireNonNull(raw, "raw");
+      this.etag = Hashing.murmur3_128().hashBytes(raw).toString();
+    }
+
+    boolean isStale(Path p, ResourceServlet rs) throws IOException {
+      FileTime t;
+      try {
+        t = rs.getLastModifiedTime(p);
+      } catch (NoSuchFileException e) {
+        return this != NOT_FOUND;
+      }
+      return t.toMillis() == 0 || lastModified.toMillis() == 0 || !lastModified.equals(t);
+    }
+  }
+
+  @UsedAt(UsedAt.Project.GOOGLE)
+  public static class Weigher implements com.google.common.cache.Weigher<Path, Resource> {
+    @Override
+    public int weigh(Path p, Resource r) {
+      return 2 * p.toString().length() + r.raw.length;
+    }
+  }
+}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/SingleFileServlet.java b/java/com/google/gerrit/httpd/raw/SingleFileServlet.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/SingleFileServlet.java
rename to java/com/google/gerrit/httpd/raw/SingleFileServlet.java
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/SiteStaticDirectoryServlet.java b/java/com/google/gerrit/httpd/raw/SiteStaticDirectoryServlet.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/SiteStaticDirectoryServlet.java
rename to java/com/google/gerrit/httpd/raw/SiteStaticDirectoryServlet.java
diff --git a/java/com/google/gerrit/httpd/raw/SshInfoServlet.java b/java/com/google/gerrit/httpd/raw/SshInfoServlet.java
new file mode 100644
index 0000000..1605360
--- /dev/null
+++ b/java/com/google/gerrit/httpd/raw/SshInfoServlet.java
@@ -0,0 +1,93 @@
+// Copyright (C) 2008 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.google.gerrit.httpd.raw;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.gerrit.server.ssh.SshInfo;
+import com.google.gerrit.util.http.CacheHeaders;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.jcraft.jsch.HostKey;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.List;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Servlet hosting an SSH daemon on another port. During a standard HTTP GET request the servlet
+ * returns the hostname and port number back to the client in the form <code>${host} ${port}</code>.
+ *
+ * <p>Use a Git URL such as <code>ssh://${email}@${host}:${port}/${path}</code>, e.g. {@code
+ * ssh://sop@google.com@gerrit.com:8010/tools/gerrit.git} to access the SSH daemon itself.
+ *
+ * <p>Versions of Git before 1.5.3 may require setting the username and port properties in the
+ * user's {@code ~/.ssh/config} file, and using a host alias through a URL such as {@code
+ * gerrit-alias:/tools/gerrit.git}:
+ *
+ * <pre>{@code
+ * Host gerrit-alias
+ *  User sop@google.com
+ *  Hostname gerrit.com
+ *  Port 8010
+ * }</pre>
+ */
+@Singleton
+public class SshInfoServlet extends HttpServlet {
+  private static final long serialVersionUID = 1L;
+
+  private final SshInfo sshd;
+
+  @Inject
+  SshInfoServlet(SshInfo daemon) {
+    sshd = daemon;
+  }
+
+  @Override
+  protected void doGet(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
+    final List<HostKey> hostKeys = sshd.getHostKeys();
+    final String out;
+    if (!hostKeys.isEmpty()) {
+      String host = hostKeys.get(0).getHost();
+      String port = "22";
+
+      if (host.contains(":")) {
+        final int p = host.lastIndexOf(':');
+        port = host.substring(p + 1);
+        host = host.substring(0, p);
+      }
+
+      if (host.equals("*")) {
+        host = req.getServerName();
+
+      } else if (host.startsWith("[") && host.endsWith("]")) {
+        host = host.substring(1, host.length() - 1);
+      }
+
+      out = host + " " + port;
+    } else {
+      out = "NOT_AVAILABLE";
+    }
+
+    CacheHeaders.setNotCacheable(rsp);
+    rsp.setCharacterEncoding(UTF_8.name());
+    rsp.setContentType("text/plain");
+    try (PrintWriter w = rsp.getWriter()) {
+      w.write(out);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/httpd/raw/StaticModule.java b/java/com/google/gerrit/httpd/raw/StaticModule.java
new file mode 100644
index 0000000..fc6762b
--- /dev/null
+++ b/java/com/google/gerrit/httpd/raw/StaticModule.java
@@ -0,0 +1,602 @@
+// Copyright (C) 2015 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.google.gerrit.httpd.raw;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.nio.file.Files.exists;
+import static java.nio.file.Files.isReadable;
+
+import com.google.common.cache.Cache;
+import com.google.common.collect.ImmutableList;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.client.UiType;
+import com.google.gerrit.httpd.XsrfCookieFilter;
+import com.google.gerrit.httpd.raw.ResourceServlet.Resource;
+import com.google.gerrit.launcher.GerritLauncher;
+import com.google.gerrit.server.cache.CacheModule;
+import com.google.gerrit.server.config.CanonicalWebUrl;
+import com.google.gerrit.server.config.GerritOptions;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.inject.Inject;
+import com.google.inject.Key;
+import com.google.inject.Provides;
+import com.google.inject.ProvisionException;
+import com.google.inject.Singleton;
+import com.google.inject.name.Named;
+import com.google.inject.name.Names;
+import com.google.inject.servlet.ServletModule;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.nio.file.FileSystem;
+import java.nio.file.Path;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import javax.servlet.http.HttpServletResponse;
+import org.eclipse.jgit.lib.Config;
+
+public class StaticModule extends ServletModule {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static final String CACHE = "static_content";
+  public static final String GERRIT_UI_COOKIE = "GERRIT_UI";
+
+  /**
+   * Paths at which we should serve the main PolyGerrit application {@code index.html}.
+   *
+   * <p>Supports {@code "/*"} as a trailing wildcard.
+   */
+  public static final ImmutableList<String> POLYGERRIT_INDEX_PATHS =
+      ImmutableList.of(
+          "/",
+          "/c/*",
+          "/p/*",
+          "/q/*",
+          "/x/*",
+          "/admin/*",
+          "/dashboard/*",
+          "/settings/*",
+          "/Documentation/q/*");
+  // TODO(dborowitz): These fragments conflict with the REST API
+  // namespace, so they will need to use a different path.
+  // "/groups/*",
+  // "/projects/*");
+  //
+
+  /**
+   * Paths that should be treated as static assets when serving PolyGerrit.
+   *
+   * <p>Supports {@code "/*"} as a trailing wildcard.
+   */
+  private static final ImmutableList<String> POLYGERRIT_ASSET_PATHS =
+      ImmutableList.of(
+          "/behaviors/*",
+          "/bower_components/*",
+          "/elements/*",
+          "/fonts/*",
+          "/scripts/*",
+          "/styles/*");
+
+  private static final String DOC_SERVLET = "DocServlet";
+  private static final String FAVICON_SERVLET = "FaviconServlet";
+  private static final String GWT_UI_SERVLET = "GwtUiServlet";
+  private static final String POLYGERRIT_INDEX_SERVLET = "PolyGerritUiIndexServlet";
+  private static final String ROBOTS_TXT_SERVLET = "RobotsTxtServlet";
+
+  private static final int GERRIT_UI_COOKIE_MAX_AGE = 60 * 60 * 24 * 365;
+
+  private final GerritOptions options;
+  private Paths paths;
+
+  @Inject
+  public StaticModule(GerritOptions options) {
+    this.options = options;
+  }
+
+  @Provides
+  @Singleton
+  private Paths getPaths() {
+    if (paths == null) {
+      paths = new Paths(options);
+    }
+    return paths;
+  }
+
+  @Override
+  protected void configureServlets() {
+    serveRegex("^/Documentation$").with(named(DOC_SERVLET));
+    serveRegex("^/Documentation/$").with(named(DOC_SERVLET));
+    serveRegex("^/Documentation/(.+)$").with(named(DOC_SERVLET));
+    serve("/static/*").with(SiteStaticDirectoryServlet.class);
+    install(
+        new CacheModule() {
+          @Override
+          protected void configure() {
+            cache(CACHE, Path.class, Resource.class)
+                .maximumWeight(1 << 20)
+                .weigher(ResourceServlet.Weigher.class);
+          }
+        });
+    if (!options.headless()) {
+      install(new CoreStaticModule());
+      install(new PolyGerritModule());
+    }
+    if (options.enableGwtUi()) {
+      install(new GwtUiModule());
+    }
+  }
+
+  @Provides
+  @Singleton
+  @Named(DOC_SERVLET)
+  HttpServlet getDocServlet(@Named(CACHE) Cache<Path, Resource> cache) {
+    Paths p = getPaths();
+    if (p.warFs != null) {
+      return new WarDocServlet(cache, p.warFs);
+    } else if (p.unpackedWar != null && !p.isDev()) {
+      return new DirectoryDocServlet(cache, p.unpackedWar);
+    } else {
+      return new HttpServlet() {
+        private static final long serialVersionUID = 1L;
+
+        @Override
+        protected void service(HttpServletRequest req, HttpServletResponse resp)
+            throws IOException {
+          resp.sendError(HttpServletResponse.SC_NOT_FOUND);
+        }
+      };
+    }
+  }
+
+  private class CoreStaticModule extends ServletModule {
+    @Override
+    public void configureServlets() {
+      serve("/robots.txt").with(named(ROBOTS_TXT_SERVLET));
+      serve("/favicon.ico").with(named(FAVICON_SERVLET));
+    }
+
+    @Provides
+    @Singleton
+    @Named(ROBOTS_TXT_SERVLET)
+    HttpServlet getRobotsTxtServlet(
+        @GerritServerConfig Config cfg,
+        SitePaths sitePaths,
+        @Named(CACHE) Cache<Path, Resource> cache) {
+      Path configPath = sitePaths.resolve(cfg.getString("httpd", null, "robotsFile"));
+      if (configPath != null) {
+        if (exists(configPath) && isReadable(configPath)) {
+          return new SingleFileServlet(cache, configPath, true);
+        }
+        logger.atWarning().log("Cannot read httpd.robotsFile, using default");
+      }
+      Paths p = getPaths();
+      if (p.warFs != null) {
+        return new SingleFileServlet(cache, p.warFs.getPath("/robots.txt"), false);
+      }
+      return new SingleFileServlet(cache, webappSourcePath("robots.txt"), true);
+    }
+
+    @Provides
+    @Singleton
+    @Named(FAVICON_SERVLET)
+    HttpServlet getFaviconServlet(@Named(CACHE) Cache<Path, Resource> cache) {
+      Paths p = getPaths();
+      if (p.warFs != null) {
+        return new SingleFileServlet(cache, p.warFs.getPath("/favicon.ico"), false);
+      }
+      return new SingleFileServlet(cache, webappSourcePath("favicon.ico"), true);
+    }
+
+    private Path webappSourcePath(String name) {
+      Paths p = getPaths();
+      if (p.unpackedWar != null) {
+        return p.unpackedWar.resolve(name);
+      }
+      return p.sourceRoot.resolve("webapp/" + name);
+    }
+  }
+
+  private class GwtUiModule extends ServletModule {
+    @Override
+    public void configureServlets() {
+      serveRegex("^/gerrit_ui/(?!rpc/)(.*)$")
+          .with(Key.get(HttpServlet.class, Names.named(GWT_UI_SERVLET)));
+      Paths p = getPaths();
+      if (p.isDev()) {
+        filter("/").through(new RecompileGwtUiFilter(p.builder, p.unpackedWar));
+      }
+    }
+
+    @Provides
+    @Singleton
+    @Named(GWT_UI_SERVLET)
+    HttpServlet getGwtUiServlet(@Named(CACHE) Cache<Path, Resource> cache) throws IOException {
+      Paths p = getPaths();
+      if (p.warFs != null) {
+        return new WarGwtUiServlet(cache, p.warFs);
+      }
+      return new DirectoryGwtUiServlet(cache, p.unpackedWar, p.isDev());
+    }
+  }
+
+  private class PolyGerritModule extends ServletModule {
+    @Override
+    public void configureServlets() {
+      for (String p : POLYGERRIT_INDEX_PATHS) {
+        // Skip XsrfCookieFilter for /, since that is already done in the GWT UI
+        // path (UrlModule).
+        if (!p.equals("/")) {
+          filter(p).through(XsrfCookieFilter.class);
+        }
+      }
+      filter("/*").through(PolyGerritFilter.class);
+    }
+
+    @Provides
+    @Singleton
+    @Named(POLYGERRIT_INDEX_SERVLET)
+    HttpServlet getPolyGerritUiIndexServlet(
+        @CanonicalWebUrl @Nullable String canonicalUrl, @GerritServerConfig Config cfg)
+        throws URISyntaxException {
+      String cdnPath = cfg.getString("gerrit", null, "cdnPath");
+      String faviconPath = cfg.getString("gerrit", null, "faviconPath");
+      return new IndexServlet(canonicalUrl, cdnPath, faviconPath);
+    }
+
+    @Provides
+    @Singleton
+    PolyGerritUiServlet getPolyGerritUiServlet(@Named(CACHE) Cache<Path, Resource> cache) {
+      return new PolyGerritUiServlet(cache, polyGerritBasePath());
+    }
+
+    @Provides
+    @Singleton
+    BowerComponentsDevServlet getBowerComponentsServlet(@Named(CACHE) Cache<Path, Resource> cache)
+        throws IOException {
+      return getPaths().isDev() ? new BowerComponentsDevServlet(cache, getPaths().builder) : null;
+    }
+
+    @Provides
+    @Singleton
+    FontsDevServlet getFontsServlet(@Named(CACHE) Cache<Path, Resource> cache) throws IOException {
+      return getPaths().isDev() ? new FontsDevServlet(cache, getPaths().builder) : null;
+    }
+
+    private Path polyGerritBasePath() {
+      Paths p = getPaths();
+      if (options.forcePolyGerritDev()) {
+        checkArgument(
+            p.sourceRoot != null, "no source root directory found for PolyGerrit developer mode");
+      }
+
+      if (p.isDev()) {
+        return p.sourceRoot.resolve("polygerrit-ui").resolve("app");
+      }
+
+      return p.warFs != null
+          ? p.warFs.getPath("/polygerrit_ui")
+          : p.unpackedWar.resolve("polygerrit_ui");
+    }
+  }
+
+  private static class Paths {
+    private final FileSystem warFs;
+    private final BazelBuild builder;
+    private final Path sourceRoot;
+    private final Path unpackedWar;
+    private final boolean development;
+
+    private Paths(GerritOptions options) {
+      try {
+        File launcherLoadedFrom = getLauncherLoadedFrom();
+        if (launcherLoadedFrom != null && launcherLoadedFrom.getName().endsWith(".jar")) {
+          // Special case: unpacked war archive deployed in container.
+          // The path is something like:
+          // <container>/<gerrit>/WEB-INF/lib/launcher.jar
+          // Switch to exploded war case with <container>/webapp>/<gerrit>
+          // root directory
+          warFs = null;
+          unpackedWar =
+              java.nio.file.Paths.get(
+                  launcherLoadedFrom.getParentFile().getParentFile().getParentFile().toURI());
+          sourceRoot = null;
+          development = false;
+          builder = null;
+          return;
+        }
+        warFs = getDistributionArchive(launcherLoadedFrom);
+        if (warFs == null) {
+          unpackedWar = makeWarTempDir();
+          development = true;
+        } else if (options.forcePolyGerritDev()) {
+          unpackedWar = null;
+          development = true;
+        } else {
+          unpackedWar = null;
+          development = false;
+          sourceRoot = null;
+          builder = null;
+          return;
+        }
+      } catch (IOException e) {
+        throw new ProvisionException("Error initializing static content paths", e);
+      }
+
+      sourceRoot = getSourceRootOrNull();
+      builder = new BazelBuild(sourceRoot);
+    }
+
+    private static Path getSourceRootOrNull() {
+      try {
+        return GerritLauncher.resolveInSourceRoot(".");
+      } catch (FileNotFoundException e) {
+        return null;
+      }
+    }
+
+    private FileSystem getDistributionArchive(File war) throws IOException {
+      if (war == null) {
+        return null;
+      }
+      return GerritLauncher.getZipFileSystem(war.toPath());
+    }
+
+    private File getLauncherLoadedFrom() {
+      File war;
+      try {
+        war = GerritLauncher.getDistributionArchive();
+      } catch (IOException e) {
+        if ((e instanceof FileNotFoundException)
+            && GerritLauncher.NOT_ARCHIVED.equals(e.getMessage())) {
+          return null;
+        }
+        throw new ProvisionException("Error reading gerrit.war", e);
+      }
+      return war;
+    }
+
+    private boolean isDev() {
+      return development;
+    }
+
+    private Path makeWarTempDir() {
+      // Obtain our local temporary directory, but it comes back as a file
+      // so we have to switch it to be a directory post creation.
+      //
+      try {
+        File dstwar = GerritLauncher.createTempFile("gerrit_", "war");
+        if (!dstwar.delete() || !dstwar.mkdir()) {
+          throw new IOException("Cannot mkdir " + dstwar.getAbsolutePath());
+        }
+
+        // Jetty normally refuses to serve out of a symlinked directory, as
+        // a security feature. Try to resolve out any symlinks in the path.
+        //
+        try {
+          return dstwar.getCanonicalFile().toPath();
+        } catch (IOException e) {
+          return dstwar.getAbsoluteFile().toPath();
+        }
+      } catch (IOException e) {
+        throw new ProvisionException("Cannot create war tempdir", e);
+      }
+    }
+  }
+
+  private static Key<HttpServlet> named(String name) {
+    return Key.get(HttpServlet.class, Names.named(name));
+  }
+
+  @Singleton
+  private static class PolyGerritFilter implements Filter {
+    private final GerritOptions options;
+    private final Paths paths;
+    private final HttpServlet polyGerritIndex;
+    private final PolyGerritUiServlet polygerritUI;
+    private final BowerComponentsDevServlet bowerComponentServlet;
+    private final FontsDevServlet fontServlet;
+
+    @Inject
+    PolyGerritFilter(
+        GerritOptions options,
+        Paths paths,
+        @Named(POLYGERRIT_INDEX_SERVLET) HttpServlet polyGerritIndex,
+        PolyGerritUiServlet polygerritUI,
+        @Nullable BowerComponentsDevServlet bowerComponentServlet,
+        @Nullable FontsDevServlet fontServlet) {
+      this.paths = paths;
+      this.options = options;
+      this.polyGerritIndex = polyGerritIndex;
+      this.polygerritUI = polygerritUI;
+      this.bowerComponentServlet = bowerComponentServlet;
+      this.fontServlet = fontServlet;
+    }
+
+    @Override
+    public void init(FilterConfig filterConfig) throws ServletException {}
+
+    @Override
+    public void destroy() {}
+
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+        throws IOException, ServletException {
+      HttpServletRequest req = (HttpServletRequest) request;
+      HttpServletResponse res = (HttpServletResponse) response;
+      if (handlePolyGerritParam(req, res)) {
+        return;
+      }
+      if (!isPolyGerritEnabled(req)) {
+        chain.doFilter(req, res);
+        return;
+      }
+
+      GuiceFilterRequestWrapper reqWrapper = new GuiceFilterRequestWrapper(req);
+      String path = pathInfo(req);
+
+      // Special case assets during development that are built by Bazel and not
+      // served out of the source tree.
+      //
+      // In the war case, these are either inlined, or live under
+      // /polygerrit_ui in the war file, so we can just treat them as normal
+      // assets.
+      if (paths.isDev()) {
+        if (path.startsWith("/bower_components/")) {
+          bowerComponentServlet.service(reqWrapper, res);
+          return;
+        } else if (path.startsWith("/fonts/")) {
+          fontServlet.service(reqWrapper, res);
+          return;
+        }
+      }
+
+      if (isPolyGerritIndex(path)) {
+        polyGerritIndex.service(reqWrapper, res);
+        return;
+      }
+      if (isPolyGerritAsset(path)) {
+        polygerritUI.service(reqWrapper, res);
+        return;
+      }
+
+      chain.doFilter(req, res);
+    }
+
+    private static String pathInfo(HttpServletRequest req) {
+      String uri = req.getRequestURI();
+      String ctx = req.getContextPath();
+      return uri.startsWith(ctx) ? uri.substring(ctx.length()) : uri;
+    }
+
+    private boolean handlePolyGerritParam(HttpServletRequest req, HttpServletResponse res)
+        throws IOException {
+      if (!options.enableGwtUi() || !"GET".equals(req.getMethod())) {
+        return false;
+      }
+      boolean redirect = false;
+      String param = req.getParameter("polygerrit");
+      if ("1".equals(param)) {
+        setPolyGerritCookie(req, res, UiType.POLYGERRIT);
+        redirect = true;
+      } else if ("0".equals(param)) {
+        setPolyGerritCookie(req, res, UiType.GWT);
+        redirect = true;
+      }
+      if (redirect) {
+        // Strip polygerrit param from URL. This actually strips all params,
+        // which is a similar behavior to the JS PolyGerrit redirector code.
+        // Stripping just one param is frustratingly difficult without the use
+        // of Apache httpclient, which is a dep we don't want here:
+        // https://gerrit-review.googlesource.com/#/c/57570/57/gerrit-httpd/BUCK@32
+        res.sendRedirect(req.getRequestURL().toString());
+      }
+      return redirect;
+    }
+
+    private boolean isPolyGerritEnabled(HttpServletRequest req) {
+      return !options.enableGwtUi() || isPolyGerritCookie(req);
+    }
+
+    private boolean isPolyGerritCookie(HttpServletRequest req) {
+      UiType type = UiType.POLYGERRIT;
+      Cookie[] all = req.getCookies();
+      if (all != null) {
+        for (Cookie c : all) {
+          if (GERRIT_UI_COOKIE.equals(c.getName())) {
+            UiType t = UiType.parse(c.getValue());
+            if (t != null) {
+              type = t;
+              break;
+            }
+          }
+        }
+      }
+      return type == UiType.POLYGERRIT;
+    }
+
+    private void setPolyGerritCookie(HttpServletRequest req, HttpServletResponse res, UiType pref) {
+      // Only actually set a cookie if GWT UI is enabled in addition to default PG UI;
+      // otherwise clear it.
+      Cookie cookie = new Cookie(GERRIT_UI_COOKIE, pref.name());
+      if (options.enableGwtUi()) {
+        cookie.setPath("/");
+        cookie.setSecure(isSecure(req));
+        cookie.setMaxAge(GERRIT_UI_COOKIE_MAX_AGE);
+      } else {
+        cookie.setValue("");
+        cookie.setMaxAge(0);
+      }
+      res.addCookie(cookie);
+    }
+
+    private static boolean isSecure(HttpServletRequest req) {
+      return req.isSecure() || "https".equals(req.getScheme());
+    }
+
+    private static boolean isPolyGerritAsset(String path) {
+      return matchPath(POLYGERRIT_ASSET_PATHS, path);
+    }
+
+    private static boolean isPolyGerritIndex(String path) {
+      return matchPath(POLYGERRIT_INDEX_PATHS, path);
+    }
+
+    private static boolean matchPath(Iterable<String> paths, String path) {
+      for (String p : paths) {
+        if (p.endsWith("/*")) {
+          if (path.regionMatches(0, p, 0, p.length() - 1)) {
+            return true;
+          }
+        } else if (p.equals(path)) {
+          return true;
+        }
+      }
+      return false;
+    }
+  }
+
+  private static class GuiceFilterRequestWrapper extends HttpServletRequestWrapper {
+    GuiceFilterRequestWrapper(HttpServletRequest req) {
+      super(req);
+    }
+
+    @Override
+    public String getPathInfo() {
+      String uri = getRequestURI();
+      String ctx = getContextPath();
+      // This is a workaround for long standing guice filter bug:
+      // https://github.com/google/guice/issues/807
+      String res = uri.startsWith(ctx) ? uri.substring(ctx.length()) : uri;
+
+      // Match the logic in the ResourceServlet, that re-add "/"
+      // for null path info
+      if ("/".equals(res)) {
+        return null;
+      }
+      return res;
+    }
+  }
+}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/ThemeFactory.java b/java/com/google/gerrit/httpd/raw/ThemeFactory.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/ThemeFactory.java
rename to java/com/google/gerrit/httpd/raw/ThemeFactory.java
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/ToolServlet.java b/java/com/google/gerrit/httpd/raw/ToolServlet.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/ToolServlet.java
rename to java/com/google/gerrit/httpd/raw/ToolServlet.java
diff --git a/java/com/google/gerrit/httpd/raw/UserAgentRule.java b/java/com/google/gerrit/httpd/raw/UserAgentRule.java
new file mode 100644
index 0000000..4aac243
--- /dev/null
+++ b/java/com/google/gerrit/httpd/raw/UserAgentRule.java
@@ -0,0 +1,93 @@
+// Copyright (C) 2009 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.google.gerrit.httpd.raw;
+
+import static java.util.regex.Pattern.compile;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * Selects the value for the {@code user.agent} property.
+ *
+ * <p>Examines the {@code User-Agent} HTTP request header, and tries to match it to known {@code
+ * user.agent} values.
+ *
+ * <p>Ported from JavaScript in {@code com.google.gwt.user.UserAgent.gwt.xml}.
+ */
+class UserAgentRule {
+  private static final Pattern msie = compile(".*msie ([0-11]+)\\.([0-11]+).*");
+  private static final Pattern gecko = compile(".*rv:([0-9]+)\\.([0-9]+).*");
+
+  String getName() {
+    return "user.agent";
+  }
+
+  String select(HttpServletRequest req) {
+    String ua = req.getHeader("User-Agent");
+    if (ua == null) {
+      return null;
+    }
+
+    ua = ua.toLowerCase();
+
+    if (ua.contains("opera")) {
+      return "opera";
+
+    } else if (ua.contains("webkit")) {
+      return "safari";
+
+    } else if (ua.contains("msie")) {
+      // GWT 2.0 uses document.documentMode here, which we can't do
+      // on the server side.
+
+      Matcher m = msie.matcher(ua);
+      if (m.matches() && m.groupCount() == 2) {
+        int v = makeVersion(m);
+        if (v >= 11000) {
+          return "ie11";
+        }
+        if (v >= 10000) {
+          return "ie10";
+        }
+        if (v >= 9000) {
+          return "ie9";
+        }
+        if (v >= 8000) {
+          return "ie8";
+        }
+      }
+      return null;
+
+    } else if (ua.contains("edge")) {
+      return "edge";
+    } else if (ua.contains("gecko")) {
+      Matcher m = gecko.matcher(ua);
+      if (m.matches() && m.groupCount() == 2) {
+        if (makeVersion(m) >= 1008) {
+          return "gecko1_8";
+        }
+      }
+      return "gecko";
+    }
+
+    return null;
+  }
+
+  private int makeVersion(Matcher result) {
+    return (Integer.parseInt(result.group(1)) * 1000) + Integer.parseInt(result.group(2));
+  }
+}
diff --git a/java/com/google/gerrit/httpd/raw/WarDocServlet.java b/java/com/google/gerrit/httpd/raw/WarDocServlet.java
new file mode 100644
index 0000000..27520e3
--- /dev/null
+++ b/java/com/google/gerrit/httpd/raw/WarDocServlet.java
@@ -0,0 +1,46 @@
+// Copyright (C) 2015 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.google.gerrit.httpd.raw;
+
+import com.google.common.cache.Cache;
+import com.google.gerrit.server.util.time.TimeUtil;
+import java.nio.file.FileSystem;
+import java.nio.file.Path;
+import java.nio.file.attribute.FileTime;
+
+class WarDocServlet extends ResourceServlet {
+  private static final long serialVersionUID = 1L;
+
+  private static final FileTime NOW = FileTime.fromMillis(TimeUtil.nowMs());
+
+  private final FileSystem warFs;
+
+  WarDocServlet(Cache<Path, Resource> cache, FileSystem warFs) {
+    super(cache, false);
+    this.warFs = warFs;
+  }
+
+  @Override
+  protected Path getResourcePath(String pathInfo) {
+    return warFs.getPath("/Documentation/" + pathInfo);
+  }
+
+  @Override
+  protected FileTime getLastModifiedTime(Path p) {
+    // Return initialization time of this class, since the WAR outputs from the build process all
+    // have mtimes of 1980/1/1.
+    return NOW;
+  }
+}
diff --git a/java/com/google/gerrit/httpd/raw/WarGwtUiServlet.java b/java/com/google/gerrit/httpd/raw/WarGwtUiServlet.java
new file mode 100644
index 0000000..5fe7054
--- /dev/null
+++ b/java/com/google/gerrit/httpd/raw/WarGwtUiServlet.java
@@ -0,0 +1,46 @@
+// Copyright (C) 2015 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.google.gerrit.httpd.raw;
+
+import com.google.common.cache.Cache;
+import com.google.gerrit.server.util.time.TimeUtil;
+import java.nio.file.FileSystem;
+import java.nio.file.Path;
+import java.nio.file.attribute.FileTime;
+
+class WarGwtUiServlet extends ResourceServlet {
+  private static final long serialVersionUID = 1L;
+
+  private static final FileTime NOW = FileTime.fromMillis(TimeUtil.nowMs());
+
+  private final FileSystem warFs;
+
+  WarGwtUiServlet(Cache<Path, Resource> cache, FileSystem warFs) {
+    super(cache, false);
+    this.warFs = warFs;
+  }
+
+  @Override
+  protected Path getResourcePath(String pathInfo) {
+    return warFs.getPath("/gerrit_ui/" + pathInfo);
+  }
+
+  @Override
+  protected FileTime getLastModifiedTime(Path p) {
+    // Return initialization time of this class, since the GWT outputs from the
+    // build process all have mtimes of 1980/1/1.
+    return NOW;
+  }
+}
diff --git a/java/com/google/gerrit/httpd/resources/Resource.java b/java/com/google/gerrit/httpd/resources/Resource.java
new file mode 100644
index 0000000..878912e
--- /dev/null
+++ b/java/com/google/gerrit/httpd/resources/Resource.java
@@ -0,0 +1,56 @@
+// Copyright (C) 2012 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.google.gerrit.httpd.resources;
+
+import com.google.gerrit.util.http.CacheHeaders;
+import java.io.IOException;
+import java.io.Serializable;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public abstract class Resource implements Serializable {
+  private static final long serialVersionUID = 1L;
+
+  public static final Resource NOT_FOUND =
+      new Resource() {
+        private static final long serialVersionUID = 1L;
+
+        @Override
+        public int weigh() {
+          return 0;
+        }
+
+        @Override
+        public void send(HttpServletRequest req, HttpServletResponse res) throws IOException {
+          CacheHeaders.setNotCacheable(res);
+          res.sendError(HttpServletResponse.SC_NOT_FOUND);
+        }
+
+        @Override
+        public boolean isUnchanged(long latestModifiedDate) {
+          return false;
+        }
+
+        protected Object readResolve() {
+          return NOT_FOUND;
+        }
+      };
+
+  public abstract boolean isUnchanged(long latestModifiedDate);
+
+  public abstract int weigh();
+
+  public abstract void send(HttpServletRequest req, HttpServletResponse res) throws IOException;
+}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/resources/ResourceKey.java b/java/com/google/gerrit/httpd/resources/ResourceKey.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/resources/ResourceKey.java
rename to java/com/google/gerrit/httpd/resources/ResourceKey.java
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/resources/ResourceWeigher.java b/java/com/google/gerrit/httpd/resources/ResourceWeigher.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/resources/ResourceWeigher.java
rename to java/com/google/gerrit/httpd/resources/ResourceWeigher.java
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/resources/SmallResource.java b/java/com/google/gerrit/httpd/resources/SmallResource.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/resources/SmallResource.java
rename to java/com/google/gerrit/httpd/resources/SmallResource.java
diff --git a/java/com/google/gerrit/httpd/restapi/AccessRestApiServlet.java b/java/com/google/gerrit/httpd/restapi/AccessRestApiServlet.java
new file mode 100644
index 0000000..7e3e0ca
--- /dev/null
+++ b/java/com/google/gerrit/httpd/restapi/AccessRestApiServlet.java
@@ -0,0 +1,30 @@
+// Copyright (C) 2013 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.google.gerrit.httpd.restapi;
+
+import com.google.gerrit.server.restapi.access.AccessCollection;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@Singleton
+public class AccessRestApiServlet extends RestApiServlet {
+  private static final long serialVersionUID = 1L;
+
+  @Inject
+  AccessRestApiServlet(RestApiServlet.Globals globals, Provider<AccessCollection> access) {
+    super(globals, access);
+  }
+}
diff --git a/java/com/google/gerrit/httpd/restapi/AccountsRestApiServlet.java b/java/com/google/gerrit/httpd/restapi/AccountsRestApiServlet.java
new file mode 100644
index 0000000..a1effb1
--- /dev/null
+++ b/java/com/google/gerrit/httpd/restapi/AccountsRestApiServlet.java
@@ -0,0 +1,30 @@
+// Copyright (C) 2012 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.google.gerrit.httpd.restapi;
+
+import com.google.gerrit.server.restapi.account.AccountsCollection;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@Singleton
+public class AccountsRestApiServlet extends RestApiServlet {
+  private static final long serialVersionUID = 1L;
+
+  @Inject
+  AccountsRestApiServlet(RestApiServlet.Globals globals, Provider<AccountsCollection> accounts) {
+    super(globals, accounts);
+  }
+}
diff --git a/java/com/google/gerrit/httpd/restapi/ChangesRestApiServlet.java b/java/com/google/gerrit/httpd/restapi/ChangesRestApiServlet.java
new file mode 100644
index 0000000..d35eb3e
--- /dev/null
+++ b/java/com/google/gerrit/httpd/restapi/ChangesRestApiServlet.java
@@ -0,0 +1,30 @@
+// Copyright (C) 2012 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.google.gerrit.httpd.restapi;
+
+import com.google.gerrit.server.restapi.change.ChangesCollection;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@Singleton
+public class ChangesRestApiServlet extends RestApiServlet {
+  private static final long serialVersionUID = 1L;
+
+  @Inject
+  ChangesRestApiServlet(RestApiServlet.Globals globals, Provider<ChangesCollection> changes) {
+    super(globals, changes);
+  }
+}
diff --git a/java/com/google/gerrit/httpd/restapi/ConfigRestApiServlet.java b/java/com/google/gerrit/httpd/restapi/ConfigRestApiServlet.java
new file mode 100644
index 0000000..4d56036
--- /dev/null
+++ b/java/com/google/gerrit/httpd/restapi/ConfigRestApiServlet.java
@@ -0,0 +1,31 @@
+// Copyright (C) 2013 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.google.gerrit.httpd.restapi;
+
+import com.google.gerrit.server.restapi.config.ConfigCollection;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@Singleton
+public class ConfigRestApiServlet extends RestApiServlet {
+  private static final long serialVersionUID = 1L;
+
+  @Inject
+  ConfigRestApiServlet(
+      RestApiServlet.Globals globals, Provider<ConfigCollection> configCollection) {
+    super(globals, configCollection);
+  }
+}
diff --git a/java/com/google/gerrit/httpd/restapi/GroupsRestApiServlet.java b/java/com/google/gerrit/httpd/restapi/GroupsRestApiServlet.java
new file mode 100644
index 0000000..fff696a
--- /dev/null
+++ b/java/com/google/gerrit/httpd/restapi/GroupsRestApiServlet.java
@@ -0,0 +1,30 @@
+// Copyright (C) 2013 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.google.gerrit.httpd.restapi;
+
+import com.google.gerrit.server.restapi.group.GroupsCollection;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GroupsRestApiServlet extends RestApiServlet {
+  private static final long serialVersionUID = 1L;
+
+  @Inject
+  GroupsRestApiServlet(RestApiServlet.Globals globals, Provider<GroupsCollection> groups) {
+    super(globals, groups);
+  }
+}
diff --git a/java/com/google/gerrit/httpd/restapi/LogRedactUtil.java b/java/com/google/gerrit/httpd/restapi/LogRedactUtil.java
new file mode 100644
index 0000000..5a2a033
--- /dev/null
+++ b/java/com/google/gerrit/httpd/restapi/LogRedactUtil.java
@@ -0,0 +1,57 @@
+// 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.
+
+// WARNING: NoteDbUpdateManager cares about the package name RestApiServlet lives in.
+
+package com.google.gerrit.httpd.restapi;
+
+import static com.google.gerrit.httpd.restapi.RestApiServlet.XD_AUTHORIZATION;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Splitter;
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.extensions.restapi.Url;
+import java.util.Iterator;
+
+public class LogRedactUtil {
+  private static final ImmutableSet<String> REDACT_PARAM = ImmutableSet.of(XD_AUTHORIZATION);
+
+  private LogRedactUtil() {}
+
+  /**
+   * Redacts sensitive information such as an access token from the query string to make it suitable
+   * for logging.
+   */
+  @VisibleForTesting
+  public static String redactQueryString(String qs) {
+    StringBuilder b = new StringBuilder();
+    for (String kvPair : Splitter.on('&').split(qs)) {
+      Iterator<String> i = Splitter.on('=').limit(2).split(kvPair).iterator();
+      String key = i.next();
+      if (b.length() > 0) {
+        b.append('&');
+      }
+      b.append(key);
+      if (i.hasNext()) {
+        b.append('=');
+        if (REDACT_PARAM.contains(Url.decode(key))) {
+          b.append('*');
+        } else {
+          b.append(i.next());
+        }
+      }
+    }
+    return b.toString();
+  }
+}
diff --git a/java/com/google/gerrit/httpd/restapi/ParameterParser.java b/java/com/google/gerrit/httpd/restapi/ParameterParser.java
new file mode 100644
index 0000000..172321d
--- /dev/null
+++ b/java/com/google/gerrit/httpd/restapi/ParameterParser.java
@@ -0,0 +1,300 @@
+// Copyright (C) 2012 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.google.gerrit.httpd.restapi;
+
+import static com.google.gerrit.httpd.restapi.RestApiServlet.ALLOWED_CORS_METHODS;
+import static com.google.gerrit.httpd.restapi.RestApiServlet.XD_AUTHORIZATION;
+import static com.google.gerrit.httpd.restapi.RestApiServlet.XD_CONTENT_TYPE;
+import static com.google.gerrit.httpd.restapi.RestApiServlet.XD_METHOD;
+import static com.google.gerrit.httpd.restapi.RestApiServlet.replyBinaryResult;
+import static com.google.gerrit.httpd.restapi.RestApiServlet.replyError;
+import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Splitter;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.MultimapBuilder;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.BinaryResult;
+import com.google.gerrit.extensions.restapi.Url;
+import com.google.gerrit.server.DynamicOptions;
+import com.google.gerrit.util.cli.CmdLineParser;
+import com.google.gerrit.util.http.CacheHeaders;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.kohsuke.args4j.CmdLineException;
+
+public class ParameterParser {
+  public static final String TRACE_PARAMETER = "trace";
+
+  private static final ImmutableSet<String> RESERVED_KEYS =
+      ImmutableSet.of("pp", "prettyPrint", "strict", "callback", "alt", "fields", TRACE_PARAMETER);
+
+  @AutoValue
+  public abstract static class QueryParams {
+    static final String I = QueryParams.class.getName();
+
+    static QueryParams create(
+        @Nullable String accessToken,
+        @Nullable String xdMethod,
+        @Nullable String xdContentType,
+        ImmutableListMultimap<String, String> config,
+        ImmutableListMultimap<String, String> params) {
+      return new AutoValue_ParameterParser_QueryParams(
+          accessToken, xdMethod, xdContentType, config, params);
+    }
+
+    @Nullable
+    public abstract String accessToken();
+
+    @Nullable
+    abstract String xdMethod();
+
+    @Nullable
+    abstract String xdContentType();
+
+    abstract ImmutableListMultimap<String, String> config();
+
+    abstract ImmutableListMultimap<String, String> params();
+
+    boolean hasXdOverride() {
+      return xdMethod() != null || xdContentType() != null;
+    }
+  }
+
+  public static QueryParams getQueryParams(HttpServletRequest req) throws BadRequestException {
+    QueryParams qp = (QueryParams) req.getAttribute(QueryParams.I);
+    if (qp != null) {
+      return qp;
+    }
+
+    String accessToken = null;
+    String xdMethod = null;
+    String xdContentType = null;
+    ListMultimap<String, String> config = MultimapBuilder.hashKeys(4).arrayListValues().build();
+    ListMultimap<String, String> params = MultimapBuilder.hashKeys().arrayListValues().build();
+
+    String queryString = req.getQueryString();
+    if (!Strings.isNullOrEmpty(queryString)) {
+      for (String kvPair : Splitter.on('&').split(queryString)) {
+        Iterator<String> i = Splitter.on('=').limit(2).split(kvPair).iterator();
+        String key = Url.decode(i.next());
+        String val = i.hasNext() ? Url.decode(i.next()) : "";
+
+        if (XD_AUTHORIZATION.equals(key)) {
+          if (accessToken != null) {
+            throw new BadRequestException("duplicate " + XD_AUTHORIZATION);
+          }
+          accessToken = val;
+        } else if (XD_METHOD.equals(key)) {
+          if (xdMethod != null) {
+            throw new BadRequestException("duplicate " + XD_METHOD);
+          } else if (!ALLOWED_CORS_METHODS.contains(val)) {
+            throw new BadRequestException("invalid " + XD_METHOD);
+          }
+          xdMethod = val;
+        } else if (XD_CONTENT_TYPE.equals(key)) {
+          if (xdContentType != null) {
+            throw new BadRequestException("duplicate " + XD_CONTENT_TYPE);
+          }
+          xdContentType = val;
+        } else if (RESERVED_KEYS.contains(key)) {
+          config.put(key, val);
+        } else {
+          params.put(key, val);
+        }
+      }
+    }
+
+    qp =
+        QueryParams.create(
+            accessToken,
+            xdMethod,
+            xdContentType,
+            ImmutableListMultimap.copyOf(config),
+            ImmutableListMultimap.copyOf(params));
+    req.setAttribute(QueryParams.I, qp);
+    return qp;
+  }
+
+  private final CmdLineParser.Factory parserFactory;
+  private final Injector injector;
+  private final DynamicMap<DynamicOptions.DynamicBean> dynamicBeans;
+
+  @Inject
+  ParameterParser(
+      CmdLineParser.Factory pf,
+      Injector injector,
+      DynamicMap<DynamicOptions.DynamicBean> dynamicBeans) {
+    this.parserFactory = pf;
+    this.injector = injector;
+    this.dynamicBeans = dynamicBeans;
+  }
+
+  <T> boolean parse(
+      T param, ListMultimap<String, String> in, HttpServletRequest req, HttpServletResponse res)
+      throws IOException {
+    CmdLineParser clp = parserFactory.create(param);
+    DynamicOptions pluginOptions = new DynamicOptions(param, injector, dynamicBeans);
+    pluginOptions.parseDynamicBeans(clp);
+    pluginOptions.setDynamicBeans();
+    pluginOptions.onBeanParseStart();
+    try {
+      clp.parseOptionMap(in);
+    } catch (CmdLineException | NumberFormatException e) {
+      if (!clp.wasHelpRequestedByOption()) {
+        replyError(req, res, SC_BAD_REQUEST, e.getMessage(), e);
+        return false;
+      }
+    }
+
+    if (clp.wasHelpRequestedByOption()) {
+      StringWriter msg = new StringWriter();
+      clp.printQueryStringUsage(req.getRequestURI(), msg);
+      msg.write('\n');
+      msg.write('\n');
+      clp.printUsage(msg, null);
+      msg.write('\n');
+      CacheHeaders.setNotCacheable(res);
+      replyBinaryResult(req, res, BinaryResult.create(msg.toString()).setContentType("text/plain"));
+      return false;
+    }
+    pluginOptions.onBeanParseEnd();
+
+    return true;
+  }
+
+  private static Set<String> query(HttpServletRequest req) {
+    Set<String> params = new HashSet<>();
+    if (!Strings.isNullOrEmpty(req.getQueryString())) {
+      for (String kvPair : Splitter.on('&').split(req.getQueryString())) {
+        params.add(Iterables.getFirst(Splitter.on('=').limit(2).split(kvPair), null));
+      }
+    }
+    return params;
+  }
+
+  /**
+   * Convert a standard URL encoded form input into a parsed JSON tree.
+   *
+   * <p>Given an input such as:
+   *
+   * <pre>
+   * message=Does+not+compile.&labels.Verified=-1
+   * </pre>
+   *
+   * which is easily created using the curl command line tool:
+   *
+   * <pre>
+   * curl --data 'message=Does not compile.' --data labels.Verified=-1
+   * </pre>
+   *
+   * converts to a JSON object structure that is normally expected:
+   *
+   * <pre>
+   * {
+   *   "message": "Does not compile.",
+   *   "labels": {
+   *     "Verified": "-1"
+   *   }
+   * }
+   * </pre>
+   *
+   * This input can then be further processed into the Java input type expected by a view using
+   * Gson. Here we rely on Gson to perform implicit conversion of a string {@code "-1"} to a number
+   * type when the Java input type expects a number.
+   *
+   * <p>Conversion assumes any field name that does not contain {@code "."} will be a property of
+   * the top level input object. Any field with a dot will use the first segment as the top level
+   * property name naming an object, and the rest of the field name as a property in the nested
+   * object.
+   *
+   * @param req request to parse form input from and create JSON tree.
+   * @return the converted JSON object tree.
+   * @throws BadRequestException the request cannot be cast, as there are conflicting definitions
+   *     for a nested object.
+   */
+  static JsonObject formToJson(HttpServletRequest req) throws BadRequestException {
+    Map<String, String[]> map = req.getParameterMap();
+    return formToJson(map, query(req));
+  }
+
+  @VisibleForTesting
+  static JsonObject formToJson(Map<String, String[]> map, Set<String> query)
+      throws BadRequestException {
+    JsonObject inputObject = new JsonObject();
+    for (Map.Entry<String, String[]> ent : map.entrySet()) {
+      String key = ent.getKey();
+      String[] values = ent.getValue();
+
+      if (query.contains(key) || values.length == 0) {
+        // Disallow processing query parameters as input body fields.
+        // Implementations of views should avoid duplicate naming.
+        continue;
+      }
+
+      JsonObject obj = inputObject;
+      int dot = key.indexOf('.');
+      if (0 <= dot) {
+        String property = key.substring(0, dot);
+        JsonElement e = inputObject.get(property);
+        if (e == null) {
+          obj = new JsonObject();
+          inputObject.add(property, obj);
+        } else if (e.isJsonObject()) {
+          obj = e.getAsJsonObject();
+        } else {
+          throw new BadRequestException(String.format("key %s conflicts with %s", key, property));
+        }
+        key = key.substring(dot + 1);
+      }
+
+      if (obj.get(key) != null) {
+        // This error should never happen. If all form values are handled
+        // together in a single pass properties are set only once. Setting
+        // again indicates something has gone very wrong.
+        throw new BadRequestException("invalid form input, use JSON instead");
+      } else if (values.length == 1) {
+        obj.addProperty(key, values[0]);
+      } else {
+        JsonArray list = new JsonArray();
+        for (String v : values) {
+          list.add(new JsonPrimitive(v));
+        }
+        obj.add(key, list);
+      }
+    }
+    return inputObject;
+  }
+}
diff --git a/java/com/google/gerrit/httpd/restapi/ProjectsRestApiServlet.java b/java/com/google/gerrit/httpd/restapi/ProjectsRestApiServlet.java
new file mode 100644
index 0000000..d6b5db0
--- /dev/null
+++ b/java/com/google/gerrit/httpd/restapi/ProjectsRestApiServlet.java
@@ -0,0 +1,30 @@
+// Copyright (C) 2012 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.google.gerrit.httpd.restapi;
+
+import com.google.gerrit.server.restapi.project.ProjectsCollection;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@Singleton
+public class ProjectsRestApiServlet extends RestApiServlet {
+  private static final long serialVersionUID = 1L;
+
+  @Inject
+  ProjectsRestApiServlet(RestApiServlet.Globals globals, Provider<ProjectsCollection> projects) {
+    super(globals, projects);
+  }
+}
diff --git a/java/com/google/gerrit/httpd/restapi/RestApiMetrics.java b/java/com/google/gerrit/httpd/restapi/RestApiMetrics.java
new file mode 100644
index 0000000..562687b
--- /dev/null
+++ b/java/com/google/gerrit/httpd/restapi/RestApiMetrics.java
@@ -0,0 +1,89 @@
+// Copyright (C) 2015 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.google.gerrit.httpd.restapi;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.registration.PluginName;
+import com.google.gerrit.httpd.restapi.RestApiServlet.ViewData;
+import com.google.gerrit.metrics.Counter1;
+import com.google.gerrit.metrics.Counter2;
+import com.google.gerrit.metrics.Description;
+import com.google.gerrit.metrics.Description.Units;
+import com.google.gerrit.metrics.Field;
+import com.google.gerrit.metrics.Histogram1;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.metrics.Timer1;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class RestApiMetrics {
+  private static final String[] PKGS = {
+    "com.google.gerrit.server.", "com.google.gerrit.",
+  };
+
+  final Counter1<String> count;
+  final Counter2<String, Integer> errorCount;
+  final Timer1<String> serverLatency;
+  final Histogram1<String> responseBytes;
+
+  @Inject
+  RestApiMetrics(MetricMaker metrics) {
+    Field<String> view = Field.ofString("view", "view implementation class");
+    count =
+        metrics.newCounter(
+            "http/server/rest_api/count",
+            new Description("REST API calls by view").setRate(),
+            view);
+
+    errorCount =
+        metrics.newCounter(
+            "http/server/rest_api/error_count",
+            new Description("REST API errors by view").setRate(),
+            view,
+            Field.ofInteger("error_code", "HTTP status code"));
+
+    serverLatency =
+        metrics.newTimer(
+            "http/server/rest_api/server_latency",
+            new Description("REST API call latency by view")
+                .setCumulative()
+                .setUnit(Units.MILLISECONDS),
+            view);
+
+    responseBytes =
+        metrics.newHistogram(
+            "http/server/rest_api/response_bytes",
+            new Description("Size of response on network (may be gzip compressed)")
+                .setCumulative()
+                .setUnit(Units.BYTES),
+            view);
+  }
+
+  String view(ViewData viewData) {
+    String impl = viewData.view.getClass().getName().replace('$', '.');
+    for (String p : PKGS) {
+      if (impl.startsWith(p)) {
+        impl = impl.substring(p.length());
+        break;
+      }
+    }
+    if (!Strings.isNullOrEmpty(viewData.pluginName)
+        && !PluginName.GERRIT.equals(viewData.pluginName)) {
+      impl = viewData.pluginName + '-' + impl;
+    }
+    return impl;
+  }
+}
diff --git a/java/com/google/gerrit/httpd/restapi/RestApiServlet.java b/java/com/google/gerrit/httpd/restapi/RestApiServlet.java
new file mode 100644
index 0000000..588f349
--- /dev/null
+++ b/java/com/google/gerrit/httpd/restapi/RestApiServlet.java
@@ -0,0 +1,1564 @@
+// Copyright (C) 2012 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.
+
+// WARNING: NoteDbUpdateManager cares about the package name RestApiServlet lives in.
+package com.google.gerrit.httpd.restapi;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.flogger.LazyArgs.lazy;
+import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS;
+import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS;
+import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS;
+import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN;
+import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_MAX_AGE;
+import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_REQUEST_HEADERS;
+import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD;
+import static com.google.common.net.HttpHeaders.AUTHORIZATION;
+import static com.google.common.net.HttpHeaders.CONTENT_TYPE;
+import static com.google.common.net.HttpHeaders.ORIGIN;
+import static com.google.common.net.HttpHeaders.VARY;
+import static java.math.RoundingMode.CEILING;
+import static java.nio.charset.StandardCharsets.ISO_8859_1;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Objects.requireNonNull;
+import static java.util.stream.Collectors.joining;
+import static javax.servlet.http.HttpServletResponse.SC_ACCEPTED;
+import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
+import static javax.servlet.http.HttpServletResponse.SC_CONFLICT;
+import static javax.servlet.http.HttpServletResponse.SC_CREATED;
+import static javax.servlet.http.HttpServletResponse.SC_FORBIDDEN;
+import static javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
+import static javax.servlet.http.HttpServletResponse.SC_METHOD_NOT_ALLOWED;
+import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND;
+import static javax.servlet.http.HttpServletResponse.SC_NOT_IMPLEMENTED;
+import static javax.servlet.http.HttpServletResponse.SC_NOT_MODIFIED;
+import static javax.servlet.http.HttpServletResponse.SC_NO_CONTENT;
+import static javax.servlet.http.HttpServletResponse.SC_OK;
+import static javax.servlet.http.HttpServletResponse.SC_PRECONDITION_FAILED;
+import static javax.servlet.http.HttpServletResponse.SC_SERVICE_UNAVAILABLE;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.CharMatcher;
+import com.google.common.base.Joiner;
+import com.google.common.base.Splitter;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Lists;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.io.BaseEncoding;
+import com.google.common.io.CountingOutputStream;
+import com.google.common.math.IntMath;
+import com.google.common.net.HttpHeaders;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.RawInputUtil;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.registration.PluginName;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.BinaryResult;
+import com.google.gerrit.extensions.restapi.CacheControl;
+import com.google.gerrit.extensions.restapi.DefaultInput;
+import com.google.gerrit.extensions.restapi.ETagView;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.NeedsParams;
+import com.google.gerrit.extensions.restapi.NotImplementedException;
+import com.google.gerrit.extensions.restapi.PreconditionFailedException;
+import com.google.gerrit.extensions.restapi.RawInput;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestCollection;
+import com.google.gerrit.extensions.restapi.RestCollectionCreateView;
+import com.google.gerrit.extensions.restapi.RestCollectionDeleteMissingView;
+import com.google.gerrit.extensions.restapi.RestCollectionModifyView;
+import com.google.gerrit.extensions.restapi.RestCollectionView;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.extensions.restapi.RestResource;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.httpd.WebSession;
+import com.google.gerrit.httpd.restapi.ParameterParser.QueryParams;
+import com.google.gerrit.server.AccessPath;
+import com.google.gerrit.server.AnonymousUser;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.OptionUtil;
+import com.google.gerrit.server.OutputFormat;
+import com.google.gerrit.server.audit.ExtendedHttpAuditEvent;
+import com.google.gerrit.server.cache.PerThreadCache;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.git.LockFailureException;
+import com.google.gerrit.server.group.GroupAuditService;
+import com.google.gerrit.server.logging.RequestId;
+import com.google.gerrit.server.logging.TraceContext;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.util.http.CacheHeaders;
+import com.google.gerrit.util.http.RequestUtil;
+import com.google.gson.ExclusionStrategy;
+import com.google.gson.FieldAttributes;
+import com.google.gson.FieldNamingPolicy;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonPrimitive;
+import com.google.gson.stream.JsonReader;
+import com.google.gson.stream.JsonToken;
+import com.google.gson.stream.JsonWriter;
+import com.google.gson.stream.MalformedJsonException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.TypeLiteral;
+import com.google.inject.util.Providers;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.ByteArrayOutputStream;
+import java.io.EOFException;
+import java.io.FilterOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Pattern;
+import java.util.stream.Stream;
+import java.util.zip.GZIPOutputStream;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import javax.servlet.http.HttpServletResponse;
+import org.eclipse.jgit.http.server.ServletUtils;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.util.TemporaryBuffer;
+import org.eclipse.jgit.util.TemporaryBuffer.Heap;
+
+public class RestApiServlet extends HttpServlet {
+  private static final long serialVersionUID = 1L;
+
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  /** MIME type used for a JSON response body. */
+  private static final String JSON_TYPE = "application/json";
+
+  private static final String FORM_TYPE = "application/x-www-form-urlencoded";
+
+  @VisibleForTesting public static final String X_GERRIT_TRACE = "X-Gerrit-Trace";
+
+  // HTTP 422 Unprocessable Entity.
+  // TODO: Remove when HttpServletResponse.SC_UNPROCESSABLE_ENTITY is available
+  private static final int SC_UNPROCESSABLE_ENTITY = 422;
+  private static final String X_REQUESTED_WITH = "X-Requested-With";
+  private static final String X_GERRIT_AUTH = "X-Gerrit-Auth";
+  static final ImmutableSet<String> ALLOWED_CORS_METHODS =
+      ImmutableSet.of("GET", "HEAD", "POST", "PUT", "DELETE");
+  private static final ImmutableSet<String> ALLOWED_CORS_REQUEST_HEADERS =
+      Stream.of(AUTHORIZATION, CONTENT_TYPE, X_GERRIT_AUTH, X_REQUESTED_WITH)
+          .map(s -> s.toLowerCase(Locale.US))
+          .collect(ImmutableSet.toImmutableSet());
+
+  public static final String XD_AUTHORIZATION = "access_token";
+  public static final String XD_CONTENT_TYPE = "$ct";
+  public static final String XD_METHOD = "$m";
+
+  private static final int HEAP_EST_SIZE = 10 * 8 * 1024; // Presize 10 blocks.
+  private static final String PLAIN_TEXT = "text/plain";
+  private static final Pattern TYPE_SPLIT_PATTERN = Pattern.compile("[ ,;][ ,;]*");
+
+  /**
+   * Garbage prefix inserted before JSON output to prevent XSSI.
+   *
+   * <p>This prefix is ")]}'\n" and is designed to prevent a web browser from executing the response
+   * body if the resource URI were to be referenced using a &lt;script src="...&gt; HTML tag from
+   * another web site. Clients using the HTTP interface will need to always strip the first line of
+   * response data to remove this magic header.
+   */
+  public static final byte[] JSON_MAGIC;
+
+  static {
+    JSON_MAGIC = ")]}'\n".getBytes(UTF_8);
+  }
+
+  public static class Globals {
+    final Provider<CurrentUser> currentUser;
+    final DynamicItem<WebSession> webSession;
+    final Provider<ParameterParser> paramParser;
+    final PermissionBackend permissionBackend;
+    final GroupAuditService auditService;
+    final RestApiMetrics metrics;
+    final Pattern allowOrigin;
+
+    @Inject
+    Globals(
+        Provider<CurrentUser> currentUser,
+        DynamicItem<WebSession> webSession,
+        Provider<ParameterParser> paramParser,
+        PermissionBackend permissionBackend,
+        GroupAuditService auditService,
+        RestApiMetrics metrics,
+        @GerritServerConfig Config cfg) {
+      this.currentUser = currentUser;
+      this.webSession = webSession;
+      this.paramParser = paramParser;
+      this.permissionBackend = permissionBackend;
+      this.auditService = auditService;
+      this.metrics = metrics;
+      allowOrigin = makeAllowOrigin(cfg);
+    }
+
+    private static Pattern makeAllowOrigin(Config cfg) {
+      String[] allow = cfg.getStringList("site", null, "allowOriginRegex");
+      if (allow.length > 0) {
+        return Pattern.compile(Joiner.on('|').join(allow));
+      }
+      return null;
+    }
+  }
+
+  private final Globals globals;
+  private final Provider<RestCollection<RestResource, RestResource>> members;
+
+  public RestApiServlet(
+      Globals globals, RestCollection<? extends RestResource, ? extends RestResource> members) {
+    this(globals, Providers.of(members));
+  }
+
+  public RestApiServlet(
+      Globals globals,
+      Provider<? extends RestCollection<? extends RestResource, ? extends RestResource>> members) {
+    @SuppressWarnings("unchecked")
+    Provider<RestCollection<RestResource, RestResource>> n =
+        (Provider<RestCollection<RestResource, RestResource>>) requireNonNull((Object) members);
+    this.globals = globals;
+    this.members = n;
+  }
+
+  @Override
+  protected final void service(HttpServletRequest req, HttpServletResponse res)
+      throws ServletException, IOException {
+    final long startNanos = System.nanoTime();
+    long auditStartTs = TimeUtil.nowMs();
+    res.setHeader("Content-Disposition", "attachment");
+    res.setHeader("X-Content-Type-Options", "nosniff");
+    int status = SC_OK;
+    long responseBytes = -1;
+    Object result = null;
+    QueryParams qp = null;
+    Object inputRequestBody = null;
+    RestResource rsrc = TopLevelResource.INSTANCE;
+    ViewData viewData = null;
+
+    try (TraceContext traceContext = enableTracing(req, res)) {
+      try (PerThreadCache ignored = PerThreadCache.create()) {
+        logger.atFinest().log(
+            "Received REST request: %s %s (parameters: %s)",
+            req.getMethod(), req.getRequestURI(), getParameterNames(req));
+        logger.atFinest().log("Calling user: %s", globals.currentUser.get().getLoggableName());
+
+        if (isCorsPreflight(req)) {
+          doCorsPreflight(req, res);
+          return;
+        }
+
+        qp = ParameterParser.getQueryParams(req);
+        checkCors(req, res, qp.hasXdOverride());
+        if (qp.hasXdOverride()) {
+          req = applyXdOverrides(req, qp);
+        }
+        checkUserSession(req);
+
+        List<IdString> path = splitPath(req);
+        RestCollection<RestResource, RestResource> rc = members.get();
+        globals
+            .permissionBackend
+            .currentUser()
+            .checkAny(GlobalPermission.fromAnnotation(rc.getClass()));
+
+        viewData = new ViewData(null, null);
+
+        if (path.isEmpty()) {
+          if (rc instanceof NeedsParams) {
+            ((NeedsParams) rc).setParams(qp.params());
+          }
+
+          if (isRead(req)) {
+            viewData = new ViewData(null, rc.list());
+          } else if (isPost(req)) {
+            RestView<RestResource> restCollectionView =
+                rc.views().get(PluginName.GERRIT, "POST_ON_COLLECTION./");
+            if (restCollectionView != null) {
+              viewData = new ViewData(null, restCollectionView);
+            } else {
+              throw methodNotAllowed(req);
+            }
+          } else {
+            // DELETE on root collections is not supported
+            throw methodNotAllowed(req);
+          }
+        } else {
+          IdString id = path.remove(0);
+          try {
+            rsrc = rc.parse(rsrc, id);
+            if (path.isEmpty()) {
+              checkPreconditions(req);
+            }
+          } catch (ResourceNotFoundException e) {
+            if (!path.isEmpty()) {
+              throw e;
+            }
+
+            if (isPost(req) || isPut(req)) {
+              RestView<RestResource> createView = rc.views().get(PluginName.GERRIT, "CREATE./");
+              if (createView != null) {
+                viewData = new ViewData(null, createView);
+                status = SC_CREATED;
+                path.add(id);
+              } else {
+                throw e;
+              }
+            } else if (isDelete(req)) {
+              RestView<RestResource> deleteView =
+                  rc.views().get(PluginName.GERRIT, "DELETE_MISSING./");
+              if (deleteView != null) {
+                viewData = new ViewData(null, deleteView);
+                status = SC_NO_CONTENT;
+                path.add(id);
+              } else {
+                throw e;
+              }
+            } else {
+              throw e;
+            }
+          }
+          if (viewData.view == null) {
+            viewData = view(rc, req.getMethod(), path);
+          }
+        }
+        checkRequiresCapability(viewData);
+
+        while (viewData.view instanceof RestCollection<?, ?>) {
+          @SuppressWarnings("unchecked")
+          RestCollection<RestResource, RestResource> c =
+              (RestCollection<RestResource, RestResource>) viewData.view;
+
+          if (path.isEmpty()) {
+            if (isRead(req)) {
+              viewData = new ViewData(null, c.list());
+            } else if (isPost(req)) {
+              RestView<RestResource> restCollectionView =
+                  c.views().get(viewData.pluginName, "POST_ON_COLLECTION./");
+              if (restCollectionView != null) {
+                viewData = new ViewData(null, restCollectionView);
+              } else {
+                throw methodNotAllowed(req);
+              }
+            } else if (isDelete(req)) {
+              RestView<RestResource> restCollectionView =
+                  c.views().get(viewData.pluginName, "DELETE_ON_COLLECTION./");
+              if (restCollectionView != null) {
+                viewData = new ViewData(null, restCollectionView);
+              } else {
+                throw methodNotAllowed(req);
+              }
+            } else {
+              throw methodNotAllowed(req);
+            }
+            break;
+          }
+          IdString id = path.remove(0);
+          try {
+            rsrc = c.parse(rsrc, id);
+            checkPreconditions(req);
+            viewData = new ViewData(null, null);
+          } catch (ResourceNotFoundException e) {
+            if (!path.isEmpty()) {
+              throw e;
+            }
+
+            if (isPost(req) || isPut(req)) {
+              RestView<RestResource> createView = c.views().get(PluginName.GERRIT, "CREATE./");
+              if (createView != null) {
+                viewData = new ViewData(null, createView);
+                status = SC_CREATED;
+                path.add(id);
+              } else {
+                throw e;
+              }
+            } else if (isDelete(req)) {
+              RestView<RestResource> deleteView =
+                  c.views().get(PluginName.GERRIT, "DELETE_MISSING./");
+              if (deleteView != null) {
+                viewData = new ViewData(null, deleteView);
+                status = SC_NO_CONTENT;
+                path.add(id);
+              } else {
+                throw e;
+              }
+            } else {
+              throw e;
+            }
+          }
+          if (viewData.view == null) {
+            viewData = view(c, req.getMethod(), path);
+          }
+          checkRequiresCapability(viewData);
+        }
+
+        if (notModified(req, rsrc, viewData.view)) {
+          logger.atFinest().log("REST call succeeded: %d", SC_NOT_MODIFIED);
+          res.sendError(SC_NOT_MODIFIED);
+          return;
+        }
+
+        if (!globals.paramParser.get().parse(viewData.view, qp.params(), req, res)) {
+          return;
+        }
+
+        if (viewData.view instanceof RestReadView<?> && isRead(req)) {
+          result = ((RestReadView<RestResource>) viewData.view).apply(rsrc);
+        } else if (viewData.view instanceof RestModifyView<?, ?>) {
+          @SuppressWarnings("unchecked")
+          RestModifyView<RestResource, Object> m =
+              (RestModifyView<RestResource, Object>) viewData.view;
+
+          Type type = inputType(m);
+          inputRequestBody = parseRequest(req, type);
+          result = m.apply(rsrc, inputRequestBody);
+          if (inputRequestBody instanceof RawInput) {
+            try (InputStream is = req.getInputStream()) {
+              ServletUtils.consumeRequestBody(is);
+            }
+          }
+        } else if (viewData.view instanceof RestCollectionCreateView<?, ?, ?>) {
+          @SuppressWarnings("unchecked")
+          RestCollectionCreateView<RestResource, RestResource, Object> m =
+              (RestCollectionCreateView<RestResource, RestResource, Object>) viewData.view;
+
+          Type type = inputType(m);
+          inputRequestBody = parseRequest(req, type);
+          result = m.apply(rsrc, path.get(0), inputRequestBody);
+          if (inputRequestBody instanceof RawInput) {
+            try (InputStream is = req.getInputStream()) {
+              ServletUtils.consumeRequestBody(is);
+            }
+          }
+        } else if (viewData.view instanceof RestCollectionDeleteMissingView<?, ?, ?>) {
+          @SuppressWarnings("unchecked")
+          RestCollectionDeleteMissingView<RestResource, RestResource, Object> m =
+              (RestCollectionDeleteMissingView<RestResource, RestResource, Object>) viewData.view;
+
+          Type type = inputType(m);
+          inputRequestBody = parseRequest(req, type);
+          result = m.apply(rsrc, path.get(0), inputRequestBody);
+          if (inputRequestBody instanceof RawInput) {
+            try (InputStream is = req.getInputStream()) {
+              ServletUtils.consumeRequestBody(is);
+            }
+          }
+        } else if (viewData.view instanceof RestCollectionModifyView<?, ?, ?>) {
+          @SuppressWarnings("unchecked")
+          RestCollectionModifyView<RestResource, RestResource, Object> m =
+              (RestCollectionModifyView<RestResource, RestResource, Object>) viewData.view;
+
+          Type type = inputType(m);
+          inputRequestBody = parseRequest(req, type);
+          result = m.apply(rsrc, inputRequestBody);
+          if (inputRequestBody instanceof RawInput) {
+            try (InputStream is = req.getInputStream()) {
+              ServletUtils.consumeRequestBody(is);
+            }
+          }
+        } else {
+          throw new ResourceNotFoundException();
+        }
+
+        if (result instanceof Response) {
+          @SuppressWarnings("rawtypes")
+          Response<?> r = (Response) result;
+          status = r.statusCode();
+          configureCaching(req, res, rsrc, viewData.view, r.caching());
+        } else if (result instanceof Response.Redirect) {
+          CacheHeaders.setNotCacheable(res);
+          String location = ((Response.Redirect) result).location();
+          res.sendRedirect(location);
+          logger.atFinest().log("REST call redirected to: %s", location);
+          return;
+        } else if (result instanceof Response.Accepted) {
+          CacheHeaders.setNotCacheable(res);
+          res.setStatus(SC_ACCEPTED);
+          res.setHeader(HttpHeaders.LOCATION, ((Response.Accepted) result).location());
+          logger.atFinest().log("REST call succeeded: %d", SC_ACCEPTED);
+          return;
+        } else {
+          CacheHeaders.setNotCacheable(res);
+        }
+        res.setStatus(status);
+        logger.atFinest().log("REST call succeeded: %d", status);
+
+        if (result != Response.none()) {
+          result = Response.unwrap(result);
+          if (result instanceof BinaryResult) {
+            responseBytes = replyBinaryResult(req, res, (BinaryResult) result);
+          } else {
+            responseBytes = replyJson(req, res, false, qp.config(), result);
+          }
+        }
+      } catch (MalformedJsonException | JsonParseException e) {
+        responseBytes =
+            replyError(
+                req, res, status = SC_BAD_REQUEST, "Invalid " + JSON_TYPE + " in request", e);
+      } catch (BadRequestException e) {
+        responseBytes =
+            replyError(
+                req, res, status = SC_BAD_REQUEST, messageOr(e, "Bad Request"), e.caching(), e);
+      } catch (AuthException e) {
+        responseBytes =
+            replyError(req, res, status = SC_FORBIDDEN, messageOr(e, "Forbidden"), e.caching(), e);
+      } catch (AmbiguousViewException e) {
+        responseBytes = replyError(req, res, status = SC_NOT_FOUND, messageOr(e, "Ambiguous"), e);
+      } catch (ResourceNotFoundException e) {
+        responseBytes =
+            replyError(req, res, status = SC_NOT_FOUND, messageOr(e, "Not Found"), e.caching(), e);
+      } catch (MethodNotAllowedException e) {
+        responseBytes =
+            replyError(
+                req,
+                res,
+                status = SC_METHOD_NOT_ALLOWED,
+                messageOr(e, "Method Not Allowed"),
+                e.caching(),
+                e);
+      } catch (ResourceConflictException e) {
+        responseBytes =
+            replyError(req, res, status = SC_CONFLICT, messageOr(e, "Conflict"), e.caching(), e);
+      } catch (PreconditionFailedException e) {
+        responseBytes =
+            replyError(
+                req,
+                res,
+                status = SC_PRECONDITION_FAILED,
+                messageOr(e, "Precondition Failed"),
+                e.caching(),
+                e);
+      } catch (UnprocessableEntityException e) {
+        responseBytes =
+            replyError(
+                req,
+                res,
+                status = SC_UNPROCESSABLE_ENTITY,
+                messageOr(e, "Unprocessable Entity"),
+                e.caching(),
+                e);
+      } catch (NotImplementedException e) {
+        responseBytes =
+            replyError(req, res, status = SC_NOT_IMPLEMENTED, messageOr(e, "Not Implemented"), e);
+      } catch (UpdateException e) {
+        Throwable t = e.getCause();
+        if (t instanceof LockFailureException) {
+          responseBytes =
+              replyError(
+                  req, res, status = SC_SERVICE_UNAVAILABLE, messageOr(t, "Lock failure"), e);
+        } else {
+          status = SC_INTERNAL_SERVER_ERROR;
+          responseBytes = handleException(e, req, res);
+        }
+      } catch (Exception e) {
+        status = SC_INTERNAL_SERVER_ERROR;
+        responseBytes = handleException(e, req, res);
+      } finally {
+        String metric =
+            viewData != null && viewData.view != null ? globals.metrics.view(viewData) : "_unknown";
+        globals.metrics.count.increment(metric);
+        if (status >= SC_BAD_REQUEST) {
+          globals.metrics.errorCount.increment(metric, status);
+        }
+        if (responseBytes != -1) {
+          globals.metrics.responseBytes.record(metric, responseBytes);
+        }
+        globals.metrics.serverLatency.record(
+            metric, System.nanoTime() - startNanos, TimeUnit.NANOSECONDS);
+        globals.auditService.dispatch(
+            new ExtendedHttpAuditEvent(
+                globals.webSession.get().getSessionId(),
+                globals.currentUser.get(),
+                req,
+                auditStartTs,
+                qp != null ? qp.params() : ImmutableListMultimap.of(),
+                inputRequestBody,
+                status,
+                result,
+                rsrc,
+                viewData == null ? null : viewData.view));
+      }
+    }
+  }
+
+  private static HttpServletRequest applyXdOverrides(HttpServletRequest req, QueryParams qp)
+      throws BadRequestException {
+    if (!isPost(req)) {
+      throw new BadRequestException("POST required");
+    }
+
+    String method = qp.xdMethod();
+    String contentType = qp.xdContentType();
+    if (method.equals("POST") || method.equals("PUT")) {
+      if (!isType(PLAIN_TEXT, req.getContentType())) {
+        throw new BadRequestException("invalid " + CONTENT_TYPE);
+      }
+      if (Strings.isNullOrEmpty(contentType)) {
+        throw new BadRequestException(XD_CONTENT_TYPE + " required");
+      }
+    }
+
+    return new HttpServletRequestWrapper(req) {
+      @Override
+      public String getMethod() {
+        return method;
+      }
+
+      @Override
+      public String getContentType() {
+        return contentType;
+      }
+    };
+  }
+
+  private void checkCors(HttpServletRequest req, HttpServletResponse res, boolean isXd)
+      throws BadRequestException {
+    String origin = req.getHeader(ORIGIN);
+    if (isXd) {
+      // Cross-domain, non-preflighted requests must come from an approved origin.
+      if (Strings.isNullOrEmpty(origin) || !isOriginAllowed(origin)) {
+        throw new BadRequestException("origin not allowed");
+      }
+      res.addHeader(VARY, ORIGIN);
+      res.setHeader(ACCESS_CONTROL_ALLOW_ORIGIN, origin);
+      res.setHeader(ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
+    } else if (!Strings.isNullOrEmpty(origin)) {
+      // All other requests must be processed, but conditionally set CORS headers.
+      if (globals.allowOrigin != null) {
+        res.addHeader(VARY, ORIGIN);
+      }
+      if (isOriginAllowed(origin)) {
+        setCorsHeaders(res, origin);
+      }
+    }
+  }
+
+  private static boolean isCorsPreflight(HttpServletRequest req) {
+    return "OPTIONS".equals(req.getMethod())
+        && !Strings.isNullOrEmpty(req.getHeader(ORIGIN))
+        && !Strings.isNullOrEmpty(req.getHeader(ACCESS_CONTROL_REQUEST_METHOD));
+  }
+
+  private void doCorsPreflight(HttpServletRequest req, HttpServletResponse res)
+      throws BadRequestException {
+    CacheHeaders.setNotCacheable(res);
+    setHeaderList(
+        res,
+        VARY,
+        ImmutableList.of(ORIGIN, ACCESS_CONTROL_REQUEST_METHOD, ACCESS_CONTROL_REQUEST_HEADERS));
+
+    String origin = req.getHeader(ORIGIN);
+    if (Strings.isNullOrEmpty(origin) || !isOriginAllowed(origin)) {
+      throw new BadRequestException("CORS not allowed");
+    }
+
+    String method = req.getHeader(ACCESS_CONTROL_REQUEST_METHOD);
+    if (!ALLOWED_CORS_METHODS.contains(method)) {
+      throw new BadRequestException(method + " not allowed in CORS");
+    }
+
+    String headers = req.getHeader(ACCESS_CONTROL_REQUEST_HEADERS);
+    if (headers != null) {
+      for (String reqHdr : Splitter.on(',').trimResults().split(headers)) {
+        if (!ALLOWED_CORS_REQUEST_HEADERS.contains(reqHdr.toLowerCase(Locale.US))) {
+          throw new BadRequestException(reqHdr + " not allowed in CORS");
+        }
+      }
+    }
+
+    res.setStatus(SC_OK);
+    setCorsHeaders(res, origin);
+    res.setContentType(PLAIN_TEXT);
+    res.setContentLength(0);
+  }
+
+  private static void setCorsHeaders(HttpServletResponse res, String origin) {
+    res.setHeader(ACCESS_CONTROL_ALLOW_ORIGIN, origin);
+    res.setHeader(ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
+    res.setHeader(ACCESS_CONTROL_MAX_AGE, "600");
+    setHeaderList(
+        res,
+        ACCESS_CONTROL_ALLOW_METHODS,
+        Iterables.concat(ALLOWED_CORS_METHODS, ImmutableList.of("OPTIONS")));
+    setHeaderList(res, ACCESS_CONTROL_ALLOW_HEADERS, ALLOWED_CORS_REQUEST_HEADERS);
+  }
+
+  private static void setHeaderList(HttpServletResponse res, String name, Iterable<String> values) {
+    res.setHeader(name, Joiner.on(", ").join(values));
+  }
+
+  private boolean isOriginAllowed(String origin) {
+    return globals.allowOrigin != null && globals.allowOrigin.matcher(origin).matches();
+  }
+
+  private static String messageOr(Throwable t, String defaultMessage) {
+    if (!Strings.isNullOrEmpty(t.getMessage())) {
+      return t.getMessage();
+    }
+    return defaultMessage;
+  }
+
+  @SuppressWarnings({"unchecked", "rawtypes"})
+  private static boolean notModified(
+      HttpServletRequest req, RestResource rsrc, RestView<RestResource> view) {
+    if (!isRead(req)) {
+      return false;
+    }
+
+    if (view instanceof ETagView) {
+      String have = req.getHeader(HttpHeaders.IF_NONE_MATCH);
+      if (have != null) {
+        return have.equals(((ETagView) view).getETag(rsrc));
+      }
+    }
+
+    if (rsrc instanceof RestResource.HasETag) {
+      String have = req.getHeader(HttpHeaders.IF_NONE_MATCH);
+      if (have != null) {
+        return have.equals(((RestResource.HasETag) rsrc).getETag());
+      }
+    }
+
+    if (rsrc instanceof RestResource.HasLastModified) {
+      Timestamp m = ((RestResource.HasLastModified) rsrc).getLastModified();
+      long d = req.getDateHeader(HttpHeaders.IF_MODIFIED_SINCE);
+
+      // HTTP times are in seconds, database may have millisecond precision.
+      return d / 1000L == m.getTime() / 1000L;
+    }
+    return false;
+  }
+
+  private static <R extends RestResource> void configureCaching(
+      HttpServletRequest req, HttpServletResponse res, R rsrc, RestView<R> view, CacheControl c) {
+    if (isRead(req)) {
+      switch (c.getType()) {
+        case NONE:
+        default:
+          CacheHeaders.setNotCacheable(res);
+          break;
+        case PRIVATE:
+          addResourceStateHeaders(res, rsrc, view);
+          CacheHeaders.setCacheablePrivate(res, c.getAge(), c.getUnit(), c.isMustRevalidate());
+          break;
+        case PUBLIC:
+          addResourceStateHeaders(res, rsrc, view);
+          CacheHeaders.setCacheable(req, res, c.getAge(), c.getUnit(), c.isMustRevalidate());
+          break;
+      }
+    } else {
+      CacheHeaders.setNotCacheable(res);
+    }
+  }
+
+  private static <R extends RestResource> void addResourceStateHeaders(
+      HttpServletResponse res, R rsrc, RestView<R> view) {
+    if (view instanceof ETagView) {
+      res.setHeader(HttpHeaders.ETAG, ((ETagView<R>) view).getETag(rsrc));
+    } else if (rsrc instanceof RestResource.HasETag) {
+      res.setHeader(HttpHeaders.ETAG, ((RestResource.HasETag) rsrc).getETag());
+    }
+    if (rsrc instanceof RestResource.HasLastModified) {
+      res.setDateHeader(
+          HttpHeaders.LAST_MODIFIED,
+          ((RestResource.HasLastModified) rsrc).getLastModified().getTime());
+    }
+  }
+
+  private void checkPreconditions(HttpServletRequest req) throws PreconditionFailedException {
+    if ("*".equals(req.getHeader(HttpHeaders.IF_NONE_MATCH))) {
+      throw new PreconditionFailedException("Resource already exists");
+    }
+  }
+
+  private static Type inputType(RestModifyView<RestResource, Object> m) {
+    // MyModifyView implements RestModifyView<SomeResource, MyInput>
+    TypeLiteral<?> typeLiteral = TypeLiteral.get(m.getClass());
+
+    // RestModifyView<SomeResource, MyInput>
+    // This is smart enough to resolve even when there are intervening subclasses, even if they have
+    // reordered type arguments.
+    TypeLiteral<?> supertypeLiteral = typeLiteral.getSupertype(RestModifyView.class);
+
+    Type supertype = supertypeLiteral.getType();
+    checkState(
+        supertype instanceof ParameterizedType,
+        "supertype of %s is not parameterized: %s",
+        typeLiteral,
+        supertypeLiteral);
+    return ((ParameterizedType) supertype).getActualTypeArguments()[1];
+  }
+
+  private static Type inputType(RestCollectionView<RestResource, RestResource, Object> m) {
+    // MyCollectionView implements RestCollectionView<SomeResource, SomeResource, MyInput>
+    TypeLiteral<?> typeLiteral = TypeLiteral.get(m.getClass());
+
+    // RestCollectionView<SomeResource, SomeResource, MyInput>
+    // This is smart enough to resolve even when there are intervening subclasses, even if they have
+    // reordered type arguments.
+    TypeLiteral<?> supertypeLiteral = typeLiteral.getSupertype(RestCollectionView.class);
+
+    Type supertype = supertypeLiteral.getType();
+    checkState(
+        supertype instanceof ParameterizedType,
+        "supertype of %s is not parameterized: %s",
+        typeLiteral,
+        supertypeLiteral);
+    return ((ParameterizedType) supertype).getActualTypeArguments()[2];
+  }
+
+  private Object parseRequest(HttpServletRequest req, Type type)
+      throws IOException, BadRequestException, SecurityException, IllegalArgumentException,
+          NoSuchMethodException, IllegalAccessException, InstantiationException,
+          InvocationTargetException, MethodNotAllowedException {
+    // HTTP/1.1 requires consuming the request body before writing non-error response (less than
+    // 400). Consume the request body for all but raw input request types here.
+    if (isType(JSON_TYPE, req.getContentType())) {
+      try (BufferedReader br = req.getReader();
+          JsonReader json = new JsonReader(br)) {
+        try {
+          json.setLenient(true);
+
+          JsonToken first;
+          try {
+            first = json.peek();
+          } catch (EOFException e) {
+            throw new BadRequestException("Expected JSON object");
+          }
+          if (first == JsonToken.STRING) {
+            return parseString(json.nextString(), type);
+          }
+          return OutputFormat.JSON.newGson().fromJson(json, type);
+        } finally {
+          // Reader.close won't consume the rest of the input. Explicitly consume the request body.
+          br.skip(Long.MAX_VALUE);
+        }
+      }
+    }
+    String method = req.getMethod();
+    if (("PUT".equals(method) || "POST".equals(method)) && acceptsRawInput(type)) {
+      return parseRawInput(req, type);
+    }
+    if (isDelete(req) && hasNoBody(req)) {
+      return null;
+    }
+    if (hasNoBody(req)) {
+      return createInstance(type);
+    }
+    if (isType(PLAIN_TEXT, req.getContentType())) {
+      try (BufferedReader br = req.getReader()) {
+        char[] tmp = new char[256];
+        StringBuilder sb = new StringBuilder();
+        int n;
+        while (0 < (n = br.read(tmp))) {
+          sb.append(tmp, 0, n);
+        }
+        return parseString(sb.toString(), type);
+      }
+    }
+    if (isPost(req) && isType(FORM_TYPE, req.getContentType())) {
+      return OutputFormat.JSON.newGson().fromJson(ParameterParser.formToJson(req), type);
+    }
+    throw new BadRequestException("Expected Content-Type: " + JSON_TYPE);
+  }
+
+  private static boolean hasNoBody(HttpServletRequest req) {
+    int len = req.getContentLength();
+    String type = req.getContentType();
+    return (len <= 0 && type == null) || (len == 0 && isType(FORM_TYPE, type));
+  }
+
+  @SuppressWarnings("rawtypes")
+  private static boolean acceptsRawInput(Type type) {
+    if (type instanceof Class) {
+      for (Field f : ((Class) type).getDeclaredFields()) {
+        if (f.getType() == RawInput.class) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+  private Object parseRawInput(HttpServletRequest req, Type type)
+      throws SecurityException, NoSuchMethodException, IllegalArgumentException,
+          InstantiationException, IllegalAccessException, InvocationTargetException,
+          MethodNotAllowedException {
+    Object obj = createInstance(type);
+    for (Field f : obj.getClass().getDeclaredFields()) {
+      if (f.getType() == RawInput.class) {
+        f.setAccessible(true);
+        f.set(obj, RawInputUtil.create(req));
+        return obj;
+      }
+    }
+    throw new MethodNotAllowedException();
+  }
+
+  private Object parseString(String value, Type type)
+      throws BadRequestException, SecurityException, NoSuchMethodException,
+          IllegalArgumentException, IllegalAccessException, InstantiationException,
+          InvocationTargetException {
+    if (type == String.class) {
+      return value;
+    }
+
+    Object obj = createInstance(type);
+    if (Strings.isNullOrEmpty(value)) {
+      return obj;
+    }
+    Field[] fields = obj.getClass().getDeclaredFields();
+    for (Field f : fields) {
+      if (f.getAnnotation(DefaultInput.class) != null && f.getType() == String.class) {
+        f.setAccessible(true);
+        f.set(obj, value);
+        return obj;
+      }
+    }
+    throw new BadRequestException("Expected JSON object");
+  }
+
+  @SuppressWarnings("unchecked")
+  private static Object createInstance(Type type)
+      throws NoSuchMethodException, InstantiationException, IllegalAccessException,
+          InvocationTargetException {
+    if (type instanceof Class) {
+      Class<Object> clazz = (Class<Object>) type;
+      Constructor<Object> c = clazz.getDeclaredConstructor();
+      c.setAccessible(true);
+      return c.newInstance();
+    }
+    if (type instanceof ParameterizedType) {
+      Type rawType = ((ParameterizedType) type).getRawType();
+      if (rawType instanceof Class && List.class.isAssignableFrom((Class<Object>) rawType)) {
+        return new ArrayList<>();
+      }
+      if (rawType instanceof Class && Map.class.isAssignableFrom((Class<Object>) rawType)) {
+        return new HashMap<>();
+      }
+    }
+    throw new InstantiationException("Cannot make " + type);
+  }
+
+  /**
+   * Sets a JSON reply on the given HTTP servlet response.
+   *
+   * @param req the HTTP servlet request
+   * @param res the HTTP servlet response on which the reply should be set
+   * @param allowTracing whether it is allowed to log the reply if tracing is enabled, must not be
+   *     set to {@code true} if the reply may contain sensitive data
+   * @param config config parameters for the JSON formatting
+   * @param result the object that should be formatted as JSON
+   * @return the length of the response
+   * @throws IOException
+   */
+  public static long replyJson(
+      @Nullable HttpServletRequest req,
+      HttpServletResponse res,
+      boolean allowTracing,
+      ListMultimap<String, String> config,
+      Object result)
+      throws IOException {
+    TemporaryBuffer.Heap buf = heap(HEAP_EST_SIZE, Integer.MAX_VALUE);
+    buf.write(JSON_MAGIC);
+    Writer w = new BufferedWriter(new OutputStreamWriter(buf, UTF_8));
+    Gson gson = newGson(config, req);
+    if (result instanceof JsonElement) {
+      gson.toJson((JsonElement) result, w);
+    } else {
+      gson.toJson(result, w);
+    }
+    w.write('\n');
+    w.flush();
+
+    if (allowTracing) {
+      logger.atFinest().log(
+          "JSON response body:\n%s",
+          lazy(
+              () -> {
+                try {
+                  ByteArrayOutputStream debugOut = new ByteArrayOutputStream();
+                  buf.writeTo(debugOut, null);
+                  return debugOut.toString(UTF_8.name());
+                } catch (IOException e) {
+                  return "<JSON formatting failed>";
+                }
+              }));
+    }
+    return replyBinaryResult(
+        req, res, asBinaryResult(buf).setContentType(JSON_TYPE).setCharacterEncoding(UTF_8));
+  }
+
+  private static Gson newGson(
+      ListMultimap<String, String> config, @Nullable HttpServletRequest req) {
+    GsonBuilder gb = OutputFormat.JSON_COMPACT.newGsonBuilder();
+
+    enablePrettyPrint(gb, config, req);
+    enablePartialGetFields(gb, config);
+
+    return gb.create();
+  }
+
+  private static void enablePrettyPrint(
+      GsonBuilder gb, ListMultimap<String, String> config, @Nullable HttpServletRequest req) {
+    String pp = Iterables.getFirst(config.get("pp"), null);
+    if (pp == null) {
+      pp = Iterables.getFirst(config.get("prettyPrint"), null);
+      if (pp == null && req != null) {
+        pp = acceptsJson(req) ? "0" : "1";
+      }
+    }
+    if ("1".equals(pp) || "true".equals(pp)) {
+      gb.setPrettyPrinting();
+    }
+  }
+
+  private static void enablePartialGetFields(GsonBuilder gb, ListMultimap<String, String> config) {
+    final Set<String> want = new HashSet<>();
+    for (String p : config.get("fields")) {
+      Iterables.addAll(want, OptionUtil.splitOptionValue(p));
+    }
+    if (!want.isEmpty()) {
+      gb.addSerializationExclusionStrategy(
+          new ExclusionStrategy() {
+            private final Map<String, String> names = new HashMap<>();
+
+            @Override
+            public boolean shouldSkipField(FieldAttributes field) {
+              String name = names.get(field.getName());
+              if (name == null) {
+                // Names are supplied by Gson in terms of Java source.
+                // Translate and cache the JSON lower_case_style used.
+                try {
+                  name =
+                      FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES.translateName( //
+                          field.getDeclaringClass().getDeclaredField(field.getName()));
+                  names.put(field.getName(), name);
+                } catch (SecurityException | NoSuchFieldException e) {
+                  return true;
+                }
+              }
+              return !want.contains(name);
+            }
+
+            @Override
+            public boolean shouldSkipClass(Class<?> clazz) {
+              return false;
+            }
+          });
+    }
+  }
+
+  @SuppressWarnings("resource")
+  static long replyBinaryResult(
+      @Nullable HttpServletRequest req, HttpServletResponse res, BinaryResult bin)
+      throws IOException {
+    final BinaryResult appResult = bin;
+    try {
+      if (bin.getAttachmentName() != null) {
+        res.setHeader(
+            "Content-Disposition", "attachment; filename=\"" + bin.getAttachmentName() + "\"");
+      }
+      if (bin.isBase64()) {
+        if (req != null && JSON_TYPE.equals(req.getHeader(HttpHeaders.ACCEPT))) {
+          bin = stackJsonString(res, bin);
+        } else {
+          bin = stackBase64(res, bin);
+        }
+      }
+      if (bin.canGzip() && acceptsGzip(req)) {
+        bin = stackGzip(res, bin);
+      }
+
+      res.setContentType(bin.getContentType());
+      long len = bin.getContentLength();
+      if (0 <= len && len < Integer.MAX_VALUE) {
+        res.setContentLength((int) len);
+      } else if (0 <= len) {
+        res.setHeader("Content-Length", Long.toString(len));
+      }
+
+      if (req == null || !"HEAD".equals(req.getMethod())) {
+        try (CountingOutputStream dst = new CountingOutputStream(res.getOutputStream())) {
+          bin.writeTo(dst);
+          return dst.getCount();
+        }
+      }
+      return 0;
+    } finally {
+      appResult.close();
+    }
+  }
+
+  private static BinaryResult stackJsonString(HttpServletResponse res, BinaryResult src)
+      throws IOException {
+    TemporaryBuffer.Heap buf = heap(HEAP_EST_SIZE, Integer.MAX_VALUE);
+    buf.write(JSON_MAGIC);
+    try (Writer w = new BufferedWriter(new OutputStreamWriter(buf, UTF_8));
+        JsonWriter json = new JsonWriter(w)) {
+      json.setLenient(true);
+      json.setHtmlSafe(true);
+      json.value(src.asString());
+      w.write('\n');
+    }
+    res.setHeader("X-FYI-Content-Encoding", "json");
+    res.setHeader("X-FYI-Content-Type", src.getContentType());
+    return asBinaryResult(buf).setContentType(JSON_TYPE).setCharacterEncoding(UTF_8);
+  }
+
+  private static BinaryResult stackBase64(HttpServletResponse res, BinaryResult src)
+      throws IOException {
+    BinaryResult b64;
+    long len = src.getContentLength();
+    if (0 <= len && len <= (7 << 20)) {
+      b64 = base64(src);
+    } else {
+      b64 =
+          new BinaryResult() {
+            @Override
+            public void writeTo(OutputStream out) throws IOException {
+              try (OutputStreamWriter w =
+                      new OutputStreamWriter(
+                          new FilterOutputStream(out) {
+                            @Override
+                            public void close() {
+                              // Do not close out, but only w and e.
+                            }
+                          },
+                          ISO_8859_1);
+                  OutputStream e = BaseEncoding.base64().encodingStream(w)) {
+                src.writeTo(e);
+              }
+            }
+          };
+    }
+    res.setHeader("X-FYI-Content-Encoding", "base64");
+    res.setHeader("X-FYI-Content-Type", src.getContentType());
+    return b64.setContentType(PLAIN_TEXT).setCharacterEncoding(ISO_8859_1);
+  }
+
+  private static BinaryResult stackGzip(HttpServletResponse res, BinaryResult src)
+      throws IOException {
+    BinaryResult gz;
+    long len = src.getContentLength();
+    if (len < 256) {
+      return src; // Do not compress very small payloads.
+    }
+    if (len <= (10 << 20)) {
+      gz = compress(src);
+      if (len <= gz.getContentLength()) {
+        return src;
+      }
+    } else {
+      gz =
+          new BinaryResult() {
+            @Override
+            public void writeTo(OutputStream out) throws IOException {
+              GZIPOutputStream gz = new GZIPOutputStream(out);
+              src.writeTo(gz);
+              gz.finish();
+              gz.flush();
+            }
+          };
+    }
+    res.setHeader("Content-Encoding", "gzip");
+    return gz.setContentType(src.getContentType());
+  }
+
+  private ViewData view(
+      RestCollection<RestResource, RestResource> rc, String method, List<IdString> path)
+      throws AmbiguousViewException, RestApiException {
+    DynamicMap<RestView<RestResource>> views = rc.views();
+    final IdString projection = path.isEmpty() ? IdString.fromUrl("/") : path.remove(0);
+    if (!path.isEmpty()) {
+      // If there are path components still remaining after this projection
+      // is chosen, look for the projection based upon GET as the method as
+      // the client thinks it is a nested collection.
+      method = "GET";
+    } else if ("HEAD".equals(method)) {
+      method = "GET";
+    }
+
+    List<String> p = splitProjection(projection);
+    if (p.size() == 2) {
+      String viewname = p.get(1);
+      if (Strings.isNullOrEmpty(viewname)) {
+        viewname = "/";
+      }
+      RestView<RestResource> view = views.get(p.get(0), method + "." + viewname);
+      if (view != null) {
+        return new ViewData(p.get(0), view);
+      }
+      view = views.get(p.get(0), "GET." + viewname);
+      if (view != null) {
+        return new ViewData(p.get(0), view);
+      }
+      throw new ResourceNotFoundException(projection);
+    }
+
+    String name = method + "." + p.get(0);
+    RestView<RestResource> core = views.get(PluginName.GERRIT, name);
+    if (core != null) {
+      return new ViewData(PluginName.GERRIT, core);
+    }
+
+    core = views.get(PluginName.GERRIT, "GET." + p.get(0));
+    if (core != null) {
+      return new ViewData(PluginName.GERRIT, core);
+    }
+
+    Map<String, RestView<RestResource>> r = new TreeMap<>();
+    for (String plugin : views.plugins()) {
+      RestView<RestResource> action = views.get(plugin, name);
+      if (action != null) {
+        r.put(plugin, action);
+      }
+    }
+
+    if (r.size() == 1) {
+      Map.Entry<String, RestView<RestResource>> entry = Iterables.getOnlyElement(r.entrySet());
+      return new ViewData(entry.getKey(), entry.getValue());
+    }
+    if (r.isEmpty()) {
+      throw new ResourceNotFoundException(projection);
+    }
+    throw new AmbiguousViewException(
+        String.format(
+            "Projection %s is ambiguous: %s",
+            name, r.keySet().stream().map(in -> in + "~" + projection).collect(joining(", "))));
+  }
+
+  private static List<IdString> splitPath(HttpServletRequest req) {
+    String path = RequestUtil.getEncodedPathInfo(req);
+    if (Strings.isNullOrEmpty(path)) {
+      return Collections.emptyList();
+    }
+    List<IdString> out = new ArrayList<>();
+    for (String p : Splitter.on('/').split(path)) {
+      out.add(IdString.fromUrl(p));
+    }
+    if (out.size() > 0 && out.get(out.size() - 1).isEmpty()) {
+      out.remove(out.size() - 1);
+    }
+    return out;
+  }
+
+  private static List<String> splitProjection(IdString projection) {
+    List<String> p = Lists.newArrayListWithCapacity(2);
+    Iterables.addAll(p, Splitter.on('~').limit(2).split(projection.get()));
+    return p;
+  }
+
+  private void checkUserSession(HttpServletRequest req) throws AuthException {
+    CurrentUser user = globals.currentUser.get();
+    if (isRead(req)) {
+      user.setAccessPath(AccessPath.REST_API);
+    } else if (user instanceof AnonymousUser) {
+      throw new AuthException("Authentication required");
+    } else if (!globals.webSession.get().isAccessPathOk(AccessPath.REST_API)) {
+      throw new AuthException(
+          "Invalid authentication method. In order to authenticate, "
+              + "prefix the REST endpoint URL with /a/ (e.g. http://example.com/a/projects/).");
+    }
+    if (user.isIdentifiedUser()) {
+      user.setLastLoginExternalIdKey(globals.webSession.get().getLastLoginExternalId());
+    }
+  }
+
+  private List<String> getParameterNames(HttpServletRequest req) {
+    List<String> parameterNames = new ArrayList<>(req.getParameterMap().keySet());
+    Collections.sort(parameterNames);
+    return parameterNames;
+  }
+
+  private TraceContext enableTracing(HttpServletRequest req, HttpServletResponse res) {
+    // There are 2 ways to enable tracing for REST calls:
+    // 1. by using the 'trace' or 'trace=<trace-id>' request parameter
+    // 2. by setting the 'X-Gerrit-Trace:' or 'X-Gerrit-Trace:<trace-id>' header
+    String traceValueFromHeader = req.getHeader(X_GERRIT_TRACE);
+    String traceValueFromRequestParam = req.getParameter(ParameterParser.TRACE_PARAMETER);
+    boolean doTrace = traceValueFromHeader != null || traceValueFromRequestParam != null;
+
+    // Check whether no trace ID, one trace ID or 2 different trace IDs have been specified.
+    String traceId1;
+    String traceId2;
+    if (!Strings.isNullOrEmpty(traceValueFromHeader)) {
+      traceId1 = traceValueFromHeader;
+      if (!Strings.isNullOrEmpty(traceValueFromRequestParam)
+          && !traceValueFromHeader.equals(traceValueFromRequestParam)) {
+        traceId2 = traceValueFromRequestParam;
+      } else {
+        traceId2 = null;
+      }
+    } else {
+      traceId1 = Strings.emptyToNull(traceValueFromRequestParam);
+      traceId2 = null;
+    }
+
+    // Use the first trace ID to start tracing. If this trace ID is null, a trace ID will be
+    // generated.
+    TraceContext traceContext =
+        TraceContext.newTrace(
+            doTrace,
+            traceId1,
+            (tagName, traceId) -> res.setHeader(X_GERRIT_TRACE, traceId.toString()));
+    // If a second trace ID was specified, add a tag for it as well.
+    if (traceId2 != null) {
+      traceContext.addTag(RequestId.Type.TRACE_ID, traceId2);
+      res.addHeader(X_GERRIT_TRACE, traceId2);
+    }
+    return traceContext;
+  }
+
+  private boolean isDelete(HttpServletRequest req) {
+    return "DELETE".equals(req.getMethod());
+  }
+
+  private static boolean isPost(HttpServletRequest req) {
+    return "POST".equals(req.getMethod());
+  }
+
+  private boolean isPut(HttpServletRequest req) {
+    return "PUT".equals(req.getMethod());
+  }
+
+  private static boolean isRead(HttpServletRequest req) {
+    return "GET".equals(req.getMethod()) || "HEAD".equals(req.getMethod());
+  }
+
+  private static MethodNotAllowedException methodNotAllowed(HttpServletRequest req) {
+    return new MethodNotAllowedException(
+        String.format("Not implemented: %s %s", req.getMethod(), requestUri(req)));
+  }
+
+  private static String requestUri(HttpServletRequest req) {
+    String uri = req.getRequestURI();
+    if (uri.startsWith("/a/")) {
+      return uri.substring(2);
+    }
+    return uri;
+  }
+
+  private void checkRequiresCapability(ViewData d)
+      throws AuthException, PermissionBackendException {
+    try {
+      globals.permissionBackend.currentUser().check(GlobalPermission.ADMINISTRATE_SERVER);
+    } catch (AuthException e) {
+      // Skiping
+      globals
+          .permissionBackend
+          .currentUser()
+          .checkAny(GlobalPermission.fromAnnotation(d.pluginName, d.view.getClass()));
+    }
+  }
+
+  private static long handleException(
+      Throwable err, HttpServletRequest req, HttpServletResponse res) throws IOException {
+    String uri = req.getRequestURI();
+    if (!Strings.isNullOrEmpty(req.getQueryString())) {
+      uri += "?" + LogRedactUtil.redactQueryString(req.getQueryString());
+    }
+    logger.atSevere().withCause(err).log("Error in %s %s", req.getMethod(), uri);
+    if (!res.isCommitted()) {
+      res.reset();
+      return replyError(req, res, SC_INTERNAL_SERVER_ERROR, "Internal server error", err);
+    }
+    return 0;
+  }
+
+  public static long replyError(
+      HttpServletRequest req,
+      HttpServletResponse res,
+      int statusCode,
+      String msg,
+      @Nullable Throwable err)
+      throws IOException {
+    return replyError(req, res, statusCode, msg, CacheControl.NONE, err);
+  }
+
+  public static long replyError(
+      HttpServletRequest req,
+      HttpServletResponse res,
+      int statusCode,
+      String msg,
+      CacheControl c,
+      @Nullable Throwable err)
+      throws IOException {
+    if (err != null) {
+      RequestUtil.setErrorTraceAttribute(req, err);
+    }
+    configureCaching(req, res, null, null, c);
+    checkArgument(statusCode >= 400, "non-error status: %s", statusCode);
+    res.setStatus(statusCode);
+    logger.atFinest().log("REST call failed: %d", statusCode);
+    return replyText(req, res, true, msg);
+  }
+
+  /**
+   * Sets a text reply on the given HTTP servlet response.
+   *
+   * @param req the HTTP servlet request
+   * @param res the HTTP servlet response on which the reply should be set
+   * @param allowTracing whether it is allowed to log the reply if tracing is enabled, must not be
+   *     set to {@code true} if the reply may contain sensitive data
+   * @param text the text reply
+   * @return the length of the response
+   * @throws IOException
+   */
+  static long replyText(
+      @Nullable HttpServletRequest req, HttpServletResponse res, boolean allowTracing, String text)
+      throws IOException {
+    if ((req == null || isRead(req)) && isMaybeHTML(text)) {
+      return replyJson(
+          req, res, allowTracing, ImmutableListMultimap.of("pp", "0"), new JsonPrimitive(text));
+    }
+    if (!text.endsWith("\n")) {
+      text += "\n";
+    }
+    if (allowTracing) {
+      logger.atFinest().log("Text response body:\n%s", text);
+    }
+    return replyBinaryResult(req, res, BinaryResult.create(text).setContentType(PLAIN_TEXT));
+  }
+
+  private static boolean isMaybeHTML(String text) {
+    return CharMatcher.anyOf("<&").matchesAnyOf(text);
+  }
+
+  private static boolean acceptsJson(HttpServletRequest req) {
+    return req != null && isType(JSON_TYPE, req.getHeader(HttpHeaders.ACCEPT));
+  }
+
+  private static boolean acceptsGzip(HttpServletRequest req) {
+    if (req != null) {
+      String accepts = req.getHeader(HttpHeaders.ACCEPT_ENCODING);
+      return accepts != null && accepts.contains("gzip");
+    }
+    return false;
+  }
+
+  private static boolean isType(String expect, String given) {
+    if (given == null) {
+      return false;
+    }
+    if (expect.equals(given)) {
+      return true;
+    }
+    if (given.startsWith(expect + ",")) {
+      return true;
+    }
+    for (String p : Splitter.on(TYPE_SPLIT_PATTERN).split(given)) {
+      if (expect.equals(p)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  private static int base64MaxSize(long n) {
+    return 4 * IntMath.divide((int) n, 3, CEILING);
+  }
+
+  private static BinaryResult base64(BinaryResult bin) throws IOException {
+    int maxSize = base64MaxSize(bin.getContentLength());
+    int estSize = Math.min(base64MaxSize(HEAP_EST_SIZE), maxSize);
+    TemporaryBuffer.Heap buf = heap(estSize, maxSize);
+    try (OutputStream encoded =
+        BaseEncoding.base64().encodingStream(new OutputStreamWriter(buf, ISO_8859_1))) {
+      bin.writeTo(encoded);
+    }
+    return asBinaryResult(buf);
+  }
+
+  private static BinaryResult compress(BinaryResult bin) throws IOException {
+    TemporaryBuffer.Heap buf = heap(HEAP_EST_SIZE, 20 << 20);
+    try (GZIPOutputStream gz = new GZIPOutputStream(buf)) {
+      bin.writeTo(gz);
+    }
+    return asBinaryResult(buf).setContentType(bin.getContentType());
+  }
+
+  @SuppressWarnings("resource")
+  private static BinaryResult asBinaryResult(TemporaryBuffer.Heap buf) {
+    return new BinaryResult() {
+      @Override
+      public void writeTo(OutputStream os) throws IOException {
+        buf.writeTo(os, null);
+      }
+    }.setContentLength(buf.length());
+  }
+
+  private static Heap heap(int est, int max) {
+    return new TemporaryBuffer.Heap(est, max);
+  }
+
+  private static class AmbiguousViewException extends Exception {
+    private static final long serialVersionUID = 1L;
+
+    AmbiguousViewException(String message) {
+      super(message);
+    }
+  }
+
+  static class ViewData {
+    String pluginName;
+    RestView<RestResource> view;
+
+    ViewData(String pluginName, RestView<RestResource> view) {
+      this.pluginName = pluginName;
+      this.view = view;
+    }
+  }
+}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/AuditedHttpServletResponse.java b/java/com/google/gerrit/httpd/rpc/AuditedHttpServletResponse.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/AuditedHttpServletResponse.java
rename to java/com/google/gerrit/httpd/rpc/AuditedHttpServletResponse.java
diff --git a/java/com/google/gerrit/httpd/rpc/GerritJsonServlet.java b/java/com/google/gerrit/httpd/rpc/GerritJsonServlet.java
new file mode 100644
index 0000000..10307e6
--- /dev/null
+++ b/java/com/google/gerrit/httpd/rpc/GerritJsonServlet.java
@@ -0,0 +1,289 @@
+// Copyright (C) 2008 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.google.gerrit.httpd.rpc;
+
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.audit.Audit;
+import com.google.gerrit.common.auth.SignInRequired;
+import com.google.gerrit.common.errors.NotSignedInException;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.httpd.WebSession;
+import com.google.gerrit.server.AccessPath;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.audit.RpcAuditEvent;
+import com.google.gerrit.server.group.GroupAuditService;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gson.GsonBuilder;
+import com.google.gwtjsonrpc.common.RemoteJsonService;
+import com.google.gwtjsonrpc.server.ActiveCall;
+import com.google.gwtjsonrpc.server.JsonServlet;
+import com.google.gwtjsonrpc.server.MethodHandle;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/** Base JSON servlet to ensure the current user is not forged. */
+final class GerritJsonServlet extends JsonServlet<GerritJsonServlet.GerritCall> {
+  private static final long serialVersionUID = 1L;
+
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final ThreadLocal<GerritCall> currentCall = new ThreadLocal<>();
+  private static final ThreadLocal<MethodHandle> currentMethod = new ThreadLocal<>();
+  private final DynamicItem<WebSession> session;
+  private final RemoteJsonService service;
+  private final GroupAuditService audit;
+
+  @Inject
+  GerritJsonServlet(final DynamicItem<WebSession> w, RemoteJsonService s, GroupAuditService a) {
+    session = w;
+    service = s;
+    audit = a;
+  }
+
+  @Override
+  protected GerritCall createActiveCall(final HttpServletRequest req, HttpServletResponse rsp) {
+    final GerritCall call = new GerritCall(session.get(), req, new AuditedHttpServletResponse(rsp));
+    currentCall.set(call);
+    return call;
+  }
+
+  @Override
+  protected GsonBuilder createGsonBuilder() {
+    return gerritDefaultGsonBuilder();
+  }
+
+  private static GsonBuilder gerritDefaultGsonBuilder() {
+    final GsonBuilder g = defaultGsonBuilder();
+
+    g.registerTypeAdapter(
+        org.eclipse.jgit.diff.Edit.class, new org.eclipse.jgit.diff.EditDeserializer());
+
+    return g;
+  }
+
+  @Override
+  protected void preInvoke(GerritCall call) {
+    super.preInvoke(call);
+
+    if (call.isComplete()) {
+      return;
+    }
+
+    if (call.getMethod().getAnnotation(SignInRequired.class) != null) {
+      // If SignInRequired is set on this method we must have both a
+      // valid XSRF token *and* have the user signed in. Doing these
+      // checks also validates that they agree on the user identity.
+      //
+      if (!call.requireXsrfValid() || !session.get().isSignedIn()) {
+        call.onFailure(new NotSignedInException());
+      }
+    }
+  }
+
+  @Override
+  protected Object createServiceHandle() {
+    return service;
+  }
+
+  @Override
+  protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+    try {
+      super.service(req, resp);
+    } finally {
+      audit();
+      currentCall.set(null);
+    }
+  }
+
+  private void audit() {
+    try {
+      GerritCall call = currentCall.get();
+      MethodHandle method = call.getMethod();
+      if (method == null) {
+        return;
+      }
+      Audit note = method.getAnnotation(Audit.class);
+      if (note != null) {
+        String sid = call.getWebSession().getSessionId();
+        CurrentUser username = call.getWebSession().getUser();
+        ListMultimap<String, ?> args = extractParams(note, call);
+        String what = extractWhat(note, call);
+        Object result = call.getResult();
+
+        audit.dispatch(
+            new RpcAuditEvent(
+                sid,
+                username,
+                what,
+                call.getWhen(),
+                args,
+                call.getHttpServletRequest().getMethod(),
+                call.getHttpServletRequest().getMethod(),
+                ((AuditedHttpServletResponse) (call.getHttpServletResponse())).getStatus(),
+                result));
+      }
+    } catch (Throwable all) {
+      logger.atSevere().withCause(all).log("Unable to log the call");
+    }
+  }
+
+  private ListMultimap<String, ?> extractParams(Audit note, GerritCall call) {
+    ListMultimap<String, Object> args = MultimapBuilder.hashKeys().arrayListValues().build();
+
+    Object[] params = call.getParams();
+    for (int i = 0; i < params.length; i++) {
+      args.put("$" + i, params[i]);
+    }
+
+    for (int idx : note.obfuscate()) {
+      args.removeAll("$" + idx);
+      args.put("$" + idx, "*****");
+    }
+    return args;
+  }
+
+  private String extractWhat(Audit note, GerritCall call) {
+    Class<?> methodClass = call.getMethodClass();
+    String methodClassName = methodClass != null ? methodClass.getName() : "<UNKNOWN_CLASS>";
+    methodClassName = methodClassName.substring(methodClassName.lastIndexOf('.') + 1);
+    String what = note.action();
+    if (what.length() == 0) {
+      what = call.getMethod().getName();
+    }
+
+    return methodClassName + "." + what;
+  }
+
+  static class GerritCall extends ActiveCall {
+    private final WebSession session;
+    private final long when;
+    private static final Field resultField;
+    private static final Field methodField;
+
+    // Needed to allow access to non-public result field in GWT/JSON-RPC
+    static {
+      resultField = getPrivateField(ActiveCall.class, "result");
+      methodField = getPrivateField(MethodHandle.class, "method");
+    }
+
+    private static Field getPrivateField(Class<?> clazz, String fieldName) {
+      Field declaredField = null;
+      try {
+        declaredField = clazz.getDeclaredField(fieldName);
+        declaredField.setAccessible(true);
+      } catch (Exception e) {
+        logger.atSevere().log("Unable to expose RPS/JSON result field");
+      }
+      return declaredField;
+    }
+
+    // Surrogate of the missing getMethodClass() in GWT/JSON-RPC
+    public Class<?> getMethodClass() {
+      if (methodField == null) {
+        return null;
+      }
+
+      try {
+        Method method = (Method) methodField.get(this.getMethod());
+        return method.getDeclaringClass();
+      } catch (IllegalArgumentException e) {
+        logger.atSevere().log("Cannot access result field");
+      } catch (IllegalAccessException e) {
+        logger.atSevere().log("No permissions to access result field");
+      }
+
+      return null;
+    }
+
+    // Surrogate of the missing getResult() in GWT/JSON-RPC
+    public Object getResult() {
+      if (resultField == null) {
+        return null;
+      }
+
+      try {
+        return resultField.get(this);
+      } catch (IllegalArgumentException e) {
+        logger.atSevere().log("Cannot access result field");
+      } catch (IllegalAccessException e) {
+        logger.atSevere().log("No permissions to access result field");
+      }
+
+      return null;
+    }
+
+    GerritCall(WebSession session, HttpServletRequest i, HttpServletResponse o) {
+      super(i, o);
+      this.session = session;
+      this.when = TimeUtil.nowMs();
+    }
+
+    @Override
+    public MethodHandle getMethod() {
+      if (currentMethod.get() == null) {
+        return super.getMethod();
+      }
+      return currentMethod.get();
+    }
+
+    @Override
+    public void onFailure(Throwable error) {
+      if (error instanceof IllegalArgumentException || error instanceof IllegalStateException) {
+        super.onFailure(error);
+      } else if (error instanceof OrmException || error instanceof RuntimeException) {
+        onInternalFailure(error);
+      } else {
+        super.onFailure(error);
+      }
+    }
+
+    @Override
+    public boolean xsrfValidate() {
+      final String keyIn = getXsrfKeyIn();
+      if (keyIn == null || "".equals(keyIn)) {
+        // Anonymous requests don't need XSRF protection, they shouldn't
+        // be able to cause critical state changes.
+        //
+        return !session.isSignedIn();
+
+      } else if (session.isSignedIn() && session.isValidXGerritAuth(keyIn)) {
+        // The session must exist, and must be using this token.
+        //
+        session.getUser().setAccessPath(AccessPath.JSON_RPC);
+        return true;
+      }
+      return false;
+    }
+
+    public WebSession getWebSession() {
+      return session;
+    }
+
+    public long getWhen() {
+      return when;
+    }
+
+    public long getElapsed() {
+      return TimeUtil.nowMs() - when;
+    }
+  }
+}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/GerritJsonServletProvider.java b/java/com/google/gerrit/httpd/rpc/GerritJsonServletProvider.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/GerritJsonServletProvider.java
rename to java/com/google/gerrit/httpd/rpc/GerritJsonServletProvider.java
diff --git a/java/com/google/gerrit/httpd/rpc/Handler.java b/java/com/google/gerrit/httpd/rpc/Handler.java
new file mode 100644
index 0000000..ae20571
--- /dev/null
+++ b/java/com/google/gerrit/httpd/rpc/Handler.java
@@ -0,0 +1,92 @@
+// Copyright (C) 2009 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.google.gerrit.httpd.rpc;
+
+import com.google.gerrit.common.errors.NoSuchEntityException;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.project.NoSuchProjectException;
+import com.google.gerrit.server.project.NoSuchRefException;
+import com.google.gwtjsonrpc.common.AsyncCallback;
+import com.google.gwtjsonrpc.common.VoidResult;
+import com.google.gwtorm.server.OrmException;
+import java.util.concurrent.Callable;
+
+/**
+ * Base class for RPC service implementations.
+ *
+ * <p>Typically an RPC service implementation will extend this class and use Guice injection to
+ * manage its state. For example:
+ *
+ * <pre>
+ *   class Foo extends Handler&lt;Result&gt; {
+ *     interface Factory {
+ *       Foo create(... args ...);
+ *     }
+ *     &#064;Inject
+ *     Foo(state, @Assisted args) { ... }
+ *     Result get() throws Exception { ... }
+ *   }
+ * </pre>
+ *
+ * @param <T> type of result for {@link AsyncCallback#onSuccess(Object)} if the operation completed
+ *     successfully.
+ */
+public abstract class Handler<T> implements Callable<T> {
+  public static <T> Handler<T> wrap(Callable<T> r) {
+    return new Handler<T>() {
+      @Override
+      public T call() throws Exception {
+        return r.call();
+      }
+    };
+  }
+
+  /**
+   * Run the operation and pass the result to the callback.
+   *
+   * @param callback callback to receive the result of {@link #call()}.
+   */
+  public final void to(AsyncCallback<T> callback) {
+    try {
+      final T r = call();
+      if (r != null) {
+        callback.onSuccess(r);
+      }
+    } catch (NoSuchProjectException | NoSuchChangeException | NoSuchRefException e) {
+      callback.onFailure(new NoSuchEntityException());
+
+    } catch (OrmException e) {
+      if (e.getCause() instanceof NoSuchEntityException) {
+        callback.onFailure(e.getCause());
+
+      } else {
+        callback.onFailure(e);
+      }
+    } catch (Exception e) {
+      callback.onFailure(e);
+    }
+  }
+
+  /**
+   * Compute the operation result.
+   *
+   * @return the result of the operation. Return {@link VoidResult#INSTANCE} if there is no
+   *     meaningful return value for the operation.
+   * @throws Exception the operation failed. The caller will log the exception and the stack trace,
+   *     if it is worth logging on the server side.
+   */
+  @Override
+  public abstract T call() throws Exception;
+}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/RpcServletModule.java b/java/com/google/gerrit/httpd/rpc/RpcServletModule.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/RpcServletModule.java
rename to java/com/google/gerrit/httpd/rpc/RpcServletModule.java
diff --git a/java/com/google/gerrit/httpd/rpc/SystemInfoServiceImpl.java b/java/com/google/gerrit/httpd/rpc/SystemInfoServiceImpl.java
new file mode 100644
index 0000000..634e8d8
--- /dev/null
+++ b/java/com/google/gerrit/httpd/rpc/SystemInfoServiceImpl.java
@@ -0,0 +1,68 @@
+// Copyright (C) 2008 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.google.gerrit.httpd.rpc;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.SshHostKey;
+import com.google.gerrit.common.data.SystemInfoService;
+import com.google.gerrit.server.ssh.SshInfo;
+import com.google.gwtjsonrpc.common.AsyncCallback;
+import com.google.gwtjsonrpc.common.VoidResult;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.jcraft.jsch.HostKey;
+import com.jcraft.jsch.JSch;
+import java.util.ArrayList;
+import java.util.List;
+import javax.servlet.http.HttpServletRequest;
+
+class SystemInfoServiceImpl implements SystemInfoService {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final JSch JSCH = new JSch();
+
+  private final List<HostKey> hostKeys;
+  private final Provider<HttpServletRequest> httpRequest;
+
+  @Inject
+  SystemInfoServiceImpl(SshInfo daemon, Provider<HttpServletRequest> hsr) {
+    hostKeys = daemon.getHostKeys();
+    httpRequest = hsr;
+  }
+
+  @Override
+  public void daemonHostKeys(AsyncCallback<List<SshHostKey>> callback) {
+    final ArrayList<SshHostKey> r = new ArrayList<>(hostKeys.size());
+    for (HostKey hk : hostKeys) {
+      String host = hk.getHost();
+      if (host.startsWith("*:")) {
+        final String port = host.substring(2);
+        host = "[" + httpRequest.get().getServerName() + "]:" + port;
+      }
+      final String fp = hk.getFingerPrint(JSCH);
+      r.add(new SshHostKey(host, hk.getType() + " " + hk.getKey(), fp));
+    }
+    callback.onSuccess(r);
+  }
+
+  @Override
+  public void clientError(String message, AsyncCallback<VoidResult> callback) {
+    HttpServletRequest r = httpRequest.get();
+    String ua = r.getHeader("User-Agent");
+    message = message.replaceAll("\n", "\n  ");
+    logger.atSevere().log("Client UI JavaScript error: User-Agent=%s: %s", ua, message);
+    callback.onSuccess(VoidResult.INSTANCE);
+  }
+}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/UiRpcModule.java b/java/com/google/gerrit/httpd/rpc/UiRpcModule.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/UiRpcModule.java
rename to java/com/google/gerrit/httpd/rpc/UiRpcModule.java
diff --git a/java/com/google/gerrit/httpd/rpc/project/ChangeProjectAccess.java b/java/com/google/gerrit/httpd/rpc/project/ChangeProjectAccess.java
new file mode 100644
index 0000000..24efb86
--- /dev/null
+++ b/java/com/google/gerrit/httpd/rpc/project/ChangeProjectAccess.java
@@ -0,0 +1,116 @@
+// Copyright (C) 2010 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.google.gerrit.httpd.rpc.project;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.ProjectAccess;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.CreateGroupPermissionSyncer;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ContributorAgreementsChecker;
+import com.google.gerrit.server.project.NoSuchProjectException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.server.restapi.project.SetParent;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.util.List;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.revwalk.RevCommit;
+
+class ChangeProjectAccess extends ProjectAccessHandler<ProjectAccess> {
+  interface Factory {
+    ChangeProjectAccess create(
+        @Assisted("projectName") Project.NameKey projectName,
+        @Nullable @Assisted ObjectId base,
+        @Assisted List<AccessSection> sectionList,
+        @Nullable @Assisted("parentProjectName") Project.NameKey parentProjectName,
+        @Nullable @Assisted String message);
+  }
+
+  private final GitReferenceUpdated gitRefUpdated;
+  private final ProjectAccessFactory.Factory projectAccessFactory;
+  private final ProjectCache projectCache;
+  private final CreateGroupPermissionSyncer createGroupPermissionSyncer;
+
+  @Inject
+  ChangeProjectAccess(
+      ProjectAccessFactory.Factory projectAccessFactory,
+      ProjectCache projectCache,
+      GroupBackend groupBackend,
+      MetaDataUpdate.User metaDataUpdateFactory,
+      AllProjectsName allProjects,
+      Provider<SetParent> setParent,
+      GitReferenceUpdated gitRefUpdated,
+      ContributorAgreementsChecker contributorAgreements,
+      Provider<CurrentUser> user,
+      PermissionBackend permissionBackend,
+      CreateGroupPermissionSyncer createGroupPermissionSyncer,
+      @Assisted("projectName") Project.NameKey projectName,
+      @Nullable @Assisted ObjectId base,
+      @Assisted List<AccessSection> sectionList,
+      @Nullable @Assisted("parentProjectName") Project.NameKey parentProjectName,
+      @Nullable @Assisted String message) {
+    super(
+        groupBackend,
+        metaDataUpdateFactory,
+        allProjects,
+        setParent,
+        user.get(),
+        projectName,
+        base,
+        sectionList,
+        parentProjectName,
+        message,
+        contributorAgreements,
+        permissionBackend,
+        true);
+    this.projectAccessFactory = projectAccessFactory;
+    this.projectCache = projectCache;
+    this.gitRefUpdated = gitRefUpdated;
+    this.createGroupPermissionSyncer = createGroupPermissionSyncer;
+  }
+
+  @Override
+  protected ProjectAccess updateProjectConfig(
+      ProjectConfig config, MetaDataUpdate md, boolean parentProjectUpdate)
+      throws IOException, NoSuchProjectException, ConfigInvalidException,
+          PermissionBackendException, ResourceConflictException {
+    RevCommit commit = config.commit(md);
+
+    gitRefUpdated.fire(
+        config.getProject().getNameKey(),
+        RefNames.REFS_CONFIG,
+        base,
+        commit.getId(),
+        user.asIdentifiedUser().state());
+
+    projectCache.evict(config.getProject());
+    createGroupPermissionSyncer.syncIfNeeded();
+    return projectAccessFactory.create(projectName).call();
+  }
+}
diff --git a/java/com/google/gerrit/httpd/rpc/project/ProjectAccessFactory.java b/java/com/google/gerrit/httpd/rpc/project/ProjectAccessFactory.java
new file mode 100644
index 0000000..6193e45
--- /dev/null
+++ b/java/com/google/gerrit/httpd/rpc/project/ProjectAccessFactory.java
@@ -0,0 +1,295 @@
+// Copyright (C) 2011 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.google.gerrit.httpd.rpc.project;
+
+import static com.google.gerrit.server.permissions.GlobalPermission.ADMINISTRATE_SERVER;
+import static com.google.gerrit.server.permissions.RefPermission.CREATE_CHANGE;
+import static com.google.gerrit.server.permissions.RefPermission.READ;
+import static com.google.gerrit.server.permissions.RefPermission.WRITE_CONFIG;
+
+import com.google.common.collect.Maps;
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.common.data.GroupInfo;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.common.data.PermissionRule;
+import com.google.gerrit.common.data.ProjectAccess;
+import com.google.gerrit.common.data.RefConfigSection;
+import com.google.gerrit.common.data.WebLinkInfoCommon;
+import com.google.gerrit.common.errors.NoSuchGroupException;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.httpd.rpc.Handler;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.WebLinks;
+import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.account.GroupControl;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.gerrit.server.project.NoSuchProjectException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+class ProjectAccessFactory extends Handler<ProjectAccess> {
+  interface Factory {
+    ProjectAccessFactory create(@Assisted Project.NameKey name);
+  }
+
+  private final GroupBackend groupBackend;
+  private final ProjectCache projectCache;
+  private final PermissionBackend permissionBackend;
+  private final GroupControl.Factory groupControlFactory;
+  private final MetaDataUpdate.Server metaDataUpdateFactory;
+  private final AllProjectsName allProjectsName;
+
+  private final Project.NameKey projectName;
+  private WebLinks webLinks;
+
+  @Inject
+  ProjectAccessFactory(
+      GroupBackend groupBackend,
+      ProjectCache projectCache,
+      PermissionBackend permissionBackend,
+      GroupControl.Factory groupControlFactory,
+      MetaDataUpdate.Server metaDataUpdateFactory,
+      AllProjectsName allProjectsName,
+      WebLinks webLinks,
+      @Assisted final Project.NameKey name) {
+    this.groupBackend = groupBackend;
+    this.projectCache = projectCache;
+    this.permissionBackend = permissionBackend;
+    this.groupControlFactory = groupControlFactory;
+    this.metaDataUpdateFactory = metaDataUpdateFactory;
+    this.allProjectsName = allProjectsName;
+    this.webLinks = webLinks;
+
+    this.projectName = name;
+  }
+
+  @Override
+  public ProjectAccess call()
+      throws NoSuchProjectException, IOException, ConfigInvalidException,
+          PermissionBackendException, ResourceConflictException {
+    ProjectState projectState = checkProjectState();
+
+    // Load the current configuration from the repository, ensuring its the most
+    // recent version available. If it differs from what was in the project
+    // state, force a cache flush now.
+    //
+    ProjectConfig config;
+    try (MetaDataUpdate md = metaDataUpdateFactory.create(projectName)) {
+      config = ProjectConfig.read(md);
+      if (config.updateGroupNames(groupBackend)) {
+        md.setMessage("Update group names\n");
+        config.commit(md);
+        projectCache.evict(config.getProject());
+        projectState = checkProjectState();
+      } else if (config.getRevision() != null
+          && !config.getRevision().equals(projectState.getConfig().getRevision())) {
+        projectCache.evict(config.getProject());
+        projectState = checkProjectState();
+      }
+    }
+
+    // The following implementation must match the GetAccess REST API endpoint.
+
+    List<AccessSection> local = new ArrayList<>();
+    Set<String> ownerOf = new HashSet<>();
+    Map<AccountGroup.UUID, Boolean> visibleGroups = new HashMap<>();
+    PermissionBackend.ForProject perm = permissionBackend.currentUser().project(projectName);
+    boolean checkReadConfig = check(perm, RefNames.REFS_CONFIG, READ);
+    boolean canWriteProjectConfig = true;
+    try {
+      perm.check(ProjectPermission.WRITE_CONFIG);
+    } catch (AuthException e) {
+      canWriteProjectConfig = false;
+    }
+
+    for (AccessSection section : config.getAccessSections()) {
+      String name = section.getName();
+      if (AccessSection.GLOBAL_CAPABILITIES.equals(name)) {
+        if (canWriteProjectConfig) {
+          local.add(section);
+          ownerOf.add(name);
+
+        } else if (checkReadConfig) {
+          local.add(section);
+        }
+
+      } else if (RefConfigSection.isValid(name)) {
+        if (check(perm, name, WRITE_CONFIG)) {
+          local.add(section);
+          ownerOf.add(name);
+
+        } else if (checkReadConfig) {
+          local.add(section);
+
+        } else if (check(perm, name, READ)) {
+          // Filter the section to only add rules describing groups that
+          // are visible to the current-user. This includes any group the
+          // user is a member of, as well as groups they own or that
+          // are visible to all users.
+
+          AccessSection dst = null;
+          for (Permission srcPerm : section.getPermissions()) {
+            Permission dstPerm = null;
+
+            for (PermissionRule srcRule : srcPerm.getRules()) {
+              AccountGroup.UUID group = srcRule.getGroup().getUUID();
+              if (group == null) {
+                continue;
+              }
+
+              Boolean canSeeGroup = visibleGroups.get(group);
+              if (canSeeGroup == null) {
+                try {
+                  canSeeGroup = groupControlFactory.controlFor(group).isVisible();
+                } catch (NoSuchGroupException e) {
+                  canSeeGroup = Boolean.FALSE;
+                }
+                visibleGroups.put(group, canSeeGroup);
+              }
+
+              if (canSeeGroup) {
+                if (dstPerm == null) {
+                  if (dst == null) {
+                    dst = new AccessSection(name);
+                    local.add(dst);
+                  }
+                  dstPerm = dst.getPermission(srcPerm.getName(), true);
+                }
+                dstPerm.add(srcRule);
+              }
+            }
+          }
+        }
+      }
+    }
+
+    if (ownerOf.isEmpty() && isAdmin()) {
+      // Special case: If the section list is empty, this project has no current
+      // access control information. Fall back to site administrators.
+      ownerOf.add(AccessSection.ALL);
+    }
+
+    final ProjectAccess detail = new ProjectAccess();
+    detail.setProjectName(projectName);
+
+    if (config.getRevision() != null) {
+      detail.setRevision(config.getRevision().name());
+    }
+
+    detail.setInheritsFrom(config.getProject().getParent(allProjectsName));
+
+    if (projectName.equals(allProjectsName)
+        && permissionBackend.currentUser().testOrFalse(ADMINISTRATE_SERVER)) {
+      ownerOf.add(AccessSection.GLOBAL_CAPABILITIES);
+    }
+
+    detail.setLocal(local);
+    detail.setOwnerOf(ownerOf);
+    detail.setCanUpload(
+        canWriteProjectConfig
+            || (checkReadConfig
+                && perm.ref(RefNames.REFS_CONFIG).testOrFalse(CREATE_CHANGE)
+                && projectState.statePermitsWrite()));
+    detail.setConfigVisible(canWriteProjectConfig || checkReadConfig);
+    detail.setGroupInfo(buildGroupInfo(local));
+    detail.setLabelTypes(projectState.getLabelTypes());
+    detail.setFileHistoryLinks(getConfigFileLogLinks(projectName.get()));
+    return detail;
+  }
+
+  private List<WebLinkInfoCommon> getConfigFileLogLinks(String projectName) {
+    List<WebLinkInfoCommon> links =
+        webLinks.getFileHistoryLinks(
+            projectName, RefNames.REFS_CONFIG, ProjectConfig.PROJECT_CONFIG);
+    return links.isEmpty() ? null : links;
+  }
+
+  private Map<AccountGroup.UUID, GroupInfo> buildGroupInfo(List<AccessSection> local) {
+    Map<AccountGroup.UUID, GroupInfo> infos = new HashMap<>();
+    for (AccessSection section : local) {
+      for (Permission permission : section.getPermissions()) {
+        for (PermissionRule rule : permission.getRules()) {
+          if (rule.getGroup() != null) {
+            AccountGroup.UUID uuid = rule.getGroup().getUUID();
+            if (uuid != null && !infos.containsKey(uuid)) {
+              GroupDescription.Basic group = groupBackend.get(uuid);
+              infos.put(uuid, group != null ? new GroupInfo(group) : null);
+            }
+          }
+        }
+      }
+    }
+    return Maps.filterEntries(infos, in -> in.getValue() != null);
+  }
+
+  private ProjectState checkProjectState()
+      throws NoSuchProjectException, IOException, PermissionBackendException,
+          ResourceConflictException {
+    ProjectState state = projectCache.checkedGet(projectName);
+    // Hidden projects(permitsRead = false) should only be accessible by the project owners.
+    // READ_CONFIG is checked here because it's only allowed to project owners(ACCESS may also
+    // be allowed for other users). Allowing project owners to access here will help them to view
+    // and update the config of hidden projects easily.
+    ProjectPermission permissionToCheck =
+        state.statePermitsRead() ? ProjectPermission.ACCESS : ProjectPermission.READ_CONFIG;
+    try {
+      permissionBackend.currentUser().project(projectName).check(permissionToCheck);
+    } catch (AuthException e) {
+      throw new NoSuchProjectException(projectName);
+    }
+    state.checkStatePermitsRead();
+    return state;
+  }
+
+  private static boolean check(PermissionBackend.ForProject ctx, String ref, RefPermission perm)
+      throws PermissionBackendException {
+    try {
+      ctx.ref(ref).check(perm);
+      return true;
+    } catch (AuthException denied) {
+      return false;
+    }
+  }
+
+  private boolean isAdmin() throws PermissionBackendException {
+    try {
+      permissionBackend.currentUser().check(GlobalPermission.ADMINISTRATE_SERVER);
+      return true;
+    } catch (AuthException e) {
+      return false;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/httpd/rpc/project/ProjectAccessHandler.java b/java/com/google/gerrit/httpd/rpc/project/ProjectAccessHandler.java
new file mode 100644
index 0000000..44c8966
--- /dev/null
+++ b/java/com/google/gerrit/httpd/rpc/project/ProjectAccessHandler.java
@@ -0,0 +1,251 @@
+// Copyright (C) 2012 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.google.gerrit.httpd.rpc.project;
+
+import static com.google.gerrit.common.ProjectAccessUtil.mergeSections;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.base.MoreObjects;
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.common.data.PermissionRule;
+import com.google.gerrit.common.errors.InvalidNameException;
+import com.google.gerrit.common.errors.NoSuchGroupException;
+import com.google.gerrit.common.errors.UpdateParentFailedException;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.httpd.rpc.Handler;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.account.GroupBackends;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.gerrit.server.project.ContributorAgreementsChecker;
+import com.google.gerrit.server.project.NoSuchProjectException;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.server.project.RefPattern;
+import com.google.gerrit.server.restapi.project.SetParent;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.ObjectId;
+
+public abstract class ProjectAccessHandler<T> extends Handler<T> {
+
+  protected final GroupBackend groupBackend;
+  protected final Project.NameKey projectName;
+  protected final ObjectId base;
+  protected final CurrentUser user;
+
+  private final MetaDataUpdate.User metaDataUpdateFactory;
+  private final AllProjectsName allProjects;
+  private final Provider<SetParent> setParent;
+  private final ContributorAgreementsChecker contributorAgreements;
+  private final PermissionBackend permissionBackend;
+  private final Project.NameKey parentProjectName;
+
+  protected String message;
+
+  private List<AccessSection> sectionList;
+  private boolean checkIfOwner;
+  private Boolean canWriteConfig;
+
+  protected ProjectAccessHandler(
+      GroupBackend groupBackend,
+      MetaDataUpdate.User metaDataUpdateFactory,
+      AllProjectsName allProjects,
+      Provider<SetParent> setParent,
+      CurrentUser user,
+      Project.NameKey projectName,
+      ObjectId base,
+      List<AccessSection> sectionList,
+      Project.NameKey parentProjectName,
+      String message,
+      ContributorAgreementsChecker contributorAgreements,
+      PermissionBackend permissionBackend,
+      boolean checkIfOwner) {
+    this.groupBackend = groupBackend;
+    this.metaDataUpdateFactory = metaDataUpdateFactory;
+    this.allProjects = allProjects;
+    this.setParent = setParent;
+    this.user = user;
+
+    this.projectName = projectName;
+    this.base = base;
+    this.sectionList = sectionList;
+    this.parentProjectName = parentProjectName;
+    this.message = message;
+    this.contributorAgreements = contributorAgreements;
+    this.permissionBackend = permissionBackend;
+    this.checkIfOwner = checkIfOwner;
+  }
+
+  @Override
+  public final T call()
+      throws NoSuchProjectException, IOException, ConfigInvalidException, InvalidNameException,
+          NoSuchGroupException, OrmException, UpdateParentFailedException, AuthException,
+          PermissionBackendException, ResourceConflictException {
+    contributorAgreements.check(projectName, user);
+
+    try (MetaDataUpdate md = metaDataUpdateFactory.create(projectName)) {
+      ProjectConfig config = ProjectConfig.read(md, base);
+      Set<String> toDelete = scanSectionNames(config);
+      PermissionBackend.ForProject forProject = permissionBackend.user(user).project(projectName);
+
+      for (AccessSection section : mergeSections(sectionList)) {
+        String name = section.getName();
+
+        if (AccessSection.GLOBAL_CAPABILITIES.equals(name)) {
+          if (checkIfOwner && !canWriteConfig()) {
+            continue;
+          }
+          replace(config, toDelete, section);
+
+        } else if (AccessSection.isValid(name)) {
+          if (checkIfOwner) {
+            try {
+              forProject.ref(name).check(RefPermission.WRITE_CONFIG);
+            } catch (AuthException e) {
+              continue;
+            }
+          }
+
+          RefPattern.validate(name);
+
+          replace(config, toDelete, section);
+        }
+      }
+
+      for (String name : toDelete) {
+        if (AccessSection.GLOBAL_CAPABILITIES.equals(name)) {
+          if (!checkIfOwner || canWriteConfig()) {
+            config.remove(config.getAccessSection(name));
+          }
+
+        } else if (!checkIfOwner) {
+          config.remove(config.getAccessSection(name));
+        } else {
+          try {
+            forProject.ref(name).check(RefPermission.WRITE_CONFIG);
+            config.remove(config.getAccessSection(name));
+          } catch (AuthException e) {
+            // Do nothing.
+          }
+        }
+      }
+
+      boolean parentProjectUpdate = false;
+      if (!config.getProject().getNameKey().equals(allProjects)
+          && !config.getProject().getParent(allProjects).equals(parentProjectName)) {
+        parentProjectUpdate = true;
+        try {
+          setParent
+              .get()
+              .validateParentUpdate(
+                  projectName,
+                  user.asIdentifiedUser(),
+                  MoreObjects.firstNonNull(parentProjectName, allProjects).get(),
+                  checkIfOwner);
+        } catch (AuthException e) {
+          throw new UpdateParentFailedException(
+              "You are not allowed to change the parent project since you are "
+                  + "not an administrator. You may save the modifications for review "
+                  + "so that an administrator can approve them.",
+              e);
+        } catch (ResourceConflictException | UnprocessableEntityException | BadRequestException e) {
+          throw new UpdateParentFailedException(e.getMessage(), e);
+        }
+        config.getProject().setParentName(parentProjectName);
+      }
+
+      if (message != null && !message.isEmpty()) {
+        if (!message.endsWith("\n")) {
+          message += "\n";
+        }
+        md.setMessage(message);
+      } else {
+        md.setMessage("Modify access rules\n");
+      }
+
+      return updateProjectConfig(config, md, parentProjectUpdate);
+    } catch (RepositoryNotFoundException notFound) {
+      throw new NoSuchProjectException(projectName);
+    }
+  }
+
+  protected abstract T updateProjectConfig(
+      ProjectConfig config, MetaDataUpdate md, boolean parentProjectUpdate)
+      throws IOException, NoSuchProjectException, ConfigInvalidException, OrmException,
+          AuthException, PermissionBackendException, ResourceConflictException;
+
+  private void replace(ProjectConfig config, Set<String> toDelete, AccessSection section)
+      throws NoSuchGroupException {
+    for (Permission permission : section.getPermissions()) {
+      for (PermissionRule rule : permission.getRules()) {
+        lookupGroup(rule);
+      }
+    }
+    config.replace(section);
+    toDelete.remove(section.getName());
+  }
+
+  private static Set<String> scanSectionNames(ProjectConfig config) {
+    Set<String> names = new HashSet<>();
+    for (AccessSection section : config.getAccessSections()) {
+      names.add(section.getName());
+    }
+    return names;
+  }
+
+  private void lookupGroup(PermissionRule rule) throws NoSuchGroupException {
+    GroupReference ref = rule.getGroup();
+    if (ref.getUUID() == null) {
+      final GroupReference group = GroupBackends.findBestSuggestion(groupBackend, ref.getName());
+      if (group == null) {
+        throw new NoSuchGroupException(ref.getName());
+      }
+      ref.setUUID(group.getUUID());
+    }
+  }
+
+  /** Provide a local cache for {@code ProjectPermission.WRITE_CONFIG} capability. */
+  private boolean canWriteConfig() throws PermissionBackendException {
+    requireNonNull(user);
+
+    if (canWriteConfig != null) {
+      return canWriteConfig;
+    }
+    try {
+      permissionBackend.user(user).project(projectName).check(ProjectPermission.WRITE_CONFIG);
+      canWriteConfig = true;
+    } catch (AuthException e) {
+      canWriteConfig = false;
+    }
+    return canWriteConfig;
+  }
+}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAdminServiceImpl.java b/java/com/google/gerrit/httpd/rpc/project/ProjectAdminServiceImpl.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAdminServiceImpl.java
rename to java/com/google/gerrit/httpd/rpc/project/ProjectAdminServiceImpl.java
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectModule.java b/java/com/google/gerrit/httpd/rpc/project/ProjectModule.java
similarity index 100%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectModule.java
rename to java/com/google/gerrit/httpd/rpc/project/ProjectModule.java
diff --git a/java/com/google/gerrit/httpd/rpc/project/ReviewProjectAccess.java b/java/com/google/gerrit/httpd/rpc/project/ReviewProjectAccess.java
new file mode 100644
index 0000000..6a43a1d
--- /dev/null
+++ b/java/com/google/gerrit/httpd/rpc/project/ReviewProjectAccess.java
@@ -0,0 +1,245 @@
+// Copyright (C) 2012 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.google.gerrit.httpd.rpc.project;
+
+import com.google.common.base.Throwables;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.common.data.PermissionRule;
+import com.google.gerrit.extensions.api.changes.AddReviewerInput;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.Sequences;
+import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.change.ChangeInserter;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.gerrit.server.project.ContributorAgreementsChecker;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.server.restapi.change.ChangesCollection;
+import com.google.gerrit.server.restapi.change.PostReviewers;
+import com.google.gerrit.server.restapi.project.SetParent;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.util.List;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+public class ReviewProjectAccess extends ProjectAccessHandler<Change.Id> {
+  interface Factory {
+    ReviewProjectAccess create(
+        @Assisted("projectName") Project.NameKey projectName,
+        @Nullable @Assisted ObjectId base,
+        @Assisted List<AccessSection> sectionList,
+        @Nullable @Assisted("parentProjectName") Project.NameKey parentProjectName,
+        @Nullable @Assisted String message);
+  }
+
+  private final ReviewDb db;
+  private final PermissionBackend permissionBackend;
+  private final Sequences seq;
+  private final Provider<PostReviewers> reviewersProvider;
+  private final ProjectCache projectCache;
+  private final ChangesCollection changes;
+  private final ChangeInserter.Factory changeInserterFactory;
+  private final BatchUpdate.Factory updateFactory;
+  private final boolean allowProjectOwnersToChangeParent;
+
+  @Inject
+  ReviewProjectAccess(
+      PermissionBackend permissionBackend,
+      GroupBackend groupBackend,
+      MetaDataUpdate.User metaDataUpdateFactory,
+      ReviewDb db,
+      Provider<PostReviewers> reviewersProvider,
+      ProjectCache projectCache,
+      AllProjectsName allProjects,
+      ChangesCollection changes,
+      ChangeInserter.Factory changeInserterFactory,
+      BatchUpdate.Factory updateFactory,
+      Provider<SetParent> setParent,
+      Sequences seq,
+      ContributorAgreementsChecker contributorAgreements,
+      Provider<CurrentUser> user,
+      @GerritServerConfig Config config,
+      @Assisted("projectName") Project.NameKey projectName,
+      @Nullable @Assisted ObjectId base,
+      @Assisted List<AccessSection> sectionList,
+      @Nullable @Assisted("parentProjectName") Project.NameKey parentProjectName,
+      @Nullable @Assisted String message) {
+    super(
+        groupBackend,
+        metaDataUpdateFactory,
+        allProjects,
+        setParent,
+        user.get(),
+        projectName,
+        base,
+        sectionList,
+        parentProjectName,
+        message,
+        contributorAgreements,
+        permissionBackend,
+        false);
+    this.db = db;
+    this.permissionBackend = permissionBackend;
+    this.seq = seq;
+    this.reviewersProvider = reviewersProvider;
+    this.projectCache = projectCache;
+    this.changes = changes;
+    this.changeInserterFactory = changeInserterFactory;
+    this.updateFactory = updateFactory;
+    this.allowProjectOwnersToChangeParent =
+        config.getBoolean("receive", "allowProjectOwnersToChangeParent", false);
+  }
+
+  // TODO(dborowitz): Hack MetaDataUpdate so it can be created within a BatchUpdate and we can avoid
+  // calling setUpdateRef(false).
+  @SuppressWarnings("deprecation")
+  @Override
+  protected Change.Id updateProjectConfig(
+      ProjectConfig config, MetaDataUpdate md, boolean parentProjectUpdate)
+      throws IOException, OrmException, AuthException, PermissionBackendException,
+          ConfigInvalidException, ResourceConflictException {
+    PermissionBackend.ForProject perm = permissionBackend.user(user).project(config.getName());
+    if (!check(perm, ProjectPermission.READ_CONFIG)) {
+      throw new AuthException(RefNames.REFS_CONFIG + " not visible");
+    }
+
+    if (!check(perm, ProjectPermission.WRITE_CONFIG)
+        && !check(perm.ref(RefNames.REFS_CONFIG), RefPermission.CREATE_CHANGE)) {
+      throw new AuthException("cannot create change for " + RefNames.REFS_CONFIG);
+    }
+
+    projectCache.checkedGet(config.getName()).checkStatePermitsWrite();
+
+    md.setInsertChangeId(true);
+    Change.Id changeId = new Change.Id(seq.nextChangeId());
+    RevCommit commit =
+        config.commitToNewRef(
+            md, new PatchSet.Id(changeId, Change.INITIAL_PATCH_SET_ID).toRefName());
+    if (commit.getId().equals(base)) {
+      return null;
+    }
+
+    try (ObjectInserter objInserter = md.getRepository().newObjectInserter();
+        ObjectReader objReader = objInserter.newReader();
+        RevWalk rw = new RevWalk(objReader);
+        BatchUpdate bu =
+            updateFactory.create(db, config.getProject().getNameKey(), user, TimeUtil.nowTs())) {
+      bu.setRepository(md.getRepository(), rw, objInserter);
+      bu.insertChange(
+          changeInserterFactory
+              .create(changeId, commit, RefNames.REFS_CONFIG)
+              .setValidate(false)
+              .setUpdateRef(false)); // Created by commitToNewRef.
+      bu.execute();
+    } catch (UpdateException | RestApiException e) {
+      throw new IOException(e);
+    }
+
+    ChangeResource rsrc;
+    try {
+      rsrc = changes.parse(changeId);
+    } catch (RestApiException e) {
+      throw new IOException(e);
+    }
+    addProjectOwnersAsReviewers(rsrc);
+    if (parentProjectUpdate && !allowProjectOwnersToChangeParent) {
+      addAdministratorsAsReviewers(rsrc);
+    }
+    return changeId;
+  }
+
+  private void addProjectOwnersAsReviewers(ChangeResource rsrc) {
+    final String projectOwners = groupBackend.get(SystemGroupBackend.PROJECT_OWNERS).getName();
+    try {
+      AddReviewerInput input = new AddReviewerInput();
+      input.reviewer = projectOwners;
+      reviewersProvider.get().apply(rsrc, input);
+    } catch (Exception e) {
+      // one of the owner groups is not visible to the user and this it why it
+      // can't be added as reviewer
+      Throwables.throwIfUnchecked(e);
+    }
+  }
+
+  private void addAdministratorsAsReviewers(ChangeResource rsrc) {
+    List<PermissionRule> adminRules =
+        projectCache
+            .getAllProjects()
+            .getConfig()
+            .getAccessSection(AccessSection.GLOBAL_CAPABILITIES)
+            .getPermission(GlobalCapability.ADMINISTRATE_SERVER)
+            .getRules();
+    for (PermissionRule r : adminRules) {
+      try {
+        AddReviewerInput input = new AddReviewerInput();
+        input.reviewer = r.getGroup().getUUID().get();
+        reviewersProvider.get().apply(rsrc, input);
+      } catch (Exception e) {
+        // ignore
+        Throwables.throwIfUnchecked(e);
+      }
+    }
+  }
+
+  private boolean check(PermissionBackend.ForRef perm, RefPermission p)
+      throws PermissionBackendException {
+    try {
+      perm.check(p);
+      return true;
+    } catch (AuthException denied) {
+      return false;
+    }
+  }
+
+  private boolean check(PermissionBackend.ForProject perm, ProjectPermission p)
+      throws PermissionBackendException {
+    try {
+      perm.check(p);
+      return true;
+    } catch (AuthException denied) {
+      return false;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/httpd/template/SiteHeaderFooter.java b/java/com/google/gerrit/httpd/template/SiteHeaderFooter.java
new file mode 100644
index 0000000..655f4ca
--- /dev/null
+++ b/java/com/google/gerrit/httpd/template/SiteHeaderFooter.java
@@ -0,0 +1,147 @@
+// Copyright (C) 2013 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.google.gerrit.httpd.template;
+
+import static com.google.gerrit.common.FileUtil.lastModified;
+
+import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.httpd.HtmlDomUtil;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.nio.file.Path;
+import org.eclipse.jgit.lib.Config;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+@Singleton
+public class SiteHeaderFooter {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final boolean refreshHeaderFooter;
+  private final SitePaths sitePaths;
+  private volatile Template template;
+
+  @Inject
+  SiteHeaderFooter(@GerritServerConfig Config cfg, SitePaths sitePaths) {
+    this.refreshHeaderFooter = cfg.getBoolean("site", "refreshHeaderFooter", true);
+    this.sitePaths = sitePaths;
+
+    try {
+      Template t = new Template(sitePaths);
+      t.load();
+      template = t;
+    } catch (IOException e) {
+      logger.atWarning().withCause(e).log("Cannot load site header or footer");
+    }
+  }
+
+  public Document parse(Class<?> clazz, String name) throws IOException {
+    Template t = template;
+    if (refreshHeaderFooter && t.isStale()) {
+      t = new Template(sitePaths);
+      try {
+        t.load();
+        template = t;
+      } catch (IOException e) {
+        logger.atWarning().withCause(e).log("Cannot refresh site header or footer");
+        t = template;
+      }
+    }
+
+    Document doc = HtmlDomUtil.parseFile(clazz, name);
+    injectCss(doc, "gerrit_sitecss", t.css);
+    injectXml(doc, "gerrit_header", t.header);
+    injectXml(doc, "gerrit_footer", t.footer);
+    return doc;
+  }
+
+  private void injectCss(Document doc, String id, String content) {
+    Element e = HtmlDomUtil.find(doc, id);
+    if (e != null) {
+      if (!Strings.isNullOrEmpty(content)) {
+        while (e.getFirstChild() != null) {
+          e.removeChild(e.getFirstChild());
+        }
+        e.removeAttribute("id");
+        e.appendChild(doc.createCDATASection("\n" + content + "\n"));
+      } else {
+        e.getParentNode().removeChild(e);
+      }
+    }
+  }
+
+  private void injectXml(Document doc, String id, Element d) {
+    Element e = HtmlDomUtil.find(doc, id);
+    if (e != null) {
+      if (d != null) {
+        while (e.getFirstChild() != null) {
+          e.removeChild(e.getFirstChild());
+        }
+        e.appendChild(doc.importNode(d, true));
+      } else {
+        e.getParentNode().removeChild(e);
+      }
+    }
+  }
+
+  private static class Template {
+    private final FileInfo cssFile;
+    private final FileInfo headerFile;
+    private final FileInfo footerFile;
+
+    String css;
+    Element header;
+    Element footer;
+
+    Template(SitePaths site) {
+      cssFile = new FileInfo(site.site_css);
+      headerFile = new FileInfo(site.site_header);
+      footerFile = new FileInfo(site.site_footer);
+    }
+
+    void load() throws IOException {
+      css = HtmlDomUtil.readFile(cssFile.path.getParent(), cssFile.path.getFileName().toString());
+      header = readXml(headerFile);
+      footer = readXml(footerFile);
+    }
+
+    boolean isStale() {
+      return cssFile.isStale() || headerFile.isStale() || footerFile.isStale();
+    }
+
+    private static Element readXml(FileInfo src) throws IOException {
+      Document d = HtmlDomUtil.parseFile(src.path);
+      return d != null ? d.getDocumentElement() : null;
+    }
+  }
+
+  private static class FileInfo {
+    final Path path;
+    final long time;
+
+    FileInfo(Path p) {
+      path = p;
+      time = lastModified(p);
+    }
+
+    boolean isStale() {
+      return time != lastModified(path);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/index/BUILD b/java/com/google/gerrit/index/BUILD
new file mode 100644
index 0000000..8d4e6dd
--- /dev/null
+++ b/java/com/google/gerrit/index/BUILD
@@ -0,0 +1,36 @@
+QUERY_PARSE_EXCEPTION_SRCS = [
+    "query/QueryParseException.java",
+    "query/QueryRequiresAuthException.java",
+]
+
+java_library(
+    name = "query_exception",
+    srcs = QUERY_PARSE_EXCEPTION_SRCS,
+    visibility = ["//visibility:public"],
+)
+
+java_library(
+    name = "index",
+    srcs = glob(
+        ["**/*.java"],
+        exclude = QUERY_PARSE_EXCEPTION_SRCS,
+    ),
+    visibility = ["//visibility:public"],
+    deps = [
+        ":query_exception",
+        "//antlr3:query_parser",
+        "//java/com/google/gerrit/common:annotations",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/metrics",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server/logging",
+        "//lib:guava",
+        "//lib:gwtjsonrpc",
+        "//lib:gwtorm",
+        "//lib/antlr:java-runtime",
+        "//lib/auto:auto-value",
+        "//lib/auto:auto-value-annotations",
+        "//lib/flogger:api",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+    ],
+)
diff --git a/java/com/google/gerrit/index/FieldDef.java b/java/com/google/gerrit/index/FieldDef.java
new file mode 100644
index 0000000..beb9c07
--- /dev/null
+++ b/java/com/google/gerrit/index/FieldDef.java
@@ -0,0 +1,148 @@
+// Copyright (C) 2013 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.google.gerrit.index;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.base.CharMatcher;
+import com.google.gwtorm.server.OrmException;
+import java.io.IOException;
+import java.sql.Timestamp;
+
+/**
+ * Definition of a field stored in the secondary index.
+ *
+ * @param <I> input type from which documents are created and search results are returned.
+ * @param <T> type that should be extracted from the input object when converting to an index
+ *     document.
+ */
+public final class FieldDef<I, T> {
+  public static FieldDef.Builder<String> exact(String name) {
+    return new FieldDef.Builder<>(FieldType.EXACT, name);
+  }
+
+  public static FieldDef.Builder<String> fullText(String name) {
+    return new FieldDef.Builder<>(FieldType.FULL_TEXT, name);
+  }
+
+  public static FieldDef.Builder<Integer> intRange(String name) {
+    return new FieldDef.Builder<>(FieldType.INTEGER_RANGE, name).stored();
+  }
+
+  public static FieldDef.Builder<Integer> integer(String name) {
+    return new FieldDef.Builder<>(FieldType.INTEGER, name);
+  }
+
+  public static FieldDef.Builder<String> prefix(String name) {
+    return new FieldDef.Builder<>(FieldType.PREFIX, name);
+  }
+
+  public static FieldDef.Builder<byte[]> storedOnly(String name) {
+    return new FieldDef.Builder<>(FieldType.STORED_ONLY, name).stored();
+  }
+
+  public static FieldDef.Builder<Timestamp> timestamp(String name) {
+    return new FieldDef.Builder<>(FieldType.TIMESTAMP, name);
+  }
+
+  @FunctionalInterface
+  public interface Getter<I, T> {
+    T get(I input) throws OrmException, IOException;
+  }
+
+  public static class Builder<T> {
+    private final FieldType<T> type;
+    private final String name;
+    private boolean stored;
+
+    public Builder(FieldType<T> type, String name) {
+      this.type = requireNonNull(type);
+      this.name = requireNonNull(name);
+    }
+
+    public Builder<T> stored() {
+      this.stored = true;
+      return this;
+    }
+
+    public <I> FieldDef<I, T> build(Getter<I, T> getter) {
+      return new FieldDef<>(name, type, stored, false, getter);
+    }
+
+    public <I> FieldDef<I, Iterable<T>> buildRepeatable(Getter<I, Iterable<T>> getter) {
+      return new FieldDef<>(name, type, stored, true, getter);
+    }
+  }
+
+  private final String name;
+  private final FieldType<?> type;
+  private final boolean stored;
+  private final boolean repeatable;
+  private final Getter<I, T> getter;
+
+  private FieldDef(
+      String name, FieldType<?> type, boolean stored, boolean repeatable, Getter<I, T> getter) {
+    checkArgument(
+        !(repeatable && type == FieldType.INTEGER_RANGE),
+        "Range queries against repeated fields are unsupported");
+    this.name = checkName(name);
+    this.type = requireNonNull(type);
+    this.stored = stored;
+    this.repeatable = repeatable;
+    this.getter = requireNonNull(getter);
+  }
+
+  private static String checkName(String name) {
+    CharMatcher m = CharMatcher.anyOf("abcdefghijklmnopqrstuvwxyz0123456789_");
+    checkArgument(name != null && m.matchesAllOf(name), "illegal field name: %s", name);
+    return name;
+  }
+
+  /** @return name of the field. */
+  public String getName() {
+    return name;
+  }
+
+  /** @return type of the field; for repeatable fields, the inner type, not the iterable type. */
+  public FieldType<?> getType() {
+    return type;
+  }
+
+  /** @return whether the field should be stored in the index. */
+  public boolean isStored() {
+    return stored;
+  }
+
+  /**
+   * Get the field contents from the input object.
+   *
+   * @param input input object.
+   * @return the field value(s) to index.
+   * @throws OrmException
+   */
+  public T get(I input) throws OrmException {
+    try {
+      return getter.get(input);
+    } catch (IOException e) {
+      throw new OrmException(e);
+    }
+  }
+
+  /** @return whether the field is repeatable. */
+  public boolean isRepeatable() {
+    return repeatable;
+  }
+}
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/FieldType.java b/java/com/google/gerrit/index/FieldType.java
similarity index 100%
rename from gerrit-index/src/main/java/com/google/gerrit/index/FieldType.java
rename to java/com/google/gerrit/index/FieldType.java
diff --git a/java/com/google/gerrit/index/Index.java b/java/com/google/gerrit/index/Index.java
new file mode 100644
index 0000000..2d7e31e
--- /dev/null
+++ b/java/com/google/gerrit/index/Index.java
@@ -0,0 +1,152 @@
+// Copyright (C) 2013 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.google.gerrit.index;
+
+import com.google.gerrit.index.query.DataSource;
+import com.google.gerrit.index.query.FieldBundle;
+import com.google.gerrit.index.query.IndexPredicate;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gwtorm.server.OrmException;
+import java.io.IOException;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * Secondary index implementation for arbitrary documents.
+ *
+ * <p>Documents are inserted into the index and are queried by converting special {@link
+ * com.google.gerrit.index.query.Predicate} instances into index-aware predicates that use the index
+ * search results as a source.
+ *
+ * <p>Implementations must be thread-safe and should batch inserts/updates where appropriate.
+ */
+public interface Index<K, V> {
+  /** @return the schema version used by this index. */
+  Schema<V> getSchema();
+
+  /** Close this index. */
+  void close();
+
+  /**
+   * Update a document in the index.
+   *
+   * <p>Semantically equivalent to deleting the document and reinserting it with new field values. A
+   * document that does not already exist is created. Results may not be immediately visible to
+   * searchers, but should be visible within a reasonable amount of time.
+   *
+   * @param obj document object
+   * @throws IOException
+   */
+  void replace(V obj) throws IOException;
+
+  /**
+   * Delete a document from the index by key.
+   *
+   * @param key document key
+   * @throws IOException
+   */
+  void delete(K key) throws IOException;
+
+  /**
+   * Delete all documents from the index.
+   *
+   * @throws IOException
+   */
+  void deleteAll() throws IOException;
+
+  /**
+   * Convert the given operator predicate into a source searching the index and returning only the
+   * documents matching that predicate.
+   *
+   * <p>This method may be called multiple times for variations on the same predicate or multiple
+   * predicate subtrees in the course of processing a single query, so it should not have any side
+   * effects (e.g. starting a search in the background).
+   *
+   * @param p the predicate to match. Must be a tree containing only AND, OR, or NOT predicates as
+   *     internal nodes, and {@link IndexPredicate}s as leaves.
+   * @param opts query options not implied by the predicate, such as start and limit.
+   * @return a source of documents matching the predicate, returned in a defined order depending on
+   *     the type of documents.
+   * @throws QueryParseException if the predicate could not be converted to an indexed data source.
+   */
+  DataSource<V> getSource(Predicate<V> p, QueryOptions opts) throws QueryParseException;
+
+  /**
+   * Get a single document from the index.
+   *
+   * @param key document key.
+   * @param opts query options. Options that do not make sense in the context of a single document,
+   *     such as start, will be ignored.
+   * @return a single document if present.
+   * @throws IOException
+   */
+  default Optional<V> get(K key, QueryOptions opts) throws IOException {
+    opts = opts.withStart(0).withLimit(2);
+    List<V> results;
+    try {
+      results = getSource(keyPredicate(key), opts).read().toList();
+    } catch (QueryParseException e) {
+      throw new IOException("Unexpected QueryParseException during get()", e);
+    } catch (OrmException e) {
+      throw new IOException(e);
+    }
+    if (results.size() > 1) {
+      throw new IOException("Multiple results found in index for key " + key + ": " + results);
+    }
+    return results.stream().findFirst();
+  }
+
+  /**
+   * Get a single raw document from the index.
+   *
+   * @param key document key.
+   * @param opts query options. Options that do not make sense in the context of a single document,
+   *     such as start, will be ignored.
+   * @return an abstraction of a raw index document to retrieve fields from.
+   * @throws IOException
+   */
+  default Optional<FieldBundle> getRaw(K key, QueryOptions opts) throws IOException {
+    opts = opts.withStart(0).withLimit(2);
+    List<FieldBundle> results;
+    try {
+      results = getSource(keyPredicate(key), opts).readRaw().toList();
+    } catch (QueryParseException e) {
+      throw new IOException("Unexpected QueryParseException during get()", e);
+    } catch (OrmException e) {
+      throw new IOException(e);
+    }
+    if (results.size() > 1) {
+      throw new IOException("Multiple results found in index for key " + key + ": " + results);
+    }
+    return results.stream().findFirst();
+  }
+
+  /**
+   * Get a predicate that looks up a single document by key.
+   *
+   * @param key document key.
+   * @return a single predicate.
+   */
+  Predicate<V> keyPredicate(K key);
+
+  /**
+   * Mark whether this index is up-to-date and ready to serve reads.
+   *
+   * @param ready whether the index is ready
+   * @throws IOException
+   */
+  void markReady(boolean ready) throws IOException;
+}
diff --git a/java/com/google/gerrit/index/IndexCollection.java b/java/com/google/gerrit/index/IndexCollection.java
new file mode 100644
index 0000000..0615453
--- /dev/null
+++ b/java/com/google/gerrit/index/IndexCollection.java
@@ -0,0 +1,108 @@
+// Copyright (C) 2013 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.google.gerrit.index;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.Lists;
+import com.google.gerrit.extensions.events.LifecycleListener;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicReference;
+
+/** Dynamic pointers to the index versions used for searching and writing. */
+public abstract class IndexCollection<K, V, I extends Index<K, V>> implements LifecycleListener {
+  private final CopyOnWriteArrayList<I> writeIndexes;
+  private final AtomicReference<I> searchIndex;
+
+  protected IndexCollection() {
+    this.writeIndexes = Lists.newCopyOnWriteArrayList();
+    this.searchIndex = new AtomicReference<>();
+  }
+
+  /** @return the current search index version. */
+  public I getSearchIndex() {
+    return searchIndex.get();
+  }
+
+  public void setSearchIndex(I index) {
+    setSearchIndex(index, true);
+  }
+
+  @VisibleForTesting
+  public void setSearchIndex(I index, boolean closeOld) {
+    I old = searchIndex.getAndSet(index);
+    if (closeOld && old != null && old != index && !writeIndexes.contains(old)) {
+      old.close();
+    }
+  }
+
+  public Collection<I> getWriteIndexes() {
+    return Collections.unmodifiableCollection(writeIndexes);
+  }
+
+  public synchronized I addWriteIndex(I index) {
+    int version = index.getSchema().getVersion();
+    for (int i = 0; i < writeIndexes.size(); i++) {
+      if (writeIndexes.get(i).getSchema().getVersion() == version) {
+        return writeIndexes.set(i, index);
+      }
+    }
+    writeIndexes.add(index);
+    return null;
+  }
+
+  public synchronized void removeWriteIndex(int version) {
+    int removeIndex = -1;
+    for (int i = 0; i < writeIndexes.size(); i++) {
+      if (writeIndexes.get(i).getSchema().getVersion() == version) {
+        removeIndex = i;
+        break;
+      }
+    }
+    if (removeIndex >= 0) {
+      try {
+        writeIndexes.get(removeIndex).close();
+      } finally {
+        writeIndexes.remove(removeIndex);
+      }
+    }
+  }
+
+  public I getWriteIndex(int version) {
+    for (I i : writeIndexes) {
+      if (i.getSchema().getVersion() == version) {
+        return i;
+      }
+    }
+    return null;
+  }
+
+  @Override
+  public void start() {}
+
+  @Override
+  public void stop() {
+    I read = searchIndex.get();
+    if (read != null) {
+      read.close();
+    }
+    for (I write : writeIndexes) {
+      if (write != read) {
+        write.close();
+      }
+    }
+  }
+}
diff --git a/java/com/google/gerrit/index/IndexConfig.java b/java/com/google/gerrit/index/IndexConfig.java
new file mode 100644
index 0000000..b5b36f1
--- /dev/null
+++ b/java/com/google/gerrit/index/IndexConfig.java
@@ -0,0 +1,112 @@
+// Copyright (C) 2015 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.google.gerrit.index;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+import com.google.auto.value.AutoValue;
+import java.util.function.IntConsumer;
+import org.eclipse.jgit.lib.Config;
+
+/**
+ * Implementation-specific configuration for secondary indexes.
+ *
+ * <p>Contains configuration that is tied to a specific index implementation but is otherwise
+ * global, i.e. not tied to a specific {@link Index} and schema version.
+ */
+@AutoValue
+public abstract class IndexConfig {
+  private static final int DEFAULT_MAX_TERMS = 1024;
+
+  public static IndexConfig createDefault() {
+    return builder().build();
+  }
+
+  public static Builder fromConfig(Config cfg) {
+    Builder b = builder();
+    setIfPresent(cfg, "maxLimit", b::maxLimit);
+    setIfPresent(cfg, "maxPages", b::maxPages);
+    setIfPresent(cfg, "maxTerms", b::maxTerms);
+    return b;
+  }
+
+  private static void setIfPresent(Config cfg, String name, IntConsumer setter) {
+    int n = cfg.getInt("index", null, name, 0);
+    if (n != 0) {
+      setter.accept(n);
+    }
+  }
+
+  public static Builder builder() {
+    return new AutoValue_IndexConfig.Builder()
+        .maxLimit(Integer.MAX_VALUE)
+        .maxPages(Integer.MAX_VALUE)
+        .maxTerms(DEFAULT_MAX_TERMS)
+        .separateChangeSubIndexes(false);
+  }
+
+  @AutoValue.Builder
+  public abstract static class Builder {
+    public abstract Builder maxLimit(int maxLimit);
+
+    public abstract int maxLimit();
+
+    public abstract Builder maxPages(int maxPages);
+
+    public abstract int maxPages();
+
+    public abstract Builder maxTerms(int maxTerms);
+
+    public abstract int maxTerms();
+
+    public abstract Builder separateChangeSubIndexes(boolean separate);
+
+    abstract IndexConfig autoBuild();
+
+    public IndexConfig build() {
+      IndexConfig cfg = autoBuild();
+      checkLimit(cfg.maxLimit(), "maxLimit");
+      checkLimit(cfg.maxPages(), "maxPages");
+      checkLimit(cfg.maxTerms(), "maxTerms");
+      return cfg;
+    }
+  }
+
+  private static void checkLimit(int limit, String name) {
+    checkArgument(limit > 0, "%s must be positive: %s", name, limit);
+  }
+
+  /**
+   * @return maximum limit supported by the underlying index, or limited for performance reasons.
+   */
+  public abstract int maxLimit();
+
+  /**
+   * @return maximum number of pages (limit / start) supported by the underlying index, or limited
+   *     for performance reasons.
+   */
+  public abstract int maxPages();
+
+  /**
+   * @return maximum number of total index query terms supported by the underlying index, or limited
+   *     for performance reasons.
+   */
+  public abstract int maxTerms();
+
+  /**
+   * @return whether different subsets of changes may be stored in different physical sub-indexes.
+   */
+  public abstract boolean separateChangeSubIndexes();
+}
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/IndexDefinition.java b/java/com/google/gerrit/index/IndexDefinition.java
similarity index 100%
rename from gerrit-index/src/main/java/com/google/gerrit/index/IndexDefinition.java
rename to java/com/google/gerrit/index/IndexDefinition.java
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/IndexRewriter.java b/java/com/google/gerrit/index/IndexRewriter.java
similarity index 100%
rename from gerrit-index/src/main/java/com/google/gerrit/index/IndexRewriter.java
rename to java/com/google/gerrit/index/IndexRewriter.java
diff --git a/java/com/google/gerrit/index/IndexedQuery.java b/java/com/google/gerrit/index/IndexedQuery.java
new file mode 100644
index 0000000..143cc26
--- /dev/null
+++ b/java/com/google/gerrit/index/IndexedQuery.java
@@ -0,0 +1,133 @@
+// 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.
+
+package com.google.gerrit.index;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.index.query.DataSource;
+import com.google.gerrit.index.query.FieldBundle;
+import com.google.gerrit.index.query.IndexPredicate;
+import com.google.gerrit.index.query.Paginated;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.ResultSet;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Wrapper combining an {@link IndexPredicate} together with a {@link DataSource} that returns
+ * matching results from the index.
+ *
+ * <p>Appropriate to return as the rootmost predicate that can be processed using the secondary
+ * index; such predicates must also implement {@link DataSource} to be chosen by the query
+ * processor.
+ *
+ * @param <I> The type of the IDs by which the entities are stored in the index.
+ * @param <T> The type of the entities that are stored in the index.
+ */
+public class IndexedQuery<I, T> extends Predicate<T> implements DataSource<T>, Paginated<T> {
+  protected final Index<I, T> index;
+
+  private QueryOptions opts;
+  private final Predicate<T> pred;
+  protected DataSource<T> source;
+
+  public IndexedQuery(Index<I, T> index, Predicate<T> pred, QueryOptions opts)
+      throws QueryParseException {
+    this.index = index;
+    this.opts = opts;
+    this.pred = pred;
+    this.source = index.getSource(pred, this.opts);
+  }
+
+  @Override
+  public int getChildCount() {
+    return 1;
+  }
+
+  @Override
+  public Predicate<T> getChild(int i) {
+    if (i == 0) {
+      return pred;
+    }
+    throw new ArrayIndexOutOfBoundsException(i);
+  }
+
+  @Override
+  public List<Predicate<T>> getChildren() {
+    return ImmutableList.of(pred);
+  }
+
+  @Override
+  public QueryOptions getOptions() {
+    return opts;
+  }
+
+  @Override
+  public int getCardinality() {
+    return source != null ? source.getCardinality() : opts.limit();
+  }
+
+  @Override
+  public ResultSet<T> read() throws OrmException {
+    return source.read();
+  }
+
+  @Override
+  public ResultSet<FieldBundle> readRaw() throws OrmException {
+    return source.readRaw();
+  }
+
+  @Override
+  public ResultSet<T> restart(int start) throws OrmException {
+    opts = opts.withStart(start);
+    try {
+      source = index.getSource(pred, opts);
+    } catch (QueryParseException e) {
+      // Don't need to show this exception to the user; the only thing that
+      // changed about pred was its start, and any other QPEs that might happen
+      // should have already thrown from the constructor.
+      throw new OrmException(e);
+    }
+    // Don't convert start to a limit, since the caller of this method (see
+    // AndSource) has calculated the actual number to skip.
+    return read();
+  }
+
+  @Override
+  public Predicate<T> copy(Collection<? extends Predicate<T>> children) {
+    return this;
+  }
+
+  @Override
+  public int hashCode() {
+    return pred.hashCode();
+  }
+
+  @Override
+  public boolean equals(Object other) {
+    if (other == null || getClass() != other.getClass()) {
+      return false;
+    }
+    IndexedQuery<?, ?> o = (IndexedQuery<?, ?>) other;
+    return pred.equals(o.pred) && opts.equals(o.opts);
+  }
+
+  @Override
+  public String toString() {
+    return MoreObjects.toStringHelper("index").add("p", pred).add("opts", opts).toString();
+  }
+}
diff --git a/java/com/google/gerrit/index/QueryOptions.java b/java/com/google/gerrit/index/QueryOptions.java
new file mode 100644
index 0000000..0401dab
--- /dev/null
+++ b/java/com/google/gerrit/index/QueryOptions.java
@@ -0,0 +1,61 @@
+// Copyright (C) 2015 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.google.gerrit.index;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.primitives.Ints;
+import java.util.Set;
+import java.util.function.Function;
+
+@AutoValue
+public abstract class QueryOptions {
+  public static QueryOptions create(IndexConfig config, int start, int limit, Set<String> fields) {
+    checkArgument(start >= 0, "start must be nonnegative: %s", start);
+    checkArgument(limit > 0, "limit must be positive: %s", limit);
+    return new AutoValue_QueryOptions(config, start, limit, ImmutableSet.copyOf(fields));
+  }
+
+  public QueryOptions convertForBackend() {
+    // Increase the limit rather than skipping, since we don't know how many
+    // skipped results would have been filtered out by the enclosing AndSource.
+    int backendLimit = config().maxLimit();
+    int limit = Ints.saturatedCast((long) limit() + start());
+    limit = Math.min(limit, backendLimit);
+    return create(config(), 0, limit, fields());
+  }
+
+  public abstract IndexConfig config();
+
+  public abstract int start();
+
+  public abstract int limit();
+
+  public abstract ImmutableSet<String> fields();
+
+  public QueryOptions withLimit(int newLimit) {
+    return create(config(), start(), newLimit, fields());
+  }
+
+  public QueryOptions withStart(int newStart) {
+    return create(config(), newStart, limit(), fields());
+  }
+
+  public QueryOptions filterFields(Function<QueryOptions, Set<String>> filter) {
+    return create(config(), start(), limit(), filter.apply(this));
+  }
+}
diff --git a/java/com/google/gerrit/index/RefState.java b/java/com/google/gerrit/index/RefState.java
new file mode 100644
index 0000000..f0e465d
--- /dev/null
+++ b/java/com/google/gerrit/index/RefState.java
@@ -0,0 +1,83 @@
+// Copyright (C) 2017 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.google.gerrit.index;
+
+import static com.google.common.base.MoreObjects.firstNonNull;
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.base.Splitter;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.collect.SetMultimap;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Project;
+import java.io.IOException;
+import java.util.List;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+
+@AutoValue
+public abstract class RefState {
+  public static SetMultimap<Project.NameKey, RefState> parseStates(Iterable<byte[]> states) {
+    RefState.check(states != null, null);
+    SetMultimap<Project.NameKey, RefState> result =
+        MultimapBuilder.hashKeys().hashSetValues().build();
+    for (byte[] b : states) {
+      RefState.check(b != null, null);
+      String s = new String(b, UTF_8);
+      List<String> parts = Splitter.on(':').splitToList(s);
+      RefState.check(parts.size() == 3 && !parts.get(0).isEmpty() && !parts.get(1).isEmpty(), s);
+      result.put(new Project.NameKey(parts.get(0)), RefState.create(parts.get(1), parts.get(2)));
+    }
+    return result;
+  }
+
+  public static RefState create(String ref, String sha) {
+    return new AutoValue_RefState(ref, ObjectId.fromString(sha));
+  }
+
+  public static RefState create(String ref, @Nullable ObjectId id) {
+    return new AutoValue_RefState(ref, firstNonNull(id, ObjectId.zeroId()));
+  }
+
+  public static RefState of(Ref ref) {
+    return new AutoValue_RefState(ref.getName(), ref.getObjectId());
+  }
+
+  public byte[] toByteArray(Project.NameKey project) {
+    byte[] a = (project.toString() + ':' + ref() + ':').getBytes(UTF_8);
+    byte[] b = new byte[a.length + Constants.OBJECT_ID_STRING_LENGTH];
+    System.arraycopy(a, 0, b, 0, a.length);
+    id().copyTo(b, a.length);
+    return b;
+  }
+
+  public static void check(boolean condition, String str) {
+    checkArgument(condition, "invalid RefState: %s", str);
+  }
+
+  public abstract String ref();
+
+  public abstract ObjectId id();
+
+  public boolean match(Repository repo) throws IOException {
+    Ref ref = repo.exactRef(ref());
+    ObjectId expected = ref != null ? ref.getObjectId() : ObjectId.zeroId();
+    return id().equals(expected);
+  }
+}
diff --git a/java/com/google/gerrit/index/Schema.java b/java/com/google/gerrit/index/Schema.java
new file mode 100644
index 0000000..18563ab
--- /dev/null
+++ b/java/com/google/gerrit/index/Schema.java
@@ -0,0 +1,210 @@
+// Copyright (C) 2013 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.google.gerrit.index;
+
+import static com.google.common.base.Preconditions.checkState;
+
+import com.google.common.base.Function;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Predicates;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.flogger.FluentLogger;
+import com.google.gwtorm.server.OrmException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+
+/** Specific version of a secondary index schema. */
+public class Schema<T> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static class Builder<T> {
+    private final List<FieldDef<T, ?>> fields = new ArrayList<>();
+
+    public Builder<T> add(Schema<T> schema) {
+      this.fields.addAll(schema.getFields().values());
+      return this;
+    }
+
+    @SafeVarargs
+    public final Builder<T> add(FieldDef<T, ?>... fields) {
+      this.fields.addAll(Arrays.asList(fields));
+      return this;
+    }
+
+    @SafeVarargs
+    public final Builder<T> remove(FieldDef<T, ?>... fields) {
+      this.fields.removeAll(Arrays.asList(fields));
+      return this;
+    }
+
+    public Schema<T> build() {
+      return new Schema<>(ImmutableList.copyOf(fields));
+    }
+  }
+
+  public static class Values<T> {
+    private final FieldDef<T, ?> field;
+    private final Iterable<?> values;
+
+    private Values(FieldDef<T, ?> field, Iterable<?> values) {
+      this.field = field;
+      this.values = values;
+    }
+
+    public FieldDef<T, ?> getField() {
+      return field;
+    }
+
+    public Iterable<?> getValues() {
+      return values;
+    }
+  }
+
+  private static <T> FieldDef<T, ?> checkSame(FieldDef<T, ?> f1, FieldDef<T, ?> f2) {
+    checkState(f1 == f2, "Mismatched %s fields: %s != %s", f1.getName(), f1, f2);
+    return f1;
+  }
+
+  private final ImmutableMap<String, FieldDef<T, ?>> fields;
+  private final ImmutableMap<String, FieldDef<T, ?>> storedFields;
+
+  private int version;
+
+  public Schema(Iterable<FieldDef<T, ?>> fields) {
+    this(0, fields);
+  }
+
+  public Schema(int version, Iterable<FieldDef<T, ?>> fields) {
+    this.version = version;
+    ImmutableMap.Builder<String, FieldDef<T, ?>> b = ImmutableMap.builder();
+    ImmutableMap.Builder<String, FieldDef<T, ?>> sb = ImmutableMap.builder();
+    for (FieldDef<T, ?> f : fields) {
+      b.put(f.getName(), f);
+      if (f.isStored()) {
+        sb.put(f.getName(), f);
+      }
+    }
+    this.fields = b.build();
+    this.storedFields = sb.build();
+  }
+
+  public final int getVersion() {
+    return version;
+  }
+
+  /**
+   * Get all fields in this schema.
+   *
+   * <p>This is primarily useful for iteration. Most callers should prefer one of the helper methods
+   * {@link #getField(FieldDef, FieldDef...)} or {@link #hasField(FieldDef)} to looking up fields by
+   * name
+   *
+   * @return all fields in this schema indexed by name.
+   */
+  public final ImmutableMap<String, FieldDef<T, ?>> getFields() {
+    return fields;
+  }
+
+  /** @return all fields in this schema where {@link FieldDef#isStored()} is true. */
+  public final ImmutableMap<String, FieldDef<T, ?>> getStoredFields() {
+    return storedFields;
+  }
+
+  /**
+   * Look up fields in this schema.
+   *
+   * @param first the preferred field to look up.
+   * @param rest additional fields to look up.
+   * @return the first field in the schema matching {@code first} or {@code rest}, in order, or
+   *     absent if no field matches.
+   */
+  @SafeVarargs
+  public final Optional<FieldDef<T, ?>> getField(FieldDef<T, ?> first, FieldDef<T, ?>... rest) {
+    FieldDef<T, ?> field = fields.get(first.getName());
+    if (field != null) {
+      return Optional.of(checkSame(field, first));
+    }
+    for (FieldDef<T, ?> f : rest) {
+      field = fields.get(f.getName());
+      if (field != null) {
+        return Optional.of(checkSame(field, f));
+      }
+    }
+    return Optional.empty();
+  }
+
+  /**
+   * Check whether a field is present in this schema.
+   *
+   * @param field field to look up.
+   * @return whether the field is present.
+   */
+  public final boolean hasField(FieldDef<T, ?> field) {
+    FieldDef<T, ?> f = fields.get(field.getName());
+    if (f == null) {
+      return false;
+    }
+    checkSame(f, field);
+    return true;
+  }
+
+  /**
+   * Build all fields in the schema from an input object.
+   *
+   * <p>Null values are omitted, as are fields which cause errors, which are logged.
+   *
+   * @param obj input object.
+   * @return all non-null field values from the object.
+   */
+  public final Iterable<Values<T>> buildFields(T obj) {
+    return FluentIterable.from(fields.values())
+        .transform(
+            new Function<FieldDef<T, ?>, Values<T>>() {
+              @Override
+              public Values<T> apply(FieldDef<T, ?> f) {
+                Object v;
+                try {
+                  v = f.get(obj);
+                } catch (OrmException e) {
+                  logger.atSevere().withCause(e).log(
+                      "error getting field %s of %s", f.getName(), obj);
+                  return null;
+                }
+                if (v == null) {
+                  return null;
+                } else if (f.isRepeatable()) {
+                  return new Values<>(f, (Iterable<?>) v);
+                } else {
+                  return new Values<>(f, Collections.singleton(v));
+                }
+              }
+            })
+        .filter(Predicates.notNull());
+  }
+
+  @Override
+  public String toString() {
+    return MoreObjects.toStringHelper(this).addValue(fields.keySet()).toString();
+  }
+
+  public void setVersion(int version) {
+    this.version = version;
+  }
+}
diff --git a/java/com/google/gerrit/index/SchemaDefinitions.java b/java/com/google/gerrit/index/SchemaDefinitions.java
new file mode 100644
index 0000000..e8efd22
--- /dev/null
+++ b/java/com/google/gerrit/index/SchemaDefinitions.java
@@ -0,0 +1,66 @@
+// 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.
+
+package com.google.gerrit.index;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ImmutableSortedMap;
+import com.google.common.collect.Iterables;
+import com.google.gerrit.common.Nullable;
+
+/**
+ * Definitions of the various schema versions over a given Gerrit data type.
+ *
+ * <p>A <em>schema</em> is a description of the fields that are indexed over the given data type.
+ * This class contains all the versions of a schema defined over its data type, exposed as a map of
+ * version number to schema definition. If you are interested in the classes responsible for
+ * backend-specific runtime implementations, see the implementations of {@link IndexDefinition}.
+ */
+public abstract class SchemaDefinitions<V> {
+  private final String name;
+  private final ImmutableSortedMap<Integer, Schema<V>> schemas;
+
+  protected SchemaDefinitions(String name, Class<V> valueClass) {
+    this.name = requireNonNull(name);
+    this.schemas = SchemaUtil.schemasFromClass(getClass(), valueClass);
+  }
+
+  public final String getName() {
+    return name;
+  }
+
+  public final ImmutableSortedMap<Integer, Schema<V>> getSchemas() {
+    return schemas;
+  }
+
+  public final Schema<V> get(int version) {
+    Schema<V> schema = schemas.get(version);
+    checkArgument(schema != null, "Unrecognized %s schema version: %s", name, version);
+    return schema;
+  }
+
+  public final Schema<V> getLatest() {
+    return schemas.lastEntry().getValue();
+  }
+
+  @Nullable
+  public final Schema<V> getPrevious() {
+    if (schemas.size() <= 1) {
+      return null;
+    }
+    return Iterables.get(schemas.descendingMap().values(), 1);
+  }
+}
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/SchemaUtil.java b/java/com/google/gerrit/index/SchemaUtil.java
similarity index 100%
rename from gerrit-index/src/main/java/com/google/gerrit/index/SchemaUtil.java
rename to java/com/google/gerrit/index/SchemaUtil.java
diff --git a/java/com/google/gerrit/index/SiteIndexer.java b/java/com/google/gerrit/index/SiteIndexer.java
new file mode 100644
index 0000000..c3ab8a4
--- /dev/null
+++ b/java/com/google/gerrit/index/SiteIndexer.java
@@ -0,0 +1,150 @@
+// 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.
+
+package com.google.gerrit.index;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.base.Stopwatch;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.MoreExecutors;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import org.eclipse.jgit.lib.ProgressMonitor;
+import org.eclipse.jgit.util.io.NullOutputStream;
+
+public abstract class SiteIndexer<K, V, I extends Index<K, V>> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static class Result {
+    private final long elapsedNanos;
+    private final boolean success;
+    private final int done;
+    private final int failed;
+
+    public Result(Stopwatch sw, boolean success, int done, int failed) {
+      this.elapsedNanos = sw.elapsed(TimeUnit.NANOSECONDS);
+      this.success = success;
+      this.done = done;
+      this.failed = failed;
+    }
+
+    public boolean success() {
+      return success;
+    }
+
+    public int doneCount() {
+      return done;
+    }
+
+    public int failedCount() {
+      return failed;
+    }
+
+    public long elapsed(TimeUnit timeUnit) {
+      return timeUnit.convert(elapsedNanos, TimeUnit.NANOSECONDS);
+    }
+  }
+
+  protected int totalWork = -1;
+  protected OutputStream progressOut = NullOutputStream.INSTANCE;
+  protected PrintWriter verboseWriter = newPrintWriter(NullOutputStream.INSTANCE);
+
+  public void setTotalWork(int num) {
+    totalWork = num;
+  }
+
+  public void setProgressOut(OutputStream out) {
+    progressOut = requireNonNull(out);
+  }
+
+  public void setVerboseOut(OutputStream out) {
+    verboseWriter = newPrintWriter(requireNonNull(out));
+  }
+
+  public abstract Result indexAll(I index);
+
+  protected final void addErrorListener(
+      ListenableFuture<?> future, String desc, ProgressMonitor progress, AtomicBoolean ok) {
+    future.addListener(
+        new ErrorListener(future, desc, progress, ok), MoreExecutors.directExecutor());
+  }
+
+  protected PrintWriter newPrintWriter(OutputStream out) {
+    return new PrintWriter(new OutputStreamWriter(out, UTF_8));
+  }
+
+  private static class ErrorListener implements Runnable {
+    private final ListenableFuture<?> future;
+    private final String desc;
+    private final ProgressMonitor progress;
+    private final AtomicBoolean ok;
+
+    private ErrorListener(
+        ListenableFuture<?> future, String desc, ProgressMonitor progress, AtomicBoolean ok) {
+      this.future = future;
+      this.desc = desc;
+      this.progress = progress;
+      this.ok = ok;
+    }
+
+    @Override
+    public void run() {
+      try {
+        future.get();
+      } catch (RejectedExecutionException e) {
+        // Server shutdown, don't spam the logs.
+        failSilently();
+      } catch (ExecutionException | InterruptedException e) {
+        fail(e);
+      } catch (RuntimeException e) {
+        failAndThrow(e);
+      } catch (Error e) {
+        // Can't join with RuntimeException because "RuntimeException |
+        // Error" becomes Throwable, which messes with signatures.
+        failAndThrow(e);
+      } finally {
+        synchronized (progress) {
+          progress.update(1);
+        }
+      }
+    }
+
+    private void failSilently() {
+      ok.set(false);
+    }
+
+    private void fail(Throwable t) {
+      logger.atSevere().withCause(t).log("Failed to index %s", desc);
+      ok.set(false);
+    }
+
+    private void failAndThrow(RuntimeException e) {
+      fail(e);
+      throw e;
+    }
+
+    private void failAndThrow(Error e) {
+      fail(e);
+      throw e;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/index/project/BUILD b/java/com/google/gerrit/index/project/BUILD
new file mode 100644
index 0000000..f32d8c0
--- /dev/null
+++ b/java/com/google/gerrit/index/project/BUILD
@@ -0,0 +1,12 @@
+java_library(
+    name = "project",
+    srcs = glob(["*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/index",
+        "//java/com/google/gerrit/index:query_exception",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//lib:guava",
+        "//lib/guice",
+    ],
+)
diff --git a/java/com/google/gerrit/index/project/IndexedProjectQuery.java b/java/com/google/gerrit/index/project/IndexedProjectQuery.java
new file mode 100644
index 0000000..4409ccb
--- /dev/null
+++ b/java/com/google/gerrit/index/project/IndexedProjectQuery.java
@@ -0,0 +1,33 @@
+// Copyright (C) 2017 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.google.gerrit.index.project;
+
+import com.google.gerrit.index.Index;
+import com.google.gerrit.index.IndexedQuery;
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.query.DataSource;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.reviewdb.client.Project;
+
+public class IndexedProjectQuery extends IndexedQuery<Project.NameKey, ProjectData>
+    implements DataSource<ProjectData> {
+
+  public IndexedProjectQuery(
+      Index<Project.NameKey, ProjectData> index, Predicate<ProjectData> pred, QueryOptions opts)
+      throws QueryParseException {
+    super(index, pred, opts.convertForBackend());
+  }
+}
diff --git a/java/com/google/gerrit/index/project/ProjectData.java b/java/com/google/gerrit/index/project/ProjectData.java
new file mode 100644
index 0000000..fb029ac
--- /dev/null
+++ b/java/com/google/gerrit/index/project/ProjectData.java
@@ -0,0 +1,64 @@
+// Copyright (C) 2017 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.google.gerrit.index.project;
+
+import static com.google.common.collect.ImmutableList.toImmutableList;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.reviewdb.client.Project;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+public class ProjectData {
+  private final Project project;
+  private final Optional<ProjectData> parent;
+
+  public ProjectData(Project project, Optional<ProjectData> parent) {
+    this.project = project;
+    this.parent = parent;
+  }
+
+  public Project getProject() {
+    return project;
+  }
+
+  public Optional<ProjectData> getParent() {
+    return parent;
+  }
+
+  /** Returns all {@link ProjectData} in the hierarchy starting with the current one. */
+  public ImmutableList<ProjectData> tree() {
+    List<ProjectData> parents = new ArrayList<>();
+    Optional<ProjectData> curr = Optional.of(this);
+    while (curr.isPresent()) {
+      parents.add(curr.get());
+      curr = curr.get().parent;
+    }
+    return ImmutableList.copyOf(parents);
+  }
+
+  public ImmutableList<String> getParentNames() {
+    return tree().stream().skip(1).map(p -> p.getProject().getName()).collect(toImmutableList());
+  }
+
+  @Override
+  public String toString() {
+    MoreObjects.ToStringHelper h = MoreObjects.toStringHelper(this);
+    h.addValue(project.getName());
+    return h.toString();
+  }
+}
diff --git a/java/com/google/gerrit/index/project/ProjectField.java b/java/com/google/gerrit/index/project/ProjectField.java
new file mode 100644
index 0000000..3bc028d
--- /dev/null
+++ b/java/com/google/gerrit/index/project/ProjectField.java
@@ -0,0 +1,68 @@
+// Copyright (C) 2017 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.google.gerrit.index.project;
+
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static com.google.gerrit.index.FieldDef.exact;
+import static com.google.gerrit.index.FieldDef.fullText;
+import static com.google.gerrit.index.FieldDef.prefix;
+import static com.google.gerrit.index.FieldDef.storedOnly;
+
+import com.google.gerrit.index.FieldDef;
+import com.google.gerrit.index.RefState;
+import com.google.gerrit.index.SchemaUtil;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+
+/** Index schema for projects. */
+public class ProjectField {
+  private static byte[] toRefState(Project project) {
+    return RefState.create(RefNames.REFS_CONFIG, project.getConfigRefState())
+        .toByteArray(project.getNameKey());
+  }
+
+  public static final FieldDef<ProjectData, String> NAME =
+      exact("name").stored().build(p -> p.getProject().getName());
+
+  public static final FieldDef<ProjectData, String> DESCRIPTION =
+      fullText("description").stored().build(p -> p.getProject().getDescription());
+
+  public static final FieldDef<ProjectData, String> PARENT_NAME =
+      exact("parent_name").build(p -> p.getProject().getParentName());
+
+  public static final FieldDef<ProjectData, Iterable<String>> NAME_PART =
+      prefix("name_part").buildRepeatable(p -> SchemaUtil.getNameParts(p.getProject().getName()));
+
+  public static final FieldDef<ProjectData, String> STATE =
+      exact("state").stored().build(p -> p.getProject().getState().name());
+
+  public static final FieldDef<ProjectData, Iterable<String>> ANCESTOR_NAME =
+      exact("ancestor_name").buildRepeatable(p -> p.getParentNames());
+
+  /**
+   * All values of all refs that were used in the course of indexing this document. This covers
+   * {@code refs/meta/config} of the current project and all of its parents.
+   *
+   * <p>Emitted as UTF-8 encoded strings of the form {@code project:ref/name:[hex sha]}.
+   */
+  public static final FieldDef<ProjectData, Iterable<byte[]>> REF_STATE =
+      storedOnly("ref_state")
+          .buildRepeatable(
+              projectData ->
+                  projectData.tree().stream()
+                      .filter(p -> p.getProject().getConfigRefState() != null)
+                      .map(p -> toRefState(p.getProject()))
+                      .collect(toImmutableList()));
+}
diff --git a/java/com/google/gerrit/index/project/ProjectIndex.java b/java/com/google/gerrit/index/project/ProjectIndex.java
new file mode 100644
index 0000000..db7302a
--- /dev/null
+++ b/java/com/google/gerrit/index/project/ProjectIndex.java
@@ -0,0 +1,31 @@
+// Copyright (C) 2017 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.google.gerrit.index.project;
+
+import com.google.gerrit.index.Index;
+import com.google.gerrit.index.IndexDefinition;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.reviewdb.client.Project;
+
+public interface ProjectIndex extends Index<Project.NameKey, ProjectData> {
+
+  public interface Factory
+      extends IndexDefinition.IndexFactory<Project.NameKey, ProjectData, ProjectIndex> {}
+
+  @Override
+  default Predicate<ProjectData> keyPredicate(Project.NameKey nameKey) {
+    return new ProjectPredicate(ProjectField.NAME, nameKey.get());
+  }
+}
diff --git a/java/com/google/gerrit/index/project/ProjectIndexCollection.java b/java/com/google/gerrit/index/project/ProjectIndexCollection.java
new file mode 100644
index 0000000..281f992
--- /dev/null
+++ b/java/com/google/gerrit/index/project/ProjectIndexCollection.java
@@ -0,0 +1,28 @@
+// Copyright (C) 2017 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.google.gerrit.index.project;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.gerrit.index.IndexCollection;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.inject.Singleton;
+
+@Singleton
+public class ProjectIndexCollection
+    extends IndexCollection<Project.NameKey, ProjectData, ProjectIndex> {
+
+  @VisibleForTesting
+  public ProjectIndexCollection() {}
+}
diff --git a/java/com/google/gerrit/index/project/ProjectIndexRewriter.java b/java/com/google/gerrit/index/project/ProjectIndexRewriter.java
new file mode 100644
index 0000000..9e2bbdc
--- /dev/null
+++ b/java/com/google/gerrit/index/project/ProjectIndexRewriter.java
@@ -0,0 +1,42 @@
+// Copyright (C) 2017 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.google.gerrit.index.project;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.gerrit.index.IndexRewriter;
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class ProjectIndexRewriter implements IndexRewriter<ProjectData> {
+  private final ProjectIndexCollection indexes;
+
+  @Inject
+  ProjectIndexRewriter(ProjectIndexCollection indexes) {
+    this.indexes = indexes;
+  }
+
+  @Override
+  public Predicate<ProjectData> rewrite(Predicate<ProjectData> in, QueryOptions opts)
+      throws QueryParseException {
+    ProjectIndex index = indexes.getSearchIndex();
+    requireNonNull(index, "no active search index configured for projects");
+    return new IndexedProjectQuery(index, in, opts);
+  }
+}
diff --git a/java/com/google/gerrit/index/project/ProjectIndexer.java b/java/com/google/gerrit/index/project/ProjectIndexer.java
new file mode 100644
index 0000000..44dccfe
--- /dev/null
+++ b/java/com/google/gerrit/index/project/ProjectIndexer.java
@@ -0,0 +1,28 @@
+// Copyright (C) 2017 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.google.gerrit.index.project;
+
+import com.google.gerrit.reviewdb.client.Project;
+import java.io.IOException;
+
+public interface ProjectIndexer {
+
+  /**
+   * Synchronously index a project.
+   *
+   * @param nameKey name key of project to index.
+   */
+  void index(Project.NameKey nameKey) throws IOException;
+}
diff --git a/java/com/google/gerrit/index/project/ProjectPredicate.java b/java/com/google/gerrit/index/project/ProjectPredicate.java
new file mode 100644
index 0000000..4926eef
--- /dev/null
+++ b/java/com/google/gerrit/index/project/ProjectPredicate.java
@@ -0,0 +1,24 @@
+// 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.
+
+package com.google.gerrit.index.project;
+
+import com.google.gerrit.index.FieldDef;
+import com.google.gerrit.index.query.IndexPredicate;
+
+public class ProjectPredicate extends IndexPredicate<ProjectData> {
+  public ProjectPredicate(FieldDef<ProjectData, ?> def, String value) {
+    super(def, value);
+  }
+}
diff --git a/java/com/google/gerrit/index/project/ProjectSchemaDefinitions.java b/java/com/google/gerrit/index/project/ProjectSchemaDefinitions.java
new file mode 100644
index 0000000..f355216
--- /dev/null
+++ b/java/com/google/gerrit/index/project/ProjectSchemaDefinitions.java
@@ -0,0 +1,49 @@
+// Copyright (C) 2017 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.google.gerrit.index.project;
+
+import static com.google.gerrit.index.SchemaUtil.schema;
+
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.index.SchemaDefinitions;
+
+public class ProjectSchemaDefinitions extends SchemaDefinitions<ProjectData> {
+
+  @Deprecated
+  static final Schema<ProjectData> V1 =
+      schema(
+          ProjectField.NAME,
+          ProjectField.DESCRIPTION,
+          ProjectField.PARENT_NAME,
+          ProjectField.NAME_PART,
+          ProjectField.ANCESTOR_NAME);
+
+  @Deprecated
+  static final Schema<ProjectData> V2 = schema(V1, ProjectField.STATE, ProjectField.REF_STATE);
+
+  // Bump Lucene version requires reindexing
+  @Deprecated static final Schema<ProjectData> V3 = schema(V2);
+
+  // Lucene index was changed to add an additional field for sorting.
+  static final Schema<ProjectData> V4 = schema(V3);
+
+  public static final ProjectSchemaDefinitions INSTANCE = new ProjectSchemaDefinitions();
+
+  public static final String NAME = "projects";
+
+  private ProjectSchemaDefinitions() {
+    super(NAME, ProjectData.class);
+  }
+}
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/query/AndPredicate.java b/java/com/google/gerrit/index/query/AndPredicate.java
similarity index 100%
rename from gerrit-index/src/main/java/com/google/gerrit/index/query/AndPredicate.java
rename to java/com/google/gerrit/index/query/AndPredicate.java
diff --git a/java/com/google/gerrit/index/query/AndSource.java b/java/com/google/gerrit/index/query/AndSource.java
new file mode 100644
index 0000000..d1e1c30
--- /dev/null
+++ b/java/com/google/gerrit/index/query/AndSource.java
@@ -0,0 +1,204 @@
+// 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.
+
+package com.google.gerrit.index.query;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.collect.ImmutableList.toImmutableList;
+
+import com.google.common.base.Throwables;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.gwtorm.server.ListResultSet;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.OrmRuntimeException;
+import com.google.gwtorm.server.ResultSet;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.List;
+
+public class AndSource<T> extends AndPredicate<T>
+    implements DataSource<T>, Comparator<Predicate<T>> {
+  protected final DataSource<T> source;
+
+  private final IsVisibleToPredicate<T> isVisibleToPredicate;
+  private final int start;
+  private final int cardinality;
+
+  public AndSource(Collection<? extends Predicate<T>> that) {
+    this(that, null, 0);
+  }
+
+  public AndSource(Predicate<T> that, IsVisibleToPredicate<T> isVisibleToPredicate) {
+    this(that, isVisibleToPredicate, 0);
+  }
+
+  public AndSource(Predicate<T> that, IsVisibleToPredicate<T> isVisibleToPredicate, int start) {
+    this(ImmutableList.of(that), isVisibleToPredicate, start);
+  }
+
+  public AndSource(
+      Collection<? extends Predicate<T>> that,
+      IsVisibleToPredicate<T> isVisibleToPredicate,
+      int start) {
+    super(that);
+    checkArgument(start >= 0, "negative start: %s", start);
+    this.isVisibleToPredicate = isVisibleToPredicate;
+    this.start = start;
+
+    int c = Integer.MAX_VALUE;
+    DataSource<T> s = null;
+    int minCost = Integer.MAX_VALUE;
+    for (Predicate<T> p : sort(getChildren())) {
+      if (p instanceof DataSource) {
+        c = Math.min(c, ((DataSource<?>) p).getCardinality());
+
+        int cost = p.estimateCost();
+        if (cost < minCost) {
+          s = toDataSource(p);
+          minCost = cost;
+        }
+      }
+    }
+    this.source = s;
+    this.cardinality = c;
+  }
+
+  @Override
+  public ResultSet<T> read() throws OrmException {
+    try {
+      return readImpl();
+    } catch (OrmRuntimeException err) {
+      if (err.getCause() != null) {
+        Throwables.throwIfInstanceOf(err.getCause(), OrmException.class);
+      }
+      throw new OrmException(err);
+    }
+  }
+
+  @Override
+  public ResultSet<FieldBundle> readRaw() throws OrmException {
+    // TOOD(hiesel): Implement
+    throw new UnsupportedOperationException("not implemented");
+  }
+
+  private ResultSet<T> readImpl() throws OrmException {
+    if (source == null) {
+      throw new OrmException("No DataSource: " + this);
+    }
+    List<T> r = new ArrayList<>();
+    T last = null;
+    int nextStart = 0;
+    boolean skipped = false;
+    for (T data : buffer(source.read())) {
+      if (!isMatchable() || match(data)) {
+        r.add(data);
+      } else {
+        skipped = true;
+      }
+      last = data;
+      nextStart++;
+    }
+
+    if (skipped && last != null && source instanceof Paginated) {
+      // If our source is a paginated source and we skipped at
+      // least one of its results, we may not have filled the full
+      // limit the caller wants.  Restart the source and continue.
+      //
+      @SuppressWarnings("unchecked")
+      Paginated<T> p = (Paginated<T>) source;
+      while (skipped && r.size() < p.getOptions().limit() + start) {
+        skipped = false;
+        ResultSet<T> next = p.restart(nextStart);
+
+        for (T data : buffer(next)) {
+          if (match(data)) {
+            r.add(data);
+          } else {
+            skipped = true;
+          }
+          nextStart++;
+        }
+      }
+    }
+
+    if (start >= r.size()) {
+      r = ImmutableList.of();
+    } else if (start > 0) {
+      r = ImmutableList.copyOf(r.subList(start, r.size()));
+    }
+    return new ListResultSet<>(r);
+  }
+
+  @Override
+  public boolean isMatchable() {
+    return isVisibleToPredicate != null || super.isMatchable();
+  }
+
+  @Override
+  public boolean match(T object) throws OrmException {
+    if (isVisibleToPredicate != null && !isVisibleToPredicate.match(object)) {
+      return false;
+    }
+
+    if (super.isMatchable() && !super.match(object)) {
+      return false;
+    }
+
+    return true;
+  }
+
+  private Iterable<T> buffer(ResultSet<T> scanner) {
+    return FluentIterable.from(Iterables.partition(scanner, 50))
+        .transformAndConcat(this::transformBuffer);
+  }
+
+  protected List<T> transformBuffer(List<T> buffer) throws OrmRuntimeException {
+    return buffer;
+  }
+
+  @Override
+  public int getCardinality() {
+    return cardinality;
+  }
+
+  private ImmutableList<Predicate<T>> sort(Collection<? extends Predicate<T>> that) {
+    return that.stream().sorted(this).collect(toImmutableList());
+  }
+
+  @Override
+  public int compare(Predicate<T> a, Predicate<T> b) {
+    int ai = a instanceof DataSource ? 0 : 1;
+    int bi = b instanceof DataSource ? 0 : 1;
+    int cmp = ai - bi;
+
+    if (cmp == 0) {
+      cmp = a.estimateCost() - b.estimateCost();
+    }
+
+    if (cmp == 0 && a instanceof DataSource && b instanceof DataSource) {
+      DataSource<?> as = (DataSource<?>) a;
+      DataSource<?> bs = (DataSource<?>) b;
+      cmp = as.getCardinality() - bs.getCardinality();
+    }
+    return cmp;
+  }
+
+  @SuppressWarnings("unchecked")
+  private DataSource<T> toDataSource(Predicate<T> pred) {
+    return (DataSource<T>) pred;
+  }
+}
diff --git a/java/com/google/gerrit/index/query/DataSource.java b/java/com/google/gerrit/index/query/DataSource.java
new file mode 100644
index 0000000..88cc0e3c
--- /dev/null
+++ b/java/com/google/gerrit/index/query/DataSource.java
@@ -0,0 +1,29 @@
+// Copyright (C) 2014 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.google.gerrit.index.query;
+
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.ResultSet;
+
+public interface DataSource<T> {
+  /** @return an estimate of the number of results from {@link #read()}. */
+  int getCardinality();
+
+  /** @return read from the database and return the results. */
+  ResultSet<T> read() throws OrmException;
+
+  /** @return read from the database and return the raw results. */
+  ResultSet<FieldBundle> readRaw() throws OrmException;
+}
diff --git a/java/com/google/gerrit/index/query/FieldBundle.java b/java/com/google/gerrit/index/query/FieldBundle.java
new file mode 100644
index 0000000..6ecb6e6
--- /dev/null
+++ b/java/com/google/gerrit/index/query/FieldBundle.java
@@ -0,0 +1,61 @@
+// Copyright (C) 2017 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.google.gerrit.index.query;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.ListMultimap;
+import com.google.gerrit.index.FieldDef;
+
+/** FieldBundle is an abstraction that allows retrieval of raw values from different sources. */
+public class FieldBundle {
+
+  // Map String => List{Integer, Long, Timestamp, String, byte[]}
+  private ImmutableListMultimap<String, Object> fields;
+
+  public FieldBundle(ListMultimap<String, Object> fields) {
+    this.fields = ImmutableListMultimap.copyOf(fields);
+  }
+
+  /**
+   * Get a field's value based on the field definition.
+   *
+   * @param fieldDef the definition of the field of which the value should be retrieved. The field
+   *     must be stored and contained in the result set as specified by {@link
+   *     com.google.gerrit.index.QueryOptions}.
+   * @param <T> Data type of the returned object based on the field definition
+   * @return Either a single element or an Iterable based on the field definition. An empty list is
+   *     returned for repeated fields that are not contained in the result.
+   * @throws IllegalArgumentException if the requested field is not stored or not present. This
+   *     check is only enforced on non-repeatable fields.
+   */
+  @SuppressWarnings("unchecked")
+  public <T> T getValue(FieldDef<?, T> fieldDef) {
+    checkArgument(fieldDef.isStored(), "Field must be stored");
+    checkArgument(
+        fields.containsKey(fieldDef.getName()) || fieldDef.isRepeatable(),
+        "Field %s is not in result set %s",
+        fieldDef.getName(),
+        fields.keySet());
+
+    Iterable<Object> result = fields.get(fieldDef.getName());
+    if (fieldDef.isRepeatable()) {
+      return (T) result;
+    }
+    return (T) Iterables.getOnlyElement(result);
+  }
+}
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/query/IndexPredicate.java b/java/com/google/gerrit/index/query/IndexPredicate.java
similarity index 100%
rename from gerrit-index/src/main/java/com/google/gerrit/index/query/IndexPredicate.java
rename to java/com/google/gerrit/index/query/IndexPredicate.java
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/query/IntPredicate.java b/java/com/google/gerrit/index/query/IntPredicate.java
similarity index 100%
rename from gerrit-index/src/main/java/com/google/gerrit/index/query/IntPredicate.java
rename to java/com/google/gerrit/index/query/IntPredicate.java
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/query/IntegerRangePredicate.java b/java/com/google/gerrit/index/query/IntegerRangePredicate.java
similarity index 100%
rename from gerrit-index/src/main/java/com/google/gerrit/index/query/IntegerRangePredicate.java
rename to java/com/google/gerrit/index/query/IntegerRangePredicate.java
diff --git a/java/com/google/gerrit/index/query/InternalQuery.java b/java/com/google/gerrit/index/query/InternalQuery.java
new file mode 100644
index 0000000..3a4b372
--- /dev/null
+++ b/java/com/google/gerrit/index/query/InternalQuery.java
@@ -0,0 +1,109 @@
+// 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.
+
+package com.google.gerrit.index.query;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.util.stream.Collectors.toSet;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
+import com.google.gerrit.index.FieldDef;
+import com.google.gerrit.index.Index;
+import com.google.gerrit.index.IndexCollection;
+import com.google.gerrit.index.IndexConfig;
+import com.google.gerrit.index.Schema;
+import com.google.gwtorm.server.OrmException;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Execute a single query over a secondary index, for use by Gerrit internals.
+ *
+ * <p>By default, visibility of returned entities is not enforced (unlike in {@link
+ * QueryProcessor}). The methods in this class are not typically used by user-facing paths, but
+ * rather by internal callers that need to process all matching results.
+ *
+ * <p>Instances are one-time-use. Other singleton classes should inject a Provider rather than
+ * holding on to a single instance.
+ */
+public class InternalQuery<T> {
+  private final QueryProcessor<T> queryProcessor;
+  private final IndexCollection<?, T, ? extends Index<?, T>> indexes;
+
+  protected final IndexConfig indexConfig;
+
+  protected InternalQuery(
+      QueryProcessor<T> queryProcessor,
+      IndexCollection<?, T, ? extends Index<?, T>> indexes,
+      IndexConfig indexConfig) {
+    this.queryProcessor = queryProcessor.enforceVisibility(false);
+    this.indexes = indexes;
+    this.indexConfig = indexConfig;
+  }
+
+  public InternalQuery<T> setLimit(int n) {
+    queryProcessor.setUserProvidedLimit(n);
+    return this;
+  }
+
+  public InternalQuery<T> enforceVisibility(boolean enforce) {
+    queryProcessor.enforceVisibility(enforce);
+    return this;
+  }
+
+  @SuppressWarnings("unchecked") // Can't set @SafeVarargs on a non-final method.
+  public InternalQuery<T> setRequestedFields(FieldDef<T, ?>... fields) {
+    checkArgument(fields.length > 0, "requested field list is empty");
+    queryProcessor.setRequestedFields(
+        Arrays.stream(fields).map(FieldDef::getName).collect(toSet()));
+    return this;
+  }
+
+  public InternalQuery<T> noFields() {
+    queryProcessor.setRequestedFields(ImmutableSet.of());
+    return this;
+  }
+
+  public List<T> query(Predicate<T> p) throws OrmException {
+    try {
+      return queryProcessor.query(p).entities();
+    } catch (QueryParseException e) {
+      throw new OrmException(e);
+    }
+  }
+
+  /**
+   * Run multiple queries in parallel.
+   *
+   * <p>If a limit was specified using {@link #setLimit(int)}, that limit is applied to each query
+   * independently.
+   *
+   * @param queries list of queries.
+   * @return results of the queries, one list of results per input query, in the same order as the
+   *     input.
+   */
+  public List<List<T>> query(List<Predicate<T>> queries) throws OrmException {
+    try {
+      return Lists.transform(queryProcessor.query(queries), QueryResult::entities);
+    } catch (QueryParseException e) {
+      throw new OrmException(e);
+    }
+  }
+
+  protected Schema<T> schema() {
+    Index<?, T> index = indexes != null ? indexes.getSearchIndex() : null;
+    return index != null ? index.getSchema() : null;
+  }
+}
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/query/IsVisibleToPredicate.java b/java/com/google/gerrit/index/query/IsVisibleToPredicate.java
similarity index 100%
rename from gerrit-index/src/main/java/com/google/gerrit/index/query/IsVisibleToPredicate.java
rename to java/com/google/gerrit/index/query/IsVisibleToPredicate.java
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/query/LimitPredicate.java b/java/com/google/gerrit/index/query/LimitPredicate.java
similarity index 100%
rename from gerrit-index/src/main/java/com/google/gerrit/index/query/LimitPredicate.java
rename to java/com/google/gerrit/index/query/LimitPredicate.java
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/query/Matchable.java b/java/com/google/gerrit/index/query/Matchable.java
similarity index 100%
rename from gerrit-index/src/main/java/com/google/gerrit/index/query/Matchable.java
rename to java/com/google/gerrit/index/query/Matchable.java
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/query/NotPredicate.java b/java/com/google/gerrit/index/query/NotPredicate.java
similarity index 100%
rename from gerrit-index/src/main/java/com/google/gerrit/index/query/NotPredicate.java
rename to java/com/google/gerrit/index/query/NotPredicate.java
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/query/OperatorPredicate.java b/java/com/google/gerrit/index/query/OperatorPredicate.java
similarity index 100%
rename from gerrit-index/src/main/java/com/google/gerrit/index/query/OperatorPredicate.java
rename to java/com/google/gerrit/index/query/OperatorPredicate.java
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/query/OrPredicate.java b/java/com/google/gerrit/index/query/OrPredicate.java
similarity index 100%
rename from gerrit-index/src/main/java/com/google/gerrit/index/query/OrPredicate.java
rename to java/com/google/gerrit/index/query/OrPredicate.java
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/query/Paginated.java b/java/com/google/gerrit/index/query/Paginated.java
similarity index 100%
rename from gerrit-index/src/main/java/com/google/gerrit/index/query/Paginated.java
rename to java/com/google/gerrit/index/query/Paginated.java
diff --git a/java/com/google/gerrit/index/query/PostFilterPredicate.java b/java/com/google/gerrit/index/query/PostFilterPredicate.java
new file mode 100644
index 0000000..78b4c2b
--- /dev/null
+++ b/java/com/google/gerrit/index/query/PostFilterPredicate.java
@@ -0,0 +1,25 @@
+// 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.
+
+package com.google.gerrit.index.query;
+
+/**
+ * Matches all documents in the index, with additional filtering done in the subclass's {@code
+ * match} method.
+ */
+public abstract class PostFilterPredicate<T> extends OperatorPredicate<T> implements Matchable<T> {
+  public PostFilterPredicate(String operator, String value) {
+    super(operator, value);
+  }
+}
diff --git a/java/com/google/gerrit/index/query/Predicate.java b/java/com/google/gerrit/index/query/Predicate.java
new file mode 100644
index 0000000..53c92c9
--- /dev/null
+++ b/java/com/google/gerrit/index/query/Predicate.java
@@ -0,0 +1,177 @@
+// Copyright (C) 2009 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.google.gerrit.index.query;
+
+import static com.google.common.base.Preconditions.checkState;
+
+import com.google.common.collect.Iterables;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * An abstract predicate tree for any form of query.
+ *
+ * <p>Implementations should be immutable, such that the meaning of a predicate never changes once
+ * constructed. They should ensure their immutable promise by defensively copying any structures
+ * which might be modified externally, but was passed into the object's constructor.
+ *
+ * <p>However, implementations <i>may</i> retain non-thread-safe caches internally, to speed up
+ * evaluation operations within the context of one thread's evaluation of the predicate. As a
+ * result, callers should assume predicates are not thread-safe, but that two predicate graphs
+ * produce the same results given the same inputs if they are {@link #equals(Object)}.
+ *
+ * <p>Predicates should support deep inspection whenever possible, so that generic algorithms can be
+ * written to operate against them. Predicates which contain other predicates should override {@link
+ * #getChildren()} to return the list of children nested within the predicate.
+ *
+ * @param <T> type of object the predicate can evaluate in memory.
+ */
+public abstract class Predicate<T> {
+  /** A predicate that matches any input, always, with no cost. */
+  @SuppressWarnings("unchecked")
+  public static <T> Predicate<T> any() {
+    return (Predicate<T>) Any.INSTANCE;
+  }
+
+  /** Combine the passed predicates into a single AND node. */
+  @SafeVarargs
+  public static <T> Predicate<T> and(Predicate<T>... that) {
+    if (that.length == 1) {
+      return that[0];
+    }
+    return new AndPredicate<>(that);
+  }
+
+  /** Combine the passed predicates into a single AND node. */
+  public static <T> Predicate<T> and(Collection<? extends Predicate<T>> that) {
+    if (that.size() == 1) {
+      return Iterables.getOnlyElement(that);
+    }
+    return new AndPredicate<>(that);
+  }
+
+  /** Combine the passed predicates into a single OR node. */
+  @SafeVarargs
+  public static <T> Predicate<T> or(Predicate<T>... that) {
+    if (that.length == 1) {
+      return that[0];
+    }
+    return new OrPredicate<>(that);
+  }
+
+  /** Combine the passed predicates into a single OR node. */
+  public static <T> Predicate<T> or(Collection<? extends Predicate<T>> that) {
+    if (that.size() == 1) {
+      return Iterables.getOnlyElement(that);
+    }
+    return new OrPredicate<>(that);
+  }
+
+  /** Invert the passed node. */
+  public static <T> Predicate<T> not(Predicate<T> that) {
+    if (that instanceof NotPredicate) {
+      // Negate of a negate is the original predicate.
+      //
+      return that.getChild(0);
+    }
+    return new NotPredicate<>(that);
+  }
+
+  /** Get the children of this predicate, if any. */
+  public List<Predicate<T>> getChildren() {
+    return Collections.emptyList();
+  }
+
+  /** Same as {@code getChildren().size()} */
+  public int getChildCount() {
+    return getChildren().size();
+  }
+
+  /** Same as {@code getChildren().get(i)} */
+  public Predicate<T> getChild(int i) {
+    return getChildren().get(i);
+  }
+
+  /** Get the number of leaf terms in this predicate. */
+  public int getLeafCount() {
+    int leafCount = 0;
+    for (Predicate<?> childPredicate : getChildren()) {
+      if (childPredicate instanceof IndexPredicate) {
+        leafCount++;
+      }
+      leafCount += childPredicate.getLeafCount();
+    }
+    return leafCount;
+  }
+
+  /** Create a copy of this predicate, with new children. */
+  public abstract Predicate<T> copy(Collection<? extends Predicate<T>> children);
+
+  public boolean isMatchable() {
+    return this instanceof Matchable;
+  }
+
+  @SuppressWarnings("unchecked")
+  public Matchable<T> asMatchable() {
+    checkState(isMatchable(), "not matchable");
+    return (Matchable<T>) this;
+  }
+
+  /** @return a cost estimate to run this predicate, higher figures cost more. */
+  public int estimateCost() {
+    if (!isMatchable()) {
+      return 1;
+    }
+    return asMatchable().getCost();
+  }
+
+  @Override
+  public abstract int hashCode();
+
+  @Override
+  public abstract boolean equals(Object other);
+
+  private static class Any<T> extends Predicate<T> implements Matchable<T> {
+    private static final Any<Object> INSTANCE = new Any<>();
+
+    private Any() {}
+
+    @Override
+    public Predicate<T> copy(Collection<? extends Predicate<T>> children) {
+      return this;
+    }
+
+    @Override
+    public boolean match(T object) {
+      return true;
+    }
+
+    @Override
+    public int getCost() {
+      return 0;
+    }
+
+    @Override
+    public int hashCode() {
+      return System.identityHashCode(this);
+    }
+
+    @Override
+    public boolean equals(Object other) {
+      return other == this;
+    }
+  }
+}
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/query/QueryBuilder.java b/java/com/google/gerrit/index/query/QueryBuilder.java
similarity index 100%
rename from gerrit-index/src/main/java/com/google/gerrit/index/query/QueryBuilder.java
rename to java/com/google/gerrit/index/query/QueryBuilder.java
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/query/QueryParseException.java b/java/com/google/gerrit/index/query/QueryParseException.java
similarity index 100%
rename from gerrit-index/src/main/java/com/google/gerrit/index/query/QueryParseException.java
rename to java/com/google/gerrit/index/query/QueryParseException.java
diff --git a/java/com/google/gerrit/index/query/QueryProcessor.java b/java/com/google/gerrit/index/query/QueryProcessor.java
new file mode 100644
index 0000000..64d8742
--- /dev/null
+++ b/java/com/google/gerrit/index/query/QueryProcessor.java
@@ -0,0 +1,383 @@
+// 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.
+
+package com.google.gerrit.index.query;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static com.google.common.flogger.LazyArgs.lazy;
+import static java.util.stream.Collectors.toSet;
+
+import com.google.common.base.Throwables;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Ordering;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.index.Index;
+import com.google.gerrit.index.IndexCollection;
+import com.google.gerrit.index.IndexConfig;
+import com.google.gerrit.index.IndexRewriter;
+import com.google.gerrit.index.IndexedQuery;
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.SchemaDefinitions;
+import com.google.gerrit.metrics.Description;
+import com.google.gerrit.metrics.Field;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.metrics.Timer1;
+import com.google.gerrit.server.logging.CallerFinder;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.OrmRuntimeException;
+import com.google.gwtorm.server.ResultSet;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.IntSupplier;
+import java.util.stream.IntStream;
+
+/**
+ * Lower-level implementation for executing a single query over a secondary index.
+ *
+ * <p>Instances are one-time-use. Other singleton classes should inject a Provider rather than
+ * holding on to a single instance.
+ */
+public abstract class QueryProcessor<T> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  protected static class Metrics {
+    final Timer1<String> executionTime;
+
+    Metrics(MetricMaker metricMaker) {
+      Field<String> index = Field.ofString("index", "index name");
+      executionTime =
+          metricMaker.newTimer(
+              "query/query_latency",
+              new Description("Successful query latency, accumulated over the life of the process")
+                  .setCumulative()
+                  .setUnit(Description.Units.MILLISECONDS),
+              index);
+    }
+  }
+
+  private final Metrics metrics;
+  private final SchemaDefinitions<T> schemaDef;
+  private final IndexConfig indexConfig;
+  private final IndexCollection<?, T, ? extends Index<?, T>> indexes;
+  private final IndexRewriter<T> rewriter;
+  private final String limitField;
+  private final IntSupplier permittedLimit;
+  private final CallerFinder callerFinder;
+
+  // This class is not generally thread-safe, but programmer error may result in it being shared
+  // across threads. At least ensure the bit for checking if it's been used is threadsafe.
+  private final AtomicBoolean used;
+
+  protected int start;
+
+  private boolean enforceVisibility = true;
+  private int userProvidedLimit;
+  private Set<String> requestedFields;
+
+  protected QueryProcessor(
+      MetricMaker metricMaker,
+      SchemaDefinitions<T> schemaDef,
+      IndexConfig indexConfig,
+      IndexCollection<?, T, ? extends Index<?, T>> indexes,
+      IndexRewriter<T> rewriter,
+      String limitField,
+      IntSupplier permittedLimit) {
+    this.metrics = new Metrics(metricMaker);
+    this.schemaDef = schemaDef;
+    this.indexConfig = indexConfig;
+    this.indexes = indexes;
+    this.rewriter = rewriter;
+    this.limitField = limitField;
+    this.permittedLimit = permittedLimit;
+    this.used = new AtomicBoolean(false);
+    this.callerFinder =
+        CallerFinder.builder()
+            .addTarget(InternalQuery.class)
+            .addTarget(QueryProcessor.class)
+            .matchSubClasses(true)
+            .skip(1)
+            .build();
+  }
+
+  public QueryProcessor<T> setStart(int n) {
+    start = n;
+    return this;
+  }
+
+  /**
+   * Specify whether to enforce visibility by filtering out results that are not visible to the
+   * user.
+   *
+   * <p>Enforcing visibility may have performance consequences, as the index system may need to
+   * post-filter a large number of results to fill even a modest limit.
+   *
+   * <p>If visibility is enforced, the user's {@code queryLimit} global capability is also used to
+   * bound the total number of results. If this capability is non-positive, this results in the
+   * entire query processor being {@link #isDisabled() disabled}.
+   *
+   * @param enforce whether to enforce visibility.
+   * @return this.
+   */
+  public QueryProcessor<T> enforceVisibility(boolean enforce) {
+    enforceVisibility = enforce;
+    return this;
+  }
+
+  /**
+   * Set an end-user-provided limit on the number of results returned.
+   *
+   * <p>Since this limit is provided by an end user, it may exceed the limit that they are
+   * authorized to use. This is allowed; the processor will take multiple possible limits into
+   * account and choose the one that makes the most sense.
+   *
+   * @param n limit; zero or negative means no limit.
+   * @return this.
+   */
+  public QueryProcessor<T> setUserProvidedLimit(int n) {
+    userProvidedLimit = n;
+    return this;
+  }
+
+  public QueryProcessor<T> setRequestedFields(Set<String> fields) {
+    requestedFields = fields;
+    return this;
+  }
+
+  /**
+   * Query for entities that match a structured query.
+   *
+   * @see #query(List)
+   * @param query the query.
+   * @return results of the query.
+   */
+  public QueryResult<T> query(Predicate<T> query) throws OrmException, QueryParseException {
+    return query(ImmutableList.of(query)).get(0);
+  }
+
+  /**
+   * Perform multiple queries in parallel.
+   *
+   * <p>If querying is disabled, short-circuits the index and returns empty results. Callers that
+   * wish to distinguish this case from a query returning no results from the index may call {@link
+   * #isDisabled()} themselves.
+   *
+   * @param queries list of queries.
+   * @return results of the queries, one QueryResult per input query, in the same order as the
+   *     input.
+   */
+  public List<QueryResult<T>> query(List<Predicate<T>> queries)
+      throws OrmException, QueryParseException {
+    try {
+      return query(null, queries);
+    } catch (OrmRuntimeException e) {
+      throw new OrmException(e.getMessage(), e);
+    } catch (OrmException e) {
+      if (e.getCause() != null) {
+        Throwables.throwIfInstanceOf(e.getCause(), QueryParseException.class);
+      }
+      throw e;
+    }
+  }
+
+  private List<QueryResult<T>> query(
+      @Nullable List<String> queryStrings, List<Predicate<T>> queries)
+      throws OrmException, QueryParseException {
+    long startNanos = System.nanoTime();
+    checkState(!used.getAndSet(true), "%s has already been used", getClass().getSimpleName());
+    int cnt = queries.size();
+    if (queryStrings != null) {
+      int qs = queryStrings.size();
+      checkArgument(qs == cnt, "got %s query strings but %s predicates", qs, cnt);
+    }
+    if (cnt == 0) {
+      return ImmutableList.of();
+    }
+    if (isDisabled()) {
+      return disabledResults(queryStrings, queries);
+    }
+
+    logger.atFine().log(
+        "Executing %d %s index queries for %s",
+        cnt, schemaDef.getName(), callerFinder.findCaller());
+    List<QueryResult<T>> out;
+    try {
+      // Parse and rewrite all queries.
+      List<Integer> limits = new ArrayList<>(cnt);
+      List<Predicate<T>> predicates = new ArrayList<>(cnt);
+      List<DataSource<T>> sources = new ArrayList<>(cnt);
+      int queryCount = 0;
+      for (Predicate<T> q : queries) {
+        int limit = getEffectiveLimit(q);
+        limits.add(limit);
+
+        if (limit == getBackendSupportedLimit()) {
+          limit--;
+        }
+
+        int page = (start / limit) + 1;
+        if (page > indexConfig.maxPages()) {
+          throw new QueryParseException(
+              "Cannot go beyond page " + indexConfig.maxPages() + " of results");
+        }
+
+        // Always bump limit by 1, even if this results in exceeding the permitted
+        // max for this user. The only way to see if there are more entities is to
+        // ask for one more result from the query.
+        QueryOptions opts = createOptions(indexConfig, start, limit + 1, getRequestedFields());
+        logger.atFine().log("Query options: " + opts);
+        Predicate<T> pred = rewriter.rewrite(q, opts);
+        if (enforceVisibility) {
+          pred = enforceVisibility(pred);
+        }
+        predicates.add(pred);
+        logger.atFine().log(
+            "%s index query[%d]:\n%s",
+            schemaDef.getName(),
+            queryCount++,
+            pred instanceof IndexedQuery ? pred.getChild(0) : pred);
+
+        @SuppressWarnings("unchecked")
+        DataSource<T> s = (DataSource<T>) pred;
+        sources.add(s);
+      }
+
+      // Run each query asynchronously, if supported.
+      List<ResultSet<T>> matches = new ArrayList<>(cnt);
+      for (DataSource<T> s : sources) {
+        matches.add(s.read());
+      }
+
+      out = new ArrayList<>(cnt);
+      for (int i = 0; i < cnt; i++) {
+        List<T> matchesList = matches.get(i).toList();
+        logger.atFine().log(
+            "Matches[%d]:\n%s",
+            i, lazy(() -> matchesList.stream().map(this::formatForLogging).collect(toSet())));
+        out.add(
+            QueryResult.create(
+                queryStrings != null ? queryStrings.get(i) : null,
+                predicates.get(i),
+                limits.get(i),
+                matchesList));
+      }
+
+      // Only measure successful queries that actually touched the index.
+      metrics.executionTime.record(
+          schemaDef.getName(), System.nanoTime() - startNanos, TimeUnit.NANOSECONDS);
+    } catch (OrmException | OrmRuntimeException e) {
+      Optional<QueryParseException> qpe = findQueryParseException(e);
+      if (qpe.isPresent()) {
+        throw new QueryParseException(qpe.get().getMessage(), e);
+      }
+      throw e;
+    }
+    return out;
+  }
+
+  private static <T> ImmutableList<QueryResult<T>> disabledResults(
+      List<String> queryStrings, List<Predicate<T>> queries) {
+    return IntStream.range(0, queries.size())
+        .mapToObj(
+            i ->
+                QueryResult.create(
+                    queryStrings != null ? queryStrings.get(i) : null,
+                    queries.get(i),
+                    0,
+                    ImmutableList.of()))
+        .collect(toImmutableList());
+  }
+
+  protected QueryOptions createOptions(
+      IndexConfig indexConfig, int start, int limit, Set<String> requestedFields) {
+    return QueryOptions.create(indexConfig, start, limit, requestedFields);
+  }
+
+  /**
+   * Invoked after the query was rewritten. Subclasses must overwrite this method to filter out
+   * results that are not visible to the calling user.
+   *
+   * @param pred the query
+   * @return the modified query
+   */
+  protected abstract Predicate<T> enforceVisibility(Predicate<T> pred);
+
+  private Set<String> getRequestedFields() {
+    if (requestedFields != null) {
+      return requestedFields;
+    }
+    Index<?, T> index = indexes.getSearchIndex();
+    return index != null ? index.getSchema().getStoredFields().keySet() : ImmutableSet.<String>of();
+  }
+
+  /**
+   * Check whether querying should be disabled.
+   *
+   * <p>Currently, the only condition that can disable the whole query processor is if both {@link
+   * #enforceVisibility(boolean) visibility is enforced} and the user has a non-positive maximum
+   * value for the {@code queryLimit} capability.
+   *
+   * <p>If querying is disabled, all calls to {@link #query(Predicate)} and {@link #query(List)}
+   * will return empty results. This method can be used if callers wish to distinguish this case
+   * from a query returning no results from the index.
+   *
+   * @return true if querying should be disabled.
+   */
+  public boolean isDisabled() {
+    return enforceVisibility && getPermittedLimit() <= 0;
+  }
+
+  private int getPermittedLimit() {
+    return enforceVisibility ? permittedLimit.getAsInt() : Integer.MAX_VALUE;
+  }
+
+  private int getBackendSupportedLimit() {
+    return indexConfig.maxLimit();
+  }
+
+  private int getEffectiveLimit(Predicate<T> p) {
+    List<Integer> possibleLimits = new ArrayList<>(4);
+    possibleLimits.add(getBackendSupportedLimit());
+    possibleLimits.add(getPermittedLimit());
+    if (userProvidedLimit > 0) {
+      possibleLimits.add(userProvidedLimit);
+    }
+    if (limitField != null) {
+      Integer limitFromPredicate = LimitPredicate.getLimit(limitField, p);
+      if (limitFromPredicate != null) {
+        possibleLimits.add(limitFromPredicate);
+      }
+    }
+    int result = Ordering.natural().min(possibleLimits);
+    // Should have short-circuited from #query or thrown some other exception before getting here.
+    checkState(result > 0, "effective limit should be positive");
+    return result;
+  }
+
+  private static Optional<QueryParseException> findQueryParseException(Throwable t) {
+    return Throwables.getCausalChain(t).stream()
+        .filter(c -> c instanceof QueryParseException)
+        .map(QueryParseException.class::cast)
+        .findFirst();
+  }
+
+  protected abstract String formatForLogging(T t);
+}
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/query/QueryRequiresAuthException.java b/java/com/google/gerrit/index/query/QueryRequiresAuthException.java
similarity index 100%
rename from gerrit-index/src/main/java/com/google/gerrit/index/query/QueryRequiresAuthException.java
rename to java/com/google/gerrit/index/query/QueryRequiresAuthException.java
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/query/QueryResult.java b/java/com/google/gerrit/index/query/QueryResult.java
similarity index 100%
rename from gerrit-index/src/main/java/com/google/gerrit/index/query/QueryResult.java
rename to java/com/google/gerrit/index/query/QueryResult.java
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/query/RangeUtil.java b/java/com/google/gerrit/index/query/RangeUtil.java
similarity index 100%
rename from gerrit-index/src/main/java/com/google/gerrit/index/query/RangeUtil.java
rename to java/com/google/gerrit/index/query/RangeUtil.java
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/query/RegexPredicate.java b/java/com/google/gerrit/index/query/RegexPredicate.java
similarity index 100%
rename from gerrit-index/src/main/java/com/google/gerrit/index/query/RegexPredicate.java
rename to java/com/google/gerrit/index/query/RegexPredicate.java
diff --git a/gerrit-index/src/main/java/com/google/gerrit/index/query/TimestampRangePredicate.java b/java/com/google/gerrit/index/query/TimestampRangePredicate.java
similarity index 100%
rename from gerrit-index/src/main/java/com/google/gerrit/index/query/TimestampRangePredicate.java
rename to java/com/google/gerrit/index/query/TimestampRangePredicate.java
diff --git a/java/com/google/gerrit/launcher/BUILD b/java/com/google/gerrit/launcher/BUILD
new file mode 100644
index 0000000..18dcd52
--- /dev/null
+++ b/java/com/google/gerrit/launcher/BUILD
@@ -0,0 +1,19 @@
+# NOTE: GerritLauncher must be a single, self-contained class. Do not add any
+# additional srcs or deps to this rule.
+java_library(
+    name = "launcher",
+    srcs = ["GerritLauncher.java"],
+    resources = [":workspace-root.txt"],
+    visibility = ["//visibility:public"],
+)
+
+# The root of the workspace is non-hermetic, but we need it for
+# on-the-fly GWT recompiles and PolyGerrit updates.
+genrule(
+    name = "gen_root",
+    outs = ["workspace-root.txt"],
+    cmd = ("cat bazel-out/stable-status.txt | " +
+           "grep STABLE_WORKSPACE_ROOT | cut -d ' ' -f 2 > $@"),
+    stamp = 1,
+    visibility = ["//visibility:public"],
+)
diff --git a/java/com/google/gerrit/launcher/GerritLauncher.java b/java/com/google/gerrit/launcher/GerritLauncher.java
new file mode 100644
index 0000000..e407d08
--- /dev/null
+++ b/java/com/google/gerrit/launcher/GerritLauncher.java
@@ -0,0 +1,774 @@
+// Copyright (C) 2009 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.google.gerrit.launcher;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.concurrent.TimeUnit.DAYS;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.net.JarURLConnection;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.nio.file.FileSystem;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.security.CodeSource;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Scanner;
+import java.util.SortedMap;
+import java.util.TreeMap;
+import java.util.jar.Attributes;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+/** Main class for a JAR file to run code from "WEB-INF/lib". */
+public final class GerritLauncher {
+  private static final String PKG = "com.google.gerrit.pgm";
+  public static final String NOT_ARCHIVED = "NOT_ARCHIVED";
+
+  private static ClassLoader daemonClassLoader;
+
+  public static void main(String[] argv) throws Exception {
+    System.exit(mainImpl(argv));
+  }
+
+  /**
+   * Invokes a proram.
+   *
+   * <p>Creates a new classloader to load and run the program class. To reuse a classloader across
+   * calls (e.g. from tests), use {@link #invokeProgram(ClassLoader, String[])}.
+   *
+   * @param argv arguments, as would be passed to {@code gerrit.war}. The first argument is the
+   *     program name.
+   * @return program return code.
+   * @throws Exception if any error occurs.
+   */
+  public static int mainImpl(String[] argv) throws Exception {
+    if (argv.length == 0 || "-h".equals(argv[0]) || "--help".equals(argv[0])) {
+      File me;
+      try {
+        me = getDistributionArchive();
+      } catch (FileNotFoundException e) {
+        me = null;
+      }
+
+      String jar = me != null ? me.getName() : "gerrit.war";
+      System.err.println("Gerrit Code Review " + getVersion(me));
+      System.err.println("usage: java -jar " + jar + " command [ARG ...]");
+      System.err.println();
+      System.err.println("The most commonly used commands are:");
+      System.err.println("  init            Initialize a Gerrit installation");
+      System.err.println("  reindex         Rebuild the secondary index");
+      System.err.println("  daemon          Run the Gerrit network daemons");
+      System.err.println("  gsql            Run the interactive query console");
+      System.err.println("  version         Display the build version number");
+      System.err.println("  passwd          Set or change password in secure.config");
+
+      System.err.println();
+      System.err.println("  ls              List files available for cat");
+      System.err.println("  cat FILE        Display a file from the archive");
+      System.err.println();
+      return 1;
+    }
+
+    // Special cases, a few global options actually are programs.
+    //
+    if ("-v".equals(argv[0]) || "--version".equals(argv[0])) {
+      argv[0] = "version";
+    } else if ("-p".equals(argv[0]) || "--cat".equals(argv[0])) {
+      argv[0] = "cat";
+    } else if ("-l".equals(argv[0]) || "--ls".equals(argv[0])) {
+      argv[0] = "ls";
+    }
+
+    // Run the application class
+    //
+    final ClassLoader cl = libClassLoader(isProlog(programClassName(argv[0])));
+    Thread.currentThread().setContextClassLoader(cl);
+    return invokeProgram(cl, argv);
+  }
+
+  public static void daemonStart(String[] argv) throws Exception {
+    if (daemonClassLoader != null) {
+      throw new IllegalStateException("daemonStart can be called only once per JVM instance");
+    }
+    final ClassLoader cl = libClassLoader(false);
+    Thread.currentThread().setContextClassLoader(cl);
+
+    daemonClassLoader = cl;
+
+    String[] daemonArgv = new String[argv.length + 1];
+    daemonArgv[0] = "daemon";
+    for (int i = 0; i < argv.length; i++) {
+      daemonArgv[i + 1] = argv[i];
+    }
+    int res = invokeProgram(cl, daemonArgv);
+    if (res != 0) {
+      throw new Exception("Unexpected return value: " + res);
+    }
+  }
+
+  public static void daemonStop(String[] argv) throws Exception {
+    if (daemonClassLoader == null) {
+      throw new IllegalStateException("daemonStop can be called only after call to daemonStop");
+    }
+    String[] daemonArgv = new String[argv.length + 2];
+    daemonArgv[0] = "daemon";
+    daemonArgv[1] = "--stop-only";
+    for (int i = 0; i < argv.length; i++) {
+      daemonArgv[i + 2] = argv[i];
+    }
+    int res = invokeProgram(daemonClassLoader, daemonArgv);
+    if (res != 0) {
+      throw new Exception("Unexpected return value: " + res);
+    }
+  }
+
+  private static boolean isProlog(String cn) {
+    return "PrologShell".equals(cn) || "Rulec".equals(cn);
+  }
+
+  private static String getVersion(File me) {
+    if (me == null) {
+      return "";
+    }
+
+    try (JarFile jar = new JarFile(me)) {
+      Manifest mf = jar.getManifest();
+      Attributes att = mf.getMainAttributes();
+      String val = att.getValue(Attributes.Name.IMPLEMENTATION_VERSION);
+      return val != null ? val : "";
+    } catch (IOException e) {
+      return "";
+    }
+  }
+
+  /**
+   * Invokes a proram in the provided {@code ClassLoader}.
+   *
+   * @param loader classloader to load program class from.
+   * @param origArgv arguments, as would be passed to {@code gerrit.war}. The first argument is the
+   *     program name.
+   * @return program return code.
+   * @throws Exception if any error occurs.
+   */
+  public static int invokeProgram(ClassLoader loader, String[] origArgv) throws Exception {
+    String name = origArgv[0];
+    final String[] argv = new String[origArgv.length - 1];
+    System.arraycopy(origArgv, 1, argv, 0, argv.length);
+
+    Class<?> clazz;
+    try {
+      try {
+        String cn = programClassName(name);
+        clazz = Class.forName(PKG + "." + cn, true, loader);
+      } catch (ClassNotFoundException cnfe) {
+        if (name.equals(name.toLowerCase())) {
+          clazz = Class.forName(PKG + "." + name, true, loader);
+        } else {
+          throw cnfe;
+        }
+      }
+    } catch (ClassNotFoundException cnfe) {
+      System.err.println("fatal: unknown command " + name);
+      System.err.println("      (no " + PKG + "." + name + ")");
+      return 1;
+    }
+
+    final Method main;
+    try {
+      main = clazz.getMethod("main", argv.getClass());
+    } catch (SecurityException | NoSuchMethodException e) {
+      System.err.println("fatal: unknown command " + name);
+      return 1;
+    }
+
+    final Object res;
+    try {
+      if ((main.getModifiers() & Modifier.STATIC) == Modifier.STATIC) {
+        res = main.invoke(null, new Object[] {argv});
+      } else {
+        res =
+            main.invoke(clazz.getConstructor(new Class<?>[] {}).newInstance(), new Object[] {argv});
+      }
+    } catch (InvocationTargetException ite) {
+      if (ite.getCause() instanceof Exception) {
+        throw (Exception) ite.getCause();
+      } else if (ite.getCause() instanceof Error) {
+        throw (Error) ite.getCause();
+      } else {
+        throw ite;
+      }
+    }
+    if (res instanceof Number) {
+      return ((Number) res).intValue();
+    }
+    return 0;
+  }
+
+  private static String programClassName(String cn) {
+    if (cn.equals(cn.toLowerCase())) {
+      StringBuilder buf = new StringBuilder();
+      buf.append(Character.toUpperCase(cn.charAt(0)));
+      for (int i = 1; i < cn.length(); i++) {
+        if (cn.charAt(i) == '-' && i + 1 < cn.length()) {
+          i++;
+          buf.append(Character.toUpperCase(cn.charAt(i)));
+        } else {
+          buf.append(cn.charAt(i));
+        }
+      }
+      return buf.toString();
+    }
+    return cn;
+  }
+
+  private static ClassLoader libClassLoader(boolean prologCompiler) throws IOException {
+    final File path;
+    try {
+      path = getDistributionArchive();
+    } catch (FileNotFoundException e) {
+      if (NOT_ARCHIVED.equals(e.getMessage())) {
+        return useDevClasspath();
+      }
+      throw e;
+    }
+
+    final SortedMap<String, URL> jars = new TreeMap<>();
+    try (ZipFile zf = new ZipFile(path)) {
+      final Enumeration<? extends ZipEntry> e = zf.entries();
+      while (e.hasMoreElements()) {
+        final ZipEntry ze = e.nextElement();
+        if (ze.isDirectory()) {
+          continue;
+        }
+
+        String name = ze.getName();
+        if (name.startsWith("WEB-INF/lib/")) {
+          extractJar(zf, ze, jars);
+        } else if (name.startsWith("WEB-INF/pgm-lib/")) {
+          // Some Prolog tools are restricted.
+          if (prologCompiler || !name.startsWith("WEB-INF/pgm-lib/prolog-")) {
+            extractJar(zf, ze, jars);
+          }
+        }
+      }
+    } catch (IOException e) {
+      throw new IOException("Cannot obtain libraries from " + path, e);
+    }
+
+    if (jars.isEmpty()) {
+      return GerritLauncher.class.getClassLoader();
+    }
+
+    // The extension API needs to be its own ClassLoader, along
+    // with a few of its dependencies. Try to construct this first.
+    List<URL> extapi = new ArrayList<>();
+    move(jars, "gerrit-extension-api-", extapi);
+    move(jars, "guice-", extapi);
+    move(jars, "javax.inject-1.jar", extapi);
+    move(jars, "aopalliance-1.0.jar", extapi);
+    move(jars, "guice-servlet-", extapi);
+    move(jars, "tomcat-servlet-api-", extapi);
+
+    ClassLoader parent = ClassLoader.getSystemClassLoader();
+    if (!extapi.isEmpty()) {
+      parent = URLClassLoader.newInstance(extapi.toArray(new URL[extapi.size()]), parent);
+    }
+    return URLClassLoader.newInstance(jars.values().toArray(new URL[jars.size()]), parent);
+  }
+
+  private static void extractJar(ZipFile zf, ZipEntry ze, SortedMap<String, URL> jars)
+      throws IOException {
+    File tmp = createTempFile(safeName(ze), ".jar");
+    try (OutputStream out = Files.newOutputStream(tmp.toPath());
+        InputStream in = zf.getInputStream(ze)) {
+      byte[] buf = new byte[4096];
+      int n;
+      while ((n = in.read(buf, 0, buf.length)) > 0) {
+        out.write(buf, 0, n);
+      }
+    }
+
+    String name = ze.getName();
+    jars.put(name.substring(name.lastIndexOf('/'), name.length()), tmp.toURI().toURL());
+  }
+
+  private static void move(SortedMap<String, URL> jars, String prefix, List<URL> extapi) {
+    SortedMap<String, URL> matches = jars.tailMap(prefix);
+    if (!matches.isEmpty()) {
+      String first = matches.firstKey();
+      if (first.startsWith(prefix)) {
+        extapi.add(jars.remove(first));
+      }
+    }
+  }
+
+  private static String safeName(ZipEntry ze) {
+    // Try to derive the name of the temporary file so it
+    // doesn't completely suck. Best if we can make it
+    // match the name it was in the archive.
+    //
+    String name = ze.getName();
+    if (name.contains("/")) {
+      name = name.substring(name.lastIndexOf('/') + 1);
+    }
+    if (name.contains(".")) {
+      name = name.substring(0, name.lastIndexOf('.'));
+    }
+    if (name.isEmpty()) {
+      name = "code";
+    }
+    return name;
+  }
+
+  private static volatile File myArchive;
+  private static volatile File myHome;
+
+  private static final Map<Path, FileSystem> zipFileSystems = new HashMap<>();
+
+  /**
+   * Locate the JAR/WAR file we were launched from.
+   *
+   * @return local path of the Gerrit WAR file.
+   * @throws FileNotFoundException if the code cannot guess the location.
+   */
+  public static File getDistributionArchive() throws FileNotFoundException, IOException {
+    File result = myArchive;
+    if (result == null) {
+      synchronized (GerritLauncher.class) {
+        result = myArchive;
+        if (result != null) {
+          return result;
+        }
+        result = locateMyArchive();
+        myArchive = result;
+      }
+    }
+    return result;
+  }
+
+  public static synchronized FileSystem getZipFileSystem(Path zip) throws IOException {
+    // FileSystems canonicalizes the path, so we should too.
+    zip = zip.toRealPath();
+    FileSystem zipFs = zipFileSystems.get(zip);
+    if (zipFs == null) {
+      zipFs = newZipFileSystem(zip);
+      zipFileSystems.put(zip, zipFs);
+    }
+    return zipFs;
+  }
+
+  public static FileSystem newZipFileSystem(Path zip) throws IOException {
+    return FileSystems.newFileSystem(
+        URI.create("jar:" + zip.toUri()), Collections.<String, String>emptyMap());
+  }
+
+  private static File locateMyArchive() throws FileNotFoundException {
+    final ClassLoader myCL = GerritLauncher.class.getClassLoader();
+    final String myName = GerritLauncher.class.getName().replace('.', '/') + ".class";
+
+    final URL myClazz = myCL.getResource(myName);
+    if (myClazz == null) {
+      throw new FileNotFoundException("Cannot find JAR: no " + myName);
+    }
+
+    // ZipFile may have the path of our JAR hiding within itself.
+    //
+    try {
+      JarFile jar = ((JarURLConnection) myClazz.openConnection()).getJarFile();
+      File path = new File(jar.getName());
+      if (path.isFile()) {
+        return path;
+      }
+    } catch (Exception e) {
+      // Nope, that didn't work. Try a different method.
+      //
+    }
+
+    // Maybe this is a local class file, running under a debugger?
+    //
+    if ("file".equals(myClazz.getProtocol())) {
+      final File path = new File(myClazz.getPath());
+      if (path.isFile() && path.getParentFile().isDirectory()) {
+        throw new FileNotFoundException(NOT_ARCHIVED);
+      }
+    }
+
+    // The CodeSource might be able to give us the source as a stream.
+    // If so, copy it to a local file so we have random access to it.
+    //
+    final CodeSource src = GerritLauncher.class.getProtectionDomain().getCodeSource();
+    if (src != null) {
+      try (InputStream in = src.getLocation().openStream()) {
+        final File tmp = createTempFile("gerrit_", ".zip");
+        try (OutputStream out = Files.newOutputStream(tmp.toPath())) {
+          final byte[] buf = new byte[4096];
+          int n;
+          while ((n = in.read(buf, 0, buf.length)) > 0) {
+            out.write(buf, 0, n);
+          }
+        }
+        return tmp;
+      } catch (IOException e) {
+        // Nope, that didn't work.
+        //
+      }
+    }
+
+    throw new FileNotFoundException("Cannot find local copy of JAR");
+  }
+
+  private static boolean temporaryDirectoryFound;
+  private static File temporaryDirectory;
+
+  /**
+   * Creates a temporary file within the application's unpack location.
+   *
+   * <p>The launcher unpacks the nested JAR files into a temporary directory, allowing the classes
+   * to be loaded from local disk with standard Java APIs. This method constructs a new temporary
+   * file in the same directory.
+   *
+   * <p>The method first tries to create {@code prefix + suffix} within the directory under the
+   * assumption that a given {@code prefix + suffix} combination is made at most once per JVM
+   * execution. If this fails (e.g. the named file already exists) a mangled unique name is used and
+   * returned instead, with the unique string appearing between the prefix and suffix.
+   *
+   * <p>Files created by this method will be automatically deleted by the JVM when it terminates. If
+   * the returned file is converted into a directory by the caller, the caller must arrange for the
+   * contents to be deleted before the directory is.
+   *
+   * <p>If supported by the underlying operating system, the temporary directory which contains
+   * these temporary files is accessible only by the user running the JVM.
+   *
+   * @param prefix prefix of the file name.
+   * @param suffix suffix of the file name.
+   * @return the path of the temporary file. The returned object exists in the filesystem as a file;
+   *     caller may need to delete and recreate as a directory if a directory was preferred.
+   * @throws IOException the file could not be created.
+   */
+  public static synchronized File createTempFile(String prefix, String suffix) throws IOException {
+    if (!temporaryDirectoryFound) {
+      final File d = File.createTempFile("gerrit_", "_app", tmproot());
+      if (d.delete() && d.mkdir()) {
+        // Try to lock the directory down to be accessible by us.
+        // We first have to remove all permissions, then add back
+        // only the owner permissions.
+        //
+        d.setWritable(false, false /* all */);
+        d.setReadable(false, false /* all */);
+        d.setExecutable(false, false /* all */);
+
+        d.setWritable(true, true /* owner only */);
+        d.setReadable(true, true /* owner only */);
+        d.setExecutable(true, true /* owner only */);
+
+        d.deleteOnExit();
+        temporaryDirectory = d;
+      }
+      temporaryDirectoryFound = true;
+    }
+
+    if (temporaryDirectory != null) {
+      // If we have a private directory and this name has not yet
+      // been used within the private directory, create it as-is.
+      //
+      final File tmp = new File(temporaryDirectory, prefix + suffix);
+      if (tmp.createNewFile()) {
+        tmp.deleteOnExit();
+        return tmp;
+      }
+    }
+
+    if (!prefix.endsWith("_")) {
+      prefix += "_";
+    }
+
+    final File tmp = File.createTempFile(prefix, suffix, temporaryDirectory);
+    tmp.deleteOnExit();
+    return tmp;
+  }
+
+  /**
+   * Provide path to a working directory
+   *
+   * @return local path of the working directory or null if cannot be determined
+   */
+  public static File getHomeDirectory() {
+    if (myHome == null) {
+      myHome = locateHomeDirectory();
+    }
+    return myHome;
+  }
+
+  private static File tmproot() {
+    File tmp;
+    String gerritTemp = System.getenv("GERRIT_TMP");
+    if (gerritTemp != null && gerritTemp.length() > 0) {
+      tmp = new File(gerritTemp);
+    } else {
+      tmp = new File(getHomeDirectory(), "tmp");
+    }
+    if (!tmp.exists() && !tmp.mkdirs()) {
+      System.err.println("warning: cannot create " + tmp.getAbsolutePath());
+      System.err.println("warning: using system temporary directory instead");
+      return null;
+    }
+
+    // Try to clean up any stale empty directories. Assume any empty
+    // directory that is older than 7 days is one of these dead ones
+    // that we can clean up.
+    //
+    final File[] tmpEntries = tmp.listFiles();
+    if (tmpEntries != null) {
+      final long now = System.currentTimeMillis();
+      final long expired = now - MILLISECONDS.convert(7, DAYS);
+      for (File tmpEntry : tmpEntries) {
+        if (tmpEntry.isDirectory() && tmpEntry.lastModified() < expired) {
+          final String[] all = tmpEntry.list();
+          if (all == null || all.length == 0) {
+            tmpEntry.delete();
+          }
+        }
+      }
+    }
+
+    try {
+      return tmp.getCanonicalFile();
+    } catch (IOException e) {
+      return tmp;
+    }
+  }
+
+  private static File locateHomeDirectory() {
+    // Try to find the user's home directory. If we can't find it
+    // return null so the JVM's default temporary directory is used
+    // instead. This is probably /tmp or /var/tmp.
+    //
+    String userHome = System.getProperty("user.home");
+    if (userHome == null || "".equals(userHome)) {
+      userHome = System.getenv("HOME");
+      if (userHome == null || "".equals(userHome)) {
+        System.err.println("warning: cannot determine home directory");
+        System.err.println("warning: using system temporary directory instead");
+        return null;
+      }
+    }
+
+    // Ensure the home directory exists. If it doesn't, try to make it.
+    //
+    final File home = new File(userHome);
+    if (!home.exists()) {
+      if (home.mkdirs()) {
+        System.err.println("warning: created " + home.getAbsolutePath());
+      } else {
+        System.err.println("warning: " + home.getAbsolutePath() + " not found");
+        System.err.println("warning: using system temporary directory instead");
+        return null;
+      }
+    }
+
+    // Use $HOME/.gerritcodereview/tmp for our temporary file area.
+    //
+    final File gerrithome = new File(home, ".gerritcodereview");
+    if (!gerrithome.exists() && !gerrithome.mkdirs()) {
+      System.err.println("warning: cannot create " + gerrithome.getAbsolutePath());
+      System.err.println("warning: using system temporary directory instead");
+      return null;
+    }
+    try {
+      return gerrithome.getCanonicalFile();
+    } catch (IOException e) {
+      return gerrithome;
+    }
+  }
+
+  /**
+   * Check whether the process is running in Eclipse.
+   *
+   * <p>Unlike {@link #getDeveloperEclipseOut()}, this method checks the actual runtime stack, not
+   * the classpath.
+   *
+   * @return true if any thread has a stack frame in {@code org.eclipse.jdt}.
+   */
+  public static boolean isRunningInEclipse() {
+    return Thread.getAllStackTraces().values().stream()
+        .flatMap(Arrays::stream)
+        .anyMatch(e -> e.getClassName().startsWith("org.eclipse.jdt."));
+  }
+
+  /**
+   * Locate the path of the {@code eclipse-out} directory in a source tree.
+   *
+   * <p>Unlike {@link #isRunningInEclipse()}, this method only inspects files relative to the
+   * classpath, not the runtime stack.
+   *
+   * @return local path of the {@code eclipse-out} directory in a source tree.
+   * @throws FileNotFoundException if the directory cannot be found.
+   */
+  public static Path getDeveloperEclipseOut() throws FileNotFoundException {
+    return resolveInSourceRoot("eclipse-out");
+  }
+
+  public static boolean isJdk9OrLater() {
+    return Double.parseDouble(System.getProperty("java.class.version")) >= 53.0;
+  }
+
+  public static String getJdkVersionPostJdk8() {
+    // 9.0.4 => 9
+    return System.getProperty("java.version").substring(0, 1);
+  }
+
+  public static Properties loadBuildProperties(Path propPath) throws IOException {
+    Properties properties = new Properties();
+    try (InputStream in = Files.newInputStream(propPath)) {
+      properties.load(in);
+    } catch (NoSuchFileException e) {
+      // Ignore; will be run from PATH, with a descriptive error if it fails.
+    }
+    return properties;
+  }
+
+  static final String SOURCE_ROOT_RESOURCE = "/com/google/gerrit/launcher/workspace-root.txt";
+
+  /**
+   * Locate a path in the source tree.
+   *
+   * @return local path of the {@code name} directory in a source tree.
+   * @throws FileNotFoundException if the directory cannot be found.
+   */
+  public static Path resolveInSourceRoot(String name) throws FileNotFoundException {
+
+    // Find ourselves in the classpath, as a loose class file or jar.
+    Class<GerritLauncher> self = GerritLauncher.class;
+
+    // If the build system provides us with a source root, use that.
+    try (InputStream stream = self.getResourceAsStream(SOURCE_ROOT_RESOURCE)) {
+      if (stream != null) {
+        try (Scanner scan = new Scanner(stream, UTF_8.name()).useDelimiter("\n")) {
+          if (scan.hasNext()) {
+            Path p = Paths.get(scan.next());
+            if (!Files.exists(p)) {
+              throw new FileNotFoundException("source root not found: " + p);
+            }
+            return p;
+          }
+        }
+      }
+    } catch (IOException e) {
+      // not Bazel, then.
+    }
+
+    URL u = self.getResource(self.getSimpleName() + ".class");
+    if (u == null) {
+      throw new FileNotFoundException("Cannot find class " + self.getName());
+    } else if ("jar".equals(u.getProtocol())) {
+      String p = u.getPath();
+      try {
+        u = new URL(p.substring(0, p.indexOf('!')));
+      } catch (MalformedURLException e) {
+        FileNotFoundException fnfe = new FileNotFoundException("Not a valid jar file: " + u);
+        fnfe.initCause(e);
+        throw fnfe;
+      }
+    }
+    if (!"file".equals(u.getProtocol())) {
+      throw new FileNotFoundException("Cannot extract path from " + u);
+    }
+
+    // Pop up to the top-level source folder by looking for .buckconfig.
+    Path dir = Paths.get(u.getPath());
+    while (!Files.isRegularFile(dir.resolve("WORKSPACE"))) {
+      Path parent = dir.getParent();
+      if (parent == null) {
+        throw new FileNotFoundException("Cannot find source root from " + u);
+      }
+      dir = parent;
+    }
+
+    Path ret = dir.resolve(name);
+    if (!Files.exists(ret)) {
+      throw new FileNotFoundException(name + " not found in source root " + dir);
+    }
+    return ret;
+  }
+
+  private static ClassLoader useDevClasspath() throws IOException {
+    Path out = getDeveloperEclipseOut();
+    List<URL> dirs = new ArrayList<>();
+    dirs.add(out.resolve("classes").toUri().toURL());
+    ClassLoader cl = GerritLauncher.class.getClassLoader();
+
+    if (isJdk9OrLater()) {
+      Path rootPath = resolveInSourceRoot(".").normalize();
+
+      Properties properties = loadBuildProperties(rootPath.resolve(".bazel_path"));
+      Path outputBase = Paths.get(properties.getProperty("output_base"));
+
+      Path runtimeClasspath =
+          rootPath.resolve("bazel-bin/tools/eclipse/main_classpath_collect.runtime_classpath");
+      for (String f : Files.readAllLines(runtimeClasspath, UTF_8)) {
+        URL url;
+        if (f.startsWith("external")) {
+          url = outputBase.resolve(f).toUri().toURL();
+        } else {
+          url = rootPath.resolve(f).toUri().toURL();
+        }
+        if (includeJar(url)) {
+          dirs.add(url);
+        }
+      }
+    } else {
+      for (URL u : ((URLClassLoader) cl).getURLs()) {
+        if (includeJar(u)) {
+          dirs.add(u);
+        }
+      }
+    }
+    return URLClassLoader.newInstance(
+        dirs.toArray(new URL[dirs.size()]), ClassLoader.getSystemClassLoader().getParent());
+  }
+
+  private static boolean includeJar(URL u) {
+    String path = u.getPath();
+    return path.endsWith(".jar")
+        && !path.endsWith("-src.jar")
+        && !path.contains("/com/google/gerrit");
+  }
+
+  private GerritLauncher() {}
+}
diff --git a/java/com/google/gerrit/lifecycle/BUILD b/java/com/google/gerrit/lifecycle/BUILD
new file mode 100644
index 0000000..7ba6123
--- /dev/null
+++ b/java/com/google/gerrit/lifecycle/BUILD
@@ -0,0 +1,11 @@
+java_library(
+    name = "lifecycle",
+    srcs = glob(["**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/extensions:api",
+        "//lib:guava",
+        "//lib/flogger:api",
+        "//lib/guice",
+    ],
+)
diff --git a/java/com/google/gerrit/lifecycle/LifecycleManager.java b/java/com/google/gerrit/lifecycle/LifecycleManager.java
new file mode 100644
index 0000000..4f09a09
--- /dev/null
+++ b/java/com/google/gerrit/lifecycle/LifecycleManager.java
@@ -0,0 +1,124 @@
+// Copyright (C) 2009 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.google.gerrit.lifecycle;
+
+import static com.google.common.base.Preconditions.checkState;
+
+import com.google.common.collect.Lists;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import com.google.inject.Binding;
+import com.google.inject.Injector;
+import com.google.inject.Provider;
+import com.google.inject.TypeLiteral;
+import com.google.inject.util.Providers;
+import java.util.List;
+
+/** Tracks and executes registered {@link LifecycleListener}s. */
+public class LifecycleManager {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final List<Provider<LifecycleListener>> listeners = newList();
+  private final List<RegistrationHandle> handles = newList();
+
+  /** Index of the last listener to start successfully; -1 when not started. */
+  private int startedIndex = -1;
+
+  /**
+   * Add a handle that must be cleared during stop.
+   *
+   * @param handle the handle to add.
+   */
+  public void add(RegistrationHandle handle) {
+    handles.add(handle);
+  }
+
+  /**
+   * Add a single listener.
+   *
+   * @param listener the listener to add.
+   */
+  public void add(LifecycleListener listener) {
+    listeners.add(Providers.of(listener));
+  }
+
+  /**
+   * Add a single listener.
+   *
+   * @param listener the listener to add.
+   */
+  public void add(Provider<LifecycleListener> listener) {
+    listeners.add(listener);
+  }
+
+  /**
+   * Add all {@link LifecycleListener}s registered in the Injector.
+   *
+   * @param injector the injector to add.
+   */
+  public void add(Injector injector) {
+    checkState(startedIndex < 0, "Already started");
+    for (Binding<LifecycleListener> binding : get(injector)) {
+      add(binding.getProvider());
+    }
+  }
+
+  /**
+   * Add all {@link LifecycleListener}s registered in the Injectors.
+   *
+   * @param injectors the injectors to add.
+   */
+  public void add(Injector... injectors) {
+    for (Injector i : injectors) {
+      add(i);
+    }
+  }
+
+  /** Start all listeners, in the order they were registered. */
+  public void start() {
+    for (int i = startedIndex + 1; i < listeners.size(); i++) {
+      LifecycleListener listener = listeners.get(i).get();
+      startedIndex = i;
+      listener.start();
+    }
+  }
+
+  /** Stop all listeners, in the reverse order they were registered. */
+  public void stop() {
+    for (int i = handles.size() - 1; 0 <= i; i--) {
+      handles.get(i).remove();
+    }
+    handles.clear();
+
+    for (int i = startedIndex; 0 <= i; i--) {
+      LifecycleListener obj = listeners.get(i).get();
+      try {
+        obj.stop();
+      } catch (Throwable err) {
+        logger.atWarning().withCause(err).log("Failed to stop %s", obj.getClass());
+      }
+      startedIndex = i - 1;
+    }
+  }
+
+  private static List<Binding<LifecycleListener>> get(Injector i) {
+    return i.findBindingsByType(new TypeLiteral<LifecycleListener>() {});
+  }
+
+  private static <T> List<T> newList() {
+    return Lists.newArrayListWithCapacity(4);
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/lifecycle/LifecycleModule.java b/java/com/google/gerrit/lifecycle/LifecycleModule.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/lifecycle/LifecycleModule.java
rename to java/com/google/gerrit/lifecycle/LifecycleModule.java
diff --git a/java/com/google/gerrit/lucene/AbstractLuceneIndex.java b/java/com/google/gerrit/lucene/AbstractLuceneIndex.java
new file mode 100644
index 0000000..cb26488
--- /dev/null
+++ b/java/com/google/gerrit/lucene/AbstractLuceneIndex.java
@@ -0,0 +1,545 @@
+// Copyright (C) 2013 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.google.gerrit.lucene;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+
+import com.google.common.base.Joiner;
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Sets;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.util.concurrent.AbstractFuture;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.common.util.concurrent.MoreExecutors;
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.index.FieldDef;
+import com.google.gerrit.index.FieldType;
+import com.google.gerrit.index.Index;
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.index.Schema.Values;
+import com.google.gerrit.index.query.DataSource;
+import com.google.gerrit.index.query.FieldBundle;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.index.IndexUtils;
+import com.google.gerrit.server.logging.LoggingContextAwareExecutorService;
+import com.google.gerrit.server.logging.LoggingContextAwareScheduledExecutorService;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.ResultSet;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.function.Function;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field;
+import org.apache.lucene.document.Field.Store;
+import org.apache.lucene.document.LegacyIntField;
+import org.apache.lucene.document.LegacyLongField;
+import org.apache.lucene.document.StoredField;
+import org.apache.lucene.document.StringField;
+import org.apache.lucene.document.TextField;
+import org.apache.lucene.index.IndexWriter;
+import org.apache.lucene.index.IndexableField;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.search.ControlledRealTimeReopenThread;
+import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.ReferenceManager;
+import org.apache.lucene.search.ReferenceManager.RefreshListener;
+import org.apache.lucene.search.ScoreDoc;
+import org.apache.lucene.search.SearcherFactory;
+import org.apache.lucene.search.Sort;
+import org.apache.lucene.search.TopFieldDocs;
+import org.apache.lucene.store.AlreadyClosedException;
+import org.apache.lucene.store.Directory;
+
+/** Basic Lucene index implementation. */
+@SuppressWarnings("deprecation")
+public abstract class AbstractLuceneIndex<K, V> implements Index<K, V> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  static String sortFieldName(FieldDef<?, ?> f) {
+    return f.getName() + "_SORT";
+  }
+
+  private final Schema<V> schema;
+  private final SitePaths sitePaths;
+  private final Directory dir;
+  private final String name;
+  private final ListeningExecutorService writerThread;
+  private final IndexWriter writer;
+  private final ReferenceManager<IndexSearcher> searcherManager;
+  private final ControlledRealTimeReopenThread<IndexSearcher> reopenThread;
+  private final Set<NrtFuture> notDoneNrtFutures;
+  private ScheduledExecutorService autoCommitExecutor;
+
+  AbstractLuceneIndex(
+      Schema<V> schema,
+      SitePaths sitePaths,
+      Directory dir,
+      String name,
+      String subIndex,
+      GerritIndexWriterConfig writerConfig,
+      SearcherFactory searcherFactory)
+      throws IOException {
+    this.schema = schema;
+    this.sitePaths = sitePaths;
+    this.dir = dir;
+    this.name = name;
+    String index = Joiner.on('_').skipNulls().join(name, subIndex);
+    long commitPeriod = writerConfig.getCommitWithinMs();
+
+    if (commitPeriod < 0) {
+      writer = new AutoCommitWriter(dir, writerConfig.getLuceneConfig());
+    } else if (commitPeriod == 0) {
+      writer = new AutoCommitWriter(dir, writerConfig.getLuceneConfig(), true);
+    } else {
+      final AutoCommitWriter autoCommitWriter =
+          new AutoCommitWriter(dir, writerConfig.getLuceneConfig());
+      writer = autoCommitWriter;
+
+      autoCommitExecutor =
+          new LoggingContextAwareScheduledExecutorService(
+              new ScheduledThreadPoolExecutor(
+                  1,
+                  new ThreadFactoryBuilder()
+                      .setNameFormat(index + " Commit-%d")
+                      .setDaemon(true)
+                      .build()));
+      @SuppressWarnings("unused") // Error handling within Runnable.
+      Future<?> possiblyIgnoredError =
+          autoCommitExecutor.scheduleAtFixedRate(
+              () -> {
+                try {
+                  if (autoCommitWriter.hasUncommittedChanges()) {
+                    autoCommitWriter.manualFlush();
+                    autoCommitWriter.commit();
+                  }
+                } catch (IOException e) {
+                  logger.atSevere().withCause(e).log("Error committing %s Lucene index", index);
+                } catch (OutOfMemoryError e) {
+                  logger.atSevere().withCause(e).log("Error committing %s Lucene index", index);
+                  try {
+                    autoCommitWriter.close();
+                  } catch (IOException e2) {
+                    logger.atSevere().withCause(e).log(
+                        "SEVERE: Error closing %s Lucene index after OOM;"
+                            + " index may be corrupted.",
+                        index);
+                  }
+                }
+              },
+              commitPeriod,
+              commitPeriod,
+              MILLISECONDS);
+    }
+    searcherManager = new WrappableSearcherManager(writer, true, searcherFactory);
+
+    notDoneNrtFutures = Sets.newConcurrentHashSet();
+
+    writerThread =
+        MoreExecutors.listeningDecorator(
+            new LoggingContextAwareExecutorService(
+                Executors.newFixedThreadPool(
+                    1,
+                    new ThreadFactoryBuilder()
+                        .setNameFormat(index + " Write-%d")
+                        .setDaemon(true)
+                        .build())));
+
+    reopenThread =
+        new ControlledRealTimeReopenThread<>(
+            writer,
+            searcherManager,
+            0.500 /* maximum stale age (seconds) */,
+            0.010 /* minimum stale age (seconds) */);
+    reopenThread.setName(index + " NRT");
+    reopenThread.setPriority(
+        Math.min(Thread.currentThread().getPriority() + 2, Thread.MAX_PRIORITY));
+    reopenThread.setDaemon(true);
+
+    // This must be added after the reopen thread is created. The reopen thread
+    // adds its own listener which copies its internally last-refreshed
+    // generation to the searching generation. removeIfDone() depends on the
+    // searching generation being up to date when calling
+    // reopenThread.waitForGeneration(gen, 0), therefore the reopen thread's
+    // internal listener needs to be called first.
+    // TODO(dborowitz): This may have been fixed by
+    // http://issues.apache.org/jira/browse/LUCENE-5461
+    searcherManager.addListener(
+        new RefreshListener() {
+          @Override
+          public void beforeRefresh() throws IOException {}
+
+          @Override
+          public void afterRefresh(boolean didRefresh) throws IOException {
+            for (NrtFuture f : notDoneNrtFutures) {
+              f.removeIfDone();
+            }
+          }
+        });
+
+    reopenThread.start();
+  }
+
+  @Override
+  public void markReady(boolean ready) throws IOException {
+    IndexUtils.setReady(sitePaths, name, schema.getVersion(), ready);
+  }
+
+  @Override
+  public void close() {
+    if (autoCommitExecutor != null) {
+      autoCommitExecutor.shutdown();
+    }
+
+    writerThread.shutdown();
+    try {
+      if (!writerThread.awaitTermination(5, TimeUnit.SECONDS)) {
+        logger.atWarning().log("shutting down %s index with pending Lucene writes", name);
+      }
+    } catch (InterruptedException e) {
+      logger.atWarning().withCause(e).log(
+          "interrupted waiting for pending Lucene writes of %s index", name);
+    }
+    reopenThread.close();
+
+    // Closing the reopen thread sets its generation to Long.MAX_VALUE, but we
+    // still need to refresh the searcher manager to let pending NrtFutures
+    // know.
+    //
+    // Any futures created after this method (which may happen due to undefined
+    // shutdown ordering behavior) will finish immediately, even though they may
+    // not have flushed.
+    try {
+      searcherManager.maybeRefreshBlocking();
+    } catch (IOException e) {
+      logger.atWarning().withCause(e).log("error finishing pending Lucene writes");
+    }
+
+    try {
+      writer.close();
+    } catch (AlreadyClosedException e) {
+      // Ignore.
+    } catch (IOException e) {
+      logger.atWarning().withCause(e).log("error closing Lucene writer");
+    }
+    try {
+      dir.close();
+    } catch (IOException e) {
+      logger.atWarning().withCause(e).log("error closing Lucene directory");
+    }
+  }
+
+  ListenableFuture<?> insert(Document doc) {
+    return submit(() -> writer.addDocument(doc));
+  }
+
+  ListenableFuture<?> replace(Term term, Document doc) {
+    return submit(() -> writer.updateDocument(term, doc));
+  }
+
+  ListenableFuture<?> delete(Term term) {
+    return submit(() -> writer.deleteDocuments(term));
+  }
+
+  private ListenableFuture<?> submit(Callable<Long> task) {
+    ListenableFuture<Long> future = Futures.nonCancellationPropagating(writerThread.submit(task));
+    return Futures.transformAsync(
+        future,
+        gen -> {
+          // Tell the reopen thread a future is waiting on this
+          // generation so it uses the min stale time when refreshing.
+          reopenThread.waitForGeneration(gen, 0);
+          return new NrtFuture(gen);
+        },
+        directExecutor());
+  }
+
+  @Override
+  public void deleteAll() throws IOException {
+    writer.deleteAll();
+  }
+
+  public IndexWriter getWriter() {
+    return writer;
+  }
+
+  IndexSearcher acquire() throws IOException {
+    return searcherManager.acquire();
+  }
+
+  void release(IndexSearcher searcher) throws IOException {
+    searcherManager.release(searcher);
+  }
+
+  Document toDocument(V obj) {
+    Document result = new Document();
+    for (Values<V> vs : schema.buildFields(obj)) {
+      if (vs.getValues() != null) {
+        add(result, vs);
+      }
+    }
+    return result;
+  }
+
+  /**
+   * Trasform an index document into a target object type.
+   *
+   * @param doc index document
+   * @return target object, or null if the target object was not found or failed to load from the
+   *     underlying store.
+   */
+  @Nullable
+  protected abstract V fromDocument(Document doc);
+
+  void add(Document doc, Values<V> values) {
+    String name = values.getField().getName();
+    FieldType<?> type = values.getField().getType();
+    Store store = store(values.getField());
+
+    if (type == FieldType.INTEGER || type == FieldType.INTEGER_RANGE) {
+      for (Object value : values.getValues()) {
+        doc.add(new LegacyIntField(name, (Integer) value, store));
+      }
+    } else if (type == FieldType.LONG) {
+      for (Object value : values.getValues()) {
+        doc.add(new LegacyLongField(name, (Long) value, store));
+      }
+    } else if (type == FieldType.TIMESTAMP) {
+      for (Object value : values.getValues()) {
+        doc.add(new LegacyLongField(name, ((Timestamp) value).getTime(), store));
+      }
+    } else if (type == FieldType.EXACT || type == FieldType.PREFIX) {
+      for (Object value : values.getValues()) {
+        doc.add(new StringField(name, (String) value, store));
+      }
+    } else if (type == FieldType.FULL_TEXT) {
+      for (Object value : values.getValues()) {
+        doc.add(new TextField(name, (String) value, store));
+      }
+    } else if (type == FieldType.STORED_ONLY) {
+      for (Object value : values.getValues()) {
+        doc.add(new StoredField(name, (byte[]) value));
+      }
+    } else {
+      throw FieldType.badFieldType(type);
+    }
+  }
+
+  protected FieldBundle toFieldBundle(Document doc) {
+    Map<String, FieldDef<V, ?>> allFields = getSchema().getFields();
+    ListMultimap<String, Object> rawFields = ArrayListMultimap.create();
+    for (IndexableField field : doc.getFields()) {
+      checkArgument(allFields.containsKey(field.name()), "Unrecognized field " + field.name());
+      FieldType<?> type = allFields.get(field.name()).getType();
+      if (type == FieldType.EXACT || type == FieldType.FULL_TEXT || type == FieldType.PREFIX) {
+        rawFields.put(field.name(), field.stringValue());
+      } else if (type == FieldType.INTEGER || type == FieldType.INTEGER_RANGE) {
+        rawFields.put(field.name(), field.numericValue().intValue());
+      } else if (type == FieldType.LONG) {
+        rawFields.put(field.name(), field.numericValue().longValue());
+      } else if (type == FieldType.TIMESTAMP) {
+        rawFields.put(field.name(), new Timestamp(field.numericValue().longValue()));
+      } else if (type == FieldType.STORED_ONLY) {
+        rawFields.put(field.name(), field.binaryValue().bytes);
+      } else {
+        throw FieldType.badFieldType(type);
+      }
+    }
+    return new FieldBundle(rawFields);
+  }
+
+  private static Field.Store store(FieldDef<?, ?> f) {
+    return f.isStored() ? Field.Store.YES : Field.Store.NO;
+  }
+
+  private final class NrtFuture extends AbstractFuture<Void> {
+    private final long gen;
+
+    NrtFuture(long gen) {
+      this.gen = gen;
+    }
+
+    @Override
+    public Void get() throws InterruptedException, ExecutionException {
+      if (!isDone()) {
+        reopenThread.waitForGeneration(gen);
+        set(null);
+      }
+      return super.get();
+    }
+
+    @Override
+    public Void get(long timeout, TimeUnit unit)
+        throws InterruptedException, TimeoutException, ExecutionException {
+      if (!isDone()) {
+        if (!reopenThread.waitForGeneration(gen, (int) unit.toMillis(timeout))) {
+          throw new TimeoutException();
+        }
+        set(null);
+      }
+      return super.get(timeout, unit);
+    }
+
+    @Override
+    public boolean isDone() {
+      if (super.isDone()) {
+        return true;
+      } else if (isGenAvailableNowForCurrentSearcher()) {
+        set(null);
+        return true;
+      } else if (!reopenThread.isAlive()) {
+        setException(new IllegalStateException("NRT thread is dead"));
+        return true;
+      }
+      return false;
+    }
+
+    @Override
+    public void addListener(Runnable listener, Executor executor) {
+      if (isGenAvailableNowForCurrentSearcher() && !isCancelled()) {
+        set(null);
+      } else if (!isDone()) {
+        notDoneNrtFutures.add(this);
+      }
+      super.addListener(listener, executor);
+    }
+
+    @Override
+    public boolean cancel(boolean mayInterruptIfRunning) {
+      boolean result = super.cancel(mayInterruptIfRunning);
+      if (result) {
+        notDoneNrtFutures.remove(this);
+      }
+      return result;
+    }
+
+    void removeIfDone() {
+      if (isGenAvailableNowForCurrentSearcher()) {
+        notDoneNrtFutures.remove(this);
+        if (!isCancelled()) {
+          set(null);
+        }
+      }
+    }
+
+    private boolean isGenAvailableNowForCurrentSearcher() {
+      try {
+        return reopenThread.waitForGeneration(gen, 0);
+      } catch (InterruptedException e) {
+        logger.atWarning().withCause(e).log("Interrupted waiting for searcher generation");
+        return false;
+      }
+    }
+  }
+
+  @Override
+  public Schema<V> getSchema() {
+    return schema;
+  }
+
+  protected class LuceneQuerySource implements DataSource<V> {
+    private final QueryOptions opts;
+    private final Query query;
+    private final Sort sort;
+
+    LuceneQuerySource(QueryOptions opts, Query query, Sort sort) {
+      this.opts = opts;
+      this.query = query;
+      this.sort = sort;
+    }
+
+    @Override
+    public int getCardinality() {
+      return 10;
+    }
+
+    @Override
+    public ResultSet<V> read() throws OrmException {
+      return readImpl(AbstractLuceneIndex.this::fromDocument);
+    }
+
+    @Override
+    public ResultSet<FieldBundle> readRaw() throws OrmException {
+      return readImpl(AbstractLuceneIndex.this::toFieldBundle);
+    }
+
+    private <T> ResultSet<T> readImpl(Function<Document, T> mapper) throws OrmException {
+      IndexSearcher searcher = null;
+      try {
+        searcher = acquire();
+        int realLimit = opts.start() + opts.limit();
+        TopFieldDocs docs = searcher.search(query, realLimit, sort);
+        List<T> result = new ArrayList<>(docs.scoreDocs.length);
+        for (int i = opts.start(); i < docs.scoreDocs.length; i++) {
+          ScoreDoc sd = docs.scoreDocs[i];
+          Document doc = searcher.doc(sd.doc, opts.fields());
+          T mapperResult = mapper.apply(doc);
+          if (mapperResult != null) {
+            result.add(mapperResult);
+          }
+        }
+        final List<T> r = Collections.unmodifiableList(result);
+        return new ResultSet<T>() {
+          @Override
+          public Iterator<T> iterator() {
+            return r.iterator();
+          }
+
+          @Override
+          public List<T> toList() {
+            return r;
+          }
+
+          @Override
+          public void close() {
+            // Do nothing.
+          }
+        };
+      } catch (IOException e) {
+        throw new OrmException(e);
+      } finally {
+        if (searcher != null) {
+          try {
+            release(searcher);
+          } catch (IOException e) {
+            logger.atWarning().withCause(e).log("cannot release Lucene searcher");
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/java/com/google/gerrit/lucene/AutoCommitWriter.java b/java/com/google/gerrit/lucene/AutoCommitWriter.java
new file mode 100644
index 0000000..2cc7563
--- /dev/null
+++ b/java/com/google/gerrit/lucene/AutoCommitWriter.java
@@ -0,0 +1,122 @@
+// Copyright (C) 2014 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.google.gerrit.lucene;
+
+import java.io.IOException;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexWriter;
+import org.apache.lucene.index.IndexWriterConfig;
+import org.apache.lucene.index.IndexableField;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.store.Directory;
+
+/** Writer that optionally flushes/commits after every write. */
+public class AutoCommitWriter extends IndexWriter {
+  private boolean autoCommit;
+
+  AutoCommitWriter(Directory dir, IndexWriterConfig config) throws IOException {
+    this(dir, config, false);
+  }
+
+  AutoCommitWriter(Directory dir, IndexWriterConfig config, boolean autoCommit) throws IOException {
+    super(dir, config);
+    setAutoCommit(autoCommit);
+  }
+
+  /**
+   * This method will override Gerrit configuration index.name.commitWithin until next Gerrit
+   * restart (or reconfiguration through this method).
+   *
+   * @param enable auto commit
+   */
+  public void setAutoCommit(boolean enable) {
+    this.autoCommit = enable;
+  }
+
+  @Override
+  public long addDocument(Iterable<? extends IndexableField> doc) throws IOException {
+    long ret = super.addDocument(doc);
+    autoFlush();
+    return ret;
+  }
+
+  @Override
+  public long addDocuments(Iterable<? extends Iterable<? extends IndexableField>> docs)
+      throws IOException {
+    long ret = super.addDocuments(docs);
+    autoFlush();
+    return ret;
+  }
+
+  @Override
+  public long updateDocuments(
+      Term delTerm, Iterable<? extends Iterable<? extends IndexableField>> docs)
+      throws IOException {
+    long ret = super.updateDocuments(delTerm, docs);
+    autoFlush();
+    return ret;
+  }
+
+  @Override
+  public long deleteDocuments(Term... term) throws IOException {
+    long ret = super.deleteDocuments(term);
+    autoFlush();
+    return ret;
+  }
+
+  @Override
+  public synchronized long tryDeleteDocument(IndexReader readerIn, int docID) throws IOException {
+    long ret = super.tryDeleteDocument(readerIn, docID);
+    if (ret != -1) {
+      autoFlush();
+    }
+    return ret;
+  }
+
+  @Override
+  public long deleteDocuments(Query... queries) throws IOException {
+    long ret = super.deleteDocuments(queries);
+    autoFlush();
+    return ret;
+  }
+
+  @Override
+  public long updateDocument(Term term, Iterable<? extends IndexableField> doc) throws IOException {
+    long ret = super.updateDocument(term, doc);
+    autoFlush();
+    return ret;
+  }
+
+  @Override
+  public long deleteAll() throws IOException {
+    long ret = super.deleteAll();
+    autoFlush();
+    return ret;
+  }
+
+  void manualFlush() throws IOException {
+    flush();
+    if (autoCommit) {
+      commit();
+    }
+  }
+
+  public void autoFlush() throws IOException {
+    if (autoCommit) {
+      manualFlush();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/lucene/BUILD b/java/com/google/gerrit/lucene/BUILD
new file mode 100644
index 0000000..9c6ba74
--- /dev/null
+++ b/java/com/google/gerrit/lucene/BUILD
@@ -0,0 +1,47 @@
+QUERY_BUILDER = ["QueryBuilder.java"]
+
+java_library(
+    name = "query_builder",
+    srcs = QUERY_BUILDER,
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/index",
+        "//java/com/google/gerrit/index:query_exception",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//lib:guava",
+        "//lib:gwtorm",
+        "//lib/lucene:lucene-core-and-backward-codecs",
+    ],
+)
+
+java_library(
+    name = "lucene",
+    srcs = glob(
+        ["**/*.java"],
+        exclude = QUERY_BUILDER,
+    ),
+    visibility = ["//visibility:public"],
+    deps = [
+        ":query_builder",
+        "//java/com/google/gerrit/common:annotations",
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/index",
+        "//java/com/google/gerrit/index:query_exception",
+        "//java/com/google/gerrit/index/project",
+        "//java/com/google/gerrit/lifecycle",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/server/logging",
+        "//lib:guava",
+        "//lib:gwtorm",
+        "//lib/flogger:api",
+        "//lib/guice",
+        "//lib/guice:guice-assistedinject",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/lucene:lucene-analyzers-common",
+        "//lib/lucene:lucene-core-and-backward-codecs",
+        "//lib/lucene:lucene-misc",
+    ],
+)
diff --git a/java/com/google/gerrit/lucene/ChangeSubIndex.java b/java/com/google/gerrit/lucene/ChangeSubIndex.java
new file mode 100644
index 0000000..7d7cbef
--- /dev/null
+++ b/java/com/google/gerrit/lucene/ChangeSubIndex.java
@@ -0,0 +1,113 @@
+// 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.
+
+package com.google.gerrit.lucene;
+
+import static com.google.common.collect.Iterables.getOnlyElement;
+import static com.google.gerrit.lucene.LuceneChangeIndex.ID_SORT_FIELD;
+import static com.google.gerrit.lucene.LuceneChangeIndex.UPDATED_SORT_FIELD;
+import static com.google.gerrit.server.index.change.ChangeSchemaDefinitions.NAME;
+
+import com.google.gerrit.index.FieldDef;
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.index.Schema.Values;
+import com.google.gerrit.index.query.DataSource;
+import com.google.gerrit.index.query.FieldBundle;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.index.change.ChangeField;
+import com.google.gerrit.server.index.change.ChangeIndex;
+import com.google.gerrit.server.query.change.ChangeData;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.sql.Timestamp;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.NumericDocValuesField;
+import org.apache.lucene.search.SearcherFactory;
+import org.apache.lucene.store.Directory;
+import org.apache.lucene.store.FSDirectory;
+
+public class ChangeSubIndex extends AbstractLuceneIndex<Change.Id, ChangeData>
+    implements ChangeIndex {
+  ChangeSubIndex(
+      Schema<ChangeData> schema,
+      SitePaths sitePaths,
+      Path path,
+      GerritIndexWriterConfig writerConfig,
+      SearcherFactory searcherFactory)
+      throws IOException {
+    this(
+        schema,
+        sitePaths,
+        FSDirectory.open(path),
+        path.getFileName().toString(),
+        writerConfig,
+        searcherFactory);
+  }
+
+  ChangeSubIndex(
+      Schema<ChangeData> schema,
+      SitePaths sitePaths,
+      Directory dir,
+      String subIndex,
+      GerritIndexWriterConfig writerConfig,
+      SearcherFactory searcherFactory)
+      throws IOException {
+    super(schema, sitePaths, dir, NAME, subIndex, writerConfig, searcherFactory);
+  }
+
+  @Override
+  public void replace(ChangeData obj) throws IOException {
+    throw new UnsupportedOperationException("don't use ChangeSubIndex directly");
+  }
+
+  @Override
+  public void delete(Change.Id key) throws IOException {
+    throw new UnsupportedOperationException("don't use ChangeSubIndex directly");
+  }
+
+  @Override
+  public DataSource<ChangeData> getSource(Predicate<ChangeData> p, QueryOptions opts)
+      throws QueryParseException {
+    throw new UnsupportedOperationException("don't use ChangeSubIndex directly");
+  }
+
+  // Make method public so that it can be used in LuceneChangeIndex
+  @Override
+  public FieldBundle toFieldBundle(Document doc) {
+    return super.toFieldBundle(doc);
+  }
+
+  @Override
+  void add(Document doc, Values<ChangeData> values) {
+    // Add separate DocValues fields for those fields needed for sorting.
+    FieldDef<ChangeData, ?> f = values.getField();
+    if (f == ChangeField.LEGACY_ID) {
+      int v = (Integer) getOnlyElement(values.getValues());
+      doc.add(new NumericDocValuesField(ID_SORT_FIELD, v));
+    } else if (f == ChangeField.UPDATED) {
+      long t = ((Timestamp) getOnlyElement(values.getValues())).getTime();
+      doc.add(new NumericDocValuesField(UPDATED_SORT_FIELD, t));
+    }
+    super.add(doc, values);
+  }
+
+  @Override
+  protected ChangeData fromDocument(Document doc) {
+    throw new UnsupportedOperationException("don't use ChangeSubIndex directly");
+  }
+}
diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/CustomMappingAnalyzer.java b/java/com/google/gerrit/lucene/CustomMappingAnalyzer.java
similarity index 100%
rename from gerrit-lucene/src/main/java/com/google/gerrit/lucene/CustomMappingAnalyzer.java
rename to java/com/google/gerrit/lucene/CustomMappingAnalyzer.java
diff --git a/java/com/google/gerrit/lucene/GerritIndexWriterConfig.java b/java/com/google/gerrit/lucene/GerritIndexWriterConfig.java
new file mode 100644
index 0000000..75e03e3
--- /dev/null
+++ b/java/com/google/gerrit/lucene/GerritIndexWriterConfig.java
@@ -0,0 +1,75 @@
+// 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.
+
+package com.google.gerrit.lucene;
+
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.MINUTES;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.gerrit.server.config.ConfigUtil;
+import org.apache.lucene.analysis.CharArraySet;
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+import org.apache.lucene.index.IndexWriterConfig;
+import org.apache.lucene.index.IndexWriterConfig.OpenMode;
+import org.eclipse.jgit.lib.Config;
+
+/** Combination of Lucene {@link IndexWriterConfig} with additional Gerrit-specific options. */
+class GerritIndexWriterConfig {
+  private static final ImmutableMap<String, String> CUSTOM_CHAR_MAPPING =
+      ImmutableMap.of("_", " ", ".", " ");
+
+  private final IndexWriterConfig luceneConfig;
+  private long commitWithinMs;
+  private final CustomMappingAnalyzer analyzer;
+
+  GerritIndexWriterConfig(Config cfg, String name) {
+    analyzer =
+        new CustomMappingAnalyzer(
+            new StandardAnalyzer(CharArraySet.EMPTY_SET), CUSTOM_CHAR_MAPPING);
+    luceneConfig =
+        new IndexWriterConfig(analyzer)
+            .setOpenMode(OpenMode.CREATE_OR_APPEND)
+            .setCommitOnClose(true);
+    double m = 1 << 20;
+    luceneConfig.setRAMBufferSizeMB(
+        cfg.getLong(
+                "index",
+                name,
+                "ramBufferSize",
+                (long) (IndexWriterConfig.DEFAULT_RAM_BUFFER_SIZE_MB * m))
+            / m);
+    luceneConfig.setMaxBufferedDocs(
+        cfg.getInt("index", name, "maxBufferedDocs", IndexWriterConfig.DEFAULT_MAX_BUFFERED_DOCS));
+    try {
+      commitWithinMs =
+          ConfigUtil.getTimeUnit(
+              cfg, "index", name, "commitWithin", MILLISECONDS.convert(5, MINUTES), MILLISECONDS);
+    } catch (IllegalArgumentException e) {
+      commitWithinMs = cfg.getLong("index", name, "commitWithin", 0);
+    }
+  }
+
+  CustomMappingAnalyzer getAnalyzer() {
+    return analyzer;
+  }
+
+  IndexWriterConfig getLuceneConfig() {
+    return luceneConfig;
+  }
+
+  long getCommitWithinMs() {
+    return commitWithinMs;
+  }
+}
diff --git a/java/com/google/gerrit/lucene/LuceneAccountIndex.java b/java/com/google/gerrit/lucene/LuceneAccountIndex.java
new file mode 100644
index 0000000..86a2111
--- /dev/null
+++ b/java/com/google/gerrit/lucene/LuceneAccountIndex.java
@@ -0,0 +1,164 @@
+// 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.
+
+package com.google.gerrit.lucene;
+
+import static com.google.common.collect.Iterables.getOnlyElement;
+import static com.google.gerrit.server.index.account.AccountField.FULL_NAME;
+import static com.google.gerrit.server.index.account.AccountField.ID;
+import static com.google.gerrit.server.index.account.AccountField.PREFERRED_EMAIL_EXACT;
+
+import com.google.gerrit.index.FieldDef;
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.index.Schema.Values;
+import com.google.gerrit.index.query.DataSource;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.index.IndexUtils;
+import com.google.gerrit.server.index.account.AccountIndex;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.concurrent.ExecutionException;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.NumericDocValuesField;
+import org.apache.lucene.document.SortedDocValuesField;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.search.SearcherFactory;
+import org.apache.lucene.search.Sort;
+import org.apache.lucene.search.SortField;
+import org.apache.lucene.store.Directory;
+import org.apache.lucene.store.FSDirectory;
+import org.apache.lucene.store.RAMDirectory;
+import org.apache.lucene.util.BytesRef;
+import org.eclipse.jgit.lib.Config;
+
+public class LuceneAccountIndex extends AbstractLuceneIndex<Account.Id, AccountState>
+    implements AccountIndex {
+  private static final String ACCOUNTS = "accounts";
+
+  private static final String FULL_NAME_SORT_FIELD = sortFieldName(FULL_NAME);
+  private static final String EMAIL_SORT_FIELD = sortFieldName(PREFERRED_EMAIL_EXACT);
+  private static final String ID_SORT_FIELD = sortFieldName(ID);
+
+  private static Term idTerm(AccountState as) {
+    return idTerm(as.getAccount().getId());
+  }
+
+  private static Term idTerm(Account.Id id) {
+    return QueryBuilder.intTerm(ID.getName(), id.get());
+  }
+
+  private final GerritIndexWriterConfig indexWriterConfig;
+  private final QueryBuilder<AccountState> queryBuilder;
+  private final Provider<AccountCache> accountCache;
+
+  private static Directory dir(Schema<AccountState> schema, Config cfg, SitePaths sitePaths)
+      throws IOException {
+    if (LuceneIndexModule.isInMemoryTest(cfg)) {
+      return new RAMDirectory();
+    }
+    Path indexDir = LuceneVersionManager.getDir(sitePaths, ACCOUNTS, schema);
+    return FSDirectory.open(indexDir);
+  }
+
+  @Inject
+  LuceneAccountIndex(
+      @GerritServerConfig Config cfg,
+      SitePaths sitePaths,
+      Provider<AccountCache> accountCache,
+      @Assisted Schema<AccountState> schema)
+      throws IOException {
+    super(
+        schema,
+        sitePaths,
+        dir(schema, cfg, sitePaths),
+        ACCOUNTS,
+        null,
+        new GerritIndexWriterConfig(cfg, ACCOUNTS),
+        new SearcherFactory());
+    this.accountCache = accountCache;
+
+    indexWriterConfig = new GerritIndexWriterConfig(cfg, ACCOUNTS);
+    queryBuilder = new QueryBuilder<>(schema, indexWriterConfig.getAnalyzer());
+  }
+
+  @Override
+  void add(Document doc, Values<AccountState> values) {
+    // Add separate DocValues fields for those fields needed for sorting.
+    FieldDef<AccountState, ?> f = values.getField();
+    if (f == ID) {
+      int v = (Integer) getOnlyElement(values.getValues());
+      doc.add(new NumericDocValuesField(ID_SORT_FIELD, v));
+    } else if (f == FULL_NAME) {
+      String value = (String) getOnlyElement(values.getValues());
+      doc.add(new SortedDocValuesField(FULL_NAME_SORT_FIELD, new BytesRef(value)));
+    } else if (f == PREFERRED_EMAIL_EXACT) {
+      String value = (String) getOnlyElement(values.getValues());
+      doc.add(new SortedDocValuesField(EMAIL_SORT_FIELD, new BytesRef(value)));
+    }
+    super.add(doc, values);
+  }
+
+  @Override
+  public void replace(AccountState as) throws IOException {
+    try {
+      replace(idTerm(as), toDocument(as)).get();
+    } catch (ExecutionException | InterruptedException e) {
+      throw new IOException(e);
+    }
+  }
+
+  @Override
+  public void delete(Account.Id key) throws IOException {
+    try {
+      delete(idTerm(key)).get();
+    } catch (ExecutionException | InterruptedException e) {
+      throw new IOException(e);
+    }
+  }
+
+  @Override
+  public DataSource<AccountState> getSource(Predicate<AccountState> p, QueryOptions opts)
+      throws QueryParseException {
+    return new LuceneQuerySource(
+        opts.filterFields(IndexUtils::accountFields), queryBuilder.toQuery(p), getSort());
+  }
+
+  private Sort getSort() {
+    return new Sort(
+        new SortField(FULL_NAME_SORT_FIELD, SortField.Type.STRING, false),
+        new SortField(EMAIL_SORT_FIELD, SortField.Type.STRING, false),
+        new SortField(ID_SORT_FIELD, SortField.Type.LONG, false));
+  }
+
+  @Override
+  protected AccountState fromDocument(Document doc) {
+    Account.Id id = new Account.Id(doc.getField(ID.getName()).numericValue().intValue());
+    // Use the AccountCache rather than depending on any stored fields in the document (of which
+    // there shouldn't be any). The most expensive part to compute anyway is the effective group
+    // IDs, and we don't have a good way to reindex when those change.
+    // If the account doesn't exist return an empty AccountState to represent the missing account
+    // to account the fact that the account exists in the index.
+    return accountCache.get().getEvenIfMissing(id);
+  }
+}
diff --git a/java/com/google/gerrit/lucene/LuceneChangeIndex.java b/java/com/google/gerrit/lucene/LuceneChangeIndex.java
new file mode 100644
index 0000000..9944c8a
--- /dev/null
+++ b/java/com/google/gerrit/lucene/LuceneChangeIndex.java
@@ -0,0 +1,668 @@
+// Copyright (C) 2013 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.google.gerrit.lucene;
+
+import static com.google.gerrit.lucene.AbstractLuceneIndex.sortFieldName;
+import static com.google.gerrit.reviewdb.server.ReviewDbCodecs.APPROVAL_CODEC;
+import static com.google.gerrit.reviewdb.server.ReviewDbCodecs.CHANGE_CODEC;
+import static com.google.gerrit.reviewdb.server.ReviewDbCodecs.PATCH_SET_CODEC;
+import static com.google.gerrit.server.git.QueueProvider.QueueType.INTERACTIVE;
+import static com.google.gerrit.server.index.change.ChangeField.LEGACY_ID;
+import static com.google.gerrit.server.index.change.ChangeField.PROJECT;
+import static com.google.gerrit.server.index.change.ChangeIndexRewriter.CLOSED_STATUSES;
+import static com.google.gerrit.server.index.change.ChangeIndexRewriter.OPEN_STATUSES;
+import static java.util.Objects.requireNonNull;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.base.Function;
+import com.google.common.base.Throwables;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.collect.Sets;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.index.query.FieldBundle;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.StarredChangesUtil;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.index.IndexExecutor;
+import com.google.gerrit.server.index.IndexUtils;
+import com.google.gerrit.server.index.change.ChangeField;
+import com.google.gerrit.server.index.change.ChangeIndex;
+import com.google.gerrit.server.index.change.ChangeIndexRewriter;
+import com.google.gerrit.server.project.SubmitRuleOptions;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.ChangeDataSource;
+import com.google.gwtorm.protobuf.ProtobufCodec;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.OrmRuntimeException;
+import com.google.gwtorm.server.ResultSet;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.index.IndexWriter;
+import org.apache.lucene.index.IndexableField;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.ScoreDoc;
+import org.apache.lucene.search.SearcherFactory;
+import org.apache.lucene.search.SearcherManager;
+import org.apache.lucene.search.Sort;
+import org.apache.lucene.search.SortField;
+import org.apache.lucene.search.TopDocs;
+import org.apache.lucene.search.TopFieldDocs;
+import org.apache.lucene.store.RAMDirectory;
+import org.apache.lucene.util.BytesRef;
+import org.eclipse.jgit.lib.Config;
+
+/**
+ * Secondary index implementation using Apache Lucene.
+ *
+ * <p>Writes are managed using a single {@link IndexWriter} per process, committed aggressively.
+ * Reads use {@link SearcherManager} and periodically refresh, though there may be some lag between
+ * a committed write and it showing up to other threads' searchers.
+ */
+public class LuceneChangeIndex implements ChangeIndex {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  static final String UPDATED_SORT_FIELD = sortFieldName(ChangeField.UPDATED);
+  static final String ID_SORT_FIELD = sortFieldName(ChangeField.LEGACY_ID);
+
+  private static final String CHANGES = "changes";
+  private static final String CHANGES_OPEN = "open";
+  private static final String CHANGES_CLOSED = "closed";
+  private static final String ADDED_FIELD = ChangeField.ADDED.getName();
+  private static final String APPROVAL_FIELD = ChangeField.APPROVAL.getName();
+  private static final String CHANGE_FIELD = ChangeField.CHANGE.getName();
+  private static final String DELETED_FIELD = ChangeField.DELETED.getName();
+  private static final String MERGEABLE_FIELD = ChangeField.MERGEABLE.getName();
+  private static final String PATCH_SET_FIELD = ChangeField.PATCH_SET.getName();
+  private static final String PENDING_REVIEWER_FIELD = ChangeField.PENDING_REVIEWER.getName();
+  private static final String PENDING_REVIEWER_BY_EMAIL_FIELD =
+      ChangeField.PENDING_REVIEWER_BY_EMAIL.getName();
+  private static final String REF_STATE_FIELD = ChangeField.REF_STATE.getName();
+  private static final String REF_STATE_PATTERN_FIELD = ChangeField.REF_STATE_PATTERN.getName();
+  private static final String REVIEWEDBY_FIELD = ChangeField.REVIEWEDBY.getName();
+  private static final String REVIEWER_FIELD = ChangeField.REVIEWER.getName();
+  private static final String REVIEWER_BY_EMAIL_FIELD = ChangeField.REVIEWER_BY_EMAIL.getName();
+  private static final String HASHTAG_FIELD = ChangeField.HASHTAG_CASE_AWARE.getName();
+  private static final String STAR_FIELD = ChangeField.STAR.getName();
+  private static final String SUBMIT_RECORD_LENIENT_FIELD =
+      ChangeField.STORED_SUBMIT_RECORD_LENIENT.getName();
+  private static final String SUBMIT_RECORD_STRICT_FIELD =
+      ChangeField.STORED_SUBMIT_RECORD_STRICT.getName();
+  private static final String UNRESOLVED_COMMENT_COUNT_FIELD =
+      ChangeField.UNRESOLVED_COMMENT_COUNT.getName();
+
+  static Term idTerm(ChangeData cd) {
+    return QueryBuilder.intTerm(LEGACY_ID.getName(), cd.getId().get());
+  }
+
+  static Term idTerm(Change.Id id) {
+    return QueryBuilder.intTerm(LEGACY_ID.getName(), id.get());
+  }
+
+  private final ListeningExecutorService executor;
+  private final Provider<ReviewDb> db;
+  private final ChangeData.Factory changeDataFactory;
+  private final Schema<ChangeData> schema;
+  private final QueryBuilder<ChangeData> queryBuilder;
+  private final ChangeSubIndex openIndex;
+  private final ChangeSubIndex closedIndex;
+
+  @Inject
+  LuceneChangeIndex(
+      @GerritServerConfig Config cfg,
+      SitePaths sitePaths,
+      @IndexExecutor(INTERACTIVE) ListeningExecutorService executor,
+      Provider<ReviewDb> db,
+      ChangeData.Factory changeDataFactory,
+      @Assisted Schema<ChangeData> schema)
+      throws IOException {
+    this.executor = executor;
+    this.db = db;
+    this.changeDataFactory = changeDataFactory;
+    this.schema = schema;
+
+    GerritIndexWriterConfig openConfig = new GerritIndexWriterConfig(cfg, "changes_open");
+    GerritIndexWriterConfig closedConfig = new GerritIndexWriterConfig(cfg, "changes_closed");
+
+    queryBuilder = new QueryBuilder<>(schema, openConfig.getAnalyzer());
+
+    SearcherFactory searcherFactory = new SearcherFactory();
+    if (LuceneIndexModule.isInMemoryTest(cfg)) {
+      openIndex =
+          new ChangeSubIndex(
+              schema, sitePaths, new RAMDirectory(), "ramOpen", openConfig, searcherFactory);
+      closedIndex =
+          new ChangeSubIndex(
+              schema, sitePaths, new RAMDirectory(), "ramClosed", closedConfig, searcherFactory);
+    } else {
+      Path dir = LuceneVersionManager.getDir(sitePaths, CHANGES, schema);
+      openIndex =
+          new ChangeSubIndex(
+              schema, sitePaths, dir.resolve(CHANGES_OPEN), openConfig, searcherFactory);
+      closedIndex =
+          new ChangeSubIndex(
+              schema, sitePaths, dir.resolve(CHANGES_CLOSED), closedConfig, searcherFactory);
+    }
+  }
+
+  @Override
+  public void close() {
+    try {
+      openIndex.close();
+    } finally {
+      closedIndex.close();
+    }
+  }
+
+  @Override
+  public Schema<ChangeData> getSchema() {
+    return schema;
+  }
+
+  @Override
+  public void replace(ChangeData cd) throws IOException {
+    Term id = LuceneChangeIndex.idTerm(cd);
+    // toDocument is essentially static and doesn't depend on the specific
+    // sub-index, so just pick one.
+    Document doc = openIndex.toDocument(cd);
+    try {
+      if (cd.change().getStatus().isOpen()) {
+        Futures.allAsList(closedIndex.delete(id), openIndex.replace(id, doc)).get();
+      } else {
+        Futures.allAsList(openIndex.delete(id), closedIndex.replace(id, doc)).get();
+      }
+    } catch (OrmException | ExecutionException | InterruptedException e) {
+      throw new IOException(e);
+    }
+  }
+
+  @Override
+  public void delete(Change.Id id) throws IOException {
+    Term idTerm = LuceneChangeIndex.idTerm(id);
+    try {
+      Futures.allAsList(openIndex.delete(idTerm), closedIndex.delete(idTerm)).get();
+    } catch (ExecutionException | InterruptedException e) {
+      throw new IOException(e);
+    }
+  }
+
+  @Override
+  public void deleteAll() throws IOException {
+    openIndex.deleteAll();
+    closedIndex.deleteAll();
+  }
+
+  @Override
+  public ChangeDataSource getSource(Predicate<ChangeData> p, QueryOptions opts)
+      throws QueryParseException {
+    Set<Change.Status> statuses = ChangeIndexRewriter.getPossibleStatus(p);
+    List<ChangeSubIndex> indexes = new ArrayList<>(2);
+    if (!Sets.intersection(statuses, OPEN_STATUSES).isEmpty()) {
+      indexes.add(openIndex);
+    }
+    if (!Sets.intersection(statuses, CLOSED_STATUSES).isEmpty()) {
+      indexes.add(closedIndex);
+    }
+    return new QuerySource(indexes, p, opts, getSort(), openIndex::toFieldBundle);
+  }
+
+  @Override
+  public void markReady(boolean ready) throws IOException {
+    // Arbitrary done on open index, as ready bit is set
+    // per index and not sub index
+    openIndex.markReady(ready);
+  }
+
+  private Sort getSort() {
+    return new Sort(
+        new SortField(UPDATED_SORT_FIELD, SortField.Type.LONG, true),
+        new SortField(ID_SORT_FIELD, SortField.Type.LONG, true));
+  }
+
+  public ChangeSubIndex getClosedChangesIndex() {
+    return closedIndex;
+  }
+
+  private class QuerySource implements ChangeDataSource {
+    private final List<ChangeSubIndex> indexes;
+    private final Predicate<ChangeData> predicate;
+    private final Query query;
+    private final QueryOptions opts;
+    private final Sort sort;
+    private final Function<Document, FieldBundle> rawDocumentMapper;
+
+    private QuerySource(
+        List<ChangeSubIndex> indexes,
+        Predicate<ChangeData> predicate,
+        QueryOptions opts,
+        Sort sort,
+        Function<Document, FieldBundle> rawDocumentMapper)
+        throws QueryParseException {
+      this.indexes = indexes;
+      this.predicate = predicate;
+      this.query = requireNonNull(queryBuilder.toQuery(predicate), "null query from Lucene");
+      this.opts = opts;
+      this.sort = sort;
+      this.rawDocumentMapper = rawDocumentMapper;
+    }
+
+    @Override
+    public int getCardinality() {
+      return 10; // TODO(dborowitz): estimate from Lucene?
+    }
+
+    @Override
+    public boolean hasChange() {
+      return false;
+    }
+
+    @Override
+    public String toString() {
+      return predicate.toString();
+    }
+
+    @Override
+    public ResultSet<ChangeData> read() throws OrmException {
+      if (Thread.interrupted()) {
+        Thread.currentThread().interrupt();
+        throw new OrmException("interrupted");
+      }
+
+      final Set<String> fields = IndexUtils.changeFields(opts);
+      return new ChangeDataResults(
+          executor.submit(
+              new Callable<List<Document>>() {
+                @Override
+                public List<Document> call() throws IOException {
+                  return doRead(fields);
+                }
+
+                @Override
+                public String toString() {
+                  return predicate.toString();
+                }
+              }),
+          fields);
+    }
+
+    @Override
+    public ResultSet<FieldBundle> readRaw() throws OrmException {
+      List<Document> documents;
+      try {
+        documents = doRead(IndexUtils.changeFields(opts));
+      } catch (IOException e) {
+        throw new OrmException(e);
+      }
+      List<FieldBundle> fieldBundles = documents.stream().map(rawDocumentMapper).collect(toList());
+      return new ResultSet<FieldBundle>() {
+        @Override
+        public Iterator<FieldBundle> iterator() {
+          return fieldBundles.iterator();
+        }
+
+        @Override
+        public List<FieldBundle> toList() {
+          return fieldBundles;
+        }
+
+        @Override
+        public void close() {
+          // Do nothing.
+        }
+      };
+    }
+
+    private List<Document> doRead(Set<String> fields) throws IOException {
+      IndexSearcher[] searchers = new IndexSearcher[indexes.size()];
+      try {
+        int realLimit = opts.start() + opts.limit();
+        if (Integer.MAX_VALUE - opts.limit() < opts.start()) {
+          realLimit = Integer.MAX_VALUE;
+        }
+        TopFieldDocs[] hits = new TopFieldDocs[indexes.size()];
+        for (int i = 0; i < indexes.size(); i++) {
+          searchers[i] = indexes.get(i).acquire();
+          hits[i] = searchers[i].search(query, realLimit, sort);
+        }
+        TopDocs docs = TopDocs.merge(sort, realLimit, hits);
+
+        List<Document> result = new ArrayList<>(docs.scoreDocs.length);
+        for (int i = opts.start(); i < docs.scoreDocs.length; i++) {
+          ScoreDoc sd = docs.scoreDocs[i];
+          result.add(searchers[sd.shardIndex].doc(sd.doc, fields));
+        }
+        return result;
+      } finally {
+        for (int i = 0; i < indexes.size(); i++) {
+          if (searchers[i] != null) {
+            try {
+              indexes.get(i).release(searchers[i]);
+            } catch (IOException e) {
+              logger.atWarning().withCause(e).log("cannot release Lucene searcher");
+            }
+          }
+        }
+      }
+    }
+  }
+
+  private class ChangeDataResults implements ResultSet<ChangeData> {
+    private final Future<List<Document>> future;
+    private final Set<String> fields;
+
+    ChangeDataResults(Future<List<Document>> future, Set<String> fields) {
+      this.future = future;
+      this.fields = fields;
+    }
+
+    @Override
+    public Iterator<ChangeData> iterator() {
+      return toList().iterator();
+    }
+
+    @Override
+    public List<ChangeData> toList() {
+      try {
+        List<Document> docs = future.get();
+        List<ChangeData> result = new ArrayList<>(docs.size());
+        String idFieldName = LEGACY_ID.getName();
+        for (Document doc : docs) {
+          result.add(toChangeData(fields(doc, fields), fields, idFieldName));
+        }
+        return result;
+      } catch (InterruptedException e) {
+        close();
+        throw new OrmRuntimeException(e);
+      } catch (ExecutionException e) {
+        Throwables.throwIfUnchecked(e.getCause());
+        throw new OrmRuntimeException(e.getCause());
+      }
+    }
+
+    @Override
+    public void close() {
+      future.cancel(false /* do not interrupt Lucene */);
+    }
+  }
+
+  private static ListMultimap<String, IndexableField> fields(Document doc, Set<String> fields) {
+    ListMultimap<String, IndexableField> stored =
+        MultimapBuilder.hashKeys(fields.size()).arrayListValues(4).build();
+    for (IndexableField f : doc) {
+      String name = f.name();
+      if (fields.contains(name)) {
+        stored.put(name, f);
+      }
+    }
+    return stored;
+  }
+
+  private ChangeData toChangeData(
+      ListMultimap<String, IndexableField> doc, Set<String> fields, String idFieldName) {
+    ChangeData cd;
+    // Either change or the ID field was guaranteed to be included in the call
+    // to fields() above.
+    IndexableField cb = Iterables.getFirst(doc.get(CHANGE_FIELD), null);
+    if (cb != null) {
+      BytesRef proto = cb.binaryValue();
+      cd =
+          changeDataFactory.create(
+              db.get(), CHANGE_CODEC.decode(proto.bytes, proto.offset, proto.length));
+    } else {
+      IndexableField f = Iterables.getFirst(doc.get(idFieldName), null);
+      Change.Id id = new Change.Id(f.numericValue().intValue());
+      // IndexUtils#changeFields ensures either CHANGE or PROJECT is always present.
+      IndexableField project = doc.get(PROJECT.getName()).iterator().next();
+      cd = changeDataFactory.create(db.get(), new Project.NameKey(project.stringValue()), id);
+    }
+
+    // Any decoding that is done here must also be done in {@link ElasticChangeIndex}.
+
+    if (fields.contains(PATCH_SET_FIELD)) {
+      decodePatchSets(doc, cd);
+    }
+    if (fields.contains(APPROVAL_FIELD)) {
+      decodeApprovals(doc, cd);
+    }
+    if (fields.contains(ADDED_FIELD) && fields.contains(DELETED_FIELD)) {
+      decodeChangedLines(doc, cd);
+    }
+    if (fields.contains(MERGEABLE_FIELD)) {
+      decodeMergeable(doc, cd);
+    }
+    if (fields.contains(REVIEWEDBY_FIELD)) {
+      decodeReviewedBy(doc, cd);
+    }
+    if (fields.contains(HASHTAG_FIELD)) {
+      decodeHashtags(doc, cd);
+    }
+    if (fields.contains(STAR_FIELD)) {
+      decodeStar(doc, cd);
+    }
+    if (fields.contains(REVIEWER_FIELD)) {
+      decodeReviewers(doc, cd);
+    }
+    if (fields.contains(REVIEWER_BY_EMAIL_FIELD)) {
+      decodeReviewersByEmail(doc, cd);
+    }
+    if (fields.contains(PENDING_REVIEWER_FIELD)) {
+      decodePendingReviewers(doc, cd);
+    }
+    if (fields.contains(PENDING_REVIEWER_BY_EMAIL_FIELD)) {
+      decodePendingReviewersByEmail(doc, cd);
+    }
+    decodeSubmitRecords(
+        doc, SUBMIT_RECORD_STRICT_FIELD, ChangeField.SUBMIT_RULE_OPTIONS_STRICT, cd);
+    decodeSubmitRecords(
+        doc, SUBMIT_RECORD_LENIENT_FIELD, ChangeField.SUBMIT_RULE_OPTIONS_LENIENT, cd);
+    if (fields.contains(REF_STATE_FIELD)) {
+      decodeRefStates(doc, cd);
+    }
+    if (fields.contains(REF_STATE_PATTERN_FIELD)) {
+      decodeRefStatePatterns(doc, cd);
+    }
+
+    decodeUnresolvedCommentCount(doc, cd);
+    return cd;
+  }
+
+  private void decodePatchSets(ListMultimap<String, IndexableField> doc, ChangeData cd) {
+    List<PatchSet> patchSets = decodeProtos(doc, PATCH_SET_FIELD, PATCH_SET_CODEC);
+    if (!patchSets.isEmpty()) {
+      // Will be an empty list for schemas prior to when this field was stored;
+      // this cannot be valid since a change needs at least one patch set.
+      cd.setPatchSets(patchSets);
+    }
+  }
+
+  private void decodeApprovals(ListMultimap<String, IndexableField> doc, ChangeData cd) {
+    cd.setCurrentApprovals(decodeProtos(doc, APPROVAL_FIELD, APPROVAL_CODEC));
+  }
+
+  private void decodeChangedLines(ListMultimap<String, IndexableField> doc, ChangeData cd) {
+    IndexableField added = Iterables.getFirst(doc.get(ADDED_FIELD), null);
+    IndexableField deleted = Iterables.getFirst(doc.get(DELETED_FIELD), null);
+    if (added != null && deleted != null) {
+      cd.setChangedLines(added.numericValue().intValue(), deleted.numericValue().intValue());
+    } else {
+      // No ChangedLines stored, likely due to failure during reindexing, for
+      // example due to LargeObjectException. But we know the field was
+      // requested, so update ChangeData to prevent callers from trying to
+      // lazily load it, as that would probably also fail.
+      cd.setNoChangedLines();
+    }
+  }
+
+  private void decodeMergeable(ListMultimap<String, IndexableField> doc, ChangeData cd) {
+    IndexableField f = Iterables.getFirst(doc.get(MERGEABLE_FIELD), null);
+    if (f != null) {
+      String mergeable = f.stringValue();
+      if ("1".equals(mergeable)) {
+        cd.setMergeable(true);
+      } else if ("0".equals(mergeable)) {
+        cd.setMergeable(false);
+      }
+    }
+  }
+
+  private void decodeReviewedBy(ListMultimap<String, IndexableField> doc, ChangeData cd) {
+    Collection<IndexableField> reviewedBy = doc.get(REVIEWEDBY_FIELD);
+    if (reviewedBy.size() > 0) {
+      Set<Account.Id> accounts = Sets.newHashSetWithExpectedSize(reviewedBy.size());
+      for (IndexableField r : reviewedBy) {
+        int id = r.numericValue().intValue();
+        if (reviewedBy.size() == 1 && id == ChangeField.NOT_REVIEWED) {
+          break;
+        }
+        accounts.add(new Account.Id(id));
+      }
+      cd.setReviewedBy(accounts);
+    }
+  }
+
+  private void decodeHashtags(ListMultimap<String, IndexableField> doc, ChangeData cd) {
+    Collection<IndexableField> hashtag = doc.get(HASHTAG_FIELD);
+    Set<String> hashtags = Sets.newHashSetWithExpectedSize(hashtag.size());
+    for (IndexableField r : hashtag) {
+      hashtags.add(r.binaryValue().utf8ToString());
+    }
+    cd.setHashtags(hashtags);
+  }
+
+  private void decodeStar(ListMultimap<String, IndexableField> doc, ChangeData cd) {
+    Collection<IndexableField> star = doc.get(STAR_FIELD);
+    ListMultimap<Account.Id, String> stars = MultimapBuilder.hashKeys().arrayListValues().build();
+    for (IndexableField r : star) {
+      StarredChangesUtil.StarField starField = StarredChangesUtil.StarField.parse(r.stringValue());
+      if (starField != null) {
+        stars.put(starField.accountId(), starField.label());
+      }
+    }
+    cd.setStars(stars);
+  }
+
+  private void decodeReviewers(ListMultimap<String, IndexableField> doc, ChangeData cd) {
+    cd.setReviewers(
+        ChangeField.parseReviewerFieldValues(
+            cd.getId(),
+            FluentIterable.from(doc.get(REVIEWER_FIELD)).transform(IndexableField::stringValue)));
+  }
+
+  private void decodeReviewersByEmail(ListMultimap<String, IndexableField> doc, ChangeData cd) {
+    cd.setReviewersByEmail(
+        ChangeField.parseReviewerByEmailFieldValues(
+            cd.getId(),
+            FluentIterable.from(doc.get(REVIEWER_BY_EMAIL_FIELD))
+                .transform(IndexableField::stringValue)));
+  }
+
+  private void decodePendingReviewers(ListMultimap<String, IndexableField> doc, ChangeData cd) {
+    cd.setPendingReviewers(
+        ChangeField.parseReviewerFieldValues(
+            cd.getId(),
+            FluentIterable.from(doc.get(PENDING_REVIEWER_FIELD))
+                .transform(IndexableField::stringValue)));
+  }
+
+  private void decodePendingReviewersByEmail(
+      ListMultimap<String, IndexableField> doc, ChangeData cd) {
+    cd.setPendingReviewersByEmail(
+        ChangeField.parseReviewerByEmailFieldValues(
+            cd.getId(),
+            FluentIterable.from(doc.get(PENDING_REVIEWER_BY_EMAIL_FIELD))
+                .transform(IndexableField::stringValue)));
+  }
+
+  private void decodeSubmitRecords(
+      ListMultimap<String, IndexableField> doc,
+      String field,
+      SubmitRuleOptions opts,
+      ChangeData cd) {
+    ChangeField.parseSubmitRecords(
+        Collections2.transform(doc.get(field), f -> f.binaryValue().utf8ToString()), opts, cd);
+  }
+
+  private void decodeRefStates(ListMultimap<String, IndexableField> doc, ChangeData cd) {
+    cd.setRefStates(copyAsBytes(doc.get(REF_STATE_FIELD)));
+  }
+
+  private void decodeRefStatePatterns(ListMultimap<String, IndexableField> doc, ChangeData cd) {
+    cd.setRefStatePatterns(copyAsBytes(doc.get(REF_STATE_PATTERN_FIELD)));
+  }
+
+  private void decodeUnresolvedCommentCount(
+      ListMultimap<String, IndexableField> doc, ChangeData cd) {
+    IndexableField f = Iterables.getFirst(doc.get(UNRESOLVED_COMMENT_COUNT_FIELD), null);
+    if (f != null && f.numericValue() != null) {
+      cd.setUnresolvedCommentCount(f.numericValue().intValue());
+    }
+  }
+
+  private static <T> List<T> decodeProtos(
+      ListMultimap<String, IndexableField> doc, String fieldName, ProtobufCodec<T> codec) {
+    Collection<IndexableField> fields = doc.get(fieldName);
+    if (fields.isEmpty()) {
+      return Collections.emptyList();
+    }
+
+    List<T> result = new ArrayList<>(fields.size());
+    for (IndexableField f : fields) {
+      BytesRef r = f.binaryValue();
+      result.add(codec.decode(r.bytes, r.offset, r.length));
+    }
+    return result;
+  }
+
+  private static List<byte[]> copyAsBytes(Collection<IndexableField> fields) {
+    return fields.stream()
+        .map(
+            f -> {
+              BytesRef ref = f.binaryValue();
+              byte[] b = new byte[ref.length];
+              System.arraycopy(ref.bytes, ref.offset, b, 0, ref.length);
+              return b;
+            })
+        .collect(toList());
+  }
+}
diff --git a/java/com/google/gerrit/lucene/LuceneGroupIndex.java b/java/com/google/gerrit/lucene/LuceneGroupIndex.java
new file mode 100644
index 0000000..95e2ab9
--- /dev/null
+++ b/java/com/google/gerrit/lucene/LuceneGroupIndex.java
@@ -0,0 +1,146 @@
+// Copyright (C) 2017 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.google.gerrit.lucene;
+
+import static com.google.common.collect.Iterables.getOnlyElement;
+import static com.google.gerrit.server.index.group.GroupField.UUID;
+
+import com.google.gerrit.index.FieldDef;
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.index.Schema.Values;
+import com.google.gerrit.index.query.DataSource;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.account.GroupCache;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.index.IndexUtils;
+import com.google.gerrit.server.index.group.GroupIndex;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.concurrent.ExecutionException;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.SortedDocValuesField;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.search.SearcherFactory;
+import org.apache.lucene.search.Sort;
+import org.apache.lucene.search.SortField;
+import org.apache.lucene.store.Directory;
+import org.apache.lucene.store.FSDirectory;
+import org.apache.lucene.store.RAMDirectory;
+import org.apache.lucene.util.BytesRef;
+import org.eclipse.jgit.lib.Config;
+
+public class LuceneGroupIndex extends AbstractLuceneIndex<AccountGroup.UUID, InternalGroup>
+    implements GroupIndex {
+
+  private static final String GROUPS = "groups";
+
+  private static final String UUID_SORT_FIELD = sortFieldName(UUID);
+
+  private static Term idTerm(InternalGroup group) {
+    return idTerm(group.getGroupUUID());
+  }
+
+  private static Term idTerm(AccountGroup.UUID uuid) {
+    return QueryBuilder.stringTerm(UUID.getName(), uuid.get());
+  }
+
+  private final GerritIndexWriterConfig indexWriterConfig;
+  private final QueryBuilder<InternalGroup> queryBuilder;
+  private final Provider<GroupCache> groupCache;
+
+  private static Directory dir(Schema<?> schema, Config cfg, SitePaths sitePaths)
+      throws IOException {
+    if (LuceneIndexModule.isInMemoryTest(cfg)) {
+      return new RAMDirectory();
+    }
+    Path indexDir = LuceneVersionManager.getDir(sitePaths, GROUPS, schema);
+    return FSDirectory.open(indexDir);
+  }
+
+  @Inject
+  LuceneGroupIndex(
+      @GerritServerConfig Config cfg,
+      SitePaths sitePaths,
+      Provider<GroupCache> groupCache,
+      @Assisted Schema<InternalGroup> schema)
+      throws IOException {
+    super(
+        schema,
+        sitePaths,
+        dir(schema, cfg, sitePaths),
+        GROUPS,
+        null,
+        new GerritIndexWriterConfig(cfg, GROUPS),
+        new SearcherFactory());
+    this.groupCache = groupCache;
+
+    indexWriterConfig = new GerritIndexWriterConfig(cfg, GROUPS);
+    queryBuilder = new QueryBuilder<>(schema, indexWriterConfig.getAnalyzer());
+  }
+
+  @Override
+  void add(Document doc, Values<InternalGroup> values) {
+    // Add separate DocValues field for the field that is needed for sorting.
+    FieldDef<InternalGroup, ?> f = values.getField();
+    if (f == UUID) {
+      String value = (String) getOnlyElement(values.getValues());
+      doc.add(new SortedDocValuesField(UUID_SORT_FIELD, new BytesRef(value)));
+    }
+    super.add(doc, values);
+  }
+
+  @Override
+  public void replace(InternalGroup group) throws IOException {
+    try {
+      replace(idTerm(group), toDocument(group)).get();
+    } catch (ExecutionException | InterruptedException e) {
+      throw new IOException(e);
+    }
+  }
+
+  @Override
+  public void delete(AccountGroup.UUID key) throws IOException {
+    try {
+      delete(idTerm(key)).get();
+    } catch (ExecutionException | InterruptedException e) {
+      throw new IOException(e);
+    }
+  }
+
+  @Override
+  public DataSource<InternalGroup> getSource(Predicate<InternalGroup> p, QueryOptions opts)
+      throws QueryParseException {
+    return new LuceneQuerySource(
+        opts.filterFields(IndexUtils::groupFields),
+        queryBuilder.toQuery(p),
+        new Sort(new SortField(UUID_SORT_FIELD, SortField.Type.STRING, false)));
+  }
+
+  @Override
+  protected InternalGroup fromDocument(Document doc) {
+    AccountGroup.UUID uuid = new AccountGroup.UUID(doc.getField(UUID.getName()).stringValue());
+    // Use the GroupCache rather than depending on any stored fields in the
+    // document (of which there shouldn't be any).
+    return groupCache.get().get(uuid).orElse(null);
+  }
+}
diff --git a/java/com/google/gerrit/lucene/LuceneIndexModule.java b/java/com/google/gerrit/lucene/LuceneIndexModule.java
new file mode 100644
index 0000000..302a2da
--- /dev/null
+++ b/java/com/google/gerrit/lucene/LuceneIndexModule.java
@@ -0,0 +1,83 @@
+// Copyright (C) 2013 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.google.gerrit.lucene;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.gerrit.index.IndexConfig;
+import com.google.gerrit.index.project.ProjectIndex;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.index.AbstractIndexModule;
+import com.google.gerrit.server.index.VersionManager;
+import com.google.gerrit.server.index.account.AccountIndex;
+import com.google.gerrit.server.index.change.ChangeIndex;
+import com.google.gerrit.server.index.group.GroupIndex;
+import java.util.Map;
+import org.apache.lucene.search.BooleanQuery;
+import org.eclipse.jgit.lib.Config;
+
+public class LuceneIndexModule extends AbstractIndexModule {
+  public static LuceneIndexModule singleVersionAllLatest(int threads, boolean slave) {
+    return new LuceneIndexModule(ImmutableMap.of(), threads, slave);
+  }
+
+  public static LuceneIndexModule singleVersionWithExplicitVersions(
+      Map<String, Integer> versions, int threads, boolean slave) {
+    return new LuceneIndexModule(versions, threads, slave);
+  }
+
+  public static LuceneIndexModule latestVersion(boolean slave) {
+    return new LuceneIndexModule(null, 0, slave);
+  }
+
+  static boolean isInMemoryTest(Config cfg) {
+    return cfg.getBoolean("index", "lucene", "testInmemory", false);
+  }
+
+  private LuceneIndexModule(Map<String, Integer> singleVersions, int threads, boolean slave) {
+    super(singleVersions, threads, slave);
+  }
+
+  @Override
+  protected Class<? extends AccountIndex> getAccountIndex() {
+    return LuceneAccountIndex.class;
+  }
+
+  @Override
+  protected Class<? extends ChangeIndex> getChangeIndex() {
+    return LuceneChangeIndex.class;
+  }
+
+  @Override
+  protected Class<? extends GroupIndex> getGroupIndex() {
+    return LuceneGroupIndex.class;
+  }
+
+  @Override
+  protected Class<? extends ProjectIndex> getProjectIndex() {
+    return LuceneProjectIndex.class;
+  }
+
+  @Override
+  protected Class<? extends VersionManager> getVersionManager() {
+    return LuceneVersionManager.class;
+  }
+
+  @Override
+  protected IndexConfig getIndexConfig(@GerritServerConfig Config cfg) {
+    BooleanQuery.setMaxClauseCount(
+        cfg.getInt("index", "maxTerms", BooleanQuery.getMaxClauseCount()));
+    return super.getIndexConfig(cfg);
+  }
+}
diff --git a/java/com/google/gerrit/lucene/LuceneProjectIndex.java b/java/com/google/gerrit/lucene/LuceneProjectIndex.java
new file mode 100644
index 0000000..02d8655
--- /dev/null
+++ b/java/com/google/gerrit/lucene/LuceneProjectIndex.java
@@ -0,0 +1,145 @@
+// Copyright (C) 2017 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.google.gerrit.lucene;
+
+import static com.google.common.collect.Iterables.getOnlyElement;
+import static com.google.gerrit.index.project.ProjectField.NAME;
+
+import com.google.gerrit.index.FieldDef;
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.index.Schema.Values;
+import com.google.gerrit.index.project.ProjectData;
+import com.google.gerrit.index.project.ProjectIndex;
+import com.google.gerrit.index.query.DataSource;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.index.IndexUtils;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.concurrent.ExecutionException;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.SortedDocValuesField;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.search.SearcherFactory;
+import org.apache.lucene.search.Sort;
+import org.apache.lucene.search.SortField;
+import org.apache.lucene.store.Directory;
+import org.apache.lucene.store.FSDirectory;
+import org.apache.lucene.store.RAMDirectory;
+import org.apache.lucene.util.BytesRef;
+import org.eclipse.jgit.lib.Config;
+
+public class LuceneProjectIndex extends AbstractLuceneIndex<Project.NameKey, ProjectData>
+    implements ProjectIndex {
+  private static final String PROJECTS = "projects";
+
+  private static final String NAME_SORT_FIELD = sortFieldName(NAME);
+
+  private static Term idTerm(ProjectData projectState) {
+    return idTerm(projectState.getProject().getNameKey());
+  }
+
+  private static Term idTerm(Project.NameKey nameKey) {
+    return QueryBuilder.stringTerm(NAME.getName(), nameKey.get());
+  }
+
+  private final GerritIndexWriterConfig indexWriterConfig;
+  private final QueryBuilder<ProjectData> queryBuilder;
+  private final Provider<ProjectCache> projectCache;
+
+  private static Directory dir(Schema<ProjectData> schema, Config cfg, SitePaths sitePaths)
+      throws IOException {
+    if (LuceneIndexModule.isInMemoryTest(cfg)) {
+      return new RAMDirectory();
+    }
+    Path indexDir = LuceneVersionManager.getDir(sitePaths, PROJECTS, schema);
+    return FSDirectory.open(indexDir);
+  }
+
+  @Inject
+  LuceneProjectIndex(
+      @GerritServerConfig Config cfg,
+      SitePaths sitePaths,
+      Provider<ProjectCache> projectCache,
+      @Assisted Schema<ProjectData> schema)
+      throws IOException {
+    super(
+        schema,
+        sitePaths,
+        dir(schema, cfg, sitePaths),
+        PROJECTS,
+        null,
+        new GerritIndexWriterConfig(cfg, PROJECTS),
+        new SearcherFactory());
+    this.projectCache = projectCache;
+
+    indexWriterConfig = new GerritIndexWriterConfig(cfg, PROJECTS);
+    queryBuilder = new QueryBuilder<>(schema, indexWriterConfig.getAnalyzer());
+  }
+
+  @Override
+  void add(Document doc, Values<ProjectData> values) {
+    // Add separate DocValues field for the field that is needed for sorting.
+    FieldDef<ProjectData, ?> f = values.getField();
+    if (f == NAME) {
+      String value = (String) getOnlyElement(values.getValues());
+      doc.add(new SortedDocValuesField(NAME_SORT_FIELD, new BytesRef(value)));
+    }
+    super.add(doc, values);
+  }
+
+  @Override
+  public void replace(ProjectData projectState) throws IOException {
+    try {
+      replace(idTerm(projectState), toDocument(projectState)).get();
+    } catch (ExecutionException | InterruptedException e) {
+      throw new IOException(e);
+    }
+  }
+
+  @Override
+  public void delete(Project.NameKey nameKey) throws IOException {
+    try {
+      delete(idTerm(nameKey)).get();
+    } catch (ExecutionException | InterruptedException e) {
+      throw new IOException(e);
+    }
+  }
+
+  @Override
+  public DataSource<ProjectData> getSource(Predicate<ProjectData> p, QueryOptions opts)
+      throws QueryParseException {
+    return new LuceneQuerySource(
+        opts.filterFields(IndexUtils::projectFields),
+        queryBuilder.toQuery(p),
+        new Sort(new SortField(NAME_SORT_FIELD, SortField.Type.STRING, false)));
+  }
+
+  @Override
+  protected ProjectData fromDocument(Document doc) {
+    Project.NameKey nameKey = new Project.NameKey(doc.getField(NAME.getName()).stringValue());
+    ProjectState projectState = projectCache.get().get(nameKey);
+    return projectState == null ? null : projectState.toProjectData();
+  }
+}
diff --git a/java/com/google/gerrit/lucene/LuceneVersionManager.java b/java/com/google/gerrit/lucene/LuceneVersionManager.java
new file mode 100644
index 0000000..63abea8
--- /dev/null
+++ b/java/com/google/gerrit/lucene/LuceneVersionManager.java
@@ -0,0 +1,92 @@
+// Copyright (C) 2013 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.google.gerrit.lucene;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.common.primitives.Ints;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.index.Index;
+import com.google.gerrit.index.IndexDefinition;
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.index.GerritIndexStatus;
+import com.google.gerrit.server.index.OnlineUpgradeListener;
+import com.google.gerrit.server.index.VersionManager;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.nio.file.DirectoryStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Collection;
+import java.util.TreeMap;
+import org.eclipse.jgit.lib.Config;
+
+@Singleton
+public class LuceneVersionManager extends VersionManager {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  static Path getDir(SitePaths sitePaths, String name, Schema<?> schema) {
+    return sitePaths.index_dir.resolve(String.format("%s_%04d", name, schema.getVersion()));
+  }
+
+  @Inject
+  LuceneVersionManager(
+      @GerritServerConfig Config cfg,
+      SitePaths sitePaths,
+      DynamicSet<OnlineUpgradeListener> listeners,
+      Collection<IndexDefinition<?, ?, ?>> defs) {
+    super(sitePaths, listeners, defs, VersionManager.getOnlineUpgrade(cfg));
+  }
+
+  @Override
+  protected <K, V, I extends Index<K, V>> TreeMap<Integer, VersionManager.Version<V>> scanVersions(
+      IndexDefinition<K, V, I> def, GerritIndexStatus cfg) {
+    TreeMap<Integer, VersionManager.Version<V>> versions = new TreeMap<>();
+    for (Schema<V> schema : def.getSchemas().values()) {
+      // This part is Lucene-specific.
+      Path p = getDir(sitePaths, def.getName(), schema);
+      boolean isDir = Files.isDirectory(p);
+      if (Files.exists(p) && !isDir) {
+        logger.atWarning().log("Not a directory: %s", p.toAbsolutePath());
+      }
+      int v = schema.getVersion();
+      versions.put(v, new Version<>(schema, v, isDir, cfg.getReady(def.getName(), v)));
+    }
+
+    String prefix = def.getName() + "_";
+    try (DirectoryStream<Path> paths = Files.newDirectoryStream(sitePaths.index_dir)) {
+      for (Path p : paths) {
+        String n = p.getFileName().toString();
+        if (!n.startsWith(prefix)) {
+          continue;
+        }
+        String versionStr = n.substring(prefix.length());
+        Integer v = Ints.tryParse(versionStr);
+        if (v == null || versionStr.length() != 4) {
+          logger.atWarning().log("Unrecognized version in index directory: %s", p.toAbsolutePath());
+          continue;
+        }
+        if (!versions.containsKey(v)) {
+          versions.put(v, new Version<V>(null, v, true, cfg.getReady(def.getName(), v)));
+        }
+      }
+    } catch (IOException e) {
+      logger.atSevere().withCause(e).log("Error scanning index directory: %s", sitePaths.index_dir);
+    }
+    return versions;
+  }
+}
diff --git a/java/com/google/gerrit/lucene/QueryBuilder.java b/java/com/google/gerrit/lucene/QueryBuilder.java
new file mode 100644
index 0000000..ce5ba98
--- /dev/null
+++ b/java/com/google/gerrit/lucene/QueryBuilder.java
@@ -0,0 +1,248 @@
+// Copyright (C) 2013 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.google.gerrit.lucene;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.apache.lucene.search.BooleanClause.Occur.MUST;
+import static org.apache.lucene.search.BooleanClause.Occur.MUST_NOT;
+import static org.apache.lucene.search.BooleanClause.Occur.SHOULD;
+
+import com.google.common.collect.Lists;
+import com.google.gerrit.index.FieldType;
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.index.query.AndPredicate;
+import com.google.gerrit.index.query.IndexPredicate;
+import com.google.gerrit.index.query.IntegerRangePredicate;
+import com.google.gerrit.index.query.NotPredicate;
+import com.google.gerrit.index.query.OrPredicate;
+import com.google.gerrit.index.query.PostFilterPredicate;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.index.query.RegexPredicate;
+import com.google.gerrit.index.query.TimestampRangePredicate;
+import java.util.Date;
+import java.util.List;
+import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.search.BooleanQuery;
+import org.apache.lucene.search.LegacyNumericRangeQuery;
+import org.apache.lucene.search.MatchAllDocsQuery;
+import org.apache.lucene.search.PrefixQuery;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.RegexpQuery;
+import org.apache.lucene.search.TermQuery;
+import org.apache.lucene.util.BytesRefBuilder;
+import org.apache.lucene.util.LegacyNumericUtils;
+
+@SuppressWarnings("deprecation")
+public class QueryBuilder<V> {
+  static Term intTerm(String name, int value) {
+    BytesRefBuilder builder = new BytesRefBuilder();
+    LegacyNumericUtils.intToPrefixCoded(value, 0, builder);
+    return new Term(name, builder.get());
+  }
+
+  static Term stringTerm(String name, String value) {
+    BytesRefBuilder builder = new BytesRefBuilder();
+    builder.append(value.getBytes(UTF_8), 0, value.length());
+    return new Term(name, builder.get());
+  }
+
+  private final Schema<V> schema;
+  private final org.apache.lucene.util.QueryBuilder queryBuilder;
+
+  public QueryBuilder(Schema<V> schema, Analyzer analyzer) {
+    this.schema = schema;
+    queryBuilder = new org.apache.lucene.util.QueryBuilder(analyzer);
+  }
+
+  public Query toQuery(Predicate<V> p) throws QueryParseException {
+    if (p instanceof AndPredicate) {
+      return and(p);
+    } else if (p instanceof OrPredicate) {
+      return or(p);
+    } else if (p instanceof NotPredicate) {
+      return not(p);
+    } else if (p instanceof IndexPredicate) {
+      return fieldQuery((IndexPredicate<V>) p);
+    } else if (p instanceof PostFilterPredicate) {
+      return new MatchAllDocsQuery();
+    } else {
+      throw new QueryParseException("cannot create query for index: " + p);
+    }
+  }
+
+  private Query or(Predicate<V> p) throws QueryParseException {
+    try {
+      BooleanQuery.Builder q = new BooleanQuery.Builder();
+      for (int i = 0; i < p.getChildCount(); i++) {
+        q.add(toQuery(p.getChild(i)), SHOULD);
+      }
+      return q.build();
+    } catch (BooleanQuery.TooManyClauses e) {
+      throw new QueryParseException("cannot create query for index: " + p, e);
+    }
+  }
+
+  private Query and(Predicate<V> p) throws QueryParseException {
+    try {
+      BooleanQuery.Builder b = new BooleanQuery.Builder();
+      List<Query> not = Lists.newArrayListWithCapacity(p.getChildCount());
+      for (int i = 0; i < p.getChildCount(); i++) {
+        Predicate<V> c = p.getChild(i);
+        if (c instanceof NotPredicate) {
+          Predicate<V> n = c.getChild(0);
+          if (n instanceof TimestampRangePredicate) {
+            b.add(notTimestamp((TimestampRangePredicate<V>) n), MUST);
+          } else {
+            not.add(toQuery(n));
+          }
+        } else {
+          b.add(toQuery(c), MUST);
+        }
+      }
+      for (Query q : not) {
+        b.add(q, MUST_NOT);
+      }
+      return b.build();
+    } catch (BooleanQuery.TooManyClauses e) {
+      throw new QueryParseException("cannot create query for index: " + p, e);
+    }
+  }
+
+  private Query not(Predicate<V> p) throws QueryParseException {
+    Predicate<V> n = p.getChild(0);
+    if (n instanceof TimestampRangePredicate) {
+      return notTimestamp((TimestampRangePredicate<V>) n);
+    }
+
+    // Lucene does not support negation, start with all and subtract.
+    return new BooleanQuery.Builder()
+        .add(new MatchAllDocsQuery(), MUST)
+        .add(toQuery(n), MUST_NOT)
+        .build();
+  }
+
+  private Query fieldQuery(IndexPredicate<V> p) throws QueryParseException {
+    checkArgument(
+        schema.hasField(p.getField()),
+        "field not in schema v%s: %s",
+        schema.getVersion(),
+        p.getField().getName());
+    FieldType<?> type = p.getType();
+    if (type == FieldType.INTEGER) {
+      return intQuery(p);
+    } else if (type == FieldType.INTEGER_RANGE) {
+      return intRangeQuery(p);
+    } else if (type == FieldType.TIMESTAMP) {
+      return timestampQuery(p);
+    } else if (type == FieldType.EXACT) {
+      return exactQuery(p);
+    } else if (type == FieldType.PREFIX) {
+      return prefixQuery(p);
+    } else if (type == FieldType.FULL_TEXT) {
+      return fullTextQuery(p);
+    } else {
+      throw FieldType.badFieldType(type);
+    }
+  }
+
+  private Query intQuery(IndexPredicate<V> p) throws QueryParseException {
+    int value;
+    try {
+      // Can't use IntPredicate because it and IndexPredicate are different
+      // subclasses of OperatorPredicate.
+      value = Integer.parseInt(p.getValue());
+    } catch (NumberFormatException e) {
+      throw new QueryParseException("not an integer: " + p.getValue());
+    }
+    return new TermQuery(intTerm(p.getField().getName(), value));
+  }
+
+  private Query intRangeQuery(IndexPredicate<V> p) throws QueryParseException {
+    if (p instanceof IntegerRangePredicate) {
+      IntegerRangePredicate<V> r = (IntegerRangePredicate<V>) p;
+      int minimum = r.getMinimumValue();
+      int maximum = r.getMaximumValue();
+      if (minimum == maximum) {
+        // Just fall back to a standard integer query.
+        return new TermQuery(intTerm(p.getField().getName(), minimum));
+      }
+      return LegacyNumericRangeQuery.newIntRange(
+          r.getField().getName(), minimum, maximum, true, true);
+    }
+    throw new QueryParseException("not an integer range: " + p);
+  }
+
+  private Query timestampQuery(IndexPredicate<V> p) throws QueryParseException {
+    if (p instanceof TimestampRangePredicate) {
+      TimestampRangePredicate<V> r = (TimestampRangePredicate<V>) p;
+      return LegacyNumericRangeQuery.newLongRange(
+          r.getField().getName(),
+          r.getMinTimestamp().getTime(),
+          r.getMaxTimestamp().getTime(),
+          true,
+          true);
+    }
+    throw new QueryParseException("not a timestamp: " + p);
+  }
+
+  private Query notTimestamp(TimestampRangePredicate<V> r) throws QueryParseException {
+    if (r.getMinTimestamp().getTime() == 0) {
+      return LegacyNumericRangeQuery.newLongRange(
+          r.getField().getName(), r.getMaxTimestamp().getTime(), null, true, true);
+    }
+    throw new QueryParseException("cannot negate: " + r);
+  }
+
+  private Query exactQuery(IndexPredicate<V> p) {
+    if (p instanceof RegexPredicate<?>) {
+      return regexQuery(p);
+    }
+    return new TermQuery(new Term(p.getField().getName(), p.getValue()));
+  }
+
+  private Query regexQuery(IndexPredicate<V> p) {
+    String re = p.getValue();
+    if (re.startsWith("^")) {
+      re = re.substring(1);
+    }
+    if (re.endsWith("$") && !re.endsWith("\\$")) {
+      re = re.substring(0, re.length() - 1);
+    }
+    return new RegexpQuery(new Term(p.getField().getName(), re));
+  }
+
+  private Query prefixQuery(IndexPredicate<V> p) {
+    return new PrefixQuery(new Term(p.getField().getName(), p.getValue()));
+  }
+
+  private Query fullTextQuery(IndexPredicate<V> p) throws QueryParseException {
+    String value = p.getValue();
+    if (value == null) {
+      throw new QueryParseException("Full-text search over empty string not supported");
+    }
+    Query query = queryBuilder.createPhraseQuery(p.getField().getName(), value);
+    if (query == null) {
+      throw new QueryParseException("Cannot create full-text query with value: " + value);
+    }
+    return query;
+  }
+
+  public int toIndexTimeInMinutes(Date ts) {
+    return (int) (ts.getTime() / 60000);
+  }
+}
diff --git a/java/com/google/gerrit/lucene/WrappableSearcherManager.java b/java/com/google/gerrit/lucene/WrappableSearcherManager.java
new file mode 100644
index 0000000..ba8d7da
--- /dev/null
+++ b/java/com/google/gerrit/lucene/WrappableSearcherManager.java
@@ -0,0 +1,218 @@
+package com.google.gerrit.lucene;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+import java.io.IOException;
+import org.apache.lucene.index.DirectoryReader;
+import org.apache.lucene.index.FilterDirectoryReader;
+import org.apache.lucene.index.FilterLeafReader;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexWriter;
+import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.ReferenceManager;
+import org.apache.lucene.search.SearcherFactory;
+import org.apache.lucene.store.Directory;
+
+/**
+ * Utility class to safely share {@link IndexSearcher} instances across multiple threads, while
+ * periodically reopening. This class ensures each searcher is closed only once all threads have
+ * finished using it.
+ *
+ * <p>Use {@link #acquire} to obtain the current searcher, and {@link #release} to release it, like
+ * this:
+ *
+ * <pre class="prettyprint">
+ * IndexSearcher s = manager.acquire();
+ * try {
+ *   // Do searching, doc retrieval, etc. with s
+ * } finally {
+ *   manager.release(s);
+ * }
+ * // Do not use s after this!
+ * s = null;
+ * </pre>
+ *
+ * <p>In addition you should periodically call {@link #maybeRefresh}. While it's possible to call
+ * this just before running each query, this is discouraged since it penalizes the unlucky queries
+ * that need to refresh. It's better to use a separate background thread, that periodically calls
+ * {@link #maybeRefresh}. Finally, be sure to call {@link #close} once you are done.
+ *
+ * @see SearcherFactory
+ * @lucene.experimental
+ */
+// This file was copied from:
+// https://github.com/apache/lucene-solr/blob/lucene_solr_5_0/lucene/core/src/java/org/apache/lucene/search/SearcherManager.java
+// The only change (other than class name and import fixes)
+// is to skip the check in getSearcher that searcherFactory.newSearcher wraps
+// the provided searcher exactly.
+final class WrappableSearcherManager extends ReferenceManager<IndexSearcher> {
+
+  private final SearcherFactory searcherFactory;
+
+  /**
+   * Creates and returns a new SearcherManager from the given {@link IndexWriter}.
+   *
+   * @param writer the IndexWriter to open the IndexReader from.
+   * @param applyAllDeletes If <code>true</code>, all buffered deletes will be applied (made
+   *     visible) in the {@link IndexSearcher} / {@link DirectoryReader}. If <code>false</code>, the
+   *     deletes may or may not be applied, but remain buffered (in IndexWriter) so that they will
+   *     be applied in the future. Applying deletes can be costly, so if your app can tolerate
+   *     deleted documents being returned you might gain some performance by passing <code>false
+   *     </code>. See {@link DirectoryReader#openIfChanged(DirectoryReader, IndexWriter, boolean)}.
+   * @param searcherFactory An optional {@link SearcherFactory}. Pass <code>null</code> if you don't
+   *     require the searcher to be warmed before going live or other custom behavior.
+   * @throws IOException if there is a low-level I/O error
+   */
+  WrappableSearcherManager(
+      IndexWriter writer, boolean applyAllDeletes, SearcherFactory searcherFactory)
+      throws IOException {
+    // TODO(davido): Make it configurable
+    // If true, new deletes will be written down to index files instead of carried over from writer
+    // to reader directly in heap
+    boolean writeAllDeletes = false;
+    if (searcherFactory == null) {
+      searcherFactory = new SearcherFactory();
+    }
+    this.searcherFactory = searcherFactory;
+    current =
+        getSearcher(
+            searcherFactory, DirectoryReader.open(writer, applyAllDeletes, writeAllDeletes));
+  }
+
+  /**
+   * Creates and returns a new SearcherManager from the given {@link Directory}.
+   *
+   * @param dir the directory to open the DirectoryReader on.
+   * @param searcherFactory An optional {@link SearcherFactory}. Pass <code>null</code> if you don't
+   *     require the searcher to be warmed before going live or other custom behavior.
+   * @throws IOException if there is a low-level I/O error
+   */
+  WrappableSearcherManager(Directory dir, SearcherFactory searcherFactory) throws IOException {
+    if (searcherFactory == null) {
+      searcherFactory = new SearcherFactory();
+    }
+    this.searcherFactory = searcherFactory;
+    current = getSearcher(searcherFactory, DirectoryReader.open(dir));
+  }
+
+  /**
+   * Creates and returns a new SearcherManager from an existing {@link DirectoryReader}. Note that
+   * this steals the incoming reference.
+   *
+   * @param reader the DirectoryReader.
+   * @param searcherFactory An optional {@link SearcherFactory}. Pass <code>null</code> if you don't
+   *     require the searcher to be warmed before going live or other custom behavior.
+   * @throws IOException if there is a low-level I/O error
+   */
+  WrappableSearcherManager(DirectoryReader reader, SearcherFactory searcherFactory)
+      throws IOException {
+    if (searcherFactory == null) {
+      searcherFactory = new SearcherFactory();
+    }
+    this.searcherFactory = searcherFactory;
+    this.current = getSearcher(searcherFactory, reader);
+  }
+
+  @Override
+  protected void decRef(IndexSearcher reference) throws IOException {
+    reference.getIndexReader().decRef();
+  }
+
+  @Override
+  protected IndexSearcher refreshIfNeeded(IndexSearcher referenceToRefresh) throws IOException {
+    final IndexReader r = referenceToRefresh.getIndexReader();
+    assert r instanceof DirectoryReader
+        : "searcher's IndexReader should be a DirectoryReader, but got " + r;
+    final IndexReader newReader = DirectoryReader.openIfChanged((DirectoryReader) r);
+    if (newReader == null) {
+      return null;
+    }
+    return getSearcher(searcherFactory, newReader);
+  }
+
+  @Override
+  protected boolean tryIncRef(IndexSearcher reference) {
+    return reference.getIndexReader().tryIncRef();
+  }
+
+  @Override
+  protected int getRefCount(IndexSearcher reference) {
+    return reference.getIndexReader().getRefCount();
+  }
+
+  /**
+   * Returns <code>true</code> if no changes have occured since this searcher ie. reader was opened,
+   * otherwise <code>false</code>.
+   *
+   * @see DirectoryReader#isCurrent()
+   */
+  public boolean isSearcherCurrent() throws IOException {
+    final IndexSearcher searcher = acquire();
+    try {
+      final IndexReader r = searcher.getIndexReader();
+      assert r instanceof DirectoryReader
+          : "searcher's IndexReader should be a DirectoryReader, but got " + r;
+      return ((DirectoryReader) r).isCurrent();
+    } finally {
+      release(searcher);
+    }
+  }
+
+  /**
+   * Expert: creates a searcher from the provided {@link IndexReader} using the provided {@link
+   * SearcherFactory}. NOTE: this decRefs incoming reader on throwing an exception.
+   */
+  @SuppressWarnings("resource")
+  public static IndexSearcher getSearcher(SearcherFactory searcherFactory, IndexReader reader)
+      throws IOException {
+    boolean success = false;
+    final IndexSearcher searcher;
+    try {
+      searcher = searcherFactory.newSearcher(reader, null);
+      // Modification for Gerrit: Allow searcherFactory to transitively wrap the
+      // provided reader.
+      IndexReader unwrapped = searcher.getIndexReader();
+      while (true) {
+        if (unwrapped == reader) {
+          break;
+        } else if (unwrapped instanceof FilterDirectoryReader) {
+          unwrapped = ((FilterDirectoryReader) unwrapped).getDelegate();
+        } else if (unwrapped instanceof FilterLeafReader) {
+          unwrapped = ((FilterLeafReader) unwrapped).getDelegate();
+        } else {
+          break;
+        }
+      }
+
+      if (unwrapped != reader) {
+        throw new IllegalStateException(
+            "SearcherFactory must wrap the provided reader (got "
+                + searcher.getIndexReader()
+                + " but expected "
+                + reader
+                + ")");
+      }
+      success = true;
+    } finally {
+      if (!success) {
+        reader.decRef();
+      }
+    }
+    return searcher;
+  }
+}
diff --git a/java/com/google/gerrit/mail/Address.java b/java/com/google/gerrit/mail/Address.java
new file mode 100644
index 0000000..24ab353
--- /dev/null
+++ b/java/com/google/gerrit/mail/Address.java
@@ -0,0 +1,140 @@
+// Copyright (C) 2009 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.google.gerrit.mail;
+
+import com.google.gerrit.common.Nullable;
+
+public class Address {
+  public static Address parse(String in) {
+    final int lt = in.indexOf('<');
+    final int gt = in.indexOf('>');
+    final int at = in.indexOf("@");
+    if (0 <= lt && lt < gt && lt + 1 < at && at + 1 < gt) {
+      final String email = in.substring(lt + 1, gt).trim();
+      final String name = in.substring(0, lt).trim();
+      int nameStart = 0;
+      int nameEnd = name.length();
+      if (name.startsWith("\"")) {
+        nameStart++;
+      }
+      if (name.endsWith("\"")) {
+        nameEnd--;
+      }
+      return new Address(name.length() > 0 ? name.substring(nameStart, nameEnd) : null, email);
+    }
+
+    if (lt < 0 && gt < 0 && 0 < at && at < in.length() - 1) {
+      return new Address(in);
+    }
+
+    throw new IllegalArgumentException("Invalid email address: " + in);
+  }
+
+  public static Address tryParse(String in) {
+    try {
+      return parse(in);
+    } catch (IllegalArgumentException e) {
+      return null;
+    }
+  }
+
+  @Nullable private final String name;
+  private final String email;
+
+  public Address(String email) {
+    this(null, email);
+  }
+
+  public Address(String name, String email) {
+    this.name = name;
+    this.email = email;
+  }
+
+  @Nullable
+  public String getName() {
+    return name;
+  }
+
+  public String getEmail() {
+    return email;
+  }
+
+  @Override
+  public int hashCode() {
+    return email.hashCode();
+  }
+
+  @Override
+  public boolean equals(Object other) {
+    if (other instanceof Address) {
+      return email.equals(((Address) other).email);
+    }
+    return false;
+  }
+
+  @Override
+  public String toString() {
+    return toHeaderString();
+  }
+
+  public String toHeaderString() {
+    if (name != null) {
+      return quotedPhrase(name) + " <" + email + ">";
+    } else if (isSimple()) {
+      return email;
+    }
+    return "<" + email + ">";
+  }
+
+  private static final String MUST_QUOTE_EMAIL = "()<>,;:\\\"[]";
+  private static final String MUST_QUOTE_NAME = MUST_QUOTE_EMAIL + "@.";
+
+  private boolean isSimple() {
+    for (int i = 0; i < email.length(); i++) {
+      final char c = email.charAt(i);
+      if (c <= ' ' || 0x7F <= c || MUST_QUOTE_EMAIL.indexOf(c) != -1) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  private static String quotedPhrase(String name) {
+    if (EmailHeader.needsQuotedPrintable(name)) {
+      return EmailHeader.quotedPrintable(name);
+    }
+    for (int i = 0; i < name.length(); i++) {
+      final char c = name.charAt(i);
+      if (MUST_QUOTE_NAME.indexOf(c) != -1) {
+        return wrapInQuotes(name);
+      }
+    }
+    return name;
+  }
+
+  private static String wrapInQuotes(String name) {
+    final StringBuilder r = new StringBuilder(2 + name.length());
+    r.append('"');
+    for (int i = 0; i < name.length(); i++) {
+      char c = name.charAt(i);
+      if (c == '"' || c == '\\') {
+        r.append('\\');
+      }
+      r.append(c);
+    }
+    r.append('"');
+    return r.toString();
+  }
+}
diff --git a/java/com/google/gerrit/mail/BUILD b/java/com/google/gerrit/mail/BUILD
new file mode 100644
index 0000000..90bb82c
--- /dev/null
+++ b/java/com/google/gerrit/mail/BUILD
@@ -0,0 +1,18 @@
+java_library(
+    name = "mail",
+    srcs = glob(["*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/common:annotations",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//lib:guava",
+        "//lib/auto:auto-value",
+        "//lib/auto:auto-value-annotations",
+        "//lib/flogger:api",
+        "//lib/jsoup",
+        "//lib/log:jsonevent-layout",
+        "//lib/log:log4j",
+        "//lib/mime4j:core",
+        "//lib/mime4j:dom",
+    ],
+)
diff --git a/java/com/google/gerrit/mail/EmailHeader.java b/java/com/google/gerrit/mail/EmailHeader.java
new file mode 100644
index 0000000..69d5fcd
--- /dev/null
+++ b/java/com/google/gerrit/mail/EmailHeader.java
@@ -0,0 +1,233 @@
+// Copyright (C) 2009 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.google.gerrit.mail;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.base.MoreObjects;
+import java.io.IOException;
+import java.io.Writer;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Locale;
+import java.util.Objects;
+
+public abstract class EmailHeader {
+  public abstract boolean isEmpty();
+
+  public abstract void write(Writer w) throws IOException;
+
+  public static class String extends EmailHeader {
+    private final java.lang.String value;
+
+    public String(java.lang.String v) {
+      value = v;
+    }
+
+    public java.lang.String getString() {
+      return value;
+    }
+
+    @Override
+    public boolean isEmpty() {
+      return value == null || value.length() == 0;
+    }
+
+    @Override
+    public void write(Writer w) throws IOException {
+      if (needsQuotedPrintable(value)) {
+        w.write(quotedPrintable(value));
+      } else {
+        w.write(value);
+      }
+    }
+
+    @Override
+    public int hashCode() {
+      return Objects.hashCode(value);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+      return (o instanceof String) && Objects.equals(value, ((String) o).value);
+    }
+
+    @Override
+    public java.lang.String toString() {
+      return MoreObjects.toStringHelper(this).addValue(value).toString();
+    }
+  }
+
+  public static boolean needsQuotedPrintable(java.lang.String value) {
+    for (int i = 0; i < value.length(); i++) {
+      if (value.charAt(i) < ' ' || '~' < value.charAt(i)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  static boolean needsQuotedPrintableWithinPhrase(int cp) {
+    switch (cp) {
+      case '!':
+      case '*':
+      case '+':
+      case '-':
+      case '/':
+      case '=':
+      case '_':
+        return false;
+      default:
+        if (('a' <= cp && cp <= 'z') || ('A' <= cp && cp <= 'Z') || ('0' <= cp && cp <= '9')) {
+          return false;
+        }
+        return true;
+    }
+  }
+
+  public static java.lang.String quotedPrintable(java.lang.String value) {
+    final StringBuilder r = new StringBuilder();
+
+    r.append("=?UTF-8?Q?");
+    for (int i = 0; i < value.length(); i++) {
+      final int cp = value.codePointAt(i);
+      if (cp == ' ') {
+        r.append('_');
+
+      } else if (needsQuotedPrintableWithinPhrase(cp)) {
+        byte[] buf = new java.lang.String(Character.toChars(cp)).getBytes(UTF_8);
+        for (byte b : buf) {
+          r.append('=');
+          r.append(Integer.toHexString((b >>> 4) & 0x0f).toUpperCase());
+          r.append(Integer.toHexString(b & 0x0f).toUpperCase());
+        }
+
+      } else {
+        r.append(Character.toChars(cp));
+      }
+    }
+    r.append("?=");
+
+    return r.toString();
+  }
+
+  public static class Date extends EmailHeader {
+    private final java.util.Date value;
+
+    public Date(java.util.Date v) {
+      value = v;
+    }
+
+    public java.util.Date getDate() {
+      return value;
+    }
+
+    @Override
+    public boolean isEmpty() {
+      return value == null;
+    }
+
+    @Override
+    public void write(Writer w) throws IOException {
+      final SimpleDateFormat fmt;
+      // Mon, 1 Jun 2009 10:49:44 -0700
+      fmt = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.US);
+      w.write(fmt.format(value));
+    }
+
+    @Override
+    public int hashCode() {
+      return Objects.hashCode(value);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+      return (o instanceof Date) && Objects.equals(value, ((Date) o).value);
+    }
+
+    @Override
+    public java.lang.String toString() {
+      return MoreObjects.toStringHelper(this).addValue(value).toString();
+    }
+  }
+
+  public static class AddressList extends EmailHeader {
+    private final List<Address> list = new ArrayList<>();
+
+    public AddressList() {}
+
+    public AddressList(Address addr) {
+      add(addr);
+    }
+
+    public List<Address> getAddressList() {
+      return Collections.unmodifiableList(list);
+    }
+
+    public void add(Address addr) {
+      list.add(addr);
+    }
+
+    public void remove(java.lang.String email) {
+      list.removeIf(address -> address.getEmail().equals(email));
+    }
+
+    @Override
+    public boolean isEmpty() {
+      return list.isEmpty();
+    }
+
+    @Override
+    public void write(Writer w) throws IOException {
+      int len = 8;
+      boolean firstAddress = true;
+      boolean needComma = false;
+      for (Address addr : list) {
+        java.lang.String s = addr.toHeaderString();
+        if (firstAddress) {
+          firstAddress = false;
+        } else if (72 < len + s.length()) {
+          w.write(",\r\n\t");
+          len = 8;
+          needComma = false;
+        }
+
+        if (needComma) {
+          w.write(", ");
+        }
+        w.write(s);
+        len += s.length();
+        needComma = true;
+      }
+    }
+
+    @Override
+    public int hashCode() {
+      return Objects.hashCode(list);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+      return (o instanceof AddressList) && Objects.equals(list, ((AddressList) o).list);
+    }
+
+    @Override
+    public java.lang.String toString() {
+      return MoreObjects.toStringHelper(this).addValue(list).toString();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/mail/HtmlParser.java b/java/com/google/gerrit/mail/HtmlParser.java
new file mode 100644
index 0000000..265c412
--- /dev/null
+++ b/java/com/google/gerrit/mail/HtmlParser.java
@@ -0,0 +1,172 @@
+// 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.
+
+package com.google.gerrit.mail;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterators;
+import com.google.common.collect.PeekingIterator;
+import com.google.gerrit.reviewdb.client.Comment;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+
+/** Provides functionality for parsing the HTML part of a {@link MailMessage}. */
+public class HtmlParser {
+
+  private static final ImmutableSet<String> MAIL_PROVIDER_EXTRAS =
+      ImmutableSet.of(
+          "gmail_extra", // "On 01/01/2017 User<user@gmail.com> wrote:"
+          "gmail_quote" // Used for quoting original content
+          );
+
+  private static final ImmutableSet<String> WHITELISTED_HTML_TAGS =
+      ImmutableSet.of(
+          "div", // Most user-typed comments are contained in a <div> tag
+          "a", // We allow links to be contained in a comment
+          "font" // Some email clients like nesting input in a new font tag
+          );
+
+  private HtmlParser() {}
+
+  /**
+   * Parses comments from html email.
+   *
+   * <p>This parser goes though all html elements in the email and checks for matching patterns. It
+   * keeps track of the last file and comments it encountered to know in which context a parsed
+   * comment belongs. It uses the href attributes of <a> tags to identify comments sent out by
+   * Gerrit as these are generally more reliable then the text captions.
+   *
+   * @param email the message as received from the email service
+   * @param comments a specific set of comments as sent out in the original notification email.
+   *     Comments are expected to be in the same order as they were sent out to in the email.
+   * @param changeUrl canonical change URL that points to the change on this Gerrit instance.
+   *     Example: https://go-review.googlesource.com/#/c/91570
+   * @return list of MailComments parsed from the html part of the email
+   */
+  public static List<MailComment> parse(
+      MailMessage email, Collection<Comment> comments, String changeUrl) {
+    // TODO(hiesel) Add support for Gmail Mobile
+    // TODO(hiesel) Add tests for other popular email clients
+
+    // This parser goes though all html elements in the email and checks for
+    // matching patterns. It keeps track of the last file and comments it
+    // encountered to know in which context a parsed comment belongs.
+    // It uses the href attributes of <a> tags to identify comments sent out by
+    // Gerrit as these are generally more reliable then the text captions.
+    List<MailComment> parsedComments = new ArrayList<>();
+    Document d = Jsoup.parse(email.htmlContent());
+    PeekingIterator<Comment> iter = Iterators.peekingIterator(comments.iterator());
+
+    String lastEncounteredFileName = null;
+    Comment lastEncounteredComment = null;
+    for (Element e : d.body().getAllElements()) {
+      String elementName = e.tagName();
+      boolean isInBlockQuote =
+          e.parents().stream()
+              .anyMatch(
+                  p ->
+                      p.tagName().equals("blockquote")
+                          || MAIL_PROVIDER_EXTRAS.contains(p.className()));
+
+      if (elementName.equals("a")) {
+        String href = e.attr("href");
+        // Check if there is still a next comment that could be contained in
+        // this <a> tag
+        if (!iter.hasNext()) {
+          continue;
+        }
+        Comment perspectiveComment = iter.peek();
+        if (href.equals(ParserUtil.filePath(changeUrl, perspectiveComment))) {
+          if (lastEncounteredFileName == null
+              || !lastEncounteredFileName.equals(perspectiveComment.key.filename)) {
+            // Not a file-level comment, but users could have typed a comment
+            // right after this file annotation to create a new file-level
+            // comment. If this file has a file-level comment, we have already
+            // set lastEncounteredComment to that file-level comment when we
+            // encountered the file link and should not reset it now.
+            lastEncounteredFileName = perspectiveComment.key.filename;
+            lastEncounteredComment = null;
+          } else if (perspectiveComment.lineNbr == 0) {
+            // This was originally a file-level comment
+            lastEncounteredComment = perspectiveComment;
+            iter.next();
+          }
+          continue;
+        } else if (ParserUtil.isCommentUrl(href, changeUrl, perspectiveComment)) {
+          // This is a regular inline comment
+          lastEncounteredComment = perspectiveComment;
+          iter.next();
+          continue;
+        }
+      }
+
+      if (isInBlockQuote) {
+        // There is no user-input in quoted text
+        continue;
+      }
+      if (!WHITELISTED_HTML_TAGS.contains(elementName)) {
+        // We only accept a set of whitelisted tags that can contain user input
+        continue;
+      }
+      if (elementName.equals("a") && e.attr("href").startsWith("mailto:")) {
+        // We don't accept mailto: links in general as they often appear in reply-to lines
+        // (User<user@gmail.com> wrote: ...)
+        continue;
+      }
+
+      // This is a comment typed by the user
+      // Replace non-breaking spaces and trim string
+      String content = e.ownText().replace('\u00a0', ' ').trim();
+      boolean isLink = elementName.equals("a");
+      if (!Strings.isNullOrEmpty(content)) {
+        if (lastEncounteredComment == null && lastEncounteredFileName == null) {
+          // Remove quotation line, email signature and
+          // "Sent from my xyz device"
+          content = ParserUtil.trimQuotation(content);
+          // TODO(hiesel) Add more sanitizer
+          if (!Strings.isNullOrEmpty(content)) {
+            ParserUtil.appendOrAddNewComment(
+                new MailComment(
+                    content, null, null, MailComment.CommentType.CHANGE_MESSAGE, isLink),
+                parsedComments);
+          }
+        } else if (lastEncounteredComment == null) {
+          ParserUtil.appendOrAddNewComment(
+              new MailComment(
+                  content,
+                  lastEncounteredFileName,
+                  null,
+                  MailComment.CommentType.FILE_COMMENT,
+                  isLink),
+              parsedComments);
+        } else {
+          ParserUtil.appendOrAddNewComment(
+              new MailComment(
+                  content,
+                  null,
+                  lastEncounteredComment,
+                  MailComment.CommentType.INLINE_COMMENT,
+                  isLink),
+              parsedComments);
+        }
+      }
+    }
+    return parsedComments;
+  }
+}
diff --git a/java/com/google/gerrit/mail/MailComment.java b/java/com/google/gerrit/mail/MailComment.java
new file mode 100644
index 0000000..fd8198c
--- /dev/null
+++ b/java/com/google/gerrit/mail/MailComment.java
@@ -0,0 +1,70 @@
+// 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.
+
+package com.google.gerrit.mail;
+
+import com.google.gerrit.reviewdb.client.Comment;
+import java.util.Objects;
+
+/** A comment parsed from inbound email */
+public class MailComment {
+  public enum CommentType {
+    CHANGE_MESSAGE,
+    FILE_COMMENT,
+    INLINE_COMMENT
+  }
+
+  CommentType type;
+  Comment inReplyTo;
+  String fileName;
+  String message;
+  boolean isLink;
+
+  public MailComment() {}
+
+  public MailComment(
+      String message, String fileName, Comment inReplyTo, CommentType type, boolean isLink) {
+    this.message = message;
+    this.fileName = fileName;
+    this.inReplyTo = inReplyTo;
+    this.type = type;
+    this.isLink = isLink;
+  }
+
+  public CommentType getType() {
+    return type;
+  }
+
+  public Comment getInReplyTo() {
+    return inReplyTo;
+  }
+
+  public String getFileName() {
+    return fileName;
+  }
+
+  public String getMessage() {
+    return message;
+  }
+
+  /**
+   * Checks if the provided comment concerns the same exact spot in the change. This is basically an
+   * equals method except that the message is not checked.
+   */
+  public boolean isSameCommentPath(MailComment c) {
+    return Objects.equals(fileName, c.fileName)
+        && Objects.equals(inReplyTo, c.inReplyTo)
+        && Objects.equals(type, c.type);
+  }
+}
diff --git a/java/com/google/gerrit/mail/MailHeader.java b/java/com/google/gerrit/mail/MailHeader.java
new file mode 100644
index 0000000..2f31a9c
--- /dev/null
+++ b/java/com/google/gerrit/mail/MailHeader.java
@@ -0,0 +1,71 @@
+// 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.
+
+package com.google.gerrit.mail;
+
+/** Variables used by emails to hold data */
+public enum MailHeader {
+  // Gerrit metadata holders
+  ASSIGNEE("Gerrit-Assignee"),
+  BRANCH("Gerrit-Branch"),
+  CC("Gerrit-CC"),
+  COMMENT_IN_REPLY_TO("Comment-In-Reply-To"),
+  COMMENT_DATE("Gerrit-Comment-Date"),
+  CHANGE_ID("Gerrit-Change-Id"),
+  CHANGE_NUMBER("Gerrit-Change-Number"),
+  CHANGE_URL("Gerrit-ChangeURL"),
+  COMMIT("Gerrit-Commit"),
+  HAS_COMMENTS("Gerrit-HasComments"),
+  HAS_LABELS("Gerrit-Has-Labels"),
+  MESSAGE_TYPE("Gerrit-MessageType"),
+  OWNER("Gerrit-Owner"),
+  PATCH_SET("Gerrit-PatchSet"),
+  PROJECT("Gerrit-Project"),
+  REVIEWER("Gerrit-Reviewer"),
+
+  // Commonly used Email headers
+  AUTO_SUBMITTED("Auto-Submitted"),
+  PRECEDENCE("Precedence"),
+  REFERENCES("References");
+
+  private final String name;
+  private final String fieldName;
+
+  MailHeader(String name) {
+    boolean customHeader = name.startsWith("Gerrit-");
+    this.name = name;
+
+    if (customHeader) {
+      this.fieldName = "X-" + name;
+    } else {
+      this.fieldName = name;
+    }
+  }
+
+  public String fieldWithDelimiter() {
+    return fieldName() + ": ";
+  }
+
+  public String withDelimiter() {
+    return name + ": ";
+  }
+
+  public String fieldName() {
+    return fieldName;
+  }
+
+  public String getName() {
+    return name;
+  }
+}
diff --git a/java/com/google/gerrit/mail/MailHeaderParser.java b/java/com/google/gerrit/mail/MailHeaderParser.java
new file mode 100644
index 0000000..8eb4d97
--- /dev/null
+++ b/java/com/google/gerrit/mail/MailHeaderParser.java
@@ -0,0 +1,108 @@
+// 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.
+
+package com.google.gerrit.mail;
+
+import com.google.common.base.Splitter;
+import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.primitives.Ints;
+import java.sql.Timestamp;
+import java.time.Instant;
+import java.time.format.DateTimeParseException;
+
+/** Parse metadata from inbound email */
+public class MailHeaderParser {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static MailMetadata parse(MailMessage m) {
+    MailMetadata metadata = new MailMetadata();
+    // Find author
+    metadata.author = m.from().getEmail();
+
+    // Check email headers for X-Gerrit-<Name>
+    for (String header : m.additionalHeaders()) {
+      if (header.startsWith(MailHeader.CHANGE_NUMBER.fieldWithDelimiter())) {
+        String num = header.substring(MailHeader.CHANGE_NUMBER.fieldWithDelimiter().length());
+        metadata.changeNumber = Ints.tryParse(num);
+      } else if (header.startsWith(MailHeader.PATCH_SET.fieldWithDelimiter())) {
+        String ps = header.substring(MailHeader.PATCH_SET.fieldWithDelimiter().length());
+        metadata.patchSet = Ints.tryParse(ps);
+      } else if (header.startsWith(MailHeader.COMMENT_DATE.fieldWithDelimiter())) {
+        String ts = header.substring(MailHeader.COMMENT_DATE.fieldWithDelimiter().length()).trim();
+        try {
+          metadata.timestamp =
+              Timestamp.from(MailProcessingUtil.rfcDateformatter.parse(ts, Instant::from));
+        } catch (DateTimeParseException e) {
+          logger.atSevere().withCause(e).log(
+              "Mail: Error while parsing timestamp from header of message %s", m.id());
+        }
+      } else if (header.startsWith(MailHeader.MESSAGE_TYPE.fieldWithDelimiter())) {
+        metadata.messageType =
+            header.substring(MailHeader.MESSAGE_TYPE.fieldWithDelimiter().length());
+      }
+    }
+    if (metadata.hasRequiredFields()) {
+      return metadata;
+    }
+
+    // If the required fields were not yet found, continue to parse the text
+    if (!Strings.isNullOrEmpty(m.textContent())) {
+      Iterable<String> lines = Splitter.on('\n').split(m.textContent().replace("\r\n", "\n"));
+      extractFooters(lines, metadata, m);
+      if (metadata.hasRequiredFields()) {
+        return metadata;
+      }
+    }
+
+    // If the required fields were not yet found, continue to parse the HTML
+    // HTML footer are contained inside a <div> tag
+    if (!Strings.isNullOrEmpty(m.htmlContent())) {
+      Iterable<String> lines = Splitter.on("</div>").split(m.htmlContent().replace("\r\n", "\n"));
+      extractFooters(lines, metadata, m);
+      if (metadata.hasRequiredFields()) {
+        return metadata;
+      }
+    }
+
+    return metadata;
+  }
+
+  private static void extractFooters(Iterable<String> lines, MailMetadata metadata, MailMessage m) {
+    for (String line : lines) {
+      if (metadata.changeNumber == null && line.contains(MailHeader.CHANGE_NUMBER.getName())) {
+        metadata.changeNumber =
+            Ints.tryParse(extractFooter(MailHeader.CHANGE_NUMBER.withDelimiter(), line));
+      } else if (metadata.patchSet == null && line.contains(MailHeader.PATCH_SET.getName())) {
+        metadata.patchSet =
+            Ints.tryParse(extractFooter(MailHeader.PATCH_SET.withDelimiter(), line));
+      } else if (metadata.timestamp == null && line.contains(MailHeader.COMMENT_DATE.getName())) {
+        String ts = extractFooter(MailHeader.COMMENT_DATE.withDelimiter(), line);
+        try {
+          metadata.timestamp =
+              Timestamp.from(MailProcessingUtil.rfcDateformatter.parse(ts, Instant::from));
+        } catch (DateTimeParseException e) {
+          logger.atSevere().withCause(e).log(
+              "Mail: Error while parsing timestamp from footer of message %s", m.id());
+        }
+      } else if (metadata.messageType == null && line.contains(MailHeader.MESSAGE_TYPE.getName())) {
+        metadata.messageType = extractFooter(MailHeader.MESSAGE_TYPE.withDelimiter(), line);
+      }
+    }
+  }
+
+  private static String extractFooter(String key, String line) {
+    return line.substring(line.indexOf(key) + key.length(), line.length()).trim();
+  }
+}
diff --git a/java/com/google/gerrit/mail/MailMessage.java b/java/com/google/gerrit/mail/MailMessage.java
new file mode 100644
index 0000000..bb83dfd
--- /dev/null
+++ b/java/com/google/gerrit/mail/MailMessage.java
@@ -0,0 +1,107 @@
+// 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.
+
+package com.google.gerrit.mail;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.common.Nullable;
+import java.time.Instant;
+
+/**
+ * A simplified representation of an RFC 2045-2047 mime email message used for representing received
+ * emails inside Gerrit. It is populated by the MailParser after MailReceiver has received a
+ * message. Transformations done by the parser include stitching mime parts together, transforming
+ * all content to UTF-16 and removing attachments.
+ *
+ * <p>A valid {@link MailMessage} contains at least the following fields: id, from, to, subject and
+ * dateReceived.
+ */
+@AutoValue
+public abstract class MailMessage {
+  // Unique Identifier
+  public abstract String id();
+  // Envelop Information
+  public abstract Address from();
+
+  public abstract ImmutableList<Address> to();
+
+  public abstract ImmutableList<Address> cc();
+  // Metadata
+  public abstract Instant dateReceived();
+
+  public abstract ImmutableList<String> additionalHeaders();
+  // Content
+  public abstract String subject();
+
+  @Nullable
+  public abstract String textContent();
+
+  @Nullable
+  public abstract String htmlContent();
+  // Raw content as received over the wire
+  @Nullable
+  public abstract ImmutableList<Integer> rawContent();
+
+  @Nullable
+  public abstract String rawContentUTF();
+
+  public static Builder builder() {
+    return new AutoValue_MailMessage.Builder();
+  }
+
+  public abstract Builder toBuilder();
+
+  @AutoValue.Builder
+  public abstract static class Builder {
+    public abstract Builder id(String val);
+
+    public abstract Builder from(Address val);
+
+    public abstract ImmutableList.Builder<Address> toBuilder();
+
+    public Builder addTo(Address val) {
+      toBuilder().add(val);
+      return this;
+    }
+
+    public abstract ImmutableList.Builder<Address> ccBuilder();
+
+    public Builder addCc(Address val) {
+      ccBuilder().add(val);
+      return this;
+    }
+
+    public abstract Builder dateReceived(Instant instant);
+
+    public abstract ImmutableList.Builder<String> additionalHeadersBuilder();
+
+    public Builder addAdditionalHeader(String val) {
+      additionalHeadersBuilder().add(val);
+      return this;
+    }
+
+    public abstract Builder subject(String val);
+
+    public abstract Builder textContent(String val);
+
+    public abstract Builder htmlContent(String val);
+
+    public abstract Builder rawContent(ImmutableList<Integer> val);
+
+    public abstract Builder rawContentUTF(String val);
+
+    public abstract MailMessage build();
+  }
+}
diff --git a/java/com/google/gerrit/mail/MailMetadata.java b/java/com/google/gerrit/mail/MailMetadata.java
new file mode 100644
index 0000000..a311461
--- /dev/null
+++ b/java/com/google/gerrit/mail/MailMetadata.java
@@ -0,0 +1,46 @@
+// 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.
+
+package com.google.gerrit.mail;
+
+import com.google.common.base.MoreObjects;
+import java.sql.Timestamp;
+
+/** MailMetadata represents metadata parsed from inbound email. */
+public class MailMetadata {
+  public Integer changeNumber;
+  public Integer patchSet;
+  public String author; // Author of the email
+  public Timestamp timestamp;
+  public String messageType; // we expect comment here
+
+  public boolean hasRequiredFields() {
+    return changeNumber != null
+        && patchSet != null
+        && author != null
+        && timestamp != null
+        && messageType != null;
+  }
+
+  @Override
+  public String toString() {
+    return MoreObjects.toStringHelper(this)
+        .add("Change-Number", changeNumber)
+        .add("Patch-Set", patchSet)
+        .add("Author", author)
+        .add("Timestamp", timestamp)
+        .add("Message-Type", messageType)
+        .toString();
+  }
+}
diff --git a/java/com/google/gerrit/mail/MailParsingException.java b/java/com/google/gerrit/mail/MailParsingException.java
new file mode 100644
index 0000000..7e85a27
--- /dev/null
+++ b/java/com/google/gerrit/mail/MailParsingException.java
@@ -0,0 +1,28 @@
+// 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.
+
+package com.google.gerrit.mail;
+
+/** An {@link Exception} indicating that an email could not be parsed. */
+public class MailParsingException extends Exception {
+  private static final long serialVersionUID = 1L;
+
+  public MailParsingException(String msg) {
+    super(msg);
+  }
+
+  public MailParsingException(String msg, Throwable cause) {
+    super(msg, cause);
+  }
+}
diff --git a/java/com/google/gerrit/mail/MailProcessingUtil.java b/java/com/google/gerrit/mail/MailProcessingUtil.java
new file mode 100644
index 0000000..b63189a
--- /dev/null
+++ b/java/com/google/gerrit/mail/MailProcessingUtil.java
@@ -0,0 +1,23 @@
+// 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.
+
+package com.google.gerrit.mail;
+
+import java.time.format.DateTimeFormatter;
+
+public class MailProcessingUtil {
+
+  public static DateTimeFormatter rfcDateformatter =
+      DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss ZZZ");
+}
diff --git a/java/com/google/gerrit/mail/ParserUtil.java b/java/com/google/gerrit/mail/ParserUtil.java
new file mode 100644
index 0000000..6a27ac4
--- /dev/null
+++ b/java/com/google/gerrit/mail/ParserUtil.java
@@ -0,0 +1,134 @@
+// 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.
+
+package com.google.gerrit.mail;
+
+import com.google.common.base.Splitter;
+import com.google.common.collect.Iterables;
+import com.google.gerrit.reviewdb.client.Comment;
+import java.util.List;
+import java.util.StringJoiner;
+import java.util.regex.Pattern;
+
+public class ParserUtil {
+  private static final Pattern SIMPLE_EMAIL_PATTERN =
+      Pattern.compile(
+          "[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+"
+              + "(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})");
+
+  private ParserUtil() {}
+
+  /**
+   * Trims the quotation that email clients add Example: On Sun, Nov 20, 2016 at 10:33 PM,
+   * <gerrit@gerritcodereview.com> wrote:
+   *
+   * @param comment Comment parsed from an email.
+   * @return Trimmed comment.
+   */
+  public static String trimQuotation(String comment) {
+    StringJoiner j = new StringJoiner("\n");
+    List<String> lines = Splitter.on('\n').splitToList(comment);
+    for (int i = 0; i < lines.size() - 2; i++) {
+      j.add(lines.get(i));
+    }
+
+    // Check if the last line contains the full quotation pattern (date + email)
+    String lastLine = lines.get(lines.size() - 1);
+    if (containsQuotationPattern(lastLine)) {
+      if (lines.size() > 1) {
+        j.add(lines.get(lines.size() - 2));
+      }
+      return j.toString().trim();
+    }
+
+    // Check if the second last line + the last line contain the full quotation pattern. This is
+    // necessary, as the quotation line can be split across the last two lines if it gets too long.
+    if (lines.size() > 1) {
+      String lastLines = lines.get(lines.size() - 2) + lastLine;
+      if (containsQuotationPattern(lastLines)) {
+        return j.toString().trim();
+      }
+    }
+
+    // Add the last two lines
+    if (lines.size() > 1) {
+      j.add(lines.get(lines.size() - 2));
+    }
+    j.add(lines.get(lines.size() - 1));
+
+    return j.toString().trim();
+  }
+
+  /** Check if string is an inline comment url on a patch set or the base */
+  public static boolean isCommentUrl(String str, String changeUrl, Comment comment) {
+    int lineNbr = comment.range == null ? comment.lineNbr : comment.range.startLine;
+    return str.equals(filePath(changeUrl, comment) + "@" + lineNbr)
+        || str.equals(filePath(changeUrl, comment) + "@a" + lineNbr);
+  }
+
+  /** Generate the fully qualified filepath */
+  public static String filePath(String changeUrl, Comment comment) {
+    return changeUrl + "/" + comment.key.patchSetId + "/" + comment.key.filename;
+  }
+
+  /**
+   * When parsing mail content, we need to append comments prematurely since we are parsing
+   * block-by-block and never know what comes next. This can result in a comment being parsed as two
+   * comments when it spans multiple blocks. This method takes care of merging those blocks or
+   * adding a new comment to the list of appropriate.
+   */
+  public static void appendOrAddNewComment(MailComment comment, List<MailComment> comments) {
+    if (comments.isEmpty()) {
+      comments.add(comment);
+      return;
+    }
+    MailComment lastComment = Iterables.getLast(comments);
+
+    if (comment.isSameCommentPath(lastComment)) {
+      // Merge the two comments. Links should just be appended, while regular text that came from
+      // different <div> elements should be separated by a paragraph.
+      lastComment.message += (comment.isLink ? " " : "\n\n") + comment.message;
+      return;
+    }
+
+    comments.add(comment);
+  }
+
+  private static boolean containsQuotationPattern(String s) {
+    // Identifying the quotation line is hard, as it can be in any language.
+    // We identify this line by it's characteristics: It usually contains a
+    // valid email address, some digits for the date in groups of 1-4 in a row
+    // as well as some characters.
+
+    // Count occurrences of digit groups
+    int numConsecutiveDigits = 0;
+    int maxConsecutiveDigits = 0;
+    int numDigitGroups = 0;
+    for (char c : s.toCharArray()) {
+      if (c >= '0' && c <= '9') {
+        numConsecutiveDigits++;
+      } else if (numConsecutiveDigits > 0) {
+        maxConsecutiveDigits = Integer.max(maxConsecutiveDigits, numConsecutiveDigits);
+        numConsecutiveDigits = 0;
+        numDigitGroups++;
+      }
+    }
+    if (numDigitGroups < 4 || maxConsecutiveDigits > 4) {
+      return false;
+    }
+
+    // Check if the string contains an email address
+    return SIMPLE_EMAIL_PATTERN.matcher(s).find();
+  }
+}
diff --git a/java/com/google/gerrit/mail/RawMailParser.java b/java/com/google/gerrit/mail/RawMailParser.java
new file mode 100644
index 0000000..b7e2030
--- /dev/null
+++ b/java/com/google/gerrit/mail/RawMailParser.java
@@ -0,0 +1,174 @@
+// 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.
+
+package com.google.gerrit.mail;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.io.CharStreams;
+import com.google.common.primitives.Ints;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import org.apache.james.mime4j.MimeException;
+import org.apache.james.mime4j.dom.Entity;
+import org.apache.james.mime4j.dom.Message;
+import org.apache.james.mime4j.dom.MessageBuilder;
+import org.apache.james.mime4j.dom.Multipart;
+import org.apache.james.mime4j.dom.TextBody;
+import org.apache.james.mime4j.dom.address.Mailbox;
+import org.apache.james.mime4j.message.DefaultMessageBuilder;
+
+/** Parses raw email content received through POP3 or IMAP into an internal {@link MailMessage}. */
+public class RawMailParser {
+  private static final ImmutableSet<String> MAIN_HEADERS =
+      ImmutableSet.of("to", "from", "cc", "date", "message-id", "subject", "content-type");
+
+  private RawMailParser() {}
+
+  /**
+   * Parses a MailMessage from a string.
+   *
+   * @param raw {@link String} payload as received over the wire
+   * @return parsed {@link MailMessage}
+   * @throws MailParsingException in case parsing fails
+   */
+  public static MailMessage parse(String raw) throws MailParsingException {
+    MailMessage.Builder messageBuilder = MailMessage.builder();
+    messageBuilder.rawContentUTF(raw);
+    Message mimeMessage;
+    try {
+      MessageBuilder builder = new DefaultMessageBuilder();
+      mimeMessage = builder.parseMessage(new ByteArrayInputStream(raw.getBytes(UTF_8)));
+    } catch (IOException | MimeException e) {
+      throw new MailParsingException("Can't parse email", e);
+    }
+    // Add general headers
+    if (mimeMessage.getMessageId() != null) {
+      messageBuilder.id(mimeMessage.getMessageId());
+    }
+    if (mimeMessage.getSubject() != null) {
+      messageBuilder.subject(mimeMessage.getSubject());
+    }
+    if (mimeMessage.getDate() != null) {
+      messageBuilder.dateReceived(mimeMessage.getDate().toInstant());
+    }
+
+    // Add From, To and Cc
+    if (mimeMessage.getFrom() != null && mimeMessage.getFrom().size() > 0) {
+      Mailbox from = mimeMessage.getFrom().get(0);
+      messageBuilder.from(new Address(from.getName(), from.getAddress()));
+    }
+    if (mimeMessage.getTo() != null) {
+      for (Mailbox m : mimeMessage.getTo().flatten()) {
+        messageBuilder.addTo(new Address(m.getName(), m.getAddress()));
+      }
+    }
+    if (mimeMessage.getCc() != null) {
+      for (Mailbox m : mimeMessage.getCc().flatten()) {
+        messageBuilder.addCc(new Address(m.getName(), m.getAddress()));
+      }
+    }
+
+    // Add additional headers
+    mimeMessage.getHeader().getFields().stream()
+        .filter(f -> !MAIN_HEADERS.contains(f.getName().toLowerCase()))
+        .forEach(f -> messageBuilder.addAdditionalHeader(f.getName() + ": " + f.getBody()));
+
+    // Add text and html body parts
+    StringBuilder textBuilder = new StringBuilder();
+    StringBuilder htmlBuilder = new StringBuilder();
+    try {
+      handleMimePart(mimeMessage, textBuilder, htmlBuilder);
+    } catch (IOException e) {
+      throw new MailParsingException("Can't parse email", e);
+    }
+    messageBuilder.textContent(Strings.emptyToNull(textBuilder.toString()));
+    messageBuilder.htmlContent(Strings.emptyToNull(htmlBuilder.toString()));
+
+    try {
+      // build() will only succeed if all required attributes were set. We wrap
+      // the IllegalStateException in a MailParsingException indicating that
+      // required attributes are missing, so that the caller doesn't fall over.
+      return messageBuilder.build();
+    } catch (IllegalStateException e) {
+      throw new MailParsingException("Missing required attributes after email was parsed", e);
+    }
+  }
+
+  /**
+   * Parses a MailMessage from an array of characters. Note that the character array is int-typed.
+   * This method is only used by POP3, which specifies that all transferred characters are US-ASCII
+   * (RFC 6856). When reading the input in Java, io.Reader yields ints. These can be safely
+   * converted to chars as all US-ASCII characters fit in a char. If emails contain non-ASCII
+   * characters, such as UTF runes, these will be encoded in ASCII using either Base64 or
+   * quoted-printable encoding.
+   *
+   * @param chars Array as received over the wire
+   * @return Parsed {@link MailMessage}
+   * @throws MailParsingException in case parsing fails
+   */
+  public static MailMessage parse(int[] chars) throws MailParsingException {
+    StringBuilder b = new StringBuilder(chars.length);
+    for (int c : chars) {
+      b.append((char) c);
+    }
+
+    MailMessage.Builder messageBuilder = parse(b.toString()).toBuilder();
+    messageBuilder.rawContent(ImmutableList.copyOf(Ints.asList(chars)));
+    return messageBuilder.build();
+  }
+
+  /**
+   * Traverses a mime tree and parses out text and html parts. All other parts will be dropped.
+   *
+   * @param part {@code MimePart} to parse
+   * @param textBuilder {@link StringBuilder} to append all plaintext parts
+   * @param htmlBuilder {@link StringBuilder} to append all html parts
+   * @throws IOException in case of a failure while transforming the input to a {@link String}
+   */
+  private static void handleMimePart(
+      Entity part, StringBuilder textBuilder, StringBuilder htmlBuilder) throws IOException {
+    if (isPlainOrHtml(part.getMimeType()) && !isAttachment(part.getDispositionType())) {
+      TextBody tb = (TextBody) part.getBody();
+      String result =
+          CharStreams.toString(new InputStreamReader(tb.getInputStream(), tb.getMimeCharset()));
+      if (part.getMimeType().equals("text/plain")) {
+        textBuilder.append(result);
+      } else if (part.getMimeType().equals("text/html")) {
+        htmlBuilder.append(result);
+      }
+    } else if (isMultipart(part.getMimeType())) {
+      Multipart multipart = (Multipart) part.getBody();
+      for (Entity e : multipart.getBodyParts()) {
+        handleMimePart(e, textBuilder, htmlBuilder);
+      }
+    }
+  }
+
+  private static boolean isPlainOrHtml(String mimeType) {
+    return (mimeType.equals("text/plain") || mimeType.equals("text/html"));
+  }
+
+  private static boolean isMultipart(String mimeType) {
+    return mimeType.startsWith("multipart/");
+  }
+
+  private static boolean isAttachment(String dispositionType) {
+    return dispositionType != null && dispositionType.equals("attachment");
+  }
+}
diff --git a/java/com/google/gerrit/mail/TextParser.java b/java/com/google/gerrit/mail/TextParser.java
new file mode 100644
index 0000000..1a63599
--- /dev/null
+++ b/java/com/google/gerrit/mail/TextParser.java
@@ -0,0 +1,147 @@
+// 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.
+
+package com.google.gerrit.mail;
+
+import com.google.common.base.Splitter;
+import com.google.common.base.Strings;
+import com.google.common.collect.Iterators;
+import com.google.common.collect.PeekingIterator;
+import com.google.gerrit.reviewdb.client.Comment;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+/** Provides parsing functionality for plaintext email. */
+public class TextParser {
+  private TextParser() {}
+
+  /**
+   * Parses comments from plaintext email.
+   *
+   * @param email @param email the message as received from the email service
+   * @param comments list of {@link Comment}s previously persisted on the change that caused the
+   *     original notification email to be sent out. Ordering must be the same as in the outbound
+   *     email
+   * @param changeUrl canonical change url that points to the change on this Gerrit instance.
+   *     Example: https://go-review.googlesource.com/#/c/91570
+   * @return list of MailComments parsed from the plaintext part of the email
+   */
+  public static List<MailComment> parse(
+      MailMessage email, Collection<Comment> comments, String changeUrl) {
+    String body = email.textContent();
+    // Replace CR-LF by \n
+    body = body.replace("\r\n", "\n");
+
+    List<MailComment> parsedComments = new ArrayList<>();
+
+    // Some email clients (like GMail) use >> for enquoting text when there are
+    // inline comments that the users typed. These will then be enquoted by a
+    // single >. We sanitize this by unifying it into >. Inline comments typed
+    // by the user will not be enquoted.
+    //
+    // Example:
+    // Some comment
+    // >> Quoted Text
+    // >> Quoted Text
+    // > A comment typed in the email directly
+    String singleQuotePattern = "\n> ";
+    String doubleQuotePattern = "\n>> ";
+    if (countOccurrences(body, doubleQuotePattern) > countOccurrences(body, singleQuotePattern)) {
+      body = body.replace(doubleQuotePattern, singleQuotePattern);
+    }
+
+    PeekingIterator<Comment> iter = Iterators.peekingIterator(comments.iterator());
+
+    MailComment currentComment = null;
+    String lastEncounteredFileName = null;
+    Comment lastEncounteredComment = null;
+    for (String line : Splitter.on('\n').split(body)) {
+      if (line.equals(">")) {
+        // Skip empty lines
+        continue;
+      }
+      if (line.startsWith("> ")) {
+        line = line.substring("> ".length()).trim();
+        // This is not a comment, try to advance the file/comment pointers and
+        // add previous comment to list if applicable
+        if (currentComment != null) {
+          if (currentComment.type == MailComment.CommentType.CHANGE_MESSAGE) {
+            currentComment.message = ParserUtil.trimQuotation(currentComment.message);
+          }
+          if (!Strings.isNullOrEmpty(currentComment.message)) {
+            ParserUtil.appendOrAddNewComment(currentComment, parsedComments);
+          }
+          currentComment = null;
+        }
+
+        if (!iter.hasNext()) {
+          continue;
+        }
+        Comment perspectiveComment = iter.peek();
+        if (line.equals(ParserUtil.filePath(changeUrl, perspectiveComment))) {
+          if (lastEncounteredFileName == null
+              || !lastEncounteredFileName.equals(perspectiveComment.key.filename)) {
+            // This is the annotation of a file
+            lastEncounteredFileName = perspectiveComment.key.filename;
+            lastEncounteredComment = null;
+          } else if (perspectiveComment.lineNbr == 0) {
+            // This was originally a file-level comment
+            lastEncounteredComment = perspectiveComment;
+            iter.next();
+          }
+        } else if (ParserUtil.isCommentUrl(line, changeUrl, perspectiveComment)) {
+          lastEncounteredComment = perspectiveComment;
+          iter.next();
+        }
+      } else {
+        // This is a comment. Try to append to previous comment if applicable or
+        // create a new comment.
+        if (currentComment == null) {
+          // Start new comment
+          currentComment = new MailComment();
+          currentComment.message = line;
+          if (lastEncounteredComment == null) {
+            if (lastEncounteredFileName == null) {
+              // Change message
+              currentComment.type = MailComment.CommentType.CHANGE_MESSAGE;
+            } else {
+              // File comment not sent in reply to another comment
+              currentComment.type = MailComment.CommentType.FILE_COMMENT;
+              currentComment.fileName = lastEncounteredFileName;
+            }
+          } else {
+            // Comment sent in reply to another comment
+            currentComment.inReplyTo = lastEncounteredComment;
+            currentComment.type = MailComment.CommentType.INLINE_COMMENT;
+          }
+        } else {
+          // Attach to previous comment
+          currentComment.message += "\n" + line;
+        }
+      }
+    }
+    // There is no need to attach the currentComment after this loop as all
+    // emails have footers and other enquoted text after the last comment
+    // appeared and the last comment will have already been added to the list
+    // at this point.
+
+    return parsedComments;
+  }
+
+  /** Counts the occurrences of pattern in s */
+  private static int countOccurrences(String s, String pattern) {
+    return (s.length() - s.replace(pattern, "").length()) / pattern.length();
+  }
+}
diff --git a/java/com/google/gerrit/metrics/BUILD b/java/com/google/gerrit/metrics/BUILD
new file mode 100644
index 0000000..dda2c39
--- /dev/null
+++ b/java/com/google/gerrit/metrics/BUILD
@@ -0,0 +1,15 @@
+java_library(
+    name = "metrics",
+    srcs = glob(["**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/lifecycle",
+        "//java/org/eclipse/jgit:server",
+        "//lib:guava",
+        "//lib/flogger:api",
+        "//lib/guice",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+    ],
+)
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/CallbackMetric.java b/java/com/google/gerrit/metrics/CallbackMetric.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/metrics/CallbackMetric.java
rename to java/com/google/gerrit/metrics/CallbackMetric.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/CallbackMetric0.java b/java/com/google/gerrit/metrics/CallbackMetric0.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/metrics/CallbackMetric0.java
rename to java/com/google/gerrit/metrics/CallbackMetric0.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/CallbackMetric1.java b/java/com/google/gerrit/metrics/CallbackMetric1.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/metrics/CallbackMetric1.java
rename to java/com/google/gerrit/metrics/CallbackMetric1.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/Counter0.java b/java/com/google/gerrit/metrics/Counter0.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/metrics/Counter0.java
rename to java/com/google/gerrit/metrics/Counter0.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/Counter1.java b/java/com/google/gerrit/metrics/Counter1.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/metrics/Counter1.java
rename to java/com/google/gerrit/metrics/Counter1.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/Counter2.java b/java/com/google/gerrit/metrics/Counter2.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/metrics/Counter2.java
rename to java/com/google/gerrit/metrics/Counter2.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/Counter3.java b/java/com/google/gerrit/metrics/Counter3.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/metrics/Counter3.java
rename to java/com/google/gerrit/metrics/Counter3.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/Description.java b/java/com/google/gerrit/metrics/Description.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/metrics/Description.java
rename to java/com/google/gerrit/metrics/Description.java
diff --git a/java/com/google/gerrit/metrics/DisabledMetricMaker.java b/java/com/google/gerrit/metrics/DisabledMetricMaker.java
new file mode 100644
index 0000000..bc88a60
--- /dev/null
+++ b/java/com/google/gerrit/metrics/DisabledMetricMaker.java
@@ -0,0 +1,195 @@
+// Copyright (C) 2015 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.google.gerrit.metrics;
+
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+/** Exports no metrics, useful for running batch programs. */
+public class DisabledMetricMaker extends MetricMaker {
+  @Override
+  public Counter0 newCounter(String name, Description desc) {
+    return new Counter0() {
+      @Override
+      public void incrementBy(long value) {}
+
+      @Override
+      public void remove() {}
+    };
+  }
+
+  @Override
+  public <F1> Counter1<F1> newCounter(String name, Description desc, Field<F1> field1) {
+    return new Counter1<F1>() {
+      @Override
+      public void incrementBy(F1 field1, long value) {}
+
+      @Override
+      public void remove() {}
+    };
+  }
+
+  @Override
+  public <F1, F2> Counter2<F1, F2> newCounter(
+      String name, Description desc, Field<F1> field1, Field<F2> field2) {
+    return new Counter2<F1, F2>() {
+      @Override
+      public void incrementBy(F1 field1, F2 field2, long value) {}
+
+      @Override
+      public void remove() {}
+    };
+  }
+
+  @Override
+  public <F1, F2, F3> Counter3<F1, F2, F3> newCounter(
+      String name, Description desc, Field<F1> field1, Field<F2> field2, Field<F3> field3) {
+    return new Counter3<F1, F2, F3>() {
+      @Override
+      public void incrementBy(F1 field1, F2 field2, F3 field3, long value) {}
+
+      @Override
+      public void remove() {}
+    };
+  }
+
+  @Override
+  public Timer0 newTimer(String name, Description desc) {
+    return new Timer0(name) {
+      @Override
+      protected void doRecord(long value, TimeUnit unit) {}
+
+      @Override
+      public void remove() {}
+    };
+  }
+
+  @Override
+  public <F1> Timer1<F1> newTimer(String name, Description desc, Field<F1> field1) {
+    return new Timer1<F1>(name) {
+      @Override
+      protected void doRecord(F1 field1, long value, TimeUnit unit) {}
+
+      @Override
+      public void remove() {}
+    };
+  }
+
+  @Override
+  public <F1, F2> Timer2<F1, F2> newTimer(
+      String name, Description desc, Field<F1> field1, Field<F2> field2) {
+    return new Timer2<F1, F2>(name) {
+      @Override
+      protected void doRecord(F1 field1, F2 field2, long value, TimeUnit unit) {}
+
+      @Override
+      public void remove() {}
+    };
+  }
+
+  @Override
+  public <F1, F2, F3> Timer3<F1, F2, F3> newTimer(
+      String name, Description desc, Field<F1> field1, Field<F2> field2, Field<F3> field3) {
+    return new Timer3<F1, F2, F3>(name) {
+      @Override
+      protected void doRecord(F1 field1, F2 field2, F3 field3, long value, TimeUnit unit) {}
+
+      @Override
+      public void remove() {}
+    };
+  }
+
+  @Override
+  public Histogram0 newHistogram(String name, Description desc) {
+    return new Histogram0() {
+      @Override
+      public void record(long value) {}
+
+      @Override
+      public void remove() {}
+    };
+  }
+
+  @Override
+  public <F1> Histogram1<F1> newHistogram(String name, Description desc, Field<F1> field1) {
+    return new Histogram1<F1>() {
+      @Override
+      public void record(F1 field1, long value) {}
+
+      @Override
+      public void remove() {}
+    };
+  }
+
+  @Override
+  public <F1, F2> Histogram2<F1, F2> newHistogram(
+      String name, Description desc, Field<F1> field1, Field<F2> field2) {
+    return new Histogram2<F1, F2>() {
+      @Override
+      public void record(F1 field1, F2 field2, long value) {}
+
+      @Override
+      public void remove() {}
+    };
+  }
+
+  @Override
+  public <F1, F2, F3> Histogram3<F1, F2, F3> newHistogram(
+      String name, Description desc, Field<F1> field1, Field<F2> field2, Field<F3> field3) {
+    return new Histogram3<F1, F2, F3>() {
+      @Override
+      public void record(F1 field1, F2 field2, F3 field3, long value) {}
+
+      @Override
+      public void remove() {}
+    };
+  }
+
+  @Override
+  public <V> CallbackMetric0<V> newCallbackMetric(
+      String name, Class<V> valueClass, Description desc) {
+    return new CallbackMetric0<V>() {
+      @Override
+      public void set(V value) {}
+
+      @Override
+      public void remove() {}
+    };
+  }
+
+  @Override
+  public <F1, V> CallbackMetric1<F1, V> newCallbackMetric(
+      String name, Class<V> valueClass, Description desc, Field<F1> field1) {
+    return new CallbackMetric1<F1, V>() {
+      @Override
+      public void set(F1 field1, V value) {}
+
+      @Override
+      public void forceCreate(F1 field1) {}
+
+      @Override
+      public void remove() {}
+    };
+  }
+
+  @Override
+  public RegistrationHandle newTrigger(Set<CallbackMetric<?>> metrics, Runnable trigger) {
+    return new RegistrationHandle() {
+      @Override
+      public void remove() {}
+    };
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/Field.java b/java/com/google/gerrit/metrics/Field.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/metrics/Field.java
rename to java/com/google/gerrit/metrics/Field.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/Histogram0.java b/java/com/google/gerrit/metrics/Histogram0.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/metrics/Histogram0.java
rename to java/com/google/gerrit/metrics/Histogram0.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/Histogram1.java b/java/com/google/gerrit/metrics/Histogram1.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/metrics/Histogram1.java
rename to java/com/google/gerrit/metrics/Histogram1.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/Histogram2.java b/java/com/google/gerrit/metrics/Histogram2.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/metrics/Histogram2.java
rename to java/com/google/gerrit/metrics/Histogram2.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/Histogram3.java b/java/com/google/gerrit/metrics/Histogram3.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/metrics/Histogram3.java
rename to java/com/google/gerrit/metrics/Histogram3.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/MetricMaker.java b/java/com/google/gerrit/metrics/MetricMaker.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/metrics/MetricMaker.java
rename to java/com/google/gerrit/metrics/MetricMaker.java
diff --git a/java/com/google/gerrit/metrics/Timer0.java b/java/com/google/gerrit/metrics/Timer0.java
new file mode 100644
index 0000000..2134488
--- /dev/null
+++ b/java/com/google/gerrit/metrics/Timer0.java
@@ -0,0 +1,82 @@
+// Copyright (C) 2015 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.google.gerrit.metrics;
+
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Records elapsed time for an operation or span.
+ *
+ * <p>Typical usage in a try-with-resources block:
+ *
+ * <pre>
+ * try (Timer0.Context ctx = timer.start()) {
+ * }
+ * </pre>
+ */
+public abstract class Timer0 implements RegistrationHandle {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static class Context extends TimerContext {
+    private final Timer0 timer;
+
+    Context(Timer0 timer) {
+      this.timer = timer;
+    }
+
+    @Override
+    public void record(long elapsed) {
+      timer.record(elapsed, NANOSECONDS);
+    }
+  }
+
+  protected final String name;
+
+  public Timer0(String name) {
+    this.name = name;
+  }
+
+  /**
+   * Begin a timer for the current block, value will be recorded when closed.
+   *
+   * @return timer context
+   */
+  public Context start() {
+    return new Context(this);
+  }
+
+  /**
+   * Record a value in the distribution.
+   *
+   * @param value value to record
+   * @param unit time unit of the value
+   */
+  public final void record(long value, TimeUnit unit) {
+    logger.atFinest().log("%s took %dms", name, unit.toMillis(value));
+    doRecord(value, unit);
+  }
+
+  /**
+   * Record a value in the distribution.
+   *
+   * @param value value to record
+   * @param unit time unit of the value
+   */
+  protected abstract void doRecord(long value, TimeUnit unit);
+}
diff --git a/java/com/google/gerrit/metrics/Timer1.java b/java/com/google/gerrit/metrics/Timer1.java
new file mode 100644
index 0000000..16c151e
--- /dev/null
+++ b/java/com/google/gerrit/metrics/Timer1.java
@@ -0,0 +1,90 @@
+// Copyright (C) 2015 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.google.gerrit.metrics;
+
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Records elapsed time for an operation or span.
+ *
+ * <p>Typical usage in a try-with-resources block:
+ *
+ * <pre>
+ * try (Timer1.Context ctx = timer.start(field)) {
+ * }
+ * </pre>
+ *
+ * @param <F1> type of the field.
+ */
+public abstract class Timer1<F1> implements RegistrationHandle {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static class Context extends TimerContext {
+    private final Timer1<Object> timer;
+    private final Object field1;
+
+    @SuppressWarnings("unchecked")
+    <F1> Context(Timer1<F1> timer, F1 field1) {
+      this.timer = (Timer1<Object>) timer;
+      this.field1 = field1;
+    }
+
+    @Override
+    public void record(long elapsed) {
+      timer.record(field1, elapsed, NANOSECONDS);
+    }
+  }
+
+  protected final String name;
+
+  public Timer1(String name) {
+    this.name = name;
+  }
+
+  /**
+   * Begin a timer for the current block, value will be recorded when closed.
+   *
+   * @param field1 bucket to record the timer
+   * @return timer context
+   */
+  public Context start(F1 field1) {
+    return new Context(this, field1);
+  }
+
+  /**
+   * Record a value in the distribution.
+   *
+   * @param field1 bucket to record the timer
+   * @param value value to record
+   * @param unit time unit of the value
+   */
+  public final void record(F1 field1, long value, TimeUnit unit) {
+    logger.atFinest().log("%s (%s) took %dms", name, field1, unit.toMillis(value));
+    doRecord(field1, value, unit);
+  }
+
+  /**
+   * Record a value in the distribution.
+   *
+   * @param field1 bucket to record the timer
+   * @param value value to record
+   * @param unit time unit of the value
+   */
+  protected abstract void doRecord(F1 field1, long value, TimeUnit unit);
+}
diff --git a/java/com/google/gerrit/metrics/Timer2.java b/java/com/google/gerrit/metrics/Timer2.java
new file mode 100644
index 0000000..bf19448
--- /dev/null
+++ b/java/com/google/gerrit/metrics/Timer2.java
@@ -0,0 +1,96 @@
+// Copyright (C) 2015 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.google.gerrit.metrics;
+
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Records elapsed time for an operation or span.
+ *
+ * <p>Typical usage in a try-with-resources block:
+ *
+ * <pre>
+ * try (Timer2.Context ctx = timer.start(field)) {
+ * }
+ * </pre>
+ *
+ * @param <F1> type of the field.
+ * @param <F2> type of the field.
+ */
+public abstract class Timer2<F1, F2> implements RegistrationHandle {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static class Context extends TimerContext {
+    private final Timer2<Object, Object> timer;
+    private final Object field1;
+    private final Object field2;
+
+    @SuppressWarnings("unchecked")
+    <F1, F2> Context(Timer2<F1, F2> timer, F1 field1, F2 field2) {
+      this.timer = (Timer2<Object, Object>) timer;
+      this.field1 = field1;
+      this.field2 = field2;
+    }
+
+    @Override
+    public void record(long elapsed) {
+      timer.record(field1, field2, elapsed, NANOSECONDS);
+    }
+  }
+
+  protected final String name;
+
+  public Timer2(String name) {
+    this.name = name;
+  }
+
+  /**
+   * Begin a timer for the current block, value will be recorded when closed.
+   *
+   * @param field1 bucket to record the timer
+   * @param field2 bucket to record the timer
+   * @return timer context
+   */
+  public Context start(F1 field1, F2 field2) {
+    return new Context(this, field1, field2);
+  }
+
+  /**
+   * Record a value in the distribution.
+   *
+   * @param field1 bucket to record the timer
+   * @param field2 bucket to record the timer
+   * @param value value to record
+   * @param unit time unit of the value
+   */
+  public final void record(F1 field1, F2 field2, long value, TimeUnit unit) {
+    logger.atFinest().log("%s (%s, %s) took %dms", name, field1, field2, unit.toMillis(value));
+    doRecord(field1, field2, value, unit);
+  }
+
+  /**
+   * Record a value in the distribution.
+   *
+   * @param field1 bucket to record the timer
+   * @param field2 bucket to record the timer
+   * @param value value to record
+   * @param unit time unit of the value
+   */
+  protected abstract void doRecord(F1 field1, F2 field2, long value, TimeUnit unit);
+}
diff --git a/java/com/google/gerrit/metrics/Timer3.java b/java/com/google/gerrit/metrics/Timer3.java
new file mode 100644
index 0000000..c910eb0
--- /dev/null
+++ b/java/com/google/gerrit/metrics/Timer3.java
@@ -0,0 +1,103 @@
+// Copyright (C) 2015 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.google.gerrit.metrics;
+
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Records elapsed time for an operation or span.
+ *
+ * <p>Typical usage in a try-with-resources block:
+ *
+ * <pre>
+ * try (Timer3.Context ctx = timer.start(field)) {
+ * }
+ * </pre>
+ *
+ * @param <F1> type of the field.
+ * @param <F2> type of the field.
+ * @param <F3> type of the field.
+ */
+public abstract class Timer3<F1, F2, F3> implements RegistrationHandle {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static class Context extends TimerContext {
+    private final Timer3<Object, Object, Object> timer;
+    private final Object field1;
+    private final Object field2;
+    private final Object field3;
+
+    @SuppressWarnings("unchecked")
+    <F1, F2, F3> Context(Timer3<F1, F2, F3> timer, F1 f1, F2 f2, F3 f3) {
+      this.timer = (Timer3<Object, Object, Object>) timer;
+      this.field1 = f1;
+      this.field2 = f2;
+      this.field3 = f3;
+    }
+
+    @Override
+    public void record(long elapsed) {
+      timer.record(field1, field2, field3, elapsed, NANOSECONDS);
+    }
+  }
+
+  protected final String name;
+
+  public Timer3(String name) {
+    this.name = name;
+  }
+
+  /**
+   * Begin a timer for the current block, value will be recorded when closed.
+   *
+   * @param field1 bucket to record the timer
+   * @param field2 bucket to record the timer
+   * @param field3 bucket to record the timer
+   * @return timer context
+   */
+  public Context start(F1 field1, F2 field2, F3 field3) {
+    return new Context(this, field1, field2, field3);
+  }
+
+  /**
+   * Record a value in the distribution.
+   *
+   * @param field1 bucket to record the timer
+   * @param field2 bucket to record the timer
+   * @param field3 bucket to record the timer
+   * @param value value to record
+   * @param unit time unit of the value
+   */
+  public final void record(F1 field1, F2 field2, F3 field3, long value, TimeUnit unit) {
+    logger.atFinest().log(
+        "%s (%s, %s, %s) took %dms", name, field1, field2, field3, unit.toMillis(value));
+    doRecord(field1, field2, field3, value, unit);
+  }
+
+  /**
+   * Record a value in the distribution.
+   *
+   * @param field1 bucket to record the timer
+   * @param field2 bucket to record the timer
+   * @param field3 bucket to record the timer
+   * @param value value to record
+   * @param unit time unit of the value
+   */
+  protected abstract void doRecord(F1 field1, F2 field2, F3 field3, long value, TimeUnit unit);
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/TimerContext.java b/java/com/google/gerrit/metrics/TimerContext.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/metrics/TimerContext.java
rename to java/com/google/gerrit/metrics/TimerContext.java
diff --git a/java/com/google/gerrit/metrics/dropwizard/BUILD b/java/com/google/gerrit/metrics/dropwizard/BUILD
new file mode 100644
index 0000000..9adb375
--- /dev/null
+++ b/java/com/google/gerrit/metrics/dropwizard/BUILD
@@ -0,0 +1,15 @@
+java_library(
+    name = "dropwizard",
+    srcs = glob(["**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/common:annotations",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/metrics",
+        "//java/com/google/gerrit/server",
+        "//lib:args4j",
+        "//lib:guava",
+        "//lib/dropwizard:dropwizard-core",
+        "//lib/guice",
+    ],
+)
diff --git a/java/com/google/gerrit/metrics/dropwizard/BucketedCallback.java b/java/com/google/gerrit/metrics/dropwizard/BucketedCallback.java
new file mode 100644
index 0000000..ee87397
--- /dev/null
+++ b/java/com/google/gerrit/metrics/dropwizard/BucketedCallback.java
@@ -0,0 +1,139 @@
+// Copyright (C) 2015 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.google.gerrit.metrics.dropwizard;
+
+import com.codahale.metrics.Gauge;
+import com.codahale.metrics.Metric;
+import com.codahale.metrics.MetricRegistry;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Maps;
+import com.google.gerrit.metrics.Description;
+import com.google.gerrit.metrics.Field;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/** Abstract callback metric broken down into buckets. */
+abstract class BucketedCallback<V> implements BucketedMetric {
+  private final DropWizardMetricMaker metrics;
+  private final MetricRegistry registry;
+  private final String name;
+  private final Description.FieldOrdering ordering;
+  protected final Field<?>[] fields;
+  private final V zero;
+  private final Map<Object, ValueGauge> cells;
+  protected volatile Runnable trigger;
+  private final Object lock = new Object();
+
+  BucketedCallback(
+      DropWizardMetricMaker metrics,
+      MetricRegistry registry,
+      String name,
+      Class<V> valueType,
+      Description desc,
+      Field<?>... fields) {
+    this.metrics = metrics;
+    this.registry = registry;
+    this.name = name;
+    this.ordering = desc.getFieldOrdering();
+    this.fields = fields;
+    this.zero = CallbackMetricImpl0.zeroFor(valueType);
+    this.cells = new ConcurrentHashMap<>();
+  }
+
+  void doRemove() {
+    for (Object key : cells.keySet()) {
+      registry.remove(submetric(key));
+    }
+    metrics.remove(name);
+  }
+
+  void doBeginSet() {
+    for (ValueGauge g : cells.values()) {
+      g.set = false;
+    }
+  }
+
+  void doPrune() {
+    cells.entrySet().removeIf(objectValueGaugeEntry -> !objectValueGaugeEntry.getValue().set);
+  }
+
+  void doEndSet() {
+    for (ValueGauge g : cells.values()) {
+      if (!g.set) {
+        g.value = zero;
+      }
+    }
+  }
+
+  ValueGauge getOrCreate(Object f1, Object f2) {
+    return getOrCreate(ImmutableList.of(f1, f2));
+  }
+
+  ValueGauge getOrCreate(Object f1, Object f2, Object f3) {
+    return getOrCreate(ImmutableList.of(f1, f2, f3));
+  }
+
+  ValueGauge getOrCreate(Object key) {
+    ValueGauge c = cells.get(key);
+    if (c != null) {
+      return c;
+    }
+
+    synchronized (lock) {
+      c = cells.get(key);
+      if (c == null) {
+        c = new ValueGauge();
+        registry.register(submetric(key), c);
+        cells.put(key, c);
+      }
+      return c;
+    }
+  }
+
+  private String submetric(Object key) {
+    return DropWizardMetricMaker.name(ordering, name, name(key));
+  }
+
+  abstract String name(Object key);
+
+  @Override
+  public Metric getTotal() {
+    return null;
+  }
+
+  @Override
+  public Field<?>[] getFields() {
+    return fields;
+  }
+
+  @Override
+  public Map<Object, Metric> getCells() {
+    return Maps.transformValues(cells, in -> (Metric) in);
+  }
+
+  final class ValueGauge implements Gauge<V> {
+    volatile V value = zero;
+    boolean set;
+
+    @Override
+    public V getValue() {
+      Runnable t = trigger;
+      if (t != null) {
+        t.run();
+      }
+      return value;
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedCounter.java b/java/com/google/gerrit/metrics/dropwizard/BucketedCounter.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedCounter.java
rename to java/com/google/gerrit/metrics/dropwizard/BucketedCounter.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedHistogram.java b/java/com/google/gerrit/metrics/dropwizard/BucketedHistogram.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedHistogram.java
rename to java/com/google/gerrit/metrics/dropwizard/BucketedHistogram.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedMetric.java b/java/com/google/gerrit/metrics/dropwizard/BucketedMetric.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedMetric.java
rename to java/com/google/gerrit/metrics/dropwizard/BucketedMetric.java
diff --git a/java/com/google/gerrit/metrics/dropwizard/BucketedTimer.java b/java/com/google/gerrit/metrics/dropwizard/BucketedTimer.java
new file mode 100644
index 0000000..a7ffe07
--- /dev/null
+++ b/java/com/google/gerrit/metrics/dropwizard/BucketedTimer.java
@@ -0,0 +1,97 @@
+// Copyright (C) 2015 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.google.gerrit.metrics.dropwizard;
+
+import com.codahale.metrics.Metric;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Maps;
+import com.google.gerrit.metrics.Description;
+import com.google.gerrit.metrics.Field;
+import com.google.gerrit.metrics.dropwizard.DropWizardMetricMaker.TimerImpl;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/** Abstract timer broken down into buckets by {@link Field} values. */
+abstract class BucketedTimer implements BucketedMetric {
+  private final DropWizardMetricMaker metrics;
+  protected final String name;
+  private final Description.FieldOrdering ordering;
+  protected final Field<?>[] fields;
+  protected final TimerImpl total;
+  private final Map<Object, TimerImpl> cells;
+  private final Object lock = new Object();
+
+  BucketedTimer(DropWizardMetricMaker metrics, String name, Description desc, Field<?>... fields) {
+    this.metrics = metrics;
+    this.name = name;
+    this.ordering = desc.getFieldOrdering();
+    this.fields = fields;
+    this.total = metrics.newTimerImpl(name + "_total");
+    this.cells = new ConcurrentHashMap<>();
+  }
+
+  void doRemove() {
+    for (TimerImpl c : cells.values()) {
+      c.remove();
+    }
+    total.remove();
+    metrics.remove(name);
+  }
+
+  TimerImpl forceCreate(Object f1, Object f2) {
+    return forceCreate(ImmutableList.of(f1, f2));
+  }
+
+  TimerImpl forceCreate(Object f1, Object f2, Object f3) {
+    return forceCreate(ImmutableList.of(f1, f2, f3));
+  }
+
+  TimerImpl forceCreate(Object key) {
+    TimerImpl c = cells.get(key);
+    if (c != null) {
+      return c;
+    }
+
+    synchronized (lock) {
+      c = cells.get(key);
+      if (c == null) {
+        c = metrics.newTimerImpl(submetric(key));
+        cells.put(key, c);
+      }
+      return c;
+    }
+  }
+
+  private String submetric(Object key) {
+    return DropWizardMetricMaker.name(ordering, name, name(key));
+  }
+
+  abstract String name(Object key);
+
+  @Override
+  public Metric getTotal() {
+    return total.metric;
+  }
+
+  @Override
+  public Field<?>[] getFields() {
+    return fields;
+  }
+
+  @Override
+  public Map<Object, Metric> getCells() {
+    return Maps.transformValues(cells, t -> t.metric);
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CallbackGroup.java b/java/com/google/gerrit/metrics/dropwizard/CallbackGroup.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CallbackGroup.java
rename to java/com/google/gerrit/metrics/dropwizard/CallbackGroup.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CallbackMetricGlue.java b/java/com/google/gerrit/metrics/dropwizard/CallbackMetricGlue.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CallbackMetricGlue.java
rename to java/com/google/gerrit/metrics/dropwizard/CallbackMetricGlue.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CallbackMetricImpl0.java b/java/com/google/gerrit/metrics/dropwizard/CallbackMetricImpl0.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CallbackMetricImpl0.java
rename to java/com/google/gerrit/metrics/dropwizard/CallbackMetricImpl0.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CallbackMetricImpl1.java b/java/com/google/gerrit/metrics/dropwizard/CallbackMetricImpl1.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CallbackMetricImpl1.java
rename to java/com/google/gerrit/metrics/dropwizard/CallbackMetricImpl1.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CounterImpl1.java b/java/com/google/gerrit/metrics/dropwizard/CounterImpl1.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CounterImpl1.java
rename to java/com/google/gerrit/metrics/dropwizard/CounterImpl1.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CounterImplN.java b/java/com/google/gerrit/metrics/dropwizard/CounterImplN.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/CounterImplN.java
rename to java/com/google/gerrit/metrics/dropwizard/CounterImplN.java
diff --git a/java/com/google/gerrit/metrics/dropwizard/DropWizardMetricMaker.java b/java/com/google/gerrit/metrics/dropwizard/DropWizardMetricMaker.java
new file mode 100644
index 0000000..b57ea92
--- /dev/null
+++ b/java/com/google/gerrit/metrics/dropwizard/DropWizardMetricMaker.java
@@ -0,0 +1,436 @@
+// Copyright (C) 2015 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.google.gerrit.metrics.dropwizard;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.gerrit.metrics.dropwizard.MetricResource.METRIC_KIND;
+import static com.google.gerrit.server.config.ConfigResource.CONFIG_KIND;
+
+import com.codahale.metrics.Metric;
+import com.codahale.metrics.MetricRegistry;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import com.google.gerrit.extensions.restapi.RestApiModule;
+import com.google.gerrit.metrics.CallbackMetric;
+import com.google.gerrit.metrics.CallbackMetric0;
+import com.google.gerrit.metrics.CallbackMetric1;
+import com.google.gerrit.metrics.Counter0;
+import com.google.gerrit.metrics.Counter1;
+import com.google.gerrit.metrics.Counter2;
+import com.google.gerrit.metrics.Counter3;
+import com.google.gerrit.metrics.Description;
+import com.google.gerrit.metrics.Description.FieldOrdering;
+import com.google.gerrit.metrics.Field;
+import com.google.gerrit.metrics.Histogram0;
+import com.google.gerrit.metrics.Histogram1;
+import com.google.gerrit.metrics.Histogram2;
+import com.google.gerrit.metrics.Histogram3;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.metrics.Timer0;
+import com.google.gerrit.metrics.Timer1;
+import com.google.gerrit.metrics.Timer2;
+import com.google.gerrit.metrics.Timer3;
+import com.google.gerrit.metrics.proc.JGitMetricModule;
+import com.google.gerrit.metrics.proc.ProcMetricModule;
+import com.google.gerrit.server.cache.CacheMetrics;
+import com.google.inject.Inject;
+import com.google.inject.Scopes;
+import com.google.inject.Singleton;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Pattern;
+
+/**
+ * Connects Gerrit metric package onto DropWizard.
+ *
+ * @see <a href="http://www.dropwizard.io/">DropWizard</a>
+ */
+@Singleton
+public class DropWizardMetricMaker extends MetricMaker {
+  public static class ApiModule extends RestApiModule {
+    @Override
+    protected void configure() {
+      bind(MetricRegistry.class).in(Scopes.SINGLETON);
+      bind(DropWizardMetricMaker.class).in(Scopes.SINGLETON);
+      bind(MetricMaker.class).to(DropWizardMetricMaker.class);
+
+      install(new ProcMetricModule());
+      install(new JGitMetricModule());
+    }
+  }
+
+  public static class RestModule extends RestApiModule {
+    @Override
+    protected void configure() {
+      DynamicMap.mapOf(binder(), METRIC_KIND);
+      child(CONFIG_KIND, "metrics").to(MetricsCollection.class);
+      get(METRIC_KIND).to(GetMetric.class);
+      bind(CacheMetrics.class);
+    }
+  }
+
+  private final MetricRegistry registry;
+  private final Map<String, BucketedMetric> bucketed;
+  private final Map<String, ImmutableMap<String, String>> descriptions;
+
+  @Inject
+  DropWizardMetricMaker(MetricRegistry registry) {
+    this.registry = registry;
+    this.bucketed = new ConcurrentHashMap<>();
+    this.descriptions = new ConcurrentHashMap<>();
+  }
+
+  Iterable<String> getMetricNames() {
+    return descriptions.keySet();
+  }
+
+  /** Get the underlying metric implementation. */
+  public Metric getMetric(String name) {
+    Metric m = bucketed.get(name);
+    return m != null ? m : registry.getMetrics().get(name);
+  }
+
+  /** Lookup annotations from a metric's {@link Description}. */
+  public ImmutableMap<String, String> getAnnotations(String name) {
+    return descriptions.get(name);
+  }
+
+  @Override
+  public synchronized Counter0 newCounter(String name, Description desc) {
+    checkCounterDescription(name, desc);
+    define(name, desc);
+    return newCounterImpl(name, desc.isRate());
+  }
+
+  @Override
+  public synchronized <F1> Counter1<F1> newCounter(
+      String name, Description desc, Field<F1> field1) {
+    checkCounterDescription(name, desc);
+    CounterImpl1<F1> m = new CounterImpl1<>(this, name, desc, field1);
+    define(name, desc);
+    bucketed.put(name, m);
+    return m.counter();
+  }
+
+  @Override
+  public synchronized <F1, F2> Counter2<F1, F2> newCounter(
+      String name, Description desc, Field<F1> field1, Field<F2> field2) {
+    checkCounterDescription(name, desc);
+    CounterImplN m = new CounterImplN(this, name, desc, field1, field2);
+    define(name, desc);
+    bucketed.put(name, m);
+    return m.counter2();
+  }
+
+  @Override
+  public synchronized <F1, F2, F3> Counter3<F1, F2, F3> newCounter(
+      String name, Description desc, Field<F1> field1, Field<F2> field2, Field<F3> field3) {
+    checkCounterDescription(name, desc);
+    CounterImplN m = new CounterImplN(this, name, desc, field1, field2, field3);
+    define(name, desc);
+    bucketed.put(name, m);
+    return m.counter3();
+  }
+
+  private static void checkCounterDescription(String name, Description desc) {
+    checkMetricName(name);
+    checkArgument(!desc.isConstant(), "counter must not be constant");
+    checkArgument(!desc.isGauge(), "counter must not be gauge");
+  }
+
+  CounterImpl newCounterImpl(String name, boolean isRate) {
+    if (isRate) {
+      final com.codahale.metrics.Meter m = registry.meter(name);
+      return new CounterImpl(name, m) {
+        @Override
+        public void incrementBy(long delta) {
+          checkArgument(delta >= 0, "counter delta must be >= 0");
+          m.mark(delta);
+        }
+      };
+    }
+    final com.codahale.metrics.Counter m = registry.counter(name);
+    return new CounterImpl(name, m) {
+      @Override
+      public void incrementBy(long delta) {
+        checkArgument(delta >= 0, "counter delta must be >= 0");
+        m.inc(delta);
+      }
+    };
+  }
+
+  @Override
+  public synchronized Timer0 newTimer(String name, Description desc) {
+    checkTimerDescription(name, desc);
+    define(name, desc);
+    return newTimerImpl(name);
+  }
+
+  @Override
+  public synchronized <F1> Timer1<F1> newTimer(String name, Description desc, Field<F1> field1) {
+    checkTimerDescription(name, desc);
+    TimerImpl1<F1> m = new TimerImpl1<>(this, name, desc, field1);
+    define(name, desc);
+    bucketed.put(name, m);
+    return m.timer();
+  }
+
+  @Override
+  public synchronized <F1, F2> Timer2<F1, F2> newTimer(
+      String name, Description desc, Field<F1> field1, Field<F2> field2) {
+    checkTimerDescription(name, desc);
+    TimerImplN m = new TimerImplN(this, name, desc, field1, field2);
+    define(name, desc);
+    bucketed.put(name, m);
+    return m.timer2();
+  }
+
+  @Override
+  public synchronized <F1, F2, F3> Timer3<F1, F2, F3> newTimer(
+      String name, Description desc, Field<F1> field1, Field<F2> field2, Field<F3> field3) {
+    checkTimerDescription(name, desc);
+    TimerImplN m = new TimerImplN(this, name, desc, field1, field2, field3);
+    define(name, desc);
+    bucketed.put(name, m);
+    return m.timer3();
+  }
+
+  private static void checkTimerDescription(String name, Description desc) {
+    checkMetricName(name);
+    checkArgument(!desc.isConstant(), "timer must not be constant");
+    checkArgument(!desc.isGauge(), "timer must not be a gauge");
+    checkArgument(!desc.isRate(), "timer must not be a rate");
+    checkArgument(desc.isCumulative(), "timer must be cumulative");
+    checkArgument(desc.getTimeUnit() != null, "timer must have a unit");
+  }
+
+  TimerImpl newTimerImpl(String name) {
+    return new TimerImpl(name, registry.timer(name));
+  }
+
+  @Override
+  public synchronized Histogram0 newHistogram(String name, Description desc) {
+    checkHistogramDescription(name, desc);
+    define(name, desc);
+    return newHistogramImpl(name);
+  }
+
+  @Override
+  public synchronized <F1> Histogram1<F1> newHistogram(
+      String name, Description desc, Field<F1> field1) {
+    checkHistogramDescription(name, desc);
+    HistogramImpl1<F1> m = new HistogramImpl1<>(this, name, desc, field1);
+    define(name, desc);
+    bucketed.put(name, m);
+    return m.histogram1();
+  }
+
+  @Override
+  public synchronized <F1, F2> Histogram2<F1, F2> newHistogram(
+      String name, Description desc, Field<F1> field1, Field<F2> field2) {
+    checkHistogramDescription(name, desc);
+    HistogramImplN m = new HistogramImplN(this, name, desc, field1, field2);
+    define(name, desc);
+    bucketed.put(name, m);
+    return m.histogram2();
+  }
+
+  @Override
+  public synchronized <F1, F2, F3> Histogram3<F1, F2, F3> newHistogram(
+      String name, Description desc, Field<F1> field1, Field<F2> field2, Field<F3> field3) {
+    checkHistogramDescription(name, desc);
+    HistogramImplN m = new HistogramImplN(this, name, desc, field1, field2, field3);
+    define(name, desc);
+    bucketed.put(name, m);
+    return m.histogram3();
+  }
+
+  private static void checkHistogramDescription(String name, Description desc) {
+    checkMetricName(name);
+    checkArgument(!desc.isConstant(), "histogram must not be constant");
+    checkArgument(!desc.isGauge(), "histogram must not be a gauge");
+    checkArgument(!desc.isRate(), "histogram must not be a rate");
+    checkArgument(desc.isCumulative(), "histogram must be cumulative");
+  }
+
+  HistogramImpl newHistogramImpl(String name) {
+    return new HistogramImpl(name, registry.histogram(name));
+  }
+
+  @Override
+  public <V> CallbackMetric0<V> newCallbackMetric(
+      String name, Class<V> valueClass, Description desc) {
+    checkMetricName(name);
+    define(name, desc);
+    return new CallbackMetricImpl0<>(this, registry, name, valueClass);
+  }
+
+  @Override
+  public <F1, V> CallbackMetric1<F1, V> newCallbackMetric(
+      String name, Class<V> valueClass, Description desc, Field<F1> field1) {
+    checkMetricName(name);
+    CallbackMetricImpl1<F1, V> m =
+        new CallbackMetricImpl1<>(this, registry, name, valueClass, desc, field1);
+    define(name, desc);
+    bucketed.put(name, m);
+    return m.create();
+  }
+
+  @Override
+  public synchronized RegistrationHandle newTrigger(
+      Set<CallbackMetric<?>> metrics, Runnable trigger) {
+    ImmutableSet<CallbackMetricGlue> all =
+        FluentIterable.from(metrics).transform(m -> (CallbackMetricGlue) m).toSet();
+
+    trigger = new CallbackGroup(trigger, all);
+    for (CallbackMetricGlue m : all) {
+      m.register(trigger);
+    }
+    trigger.run();
+
+    return new RegistrationHandle() {
+      @Override
+      public void remove() {
+        for (CallbackMetricGlue m : all) {
+          m.remove();
+        }
+      }
+    };
+  }
+
+  synchronized void remove(String name) {
+    bucketed.remove(name);
+    descriptions.remove(name);
+  }
+
+  private synchronized void define(String name, Description desc) {
+    if (descriptions.containsKey(name)) {
+      ImmutableMap<String, String> annotations = descriptions.get(name);
+      if (!desc.getAnnotations()
+          .get(Description.DESCRIPTION)
+          .equals(annotations.get(Description.DESCRIPTION))) {
+        throw new IllegalStateException(String.format("metric '%s' already defined", name));
+      }
+    } else {
+      descriptions.put(name, desc.getAnnotations());
+    }
+  }
+
+  private static final Pattern METRIC_NAME_PATTERN =
+      Pattern.compile("[a-zA-Z0-9_-]+(/[a-zA-Z0-9_-]+)*");
+
+  private static void checkMetricName(String name) {
+    checkArgument(
+        METRIC_NAME_PATTERN.matcher(name).matches(),
+        "invalid metric name '%s': must match pattern '%s'",
+        name,
+        METRIC_NAME_PATTERN.pattern());
+  }
+
+  @Override
+  public String sanitizeMetricName(String name) {
+    if (METRIC_NAME_PATTERN.matcher(name).matches()) {
+      return name;
+    }
+
+    String first = name.substring(0, 1).replaceFirst("[^\\w-]", "_");
+    if (name.length() == 1) {
+      return first;
+    }
+
+    String result = first + name.substring(1).replaceAll("/[/]+", "/").replaceAll("[^\\w-/]", "_");
+
+    if (result.endsWith("/")) {
+      result = result.substring(0, result.length() - 1);
+    }
+
+    return result;
+  }
+
+  static String name(Description.FieldOrdering ordering, String codeName, String fieldValues) {
+    if (ordering == FieldOrdering.PREFIX_FIELDS_BASENAME) {
+      int s = codeName.lastIndexOf('/');
+      if (s > 0) {
+        String prefix = codeName.substring(0, s);
+        String metric = codeName.substring(s + 1);
+        return prefix + '/' + fieldValues + '/' + metric;
+      }
+    }
+    return codeName + '/' + fieldValues;
+  }
+
+  abstract class CounterImpl extends Counter0 {
+    private final String name;
+    final Metric metric;
+
+    CounterImpl(String name, Metric metric) {
+      this.name = name;
+      this.metric = metric;
+    }
+
+    @Override
+    public void remove() {
+      descriptions.remove(name);
+      registry.remove(name);
+    }
+  }
+
+  class TimerImpl extends Timer0 {
+    final com.codahale.metrics.Timer metric;
+
+    private TimerImpl(String name, com.codahale.metrics.Timer metric) {
+      super(name);
+      this.metric = metric;
+    }
+
+    @Override
+    protected void doRecord(long value, TimeUnit unit) {
+      checkArgument(value >= 0, "timer delta must be >= 0");
+      metric.update(value, unit);
+    }
+
+    @Override
+    public void remove() {
+      descriptions.remove(name);
+      registry.remove(name);
+    }
+  }
+
+  class HistogramImpl extends Histogram0 {
+    private final String name;
+    final com.codahale.metrics.Histogram metric;
+
+    private HistogramImpl(String name, com.codahale.metrics.Histogram metric) {
+      this.name = name;
+      this.metric = metric;
+    }
+
+    @Override
+    public void record(long value) {
+      metric.update(value);
+    }
+
+    @Override
+    public void remove() {
+      descriptions.remove(name);
+      registry.remove(name);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/metrics/dropwizard/GetMetric.java b/java/com/google/gerrit/metrics/dropwizard/GetMetric.java
new file mode 100644
index 0000000..ae1e6ec
--- /dev/null
+++ b/java/com/google/gerrit/metrics/dropwizard/GetMetric.java
@@ -0,0 +1,45 @@
+// Copyright (C) 2015 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.google.gerrit.metrics.dropwizard;
+
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.inject.Inject;
+import org.kohsuke.args4j.Option;
+
+class GetMetric implements RestReadView<MetricResource> {
+  private final PermissionBackend permissionBackend;
+  private final DropWizardMetricMaker metrics;
+
+  @Option(name = "--data-only", usage = "return only values")
+  boolean dataOnly;
+
+  @Inject
+  GetMetric(PermissionBackend permissionBackend, DropWizardMetricMaker metrics) {
+    this.permissionBackend = permissionBackend;
+    this.metrics = metrics;
+  }
+
+  @Override
+  public MetricJson apply(MetricResource resource)
+      throws AuthException, PermissionBackendException {
+    permissionBackend.currentUser().check(GlobalPermission.VIEW_CACHES);
+    return new MetricJson(
+        resource.getMetric(), metrics.getAnnotations(resource.getName()), dataOnly);
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/HistogramImpl1.java b/java/com/google/gerrit/metrics/dropwizard/HistogramImpl1.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/HistogramImpl1.java
rename to java/com/google/gerrit/metrics/dropwizard/HistogramImpl1.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/HistogramImplN.java b/java/com/google/gerrit/metrics/dropwizard/HistogramImplN.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/HistogramImplN.java
rename to java/com/google/gerrit/metrics/dropwizard/HistogramImplN.java
diff --git a/java/com/google/gerrit/metrics/dropwizard/ListMetrics.java b/java/com/google/gerrit/metrics/dropwizard/ListMetrics.java
new file mode 100644
index 0000000..0c69452
--- /dev/null
+++ b/java/com/google/gerrit/metrics/dropwizard/ListMetrics.java
@@ -0,0 +1,96 @@
+// Copyright (C) 2015 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.google.gerrit.metrics.dropwizard;
+
+import com.codahale.metrics.Metric;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.config.ConfigResource;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.inject.Inject;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+import org.kohsuke.args4j.Option;
+
+class ListMetrics implements RestReadView<ConfigResource> {
+  private final PermissionBackend permissionBackend;
+  private final DropWizardMetricMaker metrics;
+
+  @Option(name = "--data-only", usage = "return only values")
+  boolean dataOnly;
+
+  @Option(
+      name = "--prefix",
+      aliases = {"-p"},
+      metaVar = "PREFIX",
+      usage = "match metric by exact match or prefix")
+  List<String> query = new ArrayList<>();
+
+  @Inject
+  ListMetrics(PermissionBackend permissionBackend, DropWizardMetricMaker metrics) {
+    this.permissionBackend = permissionBackend;
+    this.metrics = metrics;
+  }
+
+  @Override
+  public Map<String, MetricJson> apply(ConfigResource resource)
+      throws AuthException, PermissionBackendException {
+    permissionBackend.currentUser().check(GlobalPermission.VIEW_CACHES);
+
+    SortedMap<String, MetricJson> out = new TreeMap<>();
+    List<String> prefixes = new ArrayList<>(query.size());
+    for (String q : query) {
+      if (q.endsWith("/")) {
+        prefixes.add(q);
+      } else {
+        Metric m = metrics.getMetric(q);
+        if (m != null) {
+          out.put(q, toJson(q, m));
+        }
+      }
+    }
+
+    if (query.isEmpty() || !prefixes.isEmpty()) {
+      for (String name : metrics.getMetricNames()) {
+        if (include(prefixes, name)) {
+          out.put(name, toJson(name, metrics.getMetric(name)));
+        }
+      }
+    }
+
+    return out;
+  }
+
+  private MetricJson toJson(String q, Metric m) {
+    return new MetricJson(m, metrics.getAnnotations(q), dataOnly);
+  }
+
+  private static boolean include(List<String> prefixes, String name) {
+    if (prefixes.isEmpty()) {
+      return true;
+    }
+    for (String p : prefixes) {
+      if (name.startsWith(p)) {
+        return true;
+      }
+    }
+    return false;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/MetricJson.java b/java/com/google/gerrit/metrics/dropwizard/MetricJson.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/MetricJson.java
rename to java/com/google/gerrit/metrics/dropwizard/MetricJson.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/MetricResource.java b/java/com/google/gerrit/metrics/dropwizard/MetricResource.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/MetricResource.java
rename to java/com/google/gerrit/metrics/dropwizard/MetricResource.java
diff --git a/java/com/google/gerrit/metrics/dropwizard/MetricsCollection.java b/java/com/google/gerrit/metrics/dropwizard/MetricsCollection.java
new file mode 100644
index 0000000..55c932c
--- /dev/null
+++ b/java/com/google/gerrit/metrics/dropwizard/MetricsCollection.java
@@ -0,0 +1,72 @@
+// Copyright (C) 2015 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.google.gerrit.metrics.dropwizard;
+
+import com.codahale.metrics.Metric;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ChildCollection;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.server.config.ConfigResource;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@Singleton
+class MetricsCollection implements ChildCollection<ConfigResource, MetricResource> {
+  private final DynamicMap<RestView<MetricResource>> views;
+  private final Provider<ListMetrics> list;
+  private final PermissionBackend permissionBackend;
+  private final DropWizardMetricMaker metrics;
+
+  @Inject
+  MetricsCollection(
+      DynamicMap<RestView<MetricResource>> views,
+      Provider<ListMetrics> list,
+      PermissionBackend permissionBackend,
+      DropWizardMetricMaker metrics) {
+    this.views = views;
+    this.list = list;
+    this.permissionBackend = permissionBackend;
+    this.metrics = metrics;
+  }
+
+  @Override
+  public DynamicMap<RestView<MetricResource>> views() {
+    return views;
+  }
+
+  @Override
+  public RestView<ConfigResource> list() {
+    return list.get();
+  }
+
+  @Override
+  public MetricResource parse(ConfigResource parent, IdString id)
+      throws ResourceNotFoundException, AuthException, PermissionBackendException {
+    permissionBackend.currentUser().check(GlobalPermission.VIEW_CACHES);
+
+    Metric metric = metrics.getMetric(id.get());
+    if (metric == null) {
+      throw new ResourceNotFoundException(id.get());
+    }
+    return new MetricResource(id.get(), metric);
+  }
+}
diff --git a/java/com/google/gerrit/metrics/dropwizard/TimerImpl1.java b/java/com/google/gerrit/metrics/dropwizard/TimerImpl1.java
new file mode 100644
index 0000000..d97e73a
--- /dev/null
+++ b/java/com/google/gerrit/metrics/dropwizard/TimerImpl1.java
@@ -0,0 +1,51 @@
+// Copyright (C) 2015 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.google.gerrit.metrics.dropwizard;
+
+import com.google.common.base.Function;
+import com.google.gerrit.metrics.Description;
+import com.google.gerrit.metrics.Field;
+import com.google.gerrit.metrics.Timer1;
+import java.util.concurrent.TimeUnit;
+
+/** Optimized version of {@link BucketedTimer} for single dimension. */
+class TimerImpl1<F1> extends BucketedTimer implements BucketedMetric {
+  TimerImpl1(DropWizardMetricMaker metrics, String name, Description desc, Field<F1> field1) {
+    super(metrics, name, desc, field1);
+  }
+
+  Timer1<F1> timer() {
+    return new Timer1<F1>(name) {
+      @Override
+      protected void doRecord(F1 field1, long value, TimeUnit unit) {
+        total.record(value, unit);
+        forceCreate(field1).record(value, unit);
+      }
+
+      @Override
+      public void remove() {
+        doRemove();
+      }
+    };
+  }
+
+  @Override
+  String name(Object field1) {
+    @SuppressWarnings("unchecked")
+    Function<Object, String> fmt = (Function<Object, String>) fields[0].formatter();
+
+    return fmt.apply(field1).replace('/', '-');
+  }
+}
diff --git a/java/com/google/gerrit/metrics/dropwizard/TimerImplN.java b/java/com/google/gerrit/metrics/dropwizard/TimerImplN.java
new file mode 100644
index 0000000..be66009
--- /dev/null
+++ b/java/com/google/gerrit/metrics/dropwizard/TimerImplN.java
@@ -0,0 +1,74 @@
+// Copyright (C) 2015 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.google.gerrit.metrics.dropwizard;
+
+import com.google.common.base.Function;
+import com.google.common.base.Joiner;
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.metrics.Description;
+import com.google.gerrit.metrics.Field;
+import com.google.gerrit.metrics.Timer2;
+import com.google.gerrit.metrics.Timer3;
+import java.util.concurrent.TimeUnit;
+
+/** Generalized implementation of N-dimensional timer metrics. */
+class TimerImplN extends BucketedTimer implements BucketedMetric {
+  TimerImplN(DropWizardMetricMaker metrics, String name, Description desc, Field<?>... fields) {
+    super(metrics, name, desc, fields);
+  }
+
+  <F1, F2> Timer2<F1, F2> timer2() {
+    return new Timer2<F1, F2>(name) {
+      @Override
+      protected void doRecord(F1 field1, F2 field2, long value, TimeUnit unit) {
+        total.record(value, unit);
+        forceCreate(field1, field2).record(value, unit);
+      }
+
+      @Override
+      public void remove() {
+        doRemove();
+      }
+    };
+  }
+
+  <F1, F2, F3> Timer3<F1, F2, F3> timer3() {
+    return new Timer3<F1, F2, F3>(name) {
+      @Override
+      protected void doRecord(F1 field1, F2 field2, F3 field3, long value, TimeUnit unit) {
+        total.record(value, unit);
+        forceCreate(field1, field2, field3).record(value, unit);
+      }
+
+      @Override
+      public void remove() {
+        doRemove();
+      }
+    };
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  String name(Object key) {
+    ImmutableList<Object> keyList = (ImmutableList<Object>) key;
+    String[] parts = new String[fields.length];
+    for (int i = 0; i < fields.length; i++) {
+      Function<Object, String> fmt = (Function<Object, String>) fields[i].formatter();
+
+      parts[i] = fmt.apply(keyList.get(i)).replace('/', '-');
+    }
+    return Joiner.on('/').join(parts);
+  }
+}
diff --git a/java/com/google/gerrit/metrics/proc/JGitMetricModule.java b/java/com/google/gerrit/metrics/proc/JGitMetricModule.java
new file mode 100644
index 0000000..438f70e
--- /dev/null
+++ b/java/com/google/gerrit/metrics/proc/JGitMetricModule.java
@@ -0,0 +1,39 @@
+// Copyright (C) 2015 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.google.gerrit.metrics.proc;
+
+import com.google.gerrit.metrics.Description;
+import com.google.gerrit.metrics.Description.Units;
+import com.google.gerrit.metrics.MetricMaker;
+import org.eclipse.jgit.storage.file.WindowCacheStats;
+
+public class JGitMetricModule extends MetricModule {
+  @Override
+  protected void configure(MetricMaker metrics) {
+    metrics.newCallbackMetric(
+        "jgit/block_cache/cache_used",
+        Long.class,
+        new Description("Bytes of memory retained in JGit block cache.")
+            .setGauge()
+            .setUnit(Units.BYTES),
+        WindowCacheStats::getOpenBytes);
+
+    metrics.newCallbackMetric(
+        "jgit/block_cache/open_files",
+        Integer.class,
+        new Description("File handles held open by JGit block cache.").setGauge().setUnit("fds"),
+        WindowCacheStats::getOpenFiles);
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/proc/MetricModule.java b/java/com/google/gerrit/metrics/proc/MetricModule.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/metrics/proc/MetricModule.java
rename to java/com/google/gerrit/metrics/proc/MetricModule.java
diff --git a/java/com/google/gerrit/metrics/proc/OperatingSystemMXBeanProvider.java b/java/com/google/gerrit/metrics/proc/OperatingSystemMXBeanProvider.java
new file mode 100644
index 0000000..10d589a
--- /dev/null
+++ b/java/com/google/gerrit/metrics/proc/OperatingSystemMXBeanProvider.java
@@ -0,0 +1,76 @@
+// Copyright (C) 2017 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.google.gerrit.metrics.proc;
+
+import com.google.common.flogger.FluentLogger;
+import java.lang.management.ManagementFactory;
+import java.lang.management.OperatingSystemMXBean;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+
+class OperatingSystemMXBeanProvider {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final OperatingSystemMXBean sys;
+  private final Method getProcessCpuTime;
+  private final Method getOpenFileDescriptorCount;
+
+  static class Factory {
+    static OperatingSystemMXBeanProvider create() {
+      OperatingSystemMXBean sys = ManagementFactory.getOperatingSystemMXBean();
+      for (String name :
+          Arrays.asList(
+              "com.sun.management.UnixOperatingSystemMXBean",
+              "com.ibm.lang.management.UnixOperatingSystemMXBean")) {
+        try {
+          Class<?> impl = Class.forName(name);
+          if (impl.isInstance(sys)) {
+            return new OperatingSystemMXBeanProvider(sys);
+          }
+        } catch (ReflectiveOperationException e) {
+          logger.atFine().withCause(e).log("No implementation for %s", name);
+        }
+      }
+      logger.atWarning().log("No implementation of UnixOperatingSystemMXBean found");
+      return null;
+    }
+  }
+
+  private OperatingSystemMXBeanProvider(OperatingSystemMXBean sys)
+      throws ReflectiveOperationException {
+    this.sys = sys;
+    getProcessCpuTime = sys.getClass().getMethod("getProcessCpuTime", new Class<?>[] {});
+    getProcessCpuTime.setAccessible(true);
+    getOpenFileDescriptorCount =
+        sys.getClass().getMethod("getOpenFileDescriptorCount", new Class<?>[] {});
+    getOpenFileDescriptorCount.setAccessible(true);
+  }
+
+  public long getProcessCpuTime() {
+    try {
+      return (long) getProcessCpuTime.invoke(sys, new Object[] {});
+    } catch (ReflectiveOperationException e) {
+      return -1;
+    }
+  }
+
+  public long getOpenFileDescriptorCount() {
+    try {
+      return (long) getOpenFileDescriptorCount.invoke(sys, new Object[] {});
+    } catch (ReflectiveOperationException e) {
+      return -1;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/metrics/proc/ProcMetricModule.java b/java/com/google/gerrit/metrics/proc/ProcMetricModule.java
new file mode 100644
index 0000000..6b9176b
--- /dev/null
+++ b/java/com/google/gerrit/metrics/proc/ProcMetricModule.java
@@ -0,0 +1,199 @@
+// Copyright (C) 2015 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.google.gerrit.metrics.proc;
+
+import com.google.common.base.Strings;
+import com.google.common.base.Supplier;
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.common.Version;
+import com.google.gerrit.metrics.CallbackMetric;
+import com.google.gerrit.metrics.CallbackMetric0;
+import com.google.gerrit.metrics.CallbackMetric1;
+import com.google.gerrit.metrics.Description;
+import com.google.gerrit.metrics.Description.Units;
+import com.google.gerrit.metrics.Field;
+import com.google.gerrit.metrics.MetricMaker;
+import java.lang.management.GarbageCollectorMXBean;
+import java.lang.management.ManagementFactory;
+import java.lang.management.MemoryMXBean;
+import java.lang.management.MemoryUsage;
+import java.lang.management.ThreadMXBean;
+import java.util.concurrent.TimeUnit;
+
+public class ProcMetricModule extends MetricModule {
+  @Override
+  protected void configure(MetricMaker metrics) {
+    buildLabel(metrics);
+    procUptime(metrics);
+    procCpuUsage(metrics);
+    procJvmGc(metrics);
+    procJvmMemory(metrics);
+    procJvmThread(metrics);
+  }
+
+  private void buildLabel(MetricMaker metrics) {
+    metrics.newConstantMetric(
+        "build/label",
+        Strings.nullToEmpty(Version.getVersion()),
+        new Description("Version of Gerrit server software"));
+  }
+
+  private void procUptime(MetricMaker metrics) {
+    metrics.newConstantMetric(
+        "proc/birth_timestamp",
+        Long.valueOf(TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis())),
+        new Description("Time at which the process started").setUnit(Units.MICROSECONDS));
+
+    metrics.newCallbackMetric(
+        "proc/uptime",
+        Long.class,
+        new Description("Uptime of this process").setUnit(Units.MILLISECONDS),
+        ManagementFactory.getRuntimeMXBean()::getUptime);
+  }
+
+  private void procCpuUsage(MetricMaker metrics) {
+    final OperatingSystemMXBeanProvider provider = OperatingSystemMXBeanProvider.Factory.create();
+
+    if (provider == null) {
+      return;
+    }
+
+    if (provider.getProcessCpuTime() != -1) {
+      metrics.newCallbackMetric(
+          "proc/cpu/usage",
+          Double.class,
+          new Description("CPU time used by the process").setCumulative().setUnit(Units.SECONDS),
+          new Supplier<Double>() {
+            @Override
+            public Double get() {
+              return provider.getProcessCpuTime() / 1e9;
+            }
+          });
+    }
+
+    if (provider.getOpenFileDescriptorCount() != -1) {
+      metrics.newCallbackMetric(
+          "proc/num_open_fds",
+          Long.class,
+          new Description("Number of open file descriptors").setGauge().setUnit("fds"),
+          provider::getOpenFileDescriptorCount);
+    }
+  }
+
+  private void procJvmMemory(MetricMaker metrics) {
+    CallbackMetric0<Long> heapCommitted =
+        metrics.newCallbackMetric(
+            "proc/jvm/memory/heap_committed",
+            Long.class,
+            new Description("Amount of memory guaranteed for user objects.")
+                .setGauge()
+                .setUnit(Units.BYTES));
+
+    CallbackMetric0<Long> heapUsed =
+        metrics.newCallbackMetric(
+            "proc/jvm/memory/heap_used",
+            Long.class,
+            new Description("Amount of memory holding user objects.")
+                .setGauge()
+                .setUnit(Units.BYTES));
+
+    CallbackMetric0<Long> nonHeapCommitted =
+        metrics.newCallbackMetric(
+            "proc/jvm/memory/non_heap_committed",
+            Long.class,
+            new Description("Amount of memory guaranteed for classes, etc.")
+                .setGauge()
+                .setUnit(Units.BYTES));
+
+    CallbackMetric0<Long> nonHeapUsed =
+        metrics.newCallbackMetric(
+            "proc/jvm/memory/non_heap_used",
+            Long.class,
+            new Description("Amount of memory holding classes, etc.")
+                .setGauge()
+                .setUnit(Units.BYTES));
+
+    CallbackMetric0<Integer> objectPendingFinalizationCount =
+        metrics.newCallbackMetric(
+            "proc/jvm/memory/object_pending_finalization_count",
+            Integer.class,
+            new Description("Approximate number of objects needing finalization.")
+                .setGauge()
+                .setUnit("objects"));
+
+    MemoryMXBean memory = ManagementFactory.getMemoryMXBean();
+    metrics.newTrigger(
+        ImmutableSet.<CallbackMetric<?>>of(
+            heapCommitted, heapUsed, nonHeapCommitted, nonHeapUsed, objectPendingFinalizationCount),
+        () -> {
+          try {
+            MemoryUsage stats = memory.getHeapMemoryUsage();
+            heapCommitted.set(stats.getCommitted());
+            heapUsed.set(stats.getUsed());
+          } catch (IllegalArgumentException e) {
+            // MXBean may throw due to a bug in Java 7; ignore.
+          }
+
+          MemoryUsage stats = memory.getNonHeapMemoryUsage();
+          nonHeapCommitted.set(stats.getCommitted());
+          nonHeapUsed.set(stats.getUsed());
+
+          objectPendingFinalizationCount.set(memory.getObjectPendingFinalizationCount());
+        });
+  }
+
+  private void procJvmGc(MetricMaker metrics) {
+    CallbackMetric1<String, Long> gcCount =
+        metrics.newCallbackMetric(
+            "proc/jvm/gc/count",
+            Long.class,
+            new Description("Number of GCs").setCumulative(),
+            Field.ofString("gc_name", "The name of the garbage collector"));
+
+    CallbackMetric1<String, Long> gcTime =
+        metrics.newCallbackMetric(
+            "proc/jvm/gc/time",
+            Long.class,
+            new Description("Approximate accumulated GC elapsed time")
+                .setCumulative()
+                .setUnit(Units.MILLISECONDS),
+            Field.ofString("gc_name", "The name of the garbage collector"));
+
+    metrics.newTrigger(
+        gcCount,
+        gcTime,
+        () -> {
+          for (GarbageCollectorMXBean gc : ManagementFactory.getGarbageCollectorMXBeans()) {
+            long count = gc.getCollectionCount();
+            if (count != -1) {
+              gcCount.set(gc.getName(), count);
+            }
+            long time = gc.getCollectionTime();
+            if (time != -1) {
+              gcTime.set(gc.getName(), time);
+            }
+          }
+        });
+  }
+
+  private void procJvmThread(MetricMaker metrics) {
+    ThreadMXBean thread = ManagementFactory.getThreadMXBean();
+    metrics.newCallbackMetric(
+        "proc/jvm/thread/num_live",
+        Integer.class,
+        new Description("Current live thread count").setGauge().setUnit("threads"),
+        thread::getThreadCount);
+  }
+}
diff --git a/java/com/google/gerrit/pgm/BUILD b/java/com/google/gerrit/pgm/BUILD
new file mode 100644
index 0000000..0bebad4
--- /dev/null
+++ b/java/com/google/gerrit/pgm/BUILD
@@ -0,0 +1,68 @@
+# TODO(davido): This indirection doesn't avoid unwanted depdencies
+# in acceptance-framework and should be removed. Instead, provided_deps
+# should be used, once https://github.com/bazelbuild/bazel/issues/1402
+# is fixed.
+alias(
+    name = "pgm",
+    actual = ":daemon",
+    visibility = ["//visibility:public"],
+)
+
+java_library(
+    name = "daemon",
+    srcs = glob(["**/*.java"]),
+    resource_strip_prefix = "resources",
+    resources = ["//resources/com/google/gerrit/pgm"],
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/common:annotations",
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/elasticsearch",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/gpg",
+        "//java/com/google/gerrit/httpd",
+        "//java/com/google/gerrit/httpd/auth/oauth",
+        "//java/com/google/gerrit/httpd/auth/openid",
+        "//java/com/google/gerrit/index",
+        "//java/com/google/gerrit/index/project",
+        "//java/com/google/gerrit/launcher",
+        "//java/com/google/gerrit/lifecycle",
+        "//java/com/google/gerrit/lucene",
+        "//java/com/google/gerrit/metrics/dropwizard",
+        "//java/com/google/gerrit/pgm/http",
+        "//java/com/google/gerrit/pgm/init",
+        "//java/com/google/gerrit/pgm/init/api",
+        "//java/com/google/gerrit/pgm/util",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/server:module",
+        "//java/com/google/gerrit/server/api",
+        "//java/com/google/gerrit/server/audit",
+        "//java/com/google/gerrit/server/cache/h2",
+        "//java/com/google/gerrit/server/cache/mem",
+        "//java/com/google/gerrit/server/git/receive",
+        "//java/com/google/gerrit/server/ioutil",
+        "//java/com/google/gerrit/server/restapi",
+        "//java/com/google/gerrit/server/schema",
+        "//java/com/google/gerrit/server/util/time",
+        "//java/com/google/gerrit/sshd",
+        "//java/com/google/gerrit/util/http",
+        "//lib:args4j",
+        "//lib:guava",
+        "//lib:gwtorm",
+        "//lib:protobuf",
+        "//lib:servlet-api-3_1-without-neverlink",
+        "//lib/auto:auto-value",
+        "//lib/auto:auto-value-annotations",
+        "//lib/flogger:api",
+        "//lib/guice",
+        "//lib/guice:guice-assistedinject",
+        "//lib/guice:guice-servlet",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/log:jsonevent-layout",
+        "//lib/log:log4j",
+        "//lib/prolog:cafeteria",
+        "//lib/prolog:compiler",
+        "//lib/prolog:runtime",
+    ],
+)
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Cat.java b/java/com/google/gerrit/pgm/Cat.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/Cat.java
rename to java/com/google/gerrit/pgm/Cat.java
diff --git a/java/com/google/gerrit/pgm/Daemon.java b/java/com/google/gerrit/pgm/Daemon.java
new file mode 100644
index 0000000..b08842e
--- /dev/null
+++ b/java/com/google/gerrit/pgm/Daemon.java
@@ -0,0 +1,623 @@
+// Copyright (C) 2009 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.google.gerrit.pgm;
+
+import static com.google.gerrit.common.Version.getVersion;
+import static com.google.gerrit.server.schema.DataSourceProvider.Context.MULTI_USER;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Joiner;
+import com.google.common.base.MoreObjects;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.elasticsearch.ElasticIndexModule;
+import com.google.gerrit.extensions.client.AuthType;
+import com.google.gerrit.gpg.GpgModule;
+import com.google.gerrit.httpd.AllRequestFilter;
+import com.google.gerrit.httpd.GerritAuthModule;
+import com.google.gerrit.httpd.GetUserFilter;
+import com.google.gerrit.httpd.GitOverHttpModule;
+import com.google.gerrit.httpd.H2CacheBasedWebSession;
+import com.google.gerrit.httpd.HttpCanonicalWebUrlProvider;
+import com.google.gerrit.httpd.RequestContextFilter;
+import com.google.gerrit.httpd.RequestMetricsFilter;
+import com.google.gerrit.httpd.RequireSslFilter;
+import com.google.gerrit.httpd.WebModule;
+import com.google.gerrit.httpd.WebSshGlueModule;
+import com.google.gerrit.httpd.auth.oauth.OAuthModule;
+import com.google.gerrit.httpd.auth.openid.OpenIdModule;
+import com.google.gerrit.httpd.plugins.HttpPluginModule;
+import com.google.gerrit.httpd.raw.StaticModule;
+import com.google.gerrit.lifecycle.LifecycleManager;
+import com.google.gerrit.lucene.LuceneIndexModule;
+import com.google.gerrit.metrics.dropwizard.DropWizardMetricMaker;
+import com.google.gerrit.pgm.http.jetty.JettyEnv;
+import com.google.gerrit.pgm.http.jetty.JettyModule;
+import com.google.gerrit.pgm.http.jetty.ProjectQoSFilter;
+import com.google.gerrit.pgm.util.ErrorLogFile;
+import com.google.gerrit.pgm.util.LogFileCompressor;
+import com.google.gerrit.pgm.util.RuntimeShutdown;
+import com.google.gerrit.pgm.util.SiteProgram;
+import com.google.gerrit.server.LibModuleLoader;
+import com.google.gerrit.server.ModuleOverloader;
+import com.google.gerrit.server.StartupChecks;
+import com.google.gerrit.server.account.AccountDeactivator;
+import com.google.gerrit.server.account.InternalAccountDirectory;
+import com.google.gerrit.server.api.GerritApiModule;
+import com.google.gerrit.server.api.PluginApiModule;
+import com.google.gerrit.server.audit.AuditModule;
+import com.google.gerrit.server.cache.h2.H2CacheModule;
+import com.google.gerrit.server.cache.mem.DefaultMemoryCacheModule;
+import com.google.gerrit.server.change.ChangeCleanupRunner;
+import com.google.gerrit.server.config.AuthConfig;
+import com.google.gerrit.server.config.AuthConfigModule;
+import com.google.gerrit.server.config.CanonicalWebUrlModule;
+import com.google.gerrit.server.config.CanonicalWebUrlProvider;
+import com.google.gerrit.server.config.DefaultUrlFormatter;
+import com.google.gerrit.server.config.DownloadConfig;
+import com.google.gerrit.server.config.GerritGlobalModule;
+import com.google.gerrit.server.config.GerritInstanceNameModule;
+import com.google.gerrit.server.config.GerritOptions;
+import com.google.gerrit.server.config.GerritRuntime;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.SysExecutorModule;
+import com.google.gerrit.server.events.EventBroker;
+import com.google.gerrit.server.events.StreamEventsApiListener;
+import com.google.gerrit.server.git.GarbageCollectionModule;
+import com.google.gerrit.server.git.SearchingChangeCacheImpl;
+import com.google.gerrit.server.git.WorkQueue;
+import com.google.gerrit.server.group.PeriodicGroupIndexer;
+import com.google.gerrit.server.index.IndexModule;
+import com.google.gerrit.server.index.IndexModule.IndexType;
+import com.google.gerrit.server.index.OnlineUpgrader;
+import com.google.gerrit.server.index.VersionManager;
+import com.google.gerrit.server.mail.SignedTokenEmailTokenVerifier;
+import com.google.gerrit.server.mail.receive.MailReceiver;
+import com.google.gerrit.server.mail.send.SmtpEmailSender;
+import com.google.gerrit.server.mime.MimeUtil2Module;
+import com.google.gerrit.server.notedb.rebuild.NoteDbMigrator;
+import com.google.gerrit.server.notedb.rebuild.OnlineNoteDbMigrator;
+import com.google.gerrit.server.patch.DiffExecutorModule;
+import com.google.gerrit.server.permissions.DefaultPermissionBackendModule;
+import com.google.gerrit.server.plugins.PluginGuiceEnvironment;
+import com.google.gerrit.server.plugins.PluginModule;
+import com.google.gerrit.server.project.DefaultProjectNameLockManager;
+import com.google.gerrit.server.restapi.RestApiModule;
+import com.google.gerrit.server.schema.DataSourceProvider;
+import com.google.gerrit.server.schema.InMemoryAccountPatchReviewStore;
+import com.google.gerrit.server.schema.JdbcAccountPatchReviewStore;
+import com.google.gerrit.server.schema.SchemaVersionCheck;
+import com.google.gerrit.server.securestore.DefaultSecureStore;
+import com.google.gerrit.server.securestore.SecureStore;
+import com.google.gerrit.server.securestore.SecureStoreClassName;
+import com.google.gerrit.server.securestore.SecureStoreProvider;
+import com.google.gerrit.server.ssh.NoSshKeyCache;
+import com.google.gerrit.server.ssh.NoSshModule;
+import com.google.gerrit.server.ssh.SshAddressesModule;
+import com.google.gerrit.server.submit.LocalMergeSuperSetComputation;
+import com.google.gerrit.sshd.SshHostKeyModule;
+import com.google.gerrit.sshd.SshKeyCacheImpl;
+import com.google.gerrit.sshd.SshModule;
+import com.google.gerrit.sshd.commands.DefaultCommandModule;
+import com.google.gerrit.sshd.commands.IndexCommandsModule;
+import com.google.gerrit.sshd.plugin.LfsPluginAuthCommand;
+import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import com.google.inject.Module;
+import com.google.inject.Provider;
+import com.google.inject.Stage;
+import java.io.IOException;
+import java.lang.Thread.UncaughtExceptionHandler;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import javax.servlet.http.HttpServletRequest;
+import org.eclipse.jgit.lib.Config;
+import org.kohsuke.args4j.Option;
+import org.kohsuke.args4j.spi.ExplicitBooleanOptionHandler;
+
+/** Run SSH daemon portions of Gerrit. */
+public class Daemon extends SiteProgram {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  @Option(name = "--enable-httpd", usage = "Enable the internal HTTP daemon")
+  private Boolean httpd;
+
+  @Option(name = "--disable-httpd", usage = "Disable the internal HTTP daemon")
+  void setDisableHttpd(@SuppressWarnings("unused") boolean arg) {
+    httpd = false;
+  }
+
+  @Option(name = "--enable-sshd", usage = "Enable the internal SSH daemon")
+  private boolean sshd = true;
+
+  @Option(name = "--disable-sshd", usage = "Disable the internal SSH daemon")
+  void setDisableSshd(@SuppressWarnings("unused") boolean arg) {
+    sshd = false;
+  }
+
+  @Option(name = "--slave", usage = "Support fetch only")
+  private boolean slave;
+
+  @Option(name = "--console-log", usage = "Log to console (not $site_path/logs)")
+  private boolean consoleLog;
+
+  @Option(name = "-s", usage = "Start interactive shell")
+  private boolean inspector;
+
+  @Option(name = "--run-id", usage = "Cookie to store in $site_path/logs/gerrit.run")
+  private String runId;
+
+  @Option(name = "--headless", usage = "Don't start the UI frontend")
+  private boolean headless;
+
+  @Option(name = "--polygerrit-dev", usage = "Force PolyGerrit UI for development")
+  private boolean polyGerritDev;
+
+  @Option(
+      name = "--init",
+      aliases = {"-i"},
+      usage = "Init site before starting the daemon")
+  private boolean doInit;
+
+  @Option(name = "--stop-only", usage = "Stop the daemon", hidden = true)
+  private boolean stopOnly;
+
+  @Option(
+      name = "--migrate-to-note-db",
+      usage = "Automatically migrate changes to NoteDb",
+      handler = ExplicitBooleanOptionHandler.class)
+  private boolean migrateToNoteDb;
+
+  @Option(name = "--trial", usage = "(With --migrate-to-note-db) " + MigrateToNoteDb.TRIAL_USAGE)
+  private boolean trial;
+
+  private final LifecycleManager manager = new LifecycleManager();
+  private Injector dbInjector;
+  private Injector cfgInjector;
+  private Config config;
+  private Injector sysInjector;
+  private Injector sshInjector;
+  private Injector webInjector;
+  private Injector httpdInjector;
+  private Path runFile;
+  private boolean inMemoryTest;
+  private AbstractModule luceneModule;
+  private Module emailModule;
+  private List<Module> testSysModules = new ArrayList<>();
+  private Module auditEventModule;
+
+  private Runnable serverStarted;
+  private IndexType indexType;
+
+  public Daemon() {}
+
+  @VisibleForTesting
+  public Daemon(Runnable serverStarted, Path sitePath) {
+    super(sitePath);
+    this.serverStarted = serverStarted;
+  }
+
+  @VisibleForTesting
+  public void setEnableSshd(boolean enable) {
+    sshd = enable;
+  }
+
+  @VisibleForTesting
+  public boolean getEnableSshd() {
+    return sshd;
+  }
+
+  public void setEnableHttpd(boolean enable) {
+    httpd = enable;
+  }
+
+  public void setSlave(boolean slave) {
+    this.slave = slave;
+  }
+
+  @Override
+  public int run() throws Exception {
+    if (stopOnly) {
+      RuntimeShutdown.manualShutdown();
+      return 0;
+    }
+    if (doInit) {
+      try {
+        new Init(getSitePath()).run();
+      } catch (Exception e) {
+        throw die("Init failed", e);
+      }
+    }
+    mustHaveValidSite();
+    Thread.setDefaultUncaughtExceptionHandler(
+        new UncaughtExceptionHandler() {
+          @Override
+          public void uncaughtException(Thread t, Throwable e) {
+            logger.atSevere().withCause(e).log("Thread %s threw exception", t.getName());
+          }
+        });
+
+    if (runId != null) {
+      runFile = getSitePath().resolve("logs").resolve("gerrit.run");
+    }
+
+    if (httpd == null) {
+      httpd = !slave;
+    }
+
+    if (!httpd && !sshd) {
+      throw die("No services enabled, nothing to do");
+    }
+
+    try {
+      start();
+      RuntimeShutdown.add(
+          () -> {
+            logger.atInfo().log("caught shutdown, cleaning up");
+            stop();
+          });
+
+      logger.atInfo().log("Gerrit Code Review %s ready", myVersion());
+      if (runId != null) {
+        try {
+          Files.write(runFile, (runId + "\n").getBytes(UTF_8));
+          runFile.toFile().setReadable(true, false);
+        } catch (IOException err) {
+          logger.atWarning().withCause(err).log("Cannot write --run-id to %s", runFile);
+        }
+      }
+
+      if (serverStarted != null) {
+        serverStarted.run();
+      }
+
+      if (inspector) {
+        JythonShell shell = new JythonShell();
+        shell.set("m", manager);
+        shell.set("ds", dbInjector.getInstance(DataSourceProvider.class));
+        shell.set("schk", dbInjector.getInstance(SchemaVersionCheck.class));
+        shell.set("d", this);
+        shell.run();
+      } else {
+        RuntimeShutdown.waitFor();
+      }
+      return 0;
+    } catch (Throwable err) {
+      logger.atSevere().withCause(err).log("Unable to start daemon");
+      return 1;
+    }
+  }
+
+  @VisibleForTesting
+  public LifecycleManager getLifecycleManager() {
+    return manager;
+  }
+
+  @VisibleForTesting
+  public void setDatabaseForTesting(List<Module> modules) {
+    dbInjector = Guice.createInjector(Stage.PRODUCTION, modules);
+    inMemoryTest = true;
+    headless = true;
+  }
+
+  @VisibleForTesting
+  public void setEmailModuleForTesting(Module module) {
+    emailModule = module;
+  }
+
+  @VisibleForTesting
+  public void setAuditEventModuleForTesting(Module module) {
+    auditEventModule = module;
+  }
+
+  @VisibleForTesting
+  public void setLuceneModule(LuceneIndexModule m) {
+    luceneModule = m;
+    inMemoryTest = true;
+  }
+
+  @VisibleForTesting
+  public void addAdditionalSysModuleForTesting(@Nullable Module... modules) {
+    testSysModules.addAll(Arrays.asList(modules));
+  }
+
+  @VisibleForTesting
+  public void start() throws IOException {
+    if (dbInjector == null) {
+      dbInjector = createDbInjector(true /* enableMetrics */, MULTI_USER);
+    }
+    cfgInjector = createCfgInjector();
+    config = cfgInjector.getInstance(Key.get(Config.class, GerritServerConfig.class));
+    initIndexType();
+    sysInjector = createSysInjector();
+    sysInjector.getInstance(PluginGuiceEnvironment.class).setDbCfgInjector(dbInjector, cfgInjector);
+    manager.add(dbInjector, cfgInjector, sysInjector);
+
+    if (!consoleLog) {
+      manager.add(ErrorLogFile.start(getSitePath(), config));
+    }
+
+    sshd &= !sshdOff();
+    if (sshd) {
+      initSshd();
+    }
+
+    if (MoreObjects.firstNonNull(httpd, true)) {
+      initHttpd();
+    }
+
+    manager.start();
+  }
+
+  @VisibleForTesting
+  public void stop() {
+    if (runId != null) {
+      try {
+        Files.delete(runFile);
+      } catch (IOException err) {
+        logger.atWarning().withCause(err).log("failed to delete %s", runFile);
+      }
+    }
+    manager.stop();
+  }
+
+  @Override
+  protected GerritRuntime getGerritRuntime() {
+    return GerritRuntime.DAEMON;
+  }
+
+  private boolean sshdOff() {
+    return new SshAddressesModule().getListenAddresses(config).isEmpty();
+  }
+
+  private String myVersion() {
+    List<String> versionParts = new ArrayList<>();
+    if (slave) {
+      versionParts.add("[slave]");
+    }
+    if (headless) {
+      versionParts.add("[headless]");
+    }
+    versionParts.add(getVersion());
+    return Joiner.on(" ").join(versionParts);
+  }
+
+  private Injector createCfgInjector() {
+    final List<Module> modules = new ArrayList<>();
+    modules.add(new AuthConfigModule());
+    return dbInjector.createChildInjector(modules);
+  }
+
+  private Injector createSysInjector() {
+    final List<Module> modules = new ArrayList<>();
+    modules.add(SchemaVersionCheck.module());
+    modules.add(new DropWizardMetricMaker.RestModule());
+    modules.add(new LogFileCompressor.Module());
+
+    // Index module shutdown must happen before work queue shutdown, otherwise
+    // work queue can get stuck waiting on index futures that will never return.
+    modules.add(createIndexModule());
+
+    modules.add(new WorkQueue.Module());
+    modules.add(new StreamEventsApiListener.Module());
+    modules.add(new EventBroker.Module());
+    modules.add(
+        inMemoryTest
+            ? new InMemoryAccountPatchReviewStore.Module()
+            : new JdbcAccountPatchReviewStore.Module(config));
+    modules.add(new SysExecutorModule());
+    modules.add(new DiffExecutorModule());
+    modules.add(new MimeUtil2Module());
+    modules.add(cfgInjector.getInstance(GerritGlobalModule.class));
+    modules.add(new GerritApiModule());
+    modules.add(new PluginApiModule());
+
+    modules.add(new SearchingChangeCacheImpl.Module(slave));
+    modules.add(new InternalAccountDirectory.Module());
+    modules.add(new DefaultPermissionBackendModule());
+    modules.add(new DefaultMemoryCacheModule());
+    modules.add(new H2CacheModule());
+    modules.add(cfgInjector.getInstance(MailReceiver.Module.class));
+    if (emailModule != null) {
+      modules.add(emailModule);
+    } else {
+      modules.add(new SmtpEmailSender.Module());
+    }
+    if (auditEventModule != null) {
+      modules.add(auditEventModule);
+    } else {
+      modules.add(new AuditModule());
+    }
+    modules.add(new SignedTokenEmailTokenVerifier.Module());
+    modules.add(new PluginModule());
+    if (VersionManager.getOnlineUpgrade(config)
+        // Schema upgrade is handled by OnlineNoteDbMigrator in this case.
+        && !migrateToNoteDb()) {
+      modules.add(new OnlineUpgrader.Module());
+    }
+    modules.add(new RestApiModule());
+    modules.add(new GpgModule(config));
+    modules.add(new StartupChecks.Module());
+    modules.add(new GerritInstanceNameModule());
+    if (MoreObjects.firstNonNull(httpd, true)) {
+      modules.add(
+          new CanonicalWebUrlModule() {
+            @Override
+            protected Class<? extends Provider<String>> provider() {
+              return HttpCanonicalWebUrlProvider.class;
+            }
+          });
+    } else {
+      modules.add(
+          new CanonicalWebUrlModule() {
+            @Override
+            protected Class<? extends Provider<String>> provider() {
+              return CanonicalWebUrlProvider.class;
+            }
+          });
+    }
+    modules.add(new DefaultUrlFormatter.Module());
+    if (sshd) {
+      modules.add(SshKeyCacheImpl.module());
+    } else {
+      modules.add(NoSshKeyCache.module());
+    }
+    modules.add(
+        new AbstractModule() {
+          @Override
+          protected void configure() {
+            bind(GerritOptions.class)
+                .toInstance(new GerritOptions(config, headless, slave, polyGerritDev));
+            if (inMemoryTest) {
+              bind(String.class)
+                  .annotatedWith(SecureStoreClassName.class)
+                  .toInstance(DefaultSecureStore.class.getName());
+              bind(SecureStore.class).toProvider(SecureStoreProvider.class);
+            }
+          }
+        });
+    modules.add(new GarbageCollectionModule());
+    if (slave) {
+      modules.add(new PeriodicGroupIndexer.Module());
+    } else {
+      modules.add(new AccountDeactivator.Module());
+      modules.add(new ChangeCleanupRunner.Module());
+    }
+    if (migrateToNoteDb()) {
+      modules.add(new OnlineNoteDbMigrator.Module(trial));
+    }
+    modules.addAll(testSysModules);
+    modules.add(new LocalMergeSuperSetComputation.Module());
+    modules.add(new DefaultProjectNameLockManager.Module());
+    return cfgInjector.createChildInjector(
+        ModuleOverloader.override(modules, LibModuleLoader.loadModules(cfgInjector)));
+  }
+
+  private boolean migrateToNoteDb() {
+    return migrateToNoteDb || NoteDbMigrator.getAutoMigrate(requireNonNull(config));
+  }
+
+  private Module createIndexModule() {
+    if (luceneModule != null) {
+      return luceneModule;
+    }
+    switch (indexType) {
+      case LUCENE:
+        return LuceneIndexModule.latestVersion(slave);
+      case ELASTICSEARCH:
+        return ElasticIndexModule.latestVersion(slave);
+      default:
+        throw new IllegalStateException("unsupported index.type = " + indexType);
+    }
+  }
+
+  private void initIndexType() {
+    indexType = IndexModule.getIndexType(cfgInjector);
+    switch (indexType) {
+      case LUCENE:
+      case ELASTICSEARCH:
+        break;
+      default:
+        throw new IllegalStateException("unsupported index.type = " + indexType);
+    }
+  }
+
+  private void initSshd() {
+    sshInjector = createSshInjector();
+    sysInjector.getInstance(PluginGuiceEnvironment.class).setSshInjector(sshInjector);
+    manager.add(sshInjector);
+  }
+
+  private Injector createSshInjector() {
+    final List<Module> modules = new ArrayList<>();
+    modules.add(sysInjector.getInstance(SshModule.class));
+    if (!inMemoryTest) {
+      modules.add(new SshHostKeyModule());
+    }
+    modules.add(
+        new DefaultCommandModule(
+            slave,
+            sysInjector.getInstance(DownloadConfig.class),
+            sysInjector.getInstance(LfsPluginAuthCommand.Module.class)));
+    if (!slave) {
+      modules.add(new IndexCommandsModule(sysInjector));
+    }
+    return sysInjector.createChildInjector(modules);
+  }
+
+  private void initHttpd() {
+    webInjector = createWebInjector();
+
+    sysInjector.getInstance(PluginGuiceEnvironment.class).setHttpInjector(webInjector);
+
+    sysInjector
+        .getInstance(HttpCanonicalWebUrlProvider.class)
+        .setHttpServletRequest(webInjector.getProvider(HttpServletRequest.class));
+
+    httpdInjector = createHttpdInjector();
+    manager.add(webInjector, httpdInjector);
+  }
+
+  private Injector createWebInjector() {
+    final List<Module> modules = new ArrayList<>();
+    if (sshd) {
+      modules.add(new ProjectQoSFilter.Module());
+    }
+    modules.add(RequestContextFilter.module());
+    modules.add(RequestMetricsFilter.module());
+    modules.add(H2CacheBasedWebSession.module());
+    modules.add(sysInjector.getInstance(GerritAuthModule.class));
+    modules.add(sysInjector.getInstance(GitOverHttpModule.class));
+    modules.add(AllRequestFilter.module());
+    modules.add(sysInjector.getInstance(WebModule.class));
+    modules.add(sysInjector.getInstance(RequireSslFilter.Module.class));
+    modules.add(new HttpPluginModule());
+    if (sshd) {
+      modules.add(sshInjector.getInstance(WebSshGlueModule.class));
+    } else {
+      modules.add(new NoSshModule());
+    }
+
+    AuthConfig authConfig = cfgInjector.getInstance(AuthConfig.class);
+    if (authConfig.getAuthType() == AuthType.OPENID
+        || authConfig.getAuthType() == AuthType.OPENID_SSO) {
+      modules.add(new OpenIdModule());
+    } else if (authConfig.getAuthType() == AuthType.OAUTH) {
+      modules.add(new OAuthModule());
+    }
+    modules.add(sysInjector.getInstance(GetUserFilter.Module.class));
+
+    // StaticModule contains a "/*" wildcard, place it last.
+    GerritOptions opts = sysInjector.getInstance(GerritOptions.class);
+    if (opts.enableMasterFeatures()) {
+      modules.add(sysInjector.getInstance(StaticModule.class));
+    }
+
+    return sysInjector.createChildInjector(modules);
+  }
+
+  private Injector createHttpdInjector() {
+    final List<Module> modules = new ArrayList<>();
+    modules.add(new JettyModule(new JettyEnv(webInjector)));
+    return webInjector.createChildInjector(modules);
+  }
+}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Gsql.java b/java/com/google/gerrit/pgm/Gsql.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/Gsql.java
rename to java/com/google/gerrit/pgm/Gsql.java
diff --git a/java/com/google/gerrit/pgm/Init.java b/java/com/google/gerrit/pgm/Init.java
new file mode 100644
index 0000000..4ea31da
--- /dev/null
+++ b/java/com/google/gerrit/pgm/Init.java
@@ -0,0 +1,281 @@
+// Copyright (C) 2009 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.google.gerrit.pgm;
+
+import static java.util.stream.Collectors.joining;
+
+import com.google.common.base.Joiner;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Sets;
+import com.google.gerrit.common.IoUtil;
+import com.google.gerrit.common.PageLinks;
+import com.google.gerrit.common.PluginData;
+import com.google.gerrit.index.project.ProjectSchemaDefinitions;
+import com.google.gerrit.pgm.init.BaseInit;
+import com.google.gerrit.pgm.init.Browser;
+import com.google.gerrit.pgm.init.InitPlugins;
+import com.google.gerrit.pgm.init.api.ConsoleUI;
+import com.google.gerrit.pgm.util.ErrorLogFile;
+import com.google.gerrit.server.config.GerritServerConfigModule;
+import com.google.gerrit.server.config.SitePath;
+import com.google.gerrit.server.ioutil.HostPlatform;
+import com.google.gerrit.server.securestore.SecureStoreClassName;
+import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Inject;
+import com.google.inject.Module;
+import com.google.inject.util.Providers;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import org.kohsuke.args4j.Option;
+
+/** Initialize a new Gerrit installation. */
+public class Init extends BaseInit {
+  @Option(
+      name = "--batch",
+      aliases = {"-b"},
+      usage = "Batch mode; skip interactive prompting")
+  private boolean batchMode;
+
+  @Option(name = "--delete-caches", usage = "Delete all persistent caches without asking")
+  private boolean deleteCaches;
+
+  @Option(name = "--no-auto-start", usage = "Don't automatically start daemon after init")
+  private boolean noAutoStart;
+
+  @Option(name = "--no-reindex", usage = "Don't automatically reindex any entities")
+  private boolean noReindex;
+
+  @Option(name = "--skip-plugins", usage = "Don't install plugins")
+  private boolean skipPlugins;
+
+  @Option(name = "--list-plugins", usage = "List available plugins")
+  private boolean listPlugins;
+
+  @Option(name = "--install-plugin", usage = "Install given plugin without asking")
+  private List<String> installPlugins;
+
+  @Option(name = "--install-all-plugins", usage = "Install all plugins from war without asking")
+  private boolean installAllPlugins;
+
+  @Option(
+      name = "--secure-store-lib",
+      usage = "Path to jar providing SecureStore implementation class")
+  private String secureStoreLib;
+
+  @Option(name = "--dev", usage = "Setup site with default options suitable for developers")
+  private boolean dev;
+
+  @Option(name = "--skip-all-downloads", usage = "Don't download libraries")
+  private boolean skipAllDownloads;
+
+  @Option(name = "--skip-download", usage = "Don't download given library")
+  private List<String> skippedDownloads;
+
+  @Inject Browser browser;
+
+  public Init() {
+    super(new WarDistribution(), null);
+  }
+
+  public Init(Path sitePath) {
+    super(sitePath, true, true, new WarDistribution(), null);
+    batchMode = true;
+    noAutoStart = true;
+  }
+
+  @Override
+  protected boolean beforeInit(SiteInit init) throws Exception {
+    ErrorLogFile.errorOnlyConsole();
+
+    if (!skipPlugins) {
+      final List<PluginData> plugins =
+          InitPlugins.listPluginsAndRemoveTempFiles(init.site, pluginsDistribution);
+      ConsoleUI ui = ConsoleUI.getInstance(false);
+      if (installAllPlugins && !nullOrEmpty(installPlugins)) {
+        ui.message("Cannot use --install-plugin together with --install-all-plugins.\n");
+        return true;
+      }
+      verifyInstallPluginList(ui, plugins);
+      if (listPlugins) {
+        if (!plugins.isEmpty()) {
+          ui.message("Available plugins:\n");
+          for (PluginData plugin : plugins) {
+            ui.message(" * %s version %s\n", plugin.name, plugin.version);
+          }
+        } else {
+          ui.message("No plugins found.\n");
+        }
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @Override
+  protected void afterInit(SiteRun run) throws Exception {
+    List<Module> modules = new ArrayList<>();
+    modules.add(
+        new AbstractModule() {
+          @Override
+          protected void configure() {
+            bind(Path.class).annotatedWith(SitePath.class).toInstance(getSitePath());
+            bind(Browser.class);
+            bind(String.class)
+                .annotatedWith(SecureStoreClassName.class)
+                .toProvider(Providers.of(getConfiguredSecureStoreClass()));
+          }
+        });
+    modules.add(new GerritServerConfigModule());
+    Guice.createInjector(modules).injectMembers(this);
+    reindexProjects();
+    start(run);
+  }
+
+  @Override
+  protected List<String> getInstallPlugins() {
+    return installPlugins;
+  }
+
+  @Override
+  protected boolean installAllPlugins() {
+    return installAllPlugins;
+  }
+
+  @Override
+  protected ConsoleUI getConsoleUI() {
+    return ConsoleUI.getInstance(batchMode);
+  }
+
+  @Override
+  protected boolean getAutoStart() {
+    return !noAutoStart;
+  }
+
+  @Override
+  protected boolean getDeleteCaches() {
+    return deleteCaches;
+  }
+
+  @Override
+  protected boolean skipPlugins() {
+    return skipPlugins;
+  }
+
+  @Override
+  protected boolean isDev() {
+    return dev;
+  }
+
+  @Override
+  protected boolean skipAllDownloads() {
+    return skipAllDownloads;
+  }
+
+  @Override
+  protected List<String> getSkippedDownloads() {
+    return skippedDownloads != null ? skippedDownloads : Collections.<String>emptyList();
+  }
+
+  @Override
+  protected String getSecureStoreLib() {
+    return secureStoreLib;
+  }
+
+  void start(SiteRun run) throws Exception {
+    if (run.flags.autoStart) {
+      if (HostPlatform.isWin32()) {
+        System.err.println("Automatic startup not supported on Win32.");
+      } else {
+        startDaemon(run);
+        if (!run.ui.isBatch()) {
+          browser.open(PageLinks.ADMIN_PROJECTS);
+        }
+      }
+    }
+  }
+
+  void startDaemon(SiteRun run) {
+    String[] argv = {run.site.gerrit_sh.toAbsolutePath().toString(), "start"};
+    Process proc;
+    try {
+      System.err.println("Executing " + argv[0] + " " + argv[1]);
+      proc = Runtime.getRuntime().exec(argv);
+    } catch (IOException e) {
+      System.err.println("error: cannot start Gerrit: " + e.getMessage());
+      return;
+    }
+
+    try {
+      proc.getOutputStream().close();
+    } catch (IOException e) {
+      // Ignored
+    }
+
+    IoUtil.copyWithThread(proc.getInputStream(), System.err);
+    IoUtil.copyWithThread(proc.getErrorStream(), System.err);
+
+    for (; ; ) {
+      try {
+        int rc = proc.waitFor();
+        if (rc != 0) {
+          System.err.println("error: cannot start Gerrit: exit status " + rc);
+        }
+        break;
+      } catch (InterruptedException e) {
+        // retry
+      }
+    }
+  }
+
+  private void verifyInstallPluginList(ConsoleUI ui, List<PluginData> plugins) {
+    if (nullOrEmpty(installPlugins)) {
+      return;
+    }
+    Set<String> missing = Sets.newHashSet(installPlugins);
+    plugins.stream().forEach(p -> missing.remove(p.name));
+    if (!missing.isEmpty()) {
+      ui.message("Cannot find plugin(s): %s\n", Joiner.on(", ").join(missing));
+      listPlugins = true;
+    }
+  }
+
+  private void reindexProjects() throws Exception {
+    if (noReindex) {
+      return;
+    }
+    // Reindex all projects, so that we bootstrap the project index for new installations
+    List<String> reindexArgs =
+        ImmutableList.of(
+            "--site-path",
+            getSitePath().toString(),
+            "--threads",
+            Integer.toString(1),
+            "--index",
+            ProjectSchemaDefinitions.NAME);
+    getConsoleUI().message("Init complete, reindexing projects with:");
+    getConsoleUI().message(" reindex " + reindexArgs.stream().collect(joining(" ")));
+    Reindex reindexPgm = new Reindex();
+    reindexPgm.main(reindexArgs.stream().toArray(String[]::new));
+  }
+
+  private static boolean nullOrEmpty(List<?> list) {
+    return list == null || list.isEmpty();
+  }
+}
diff --git a/java/com/google/gerrit/pgm/JythonShell.java b/java/com/google/gerrit/pgm/JythonShell.java
new file mode 100644
index 0000000..88f7b5d
--- /dev/null
+++ b/java/com/google/gerrit/pgm/JythonShell.java
@@ -0,0 +1,229 @@
+// Copyright (C) 2013 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.google.gerrit.pgm;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.launcher.GerritLauncher;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.ArrayList;
+import java.util.Properties;
+
+public class JythonShell {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final String STARTUP_RESOURCE = "com/google/gerrit/pgm/Startup.py";
+  private static final String STARTUP_FILE = "Startup.py";
+
+  private Class<?> console;
+  private Class<?> pyObject;
+  private Class<?> pySystemState;
+  private Object shell;
+  private ArrayList<String> injectedVariables;
+
+  public JythonShell() {
+    Properties env = new Properties();
+    // Let us inspect private class members
+    env.setProperty("python.security.respectJavaAccessibility", "false");
+
+    File home = GerritLauncher.getHomeDirectory();
+    if (home != null) {
+      env.setProperty("python.cachedir", new File(home, "jythoncache").getPath());
+    }
+
+    // For package introspection and "import com.google" to work,
+    // Jython needs to inspect actual .jar files (not just classloader)
+    StringBuilder classPath = new StringBuilder();
+    final ClassLoader cl = getClass().getClassLoader();
+    if (cl instanceof java.net.URLClassLoader) {
+      @SuppressWarnings("resource")
+      URLClassLoader ucl = (URLClassLoader) cl;
+      for (URL u : ucl.getURLs()) {
+        if ("file".equals(u.getProtocol())) {
+          if (classPath.length() > 0) {
+            classPath.append(java.io.File.pathSeparatorChar);
+          }
+          classPath.append(u.getFile());
+        }
+      }
+    }
+    env.setProperty("java.class.path", classPath.toString());
+
+    console = findClass("org.python.util.InteractiveConsole");
+    pyObject = findClass("org.python.core.PyObject");
+    pySystemState = findClass("org.python.core.PySystemState");
+
+    runMethod(
+        pySystemState,
+        pySystemState,
+        "initialize",
+        new Class<?>[] {Properties.class, Properties.class},
+        new Object[] {null, env});
+
+    try {
+      shell = console.getConstructor(new Class<?>[] {}).newInstance();
+      logger.atInfo().log("Jython shell instance created.");
+    } catch (InstantiationException
+        | IllegalAccessException
+        | IllegalArgumentException
+        | InvocationTargetException
+        | NoSuchMethodException
+        | SecurityException e) {
+      throw noInterpreter(e);
+    }
+    injectedVariables = new ArrayList<>();
+    set("Shell", this);
+  }
+
+  protected Object runMethod0(
+      Class<?> klazz, Object instance, String name, Class<?>[] sig, Object[] args)
+      throws InvocationTargetException {
+    try {
+      Method m;
+      m = klazz.getMethod(name, sig);
+      return m.invoke(instance, args);
+    } catch (NoSuchMethodException
+        | IllegalAccessException
+        | IllegalArgumentException
+        | SecurityException e) {
+      throw cannotStart(e);
+    }
+  }
+
+  protected Object runMethod(
+      Class<?> klazz, Object instance, String name, Class<?>[] sig, Object[] args) {
+    try {
+      return runMethod0(klazz, instance, name, sig, args);
+    } catch (InvocationTargetException e) {
+      throw cannotStart(e);
+    }
+  }
+
+  protected Object runInterpreter(String name, Class<?>[] sig, Object[] args) {
+    return runMethod(console, shell, name, sig, args);
+  }
+
+  protected String getDefaultBanner() {
+    return (String) runInterpreter("getDefaultBanner", new Class<?>[] {}, new Object[] {});
+  }
+
+  protected void printInjectedVariable(String id) {
+    runInterpreter(
+        "exec",
+        new Class<?>[] {String.class},
+        new Object[] {"print '\"%s\" is \"%s\"' % (\"" + id + "\", " + id + ")"});
+  }
+
+  public void run() {
+    for (String key : injectedVariables) {
+      printInjectedVariable(key);
+    }
+    reload();
+    runInterpreter(
+        "interact",
+        new Class<?>[] {String.class, pyObject},
+        new Object[] {
+          getDefaultBanner()
+              + " running for Gerrit "
+              + com.google.gerrit.common.Version.getVersion(),
+          null,
+        });
+  }
+
+  public void set(String key, Object content) {
+    runInterpreter("set", new Class<?>[] {String.class, Object.class}, new Object[] {key, content});
+    injectedVariables.add(key);
+  }
+
+  private static Class<?> findClass(String klazzname) {
+    try {
+      return Class.forName(klazzname);
+    } catch (ClassNotFoundException e) {
+      throw noShell("Class " + klazzname + " not found", e);
+    }
+  }
+
+  public void reload() {
+    execResource(STARTUP_RESOURCE);
+    execFile(GerritLauncher.getHomeDirectory(), STARTUP_FILE);
+  }
+
+  protected void execResource(String p) {
+    try (InputStream in = JythonShell.class.getClassLoader().getResourceAsStream(p)) {
+      if (in != null) {
+        execStream(in, "resource " + p);
+      } else {
+        logger.atSevere().log("Cannot load resource %s", p);
+      }
+    } catch (IOException e) {
+      logger.atSevere().withCause(e).log(e.getMessage());
+    }
+  }
+
+  protected void execFile(File parent, String p) {
+    try {
+      File script = new File(parent, p);
+      if (script.canExecute()) {
+        runMethod0(
+            console,
+            shell,
+            "execfile",
+            new Class<?>[] {String.class},
+            new Object[] {script.getAbsolutePath()});
+      } else {
+        logger.atInfo().log(
+            "User initialization file %s is not found or not executable", script.getAbsolutePath());
+      }
+    } catch (InvocationTargetException e) {
+      logger.atSevere().withCause(e).log("Exception occurred while loading file %s", p);
+    } catch (SecurityException e) {
+      logger.atSevere().withCause(e).log("SecurityException occurred while loading file %s", p);
+    }
+  }
+
+  protected void execStream(InputStream in, String p) {
+    try {
+      runMethod0(
+          console,
+          shell,
+          "execfile",
+          new Class<?>[] {InputStream.class, String.class},
+          new Object[] {in, p});
+    } catch (InvocationTargetException e) {
+      logger.atSevere().withCause(e).log("Exception occurred while loading %s", p);
+    }
+  }
+
+  private static UnsupportedOperationException noShell(String m, Throwable why) {
+    final String prefix = "Cannot create Jython shell: ";
+    final String postfix = "\n     (You might need to install jython.jar in the lib directory)";
+    return new UnsupportedOperationException(prefix + m + postfix, why);
+  }
+
+  private static UnsupportedOperationException noInterpreter(Throwable why) {
+    final String msg = "Cannot create Python interpreter";
+    return noShell(msg, why);
+  }
+
+  private static UnsupportedOperationException cannotStart(Throwable why) {
+    final String msg = "Cannot start Jython shell";
+    return new UnsupportedOperationException(msg, why);
+  }
+}
diff --git a/java/com/google/gerrit/pgm/LocalUsernamesToLowerCase.java b/java/com/google/gerrit/pgm/LocalUsernamesToLowerCase.java
new file mode 100644
index 0000000..5bfc00f
--- /dev/null
+++ b/java/com/google/gerrit/pgm/LocalUsernamesToLowerCase.java
@@ -0,0 +1,129 @@
+// Copyright (C) 2011 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.google.gerrit.pgm;
+
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_GERRIT;
+import static com.google.gerrit.server.schema.DataSourceProvider.Context.MULTI_USER;
+
+import com.google.gerrit.extensions.config.FactoryModule;
+import com.google.gerrit.lifecycle.LifecycleManager;
+import com.google.gerrit.pgm.util.SiteProgram;
+import com.google.gerrit.server.account.externalids.DisabledExternalIdCache;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.account.externalids.ExternalIdNotes;
+import com.google.gerrit.server.account.externalids.ExternalIds;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.index.account.AccountSchemaDefinitions;
+import com.google.gerrit.server.schema.SchemaVersionCheck;
+import com.google.gwtorm.server.OrmDuplicateKeyException;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Locale;
+import org.eclipse.jgit.lib.ProgressMonitor;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.lib.TextProgressMonitor;
+
+/** Converts the local username for all accounts to lower case */
+public class LocalUsernamesToLowerCase extends SiteProgram {
+  private final LifecycleManager manager = new LifecycleManager();
+  private final TextProgressMonitor monitor = new TextProgressMonitor();
+
+  @Inject private GitRepositoryManager repoManager;
+  @Inject private AllUsersName allUsersName;
+  @Inject private Provider<MetaDataUpdate.Server> metaDataUpdateServerFactory;
+  @Inject private ExternalIdNotes.FactoryNoReindex externalIdNotesFactory;
+  @Inject private ExternalIds externalIds;
+
+  @Override
+  public int run() throws Exception {
+    Injector dbInjector = createDbInjector(MULTI_USER);
+    manager.add(dbInjector, dbInjector.createChildInjector(SchemaVersionCheck.module()));
+    manager.start();
+    dbInjector
+        .createChildInjector(
+            new FactoryModule() {
+              @Override
+              protected void configure() {
+                bind(GitReferenceUpdated.class).toInstance(GitReferenceUpdated.DISABLED);
+                factory(MetaDataUpdate.InternalFactory.class);
+
+                // The LocalUsernamesToLowerCase program needs to access all external IDs only
+                // once to update them. After the update they are not accessed again. Hence the
+                // LocalUsernamesToLowerCase program doesn't benefit from caching external IDs and
+                // the external ID cache can be disabled.
+                install(DisabledExternalIdCache.module());
+              }
+            })
+        .injectMembers(this);
+
+    Collection<ExternalId> todo = externalIds.all();
+    monitor.beginTask("Converting local usernames", todo.size());
+
+    try (Repository repo = repoManager.openRepository(allUsersName)) {
+      ExternalIdNotes extIdNotes = externalIdNotesFactory.load(repo);
+      for (ExternalId extId : todo) {
+        convertLocalUserToLowerCase(extIdNotes, extId);
+        monitor.update(1);
+      }
+      try (MetaDataUpdate metaDataUpdate = metaDataUpdateServerFactory.get().create(allUsersName)) {
+        metaDataUpdate.setMessage("Convert local usernames to lower case");
+        extIdNotes.commit(metaDataUpdate);
+      }
+    }
+
+    monitor.endTask();
+
+    int exitCode = reindexAccounts();
+    manager.stop();
+    return exitCode;
+  }
+
+  private void convertLocalUserToLowerCase(ExternalIdNotes extIdNotes, ExternalId extId)
+      throws OrmDuplicateKeyException, IOException {
+    if (extId.isScheme(SCHEME_GERRIT)) {
+      String localUser = extId.key().id();
+      String localUserLowerCase = localUser.toLowerCase(Locale.US);
+      if (!localUser.equals(localUserLowerCase)) {
+        ExternalId extIdLowerCase =
+            ExternalId.create(
+                SCHEME_GERRIT,
+                localUserLowerCase,
+                extId.accountId(),
+                extId.email(),
+                extId.password());
+        extIdNotes.replace(extId, extIdLowerCase);
+      }
+    }
+  }
+
+  private int reindexAccounts() throws Exception {
+    monitor.beginTask("Reindex accounts", ProgressMonitor.UNKNOWN);
+    String[] reindexArgs = {
+      "--site-path", getSitePath().toString(), "--index", AccountSchemaDefinitions.NAME
+    };
+    System.out.println("Migration complete, reindexing accounts with:");
+    System.out.println("  reindex " + String.join(" ", reindexArgs));
+    Reindex reindexPgm = new Reindex();
+    int exitCode = reindexPgm.main(reindexArgs);
+    monitor.endTask();
+    return exitCode;
+  }
+}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Ls.java b/java/com/google/gerrit/pgm/Ls.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/Ls.java
rename to java/com/google/gerrit/pgm/Ls.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/MigrateAccountPatchReviewDb.java b/java/com/google/gerrit/pgm/MigrateAccountPatchReviewDb.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/MigrateAccountPatchReviewDb.java
rename to java/com/google/gerrit/pgm/MigrateAccountPatchReviewDb.java
diff --git a/java/com/google/gerrit/pgm/MigrateToNoteDb.java b/java/com/google/gerrit/pgm/MigrateToNoteDb.java
new file mode 100644
index 0000000..09422b2
--- /dev/null
+++ b/java/com/google/gerrit/pgm/MigrateToNoteDb.java
@@ -0,0 +1,228 @@
+// Copyright (C) 2014 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.google.gerrit.pgm;
+
+import static com.google.common.base.MoreObjects.firstNonNull;
+import static com.google.gerrit.server.schema.DataSourceProvider.Context.MULTI_USER;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.stream.Collectors.joining;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.extensions.config.FactoryModule;
+import com.google.gerrit.lifecycle.LifecycleManager;
+import com.google.gerrit.pgm.util.BatchProgramModule;
+import com.google.gerrit.pgm.util.RuntimeShutdown;
+import com.google.gerrit.pgm.util.SiteProgram;
+import com.google.gerrit.pgm.util.ThreadLimiter;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.git.GarbageCollection;
+import com.google.gerrit.server.index.DummyIndexModule;
+import com.google.gerrit.server.index.change.ChangeSchemaDefinitions;
+import com.google.gerrit.server.notedb.rebuild.GcAllUsers;
+import com.google.gerrit.server.notedb.rebuild.NoteDbMigrator;
+import com.google.gerrit.server.plugins.PluginGuiceEnvironment;
+import com.google.gerrit.server.schema.DataSourceType;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Provider;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.List;
+import org.kohsuke.args4j.Option;
+import org.kohsuke.args4j.spi.ExplicitBooleanOptionHandler;
+
+public class MigrateToNoteDb extends SiteProgram {
+  static final String TRIAL_USAGE =
+      "Trial mode: migrate changes and turn on reading from NoteDb, but leave ReviewDb as the"
+          + " source of truth";
+
+  private static final int ISSUE_8022_THREAD_LIMIT = 4;
+
+  @Option(name = "--threads", usage = "Number of threads to use for rebuilding NoteDb")
+  private Integer threads;
+
+  @Option(
+      name = "--project",
+      usage =
+          "Only rebuild these projects, do no other migration; incompatible with --change"
+              + " and --skip-project; recommended for debugging only")
+  private List<String> projects = new ArrayList<>();
+
+  @Option(
+      name = "--skip-project",
+      usage = "Rebuild all projects except these; incompatible with the --project and --change")
+  private List<String> skipProjects = new ArrayList<>();
+
+  @Option(
+      name = "--change",
+      usage =
+          "Only rebuild these changes, do no other migration; incompatible with --project and"
+              + " --skip-project; recommended for debugging only")
+  private List<Integer> changes = new ArrayList<>();
+
+  @Option(
+      name = "--force",
+      usage =
+          "Force rebuilding changes where ReviewDb is still the source of truth, even if they"
+              + " were previously migrated")
+  private boolean force;
+
+  @Option(name = "--trial", usage = TRIAL_USAGE)
+  private boolean trial;
+
+  @Option(
+      name = "--sequence-gap",
+      usage =
+          "gap in change sequence numbers between last ReviewDb number and first NoteDb number;"
+              + " negative indicates using the value of noteDb.changes.initialSequenceGap (default"
+              + " 1000)")
+  private int sequenceGap;
+
+  @Option(
+      name = "--reindex",
+      usage =
+          "Reindex all changes after migration; defaults to false in trial mode, true otherwise",
+      handler = ExplicitBooleanOptionHandler.class)
+  private Boolean reindex;
+
+  private Injector dbInjector;
+  private Injector sysInjector;
+  private LifecycleManager dbManager;
+  private LifecycleManager sysManager;
+
+  @Inject private GcAllUsers gcAllUsers;
+  @Inject private Provider<NoteDbMigrator.Builder> migratorBuilderProvider;
+
+  @Override
+  public int run() throws Exception {
+    RuntimeShutdown.add(this::stop);
+    try {
+      mustHaveValidSite();
+      dbInjector = createDbInjector(MULTI_USER);
+
+      dbManager = new LifecycleManager();
+      dbManager.add(dbInjector);
+      dbManager.start();
+
+      threads = limitThreads();
+
+      sysInjector = createSysInjector();
+      sysInjector.injectMembers(this);
+      sysManager = new LifecycleManager();
+      sysManager.add(sysInjector);
+      sysInjector
+          .getInstance(PluginGuiceEnvironment.class)
+          .setDbCfgInjector(dbInjector, dbInjector);
+      sysManager.start();
+
+      try (NoteDbMigrator migrator =
+          migratorBuilderProvider
+              .get()
+              .setThreads(threads)
+              .setProgressOut(System.err)
+              .setProjects(projects.stream().map(Project.NameKey::new).collect(toList()))
+              .setSkipProjects(skipProjects.stream().map(Project.NameKey::new).collect(toList()))
+              .setChanges(changes.stream().map(Change.Id::new).collect(toList()))
+              .setTrialMode(trial)
+              .setForceRebuild(force)
+              .setSequenceGap(sequenceGap)
+              .build()) {
+        if (!projects.isEmpty() || !changes.isEmpty() || !skipProjects.isEmpty()) {
+          migrator.rebuild();
+        } else {
+          migrator.migrate();
+        }
+      }
+      try (PrintWriter w = new PrintWriter(new OutputStreamWriter(System.out, UTF_8), true)) {
+        gcAllUsers.run(w);
+      }
+    } finally {
+      stop();
+    }
+
+    boolean reindex = firstNonNull(this.reindex, !trial);
+    if (!reindex) {
+      return 0;
+    }
+    // Reindex all indices, to save the user from having to run yet another program by hand while
+    // their server is offline.
+    List<String> reindexArgs =
+        ImmutableList.of(
+            "--site-path",
+            getSitePath().toString(),
+            "--threads",
+            Integer.toString(threads),
+            "--index",
+            ChangeSchemaDefinitions.NAME);
+    System.out.println("Migration complete, reindexing changes with:");
+    System.out.println("  reindex " + reindexArgs.stream().collect(joining(" ")));
+    Reindex reindexPgm = new Reindex();
+    return reindexPgm.main(reindexArgs.stream().toArray(String[]::new));
+  }
+
+  private int limitThreads() {
+    if (threads != null) {
+      return threads;
+    }
+    int actualThreads;
+    int procs = Runtime.getRuntime().availableProcessors();
+    DataSourceType dsType = dbInjector.getInstance(DataSourceType.class);
+    if (dsType.getDriver().equals("org.h2.Driver") && procs > ISSUE_8022_THREAD_LIMIT) {
+      System.out.println(
+          "Not using more than "
+              + ISSUE_8022_THREAD_LIMIT
+              + " threads due to http://crbug.com/gerrit/8022");
+      System.out.println("Can be increased by passing --threads, but may cause errors");
+      actualThreads = ISSUE_8022_THREAD_LIMIT;
+    } else {
+      actualThreads = procs;
+    }
+    actualThreads = ThreadLimiter.limitThreads(dbInjector, actualThreads);
+    return actualThreads;
+  }
+
+  private Injector createSysInjector() {
+    return dbInjector.createChildInjector(
+        new FactoryModule() {
+          @Override
+          public void configure() {
+            install(dbInjector.getInstance(BatchProgramModule.class));
+            install(new DummyIndexModule());
+            factory(ChangeResource.Factory.class);
+            factory(GarbageCollection.Factory.class);
+          }
+        });
+  }
+
+  private void stop() {
+    try {
+      LifecycleManager m = sysManager;
+      sysManager = null;
+      if (m != null) {
+        m.stop();
+      }
+    } finally {
+      LifecycleManager m = dbManager;
+      dbManager = null;
+      if (m != null) {
+        m.stop();
+      }
+    }
+  }
+}
diff --git a/java/com/google/gerrit/pgm/Passwd.java b/java/com/google/gerrit/pgm/Passwd.java
new file mode 100644
index 0000000..f63d2f4
--- /dev/null
+++ b/java/com/google/gerrit/pgm/Passwd.java
@@ -0,0 +1,90 @@
+// Copyright (C) 2017 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.google.gerrit.pgm;
+
+import com.google.common.base.Splitter;
+import com.google.gerrit.extensions.config.FactoryModule;
+import com.google.gerrit.pgm.init.api.ConsoleUI;
+import com.google.gerrit.pgm.init.api.InstallAllPlugins;
+import com.google.gerrit.pgm.init.api.InstallPlugins;
+import com.google.gerrit.pgm.init.api.Section;
+import com.google.gerrit.pgm.util.SiteProgram;
+import com.google.gerrit.server.config.GerritServerConfigModule;
+import com.google.gerrit.server.config.SitePath;
+import com.google.gerrit.server.securestore.SecureStoreClassName;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Module;
+import com.google.inject.TypeLiteral;
+import com.google.inject.util.Providers;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+import org.kohsuke.args4j.Argument;
+
+public class Passwd extends SiteProgram {
+  private String section;
+  private String key;
+
+  @Argument(
+      metaVar = "SECTION.KEY",
+      index = 0,
+      required = true,
+      usage = "Section and key separated by a dot of the password to set")
+  private String sectionAndKey;
+
+  @Argument(metaVar = "PASSWORD", index = 1, required = false, usage = "Password to set")
+  private String password;
+
+  private void init() {
+    List<String> varParts = Splitter.on('.').splitToList(sectionAndKey);
+    if (varParts.size() != 2) {
+      throw new IllegalArgumentException(
+          "Invalid name '" + sectionAndKey + "': expected section.key format");
+    }
+    section = varParts.get(0);
+    key = varParts.get(1);
+  }
+
+  @Override
+  public int run() throws Exception {
+    init();
+    SetPasswd setPasswd = getSysInjector().getInstance(SetPasswd.class);
+    setPasswd.run(section, key, password);
+    return 0;
+  }
+
+  private Injector getSysInjector() {
+    List<Module> modules = new ArrayList<>();
+    modules.add(
+        new FactoryModule() {
+          @Override
+          protected void configure() {
+            bind(Path.class).annotatedWith(SitePath.class).toInstance(getSitePath());
+            bind(ConsoleUI.class).toInstance(ConsoleUI.getInstance(password != null));
+            factory(Section.Factory.class);
+            bind(Boolean.class).annotatedWith(InstallAllPlugins.class).toInstance(Boolean.FALSE);
+            bind(new TypeLiteral<List<String>>() {})
+                .annotatedWith(InstallPlugins.class)
+                .toInstance(new ArrayList<String>());
+            bind(String.class)
+                .annotatedWith(SecureStoreClassName.class)
+                .toProvider(Providers.of(getConfiguredSecureStoreClass()));
+          }
+        });
+    modules.add(new GerritServerConfigModule());
+    return Guice.createInjector(modules);
+  }
+}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/PrologShell.java b/java/com/google/gerrit/pgm/PrologShell.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/PrologShell.java
rename to java/com/google/gerrit/pgm/PrologShell.java
diff --git a/java/com/google/gerrit/pgm/ProtobufImport.java b/java/com/google/gerrit/pgm/ProtobufImport.java
new file mode 100644
index 0000000..0179b1d
--- /dev/null
+++ b/java/com/google/gerrit/pgm/ProtobufImport.java
@@ -0,0 +1,146 @@
+// Copyright (C) 2015 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.google.gerrit.pgm;
+
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.gerrit.server.schema.DataSourceProvider.Context.SINGLE_USER;
+import static java.util.Objects.requireNonNull;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.Iterables;
+import com.google.gerrit.lifecycle.LifecycleManager;
+import com.google.gerrit.pgm.util.RuntimeShutdown;
+import com.google.gerrit.pgm.util.SiteProgram;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gwtorm.protobuf.CodecFactory;
+import com.google.gwtorm.protobuf.ProtobufCodec;
+import com.google.gwtorm.schema.RelationModel;
+import com.google.gwtorm.schema.java.JavaSchemaModel;
+import com.google.gwtorm.server.Access;
+import com.google.gwtorm.server.OrmDuplicateKeyException;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.protobuf.ByteString;
+import com.google.protobuf.Parser;
+import com.google.protobuf.UnknownFieldSet;
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.InputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.nio.file.Files;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.jgit.lib.ProgressMonitor;
+import org.eclipse.jgit.lib.TextProgressMonitor;
+import org.kohsuke.args4j.Option;
+
+/**
+ * Import data from a protocol buffer dump into the database.
+ *
+ * <p>Takes as input a file containing protocol buffers concatenated together with varint length
+ * encoding, as in {@link Parser#parseDelimitedFrom(InputStream)}. Each message contains a single
+ * field with a tag corresponding to the relation ID in the {@link
+ * com.google.gwtorm.server.Relation} annotation.
+ *
+ * <p><strong>Warning</strong>: This method blindly upserts data into the database. It should only
+ * be used to restore a protobuf-formatted backup into a new, empty site.
+ */
+public class ProtobufImport extends SiteProgram {
+  @Option(
+      name = "--file",
+      aliases = {"-f"},
+      required = true,
+      metaVar = "FILE",
+      usage = "File to import from")
+  private File file;
+
+  private final LifecycleManager manager = new LifecycleManager();
+  private final Map<Integer, Relation> relations = new HashMap<>();
+
+  @Inject private SchemaFactory<ReviewDb> schemaFactory;
+
+  @Override
+  public int run() throws Exception {
+    mustHaveValidSite();
+
+    Injector dbInjector = createDbInjector(SINGLE_USER);
+    manager.add(dbInjector);
+    manager.start();
+    RuntimeShutdown.add(manager::stop);
+    dbInjector.injectMembers(this);
+
+    ProgressMonitor progress = new TextProgressMonitor();
+    progress.beginTask("Importing entities", ProgressMonitor.UNKNOWN);
+    try (ReviewDb db = schemaFactory.open()) {
+      for (RelationModel model : new JavaSchemaModel(ReviewDb.class).getRelations()) {
+        relations.put(model.getRelationID(), Relation.create(model, db));
+      }
+
+      Parser<UnknownFieldSet> parser = UnknownFieldSet.getDefaultInstance().getParserForType();
+      try (InputStream in = new BufferedInputStream(Files.newInputStream(file.toPath()))) {
+        UnknownFieldSet msg;
+        while ((msg = parser.parseDelimitedFrom(in)) != null) {
+          Map.Entry<Integer, UnknownFieldSet.Field> e =
+              Iterables.getOnlyElement(msg.asMap().entrySet());
+          Relation rel =
+              requireNonNull(
+                  relations.get(e.getKey()),
+                  String.format("unknown relation ID %s in message: %s", e.getKey(), msg));
+          List<ByteString> values = e.getValue().getLengthDelimitedList();
+          checkState(values.size() == 1, "expected one string field in message: %s", msg);
+          upsert(rel, values.get(0));
+          progress.update(1);
+        }
+      }
+      progress.endTask();
+    }
+
+    return 0;
+  }
+
+  @SuppressWarnings({"rawtypes", "unchecked"})
+  private static void upsert(Relation rel, ByteString s) throws OrmException {
+    Collection ents = Collections.singleton(rel.codec().decode(s));
+    try {
+      // Not all relations support update; fall back manually.
+      rel.access().insert(ents);
+    } catch (OrmDuplicateKeyException e) {
+      rel.access().delete(ents);
+      rel.access().insert(ents);
+    }
+  }
+
+  @AutoValue
+  abstract static class Relation {
+    private static Relation create(RelationModel model, ReviewDb db)
+        throws IllegalAccessException, InvocationTargetException, NoSuchMethodException,
+            ClassNotFoundException {
+      Method m = db.getClass().getMethod(model.getMethodName());
+      Class<?> clazz = Class.forName(model.getEntityTypeClassName());
+      return new AutoValue_ProtobufImport_Relation(
+          (Access<?, ?>) m.invoke(db), CodecFactory.encoder(clazz));
+    }
+
+    abstract Access<?, ?> access();
+
+    abstract ProtobufCodec<?> codec();
+  }
+}
diff --git a/java/com/google/gerrit/pgm/Reindex.java b/java/com/google/gerrit/pgm/Reindex.java
new file mode 100644
index 0000000..52d3bd3
--- /dev/null
+++ b/java/com/google/gerrit/pgm/Reindex.java
@@ -0,0 +1,213 @@
+// Copyright (C) 2013 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.google.gerrit.pgm;
+
+import static com.google.gerrit.server.schema.DataSourceProvider.Context.MULTI_USER;
+import static java.util.Objects.requireNonNull;
+import static java.util.stream.Collectors.toSet;
+
+import com.google.common.collect.Sets;
+import com.google.gerrit.common.Die;
+import com.google.gerrit.elasticsearch.ElasticIndexModule;
+import com.google.gerrit.extensions.config.FactoryModule;
+import com.google.gerrit.index.Index;
+import com.google.gerrit.index.IndexDefinition;
+import com.google.gerrit.index.SiteIndexer;
+import com.google.gerrit.lifecycle.LifecycleManager;
+import com.google.gerrit.lucene.LuceneIndexModule;
+import com.google.gerrit.pgm.util.BatchProgramModule;
+import com.google.gerrit.pgm.util.SiteProgram;
+import com.google.gerrit.pgm.util.ThreadLimiter;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.index.IndexModule;
+import com.google.gerrit.server.index.IndexModule.IndexType;
+import com.google.gerrit.server.index.change.ChangeSchemaDefinitions;
+import com.google.gerrit.server.plugins.PluginGuiceEnvironment;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import com.google.inject.Module;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.util.io.NullOutputStream;
+import org.kohsuke.args4j.Option;
+
+public class Reindex extends SiteProgram {
+  @Option(name = "--threads", usage = "Number of threads to use for indexing")
+  private int threads = Runtime.getRuntime().availableProcessors();
+
+  @Option(
+      name = "--changes-schema-version",
+      usage = "Schema version to reindex, for changes; default is most recent version")
+  private Integer changesVersion;
+
+  @Option(name = "--verbose", usage = "Output debug information for each change")
+  private boolean verbose;
+
+  @Option(name = "--list", usage = "List supported indices and exit")
+  private boolean list;
+
+  @Option(name = "--index", usage = "Only reindex specified indices")
+  private List<String> indices = new ArrayList<>();
+
+  private Injector dbInjector;
+  private Injector sysInjector;
+  private Injector cfgInjector;
+  private Config globalConfig;
+
+  @Inject private Collection<IndexDefinition<?, ?, ?>> indexDefs;
+
+  @Override
+  public int run() throws Exception {
+    mustHaveValidSite();
+    dbInjector = createDbInjector(MULTI_USER);
+    cfgInjector = dbInjector.createChildInjector();
+    globalConfig = dbInjector.getInstance(Key.get(Config.class, GerritServerConfig.class));
+    threads = ThreadLimiter.limitThreads(dbInjector, threads);
+    overrideConfig();
+    LifecycleManager dbManager = new LifecycleManager();
+    dbManager.add(dbInjector);
+    dbManager.start();
+
+    sysInjector = createSysInjector();
+    sysInjector.getInstance(PluginGuiceEnvironment.class).setDbCfgInjector(dbInjector, cfgInjector);
+    LifecycleManager sysManager = new LifecycleManager();
+    sysManager.add(sysInjector);
+    sysManager.start();
+
+    sysInjector.injectMembers(this);
+    checkIndicesOption();
+
+    try {
+      boolean ok = list ? list() : reindex();
+      return ok ? 0 : 1;
+    } catch (Exception e) {
+      throw die(e.getMessage(), e);
+    } finally {
+      sysManager.stop();
+      dbManager.stop();
+    }
+  }
+
+  private boolean list() {
+    for (IndexDefinition<?, ?, ?> def : indexDefs) {
+      System.out.format("%s\n", def.getName());
+    }
+    return true;
+  }
+
+  private boolean reindex() throws IOException {
+    boolean ok = true;
+    for (IndexDefinition<?, ?, ?> def : indexDefs) {
+      if (indices.isEmpty() || indices.contains(def.getName())) {
+        ok &= reindex(def);
+      }
+    }
+    return ok;
+  }
+
+  private void checkIndicesOption() throws Die {
+    if (indices.isEmpty()) {
+      return;
+    }
+
+    requireNonNull(indexDefs, "Called this method before injectMembers?");
+    Set<String> valid = indexDefs.stream().map(IndexDefinition::getName).sorted().collect(toSet());
+    Set<String> invalid = Sets.difference(Sets.newHashSet(indices), valid);
+    if (invalid.isEmpty()) {
+      return;
+    }
+
+    throw die(
+        "invalid index name(s): " + new TreeSet<>(invalid) + " available indices are: " + valid);
+  }
+
+  private Injector createSysInjector() {
+    Map<String, Integer> versions = new HashMap<>();
+    if (changesVersion != null) {
+      versions.put(ChangeSchemaDefinitions.INSTANCE.getName(), changesVersion);
+    }
+    boolean slave = globalConfig.getBoolean("container", "slave", false);
+    List<Module> modules = new ArrayList<>();
+    Module indexModule;
+    switch (IndexModule.getIndexType(dbInjector)) {
+      case LUCENE:
+        indexModule = LuceneIndexModule.singleVersionWithExplicitVersions(versions, threads, slave);
+        break;
+      case ELASTICSEARCH:
+        indexModule =
+            ElasticIndexModule.singleVersionWithExplicitVersions(versions, threads, slave);
+        break;
+      default:
+        throw new IllegalStateException("unsupported index.type");
+    }
+    modules.add(indexModule);
+    modules.add(dbInjector.getInstance(BatchProgramModule.class));
+    modules.add(
+        new FactoryModule() {
+          @Override
+          protected void configure() {
+            factory(ChangeResource.Factory.class);
+          }
+        });
+
+    return dbInjector.createChildInjector(modules);
+  }
+
+  private void overrideConfig() {
+    // Disable auto-commit for speed; committing will happen at the end of the process.
+    if (IndexModule.getIndexType(dbInjector) == IndexType.LUCENE) {
+      globalConfig.setLong("index", "changes_open", "commitWithin", -1);
+      globalConfig.setLong("index", "changes_closed", "commitWithin", -1);
+    }
+
+    // Disable change cache.
+    globalConfig.setLong("cache", "changes", "maximumWeight", 0);
+
+    // Disable auto-reindexing if stale, since there are no concurrent writes to race with.
+    globalConfig.setBoolean("index", null, "autoReindexIfStale", false);
+  }
+
+  private <K, V, I extends Index<K, V>> boolean reindex(IndexDefinition<K, V, I> def)
+      throws IOException {
+    I index = def.getIndexCollection().getSearchIndex();
+    requireNonNull(
+        index, () -> String.format("no active search index configured for %s", def.getName()));
+    index.markReady(false);
+    index.deleteAll();
+
+    SiteIndexer<K, V, I> siteIndexer = def.getSiteIndexer();
+    siteIndexer.setProgressOut(System.err);
+    siteIndexer.setVerboseOut(verbose ? System.out : NullOutputStream.INSTANCE);
+    SiteIndexer.Result result = siteIndexer.indexAll(index);
+    int n = result.doneCount() + result.failedCount();
+    double t = result.elapsed(TimeUnit.MILLISECONDS) / 1000d;
+    System.out.format(
+        "Reindexed %d documents in %s index in %.01fs (%.01f/s)\n", n, def.getName(), t, n / t);
+    if (result.success()) {
+      index.markReady(true);
+    }
+    return result.success();
+  }
+}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Rulec.java b/java/com/google/gerrit/pgm/Rulec.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/Rulec.java
rename to java/com/google/gerrit/pgm/Rulec.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/SetPasswd.java b/java/com/google/gerrit/pgm/SetPasswd.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/SetPasswd.java
rename to java/com/google/gerrit/pgm/SetPasswd.java
diff --git a/java/com/google/gerrit/pgm/SwitchSecureStore.java b/java/com/google/gerrit/pgm/SwitchSecureStore.java
new file mode 100644
index 0000000..3f10130
--- /dev/null
+++ b/java/com/google/gerrit/pgm/SwitchSecureStore.java
@@ -0,0 +1,206 @@
+// Copyright (C) 2014 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.google.gerrit.pgm;
+
+import static com.google.gerrit.server.schema.DataSourceProvider.Context.SINGLE_USER;
+
+import com.google.common.base.Joiner;
+import com.google.common.base.Strings;
+import com.google.common.collect.Iterables;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.IoUtil;
+import com.google.gerrit.common.SiteLibraryLoaderUtil;
+import com.google.gerrit.pgm.util.SiteProgram;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.plugins.JarScanner;
+import com.google.gerrit.server.securestore.DefaultSecureStore;
+import com.google.gerrit.server.securestore.SecureStore;
+import com.google.gerrit.server.securestore.SecureStore.EntryKey;
+import com.google.inject.Injector;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.List;
+import java.util.jar.JarFile;
+import java.util.zip.ZipEntry;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.storage.file.FileBasedConfig;
+import org.eclipse.jgit.util.FS;
+import org.kohsuke.args4j.Option;
+
+public class SwitchSecureStore extends SiteProgram {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static String getSecureStoreClassFromGerritConfig(SitePaths sitePaths) {
+    FileBasedConfig cfg = new FileBasedConfig(sitePaths.gerrit_config.toFile(), FS.DETECTED);
+    try {
+      cfg.load();
+    } catch (IOException | ConfigInvalidException e) {
+      throw new RuntimeException("Cannot read gerrit.config file", e);
+    }
+    return cfg.getString("gerrit", null, "secureStoreClass");
+  }
+
+  @Option(
+      name = "--new-secure-store-lib",
+      usage = "Path to new SecureStore implementation",
+      required = true)
+  private String newSecureStoreLib;
+
+  @Override
+  public int run() throws Exception {
+    SitePaths sitePaths = new SitePaths(getSitePath());
+    Path newSecureStorePath = Paths.get(newSecureStoreLib);
+    if (!Files.exists(newSecureStorePath)) {
+      logger.atSevere().log("File %s doesn't exist", newSecureStorePath.toAbsolutePath());
+      return -1;
+    }
+
+    String newSecureStore = getNewSecureStoreClassName(newSecureStorePath);
+    String currentSecureStoreName = getCurrentSecureStoreClassName(sitePaths);
+
+    if (currentSecureStoreName.equals(newSecureStore)) {
+      logger.atSevere().log(
+          "Old and new SecureStore implementation names "
+              + "are the same. Migration will not work");
+      return -1;
+    }
+
+    IoUtil.loadJARs(newSecureStorePath);
+    SiteLibraryLoaderUtil.loadSiteLib(sitePaths.lib_dir);
+
+    logger.atInfo().log(
+        "Current secureStoreClass property (%s) will be replaced with %s",
+        currentSecureStoreName, newSecureStore);
+    Injector dbInjector = createDbInjector(SINGLE_USER);
+    SecureStore currentStore = getSecureStore(currentSecureStoreName, dbInjector);
+    SecureStore newStore = getSecureStore(newSecureStore, dbInjector);
+
+    migrateProperties(currentStore, newStore);
+
+    removeOldLib(sitePaths, currentSecureStoreName);
+    copyNewLib(sitePaths, newSecureStorePath);
+
+    updateGerritConfig(sitePaths, newSecureStore);
+
+    return 0;
+  }
+
+  private void migrateProperties(SecureStore currentStore, SecureStore newStore) {
+    logger.atInfo().log("Migrate entries");
+    for (EntryKey key : currentStore.list()) {
+      String[] value = currentStore.getList(key.section, key.subsection, key.name);
+      if (value != null) {
+        newStore.setList(key.section, key.subsection, key.name, Arrays.asList(value));
+      } else {
+        String msg = String.format("Cannot migrate entry for %s", key.section);
+        if (key.subsection != null) {
+          msg = msg + String.format(".%s", key.subsection);
+        }
+        msg = msg + String.format(".%s", key.name);
+        throw new RuntimeException(msg);
+      }
+    }
+  }
+
+  private void removeOldLib(SitePaths sitePaths, String currentSecureStoreName) throws IOException {
+    Path oldSecureStore = findJarWithSecureStore(sitePaths, currentSecureStoreName);
+    if (oldSecureStore != null) {
+      logger.atInfo().log(
+          "Removing old SecureStore (%s) from lib/ directory", oldSecureStore.getFileName());
+      try {
+        Files.delete(oldSecureStore);
+      } catch (IOException e) {
+        logger.atSevere().withCause(e).log("Cannot remove %s", oldSecureStore.toAbsolutePath());
+      }
+    } else {
+      logger.atInfo().log(
+          "Cannot find jar with old SecureStore (%s) in lib/ directory", currentSecureStoreName);
+    }
+  }
+
+  private void copyNewLib(SitePaths sitePaths, Path newSecureStorePath) throws IOException {
+    logger.atInfo().log(
+        "Copy new SecureStore (%s) into lib/ directory", newSecureStorePath.getFileName());
+    Files.copy(newSecureStorePath, sitePaths.lib_dir.resolve(newSecureStorePath.getFileName()));
+  }
+
+  private void updateGerritConfig(SitePaths sitePaths, String newSecureStore)
+      throws IOException, ConfigInvalidException {
+    logger.atInfo().log(
+        "Set gerrit.secureStoreClass property of gerrit.config to %s", newSecureStore);
+    FileBasedConfig config = new FileBasedConfig(sitePaths.gerrit_config.toFile(), FS.DETECTED);
+    config.load();
+    config.setString("gerrit", null, "secureStoreClass", newSecureStore);
+    config.save();
+  }
+
+  private String getNewSecureStoreClassName(Path secureStore) throws IOException {
+    try (JarScanner scanner = new JarScanner(secureStore)) {
+      List<String> newSecureStores = scanner.findSubClassesOf(SecureStore.class);
+      if (newSecureStores.isEmpty()) {
+        throw new RuntimeException(
+            String.format(
+                "Cannot find implementation of SecureStore interface in %s",
+                secureStore.toAbsolutePath()));
+      }
+      if (newSecureStores.size() > 1) {
+        throw new RuntimeException(
+            String.format(
+                "Found too many implementations of SecureStore:\n%s\nin %s",
+                Joiner.on("\n").join(newSecureStores), secureStore.toAbsolutePath()));
+      }
+      return Iterables.getOnlyElement(newSecureStores);
+    }
+  }
+
+  private String getCurrentSecureStoreClassName(SitePaths sitePaths) {
+    String current = getSecureStoreClassFromGerritConfig(sitePaths);
+    if (!Strings.isNullOrEmpty(current)) {
+      return current;
+    }
+    return DefaultSecureStore.class.getName();
+  }
+
+  private SecureStore getSecureStore(String className, Injector injector) {
+    try {
+      @SuppressWarnings("unchecked")
+      Class<? extends SecureStore> clazz = (Class<? extends SecureStore>) Class.forName(className);
+      return injector.getInstance(clazz);
+    } catch (ClassNotFoundException e) {
+      throw new RuntimeException(
+          String.format("Cannot load SecureStore implementation: %s", className), e);
+    }
+  }
+
+  private Path findJarWithSecureStore(SitePaths sitePaths, String secureStoreClass)
+      throws IOException {
+    List<Path> jars = SiteLibraryLoaderUtil.listJars(sitePaths.lib_dir);
+    String secureStoreClassPath = secureStoreClass.replace('.', '/') + ".class";
+    for (Path jar : jars) {
+      try (JarFile jarFile = new JarFile(jar.toFile())) {
+        ZipEntry entry = jarFile.getEntry(secureStoreClassPath);
+        if (entry != null) {
+          return jar;
+        }
+      } catch (IOException e) {
+        logger.atSevere().withCause(e).log(e.getMessage());
+      }
+    }
+    return null;
+  }
+}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Version.java b/java/com/google/gerrit/pgm/Version.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/Version.java
rename to java/com/google/gerrit/pgm/Version.java
diff --git a/java/com/google/gerrit/pgm/WarDistribution.java b/java/com/google/gerrit/pgm/WarDistribution.java
new file mode 100644
index 0000000..257fb4e
--- /dev/null
+++ b/java/com/google/gerrit/pgm/WarDistribution.java
@@ -0,0 +1,68 @@
+// Copyright (C) 2014 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.google.gerrit.pgm;
+
+import static com.google.gerrit.pgm.init.InitPlugins.JAR;
+import static com.google.gerrit.pgm.init.InitPlugins.PLUGIN_DIR;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.launcher.GerritLauncher;
+import com.google.gerrit.pgm.init.PluginsDistribution;
+import com.google.inject.Singleton;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+@Singleton
+public class WarDistribution implements PluginsDistribution {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  @Override
+  public void foreach(Processor processor) throws IOException {
+    File myWar = GerritLauncher.getDistributionArchive();
+    if (myWar.isFile()) {
+      try (ZipFile zf = new ZipFile(myWar)) {
+        Enumeration<? extends ZipEntry> e = zf.entries();
+        while (e.hasMoreElements()) {
+          ZipEntry ze = e.nextElement();
+          if (ze.isDirectory()) {
+            continue;
+          }
+
+          if (ze.getName().startsWith(PLUGIN_DIR) && ze.getName().endsWith(JAR)) {
+            String pluginJarName = new File(ze.getName()).getName();
+            String pluginName = pluginJarName.substring(0, pluginJarName.length() - JAR.length());
+            try (InputStream in = zf.getInputStream(ze)) {
+              processor.process(pluginName, in);
+            } catch (IOException ioe) {
+              logger.atSevere().log("Error opening plugin %s: %s", ze.getName(), ioe.getMessage());
+            }
+          }
+        }
+      }
+    }
+  }
+
+  @Override
+  public List<String> listPluginNames() throws FileNotFoundException {
+    // not yet used
+    throw new UnsupportedOperationException();
+  }
+}
diff --git a/java/com/google/gerrit/pgm/http/BUILD b/java/com/google/gerrit/pgm/http/BUILD
new file mode 100644
index 0000000..838c614
--- /dev/null
+++ b/java/com/google/gerrit/pgm/http/BUILD
@@ -0,0 +1,5 @@
+java_library(
+    name = "http",
+    visibility = ["//visibility:public"],
+    exports = ["//java/com/google/gerrit/pgm/http/jetty"],
+)
diff --git a/java/com/google/gerrit/pgm/http/jetty/BUILD b/java/com/google/gerrit/pgm/http/jetty/BUILD
new file mode 100644
index 0000000..a6a13dc
--- /dev/null
+++ b/java/com/google/gerrit/pgm/http/jetty/BUILD
@@ -0,0 +1,27 @@
+java_library(
+    name = "jetty",
+    srcs = glob(["**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/httpd",
+        "//java/com/google/gerrit/launcher",
+        "//java/com/google/gerrit/lifecycle",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/server/util/time",
+        "//java/com/google/gerrit/sshd",
+        "//java/com/google/gerrit/util/http",
+        "//lib:guava",
+        "//lib:servlet-api-3_1",
+        "//lib/flogger:api",
+        "//lib/guice",
+        "//lib/guice:guice-assistedinject",
+        "//lib/guice:guice-servlet",
+        "//lib/jetty:jmx",
+        "//lib/jetty:server",
+        "//lib/jetty:servlet",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/log:log4j",
+    ],
+)
diff --git a/java/com/google/gerrit/pgm/http/jetty/HiddenErrorHandler.java b/java/com/google/gerrit/pgm/http/jetty/HiddenErrorHandler.java
new file mode 100644
index 0000000..1c43240
--- /dev/null
+++ b/java/com/google/gerrit/pgm/http/jetty/HiddenErrorHandler.java
@@ -0,0 +1,84 @@
+// Copyright (C) 2013 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.google.gerrit.pgm.http.jetty;
+
+import static java.nio.charset.StandardCharsets.ISO_8859_1;
+
+import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.util.http.CacheHeaders;
+import java.io.IOException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.eclipse.jetty.http.HttpHeader;
+import org.eclipse.jetty.http.HttpStatus;
+import org.eclipse.jetty.server.HttpConnection;
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.handler.ErrorHandler;
+
+class HiddenErrorHandler extends ErrorHandler {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  @Override
+  public void handle(
+      String target, Request baseRequest, HttpServletRequest req, HttpServletResponse res)
+      throws IOException {
+    HttpConnection conn = HttpConnection.getCurrentConnection();
+    baseRequest.setHandled(true);
+    try {
+      log(req);
+    } finally {
+      reply(conn, res);
+    }
+  }
+
+  private void reply(HttpConnection conn, HttpServletResponse res) throws IOException {
+    byte[] msg = message(conn);
+    res.setHeader(HttpHeader.CONTENT_TYPE.asString(), "text/plain; charset=ISO-8859-1");
+    res.setContentLength(msg.length);
+    try {
+      CacheHeaders.setNotCacheable(res);
+    } finally {
+      try (ServletOutputStream out = res.getOutputStream()) {
+        out.write(msg);
+      }
+    }
+  }
+
+  private static byte[] message(HttpConnection conn) {
+    String msg;
+    if (conn == null) {
+      msg = "";
+    } else {
+      msg = conn.getHttpChannel().getResponse().getReason();
+      if (msg == null) {
+        msg = HttpStatus.getMessage(conn.getHttpChannel().getResponse().getStatus());
+      }
+    }
+    return msg.getBytes(ISO_8859_1);
+  }
+
+  private static void log(HttpServletRequest req) {
+    Throwable err = (Throwable) req.getAttribute("javax.servlet.error.exception");
+    if (err != null) {
+      String uri = req.getRequestURI();
+      if (!Strings.isNullOrEmpty(req.getQueryString())) {
+        uri += "?" + req.getQueryString();
+      }
+      logger.atSevere().withCause(err).log("Error in %s %s", req.getMethod(), uri);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/pgm/http/jetty/HttpLog.java b/java/com/google/gerrit/pgm/http/jetty/HttpLog.java
new file mode 100644
index 0000000..b7ec2be
--- /dev/null
+++ b/java/com/google/gerrit/pgm/http/jetty/HttpLog.java
@@ -0,0 +1,114 @@
+// Copyright (C) 2010 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.google.gerrit.pgm.http.jetty;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.httpd.GetUserFilter;
+import com.google.gerrit.httpd.restapi.LogRedactUtil;
+import com.google.gerrit.server.util.SystemLog;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.inject.Inject;
+import org.apache.log4j.AsyncAppender;
+import org.apache.log4j.Level;
+import org.apache.log4j.Logger;
+import org.apache.log4j.spi.LoggingEvent;
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.RequestLog;
+import org.eclipse.jetty.server.Response;
+import org.eclipse.jetty.util.component.AbstractLifeCycle;
+
+/** Writes the {@code httpd_log} file with per-request data. */
+class HttpLog extends AbstractLifeCycle implements RequestLog {
+  private static final Logger log = Logger.getLogger(HttpLog.class);
+  private static final String LOG_NAME = "httpd_log";
+
+  interface HttpLogFactory {
+    HttpLog get();
+  }
+
+  protected static final String P_HOST = "Host";
+  protected static final String P_USER = "User";
+  protected static final String P_METHOD = "Method";
+  protected static final String P_RESOURCE = "Resource";
+  protected static final String P_PROTOCOL = "Version";
+  protected static final String P_STATUS = "Status";
+  protected static final String P_CONTENT_LENGTH = "Content-Length";
+  protected static final String P_REFERER = "Referer";
+  protected static final String P_USER_AGENT = "User-Agent";
+
+  private final AsyncAppender async;
+
+  @Inject
+  HttpLog(SystemLog systemLog) {
+    async = systemLog.createAsyncAppender(LOG_NAME, new HttpLogLayout());
+  }
+
+  @Override
+  protected void doStart() throws Exception {}
+
+  @Override
+  protected void doStop() throws Exception {
+    async.close();
+  }
+
+  @Override
+  public void log(Request req, Response rsp) {
+    final LoggingEvent event =
+        new LoggingEvent( //
+            Logger.class.getName(), // fqnOfCategoryClass
+            log, // logger
+            TimeUtil.nowMs(), // when
+            Level.INFO, // level
+            "", // message text
+            "HTTPD", // thread name
+            null, // exception information
+            null, // current NDC string
+            null, // caller location
+            null // MDC properties
+            );
+
+    String uri = req.getRequestURI();
+    if (!Strings.isNullOrEmpty(req.getQueryString())) {
+      uri += "?" + LogRedactUtil.redactQueryString(req.getQueryString());
+    }
+    String user = (String) req.getAttribute(GetUserFilter.USER_ATTR_KEY);
+    if (user != null) {
+      event.setProperty(P_USER, user);
+    }
+
+    set(event, P_HOST, req.getRemoteAddr());
+    set(event, P_METHOD, req.getMethod());
+    set(event, P_RESOURCE, uri);
+    set(event, P_PROTOCOL, req.getProtocol());
+    set(event, P_STATUS, rsp.getStatus());
+    set(event, P_CONTENT_LENGTH, rsp.getContentCount());
+    set(event, P_REFERER, req.getHeader("Referer"));
+    set(event, P_USER_AGENT, req.getHeader("User-Agent"));
+
+    async.append(event);
+  }
+
+  private static void set(LoggingEvent event, String key, String val) {
+    if (val != null && !val.isEmpty()) {
+      event.setProperty(key, val);
+    }
+  }
+
+  private static void set(LoggingEvent event, String key, long val) {
+    if (0 < val) {
+      event.setProperty(key, String.valueOf(val));
+    }
+  }
+}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HttpLogLayout.java b/java/com/google/gerrit/pgm/http/jetty/HttpLogLayout.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HttpLogLayout.java
rename to java/com/google/gerrit/pgm/http/jetty/HttpLogLayout.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyEnv.java b/java/com/google/gerrit/pgm/http/jetty/JettyEnv.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyEnv.java
rename to java/com/google/gerrit/pgm/http/jetty/JettyEnv.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyModule.java b/java/com/google/gerrit/pgm/http/jetty/JettyModule.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyModule.java
rename to java/com/google/gerrit/pgm/http/jetty/JettyModule.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyServer.java b/java/com/google/gerrit/pgm/http/jetty/JettyServer.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyServer.java
rename to java/com/google/gerrit/pgm/http/jetty/JettyServer.java
diff --git a/java/com/google/gerrit/pgm/http/jetty/ProjectQoSFilter.java b/java/com/google/gerrit/pgm/http/jetty/ProjectQoSFilter.java
new file mode 100644
index 0000000..9354209
--- /dev/null
+++ b/java/com/google/gerrit/pgm/http/jetty/ProjectQoSFilter.java
@@ -0,0 +1,246 @@
+// Copyright (C) 2010 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.google.gerrit.pgm.http.jetty;
+
+import static com.google.gerrit.server.config.ConfigUtil.getTimeUnit;
+import static java.util.concurrent.TimeUnit.MINUTES;
+import static javax.servlet.http.HttpServletResponse.SC_SERVICE_UNAVAILABLE;
+
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.AccountLimits;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.git.QueueProvider;
+import com.google.gerrit.server.git.WorkQueue.CancelableRunnable;
+import com.google.gerrit.sshd.CommandExecutorQueueProvider;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import com.google.inject.servlet.ServletModule;
+import java.io.IOException;
+import java.util.Optional;
+import java.util.concurrent.Future;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.eclipse.jetty.continuation.Continuation;
+import org.eclipse.jetty.continuation.ContinuationListener;
+import org.eclipse.jetty.continuation.ContinuationSupport;
+import org.eclipse.jgit.lib.Config;
+
+/**
+ * Use Jetty continuations to defer execution until threads are available.
+ *
+ * <p>We actually schedule a task into the same execution queue as the SSH daemon uses for command
+ * execution, and then park the web request in a continuation until an execution thread is
+ * available. This ensures that the overall JVM process doesn't exceed the configured limit on
+ * concurrent Git requests.
+ *
+ * <p>During Git request execution however we have to use the Jetty service thread, not the thread
+ * from the SSH execution queue. Trying to complete the request on the SSH execution queue caused
+ * Jetty's HTTP parser to crash, so we instead block the SSH execution queue thread and ask Jetty to
+ * resume processing on the web service thread.
+ */
+@SuppressWarnings("deprecation")
+@Singleton
+public class ProjectQoSFilter implements Filter {
+  private static final String ATT_SPACE = ProjectQoSFilter.class.getName();
+  private static final String TASK = ATT_SPACE + "/TASK";
+  private static final String CANCEL = ATT_SPACE + "/CANCEL";
+
+  private static final String FILTER_RE = "^/(.*)/(git-upload-pack|git-receive-pack)$";
+  private static final Pattern URI_PATTERN = Pattern.compile(FILTER_RE);
+
+  public static class Module extends ServletModule {
+    @Override
+    protected void configureServlets() {
+      bind(QueueProvider.class).to(CommandExecutorQueueProvider.class);
+      filterRegex(FILTER_RE).through(ProjectQoSFilter.class);
+    }
+  }
+
+  private final AccountLimits.Factory limitsFactory;
+  private final Provider<CurrentUser> user;
+  private final QueueProvider queue;
+  private final ServletContext context;
+  private final long maxWait;
+
+  @Inject
+  ProjectQoSFilter(
+      AccountLimits.Factory limitsFactory,
+      Provider<CurrentUser> user,
+      QueueProvider queue,
+      ServletContext context,
+      @GerritServerConfig Config cfg) {
+    this.limitsFactory = limitsFactory;
+    this.user = user;
+    this.queue = queue;
+    this.context = context;
+    this.maxWait = MINUTES.toMillis(getTimeUnit(cfg, "httpd", null, "maxwait", 5, MINUTES));
+  }
+
+  @Override
+  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+      throws IOException, ServletException {
+    final HttpServletRequest req = (HttpServletRequest) request;
+    final HttpServletResponse rsp = (HttpServletResponse) response;
+    final Continuation cont = ContinuationSupport.getContinuation(req);
+
+    if (cont.isInitial()) {
+      TaskThunk task = new TaskThunk(cont, req);
+      if (maxWait > 0) {
+        cont.setTimeout(maxWait);
+      }
+      cont.suspend(rsp);
+      cont.setAttribute(TASK, task);
+
+      Future<?> f = getExecutor().submit(task);
+      cont.addContinuationListener(new Listener(f));
+    } else if (cont.isExpired()) {
+      rsp.sendError(SC_SERVICE_UNAVAILABLE);
+
+    } else if (cont.isResumed() && cont.getAttribute(CANCEL) == Boolean.TRUE) {
+      rsp.sendError(SC_SERVICE_UNAVAILABLE);
+
+    } else if (cont.isResumed()) {
+      TaskThunk task = (TaskThunk) cont.getAttribute(TASK);
+      try {
+        task.begin(Thread.currentThread());
+        chain.doFilter(req, rsp);
+      } finally {
+        task.end();
+        Thread.interrupted();
+      }
+
+    } else {
+      context.log("Unexpected QoS continuation state, aborting request");
+      rsp.sendError(SC_SERVICE_UNAVAILABLE);
+    }
+  }
+
+  private ScheduledThreadPoolExecutor getExecutor() {
+    QueueProvider.QueueType qt = limitsFactory.create(user.get()).getQueueType();
+    return queue.getQueue(qt);
+  }
+
+  @Override
+  public void init(FilterConfig config) {}
+
+  @Override
+  public void destroy() {}
+
+  private static final class Listener implements ContinuationListener {
+    final Future<?> future;
+
+    Listener(Future<?> future) {
+      this.future = future;
+    }
+
+    @Override
+    public void onComplete(Continuation self) {}
+
+    @Override
+    public void onTimeout(Continuation self) {
+      future.cancel(true);
+    }
+  }
+
+  private final class TaskThunk implements CancelableRunnable {
+    private final Continuation cont;
+    private final String name;
+    private final Object lock = new Object();
+    private boolean done;
+    private Thread worker;
+
+    TaskThunk(Continuation cont, HttpServletRequest req) {
+      this.cont = cont;
+      this.name = generateName(req);
+    }
+
+    @Override
+    public void run() {
+      cont.resume();
+
+      synchronized (lock) {
+        while (!done) {
+          try {
+            lock.wait();
+          } catch (InterruptedException e) {
+            if (worker != null) {
+              worker.interrupt();
+            } else {
+              break;
+            }
+          }
+        }
+      }
+    }
+
+    void begin(Thread thread) {
+      synchronized (lock) {
+        worker = thread;
+      }
+    }
+
+    void end() {
+      synchronized (lock) {
+        worker = null;
+        done = true;
+        lock.notifyAll();
+      }
+    }
+
+    @Override
+    public void cancel() {
+      cont.setAttribute(CANCEL, Boolean.TRUE);
+      cont.resume();
+    }
+
+    @Override
+    public String toString() {
+      return name;
+    }
+
+    private String generateName(HttpServletRequest req) {
+      String userName = "";
+
+      CurrentUser who = user.get();
+      if (who.isIdentifiedUser()) {
+        Optional<String> name = who.asIdentifiedUser().getUserName();
+        if (name.isPresent()) {
+          userName = " (" + name.get() + ")";
+        }
+      }
+
+      String uri = req.getServletPath();
+      Matcher m = URI_PATTERN.matcher(uri);
+      if (m.matches()) {
+        String path = m.group(1);
+        String cmd = m.group(2);
+        return cmd + " " + path + userName;
+      }
+
+      return req.getMethod() + " " + uri + userName;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/pgm/init/AccountsOnInit.java b/java/com/google/gerrit/pgm/init/AccountsOnInit.java
new file mode 100644
index 0000000..ff94905
--- /dev/null
+++ b/java/com/google/gerrit/pgm/init/AccountsOnInit.java
@@ -0,0 +1,138 @@
+// Copyright (C) 2017 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.google.gerrit.pgm.init;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.gerrit.pgm.init.api.AllUsersNameOnInitProvider;
+import com.google.gerrit.pgm.init.api.InitFlags;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.GerritPersonIdentProvider;
+import com.google.gerrit.server.account.AccountProperties;
+import com.google.gerrit.server.account.Accounts;
+import com.google.gerrit.server.account.InternalAccountUpdate;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.inject.Inject;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Path;
+import org.eclipse.jgit.dircache.DirCache;
+import org.eclipse.jgit.dircache.DirCacheEditor;
+import org.eclipse.jgit.dircache.DirCacheEditor.PathEdit;
+import org.eclipse.jgit.dircache.DirCacheEntry;
+import org.eclipse.jgit.internal.storage.file.FileRepository;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.FileMode;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.RefUpdate.Result;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.lib.RepositoryCache.FileKey;
+import org.eclipse.jgit.util.FS;
+
+public class AccountsOnInit {
+  private final InitFlags flags;
+  private final SitePaths site;
+  private final String allUsers;
+
+  @Inject
+  public AccountsOnInit(InitFlags flags, SitePaths site, AllUsersNameOnInitProvider allUsers) {
+    this.flags = flags;
+    this.site = site;
+    this.allUsers = allUsers.get();
+  }
+
+  public void insert(Account account) throws IOException {
+    File path = getPath();
+    if (path != null) {
+      try (Repository repo = new FileRepository(path);
+          ObjectInserter oi = repo.newObjectInserter()) {
+        PersonIdent ident =
+            new PersonIdent(
+                new GerritPersonIdentProvider(flags.cfg).get(), account.getRegisteredOn());
+
+        Config accountConfig = new Config();
+        AccountProperties.writeToAccountConfig(
+            InternalAccountUpdate.builder()
+                .setActive(account.isActive())
+                .setFullName(account.getFullName())
+                .setPreferredEmail(account.getPreferredEmail())
+                .setStatus(account.getStatus())
+                .build(),
+            accountConfig);
+
+        DirCache newTree = DirCache.newInCore();
+        DirCacheEditor editor = newTree.editor();
+        final ObjectId blobId =
+            oi.insert(Constants.OBJ_BLOB, accountConfig.toText().getBytes(UTF_8));
+        editor.add(
+            new PathEdit(AccountProperties.ACCOUNT_CONFIG) {
+              @Override
+              public void apply(DirCacheEntry ent) {
+                ent.setFileMode(FileMode.REGULAR_FILE);
+                ent.setObjectId(blobId);
+              }
+            });
+        editor.finish();
+
+        ObjectId treeId = newTree.writeTree(oi);
+
+        CommitBuilder cb = new CommitBuilder();
+        cb.setTreeId(treeId);
+        cb.setCommitter(ident);
+        cb.setAuthor(ident);
+        cb.setMessage("Create Account");
+        ObjectId id = oi.insert(cb);
+        oi.flush();
+
+        String refName = RefNames.refsUsers(account.getId());
+        RefUpdate ru = repo.updateRef(refName);
+        ru.setExpectedOldObjectId(ObjectId.zeroId());
+        ru.setNewObjectId(id);
+        ru.setRefLogIdent(ident);
+        ru.setRefLogMessage("Create Account", false);
+        Result result = ru.update();
+        if (result != Result.NEW) {
+          throw new IOException(
+              String.format("Failed to update ref %s: %s", refName, result.name()));
+        }
+        account.setMetaId(id.name());
+      }
+    }
+  }
+
+  public boolean hasAnyAccount() throws IOException {
+    File path = getPath();
+    if (path == null) {
+      return false;
+    }
+
+    try (Repository repo = new FileRepository(path)) {
+      return Accounts.hasAnyAccount(repo);
+    }
+  }
+
+  private File getPath() {
+    Path basePath = site.resolve(flags.cfg.getString("gerrit", null, "basePath"));
+    checkArgument(basePath != null, "gerrit.basePath must be configured");
+    return FileKey.resolve(basePath.resolve(allUsers).toFile(), FS.DETECTED);
+  }
+}
diff --git a/java/com/google/gerrit/pgm/init/BUILD b/java/com/google/gerrit/pgm/init/BUILD
new file mode 100644
index 0000000..7e04e5a
--- /dev/null
+++ b/java/com/google/gerrit/pgm/init/BUILD
@@ -0,0 +1,33 @@
+java_library(
+    name = "init",
+    srcs = glob(["**/*.java"]),
+    resource_strip_prefix = "resources",
+    resources = ["//resources/com/google/gerrit/pgm/init"],
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/common:annotations",
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/elasticsearch",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/index",
+        "//java/com/google/gerrit/launcher",
+        "//java/com/google/gerrit/lucene",
+        "//java/com/google/gerrit/metrics",
+        "//java/com/google/gerrit/pgm/init/api",
+        "//java/com/google/gerrit/pgm/util",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/server/ioutil",
+        "//java/com/google/gerrit/server/schema",
+        "//java/com/google/gerrit/server/util/time",
+        "//lib:guava",
+        "//lib:gwtjsonrpc",
+        "//lib:gwtorm",
+        "//lib:h2",
+        "//lib/commons:validator",
+        "//lib/flogger:api",
+        "//lib/guice",
+        "//lib/guice:guice-assistedinject",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+    ],
+)
diff --git a/java/com/google/gerrit/pgm/init/BaseInit.java b/java/com/google/gerrit/pgm/init/BaseInit.java
new file mode 100644
index 0000000..deaf139
--- /dev/null
+++ b/java/com/google/gerrit/pgm/init/BaseInit.java
@@ -0,0 +1,525 @@
+// Copyright (C) 2013 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.google.gerrit.pgm.init;
+
+import static com.google.gerrit.reviewdb.server.ReviewDbUtil.unwrapDb;
+import static com.google.gerrit.server.schema.DataSourceProvider.Context.SINGLE_USER;
+import static com.google.inject.Scopes.SINGLETON;
+import static com.google.inject.Stage.PRODUCTION;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Die;
+import com.google.gerrit.common.IoUtil;
+import com.google.gerrit.metrics.DisabledMetricMaker;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.pgm.init.api.ConsoleUI;
+import com.google.gerrit.pgm.init.api.InitFlags;
+import com.google.gerrit.pgm.init.api.InstallAllPlugins;
+import com.google.gerrit.pgm.init.api.InstallPlugins;
+import com.google.gerrit.pgm.init.api.LibraryDownload;
+import com.google.gerrit.pgm.init.index.IndexManagerOnInit;
+import com.google.gerrit.pgm.init.index.elasticsearch.ElasticIndexModuleOnInit;
+import com.google.gerrit.pgm.init.index.lucene.LuceneIndexModuleOnInit;
+import com.google.gerrit.pgm.util.SiteProgram;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.config.GerritServerConfigModule;
+import com.google.gerrit.server.config.SitePath;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.index.IndexModule;
+import com.google.gerrit.server.plugins.JarScanner;
+import com.google.gerrit.server.schema.ReviewDbFactory;
+import com.google.gerrit.server.schema.SchemaUpdater;
+import com.google.gerrit.server.schema.UpdateUI;
+import com.google.gerrit.server.securestore.SecureStore;
+import com.google.gerrit.server.securestore.SecureStoreClassName;
+import com.google.gerrit.server.securestore.SecureStoreProvider;
+import com.google.gwtorm.jdbc.JdbcExecutor;
+import com.google.gwtorm.jdbc.JdbcSchema;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.gwtorm.server.StatementExecutor;
+import com.google.inject.AbstractModule;
+import com.google.inject.CreationException;
+import com.google.inject.Guice;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Module;
+import com.google.inject.Provider;
+import com.google.inject.TypeLiteral;
+import com.google.inject.spi.Message;
+import com.google.inject.util.Providers;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import javax.sql.DataSource;
+
+/** Initialize a new Gerrit installation. */
+public class BaseInit extends SiteProgram {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final boolean standalone;
+  private final boolean initDb;
+  protected final PluginsDistribution pluginsDistribution;
+  private final List<String> pluginsToInstall;
+
+  private Injector sysInjector;
+
+  protected BaseInit(PluginsDistribution pluginsDistribution, List<String> pluginsToInstall) {
+    this.standalone = true;
+    this.initDb = true;
+    this.pluginsDistribution = pluginsDistribution;
+    this.pluginsToInstall = pluginsToInstall;
+  }
+
+  public BaseInit(
+      Path sitePath,
+      boolean standalone,
+      boolean initDb,
+      PluginsDistribution pluginsDistribution,
+      List<String> pluginsToInstall) {
+    this(sitePath, null, standalone, initDb, pluginsDistribution, pluginsToInstall);
+  }
+
+  public BaseInit(
+      Path sitePath,
+      final Provider<DataSource> dsProvider,
+      boolean standalone,
+      boolean initDb,
+      PluginsDistribution pluginsDistribution,
+      List<String> pluginsToInstall) {
+    super(sitePath, dsProvider);
+    this.standalone = standalone;
+    this.initDb = initDb;
+    this.pluginsDistribution = pluginsDistribution;
+    this.pluginsToInstall = pluginsToInstall;
+  }
+
+  @Override
+  public int run() throws Exception {
+    final SiteInit init = createSiteInit();
+    if (beforeInit(init)) {
+      return 0;
+    }
+
+    init.flags.autoStart = getAutoStart() && init.site.isNew;
+    init.flags.dev = isDev() && init.site.isNew;
+    init.flags.skipPlugins = skipPlugins();
+    init.flags.deleteCaches = getDeleteCaches();
+    init.flags.isNew = init.site.isNew;
+
+    final SiteRun run;
+    try {
+      init.initializer.run();
+      init.flags.deleteOnFailure = false;
+
+      Injector sysInjector = createSysInjector(init);
+      IndexManagerOnInit indexManager = sysInjector.getInstance(IndexManagerOnInit.class);
+      try {
+        indexManager.start();
+        run = createSiteRun(init);
+        run.upgradeSchema();
+
+        init.initializer.postRun(sysInjector);
+      } finally {
+        indexManager.stop();
+      }
+    } catch (Exception | Error failure) {
+      if (init.flags.deleteOnFailure) {
+        recursiveDelete(getSitePath());
+      }
+      throw failure;
+    }
+
+    System.err.println("Initialized " + getSitePath().toRealPath().normalize());
+    afterInit(run);
+    return 0;
+  }
+
+  protected boolean skipPlugins() {
+    return false;
+  }
+
+  protected String getSecureStoreLib() {
+    return null;
+  }
+
+  protected boolean skipAllDownloads() {
+    return false;
+  }
+
+  protected List<String> getSkippedDownloads() {
+    return Collections.emptyList();
+  }
+
+  /**
+   * Invoked before site init is called.
+   *
+   * @param init initializer instance.
+   * @throws Exception
+   */
+  protected boolean beforeInit(SiteInit init) throws Exception {
+    return false;
+  }
+
+  /**
+   * Invoked after site init is called.
+   *
+   * @param run completed run instance.
+   * @throws Exception
+   */
+  protected void afterInit(SiteRun run) throws Exception {}
+
+  protected List<String> getInstallPlugins() {
+    try {
+      if (pluginsToInstall != null && pluginsToInstall.isEmpty()) {
+        return Collections.emptyList();
+      }
+      List<String> names = pluginsDistribution.listPluginNames();
+      if (pluginsToInstall != null) {
+        names.removeIf(n -> !pluginsToInstall.contains(n));
+      }
+      return names;
+    } catch (FileNotFoundException e) {
+      logger.atWarning().log(
+          "Couldn't find distribution archive location. No plugin will be installed");
+      return null;
+    }
+  }
+
+  protected boolean installAllPlugins() {
+    return false;
+  }
+
+  protected boolean getAutoStart() {
+    return false;
+  }
+
+  public static class SiteInit {
+    public final SitePaths site;
+    final InitFlags flags;
+    final ConsoleUI ui;
+    final SitePathInitializer initializer;
+
+    @Inject
+    SiteInit(
+        final SitePaths site,
+        final InitFlags flags,
+        final ConsoleUI ui,
+        final SitePathInitializer initializer) {
+      this.site = site;
+      this.flags = flags;
+      this.ui = ui;
+      this.initializer = initializer;
+    }
+  }
+
+  private SiteInit createSiteInit() {
+    final ConsoleUI ui = getConsoleUI();
+    final Path sitePath = getSitePath();
+    final List<Module> m = new ArrayList<>();
+    final SecureStoreInitData secureStoreInitData = discoverSecureStoreClass();
+    final String currentSecureStoreClassName = getConfiguredSecureStoreClass();
+
+    if (secureStoreInitData != null
+        && currentSecureStoreClassName != null
+        && !currentSecureStoreClassName.equals(secureStoreInitData.className)) {
+      String err =
+          String.format(
+              "Different secure store was previously configured: %s. "
+                  + "Use SwitchSecureStore program to switch between implementations.",
+              currentSecureStoreClassName);
+      throw die(err);
+    }
+
+    m.add(new GerritServerConfigModule());
+    m.add(new InitModule(standalone, initDb));
+    m.add(
+        new AbstractModule() {
+          @Override
+          protected void configure() {
+            bind(ConsoleUI.class).toInstance(ui);
+            bind(Path.class).annotatedWith(SitePath.class).toInstance(sitePath);
+            List<String> plugins =
+                MoreObjects.firstNonNull(getInstallPlugins(), new ArrayList<String>());
+            bind(new TypeLiteral<List<String>>() {})
+                .annotatedWith(InstallPlugins.class)
+                .toInstance(plugins);
+            bind(new TypeLiteral<Boolean>() {})
+                .annotatedWith(InstallAllPlugins.class)
+                .toInstance(installAllPlugins());
+            bind(PluginsDistribution.class).toInstance(pluginsDistribution);
+
+            String secureStoreClassName;
+            if (secureStoreInitData != null) {
+              secureStoreClassName = secureStoreInitData.className;
+            } else {
+              secureStoreClassName = currentSecureStoreClassName;
+            }
+            if (secureStoreClassName != null) {
+              ui.message("Using secure store: %s\n", secureStoreClassName);
+            }
+            bind(SecureStoreInitData.class).toProvider(Providers.of(secureStoreInitData));
+            bind(String.class)
+                .annotatedWith(SecureStoreClassName.class)
+                .toProvider(Providers.of(secureStoreClassName));
+            bind(SecureStore.class).toProvider(SecureStoreProvider.class).in(SINGLETON);
+            bind(new TypeLiteral<List<String>>() {})
+                .annotatedWith(LibraryDownload.class)
+                .toInstance(getSkippedDownloads());
+            bind(Boolean.class).annotatedWith(LibraryDownload.class).toInstance(skipAllDownloads());
+
+            bind(MetricMaker.class).to(DisabledMetricMaker.class);
+          }
+        });
+
+    try {
+      return Guice.createInjector(PRODUCTION, m).getInstance(SiteInit.class);
+    } catch (CreationException ce) {
+      final Message first = ce.getErrorMessages().iterator().next();
+      Throwable why = first.getCause();
+
+      if (why instanceof Die) {
+        throw (Die) why;
+      }
+
+      final StringBuilder buf = new StringBuilder(ce.getMessage());
+      while (why != null) {
+        buf.append("\n");
+        buf.append(why.getMessage());
+        why = why.getCause();
+        if (why != null) {
+          buf.append("\n  caused by ");
+        }
+      }
+      throw die(buf.toString(), new RuntimeException("InitInjector failed", ce));
+    }
+  }
+
+  protected ConsoleUI getConsoleUI() {
+    return ConsoleUI.getInstance(false);
+  }
+
+  private SecureStoreInitData discoverSecureStoreClass() {
+    String secureStore = getSecureStoreLib();
+    if (Strings.isNullOrEmpty(secureStore)) {
+      return null;
+    }
+
+    Path secureStoreLib = Paths.get(secureStore);
+    if (!Files.exists(secureStoreLib)) {
+      throw new InvalidSecureStoreException(String.format("File %s doesn't exist", secureStore));
+    }
+    try (JarScanner scanner = new JarScanner(secureStoreLib)) {
+      List<String> secureStores = scanner.findSubClassesOf(SecureStore.class);
+      if (secureStores.isEmpty()) {
+        throw new InvalidSecureStoreException(
+            String.format(
+                "Cannot find class implementing %s interface in %s",
+                SecureStore.class.getName(), secureStore));
+      }
+      if (secureStores.size() > 1) {
+        throw new InvalidSecureStoreException(
+            String.format(
+                "%s has more that one implementation of %s interface",
+                secureStore, SecureStore.class.getName()));
+      }
+      IoUtil.loadJARs(secureStoreLib);
+      return new SecureStoreInitData(secureStoreLib, secureStores.get(0));
+    } catch (IOException e) {
+      throw new InvalidSecureStoreException(String.format("%s is not a valid jar", secureStore));
+    }
+  }
+
+  public static class SiteRun {
+    public final ConsoleUI ui;
+    public final SitePaths site;
+    public final InitFlags flags;
+    final SchemaUpdater schemaUpdater;
+    final SchemaFactory<ReviewDb> schema;
+    final GitRepositoryManager repositoryManager;
+
+    @Inject
+    SiteRun(
+        ConsoleUI ui,
+        SitePaths site,
+        InitFlags flags,
+        SchemaUpdater schemaUpdater,
+        @ReviewDbFactory SchemaFactory<ReviewDb> schema,
+        GitRepositoryManager repositoryManager) {
+      this.ui = ui;
+      this.site = site;
+      this.flags = flags;
+      this.schemaUpdater = schemaUpdater;
+      this.schema = schema;
+      this.repositoryManager = repositoryManager;
+    }
+
+    void upgradeSchema() throws OrmException {
+      final List<String> pruneList = new ArrayList<>();
+      schemaUpdater.update(
+          new UpdateUI() {
+            @Override
+            public void message(String message) {
+              System.err.println(message);
+              System.err.flush();
+            }
+
+            @Override
+            public boolean yesno(boolean defaultValue, String message) {
+              return ui.yesno(defaultValue, message);
+            }
+
+            @Override
+            public void waitForUser() {
+              ui.waitForUser();
+            }
+
+            @Override
+            public String readString(
+                String defaultValue, Set<String> allowedValues, String message) {
+              return ui.readString(defaultValue, allowedValues, message);
+            }
+
+            @Override
+            public boolean isBatch() {
+              return ui.isBatch();
+            }
+
+            @Override
+            public void pruneSchema(StatementExecutor e, List<String> prune) {
+              for (String p : prune) {
+                if (!pruneList.contains(p)) {
+                  pruneList.add(p);
+                }
+              }
+            }
+          });
+
+      if (!pruneList.isEmpty()) {
+        StringBuilder msg = new StringBuilder();
+        msg.append("Execute the following SQL to drop unused objects:\n");
+        msg.append("\n");
+        for (String sql : pruneList) {
+          msg.append("  ");
+          msg.append(sql);
+          msg.append(";\n");
+        }
+
+        if (ui.isBatch()) {
+          System.err.print(msg);
+          System.err.flush();
+
+        } else if (ui.yesno(true, "%s\nExecute now", msg)) {
+          try (JdbcSchema db = (JdbcSchema) unwrapDb(schema.open());
+              JdbcExecutor e = new JdbcExecutor(db)) {
+            for (String sql : pruneList) {
+              e.execute(sql);
+            }
+          }
+        }
+      }
+    }
+  }
+
+  private SiteRun createSiteRun(SiteInit init) {
+    return createSysInjector(init).getInstance(SiteRun.class);
+  }
+
+  private Injector createSysInjector(SiteInit init) {
+    if (sysInjector == null) {
+      final List<Module> modules = new ArrayList<>();
+      modules.add(
+          new AbstractModule() {
+            @Override
+            protected void configure() {
+              bind(ConsoleUI.class).toInstance(init.ui);
+              bind(InitFlags.class).toInstance(init.flags);
+            }
+          });
+      Injector dbInjector = createDbInjector(SINGLE_USER);
+      switch (IndexModule.getIndexType(dbInjector)) {
+        case LUCENE:
+          modules.add(new LuceneIndexModuleOnInit());
+          break;
+        case ELASTICSEARCH:
+          modules.add(new ElasticIndexModuleOnInit());
+          break;
+        default:
+          throw new IllegalStateException("unsupported index.type");
+      }
+      sysInjector = dbInjector.createChildInjector(modules);
+    }
+    return sysInjector;
+  }
+
+  private static void recursiveDelete(Path path) {
+    final String msg = "warn: Cannot remove ";
+    try {
+      Files.walkFileTree(
+          path,
+          new SimpleFileVisitor<Path>() {
+            @Override
+            public FileVisitResult visitFile(Path f, BasicFileAttributes attrs) throws IOException {
+              try {
+                Files.delete(f);
+              } catch (IOException e) {
+                System.err.println(msg + f);
+              }
+              return FileVisitResult.CONTINUE;
+            }
+
+            @Override
+            public FileVisitResult postVisitDirectory(Path dir, IOException err) {
+              try {
+                // Previously warned if err was not null; if dir is not empty as a
+                // result, will cause an error that will be logged below.
+                Files.delete(dir);
+              } catch (IOException e) {
+                System.err.println(msg + dir);
+              }
+              return FileVisitResult.CONTINUE;
+            }
+
+            @Override
+            public FileVisitResult visitFileFailed(Path f, IOException e) {
+              System.err.println(msg + f);
+              return FileVisitResult.CONTINUE;
+            }
+          });
+    } catch (IOException e) {
+      System.err.println(msg + path);
+    }
+  }
+
+  protected boolean isDev() {
+    return false;
+  }
+
+  protected boolean getDeleteCaches() {
+    return false;
+  }
+}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/Browser.java b/java/com/google/gerrit/pgm/init/Browser.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/Browser.java
rename to java/com/google/gerrit/pgm/init/Browser.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/DB2Initializer.java b/java/com/google/gerrit/pgm/init/DB2Initializer.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/DB2Initializer.java
rename to java/com/google/gerrit/pgm/init/DB2Initializer.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/DatabaseConfigInitializer.java b/java/com/google/gerrit/pgm/init/DatabaseConfigInitializer.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/DatabaseConfigInitializer.java
rename to java/com/google/gerrit/pgm/init/DatabaseConfigInitializer.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/DatabaseConfigModule.java b/java/com/google/gerrit/pgm/init/DatabaseConfigModule.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/DatabaseConfigModule.java
rename to java/com/google/gerrit/pgm/init/DatabaseConfigModule.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/DerbyInitializer.java b/java/com/google/gerrit/pgm/init/DerbyInitializer.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/DerbyInitializer.java
rename to java/com/google/gerrit/pgm/init/DerbyInitializer.java
diff --git a/java/com/google/gerrit/pgm/init/ExternalIdsOnInit.java b/java/com/google/gerrit/pgm/init/ExternalIdsOnInit.java
new file mode 100644
index 0000000..6336c93
--- /dev/null
+++ b/java/com/google/gerrit/pgm/init/ExternalIdsOnInit.java
@@ -0,0 +1,77 @@
+// 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.
+
+package com.google.gerrit.pgm.init;
+
+import com.google.gerrit.pgm.init.api.AllUsersNameOnInitProvider;
+import com.google.gerrit.pgm.init.api.InitFlags;
+import com.google.gerrit.server.GerritPersonIdentProvider;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.account.externalids.ExternalIdNotes;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.Collection;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.internal.storage.file.FileRepository;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.lib.RepositoryCache.FileKey;
+import org.eclipse.jgit.util.FS;
+
+public class ExternalIdsOnInit {
+  private final InitFlags flags;
+  private final SitePaths site;
+  private final AllUsersName allUsers;
+
+  @Inject
+  public ExternalIdsOnInit(InitFlags flags, SitePaths site, AllUsersNameOnInitProvider allUsers) {
+    this.flags = flags;
+    this.site = site;
+    this.allUsers = new AllUsersName(allUsers.get());
+  }
+
+  public synchronized void insert(String commitMessage, Collection<ExternalId> extIds)
+      throws OrmException, IOException, ConfigInvalidException {
+    File path = getPath();
+    if (path != null) {
+      try (Repository allUsersRepo = new FileRepository(path)) {
+        ExternalIdNotes extIdNotes = ExternalIdNotes.loadNoCacheUpdate(allUsers, allUsersRepo);
+        extIdNotes.insert(extIds);
+        try (MetaDataUpdate metaDataUpdate =
+            new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsers, allUsersRepo)) {
+          PersonIdent serverIdent = new GerritPersonIdentProvider(flags.cfg).get();
+          metaDataUpdate.getCommitBuilder().setAuthor(serverIdent);
+          metaDataUpdate.getCommitBuilder().setCommitter(serverIdent);
+          metaDataUpdate.getCommitBuilder().setMessage(commitMessage);
+          extIdNotes.commit(metaDataUpdate);
+        }
+      }
+    }
+  }
+
+  private File getPath() {
+    Path basePath = site.resolve(flags.cfg.getString("gerrit", null, "basePath"));
+    if (basePath == null) {
+      throw new IllegalStateException("gerrit.basePath must be configured");
+    }
+    return FileKey.resolve(basePath.resolve(allUsers.get()).toFile(), FS.DETECTED);
+  }
+}
diff --git a/java/com/google/gerrit/pgm/init/GroupsOnInit.java b/java/com/google/gerrit/pgm/init/GroupsOnInit.java
new file mode 100644
index 0000000..8e06aa1
--- /dev/null
+++ b/java/com/google/gerrit/pgm/init/GroupsOnInit.java
@@ -0,0 +1,194 @@
+// Copyright (C) 2017 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.google.gerrit.pgm.init;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.errors.NoSuchGroupException;
+import com.google.gerrit.pgm.init.api.AllUsersNameOnInitProvider;
+import com.google.gerrit.pgm.init.api.InitFlags;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.GerritPersonIdentProvider;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.GerritServerIdProvider;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.group.db.AuditLogFormatter;
+import com.google.gerrit.server.group.db.GroupConfig;
+import com.google.gerrit.server.group.db.GroupNameNotes;
+import com.google.gerrit.server.group.db.InternalGroupUpdate;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.sql.Timestamp;
+import java.util.stream.Stream;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.internal.storage.file.FileRepository;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.lib.RepositoryCache;
+import org.eclipse.jgit.util.FS;
+
+/**
+ * A database accessor for calls related to groups.
+ *
+ * <p>All calls which read or write group related details to the database <strong>during
+ * init</strong> (either ReviewDb or NoteDb) are gathered here. For non-init cases, use {@code
+ * Groups} or {@code GroupsUpdate} instead.
+ *
+ * <p>All methods of this class refer to <em>internal</em> groups.
+ */
+public class GroupsOnInit {
+
+  private final InitFlags flags;
+  private final SitePaths site;
+  private final AllUsersName allUsers;
+
+  @Inject
+  public GroupsOnInit(InitFlags flags, SitePaths site, AllUsersNameOnInitProvider allUsers) {
+    this.flags = flags;
+    this.site = site;
+    this.allUsers = new AllUsersName(allUsers.get());
+  }
+
+  /**
+   * Returns the {@code AccountGroup} for the specified {@code GroupReference}.
+   *
+   * @param db the {@code ReviewDb} instance to use for lookups
+   * @param groupReference the {@code GroupReference} of the group
+   * @return the {@code InternalGroup} represented by the {@code GroupReference}
+   * @throws OrmException if the group couldn't be retrieved from ReviewDb
+   * @throws IOException if an error occurs while reading from NoteDb
+   * @throws ConfigInvalidException if the data in NoteDb is in an incorrect format
+   * @throws NoSuchGroupException if a group with such a name doesn't exist
+   */
+  public InternalGroup getExistingGroup(ReviewDb db, GroupReference groupReference)
+      throws OrmException, NoSuchGroupException, IOException, ConfigInvalidException {
+    File allUsersRepoPath = getPathToAllUsersRepository();
+    if (allUsersRepoPath != null) {
+      try (Repository allUsersRepo = new FileRepository(allUsersRepoPath)) {
+        AccountGroup.UUID groupUuid = groupReference.getUUID();
+        GroupConfig groupConfig = GroupConfig.loadForGroup(allUsers, allUsersRepo, groupUuid);
+        return groupConfig
+            .getLoadedGroup()
+            .orElseThrow(() -> new NoSuchGroupException(groupReference.getUUID()));
+      }
+    }
+    throw new NoSuchGroupException(groupReference.getUUID());
+  }
+
+  /**
+   * Returns {@code GroupReference}s for all internal groups.
+   *
+   * @param db the {@code ReviewDb} instance to use for lookups
+   * @return a stream of the {@code GroupReference}s of all internal groups
+   * @throws OrmException if an error occurs while reading from ReviewDb
+   * @throws IOException if an error occurs while reading from NoteDb
+   * @throws ConfigInvalidException if the data in NoteDb is in an incorrect format
+   */
+  public Stream<GroupReference> getAllGroupReferences(ReviewDb db)
+      throws OrmException, IOException, ConfigInvalidException {
+    File allUsersRepoPath = getPathToAllUsersRepository();
+    if (allUsersRepoPath != null) {
+      try (Repository allUsersRepo = new FileRepository(allUsersRepoPath)) {
+        return GroupNameNotes.loadAllGroups(allUsersRepo).stream();
+      }
+    }
+    return Stream.empty();
+  }
+
+  /**
+   * Adds an account as member to a group. The account is only added as a new member if it isn't
+   * already a member of the group.
+   *
+   * <p><strong>Note</strong>: This method doesn't check whether the account exists! It also doesn't
+   * update the account index!
+   *
+   * @param db the {@code ReviewDb} instance to update
+   * @param groupUuid the UUID of the group
+   * @param account the account to add
+   * @throws OrmException if an error occurs while reading/writing from/to ReviewDb
+   * @throws NoSuchGroupException if the specified group doesn't exist
+   */
+  public void addGroupMember(ReviewDb db, AccountGroup.UUID groupUuid, Account account)
+      throws OrmException, NoSuchGroupException, IOException, ConfigInvalidException {
+    File allUsersRepoPath = getPathToAllUsersRepository();
+    if (allUsersRepoPath != null) {
+      try (Repository repository = new FileRepository(allUsersRepoPath)) {
+        addGroupMemberInNoteDb(repository, groupUuid, account);
+      }
+    }
+  }
+
+  private void addGroupMemberInNoteDb(
+      Repository repository, AccountGroup.UUID groupUuid, Account account)
+      throws IOException, ConfigInvalidException, NoSuchGroupException {
+    GroupConfig groupConfig = GroupConfig.loadForGroup(allUsers, repository, groupUuid);
+    InternalGroup group =
+        groupConfig.getLoadedGroup().orElseThrow(() -> new NoSuchGroupException(groupUuid));
+
+    InternalGroupUpdate groupUpdate = getMemberAdditionUpdate(account);
+    AuditLogFormatter auditLogFormatter = getAuditLogFormatter(account);
+    groupConfig.setGroupUpdate(groupUpdate, auditLogFormatter);
+
+    commit(repository, groupConfig, group.getCreatedOn());
+  }
+
+  @Nullable
+  private File getPathToAllUsersRepository() {
+    Path basePath = site.resolve(flags.cfg.getString("gerrit", null, "basePath"));
+    checkArgument(basePath != null, "gerrit.basePath must be configured");
+    return RepositoryCache.FileKey.resolve(basePath.resolve(allUsers.get()).toFile(), FS.DETECTED);
+  }
+
+  private static InternalGroupUpdate getMemberAdditionUpdate(Account account) {
+    return InternalGroupUpdate.builder()
+        .setMemberModification(members -> Sets.union(members, ImmutableSet.of(account.getId())))
+        .build();
+  }
+
+  private AuditLogFormatter getAuditLogFormatter(Account account)
+      throws IOException, ConfigInvalidException {
+    String serverId = new GerritServerIdProvider(flags.cfg, site).get();
+    return AuditLogFormatter.createBackedBy(ImmutableSet.of(account), ImmutableSet.of(), serverId);
+  }
+
+  private void commit(Repository repository, GroupConfig groupConfig, Timestamp groupCreatedOn)
+      throws IOException {
+    PersonIdent personIdent =
+        new PersonIdent(new GerritPersonIdentProvider(flags.cfg).get(), groupCreatedOn);
+    try (MetaDataUpdate metaDataUpdate = createMetaDataUpdate(repository, personIdent)) {
+      groupConfig.commit(metaDataUpdate);
+    }
+  }
+
+  private MetaDataUpdate createMetaDataUpdate(Repository repository, PersonIdent personIdent) {
+    MetaDataUpdate metaDataUpdate =
+        new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsers, repository);
+    metaDataUpdate.getCommitBuilder().setAuthor(personIdent);
+    metaDataUpdate.getCommitBuilder().setCommitter(personIdent);
+    return metaDataUpdate;
+  }
+}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/H2Initializer.java b/java/com/google/gerrit/pgm/init/H2Initializer.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/H2Initializer.java
rename to java/com/google/gerrit/pgm/init/H2Initializer.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/HANAInitializer.java b/java/com/google/gerrit/pgm/init/HANAInitializer.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/HANAInitializer.java
rename to java/com/google/gerrit/pgm/init/HANAInitializer.java
diff --git a/java/com/google/gerrit/pgm/init/InitAdminUser.java b/java/com/google/gerrit/pgm/init/InitAdminUser.java
new file mode 100644
index 0000000..f12fa50
--- /dev/null
+++ b/java/com/google/gerrit/pgm/init/InitAdminUser.java
@@ -0,0 +1,204 @@
+// Copyright (C) 2014 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.google.gerrit.pgm.init;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.errors.NoSuchGroupException;
+import com.google.gerrit.extensions.client.AuthType;
+import com.google.gerrit.pgm.init.api.AllUsersNameOnInitProvider;
+import com.google.gerrit.pgm.init.api.ConsoleUI;
+import com.google.gerrit.pgm.init.api.InitFlags;
+import com.google.gerrit.pgm.init.api.InitStep;
+import com.google.gerrit.pgm.init.api.SequencesOnInit;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.account.AccountSshKey;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.index.account.AccountIndex;
+import com.google.gerrit.server.index.account.AccountIndexCollection;
+import com.google.gerrit.server.index.group.GroupIndex;
+import com.google.gerrit.server.index.group.GroupIndexCollection;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import org.apache.commons.validator.routines.EmailValidator;
+
+public class InitAdminUser implements InitStep {
+  private final InitFlags flags;
+  private final ConsoleUI ui;
+  private final AllUsersNameOnInitProvider allUsers;
+  private final AccountsOnInit accounts;
+  private final VersionedAuthorizedKeysOnInit.Factory authorizedKeysFactory;
+  private final ExternalIdsOnInit externalIds;
+  private final SequencesOnInit sequencesOnInit;
+  private final GroupsOnInit groupsOnInit;
+  private SchemaFactory<ReviewDb> dbFactory;
+  private AccountIndexCollection accountIndexCollection;
+  private GroupIndexCollection groupIndexCollection;
+
+  @Inject
+  InitAdminUser(
+      InitFlags flags,
+      ConsoleUI ui,
+      AllUsersNameOnInitProvider allUsers,
+      AccountsOnInit accounts,
+      VersionedAuthorizedKeysOnInit.Factory authorizedKeysFactory,
+      ExternalIdsOnInit externalIds,
+      SequencesOnInit sequencesOnInit,
+      GroupsOnInit groupsOnInit) {
+    this.flags = flags;
+    this.ui = ui;
+    this.allUsers = allUsers;
+    this.accounts = accounts;
+    this.authorizedKeysFactory = authorizedKeysFactory;
+    this.externalIds = externalIds;
+    this.sequencesOnInit = sequencesOnInit;
+    this.groupsOnInit = groupsOnInit;
+  }
+
+  @Override
+  public void run() {}
+
+  @Inject(optional = true)
+  void set(SchemaFactory<ReviewDb> dbFactory) {
+    this.dbFactory = dbFactory;
+  }
+
+  @Inject
+  void set(AccountIndexCollection accountIndexCollection) {
+    this.accountIndexCollection = accountIndexCollection;
+  }
+
+  @Inject
+  void set(GroupIndexCollection groupIndexCollection) {
+    this.groupIndexCollection = groupIndexCollection;
+  }
+
+  @Override
+  public void postRun() throws Exception {
+    AuthType authType = flags.cfg.getEnum(AuthType.values(), "auth", null, "type", null);
+    if (authType != AuthType.DEVELOPMENT_BECOME_ANY_ACCOUNT) {
+      return;
+    }
+
+    try (ReviewDb db = dbFactory.open()) {
+      if (!accounts.hasAnyAccount()) {
+        ui.header("Gerrit Administrator");
+        if (ui.yesno(true, "Create administrator user")) {
+          Account.Id id = new Account.Id(sequencesOnInit.nextAccountId(db));
+          String username = ui.readString("admin", "username");
+          String name = ui.readString("Administrator", "name");
+          String httpPassword = ui.readString("secret", "HTTP password");
+          AccountSshKey sshKey = readSshKey(id);
+          String email = readEmail(sshKey);
+
+          List<ExternalId> extIds = new ArrayList<>(2);
+          extIds.add(ExternalId.createUsername(username, id, httpPassword));
+
+          if (email != null) {
+            extIds.add(ExternalId.createEmail(id, email));
+          }
+          externalIds.insert("Add external IDs for initial admin user", extIds);
+
+          Account a = new Account(id, TimeUtil.nowTs());
+          a.setFullName(name);
+          a.setPreferredEmail(email);
+          accounts.insert(a);
+
+          // Only two groups should exist at this point in time and hence iterating over all of them
+          // is cheap.
+          Optional<GroupReference> adminGroupReference =
+              groupsOnInit
+                  .getAllGroupReferences(db)
+                  .filter(group -> group.getName().equals("Administrators"))
+                  .findAny();
+          if (!adminGroupReference.isPresent()) {
+            throw new NoSuchGroupException("Administrators");
+          }
+          GroupReference adminGroup = adminGroupReference.get();
+          groupsOnInit.addGroupMember(db, adminGroup.getUUID(), a);
+
+          if (sshKey != null) {
+            VersionedAuthorizedKeysOnInit authorizedKeys = authorizedKeysFactory.create(id).load();
+            authorizedKeys.addKey(sshKey.sshPublicKey());
+            authorizedKeys.save("Add SSH key for initial admin user\n");
+          }
+
+          AccountState as = AccountState.forAccount(new AllUsersName(allUsers.get()), a, extIds);
+          for (AccountIndex accountIndex : accountIndexCollection.getWriteIndexes()) {
+            accountIndex.replace(as);
+          }
+
+          InternalGroup adminInternalGroup = groupsOnInit.getExistingGroup(db, adminGroup);
+          for (GroupIndex groupIndex : groupIndexCollection.getWriteIndexes()) {
+            groupIndex.replace(adminInternalGroup);
+          }
+        }
+      }
+    }
+  }
+
+  private String readEmail(AccountSshKey sshKey) {
+    String defaultEmail = "admin@example.com";
+    if (sshKey != null && sshKey.comment() != null) {
+      String c = sshKey.comment().trim();
+      if (EmailValidator.getInstance().isValid(c)) {
+        defaultEmail = c;
+      }
+    }
+    return readEmail(defaultEmail);
+  }
+
+  private String readEmail(String defaultEmail) {
+    String email = ui.readString(defaultEmail, "email");
+    if (email != null && !EmailValidator.getInstance().isValid(email)) {
+      ui.message("error: invalid email address\n");
+      return readEmail(defaultEmail);
+    }
+    return email;
+  }
+
+  private AccountSshKey readSshKey(Account.Id id) throws IOException {
+    String defaultPublicSshKeyFile = "";
+    Path defaultPublicSshKeyPath = Paths.get(System.getProperty("user.home"), ".ssh", "id_rsa.pub");
+    if (Files.exists(defaultPublicSshKeyPath)) {
+      defaultPublicSshKeyFile = defaultPublicSshKeyPath.toString();
+    }
+    String publicSshKeyFile = ui.readString(defaultPublicSshKeyFile, "public SSH key file");
+    return !Strings.isNullOrEmpty(publicSshKeyFile) ? createSshKey(id, publicSshKeyFile) : null;
+  }
+
+  private AccountSshKey createSshKey(Account.Id id, String keyFile) throws IOException {
+    Path p = Paths.get(keyFile);
+    if (!Files.exists(p)) {
+      throw new IOException(String.format("Cannot add public SSH key: %s is not a file", keyFile));
+    }
+    String content = new String(Files.readAllBytes(p), UTF_8);
+    return AccountSshKey.create(id, 1, content);
+  }
+}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitAuth.java b/java/com/google/gerrit/pgm/init/InitAuth.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitAuth.java
rename to java/com/google/gerrit/pgm/init/InitAuth.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitCache.java b/java/com/google/gerrit/pgm/init/InitCache.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitCache.java
rename to java/com/google/gerrit/pgm/init/InitCache.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitContainer.java b/java/com/google/gerrit/pgm/init/InitContainer.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitContainer.java
rename to java/com/google/gerrit/pgm/init/InitContainer.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitDatabase.java b/java/com/google/gerrit/pgm/init/InitDatabase.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitDatabase.java
rename to java/com/google/gerrit/pgm/init/InitDatabase.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitDev.java b/java/com/google/gerrit/pgm/init/InitDev.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitDev.java
rename to java/com/google/gerrit/pgm/init/InitDev.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitGitManager.java b/java/com/google/gerrit/pgm/init/InitGitManager.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitGitManager.java
rename to java/com/google/gerrit/pgm/init/InitGitManager.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitHttpd.java b/java/com/google/gerrit/pgm/init/InitHttpd.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitHttpd.java
rename to java/com/google/gerrit/pgm/init/InitHttpd.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitIndex.java b/java/com/google/gerrit/pgm/init/InitIndex.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitIndex.java
rename to java/com/google/gerrit/pgm/init/InitIndex.java
diff --git a/java/com/google/gerrit/pgm/init/InitLabels.java b/java/com/google/gerrit/pgm/init/InitLabels.java
new file mode 100644
index 0000000..3d1ec7b
--- /dev/null
+++ b/java/com/google/gerrit/pgm/init/InitLabels.java
@@ -0,0 +1,69 @@
+// Copyright (C) 2013 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.google.gerrit.pgm.init;
+
+import static com.google.gerrit.common.data.LabelFunction.MAX_WITH_BLOCK;
+
+import com.google.gerrit.pgm.init.api.AllProjectsConfig;
+import com.google.gerrit.pgm.init.api.ConsoleUI;
+import com.google.gerrit.pgm.init.api.InitStep;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.Arrays;
+import org.eclipse.jgit.lib.Config;
+
+@Singleton
+public class InitLabels implements InitStep {
+  private static final String KEY_COPY_ALL_SCORES_IF_NO_CODE_CHANGE = "copyAllScoresIfNoCodeChange";
+  private static final String KEY_LABEL = "label";
+  private static final String KEY_FUNCTION = "function";
+  private static final String KEY_VALUE = "value";
+  private static final String LABEL_VERIFIED = "Verified";
+
+  private final ConsoleUI ui;
+  private final AllProjectsConfig allProjectsConfig;
+
+  private boolean installVerified;
+
+  @Inject
+  InitLabels(ConsoleUI ui, AllProjectsConfig allProjectsConfig) {
+    this.ui = ui;
+    this.allProjectsConfig = allProjectsConfig;
+  }
+
+  @Override
+  public void run() throws Exception {
+    Config cfg = allProjectsConfig.load().getConfig();
+    if (cfg == null || !cfg.getSubsections(KEY_LABEL).contains(LABEL_VERIFIED)) {
+      ui.header("Review Labels");
+      installVerified = ui.yesno(false, "Install Verified label");
+    }
+  }
+
+  @Override
+  public void postRun() throws Exception {
+    Config cfg = allProjectsConfig.load().getConfig();
+    if (installVerified) {
+      cfg.setString(KEY_LABEL, LABEL_VERIFIED, KEY_FUNCTION, MAX_WITH_BLOCK.getFunctionName());
+      cfg.setStringList(
+          KEY_LABEL,
+          LABEL_VERIFIED,
+          KEY_VALUE,
+          Arrays.asList(new String[] {"-1 Fails", "0 No score", "+1 Verified"}));
+      cfg.setBoolean(KEY_LABEL, LABEL_VERIFIED, KEY_COPY_ALL_SCORES_IF_NO_CODE_CHANGE, true);
+      allProjectsConfig.save("Configure 'Verified' label");
+    }
+  }
+}
diff --git a/java/com/google/gerrit/pgm/init/InitLogging.java b/java/com/google/gerrit/pgm/init/InitLogging.java
new file mode 100644
index 0000000..b6d25bc
--- /dev/null
+++ b/java/com/google/gerrit/pgm/init/InitLogging.java
@@ -0,0 +1,66 @@
+// 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.
+
+package com.google.gerrit.pgm.init;
+
+import com.google.gerrit.pgm.init.api.InitStep;
+import com.google.gerrit.pgm.init.api.Section;
+import com.google.inject.Inject;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class InitLogging implements InitStep {
+  private static final String CONTAINER = "container";
+  private static final String JAVA_OPTIONS = "javaOptions";
+  private static final String FLOGGER_BACKEND_PROPERTY = "flogger.backend_factory";
+  private static final String FLOGGER_LOGGING_CONTEXT = "flogger.logging_context";
+
+  private final Section container;
+
+  @Inject
+  public InitLogging(Section.Factory sections) {
+    this.container = sections.get(CONTAINER, null);
+  }
+
+  @Override
+  public void run() throws Exception {
+    List<String> javaOptions = new ArrayList<>(Arrays.asList(container.getList(JAVA_OPTIONS)));
+    if (!isSet(javaOptions, FLOGGER_BACKEND_PROPERTY)) {
+      javaOptions.add(
+          getJavaOption(
+              FLOGGER_BACKEND_PROPERTY,
+              "com.google.common.flogger.backend.log4j.Log4jBackendFactory#getInstance"));
+    }
+    if (!isSet(javaOptions, FLOGGER_LOGGING_CONTEXT)) {
+      javaOptions.add(
+          getJavaOption(
+              FLOGGER_LOGGING_CONTEXT,
+              "com.google.gerrit.server.logging.LoggingContext#getInstance"));
+    }
+    container.setList(JAVA_OPTIONS, javaOptions);
+  }
+
+  private static boolean isSet(List<String> javaOptions, String javaOptionName) {
+    return javaOptions.stream()
+        .anyMatch(
+            o ->
+                o.startsWith("-D" + javaOptionName + "=")
+                    || o.startsWith("\"-D" + javaOptionName + "="));
+  }
+
+  private static String getJavaOption(String javaOptionName, String value) {
+    return String.format("-D%s=%s", javaOptionName, value);
+  }
+}
diff --git a/java/com/google/gerrit/pgm/init/InitModule.java b/java/com/google/gerrit/pgm/init/InitModule.java
new file mode 100644
index 0000000..f677ceb
--- /dev/null
+++ b/java/com/google/gerrit/pgm/init/InitModule.java
@@ -0,0 +1,72 @@
+// Copyright (C) 2009 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.google.gerrit.pgm.init;
+
+import com.google.gerrit.extensions.config.FactoryModule;
+import com.google.gerrit.pgm.init.api.InitStep;
+import com.google.gerrit.pgm.init.api.Section;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.inject.binder.LinkedBindingBuilder;
+import com.google.inject.internal.UniqueAnnotations;
+import java.lang.annotation.Annotation;
+
+/** Injection configuration for the site initialization process. */
+public class InitModule extends FactoryModule {
+
+  private final boolean standalone;
+  private final boolean initDb;
+
+  public InitModule(boolean standalone, boolean initDb) {
+    this.standalone = standalone;
+    this.initDb = initDb;
+  }
+
+  @Override
+  protected void configure() {
+    bind(SitePaths.class);
+    bind(Libraries.class);
+    bind(LibraryDownloader.class);
+    factory(Section.Factory.class);
+    factory(VersionedAuthorizedKeysOnInit.Factory.class);
+
+    // Steps are executed in the order listed here.
+    //
+    step().to(UpgradeFrom2_0_x.class);
+
+    step().to(InitGitManager.class);
+    if (initDb) {
+      step().to(InitDatabase.class);
+    }
+    step().to(InitLogging.class);
+    step().to(InitIndex.class);
+    step().to(InitAuth.class);
+    step().to(InitAdminUser.class);
+    step().to(InitLabels.class);
+    step().to(InitSendEmail.class);
+    if (standalone) {
+      step().to(InitContainer.class);
+    }
+    step().to(InitSshd.class);
+    step().to(InitHttpd.class);
+    step().to(InitCache.class);
+    step().to(InitPlugins.class);
+    step().to(InitDev.class);
+  }
+
+  protected LinkedBindingBuilder<InitStep> step() {
+    final Annotation id = UniqueAnnotations.create();
+    return bind(InitStep.class).annotatedWith(id);
+  }
+}
diff --git a/java/com/google/gerrit/pgm/init/InitPluginStepsLoader.java b/java/com/google/gerrit/pgm/init/InitPluginStepsLoader.java
new file mode 100644
index 0000000..a7f9c5d
--- /dev/null
+++ b/java/com/google/gerrit/pgm/init/InitPluginStepsLoader.java
@@ -0,0 +1,120 @@
+// Copyright (C) 2012 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.google.gerrit.pgm.init;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.extensions.annotations.PluginName;
+import com.google.gerrit.pgm.init.api.ConsoleUI;
+import com.google.gerrit.pgm.init.api.InitStep;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.plugins.JarPluginProvider;
+import com.google.gerrit.server.plugins.PluginUtil;
+import com.google.inject.AbstractModule;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.jar.Attributes;
+import java.util.jar.JarFile;
+
+@Singleton
+public class InitPluginStepsLoader {
+  private final Path pluginsDir;
+  private final Injector initInjector;
+  final ConsoleUI ui;
+
+  @Inject
+  public InitPluginStepsLoader(final ConsoleUI ui, SitePaths sitePaths, Injector initInjector) {
+    this.pluginsDir = sitePaths.plugins_dir;
+    this.initInjector = initInjector;
+    this.ui = ui;
+  }
+
+  public Collection<InitStep> getInitSteps() {
+    List<Path> jars = scanJarsInPluginsDirectory();
+    ArrayList<InitStep> pluginsInitSteps = new ArrayList<>();
+
+    for (Path jar : jars) {
+      InitStep init = loadInitStep(jar);
+      if (init != null) {
+        pluginsInitSteps.add(init);
+      }
+    }
+    return pluginsInitSteps;
+  }
+
+  private InitStep loadInitStep(Path jar) {
+    try {
+      URLClassLoader pluginLoader =
+          URLClassLoader.newInstance(
+              new URL[] {jar.toUri().toURL()}, InitPluginStepsLoader.class.getClassLoader());
+      try (JarFile jarFile = new JarFile(jar.toFile())) {
+        Attributes jarFileAttributes = jarFile.getManifest().getMainAttributes();
+        String initClassName = jarFileAttributes.getValue("Gerrit-InitStep");
+        if (initClassName == null) {
+          return null;
+        }
+        @SuppressWarnings("unchecked")
+        Class<? extends InitStep> initStepClass =
+            (Class<? extends InitStep>) pluginLoader.loadClass(initClassName);
+        return getPluginInjector(jar).getInstance(initStepClass);
+      } catch (ClassCastException e) {
+        ui.message(
+            "WARN: InitStep from plugin %s does not implement %s (Exception: %s)\n",
+            jar.getFileName(), InitStep.class.getName(), e.getMessage());
+        return null;
+      } catch (NoClassDefFoundError e) {
+        ui.message(
+            "WARN: Failed to run InitStep from plugin %s (Missing class: %s)\n",
+            jar.getFileName(), e.getMessage());
+        return null;
+      }
+    } catch (Exception e) {
+      ui.message(
+          "WARN: Cannot load and get plugin init step for %s (Exception: %s)\n",
+          jar, e.getMessage());
+      return null;
+    }
+  }
+
+  private Injector getPluginInjector(Path jarPath) throws IOException {
+    final String pluginName =
+        MoreObjects.firstNonNull(
+            JarPluginProvider.getJarPluginName(jarPath), PluginUtil.nameOf(jarPath));
+    return initInjector.createChildInjector(
+        new AbstractModule() {
+          @Override
+          protected void configure() {
+            bind(String.class).annotatedWith(PluginName.class).toInstance(pluginName);
+          }
+        });
+  }
+
+  private List<Path> scanJarsInPluginsDirectory() {
+    try {
+      return PluginUtil.listPlugins(pluginsDir, ".jar");
+    } catch (IOException e) {
+      ui.message("WARN: Cannot list %s: %s", pluginsDir.toAbsolutePath(), e.getMessage());
+      return ImmutableList.of();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/pgm/init/InitPlugins.java b/java/com/google/gerrit/pgm/init/InitPlugins.java
new file mode 100644
index 0000000..e43114c
--- /dev/null
+++ b/java/com/google/gerrit/pgm/init/InitPlugins.java
@@ -0,0 +1,199 @@
+// Copyright (C) 2012 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.google.gerrit.pgm.init;
+
+import static java.util.Comparator.comparing;
+
+import com.google.gerrit.common.PluginData;
+import com.google.gerrit.pgm.init.api.ConsoleUI;
+import com.google.gerrit.pgm.init.api.InitFlags;
+import com.google.gerrit.pgm.init.api.InitStep;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.plugins.JarPluginProvider;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.jar.Attributes;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+
+@Singleton
+public class InitPlugins implements InitStep {
+  public static final String PLUGIN_DIR = "WEB-INF/plugins/";
+  public static final String JAR = ".jar";
+
+  public static List<PluginData> listPlugins(
+      SitePaths site, PluginsDistribution pluginsDistribution) throws IOException {
+    return listPlugins(site, false, pluginsDistribution);
+  }
+
+  public static List<PluginData> listPluginsAndRemoveTempFiles(
+      SitePaths site, PluginsDistribution pluginsDistribution) throws IOException {
+    return listPlugins(site, true, pluginsDistribution);
+  }
+
+  private static List<PluginData> listPlugins(
+      final SitePaths site,
+      final boolean deleteTempPluginFile,
+      PluginsDistribution pluginsDistribution)
+      throws IOException {
+    final List<PluginData> result = new ArrayList<>();
+    pluginsDistribution.foreach(
+        (pluginName, in) -> {
+          Path tmpPlugin = JarPluginProvider.storeInTemp(pluginName, in, site);
+          String pluginVersion = getVersion(tmpPlugin);
+          if (deleteTempPluginFile) {
+            Files.delete(tmpPlugin);
+          }
+          result.add(new PluginData(pluginName, pluginVersion, tmpPlugin));
+        });
+    result.sort(comparing(p -> p.name));
+    return result;
+  }
+
+  private final ConsoleUI ui;
+  private final SitePaths site;
+  private final InitFlags initFlags;
+  private final InitPluginStepsLoader pluginLoader;
+  private final PluginsDistribution pluginsDistribution;
+
+  private Injector postRunInjector;
+
+  @Inject
+  InitPlugins(
+      final ConsoleUI ui,
+      final SitePaths site,
+      InitFlags initFlags,
+      InitPluginStepsLoader pluginLoader,
+      PluginsDistribution pluginsDistribution) {
+    this.ui = ui;
+    this.site = site;
+    this.initFlags = initFlags;
+    this.pluginLoader = pluginLoader;
+    this.pluginsDistribution = pluginsDistribution;
+  }
+
+  @Override
+  public void run() throws Exception {
+    ui.header("Plugins");
+
+    installPlugins();
+    initPlugins();
+  }
+
+  @Override
+  public void postRun() throws Exception {
+    postInitPlugins();
+  }
+
+  @Inject(optional = true)
+  void setPostRunInjector(Injector injector) {
+    postRunInjector = injector;
+  }
+
+  private void installPlugins() throws IOException {
+    ui.message("Installing plugins.\n");
+    List<PluginData> plugins = listPlugins(site, pluginsDistribution);
+    for (PluginData plugin : plugins) {
+      String pluginName = plugin.name;
+      try {
+        final Path tmpPlugin = plugin.pluginPath;
+        Path p = site.plugins_dir.resolve(plugin.name + ".jar");
+        boolean upgrade = Files.exists(p);
+
+        if (!(initFlags.installPlugins.contains(pluginName)
+            || initFlags.installAllPlugins
+            || ui.yesno(upgrade, "Install plugin %s version %s", pluginName, plugin.version))) {
+          Files.deleteIfExists(tmpPlugin);
+          continue;
+        }
+
+        if (upgrade) {
+          final String installedPluginVersion = getVersion(p);
+          if (!ui.yesno(
+              upgrade,
+              "%s %s is already installed, overwrite it",
+              plugin.name,
+              installedPluginVersion)) {
+            Files.deleteIfExists(tmpPlugin);
+            continue;
+          }
+          try {
+            Files.delete(p);
+          } catch (IOException e) {
+            throw new IOException(
+                "Failed to delete plugin " + pluginName + ": " + p.toAbsolutePath(), e);
+          }
+        }
+        try {
+          Files.move(tmpPlugin, p);
+          if (upgrade) {
+            // or update that is not an upgrade
+            ui.message("Updated %s to %s\n", plugin.name, plugin.version);
+          } else {
+            ui.message("Installed %s %s\n", plugin.name, plugin.version);
+          }
+        } catch (IOException e) {
+          throw new IOException(
+              "Failed to install plugin "
+                  + pluginName
+                  + ": "
+                  + tmpPlugin.toAbsolutePath()
+                  + " -> "
+                  + p.toAbsolutePath(),
+              e);
+        }
+      } finally {
+        Files.deleteIfExists(plugin.pluginPath);
+      }
+    }
+    if (plugins.isEmpty()) {
+      ui.message("No plugins found to install.\n");
+    }
+  }
+
+  private void initPlugins() throws Exception {
+    ui.message("Initializing plugins.\n");
+    Collection<InitStep> initSteps = pluginLoader.getInitSteps();
+    if (initSteps.isEmpty()) {
+      ui.message("No plugins found with init steps.\n");
+    } else {
+      for (InitStep initStep : initSteps) {
+        initStep.run();
+      }
+    }
+  }
+
+  private void postInitPlugins() throws Exception {
+    for (InitStep initStep : pluginLoader.getInitSteps()) {
+      postRunInjector.injectMembers(initStep);
+      initStep.postRun();
+    }
+  }
+
+  private static String getVersion(Path plugin) throws IOException {
+    try (JarFile jarFile = new JarFile(plugin.toFile())) {
+      Manifest manifest = jarFile.getManifest();
+      Attributes main = manifest.getMainAttributes();
+      return main.getValue(Attributes.Name.IMPLEMENTATION_VERSION);
+    }
+  }
+}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitSendEmail.java b/java/com/google/gerrit/pgm/init/InitSendEmail.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitSendEmail.java
rename to java/com/google/gerrit/pgm/init/InitSendEmail.java
diff --git a/java/com/google/gerrit/pgm/init/InitSshd.java b/java/com/google/gerrit/pgm/init/InitSshd.java
new file mode 100644
index 0000000..68bdefc
--- /dev/null
+++ b/java/com/google/gerrit/pgm/init/InitSshd.java
@@ -0,0 +1,230 @@
+// Copyright (C) 2009 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.google.gerrit.pgm.init;
+
+import static com.google.gerrit.pgm.init.api.InitUtil.hostname;
+import static java.nio.file.Files.exists;
+
+import com.google.gerrit.pgm.init.api.ConsoleUI;
+import com.google.gerrit.pgm.init.api.InitStep;
+import com.google.gerrit.pgm.init.api.Section;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.ioutil.HostPlatform;
+import com.google.gerrit.server.util.SocketUtil;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.lang.ProcessBuilder.Redirect;
+import java.net.InetSocketAddress;
+
+/** Initialize the {@code sshd} configuration section. */
+@Singleton
+public class InitSshd implements InitStep {
+  private final ConsoleUI ui;
+  private final SitePaths site;
+  private final Section sshd;
+  private final StaleLibraryRemover remover;
+
+  @Inject
+  InitSshd(ConsoleUI ui, SitePaths site, Section.Factory sections, StaleLibraryRemover remover) {
+    this.ui = ui;
+    this.site = site;
+    this.sshd = sections.get("sshd", null);
+    this.remover = remover;
+  }
+
+  @Override
+  public void run() throws Exception {
+    ui.header("SSH Daemon");
+
+    String hostname = "*";
+    int port = 29418;
+    String listenAddress = sshd.get("listenAddress");
+    if (isOff(listenAddress)) {
+      hostname = "off";
+    } else if (listenAddress != null && !listenAddress.isEmpty()) {
+      final InetSocketAddress addr = SocketUtil.parse(listenAddress, port);
+      hostname = SocketUtil.hostname(addr);
+      port = addr.getPort();
+    }
+
+    hostname = ui.readString(hostname, "Listen on address");
+    if (isOff(hostname)) {
+      sshd.set("listenAddress", "off");
+      return;
+    }
+
+    port = ui.readInt(port, "Listen on port");
+    sshd.set("listenAddress", SocketUtil.format(hostname, port));
+
+    generateSshHostKeys();
+    remover.remove("bc(pg|pkix|prov)-.*[.]jar");
+  }
+
+  static boolean isOff(String listenHostname) {
+    return "off".equalsIgnoreCase(listenHostname)
+        || "none".equalsIgnoreCase(listenHostname)
+        || "no".equalsIgnoreCase(listenHostname);
+  }
+
+  private void generateSshHostKeys() throws InterruptedException, IOException {
+    if (!exists(site.ssh_key)
+        && (!exists(site.ssh_rsa)
+            || !exists(site.ssh_ed25519)
+            || !exists(site.ssh_ecdsa_256)
+            || !exists(site.ssh_ecdsa_384)
+            || !exists(site.ssh_ecdsa_521))) {
+      System.err.print("Generating SSH host key ...");
+      System.err.flush();
+
+      // Generate the SSH daemon host key using ssh-keygen.
+      //
+      final String comment = "gerrit-code-review@" + hostname();
+
+      // Workaround for JDK-6518827 - zero-length argument ignored on Win32
+      String emptyPassphraseArg = HostPlatform.isWin32() ? "\"\"" : "";
+      if (!exists(site.ssh_rsa)) {
+        System.err.print(" rsa...");
+        System.err.flush();
+        new ProcessBuilder(
+                "ssh-keygen",
+                "-q" /* quiet */,
+                "-t",
+                "rsa",
+                "-N",
+                emptyPassphraseArg,
+                "-C",
+                comment,
+                "-f",
+                site.ssh_rsa.toAbsolutePath().toString())
+            .redirectError(Redirect.INHERIT)
+            .redirectOutput(Redirect.INHERIT)
+            .start()
+            .waitFor();
+      }
+
+      if (!exists(site.ssh_ed25519)) {
+        System.err.print(" ed25519...");
+        System.err.flush();
+        try {
+          new ProcessBuilder(
+                  "ssh-keygen",
+                  "-q" /* quiet */,
+                  "-t",
+                  "ed25519",
+                  "-P",
+                  emptyPassphraseArg,
+                  "-C",
+                  comment,
+                  "-f",
+                  site.ssh_ed25519.toAbsolutePath().toString())
+              .redirectError(Redirect.INHERIT)
+              .redirectOutput(Redirect.INHERIT)
+              .start()
+              .waitFor();
+        } catch (Exception e) {
+          // continue since older hosts won't be able to generate ed25519 keys.
+          System.err.print(" Failed to generate ed25519 key, continuing...");
+          System.err.flush();
+        }
+      }
+
+      if (!exists(site.ssh_ecdsa_256)) {
+        System.err.print(" ecdsa 256...");
+        System.err.flush();
+        try {
+          new ProcessBuilder(
+                  "ssh-keygen",
+                  "-q" /* quiet */,
+                  "-t",
+                  "ecdsa",
+                  "-b",
+                  "256",
+                  "-P",
+                  emptyPassphraseArg,
+                  "-C",
+                  comment,
+                  "-f",
+                  site.ssh_ecdsa_256.toAbsolutePath().toString())
+              .redirectError(Redirect.INHERIT)
+              .redirectOutput(Redirect.INHERIT)
+              .start()
+              .waitFor();
+        } catch (Exception e) {
+          // continue since older hosts won't be able to generate ecdsa keys.
+          System.err.print(" Failed to generate ecdsa 256 key, continuing...");
+          System.err.flush();
+        }
+      }
+
+      if (!exists(site.ssh_ecdsa_384)) {
+        System.err.print(" ecdsa 384...");
+        System.err.flush();
+        try {
+          new ProcessBuilder(
+                  "ssh-keygen",
+                  "-q" /* quiet */,
+                  "-t",
+                  "ecdsa",
+                  "-b",
+                  "384",
+                  "-P",
+                  emptyPassphraseArg,
+                  "-C",
+                  comment,
+                  "-f",
+                  site.ssh_ecdsa_384.toAbsolutePath().toString())
+              .redirectError(Redirect.INHERIT)
+              .redirectOutput(Redirect.INHERIT)
+              .start()
+              .waitFor();
+        } catch (Exception e) {
+          // continue since older hosts won't be able to generate ecdsa keys.
+          System.err.print(" Failed to generate ecdsa 384 key, continuing...");
+          System.err.flush();
+        }
+      }
+
+      if (!exists(site.ssh_ecdsa_521)) {
+        System.err.print(" ecdsa 521...");
+        System.err.flush();
+        try {
+          new ProcessBuilder(
+                  "ssh-keygen",
+                  "-q" /* quiet */,
+                  "-t",
+                  "ecdsa",
+                  "-b",
+                  "521",
+                  "-P",
+                  emptyPassphraseArg,
+                  "-C",
+                  comment,
+                  "-f",
+                  site.ssh_ecdsa_521.toAbsolutePath().toString())
+              .redirectError(Redirect.INHERIT)
+              .redirectOutput(Redirect.INHERIT)
+              .start()
+              .waitFor();
+        } catch (Exception e) {
+          // continue since older hosts won't be able to generate ecdsa keys.
+          System.err.print(" Failed to generate ecdsa 521 key, continuing...");
+          System.err.flush();
+        }
+      }
+      System.err.println(" done");
+    }
+  }
+}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InvalidSecureStoreException.java b/java/com/google/gerrit/pgm/init/InvalidSecureStoreException.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InvalidSecureStoreException.java
rename to java/com/google/gerrit/pgm/init/InvalidSecureStoreException.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/JDBCInitializer.java b/java/com/google/gerrit/pgm/init/JDBCInitializer.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/JDBCInitializer.java
rename to java/com/google/gerrit/pgm/init/JDBCInitializer.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/Libraries.java b/java/com/google/gerrit/pgm/init/Libraries.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/Libraries.java
rename to java/com/google/gerrit/pgm/init/Libraries.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/LibraryDownloader.java b/java/com/google/gerrit/pgm/init/LibraryDownloader.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/LibraryDownloader.java
rename to java/com/google/gerrit/pgm/init/LibraryDownloader.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/MariaDbInitializer.java b/java/com/google/gerrit/pgm/init/MariaDbInitializer.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/MariaDbInitializer.java
rename to java/com/google/gerrit/pgm/init/MariaDbInitializer.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/MaxDbInitializer.java b/java/com/google/gerrit/pgm/init/MaxDbInitializer.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/MaxDbInitializer.java
rename to java/com/google/gerrit/pgm/init/MaxDbInitializer.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/MySqlInitializer.java b/java/com/google/gerrit/pgm/init/MySqlInitializer.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/MySqlInitializer.java
rename to java/com/google/gerrit/pgm/init/MySqlInitializer.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/OracleInitializer.java b/java/com/google/gerrit/pgm/init/OracleInitializer.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/OracleInitializer.java
rename to java/com/google/gerrit/pgm/init/OracleInitializer.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/PluginsDistribution.java b/java/com/google/gerrit/pgm/init/PluginsDistribution.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/PluginsDistribution.java
rename to java/com/google/gerrit/pgm/init/PluginsDistribution.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/PostgreSQLInitializer.java b/java/com/google/gerrit/pgm/init/PostgreSQLInitializer.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/PostgreSQLInitializer.java
rename to java/com/google/gerrit/pgm/init/PostgreSQLInitializer.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/SecureStoreInitData.java b/java/com/google/gerrit/pgm/init/SecureStoreInitData.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/SecureStoreInitData.java
rename to java/com/google/gerrit/pgm/init/SecureStoreInitData.java
diff --git a/java/com/google/gerrit/pgm/init/SitePathInitializer.java b/java/com/google/gerrit/pgm/init/SitePathInitializer.java
new file mode 100644
index 0000000..bc562cc
--- /dev/null
+++ b/java/com/google/gerrit/pgm/init/SitePathInitializer.java
@@ -0,0 +1,181 @@
+// 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.
+
+package com.google.gerrit.pgm.init;
+
+import static com.google.gerrit.common.FileUtil.chmod;
+import static com.google.gerrit.pgm.init.api.InitUtil.die;
+import static com.google.gerrit.pgm.init.api.InitUtil.extract;
+import static com.google.gerrit.pgm.init.api.InitUtil.mkdir;
+import static com.google.gerrit.pgm.init.api.InitUtil.savePublic;
+import static com.google.gerrit.pgm.init.api.InitUtil.version;
+
+import com.google.gerrit.common.FileUtil;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.pgm.init.api.ConsoleUI;
+import com.google.gerrit.pgm.init.api.InitFlags;
+import com.google.gerrit.pgm.init.api.InitStep;
+import com.google.gerrit.pgm.init.api.Section;
+import com.google.gerrit.pgm.init.api.Section.Factory;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.mail.EmailModule;
+import com.google.inject.Binding;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.TypeLiteral;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+
+/** Initialize (or upgrade) an existing site. */
+public class SitePathInitializer {
+  private final ConsoleUI ui;
+  private final InitFlags flags;
+  private final SitePaths site;
+  private final List<InitStep> steps;
+  private final Factory sectionFactory;
+  private final SecureStoreInitData secureStoreInitData;
+
+  @Inject
+  public SitePathInitializer(
+      final Injector injector,
+      final ConsoleUI ui,
+      final InitFlags flags,
+      final SitePaths site,
+      final Section.Factory sectionFactory,
+      @Nullable final SecureStoreInitData secureStoreInitData) {
+    this.ui = ui;
+    this.flags = flags;
+    this.site = site;
+    this.sectionFactory = sectionFactory;
+    this.secureStoreInitData = secureStoreInitData;
+    this.steps = stepsOf(injector);
+  }
+
+  public void run() throws Exception {
+    ui.header("Gerrit Code Review %s", version());
+
+    if (site.isNew) {
+      if (!ui.yesno(true, "Create '%s'", site.site_path.toAbsolutePath())) {
+        throw die("aborted by user");
+      }
+      FileUtil.mkdirsOrDie(site.site_path, "Cannot make directory");
+      flags.deleteOnFailure = true;
+    }
+
+    mkdir(site.bin_dir);
+    mkdir(site.etc_dir);
+    mkdir(site.lib_dir);
+    mkdir(site.tmp_dir);
+    mkdir(site.logs_dir);
+    mkdir(site.mail_dir);
+    mkdir(site.static_dir);
+    mkdir(site.plugins_dir);
+    mkdir(site.data_dir);
+
+    for (InitStep step : steps) {
+      if (step instanceof InitPlugins && flags.skipPlugins) {
+        continue;
+      }
+      step.run();
+    }
+
+    saveSecureStore();
+    savePublic(flags.cfg);
+
+    extract(site.gerrit_sh, getClass(), "gerrit.sh");
+    chmod(0755, site.gerrit_sh);
+    extract(site.gerrit_service, getClass(), "gerrit.service");
+    chmod(0755, site.gerrit_service);
+    extract(site.gerrit_socket, getClass(), "gerrit.socket");
+    chmod(0755, site.gerrit_socket);
+    chmod(0700, site.tmp_dir);
+
+    extractMailExample("Abandoned.soy");
+    extractMailExample("AbandonedHtml.soy");
+    extractMailExample("AddKey.soy");
+    extractMailExample("ChangeFooter.soy");
+    extractMailExample("ChangeFooterHtml.soy");
+    extractMailExample("ChangeSubject.soy");
+    extractMailExample("Comment.soy");
+    extractMailExample("CommentHtml.soy");
+    extractMailExample("CommentFooter.soy");
+    extractMailExample("CommentFooterHtml.soy");
+    extractMailExample("DeleteReviewer.soy");
+    extractMailExample("DeleteReviewerHtml.soy");
+    extractMailExample("DeleteVote.soy");
+    extractMailExample("DeleteVoteHtml.soy");
+    extractMailExample("Footer.soy");
+    extractMailExample("FooterHtml.soy");
+    extractMailExample("HeaderHtml.soy");
+    extractMailExample("InboundEmailRejection.soy");
+    extractMailExample("InboundEmailRejectionHtml.soy");
+    extractMailExample("Merged.soy");
+    extractMailExample("MergedHtml.soy");
+    extractMailExample("NewChange.soy");
+    extractMailExample("NewChangeHtml.soy");
+    extractMailExample("RegisterNewEmail.soy");
+    extractMailExample("ReplacePatchSet.soy");
+    extractMailExample("ReplacePatchSetHtml.soy");
+    extractMailExample("Restored.soy");
+    extractMailExample("RestoredHtml.soy");
+    extractMailExample("Reverted.soy");
+    extractMailExample("RevertedHtml.soy");
+    extractMailExample("SetAssignee.soy");
+    extractMailExample("SetAssigneeHtml.soy");
+
+    if (!ui.isBatch()) {
+      System.err.println();
+    }
+  }
+
+  public void postRun(Injector injector) throws Exception {
+    for (InitStep step : steps) {
+      if (step instanceof InitPlugins && flags.skipPlugins) {
+        continue;
+      }
+      injector.injectMembers(step);
+      step.postRun();
+    }
+  }
+
+  private void saveSecureStore() throws IOException {
+    if (secureStoreInitData != null) {
+      Path dst = site.lib_dir.resolve(secureStoreInitData.jarFile.getFileName());
+      Files.copy(secureStoreInitData.jarFile, dst);
+      Section gerritSection = sectionFactory.get("gerrit", null);
+      gerritSection.set("secureStoreClass", secureStoreInitData.className);
+    }
+  }
+
+  private void extractMailExample(String orig) throws Exception {
+    Path ex = site.mail_dir.resolve(orig + ".example");
+    extract(ex, EmailModule.class, orig);
+    chmod(0444, ex);
+  }
+
+  private static List<InitStep> stepsOf(Injector injector) {
+    final ArrayList<InitStep> r = new ArrayList<>();
+    for (Binding<InitStep> b : all(injector)) {
+      r.add(b.getProvider().get());
+    }
+    return r;
+  }
+
+  private static List<Binding<InitStep>> all(Injector injector) {
+    return injector.findBindingsByType(new TypeLiteral<InitStep>() {});
+  }
+}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/StaleLibraryRemover.java b/java/com/google/gerrit/pgm/init/StaleLibraryRemover.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/StaleLibraryRemover.java
rename to java/com/google/gerrit/pgm/init/StaleLibraryRemover.java
diff --git a/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_x.java b/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_x.java
new file mode 100644
index 0000000..95ff8d7
--- /dev/null
+++ b/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_x.java
@@ -0,0 +1,291 @@
+// Copyright (C) 2009 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.google.gerrit.pgm.init;
+
+import static com.google.gerrit.pgm.init.api.InitUtil.die;
+import static com.google.gerrit.pgm.init.api.InitUtil.savePublic;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.base.Splitter;
+import com.google.gerrit.pgm.init.api.ConsoleUI;
+import com.google.gerrit.pgm.init.api.InitFlags;
+import com.google.gerrit.pgm.init.api.InitStep;
+import com.google.gerrit.pgm.init.api.Section;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.securestore.SecureStore;
+import com.google.gerrit.server.util.SocketUtil;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.InetSocketAddress;
+import java.net.URLDecoder;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.Properties;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.storage.file.FileBasedConfig;
+
+/** Upgrade from a 2.0.x site to a 2.1 site. */
+@Singleton
+class UpgradeFrom2_0_x implements InitStep {
+  static final String[] etcFiles = {
+    "gerrit.config", //
+    "secure.config", //
+    "replication.config", //
+    "ssh_host_rsa_key", //
+    "ssh_host_rsa_key.pub", //
+    "ssh_host_dsa_key", //
+    "ssh_host_dsa_key.pub", //
+    "ssh_host_key", //
+    "contact_information.pub", //
+    "gitweb_config.perl", //
+    "keystore", //
+    "GerritSite.css", //
+    "GerritSiteFooter.html", //
+    "GerritSiteHeader.html", //
+  };
+
+  private final ConsoleUI ui;
+
+  private final FileBasedConfig cfg;
+  private final SecureStore sec;
+  private final Path site_path;
+  private final Path etc_dir;
+  private final Section.Factory sections;
+
+  @Inject
+  UpgradeFrom2_0_x(
+      final SitePaths site,
+      final InitFlags flags,
+      final ConsoleUI ui,
+      final Section.Factory sections) {
+    this.ui = ui;
+    this.sections = sections;
+
+    this.cfg = flags.cfg;
+    this.sec = flags.sec;
+    this.site_path = site.site_path;
+    this.etc_dir = site.etc_dir;
+  }
+
+  boolean isNeedUpgrade() {
+    for (String name : etcFiles) {
+      if (Files.exists(site_path.resolve(name))) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @Override
+  public void run() throws IOException, ConfigInvalidException {
+    if (!isNeedUpgrade()) {
+      return;
+    }
+
+    if (!ui.yesno(true, "Upgrade '%s'", site_path.toAbsolutePath())) {
+      throw die("aborted by user");
+    }
+
+    for (String name : etcFiles) {
+      Path src = site_path.resolve(name);
+      Path dst = etc_dir.resolve(name);
+      if (Files.exists(src)) {
+        if (Files.exists(dst)) {
+          throw die("File " + src + " would overwrite " + dst);
+        }
+        try {
+          Files.move(src, dst);
+        } catch (IOException e) {
+          throw die("Cannot rename " + src + " to " + dst, e);
+        }
+      }
+    }
+
+    // We have to reload the configuration after the rename as
+    // the initial load pulled up an non-existent (and thus
+    // believed to be empty) file.
+    //
+    cfg.load();
+
+    final Properties oldprop = readGerritServerProperties();
+    if (oldprop != null) {
+      final Section database = sections.get("database", null);
+
+      String url = oldprop.getProperty("url");
+      if (url != null && !convertUrl(database, url)) {
+        database.set("type", "jdbc");
+        database.set("driver", oldprop.getProperty("driver"));
+        database.set("url", url);
+      }
+
+      String username = oldprop.getProperty("user");
+      if (username == null || username.isEmpty()) {
+        username = oldprop.getProperty("username");
+      }
+      if (username != null && !username.isEmpty()) {
+        cfg.setString("database", null, "username", username);
+      }
+
+      String password = oldprop.getProperty("password");
+      if (password != null && !password.isEmpty()) {
+        sec.set("database", null, "password", password);
+      }
+    }
+
+    String[] values;
+
+    values = cfg.getStringList("ldap", null, "password");
+    cfg.unset("ldap", null, "password");
+    sec.setList("ldap", null, "password", Arrays.asList(values));
+
+    values = cfg.getStringList("sendemail", null, "smtpPass");
+    cfg.unset("sendemail", null, "smtpPass");
+    sec.setList("sendemail", null, "smtpPass", Arrays.asList(values));
+
+    savePublic(cfg);
+  }
+
+  private boolean convertUrl(Section database, String url) throws UnsupportedEncodingException {
+    String username = null;
+    String password = null;
+
+    if (url.contains("?")) {
+      final int q = url.indexOf('?');
+      for (String pair : Splitter.on('&').split(url.substring(q + 1))) {
+        final int eq = pair.indexOf('=');
+        if (0 < eq) {
+          return false;
+        }
+
+        String n = URLDecoder.decode(pair.substring(0, eq), UTF_8.name());
+        String v = URLDecoder.decode(pair.substring(eq + 1), UTF_8.name());
+
+        if ("user".equals(n) || "username".equals(n)) {
+          username = v;
+
+        } else if ("password".equals(n)) {
+          password = v;
+
+        } else {
+          // There is a parameter setting we don't recognize, use the
+          // JDBC URL format instead to preserve the configuration.
+          //
+          return false;
+        }
+      }
+      url = url.substring(0, q);
+    }
+
+    if (url.startsWith("jdbc:h2:file:")) {
+      url = url.substring("jdbc:h2:file:".length());
+      database.set("type", "h2");
+      database.set("database", url);
+      return true;
+    }
+
+    if (url.startsWith("jdbc:postgresql://")) {
+      url = url.substring("jdbc:postgresql://".length());
+      final int sl = url.indexOf('/');
+      if (sl < 0) {
+        return false;
+      }
+
+      final InetSocketAddress addr = SocketUtil.parse(url.substring(0, sl), 0);
+      database.set("type", "postgresql");
+      sethost(database, addr);
+      database.set("database", url.substring(sl + 1));
+      setuser(database, username, password);
+      return true;
+    }
+
+    if (url.startsWith("jdbc:postgresql:")) {
+      url = url.substring("jdbc:postgresql:".length());
+      database.set("type", "postgresql");
+      database.set("hostname", "localhost");
+      database.set("database", url);
+      setuser(database, username, password);
+      return true;
+    }
+
+    if (url.startsWith("jdbc:mysql://")) {
+      url = url.substring("jdbc:mysql://".length());
+      final int sl = url.indexOf('/');
+      if (sl < 0) {
+        return false;
+      }
+
+      final InetSocketAddress addr = SocketUtil.parse(url.substring(0, sl), 0);
+      database.set("type", "mysql");
+      sethost(database, addr);
+      database.set("database", url.substring(sl + 1));
+      setuser(database, username, password);
+      return true;
+    }
+
+    return false;
+  }
+
+  private void sethost(Section database, InetSocketAddress addr) {
+    database.set("hostname", SocketUtil.hostname(addr));
+    if (0 < addr.getPort()) {
+      database.set("port", String.valueOf(addr.getPort()));
+    }
+  }
+
+  private void setuser(Section database, String username, String password) {
+    if (username != null && !username.isEmpty()) {
+      database.set("username", username);
+    }
+    if (password != null && !password.isEmpty()) {
+      sec.set("database", null, "password", password);
+    }
+  }
+
+  private Properties readGerritServerProperties() throws IOException {
+    final Properties srvprop = new Properties();
+    final String name = System.getProperty("GerritServer");
+    Path path;
+    if (name != null) {
+      path = Paths.get(name);
+    } else {
+      path = site_path.resolve("GerritServer.properties");
+      if (!Files.exists(path)) {
+        path = Paths.get("GerritServer.properties");
+      }
+    }
+    if (Files.exists(path)) {
+      try (InputStream in = Files.newInputStream(path)) {
+        srvprop.load(in);
+      } catch (IOException e) {
+        throw new IOException("Cannot read " + name, e);
+      }
+      final Properties dbprop = new Properties();
+      for (Map.Entry<Object, Object> e : srvprop.entrySet()) {
+        final String key = (String) e.getKey();
+        if (key.startsWith("database.")) {
+          dbprop.put(key.substring("database.".length()), e.getValue());
+        }
+      }
+      return dbprop;
+    }
+    return null;
+  }
+}
diff --git a/java/com/google/gerrit/pgm/init/VersionedAuthorizedKeysOnInit.java b/java/com/google/gerrit/pgm/init/VersionedAuthorizedKeysOnInit.java
new file mode 100644
index 0000000..a9c6cc8
--- /dev/null
+++ b/java/com/google/gerrit/pgm/init/VersionedAuthorizedKeysOnInit.java
@@ -0,0 +1,84 @@
+// 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.
+
+package com.google.gerrit.pgm.init;
+
+import static com.google.common.base.Preconditions.checkState;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.pgm.init.api.AllUsersNameOnInitProvider;
+import com.google.gerrit.pgm.init.api.InitFlags;
+import com.google.gerrit.pgm.init.api.VersionedMetaDataOnInit;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.account.AccountSshKey;
+import com.google.gerrit.server.account.AuthorizedKeys;
+import com.google.gerrit.server.account.VersionedAuthorizedKeys;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.util.List;
+import java.util.Optional;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.CommitBuilder;
+
+public class VersionedAuthorizedKeysOnInit extends VersionedMetaDataOnInit {
+  public interface Factory {
+    VersionedAuthorizedKeysOnInit create(Account.Id accountId);
+  }
+
+  private final Account.Id accountId;
+  private List<Optional<AccountSshKey>> keys;
+
+  @Inject
+  public VersionedAuthorizedKeysOnInit(
+      AllUsersNameOnInitProvider allUsers,
+      SitePaths site,
+      InitFlags flags,
+      @Assisted Account.Id accountId) {
+    super(flags, site, allUsers.get(), RefNames.refsUsers(accountId));
+    this.accountId = accountId;
+  }
+
+  @Override
+  public VersionedAuthorizedKeysOnInit load() throws IOException, ConfigInvalidException {
+    super.load();
+    return this;
+  }
+
+  @Override
+  protected void onLoad() throws IOException, ConfigInvalidException {
+    keys = AuthorizedKeys.parse(accountId, readUTF8(AuthorizedKeys.FILE_NAME));
+  }
+
+  public AccountSshKey addKey(String pub) {
+    checkState(keys != null, "SSH keys not loaded yet");
+    int seq = keys.isEmpty() ? 1 : keys.size() + 1;
+    AccountSshKey key =
+        new VersionedAuthorizedKeys.SimpleSshKeyCreator().create(accountId, seq, pub);
+    keys.add(Optional.of(key));
+    return key;
+  }
+
+  @Override
+  protected boolean onSave(CommitBuilder commit) throws IOException {
+    if (Strings.isNullOrEmpty(commit.getMessage())) {
+      commit.setMessage("Updated SSH keys\n");
+    }
+
+    saveUTF8(AuthorizedKeys.FILE_NAME, AuthorizedKeys.serialize(keys));
+    return true;
+  }
+}
diff --git a/java/com/google/gerrit/pgm/init/api/AllProjectsConfig.java b/java/com/google/gerrit/pgm/init/api/AllProjectsConfig.java
new file mode 100644
index 0000000..9fd3f16
--- /dev/null
+++ b/java/com/google/gerrit/pgm/init/api/AllProjectsConfig.java
@@ -0,0 +1,96 @@
+// Copyright (C) 2013 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.google.gerrit.pgm.init.api;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.project.GroupList;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.inject.Inject;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.RepositoryCache;
+
+public class AllProjectsConfig extends VersionedMetaDataOnInit {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private Config cfg;
+  private GroupList groupList;
+
+  @Inject
+  AllProjectsConfig(AllProjectsNameOnInitProvider allProjects, SitePaths site, InitFlags flags) {
+    super(flags, site, allProjects.get(), RefNames.REFS_CONFIG);
+  }
+
+  public Config getConfig() {
+    return cfg;
+  }
+
+  public GroupList getGroups() {
+    return groupList;
+  }
+
+  @Override
+  public AllProjectsConfig load() throws IOException, ConfigInvalidException {
+    super.load();
+    return this;
+  }
+
+  @Override
+  protected void onLoad() throws IOException, ConfigInvalidException {
+    groupList = readGroupList();
+    cfg = readConfig(ProjectConfig.PROJECT_CONFIG);
+  }
+
+  private GroupList readGroupList() throws IOException {
+    return GroupList.parse(
+        new Project.NameKey(project),
+        readUTF8(GroupList.FILE_NAME),
+        error ->
+            logger.atSevere().log(
+                "Error parsing file %s: %s", GroupList.FILE_NAME, error.getMessage()));
+  }
+
+  public void save(String pluginName, String message) throws IOException, ConfigInvalidException {
+    save(
+        new PersonIdent(pluginName, pluginName + "@gerrit"),
+        "Update from plugin " + pluginName + ": " + message);
+  }
+
+  @Override
+  protected void save(PersonIdent ident, String msg) throws IOException, ConfigInvalidException {
+    super.save(ident, msg);
+
+    // we need to invalidate the JGit cache if the group list is invalidated in
+    // an unattended init step
+    RepositoryCache.clear();
+  }
+
+  @Override
+  protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException {
+    saveConfig(ProjectConfig.PROJECT_CONFIG, cfg);
+    saveGroupList();
+    return true;
+  }
+
+  private void saveGroupList() throws IOException {
+    saveUTF8(GroupList.FILE_NAME, groupList.asText());
+  }
+}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/AllProjectsNameOnInitProvider.java b/java/com/google/gerrit/pgm/init/api/AllProjectsNameOnInitProvider.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/AllProjectsNameOnInitProvider.java
rename to java/com/google/gerrit/pgm/init/api/AllProjectsNameOnInitProvider.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/AllUsersNameOnInitProvider.java b/java/com/google/gerrit/pgm/init/api/AllUsersNameOnInitProvider.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/AllUsersNameOnInitProvider.java
rename to java/com/google/gerrit/pgm/init/api/AllUsersNameOnInitProvider.java
diff --git a/java/com/google/gerrit/pgm/init/api/BUILD b/java/com/google/gerrit/pgm/init/api/BUILD
new file mode 100644
index 0000000..bc418dd
--- /dev/null
+++ b/java/com/google/gerrit/pgm/init/api/BUILD
@@ -0,0 +1,17 @@
+java_library(
+    name = "api",
+    srcs = glob(["**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/common:annotations",
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//lib:guava",
+        "//lib:gwtorm",
+        "//lib/flogger:api",
+        "//lib/guice",
+        "//lib/guice:guice-assistedinject",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+    ],
+)
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/ConsoleUI.java b/java/com/google/gerrit/pgm/init/api/ConsoleUI.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/ConsoleUI.java
rename to java/com/google/gerrit/pgm/init/api/ConsoleUI.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/GitRepositoryManagerOnInit.java b/java/com/google/gerrit/pgm/init/api/GitRepositoryManagerOnInit.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/GitRepositoryManagerOnInit.java
rename to java/com/google/gerrit/pgm/init/api/GitRepositoryManagerOnInit.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InitFlags.java b/java/com/google/gerrit/pgm/init/api/InitFlags.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InitFlags.java
rename to java/com/google/gerrit/pgm/init/api/InitFlags.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InitStep.java b/java/com/google/gerrit/pgm/init/api/InitStep.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InitStep.java
rename to java/com/google/gerrit/pgm/init/api/InitStep.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InitUtil.java b/java/com/google/gerrit/pgm/init/api/InitUtil.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InitUtil.java
rename to java/com/google/gerrit/pgm/init/api/InitUtil.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InstallAllPlugins.java b/java/com/google/gerrit/pgm/init/api/InstallAllPlugins.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InstallAllPlugins.java
rename to java/com/google/gerrit/pgm/init/api/InstallAllPlugins.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InstallPlugins.java b/java/com/google/gerrit/pgm/init/api/InstallPlugins.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InstallPlugins.java
rename to java/com/google/gerrit/pgm/init/api/InstallPlugins.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/LibraryDownload.java b/java/com/google/gerrit/pgm/init/api/LibraryDownload.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/LibraryDownload.java
rename to java/com/google/gerrit/pgm/init/api/LibraryDownload.java
diff --git a/java/com/google/gerrit/pgm/init/api/Section.java b/java/com/google/gerrit/pgm/init/api/Section.java
new file mode 100644
index 0000000..baf37b6
--- /dev/null
+++ b/java/com/google/gerrit/pgm/init/api/Section.java
@@ -0,0 +1,229 @@
+// Copyright (C) 2009 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.google.gerrit.pgm.init.api;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.securestore.SecureStore;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+
+/** Helper to edit a section of the configuration files. */
+public class Section {
+  public interface Factory {
+    Section get(@Assisted("section") String section, @Assisted("subsection") String subsection);
+  }
+
+  private final InitFlags flags;
+  private final SitePaths site;
+  private final ConsoleUI ui;
+  private final String section;
+  private final String subsection;
+  private final SecureStore secureStore;
+
+  @Inject
+  public Section(
+      final InitFlags flags,
+      final SitePaths site,
+      final SecureStore secureStore,
+      final ConsoleUI ui,
+      @Assisted("section") final String section,
+      @Assisted("subsection") @Nullable final String subsection) {
+    this.flags = flags;
+    this.site = site;
+    this.ui = ui;
+    this.section = section;
+    this.subsection = subsection;
+    this.secureStore = secureStore;
+  }
+
+  public String get(String name) {
+    return flags.cfg.getString(section, subsection, name);
+  }
+
+  public String[] getList(String name) {
+    return flags.cfg.getStringList(section, subsection, name);
+  }
+
+  public void set(String name, String value) {
+    final ArrayList<String> all = new ArrayList<>();
+    all.addAll(Arrays.asList(flags.cfg.getStringList(section, subsection, name)));
+
+    if (value != null) {
+      if (all.size() == 0 || all.size() == 1) {
+        flags.cfg.setString(section, subsection, name, value);
+      } else {
+        all.set(0, value);
+        flags.cfg.setStringList(section, subsection, name, all);
+      }
+
+    } else if (all.size() == 1) {
+      flags.cfg.unset(section, subsection, name);
+    } else if (all.size() != 0) {
+      all.remove(0);
+      flags.cfg.setStringList(section, subsection, name, all);
+    }
+  }
+
+  public void setList(String name, List<String> values) {
+    flags.cfg.setStringList(section, subsection, name, values);
+  }
+
+  public <T extends Enum<?>> void set(String name, T value) {
+    if (value != null) {
+      set(name, value.name());
+    } else {
+      unset(name);
+    }
+  }
+
+  public void unset(String name) {
+    set(name, (String) null);
+  }
+
+  public String string(String title, String name, String dv) {
+    return string(title, name, dv, false);
+  }
+
+  public String string(final String title, String name, String dv, boolean nullIfDefault) {
+    final String ov = get(name);
+    String nv = ui.readString(ov != null ? ov : dv, "%s", title);
+    if (nullIfDefault && nv.equals(dv)) {
+      nv = null;
+    }
+    if (!Objects.equals(ov, nv)) {
+      set(name, nv);
+    }
+    return nv;
+  }
+
+  public Path path(String title, String name, String defValue) {
+    return site.resolve(string(title, name, defValue));
+  }
+
+  public <T extends Enum<?>, E extends EnumSet<? extends T>> T select(
+      String title, String name, T defValue) {
+    return select(title, name, defValue, false);
+  }
+
+  public <T extends Enum<?>, E extends EnumSet<? extends T>> T select(
+      String title, String name, T defValue, boolean nullIfDefault) {
+    @SuppressWarnings("unchecked")
+    E allowedValues = (E) EnumSet.allOf(defValue.getClass());
+    return select(title, name, defValue, allowedValues, nullIfDefault);
+  }
+
+  public <T extends Enum<?>, E extends EnumSet<? extends T>> T select(
+      String title, String name, T defValue, E allowedValues) {
+    return select(title, name, defValue, allowedValues, false);
+  }
+
+  public <T extends Enum<?>, A extends EnumSet<? extends T>> T select(
+      String title, String name, T defValue, A allowedValues, boolean nullIfDefault) {
+    final boolean set = get(name) != null;
+    T oldValue = flags.cfg.getEnum(section, subsection, name, defValue);
+    T newValue = ui.readEnum(oldValue, allowedValues, "%s", title);
+    if (nullIfDefault && newValue == defValue) {
+      newValue = null;
+    }
+    if (!set || oldValue != newValue) {
+      if (newValue != null) {
+        set(name, newValue);
+      } else {
+        unset(name);
+      }
+    }
+    return newValue;
+  }
+
+  public String select(final String title, String name, String dv, Set<String> allowedValues) {
+    final String ov = get(name);
+    String nv = ui.readString(ov != null ? ov : dv, allowedValues, "%s", title);
+    if (!Objects.equals(ov, nv)) {
+      set(name, nv);
+    }
+    return nv;
+  }
+
+  public String password(String username, String password) {
+    final String ov = getSecure(password);
+
+    String user = flags.sec.get(section, subsection, username);
+    if (user == null) {
+      user = get(username);
+    }
+
+    if (user == null) {
+      flags.sec.unset(section, subsection, password);
+      return null;
+    }
+
+    if (ov != null) {
+      // If the user already has a password stored, try to reuse it
+      // rather than prompting for a whole new one.
+      //
+      if (ui.isBatch() || !ui.yesno(false, "Change %s's password", user)) {
+        return ov;
+      }
+    }
+
+    final String nv = ui.password("%s's password", user);
+    if (!Objects.equals(ov, nv)) {
+      setSecure(password, nv);
+    }
+    return nv;
+  }
+
+  public String passwordForKey(String prompt, String passwordKey) {
+    String ov = getSecure(passwordKey);
+    if (ov != null) {
+      // If the password is already stored, try to reuse it
+      // rather than prompting for a whole new one.
+      //
+      if (ui.isBatch() || !ui.yesno(false, "Change %s", passwordKey)) {
+        return ov;
+      }
+    }
+
+    final String nv = ui.password("%s", prompt);
+    if (!Objects.equals(ov, nv)) {
+      setSecure(passwordKey, nv);
+    }
+    return nv;
+  }
+
+  public String getSecure(String name) {
+    return flags.sec.get(section, subsection, name);
+  }
+
+  public void setSecure(String name, String value) {
+    if (value != null) {
+      secureStore.set(section, subsection, name, value);
+    } else {
+      secureStore.unset(section, subsection, name);
+    }
+  }
+
+  String getName() {
+    return section;
+  }
+}
diff --git a/java/com/google/gerrit/pgm/init/api/SequencesOnInit.java b/java/com/google/gerrit/pgm/init/api/SequencesOnInit.java
new file mode 100644
index 0000000..c9c3a64
--- /dev/null
+++ b/java/com/google/gerrit/pgm/init/api/SequencesOnInit.java
@@ -0,0 +1,51 @@
+// Copyright (C) 2017 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.google.gerrit.pgm.init.api;
+
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.Sequences;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.notedb.RepoSequence;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class SequencesOnInit {
+  private final GitRepositoryManager repoManager;
+  private final AllUsersNameOnInitProvider allUsersName;
+
+  @Inject
+  SequencesOnInit(GitRepositoryManagerOnInit repoManager, AllUsersNameOnInitProvider allUsersName) {
+    this.repoManager = repoManager;
+    this.allUsersName = allUsersName;
+  }
+
+  public int nextAccountId(ReviewDb db) throws OrmException {
+    @SuppressWarnings("deprecation")
+    RepoSequence.Seed accountSeed = db::nextAccountId;
+    RepoSequence accountSeq =
+        new RepoSequence(
+            repoManager,
+            GitReferenceUpdated.DISABLED,
+            new Project.NameKey(allUsersName.get()),
+            Sequences.NAME_ACCOUNTS,
+            accountSeed,
+            1);
+    return accountSeq.next();
+  }
+}
diff --git a/java/com/google/gerrit/pgm/init/api/VersionedMetaDataOnInit.java b/java/com/google/gerrit/pgm/init/api/VersionedMetaDataOnInit.java
new file mode 100644
index 0000000..738cafd
--- /dev/null
+++ b/java/com/google/gerrit/pgm/init/api/VersionedMetaDataOnInit.java
@@ -0,0 +1,147 @@
+// 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.
+
+package com.google.gerrit.pgm.init.api;
+
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.GerritPersonIdentProvider;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.git.meta.VersionedMetaData;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Path;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.internal.storage.file.FileRepository;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.lib.RepositoryCache.FileKey;
+import org.eclipse.jgit.revwalk.RevTree;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.util.FS;
+
+public abstract class VersionedMetaDataOnInit extends VersionedMetaData {
+
+  protected final String project;
+  private final InitFlags flags;
+  private final SitePaths site;
+  private final String ref;
+
+  protected VersionedMetaDataOnInit(InitFlags flags, SitePaths site, String project, String ref) {
+    this.flags = flags;
+    this.site = site;
+    this.project = project;
+    this.ref = ref;
+  }
+
+  @Override
+  protected String getRefName() {
+    return ref;
+  }
+
+  public VersionedMetaDataOnInit load() throws IOException, ConfigInvalidException {
+    File path = getPath();
+    if (path != null) {
+      try (Repository repo = new FileRepository(path)) {
+        load(new Project.NameKey(project), repo);
+      }
+    }
+    return this;
+  }
+
+  public void save(String message) throws IOException, ConfigInvalidException {
+    save(new GerritPersonIdentProvider(flags.cfg).get(), message);
+  }
+
+  protected void save(PersonIdent ident, String msg) throws IOException, ConfigInvalidException {
+    File path = getPath();
+    if (path == null) {
+      throw new IOException(project + " does not exist.");
+    }
+
+    try (Repository repo = new FileRepository(path);
+        ObjectInserter i = repo.newObjectInserter();
+        ObjectReader r = repo.newObjectReader();
+        RevWalk rw = new RevWalk(r)) {
+      inserter = i;
+      reader = r;
+
+      RevTree srcTree = revision != null ? rw.parseTree(revision) : null;
+      newTree = readTree(srcTree);
+
+      CommitBuilder commit = new CommitBuilder();
+      commit.setAuthor(ident);
+      commit.setCommitter(ident);
+      commit.setMessage(msg);
+
+      onSave(commit);
+
+      ObjectId res = newTree.writeTree(inserter);
+      if (res.equals(srcTree)) {
+        return;
+      }
+      commit.setTreeId(res);
+
+      if (revision != null) {
+        commit.addParentId(revision);
+      }
+      ObjectId newRevision = inserter.insert(commit);
+      updateRef(repo, ident, newRevision, "commit: " + msg);
+      revision = rw.parseCommit(newRevision);
+    } finally {
+      inserter = null;
+      reader = null;
+    }
+  }
+
+  private void updateRef(Repository repo, PersonIdent ident, ObjectId newRevision, String refLogMsg)
+      throws IOException {
+    RefUpdate ru = repo.updateRef(getRefName());
+    ru.setRefLogIdent(ident);
+    ru.setNewObjectId(newRevision);
+    ru.setExpectedOldObjectId(revision);
+    ru.setRefLogMessage(refLogMsg, false);
+    RefUpdate.Result r = ru.update();
+    switch (r) {
+      case FAST_FORWARD:
+      case NEW:
+      case NO_CHANGE:
+        break;
+      case FORCED:
+      case IO_FAILURE:
+      case LOCK_FAILURE:
+      case NOT_ATTEMPTED:
+      case REJECTED:
+      case REJECTED_CURRENT_BRANCH:
+      case RENAMED:
+      case REJECTED_MISSING_OBJECT:
+      case REJECTED_OTHER_REASON:
+      default:
+        throw new IOException(
+            "Failed to update " + getRefName() + " of " + project + ": " + r.name());
+    }
+  }
+
+  private File getPath() {
+    Path basePath = site.resolve(flags.cfg.getString("gerrit", null, "basePath"));
+    if (basePath == null) {
+      throw new IllegalStateException("gerrit.basePath must be configured");
+    }
+    return FileKey.resolve(basePath.resolve(project).toFile(), FS.DETECTED);
+  }
+}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/index/IndexManagerOnInit.java b/java/com/google/gerrit/pgm/init/index/IndexManagerOnInit.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/index/IndexManagerOnInit.java
rename to java/com/google/gerrit/pgm/init/index/IndexManagerOnInit.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/index/IndexModuleOnInit.java b/java/com/google/gerrit/pgm/init/index/IndexModuleOnInit.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/index/IndexModuleOnInit.java
rename to java/com/google/gerrit/pgm/init/index/IndexModuleOnInit.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/index/elasticsearch/ElasticIndexModuleOnInit.java b/java/com/google/gerrit/pgm/init/index/elasticsearch/ElasticIndexModuleOnInit.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/index/elasticsearch/ElasticIndexModuleOnInit.java
rename to java/com/google/gerrit/pgm/init/index/elasticsearch/ElasticIndexModuleOnInit.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/index/lucene/LuceneIndexModuleOnInit.java b/java/com/google/gerrit/pgm/init/index/lucene/LuceneIndexModuleOnInit.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/index/lucene/LuceneIndexModuleOnInit.java
rename to java/com/google/gerrit/pgm/init/index/lucene/LuceneIndexModuleOnInit.java
diff --git a/java/com/google/gerrit/pgm/rules/PrologCompiler.java b/java/com/google/gerrit/pgm/rules/PrologCompiler.java
new file mode 100644
index 0000000..2663f42
--- /dev/null
+++ b/java/com/google/gerrit/pgm/rules/PrologCompiler.java
@@ -0,0 +1,306 @@
+// Copyright (C) 2011 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.google.gerrit.pgm.rules;
+
+import com.google.gerrit.common.Version;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import com.googlecode.prolog_cafe.compiler.Compiler;
+import com.googlecode.prolog_cafe.exceptions.CompileException;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.concurrent.Callable;
+import java.util.jar.Attributes;
+import java.util.jar.JarEntry;
+import java.util.jar.JarOutputStream;
+import java.util.jar.Manifest;
+import javax.tools.Diagnostic;
+import javax.tools.DiagnosticCollector;
+import javax.tools.JavaCompiler;
+import javax.tools.JavaFileObject;
+import javax.tools.StandardJavaFileManager;
+import javax.tools.ToolProvider;
+import org.eclipse.jgit.errors.MissingObjectException;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+
+/**
+ * Helper class for Rulec: does the actual prolog -> java src -> class -> jar work Finds rules.pl in
+ * refs/meta/config branch Creates rules-(sha1 of rules.pl).jar in (site-path)/cache/rules
+ */
+public class PrologCompiler implements Callable<PrologCompiler.Status> {
+  public interface Factory {
+    PrologCompiler create(Repository git);
+  }
+
+  public enum Status {
+    NO_RULES,
+    COMPILED
+  }
+
+  private final Path ruleDir;
+  private final Repository git;
+
+  @Inject
+  PrologCompiler(
+      @GerritServerConfig Config config, SitePaths site, @Assisted Repository gitRepository) {
+    Path cacheDir = site.resolve(config.getString("cache", null, "directory"));
+    ruleDir = cacheDir != null ? cacheDir.resolve("rules") : null;
+    git = gitRepository;
+  }
+
+  @Override
+  public Status call() throws IOException, CompileException {
+    ObjectId metaConfig = git.resolve(RefNames.REFS_CONFIG);
+    if (metaConfig == null) {
+      return Status.NO_RULES;
+    }
+
+    ObjectId rulesId = git.resolve(metaConfig.name() + ":rules.pl");
+    if (rulesId == null) {
+      return Status.NO_RULES;
+    }
+
+    if (ruleDir == null) {
+      throw new CompileException("Caching not enabled");
+    }
+    Files.createDirectories(ruleDir);
+
+    File tempDir = File.createTempFile("GerritCodeReview_", ".rulec");
+    if (!tempDir.delete() || !tempDir.mkdir()) {
+      throw new IOException("Cannot create " + tempDir);
+    }
+    try {
+      // Try to make the directory accessible only by this process.
+      // This may help to prevent leaking rule data to outsiders.
+      tempDir.setReadable(true, true);
+      tempDir.setWritable(true, true);
+      tempDir.setExecutable(true, true);
+
+      compileProlog(rulesId, tempDir);
+      compileJava(tempDir);
+
+      Path jarPath = ruleDir.resolve("rules-" + rulesId.getName() + ".jar");
+      List<String> classFiles = getRelativePaths(tempDir, ".class");
+      createJar(jarPath, classFiles, tempDir, metaConfig, rulesId);
+
+      return Status.COMPILED;
+    } finally {
+      deleteAllFiles(tempDir);
+    }
+  }
+
+  /** Creates a copy of rules.pl and compiles it into Java sources. */
+  private void compileProlog(ObjectId prolog, File tempDir) throws IOException, CompileException {
+    File tempRules = copyToTempFile(prolog, tempDir);
+    try {
+      Compiler comp = new Compiler();
+      comp.prologToJavaSource(tempRules.getPath(), tempDir.getPath());
+    } finally {
+      tempRules.delete();
+    }
+  }
+
+  private File copyToTempFile(ObjectId blobId, File tempDir)
+      throws IOException, FileNotFoundException, MissingObjectException {
+    // Any leak of tmp caused by this method failing will be cleaned
+    // up by our caller when tempDir is recursively deleted.
+    File tmp = File.createTempFile("rules", ".pl", tempDir);
+    try (OutputStream out = Files.newOutputStream(tmp.toPath())) {
+      git.open(blobId).copyTo(out);
+    }
+    return tmp;
+  }
+
+  /** Compile java src into java .class files */
+  private void compileJava(File tempDir) throws IOException, CompileException {
+    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
+    if (compiler == null) {
+      throw new CompileException("JDK required (running inside of JRE)");
+    }
+
+    DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>();
+    try (StandardJavaFileManager fileManager =
+        compiler.getStandardFileManager(diagnostics, null, null)) {
+      Iterable<? extends JavaFileObject> compilationUnits =
+          fileManager.getJavaFileObjectsFromFiles(getAllFiles(tempDir, ".java"));
+      ArrayList<String> options = new ArrayList<>();
+      String classpath = getMyClasspath();
+      if (classpath != null) {
+        options.add("-classpath");
+        options.add(classpath);
+      }
+      options.add("-d");
+      options.add(tempDir.getPath());
+      JavaCompiler.CompilationTask task =
+          compiler.getTask(null, fileManager, diagnostics, options, null, compilationUnits);
+      if (!task.call()) {
+        Locale myLocale = Locale.getDefault();
+        StringBuilder msg = new StringBuilder();
+        msg.append("Cannot compile to Java bytecode:");
+        for (Diagnostic<? extends JavaFileObject> err : diagnostics.getDiagnostics()) {
+          msg.append('\n');
+          msg.append(err.getKind());
+          msg.append(": ");
+          if (err.getSource() != null) {
+            msg.append(err.getSource().getName());
+          }
+          msg.append(':');
+          msg.append(err.getLineNumber());
+          msg.append(": ");
+          msg.append(err.getMessage(myLocale));
+        }
+        throw new CompileException(msg.toString());
+      }
+    }
+  }
+
+  private String getMyClasspath() {
+    StringBuilder cp = new StringBuilder();
+    appendClasspath(cp, getClass().getClassLoader());
+    return 0 < cp.length() ? cp.toString() : null;
+  }
+
+  private void appendClasspath(StringBuilder cp, ClassLoader classLoader) {
+    if (classLoader.getParent() != null) {
+      appendClasspath(cp, classLoader.getParent());
+    }
+    if (classLoader instanceof URLClassLoader) {
+      for (URL url : ((URLClassLoader) classLoader).getURLs()) {
+        if ("file".equals(url.getProtocol())) {
+          if (0 < cp.length()) {
+            cp.append(File.pathSeparatorChar);
+          }
+          cp.append(url.getPath());
+        }
+      }
+    }
+  }
+
+  /** Takes compiled prolog .class files, puts them into the jar file. */
+  private void createJar(
+      Path archiveFile, List<String> toBeJared, File tempDir, ObjectId metaConfig, ObjectId rulesId)
+      throws IOException {
+    long now = TimeUtil.nowMs();
+    Manifest mf = new Manifest();
+    mf.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
+    mf.getMainAttributes().putValue("Built-by", "Gerrit Code Review " + Version.getVersion());
+    if (git.getDirectory() != null) {
+      mf.getMainAttributes().putValue("Source-Repository", git.getDirectory().getPath());
+    }
+    mf.getMainAttributes().putValue("Source-Commit", metaConfig.name());
+    mf.getMainAttributes().putValue("Source-Blob", rulesId.name());
+
+    Path tmpjar = Files.createTempFile(archiveFile.getParent(), ".rulec_", ".jar");
+    try (OutputStream stream = Files.newOutputStream(tmpjar);
+        JarOutputStream out = new JarOutputStream(stream, mf)) {
+      byte[] buffer = new byte[10240];
+      // TODO: fixify this loop
+      for (String path : toBeJared) {
+        JarEntry jarAdd = new JarEntry(path);
+        File f = new File(tempDir, path);
+        jarAdd.setTime(now);
+        out.putNextEntry(jarAdd);
+        if (f.isFile()) {
+          try (InputStream in = Files.newInputStream(f.toPath())) {
+            while (true) {
+              int nRead = in.read(buffer, 0, buffer.length);
+              if (nRead <= 0) {
+                break;
+              }
+              out.write(buffer, 0, nRead);
+            }
+          }
+        }
+        out.closeEntry();
+      }
+    }
+
+    try {
+      Files.move(tmpjar, archiveFile);
+    } catch (IOException e) {
+      throw new IOException("Cannot replace " + archiveFile, e);
+    }
+  }
+
+  private List<File> getAllFiles(File dir, String extension) throws IOException {
+    ArrayList<File> fileList = new ArrayList<>();
+    getAllFiles(dir, extension, fileList);
+    return fileList;
+  }
+
+  private void getAllFiles(File dir, String extension, List<File> fileList) throws IOException {
+    for (File f : listFiles(dir)) {
+      if (f.getName().endsWith(extension)) {
+        fileList.add(f);
+      }
+      if (f.isDirectory()) {
+        getAllFiles(f, extension, fileList);
+      }
+    }
+  }
+
+  private List<String> getRelativePaths(File dir, String extension) throws IOException {
+    ArrayList<String> pathList = new ArrayList<>();
+    getRelativePaths(dir, extension, "", pathList);
+    return pathList;
+  }
+
+  private static void getRelativePaths(
+      File dir, String extension, String path, List<String> pathList) throws IOException {
+    for (File f : listFiles(dir)) {
+      if (f.getName().endsWith(extension)) {
+        pathList.add(path + f.getName());
+      }
+      if (f.isDirectory()) {
+        getRelativePaths(f, extension, path + f.getName() + "/", pathList);
+      }
+    }
+  }
+
+  private static void deleteAllFiles(File dir) throws IOException {
+    for (File f : listFiles(dir)) {
+      if (f.isDirectory()) {
+        deleteAllFiles(f);
+      } else {
+        f.delete();
+      }
+    }
+    dir.delete();
+  }
+
+  private static File[] listFiles(File dir) throws IOException {
+    File[] files = dir.listFiles();
+    if (files == null) {
+      throw new IOException("Failed to list directory: " + dir);
+    }
+    return files;
+  }
+}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/AbstractProgram.java b/java/com/google/gerrit/pgm/util/AbstractProgram.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/AbstractProgram.java
rename to java/com/google/gerrit/pgm/util/AbstractProgram.java
diff --git a/java/com/google/gerrit/pgm/util/BUILD b/java/com/google/gerrit/pgm/util/BUILD
new file mode 100644
index 0000000..7fe3bfa
--- /dev/null
+++ b/java/com/google/gerrit/pgm/util/BUILD
@@ -0,0 +1,30 @@
+java_library(
+    name = "util",
+    srcs = glob(["**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/lifecycle",
+        "//java/com/google/gerrit/metrics",
+        "//java/com/google/gerrit/metrics/dropwizard",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/server:module",
+        "//java/com/google/gerrit/server/cache/h2",
+        "//java/com/google/gerrit/server/cache/mem",
+        "//java/com/google/gerrit/server/git/receive",
+        "//java/com/google/gerrit/server/restapi",
+        "//java/com/google/gerrit/server/schema",
+        "//java/com/google/gerrit/util/cli",
+        "//lib:args4j",
+        "//lib:guava",
+        "//lib:gwtorm",
+        "//lib/commons:dbcp",
+        "//lib/flogger:api",
+        "//lib/guice",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/log:jsonevent-layout",
+        "//lib/log:log4j",
+    ],
+)
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/BatchGitModule.java b/java/com/google/gerrit/pgm/util/BatchGitModule.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/BatchGitModule.java
rename to java/com/google/gerrit/pgm/util/BatchGitModule.java
diff --git a/java/com/google/gerrit/pgm/util/BatchProgramModule.java b/java/com/google/gerrit/pgm/util/BatchProgramModule.java
new file mode 100644
index 0000000..540c5f3
--- /dev/null
+++ b/java/com/google/gerrit/pgm/util/BatchProgramModule.java
@@ -0,0 +1,202 @@
+// Copyright (C) 2014 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.google.gerrit.pgm.util;
+
+import static com.google.inject.Scopes.SINGLETON;
+
+import com.google.common.cache.Cache;
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.extensions.api.projects.CommentLinkInfo;
+import com.google.gerrit.extensions.common.AccountVisibility;
+import com.google.gerrit.extensions.config.FactoryModule;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountCacheImpl;
+import com.google.gerrit.server.account.AccountVisibilityProvider;
+import com.google.gerrit.server.account.CapabilityCollection;
+import com.google.gerrit.server.account.FakeRealm;
+import com.google.gerrit.server.account.GroupCacheImpl;
+import com.google.gerrit.server.account.GroupIncludeCacheImpl;
+import com.google.gerrit.server.account.Realm;
+import com.google.gerrit.server.account.externalids.ExternalIdModule;
+import com.google.gerrit.server.cache.CacheRemovalListener;
+import com.google.gerrit.server.cache.h2.H2CacheModule;
+import com.google.gerrit.server.cache.mem.DefaultMemoryCacheModule;
+import com.google.gerrit.server.change.ChangeJson;
+import com.google.gerrit.server.change.ChangeKindCacheImpl;
+import com.google.gerrit.server.change.MergeabilityCacheImpl;
+import com.google.gerrit.server.change.PatchSetInserter;
+import com.google.gerrit.server.change.RebaseChangeOp;
+import com.google.gerrit.server.config.AdministrateServerGroups;
+import com.google.gerrit.server.config.CanonicalWebUrl;
+import com.google.gerrit.server.config.CanonicalWebUrlProvider;
+import com.google.gerrit.server.config.DefaultUrlFormatter;
+import com.google.gerrit.server.config.DisableReverseDnsLookup;
+import com.google.gerrit.server.config.DisableReverseDnsLookupProvider;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.GitReceivePackGroups;
+import com.google.gerrit.server.config.GitUploadPackGroups;
+import com.google.gerrit.server.config.SysExecutorModule;
+import com.google.gerrit.server.extensions.events.EventUtil;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.extensions.events.RevisionCreated;
+import com.google.gerrit.server.git.MergeUtil;
+import com.google.gerrit.server.git.SearchingChangeCacheImpl;
+import com.google.gerrit.server.git.TagCache;
+import com.google.gerrit.server.mail.send.ReplacePatchSetSender;
+import com.google.gerrit.server.notedb.NoteDbModule;
+import com.google.gerrit.server.patch.DiffExecutorModule;
+import com.google.gerrit.server.patch.PatchListCacheImpl;
+import com.google.gerrit.server.permissions.DefaultPermissionBackendModule;
+import com.google.gerrit.server.permissions.SectionSortCache;
+import com.google.gerrit.server.plugins.PluginModule;
+import com.google.gerrit.server.project.CommentLinkProvider;
+import com.google.gerrit.server.project.CommitResource;
+import com.google.gerrit.server.project.ProjectCacheImpl;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.project.SubmitRuleEvaluator;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.ChangeQueryProcessor;
+import com.google.gerrit.server.restapi.group.GroupModule;
+import com.google.gerrit.server.rules.DefaultSubmitRule;
+import com.google.gerrit.server.rules.IgnoreSelfApprovalRule;
+import com.google.gerrit.server.rules.PrologModule;
+import com.google.gerrit.server.rules.SubmitRule;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.inject.Inject;
+import com.google.inject.Module;
+import com.google.inject.TypeLiteral;
+import com.google.inject.util.Providers;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.jgit.lib.Config;
+
+/**
+ * Module for programs that perform batch operations on a site.
+ *
+ * <p>Any program that requires this module likely also requires using {@link ThreadLimiter} to
+ * limit the number of threads accessing the database concurrently.
+ */
+public class BatchProgramModule extends FactoryModule {
+  private final Config cfg;
+  private final Module reviewDbModule;
+
+  @Inject
+  BatchProgramModule(@GerritServerConfig Config cfg, PerThreadReviewDbModule reviewDbModule) {
+    this.cfg = cfg;
+    this.reviewDbModule = reviewDbModule;
+  }
+
+  @SuppressWarnings("rawtypes")
+  @Override
+  protected void configure() {
+    install(reviewDbModule);
+    install(new DiffExecutorModule());
+    install(new SysExecutorModule());
+    install(BatchUpdate.module());
+    install(PatchListCacheImpl.module());
+    install(new DefaultUrlFormatter.Module());
+
+    // There is the concept of LifecycleModule, in Gerrit's own extension to Guice, which has these:
+    //  listener().to(SomeClassImplementingLifecycleListener.class);
+    // and the start() methods of each such listener are executed in the order they are declared.
+    // Makes sure that PluginLoader.start() is executed before the LuceneIndexModule.start() so that
+    // plugins get loaded and the respective Guice modules installed so that the on-line reindexing
+    // will happen with the proper classes (e.g. group backends, custom Prolog predicates) and the
+    // associated rules ready to be evaluated.
+    install(new PluginModule());
+
+    // We're just running through each change
+    // once, so don't worry about cache removal.
+    bind(new TypeLiteral<DynamicSet<CacheRemovalListener>>() {})
+        .toInstance(DynamicSet.<CacheRemovalListener>emptySet());
+    bind(new TypeLiteral<DynamicMap<Cache<?, ?>>>() {})
+        .toInstance(DynamicMap.<Cache<?, ?>>emptyMap());
+    bind(new TypeLiteral<List<CommentLinkInfo>>() {})
+        .toProvider(CommentLinkProvider.class)
+        .in(SINGLETON);
+    bind(new TypeLiteral<DynamicMap<ChangeQueryProcessor.ChangeAttributeFactory>>() {})
+        .toInstance(DynamicMap.<ChangeQueryProcessor.ChangeAttributeFactory>emptyMap());
+    bind(new TypeLiteral<DynamicMap<RestView<CommitResource>>>() {})
+        .toInstance(DynamicMap.<RestView<CommitResource>>emptyMap());
+    bind(String.class)
+        .annotatedWith(CanonicalWebUrl.class)
+        .toProvider(CanonicalWebUrlProvider.class);
+    bind(Boolean.class)
+        .annotatedWith(DisableReverseDnsLookup.class)
+        .toProvider(DisableReverseDnsLookupProvider.class)
+        .in(SINGLETON);
+    bind(Realm.class).to(FakeRealm.class);
+    bind(IdentifiedUser.class).toProvider(Providers.<IdentifiedUser>of(null));
+    bind(ReplacePatchSetSender.Factory.class)
+        .toProvider(Providers.<ReplacePatchSetSender.Factory>of(null));
+    bind(CurrentUser.class).to(IdentifiedUser.class);
+    factory(MergeUtil.Factory.class);
+    factory(PatchSetInserter.Factory.class);
+    factory(RebaseChangeOp.Factory.class);
+
+    // As Reindex is a batch program, don't assume the index is available for
+    // the change cache.
+    bind(SearchingChangeCacheImpl.class).toProvider(Providers.<SearchingChangeCacheImpl>of(null));
+
+    bind(new TypeLiteral<ImmutableSet<GroupReference>>() {})
+        .annotatedWith(AdministrateServerGroups.class)
+        .toInstance(ImmutableSet.<GroupReference>of());
+    bind(new TypeLiteral<Set<AccountGroup.UUID>>() {})
+        .annotatedWith(GitUploadPackGroups.class)
+        .toInstance(Collections.<AccountGroup.UUID>emptySet());
+    bind(new TypeLiteral<Set<AccountGroup.UUID>>() {})
+        .annotatedWith(GitReceivePackGroups.class)
+        .toInstance(Collections.<AccountGroup.UUID>emptySet());
+
+    install(new BatchGitModule());
+    install(new DefaultPermissionBackendModule());
+    install(new DefaultMemoryCacheModule());
+    install(new H2CacheModule());
+    install(new ExternalIdModule());
+    install(new GroupModule());
+    install(new NoteDbModule(cfg));
+    install(AccountCacheImpl.module());
+    install(GroupCacheImpl.module());
+    install(GroupIncludeCacheImpl.module());
+    install(ProjectCacheImpl.module());
+    install(SectionSortCache.module());
+    install(ChangeKindCacheImpl.module());
+    install(MergeabilityCacheImpl.module());
+    install(TagCache.module());
+    factory(CapabilityCollection.Factory.class);
+    factory(ChangeData.AssistedFactory.class);
+    factory(ProjectState.Factory.class);
+
+    // Submit rules
+    DynamicSet.setOf(binder(), SubmitRule.class);
+    factory(SubmitRuleEvaluator.Factory.class);
+    install(new PrologModule());
+    install(new DefaultSubmitRule.Module());
+    install(new IgnoreSelfApprovalRule.Module());
+
+    bind(ChangeJson.Factory.class).toProvider(Providers.<ChangeJson.Factory>of(null));
+    bind(EventUtil.class).toProvider(Providers.<EventUtil>of(null));
+    bind(GitReferenceUpdated.class).toInstance(GitReferenceUpdated.DISABLED);
+    bind(RevisionCreated.class).toInstance(RevisionCreated.DISABLED);
+    bind(AccountVisibility.class).toProvider(AccountVisibilityProvider.class).in(SINGLETON);
+  }
+}
diff --git a/java/com/google/gerrit/pgm/util/ErrorLogFile.java b/java/com/google/gerrit/pgm/util/ErrorLogFile.java
new file mode 100644
index 0000000..227719a
--- /dev/null
+++ b/java/com/google/gerrit/pgm/util/ErrorLogFile.java
@@ -0,0 +1,90 @@
+// Copyright (C) 2009 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.google.gerrit.pgm.util;
+
+import com.google.gerrit.common.FileUtil;
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.util.SystemLog;
+import java.io.IOException;
+import java.nio.file.Path;
+import net.logstash.log4j.JSONEventLayoutV1;
+import org.apache.log4j.ConsoleAppender;
+import org.apache.log4j.Level;
+import org.apache.log4j.LogManager;
+import org.apache.log4j.Logger;
+import org.apache.log4j.PatternLayout;
+import org.eclipse.jgit.lib.Config;
+
+public class ErrorLogFile {
+  static final String LOG_NAME = "error_log";
+  static final String JSON_SUFFIX = ".json";
+
+  public static void errorOnlyConsole() {
+    LogManager.resetConfiguration();
+
+    PatternLayout layout = new PatternLayout();
+    layout.setConversionPattern("%-5p %c %x: %m%n");
+
+    ConsoleAppender dst = new ConsoleAppender();
+    dst.setLayout(layout);
+    dst.setTarget("System.err");
+    dst.setThreshold(Level.ERROR);
+    dst.activateOptions();
+
+    Logger root = LogManager.getRootLogger();
+    root.removeAllAppenders();
+    root.addAppender(dst);
+  }
+
+  public static LifecycleListener start(Path sitePath, Config config) throws IOException {
+    Path logdir =
+        FileUtil.mkdirsOrDie(new SitePaths(sitePath).logs_dir, "Cannot create log directory");
+    if (SystemLog.shouldConfigure()) {
+      initLogSystem(logdir, config);
+    }
+
+    return new LifecycleListener() {
+      @Override
+      public void start() {}
+
+      @Override
+      public void stop() {
+        LogManager.shutdown();
+      }
+    };
+  }
+
+  private static void initLogSystem(Path logdir, Config config) {
+    Logger root = LogManager.getRootLogger();
+    root.removeAllAppenders();
+
+    boolean json = config.getBoolean("log", "jsonLogging", false);
+    boolean text = config.getBoolean("log", "textLogging", true) || !json;
+    boolean rotate = config.getBoolean("log", "rotate", true);
+
+    if (text) {
+      root.addAppender(
+          SystemLog.createAppender(
+              logdir, LOG_NAME, new PatternLayout("[%d] [%t] %-5p %c %x: %m%n"), rotate));
+    }
+
+    if (json) {
+      root.addAppender(
+          SystemLog.createAppender(
+              logdir, LOG_NAME + JSON_SUFFIX, new JSONEventLayoutV1(), rotate));
+    }
+  }
+}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/GuiceLogger.java b/java/com/google/gerrit/pgm/util/GuiceLogger.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/GuiceLogger.java
rename to java/com/google/gerrit/pgm/util/GuiceLogger.java
diff --git a/java/com/google/gerrit/pgm/util/LogFileCompressor.java b/java/com/google/gerrit/pgm/util/LogFileCompressor.java
new file mode 100644
index 0000000..413e0fa
--- /dev/null
+++ b/java/com/google/gerrit/pgm/util/LogFileCompressor.java
@@ -0,0 +1,171 @@
+// Copyright (C) 2009 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.google.gerrit.pgm.util;
+
+import static java.util.concurrent.TimeUnit.HOURS;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.common.io.ByteStreams;
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.lifecycle.LifecycleModule;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.git.WorkQueue;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.file.DirectoryStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.temporal.ChronoUnit;
+import java.util.concurrent.Future;
+import java.util.zip.GZIPOutputStream;
+import org.eclipse.jgit.lib.Config;
+
+/** Compresses the old error logs. */
+public class LogFileCompressor implements Runnable {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static class Module extends LifecycleModule {
+    @Override
+    protected void configure() {
+      listener().to(Lifecycle.class);
+    }
+  }
+
+  static class Lifecycle implements LifecycleListener {
+    private final WorkQueue queue;
+    private final LogFileCompressor compressor;
+    private final boolean enabled;
+
+    @Inject
+    Lifecycle(WorkQueue queue, LogFileCompressor compressor, @GerritServerConfig Config config) {
+      this.queue = queue;
+      this.compressor = compressor;
+      this.enabled = config.getBoolean("log", "compress", true);
+    }
+
+    @Override
+    public void start() {
+      if (!enabled) {
+        return;
+      }
+      // compress log once and then schedule compression every day at 11:00pm
+      queue.getDefaultQueue().execute(compressor);
+      ZoneId zone = ZoneId.systemDefault();
+      LocalDateTime now = LocalDateTime.now(zone);
+      long milliSecondsUntil11pm =
+          now.until(now.withHour(23).withMinute(0).withSecond(0).withNano(0), ChronoUnit.MILLIS);
+      @SuppressWarnings("unused")
+      Future<?> possiblyIgnoredError =
+          queue
+              .getDefaultQueue()
+              .scheduleAtFixedRate(
+                  compressor, milliSecondsUntil11pm, HOURS.toMillis(24), MILLISECONDS);
+    }
+
+    @Override
+    public void stop() {}
+  }
+
+  private final Path logs_dir;
+
+  @Inject
+  LogFileCompressor(SitePaths site) {
+    logs_dir = resolve(site.logs_dir);
+  }
+
+  private static Path resolve(Path p) {
+    try {
+      return p.toRealPath().normalize();
+    } catch (IOException e) {
+      return p.toAbsolutePath().normalize();
+    }
+  }
+
+  @Override
+  public void run() {
+    try {
+      if (!Files.isDirectory(logs_dir)) {
+        return;
+      }
+      try (DirectoryStream<Path> list = Files.newDirectoryStream(logs_dir)) {
+        for (Path entry : list) {
+          if (!isLive(entry) && !isCompressed(entry) && isLogFile(entry)) {
+            compress(entry);
+          }
+        }
+      } catch (IOException e) {
+        logger.atSevere().withCause(e).log("Error listing logs to compress in %s", logs_dir);
+      }
+    } catch (Exception e) {
+      logger.atSevere().withCause(e).log("Failed to compress log files: %s", e.getMessage());
+    }
+  }
+
+  private boolean isLive(Path entry) {
+    String name = entry.getFileName().toString();
+    return name.endsWith("_log")
+        || name.endsWith(".log")
+        || name.endsWith(".run")
+        || name.endsWith(".pid")
+        || name.endsWith(".json");
+  }
+
+  private boolean isCompressed(Path entry) {
+    String name = entry.getFileName().toString();
+    return name.endsWith(".gz") //
+        || name.endsWith(".zip") //
+        || name.endsWith(".bz2");
+  }
+
+  private boolean isLogFile(Path entry) {
+    return Files.isRegularFile(entry);
+  }
+
+  private void compress(Path src) {
+    Path dst = src.resolveSibling(src.getFileName() + ".gz");
+    Path tmp = src.resolveSibling(".tmp." + src.getFileName());
+    try {
+      try (InputStream in = Files.newInputStream(src);
+          OutputStream out = new GZIPOutputStream(Files.newOutputStream(tmp))) {
+        ByteStreams.copy(in, out);
+      }
+      tmp.toFile().setReadOnly();
+      try {
+        Files.move(tmp, dst);
+      } catch (IOException e) {
+        throw new IOException("Cannot rename " + tmp + " to " + dst, e);
+      }
+      Files.delete(src);
+    } catch (IOException e) {
+      logger.atSevere().withCause(e).log("Cannot compress %s", src);
+      try {
+        Files.deleteIfExists(tmp);
+      } catch (IOException e2) {
+        logger.atWarning().withCause(e2).log("Failed to delete temporary log file %s", tmp);
+      }
+    }
+  }
+
+  @Override
+  public String toString() {
+    return "Log File Compressor";
+  }
+}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/PerThreadReviewDbModule.java b/java/com/google/gerrit/pgm/util/PerThreadReviewDbModule.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/PerThreadReviewDbModule.java
rename to java/com/google/gerrit/pgm/util/PerThreadReviewDbModule.java
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ProxyUtil.java b/java/com/google/gerrit/pgm/util/ProxyUtil.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ProxyUtil.java
rename to java/com/google/gerrit/pgm/util/ProxyUtil.java
diff --git a/java/com/google/gerrit/pgm/util/RuntimeShutdown.java b/java/com/google/gerrit/pgm/util/RuntimeShutdown.java
new file mode 100644
index 0000000..c5e8567
--- /dev/null
+++ b/java/com/google/gerrit/pgm/util/RuntimeShutdown.java
@@ -0,0 +1,115 @@
+// Copyright (C) 2009 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.google.gerrit.pgm.util;
+
+import com.google.common.flogger.FluentLogger;
+import java.util.ArrayList;
+import java.util.List;
+
+public class RuntimeShutdown {
+  private static final ShutdownCallback cb = new ShutdownCallback();
+
+  /** Add a task to be performed when graceful shutdown is requested. */
+  public static void add(Runnable task) {
+    if (!cb.add(task)) {
+      // If the shutdown has already begun we cannot enqueue a new
+      // task. Instead trigger the task in the caller, without any
+      // of our locks held.
+      //
+      task.run();
+    }
+  }
+
+  /** Wait for the JVM shutdown to occur. */
+  public static void waitFor() {
+    cb.waitForShutdown();
+  }
+
+  public static void manualShutdown() {
+    cb.manualShutdown();
+  }
+
+  private RuntimeShutdown() {}
+
+  private static class ShutdownCallback extends Thread {
+    private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+    private final List<Runnable> tasks = new ArrayList<>();
+    private boolean shutdownStarted;
+    private boolean shutdownComplete;
+
+    ShutdownCallback() {
+      setName("ShutdownCallback");
+    }
+
+    boolean add(Runnable newTask) {
+      synchronized (this) {
+        if (!shutdownStarted && !shutdownComplete) {
+          if (tasks.isEmpty()) {
+            Runtime.getRuntime().addShutdownHook(this);
+          }
+          tasks.add(newTask);
+          return true;
+        }
+        // We don't permit adding a task once shutdown has started.
+        //
+        return false;
+      }
+    }
+
+    @Override
+    public void run() {
+      logger.atFine().log("Graceful shutdown requested");
+
+      List<Runnable> taskList;
+      synchronized (this) {
+        shutdownStarted = true;
+        taskList = tasks;
+      }
+
+      for (Runnable task : taskList) {
+        try {
+          task.run();
+        } catch (Exception err) {
+          logger.atSevere().withCause(err).log("Cleanup task failed");
+        }
+      }
+
+      logger.atFine().log("Shutdown complete");
+
+      synchronized (this) {
+        shutdownComplete = true;
+        notifyAll();
+      }
+    }
+
+    void manualShutdown() {
+      Runtime.getRuntime().removeShutdownHook(this);
+      run();
+    }
+
+    void waitForShutdown() {
+      synchronized (this) {
+        while (!shutdownComplete) {
+          try {
+            wait();
+          } catch (InterruptedException e) {
+            return;
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteLibraryBasedDataSourceProvider.java b/java/com/google/gerrit/pgm/util/SiteLibraryBasedDataSourceProvider.java
similarity index 100%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteLibraryBasedDataSourceProvider.java
rename to java/com/google/gerrit/pgm/util/SiteLibraryBasedDataSourceProvider.java
diff --git a/java/com/google/gerrit/pgm/util/SiteProgram.java b/java/com/google/gerrit/pgm/util/SiteProgram.java
new file mode 100644
index 0000000..1338efb
--- /dev/null
+++ b/java/com/google/gerrit/pgm/util/SiteProgram.java
@@ -0,0 +1,280 @@
+// Copyright (C) 2009 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.google.gerrit.pgm.util;
+
+import static com.google.gerrit.server.config.GerritServerConfigModule.getSecureStoreClassName;
+import static com.google.inject.Scopes.SINGLETON;
+import static com.google.inject.Stage.PRODUCTION;
+
+import com.google.gerrit.common.Die;
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.lifecycle.LifecycleModule;
+import com.google.gerrit.metrics.DisabledMetricMaker;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.metrics.dropwizard.DropWizardMetricMaker;
+import com.google.gerrit.server.config.GerritRuntime;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.GerritServerConfigModule;
+import com.google.gerrit.server.config.SitePath;
+import com.google.gerrit.server.git.GitRepositoryManagerModule;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gerrit.server.schema.DataSourceModule;
+import com.google.gerrit.server.schema.DataSourceProvider;
+import com.google.gerrit.server.schema.DataSourceType;
+import com.google.gerrit.server.schema.DatabaseModule;
+import com.google.gerrit.server.schema.SchemaModule;
+import com.google.gerrit.server.securestore.SecureStoreClassName;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.AbstractModule;
+import com.google.inject.Binding;
+import com.google.inject.CreationException;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import com.google.inject.Module;
+import com.google.inject.Provider;
+import com.google.inject.ProvisionException;
+import com.google.inject.TypeLiteral;
+import com.google.inject.name.Named;
+import com.google.inject.name.Names;
+import com.google.inject.spi.Message;
+import com.google.inject.util.Providers;
+import java.lang.annotation.Annotation;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+import javax.sql.DataSource;
+import org.eclipse.jgit.lib.Config;
+import org.kohsuke.args4j.Option;
+
+public abstract class SiteProgram extends AbstractProgram {
+  private static final String CONNECTION_ERROR = "Cannot connect to SQL database";
+
+  @Option(
+      name = "--site-path",
+      aliases = {"-d"},
+      usage = "Local directory containing site data")
+  private void setSitePath(String path) {
+    sitePath = Paths.get(path);
+  }
+
+  protected Provider<DataSource> dsProvider;
+
+  private Path sitePath = Paths.get(".");
+
+  protected SiteProgram() {}
+
+  protected SiteProgram(Path sitePath) {
+    this.sitePath = sitePath;
+  }
+
+  protected SiteProgram(Path sitePath, Provider<DataSource> dsProvider) {
+    this.sitePath = sitePath;
+    this.dsProvider = dsProvider;
+  }
+
+  /** @return the site path specified on the command line. */
+  protected Path getSitePath() {
+    return sitePath;
+  }
+
+  /** Ensures we are running inside of a valid site, otherwise throws a Die. */
+  protected void mustHaveValidSite() throws Die {
+    if (!Files.exists(sitePath.resolve("etc").resolve("gerrit.config"))) {
+      throw die("not a Gerrit site: '" + getSitePath() + "'\nPerhaps you need to run init first?");
+    }
+  }
+
+  /** @return provides database connectivity and site path. */
+  protected Injector createDbInjector(DataSourceProvider.Context context) {
+    return createDbInjector(false, context);
+  }
+
+  /** @return provides database connectivity and site path. */
+  protected Injector createDbInjector(boolean enableMetrics, DataSourceProvider.Context context) {
+    List<Module> modules = new ArrayList<>();
+
+    Module sitePathModule =
+        new AbstractModule() {
+          @Override
+          protected void configure() {
+            bind(Path.class).annotatedWith(SitePath.class).toInstance(getSitePath());
+            bind(String.class)
+                .annotatedWith(SecureStoreClassName.class)
+                .toProvider(Providers.of(getConfiguredSecureStoreClass()));
+          }
+        };
+    modules.add(sitePathModule);
+
+    if (enableMetrics) {
+      modules.add(new DropWizardMetricMaker.ApiModule());
+    } else {
+      modules.add(
+          new AbstractModule() {
+            @Override
+            protected void configure() {
+              bind(MetricMaker.class).to(DisabledMetricMaker.class);
+            }
+          });
+    }
+
+    modules.add(
+        new LifecycleModule() {
+          @Override
+          protected void configure() {
+            bind(DataSourceProvider.Context.class).toInstance(context);
+            if (dsProvider != null) {
+              bind(Key.get(DataSource.class, Names.named("ReviewDb")))
+                  .toProvider(dsProvider)
+                  .in(SINGLETON);
+              if (LifecycleListener.class.isAssignableFrom(dsProvider.getClass())) {
+                listener().toInstance((LifecycleListener) dsProvider);
+              }
+            } else {
+              bind(Key.get(DataSource.class, Names.named("ReviewDb")))
+                  .toProvider(SiteLibraryBasedDataSourceProvider.class)
+                  .in(SINGLETON);
+              listener().to(SiteLibraryBasedDataSourceProvider.class);
+            }
+          }
+        });
+    Module configModule = new GerritServerConfigModule();
+    modules.add(configModule);
+    modules.add(
+        new AbstractModule() {
+          @Override
+          protected void configure() {
+            bind(GerritRuntime.class).toInstance(getGerritRuntime());
+          }
+        });
+    Injector cfgInjector = Guice.createInjector(sitePathModule, configModule);
+    Config cfg = cfgInjector.getInstance(Key.get(Config.class, GerritServerConfig.class));
+    String dbType;
+    if (dsProvider != null) {
+      dbType = getDbType(dsProvider);
+    } else {
+      dbType = cfg.getString("database", null, "type");
+    }
+
+    if (dbType == null) {
+      throw new ProvisionException("database.type must be defined");
+    }
+
+    DataSourceType dst =
+        Guice.createInjector(new DataSourceModule(), configModule, sitePathModule)
+            .getInstance(Key.get(DataSourceType.class, Names.named(dbType.toLowerCase())));
+
+    modules.add(
+        new AbstractModule() {
+          @Override
+          protected void configure() {
+            bind(DataSourceType.class).toInstance(dst);
+          }
+        });
+    modules.add(new DatabaseModule());
+    modules.add(new SchemaModule());
+    modules.add(cfgInjector.getInstance(GitRepositoryManagerModule.class));
+    modules.add(new NotesMigration.Module());
+
+    try {
+      return Guice.createInjector(PRODUCTION, modules);
+    } catch (CreationException ce) {
+      Message first = ce.getErrorMessages().iterator().next();
+      Throwable why = first.getCause();
+
+      if (why instanceof SQLException) {
+        throw die(CONNECTION_ERROR, why);
+      }
+      if (why instanceof OrmException
+          && why.getCause() != null
+          && "Unable to determine driver URL".equals(why.getMessage())) {
+        why = why.getCause();
+        if (isCannotCreatePoolException(why)) {
+          throw die(CONNECTION_ERROR, why.getCause());
+        }
+        throw die(CONNECTION_ERROR, why);
+      }
+
+      StringBuilder buf = new StringBuilder();
+      if (why != null) {
+        buf.append(why.getMessage());
+        why = why.getCause();
+      } else {
+        buf.append(first.getMessage());
+      }
+      while (why != null) {
+        buf.append("\n  caused by ");
+        buf.append(why.toString());
+        why = why.getCause();
+      }
+      throw die(buf.toString(), new RuntimeException("DbInjector failed", ce));
+    }
+  }
+
+  /** Returns the current runtime used by this Gerrit program. */
+  protected GerritRuntime getGerritRuntime() {
+    return GerritRuntime.BATCH;
+  }
+
+  protected final String getConfiguredSecureStoreClass() {
+    return getSecureStoreClassName(sitePath);
+  }
+
+  private String getDbType(Provider<DataSource> dsProvider) {
+    String dbProductName;
+    try (Connection conn = dsProvider.get().getConnection()) {
+      dbProductName = conn.getMetaData().getDatabaseProductName().toLowerCase();
+    } catch (SQLException e) {
+      throw new RuntimeException(e);
+    }
+
+    List<Module> modules = new ArrayList<>();
+    modules.add(
+        new AbstractModule() {
+          @Override
+          protected void configure() {
+            bind(Path.class).annotatedWith(SitePath.class).toInstance(getSitePath());
+          }
+        });
+    modules.add(new GerritServerConfigModule());
+    modules.add(new DataSourceModule());
+    Injector i = Guice.createInjector(modules);
+    List<Binding<DataSourceType>> dsTypeBindings =
+        i.findBindingsByType(new TypeLiteral<DataSourceType>() {});
+    for (Binding<DataSourceType> binding : dsTypeBindings) {
+      Annotation annotation = binding.getKey().getAnnotation();
+      if (annotation instanceof Named) {
+        Named named = (Named) annotation;
+        if (named.value().toLowerCase().contains(dbProductName)) {
+          return named.value();
+        }
+      }
+    }
+    throw new IllegalStateException(
+        String.format(
+            "Cannot guess database type from the database product name '%s'", dbProductName));
+  }
+
+  @SuppressWarnings("deprecation")
+  private static boolean isCannotCreatePoolException(Throwable why) {
+    return why instanceof org.apache.commons.dbcp.SQLNestedException
+        && why.getCause() != null
+        && why.getMessage().startsWith("Cannot create PoolableConnectionFactory");
+  }
+}
diff --git a/java/com/google/gerrit/pgm/util/ThreadLimiter.java b/java/com/google/gerrit/pgm/util/ThreadLimiter.java
new file mode 100644
index 0000000..64f703bd
--- /dev/null
+++ b/java/com/google/gerrit/pgm/util/ThreadLimiter.java
@@ -0,0 +1,50 @@
+// Copyright (C) 2014 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.google.gerrit.pgm.util;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.ThreadSettingsConfig;
+import com.google.gerrit.server.schema.DataSourceType;
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import org.eclipse.jgit.lib.Config;
+
+// TODO(dborowitz): Not necessary once we switch to NoteDb.
+/** Utility to limit threads used by a batch program. */
+public class ThreadLimiter {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static int limitThreads(Injector dbInjector, int threads) {
+    return limitThreads(
+        dbInjector.getInstance(Key.get(Config.class, GerritServerConfig.class)),
+        dbInjector.getInstance(DataSourceType.class),
+        dbInjector.getInstance(ThreadSettingsConfig.class),
+        threads);
+  }
+
+  private static int limitThreads(
+      Config cfg, DataSourceType dst, ThreadSettingsConfig threadSettingsConfig, int threads) {
+    boolean usePool = cfg.getBoolean("database", "connectionpool", dst.usePool());
+    int poolLimit = threadSettingsConfig.getDatabasePoolLimit();
+    if (usePool && threads > poolLimit) {
+      logger.atWarning().log("Limiting program to %d threads due to database.poolLimit", poolLimit);
+      return poolLimit;
+    }
+    return threads;
+  }
+
+  private ThreadLimiter() {}
+}
diff --git a/java/com/google/gerrit/prettify/BUILD b/java/com/google/gerrit/prettify/BUILD
new file mode 100644
index 0000000..366a1a0
--- /dev/null
+++ b/java/com/google/gerrit/prettify/BUILD
@@ -0,0 +1,31 @@
+load("//tools/bzl:gwt.bzl", "gwt_module")
+
+gwt_module(
+    name = "client",
+    srcs = glob(["common/**/*.java"]),
+    exported_deps = [
+        "//java/com/google/gerrit/extensions:client",
+        "//java/com/google/gerrit/reviewdb:client",
+        "//java/com/google/gwtexpui/safehtml",
+        "//java/org/eclipse/jgit:Edit",
+        "//java/org/eclipse/jgit:client",
+        "//lib:gwtjsonrpc",
+        "//lib:gwtjsonrpc_src",
+    ],
+    gwt_xml = "PrettyFormatter.gwt.xml",
+    visibility = ["//visibility:public"],
+    deps = ["//lib/gwt:user-neverlink"],
+)
+
+java_library(
+    name = "server",
+    srcs = glob(["common/**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/org/eclipse/jgit:server",
+        "//lib:guava",
+        "//lib:gwtjsonrpc",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+    ],
+)
diff --git a/gerrit-prettify/src/main/java/com/google/gerrit/prettify/PrettyFormatter.gwt.xml b/java/com/google/gerrit/prettify/PrettyFormatter.gwt.xml
similarity index 100%
rename from gerrit-prettify/src/main/java/com/google/gerrit/prettify/PrettyFormatter.gwt.xml
rename to java/com/google/gerrit/prettify/PrettyFormatter.gwt.xml
diff --git a/gerrit-prettify/src/main/java/com/google/gerrit/prettify/common/EditList.java b/java/com/google/gerrit/prettify/common/EditList.java
similarity index 100%
rename from gerrit-prettify/src/main/java/com/google/gerrit/prettify/common/EditList.java
rename to java/com/google/gerrit/prettify/common/EditList.java
diff --git a/gerrit-prettify/src/main/java/com/google/gerrit/prettify/common/SparseFileContent.java b/java/com/google/gerrit/prettify/common/SparseFileContent.java
similarity index 100%
rename from gerrit-prettify/src/main/java/com/google/gerrit/prettify/common/SparseFileContent.java
rename to java/com/google/gerrit/prettify/common/SparseFileContent.java
diff --git a/java/com/google/gerrit/proto/BUILD b/java/com/google/gerrit/proto/BUILD
new file mode 100644
index 0000000..48185d6
--- /dev/null
+++ b/java/com/google/gerrit/proto/BUILD
@@ -0,0 +1,14 @@
+java_binary(
+    name = "ProtoGen",
+    srcs = ["ProtoGen.java"],
+    resource_strip_prefix = "resources",
+    resources = ["//resources/com/google/gerrit/proto"],
+    visibility = ["//proto:__pkg__"],
+    deps = [
+        "//java/com/google/gerrit/reviewdb:server",
+        "//lib:args4j",
+        "//lib:guava",
+        "//lib:gwtorm",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+    ],
+)
diff --git a/java/com/google/gerrit/proto/ProtoGen.java b/java/com/google/gerrit/proto/ProtoGen.java
new file mode 100644
index 0000000..c130241
--- /dev/null
+++ b/java/com/google/gerrit/proto/ProtoGen.java
@@ -0,0 +1,84 @@
+// Copyright (C) 2010 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.google.gerrit.proto;
+
+import static com.google.common.base.Preconditions.checkState;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gwtorm.schema.java.JavaSchemaModel;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.nio.ByteBuffer;
+import org.eclipse.jgit.internal.storage.file.LockFile;
+import org.eclipse.jgit.util.IO;
+import org.kohsuke.args4j.CmdLineException;
+import org.kohsuke.args4j.CmdLineParser;
+import org.kohsuke.args4j.Option;
+import org.kohsuke.args4j.ParserProperties;
+
+public class ProtoGen {
+  @Option(
+      name = "--output",
+      aliases = {"-o"},
+      required = true,
+      metaVar = "FILE",
+      usage = "File to write .proto into")
+  private File file;
+
+  public static void main(String[] argv) throws Exception {
+    System.exit(new ProtoGen().run(argv));
+  }
+
+  private int run(String[] argv) throws Exception {
+    CmdLineParser parser = new CmdLineParser(this, ParserProperties.defaults().withAtSyntax(false));
+    try {
+      parser.parseArgument(argv);
+    } catch (CmdLineException e) {
+      System.err.println(e.getMessage());
+      System.err.println(getClass().getSimpleName() + " -o output.proto");
+      parser.printUsage(System.err);
+      return 1;
+    }
+
+    LockFile lock = new LockFile(file.getAbsoluteFile());
+    checkState(lock.lock(), "cannot lock %s", file);
+    try {
+      JavaSchemaModel jsm = new JavaSchemaModel(ReviewDb.class);
+      try (OutputStream o = lock.getOutputStream();
+          PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(o, UTF_8)))) {
+        String header;
+        try (InputStream in = getClass().getResourceAsStream("ProtoGenHeader.txt")) {
+          ByteBuffer buf = IO.readWholeStream(in, 1024);
+          int ptr = buf.arrayOffset() + buf.position();
+          int len = buf.remaining();
+          header = new String(buf.array(), ptr, len, UTF_8);
+        }
+
+        out.write(header);
+        jsm.generateProto(out);
+        out.flush();
+      }
+      checkState(lock.commit(), "Could not write to %s", file);
+    } finally {
+      lock.unlock();
+    }
+    return 0;
+  }
+}
diff --git a/java/com/google/gerrit/reviewdb/BUILD b/java/com/google/gerrit/reviewdb/BUILD
new file mode 100644
index 0000000..f038a23
--- /dev/null
+++ b/java/com/google/gerrit/reviewdb/BUILD
@@ -0,0 +1,28 @@
+load("//tools/bzl:gwt.bzl", "gwt_module")
+
+package(
+    default_visibility = ["//visibility:public"],
+)
+
+gwt_module(
+    name = "client",
+    srcs = glob(["client/**/*.java"]),
+    gwt_xml = "ReviewDB.gwt.xml",
+    deps = [
+        "//java/com/google/gerrit/extensions:client",
+        "//lib:gwtorm-client",
+        "//lib:gwtorm-client_src",
+    ],
+)
+
+java_library(
+    name = "server",
+    srcs = glob(["**/*.java"]),
+    resource_strip_prefix = "resources",
+    resources = ["//resources/com/google/gerrit/reviewdb"],
+    deps = [
+        "//java/com/google/gerrit/extensions:api",
+        "//lib:guava",
+        "//lib:gwtorm",
+    ],
+)
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/ReviewDB.gwt.xml b/java/com/google/gerrit/reviewdb/ReviewDB.gwt.xml
similarity index 100%
rename from gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/ReviewDB.gwt.xml
rename to java/com/google/gerrit/reviewdb/ReviewDB.gwt.xml
diff --git a/java/com/google/gerrit/reviewdb/client/Account.java b/java/com/google/gerrit/reviewdb/client/Account.java
new file mode 100644
index 0000000..717090e
--- /dev/null
+++ b/java/com/google/gerrit/reviewdb/client/Account.java
@@ -0,0 +1,294 @@
+// Copyright (C) 2008 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.google.gerrit.reviewdb.client;
+
+import static com.google.gerrit.reviewdb.client.RefNames.REFS_DRAFT_COMMENTS;
+import static com.google.gerrit.reviewdb.client.RefNames.REFS_STARRED_CHANGES;
+import static com.google.gerrit.reviewdb.client.RefNames.REFS_USERS;
+
+import com.google.gerrit.extensions.client.DiffPreferencesInfo;
+import com.google.gwtorm.client.Column;
+import com.google.gwtorm.client.IntKey;
+import java.sql.Timestamp;
+import java.util.Optional;
+
+/**
+ * Information about a single user.
+ *
+ * <p>A user may have multiple identities they can use to login to Gerrit (see ExternalId), but in
+ * such cases they always map back to a single Account entity.
+ *
+ * <p>Entities "owned" by an Account (that is, their primary key contains the {@link Account.Id} key
+ * as part of their key structure):
+ *
+ * <ul>
+ *   <li>ExternalId: OpenID identities and email addresses known to be registered to this user.
+ *       Multiple records can exist when the user has more than one public identity, such as a work
+ *       and a personal email address.
+ *   <li>{@link AccountGroupMember}: membership of the user in a specific human managed {@link
+ *       AccountGroup}. Multiple records can exist when the user is a member of more than one group.
+ *   <li>AccountSshKey: user's public SSH keys, for authentication through the internal SSH daemon.
+ *       One record per SSH key uploaded by the user, keys are checked in random order until a match
+ *       is found.
+ *   <li>{@link DiffPreferencesInfo}: user's preferences for rendering side-to-side and unified diff
+ * </ul>
+ */
+public final class Account {
+  /**
+   * Key local to Gerrit to identify a user.
+   *
+   * <p>Fields in this type must be annotated with {@link Column} so that account IDs can be
+   * converted into protos (protobuf requires the {@link Column} annotations for decoding/encoding).
+   * We need to be able to store account IDs as protos because we store change protos in the change
+   * index and a change references account IDs for the change owner and the assignee.
+   */
+  public static class Id extends IntKey<com.google.gwtorm.client.Key<?>> {
+    private static final long serialVersionUID = 1L;
+
+    @Column(id = 1)
+    protected int id;
+
+    protected Id() {}
+
+    public Id(int id) {
+      this.id = id;
+    }
+
+    @Override
+    public int get() {
+      return id;
+    }
+
+    @Override
+    protected void set(int newValue) {
+      id = newValue;
+    }
+
+    /** Parse an Account.Id out of a string representation. */
+    public static Optional<Id> tryParse(String str) {
+      try {
+        return Optional.of(new Id(Integer.parseInt(str)));
+      } catch (NumberFormatException e) {
+        return Optional.empty();
+      }
+    }
+
+    public static Id fromRef(String name) {
+      if (name == null) {
+        return null;
+      }
+      if (name.startsWith(REFS_USERS)) {
+        return fromRefPart(name.substring(REFS_USERS.length()));
+      } else if (name.startsWith(REFS_DRAFT_COMMENTS)) {
+        return parseAfterShardedRefPart(name.substring(REFS_DRAFT_COMMENTS.length()));
+      } else if (name.startsWith(REFS_STARRED_CHANGES)) {
+        return parseAfterShardedRefPart(name.substring(REFS_STARRED_CHANGES.length()));
+      }
+      return null;
+    }
+
+    /**
+     * Parse an Account.Id out of a part of a ref-name.
+     *
+     * @param name a ref name with the following syntax: {@code "34/1234..."}. We assume that the
+     *     caller has trimmed any prefix.
+     */
+    public static Id fromRefPart(String name) {
+      Integer id = RefNames.parseShardedRefPart(name);
+      return id != null ? new Account.Id(id) : null;
+    }
+
+    public static Id parseAfterShardedRefPart(String name) {
+      Integer id = RefNames.parseAfterShardedRefPart(name);
+      return id != null ? new Account.Id(id) : null;
+    }
+
+    /**
+     * Parse an Account.Id out of the last part of a ref name.
+     *
+     * <p>The input is a ref name of the form {@code ".../1234"}, where the suffix is a non-sharded
+     * account ID. Ref names using a sharded ID should use {@link #fromRefPart(String)} instead for
+     * greater safety.
+     *
+     * @param name ref name
+     * @return account ID, or null if not numeric.
+     */
+    public static Id fromRefSuffix(String name) {
+      Integer id = RefNames.parseRefSuffix(name);
+      return id != null ? new Account.Id(id) : null;
+    }
+  }
+
+  private Id accountId;
+
+  /** Date and time the user registered with the review server. */
+  private Timestamp registeredOn;
+
+  /** Full name of the user ("Given-name Surname" style). */
+  private String fullName;
+
+  /** Email address the user prefers to be contacted through. */
+  private String preferredEmail;
+
+  /**
+   * Is this user inactive? This is used to avoid showing some users (eg. former employees) in
+   * auto-suggest.
+   */
+  private boolean inactive;
+
+  /** The user-settable status of this account (e.g. busy, OOO, available) */
+  private String status;
+
+  /**
+   * ID of the user branch from which the account was read, {@code null} if the account was read
+   * from ReviewDb.
+   */
+  private String metaId;
+
+  protected Account() {}
+
+  /**
+   * Create a new account.
+   *
+   * @param newId unique id, see {@link com.google.gerrit.server.Sequences#nextAccountId()}.
+   * @param registeredOn when the account was registered.
+   */
+  public Account(Account.Id newId, Timestamp registeredOn) {
+    this.accountId = newId;
+    this.registeredOn = registeredOn;
+  }
+
+  /** Get local id of this account, to link with in other entities */
+  public Account.Id getId() {
+    return accountId;
+  }
+
+  /** Get the full name of the user ("Given-name Surname" style). */
+  public String getFullName() {
+    return fullName;
+  }
+
+  /** Set the full name of the user ("Given-name Surname" style). */
+  public void setFullName(String name) {
+    if (name != null && !name.trim().isEmpty()) {
+      fullName = name.trim();
+    } else {
+      fullName = null;
+    }
+  }
+
+  /** Email address the user prefers to be contacted through. */
+  public String getPreferredEmail() {
+    return preferredEmail;
+  }
+
+  /** Set the email address the user prefers to be contacted through. */
+  public void setPreferredEmail(String addr) {
+    preferredEmail = addr;
+  }
+
+  /**
+   * Formats an account name.
+   *
+   * <p>The return value goes into NoteDb commits and audit logs, so it should not be changed.
+   *
+   * <p>This method deliberately does not use {@code Anonymous Coward} because it can be changed
+   * using a {@code gerrit.config} option which is a problem for NoteDb commits that still refer to
+   * a previously defined value.
+   *
+   * @return the fullname, if present, otherwise the preferred email, if present, as a last resort a
+   *     generic string containing the accountId.
+   */
+  public String getName() {
+    if (fullName != null) {
+      return fullName;
+    }
+    if (preferredEmail != null) {
+      return preferredEmail;
+    }
+    return getName(accountId);
+  }
+
+  public static String getName(Account.Id accountId) {
+    return "GerritAccount #" + accountId.get();
+  }
+
+  /**
+   * Get the name and email address.
+   *
+   * <p>Example output:
+   *
+   * <ul>
+   *   <li>{@code A U. Thor &lt;author@example.com&gt;}: full populated
+   *   <li>{@code A U. Thor (12)}: missing email address
+   *   <li>{@code Anonymous Coward &lt;author@example.com&gt;}: missing name
+   *   <li>{@code Anonymous Coward (12)}: missing name and email address
+   * </ul>
+   */
+  public String getNameEmail(String anonymousCowardName) {
+    String name = fullName != null ? fullName : anonymousCowardName;
+    StringBuilder b = new StringBuilder();
+    b.append(name);
+    if (preferredEmail != null) {
+      b.append(" <");
+      b.append(preferredEmail);
+      b.append(">");
+    } else {
+      b.append(" (");
+      b.append(accountId.get());
+      b.append(")");
+    }
+    return b.toString();
+  }
+
+  /** Get the date and time the user first registered. */
+  public Timestamp getRegisteredOn() {
+    return registeredOn;
+  }
+
+  public String getMetaId() {
+    return metaId;
+  }
+
+  public void setMetaId(String metaId) {
+    this.metaId = metaId;
+  }
+
+  public boolean isActive() {
+    return !inactive;
+  }
+
+  public void setActive(boolean active) {
+    inactive = !active;
+  }
+
+  public String getStatus() {
+    return status;
+  }
+
+  public void setStatus(String status) {
+    this.status = status;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    return o instanceof Account && ((Account) o).getId().equals(getId());
+  }
+
+  @Override
+  public int hashCode() {
+    return getId().get();
+  }
+}
diff --git a/java/com/google/gerrit/reviewdb/client/AccountGroup.java b/java/com/google/gerrit/reviewdb/client/AccountGroup.java
new file mode 100644
index 0000000..c7dc420
--- /dev/null
+++ b/java/com/google/gerrit/reviewdb/client/AccountGroup.java
@@ -0,0 +1,310 @@
+// Copyright (C) 2008 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.google.gerrit.reviewdb.client;
+
+import com.google.gwtorm.client.Column;
+import com.google.gwtorm.client.IntKey;
+import com.google.gwtorm.client.StringKey;
+import java.sql.Timestamp;
+import java.util.Objects;
+
+/** Named group of one or more accounts, typically used for access controls. */
+public final class AccountGroup {
+  /**
+   * Time when the audit subsystem was implemented, used as the default value for {@link #createdOn}
+   * when one couldn't be determined from the audit log.
+   */
+  // Can't use Instant here because GWT. This is verified against a readable time in the tests,
+  // which don't need to compile under GWT.
+  private static final long AUDIT_CREATION_INSTANT_MS = 1244489460000L;
+
+  public static Timestamp auditCreationInstantTs() {
+    return new Timestamp(AUDIT_CREATION_INSTANT_MS);
+  }
+
+  /** Group name key */
+  public static class NameKey extends StringKey<com.google.gwtorm.client.Key<?>> {
+    private static final long serialVersionUID = 1L;
+
+    @Column(id = 1)
+    protected String name;
+
+    protected NameKey() {}
+
+    public NameKey(String n) {
+      name = n;
+    }
+
+    @Override
+    public String get() {
+      return name;
+    }
+
+    @Override
+    protected void set(String newValue) {
+      name = newValue;
+    }
+  }
+
+  /** Globally unique identifier. */
+  public static class UUID extends StringKey<com.google.gwtorm.client.Key<?>> {
+    private static final long serialVersionUID = 1L;
+
+    @Column(id = 1)
+    protected String uuid;
+
+    protected UUID() {}
+
+    public UUID(String n) {
+      uuid = n;
+    }
+
+    @Override
+    public String get() {
+      return uuid;
+    }
+
+    @Override
+    protected void set(String newValue) {
+      uuid = newValue;
+    }
+
+    /** Parse an {@link AccountGroup.UUID} out of a string representation. */
+    public static UUID parse(String str) {
+      final UUID r = new UUID();
+      r.fromString(str);
+      return r;
+    }
+
+    /** Parse an {@link AccountGroup.UUID} out of a ref-name. */
+    public static UUID fromRef(String ref) {
+      if (ref == null) {
+        return null;
+      }
+      if (ref.startsWith(RefNames.REFS_GROUPS)) {
+        return fromRefPart(ref.substring(RefNames.REFS_GROUPS.length()));
+      }
+      return null;
+    }
+
+    /**
+     * Parse an {@link AccountGroup.UUID} out of a part of a ref-name.
+     *
+     * @param refPart a ref name with the following syntax: {@code "12/1234..."}. We assume that the
+     *     caller has trimmed any prefix.
+     */
+    public static UUID fromRefPart(String refPart) {
+      String uuid = RefNames.parseShardedUuidFromRefPart(refPart);
+      return uuid != null ? new AccountGroup.UUID(uuid) : null;
+    }
+  }
+
+  /** @return true if the UUID is for a group managed within Gerrit. */
+  public static boolean isInternalGroup(AccountGroup.UUID uuid) {
+    return uuid.get().matches("^[0-9a-f]{40}$");
+  }
+
+  /** Synthetic key to link to within the database */
+  public static class Id extends IntKey<com.google.gwtorm.client.Key<?>> {
+    private static final long serialVersionUID = 1L;
+
+    @Column(id = 1)
+    protected int id;
+
+    protected Id() {}
+
+    public Id(int id) {
+      this.id = id;
+    }
+
+    @Override
+    public int get() {
+      return id;
+    }
+
+    @Override
+    protected void set(int newValue) {
+      id = newValue;
+    }
+
+    /** Parse an AccountGroup.Id out of a string representation. */
+    public static Id parse(String str) {
+      final Id r = new Id();
+      r.fromString(str);
+      return r;
+    }
+  }
+
+  /** Unique name of this group within the system. */
+  @Column(id = 1)
+  protected NameKey name;
+
+  /** Unique identity, to link entities as {@link #name} can change. */
+  @Column(id = 2)
+  protected Id groupId;
+
+  // DELETED: id = 3 (ownerGroupId)
+
+  /** A textual description of the group's purpose. */
+  @Column(id = 4, length = Integer.MAX_VALUE, notNull = false)
+  protected String description;
+
+  // DELETED: id = 5 (groupType)
+  // DELETED: id = 6 (externalName)
+
+  @Column(id = 7)
+  protected boolean visibleToAll;
+
+  // DELETED: id = 8 (emailOnlyAuthors)
+
+  /** Globally unique identifier name for this group. */
+  @Column(id = 9)
+  protected UUID groupUUID;
+
+  /**
+   * Identity of the group whose members can manage this group.
+   *
+   * <p>This can be a self-reference to indicate the group's members manage itself.
+   */
+  @Column(id = 10)
+  protected UUID ownerGroupUUID;
+
+  @Column(id = 11, notNull = false)
+  protected Timestamp createdOn;
+
+  protected AccountGroup() {}
+
+  public AccountGroup(
+      AccountGroup.NameKey newName,
+      AccountGroup.Id newId,
+      AccountGroup.UUID uuid,
+      Timestamp createdOn) {
+    name = newName;
+    groupId = newId;
+    visibleToAll = false;
+    groupUUID = uuid;
+    ownerGroupUUID = groupUUID;
+    this.createdOn = createdOn;
+  }
+
+  public AccountGroup(AccountGroup other) {
+    name = other.name;
+    groupId = other.groupId;
+    description = other.description;
+    visibleToAll = other.visibleToAll;
+    groupUUID = other.groupUUID;
+    ownerGroupUUID = other.ownerGroupUUID;
+    createdOn = other.createdOn;
+  }
+
+  public AccountGroup.Id getId() {
+    return groupId;
+  }
+
+  public String getName() {
+    return name.get();
+  }
+
+  public AccountGroup.NameKey getNameKey() {
+    return name;
+  }
+
+  public void setNameKey(AccountGroup.NameKey nameKey) {
+    name = nameKey;
+  }
+
+  public String getDescription() {
+    return description;
+  }
+
+  public void setDescription(String d) {
+    description = d;
+  }
+
+  public AccountGroup.UUID getOwnerGroupUUID() {
+    return ownerGroupUUID;
+  }
+
+  public void setOwnerGroupUUID(AccountGroup.UUID uuid) {
+    ownerGroupUUID = uuid;
+  }
+
+  public void setVisibleToAll(boolean visibleToAll) {
+    this.visibleToAll = visibleToAll;
+  }
+
+  public boolean isVisibleToAll() {
+    return visibleToAll;
+  }
+
+  public AccountGroup.UUID getGroupUUID() {
+    return groupUUID;
+  }
+
+  public void setGroupUUID(AccountGroup.UUID uuid) {
+    groupUUID = uuid;
+  }
+
+  public Timestamp getCreatedOn() {
+    return createdOn != null ? createdOn : auditCreationInstantTs();
+  }
+
+  public void setCreatedOn(Timestamp createdOn) {
+    this.createdOn = createdOn;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (!(o instanceof AccountGroup)) {
+      return false;
+    }
+    AccountGroup g = (AccountGroup) o;
+    return Objects.equals(name, g.name)
+        && Objects.equals(groupId, g.groupId)
+        && Objects.equals(description, g.description)
+        && visibleToAll == g.visibleToAll
+        && Objects.equals(groupUUID, g.groupUUID)
+        && Objects.equals(ownerGroupUUID, g.ownerGroupUUID)
+        // Treat created on epoch identical regardless if underlying value is null.
+        && getCreatedOn().equals(g.getCreatedOn());
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(
+        name, groupId, description, visibleToAll, groupUUID, ownerGroupUUID, createdOn);
+  }
+
+  @Override
+  public String toString() {
+    return getClass().getSimpleName()
+        + "{"
+        + "name="
+        + name
+        + ", groupId="
+        + groupId
+        + ", description="
+        + description
+        + ", visibleToAll="
+        + visibleToAll
+        + ", groupUUID="
+        + groupUUID
+        + ", ownerGroupUUID="
+        + ownerGroupUUID
+        + ", createdOn="
+        + createdOn
+        + "}";
+  }
+}
diff --git a/java/com/google/gerrit/reviewdb/client/AccountGroupById.java b/java/com/google/gerrit/reviewdb/client/AccountGroupById.java
new file mode 100644
index 0000000..17a205e
--- /dev/null
+++ b/java/com/google/gerrit/reviewdb/client/AccountGroupById.java
@@ -0,0 +1,96 @@
+// Copyright (C) 2011 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.google.gerrit.reviewdb.client;
+
+import com.google.gwtorm.client.Column;
+import com.google.gwtorm.client.CompoundKey;
+import java.util.Objects;
+
+/** Membership of an {@link AccountGroup} in an {@link AccountGroup}. */
+public final class AccountGroupById {
+  public static class Key extends CompoundKey<AccountGroup.Id> {
+    private static final long serialVersionUID = 1L;
+
+    @Column(id = 1)
+    protected AccountGroup.Id groupId;
+
+    @Column(id = 2)
+    protected AccountGroup.UUID includeUUID;
+
+    protected Key() {
+      groupId = new AccountGroup.Id();
+      includeUUID = new AccountGroup.UUID();
+    }
+
+    public Key(AccountGroup.Id g, AccountGroup.UUID u) {
+      groupId = g;
+      includeUUID = u;
+    }
+
+    @Override
+    public AccountGroup.Id getParentKey() {
+      return groupId;
+    }
+
+    public AccountGroup.Id getGroupId() {
+      return groupId;
+    }
+
+    public AccountGroup.UUID getIncludeUUID() {
+      return includeUUID;
+    }
+
+    @Override
+    public com.google.gwtorm.client.Key<?>[] members() {
+      return new com.google.gwtorm.client.Key<?>[] {includeUUID};
+    }
+  }
+
+  @Column(id = 1, name = Column.NONE)
+  protected Key key;
+
+  protected AccountGroupById() {}
+
+  public AccountGroupById(AccountGroupById.Key k) {
+    key = k;
+  }
+
+  public AccountGroupById.Key getKey() {
+    return key;
+  }
+
+  public AccountGroup.Id getGroupId() {
+    return key.groupId;
+  }
+
+  public AccountGroup.UUID getIncludeUUID() {
+    return key.includeUUID;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    return (o instanceof AccountGroupById) && Objects.equals(key, ((AccountGroupById) o).key);
+  }
+
+  @Override
+  public int hashCode() {
+    return key.hashCode();
+  }
+
+  @Override
+  public String toString() {
+    return getClass().getSimpleName() + "{key=" + key + "}";
+  }
+}
diff --git a/java/com/google/gerrit/reviewdb/client/AccountGroupByIdAud.java b/java/com/google/gerrit/reviewdb/client/AccountGroupByIdAud.java
new file mode 100644
index 0000000..759e4f6
--- /dev/null
+++ b/java/com/google/gerrit/reviewdb/client/AccountGroupByIdAud.java
@@ -0,0 +1,172 @@
+// Copyright (C) 2011 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.google.gerrit.reviewdb.client;
+
+import com.google.gwtorm.client.Column;
+import com.google.gwtorm.client.CompoundKey;
+import java.sql.Timestamp;
+import java.util.Objects;
+
+/** Inclusion of an {@link AccountGroup} in another {@link AccountGroup}. */
+public final class AccountGroupByIdAud {
+  public static class Key extends CompoundKey<AccountGroup.Id> {
+    private static final long serialVersionUID = 1L;
+
+    @Column(id = 1)
+    protected AccountGroup.Id groupId;
+
+    @Column(id = 2)
+    protected AccountGroup.UUID includeUUID;
+
+    @Column(id = 3)
+    protected Timestamp addedOn;
+
+    protected Key() {
+      groupId = new AccountGroup.Id();
+      includeUUID = new AccountGroup.UUID();
+    }
+
+    public Key(AccountGroup.Id g, AccountGroup.UUID u, Timestamp t) {
+      groupId = g;
+      includeUUID = u;
+      addedOn = t;
+    }
+
+    @Override
+    public AccountGroup.Id getParentKey() {
+      return groupId;
+    }
+
+    public AccountGroup.UUID getIncludeUUID() {
+      return includeUUID;
+    }
+
+    public Timestamp getAddedOn() {
+      return addedOn;
+    }
+
+    @Override
+    public com.google.gwtorm.client.Key<?>[] members() {
+      return new com.google.gwtorm.client.Key<?>[] {includeUUID};
+    }
+
+    @Override
+    public String toString() {
+      return "Key{"
+          + "groupId="
+          + groupId
+          + ", includeUUID="
+          + includeUUID
+          + ", addedOn="
+          + addedOn
+          + '}';
+    }
+  }
+
+  @Column(id = 1, name = Column.NONE)
+  protected Key key;
+
+  @Column(id = 2)
+  protected Account.Id addedBy;
+
+  @Column(id = 3, notNull = false)
+  protected Account.Id removedBy;
+
+  @Column(id = 4, notNull = false)
+  protected Timestamp removedOn;
+
+  protected AccountGroupByIdAud() {}
+
+  public AccountGroupByIdAud(final AccountGroupById m, Account.Id adder, Timestamp when) {
+    final AccountGroup.Id group = m.getGroupId();
+    final AccountGroup.UUID include = m.getIncludeUUID();
+    key = new AccountGroupByIdAud.Key(group, include, when);
+    addedBy = adder;
+  }
+
+  public AccountGroupByIdAud(AccountGroupByIdAud.Key key, Account.Id adder) {
+    this.key = key;
+    addedBy = adder;
+  }
+
+  public AccountGroupByIdAud.Key getKey() {
+    return key;
+  }
+
+  public AccountGroup.Id getGroupId() {
+    return key.getParentKey();
+  }
+
+  public AccountGroup.UUID getIncludeUUID() {
+    return key.getIncludeUUID();
+  }
+
+  public boolean isActive() {
+    return removedOn == null;
+  }
+
+  public void removed(Account.Id deleter, Timestamp when) {
+    removedBy = deleter;
+    removedOn = when;
+  }
+
+  public Account.Id getAddedBy() {
+    return addedBy;
+  }
+
+  public Timestamp getAddedOn() {
+    return key.getAddedOn();
+  }
+
+  public Account.Id getRemovedBy() {
+    return removedBy;
+  }
+
+  public Timestamp getRemovedOn() {
+    return removedOn;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (!(o instanceof AccountGroupByIdAud)) {
+      return false;
+    }
+    AccountGroupByIdAud a = (AccountGroupByIdAud) o;
+    return Objects.equals(key, a.key)
+        && Objects.equals(addedBy, a.addedBy)
+        && Objects.equals(removedBy, a.removedBy)
+        && Objects.equals(removedOn, a.removedOn);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(key, addedBy, removedBy, removedOn);
+  }
+
+  @Override
+  public String toString() {
+    return getClass().getSimpleName()
+        + "{"
+        + "key="
+        + key
+        + ", addedBy="
+        + addedBy
+        + ", removedBy="
+        + removedBy
+        + ", removedOn="
+        + removedOn
+        + "}";
+  }
+}
diff --git a/java/com/google/gerrit/reviewdb/client/AccountGroupMember.java b/java/com/google/gerrit/reviewdb/client/AccountGroupMember.java
new file mode 100644
index 0000000..e1e0754
--- /dev/null
+++ b/java/com/google/gerrit/reviewdb/client/AccountGroupMember.java
@@ -0,0 +1,92 @@
+// Copyright (C) 2008 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.google.gerrit.reviewdb.client;
+
+import com.google.gwtorm.client.Column;
+import com.google.gwtorm.client.CompoundKey;
+import java.util.Objects;
+
+/** Membership of an {@link Account} in an {@link AccountGroup}. */
+public final class AccountGroupMember {
+  public static class Key extends CompoundKey<Account.Id> {
+    private static final long serialVersionUID = 1L;
+
+    @Column(id = 1)
+    protected Account.Id accountId;
+
+    @Column(id = 2)
+    protected AccountGroup.Id groupId;
+
+    protected Key() {
+      accountId = new Account.Id();
+      groupId = new AccountGroup.Id();
+    }
+
+    public Key(Account.Id a, AccountGroup.Id g) {
+      accountId = a;
+      groupId = g;
+    }
+
+    @Override
+    public Account.Id getParentKey() {
+      return accountId;
+    }
+
+    public AccountGroup.Id getAccountGroupId() {
+      return groupId;
+    }
+
+    @Override
+    public com.google.gwtorm.client.Key<?>[] members() {
+      return new com.google.gwtorm.client.Key<?>[] {groupId};
+    }
+  }
+
+  @Column(id = 1, name = Column.NONE)
+  protected Key key;
+
+  protected AccountGroupMember() {}
+
+  public AccountGroupMember(AccountGroupMember.Key k) {
+    key = k;
+  }
+
+  public AccountGroupMember.Key getKey() {
+    return key;
+  }
+
+  public Account.Id getAccountId() {
+    return key.accountId;
+  }
+
+  public AccountGroup.Id getAccountGroupId() {
+    return key.groupId;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    return (o instanceof AccountGroupMember) && Objects.equals(key, ((AccountGroupMember) o).key);
+  }
+
+  @Override
+  public int hashCode() {
+    return key.hashCode();
+  }
+
+  @Override
+  public String toString() {
+    return getClass().getSimpleName() + "{key=" + key + "}";
+  }
+}
diff --git a/java/com/google/gerrit/reviewdb/client/AccountGroupMemberAudit.java b/java/com/google/gerrit/reviewdb/client/AccountGroupMemberAudit.java
new file mode 100644
index 0000000..fc7b2d8
--- /dev/null
+++ b/java/com/google/gerrit/reviewdb/client/AccountGroupMemberAudit.java
@@ -0,0 +1,177 @@
+// Copyright (C) 2009 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.google.gerrit.reviewdb.client;
+
+import com.google.gwtorm.client.Column;
+import com.google.gwtorm.client.CompoundKey;
+import java.sql.Timestamp;
+import java.util.Objects;
+
+/** Membership of an {@link Account} in an {@link AccountGroup}. */
+public final class AccountGroupMemberAudit {
+  public static class Key extends CompoundKey<Account.Id> {
+    private static final long serialVersionUID = 1L;
+
+    @Column(id = 1)
+    protected Account.Id accountId;
+
+    @Column(id = 2)
+    protected AccountGroup.Id groupId;
+
+    @Column(id = 3)
+    protected Timestamp addedOn;
+
+    protected Key() {
+      accountId = new Account.Id();
+      groupId = new AccountGroup.Id();
+    }
+
+    public Key(Account.Id a, AccountGroup.Id g, Timestamp t) {
+      accountId = a;
+      groupId = g;
+      addedOn = t;
+    }
+
+    @Override
+    public Account.Id getParentKey() {
+      return accountId;
+    }
+
+    public AccountGroup.Id getGroupId() {
+      return groupId;
+    }
+
+    public Timestamp getAddedOn() {
+      return addedOn;
+    }
+
+    @Override
+    public com.google.gwtorm.client.Key<?>[] members() {
+      return new com.google.gwtorm.client.Key<?>[] {groupId};
+    }
+
+    @Override
+    public String toString() {
+      return "Key{"
+          + "groupId="
+          + groupId
+          + ", accountId="
+          + accountId
+          + ", addedOn="
+          + addedOn
+          + '}';
+    }
+  }
+
+  @Column(id = 1, name = Column.NONE)
+  protected Key key;
+
+  @Column(id = 2)
+  protected Account.Id addedBy;
+
+  @Column(id = 3, notNull = false)
+  protected Account.Id removedBy;
+
+  @Column(id = 4, notNull = false)
+  protected Timestamp removedOn;
+
+  protected AccountGroupMemberAudit() {}
+
+  public AccountGroupMemberAudit(final AccountGroupMember m, Account.Id adder, Timestamp addedOn) {
+    final Account.Id who = m.getAccountId();
+    final AccountGroup.Id group = m.getAccountGroupId();
+    key = new AccountGroupMemberAudit.Key(who, group, addedOn);
+    addedBy = adder;
+  }
+
+  public AccountGroupMemberAudit(AccountGroupMemberAudit.Key key, Account.Id adder) {
+    this.key = key;
+    addedBy = adder;
+  }
+
+  public AccountGroupMemberAudit.Key getKey() {
+    return key;
+  }
+
+  public AccountGroup.Id getGroupId() {
+    return key.getGroupId();
+  }
+
+  public Account.Id getMemberId() {
+    return key.getParentKey();
+  }
+
+  public boolean isActive() {
+    return removedOn == null;
+  }
+
+  public void removed(Account.Id deleter, Timestamp when) {
+    removedBy = deleter;
+    removedOn = when;
+  }
+
+  public void removedLegacy() {
+    removedBy = addedBy;
+    removedOn = key.addedOn;
+  }
+
+  public Account.Id getAddedBy() {
+    return addedBy;
+  }
+
+  public Timestamp getAddedOn() {
+    return key.getAddedOn();
+  }
+
+  public Account.Id getRemovedBy() {
+    return removedBy;
+  }
+
+  public Timestamp getRemovedOn() {
+    return removedOn;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (!(o instanceof AccountGroupMemberAudit)) {
+      return false;
+    }
+    AccountGroupMemberAudit a = (AccountGroupMemberAudit) o;
+    return Objects.equals(key, a.key)
+        && Objects.equals(addedBy, a.addedBy)
+        && Objects.equals(removedBy, a.removedBy)
+        && Objects.equals(removedOn, a.removedOn);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(key, addedBy, removedBy, removedOn);
+  }
+
+  @Override
+  public String toString() {
+    return getClass().getSimpleName()
+        + "{"
+        + "key="
+        + key
+        + ", addedBy="
+        + addedBy
+        + ", removedBy="
+        + removedBy
+        + ", removedOn="
+        + removedOn
+        + "}";
+  }
+}
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupName.java b/java/com/google/gerrit/reviewdb/client/AccountGroupName.java
similarity index 100%
rename from gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroupName.java
rename to java/com/google/gerrit/reviewdb/client/AccountGroupName.java
diff --git a/java/com/google/gerrit/reviewdb/client/BooleanProjectConfig.java b/java/com/google/gerrit/reviewdb/client/BooleanProjectConfig.java
new file mode 100644
index 0000000..a70d254
--- /dev/null
+++ b/java/com/google/gerrit/reviewdb/client/BooleanProjectConfig.java
@@ -0,0 +1,66 @@
+// Copyright (C) 2017 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.google.gerrit.reviewdb.client;
+
+/**
+ * Contains all inheritable boolean project configs and maps internal representations to API
+ * objects.
+ *
+ * <p>Perform the following steps for adding a new inheritable boolean project config:
+ *
+ * <ol>
+ *   <li>Add a field to {@link com.google.gerrit.extensions.api.projects.ConfigInput}
+ *   <li>Add a field to {@link com.google.gerrit.extensions.api.projects.ConfigInfo}
+ *   <li>Add the config to this enum
+ *   <li>Add API mappers to {@link
+ *       com.google.gerrit.server.project.BooleanProjectConfigTransformations}
+ * </ol>
+ */
+public enum BooleanProjectConfig {
+  USE_CONTRIBUTOR_AGREEMENTS("receive", "requireContributorAgreement"),
+  USE_SIGNED_OFF_BY("receive", "requireSignedOffBy"),
+  USE_CONTENT_MERGE("submit", "mergeContent"),
+  REQUIRE_CHANGE_ID("receive", "requireChangeId"),
+  CREATE_NEW_CHANGE_FOR_ALL_NOT_IN_TARGET("receive", "createNewChangeForAllNotInTarget"),
+  ENABLE_SIGNED_PUSH("receive", "enableSignedPush"),
+  REQUIRE_SIGNED_PUSH("receive", "requireSignedPush"),
+  REJECT_IMPLICIT_MERGES("receive", "rejectImplicitMerges"),
+  PRIVATE_BY_DEFAULT("change", "privateByDefault"),
+  ENABLE_REVIEWER_BY_EMAIL("reviewer", "enableByEmail"),
+  MATCH_AUTHOR_TO_COMMITTER_DATE("submit", "matchAuthorToCommitterDate"),
+  REJECT_EMPTY_COMMIT("submit", "rejectEmptyCommit"),
+  WORK_IN_PROGRESS_BY_DEFAULT("change", "workInProgressByDefault");
+
+  // Git config
+  private final String section;
+  private final String name;
+
+  BooleanProjectConfig(String section, String name) {
+    this.section = section;
+    this.name = name;
+  }
+
+  public String getSection() {
+    return section;
+  }
+
+  public String getSubSection() {
+    return null;
+  }
+
+  public String getName() {
+    return name;
+  }
+}
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Branch.java b/java/com/google/gerrit/reviewdb/client/Branch.java
similarity index 100%
rename from gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Branch.java
rename to java/com/google/gerrit/reviewdb/client/Branch.java
diff --git a/java/com/google/gerrit/reviewdb/client/Change.java b/java/com/google/gerrit/reviewdb/client/Change.java
new file mode 100644
index 0000000..8d4de05
--- /dev/null
+++ b/java/com/google/gerrit/reviewdb/client/Change.java
@@ -0,0 +1,765 @@
+// Copyright (C) 2008 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.google.gerrit.reviewdb.client;
+
+import static com.google.gerrit.reviewdb.client.RefNames.REFS_CHANGES;
+
+import com.google.gerrit.extensions.client.ChangeStatus;
+import com.google.gwtorm.client.Column;
+import com.google.gwtorm.client.IntKey;
+import com.google.gwtorm.client.RowVersion;
+import com.google.gwtorm.client.StringKey;
+import java.sql.Timestamp;
+import java.util.Arrays;
+
+/**
+ * A change proposed to be merged into a {@link Branch}.
+ *
+ * <p>The data graph rooted below a Change can be quite complex:
+ *
+ * <pre>
+ *   {@link Change}
+ *     |
+ *     +- {@link ChangeMessage}: &quot;cover letter&quot; or general comment.
+ *     |
+ *     +- {@link PatchSet}: a single variant of this change.
+ *          |
+ *          +- {@link PatchSetApproval}: a +/- vote on the change's current state.
+ *          |
+ *          +- {@link PatchLineComment}: comment about a specific line
+ * </pre>
+ *
+ * <p>
+ *
+ * <h5>PatchSets</h5>
+ *
+ * <p>Every change has at least one PatchSet. A change starts out with one PatchSet, the initial
+ * proposal put forth by the change owner. This {@link Account} is usually also listed as the author
+ * and committer in the PatchSetInfo.
+ *
+ * <p>Each PatchSet contains zero or more Patch records, detailing the file paths impacted by the
+ * change (otherwise known as, the file paths the author added/deleted/modified). Sometimes a merge
+ * commit can contain zero patches, if the merge has no conflicts, or has no impact other than to
+ * cut off a line of development.
+ *
+ * <p>Each PatchLineComment is a draft or a published comment about a single line of the associated
+ * file. These are the inline comment entities created by users as they perform a review.
+ *
+ * <p>When additional PatchSets appear under a change, these PatchSets reference <i>replacement</i>
+ * commits; alternative commits that could be made to the project instead of the original commit
+ * referenced by the first PatchSet.
+ *
+ * <p>A change has at most one current PatchSet. The current PatchSet is updated when a new
+ * replacement PatchSet is uploaded. When a change is submitted, the current patch set is what is
+ * merged into the destination branch.
+ *
+ * <p>
+ *
+ * <h5>ChangeMessage</h5>
+ *
+ * <p>The ChangeMessage entity is a general free-form comment about the whole change, rather than
+ * PatchLineComment's file and line specific context. The ChangeMessage appears at the start of any
+ * email generated by Gerrit, and is shown on the change overview page, rather than in a
+ * file-specific context. Users often use this entity to describe general remarks about the overall
+ * concept proposed by the change.
+ *
+ * <p>
+ *
+ * <h5>PatchSetApproval</h5>
+ *
+ * <p>PatchSetApproval entities exist to fill in the <i>cells</i> of the approvals table in the web
+ * UI. That is, a single PatchSetApproval record's key is the tuple {@code
+ * (PatchSet,Account,ApprovalCategory)}. Each PatchSetApproval carries with it a small score value,
+ * typically within the range -2..+2.
+ *
+ * <p>If an Account has created only PatchSetApprovals with a score value of 0, the Change shows in
+ * their dashboard, and they are said to be CC'd (carbon copied) on the Change, but are not a direct
+ * reviewer. This often happens when an account was specified at upload time with the {@code --cc}
+ * command line flag, or have published comments, but left the approval scores at 0 ("No Score").
+ *
+ * <p>If an Account has one or more PatchSetApprovals with a score != 0, the Change shows in their
+ * dashboard, and they are said to be an active reviewer. Such individuals are highlighted when
+ * notice of a replacement patch set is sent, or when notice of the change submission occurs.
+ */
+public final class Change {
+  public static class Id extends IntKey<com.google.gwtorm.client.Key<?>> {
+    private static final long serialVersionUID = 1L;
+
+    @Column(id = 1)
+    public int id;
+
+    protected Id() {}
+
+    public Id(int id) {
+      this.id = id;
+    }
+
+    @Override
+    public int get() {
+      return id;
+    }
+
+    @Override
+    protected void set(int newValue) {
+      id = newValue;
+    }
+
+    public String toRefPrefix() {
+      return refPrefixBuilder().toString();
+    }
+
+    StringBuilder refPrefixBuilder() {
+      StringBuilder r = new StringBuilder(32).append(REFS_CHANGES);
+      int m = id % 100;
+      if (m < 10) {
+        r.append('0');
+      }
+      return r.append(m).append('/').append(id).append('/');
+    }
+
+    /** Parse a Change.Id out of a string representation. */
+    public static Id parse(String str) {
+      final Id r = new Id();
+      r.fromString(str);
+      return r;
+    }
+
+    public static Id fromRef(String ref) {
+      if (RefNames.isRefsEdit(ref)) {
+        return fromEditRefPart(ref);
+      }
+      int cs = startIndex(ref);
+      if (cs < 0) {
+        return null;
+      }
+      int ce = nextNonDigit(ref, cs);
+      if (ref.substring(ce).equals(RefNames.META_SUFFIX)
+          || ref.substring(ce).equals(RefNames.ROBOT_COMMENTS_SUFFIX)
+          || PatchSet.Id.fromRef(ref, ce) >= 0) {
+        return new Change.Id(Integer.parseInt(ref.substring(cs, ce)));
+      }
+      return null;
+    }
+
+    public static Id fromAllUsersRef(String ref) {
+      if (ref == null) {
+        return null;
+      }
+      String prefix;
+      if (ref.startsWith(RefNames.REFS_STARRED_CHANGES)) {
+        prefix = RefNames.REFS_STARRED_CHANGES;
+      } else if (ref.startsWith(RefNames.REFS_DRAFT_COMMENTS)) {
+        prefix = RefNames.REFS_DRAFT_COMMENTS;
+      } else {
+        return null;
+      }
+      int cs = startIndex(ref, prefix);
+      if (cs < 0) {
+        return null;
+      }
+      int ce = nextNonDigit(ref, cs);
+      if (ce < ref.length() && ref.charAt(ce) == '/' && isNumeric(ref, ce + 1)) {
+        return new Change.Id(Integer.parseInt(ref.substring(cs, ce)));
+      }
+      return null;
+    }
+
+    private static boolean isNumeric(String s, int off) {
+      if (off >= s.length()) {
+        return false;
+      }
+      for (int i = off; i < s.length(); i++) {
+        if (!Character.isDigit(s.charAt(i))) {
+          return false;
+        }
+      }
+      return true;
+    }
+
+    public static Id fromEditRefPart(String ref) {
+      int startChangeId = ref.indexOf(RefNames.EDIT_PREFIX) + RefNames.EDIT_PREFIX.length();
+      int endChangeId = nextNonDigit(ref, startChangeId);
+      String id = ref.substring(startChangeId, endChangeId);
+      if (id != null && !id.isEmpty()) {
+        return new Change.Id(Integer.parseInt(id));
+      }
+      return null;
+    }
+
+    public static Id fromRefPart(String ref) {
+      Integer id = RefNames.parseShardedRefPart(ref);
+      return id != null ? new Change.Id(id) : null;
+    }
+
+    static int startIndex(String ref) {
+      return startIndex(ref, REFS_CHANGES);
+    }
+
+    static int startIndex(String ref, String expectedPrefix) {
+      if (ref == null || !ref.startsWith(expectedPrefix)) {
+        return -1;
+      }
+
+      // Last 2 digits.
+      int ls = expectedPrefix.length();
+      int le = nextNonDigit(ref, ls);
+      if (le - ls != 2 || le >= ref.length() || ref.charAt(le) != '/') {
+        return -1;
+      }
+
+      // Change ID.
+      int cs = le + 1;
+      if (cs >= ref.length() || ref.charAt(cs) == '0') {
+        return -1;
+      }
+      int ce = nextNonDigit(ref, cs);
+      if (ce >= ref.length() || ref.charAt(ce) != '/') {
+        return -1;
+      }
+      switch (ce - cs) {
+        case 0:
+          return -1;
+        case 1:
+          if (ref.charAt(ls) != '0' || ref.charAt(ls + 1) != ref.charAt(cs)) {
+            return -1;
+          }
+          break;
+        default:
+          if (ref.charAt(ls) != ref.charAt(ce - 2) || ref.charAt(ls + 1) != ref.charAt(ce - 1)) {
+            return -1;
+          }
+          break;
+      }
+      return cs;
+    }
+
+    static int nextNonDigit(String s, int i) {
+      while (i < s.length() && s.charAt(i) >= '0' && s.charAt(i) <= '9') {
+        i++;
+      }
+      return i;
+    }
+  }
+
+  /**
+   * Globally unique identification of this change. This generally takes the form of a string
+   * "Ixxxxxx...", and is stored in the Change-Id footer of a commit.
+   */
+  public static class Key extends StringKey<com.google.gwtorm.client.Key<?>> {
+    private static final long serialVersionUID = 1L;
+
+    @Column(id = 1, length = 60)
+    protected String id;
+
+    protected Key() {}
+
+    public Key(String id) {
+      this.id = id;
+    }
+
+    @Override
+    public String get() {
+      return id;
+    }
+
+    @Override
+    protected void set(String newValue) {
+      id = newValue;
+    }
+
+    /** Construct a key that is after all keys prefixed by this key. */
+    public Key max() {
+      final StringBuilder revEnd = new StringBuilder(get().length() + 1);
+      revEnd.append(get());
+      revEnd.append('\u9fa5');
+      return new Key(revEnd.toString());
+    }
+
+    /** Obtain a shorter version of this key string, using a leading prefix. */
+    public String abbreviate() {
+      final String s = get();
+      return s.substring(0, Math.min(s.length(), 9));
+    }
+
+    /** Parse a Change.Key out of a string representation. */
+    public static Key parse(String str) {
+      final Key r = new Key();
+      r.fromString(str);
+      return r;
+    }
+  }
+
+  /** Minimum database status constant for an open change. */
+  private static final char MIN_OPEN = 'a';
+  /** Database constant for {@link Status#NEW}. */
+  public static final char STATUS_NEW = 'n';
+  /** Maximum database status constant for an open change. */
+  private static final char MAX_OPEN = 'z';
+
+  /** Database constant for {@link Status#MERGED}. */
+  public static final char STATUS_MERGED = 'M';
+
+  /** ID number of the first patch set in a change. */
+  public static final int INITIAL_PATCH_SET_ID = 1;
+
+  /** Change-Id pattern. */
+  public static final String CHANGE_ID_PATTERN = "^[iI][0-9a-f]{4,}.*$";
+
+  /**
+   * Current state within the basic workflow of the change.
+   *
+   * <p>Within the database, lower case codes ('a'..'z') indicate a change that is still open, and
+   * that can be modified/refined further, while upper case codes ('A'..'Z') indicate a change that
+   * is closed and cannot be further modified.
+   */
+  public enum Status {
+    /**
+     * Change is open and pending review, or review is in progress.
+     *
+     * <p>This is the default state assigned to a change when it is first created in the database. A
+     * change stays in the NEW state throughout its review cycle, until the change is submitted or
+     * abandoned.
+     *
+     * <p>Changes in the NEW state can be moved to:
+     *
+     * <ul>
+     *   <li>{@link #MERGED} - when the Submit Patch Set action is used;
+     *   <li>{@link #ABANDONED} - when the Abandon action is used.
+     * </ul>
+     */
+    NEW(STATUS_NEW, ChangeStatus.NEW),
+
+    /**
+     * Change is closed, and submitted to its destination branch.
+     *
+     * <p>Once a change has been merged, it cannot be further modified by adding a replacement patch
+     */
+    MERGED(STATUS_MERGED, ChangeStatus.MERGED),
+
+    /**
+     * Change is closed, but was not submitted to its destination branch.
+     *
+     * <p>Once a change has been abandoned, it cannot be further modified by adding a replacement
+     * patch set, and it cannot be merged. Draft comments however may be published, permitting
+     * reviewers to send constructive feedback.
+     */
+    ABANDONED('A', ChangeStatus.ABANDONED);
+
+    static {
+      boolean ok = true;
+      if (Status.values().length != ChangeStatus.values().length) {
+        ok = false;
+      }
+      for (Status s : Status.values()) {
+        ok &= s.name().equals(s.changeStatus.name());
+      }
+      if (!ok) {
+        throw new IllegalStateException(
+            "Mismatched status mapping: "
+                + Arrays.asList(Status.values())
+                + " != "
+                + Arrays.asList(ChangeStatus.values()));
+      }
+    }
+
+    private final char code;
+    private final boolean closed;
+    private final ChangeStatus changeStatus;
+
+    Status(char c, ChangeStatus cs) {
+      code = c;
+      closed = !(MIN_OPEN <= c && c <= MAX_OPEN);
+      changeStatus = cs;
+    }
+
+    public char getCode() {
+      return code;
+    }
+
+    public boolean isOpen() {
+      return !closed;
+    }
+
+    public boolean isClosed() {
+      return closed;
+    }
+
+    public ChangeStatus asChangeStatus() {
+      return changeStatus;
+    }
+
+    public static Status forCode(char c) {
+      for (Status s : Status.values()) {
+        if (s.code == c) {
+          return s;
+        }
+      }
+
+      // TODO(davido): Remove in 3.0, after all sites upgraded to version,
+      // where DRAFT status was removed. This code path is still needed,
+      // when changes are deserialized from the secondary index, during
+      // the online migration to the new schema version wasn't completed.
+      if (c == 'd') {
+        return Status.NEW;
+      }
+      return null;
+    }
+
+    public static Status forChangeStatus(ChangeStatus cs) {
+      for (Status s : Status.values()) {
+        if (s.changeStatus == cs) {
+          return s;
+        }
+      }
+      return null;
+    }
+  }
+
+  /** Locally assigned unique identifier of the change */
+  @Column(id = 1)
+  protected Id changeId;
+
+  /** Globally assigned unique identifier of the change */
+  @Column(id = 2)
+  protected Key changeKey;
+
+  /** optimistic locking */
+  @Column(id = 3)
+  @RowVersion
+  protected int rowVersion;
+
+  /** When this change was first introduced into the database. */
+  @Column(id = 4)
+  protected Timestamp createdOn;
+
+  /**
+   * When was a meaningful modification last made to this record's data
+   *
+   * <p>Note, this update timestamp includes its children.
+   */
+  @Column(id = 5)
+  protected Timestamp lastUpdatedOn;
+
+  // DELETED: id = 6 (sortkey)
+
+  @Column(id = 7, name = "owner_account_id")
+  protected Account.Id owner;
+
+  /** The branch (and project) this change merges into. */
+  @Column(id = 8)
+  protected Branch.NameKey dest;
+
+  // DELETED: id = 9 (open)
+
+  /** Current state code; see {@link Status}. */
+  @Column(id = 10)
+  protected char status;
+
+  // DELETED: id = 11 (nbrPatchSets)
+
+  /** The current patch set. */
+  @Column(id = 12)
+  protected int currentPatchSetId;
+
+  /** Subject from the current patch set. */
+  @Column(id = 13)
+  protected String subject;
+
+  /** Topic name assigned by the user, if any. */
+  @Column(id = 14, notNull = false)
+  protected String topic;
+
+  // DELETED: id = 15 (lastSha1MergeTested)
+  // DELETED: id = 16 (mergeable)
+
+  /**
+   * First line of first patch set's commit message.
+   *
+   * <p>Unlike {@link #subject}, this string does not change if future patch sets change the first
+   * line.
+   */
+  @Column(id = 17, notNull = false)
+  protected String originalSubject;
+
+  /**
+   * Unique id for the changes submitted together assigned during merging. Only set if the status is
+   * MERGED.
+   */
+  @Column(id = 18, notNull = false)
+  protected String submissionId;
+
+  /** Allows assigning a change to a user. */
+  @Column(id = 19, notNull = false)
+  protected Account.Id assignee;
+
+  /** Whether the change is private. */
+  @Column(id = 20)
+  protected boolean isPrivate;
+
+  /** Whether the change is work in progress. */
+  @Column(id = 21)
+  protected boolean workInProgress;
+
+  /** Whether the change has started review. */
+  @Column(id = 22)
+  protected boolean reviewStarted;
+
+  /** References a change that this change reverts. */
+  @Column(id = 23, notNull = false)
+  protected Id revertOf;
+
+  /** @see com.google.gerrit.server.notedb.NoteDbChangeState */
+  @Column(id = 101, notNull = false, length = Integer.MAX_VALUE)
+  protected String noteDbState;
+
+  protected Change() {}
+
+  public Change(
+      Change.Key newKey,
+      Change.Id newId,
+      Account.Id ownedBy,
+      Branch.NameKey forBranch,
+      Timestamp ts) {
+    changeKey = newKey;
+    changeId = newId;
+    createdOn = ts;
+    lastUpdatedOn = createdOn;
+    owner = ownedBy;
+    dest = forBranch;
+    setStatus(Status.NEW);
+  }
+
+  public Change(Change other) {
+    assignee = other.assignee;
+    changeId = other.changeId;
+    changeKey = other.changeKey;
+    rowVersion = other.rowVersion;
+    createdOn = other.createdOn;
+    lastUpdatedOn = other.lastUpdatedOn;
+    owner = other.owner;
+    dest = other.dest;
+    status = other.status;
+    currentPatchSetId = other.currentPatchSetId;
+    subject = other.subject;
+    originalSubject = other.originalSubject;
+    submissionId = other.submissionId;
+    topic = other.topic;
+    isPrivate = other.isPrivate;
+    workInProgress = other.workInProgress;
+    reviewStarted = other.reviewStarted;
+    noteDbState = other.noteDbState;
+    revertOf = other.revertOf;
+  }
+
+  /** Legacy 32 bit integer identity for a change. */
+  public Change.Id getId() {
+    return changeId;
+  }
+
+  /** Legacy 32 bit integer identity for a change. */
+  public int getChangeId() {
+    return changeId.get();
+  }
+
+  /** The Change-Id tag out of the initial commit, or a natural key. */
+  public Change.Key getKey() {
+    return changeKey;
+  }
+
+  public void setKey(Change.Key k) {
+    changeKey = k;
+  }
+
+  public Account.Id getAssignee() {
+    return assignee;
+  }
+
+  public void setAssignee(Account.Id a) {
+    assignee = a;
+  }
+
+  public Timestamp getCreatedOn() {
+    return createdOn;
+  }
+
+  public void setCreatedOn(Timestamp ts) {
+    createdOn = ts;
+  }
+
+  public Timestamp getLastUpdatedOn() {
+    return lastUpdatedOn;
+  }
+
+  public void setLastUpdatedOn(Timestamp now) {
+    lastUpdatedOn = now;
+  }
+
+  public int getRowVersion() {
+    return rowVersion;
+  }
+
+  public Account.Id getOwner() {
+    return owner;
+  }
+
+  public void setOwner(Account.Id owner) {
+    this.owner = owner;
+  }
+
+  public Branch.NameKey getDest() {
+    return dest;
+  }
+
+  public void setDest(Branch.NameKey dest) {
+    this.dest = dest;
+  }
+
+  public Project.NameKey getProject() {
+    return dest.getParentKey();
+  }
+
+  public String getSubject() {
+    return subject;
+  }
+
+  public String getOriginalSubject() {
+    return originalSubject != null ? originalSubject : subject;
+  }
+
+  public String getOriginalSubjectOrNull() {
+    return originalSubject;
+  }
+
+  /** Get the id of the most current {@link PatchSet} in this change. */
+  public PatchSet.Id currentPatchSetId() {
+    if (currentPatchSetId > 0) {
+      return new PatchSet.Id(changeId, currentPatchSetId);
+    }
+    return null;
+  }
+
+  public void setCurrentPatchSet(PatchSetInfo ps) {
+    if (originalSubject == null && subject != null) {
+      // Change was created before schema upgrade. Use the last subject
+      // associated with this change, as the most recent discussion will
+      // be under that thread in an email client such as GMail.
+      originalSubject = subject;
+    }
+
+    currentPatchSetId = ps.getKey().get();
+    subject = ps.getSubject();
+
+    if (originalSubject == null) {
+      // Newly created changes remember the first commit's subject.
+      originalSubject = subject;
+    }
+  }
+
+  public void setCurrentPatchSet(PatchSet.Id psId, String subject, String originalSubject) {
+    if (!psId.getParentKey().equals(changeId)) {
+      throw new IllegalArgumentException("patch set ID " + psId + " is not for change " + changeId);
+    }
+    currentPatchSetId = psId.get();
+    this.subject = subject;
+    this.originalSubject = originalSubject;
+  }
+
+  public void clearCurrentPatchSet() {
+    currentPatchSetId = 0;
+    subject = null;
+    originalSubject = null;
+  }
+
+  public String getSubmissionId() {
+    return submissionId;
+  }
+
+  public void setSubmissionId(String id) {
+    this.submissionId = id;
+  }
+
+  public Status getStatus() {
+    return Status.forCode(status);
+  }
+
+  public void setStatus(Status newStatus) {
+    status = newStatus.getCode();
+  }
+
+  public String getTopic() {
+    return topic;
+  }
+
+  public void setTopic(String topic) {
+    this.topic = topic;
+  }
+
+  public boolean isPrivate() {
+    return isPrivate;
+  }
+
+  public void setPrivate(boolean isPrivate) {
+    this.isPrivate = isPrivate;
+  }
+
+  public boolean isWorkInProgress() {
+    return workInProgress;
+  }
+
+  public void setWorkInProgress(boolean workInProgress) {
+    this.workInProgress = workInProgress;
+  }
+
+  public boolean hasReviewStarted() {
+    return reviewStarted;
+  }
+
+  public void setReviewStarted(boolean reviewStarted) {
+    this.reviewStarted = reviewStarted;
+  }
+
+  public void setRevertOf(Id revertOf) {
+    this.revertOf = revertOf;
+  }
+
+  public Id getRevertOf() {
+    return this.revertOf;
+  }
+
+  public String getNoteDbState() {
+    return noteDbState;
+  }
+
+  public void setNoteDbState(String state) {
+    noteDbState = state;
+  }
+
+  @Override
+  public String toString() {
+    return new StringBuilder(getClass().getSimpleName())
+        .append('{')
+        .append(changeId)
+        .append(" (")
+        .append(changeKey)
+        .append("), ")
+        .append("dest=")
+        .append(dest)
+        .append(", ")
+        .append("status=")
+        .append(status)
+        .append('}')
+        .toString();
+  }
+}
diff --git a/java/com/google/gerrit/reviewdb/client/ChangeMessage.java b/java/com/google/gerrit/reviewdb/client/ChangeMessage.java
new file mode 100644
index 0000000..8e397f0
--- /dev/null
+++ b/java/com/google/gerrit/reviewdb/client/ChangeMessage.java
@@ -0,0 +1,190 @@
+// Copyright (C) 2008 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.google.gerrit.reviewdb.client;
+
+import com.google.gwtorm.client.Column;
+import com.google.gwtorm.client.StringKey;
+import java.sql.Timestamp;
+import java.util.Objects;
+
+/** A message attached to a {@link Change}. */
+public final class ChangeMessage {
+  public static class Key extends StringKey<Change.Id> {
+    private static final long serialVersionUID = 1L;
+
+    @Column(id = 1)
+    protected Change.Id changeId;
+
+    @Column(id = 2, length = 40)
+    protected String uuid;
+
+    protected Key() {
+      changeId = new Change.Id();
+    }
+
+    public Key(Change.Id change, String uuid) {
+      this.changeId = change;
+      this.uuid = uuid;
+    }
+
+    @Override
+    public Change.Id getParentKey() {
+      return changeId;
+    }
+
+    @Override
+    public String get() {
+      return uuid;
+    }
+
+    @Override
+    public void set(String newValue) {
+      uuid = newValue;
+    }
+  }
+
+  @Column(id = 1, name = Column.NONE)
+  protected Key key;
+
+  /** Who wrote this comment; null if it was written by the Gerrit system. */
+  @Column(id = 2, name = "author_id", notNull = false)
+  protected Account.Id author;
+
+  /** When this comment was drafted. */
+  @Column(id = 3)
+  protected Timestamp writtenOn;
+
+  /** The text left by the user. */
+  @Column(id = 4, notNull = false, length = Integer.MAX_VALUE)
+  protected String message;
+
+  /** Which patchset (if any) was this message generated from? */
+  @Column(id = 5, notNull = false)
+  protected PatchSet.Id patchset;
+
+  /** Tag associated with change message */
+  @Column(id = 6, notNull = false)
+  protected String tag;
+
+  /** Real user that added this message on behalf of the user recorded in {@link #author}. */
+  @Column(id = 7, notNull = false)
+  protected Account.Id realAuthor;
+
+  protected ChangeMessage() {}
+
+  public ChangeMessage(final ChangeMessage.Key k, Account.Id a, Timestamp wo, PatchSet.Id psid) {
+    key = k;
+    author = a;
+    writtenOn = wo;
+    patchset = psid;
+  }
+
+  public ChangeMessage.Key getKey() {
+    return key;
+  }
+
+  /** If null, the message was written 'by the Gerrit system'. */
+  public Account.Id getAuthor() {
+    return author;
+  }
+
+  public void setAuthor(Account.Id accountId) {
+    if (author != null) {
+      throw new IllegalStateException("Cannot modify author once assigned");
+    }
+    author = accountId;
+  }
+
+  public Account.Id getRealAuthor() {
+    return realAuthor != null ? realAuthor : getAuthor();
+  }
+
+  public void setRealAuthor(Account.Id id) {
+    // Use null for same real author, as before the column was added.
+    realAuthor = Objects.equals(getAuthor(), id) ? null : id;
+  }
+
+  public Timestamp getWrittenOn() {
+    return writtenOn;
+  }
+
+  public void setWrittenOn(Timestamp ts) {
+    writtenOn = ts;
+  }
+
+  public String getMessage() {
+    return message;
+  }
+
+  public void setMessage(String s) {
+    message = s;
+  }
+
+  public String getTag() {
+    return tag;
+  }
+
+  public void setTag(String tag) {
+    this.tag = tag;
+  }
+
+  public PatchSet.Id getPatchSetId() {
+    return patchset;
+  }
+
+  public void setPatchSetId(PatchSet.Id id) {
+    patchset = id;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (!(o instanceof ChangeMessage)) {
+      return false;
+    }
+    ChangeMessage m = (ChangeMessage) o;
+    return Objects.equals(key, m.key)
+        && Objects.equals(author, m.author)
+        && Objects.equals(writtenOn, m.writtenOn)
+        && Objects.equals(message, m.message)
+        && Objects.equals(patchset, m.patchset)
+        && Objects.equals(tag, m.tag)
+        && Objects.equals(realAuthor, m.realAuthor);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(key, author, writtenOn, message, patchset, tag, realAuthor);
+  }
+
+  @Override
+  public String toString() {
+    return "ChangeMessage{"
+        + "key="
+        + key
+        + ", author="
+        + author
+        + ", realAuthor="
+        + realAuthor
+        + ", writtenOn="
+        + writtenOn
+        + ", patchset="
+        + patchset
+        + ", tag="
+        + tag
+        + ", message=["
+        + message
+        + "]}";
+  }
+}
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/CodedEnum.java b/java/com/google/gerrit/reviewdb/client/CodedEnum.java
similarity index 100%
rename from gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/CodedEnum.java
rename to java/com/google/gerrit/reviewdb/client/CodedEnum.java
diff --git a/java/com/google/gerrit/reviewdb/client/Comment.java b/java/com/google/gerrit/reviewdb/client/Comment.java
new file mode 100644
index 0000000..207643e
--- /dev/null
+++ b/java/com/google/gerrit/reviewdb/client/Comment.java
@@ -0,0 +1,339 @@
+// 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.
+
+package com.google.gerrit.reviewdb.client;
+
+import java.sql.Timestamp;
+import java.util.Comparator;
+import java.util.Objects;
+
+/**
+ * This class represents inline comments in NoteDb. This means it determines the JSON format for
+ * inline comments in the revision notes that NoteDb uses to persist inline comments.
+ *
+ * <p>Changing fields in this class changes the storage format of inline comments in NoteDb and may
+ * require a corresponding data migration (adding new optional fields is generally okay).
+ *
+ * <p>{@link PatchLineComment} also represents inline comments, but in ReviewDb. There are a few
+ * notable differences:
+ *
+ * <ul>
+ *   <li>PatchLineComment knows the comment status (published or draft). For comments in NoteDb the
+ *       status is determined by the branch in which they are stored (published comments are stored
+ *       in the change meta ref; draft comments are store in refs/draft-comments branches in
+ *       All-Users). Hence Comment doesn't need to contain the status, but the status is implicitly
+ *       known by where the comments are read from.
+ *   <li>PatchLineComment knows the change ID. For comments in NoteDb, the change ID is determined
+ *       by the branch in which they are stored (the ref name contains the change ID). Hence Comment
+ *       doesn't need to contain the change ID, but the change ID is implicitly known by where the
+ *       comments are read from.
+ * </ul>
+ *
+ * <p>For all utility classes and middle layer functionality using Comment over PatchLineComment is
+ * preferred, as PatchLineComment will go away together with ReviewDb. This means Comment should be
+ * used everywhere and only for storing inline comment in ReviewDb a conversion to PatchLineComment
+ * is done. Converting Comments to PatchLineComments and vice verse is done by
+ * CommentsUtil#toPatchLineComments(Change.Id, PatchLineComment.Status, Iterable) and
+ * CommentsUtil#toComments(String, Iterable).
+ */
+public class Comment {
+  public static class Key {
+    public String uuid;
+    public String filename;
+    public int patchSetId;
+
+    public Key(Key k) {
+      this(k.uuid, k.filename, k.patchSetId);
+    }
+
+    public Key(String uuid, String filename, int patchSetId) {
+      this.uuid = uuid;
+      this.filename = filename;
+      this.patchSetId = patchSetId;
+    }
+
+    @Override
+    public String toString() {
+      return new StringBuilder()
+          .append("Comment.Key{")
+          .append("uuid=")
+          .append(uuid)
+          .append(',')
+          .append("filename=")
+          .append(filename)
+          .append(',')
+          .append("patchSetId=")
+          .append(patchSetId)
+          .append('}')
+          .toString();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+      if (o instanceof Key) {
+        Key k = (Key) o;
+        return Objects.equals(uuid, k.uuid)
+            && Objects.equals(filename, k.filename)
+            && Objects.equals(patchSetId, k.patchSetId);
+      }
+      return false;
+    }
+
+    @Override
+    public int hashCode() {
+      return Objects.hash(uuid, filename, patchSetId);
+    }
+  }
+
+  public static class Identity {
+    int id;
+
+    public Identity(Account.Id id) {
+      this.id = id.get();
+    }
+
+    public Account.Id getId() {
+      return new Account.Id(id);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+      if (o instanceof Identity) {
+        return Objects.equals(id, ((Identity) o).id);
+      }
+      return false;
+    }
+
+    @Override
+    public int hashCode() {
+      return Objects.hash(id);
+    }
+
+    @Override
+    public String toString() {
+      return new StringBuilder()
+          .append("Comment.Identity{")
+          .append("id=")
+          .append(id)
+          .append('}')
+          .toString();
+    }
+  }
+
+  public static class Range implements Comparable<Range> {
+    private static final Comparator<Range> RANGE_COMPARATOR =
+        Comparator.<Range>comparingInt(range -> range.startLine)
+            .thenComparingInt(range -> range.startChar)
+            .thenComparingInt(range -> range.endLine)
+            .thenComparingInt(range -> range.endChar);
+
+    public int startLine; // 1-based, inclusive
+    public int startChar; // 0-based, inclusive
+    public int endLine; // 1-based, exclusive
+    public int endChar; // 0-based, exclusive
+
+    public Range(Range r) {
+      this(r.startLine, r.startChar, r.endLine, r.endChar);
+    }
+
+    public Range(com.google.gerrit.extensions.client.Comment.Range r) {
+      this(r.startLine, r.startCharacter, r.endLine, r.endCharacter);
+    }
+
+    public Range(int startLine, int startChar, int endLine, int endChar) {
+      this.startLine = startLine;
+      this.startChar = startChar;
+      this.endLine = endLine;
+      this.endChar = endChar;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+      if (o instanceof Range) {
+        Range r = (Range) o;
+        return Objects.equals(startLine, r.startLine)
+            && Objects.equals(startChar, r.startChar)
+            && Objects.equals(endLine, r.endLine)
+            && Objects.equals(endChar, r.endChar);
+      }
+      return false;
+    }
+
+    @Override
+    public int hashCode() {
+      return Objects.hash(startLine, startChar, endLine, endChar);
+    }
+
+    @Override
+    public String toString() {
+      return new StringBuilder()
+          .append("Comment.Range{")
+          .append("startLine=")
+          .append(startLine)
+          .append(',')
+          .append("startChar=")
+          .append(startChar)
+          .append(',')
+          .append("endLine=")
+          .append(endLine)
+          .append(',')
+          .append("endChar=")
+          .append(endChar)
+          .append('}')
+          .toString();
+    }
+
+    @Override
+    public int compareTo(Range otherRange) {
+      return RANGE_COMPARATOR.compare(this, otherRange);
+    }
+  }
+
+  public Key key;
+  public int lineNbr;
+  public Identity author;
+  protected Identity realAuthor;
+  public Timestamp writtenOn;
+  public short side;
+  public String message;
+  public String parentUuid;
+  public Range range;
+  public String tag;
+
+  // Hex commit SHA1 of the commit of the patchset to which this comment applies.
+  public String revId;
+  public String serverId;
+  public boolean unresolved;
+
+  /**
+   * Whether the comment was parsed from a JSON representation (false) or the legacy custom notes
+   * format (true).
+   */
+  public transient boolean legacyFormat;
+
+  public Comment(Comment c) {
+    this(
+        new Key(c.key),
+        c.author.getId(),
+        new Timestamp(c.writtenOn.getTime()),
+        c.side,
+        c.message,
+        c.serverId,
+        c.unresolved);
+    this.lineNbr = c.lineNbr;
+    this.realAuthor = c.realAuthor;
+    this.range = c.range != null ? new Range(c.range) : null;
+    this.tag = c.tag;
+    this.revId = c.revId;
+    this.unresolved = c.unresolved;
+  }
+
+  public Comment(
+      Key key,
+      Account.Id author,
+      Timestamp writtenOn,
+      short side,
+      String message,
+      String serverId,
+      boolean unresolved) {
+    this.key = key;
+    this.author = new Comment.Identity(author);
+    this.realAuthor = this.author;
+    this.writtenOn = writtenOn;
+    this.side = side;
+    this.message = message;
+    this.serverId = serverId;
+    this.unresolved = unresolved;
+  }
+
+  public void setLineNbrAndRange(
+      Integer lineNbr, com.google.gerrit.extensions.client.Comment.Range range) {
+    this.lineNbr = lineNbr != null ? lineNbr : range != null ? range.endLine : 0;
+    if (range != null) {
+      this.range = new Comment.Range(range);
+    }
+  }
+
+  public void setRange(CommentRange range) {
+    this.range = range != null ? range.asCommentRange() : null;
+  }
+
+  public void setRevId(RevId revId) {
+    this.revId = revId != null ? revId.get() : null;
+  }
+
+  public void setRealAuthor(Account.Id id) {
+    realAuthor = id != null && id.get() != author.id ? new Comment.Identity(id) : null;
+  }
+
+  public Identity getRealAuthor() {
+    return realAuthor != null ? realAuthor : author;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (o instanceof Comment) {
+      return Objects.equals(key, ((Comment) o).key);
+    }
+    return false;
+  }
+
+  @Override
+  public int hashCode() {
+    return key.hashCode();
+  }
+
+  @Override
+  public String toString() {
+    return new StringBuilder()
+        .append("Comment{")
+        .append("key=")
+        .append(key)
+        .append(',')
+        .append("lineNbr=")
+        .append(lineNbr)
+        .append(',')
+        .append("author=")
+        .append(author.getId().get())
+        .append(',')
+        .append("realAuthor=")
+        .append(realAuthor != null ? realAuthor.getId().get() : "")
+        .append(',')
+        .append("writtenOn=")
+        .append(writtenOn.toString())
+        .append(',')
+        .append("side=")
+        .append(side)
+        .append(',')
+        .append("message=")
+        .append(Objects.toString(message, ""))
+        .append(',')
+        .append("parentUuid=")
+        .append(Objects.toString(parentUuid, ""))
+        .append(',')
+        .append("range=")
+        .append(Objects.toString(range, ""))
+        .append(',')
+        .append("revId=")
+        .append(revId != null ? revId : "")
+        .append(',')
+        .append("tag=")
+        .append(Objects.toString(tag, ""))
+        .append(',')
+        .append("unresolved=")
+        .append(unresolved)
+        .append('}')
+        .toString();
+  }
+}
diff --git a/java/com/google/gerrit/reviewdb/client/CommentRange.java b/java/com/google/gerrit/reviewdb/client/CommentRange.java
new file mode 100644
index 0000000..3c69538
--- /dev/null
+++ b/java/com/google/gerrit/reviewdb/client/CommentRange.java
@@ -0,0 +1,112 @@
+// Copyright (C) 2013 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.google.gerrit.reviewdb.client;
+
+import com.google.gwtorm.client.Column;
+
+public class CommentRange {
+
+  @Column(id = 1)
+  protected int startLine;
+
+  @Column(id = 2)
+  protected int startCharacter;
+
+  @Column(id = 3)
+  protected int endLine;
+
+  @Column(id = 4)
+  protected int endCharacter;
+
+  protected CommentRange() {}
+
+  public CommentRange(int sl, int sc, int el, int ec) {
+    // Start position is inclusive; end position is exclusive.
+    startLine = sl; // 1-based
+    startCharacter = sc; // 0-based
+    endLine = el; // 1-based
+    endCharacter = ec; // 0-based
+  }
+
+  public int getStartLine() {
+    return startLine;
+  }
+
+  public int getStartCharacter() {
+    return startCharacter;
+  }
+
+  public int getEndLine() {
+    return endLine;
+  }
+
+  public int getEndCharacter() {
+    return endCharacter;
+  }
+
+  public void setStartLine(int sl) {
+    startLine = sl;
+  }
+
+  public void setStartCharacter(int sc) {
+    startCharacter = sc;
+  }
+
+  public void setEndLine(int el) {
+    endLine = el;
+  }
+
+  public void setEndCharacter(int ec) {
+    endCharacter = ec;
+  }
+
+  public Comment.Range asCommentRange() {
+    return new Comment.Range(startLine, startCharacter, endLine, endCharacter);
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (obj instanceof CommentRange) {
+      CommentRange other = (CommentRange) obj;
+      return startLine == other.startLine
+          && startCharacter == other.startCharacter
+          && endLine == other.endLine
+          && endCharacter == other.endCharacter;
+    }
+    return false;
+  }
+
+  @Override
+  public int hashCode() {
+    int h = startLine;
+    h = h * 31 + startCharacter;
+    h = h * 31 + endLine;
+    h = h * 31 + endCharacter;
+    return h;
+  }
+
+  @Override
+  public String toString() {
+    return "Range[startLine="
+        + startLine
+        + ", startCharacter="
+        + startCharacter
+        + ", endLine="
+        + endLine
+        + ", endCharacter="
+        + endCharacter
+        + "]";
+  }
+}
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/CoreDownloadSchemes.java b/java/com/google/gerrit/reviewdb/client/CoreDownloadSchemes.java
similarity index 100%
rename from gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/CoreDownloadSchemes.java
rename to java/com/google/gerrit/reviewdb/client/CoreDownloadSchemes.java
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/CurrentSchemaVersion.java b/java/com/google/gerrit/reviewdb/client/CurrentSchemaVersion.java
similarity index 100%
rename from gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/CurrentSchemaVersion.java
rename to java/com/google/gerrit/reviewdb/client/CurrentSchemaVersion.java
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/FixReplacement.java b/java/com/google/gerrit/reviewdb/client/FixReplacement.java
similarity index 100%
rename from gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/FixReplacement.java
rename to java/com/google/gerrit/reviewdb/client/FixReplacement.java
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/FixSuggestion.java b/java/com/google/gerrit/reviewdb/client/FixSuggestion.java
similarity index 100%
rename from gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/FixSuggestion.java
rename to java/com/google/gerrit/reviewdb/client/FixSuggestion.java
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/LabelId.java b/java/com/google/gerrit/reviewdb/client/LabelId.java
similarity index 100%
rename from gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/LabelId.java
rename to java/com/google/gerrit/reviewdb/client/LabelId.java
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Patch.java b/java/com/google/gerrit/reviewdb/client/Patch.java
similarity index 100%
rename from gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Patch.java
rename to java/com/google/gerrit/reviewdb/client/Patch.java
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/PatchLineComment.java b/java/com/google/gerrit/reviewdb/client/PatchLineComment.java
similarity index 100%
rename from gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/PatchLineComment.java
rename to java/com/google/gerrit/reviewdb/client/PatchLineComment.java
diff --git a/java/com/google/gerrit/reviewdb/client/PatchSet.java b/java/com/google/gerrit/reviewdb/client/PatchSet.java
new file mode 100644
index 0000000..849fd75
--- /dev/null
+++ b/java/com/google/gerrit/reviewdb/client/PatchSet.java
@@ -0,0 +1,307 @@
+// Copyright (C) 2008 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.google.gerrit.reviewdb.client;
+
+import com.google.gwtorm.client.Column;
+import com.google.gwtorm.client.IntKey;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+
+/** A single revision of a {@link Change}. */
+public final class PatchSet {
+  /** Is the reference name a change reference? */
+  public static boolean isChangeRef(String name) {
+    return Id.fromRef(name) != null;
+  }
+
+  /**
+   * Is the reference name a change reference?
+   *
+   * @deprecated use isChangeRef instead.
+   */
+  @Deprecated
+  public static boolean isRef(String name) {
+    return isChangeRef(name);
+  }
+
+  static String joinGroups(List<String> groups) {
+    if (groups == null) {
+      throw new IllegalArgumentException("groups may not be null");
+    }
+    StringBuilder sb = new StringBuilder();
+    boolean first = true;
+    for (String g : groups) {
+      if (!first) {
+        sb.append(',');
+      } else {
+        first = false;
+      }
+      sb.append(g);
+    }
+    return sb.toString();
+  }
+
+  public static List<String> splitGroups(String joinedGroups) {
+    if (joinedGroups == null) {
+      throw new IllegalArgumentException("groups may not be null");
+    }
+    List<String> groups = new ArrayList<>();
+    int i = 0;
+    while (true) {
+      int idx = joinedGroups.indexOf(',', i);
+      if (idx < 0) {
+        groups.add(joinedGroups.substring(i, joinedGroups.length()));
+        break;
+      }
+      groups.add(joinedGroups.substring(i, idx));
+      i = idx + 1;
+    }
+    return groups;
+  }
+
+  public static class Id extends IntKey<Change.Id> {
+    private static final long serialVersionUID = 1L;
+
+    @Column(id = 1)
+    public Change.Id changeId;
+
+    @Column(id = 2)
+    public int patchSetId;
+
+    public Id() {
+      changeId = new Change.Id();
+    }
+
+    public Id(Change.Id change, int id) {
+      this.changeId = change;
+      this.patchSetId = id;
+    }
+
+    @Override
+    public Change.Id getParentKey() {
+      return changeId;
+    }
+
+    @Override
+    public int get() {
+      return patchSetId;
+    }
+
+    @Override
+    protected void set(int newValue) {
+      patchSetId = newValue;
+    }
+
+    public String toRefName() {
+      return changeId.refPrefixBuilder().append(patchSetId).toString();
+    }
+
+    /** Parse a PatchSet.Id out of a string representation. */
+    public static Id parse(String str) {
+      final Id r = new Id();
+      r.fromString(str);
+      return r;
+    }
+
+    /** Parse a PatchSet.Id from a {@link PatchSet#getRefName()} result. */
+    public static Id fromRef(String ref) {
+      int cs = Change.Id.startIndex(ref);
+      if (cs < 0) {
+        return null;
+      }
+      int ce = Change.Id.nextNonDigit(ref, cs);
+      int patchSetId = fromRef(ref, ce);
+      if (patchSetId < 0) {
+        return null;
+      }
+      int changeId = Integer.parseInt(ref.substring(cs, ce));
+      return new PatchSet.Id(new Change.Id(changeId), patchSetId);
+    }
+
+    static int fromRef(String ref, int changeIdEnd) {
+      // Patch set ID.
+      int ps = changeIdEnd + 1;
+      if (ps >= ref.length() || ref.charAt(ps) == '0') {
+        return -1;
+      }
+      for (int i = ps; i < ref.length(); i++) {
+        if (ref.charAt(i) < '0' || ref.charAt(i) > '9') {
+          return -1;
+        }
+      }
+      return Integer.parseInt(ref.substring(ps));
+    }
+
+    public String getId() {
+      return toId(patchSetId);
+    }
+
+    public static String toId(int number) {
+      return number == 0 ? "edit" : String.valueOf(number);
+    }
+  }
+
+  @Column(id = 1, name = Column.NONE)
+  protected Id id;
+
+  @Column(id = 2, notNull = false)
+  protected RevId revision;
+
+  @Column(id = 3, name = "uploader_account_id")
+  protected Account.Id uploader;
+
+  /** When this patch set was first introduced onto the change. */
+  @Column(id = 4)
+  protected Timestamp createdOn;
+
+  // @Column(id = 5)
+
+  /**
+   * Opaque group identifier, usually assigned during creation.
+   *
+   * <p>This field is actually a comma-separated list of values, as in rare cases involving merge
+   * commits a patch set may belong to multiple groups.
+   *
+   * <p>Changes on the same branch having patch sets with intersecting groups are considered
+   * related, as in the "Related Changes" tab.
+   */
+  @Column(id = 6, notNull = false, length = Integer.MAX_VALUE)
+  protected String groups;
+
+  // DELETED id = 7 (pushCertficate)
+
+  /** Certificate sent with a push that created this patch set. */
+  @Column(id = 8, notNull = false, length = Integer.MAX_VALUE)
+  protected String pushCertificate;
+
+  /**
+   * Optional user-supplied description for this patch set.
+   *
+   * <p>When this field is null, the description was never set on the patch set. When this field is
+   * an empty string, the description was set and later cleared.
+   */
+  @Column(id = 9, notNull = false, length = Integer.MAX_VALUE)
+  protected String description;
+
+  protected PatchSet() {}
+
+  public PatchSet(PatchSet.Id k) {
+    id = k;
+  }
+
+  public PatchSet(PatchSet src) {
+    this.id = src.id;
+    this.revision = src.revision;
+    this.uploader = src.uploader;
+    this.createdOn = src.createdOn;
+    this.groups = src.groups;
+    this.pushCertificate = src.pushCertificate;
+    this.description = src.description;
+  }
+
+  public PatchSet.Id getId() {
+    return id;
+  }
+
+  public int getPatchSetId() {
+    return id.get();
+  }
+
+  public RevId getRevision() {
+    return revision;
+  }
+
+  public void setRevision(RevId i) {
+    revision = i;
+  }
+
+  public Account.Id getUploader() {
+    return uploader;
+  }
+
+  public void setUploader(Account.Id who) {
+    uploader = who;
+  }
+
+  public Timestamp getCreatedOn() {
+    return createdOn;
+  }
+
+  public void setCreatedOn(Timestamp ts) {
+    createdOn = ts;
+  }
+
+  public List<String> getGroups() {
+    if (groups == null) {
+      return Collections.emptyList();
+    }
+    return splitGroups(groups);
+  }
+
+  public void setGroups(List<String> groups) {
+    if (groups == null) {
+      groups = Collections.emptyList();
+    }
+    this.groups = joinGroups(groups);
+  }
+
+  public String getRefName() {
+    return id.toRefName();
+  }
+
+  public String getPushCertificate() {
+    return pushCertificate;
+  }
+
+  public void setPushCertificate(String cert) {
+    pushCertificate = cert;
+  }
+
+  public String getDescription() {
+    return description;
+  }
+
+  public void setDescription(String description) {
+    this.description = description;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (!(o instanceof PatchSet)) {
+      return false;
+    }
+    PatchSet p = (PatchSet) o;
+    return Objects.equals(id, p.id)
+        && Objects.equals(revision, p.revision)
+        && Objects.equals(uploader, p.uploader)
+        && Objects.equals(createdOn, p.createdOn)
+        && Objects.equals(groups, p.groups)
+        && Objects.equals(pushCertificate, p.pushCertificate)
+        && Objects.equals(description, p.description);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(id, revision, uploader, createdOn, groups, pushCertificate, description);
+  }
+
+  @Override
+  public String toString() {
+    return "[PatchSet " + getId().toString() + "]";
+  }
+}
diff --git a/java/com/google/gerrit/reviewdb/client/PatchSetApproval.java b/java/com/google/gerrit/reviewdb/client/PatchSetApproval.java
new file mode 100644
index 0000000..5adf002
--- /dev/null
+++ b/java/com/google/gerrit/reviewdb/client/PatchSetApproval.java
@@ -0,0 +1,231 @@
+// Copyright (C) 2008 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.google.gerrit.reviewdb.client;
+
+import com.google.gwtorm.client.Column;
+import com.google.gwtorm.client.CompoundKey;
+import java.sql.Timestamp;
+import java.util.Date;
+import java.util.Objects;
+
+/** An approval (or negative approval) on a patch set. */
+public final class PatchSetApproval {
+  public static class Key extends CompoundKey<PatchSet.Id> {
+    private static final long serialVersionUID = 1L;
+
+    @Column(id = 1, name = Column.NONE)
+    protected PatchSet.Id patchSetId;
+
+    @Column(id = 2)
+    protected Account.Id accountId;
+
+    @Column(id = 3)
+    protected LabelId categoryId;
+
+    protected Key() {
+      patchSetId = new PatchSet.Id();
+      accountId = new Account.Id();
+      categoryId = new LabelId();
+    }
+
+    public Key(PatchSet.Id ps, Account.Id a, LabelId c) {
+      this.patchSetId = ps;
+      this.accountId = a;
+      this.categoryId = c;
+    }
+
+    @Override
+    public PatchSet.Id getParentKey() {
+      return patchSetId;
+    }
+
+    public Account.Id getAccountId() {
+      return accountId;
+    }
+
+    public LabelId getLabelId() {
+      return categoryId;
+    }
+
+    @Override
+    public com.google.gwtorm.client.Key<?>[] members() {
+      return new com.google.gwtorm.client.Key<?>[] {accountId, categoryId};
+    }
+  }
+
+  @Column(id = 1, name = Column.NONE)
+  protected Key key;
+
+  /**
+   * Value assigned by the user.
+   *
+   * <p>The precise meaning of "value" is up to each category.
+   *
+   * <p>In general:
+   *
+   * <ul>
+   *   <li><b>&lt; 0:</b> The approval is rejected/revoked.
+   *   <li><b>= 0:</b> No indication either way is provided.
+   *   <li><b>&gt; 0:</b> The approval is approved/positive.
+   * </ul>
+   *
+   * and in the negative and positive direction a magnitude can be assumed.The further from 0 the
+   * more assertive the approval.
+   */
+  @Column(id = 2)
+  protected short value;
+
+  @Column(id = 3)
+  protected Timestamp granted;
+
+  @Column(id = 6, notNull = false)
+  protected String tag;
+
+  /** Real user that made this approval on behalf of the user recorded in {@link Key#accountId}. */
+  @Column(id = 7, notNull = false)
+  protected Account.Id realAccountId;
+
+  @Column(id = 8)
+  protected boolean postSubmit;
+
+  // DELETED: id = 4 (changeOpen)
+  // DELETED: id = 5 (changeSortKey)
+
+  protected PatchSetApproval() {}
+
+  public PatchSetApproval(PatchSetApproval.Key k, short v, Date ts) {
+    key = k;
+    setValue(v);
+    setGranted(ts);
+  }
+
+  public PatchSetApproval(PatchSet.Id psId, PatchSetApproval src) {
+    key = new PatchSetApproval.Key(psId, src.getAccountId(), src.getLabelId());
+    value = src.getValue();
+    granted = src.granted;
+    realAccountId = src.realAccountId;
+    tag = src.tag;
+    postSubmit = src.postSubmit;
+  }
+
+  public PatchSetApproval(PatchSetApproval src) {
+    this(src.getPatchSetId(), src);
+  }
+
+  public PatchSetApproval.Key getKey() {
+    return key;
+  }
+
+  public PatchSet.Id getPatchSetId() {
+    return key.patchSetId;
+  }
+
+  public Account.Id getAccountId() {
+    return key.accountId;
+  }
+
+  public Account.Id getRealAccountId() {
+    return realAccountId != null ? realAccountId : getAccountId();
+  }
+
+  public void setRealAccountId(Account.Id id) {
+    // Use null for same real author, as before the column was added.
+    realAccountId = Objects.equals(getAccountId(), id) ? null : id;
+  }
+
+  public LabelId getLabelId() {
+    return key.categoryId;
+  }
+
+  public short getValue() {
+    return value;
+  }
+
+  public void setValue(short v) {
+    value = v;
+  }
+
+  public Timestamp getGranted() {
+    return granted;
+  }
+
+  public void setGranted(Date when) {
+    if (when instanceof Timestamp) {
+      granted = (Timestamp) when;
+    } else {
+      granted = new Timestamp(when.getTime());
+    }
+  }
+
+  public void setTag(String t) {
+    tag = t;
+  }
+
+  public String getLabel() {
+    return getLabelId().get();
+  }
+
+  public boolean isLegacySubmit() {
+    return LabelId.LEGACY_SUBMIT_NAME.equals(getLabel());
+  }
+
+  public String getTag() {
+    return tag;
+  }
+
+  public void setPostSubmit(boolean postSubmit) {
+    this.postSubmit = postSubmit;
+  }
+
+  public boolean isPostSubmit() {
+    return postSubmit;
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb =
+        new StringBuilder("[")
+            .append(key)
+            .append(": ")
+            .append(value)
+            .append(",tag:")
+            .append(tag)
+            .append(",realAccountId:")
+            .append(realAccountId);
+    if (postSubmit) {
+      sb.append(",postSubmit");
+    }
+    return sb.append(']').toString();
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (o instanceof PatchSetApproval) {
+      PatchSetApproval p = (PatchSetApproval) o;
+      return Objects.equals(key, p.key)
+          && Objects.equals(value, p.value)
+          && Objects.equals(granted, p.granted)
+          && Objects.equals(tag, p.tag)
+          && Objects.equals(realAccountId, p.realAccountId)
+          && postSubmit == p.postSubmit;
+    }
+    return false;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(key, value, granted, tag, realAccountId, postSubmit);
+  }
+}
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/PatchSetInfo.java b/java/com/google/gerrit/reviewdb/client/PatchSetInfo.java
similarity index 100%
rename from gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/PatchSetInfo.java
rename to java/com/google/gerrit/reviewdb/client/PatchSetInfo.java
diff --git a/java/com/google/gerrit/reviewdb/client/Project.java b/java/com/google/gerrit/reviewdb/client/Project.java
new file mode 100644
index 0000000..996f1ec
--- /dev/null
+++ b/java/com/google/gerrit/reviewdb/client/Project.java
@@ -0,0 +1,254 @@
+// Copyright (C) 2008 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.google.gerrit.reviewdb.client;
+
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.extensions.client.ProjectState;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gwtorm.client.Column;
+import com.google.gwtorm.client.StringKey;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+/** Projects match a source code repository managed by Gerrit */
+public final class Project {
+  /** Default submit type for new projects. */
+  public static final SubmitType DEFAULT_SUBMIT_TYPE = SubmitType.MERGE_IF_NECESSARY;
+
+  /** Default submit type for root project (All-Projects). */
+  public static final SubmitType DEFAULT_ALL_PROJECTS_SUBMIT_TYPE = SubmitType.MERGE_IF_NECESSARY;
+
+  /** Project name key */
+  public static class NameKey extends StringKey<com.google.gwtorm.client.Key<?>> {
+    private static final long serialVersionUID = 1L;
+
+    @Column(id = 1)
+    protected String name;
+
+    protected NameKey() {}
+
+    public NameKey(String n) {
+      name = n;
+    }
+
+    @Override
+    public String get() {
+      return name;
+    }
+
+    @Override
+    protected void set(String newValue) {
+      name = newValue;
+    }
+
+    @Override
+    public int hashCode() {
+      return get().hashCode();
+    }
+
+    @Override
+    public boolean equals(Object b) {
+      if (b instanceof NameKey) {
+        return get().equals(((NameKey) b).get());
+      }
+      return false;
+    }
+
+    /** Parse a Project.NameKey out of a string representation. */
+    public static NameKey parse(String str) {
+      final NameKey r = new NameKey();
+      r.fromString(str);
+      return r;
+    }
+
+    public static String asStringOrNull(NameKey key) {
+      return key == null ? null : key.get();
+    }
+  }
+
+  protected NameKey name;
+
+  protected String description;
+
+  protected Map<BooleanProjectConfig, InheritableBoolean> booleanConfigs;
+
+  protected SubmitType submitType;
+
+  protected ProjectState state;
+
+  protected NameKey parent;
+
+  protected String maxObjectSizeLimit;
+
+  protected String defaultDashboardId;
+
+  protected String localDefaultDashboardId;
+
+  protected String themeName;
+
+  protected String configRefState;
+
+  protected Project() {}
+
+  public Project(Project.NameKey nameKey) {
+    name = nameKey;
+    submitType = SubmitType.MERGE_IF_NECESSARY;
+    state = ProjectState.ACTIVE;
+
+    booleanConfigs = new HashMap<>();
+    Arrays.stream(BooleanProjectConfig.values())
+        .forEach(c -> booleanConfigs.put(c, InheritableBoolean.INHERIT));
+  }
+
+  public Project.NameKey getNameKey() {
+    return name;
+  }
+
+  public String getName() {
+    return name != null ? name.get() : null;
+  }
+
+  public String getDescription() {
+    return description;
+  }
+
+  public void setDescription(String d) {
+    description = d;
+  }
+
+  public String getMaxObjectSizeLimit() {
+    return maxObjectSizeLimit;
+  }
+
+  public InheritableBoolean getBooleanConfig(BooleanProjectConfig config) {
+    return booleanConfigs.get(config);
+  }
+
+  public void setBooleanConfig(BooleanProjectConfig config, InheritableBoolean val) {
+    booleanConfigs.replace(config, val);
+  }
+
+  public void setMaxObjectSizeLimit(String limit) {
+    maxObjectSizeLimit = limit;
+  }
+
+  /**
+   * Submit type as configured in {@code project.config}.
+   *
+   * <p>Does not take inheritance into account, i.e. may return {@link SubmitType#INHERIT}.
+   *
+   * @return submit type.
+   */
+  public SubmitType getConfiguredSubmitType() {
+    return submitType;
+  }
+
+  public void setSubmitType(SubmitType type) {
+    submitType = type;
+  }
+
+  public ProjectState getState() {
+    return state;
+  }
+
+  public void setState(ProjectState newState) {
+    state = newState;
+  }
+
+  public String getDefaultDashboard() {
+    return defaultDashboardId;
+  }
+
+  public void setDefaultDashboard(String defaultDashboardId) {
+    this.defaultDashboardId = defaultDashboardId;
+  }
+
+  public String getLocalDefaultDashboard() {
+    return localDefaultDashboardId;
+  }
+
+  public void setLocalDefaultDashboard(String localDefaultDashboardId) {
+    this.localDefaultDashboardId = localDefaultDashboardId;
+  }
+
+  public String getThemeName() {
+    return themeName;
+  }
+
+  public void setThemeName(String themeName) {
+    this.themeName = themeName;
+  }
+
+  public void copySettingsFrom(Project update) {
+    description = update.description;
+    booleanConfigs = new HashMap<>(update.booleanConfigs);
+    submitType = update.submitType;
+    state = update.state;
+    maxObjectSizeLimit = update.maxObjectSizeLimit;
+  }
+
+  /**
+   * Returns the name key of the parent project.
+   *
+   * @return name key of the parent project, {@code null} if this project is the wild project,
+   *     {@code null} or the name key of the wild project if this project is a direct child of the
+   *     wild project
+   */
+  public Project.NameKey getParent() {
+    return parent;
+  }
+
+  /**
+   * Returns the name key of the parent project.
+   *
+   * @param allProjectsName name key of the wild project
+   * @return name key of the parent project, {@code null} if this project is the All-Projects
+   *     project
+   */
+  public Project.NameKey getParent(Project.NameKey allProjectsName) {
+    if (parent != null) {
+      return parent;
+    }
+
+    if (name.equals(allProjectsName)) {
+      return null;
+    }
+
+    return allProjectsName;
+  }
+
+  public String getParentName() {
+    return parent != null ? parent.get() : null;
+  }
+
+  public void setParentName(String n) {
+    parent = n != null ? new NameKey(n) : null;
+  }
+
+  public void setParentName(NameKey n) {
+    parent = n;
+  }
+
+  /** Returns the {@code ObjectId} as 40 digit hex of {@code refs/meta/config}'s HEAD. */
+  public String getConfigRefState() {
+    return configRefState;
+  }
+
+  /** Sets the {@code ObjectId} as 40 digit hex of {@code refs/meta/config}'s HEAD. */
+  public void setConfigRefState(String state) {
+    configRefState = state;
+  }
+}
diff --git a/java/com/google/gerrit/reviewdb/client/RefNames.java b/java/com/google/gerrit/reviewdb/client/RefNames.java
new file mode 100644
index 0000000..fd2fb56
--- /dev/null
+++ b/java/com/google/gerrit/reviewdb/client/RefNames.java
@@ -0,0 +1,443 @@
+// Copyright (C) 2013 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.google.gerrit.reviewdb.client;
+
+/** Constants and utilities for Gerrit-specific ref names. */
+public class RefNames {
+  public static final String HEAD = "HEAD";
+
+  public static final String REFS = "refs/";
+
+  public static final String REFS_HEADS = "refs/heads/";
+
+  public static final String REFS_TAGS = "refs/tags/";
+
+  public static final String REFS_CHANGES = "refs/changes/";
+
+  public static final String REFS_META = "refs/meta/";
+
+  /** Note tree listing commits we refuse {@code refs/meta/reject-commits} */
+  public static final String REFS_REJECT_COMMITS = "refs/meta/reject-commits";
+
+  /** Configuration settings for a project {@code refs/meta/config} */
+  public static final String REFS_CONFIG = "refs/meta/config";
+
+  /** Note tree listing external IDs */
+  public static final String REFS_EXTERNAL_IDS = "refs/meta/external-ids";
+
+  /** Magic user branch in All-Users {@code refs/users/self} */
+  public static final String REFS_USERS_SELF = "refs/users/self";
+
+  /** Default user preference settings */
+  public static final String REFS_USERS_DEFAULT = RefNames.REFS_USERS + "default";
+
+  /** Configurations of project-specific dashboards (canned search queries). */
+  public static final String REFS_DASHBOARDS = "refs/meta/dashboards/";
+
+  /** Sequence counters in NoteDb. */
+  public static final String REFS_SEQUENCES = "refs/sequences/";
+
+  /**
+   * Prefix applied to merge commit base nodes.
+   *
+   * <p>References in this directory should take the form {@code refs/cache-automerge/xx/yyyy...}
+   * where xx is the first two digits of the merge commit's object name, and yyyyy... is the
+   * remaining 38. The reference should point to a treeish that is the automatic merge result of the
+   * merge commit's parents.
+   */
+  public static final String REFS_CACHE_AUTOMERGE = "refs/cache-automerge/";
+
+  /** Suffix of a meta ref in the NoteDb. */
+  public static final String META_SUFFIX = "/meta";
+
+  /** Suffix of a ref that stores robot comments in the NoteDb. */
+  public static final String ROBOT_COMMENTS_SUFFIX = "/robot-comments";
+
+  public static final String EDIT_PREFIX = "edit-";
+
+  /*
+   * The following refs contain an account ID and should be visible only to that account.
+   *
+   * Parsing the account ID from the ref is implemented in Account.Id#fromRef(String). This ensures
+   * that VisibleRefFilter hides those refs from other users.
+   *
+   * This applies to:
+   * - User branches (e.g. 'refs/users/23/1011123')
+   * - Draft comment refs (e.g. 'refs/draft-comments/73/67473/1011123')
+   * - Starred changes refs (e.g. 'refs/starred-changes/73/67473/1011123')
+   */
+
+  /** Preference settings for a user {@code refs/users} */
+  public static final String REFS_USERS = "refs/users/";
+
+  /** NoteDb ref for a group {@code refs/groups} */
+  public static final String REFS_GROUPS = "refs/groups/";
+
+  /** NoteDb ref for the NoteMap of all group names */
+  public static final String REFS_GROUPNAMES = "refs/meta/group-names";
+
+  /**
+   * NoteDb ref for deleted groups {@code refs/deleted-groups}. This ref namespace is foreseen as an
+   * attic for deleted groups (it's reserved but not used yet)
+   */
+  public static final String REFS_DELETED_GROUPS = "refs/deleted-groups/";
+
+  /** Draft inline comments of a user on a change */
+  public static final String REFS_DRAFT_COMMENTS = "refs/draft-comments/";
+
+  /** A change starred by a user */
+  public static final String REFS_STARRED_CHANGES = "refs/starred-changes/";
+
+  public static String fullName(String ref) {
+    return (ref.startsWith(REFS) || ref.equals(HEAD)) ? ref : REFS_HEADS + ref;
+  }
+
+  public static final String shortName(String ref) {
+    if (ref.startsWith(REFS_HEADS)) {
+      return ref.substring(REFS_HEADS.length());
+    } else if (ref.startsWith(REFS_TAGS)) {
+      return ref.substring(REFS_TAGS.length());
+    }
+    return ref;
+  }
+
+  public static String changeMetaRef(Change.Id id) {
+    StringBuilder r = newStringBuilder().append(REFS_CHANGES);
+    return shard(id.get(), r).append(META_SUFFIX).toString();
+  }
+
+  public static String robotCommentsRef(Change.Id id) {
+    StringBuilder r = newStringBuilder().append(REFS_CHANGES);
+    return shard(id.get(), r).append(ROBOT_COMMENTS_SUFFIX).toString();
+  }
+
+  public static boolean isNoteDbMetaRef(String ref) {
+    if (ref.startsWith(REFS_CHANGES)
+        && (ref.endsWith(META_SUFFIX) || ref.endsWith(ROBOT_COMMENTS_SUFFIX))) {
+      return true;
+    }
+    if (ref.startsWith(REFS_DRAFT_COMMENTS) || ref.startsWith(REFS_STARRED_CHANGES)) {
+      return true;
+    }
+    return false;
+  }
+
+  public static String refsGroups(AccountGroup.UUID groupUuid) {
+    return REFS_GROUPS + shardUuid(groupUuid.get());
+  }
+
+  public static String refsDeletedGroups(AccountGroup.UUID groupUuid) {
+    return REFS_DELETED_GROUPS + shardUuid(groupUuid.get());
+  }
+
+  public static String refsUsers(Account.Id accountId) {
+    StringBuilder r = newStringBuilder().append(REFS_USERS);
+    return shard(accountId.get(), r).toString();
+  }
+
+  public static String refsDraftComments(Change.Id changeId, Account.Id accountId) {
+    return buildRefsPrefix(REFS_DRAFT_COMMENTS, changeId.get()).append(accountId.get()).toString();
+  }
+
+  public static String refsDraftCommentsPrefix(Change.Id changeId) {
+    return buildRefsPrefix(REFS_DRAFT_COMMENTS, changeId.get()).toString();
+  }
+
+  public static String refsStarredChanges(Change.Id changeId, Account.Id accountId) {
+    return buildRefsPrefix(REFS_STARRED_CHANGES, changeId.get()).append(accountId.get()).toString();
+  }
+
+  public static String refsStarredChangesPrefix(Change.Id changeId) {
+    return buildRefsPrefix(REFS_STARRED_CHANGES, changeId.get()).toString();
+  }
+
+  private static StringBuilder buildRefsPrefix(String prefix, int id) {
+    StringBuilder r = newStringBuilder().append(prefix);
+    return shard(id, r).append('/');
+  }
+
+  public static String refsCacheAutomerge(String hash) {
+    return REFS_CACHE_AUTOMERGE + hash.substring(0, 2) + '/' + hash.substring(2);
+  }
+
+  public static String shard(int id) {
+    if (id < 0) {
+      return null;
+    }
+    return shard(id, newStringBuilder()).toString();
+  }
+
+  private static StringBuilder shard(int id, StringBuilder sb) {
+    int n = id % 100;
+    if (n < 10) {
+      sb.append('0');
+    }
+    sb.append(n);
+    sb.append('/');
+    sb.append(id);
+    return sb;
+  }
+
+  private static String shardUuid(String uuid) {
+    if (uuid == null || uuid.length() < 2) {
+      throw new IllegalArgumentException("UUIDs must consist of at least two characters");
+    }
+    return uuid.substring(0, 2) + '/' + uuid;
+  }
+
+  /**
+   * Returns reference for this change edit with sharded user and change number:
+   * refs/users/UU/UUUU/edit-CCCC/P.
+   *
+   * @param accountId account id
+   * @param changeId change number
+   * @param psId patch set number
+   * @return reference for this change edit
+   */
+  public static String refsEdit(Account.Id accountId, Change.Id changeId, PatchSet.Id psId) {
+    return refsEditPrefix(accountId, changeId) + psId.get();
+  }
+
+  /**
+   * Returns reference prefix for this change edit with sharded user and change number:
+   * refs/users/UU/UUUU/edit-CCCC/.
+   *
+   * @param accountId account id
+   * @param changeId change number
+   * @return reference prefix for this change edit
+   */
+  public static String refsEditPrefix(Account.Id accountId, Change.Id changeId) {
+    return refsEditPrefix(accountId) + changeId.get() + '/';
+  }
+
+  public static String refsEditPrefix(Account.Id accountId) {
+    return refsUsers(accountId) + '/' + EDIT_PREFIX;
+  }
+
+  public static boolean isRefsEdit(String ref) {
+    return ref != null && ref.startsWith(REFS_USERS) && ref.contains(EDIT_PREFIX);
+  }
+
+  public static boolean isRefsUsers(String ref) {
+    return ref.startsWith(REFS_USERS);
+  }
+
+  /**
+   * Whether the ref is a group branch that stores NoteDb data of a group. Returns {@code true} for
+   * all refs that start with {@code refs/groups/}.
+   */
+  public static boolean isRefsGroups(String ref) {
+    return ref.startsWith(REFS_GROUPS);
+  }
+
+  /**
+   * Whether the ref is a group branch that stores NoteDb data of a deleted group. Returns {@code
+   * true} for all refs that start with {@code refs/deleted-groups/}.
+   */
+  public static boolean isRefsDeletedGroups(String ref) {
+    return ref.startsWith(REFS_DELETED_GROUPS);
+  }
+
+  /**
+   * Whether the ref is used for storing group data in NoteDb. Returns {@code true} for all group
+   * branches, refs/meta/group-names and deleted group branches.
+   */
+  public static boolean isGroupRef(String ref) {
+    return isRefsGroups(ref) || isRefsDeletedGroups(ref) || REFS_GROUPNAMES.equals(ref);
+  }
+
+  /** Whether the ref is the configuration branch, i.e. {@code refs/meta/config}, for a project. */
+  public static boolean isConfigRef(String ref) {
+    return REFS_CONFIG.equals(ref);
+  }
+
+  static Integer parseShardedRefPart(String name) {
+    if (name == null) {
+      return null;
+    }
+
+    String[] parts = name.split("/");
+    int n = parts.length;
+    if (n < 2) {
+      return null;
+    }
+
+    // Last 2 digits.
+    int le;
+    for (le = 0; le < parts[0].length(); le++) {
+      if (!Character.isDigit(parts[0].charAt(le))) {
+        return null;
+      }
+    }
+    if (le != 2) {
+      return null;
+    }
+
+    // Full ID.
+    int ie;
+    for (ie = 0; ie < parts[1].length(); ie++) {
+      if (!Character.isDigit(parts[1].charAt(ie))) {
+        if (ie == 0) {
+          return null;
+        }
+        break;
+      }
+    }
+
+    int shard = Integer.parseInt(parts[0]);
+    int id = Integer.parseInt(parts[1].substring(0, ie));
+
+    if (id % 100 != shard) {
+      return null;
+    }
+    return id;
+  }
+
+  static String parseShardedUuidFromRefPart(String name) {
+    if (name == null) {
+      return null;
+    }
+
+    String[] parts = name.split("/");
+    int n = parts.length;
+    if (n != 2) {
+      return null;
+    }
+
+    // First 2 chars.
+    if (parts[0].length() != 2) {
+      return null;
+    }
+
+    // Full UUID.
+    String uuid = parts[1];
+    if (!uuid.startsWith(parts[0])) {
+      return null;
+    }
+
+    return uuid;
+  }
+
+  /**
+   * Skips a sharded ref part at the beginning of the name.
+   *
+   * <p>E.g.: "01/1" -> "", "01/1/" -> "/", "01/1/2" -> "/2", "01/1-edit" -> "-edit"
+   *
+   * @param name ref part name
+   * @return the rest of the name, {@code null} if the ref name part doesn't start with a valid
+   *     sharded ID
+   */
+  static String skipShardedRefPart(String name) {
+    if (name == null) {
+      return null;
+    }
+
+    String[] parts = name.split("/");
+    int n = parts.length;
+    if (n < 2) {
+      return null;
+    }
+
+    // Last 2 digits.
+    int le;
+    for (le = 0; le < parts[0].length(); le++) {
+      if (!Character.isDigit(parts[0].charAt(le))) {
+        return null;
+      }
+    }
+    if (le != 2) {
+      return null;
+    }
+
+    // Full ID.
+    int ie;
+    for (ie = 0; ie < parts[1].length(); ie++) {
+      if (!Character.isDigit(parts[1].charAt(ie))) {
+        if (ie == 0) {
+          return null;
+        }
+        break;
+      }
+    }
+
+    int shard = Integer.parseInt(parts[0]);
+    int id = Integer.parseInt(parts[1].substring(0, ie));
+
+    if (id % 100 != shard) {
+      return null;
+    }
+
+    return name.substring(2 + 1 + ie); // 2 for the length of the shard, 1 for the '/'
+  }
+
+  /**
+   * Parses an ID that follows a sharded ref part at the beginning of the name.
+   *
+   * <p>E.g.: "01/1/2" -> 2, "01/1/2/4" -> 2, ""01/1/2-edit" -> 2
+   *
+   * @param name ref part name
+   * @return ID that follows the sharded ref part at the beginning of the name, {@code null} if the
+   *     ref name part doesn't start with a valid sharded ID or if no valid ID follows the sharded
+   *     ref part
+   */
+  static Integer parseAfterShardedRefPart(String name) {
+    String rest = skipShardedRefPart(name);
+    if (rest == null || !rest.startsWith("/")) {
+      return null;
+    }
+
+    rest = rest.substring(1);
+
+    int ie;
+    for (ie = 0; ie < rest.length(); ie++) {
+      if (!Character.isDigit(rest.charAt(ie))) {
+        break;
+      }
+    }
+    if (ie == 0) {
+      return null;
+    }
+    return Integer.parseInt(rest.substring(0, ie));
+  }
+
+  static Integer parseRefSuffix(String name) {
+    if (name == null) {
+      return null;
+    }
+    int i = name.length();
+    while (i > 0) {
+      char c = name.charAt(i - 1);
+      if (c == '/') {
+        break;
+      } else if (!Character.isDigit(c)) {
+        return null;
+      }
+      i--;
+    }
+    if (i == 0) {
+      return null;
+    }
+    return Integer.valueOf(name.substring(i, name.length()));
+  }
+
+  private static StringBuilder newStringBuilder() {
+    // Many refname types in this file are always are longer than the default of 16 chars, so
+    // presize StringBuilders larger by default. This hurts readability less than accurate
+    // calculations would, at a negligible cost to memory overhead.
+    return new StringBuilder(64);
+  }
+
+  private RefNames() {}
+}
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/RevId.java b/java/com/google/gerrit/reviewdb/client/RevId.java
similarity index 100%
rename from gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/RevId.java
rename to java/com/google/gerrit/reviewdb/client/RevId.java
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/RobotComment.java b/java/com/google/gerrit/reviewdb/client/RobotComment.java
similarity index 100%
rename from gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/RobotComment.java
rename to java/com/google/gerrit/reviewdb/client/RobotComment.java
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/SubmoduleSubscription.java b/java/com/google/gerrit/reviewdb/client/SubmoduleSubscription.java
similarity index 100%
rename from gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/SubmoduleSubscription.java
rename to java/com/google/gerrit/reviewdb/client/SubmoduleSubscription.java
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/TrackingId.java b/java/com/google/gerrit/reviewdb/client/TrackingId.java
similarity index 100%
rename from gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/TrackingId.java
rename to java/com/google/gerrit/reviewdb/client/TrackingId.java
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/UserIdentity.java b/java/com/google/gerrit/reviewdb/client/UserIdentity.java
similarity index 100%
rename from gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/UserIdentity.java
rename to java/com/google/gerrit/reviewdb/client/UserIdentity.java
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupAccess.java b/java/com/google/gerrit/reviewdb/server/AccountGroupAccess.java
similarity index 100%
rename from gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupAccess.java
rename to java/com/google/gerrit/reviewdb/server/AccountGroupAccess.java
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupByIdAccess.java b/java/com/google/gerrit/reviewdb/server/AccountGroupByIdAccess.java
similarity index 100%
rename from gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupByIdAccess.java
rename to java/com/google/gerrit/reviewdb/server/AccountGroupByIdAccess.java
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupByIdAudAccess.java b/java/com/google/gerrit/reviewdb/server/AccountGroupByIdAudAccess.java
similarity index 100%
rename from gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupByIdAudAccess.java
rename to java/com/google/gerrit/reviewdb/server/AccountGroupByIdAudAccess.java
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupMemberAccess.java b/java/com/google/gerrit/reviewdb/server/AccountGroupMemberAccess.java
similarity index 100%
rename from gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupMemberAccess.java
rename to java/com/google/gerrit/reviewdb/server/AccountGroupMemberAccess.java
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupMemberAuditAccess.java b/java/com/google/gerrit/reviewdb/server/AccountGroupMemberAuditAccess.java
similarity index 100%
rename from gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupMemberAuditAccess.java
rename to java/com/google/gerrit/reviewdb/server/AccountGroupMemberAuditAccess.java
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupNameAccess.java b/java/com/google/gerrit/reviewdb/server/AccountGroupNameAccess.java
similarity index 100%
rename from gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/AccountGroupNameAccess.java
rename to java/com/google/gerrit/reviewdb/server/AccountGroupNameAccess.java
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ChangeAccess.java b/java/com/google/gerrit/reviewdb/server/ChangeAccess.java
similarity index 100%
rename from gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ChangeAccess.java
rename to java/com/google/gerrit/reviewdb/server/ChangeAccess.java
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ChangeMessageAccess.java b/java/com/google/gerrit/reviewdb/server/ChangeMessageAccess.java
similarity index 100%
rename from gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ChangeMessageAccess.java
rename to java/com/google/gerrit/reviewdb/server/ChangeMessageAccess.java
diff --git a/java/com/google/gerrit/reviewdb/server/DisallowReadFromChangesReviewDbWrapper.java b/java/com/google/gerrit/reviewdb/server/DisallowReadFromChangesReviewDbWrapper.java
new file mode 100644
index 0000000..fdf3d6c
--- /dev/null
+++ b/java/com/google/gerrit/reviewdb/server/DisallowReadFromChangesReviewDbWrapper.java
@@ -0,0 +1,281 @@
+// 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.
+
+package com.google.gerrit.reviewdb.server;
+
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.PatchLineComment;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.ResultSet;
+
+public class DisallowReadFromChangesReviewDbWrapper extends ReviewDbWrapper {
+  private static final String MSG = "This table has been migrated to NoteDb";
+
+  private final Changes changes;
+  private final PatchSetApprovals patchSetApprovals;
+  private final ChangeMessages changeMessages;
+  private final PatchSets patchSets;
+  private final PatchLineComments patchComments;
+
+  public DisallowReadFromChangesReviewDbWrapper(ReviewDb db) {
+    super(db);
+    changes = new Changes(delegate.changes());
+    patchSetApprovals = new PatchSetApprovals(delegate.patchSetApprovals());
+    changeMessages = new ChangeMessages(delegate.changeMessages());
+    patchSets = new PatchSets(delegate.patchSets());
+    patchComments = new PatchLineComments(delegate.patchComments());
+  }
+
+  @Override
+  public ChangeAccess changes() {
+    return changes;
+  }
+
+  @Override
+  public PatchSetApprovalAccess patchSetApprovals() {
+    return patchSetApprovals;
+  }
+
+  @Override
+  public ChangeMessageAccess changeMessages() {
+    return changeMessages;
+  }
+
+  @Override
+  public PatchSetAccess patchSets() {
+    return patchSets;
+  }
+
+  @Override
+  public PatchLineCommentAccess patchComments() {
+    return patchComments;
+  }
+
+  private static class Changes extends ChangeAccessWrapper {
+
+    protected Changes(ChangeAccess delegate) {
+      super(delegate);
+    }
+
+    @Override
+    public ResultSet<Change> iterateAllEntities() {
+      throw new UnsupportedOperationException(MSG);
+    }
+
+    @SuppressWarnings("deprecation")
+    @Override
+    public com.google.common.util.concurrent.CheckedFuture<Change, OrmException> getAsync(
+        Change.Id key) {
+      throw new UnsupportedOperationException(MSG);
+    }
+
+    @Override
+    public ResultSet<Change> get(Iterable<Change.Id> keys) {
+      throw new UnsupportedOperationException(MSG);
+    }
+
+    @Override
+    public Change get(Change.Id id) throws OrmException {
+      throw new UnsupportedOperationException(MSG);
+    }
+
+    @Override
+    public ResultSet<Change> all() throws OrmException {
+      throw new UnsupportedOperationException(MSG);
+    }
+  }
+
+  private static class PatchSetApprovals extends PatchSetApprovalAccessWrapper {
+    PatchSetApprovals(PatchSetApprovalAccess delegate) {
+      super(delegate);
+    }
+
+    @Override
+    public ResultSet<PatchSetApproval> iterateAllEntities() {
+      throw new UnsupportedOperationException(MSG);
+    }
+
+    @SuppressWarnings("deprecation")
+    @Override
+    public com.google.common.util.concurrent.CheckedFuture<PatchSetApproval, OrmException> getAsync(
+        PatchSetApproval.Key key) {
+      throw new UnsupportedOperationException(MSG);
+    }
+
+    @Override
+    public ResultSet<PatchSetApproval> get(Iterable<PatchSetApproval.Key> keys) {
+      throw new UnsupportedOperationException(MSG);
+    }
+
+    @Override
+    public PatchSetApproval get(PatchSetApproval.Key key) {
+      throw new UnsupportedOperationException(MSG);
+    }
+
+    @Override
+    public ResultSet<PatchSetApproval> byChange(Change.Id id) {
+      throw new UnsupportedOperationException(MSG);
+    }
+
+    @Override
+    public ResultSet<PatchSetApproval> byPatchSet(PatchSet.Id id) {
+      throw new UnsupportedOperationException(MSG);
+    }
+  }
+
+  private static class ChangeMessages extends ChangeMessageAccessWrapper {
+    ChangeMessages(ChangeMessageAccess delegate) {
+      super(delegate);
+    }
+
+    @Override
+    public ResultSet<ChangeMessage> iterateAllEntities() {
+      throw new UnsupportedOperationException(MSG);
+    }
+
+    @SuppressWarnings("deprecation")
+    @Override
+    public com.google.common.util.concurrent.CheckedFuture<ChangeMessage, OrmException> getAsync(
+        ChangeMessage.Key key) {
+      throw new UnsupportedOperationException(MSG);
+    }
+
+    @Override
+    public ResultSet<ChangeMessage> get(Iterable<ChangeMessage.Key> keys) {
+      throw new UnsupportedOperationException(MSG);
+    }
+
+    @Override
+    public ChangeMessage get(ChangeMessage.Key id) {
+      throw new UnsupportedOperationException(MSG);
+    }
+
+    @Override
+    public ResultSet<ChangeMessage> byChange(Change.Id id) {
+      throw new UnsupportedOperationException(MSG);
+    }
+
+    @Override
+    public ResultSet<ChangeMessage> byPatchSet(PatchSet.Id id) {
+      throw new UnsupportedOperationException(MSG);
+    }
+
+    @Override
+    public ResultSet<ChangeMessage> all() {
+      throw new UnsupportedOperationException(MSG);
+    }
+  }
+
+  private static class PatchSets extends PatchSetAccessWrapper {
+    PatchSets(PatchSetAccess delegate) {
+      super(delegate);
+    }
+
+    @Override
+    public ResultSet<PatchSet> iterateAllEntities() {
+      throw new UnsupportedOperationException(MSG);
+    }
+
+    @SuppressWarnings("deprecation")
+    @Override
+    public com.google.common.util.concurrent.CheckedFuture<PatchSet, OrmException> getAsync(
+        PatchSet.Id key) {
+      throw new UnsupportedOperationException(MSG);
+    }
+
+    @Override
+    public ResultSet<PatchSet> get(Iterable<PatchSet.Id> keys) {
+      throw new UnsupportedOperationException(MSG);
+    }
+
+    @Override
+    public PatchSet get(PatchSet.Id id) {
+      throw new UnsupportedOperationException(MSG);
+    }
+
+    @Override
+    public ResultSet<PatchSet> byChange(Change.Id id) {
+      throw new UnsupportedOperationException(MSG);
+    }
+  }
+
+  private static class PatchLineComments extends PatchLineCommentAccessWrapper {
+    PatchLineComments(PatchLineCommentAccess delegate) {
+      super(delegate);
+    }
+
+    @Override
+    public ResultSet<PatchLineComment> iterateAllEntities() {
+      throw new UnsupportedOperationException(MSG);
+    }
+
+    @SuppressWarnings("deprecation")
+    @Override
+    public com.google.common.util.concurrent.CheckedFuture<PatchLineComment, OrmException> getAsync(
+        PatchLineComment.Key key) {
+      throw new UnsupportedOperationException(MSG);
+    }
+
+    @Override
+    public ResultSet<PatchLineComment> get(Iterable<PatchLineComment.Key> keys) {
+      throw new UnsupportedOperationException(MSG);
+    }
+
+    @Override
+    public PatchLineComment get(PatchLineComment.Key id) {
+      throw new UnsupportedOperationException(MSG);
+    }
+
+    @Override
+    public ResultSet<PatchLineComment> byChange(Change.Id id) {
+      throw new UnsupportedOperationException(MSG);
+    }
+
+    @Override
+    public ResultSet<PatchLineComment> byPatchSet(PatchSet.Id id) {
+      throw new UnsupportedOperationException(MSG);
+    }
+
+    @Override
+    public ResultSet<PatchLineComment> publishedByChangeFile(Change.Id id, String file) {
+      throw new UnsupportedOperationException(MSG);
+    }
+
+    @Override
+    public ResultSet<PatchLineComment> publishedByPatchSet(PatchSet.Id patchset) {
+      throw new UnsupportedOperationException(MSG);
+    }
+
+    @Override
+    public ResultSet<PatchLineComment> draftByPatchSetAuthor(
+        PatchSet.Id patchset, Account.Id author) {
+      throw new UnsupportedOperationException(MSG);
+    }
+
+    @Override
+    public ResultSet<PatchLineComment> draftByChangeFileAuthor(
+        Change.Id id, String file, Account.Id author) {
+      throw new UnsupportedOperationException(MSG);
+    }
+
+    @Override
+    public ResultSet<PatchLineComment> draftByAuthor(Account.Id author) {
+      throw new UnsupportedOperationException(MSG);
+    }
+  }
+}
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/PatchLineCommentAccess.java b/java/com/google/gerrit/reviewdb/server/PatchLineCommentAccess.java
similarity index 100%
rename from gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/PatchLineCommentAccess.java
rename to java/com/google/gerrit/reviewdb/server/PatchLineCommentAccess.java
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/PatchSetAccess.java b/java/com/google/gerrit/reviewdb/server/PatchSetAccess.java
similarity index 100%
rename from gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/PatchSetAccess.java
rename to java/com/google/gerrit/reviewdb/server/PatchSetAccess.java
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/PatchSetApprovalAccess.java b/java/com/google/gerrit/reviewdb/server/PatchSetApprovalAccess.java
similarity index 100%
rename from gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/PatchSetApprovalAccess.java
rename to java/com/google/gerrit/reviewdb/server/PatchSetApprovalAccess.java
diff --git a/java/com/google/gerrit/reviewdb/server/ReviewDb.java b/java/com/google/gerrit/reviewdb/server/ReviewDb.java
new file mode 100644
index 0000000..f0661e9
--- /dev/null
+++ b/java/com/google/gerrit/reviewdb/server/ReviewDb.java
@@ -0,0 +1,120 @@
+// Copyright (C) 2008 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.google.gerrit.reviewdb.server;
+
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.Relation;
+import com.google.gwtorm.server.Schema;
+import com.google.gwtorm.server.Sequence;
+
+/**
+ * The review service database schema.
+ *
+ * <p>Root entities that are at the top level of some important data graph:
+ *
+ * <ul>
+ *   <li>{@link Account}: Per-user account registration, preferences, identity.
+ *   <li>{@link Change}: All review information about a single proposed change.
+ * </ul>
+ */
+public interface ReviewDb extends Schema {
+  /* If you change anything, update SchemaVersion.C to use a new version. */
+
+  @Relation(id = 1)
+  SchemaVersionAccess schemaVersion();
+
+  // Deleted @Relation(id = 2)
+
+  // Deleted @Relation(id = 3)
+
+  // Deleted @Relation(id = 4)
+
+  // Deleted @Relation(id = 6)
+
+  // Deleted @Relation(id = 7)
+
+  // Deleted @Relation(id = 8)
+
+  // Deleted @Relation(id = 10)
+
+  // Deleted @Relation(id = 11)
+
+  // Deleted @Relation(id = 12)
+
+  // Deleted @Relation(id = 13)
+
+  // Deleted @Relation(id = 17)
+
+  // Deleted @Relation(id = 18)
+
+  // Deleted @Relation(id = 19)
+
+  // Deleted @Relation(id = 20)
+
+  @Relation(id = 21)
+  ChangeAccess changes();
+
+  @Relation(id = 22)
+  PatchSetApprovalAccess patchSetApprovals();
+
+  @Relation(id = 23)
+  ChangeMessageAccess changeMessages();
+
+  @Relation(id = 24)
+  PatchSetAccess patchSets();
+
+  // Deleted @Relation(id = 25)
+
+  @Relation(id = 26)
+  PatchLineCommentAccess patchComments();
+
+  // Deleted @Relation(id = 28)
+
+  // Deleted @Relation(id = 29)
+
+  // Deleted @Relation(id = 30)
+
+  int FIRST_ACCOUNT_ID = 1000000;
+
+  /**
+   * Next unique id for a {@link Account}.
+   *
+   * @deprecated use {@link com.google.gerrit.server.Sequences#nextAccountId()}.
+   */
+  @Sequence(startWith = FIRST_ACCOUNT_ID)
+  @Deprecated
+  int nextAccountId() throws OrmException;
+
+  int FIRST_GROUP_ID = 1;
+
+  /** Next unique id for a {@link AccountGroup}. */
+  @Sequence(startWith = FIRST_GROUP_ID)
+  @Deprecated
+  int nextAccountGroupId() throws OrmException;
+
+  int FIRST_CHANGE_ID = 1;
+
+  /**
+   * Next unique id for a {@link Change}.
+   *
+   * @deprecated use {@link com.google.gerrit.server.Sequences#nextChangeId()}.
+   */
+  @Sequence(startWith = FIRST_CHANGE_ID)
+  @Deprecated
+  int nextChangeId() throws OrmException;
+}
diff --git a/java/com/google/gerrit/reviewdb/server/ReviewDbCodecs.java b/java/com/google/gerrit/reviewdb/server/ReviewDbCodecs.java
new file mode 100644
index 0000000..2958464
--- /dev/null
+++ b/java/com/google/gerrit/reviewdb/server/ReviewDbCodecs.java
@@ -0,0 +1,38 @@
+// 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.
+
+package com.google.gerrit.reviewdb.server;
+
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gwtorm.protobuf.CodecFactory;
+import com.google.gwtorm.protobuf.ProtobufCodec;
+
+/** {@link ProtobufCodec} instances for ReviewDb types. */
+public class ReviewDbCodecs {
+  public static final ProtobufCodec<PatchSetApproval> APPROVAL_CODEC =
+      CodecFactory.encoder(PatchSetApproval.class);
+
+  public static final ProtobufCodec<Change> CHANGE_CODEC = CodecFactory.encoder(Change.class);
+
+  public static final ProtobufCodec<ChangeMessage> MESSAGE_CODEC =
+      CodecFactory.encoder(ChangeMessage.class);
+
+  public static final ProtobufCodec<PatchSet> PATCH_SET_CODEC =
+      CodecFactory.encoder(PatchSet.class);
+
+  private ReviewDbCodecs() {}
+}
diff --git a/java/com/google/gerrit/reviewdb/server/ReviewDbUtil.java b/java/com/google/gerrit/reviewdb/server/ReviewDbUtil.java
new file mode 100644
index 0000000..aed9778
--- /dev/null
+++ b/java/com/google/gerrit/reviewdb/server/ReviewDbUtil.java
@@ -0,0 +1,77 @@
+// 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.
+
+package com.google.gerrit.reviewdb.server;
+
+import static com.google.common.base.Preconditions.checkState;
+
+import com.google.common.collect.Ordering;
+import com.google.common.collect.Sets;
+import com.google.gwtorm.client.Column;
+import com.google.gwtorm.client.IntKey;
+import java.lang.reflect.Field;
+import java.util.Arrays;
+import java.util.Set;
+import java.util.TreeSet;
+
+/** Static utilities for ReviewDb types. */
+public class ReviewDbUtil {
+  private static final Ordering<? extends IntKey<?>> INT_KEY_ORDERING =
+      Ordering.natural().nullsFirst().<IntKey<?>>onResultOf(IntKey::get).nullsFirst();
+
+  /**
+   * Null-safe ordering over arbitrary subclass of {@code IntKey}.
+   *
+   * <p>In some cases, {@code Comparator.comparing(Change.Id::get)} may be shorter and cleaner.
+   * However, this method may be preferable in some cases:
+   *
+   * <ul>
+   *   <li>This ordering is null-safe over both input and the result of {@link IntKey#get()}; {@code
+   *       comparing} is only a good idea if all inputs are obviously non-null.
+   *   <li>{@code intKeyOrdering().sortedCopy(iterable)} is shorter than the stream equivalent.
+   *   <li>Creating derived comparators may be more readable with {@link Ordering} method chaining
+   *       rather than static {@code Comparator} methods.
+   * </ul>
+   */
+  @SuppressWarnings("unchecked")
+  public static <K extends IntKey<?>> Ordering<K> intKeyOrdering() {
+    return (Ordering<K>) INT_KEY_ORDERING;
+  }
+
+  public static ReviewDb unwrapDb(ReviewDb db) {
+    if (db instanceof DisallowReadFromChangesReviewDbWrapper) {
+      return unwrapDb(((DisallowReadFromChangesReviewDbWrapper) db).unsafeGetDelegate());
+    }
+    return db;
+  }
+
+  public static void checkColumns(Class<?> clazz, Integer... expected) {
+    Set<Integer> ids = new TreeSet<>();
+    for (Field f : clazz.getDeclaredFields()) {
+      Column col = f.getAnnotation(Column.class);
+      if (col != null) {
+        ids.add(col.id());
+      }
+    }
+    Set<Integer> expectedIds = Sets.newTreeSet(Arrays.asList(expected));
+    checkState(
+        ids.equals(expectedIds),
+        "Unexpected column set for %s: %s != %s",
+        clazz.getSimpleName(),
+        ids,
+        expectedIds);
+  }
+
+  private ReviewDbUtil() {}
+}
diff --git a/java/com/google/gerrit/reviewdb/server/ReviewDbWrapper.java b/java/com/google/gerrit/reviewdb/server/ReviewDbWrapper.java
new file mode 100644
index 0000000..202729e
--- /dev/null
+++ b/java/com/google/gerrit/reviewdb/server/ReviewDbWrapper.java
@@ -0,0 +1,1267 @@
+// 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.
+
+package com.google.gerrit.reviewdb.server;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.AccountGroupById;
+import com.google.gerrit.reviewdb.client.AccountGroupByIdAud;
+import com.google.gerrit.reviewdb.client.AccountGroupMember;
+import com.google.gerrit.reviewdb.client.AccountGroupMemberAudit;
+import com.google.gerrit.reviewdb.client.AccountGroupName;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.PatchLineComment;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gwtorm.jdbc.JdbcSchema;
+import com.google.gwtorm.server.Access;
+import com.google.gwtorm.server.AtomicUpdate;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.ResultSet;
+import com.google.gwtorm.server.StatementExecutor;
+import java.util.Map;
+
+public class ReviewDbWrapper implements ReviewDb {
+  public static JdbcSchema unwrapJbdcSchema(ReviewDb db) {
+    if (db instanceof ReviewDbWrapper) {
+      return unwrapJbdcSchema(((ReviewDbWrapper) db).unsafeGetDelegate());
+    }
+    return (JdbcSchema) db;
+  }
+
+  protected final ReviewDb delegate;
+
+  private boolean inTransaction;
+
+  protected ReviewDbWrapper(ReviewDb delegate) {
+    this.delegate = requireNonNull(delegate);
+  }
+
+  public ReviewDb unsafeGetDelegate() {
+    return delegate;
+  }
+
+  public boolean inTransaction() {
+    return inTransaction;
+  }
+
+  public void beginTransaction() {
+    inTransaction = true;
+  }
+
+  @Override
+  public void commit() throws OrmException {
+    if (!inTransaction) {
+      // This reads a little weird, we're not in a transaction, so why are we calling commit?
+      // Because we want to let the underlying ReviewDb do its normal thing in this case (which may
+      // be throwing an exception, or not, depending on implementation).
+      delegate.commit();
+    }
+  }
+
+  @Override
+  public void rollback() throws OrmException {
+    if (inTransaction) {
+      inTransaction = false;
+    } else {
+      // See comment in commit(): we want to let the underlying ReviewDb do its thing.
+      delegate.rollback();
+    }
+  }
+
+  @Override
+  public void updateSchema(StatementExecutor e) throws OrmException {
+    delegate.updateSchema(e);
+  }
+
+  @Override
+  public void pruneSchema(StatementExecutor e) throws OrmException {
+    delegate.pruneSchema(e);
+  }
+
+  @Override
+  public Access<?, ?>[] allRelations() {
+    return delegate.allRelations();
+  }
+
+  @Override
+  public void close() {
+    delegate.close();
+  }
+
+  @Override
+  public SchemaVersionAccess schemaVersion() {
+    return delegate.schemaVersion();
+  }
+
+  @Override
+  public ChangeAccess changes() {
+    return delegate.changes();
+  }
+
+  @Override
+  public PatchSetApprovalAccess patchSetApprovals() {
+    return delegate.patchSetApprovals();
+  }
+
+  @Override
+  public ChangeMessageAccess changeMessages() {
+    return delegate.changeMessages();
+  }
+
+  @Override
+  public PatchSetAccess patchSets() {
+    return delegate.patchSets();
+  }
+
+  @Override
+  public PatchLineCommentAccess patchComments() {
+    return delegate.patchComments();
+  }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public int nextAccountId() throws OrmException {
+    return delegate.nextAccountId();
+  }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public int nextAccountGroupId() throws OrmException {
+    return delegate.nextAccountGroupId();
+  }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public int nextChangeId() throws OrmException {
+    return delegate.nextChangeId();
+  }
+
+  public static class ChangeAccessWrapper implements ChangeAccess {
+    protected final ChangeAccess delegate;
+
+    protected ChangeAccessWrapper(ChangeAccess delegate) {
+      this.delegate = requireNonNull(delegate);
+    }
+
+    @Override
+    public String getRelationName() {
+      return delegate.getRelationName();
+    }
+
+    @Override
+    public int getRelationID() {
+      return delegate.getRelationID();
+    }
+
+    @Override
+    public ResultSet<Change> iterateAllEntities() throws OrmException {
+      return delegate.iterateAllEntities();
+    }
+
+    @Override
+    public Change.Id primaryKey(Change entity) {
+      return delegate.primaryKey(entity);
+    }
+
+    @Override
+    public Map<Change.Id, Change> toMap(Iterable<Change> c) {
+      return delegate.toMap(c);
+    }
+
+    @SuppressWarnings("deprecation")
+    @Override
+    public com.google.common.util.concurrent.CheckedFuture<Change, OrmException> getAsync(
+        Change.Id key) {
+      return delegate.getAsync(key);
+    }
+
+    @Override
+    public ResultSet<Change> get(Iterable<Change.Id> keys) throws OrmException {
+      return delegate.get(keys);
+    }
+
+    @Override
+    public void insert(Iterable<Change> instances) throws OrmException {
+      delegate.insert(instances);
+    }
+
+    @Override
+    public void update(Iterable<Change> instances) throws OrmException {
+      delegate.update(instances);
+    }
+
+    @Override
+    public void upsert(Iterable<Change> instances) throws OrmException {
+      delegate.upsert(instances);
+    }
+
+    @Override
+    public void deleteKeys(Iterable<Change.Id> keys) throws OrmException {
+      delegate.deleteKeys(keys);
+    }
+
+    @Override
+    public void delete(Iterable<Change> instances) throws OrmException {
+      delegate.delete(instances);
+    }
+
+    @Override
+    public void beginTransaction(Change.Id key) throws OrmException {
+      delegate.beginTransaction(key);
+    }
+
+    @Override
+    public Change atomicUpdate(Change.Id key, AtomicUpdate<Change> update) throws OrmException {
+      return delegate.atomicUpdate(key, update);
+    }
+
+    @Override
+    public Change get(Change.Id id) throws OrmException {
+      return delegate.get(id);
+    }
+
+    @Override
+    public ResultSet<Change> all() throws OrmException {
+      return delegate.all();
+    }
+  }
+
+  public static class PatchSetApprovalAccessWrapper implements PatchSetApprovalAccess {
+    protected final PatchSetApprovalAccess delegate;
+
+    protected PatchSetApprovalAccessWrapper(PatchSetApprovalAccess delegate) {
+      this.delegate = delegate;
+    }
+
+    @Override
+    public String getRelationName() {
+      return delegate.getRelationName();
+    }
+
+    @Override
+    public int getRelationID() {
+      return delegate.getRelationID();
+    }
+
+    @Override
+    public ResultSet<PatchSetApproval> iterateAllEntities() throws OrmException {
+      return delegate.iterateAllEntities();
+    }
+
+    @Override
+    public PatchSetApproval.Key primaryKey(PatchSetApproval entity) {
+      return delegate.primaryKey(entity);
+    }
+
+    @Override
+    public Map<PatchSetApproval.Key, PatchSetApproval> toMap(Iterable<PatchSetApproval> c) {
+      return delegate.toMap(c);
+    }
+
+    @SuppressWarnings("deprecation")
+    @Override
+    public com.google.common.util.concurrent.CheckedFuture<PatchSetApproval, OrmException> getAsync(
+        PatchSetApproval.Key key) {
+      return delegate.getAsync(key);
+    }
+
+    @Override
+    public ResultSet<PatchSetApproval> get(Iterable<PatchSetApproval.Key> keys)
+        throws OrmException {
+      return delegate.get(keys);
+    }
+
+    @Override
+    public void insert(Iterable<PatchSetApproval> instances) throws OrmException {
+      delegate.insert(instances);
+    }
+
+    @Override
+    public void update(Iterable<PatchSetApproval> instances) throws OrmException {
+      delegate.update(instances);
+    }
+
+    @Override
+    public void upsert(Iterable<PatchSetApproval> instances) throws OrmException {
+      delegate.upsert(instances);
+    }
+
+    @Override
+    public void deleteKeys(Iterable<PatchSetApproval.Key> keys) throws OrmException {
+      delegate.deleteKeys(keys);
+    }
+
+    @Override
+    public void delete(Iterable<PatchSetApproval> instances) throws OrmException {
+      delegate.delete(instances);
+    }
+
+    @Override
+    public void beginTransaction(PatchSetApproval.Key key) throws OrmException {
+      delegate.beginTransaction(key);
+    }
+
+    @Override
+    public PatchSetApproval atomicUpdate(
+        PatchSetApproval.Key key, AtomicUpdate<PatchSetApproval> update) throws OrmException {
+      return delegate.atomicUpdate(key, update);
+    }
+
+    @Override
+    public PatchSetApproval get(PatchSetApproval.Key key) throws OrmException {
+      return delegate.get(key);
+    }
+
+    @Override
+    public ResultSet<PatchSetApproval> byChange(Change.Id id) throws OrmException {
+      return delegate.byChange(id);
+    }
+
+    @Override
+    public ResultSet<PatchSetApproval> byPatchSet(PatchSet.Id id) throws OrmException {
+      return delegate.byPatchSet(id);
+    }
+
+    @Override
+    public ResultSet<PatchSetApproval> byPatchSetUser(PatchSet.Id patchSet, Account.Id account)
+        throws OrmException {
+      return delegate.byPatchSetUser(patchSet, account);
+    }
+
+    @Override
+    public ResultSet<PatchSetApproval> all() throws OrmException {
+      return delegate.all();
+    }
+  }
+
+  public static class ChangeMessageAccessWrapper implements ChangeMessageAccess {
+    protected final ChangeMessageAccess delegate;
+
+    protected ChangeMessageAccessWrapper(ChangeMessageAccess delegate) {
+      this.delegate = delegate;
+    }
+
+    @Override
+    public String getRelationName() {
+      return delegate.getRelationName();
+    }
+
+    @Override
+    public int getRelationID() {
+      return delegate.getRelationID();
+    }
+
+    @Override
+    public ResultSet<ChangeMessage> iterateAllEntities() throws OrmException {
+      return delegate.iterateAllEntities();
+    }
+
+    @Override
+    public ChangeMessage.Key primaryKey(ChangeMessage entity) {
+      return delegate.primaryKey(entity);
+    }
+
+    @Override
+    public Map<ChangeMessage.Key, ChangeMessage> toMap(Iterable<ChangeMessage> c) {
+      return delegate.toMap(c);
+    }
+
+    @SuppressWarnings("deprecation")
+    @Override
+    public com.google.common.util.concurrent.CheckedFuture<ChangeMessage, OrmException> getAsync(
+        ChangeMessage.Key key) {
+      return delegate.getAsync(key);
+    }
+
+    @Override
+    public ResultSet<ChangeMessage> get(Iterable<ChangeMessage.Key> keys) throws OrmException {
+      return delegate.get(keys);
+    }
+
+    @Override
+    public void insert(Iterable<ChangeMessage> instances) throws OrmException {
+      delegate.insert(instances);
+    }
+
+    @Override
+    public void update(Iterable<ChangeMessage> instances) throws OrmException {
+      delegate.update(instances);
+    }
+
+    @Override
+    public void upsert(Iterable<ChangeMessage> instances) throws OrmException {
+      delegate.upsert(instances);
+    }
+
+    @Override
+    public void deleteKeys(Iterable<ChangeMessage.Key> keys) throws OrmException {
+      delegate.deleteKeys(keys);
+    }
+
+    @Override
+    public void delete(Iterable<ChangeMessage> instances) throws OrmException {
+      delegate.delete(instances);
+    }
+
+    @Override
+    public void beginTransaction(ChangeMessage.Key key) throws OrmException {
+      delegate.beginTransaction(key);
+    }
+
+    @Override
+    public ChangeMessage atomicUpdate(ChangeMessage.Key key, AtomicUpdate<ChangeMessage> update)
+        throws OrmException {
+      return delegate.atomicUpdate(key, update);
+    }
+
+    @Override
+    public ChangeMessage get(ChangeMessage.Key id) throws OrmException {
+      return delegate.get(id);
+    }
+
+    @Override
+    public ResultSet<ChangeMessage> byChange(Change.Id id) throws OrmException {
+      return delegate.byChange(id);
+    }
+
+    @Override
+    public ResultSet<ChangeMessage> byPatchSet(PatchSet.Id id) throws OrmException {
+      return delegate.byPatchSet(id);
+    }
+
+    @Override
+    public ResultSet<ChangeMessage> all() throws OrmException {
+      return delegate.all();
+    }
+  }
+
+  public static class PatchSetAccessWrapper implements PatchSetAccess {
+    protected final PatchSetAccess delegate;
+
+    protected PatchSetAccessWrapper(PatchSetAccess delegate) {
+      this.delegate = delegate;
+    }
+
+    @Override
+    public String getRelationName() {
+      return delegate.getRelationName();
+    }
+
+    @Override
+    public int getRelationID() {
+      return delegate.getRelationID();
+    }
+
+    @Override
+    public ResultSet<PatchSet> iterateAllEntities() throws OrmException {
+      return delegate.iterateAllEntities();
+    }
+
+    @Override
+    public PatchSet.Id primaryKey(PatchSet entity) {
+      return delegate.primaryKey(entity);
+    }
+
+    @Override
+    public Map<PatchSet.Id, PatchSet> toMap(Iterable<PatchSet> c) {
+      return delegate.toMap(c);
+    }
+
+    @SuppressWarnings("deprecation")
+    @Override
+    public com.google.common.util.concurrent.CheckedFuture<PatchSet, OrmException> getAsync(
+        PatchSet.Id key) {
+      return delegate.getAsync(key);
+    }
+
+    @Override
+    public ResultSet<PatchSet> get(Iterable<PatchSet.Id> keys) throws OrmException {
+      return delegate.get(keys);
+    }
+
+    @Override
+    public void insert(Iterable<PatchSet> instances) throws OrmException {
+      delegate.insert(instances);
+    }
+
+    @Override
+    public void update(Iterable<PatchSet> instances) throws OrmException {
+      delegate.update(instances);
+    }
+
+    @Override
+    public void upsert(Iterable<PatchSet> instances) throws OrmException {
+      delegate.upsert(instances);
+    }
+
+    @Override
+    public void deleteKeys(Iterable<PatchSet.Id> keys) throws OrmException {
+      delegate.deleteKeys(keys);
+    }
+
+    @Override
+    public void delete(Iterable<PatchSet> instances) throws OrmException {
+      delegate.delete(instances);
+    }
+
+    @Override
+    public void beginTransaction(PatchSet.Id key) throws OrmException {
+      delegate.beginTransaction(key);
+    }
+
+    @Override
+    public PatchSet atomicUpdate(PatchSet.Id key, AtomicUpdate<PatchSet> update)
+        throws OrmException {
+      return delegate.atomicUpdate(key, update);
+    }
+
+    @Override
+    public PatchSet get(PatchSet.Id id) throws OrmException {
+      return delegate.get(id);
+    }
+
+    @Override
+    public ResultSet<PatchSet> byChange(Change.Id id) throws OrmException {
+      return delegate.byChange(id);
+    }
+
+    @Override
+    public ResultSet<PatchSet> all() throws OrmException {
+      return delegate.all();
+    }
+  }
+
+  public static class PatchLineCommentAccessWrapper implements PatchLineCommentAccess {
+    protected PatchLineCommentAccess delegate;
+
+    protected PatchLineCommentAccessWrapper(PatchLineCommentAccess delegate) {
+      this.delegate = delegate;
+    }
+
+    @Override
+    public String getRelationName() {
+      return delegate.getRelationName();
+    }
+
+    @Override
+    public int getRelationID() {
+      return delegate.getRelationID();
+    }
+
+    @Override
+    public ResultSet<PatchLineComment> iterateAllEntities() throws OrmException {
+      return delegate.iterateAllEntities();
+    }
+
+    @Override
+    public PatchLineComment.Key primaryKey(PatchLineComment entity) {
+      return delegate.primaryKey(entity);
+    }
+
+    @Override
+    public Map<PatchLineComment.Key, PatchLineComment> toMap(Iterable<PatchLineComment> c) {
+      return delegate.toMap(c);
+    }
+
+    @SuppressWarnings("deprecation")
+    @Override
+    public com.google.common.util.concurrent.CheckedFuture<PatchLineComment, OrmException> getAsync(
+        PatchLineComment.Key key) {
+      return delegate.getAsync(key);
+    }
+
+    @Override
+    public ResultSet<PatchLineComment> get(Iterable<PatchLineComment.Key> keys)
+        throws OrmException {
+      return delegate.get(keys);
+    }
+
+    @Override
+    public void insert(Iterable<PatchLineComment> instances) throws OrmException {
+      delegate.insert(instances);
+    }
+
+    @Override
+    public void update(Iterable<PatchLineComment> instances) throws OrmException {
+      delegate.update(instances);
+    }
+
+    @Override
+    public void upsert(Iterable<PatchLineComment> instances) throws OrmException {
+      delegate.upsert(instances);
+    }
+
+    @Override
+    public void deleteKeys(Iterable<PatchLineComment.Key> keys) throws OrmException {
+      delegate.deleteKeys(keys);
+    }
+
+    @Override
+    public void delete(Iterable<PatchLineComment> instances) throws OrmException {
+      delegate.delete(instances);
+    }
+
+    @Override
+    public void beginTransaction(PatchLineComment.Key key) throws OrmException {
+      delegate.beginTransaction(key);
+    }
+
+    @Override
+    public PatchLineComment atomicUpdate(
+        PatchLineComment.Key key, AtomicUpdate<PatchLineComment> update) throws OrmException {
+      return delegate.atomicUpdate(key, update);
+    }
+
+    @Override
+    public PatchLineComment get(PatchLineComment.Key id) throws OrmException {
+      return delegate.get(id);
+    }
+
+    @Override
+    public ResultSet<PatchLineComment> byChange(Change.Id id) throws OrmException {
+      return delegate.byChange(id);
+    }
+
+    @Override
+    public ResultSet<PatchLineComment> byPatchSet(PatchSet.Id id) throws OrmException {
+      return delegate.byPatchSet(id);
+    }
+
+    @Override
+    public ResultSet<PatchLineComment> publishedByChangeFile(Change.Id id, String file)
+        throws OrmException {
+      return delegate.publishedByChangeFile(id, file);
+    }
+
+    @Override
+    public ResultSet<PatchLineComment> publishedByPatchSet(PatchSet.Id patchset)
+        throws OrmException {
+      return delegate.publishedByPatchSet(patchset);
+    }
+
+    @Override
+    public ResultSet<PatchLineComment> draftByPatchSetAuthor(
+        PatchSet.Id patchset, Account.Id author) throws OrmException {
+      return delegate.draftByPatchSetAuthor(patchset, author);
+    }
+
+    @Override
+    public ResultSet<PatchLineComment> draftByChangeFileAuthor(
+        Change.Id id, String file, Account.Id author) throws OrmException {
+      return delegate.draftByChangeFileAuthor(id, file, author);
+    }
+
+    @Override
+    public ResultSet<PatchLineComment> draftByAuthor(Account.Id author) throws OrmException {
+      return delegate.draftByAuthor(author);
+    }
+
+    @Override
+    public ResultSet<PatchLineComment> all() throws OrmException {
+      return delegate.all();
+    }
+  }
+
+  public static class AccountGroupAccessWrapper implements AccountGroupAccess {
+    protected final AccountGroupAccess delegate;
+
+    protected AccountGroupAccessWrapper(AccountGroupAccess delegate) {
+      this.delegate = requireNonNull(delegate);
+    }
+
+    @Override
+    public String getRelationName() {
+      return delegate.getRelationName();
+    }
+
+    @Override
+    public int getRelationID() {
+      return delegate.getRelationID();
+    }
+
+    @Override
+    public ResultSet<AccountGroup> iterateAllEntities() throws OrmException {
+      return delegate.iterateAllEntities();
+    }
+
+    @Override
+    public AccountGroup.Id primaryKey(AccountGroup entity) {
+      return delegate.primaryKey(entity);
+    }
+
+    @Override
+    public Map<AccountGroup.Id, AccountGroup> toMap(Iterable<AccountGroup> c) {
+      return delegate.toMap(c);
+    }
+
+    @SuppressWarnings("deprecation")
+    @Override
+    public com.google.common.util.concurrent.CheckedFuture<AccountGroup, OrmException> getAsync(
+        AccountGroup.Id key) {
+      return delegate.getAsync(key);
+    }
+
+    @Override
+    public ResultSet<AccountGroup> get(Iterable<AccountGroup.Id> keys) throws OrmException {
+      return delegate.get(keys);
+    }
+
+    @Override
+    public void insert(Iterable<AccountGroup> instances) throws OrmException {
+      delegate.insert(instances);
+    }
+
+    @Override
+    public void update(Iterable<AccountGroup> instances) throws OrmException {
+      delegate.update(instances);
+    }
+
+    @Override
+    public void upsert(Iterable<AccountGroup> instances) throws OrmException {
+      delegate.upsert(instances);
+    }
+
+    @Override
+    public void deleteKeys(Iterable<AccountGroup.Id> keys) throws OrmException {
+      delegate.deleteKeys(keys);
+    }
+
+    @Override
+    public void delete(Iterable<AccountGroup> instances) throws OrmException {
+      delegate.delete(instances);
+    }
+
+    @Override
+    public void beginTransaction(AccountGroup.Id key) throws OrmException {
+      delegate.beginTransaction(key);
+    }
+
+    @Override
+    public AccountGroup atomicUpdate(AccountGroup.Id key, AtomicUpdate<AccountGroup> update)
+        throws OrmException {
+      return delegate.atomicUpdate(key, update);
+    }
+
+    @Override
+    public AccountGroup get(AccountGroup.Id id) throws OrmException {
+      return delegate.get(id);
+    }
+
+    @Override
+    public ResultSet<AccountGroup> byUUID(AccountGroup.UUID uuid) throws OrmException {
+      return delegate.byUUID(uuid);
+    }
+
+    @Override
+    public ResultSet<AccountGroup> all() throws OrmException {
+      return delegate.all();
+    }
+  }
+
+  public static class AccountGroupNameAccessWrapper implements AccountGroupNameAccess {
+    protected final AccountGroupNameAccess delegate;
+
+    protected AccountGroupNameAccessWrapper(AccountGroupNameAccess delegate) {
+      this.delegate = requireNonNull(delegate);
+    }
+
+    @Override
+    public String getRelationName() {
+      return delegate.getRelationName();
+    }
+
+    @Override
+    public int getRelationID() {
+      return delegate.getRelationID();
+    }
+
+    @Override
+    public ResultSet<AccountGroupName> iterateAllEntities() throws OrmException {
+      return delegate.iterateAllEntities();
+    }
+
+    @Override
+    public AccountGroup.NameKey primaryKey(AccountGroupName entity) {
+      return delegate.primaryKey(entity);
+    }
+
+    @Override
+    public Map<AccountGroup.NameKey, AccountGroupName> toMap(Iterable<AccountGroupName> c) {
+      return delegate.toMap(c);
+    }
+
+    @SuppressWarnings("deprecation")
+    @Override
+    public com.google.common.util.concurrent.CheckedFuture<AccountGroupName, OrmException> getAsync(
+        AccountGroup.NameKey key) {
+      return delegate.getAsync(key);
+    }
+
+    @Override
+    public ResultSet<AccountGroupName> get(Iterable<AccountGroup.NameKey> keys)
+        throws OrmException {
+      return delegate.get(keys);
+    }
+
+    @Override
+    public void insert(Iterable<AccountGroupName> instances) throws OrmException {
+      delegate.insert(instances);
+    }
+
+    @Override
+    public void update(Iterable<AccountGroupName> instances) throws OrmException {
+      delegate.update(instances);
+    }
+
+    @Override
+    public void upsert(Iterable<AccountGroupName> instances) throws OrmException {
+      delegate.upsert(instances);
+    }
+
+    @Override
+    public void deleteKeys(Iterable<AccountGroup.NameKey> keys) throws OrmException {
+      delegate.deleteKeys(keys);
+    }
+
+    @Override
+    public void delete(Iterable<AccountGroupName> instances) throws OrmException {
+      delegate.delete(instances);
+    }
+
+    @Override
+    public void beginTransaction(AccountGroup.NameKey key) throws OrmException {
+      delegate.beginTransaction(key);
+    }
+
+    @Override
+    public AccountGroupName atomicUpdate(
+        AccountGroup.NameKey key, AtomicUpdate<AccountGroupName> update) throws OrmException {
+      return delegate.atomicUpdate(key, update);
+    }
+
+    @Override
+    public AccountGroupName get(AccountGroup.NameKey name) throws OrmException {
+      return delegate.get(name);
+    }
+
+    @Override
+    public ResultSet<AccountGroupName> all() throws OrmException {
+      return delegate.all();
+    }
+  }
+
+  public static class AccountGroupMemberAccessWrapper implements AccountGroupMemberAccess {
+    protected final AccountGroupMemberAccess delegate;
+
+    protected AccountGroupMemberAccessWrapper(AccountGroupMemberAccess delegate) {
+      this.delegate = requireNonNull(delegate);
+    }
+
+    @Override
+    public String getRelationName() {
+      return delegate.getRelationName();
+    }
+
+    @Override
+    public int getRelationID() {
+      return delegate.getRelationID();
+    }
+
+    @Override
+    public ResultSet<AccountGroupMember> iterateAllEntities() throws OrmException {
+      return delegate.iterateAllEntities();
+    }
+
+    @Override
+    public AccountGroupMember.Key primaryKey(AccountGroupMember entity) {
+      return delegate.primaryKey(entity);
+    }
+
+    @Override
+    public Map<AccountGroupMember.Key, AccountGroupMember> toMap(Iterable<AccountGroupMember> c) {
+      return delegate.toMap(c);
+    }
+
+    @SuppressWarnings("deprecation")
+    @Override
+    public com.google.common.util.concurrent.CheckedFuture<AccountGroupMember, OrmException>
+        getAsync(AccountGroupMember.Key key) {
+      return delegate.getAsync(key);
+    }
+
+    @Override
+    public ResultSet<AccountGroupMember> get(Iterable<AccountGroupMember.Key> keys)
+        throws OrmException {
+      return delegate.get(keys);
+    }
+
+    @Override
+    public void insert(Iterable<AccountGroupMember> instances) throws OrmException {
+      delegate.insert(instances);
+    }
+
+    @Override
+    public void update(Iterable<AccountGroupMember> instances) throws OrmException {
+      delegate.update(instances);
+    }
+
+    @Override
+    public void upsert(Iterable<AccountGroupMember> instances) throws OrmException {
+      delegate.upsert(instances);
+    }
+
+    @Override
+    public void deleteKeys(Iterable<AccountGroupMember.Key> keys) throws OrmException {
+      delegate.deleteKeys(keys);
+    }
+
+    @Override
+    public void delete(Iterable<AccountGroupMember> instances) throws OrmException {
+      delegate.delete(instances);
+    }
+
+    @Override
+    public void beginTransaction(AccountGroupMember.Key key) throws OrmException {
+      delegate.beginTransaction(key);
+    }
+
+    @Override
+    public AccountGroupMember atomicUpdate(
+        AccountGroupMember.Key key, AtomicUpdate<AccountGroupMember> update) throws OrmException {
+      return delegate.atomicUpdate(key, update);
+    }
+
+    @Override
+    public AccountGroupMember get(AccountGroupMember.Key key) throws OrmException {
+      return delegate.get(key);
+    }
+
+    @Override
+    public ResultSet<AccountGroupMember> byAccount(Account.Id id) throws OrmException {
+      return delegate.byAccount(id);
+    }
+
+    @Override
+    public ResultSet<AccountGroupMember> byGroup(AccountGroup.Id id) throws OrmException {
+      return delegate.byGroup(id);
+    }
+  }
+
+  public static class AccountGroupMemberAuditAccessWrapper
+      implements AccountGroupMemberAuditAccess {
+    protected final AccountGroupMemberAuditAccess delegate;
+
+    protected AccountGroupMemberAuditAccessWrapper(AccountGroupMemberAuditAccess delegate) {
+      this.delegate = requireNonNull(delegate);
+    }
+
+    @Override
+    public String getRelationName() {
+      return delegate.getRelationName();
+    }
+
+    @Override
+    public int getRelationID() {
+      return delegate.getRelationID();
+    }
+
+    @Override
+    public ResultSet<AccountGroupMemberAudit> iterateAllEntities() throws OrmException {
+      return delegate.iterateAllEntities();
+    }
+
+    @Override
+    public AccountGroupMemberAudit.Key primaryKey(AccountGroupMemberAudit entity) {
+      return delegate.primaryKey(entity);
+    }
+
+    @Override
+    public Map<AccountGroupMemberAudit.Key, AccountGroupMemberAudit> toMap(
+        Iterable<AccountGroupMemberAudit> c) {
+      return delegate.toMap(c);
+    }
+
+    @SuppressWarnings("deprecation")
+    @Override
+    public com.google.common.util.concurrent.CheckedFuture<AccountGroupMemberAudit, OrmException>
+        getAsync(AccountGroupMemberAudit.Key key) {
+      return delegate.getAsync(key);
+    }
+
+    @Override
+    public ResultSet<AccountGroupMemberAudit> get(Iterable<AccountGroupMemberAudit.Key> keys)
+        throws OrmException {
+      return delegate.get(keys);
+    }
+
+    @Override
+    public void insert(Iterable<AccountGroupMemberAudit> instances) throws OrmException {
+      delegate.insert(instances);
+    }
+
+    @Override
+    public void update(Iterable<AccountGroupMemberAudit> instances) throws OrmException {
+      delegate.update(instances);
+    }
+
+    @Override
+    public void upsert(Iterable<AccountGroupMemberAudit> instances) throws OrmException {
+      delegate.upsert(instances);
+    }
+
+    @Override
+    public void deleteKeys(Iterable<AccountGroupMemberAudit.Key> keys) throws OrmException {
+      delegate.deleteKeys(keys);
+    }
+
+    @Override
+    public void delete(Iterable<AccountGroupMemberAudit> instances) throws OrmException {
+      delegate.delete(instances);
+    }
+
+    @Override
+    public void beginTransaction(AccountGroupMemberAudit.Key key) throws OrmException {
+      delegate.beginTransaction(key);
+    }
+
+    @Override
+    public AccountGroupMemberAudit atomicUpdate(
+        AccountGroupMemberAudit.Key key, AtomicUpdate<AccountGroupMemberAudit> update)
+        throws OrmException {
+      return delegate.atomicUpdate(key, update);
+    }
+
+    @Override
+    public AccountGroupMemberAudit get(AccountGroupMemberAudit.Key key) throws OrmException {
+      return delegate.get(key);
+    }
+
+    @Override
+    public ResultSet<AccountGroupMemberAudit> byGroupAccount(
+        AccountGroup.Id groupId, Account.Id accountId) throws OrmException {
+      return delegate.byGroupAccount(groupId, accountId);
+    }
+
+    @Override
+    public ResultSet<AccountGroupMemberAudit> byGroup(AccountGroup.Id groupId) throws OrmException {
+      return delegate.byGroup(groupId);
+    }
+  }
+
+  public static class AccountGroupByIdAccessWrapper implements AccountGroupByIdAccess {
+    protected final AccountGroupByIdAccess delegate;
+
+    protected AccountGroupByIdAccessWrapper(AccountGroupByIdAccess delegate) {
+      this.delegate = requireNonNull(delegate);
+    }
+
+    @Override
+    public String getRelationName() {
+      return delegate.getRelationName();
+    }
+
+    @Override
+    public int getRelationID() {
+      return delegate.getRelationID();
+    }
+
+    @Override
+    public ResultSet<AccountGroupById> iterateAllEntities() throws OrmException {
+      return delegate.iterateAllEntities();
+    }
+
+    @Override
+    public AccountGroupById.Key primaryKey(AccountGroupById entity) {
+      return delegate.primaryKey(entity);
+    }
+
+    @Override
+    public Map<AccountGroupById.Key, AccountGroupById> toMap(Iterable<AccountGroupById> c) {
+      return delegate.toMap(c);
+    }
+
+    @SuppressWarnings("deprecation")
+    @Override
+    public com.google.common.util.concurrent.CheckedFuture<AccountGroupById, OrmException> getAsync(
+        AccountGroupById.Key key) {
+      return delegate.getAsync(key);
+    }
+
+    @Override
+    public ResultSet<AccountGroupById> get(Iterable<AccountGroupById.Key> keys)
+        throws OrmException {
+      return delegate.get(keys);
+    }
+
+    @Override
+    public void insert(Iterable<AccountGroupById> instances) throws OrmException {
+      delegate.insert(instances);
+    }
+
+    @Override
+    public void update(Iterable<AccountGroupById> instances) throws OrmException {
+      delegate.update(instances);
+    }
+
+    @Override
+    public void upsert(Iterable<AccountGroupById> instances) throws OrmException {
+      delegate.upsert(instances);
+    }
+
+    @Override
+    public void deleteKeys(Iterable<AccountGroupById.Key> keys) throws OrmException {
+      delegate.deleteKeys(keys);
+    }
+
+    @Override
+    public void delete(Iterable<AccountGroupById> instances) throws OrmException {
+      delegate.delete(instances);
+    }
+
+    @Override
+    public void beginTransaction(AccountGroupById.Key key) throws OrmException {
+      delegate.beginTransaction(key);
+    }
+
+    @Override
+    public AccountGroupById atomicUpdate(
+        AccountGroupById.Key key, AtomicUpdate<AccountGroupById> update) throws OrmException {
+      return delegate.atomicUpdate(key, update);
+    }
+
+    @Override
+    public AccountGroupById get(AccountGroupById.Key key) throws OrmException {
+      return delegate.get(key);
+    }
+
+    @Override
+    public ResultSet<AccountGroupById> byIncludeUUID(AccountGroup.UUID uuid) throws OrmException {
+      return delegate.byIncludeUUID(uuid);
+    }
+
+    @Override
+    public ResultSet<AccountGroupById> byGroup(AccountGroup.Id id) throws OrmException {
+      return delegate.byGroup(id);
+    }
+
+    @Override
+    public ResultSet<AccountGroupById> all() throws OrmException {
+      return delegate.all();
+    }
+  }
+
+  public static class AccountGroupByIdAudAccessWrapper implements AccountGroupByIdAudAccess {
+    protected final AccountGroupByIdAudAccess delegate;
+
+    protected AccountGroupByIdAudAccessWrapper(AccountGroupByIdAudAccess delegate) {
+      this.delegate = requireNonNull(delegate);
+    }
+
+    @Override
+    public String getRelationName() {
+      return delegate.getRelationName();
+    }
+
+    @Override
+    public int getRelationID() {
+      return delegate.getRelationID();
+    }
+
+    @Override
+    public ResultSet<AccountGroupByIdAud> iterateAllEntities() throws OrmException {
+      return delegate.iterateAllEntities();
+    }
+
+    @Override
+    public AccountGroupByIdAud.Key primaryKey(AccountGroupByIdAud entity) {
+      return delegate.primaryKey(entity);
+    }
+
+    @Override
+    public Map<AccountGroupByIdAud.Key, AccountGroupByIdAud> toMap(
+        Iterable<AccountGroupByIdAud> c) {
+      return delegate.toMap(c);
+    }
+
+    @SuppressWarnings("deprecation")
+    @Override
+    public com.google.common.util.concurrent.CheckedFuture<AccountGroupByIdAud, OrmException>
+        getAsync(AccountGroupByIdAud.Key key) {
+      return delegate.getAsync(key);
+    }
+
+    @Override
+    public ResultSet<AccountGroupByIdAud> get(Iterable<AccountGroupByIdAud.Key> keys)
+        throws OrmException {
+      return delegate.get(keys);
+    }
+
+    @Override
+    public void insert(Iterable<AccountGroupByIdAud> instances) throws OrmException {
+      delegate.insert(instances);
+    }
+
+    @Override
+    public void update(Iterable<AccountGroupByIdAud> instances) throws OrmException {
+      delegate.update(instances);
+    }
+
+    @Override
+    public void upsert(Iterable<AccountGroupByIdAud> instances) throws OrmException {
+      delegate.upsert(instances);
+    }
+
+    @Override
+    public void deleteKeys(Iterable<AccountGroupByIdAud.Key> keys) throws OrmException {
+      delegate.deleteKeys(keys);
+    }
+
+    @Override
+    public void delete(Iterable<AccountGroupByIdAud> instances) throws OrmException {
+      delegate.delete(instances);
+    }
+
+    @Override
+    public void beginTransaction(AccountGroupByIdAud.Key key) throws OrmException {
+      delegate.beginTransaction(key);
+    }
+
+    @Override
+    public AccountGroupByIdAud atomicUpdate(
+        AccountGroupByIdAud.Key key, AtomicUpdate<AccountGroupByIdAud> update) throws OrmException {
+      return delegate.atomicUpdate(key, update);
+    }
+
+    @Override
+    public AccountGroupByIdAud get(AccountGroupByIdAud.Key key) throws OrmException {
+      return delegate.get(key);
+    }
+
+    @Override
+    public ResultSet<AccountGroupByIdAud> byGroupInclude(
+        AccountGroup.Id groupId, AccountGroup.UUID incGroupUUID) throws OrmException {
+      return delegate.byGroupInclude(groupId, incGroupUUID);
+    }
+
+    @Override
+    public ResultSet<AccountGroupByIdAud> byGroup(AccountGroup.Id groupId) throws OrmException {
+      return delegate.byGroup(groupId);
+    }
+  }
+}
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/SchemaVersionAccess.java b/java/com/google/gerrit/reviewdb/server/SchemaVersionAccess.java
similarity index 100%
rename from gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/SchemaVersionAccess.java
rename to java/com/google/gerrit/reviewdb/server/SchemaVersionAccess.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/AccessPath.java b/java/com/google/gerrit/server/AccessPath.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/AccessPath.java
rename to java/com/google/gerrit/server/AccessPath.java
diff --git a/java/com/google/gerrit/server/AnonymousUser.java b/java/com/google/gerrit/server/AnonymousUser.java
new file mode 100644
index 0000000..91d2d05
--- /dev/null
+++ b/java/com/google/gerrit/server/AnonymousUser.java
@@ -0,0 +1,39 @@
+// Copyright (C) 2009 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.google.gerrit.server;
+
+import com.google.gerrit.server.account.GroupMembership;
+import com.google.gerrit.server.account.ListGroupMembership;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import java.util.Collections;
+
+/** An anonymous user who has not yet authenticated. */
+public class AnonymousUser extends CurrentUser {
+  @Override
+  public GroupMembership getEffectiveGroups() {
+    return new ListGroupMembership(Collections.singleton(SystemGroupBackend.ANONYMOUS_USERS));
+  }
+
+  @Override
+  public Object getCacheKey() {
+    // Treat all anonymous users as a single user
+    return "anonymous";
+  }
+
+  @Override
+  public String toString() {
+    return "ANONYMOUS";
+  }
+}
diff --git a/java/com/google/gerrit/server/ApprovalCopier.java b/java/com/google/gerrit/server/ApprovalCopier.java
new file mode 100644
index 0000000..c3d3b60
--- /dev/null
+++ b/java/com/google/gerrit/server/ApprovalCopier.java
@@ -0,0 +1,257 @@
+// Copyright (C) 2014 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.google.gerrit.server;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.HashBasedTable;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Table;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.extensions.client.ChangeKind;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.change.ChangeKindCache;
+import com.google.gerrit.server.change.LabelNormalizer;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.TreeMap;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+/**
+ * Copies approvals between patch sets.
+ *
+ * <p>The result of a copy may either be stored, as when stamping approvals in the database at
+ * submit time, or refreshed on demand, as when reading approvals from the NoteDb.
+ */
+@Singleton
+public class ApprovalCopier {
+  private final ProjectCache projectCache;
+  private final ChangeKindCache changeKindCache;
+  private final LabelNormalizer labelNormalizer;
+  private final ChangeData.Factory changeDataFactory;
+  private final PatchSetUtil psUtil;
+
+  @Inject
+  ApprovalCopier(
+      ProjectCache projectCache,
+      ChangeKindCache changeKindCache,
+      LabelNormalizer labelNormalizer,
+      ChangeData.Factory changeDataFactory,
+      PatchSetUtil psUtil) {
+    this.projectCache = projectCache;
+    this.changeKindCache = changeKindCache;
+    this.labelNormalizer = labelNormalizer;
+    this.changeDataFactory = changeDataFactory;
+    this.psUtil = psUtil;
+  }
+
+  /**
+   * Apply approval copy settings from prior PatchSets to a new PatchSet.
+   *
+   * @param db review database.
+   * @param notes change notes for user uploading PatchSet
+   * @param ps new PatchSet
+   * @param rw open walk that can read the patch set commit; null to open the repo on demand.
+   * @param repoConfig repo config used for change kind detection; null to read from repo on demand.
+   * @throws OrmException
+   */
+  public void copyInReviewDb(
+      ReviewDb db,
+      ChangeNotes notes,
+      PatchSet ps,
+      @Nullable RevWalk rw,
+      @Nullable Config repoConfig)
+      throws OrmException {
+    copyInReviewDb(db, notes, ps, rw, repoConfig, Collections.emptyList());
+  }
+
+  /**
+   * Apply approval copy settings from prior PatchSets to a new PatchSet.
+   *
+   * @param db review database.
+   * @param notes change notes for user uploading PatchSet
+   * @param ps new PatchSet
+   * @param rw open walk that can read the patch set commit; null to open the repo on demand.
+   * @param repoConfig repo config used for change kind detection; null to read from repo on demand.
+   * @param dontCopy PatchSetApprovals indicating which (account, label) pairs should not be copied
+   * @throws OrmException
+   */
+  public void copyInReviewDb(
+      ReviewDb db,
+      ChangeNotes notes,
+      PatchSet ps,
+      @Nullable RevWalk rw,
+      @Nullable Config repoConfig,
+      Iterable<PatchSetApproval> dontCopy)
+      throws OrmException {
+    if (PrimaryStorage.of(notes.getChange()) == PrimaryStorage.REVIEW_DB) {
+      db.patchSetApprovals().insert(getForPatchSet(db, notes, ps, rw, repoConfig, dontCopy));
+    }
+  }
+
+  Iterable<PatchSetApproval> getForPatchSet(
+      ReviewDb db,
+      ChangeNotes notes,
+      PatchSet.Id psId,
+      @Nullable RevWalk rw,
+      @Nullable Config repoConfig)
+      throws OrmException {
+    return getForPatchSet(
+        db, notes, psId, rw, repoConfig, Collections.<PatchSetApproval>emptyList());
+  }
+
+  Iterable<PatchSetApproval> getForPatchSet(
+      ReviewDb db,
+      ChangeNotes notes,
+      PatchSet.Id psId,
+      @Nullable RevWalk rw,
+      @Nullable Config repoConfig,
+      Iterable<PatchSetApproval> dontCopy)
+      throws OrmException {
+    PatchSet ps = psUtil.get(db, notes, psId);
+    if (ps == null) {
+      return Collections.emptyList();
+    }
+    return getForPatchSet(db, notes, ps, rw, repoConfig, dontCopy);
+  }
+
+  private Iterable<PatchSetApproval> getForPatchSet(
+      ReviewDb db,
+      ChangeNotes notes,
+      PatchSet ps,
+      @Nullable RevWalk rw,
+      @Nullable Config repoConfig,
+      Iterable<PatchSetApproval> dontCopy)
+      throws OrmException {
+    requireNonNull(ps, "ps should not be null");
+    ChangeData cd = changeDataFactory.create(db, notes);
+    try {
+      ProjectState project = projectCache.checkedGet(cd.change().getDest().getParentKey());
+      ListMultimap<PatchSet.Id, PatchSetApproval> all = cd.approvals();
+      requireNonNull(all, "all should not be null");
+
+      Table<String, Account.Id, PatchSetApproval> wontCopy = HashBasedTable.create();
+      for (PatchSetApproval psa : dontCopy) {
+        wontCopy.put(psa.getLabel(), psa.getAccountId(), psa);
+      }
+
+      Table<String, Account.Id, PatchSetApproval> byUser = HashBasedTable.create();
+      for (PatchSetApproval psa : all.get(ps.getId())) {
+        if (!wontCopy.contains(psa.getLabel(), psa.getAccountId())) {
+          byUser.put(psa.getLabel(), psa.getAccountId(), psa);
+        }
+      }
+
+      TreeMap<Integer, PatchSet> patchSets = getPatchSets(cd);
+
+      // Walk patch sets strictly less than current in descending order.
+      Collection<PatchSet> allPrior =
+          patchSets.descendingMap().tailMap(ps.getId().get(), false).values();
+      for (PatchSet priorPs : allPrior) {
+        List<PatchSetApproval> priorApprovals = all.get(priorPs.getId());
+        if (priorApprovals.isEmpty()) {
+          continue;
+        }
+
+        ChangeKind kind =
+            changeKindCache.getChangeKind(
+                project.getNameKey(),
+                rw,
+                repoConfig,
+                ObjectId.fromString(priorPs.getRevision().get()),
+                ObjectId.fromString(ps.getRevision().get()));
+
+        for (PatchSetApproval psa : priorApprovals) {
+          if (wontCopy.contains(psa.getLabel(), psa.getAccountId())) {
+            continue;
+          }
+          if (byUser.contains(psa.getLabel(), psa.getAccountId())) {
+            continue;
+          }
+          if (!canCopy(project, psa, ps.getId(), kind)) {
+            wontCopy.put(psa.getLabel(), psa.getAccountId(), psa);
+            continue;
+          }
+          byUser.put(psa.getLabel(), psa.getAccountId(), copy(psa, ps.getId()));
+        }
+      }
+      return labelNormalizer.normalize(notes, byUser.values()).getNormalized();
+    } catch (IOException e) {
+      throw new OrmException(e);
+    }
+  }
+
+  private static TreeMap<Integer, PatchSet> getPatchSets(ChangeData cd) throws OrmException {
+    Collection<PatchSet> patchSets = cd.patchSets();
+    TreeMap<Integer, PatchSet> result = new TreeMap<>();
+    for (PatchSet ps : patchSets) {
+      result.put(ps.getId().get(), ps);
+    }
+    return result;
+  }
+
+  private static boolean canCopy(
+      ProjectState project, PatchSetApproval psa, PatchSet.Id psId, ChangeKind kind) {
+    int n = psa.getKey().getParentKey().get();
+    checkArgument(n != psId.get());
+    LabelType type = project.getLabelTypes().byLabel(psa.getLabelId());
+    if (type == null) {
+      return false;
+    } else if ((type.isCopyMinScore() && type.isMaxNegative(psa))
+        || (type.isCopyMaxScore() && type.isMaxPositive(psa))) {
+      return true;
+    }
+    switch (kind) {
+      case MERGE_FIRST_PARENT_UPDATE:
+        return type.isCopyAllScoresOnMergeFirstParentUpdate();
+      case NO_CODE_CHANGE:
+        return type.isCopyAllScoresIfNoCodeChange();
+      case TRIVIAL_REBASE:
+        return type.isCopyAllScoresOnTrivialRebase();
+      case NO_CHANGE:
+        return type.isCopyAllScoresIfNoChange()
+            || type.isCopyAllScoresOnTrivialRebase()
+            || type.isCopyAllScoresOnMergeFirstParentUpdate()
+            || type.isCopyAllScoresIfNoCodeChange();
+      case REWORK:
+      default:
+        return false;
+    }
+  }
+
+  private static PatchSetApproval copy(PatchSetApproval src, PatchSet.Id psId) {
+    if (src.getKey().getParentKey().equals(psId)) {
+      return src;
+    }
+    return new PatchSetApproval(psId, src);
+  }
+}
diff --git a/java/com/google/gerrit/server/ApprovalsUtil.java b/java/com/google/gerrit/server/ApprovalsUtil.java
new file mode 100644
index 0000000..3625de6
--- /dev/null
+++ b/java/com/google/gerrit/server/ApprovalsUtil.java
@@ -0,0 +1,465 @@
+// Copyright (C) 2009 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.google.gerrit.server;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.gerrit.server.notedb.ReviewerStateInternal.CC;
+import static com.google.gerrit.server.notedb.ReviewerStateInternal.REVIEWER;
+import static java.util.Comparator.comparing;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Ordering;
+import com.google.common.collect.Sets;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.primitives.Shorts;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.LabelTypes;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.LabelId;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.client.PatchSetInfo;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gerrit.server.notedb.ReviewerStateInternal;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.LabelPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.util.LabelVote;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+/**
+ * Utility functions to manipulate patchset approvals.
+ *
+ * <p>Approvals are overloaded, they represent both approvals and reviewers which should be CCed on
+ * a change. To ensure that reviewers are not lost there must always be an approval on each patchset
+ * for each reviewer, even if the reviewer hasn't actually given a score to the change. To mark the
+ * "no score" case, a dummy approval, which may live in any of the available categories, with a
+ * score of 0 is used.
+ *
+ * <p>The methods in this class only modify the gwtorm database.
+ */
+@Singleton
+public class ApprovalsUtil {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final Ordering<PatchSetApproval> SORT_APPROVALS =
+      Ordering.from(comparing(PatchSetApproval::getGranted));
+
+  public static List<PatchSetApproval> sortApprovals(Iterable<PatchSetApproval> approvals) {
+    return SORT_APPROVALS.sortedCopy(approvals);
+  }
+
+  public static PatchSetApproval newApproval(
+      PatchSet.Id psId, CurrentUser user, LabelId labelId, int value, Date when) {
+    PatchSetApproval psa =
+        new PatchSetApproval(
+            new PatchSetApproval.Key(psId, user.getAccountId(), labelId),
+            Shorts.checkedCast(value),
+            when);
+    user.updateRealAccountId(psa::setRealAccountId);
+    return psa;
+  }
+
+  private static Iterable<PatchSetApproval> filterApprovals(
+      Iterable<PatchSetApproval> psas, Account.Id accountId) {
+    return Iterables.filter(psas, a -> Objects.equals(a.getAccountId(), accountId));
+  }
+
+  private final NotesMigration migration;
+  private final ApprovalCopier copier;
+  private final PermissionBackend permissionBackend;
+  private final ProjectCache projectCache;
+
+  @VisibleForTesting
+  @Inject
+  public ApprovalsUtil(
+      NotesMigration migration,
+      ApprovalCopier copier,
+      PermissionBackend permissionBackend,
+      ProjectCache projectCache) {
+    this.migration = migration;
+    this.copier = copier;
+    this.permissionBackend = permissionBackend;
+    this.projectCache = projectCache;
+  }
+
+  /**
+   * Get all reviewers for a change.
+   *
+   * @param db review database.
+   * @param notes change notes.
+   * @return reviewers for the change.
+   * @throws OrmException if reviewers for the change could not be read.
+   */
+  public ReviewerSet getReviewers(ReviewDb db, ChangeNotes notes) throws OrmException {
+    if (!migration.readChanges()) {
+      return ReviewerSet.fromApprovals(db.patchSetApprovals().byChange(notes.getChangeId()));
+    }
+    return notes.load().getReviewers();
+  }
+
+  /**
+   * Get all reviewers and CCed accounts for a change.
+   *
+   * @param allApprovals all approvals to consider; must all belong to the same change.
+   * @return reviewers for the change.
+   * @throws OrmException if reviewers for the change could not be read.
+   */
+  public ReviewerSet getReviewers(ChangeNotes notes, Iterable<PatchSetApproval> allApprovals)
+      throws OrmException {
+    if (!migration.readChanges()) {
+      return ReviewerSet.fromApprovals(allApprovals);
+    }
+    return notes.load().getReviewers();
+  }
+
+  /**
+   * Get updates to reviewer set. Always returns empty list for ReviewDb.
+   *
+   * @param notes change notes.
+   * @return reviewer updates for the change.
+   * @throws OrmException if reviewer updates for the change could not be read.
+   */
+  public List<ReviewerStatusUpdate> getReviewerUpdates(ChangeNotes notes) throws OrmException {
+    if (!migration.readChanges()) {
+      return ImmutableList.of();
+    }
+    return notes.load().getReviewerUpdates();
+  }
+
+  public List<PatchSetApproval> addReviewers(
+      ReviewDb db,
+      ChangeUpdate update,
+      LabelTypes labelTypes,
+      Change change,
+      PatchSet ps,
+      PatchSetInfo info,
+      Iterable<Account.Id> wantReviewers,
+      Collection<Account.Id> existingReviewers)
+      throws OrmException {
+    return addReviewers(
+        db,
+        update,
+        labelTypes,
+        change,
+        ps.getId(),
+        info.getAuthor().getAccount(),
+        info.getCommitter().getAccount(),
+        wantReviewers,
+        existingReviewers);
+  }
+
+  public List<PatchSetApproval> addReviewers(
+      ReviewDb db,
+      ChangeNotes notes,
+      ChangeUpdate update,
+      LabelTypes labelTypes,
+      Change change,
+      Iterable<Account.Id> wantReviewers)
+      throws OrmException {
+    PatchSet.Id psId = change.currentPatchSetId();
+    Collection<Account.Id> existingReviewers;
+    if (migration.readChanges()) {
+      // If using NoteDB, we only want reviewers in the REVIEWER state.
+      existingReviewers = notes.load().getReviewers().byState(REVIEWER);
+    } else {
+      // Prior to NoteDB, we gather all reviewers regardless of state.
+      existingReviewers = getReviewers(db, notes).all();
+    }
+    // Existing reviewers should include pending additions in the REVIEWER
+    // state, taken from ChangeUpdate.
+    existingReviewers = Lists.newArrayList(existingReviewers);
+    for (Map.Entry<Account.Id, ReviewerStateInternal> entry : update.getReviewers().entrySet()) {
+      if (entry.getValue() == REVIEWER) {
+        existingReviewers.add(entry.getKey());
+      }
+    }
+    return addReviewers(
+        db, update, labelTypes, change, psId, null, null, wantReviewers, existingReviewers);
+  }
+
+  private List<PatchSetApproval> addReviewers(
+      ReviewDb db,
+      ChangeUpdate update,
+      LabelTypes labelTypes,
+      Change change,
+      PatchSet.Id psId,
+      Account.Id authorId,
+      Account.Id committerId,
+      Iterable<Account.Id> wantReviewers,
+      Collection<Account.Id> existingReviewers)
+      throws OrmException {
+    List<LabelType> allTypes = labelTypes.getLabelTypes();
+    if (allTypes.isEmpty()) {
+      return ImmutableList.of();
+    }
+
+    Set<Account.Id> need = Sets.newLinkedHashSet(wantReviewers);
+    if (authorId != null && canSee(db, update.getNotes(), authorId)) {
+      need.add(authorId);
+    }
+
+    if (committerId != null && canSee(db, update.getNotes(), committerId)) {
+      need.add(committerId);
+    }
+    need.remove(change.getOwner());
+    need.removeAll(existingReviewers);
+    if (need.isEmpty()) {
+      return ImmutableList.of();
+    }
+
+    List<PatchSetApproval> cells = Lists.newArrayListWithCapacity(need.size());
+    LabelId labelId = Iterables.getLast(allTypes).getLabelId();
+    for (Account.Id account : need) {
+      cells.add(
+          new PatchSetApproval(
+              new PatchSetApproval.Key(psId, account, labelId), (short) 0, update.getWhen()));
+      update.putReviewer(account, REVIEWER);
+    }
+    db.patchSetApprovals().upsert(cells);
+    return Collections.unmodifiableList(cells);
+  }
+
+  private boolean canSee(ReviewDb db, ChangeNotes notes, Account.Id accountId) {
+    try {
+      if (!projectCache.checkedGet(notes.getProjectName()).statePermitsRead()) {
+        return false;
+      }
+      permissionBackend
+          .absentUser(accountId)
+          .change(notes)
+          .database(db)
+          .check(ChangePermission.READ);
+      return true;
+    } catch (AuthException e) {
+      return false;
+    } catch (IOException | PermissionBackendException e) {
+      logger.atWarning().withCause(e).log(
+          "Failed to check if account %d can see change %d",
+          accountId.get(), notes.getChangeId().get());
+      return false;
+    }
+  }
+
+  /**
+   * Adds accounts to a change as reviewers in the CC state.
+   *
+   * @param notes change notes.
+   * @param update change update.
+   * @param wantCCs accounts to CC.
+   * @return whether a change was made.
+   * @throws OrmException
+   */
+  public Collection<Account.Id> addCcs(
+      ChangeNotes notes, ChangeUpdate update, Collection<Account.Id> wantCCs) throws OrmException {
+    return addCcs(update, wantCCs, notes.load().getReviewers());
+  }
+
+  private Collection<Account.Id> addCcs(
+      ChangeUpdate update, Collection<Account.Id> wantCCs, ReviewerSet existingReviewers) {
+    Set<Account.Id> need = new LinkedHashSet<>(wantCCs);
+    need.removeAll(existingReviewers.all());
+    need.removeAll(update.getReviewers().keySet());
+    for (Account.Id account : need) {
+      update.putReviewer(account, CC);
+    }
+    return need;
+  }
+
+  /**
+   * Adds approvals to ChangeUpdate for a new patch set, and writes to ReviewDb.
+   *
+   * @param db review database.
+   * @param update change update.
+   * @param labelTypes label types for the containing project.
+   * @param ps patch set being approved.
+   * @param user user adding approvals.
+   * @param approvals approvals to add.
+   * @throws RestApiException
+   * @throws OrmException
+   */
+  public Iterable<PatchSetApproval> addApprovalsForNewPatchSet(
+      ReviewDb db,
+      ChangeUpdate update,
+      LabelTypes labelTypes,
+      PatchSet ps,
+      CurrentUser user,
+      Map<String, Short> approvals)
+      throws RestApiException, OrmException, PermissionBackendException {
+    Account.Id accountId = user.getAccountId();
+    checkArgument(
+        accountId.equals(ps.getUploader()),
+        "expected user %s to match patch set uploader %s",
+        accountId,
+        ps.getUploader());
+    if (approvals.isEmpty()) {
+      return ImmutableList.of();
+    }
+    checkApprovals(approvals, permissionBackend.user(user).database(db).change(update.getNotes()));
+    List<PatchSetApproval> cells = new ArrayList<>(approvals.size());
+    Date ts = update.getWhen();
+    for (Map.Entry<String, Short> vote : approvals.entrySet()) {
+      LabelType lt = labelTypes.byLabel(vote.getKey());
+      cells.add(newApproval(ps.getId(), user, lt.getLabelId(), vote.getValue(), ts));
+    }
+    for (PatchSetApproval psa : cells) {
+      update.putApproval(psa.getLabel(), psa.getValue());
+    }
+    db.patchSetApprovals().insert(cells);
+    return cells;
+  }
+
+  public static void checkLabel(LabelTypes labelTypes, String name, Short value)
+      throws BadRequestException {
+    LabelType label = labelTypes.byLabel(name);
+    if (label == null) {
+      throw new BadRequestException(String.format("label \"%s\" is not a configured label", name));
+    }
+    if (label.getValue(value) == null) {
+      throw new BadRequestException(
+          String.format("label \"%s\": %d is not a valid value", name, value));
+    }
+  }
+
+  private static void checkApprovals(
+      Map<String, Short> approvals, PermissionBackend.ForChange forChange)
+      throws AuthException, PermissionBackendException {
+    for (Map.Entry<String, Short> vote : approvals.entrySet()) {
+      String name = vote.getKey();
+      Short value = vote.getValue();
+      try {
+        forChange.check(new LabelPermission.WithValue(name, value));
+      } catch (AuthException e) {
+        throw new AuthException(
+            String.format("applying label \"%s\": %d is restricted", name, value));
+      }
+    }
+  }
+
+  public ListMultimap<PatchSet.Id, PatchSetApproval> byChange(ReviewDb db, ChangeNotes notes)
+      throws OrmException {
+    if (!migration.readChanges()) {
+      ImmutableListMultimap.Builder<PatchSet.Id, PatchSetApproval> result =
+          ImmutableListMultimap.builder();
+      for (PatchSetApproval psa : db.patchSetApprovals().byChange(notes.getChangeId())) {
+        result.put(psa.getPatchSetId(), psa);
+      }
+      return result.build();
+    }
+    return notes.load().getApprovals();
+  }
+
+  public Iterable<PatchSetApproval> byPatchSet(
+      ReviewDb db,
+      ChangeNotes notes,
+      PatchSet.Id psId,
+      @Nullable RevWalk rw,
+      @Nullable Config repoConfig)
+      throws OrmException {
+    if (!migration.readChanges()) {
+      return sortApprovals(db.patchSetApprovals().byPatchSet(psId));
+    }
+    return copier.getForPatchSet(db, notes, psId, rw, repoConfig);
+  }
+
+  public Iterable<PatchSetApproval> byPatchSetUser(
+      ReviewDb db,
+      ChangeNotes notes,
+      PatchSet.Id psId,
+      Account.Id accountId,
+      @Nullable RevWalk rw,
+      @Nullable Config repoConfig)
+      throws OrmException {
+    if (!migration.readChanges()) {
+      return sortApprovals(db.patchSetApprovals().byPatchSetUser(psId, accountId));
+    }
+    return filterApprovals(byPatchSet(db, notes, psId, rw, repoConfig), accountId);
+  }
+
+  public PatchSetApproval getSubmitter(ReviewDb db, ChangeNotes notes, PatchSet.Id c) {
+    if (c == null) {
+      return null;
+    }
+    try {
+      // Submit approval is never copied, so bypass expensive byPatchSet call.
+      return getSubmitter(c, byChange(db, notes).get(c));
+    } catch (OrmException e) {
+      return null;
+    }
+  }
+
+  public static PatchSetApproval getSubmitter(PatchSet.Id c, Iterable<PatchSetApproval> approvals) {
+    if (c == null) {
+      return null;
+    }
+    PatchSetApproval submitter = null;
+    for (PatchSetApproval a : approvals) {
+      if (a.getPatchSetId().equals(c) && a.getValue() > 0 && a.isLegacySubmit()) {
+        if (submitter == null || a.getGranted().compareTo(submitter.getGranted()) > 0) {
+          submitter = a;
+        }
+      }
+    }
+    return submitter;
+  }
+
+  public static String renderMessageWithApprovals(
+      int patchSetId, Map<String, Short> n, Map<String, PatchSetApproval> c) {
+    StringBuilder msgs = new StringBuilder("Uploaded patch set " + patchSetId);
+    if (!n.isEmpty()) {
+      boolean first = true;
+      for (Map.Entry<String, Short> e : n.entrySet()) {
+        if (c.containsKey(e.getKey()) && c.get(e.getKey()).getValue() == e.getValue()) {
+          continue;
+        }
+        if (first) {
+          msgs.append(":");
+          first = false;
+        }
+        msgs.append(" ").append(LabelVote.create(e.getKey(), e.getValue()).format());
+      }
+    }
+    return msgs.toString();
+  }
+}
diff --git a/java/com/google/gerrit/server/AuditEvent.java b/java/com/google/gerrit/server/AuditEvent.java
new file mode 100644
index 0000000..773a307
--- /dev/null
+++ b/java/com/google/gerrit/server/AuditEvent.java
@@ -0,0 +1,107 @@
+// Copyright (C) 2012 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.google.gerrit.server;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.ListMultimap;
+import com.google.gerrit.server.util.time.TimeUtil;
+
+public class AuditEvent {
+
+  public static final String UNKNOWN_SESSION_ID = "000000000000000000000000000";
+  protected static final ImmutableListMultimap<String, ?> EMPTY_PARAMS = ImmutableListMultimap.of();
+
+  public final String sessionId;
+  public final CurrentUser who;
+  public final long when;
+  public final String what;
+  public final ListMultimap<String, ?> params;
+  public final Object result;
+  public final long timeAtStart;
+  public final long elapsed;
+  public final UUID uuid;
+
+  @AutoValue
+  public abstract static class UUID {
+    private static UUID create() {
+      return new AutoValue_AuditEvent_UUID(
+          String.format("audit:%s", java.util.UUID.randomUUID().toString()));
+    }
+
+    public abstract String uuid();
+  }
+
+  /**
+   * Creates a new audit event with results
+   *
+   * @param sessionId session id the event belongs to
+   * @param who principal that has generated the event
+   * @param what object of the event
+   * @param when time-stamp of when the event started
+   * @param params parameters of the event
+   * @param result result of the event
+   */
+  public AuditEvent(
+      String sessionId,
+      CurrentUser who,
+      String what,
+      long when,
+      ListMultimap<String, ?> params,
+      Object result) {
+    requireNonNull(what, "what is a mandatory not null param !");
+
+    this.sessionId = MoreObjects.firstNonNull(sessionId, UNKNOWN_SESSION_ID);
+    this.who = who;
+    this.what = what;
+    this.when = when;
+    this.timeAtStart = this.when;
+    this.params = MoreObjects.firstNonNull(params, EMPTY_PARAMS);
+    this.uuid = UUID.create();
+    this.result = result;
+    this.elapsed = TimeUtil.nowMs() - timeAtStart;
+  }
+
+  @Override
+  public int hashCode() {
+    return uuid.hashCode();
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (this == obj) {
+      return true;
+    }
+    if (obj == null) {
+      return false;
+    }
+    if (getClass() != obj.getClass()) {
+      return false;
+    }
+
+    AuditEvent other = (AuditEvent) obj;
+    return this.uuid.equals(other.uuid);
+  }
+
+  @Override
+  public String toString() {
+    return String.format(
+        "AuditEvent UUID:%s, SID:%s, TS:%d, who:%s, what:%s",
+        uuid.uuid(), sessionId, when, who, what);
+  }
+}
diff --git a/java/com/google/gerrit/server/BUILD b/java/com/google/gerrit/server/BUILD
new file mode 100644
index 0000000..6ce3be4
--- /dev/null
+++ b/java/com/google/gerrit/server/BUILD
@@ -0,0 +1,151 @@
+load("//tools/bzl:javadoc.bzl", "java_doc")
+
+CONSTANTS_SRC = [
+    "documentation/Constants.java",
+]
+
+GERRIT_GLOBAL_MODULE_SRC = [
+    "config/GerritGlobalModule.java",
+]
+
+java_library(
+    name = "constants",
+    srcs = CONSTANTS_SRC,
+    visibility = ["//visibility:public"],
+)
+
+# Giant kitchen-sink target.
+#
+# The only reason this hasn't been split up further is because we have too many
+# tangled dependencies (and Guice unfortunately makes it quite easy to get into
+# this state). Which means if you see an opportunity to split something off, you
+# should seize it.
+java_library(
+    name = "server",
+    srcs = glob(
+        ["**/*.java"],
+        exclude = CONSTANTS_SRC + GERRIT_GLOBAL_MODULE_SRC,
+    ),
+    resource_strip_prefix = "resources",
+    resources = ["//resources/com/google/gerrit/server"],
+    visibility = ["//visibility:public"],
+    deps = [
+        ":constants",
+        "//java/com/google/gerrit/common:annotations",
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/index",
+        "//java/com/google/gerrit/index:query_exception",
+        "//java/com/google/gerrit/index/project",
+        "//java/com/google/gerrit/lifecycle",
+        "//java/com/google/gerrit/mail",
+        "//java/com/google/gerrit/metrics",
+        "//java/com/google/gerrit/prettify:server",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server/cache/serialize",
+        "//java/com/google/gerrit/server/ioutil",
+        "//java/com/google/gerrit/server/logging",
+        "//java/com/google/gerrit/server/util/git",
+        "//java/com/google/gerrit/server/util/time",
+        "//java/com/google/gerrit/util/cli",
+        "//java/com/google/gerrit/util/ssl",
+        "//java/org/apache/commons/net",
+        "//java/org/eclipse/jgit:server",
+        "//lib:args4j",
+        "//lib:autolink",
+        "//lib:automaton",
+        "//lib:blame-cache",
+        "//lib:flexmark",
+        "//lib:flexmark-ext-abbreviation",
+        "//lib:flexmark-ext-anchorlink",
+        "//lib:flexmark-ext-autolink",
+        "//lib:flexmark-ext-definition",
+        "//lib:flexmark-ext-emoji",
+        "//lib:flexmark-ext-escaped-character",
+        "//lib:flexmark-ext-footnotes",
+        "//lib:flexmark-ext-gfm-issues",
+        "//lib:flexmark-ext-gfm-strikethrough",
+        "//lib:flexmark-ext-gfm-tables",
+        "//lib:flexmark-ext-gfm-tasklist",
+        "//lib:flexmark-ext-gfm-users",
+        "//lib:flexmark-ext-ins",
+        "//lib:flexmark-ext-jekyll-front-matter",
+        "//lib:flexmark-ext-superscript",
+        "//lib:flexmark-ext-tables",
+        "//lib:flexmark-ext-toc",
+        "//lib:flexmark-ext-typographic",
+        "//lib:flexmark-ext-wikilink",
+        "//lib:flexmark-ext-yaml-front-matter",
+        "//lib:flexmark-formatter",
+        "//lib:flexmark-html-parser",
+        "//lib:flexmark-profile-pegdown",
+        "//lib:flexmark-util",
+        "//lib:gson",
+        "//lib:guava",
+        "//lib:guava-retrying",
+        "//lib:gwtjsonrpc",
+        "//lib:gwtorm",
+        "//lib:jsch",
+        "//lib:juniversalchardet",
+        "//lib:mime-util",
+        "//lib:protobuf",
+        "//lib:servlet-api-3_1",
+        "//lib:soy",
+        "//lib:tukaani-xz",
+        "//lib/auto:auto-value",
+        "//lib/auto:auto-value-annotations",
+        "//lib/bouncycastle:bcpkix-neverlink",
+        "//lib/bouncycastle:bcprov-neverlink",
+        "//lib/commons:codec",
+        "//lib/commons:compress",
+        "//lib/commons:dbcp",
+        "//lib/commons:lang",
+        "//lib/commons:net",
+        "//lib/commons:validator",
+        "//lib/flogger:api",
+        "//lib/guice",
+        "//lib/guice:guice-assistedinject",
+        "//lib/guice:guice-servlet",
+        "//lib/jgit/org.eclipse.jgit.archive:jgit-archive",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/jsoup",
+        "//lib/log:jsonevent-layout",
+        "//lib/log:log4j",
+        "//lib/lucene:lucene-analyzers-common",
+        "//lib/lucene:lucene-core-and-backward-codecs",
+        "//lib/lucene:lucene-queryparser",
+        "//lib/mime4j:core",
+        "//lib/mime4j:dom",
+        "//lib/ow2:ow2-asm",
+        "//lib/ow2:ow2-asm-tree",
+        "//lib/ow2:ow2-asm-util",
+        "//lib/prolog:runtime",
+        "//proto:cache_java_proto",
+    ],
+)
+
+# Large modules that import things from all across the server package
+# hierarchy, so they need lots of dependencies.
+java_library(
+    name = "module",
+    srcs = GERRIT_GLOBAL_MODULE_SRC,
+    visibility = ["//visibility:public"],
+    deps = [
+        ":server",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/server/git/receive",
+        "//java/com/google/gerrit/server/restapi",
+        "//lib:blame-cache",
+        "//lib:guava",
+        "//lib:soy",
+        "//lib/guice",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+    ],
+)
+
+java_doc(
+    name = "doc",
+    libs = [":server"],
+    pkgs = ["com.google.gerrit"],
+    title = "Gerrit Review Server Documentation",
+)
diff --git a/java/com/google/gerrit/server/ChangeMessagesUtil.java b/java/com/google/gerrit/server/ChangeMessagesUtil.java
new file mode 100644
index 0000000..969cf38
--- /dev/null
+++ b/java/com/google/gerrit/server/ChangeMessagesUtil.java
@@ -0,0 +1,223 @@
+// Copyright (C) 2014 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.google.gerrit.server;
+
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.gerrit.reviewdb.server.ReviewDbUtil.unwrapDb;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.common.ChangeMessageInfo;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.account.AccountLoader;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gerrit.server.update.BatchUpdateReviewDb;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.sql.Timestamp;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Utility functions to manipulate ChangeMessages.
+ *
+ * <p>These methods either query for and update ChangeMessages in the NoteDb or ReviewDb, depending
+ * on the state of the NotesMigration.
+ */
+@Singleton
+public class ChangeMessagesUtil {
+  public static final String AUTOGENERATED_TAG_PREFIX = "autogenerated:";
+
+  public static final String TAG_ABANDON = AUTOGENERATED_TAG_PREFIX + "gerrit:abandon";
+  public static final String TAG_CHERRY_PICK_CHANGE =
+      AUTOGENERATED_TAG_PREFIX + "gerrit:cherryPickChange";
+  public static final String TAG_DELETE_ASSIGNEE =
+      AUTOGENERATED_TAG_PREFIX + "gerrit:deleteAssignee";
+  public static final String TAG_DELETE_REVIEWER =
+      AUTOGENERATED_TAG_PREFIX + "gerrit:deleteReviewer";
+  public static final String TAG_DELETE_VOTE = AUTOGENERATED_TAG_PREFIX + "gerrit:deleteVote";
+  public static final String TAG_MERGED = AUTOGENERATED_TAG_PREFIX + "gerrit:merged";
+  public static final String TAG_MOVE = AUTOGENERATED_TAG_PREFIX + "gerrit:move";
+  public static final String TAG_RESTORE = AUTOGENERATED_TAG_PREFIX + "gerrit:restore";
+  public static final String TAG_REVERT = AUTOGENERATED_TAG_PREFIX + "gerrit:revert";
+  public static final String TAG_SET_ASSIGNEE = AUTOGENERATED_TAG_PREFIX + "gerrit:setAssignee";
+  public static final String TAG_SET_DESCRIPTION =
+      AUTOGENERATED_TAG_PREFIX + "gerrit:setPsDescription";
+  public static final String TAG_SET_HASHTAGS = AUTOGENERATED_TAG_PREFIX + "gerrit:setHashtag";
+  public static final String TAG_SET_PRIVATE = AUTOGENERATED_TAG_PREFIX + "gerrit:setPrivate";
+  public static final String TAG_SET_READY = AUTOGENERATED_TAG_PREFIX + "gerrit:setReadyForReview";
+  public static final String TAG_SET_TOPIC = AUTOGENERATED_TAG_PREFIX + "gerrit:setTopic";
+  public static final String TAG_SET_WIP = AUTOGENERATED_TAG_PREFIX + "gerrit:setWorkInProgress";
+  public static final String TAG_UNSET_PRIVATE = AUTOGENERATED_TAG_PREFIX + "gerrit:unsetPrivate";
+  public static final String TAG_UPLOADED_PATCH_SET =
+      AUTOGENERATED_TAG_PREFIX + "gerrit:newPatchSet";
+  public static final String TAG_UPLOADED_WIP_PATCH_SET =
+      AUTOGENERATED_TAG_PREFIX + "gerrit:newWipPatchSet";
+
+  public static ChangeMessage newMessage(ChangeContext ctx, String body, @Nullable String tag) {
+    return newMessage(ctx.getChange().currentPatchSetId(), ctx.getUser(), ctx.getWhen(), body, tag);
+  }
+
+  public static ChangeMessage newMessage(
+      PatchSet.Id psId, CurrentUser user, Timestamp when, String body, @Nullable String tag) {
+    requireNonNull(psId);
+    Account.Id accountId = user.isInternalUser() ? null : user.getAccountId();
+    ChangeMessage m =
+        new ChangeMessage(
+            new ChangeMessage.Key(psId.getParentKey(), ChangeUtil.messageUuid()),
+            accountId,
+            when,
+            psId);
+    m.setMessage(body);
+    m.setTag(tag);
+    user.updateRealAccountId(m::setRealAuthor);
+    return m;
+  }
+
+  public static String uploadedPatchSetTag(boolean workInProgress) {
+    return workInProgress ? TAG_UPLOADED_WIP_PATCH_SET : TAG_UPLOADED_PATCH_SET;
+  }
+
+  private static List<ChangeMessage> sortChangeMessages(Iterable<ChangeMessage> changeMessage) {
+    return ChangeNotes.MESSAGE_BY_TIME.sortedCopy(changeMessage);
+  }
+
+  private final NotesMigration migration;
+
+  @VisibleForTesting
+  @Inject
+  public ChangeMessagesUtil(NotesMigration migration) {
+    this.migration = migration;
+  }
+
+  public List<ChangeMessage> byChange(ReviewDb db, ChangeNotes notes) throws OrmException {
+    if (!migration.readChanges()) {
+      return sortChangeMessages(db.changeMessages().byChange(notes.getChangeId()));
+    }
+    return notes.load().getChangeMessages();
+  }
+
+  public void addChangeMessage(ReviewDb db, ChangeUpdate update, ChangeMessage changeMessage)
+      throws OrmException {
+    checkState(
+        Objects.equals(changeMessage.getAuthor(), update.getNullableAccountId()),
+        "cannot store change message by %s in update by %s",
+        changeMessage.getAuthor(),
+        update.getNullableAccountId());
+    update.setChangeMessage(changeMessage.getMessage());
+    update.setTag(changeMessage.getTag());
+    db.changeMessages().insert(Collections.singleton(changeMessage));
+  }
+
+  /**
+   * Replace an existing change message with the provided new message.
+   *
+   * <p>The ID of a change message is different between NoteDb and ReviewDb. In NoteDb, it's the
+   * commit SHA-1, but in ReviewDb it's generated randomly. To make sure the change message can be
+   * deleted from both NoteDb and ReviewDb, the index of the change message must be used rather than
+   * its ID.
+   *
+   * @param db the {@code ReviewDb} instance to update.
+   * @param update change update.
+   * @param targetMessageIdx the index of the target change message.
+   * @param newMessage the new message which is going to replace the old.
+   * @throws OrmException
+   */
+  public void replaceChangeMessage(
+      ReviewDb db, ChangeUpdate update, int targetMessageIdx, String newMessage)
+      throws OrmException {
+    if (PrimaryStorage.of(update.getChange()).equals(PrimaryStorage.REVIEW_DB)) {
+      if (db instanceof BatchUpdateReviewDb) {
+        db = ((BatchUpdateReviewDb) db).unsafeGetDelegate();
+      }
+      db = unwrapDb(db);
+
+      List<ChangeMessage> messagesInReviewDb =
+          sortChangeMessages(db.changeMessages().byChange(update.getId()));
+      if (migration.readChanges()) {
+        sanityCheckForChangeMessages(messagesInReviewDb, update.getNotes().getChangeMessages());
+      }
+      ChangeMessage targetMessage = messagesInReviewDb.get(targetMessageIdx);
+      targetMessage.setMessage(newMessage);
+      db.changeMessages().upsert(Collections.singleton(targetMessage));
+    }
+
+    update.deleteChangeMessageByRewritingHistory(targetMessageIdx, newMessage);
+  }
+
+  private static void sanityCheckForChangeMessages(
+      List<ChangeMessage> messagesInReviewDb, List<ChangeMessage> messagesInNoteDb) {
+    String message =
+        String.format(
+            "Change messages in ReivewDb and NoteDb don't match: NoteDb %s; ReviewDb %s",
+            messagesInNoteDb, messagesInReviewDb);
+    if (messagesInReviewDb.size() != messagesInNoteDb.size()) {
+      throw new IllegalStateException(message);
+    }
+
+    for (int i = 0; i < messagesInReviewDb.size(); i++) {
+      ChangeMessage messageInReviewDb = messagesInReviewDb.get(i);
+      ChangeMessage messageInNoteDb = messagesInNoteDb.get(i);
+
+      // Don't compare the keys because they are different for the same change message in NoteDb and
+      // ReviewDb.
+      boolean isEqual =
+          Objects.equals(messageInReviewDb.getAuthor(), messageInNoteDb.getAuthor())
+              && Objects.equals(messageInReviewDb.getWrittenOn(), messageInNoteDb.getWrittenOn())
+              && Objects.equals(messageInReviewDb.getMessage(), messageInNoteDb.getMessage())
+              && Objects.equals(messageInReviewDb.getPatchSetId(), messageInNoteDb.getPatchSetId())
+              && Objects.equals(messageInReviewDb.getTag(), messageInNoteDb.getTag())
+              && Objects.equals(messageInReviewDb.getRealAuthor(), messageInNoteDb.getRealAuthor());
+      if (!isEqual) {
+        throw new IllegalStateException(message);
+      }
+    }
+  }
+
+  /**
+   * @param tag value of a tag, or null.
+   * @return whether the tag starts with the autogenerated prefix.
+   */
+  public static boolean isAutogenerated(@Nullable String tag) {
+    return tag != null && tag.startsWith(AUTOGENERATED_TAG_PREFIX);
+  }
+
+  public static ChangeMessageInfo createChangeMessageInfo(
+      ChangeMessage message, AccountLoader accountLoader) {
+    PatchSet.Id patchNum = message.getPatchSetId();
+    ChangeMessageInfo cmi = new ChangeMessageInfo();
+    cmi.id = message.getKey().get();
+    cmi.author = accountLoader.get(message.getAuthor());
+    cmi.date = message.getWrittenOn();
+    cmi.message = message.getMessage();
+    cmi.tag = message.getTag();
+    cmi._revisionNumber = patchNum != null ? patchNum.get() : null;
+    Account.Id realAuthor = message.getRealAuthor();
+    if (realAuthor != null) {
+      cmi.realAuthor = accountLoader.get(realAuthor);
+    }
+    return cmi;
+  }
+}
diff --git a/java/com/google/gerrit/server/ChangeUtil.java b/java/com/google/gerrit/server/ChangeUtil.java
new file mode 100644
index 0000000..a13f105
--- /dev/null
+++ b/java/com/google/gerrit/server/ChangeUtil.java
@@ -0,0 +1,120 @@
+// Copyright (C) 2009 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.google.gerrit.server;
+
+import static java.util.Comparator.comparingInt;
+
+import com.google.common.collect.Maps;
+import com.google.common.collect.Ordering;
+import com.google.common.io.BaseEncoding;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.security.SecureRandom;
+import java.util.Map;
+import java.util.Random;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+
+@Singleton
+public class ChangeUtil {
+  public static final int TOPIC_MAX_LENGTH = 2048;
+
+  private static final Random UUID_RANDOM = new SecureRandom();
+  private static final BaseEncoding UUID_ENCODING = BaseEncoding.base16().lowerCase();
+
+  public static final Ordering<PatchSet> PS_ID_ORDER =
+      Ordering.from(comparingInt(PatchSet::getPatchSetId));
+
+  /** @return a new unique identifier for change message entities. */
+  public static String messageUuid() {
+    byte[] buf = new byte[8];
+    UUID_RANDOM.nextBytes(buf);
+    return UUID_ENCODING.encode(buf, 0, 4) + '_' + UUID_ENCODING.encode(buf, 4, 4);
+  }
+
+  /**
+   * Get the next patch set ID from a previously-read map of all refs.
+   *
+   * @param allRefs map of full ref name to ref.
+   * @param id previous patch set ID.
+   * @return next unused patch set ID for the same change, skipping any IDs whose corresponding ref
+   *     names appear in the {@code allRefs} map.
+   */
+  public static PatchSet.Id nextPatchSetIdFromAllRefsMap(Map<String, Ref> allRefs, PatchSet.Id id) {
+    PatchSet.Id next = nextPatchSetId(id);
+    while (allRefs.containsKey(next.toRefName())) {
+      next = nextPatchSetId(next);
+    }
+    return next;
+  }
+
+  /**
+   * Get the next patch set ID from a previously-read map of refs below the change prefix.
+   *
+   * @param changeRefs map of ref suffix to SHA-1, where the keys are ref names with the {@code
+   *     refs/changes/CD/ABCD/} prefix stripped. All refs should be under {@code id}'s change ref
+   *     prefix.
+   * @param id previous patch set ID.
+   * @return next unused patch set ID for the same change, skipping any IDs whose corresponding ref
+   *     names appear in the {@code changeRefs} map.
+   */
+  public static PatchSet.Id nextPatchSetIdFromChangeRefsMap(
+      Map<String, ObjectId> changeRefs, PatchSet.Id id) {
+    int prefixLen = id.getParentKey().toRefPrefix().length();
+    PatchSet.Id next = nextPatchSetId(id);
+    while (changeRefs.containsKey(next.toRefName().substring(prefixLen))) {
+      next = nextPatchSetId(next);
+    }
+    return next;
+  }
+
+  /**
+   * Get the next patch set ID just looking at a single previous patch set ID.
+   *
+   * <p>This patch set ID may or may not be available in the database; callers that want a
+   * previously-unused ID should use {@link #nextPatchSetIdFromAllRefsMap} or {@link
+   * #nextPatchSetIdFromChangeRefsMap}.
+   *
+   * @param id previous patch set ID.
+   * @return next patch set ID for the same change, incrementing by 1.
+   */
+  public static PatchSet.Id nextPatchSetId(PatchSet.Id id) {
+    return new PatchSet.Id(id.getParentKey(), id.get() + 1);
+  }
+
+  /**
+   * Get the next patch set ID from scanning refs in the repo.
+   *
+   * @param git repository to scan for patch set refs.
+   * @param id previous patch set ID.
+   * @return next unused patch set ID for the same change, skipping any IDs whose corresponding ref
+   *     names appear in the repository.
+   */
+  public static PatchSet.Id nextPatchSetId(Repository git, PatchSet.Id id) throws IOException {
+    return nextPatchSetIdFromChangeRefsMap(
+        Maps.transformValues(
+            git.getRefDatabase().getRefs(id.getParentKey().toRefPrefix()), Ref::getObjectId),
+        id);
+  }
+
+  public static String status(Change c) {
+    return c != null ? c.getStatus().name().toLowerCase() : "deleted";
+  }
+
+  private ChangeUtil() {}
+}
diff --git a/java/com/google/gerrit/server/CmdLineParserModule.java b/java/com/google/gerrit/server/CmdLineParserModule.java
new file mode 100644
index 0000000..d7f6e30
--- /dev/null
+++ b/java/com/google/gerrit/server/CmdLineParserModule.java
@@ -0,0 +1,62 @@
+// Copyright (C) 2012 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.google.gerrit.server;
+
+import com.google.gerrit.extensions.config.FactoryModule;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.args4j.AccountGroupIdHandler;
+import com.google.gerrit.server.args4j.AccountGroupUUIDHandler;
+import com.google.gerrit.server.args4j.AccountIdHandler;
+import com.google.gerrit.server.args4j.ChangeIdHandler;
+import com.google.gerrit.server.args4j.ObjectIdHandler;
+import com.google.gerrit.server.args4j.PatchSetIdHandler;
+import com.google.gerrit.server.args4j.ProjectHandler;
+import com.google.gerrit.server.args4j.SocketAddressHandler;
+import com.google.gerrit.server.args4j.TimestampHandler;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.util.cli.CmdLineParser;
+import com.google.gerrit.util.cli.OptionHandlerUtil;
+import com.google.gerrit.util.cli.OptionHandlers;
+import java.net.SocketAddress;
+import java.sql.Timestamp;
+import org.eclipse.jgit.lib.ObjectId;
+import org.kohsuke.args4j.spi.OptionHandler;
+
+public class CmdLineParserModule extends FactoryModule {
+  public CmdLineParserModule() {}
+
+  @Override
+  protected void configure() {
+    factory(CmdLineParser.Factory.class);
+    bind(OptionHandlers.class);
+
+    registerOptionHandler(Account.Id.class, AccountIdHandler.class);
+    registerOptionHandler(AccountGroup.Id.class, AccountGroupIdHandler.class);
+    registerOptionHandler(AccountGroup.UUID.class, AccountGroupUUIDHandler.class);
+    registerOptionHandler(Change.Id.class, ChangeIdHandler.class);
+    registerOptionHandler(ObjectId.class, ObjectIdHandler.class);
+    registerOptionHandler(PatchSet.Id.class, PatchSetIdHandler.class);
+    registerOptionHandler(ProjectState.class, ProjectHandler.class);
+    registerOptionHandler(SocketAddress.class, SocketAddressHandler.class);
+    registerOptionHandler(Timestamp.class, TimestampHandler.class);
+  }
+
+  private <T> void registerOptionHandler(Class<T> type, Class<? extends OptionHandler<T>> impl) {
+    install(OptionHandlerUtil.moduleFor(type, impl));
+  }
+}
diff --git a/java/com/google/gerrit/server/CommentsUtil.java b/java/com/google/gerrit/server/CommentsUtil.java
new file mode 100644
index 0000000..d72d73a
--- /dev/null
+++ b/java/com/google/gerrit/server/CommentsUtil.java
@@ -0,0 +1,518 @@
+// Copyright (C) 2014 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.google.gerrit.server;
+
+import static com.google.common.base.MoreObjects.firstNonNull;
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.gerrit.reviewdb.client.PatchLineComment.Status.PUBLISHED;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.collect.ComparisonChain;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Ordering;
+import com.google.common.collect.Streams;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.client.Side;
+import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.reviewdb.client.PatchLineComment;
+import com.google.gerrit.reviewdb.client.PatchLineComment.Status;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.client.RobotComment;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.reviewdb.server.ReviewDbUtil;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.GerritServerId;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gerrit.server.patch.PatchListCache;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+import com.google.gerrit.server.update.BatchUpdateReviewDb;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.ResultSet;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.NullProgressMonitor;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.ReceiveCommand;
+
+/**
+ * Utility functions to manipulate Comments.
+ *
+ * <p>These methods either query for and update Comments in the NoteDb or ReviewDb, depending on the
+ * state of the NotesMigration.
+ */
+@Singleton
+public class CommentsUtil {
+  public static final Ordering<Comment> COMMENT_ORDER =
+      new Ordering<Comment>() {
+        @Override
+        public int compare(Comment c1, Comment c2) {
+          return ComparisonChain.start()
+              .compare(c1.key.filename, c2.key.filename)
+              .compare(c1.key.patchSetId, c2.key.patchSetId)
+              .compare(c1.side, c2.side)
+              .compare(c1.lineNbr, c2.lineNbr)
+              .compare(c1.writtenOn, c2.writtenOn)
+              .result();
+        }
+      };
+
+  public static final Ordering<CommentInfo> COMMENT_INFO_ORDER =
+      new Ordering<CommentInfo>() {
+        @Override
+        public int compare(CommentInfo a, CommentInfo b) {
+          return ComparisonChain.start()
+              .compare(a.path, b.path, NULLS_FIRST)
+              .compare(a.patchSet, b.patchSet, NULLS_FIRST)
+              .compare(side(a), side(b))
+              .compare(a.line, b.line, NULLS_FIRST)
+              .compare(a.inReplyTo, b.inReplyTo, NULLS_FIRST)
+              .compare(a.message, b.message)
+              .compare(a.id, b.id)
+              .result();
+        }
+
+        private int side(CommentInfo c) {
+          return firstNonNull(c.side, Side.REVISION).ordinal();
+        }
+      };
+
+  public static PatchSet.Id getCommentPsId(Change.Id changeId, Comment comment) {
+    return new PatchSet.Id(changeId, comment.key.patchSetId);
+  }
+
+  public static String extractMessageId(@Nullable String tag) {
+    if (tag == null || !tag.startsWith("mailMessageId=")) {
+      return null;
+    }
+    return tag.substring("mailMessageId=".length());
+  }
+
+  private static final Ordering<Comparable<?>> NULLS_FIRST = Ordering.natural().nullsFirst();
+
+  private final GitRepositoryManager repoManager;
+  private final AllUsersName allUsers;
+  private final NotesMigration migration;
+  private final String serverId;
+
+  @Inject
+  CommentsUtil(
+      GitRepositoryManager repoManager,
+      AllUsersName allUsers,
+      NotesMigration migration,
+      @GerritServerId String serverId) {
+    this.repoManager = repoManager;
+    this.allUsers = allUsers;
+    this.migration = migration;
+    this.serverId = serverId;
+  }
+
+  public Comment newComment(
+      ChangeContext ctx,
+      String path,
+      PatchSet.Id psId,
+      short side,
+      String message,
+      @Nullable Boolean unresolved,
+      @Nullable String parentUuid)
+      throws OrmException, UnprocessableEntityException {
+    if (unresolved == null) {
+      if (parentUuid == null) {
+        // Default to false if comment is not descended from another.
+        unresolved = false;
+      } else {
+        // Inherit unresolved value from inReplyTo comment if not specified.
+        Comment.Key key = new Comment.Key(parentUuid, path, psId.patchSetId);
+        Optional<Comment> parent = getPublished(ctx.getDb(), ctx.getNotes(), key);
+        if (!parent.isPresent()) {
+          throw new UnprocessableEntityException("Invalid parentUuid supplied for comment");
+        }
+        unresolved = parent.get().unresolved;
+      }
+    }
+    Comment c =
+        new Comment(
+            new Comment.Key(ChangeUtil.messageUuid(), path, psId.get()),
+            ctx.getUser().getAccountId(),
+            ctx.getWhen(),
+            side,
+            message,
+            serverId,
+            unresolved);
+    c.parentUuid = parentUuid;
+    ctx.getUser().updateRealAccountId(c::setRealAuthor);
+    return c;
+  }
+
+  public RobotComment newRobotComment(
+      ChangeContext ctx,
+      String path,
+      PatchSet.Id psId,
+      short side,
+      String message,
+      String robotId,
+      String robotRunId) {
+    RobotComment c =
+        new RobotComment(
+            new Comment.Key(ChangeUtil.messageUuid(), path, psId.get()),
+            ctx.getUser().getAccountId(),
+            ctx.getWhen(),
+            side,
+            message,
+            serverId,
+            robotId,
+            robotRunId);
+    ctx.getUser().updateRealAccountId(c::setRealAuthor);
+    return c;
+  }
+
+  public Optional<Comment> getPublished(ReviewDb db, ChangeNotes notes, Comment.Key key)
+      throws OrmException {
+    if (!migration.readChanges()) {
+      return getReviewDb(db, notes, key);
+    }
+    return publishedByChange(db, notes).stream().filter(c -> key.equals(c.key)).findFirst();
+  }
+
+  public Optional<Comment> getDraft(
+      ReviewDb db, ChangeNotes notes, IdentifiedUser user, Comment.Key key) throws OrmException {
+    if (!migration.readChanges()) {
+      Optional<Comment> c = getReviewDb(db, notes, key);
+      if (c.isPresent() && !c.get().author.getId().equals(user.getAccountId())) {
+        throw new OrmException(
+            String.format(
+                "Expected draft %s to belong to account %s, but it belongs to %s",
+                key, user.getAccountId(), c.get().author.getId()));
+      }
+      return c;
+    }
+    return draftByChangeAuthor(db, notes, user.getAccountId()).stream()
+        .filter(c -> key.equals(c.key))
+        .findFirst();
+  }
+
+  private Optional<Comment> getReviewDb(ReviewDb db, ChangeNotes notes, Comment.Key key)
+      throws OrmException {
+    return Optional.ofNullable(
+            db.patchComments().get(PatchLineComment.Key.from(notes.getChangeId(), key)))
+        .map(plc -> plc.asComment(serverId));
+  }
+
+  public List<Comment> publishedByChange(ReviewDb db, ChangeNotes notes) throws OrmException {
+    if (!migration.readChanges()) {
+      return sort(byCommentStatus(db.patchComments().byChange(notes.getChangeId()), PUBLISHED));
+    }
+
+    notes.load();
+    return sort(Lists.newArrayList(notes.getComments().values()));
+  }
+
+  public List<RobotComment> robotCommentsByChange(ChangeNotes notes) throws OrmException {
+    if (!migration.readChanges()) {
+      return ImmutableList.of();
+    }
+
+    notes.load();
+    return sort(Lists.newArrayList(notes.getRobotComments().values()));
+  }
+
+  public List<Comment> draftByChange(ReviewDb db, ChangeNotes notes) throws OrmException {
+    if (!migration.readChanges()) {
+      return sort(byCommentStatus(db.patchComments().byChange(notes.getChangeId()), Status.DRAFT));
+    }
+
+    List<Comment> comments = new ArrayList<>();
+    for (Ref ref : getDraftRefs(notes.getChangeId())) {
+      Account.Id account = Account.Id.fromRefSuffix(ref.getName());
+      if (account != null) {
+        comments.addAll(draftByChangeAuthor(db, notes, account));
+      }
+    }
+    return sort(comments);
+  }
+
+  private List<Comment> byCommentStatus(
+      ResultSet<PatchLineComment> comments, PatchLineComment.Status status) {
+    return toComments(
+        serverId, Lists.newArrayList(Iterables.filter(comments, c -> c.getStatus() == status)));
+  }
+
+  public List<Comment> byPatchSet(ReviewDb db, ChangeNotes notes, PatchSet.Id psId)
+      throws OrmException {
+    if (!migration.readChanges()) {
+      return sort(toComments(serverId, db.patchComments().byPatchSet(psId).toList()));
+    }
+    List<Comment> comments = new ArrayList<>();
+    comments.addAll(publishedByPatchSet(db, notes, psId));
+
+    for (Ref ref : getDraftRefs(notes.getChangeId())) {
+      Account.Id account = Account.Id.fromRefSuffix(ref.getName());
+      if (account != null) {
+        comments.addAll(draftByPatchSetAuthor(db, psId, account, notes));
+      }
+    }
+    return sort(comments);
+  }
+
+  public List<Comment> publishedByChangeFile(
+      ReviewDb db, ChangeNotes notes, Change.Id changeId, String file) throws OrmException {
+    if (!migration.readChanges()) {
+      return sort(
+          toComments(serverId, db.patchComments().publishedByChangeFile(changeId, file).toList()));
+    }
+    return commentsOnFile(notes.load().getComments().values(), file);
+  }
+
+  public List<Comment> publishedByPatchSet(ReviewDb db, ChangeNotes notes, PatchSet.Id psId)
+      throws OrmException {
+    if (!migration.readChanges()) {
+      return removeCommentsOnAncestorOfCommitMessage(
+          sort(toComments(serverId, db.patchComments().publishedByPatchSet(psId).toList())));
+    }
+    return removeCommentsOnAncestorOfCommitMessage(
+        commentsOnPatchSet(notes.load().getComments().values(), psId));
+  }
+
+  public List<RobotComment> robotCommentsByPatchSet(ChangeNotes notes, PatchSet.Id psId)
+      throws OrmException {
+    if (!migration.readChanges()) {
+      return ImmutableList.of();
+    }
+    return commentsOnPatchSet(notes.load().getRobotComments().values(), psId);
+  }
+
+  /**
+   * For the commit message the A side in a diff view is always empty when a comparison against an
+   * ancestor is done, so there can't be any comments on this ancestor. However earlier we showed
+   * the auto-merge commit message on side A when for a merge commit a comparison against the
+   * auto-merge was done. From that time there may still be comments on the auto-merge commit
+   * message and those we want to filter out.
+   */
+  private List<Comment> removeCommentsOnAncestorOfCommitMessage(List<Comment> list) {
+    return list.stream()
+        .filter(c -> c.side != 0 || !Patch.COMMIT_MSG.equals(c.key.filename))
+        .collect(toList());
+  }
+
+  public List<Comment> draftByPatchSetAuthor(
+      ReviewDb db, PatchSet.Id psId, Account.Id author, ChangeNotes notes) throws OrmException {
+    if (!migration.readChanges()) {
+      return sort(
+          toComments(serverId, db.patchComments().draftByPatchSetAuthor(psId, author).toList()));
+    }
+    return commentsOnPatchSet(notes.load().getDraftComments(author).values(), psId);
+  }
+
+  public List<Comment> draftByChangeFileAuthor(
+      ReviewDb db, ChangeNotes notes, String file, Account.Id author) throws OrmException {
+    if (!migration.readChanges()) {
+      return sort(
+          toComments(
+              serverId,
+              db.patchComments()
+                  .draftByChangeFileAuthor(notes.getChangeId(), file, author)
+                  .toList()));
+    }
+    return commentsOnFile(notes.load().getDraftComments(author).values(), file);
+  }
+
+  public List<Comment> draftByChangeAuthor(ReviewDb db, ChangeNotes notes, Account.Id author)
+      throws OrmException {
+    if (!migration.readChanges()) {
+      return Streams.stream(db.patchComments().draftByAuthor(author))
+          .filter(c -> c.getPatchSetId().getParentKey().equals(notes.getChangeId()))
+          .map(plc -> plc.asComment(serverId))
+          .sorted(COMMENT_ORDER)
+          .collect(toList());
+    }
+    List<Comment> comments = new ArrayList<>();
+    comments.addAll(notes.getDraftComments(author).values());
+    return sort(comments);
+  }
+
+  public void putComments(
+      ReviewDb db, ChangeUpdate update, PatchLineComment.Status status, Iterable<Comment> comments)
+      throws OrmException {
+    for (Comment c : comments) {
+      update.putComment(status, c);
+    }
+    db.patchComments().upsert(toPatchLineComments(update.getId(), status, comments));
+  }
+
+  public void putRobotComments(ChangeUpdate update, Iterable<RobotComment> comments) {
+    for (RobotComment c : comments) {
+      update.putRobotComment(c);
+    }
+  }
+
+  public void deleteComments(ReviewDb db, ChangeUpdate update, Iterable<Comment> comments)
+      throws OrmException {
+    for (Comment c : comments) {
+      update.deleteComment(c);
+    }
+    db.patchComments()
+        .delete(toPatchLineComments(update.getId(), PatchLineComment.Status.DRAFT, comments));
+  }
+
+  public void deleteCommentByRewritingHistory(
+      ReviewDb db, ChangeUpdate update, Comment.Key commentKey, PatchSet.Id psId, String newMessage)
+      throws OrmException {
+    if (PrimaryStorage.of(update.getChange()).equals(PrimaryStorage.REVIEW_DB)) {
+      PatchLineComment.Key key =
+          new PatchLineComment.Key(new Patch.Key(psId, commentKey.filename), commentKey.uuid);
+
+      if (db instanceof BatchUpdateReviewDb) {
+        db = ((BatchUpdateReviewDb) db).unsafeGetDelegate();
+      }
+      db = ReviewDbUtil.unwrapDb(db);
+
+      PatchLineComment patchLineComment = db.patchComments().get(key);
+
+      if (!patchLineComment.getStatus().equals(PUBLISHED)) {
+        throw new OrmException(String.format("comment %s is not published", key));
+      }
+
+      patchLineComment.setMessage(newMessage);
+      db.patchComments().upsert(Collections.singleton(patchLineComment));
+    }
+
+    update.deleteCommentByRewritingHistory(commentKey.uuid, newMessage);
+  }
+
+  public void deleteAllDraftsFromAllUsers(Change.Id changeId) throws IOException {
+    try (Repository repo = repoManager.openRepository(allUsers);
+        RevWalk rw = new RevWalk(repo)) {
+      BatchRefUpdate bru = repo.getRefDatabase().newBatchUpdate();
+      for (Ref ref : getDraftRefs(repo, changeId)) {
+        bru.addCommand(new ReceiveCommand(ref.getObjectId(), ObjectId.zeroId(), ref.getName()));
+      }
+      bru.setRefLogMessage("Delete drafts from NoteDb", false);
+      bru.execute(rw, NullProgressMonitor.INSTANCE);
+      for (ReceiveCommand cmd : bru.getCommands()) {
+        if (cmd.getResult() != ReceiveCommand.Result.OK) {
+          throw new IOException(
+              String.format(
+                  "Failed to delete draft comment ref %s at %s: %s (%s)",
+                  cmd.getRefName(), cmd.getOldId(), cmd.getResult(), cmd.getMessage()));
+        }
+      }
+    }
+  }
+
+  private static List<Comment> commentsOnFile(Collection<Comment> allComments, String file) {
+    List<Comment> result = new ArrayList<>(allComments.size());
+    for (Comment c : allComments) {
+      String currentFilename = c.key.filename;
+      if (currentFilename.equals(file)) {
+        result.add(c);
+      }
+    }
+    return sort(result);
+  }
+
+  private static <T extends Comment> List<T> commentsOnPatchSet(
+      Collection<T> allComments, PatchSet.Id psId) {
+    List<T> result = new ArrayList<>(allComments.size());
+    for (T c : allComments) {
+      if (c.key.patchSetId == psId.get()) {
+        result.add(c);
+      }
+    }
+    return sort(result);
+  }
+
+  public static void setCommentRevId(Comment c, PatchListCache cache, Change change, PatchSet ps)
+      throws PatchListNotAvailableException {
+    checkArgument(
+        c.key.patchSetId == ps.getId().get(),
+        "cannot set RevId for patch set %s on comment %s",
+        ps.getId(),
+        c);
+    if (c.revId == null) {
+      if (Side.fromShort(c.side) == Side.PARENT) {
+        if (c.side < 0) {
+          c.revId = ObjectId.toString(cache.getOldId(change, ps, -c.side));
+        } else {
+          c.revId = ObjectId.toString(cache.getOldId(change, ps, null));
+        }
+      } else {
+        c.revId = ps.getRevision().get();
+      }
+    }
+  }
+
+  /**
+   * Get NoteDb draft refs for a change.
+   *
+   * <p>Works if NoteDb is not enabled, but the results are not meaningful.
+   *
+   * <p>This is just a simple ref scan, so the results may potentially include refs for zombie draft
+   * comments. A zombie draft is one which has been published but the write to delete the draft ref
+   * from All-Users failed.
+   *
+   * @param changeId change ID.
+   * @return raw refs from All-Users repo.
+   */
+  public Collection<Ref> getDraftRefs(Change.Id changeId) throws OrmException {
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      return getDraftRefs(repo, changeId);
+    } catch (IOException e) {
+      throw new OrmException(e);
+    }
+  }
+
+  private Collection<Ref> getDraftRefs(Repository repo, Change.Id changeId) throws IOException {
+    return repo.getRefDatabase().getRefsByPrefix(RefNames.refsDraftCommentsPrefix(changeId));
+  }
+
+  private static <T extends Comment> List<T> sort(List<T> comments) {
+    comments.sort(COMMENT_ORDER);
+    return comments;
+  }
+
+  public static Iterable<PatchLineComment> toPatchLineComments(
+      Change.Id changeId, PatchLineComment.Status status, Iterable<Comment> comments) {
+    return FluentIterable.from(comments).transform(c -> PatchLineComment.from(changeId, status, c));
+  }
+
+  public static List<Comment> toComments(
+      final String serverId, Iterable<PatchLineComment> comments) {
+    return COMMENT_ORDER.sortedCopy(
+        FluentIterable.from(comments).transform(plc -> plc.asComment(serverId)));
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/CommonConverters.java b/java/com/google/gerrit/server/CommonConverters.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/CommonConverters.java
rename to java/com/google/gerrit/server/CommonConverters.java
diff --git a/java/com/google/gerrit/server/CreateGroupPermissionSyncer.java b/java/com/google/gerrit/server/CreateGroupPermissionSyncer.java
new file mode 100644
index 0000000..cd7cd47
--- /dev/null
+++ b/java/com/google/gerrit/server/CreateGroupPermissionSyncer.java
@@ -0,0 +1,140 @@
+// Copyright (C) 2017 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.google.gerrit.server;
+
+import static java.util.Objects.requireNonNull;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.collect.Sets;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.common.data.PermissionRule;
+import com.google.gerrit.extensions.events.ChangeMergedListener;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+/**
+ * With groups in NoteDb, the capability of creating a group is expressed as a {@code CREATE}
+ * permission on {@code refs/groups/*} rather than a global capability in {@code All-Projects}.
+ *
+ * <p>During the transition phase, we have to keep these permissions in sync with the global
+ * capabilities that serve as the source of truth.
+ *
+ * <p><This class implements a one-way synchronization from the global {@code CREATE_GROUP}
+ * capability in {@code All-Projects} to a {@code CREATE} permission on {@code refs/groups/*} in
+ * {@code All-Users}.
+ */
+@Singleton
+public class CreateGroupPermissionSyncer implements ChangeMergedListener {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final AllProjectsName allProjects;
+  private final AllUsersName allUsers;
+  private final ProjectCache projectCache;
+  private final Provider<MetaDataUpdate.Server> metaDataUpdateFactory;
+
+  @Inject
+  CreateGroupPermissionSyncer(
+      AllProjectsName allProjects,
+      AllUsersName allUsers,
+      ProjectCache projectCache,
+      Provider<MetaDataUpdate.Server> metaDataUpdateFactory) {
+    this.allProjects = allProjects;
+    this.allUsers = allUsers;
+    this.projectCache = projectCache;
+    this.metaDataUpdateFactory = metaDataUpdateFactory;
+  }
+
+  /**
+   * Checks if {@code GlobalCapability.CREATE_GROUP} and {@code CREATE} permission on {@code
+   * refs/groups/*} have diverged and syncs them by applying the {@code CREATE} permission to {@code
+   * refs/groups/*}.
+   */
+  public void syncIfNeeded() throws IOException, ConfigInvalidException {
+    ProjectState allProjectsState = projectCache.checkedGet(allProjects);
+    requireNonNull(
+        allProjectsState, () -> String.format("Can't obtain project state for %s", allProjects));
+    ProjectState allUsersState = projectCache.checkedGet(allUsers);
+    requireNonNull(
+        allUsersState, () -> String.format("Can't obtain project state for %s", allUsers));
+
+    Set<PermissionRule> createGroupsGlobal =
+        new HashSet<>(allProjectsState.getCapabilityCollection().createGroup);
+    Set<PermissionRule> createGroupsRef = new HashSet<>();
+
+    AccessSection allUsersCreateGroupAccessSection =
+        allUsersState.getConfig().getAccessSection(RefNames.REFS_GROUPS + "*");
+    if (allUsersCreateGroupAccessSection != null) {
+      Permission create = allUsersCreateGroupAccessSection.getPermission(Permission.CREATE);
+      if (create != null && create.getRules() != null) {
+        createGroupsRef.addAll(create.getRules());
+      }
+    }
+
+    if (Sets.symmetricDifference(createGroupsGlobal, createGroupsRef).isEmpty()) {
+      // Nothing to sync
+      return;
+    }
+
+    try (MetaDataUpdate md = metaDataUpdateFactory.get().create(allUsers)) {
+      ProjectConfig config = ProjectConfig.read(md);
+      AccessSection createGroupAccessSection =
+          config.getAccessSection(RefNames.REFS_GROUPS + "*", true);
+      if (createGroupsGlobal.isEmpty()) {
+        createGroupAccessSection.setPermissions(
+            createGroupAccessSection.getPermissions().stream()
+                .filter(p -> !Permission.CREATE.equals(p.getName()))
+                .collect(toList()));
+        config.replace(createGroupAccessSection);
+      } else {
+        Permission createGroupPermission = new Permission(Permission.CREATE);
+        createGroupAccessSection.addPermission(createGroupPermission);
+        createGroupsGlobal.forEach(createGroupPermission::add);
+        // The create permission is managed by Gerrit at this point only so there is no concern of
+        // overwriting user-defined permissions here.
+        config.replace(createGroupAccessSection);
+      }
+
+      config.commit(md);
+      projectCache.evict(config.getProject());
+    }
+  }
+
+  @Override
+  public void onChangeMerged(Event event) {
+    if (!allProjects.get().equals(event.getChange().project)
+        || !RefNames.REFS_CONFIG.equals(event.getChange().branch)) {
+      return;
+    }
+    try {
+      syncIfNeeded();
+    } catch (IOException | ConfigInvalidException e) {
+      logger.atSevere().withCause(e).log("Can't sync create group permissions");
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/CurrentUser.java b/java/com/google/gerrit/server/CurrentUser.java
new file mode 100644
index 0000000..03b9f54
--- /dev/null
+++ b/java/com/google/gerrit/server/CurrentUser.java
@@ -0,0 +1,173 @@
+// Copyright (C) 2009 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.google.gerrit.server;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.account.GroupMembership;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.inject.servlet.RequestScoped;
+import java.util.Optional;
+import java.util.function.Consumer;
+
+/**
+ * Information about the currently logged in user.
+ *
+ * <p>This is a {@link RequestScoped} property managed by Guice.
+ *
+ * @see AnonymousUser
+ * @see IdentifiedUser
+ */
+public abstract class CurrentUser {
+  /** Unique key for plugin/extension specific data on a CurrentUser. */
+  public static final class PropertyKey<T> {
+    public static <T> PropertyKey<T> create() {
+      return new PropertyKey<>();
+    }
+
+    private PropertyKey() {}
+  }
+
+  private AccessPath accessPath = AccessPath.UNKNOWN;
+  private PropertyKey<ExternalId.Key> lastLoginExternalIdPropertyKey = PropertyKey.create();
+
+  /** How this user is accessing the Gerrit Code Review application. */
+  public final AccessPath getAccessPath() {
+    return accessPath;
+  }
+
+  public void setAccessPath(AccessPath path) {
+    accessPath = path;
+  }
+
+  /**
+   * Identity of the authenticated user.
+   *
+   * <p>In the normal case where a user authenticates as themselves {@code getRealUser() == this}.
+   *
+   * <p>If {@code X-Gerrit-RunAs} or {@code suexec} was used this method returns the identity of the
+   * account that has permission to act on behalf of this user.
+   */
+  public CurrentUser getRealUser() {
+    return this;
+  }
+
+  public boolean isImpersonating() {
+    return false;
+  }
+
+  /**
+   * If the {@link #getRealUser()} has an account ID associated with it, call the given setter with
+   * that ID.
+   */
+  public void updateRealAccountId(Consumer<Account.Id> setter) {
+    if (getRealUser().isIdentifiedUser()) {
+      setter.accept(getRealUser().getAccountId());
+    }
+  }
+
+  /**
+   * Get the set of groups the user is currently a member of.
+   *
+   * <p>The returned set may be a subset of the user's actual groups; if the user's account is
+   * currently deemed to be untrusted then the effective group set is only the anonymous and
+   * registered user groups. To enable additional groups (and gain their granted permissions) the
+   * user must update their account to use only trusted authentication providers.
+   *
+   * @return active groups for this user.
+   */
+  public abstract GroupMembership getEffectiveGroups();
+
+  /**
+   * Returns a unique identifier for this user that is intended to be used as a cache key. Returned
+   * object should to implement {@code equals()} and {@code hashCode()} for effective caching.
+   */
+  public abstract Object getCacheKey();
+
+  /** Unique name of the user on this server, if one has been assigned. */
+  public Optional<String> getUserName() {
+    return Optional.empty();
+  }
+
+  /** @return unique name of the user for logging, never {@code null} */
+  public String getLoggableName() {
+    return getUserName().orElseGet(() -> getClass().getSimpleName());
+  }
+
+  /** Check if user is the IdentifiedUser */
+  public boolean isIdentifiedUser() {
+    return false;
+  }
+
+  /** Cast to IdentifiedUser if possible. */
+  public IdentifiedUser asIdentifiedUser() {
+    throw new UnsupportedOperationException(
+        getClass().getSimpleName() + " is not an IdentifiedUser");
+  }
+
+  /**
+   * Return account ID if {@link #isIdentifiedUser} is true.
+   *
+   * @throws UnsupportedOperationException if the user is not logged in.
+   */
+  public Account.Id getAccountId() {
+    throw new UnsupportedOperationException(
+        getClass().getSimpleName() + " is not an IdentifiedUser");
+  }
+
+  /** Check if the CurrentUser is an InternalUser. */
+  public boolean isInternalUser() {
+    return false;
+  }
+
+  /**
+   * Lookup a previously stored property.
+   *
+   * @param key unique property key.
+   * @return previously stored value, or {@code Optional#empty()}.
+   */
+  public <T> Optional<T> get(PropertyKey<T> key) {
+    return Optional.empty();
+  }
+
+  /**
+   * Store a property for later retrieval.
+   *
+   * @param key unique property key.
+   * @param value value to store; or {@code null} to clear the value.
+   */
+  public <T> void put(PropertyKey<T> key, @Nullable T value) {}
+
+  public void setLastLoginExternalIdKey(ExternalId.Key externalIdKey) {
+    put(lastLoginExternalIdPropertyKey, externalIdKey);
+  }
+
+  public Optional<ExternalId.Key> getLastLoginExternalIdKey() {
+    return get(lastLoginExternalIdPropertyKey);
+  }
+
+  /**
+   * Checks if the current user has the same account id of another.
+   *
+   * <p>Provide a generic interface for allowing subclasses to define whether two accounts represent
+   * the same account id.
+   *
+   * @param other user to compare
+   * @return true if the two users have the same account id
+   */
+  public boolean hasSameAccountId(CurrentUser other) {
+    return false;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/DynamicOptions.java b/java/com/google/gerrit/server/DynamicOptions.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/DynamicOptions.java
rename to java/com/google/gerrit/server/DynamicOptions.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/EnableSignedPush.java b/java/com/google/gerrit/server/EnableSignedPush.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/EnableSignedPush.java
rename to java/com/google/gerrit/server/EnableSignedPush.java
diff --git a/java/com/google/gerrit/server/FanOutExecutor.java b/java/com/google/gerrit/server/FanOutExecutor.java
new file mode 100644
index 0000000..a489890
--- /dev/null
+++ b/java/com/google/gerrit/server/FanOutExecutor.java
@@ -0,0 +1,27 @@
+// 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.
+
+package com.google.gerrit.server;
+
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.inject.BindingAnnotation;
+import java.lang.annotation.Retention;
+
+/**
+ * Marker on the global {@code ThreadPoolExecutor} used to do parallel work from a serving thread.
+ */
+@Retention(RUNTIME)
+@BindingAnnotation
+public @interface FanOutExecutor {}
diff --git a/java/com/google/gerrit/server/GerritPersonIdent.java b/java/com/google/gerrit/server/GerritPersonIdent.java
new file mode 100644
index 0000000..544a106
--- /dev/null
+++ b/java/com/google/gerrit/server/GerritPersonIdent.java
@@ -0,0 +1,31 @@
+// Copyright (C) 2009 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.google.gerrit.server;
+
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.inject.BindingAnnotation;
+import java.lang.annotation.Retention;
+
+/**
+ * Marker on a {@link org.eclipse.jgit.lib.PersonIdent} pointing to the identity + timestamp
+ * representing the Gerrit server itself.
+ *
+ * <p>When injecting this into a singleton class, use {@code Provider<PersonIdent>} so you get a
+ * fresh timestamp for each call to {@code get()}.
+ */
+@Retention(RUNTIME)
+@BindingAnnotation
+public @interface GerritPersonIdent {}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/GerritPersonIdentProvider.java b/java/com/google/gerrit/server/GerritPersonIdentProvider.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/GerritPersonIdentProvider.java
rename to java/com/google/gerrit/server/GerritPersonIdentProvider.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/GpgException.java b/java/com/google/gerrit/server/GpgException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/GpgException.java
rename to java/com/google/gerrit/server/GpgException.java
diff --git a/java/com/google/gerrit/server/IdentifiedUser.java b/java/com/google/gerrit/server/IdentifiedUser.java
new file mode 100644
index 0000000..d9a4cae
--- /dev/null
+++ b/java/com/google/gerrit/server/IdentifiedUser.java
@@ -0,0 +1,565 @@
+// Copyright (C) 2009 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.google.gerrit.server;
+
+import static com.google.common.base.MoreObjects.firstNonNull;
+import static com.google.common.flogger.LazyArgs.lazy;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.account.GroupMembership;
+import com.google.gerrit.server.account.ListGroupMembership;
+import com.google.gerrit.server.account.Realm;
+import com.google.gerrit.server.config.AnonymousCowardName;
+import com.google.gerrit.server.config.AuthConfig;
+import com.google.gerrit.server.config.CanonicalWebUrl;
+import com.google.gerrit.server.config.DisableReverseDnsLookup;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.inject.Inject;
+import com.google.inject.OutOfScopeException;
+import com.google.inject.Provider;
+import com.google.inject.ProvisionException;
+import com.google.inject.Singleton;
+import com.google.inject.util.Providers;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.MalformedURLException;
+import java.net.SocketAddress;
+import java.net.URL;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.TimeZone;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.util.SystemReader;
+
+/** An authenticated user. */
+public class IdentifiedUser extends CurrentUser {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  /** Create an IdentifiedUser, ignoring any per-request state. */
+  @Singleton
+  public static class GenericFactory {
+    private final AuthConfig authConfig;
+    private final Realm realm;
+    private final String anonymousCowardName;
+    private final Provider<String> canonicalUrl;
+    private final AccountCache accountCache;
+    private final GroupBackend groupBackend;
+    private final Boolean disableReverseDnsLookup;
+
+    @Inject
+    public GenericFactory(
+        AuthConfig authConfig,
+        Realm realm,
+        @AnonymousCowardName String anonymousCowardName,
+        @CanonicalWebUrl Provider<String> canonicalUrl,
+        @DisableReverseDnsLookup Boolean disableReverseDnsLookup,
+        AccountCache accountCache,
+        GroupBackend groupBackend) {
+      this.authConfig = authConfig;
+      this.realm = realm;
+      this.anonymousCowardName = anonymousCowardName;
+      this.canonicalUrl = canonicalUrl;
+      this.accountCache = accountCache;
+      this.groupBackend = groupBackend;
+      this.disableReverseDnsLookup = disableReverseDnsLookup;
+    }
+
+    public IdentifiedUser create(AccountState state) {
+      return new IdentifiedUser(
+          authConfig,
+          realm,
+          anonymousCowardName,
+          canonicalUrl,
+          accountCache,
+          groupBackend,
+          disableReverseDnsLookup,
+          Providers.of((SocketAddress) null),
+          state,
+          null);
+    }
+
+    public IdentifiedUser create(Account.Id id) {
+      return create((SocketAddress) null, id);
+    }
+
+    public IdentifiedUser create(SocketAddress remotePeer, Account.Id id) {
+      return runAs(remotePeer, id, null);
+    }
+
+    public IdentifiedUser runAs(
+        SocketAddress remotePeer, Account.Id id, @Nullable CurrentUser caller) {
+      return new IdentifiedUser(
+          authConfig,
+          realm,
+          anonymousCowardName,
+          canonicalUrl,
+          accountCache,
+          groupBackend,
+          disableReverseDnsLookup,
+          Providers.of(remotePeer),
+          id,
+          caller);
+    }
+  }
+
+  /**
+   * Create an IdentifiedUser, relying on current request state.
+   *
+   * <p>Can only be used from within a module that has defined request scoped {@code @RemotePeer
+   * SocketAddress} and {@code ReviewDb} providers.
+   */
+  @Singleton
+  public static class RequestFactory {
+    private final AuthConfig authConfig;
+    private final Realm realm;
+    private final String anonymousCowardName;
+    private final Provider<String> canonicalUrl;
+    private final AccountCache accountCache;
+    private final GroupBackend groupBackend;
+    private final Boolean disableReverseDnsLookup;
+    private final Provider<SocketAddress> remotePeerProvider;
+
+    @Inject
+    RequestFactory(
+        AuthConfig authConfig,
+        Realm realm,
+        @AnonymousCowardName String anonymousCowardName,
+        @CanonicalWebUrl Provider<String> canonicalUrl,
+        AccountCache accountCache,
+        GroupBackend groupBackend,
+        @DisableReverseDnsLookup Boolean disableReverseDnsLookup,
+        @RemotePeer Provider<SocketAddress> remotePeerProvider) {
+      this.authConfig = authConfig;
+      this.realm = realm;
+      this.anonymousCowardName = anonymousCowardName;
+      this.canonicalUrl = canonicalUrl;
+      this.accountCache = accountCache;
+      this.groupBackend = groupBackend;
+      this.disableReverseDnsLookup = disableReverseDnsLookup;
+      this.remotePeerProvider = remotePeerProvider;
+    }
+
+    public IdentifiedUser create(Account.Id id) {
+      return new IdentifiedUser(
+          authConfig,
+          realm,
+          anonymousCowardName,
+          canonicalUrl,
+          accountCache,
+          groupBackend,
+          disableReverseDnsLookup,
+          remotePeerProvider,
+          id,
+          null);
+    }
+
+    public IdentifiedUser runAs(Account.Id id, CurrentUser caller) {
+      return new IdentifiedUser(
+          authConfig,
+          realm,
+          anonymousCowardName,
+          canonicalUrl,
+          accountCache,
+          groupBackend,
+          disableReverseDnsLookup,
+          remotePeerProvider,
+          id,
+          caller);
+    }
+  }
+
+  private static final GroupMembership registeredGroups =
+      new ListGroupMembership(
+          ImmutableSet.of(SystemGroupBackend.ANONYMOUS_USERS, SystemGroupBackend.REGISTERED_USERS));
+
+  private final Provider<String> canonicalUrl;
+  private final AccountCache accountCache;
+  private final AuthConfig authConfig;
+  private final Realm realm;
+  private final GroupBackend groupBackend;
+  private final String anonymousCowardName;
+  private final Boolean disableReverseDnsLookup;
+  private final Set<String> validEmails = Sets.newTreeSet(String.CASE_INSENSITIVE_ORDER);
+  private final CurrentUser realUser; // Must be final since cached properties depend on it.
+
+  private final Provider<SocketAddress> remotePeerProvider;
+  private final Account.Id accountId;
+
+  private AccountState state;
+  private boolean loadedAllEmails;
+  private Set<String> invalidEmails;
+  private GroupMembership effectiveGroups;
+  private Map<PropertyKey<Object>, Object> properties;
+
+  private IdentifiedUser(
+      AuthConfig authConfig,
+      Realm realm,
+      String anonymousCowardName,
+      Provider<String> canonicalUrl,
+      AccountCache accountCache,
+      GroupBackend groupBackend,
+      Boolean disableReverseDnsLookup,
+      @Nullable Provider<SocketAddress> remotePeerProvider,
+      AccountState state,
+      @Nullable CurrentUser realUser) {
+    this(
+        authConfig,
+        realm,
+        anonymousCowardName,
+        canonicalUrl,
+        accountCache,
+        groupBackend,
+        disableReverseDnsLookup,
+        remotePeerProvider,
+        state.getAccount().getId(),
+        realUser);
+    this.state = state;
+  }
+
+  private IdentifiedUser(
+      AuthConfig authConfig,
+      Realm realm,
+      String anonymousCowardName,
+      Provider<String> canonicalUrl,
+      AccountCache accountCache,
+      GroupBackend groupBackend,
+      Boolean disableReverseDnsLookup,
+      @Nullable Provider<SocketAddress> remotePeerProvider,
+      Account.Id id,
+      @Nullable CurrentUser realUser) {
+    this.canonicalUrl = canonicalUrl;
+    this.accountCache = accountCache;
+    this.groupBackend = groupBackend;
+    this.authConfig = authConfig;
+    this.realm = realm;
+    this.anonymousCowardName = anonymousCowardName;
+    this.disableReverseDnsLookup = disableReverseDnsLookup;
+    this.remotePeerProvider = remotePeerProvider;
+    this.accountId = id;
+    this.realUser = realUser != null ? realUser : this;
+  }
+
+  @Override
+  public CurrentUser getRealUser() {
+    return realUser;
+  }
+
+  @Override
+  public boolean isImpersonating() {
+    if (realUser == this) {
+      return false;
+    }
+    if (realUser.isIdentifiedUser()) {
+      if (realUser.getAccountId().equals(getAccountId())) {
+        // Impersonating another copy of this user is allowed.
+        return false;
+      }
+    }
+    return true;
+  }
+
+  /**
+   * Returns the account state of the identified user.
+   *
+   * @return the account state of the identified user, an empty account state if the account is
+   *     missing
+   */
+  public AccountState state() {
+    if (state == null) {
+      // TODO(ekempin):
+      // Ideally we would only create IdentifiedUser instances for existing accounts. To ensure
+      // this we could load the account state eagerly on the creation of IdentifiedUser and fail is
+      // the account is missing. In most cases, e.g. when creating an IdentifiedUser for a request
+      // context, we really want to fail early if the account is missing. However there are some
+      // usages where an IdentifiedUser may be instantiated for a missing account. We may go
+      // through all of them and ensure that they never try to create an IdentifiedUser for a
+      // missing account or make this explicit by adding a createEvenIfMissing method to
+      // IdentifiedUser.GenericFactory. However since this is a lot of effort we stick with calling
+      // AccountCache#getEvenIfMissing(Account.Id) for now.
+      // Alternatively we could be could also return an Optional<AccountState> from the state()
+      // method and let callers handle the missing account case explicitly. But this would be a lot
+      // of work too.
+      state = accountCache.getEvenIfMissing(getAccountId());
+    }
+    return state;
+  }
+
+  @Override
+  public IdentifiedUser asIdentifiedUser() {
+    return this;
+  }
+
+  @Override
+  public Account.Id getAccountId() {
+    return accountId;
+  }
+
+  /**
+   * @return the user's user name; null if one has not been selected/assigned or if the user name is
+   *     empty.
+   */
+  @Override
+  public Optional<String> getUserName() {
+    return state().getUserName();
+  }
+
+  /** @return unique name of the user for logging, never {@code null} */
+  @Override
+  public String getLoggableName() {
+    return getUserName()
+        .orElseGet(
+            () -> firstNonNull(getAccount().getPreferredEmail(), "a/" + getAccountId().get()));
+  }
+
+  /**
+   * Returns the account of the identified user.
+   *
+   * @return the account of the identified user, an empty account if the account is missing
+   */
+  public Account getAccount() {
+    return state().getAccount();
+  }
+
+  public boolean hasEmailAddress(String email) {
+    if (validEmails.contains(email)) {
+      return true;
+    } else if (invalidEmails != null && invalidEmails.contains(email)) {
+      return false;
+    } else if (realm.hasEmailAddress(this, email)) {
+      validEmails.add(email);
+      return true;
+    } else if (invalidEmails == null) {
+      invalidEmails = Sets.newTreeSet(String.CASE_INSENSITIVE_ORDER);
+    }
+    invalidEmails.add(email);
+    return false;
+  }
+
+  public ImmutableSet<String> getEmailAddresses() {
+    if (!loadedAllEmails) {
+      validEmails.addAll(realm.getEmailAddresses(this));
+      loadedAllEmails = true;
+    }
+    return ImmutableSet.copyOf(validEmails);
+  }
+
+  public String getName() {
+    return getAccount().getName();
+  }
+
+  public String getNameEmail() {
+    return getAccount().getNameEmail(anonymousCowardName);
+  }
+
+  @Override
+  public GroupMembership getEffectiveGroups() {
+    if (effectiveGroups == null) {
+      if (authConfig.isIdentityTrustable(state().getExternalIds())) {
+        effectiveGroups = groupBackend.membershipsOf(this);
+        logger.atFinest().log(
+            "Known groups of %s: %s", getLoggableName(), lazy(effectiveGroups::getKnownGroups));
+      } else {
+        effectiveGroups = registeredGroups;
+        logger.atFinest().log(
+            "%s has a non-trusted identity, falling back to %s as known groups",
+            getLoggableName(), lazy(registeredGroups::getKnownGroups));
+      }
+    }
+    return effectiveGroups;
+  }
+
+  @Override
+  public Object getCacheKey() {
+    return getAccountId();
+  }
+
+  public PersonIdent newRefLogIdent() {
+    return newRefLogIdent(new Date(), TimeZone.getDefault());
+  }
+
+  public PersonIdent newRefLogIdent(Date when, TimeZone tz) {
+    final Account ua = getAccount();
+
+    String name = ua.getFullName();
+    if (name == null || name.isEmpty()) {
+      name = ua.getPreferredEmail();
+    }
+    if (name == null || name.isEmpty()) {
+      name = anonymousCowardName;
+    }
+
+    String user = getUserName().orElse("") + "|account-" + ua.getId().toString();
+    return new PersonIdent(name, user + "@" + guessHost(), when, tz);
+  }
+
+  public PersonIdent newCommitterIdent(Date when, TimeZone tz) {
+    final Account ua = getAccount();
+    String name = ua.getFullName();
+    String email = ua.getPreferredEmail();
+
+    if (email == null || email.isEmpty()) {
+      // No preferred email is configured. Use a generic identity so we
+      // don't leak an address the user may have given us, but doesn't
+      // necessarily want to publish through Git records.
+      //
+      String user = getUserName().orElseGet(() -> "account-" + ua.getId().toString());
+
+      String host;
+      if (canonicalUrl.get() != null) {
+        try {
+          host = new URL(canonicalUrl.get()).getHost();
+        } catch (MalformedURLException e) {
+          host = SystemReader.getInstance().getHostname();
+        }
+      } else {
+        host = SystemReader.getInstance().getHostname();
+      }
+
+      email = user + "@" + host;
+    }
+
+    if (name == null || name.isEmpty()) {
+      final int at = email.indexOf('@');
+      if (0 < at) {
+        name = email.substring(0, at);
+      } else {
+        name = anonymousCowardName;
+      }
+    }
+
+    return new PersonIdent(name, email, when, tz);
+  }
+
+  @Override
+  public String toString() {
+    return "IdentifiedUser[account " + getAccountId() + "]";
+  }
+
+  /** Check if user is the IdentifiedUser */
+  @Override
+  public boolean isIdentifiedUser() {
+    return true;
+  }
+
+  @Override
+  public synchronized <T> Optional<T> get(PropertyKey<T> key) {
+    if (properties != null) {
+      @SuppressWarnings("unchecked")
+      T value = (T) properties.get(key);
+      return Optional.ofNullable(value);
+    }
+    return Optional.empty();
+  }
+
+  /**
+   * Store a property for later retrieval.
+   *
+   * @param key unique property key.
+   * @param value value to store; or {@code null} to clear the value.
+   */
+  @Override
+  public synchronized <T> void put(PropertyKey<T> key, @Nullable T value) {
+    if (properties == null) {
+      if (value == null) {
+        return;
+      }
+      properties = new HashMap<>();
+    }
+
+    @SuppressWarnings("unchecked")
+    PropertyKey<Object> k = (PropertyKey<Object>) key;
+    if (value != null) {
+      properties.put(k, value);
+    } else {
+      properties.remove(k);
+    }
+  }
+
+  /**
+   * Returns a materialized copy of the user with all dependencies.
+   *
+   * <p>Invoke all providers and factories of dependent objects and store the references to a copy
+   * of the current identified user.
+   *
+   * @return copy of the identified user
+   */
+  public IdentifiedUser materializedCopy() {
+    Provider<SocketAddress> remotePeer;
+    try {
+      remotePeer = Providers.of(remotePeerProvider.get());
+    } catch (OutOfScopeException | ProvisionException e) {
+      remotePeer =
+          new Provider<SocketAddress>() {
+            @Override
+            public SocketAddress get() {
+              throw e;
+            }
+          };
+    }
+    return new IdentifiedUser(
+        authConfig,
+        realm,
+        anonymousCowardName,
+        Providers.of(canonicalUrl.get()),
+        accountCache,
+        groupBackend,
+        disableReverseDnsLookup,
+        remotePeer,
+        state,
+        realUser);
+  }
+
+  @Override
+  public boolean hasSameAccountId(CurrentUser other) {
+    return getAccountId().get() == other.getAccountId().get();
+  }
+
+  private String guessHost() {
+    String host = null;
+    SocketAddress remotePeer = null;
+    try {
+      remotePeer = remotePeerProvider.get();
+    } catch (OutOfScopeException | ProvisionException e) {
+      // Leave null.
+    }
+    if (remotePeer instanceof InetSocketAddress) {
+      InetSocketAddress sa = (InetSocketAddress) remotePeer;
+      InetAddress in = sa.getAddress();
+      host = in != null ? getHost(in) : sa.getHostName();
+    }
+    if (Strings.isNullOrEmpty(host)) {
+      return "unknown";
+    }
+    return host;
+  }
+
+  private String getHost(InetAddress in) {
+    if (Boolean.FALSE.equals(disableReverseDnsLookup)) {
+      return in.getCanonicalHostName();
+    }
+    return in.getHostAddress();
+  }
+}
diff --git a/java/com/google/gerrit/server/InternalUser.java b/java/com/google/gerrit/server/InternalUser.java
new file mode 100644
index 0000000..381819d
--- /dev/null
+++ b/java/com/google/gerrit/server/InternalUser.java
@@ -0,0 +1,52 @@
+// Copyright (C) 2012 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.google.gerrit.server;
+
+import com.google.gerrit.server.account.GroupMembership;
+
+/**
+ * User identity for plugin code that needs an identity.
+ *
+ * <p>An InternalUser has no real identity, it acts as the server and can access anything it wants,
+ * anytime it wants, given the JVM's own direct access to data. Plugins may use this when they need
+ * to have a CurrentUser with read permission on anything.
+ *
+ * @see PluginUser
+ */
+public class InternalUser extends CurrentUser {
+  public interface Factory {
+    InternalUser create();
+  }
+
+  @Override
+  public GroupMembership getEffectiveGroups() {
+    return GroupMembership.EMPTY;
+  }
+
+  @Override
+  public String getCacheKey() {
+    return "internal";
+  }
+
+  @Override
+  public boolean isInternalUser() {
+    return true;
+  }
+
+  @Override
+  public String toString() {
+    return "InternalUser";
+  }
+}
diff --git a/java/com/google/gerrit/server/LibModuleLoader.java b/java/com/google/gerrit/server/LibModuleLoader.java
new file mode 100644
index 0000000..d1067e1
--- /dev/null
+++ b/java/com/google/gerrit/server/LibModuleLoader.java
@@ -0,0 +1,60 @@
+// 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.
+
+package com.google.gerrit.server;
+
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import com.google.inject.Module;
+import com.google.inject.ProvisionException;
+import java.util.Arrays;
+import java.util.List;
+import org.eclipse.jgit.lib.Config;
+
+/** Loads configured Guice modules from {@code gerrit.installModule}. */
+public class LibModuleLoader {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static List<Module> loadModules(Injector parent) {
+    Config cfg = getConfig(parent);
+    return Arrays.stream(cfg.getStringList("gerrit", null, "installModule"))
+        .map(m -> createModule(parent, m))
+        .collect(toList());
+  }
+
+  private static Config getConfig(Injector i) {
+    return i.getInstance(Key.get(Config.class, GerritServerConfig.class));
+  }
+
+  private static Module createModule(Injector injector, String className) {
+    Module m = injector.getInstance(loadModule(className));
+    logger.atInfo().log("Installed module %s", className);
+    return m;
+  }
+
+  @SuppressWarnings("unchecked")
+  private static Class<Module> loadModule(String className) {
+    try {
+      return (Class<Module>) Class.forName(className);
+    } catch (ClassNotFoundException | LinkageError e) {
+      String msg = "Cannot load LibModule " + className;
+      logger.atSevere().withCause(e).log(msg);
+      throw new ProvisionException(msg, e);
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ModuleImpl.java b/java/com/google/gerrit/server/ModuleImpl.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/ModuleImpl.java
rename to java/com/google/gerrit/server/ModuleImpl.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ModuleOverloader.java b/java/com/google/gerrit/server/ModuleOverloader.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/ModuleOverloader.java
rename to java/com/google/gerrit/server/ModuleOverloader.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/OptionUtil.java b/java/com/google/gerrit/server/OptionUtil.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/OptionUtil.java
rename to java/com/google/gerrit/server/OptionUtil.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/OutputFormat.java b/java/com/google/gerrit/server/OutputFormat.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/OutputFormat.java
rename to java/com/google/gerrit/server/OutputFormat.java
diff --git a/java/com/google/gerrit/server/PatchSetUtil.java b/java/com/google/gerrit/server/PatchSetUtil.java
new file mode 100644
index 0000000..f6c7abc
--- /dev/null
+++ b/java/com/google/gerrit/server/PatchSetUtil.java
@@ -0,0 +1,225 @@
+// 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.
+
+package com.google.gerrit.server;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.collect.ImmutableMap.toImmutableMap;
+import static com.google.gerrit.server.ChangeUtil.PS_ID_ORDER;
+import static com.google.gerrit.server.notedb.PatchSetState.PUBLISHED;
+import static java.util.Objects.requireNonNull;
+import static java.util.function.Function.identity;
+
+import com.google.common.collect.ImmutableCollection;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import com.google.common.collect.Streams;
+import com.google.gerrit.common.data.LabelFunction;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RevId;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+/** Utilities for manipulating patch sets. */
+@Singleton
+public class PatchSetUtil {
+  private final NotesMigration migration;
+  private final Provider<ApprovalsUtil> approvalsUtilProvider;
+  private final ProjectCache projectCache;
+  private final Provider<ReviewDb> dbProvider;
+  private final GitRepositoryManager repoManager;
+
+  @Inject
+  PatchSetUtil(
+      NotesMigration migration,
+      Provider<ApprovalsUtil> approvalsUtilProvider,
+      ProjectCache projectCache,
+      Provider<ReviewDb> dbProvider,
+      GitRepositoryManager repoManager) {
+    this.migration = migration;
+    this.approvalsUtilProvider = approvalsUtilProvider;
+    this.projectCache = projectCache;
+    this.dbProvider = dbProvider;
+    this.repoManager = repoManager;
+  }
+
+  public PatchSet current(ReviewDb db, ChangeNotes notes) throws OrmException {
+    return get(db, notes, notes.getChange().currentPatchSetId());
+  }
+
+  public PatchSet get(ReviewDb db, ChangeNotes notes, PatchSet.Id psId) throws OrmException {
+    if (!migration.readChanges()) {
+      return db.patchSets().get(psId);
+    }
+    return notes.load().getPatchSets().get(psId);
+  }
+
+  public ImmutableCollection<PatchSet> byChange(ReviewDb db, ChangeNotes notes)
+      throws OrmException {
+    if (!migration.readChanges()) {
+      return PS_ID_ORDER.immutableSortedCopy(db.patchSets().byChange(notes.getChangeId()));
+    }
+    return notes.load().getPatchSets().values();
+  }
+
+  public ImmutableMap<PatchSet.Id, PatchSet> byChangeAsMap(ReviewDb db, ChangeNotes notes)
+      throws OrmException {
+    if (!migration.readChanges()) {
+      ImmutableMap.Builder<PatchSet.Id, PatchSet> result = ImmutableMap.builder();
+      for (PatchSet ps : PS_ID_ORDER.sortedCopy(db.patchSets().byChange(notes.getChangeId()))) {
+        result.put(ps.getId(), ps);
+      }
+      return result.build();
+    }
+    return notes.load().getPatchSets();
+  }
+
+  public ImmutableMap<PatchSet.Id, PatchSet> getAsMap(
+      ReviewDb db, ChangeNotes notes, Set<PatchSet.Id> patchSetIds) throws OrmException {
+    if (!migration.readChanges()) {
+      patchSetIds = Sets.filter(patchSetIds, p -> p.getParentKey().equals(notes.getChangeId()));
+      return Streams.stream(db.patchSets().get(patchSetIds))
+          .sorted(PS_ID_ORDER)
+          .collect(toImmutableMap(PatchSet::getId, identity()));
+    }
+    return ImmutableMap.copyOf(Maps.filterKeys(notes.load().getPatchSets(), patchSetIds::contains));
+  }
+
+  public PatchSet insert(
+      ReviewDb db,
+      RevWalk rw,
+      ChangeUpdate update,
+      PatchSet.Id psId,
+      ObjectId commit,
+      List<String> groups,
+      String pushCertificate,
+      String description)
+      throws OrmException, IOException {
+    requireNonNull(groups, "groups may not be null");
+    ensurePatchSetMatches(psId, update);
+
+    PatchSet ps = new PatchSet(psId);
+    ps.setRevision(new RevId(commit.name()));
+    ps.setUploader(update.getAccountId());
+    ps.setCreatedOn(new Timestamp(update.getWhen().getTime()));
+    ps.setGroups(groups);
+    ps.setPushCertificate(pushCertificate);
+    ps.setDescription(description);
+    db.patchSets().insert(Collections.singleton(ps));
+
+    update.setCommit(rw, commit, pushCertificate);
+    update.setPsDescription(description);
+    update.setGroups(groups);
+
+    return ps;
+  }
+
+  public void publish(ReviewDb db, ChangeUpdate update, PatchSet ps) throws OrmException {
+    ensurePatchSetMatches(ps.getId(), update);
+    update.setPatchSetState(PUBLISHED);
+    db.patchSets().update(Collections.singleton(ps));
+  }
+
+  private static void ensurePatchSetMatches(PatchSet.Id psId, ChangeUpdate update) {
+    Change.Id changeId = update.getChange().getId();
+    checkArgument(
+        psId.getParentKey().equals(changeId),
+        "cannot modify patch set %s on update for change %s",
+        psId,
+        changeId);
+    if (update.getPatchSetId() != null) {
+      checkArgument(
+          update.getPatchSetId().equals(psId),
+          "cannot modify patch set %s on update for %s",
+          psId,
+          update.getPatchSetId());
+    } else {
+      update.setPatchSetId(psId);
+    }
+  }
+
+  public void setGroups(ReviewDb db, ChangeUpdate update, PatchSet ps, List<String> groups)
+      throws OrmException {
+    ps.setGroups(groups);
+    update.setGroups(groups);
+    db.patchSets().update(Collections.singleton(ps));
+  }
+
+  /** Check if the current patch set of the change is locked. */
+  public void checkPatchSetNotLocked(ChangeNotes notes)
+      throws OrmException, IOException, ResourceConflictException {
+    if (isPatchSetLocked(notes)) {
+      throw new ResourceConflictException(
+          String.format("The current patch set of change %s is locked", notes.getChangeId()));
+    }
+  }
+
+  /** Is the current patch set locked against state changes? */
+  public boolean isPatchSetLocked(ChangeNotes notes) throws OrmException, IOException {
+    Change change = notes.getChange();
+    if (change.getStatus() == Change.Status.MERGED) {
+      return false;
+    }
+
+    ProjectState projectState = projectCache.checkedGet(notes.getProjectName());
+    requireNonNull(
+        projectState, () -> String.format("Failed to load project %s", notes.getProjectName()));
+
+    ApprovalsUtil approvalsUtil = approvalsUtilProvider.get();
+    for (PatchSetApproval ap :
+        approvalsUtil.byPatchSet(dbProvider.get(), notes, change.currentPatchSetId(), null, null)) {
+      LabelType type = projectState.getLabelTypes(notes).byLabel(ap.getLabel());
+      if (type != null
+          && ap.getValue() == 1
+          && type.getFunction() == LabelFunction.PATCH_SET_LOCK) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /** Returns the commit for the given project at the given patchset revision */
+  public RevCommit getRevCommit(Project.NameKey project, PatchSet patchSet) throws IOException {
+    try (Repository repo = repoManager.openRepository(project);
+        RevWalk rw = new RevWalk(repo)) {
+      RevCommit src = rw.parseCommit(ObjectId.fromString(patchSet.getRevision().get()));
+      rw.parseBody(src);
+      return src;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/PeerDaemonUser.java b/java/com/google/gerrit/server/PeerDaemonUser.java
new file mode 100644
index 0000000..b27e05c
--- /dev/null
+++ b/java/com/google/gerrit/server/PeerDaemonUser.java
@@ -0,0 +1,56 @@
+// Copyright (C) 2010 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.google.gerrit.server;
+
+import com.google.gerrit.server.account.GroupMembership;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.net.SocketAddress;
+
+/** Identity of a peer daemon process that isn't this JVM. */
+public class PeerDaemonUser extends CurrentUser {
+  /** Magic username used by peers when they authenticate. */
+  public static final String USER_NAME = "Gerrit Code Review";
+
+  public interface Factory {
+    PeerDaemonUser create(@Assisted SocketAddress peer);
+  }
+
+  private final SocketAddress peer;
+
+  @Inject
+  protected PeerDaemonUser(@Assisted SocketAddress peer) {
+    this.peer = peer;
+  }
+
+  @Override
+  public GroupMembership getEffectiveGroups() {
+    return GroupMembership.EMPTY;
+  }
+
+  @Override
+  public Object getCacheKey() {
+    return getRemoteAddress();
+  }
+
+  public SocketAddress getRemoteAddress() {
+    return peer;
+  }
+
+  @Override
+  public String toString() {
+    return "PeerDaemon[address " + getRemoteAddress() + "]";
+  }
+}
diff --git a/java/com/google/gerrit/server/PluginUser.java b/java/com/google/gerrit/server/PluginUser.java
new file mode 100644
index 0000000..fbfd900
--- /dev/null
+++ b/java/com/google/gerrit/server/PluginUser.java
@@ -0,0 +1,43 @@
+// Copyright (C) 2013 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.google.gerrit.server;
+
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.util.Optional;
+
+/** User identity for plugin code that needs an identity. */
+public class PluginUser extends InternalUser {
+  public interface Factory {
+    PluginUser create(String pluginName);
+  }
+
+  private final String pluginName;
+
+  @Inject
+  protected PluginUser(@Assisted String pluginName) {
+    this.pluginName = pluginName;
+  }
+
+  @Override
+  public Optional<String> getUserName() {
+    return Optional.of("plugin " + pluginName);
+  }
+
+  @Override
+  public String toString() {
+    return "PluginUser[" + pluginName + "]";
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ProjectUtil.java b/java/com/google/gerrit/server/ProjectUtil.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/ProjectUtil.java
rename to java/com/google/gerrit/server/ProjectUtil.java
diff --git a/java/com/google/gerrit/server/PublishCommentUtil.java b/java/com/google/gerrit/server/PublishCommentUtil.java
new file mode 100644
index 0000000..a90f3e7
--- /dev/null
+++ b/java/com/google/gerrit/server/PublishCommentUtil.java
@@ -0,0 +1,83 @@
+// 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.
+
+package com.google.gerrit.server;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.gerrit.reviewdb.client.PatchLineComment.Status.PUBLISHED;
+import static java.util.stream.Collectors.toSet;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSet.Id;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.patch.PatchListCache;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.Collection;
+import java.util.Map;
+
+@Singleton
+public class PublishCommentUtil {
+  private final PatchListCache patchListCache;
+  private final PatchSetUtil psUtil;
+  private final CommentsUtil commentsUtil;
+
+  @Inject
+  PublishCommentUtil(
+      CommentsUtil commentsUtil, PatchListCache patchListCache, PatchSetUtil psUtil) {
+    this.commentsUtil = commentsUtil;
+    this.psUtil = psUtil;
+    this.patchListCache = patchListCache;
+  }
+
+  public void publish(
+      ChangeContext ctx, PatchSet.Id psId, Collection<Comment> drafts, @Nullable String tag)
+      throws OrmException {
+    ChangeNotes notes = ctx.getNotes();
+    checkArgument(notes != null);
+    if (drafts.isEmpty()) {
+      return;
+    }
+
+    Map<Id, PatchSet> patchSets =
+        psUtil.getAsMap(
+            ctx.getDb(), notes, drafts.stream().map(d -> psId(notes, d)).collect(toSet()));
+    for (Comment d : drafts) {
+      PatchSet ps = patchSets.get(psId(notes, d));
+      if (ps == null) {
+        throw new OrmException("patch set " + ps + " not found");
+      }
+      d.writtenOn = ctx.getWhen();
+      d.tag = tag;
+      // Draft may have been created by a different real user; copy the current real user. (Only
+      // applies to X-Gerrit-RunAs, since modifying drafts via on_behalf_of is not allowed.)
+      ctx.getUser().updateRealAccountId(d::setRealAuthor);
+      try {
+        CommentsUtil.setCommentRevId(d, patchListCache, notes.getChange(), ps);
+      } catch (PatchListNotAvailableException e) {
+        throw new OrmException(e);
+      }
+    }
+    commentsUtil.putComments(ctx.getDb(), ctx.getUpdate(psId), PUBLISHED, drafts);
+  }
+
+  private static PatchSet.Id psId(ChangeNotes notes, Comment c) {
+    return new PatchSet.Id(notes.getChangeId(), c.key.patchSetId);
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/RemotePeer.java b/java/com/google/gerrit/server/RemotePeer.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/RemotePeer.java
rename to java/com/google/gerrit/server/RemotePeer.java
diff --git a/java/com/google/gerrit/server/RequestCleanup.java b/java/com/google/gerrit/server/RequestCleanup.java
new file mode 100644
index 0000000..7ed9287
--- /dev/null
+++ b/java/com/google/gerrit/server/RequestCleanup.java
@@ -0,0 +1,55 @@
+// Copyright (C) 2009 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.google.gerrit.server;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.inject.servlet.RequestScoped;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+/** Registers cleanup activities to be completed when a scope ends. */
+@RequestScoped
+public class RequestCleanup implements Runnable {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final List<Runnable> cleanup = new LinkedList<>();
+  private boolean ran;
+
+  /** Register a task to be completed after the request ends. */
+  public void add(Runnable task) {
+    synchronized (cleanup) {
+      if (ran) {
+        throw new IllegalStateException("Request has already been cleaned up");
+      }
+      cleanup.add(task);
+    }
+  }
+
+  @Override
+  public void run() {
+    synchronized (cleanup) {
+      ran = true;
+      for (Iterator<Runnable> i = cleanup.iterator(); i.hasNext(); ) {
+        try {
+          i.next().run();
+        } catch (Throwable err) {
+          logger.atSevere().withCause(err).log("Failed to execute per-request cleanup");
+        }
+        i.remove();
+      }
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/ReviewerByEmailSet.java b/java/com/google/gerrit/server/ReviewerByEmailSet.java
new file mode 100644
index 0000000..caae45e
--- /dev/null
+++ b/java/com/google/gerrit/server/ReviewerByEmailSet.java
@@ -0,0 +1,79 @@
+// Copyright (C) 2017 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.google.gerrit.server;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableTable;
+import com.google.common.collect.Table;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.server.notedb.ReviewerStateInternal;
+import java.sql.Timestamp;
+
+/**
+ * Set of reviewers on a change that do not have a Gerrit account and were added by email instead.
+ *
+ * <p>A given account may appear in multiple states and at different timestamps. No reviewers with
+ * state {@link ReviewerStateInternal#REMOVED} are ever exposed by this interface.
+ */
+public class ReviewerByEmailSet {
+  private static final ReviewerByEmailSet EMPTY = new ReviewerByEmailSet(ImmutableTable.of());
+
+  public static ReviewerByEmailSet fromTable(
+      Table<ReviewerStateInternal, Address, Timestamp> table) {
+    return new ReviewerByEmailSet(table);
+  }
+
+  public static ReviewerByEmailSet empty() {
+    return EMPTY;
+  }
+
+  private final ImmutableTable<ReviewerStateInternal, Address, Timestamp> table;
+  private ImmutableSet<Address> users;
+
+  private ReviewerByEmailSet(Table<ReviewerStateInternal, Address, Timestamp> table) {
+    this.table = ImmutableTable.copyOf(table);
+  }
+
+  public ImmutableSet<Address> all() {
+    if (users == null) {
+      // Idempotent and immutable, don't bother locking.
+      users = ImmutableSet.copyOf(table.columnKeySet());
+    }
+    return users;
+  }
+
+  public ImmutableSet<Address> byState(ReviewerStateInternal state) {
+    return table.row(state).keySet();
+  }
+
+  public ImmutableTable<ReviewerStateInternal, Address, Timestamp> asTable() {
+    return table;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    return (o instanceof ReviewerByEmailSet) && table.equals(((ReviewerByEmailSet) o).table);
+  }
+
+  @Override
+  public int hashCode() {
+    return table.hashCode();
+  }
+
+  @Override
+  public String toString() {
+    return getClass().getSimpleName() + table;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ReviewerSet.java b/java/com/google/gerrit/server/ReviewerSet.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/ReviewerSet.java
rename to java/com/google/gerrit/server/ReviewerSet.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ReviewerStatusUpdate.java b/java/com/google/gerrit/server/ReviewerStatusUpdate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/ReviewerStatusUpdate.java
rename to java/com/google/gerrit/server/ReviewerStatusUpdate.java
diff --git a/java/com/google/gerrit/server/Sequences.java b/java/com/google/gerrit/server/Sequences.java
new file mode 100644
index 0000000..fcf0759
--- /dev/null
+++ b/java/com/google/gerrit/server/Sequences.java
@@ -0,0 +1,166 @@
+// 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.
+
+package com.google.gerrit.server;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.metrics.Description;
+import com.google.gerrit.metrics.Description.Units;
+import com.google.gerrit.metrics.Field;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.metrics.Timer2;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gerrit.server.notedb.RepoSequence;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.jgit.lib.Config;
+
+@Singleton
+public class Sequences {
+  public static final String NAME_ACCOUNTS = "accounts";
+  public static final String NAME_GROUPS = "groups";
+  public static final String NAME_CHANGES = "changes";
+
+  public static int getChangeSequenceGap(Config cfg) {
+    return cfg.getInt("noteDb", "changes", "initialSequenceGap", 1000);
+  }
+
+  private enum SequenceType {
+    ACCOUNTS,
+    CHANGES,
+    GROUPS;
+  }
+
+  private final Provider<ReviewDb> db;
+  private final NotesMigration migration;
+  private final RepoSequence accountSeq;
+  private final RepoSequence changeSeq;
+  private final RepoSequence groupSeq;
+  private final Timer2<SequenceType, Boolean> nextIdLatency;
+
+  @Inject
+  public Sequences(
+      @GerritServerConfig Config cfg,
+      Provider<ReviewDb> db,
+      NotesMigration migration,
+      GitRepositoryManager repoManager,
+      GitReferenceUpdated gitRefUpdated,
+      AllProjectsName allProjects,
+      AllUsersName allUsers,
+      MetricMaker metrics) {
+    this.db = db;
+    this.migration = migration;
+
+    int accountBatchSize = cfg.getInt("noteDb", "accounts", "sequenceBatchSize", 1);
+    accountSeq =
+        new RepoSequence(
+            repoManager,
+            gitRefUpdated,
+            allUsers,
+            NAME_ACCOUNTS,
+            () -> ReviewDb.FIRST_ACCOUNT_ID,
+            accountBatchSize);
+
+    int gap = getChangeSequenceGap(cfg);
+    @SuppressWarnings("deprecation")
+    RepoSequence.Seed changeSeed = () -> db.get().nextChangeId() + gap;
+    int changeBatchSize = cfg.getInt("noteDb", "changes", "sequenceBatchSize", 20);
+    changeSeq =
+        new RepoSequence(
+            repoManager, gitRefUpdated, allProjects, NAME_CHANGES, changeSeed, changeBatchSize);
+
+    RepoSequence.Seed groupSeed = () -> nextGroupId(db.get());
+    int groupBatchSize = 1;
+    groupSeq =
+        new RepoSequence(
+            repoManager, gitRefUpdated, allUsers, NAME_GROUPS, groupSeed, groupBatchSize);
+
+    nextIdLatency =
+        metrics.newTimer(
+            "sequence/next_id_latency",
+            new Description("Latency of requesting IDs from repo sequences")
+                .setCumulative()
+                .setUnit(Units.MILLISECONDS),
+            Field.ofEnum(SequenceType.class, "sequence"),
+            Field.ofBoolean("multiple"));
+  }
+
+  public int nextAccountId() throws OrmException {
+    try (Timer2.Context timer = nextIdLatency.start(SequenceType.ACCOUNTS, false)) {
+      return accountSeq.next();
+    }
+  }
+
+  public int nextChangeId() throws OrmException {
+    if (!migration.readChangeSequence()) {
+      return nextChangeId(db.get());
+    }
+    try (Timer2.Context timer = nextIdLatency.start(SequenceType.CHANGES, false)) {
+      return changeSeq.next();
+    }
+  }
+
+  public ImmutableList<Integer> nextChangeIds(int count) throws OrmException {
+    if (migration.readChangeSequence()) {
+      try (Timer2.Context timer = nextIdLatency.start(SequenceType.CHANGES, count > 1)) {
+        return changeSeq.next(count);
+      }
+    }
+
+    if (count == 0) {
+      return ImmutableList.of();
+    }
+    checkArgument(count > 0, "count is negative: %s", count);
+    List<Integer> ids = new ArrayList<>(count);
+    ReviewDb db = this.db.get();
+    for (int i = 0; i < count; i++) {
+      ids.add(nextChangeId(db));
+    }
+    return ImmutableList.copyOf(ids);
+  }
+
+  public int nextGroupId() throws OrmException {
+    try (Timer2.Context timer = nextIdLatency.start(SequenceType.GROUPS, false)) {
+      return groupSeq.next();
+    }
+  }
+
+  @VisibleForTesting
+  public RepoSequence getChangeIdRepoSequence() {
+    return changeSeq;
+  }
+
+  @SuppressWarnings("deprecation")
+  private static int nextChangeId(ReviewDb db) throws OrmException {
+    return db.nextChangeId();
+  }
+
+  @SuppressWarnings("deprecation")
+  static int nextGroupId(ReviewDb db) throws OrmException {
+    return db.nextAccountGroupId();
+  }
+}
diff --git a/java/com/google/gerrit/server/ServerInitiated.java b/java/com/google/gerrit/server/ServerInitiated.java
new file mode 100644
index 0000000..087fbaa
--- /dev/null
+++ b/java/com/google/gerrit/server/ServerInitiated.java
@@ -0,0 +1,34 @@
+// Copyright (C) 2017 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.google.gerrit.server;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.inject.BindingAnnotation;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+/**
+ * A marker for database modifications which aren't directly related to a user request (e.g. happen
+ * outside of a request context). Those modifications will be attributed to the Gerrit server by
+ * using the Gerrit server identity as author for all related NoteDb commits.
+ */
+@BindingAnnotation
+@Target({FIELD, PARAMETER, METHOD})
+@Retention(RUNTIME)
+public @interface ServerInitiated {}
diff --git a/java/com/google/gerrit/server/StarredChangesUtil.java b/java/com/google/gerrit/server/StarredChangesUtil.java
new file mode 100644
index 0000000..4e349e6
--- /dev/null
+++ b/java/com/google/gerrit/server/StarredChangesUtil.java
@@ -0,0 +1,519 @@
+// Copyright (C) 2015 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.google.gerrit.server;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Objects.requireNonNull;
+import static java.util.stream.Collectors.joining;
+import static java.util.stream.Collectors.toSet;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.base.CharMatcher;
+import com.google.common.base.Joiner;
+import com.google.common.base.Splitter;
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableSortedSet;
+import com.google.common.collect.Sets;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.primitives.Ints;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.index.change.ChangeField;
+import com.google.gerrit.server.index.change.ChangeIndexer;
+import com.google.gerrit.server.logging.TraceContext;
+import com.google.gerrit.server.logging.TraceContext.TraceTimer;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.NullProgressMonitor;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.ObjectLoader;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefDatabase;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.ReceiveCommand;
+
+@Singleton
+public class StarredChangesUtil {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  @AutoValue
+  public abstract static class StarField {
+    private static final String SEPARATOR = ":";
+
+    public static StarField parse(String s) {
+      int p = s.indexOf(SEPARATOR);
+      if (p >= 0) {
+        Integer id = Ints.tryParse(s.substring(0, p));
+        if (id == null) {
+          return null;
+        }
+        Account.Id accountId = new Account.Id(id);
+        String label = s.substring(p + 1);
+        return create(accountId, label);
+      }
+      return null;
+    }
+
+    public static StarField create(Account.Id accountId, String label) {
+      return new AutoValue_StarredChangesUtil_StarField(accountId, label);
+    }
+
+    public abstract Account.Id accountId();
+
+    public abstract String label();
+
+    @Override
+    public String toString() {
+      return accountId() + SEPARATOR + label();
+    }
+  }
+
+  @AutoValue
+  public abstract static class StarRef {
+    private static final StarRef MISSING =
+        new AutoValue_StarredChangesUtil_StarRef(null, ImmutableSortedSet.of());
+
+    private static StarRef create(Ref ref, Iterable<String> labels) {
+      return new AutoValue_StarredChangesUtil_StarRef(
+          requireNonNull(ref), ImmutableSortedSet.copyOf(labels));
+    }
+
+    @Nullable
+    public abstract Ref ref();
+
+    public abstract ImmutableSortedSet<String> labels();
+
+    public ObjectId objectId() {
+      return ref() != null ? ref().getObjectId() : ObjectId.zeroId();
+    }
+  }
+
+  public static class IllegalLabelException extends Exception {
+    private static final long serialVersionUID = 1L;
+
+    IllegalLabelException(String message) {
+      super(message);
+    }
+  }
+
+  public static class InvalidLabelsException extends IllegalLabelException {
+    private static final long serialVersionUID = 1L;
+
+    InvalidLabelsException(Set<String> invalidLabels) {
+      super(String.format("invalid labels: %s", Joiner.on(", ").join(invalidLabels)));
+    }
+  }
+
+  public static class MutuallyExclusiveLabelsException extends IllegalLabelException {
+    private static final long serialVersionUID = 1L;
+
+    MutuallyExclusiveLabelsException(String label1, String label2) {
+      super(
+          String.format(
+              "The labels %s and %s are mutually exclusive. Only one of them can be set.",
+              label1, label2));
+    }
+  }
+
+  public static final String DEFAULT_LABEL = "star";
+  public static final String IGNORE_LABEL = "ignore";
+  public static final String REVIEWED_LABEL = "reviewed";
+  public static final String UNREVIEWED_LABEL = "unreviewed";
+  public static final ImmutableSortedSet<String> DEFAULT_LABELS =
+      ImmutableSortedSet.of(DEFAULT_LABEL);
+
+  private final GitRepositoryManager repoManager;
+  private final GitReferenceUpdated gitRefUpdated;
+  private final AllUsersName allUsers;
+  private final Provider<ReviewDb> dbProvider;
+  private final Provider<PersonIdent> serverIdent;
+  private final ChangeIndexer indexer;
+  private final Provider<InternalChangeQuery> queryProvider;
+
+  @Inject
+  StarredChangesUtil(
+      GitRepositoryManager repoManager,
+      GitReferenceUpdated gitRefUpdated,
+      AllUsersName allUsers,
+      Provider<ReviewDb> dbProvider,
+      @GerritPersonIdent Provider<PersonIdent> serverIdent,
+      ChangeIndexer indexer,
+      Provider<InternalChangeQuery> queryProvider) {
+    this.repoManager = repoManager;
+    this.gitRefUpdated = gitRefUpdated;
+    this.allUsers = allUsers;
+    this.dbProvider = dbProvider;
+    this.serverIdent = serverIdent;
+    this.indexer = indexer;
+    this.queryProvider = queryProvider;
+  }
+
+  public ImmutableSortedSet<String> getLabels(Account.Id accountId, Change.Id changeId)
+      throws OrmException {
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      return readLabels(repo, RefNames.refsStarredChanges(changeId, accountId)).labels();
+    } catch (IOException e) {
+      throw new OrmException(
+          String.format(
+              "Reading stars from change %d for account %d failed",
+              changeId.get(), accountId.get()),
+          e);
+    }
+  }
+
+  public ImmutableSortedSet<String> star(
+      Account.Id accountId,
+      Project.NameKey project,
+      Change.Id changeId,
+      Set<String> labelsToAdd,
+      Set<String> labelsToRemove)
+      throws OrmException, IllegalLabelException {
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      String refName = RefNames.refsStarredChanges(changeId, accountId);
+      StarRef old = readLabels(repo, refName);
+
+      Set<String> labels = new HashSet<>(old.labels());
+      if (labelsToAdd != null) {
+        labels.addAll(labelsToAdd);
+      }
+      if (labelsToRemove != null) {
+        labels.removeAll(labelsToRemove);
+      }
+
+      if (labels.isEmpty()) {
+        deleteRef(repo, refName, old.objectId());
+      } else {
+        checkMutuallyExclusiveLabels(labels);
+        updateLabels(repo, refName, old.objectId(), labels);
+      }
+
+      indexer.index(dbProvider.get(), project, changeId);
+      return ImmutableSortedSet.copyOf(labels);
+    } catch (IOException e) {
+      throw new OrmException(
+          String.format("Star change %d for account %d failed", changeId.get(), accountId.get()),
+          e);
+    }
+  }
+
+  public void unstarAll(Project.NameKey project, Change.Id changeId) throws OrmException {
+    try (Repository repo = repoManager.openRepository(allUsers);
+        RevWalk rw = new RevWalk(repo)) {
+      BatchRefUpdate batchUpdate = repo.getRefDatabase().newBatchUpdate();
+      batchUpdate.setAllowNonFastForwards(true);
+      batchUpdate.setRefLogIdent(serverIdent.get());
+      batchUpdate.setRefLogMessage("Unstar change " + changeId.get(), true);
+      for (Account.Id accountId : byChangeFromIndex(changeId).keySet()) {
+        String refName = RefNames.refsStarredChanges(changeId, accountId);
+        Ref ref = repo.getRefDatabase().getRef(refName);
+        batchUpdate.addCommand(new ReceiveCommand(ref.getObjectId(), ObjectId.zeroId(), refName));
+      }
+      batchUpdate.execute(rw, NullProgressMonitor.INSTANCE);
+      for (ReceiveCommand command : batchUpdate.getCommands()) {
+        if (command.getResult() != ReceiveCommand.Result.OK) {
+          throw new IOException(
+              String.format(
+                  "Unstar change %d failed, ref %s could not be deleted: %s",
+                  changeId.get(), command.getRefName(), command.getResult()));
+        }
+      }
+      indexer.index(dbProvider.get(), project, changeId);
+    } catch (IOException e) {
+      throw new OrmException(String.format("Unstar change %d failed", changeId.get()), e);
+    }
+  }
+
+  public ImmutableMap<Account.Id, StarRef> byChange(Change.Id changeId) throws OrmException {
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      ImmutableMap.Builder<Account.Id, StarRef> builder = ImmutableMap.builder();
+      for (String refPart : getRefNames(repo, RefNames.refsStarredChangesPrefix(changeId))) {
+        Integer id = Ints.tryParse(refPart);
+        if (id == null) {
+          continue;
+        }
+        Account.Id accountId = new Account.Id(id);
+        builder.put(accountId, readLabels(repo, RefNames.refsStarredChanges(changeId, accountId)));
+      }
+      return builder.build();
+    } catch (IOException e) {
+      throw new OrmException(
+          String.format("Get accounts that starred change %d failed", changeId.get()), e);
+    }
+  }
+
+  public ImmutableListMultimap<Account.Id, String> byChangeFromIndex(Change.Id changeId)
+      throws OrmException {
+    List<ChangeData> changeData =
+        queryProvider
+            .get()
+            .setRequestedFields(ChangeField.ID, ChangeField.STAR)
+            .byLegacyChangeId(changeId);
+    if (changeData.size() != 1) {
+      throw new NoSuchChangeException(changeId);
+    }
+    return changeData.get(0).stars();
+  }
+
+  private static Set<String> getRefNames(Repository repo, String prefix) throws IOException {
+    RefDatabase refDb = repo.getRefDatabase();
+    return refDb.getRefsByPrefix(prefix).stream()
+        .map(r -> r.getName().substring(prefix.length()))
+        .collect(toSet());
+  }
+
+  public ObjectId getObjectId(Account.Id accountId, Change.Id changeId) {
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      Ref ref = repo.exactRef(RefNames.refsStarredChanges(changeId, accountId));
+      return ref != null ? ref.getObjectId() : ObjectId.zeroId();
+    } catch (IOException e) {
+      logger.atSevere().withCause(e).log(
+          "Getting star object ID for account %d on change %d failed",
+          accountId.get(), changeId.get());
+      return ObjectId.zeroId();
+    }
+  }
+
+  public void ignore(ChangeResource rsrc) throws OrmException, IllegalLabelException {
+    star(
+        rsrc.getUser().asIdentifiedUser().getAccountId(),
+        rsrc.getProject(),
+        rsrc.getChange().getId(),
+        ImmutableSet.of(IGNORE_LABEL),
+        ImmutableSet.of());
+  }
+
+  public void unignore(ChangeResource rsrc) throws OrmException, IllegalLabelException {
+    star(
+        rsrc.getUser().asIdentifiedUser().getAccountId(),
+        rsrc.getProject(),
+        rsrc.getChange().getId(),
+        ImmutableSet.of(),
+        ImmutableSet.of(IGNORE_LABEL));
+  }
+
+  public boolean isIgnoredBy(Change.Id changeId, Account.Id accountId) throws OrmException {
+    return getLabels(accountId, changeId).contains(IGNORE_LABEL);
+  }
+
+  public boolean isIgnored(ChangeResource rsrc) throws OrmException {
+    return isIgnoredBy(rsrc.getChange().getId(), rsrc.getUser().asIdentifiedUser().getAccountId());
+  }
+
+  private static String getReviewedLabel(Change change) {
+    return getReviewedLabel(change.currentPatchSetId().get());
+  }
+
+  private static String getReviewedLabel(int ps) {
+    return REVIEWED_LABEL + "/" + ps;
+  }
+
+  private static String getUnreviewedLabel(Change change) {
+    return getUnreviewedLabel(change.currentPatchSetId().get());
+  }
+
+  private static String getUnreviewedLabel(int ps) {
+    return UNREVIEWED_LABEL + "/" + ps;
+  }
+
+  public void markAsReviewed(ChangeResource rsrc) throws OrmException, IllegalLabelException {
+    star(
+        rsrc.getUser().asIdentifiedUser().getAccountId(),
+        rsrc.getProject(),
+        rsrc.getChange().getId(),
+        ImmutableSet.of(getReviewedLabel(rsrc.getChange())),
+        ImmutableSet.of(getUnreviewedLabel(rsrc.getChange())));
+  }
+
+  public void markAsUnreviewed(ChangeResource rsrc) throws OrmException, IllegalLabelException {
+    star(
+        rsrc.getUser().asIdentifiedUser().getAccountId(),
+        rsrc.getProject(),
+        rsrc.getChange().getId(),
+        ImmutableSet.of(getUnreviewedLabel(rsrc.getChange())),
+        ImmutableSet.of(getReviewedLabel(rsrc.getChange())));
+  }
+
+  public static StarRef readLabels(Repository repo, String refName) throws IOException {
+    try (TraceTimer traceTimer = TraceContext.newTimer("Read star labels from %s", refName)) {
+      Ref ref = repo.exactRef(refName);
+      if (ref == null) {
+        return StarRef.MISSING;
+      }
+
+      try (ObjectReader reader = repo.newObjectReader()) {
+        ObjectLoader obj = reader.open(ref.getObjectId(), Constants.OBJ_BLOB);
+        return StarRef.create(
+            ref,
+            Splitter.on(CharMatcher.whitespace())
+                .omitEmptyStrings()
+                .split(new String(obj.getCachedBytes(Integer.MAX_VALUE), UTF_8)));
+      }
+    }
+  }
+
+  public static ObjectId writeLabels(Repository repo, Collection<String> labels)
+      throws IOException, InvalidLabelsException {
+    validateLabels(labels);
+    try (ObjectInserter oi = repo.newObjectInserter()) {
+      ObjectId id =
+          oi.insert(
+              Constants.OBJ_BLOB,
+              labels.stream().sorted().distinct().collect(joining("\n")).getBytes(UTF_8));
+      oi.flush();
+      return id;
+    }
+  }
+
+  private static void checkMutuallyExclusiveLabels(Set<String> labels)
+      throws MutuallyExclusiveLabelsException {
+    if (labels.containsAll(ImmutableSet.of(DEFAULT_LABEL, IGNORE_LABEL))) {
+      throw new MutuallyExclusiveLabelsException(DEFAULT_LABEL, IGNORE_LABEL);
+    }
+
+    Set<Integer> reviewedPatchSets = getStarredPatchSets(labels, REVIEWED_LABEL);
+    Set<Integer> unreviewedPatchSets = getStarredPatchSets(labels, UNREVIEWED_LABEL);
+    Optional<Integer> ps =
+        Sets.intersection(reviewedPatchSets, unreviewedPatchSets).stream().findFirst();
+    if (ps.isPresent()) {
+      throw new MutuallyExclusiveLabelsException(
+          getReviewedLabel(ps.get()), getUnreviewedLabel(ps.get()));
+    }
+  }
+
+  public static Set<Integer> getStarredPatchSets(Set<String> labels, String label) {
+    return labels.stream()
+        .filter(l -> l.startsWith(label + "/"))
+        .filter(l -> Ints.tryParse(l.substring(label.length() + 1)) != null)
+        .map(l -> Integer.valueOf(l.substring(label.length() + 1)))
+        .collect(toSet());
+  }
+
+  private static void validateLabels(Collection<String> labels) throws InvalidLabelsException {
+    if (labels == null) {
+      return;
+    }
+
+    SortedSet<String> invalidLabels = new TreeSet<>();
+    for (String label : labels) {
+      if (CharMatcher.whitespace().matchesAnyOf(label)) {
+        invalidLabels.add(label);
+      }
+    }
+    if (!invalidLabels.isEmpty()) {
+      throw new InvalidLabelsException(invalidLabels);
+    }
+  }
+
+  private void updateLabels(
+      Repository repo, String refName, ObjectId oldObjectId, Collection<String> labels)
+      throws IOException, OrmException, InvalidLabelsException {
+    try (TraceTimer traceTimer =
+            TraceContext.newTimer("Update star labels in %s (labels=%s)", refName, labels);
+        RevWalk rw = new RevWalk(repo)) {
+      RefUpdate u = repo.updateRef(refName);
+      u.setExpectedOldObjectId(oldObjectId);
+      u.setForceUpdate(true);
+      u.setNewObjectId(writeLabels(repo, labels));
+      u.setRefLogIdent(serverIdent.get());
+      u.setRefLogMessage("Update star labels", true);
+      RefUpdate.Result result = u.update(rw);
+      switch (result) {
+        case NEW:
+        case FORCED:
+        case NO_CHANGE:
+        case FAST_FORWARD:
+          gitRefUpdated.fire(allUsers, u, null);
+          return;
+        case IO_FAILURE:
+        case LOCK_FAILURE:
+        case NOT_ATTEMPTED:
+        case REJECTED:
+        case REJECTED_CURRENT_BRANCH:
+        case RENAMED:
+        case REJECTED_MISSING_OBJECT:
+        case REJECTED_OTHER_REASON:
+        default:
+          throw new OrmException(
+              String.format("Update star labels on ref %s failed: %s", refName, result.name()));
+      }
+    }
+  }
+
+  private void deleteRef(Repository repo, String refName, ObjectId oldObjectId)
+      throws IOException, OrmException {
+    if (ObjectId.zeroId().equals(oldObjectId)) {
+      // ref doesn't exist
+      return;
+    }
+
+    try (TraceTimer traceTimer = TraceContext.newTimer("Delete star labels in %s", refName)) {
+      RefUpdate u = repo.updateRef(refName);
+      u.setForceUpdate(true);
+      u.setExpectedOldObjectId(oldObjectId);
+      u.setRefLogIdent(serverIdent.get());
+      u.setRefLogMessage("Unstar change", true);
+      RefUpdate.Result result = u.delete();
+      switch (result) {
+        case FORCED:
+          gitRefUpdated.fire(allUsers, u, null);
+          return;
+        case NEW:
+        case NO_CHANGE:
+        case FAST_FORWARD:
+        case IO_FAILURE:
+        case LOCK_FAILURE:
+        case NOT_ATTEMPTED:
+        case REJECTED:
+        case REJECTED_CURRENT_BRANCH:
+        case RENAMED:
+        case REJECTED_MISSING_OBJECT:
+        case REJECTED_OTHER_REASON:
+        default:
+          throw new OrmException(
+              String.format("Delete star ref %s failed: %s", refName, result.name()));
+      }
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/StartupCheck.java b/java/com/google/gerrit/server/StartupCheck.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/StartupCheck.java
rename to java/com/google/gerrit/server/StartupCheck.java
diff --git a/java/com/google/gerrit/server/StartupChecks.java b/java/com/google/gerrit/server/StartupChecks.java
new file mode 100644
index 0000000..5ece91d
--- /dev/null
+++ b/java/com/google/gerrit/server/StartupChecks.java
@@ -0,0 +1,52 @@
+// Copyright (C) 2017 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.google.gerrit.server;
+
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.lifecycle.LifecycleModule;
+import com.google.gerrit.server.account.UniversalGroupBackend;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class StartupChecks implements LifecycleListener {
+  public static class Module extends LifecycleModule {
+    @Override
+    protected void configure() {
+      DynamicSet.setOf(binder(), StartupCheck.class);
+      listener().to(StartupChecks.class);
+      DynamicSet.bind(binder(), StartupCheck.class).to(UniversalGroupBackend.ConfigCheck.class);
+      DynamicSet.bind(binder(), StartupCheck.class).to(SystemGroupBackend.NameCheck.class);
+    }
+  }
+
+  private final PluginSetContext<StartupCheck> startupChecks;
+
+  @Inject
+  StartupChecks(PluginSetContext<StartupCheck> startupChecks) {
+    this.startupChecks = startupChecks;
+  }
+
+  @Override
+  public void start() throws StartupException {
+    startupChecks.runEach(c -> c.check(), StartupException.class);
+  }
+
+  @Override
+  public void stop() {}
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/StartupException.java b/java/com/google/gerrit/server/StartupException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/StartupException.java
rename to java/com/google/gerrit/server/StartupException.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/UrlEncoded.java b/java/com/google/gerrit/server/UrlEncoded.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/UrlEncoded.java
rename to java/com/google/gerrit/server/UrlEncoded.java
diff --git a/java/com/google/gerrit/server/UsedAt.java b/java/com/google/gerrit/server/UsedAt.java
new file mode 100644
index 0000000..b564157
--- /dev/null
+++ b/java/com/google/gerrit/server/UsedAt.java
@@ -0,0 +1,45 @@
+// 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.
+
+package com.google.gerrit.server;
+
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.common.annotations.GwtCompatible;
+import com.google.inject.BindingAnnotation;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+/**
+ * A marker for a method that is public solely because it is called from inside a project or an
+ * organisation using Gerrit.
+ */
+@BindingAnnotation
+@Target({METHOD, TYPE})
+@Retention(RUNTIME)
+@GwtCompatible
+public @interface UsedAt {
+  /** Enumeration of projects that call a method that would otherwise be private. */
+  enum Project {
+    GOOGLE,
+    PLUGIN_DELETE_PROJECT,
+    PLUGIN_SERVICEUSER,
+    PLUGINS_ALL, // Use this project if a method/type is generally made available to all plugins.
+  }
+
+  /** Reference to the project that uses the method annotated with this annotation. */
+  Project value();
+}
diff --git a/java/com/google/gerrit/server/UserInitiated.java b/java/com/google/gerrit/server/UserInitiated.java
new file mode 100644
index 0000000..3eda2f0
--- /dev/null
+++ b/java/com/google/gerrit/server/UserInitiated.java
@@ -0,0 +1,34 @@
+// Copyright (C) 2017 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.google.gerrit.server;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.inject.BindingAnnotation;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+/**
+ * A marker for database modifications which are directly related to a user request (e.g. happen
+ * inside of a request context). Those modifications will be attributed to the user by using the
+ * user's identity as author for all related NoteDb commits.
+ */
+@BindingAnnotation
+@Target({FIELD, PARAMETER, METHOD})
+@Retention(RUNTIME)
+public @interface UserInitiated {}
diff --git a/java/com/google/gerrit/server/WebLinks.java b/java/com/google/gerrit/server/WebLinks.java
new file mode 100644
index 0000000..39a2328
--- /dev/null
+++ b/java/com/google/gerrit/server/WebLinks.java
@@ -0,0 +1,223 @@
+// Copyright (C) 2014 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.google.gerrit.server;
+
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.base.Strings;
+import com.google.common.collect.FluentIterable;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.WebLinkInfoCommon;
+import com.google.gerrit.extensions.common.DiffWebLinkInfo;
+import com.google.gerrit.extensions.common.WebLinkInfo;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.webui.BranchWebLink;
+import com.google.gerrit.extensions.webui.DiffWebLink;
+import com.google.gerrit.extensions.webui.FileHistoryWebLink;
+import com.google.gerrit.extensions.webui.FileWebLink;
+import com.google.gerrit.extensions.webui.ParentWebLink;
+import com.google.gerrit.extensions.webui.PatchSetWebLink;
+import com.google.gerrit.extensions.webui.ProjectWebLink;
+import com.google.gerrit.extensions.webui.TagWebLink;
+import com.google.gerrit.extensions.webui.WebLink;
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.Collections;
+import java.util.List;
+
+@Singleton
+public class WebLinks {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final Predicate<WebLinkInfo> INVALID_WEBLINK =
+      link -> {
+        if (link == null) {
+          return false;
+        } else if (Strings.isNullOrEmpty(link.name) || Strings.isNullOrEmpty(link.url)) {
+          logger.atWarning().log("%s is missing name and/or url", link.getClass().getName());
+          return false;
+        }
+        return true;
+      };
+
+  private static final Predicate<WebLinkInfoCommon> INVALID_WEBLINK_COMMON =
+      link -> {
+        if (link == null) {
+          return false;
+        } else if (Strings.isNullOrEmpty(link.name) || Strings.isNullOrEmpty(link.url)) {
+          logger.atWarning().log("%s is missing name and/or url", link.getClass().getName());
+          return false;
+        }
+        return true;
+      };
+
+  private final DynamicSet<PatchSetWebLink> patchSetLinks;
+  private final DynamicSet<ParentWebLink> parentLinks;
+  private final DynamicSet<FileWebLink> fileLinks;
+  private final DynamicSet<FileHistoryWebLink> fileHistoryLinks;
+  private final DynamicSet<DiffWebLink> diffLinks;
+  private final DynamicSet<ProjectWebLink> projectLinks;
+  private final DynamicSet<BranchWebLink> branchLinks;
+  private final DynamicSet<TagWebLink> tagLinks;
+
+  @Inject
+  public WebLinks(
+      DynamicSet<PatchSetWebLink> patchSetLinks,
+      DynamicSet<ParentWebLink> parentLinks,
+      DynamicSet<FileWebLink> fileLinks,
+      DynamicSet<FileHistoryWebLink> fileLogLinks,
+      DynamicSet<DiffWebLink> diffLinks,
+      DynamicSet<ProjectWebLink> projectLinks,
+      DynamicSet<BranchWebLink> branchLinks,
+      DynamicSet<TagWebLink> tagLinks) {
+    this.patchSetLinks = patchSetLinks;
+    this.parentLinks = parentLinks;
+    this.fileLinks = fileLinks;
+    this.fileHistoryLinks = fileLogLinks;
+    this.diffLinks = diffLinks;
+    this.projectLinks = projectLinks;
+    this.branchLinks = branchLinks;
+    this.tagLinks = tagLinks;
+  }
+
+  /**
+   * @param project Project name.
+   * @param commit SHA1 of commit.
+   * @return Links for patch sets.
+   */
+  public List<WebLinkInfo> getPatchSetLinks(Project.NameKey project, String commit) {
+    return filterLinks(patchSetLinks, webLink -> webLink.getPatchSetWebLink(project.get(), commit));
+  }
+
+  /**
+   * @param project Project name.
+   * @param revision SHA1 of the parent revision.
+   * @return Links for patch sets.
+   */
+  public List<WebLinkInfo> getParentLinks(Project.NameKey project, String revision) {
+    return filterLinks(parentLinks, webLink -> webLink.getParentWebLink(project.get(), revision));
+  }
+
+  /**
+   * @param project Project name.
+   * @param revision SHA1 of revision.
+   * @param file File name.
+   * @return Links for files.
+   */
+  public List<WebLinkInfo> getFileLinks(String project, String revision, String file) {
+    return Patch.isMagic(file)
+        ? Collections.emptyList()
+        : filterLinks(fileLinks, webLink -> webLink.getFileWebLink(project, revision, file));
+  }
+
+  /**
+   * @param project Project name.
+   * @param revision SHA1 of revision.
+   * @param file File name.
+   * @return Links for file history
+   */
+  public List<WebLinkInfoCommon> getFileHistoryLinks(String project, String revision, String file) {
+    if (Patch.isMagic(file)) {
+      return Collections.emptyList();
+    }
+    return FluentIterable.from(fileHistoryLinks)
+        .transform(
+            webLink -> {
+              WebLinkInfo info = webLink.getFileHistoryWebLink(project, revision, file);
+              if (info == null) {
+                return null;
+              }
+              WebLinkInfoCommon commonInfo = new WebLinkInfoCommon();
+              commonInfo.name = info.name;
+              commonInfo.imageUrl = info.imageUrl;
+              commonInfo.url = info.url;
+              commonInfo.target = info.target;
+              return commonInfo;
+            })
+        .filter(INVALID_WEBLINK_COMMON)
+        .toList();
+  }
+
+  /**
+   * @param project Project name.
+   * @param patchSetIdA Patch set ID of side A, <code>null</code> if no base patch set was selected.
+   * @param revisionA SHA1 of revision of side A.
+   * @param fileA File name of side A.
+   * @param patchSetIdB Patch set ID of side B.
+   * @param revisionB SHA1 of revision of side B.
+   * @param fileB File name of side B.
+   * @return Links for file diffs.
+   */
+  public List<DiffWebLinkInfo> getDiffLinks(
+      final String project,
+      final int changeId,
+      final Integer patchSetIdA,
+      final String revisionA,
+      final String fileA,
+      final int patchSetIdB,
+      final String revisionB,
+      final String fileB) {
+    if (Patch.isMagic(fileA) || Patch.isMagic(fileB)) {
+      return Collections.emptyList();
+    }
+    return FluentIterable.from(diffLinks)
+        .transform(
+            webLink ->
+                webLink.getDiffLink(
+                    project,
+                    changeId,
+                    patchSetIdA,
+                    revisionA,
+                    fileA,
+                    patchSetIdB,
+                    revisionB,
+                    fileB))
+        .filter(INVALID_WEBLINK)
+        .toList();
+  }
+
+  /**
+   * @param project Project name.
+   * @return Links for projects.
+   */
+  public List<WebLinkInfo> getProjectLinks(String project) {
+    return filterLinks(projectLinks, webLink -> webLink.getProjectWeblink(project));
+  }
+
+  /**
+   * @param project Project name
+   * @param branch Branch name
+   * @return Links for branches.
+   */
+  public List<WebLinkInfo> getBranchLinks(String project, String branch) {
+    return filterLinks(branchLinks, webLink -> webLink.getBranchWebLink(project, branch));
+  }
+
+  /**
+   * @param project Project name
+   * @param tag Tag name
+   * @return Links for tags.
+   */
+  public List<WebLinkInfo> getTagLinks(String project, String tag) {
+    return filterLinks(tagLinks, webLink -> webLink.getTagWebLink(project, tag));
+  }
+
+  private <T extends WebLink> List<WebLinkInfo> filterLinks(
+      DynamicSet<T> links, Function<T, WebLinkInfo> transformer) {
+    return FluentIterable.from(links).transform(transformer).filter(INVALID_WEBLINK).toList();
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AbstractGroupBackend.java b/java/com/google/gerrit/server/account/AbstractGroupBackend.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/account/AbstractGroupBackend.java
rename to java/com/google/gerrit/server/account/AbstractGroupBackend.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AbstractRealm.java b/java/com/google/gerrit/server/account/AbstractRealm.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/account/AbstractRealm.java
rename to java/com/google/gerrit/server/account/AbstractRealm.java
diff --git a/java/com/google/gerrit/server/account/AccountCache.java b/java/com/google/gerrit/server/account/AccountCache.java
new file mode 100644
index 0000000..17493bf
--- /dev/null
+++ b/java/com/google/gerrit/server/account/AccountCache.java
@@ -0,0 +1,86 @@
+// Copyright (C) 2009 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.google.gerrit.server.account;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Account;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+
+/** Caches important (but small) account state to avoid database hits. */
+public interface AccountCache {
+  /**
+   * Returns an {@code AccountState} instance for the given account ID. If not cached yet the
+   * account is loaded. Returns {@link Optional#empty()} if the account is missing.
+   *
+   * @param accountId ID of the account that should be retrieved
+   * @return {@code AccountState} instance for the given account ID, if no account with this ID
+   *     exists {@link Optional#empty()} is returned
+   */
+  Optional<AccountState> get(Account.Id accountId);
+
+  /**
+   * Returns a {@code Map} of {@code Account.Id} to {@code AccountState} for the given account IDs.
+   * If not cached yet the accounts are loaded. If an account can't be loaded (e.g. because it is
+   * missing), the entry will be missing from the result.
+   *
+   * <p>Loads accounts in parallel if applicable.
+   *
+   * @param accountIds IDs of the account that should be retrieved
+   * @return {@code Map} of {@code Account.Id} to {@code AccountState} instances for the given
+   *     account IDs, if an account can't be loaded (e.g. because it is missing), the entry will be
+   *     missing from the result
+   */
+  Map<Account.Id, AccountState> get(Set<Account.Id> accountIds);
+
+  /**
+   * Returns an {@code AccountState} instance for the given account ID. If not cached yet the
+   * account is loaded. Returns an empty {@code AccountState} instance to represent a missing
+   * account.
+   *
+   * <p>This method should only be used in exceptional cases where it is required to get an account
+   * state even if the account is missing. Callers should leave a comment with the method invocation
+   * explaining why this method is used. Most callers of {@link AccountCache} should use {@link
+   * #get(Account.Id)} instead and handle the missing account case explicitly.
+   *
+   * @param accountId ID of the account that should be retrieved
+   * @return {@code AccountState} instance for the given account ID, if no account with this ID
+   *     exists an empty {@code AccountState} instance is returned to represent the missing account
+   */
+  AccountState getEvenIfMissing(Account.Id accountId);
+
+  /**
+   * Returns an {@code AccountState} instance for the given username.
+   *
+   * <p>This method first loads the external ID for the username and then uses the account ID of the
+   * external ID to lookup the account from the cache.
+   *
+   * @param username username of the account that should be retrieved
+   * @return {@code AccountState} instance for the given username, if no account with this username
+   *     exists or if loading the external ID fails {@link Optional#empty()} is returned
+   */
+  Optional<AccountState> getByUsername(String username);
+
+  /**
+   * Evicts the account from the cache.
+   *
+   * @param accountId account ID of the account that should be evicted
+   */
+  void evict(@Nullable Account.Id accountId);
+
+  /** Evict all accounts from the cache. */
+  void evictAll();
+}
diff --git a/java/com/google/gerrit/server/account/AccountCacheImpl.java b/java/com/google/gerrit/server/account/AccountCacheImpl.java
new file mode 100644
index 0000000..fd48fa7
--- /dev/null
+++ b/java/com/google/gerrit/server/account/AccountCacheImpl.java
@@ -0,0 +1,191 @@
+// Copyright (C) 2009 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.google.gerrit.server.account;
+
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_USERNAME;
+
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.FanOutExecutor;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.account.externalids.ExternalIds;
+import com.google.gerrit.server.cache.CacheModule;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.logging.TraceContext;
+import com.google.gerrit.server.logging.TraceContext.TraceTimer;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.inject.Inject;
+import com.google.inject.Module;
+import com.google.inject.Singleton;
+import com.google.inject.TypeLiteral;
+import com.google.inject.name.Named;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+/** Caches important (but small) account state to avoid database hits. */
+@Singleton
+public class AccountCacheImpl implements AccountCache {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final String BYID_NAME = "accounts";
+
+  public static Module module() {
+    return new CacheModule() {
+      @Override
+      protected void configure() {
+        cache(BYID_NAME, Account.Id.class, new TypeLiteral<Optional<AccountState>>() {})
+            .loader(ByIdLoader.class);
+
+        bind(AccountCacheImpl.class);
+        bind(AccountCache.class).to(AccountCacheImpl.class);
+      }
+    };
+  }
+
+  private final AllUsersName allUsersName;
+  private final ExternalIds externalIds;
+  private final LoadingCache<Account.Id, Optional<AccountState>> byId;
+  private final ExecutorService executor;
+
+  @Inject
+  AccountCacheImpl(
+      AllUsersName allUsersName,
+      ExternalIds externalIds,
+      @Named(BYID_NAME) LoadingCache<Account.Id, Optional<AccountState>> byId,
+      @FanOutExecutor ExecutorService executor) {
+    this.allUsersName = allUsersName;
+    this.externalIds = externalIds;
+    this.byId = byId;
+    this.executor = executor;
+  }
+
+  @Override
+  public AccountState getEvenIfMissing(Account.Id accountId) {
+    try {
+      return byId.get(accountId).orElse(missing(accountId));
+    } catch (ExecutionException e) {
+      logger.atWarning().withCause(e).log("Cannot load AccountState for %s", accountId);
+      return missing(accountId);
+    }
+  }
+
+  @Override
+  public Optional<AccountState> get(Account.Id accountId) {
+    try {
+      return byId.get(accountId);
+    } catch (ExecutionException e) {
+      logger.atWarning().withCause(e).log("Cannot load AccountState for ID %s", accountId);
+      return null;
+    }
+  }
+
+  @Override
+  public Map<Account.Id, AccountState> get(Set<Account.Id> accountIds) {
+    Map<Account.Id, AccountState> accountStates = new HashMap<>(accountIds.size());
+    List<Callable<Optional<AccountState>>> callables = new ArrayList<>();
+    for (Account.Id accountId : accountIds) {
+      Optional<AccountState> state = byId.getIfPresent(accountId);
+      if (state != null) {
+        // The value is in-memory, so we just get the state
+        state.ifPresent(s -> accountStates.put(accountId, s));
+      } else {
+        // Queue up a callable so that we can load accounts in parallel
+        callables.add(() -> get(accountId));
+      }
+    }
+    if (callables.isEmpty()) {
+      return accountStates;
+    }
+
+    List<Future<Optional<AccountState>>> futures;
+    try {
+      futures = executor.invokeAll(callables);
+    } catch (InterruptedException e) {
+      logger.atSevere().withCause(e).log("Cannot load AccountStates");
+      return ImmutableMap.of();
+    }
+    for (Future<Optional<AccountState>> f : futures) {
+      try {
+        f.get().ifPresent(s -> accountStates.put(s.getAccount().getId(), s));
+      } catch (InterruptedException | ExecutionException e) {
+        logger.atSevere().withCause(e).log("Cannot load AccountState");
+      }
+    }
+    return accountStates;
+  }
+
+  @Override
+  public Optional<AccountState> getByUsername(String username) {
+    try {
+      return externalIds
+          .get(ExternalId.Key.create(SCHEME_USERNAME, username))
+          .map(e -> get(e.accountId()))
+          .orElseGet(Optional::empty);
+    } catch (IOException | ConfigInvalidException e) {
+      logger.atWarning().withCause(e).log("Cannot load AccountState for username %s", username);
+      return null;
+    }
+  }
+
+  @Override
+  public void evict(@Nullable Account.Id accountId) {
+    if (accountId != null) {
+      logger.atFine().log("Evict account %d", accountId.get());
+      byId.invalidate(accountId);
+    }
+  }
+
+  @Override
+  public void evictAll() {
+    logger.atFine().log("Evict all accounts");
+    byId.invalidateAll();
+  }
+
+  private AccountState missing(Account.Id accountId) {
+    Account account = new Account(accountId, TimeUtil.nowTs());
+    account.setActive(false);
+    return AccountState.forAccount(allUsersName, account);
+  }
+
+  static class ByIdLoader extends CacheLoader<Account.Id, Optional<AccountState>> {
+    private final Accounts accounts;
+
+    @Inject
+    ByIdLoader(Accounts accounts) {
+      this.accounts = accounts;
+    }
+
+    @Override
+    public Optional<AccountState> load(Account.Id who) throws Exception {
+      try (TraceTimer timer = TraceContext.newTimer("Loading account %s", who)) {
+        return accounts.get(who);
+      }
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/account/AccountConfig.java b/java/com/google/gerrit/server/account/AccountConfig.java
new file mode 100644
index 0000000..d58036d
--- /dev/null
+++ b/java/com/google/gerrit/server/account/AccountConfig.java
@@ -0,0 +1,364 @@
+// Copyright (C) 2017 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.google.gerrit.server.account;
+
+import static com.google.common.base.Preconditions.checkState;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.extensions.client.DiffPreferencesInfo;
+import com.google.gerrit.extensions.client.EditPreferencesInfo;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gerrit.server.account.ProjectWatches.ProjectWatchKey;
+import com.google.gerrit.server.account.externalids.ExternalIds;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.git.ValidationError;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.git.meta.VersionedMetaData;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmDuplicateKeyException;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevSort;
+
+/**
+ * Reads/writes account data from/to a user branch in the {@code All-Users} repository.
+ *
+ * <p>This is the low-level API for account creation and account updates. Most callers should use
+ * {@link AccountsUpdate} for creating and updating accounts.
+ *
+ * <p>This class can read/write account properties, preferences (general, diff and edit preferences)
+ * and project watches.
+ *
+ * <p>The following files are read/written:
+ *
+ * <ul>
+ *   <li>'account.config': Contains the account properties. Parsing and writing it is delegated to
+ *       {@link AccountProperties}.
+ *   <li>'preferences.config': Contains the preferences. Parsing and writing it is delegated to
+ *       {@link Preferences}.
+ *   <li>'account.config': Contains the project watches. Parsing and writing it is delegated to
+ *       {@link ProjectWatches}.
+ * </ul>
+ *
+ * <p>The commit date of the first commit on the user branch is used as registration date of the
+ * account. The first commit may be an empty commit (since all config files are optional).
+ */
+public class AccountConfig extends VersionedMetaData implements ValidationError.Sink {
+  private final Account.Id accountId;
+  private final AllUsersName allUsersName;
+  private final Repository repo;
+  private final String ref;
+
+  private Optional<AccountProperties> loadedAccountProperties;
+  private Optional<ObjectId> externalIdsRev;
+  private ProjectWatches projectWatches;
+  private Preferences preferences;
+  private Optional<InternalAccountUpdate> accountUpdate = Optional.empty();
+  private List<ValidationError> validationErrors;
+
+  public AccountConfig(Account.Id accountId, AllUsersName allUsersName, Repository allUsersRepo) {
+    this.accountId = requireNonNull(accountId, "accountId");
+    this.allUsersName = requireNonNull(allUsersName, "allUsersName");
+    this.repo = requireNonNull(allUsersRepo, "allUsersRepo");
+    this.ref = RefNames.refsUsers(accountId);
+  }
+
+  @Override
+  protected String getRefName() {
+    return ref;
+  }
+
+  public AccountConfig load() throws IOException, ConfigInvalidException {
+    load(allUsersName, repo);
+    return this;
+  }
+
+  /**
+   * Get the loaded account.
+   *
+   * @return the loaded account, {@link Optional#empty()} if load didn't find the account because it
+   *     doesn't exist
+   * @throws IllegalStateException if the account was not loaded yet
+   */
+  public Optional<Account> getLoadedAccount() {
+    checkLoaded();
+    return loadedAccountProperties.map(AccountProperties::getAccount);
+  }
+
+  /**
+   * Returns the revision of the {@code refs/meta/external-ids} branch.
+   *
+   * <p>This revision can be used to load the external IDs of the loaded account lazily via {@link
+   * ExternalIds#byAccount(com.google.gerrit.reviewdb.client.Account.Id, ObjectId)}.
+   *
+   * @return revision of the {@code refs/meta/external-ids} branch, {@link Optional#empty()} if no
+   *     {@code refs/meta/external-ids} branch exists
+   */
+  public Optional<ObjectId> getExternalIdsRev() {
+    checkLoaded();
+    return externalIdsRev;
+  }
+
+  /**
+   * Get the project watches of the loaded account.
+   *
+   * @return the project watches of the loaded account
+   */
+  public ImmutableMap<ProjectWatchKey, ImmutableSet<NotifyType>> getProjectWatches() {
+    checkLoaded();
+    return projectWatches.getProjectWatches();
+  }
+
+  /**
+   * Get the general preferences of the loaded account.
+   *
+   * @return the general preferences of the loaded account
+   */
+  public GeneralPreferencesInfo getGeneralPreferences() {
+    checkLoaded();
+    return preferences.getGeneralPreferences();
+  }
+
+  /**
+   * Get the diff preferences of the loaded account.
+   *
+   * @return the diff preferences of the loaded account
+   */
+  public DiffPreferencesInfo getDiffPreferences() {
+    checkLoaded();
+    return preferences.getDiffPreferences();
+  }
+
+  /**
+   * Get the edit preferences of the loaded account.
+   *
+   * @return the edit preferences of the loaded account
+   */
+  public EditPreferencesInfo getEditPreferences() {
+    checkLoaded();
+    return preferences.getEditPreferences();
+  }
+
+  /**
+   * Sets the account. This means the loaded account will be overwritten with the given account.
+   *
+   * <p>Changing the registration date of an account is not supported.
+   *
+   * @param account account that should be set
+   * @throws IllegalStateException if the account was not loaded yet
+   */
+  public AccountConfig setAccount(Account account) {
+    checkLoaded();
+    this.loadedAccountProperties =
+        Optional.of(
+            new AccountProperties(account.getId(), account.getRegisteredOn(), new Config(), null));
+    this.accountUpdate =
+        Optional.of(
+            InternalAccountUpdate.builder()
+                .setActive(account.isActive())
+                .setFullName(account.getFullName())
+                .setPreferredEmail(account.getPreferredEmail())
+                .setStatus(account.getStatus())
+                .build());
+    return this;
+  }
+
+  /**
+   * Creates a new account.
+   *
+   * @return the new account
+   * @throws OrmDuplicateKeyException if the user branch already exists
+   */
+  public Account getNewAccount() throws OrmDuplicateKeyException {
+    return getNewAccount(TimeUtil.nowTs());
+  }
+
+  /**
+   * Creates a new account.
+   *
+   * @return the new account
+   * @throws OrmDuplicateKeyException if the user branch already exists
+   */
+  Account getNewAccount(Timestamp registeredOn) throws OrmDuplicateKeyException {
+    checkLoaded();
+    if (revision != null) {
+      throw new OrmDuplicateKeyException(String.format("account %s already exists", accountId));
+    }
+    this.loadedAccountProperties =
+        Optional.of(new AccountProperties(accountId, registeredOn, new Config(), null));
+    return loadedAccountProperties.map(AccountProperties::getAccount).get();
+  }
+
+  public AccountConfig setAccountUpdate(InternalAccountUpdate accountUpdate) {
+    this.accountUpdate = Optional.of(accountUpdate);
+    return this;
+  }
+
+  @Override
+  protected void onLoad() throws IOException, ConfigInvalidException {
+    if (revision != null) {
+      rw.reset();
+      rw.markStart(revision);
+      rw.sort(RevSort.REVERSE);
+      Timestamp registeredOn = new Timestamp(rw.next().getCommitTime() * 1000L);
+
+      Config accountConfig = readConfig(AccountProperties.ACCOUNT_CONFIG);
+      loadedAccountProperties =
+          Optional.of(new AccountProperties(accountId, registeredOn, accountConfig, revision));
+
+      projectWatches = new ProjectWatches(accountId, readConfig(ProjectWatches.WATCH_CONFIG), this);
+
+      preferences =
+          new Preferences(
+              accountId,
+              readConfig(Preferences.PREFERENCES_CONFIG),
+              Preferences.readDefaultConfig(allUsersName, repo),
+              this);
+
+      projectWatches.parse();
+      preferences.parse();
+    } else {
+      loadedAccountProperties = Optional.empty();
+
+      projectWatches = new ProjectWatches(accountId, new Config(), this);
+
+      preferences =
+          new Preferences(
+              accountId, new Config(), Preferences.readDefaultConfig(allUsersName, repo), this);
+    }
+
+    Ref externalIdsRef = repo.exactRef(RefNames.REFS_EXTERNAL_IDS);
+    externalIdsRev = Optional.ofNullable(externalIdsRef).map(Ref::getObjectId);
+  }
+
+  @Override
+  public RevCommit commit(MetaDataUpdate update) throws IOException {
+    RevCommit c = super.commit(update);
+    loadedAccountProperties.get().setMetaId(c);
+    return c;
+  }
+
+  @Override
+  protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException {
+    checkLoaded();
+
+    if (!loadedAccountProperties.isPresent()) {
+      return false;
+    }
+
+    if (revision != null) {
+      if (Strings.isNullOrEmpty(commit.getMessage())) {
+        commit.setMessage("Update account\n");
+      }
+    } else {
+      if (Strings.isNullOrEmpty(commit.getMessage())) {
+        commit.setMessage("Create account\n");
+      }
+
+      Timestamp registeredOn = loadedAccountProperties.get().getRegisteredOn();
+      commit.setAuthor(new PersonIdent(commit.getAuthor(), registeredOn));
+      commit.setCommitter(new PersonIdent(commit.getCommitter(), registeredOn));
+    }
+
+    saveAccount();
+    saveProjectWatches();
+    savePreferences();
+
+    accountUpdate = Optional.empty();
+
+    return true;
+  }
+
+  private void saveAccount() throws IOException {
+    if (accountUpdate.isPresent()) {
+      saveConfig(
+          AccountProperties.ACCOUNT_CONFIG,
+          loadedAccountProperties.get().save(accountUpdate.get()));
+    }
+  }
+
+  private void saveProjectWatches() throws IOException {
+    if (accountUpdate.isPresent()
+        && (!accountUpdate.get().getDeletedProjectWatches().isEmpty()
+            || !accountUpdate.get().getUpdatedProjectWatches().isEmpty())) {
+      Map<ProjectWatchKey, Set<NotifyType>> newProjectWatches =
+          new HashMap<>(projectWatches.getProjectWatches());
+      accountUpdate.get().getDeletedProjectWatches().forEach(newProjectWatches::remove);
+      accountUpdate.get().getUpdatedProjectWatches().forEach(newProjectWatches::put);
+      saveConfig(ProjectWatches.WATCH_CONFIG, projectWatches.save(newProjectWatches));
+    }
+  }
+
+  private void savePreferences() throws IOException, ConfigInvalidException {
+    if (!accountUpdate.isPresent()
+        || (!accountUpdate.get().getGeneralPreferences().isPresent()
+            && !accountUpdate.get().getDiffPreferences().isPresent()
+            && !accountUpdate.get().getEditPreferences().isPresent())) {
+      return;
+    }
+
+    saveConfig(
+        Preferences.PREFERENCES_CONFIG,
+        preferences.saveGeneralPreferences(
+            accountUpdate.get().getGeneralPreferences(),
+            accountUpdate.get().getDiffPreferences(),
+            accountUpdate.get().getEditPreferences()));
+  }
+
+  private void checkLoaded() {
+    checkState(loadedAccountProperties != null, "Account %s not loaded yet", accountId.get());
+  }
+
+  /**
+   * Get the validation errors, if any were discovered during parsing the account data.
+   *
+   * @return list of errors; empty list if there are no errors.
+   */
+  public List<ValidationError> getValidationErrors() {
+    if (validationErrors != null) {
+      return ImmutableList.copyOf(validationErrors);
+    }
+    return ImmutableList.of();
+  }
+
+  @Override
+  public void error(ValidationError error) {
+    if (validationErrors == null) {
+      validationErrors = new ArrayList<>(4);
+    }
+    validationErrors.add(error);
+  }
+}
diff --git a/java/com/google/gerrit/server/account/AccountControl.java b/java/com/google/gerrit/server/account/AccountControl.java
new file mode 100644
index 0000000..b43e786
--- /dev/null
+++ b/java/com/google/gerrit/server/account/AccountControl.java
@@ -0,0 +1,237 @@
+// Copyright (C) 2012 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.google.gerrit.server.account;
+
+import static java.util.stream.Collectors.toSet;
+
+import com.google.gerrit.common.data.PermissionRule;
+import com.google.gerrit.common.errors.NoSuchGroupException;
+import com.google.gerrit.extensions.common.AccountVisibility;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.AccountsSection;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.util.Set;
+
+/** Access control management for one account's access to other accounts. */
+public class AccountControl {
+  public static class Factory {
+    private final PermissionBackend permissionBackend;
+    private final ProjectCache projectCache;
+    private final GroupControl.Factory groupControlFactory;
+    private final Provider<CurrentUser> user;
+    private final IdentifiedUser.GenericFactory userFactory;
+    private final AccountVisibility accountVisibility;
+
+    @Inject
+    Factory(
+        PermissionBackend permissionBackend,
+        ProjectCache projectCache,
+        GroupControl.Factory groupControlFactory,
+        Provider<CurrentUser> user,
+        IdentifiedUser.GenericFactory userFactory,
+        AccountVisibility accountVisibility) {
+      this.permissionBackend = permissionBackend;
+      this.projectCache = projectCache;
+      this.groupControlFactory = groupControlFactory;
+      this.user = user;
+      this.userFactory = userFactory;
+      this.accountVisibility = accountVisibility;
+    }
+
+    public AccountControl get() {
+      return new AccountControl(
+          permissionBackend,
+          projectCache,
+          groupControlFactory,
+          user.get(),
+          userFactory,
+          accountVisibility);
+    }
+  }
+
+  private final AccountsSection accountsSection;
+  private final GroupControl.Factory groupControlFactory;
+  private final PermissionBackend.WithUser perm;
+  private final CurrentUser user;
+  private final IdentifiedUser.GenericFactory userFactory;
+  private final AccountVisibility accountVisibility;
+
+  private Boolean viewAll;
+
+  AccountControl(
+      PermissionBackend permissionBackend,
+      ProjectCache projectCache,
+      GroupControl.Factory groupControlFactory,
+      CurrentUser user,
+      IdentifiedUser.GenericFactory userFactory,
+      AccountVisibility accountVisibility) {
+    this.accountsSection = projectCache.getAllProjects().getConfig().getAccountsSection();
+    this.groupControlFactory = groupControlFactory;
+    this.perm = permissionBackend.user(user);
+    this.user = user;
+    this.userFactory = userFactory;
+    this.accountVisibility = accountVisibility;
+  }
+
+  public CurrentUser getUser() {
+    return user;
+  }
+
+  /**
+   * Returns true if the current user is allowed to see the otherUser, based on the account
+   * visibility policy. Depending on the group membership realms supported, this may not be able to
+   * determine SAME_GROUP or VISIBLE_GROUP correctly (defaulting to not being visible). This is
+   * because {@link GroupMembership#getKnownGroups()} may only return a subset of the effective
+   * groups.
+   */
+  public boolean canSee(Account otherUser) {
+    return canSee(otherUser.getId());
+  }
+
+  /**
+   * Returns true if the current user is allowed to see the otherUser, based on the account
+   * visibility policy. Depending on the group membership realms supported, this may not be able to
+   * determine SAME_GROUP or VISIBLE_GROUP correctly (defaulting to not being visible). This is
+   * because {@link GroupMembership#getKnownGroups()} may only return a subset of the effective
+   * groups.
+   */
+  public boolean canSee(Account.Id otherUser) {
+    return canSee(
+        new OtherUser() {
+          @Override
+          Account.Id getId() {
+            return otherUser;
+          }
+
+          @Override
+          IdentifiedUser createUser() {
+            return userFactory.create(otherUser);
+          }
+        });
+  }
+
+  /**
+   * Returns true if the current user is allowed to see the otherUser, based on the account
+   * visibility policy. Depending on the group membership realms supported, this may not be able to
+   * determine SAME_GROUP or VISIBLE_GROUP correctly (defaulting to not being visible). This is
+   * because {@link GroupMembership#getKnownGroups()} may only return a subset of the effective
+   * groups.
+   */
+  public boolean canSee(AccountState otherUser) {
+    return canSee(
+        new OtherUser() {
+          @Override
+          Account.Id getId() {
+            return otherUser.getAccount().getId();
+          }
+
+          @Override
+          IdentifiedUser createUser() {
+            return userFactory.create(otherUser);
+          }
+        });
+  }
+
+  private boolean canSee(OtherUser otherUser) {
+    if (accountVisibility == AccountVisibility.ALL) {
+      return true;
+    } else if (user.isIdentifiedUser() && user.getAccountId().equals(otherUser.getId())) {
+      // I can always see myself.
+      return true;
+    } else if (viewAll()) {
+      return true;
+    }
+
+    switch (accountVisibility) {
+      case SAME_GROUP:
+        {
+          Set<AccountGroup.UUID> usersGroups = groupsOf(otherUser.getUser());
+          for (PermissionRule rule : accountsSection.getSameGroupVisibility()) {
+            if (rule.isBlock() || rule.isDeny()) {
+              usersGroups.remove(rule.getGroup().getUUID());
+            }
+          }
+
+          if (user.getEffectiveGroups().containsAnyOf(usersGroups)) {
+            return true;
+          }
+          break;
+        }
+      case VISIBLE_GROUP:
+        {
+          Set<AccountGroup.UUID> usersGroups = groupsOf(otherUser.getUser());
+          for (AccountGroup.UUID usersGroup : usersGroups) {
+            try {
+              if (groupControlFactory.controlFor(usersGroup).isVisible()) {
+                return true;
+              }
+            } catch (NoSuchGroupException e) {
+              continue;
+            }
+          }
+          break;
+        }
+      case NONE:
+        break;
+      case ALL:
+      default:
+        throw new IllegalStateException("Bad AccountVisibility " + accountVisibility);
+    }
+    return false;
+  }
+
+  private boolean viewAll() {
+    if (viewAll == null) {
+      try {
+        perm.check(GlobalPermission.VIEW_ALL_ACCOUNTS);
+        viewAll = true;
+      } catch (AuthException | PermissionBackendException e) {
+        viewAll = false;
+      }
+    }
+    return viewAll;
+  }
+
+  private Set<AccountGroup.UUID> groupsOf(IdentifiedUser user) {
+    return user.getEffectiveGroups().getKnownGroups().stream()
+        .filter(a -> !SystemGroupBackend.isSystemGroup(a))
+        .collect(toSet());
+  }
+
+  private abstract static class OtherUser {
+    IdentifiedUser user;
+
+    IdentifiedUser getUser() {
+      if (user == null) {
+        user = createUser();
+      }
+      return user;
+    }
+
+    abstract IdentifiedUser createUser();
+
+    abstract Account.Id getId();
+  }
+}
diff --git a/java/com/google/gerrit/server/account/AccountDeactivator.java b/java/com/google/gerrit/server/account/AccountDeactivator.java
new file mode 100644
index 0000000..b0dc527
--- /dev/null
+++ b/java/com/google/gerrit/server/account/AccountDeactivator.java
@@ -0,0 +1,129 @@
+// Copyright (C) 2017 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.google.gerrit.server.account;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.lifecycle.LifecycleModule;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.ScheduleConfig;
+import com.google.gerrit.server.config.ScheduleConfig.Schedule;
+import com.google.gerrit.server.git.WorkQueue;
+import com.google.gerrit.server.query.account.AccountPredicates;
+import com.google.gerrit.server.query.account.InternalAccountQuery;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.util.Optional;
+import org.eclipse.jgit.lib.Config;
+
+/** Runnable to enable scheduling account deactivations to run periodically */
+public class AccountDeactivator implements Runnable {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static class Module extends LifecycleModule {
+    @Override
+    protected void configure() {
+      listener().to(Lifecycle.class);
+    }
+  }
+
+  static class Lifecycle implements LifecycleListener {
+    private final WorkQueue queue;
+    private final AccountDeactivator deactivator;
+    private final boolean supportAutomaticAccountActivityUpdate;
+    private final Optional<Schedule> schedule;
+
+    @Inject
+    Lifecycle(WorkQueue queue, AccountDeactivator deactivator, @GerritServerConfig Config cfg) {
+      this.queue = queue;
+      this.deactivator = deactivator;
+      schedule = ScheduleConfig.createSchedule(cfg, "accountDeactivation");
+      supportAutomaticAccountActivityUpdate =
+          cfg.getBoolean("auth", "autoUpdateAccountActiveStatus", false);
+    }
+
+    @Override
+    public void start() {
+      if (!supportAutomaticAccountActivityUpdate) {
+        return;
+      }
+      schedule.ifPresent(s -> queue.scheduleAtFixedRate(deactivator, s));
+    }
+
+    @Override
+    public void stop() {
+      // handled by WorkQueue.stop() already
+    }
+  }
+
+  private final Provider<InternalAccountQuery> accountQueryProvider;
+  private final Realm realm;
+  private final SetInactiveFlag sif;
+
+  @Inject
+  AccountDeactivator(
+      Provider<InternalAccountQuery> accountQueryProvider, SetInactiveFlag sif, Realm realm) {
+    this.accountQueryProvider = accountQueryProvider;
+    this.sif = sif;
+    this.realm = realm;
+  }
+
+  @Override
+  public void run() {
+    logger.atInfo().log("Running account deactivations");
+    try {
+      int numberOfAccountsDeactivated = 0;
+      for (AccountState acc : accountQueryProvider.get().query(AccountPredicates.isActive())) {
+        if (processAccount(acc)) {
+          numberOfAccountsDeactivated++;
+        }
+      }
+      logger.atInfo().log(
+          "Deactivations complete, %d account(s) were deactivated", numberOfAccountsDeactivated);
+    } catch (Exception e) {
+      logger.atSevere().withCause(e).log(
+          "Failed to complete deactivation of accounts: %s", e.getMessage());
+    }
+  }
+
+  private boolean processAccount(AccountState accountState) {
+    if (!accountState.getUserName().isPresent()) {
+      return false;
+    }
+
+    String userName = accountState.getUserName().get();
+    logger.atFine().log("processing account %s", userName);
+    try {
+      if (realm.accountBelongsToRealm(accountState.getExternalIds()) && !realm.isActive(userName)) {
+        sif.deactivate(accountState.getAccount().getId());
+        logger.atInfo().log("deactivated account %s", userName);
+        return true;
+      }
+    } catch (ResourceConflictException e) {
+      logger.atInfo().log("Account %s already deactivated, continuing...", userName);
+    } catch (Exception e) {
+      logger.atSevere().withCause(e).log(
+          "Error deactivating account: %s (%s) %s",
+          userName, accountState.getAccount().getId(), e.getMessage());
+    }
+    return false;
+  }
+
+  @Override
+  public String toString() {
+    return "account deactivator";
+  }
+}
diff --git a/java/com/google/gerrit/server/account/AccountDirectory.java b/java/com/google/gerrit/server/account/AccountDirectory.java
new file mode 100644
index 0000000..ee9265f
--- /dev/null
+++ b/java/com/google/gerrit/server/account/AccountDirectory.java
@@ -0,0 +1,53 @@
+// Copyright (C) 2013 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.google.gerrit.server.account;
+
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import java.util.Set;
+
+/**
+ * Directory of user account information.
+ *
+ * <p>Implementations supply data to Gerrit about user accounts.
+ */
+public abstract class AccountDirectory {
+  /** Fields to be populated for a REST API response. */
+  public enum FillOptions {
+    /** Human friendly display name presented in the web interface. */
+    NAME,
+
+    /** Preferred email address to contact the user at. */
+    EMAIL,
+
+    /** All secondary email addresses of the user. */
+    SECONDARY_EMAILS,
+
+    /** User profile images. */
+    AVATARS,
+
+    /** Unique user identity to login to Gerrit, may be deprecated. */
+    USERNAME,
+
+    /** Numeric account ID, may be deprecated. */
+    ID,
+
+    /** The user-settable status of this account (e.g. busy, OOO, available) */
+    STATUS
+  }
+
+  public abstract void fillAccountInfo(Iterable<? extends AccountInfo> in, Set<FillOptions> options)
+      throws PermissionBackendException;
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountException.java b/java/com/google/gerrit/server/account/AccountException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/account/AccountException.java
rename to java/com/google/gerrit/server/account/AccountException.java
diff --git a/java/com/google/gerrit/server/account/AccountExternalIdCreator.java b/java/com/google/gerrit/server/account/AccountExternalIdCreator.java
new file mode 100644
index 0000000..8cf4ee0
--- /dev/null
+++ b/java/com/google/gerrit/server/account/AccountExternalIdCreator.java
@@ -0,0 +1,32 @@
+// 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.
+
+package com.google.gerrit.server.account;
+
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import java.util.List;
+
+public interface AccountExternalIdCreator {
+
+  /**
+   * Returns additional external identifiers to assign to a given user when creating an account.
+   *
+   * @param id the identifier of the account.
+   * @param username the name of the user.
+   * @param email an optional email address to assign to the external identifiers, or {@code null}.
+   * @return a list of external identifiers, or an empty list.
+   */
+  List<ExternalId> create(Account.Id id, String username, String email);
+}
diff --git a/java/com/google/gerrit/server/account/AccountInfoComparator.java b/java/com/google/gerrit/server/account/AccountInfoComparator.java
new file mode 100644
index 0000000..533dece
--- /dev/null
+++ b/java/com/google/gerrit/server/account/AccountInfoComparator.java
@@ -0,0 +1,52 @@
+// Copyright (C) 2015 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.google.gerrit.server.account;
+
+import com.google.common.collect.ComparisonChain;
+import com.google.common.collect.Ordering;
+import com.google.gerrit.extensions.common.AccountInfo;
+import java.util.Comparator;
+
+public class AccountInfoComparator extends Ordering<AccountInfo>
+    implements Comparator<AccountInfo> {
+  public static final AccountInfoComparator ORDER_NULLS_FIRST = new AccountInfoComparator();
+  public static final AccountInfoComparator ORDER_NULLS_LAST =
+      new AccountInfoComparator().setNullsLast();
+
+  private boolean nullsLast;
+
+  private AccountInfoComparator() {}
+
+  private AccountInfoComparator setNullsLast() {
+    this.nullsLast = true;
+    return this;
+  }
+
+  @Override
+  public int compare(AccountInfo a, AccountInfo b) {
+    return ComparisonChain.start()
+        .compare(a.name, b.name, createOrdering())
+        .compare(a.email, b.email, createOrdering())
+        .compare(a._accountId, b._accountId, createOrdering())
+        .result();
+  }
+
+  private <S extends Comparable<?>> Ordering<S> createOrdering() {
+    if (nullsLast) {
+      return Ordering.natural().nullsLast();
+    }
+    return Ordering.natural().nullsFirst();
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountLimits.java b/java/com/google/gerrit/server/account/AccountLimits.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/account/AccountLimits.java
rename to java/com/google/gerrit/server/account/AccountLimits.java
diff --git a/java/com/google/gerrit/server/account/AccountLoader.java b/java/com/google/gerrit/server/account/AccountLoader.java
new file mode 100644
index 0000000..4398d9e
--- /dev/null
+++ b/java/com/google/gerrit/server/account/AccountLoader.java
@@ -0,0 +1,103 @@
+// Copyright (C) 2014 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.google.gerrit.server.account;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+import com.google.common.collect.Iterables;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.account.AccountDirectory.FillOptions;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.inject.assistedinject.Assisted;
+import com.google.inject.assistedinject.AssistedInject;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public class AccountLoader {
+  public static final Set<FillOptions> DETAILED_OPTIONS =
+      Collections.unmodifiableSet(
+          EnumSet.of(
+              FillOptions.ID,
+              FillOptions.NAME,
+              FillOptions.EMAIL,
+              FillOptions.USERNAME,
+              FillOptions.STATUS,
+              FillOptions.AVATARS));
+
+  public interface Factory {
+    AccountLoader create(boolean detailed);
+
+    AccountLoader create(Set<FillOptions> options);
+  }
+
+  private final InternalAccountDirectory directory;
+  private final Set<FillOptions> options;
+  private final Map<Account.Id, AccountInfo> created;
+  private final List<AccountInfo> provided;
+
+  @AssistedInject
+  AccountLoader(InternalAccountDirectory directory, @Assisted boolean detailed) {
+    this(directory, detailed ? DETAILED_OPTIONS : InternalAccountDirectory.ID_ONLY);
+  }
+
+  @AssistedInject
+  AccountLoader(InternalAccountDirectory directory, @Assisted Set<FillOptions> options) {
+    this.directory = directory;
+    this.options = options;
+    created = new HashMap<>();
+    provided = new ArrayList<>();
+  }
+
+  public synchronized AccountInfo get(Account.Id id) {
+    if (id == null) {
+      return null;
+    }
+    AccountInfo info = created.get(id);
+    if (info == null) {
+      info = new AccountInfo(id.get());
+      created.put(id, info);
+    }
+    return info;
+  }
+
+  public synchronized void put(AccountInfo info) {
+    checkArgument(info._accountId != null, "_accountId field required");
+    provided.add(info);
+  }
+
+  public void fill() throws PermissionBackendException {
+    directory.fillAccountInfo(Iterables.concat(created.values(), provided), options);
+  }
+
+  public void fill(Collection<? extends AccountInfo> infos) throws PermissionBackendException {
+    for (AccountInfo info : infos) {
+      put(info);
+    }
+    fill();
+  }
+
+  public AccountInfo fillOne(Account.Id id) throws PermissionBackendException {
+    AccountInfo info = get(id);
+    fill();
+    return info;
+  }
+}
diff --git a/java/com/google/gerrit/server/account/AccountManager.java b/java/com/google/gerrit/server/account/AccountManager.java
new file mode 100644
index 0000000..27945d1
--- /dev/null
+++ b/java/com/google/gerrit/server/account/AccountManager.java
@@ -0,0 +1,522 @@
+// Copyright (C) 2009 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.google.gerrit.server.account;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_USERNAME;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.common.errors.NoSuchGroupException;
+import com.google.gerrit.extensions.client.AccountFieldName;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.Sequences;
+import com.google.gerrit.server.ServerInitiated;
+import com.google.gerrit.server.account.AccountsUpdate.AccountUpdater;
+import com.google.gerrit.server.account.externalids.DuplicateExternalIdKeyException;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.account.externalids.ExternalIds;
+import com.google.gerrit.server.auth.NoSuchUserException;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.group.db.GroupsUpdate;
+import com.google.gerrit.server.group.db.InternalGroupUpdate;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.ssh.SshKeyCache;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.Consumer;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Config;
+
+/** Tracks authentication related details for user accounts. */
+@Singleton
+public class AccountManager {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final Sequences sequences;
+  private final Accounts accounts;
+  private final Provider<AccountsUpdate> accountsUpdateProvider;
+  private final AccountCache byIdCache;
+  private final Realm realm;
+  private final IdentifiedUser.GenericFactory userFactory;
+  private final SshKeyCache sshKeyCache;
+  private final ProjectCache projectCache;
+  private final AtomicBoolean awaitsFirstAccountCheck;
+  private final ExternalIds externalIds;
+  private final GroupsUpdate.Factory groupsUpdateFactory;
+  private final boolean autoUpdateAccountActiveStatus;
+  private final SetInactiveFlag setInactiveFlag;
+
+  @Inject
+  AccountManager(
+      Sequences sequences,
+      @GerritServerConfig Config cfg,
+      Accounts accounts,
+      @ServerInitiated Provider<AccountsUpdate> accountsUpdateProvider,
+      AccountCache byIdCache,
+      Realm accountMapper,
+      IdentifiedUser.GenericFactory userFactory,
+      SshKeyCache sshKeyCache,
+      ProjectCache projectCache,
+      ExternalIds externalIds,
+      GroupsUpdate.Factory groupsUpdateFactory,
+      SetInactiveFlag setInactiveFlag) {
+    this.sequences = sequences;
+    this.accounts = accounts;
+    this.accountsUpdateProvider = accountsUpdateProvider;
+    this.byIdCache = byIdCache;
+    this.realm = accountMapper;
+    this.userFactory = userFactory;
+    this.sshKeyCache = sshKeyCache;
+    this.projectCache = projectCache;
+    this.awaitsFirstAccountCheck =
+        new AtomicBoolean(cfg.getBoolean("capability", "makeFirstUserAdmin", true));
+    this.externalIds = externalIds;
+    this.groupsUpdateFactory = groupsUpdateFactory;
+    this.autoUpdateAccountActiveStatus =
+        cfg.getBoolean("auth", "autoUpdateAccountActiveStatus", false);
+    this.setInactiveFlag = setInactiveFlag;
+  }
+
+  /** @return user identified by this external identity string */
+  public Optional<Account.Id> lookup(String externalId) throws AccountException {
+    try {
+      return externalIds.get(ExternalId.Key.parse(externalId)).map(ExternalId::accountId);
+    } catch (IOException | ConfigInvalidException e) {
+      throw new AccountException("Cannot lookup account " + externalId, e);
+    }
+  }
+
+  /**
+   * Authenticate the user, potentially creating a new account if they are new.
+   *
+   * @param who identity of the user, with any details we received about them.
+   * @return the result of authenticating the user.
+   * @throws AccountException the account does not exist, and cannot be created, or exists, but
+   *     cannot be located, is unable to be activated or deactivated, or is inactive, or cannot be
+   *     added to the admin group (only for the first account).
+   */
+  public AuthResult authenticate(AuthRequest who) throws AccountException, IOException {
+    try {
+      who = realm.authenticate(who);
+    } catch (NoSuchUserException e) {
+      deactivateAccountIfItExists(who);
+      throw e;
+    }
+    try {
+      Optional<ExternalId> optionalExtId = externalIds.get(who.getExternalIdKey());
+      if (!optionalExtId.isPresent()) {
+        // New account, automatically create and return.
+        return create(who);
+      }
+
+      ExternalId extId = optionalExtId.get();
+      Optional<AccountState> accountState = byIdCache.get(extId.accountId());
+      if (!accountState.isPresent()) {
+        logger.atSevere().log(
+            "Authentication with external ID %s failed. Account %s doesn't exist.",
+            extId.key().get(), extId.accountId().get());
+        throw new AccountException("Authentication error, account not found");
+      }
+
+      // Account exists
+      Optional<Account> act = updateAccountActiveStatus(who, accountState.get().getAccount());
+      if (!act.isPresent()) {
+        // The account was deleted since we checked for it last time. This should never happen
+        // since we don't support deletion of accounts.
+        throw new AccountException("Authentication error, account not found");
+      }
+      if (!act.get().isActive()) {
+        throw new AccountException("Authentication error, account inactive");
+      }
+
+      // return the identity to the caller.
+      update(who, extId);
+      return new AuthResult(extId.accountId(), who.getExternalIdKey(), false);
+    } catch (OrmException | ConfigInvalidException e) {
+      throw new AccountException("Authentication error", e);
+    }
+  }
+
+  private void deactivateAccountIfItExists(AuthRequest authRequest) {
+    if (!shouldUpdateActiveStatus(authRequest)) {
+      return;
+    }
+    try {
+      Optional<ExternalId> extId = externalIds.get(authRequest.getExternalIdKey());
+      if (!extId.isPresent()) {
+        return;
+      }
+      setInactiveFlag.deactivate(extId.get().accountId());
+    } catch (Exception e) {
+      logger.atSevere().withCause(e).log(
+          "Unable to deactivate account %s",
+          authRequest
+              .getUserName()
+              .orElse(" for external ID key " + authRequest.getExternalIdKey().get()));
+    }
+  }
+
+  private Optional<Account> updateAccountActiveStatus(AuthRequest authRequest, Account account)
+      throws AccountException {
+    if (!shouldUpdateActiveStatus(authRequest) || authRequest.isActive() == account.isActive()) {
+      return Optional.of(account);
+    }
+
+    if (authRequest.isActive()) {
+      try {
+        setInactiveFlag.activate(account.getId());
+      } catch (Exception e) {
+        throw new AccountException("Unable to activate account " + account.getId(), e);
+      }
+    } else {
+      try {
+        setInactiveFlag.deactivate(account.getId());
+      } catch (Exception e) {
+        throw new AccountException("Unable to deactivate account " + account.getId(), e);
+      }
+    }
+    return byIdCache.get(account.getId()).map(AccountState::getAccount);
+  }
+
+  private boolean shouldUpdateActiveStatus(AuthRequest authRequest) {
+    return autoUpdateAccountActiveStatus && authRequest.authProvidesAccountActiveStatus();
+  }
+
+  private void update(AuthRequest who, ExternalId extId)
+      throws OrmException, IOException, ConfigInvalidException, AccountException {
+    IdentifiedUser user = userFactory.create(extId.accountId());
+    List<Consumer<InternalAccountUpdate.Builder>> accountUpdates = new ArrayList<>();
+
+    // If the email address was modified by the authentication provider,
+    // update our records to match the changed email.
+    //
+    String newEmail = who.getEmailAddress();
+    String oldEmail = extId.email();
+    if (newEmail != null && !newEmail.equals(oldEmail)) {
+      ExternalId extIdWithNewEmail =
+          ExternalId.create(extId.key(), extId.accountId(), newEmail, extId.password());
+      checkEmailNotUsed(extIdWithNewEmail);
+      accountUpdates.add(u -> u.replaceExternalId(extId, extIdWithNewEmail));
+
+      if (oldEmail != null && oldEmail.equals(user.getAccount().getPreferredEmail())) {
+        accountUpdates.add(u -> u.setPreferredEmail(newEmail));
+      }
+    }
+
+    if (!Strings.isNullOrEmpty(who.getDisplayName())
+        && !Objects.equals(user.getAccount().getFullName(), who.getDisplayName())) {
+      accountUpdates.add(u -> u.setFullName(who.getDisplayName()));
+      if (realm.allowsEdit(AccountFieldName.FULL_NAME)) {
+        accountUpdates.add(a -> a.setFullName(who.getDisplayName()));
+      } else {
+        logger.atWarning().log(
+            "Not changing already set display name '%s' to '%s'",
+            user.getAccount().getFullName(), who.getDisplayName());
+      }
+    }
+
+    if (!realm.allowsEdit(AccountFieldName.USER_NAME)
+        && who.getUserName().isPresent()
+        && !who.getUserName().equals(user.getUserName())) {
+      if (user.getUserName().isPresent()) {
+        logger.atWarning().log(
+            "Not changing already set username %s to %s",
+            user.getUserName().get(), who.getUserName().get());
+      } else {
+        logger.atWarning().log("Not setting username to %s", who.getUserName().get());
+      }
+    }
+
+    if (!accountUpdates.isEmpty()) {
+      accountsUpdateProvider
+          .get()
+          .update(
+              "Update Account on Login",
+              user.getAccountId(),
+              AccountUpdater.joinConsumers(accountUpdates))
+          .orElseThrow(
+              () -> new OrmException("Account " + user.getAccountId() + " has been deleted"));
+    }
+  }
+
+  private AuthResult create(AuthRequest who)
+      throws OrmException, AccountException, IOException, ConfigInvalidException {
+    Account.Id newId = new Account.Id(sequences.nextAccountId());
+    logger.atFine().log("Assigning new Id %s to account", newId);
+
+    ExternalId extId =
+        ExternalId.createWithEmail(who.getExternalIdKey(), newId, who.getEmailAddress());
+    logger.atFine().log("Created external Id: %s", extId);
+    checkEmailNotUsed(extId);
+    ExternalId userNameExtId =
+        who.getUserName().isPresent() ? createUsername(newId, who.getUserName().get()) : null;
+
+    boolean isFirstAccount = awaitsFirstAccountCheck.getAndSet(false) && !accounts.hasAnyAccount();
+
+    AccountState accountState;
+    try {
+      accountState =
+          accountsUpdateProvider
+              .get()
+              .insert(
+                  "Create Account on First Login",
+                  newId,
+                  u -> {
+                    u.setFullName(who.getDisplayName())
+                        .setPreferredEmail(extId.email())
+                        .addExternalId(extId);
+                    if (userNameExtId != null) {
+                      u.addExternalId(userNameExtId);
+                    }
+                  });
+    } catch (DuplicateExternalIdKeyException e) {
+      throw new AccountException(
+          "Cannot assign external ID \""
+              + e.getDuplicateKey().get()
+              + "\" to account "
+              + newId
+              + "; external ID already in use.");
+    } finally {
+      // If adding the account failed, it may be that it actually was the
+      // first account. So we reset the 'check for first account'-guard, as
+      // otherwise the first account would not get administration permissions.
+      awaitsFirstAccountCheck.set(isFirstAccount);
+    }
+
+    if (userNameExtId != null) {
+      who.getUserName().ifPresent(sshKeyCache::evict);
+    }
+
+    IdentifiedUser user = userFactory.create(newId);
+
+    if (isFirstAccount) {
+      // This is the first user account on our site. Assume this user
+      // is going to be the site's administrator and just make them that
+      // to bootstrap the authentication database.
+      //
+      Permission admin =
+          projectCache
+              .getAllProjects()
+              .getConfig()
+              .getAccessSection(AccessSection.GLOBAL_CAPABILITIES)
+              .getPermission(GlobalCapability.ADMINISTRATE_SERVER);
+
+      AccountGroup.UUID adminGroupUuid = admin.getRules().get(0).getGroup().getUUID();
+      addGroupMember(adminGroupUuid, user);
+    }
+
+    realm.onCreateAccount(who, accountState.getAccount());
+    return new AuthResult(newId, extId.key(), true);
+  }
+
+  private ExternalId createUsername(Account.Id accountId, String username)
+      throws AccountUserNameException {
+    checkArgument(!Strings.isNullOrEmpty(username));
+
+    if (!ExternalId.isValidUsername(username)) {
+      throw new AccountUserNameException(
+          String.format(
+              "Cannot assign user name \"%s\" to account %s; name does not conform.",
+              username, accountId));
+    }
+    return ExternalId.create(SCHEME_USERNAME, username, accountId);
+  }
+
+  private void checkEmailNotUsed(ExternalId extIdToBeCreated) throws IOException, AccountException {
+    String email = extIdToBeCreated.email();
+    if (email == null) {
+      return;
+    }
+
+    Set<ExternalId> existingExtIdsWithEmail = externalIds.byEmail(email);
+    if (existingExtIdsWithEmail.isEmpty()) {
+      return;
+    }
+
+    logger.atWarning().log(
+        "Email %s is already assigned to account %s;"
+            + " cannot create external ID %s with the same email for account %s.",
+        email,
+        existingExtIdsWithEmail.iterator().next().accountId().get(),
+        extIdToBeCreated.key().get(),
+        extIdToBeCreated.accountId().get());
+    throw new AccountException("Email '" + email + "' in use by another account");
+  }
+
+  private void addGroupMember(AccountGroup.UUID groupUuid, IdentifiedUser user)
+      throws OrmException, IOException, ConfigInvalidException, AccountException {
+    // The user initiated this request by logging in. -> Attribute all modifications to that user.
+    GroupsUpdate groupsUpdate = groupsUpdateFactory.create(user);
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder()
+            .setMemberModification(
+                memberIds -> Sets.union(memberIds, ImmutableSet.of(user.getAccountId())))
+            .build();
+    try {
+      groupsUpdate.updateGroup(groupUuid, groupUpdate);
+    } catch (NoSuchGroupException e) {
+      throw new AccountException(String.format("Group %s not found", groupUuid));
+    }
+  }
+
+  /**
+   * Link another authentication identity to an existing account.
+   *
+   * @param to account to link the identity onto.
+   * @param who the additional identity.
+   * @return the result of linking the identity to the user.
+   * @throws AccountException the identity belongs to a different account, or it cannot be linked at
+   *     this time.
+   */
+  public AuthResult link(Account.Id to, AuthRequest who)
+      throws AccountException, OrmException, IOException, ConfigInvalidException {
+    Optional<ExternalId> optionalExtId = externalIds.get(who.getExternalIdKey());
+    if (optionalExtId.isPresent()) {
+      ExternalId extId = optionalExtId.get();
+      if (!extId.accountId().equals(to)) {
+        throw new AccountException(
+            "Identity '" + extId.key().get() + "' in use by another account");
+      }
+      update(who, extId);
+    } else {
+      ExternalId newExtId =
+          ExternalId.createWithEmail(who.getExternalIdKey(), to, who.getEmailAddress());
+      checkEmailNotUsed(newExtId);
+      accountsUpdateProvider
+          .get()
+          .update(
+              "Link External ID",
+              to,
+              (a, u) -> {
+                u.addExternalId(newExtId);
+                if (who.getEmailAddress() != null && a.getAccount().getPreferredEmail() == null) {
+                  u.setPreferredEmail(who.getEmailAddress());
+                }
+              });
+    }
+    return new AuthResult(to, who.getExternalIdKey(), false);
+  }
+
+  /**
+   * Update the link to another unique authentication identity to an existing account.
+   *
+   * <p>Existing external identities with the same scheme will be removed and replaced with the new
+   * one.
+   *
+   * @param to account to link the identity onto.
+   * @param who the additional identity.
+   * @return the result of linking the identity to the user.
+   * @throws OrmException
+   * @throws AccountException the identity belongs to a different account, or it cannot be linked at
+   *     this time.
+   */
+  public AuthResult updateLink(Account.Id to, AuthRequest who)
+      throws OrmException, AccountException, IOException, ConfigInvalidException {
+    accountsUpdateProvider
+        .get()
+        .update(
+            "Delete External IDs on Update Link",
+            to,
+            (a, u) -> {
+              Collection<ExternalId> filteredExtIdsByScheme =
+                  a.getExternalIds(who.getExternalIdKey().scheme());
+              if (filteredExtIdsByScheme.isEmpty()) {
+                return;
+              }
+
+              if (filteredExtIdsByScheme.size() > 1
+                  || !filteredExtIdsByScheme.stream()
+                      .anyMatch(e -> e.key().equals(who.getExternalIdKey()))) {
+                u.deleteExternalIds(filteredExtIdsByScheme);
+              }
+            });
+
+    return link(to, who);
+  }
+
+  /**
+   * Unlink an external identity from an existing account.
+   *
+   * @param from account to unlink the external identity from
+   * @param extIdKey the key of the external ID that should be deleted
+   * @throws AccountException the identity belongs to a different account, or the identity was not
+   *     found
+   */
+  public void unlink(Account.Id from, ExternalId.Key extIdKey)
+      throws AccountException, OrmException, IOException, ConfigInvalidException {
+    unlink(from, ImmutableList.of(extIdKey));
+  }
+
+  /**
+   * Unlink an external identities from an existing account.
+   *
+   * @param from account to unlink the external identity from
+   * @param extIdKeys the keys of the external IDs that should be deleted
+   * @throws AccountException any of the identity belongs to a different account, or any of the
+   *     identity was not found
+   */
+  public void unlink(Account.Id from, Collection<ExternalId.Key> extIdKeys)
+      throws AccountException, OrmException, IOException, ConfigInvalidException {
+    if (extIdKeys.isEmpty()) {
+      return;
+    }
+
+    List<ExternalId> extIds = new ArrayList<>(extIdKeys.size());
+    for (ExternalId.Key extIdKey : extIdKeys) {
+      Optional<ExternalId> extId = externalIds.get(extIdKey);
+      if (extId.isPresent()) {
+        if (!extId.get().accountId().equals(from)) {
+          throw new AccountException("Identity '" + extIdKey.get() + "' in use by another account");
+        }
+        extIds.add(extId.get());
+      } else {
+        throw new AccountException("Identity '" + extIdKey.get() + "' not found");
+      }
+    }
+
+    accountsUpdateProvider
+        .get()
+        .update(
+            "Unlink External ID" + (extIds.size() > 1 ? "s" : ""),
+            from,
+            (a, u) -> {
+              u.deleteExternalIds(extIds);
+              if (a.getAccount().getPreferredEmail() != null
+                  && extIds.stream()
+                      .anyMatch(e -> a.getAccount().getPreferredEmail().equals(e.email()))) {
+                u.setPreferredEmail(null);
+              }
+            });
+  }
+}
diff --git a/java/com/google/gerrit/server/account/AccountProperties.java b/java/com/google/gerrit/server/account/AccountProperties.java
new file mode 100644
index 0000000..6fcf56d
--- /dev/null
+++ b/java/com/google/gerrit/server/account/AccountProperties.java
@@ -0,0 +1,164 @@
+// 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.
+
+package com.google.gerrit.server.account;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Account;
+import java.sql.Timestamp;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+
+/**
+ * Parses/writes account properties from/to a {@link Config} file.
+ *
+ * <p>This is a low-level API. Read/write of account properties in a user branch should be done
+ * through {@link AccountsUpdate} or {@link AccountConfig}.
+ *
+ * <p>The config file has one 'account' section with the properties of the account:
+ *
+ * <pre>
+ *   [account]
+ *     active = false
+ *     fullName = John Doe
+ *     preferredEmail = john.doe@foo.com
+ *     status = Overloaded with reviews
+ * </pre>
+ *
+ * <p>All keys are optional.
+ *
+ * <p>Not setting a key and setting a key to an empty string are treated the same way and result in
+ * a {@code null} value.
+ *
+ * <p>If no value for 'active' is specified, by default the account is considered as active.
+ *
+ * <p>The account is lazily parsed.
+ */
+public class AccountProperties {
+  public static final String ACCOUNT_CONFIG = "account.config";
+  public static final String ACCOUNT = "account";
+  public static final String KEY_ACTIVE = "active";
+  public static final String KEY_FULL_NAME = "fullName";
+  public static final String KEY_PREFERRED_EMAIL = "preferredEmail";
+  public static final String KEY_STATUS = "status";
+
+  private final Account.Id accountId;
+  private final Timestamp registeredOn;
+  private final Config accountConfig;
+  private @Nullable ObjectId metaId;
+  private Account account;
+
+  AccountProperties(
+      Account.Id accountId,
+      Timestamp registeredOn,
+      Config accountConfig,
+      @Nullable ObjectId metaId) {
+    this.accountId = accountId;
+    this.registeredOn = registeredOn;
+    this.accountConfig = accountConfig;
+    this.metaId = metaId;
+  }
+
+  Account getAccount() {
+    if (account == null) {
+      parse();
+    }
+    return account;
+  }
+
+  public Timestamp getRegisteredOn() {
+    return registeredOn;
+  }
+
+  void setMetaId(@Nullable ObjectId metaId) {
+    this.metaId = metaId;
+    this.account = null;
+  }
+
+  private void parse() {
+    account = new Account(accountId, registeredOn);
+    account.setActive(accountConfig.getBoolean(ACCOUNT, null, KEY_ACTIVE, true));
+    account.setFullName(get(accountConfig, KEY_FULL_NAME));
+
+    String preferredEmail = get(accountConfig, KEY_PREFERRED_EMAIL);
+    account.setPreferredEmail(preferredEmail);
+
+    account.setStatus(get(accountConfig, KEY_STATUS));
+    account.setMetaId(metaId != null ? metaId.name() : null);
+  }
+
+  Config save(InternalAccountUpdate accountUpdate) {
+    writeToAccountConfig(accountUpdate, accountConfig);
+    return accountConfig;
+  }
+
+  public static void writeToAccountConfig(InternalAccountUpdate accountUpdate, Config cfg) {
+    accountUpdate.getActive().ifPresent(active -> setActive(cfg, active));
+    accountUpdate.getFullName().ifPresent(fullName -> set(cfg, KEY_FULL_NAME, fullName));
+    accountUpdate
+        .getPreferredEmail()
+        .ifPresent(preferredEmail -> set(cfg, KEY_PREFERRED_EMAIL, preferredEmail));
+    accountUpdate.getStatus().ifPresent(status -> set(cfg, KEY_STATUS, status));
+  }
+
+  /**
+   * Gets the given key from the given config.
+   *
+   * <p>Empty values are returned as {@code null}
+   *
+   * @param cfg the config
+   * @param key the key
+   * @return the value, {@code null} if key was not set or key was set to empty string
+   */
+  private static String get(Config cfg, String key) {
+    return Strings.emptyToNull(cfg.getString(ACCOUNT, null, key));
+  }
+
+  /**
+   * Sets/Unsets {@code account.active} in the given config.
+   *
+   * <p>{@code account.active} is set to {@code false} if the account is inactive.
+   *
+   * <p>If the account is active {@code account.active} is unset since {@code true} is the default
+   * if this field is missing.
+   *
+   * @param cfg the config
+   * @param value whether the account is active
+   */
+  private static void setActive(Config cfg, boolean value) {
+    if (!value) {
+      cfg.setBoolean(ACCOUNT, null, KEY_ACTIVE, false);
+    } else {
+      cfg.unset(ACCOUNT, null, KEY_ACTIVE);
+    }
+  }
+
+  /**
+   * Sets/Unsets the given key in the given config.
+   *
+   * <p>The key unset if the value is {@code null}.
+   *
+   * @param cfg the config
+   * @param key the key
+   * @param value the value
+   */
+  private static void set(Config cfg, String key, String value) {
+    if (!Strings.isNullOrEmpty(value)) {
+      cfg.setString(ACCOUNT, null, key, value);
+    } else {
+      cfg.unset(ACCOUNT, null, key);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/account/AccountResolver.java b/java/com/google/gerrit/server/account/AccountResolver.java
new file mode 100644
index 0000000..8c7cdb4
--- /dev/null
+++ b/java/com/google/gerrit/server/account/AccountResolver.java
@@ -0,0 +1,282 @@
+// Copyright (C) 2009 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.google.gerrit.server.account;
+
+import static com.google.common.collect.ImmutableSet.toImmutableSet;
+import static java.util.stream.Collectors.toSet;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Streams;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.AnonymousUser;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.query.account.InternalAccountQuery;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class AccountResolver {
+  private final Provider<CurrentUser> self;
+  private final Realm realm;
+  private final Accounts accounts;
+  private final AccountCache byId;
+  private final IdentifiedUser.GenericFactory userFactory;
+  private final AccountControl.Factory accountControlFactory;
+  private final Provider<InternalAccountQuery> accountQueryProvider;
+  private final Emails emails;
+
+  @Inject
+  AccountResolver(
+      Provider<CurrentUser> self,
+      Realm realm,
+      Accounts accounts,
+      AccountCache byId,
+      IdentifiedUser.GenericFactory userFactory,
+      AccountControl.Factory accountControlFactory,
+      Provider<InternalAccountQuery> accountQueryProvider,
+      Emails emails) {
+    this.self = self;
+    this.realm = realm;
+    this.accounts = accounts;
+    this.byId = byId;
+    this.userFactory = userFactory;
+    this.accountControlFactory = accountControlFactory;
+    this.accountQueryProvider = accountQueryProvider;
+    this.emails = emails;
+  }
+
+  /**
+   * Locate exactly one account matching the input string.
+   *
+   * @param input a string of the format "Full Name &lt;email@example&gt;", just the email address
+   *     ("email@example"), a full name ("Full Name"), an account ID ("18419") or a user name
+   *     ("username").
+   * @return the single account that matches; null if no account matches or there are multiple
+   *     candidates. If {@code input} is a numeric string, returns an account if and only if that
+   *     number corresponds to an actual account ID.
+   */
+  public Account find(String input) throws OrmException, IOException, ConfigInvalidException {
+    Set<Account.Id> r = findAll(input);
+    if (r.size() == 1) {
+      return byId.get(r.iterator().next()).map(AccountState::getAccount).orElse(null);
+    }
+
+    Account match = null;
+    for (Account.Id id : r) {
+      Optional<Account> account = byId.get(id).map(AccountState::getAccount);
+      if (!account.map(Account::isActive).orElse(false)) {
+        continue;
+      }
+      if (match != null) {
+        return null;
+      }
+      match = account.get();
+    }
+    return match;
+  }
+
+  /**
+   * Find all accounts matching the input string.
+   *
+   * @param input a string of the format "Full Name &lt;email@example&gt;", just the email address
+   *     ("email@example"), a full name ("Full Name"), an account ID ("18419") or a user name
+   *     ("username").
+   * @return the accounts that match, empty set if none. Never null. If {@code input} is a numeric
+   *     string, returns a singleton set if that number corresponds to a real account ID, and an
+   *     empty set otherwise if it does not.
+   */
+  public Set<Account.Id> findAll(String input)
+      throws OrmException, IOException, ConfigInvalidException {
+    Matcher m = Pattern.compile("^.* \\(([1-9][0-9]*)\\)$").matcher(input);
+    if (m.matches()) {
+      Optional<Account.Id> id = Account.Id.tryParse(m.group(1));
+      if (id.isPresent()) {
+        return Streams.stream(accounts.get(id.get()))
+            .map(a -> a.getAccount().getId())
+            .collect(toImmutableSet());
+      }
+    }
+
+    if (input.matches("^[1-9][0-9]*$")) {
+      Optional<Account.Id> id = Account.Id.tryParse(input);
+      if (id.isPresent()) {
+        return Streams.stream(accounts.get(id.get()))
+            .map(a -> a.getAccount().getId())
+            .collect(toImmutableSet());
+      }
+    }
+
+    if (ExternalId.isValidUsername(input)) {
+      Optional<AccountState> who = byId.getByUsername(input);
+      if (who.isPresent()) {
+        return ImmutableSet.of(who.map(a -> a.getAccount().getId()).get());
+      }
+    }
+
+    return findAllByNameOrEmail(input);
+  }
+
+  /**
+   * Locate exactly one account matching the name or name/email string.
+   *
+   * @param nameOrEmail a string of the format "Full Name &lt;email@example&gt;", just the email
+   *     address ("email@example"), a full name ("Full Name").
+   * @return the single account that matches; null if no account matches or there are multiple
+   *     candidates.
+   */
+  public Account findByNameOrEmail(String nameOrEmail) throws OrmException, IOException {
+    Set<Account.Id> r = findAllByNameOrEmail(nameOrEmail);
+    return r.size() == 1
+        ? byId.get(r.iterator().next()).map(AccountState::getAccount).orElse(null)
+        : null;
+  }
+
+  /**
+   * Locate exactly one account matching the name or name/email string.
+   *
+   * @param nameOrEmail a string of the format "Full Name &lt;email@example&gt;", just the email
+   *     address ("email@example"), a full name ("Full Name").
+   * @return the accounts that match, empty collection if none. Never null.
+   */
+  public Set<Account.Id> findAllByNameOrEmail(String nameOrEmail) throws OrmException, IOException {
+    int lt = nameOrEmail.indexOf('<');
+    int gt = nameOrEmail.indexOf('>');
+    if (lt >= 0 && gt > lt && nameOrEmail.contains("@")) {
+      Set<Account.Id> ids = emails.getAccountFor(nameOrEmail.substring(lt + 1, gt));
+      if (ids.isEmpty() || ids.size() == 1) {
+        return ids;
+      }
+
+      // more than one match, try to return the best one
+      String name = nameOrEmail.substring(0, lt - 1);
+      Set<Account.Id> nameMatches = new HashSet<>();
+      for (Account.Id id : ids) {
+        Optional<Account> a = byId.get(id).map(AccountState::getAccount);
+        if (a.isPresent() && name.equals(a.get().getFullName())) {
+          nameMatches.add(id);
+        }
+      }
+      return nameMatches.isEmpty() ? ids : nameMatches;
+    }
+
+    if (nameOrEmail.contains("@")) {
+      return emails.getAccountFor(nameOrEmail);
+    }
+
+    Account.Id id = realm.lookup(nameOrEmail);
+    if (id != null) {
+      return Collections.singleton(id);
+    }
+
+    List<AccountState> m = accountQueryProvider.get().byFullName(nameOrEmail);
+    if (m.size() == 1) {
+      return Collections.singleton(m.get(0).getAccount().getId());
+    }
+
+    // At this point we have no clue. Just perform a whole bunch of suggestions
+    // and pray we come up with a reasonable result list.
+    // TODO(dborowitz): This doesn't match the documentation; consider whether it's possible to be
+    // more strict here.
+    return accountQueryProvider.get().byDefault(nameOrEmail).stream()
+        .map(a -> a.getAccount().getId())
+        .collect(toSet());
+  }
+
+  /**
+   * Parses a account ID from a request body and returns the user.
+   *
+   * @param id ID of the account, can be a string of the format "{@code Full Name
+   *     <email@example.com>}", just the email address, a full name if it is unique, an account ID,
+   *     a user name or "{@code self}" for the calling user
+   * @return the user, never null.
+   * @throws UnprocessableEntityException thrown if the account ID cannot be resolved or if the
+   *     account is not visible to the calling user
+   */
+  public IdentifiedUser parse(String id)
+      throws AuthException, UnprocessableEntityException, OrmException, IOException,
+          ConfigInvalidException {
+    return parseOnBehalfOf(null, id);
+  }
+
+  /**
+   * Parses an account ID and returns the user without making any permission check whether the
+   * current user can see the account.
+   *
+   * @param id ID of the account, can be a string of the format "{@code Full Name
+   *     <email@example.com>}", just the email address, a full name if it is unique, an account ID,
+   *     a user name or "{@code self}" for the calling user
+   * @return the user, null if no user is found for the given account ID
+   * @throws AuthException thrown if 'self' is used as account ID and the current user is not
+   *     authenticated
+   * @throws OrmException
+   * @throws ConfigInvalidException
+   * @throws IOException
+   */
+  public IdentifiedUser parseId(String id)
+      throws AuthException, OrmException, IOException, ConfigInvalidException {
+    return parseIdOnBehalfOf(null, id);
+  }
+
+  /**
+   * Like {@link #parse(String)}, but also sets the {@link CurrentUser#getRealUser()} on the result.
+   */
+  public IdentifiedUser parseOnBehalfOf(@Nullable CurrentUser caller, String id)
+      throws AuthException, UnprocessableEntityException, OrmException, IOException,
+          ConfigInvalidException {
+    IdentifiedUser user = parseIdOnBehalfOf(caller, id);
+    if (user == null || !accountControlFactory.get().canSee(user.getAccount())) {
+      throw new UnprocessableEntityException(
+          String.format("Account '%s' is not found or ambiguous", id));
+    }
+    return user;
+  }
+
+  private IdentifiedUser parseIdOnBehalfOf(@Nullable CurrentUser caller, String id)
+      throws AuthException, OrmException, IOException, ConfigInvalidException {
+    if (id.equals("self")) {
+      CurrentUser user = self.get();
+      if (user.isIdentifiedUser()) {
+        return user.asIdentifiedUser();
+      } else if (user instanceof AnonymousUser) {
+        throw new AuthException("Authentication required");
+      } else {
+        return null;
+      }
+    }
+
+    Account match = find(id);
+    if (match == null) {
+      return null;
+    }
+    CurrentUser realUser = caller != null ? caller.getRealUser() : null;
+    return userFactory.runAs(null, match.getId(), realUser);
+  }
+}
diff --git a/java/com/google/gerrit/server/account/AccountResource.java b/java/com/google/gerrit/server/account/AccountResource.java
new file mode 100644
index 0000000..d09dff5
--- /dev/null
+++ b/java/com/google/gerrit/server/account/AccountResource.java
@@ -0,0 +1,134 @@
+// Copyright (C) 2012 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.google.gerrit.server.account;
+
+import com.google.gerrit.extensions.restapi.RestResource;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.inject.TypeLiteral;
+import java.util.Set;
+
+public class AccountResource implements RestResource {
+  public static final TypeLiteral<RestView<AccountResource>> ACCOUNT_KIND =
+      new TypeLiteral<RestView<AccountResource>>() {};
+
+  public static final TypeLiteral<RestView<Capability>> CAPABILITY_KIND =
+      new TypeLiteral<RestView<Capability>>() {};
+
+  public static final TypeLiteral<RestView<Email>> EMAIL_KIND =
+      new TypeLiteral<RestView<Email>>() {};
+
+  public static final TypeLiteral<RestView<SshKey>> SSH_KEY_KIND =
+      new TypeLiteral<RestView<SshKey>>() {};
+
+  public static final TypeLiteral<RestView<StarredChange>> STARRED_CHANGE_KIND =
+      new TypeLiteral<RestView<StarredChange>>() {};
+
+  private final IdentifiedUser user;
+
+  public AccountResource(IdentifiedUser user) {
+    this.user = user;
+  }
+
+  public IdentifiedUser getUser() {
+    return user;
+  }
+
+  public static class Capability implements RestResource {
+    private final IdentifiedUser user;
+    private final String capability;
+
+    public Capability(IdentifiedUser user, String capability) {
+      this.user = user;
+      this.capability = capability;
+    }
+
+    public IdentifiedUser getUser() {
+      return user;
+    }
+
+    public String getCapability() {
+      return capability;
+    }
+  }
+
+  public static class Email extends AccountResource {
+    private final String email;
+
+    public Email(IdentifiedUser user, String email) {
+      super(user);
+      this.email = email;
+    }
+
+    public String getEmail() {
+      return email;
+    }
+  }
+
+  public static class SshKey extends AccountResource {
+    private final AccountSshKey sshKey;
+
+    public SshKey(IdentifiedUser user, AccountSshKey sshKey) {
+      super(user);
+      this.sshKey = sshKey;
+    }
+
+    public AccountSshKey getSshKey() {
+      return sshKey;
+    }
+  }
+
+  public static class StarredChange extends AccountResource {
+    private final ChangeResource change;
+
+    public StarredChange(IdentifiedUser user, ChangeResource change) {
+      super(user);
+      this.change = change;
+    }
+
+    public Change getChange() {
+      return change.getChange();
+    }
+  }
+
+  public static class Star implements RestResource {
+    public static final TypeLiteral<RestView<Star>> STAR_KIND =
+        new TypeLiteral<RestView<Star>>() {};
+
+    private final IdentifiedUser user;
+    private final ChangeResource change;
+    private final Set<String> labels;
+
+    public Star(IdentifiedUser user, ChangeResource change, Set<String> labels) {
+      this.user = user;
+      this.change = change;
+      this.labels = labels;
+    }
+
+    public IdentifiedUser getUser() {
+      return user;
+    }
+
+    public Change getChange() {
+      return change.getChange();
+    }
+
+    public Set<String> getLabels() {
+      return labels;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/account/AccountSshKey.java b/java/com/google/gerrit/server/account/AccountSshKey.java
new file mode 100644
index 0000000..f132585
--- /dev/null
+++ b/java/com/google/gerrit/server/account/AccountSshKey.java
@@ -0,0 +1,94 @@
+// Copyright (C) 2008 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.google.gerrit.server.account;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.base.Splitter;
+import com.google.gerrit.reviewdb.client.Account;
+import java.util.List;
+
+/** An SSH key approved for use by an {@link Account}. */
+@AutoValue
+public abstract class AccountSshKey {
+  public static AccountSshKey create(Account.Id accountId, int seq, String sshPublicKey) {
+    return create(accountId, seq, sshPublicKey, true);
+  }
+
+  public static AccountSshKey createInvalid(Account.Id accountId, int seq, String sshPublicKey) {
+    return create(accountId, seq, sshPublicKey, false);
+  }
+
+  public static AccountSshKey createInvalid(AccountSshKey key) {
+    return create(key.accountId(), key.seq(), key.sshPublicKey(), false);
+  }
+
+  public static AccountSshKey create(
+      Account.Id accountId, int seq, String sshPublicKey, boolean valid) {
+    return new AutoValue_AccountSshKey.Builder()
+        .setAccountId(accountId)
+        .setSeq(seq)
+        .setSshPublicKey(stripOffNewLines(sshPublicKey))
+        .setValid(valid && seq > 0)
+        .build();
+  }
+
+  private static String stripOffNewLines(String s) {
+    return s.replace("\n", "").replace("\r", "");
+  }
+
+  public abstract Account.Id accountId();
+
+  public abstract int seq();
+
+  public abstract String sshPublicKey();
+
+  public abstract boolean valid();
+
+  private String publicKeyPart(int index, String defaultValue) {
+    String s = sshPublicKey();
+    if (s != null && s.length() > 0) {
+      List<String> parts = Splitter.on(' ').splitToList(s);
+      if (parts.size() > index) {
+        return parts.get(index);
+      }
+    }
+    return defaultValue;
+  }
+
+  public String algorithm() {
+    return publicKeyPart(0, "none");
+  }
+
+  public String encodedKey() {
+    return publicKeyPart(1, null);
+  }
+
+  public String comment() {
+    return publicKeyPart(2, "");
+  }
+
+  @AutoValue.Builder
+  abstract static class Builder {
+    public abstract Builder setAccountId(Account.Id accountId);
+
+    public abstract Builder setSeq(int seq);
+
+    public abstract Builder setSshPublicKey(String sshPublicKey);
+
+    public abstract Builder setValid(boolean valid);
+
+    public abstract AccountSshKey build();
+  }
+}
diff --git a/java/com/google/gerrit/server/account/AccountState.java b/java/com/google/gerrit/server/account/AccountState.java
new file mode 100644
index 0000000..1854dc1
--- /dev/null
+++ b/java/com/google/gerrit/server/account/AccountState.java
@@ -0,0 +1,326 @@
+// Copyright (C) 2009 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.google.gerrit.server.account;
+
+import static com.google.common.collect.ImmutableSet.toImmutableSet;
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_USERNAME;
+
+import com.google.common.base.Function;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.client.DiffPreferencesInfo;
+import com.google.gerrit.extensions.client.EditPreferencesInfo;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.CurrentUser.PropertyKey;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gerrit.server.account.ProjectWatches.ProjectWatchKey;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.account.externalids.ExternalIdNotes;
+import com.google.gerrit.server.account.externalids.ExternalIds;
+import com.google.gerrit.server.config.AllUsersName;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Optional;
+import org.apache.commons.codec.DecoderException;
+import org.eclipse.jgit.lib.ObjectId;
+
+/**
+ * Superset of all information related to an Account. This includes external IDs, project watches,
+ * and properties from the account config file. AccountState maps one-to-one to Account.
+ *
+ * <p>Most callers should not construct AccountStates directly but rather lookup accounts via the
+ * account cache (see {@link AccountCache#get(Account.Id)}).
+ */
+public class AccountState {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static final Function<AccountState, Account.Id> ACCOUNT_ID_FUNCTION =
+      a -> a.getAccount().getId();
+
+  /**
+   * Creates an AccountState from the given account config.
+   *
+   * @param allUsersName the name of the All-Users repository
+   * @param externalIds class to access external IDs
+   * @param accountConfig the account config, must already be loaded
+   * @return the account state, {@link Optional#empty()} if the account doesn't exist
+   * @throws IOException if accessing the external IDs fails
+   */
+  public static Optional<AccountState> fromAccountConfig(
+      AllUsersName allUsersName, ExternalIds externalIds, AccountConfig accountConfig)
+      throws IOException {
+    return fromAccountConfig(allUsersName, externalIds, accountConfig, null);
+  }
+
+  /**
+   * Creates an AccountState from the given account config.
+   *
+   * <p>If external ID notes are provided the revision of the external IDs branch from which the
+   * external IDs for the account should be loaded is taken from the external ID notes. If external
+   * ID notes are not given the revision of the external IDs branch is taken from the account
+   * config. Updating external IDs is done via {@link ExternalIdNotes} and if external IDs were
+   * updated the revision of the external IDs branch in account config is outdated. Hence after
+   * updating external IDs the external ID notes must be provided.
+   *
+   * @param allUsersName the name of the All-Users repository
+   * @param externalIds class to access external IDs
+   * @param accountConfig the account config, must already be loaded
+   * @param extIdNotes external ID notes, must already be loaded, may be {@code null}
+   * @return the account state, {@link Optional#empty()} if the account doesn't exist
+   * @throws IOException if accessing the external IDs fails
+   */
+  public static Optional<AccountState> fromAccountConfig(
+      AllUsersName allUsersName,
+      ExternalIds externalIds,
+      AccountConfig accountConfig,
+      @Nullable ExternalIdNotes extIdNotes)
+      throws IOException {
+    if (!accountConfig.getLoadedAccount().isPresent()) {
+      return Optional.empty();
+    }
+    Account account = accountConfig.getLoadedAccount().get();
+
+    Optional<ObjectId> extIdsRev =
+        extIdNotes != null
+            ? Optional.ofNullable(extIdNotes.getRevision())
+            : accountConfig.getExternalIdsRev();
+    ImmutableSet<ExternalId> extIds =
+        extIdsRev.isPresent()
+            ? ImmutableSet.copyOf(externalIds.byAccount(account.getId(), extIdsRev.get()))
+            : ImmutableSet.of();
+
+    // Don't leak references to AccountConfig into the AccountState, since it holds a reference to
+    // an open Repository instance.
+    ImmutableMap<ProjectWatchKey, ImmutableSet<NotifyType>> projectWatches =
+        accountConfig.getProjectWatches();
+    GeneralPreferencesInfo generalPreferences = accountConfig.getGeneralPreferences();
+    DiffPreferencesInfo diffPreferences = accountConfig.getDiffPreferences();
+    EditPreferencesInfo editPreferences = accountConfig.getEditPreferences();
+
+    return Optional.of(
+        new AccountState(
+            allUsersName,
+            account,
+            extIds,
+            projectWatches,
+            generalPreferences,
+            diffPreferences,
+            editPreferences));
+  }
+
+  /**
+   * Creates an AccountState for a given account with no external IDs, no project watches and
+   * default preferences.
+   *
+   * @param allUsersName the name of the All-Users repository
+   * @param account the account
+   * @return the account state
+   */
+  public static AccountState forAccount(AllUsersName allUsersName, Account account) {
+    return forAccount(allUsersName, account, ImmutableSet.of());
+  }
+
+  /**
+   * Creates an AccountState for a given account with no project watches and default preferences.
+   *
+   * @param allUsersName the name of the All-Users repository
+   * @param account the account
+   * @param extIds the external IDs
+   * @return the account state
+   */
+  public static AccountState forAccount(
+      AllUsersName allUsersName, Account account, Collection<ExternalId> extIds) {
+    return new AccountState(
+        allUsersName,
+        account,
+        ImmutableSet.copyOf(extIds),
+        ImmutableMap.of(),
+        GeneralPreferencesInfo.defaults(),
+        DiffPreferencesInfo.defaults(),
+        EditPreferencesInfo.defaults());
+  }
+
+  private final AllUsersName allUsersName;
+  private final Account account;
+  private final ImmutableSet<ExternalId> externalIds;
+  private final Optional<String> userName;
+  private final ImmutableMap<ProjectWatchKey, ImmutableSet<NotifyType>> projectWatches;
+  private final GeneralPreferencesInfo generalPreferences;
+  private final DiffPreferencesInfo diffPreferences;
+  private final EditPreferencesInfo editPreferences;
+  private Cache<IdentifiedUser.PropertyKey<Object>, Object> properties;
+
+  private AccountState(
+      AllUsersName allUsersName,
+      Account account,
+      ImmutableSet<ExternalId> externalIds,
+      ImmutableMap<ProjectWatchKey, ImmutableSet<NotifyType>> projectWatches,
+      GeneralPreferencesInfo generalPreferences,
+      DiffPreferencesInfo diffPreferences,
+      EditPreferencesInfo editPreferences) {
+    this.allUsersName = allUsersName;
+    this.account = account;
+    this.externalIds = externalIds;
+    this.userName = ExternalId.getUserName(externalIds);
+    this.projectWatches = projectWatches;
+    this.generalPreferences = generalPreferences;
+    this.diffPreferences = diffPreferences;
+    this.editPreferences = editPreferences;
+  }
+
+  public AllUsersName getAllUsersNameForIndexing() {
+    return allUsersName;
+  }
+
+  /** Get the cached account metadata. */
+  public Account getAccount() {
+    return account;
+  }
+
+  /**
+   * Get the username, if one has been declared for this user.
+   *
+   * <p>The username is the {@link ExternalId} using the scheme {@link ExternalId#SCHEME_USERNAME}.
+   *
+   * @return the username, {@link Optional#empty()} if the user has no username, or if the username
+   *     is empty
+   */
+  public Optional<String> getUserName() {
+    return userName;
+  }
+
+  public boolean checkPassword(@Nullable String password, String username) {
+    if (password == null) {
+      return false;
+    }
+    for (ExternalId id : getExternalIds()) {
+      // Only process the "username:$USER" entry, which is unique.
+      if (!id.isScheme(SCHEME_USERNAME) || !username.equals(id.key().id())) {
+        continue;
+      }
+
+      String hashedStr = id.password();
+      if (!Strings.isNullOrEmpty(hashedStr)) {
+        try {
+          return HashedPassword.decode(hashedStr).checkPassword(password);
+        } catch (DecoderException e) {
+          logger.atSevere().log("DecoderException for user %s: %s ", username, e.getMessage());
+          return false;
+        }
+      }
+    }
+    return false;
+  }
+
+  /** The external identities that identify the account holder. */
+  public ImmutableSet<ExternalId> getExternalIds() {
+    return externalIds;
+  }
+
+  /** The external identities that identify the account holder that match the given scheme. */
+  public ImmutableSet<ExternalId> getExternalIds(String scheme) {
+    return externalIds.stream().filter(e -> e.key().isScheme(scheme)).collect(toImmutableSet());
+  }
+
+  /** The project watches of the account. */
+  public ImmutableMap<ProjectWatchKey, ImmutableSet<NotifyType>> getProjectWatches() {
+    return projectWatches;
+  }
+
+  /** The general preferences of the account. */
+  public GeneralPreferencesInfo getGeneralPreferences() {
+    return generalPreferences;
+  }
+
+  /** The diff preferences of the account. */
+  public DiffPreferencesInfo getDiffPreferences() {
+    return diffPreferences;
+  }
+
+  /** The edit preferences of the account. */
+  public EditPreferencesInfo getEditPreferences() {
+    return editPreferences;
+  }
+
+  /**
+   * Lookup a previously stored property.
+   *
+   * <p>All properties are automatically cleared when the account cache invalidates the {@code
+   * AccountState}. This method is thread-safe.
+   *
+   * @param key unique property key.
+   * @return previously stored value, or {@code null}.
+   */
+  @Nullable
+  public <T> T get(PropertyKey<T> key) {
+    Cache<PropertyKey<Object>, Object> p = properties(false);
+    if (p != null) {
+      @SuppressWarnings("unchecked")
+      T value = (T) p.getIfPresent(key);
+      return value;
+    }
+    return null;
+  }
+
+  /**
+   * Store a property for later retrieval.
+   *
+   * <p>This method is thread-safe.
+   *
+   * @param key unique property key.
+   * @param value value to store; or {@code null} to clear the value.
+   */
+  public <T> void put(PropertyKey<T> key, @Nullable T value) {
+    Cache<PropertyKey<Object>, Object> p = properties(value != null);
+    if (p != null) {
+      @SuppressWarnings("unchecked")
+      PropertyKey<Object> k = (PropertyKey<Object>) key;
+      if (value != null) {
+        p.put(k, value);
+      } else {
+        p.invalidate(k);
+      }
+    }
+  }
+
+  private synchronized Cache<PropertyKey<Object>, Object> properties(boolean allocate) {
+    if (properties == null && allocate) {
+      properties =
+          CacheBuilder.newBuilder()
+              .concurrencyLevel(1)
+              .initialCapacity(16)
+              // Use weakKeys to ensure plugins that garbage collect will also
+              // eventually release data held in any still live AccountState.
+              .weakKeys()
+              .build();
+    }
+    return properties;
+  }
+
+  @Override
+  public String toString() {
+    MoreObjects.ToStringHelper h = MoreObjects.toStringHelper(this);
+    h.addValue(getAccount().getId());
+    return h.toString();
+  }
+}
diff --git a/java/com/google/gerrit/server/account/AccountUserNameException.java b/java/com/google/gerrit/server/account/AccountUserNameException.java
new file mode 100644
index 0000000..a1f1df2
--- /dev/null
+++ b/java/com/google/gerrit/server/account/AccountUserNameException.java
@@ -0,0 +1,31 @@
+// Copyright (C) 2010 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.google.gerrit.server.account;
+
+/**
+ * Thrown by {@link AccountManager} if the user name for a newly created account could not be set
+ * and the realm does not allow the user to set a user name manually.
+ */
+public class AccountUserNameException extends AccountException {
+  private static final long serialVersionUID = 1L;
+
+  public AccountUserNameException(String message) {
+    super(message);
+  }
+
+  public AccountUserNameException(String message, Throwable why) {
+    super(message, why);
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountVisibilityProvider.java b/java/com/google/gerrit/server/account/AccountVisibilityProvider.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/account/AccountVisibilityProvider.java
rename to java/com/google/gerrit/server/account/AccountVisibilityProvider.java
diff --git a/java/com/google/gerrit/server/account/Accounts.java b/java/com/google/gerrit/server/account/Accounts.java
new file mode 100644
index 0000000..f3758bf
--- /dev/null
+++ b/java/com/google/gerrit/server/account/Accounts.java
@@ -0,0 +1,147 @@
+// Copyright (C) 2017 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.google.gerrit.server.account;
+
+import static java.util.Comparator.comparing;
+import static java.util.stream.Collectors.toList;
+import static java.util.stream.Collectors.toSet;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.account.externalids.ExternalIds;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Stream;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Repository;
+
+/** Class to access accounts. */
+@Singleton
+public class Accounts {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final GitRepositoryManager repoManager;
+  private final AllUsersName allUsersName;
+  private final ExternalIds externalIds;
+
+  @Inject
+  Accounts(GitRepositoryManager repoManager, AllUsersName allUsersName, ExternalIds externalIds) {
+    this.repoManager = repoManager;
+    this.allUsersName = allUsersName;
+    this.externalIds = externalIds;
+  }
+
+  public Optional<AccountState> get(Account.Id accountId)
+      throws IOException, ConfigInvalidException {
+    try (Repository repo = repoManager.openRepository(allUsersName)) {
+      return read(repo, accountId);
+    }
+  }
+
+  public List<AccountState> get(Collection<Account.Id> accountIds)
+      throws IOException, ConfigInvalidException {
+    List<AccountState> accounts = new ArrayList<>(accountIds.size());
+    try (Repository repo = repoManager.openRepository(allUsersName)) {
+      for (Account.Id accountId : accountIds) {
+        read(repo, accountId).ifPresent(accounts::add);
+      }
+    }
+    return accounts;
+  }
+
+  /**
+   * Returns all accounts.
+   *
+   * @return all accounts
+   */
+  public List<AccountState> all() throws IOException {
+    Set<Account.Id> accountIds = allIds();
+    List<AccountState> accounts = new ArrayList<>(accountIds.size());
+    try (Repository repo = repoManager.openRepository(allUsersName)) {
+      for (Account.Id accountId : accountIds) {
+        try {
+          read(repo, accountId).ifPresent(accounts::add);
+        } catch (Exception e) {
+          logger.atSevere().withCause(e).log("Ignoring invalid account %s", accountId);
+        }
+      }
+    }
+    return accounts;
+  }
+
+  /**
+   * Returns all account IDs.
+   *
+   * @return all account IDs
+   */
+  public Set<Account.Id> allIds() throws IOException {
+    return readUserRefs().collect(toSet());
+  }
+
+  /**
+   * Returns the first n account IDs.
+   *
+   * @param n the number of account IDs that should be returned
+   * @return first n account IDs
+   */
+  public List<Account.Id> firstNIds(int n) throws IOException {
+    return readUserRefs().sorted(comparing(Account.Id::get)).limit(n).collect(toList());
+  }
+
+  /**
+   * Checks if any account exists.
+   *
+   * @return {@code true} if at least one account exists, otherwise {@code false}
+   */
+  public boolean hasAnyAccount() throws IOException {
+    try (Repository repo = repoManager.openRepository(allUsersName)) {
+      return hasAnyAccount(repo);
+    }
+  }
+
+  public static boolean hasAnyAccount(Repository repo) throws IOException {
+    return readUserRefs(repo).findAny().isPresent();
+  }
+
+  private Stream<Account.Id> readUserRefs() throws IOException {
+    try (Repository repo = repoManager.openRepository(allUsersName)) {
+      return readUserRefs(repo);
+    }
+  }
+
+  private Optional<AccountState> read(Repository allUsersRepository, Account.Id accountId)
+      throws IOException, ConfigInvalidException {
+    return AccountState.fromAccountConfig(
+        allUsersName,
+        externalIds,
+        new AccountConfig(accountId, allUsersName, allUsersRepository).load());
+  }
+
+  public static Stream<Account.Id> readUserRefs(Repository repo) throws IOException {
+    return repo.getRefDatabase().getRefsByPrefix(RefNames.REFS_USERS).stream()
+        .map(r -> Account.Id.fromRef(r.getName()))
+        .filter(Objects::nonNull);
+  }
+}
diff --git a/java/com/google/gerrit/server/account/AccountsConsistencyChecker.java b/java/com/google/gerrit/server/account/AccountsConsistencyChecker.java
new file mode 100644
index 0000000..6873f92
--- /dev/null
+++ b/java/com/google/gerrit/server/account/AccountsConsistencyChecker.java
@@ -0,0 +1,57 @@
+// Copyright (C) 2017 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.google.gerrit.server.account;
+
+import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo.ConsistencyProblemInfo;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+@Singleton
+public class AccountsConsistencyChecker {
+  private final Accounts accounts;
+
+  @Inject
+  AccountsConsistencyChecker(Accounts accounts) {
+    this.accounts = accounts;
+  }
+
+  public List<ConsistencyProblemInfo> check() throws IOException {
+    List<ConsistencyProblemInfo> problems = new ArrayList<>();
+
+    for (AccountState accountState : accounts.all()) {
+      Account account = accountState.getAccount();
+      if (account.getPreferredEmail() != null) {
+        if (!accountState.getExternalIds().stream()
+            .anyMatch(e -> account.getPreferredEmail().equals(e.email()))) {
+          addError(
+              String.format(
+                  "Account '%s' has no external ID for its preferred email '%s'",
+                  account.getId().get(), account.getPreferredEmail()),
+              problems);
+        }
+      }
+    }
+
+    return problems;
+  }
+
+  private static void addError(String error, List<ConsistencyProblemInfo> problems) {
+    problems.add(new ConsistencyProblemInfo(ConsistencyProblemInfo.Status.ERROR, error));
+  }
+}
diff --git a/java/com/google/gerrit/server/account/AccountsUpdate.java b/java/com/google/gerrit/server/account/AccountsUpdate.java
new file mode 100644
index 0000000..0e3f379
--- /dev/null
+++ b/java/com/google/gerrit/server/account/AccountsUpdate.java
@@ -0,0 +1,584 @@
+// Copyright (C) 2017 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.google.gerrit.server.account;
+
+import static com.google.common.base.Preconditions.checkState;
+import static java.util.Objects.requireNonNull;
+import static java.util.stream.Collectors.toSet;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Strings;
+import com.google.common.base.Throwables;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.util.concurrent.Runnables;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.InternalAccountUpdate.Builder;
+import com.google.gerrit.server.account.externalids.ExternalIdNotes;
+import com.google.gerrit.server.account.externalids.ExternalIdNotes.ExternalIdNotesLoader;
+import com.google.gerrit.server.account.externalids.ExternalIds;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.LockFailureException;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.index.change.ReindexAfterRefUpdate;
+import com.google.gerrit.server.update.RefUpdateUtil;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryHelper.Action;
+import com.google.gerrit.server.update.RetryHelper.ActionType;
+import com.google.gwtorm.server.OrmDuplicateKeyException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.Consumer;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+
+/**
+ * Creates and updates accounts.
+ *
+ * <p>This class should be used for all account updates. It supports updating account properties,
+ * external IDs, preferences (general, diff and edit preferences) and project watches.
+ *
+ * <p>Updates to one account are always atomic. Batch updating several accounts within one
+ * transaction is not supported.
+ *
+ * <p>For any account update the caller must provide a commit message, the account ID and an {@link
+ * AccountUpdater}. The account updater allows to read the current {@link AccountState} and to
+ * prepare updates to the account by calling setters on the provided {@link
+ * InternalAccountUpdate.Builder}. If the current account state is of no interest the caller may
+ * also provide a {@link Consumer} for {@link InternalAccountUpdate.Builder} instead of the account
+ * updater.
+ *
+ * <p>The provided commit message is used for the update of the user branch. Using a precise and
+ * unique commit message allows to identify the code from which an update was made when looking at a
+ * commit in the user branch, and thus help debugging.
+ *
+ * <p>For creating a new account a new account ID can be retrieved from {@link
+ * com.google.gerrit.server.Sequences#nextAccountId()}.
+ *
+ * <p>The account updates are written to NoteDb. In NoteDb accounts are represented as user branches
+ * in the {@code All-Users} repository. Optionally a user branch can contain a 'account.config' file
+ * that stores account properties, such as full name, preferred email, status and the active flag.
+ * The timestamp of the first commit on a user branch denotes the registration date. The initial
+ * commit on the user branch may be empty (since having an 'account.config' is optional). See {@link
+ * AccountConfig} for details of the 'account.config' file format. In addition the user branch can
+ * contain a 'preferences.config' config file to store preferences (see {@link Preferences}) and a
+ * 'watch.config' config file to store project watches (see {@link ProjectWatches}). External IDs
+ * are stored separately in the {@code refs/meta/external-ids} notes branch (see {@link
+ * ExternalIdNotes}).
+ *
+ * <p>On updating an account the account is evicted from the account cache and reindexed. The
+ * eviction from the account cache and the reindexing is done by the {@link ReindexAfterRefUpdate}
+ * class which receives the event about updating the user branch that is triggered by this class.
+ *
+ * <p>If external IDs are updated, the ExternalIdCache is automatically updated by {@link
+ * ExternalIdNotes}. In addition {@link ExternalIdNotes} takes care about evicting and reindexing
+ * corresponding accounts. This is needed because external ID updates don't touch the user branches.
+ * Hence in this case the accounts are not evicted and reindexed via {@link ReindexAfterRefUpdate}.
+ *
+ * <p>Reindexing and flushing accounts from the account cache can be disabled by
+ *
+ * <ul>
+ *   <li>binding {@link GitReferenceUpdated#DISABLED} and
+ *   <li>passing an {@link
+ *       com.google.gerrit.server.account.externalids.ExternalIdNotes.FactoryNoReindex} factory as
+ *       parameter of {@link AccountsUpdate.Factory#create(IdentifiedUser,
+ *       ExternalIdNotes.ExternalIdNotesLoader)}
+ * </ul>
+ *
+ * <p>If there are concurrent account updates updating the user branch in NoteDb may fail with
+ * {@link LockFailureException}. In this case the account update is automatically retried and the
+ * account updater is invoked once more with the updated account state. This means the whole
+ * read-modify-write sequence is atomic. Retrying is limited by a timeout. If the timeout is
+ * exceeded the account update can still fail with {@link LockFailureException}.
+ */
+public class AccountsUpdate {
+  public interface Factory {
+    /**
+     * Creates an {@code AccountsUpdate} which uses the identity of the specified user as author for
+     * all commits related to accounts. The Gerrit server identity will be used as committer.
+     *
+     * <p><strong>Note</strong>: Please use this method with care and rather consider to use the
+     * correct annotation on the provider of an {@code AccountsUpdate} instead.
+     *
+     * @param currentUser the user to which modifications should be attributed, or {@code null} if
+     *     the Gerrit server identity should also be used as author
+     */
+    AccountsUpdate create(
+        @Nullable IdentifiedUser currentUser, ExternalIdNotesLoader externalIdNotesLoader);
+  }
+
+  /**
+   * Updater for an account.
+   *
+   * <p>Allows to read the current state of an account and to prepare updates to it.
+   */
+  @FunctionalInterface
+  public interface AccountUpdater {
+    /**
+     * Prepare updates to an account.
+     *
+     * <p>Use the provided account only to read the current state of the account. Don't do updates
+     * to the account. For updates use the provided account update builder.
+     *
+     * @param accountState the account that is being updated
+     * @param update account update builder
+     */
+    void update(AccountState accountState, InternalAccountUpdate.Builder update) throws IOException;
+
+    static AccountUpdater join(List<AccountUpdater> updaters) {
+      return new AccountUpdater() {
+        @Override
+        public void update(AccountState accountState, Builder update) throws IOException {
+          for (AccountUpdater updater : updaters) {
+            updater.update(accountState, update);
+          }
+        }
+      };
+    }
+
+    static AccountUpdater joinConsumers(List<Consumer<InternalAccountUpdate.Builder>> consumers) {
+      return join(Lists.transform(consumers, AccountUpdater::fromConsumer));
+    }
+
+    static AccountUpdater fromConsumer(Consumer<InternalAccountUpdate.Builder> consumer) {
+      return (a, u) -> consumer.accept(u);
+    }
+  }
+
+  private final GitRepositoryManager repoManager;
+  private final GitReferenceUpdated gitRefUpdated;
+  @Nullable private final IdentifiedUser currentUser;
+  private final AllUsersName allUsersName;
+  private final ExternalIds externalIds;
+  private final Provider<MetaDataUpdate.InternalFactory> metaDataUpdateInternalFactory;
+  private final RetryHelper retryHelper;
+  private final ExternalIdNotesLoader extIdNotesLoader;
+  private final PersonIdent committerIdent;
+  private final PersonIdent authorIdent;
+
+  // Invoked after reading the account config.
+  private final Runnable afterReadRevision;
+
+  // Invoked after updating the account but before committing the changes.
+  private final Runnable beforeCommit;
+
+  @Inject
+  AccountsUpdate(
+      GitRepositoryManager repoManager,
+      GitReferenceUpdated gitRefUpdated,
+      AllUsersName allUsersName,
+      ExternalIds externalIds,
+      Provider<MetaDataUpdate.InternalFactory> metaDataUpdateInternalFactory,
+      RetryHelper retryHelper,
+      @GerritPersonIdent PersonIdent serverIdent,
+      @Assisted @Nullable IdentifiedUser currentUser,
+      @Assisted ExternalIdNotesLoader extIdNotesLoader) {
+    this(
+        repoManager,
+        gitRefUpdated,
+        currentUser,
+        allUsersName,
+        externalIds,
+        metaDataUpdateInternalFactory,
+        retryHelper,
+        extIdNotesLoader,
+        serverIdent,
+        createPersonIdent(serverIdent, currentUser),
+        Runnables.doNothing(),
+        Runnables.doNothing());
+  }
+
+  @VisibleForTesting
+  public AccountsUpdate(
+      GitRepositoryManager repoManager,
+      GitReferenceUpdated gitRefUpdated,
+      @Nullable IdentifiedUser currentUser,
+      AllUsersName allUsersName,
+      ExternalIds externalIds,
+      Provider<MetaDataUpdate.InternalFactory> metaDataUpdateInternalFactory,
+      RetryHelper retryHelper,
+      ExternalIdNotesLoader extIdNotesLoader,
+      PersonIdent committerIdent,
+      PersonIdent authorIdent,
+      Runnable afterReadRevision,
+      Runnable beforeCommit) {
+    this.repoManager = requireNonNull(repoManager, "repoManager");
+    this.gitRefUpdated = requireNonNull(gitRefUpdated, "gitRefUpdated");
+    this.currentUser = currentUser;
+    this.allUsersName = requireNonNull(allUsersName, "allUsersName");
+    this.externalIds = requireNonNull(externalIds, "externalIds");
+    this.metaDataUpdateInternalFactory =
+        requireNonNull(metaDataUpdateInternalFactory, "metaDataUpdateInternalFactory");
+    this.retryHelper = requireNonNull(retryHelper, "retryHelper");
+    this.extIdNotesLoader = requireNonNull(extIdNotesLoader, "extIdNotesLoader");
+    this.committerIdent = requireNonNull(committerIdent, "committerIdent");
+    this.authorIdent = requireNonNull(authorIdent, "authorIdent");
+    this.afterReadRevision = requireNonNull(afterReadRevision, "afterReadRevision");
+    this.beforeCommit = requireNonNull(beforeCommit, "beforeCommit");
+  }
+
+  private static PersonIdent createPersonIdent(
+      PersonIdent serverIdent, @Nullable IdentifiedUser user) {
+    if (user == null) {
+      return serverIdent;
+    }
+    return user.newCommitterIdent(serverIdent.getWhen(), serverIdent.getTimeZone());
+  }
+
+  /**
+   * Inserts a new account.
+   *
+   * @param message commit message for the account creation, must not be {@code null or empty}
+   * @param accountId ID of the new account
+   * @param init consumer to populate the new account
+   * @return the newly created account
+   * @throws OrmDuplicateKeyException if the account already exists
+   * @throws IOException if creating the user branch fails due to an IO error
+   * @throws OrmException if creating the user branch fails
+   * @throws ConfigInvalidException if any of the account fields has an invalid value
+   */
+  public AccountState insert(
+      String message, Account.Id accountId, Consumer<InternalAccountUpdate.Builder> init)
+      throws OrmException, IOException, ConfigInvalidException {
+    return insert(message, accountId, AccountUpdater.fromConsumer(init));
+  }
+
+  /**
+   * Inserts a new account.
+   *
+   * @param message commit message for the account creation, must not be {@code null or empty}
+   * @param accountId ID of the new account
+   * @param updater updater to populate the new account
+   * @return the newly created account
+   * @throws OrmDuplicateKeyException if the account already exists
+   * @throws IOException if creating the user branch fails due to an IO error
+   * @throws OrmException if creating the user branch fails
+   * @throws ConfigInvalidException if any of the account fields has an invalid value
+   */
+  public AccountState insert(String message, Account.Id accountId, AccountUpdater updater)
+      throws OrmException, IOException, ConfigInvalidException {
+    return updateAccount(
+            r -> {
+              AccountConfig accountConfig = read(r, accountId);
+              Account account =
+                  accountConfig.getNewAccount(new Timestamp(committerIdent.getWhen().getTime()));
+              AccountState accountState = AccountState.forAccount(allUsersName, account);
+              InternalAccountUpdate.Builder updateBuilder = InternalAccountUpdate.builder();
+              updater.update(accountState, updateBuilder);
+
+              InternalAccountUpdate update = updateBuilder.build();
+              accountConfig.setAccountUpdate(update);
+              ExternalIdNotes extIdNotes =
+                  createExternalIdNotes(r, accountConfig.getExternalIdsRev(), accountId, update);
+              UpdatedAccount updatedAccounts =
+                  new UpdatedAccount(allUsersName, externalIds, message, accountConfig, extIdNotes);
+              updatedAccounts.setCreated(true);
+              return updatedAccounts;
+            })
+        .get();
+  }
+
+  /**
+   * Gets the account and updates it atomically.
+   *
+   * <p>Changing the registration date of an account is not supported.
+   *
+   * @param message commit message for the account update, must not be {@code null or empty}
+   * @param accountId ID of the account
+   * @param update consumer to update the account, only invoked if the account exists
+   * @return the updated account, {@link Optional#empty()} if the account doesn't exist
+   * @throws IOException if updating the user branch fails due to an IO error
+   * @throws LockFailureException if updating the user branch still fails due to concurrent updates
+   *     after the retry timeout exceeded
+   * @throws OrmException if updating the user branch fails
+   * @throws ConfigInvalidException if any of the account fields has an invalid value
+   */
+  public Optional<AccountState> update(
+      String message, Account.Id accountId, Consumer<InternalAccountUpdate.Builder> update)
+      throws OrmException, LockFailureException, IOException, ConfigInvalidException {
+    return update(message, accountId, AccountUpdater.fromConsumer(update));
+  }
+
+  /**
+   * Gets the account and updates it atomically.
+   *
+   * <p>Changing the registration date of an account is not supported.
+   *
+   * @param message commit message for the account update, must not be {@code null or empty}
+   * @param accountId ID of the account
+   * @param updater updater to update the account, only invoked if the account exists
+   * @return the updated account, {@link Optional#empty} if the account doesn't exist
+   * @throws IOException if updating the user branch fails due to an IO error
+   * @throws LockFailureException if updating the user branch still fails due to concurrent updates
+   *     after the retry timeout exceeded
+   * @throws OrmException if updating the user branch fails
+   * @throws ConfigInvalidException if any of the account fields has an invalid value
+   */
+  public Optional<AccountState> update(String message, Account.Id accountId, AccountUpdater updater)
+      throws OrmException, LockFailureException, IOException, ConfigInvalidException {
+    return updateAccount(
+        r -> {
+          AccountConfig accountConfig = read(r, accountId);
+          Optional<AccountState> account =
+              AccountState.fromAccountConfig(allUsersName, externalIds, accountConfig);
+          if (!account.isPresent()) {
+            return null;
+          }
+
+          InternalAccountUpdate.Builder updateBuilder = InternalAccountUpdate.builder();
+          updater.update(account.get(), updateBuilder);
+
+          InternalAccountUpdate update = updateBuilder.build();
+          accountConfig.setAccountUpdate(update);
+          ExternalIdNotes extIdNotes =
+              createExternalIdNotes(r, accountConfig.getExternalIdsRev(), accountId, update);
+          UpdatedAccount updatedAccounts =
+              new UpdatedAccount(allUsersName, externalIds, message, accountConfig, extIdNotes);
+          return updatedAccounts;
+        });
+  }
+
+  private AccountConfig read(Repository allUsersRepo, Account.Id accountId)
+      throws IOException, ConfigInvalidException {
+    AccountConfig accountConfig = new AccountConfig(accountId, allUsersName, allUsersRepo).load();
+    afterReadRevision.run();
+    return accountConfig;
+  }
+
+  private Optional<AccountState> updateAccount(AccountUpdate accountUpdate)
+      throws IOException, ConfigInvalidException, OrmException {
+    return executeAccountUpdate(
+        () -> {
+          try (Repository allUsersRepo = repoManager.openRepository(allUsersName)) {
+            UpdatedAccount updatedAccount = accountUpdate.update(allUsersRepo);
+            if (updatedAccount == null) {
+              return Optional.empty();
+            }
+
+            commit(allUsersRepo, updatedAccount);
+            return Optional.of(updatedAccount.getAccount());
+          }
+        });
+  }
+
+  private Optional<AccountState> executeAccountUpdate(Action<Optional<AccountState>> action)
+      throws IOException, ConfigInvalidException, OrmException {
+    try {
+      return retryHelper.execute(
+          ActionType.ACCOUNT_UPDATE, action, LockFailureException.class::isInstance);
+    } catch (Exception e) {
+      Throwables.throwIfUnchecked(e);
+      Throwables.throwIfInstanceOf(e, IOException.class);
+      Throwables.throwIfInstanceOf(e, ConfigInvalidException.class);
+      Throwables.throwIfInstanceOf(e, OrmException.class);
+      throw new OrmException(e);
+    }
+  }
+
+  private ExternalIdNotes createExternalIdNotes(
+      Repository allUsersRepo,
+      Optional<ObjectId> rev,
+      Account.Id accountId,
+      InternalAccountUpdate update)
+      throws IOException, ConfigInvalidException, OrmDuplicateKeyException {
+    ExternalIdNotes.checkSameAccount(
+        Iterables.concat(
+            update.getCreatedExternalIds(),
+            update.getUpdatedExternalIds(),
+            update.getDeletedExternalIds()),
+        accountId);
+
+    ExternalIdNotes extIdNotes = extIdNotesLoader.load(allUsersRepo, rev.orElse(ObjectId.zeroId()));
+    extIdNotes.replace(update.getDeletedExternalIds(), update.getCreatedExternalIds());
+    extIdNotes.upsert(update.getUpdatedExternalIds());
+    return extIdNotes;
+  }
+
+  private void commit(Repository allUsersRepo, UpdatedAccount updatedAccount) throws IOException {
+    beforeCommit.run();
+
+    BatchRefUpdate batchRefUpdate = allUsersRepo.getRefDatabase().newBatchUpdate();
+
+    if (updatedAccount.isCreated()) {
+      commitNewAccountConfig(
+          updatedAccount.getMessage(),
+          allUsersRepo,
+          batchRefUpdate,
+          updatedAccount.getAccountConfig());
+    } else {
+      commitAccountConfig(
+          updatedAccount.getMessage(),
+          allUsersRepo,
+          batchRefUpdate,
+          updatedAccount.getAccountConfig());
+    }
+
+    commitExternalIdUpdates(
+        updatedAccount.getMessage(),
+        allUsersRepo,
+        batchRefUpdate,
+        updatedAccount.getExternalIdNotes());
+
+    RefUpdateUtil.executeChecked(batchRefUpdate, allUsersRepo);
+
+    // Skip accounts that are updated when evicting the account cache via ExternalIdNotes to avoid
+    // double reindexing. The updated accounts will already be reindexed by ReindexAfterRefUpdate.
+    Set<Account.Id> accountsThatWillBeReindexByReindexAfterRefUpdate =
+        getUpdatedAccounts(batchRefUpdate);
+    updatedAccount
+        .getExternalIdNotes()
+        .updateCaches(accountsThatWillBeReindexByReindexAfterRefUpdate);
+
+    gitRefUpdated.fire(
+        allUsersName, batchRefUpdate, currentUser != null ? currentUser.state() : null);
+  }
+
+  private static Set<Account.Id> getUpdatedAccounts(BatchRefUpdate batchRefUpdate) {
+    return batchRefUpdate.getCommands().stream()
+        .map(c -> Account.Id.fromRef(c.getRefName()))
+        .filter(Objects::nonNull)
+        .collect(toSet());
+  }
+
+  private void commitNewAccountConfig(
+      String message,
+      Repository allUsersRepo,
+      BatchRefUpdate batchRefUpdate,
+      AccountConfig accountConfig)
+      throws IOException {
+    // When creating a new account we must allow empty commits so that the user branch gets created
+    // with an empty commit when no account properties are set and hence no 'account.config' file
+    // will be created.
+    commitAccountConfig(message, allUsersRepo, batchRefUpdate, accountConfig, true);
+  }
+
+  private void commitAccountConfig(
+      String message,
+      Repository allUsersRepo,
+      BatchRefUpdate batchRefUpdate,
+      AccountConfig accountConfig)
+      throws IOException {
+    commitAccountConfig(message, allUsersRepo, batchRefUpdate, accountConfig, false);
+  }
+
+  private void commitAccountConfig(
+      String message,
+      Repository allUsersRepo,
+      BatchRefUpdate batchRefUpdate,
+      AccountConfig accountConfig,
+      boolean allowEmptyCommit)
+      throws IOException {
+    try (MetaDataUpdate md = createMetaDataUpdate(message, allUsersRepo, batchRefUpdate)) {
+      md.setAllowEmpty(allowEmptyCommit);
+      accountConfig.commit(md);
+    }
+  }
+
+  private void commitExternalIdUpdates(
+      String message,
+      Repository allUsersRepo,
+      BatchRefUpdate batchRefUpdate,
+      ExternalIdNotes extIdNotes)
+      throws IOException {
+    try (MetaDataUpdate md = createMetaDataUpdate(message, allUsersRepo, batchRefUpdate)) {
+      extIdNotes.commit(md);
+    }
+  }
+
+  private MetaDataUpdate createMetaDataUpdate(
+      String message, Repository allUsersRepo, BatchRefUpdate batchRefUpdate) {
+    MetaDataUpdate metaDataUpdate =
+        metaDataUpdateInternalFactory.get().create(allUsersName, allUsersRepo, batchRefUpdate);
+    if (!message.endsWith("\n")) {
+      message = message + "\n";
+    }
+
+    metaDataUpdate.getCommitBuilder().setMessage(message);
+    metaDataUpdate.getCommitBuilder().setCommitter(committerIdent);
+    metaDataUpdate.getCommitBuilder().setAuthor(authorIdent);
+    return metaDataUpdate;
+  }
+
+  @FunctionalInterface
+  private static interface AccountUpdate {
+    UpdatedAccount update(Repository allUsersRepo)
+        throws IOException, ConfigInvalidException, OrmException;
+  }
+
+  private static class UpdatedAccount {
+    private final AllUsersName allUsersName;
+    private final ExternalIds externalIds;
+    private final String message;
+    private final AccountConfig accountConfig;
+    private final ExternalIdNotes extIdNotes;
+
+    private boolean created;
+
+    private UpdatedAccount(
+        AllUsersName allUsersName,
+        ExternalIds externalIds,
+        String message,
+        AccountConfig accountConfig,
+        ExternalIdNotes extIdNotes) {
+      checkState(!Strings.isNullOrEmpty(message), "message for account update must be set");
+      this.allUsersName = requireNonNull(allUsersName);
+      this.externalIds = requireNonNull(externalIds);
+      this.message = requireNonNull(message);
+      this.accountConfig = requireNonNull(accountConfig);
+      this.extIdNotes = requireNonNull(extIdNotes);
+    }
+
+    public String getMessage() {
+      return message;
+    }
+
+    public AccountConfig getAccountConfig() {
+      return accountConfig;
+    }
+
+    public AccountState getAccount() throws IOException {
+      return AccountState.fromAccountConfig(allUsersName, externalIds, accountConfig, extIdNotes)
+          .get();
+    }
+
+    public ExternalIdNotes getExternalIdNotes() {
+      return extIdNotes;
+    }
+
+    public void setCreated(boolean created) {
+      this.created = created;
+    }
+
+    public boolean isCreated() {
+      return created;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/account/AuthRequest.java b/java/com/google/gerrit/server/account/AuthRequest.java
new file mode 100644
index 0000000..ddb54a6
--- /dev/null
+++ b/java/com/google/gerrit/server/account/AuthRequest.java
@@ -0,0 +1,164 @@
+// Copyright (C) 2009 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.google.gerrit.server.account;
+
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_EXTERNAL;
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_GERRIT;
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_MAILTO;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import java.util.Optional;
+
+/**
+ * Information for {@link AccountManager#authenticate(AuthRequest)}.
+ *
+ * <p>Callers should populate this object with as much information as possible about the user
+ * account. For example, OpenID authentication might return registration information including a
+ * display name for the user, and an email address for them. These fields however are optional, as
+ * not all OpenID providers return them, and not all non-OpenID systems can use them.
+ */
+public class AuthRequest {
+  /** Create a request for a local username, such as from LDAP. */
+  public static AuthRequest forUser(String username) {
+    AuthRequest r = new AuthRequest(ExternalId.Key.create(SCHEME_GERRIT, username));
+    r.setUserName(username);
+    return r;
+  }
+
+  /** Create a request for an external username. */
+  public static AuthRequest forExternalUser(String username) {
+    AuthRequest r = new AuthRequest(ExternalId.Key.create(SCHEME_EXTERNAL, username));
+    r.setUserName(username);
+    return r;
+  }
+
+  /**
+   * Create a request for an email address registration.
+   *
+   * <p>This type of request should be used only to attach a new email address to an existing user
+   * account.
+   */
+  public static AuthRequest forEmail(String email) {
+    AuthRequest r = new AuthRequest(ExternalId.Key.create(SCHEME_MAILTO, email));
+    r.setEmailAddress(email);
+    return r;
+  }
+
+  private ExternalId.Key externalId;
+  private String password;
+  private String displayName;
+  private String emailAddress;
+  private Optional<String> userName = Optional.empty();
+  private boolean skipAuthentication;
+  private String authPlugin;
+  private String authProvider;
+  private boolean authProvidesAccountActiveStatus;
+  private boolean active;
+
+  public AuthRequest(ExternalId.Key externalId) {
+    this.externalId = externalId;
+  }
+
+  public ExternalId.Key getExternalIdKey() {
+    return externalId;
+  }
+
+  public String getLocalUser() {
+    if (externalId.isScheme(SCHEME_GERRIT)) {
+      return externalId.id();
+    }
+    return null;
+  }
+
+  public void setLocalUser(String localUser) {
+    if (externalId.isScheme(SCHEME_GERRIT)) {
+      externalId = ExternalId.Key.create(SCHEME_GERRIT, localUser);
+    }
+  }
+
+  public String getPassword() {
+    return password;
+  }
+
+  public void setPassword(String pass) {
+    password = pass;
+  }
+
+  public String getDisplayName() {
+    return displayName;
+  }
+
+  public void setDisplayName(String name) {
+    displayName = name != null && name.length() > 0 ? name : null;
+  }
+
+  public String getEmailAddress() {
+    return emailAddress;
+  }
+
+  public void setEmailAddress(String email) {
+    emailAddress = email != null && email.length() > 0 ? email : null;
+  }
+
+  public Optional<String> getUserName() {
+    return userName;
+  }
+
+  public void setUserName(@Nullable String user) {
+    userName = Optional.ofNullable(Strings.emptyToNull(user));
+  }
+
+  public boolean isSkipAuthentication() {
+    return skipAuthentication;
+  }
+
+  public void setSkipAuthentication(boolean skip) {
+    skipAuthentication = skip;
+  }
+
+  public String getAuthPlugin() {
+    return authPlugin;
+  }
+
+  public void setAuthPlugin(String authPlugin) {
+    this.authPlugin = authPlugin;
+  }
+
+  public String getAuthProvider() {
+    return authProvider;
+  }
+
+  public void setAuthProvider(String authProvider) {
+    this.authProvider = authProvider;
+  }
+
+  public boolean authProvidesAccountActiveStatus() {
+    return authProvidesAccountActiveStatus;
+  }
+
+  public void setAuthProvidesAccountActiveStatus(boolean authProvidesAccountActiveStatus) {
+    this.authProvidesAccountActiveStatus = authProvidesAccountActiveStatus;
+  }
+
+  public boolean isActive() {
+    return active;
+  }
+
+  public void setActive(Boolean isActive) {
+    this.active = isActive;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AuthResult.java b/java/com/google/gerrit/server/account/AuthResult.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/account/AuthResult.java
rename to java/com/google/gerrit/server/account/AuthResult.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AuthenticationFailedException.java b/java/com/google/gerrit/server/account/AuthenticationFailedException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/account/AuthenticationFailedException.java
rename to java/com/google/gerrit/server/account/AuthenticationFailedException.java
diff --git a/java/com/google/gerrit/server/account/AuthorizedKeys.java b/java/com/google/gerrit/server/account/AuthorizedKeys.java
new file mode 100644
index 0000000..b392c18
--- /dev/null
+++ b/java/com/google/gerrit/server/account/AuthorizedKeys.java
@@ -0,0 +1,74 @@
+// 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.
+
+package com.google.gerrit.server.account;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Splitter;
+import com.google.gerrit.reviewdb.client.Account;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Optional;
+import java.util.regex.Pattern;
+
+public class AuthorizedKeys {
+  public static final String FILE_NAME = "authorized_keys";
+
+  @VisibleForTesting public static final String INVALID_KEY_COMMENT_PREFIX = "# INVALID ";
+
+  @VisibleForTesting public static final String DELETED_KEY_COMMENT = "# DELETED";
+
+  private static final Pattern LINE_SPLIT_PATTERN = Pattern.compile("\\r?\\n");
+
+  public static List<Optional<AccountSshKey>> parse(Account.Id accountId, String s) {
+    List<Optional<AccountSshKey>> keys = new ArrayList<>();
+    int seq = 1;
+    for (String line : Splitter.on(LINE_SPLIT_PATTERN).split(s)) {
+      line = line.trim();
+      if (line.isEmpty()) {
+        continue;
+      } else if (line.startsWith(INVALID_KEY_COMMENT_PREFIX)) {
+        String pub = line.substring(INVALID_KEY_COMMENT_PREFIX.length());
+        AccountSshKey key = AccountSshKey.createInvalid(accountId, seq++, pub);
+        keys.add(Optional.of(key));
+      } else if (line.startsWith(DELETED_KEY_COMMENT)) {
+        keys.add(Optional.empty());
+        seq++;
+      } else if (line.startsWith("#")) {
+        continue;
+      } else {
+        AccountSshKey key = AccountSshKey.create(accountId, seq++, line);
+        keys.add(Optional.of(key));
+      }
+    }
+    return keys;
+  }
+
+  public static String serialize(Collection<Optional<AccountSshKey>> keys) {
+    StringBuilder b = new StringBuilder();
+    for (Optional<AccountSshKey> key : keys) {
+      if (key.isPresent()) {
+        if (!key.get().valid()) {
+          b.append(INVALID_KEY_COMMENT_PREFIX);
+        }
+        b.append(key.get().sshPublicKey().trim());
+      } else {
+        b.append(DELETED_KEY_COMMENT);
+      }
+      b.append("\n");
+    }
+    return b.toString();
+  }
+}
diff --git a/java/com/google/gerrit/server/account/CapabilityCollection.java b/java/com/google/gerrit/server/account/CapabilityCollection.java
new file mode 100644
index 0000000..1abc33f
--- /dev/null
+++ b/java/com/google/gerrit/server/account/CapabilityCollection.java
@@ -0,0 +1,155 @@
+// Copyright (C) 2011 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.google.gerrit.server.account;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.common.data.PermissionRange;
+import com.google.gerrit.common.data.PermissionRule;
+import com.google.gerrit.server.config.AdministrateServerGroups;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/** Caches active {@link GlobalCapability} set for a site. */
+public class CapabilityCollection {
+  public interface Factory {
+    CapabilityCollection create(@Nullable AccessSection section);
+  }
+
+  private final SystemGroupBackend systemGroupBackend;
+  private final ImmutableMap<String, ImmutableList<PermissionRule>> permissions;
+
+  public final ImmutableList<PermissionRule> administrateServer;
+  public final ImmutableList<PermissionRule> batchChangesLimit;
+  public final ImmutableList<PermissionRule> emailReviewers;
+  public final ImmutableList<PermissionRule> priority;
+  public final ImmutableList<PermissionRule> readAs;
+  public final ImmutableList<PermissionRule> queryLimit;
+  public final ImmutableList<PermissionRule> createGroup;
+
+  @Inject
+  CapabilityCollection(
+      SystemGroupBackend systemGroupBackend,
+      @AdministrateServerGroups ImmutableSet<GroupReference> admins,
+      @Assisted @Nullable AccessSection section) {
+    this.systemGroupBackend = systemGroupBackend;
+
+    if (section == null) {
+      section = new AccessSection(AccessSection.GLOBAL_CAPABILITIES);
+    }
+
+    Map<String, List<PermissionRule>> tmp = new HashMap<>();
+    for (Permission permission : section.getPermissions()) {
+      for (PermissionRule rule : permission.getRules()) {
+        if (!permission.getName().equals(GlobalCapability.EMAIL_REVIEWERS)
+            && rule.getAction() == PermissionRule.Action.DENY) {
+          continue;
+        }
+
+        List<PermissionRule> r = tmp.get(permission.getName());
+        if (r == null) {
+          r = new ArrayList<>(2);
+          tmp.put(permission.getName(), r);
+        }
+        r.add(rule);
+      }
+    }
+    configureDefaults(tmp, section);
+    if (!tmp.containsKey(GlobalCapability.ADMINISTRATE_SERVER) && !admins.isEmpty()) {
+      tmp.put(GlobalCapability.ADMINISTRATE_SERVER, ImmutableList.<PermissionRule>of());
+    }
+
+    ImmutableMap.Builder<String, ImmutableList<PermissionRule>> m = ImmutableMap.builder();
+    for (Map.Entry<String, List<PermissionRule>> e : tmp.entrySet()) {
+      List<PermissionRule> rules = e.getValue();
+      if (GlobalCapability.ADMINISTRATE_SERVER.equals(e.getKey())) {
+        rules = mergeAdmin(admins, rules);
+      }
+      m.put(e.getKey(), ImmutableList.copyOf(rules));
+    }
+    permissions = m.build();
+
+    administrateServer = getPermission(GlobalCapability.ADMINISTRATE_SERVER);
+    batchChangesLimit = getPermission(GlobalCapability.BATCH_CHANGES_LIMIT);
+    emailReviewers = getPermission(GlobalCapability.EMAIL_REVIEWERS);
+    priority = getPermission(GlobalCapability.PRIORITY);
+    readAs = getPermission(GlobalCapability.READ_AS);
+    queryLimit = getPermission(GlobalCapability.QUERY_LIMIT);
+    createGroup = getPermission(GlobalCapability.CREATE_GROUP);
+  }
+
+  private static List<PermissionRule> mergeAdmin(
+      Set<GroupReference> admins, List<PermissionRule> rules) {
+    if (admins.isEmpty()) {
+      return rules;
+    }
+
+    List<PermissionRule> r = new ArrayList<>(admins.size() + rules.size());
+    for (GroupReference g : admins) {
+      r.add(new PermissionRule(g));
+    }
+    for (PermissionRule rule : rules) {
+      if (!admins.contains(rule.getGroup())) {
+        r.add(rule);
+      }
+    }
+    return r;
+  }
+
+  public ImmutableList<PermissionRule> getPermission(String permissionName) {
+    ImmutableList<PermissionRule> r = permissions.get(permissionName);
+    return r != null ? r : ImmutableList.<PermissionRule>of();
+  }
+
+  private void configureDefaults(Map<String, List<PermissionRule>> out, AccessSection section) {
+    configureDefault(
+        out,
+        section,
+        GlobalCapability.QUERY_LIMIT,
+        systemGroupBackend.getGroup(SystemGroupBackend.ANONYMOUS_USERS));
+  }
+
+  private static void configureDefault(
+      Map<String, List<PermissionRule>> out,
+      AccessSection section,
+      String capName,
+      GroupReference group) {
+    if (doesNotDeclare(section, capName)) {
+      PermissionRange.WithDefaults range = GlobalCapability.getRange(capName);
+      if (range != null) {
+        PermissionRule rule = new PermissionRule(group);
+        rule.setRange(range.getDefaultMin(), range.getDefaultMax());
+        out.put(capName, Collections.singletonList(rule));
+      }
+    }
+  }
+
+  private static boolean doesNotDeclare(AccessSection section, String capName) {
+    return section.getPermission(capName) == null;
+  }
+}
diff --git a/java/com/google/gerrit/server/account/CreateGroupArgs.java b/java/com/google/gerrit/server/account/CreateGroupArgs.java
new file mode 100644
index 0000000..5bcb84b
--- /dev/null
+++ b/java/com/google/gerrit/server/account/CreateGroupArgs.java
@@ -0,0 +1,43 @@
+// Copyright (C) 2014 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.google.gerrit.server.account;
+
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import java.util.Collection;
+
+public class CreateGroupArgs {
+  private AccountGroup.NameKey groupName;
+  public String groupDescription;
+  public boolean visibleToAll;
+  public AccountGroup.UUID ownerGroupUuid;
+  public Collection<? extends Account.Id> initialMembers;
+
+  public AccountGroup.NameKey getGroup() {
+    return groupName;
+  }
+
+  public String getGroupName() {
+    return groupName != null ? groupName.get() : null;
+  }
+
+  public void setGroupName(String n) {
+    groupName = n != null ? new AccountGroup.NameKey(n) : null;
+  }
+
+  public void setGroupName(AccountGroup.NameKey n) {
+    groupName = n;
+  }
+}
diff --git a/java/com/google/gerrit/server/account/DefaultRealm.java b/java/com/google/gerrit/server/account/DefaultRealm.java
new file mode 100644
index 0000000..dde6e81
--- /dev/null
+++ b/java/com/google/gerrit/server/account/DefaultRealm.java
@@ -0,0 +1,96 @@
+// Copyright (C) 2009 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.google.gerrit.server.account;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.client.AccountFieldName;
+import com.google.gerrit.extensions.client.AuthType;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.config.AuthConfig;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Set;
+
+@Singleton
+public class DefaultRealm extends AbstractRealm {
+  private final EmailExpander emailExpander;
+  private final Provider<Emails> emails;
+  private final AuthConfig authConfig;
+
+  @Inject
+  @VisibleForTesting
+  public DefaultRealm(EmailExpander emailExpander, Provider<Emails> emails, AuthConfig authConfig) {
+    this.emailExpander = emailExpander;
+    this.emails = emails;
+    this.authConfig = authConfig;
+  }
+
+  @Override
+  public boolean allowsEdit(AccountFieldName field) {
+    if (authConfig.getAuthType() == AuthType.HTTP) {
+      switch (field) {
+        case USER_NAME:
+          return false;
+        case FULL_NAME:
+          return Strings.emptyToNull(authConfig.getHttpDisplaynameHeader()) == null;
+        case REGISTER_NEW_EMAIL:
+          return authConfig.isAllowRegisterNewEmail()
+              && Strings.emptyToNull(authConfig.getHttpEmailHeader()) == null;
+        default:
+          return true;
+      }
+    }
+    switch (field) {
+      case REGISTER_NEW_EMAIL:
+        return authConfig.isAllowRegisterNewEmail();
+      case FULL_NAME:
+      case USER_NAME:
+      default:
+        return true;
+    }
+  }
+
+  @Override
+  public AuthRequest authenticate(AuthRequest who) {
+    if (who.getEmailAddress() == null
+        && who.getLocalUser() != null
+        && emailExpander.canExpand(who.getLocalUser())) {
+      who.setEmailAddress(emailExpander.expand(who.getLocalUser()));
+    }
+    return who;
+  }
+
+  @Override
+  public void onCreateAccount(AuthRequest who, Account account) {}
+
+  @Override
+  public Account.Id lookup(String accountName) throws IOException {
+    if (emailExpander.canExpand(accountName)) {
+      try {
+        Set<Account.Id> c = emails.get().getAccountFor(emailExpander.expand(accountName));
+        if (1 == c.size()) {
+          return c.iterator().next();
+        }
+      } catch (OrmException e) {
+        throw new IOException("Failed to query accounts by email", e);
+      }
+    }
+    return null;
+  }
+}
diff --git a/java/com/google/gerrit/server/account/DestinationList.java b/java/com/google/gerrit/server/account/DestinationList.java
new file mode 100644
index 0000000..04e710a
--- /dev/null
+++ b/java/com/google/gerrit/server/account/DestinationList.java
@@ -0,0 +1,61 @@
+// Copyright (C) 2015 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.google.gerrit.server.account;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.collect.SetMultimap;
+import com.google.common.collect.Sets;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.git.ValidationError;
+import com.google.gerrit.server.git.meta.TabFile;
+import java.io.IOException;
+import java.util.List;
+import java.util.Set;
+
+public class DestinationList extends TabFile {
+  public static final String DIR_NAME = "destinations";
+  private SetMultimap<String, Branch.NameKey> destinations =
+      MultimapBuilder.hashKeys().hashSetValues().build();
+
+  public Set<Branch.NameKey> getDestinations(String label) {
+    return destinations.get(label);
+  }
+
+  void parseLabel(String label, String text, ValidationError.Sink errors) throws IOException {
+    destinations.replaceValues(label, toSet(parse(text, DIR_NAME + label, TRIM, null, errors)));
+  }
+
+  String asText(String label) {
+    Set<Branch.NameKey> dests = destinations.get(label);
+    if (dests == null) {
+      return null;
+    }
+    List<Row> rows = Lists.newArrayListWithCapacity(dests.size());
+    for (Branch.NameKey dest : sort(dests)) {
+      rows.add(new Row(dest.get(), dest.getParentKey().get()));
+    }
+    return asText("Ref", "Project", rows);
+  }
+
+  private static Set<Branch.NameKey> toSet(List<Row> destRows) {
+    Set<Branch.NameKey> dests = Sets.newHashSetWithExpectedSize(destRows.size());
+    for (Row row : destRows) {
+      dests.add(new Branch.NameKey(new Project.NameKey(row.right), row.left));
+    }
+    return dests;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/EmailExpander.java b/java/com/google/gerrit/server/account/EmailExpander.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/account/EmailExpander.java
rename to java/com/google/gerrit/server/account/EmailExpander.java
diff --git a/java/com/google/gerrit/server/account/Emails.java b/java/com/google/gerrit/server/account/Emails.java
new file mode 100644
index 0000000..7c798ca
--- /dev/null
+++ b/java/com/google/gerrit/server/account/Emails.java
@@ -0,0 +1,114 @@
+// Copyright (C) 2017 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.google.gerrit.server.account;
+
+import static com.google.common.collect.ImmutableSet.toImmutableSet;
+
+import com.google.common.base.Throwables;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableSetMultimap;
+import com.google.common.collect.Streams;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.account.externalids.ExternalIds;
+import com.google.gerrit.server.query.account.InternalAccountQuery;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryHelper.Action;
+import com.google.gerrit.server.update.RetryHelper.ActionType;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+
+/** Class to access accounts by email. */
+@Singleton
+public class Emails {
+  private final ExternalIds externalIds;
+  private final Provider<InternalAccountQuery> queryProvider;
+  private final RetryHelper retryHelper;
+
+  @Inject
+  public Emails(
+      ExternalIds externalIds,
+      Provider<InternalAccountQuery> queryProvider,
+      RetryHelper retryHelper) {
+    this.externalIds = externalIds;
+    this.queryProvider = queryProvider;
+    this.retryHelper = retryHelper;
+  }
+
+  /**
+   * Returns the accounts with the given email.
+   *
+   * <p>Each email should belong to a single account only. This means if more than one account is
+   * returned there is an inconsistency in the external IDs.
+   *
+   * <p>The accounts are retrieved via the external ID cache. Each access to the external ID cache
+   * requires reading the SHA1 of the refs/meta/external-ids branch. If accounts for multiple emails
+   * are needed it is more efficient to use {@link #getAccountsFor(String...)} as this method reads
+   * the SHA1 of the refs/meta/external-ids branch only once (and not once per email).
+   *
+   * <p>In addition accounts are included that have the given email as preferred email even if they
+   * have no external ID for the preferred email. Having accounts with a preferred email that does
+   * not exist as external ID is an inconsistency, but existing functionality relies on still
+   * getting those accounts, which is why they are included. Accounts by preferred email are fetched
+   * from the account index.
+   *
+   * @see #getAccountsFor(String...)
+   */
+  public ImmutableSet<Account.Id> getAccountFor(String email) throws IOException, OrmException {
+    return Streams.concat(
+            externalIds.byEmail(email).stream().map(ExternalId::accountId),
+            executeIndexQuery(() -> queryProvider.get().byPreferredEmail(email).stream())
+                .map(a -> a.getAccount().getId()))
+        .collect(toImmutableSet());
+  }
+
+  /**
+   * Returns the accounts for the given emails.
+   *
+   * @see #getAccountFor(String)
+   */
+  public ImmutableSetMultimap<String, Account.Id> getAccountsFor(String... emails)
+      throws IOException, OrmException {
+    ImmutableSetMultimap.Builder<String, Account.Id> builder = ImmutableSetMultimap.builder();
+    externalIds.byEmails(emails).entries().stream()
+        .forEach(e -> builder.put(e.getKey(), e.getValue().accountId()));
+    executeIndexQuery(() -> queryProvider.get().byPreferredEmail(emails).entries().stream())
+        .forEach(e -> builder.put(e.getKey(), e.getValue().getAccount().getId()));
+    return builder.build();
+  }
+
+  /**
+   * Returns the accounts with the given email.
+   *
+   * <p>This method behaves just like {@link #getAccountFor(String)}, except that accounts are not
+   * looked up by their preferred email. Thus, this method does not rely on the accounts index.
+   */
+  public ImmutableSet<Account.Id> getAccountForExternal(String email) throws IOException {
+    return externalIds.byEmail(email).stream().map(ExternalId::accountId).collect(toImmutableSet());
+  }
+
+  private <T> T executeIndexQuery(Action<T> action) throws OrmException {
+    try {
+      return retryHelper.execute(ActionType.INDEX_QUERY, action, OrmException.class::isInstance);
+    } catch (Exception e) {
+      Throwables.throwIfUnchecked(e);
+      Throwables.throwIfInstanceOf(e, OrmException.class);
+      throw new OrmException(e);
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/FakeRealm.java b/java/com/google/gerrit/server/account/FakeRealm.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/account/FakeRealm.java
rename to java/com/google/gerrit/server/account/FakeRealm.java
diff --git a/java/com/google/gerrit/server/account/GpgApiAdapter.java b/java/com/google/gerrit/server/account/GpgApiAdapter.java
new file mode 100644
index 0000000..b060140
--- /dev/null
+++ b/java/com/google/gerrit/server/account/GpgApiAdapter.java
@@ -0,0 +1,40 @@
+// Copyright (C) 2015 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.google.gerrit.server.account;
+
+import com.google.gerrit.extensions.api.accounts.GpgKeyApi;
+import com.google.gerrit.extensions.common.GpgKeyInfo;
+import com.google.gerrit.extensions.common.PushCertificateInfo;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.server.GpgException;
+import com.google.gerrit.server.IdentifiedUser;
+import java.util.List;
+import java.util.Map;
+
+public interface GpgApiAdapter {
+  boolean isEnabled();
+
+  Map<String, GpgKeyInfo> listGpgKeys(AccountResource account)
+      throws RestApiException, GpgException;
+
+  Map<String, GpgKeyInfo> putGpgKeys(AccountResource account, List<String> add, List<String> delete)
+      throws RestApiException, GpgException;
+
+  GpgKeyApi gpgKey(AccountResource account, IdString idStr) throws RestApiException, GpgException;
+
+  PushCertificateInfo checkPushCertificate(String certStr, IdentifiedUser expectedUser)
+      throws GpgException;
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupBackend.java b/java/com/google/gerrit/server/account/GroupBackend.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/account/GroupBackend.java
rename to java/com/google/gerrit/server/account/GroupBackend.java
diff --git a/java/com/google/gerrit/server/account/GroupBackends.java b/java/com/google/gerrit/server/account/GroupBackends.java
new file mode 100644
index 0000000..1b15512
--- /dev/null
+++ b/java/com/google/gerrit/server/account/GroupBackends.java
@@ -0,0 +1,110 @@
+// Copyright (C) 2012 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.google.gerrit.server.account;
+
+import static java.util.Comparator.comparing;
+
+import com.google.common.collect.Iterables;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.server.project.ProjectState;
+import java.util.Collection;
+import java.util.Comparator;
+
+/** Utility class for dealing with a GroupBackend. */
+public class GroupBackends {
+
+  public static final Comparator<GroupReference> GROUP_REF_NAME_COMPARATOR =
+      comparing(GroupReference::getName);
+
+  /**
+   * Runs {@link GroupBackend#suggest(String, ProjectState)} and filters the result to return the
+   * best suggestion, or null if one does not exist.
+   *
+   * @param groupBackend the group backend
+   * @param name the name for which to suggest groups
+   * @return the best single GroupReference suggestion
+   */
+  @Nullable
+  public static GroupReference findBestSuggestion(GroupBackend groupBackend, String name) {
+    return findBestSuggestion(groupBackend, name, null);
+  }
+
+  /**
+   * Runs {@link GroupBackend#suggest(String, ProjectState)} and filters the result to return the
+   * best suggestion, or null if one does not exist.
+   *
+   * @param groupBackend the group backend
+   * @param name the name for which to suggest groups
+   * @param project the project for which to suggest groups
+   * @return the best single GroupReference suggestion
+   */
+  @Nullable
+  public static GroupReference findBestSuggestion(
+      GroupBackend groupBackend, String name, @Nullable ProjectState project) {
+    Collection<GroupReference> refs = groupBackend.suggest(name, project);
+    if (refs.size() == 1) {
+      return Iterables.getOnlyElement(refs);
+    }
+
+    for (GroupReference ref : refs) {
+      if (isExactSuggestion(ref, name)) {
+        return ref;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Runs {@link GroupBackend#suggest(String, ProjectState)} and filters the result to return the
+   * exact suggestion, or null if one does not exist.
+   *
+   * @param groupBackend the group backend
+   * @param name the name for which to suggest groups
+   * @return the exact single GroupReference suggestion
+   */
+  @Nullable
+  public static GroupReference findExactSuggestion(GroupBackend groupBackend, String name) {
+    return findExactSuggestion(groupBackend, name, null);
+  }
+
+  /**
+   * Runs {@link GroupBackend#suggest(String, ProjectState)} and filters the result to return the
+   * exact suggestion, or null if one does not exist.
+   *
+   * @param groupBackend the group backend
+   * @param name the name for which to suggest groups
+   * @param project the project for which to suggest groups
+   * @return the exact single GroupReference suggestion
+   */
+  @Nullable
+  public static GroupReference findExactSuggestion(
+      GroupBackend groupBackend, String name, ProjectState project) {
+    Collection<GroupReference> refs = groupBackend.suggest(name, project);
+    for (GroupReference ref : refs) {
+      if (isExactSuggestion(ref, name)) {
+        return ref;
+      }
+    }
+    return null;
+  }
+
+  /** Returns whether the GroupReference is an exact suggestion for the name. */
+  public static boolean isExactSuggestion(GroupReference ref, String name) {
+    return ref.getName().equalsIgnoreCase(name) || ref.getUUID().get().equals(name);
+  }
+
+  private GroupBackends() {}
+}
diff --git a/java/com/google/gerrit/server/account/GroupCache.java b/java/com/google/gerrit/server/account/GroupCache.java
new file mode 100644
index 0000000..8133d9c
--- /dev/null
+++ b/java/com/google/gerrit/server/account/GroupCache.java
@@ -0,0 +1,91 @@
+// Copyright (C) 2009 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.google.gerrit.server.account;
+
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.group.InternalGroup;
+import java.util.Optional;
+
+/** Tracks group objects in memory for efficient access. */
+public interface GroupCache {
+  /**
+   * Looks up an internal group by its ID.
+   *
+   * @param groupId the ID of the internal group
+   * @return an {@code Optional} of the internal group, or an empty {@code Optional} if no internal
+   *     group with this ID exists on this server or an error occurred during lookup
+   */
+  Optional<InternalGroup> get(AccountGroup.Id groupId);
+
+  /**
+   * Looks up an internal group by its name.
+   *
+   * @param name the name of the internal group
+   * @return an {@code Optional} of the internal group, or an empty {@code Optional} if no internal
+   *     group with this name exists on this server or an error occurred during lookup
+   */
+  Optional<InternalGroup> get(AccountGroup.NameKey name);
+
+  /**
+   * Looks up an internal group by its UUID.
+   *
+   * @param groupUuid the UUID of the internal group
+   * @return an {@code Optional} of the internal group, or an empty {@code Optional} if no internal
+   *     group with this UUID exists on this server or an error occurred during lookup
+   */
+  Optional<InternalGroup> get(AccountGroup.UUID groupUuid);
+
+  /**
+   * Removes the association of the given ID with a group.
+   *
+   * <p>The next call to {@link #get(AccountGroup.Id)} won't provide a cached value.
+   *
+   * <p>It's safe to call this method if no association exists.
+   *
+   * <p><strong>Note: </strong>This method doesn't touch any associations between names/UUIDs and
+   * groups!
+   *
+   * @param groupId the ID of a possibly associated group
+   */
+  void evict(AccountGroup.Id groupId);
+
+  /**
+   * Removes the association of the given name with a group.
+   *
+   * <p>The next call to {@link #get(AccountGroup.NameKey)} won't provide a cached value.
+   *
+   * <p>It's safe to call this method if no association exists.
+   *
+   * <p><strong>Note: </strong>This method doesn't touch any associations between IDs/UUIDs and
+   * groups!
+   *
+   * @param groupName the name of a possibly associated group
+   */
+  void evict(AccountGroup.NameKey groupName);
+
+  /**
+   * Removes the association of the given UUID with a group.
+   *
+   * <p>The next call to {@link #get(AccountGroup.UUID)} won't provide a cached value.
+   *
+   * <p>It's safe to call this method if no association exists.
+   *
+   * <p><strong>Note: </strong>This method doesn't touch any associations between names/IDs and
+   * groups!
+   *
+   * @param groupUuid the UUID of a possibly associated group
+   */
+  void evict(AccountGroup.UUID groupUuid);
+}
diff --git a/java/com/google/gerrit/server/account/GroupCacheImpl.java b/java/com/google/gerrit/server/account/GroupCacheImpl.java
new file mode 100644
index 0000000..c85e2df
--- /dev/null
+++ b/java/com/google/gerrit/server/account/GroupCacheImpl.java
@@ -0,0 +1,189 @@
+// Copyright (C) 2009 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.google.gerrit.server.account;
+
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.cache.CacheModule;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.group.db.Groups;
+import com.google.gerrit.server.logging.TraceContext;
+import com.google.gerrit.server.logging.TraceContext.TraceTimer;
+import com.google.gerrit.server.query.group.InternalGroupQuery;
+import com.google.inject.Inject;
+import com.google.inject.Module;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import com.google.inject.TypeLiteral;
+import com.google.inject.name.Named;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
+
+/** Tracks group objects in memory for efficient access. */
+@Singleton
+public class GroupCacheImpl implements GroupCache {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final String BYID_NAME = "groups";
+  private static final String BYNAME_NAME = "groups_byname";
+  private static final String BYUUID_NAME = "groups_byuuid";
+
+  public static Module module() {
+    return new CacheModule() {
+      @Override
+      protected void configure() {
+        cache(BYID_NAME, AccountGroup.Id.class, new TypeLiteral<Optional<InternalGroup>>() {})
+            .maximumWeight(Long.MAX_VALUE)
+            .loader(ByIdLoader.class);
+
+        cache(BYNAME_NAME, String.class, new TypeLiteral<Optional<InternalGroup>>() {})
+            .maximumWeight(Long.MAX_VALUE)
+            .loader(ByNameLoader.class);
+
+        cache(BYUUID_NAME, String.class, new TypeLiteral<Optional<InternalGroup>>() {})
+            .maximumWeight(Long.MAX_VALUE)
+            .loader(ByUUIDLoader.class);
+
+        bind(GroupCacheImpl.class);
+        bind(GroupCache.class).to(GroupCacheImpl.class);
+      }
+    };
+  }
+
+  private final LoadingCache<AccountGroup.Id, Optional<InternalGroup>> byId;
+  private final LoadingCache<String, Optional<InternalGroup>> byName;
+  private final LoadingCache<String, Optional<InternalGroup>> byUUID;
+
+  @Inject
+  GroupCacheImpl(
+      @Named(BYID_NAME) LoadingCache<AccountGroup.Id, Optional<InternalGroup>> byId,
+      @Named(BYNAME_NAME) LoadingCache<String, Optional<InternalGroup>> byName,
+      @Named(BYUUID_NAME) LoadingCache<String, Optional<InternalGroup>> byUUID) {
+    this.byId = byId;
+    this.byName = byName;
+    this.byUUID = byUUID;
+  }
+
+  @Override
+  public Optional<InternalGroup> get(AccountGroup.Id groupId) {
+    try {
+      return byId.get(groupId);
+    } catch (ExecutionException e) {
+      logger.atWarning().withCause(e).log("Cannot load group %s", groupId);
+      return Optional.empty();
+    }
+  }
+
+  @Override
+  public Optional<InternalGroup> get(AccountGroup.NameKey name) {
+    if (name == null) {
+      return Optional.empty();
+    }
+    try {
+      return byName.get(name.get());
+    } catch (ExecutionException e) {
+      logger.atWarning().withCause(e).log("Cannot look up group %s by name", name.get());
+      return Optional.empty();
+    }
+  }
+
+  @Override
+  public Optional<InternalGroup> get(AccountGroup.UUID groupUuid) {
+    if (groupUuid == null) {
+      return Optional.empty();
+    }
+
+    try {
+      return byUUID.get(groupUuid.get());
+    } catch (ExecutionException e) {
+      logger.atWarning().withCause(e).log("Cannot look up group %s by uuid", groupUuid.get());
+      return Optional.empty();
+    }
+  }
+
+  @Override
+  public void evict(AccountGroup.Id groupId) {
+    if (groupId != null) {
+      logger.atFine().log("Evict group %s by ID", groupId.get());
+      byId.invalidate(groupId);
+    }
+  }
+
+  @Override
+  public void evict(AccountGroup.NameKey groupName) {
+    if (groupName != null) {
+      logger.atFine().log("Evict group '%s' by name", groupName.get());
+      byName.invalidate(groupName.get());
+    }
+  }
+
+  @Override
+  public void evict(AccountGroup.UUID groupUuid) {
+    if (groupUuid != null) {
+      logger.atFine().log("Evict group %s by UUID", groupUuid.get());
+      byUUID.invalidate(groupUuid.get());
+    }
+  }
+
+  static class ByIdLoader extends CacheLoader<AccountGroup.Id, Optional<InternalGroup>> {
+    private final Provider<InternalGroupQuery> groupQueryProvider;
+
+    @Inject
+    ByIdLoader(Provider<InternalGroupQuery> groupQueryProvider) {
+      this.groupQueryProvider = groupQueryProvider;
+    }
+
+    @Override
+    public Optional<InternalGroup> load(AccountGroup.Id key) throws Exception {
+      try (TraceTimer timer = TraceContext.newTimer("Loading group %s by ID", key)) {
+        return groupQueryProvider.get().byId(key);
+      }
+    }
+  }
+
+  static class ByNameLoader extends CacheLoader<String, Optional<InternalGroup>> {
+    private final Provider<InternalGroupQuery> groupQueryProvider;
+
+    @Inject
+    ByNameLoader(Provider<InternalGroupQuery> groupQueryProvider) {
+      this.groupQueryProvider = groupQueryProvider;
+    }
+
+    @Override
+    public Optional<InternalGroup> load(String name) throws Exception {
+      try (TraceTimer timer = TraceContext.newTimer("Loading group '%s' by name", name)) {
+        return groupQueryProvider.get().byName(new AccountGroup.NameKey(name));
+      }
+    }
+  }
+
+  static class ByUUIDLoader extends CacheLoader<String, Optional<InternalGroup>> {
+    private final Groups groups;
+
+    @Inject
+    ByUUIDLoader(Groups groups) {
+      this.groups = groups;
+    }
+
+    @Override
+    public Optional<InternalGroup> load(String uuid) throws Exception {
+      try (TraceTimer timer = TraceContext.newTimer("Loading group %s by UUID", uuid)) {
+        return groups.getGroup(new AccountGroup.UUID(uuid));
+      }
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/account/GroupControl.java b/java/com/google/gerrit/server/account/GroupControl.java
new file mode 100644
index 0000000..5649629
--- /dev/null
+++ b/java/com/google/gerrit/server/account/GroupControl.java
@@ -0,0 +1,182 @@
+// Copyright (C) 2009 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.google.gerrit.server.account;
+
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.common.errors.NoSuchGroupException;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+/** Access control management for a group of accounts managed in Gerrit. */
+public class GroupControl {
+
+  @Singleton
+  public static class GenericFactory {
+    private final PermissionBackend permissionBackend;
+    private final GroupBackend groupBackend;
+
+    @Inject
+    GenericFactory(PermissionBackend permissionBackend, GroupBackend gb) {
+      this.permissionBackend = permissionBackend;
+      groupBackend = gb;
+    }
+
+    public GroupControl controlFor(CurrentUser who, AccountGroup.UUID groupId)
+        throws NoSuchGroupException {
+      GroupDescription.Basic group = groupBackend.get(groupId);
+      if (group == null) {
+        throw new NoSuchGroupException(groupId);
+      }
+      return new GroupControl(who, group, permissionBackend, groupBackend);
+    }
+  }
+
+  public static class Factory {
+    private final PermissionBackend permissionBackend;
+    private final Provider<CurrentUser> user;
+    private final GroupBackend groupBackend;
+
+    @Inject
+    Factory(PermissionBackend permissionBackend, Provider<CurrentUser> cu, GroupBackend gb) {
+      this.permissionBackend = permissionBackend;
+      user = cu;
+      groupBackend = gb;
+    }
+
+    public GroupControl controlFor(AccountGroup.UUID groupId) throws NoSuchGroupException {
+      final GroupDescription.Basic group = groupBackend.get(groupId);
+      if (group == null) {
+        throw new NoSuchGroupException(groupId);
+      }
+      return controlFor(group);
+    }
+
+    public GroupControl controlFor(GroupDescription.Basic group) {
+      return new GroupControl(user.get(), group, permissionBackend, groupBackend);
+    }
+
+    public GroupControl validateFor(AccountGroup.UUID groupUUID) throws NoSuchGroupException {
+      final GroupControl c = controlFor(groupUUID);
+      if (!c.isVisible()) {
+        throw new NoSuchGroupException(groupUUID);
+      }
+      return c;
+    }
+  }
+
+  private final CurrentUser user;
+  private final GroupDescription.Basic group;
+  private Boolean isOwner;
+  private final PermissionBackend.WithUser perm;
+  private final GroupBackend groupBackend;
+
+  GroupControl(
+      CurrentUser who,
+      GroupDescription.Basic gd,
+      PermissionBackend permissionBackend,
+      GroupBackend gb) {
+    user = who;
+    group = gd;
+    this.perm = permissionBackend.user(user);
+    groupBackend = gb;
+  }
+
+  public GroupDescription.Basic getGroup() {
+    return group;
+  }
+
+  public CurrentUser getUser() {
+    return user;
+  }
+
+  /** Can this user see this group exists? */
+  public boolean isVisible() {
+    /* Check for canAdministrateServer may seem redundant, but allows
+     * for visibility of all groups that are not an internal group to
+     * server administrators.
+     */
+    return user.isInternalUser()
+        || groupBackend.isVisibleToAll(group.getGroupUUID())
+        || user.getEffectiveGroups().contains(group.getGroupUUID())
+        || isOwner()
+        || canAdministrateServer();
+  }
+
+  public boolean isOwner() {
+    if (isOwner != null) {
+      return isOwner;
+    }
+
+    // Keep this logic in sync with VisibleRefFilter#isOwner(...).
+    if (group instanceof GroupDescription.Internal) {
+      AccountGroup.UUID ownerUUID = ((GroupDescription.Internal) group).getOwnerGroupUUID();
+      isOwner = getUser().getEffectiveGroups().contains(ownerUUID) || canAdministrateServer();
+    } else {
+      isOwner = false;
+    }
+    return isOwner;
+  }
+
+  private boolean canAdministrateServer() {
+    try {
+      perm.check(GlobalPermission.ADMINISTRATE_SERVER);
+      return true;
+    } catch (AuthException | PermissionBackendException denied) {
+      return false;
+    }
+  }
+
+  public boolean canAddMember() {
+    return isOwner();
+  }
+
+  public boolean canRemoveMember() {
+    return isOwner();
+  }
+
+  public boolean canSeeMember(Account.Id id) {
+    if (user.isIdentifiedUser() && user.getAccountId().equals(id)) {
+      return true;
+    }
+    return canSeeMembers();
+  }
+
+  public boolean canAddGroup() {
+    return isOwner();
+  }
+
+  public boolean canRemoveGroup() {
+    return isOwner();
+  }
+
+  public boolean canSeeGroup() {
+    return canSeeMembers();
+  }
+
+  private boolean canSeeMembers() {
+    if (group instanceof GroupDescription.Internal) {
+      return ((GroupDescription.Internal) group).isVisibleToAll() || isOwner();
+    }
+    return canAdministrateServer();
+  }
+}
diff --git a/java/com/google/gerrit/server/account/GroupIncludeCache.java b/java/com/google/gerrit/server/account/GroupIncludeCache.java
new file mode 100644
index 0000000..612730b
--- /dev/null
+++ b/java/com/google/gerrit/server/account/GroupIncludeCache.java
@@ -0,0 +1,46 @@
+// Copyright (C) 2011 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.google.gerrit.server.account;
+
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import java.util.Collection;
+
+/** Tracks group inclusions in memory for efficient access. */
+public interface GroupIncludeCache {
+
+  /**
+   * Returns the UUIDs of all groups of which the specified account is a direct member.
+   *
+   * @param memberId the ID of the account
+   * @return the UUIDs of all groups having the account as member
+   */
+  Collection<AccountGroup.UUID> getGroupsWithMember(Account.Id memberId);
+
+  /**
+   * Returns the parent groups of a subgroup.
+   *
+   * @param groupId the UUID of the subgroup
+   * @return the UUIDs of all direct parent groups
+   */
+  Collection<AccountGroup.UUID> parentGroupsOf(AccountGroup.UUID groupId);
+
+  /** @return set of any UUIDs that are not internal groups. */
+  Collection<AccountGroup.UUID> allExternalMembers();
+
+  void evictGroupsWithMember(Account.Id memberId);
+
+  void evictParentGroupsOf(AccountGroup.UUID groupId);
+}
diff --git a/java/com/google/gerrit/server/account/GroupIncludeCacheImpl.java b/java/com/google/gerrit/server/account/GroupIncludeCacheImpl.java
new file mode 100644
index 0000000..a089d9e
--- /dev/null
+++ b/java/com/google/gerrit/server/account/GroupIncludeCacheImpl.java
@@ -0,0 +1,198 @@
+// Copyright (C) 2011 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.google.gerrit.server.account;
+
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static com.google.common.collect.ImmutableSet.toImmutableSet;
+
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.cache.CacheModule;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.group.db.Groups;
+import com.google.gerrit.server.logging.TraceContext;
+import com.google.gerrit.server.logging.TraceContext.TraceTimer;
+import com.google.gerrit.server.query.group.InternalGroupQuery;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Module;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import com.google.inject.TypeLiteral;
+import com.google.inject.name.Named;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.concurrent.ExecutionException;
+
+/** Tracks group inclusions in memory for efficient access. */
+@Singleton
+public class GroupIncludeCacheImpl implements GroupIncludeCache {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final String PARENT_GROUPS_NAME = "groups_bysubgroup";
+  private static final String GROUPS_WITH_MEMBER_NAME = "groups_bymember";
+  private static final String EXTERNAL_NAME = "groups_external";
+
+  public static Module module() {
+    return new CacheModule() {
+      @Override
+      protected void configure() {
+        cache(
+                GROUPS_WITH_MEMBER_NAME,
+                Account.Id.class,
+                new TypeLiteral<ImmutableSet<AccountGroup.UUID>>() {})
+            .loader(GroupsWithMemberLoader.class);
+
+        cache(
+                PARENT_GROUPS_NAME,
+                AccountGroup.UUID.class,
+                new TypeLiteral<ImmutableList<AccountGroup.UUID>>() {})
+            .loader(ParentGroupsLoader.class);
+
+        cache(EXTERNAL_NAME, String.class, new TypeLiteral<ImmutableList<AccountGroup.UUID>>() {})
+            .loader(AllExternalLoader.class);
+
+        bind(GroupIncludeCacheImpl.class);
+        bind(GroupIncludeCache.class).to(GroupIncludeCacheImpl.class);
+      }
+    };
+  }
+
+  private final LoadingCache<Account.Id, ImmutableSet<AccountGroup.UUID>> groupsWithMember;
+  private final LoadingCache<AccountGroup.UUID, ImmutableList<AccountGroup.UUID>> parentGroups;
+  private final LoadingCache<String, ImmutableList<AccountGroup.UUID>> external;
+
+  @Inject
+  GroupIncludeCacheImpl(
+      @Named(GROUPS_WITH_MEMBER_NAME)
+          LoadingCache<Account.Id, ImmutableSet<AccountGroup.UUID>> groupsWithMember,
+      @Named(PARENT_GROUPS_NAME)
+          LoadingCache<AccountGroup.UUID, ImmutableList<AccountGroup.UUID>> parentGroups,
+      @Named(EXTERNAL_NAME) LoadingCache<String, ImmutableList<AccountGroup.UUID>> external) {
+    this.groupsWithMember = groupsWithMember;
+    this.parentGroups = parentGroups;
+    this.external = external;
+  }
+
+  @Override
+  public Collection<AccountGroup.UUID> getGroupsWithMember(Account.Id memberId) {
+    try {
+      return groupsWithMember.get(memberId);
+    } catch (ExecutionException e) {
+      logger.atWarning().withCause(e).log("Cannot load groups containing %s as member", memberId);
+      return ImmutableSet.of();
+    }
+  }
+
+  @Override
+  public Collection<AccountGroup.UUID> parentGroupsOf(AccountGroup.UUID groupId) {
+    try {
+      return parentGroups.get(groupId);
+    } catch (ExecutionException e) {
+      logger.atWarning().withCause(e).log("Cannot load included groups");
+      return Collections.emptySet();
+    }
+  }
+
+  @Override
+  public void evictGroupsWithMember(Account.Id memberId) {
+    if (memberId != null) {
+      logger.atFine().log("Evict groups with member %d", memberId.get());
+      groupsWithMember.invalidate(memberId);
+    }
+  }
+
+  @Override
+  public void evictParentGroupsOf(AccountGroup.UUID groupId) {
+    if (groupId != null) {
+      logger.atFine().log("Evict parent groups of %s", groupId.get());
+      parentGroups.invalidate(groupId);
+
+      if (!AccountGroup.isInternalGroup(groupId)) {
+        logger.atFine().log("Evict external group %s", groupId.get());
+        external.invalidate(EXTERNAL_NAME);
+      }
+    }
+  }
+
+  @Override
+  public Collection<AccountGroup.UUID> allExternalMembers() {
+    try {
+      return external.get(EXTERNAL_NAME);
+    } catch (ExecutionException e) {
+      logger.atWarning().withCause(e).log("Cannot load set of non-internal groups");
+      return ImmutableList.of();
+    }
+  }
+
+  static class GroupsWithMemberLoader
+      extends CacheLoader<Account.Id, ImmutableSet<AccountGroup.UUID>> {
+    private final Provider<InternalGroupQuery> groupQueryProvider;
+
+    @Inject
+    GroupsWithMemberLoader(Provider<InternalGroupQuery> groupQueryProvider) {
+      this.groupQueryProvider = groupQueryProvider;
+    }
+
+    @Override
+    public ImmutableSet<AccountGroup.UUID> load(Account.Id memberId) throws OrmException {
+      try (TraceTimer timer = TraceContext.newTimer("Loading groups with member %s", memberId)) {
+        return groupQueryProvider.get().byMember(memberId).stream()
+            .map(InternalGroup::getGroupUUID)
+            .collect(toImmutableSet());
+      }
+    }
+  }
+
+  static class ParentGroupsLoader
+      extends CacheLoader<AccountGroup.UUID, ImmutableList<AccountGroup.UUID>> {
+    private final Provider<InternalGroupQuery> groupQueryProvider;
+
+    @Inject
+    ParentGroupsLoader(Provider<InternalGroupQuery> groupQueryProvider) {
+      this.groupQueryProvider = groupQueryProvider;
+    }
+
+    @Override
+    public ImmutableList<AccountGroup.UUID> load(AccountGroup.UUID key) throws OrmException {
+      try (TraceTimer timer = TraceContext.newTimer("Loading parent groups of %s", key)) {
+        return groupQueryProvider.get().bySubgroup(key).stream()
+            .map(InternalGroup::getGroupUUID)
+            .collect(toImmutableList());
+      }
+    }
+  }
+
+  static class AllExternalLoader extends CacheLoader<String, ImmutableList<AccountGroup.UUID>> {
+    private final Groups groups;
+
+    @Inject
+    AllExternalLoader(Groups groups) {
+      this.groups = groups;
+    }
+
+    @Override
+    public ImmutableList<AccountGroup.UUID> load(String key) throws Exception {
+      try (TraceTimer timer = TraceContext.newTimer("Loading all external groups")) {
+        return groups.getExternalGroups().collect(toImmutableList());
+      }
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/account/GroupMembers.java b/java/com/google/gerrit/server/account/GroupMembers.java
new file mode 100644
index 0000000..710f553
--- /dev/null
+++ b/java/com/google/gerrit/server/account/GroupMembers.java
@@ -0,0 +1,148 @@
+// Copyright (C) 2011 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.google.gerrit.server.account;
+
+import static com.google.common.collect.ImmutableSet.toImmutableSet;
+
+import com.google.common.collect.Sets;
+import com.google.common.collect.Streams;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.group.InternalGroupDescription;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gerrit.server.project.NoSuchProjectException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Optional;
+import java.util.Set;
+
+@Singleton
+public class GroupMembers {
+
+  private final GroupCache groupCache;
+  private final GroupControl.Factory groupControlFactory;
+  private final AccountCache accountCache;
+  private final ProjectCache projectCache;
+
+  @Inject
+  GroupMembers(
+      GroupCache groupCache,
+      GroupControl.Factory groupControlFactory,
+      AccountCache accountCache,
+      ProjectCache projectCache) {
+    this.groupCache = groupCache;
+    this.groupControlFactory = groupControlFactory;
+    this.accountCache = accountCache;
+    this.projectCache = projectCache;
+  }
+
+  /**
+   * Recursively enumerate the members of the given group. Should not be used with the
+   * PROJECT_OWNERS magical group.
+   *
+   * <p>Group members for which an account doesn't exist are filtered out.
+   */
+  public Set<Account> listAccounts(AccountGroup.UUID groupUUID) throws IOException {
+    if (SystemGroupBackend.PROJECT_OWNERS.equals(groupUUID)) {
+      throw new IllegalStateException("listAccounts called with PROJECT_OWNERS argument");
+    }
+    try {
+      return listAccounts(groupUUID, null, new HashSet<AccountGroup.UUID>());
+    } catch (NoSuchProjectException e) {
+      throw new IllegalStateException(e);
+    }
+  }
+
+  /**
+   * Recursively enumerate the members of the given group. The project should be specified so the
+   * PROJECT_OWNERS magical group can be expanded.
+   *
+   * <p>Group members for which an account doesn't exist are filtered out.
+   */
+  public Set<Account> listAccounts(AccountGroup.UUID groupUUID, Project.NameKey project)
+      throws NoSuchProjectException, IOException {
+    return listAccounts(groupUUID, project, new HashSet<AccountGroup.UUID>());
+  }
+
+  private Set<Account> listAccounts(
+      final AccountGroup.UUID groupUUID,
+      @Nullable final Project.NameKey project,
+      final Set<AccountGroup.UUID> seen)
+      throws NoSuchProjectException, IOException {
+    if (SystemGroupBackend.PROJECT_OWNERS.equals(groupUUID)) {
+      return getProjectOwners(project, seen);
+    }
+    Optional<InternalGroup> group = groupCache.get(groupUUID);
+    if (group.isPresent()) {
+      return getGroupMembers(group.get(), project, seen);
+    }
+    return Collections.emptySet();
+  }
+
+  private Set<Account> getProjectOwners(final Project.NameKey project, Set<AccountGroup.UUID> seen)
+      throws NoSuchProjectException, IOException {
+    seen.add(SystemGroupBackend.PROJECT_OWNERS);
+    if (project == null) {
+      return Collections.emptySet();
+    }
+
+    ProjectState projectState = projectCache.checkedGet(project);
+    if (projectState == null) {
+      throw new NoSuchProjectException(project);
+    }
+
+    final HashSet<Account> projectOwners = new HashSet<>();
+    for (AccountGroup.UUID ownerGroup : projectState.getAllOwners()) {
+      if (!seen.contains(ownerGroup)) {
+        projectOwners.addAll(listAccounts(ownerGroup, project, seen));
+      }
+    }
+    return projectOwners;
+  }
+
+  private Set<Account> getGroupMembers(
+      InternalGroup group, @Nullable Project.NameKey project, Set<AccountGroup.UUID> seen)
+      throws NoSuchProjectException, IOException {
+    seen.add(group.getGroupUUID());
+    GroupControl groupControl = groupControlFactory.controlFor(new InternalGroupDescription(group));
+
+    Set<Account> directMembers =
+        group.getMembers().stream()
+            .filter(groupControl::canSeeMember)
+            .map(accountCache::get)
+            .flatMap(Streams::stream)
+            .map(AccountState::getAccount)
+            .collect(toImmutableSet());
+
+    Set<Account> indirectMembers = new HashSet<>();
+    if (groupControl.canSeeGroup()) {
+      for (AccountGroup.UUID subgroupUuid : group.getSubgroups()) {
+        if (!seen.contains(subgroupUuid)) {
+          indirectMembers.addAll(listAccounts(subgroupUuid, project, seen));
+        }
+      }
+    }
+
+    return Sets.union(directMembers, indirectMembers);
+  }
+}
diff --git a/java/com/google/gerrit/server/account/GroupMembership.java b/java/com/google/gerrit/server/account/GroupMembership.java
new file mode 100644
index 0000000..cc73222
--- /dev/null
+++ b/java/com/google/gerrit/server/account/GroupMembership.java
@@ -0,0 +1,62 @@
+// Copyright (C) 2012 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.google.gerrit.server.account;
+
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * Represents the set of groups that a single user is part of.
+ *
+ * <p>Different accounts systems (eg. LDAP, gerrit groups) provide concrete implementations.
+ */
+public interface GroupMembership {
+  GroupMembership EMPTY = new ListGroupMembership(Collections.<AccountGroup.UUID>emptySet());
+
+  /**
+   * Returns {@code true} when the user this object was created for is a member of the specified
+   * group.
+   */
+  boolean contains(AccountGroup.UUID groupId);
+
+  /**
+   * Returns {@code true} when the user this object was created for is a member of any of the
+   * specified group.
+   */
+  boolean containsAnyOf(Iterable<AccountGroup.UUID> groupIds);
+
+  /**
+   * Returns a set containing an input member of {@code contains(id)} is true.
+   *
+   * <p>This is batch form of contains that returns specific group information. Implementors may
+   * implement the method as:
+   *
+   * <pre>
+   * Set&lt;AccountGroup.UUID&gt; r = new HashSet&lt;&gt;();
+   * for (AccountGroup.UUID id : groupIds)
+   *   if (contains(id)) r.add(id);
+   * </pre>
+   */
+  Set<AccountGroup.UUID> intersection(Iterable<AccountGroup.UUID> groupIds);
+
+  /**
+   * Returns the set of groups that can be determined by the implementation. This may not return all
+   * groups the {@link #contains(AccountGroup.UUID)} would return {@code true} for, but will at
+   * least contain all top level groups. This restriction stems from the API of some group systems,
+   * which make it expensive to enumerate the members of a group.
+   */
+  Set<AccountGroup.UUID> getKnownGroups();
+}
diff --git a/java/com/google/gerrit/server/account/GroupUUID.java b/java/com/google/gerrit/server/account/GroupUUID.java
new file mode 100644
index 0000000..a7b32a1
--- /dev/null
+++ b/java/com/google/gerrit/server/account/GroupUUID.java
@@ -0,0 +1,33 @@
+// Copyright (C) 2010 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.google.gerrit.server.account;
+
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import java.security.MessageDigest;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.PersonIdent;
+
+public class GroupUUID {
+  public static AccountGroup.UUID make(String groupName, PersonIdent creator) {
+    MessageDigest md = Constants.newMessageDigest();
+    md.update(Constants.encode("group " + groupName + "\n"));
+    md.update(Constants.encode("creator " + creator.toExternalString() + "\n"));
+    md.update(Constants.encode(String.valueOf(Math.random())));
+    return new AccountGroup.UUID(ObjectId.fromRaw(md.digest()).name());
+  }
+
+  private GroupUUID() {}
+}
diff --git a/java/com/google/gerrit/server/account/HashedPassword.java b/java/com/google/gerrit/server/account/HashedPassword.java
new file mode 100644
index 0000000..bffa3ce
--- /dev/null
+++ b/java/com/google/gerrit/server/account/HashedPassword.java
@@ -0,0 +1,119 @@
+// Copyright (C) 2017 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.google.gerrit.server.account;
+
+import static com.google.common.base.Preconditions.checkState;
+
+import com.google.common.base.Splitter;
+import com.google.common.io.BaseEncoding;
+import com.google.common.primitives.Ints;
+import java.nio.charset.StandardCharsets;
+import java.security.SecureRandom;
+import java.util.List;
+import org.apache.commons.codec.DecoderException;
+import org.bouncycastle.crypto.generators.BCrypt;
+import org.bouncycastle.util.Arrays;
+
+/**
+ * Holds logic for salted, hashed passwords. It uses BCrypt from BouncyCastle, which truncates
+ * passwords at 72 bytes.
+ */
+public class HashedPassword {
+  private static final String ALGORITHM_PREFIX = "bcrypt:";
+  private static final SecureRandom secureRandom = new SecureRandom();
+  private static final BaseEncoding codec = BaseEncoding.base64();
+
+  // bcrypt uses 2^cost rounds. Since we use a generated random password, no need
+  // for a high cost.
+  private static final int DEFAULT_COST = 4;
+
+  /**
+   * decodes a hashed password encoded with {@link #encode}.
+   *
+   * @throws DecoderException if input is malformed.
+   */
+  public static HashedPassword decode(String encoded) throws DecoderException {
+    if (!encoded.startsWith(ALGORITHM_PREFIX)) {
+      throw new DecoderException("unrecognized algorithm");
+    }
+
+    List<String> fields = Splitter.on(':').splitToList(encoded);
+    if (fields.size() != 4) {
+      throw new DecoderException("want 4 fields");
+    }
+
+    Integer cost = Ints.tryParse(fields.get(1));
+    if (cost == null) {
+      throw new DecoderException("cost parse failed");
+    }
+
+    if (!(cost >= 4 && cost < 32)) {
+      throw new DecoderException("cost should be 4..31 inclusive, got " + cost);
+    }
+
+    byte[] salt = codec.decode(fields.get(2));
+    if (salt.length != 16) {
+      throw new DecoderException("salt should be 16 bytes, got " + salt.length);
+    }
+    return new HashedPassword(codec.decode(fields.get(3)), salt, cost);
+  }
+
+  private static byte[] hashPassword(String password, byte[] salt, int cost) {
+    byte[] pwBytes = password.getBytes(StandardCharsets.UTF_8);
+
+    return BCrypt.generate(pwBytes, salt, cost);
+  }
+
+  public static HashedPassword fromPassword(String password) {
+    byte[] salt = newSalt();
+
+    return new HashedPassword(hashPassword(password, salt, DEFAULT_COST), salt, DEFAULT_COST);
+  }
+
+  private static byte[] newSalt() {
+    byte[] bytes = new byte[16];
+    secureRandom.nextBytes(bytes);
+    return bytes;
+  }
+
+  private byte[] salt;
+  private byte[] hashed;
+  private int cost;
+
+  private HashedPassword(byte[] hashed, byte[] salt, int cost) {
+    this.salt = salt;
+    this.hashed = hashed;
+    this.cost = cost;
+
+    checkState(cost >= 4 && cost < 32);
+
+    // salt must be 128 bit.
+    checkState(salt.length == 16);
+  }
+
+  /**
+   * Serialize the hashed password and its parameters for persistent storage.
+   *
+   * @return one-line string encoding the hash and salt.
+   */
+  public String encode() {
+    return ALGORITHM_PREFIX + cost + ":" + codec.encode(salt) + ":" + codec.encode(hashed);
+  }
+
+  public boolean checkPassword(String password) {
+    // Constant-time comparison, because we're paranoid.
+    return Arrays.areEqual(hashPassword(password, salt, cost), hashed);
+  }
+}
diff --git a/java/com/google/gerrit/server/account/IncludingGroupMembership.java b/java/com/google/gerrit/server/account/IncludingGroupMembership.java
new file mode 100644
index 0000000..b6969ac
--- /dev/null
+++ b/java/com/google/gerrit/server/account/IncludingGroupMembership.java
@@ -0,0 +1,158 @@
+// Copyright (C) 2012 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.google.gerrit.server.account;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Determines membership in the internal group system for a given user.
+ *
+ * <p>Groups the user is directly a member of are pulled from the in-memory AccountCache by way of
+ * the IdentifiedUser. Transitive group memberhips are resolved on demand starting from the
+ * requested group and looking for a path to a group the user is a member of. Other group backends
+ * are supported by recursively invoking the universal GroupMembership.
+ */
+public class IncludingGroupMembership implements GroupMembership {
+  public interface Factory {
+    IncludingGroupMembership create(IdentifiedUser user);
+  }
+
+  private final GroupCache groupCache;
+  private final GroupIncludeCache includeCache;
+  private final IdentifiedUser user;
+  private final Map<AccountGroup.UUID, Boolean> memberOf;
+  private Set<AccountGroup.UUID> knownGroups;
+
+  @Inject
+  IncludingGroupMembership(
+      GroupCache groupCache, GroupIncludeCache includeCache, @Assisted IdentifiedUser user) {
+    this.groupCache = groupCache;
+    this.includeCache = includeCache;
+    this.user = user;
+    memberOf = new ConcurrentHashMap<>();
+  }
+
+  @Override
+  public boolean contains(AccountGroup.UUID id) {
+    if (id == null) {
+      return false;
+    }
+
+    Boolean b = memberOf.get(id);
+    return b != null ? b : containsAnyOf(ImmutableSet.of(id));
+  }
+
+  @Override
+  public boolean containsAnyOf(Iterable<AccountGroup.UUID> queryIds) {
+    // Prefer lookup of a cached result over expanding includes.
+    boolean tryExpanding = false;
+    for (AccountGroup.UUID id : queryIds) {
+      Boolean b = memberOf.get(id);
+      if (b == null) {
+        tryExpanding = true;
+      } else if (b) {
+        return true;
+      }
+    }
+
+    if (tryExpanding) {
+      for (AccountGroup.UUID id : queryIds) {
+        if (memberOf.containsKey(id)) {
+          // Membership was earlier proven to be false.
+          continue;
+        }
+
+        memberOf.put(id, false);
+        Optional<InternalGroup> group = groupCache.get(id);
+        if (!group.isPresent()) {
+          continue;
+        }
+        if (group.get().getMembers().contains(user.getAccountId())) {
+          memberOf.put(id, true);
+          return true;
+        }
+        if (search(group.get().getSubgroups())) {
+          memberOf.put(id, true);
+          return true;
+        }
+      }
+    }
+
+    return false;
+  }
+
+  @Override
+  public Set<AccountGroup.UUID> intersection(Iterable<AccountGroup.UUID> groupIds) {
+    Set<AccountGroup.UUID> r = new HashSet<>();
+    for (AccountGroup.UUID id : groupIds) {
+      if (contains(id)) {
+        r.add(id);
+      }
+    }
+    return r;
+  }
+
+  private boolean search(Iterable<AccountGroup.UUID> ids) {
+    return user.getEffectiveGroups().containsAnyOf(ids);
+  }
+
+  private ImmutableSet<AccountGroup.UUID> computeKnownGroups() {
+    GroupMembership membership = user.getEffectiveGroups();
+    Collection<AccountGroup.UUID> direct = includeCache.getGroupsWithMember(user.getAccountId());
+    direct.forEach(groupUuid -> memberOf.put(groupUuid, true));
+    Set<AccountGroup.UUID> r = Sets.newHashSet(direct);
+    r.remove(null);
+
+    List<AccountGroup.UUID> q = Lists.newArrayList(r);
+    for (AccountGroup.UUID g : membership.intersection(includeCache.allExternalMembers())) {
+      if (g != null && r.add(g)) {
+        q.add(g);
+      }
+    }
+
+    while (!q.isEmpty()) {
+      AccountGroup.UUID id = q.remove(q.size() - 1);
+      for (AccountGroup.UUID g : includeCache.parentGroupsOf(id)) {
+        if (g != null && r.add(g)) {
+          q.add(g);
+          memberOf.put(g, true);
+        }
+      }
+    }
+    return ImmutableSet.copyOf(r);
+  }
+
+  @Override
+  public Set<AccountGroup.UUID> getKnownGroups() {
+    if (knownGroups == null) {
+      knownGroups = computeKnownGroups();
+    }
+    return knownGroups;
+  }
+}
diff --git a/java/com/google/gerrit/server/account/InternalAccountDirectory.java b/java/com/google/gerrit/server/account/InternalAccountDirectory.java
new file mode 100644
index 0000000..ce97ff9
--- /dev/null
+++ b/java/com/google/gerrit/server/account/InternalAccountDirectory.java
@@ -0,0 +1,190 @@
+// Copyright (C) 2013 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.google.gerrit.server.account;
+
+import static java.util.stream.Collectors.toList;
+import static java.util.stream.Collectors.toSet;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Sets;
+import com.google.common.collect.Streams;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.AvatarInfo;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.avatar.AvatarProvider;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.inject.AbstractModule;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+
+@Singleton
+public class InternalAccountDirectory extends AccountDirectory {
+  static final Set<FillOptions> ID_ONLY = Collections.unmodifiableSet(EnumSet.of(FillOptions.ID));
+
+  public static class Module extends AbstractModule {
+    @Override
+    protected void configure() {
+      bind(AccountDirectory.class).to(InternalAccountDirectory.class);
+    }
+  }
+
+  private final AccountCache accountCache;
+  private final DynamicItem<AvatarProvider> avatar;
+  private final IdentifiedUser.GenericFactory userFactory;
+  private final Provider<CurrentUser> self;
+  private final PermissionBackend permissionBackend;
+
+  @Inject
+  InternalAccountDirectory(
+      AccountCache accountCache,
+      DynamicItem<AvatarProvider> avatar,
+      IdentifiedUser.GenericFactory userFactory,
+      Provider<CurrentUser> self,
+      PermissionBackend permissionBackend) {
+    this.accountCache = accountCache;
+    this.avatar = avatar;
+    this.userFactory = userFactory;
+    this.self = self;
+    this.permissionBackend = permissionBackend;
+  }
+
+  @Override
+  public void fillAccountInfo(Iterable<? extends AccountInfo> in, Set<FillOptions> options)
+      throws PermissionBackendException {
+    if (options.equals(ID_ONLY)) {
+      return;
+    }
+
+    boolean canModifyAccount = false;
+    Account.Id currentUserId = null;
+    if (self.get().isIdentifiedUser()) {
+      currentUserId = self.get().getAccountId();
+
+      try {
+        permissionBackend.currentUser().check(GlobalPermission.MODIFY_ACCOUNT);
+        canModifyAccount = true;
+      } catch (AuthException e) {
+        canModifyAccount = false;
+      }
+    }
+
+    Set<FillOptions> fillOptionsWithoutSecondaryEmails =
+        Sets.difference(options, EnumSet.of(FillOptions.SECONDARY_EMAILS));
+    Set<Account.Id> ids =
+        Streams.stream(in).map(a -> new Account.Id(a._accountId)).collect(toSet());
+    Map<Account.Id, AccountState> accountStates = accountCache.get(ids);
+    for (AccountInfo info : in) {
+      Account.Id id = new Account.Id(info._accountId);
+      AccountState state = accountStates.get(id);
+      if (state != null) {
+        if (!options.contains(FillOptions.SECONDARY_EMAILS)
+            || Objects.equals(currentUserId, state.getAccount().getId())
+            || canModifyAccount) {
+          fill(info, accountStates.get(id), options);
+        } else {
+          // user is not allowed to see secondary emails
+          fill(info, accountStates.get(id), fillOptionsWithoutSecondaryEmails);
+        }
+
+      } else {
+        info._accountId = options.contains(FillOptions.ID) ? id.get() : null;
+      }
+    }
+  }
+
+  private void fill(AccountInfo info, AccountState accountState, Set<FillOptions> options) {
+    Account account = accountState.getAccount();
+    if (options.contains(FillOptions.ID)) {
+      info._accountId = account.getId().get();
+    } else {
+      // Was previously set to look up account for filling.
+      info._accountId = null;
+    }
+    if (options.contains(FillOptions.NAME)) {
+      info.name = Strings.emptyToNull(account.getFullName());
+      if (info.name == null) {
+        info.name = accountState.getUserName().orElse(null);
+      }
+    }
+    if (options.contains(FillOptions.EMAIL)) {
+      info.email = account.getPreferredEmail();
+    }
+    if (options.contains(FillOptions.SECONDARY_EMAILS)) {
+      info.secondaryEmails = getSecondaryEmails(account, accountState.getExternalIds());
+    }
+    if (options.contains(FillOptions.USERNAME)) {
+      info.username = accountState.getUserName().orElse(null);
+    }
+
+    if (options.contains(FillOptions.STATUS)) {
+      info.status = account.getStatus();
+    }
+
+    if (options.contains(FillOptions.AVATARS)) {
+      AvatarProvider ap = avatar.get();
+      if (ap != null) {
+        info.avatars = new ArrayList<>(3);
+        IdentifiedUser user = userFactory.create(account.getId());
+
+        // GWT UI uses DEFAULT_SIZE (26px).
+        addAvatar(ap, info, user, AvatarInfo.DEFAULT_SIZE);
+
+        // PolyGerrit UI prefers 32px and 100px.
+        if (!info.avatars.isEmpty()) {
+          if (32 != AvatarInfo.DEFAULT_SIZE) {
+            addAvatar(ap, info, user, 32);
+          }
+          if (100 != AvatarInfo.DEFAULT_SIZE) {
+            addAvatar(ap, info, user, 100);
+          }
+        }
+      }
+    }
+  }
+
+  public List<String> getSecondaryEmails(Account account, Collection<ExternalId> externalIds) {
+    return ExternalId.getEmails(externalIds)
+        .filter(e -> !e.equals(account.getPreferredEmail()))
+        .sorted()
+        .collect(toList());
+  }
+
+  private static void addAvatar(
+      AvatarProvider provider, AccountInfo account, IdentifiedUser user, int size) {
+    String url = provider.getUrl(user, size);
+    if (url != null) {
+      AvatarInfo avatar = new AvatarInfo();
+      avatar.url = url;
+      avatar.height = size;
+      account.avatars.add(avatar);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/account/InternalAccountUpdate.java b/java/com/google/gerrit/server/account/InternalAccountUpdate.java
new file mode 100644
index 0000000..c778fca
--- /dev/null
+++ b/java/com/google/gerrit/server/account/InternalAccountUpdate.java
@@ -0,0 +1,586 @@
+// Copyright (C) 2017 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 Licens
+
+package com.google.gerrit.server.account;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.extensions.client.DiffPreferencesInfo;
+import com.google.gerrit.extensions.client.EditPreferencesInfo;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gerrit.server.account.ProjectWatches.ProjectWatchKey;
+import com.google.gerrit.server.account.externalids.DuplicateExternalIdKeyException;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+
+/**
+ * Class to prepare updates to an account.
+ *
+ * <p>Account updates are done through {@link AccountsUpdate}. This class should be used to tell
+ * {@link AccountsUpdate} how an account should be modified.
+ *
+ * <p>This class allows to prepare updates of account properties, external IDs, preferences
+ * (general, diff and edit preferences) and project watches. The account ID and the registration
+ * date cannot be updated.
+ *
+ * <p>For the account properties there are getters in this class and the setters in the {@link
+ * Builder} that correspond to the fields in {@link Account}.
+ */
+@AutoValue
+public abstract class InternalAccountUpdate {
+  public static Builder builder() {
+    return new Builder.WrapperThatConvertsNullStringArgsToEmptyStrings(
+        new AutoValue_InternalAccountUpdate.Builder());
+  }
+
+  /**
+   * Returns the new value for the full name.
+   *
+   * @return the new value for the full name, {@code Optional#empty()} if the full name is not being
+   *     updated, {@code Optional#of("")} if the full name is unset, the wrapped value is never
+   *     {@code null}
+   */
+  public abstract Optional<String> getFullName();
+
+  /**
+   * Returns the new value for the preferred email.
+   *
+   * @return the new value for the preferred email, {@code Optional#empty()} if the preferred email
+   *     is not being updated, {@code Optional#of("")} if the preferred email is unset, the wrapped
+   *     value is never {@code null}
+   */
+  public abstract Optional<String> getPreferredEmail();
+
+  /**
+   * Returns the new value for the active flag.
+   *
+   * @return the new value for the active flag, {@code Optional#empty()} if the active flag is not
+   *     being updated, the wrapped value is never {@code null}
+   */
+  public abstract Optional<Boolean> getActive();
+
+  /**
+   * Returns the new value for the status.
+   *
+   * @return the new value for the status, {@code Optional#empty()} if the status is not being
+   *     updated, {@code Optional#of("")} if the status is unset, the wrapped value is never {@code
+   *     null}
+   */
+  public abstract Optional<String> getStatus();
+
+  /**
+   * Returns external IDs that should be newly created for the account.
+   *
+   * @return external IDs that should be newly created for the account
+   */
+  public abstract ImmutableSet<ExternalId> getCreatedExternalIds();
+
+  /**
+   * Returns external IDs that should be updated for the account.
+   *
+   * @return external IDs that should be updated for the account
+   */
+  public abstract ImmutableSet<ExternalId> getUpdatedExternalIds();
+
+  /**
+   * Returns external IDs that should be deleted for the account.
+   *
+   * @return external IDs that should be deleted for the account
+   */
+  public abstract ImmutableSet<ExternalId> getDeletedExternalIds();
+
+  /**
+   * Returns external IDs that should be updated for the account.
+   *
+   * @return external IDs that should be updated for the account
+   */
+  public abstract ImmutableMap<ProjectWatchKey, Set<NotifyType>> getUpdatedProjectWatches();
+
+  /**
+   * Returns project watches that should be deleted for the account.
+   *
+   * @return project watches that should be deleted for the account
+   */
+  public abstract ImmutableSet<ProjectWatchKey> getDeletedProjectWatches();
+
+  /**
+   * Returns the new value for the general preferences.
+   *
+   * <p>Only preferences that are non-null in the returned GeneralPreferencesInfo should be updated.
+   *
+   * @return the new value for the general preferences, {@code Optional#empty()} if the general
+   *     preferences are not being updated, the wrapped value is never {@code null}
+   */
+  public abstract Optional<GeneralPreferencesInfo> getGeneralPreferences();
+
+  /**
+   * Returns the new value for the diff preferences.
+   *
+   * <p>Only preferences that are non-null in the returned DiffPreferencesInfo should be updated.
+   *
+   * @return the new value for the diff preferences, {@code Optional#empty()} if the diff
+   *     preferences are not being updated, the wrapped value is never {@code null}
+   */
+  public abstract Optional<DiffPreferencesInfo> getDiffPreferences();
+
+  /**
+   * Returns the new value for the edit preferences.
+   *
+   * <p>Only preferences that are non-null in the returned DiffPreferencesInfo should be updated.
+   *
+   * @return the new value for the edit preferences, {@code Optional#empty()} if the edit
+   *     preferences are not being updated, the wrapped value is never {@code null}
+   */
+  public abstract Optional<EditPreferencesInfo> getEditPreferences();
+
+  /**
+   * Class to build an account update.
+   *
+   * <p>Account data is only updated if the corresponding setter is invoked. If a setter is not
+   * invoked the corresponding data stays unchanged. To unset string values the setter can be
+   * invoked with either {@code null} or an empty string ({@code null} is converted to an empty
+   * string by using the {@link WrapperThatConvertsNullStringArgsToEmptyStrings} wrapper, see {@link
+   * InternalAccountUpdate#builder()}).
+   */
+  @AutoValue.Builder
+  public abstract static class Builder {
+    /**
+     * Sets a new full name for the account.
+     *
+     * @param fullName the new full name, if {@code null} or empty string the full name is unset
+     * @return the builder
+     */
+    public abstract Builder setFullName(String fullName);
+
+    /**
+     * Sets a new preferred email for the account.
+     *
+     * @param preferredEmail the new preferred email, if {@code null} or empty string the preferred
+     *     email is unset
+     * @return the builder
+     */
+    public abstract Builder setPreferredEmail(String preferredEmail);
+
+    /**
+     * Sets the active flag for the account.
+     *
+     * @param active {@code true} if the account should be set to active, {@code false} if the
+     *     account should be set to inactive
+     * @return the builder
+     */
+    public abstract Builder setActive(boolean active);
+
+    /**
+     * Sets a new status for the account.
+     *
+     * @param status the new status, if {@code null} or empty string the status is unset
+     * @return the builder
+     */
+    public abstract Builder setStatus(String status);
+
+    /**
+     * Returns a builder for the set of created external IDs.
+     *
+     * @return builder for the set of created external IDs.
+     */
+    abstract ImmutableSet.Builder<ExternalId> createdExternalIdsBuilder();
+
+    /**
+     * Adds a new external ID for the account.
+     *
+     * <p>The account ID of the external ID must match the account ID of the account that is
+     * updated.
+     *
+     * <p>If an external ID with the same ID already exists the account update will fail with {@link
+     * DuplicateExternalIdKeyException}.
+     *
+     * @param extId external ID that should be added
+     * @return the builder
+     */
+    public Builder addExternalId(ExternalId extId) {
+      return addExternalIds(ImmutableSet.of(extId));
+    }
+
+    /**
+     * Adds new external IDs for the account.
+     *
+     * <p>The account IDs of the external IDs must match the account ID of the account that is
+     * updated.
+     *
+     * <p>If any of the external ID keys already exists, the insert fails with {@link
+     * DuplicateExternalIdKeyException}.
+     *
+     * @param extIds external IDs that should be added
+     * @return the builder
+     */
+    public Builder addExternalIds(Collection<ExternalId> extIds) {
+      createdExternalIdsBuilder().addAll(extIds);
+      return this;
+    }
+
+    /**
+     * Returns a builder for the set of updated external IDs.
+     *
+     * @return builder for the set of updated external IDs.
+     */
+    abstract ImmutableSet.Builder<ExternalId> updatedExternalIdsBuilder();
+
+    /**
+     * Updates an external ID for the account.
+     *
+     * <p>The account ID of the external ID must match the account ID of the account that is
+     * updated.
+     *
+     * <p>If no external ID with the ID exists the external ID is created.
+     *
+     * @param extId external ID that should be updated
+     * @return the builder
+     */
+    public Builder updateExternalId(ExternalId extId) {
+      return updateExternalIds(ImmutableSet.of(extId));
+    }
+
+    /**
+     * Updates external IDs for the account.
+     *
+     * <p>The account IDs of the external IDs must match the account ID of the account that is
+     * updated.
+     *
+     * <p>If any of the external IDs already exists, it is overwritten. New external IDs are
+     * inserted.
+     *
+     * @param extIds external IDs that should be updated
+     * @return the builder
+     */
+    public Builder updateExternalIds(Collection<ExternalId> extIds) {
+      updatedExternalIdsBuilder().addAll(extIds);
+      return this;
+    }
+
+    /**
+     * Returns a builder for the set of deleted external IDs.
+     *
+     * @return builder for the set of deleted external IDs.
+     */
+    abstract ImmutableSet.Builder<ExternalId> deletedExternalIdsBuilder();
+
+    /**
+     * Deletes an external ID for the account.
+     *
+     * <p>The account ID of the external ID must match the account ID of the account that is
+     * updated.
+     *
+     * <p>If no external ID with the ID exists this is a no-op.
+     *
+     * @param extId external ID that should be deleted
+     * @return the builder
+     */
+    public Builder deleteExternalId(ExternalId extId) {
+      return deleteExternalIds(ImmutableSet.of(extId));
+    }
+
+    /**
+     * Deletes external IDs for the account.
+     *
+     * <p>The account IDs of the external IDs must match the account ID of the account that is
+     * updated.
+     *
+     * <p>For non-existing external IDs this is a no-op.
+     *
+     * @param extIds external IDs that should be deleted
+     * @return the builder
+     */
+    public Builder deleteExternalIds(Collection<ExternalId> extIds) {
+      deletedExternalIdsBuilder().addAll(extIds);
+      return this;
+    }
+
+    /**
+     * Replaces an external ID.
+     *
+     * @param extIdToDelete external ID that should be deleted
+     * @param extIdToAdd external ID that should be added
+     * @return the builder
+     */
+    public Builder replaceExternalId(ExternalId extIdToDelete, ExternalId extIdToAdd) {
+      return replaceExternalIds(ImmutableSet.of(extIdToDelete), ImmutableSet.of(extIdToAdd));
+    }
+
+    /**
+     * Replaces an external IDs.
+     *
+     * @param extIdsToDelete external IDs that should be deleted
+     * @param extIdsToAdd external IDs that should be added
+     * @return the builder
+     */
+    public Builder replaceExternalIds(
+        Collection<ExternalId> extIdsToDelete, Collection<ExternalId> extIdsToAdd) {
+      return deleteExternalIds(extIdsToDelete).addExternalIds(extIdsToAdd);
+    }
+
+    /**
+     * Returns a builder for the map of updated project watches.
+     *
+     * @return builder for the map of updated project watches.
+     */
+    abstract ImmutableMap.Builder<ProjectWatchKey, Set<NotifyType>> updatedProjectWatchesBuilder();
+
+    /**
+     * Updates a project watch for the account.
+     *
+     * <p>If no project watch with the key exists the project watch is created.
+     *
+     * @param projectWatchKey key of the project watch that should be updated
+     * @param notifyTypes the notify types that should be set for the project watch
+     * @return the builder
+     */
+    public Builder updateProjectWatch(
+        ProjectWatchKey projectWatchKey, Set<NotifyType> notifyTypes) {
+      return updateProjectWatches(ImmutableMap.of(projectWatchKey, notifyTypes));
+    }
+
+    /**
+     * Updates project watches for the account.
+     *
+     * <p>If any of the project watches already exists, it is overwritten. New project watches are
+     * inserted.
+     *
+     * @param projectWatches project watches that should be updated
+     * @return the builder
+     */
+    public Builder updateProjectWatches(Map<ProjectWatchKey, Set<NotifyType>> projectWatches) {
+      updatedProjectWatchesBuilder().putAll(projectWatches);
+      return this;
+    }
+
+    /**
+     * Returns a builder for the set of deleted project watches.
+     *
+     * @return builder for the set of deleted project watches.
+     */
+    abstract ImmutableSet.Builder<ProjectWatchKey> deletedProjectWatchesBuilder();
+
+    /**
+     * Deletes a project watch for the account.
+     *
+     * <p>If no project watch with the ID exists this is a no-op.
+     *
+     * @param projectWatch project watch that should be deleted
+     * @return the builder
+     */
+    public Builder deleteProjectWatch(ProjectWatchKey projectWatch) {
+      return deleteProjectWatches(ImmutableSet.of(projectWatch));
+    }
+
+    /**
+     * Deletes project watches for the account.
+     *
+     * <p>For non-existing project watches this is a no-op.
+     *
+     * @param projectWatches project watches that should be deleted
+     * @return the builder
+     */
+    public Builder deleteProjectWatches(Collection<ProjectWatchKey> projectWatches) {
+      deletedProjectWatchesBuilder().addAll(projectWatches);
+      return this;
+    }
+
+    /**
+     * Sets the general preferences for the account.
+     *
+     * <p>Updates any preference that is non-null in the provided GeneralPreferencesInfo.
+     *
+     * @param generalPreferences the general preferences that should be set
+     * @return the builder
+     */
+    public abstract Builder setGeneralPreferences(GeneralPreferencesInfo generalPreferences);
+
+    /**
+     * Sets the diff preferences for the account.
+     *
+     * <p>Updates any preference that is non-null in the provided DiffPreferencesInfo.
+     *
+     * @param diffPreferences the diff preferences that should be set
+     * @return the builder
+     */
+    public abstract Builder setDiffPreferences(DiffPreferencesInfo diffPreferences);
+
+    /**
+     * Sets the edit preferences for the account.
+     *
+     * <p>Updates any preference that is non-null in the provided EditPreferencesInfo.
+     *
+     * @param editPreferences the edit preferences that should be set
+     * @return the builder
+     */
+    public abstract Builder setEditPreferences(EditPreferencesInfo editPreferences);
+
+    /**
+     * Builds the account update.
+     *
+     * @return the account update
+     */
+    public abstract InternalAccountUpdate build();
+
+    /**
+     * Wrapper for {@link Builder} that converts {@code null} string arguments to empty strings for
+     * all setter methods. This allows us to treat setter invocations with a {@code null} string
+     * argument as signal to unset the corresponding field. E.g. for a builder method {@code
+     * setX(String)} the following semantics apply:
+     *
+     * <ul>
+     *   <li>Method is not invoked: X stays unchanged, X is stored as {@code Optional.empty()}.
+     *   <li>Argument is a non-empty string Y: X is updated to the Y, X is stored as {@code
+     *       Optional.of(Y)}.
+     *   <li>Argument is an empty string: X is unset, X is stored as {@code Optional.of("")}
+     *   <li>Argument is {@code null}: X is unset, X is stored as {@code Optional.of("")} (since the
+     *       wrapper converts {@code null} to an empty string)
+     * </ul>
+     *
+     * Without the wrapper calling {@code setX(null)} would fail with a {@link
+     * NullPointerException}. Hence all callers would need to take care to call {@link
+     * Strings#nullToEmpty(String)} for all string arguments and likely it would be forgotten in
+     * some places.
+     *
+     * <p>This means the stored values are interpreted like this:
+     *
+     * <ul>
+     *   <li>{@code Optional.empty()}: property stays unchanged
+     *   <li>{@code Optional.of(<non-empty-string>)}: property is updated
+     *   <li>{@code Optional.of("")}: property is unset
+     * </ul>
+     *
+     * This wrapper forwards all method invocations to the wrapped {@link Builder} instance that was
+     * created by AutoValue. For methods that return the AutoValue {@link Builder} instance the
+     * return value is replaced with the wrapper instance so that all chained calls go through the
+     * wrapper.
+     */
+    private static class WrapperThatConvertsNullStringArgsToEmptyStrings extends Builder {
+      private final Builder delegate;
+
+      private WrapperThatConvertsNullStringArgsToEmptyStrings(Builder delegate) {
+        this.delegate = delegate;
+      }
+
+      @Override
+      public Builder setFullName(String fullName) {
+        delegate.setFullName(Strings.nullToEmpty(fullName));
+        return this;
+      }
+
+      @Override
+      public Builder setPreferredEmail(String preferredEmail) {
+        delegate.setPreferredEmail(Strings.nullToEmpty(preferredEmail));
+        return this;
+      }
+
+      @Override
+      public Builder setActive(boolean active) {
+        delegate.setActive(active);
+        return this;
+      }
+
+      @Override
+      public Builder setStatus(String status) {
+        delegate.setStatus(Strings.nullToEmpty(status));
+        return this;
+      }
+
+      @Override
+      public InternalAccountUpdate build() {
+        return delegate.build();
+      }
+
+      @Override
+      ImmutableSet.Builder<ExternalId> createdExternalIdsBuilder() {
+        return delegate.createdExternalIdsBuilder();
+      }
+
+      @Override
+      public Builder addExternalIds(Collection<ExternalId> extIds) {
+        delegate.addExternalIds(extIds);
+        return this;
+      }
+
+      @Override
+      ImmutableSet.Builder<ExternalId> updatedExternalIdsBuilder() {
+        return delegate.updatedExternalIdsBuilder();
+      }
+
+      @Override
+      public Builder updateExternalIds(Collection<ExternalId> extIds) {
+        delegate.updateExternalIds(extIds);
+        return this;
+      }
+
+      @Override
+      ImmutableSet.Builder<ExternalId> deletedExternalIdsBuilder() {
+        return delegate.deletedExternalIdsBuilder();
+      }
+
+      @Override
+      public Builder deleteExternalIds(Collection<ExternalId> extIds) {
+        delegate.deleteExternalIds(extIds);
+        return this;
+      }
+
+      @Override
+      ImmutableMap.Builder<ProjectWatchKey, Set<NotifyType>> updatedProjectWatchesBuilder() {
+        return delegate.updatedProjectWatchesBuilder();
+      }
+
+      @Override
+      public Builder updateProjectWatches(Map<ProjectWatchKey, Set<NotifyType>> projectWatches) {
+        delegate.updateProjectWatches(projectWatches);
+        return this;
+      }
+
+      @Override
+      ImmutableSet.Builder<ProjectWatchKey> deletedProjectWatchesBuilder() {
+        return delegate.deletedProjectWatchesBuilder();
+      }
+
+      @Override
+      public Builder deleteProjectWatches(Collection<ProjectWatchKey> projectWatches) {
+        delegate.deleteProjectWatches(projectWatches);
+        return this;
+      }
+
+      @Override
+      public Builder setGeneralPreferences(GeneralPreferencesInfo generalPreferences) {
+        delegate.setGeneralPreferences(generalPreferences);
+        return this;
+      }
+
+      @Override
+      public Builder setDiffPreferences(DiffPreferencesInfo diffPreferences) {
+        delegate.setDiffPreferences(diffPreferences);
+        return this;
+      }
+
+      @Override
+      public Builder setEditPreferences(EditPreferencesInfo editPreferences) {
+        delegate.setEditPreferences(editPreferences);
+        return this;
+      }
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/account/InternalGroupBackend.java b/java/com/google/gerrit/server/account/InternalGroupBackend.java
new file mode 100644
index 0000000..ea6eb87
--- /dev/null
+++ b/java/com/google/gerrit/server/account/InternalGroupBackend.java
@@ -0,0 +1,109 @@
+// Copyright (C) 2012 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.google.gerrit.server.account;
+
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.group.InternalGroupDescription;
+import com.google.gerrit.server.group.db.Groups;
+import com.google.gerrit.server.group.db.GroupsNoteDbConsistencyChecker;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Optional;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.ObjectId;
+
+/** Implementation of GroupBackend for the internal group system. */
+@Singleton
+public class InternalGroupBackend implements GroupBackend {
+  private final GroupControl.Factory groupControlFactory;
+  private final GroupCache groupCache;
+  private final Groups groups;
+  private final IncludingGroupMembership.Factory groupMembershipFactory;
+
+  @Inject
+  InternalGroupBackend(
+      GroupControl.Factory groupControlFactory,
+      GroupCache groupCache,
+      Groups groups,
+      IncludingGroupMembership.Factory groupMembershipFactory) {
+    this.groupControlFactory = groupControlFactory;
+    this.groupCache = groupCache;
+    this.groups = groups;
+    this.groupMembershipFactory = groupMembershipFactory;
+  }
+
+  @Override
+  public boolean handles(AccountGroup.UUID uuid) {
+    // See AccountGroup.isInternalGroup
+    return ObjectId.isId(uuid.get()); // [0-9a-f]{40};
+  }
+
+  @Override
+  public GroupDescription.Internal get(AccountGroup.UUID uuid) {
+    if (!handles(uuid)) {
+      return null;
+    }
+
+    return groupCache.get(uuid).map(InternalGroupDescription::new).orElse(null);
+  }
+
+  @Override
+  public Collection<GroupReference> suggest(String name, ProjectState project) {
+    try {
+      return groups
+          .getAllGroupReferences()
+          .filter(group -> startsWithIgnoreCase(group, name))
+          .filter(this::isVisible)
+          .collect(toList());
+    } catch (IOException | ConfigInvalidException e) {
+      return ImmutableList.of();
+    }
+  }
+
+  private static boolean startsWithIgnoreCase(GroupReference group, String name) {
+    return group.getName().regionMatches(true, 0, name, 0, name.length());
+  }
+
+  private boolean isVisible(GroupReference groupReference) {
+    Optional<InternalGroup> group = groupCache.get(groupReference.getUUID());
+    if (!group.isPresent()) {
+      // groupRefs are read from group name notes. There is an inconsistency if this lookup fails.
+      GroupsNoteDbConsistencyChecker.logFailToLoadFromGroupRefAsWarning(groupReference.getUUID());
+      return false;
+    }
+    return groupControlFactory.controlFor(new InternalGroupDescription(group.get())).isVisible();
+  }
+
+  @Override
+  public GroupMembership membershipsOf(IdentifiedUser user) {
+    return groupMembershipFactory.create(user);
+  }
+
+  @Override
+  public boolean isVisibleToAll(AccountGroup.UUID uuid) {
+    GroupDescription.Internal g = get(uuid);
+    return g != null && g.isVisibleToAll();
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/ListGroupMembership.java b/java/com/google/gerrit/server/account/ListGroupMembership.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/account/ListGroupMembership.java
rename to java/com/google/gerrit/server/account/ListGroupMembership.java
diff --git a/java/com/google/gerrit/server/account/Preferences.java b/java/com/google/gerrit/server/account/Preferences.java
new file mode 100644
index 0000000..6767b85
--- /dev/null
+++ b/java/com/google/gerrit/server/account/Preferences.java
@@ -0,0 +1,619 @@
+// 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.
+
+package com.google.gerrit.server.account;
+
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.gerrit.server.config.ConfigUtil.loadSection;
+import static com.google.gerrit.server.config.ConfigUtil.skipField;
+import static com.google.gerrit.server.config.ConfigUtil.storeSection;
+import static com.google.gerrit.server.git.UserConfigSections.CHANGE_TABLE;
+import static com.google.gerrit.server.git.UserConfigSections.CHANGE_TABLE_COLUMN;
+import static com.google.gerrit.server.git.UserConfigSections.KEY_ID;
+import static com.google.gerrit.server.git.UserConfigSections.KEY_MATCH;
+import static com.google.gerrit.server.git.UserConfigSections.KEY_TARGET;
+import static com.google.gerrit.server.git.UserConfigSections.KEY_TOKEN;
+import static com.google.gerrit.server.git.UserConfigSections.KEY_URL;
+import static com.google.gerrit.server.git.UserConfigSections.URL_ALIAS;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.client.DiffPreferencesInfo;
+import com.google.gerrit.extensions.client.EditPreferencesInfo;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
+import com.google.gerrit.extensions.client.MenuItem;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.git.UserConfigSections;
+import com.google.gerrit.server.git.ValidationError;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.git.meta.VersionedMetaData;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Optional;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.Repository;
+
+/**
+ * Parses/writes preferences from/to a {@link Config} file.
+ *
+ * <p>This is a low-level API. Read/write of preferences in a user branch should be done through
+ * {@link AccountsUpdate} or {@link AccountConfig}.
+ *
+ * <p>The config file has separate sections for general, diff and edit preferences:
+ *
+ * <pre>
+ *   [general]
+ *     showSiteHeader = false
+ *   [diff]
+ *     hideTopMenu = true
+ *   [edit]
+ *     lineLength = 80
+ * </pre>
+ *
+ * <p>The parameter names match the names that are used in the preferences REST API.
+ *
+ * <p>If the preference is omitted in the config file, then the default value for the preference is
+ * used.
+ *
+ * <p>Defaults for preferences that apply for all accounts can be configured in the {@code
+ * refs/users/default} branch in the {@code All-Users} repository. The config for the default
+ * preferences must be provided to this class so that it can read default values from it.
+ *
+ * <p>The preferences are lazily parsed.
+ */
+public class Preferences {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static final String PREFERENCES_CONFIG = "preferences.config";
+
+  private final Account.Id accountId;
+  private final Config cfg;
+  private final Config defaultCfg;
+  private final ValidationError.Sink validationErrorSink;
+
+  private GeneralPreferencesInfo generalPreferences;
+  private DiffPreferencesInfo diffPreferences;
+  private EditPreferencesInfo editPreferences;
+
+  Preferences(
+      Account.Id accountId,
+      Config cfg,
+      Config defaultCfg,
+      ValidationError.Sink validationErrorSink) {
+    this.accountId = requireNonNull(accountId, "accountId");
+    this.cfg = requireNonNull(cfg, "cfg");
+    this.defaultCfg = requireNonNull(defaultCfg, "defaultCfg");
+    this.validationErrorSink = requireNonNull(validationErrorSink, "validationErrorSink");
+  }
+
+  public GeneralPreferencesInfo getGeneralPreferences() {
+    if (generalPreferences == null) {
+      parse();
+    }
+    return generalPreferences;
+  }
+
+  public DiffPreferencesInfo getDiffPreferences() {
+    if (diffPreferences == null) {
+      parse();
+    }
+    return diffPreferences;
+  }
+
+  public EditPreferencesInfo getEditPreferences() {
+    if (editPreferences == null) {
+      parse();
+    }
+    return editPreferences;
+  }
+
+  public void parse() {
+    generalPreferences = parseGeneralPreferences(null);
+    diffPreferences = parseDiffPreferences(null);
+    editPreferences = parseEditPreferences(null);
+  }
+
+  public Config saveGeneralPreferences(
+      Optional<GeneralPreferencesInfo> generalPreferencesInput,
+      Optional<DiffPreferencesInfo> diffPreferencesInput,
+      Optional<EditPreferencesInfo> editPreferencesInput)
+      throws ConfigInvalidException {
+    if (generalPreferencesInput.isPresent()) {
+      GeneralPreferencesInfo mergedGeneralPreferencesInput =
+          parseGeneralPreferences(generalPreferencesInput.get());
+
+      storeSection(
+          cfg,
+          UserConfigSections.GENERAL,
+          null,
+          mergedGeneralPreferencesInput,
+          parseDefaultGeneralPreferences(defaultCfg, null));
+      setChangeTable(cfg, mergedGeneralPreferencesInput.changeTable);
+      setMy(cfg, mergedGeneralPreferencesInput.my);
+      setUrlAliases(cfg, mergedGeneralPreferencesInput.urlAliases);
+
+      // evict the cached general preferences
+      this.generalPreferences = null;
+    }
+
+    if (diffPreferencesInput.isPresent()) {
+      DiffPreferencesInfo mergedDiffPreferencesInput =
+          parseDiffPreferences(diffPreferencesInput.get());
+
+      storeSection(
+          cfg,
+          UserConfigSections.DIFF,
+          null,
+          mergedDiffPreferencesInput,
+          parseDefaultDiffPreferences(defaultCfg, null));
+
+      // evict the cached diff preferences
+      this.diffPreferences = null;
+    }
+
+    if (editPreferencesInput.isPresent()) {
+      EditPreferencesInfo mergedEditPreferencesInput =
+          parseEditPreferences(editPreferencesInput.get());
+
+      storeSection(
+          cfg,
+          UserConfigSections.EDIT,
+          null,
+          mergedEditPreferencesInput,
+          parseDefaultEditPreferences(defaultCfg, null));
+
+      // evict the cached edit preferences
+      this.editPreferences = null;
+    }
+
+    return cfg;
+  }
+
+  private GeneralPreferencesInfo parseGeneralPreferences(@Nullable GeneralPreferencesInfo input) {
+    try {
+      return parseGeneralPreferences(cfg, defaultCfg, input);
+    } catch (ConfigInvalidException e) {
+      validationErrorSink.error(
+          new ValidationError(
+              PREFERENCES_CONFIG,
+              String.format(
+                  "Invalid general preferences for account %d: %s",
+                  accountId.get(), e.getMessage())));
+      return new GeneralPreferencesInfo();
+    }
+  }
+
+  private DiffPreferencesInfo parseDiffPreferences(@Nullable DiffPreferencesInfo input) {
+    try {
+      return parseDiffPreferences(cfg, defaultCfg, input);
+    } catch (ConfigInvalidException e) {
+      validationErrorSink.error(
+          new ValidationError(
+              PREFERENCES_CONFIG,
+              String.format(
+                  "Invalid diff preferences for account %d: %s", accountId.get(), e.getMessage())));
+      return new DiffPreferencesInfo();
+    }
+  }
+
+  private EditPreferencesInfo parseEditPreferences(@Nullable EditPreferencesInfo input) {
+    try {
+      return parseEditPreferences(cfg, defaultCfg, input);
+    } catch (ConfigInvalidException e) {
+      validationErrorSink.error(
+          new ValidationError(
+              PREFERENCES_CONFIG,
+              String.format(
+                  "Invalid edit preferences for account %d: %s", accountId.get(), e.getMessage())));
+      return new EditPreferencesInfo();
+    }
+  }
+
+  private static GeneralPreferencesInfo parseGeneralPreferences(
+      Config cfg, @Nullable Config defaultCfg, @Nullable GeneralPreferencesInfo input)
+      throws ConfigInvalidException {
+    GeneralPreferencesInfo r =
+        loadSection(
+            cfg,
+            UserConfigSections.GENERAL,
+            null,
+            new GeneralPreferencesInfo(),
+            defaultCfg != null
+                ? parseDefaultGeneralPreferences(defaultCfg, input)
+                : GeneralPreferencesInfo.defaults(),
+            input);
+    if (input != null) {
+      r.changeTable = input.changeTable;
+      r.my = input.my;
+      r.urlAliases = input.urlAliases;
+    } else {
+      r.changeTable = parseChangeTableColumns(cfg, defaultCfg);
+      r.my = parseMyMenus(cfg, defaultCfg);
+      r.urlAliases = parseUrlAliases(cfg, defaultCfg);
+    }
+    return r;
+  }
+
+  private static DiffPreferencesInfo parseDiffPreferences(
+      Config cfg, @Nullable Config defaultCfg, @Nullable DiffPreferencesInfo input)
+      throws ConfigInvalidException {
+    return loadSection(
+        cfg,
+        UserConfigSections.DIFF,
+        null,
+        new DiffPreferencesInfo(),
+        defaultCfg != null
+            ? parseDefaultDiffPreferences(defaultCfg, input)
+            : DiffPreferencesInfo.defaults(),
+        input);
+  }
+
+  private static EditPreferencesInfo parseEditPreferences(
+      Config cfg, @Nullable Config defaultCfg, @Nullable EditPreferencesInfo input)
+      throws ConfigInvalidException {
+    return loadSection(
+        cfg,
+        UserConfigSections.EDIT,
+        null,
+        new EditPreferencesInfo(),
+        defaultCfg != null
+            ? parseDefaultEditPreferences(defaultCfg, input)
+            : EditPreferencesInfo.defaults(),
+        input);
+  }
+
+  private static GeneralPreferencesInfo parseDefaultGeneralPreferences(
+      Config defaultCfg, GeneralPreferencesInfo input) throws ConfigInvalidException {
+    GeneralPreferencesInfo allUserPrefs = new GeneralPreferencesInfo();
+    loadSection(
+        defaultCfg,
+        UserConfigSections.GENERAL,
+        null,
+        allUserPrefs,
+        GeneralPreferencesInfo.defaults(),
+        input);
+    return updateGeneralPreferencesDefaults(allUserPrefs);
+  }
+
+  private static DiffPreferencesInfo parseDefaultDiffPreferences(
+      Config defaultCfg, DiffPreferencesInfo input) throws ConfigInvalidException {
+    DiffPreferencesInfo allUserPrefs = new DiffPreferencesInfo();
+    loadSection(
+        defaultCfg,
+        UserConfigSections.DIFF,
+        null,
+        allUserPrefs,
+        DiffPreferencesInfo.defaults(),
+        input);
+    return updateDiffPreferencesDefaults(allUserPrefs);
+  }
+
+  private static EditPreferencesInfo parseDefaultEditPreferences(
+      Config defaultCfg, EditPreferencesInfo input) throws ConfigInvalidException {
+    EditPreferencesInfo allUserPrefs = new EditPreferencesInfo();
+    loadSection(
+        defaultCfg,
+        UserConfigSections.EDIT,
+        null,
+        allUserPrefs,
+        EditPreferencesInfo.defaults(),
+        input);
+    return updateEditPreferencesDefaults(allUserPrefs);
+  }
+
+  private static GeneralPreferencesInfo updateGeneralPreferencesDefaults(
+      GeneralPreferencesInfo input) {
+    GeneralPreferencesInfo result = GeneralPreferencesInfo.defaults();
+    try {
+      for (Field field : input.getClass().getDeclaredFields()) {
+        if (skipField(field)) {
+          continue;
+        }
+        Object newVal = field.get(input);
+        if (newVal != null) {
+          field.set(result, newVal);
+        }
+      }
+    } catch (IllegalAccessException e) {
+      logger.atSevere().withCause(e).log("Failed to apply default general preferences");
+      return GeneralPreferencesInfo.defaults();
+    }
+    return result;
+  }
+
+  private static DiffPreferencesInfo updateDiffPreferencesDefaults(DiffPreferencesInfo input) {
+    DiffPreferencesInfo result = DiffPreferencesInfo.defaults();
+    try {
+      for (Field field : input.getClass().getDeclaredFields()) {
+        if (skipField(field)) {
+          continue;
+        }
+        Object newVal = field.get(input);
+        if (newVal != null) {
+          field.set(result, newVal);
+        }
+      }
+    } catch (IllegalAccessException e) {
+      logger.atSevere().withCause(e).log("Failed to apply default diff preferences");
+      return DiffPreferencesInfo.defaults();
+    }
+    return result;
+  }
+
+  private static EditPreferencesInfo updateEditPreferencesDefaults(EditPreferencesInfo input) {
+    EditPreferencesInfo result = EditPreferencesInfo.defaults();
+    try {
+      for (Field field : input.getClass().getDeclaredFields()) {
+        if (skipField(field)) {
+          continue;
+        }
+        Object newVal = field.get(input);
+        if (newVal != null) {
+          field.set(result, newVal);
+        }
+      }
+    } catch (IllegalAccessException e) {
+      logger.atSevere().withCause(e).log("Failed to apply default edit preferences");
+      return EditPreferencesInfo.defaults();
+    }
+    return result;
+  }
+
+  private static List<String> parseChangeTableColumns(Config cfg, @Nullable Config defaultCfg) {
+    List<String> changeTable = changeTable(cfg);
+    if (changeTable == null && defaultCfg != null) {
+      changeTable = changeTable(defaultCfg);
+    }
+    return changeTable;
+  }
+
+  private static List<MenuItem> parseMyMenus(Config cfg, @Nullable Config defaultCfg) {
+    List<MenuItem> my = my(cfg);
+    if (my.isEmpty() && defaultCfg != null) {
+      my = my(defaultCfg);
+    }
+    if (my.isEmpty()) {
+      my.add(new MenuItem("Changes", "#/dashboard/self", null));
+      my.add(new MenuItem("Draft Comments", "#/q/has:draft", null));
+      my.add(new MenuItem("Edits", "#/q/has:edit", null));
+      my.add(new MenuItem("Watched Changes", "#/q/is:watched+is:open", null));
+      my.add(new MenuItem("Starred Changes", "#/q/is:starred", null));
+      my.add(new MenuItem("Groups", "#/groups/self", null));
+    }
+    return my;
+  }
+
+  private static Map<String, String> parseUrlAliases(Config cfg, @Nullable Config defaultCfg) {
+    Map<String, String> urlAliases = urlAliases(cfg);
+    if (urlAliases == null && defaultCfg != null) {
+      urlAliases = urlAliases(defaultCfg);
+    }
+    return urlAliases;
+  }
+
+  public static GeneralPreferencesInfo readDefaultGeneralPreferences(
+      AllUsersName allUsersName, Repository allUsersRepo)
+      throws IOException, ConfigInvalidException {
+    return parseGeneralPreferences(readDefaultConfig(allUsersName, allUsersRepo), null, null);
+  }
+
+  public static DiffPreferencesInfo readDefaultDiffPreferences(
+      AllUsersName allUsersName, Repository allUsersRepo)
+      throws IOException, ConfigInvalidException {
+    return parseDiffPreferences(readDefaultConfig(allUsersName, allUsersRepo), null, null);
+  }
+
+  public static EditPreferencesInfo readDefaultEditPreferences(
+      AllUsersName allUsersName, Repository allUsersRepo)
+      throws IOException, ConfigInvalidException {
+    return parseEditPreferences(readDefaultConfig(allUsersName, allUsersRepo), null, null);
+  }
+
+  static Config readDefaultConfig(AllUsersName allUsersName, Repository allUsersRepo)
+      throws IOException, ConfigInvalidException {
+    VersionedDefaultPreferences defaultPrefs = new VersionedDefaultPreferences();
+    defaultPrefs.load(allUsersName, allUsersRepo);
+    return defaultPrefs.getConfig();
+  }
+
+  public static GeneralPreferencesInfo updateDefaultGeneralPreferences(
+      MetaDataUpdate md, GeneralPreferencesInfo input) throws IOException, ConfigInvalidException {
+    VersionedDefaultPreferences defaultPrefs = new VersionedDefaultPreferences();
+    defaultPrefs.load(md);
+    storeSection(
+        defaultPrefs.getConfig(),
+        UserConfigSections.GENERAL,
+        null,
+        input,
+        GeneralPreferencesInfo.defaults());
+    setMy(defaultPrefs.getConfig(), input.my);
+    setChangeTable(defaultPrefs.getConfig(), input.changeTable);
+    setUrlAliases(defaultPrefs.getConfig(), input.urlAliases);
+    defaultPrefs.commit(md);
+
+    return parseGeneralPreferences(defaultPrefs.getConfig(), null, null);
+  }
+
+  public static DiffPreferencesInfo updateDefaultDiffPreferences(
+      MetaDataUpdate md, DiffPreferencesInfo input) throws IOException, ConfigInvalidException {
+    VersionedDefaultPreferences defaultPrefs = new VersionedDefaultPreferences();
+    defaultPrefs.load(md);
+    storeSection(
+        defaultPrefs.getConfig(),
+        UserConfigSections.DIFF,
+        null,
+        input,
+        DiffPreferencesInfo.defaults());
+    defaultPrefs.commit(md);
+
+    return parseDiffPreferences(defaultPrefs.getConfig(), null, null);
+  }
+
+  public static EditPreferencesInfo updateDefaultEditPreferences(
+      MetaDataUpdate md, EditPreferencesInfo input) throws IOException, ConfigInvalidException {
+    VersionedDefaultPreferences defaultPrefs = new VersionedDefaultPreferences();
+    defaultPrefs.load(md);
+    storeSection(
+        defaultPrefs.getConfig(),
+        UserConfigSections.EDIT,
+        null,
+        input,
+        EditPreferencesInfo.defaults());
+    defaultPrefs.commit(md);
+
+    return parseEditPreferences(defaultPrefs.getConfig(), null, null);
+  }
+
+  private static List<String> changeTable(Config cfg) {
+    return Lists.newArrayList(cfg.getStringList(CHANGE_TABLE, null, CHANGE_TABLE_COLUMN));
+  }
+
+  private static void setChangeTable(Config cfg, List<String> changeTable) {
+    if (changeTable != null) {
+      unsetSection(cfg, UserConfigSections.CHANGE_TABLE);
+      cfg.setStringList(UserConfigSections.CHANGE_TABLE, null, CHANGE_TABLE_COLUMN, changeTable);
+    }
+  }
+
+  private static List<MenuItem> my(Config cfg) {
+    List<MenuItem> my = new ArrayList<>();
+    for (String subsection : cfg.getSubsections(UserConfigSections.MY)) {
+      String url = my(cfg, subsection, KEY_URL, "#/");
+      String target = my(cfg, subsection, KEY_TARGET, url.startsWith("#") ? null : "_blank");
+      my.add(new MenuItem(subsection, url, target, my(cfg, subsection, KEY_ID, null)));
+    }
+    return my;
+  }
+
+  private static String my(Config cfg, String subsection, String key, String defaultValue) {
+    String val = cfg.getString(UserConfigSections.MY, subsection, key);
+    return !Strings.isNullOrEmpty(val) ? val : defaultValue;
+  }
+
+  private static void setMy(Config cfg, List<MenuItem> my) {
+    if (my != null) {
+      unsetSection(cfg, UserConfigSections.MY);
+      for (MenuItem item : my) {
+        checkState(!isNullOrEmpty(item.name), "MenuItem.name must not be null or empty");
+        checkState(!isNullOrEmpty(item.url), "MenuItem.url must not be null or empty");
+
+        setMy(cfg, item.name, KEY_URL, item.url);
+        setMy(cfg, item.name, KEY_TARGET, item.target);
+        setMy(cfg, item.name, KEY_ID, item.id);
+      }
+    }
+  }
+
+  public static void validateMy(List<MenuItem> my) throws BadRequestException {
+    if (my == null) {
+      return;
+    }
+    for (MenuItem item : my) {
+      checkRequiredMenuItemField(item.name, "name");
+      checkRequiredMenuItemField(item.url, "URL");
+    }
+  }
+
+  private static void checkRequiredMenuItemField(String value, String name)
+      throws BadRequestException {
+    if (isNullOrEmpty(value)) {
+      throw new BadRequestException(name + " for menu item is required");
+    }
+  }
+
+  private static boolean isNullOrEmpty(String value) {
+    return value == null || value.trim().isEmpty();
+  }
+
+  private static void setMy(Config cfg, String section, String key, @Nullable String val) {
+    if (val == null || val.trim().isEmpty()) {
+      cfg.unset(UserConfigSections.MY, section.trim(), key);
+    } else {
+      cfg.setString(UserConfigSections.MY, section.trim(), key, val.trim());
+    }
+  }
+
+  private static Map<String, String> urlAliases(Config cfg) {
+    HashMap<String, String> urlAliases = new HashMap<>();
+    for (String subsection : cfg.getSubsections(URL_ALIAS)) {
+      urlAliases.put(
+          cfg.getString(URL_ALIAS, subsection, KEY_MATCH),
+          cfg.getString(URL_ALIAS, subsection, KEY_TOKEN));
+    }
+    return !urlAliases.isEmpty() ? urlAliases : null;
+  }
+
+  private static void setUrlAliases(Config cfg, Map<String, String> urlAliases) {
+    if (urlAliases != null) {
+      for (String subsection : cfg.getSubsections(URL_ALIAS)) {
+        cfg.unsetSection(URL_ALIAS, subsection);
+      }
+
+      int i = 1;
+      for (Entry<String, String> e : urlAliases.entrySet()) {
+        cfg.setString(URL_ALIAS, URL_ALIAS + i, KEY_MATCH, e.getKey());
+        cfg.setString(URL_ALIAS, URL_ALIAS + i, KEY_TOKEN, e.getValue());
+        i++;
+      }
+    }
+  }
+
+  private static void unsetSection(Config cfg, String section) {
+    cfg.unsetSection(section, null);
+    for (String subsection : cfg.getSubsections(section)) {
+      cfg.unsetSection(section, subsection);
+    }
+  }
+
+  private static class VersionedDefaultPreferences extends VersionedMetaData {
+    private Config cfg;
+
+    @Override
+    protected String getRefName() {
+      return RefNames.REFS_USERS_DEFAULT;
+    }
+
+    private Config getConfig() {
+      checkState(cfg != null, "Default preferences not loaded yet.");
+      return cfg;
+    }
+
+    @Override
+    protected void onLoad() throws IOException, ConfigInvalidException {
+      cfg = readConfig(PREFERENCES_CONFIG);
+    }
+
+    @Override
+    protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException {
+      if (Strings.isNullOrEmpty(commit.getMessage())) {
+        commit.setMessage("Update default preferences\n");
+      }
+      saveConfig(PREFERENCES_CONFIG, cfg);
+      return true;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/account/ProjectWatches.java b/java/com/google/gerrit/server/account/ProjectWatches.java
new file mode 100644
index 0000000..8b3e1b3
--- /dev/null
+++ b/java/com/google/gerrit/server/account/ProjectWatches.java
@@ -0,0 +1,275 @@
+// 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.
+
+package com.google.gerrit.server.account;
+
+import static com.google.common.base.MoreObjects.firstNonNull;
+import static java.util.Objects.requireNonNull;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Enums;
+import com.google.common.base.Joiner;
+import com.google.common.base.Splitter;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Multimap;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.collect.Sets;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.git.ValidationError;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.jgit.lib.Config;
+
+/**
+ * Parses/writes project watches from/to a {@link Config} file.
+ *
+ * <p>This is a low-level API. Read/write of project watches in a user branch should be done through
+ * {@link AccountsUpdate} or {@link AccountConfig}.
+ *
+ * <p>The config file has one 'project' section for all project watches of a project.
+ *
+ * <p>The project name is used as subsection name and the filters with the notify types that decide
+ * for which events email notifications should be sent are represented as 'notify' values in the
+ * subsection. A 'notify' value is formatted as {@code <filter>
+ * [<comma-separated-list-of-notify-types>]}:
+ *
+ * <pre>
+ *   [project "foo"]
+ *     notify = * [ALL_COMMENTS]
+ *     notify = branch:master [ALL_COMMENTS, NEW_PATCHSETS]
+ *     notify = branch:master owner:self [SUBMITTED_CHANGES]
+ * </pre>
+ *
+ * <p>If two notify values in the same subsection have the same filter they are merged on the next
+ * save, taking the union of the notify types.
+ *
+ * <p>For watch configurations that notify on no event the list of notify types is empty:
+ *
+ * <pre>
+ *   [project "foo"]
+ *     notify = branch:master []
+ * </pre>
+ *
+ * <p>Unknown notify types are ignored and removed on save.
+ *
+ * <p>The project watches are lazily parsed.
+ */
+public class ProjectWatches {
+  @AutoValue
+  public abstract static class ProjectWatchKey {
+    public static ProjectWatchKey create(Project.NameKey project, @Nullable String filter) {
+      return new AutoValue_ProjectWatches_ProjectWatchKey(project, Strings.emptyToNull(filter));
+    }
+
+    public abstract Project.NameKey project();
+
+    public abstract @Nullable String filter();
+  }
+
+  public enum NotifyType {
+    // sort by name, except 'ALL' which should stay last
+    ABANDONED_CHANGES,
+    ALL_COMMENTS,
+    NEW_CHANGES,
+    NEW_PATCHSETS,
+    SUBMITTED_CHANGES,
+
+    ALL
+  }
+
+  public static final String FILTER_ALL = "*";
+
+  public static final String WATCH_CONFIG = "watch.config";
+  public static final String PROJECT = "project";
+  public static final String KEY_NOTIFY = "notify";
+
+  private final Account.Id accountId;
+  private final Config cfg;
+  private final ValidationError.Sink validationErrorSink;
+
+  private ImmutableMap<ProjectWatchKey, ImmutableSet<NotifyType>> projectWatches;
+
+  ProjectWatches(Account.Id accountId, Config cfg, ValidationError.Sink validationErrorSink) {
+    this.accountId = requireNonNull(accountId, "accountId");
+    this.cfg = requireNonNull(cfg, "cfg");
+    this.validationErrorSink = requireNonNull(validationErrorSink, "validationErrorSink");
+  }
+
+  public ImmutableMap<ProjectWatchKey, ImmutableSet<NotifyType>> getProjectWatches() {
+    if (projectWatches == null) {
+      parse();
+    }
+    return projectWatches;
+  }
+
+  public void parse() {
+    projectWatches = parse(accountId, cfg, validationErrorSink);
+  }
+
+  /**
+   * Parses project watches from the given config file and returns them as a map.
+   *
+   * <p>A project watch is defined on a project and has a filter to match changes for which the
+   * project watch should be applied. The project and the filter form the map key. The map value is
+   * a set of notify types that decide for which events email notifications should be sent.
+   *
+   * <p>A project watch on the {@code All-Projects} project applies for all projects unless the
+   * project has a matching project watch.
+   *
+   * <p>A project watch can have an empty set of notify types. An empty set of notify types means
+   * that no notification for matching changes should be set. This is different from no project
+   * watch as it overwrites matching project watches from the {@code All-Projects} project.
+   *
+   * <p>Since we must be able to differentiate a project watch with an empty set of notify types
+   * from no project watch we can't use a {@link Multimap} as return type.
+   *
+   * @param accountId the ID of the account for which the project watches should be parsed
+   * @param cfg the config file from which the project watches should be parsed
+   * @param validationErrorSink validation error sink
+   * @return the parsed project watches
+   */
+  @VisibleForTesting
+  public static ImmutableMap<ProjectWatchKey, ImmutableSet<NotifyType>> parse(
+      Account.Id accountId, Config cfg, ValidationError.Sink validationErrorSink) {
+    Map<ProjectWatchKey, Set<NotifyType>> projectWatches = new HashMap<>();
+    for (String projectName : cfg.getSubsections(PROJECT)) {
+      String[] notifyValues = cfg.getStringList(PROJECT, projectName, KEY_NOTIFY);
+      for (String nv : notifyValues) {
+        if (Strings.isNullOrEmpty(nv)) {
+          continue;
+        }
+
+        NotifyValue notifyValue =
+            NotifyValue.parse(accountId, projectName, nv, validationErrorSink);
+        if (notifyValue == null) {
+          continue;
+        }
+
+        ProjectWatchKey key =
+            ProjectWatchKey.create(new Project.NameKey(projectName), notifyValue.filter());
+        if (!projectWatches.containsKey(key)) {
+          projectWatches.put(key, EnumSet.noneOf(NotifyType.class));
+        }
+        projectWatches.get(key).addAll(notifyValue.notifyTypes());
+      }
+    }
+    return immutableCopyOf(projectWatches);
+  }
+
+  public Config save(Map<ProjectWatchKey, Set<NotifyType>> projectWatches) {
+    this.projectWatches = immutableCopyOf(projectWatches);
+
+    for (String projectName : cfg.getSubsections(PROJECT)) {
+      cfg.unsetSection(PROJECT, projectName);
+    }
+
+    ListMultimap<String, String> notifyValuesByProject =
+        MultimapBuilder.hashKeys().arrayListValues().build();
+    for (Map.Entry<ProjectWatchKey, Set<NotifyType>> e : projectWatches.entrySet()) {
+      NotifyValue notifyValue = NotifyValue.create(e.getKey().filter(), e.getValue());
+      notifyValuesByProject.put(e.getKey().project().get(), notifyValue.toString());
+    }
+
+    for (Map.Entry<String, Collection<String>> e : notifyValuesByProject.asMap().entrySet()) {
+      cfg.setStringList(PROJECT, e.getKey(), KEY_NOTIFY, new ArrayList<>(e.getValue()));
+    }
+
+    return cfg;
+  }
+
+  private static ImmutableMap<ProjectWatchKey, ImmutableSet<NotifyType>> immutableCopyOf(
+      Map<ProjectWatchKey, Set<NotifyType>> projectWatches) {
+    ImmutableMap.Builder<ProjectWatchKey, ImmutableSet<NotifyType>> b = ImmutableMap.builder();
+    projectWatches.entrySet().stream()
+        .forEach(e -> b.put(e.getKey(), ImmutableSet.copyOf(e.getValue())));
+    return b.build();
+  }
+
+  @AutoValue
+  public abstract static class NotifyValue {
+    public static NotifyValue parse(
+        Account.Id accountId,
+        String project,
+        String notifyValue,
+        ValidationError.Sink validationErrorSink) {
+      notifyValue = notifyValue.trim();
+      int i = notifyValue.lastIndexOf('[');
+      if (i < 0 || notifyValue.charAt(notifyValue.length() - 1) != ']') {
+        validationErrorSink.error(
+            new ValidationError(
+                WATCH_CONFIG,
+                String.format(
+                    "Invalid project watch of account %d for project %s: %s",
+                    accountId.get(), project, notifyValue)));
+        return null;
+      }
+      String filter = notifyValue.substring(0, i).trim();
+      if (filter.isEmpty() || FILTER_ALL.equals(filter)) {
+        filter = null;
+      }
+
+      Set<NotifyType> notifyTypes = EnumSet.noneOf(NotifyType.class);
+      if (i + 1 < notifyValue.length() - 2) {
+        for (String nt :
+            Splitter.on(',')
+                .trimResults()
+                .splitToList(notifyValue.substring(i + 1, notifyValue.length() - 1))) {
+          NotifyType notifyType = Enums.getIfPresent(NotifyType.class, nt).orNull();
+          if (notifyType == null) {
+            validationErrorSink.error(
+                new ValidationError(
+                    WATCH_CONFIG,
+                    String.format(
+                        "Invalid notify type %s in project watch "
+                            + "of account %d for project %s: %s",
+                        nt, accountId.get(), project, notifyValue)));
+            continue;
+          }
+          notifyTypes.add(notifyType);
+        }
+      }
+      return create(filter, notifyTypes);
+    }
+
+    public static NotifyValue create(@Nullable String filter, Collection<NotifyType> notifyTypes) {
+      return new AutoValue_ProjectWatches_NotifyValue(
+          Strings.emptyToNull(filter), Sets.immutableEnumSet(notifyTypes));
+    }
+
+    public abstract @Nullable String filter();
+
+    public abstract ImmutableSet<NotifyType> notifyTypes();
+
+    @Override
+    public String toString() {
+      List<NotifyType> notifyTypes = new ArrayList<>(notifyTypes());
+      StringBuilder notifyValue = new StringBuilder();
+      notifyValue.append(firstNonNull(filter(), FILTER_ALL)).append(" [");
+      Joiner.on(", ").appendTo(notifyValue, notifyTypes);
+      notifyValue.append("]");
+      return notifyValue.toString();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/account/QueryList.java b/java/com/google/gerrit/server/account/QueryList.java
new file mode 100644
index 0000000..0838e99
--- /dev/null
+++ b/java/com/google/gerrit/server/account/QueryList.java
@@ -0,0 +1,42 @@
+// Copyright (C) 2015 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.google.gerrit.server.account;
+
+import com.google.gerrit.server.git.ValidationError;
+import com.google.gerrit.server.git.meta.TabFile;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+public class QueryList extends TabFile {
+  public static final String FILE_NAME = "queries";
+  protected final Map<String, String> queriesByName;
+
+  private QueryList(List<Row> queriesByName) {
+    this.queriesByName = toMap(queriesByName);
+  }
+
+  static QueryList parse(String text, ValidationError.Sink errors) throws IOException {
+    return new QueryList(parse(text, FILE_NAME, TRIM, TRIM, errors));
+  }
+
+  public String getQuery(String name) {
+    return queriesByName.get(name);
+  }
+
+  String asText() {
+    return asText("Name", "Query", queriesByName);
+  }
+}
diff --git a/java/com/google/gerrit/server/account/Realm.java b/java/com/google/gerrit/server/account/Realm.java
new file mode 100644
index 0000000..4e8cf09
--- /dev/null
+++ b/java/com/google/gerrit/server/account/Realm.java
@@ -0,0 +1,70 @@
+// Copyright (C) 2009 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.google.gerrit.server.account;
+
+import com.google.gerrit.extensions.client.AccountFieldName;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Set;
+import javax.naming.NamingException;
+import javax.security.auth.login.LoginException;
+
+public interface Realm {
+  /** Can the end-user modify this field of their own account? */
+  boolean allowsEdit(AccountFieldName field);
+
+  /** Returns the account fields that the end-user can modify. */
+  Set<AccountFieldName> getEditableFields();
+
+  AuthRequest authenticate(AuthRequest who) throws AccountException;
+
+  void onCreateAccount(AuthRequest who, Account account);
+
+  /** @return true if the user has the given email address. */
+  boolean hasEmailAddress(IdentifiedUser who, String email);
+
+  /** @return all known email addresses for the identified user. */
+  Set<String> getEmailAddresses(IdentifiedUser who);
+
+  /**
+   * Locate an account whose local username is the given account name.
+   *
+   * <p>Generally this only works for local realms, such as one backed by an LDAP directory, or
+   * where there is an {@link EmailExpander} configured that knows how to convert the accountName
+   * into an email address, and then locate the user by that email address.
+   */
+  Account.Id lookup(String accountName) throws IOException;
+
+  /**
+   * @return true if the account is active.
+   * @throws NamingException
+   * @throws LoginException
+   * @throws AccountException
+   * @throws IOException
+   */
+  default boolean isActive(@SuppressWarnings("unused") String username)
+      throws LoginException, NamingException, AccountException, IOException {
+    return true;
+  }
+
+  /** @return true if the account is backed by the realm, false otherwise. */
+  default boolean accountBelongsToRealm(
+      @SuppressWarnings("unused") Collection<ExternalId> externalIds) {
+    return false;
+  }
+}
diff --git a/java/com/google/gerrit/server/account/SetInactiveFlag.java b/java/com/google/gerrit/server/account/SetInactiveFlag.java
new file mode 100644
index 0000000..a683849
--- /dev/null
+++ b/java/com/google/gerrit/server/account/SetInactiveFlag.java
@@ -0,0 +1,112 @@
+// Copyright (C) 2017 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.google.gerrit.server.account;
+
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.ServerInitiated;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gerrit.server.validators.AccountActivationValidationListener;
+import com.google.gerrit.server.validators.ValidationException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Optional;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class SetInactiveFlag {
+  private final PluginSetContext<AccountActivationValidationListener>
+      accountActivationValidationListeners;
+  private final Provider<AccountsUpdate> accountsUpdateProvider;
+
+  @Inject
+  SetInactiveFlag(
+      PluginSetContext<AccountActivationValidationListener> accountActivationValidationListeners,
+      @ServerInitiated Provider<AccountsUpdate> accountsUpdateProvider) {
+    this.accountActivationValidationListeners = accountActivationValidationListeners;
+    this.accountsUpdateProvider = accountsUpdateProvider;
+  }
+
+  public Response<?> deactivate(Account.Id accountId)
+      throws RestApiException, IOException, ConfigInvalidException, OrmException {
+    AtomicBoolean alreadyInactive = new AtomicBoolean(false);
+    AtomicReference<Optional<RestApiException>> exception = new AtomicReference<>(Optional.empty());
+    accountsUpdateProvider
+        .get()
+        .update(
+            "Deactivate Account via API",
+            accountId,
+            (a, u) -> {
+              if (!a.getAccount().isActive()) {
+                alreadyInactive.set(true);
+              } else {
+                try {
+                  accountActivationValidationListeners.runEach(
+                      l -> l.validateDeactivation(a), ValidationException.class);
+                } catch (ValidationException e) {
+                  exception.set(Optional.of(new ResourceConflictException(e.getMessage(), e)));
+                  return;
+                }
+                u.setActive(false);
+              }
+            })
+        .orElseThrow(() -> new ResourceNotFoundException("account not found"));
+    if (exception.get().isPresent()) {
+      throw exception.get().get();
+    }
+    if (alreadyInactive.get()) {
+      throw new ResourceConflictException("account not active");
+    }
+    return Response.none();
+  }
+
+  public Response<String> activate(Account.Id accountId)
+      throws RestApiException, IOException, ConfigInvalidException, OrmException {
+    AtomicBoolean alreadyActive = new AtomicBoolean(false);
+    AtomicReference<Optional<RestApiException>> exception = new AtomicReference<>(Optional.empty());
+    accountsUpdateProvider
+        .get()
+        .update(
+            "Activate Account via API",
+            accountId,
+            (a, u) -> {
+              if (a.getAccount().isActive()) {
+                alreadyActive.set(true);
+              } else {
+                try {
+                  accountActivationValidationListeners.runEach(
+                      l -> l.validateActivation(a), ValidationException.class);
+                } catch (ValidationException e) {
+                  exception.set(Optional.of(new ResourceConflictException(e.getMessage(), e)));
+                  return;
+                }
+                u.setActive(true);
+              }
+            })
+        .orElseThrow(() -> new ResourceNotFoundException("account not found"));
+    if (exception.get().isPresent()) {
+      throw exception.get().get();
+    }
+    return alreadyActive.get() ? Response.ok("") : Response.created("");
+  }
+}
diff --git a/java/com/google/gerrit/server/account/UniversalGroupBackend.java b/java/com/google/gerrit/server/account/UniversalGroupBackend.java
new file mode 100644
index 0000000..50a5e9f
--- /dev/null
+++ b/java/com/google/gerrit/server/account/UniversalGroupBackend.java
@@ -0,0 +1,242 @@
+// Copyright (C) 2012 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.google.gerrit.server.account;
+
+import static com.google.gerrit.server.account.GroupBackends.GROUP_REF_NAME_COMPARATOR;
+import static java.util.stream.Collectors.joining;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.collect.Sets;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.StartupCheck;
+import com.google.gerrit.server.StartupException;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gerrit.server.plugincontext.PluginSetEntryContext;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.jgit.lib.Config;
+
+/**
+ * Universal implementation of the GroupBackend that works with the injected set of GroupBackends.
+ */
+@Singleton
+public class UniversalGroupBackend implements GroupBackend {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final PluginSetContext<GroupBackend> backends;
+
+  @Inject
+  UniversalGroupBackend(PluginSetContext<GroupBackend> backends) {
+    this.backends = backends;
+  }
+
+  @Nullable
+  private GroupBackend backend(AccountGroup.UUID uuid) {
+    if (uuid != null) {
+      for (PluginSetEntryContext<GroupBackend> c : backends) {
+        if (c.call(b -> b.handles(uuid))) {
+          return c.get();
+        }
+      }
+    }
+    return null;
+  }
+
+  @Override
+  public boolean handles(AccountGroup.UUID uuid) {
+    return backend(uuid) != null;
+  }
+
+  @Override
+  public GroupDescription.Basic get(AccountGroup.UUID uuid) {
+    if (uuid == null) {
+      return null;
+    }
+    GroupBackend b = backend(uuid);
+    if (b == null) {
+      logger.atFine().log("Unknown GroupBackend for UUID: %s", uuid);
+      return null;
+    }
+    return b.get(uuid);
+  }
+
+  @Override
+  public Collection<GroupReference> suggest(String name, ProjectState project) {
+    Set<GroupReference> groups = Sets.newTreeSet(GROUP_REF_NAME_COMPARATOR);
+    backends.runEach(g -> groups.addAll(g.suggest(name, project)));
+    return groups;
+  }
+
+  @Override
+  public GroupMembership membershipsOf(IdentifiedUser user) {
+    return new UniversalGroupMembership(user);
+  }
+
+  private class UniversalGroupMembership implements GroupMembership {
+    private final Map<GroupBackend, GroupMembership> memberships;
+
+    private UniversalGroupMembership(IdentifiedUser user) {
+      ImmutableMap.Builder<GroupBackend, GroupMembership> builder = ImmutableMap.builder();
+      backends.runEach(g -> builder.put(g, g.membershipsOf(user)));
+      this.memberships = builder.build();
+    }
+
+    @Nullable
+    private GroupMembership membership(AccountGroup.UUID uuid) {
+      if (uuid != null) {
+        for (Map.Entry<GroupBackend, GroupMembership> m : memberships.entrySet()) {
+          if (m.getKey().handles(uuid)) {
+            return m.getValue();
+          }
+        }
+      }
+      return null;
+    }
+
+    @Override
+    public boolean contains(AccountGroup.UUID uuid) {
+      if (uuid == null) {
+        return false;
+      }
+      GroupMembership m = membership(uuid);
+      if (m == null) {
+        logger.atFine().log("Unknown GroupMembership for UUID: %s", uuid);
+        return false;
+      }
+      return m.contains(uuid);
+    }
+
+    @Override
+    public boolean containsAnyOf(Iterable<AccountGroup.UUID> uuids) {
+      ListMultimap<GroupMembership, AccountGroup.UUID> lookups =
+          MultimapBuilder.hashKeys().arrayListValues().build();
+      for (AccountGroup.UUID uuid : uuids) {
+        if (uuid == null) {
+          continue;
+        }
+        GroupMembership m = membership(uuid);
+        if (m == null) {
+          logger.atFine().log("Unknown GroupMembership for UUID: %s", uuid);
+          continue;
+        }
+        lookups.put(m, uuid);
+      }
+      for (Map.Entry<GroupMembership, Collection<AccountGroup.UUID>> entry :
+          lookups.asMap().entrySet()) {
+        GroupMembership m = entry.getKey();
+        Collection<AccountGroup.UUID> ids = entry.getValue();
+        if (ids.size() == 1) {
+          if (m.contains(Iterables.getOnlyElement(ids))) {
+            return true;
+          }
+        } else if (m.containsAnyOf(ids)) {
+          return true;
+        }
+      }
+      return false;
+    }
+
+    @Override
+    public Set<AccountGroup.UUID> intersection(Iterable<AccountGroup.UUID> uuids) {
+      ListMultimap<GroupMembership, AccountGroup.UUID> lookups =
+          MultimapBuilder.hashKeys().arrayListValues().build();
+      for (AccountGroup.UUID uuid : uuids) {
+        if (uuid == null) {
+          continue;
+        }
+        GroupMembership m = membership(uuid);
+        if (m == null) {
+          logger.atFine().log("Unknown GroupMembership for UUID: %s", uuid);
+          continue;
+        }
+        lookups.put(m, uuid);
+      }
+      Set<AccountGroup.UUID> groups = new HashSet<>();
+      for (Map.Entry<GroupMembership, Collection<AccountGroup.UUID>> entry :
+          lookups.asMap().entrySet()) {
+        groups.addAll(entry.getKey().intersection(entry.getValue()));
+      }
+      return groups;
+    }
+
+    @Override
+    public Set<AccountGroup.UUID> getKnownGroups() {
+      Set<AccountGroup.UUID> groups = new HashSet<>();
+      for (GroupMembership m : memberships.values()) {
+        groups.addAll(m.getKnownGroups());
+      }
+      return groups;
+    }
+  }
+
+  @Override
+  public boolean isVisibleToAll(AccountGroup.UUID uuid) {
+    for (PluginSetEntryContext<GroupBackend> c : backends) {
+      if (c.call(b -> b.handles(uuid))) {
+        return c.call(b -> b.isVisibleToAll(uuid));
+      }
+    }
+    return false;
+  }
+
+  public static class ConfigCheck implements StartupCheck {
+    private final Config cfg;
+    private final UniversalGroupBackend universalGroupBackend;
+
+    @Inject
+    ConfigCheck(@GerritServerConfig Config cfg, UniversalGroupBackend groupBackend) {
+      this.cfg = cfg;
+      this.universalGroupBackend = groupBackend;
+    }
+
+    @Override
+    public void check() throws StartupException {
+      String invalid =
+          cfg.getSubsections("groups").stream()
+              .filter(
+                  sub -> {
+                    AccountGroup.UUID uuid = new AccountGroup.UUID(sub);
+                    GroupBackend groupBackend = universalGroupBackend.backend(uuid);
+                    return groupBackend == null || groupBackend.get(uuid) == null;
+                  })
+              .map(u -> "'" + u + "'")
+              .collect(joining(","));
+
+      if (!invalid.isEmpty()) {
+        throw new StartupException(
+            String.format(
+                "Subsections for 'groups' in gerrit.config must be valid group"
+                    + " UUIDs. The following group UUIDs could not be resolved: "
+                    + invalid
+                    + " Please remove/fix these 'groups' subsections in"
+                    + " gerrit.config."));
+      }
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/account/VersionedAccountDestinations.java b/java/com/google/gerrit/server/account/VersionedAccountDestinations.java
new file mode 100644
index 0000000..e2f1bc2
--- /dev/null
+++ b/java/com/google/gerrit/server/account/VersionedAccountDestinations.java
@@ -0,0 +1,75 @@
+// Copyright (C) 2015 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.google.gerrit.server.account;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.git.meta.VersionedMetaData;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.FileMode;
+
+/** User configured named destinations. */
+public class VersionedAccountDestinations extends VersionedMetaData {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static VersionedAccountDestinations forUser(Account.Id id) {
+    return new VersionedAccountDestinations(RefNames.refsUsers(id));
+  }
+
+  private final String ref;
+  private final DestinationList destinations = new DestinationList();
+
+  private VersionedAccountDestinations(String ref) {
+    this.ref = ref;
+  }
+
+  @Override
+  protected String getRefName() {
+    return ref;
+  }
+
+  public DestinationList getDestinationList() {
+    return destinations;
+  }
+
+  @Override
+  protected void onLoad() throws IOException, ConfigInvalidException {
+    if (revision == null) {
+      return;
+    }
+    String prefix = DestinationList.DIR_NAME + "/";
+    for (PathInfo p : getPathInfos(true)) {
+      if (p.fileMode == FileMode.REGULAR_FILE) {
+        String path = p.path;
+        if (path.startsWith(prefix)) {
+          String label = path.substring(prefix.length());
+          destinations.parseLabel(
+              label,
+              readUTF8(path),
+              error ->
+                  logger.atSevere().log("Error parsing file %s: %s", path, error.getMessage()));
+        }
+      }
+    }
+  }
+
+  @Override
+  protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException {
+    throw new UnsupportedOperationException("Cannot yet save destinations");
+  }
+}
diff --git a/java/com/google/gerrit/server/account/VersionedAccountQueries.java b/java/com/google/gerrit/server/account/VersionedAccountQueries.java
new file mode 100644
index 0000000..daf7100
--- /dev/null
+++ b/java/com/google/gerrit/server/account/VersionedAccountQueries.java
@@ -0,0 +1,63 @@
+// Copyright (C) 2015 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.google.gerrit.server.account;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.git.meta.VersionedMetaData;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.CommitBuilder;
+
+/** Named Queries for user accounts. */
+public class VersionedAccountQueries extends VersionedMetaData {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static VersionedAccountQueries forUser(Account.Id id) {
+    return new VersionedAccountQueries(RefNames.refsUsers(id));
+  }
+
+  private final String ref;
+  private QueryList queryList;
+
+  private VersionedAccountQueries(String ref) {
+    this.ref = ref;
+  }
+
+  @Override
+  protected String getRefName() {
+    return ref;
+  }
+
+  public QueryList getQueryList() {
+    return queryList;
+  }
+
+  @Override
+  protected void onLoad() throws IOException, ConfigInvalidException {
+    queryList =
+        QueryList.parse(
+            readUTF8(QueryList.FILE_NAME),
+            error ->
+                logger.atSevere().log(
+                    "Error parsing file %s: %s", QueryList.FILE_NAME, error.getMessage()));
+  }
+
+  @Override
+  protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException {
+    throw new UnsupportedOperationException("Cannot yet save named queries");
+  }
+}
diff --git a/java/com/google/gerrit/server/account/VersionedAuthorizedKeys.java b/java/com/google/gerrit/server/account/VersionedAuthorizedKeys.java
new file mode 100644
index 0000000..965f1ba
--- /dev/null
+++ b/java/com/google/gerrit/server/account/VersionedAuthorizedKeys.java
@@ -0,0 +1,277 @@
+// 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.
+
+package com.google.gerrit.server.account;
+
+import static com.google.common.base.Preconditions.checkState;
+import static java.util.Comparator.comparing;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Ordering;
+import com.google.gerrit.common.errors.InvalidSshKeyException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.git.meta.VersionedMetaData;
+import com.google.gerrit.server.ssh.SshKeyCreator;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Repository;
+
+/**
+ * 'authorized_keys' file in the refs/users/CD/ABCD branches of the All-Users repository.
+ *
+ * <p>The `authorized_keys' files stores the public SSH keys of the user. The file format matches
+ * the standard SSH file format, which means that each key is stored on a separate line (see
+ * https://en.wikibooks.org/wiki/OpenSSH/Client_Configuration_Files#.7E.2F.ssh.2Fauthorized_keys).
+ *
+ * <p>The order of the keys in the file determines the sequence numbers of the keys. The first line
+ * corresponds to sequence number 1.
+ *
+ * <p>Invalid keys are marked with the prefix <code># INVALID</code>.
+ *
+ * <p>To keep the sequence numbers intact when a key is deleted, a <code># DELETED</code> line is
+ * inserted at the position where the key was deleted.
+ *
+ * <p>Other comment lines are ignored on read, and are not written back when the file is modified.
+ */
+public class VersionedAuthorizedKeys extends VersionedMetaData {
+  @Singleton
+  public static class Accessor {
+    private final GitRepositoryManager repoManager;
+    private final AllUsersName allUsersName;
+    private final VersionedAuthorizedKeys.Factory authorizedKeysFactory;
+    private final Provider<MetaDataUpdate.User> metaDataUpdateFactory;
+    private final IdentifiedUser.GenericFactory userFactory;
+
+    @Inject
+    Accessor(
+        GitRepositoryManager repoManager,
+        AllUsersName allUsersName,
+        VersionedAuthorizedKeys.Factory authorizedKeysFactory,
+        Provider<MetaDataUpdate.User> metaDataUpdateFactory,
+        IdentifiedUser.GenericFactory userFactory) {
+      this.repoManager = repoManager;
+      this.allUsersName = allUsersName;
+      this.authorizedKeysFactory = authorizedKeysFactory;
+      this.metaDataUpdateFactory = metaDataUpdateFactory;
+      this.userFactory = userFactory;
+    }
+
+    public List<AccountSshKey> getKeys(Account.Id accountId)
+        throws IOException, ConfigInvalidException {
+      return read(accountId).getKeys();
+    }
+
+    public AccountSshKey getKey(Account.Id accountId, int seq)
+        throws IOException, ConfigInvalidException {
+      return read(accountId).getKey(seq);
+    }
+
+    public synchronized AccountSshKey addKey(Account.Id accountId, String pub)
+        throws IOException, ConfigInvalidException, InvalidSshKeyException {
+      VersionedAuthorizedKeys authorizedKeys = read(accountId);
+      AccountSshKey key = authorizedKeys.addKey(pub);
+      commit(authorizedKeys);
+      return key;
+    }
+
+    public synchronized void deleteKey(Account.Id accountId, int seq)
+        throws IOException, ConfigInvalidException {
+      VersionedAuthorizedKeys authorizedKeys = read(accountId);
+      if (authorizedKeys.deleteKey(seq)) {
+        commit(authorizedKeys);
+      }
+    }
+
+    public synchronized void markKeyInvalid(Account.Id accountId, int seq)
+        throws IOException, ConfigInvalidException {
+      VersionedAuthorizedKeys authorizedKeys = read(accountId);
+      if (authorizedKeys.markKeyInvalid(seq)) {
+        commit(authorizedKeys);
+      }
+    }
+
+    private VersionedAuthorizedKeys read(Account.Id accountId)
+        throws IOException, ConfigInvalidException {
+      try (Repository git = repoManager.openRepository(allUsersName)) {
+        VersionedAuthorizedKeys authorizedKeys = authorizedKeysFactory.create(accountId);
+        authorizedKeys.load(allUsersName, git);
+        return authorizedKeys;
+      }
+    }
+
+    private void commit(VersionedAuthorizedKeys authorizedKeys) throws IOException {
+      try (MetaDataUpdate md =
+          metaDataUpdateFactory
+              .get()
+              .create(allUsersName, userFactory.create(authorizedKeys.accountId))) {
+        authorizedKeys.commit(md);
+      }
+    }
+  }
+
+  public static class SimpleSshKeyCreator implements SshKeyCreator {
+    @Override
+    public AccountSshKey create(Account.Id accountId, int seq, String encoded) {
+      return AccountSshKey.create(accountId, seq, encoded);
+    }
+  }
+
+  public interface Factory {
+    VersionedAuthorizedKeys create(Account.Id accountId);
+  }
+
+  private final SshKeyCreator sshKeyCreator;
+  private final Account.Id accountId;
+  private final String ref;
+  private List<Optional<AccountSshKey>> keys;
+
+  @Inject
+  public VersionedAuthorizedKeys(SshKeyCreator sshKeyCreator, @Assisted Account.Id accountId) {
+    this.sshKeyCreator = sshKeyCreator;
+    this.accountId = accountId;
+    this.ref = RefNames.refsUsers(accountId);
+  }
+
+  @Override
+  protected String getRefName() {
+    return ref;
+  }
+
+  @Override
+  protected void onLoad() throws IOException {
+    keys = AuthorizedKeys.parse(accountId, readUTF8(AuthorizedKeys.FILE_NAME));
+  }
+
+  @Override
+  protected boolean onSave(CommitBuilder commit) throws IOException {
+    if (Strings.isNullOrEmpty(commit.getMessage())) {
+      commit.setMessage("Updated SSH keys\n");
+    }
+
+    saveUTF8(AuthorizedKeys.FILE_NAME, AuthorizedKeys.serialize(keys));
+    return true;
+  }
+
+  /** Returns all SSH keys. */
+  private List<AccountSshKey> getKeys() {
+    checkLoaded();
+    return keys.stream().filter(Optional::isPresent).map(Optional::get).collect(toList());
+  }
+
+  /**
+   * Returns the SSH key with the given sequence number.
+   *
+   * @param seq sequence number
+   * @return the SSH key, <code>null</code> if there is no SSH key with this sequence number, or if
+   *     the SSH key with this sequence number has been deleted
+   */
+  private AccountSshKey getKey(int seq) {
+    checkLoaded();
+    return keys.get(seq - 1).orElse(null);
+  }
+
+  /**
+   * Adds a new public SSH key.
+   *
+   * <p>If the specified public key exists already, the existing key is returned.
+   *
+   * @param pub the public SSH key to be added
+   * @return the new SSH key
+   * @throws InvalidSshKeyException
+   */
+  private AccountSshKey addKey(String pub) throws InvalidSshKeyException {
+    checkLoaded();
+
+    for (Optional<AccountSshKey> key : keys) {
+      if (key.isPresent() && key.get().sshPublicKey().trim().equals(pub.trim())) {
+        return key.get();
+      }
+    }
+
+    int seq = keys.size() + 1;
+    AccountSshKey key = sshKeyCreator.create(accountId, seq, pub);
+    keys.add(Optional.of(key));
+    return key;
+  }
+
+  /**
+   * Deletes the SSH key with the given sequence number.
+   *
+   * @param seq the sequence number
+   * @return <code>true</code> if a key with this sequence number was found and deleted, <code>false
+   *     </code> if no key with the given sequence number exists
+   */
+  private boolean deleteKey(int seq) {
+    checkLoaded();
+    if (seq <= keys.size() && keys.get(seq - 1).isPresent()) {
+      keys.set(seq - 1, Optional.empty());
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Marks the SSH key with the given sequence number as invalid.
+   *
+   * @param seq the sequence number
+   * @return <code>true</code> if a key with this sequence number was found and marked as invalid,
+   *     <code>false</code> if no key with the given sequence number exists or if the key was
+   *     already marked as invalid
+   */
+  private boolean markKeyInvalid(int seq) {
+    checkLoaded();
+
+    Optional<AccountSshKey> key = keys.get(seq - 1);
+    if (key.isPresent() && key.get().valid()) {
+      keys.set(seq - 1, Optional.of(AccountSshKey.createInvalid(key.get())));
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Sets new SSH keys.
+   *
+   * <p>The existing SSH keys are overwritten.
+   *
+   * @param newKeys the new public SSH keys
+   */
+  public void setKeys(Collection<AccountSshKey> newKeys) {
+    Ordering<AccountSshKey> o = Ordering.from(comparing(AccountSshKey::seq));
+    keys = new ArrayList<>(Collections.nCopies(o.max(newKeys).seq(), Optional.empty()));
+    for (AccountSshKey key : newKeys) {
+      keys.set(key.seq() - 1, Optional.of(key));
+    }
+  }
+
+  private void checkLoaded() {
+    checkState(keys != null, "SSH keys not loaded yet");
+  }
+}
diff --git a/java/com/google/gerrit/server/account/externalids/AllExternalIds.java b/java/com/google/gerrit/server/account/externalids/AllExternalIds.java
new file mode 100644
index 0000000..8b23f6c
--- /dev/null
+++ b/java/com/google/gerrit/server/account/externalids/AllExternalIds.java
@@ -0,0 +1,107 @@
+// 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.
+
+package com.google.gerrit.server.account.externalids;
+
+import static com.google.common.collect.ImmutableSetMultimap.toImmutableSetMultimap;
+import static java.util.stream.Collectors.toList;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableSetMultimap;
+import com.google.common.collect.SetMultimap;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.cache.proto.Cache.AllExternalIdsProto;
+import com.google.gerrit.server.cache.proto.Cache.AllExternalIdsProto.ExternalIdProto;
+import com.google.gerrit.server.cache.serialize.CacheSerializer;
+import com.google.gerrit.server.cache.serialize.ProtoCacheSerializers;
+import com.google.gerrit.server.cache.serialize.ProtoCacheSerializers.ObjectIdConverter;
+import java.util.Collection;
+
+/** Cache value containing all external IDs. */
+@AutoValue
+public abstract class AllExternalIds {
+  static AllExternalIds create(SetMultimap<Account.Id, ExternalId> byAccount) {
+    return new AutoValue_AllExternalIds(
+        ImmutableSetMultimap.copyOf(byAccount), byEmailCopy(byAccount.values()));
+  }
+
+  static AllExternalIds create(Collection<ExternalId> externalIds) {
+    return new AutoValue_AllExternalIds(
+        externalIds.stream().collect(toImmutableSetMultimap(e -> e.accountId(), e -> e)),
+        byEmailCopy(externalIds));
+  }
+
+  private static ImmutableSetMultimap<String, ExternalId> byEmailCopy(
+      Collection<ExternalId> externalIds) {
+    return externalIds.stream()
+        .filter(e -> !Strings.isNullOrEmpty(e.email()))
+        .collect(toImmutableSetMultimap(e -> e.email(), e -> e));
+  }
+
+  public abstract ImmutableSetMultimap<Account.Id, ExternalId> byAccount();
+
+  public abstract ImmutableSetMultimap<String, ExternalId> byEmail();
+
+  enum Serializer implements CacheSerializer<AllExternalIds> {
+    INSTANCE;
+
+    @Override
+    public byte[] serialize(AllExternalIds object) {
+      ObjectIdConverter idConverter = ObjectIdConverter.create();
+      AllExternalIdsProto.Builder allBuilder = AllExternalIdsProto.newBuilder();
+      object.byAccount().values().stream()
+          .map(extId -> toProto(idConverter, extId))
+          .forEach(allBuilder::addExternalId);
+      return ProtoCacheSerializers.toByteArray(allBuilder.build());
+    }
+
+    private static ExternalIdProto toProto(ObjectIdConverter idConverter, ExternalId externalId) {
+      ExternalIdProto.Builder b =
+          ExternalIdProto.newBuilder()
+              .setKey(externalId.key().get())
+              .setAccountId(externalId.accountId().get());
+      if (externalId.email() != null) {
+        b.setEmail(externalId.email());
+      }
+      if (externalId.password() != null) {
+        b.setPassword(externalId.password());
+      }
+      if (externalId.blobId() != null) {
+        b.setBlobId(idConverter.toByteString(externalId.blobId()));
+      }
+      return b.build();
+    }
+
+    @Override
+    public AllExternalIds deserialize(byte[] in) {
+      ObjectIdConverter idConverter = ObjectIdConverter.create();
+      return create(
+          ProtoCacheSerializers.parseUnchecked(AllExternalIdsProto.parser(), in).getExternalIdList()
+              .stream()
+              .map(proto -> toExternalId(idConverter, proto))
+              .collect(toList()));
+    }
+
+    private static ExternalId toExternalId(ObjectIdConverter idConverter, ExternalIdProto proto) {
+      return ExternalId.create(
+          ExternalId.Key.parse(proto.getKey()),
+          new Account.Id(proto.getAccountId()),
+          // ExternalId treats null and empty strings the same, so no need to distinguish here.
+          proto.getEmail(),
+          proto.getPassword(),
+          !proto.getBlobId().isEmpty() ? idConverter.fromByteString(proto.getBlobId()) : null);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/account/externalids/DisabledExternalIdCache.java b/java/com/google/gerrit/server/account/externalids/DisabledExternalIdCache.java
new file mode 100644
index 0000000..5894051
--- /dev/null
+++ b/java/com/google/gerrit/server/account/externalids/DisabledExternalIdCache.java
@@ -0,0 +1,68 @@
+// Copyright (C) 2017 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.google.gerrit.server.account.externalids;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableSetMultimap;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.inject.AbstractModule;
+import com.google.inject.Module;
+import java.io.IOException;
+import java.util.Collection;
+import org.eclipse.jgit.lib.ObjectId;
+
+public class DisabledExternalIdCache implements ExternalIdCache {
+  public static Module module() {
+    return new AbstractModule() {
+
+      @Override
+      protected void configure() {
+        bind(ExternalIdCache.class).to(DisabledExternalIdCache.class);
+      }
+    };
+  }
+
+  @Override
+  public void onReplace(
+      ObjectId oldNotesRev,
+      ObjectId newNotesRev,
+      Collection<ExternalId> toRemove,
+      Collection<ExternalId> toAdd) {}
+
+  @Override
+  public ImmutableSet<ExternalId> byAccount(Account.Id accountId) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public ImmutableSet<ExternalId> byAccount(Account.Id accountId, ObjectId rev) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public ImmutableSetMultimap<Account.Id, ExternalId> allByAccount() throws IOException {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public ImmutableSetMultimap<String, ExternalId> byEmails(String... emails) throws IOException {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public ImmutableSetMultimap<String, ExternalId> allByEmail() throws IOException {
+    throw new UnsupportedOperationException();
+  }
+}
diff --git a/java/com/google/gerrit/server/account/externalids/DuplicateExternalIdKeyException.java b/java/com/google/gerrit/server/account/externalids/DuplicateExternalIdKeyException.java
new file mode 100644
index 0000000..b4c82d0
--- /dev/null
+++ b/java/com/google/gerrit/server/account/externalids/DuplicateExternalIdKeyException.java
@@ -0,0 +1,36 @@
+// Copyright (C) 2017 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.google.gerrit.server.account.externalids;
+
+import com.google.gwtorm.server.OrmDuplicateKeyException;
+
+/**
+ * Exception that is thrown if an external ID cannot be inserted because an external ID with the
+ * same key already exists.
+ */
+public class DuplicateExternalIdKeyException extends OrmDuplicateKeyException {
+  private static final long serialVersionUID = 1L;
+
+  private final ExternalId.Key duplicateKey;
+
+  public DuplicateExternalIdKeyException(ExternalId.Key duplicateKey) {
+    super("Duplicate external ID key: " + duplicateKey.get());
+    this.duplicateKey = duplicateKey;
+  }
+
+  public ExternalId.Key getDuplicateKey() {
+    return duplicateKey;
+  }
+}
diff --git a/java/com/google/gerrit/server/account/externalids/ExternalId.java b/java/com/google/gerrit/server/account/externalids/ExternalId.java
new file mode 100644
index 0000000..c363b5b
--- /dev/null
+++ b/java/com/google/gerrit/server/account/externalids/ExternalId.java
@@ -0,0 +1,500 @@
+// 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.
+
+package com.google.gerrit.server.account.externalids;
+
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.collect.ImmutableSet.toImmutableSet;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Objects.requireNonNull;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.hash.Hashing;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.client.AuthType;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.account.HashedPassword;
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.regex.Pattern;
+import java.util.stream.Stream;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+
+@AutoValue
+public abstract class ExternalId implements Serializable {
+  // If these regular expressions are modified the same modifications should be done to the
+  // corresponding regular expressions in the
+  // com.google.gerrit.client.account.UsernameField class.
+  private static final String USER_NAME_PATTERN_FIRST_REGEX = "[a-zA-Z0-9]";
+  private static final String USER_NAME_PATTERN_REST_REGEX = "[a-zA-Z0-9.!#$%&’*+=?^_`\\{|\\}~@-]";
+  private static final String USER_NAME_PATTERN_LAST_REGEX = "[a-zA-Z0-9]";
+
+  /** Regular expression that a username must match. */
+  private static final String USER_NAME_PATTERN_REGEX =
+      "^("
+          + //
+          USER_NAME_PATTERN_FIRST_REGEX
+          + //
+          USER_NAME_PATTERN_REST_REGEX
+          + "*"
+          + //
+          USER_NAME_PATTERN_LAST_REGEX
+          + //
+          "|"
+          + //
+          USER_NAME_PATTERN_FIRST_REGEX
+          + //
+          ")$";
+
+  private static final Pattern USER_NAME_PATTERN = Pattern.compile(USER_NAME_PATTERN_REGEX);
+
+  public static boolean isValidUsername(String username) {
+    return USER_NAME_PATTERN.matcher(username).matches();
+  }
+
+  /**
+   * Returns the ID of the first external ID from the provided external IDs that has the {@link
+   * ExternalId#SCHEME_USERNAME} scheme.
+   *
+   * @param extIds external IDs
+   * @return the ID of the first external ID from the provided external IDs that has the {@link
+   *     ExternalId#SCHEME_USERNAME} scheme
+   */
+  public static Optional<String> getUserName(Collection<ExternalId> extIds) {
+    return extIds.stream()
+        .filter(e -> e.isScheme(SCHEME_USERNAME))
+        .map(e -> e.key().id())
+        .filter(u -> !Strings.isNullOrEmpty(u))
+        .findFirst();
+  }
+
+  /**
+   * Returns all IDs of the provided external IDs that have the {@link ExternalId#SCHEME_MAILTO}
+   * scheme as a distinct stream.
+   *
+   * @param extIds external IDs
+   * @return distinct stream of all IDs of the provided external IDs that have the {@link
+   *     ExternalId#SCHEME_MAILTO} scheme
+   */
+  public static Stream<String> getEmails(Collection<ExternalId> extIds) {
+    return extIds.stream().filter(e -> e.isScheme(SCHEME_MAILTO)).map(e -> e.key().id()).distinct();
+  }
+
+  private static final long serialVersionUID = 1L;
+
+  private static final String EXTERNAL_ID_SECTION = "externalId";
+  private static final String ACCOUNT_ID_KEY = "accountId";
+  private static final String EMAIL_KEY = "email";
+  private static final String PASSWORD_KEY = "password";
+
+  /**
+   * Scheme used for {@link AuthType#LDAP}, {@link AuthType#CLIENT_SSL_CERT_LDAP}, {@link
+   * AuthType#HTTP_LDAP}, and {@link AuthType#LDAP_BIND} usernames.
+   *
+   * <p>The name {@code gerrit:} was a very poor choice.
+   *
+   * <p>Scheme names must not contain colons (':').
+   */
+  public static final String SCHEME_GERRIT = "gerrit";
+
+  /** Scheme used for randomly created identities constructed by a UUID. */
+  public static final String SCHEME_UUID = "uuid";
+
+  /** Scheme used to represent only an email address. */
+  public static final String SCHEME_MAILTO = "mailto";
+
+  /** Scheme for the username used to authenticate an account, e.g. over SSH. */
+  public static final String SCHEME_USERNAME = "username";
+
+  /** Scheme used for GPG public keys. */
+  public static final String SCHEME_GPGKEY = "gpgkey";
+
+  /** Scheme for external auth used during authentication, e.g. OAuth Token */
+  public static final String SCHEME_EXTERNAL = "external";
+
+  @AutoValue
+  public abstract static class Key implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * Creates an external ID key.
+     *
+     * @param scheme the scheme name, must not contain colons (':'), can be {@code null}
+     * @param id the external ID, must not contain colons (':')
+     * @return the created external ID key
+     */
+    public static Key create(@Nullable String scheme, String id) {
+      return new AutoValue_ExternalId_Key(Strings.emptyToNull(scheme), id);
+    }
+
+    /**
+     * Parses an external ID key from a string in the format "scheme:id" or "id".
+     *
+     * @return the parsed external ID key
+     */
+    public static Key parse(String externalId) {
+      int c = externalId.indexOf(':');
+      if (c < 1 || c >= externalId.length() - 1) {
+        return create(null, externalId);
+      }
+      return create(externalId.substring(0, c), externalId.substring(c + 1));
+    }
+
+    public abstract @Nullable String scheme();
+
+    public abstract String id();
+
+    public boolean isScheme(String scheme) {
+      return scheme.equals(scheme());
+    }
+
+    /**
+     * Returns the SHA1 of the external ID that is used as note ID in the refs/meta/external-ids
+     * notes branch.
+     */
+    @SuppressWarnings("deprecation") // Use Hashing.sha1 for compatibility.
+    public ObjectId sha1() {
+      return ObjectId.fromRaw(Hashing.sha1().hashString(get(), UTF_8).asBytes());
+    }
+
+    /**
+     * Exports this external ID key as string with the format "scheme:id", or "id" if scheme is
+     * null.
+     *
+     * <p>This string representation is used as subsection name in the Git config file that stores
+     * the external ID.
+     */
+    public String get() {
+      if (scheme() != null) {
+        return scheme() + ":" + id();
+      }
+      return id();
+    }
+
+    @Override
+    public String toString() {
+      return get();
+    }
+
+    public static ImmutableSet<ExternalId.Key> from(Collection<ExternalId> extIds) {
+      return extIds.stream().map(ExternalId::key).collect(toImmutableSet());
+    }
+  }
+
+  /**
+   * Creates an external ID.
+   *
+   * @param scheme the scheme name, must not contain colons (':')
+   * @param id the external ID, must not contain colons (':')
+   * @param accountId the ID of the account to which the external ID belongs
+   * @return the created external ID
+   */
+  public static ExternalId create(String scheme, String id, Account.Id accountId) {
+    return create(Key.create(scheme, id), accountId, null, null);
+  }
+
+  /**
+   * Creates an external ID.
+   *
+   * @param scheme the scheme name, must not contain colons (':')
+   * @param id the external ID, must not contain colons (':')
+   * @param accountId the ID of the account to which the external ID belongs
+   * @param email the email of the external ID, may be {@code null}
+   * @param hashedPassword the hashed password of the external ID, may be {@code null}
+   * @return the created external ID
+   */
+  public static ExternalId create(
+      String scheme,
+      String id,
+      Account.Id accountId,
+      @Nullable String email,
+      @Nullable String hashedPassword) {
+    return create(Key.create(scheme, id), accountId, email, hashedPassword);
+  }
+
+  public static ExternalId create(Key key, Account.Id accountId) {
+    return create(key, accountId, null, null);
+  }
+
+  public static ExternalId create(
+      Key key, Account.Id accountId, @Nullable String email, @Nullable String hashedPassword) {
+    return create(
+        key, accountId, Strings.emptyToNull(email), Strings.emptyToNull(hashedPassword), null);
+  }
+
+  public static ExternalId createWithPassword(
+      Key key, Account.Id accountId, @Nullable String email, @Nullable String plainPassword) {
+    plainPassword = Strings.emptyToNull(plainPassword);
+    String hashedPassword =
+        plainPassword != null ? HashedPassword.fromPassword(plainPassword).encode() : null;
+    return create(key, accountId, email, hashedPassword);
+  }
+
+  /**
+   * Create a external ID for a username (scheme "username").
+   *
+   * @param id the external ID, must not contain colons (':')
+   * @param accountId the ID of the account to which the external ID belongs
+   * @param plainPassword the plain HTTP password, may be {@code null}
+   * @return the created external ID
+   */
+  public static ExternalId createUsername(
+      String id, Account.Id accountId, @Nullable String plainPassword) {
+    return createWithPassword(Key.create(SCHEME_USERNAME, id), accountId, null, plainPassword);
+  }
+
+  /**
+   * Creates an external ID with an email.
+   *
+   * @param scheme the scheme name, must not contain colons (':')
+   * @param id the external ID, must not contain colons (':')
+   * @param accountId the ID of the account to which the external ID belongs
+   * @param email the email of the external ID, may be {@code null}
+   * @return the created external ID
+   */
+  public static ExternalId createWithEmail(
+      String scheme, String id, Account.Id accountId, @Nullable String email) {
+    return createWithEmail(Key.create(scheme, id), accountId, email);
+  }
+
+  public static ExternalId createWithEmail(Key key, Account.Id accountId, @Nullable String email) {
+    return create(key, accountId, Strings.emptyToNull(email), null);
+  }
+
+  public static ExternalId createEmail(Account.Id accountId, String email) {
+    return createWithEmail(SCHEME_MAILTO, email, accountId, requireNonNull(email));
+  }
+
+  static ExternalId create(ExternalId extId, @Nullable ObjectId blobId) {
+    return new AutoValue_ExternalId(
+        extId.key(), extId.accountId(), extId.email(), extId.password(), blobId);
+  }
+
+  @VisibleForTesting
+  public static ExternalId create(
+      Key key,
+      Account.Id accountId,
+      @Nullable String email,
+      @Nullable String hashedPassword,
+      @Nullable ObjectId blobId) {
+    return new AutoValue_ExternalId(
+        key, accountId, Strings.emptyToNull(email), Strings.emptyToNull(hashedPassword), blobId);
+  }
+
+  /**
+   * Parses an external ID from a byte array that contain the external ID as an Git config file
+   * text.
+   *
+   * <p>The Git config must have exactly one externalId subsection with an accountId and optionally
+   * email and password:
+   *
+   * <pre>
+   * [externalId "username:jdoe"]
+   *   accountId = 1003407
+   *   email = jdoe@example.com
+   *   password = bcrypt:4:LCbmSBDivK/hhGVQMfkDpA==:XcWn0pKYSVU/UJgOvhidkEtmqCp6oKB7
+   * </pre>
+   */
+  public static ExternalId parse(String noteId, byte[] raw, ObjectId blobId)
+      throws ConfigInvalidException {
+    Config externalIdConfig = new Config();
+    try {
+      externalIdConfig.fromText(new String(raw, UTF_8));
+    } catch (ConfigInvalidException e) {
+      throw invalidConfig(noteId, e.getMessage());
+    }
+
+    return parse(noteId, externalIdConfig, blobId);
+  }
+
+  public static ExternalId parse(String noteId, Config externalIdConfig, ObjectId blobId)
+      throws ConfigInvalidException {
+    requireNonNull(blobId);
+
+    Set<String> externalIdKeys = externalIdConfig.getSubsections(EXTERNAL_ID_SECTION);
+    if (externalIdKeys.size() != 1) {
+      throw invalidConfig(
+          noteId,
+          String.format(
+              "Expected exactly 1 '%s' section, found %d",
+              EXTERNAL_ID_SECTION, externalIdKeys.size()));
+    }
+
+    String externalIdKeyStr = Iterables.getOnlyElement(externalIdKeys);
+    Key externalIdKey = Key.parse(externalIdKeyStr);
+    if (externalIdKey == null) {
+      throw invalidConfig(noteId, String.format("External ID %s is invalid", externalIdKeyStr));
+    }
+
+    if (!externalIdKey.sha1().getName().equals(noteId)) {
+      throw invalidConfig(
+          noteId,
+          String.format(
+              "SHA1 of external ID '%s' does not match note ID '%s'", externalIdKeyStr, noteId));
+    }
+
+    String email = externalIdConfig.getString(EXTERNAL_ID_SECTION, externalIdKeyStr, EMAIL_KEY);
+    String password =
+        externalIdConfig.getString(EXTERNAL_ID_SECTION, externalIdKeyStr, PASSWORD_KEY);
+    int accountId = readAccountId(noteId, externalIdConfig, externalIdKeyStr);
+
+    return create(
+        externalIdKey,
+        new Account.Id(accountId),
+        Strings.emptyToNull(email),
+        Strings.emptyToNull(password),
+        blobId);
+  }
+
+  private static int readAccountId(String noteId, Config externalIdConfig, String externalIdKeyStr)
+      throws ConfigInvalidException {
+    String accountIdStr =
+        externalIdConfig.getString(EXTERNAL_ID_SECTION, externalIdKeyStr, ACCOUNT_ID_KEY);
+    if (accountIdStr == null) {
+      throw invalidConfig(
+          noteId,
+          String.format(
+              "Value for '%s.%s.%s' is missing, expected account ID",
+              EXTERNAL_ID_SECTION, externalIdKeyStr, ACCOUNT_ID_KEY));
+    }
+
+    try {
+      int accountId =
+          externalIdConfig.getInt(EXTERNAL_ID_SECTION, externalIdKeyStr, ACCOUNT_ID_KEY, -1);
+      if (accountId < 0) {
+        throw invalidConfig(
+            noteId,
+            String.format(
+                "Value %s for '%s.%s.%s' is invalid, expected account ID",
+                accountIdStr, EXTERNAL_ID_SECTION, externalIdKeyStr, ACCOUNT_ID_KEY));
+      }
+      return accountId;
+    } catch (IllegalArgumentException e) {
+      throw invalidConfig(
+          noteId,
+          String.format(
+              "Value %s for '%s.%s.%s' is invalid, expected account ID",
+              accountIdStr, EXTERNAL_ID_SECTION, externalIdKeyStr, ACCOUNT_ID_KEY));
+    }
+  }
+
+  private static ConfigInvalidException invalidConfig(String noteId, String message) {
+    return new ConfigInvalidException(
+        String.format("Invalid external ID config for note '%s': %s", noteId, message));
+  }
+
+  public abstract Key key();
+
+  public abstract Account.Id accountId();
+
+  public abstract @Nullable String email();
+
+  public abstract @Nullable String password();
+
+  /**
+   * ID of the note blob in the external IDs branch that stores this external ID. {@code null} if
+   * the external ID was created in code and is not yet stored in Git.
+   */
+  public abstract @Nullable ObjectId blobId();
+
+  public void checkThatBlobIdIsSet() {
+    checkState(blobId() != null, "No blob ID set for external ID %s", key().get());
+  }
+
+  public boolean isScheme(String scheme) {
+    return key().isScheme(scheme);
+  }
+
+  public byte[] toByteArray() {
+    checkState(blobId() != null, "Missing blobId in external ID %s", key().get());
+    byte[] b = new byte[2 * Constants.OBJECT_ID_STRING_LENGTH + 1];
+    key().sha1().copyTo(b, 0);
+    b[Constants.OBJECT_ID_STRING_LENGTH] = ':';
+    blobId().copyTo(b, Constants.OBJECT_ID_STRING_LENGTH + 1);
+    return b;
+  }
+
+  /**
+   * For checking if two external IDs are equals the blobId is excluded and external IDs that have
+   * different blob IDs but identical other fields are considered equal. This way an external ID
+   * that was loaded from Git can be equal with an external ID that was created from code.
+   */
+  @Override
+  public boolean equals(Object obj) {
+    if (!(obj instanceof ExternalId)) {
+      return false;
+    }
+    ExternalId o = (ExternalId) obj;
+    return Objects.equals(key(), o.key())
+        && Objects.equals(accountId(), o.accountId())
+        && Objects.equals(email(), o.email())
+        && Objects.equals(password(), o.password());
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(key(), accountId(), email(), password());
+  }
+
+  /**
+   * Exports this external ID as Git config file text.
+   *
+   * <p>The Git config has exactly one externalId subsection with an accountId and optionally email
+   * and password:
+   *
+   * <pre>
+   * [externalId "username:jdoe"]
+   *   accountId = 1003407
+   *   email = jdoe@example.com
+   *   password = bcrypt:4:LCbmSBDivK/hhGVQMfkDpA==:XcWn0pKYSVU/UJgOvhidkEtmqCp6oKB7
+   * </pre>
+   */
+  @Override
+  public String toString() {
+    Config c = new Config();
+    writeToConfig(c);
+    return c.toText();
+  }
+
+  public void writeToConfig(Config c) {
+    String externalIdKey = key().get();
+    // Do not use c.setInt(...) to write the account ID because c.setInt(...) persists integers
+    // that can be expressed in KiB as a unit strings, e.g. "1024000" is stored as "100k". Using
+    // c.setString(...) ensures that account IDs are human readable.
+    c.setString(
+        EXTERNAL_ID_SECTION, externalIdKey, ACCOUNT_ID_KEY, Integer.toString(accountId().get()));
+
+    if (email() != null) {
+      c.setString(EXTERNAL_ID_SECTION, externalIdKey, EMAIL_KEY, email());
+    } else {
+      c.unset(EXTERNAL_ID_SECTION, externalIdKey, EMAIL_KEY);
+    }
+
+    if (password() != null) {
+      c.setString(EXTERNAL_ID_SECTION, externalIdKey, PASSWORD_KEY, password());
+    } else {
+      c.unset(EXTERNAL_ID_SECTION, externalIdKey, PASSWORD_KEY);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/account/externalids/ExternalIdCache.java b/java/com/google/gerrit/server/account/externalids/ExternalIdCache.java
new file mode 100644
index 0000000..1ac737e
--- /dev/null
+++ b/java/com/google/gerrit/server/account/externalids/ExternalIdCache.java
@@ -0,0 +1,52 @@
+// 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.
+
+package com.google.gerrit.server.account.externalids;
+
+import com.google.common.collect.SetMultimap;
+import com.google.gerrit.reviewdb.client.Account;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Set;
+import org.eclipse.jgit.lib.ObjectId;
+
+/**
+ * Caches external IDs of all accounts.
+ *
+ * <p>On each cache access the SHA1 of the refs/meta/external-ids branch is read to verify that the
+ * cache is up to date.
+ *
+ * <p>All returned collections are unmodifiable.
+ */
+interface ExternalIdCache {
+  void onReplace(
+      ObjectId oldNotesRev,
+      ObjectId newNotesRev,
+      Collection<ExternalId> toRemove,
+      Collection<ExternalId> toAdd);
+
+  Set<ExternalId> byAccount(Account.Id accountId) throws IOException;
+
+  Set<ExternalId> byAccount(Account.Id accountId, ObjectId rev) throws IOException;
+
+  SetMultimap<Account.Id, ExternalId> allByAccount() throws IOException;
+
+  SetMultimap<String, ExternalId> byEmails(String... emails) throws IOException;
+
+  SetMultimap<String, ExternalId> allByEmail() throws IOException;
+
+  default Set<ExternalId> byEmail(String email) throws IOException {
+    return byEmails(email).get(email);
+  }
+}
diff --git a/java/com/google/gerrit/server/account/externalids/ExternalIdCacheImpl.java b/java/com/google/gerrit/server/account/externalids/ExternalIdCacheImpl.java
new file mode 100644
index 0000000..767bfd5
--- /dev/null
+++ b/java/com/google/gerrit/server/account/externalids/ExternalIdCacheImpl.java
@@ -0,0 +1,163 @@
+// 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.
+
+package com.google.gerrit.server.account.externalids;
+
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableSetMultimap;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.collect.SetMultimap;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.logging.TraceContext;
+import com.google.gerrit.server.logging.TraceContext.TraceTimer;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.google.inject.name.Named;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+import java.util.function.Consumer;
+import org.eclipse.jgit.lib.ObjectId;
+
+/** Caches external IDs of all accounts. The external IDs are always loaded from NoteDb. */
+@Singleton
+class ExternalIdCacheImpl implements ExternalIdCache {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static final String CACHE_NAME = "external_ids_map";
+
+  private final LoadingCache<ObjectId, AllExternalIds> extIdsByAccount;
+  private final ExternalIdReader externalIdReader;
+  private final Lock lock;
+
+  @Inject
+  ExternalIdCacheImpl(
+      @Named(CACHE_NAME) LoadingCache<ObjectId, AllExternalIds> extIdsByAccount,
+      ExternalIdReader externalIdReader) {
+    this.extIdsByAccount = extIdsByAccount;
+    this.externalIdReader = externalIdReader;
+    this.lock = new ReentrantLock(true /* fair */);
+  }
+
+  @Override
+  public void onReplace(
+      ObjectId oldNotesRev,
+      ObjectId newNotesRev,
+      Collection<ExternalId> toRemove,
+      Collection<ExternalId> toAdd) {
+    updateCache(
+        oldNotesRev,
+        newNotesRev,
+        m -> {
+          for (ExternalId extId : toRemove) {
+            m.remove(extId.accountId(), extId);
+          }
+          for (ExternalId extId : toAdd) {
+            extId.checkThatBlobIdIsSet();
+            m.put(extId.accountId(), extId);
+          }
+        });
+  }
+
+  @Override
+  public Set<ExternalId> byAccount(Account.Id accountId) throws IOException {
+    return get().byAccount().get(accountId);
+  }
+
+  @Override
+  public Set<ExternalId> byAccount(Account.Id accountId, ObjectId rev) throws IOException {
+    return get(rev).byAccount().get(accountId);
+  }
+
+  @Override
+  public SetMultimap<Account.Id, ExternalId> allByAccount() throws IOException {
+    return get().byAccount();
+  }
+
+  @Override
+  public SetMultimap<String, ExternalId> byEmails(String... emails) throws IOException {
+    AllExternalIds allExternalIds = get();
+    ImmutableSetMultimap.Builder<String, ExternalId> byEmails = ImmutableSetMultimap.builder();
+    for (String email : emails) {
+      byEmails.putAll(email, allExternalIds.byEmail().get(email));
+    }
+    return byEmails.build();
+  }
+
+  @Override
+  public SetMultimap<String, ExternalId> allByEmail() throws IOException {
+    return get().byEmail();
+  }
+
+  private AllExternalIds get() throws IOException {
+    return get(externalIdReader.readRevision());
+  }
+
+  private AllExternalIds get(ObjectId rev) throws IOException {
+    try {
+      return extIdsByAccount.get(rev);
+    } catch (ExecutionException e) {
+      throw new IOException("Cannot load external ids", e);
+    }
+  }
+
+  private void updateCache(
+      ObjectId oldNotesRev,
+      ObjectId newNotesRev,
+      Consumer<SetMultimap<Account.Id, ExternalId>> update) {
+    lock.lock();
+    try {
+      SetMultimap<Account.Id, ExternalId> m;
+      if (!ObjectId.zeroId().equals(oldNotesRev)) {
+        m =
+            MultimapBuilder.hashKeys()
+                .hashSetValues()
+                .build(extIdsByAccount.get(oldNotesRev).byAccount());
+      } else {
+        m = MultimapBuilder.hashKeys().hashSetValues().build();
+      }
+      update.accept(m);
+      extIdsByAccount.put(newNotesRev, AllExternalIds.create(m));
+    } catch (ExecutionException e) {
+      logger.atWarning().withCause(e).log("Cannot update external IDs");
+    } finally {
+      lock.unlock();
+    }
+  }
+
+  static class Loader extends CacheLoader<ObjectId, AllExternalIds> {
+    private final ExternalIdReader externalIdReader;
+
+    @Inject
+    Loader(ExternalIdReader externalIdReader) {
+      this.externalIdReader = externalIdReader;
+    }
+
+    @Override
+    public AllExternalIds load(ObjectId notesRev) throws Exception {
+      try (TraceTimer timer =
+          TraceContext.newTimer("Loading external IDs (revision=%s)", notesRev)) {
+        ImmutableSet<ExternalId> externalIds = externalIdReader.all(notesRev);
+        externalIds.forEach(ExternalId::checkThatBlobIdIsSet);
+        return AllExternalIds.create(externalIds);
+      }
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/account/externalids/ExternalIdModule.java b/java/com/google/gerrit/server/account/externalids/ExternalIdModule.java
new file mode 100644
index 0000000..fc311e7
--- /dev/null
+++ b/java/com/google/gerrit/server/account/externalids/ExternalIdModule.java
@@ -0,0 +1,45 @@
+// Copyright (C) 2017 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.google.gerrit.server.account.externalids;
+
+import com.google.gerrit.server.account.externalids.ExternalIdCacheImpl.Loader;
+import com.google.gerrit.server.cache.CacheModule;
+import com.google.gerrit.server.cache.serialize.ObjectIdCacheSerializer;
+import com.google.inject.TypeLiteral;
+import java.time.Duration;
+import org.eclipse.jgit.lib.ObjectId;
+
+public class ExternalIdModule extends CacheModule {
+  @Override
+  protected void configure() {
+    persist(ExternalIdCacheImpl.CACHE_NAME, ObjectId.class, new TypeLiteral<AllExternalIds>() {})
+        // The cached data is potentially pretty large and we are always only interested
+        // in the latest value. However, due to a race condition, it is possible for different
+        // threads to observe different values of the meta ref, and hence request different keys
+        // from the cache. Extend the cache size by 1 to cover this case, but expire the extra
+        // object after a short period of time, since it may be a potentially large amount of
+        // memory.
+        .maximumWeight(2)
+        .expireFromMemoryAfterAccess(Duration.ofMinutes(1))
+        .loader(Loader.class)
+        .diskLimit(-1)
+        .version(1)
+        .keySerializer(ObjectIdCacheSerializer.INSTANCE)
+        .valueSerializer(AllExternalIds.Serializer.INSTANCE);
+
+    bind(ExternalIdCacheImpl.class);
+    bind(ExternalIdCache.class).to(ExternalIdCacheImpl.class);
+  }
+}
diff --git a/java/com/google/gerrit/server/account/externalids/ExternalIdNotes.java b/java/com/google/gerrit/server/account/externalids/ExternalIdNotes.java
new file mode 100644
index 0000000..76e7f81
--- /dev/null
+++ b/java/com/google/gerrit/server/account/externalids/ExternalIdNotes.java
@@ -0,0 +1,974 @@
+// Copyright (C) 2017 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.google.gerrit.server.account.externalids;
+
+import static com.google.common.base.Preconditions.checkState;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Objects.requireNonNull;
+import static java.util.stream.Collectors.joining;
+import static java.util.stream.Collectors.toSet;
+import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Sets;
+import com.google.common.collect.Streams;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.metrics.Counter0;
+import com.google.gerrit.metrics.Description;
+import com.google.gerrit.metrics.DisabledMetricMaker;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.git.meta.VersionedMetaData;
+import com.google.gerrit.server.index.account.AccountIndexer;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.BlobBasedConfig;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.notes.Note;
+import org.eclipse.jgit.notes.NoteMap;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevTree;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+/**
+ * {@link VersionedMetaData} subclass to update external IDs.
+ *
+ * <p>This is a low-level API. Read/write of external IDs should be done through {@link
+ * com.google.gerrit.server.account.AccountsUpdate} or {@link
+ * com.google.gerrit.server.account.AccountConfig}.
+ *
+ * <p>On load the note map from {@code refs/meta/external-ids} is read, but the external IDs are not
+ * parsed yet (see {@link #onLoad()}).
+ *
+ * <p>After loading the note map callers can access single or all external IDs. Only now the
+ * requested external IDs are parsed.
+ *
+ * <p>After loading the note map callers can stage various external ID updates (insert, upsert,
+ * delete, replace).
+ *
+ * <p>On save the staged external ID updates are performed (see {@link #onSave(CommitBuilder)}).
+ *
+ * <p>After committing the external IDs a cache update can be requested which also reindexes the
+ * accounts for which external IDs have been updated (see {@link #updateCaches()}).
+ */
+public class ExternalIdNotes extends VersionedMetaData {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final int MAX_NOTE_SZ = 1 << 19;
+
+  public interface ExternalIdNotesLoader {
+    /**
+     * Loads the external ID notes from the current tip of the {@code refs/meta/external-ids}
+     * branch.
+     *
+     * @param allUsersRepo the All-Users repository
+     */
+    ExternalIdNotes load(Repository allUsersRepo) throws IOException, ConfigInvalidException;
+
+    /**
+     * Loads the external ID notes from the specified revision of the {@code refs/meta/external-ids}
+     * branch.
+     *
+     * @param allUsersRepo the All-Users repository
+     * @param rev the revision from which the external ID notes should be loaded, if {@code null}
+     *     the external ID notes are loaded from the current tip, if {@link ObjectId#zeroId()} it's
+     *     assumed that the {@code refs/meta/external-ids} branch doesn't exist and the loaded
+     *     external IDs will be empty
+     */
+    ExternalIdNotes load(Repository allUsersRepo, @Nullable ObjectId rev)
+        throws IOException, ConfigInvalidException;
+  }
+
+  @Singleton
+  public static class Factory implements ExternalIdNotesLoader {
+    private final ExternalIdCache externalIdCache;
+    private final AccountCache accountCache;
+    private final Provider<AccountIndexer> accountIndexer;
+    private final MetricMaker metricMaker;
+    private final AllUsersName allUsersName;
+
+    @Inject
+    Factory(
+        ExternalIdCache externalIdCache,
+        AccountCache accountCache,
+        Provider<AccountIndexer> accountIndexer,
+        MetricMaker metricMaker,
+        AllUsersName allUsersName) {
+      this.externalIdCache = externalIdCache;
+      this.accountCache = accountCache;
+      this.accountIndexer = accountIndexer;
+      this.metricMaker = metricMaker;
+      this.allUsersName = allUsersName;
+    }
+
+    @Override
+    public ExternalIdNotes load(Repository allUsersRepo)
+        throws IOException, ConfigInvalidException {
+      return new ExternalIdNotes(
+              externalIdCache,
+              accountCache,
+              accountIndexer,
+              metricMaker,
+              allUsersName,
+              allUsersRepo)
+          .load();
+    }
+
+    @Override
+    public ExternalIdNotes load(Repository allUsersRepo, @Nullable ObjectId rev)
+        throws IOException, ConfigInvalidException {
+      return new ExternalIdNotes(
+              externalIdCache,
+              accountCache,
+              accountIndexer,
+              metricMaker,
+              allUsersName,
+              allUsersRepo)
+          .load(rev);
+    }
+  }
+
+  @Singleton
+  public static class FactoryNoReindex implements ExternalIdNotesLoader {
+    private final ExternalIdCache externalIdCache;
+    private final MetricMaker metricMaker;
+    private final AllUsersName allUsersName;
+
+    @Inject
+    FactoryNoReindex(
+        ExternalIdCache externalIdCache, MetricMaker metricMaker, AllUsersName allUsersName) {
+      this.externalIdCache = externalIdCache;
+      this.metricMaker = metricMaker;
+      this.allUsersName = allUsersName;
+    }
+
+    @Override
+    public ExternalIdNotes load(Repository allUsersRepo)
+        throws IOException, ConfigInvalidException {
+      return new ExternalIdNotes(
+              externalIdCache, null, null, metricMaker, allUsersName, allUsersRepo)
+          .load();
+    }
+
+    @Override
+    public ExternalIdNotes load(Repository allUsersRepo, @Nullable ObjectId rev)
+        throws IOException, ConfigInvalidException {
+      return new ExternalIdNotes(
+              externalIdCache, null, null, metricMaker, allUsersName, allUsersRepo)
+          .load(rev);
+    }
+  }
+
+  /**
+   * Loads the external ID notes for reading only. The external ID notes are loaded from the current
+   * tip of the {@code refs/meta/external-ids} branch.
+   *
+   * @return read-only {@link ExternalIdNotes} instance
+   */
+  public static ExternalIdNotes loadReadOnly(AllUsersName allUsersName, Repository allUsersRepo)
+      throws IOException, ConfigInvalidException {
+    return new ExternalIdNotes(
+            new DisabledExternalIdCache(),
+            null,
+            null,
+            new DisabledMetricMaker(),
+            allUsersName,
+            allUsersRepo)
+        .setReadOnly()
+        .load();
+  }
+
+  /**
+   * Loads the external ID notes for reading only. The external ID notes are loaded from the
+   * specified revision of the {@code refs/meta/external-ids} branch.
+   *
+   * @param rev the revision from which the external ID notes should be loaded, if {@code null} the
+   *     external ID notes are loaded from the current tip, if {@link ObjectId#zeroId()} it's
+   *     assumed that the {@code refs/meta/external-ids} branch doesn't exist and the loaded
+   *     external IDs will be empty
+   * @return read-only {@link ExternalIdNotes} instance
+   */
+  public static ExternalIdNotes loadReadOnly(
+      AllUsersName allUsersName, Repository allUsersRepo, @Nullable ObjectId rev)
+      throws IOException, ConfigInvalidException {
+    return new ExternalIdNotes(
+            new DisabledExternalIdCache(),
+            null,
+            null,
+            new DisabledMetricMaker(),
+            allUsersName,
+            allUsersRepo)
+        .setReadOnly()
+        .load(rev);
+  }
+
+  /**
+   * Loads the external ID notes for updates without cache evictions. The external ID notes are
+   * loaded from the current tip of the {@code refs/meta/external-ids} branch.
+   *
+   * <p>Use this only from init, schema upgrades and tests.
+   *
+   * <p>Metrics are disabled.
+   *
+   * @return {@link ExternalIdNotes} instance that doesn't updates caches on save
+   */
+  public static ExternalIdNotes loadNoCacheUpdate(
+      AllUsersName allUsersName, Repository allUsersRepo)
+      throws IOException, ConfigInvalidException {
+    return new ExternalIdNotes(
+            new DisabledExternalIdCache(),
+            null,
+            null,
+            new DisabledMetricMaker(),
+            allUsersName,
+            allUsersRepo)
+        .load();
+  }
+
+  private final ExternalIdCache externalIdCache;
+  @Nullable private final AccountCache accountCache;
+  @Nullable private final Provider<AccountIndexer> accountIndexer;
+  private final AllUsersName allUsersName;
+  private final Counter0 updateCount;
+  private final Repository repo;
+
+  private NoteMap noteMap;
+  private ObjectId oldRev;
+
+  // Staged note map updates that should be executed on save.
+  private List<NoteMapUpdate> noteMapUpdates = new ArrayList<>();
+
+  // Staged cache updates that should be executed after external ID changes have been committed.
+  private List<CacheUpdate> cacheUpdates = new ArrayList<>();
+
+  private Runnable afterReadRevision;
+  private boolean readOnly = false;
+
+  private ExternalIdNotes(
+      ExternalIdCache externalIdCache,
+      @Nullable AccountCache accountCache,
+      @Nullable Provider<AccountIndexer> accountIndexer,
+      MetricMaker metricMaker,
+      AllUsersName allUsersName,
+      Repository allUsersRepo) {
+    this.externalIdCache = requireNonNull(externalIdCache, "externalIdCache");
+    this.accountCache = accountCache;
+    this.accountIndexer = accountIndexer;
+    this.updateCount =
+        metricMaker.newCounter(
+            "notedb/external_id_update_count",
+            new Description("Total number of external ID updates.").setRate().setUnit("updates"));
+    this.allUsersName = requireNonNull(allUsersName, "allUsersRepo");
+    this.repo = requireNonNull(allUsersRepo, "allUsersRepo");
+  }
+
+  public ExternalIdNotes setAfterReadRevision(Runnable afterReadRevision) {
+    this.afterReadRevision = afterReadRevision;
+    return this;
+  }
+
+  private ExternalIdNotes setReadOnly() {
+    this.readOnly = true;
+    return this;
+  }
+
+  public Repository getRepository() {
+    return repo;
+  }
+
+  @Override
+  protected String getRefName() {
+    return RefNames.REFS_EXTERNAL_IDS;
+  }
+
+  /**
+   * Loads the external ID notes from the current tip of the {@code refs/meta/external-ids} branch.
+   *
+   * @return {@link ExternalIdNotes} instance for chaining
+   */
+  private ExternalIdNotes load() throws IOException, ConfigInvalidException {
+    load(allUsersName, repo);
+    return this;
+  }
+
+  /**
+   * Loads the external ID notes from the specified revision of the {@code refs/meta/external-ids}
+   * branch.
+   *
+   * @param rev the revision from which the external ID notes should be loaded, if {@code null} the
+   *     external ID notes are loaded from the current tip, if {@link ObjectId#zeroId()} it's
+   *     assumed that the {@code refs/meta/external-ids} branch doesn't exist and the loaded
+   *     external IDs will be empty
+   * @return {@link ExternalIdNotes} instance for chaining
+   */
+  ExternalIdNotes load(@Nullable ObjectId rev) throws IOException, ConfigInvalidException {
+    if (rev == null) {
+      return load();
+    }
+    if (ObjectId.zeroId().equals(rev)) {
+      load(allUsersName, repo, null);
+      return this;
+    }
+    load(allUsersName, repo, rev);
+    return this;
+  }
+
+  /**
+   * Parses and returns the specified external ID.
+   *
+   * @param key the key of the external ID
+   * @return the external ID, {@code Optional.empty()} if it doesn't exist
+   */
+  public Optional<ExternalId> get(ExternalId.Key key) throws IOException, ConfigInvalidException {
+    checkLoaded();
+    ObjectId noteId = key.sha1();
+    if (!noteMap.contains(noteId)) {
+      return Optional.empty();
+    }
+
+    try (RevWalk rw = new RevWalk(repo)) {
+      ObjectId noteDataId = noteMap.get(noteId);
+      byte[] raw = readNoteData(rw, noteDataId);
+      return Optional.of(ExternalId.parse(noteId.name(), raw, noteDataId));
+    }
+  }
+
+  /**
+   * Parses and returns the specified external IDs.
+   *
+   * @param keys the keys of the external IDs
+   * @return the external IDs
+   */
+  public Set<ExternalId> get(Collection<ExternalId.Key> keys)
+      throws IOException, ConfigInvalidException {
+    checkLoaded();
+    HashSet<ExternalId> externalIds = Sets.newHashSetWithExpectedSize(keys.size());
+    for (ExternalId.Key key : keys) {
+      get(key).ifPresent(externalIds::add);
+    }
+    return externalIds;
+  }
+
+  /**
+   * Parses and returns all external IDs.
+   *
+   * <p>Invalid external IDs are ignored.
+   *
+   * @return all external IDs
+   */
+  public ImmutableSet<ExternalId> all() throws IOException {
+    checkLoaded();
+    try (RevWalk rw = new RevWalk(repo)) {
+      ImmutableSet.Builder<ExternalId> b = ImmutableSet.builder();
+      for (Note note : noteMap) {
+        byte[] raw = readNoteData(rw, note.getData());
+        try {
+          b.add(ExternalId.parse(note.getName(), raw, note.getData()));
+        } catch (ConfigInvalidException | RuntimeException e) {
+          logger.atSevere().withCause(e).log(
+              "Ignoring invalid external ID note %s", note.getName());
+        }
+      }
+      return b.build();
+    }
+  }
+
+  NoteMap getNoteMap() {
+    checkLoaded();
+    return noteMap;
+  }
+
+  static byte[] readNoteData(RevWalk rw, ObjectId noteDataId) throws IOException {
+    return rw.getObjectReader().open(noteDataId, OBJ_BLOB).getCachedBytes(MAX_NOTE_SZ);
+  }
+
+  /**
+   * Inserts a new external ID.
+   *
+   * @throws IOException on IO error while checking if external ID already exists
+   * @throws DuplicateExternalIdKeyException if the external ID already exists
+   */
+  public void insert(ExternalId extId) throws IOException, DuplicateExternalIdKeyException {
+    insert(Collections.singleton(extId));
+  }
+
+  /**
+   * Inserts new external IDs.
+   *
+   * @throws IOException on IO error while checking if external IDs already exist
+   * @throws DuplicateExternalIdKeyException if any of the external ID already exists
+   */
+  public void insert(Collection<ExternalId> extIds)
+      throws IOException, DuplicateExternalIdKeyException {
+    checkLoaded();
+    checkExternalIdsDontExist(extIds);
+
+    Set<ExternalId> newExtIds = new HashSet<>();
+    noteMapUpdates.add(
+        (rw, n, f) -> {
+          for (ExternalId extId : extIds) {
+            ExternalId insertedExtId = upsert(rw, inserter, noteMap, f, extId);
+            newExtIds.add(insertedExtId);
+          }
+        });
+    cacheUpdates.add(cu -> cu.add(newExtIds));
+  }
+
+  /**
+   * Inserts or updates an external ID.
+   *
+   * <p>If the external ID already exists, it is overwritten, otherwise it is inserted.
+   */
+  public void upsert(ExternalId extId) throws IOException, ConfigInvalidException {
+    upsert(Collections.singleton(extId));
+  }
+
+  /**
+   * Inserts or updates external IDs.
+   *
+   * <p>If any of the external IDs already exists, it is overwritten. New external IDs are inserted.
+   */
+  public void upsert(Collection<ExternalId> extIds) throws IOException, ConfigInvalidException {
+    checkLoaded();
+    Set<ExternalId> removedExtIds = get(ExternalId.Key.from(extIds));
+    Set<ExternalId> updatedExtIds = new HashSet<>();
+    noteMapUpdates.add(
+        (rw, n, f) -> {
+          for (ExternalId extId : extIds) {
+            ExternalId updatedExtId = upsert(rw, inserter, noteMap, f, extId);
+            updatedExtIds.add(updatedExtId);
+          }
+        });
+    cacheUpdates.add(cu -> cu.remove(removedExtIds).add(updatedExtIds));
+  }
+
+  /**
+   * Deletes an external ID.
+   *
+   * @throws IllegalStateException is thrown if there is an existing external ID that has the same
+   *     key, but otherwise doesn't match the specified external ID.
+   */
+  public void delete(ExternalId extId) {
+    delete(Collections.singleton(extId));
+  }
+
+  /**
+   * Deletes external IDs.
+   *
+   * @throws IllegalStateException is thrown if there is an existing external ID that has the same
+   *     key as any of the external IDs that should be deleted, but otherwise doesn't match the that
+   *     external ID.
+   */
+  public void delete(Collection<ExternalId> extIds) {
+    checkLoaded();
+    Set<ExternalId> removedExtIds = new HashSet<>();
+    noteMapUpdates.add(
+        (rw, n, f) -> {
+          for (ExternalId extId : extIds) {
+            remove(rw, noteMap, f, extId);
+            removedExtIds.add(extId);
+          }
+        });
+    cacheUpdates.add(cu -> cu.remove(removedExtIds));
+  }
+
+  /**
+   * Delete an external ID by key.
+   *
+   * @throws IllegalStateException is thrown if the external ID does not belong to the specified
+   *     account.
+   */
+  public void delete(Account.Id accountId, ExternalId.Key extIdKey) {
+    delete(accountId, Collections.singleton(extIdKey));
+  }
+
+  /**
+   * Delete external IDs by external ID key.
+   *
+   * @throws IllegalStateException is thrown if any of the external IDs does not belong to the
+   *     specified account.
+   */
+  public void delete(Account.Id accountId, Collection<ExternalId.Key> extIdKeys) {
+    checkLoaded();
+    Set<ExternalId> removedExtIds = new HashSet<>();
+    noteMapUpdates.add(
+        (rw, n, f) -> {
+          for (ExternalId.Key extIdKey : extIdKeys) {
+            ExternalId removedExtId = remove(rw, noteMap, f, extIdKey, accountId);
+            removedExtIds.add(removedExtId);
+          }
+        });
+    cacheUpdates.add(cu -> cu.remove(removedExtIds));
+  }
+
+  /**
+   * Delete external IDs by external ID key.
+   *
+   * <p>The external IDs are deleted regardless of which account they belong to.
+   */
+  public void deleteByKeys(Collection<ExternalId.Key> extIdKeys) {
+    checkLoaded();
+    Set<ExternalId> removedExtIds = new HashSet<>();
+    noteMapUpdates.add(
+        (rw, n, f) -> {
+          for (ExternalId.Key extIdKey : extIdKeys) {
+            ExternalId extId = remove(rw, noteMap, f, extIdKey, null);
+            removedExtIds.add(extId);
+          }
+        });
+    cacheUpdates.add(cu -> cu.remove(removedExtIds));
+  }
+
+  /**
+   * Replaces external IDs for an account by external ID keys.
+   *
+   * <p>Deletion of external IDs is done before adding the new external IDs. This means if an
+   * external ID key is specified for deletion and an external ID with the same key is specified to
+   * be added, the old external ID with that key is deleted first and then the new external ID is
+   * added (so the external ID for that key is replaced).
+   *
+   * @throws IllegalStateException is thrown if any of the specified external IDs does not belong to
+   *     the specified account.
+   */
+  public void replace(
+      Account.Id accountId, Collection<ExternalId.Key> toDelete, Collection<ExternalId> toAdd)
+      throws IOException, DuplicateExternalIdKeyException {
+    checkLoaded();
+    checkSameAccount(toAdd, accountId);
+    checkExternalIdKeysDontExist(ExternalId.Key.from(toAdd), toDelete);
+
+    Set<ExternalId> removedExtIds = new HashSet<>();
+    Set<ExternalId> updatedExtIds = new HashSet<>();
+    noteMapUpdates.add(
+        (rw, n, f) -> {
+          for (ExternalId.Key extIdKey : toDelete) {
+            ExternalId removedExtId = remove(rw, noteMap, f, extIdKey, accountId);
+            if (removedExtId != null) {
+              removedExtIds.add(removedExtId);
+            }
+          }
+
+          for (ExternalId extId : toAdd) {
+            ExternalId insertedExtId = upsert(rw, inserter, noteMap, f, extId);
+            updatedExtIds.add(insertedExtId);
+          }
+        });
+    cacheUpdates.add(cu -> cu.add(updatedExtIds).remove(removedExtIds));
+  }
+
+  /**
+   * Replaces external IDs for an account by external ID keys.
+   *
+   * <p>Deletion of external IDs is done before adding the new external IDs. This means if an
+   * external ID key is specified for deletion and an external ID with the same key is specified to
+   * be added, the old external ID with that key is deleted first and then the new external ID is
+   * added (so the external ID for that key is replaced).
+   *
+   * <p>The external IDs are replaced regardless of which account they belong to.
+   */
+  public void replaceByKeys(Collection<ExternalId.Key> toDelete, Collection<ExternalId> toAdd)
+      throws IOException, DuplicateExternalIdKeyException {
+    checkLoaded();
+    checkExternalIdKeysDontExist(ExternalId.Key.from(toAdd), toDelete);
+
+    Set<ExternalId> removedExtIds = new HashSet<>();
+    Set<ExternalId> updatedExtIds = new HashSet<>();
+    noteMapUpdates.add(
+        (rw, n, f) -> {
+          for (ExternalId.Key extIdKey : toDelete) {
+            ExternalId removedExtId = remove(rw, noteMap, f, extIdKey, null);
+            removedExtIds.add(removedExtId);
+          }
+
+          for (ExternalId extId : toAdd) {
+            ExternalId insertedExtId = upsert(rw, inserter, noteMap, f, extId);
+            updatedExtIds.add(insertedExtId);
+          }
+        });
+    cacheUpdates.add(cu -> cu.add(updatedExtIds).remove(removedExtIds));
+  }
+
+  /**
+   * Replaces an external ID.
+   *
+   * @throws IllegalStateException is thrown if the specified external IDs belong to different
+   *     accounts.
+   */
+  public void replace(ExternalId toDelete, ExternalId toAdd)
+      throws IOException, DuplicateExternalIdKeyException {
+    replace(Collections.singleton(toDelete), Collections.singleton(toAdd));
+  }
+
+  /**
+   * Replaces external IDs.
+   *
+   * <p>Deletion of external IDs is done before adding the new external IDs. This means if an
+   * external ID is specified for deletion and an external ID with the same key is specified to be
+   * added, the old external ID with that key is deleted first and then the new external ID is added
+   * (so the external ID for that key is replaced).
+   *
+   * @throws IllegalStateException is thrown if the specified external IDs belong to different
+   *     accounts.
+   */
+  public void replace(Collection<ExternalId> toDelete, Collection<ExternalId> toAdd)
+      throws IOException, DuplicateExternalIdKeyException {
+    Account.Id accountId = checkSameAccount(Iterables.concat(toDelete, toAdd));
+    if (accountId == null) {
+      // toDelete and toAdd are empty -> nothing to do
+      return;
+    }
+
+    replace(accountId, toDelete.stream().map(ExternalId::key).collect(toSet()), toAdd);
+  }
+
+  @Override
+  protected void onLoad() throws IOException, ConfigInvalidException {
+    logger.atFine().log("Reading external ID note map");
+
+    noteMap = revision != null ? NoteMap.read(reader, revision) : NoteMap.newEmptyMap();
+
+    if (afterReadRevision != null) {
+      afterReadRevision.run();
+    }
+  }
+
+  @Override
+  public RevCommit commit(MetaDataUpdate update) throws IOException {
+    oldRev = revision != null ? revision.copy() : ObjectId.zeroId();
+    RevCommit commit = super.commit(update);
+    updateCount.increment();
+    return commit;
+  }
+
+  /**
+   * Updates the caches (external ID cache, account cache) and reindexes the accounts for which
+   * external IDs were modified.
+   *
+   * <p>Must only be called after committing changes.
+   *
+   * <p>No-op if this instance was created by {@link #loadNoCacheUpdate(AllUsersName, Repository)}.
+   *
+   * <p>No eviction from account cache and no reindex if this instance was created by {@link
+   * FactoryNoReindex}.
+   */
+  public void updateCaches() throws IOException {
+    updateCaches(ImmutableSet.of());
+  }
+
+  /**
+   * Updates the caches (external ID cache, account cache) and reindexes the accounts for which
+   * external IDs were modified.
+   *
+   * <p>Must only be called after committing changes.
+   *
+   * <p>No-op if this instance was created by {@link #loadNoCacheUpdate(AllUsersName, Repository)}.
+   *
+   * <p>No eviction from account cache if this instance was created by {@link FactoryNoReindex}.
+   *
+   * @param accountsToSkip set of accounts that should not be evicted from the account cache, in
+   *     this case the caller must take care to evict them otherwise
+   */
+  public void updateCaches(Collection<Account.Id> accountsToSkip) throws IOException {
+    checkState(oldRev != null, "no changes committed yet");
+
+    ExternalIdCacheUpdates externalIdCacheUpdates = new ExternalIdCacheUpdates();
+    for (CacheUpdate cacheUpdate : cacheUpdates) {
+      cacheUpdate.execute(externalIdCacheUpdates);
+    }
+
+    externalIdCache.onReplace(
+        oldRev,
+        getRevision(),
+        externalIdCacheUpdates.getRemoved(),
+        externalIdCacheUpdates.getAdded());
+
+    if (accountCache != null || accountIndexer != null) {
+      for (Account.Id id :
+          Streams.concat(
+                  externalIdCacheUpdates.getAdded().stream(),
+                  externalIdCacheUpdates.getRemoved().stream())
+              .map(ExternalId::accountId)
+              .filter(i -> !accountsToSkip.contains(i))
+              .collect(toSet())) {
+        if (accountCache != null) {
+          accountCache.evict(id);
+        }
+        if (accountIndexer != null) {
+          accountIndexer.get().index(id);
+        }
+      }
+    }
+
+    cacheUpdates.clear();
+    oldRev = null;
+  }
+
+  @Override
+  protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException {
+    checkState(!readOnly, "Updating external IDs is disabled");
+
+    if (noteMapUpdates.isEmpty()) {
+      return false;
+    }
+
+    logger.atFine().log("Updating external IDs");
+
+    if (Strings.isNullOrEmpty(commit.getMessage())) {
+      commit.setMessage("Update external IDs\n");
+    }
+
+    try (RevWalk rw = new RevWalk(reader)) {
+      Set<String> footers = new HashSet<>();
+      for (NoteMapUpdate noteMapUpdate : noteMapUpdates) {
+        try {
+          noteMapUpdate.execute(rw, noteMap, footers);
+        } catch (DuplicateExternalIdKeyException e) {
+          throw new IOException(e);
+        }
+      }
+      noteMapUpdates.clear();
+      if (!footers.isEmpty()) {
+        commit.setMessage(
+            footers.stream()
+                .sorted()
+                .collect(joining("\n", commit.getMessage().trim() + "\n\n", "")));
+      }
+
+      RevTree oldTree = revision != null ? rw.parseTree(revision) : null;
+      ObjectId newTreeId = noteMap.writeTree(inserter);
+      if (newTreeId.equals(oldTree)) {
+        return false;
+      }
+
+      commit.setTreeId(newTreeId);
+      return true;
+    }
+  }
+
+  /**
+   * Checks that all specified external IDs belong to the same account.
+   *
+   * @return the ID of the account to which all specified external IDs belong.
+   */
+  private static Account.Id checkSameAccount(Iterable<ExternalId> extIds) {
+    return checkSameAccount(extIds, null);
+  }
+
+  /**
+   * Checks that all specified external IDs belong to specified account. If no account is specified
+   * it is checked that all specified external IDs belong to the same account.
+   *
+   * @return the ID of the account to which all specified external IDs belong.
+   */
+  public static Account.Id checkSameAccount(
+      Iterable<ExternalId> extIds, @Nullable Account.Id accountId) {
+    for (ExternalId extId : extIds) {
+      if (accountId == null) {
+        accountId = extId.accountId();
+        continue;
+      }
+      checkState(
+          accountId.equals(extId.accountId()),
+          "external id %s belongs to account %s, expected account %s",
+          extId.key().get(),
+          extId.accountId().get(),
+          accountId.get());
+    }
+    return accountId;
+  }
+
+  /**
+   * Insert or updates an new external ID and sets it in the note map.
+   *
+   * <p>If the external ID already exists it is overwritten.
+   */
+  private static ExternalId upsert(
+      RevWalk rw, ObjectInserter ins, NoteMap noteMap, Set<String> footers, ExternalId extId)
+      throws IOException, ConfigInvalidException {
+    ObjectId noteId = extId.key().sha1();
+    Config c = new Config();
+    if (noteMap.contains(extId.key().sha1())) {
+      ObjectId noteDataId = noteMap.get(noteId);
+      byte[] raw = readNoteData(rw, noteDataId);
+      try {
+        c = new BlobBasedConfig(null, raw);
+        ExternalId oldExtId = ExternalId.parse(noteId.name(), c, noteDataId);
+        addFooters(footers, oldExtId);
+      } catch (ConfigInvalidException e) {
+        throw new ConfigInvalidException(
+            String.format("Invalid external id config for note %s: %s", noteId, e.getMessage()));
+      }
+    }
+    extId.writeToConfig(c);
+    byte[] raw = c.toText().getBytes(UTF_8);
+    ObjectId noteData = ins.insert(OBJ_BLOB, raw);
+    noteMap.set(noteId, noteData);
+    ExternalId newExtId = ExternalId.create(extId, noteData);
+    addFooters(footers, newExtId);
+    return newExtId;
+  }
+
+  /**
+   * Removes an external ID from the note map.
+   *
+   * @throws IllegalStateException is thrown if there is an existing external ID that has the same
+   *     key, but otherwise doesn't match the specified external ID.
+   */
+  private static ExternalId remove(
+      RevWalk rw, NoteMap noteMap, Set<String> footers, ExternalId extId)
+      throws IOException, ConfigInvalidException {
+    ObjectId noteId = extId.key().sha1();
+    if (!noteMap.contains(noteId)) {
+      return null;
+    }
+
+    ObjectId noteDataId = noteMap.get(noteId);
+    byte[] raw = readNoteData(rw, noteDataId);
+    ExternalId actualExtId = ExternalId.parse(noteId.name(), raw, noteDataId);
+    checkState(
+        extId.equals(actualExtId),
+        "external id %s should be removed, but it's not matching the actual external id %s",
+        extId.toString(),
+        actualExtId.toString());
+    noteMap.remove(noteId);
+    addFooters(footers, actualExtId);
+    return actualExtId;
+  }
+
+  /**
+   * Removes an external ID from the note map by external ID key.
+   *
+   * @throws IllegalStateException is thrown if an expected account ID is provided and an external
+   *     ID with the specified key exists, but belongs to another account.
+   * @return the external ID that was removed, {@code null} if no external ID with the specified key
+   *     exists
+   */
+  private static ExternalId remove(
+      RevWalk rw,
+      NoteMap noteMap,
+      Set<String> footers,
+      ExternalId.Key extIdKey,
+      Account.Id expectedAccountId)
+      throws IOException, ConfigInvalidException {
+    ObjectId noteId = extIdKey.sha1();
+    if (!noteMap.contains(noteId)) {
+      return null;
+    }
+
+    ObjectId noteDataId = noteMap.get(noteId);
+    byte[] raw = readNoteData(rw, noteDataId);
+    ExternalId extId = ExternalId.parse(noteId.name(), raw, noteDataId);
+    if (expectedAccountId != null) {
+      checkState(
+          expectedAccountId.equals(extId.accountId()),
+          "external id %s should be removed for account %s,"
+              + " but external id belongs to account %s",
+          extIdKey.get(),
+          expectedAccountId.get(),
+          extId.accountId().get());
+    }
+    noteMap.remove(noteId);
+    addFooters(footers, extId);
+    return extId;
+  }
+
+  private static void addFooters(Set<String> footers, ExternalId extId) {
+    footers.add("Account: " + extId.accountId().get());
+    if (extId.email() != null) {
+      footers.add("Email: " + extId.email());
+    }
+  }
+
+  private void checkExternalIdsDontExist(Collection<ExternalId> extIds)
+      throws DuplicateExternalIdKeyException, IOException {
+    checkExternalIdKeysDontExist(ExternalId.Key.from(extIds));
+  }
+
+  private void checkExternalIdKeysDontExist(
+      Collection<ExternalId.Key> extIdKeysToAdd, Collection<ExternalId.Key> extIdKeysToDelete)
+      throws DuplicateExternalIdKeyException, IOException {
+    HashSet<ExternalId.Key> newKeys = new HashSet<>(extIdKeysToAdd);
+    newKeys.removeAll(extIdKeysToDelete);
+    checkExternalIdKeysDontExist(newKeys);
+  }
+
+  private void checkExternalIdKeysDontExist(Collection<ExternalId.Key> extIdKeys)
+      throws IOException, DuplicateExternalIdKeyException {
+    for (ExternalId.Key extIdKey : extIdKeys) {
+      if (noteMap.contains(extIdKey.sha1())) {
+        throw new DuplicateExternalIdKeyException(extIdKey);
+      }
+    }
+  }
+
+  private void checkLoaded() {
+    checkState(noteMap != null, "External IDs not loaded yet");
+  }
+
+  @FunctionalInterface
+  private interface NoteMapUpdate {
+    void execute(RevWalk rw, NoteMap noteMap, Set<String> footers)
+        throws IOException, ConfigInvalidException, DuplicateExternalIdKeyException;
+  }
+
+  @FunctionalInterface
+  private interface CacheUpdate {
+    void execute(ExternalIdCacheUpdates cacheUpdates) throws IOException;
+  }
+
+  private static class ExternalIdCacheUpdates {
+    private final Set<ExternalId> added = new HashSet<>();
+    private final Set<ExternalId> removed = new HashSet<>();
+
+    ExternalIdCacheUpdates add(Collection<ExternalId> extIds) {
+      this.added.addAll(extIds);
+      return this;
+    }
+
+    public Set<ExternalId> getAdded() {
+      return ImmutableSet.copyOf(added);
+    }
+
+    ExternalIdCacheUpdates remove(Collection<ExternalId> extIds) {
+      this.removed.addAll(extIds);
+      return this;
+    }
+
+    public Set<ExternalId> getRemoved() {
+      return ImmutableSet.copyOf(removed);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/account/externalids/ExternalIdReader.java b/java/com/google/gerrit/server/account/externalids/ExternalIdReader.java
new file mode 100644
index 0000000..cf5500e
--- /dev/null
+++ b/java/com/google/gerrit/server/account/externalids/ExternalIdReader.java
@@ -0,0 +1,149 @@
+// Copyright (C) 2017 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.google.gerrit.server.account.externalids;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.metrics.Description;
+import com.google.gerrit.metrics.Description.Units;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.metrics.Timer0;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Optional;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.notes.NoteMap;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+/**
+ * Class to read external IDs from NoteDb.
+ *
+ * <p>In NoteDb external IDs are stored in the All-Users repository in a Git Notes branch called
+ * refs/meta/external-ids where the sha1 of the external ID is used as note name. Each note content
+ * is a git config file that contains an external ID. It has exactly one externalId subsection with
+ * an accountId and optionally email and password:
+ *
+ * <pre>
+ * [externalId "username:jdoe"]
+ *   accountId = 1003407
+ *   email = jdoe@example.com
+ *   password = bcrypt:4:LCbmSBDivK/hhGVQMfkDpA==:XcWn0pKYSVU/UJgOvhidkEtmqCp6oKB7
+ * </pre>
+ */
+@Singleton
+public class ExternalIdReader {
+  public static ObjectId readRevision(Repository repo) throws IOException {
+    Ref ref = repo.exactRef(RefNames.REFS_EXTERNAL_IDS);
+    return ref != null ? ref.getObjectId() : ObjectId.zeroId();
+  }
+
+  public static NoteMap readNoteMap(RevWalk rw, ObjectId rev) throws IOException {
+    if (!rev.equals(ObjectId.zeroId())) {
+      return NoteMap.read(rw.getObjectReader(), rw.parseCommit(rev));
+    }
+    return NoteMap.newEmptyMap();
+  }
+
+  private final GitRepositoryManager repoManager;
+  private final AllUsersName allUsersName;
+  private boolean failOnLoad = false;
+  private final Timer0 readAllLatency;
+
+  @Inject
+  ExternalIdReader(
+      GitRepositoryManager repoManager, AllUsersName allUsersName, MetricMaker metricMaker) {
+    this.repoManager = repoManager;
+    this.allUsersName = allUsersName;
+    this.readAllLatency =
+        metricMaker.newTimer(
+            "notedb/read_all_external_ids_latency",
+            new Description("Latency for reading all external IDs from NoteDb.")
+                .setCumulative()
+                .setUnit(Units.MILLISECONDS));
+  }
+
+  @VisibleForTesting
+  public void setFailOnLoad(boolean failOnLoad) {
+    this.failOnLoad = failOnLoad;
+  }
+
+  ObjectId readRevision() throws IOException {
+    try (Repository repo = repoManager.openRepository(allUsersName)) {
+      return readRevision(repo);
+    }
+  }
+
+  /** Reads and returns all external IDs. */
+  ImmutableSet<ExternalId> all() throws IOException, ConfigInvalidException {
+    checkReadEnabled();
+
+    try (Timer0.Context ctx = readAllLatency.start();
+        Repository repo = repoManager.openRepository(allUsersName)) {
+      return ExternalIdNotes.loadReadOnly(allUsersName, repo).all();
+    }
+  }
+
+  /**
+   * Reads and returns all external IDs from the specified revision of the {@code
+   * refs/meta/external-ids} branch.
+   *
+   * @param rev the revision from which the external IDs should be read, if {@code null} the
+   *     external IDs are read from the current tip, if {@link ObjectId#zeroId()} it's assumed that
+   *     the {@code refs/meta/external-ids} branch doesn't exist and the loaded external IDs will be
+   *     empty
+   * @return all external IDs that were read from the specified revision
+   */
+  ImmutableSet<ExternalId> all(@Nullable ObjectId rev) throws IOException, ConfigInvalidException {
+    checkReadEnabled();
+
+    try (Timer0.Context ctx = readAllLatency.start();
+        Repository repo = repoManager.openRepository(allUsersName)) {
+      return ExternalIdNotes.loadReadOnly(allUsersName, repo, rev).all();
+    }
+  }
+
+  /** Reads and returns the specified external ID. */
+  Optional<ExternalId> get(ExternalId.Key key) throws IOException, ConfigInvalidException {
+    checkReadEnabled();
+
+    try (Repository repo = repoManager.openRepository(allUsersName)) {
+      return ExternalIdNotes.loadReadOnly(allUsersName, repo).get(key);
+    }
+  }
+
+  /** Reads and returns the specified external ID from the given revision. */
+  Optional<ExternalId> get(ExternalId.Key key, ObjectId rev)
+      throws IOException, ConfigInvalidException {
+    checkReadEnabled();
+
+    try (Repository repo = repoManager.openRepository(allUsersName)) {
+      return ExternalIdNotes.loadReadOnly(allUsersName, repo, rev).get(key);
+    }
+  }
+
+  private void checkReadEnabled() throws IOException {
+    if (failOnLoad) {
+      throw new IOException("Reading from external IDs is disabled");
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/account/externalids/ExternalIds.java b/java/com/google/gerrit/server/account/externalids/ExternalIds.java
new file mode 100644
index 0000000..9098630
--- /dev/null
+++ b/java/com/google/gerrit/server/account/externalids/ExternalIds.java
@@ -0,0 +1,136 @@
+// 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.
+
+package com.google.gerrit.server.account.externalids;
+
+import static com.google.common.collect.ImmutableSet.toImmutableSet;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.SetMultimap;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Optional;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.ObjectId;
+
+/**
+ * Class to access external IDs.
+ *
+ * <p>The external IDs are either read from NoteDb or retrieved from the cache.
+ */
+@Singleton
+public class ExternalIds {
+  private final ExternalIdReader externalIdReader;
+  private final ExternalIdCache externalIdCache;
+
+  @Inject
+  public ExternalIds(ExternalIdReader externalIdReader, ExternalIdCache externalIdCache) {
+    this.externalIdReader = externalIdReader;
+    this.externalIdCache = externalIdCache;
+  }
+
+  /** Returns all external IDs. */
+  public ImmutableSet<ExternalId> all() throws IOException, ConfigInvalidException {
+    return externalIdReader.all();
+  }
+
+  /** Returns all external IDs from the specified revision of the refs/meta/external-ids branch. */
+  public ImmutableSet<ExternalId> all(ObjectId rev) throws IOException, ConfigInvalidException {
+    return externalIdReader.all(rev);
+  }
+
+  /** Returns the specified external ID. */
+  public Optional<ExternalId> get(ExternalId.Key key) throws IOException, ConfigInvalidException {
+    return externalIdReader.get(key);
+  }
+
+  /** Returns the specified external ID from the given revision. */
+  public Optional<ExternalId> get(ExternalId.Key key, ObjectId rev)
+      throws IOException, ConfigInvalidException {
+    return externalIdReader.get(key, rev);
+  }
+
+  /** Returns the external IDs of the specified account. */
+  public Set<ExternalId> byAccount(Account.Id accountId) throws IOException {
+    return externalIdCache.byAccount(accountId);
+  }
+
+  /** Returns the external IDs of the specified account that have the given scheme. */
+  public Set<ExternalId> byAccount(Account.Id accountId, String scheme) throws IOException {
+    return byAccount(accountId).stream()
+        .filter(e -> e.key().isScheme(scheme))
+        .collect(toImmutableSet());
+  }
+
+  /** Returns the external IDs of the specified account. */
+  public Set<ExternalId> byAccount(Account.Id accountId, ObjectId rev) throws IOException {
+    return externalIdCache.byAccount(accountId, rev);
+  }
+
+  /** Returns the external IDs of the specified account that have the given scheme. */
+  public Set<ExternalId> byAccount(Account.Id accountId, String scheme, ObjectId rev)
+      throws IOException {
+    return byAccount(accountId, rev).stream()
+        .filter(e -> e.key().isScheme(scheme))
+        .collect(toImmutableSet());
+  }
+
+  /** Returns all external IDs by account. */
+  public SetMultimap<Account.Id, ExternalId> allByAccount() throws IOException {
+    return externalIdCache.allByAccount();
+  }
+
+  /**
+   * Returns the external ID with the given email.
+   *
+   * <p>Each email should belong to a single external ID only. This means if more than one external
+   * ID is returned there is an inconsistency in the external IDs.
+   *
+   * <p>The external IDs are retrieved from the external ID cache. Each access to the external ID
+   * cache requires reading the SHA1 of the refs/meta/external-ids branch. If external IDs for
+   * multiple emails are needed it is more efficient to use {@link #byEmails(String...)} as this
+   * method reads the SHA1 of the refs/meta/external-ids branch only once (and not once per email).
+   *
+   * @see #byEmails(String...)
+   */
+  public Set<ExternalId> byEmail(String email) throws IOException {
+    return externalIdCache.byEmail(email);
+  }
+
+  /**
+   * Returns the external IDs for the given emails.
+   *
+   * <p>Each email should belong to a single external ID only. This means if more than one external
+   * ID for an email is returned there is an inconsistency in the external IDs.
+   *
+   * <p>The external IDs are retrieved from the external ID cache. Each access to the external ID
+   * cache requires reading the SHA1 of the refs/meta/external-ids branch. If external IDs for
+   * multiple emails are needed it is more efficient to use this method instead of {@link
+   * #byEmail(String)} as this method reads the SHA1 of the refs/meta/external-ids branch only once
+   * (and not once per email).
+   *
+   * @see #byEmail(String)
+   */
+  public SetMultimap<String, ExternalId> byEmails(String... emails) throws IOException {
+    return externalIdCache.byEmails(emails);
+  }
+
+  /** Returns all external IDs by email. */
+  public SetMultimap<String, ExternalId> allByEmail() throws IOException {
+    return externalIdCache.allByEmail();
+  }
+}
diff --git a/java/com/google/gerrit/server/account/externalids/ExternalIdsConsistencyChecker.java b/java/com/google/gerrit/server/account/externalids/ExternalIdsConsistencyChecker.java
new file mode 100644
index 0000000..fe7cc48
--- /dev/null
+++ b/java/com/google/gerrit/server/account/externalids/ExternalIdsConsistencyChecker.java
@@ -0,0 +1,148 @@
+// Copyright (C) 2017 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.google.gerrit.server.account.externalids;
+
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_USERNAME;
+import static java.util.stream.Collectors.joining;
+
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.MultimapBuilder;
+import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo.ConsistencyProblemInfo;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.HashedPassword;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.mail.send.OutgoingEmailValidator;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.commons.codec.DecoderException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.notes.Note;
+import org.eclipse.jgit.notes.NoteMap;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+@Singleton
+public class ExternalIdsConsistencyChecker {
+  private final GitRepositoryManager repoManager;
+  private final AllUsersName allUsers;
+  private final AccountCache accountCache;
+  private final OutgoingEmailValidator validator;
+
+  @Inject
+  ExternalIdsConsistencyChecker(
+      GitRepositoryManager repoManager,
+      AllUsersName allUsers,
+      AccountCache accountCache,
+      OutgoingEmailValidator validator) {
+    this.repoManager = repoManager;
+    this.allUsers = allUsers;
+    this.accountCache = accountCache;
+    this.validator = validator;
+  }
+
+  public List<ConsistencyProblemInfo> check() throws IOException, ConfigInvalidException {
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      return check(ExternalIdNotes.loadReadOnly(allUsers, repo));
+    }
+  }
+
+  public List<ConsistencyProblemInfo> check(ObjectId rev)
+      throws IOException, ConfigInvalidException {
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      return check(ExternalIdNotes.loadReadOnly(allUsers, repo, rev));
+    }
+  }
+
+  private List<ConsistencyProblemInfo> check(ExternalIdNotes extIdNotes) throws IOException {
+    List<ConsistencyProblemInfo> problems = new ArrayList<>();
+
+    ListMultimap<String, ExternalId.Key> emails =
+        MultimapBuilder.hashKeys().arrayListValues().build();
+
+    try (RevWalk rw = new RevWalk(extIdNotes.getRepository())) {
+      NoteMap noteMap = extIdNotes.getNoteMap();
+      for (Note note : noteMap) {
+        byte[] raw = ExternalIdNotes.readNoteData(rw, note.getData());
+        try {
+          ExternalId extId = ExternalId.parse(note.getName(), raw, note.getData());
+          problems.addAll(validateExternalId(extId));
+
+          if (extId.email() != null) {
+            emails.put(extId.email(), extId.key());
+          }
+        } catch (ConfigInvalidException e) {
+          addError(String.format(e.getMessage()), problems);
+        }
+      }
+    }
+
+    emails.asMap().entrySet().stream()
+        .filter(e -> e.getValue().size() > 1)
+        .forEach(
+            e ->
+                addError(
+                    String.format(
+                        "Email '%s' is not unique, it's used by the following external IDs: %s",
+                        e.getKey(),
+                        e.getValue().stream()
+                            .map(k -> "'" + k.get() + "'")
+                            .sorted()
+                            .collect(joining(", "))),
+                    problems));
+
+    return problems;
+  }
+
+  private List<ConsistencyProblemInfo> validateExternalId(ExternalId extId) {
+    List<ConsistencyProblemInfo> problems = new ArrayList<>();
+
+    if (!accountCache.get(extId.accountId()).isPresent()) {
+      addError(
+          String.format(
+              "External ID '%s' belongs to account that doesn't exist: %s",
+              extId.key().get(), extId.accountId().get()),
+          problems);
+    }
+
+    if (extId.email() != null && !validator.isValid(extId.email())) {
+      addError(
+          String.format(
+              "External ID '%s' has an invalid email: %s", extId.key().get(), extId.email()),
+          problems);
+    }
+
+    if (extId.password() != null && extId.isScheme(SCHEME_USERNAME)) {
+      try {
+        HashedPassword.decode(extId.password());
+      } catch (DecoderException e) {
+        addError(
+            String.format(
+                "External ID '%s' has an invalid password: %s", extId.key().get(), e.getMessage()),
+            problems);
+      }
+    }
+
+    return problems;
+  }
+
+  private static void addError(String error, List<ConsistencyProblemInfo> problems) {
+    problems.add(new ConsistencyProblemInfo(ConsistencyProblemInfo.Status.ERROR, error));
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/ApiUtil.java b/java/com/google/gerrit/server/api/ApiUtil.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/api/ApiUtil.java
rename to java/com/google/gerrit/server/api/ApiUtil.java
diff --git a/java/com/google/gerrit/server/api/BUILD b/java/com/google/gerrit/server/api/BUILD
new file mode 100644
index 0000000..910ecd3
--- /dev/null
+++ b/java/com/google/gerrit/server/api/BUILD
@@ -0,0 +1,22 @@
+java_library(
+    name = "api",
+    srcs = glob(
+        ["**/*.java"],
+    ),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/common:annotations",
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/lifecycle",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/server/restapi",
+        "//lib:guava",
+        "//lib:gwtorm",
+        "//lib:servlet-api-3_1",
+        "//lib/guice",
+        "//lib/guice:guice-assistedinject",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+    ],
+)
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/GerritApiImpl.java b/java/com/google/gerrit/server/api/GerritApiImpl.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/api/GerritApiImpl.java
rename to java/com/google/gerrit/server/api/GerritApiImpl.java
diff --git a/java/com/google/gerrit/server/api/GerritApiModule.java b/java/com/google/gerrit/server/api/GerritApiModule.java
new file mode 100644
index 0000000..9e60107
--- /dev/null
+++ b/java/com/google/gerrit/server/api/GerritApiModule.java
@@ -0,0 +1,31 @@
+// Copyright (C) 2013 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.google.gerrit.server.api;
+
+import com.google.gerrit.extensions.api.GerritApi;
+import com.google.gerrit.extensions.config.FactoryModule;
+
+public class GerritApiModule extends FactoryModule {
+  @Override
+  protected void configure() {
+    bind(GerritApi.class).to(GerritApiImpl.class);
+
+    install(new com.google.gerrit.server.api.accounts.Module());
+    install(new com.google.gerrit.server.api.changes.Module());
+    install(new com.google.gerrit.server.api.config.Module());
+    install(new com.google.gerrit.server.api.groups.Module());
+    install(new com.google.gerrit.server.api.projects.Module());
+  }
+}
diff --git a/java/com/google/gerrit/server/api/PluginApiModule.java b/java/com/google/gerrit/server/api/PluginApiModule.java
new file mode 100644
index 0000000..8d3822b
--- /dev/null
+++ b/java/com/google/gerrit/server/api/PluginApiModule.java
@@ -0,0 +1,28 @@
+// Copyright (C) 2017 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.google.gerrit.server.api;
+
+import com.google.gerrit.extensions.api.plugins.Plugins;
+import com.google.gerrit.extensions.config.FactoryModule;
+import com.google.gerrit.server.api.plugins.PluginApiImpl;
+import com.google.gerrit.server.api.plugins.PluginsImpl;
+
+public class PluginApiModule extends FactoryModule {
+  @Override
+  protected void configure() {
+    bind(Plugins.class).to(PluginsImpl.class);
+    factory(PluginApiImpl.Factory.class);
+  }
+}
diff --git a/java/com/google/gerrit/server/api/accounts/AccountApiImpl.java b/java/com/google/gerrit/server/api/accounts/AccountApiImpl.java
new file mode 100644
index 0000000..d80ff9b
--- /dev/null
+++ b/java/com/google/gerrit/server/api/accounts/AccountApiImpl.java
@@ -0,0 +1,596 @@
+// Copyright (C) 2014 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.google.gerrit.server.api.accounts;
+
+import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
+import static javax.servlet.http.HttpServletResponse.SC_OK;
+
+import com.google.gerrit.common.RawInputUtil;
+import com.google.gerrit.extensions.api.accounts.AccountApi;
+import com.google.gerrit.extensions.api.accounts.AgreementInput;
+import com.google.gerrit.extensions.api.accounts.DeleteDraftCommentsInput;
+import com.google.gerrit.extensions.api.accounts.DeletedDraftCommentInfo;
+import com.google.gerrit.extensions.api.accounts.EmailApi;
+import com.google.gerrit.extensions.api.accounts.EmailInput;
+import com.google.gerrit.extensions.api.accounts.GpgKeyApi;
+import com.google.gerrit.extensions.api.accounts.SshKeyInput;
+import com.google.gerrit.extensions.api.accounts.StatusInput;
+import com.google.gerrit.extensions.api.changes.StarsInput;
+import com.google.gerrit.extensions.client.DiffPreferencesInfo;
+import com.google.gerrit.extensions.client.EditPreferencesInfo;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
+import com.google.gerrit.extensions.client.ProjectWatchInfo;
+import com.google.gerrit.extensions.common.AccountDetailInfo;
+import com.google.gerrit.extensions.common.AccountExternalIdInfo;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.AgreementInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.EmailInfo;
+import com.google.gerrit.extensions.common.GpgKeyInfo;
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.common.NameInput;
+import com.google.gerrit.extensions.common.SshKeyInfo;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.server.account.AccountLoader;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.GpgApiAdapter;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.restapi.account.AddSshKey;
+import com.google.gerrit.server.restapi.account.CreateEmail;
+import com.google.gerrit.server.restapi.account.DeleteActive;
+import com.google.gerrit.server.restapi.account.DeleteDraftComments;
+import com.google.gerrit.server.restapi.account.DeleteEmail;
+import com.google.gerrit.server.restapi.account.DeleteExternalIds;
+import com.google.gerrit.server.restapi.account.DeleteSshKey;
+import com.google.gerrit.server.restapi.account.DeleteWatchedProjects;
+import com.google.gerrit.server.restapi.account.GetActive;
+import com.google.gerrit.server.restapi.account.GetAgreements;
+import com.google.gerrit.server.restapi.account.GetAvatar;
+import com.google.gerrit.server.restapi.account.GetDetail;
+import com.google.gerrit.server.restapi.account.GetDiffPreferences;
+import com.google.gerrit.server.restapi.account.GetEditPreferences;
+import com.google.gerrit.server.restapi.account.GetEmails;
+import com.google.gerrit.server.restapi.account.GetExternalIds;
+import com.google.gerrit.server.restapi.account.GetGroups;
+import com.google.gerrit.server.restapi.account.GetPreferences;
+import com.google.gerrit.server.restapi.account.GetSshKeys;
+import com.google.gerrit.server.restapi.account.GetWatchedProjects;
+import com.google.gerrit.server.restapi.account.Index;
+import com.google.gerrit.server.restapi.account.PostWatchedProjects;
+import com.google.gerrit.server.restapi.account.PutActive;
+import com.google.gerrit.server.restapi.account.PutAgreement;
+import com.google.gerrit.server.restapi.account.PutName;
+import com.google.gerrit.server.restapi.account.PutStatus;
+import com.google.gerrit.server.restapi.account.SetDiffPreferences;
+import com.google.gerrit.server.restapi.account.SetEditPreferences;
+import com.google.gerrit.server.restapi.account.SetPreferences;
+import com.google.gerrit.server.restapi.account.SshKeys;
+import com.google.gerrit.server.restapi.account.StarredChanges;
+import com.google.gerrit.server.restapi.account.Stars;
+import com.google.gerrit.server.restapi.change.ChangesCollection;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedSet;
+
+public class AccountApiImpl implements AccountApi {
+  interface Factory {
+    AccountApiImpl create(AccountResource account);
+  }
+
+  private final AccountResource account;
+  private final ChangesCollection changes;
+  private final AccountLoader.Factory accountLoaderFactory;
+  private final GetDetail getDetail;
+  private final GetAvatar getAvatar;
+  private final GetPreferences getPreferences;
+  private final SetPreferences setPreferences;
+  private final GetDiffPreferences getDiffPreferences;
+  private final SetDiffPreferences setDiffPreferences;
+  private final GetEditPreferences getEditPreferences;
+  private final SetEditPreferences setEditPreferences;
+  private final GetWatchedProjects getWatchedProjects;
+  private final PostWatchedProjects postWatchedProjects;
+  private final DeleteWatchedProjects deleteWatchedProjects;
+  private final StarredChanges.Create starredChangesCreate;
+  private final StarredChanges.Delete starredChangesDelete;
+  private final Stars stars;
+  private final Stars.Get starsGet;
+  private final Stars.Post starsPost;
+  private final GetEmails getEmails;
+  private final CreateEmail createEmail;
+  private final DeleteEmail deleteEmail;
+  private final GpgApiAdapter gpgApiAdapter;
+  private final GetSshKeys getSshKeys;
+  private final AddSshKey addSshKey;
+  private final DeleteSshKey deleteSshKey;
+  private final SshKeys sshKeys;
+  private final GetAgreements getAgreements;
+  private final PutAgreement putAgreement;
+  private final GetActive getActive;
+  private final PutActive putActive;
+  private final DeleteActive deleteActive;
+  private final Index index;
+  private final GetExternalIds getExternalIds;
+  private final DeleteExternalIds deleteExternalIds;
+  private final DeleteDraftComments deleteDraftComments;
+  private final PutStatus putStatus;
+  private final GetGroups getGroups;
+  private final EmailApiImpl.Factory emailApi;
+  private final PutName putName;
+
+  @Inject
+  AccountApiImpl(
+      AccountLoader.Factory ailf,
+      ChangesCollection changes,
+      GetDetail getDetail,
+      GetAvatar getAvatar,
+      GetPreferences getPreferences,
+      SetPreferences setPreferences,
+      GetDiffPreferences getDiffPreferences,
+      SetDiffPreferences setDiffPreferences,
+      GetEditPreferences getEditPreferences,
+      SetEditPreferences setEditPreferences,
+      GetWatchedProjects getWatchedProjects,
+      PostWatchedProjects postWatchedProjects,
+      DeleteWatchedProjects deleteWatchedProjects,
+      StarredChanges.Create starredChangesCreate,
+      StarredChanges.Delete starredChangesDelete,
+      Stars stars,
+      Stars.Get starsGet,
+      Stars.Post starsPost,
+      GetEmails getEmails,
+      CreateEmail createEmail,
+      DeleteEmail deleteEmail,
+      GpgApiAdapter gpgApiAdapter,
+      GetSshKeys getSshKeys,
+      AddSshKey addSshKey,
+      DeleteSshKey deleteSshKey,
+      SshKeys sshKeys,
+      GetAgreements getAgreements,
+      PutAgreement putAgreement,
+      GetActive getActive,
+      PutActive putActive,
+      DeleteActive deleteActive,
+      Index index,
+      GetExternalIds getExternalIds,
+      DeleteExternalIds deleteExternalIds,
+      DeleteDraftComments deleteDraftComments,
+      PutStatus putStatus,
+      GetGroups getGroups,
+      EmailApiImpl.Factory emailApi,
+      PutName putName,
+      @Assisted AccountResource account) {
+    this.account = account;
+    this.accountLoaderFactory = ailf;
+    this.changes = changes;
+    this.getDetail = getDetail;
+    this.getAvatar = getAvatar;
+    this.getPreferences = getPreferences;
+    this.setPreferences = setPreferences;
+    this.getDiffPreferences = getDiffPreferences;
+    this.setDiffPreferences = setDiffPreferences;
+    this.getEditPreferences = getEditPreferences;
+    this.setEditPreferences = setEditPreferences;
+    this.getWatchedProjects = getWatchedProjects;
+    this.postWatchedProjects = postWatchedProjects;
+    this.deleteWatchedProjects = deleteWatchedProjects;
+    this.starredChangesCreate = starredChangesCreate;
+    this.starredChangesDelete = starredChangesDelete;
+    this.stars = stars;
+    this.starsGet = starsGet;
+    this.starsPost = starsPost;
+    this.getEmails = getEmails;
+    this.createEmail = createEmail;
+    this.deleteEmail = deleteEmail;
+    this.getSshKeys = getSshKeys;
+    this.addSshKey = addSshKey;
+    this.deleteSshKey = deleteSshKey;
+    this.sshKeys = sshKeys;
+    this.gpgApiAdapter = gpgApiAdapter;
+    this.getAgreements = getAgreements;
+    this.putAgreement = putAgreement;
+    this.getActive = getActive;
+    this.putActive = putActive;
+    this.deleteActive = deleteActive;
+    this.index = index;
+    this.getExternalIds = getExternalIds;
+    this.deleteExternalIds = deleteExternalIds;
+    this.deleteDraftComments = deleteDraftComments;
+    this.putStatus = putStatus;
+    this.getGroups = getGroups;
+    this.emailApi = emailApi;
+    this.putName = putName;
+  }
+
+  @Override
+  public com.google.gerrit.extensions.common.AccountInfo get() throws RestApiException {
+    AccountLoader accountLoader = accountLoaderFactory.create(true);
+    try {
+      AccountInfo ai = accountLoader.get(account.getUser().getAccountId());
+      accountLoader.fill();
+      return ai;
+    } catch (Exception e) {
+      throw asRestApiException("Cannot parse account", e);
+    }
+  }
+
+  @Override
+  public AccountDetailInfo detail() throws RestApiException {
+    try {
+      return getDetail.apply(account);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get detail", e);
+    }
+  }
+
+  @Override
+  public boolean getActive() throws RestApiException {
+    Response<String> result = getActive.apply(account);
+    return result.statusCode() == SC_OK && result.value().equals("ok");
+  }
+
+  @Override
+  public void setActive(boolean active) throws RestApiException {
+    try {
+      if (active) {
+        putActive.apply(account, new Input());
+      } else {
+        deleteActive.apply(account, new Input());
+      }
+    } catch (Exception e) {
+      throw asRestApiException("Cannot set active", e);
+    }
+  }
+
+  @Override
+  public String getAvatarUrl(int size) throws RestApiException {
+    getAvatar.setSize(size);
+    return getAvatar.apply(account).location();
+  }
+
+  @Override
+  public GeneralPreferencesInfo getPreferences() throws RestApiException {
+    try {
+      return getPreferences.apply(account);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get preferences", e);
+    }
+  }
+
+  @Override
+  public GeneralPreferencesInfo setPreferences(GeneralPreferencesInfo in) throws RestApiException {
+    try {
+      return setPreferences.apply(account, in);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot set preferences", e);
+    }
+  }
+
+  @Override
+  public DiffPreferencesInfo getDiffPreferences() throws RestApiException {
+    try {
+      return getDiffPreferences.apply(account);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot query diff preferences", e);
+    }
+  }
+
+  @Override
+  public DiffPreferencesInfo setDiffPreferences(DiffPreferencesInfo in) throws RestApiException {
+    try {
+      return setDiffPreferences.apply(account, in);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot set diff preferences", e);
+    }
+  }
+
+  @Override
+  public EditPreferencesInfo getEditPreferences() throws RestApiException {
+    try {
+      return getEditPreferences.apply(account);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot query edit preferences", e);
+    }
+  }
+
+  @Override
+  public EditPreferencesInfo setEditPreferences(EditPreferencesInfo in) throws RestApiException {
+    try {
+      return setEditPreferences.apply(account, in);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot set edit preferences", e);
+    }
+  }
+
+  @Override
+  public List<ProjectWatchInfo> getWatchedProjects() throws RestApiException {
+    try {
+      return getWatchedProjects.apply(account);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get watched projects", e);
+    }
+  }
+
+  @Override
+  public List<ProjectWatchInfo> setWatchedProjects(List<ProjectWatchInfo> in)
+      throws RestApiException {
+    try {
+      return postWatchedProjects.apply(account, in);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot update watched projects", e);
+    }
+  }
+
+  @Override
+  public void deleteWatchedProjects(List<ProjectWatchInfo> in) throws RestApiException {
+    try {
+      deleteWatchedProjects.apply(account, in);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot delete watched projects", e);
+    }
+  }
+
+  @Override
+  public void starChange(String changeId) throws RestApiException {
+    try {
+      starredChangesCreate.apply(
+          account, IdString.fromUrl(changeId), new StarredChanges.EmptyInput());
+    } catch (Exception e) {
+      throw asRestApiException("Cannot star change", e);
+    }
+  }
+
+  @Override
+  public void unstarChange(String changeId) throws RestApiException {
+    try {
+      ChangeResource rsrc = changes.parse(TopLevelResource.INSTANCE, IdString.fromUrl(changeId));
+      AccountResource.StarredChange starredChange =
+          new AccountResource.StarredChange(account.getUser(), rsrc);
+      starredChangesDelete.apply(starredChange, new StarredChanges.EmptyInput());
+    } catch (Exception e) {
+      throw asRestApiException("Cannot unstar change", e);
+    }
+  }
+
+  @Override
+  public void setStars(String changeId, StarsInput input) throws RestApiException {
+    try {
+      AccountResource.Star rsrc = stars.parse(account, IdString.fromUrl(changeId));
+      starsPost.apply(rsrc, input);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot post stars", e);
+    }
+  }
+
+  @Override
+  public SortedSet<String> getStars(String changeId) throws RestApiException {
+    try {
+      AccountResource.Star rsrc = stars.parse(account, IdString.fromUrl(changeId));
+      return starsGet.apply(rsrc);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get stars", e);
+    }
+  }
+
+  @Override
+  public List<ChangeInfo> getStarredChanges() throws RestApiException {
+    try {
+      return stars.list().apply(account);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get starred changes", e);
+    }
+  }
+
+  @Override
+  public List<GroupInfo> getGroups() throws RestApiException {
+    try {
+      return getGroups.apply(account);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get groups", e);
+    }
+  }
+
+  @Override
+  public List<EmailInfo> getEmails() throws RestApiException {
+    try {
+      return getEmails.apply(account);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get emails", e);
+    }
+  }
+
+  @Override
+  public void addEmail(EmailInput input) throws RestApiException {
+    AccountResource.Email rsrc = new AccountResource.Email(account.getUser(), input.email);
+    try {
+      createEmail.apply(rsrc, IdString.fromDecoded(input.email), input);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot add email", e);
+    }
+  }
+
+  @Override
+  public void deleteEmail(String email) throws RestApiException {
+    AccountResource.Email rsrc = new AccountResource.Email(account.getUser(), email);
+    try {
+      deleteEmail.apply(rsrc, null);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot delete email", e);
+    }
+  }
+
+  @Override
+  public EmailApi createEmail(EmailInput input) throws RestApiException {
+    AccountResource.Email rsrc = new AccountResource.Email(account.getUser(), input.email);
+    try {
+      createEmail.apply(rsrc, IdString.fromDecoded(input.email), input);
+      return email(rsrc.getEmail());
+    } catch (Exception e) {
+      throw asRestApiException("Cannot create email", e);
+    }
+  }
+
+  @Override
+  public EmailApi email(String email) throws RestApiException {
+    try {
+      return emailApi.create(account, email);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot parse email", e);
+    }
+  }
+
+  @Override
+  public void setStatus(String status) throws RestApiException {
+    StatusInput in = new StatusInput(status);
+    try {
+      putStatus.apply(account, in);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot set status", e);
+    }
+  }
+
+  @Override
+  public List<SshKeyInfo> listSshKeys() throws RestApiException {
+    try {
+      return getSshKeys.apply(account);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot list SSH keys", e);
+    }
+  }
+
+  @Override
+  public SshKeyInfo addSshKey(String key) throws RestApiException {
+    SshKeyInput in = new SshKeyInput();
+    in.raw = RawInputUtil.create(key);
+    try {
+      return addSshKey.apply(account, in).value();
+    } catch (Exception e) {
+      throw asRestApiException("Cannot add SSH key", e);
+    }
+  }
+
+  @Override
+  public void deleteSshKey(int seq) throws RestApiException {
+    try {
+      AccountResource.SshKey sshKeyRes =
+          sshKeys.parse(account, IdString.fromDecoded(Integer.toString(seq)));
+      deleteSshKey.apply(sshKeyRes, null);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot delete SSH key", e);
+    }
+  }
+
+  @Override
+  public Map<String, GpgKeyInfo> listGpgKeys() throws RestApiException {
+    try {
+      return gpgApiAdapter.listGpgKeys(account);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot list GPG keys", e);
+    }
+  }
+
+  @Override
+  public Map<String, GpgKeyInfo> putGpgKeys(List<String> add, List<String> delete)
+      throws RestApiException {
+    try {
+      return gpgApiAdapter.putGpgKeys(account, add, delete);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot add GPG key", e);
+    }
+  }
+
+  @Override
+  public GpgKeyApi gpgKey(String id) throws RestApiException {
+    try {
+      return gpgApiAdapter.gpgKey(account, IdString.fromDecoded(id));
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get PGP key", e);
+    }
+  }
+
+  @Override
+  public List<AgreementInfo> listAgreements() throws RestApiException {
+    try {
+      return getAgreements.apply(account);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get agreements", e);
+    }
+  }
+
+  @Override
+  public void signAgreement(String agreementName) throws RestApiException {
+    try {
+      AgreementInput input = new AgreementInput();
+      input.name = agreementName;
+      putAgreement.apply(account, input);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot sign agreement", e);
+    }
+  }
+
+  @Override
+  public void index() throws RestApiException {
+    try {
+      index.apply(account, new Input());
+    } catch (Exception e) {
+      throw asRestApiException("Cannot index account", e);
+    }
+  }
+
+  @Override
+  public List<AccountExternalIdInfo> getExternalIds() throws RestApiException {
+    try {
+      return getExternalIds.apply(account);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get external IDs", e);
+    }
+  }
+
+  @Override
+  public void deleteExternalIds(List<String> externalIds) throws RestApiException {
+    try {
+      deleteExternalIds.apply(account, externalIds);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot delete external IDs", e);
+    }
+  }
+
+  @Override
+  public List<DeletedDraftCommentInfo> deleteDraftComments(DeleteDraftCommentsInput input)
+      throws RestApiException {
+    try {
+      return deleteDraftComments.apply(account, input);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot delete draft comments", e);
+    }
+  }
+
+  @Override
+  public void setName(String name) throws RestApiException {
+    NameInput input = new NameInput();
+    input.name = name;
+    try {
+      putName.apply(account, input);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot set account name", e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/api/accounts/AccountsImpl.java b/java/com/google/gerrit/server/api/accounts/AccountsImpl.java
new file mode 100644
index 0000000..9d29888
--- /dev/null
+++ b/java/com/google/gerrit/server/api/accounts/AccountsImpl.java
@@ -0,0 +1,172 @@
+// Copyright (C) 2014 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.google.gerrit.server.api.accounts;
+
+import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
+import static java.util.Objects.requireNonNull;
+
+import com.google.gerrit.extensions.api.accounts.AccountApi;
+import com.google.gerrit.extensions.api.accounts.AccountInput;
+import com.google.gerrit.extensions.api.accounts.Accounts;
+import com.google.gerrit.extensions.client.ListAccountsOption;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.restapi.account.AccountsCollection;
+import com.google.gerrit.server.restapi.account.CreateAccount;
+import com.google.gerrit.server.restapi.account.QueryAccounts;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.List;
+
+@Singleton
+public class AccountsImpl implements Accounts {
+  private final AccountsCollection accounts;
+  private final AccountApiImpl.Factory api;
+  private final PermissionBackend permissionBackend;
+  private final Provider<CurrentUser> self;
+  private final CreateAccount createAccount;
+  private final Provider<QueryAccounts> queryAccountsProvider;
+
+  @Inject
+  AccountsImpl(
+      AccountsCollection accounts,
+      AccountApiImpl.Factory api,
+      PermissionBackend permissionBackend,
+      Provider<CurrentUser> self,
+      CreateAccount createAccount,
+      Provider<QueryAccounts> queryAccountsProvider) {
+    this.accounts = accounts;
+    this.api = api;
+    this.permissionBackend = permissionBackend;
+    this.self = self;
+    this.createAccount = createAccount;
+    this.queryAccountsProvider = queryAccountsProvider;
+  }
+
+  @Override
+  public AccountApi id(String id) throws RestApiException {
+    try {
+      return api.create(accounts.parse(TopLevelResource.INSTANCE, IdString.fromDecoded(id)));
+    } catch (Exception e) {
+      throw asRestApiException("Cannot parse account", e);
+    }
+  }
+
+  @Override
+  public AccountApi id(int id) throws RestApiException {
+    return id(String.valueOf(id));
+  }
+
+  @Override
+  public AccountApi self() throws RestApiException {
+    if (!self.get().isIdentifiedUser()) {
+      throw new AuthException("Authentication required");
+    }
+    return api.create(new AccountResource(self.get().asIdentifiedUser()));
+  }
+
+  @Override
+  public AccountApi create(String username) throws RestApiException {
+    AccountInput in = new AccountInput();
+    in.username = username;
+    return create(in);
+  }
+
+  @Override
+  public AccountApi create(AccountInput in) throws RestApiException {
+    if (requireNonNull(in, "AccountInput").username == null) {
+      throw new BadRequestException("AccountInput must specify username");
+    }
+    try {
+      permissionBackend
+          .currentUser()
+          .checkAny(GlobalPermission.fromAnnotation(createAccount.getClass()));
+      AccountInfo info =
+          createAccount
+              .apply(TopLevelResource.INSTANCE, IdString.fromDecoded(in.username), in)
+              .value();
+      return id(info._accountId);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot create account " + in.username, e);
+    }
+  }
+
+  @Override
+  public SuggestAccountsRequest suggestAccounts() throws RestApiException {
+    return new SuggestAccountsRequest() {
+      @Override
+      public List<AccountInfo> get() throws RestApiException {
+        return AccountsImpl.this.suggestAccounts(this);
+      }
+    };
+  }
+
+  @Override
+  public SuggestAccountsRequest suggestAccounts(String query) throws RestApiException {
+    return suggestAccounts().withQuery(query);
+  }
+
+  private List<AccountInfo> suggestAccounts(SuggestAccountsRequest r) throws RestApiException {
+    try {
+      QueryAccounts myQueryAccounts = queryAccountsProvider.get();
+      myQueryAccounts.setSuggest(true);
+      myQueryAccounts.setQuery(r.getQuery());
+      myQueryAccounts.setLimit(r.getLimit());
+      return myQueryAccounts.apply(TopLevelResource.INSTANCE);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve suggested accounts", e);
+    }
+  }
+
+  @Override
+  public QueryRequest query() throws RestApiException {
+    return new QueryRequest() {
+      @Override
+      public List<AccountInfo> get() throws RestApiException {
+        return AccountsImpl.this.query(this);
+      }
+    };
+  }
+
+  @Override
+  public QueryRequest query(String query) throws RestApiException {
+    return query().withQuery(query);
+  }
+
+  private List<AccountInfo> query(QueryRequest r) throws RestApiException {
+    try {
+      QueryAccounts myQueryAccounts = queryAccountsProvider.get();
+      myQueryAccounts.setQuery(r.getQuery());
+      myQueryAccounts.setLimit(r.getLimit());
+      myQueryAccounts.setStart(r.getStart());
+      myQueryAccounts.setSuggest(r.getSuggest());
+      for (ListAccountsOption option : r.getOptions()) {
+        myQueryAccounts.addOption(option);
+      }
+      return myQueryAccounts.apply(TopLevelResource.INSTANCE);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve suggested accounts", e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/api/accounts/EmailApiImpl.java b/java/com/google/gerrit/server/api/accounts/EmailApiImpl.java
new file mode 100644
index 0000000..759f60c
--- /dev/null
+++ b/java/com/google/gerrit/server/api/accounts/EmailApiImpl.java
@@ -0,0 +1,91 @@
+// 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.
+
+package com.google.gerrit.server.api.accounts;
+
+import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
+
+import com.google.gerrit.extensions.api.accounts.EmailApi;
+import com.google.gerrit.extensions.common.EmailInfo;
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.restapi.account.DeleteEmail;
+import com.google.gerrit.server.restapi.account.EmailsCollection;
+import com.google.gerrit.server.restapi.account.GetEmail;
+import com.google.gerrit.server.restapi.account.PutPreferred;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+
+public class EmailApiImpl implements EmailApi {
+  interface Factory {
+    EmailApiImpl create(AccountResource account, String email);
+  }
+
+  private final EmailsCollection emails;
+  private final GetEmail get;
+  private final DeleteEmail delete;
+  private final PutPreferred putPreferred;
+  private final AccountResource account;
+  private final String email;
+
+  @Inject
+  EmailApiImpl(
+      EmailsCollection emails,
+      GetEmail get,
+      DeleteEmail delete,
+      PutPreferred putPreferred,
+      @Assisted AccountResource account,
+      @Assisted String email) {
+    this.emails = emails;
+    this.get = get;
+    this.delete = delete;
+    this.putPreferred = putPreferred;
+    this.account = account;
+    this.email = email;
+  }
+
+  @Override
+  public EmailInfo get() throws RestApiException {
+    try {
+      return get.apply(resource());
+    } catch (Exception e) {
+      throw asRestApiException("Cannot read email", e);
+    }
+  }
+
+  @Override
+  public void delete() throws RestApiException {
+    try {
+      delete.apply(resource(), new Input());
+    } catch (Exception e) {
+      throw asRestApiException("Cannot delete email", e);
+    }
+  }
+
+  @Override
+  public void setPreferred() throws RestApiException {
+    try {
+      putPreferred.apply(resource(), new Input());
+    } catch (Exception e) {
+      throw asRestApiException(String.format("Cannot set %s as preferred email", email), e);
+    }
+  }
+
+  private AccountResource.Email resource() throws RestApiException, PermissionBackendException {
+    return emails.parse(account, IdString.fromDecoded(email));
+  }
+}
diff --git a/java/com/google/gerrit/server/api/accounts/Module.java b/java/com/google/gerrit/server/api/accounts/Module.java
new file mode 100644
index 0000000..15c6ddb
--- /dev/null
+++ b/java/com/google/gerrit/server/api/accounts/Module.java
@@ -0,0 +1,28 @@
+// Copyright (C) 2014 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.google.gerrit.server.api.accounts;
+
+import com.google.gerrit.extensions.api.accounts.Accounts;
+import com.google.gerrit.extensions.config.FactoryModule;
+
+public class Module extends FactoryModule {
+  @Override
+  protected void configure() {
+    bind(Accounts.class).to(AccountsImpl.class);
+
+    factory(AccountApiImpl.Factory.class);
+    factory(EmailApiImpl.Factory.class);
+  }
+}
diff --git a/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java b/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java
new file mode 100644
index 0000000..4807b94
--- /dev/null
+++ b/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java
@@ -0,0 +1,757 @@
+// Copyright (C) 2013 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.google.gerrit.server.api.changes;
+
+import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.api.changes.AbandonInput;
+import com.google.gerrit.extensions.api.changes.AddReviewerInput;
+import com.google.gerrit.extensions.api.changes.AddReviewerResult;
+import com.google.gerrit.extensions.api.changes.AssigneeInput;
+import com.google.gerrit.extensions.api.changes.ChangeApi;
+import com.google.gerrit.extensions.api.changes.ChangeEditApi;
+import com.google.gerrit.extensions.api.changes.ChangeMessageApi;
+import com.google.gerrit.extensions.api.changes.Changes;
+import com.google.gerrit.extensions.api.changes.FixInput;
+import com.google.gerrit.extensions.api.changes.HashtagsInput;
+import com.google.gerrit.extensions.api.changes.IncludedInInfo;
+import com.google.gerrit.extensions.api.changes.MoveInput;
+import com.google.gerrit.extensions.api.changes.RebaseInput;
+import com.google.gerrit.extensions.api.changes.RestoreInput;
+import com.google.gerrit.extensions.api.changes.RevertInput;
+import com.google.gerrit.extensions.api.changes.ReviewerApi;
+import com.google.gerrit.extensions.api.changes.ReviewerInfo;
+import com.google.gerrit.extensions.api.changes.RevisionApi;
+import com.google.gerrit.extensions.api.changes.SubmittedTogetherInfo;
+import com.google.gerrit.extensions.api.changes.SubmittedTogetherOption;
+import com.google.gerrit.extensions.api.changes.TopicInput;
+import com.google.gerrit.extensions.client.ListChangesOption;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.ChangeMessageInfo;
+import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.common.CommitMessageInput;
+import com.google.gerrit.extensions.common.EditInfo;
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.common.MergePatchSetInput;
+import com.google.gerrit.extensions.common.PureRevertInfo;
+import com.google.gerrit.extensions.common.RobotCommentInfo;
+import com.google.gerrit.extensions.common.SuggestedReviewerInfo;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.server.StarredChangesUtil;
+import com.google.gerrit.server.StarredChangesUtil.IllegalLabelException;
+import com.google.gerrit.server.change.ChangeJson;
+import com.google.gerrit.server.change.ChangeMessageResource;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.SetPrivateOp;
+import com.google.gerrit.server.change.WorkInProgressOp;
+import com.google.gerrit.server.restapi.change.Abandon;
+import com.google.gerrit.server.restapi.change.ChangeIncludedIn;
+import com.google.gerrit.server.restapi.change.ChangeMessages;
+import com.google.gerrit.server.restapi.change.Check;
+import com.google.gerrit.server.restapi.change.CreateMergePatchSet;
+import com.google.gerrit.server.restapi.change.DeleteAssignee;
+import com.google.gerrit.server.restapi.change.DeleteChange;
+import com.google.gerrit.server.restapi.change.DeletePrivate;
+import com.google.gerrit.server.restapi.change.GetAssignee;
+import com.google.gerrit.server.restapi.change.GetHashtags;
+import com.google.gerrit.server.restapi.change.GetPastAssignees;
+import com.google.gerrit.server.restapi.change.GetPureRevert;
+import com.google.gerrit.server.restapi.change.GetTopic;
+import com.google.gerrit.server.restapi.change.Ignore;
+import com.google.gerrit.server.restapi.change.Index;
+import com.google.gerrit.server.restapi.change.ListChangeComments;
+import com.google.gerrit.server.restapi.change.ListChangeDrafts;
+import com.google.gerrit.server.restapi.change.ListChangeRobotComments;
+import com.google.gerrit.server.restapi.change.ListReviewers;
+import com.google.gerrit.server.restapi.change.MarkAsReviewed;
+import com.google.gerrit.server.restapi.change.MarkAsUnreviewed;
+import com.google.gerrit.server.restapi.change.Move;
+import com.google.gerrit.server.restapi.change.PostHashtags;
+import com.google.gerrit.server.restapi.change.PostPrivate;
+import com.google.gerrit.server.restapi.change.PostReviewers;
+import com.google.gerrit.server.restapi.change.PutAssignee;
+import com.google.gerrit.server.restapi.change.PutMessage;
+import com.google.gerrit.server.restapi.change.PutTopic;
+import com.google.gerrit.server.restapi.change.Rebase;
+import com.google.gerrit.server.restapi.change.Restore;
+import com.google.gerrit.server.restapi.change.Revert;
+import com.google.gerrit.server.restapi.change.Reviewers;
+import com.google.gerrit.server.restapi.change.Revisions;
+import com.google.gerrit.server.restapi.change.SetReadyForReview;
+import com.google.gerrit.server.restapi.change.SetWorkInProgress;
+import com.google.gerrit.server.restapi.change.SubmittedTogether;
+import com.google.gerrit.server.restapi.change.SuggestChangeReviewers;
+import com.google.gerrit.server.restapi.change.Unignore;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.Assisted;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+class ChangeApiImpl implements ChangeApi {
+  interface Factory {
+    ChangeApiImpl create(ChangeResource change);
+  }
+
+  private final Changes changeApi;
+  private final Reviewers reviewers;
+  private final Revisions revisions;
+  private final ReviewerApiImpl.Factory reviewerApi;
+  private final RevisionApiImpl.Factory revisionApi;
+  private final ChangeMessageApiImpl.Factory changeMessageApi;
+  private final ChangeMessages changeMessages;
+  private final SuggestChangeReviewers suggestReviewers;
+  private final ListReviewers listReviewers;
+  private final ChangeResource change;
+  private final Abandon abandon;
+  private final Revert revert;
+  private final Restore restore;
+  private final CreateMergePatchSet updateByMerge;
+  private final Provider<SubmittedTogether> submittedTogether;
+  private final Rebase.CurrentRevision rebase;
+  private final DeleteChange deleteChange;
+  private final GetTopic getTopic;
+  private final PutTopic putTopic;
+  private final ChangeIncludedIn includedIn;
+  private final PostReviewers postReviewers;
+  private final ChangeJson.Factory changeJson;
+  private final PostHashtags postHashtags;
+  private final GetHashtags getHashtags;
+  private final PutAssignee putAssignee;
+  private final GetAssignee getAssignee;
+  private final GetPastAssignees getPastAssignees;
+  private final DeleteAssignee deleteAssignee;
+  private final ListChangeComments listComments;
+  private final ListChangeRobotComments listChangeRobotComments;
+  private final ListChangeDrafts listDrafts;
+  private final ChangeEditApiImpl.Factory changeEditApi;
+  private final Check check;
+  private final Index index;
+  private final Move move;
+  private final PostPrivate postPrivate;
+  private final DeletePrivate deletePrivate;
+  private final Ignore ignore;
+  private final Unignore unignore;
+  private final MarkAsReviewed markAsReviewed;
+  private final MarkAsUnreviewed markAsUnreviewed;
+  private final SetWorkInProgress setWip;
+  private final SetReadyForReview setReady;
+  private final PutMessage putMessage;
+  private final Provider<GetPureRevert> getPureRevertProvider;
+  private final StarredChangesUtil stars;
+
+  @Inject
+  ChangeApiImpl(
+      Changes changeApi,
+      Reviewers reviewers,
+      Revisions revisions,
+      ReviewerApiImpl.Factory reviewerApi,
+      RevisionApiImpl.Factory revisionApi,
+      ChangeMessageApiImpl.Factory changeMessageApi,
+      ChangeMessages changeMessages,
+      SuggestChangeReviewers suggestReviewers,
+      ListReviewers listReviewers,
+      Abandon abandon,
+      Revert revert,
+      Restore restore,
+      CreateMergePatchSet updateByMerge,
+      Provider<SubmittedTogether> submittedTogether,
+      Rebase.CurrentRevision rebase,
+      DeleteChange deleteChange,
+      GetTopic getTopic,
+      PutTopic putTopic,
+      ChangeIncludedIn includedIn,
+      PostReviewers postReviewers,
+      ChangeJson.Factory changeJson,
+      PostHashtags postHashtags,
+      GetHashtags getHashtags,
+      PutAssignee putAssignee,
+      GetAssignee getAssignee,
+      GetPastAssignees getPastAssignees,
+      DeleteAssignee deleteAssignee,
+      ListChangeComments listComments,
+      ListChangeRobotComments listChangeRobotComments,
+      ListChangeDrafts listDrafts,
+      ChangeEditApiImpl.Factory changeEditApi,
+      Check check,
+      Index index,
+      Move move,
+      PostPrivate postPrivate,
+      DeletePrivate deletePrivate,
+      Ignore ignore,
+      Unignore unignore,
+      MarkAsReviewed markAsReviewed,
+      MarkAsUnreviewed markAsUnreviewed,
+      SetWorkInProgress setWip,
+      SetReadyForReview setReady,
+      PutMessage putMessage,
+      Provider<GetPureRevert> getPureRevertProvider,
+      StarredChangesUtil stars,
+      @Assisted ChangeResource change) {
+    this.changeApi = changeApi;
+    this.revert = revert;
+    this.reviewers = reviewers;
+    this.revisions = revisions;
+    this.reviewerApi = reviewerApi;
+    this.revisionApi = revisionApi;
+    this.changeMessageApi = changeMessageApi;
+    this.changeMessages = changeMessages;
+    this.suggestReviewers = suggestReviewers;
+    this.listReviewers = listReviewers;
+    this.abandon = abandon;
+    this.restore = restore;
+    this.updateByMerge = updateByMerge;
+    this.submittedTogether = submittedTogether;
+    this.rebase = rebase;
+    this.deleteChange = deleteChange;
+    this.getTopic = getTopic;
+    this.putTopic = putTopic;
+    this.includedIn = includedIn;
+    this.postReviewers = postReviewers;
+    this.changeJson = changeJson;
+    this.postHashtags = postHashtags;
+    this.getHashtags = getHashtags;
+    this.putAssignee = putAssignee;
+    this.getAssignee = getAssignee;
+    this.getPastAssignees = getPastAssignees;
+    this.deleteAssignee = deleteAssignee;
+    this.listComments = listComments;
+    this.listChangeRobotComments = listChangeRobotComments;
+    this.listDrafts = listDrafts;
+    this.changeEditApi = changeEditApi;
+    this.check = check;
+    this.index = index;
+    this.move = move;
+    this.postPrivate = postPrivate;
+    this.deletePrivate = deletePrivate;
+    this.ignore = ignore;
+    this.unignore = unignore;
+    this.markAsReviewed = markAsReviewed;
+    this.markAsUnreviewed = markAsUnreviewed;
+    this.setWip = setWip;
+    this.setReady = setReady;
+    this.putMessage = putMessage;
+    this.getPureRevertProvider = getPureRevertProvider;
+    this.stars = stars;
+    this.change = change;
+  }
+
+  @Override
+  public String id() {
+    return Integer.toString(change.getId().get());
+  }
+
+  @Override
+  public RevisionApi current() throws RestApiException {
+    return revision("current");
+  }
+
+  @Override
+  public RevisionApi revision(int id) throws RestApiException {
+    return revision(String.valueOf(id));
+  }
+
+  @Override
+  public RevisionApi revision(String id) throws RestApiException {
+    try {
+      return revisionApi.create(revisions.parse(change, IdString.fromDecoded(id)));
+    } catch (Exception e) {
+      throw asRestApiException("Cannot parse revision", e);
+    }
+  }
+
+  @Override
+  public ReviewerApi reviewer(String id) throws RestApiException {
+    try {
+      return reviewerApi.create(reviewers.parse(change, IdString.fromDecoded(id)));
+    } catch (Exception e) {
+      throw asRestApiException("Cannot parse reviewer", e);
+    }
+  }
+
+  @Override
+  public void abandon() throws RestApiException {
+    abandon(new AbandonInput());
+  }
+
+  @Override
+  public void abandon(AbandonInput in) throws RestApiException {
+    try {
+      abandon.apply(change, in);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot abandon change", e);
+    }
+  }
+
+  @Override
+  public void restore() throws RestApiException {
+    restore(new RestoreInput());
+  }
+
+  @Override
+  public void restore(RestoreInput in) throws RestApiException {
+    try {
+      restore.apply(change, in);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot restore change", e);
+    }
+  }
+
+  @Override
+  public void move(String destination) throws RestApiException {
+    MoveInput in = new MoveInput();
+    in.destinationBranch = destination;
+    move(in);
+  }
+
+  @Override
+  public void move(MoveInput in) throws RestApiException {
+    try {
+      move.apply(change, in);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot move change", e);
+    }
+  }
+
+  @Override
+  public void setPrivate(boolean value, @Nullable String message) throws RestApiException {
+    try {
+      SetPrivateOp.Input input = new SetPrivateOp.Input(message);
+      if (value) {
+        postPrivate.apply(change, input);
+      } else {
+        deletePrivate.apply(change, input);
+      }
+    } catch (Exception e) {
+      throw asRestApiException("Cannot change private status", e);
+    }
+  }
+
+  @Override
+  public void setWorkInProgress(@Nullable String message) throws RestApiException {
+    try {
+      setWip.apply(change, new WorkInProgressOp.Input(message));
+    } catch (Exception e) {
+      throw asRestApiException("Cannot set work in progress state", e);
+    }
+  }
+
+  @Override
+  public void setReadyForReview(@Nullable String message) throws RestApiException {
+    try {
+      setReady.apply(change, new WorkInProgressOp.Input(message));
+    } catch (Exception e) {
+      throw asRestApiException("Cannot set ready for review state", e);
+    }
+  }
+
+  @Override
+  public ChangeApi revert() throws RestApiException {
+    return revert(new RevertInput());
+  }
+
+  @Override
+  public ChangeApi revert(RevertInput in) throws RestApiException {
+    try {
+      return changeApi.id(revert.apply(change, in)._number);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot revert change", e);
+    }
+  }
+
+  @Override
+  public ChangeInfo createMergePatchSet(MergePatchSetInput in) throws RestApiException {
+    try {
+      return updateByMerge.apply(change, in).value();
+    } catch (Exception e) {
+      throw asRestApiException("Cannot update change by merge", e);
+    }
+  }
+
+  @Override
+  public List<ChangeInfo> submittedTogether() throws RestApiException {
+    SubmittedTogetherInfo info =
+        submittedTogether(
+            EnumSet.noneOf(ListChangesOption.class), EnumSet.noneOf(SubmittedTogetherOption.class));
+    return info.changes;
+  }
+
+  @Override
+  public SubmittedTogetherInfo submittedTogether(EnumSet<SubmittedTogetherOption> options)
+      throws RestApiException {
+    return submittedTogether(EnumSet.noneOf(ListChangesOption.class), options);
+  }
+
+  @Override
+  public SubmittedTogetherInfo submittedTogether(
+      EnumSet<ListChangesOption> listOptions, EnumSet<SubmittedTogetherOption> submitOptions)
+      throws RestApiException {
+    try {
+      return submittedTogether
+          .get()
+          .addListChangesOption(listOptions)
+          .addSubmittedTogetherOption(submitOptions)
+          .applyInfo(change);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot query submittedTogether", e);
+    }
+  }
+
+  @Deprecated
+  @Override
+  public void publish() throws RestApiException {
+    throw new UnsupportedOperationException("draft workflow is discontinued");
+  }
+
+  @Override
+  public void rebase() throws RestApiException {
+    rebase(new RebaseInput());
+  }
+
+  @Override
+  public void rebase(RebaseInput in) throws RestApiException {
+    try {
+      rebase.apply(change, in);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot rebase change", e);
+    }
+  }
+
+  @Override
+  public void delete() throws RestApiException {
+    try {
+      deleteChange.apply(change, null);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot delete change", e);
+    }
+  }
+
+  @Override
+  public String topic() throws RestApiException {
+    return getTopic.apply(change);
+  }
+
+  @Override
+  public void topic(String topic) throws RestApiException {
+    TopicInput in = new TopicInput();
+    in.topic = topic;
+    try {
+      putTopic.apply(change, in);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot set topic", e);
+    }
+  }
+
+  @Override
+  public IncludedInInfo includedIn() throws RestApiException {
+    try {
+      return includedIn.apply(change);
+    } catch (Exception e) {
+      throw asRestApiException("Could not extract IncludedIn data", e);
+    }
+  }
+
+  @Override
+  public AddReviewerResult addReviewer(String reviewer) throws RestApiException {
+    AddReviewerInput in = new AddReviewerInput();
+    in.reviewer = reviewer;
+    return addReviewer(in);
+  }
+
+  @Override
+  public AddReviewerResult addReviewer(AddReviewerInput in) throws RestApiException {
+    try {
+      return postReviewers.apply(change, in);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot add change reviewer", e);
+    }
+  }
+
+  @Override
+  public SuggestedReviewersRequest suggestReviewers() throws RestApiException {
+    return new SuggestedReviewersRequest() {
+      @Override
+      public List<SuggestedReviewerInfo> get() throws RestApiException {
+        return ChangeApiImpl.this.suggestReviewers(this);
+      }
+    };
+  }
+
+  @Override
+  public SuggestedReviewersRequest suggestReviewers(String query) throws RestApiException {
+    return suggestReviewers().withQuery(query);
+  }
+
+  private List<SuggestedReviewerInfo> suggestReviewers(SuggestedReviewersRequest r)
+      throws RestApiException {
+    try {
+      suggestReviewers.setQuery(r.getQuery());
+      suggestReviewers.setLimit(r.getLimit());
+      return suggestReviewers.apply(change);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve suggested reviewers", e);
+    }
+  }
+
+  @Override
+  public List<ReviewerInfo> reviewers() throws RestApiException {
+    try {
+      return listReviewers.apply(change);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve reviewers", e);
+    }
+  }
+
+  @Override
+  public ChangeInfo get(EnumSet<ListChangesOption> s) throws RestApiException {
+    try {
+      return changeJson.create(s).format(change);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve change", e);
+    }
+  }
+
+  @Override
+  public ChangeInfo get() throws RestApiException {
+    return get(
+        EnumSet.complementOf(
+            EnumSet.of(ListChangesOption.CHECK, ListChangesOption.SKIP_MERGEABLE)));
+  }
+
+  @Override
+  public EditInfo getEdit() throws RestApiException {
+    return edit().get().orElse(null);
+  }
+
+  @Override
+  public ChangeEditApi edit() throws RestApiException {
+    return changeEditApi.create(change);
+  }
+
+  @Override
+  public void setMessage(String msg) throws RestApiException {
+    CommitMessageInput in = new CommitMessageInput();
+    in.message = msg;
+    setMessage(in);
+  }
+
+  @Override
+  public void setMessage(CommitMessageInput in) throws RestApiException {
+    try {
+      putMessage.apply(change, in);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot edit commit message", e);
+    }
+  }
+
+  @Override
+  public ChangeInfo info() throws RestApiException {
+    return get(EnumSet.noneOf(ListChangesOption.class));
+  }
+
+  @Override
+  public void setHashtags(HashtagsInput input) throws RestApiException {
+    try {
+      postHashtags.apply(change, input);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot post hashtags", e);
+    }
+  }
+
+  @Override
+  public Set<String> getHashtags() throws RestApiException {
+    try {
+      return getHashtags.apply(change).value();
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get hashtags", e);
+    }
+  }
+
+  @Override
+  public AccountInfo setAssignee(AssigneeInput input) throws RestApiException {
+    try {
+      return putAssignee.apply(change, input);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot set assignee", e);
+    }
+  }
+
+  @Override
+  public AccountInfo getAssignee() throws RestApiException {
+    try {
+      Response<AccountInfo> r = getAssignee.apply(change);
+      return r.isNone() ? null : r.value();
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get assignee", e);
+    }
+  }
+
+  @Override
+  public List<AccountInfo> getPastAssignees() throws RestApiException {
+    try {
+      return getPastAssignees.apply(change).value();
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get past assignees", e);
+    }
+  }
+
+  @Override
+  public AccountInfo deleteAssignee() throws RestApiException {
+    try {
+      Response<AccountInfo> r = deleteAssignee.apply(change, null);
+      return r.isNone() ? null : r.value();
+    } catch (Exception e) {
+      throw asRestApiException("Cannot delete assignee", e);
+    }
+  }
+
+  @Override
+  public Map<String, List<CommentInfo>> comments() throws RestApiException {
+    try {
+      return listComments.apply(change);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get comments", e);
+    }
+  }
+
+  @Override
+  public Map<String, List<RobotCommentInfo>> robotComments() throws RestApiException {
+    try {
+      return listChangeRobotComments.apply(change);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get robot comments", e);
+    }
+  }
+
+  @Override
+  public Map<String, List<CommentInfo>> drafts() throws RestApiException {
+    try {
+      return listDrafts.apply(change);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get drafts", e);
+    }
+  }
+
+  @Override
+  public ChangeInfo check() throws RestApiException {
+    try {
+      return check.apply(change).value();
+    } catch (Exception e) {
+      throw asRestApiException("Cannot check change", e);
+    }
+  }
+
+  @Override
+  public ChangeInfo check(FixInput fix) throws RestApiException {
+    try {
+      // TODO(dborowitz): Convert to RetryingRestModifyView. Needs to plumb BatchUpdate.Factory into
+      // ConsistencyChecker.
+      return check.apply(change, fix).value();
+    } catch (Exception e) {
+      throw asRestApiException("Cannot check change", e);
+    }
+  }
+
+  @Override
+  public void index() throws RestApiException {
+    try {
+      index.apply(change, new Input());
+    } catch (Exception e) {
+      throw asRestApiException("Cannot index change", e);
+    }
+  }
+
+  @Override
+  public void ignore(boolean ignore) throws RestApiException {
+    // TODO(dborowitz): Convert to RetryingRestModifyView. Needs to plumb BatchUpdate.Factory into
+    // StarredChangesUtil.
+    try {
+      if (ignore) {
+        this.ignore.apply(change, new Input());
+      } else {
+        unignore.apply(change, new Input());
+      }
+    } catch (OrmException | IllegalLabelException e) {
+      throw asRestApiException("Cannot ignore change", e);
+    }
+  }
+
+  @Override
+  public boolean ignored() throws RestApiException {
+    try {
+      return stars.isIgnored(change);
+    } catch (OrmException e) {
+      throw asRestApiException("Cannot check if ignored", e);
+    }
+  }
+
+  @Override
+  public void markAsReviewed(boolean reviewed) throws RestApiException {
+    // TODO(dborowitz): Convert to RetryingRestModifyView. Needs to plumb BatchUpdate.Factory into
+    // StarredChangesUtil.
+    try {
+      if (reviewed) {
+        markAsReviewed.apply(change, new Input());
+      } else {
+        markAsUnreviewed.apply(change, new Input());
+      }
+    } catch (OrmException | IllegalLabelException e) {
+      throw asRestApiException(
+          "Cannot mark change as " + (reviewed ? "reviewed" : "unreviewed"), e);
+    }
+  }
+
+  @Override
+  public PureRevertInfo pureRevert() throws RestApiException {
+    return pureRevert(null);
+  }
+
+  @Override
+  public PureRevertInfo pureRevert(@Nullable String claimedOriginal) throws RestApiException {
+    try {
+      GetPureRevert getPureRevert = getPureRevertProvider.get();
+      getPureRevert.setClaimedOriginal(claimedOriginal);
+      return getPureRevert.apply(change);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot compute pure revert", e);
+    }
+  }
+
+  @Override
+  public List<ChangeMessageInfo> messages() throws RestApiException {
+    try {
+      return changeMessages.list().apply(change);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot list change messages", e);
+    }
+  }
+
+  @Override
+  public ChangeMessageApi message(String id) throws RestApiException {
+    try {
+      ChangeMessageResource resource = changeMessages.parse(change, IdString.fromDecoded(id));
+      return changeMessageApi.create(resource);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot parse change message " + id, e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/api/changes/ChangeEditApiImpl.java b/java/com/google/gerrit/server/api/changes/ChangeEditApiImpl.java
new file mode 100644
index 0000000..5aa4cf1
--- /dev/null
+++ b/java/com/google/gerrit/server/api/changes/ChangeEditApiImpl.java
@@ -0,0 +1,248 @@
+// Copyright (C) 2017 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.google.gerrit.server.api.changes;
+
+import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
+
+import com.google.gerrit.extensions.api.changes.ChangeEditApi;
+import com.google.gerrit.extensions.api.changes.PublishChangeEditInput;
+import com.google.gerrit.extensions.client.ChangeEditDetailOption;
+import com.google.gerrit.extensions.common.EditInfo;
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BinaryResult;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.RawInput;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.server.change.ChangeEditResource;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.restapi.change.ChangeEdits;
+import com.google.gerrit.server.restapi.change.DeleteChangeEdit;
+import com.google.gerrit.server.restapi.change.PublishChangeEdit;
+import com.google.gerrit.server.restapi.change.RebaseChangeEdit;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.util.Optional;
+
+public class ChangeEditApiImpl implements ChangeEditApi {
+  interface Factory {
+    ChangeEditApiImpl create(ChangeResource changeResource);
+  }
+
+  private final Provider<ChangeEdits.Detail> editDetailProvider;
+  private final ChangeEdits.Post changeEditsPost;
+  private final DeleteChangeEdit deleteChangeEdit;
+  private final RebaseChangeEdit rebaseChangeEdit;
+  private final PublishChangeEdit publishChangeEdit;
+  private final Provider<ChangeEdits.Get> changeEditsGetProvider;
+  private final ChangeEdits.Put changeEditsPut;
+  private final ChangeEdits.DeleteContent changeEditDeleteContent;
+  private final Provider<ChangeEdits.GetMessage> getChangeEditCommitMessageProvider;
+  private final ChangeEdits.EditMessage modifyChangeEditCommitMessage;
+  private final ChangeEdits changeEdits;
+  private final ChangeResource changeResource;
+
+  @Inject
+  public ChangeEditApiImpl(
+      Provider<ChangeEdits.Detail> editDetailProvider,
+      ChangeEdits.Post changeEditsPost,
+      DeleteChangeEdit deleteChangeEdit,
+      RebaseChangeEdit rebaseChangeEdit,
+      PublishChangeEdit publishChangeEdit,
+      Provider<ChangeEdits.Get> changeEditsGetProvider,
+      ChangeEdits.Put changeEditsPut,
+      ChangeEdits.DeleteContent changeEditDeleteContent,
+      Provider<ChangeEdits.GetMessage> getChangeEditCommitMessageProvider,
+      ChangeEdits.EditMessage modifyChangeEditCommitMessage,
+      ChangeEdits changeEdits,
+      @Assisted ChangeResource changeResource) {
+    this.editDetailProvider = editDetailProvider;
+    this.changeEditsPost = changeEditsPost;
+    this.deleteChangeEdit = deleteChangeEdit;
+    this.rebaseChangeEdit = rebaseChangeEdit;
+    this.publishChangeEdit = publishChangeEdit;
+    this.changeEditsGetProvider = changeEditsGetProvider;
+    this.changeEditsPut = changeEditsPut;
+    this.changeEditDeleteContent = changeEditDeleteContent;
+    this.getChangeEditCommitMessageProvider = getChangeEditCommitMessageProvider;
+    this.modifyChangeEditCommitMessage = modifyChangeEditCommitMessage;
+    this.changeEdits = changeEdits;
+    this.changeResource = changeResource;
+  }
+
+  @Override
+  public ChangeEditDetailRequest detail() throws RestApiException {
+    try {
+      return new ChangeEditDetailRequest() {
+        @Override
+        public Optional<EditInfo> get() throws RestApiException {
+          return ChangeEditApiImpl.this.get(this);
+        }
+      };
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve change edit", e);
+    }
+  }
+
+  private Optional<EditInfo> get(ChangeEditDetailRequest r) throws RestApiException {
+    try {
+      ChangeEdits.Detail editDetail = editDetailProvider.get();
+      editDetail.setBase(r.getBase());
+      editDetail.setList(r.options().contains(ChangeEditDetailOption.LIST_FILES));
+      editDetail.setDownloadCommands(
+          r.options().contains(ChangeEditDetailOption.DOWNLOAD_COMMANDS));
+      Response<EditInfo> edit = editDetail.apply(changeResource);
+      return edit.isNone() ? Optional.empty() : Optional.of(edit.value());
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve change edit", e);
+    }
+  }
+
+  @Override
+  public Optional<EditInfo> get() throws RestApiException {
+    try {
+      Response<EditInfo> edit = editDetailProvider.get().apply(changeResource);
+      return edit.isNone() ? Optional.empty() : Optional.of(edit.value());
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve change edit", e);
+    }
+  }
+
+  @Override
+  public void create() throws RestApiException {
+    try {
+      changeEditsPost.apply(changeResource, null);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot create change edit", e);
+    }
+  }
+
+  @Override
+  public void delete() throws RestApiException {
+    try {
+      deleteChangeEdit.apply(changeResource, new Input());
+    } catch (Exception e) {
+      throw asRestApiException("Cannot delete change edit", e);
+    }
+  }
+
+  @Override
+  public void rebase() throws RestApiException {
+    try {
+      rebaseChangeEdit.apply(changeResource, null);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot rebase change edit", e);
+    }
+  }
+
+  @Override
+  public void publish() throws RestApiException {
+    publish(null);
+  }
+
+  @Override
+  public void publish(PublishChangeEditInput publishChangeEditInput) throws RestApiException {
+    try {
+      publishChangeEdit.apply(changeResource, publishChangeEditInput);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot publish change edit", e);
+    }
+  }
+
+  @Override
+  public Optional<BinaryResult> getFile(String filePath) throws RestApiException {
+    try {
+      ChangeEditResource changeEditResource = getChangeEditResource(filePath);
+      Response<BinaryResult> fileResponse = changeEditsGetProvider.get().apply(changeEditResource);
+      return fileResponse.isNone() ? Optional.empty() : Optional.of(fileResponse.value());
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve file of change edit", e);
+    }
+  }
+
+  @Override
+  public void renameFile(String oldFilePath, String newFilePath) throws RestApiException {
+    try {
+      ChangeEdits.Post.Input renameInput = new ChangeEdits.Post.Input();
+      renameInput.oldPath = oldFilePath;
+      renameInput.newPath = newFilePath;
+      changeEditsPost.apply(changeResource, renameInput);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot rename file of change edit", e);
+    }
+  }
+
+  @Override
+  public void restoreFile(String filePath) throws RestApiException {
+    try {
+      ChangeEdits.Post.Input restoreInput = new ChangeEdits.Post.Input();
+      restoreInput.restorePath = filePath;
+      changeEditsPost.apply(changeResource, restoreInput);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot restore file of change edit", e);
+    }
+  }
+
+  @Override
+  public void modifyFile(String filePath, RawInput newContent) throws RestApiException {
+    try {
+      changeEditsPut.apply(changeResource, filePath, newContent);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot modify file of change edit", e);
+    }
+  }
+
+  @Override
+  public void deleteFile(String filePath) throws RestApiException {
+    try {
+      changeEditDeleteContent.apply(changeResource, filePath);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot delete file of change edit", e);
+    }
+  }
+
+  @Override
+  public String getCommitMessage() throws RestApiException {
+    try {
+      try (BinaryResult binaryResult =
+          getChangeEditCommitMessageProvider.get().apply(changeResource)) {
+        return binaryResult.asString();
+      }
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get commit message of change edit", e);
+    }
+  }
+
+  @Override
+  public void modifyCommitMessage(String newCommitMessage) throws RestApiException {
+    ChangeEdits.EditMessage.Input input = new ChangeEdits.EditMessage.Input();
+    input.message = newCommitMessage;
+    try {
+      modifyChangeEditCommitMessage.apply(changeResource, input);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot modify commit message of change edit", e);
+    }
+  }
+
+  private ChangeEditResource getChangeEditResource(String filePath)
+      throws ResourceNotFoundException, AuthException, IOException, OrmException {
+    return changeEdits.parse(changeResource, IdString.fromDecoded(filePath));
+  }
+}
diff --git a/java/com/google/gerrit/server/api/changes/ChangeMessageApiImpl.java b/java/com/google/gerrit/server/api/changes/ChangeMessageApiImpl.java
new file mode 100644
index 0000000..14310e8
--- /dev/null
+++ b/java/com/google/gerrit/server/api/changes/ChangeMessageApiImpl.java
@@ -0,0 +1,65 @@
+// 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.
+
+package com.google.gerrit.server.api.changes;
+
+import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
+
+import com.google.gerrit.extensions.api.changes.ChangeMessageApi;
+import com.google.gerrit.extensions.api.changes.DeleteChangeMessageInput;
+import com.google.gerrit.extensions.common.ChangeMessageInfo;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.server.change.ChangeMessageResource;
+import com.google.gerrit.server.restapi.change.DeleteChangeMessage;
+import com.google.gerrit.server.restapi.change.GetChangeMessage;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+
+class ChangeMessageApiImpl implements ChangeMessageApi {
+  interface Factory {
+    ChangeMessageApiImpl create(ChangeMessageResource changeMessageResource);
+  }
+
+  private final GetChangeMessage getChangeMessage;
+  private final DeleteChangeMessage deleteChangeMessage;
+  private final ChangeMessageResource changeMessageResource;
+
+  @Inject
+  ChangeMessageApiImpl(
+      GetChangeMessage getChangeMessage,
+      DeleteChangeMessage deleteChangeMessage,
+      @Assisted ChangeMessageResource changeMessageResource) {
+    this.getChangeMessage = getChangeMessage;
+    this.deleteChangeMessage = deleteChangeMessage;
+    this.changeMessageResource = changeMessageResource;
+  }
+
+  @Override
+  public ChangeMessageInfo get() throws RestApiException {
+    try {
+      return getChangeMessage.apply(changeMessageResource);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve change message", e);
+    }
+  }
+
+  @Override
+  public ChangeMessageInfo delete(DeleteChangeMessageInput input) throws RestApiException {
+    try {
+      return deleteChangeMessage.apply(changeMessageResource, input).value();
+    } catch (Exception e) {
+      throw asRestApiException("Cannot delete change message", e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/api/changes/ChangesImpl.java b/java/com/google/gerrit/server/api/changes/ChangesImpl.java
new file mode 100644
index 0000000..2f19040
--- /dev/null
+++ b/java/com/google/gerrit/server/api/changes/ChangesImpl.java
@@ -0,0 +1,141 @@
+// Copyright (C) 2013 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.google.gerrit.server.api.changes;
+
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.base.Joiner;
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.extensions.api.changes.ChangeApi;
+import com.google.gerrit.extensions.api.changes.Changes;
+import com.google.gerrit.extensions.client.ListChangesOption;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.ChangeInput;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.extensions.restapi.Url;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.restapi.change.ChangesCollection;
+import com.google.gerrit.server.restapi.change.CreateChange;
+import com.google.gerrit.server.restapi.change.QueryChanges;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.List;
+
+@Singleton
+class ChangesImpl implements Changes {
+  private final ChangesCollection changes;
+  private final ChangeApiImpl.Factory api;
+  private final CreateChange createChange;
+  private final Provider<QueryChanges> queryProvider;
+
+  @Inject
+  ChangesImpl(
+      ChangesCollection changes,
+      ChangeApiImpl.Factory api,
+      CreateChange createChange,
+      Provider<QueryChanges> queryProvider) {
+    this.changes = changes;
+    this.api = api;
+    this.createChange = createChange;
+    this.queryProvider = queryProvider;
+  }
+
+  @Override
+  public ChangeApi id(int id) throws RestApiException {
+    return id(String.valueOf(id));
+  }
+
+  @Override
+  public ChangeApi id(String project, String branch, String id) throws RestApiException {
+    return id(
+        Joiner.on('~')
+            .join(ImmutableList.of(Url.encode(project), Url.encode(branch), Url.encode(id))));
+  }
+
+  @Override
+  public ChangeApi id(String id) throws RestApiException {
+    try {
+      return api.create(changes.parse(TopLevelResource.INSTANCE, IdString.fromUrl(id)));
+    } catch (Exception e) {
+      throw asRestApiException("Cannot parse change", e);
+    }
+  }
+
+  @Override
+  public ChangeApi id(String project, int id) throws RestApiException {
+    return id(
+        Joiner.on('~').join(ImmutableList.of(Url.encode(project), Url.encode(String.valueOf(id)))));
+  }
+
+  @Override
+  public ChangeApi create(ChangeInput in) throws RestApiException {
+    try {
+      ChangeInfo out = createChange.apply(TopLevelResource.INSTANCE, in).value();
+      return api.create(changes.parse(new Change.Id(out._number)));
+    } catch (Exception e) {
+      throw asRestApiException("Cannot create change", e);
+    }
+  }
+
+  @Override
+  public QueryRequest query() {
+    return new QueryRequest() {
+      @Override
+      public List<ChangeInfo> get() throws RestApiException {
+        return ChangesImpl.this.get(this);
+      }
+    };
+  }
+
+  @Override
+  public QueryRequest query(String query) {
+    return query().withQuery(query);
+  }
+
+  private List<ChangeInfo> get(QueryRequest q) throws RestApiException {
+    QueryChanges qc = queryProvider.get();
+    if (q.getQuery() != null) {
+      qc.addQuery(q.getQuery());
+    }
+    qc.setLimit(q.getLimit());
+    qc.setStart(q.getStart());
+    for (ListChangesOption option : q.getOptions()) {
+      qc.addOption(option);
+    }
+
+    try {
+      List<?> result = qc.apply(TopLevelResource.INSTANCE);
+      if (result.isEmpty()) {
+        return ImmutableList.of();
+      }
+
+      // Check type safety of result; the extension API should be safer than the
+      // REST API in this case, since it's intended to be used in Java.
+      Object first = requireNonNull(result.iterator().next());
+      checkState(first instanceof ChangeInfo);
+      @SuppressWarnings("unchecked")
+      List<ChangeInfo> infos = (List<ChangeInfo>) result;
+
+      return ImmutableList.copyOf(infos);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot query changes", e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/api/changes/CommentApiImpl.java b/java/com/google/gerrit/server/api/changes/CommentApiImpl.java
new file mode 100644
index 0000000..418187d
--- /dev/null
+++ b/java/com/google/gerrit/server/api/changes/CommentApiImpl.java
@@ -0,0 +1,63 @@
+// Copyright (C) 2014 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.google.gerrit.server.api.changes;
+
+import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
+
+import com.google.gerrit.extensions.api.changes.CommentApi;
+import com.google.gerrit.extensions.api.changes.DeleteCommentInput;
+import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.server.change.CommentResource;
+import com.google.gerrit.server.restapi.change.DeleteComment;
+import com.google.gerrit.server.restapi.change.GetComment;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+
+class CommentApiImpl implements CommentApi {
+  interface Factory {
+    CommentApiImpl create(CommentResource c);
+  }
+
+  private final GetComment getComment;
+  private final DeleteComment deleteComment;
+  private final CommentResource comment;
+
+  @Inject
+  CommentApiImpl(
+      GetComment getComment, DeleteComment deleteComment, @Assisted CommentResource comment) {
+    this.getComment = getComment;
+    this.deleteComment = deleteComment;
+    this.comment = comment;
+  }
+
+  @Override
+  public CommentInfo get() throws RestApiException {
+    try {
+      return getComment.apply(comment);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve comment", e);
+    }
+  }
+
+  @Override
+  public CommentInfo delete(DeleteCommentInput input) throws RestApiException {
+    try {
+      return deleteComment.apply(comment, input);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot delete comment", e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/api/changes/DraftApiImpl.java b/java/com/google/gerrit/server/api/changes/DraftApiImpl.java
new file mode 100644
index 0000000..4d26b11
--- /dev/null
+++ b/java/com/google/gerrit/server/api/changes/DraftApiImpl.java
@@ -0,0 +1,85 @@
+// Copyright (C) 2014 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.google.gerrit.server.api.changes;
+
+import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
+
+import com.google.gerrit.extensions.api.changes.DeleteCommentInput;
+import com.google.gerrit.extensions.api.changes.DraftApi;
+import com.google.gerrit.extensions.api.changes.DraftInput;
+import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.restapi.NotImplementedException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.server.change.DraftCommentResource;
+import com.google.gerrit.server.restapi.change.DeleteDraftComment;
+import com.google.gerrit.server.restapi.change.GetDraftComment;
+import com.google.gerrit.server.restapi.change.PutDraftComment;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+
+class DraftApiImpl implements DraftApi {
+  interface Factory {
+    DraftApiImpl create(DraftCommentResource d);
+  }
+
+  private final DeleteDraftComment deleteDraft;
+  private final GetDraftComment getDraft;
+  private final PutDraftComment putDraft;
+  private final DraftCommentResource draft;
+
+  @Inject
+  DraftApiImpl(
+      DeleteDraftComment deleteDraft,
+      GetDraftComment getDraft,
+      PutDraftComment putDraft,
+      @Assisted DraftCommentResource draft) {
+    this.deleteDraft = deleteDraft;
+    this.getDraft = getDraft;
+    this.putDraft = putDraft;
+    this.draft = draft;
+  }
+
+  @Override
+  public CommentInfo get() throws RestApiException {
+    try {
+      return getDraft.apply(draft);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve draft", e);
+    }
+  }
+
+  @Override
+  public CommentInfo update(DraftInput in) throws RestApiException {
+    try {
+      return putDraft.apply(draft, in).value();
+    } catch (Exception e) {
+      throw asRestApiException("Cannot update draft", e);
+    }
+  }
+
+  @Override
+  public void delete() throws RestApiException {
+    try {
+      deleteDraft.apply(draft, null);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot delete draft", e);
+    }
+  }
+
+  @Override
+  public CommentInfo delete(DeleteCommentInput input) {
+    throw new NotImplementedException();
+  }
+}
diff --git a/java/com/google/gerrit/server/api/changes/FileApiImpl.java b/java/com/google/gerrit/server/api/changes/FileApiImpl.java
new file mode 100644
index 0000000..f2d0ef8
--- /dev/null
+++ b/java/com/google/gerrit/server/api/changes/FileApiImpl.java
@@ -0,0 +1,135 @@
+// Copyright (C) 2014 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.google.gerrit.server.api.changes;
+
+import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
+
+import com.google.gerrit.extensions.api.changes.FileApi;
+import com.google.gerrit.extensions.common.DiffInfo;
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.BinaryResult;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.server.change.FileResource;
+import com.google.gerrit.server.restapi.change.GetContent;
+import com.google.gerrit.server.restapi.change.GetDiff;
+import com.google.gerrit.server.restapi.change.Reviewed;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+
+class FileApiImpl implements FileApi {
+  interface Factory {
+    FileApiImpl create(FileResource r);
+  }
+
+  private final GetContent getContent;
+  private final GetDiff getDiff;
+  private final Reviewed.PutReviewed putReviewed;
+  private final Reviewed.DeleteReviewed deleteReviewed;
+  private final FileResource file;
+
+  @Inject
+  FileApiImpl(
+      GetContent getContent,
+      GetDiff getDiff,
+      Reviewed.PutReviewed putReviewed,
+      Reviewed.DeleteReviewed deleteReviewed,
+      @Assisted FileResource file) {
+    this.getContent = getContent;
+    this.getDiff = getDiff;
+    this.putReviewed = putReviewed;
+    this.deleteReviewed = deleteReviewed;
+    this.file = file;
+  }
+
+  @Override
+  public BinaryResult content() throws RestApiException {
+    try {
+      return getContent.apply(file);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve file content", e);
+    }
+  }
+
+  @Override
+  public DiffInfo diff() throws RestApiException {
+    try {
+      return getDiff.apply(file).value();
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve diff", e);
+    }
+  }
+
+  @Override
+  public DiffInfo diff(String base) throws RestApiException {
+    try {
+      return getDiff.setBase(base).apply(file).value();
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve diff", e);
+    }
+  }
+
+  @Override
+  public DiffInfo diff(int parent) throws RestApiException {
+    try {
+      return getDiff.setParent(parent).apply(file).value();
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve diff", e);
+    }
+  }
+
+  @Override
+  public DiffRequest diffRequest() {
+    return new DiffRequest() {
+      @Override
+      public DiffInfo get() throws RestApiException {
+        return FileApiImpl.this.get(this);
+      }
+    };
+  }
+
+  @Override
+  public void setReviewed(boolean reviewed) throws RestApiException {
+    try {
+      if (reviewed) {
+        putReviewed.apply(file, new Input());
+      } else {
+        deleteReviewed.apply(file, new Input());
+      }
+    } catch (Exception e) {
+      throw asRestApiException(String.format("Cannot set %sreviewed", reviewed ? "" : "un"), e);
+    }
+  }
+
+  private DiffInfo get(DiffRequest r) throws RestApiException {
+    if (r.getBase() != null) {
+      getDiff.setBase(r.getBase());
+    }
+    if (r.getContext() != null) {
+      getDiff.setContext(r.getContext());
+    }
+    if (r.getIntraline() != null) {
+      getDiff.setIntraline(r.getIntraline());
+    }
+    if (r.getWhitespace() != null) {
+      getDiff.setWhitespace(r.getWhitespace());
+    }
+    r.getParent().ifPresent(getDiff::setParent);
+    try {
+      return getDiff.apply(file).value();
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve diff", e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/api/changes/Module.java b/java/com/google/gerrit/server/api/changes/Module.java
new file mode 100644
index 0000000..0edd58a
--- /dev/null
+++ b/java/com/google/gerrit/server/api/changes/Module.java
@@ -0,0 +1,36 @@
+// Copyright (C) 2013 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.google.gerrit.server.api.changes;
+
+import com.google.gerrit.extensions.api.changes.Changes;
+import com.google.gerrit.extensions.config.FactoryModule;
+
+public class Module extends FactoryModule {
+  @Override
+  protected void configure() {
+    bind(Changes.class).to(ChangesImpl.class);
+
+    factory(ChangeApiImpl.Factory.class);
+    factory(CommentApiImpl.Factory.class);
+    factory(RobotCommentApiImpl.Factory.class);
+    factory(DraftApiImpl.Factory.class);
+    factory(RevisionApiImpl.Factory.class);
+    factory(FileApiImpl.Factory.class);
+    factory(ReviewerApiImpl.Factory.class);
+    factory(RevisionReviewerApiImpl.Factory.class);
+    factory(ChangeEditApiImpl.Factory.class);
+    factory(ChangeMessageApiImpl.Factory.class);
+  }
+}
diff --git a/java/com/google/gerrit/server/api/changes/ReviewerApiImpl.java b/java/com/google/gerrit/server/api/changes/ReviewerApiImpl.java
new file mode 100644
index 0000000..11536cb
--- /dev/null
+++ b/java/com/google/gerrit/server/api/changes/ReviewerApiImpl.java
@@ -0,0 +1,94 @@
+// Copyright (C) 2014 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.google.gerrit.server.api.changes;
+
+import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
+
+import com.google.gerrit.extensions.api.changes.DeleteReviewerInput;
+import com.google.gerrit.extensions.api.changes.DeleteVoteInput;
+import com.google.gerrit.extensions.api.changes.ReviewerApi;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.server.change.ReviewerResource;
+import com.google.gerrit.server.change.VoteResource;
+import com.google.gerrit.server.restapi.change.DeleteReviewer;
+import com.google.gerrit.server.restapi.change.DeleteVote;
+import com.google.gerrit.server.restapi.change.Votes;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.util.Map;
+
+public class ReviewerApiImpl implements ReviewerApi {
+  interface Factory {
+    ReviewerApiImpl create(ReviewerResource r);
+  }
+
+  private final ReviewerResource reviewer;
+  private final Votes.List listVotes;
+  private final DeleteVote deleteVote;
+  private final DeleteReviewer deleteReviewer;
+
+  @Inject
+  ReviewerApiImpl(
+      Votes.List listVotes,
+      DeleteVote deleteVote,
+      DeleteReviewer deleteReviewer,
+      @Assisted ReviewerResource reviewer) {
+    this.listVotes = listVotes;
+    this.deleteVote = deleteVote;
+    this.deleteReviewer = deleteReviewer;
+    this.reviewer = reviewer;
+  }
+
+  @Override
+  public Map<String, Short> votes() throws RestApiException {
+    try {
+      return listVotes.apply(reviewer);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot list votes", e);
+    }
+  }
+
+  @Override
+  public void deleteVote(String label) throws RestApiException {
+    try {
+      deleteVote.apply(new VoteResource(reviewer, label), null);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot delete vote", e);
+    }
+  }
+
+  @Override
+  public void deleteVote(DeleteVoteInput input) throws RestApiException {
+    try {
+      deleteVote.apply(new VoteResource(reviewer, input.label), input);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot delete vote", e);
+    }
+  }
+
+  @Override
+  public void remove() throws RestApiException {
+    remove(new DeleteReviewerInput());
+  }
+
+  @Override
+  public void remove(DeleteReviewerInput input) throws RestApiException {
+    try {
+      deleteReviewer.apply(reviewer, input);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot remove reviewer", e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/api/changes/RevisionApiImpl.java b/java/com/google/gerrit/server/api/changes/RevisionApiImpl.java
new file mode 100644
index 0000000..dff29b0
--- /dev/null
+++ b/java/com/google/gerrit/server/api/changes/RevisionApiImpl.java
@@ -0,0 +1,675 @@
+// Copyright (C) 2013 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.google.gerrit.server.api.changes;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.MultimapBuilder.ListMultimapBuilder;
+import com.google.gerrit.extensions.api.changes.ChangeApi;
+import com.google.gerrit.extensions.api.changes.Changes;
+import com.google.gerrit.extensions.api.changes.CherryPickInput;
+import com.google.gerrit.extensions.api.changes.CommentApi;
+import com.google.gerrit.extensions.api.changes.DraftApi;
+import com.google.gerrit.extensions.api.changes.DraftInput;
+import com.google.gerrit.extensions.api.changes.FileApi;
+import com.google.gerrit.extensions.api.changes.RebaseInput;
+import com.google.gerrit.extensions.api.changes.RelatedChangesInfo;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.changes.ReviewResult;
+import com.google.gerrit.extensions.api.changes.RevisionApi;
+import com.google.gerrit.extensions.api.changes.RevisionReviewerApi;
+import com.google.gerrit.extensions.api.changes.RobotCommentApi;
+import com.google.gerrit.extensions.api.changes.SubmitInput;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.extensions.common.ActionInfo;
+import com.google.gerrit.extensions.common.ApprovalInfo;
+import com.google.gerrit.extensions.common.CherryPickChangeInfo;
+import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.common.CommitInfo;
+import com.google.gerrit.extensions.common.DescriptionInput;
+import com.google.gerrit.extensions.common.EditInfo;
+import com.google.gerrit.extensions.common.FileInfo;
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.common.MergeableInfo;
+import com.google.gerrit.extensions.common.RobotCommentInfo;
+import com.google.gerrit.extensions.common.TestSubmitRuleInfo;
+import com.google.gerrit.extensions.common.TestSubmitRuleInput;
+import com.google.gerrit.extensions.restapi.BinaryResult;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.account.AccountDirectory.FillOptions;
+import com.google.gerrit.server.account.AccountLoader;
+import com.google.gerrit.server.change.FileResource;
+import com.google.gerrit.server.change.RebaseUtil;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.restapi.change.ApplyFix;
+import com.google.gerrit.server.restapi.change.CherryPick;
+import com.google.gerrit.server.restapi.change.Comments;
+import com.google.gerrit.server.restapi.change.CreateDraftComment;
+import com.google.gerrit.server.restapi.change.DraftComments;
+import com.google.gerrit.server.restapi.change.Files;
+import com.google.gerrit.server.restapi.change.Fixes;
+import com.google.gerrit.server.restapi.change.GetCommit;
+import com.google.gerrit.server.restapi.change.GetDescription;
+import com.google.gerrit.server.restapi.change.GetMergeList;
+import com.google.gerrit.server.restapi.change.GetPatch;
+import com.google.gerrit.server.restapi.change.GetRelated;
+import com.google.gerrit.server.restapi.change.GetRevisionActions;
+import com.google.gerrit.server.restapi.change.ListRevisionComments;
+import com.google.gerrit.server.restapi.change.ListRevisionDrafts;
+import com.google.gerrit.server.restapi.change.ListRobotComments;
+import com.google.gerrit.server.restapi.change.Mergeable;
+import com.google.gerrit.server.restapi.change.PostReview;
+import com.google.gerrit.server.restapi.change.PreviewSubmit;
+import com.google.gerrit.server.restapi.change.PutDescription;
+import com.google.gerrit.server.restapi.change.Rebase;
+import com.google.gerrit.server.restapi.change.Reviewed;
+import com.google.gerrit.server.restapi.change.RevisionReviewers;
+import com.google.gerrit.server.restapi.change.RobotComments;
+import com.google.gerrit.server.restapi.change.Submit;
+import com.google.gerrit.server.restapi.change.TestSubmitRule;
+import com.google.gerrit.server.restapi.change.TestSubmitType;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.Assisted;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+class RevisionApiImpl implements RevisionApi {
+  interface Factory {
+    RevisionApiImpl create(RevisionResource r);
+  }
+
+  private final GitRepositoryManager repoManager;
+  private final Changes changes;
+  private final RevisionReviewers revisionReviewers;
+  private final RevisionReviewerApiImpl.Factory revisionReviewerApi;
+  private final CherryPick cherryPick;
+  private final Rebase rebase;
+  private final RebaseUtil rebaseUtil;
+  private final Submit submit;
+  private final PreviewSubmit submitPreview;
+  private final Reviewed.PutReviewed putReviewed;
+  private final Reviewed.DeleteReviewed deleteReviewed;
+  private final RevisionResource revision;
+  private final Files files;
+  private final Files.ListFiles listFiles;
+  private final GetCommit getCommit;
+  private final GetPatch getPatch;
+  private final PostReview review;
+  private final Mergeable mergeable;
+  private final FileApiImpl.Factory fileApi;
+  private final ListRevisionComments listComments;
+  private final ListRobotComments listRobotComments;
+  private final ApplyFix applyFix;
+  private final Fixes fixes;
+  private final ListRevisionDrafts listDrafts;
+  private final CreateDraftComment createDraft;
+  private final DraftComments drafts;
+  private final DraftApiImpl.Factory draftFactory;
+  private final Comments comments;
+  private final CommentApiImpl.Factory commentFactory;
+  private final RobotComments robotComments;
+  private final RobotCommentApiImpl.Factory robotCommentFactory;
+  private final GetRevisionActions revisionActions;
+  private final TestSubmitType testSubmitType;
+  private final TestSubmitType.Get getSubmitType;
+  private final Provider<TestSubmitRule> testSubmitRule;
+  private final Provider<GetMergeList> getMergeList;
+  private final GetRelated getRelated;
+  private final PutDescription putDescription;
+  private final GetDescription getDescription;
+  private final ApprovalsUtil approvalsUtil;
+  private final Provider<ReviewDb> db;
+  private final AccountLoader.Factory accountLoaderFactory;
+
+  @Inject
+  RevisionApiImpl(
+      GitRepositoryManager repoManager,
+      Changes changes,
+      RevisionReviewers revisionReviewers,
+      RevisionReviewerApiImpl.Factory revisionReviewerApi,
+      CherryPick cherryPick,
+      Rebase rebase,
+      RebaseUtil rebaseUtil,
+      Submit submit,
+      PreviewSubmit submitPreview,
+      Reviewed.PutReviewed putReviewed,
+      Reviewed.DeleteReviewed deleteReviewed,
+      Files files,
+      Files.ListFiles listFiles,
+      GetCommit getCommit,
+      GetPatch getPatch,
+      PostReview review,
+      Mergeable mergeable,
+      FileApiImpl.Factory fileApi,
+      ListRevisionComments listComments,
+      ListRobotComments listRobotComments,
+      ApplyFix applyFix,
+      Fixes fixes,
+      ListRevisionDrafts listDrafts,
+      CreateDraftComment createDraft,
+      DraftComments drafts,
+      DraftApiImpl.Factory draftFactory,
+      Comments comments,
+      CommentApiImpl.Factory commentFactory,
+      RobotComments robotComments,
+      RobotCommentApiImpl.Factory robotCommentFactory,
+      GetRevisionActions revisionActions,
+      TestSubmitType testSubmitType,
+      TestSubmitType.Get getSubmitType,
+      Provider<TestSubmitRule> testSubmitRule,
+      Provider<GetMergeList> getMergeList,
+      GetRelated getRelated,
+      PutDescription putDescription,
+      GetDescription getDescription,
+      ApprovalsUtil approvalsUtil,
+      Provider<ReviewDb> db,
+      AccountLoader.Factory accountLoaderFactory,
+      @Assisted RevisionResource r) {
+    this.repoManager = repoManager;
+    this.changes = changes;
+    this.revisionReviewers = revisionReviewers;
+    this.revisionReviewerApi = revisionReviewerApi;
+    this.cherryPick = cherryPick;
+    this.rebase = rebase;
+    this.rebaseUtil = rebaseUtil;
+    this.review = review;
+    this.submit = submit;
+    this.submitPreview = submitPreview;
+    this.files = files;
+    this.putReviewed = putReviewed;
+    this.deleteReviewed = deleteReviewed;
+    this.listFiles = listFiles;
+    this.getCommit = getCommit;
+    this.getPatch = getPatch;
+    this.mergeable = mergeable;
+    this.fileApi = fileApi;
+    this.listComments = listComments;
+    this.robotComments = robotComments;
+    this.listRobotComments = listRobotComments;
+    this.applyFix = applyFix;
+    this.fixes = fixes;
+    this.listDrafts = listDrafts;
+    this.createDraft = createDraft;
+    this.drafts = drafts;
+    this.draftFactory = draftFactory;
+    this.comments = comments;
+    this.commentFactory = commentFactory;
+    this.robotCommentFactory = robotCommentFactory;
+    this.revisionActions = revisionActions;
+    this.testSubmitType = testSubmitType;
+    this.getSubmitType = getSubmitType;
+    this.testSubmitRule = testSubmitRule;
+    this.getMergeList = getMergeList;
+    this.getRelated = getRelated;
+    this.putDescription = putDescription;
+    this.getDescription = getDescription;
+    this.approvalsUtil = approvalsUtil;
+    this.db = db;
+    this.accountLoaderFactory = accountLoaderFactory;
+    this.revision = r;
+  }
+
+  @Override
+  public ReviewResult review(ReviewInput in) throws RestApiException {
+    try {
+      return review.apply(revision, in).value();
+    } catch (Exception e) {
+      throw asRestApiException("Cannot post review", e);
+    }
+  }
+
+  @Override
+  public void submit() throws RestApiException {
+    SubmitInput in = new SubmitInput();
+    submit(in);
+  }
+
+  @Override
+  public void submit(SubmitInput in) throws RestApiException {
+    try {
+      submit.apply(revision, in);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot submit change", e);
+    }
+  }
+
+  @Override
+  public BinaryResult submitPreview() throws RestApiException {
+    return submitPreview("zip");
+  }
+
+  @Override
+  public BinaryResult submitPreview(String format) throws RestApiException {
+    try {
+      submitPreview.setFormat(format);
+      return submitPreview.apply(revision);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get submit preview", e);
+    }
+  }
+
+  @Override
+  public void publish() throws RestApiException {
+    throw new UnsupportedOperationException("draft workflow is discontinued");
+  }
+
+  @Override
+  public void delete() throws RestApiException {
+    throw new UnsupportedOperationException("draft workflow is discontinued");
+  }
+
+  @Override
+  public ChangeApi rebase() throws RestApiException {
+    RebaseInput in = new RebaseInput();
+    return rebase(in);
+  }
+
+  @Override
+  public ChangeApi rebase(RebaseInput in) throws RestApiException {
+    try {
+      return changes.id(rebase.apply(revision, in)._number);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot rebase ps", e);
+    }
+  }
+
+  @Override
+  public boolean canRebase() throws RestApiException {
+    try (Repository repo = repoManager.openRepository(revision.getProject());
+        RevWalk rw = new RevWalk(repo)) {
+      return rebaseUtil.canRebase(revision.getPatchSet(), revision.getChange().getDest(), repo, rw);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot check if rebase is possible", e);
+    }
+  }
+
+  @Override
+  public ChangeApi cherryPick(CherryPickInput in) throws RestApiException {
+    try {
+      return changes.id(cherryPick.apply(revision, in)._number);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot cherry pick", e);
+    }
+  }
+
+  @Override
+  public CherryPickChangeInfo cherryPickAsInfo(CherryPickInput in) throws RestApiException {
+    try {
+      return cherryPick.apply(revision, in);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot cherry pick", e);
+    }
+  }
+
+  @Override
+  public RevisionReviewerApi reviewer(String id) throws RestApiException {
+    try {
+      return revisionReviewerApi.create(
+          revisionReviewers.parse(revision, IdString.fromDecoded(id)));
+    } catch (Exception e) {
+      throw asRestApiException("Cannot parse reviewer", e);
+    }
+  }
+
+  @Override
+  public void setReviewed(String path, boolean reviewed) throws RestApiException {
+    try {
+      RestModifyView<FileResource, Input> view;
+      if (reviewed) {
+        view = putReviewed;
+      } else {
+        view = deleteReviewed;
+      }
+      view.apply(files.parse(revision, IdString.fromDecoded(path)), new Input());
+    } catch (Exception e) {
+      throw asRestApiException("Cannot update reviewed flag", e);
+    }
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public Set<String> reviewed() throws RestApiException {
+    try {
+      return ImmutableSet.copyOf(
+          (Iterable<String>) listFiles.setReviewed(true).apply(revision).value());
+    } catch (Exception e) {
+      throw asRestApiException("Cannot list reviewed files", e);
+    }
+  }
+
+  @Override
+  public MergeableInfo mergeable() throws RestApiException {
+    try {
+      return mergeable.apply(revision);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot check mergeability", e);
+    }
+  }
+
+  @Override
+  public MergeableInfo mergeableOtherBranches() throws RestApiException {
+    try {
+      mergeable.setOtherBranches(true);
+      return mergeable.apply(revision);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot check mergeability", e);
+    }
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public Map<String, FileInfo> files() throws RestApiException {
+    try {
+      return (Map<String, FileInfo>) listFiles.apply(revision).value();
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve files", e);
+    }
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public Map<String, FileInfo> files(String base) throws RestApiException {
+    try {
+      return (Map<String, FileInfo>) listFiles.setBase(base).apply(revision).value();
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve files", e);
+    }
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public Map<String, FileInfo> files(int parentNum) throws RestApiException {
+    try {
+      return (Map<String, FileInfo>) listFiles.setParent(parentNum).apply(revision).value();
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve files", e);
+    }
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public List<String> queryFiles(String query) throws RestApiException {
+    try {
+      checkArgument(query != null, "no query provided");
+      return (List<String>) listFiles.setQuery(query).apply(revision).value();
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve files", e);
+    }
+  }
+
+  @Override
+  public FileApi file(String path) {
+    return fileApi.create(files.parse(revision, IdString.fromDecoded(path)));
+  }
+
+  @Override
+  public CommitInfo commit(boolean addLinks) throws RestApiException {
+    try {
+      return getCommit.setAddLinks(addLinks).apply(revision).value();
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve commit", e);
+    }
+  }
+
+  @Override
+  public Map<String, List<CommentInfo>> comments() throws RestApiException {
+    try {
+      return listComments.apply(revision);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve comments", e);
+    }
+  }
+
+  @Override
+  public Map<String, List<RobotCommentInfo>> robotComments() throws RestApiException {
+    try {
+      return listRobotComments.apply(revision);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve robot comments", e);
+    }
+  }
+
+  @Override
+  public List<CommentInfo> commentsAsList() throws RestApiException {
+    try {
+      return listComments.getComments(revision);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve comments", e);
+    }
+  }
+
+  @Override
+  public Map<String, List<CommentInfo>> drafts() throws RestApiException {
+    try {
+      return listDrafts.apply(revision);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve drafts", e);
+    }
+  }
+
+  @Override
+  public List<RobotCommentInfo> robotCommentsAsList() throws RestApiException {
+    try {
+      return listRobotComments.getComments(revision);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve robot comments", e);
+    }
+  }
+
+  @Override
+  public EditInfo applyFix(String fixId) throws RestApiException {
+    try {
+      return applyFix.apply(fixes.parse(revision, IdString.fromDecoded(fixId)), null).value();
+    } catch (Exception e) {
+      throw asRestApiException("Cannot apply fix", e);
+    }
+  }
+
+  @Override
+  public List<CommentInfo> draftsAsList() throws RestApiException {
+    try {
+      return listDrafts.getComments(revision);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve drafts", e);
+    }
+  }
+
+  @Override
+  public DraftApi draft(String id) throws RestApiException {
+    try {
+      return draftFactory.create(drafts.parse(revision, IdString.fromDecoded(id)));
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve draft", e);
+    }
+  }
+
+  @Override
+  public DraftApi createDraft(DraftInput in) throws RestApiException {
+    try {
+      String id = createDraft.apply(revision, in).value().id;
+      // Reread change to pick up new notes refs.
+      return changes
+          .id(revision.getChange().getId().get())
+          .revision(revision.getPatchSet().getId().get())
+          .draft(id);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot create draft", e);
+    }
+  }
+
+  @Override
+  public CommentApi comment(String id) throws RestApiException {
+    try {
+      return commentFactory.create(comments.parse(revision, IdString.fromDecoded(id)));
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve comment", e);
+    }
+  }
+
+  @Override
+  public RobotCommentApi robotComment(String id) throws RestApiException {
+    try {
+      return robotCommentFactory.create(robotComments.parse(revision, IdString.fromDecoded(id)));
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve robot comment", e);
+    }
+  }
+
+  @Override
+  public BinaryResult patch() throws RestApiException {
+    try {
+      return getPatch.apply(revision);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get patch", e);
+    }
+  }
+
+  @Override
+  public BinaryResult patch(String path) throws RestApiException {
+    try {
+      return getPatch.setPath(path).apply(revision);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get patch", e);
+    }
+  }
+
+  @Override
+  public Map<String, ActionInfo> actions() throws RestApiException {
+    try {
+      return revisionActions.apply(revision).value();
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get actions", e);
+    }
+  }
+
+  @Override
+  public SubmitType submitType() throws RestApiException {
+    try {
+      return getSubmitType.apply(revision);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get submit type", e);
+    }
+  }
+
+  @Override
+  public SubmitType testSubmitType(TestSubmitRuleInput in) throws RestApiException {
+    try {
+      return testSubmitType.apply(revision, in);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot test submit type", e);
+    }
+  }
+
+  @Override
+  public List<TestSubmitRuleInfo> testSubmitRule(TestSubmitRuleInput in) throws RestApiException {
+    try {
+      return testSubmitRule.get().apply(revision, in);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot test submit rule", e);
+    }
+  }
+
+  @Override
+  public MergeListRequest getMergeList() throws RestApiException {
+    return new MergeListRequest() {
+      @Override
+      public List<CommitInfo> get() throws RestApiException {
+        try {
+          GetMergeList gml = getMergeList.get();
+          gml.setUninterestingParent(getUninterestingParent());
+          gml.setAddLinks(getAddLinks());
+          return gml.apply(revision).value();
+        } catch (Exception e) {
+          throw asRestApiException("Cannot get merge list", e);
+        }
+      }
+    };
+  }
+
+  @Override
+  public RelatedChangesInfo related() throws RestApiException {
+    try {
+      return getRelated.apply(revision);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get related changes", e);
+    }
+  }
+
+  @Override
+  public ListMultimap<String, ApprovalInfo> votes() throws RestApiException {
+    ListMultimap<String, ApprovalInfo> result =
+        ListMultimapBuilder.treeKeys().arrayListValues().build();
+    try {
+      Iterable<PatchSetApproval> approvals =
+          approvalsUtil.byPatchSet(
+              db.get(), revision.getNotes(), revision.getPatchSet().getId(), null, null);
+      AccountLoader accountLoader =
+          accountLoaderFactory.create(
+              EnumSet.of(
+                  FillOptions.ID, FillOptions.NAME, FillOptions.EMAIL, FillOptions.USERNAME));
+      for (PatchSetApproval approval : approvals) {
+        String label = approval.getLabel();
+        ApprovalInfo info =
+            new ApprovalInfo(
+                approval.getAccountId().get(),
+                Integer.valueOf(approval.getValue()),
+                null,
+                approval.getTag(),
+                approval.getGranted());
+        accountLoader.put(info);
+        result.get(label).add(info);
+      }
+      accountLoader.fill();
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get votes", e);
+    }
+    return result;
+  }
+
+  @Override
+  public void description(String description) throws RestApiException {
+    DescriptionInput in = new DescriptionInput();
+    in.description = description;
+    try {
+      putDescription.apply(revision, in);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot set description", e);
+    }
+  }
+
+  @Override
+  public String description() throws RestApiException {
+    return getDescription.apply(revision);
+  }
+
+  @Override
+  public String etag() throws RestApiException {
+    return revisionActions.getETag(revision);
+  }
+}
diff --git a/java/com/google/gerrit/server/api/changes/RevisionReviewerApiImpl.java b/java/com/google/gerrit/server/api/changes/RevisionReviewerApiImpl.java
new file mode 100644
index 0000000..8cad507
--- /dev/null
+++ b/java/com/google/gerrit/server/api/changes/RevisionReviewerApiImpl.java
@@ -0,0 +1,73 @@
+// Copyright (C) 2017 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.google.gerrit.server.api.changes;
+
+import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
+
+import com.google.gerrit.extensions.api.changes.DeleteVoteInput;
+import com.google.gerrit.extensions.api.changes.RevisionReviewerApi;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.server.change.ReviewerResource;
+import com.google.gerrit.server.change.VoteResource;
+import com.google.gerrit.server.restapi.change.DeleteVote;
+import com.google.gerrit.server.restapi.change.Votes;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.util.Map;
+
+public class RevisionReviewerApiImpl implements RevisionReviewerApi {
+  interface Factory {
+    RevisionReviewerApiImpl create(ReviewerResource r);
+  }
+
+  private final ReviewerResource reviewer;
+  private final Votes.List listVotes;
+  private final DeleteVote deleteVote;
+
+  @Inject
+  RevisionReviewerApiImpl(
+      Votes.List listVotes, DeleteVote deleteVote, @Assisted ReviewerResource reviewer) {
+    this.listVotes = listVotes;
+    this.deleteVote = deleteVote;
+    this.reviewer = reviewer;
+  }
+
+  @Override
+  public Map<String, Short> votes() throws RestApiException {
+    try {
+      return listVotes.apply(reviewer);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot list votes", e);
+    }
+  }
+
+  @Override
+  public void deleteVote(String label) throws RestApiException {
+    try {
+      deleteVote.apply(new VoteResource(reviewer, label), null);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot delete vote", e);
+    }
+  }
+
+  @Override
+  public void deleteVote(DeleteVoteInput input) throws RestApiException {
+    try {
+      deleteVote.apply(new VoteResource(reviewer, input.label), input);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot delete vote", e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/api/changes/RobotCommentApiImpl.java b/java/com/google/gerrit/server/api/changes/RobotCommentApiImpl.java
new file mode 100644
index 0000000..37a56fe
--- /dev/null
+++ b/java/com/google/gerrit/server/api/changes/RobotCommentApiImpl.java
@@ -0,0 +1,49 @@
+// 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.
+
+package com.google.gerrit.server.api.changes;
+
+import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
+
+import com.google.gerrit.extensions.api.changes.RobotCommentApi;
+import com.google.gerrit.extensions.common.RobotCommentInfo;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.server.change.RobotCommentResource;
+import com.google.gerrit.server.restapi.change.GetRobotComment;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+
+public class RobotCommentApiImpl implements RobotCommentApi {
+  interface Factory {
+    RobotCommentApiImpl create(RobotCommentResource c);
+  }
+
+  private final GetRobotComment getComment;
+  private final RobotCommentResource comment;
+
+  @Inject
+  RobotCommentApiImpl(GetRobotComment getComment, @Assisted RobotCommentResource comment) {
+    this.getComment = getComment;
+    this.comment = comment;
+  }
+
+  @Override
+  public RobotCommentInfo get() throws RestApiException {
+    try {
+      return getComment.apply(comment);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve robot comment", e);
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/config/ConfigImpl.java b/java/com/google/gerrit/server/api/config/ConfigImpl.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/api/config/ConfigImpl.java
rename to java/com/google/gerrit/server/api/config/ConfigImpl.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/config/Module.java b/java/com/google/gerrit/server/api/config/Module.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/api/config/Module.java
rename to java/com/google/gerrit/server/api/config/Module.java
diff --git a/java/com/google/gerrit/server/api/config/ServerImpl.java b/java/com/google/gerrit/server/api/config/ServerImpl.java
new file mode 100644
index 0000000..ec08507
--- /dev/null
+++ b/java/com/google/gerrit/server/api/config/ServerImpl.java
@@ -0,0 +1,151 @@
+// Copyright (C) 2015 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.google.gerrit.server.api.config;
+
+import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
+
+import com.google.gerrit.common.Version;
+import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo;
+import com.google.gerrit.extensions.api.config.ConsistencyCheckInput;
+import com.google.gerrit.extensions.api.config.Server;
+import com.google.gerrit.extensions.client.DiffPreferencesInfo;
+import com.google.gerrit.extensions.client.EditPreferencesInfo;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
+import com.google.gerrit.extensions.common.ServerInfo;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.server.config.ConfigResource;
+import com.google.gerrit.server.restapi.config.CheckConsistency;
+import com.google.gerrit.server.restapi.config.GetDiffPreferences;
+import com.google.gerrit.server.restapi.config.GetEditPreferences;
+import com.google.gerrit.server.restapi.config.GetPreferences;
+import com.google.gerrit.server.restapi.config.GetServerInfo;
+import com.google.gerrit.server.restapi.config.SetDiffPreferences;
+import com.google.gerrit.server.restapi.config.SetEditPreferences;
+import com.google.gerrit.server.restapi.config.SetPreferences;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@Singleton
+public class ServerImpl implements Server {
+  private final GetPreferences getPreferences;
+  private final SetPreferences setPreferences;
+  private final GetDiffPreferences getDiffPreferences;
+  private final SetDiffPreferences setDiffPreferences;
+  private final GetEditPreferences getEditPreferences;
+  private final SetEditPreferences setEditPreferences;
+  private final GetServerInfo getServerInfo;
+  private final Provider<CheckConsistency> checkConsistency;
+
+  @Inject
+  ServerImpl(
+      GetPreferences getPreferences,
+      SetPreferences setPreferences,
+      GetDiffPreferences getDiffPreferences,
+      SetDiffPreferences setDiffPreferences,
+      GetEditPreferences getEditPreferences,
+      SetEditPreferences setEditPreferences,
+      GetServerInfo getServerInfo,
+      Provider<CheckConsistency> checkConsistency) {
+    this.getPreferences = getPreferences;
+    this.setPreferences = setPreferences;
+    this.getDiffPreferences = getDiffPreferences;
+    this.setDiffPreferences = setDiffPreferences;
+    this.getEditPreferences = getEditPreferences;
+    this.setEditPreferences = setEditPreferences;
+    this.getServerInfo = getServerInfo;
+    this.checkConsistency = checkConsistency;
+  }
+
+  @Override
+  public String getVersion() throws RestApiException {
+    return Version.getVersion();
+  }
+
+  @Override
+  public ServerInfo getInfo() throws RestApiException {
+    try {
+      return getServerInfo.apply(new ConfigResource());
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get server info", e);
+    }
+  }
+
+  @Override
+  public GeneralPreferencesInfo getDefaultPreferences() throws RestApiException {
+    try {
+      return getPreferences.apply(new ConfigResource());
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get default general preferences", e);
+    }
+  }
+
+  @Override
+  public GeneralPreferencesInfo setDefaultPreferences(GeneralPreferencesInfo in)
+      throws RestApiException {
+    try {
+      return setPreferences.apply(new ConfigResource(), in);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot set default general preferences", e);
+    }
+  }
+
+  @Override
+  public DiffPreferencesInfo getDefaultDiffPreferences() throws RestApiException {
+    try {
+      return getDiffPreferences.apply(new ConfigResource());
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get default diff preferences", e);
+    }
+  }
+
+  @Override
+  public DiffPreferencesInfo setDefaultDiffPreferences(DiffPreferencesInfo in)
+      throws RestApiException {
+    try {
+      return setDiffPreferences.apply(new ConfigResource(), in);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot set default diff preferences", e);
+    }
+  }
+
+  @Override
+  public EditPreferencesInfo getDefaultEditPreferences() throws RestApiException {
+    try {
+      return getEditPreferences.apply(new ConfigResource());
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get default edit preferences", e);
+    }
+  }
+
+  @Override
+  public EditPreferencesInfo setDefaultEditPreferences(EditPreferencesInfo in)
+      throws RestApiException {
+    try {
+      return setEditPreferences.apply(new ConfigResource(), in);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot set default edit preferences", e);
+    }
+  }
+
+  @Override
+  public ConsistencyCheckInfo checkConsistency(ConsistencyCheckInput in) throws RestApiException {
+    try {
+      return checkConsistency.get().apply(new ConfigResource(), in);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot check consistency", e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/api/groups/GroupApiImpl.java b/java/com/google/gerrit/server/api/groups/GroupApiImpl.java
new file mode 100644
index 0000000..9909ed7
--- /dev/null
+++ b/java/com/google/gerrit/server/api/groups/GroupApiImpl.java
@@ -0,0 +1,281 @@
+// Copyright (C) 2015 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.google.gerrit.server.api.groups;
+
+import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
+
+import com.google.gerrit.extensions.api.groups.GroupApi;
+import com.google.gerrit.extensions.api.groups.OwnerInput;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.DescriptionInput;
+import com.google.gerrit.extensions.common.GroupAuditEventInfo;
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.extensions.common.GroupOptionsInfo;
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.common.NameInput;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.server.group.GroupResource;
+import com.google.gerrit.server.restapi.group.AddMembers;
+import com.google.gerrit.server.restapi.group.AddSubgroups;
+import com.google.gerrit.server.restapi.group.DeleteMembers;
+import com.google.gerrit.server.restapi.group.DeleteSubgroups;
+import com.google.gerrit.server.restapi.group.GetAuditLog;
+import com.google.gerrit.server.restapi.group.GetDescription;
+import com.google.gerrit.server.restapi.group.GetDetail;
+import com.google.gerrit.server.restapi.group.GetGroup;
+import com.google.gerrit.server.restapi.group.GetName;
+import com.google.gerrit.server.restapi.group.GetOptions;
+import com.google.gerrit.server.restapi.group.GetOwner;
+import com.google.gerrit.server.restapi.group.Index;
+import com.google.gerrit.server.restapi.group.ListMembers;
+import com.google.gerrit.server.restapi.group.ListSubgroups;
+import com.google.gerrit.server.restapi.group.PutDescription;
+import com.google.gerrit.server.restapi.group.PutName;
+import com.google.gerrit.server.restapi.group.PutOptions;
+import com.google.gerrit.server.restapi.group.PutOwner;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.util.Arrays;
+import java.util.List;
+
+class GroupApiImpl implements GroupApi {
+  interface Factory {
+    GroupApiImpl create(GroupResource rsrc);
+  }
+
+  private final GetGroup getGroup;
+  private final GetDetail getDetail;
+  private final GetName getName;
+  private final PutName putName;
+  private final GetOwner getOwner;
+  private final PutOwner putOwner;
+  private final GetDescription getDescription;
+  private final PutDescription putDescription;
+  private final GetOptions getOptions;
+  private final PutOptions putOptions;
+  private final ListMembers listMembers;
+  private final AddMembers addMembers;
+  private final DeleteMembers deleteMembers;
+  private final ListSubgroups listSubgroups;
+  private final AddSubgroups addSubgroups;
+  private final DeleteSubgroups deleteSubgroups;
+  private final GetAuditLog getAuditLog;
+  private final GroupResource rsrc;
+  private final Index index;
+
+  @Inject
+  GroupApiImpl(
+      GetGroup getGroup,
+      GetDetail getDetail,
+      GetName getName,
+      PutName putName,
+      GetOwner getOwner,
+      PutOwner putOwner,
+      GetDescription getDescription,
+      PutDescription putDescription,
+      GetOptions getOptions,
+      PutOptions putOptions,
+      ListMembers listMembers,
+      AddMembers addMembers,
+      DeleteMembers deleteMembers,
+      ListSubgroups listSubgroups,
+      AddSubgroups addSubgroups,
+      DeleteSubgroups deleteSubgroups,
+      GetAuditLog getAuditLog,
+      Index index,
+      @Assisted GroupResource rsrc) {
+    this.getGroup = getGroup;
+    this.getDetail = getDetail;
+    this.getName = getName;
+    this.putName = putName;
+    this.getOwner = getOwner;
+    this.putOwner = putOwner;
+    this.getDescription = getDescription;
+    this.putDescription = putDescription;
+    this.getOptions = getOptions;
+    this.putOptions = putOptions;
+    this.listMembers = listMembers;
+    this.addMembers = addMembers;
+    this.deleteMembers = deleteMembers;
+    this.listSubgroups = listSubgroups;
+    this.addSubgroups = addSubgroups;
+    this.deleteSubgroups = deleteSubgroups;
+    this.getAuditLog = getAuditLog;
+    this.index = index;
+    this.rsrc = rsrc;
+  }
+
+  @Override
+  public GroupInfo get() throws RestApiException {
+    try {
+      return getGroup.apply(rsrc);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve group", e);
+    }
+  }
+
+  @Override
+  public GroupInfo detail() throws RestApiException {
+    try {
+      return getDetail.apply(rsrc);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve group", e);
+    }
+  }
+
+  @Override
+  public String name() throws RestApiException {
+    return getName.apply(rsrc);
+  }
+
+  @Override
+  public void name(String name) throws RestApiException {
+    NameInput in = new NameInput();
+    in.name = name;
+    try {
+      putName.apply(rsrc, in);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot put group name", e);
+    }
+  }
+
+  @Override
+  public GroupInfo owner() throws RestApiException {
+    try {
+      return getOwner.apply(rsrc);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get group owner", e);
+    }
+  }
+
+  @Override
+  public void owner(String owner) throws RestApiException {
+    OwnerInput in = new OwnerInput();
+    in.owner = owner;
+    try {
+      putOwner.apply(rsrc, in);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot put group owner", e);
+    }
+  }
+
+  @Override
+  public String description() throws RestApiException {
+    return getDescription.apply(rsrc);
+  }
+
+  @Override
+  public void description(String description) throws RestApiException {
+    DescriptionInput in = new DescriptionInput();
+    in.description = description;
+    try {
+      putDescription.apply(rsrc, in);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot put group description", e);
+    }
+  }
+
+  @Override
+  public GroupOptionsInfo options() throws RestApiException {
+    return getOptions.apply(rsrc);
+  }
+
+  @Override
+  public void options(GroupOptionsInfo options) throws RestApiException {
+    try {
+      putOptions.apply(rsrc, options);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot put group options", e);
+    }
+  }
+
+  @Override
+  public List<AccountInfo> members() throws RestApiException {
+    return members(false);
+  }
+
+  @Override
+  public List<AccountInfo> members(boolean recursive) throws RestApiException {
+    listMembers.setRecursive(recursive);
+    try {
+      return listMembers.apply(rsrc);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot list group members", e);
+    }
+  }
+
+  @Override
+  public void addMembers(String... members) throws RestApiException {
+    try {
+      addMembers.apply(rsrc, AddMembers.Input.fromMembers(Arrays.asList(members)));
+    } catch (Exception e) {
+      throw asRestApiException("Cannot add group members", e);
+    }
+  }
+
+  @Override
+  public void removeMembers(String... members) throws RestApiException {
+    try {
+      deleteMembers.apply(rsrc, AddMembers.Input.fromMembers(Arrays.asList(members)));
+    } catch (Exception e) {
+      throw asRestApiException("Cannot remove group members", e);
+    }
+  }
+
+  @Override
+  public List<GroupInfo> includedGroups() throws RestApiException {
+    try {
+      return listSubgroups.apply(rsrc);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot list subgroups", e);
+    }
+  }
+
+  @Override
+  public void addGroups(String... groups) throws RestApiException {
+    try {
+      addSubgroups.apply(rsrc, AddSubgroups.Input.fromGroups(Arrays.asList(groups)));
+    } catch (Exception e) {
+      throw asRestApiException("Cannot add subgroups", e);
+    }
+  }
+
+  @Override
+  public void removeGroups(String... groups) throws RestApiException {
+    try {
+      deleteSubgroups.apply(rsrc, AddSubgroups.Input.fromGroups(Arrays.asList(groups)));
+    } catch (Exception e) {
+      throw asRestApiException("Cannot remove subgroups", e);
+    }
+  }
+
+  @Override
+  public List<? extends GroupAuditEventInfo> auditLog() throws RestApiException {
+    try {
+      return getAuditLog.apply(rsrc);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get audit log", e);
+    }
+  }
+
+  @Override
+  public void index() throws RestApiException {
+    try {
+      index.apply(rsrc, new Input());
+    } catch (Exception e) {
+      throw asRestApiException("Cannot index group", e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/api/groups/GroupsImpl.java b/java/com/google/gerrit/server/api/groups/GroupsImpl.java
new file mode 100644
index 0000000..e8d6cf4
--- /dev/null
+++ b/java/com/google/gerrit/server/api/groups/GroupsImpl.java
@@ -0,0 +1,192 @@
+// Copyright (C) 2015 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.google.gerrit.server.api.groups;
+
+import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
+import static java.util.Objects.requireNonNull;
+
+import com.google.gerrit.extensions.api.groups.GroupApi;
+import com.google.gerrit.extensions.api.groups.GroupInput;
+import com.google.gerrit.extensions.api.groups.Groups;
+import com.google.gerrit.extensions.client.ListGroupsOption;
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.server.account.AccountResolver;
+import com.google.gerrit.server.group.GroupResolver;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.restapi.group.CreateGroup;
+import com.google.gerrit.server.restapi.group.GroupsCollection;
+import com.google.gerrit.server.restapi.group.ListGroups;
+import com.google.gerrit.server.restapi.group.QueryGroups;
+import com.google.gerrit.server.restapi.project.ProjectsCollection;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.List;
+import java.util.SortedMap;
+
+@Singleton
+class GroupsImpl implements Groups {
+  private final AccountResolver accountResolver;
+  private final GroupsCollection groups;
+  private final GroupResolver groupResolver;
+  private final ProjectsCollection projects;
+  private final Provider<ListGroups> listGroups;
+  private final Provider<QueryGroups> queryGroups;
+  private final PermissionBackend permissionBackend;
+  private final CreateGroup createGroup;
+  private final GroupApiImpl.Factory api;
+
+  @Inject
+  GroupsImpl(
+      AccountResolver accountResolver,
+      GroupsCollection groups,
+      GroupResolver groupResolver,
+      ProjectsCollection projects,
+      Provider<ListGroups> listGroups,
+      Provider<QueryGroups> queryGroups,
+      PermissionBackend permissionBackend,
+      CreateGroup createGroup,
+      GroupApiImpl.Factory api) {
+    this.accountResolver = accountResolver;
+    this.groups = groups;
+    this.groupResolver = groupResolver;
+    this.projects = projects;
+    this.listGroups = listGroups;
+    this.queryGroups = queryGroups;
+    this.permissionBackend = permissionBackend;
+    this.createGroup = createGroup;
+    this.api = api;
+  }
+
+  @Override
+  public GroupApi id(String id) throws RestApiException {
+    return api.create(groups.parse(TopLevelResource.INSTANCE, IdString.fromDecoded(id)));
+  }
+
+  @Override
+  public GroupApi create(String name) throws RestApiException {
+    GroupInput in = new GroupInput();
+    in.name = name;
+    return create(in);
+  }
+
+  @Override
+  public GroupApi create(GroupInput in) throws RestApiException {
+    if (requireNonNull(in, "GroupInput").name == null) {
+      throw new BadRequestException("GroupInput must specify name");
+    }
+    try {
+      permissionBackend
+          .currentUser()
+          .checkAny(GlobalPermission.fromAnnotation(createGroup.getClass()));
+      GroupInfo info =
+          createGroup.apply(TopLevelResource.INSTANCE, IdString.fromDecoded(in.name), in);
+      return id(info.id);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot create group " + in.name, e);
+    }
+  }
+
+  @Override
+  public ListRequest list() {
+    return new ListRequest() {
+      @Override
+      public SortedMap<String, GroupInfo> getAsMap() throws RestApiException {
+        return list(this);
+      }
+    };
+  }
+
+  private SortedMap<String, GroupInfo> list(ListRequest req) throws RestApiException {
+    TopLevelResource tlr = TopLevelResource.INSTANCE;
+    ListGroups list = listGroups.get();
+    list.setOptions(req.getOptions());
+
+    for (String project : req.getProjects()) {
+      try {
+        ProjectResource rsrc = projects.parse(tlr, IdString.fromDecoded(project));
+        list.addProject(rsrc.getProjectState());
+      } catch (Exception e) {
+        throw asRestApiException("Error looking up project " + project, e);
+      }
+    }
+
+    for (String group : req.getGroups()) {
+      list.addGroup(groupResolver.parse(group).getGroupUUID());
+    }
+
+    list.setVisibleToAll(req.getVisibleToAll());
+
+    if (req.getOwnedBy() != null) {
+      list.setOwnedBy(req.getOwnedBy());
+    }
+
+    if (req.getUser() != null) {
+      try {
+        list.setUser(accountResolver.parse(req.getUser()).getAccountId());
+      } catch (Exception e) {
+        throw asRestApiException("Error looking up user " + req.getUser(), e);
+      }
+    }
+
+    list.setOwned(req.getOwned());
+    list.setLimit(req.getLimit());
+    list.setStart(req.getStart());
+    list.setMatchSubstring(req.getSubstring());
+    list.setMatchRegex(req.getRegex());
+    list.setSuggest(req.getSuggest());
+    try {
+      return list.apply(tlr);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot list groups", e);
+    }
+  }
+
+  @Override
+  public QueryRequest query() {
+    return new QueryRequest() {
+      @Override
+      public List<GroupInfo> get() throws RestApiException {
+        return GroupsImpl.this.query(this);
+      }
+    };
+  }
+
+  @Override
+  public QueryRequest query(String query) {
+    return query().withQuery(query);
+  }
+
+  private List<GroupInfo> query(QueryRequest r) throws RestApiException {
+    try {
+      QueryGroups myQueryGroups = queryGroups.get();
+      myQueryGroups.setQuery(r.getQuery());
+      myQueryGroups.setLimit(r.getLimit());
+      myQueryGroups.setStart(r.getStart());
+      for (ListGroupsOption option : r.getOptions()) {
+        myQueryGroups.addOption(option);
+      }
+      return myQueryGroups.apply(TopLevelResource.INSTANCE);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot query groups", e);
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/groups/Module.java b/java/com/google/gerrit/server/api/groups/Module.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/api/groups/Module.java
rename to java/com/google/gerrit/server/api/groups/Module.java
diff --git a/java/com/google/gerrit/server/api/plugins/PluginApiImpl.java b/java/com/google/gerrit/server/api/plugins/PluginApiImpl.java
new file mode 100644
index 0000000..71f7832
--- /dev/null
+++ b/java/com/google/gerrit/server/api/plugins/PluginApiImpl.java
@@ -0,0 +1,73 @@
+// Copyright (C) 2017 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.google.gerrit.server.api.plugins;
+
+import com.google.gerrit.extensions.api.plugins.PluginApi;
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.common.PluginInfo;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.server.plugins.DisablePlugin;
+import com.google.gerrit.server.plugins.EnablePlugin;
+import com.google.gerrit.server.plugins.GetStatus;
+import com.google.gerrit.server.plugins.PluginResource;
+import com.google.gerrit.server.plugins.ReloadPlugin;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+
+public class PluginApiImpl implements PluginApi {
+  public interface Factory {
+    PluginApiImpl create(PluginResource resource);
+  }
+
+  private final GetStatus getStatus;
+  private final EnablePlugin enable;
+  private final DisablePlugin disable;
+  private final ReloadPlugin reload;
+  private final PluginResource resource;
+
+  @Inject
+  PluginApiImpl(
+      GetStatus getStatus,
+      EnablePlugin enable,
+      DisablePlugin disable,
+      ReloadPlugin reload,
+      @Assisted PluginResource resource) {
+    this.getStatus = getStatus;
+    this.enable = enable;
+    this.disable = disable;
+    this.reload = reload;
+    this.resource = resource;
+  }
+
+  @Override
+  public PluginInfo get() throws RestApiException {
+    return getStatus.apply(resource);
+  }
+
+  @Override
+  public void enable() throws RestApiException {
+    enable.apply(resource, new Input());
+  }
+
+  @Override
+  public void disable() throws RestApiException {
+    disable.apply(resource, new Input());
+  }
+
+  @Override
+  public void reload() throws RestApiException {
+    reload.apply(resource, new Input());
+  }
+}
diff --git a/java/com/google/gerrit/server/api/plugins/PluginsImpl.java b/java/com/google/gerrit/server/api/plugins/PluginsImpl.java
new file mode 100644
index 0000000..e570655
--- /dev/null
+++ b/java/com/google/gerrit/server/api/plugins/PluginsImpl.java
@@ -0,0 +1,94 @@
+// Copyright (C) 2017 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.google.gerrit.server.api.plugins;
+
+import com.google.gerrit.extensions.api.plugins.InstallPluginInput;
+import com.google.gerrit.extensions.api.plugins.PluginApi;
+import com.google.gerrit.extensions.api.plugins.Plugins;
+import com.google.gerrit.extensions.common.PluginInfo;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.server.plugins.InstallPlugin;
+import com.google.gerrit.server.plugins.ListPlugins;
+import com.google.gerrit.server.plugins.PluginsCollection;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.SortedMap;
+
+@Singleton
+public class PluginsImpl implements Plugins {
+  private final PluginsCollection plugins;
+  private final Provider<ListPlugins> listProvider;
+  private final Provider<InstallPlugin> installProvider;
+  private final PluginApiImpl.Factory pluginApi;
+
+  @Inject
+  PluginsImpl(
+      PluginsCollection plugins,
+      Provider<ListPlugins> listProvider,
+      Provider<InstallPlugin> installProvider,
+      PluginApiImpl.Factory pluginApi) {
+    this.plugins = plugins;
+    this.listProvider = listProvider;
+    this.installProvider = installProvider;
+    this.pluginApi = pluginApi;
+  }
+
+  @Override
+  public PluginApi name(String name) throws RestApiException {
+    return pluginApi.create(plugins.parse(name));
+  }
+
+  @Override
+  public ListRequest list() {
+    return new ListRequest() {
+      @Override
+      public SortedMap<String, PluginInfo> getAsMap() throws RestApiException {
+        return listProvider.get().request(this).apply(TopLevelResource.INSTANCE);
+      }
+    };
+  }
+
+  @Override
+  @Deprecated
+  public PluginApi install(
+      String name, com.google.gerrit.extensions.common.InstallPluginInput input)
+      throws RestApiException {
+    return install(name, convertInput(input));
+  }
+
+  @SuppressWarnings("deprecation")
+  private InstallPluginInput convertInput(
+      com.google.gerrit.extensions.common.InstallPluginInput input) {
+    InstallPluginInput result = new InstallPluginInput();
+    result.url = input.url;
+    result.raw = input.raw;
+    return result;
+  }
+
+  @Override
+  public PluginApi install(String name, InstallPluginInput input) throws RestApiException {
+    try {
+      Response<PluginInfo> created =
+          installProvider.get().setName(name).apply(TopLevelResource.INSTANCE, input);
+      return pluginApi.create(plugins.parse(created.value().id));
+    } catch (IOException e) {
+      throw new RestApiException("could not install plugin", e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/api/projects/BranchApiImpl.java b/java/com/google/gerrit/server/api/projects/BranchApiImpl.java
new file mode 100644
index 0000000..b3506fc
--- /dev/null
+++ b/java/com/google/gerrit/server/api/projects/BranchApiImpl.java
@@ -0,0 +1,131 @@
+// Copyright (C) 2013 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.google.gerrit.server.api.projects;
+
+import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
+
+import com.google.gerrit.extensions.api.projects.BranchApi;
+import com.google.gerrit.extensions.api.projects.BranchInfo;
+import com.google.gerrit.extensions.api.projects.BranchInput;
+import com.google.gerrit.extensions.api.projects.ReflogEntryInfo;
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.BinaryResult;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.BranchResource;
+import com.google.gerrit.server.project.FileResource;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.restapi.project.BranchesCollection;
+import com.google.gerrit.server.restapi.project.CreateBranch;
+import com.google.gerrit.server.restapi.project.DeleteBranch;
+import com.google.gerrit.server.restapi.project.FilesCollection;
+import com.google.gerrit.server.restapi.project.GetBranch;
+import com.google.gerrit.server.restapi.project.GetContent;
+import com.google.gerrit.server.restapi.project.GetReflog;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.util.List;
+
+public class BranchApiImpl implements BranchApi {
+  interface Factory {
+    BranchApiImpl create(ProjectResource project, String ref);
+  }
+
+  private final BranchesCollection branches;
+  private final CreateBranch createBranch;
+  private final DeleteBranch deleteBranch;
+  private final FilesCollection filesCollection;
+  private final GetBranch getBranch;
+  private final GetContent getContent;
+  private final GetReflog getReflog;
+  private final String ref;
+  private final ProjectResource project;
+
+  @Inject
+  BranchApiImpl(
+      BranchesCollection branches,
+      CreateBranch createBranch,
+      DeleteBranch deleteBranch,
+      FilesCollection filesCollection,
+      GetBranch getBranch,
+      GetContent getContent,
+      GetReflog getReflog,
+      @Assisted ProjectResource project,
+      @Assisted String ref) {
+    this.branches = branches;
+    this.createBranch = createBranch;
+    this.deleteBranch = deleteBranch;
+    this.filesCollection = filesCollection;
+    this.getBranch = getBranch;
+    this.getContent = getContent;
+    this.getReflog = getReflog;
+    this.project = project;
+    this.ref = ref;
+  }
+
+  @Override
+  public BranchApi create(BranchInput input) throws RestApiException {
+    try {
+      createBranch.apply(project, IdString.fromDecoded(ref), input);
+      return this;
+    } catch (Exception e) {
+      throw asRestApiException("Cannot create branch", e);
+    }
+  }
+
+  @Override
+  public BranchInfo get() throws RestApiException {
+    try {
+      return getBranch.apply(resource());
+    } catch (Exception e) {
+      throw asRestApiException("Cannot read branch", e);
+    }
+  }
+
+  @Override
+  public void delete() throws RestApiException {
+    try {
+      deleteBranch.apply(resource(), new Input());
+    } catch (Exception e) {
+      throw asRestApiException("Cannot delete branch", e);
+    }
+  }
+
+  @Override
+  public BinaryResult file(String path) throws RestApiException {
+    try {
+      FileResource resource = filesCollection.parse(resource(), IdString.fromDecoded(path));
+      return getContent.apply(resource);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve file", e);
+    }
+  }
+
+  @Override
+  public List<ReflogEntryInfo> reflog() throws RestApiException {
+    try {
+      return getReflog.apply(resource());
+    } catch (IOException | PermissionBackendException e) {
+      throw new RestApiException("Cannot retrieve reflog", e);
+    }
+  }
+
+  private BranchResource resource()
+      throws RestApiException, IOException, PermissionBackendException {
+    return branches.parse(project, IdString.fromDecoded(ref));
+  }
+}
diff --git a/java/com/google/gerrit/server/api/projects/ChildProjectApiImpl.java b/java/com/google/gerrit/server/api/projects/ChildProjectApiImpl.java
new file mode 100644
index 0000000..d7c9bc7
--- /dev/null
+++ b/java/com/google/gerrit/server/api/projects/ChildProjectApiImpl.java
@@ -0,0 +1,49 @@
+// Copyright (C) 2015 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.google.gerrit.server.api.projects;
+
+import com.google.gerrit.extensions.api.projects.ChildProjectApi;
+import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.server.project.ChildProjectResource;
+import com.google.gerrit.server.restapi.project.GetChildProject;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+
+public class ChildProjectApiImpl implements ChildProjectApi {
+  interface Factory {
+    ChildProjectApiImpl create(ChildProjectResource rsrc);
+  }
+
+  private final GetChildProject getChildProject;
+  private final ChildProjectResource rsrc;
+
+  @Inject
+  ChildProjectApiImpl(GetChildProject getChildProject, @Assisted ChildProjectResource rsrc) {
+    this.getChildProject = getChildProject;
+    this.rsrc = rsrc;
+  }
+
+  @Override
+  public ProjectInfo get() throws RestApiException {
+    return get(false);
+  }
+
+  @Override
+  public ProjectInfo get(boolean recursive) throws RestApiException {
+    getChildProject.setRecursive(recursive);
+    return getChildProject.apply(rsrc);
+  }
+}
diff --git a/java/com/google/gerrit/server/api/projects/CommitApiImpl.java b/java/com/google/gerrit/server/api/projects/CommitApiImpl.java
new file mode 100644
index 0000000..49eec6e
--- /dev/null
+++ b/java/com/google/gerrit/server/api/projects/CommitApiImpl.java
@@ -0,0 +1,70 @@
+// Copyright (C) 2017 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.google.gerrit.server.api.projects;
+
+import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
+
+import com.google.gerrit.extensions.api.changes.ChangeApi;
+import com.google.gerrit.extensions.api.changes.Changes;
+import com.google.gerrit.extensions.api.changes.CherryPickInput;
+import com.google.gerrit.extensions.api.changes.IncludedInInfo;
+import com.google.gerrit.extensions.api.projects.CommitApi;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.server.project.CommitResource;
+import com.google.gerrit.server.restapi.change.CherryPickCommit;
+import com.google.gerrit.server.restapi.project.CommitIncludedIn;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+
+public class CommitApiImpl implements CommitApi {
+  public interface Factory {
+    CommitApiImpl create(CommitResource r);
+  }
+
+  private final Changes changes;
+  private final CherryPickCommit cherryPickCommit;
+  private final CommitIncludedIn includedIn;
+  private final CommitResource commitResource;
+
+  @Inject
+  CommitApiImpl(
+      Changes changes,
+      CherryPickCommit cherryPickCommit,
+      CommitIncludedIn includedIn,
+      @Assisted CommitResource commitResource) {
+    this.changes = changes;
+    this.cherryPickCommit = cherryPickCommit;
+    this.includedIn = includedIn;
+    this.commitResource = commitResource;
+  }
+
+  @Override
+  public ChangeApi cherryPick(CherryPickInput input) throws RestApiException {
+    try {
+      return changes.id(cherryPickCommit.apply(commitResource, input)._number);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot cherry pick", e);
+    }
+  }
+
+  @Override
+  public IncludedInInfo includedIn() throws RestApiException {
+    try {
+      return includedIn.apply(commitResource);
+    } catch (Exception e) {
+      throw asRestApiException("Could not extract IncludedIn data", e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/api/projects/DashboardApiImpl.java b/java/com/google/gerrit/server/api/projects/DashboardApiImpl.java
new file mode 100644
index 0000000..c44f5bb
--- /dev/null
+++ b/java/com/google/gerrit/server/api/projects/DashboardApiImpl.java
@@ -0,0 +1,93 @@
+// Copyright (C) 2017 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.google.gerrit.server.api.projects;
+
+import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.api.projects.DashboardApi;
+import com.google.gerrit.extensions.api.projects.DashboardInfo;
+import com.google.gerrit.extensions.api.projects.SetDashboardInput;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.DashboardResource;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.restapi.project.DashboardsCollection;
+import com.google.gerrit.server.restapi.project.GetDashboard;
+import com.google.gerrit.server.restapi.project.SetDashboard;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+public class DashboardApiImpl implements DashboardApi {
+  interface Factory {
+    DashboardApiImpl create(ProjectResource project, String id);
+  }
+
+  private final DashboardsCollection dashboards;
+  private final Provider<GetDashboard> get;
+  private final SetDashboard set;
+  private final ProjectResource project;
+  private final String id;
+
+  @Inject
+  DashboardApiImpl(
+      DashboardsCollection dashboards,
+      Provider<GetDashboard> get,
+      SetDashboard set,
+      @Assisted ProjectResource project,
+      @Assisted @Nullable String id) {
+    this.dashboards = dashboards;
+    this.get = get;
+    this.set = set;
+    this.project = project;
+    this.id = id;
+  }
+
+  @Override
+  public DashboardInfo get() throws RestApiException {
+    return get(false);
+  }
+
+  @Override
+  public DashboardInfo get(boolean inherited) throws RestApiException {
+    try {
+      return get.get().setInherited(inherited).apply(resource());
+    } catch (IOException | PermissionBackendException | ConfigInvalidException e) {
+      throw asRestApiException("Cannot read dashboard", e);
+    }
+  }
+
+  @Override
+  public void setDefault() throws RestApiException {
+    SetDashboardInput input = new SetDashboardInput();
+    input.id = id;
+    try {
+      set.apply(
+          DashboardResource.projectDefault(project.getProjectState(), project.getUser()), input);
+    } catch (Exception e) {
+      String msg = String.format("Cannot %s default dashboard", id != null ? "set" : "remove");
+      throw asRestApiException(msg, e);
+    }
+  }
+
+  private DashboardResource resource()
+      throws RestApiException, IOException, ConfigInvalidException, PermissionBackendException {
+    return dashboards.parse(project, IdString.fromDecoded(id));
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/Module.java b/java/com/google/gerrit/server/api/projects/Module.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/api/projects/Module.java
rename to java/com/google/gerrit/server/api/projects/Module.java
diff --git a/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java b/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java
new file mode 100644
index 0000000..354331e
--- /dev/null
+++ b/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java
@@ -0,0 +1,649 @@
+// Copyright (C) 2013 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.google.gerrit.server.api.projects;
+
+import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
+import static com.google.gerrit.server.restapi.project.DashboardsCollection.DEFAULT_DASHBOARD_NAME;
+import static java.util.stream.Collectors.toList;
+
+import com.google.gerrit.extensions.api.access.ProjectAccessInfo;
+import com.google.gerrit.extensions.api.access.ProjectAccessInput;
+import com.google.gerrit.extensions.api.config.AccessCheckInfo;
+import com.google.gerrit.extensions.api.config.AccessCheckInput;
+import com.google.gerrit.extensions.api.projects.BranchApi;
+import com.google.gerrit.extensions.api.projects.BranchInfo;
+import com.google.gerrit.extensions.api.projects.CheckProjectInput;
+import com.google.gerrit.extensions.api.projects.CheckProjectResultInfo;
+import com.google.gerrit.extensions.api.projects.ChildProjectApi;
+import com.google.gerrit.extensions.api.projects.CommitApi;
+import com.google.gerrit.extensions.api.projects.ConfigInfo;
+import com.google.gerrit.extensions.api.projects.ConfigInput;
+import com.google.gerrit.extensions.api.projects.DashboardApi;
+import com.google.gerrit.extensions.api.projects.DashboardInfo;
+import com.google.gerrit.extensions.api.projects.DeleteBranchesInput;
+import com.google.gerrit.extensions.api.projects.DeleteTagsInput;
+import com.google.gerrit.extensions.api.projects.DescriptionInput;
+import com.google.gerrit.extensions.api.projects.HeadInput;
+import com.google.gerrit.extensions.api.projects.IndexProjectInput;
+import com.google.gerrit.extensions.api.projects.ParentInput;
+import com.google.gerrit.extensions.api.projects.ProjectApi;
+import com.google.gerrit.extensions.api.projects.ProjectInput;
+import com.google.gerrit.extensions.api.projects.TagApi;
+import com.google.gerrit.extensions.api.projects.TagInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.NotImplementedException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.project.ProjectJson;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.restapi.project.Check;
+import com.google.gerrit.server.restapi.project.CheckAccess;
+import com.google.gerrit.server.restapi.project.ChildProjectsCollection;
+import com.google.gerrit.server.restapi.project.CommitsCollection;
+import com.google.gerrit.server.restapi.project.CreateAccessChange;
+import com.google.gerrit.server.restapi.project.CreateProject;
+import com.google.gerrit.server.restapi.project.DeleteBranches;
+import com.google.gerrit.server.restapi.project.DeleteTags;
+import com.google.gerrit.server.restapi.project.GetAccess;
+import com.google.gerrit.server.restapi.project.GetConfig;
+import com.google.gerrit.server.restapi.project.GetDescription;
+import com.google.gerrit.server.restapi.project.GetHead;
+import com.google.gerrit.server.restapi.project.GetParent;
+import com.google.gerrit.server.restapi.project.Index;
+import com.google.gerrit.server.restapi.project.ListBranches;
+import com.google.gerrit.server.restapi.project.ListDashboards;
+import com.google.gerrit.server.restapi.project.ListTags;
+import com.google.gerrit.server.restapi.project.ProjectsCollection;
+import com.google.gerrit.server.restapi.project.PutConfig;
+import com.google.gerrit.server.restapi.project.PutDescription;
+import com.google.gerrit.server.restapi.project.SetAccess;
+import com.google.gerrit.server.restapi.project.SetHead;
+import com.google.gerrit.server.restapi.project.SetParent;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.Assisted;
+import com.google.inject.assistedinject.AssistedInject;
+import java.util.Collections;
+import java.util.List;
+
+public class ProjectApiImpl implements ProjectApi {
+  interface Factory {
+    ProjectApiImpl create(ProjectResource project);
+
+    ProjectApiImpl create(String name);
+  }
+
+  private final PermissionBackend permissionBackend;
+  private final CreateProject createProject;
+  private final ProjectApiImpl.Factory projectApi;
+  private final ProjectsCollection projects;
+  private final GetDescription getDescription;
+  private final PutDescription putDescription;
+  private final ChildProjectApiImpl.Factory childApi;
+  private final ChildProjectsCollection children;
+  private final ProjectResource project;
+  private final ProjectJson projectJson;
+  private final String name;
+  private final BranchApiImpl.Factory branchApi;
+  private final TagApiImpl.Factory tagApi;
+  private final GetAccess getAccess;
+  private final SetAccess setAccess;
+  private final CreateAccessChange createAccessChange;
+  private final GetConfig getConfig;
+  private final PutConfig putConfig;
+  private final Provider<ListBranches> listBranches;
+  private final Provider<ListTags> listTags;
+  private final DeleteBranches deleteBranches;
+  private final DeleteTags deleteTags;
+  private final CommitsCollection commitsCollection;
+  private final CommitApiImpl.Factory commitApi;
+  private final DashboardApiImpl.Factory dashboardApi;
+  private final CheckAccess checkAccess;
+  private final Check check;
+  private final Provider<ListDashboards> listDashboards;
+  private final GetHead getHead;
+  private final SetHead setHead;
+  private final GetParent getParent;
+  private final SetParent setParent;
+  private final Index index;
+
+  @AssistedInject
+  ProjectApiImpl(
+      PermissionBackend permissionBackend,
+      CreateProject createProject,
+      ProjectApiImpl.Factory projectApi,
+      ProjectsCollection projects,
+      GetDescription getDescription,
+      PutDescription putDescription,
+      ChildProjectApiImpl.Factory childApi,
+      ChildProjectsCollection children,
+      ProjectJson projectJson,
+      BranchApiImpl.Factory branchApiFactory,
+      TagApiImpl.Factory tagApiFactory,
+      GetAccess getAccess,
+      SetAccess setAccess,
+      CreateAccessChange createAccessChange,
+      GetConfig getConfig,
+      PutConfig putConfig,
+      Provider<ListBranches> listBranches,
+      Provider<ListTags> listTags,
+      DeleteBranches deleteBranches,
+      DeleteTags deleteTags,
+      CommitsCollection commitsCollection,
+      CommitApiImpl.Factory commitApi,
+      DashboardApiImpl.Factory dashboardApi,
+      CheckAccess checkAccess,
+      Check check,
+      Provider<ListDashboards> listDashboards,
+      GetHead getHead,
+      SetHead setHead,
+      GetParent getParent,
+      SetParent setParent,
+      Index index,
+      @Assisted ProjectResource project) {
+    this(
+        permissionBackend,
+        createProject,
+        projectApi,
+        projects,
+        getDescription,
+        putDescription,
+        childApi,
+        children,
+        projectJson,
+        branchApiFactory,
+        tagApiFactory,
+        getAccess,
+        setAccess,
+        createAccessChange,
+        getConfig,
+        putConfig,
+        listBranches,
+        listTags,
+        deleteBranches,
+        deleteTags,
+        project,
+        commitsCollection,
+        commitApi,
+        dashboardApi,
+        checkAccess,
+        check,
+        listDashboards,
+        getHead,
+        setHead,
+        getParent,
+        setParent,
+        index,
+        null);
+  }
+
+  @AssistedInject
+  ProjectApiImpl(
+      PermissionBackend permissionBackend,
+      CreateProject createProject,
+      ProjectApiImpl.Factory projectApi,
+      ProjectsCollection projects,
+      GetDescription getDescription,
+      PutDescription putDescription,
+      ChildProjectApiImpl.Factory childApi,
+      ChildProjectsCollection children,
+      ProjectJson projectJson,
+      BranchApiImpl.Factory branchApiFactory,
+      TagApiImpl.Factory tagApiFactory,
+      GetAccess getAccess,
+      SetAccess setAccess,
+      CreateAccessChange createAccessChange,
+      GetConfig getConfig,
+      PutConfig putConfig,
+      Provider<ListBranches> listBranches,
+      Provider<ListTags> listTags,
+      DeleteBranches deleteBranches,
+      DeleteTags deleteTags,
+      CommitsCollection commitsCollection,
+      CommitApiImpl.Factory commitApi,
+      DashboardApiImpl.Factory dashboardApi,
+      CheckAccess checkAccess,
+      Check check,
+      Provider<ListDashboards> listDashboards,
+      GetHead getHead,
+      SetHead setHead,
+      GetParent getParent,
+      SetParent setParent,
+      Index index,
+      @Assisted String name) {
+    this(
+        permissionBackend,
+        createProject,
+        projectApi,
+        projects,
+        getDescription,
+        putDescription,
+        childApi,
+        children,
+        projectJson,
+        branchApiFactory,
+        tagApiFactory,
+        getAccess,
+        setAccess,
+        createAccessChange,
+        getConfig,
+        putConfig,
+        listBranches,
+        listTags,
+        deleteBranches,
+        deleteTags,
+        null,
+        commitsCollection,
+        commitApi,
+        dashboardApi,
+        checkAccess,
+        check,
+        listDashboards,
+        getHead,
+        setHead,
+        getParent,
+        setParent,
+        index,
+        name);
+  }
+
+  private ProjectApiImpl(
+      PermissionBackend permissionBackend,
+      CreateProject createProject,
+      ProjectApiImpl.Factory projectApi,
+      ProjectsCollection projects,
+      GetDescription getDescription,
+      PutDescription putDescription,
+      ChildProjectApiImpl.Factory childApi,
+      ChildProjectsCollection children,
+      ProjectJson projectJson,
+      BranchApiImpl.Factory branchApiFactory,
+      TagApiImpl.Factory tagApiFactory,
+      GetAccess getAccess,
+      SetAccess setAccess,
+      CreateAccessChange createAccessChange,
+      GetConfig getConfig,
+      PutConfig putConfig,
+      Provider<ListBranches> listBranches,
+      Provider<ListTags> listTags,
+      DeleteBranches deleteBranches,
+      DeleteTags deleteTags,
+      ProjectResource project,
+      CommitsCollection commitsCollection,
+      CommitApiImpl.Factory commitApi,
+      DashboardApiImpl.Factory dashboardApi,
+      CheckAccess checkAccess,
+      Check check,
+      Provider<ListDashboards> listDashboards,
+      GetHead getHead,
+      SetHead setHead,
+      GetParent getParent,
+      SetParent setParent,
+      Index index,
+      String name) {
+    this.permissionBackend = permissionBackend;
+    this.createProject = createProject;
+    this.projectApi = projectApi;
+    this.projects = projects;
+    this.getDescription = getDescription;
+    this.putDescription = putDescription;
+    this.childApi = childApi;
+    this.children = children;
+    this.projectJson = projectJson;
+    this.project = project;
+    this.branchApi = branchApiFactory;
+    this.tagApi = tagApiFactory;
+    this.getAccess = getAccess;
+    this.setAccess = setAccess;
+    this.getConfig = getConfig;
+    this.putConfig = putConfig;
+    this.listBranches = listBranches;
+    this.listTags = listTags;
+    this.deleteBranches = deleteBranches;
+    this.deleteTags = deleteTags;
+    this.commitsCollection = commitsCollection;
+    this.commitApi = commitApi;
+    this.createAccessChange = createAccessChange;
+    this.dashboardApi = dashboardApi;
+    this.checkAccess = checkAccess;
+    this.check = check;
+    this.listDashboards = listDashboards;
+    this.getHead = getHead;
+    this.setHead = setHead;
+    this.getParent = getParent;
+    this.setParent = setParent;
+    this.name = name;
+    this.index = index;
+  }
+
+  @Override
+  public ProjectApi create() throws RestApiException {
+    return create(new ProjectInput());
+  }
+
+  @Override
+  public ProjectApi create(ProjectInput in) throws RestApiException {
+    try {
+      if (name == null) {
+        throw new ResourceConflictException("Project already exists");
+      }
+      if (in.name != null && !name.equals(in.name)) {
+        throw new BadRequestException("name must match input.name");
+      }
+      permissionBackend
+          .currentUser()
+          .checkAny(GlobalPermission.fromAnnotation(createProject.getClass()));
+      createProject.apply(TopLevelResource.INSTANCE, IdString.fromDecoded(name), in);
+      return projectApi.create(projects.parse(name));
+    } catch (Exception e) {
+      throw asRestApiException("Cannot create project: " + e.getMessage(), e);
+    }
+  }
+
+  @Override
+  public ProjectInfo get() throws RestApiException {
+    if (project == null) {
+      throw new ResourceNotFoundException(name);
+    }
+    return projectJson.format(project.getProjectState());
+  }
+
+  @Override
+  public String description() throws RestApiException {
+    return getDescription.apply(checkExists());
+  }
+
+  @Override
+  public ProjectAccessInfo access() throws RestApiException {
+    try {
+      return getAccess.apply(checkExists());
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get access rights", e);
+    }
+  }
+
+  @Override
+  public ProjectAccessInfo access(ProjectAccessInput p) throws RestApiException {
+    try {
+      return setAccess.apply(checkExists(), p);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot put access rights", e);
+    }
+  }
+
+  @Override
+  public ChangeInfo accessChange(ProjectAccessInput p) throws RestApiException {
+    try {
+      return createAccessChange.apply(checkExists(), p).value();
+    } catch (Exception e) {
+      throw asRestApiException("Cannot put access right change", e);
+    }
+  }
+
+  @Override
+  public AccessCheckInfo checkAccess(AccessCheckInput in) throws RestApiException {
+    try {
+      return checkAccess.apply(checkExists(), in);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot check access rights", e);
+    }
+  }
+
+  @Override
+  public CheckProjectResultInfo check(CheckProjectInput in) throws RestApiException {
+    try {
+      return check.apply(checkExists(), in);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot check project", e);
+    }
+  }
+
+  @Override
+  public void description(DescriptionInput in) throws RestApiException {
+    try {
+      putDescription.apply(checkExists(), in);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot put project description", e);
+    }
+  }
+
+  @Override
+  public ConfigInfo config() throws RestApiException {
+    return getConfig.apply(checkExists());
+  }
+
+  @Override
+  public ConfigInfo config(ConfigInput in) throws RestApiException {
+    try {
+      return putConfig.apply(checkExists(), in);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot list tags", e);
+    }
+  }
+
+  @Override
+  public ListRefsRequest<BranchInfo> branches() {
+    return new ListRefsRequest<BranchInfo>() {
+      @Override
+      public List<BranchInfo> get() throws RestApiException {
+        try {
+          return listBranches.get().request(this).apply(checkExists());
+        } catch (Exception e) {
+          throw asRestApiException("Cannot list branches", e);
+        }
+      }
+    };
+  }
+
+  @Override
+  public ListRefsRequest<TagInfo> tags() {
+    return new ListRefsRequest<TagInfo>() {
+      @Override
+      public List<TagInfo> get() throws RestApiException {
+        try {
+          return listTags.get().request(this).apply(checkExists());
+        } catch (Exception e) {
+          throw asRestApiException("Cannot list tags", e);
+        }
+      }
+    };
+  }
+
+  @Override
+  public List<ProjectInfo> children() throws RestApiException {
+    return children(false);
+  }
+
+  @Override
+  public List<ProjectInfo> children(boolean recursive) throws RestApiException {
+    try {
+      return children.list().withRecursive(recursive).apply(checkExists());
+    } catch (Exception e) {
+      throw asRestApiException("Cannot list children", e);
+    }
+  }
+
+  @Override
+  public List<ProjectInfo> children(int limit) throws RestApiException {
+    try {
+      return children.list().withLimit(limit).apply(checkExists());
+    } catch (Exception e) {
+      throw asRestApiException("Cannot list children", e);
+    }
+  }
+
+  @Override
+  public ChildProjectApi child(String name) throws RestApiException {
+    try {
+      return childApi.create(children.parse(checkExists(), IdString.fromDecoded(name)));
+    } catch (Exception e) {
+      throw asRestApiException("Cannot parse child project", e);
+    }
+  }
+
+  @Override
+  public BranchApi branch(String ref) throws ResourceNotFoundException {
+    return branchApi.create(checkExists(), ref);
+  }
+
+  @Override
+  public TagApi tag(String ref) throws ResourceNotFoundException {
+    return tagApi.create(checkExists(), ref);
+  }
+
+  @Override
+  public void deleteBranches(DeleteBranchesInput in) throws RestApiException {
+    try {
+      deleteBranches.apply(checkExists(), in);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot delete branches", e);
+    }
+  }
+
+  @Override
+  public void deleteTags(DeleteTagsInput in) throws RestApiException {
+    try {
+      deleteTags.apply(checkExists(), in);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot delete tags", e);
+    }
+  }
+
+  @Override
+  public CommitApi commit(String commit) throws RestApiException {
+    try {
+      return commitApi.create(commitsCollection.parse(checkExists(), IdString.fromDecoded(commit)));
+    } catch (Exception e) {
+      throw asRestApiException("Cannot parse commit", e);
+    }
+  }
+
+  @Override
+  public DashboardApi dashboard(String name) throws RestApiException {
+    try {
+      return dashboardApi.create(checkExists(), name);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot parse dashboard", e);
+    }
+  }
+
+  @Override
+  public DashboardApi defaultDashboard() throws RestApiException {
+    return dashboard(DEFAULT_DASHBOARD_NAME);
+  }
+
+  @Override
+  public void defaultDashboard(String name) throws RestApiException {
+    try {
+      dashboardApi.create(checkExists(), name).setDefault();
+    } catch (Exception e) {
+      throw asRestApiException("Cannot set default dashboard", e);
+    }
+  }
+
+  @Override
+  public void removeDefaultDashboard() throws RestApiException {
+    try {
+      dashboardApi.create(checkExists(), null).setDefault();
+    } catch (Exception e) {
+      throw asRestApiException("Cannot remove default dashboard", e);
+    }
+  }
+
+  @Override
+  public ListDashboardsRequest dashboards() throws RestApiException {
+    return new ListDashboardsRequest() {
+      @Override
+      public List<DashboardInfo> get() throws RestApiException {
+        try {
+          List<?> r = listDashboards.get().apply(checkExists());
+          if (r.isEmpty()) {
+            return Collections.emptyList();
+          }
+          if (r.get(0) instanceof DashboardInfo) {
+            return r.stream().map(i -> (DashboardInfo) i).collect(toList());
+          }
+          throw new NotImplementedException("list with inheritance");
+        } catch (Exception e) {
+          throw asRestApiException("Cannot list dashboards", e);
+        }
+      }
+    };
+  }
+
+  @Override
+  public String head() throws RestApiException {
+    try {
+      return getHead.apply(checkExists());
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get HEAD", e);
+    }
+  }
+
+  @Override
+  public void head(String head) throws RestApiException {
+    HeadInput input = new HeadInput();
+    input.ref = head;
+    try {
+      setHead.apply(checkExists(), input);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot set HEAD", e);
+    }
+  }
+
+  @Override
+  public String parent() throws RestApiException {
+    try {
+      return getParent.apply(checkExists());
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get parent", e);
+    }
+  }
+
+  @Override
+  public void parent(String parent) throws RestApiException {
+    try {
+      ParentInput input = new ParentInput();
+      input.parent = parent;
+      setParent.apply(checkExists(), input);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot set parent", e);
+    }
+  }
+
+  @Override
+  public void index(boolean indexChildren) throws RestApiException {
+    try {
+      IndexProjectInput input = new IndexProjectInput();
+      input.indexChildren = indexChildren;
+      index.apply(checkExists(), input);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot index project", e);
+    }
+  }
+
+  private ProjectResource checkExists() throws ResourceNotFoundException {
+    if (project == null) {
+      throw new ResourceNotFoundException(name);
+    }
+    return project;
+  }
+}
diff --git a/java/com/google/gerrit/server/api/projects/ProjectsImpl.java b/java/com/google/gerrit/server/api/projects/ProjectsImpl.java
new file mode 100644
index 0000000..debb97c
--- /dev/null
+++ b/java/com/google/gerrit/server/api/projects/ProjectsImpl.java
@@ -0,0 +1,165 @@
+// Copyright (C) 2013 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.google.gerrit.server.api.projects;
+
+import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
+
+import com.google.gerrit.extensions.api.projects.ProjectApi;
+import com.google.gerrit.extensions.api.projects.ProjectInput;
+import com.google.gerrit.extensions.api.projects.Projects;
+import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.restapi.project.ListProjects;
+import com.google.gerrit.server.restapi.project.ListProjects.FilterType;
+import com.google.gerrit.server.restapi.project.ProjectsCollection;
+import com.google.gerrit.server.restapi.project.QueryProjects;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.List;
+import java.util.SortedMap;
+
+@Singleton
+class ProjectsImpl implements Projects {
+  private final ProjectsCollection projects;
+  private final ProjectApiImpl.Factory api;
+  private final Provider<ListProjects> listProvider;
+  private final Provider<QueryProjects> queryProvider;
+
+  @Inject
+  ProjectsImpl(
+      ProjectsCollection projects,
+      ProjectApiImpl.Factory api,
+      Provider<ListProjects> listProvider,
+      Provider<QueryProjects> queryProvider) {
+    this.projects = projects;
+    this.api = api;
+    this.listProvider = listProvider;
+    this.queryProvider = queryProvider;
+  }
+
+  @Override
+  public ProjectApi name(String name) throws RestApiException {
+    try {
+      return api.create(projects.parse(name));
+    } catch (UnprocessableEntityException e) {
+      return api.create(name);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot retrieve project", e);
+    }
+  }
+
+  @Override
+  public ProjectApi create(String name) throws RestApiException {
+    ProjectInput in = new ProjectInput();
+    in.name = name;
+    return create(in);
+  }
+
+  @Override
+  public ProjectApi create(ProjectInput in) throws RestApiException {
+    if (in.name == null) {
+      throw new BadRequestException("input.name is required");
+    }
+    return name(in.name).create(in);
+  }
+
+  @Override
+  public ListRequest list() {
+    return new ListRequest() {
+      @Override
+      public SortedMap<String, ProjectInfo> getAsMap() throws RestApiException {
+        try {
+          return list(this);
+        } catch (Exception e) {
+          throw asRestApiException("project list unavailable", e);
+        }
+      }
+    };
+  }
+
+  private SortedMap<String, ProjectInfo> list(ListRequest request)
+      throws RestApiException, PermissionBackendException {
+    ListProjects lp = listProvider.get();
+    lp.setShowDescription(request.getDescription());
+    lp.setLimit(request.getLimit());
+    lp.setStart(request.getStart());
+    lp.setMatchPrefix(request.getPrefix());
+
+    lp.setMatchSubstring(request.getSubstring());
+    lp.setMatchRegex(request.getRegex());
+    lp.setShowTree(request.getShowTree());
+    for (String branch : request.getBranches()) {
+      lp.addShowBranch(branch);
+    }
+
+    FilterType type;
+    switch (request.getFilterType()) {
+      case ALL:
+        type = FilterType.ALL;
+        break;
+      case CODE:
+        type = FilterType.CODE;
+        break;
+      case PARENT_CANDIDATES:
+        type = FilterType.PARENT_CANDIDATES;
+        break;
+      case PERMISSIONS:
+        type = FilterType.PERMISSIONS;
+        break;
+      default:
+        throw new BadRequestException("Unknown filter type: " + request.getFilterType());
+    }
+    lp.setFilterType(type);
+
+    lp.setAll(request.isAll());
+
+    lp.setState(request.getState());
+
+    return lp.apply();
+  }
+
+  @Override
+  public QueryRequest query() {
+    return new QueryRequest() {
+      @Override
+      public List<ProjectInfo> get() throws RestApiException {
+        return ProjectsImpl.this.query(this);
+      }
+    };
+  }
+
+  @Override
+  public QueryRequest query(String query) {
+    return query().withQuery(query);
+  }
+
+  private List<ProjectInfo> query(QueryRequest r) throws RestApiException {
+    try {
+      return queryProvider
+          .get()
+          .withQuery(r.getQuery())
+          .withLimit(r.getLimit())
+          .withStart(r.getStart())
+          .apply();
+    } catch (OrmException e) {
+      throw new RestApiException("Cannot query projects", e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/api/projects/TagApiImpl.java b/java/com/google/gerrit/server/api/projects/TagApiImpl.java
new file mode 100644
index 0000000..005486a
--- /dev/null
+++ b/java/com/google/gerrit/server/api/projects/TagApiImpl.java
@@ -0,0 +1,95 @@
+// Copyright (C) 2015 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.google.gerrit.server.api.projects;
+
+import static com.google.gerrit.server.api.ApiUtil.asRestApiException;
+
+import com.google.gerrit.extensions.api.projects.TagApi;
+import com.google.gerrit.extensions.api.projects.TagInfo;
+import com.google.gerrit.extensions.api.projects.TagInput;
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.project.TagResource;
+import com.google.gerrit.server.restapi.project.CreateTag;
+import com.google.gerrit.server.restapi.project.DeleteTag;
+import com.google.gerrit.server.restapi.project.ListTags;
+import com.google.gerrit.server.restapi.project.TagsCollection;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+
+public class TagApiImpl implements TagApi {
+  interface Factory {
+    TagApiImpl create(ProjectResource project, String ref);
+  }
+
+  private final ListTags listTags;
+  private final CreateTag createTag;
+  private final DeleteTag deleteTag;
+  private final TagsCollection tags;
+  private final String ref;
+  private final ProjectResource project;
+
+  @Inject
+  TagApiImpl(
+      ListTags listTags,
+      CreateTag createTag,
+      DeleteTag deleteTag,
+      TagsCollection tags,
+      @Assisted ProjectResource project,
+      @Assisted String ref) {
+    this.listTags = listTags;
+    this.createTag = createTag;
+    this.deleteTag = deleteTag;
+    this.tags = tags;
+    this.project = project;
+    this.ref = ref;
+  }
+
+  @Override
+  public TagApi create(TagInput input) throws RestApiException {
+    try {
+      createTag.apply(project, IdString.fromDecoded(ref), input);
+      return this;
+    } catch (Exception e) {
+      throw asRestApiException("Cannot create tag", e);
+    }
+  }
+
+  @Override
+  public TagInfo get() throws RestApiException {
+    try {
+      return listTags.get(project, IdString.fromDecoded(ref));
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get tag", e);
+    }
+  }
+
+  @Override
+  public void delete() throws RestApiException {
+    try {
+      deleteTag.apply(resource(), new Input());
+    } catch (Exception e) {
+      throw asRestApiException("Cannot delete tag", e);
+    }
+  }
+
+  private TagResource resource() throws RestApiException, IOException, PermissionBackendException {
+    return tags.parse(project, IdString.fromDecoded(ref));
+  }
+}
diff --git a/java/com/google/gerrit/server/args4j/AccountGroupIdHandler.java b/java/com/google/gerrit/server/args4j/AccountGroupIdHandler.java
new file mode 100644
index 0000000..46a22c0
--- /dev/null
+++ b/java/com/google/gerrit/server/args4j/AccountGroupIdHandler.java
@@ -0,0 +1,60 @@
+// Copyright (C) 2009 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.google.gerrit.server.args4j;
+
+import static com.google.gerrit.util.cli.Localizable.localizable;
+
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.account.GroupCache;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.util.Optional;
+import org.kohsuke.args4j.CmdLineException;
+import org.kohsuke.args4j.CmdLineParser;
+import org.kohsuke.args4j.OptionDef;
+import org.kohsuke.args4j.spi.OptionHandler;
+import org.kohsuke.args4j.spi.Parameters;
+import org.kohsuke.args4j.spi.Setter;
+
+public class AccountGroupIdHandler extends OptionHandler<AccountGroup.Id> {
+  private final GroupCache groupCache;
+
+  @Inject
+  public AccountGroupIdHandler(
+      final GroupCache groupCache,
+      @Assisted final CmdLineParser parser,
+      @Assisted final OptionDef option,
+      @Assisted final Setter<AccountGroup.Id> setter) {
+    super(parser, option, setter);
+    this.groupCache = groupCache;
+  }
+
+  @Override
+  public final int parseArguments(Parameters params) throws CmdLineException {
+    final String n = params.getParameter(0);
+    Optional<InternalGroup> group = groupCache.get(new AccountGroup.NameKey(n));
+    if (!group.isPresent()) {
+      throw new CmdLineException(owner, localizable("Group \"%s\" does not exist"), n);
+    }
+    setter.addValue(group.get().getId());
+    return 1;
+  }
+
+  @Override
+  public final String getDefaultMetaVariable() {
+    return "GROUP";
+  }
+}
diff --git a/java/com/google/gerrit/server/args4j/AccountGroupUUIDHandler.java b/java/com/google/gerrit/server/args4j/AccountGroupUUIDHandler.java
new file mode 100644
index 0000000..2dd0c7a
--- /dev/null
+++ b/java/com/google/gerrit/server/args4j/AccountGroupUUIDHandler.java
@@ -0,0 +1,92 @@
+// Copyright (C) 2009 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.google.gerrit.server.args4j;
+
+import static com.google.gerrit.util.cli.Localizable.localizable;
+
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.account.GroupBackends;
+import com.google.gerrit.server.account.GroupCache;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.group.InternalGroupDescription;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.util.Optional;
+import org.kohsuke.args4j.CmdLineException;
+import org.kohsuke.args4j.CmdLineParser;
+import org.kohsuke.args4j.OptionDef;
+import org.kohsuke.args4j.spi.OptionHandler;
+import org.kohsuke.args4j.spi.Parameters;
+import org.kohsuke.args4j.spi.Setter;
+
+public class AccountGroupUUIDHandler extends OptionHandler<AccountGroup.UUID> {
+  private final GroupBackend groupBackend;
+  private final GroupCache groupCache;
+
+  @Inject
+  public AccountGroupUUIDHandler(
+      final GroupBackend groupBackend,
+      @Assisted final CmdLineParser parser,
+      @Assisted final OptionDef option,
+      @Assisted final Setter<AccountGroup.UUID> setter,
+      GroupCache groupCache) {
+    super(parser, option, setter);
+    this.groupBackend = groupBackend;
+    this.groupCache = groupCache;
+  }
+
+  @Override
+  public final int parseArguments(Parameters params) throws CmdLineException {
+    final String n = params.getParameter(0);
+    AccountGroup.UUID uuid = new AccountGroup.UUID(n);
+    if (groupBackend.handles(uuid)) {
+      GroupDescription.Basic d = groupBackend.get(uuid);
+      if (d != null) {
+        setter.addValue(uuid);
+        return 1;
+      }
+    }
+
+    // Might be a numeric AccountGroup.Id. -> Internal group.
+    if (n.matches("^[1-9][0-9]*$")) {
+      try {
+        AccountGroup.Id groupId = AccountGroup.Id.parse(n);
+        Optional<InternalGroup> groupInternal = groupCache.get(groupId);
+        if (groupInternal.isPresent()) {
+          uuid = new InternalGroupDescription(groupInternal.get()).getGroupUUID();
+          setter.addValue(uuid);
+          return 1;
+        }
+      } catch (IllegalArgumentException e) {
+        // Ignored
+      }
+    }
+
+    GroupReference group = GroupBackends.findExactSuggestion(groupBackend, n);
+    if (group == null) {
+      throw new CmdLineException(owner, localizable("Group \"%s\" does not exist"), n);
+    }
+    setter.addValue(group.getUUID());
+    return 1;
+  }
+
+  @Override
+  public final String getDefaultMetaVariable() {
+    return "GROUP";
+  }
+}
diff --git a/java/com/google/gerrit/server/args4j/AccountIdHandler.java b/java/com/google/gerrit/server/args4j/AccountIdHandler.java
new file mode 100644
index 0000000..2b66334
--- /dev/null
+++ b/java/com/google/gerrit/server/args4j/AccountIdHandler.java
@@ -0,0 +1,113 @@
+// Copyright (C) 2009 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.google.gerrit.server.args4j;
+
+import static com.google.gerrit.util.cli.Localizable.localizable;
+
+import com.google.gerrit.extensions.client.AuthType;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.account.AccountException;
+import com.google.gerrit.server.account.AccountManager;
+import com.google.gerrit.server.account.AccountResolver;
+import com.google.gerrit.server.account.AuthRequest;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.config.AuthConfig;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.kohsuke.args4j.CmdLineException;
+import org.kohsuke.args4j.CmdLineParser;
+import org.kohsuke.args4j.OptionDef;
+import org.kohsuke.args4j.spi.OptionHandler;
+import org.kohsuke.args4j.spi.Parameters;
+import org.kohsuke.args4j.spi.Setter;
+
+public class AccountIdHandler extends OptionHandler<Account.Id> {
+  private final AccountResolver accountResolver;
+  private final AccountManager accountManager;
+  private final AuthType authType;
+
+  @Inject
+  public AccountIdHandler(
+      AccountResolver accountResolver,
+      AccountManager accountManager,
+      AuthConfig authConfig,
+      @Assisted CmdLineParser parser,
+      @Assisted OptionDef option,
+      @Assisted Setter<Account.Id> setter) {
+    super(parser, option, setter);
+    this.accountResolver = accountResolver;
+    this.accountManager = accountManager;
+    this.authType = authConfig.getAuthType();
+  }
+
+  @Override
+  public int parseArguments(Parameters params) throws CmdLineException {
+    String token = params.getParameter(0);
+    Account.Id accountId;
+    try {
+      Account a = accountResolver.find(token);
+      if (a != null) {
+        accountId = a.getId();
+      } else {
+        switch (authType) {
+          case HTTP_LDAP:
+          case CLIENT_SSL_CERT_LDAP:
+          case LDAP:
+            accountId = createAccountByLdap(token);
+            break;
+          case CUSTOM_EXTENSION:
+          case DEVELOPMENT_BECOME_ANY_ACCOUNT:
+          case HTTP:
+          case LDAP_BIND:
+          case OAUTH:
+          case OPENID:
+          case OPENID_SSO:
+          default:
+            throw new CmdLineException(owner, localizable("user \"%s\" not found"), token);
+        }
+      }
+    } catch (OrmException e) {
+      throw new CmdLineException(owner, localizable("database is down"));
+    } catch (IOException e) {
+      throw new CmdLineException(owner, "Failed to load account", e);
+    } catch (ConfigInvalidException e) {
+      throw new CmdLineException(owner, "Invalid account config", e);
+    }
+    setter.addValue(accountId);
+    return 1;
+  }
+
+  private Account.Id createAccountByLdap(String user) throws CmdLineException, IOException {
+    if (!ExternalId.isValidUsername(user)) {
+      throw new CmdLineException(owner, localizable("user \"%s\" not found"), user);
+    }
+
+    try {
+      AuthRequest req = AuthRequest.forUser(user);
+      req.setSkipAuthentication(true);
+      return accountManager.authenticate(req).getAccountId();
+    } catch (AccountException e) {
+      throw new CmdLineException(owner, localizable("user \"%s\" not found"), user);
+    }
+  }
+
+  @Override
+  public final String getDefaultMetaVariable() {
+    return "EMAIL";
+  }
+}
diff --git a/java/com/google/gerrit/server/args4j/ChangeIdHandler.java b/java/com/google/gerrit/server/args4j/ChangeIdHandler.java
new file mode 100644
index 0000000..13832fa
--- /dev/null
+++ b/java/com/google/gerrit/server/args4j/ChangeIdHandler.java
@@ -0,0 +1,81 @@
+// Copyright (C) 2012 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.google.gerrit.server.args4j;
+
+import static com.google.gerrit.util.cli.Localizable.localizable;
+
+import com.google.common.base.Splitter;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.Assisted;
+import java.util.List;
+import org.kohsuke.args4j.CmdLineException;
+import org.kohsuke.args4j.CmdLineParser;
+import org.kohsuke.args4j.OptionDef;
+import org.kohsuke.args4j.spi.OptionHandler;
+import org.kohsuke.args4j.spi.Parameters;
+import org.kohsuke.args4j.spi.Setter;
+
+public class ChangeIdHandler extends OptionHandler<Change.Id> {
+  private final Provider<InternalChangeQuery> queryProvider;
+
+  @Inject
+  public ChangeIdHandler(
+      // TODO(dborowitz): Not sure whether this is injectable here.
+      Provider<InternalChangeQuery> queryProvider,
+      @Assisted final CmdLineParser parser,
+      @Assisted final OptionDef option,
+      @Assisted final Setter<Change.Id> setter) {
+    super(parser, option, setter);
+    this.queryProvider = queryProvider;
+  }
+
+  @Override
+  public final int parseArguments(Parameters params) throws CmdLineException {
+    final String token = params.getParameter(0);
+    final List<String> tokens = Splitter.on(',').splitToList(token);
+    if (tokens.size() != 3) {
+      throw new CmdLineException(
+          owner, localizable("change should be specified as <project>,<branch>,<change-id>"));
+    }
+
+    try {
+      final Change.Key key = Change.Key.parse(tokens.get(2));
+      final Project.NameKey project = new Project.NameKey(tokens.get(0));
+      final Branch.NameKey branch = new Branch.NameKey(project, tokens.get(1));
+      for (ChangeData cd : queryProvider.get().byBranchKey(branch, key)) {
+        setter.addValue(cd.getId());
+        return 1;
+      }
+    } catch (IllegalArgumentException e) {
+      throw new CmdLineException(owner, localizable("Change-Id is not valid"));
+    } catch (OrmException e) {
+      throw new CmdLineException(owner, localizable("Database error: %s"), e.getMessage());
+    }
+
+    throw new CmdLineException(owner, localizable("\"%s\": change not found"), token);
+  }
+
+  @Override
+  public final String getDefaultMetaVariable() {
+    return "CHANGE";
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/ObjectIdHandler.java b/java/com/google/gerrit/server/args4j/ObjectIdHandler.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/args4j/ObjectIdHandler.java
rename to java/com/google/gerrit/server/args4j/ObjectIdHandler.java
diff --git a/java/com/google/gerrit/server/args4j/PatchSetIdHandler.java b/java/com/google/gerrit/server/args4j/PatchSetIdHandler.java
new file mode 100644
index 0000000..84c1d88
--- /dev/null
+++ b/java/com/google/gerrit/server/args4j/PatchSetIdHandler.java
@@ -0,0 +1,57 @@
+// Copyright (C) 2009 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.google.gerrit.server.args4j;
+
+import static com.google.gerrit.util.cli.Localizable.localizable;
+
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import org.kohsuke.args4j.CmdLineException;
+import org.kohsuke.args4j.CmdLineParser;
+import org.kohsuke.args4j.OptionDef;
+import org.kohsuke.args4j.spi.OptionHandler;
+import org.kohsuke.args4j.spi.Parameters;
+import org.kohsuke.args4j.spi.Setter;
+
+public class PatchSetIdHandler extends OptionHandler<PatchSet.Id> {
+
+  @Inject
+  public PatchSetIdHandler(
+      @Assisted final CmdLineParser parser,
+      @Assisted final OptionDef option,
+      @Assisted final Setter<PatchSet.Id> setter) {
+    super(parser, option, setter);
+  }
+
+  @Override
+  public final int parseArguments(Parameters params) throws CmdLineException {
+    final String token = params.getParameter(0);
+    final PatchSet.Id id;
+    try {
+      id = PatchSet.Id.parse(token);
+    } catch (IllegalArgumentException e) {
+      throw new CmdLineException(owner, localizable("\"%s\" is not a valid patch set"), token);
+    }
+
+    setter.addValue(id);
+    return 1;
+  }
+
+  @Override
+  public final String getDefaultMetaVariable() {
+    return "CHANGE,PATCHSET";
+  }
+}
diff --git a/java/com/google/gerrit/server/args4j/ProjectHandler.java b/java/com/google/gerrit/server/args4j/ProjectHandler.java
new file mode 100644
index 0000000..223b112
--- /dev/null
+++ b/java/com/google/gerrit/server/args4j/ProjectHandler.java
@@ -0,0 +1,107 @@
+// Copyright (C) 2009 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.google.gerrit.server.args4j;
+
+import static com.google.gerrit.util.cli.Localizable.localizable;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.ProjectUtil;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.project.NoSuchProjectException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import org.kohsuke.args4j.CmdLineException;
+import org.kohsuke.args4j.CmdLineParser;
+import org.kohsuke.args4j.OptionDef;
+import org.kohsuke.args4j.spi.OptionHandler;
+import org.kohsuke.args4j.spi.Parameters;
+import org.kohsuke.args4j.spi.Setter;
+
+public class ProjectHandler extends OptionHandler<ProjectState> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final ProjectCache projectCache;
+  private final PermissionBackend permissionBackend;
+
+  @Inject
+  public ProjectHandler(
+      ProjectCache projectCache,
+      PermissionBackend permissionBackend,
+      @Assisted final CmdLineParser parser,
+      @Assisted final OptionDef option,
+      @Assisted final Setter<ProjectState> setter) {
+    super(parser, option, setter);
+    this.projectCache = projectCache;
+    this.permissionBackend = permissionBackend;
+  }
+
+  @Override
+  public final int parseArguments(Parameters params) throws CmdLineException {
+    String projectName = params.getParameter(0);
+
+    while (projectName.endsWith("/")) {
+      projectName = projectName.substring(0, projectName.length() - 1);
+    }
+
+    while (projectName.startsWith("/")) {
+      // Be nice and drop the leading "/" if supplied by an absolute path.
+      // We don't have a file system hierarchy, just a flat namespace in
+      // the database's Project entities. We never encode these with a
+      // leading '/' but users might accidentally include them in Git URLs.
+      //
+      projectName = projectName.substring(1);
+    }
+
+    String nameWithoutSuffix = ProjectUtil.stripGitSuffix(projectName);
+    Project.NameKey nameKey = new Project.NameKey(nameWithoutSuffix);
+
+    ProjectState state;
+    try {
+      state = projectCache.checkedGet(nameKey);
+      if (state == null) {
+        throw new CmdLineException(owner, localizable("project %s not found"), nameWithoutSuffix);
+      }
+      // Hidden projects(permitsRead = false) should only be accessible by the project owners.
+      // READ_CONFIG is checked here because it's only allowed to project owners(ACCESS may also
+      // be allowed for other users). Allowing project owners to access here will help them to view
+      // and update the config of hidden projects easily.
+      ProjectPermission permissionToCheck =
+          state.statePermitsRead() ? ProjectPermission.ACCESS : ProjectPermission.READ_CONFIG;
+      permissionBackend.currentUser().project(nameKey).check(permissionToCheck);
+    } catch (AuthException e) {
+      throw new CmdLineException(
+          owner, localizable(new NoSuchProjectException(nameKey).getMessage()));
+    } catch (PermissionBackendException | IOException e) {
+      logger.atWarning().withCause(e).log("Cannot load project %s", nameWithoutSuffix);
+      throw new CmdLineException(
+          owner, localizable(new NoSuchProjectException(nameKey).getMessage()));
+    }
+
+    setter.addValue(state);
+    return 1;
+  }
+
+  @Override
+  public final String getDefaultMetaVariable() {
+    return "PROJECT";
+  }
+}
diff --git a/java/com/google/gerrit/server/args4j/SocketAddressHandler.java b/java/com/google/gerrit/server/args4j/SocketAddressHandler.java
new file mode 100644
index 0000000..198cf67
--- /dev/null
+++ b/java/com/google/gerrit/server/args4j/SocketAddressHandler.java
@@ -0,0 +1,55 @@
+// Copyright (C) 2010 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.google.gerrit.server.args4j;
+
+import static com.google.gerrit.util.cli.Localizable.localizable;
+
+import com.google.gerrit.server.util.SocketUtil;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.net.SocketAddress;
+import org.kohsuke.args4j.CmdLineException;
+import org.kohsuke.args4j.CmdLineParser;
+import org.kohsuke.args4j.OptionDef;
+import org.kohsuke.args4j.spi.OptionHandler;
+import org.kohsuke.args4j.spi.Parameters;
+import org.kohsuke.args4j.spi.Setter;
+
+public class SocketAddressHandler extends OptionHandler<SocketAddress> {
+
+  @Inject
+  public SocketAddressHandler(
+      @Assisted final CmdLineParser parser,
+      @Assisted final OptionDef option,
+      @Assisted final Setter<SocketAddress> setter) {
+    super(parser, option, setter);
+  }
+
+  @Override
+  public final int parseArguments(Parameters params) throws CmdLineException {
+    final String token = params.getParameter(0);
+    try {
+      setter.addValue(SocketUtil.parse(token, 0));
+    } catch (IllegalArgumentException e) {
+      throw new CmdLineException(owner, localizable(e.getMessage()));
+    }
+    return 1;
+  }
+
+  @Override
+  public final String getDefaultMetaVariable() {
+    return "HOST:PORT";
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/SubcommandHandler.java b/java/com/google/gerrit/server/args4j/SubcommandHandler.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/args4j/SubcommandHandler.java
rename to java/com/google/gerrit/server/args4j/SubcommandHandler.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/TimestampHandler.java b/java/com/google/gerrit/server/args4j/TimestampHandler.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/args4j/TimestampHandler.java
rename to java/com/google/gerrit/server/args4j/TimestampHandler.java
diff --git a/java/com/google/gerrit/server/audit/AuditListener.java b/java/com/google/gerrit/server/audit/AuditListener.java
new file mode 100644
index 0000000..f555bbd
--- /dev/null
+++ b/java/com/google/gerrit/server/audit/AuditListener.java
@@ -0,0 +1,24 @@
+// Copyright (C) 2012 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.google.gerrit.server.audit;
+
+import com.google.gerrit.extensions.annotations.ExtensionPoint;
+import com.google.gerrit.server.AuditEvent;
+
+@ExtensionPoint
+public interface AuditListener {
+
+  void onAuditableAction(AuditEvent action);
+}
diff --git a/java/com/google/gerrit/server/audit/AuditModule.java b/java/com/google/gerrit/server/audit/AuditModule.java
new file mode 100644
index 0000000..df037b6
--- /dev/null
+++ b/java/com/google/gerrit/server/audit/AuditModule.java
@@ -0,0 +1,30 @@
+// Copyright (C) 2012 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.google.gerrit.server.audit;
+
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.server.audit.group.GroupAuditListener;
+import com.google.gerrit.server.group.GroupAuditService;
+import com.google.inject.AbstractModule;
+
+public class AuditModule extends AbstractModule {
+
+  @Override
+  protected void configure() {
+    DynamicSet.setOf(binder(), AuditListener.class);
+    DynamicSet.setOf(binder(), GroupAuditListener.class);
+    bind(GroupAuditService.class).to(AuditService.class);
+  }
+}
diff --git a/java/com/google/gerrit/server/audit/AuditService.java b/java/com/google/gerrit/server/audit/AuditService.java
new file mode 100644
index 0000000..425e22a
--- /dev/null
+++ b/java/com/google/gerrit/server/audit/AuditService.java
@@ -0,0 +1,91 @@
+// Copyright (C) 2012 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.google.gerrit.server.audit;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.AuditEvent;
+import com.google.gerrit.server.audit.group.GroupAuditListener;
+import com.google.gerrit.server.audit.group.GroupMemberAuditEvent;
+import com.google.gerrit.server.audit.group.GroupSubgroupAuditEvent;
+import com.google.gerrit.server.group.GroupAuditService;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.sql.Timestamp;
+
+@Singleton
+public class AuditService implements GroupAuditService {
+  private final PluginSetContext<AuditListener> auditListeners;
+  private final PluginSetContext<GroupAuditListener> groupAuditListeners;
+
+  @Inject
+  public AuditService(
+      PluginSetContext<AuditListener> auditListeners,
+      PluginSetContext<GroupAuditListener> groupAuditListeners) {
+    this.auditListeners = auditListeners;
+    this.groupAuditListeners = groupAuditListeners;
+  }
+
+  @Override
+  public void dispatch(AuditEvent action) {
+    auditListeners.runEach(l -> l.onAuditableAction(action));
+  }
+
+  @Override
+  public void dispatchAddMembers(
+      Account.Id actor,
+      AccountGroup.UUID updatedGroup,
+      ImmutableSet<Account.Id> addedMembers,
+      Timestamp addedOn) {
+    GroupMemberAuditEvent event =
+        GroupMemberAuditEvent.create(actor, updatedGroup, addedMembers, addedOn);
+    groupAuditListeners.runEach(l -> l.onAddMembers(event));
+  }
+
+  @Override
+  public void dispatchDeleteMembers(
+      Account.Id actor,
+      AccountGroup.UUID updatedGroup,
+      ImmutableSet<Account.Id> deletedMembers,
+      Timestamp deletedOn) {
+    GroupMemberAuditEvent event =
+        GroupMemberAuditEvent.create(actor, updatedGroup, deletedMembers, deletedOn);
+    groupAuditListeners.runEach(l -> l.onDeleteMembers(event));
+  }
+
+  @Override
+  public void dispatchAddSubgroups(
+      Account.Id actor,
+      AccountGroup.UUID updatedGroup,
+      ImmutableSet<AccountGroup.UUID> addedSubgroups,
+      Timestamp addedOn) {
+    GroupSubgroupAuditEvent event =
+        GroupSubgroupAuditEvent.create(actor, updatedGroup, addedSubgroups, addedOn);
+    groupAuditListeners.runEach(l -> l.onAddSubgroups(event));
+  }
+
+  @Override
+  public void dispatchDeleteSubgroups(
+      Account.Id actor,
+      AccountGroup.UUID updatedGroup,
+      ImmutableSet<AccountGroup.UUID> deletedSubgroups,
+      Timestamp deletedOn) {
+    GroupSubgroupAuditEvent event =
+        GroupSubgroupAuditEvent.create(actor, updatedGroup, deletedSubgroups, deletedOn);
+    groupAuditListeners.runEach(l -> l.onDeleteSubgroups(event));
+  }
+}
diff --git a/java/com/google/gerrit/server/audit/BUILD b/java/com/google/gerrit/server/audit/BUILD
new file mode 100644
index 0000000..1756713
--- /dev/null
+++ b/java/com/google/gerrit/server/audit/BUILD
@@ -0,0 +1,97 @@
+java_library(
+    name = "audit",
+    srcs = glob(
+        ["**/*.java"],
+    ),
+    resource_strip_prefix = "resources",
+    resources = ["//resources/com/google/gerrit/server"],
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/index",
+        "//java/com/google/gerrit/index:query_exception",
+        "//java/com/google/gerrit/index/project",
+        "//java/com/google/gerrit/lifecycle",
+        "//java/com/google/gerrit/metrics",
+        "//java/com/google/gerrit/prettify:server",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/server/ioutil",
+        "//java/com/google/gerrit/server/logging",
+        "//java/com/google/gerrit/server/util/time",
+        "//java/com/google/gerrit/util/cli",
+        "//java/com/google/gerrit/util/ssl",
+        "//java/org/apache/commons/net",
+        "//java/org/eclipse/jgit:server",
+        "//lib:args4j",
+        "//lib:autolink",
+        "//lib:automaton",
+        "//lib:blame-cache",
+        "//lib:flexmark",
+        "//lib:flexmark-ext-abbreviation",
+        "//lib:flexmark-ext-anchorlink",
+        "//lib:flexmark-ext-autolink",
+        "//lib:flexmark-ext-definition",
+        "//lib:flexmark-ext-emoji",
+        "//lib:flexmark-ext-escaped-character",
+        "//lib:flexmark-ext-footnotes",
+        "//lib:flexmark-ext-gfm-issues",
+        "//lib:flexmark-ext-gfm-strikethrough",
+        "//lib:flexmark-ext-gfm-tables",
+        "//lib:flexmark-ext-gfm-tasklist",
+        "//lib:flexmark-ext-gfm-users",
+        "//lib:flexmark-ext-ins",
+        "//lib:flexmark-ext-jekyll-front-matter",
+        "//lib:flexmark-ext-superscript",
+        "//lib:flexmark-ext-tables",
+        "//lib:flexmark-ext-toc",
+        "//lib:flexmark-ext-typographic",
+        "//lib:flexmark-ext-wikilink",
+        "//lib:flexmark-ext-yaml-front-matter",
+        "//lib:flexmark-formatter",
+        "//lib:flexmark-html-parser",
+        "//lib:flexmark-profile-pegdown",
+        "//lib:flexmark-util",
+        "//lib:gson",
+        "//lib:guava",
+        "//lib:guava-retrying",
+        "//lib:gwtjsonrpc",
+        "//lib:gwtorm",
+        "//lib:jsch",
+        "//lib:juniversalchardet",
+        "//lib:mime-util",
+        "//lib:protobuf",
+        "//lib:servlet-api-3_1",
+        "//lib:soy",
+        "//lib:tukaani-xz",
+        "//lib/auto:auto-value",
+        "//lib/auto:auto-value-annotations",
+        "//lib/bouncycastle:bcpkix-neverlink",
+        "//lib/bouncycastle:bcprov-neverlink",
+        "//lib/commons:codec",
+        "//lib/commons:compress",
+        "//lib/commons:dbcp",
+        "//lib/commons:lang",
+        "//lib/commons:net",
+        "//lib/commons:validator",
+        "//lib/flogger:api",
+        "//lib/guice",
+        "//lib/guice:guice-assistedinject",
+        "//lib/guice:guice-servlet",
+        "//lib/jgit/org.eclipse.jgit.archive:jgit-archive",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/jsoup",
+        "//lib/log:jsonevent-layout",
+        "//lib/log:log4j",
+        "//lib/lucene:lucene-analyzers-common",
+        "//lib/lucene:lucene-core-and-backward-codecs",
+        "//lib/lucene:lucene-queryparser",
+        "//lib/mime4j:core",
+        "//lib/mime4j:dom",
+        "//lib/ow2:ow2-asm",
+        "//lib/ow2:ow2-asm-tree",
+        "//lib/ow2:ow2-asm-util",
+        "//lib/prolog:runtime",
+        "//proto:cache_java_proto",
+    ],
+)
diff --git a/java/com/google/gerrit/server/audit/ExtendedHttpAuditEvent.java b/java/com/google/gerrit/server/audit/ExtendedHttpAuditEvent.java
new file mode 100644
index 0000000..c981ba7
--- /dev/null
+++ b/java/com/google/gerrit/server/audit/ExtendedHttpAuditEvent.java
@@ -0,0 +1,70 @@
+// Copyright (C) 2015 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.google.gerrit.server.audit;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ListMultimap;
+import com.google.gerrit.extensions.restapi.RestResource;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.server.CurrentUser;
+import javax.servlet.http.HttpServletRequest;
+
+/** Extended audit event. Adds request, resource and view data to HttpAuditEvent. */
+public class ExtendedHttpAuditEvent extends HttpAuditEvent {
+  public final HttpServletRequest httpRequest;
+  public final RestResource resource;
+  public final RestView<? extends RestResource> view;
+
+  /**
+   * Creates a new audit event with results
+   *
+   * @param sessionId session id the event belongs to
+   * @param who principal that has generated the event
+   * @param httpRequest the HttpServletRequest
+   * @param when time-stamp of when the event started
+   * @param params parameters of the event
+   * @param input input
+   * @param status HTTP status
+   * @param result result of the event
+   * @param resource REST resource data
+   * @param view view rendering object
+   */
+  public ExtendedHttpAuditEvent(
+      String sessionId,
+      CurrentUser who,
+      HttpServletRequest httpRequest,
+      long when,
+      ListMultimap<String, ?> params,
+      Object input,
+      int status,
+      Object result,
+      RestResource resource,
+      RestView<RestResource> view) {
+    super(
+        sessionId,
+        who,
+        httpRequest.getRequestURI(),
+        when,
+        params,
+        httpRequest.getMethod(),
+        input,
+        status,
+        result);
+    this.httpRequest = requireNonNull(httpRequest);
+    this.resource = resource;
+    this.view = view;
+  }
+}
diff --git a/java/com/google/gerrit/server/audit/HttpAuditEvent.java b/java/com/google/gerrit/server/audit/HttpAuditEvent.java
new file mode 100644
index 0000000..5ea2485
--- /dev/null
+++ b/java/com/google/gerrit/server/audit/HttpAuditEvent.java
@@ -0,0 +1,53 @@
+// Copyright (C) 2013 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.google.gerrit.server.audit;
+
+import com.google.common.collect.ListMultimap;
+import com.google.gerrit.server.AuditEvent;
+import com.google.gerrit.server.CurrentUser;
+
+public class HttpAuditEvent extends AuditEvent {
+  public final String httpMethod;
+  public final int httpStatus;
+  public final Object input;
+
+  /**
+   * Creates a new audit event with results
+   *
+   * @param sessionId session id the event belongs to
+   * @param who principal that has generated the event
+   * @param what object of the event
+   * @param when time-stamp of when the event started
+   * @param params parameters of the event
+   * @param httpMethod HTTP method
+   * @param input input
+   * @param status HTTP status
+   * @param result result of the event
+   */
+  public HttpAuditEvent(
+      String sessionId,
+      CurrentUser who,
+      String what,
+      long when,
+      ListMultimap<String, ?> params,
+      String httpMethod,
+      Object input,
+      int status,
+      Object result) {
+    super(sessionId, who, what, when, params, result);
+    this.httpMethod = httpMethod;
+    this.input = input;
+    this.httpStatus = status;
+  }
+}
diff --git a/java/com/google/gerrit/server/audit/RpcAuditEvent.java b/java/com/google/gerrit/server/audit/RpcAuditEvent.java
new file mode 100644
index 0000000..6c53bb2
--- /dev/null
+++ b/java/com/google/gerrit/server/audit/RpcAuditEvent.java
@@ -0,0 +1,47 @@
+// Copyright (C) 2013 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.google.gerrit.server.audit;
+
+import com.google.common.collect.ListMultimap;
+import com.google.gerrit.server.CurrentUser;
+
+public class RpcAuditEvent extends HttpAuditEvent {
+
+  /**
+   * Creates a new audit event with results
+   *
+   * @param sessionId session id the event belongs to
+   * @param who principal that has generated the event
+   * @param what object of the event
+   * @param when time-stamp of when the event started
+   * @param params parameters of the event
+   * @param httpMethod HTTP method
+   * @param input input
+   * @param status HTTP status
+   * @param result result of the event
+   */
+  public RpcAuditEvent(
+      String sessionId,
+      CurrentUser who,
+      String what,
+      long when,
+      ListMultimap<String, ?> params,
+      String httpMethod,
+      Object input,
+      int status,
+      Object result) {
+    super(sessionId, who, what, when, params, httpMethod, input, status, result);
+  }
+}
diff --git a/java/com/google/gerrit/server/audit/SshAuditEvent.java b/java/com/google/gerrit/server/audit/SshAuditEvent.java
new file mode 100644
index 0000000..fee959e
--- /dev/null
+++ b/java/com/google/gerrit/server/audit/SshAuditEvent.java
@@ -0,0 +1,32 @@
+// Copyright (C) 2013 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.google.gerrit.server.audit;
+
+import com.google.common.collect.ListMultimap;
+import com.google.gerrit.server.AuditEvent;
+import com.google.gerrit.server.CurrentUser;
+
+public class SshAuditEvent extends AuditEvent {
+
+  public SshAuditEvent(
+      String sessionId,
+      CurrentUser who,
+      String what,
+      long when,
+      ListMultimap<String, ?> params,
+      Object result) {
+    super(sessionId, who, what, when, params, result);
+  }
+}
diff --git a/java/com/google/gerrit/server/audit/group/GroupAuditEvent.java b/java/com/google/gerrit/server/audit/group/GroupAuditEvent.java
new file mode 100644
index 0000000..ae26e12
--- /dev/null
+++ b/java/com/google/gerrit/server/audit/group/GroupAuditEvent.java
@@ -0,0 +1,43 @@
+// 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.
+
+package com.google.gerrit.server.audit.group;
+
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import java.sql.Timestamp;
+
+/** An audit event for groups. */
+public interface GroupAuditEvent {
+  /**
+   * Gets the acting user who is updating the group.
+   *
+   * @return the {@link com.google.gerrit.reviewdb.client.Account.Id} of the acting user.
+   */
+  Account.Id getActor();
+
+  /**
+   * Gets the {@link com.google.gerrit.reviewdb.client.AccountGroup.UUID} of the updated group.
+   *
+   * @return the {@link com.google.gerrit.reviewdb.client.AccountGroup.UUID} of the updated group.
+   */
+  AccountGroup.UUID getUpdatedGroup();
+
+  /**
+   * Gets the {@link Timestamp} of the action.
+   *
+   * @return the {@link Timestamp} of the action.
+   */
+  Timestamp getTimestamp();
+}
diff --git a/java/com/google/gerrit/server/audit/group/GroupAuditListener.java b/java/com/google/gerrit/server/audit/group/GroupAuditListener.java
new file mode 100644
index 0000000..5792c99
--- /dev/null
+++ b/java/com/google/gerrit/server/audit/group/GroupAuditListener.java
@@ -0,0 +1,28 @@
+// 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.
+
+package com.google.gerrit.server.audit.group;
+
+import com.google.gerrit.extensions.annotations.ExtensionPoint;
+
+@ExtensionPoint
+public interface GroupAuditListener {
+  void onAddMembers(GroupMemberAuditEvent groupMemberAuditEvent);
+
+  void onDeleteMembers(GroupMemberAuditEvent groupMemberAuditEvent);
+
+  void onAddSubgroups(GroupSubgroupAuditEvent groupSubgroupAuditEvent);
+
+  void onDeleteSubgroups(GroupSubgroupAuditEvent groupSubgroupAuditEvent);
+}
diff --git a/java/com/google/gerrit/server/audit/group/GroupMemberAuditEvent.java b/java/com/google/gerrit/server/audit/group/GroupMemberAuditEvent.java
new file mode 100644
index 0000000..a5c11bc
--- /dev/null
+++ b/java/com/google/gerrit/server/audit/group/GroupMemberAuditEvent.java
@@ -0,0 +1,44 @@
+// 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.
+
+package com.google.gerrit.server.audit.group;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import java.sql.Timestamp;
+
+@AutoValue
+public abstract class GroupMemberAuditEvent implements GroupAuditEvent {
+  public static GroupMemberAuditEvent create(
+      Account.Id actor,
+      AccountGroup.UUID updatedGroup,
+      ImmutableSet<Account.Id> modifiedMembers,
+      Timestamp timestamp) {
+    return new AutoValue_GroupMemberAuditEvent(actor, updatedGroup, modifiedMembers, timestamp);
+  }
+
+  @Override
+  public abstract Account.Id getActor();
+
+  @Override
+  public abstract AccountGroup.UUID getUpdatedGroup();
+
+  /** Gets the added or deleted members of the updated group. */
+  public abstract ImmutableSet<Account.Id> getModifiedMembers();
+
+  @Override
+  public abstract Timestamp getTimestamp();
+}
diff --git a/java/com/google/gerrit/server/audit/group/GroupSubgroupAuditEvent.java b/java/com/google/gerrit/server/audit/group/GroupSubgroupAuditEvent.java
new file mode 100644
index 0000000..0d5b26f
--- /dev/null
+++ b/java/com/google/gerrit/server/audit/group/GroupSubgroupAuditEvent.java
@@ -0,0 +1,44 @@
+// 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.
+
+package com.google.gerrit.server.audit.group;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import java.sql.Timestamp;
+
+@AutoValue
+public abstract class GroupSubgroupAuditEvent implements GroupAuditEvent {
+  public static GroupSubgroupAuditEvent create(
+      Account.Id actor,
+      AccountGroup.UUID updatedGroup,
+      ImmutableSet<AccountGroup.UUID> modifiedSubgroups,
+      Timestamp timestamp) {
+    return new AutoValue_GroupSubgroupAuditEvent(actor, updatedGroup, modifiedSubgroups, timestamp);
+  }
+
+  @Override
+  public abstract Account.Id getActor();
+
+  @Override
+  public abstract AccountGroup.UUID getUpdatedGroup();
+
+  /** Gets the added or deleted subgroups of the updated group. */
+  public abstract ImmutableSet<AccountGroup.UUID> getModifiedSubgroups();
+
+  @Override
+  public abstract Timestamp getTimestamp();
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/AuthBackend.java b/java/com/google/gerrit/server/auth/AuthBackend.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/auth/AuthBackend.java
rename to java/com/google/gerrit/server/auth/AuthBackend.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/AuthException.java b/java/com/google/gerrit/server/auth/AuthException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/auth/AuthException.java
rename to java/com/google/gerrit/server/auth/AuthException.java
diff --git a/java/com/google/gerrit/server/auth/AuthRequest.java b/java/com/google/gerrit/server/auth/AuthRequest.java
new file mode 100644
index 0000000..c6222f8
--- /dev/null
+++ b/java/com/google/gerrit/server/auth/AuthRequest.java
@@ -0,0 +1,48 @@
+// Copyright (C) 2012 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.google.gerrit.server.auth;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.common.Nullable;
+import java.util.Optional;
+
+/** Defines an abstract request for user authentication to Gerrit. */
+public abstract class AuthRequest {
+  private final Optional<String> username;
+  private final Optional<String> password;
+
+  protected AuthRequest(@Nullable String username, @Nullable String password) {
+    this.username = Optional.ofNullable(Strings.emptyToNull(username));
+    this.password = Optional.ofNullable(Strings.emptyToNull(password));
+  }
+
+  /**
+   * Returns the username to be authenticated.
+   *
+   * @return username for authentication or null for anonymous access.
+   */
+  public final Optional<String> getUsername() {
+    return username;
+  }
+
+  /**
+   * Returns the user's credentials
+   *
+   * @return user's credentials or null
+   */
+  public final Optional<String> getPassword() {
+    return password;
+  }
+}
diff --git a/java/com/google/gerrit/server/auth/AuthUser.java b/java/com/google/gerrit/server/auth/AuthUser.java
new file mode 100644
index 0000000..987f086
--- /dev/null
+++ b/java/com/google/gerrit/server/auth/AuthUser.java
@@ -0,0 +1,88 @@
+// Copyright (C) 2012 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.google.gerrit.server.auth;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.auto.value.AutoValue;
+import com.google.gerrit.common.Nullable;
+
+/** An authenticated user as specified by the AuthBackend. */
+public class AuthUser {
+
+  /** Globally unique identifier for the user. */
+  @AutoValue
+  public abstract static class UUID {
+    /**
+     * A new unique identifier.
+     *
+     * @param uuid the unique identifier.
+     * @return identifier instance.
+     */
+    public static UUID create(String uuid) {
+      return new AutoValue_AuthUser_UUID(uuid);
+    }
+
+    public abstract String uuid();
+  }
+
+  private final UUID uuid;
+  private final String username;
+
+  /**
+   * An authenticated user.
+   *
+   * @param uuid the globally unique ID.
+   * @param username the name of the authenticated user.
+   */
+  public AuthUser(UUID uuid, @Nullable String username) {
+    this.uuid = requireNonNull(uuid);
+    this.username = username;
+  }
+
+  /** @return the globally unique identifier. */
+  public final UUID getUUID() {
+    return uuid;
+  }
+
+  /** @return the backend specific user name, or null if one does not exist. */
+  @Nullable
+  public final String getUsername() {
+    return username;
+  }
+
+  /** @return {@code true} if {@link #getUsername()} is not null. */
+  public final boolean hasUsername() {
+    return getUsername() != null;
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (obj instanceof AuthUser) {
+      return getUUID().equals(((AuthUser) obj).getUUID());
+    }
+    return false;
+  }
+
+  @Override
+  public int hashCode() {
+    return getUUID().hashCode();
+  }
+
+  @Override
+  public String toString() {
+    return String.format("AuthUser[uuid=%s, username=%s]", getUUID(), getUsername());
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/AuthenticationUnavailableException.java b/java/com/google/gerrit/server/auth/AuthenticationUnavailableException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/auth/AuthenticationUnavailableException.java
rename to java/com/google/gerrit/server/auth/AuthenticationUnavailableException.java
diff --git a/java/com/google/gerrit/server/auth/InternalAuthBackend.java b/java/com/google/gerrit/server/auth/InternalAuthBackend.java
new file mode 100644
index 0000000..c06c66b
--- /dev/null
+++ b/java/com/google/gerrit/server/auth/InternalAuthBackend.java
@@ -0,0 +1,70 @@
+// Copyright (C) 2012 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.google.gerrit.server.auth;
+
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.config.AuthConfig;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.Locale;
+
+@Singleton
+public class InternalAuthBackend implements AuthBackend {
+  private final AccountCache accountCache;
+  private final AuthConfig authConfig;
+
+  @Inject
+  InternalAuthBackend(AccountCache accountCache, AuthConfig authConfig) {
+    this.accountCache = accountCache;
+    this.authConfig = authConfig;
+  }
+
+  @Override
+  public String getDomain() {
+    return "gerrit";
+  }
+
+  // TODO(gerritcodereview-team): This function has no coverage.
+  @Override
+  public AuthUser authenticate(AuthRequest req)
+      throws MissingCredentialsException, InvalidCredentialsException, UnknownUserException,
+          UserNotAllowedException, AuthException {
+    if (!req.getUsername().isPresent() || !req.getPassword().isPresent()) {
+      throw new MissingCredentialsException();
+    }
+
+    String username;
+    if (authConfig.isUserNameToLowerCase()) {
+      username = req.getUsername().map(u -> u.toLowerCase(Locale.US)).get();
+    } else {
+      username = req.getUsername().get();
+    }
+
+    AccountState who = accountCache.getByUsername(username).orElseThrow(UnknownUserException::new);
+
+    if (!who.getAccount().isActive()) {
+      throw new UserNotAllowedException(
+          "Authentication failed for "
+              + username
+              + ": account inactive or not provisioned in Gerrit");
+    }
+
+    if (!who.checkPassword(req.getPassword().get(), username)) {
+      throw new InvalidCredentialsException();
+    }
+    return new AuthUser(AuthUser.UUID.create(username), username);
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/InvalidCredentialsException.java b/java/com/google/gerrit/server/auth/InvalidCredentialsException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/auth/InvalidCredentialsException.java
rename to java/com/google/gerrit/server/auth/InvalidCredentialsException.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/MissingCredentialsException.java b/java/com/google/gerrit/server/auth/MissingCredentialsException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/auth/MissingCredentialsException.java
rename to java/com/google/gerrit/server/auth/MissingCredentialsException.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/NoSuchUserException.java b/java/com/google/gerrit/server/auth/NoSuchUserException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/auth/NoSuchUserException.java
rename to java/com/google/gerrit/server/auth/NoSuchUserException.java
diff --git a/java/com/google/gerrit/server/auth/UniversalAuthBackend.java b/java/com/google/gerrit/server/auth/UniversalAuthBackend.java
new file mode 100644
index 0000000..94faeef
--- /dev/null
+++ b/java/com/google/gerrit/server/auth/UniversalAuthBackend.java
@@ -0,0 +1,69 @@
+// Copyright (C) 2012 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.google.gerrit.server.auth;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.ArrayList;
+import java.util.List;
+
+/** Universal implementation of the AuthBackend that works with the injected set of AuthBackends. */
+@Singleton
+public final class UniversalAuthBackend implements AuthBackend {
+  private final DynamicSet<AuthBackend> authBackends;
+
+  @Inject
+  UniversalAuthBackend(DynamicSet<AuthBackend> authBackends) {
+    this.authBackends = authBackends;
+  }
+
+  @Override
+  public AuthUser authenticate(AuthRequest request) throws AuthException {
+    List<AuthUser> authUsers = new ArrayList<>();
+    List<AuthException> authExs = new ArrayList<>();
+    for (AuthBackend backend : authBackends) {
+      try {
+        authUsers.add(requireNonNull(backend.authenticate(request)));
+      } catch (MissingCredentialsException ex) {
+        // Not handled by this backend.
+      } catch (AuthException ex) {
+        authExs.add(ex);
+      }
+    }
+
+    // Handle the valid responses
+    if (authUsers.size() == 1) {
+      return authUsers.get(0);
+    } else if (authUsers.isEmpty() && authExs.size() == 1) {
+      throw authExs.get(0);
+    } else if (authExs.isEmpty() && authUsers.isEmpty()) {
+      throw new MissingCredentialsException();
+    }
+
+    String msg =
+        String.format(
+            "Multiple AuthBackends attempted to handle request: authUsers=%s authExs=%s",
+            authUsers, authExs);
+    throw new AuthException(msg);
+  }
+
+  @Override
+  public String getDomain() {
+    throw new UnsupportedOperationException("UniversalAuthBackend doesn't support domain.");
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/UnknownUserException.java b/java/com/google/gerrit/server/auth/UnknownUserException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/auth/UnknownUserException.java
rename to java/com/google/gerrit/server/auth/UnknownUserException.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/UserNotAllowedException.java b/java/com/google/gerrit/server/auth/UserNotAllowedException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/auth/UserNotAllowedException.java
rename to java/com/google/gerrit/server/auth/UserNotAllowedException.java
diff --git a/java/com/google/gerrit/server/auth/ldap/Helper.java b/java/com/google/gerrit/server/auth/ldap/Helper.java
new file mode 100644
index 0000000..a53a8c2
--- /dev/null
+++ b/java/com/google/gerrit/server/auth/ldap/Helper.java
@@ -0,0 +1,486 @@
+// Copyright (C) 2009 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.google.gerrit.server.auth.ldap;
+
+import com.google.common.base.Throwables;
+import com.google.common.cache.Cache;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.ParameterizedString;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.account.AccountException;
+import com.google.gerrit.server.account.AuthenticationFailedException;
+import com.google.gerrit.server.auth.NoSuchUserException;
+import com.google.gerrit.server.config.ConfigUtil;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.util.ssl.BlindHostnameVerifier;
+import com.google.gerrit.util.ssl.BlindSSLSocketFactory;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.google.inject.name.Named;
+import java.io.IOException;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Properties;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+import javax.naming.CompositeName;
+import javax.naming.Context;
+import javax.naming.Name;
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+import javax.naming.PartialResultException;
+import javax.naming.directory.Attribute;
+import javax.naming.directory.DirContext;
+import javax.naming.ldap.InitialLdapContext;
+import javax.naming.ldap.LdapContext;
+import javax.naming.ldap.StartTlsRequest;
+import javax.naming.ldap.StartTlsResponse;
+import javax.net.ssl.SSLSocketFactory;
+import javax.security.auth.Subject;
+import javax.security.auth.login.LoginContext;
+import javax.security.auth.login.LoginException;
+import org.eclipse.jgit.lib.Config;
+
+@Singleton
+class Helper {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  static final String LDAP_UUID = "ldap:";
+  static final String STARTTLS_PROPERTY = Helper.class.getName() + ".startTls";
+
+  private final Cache<String, ImmutableSet<String>> parentGroups;
+  private final Config config;
+  private final String server;
+  private final String username;
+  private final String password;
+  private final String referral;
+  private final boolean startTls;
+  private final boolean sslVerify;
+  private final String authentication;
+  private volatile LdapSchema ldapSchema;
+  private final String readTimeoutMillis;
+  private final String connectTimeoutMillis;
+  private final boolean useConnectionPooling;
+  private final boolean groupsVisibleToAll;
+
+  @Inject
+  Helper(
+      @GerritServerConfig Config config,
+      @Named(LdapModule.PARENT_GROUPS_CACHE) Cache<String, ImmutableSet<String>> parentGroups) {
+    this.config = config;
+    this.server = LdapRealm.optional(config, "server");
+    this.username = LdapRealm.optional(config, "username");
+    this.password = LdapRealm.optional(config, "password", "");
+    this.referral = LdapRealm.optional(config, "referral", "ignore");
+    this.startTls = config.getBoolean("ldap", "startTls", false);
+    this.sslVerify = config.getBoolean("ldap", "sslverify", true);
+    this.groupsVisibleToAll = config.getBoolean("ldap", "groupsVisibleToAll", false);
+    this.authentication = LdapRealm.optional(config, "authentication", "simple");
+    String readTimeout = LdapRealm.optional(config, "readTimeout");
+    if (readTimeout != null) {
+      readTimeoutMillis =
+          Long.toString(ConfigUtil.getTimeUnit(readTimeout, 0, TimeUnit.MILLISECONDS));
+    } else {
+      readTimeoutMillis = null;
+    }
+    String connectTimeout = LdapRealm.optional(config, "connectTimeout");
+    if (connectTimeout != null) {
+      connectTimeoutMillis =
+          Long.toString(ConfigUtil.getTimeUnit(connectTimeout, 0, TimeUnit.MILLISECONDS));
+    } else {
+      connectTimeoutMillis = null;
+    }
+    this.parentGroups = parentGroups;
+    this.useConnectionPooling = LdapRealm.optional(config, "useConnectionPooling", false);
+  }
+
+  private Properties createContextProperties() {
+    final Properties env = new Properties();
+    env.put(Context.INITIAL_CONTEXT_FACTORY, LdapRealm.LDAP);
+    env.put(Context.PROVIDER_URL, server);
+    if (server.startsWith("ldaps:") && !sslVerify) {
+      Class<? extends SSLSocketFactory> factory = BlindSSLSocketFactory.class;
+      env.put("java.naming.ldap.factory.socket", factory.getName());
+    }
+    if (readTimeoutMillis != null) {
+      env.put("com.sun.jndi.ldap.read.timeout", readTimeoutMillis);
+    }
+    if (connectTimeoutMillis != null) {
+      env.put("com.sun.jndi.ldap.connect.timeout", connectTimeoutMillis);
+    }
+    if (useConnectionPooling) {
+      env.put("com.sun.jndi.ldap.connect.pool", "true");
+    }
+    return env;
+  }
+
+  private LdapContext createContext(Properties env) throws IOException, NamingException {
+    LdapContext ctx = new InitialLdapContext(env, null);
+    if (startTls) {
+      StartTlsResponse tls = (StartTlsResponse) ctx.extendedOperation(new StartTlsRequest());
+      SSLSocketFactory sslfactory = null;
+      if (!sslVerify) {
+        sslfactory = (SSLSocketFactory) BlindSSLSocketFactory.getDefault();
+        tls.setHostnameVerifier(BlindHostnameVerifier.getInstance());
+      }
+      tls.negotiate(sslfactory);
+      ctx.addToEnvironment(STARTTLS_PROPERTY, tls);
+    }
+    return ctx;
+  }
+
+  void close(DirContext ctx) {
+    try {
+      StartTlsResponse tls = (StartTlsResponse) ctx.removeFromEnvironment(STARTTLS_PROPERTY);
+      if (tls != null) {
+        tls.close();
+      }
+    } catch (IOException | NamingException e) {
+      logger.atWarning().withCause(e).log("Cannot close LDAP startTls handle");
+    }
+    try {
+      ctx.close();
+    } catch (NamingException e) {
+      logger.atWarning().withCause(e).log("Cannot close LDAP handle");
+    }
+  }
+
+  DirContext open() throws IOException, NamingException, LoginException {
+    final Properties env = createContextProperties();
+    env.put(Context.SECURITY_AUTHENTICATION, authentication);
+    env.put(Context.REFERRAL, referral);
+    if ("GSSAPI".equals(authentication)) {
+      return kerberosOpen(env);
+    }
+    LdapContext ctx = createContext(env);
+    if (username != null) {
+      ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, username);
+      ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, password);
+      ctx.reconnect(null);
+    }
+    return ctx;
+  }
+
+  private DirContext kerberosOpen(Properties env)
+      throws IOException, LoginException, NamingException {
+    LoginContext ctx = new LoginContext("KerberosLogin");
+    ctx.login();
+    Subject subject = ctx.getSubject();
+    try {
+      return Subject.doAs(
+          subject,
+          new PrivilegedExceptionAction<DirContext>() {
+            @Override
+            public DirContext run() throws IOException, NamingException {
+              return createContext(env);
+            }
+          });
+    } catch (PrivilegedActionException e) {
+      Throwables.throwIfInstanceOf(e.getException(), IOException.class);
+      Throwables.throwIfInstanceOf(e.getException(), NamingException.class);
+      Throwables.throwIfInstanceOf(e.getException(), RuntimeException.class);
+      logger.atWarning().withCause(e.getException()).log("Internal error");
+      return null;
+    } finally {
+      ctx.logout();
+    }
+  }
+
+  DirContext authenticate(String dn, String password) throws AccountException {
+    final Properties env = createContextProperties();
+    try {
+      LdapContext ctx = createContext(env);
+      ctx.addToEnvironment(Context.SECURITY_AUTHENTICATION, "simple");
+      ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, dn);
+      ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, password);
+      ctx.addToEnvironment(Context.REFERRAL, referral);
+      ctx.reconnect(null);
+      return ctx;
+    } catch (IOException | NamingException e) {
+      throw new AuthenticationFailedException("Incorrect username or password", e);
+    }
+  }
+
+  LdapSchema getSchema(DirContext ctx) {
+    if (ldapSchema == null) {
+      synchronized (this) {
+        if (ldapSchema == null) {
+          ldapSchema = new LdapSchema(ctx);
+        }
+      }
+    }
+    return ldapSchema;
+  }
+
+  LdapQuery.Result findAccount(
+      Helper.LdapSchema schema, DirContext ctx, String username, boolean fetchMemberOf)
+      throws NamingException, AccountException {
+    final HashMap<String, String> params = new HashMap<>();
+    params.put(LdapRealm.USERNAME, username);
+
+    List<LdapQuery> accountQueryList;
+    if (fetchMemberOf && schema.type.accountMemberField() != null) {
+      accountQueryList = schema.accountWithMemberOfQueryList;
+    } else {
+      accountQueryList = schema.accountQueryList;
+    }
+
+    for (LdapQuery accountQuery : accountQueryList) {
+      List<LdapQuery.Result> res = accountQuery.query(ctx, params);
+      if (res.size() == 1) {
+        return res.get(0);
+      } else if (res.size() > 1) {
+        throw new AccountException("Duplicate users: " + username);
+      }
+    }
+    throw new NoSuchUserException(username);
+  }
+
+  Set<AccountGroup.UUID> queryForGroups(
+      final DirContext ctx, String username, LdapQuery.Result account) throws NamingException {
+    final LdapSchema schema = getSchema(ctx);
+    final Set<String> groupDNs = new HashSet<>();
+
+    if (!schema.groupMemberQueryList.isEmpty()) {
+      final HashMap<String, String> params = new HashMap<>();
+
+      if (account == null) {
+        try {
+          account = findAccount(schema, ctx, username, false);
+        } catch (AccountException e) {
+          return Collections.emptySet();
+        }
+      }
+      for (String name : schema.groupMemberQueryList.get(0).getParameters()) {
+        params.put(name, account.get(name));
+      }
+
+      params.put(LdapRealm.USERNAME, username);
+
+      for (LdapQuery groupMemberQuery : schema.groupMemberQueryList) {
+        for (LdapQuery.Result r : groupMemberQuery.query(ctx, params)) {
+          recursivelyExpandGroups(groupDNs, schema, ctx, r.getDN());
+        }
+      }
+    }
+
+    if (schema.accountMemberField != null) {
+      if (account == null || account.getAll(schema.accountMemberField) == null) {
+        try {
+          account = findAccount(schema, ctx, username, true);
+        } catch (AccountException e) {
+          return Collections.emptySet();
+        }
+      }
+
+      final Attribute groupAtt = account.getAll(schema.accountMemberField);
+      if (groupAtt != null) {
+        final NamingEnumeration<?> groups = groupAtt.getAll();
+        try {
+          while (groups.hasMore()) {
+            final String nextDN = (String) groups.next();
+            recursivelyExpandGroups(groupDNs, schema, ctx, nextDN);
+          }
+        } catch (PartialResultException e) {
+          // Ignored
+        }
+      }
+    }
+
+    final Set<AccountGroup.UUID> actual = new HashSet<>();
+    for (String dn : groupDNs) {
+      actual.add(new AccountGroup.UUID(LDAP_UUID + dn));
+    }
+
+    if (actual.isEmpty()) {
+      return Collections.emptySet();
+    }
+    return ImmutableSet.copyOf(actual);
+  }
+
+  private void recursivelyExpandGroups(
+      final Set<String> groupDNs,
+      final LdapSchema schema,
+      final DirContext ctx,
+      final String groupDN) {
+    if (groupDNs.add(groupDN)
+        && schema.accountMemberField != null
+        && schema.accountMemberExpandGroups) {
+      ImmutableSet<String> cachedParentsDNs = parentGroups.getIfPresent(groupDN);
+      if (cachedParentsDNs == null) {
+        // Recursively identify the groups it is a member of.
+        ImmutableSet.Builder<String> dns = ImmutableSet.builder();
+        try {
+          final Name compositeGroupName = new CompositeName().add(groupDN);
+          final Attribute in =
+              ctx.getAttributes(compositeGroupName, schema.accountMemberFieldArray)
+                  .get(schema.accountMemberField);
+          if (in != null) {
+            final NamingEnumeration<?> groups = in.getAll();
+            try {
+              while (groups.hasMore()) {
+                dns.add((String) groups.next());
+              }
+            } catch (PartialResultException e) {
+              // Ignored
+            }
+          }
+        } catch (NamingException e) {
+          logger.atWarning().withCause(e).log("Could not find group %s", groupDN);
+        }
+        cachedParentsDNs = dns.build();
+        parentGroups.put(groupDN, cachedParentsDNs);
+      }
+      for (String dn : cachedParentsDNs) {
+        recursivelyExpandGroups(groupDNs, schema, ctx, dn);
+      }
+    }
+  }
+
+  public boolean groupsVisibleToAll() {
+    return this.groupsVisibleToAll;
+  }
+
+  class LdapSchema {
+    final LdapType type;
+
+    final ParameterizedString accountFullName;
+    final ParameterizedString accountEmailAddress;
+    final ParameterizedString accountSshUserName;
+    final String accountMemberField;
+    final boolean accountMemberExpandGroups;
+    final String[] accountMemberFieldArray;
+    final List<LdapQuery> accountQueryList;
+    final List<LdapQuery> accountWithMemberOfQueryList;
+
+    final List<String> groupBases;
+    final SearchScope groupScope;
+    final ParameterizedString groupPattern;
+    final ParameterizedString groupName;
+    final List<LdapQuery> groupMemberQueryList;
+
+    LdapSchema(DirContext ctx) {
+      type = discoverLdapType(ctx);
+      groupMemberQueryList = new ArrayList<>();
+      accountQueryList = new ArrayList<>();
+      accountWithMemberOfQueryList = new ArrayList<>();
+
+      final Set<String> accountAtts = new HashSet<>();
+
+      // Group query
+      //
+
+      groupBases = LdapRealm.optionalList(config, "groupBase");
+      groupScope = LdapRealm.scope(config, "groupScope");
+      groupPattern = LdapRealm.paramString(config, "groupPattern", type.groupPattern());
+      groupName = LdapRealm.paramString(config, "groupName", type.groupName());
+      final String groupMemberPattern =
+          LdapRealm.optdef(config, "groupMemberPattern", type.groupMemberPattern());
+
+      for (String groupBase : groupBases) {
+        if (groupMemberPattern != null) {
+          final LdapQuery groupMemberQuery =
+              new LdapQuery(
+                  groupBase,
+                  groupScope,
+                  new ParameterizedString(groupMemberPattern),
+                  Collections.<String>emptySet());
+          if (groupMemberQuery.getParameters().isEmpty()) {
+            throw new IllegalArgumentException("No variables in ldap.groupMemberPattern");
+          }
+
+          accountAtts.addAll(groupMemberQuery.getParameters());
+
+          groupMemberQueryList.add(groupMemberQuery);
+        }
+      }
+
+      // Account query
+      //
+      accountFullName = LdapRealm.paramString(config, "accountFullName", type.accountFullName());
+      if (accountFullName != null) {
+        accountAtts.addAll(accountFullName.getParameterNames());
+      }
+      accountEmailAddress =
+          LdapRealm.paramString(config, "accountEmailAddress", type.accountEmailAddress());
+      if (accountEmailAddress != null) {
+        accountAtts.addAll(accountEmailAddress.getParameterNames());
+      }
+      accountSshUserName =
+          LdapRealm.paramString(config, "accountSshUserName", type.accountSshUserName());
+      if (accountSshUserName != null) {
+        accountAtts.addAll(accountSshUserName.getParameterNames());
+      }
+      accountMemberField =
+          LdapRealm.optdef(config, "accountMemberField", type.accountMemberField());
+      if (accountMemberField != null) {
+        accountMemberFieldArray = new String[] {accountMemberField};
+      } else {
+        accountMemberFieldArray = null;
+      }
+      accountMemberExpandGroups =
+          LdapRealm.optional(config, "accountMemberExpandGroups", type.accountMemberExpandGroups());
+
+      final SearchScope accountScope = LdapRealm.scope(config, "accountScope");
+      final String accountPattern =
+          LdapRealm.reqdef(config, "accountPattern", type.accountPattern());
+
+      Set<String> accountWithMemberOfAtts;
+      if (accountMemberField != null) {
+        accountWithMemberOfAtts = new HashSet<>(accountAtts);
+        accountWithMemberOfAtts.add(accountMemberField);
+      } else {
+        accountWithMemberOfAtts = null;
+      }
+      for (String accountBase : LdapRealm.requiredList(config, "accountBase")) {
+        LdapQuery accountQuery =
+            new LdapQuery(
+                accountBase, accountScope, new ParameterizedString(accountPattern), accountAtts);
+        if (accountQuery.getParameters().isEmpty()) {
+          throw new IllegalArgumentException("No variables in ldap.accountPattern");
+        }
+        accountQueryList.add(accountQuery);
+
+        if (accountWithMemberOfAtts != null) {
+          LdapQuery accountWithMemberOfQuery =
+              new LdapQuery(
+                  accountBase,
+                  accountScope,
+                  new ParameterizedString(accountPattern),
+                  accountWithMemberOfAtts);
+          accountWithMemberOfQueryList.add(accountWithMemberOfQuery);
+        }
+      }
+    }
+
+    LdapType discoverLdapType(DirContext ctx) {
+      try {
+        return LdapType.guessType(ctx);
+      } catch (NamingException e) {
+        logger.atWarning().withCause(e).log(
+            "Cannot discover type of LDAP server at %s,"
+                + " assuming the server is RFC 2307 compliant.",
+            server);
+        return LdapType.RFC_2307;
+      }
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/auth/ldap/LdapAuthBackend.java b/java/com/google/gerrit/server/auth/ldap/LdapAuthBackend.java
new file mode 100644
index 0000000..f31954e
--- /dev/null
+++ b/java/com/google/gerrit/server/auth/ldap/LdapAuthBackend.java
@@ -0,0 +1,102 @@
+// Copyright (C) 2012 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.google.gerrit.server.auth.ldap;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.client.AuthType;
+import com.google.gerrit.server.account.AccountException;
+import com.google.gerrit.server.auth.AuthBackend;
+import com.google.gerrit.server.auth.AuthException;
+import com.google.gerrit.server.auth.AuthRequest;
+import com.google.gerrit.server.auth.AuthUser;
+import com.google.gerrit.server.auth.InvalidCredentialsException;
+import com.google.gerrit.server.auth.MissingCredentialsException;
+import com.google.gerrit.server.auth.UnknownUserException;
+import com.google.gerrit.server.auth.UserNotAllowedException;
+import com.google.gerrit.server.config.AuthConfig;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.util.Locale;
+import javax.naming.NamingException;
+import javax.naming.directory.DirContext;
+import javax.security.auth.login.LoginException;
+import org.eclipse.jgit.lib.Config;
+
+/** Implementation of AuthBackend for the LDAP authentication system. */
+public class LdapAuthBackend implements AuthBackend {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final Helper helper;
+  private final AuthConfig authConfig;
+  private final boolean lowerCaseUsername;
+
+  @Inject
+  public LdapAuthBackend(Helper helper, AuthConfig authConfig, @GerritServerConfig Config config) {
+    this.helper = helper;
+    this.authConfig = authConfig;
+    this.lowerCaseUsername = config.getBoolean("ldap", "localUsernameToLowerCase", false);
+  }
+
+  @Override
+  public String getDomain() {
+    return "ldap";
+  }
+
+  @Override
+  public AuthUser authenticate(AuthRequest req)
+      throws MissingCredentialsException, InvalidCredentialsException, UnknownUserException,
+          UserNotAllowedException, AuthException {
+    if (!req.getUsername().isPresent() || !req.getPassword().isPresent()) {
+      throw new MissingCredentialsException();
+    }
+
+    String username =
+        lowerCaseUsername
+            ? req.getUsername().map(u -> u.toLowerCase(Locale.US)).get()
+            : req.getUsername().get();
+    try {
+      final DirContext ctx;
+      if (authConfig.getAuthType() == AuthType.LDAP_BIND) {
+        ctx = helper.authenticate(username, req.getPassword().get());
+      } else {
+        ctx = helper.open();
+      }
+      try {
+        final Helper.LdapSchema schema = helper.getSchema(ctx);
+        final LdapQuery.Result m = helper.findAccount(schema, ctx, username, false);
+
+        if (authConfig.getAuthType() == AuthType.LDAP) {
+          // We found the user account, but we need to verify
+          // the password matches it before we can continue.
+          //
+          helper.close(helper.authenticate(m.getDN(), req.getPassword().get()));
+        }
+        return new AuthUser(AuthUser.UUID.create(username), username);
+      } finally {
+        helper.close(ctx);
+      }
+    } catch (AccountException e) {
+      logger.atSevere().withCause(e).log("Cannot query LDAP to authenticate user");
+      throw new InvalidCredentialsException("Cannot query LDAP for account", e);
+    } catch (IOException | NamingException e) {
+      logger.atSevere().withCause(e).log("Cannot query LDAP to authenticate user");
+      throw new AuthException("Cannot query LDAP for account", e);
+    } catch (LoginException e) {
+      logger.atSevere().withCause(e).log("Cannot authenticate server via JAAS");
+      throw new AuthException("Cannot query LDAP for account", e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/auth/ldap/LdapGroupBackend.java b/java/com/google/gerrit/server/auth/ldap/LdapGroupBackend.java
new file mode 100644
index 0000000..87a4abf
--- /dev/null
+++ b/java/com/google/gerrit/server/auth/ldap/LdapGroupBackend.java
@@ -0,0 +1,233 @@
+// Copyright (C) 2012 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.google.gerrit.server.auth.ldap;
+
+import static com.google.gerrit.server.account.GroupBackends.GROUP_REF_NAME_COMPARATOR;
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_GERRIT;
+import static com.google.gerrit.server.auth.ldap.Helper.LDAP_UUID;
+import static com.google.gerrit.server.auth.ldap.LdapModule.GROUP_CACHE;
+import static com.google.gerrit.server.auth.ldap.LdapModule.GROUP_EXIST_CACHE;
+
+import com.google.common.cache.LoadingCache;
+import com.google.common.collect.Sets;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.data.ParameterizedString;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.account.GroupMembership;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.auth.ldap.Helper.LdapSchema;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.name.Named;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import javax.naming.InvalidNameException;
+import javax.naming.NamingException;
+import javax.naming.directory.DirContext;
+import javax.naming.ldap.LdapName;
+import javax.naming.ldap.Rdn;
+import javax.security.auth.login.LoginException;
+import org.eclipse.jgit.lib.Config;
+
+/** Implementation of GroupBackend for the LDAP group system. */
+public class LdapGroupBackend implements GroupBackend {
+  static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final String LDAP_NAME = "ldap/";
+  private static final String GROUPNAME = "groupname";
+
+  private final Helper helper;
+  private final LoadingCache<String, Set<AccountGroup.UUID>> membershipCache;
+  private final LoadingCache<String, Boolean> existsCache;
+  private final ProjectCache projectCache;
+  private final Provider<CurrentUser> userProvider;
+  private final Config gerritConfig;
+
+  @Inject
+  LdapGroupBackend(
+      Helper helper,
+      @Named(GROUP_CACHE) LoadingCache<String, Set<AccountGroup.UUID>> membershipCache,
+      @Named(GROUP_EXIST_CACHE) LoadingCache<String, Boolean> existsCache,
+      ProjectCache projectCache,
+      Provider<CurrentUser> userProvider,
+      @GerritServerConfig Config gerritConfig) {
+    this.helper = helper;
+    this.membershipCache = membershipCache;
+    this.projectCache = projectCache;
+    this.existsCache = existsCache;
+    this.userProvider = userProvider;
+    this.gerritConfig = gerritConfig;
+  }
+
+  private boolean isLdapUUID(AccountGroup.UUID uuid) {
+    return uuid.get().startsWith(LDAP_UUID);
+  }
+
+  private static GroupReference groupReference(ParameterizedString p, LdapQuery.Result res)
+      throws NamingException {
+    return new GroupReference(
+        new AccountGroup.UUID(LDAP_UUID + res.getDN()), LDAP_NAME + LdapRealm.apply(p, res));
+  }
+
+  private static String cnFor(String dn) {
+    try {
+      LdapName name = new LdapName(dn);
+      if (!name.isEmpty()) {
+        String cn = name.get(name.size() - 1);
+        int index = cn.indexOf('=');
+        if (index >= 0) {
+          cn = cn.substring(index + 1);
+        }
+        return cn;
+      }
+    } catch (InvalidNameException e) {
+      logger.atWarning().withCause(e).log("Cannot parse LDAP dn for cn");
+    }
+    return dn;
+  }
+
+  @Override
+  public boolean handles(AccountGroup.UUID uuid) {
+    return isLdapUUID(uuid);
+  }
+
+  @Override
+  public GroupDescription.Basic get(AccountGroup.UUID uuid) {
+    if (!handles(uuid)) {
+      return null;
+    }
+
+    String groupDn = uuid.get().substring(LDAP_UUID.length());
+    CurrentUser user = userProvider.get();
+    if (!(user.isIdentifiedUser()) || !membershipsOf(user.asIdentifiedUser()).contains(uuid)) {
+      try {
+        if (!existsCache.get(groupDn)) {
+          return null;
+        }
+      } catch (ExecutionException e) {
+        logger.atWarning().withCause(e).log("Cannot lookup group %s in LDAP", groupDn);
+        return null;
+      }
+    }
+
+    final String name = LDAP_NAME + cnFor(groupDn);
+    return new GroupDescription.Basic() {
+      @Override
+      public AccountGroup.UUID getGroupUUID() {
+        return uuid;
+      }
+
+      @Override
+      public String getName() {
+        return name;
+      }
+
+      @Override
+      @Nullable
+      public String getEmailAddress() {
+        return null;
+      }
+
+      @Override
+      @Nullable
+      public String getUrl() {
+        return null;
+      }
+    };
+  }
+
+  @Override
+  public Collection<GroupReference> suggest(String name, ProjectState project) {
+    AccountGroup.UUID uuid = new AccountGroup.UUID(name);
+    if (isLdapUUID(uuid)) {
+      GroupDescription.Basic g = get(uuid);
+      if (g == null) {
+        return Collections.emptySet();
+      }
+      return Collections.singleton(GroupReference.forGroup(g));
+    } else if (name.startsWith(LDAP_NAME)) {
+      return suggestLdap(name.substring(LDAP_NAME.length()));
+    }
+    return Collections.emptySet();
+  }
+
+  @Override
+  public GroupMembership membershipsOf(IdentifiedUser user) {
+    String id = findId(user.state().getExternalIds());
+    if (id == null) {
+      return GroupMembership.EMPTY;
+    }
+    return new LdapGroupMembership(membershipCache, projectCache, id, gerritConfig);
+  }
+
+  private static String findId(Collection<ExternalId> extIds) {
+    for (ExternalId extId : extIds) {
+      if (extId.isScheme(SCHEME_GERRIT)) {
+        return extId.key().id();
+      }
+    }
+    return null;
+  }
+
+  private Set<GroupReference> suggestLdap(String name) {
+    if (name.isEmpty()) {
+      return Collections.emptySet();
+    }
+
+    Set<GroupReference> out = Sets.newTreeSet(GROUP_REF_NAME_COMPARATOR);
+    try {
+      DirContext ctx = helper.open();
+      try {
+        // Do exact lookups until there are at least 3 characters.
+        name = Rdn.escapeValue(name) + ((name.length() >= 3) ? "*" : "");
+        LdapSchema schema = helper.getSchema(ctx);
+        ParameterizedString filter =
+            ParameterizedString.asis(schema.groupPattern.replace(GROUPNAME, name).toString());
+        Set<String> returnAttrs = new HashSet<>(schema.groupName.getParameterNames());
+        Map<String, String> params = Collections.emptyMap();
+        for (String groupBase : schema.groupBases) {
+          LdapQuery query = new LdapQuery(groupBase, schema.groupScope, filter, returnAttrs);
+          for (LdapQuery.Result res : query.query(ctx, params)) {
+            out.add(groupReference(schema.groupName, res));
+          }
+        }
+      } finally {
+        helper.close(ctx);
+      }
+    } catch (IOException | NamingException | LoginException e) {
+      logger.atWarning().withCause(e).log("Cannot query LDAP for groups matching requested name");
+    }
+    return out;
+  }
+
+  @Override
+  public boolean isVisibleToAll(AccountGroup.UUID uuid) {
+    return handles(uuid) && helper.groupsVisibleToAll();
+  }
+}
diff --git a/java/com/google/gerrit/server/auth/ldap/LdapGroupMembership.java b/java/com/google/gerrit/server/auth/ldap/LdapGroupMembership.java
new file mode 100644
index 0000000..f5406c2
--- /dev/null
+++ b/java/com/google/gerrit/server/auth/ldap/LdapGroupMembership.java
@@ -0,0 +1,83 @@
+// Copyright (C) 2015 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.google.gerrit.server.auth.ldap;
+
+import com.google.common.cache.LoadingCache;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.account.GroupMembership;
+import com.google.gerrit.server.account.ListGroupMembership;
+import com.google.gerrit.server.project.ProjectCache;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import org.eclipse.jgit.lib.Config;
+
+class LdapGroupMembership implements GroupMembership {
+  private final LoadingCache<String, Set<AccountGroup.UUID>> membershipCache;
+  private final ProjectCache projectCache;
+  private final String id;
+  private final boolean guessRelevantGroups;
+  private GroupMembership membership;
+
+  LdapGroupMembership(
+      LoadingCache<String, Set<AccountGroup.UUID>> membershipCache,
+      ProjectCache projectCache,
+      String id,
+      Config gerritConfig) {
+    this.membershipCache = membershipCache;
+    this.projectCache = projectCache;
+    this.id = id;
+    this.guessRelevantGroups = gerritConfig.getBoolean("ldap", "guessRelevantGroups", true);
+  }
+
+  @Override
+  public boolean contains(AccountGroup.UUID groupId) {
+    return get().contains(groupId);
+  }
+
+  @Override
+  public boolean containsAnyOf(Iterable<AccountGroup.UUID> groupIds) {
+    return get().containsAnyOf(groupIds);
+  }
+
+  @Override
+  public Set<AccountGroup.UUID> intersection(Iterable<AccountGroup.UUID> groupIds) {
+    return get().intersection(groupIds);
+  }
+
+  @Override
+  public Set<AccountGroup.UUID> getKnownGroups() {
+    Set<AccountGroup.UUID> g = new HashSet<>(get().getKnownGroups());
+    if (guessRelevantGroups) {
+      g.retainAll(projectCache.guessRelevantGroupUUIDs());
+    }
+    return g;
+  }
+
+  private synchronized GroupMembership get() {
+    if (membership == null) {
+      try {
+        membership = new ListGroupMembership(membershipCache.get(id));
+      } catch (ExecutionException e) {
+        LdapGroupBackend.logger
+            .atWarning()
+            .withCause(e)
+            .log("Cannot lookup membershipsOf %s in LDAP", id);
+        membership = GroupMembership.EMPTY;
+      }
+    }
+    return membership;
+  }
+}
diff --git a/java/com/google/gerrit/server/auth/ldap/LdapModule.java b/java/com/google/gerrit/server/auth/ldap/LdapModule.java
new file mode 100644
index 0000000..3fbf049
--- /dev/null
+++ b/java/com/google/gerrit/server/auth/ldap/LdapModule.java
@@ -0,0 +1,57 @@
+// Copyright (C) 2009 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.google.gerrit.server.auth.ldap;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.account.Realm;
+import com.google.gerrit.server.cache.CacheModule;
+import com.google.inject.Scopes;
+import com.google.inject.TypeLiteral;
+import java.time.Duration;
+import java.util.Optional;
+import java.util.Set;
+
+public class LdapModule extends CacheModule {
+  static final String USERNAME_CACHE = "ldap_usernames";
+  static final String GROUP_CACHE = "ldap_groups";
+  static final String GROUP_EXIST_CACHE = "ldap_group_existence";
+  static final String PARENT_GROUPS_CACHE = "ldap_groups_byinclude";
+
+  @Override
+  protected void configure() {
+    cache(GROUP_CACHE, String.class, new TypeLiteral<Set<AccountGroup.UUID>>() {})
+        .expireAfterWrite(Duration.ofHours(1))
+        .loader(LdapRealm.MemberLoader.class);
+
+    cache(USERNAME_CACHE, String.class, new TypeLiteral<Optional<Account.Id>>() {})
+        .loader(LdapRealm.UserLoader.class);
+
+    cache(GROUP_EXIST_CACHE, String.class, new TypeLiteral<Boolean>() {})
+        .expireAfterWrite(Duration.ofHours(1))
+        .loader(LdapRealm.ExistenceLoader.class);
+
+    cache(PARENT_GROUPS_CACHE, String.class, new TypeLiteral<ImmutableSet<String>>() {})
+        .expireAfterWrite(Duration.ofHours(1));
+
+    bind(Helper.class);
+    bind(Realm.class).to(LdapRealm.class).in(Scopes.SINGLETON);
+
+    DynamicSet.bind(binder(), GroupBackend.class).to(LdapGroupBackend.class);
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapQuery.java b/java/com/google/gerrit/server/auth/ldap/LdapQuery.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapQuery.java
rename to java/com/google/gerrit/server/auth/ldap/LdapQuery.java
diff --git a/java/com/google/gerrit/server/auth/ldap/LdapRealm.java b/java/com/google/gerrit/server/auth/ldap/LdapRealm.java
new file mode 100644
index 0000000..ed446f2
--- /dev/null
+++ b/java/com/google/gerrit/server/auth/ldap/LdapRealm.java
@@ -0,0 +1,412 @@
+// Copyright (C) 2009 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.google.gerrit.server.auth.ldap;
+
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_GERRIT;
+
+import com.google.common.base.Strings;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.data.ParameterizedString;
+import com.google.gerrit.extensions.client.AccountFieldName;
+import com.google.gerrit.extensions.client.AuthType;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.account.AbstractRealm;
+import com.google.gerrit.server.account.AccountException;
+import com.google.gerrit.server.account.AuthRequest;
+import com.google.gerrit.server.account.EmailExpander;
+import com.google.gerrit.server.account.GroupBackends;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.account.externalids.ExternalIds;
+import com.google.gerrit.server.auth.AuthenticationUnavailableException;
+import com.google.gerrit.server.auth.NoSuchUserException;
+import com.google.gerrit.server.config.AuthConfig;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.logging.TraceContext;
+import com.google.gerrit.server.logging.TraceContext.TraceTimer;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.google.inject.name.Named;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import javax.naming.CompositeName;
+import javax.naming.Name;
+import javax.naming.NamingException;
+import javax.naming.directory.DirContext;
+import javax.security.auth.login.LoginException;
+import org.eclipse.jgit.lib.Config;
+
+@Singleton
+class LdapRealm extends AbstractRealm {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  static final String LDAP = "com.sun.jndi.ldap.LdapCtxFactory";
+  static final String USERNAME = "username";
+
+  private final Helper helper;
+  private final AuthConfig authConfig;
+  private final EmailExpander emailExpander;
+  private final LoadingCache<String, Optional<Account.Id>> usernameCache;
+  private final Set<AccountFieldName> readOnlyAccountFields;
+  private final boolean fetchMemberOfEagerly;
+  private final String mandatoryGroup;
+  private final LdapGroupBackend groupBackend;
+
+  private final Config config;
+
+  private final LoadingCache<String, Set<AccountGroup.UUID>> membershipCache;
+
+  @Inject
+  LdapRealm(
+      Helper helper,
+      AuthConfig authConfig,
+      EmailExpander emailExpander,
+      LdapGroupBackend groupBackend,
+      @Named(LdapModule.GROUP_CACHE) LoadingCache<String, Set<AccountGroup.UUID>> membershipCache,
+      @Named(LdapModule.USERNAME_CACHE) LoadingCache<String, Optional<Account.Id>> usernameCache,
+      @GerritServerConfig Config config) {
+    this.helper = helper;
+    this.authConfig = authConfig;
+    this.emailExpander = emailExpander;
+    this.groupBackend = groupBackend;
+    this.usernameCache = usernameCache;
+    this.membershipCache = membershipCache;
+    this.config = config;
+
+    this.readOnlyAccountFields = new HashSet<>();
+
+    if (optdef(config, "accountFullName", "DEFAULT") != null) {
+      readOnlyAccountFields.add(AccountFieldName.FULL_NAME);
+    }
+    if (optdef(config, "accountSshUserName", "DEFAULT") != null) {
+      readOnlyAccountFields.add(AccountFieldName.USER_NAME);
+    }
+    if (!authConfig.isAllowRegisterNewEmail()) {
+      readOnlyAccountFields.add(AccountFieldName.REGISTER_NEW_EMAIL);
+    }
+
+    fetchMemberOfEagerly = optional(config, "fetchMemberOfEagerly", true);
+    mandatoryGroup = optional(config, "mandatoryGroup");
+  }
+
+  static SearchScope scope(Config c, String setting) {
+    return c.getEnum("ldap", null, setting, SearchScope.SUBTREE);
+  }
+
+  static String optional(Config config, String name) {
+    return config.getString("ldap", null, name);
+  }
+
+  static int optional(Config config, String name, int defaultValue) {
+    return config.getInt("ldap", name, defaultValue);
+  }
+
+  static String optional(Config config, String name, String defaultValue) {
+    final String v = optional(config, name);
+    if (Strings.isNullOrEmpty(v)) {
+      return defaultValue;
+    }
+    return v;
+  }
+
+  static boolean optional(Config config, String name, boolean defaultValue) {
+    return config.getBoolean("ldap", name, defaultValue);
+  }
+
+  static String required(Config config, String name) {
+    final String v = optional(config, name);
+    if (v == null || "".equals(v)) {
+      throw new IllegalArgumentException("No ldap." + name + " configured");
+    }
+    return v;
+  }
+
+  static List<String> optionalList(Config config, String name) {
+    String[] s = config.getStringList("ldap", null, name);
+    return Arrays.asList(s);
+  }
+
+  static List<String> requiredList(Config config, String name) {
+    List<String> vlist = optionalList(config, name);
+
+    if (vlist.isEmpty()) {
+      throw new IllegalArgumentException("No ldap " + name + " configured");
+    }
+
+    return vlist;
+  }
+
+  static String optdef(Config c, String n, String d) {
+    final String[] v = c.getStringList("ldap", null, n);
+    if (v == null || v.length == 0) {
+      return d;
+
+    } else if (v[0] == null || "".equals(v[0])) {
+      return null;
+
+    } else {
+      checkBackendCompliance(n, v[0], Strings.isNullOrEmpty(d));
+      return v[0];
+    }
+  }
+
+  static String reqdef(Config c, String n, String d) {
+    final String v = optdef(c, n, d);
+    if (v == null) {
+      throw new IllegalArgumentException("No ldap." + n + " configured");
+    }
+    return v;
+  }
+
+  static ParameterizedString paramString(Config c, String n, String d) {
+    String expression = optdef(c, n, d);
+    if (expression == null) {
+      return null;
+    } else if (expression.contains("${")) {
+      return new ParameterizedString(expression);
+    } else {
+      return new ParameterizedString("${" + expression + "}");
+    }
+  }
+
+  private static void checkBackendCompliance(
+      String configOption, String suppliedValue, boolean disabledByBackend) {
+    if (disabledByBackend && !Strings.isNullOrEmpty(suppliedValue)) {
+      String msg = String.format("LDAP backend doesn't support: ldap.%s", configOption);
+      logger.atSevere().log(msg);
+      throw new IllegalArgumentException(msg);
+    }
+  }
+
+  @Override
+  public boolean allowsEdit(AccountFieldName field) {
+    return !readOnlyAccountFields.contains(field);
+  }
+
+  static String apply(ParameterizedString p, LdapQuery.Result m) throws NamingException {
+    if (p == null) {
+      return null;
+    }
+
+    final Map<String, String> values = new HashMap<>();
+    for (String name : m.attributes()) {
+      values.put(name, m.get(name));
+    }
+
+    String r = p.replace(values);
+    return r.isEmpty() ? null : r;
+  }
+
+  @Override
+  public AuthRequest authenticate(AuthRequest who) throws AccountException {
+    if (config.getBoolean("ldap", "localUsernameToLowerCase", false)) {
+      who.setLocalUser(who.getLocalUser().toLowerCase(Locale.US));
+    }
+
+    final String username = who.getLocalUser();
+    try {
+      final DirContext ctx;
+      if (authConfig.getAuthType() == AuthType.LDAP_BIND) {
+        ctx = helper.authenticate(username, who.getPassword());
+      } else {
+        ctx = helper.open();
+      }
+      try {
+        final Helper.LdapSchema schema = helper.getSchema(ctx);
+        LdapQuery.Result m;
+        who.setAuthProvidesAccountActiveStatus(true);
+        m = helper.findAccount(schema, ctx, username, fetchMemberOfEagerly);
+        who.setActive(true);
+
+        if (authConfig.getAuthType() == AuthType.LDAP && !who.isSkipAuthentication()) {
+          // We found the user account, but we need to verify
+          // the password matches it before we can continue.
+          //
+          helper.close(helper.authenticate(m.getDN(), who.getPassword()));
+        }
+
+        who.setDisplayName(apply(schema.accountFullName, m));
+        who.setUserName(apply(schema.accountSshUserName, m));
+
+        if (schema.accountEmailAddress != null) {
+          who.setEmailAddress(apply(schema.accountEmailAddress, m));
+
+        } else if (emailExpander.canExpand(username)) {
+          // If LDAP cannot give us a valid email address for this user
+          // try expanding it through the older email expander code which
+          // assumes a user name within a domain.
+          //
+          who.setEmailAddress(emailExpander.expand(username));
+        }
+
+        // Fill the cache with the user's current groups. We've already
+        // spent the cost to open the LDAP connection, we might as well
+        // do one more call to get their group membership. Since we are
+        // in the middle of authenticating the user, its likely we will
+        // need to know what access rights they have soon.
+        //
+        if (fetchMemberOfEagerly || mandatoryGroup != null) {
+          Set<AccountGroup.UUID> groups = helper.queryForGroups(ctx, username, m);
+          if (mandatoryGroup != null) {
+            GroupReference mandatoryGroupRef =
+                GroupBackends.findExactSuggestion(groupBackend, mandatoryGroup);
+            if (mandatoryGroupRef == null) {
+              throw new AccountException("Could not identify mandatory group: " + mandatoryGroup);
+            }
+            if (!groups.contains(mandatoryGroupRef.getUUID())) {
+              throw new AccountException(
+                  "Not member of mandatory LDAP group: " + mandatoryGroupRef.getName());
+            }
+          }
+          // Regardless if we enabled fetchMemberOfEagerly, we already have the
+          // groups and it would be a waste not to cache them.
+          membershipCache.put(username, groups);
+        }
+        return who;
+      } finally {
+        helper.close(ctx);
+      }
+    } catch (IOException | NamingException e) {
+      logger.atSevere().withCause(e).log("Cannot query LDAP to authenticate user");
+      throw new AuthenticationUnavailableException("Cannot query LDAP for account", e);
+    } catch (LoginException e) {
+      logger.atSevere().withCause(e).log("Cannot authenticate server via JAAS");
+      throw new AuthenticationUnavailableException("Cannot query LDAP for account", e);
+    }
+  }
+
+  @Override
+  public void onCreateAccount(AuthRequest who, Account account) {
+    usernameCache.put(who.getLocalUser(), Optional.of(account.getId()));
+  }
+
+  @Override
+  public Account.Id lookup(String accountName) {
+    if (Strings.isNullOrEmpty(accountName)) {
+      return null;
+    }
+    try {
+      Optional<Account.Id> id = usernameCache.get(accountName);
+      return id != null ? id.orElse(null) : null;
+    } catch (ExecutionException e) {
+      logger.atWarning().withCause(e).log("Cannot lookup account %s in LDAP", accountName);
+      return null;
+    }
+  }
+
+  @Override
+  public boolean isActive(String username)
+      throws LoginException, NamingException, AccountException, IOException {
+    final DirContext ctx = helper.open();
+    try {
+      Helper.LdapSchema schema = helper.getSchema(ctx);
+      helper.findAccount(schema, ctx, username, false);
+      return true;
+    } catch (NoSuchUserException e) {
+      return false;
+    } finally {
+      helper.close(ctx);
+    }
+  }
+
+  @Override
+  public boolean accountBelongsToRealm(Collection<ExternalId> externalIds) {
+    for (ExternalId id : externalIds) {
+      if (id.toString().contains(SCHEME_GERRIT)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  static class UserLoader extends CacheLoader<String, Optional<Account.Id>> {
+    private final ExternalIds externalIds;
+
+    @Inject
+    UserLoader(ExternalIds externalIds) {
+      this.externalIds = externalIds;
+    }
+
+    @Override
+    public Optional<Account.Id> load(String username) throws Exception {
+      try (TraceTimer timer = TraceContext.newTimer("Loading account for username %s", username)) {
+        return externalIds
+            .get(ExternalId.Key.create(SCHEME_GERRIT, username))
+            .map(ExternalId::accountId);
+      }
+    }
+  }
+
+  static class MemberLoader extends CacheLoader<String, Set<AccountGroup.UUID>> {
+    private final Helper helper;
+
+    @Inject
+    MemberLoader(Helper helper) {
+      this.helper = helper;
+    }
+
+    @Override
+    public Set<AccountGroup.UUID> load(String username) throws Exception {
+      try (TraceTimer timer =
+          TraceContext.newTimer("Loading group for member with username %s", username)) {
+        final DirContext ctx = helper.open();
+        try {
+          return helper.queryForGroups(ctx, username, null);
+        } finally {
+          helper.close(ctx);
+        }
+      }
+    }
+  }
+
+  static class ExistenceLoader extends CacheLoader<String, Boolean> {
+    private final Helper helper;
+
+    @Inject
+    ExistenceLoader(Helper helper) {
+      this.helper = helper;
+    }
+
+    @Override
+    public Boolean load(String groupDn) throws Exception {
+      try (TraceTimer timer = TraceContext.newTimer("Loading groupDn %s", groupDn)) {
+        final DirContext ctx = helper.open();
+        try {
+          Name compositeGroupName = new CompositeName().add(groupDn);
+          try {
+            ctx.getAttributes(compositeGroupName);
+            return true;
+          } catch (NamingException e) {
+            return false;
+          }
+        } finally {
+          helper.close(ctx);
+        }
+      }
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapType.java b/java/com/google/gerrit/server/auth/ldap/LdapType.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapType.java
rename to java/com/google/gerrit/server/auth/ldap/LdapType.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/SearchScope.java b/java/com/google/gerrit/server/auth/ldap/SearchScope.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/SearchScope.java
rename to java/com/google/gerrit/server/auth/ldap/SearchScope.java
diff --git a/java/com/google/gerrit/server/auth/oauth/OAuthRealm.java b/java/com/google/gerrit/server/auth/oauth/OAuthRealm.java
new file mode 100644
index 0000000..54d50f0
--- /dev/null
+++ b/java/com/google/gerrit/server/auth/oauth/OAuthRealm.java
@@ -0,0 +1,131 @@
+// Copyright (C) 2015 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.google.gerrit.server.auth.oauth;
+
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_EXTERNAL;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.auth.oauth.OAuthLoginProvider;
+import com.google.gerrit.extensions.auth.oauth.OAuthUserInfo;
+import com.google.gerrit.extensions.client.AccountFieldName;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.account.AbstractRealm;
+import com.google.gerrit.server.account.AccountException;
+import com.google.gerrit.server.account.AccountManager;
+import com.google.gerrit.server.account.AuthRequest;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.jgit.lib.Config;
+
+@Singleton
+public class OAuthRealm extends AbstractRealm {
+  private final DynamicMap<OAuthLoginProvider> loginProviders;
+  private final Set<AccountFieldName> editableAccountFields;
+
+  @Inject
+  OAuthRealm(DynamicMap<OAuthLoginProvider> loginProviders, @GerritServerConfig Config config) {
+    this.loginProviders = loginProviders;
+    this.editableAccountFields = new HashSet<>();
+    // User name should be always editable, because not all OAuth providers
+    // expose them
+    editableAccountFields.add(AccountFieldName.USER_NAME);
+    if (config.getBoolean("oauth", null, "allowEditFullName", false)) {
+      editableAccountFields.add(AccountFieldName.FULL_NAME);
+    }
+    if (config.getBoolean("oauth", null, "allowRegisterNewEmail", false)) {
+      editableAccountFields.add(AccountFieldName.REGISTER_NEW_EMAIL);
+    }
+  }
+
+  @Override
+  public boolean allowsEdit(AccountFieldName field) {
+    return editableAccountFields.contains(field);
+  }
+
+  /**
+   * Authenticates with the {@link OAuthLoginProvider} specified in the authentication request.
+   *
+   * <p>{@link AccountManager} calls this method without password if authenticity of the user has
+   * already been established. In that case we can skip the authentication request to the {@code
+   * OAuthLoginService}.
+   *
+   * @param who the authentication request.
+   * @return the authentication request with resolved email address and display name in case the
+   *     authenticity of the user could be established; otherwise {@code who} is returned unchanged.
+   * @throws AccountException if the authentication request with the OAuth2 server failed or no
+   *     {@code OAuthLoginProvider} was available to handle the request.
+   */
+  @Override
+  public AuthRequest authenticate(AuthRequest who) throws AccountException {
+    if (Strings.isNullOrEmpty(who.getPassword())) {
+      return who;
+    }
+
+    if (Strings.isNullOrEmpty(who.getAuthPlugin())
+        || Strings.isNullOrEmpty(who.getAuthProvider())) {
+      throw new AccountException("Cannot authenticate");
+    }
+    OAuthLoginProvider loginProvider =
+        loginProviders.get(who.getAuthPlugin(), who.getAuthProvider());
+    if (loginProvider == null) {
+      throw new AccountException("Cannot authenticate");
+    }
+
+    OAuthUserInfo userInfo;
+    try {
+      userInfo = loginProvider.login(who.getUserName().orElse(null), who.getPassword());
+    } catch (IOException e) {
+      throw new AccountException("Cannot authenticate", e);
+    }
+    if (userInfo == null) {
+      throw new AccountException("Cannot authenticate");
+    }
+    if (!Strings.isNullOrEmpty(userInfo.getEmailAddress())
+        && (!who.getUserName().isPresent() || !allowsEdit(AccountFieldName.REGISTER_NEW_EMAIL))) {
+      who.setEmailAddress(userInfo.getEmailAddress());
+    }
+    if (!Strings.isNullOrEmpty(userInfo.getDisplayName())
+        && (Strings.isNullOrEmpty(who.getDisplayName())
+            || !allowsEdit(AccountFieldName.FULL_NAME))) {
+      who.setDisplayName(userInfo.getDisplayName());
+    }
+    return who;
+  }
+
+  @Override
+  public void onCreateAccount(AuthRequest who, Account account) {}
+
+  @Override
+  public Account.Id lookup(String accountName) {
+    return null;
+  }
+
+  @Override
+  public boolean accountBelongsToRealm(Collection<ExternalId> externalIds) {
+    for (ExternalId id : externalIds) {
+      if (id.toString().contains(SCHEME_EXTERNAL)) {
+        return true;
+      }
+    }
+    return false;
+  }
+}
diff --git a/java/com/google/gerrit/server/auth/oauth/OAuthTokenCache.java b/java/com/google/gerrit/server/auth/oauth/OAuthTokenCache.java
new file mode 100644
index 0000000..3a6be0c
--- /dev/null
+++ b/java/com/google/gerrit/server/auth/oauth/OAuthTokenCache.java
@@ -0,0 +1,128 @@
+// 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.
+
+package com.google.gerrit.server.auth.oauth;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Strings;
+import com.google.common.cache.Cache;
+import com.google.gerrit.extensions.auth.oauth.OAuthToken;
+import com.google.gerrit.extensions.auth.oauth.OAuthTokenEncrypter;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.cache.CacheModule;
+import com.google.gerrit.server.cache.proto.Cache.OAuthTokenProto;
+import com.google.gerrit.server.cache.serialize.CacheSerializer;
+import com.google.gerrit.server.cache.serialize.IntKeyCacheSerializer;
+import com.google.gerrit.server.cache.serialize.ProtoCacheSerializers;
+import com.google.inject.Inject;
+import com.google.inject.Module;
+import com.google.inject.Singleton;
+import com.google.inject.name.Named;
+
+@Singleton
+public class OAuthTokenCache {
+  public static final String OAUTH_TOKENS = "oauth_tokens";
+
+  private final DynamicItem<OAuthTokenEncrypter> encrypter;
+
+  public static Module module() {
+    return new CacheModule() {
+      @Override
+      protected void configure() {
+        persist(OAUTH_TOKENS, Account.Id.class, OAuthToken.class)
+            .version(1)
+            .keySerializer(new IntKeyCacheSerializer<>(Account.Id::new))
+            .valueSerializer(new Serializer());
+      }
+    };
+  }
+
+  // Defined outside of OAuthToken class, since that is in the extensions package which doesn't have
+  // access to the serializer code.
+  @VisibleForTesting
+  static class Serializer implements CacheSerializer<OAuthToken> {
+    @Override
+    public byte[] serialize(OAuthToken object) {
+      return ProtoCacheSerializers.toByteArray(
+          OAuthTokenProto.newBuilder()
+              .setToken(object.getToken())
+              .setSecret(object.getSecret())
+              .setRaw(object.getRaw())
+              .setExpiresAt(object.getExpiresAt())
+              .setProviderId(Strings.nullToEmpty(object.getProviderId()))
+              .build());
+    }
+
+    @Override
+    public OAuthToken deserialize(byte[] in) {
+      OAuthTokenProto proto = ProtoCacheSerializers.parseUnchecked(OAuthTokenProto.parser(), in);
+      return new OAuthToken(
+          proto.getToken(),
+          proto.getSecret(),
+          proto.getRaw(),
+          proto.getExpiresAt(),
+          Strings.emptyToNull(proto.getProviderId()));
+    }
+  }
+
+  private final Cache<Account.Id, OAuthToken> cache;
+
+  @Inject
+  OAuthTokenCache(
+      @Named(OAUTH_TOKENS) Cache<Account.Id, OAuthToken> cache,
+      DynamicItem<OAuthTokenEncrypter> encrypter) {
+    this.cache = cache;
+    this.encrypter = encrypter;
+  }
+
+  public OAuthToken get(Account.Id id) {
+    OAuthToken accessToken = cache.getIfPresent(id);
+    if (accessToken == null) {
+      return null;
+    }
+    accessToken = decrypt(accessToken);
+    if (accessToken.isExpired()) {
+      cache.invalidate(id);
+      return null;
+    }
+    return accessToken;
+  }
+
+  public void put(Account.Id id, OAuthToken accessToken) {
+    cache.put(id, encrypt(requireNonNull(accessToken)));
+  }
+
+  public void remove(Account.Id id) {
+    cache.invalidate(id);
+  }
+
+  private OAuthToken encrypt(OAuthToken token) {
+    OAuthTokenEncrypter enc = encrypter.get();
+    if (enc == null) {
+      return token;
+    }
+    return enc.encrypt(token);
+  }
+
+  private OAuthToken decrypt(OAuthToken token) {
+    OAuthTokenEncrypter enc = encrypter.get();
+    if (enc == null) {
+      return token;
+    }
+    return enc.decrypt(token);
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/openid/OpenIdProviderPattern.java b/java/com/google/gerrit/server/auth/openid/OpenIdProviderPattern.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/auth/openid/OpenIdProviderPattern.java
rename to java/com/google/gerrit/server/auth/openid/OpenIdProviderPattern.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/avatar/AvatarProvider.java b/java/com/google/gerrit/server/avatar/AvatarProvider.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/avatar/AvatarProvider.java
rename to java/com/google/gerrit/server/avatar/AvatarProvider.java
diff --git a/java/com/google/gerrit/server/cache/CacheBinding.java b/java/com/google/gerrit/server/cache/CacheBinding.java
new file mode 100644
index 0000000..9d90d073
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/CacheBinding.java
@@ -0,0 +1,44 @@
+// Copyright (C) 2009 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.google.gerrit.server.cache;
+
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.Weigher;
+import java.time.Duration;
+
+/** Configure a cache declared within a {@link CacheModule} instance. */
+public interface CacheBinding<K, V> {
+  /** Set the total size of the cache. */
+  CacheBinding<K, V> maximumWeight(long weight);
+
+  /** Set the time an element lives after last write before being expired. */
+  CacheBinding<K, V> expireAfterWrite(Duration duration);
+
+  /** Set the time an element lives after last access before being expired. */
+  CacheBinding<K, V> expireFromMemoryAfterAccess(Duration duration);
+
+  /** Populate the cache with items from the CacheLoader. */
+  CacheBinding<K, V> loader(Class<? extends CacheLoader<K, V>> clazz);
+
+  /** Algorithm to weigh an object with a method other than the unit weight 1. */
+  CacheBinding<K, V> weigher(Class<? extends Weigher<K, V>> clazz);
+
+  /**
+   * Set the config name to something other than the cache name.
+   *
+   * @see CacheDef#configKey()
+   */
+  CacheBinding<K, V> configKey(String configKey);
+}
diff --git a/java/com/google/gerrit/server/cache/CacheDef.java b/java/com/google/gerrit/server/cache/CacheDef.java
new file mode 100644
index 0000000..d0c633e
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/CacheDef.java
@@ -0,0 +1,58 @@
+// 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.
+
+package com.google.gerrit.server.cache;
+
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.Weigher;
+import com.google.gerrit.common.Nullable;
+import com.google.inject.TypeLiteral;
+import java.time.Duration;
+
+public interface CacheDef<K, V> {
+  /**
+   * Unique name for this cache.
+   *
+   * <p>The name can be used in a binding annotation {@code @Named(name)} to inject the cache
+   * configured with this binding.
+   */
+  String name();
+
+  /**
+   * Key to use when looking up configuration for this cache.
+   *
+   * <p>Typically, this will match the result of {@link #name()}, so that configuration is keyed by
+   * the actual cache name. However, it may be changed, for example to reuse the size limits of some
+   * other cache.
+   */
+  String configKey();
+
+  TypeLiteral<K> keyType();
+
+  TypeLiteral<V> valueType();
+
+  long maximumWeight();
+
+  @Nullable
+  Duration expireAfterWrite();
+
+  @Nullable
+  Duration expireFromMemoryAfterAccess();
+
+  @Nullable
+  Weigher<K, V> weigher();
+
+  @Nullable
+  CacheLoader<K, V> loader();
+}
diff --git a/java/com/google/gerrit/server/cache/CacheMetrics.java b/java/com/google/gerrit/server/cache/CacheMetrics.java
new file mode 100644
index 0000000..c652d50
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/CacheMetrics.java
@@ -0,0 +1,105 @@
+// Copyright (C) 2015 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.google.gerrit.server.cache;
+
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheStats;
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.registration.Extension;
+import com.google.gerrit.extensions.registration.PluginName;
+import com.google.gerrit.metrics.CallbackMetric;
+import com.google.gerrit.metrics.CallbackMetric1;
+import com.google.gerrit.metrics.Description;
+import com.google.gerrit.metrics.Field;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.Set;
+
+@Singleton
+public class CacheMetrics {
+  @Inject
+  public CacheMetrics(MetricMaker metrics, DynamicMap<Cache<?, ?>> cacheMap) {
+    Field<String> F_NAME = Field.ofString("cache_name");
+
+    CallbackMetric1<String, Long> memEnt =
+        metrics.newCallbackMetric(
+            "caches/memory_cached",
+            Long.class,
+            new Description("Memory entries").setGauge().setUnit("entries"),
+            F_NAME);
+    CallbackMetric1<String, Double> memHit =
+        metrics.newCallbackMetric(
+            "caches/memory_hit_ratio",
+            Double.class,
+            new Description("Memory hit ratio").setGauge().setUnit("percent"),
+            F_NAME);
+    CallbackMetric1<String, Long> memEvict =
+        metrics.newCallbackMetric(
+            "caches/memory_eviction_count",
+            Long.class,
+            new Description("Memory eviction count").setGauge().setUnit("evicted entries"),
+            F_NAME);
+    CallbackMetric1<String, Long> perDiskEnt =
+        metrics.newCallbackMetric(
+            "caches/disk_cached",
+            Long.class,
+            new Description("Disk entries used by persistent cache").setGauge().setUnit("entries"),
+            F_NAME);
+    CallbackMetric1<String, Double> perDiskHit =
+        metrics.newCallbackMetric(
+            "caches/disk_hit_ratio",
+            Double.class,
+            new Description("Disk hit ratio for persistent cache").setGauge().setUnit("percent"),
+            F_NAME);
+
+    Set<CallbackMetric<?>> cacheMetrics =
+        ImmutableSet.<CallbackMetric<?>>of(memEnt, memHit, memEvict, perDiskEnt, perDiskHit);
+
+    metrics.newTrigger(
+        cacheMetrics,
+        () -> {
+          for (Extension<Cache<?, ?>> e : cacheMap) {
+            Cache<?, ?> c = e.getProvider().get();
+            String name = metricNameOf(e);
+            CacheStats cstats = c.stats();
+            memEnt.set(name, c.size());
+            memHit.set(name, cstats.hitRate() * 100);
+            memEvict.set(name, cstats.evictionCount());
+            if (c instanceof PersistentCache) {
+              PersistentCache.DiskStats d = ((PersistentCache) c).diskStats();
+              perDiskEnt.set(name, d.size());
+              perDiskHit.set(name, hitRatio(d));
+            }
+          }
+          cacheMetrics.forEach(CallbackMetric::prune);
+        });
+  }
+
+  private static double hitRatio(PersistentCache.DiskStats d) {
+    if (d.requestCount() <= 0) {
+      return 100;
+    }
+    return ((double) d.hitCount() / d.requestCount() * 100);
+  }
+
+  private static String metricNameOf(Extension<Cache<?, ?>> e) {
+    if (PluginName.GERRIT.equals(e.getPluginName())) {
+      return e.getExportName();
+    }
+    return String.format("plugin/%s/%s", e.getPluginName(), e.getExportName());
+  }
+}
diff --git a/java/com/google/gerrit/server/cache/CacheModule.java b/java/com/google/gerrit/server/cache/CacheModule.java
new file mode 100644
index 0000000..2878624
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/CacheModule.java
@@ -0,0 +1,184 @@
+// Copyright (C) 2009 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.google.gerrit.server.cache;
+
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.common.cache.Weigher;
+import com.google.gerrit.extensions.annotations.Exports;
+import com.google.gerrit.extensions.config.FactoryModule;
+import com.google.gerrit.server.cache.serialize.JavaCacheSerializer;
+import com.google.inject.Key;
+import com.google.inject.Provider;
+import com.google.inject.Scopes;
+import com.google.inject.TypeLiteral;
+import com.google.inject.name.Named;
+import com.google.inject.name.Names;
+import com.google.inject.util.Types;
+import java.lang.reflect.Type;
+
+/** Miniature DSL to support binding {@link Cache} instances in Guice. */
+public abstract class CacheModule extends FactoryModule {
+  public static final String MEMORY_MODULE = "cache-memory";
+  public static final String PERSISTENT_MODULE = "cache-persistent";
+
+  private static final TypeLiteral<Cache<?, ?>> ANY_CACHE = new TypeLiteral<Cache<?, ?>>() {};
+
+  /**
+   * Declare a named in-memory cache.
+   *
+   * @param <K> type of key used to lookup entries.
+   * @param <V> type of value stored by the cache.
+   * @return binding to describe the cache.
+   */
+  protected <K, V> CacheBinding<K, V> cache(String name, Class<K> keyType, Class<V> valType) {
+    return cache(name, TypeLiteral.get(keyType), TypeLiteral.get(valType));
+  }
+
+  /**
+   * Declare a named in-memory cache.
+   *
+   * @param <K> type of key used to lookup entries.
+   * @param <V> type of value stored by the cache.
+   * @return binding to describe the cache.
+   */
+  protected <K, V> CacheBinding<K, V> cache(String name, Class<K> keyType, TypeLiteral<V> valType) {
+    return cache(name, TypeLiteral.get(keyType), valType);
+  }
+
+  /**
+   * Declare a named in-memory cache.
+   *
+   * @param <K> type of key used to lookup entries.
+   * @param <V> type of value stored by the cache.
+   * @return binding to describe the cache.
+   */
+  protected <K, V> CacheBinding<K, V> cache(
+      String name, TypeLiteral<K> keyType, TypeLiteral<V> valType) {
+    CacheProvider<K, V> m = new CacheProvider<>(this, name, keyType, valType);
+    bindCache(m, name, keyType, valType);
+    return m;
+  }
+
+  <K, V> Provider<CacheLoader<K, V>> bindCacheLoader(
+      CacheProvider<K, V> m, Class<? extends CacheLoader<K, V>> impl) {
+    Type type =
+        Types.newParameterizedType(Cache.class, m.keyType().getType(), m.valueType().getType());
+
+    Type loadingType =
+        Types.newParameterizedType(
+            LoadingCache.class, m.keyType().getType(), m.valueType().getType());
+
+    Type loaderType =
+        Types.newParameterizedType(
+            CacheLoader.class, m.keyType().getType(), m.valueType().getType());
+
+    @SuppressWarnings("unchecked")
+    Key<LoadingCache<K, V>> key = (Key<LoadingCache<K, V>>) Key.get(type, Names.named(m.name));
+
+    @SuppressWarnings("unchecked")
+    Key<LoadingCache<K, V>> loadingKey =
+        (Key<LoadingCache<K, V>>) Key.get(loadingType, Names.named(m.name));
+
+    @SuppressWarnings("unchecked")
+    Key<CacheLoader<K, V>> loaderKey =
+        (Key<CacheLoader<K, V>>) Key.get(loaderType, Names.named(m.name));
+
+    bind(loaderKey).to(impl).in(Scopes.SINGLETON);
+    bind(loadingKey).to(key);
+    return getProvider(loaderKey);
+  }
+
+  <K, V> Provider<Weigher<K, V>> bindWeigher(
+      CacheProvider<K, V> m, Class<? extends Weigher<K, V>> impl) {
+    Type weigherType =
+        Types.newParameterizedType(Weigher.class, m.keyType().getType(), m.valueType().getType());
+
+    @SuppressWarnings("unchecked")
+    Key<Weigher<K, V>> key = (Key<Weigher<K, V>>) Key.get(weigherType, Names.named(m.name));
+
+    bind(key).to(impl).in(Scopes.SINGLETON);
+    return getProvider(key);
+  }
+
+  /**
+   * Declare a named in-memory/on-disk cache.
+   *
+   * @param <K> type of key used to lookup entries.
+   * @param <V> type of value stored by the cache.
+   * @return binding to describe the cache.
+   */
+  protected <K, V> PersistentCacheBinding<K, V> persist(
+      String name, Class<K> keyType, Class<V> valType) {
+    return persist(name, TypeLiteral.get(keyType), TypeLiteral.get(valType));
+  }
+
+  /**
+   * Declare a named in-memory/on-disk cache.
+   *
+   * @param <K> type of key used to lookup entries.
+   * @param <V> type of value stored by the cache.
+   * @return binding to describe the cache.
+   */
+  protected <K, V> PersistentCacheBinding<K, V> persist(
+      String name, Class<K> keyType, TypeLiteral<V> valType) {
+    return persist(name, TypeLiteral.get(keyType), valType);
+  }
+
+  /**
+   * Declare a named in-memory/on-disk cache.
+   *
+   * @param <K> type of key used to lookup entries.
+   * @param <V> type of value stored by the cache.
+   * @return binding to describe the cache.
+   */
+  protected <K, V> PersistentCacheBinding<K, V> persist(
+      String name, TypeLiteral<K> keyType, TypeLiteral<V> valType) {
+    PersistentCacheProvider<K, V> m = new PersistentCacheProvider<>(this, name, keyType, valType);
+    bindCache(m, name, keyType, valType);
+
+    Type cacheDefType =
+        Types.newParameterizedType(PersistentCacheDef.class, keyType.getType(), valType.getType());
+    @SuppressWarnings("unchecked")
+    Key<PersistentCacheDef<K, V>> cacheDefKey =
+        (Key<PersistentCacheDef<K, V>>) Key.get(cacheDefType, Names.named(name));
+    bind(cacheDefKey).toInstance(m);
+
+    // TODO(dborowitz): Once default Java serialization is removed, leave no default.
+    return m.version(0)
+        .keySerializer(new JavaCacheSerializer<>())
+        .valueSerializer(new JavaCacheSerializer<>());
+  }
+
+  private <K, V> void bindCache(
+      CacheProvider<K, V> m, String name, TypeLiteral<K> keyType, TypeLiteral<V> valType) {
+    Type type = Types.newParameterizedType(Cache.class, keyType.getType(), valType.getType());
+    Named named = Names.named(name);
+
+    @SuppressWarnings("unchecked")
+    Key<Cache<K, V>> key = (Key<Cache<K, V>>) Key.get(type, named);
+    bind(key).toProvider(m).asEagerSingleton();
+    bind(ANY_CACHE).annotatedWith(Exports.named(name)).to(key);
+
+    Type cacheDefType =
+        Types.newParameterizedType(CacheDef.class, keyType.getType(), valType.getType());
+    @SuppressWarnings("unchecked")
+    Key<CacheDef<K, V>> cacheDefKey = (Key<CacheDef<K, V>>) Key.get(cacheDefType, named);
+    bind(cacheDefKey).toInstance(m);
+
+    m.maximumWeight(1024);
+  }
+}
diff --git a/java/com/google/gerrit/server/cache/CacheProvider.java b/java/com/google/gerrit/server/cache/CacheProvider.java
new file mode 100644
index 0000000..b1a9b91
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/CacheProvider.java
@@ -0,0 +1,172 @@
+// Copyright (C) 2012 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.google.gerrit.server.cache;
+
+import static com.google.common.base.Preconditions.checkState;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.base.Strings;
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.Weigher;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.annotations.PluginName;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.TypeLiteral;
+import java.time.Duration;
+
+class CacheProvider<K, V> implements Provider<Cache<K, V>>, CacheBinding<K, V>, CacheDef<K, V> {
+  private final CacheModule module;
+  final String name;
+  private final TypeLiteral<K> keyType;
+  private final TypeLiteral<V> valType;
+  private String configKey;
+  private long maximumWeight;
+  private Duration expireAfterWrite;
+  private Duration expireFromMemoryAfterAccess;
+  private Provider<CacheLoader<K, V>> loader;
+  private Provider<Weigher<K, V>> weigher;
+
+  private String plugin;
+  private MemoryCacheFactory memoryCacheFactory;
+  private boolean frozen;
+
+  CacheProvider(CacheModule module, String name, TypeLiteral<K> keyType, TypeLiteral<V> valType) {
+    this.module = module;
+    this.name = name;
+    this.keyType = keyType;
+    this.valType = valType;
+  }
+
+  @Inject(optional = true)
+  void setPluginName(@PluginName String pluginName) {
+    this.plugin = pluginName;
+  }
+
+  @Inject
+  void setMemoryCacheFactory(MemoryCacheFactory factory) {
+    this.memoryCacheFactory = factory;
+  }
+
+  @Override
+  public CacheBinding<K, V> maximumWeight(long weight) {
+    checkNotFrozen();
+    maximumWeight = weight;
+    return this;
+  }
+
+  @Override
+  public CacheBinding<K, V> expireAfterWrite(Duration duration) {
+    checkNotFrozen();
+    expireAfterWrite = duration;
+    return this;
+  }
+
+  @Override
+  public CacheBinding<K, V> expireFromMemoryAfterAccess(Duration duration) {
+    checkNotFrozen();
+    expireFromMemoryAfterAccess = duration;
+    return this;
+  }
+
+  @Override
+  public CacheBinding<K, V> loader(Class<? extends CacheLoader<K, V>> impl) {
+    checkNotFrozen();
+    loader = module.bindCacheLoader(this, impl);
+    return this;
+  }
+
+  @Override
+  public CacheBinding<K, V> weigher(Class<? extends Weigher<K, V>> impl) {
+    checkNotFrozen();
+    weigher = module.bindWeigher(this, impl);
+    return this;
+  }
+
+  @Override
+  public CacheBinding<K, V> configKey(String name) {
+    checkNotFrozen();
+    configKey = requireNonNull(name);
+    return this;
+  }
+
+  @Override
+  public String name() {
+    if (!Strings.isNullOrEmpty(plugin)) {
+      return plugin + "." + name;
+    }
+    return name;
+  }
+
+  @Override
+  public String configKey() {
+    return configKey != null ? configKey : name();
+  }
+
+  @Override
+  public TypeLiteral<K> keyType() {
+    return keyType;
+  }
+
+  @Override
+  public TypeLiteral<V> valueType() {
+    return valType;
+  }
+
+  @Override
+  public long maximumWeight() {
+    return maximumWeight;
+  }
+
+  @Override
+  @Nullable
+  public Duration expireAfterWrite() {
+    return expireAfterWrite;
+  }
+
+  @Override
+  @Nullable
+  public Duration expireFromMemoryAfterAccess() {
+    return expireFromMemoryAfterAccess;
+  }
+
+  @Override
+  @Nullable
+  public Weigher<K, V> weigher() {
+    return weigher != null ? weigher.get() : null;
+  }
+
+  @Override
+  @Nullable
+  public CacheLoader<K, V> loader() {
+    return loader != null ? loader.get() : null;
+  }
+
+  @Override
+  public Cache<K, V> get() {
+    freeze();
+    CacheLoader<K, V> ldr = loader();
+    return ldr != null ? memoryCacheFactory.build(this, ldr) : memoryCacheFactory.build(this);
+  }
+
+  protected void checkNotFrozen() {
+    checkState(!frozen, "binding frozen, cannot be modified");
+  }
+
+  protected void freeze() {
+    frozen = true;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheRemovalListener.java b/java/com/google/gerrit/server/cache/CacheRemovalListener.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheRemovalListener.java
rename to java/com/google/gerrit/server/cache/CacheRemovalListener.java
diff --git a/java/com/google/gerrit/server/cache/ForwardingRemovalListener.java b/java/com/google/gerrit/server/cache/ForwardingRemovalListener.java
new file mode 100644
index 0000000..a7fdbbd
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/ForwardingRemovalListener.java
@@ -0,0 +1,63 @@
+// Copyright (C) 2012 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.google.gerrit.server.cache;
+
+import com.google.common.base.Strings;
+import com.google.common.cache.RemovalListener;
+import com.google.common.cache.RemovalNotification;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.registration.PluginName;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+
+/**
+ * This listener dispatches removal events to all other RemovalListeners attached via the DynamicSet
+ * API.
+ *
+ * @param <K>
+ * @param <V>
+ */
+@SuppressWarnings("rawtypes")
+public class ForwardingRemovalListener<K, V> implements RemovalListener<K, V> {
+  public interface Factory {
+    ForwardingRemovalListener create(String cacheName);
+  }
+
+  private final DynamicSet<CacheRemovalListener> listeners;
+  private final String cacheName;
+  private String pluginName = PluginName.GERRIT;
+
+  @Inject
+  ForwardingRemovalListener(
+      DynamicSet<CacheRemovalListener> listeners, @Assisted String cacheName) {
+    this.listeners = listeners;
+    this.cacheName = cacheName;
+  }
+
+  @Inject(optional = true)
+  void setPluginName(String name) {
+    if (!Strings.isNullOrEmpty(name)) {
+      this.pluginName = name;
+    }
+  }
+
+  @Override
+  @SuppressWarnings("unchecked")
+  public void onRemoval(RemovalNotification<K, V> notification) {
+    for (CacheRemovalListener<K, V> l : listeners) {
+      l.onRemoval(pluginName, cacheName, notification);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/cache/MemoryCacheFactory.java b/java/com/google/gerrit/server/cache/MemoryCacheFactory.java
new file mode 100644
index 0000000..fc55753
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/MemoryCacheFactory.java
@@ -0,0 +1,25 @@
+// Copyright (C) 2012 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.google.gerrit.server.cache;
+
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+
+public interface MemoryCacheFactory {
+  <K, V> Cache<K, V> build(CacheDef<K, V> def);
+
+  <K, V> LoadingCache<K, V> build(CacheDef<K, V> def, CacheLoader<K, V> loader);
+}
diff --git a/java/com/google/gerrit/server/cache/PerThreadCache.java b/java/com/google/gerrit/server/cache/PerThreadCache.java
new file mode 100644
index 0000000..b4f79d1
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/PerThreadCache.java
@@ -0,0 +1,146 @@
+// 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.
+
+package com.google.gerrit.server.cache;
+
+import static com.google.common.base.Preconditions.checkState;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Maps;
+import com.google.gerrit.common.Nullable;
+import java.util.Map;
+import java.util.function.Supplier;
+
+/**
+ * Caches object instances for a request as {@link ThreadLocal} in the serving thread.
+ *
+ * <p>This class is intended to cache objects that have a high instantiation cost, are specific to
+ * the current request and potentially need to be instantiated multiple times while serving a
+ * request.
+ *
+ * <p>This is different from the key-value storage in {@code CurrentUser}: {@code CurrentUser}
+ * offers a key-value storage by providing thread-safe {@code get} and {@code put} methods. Once the
+ * value is retrieved through {@code get} there is not thread-safety anymore - apart from the
+ * retrieved object guarantees. Depending on the implementation of {@code CurrentUser}, it might be
+ * shared between the request serving thread as well as sub- or background treads.
+ *
+ * <p>In comparison to that, this class guarantees thread safety even on non-thread-safe objects as
+ * its cache is tied to the serving thread only. While allowing to cache non-thread-safe objects, it
+ * has the downside of not sharing any objects with background threads or executors.
+ *
+ * <p>Lastly, this class offers a cache, that requires callers to also provide a {@code Supplier} in
+ * case the object is not present in the cache, while {@code CurrentUser} provides a storage where
+ * just retrieving stored values is a valid operation.
+ *
+ * <p>To prevent OOM errors on requests that would cache a lot of objects, this class enforces an
+ * internal limit after which no new elements are cached. All {@code get} calls are served by
+ * invoking the {@code Supplier} after that.
+ */
+public class PerThreadCache implements AutoCloseable {
+  private static final ThreadLocal<PerThreadCache> CACHE = new ThreadLocal<>();
+  /**
+   * Cache at maximum 25 values per thread. This value was chosen arbitrarily. Some endpoints (like
+   * ListProjects) break the assumption that the data cached in a request is limited. To prevent
+   * this class from accumulating an unbound number of objects, we enforce this limit.
+   */
+  private static final int PER_THREAD_CACHE_SIZE = 25;
+
+  /**
+   * Unique key for key-value mappings stored in PerThreadCache. The key is based on the value's
+   * class and a list of identifiers that in combination uniquely set the object apart form others
+   * of the same class.
+   */
+  public static final class Key<T> {
+    private final Class<T> clazz;
+    private final ImmutableList<Object> identifiers;
+
+    /**
+     * Returns a key based on the value's class and an identifier that uniquely identify the value.
+     * The identifier needs to implement {@code equals()} and {@hashCode()}.
+     */
+    public static <T> Key<T> create(Class<T> clazz, Object identifier) {
+      return new Key<>(clazz, ImmutableList.of(identifier));
+    }
+
+    /**
+     * Returns a key based on the value's class and a set of identifiers that uniquely identify the
+     * value. Identifiers need to implement {@code equals()} and {@hashCode()}.
+     */
+    public static <T> Key<T> create(Class<T> clazz, Object... identifiers) {
+      return new Key<>(clazz, ImmutableList.copyOf(identifiers));
+    }
+
+    private Key(Class<T> clazz, ImmutableList<Object> identifiers) {
+      this.clazz = clazz;
+      this.identifiers = identifiers;
+    }
+
+    @Override
+    public int hashCode() {
+      return Objects.hashCode(clazz, identifiers);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+      if (!(o instanceof Key)) {
+        return false;
+      }
+      Key<?> other = (Key<?>) o;
+      return this.clazz == other.clazz && this.identifiers.equals(other.identifiers);
+    }
+  }
+
+  public static PerThreadCache create() {
+    checkState(CACHE.get() == null, "called create() twice on the same request");
+    PerThreadCache cache = new PerThreadCache();
+    CACHE.set(cache);
+    return cache;
+  }
+
+  @Nullable
+  public static PerThreadCache get() {
+    return CACHE.get();
+  }
+
+  public static <T> T getOrCompute(Key<T> key, Supplier<T> loader) {
+    PerThreadCache cache = get();
+    return cache != null ? cache.get(key, loader) : loader.get();
+  }
+
+  private final Map<Key<?>, Object> cache = Maps.newHashMapWithExpectedSize(PER_THREAD_CACHE_SIZE);
+
+  private PerThreadCache() {}
+
+  /**
+   * Returns an instance of {@code T} that was either loaded from the cache or obtained from the
+   * provided {@link Supplier}.
+   */
+  public <T> T get(Key<T> key, Supplier<T> loader) {
+    @SuppressWarnings("unchecked")
+    T value = (T) cache.get(key);
+    if (value == null) {
+      value = loader.get();
+      if (cache.size() < PER_THREAD_CACHE_SIZE) {
+        cache.put(key, value);
+      }
+    }
+    return value;
+  }
+
+  @Override
+  public void close() {
+    CACHE.remove();
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/cache/PersistentCache.java b/java/com/google/gerrit/server/cache/PersistentCache.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/cache/PersistentCache.java
rename to java/com/google/gerrit/server/cache/PersistentCache.java
diff --git a/java/com/google/gerrit/server/cache/PersistentCacheBinding.java b/java/com/google/gerrit/server/cache/PersistentCacheBinding.java
new file mode 100644
index 0000000..5635f44
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/PersistentCacheBinding.java
@@ -0,0 +1,52 @@
+// 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.
+
+package com.google.gerrit.server.cache;
+
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.Weigher;
+import com.google.gerrit.server.cache.serialize.CacheSerializer;
+import java.time.Duration;
+
+/** Configure a persistent cache declared within a {@link CacheModule} instance. */
+public interface PersistentCacheBinding<K, V> extends CacheBinding<K, V> {
+  @Override
+  PersistentCacheBinding<K, V> maximumWeight(long weight);
+
+  @Override
+  PersistentCacheBinding<K, V> expireAfterWrite(Duration duration);
+
+  @Override
+  PersistentCacheBinding<K, V> loader(Class<? extends CacheLoader<K, V>> clazz);
+
+  @Override
+  PersistentCacheBinding<K, V> expireFromMemoryAfterAccess(Duration duration);
+
+  @Override
+  PersistentCacheBinding<K, V> weigher(Class<? extends Weigher<K, V>> clazz);
+
+  PersistentCacheBinding<K, V> version(int version);
+
+  /**
+   * Set the total on-disk limit of the cache.
+   *
+   * <p>If 0 or negative, persistence for the cache is disabled by default, but may still be
+   * overridden in the config.
+   */
+  PersistentCacheBinding<K, V> diskLimit(long limit);
+
+  PersistentCacheBinding<K, V> keySerializer(CacheSerializer<K> keySerializer);
+
+  PersistentCacheBinding<K, V> valueSerializer(CacheSerializer<V> valueSerializer);
+}
diff --git a/java/com/google/gerrit/server/cache/PersistentCacheDef.java b/java/com/google/gerrit/server/cache/PersistentCacheDef.java
new file mode 100644
index 0000000..8de685c
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/PersistentCacheDef.java
@@ -0,0 +1,27 @@
+// 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.
+
+package com.google.gerrit.server.cache;
+
+import com.google.gerrit.server.cache.serialize.CacheSerializer;
+
+public interface PersistentCacheDef<K, V> extends CacheDef<K, V> {
+  long diskLimit();
+
+  int version();
+
+  CacheSerializer<K> keySerializer();
+
+  CacheSerializer<V> valueSerializer();
+}
diff --git a/java/com/google/gerrit/server/cache/PersistentCacheFactory.java b/java/com/google/gerrit/server/cache/PersistentCacheFactory.java
new file mode 100644
index 0000000..27fa9ca
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/PersistentCacheFactory.java
@@ -0,0 +1,27 @@
+// Copyright (C) 2012 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.google.gerrit.server.cache;
+
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+
+public interface PersistentCacheFactory {
+  <K, V> Cache<K, V> build(PersistentCacheDef<K, V> def);
+
+  <K, V> LoadingCache<K, V> build(PersistentCacheDef<K, V> def, CacheLoader<K, V> loader);
+
+  void onStop(String plugin);
+}
diff --git a/java/com/google/gerrit/server/cache/PersistentCacheProvider.java b/java/com/google/gerrit/server/cache/PersistentCacheProvider.java
new file mode 100644
index 0000000..59d66e3
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/PersistentCacheProvider.java
@@ -0,0 +1,148 @@
+// 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.
+
+package com.google.gerrit.server.cache;
+
+import static com.google.common.base.Preconditions.checkState;
+
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.Weigher;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.server.cache.serialize.CacheSerializer;
+import com.google.gerrit.server.cache.serialize.JavaCacheSerializer;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.TypeLiteral;
+import java.io.Serializable;
+import java.time.Duration;
+
+class PersistentCacheProvider<K, V> extends CacheProvider<K, V>
+    implements Provider<Cache<K, V>>, PersistentCacheBinding<K, V>, PersistentCacheDef<K, V> {
+  private int version;
+  private long diskLimit;
+  private CacheSerializer<K> keySerializer;
+  private CacheSerializer<V> valueSerializer;
+
+  private PersistentCacheFactory persistentCacheFactory;
+
+  PersistentCacheProvider(
+      CacheModule module, String name, TypeLiteral<K> keyType, TypeLiteral<V> valType) {
+    super(module, name, keyType, valType);
+    version = -1;
+    diskLimit = 128 << 20;
+  }
+
+  @Inject(optional = true)
+  void setPersistentCacheFactory(@Nullable PersistentCacheFactory factory) {
+    this.persistentCacheFactory = factory;
+  }
+
+  @Override
+  public PersistentCacheBinding<K, V> maximumWeight(long weight) {
+    return (PersistentCacheBinding<K, V>) super.maximumWeight(weight);
+  }
+
+  @Override
+  public PersistentCacheBinding<K, V> expireAfterWrite(Duration duration) {
+    return (PersistentCacheBinding<K, V>) super.expireAfterWrite(duration);
+  }
+
+  @Override
+  public PersistentCacheBinding<K, V> loader(Class<? extends CacheLoader<K, V>> clazz) {
+    return (PersistentCacheBinding<K, V>) super.loader(clazz);
+  }
+
+  @Override
+  public PersistentCacheBinding<K, V> expireFromMemoryAfterAccess(Duration duration) {
+    return (PersistentCacheBinding<K, V>) super.expireFromMemoryAfterAccess(duration);
+  }
+
+  @Override
+  public PersistentCacheBinding<K, V> weigher(Class<? extends Weigher<K, V>> clazz) {
+    return (PersistentCacheBinding<K, V>) super.weigher(clazz);
+  }
+
+  @Override
+  public PersistentCacheBinding<K, V> version(int version) {
+    this.version = version;
+    return this;
+  }
+
+  @Override
+  public PersistentCacheBinding<K, V> keySerializer(CacheSerializer<K> keySerializer) {
+    this.keySerializer = keySerializer;
+    return this;
+  }
+
+  @Override
+  public PersistentCacheBinding<K, V> valueSerializer(CacheSerializer<V> valueSerializer) {
+    this.valueSerializer = valueSerializer;
+    return this;
+  }
+
+  @Override
+  public PersistentCacheBinding<K, V> diskLimit(long limit) {
+    checkNotFrozen();
+    diskLimit = limit;
+    return this;
+  }
+
+  @Override
+  public long diskLimit() {
+    return diskLimit;
+  }
+
+  @Override
+  public int version() {
+    return version;
+  }
+
+  @Override
+  public CacheSerializer<K> keySerializer() {
+    return keySerializer;
+  }
+
+  @Override
+  public CacheSerializer<V> valueSerializer() {
+    return valueSerializer;
+  }
+
+  @Override
+  public Cache<K, V> get() {
+    if (persistentCacheFactory == null) {
+      return super.get();
+    }
+    checkState(version >= 0, "version is required");
+    checkSerializer(keyType(), keySerializer, "key");
+    checkSerializer(valueType(), valueSerializer, "value");
+    freeze();
+    CacheLoader<K, V> ldr = loader();
+    return ldr != null
+        ? persistentCacheFactory.build(this, ldr)
+        : persistentCacheFactory.build(this);
+  }
+
+  private static <T> void checkSerializer(
+      TypeLiteral<T> type, CacheSerializer<T> serializer, String name) {
+    checkState(serializer != null, "%sSerializer is required", name);
+    if (serializer instanceof JavaCacheSerializer) {
+      checkState(
+          Serializable.class.isAssignableFrom(type.getRawType()),
+          "%s type %s must implement Serializable",
+          name,
+          type);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/cache/h2/BUILD b/java/com/google/gerrit/server/cache/h2/BUILD
new file mode 100644
index 0000000..f85b498
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/h2/BUILD
@@ -0,0 +1,20 @@
+java_library(
+    name = "h2",
+    srcs = glob(["**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/common:annotations",
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/lifecycle",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/server/cache/serialize",
+        "//java/com/google/gerrit/server/logging",
+        "//java/com/google/gerrit/server/util/time",
+        "//lib:guava",
+        "//lib:h2",
+        "//lib/flogger:api",
+        "//lib/guice",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+    ],
+)
diff --git a/java/com/google/gerrit/server/cache/h2/H2CacheDefProxy.java b/java/com/google/gerrit/server/cache/h2/H2CacheDefProxy.java
new file mode 100644
index 0000000..48c0a5b
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/h2/H2CacheDefProxy.java
@@ -0,0 +1,113 @@
+// 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.
+
+package com.google.gerrit.server.cache.h2;
+
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.Weigher;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.server.cache.PersistentCacheDef;
+import com.google.gerrit.server.cache.h2.H2CacheImpl.ValueHolder;
+import com.google.gerrit.server.cache.serialize.CacheSerializer;
+import com.google.inject.TypeLiteral;
+import java.time.Duration;
+
+class H2CacheDefProxy<K, V> implements PersistentCacheDef<K, V> {
+  private final PersistentCacheDef<K, V> source;
+
+  H2CacheDefProxy(PersistentCacheDef<K, V> source) {
+    this.source = source;
+  }
+
+  @Override
+  @Nullable
+  public Duration expireAfterWrite() {
+    return source.expireAfterWrite();
+  }
+
+  @Override
+  @Nullable
+  public Duration expireFromMemoryAfterAccess() {
+    return source.expireFromMemoryAfterAccess();
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public Weigher<K, V> weigher() {
+    Weigher<K, V> weigher = source.weigher();
+    if (weigher == null) {
+      return null;
+    }
+
+    // introduce weigher that performs calculations
+    // on value that is being stored not on ValueHolder
+    return (Weigher<K, V>)
+        new Weigher<K, ValueHolder<V>>() {
+          @Override
+          public int weigh(K key, ValueHolder<V> value) {
+            return weigher.weigh(key, value.value);
+          }
+        };
+  }
+
+  @Override
+  public String name() {
+    return source.name();
+  }
+
+  @Override
+  public String configKey() {
+    return source.configKey();
+  }
+
+  @Override
+  public TypeLiteral<K> keyType() {
+    return source.keyType();
+  }
+
+  @Override
+  public TypeLiteral<V> valueType() {
+    return source.valueType();
+  }
+
+  @Override
+  public long maximumWeight() {
+    return source.maximumWeight();
+  }
+
+  @Override
+  public long diskLimit() {
+    return source.diskLimit();
+  }
+
+  @Override
+  public CacheLoader<K, V> loader() {
+    return source.loader();
+  }
+
+  @Override
+  public int version() {
+    return source.version();
+  }
+
+  @Override
+  public CacheSerializer<K> keySerializer() {
+    return source.keySerializer();
+  }
+
+  @Override
+  public CacheSerializer<V> valueSerializer() {
+    return source.valueSerializer();
+  }
+}
diff --git a/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java b/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java
new file mode 100644
index 0000000..af1228d
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java
@@ -0,0 +1,231 @@
+// Copyright (C) 2012 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.google.gerrit.server.cache.h2;
+
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.server.cache.MemoryCacheFactory;
+import com.google.gerrit.server.cache.PersistentCacheDef;
+import com.google.gerrit.server.cache.PersistentCacheFactory;
+import com.google.gerrit.server.cache.h2.H2CacheImpl.SqlStore;
+import com.google.gerrit.server.cache.h2.H2CacheImpl.ValueHolder;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.logging.LoggingContextAwareExecutorService;
+import com.google.gerrit.server.logging.LoggingContextAwareScheduledExecutorService;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.lib.Config;
+
+@Singleton
+class H2CacheFactory implements PersistentCacheFactory, LifecycleListener {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final MemoryCacheFactory memCacheFactory;
+  private final Config config;
+  private final Path cacheDir;
+  private final List<H2CacheImpl<?, ?>> caches;
+  private final DynamicMap<Cache<?, ?>> cacheMap;
+  private final ExecutorService executor;
+  private final ScheduledExecutorService cleanup;
+  private final long h2CacheSize;
+  private final boolean h2AutoServer;
+
+  @Inject
+  H2CacheFactory(
+      MemoryCacheFactory memCacheFactory,
+      @GerritServerConfig Config cfg,
+      SitePaths site,
+      DynamicMap<Cache<?, ?>> cacheMap) {
+    this.memCacheFactory = memCacheFactory;
+    config = cfg;
+    cacheDir = getCacheDir(site, cfg.getString("cache", null, "directory"));
+    h2CacheSize = cfg.getLong("cache", null, "h2CacheSize", -1);
+    h2AutoServer = cfg.getBoolean("cache", null, "h2AutoServer", false);
+    caches = new LinkedList<>();
+    this.cacheMap = cacheMap;
+
+    if (cacheDir != null) {
+      executor =
+          new LoggingContextAwareExecutorService(
+              Executors.newFixedThreadPool(
+                  1, new ThreadFactoryBuilder().setNameFormat("DiskCache-Store-%d").build()));
+      cleanup =
+          new LoggingContextAwareScheduledExecutorService(
+              Executors.newScheduledThreadPool(
+                  1,
+                  new ThreadFactoryBuilder()
+                      .setNameFormat("DiskCache-Prune-%d")
+                      .setDaemon(true)
+                      .build()));
+    } else {
+      executor = null;
+      cleanup = null;
+    }
+  }
+
+  private static Path getCacheDir(SitePaths site, String name) {
+    if (name == null) {
+      return null;
+    }
+    Path loc = site.resolve(name);
+    if (!Files.exists(loc)) {
+      try {
+        Files.createDirectories(loc);
+      } catch (IOException e) {
+        logger.atWarning().log("Can't create disk cache: %s", loc.toAbsolutePath());
+        return null;
+      }
+    }
+    if (!Files.isWritable(loc)) {
+      logger.atWarning().log("Can't write to disk cache: %s", loc.toAbsolutePath());
+      return null;
+    }
+    logger.atInfo().log("Enabling disk cache %s", loc.toAbsolutePath());
+    return loc;
+  }
+
+  @Override
+  public void start() {
+    if (executor != null) {
+      for (H2CacheImpl<?, ?> cache : caches) {
+        executor.execute(cache::start);
+        @SuppressWarnings("unused")
+        Future<?> possiblyIgnoredError =
+            cleanup.schedule(() -> cache.prune(cleanup), 30, TimeUnit.SECONDS);
+      }
+    }
+  }
+
+  @Override
+  public void stop() {
+    if (executor != null) {
+      try {
+        cleanup.shutdownNow();
+
+        List<Runnable> pending = executor.shutdownNow();
+        if (executor.awaitTermination(15, TimeUnit.MINUTES)) {
+          if (pending != null && !pending.isEmpty()) {
+            logger.atInfo().log("Finishing %d disk cache updates", pending.size());
+            for (Runnable update : pending) {
+              update.run();
+            }
+          }
+        } else {
+          logger.atInfo().log("Timeout waiting for disk cache to close");
+        }
+      } catch (InterruptedException e) {
+        logger.atWarning().log("Interrupted waiting for disk cache to shutdown");
+      }
+    }
+    synchronized (caches) {
+      for (H2CacheImpl<?, ?> cache : caches) {
+        cache.stop();
+      }
+    }
+  }
+
+  @SuppressWarnings({"unchecked"})
+  @Override
+  public <K, V> Cache<K, V> build(PersistentCacheDef<K, V> in) {
+    long limit = config.getLong("cache", in.configKey(), "diskLimit", in.diskLimit());
+
+    if (cacheDir == null || limit <= 0) {
+      return memCacheFactory.build(in);
+    }
+
+    H2CacheDefProxy<K, V> def = new H2CacheDefProxy<>(in);
+    SqlStore<K, V> store = newSqlStore(def, limit);
+    H2CacheImpl<K, V> cache =
+        new H2CacheImpl<>(
+            executor, store, def.keyType(), (Cache<K, ValueHolder<V>>) memCacheFactory.build(def));
+    synchronized (caches) {
+      caches.add(cache);
+    }
+    return cache;
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <K, V> LoadingCache<K, V> build(PersistentCacheDef<K, V> in, CacheLoader<K, V> loader) {
+    long limit = config.getLong("cache", in.configKey(), "diskLimit", in.diskLimit());
+
+    if (cacheDir == null || limit <= 0) {
+      return memCacheFactory.build(in, loader);
+    }
+
+    H2CacheDefProxy<K, V> def = new H2CacheDefProxy<>(in);
+    SqlStore<K, V> store = newSqlStore(def, limit);
+    Cache<K, ValueHolder<V>> mem =
+        (Cache<K, ValueHolder<V>>)
+            memCacheFactory.build(
+                def, (CacheLoader<K, V>) new H2CacheImpl.Loader<>(executor, store, loader));
+    H2CacheImpl<K, V> cache = new H2CacheImpl<>(executor, store, def.keyType(), mem);
+    synchronized (caches) {
+      caches.add(cache);
+    }
+    return cache;
+  }
+
+  @Override
+  public void onStop(String plugin) {
+    synchronized (caches) {
+      for (Map.Entry<String, Provider<Cache<?, ?>>> entry : cacheMap.byPlugin(plugin).entrySet()) {
+        Cache<?, ?> cache = entry.getValue().get();
+        if (caches.remove(cache)) {
+          ((H2CacheImpl<?, ?>) cache).stop();
+        }
+      }
+    }
+  }
+
+  private <V, K> SqlStore<K, V> newSqlStore(PersistentCacheDef<K, V> def, long maxSize) {
+    StringBuilder url = new StringBuilder();
+    url.append("jdbc:h2:").append(cacheDir.resolve(def.name()).toUri());
+    if (h2CacheSize >= 0) {
+      url.append(";CACHE_SIZE=");
+      // H2 CACHE_SIZE is always given in KB
+      url.append(h2CacheSize / 1024);
+    }
+    if (h2AutoServer) {
+      url.append(";AUTO_SERVER=TRUE");
+    }
+    return new SqlStore<>(
+        url.toString(),
+        def.keyType(),
+        def.keySerializer(),
+        def.valueSerializer(),
+        def.version(),
+        maxSize,
+        def.expireAfterWrite());
+  }
+}
diff --git a/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java b/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java
new file mode 100644
index 0000000..3732e37
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java
@@ -0,0 +1,681 @@
+// Copyright (C) 2012 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.google.gerrit.server.cache.h2;
+
+import com.google.common.base.Throwables;
+import com.google.common.cache.AbstractLoadingCache;
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.CacheStats;
+import com.google.common.cache.LoadingCache;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.hash.BloomFilter;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.server.cache.PersistentCache;
+import com.google.gerrit.server.cache.serialize.CacheSerializer;
+import com.google.gerrit.server.logging.TraceContext;
+import com.google.gerrit.server.logging.TraceContext.TraceTimer;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.inject.TypeLiteral;
+import java.io.IOException;
+import java.io.InvalidClassException;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.sql.Timestamp;
+import java.time.Duration;
+import java.util.Calendar;
+import java.util.Map;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Future;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * Hybrid in-memory and database backed cache built on H2.
+ *
+ * <p>This cache can be used as either a recall cache, or a loading cache if a CacheLoader was
+ * supplied to its constructor at build time. Before creating an entry the in-memory cache is
+ * checked for the item, then the database is checked, and finally the CacheLoader is used to
+ * construct the item. This is mostly useful for CacheLoaders that are computationally intensive,
+ * such as the PatchListCache.
+ *
+ * <p>Cache stores and invalidations are performed on a background thread, hiding the latency
+ * associated with serializing the key and value pairs and writing them to the database log.
+ *
+ * <p>A BloomFilter is used around the database to reduce the number of SELECTs issued against the
+ * database for new cache items that have not been seen before, a common operation for the
+ * PatchListCache. The BloomFilter is sized when the cache starts to be 64,000 entries or double the
+ * number of items currently in the database table.
+ *
+ * <p>This cache does not export its items as a ConcurrentMap.
+ *
+ * @see H2CacheFactory
+ */
+public class H2CacheImpl<K, V> extends AbstractLoadingCache<K, V> implements PersistentCache {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final ImmutableSet<String> OLD_CLASS_NAMES =
+      ImmutableSet.of("com.google.gerrit.server.change.ChangeKind");
+
+  private final Executor executor;
+  private final SqlStore<K, V> store;
+  private final TypeLiteral<K> keyType;
+  private final Cache<K, ValueHolder<V>> mem;
+
+  H2CacheImpl(
+      Executor executor,
+      SqlStore<K, V> store,
+      TypeLiteral<K> keyType,
+      Cache<K, ValueHolder<V>> mem) {
+    this.executor = executor;
+    this.store = store;
+    this.keyType = keyType;
+    this.mem = mem;
+  }
+
+  @Override
+  public V getIfPresent(Object objKey) {
+    if (!keyType.getRawType().isInstance(objKey)) {
+      return null;
+    }
+
+    @SuppressWarnings("unchecked")
+    K key = (K) objKey;
+
+    ValueHolder<V> h = mem.getIfPresent(key);
+    if (h != null) {
+      return h.value;
+    }
+
+    if (store.mightContain(key)) {
+      h = store.getIfPresent(key);
+      if (h != null) {
+        mem.put(key, h);
+        return h.value;
+      }
+    }
+    return null;
+  }
+
+  @Override
+  public V get(K key) throws ExecutionException {
+    if (mem instanceof LoadingCache) {
+      return ((LoadingCache<K, ValueHolder<V>>) mem).get(key).value;
+    }
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public V get(K key, Callable<? extends V> valueLoader) throws ExecutionException {
+    return mem.get(
+            key,
+            () -> {
+              if (store.mightContain(key)) {
+                ValueHolder<V> h = store.getIfPresent(key);
+                if (h != null) {
+                  return h;
+                }
+              }
+
+              ValueHolder<V> h = new ValueHolder<>(valueLoader.call());
+              h.created = TimeUtil.nowMs();
+              executor.execute(() -> store.put(key, h));
+              return h;
+            })
+        .value;
+  }
+
+  @Override
+  public void put(K key, V val) {
+    final ValueHolder<V> h = new ValueHolder<>(val);
+    h.created = TimeUtil.nowMs();
+    mem.put(key, h);
+    executor.execute(() -> store.put(key, h));
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public void invalidate(Object key) {
+    if (keyType.getRawType().isInstance(key) && store.mightContain((K) key)) {
+      executor.execute(() -> store.invalidate((K) key));
+    }
+    mem.invalidate(key);
+  }
+
+  @Override
+  public void invalidateAll() {
+    store.invalidateAll();
+    mem.invalidateAll();
+  }
+
+  @Override
+  public long size() {
+    return mem.size();
+  }
+
+  @Override
+  public CacheStats stats() {
+    return mem.stats();
+  }
+
+  @Override
+  public DiskStats diskStats() {
+    return store.diskStats();
+  }
+
+  void start() {
+    store.open();
+  }
+
+  void stop() {
+    for (Map.Entry<K, ValueHolder<V>> e : mem.asMap().entrySet()) {
+      ValueHolder<V> h = e.getValue();
+      if (!h.clean) {
+        store.put(e.getKey(), h);
+      }
+    }
+    store.close();
+  }
+
+  void prune(ScheduledExecutorService service) {
+    store.prune(mem);
+
+    Calendar cal = Calendar.getInstance();
+    cal.set(Calendar.HOUR_OF_DAY, 01);
+    cal.set(Calendar.MINUTE, 0);
+    cal.set(Calendar.SECOND, 0);
+    cal.set(Calendar.MILLISECOND, 0);
+    cal.add(Calendar.DAY_OF_MONTH, 1);
+
+    long delay = cal.getTimeInMillis() - TimeUtil.nowMs();
+    @SuppressWarnings("unused")
+    Future<?> possiblyIgnoredError =
+        service.schedule(() -> prune(service), delay, TimeUnit.MILLISECONDS);
+  }
+
+  static class ValueHolder<V> {
+    final V value;
+    long created;
+    volatile boolean clean;
+
+    ValueHolder(V value) {
+      this.value = value;
+    }
+  }
+
+  static class Loader<K, V> extends CacheLoader<K, ValueHolder<V>> {
+    private final Executor executor;
+    private final SqlStore<K, V> store;
+    private final CacheLoader<K, V> loader;
+
+    Loader(Executor executor, SqlStore<K, V> store, CacheLoader<K, V> loader) {
+      this.executor = executor;
+      this.store = store;
+      this.loader = loader;
+    }
+
+    @Override
+    public ValueHolder<V> load(K key) throws Exception {
+      try (TraceTimer timer = TraceContext.newTimer("Loading value for %s from cache", key)) {
+        if (store.mightContain(key)) {
+          ValueHolder<V> h = store.getIfPresent(key);
+          if (h != null) {
+            return h;
+          }
+        }
+
+        final ValueHolder<V> h = new ValueHolder<>(loader.load(key));
+        h.created = TimeUtil.nowMs();
+        executor.execute(() -> store.put(key, h));
+        return h;
+      }
+    }
+  }
+
+  static class SqlStore<K, V> {
+    private final String url;
+    private final KeyType<K> keyType;
+    private final CacheSerializer<V> valueSerializer;
+    private final int version;
+    private final long maxSize;
+    @Nullable private final Duration expireAfterWrite;
+    private final BlockingQueue<SqlHandle> handles;
+    private final AtomicLong hitCount = new AtomicLong();
+    private final AtomicLong missCount = new AtomicLong();
+    private volatile BloomFilter<K> bloomFilter;
+    private int estimatedSize;
+
+    SqlStore(
+        String jdbcUrl,
+        TypeLiteral<K> keyType,
+        CacheSerializer<K> keySerializer,
+        CacheSerializer<V> valueSerializer,
+        int version,
+        long maxSize,
+        @Nullable Duration expireAfterWrite) {
+      this.url = jdbcUrl;
+      this.keyType = createKeyType(keyType, keySerializer);
+      this.valueSerializer = valueSerializer;
+      this.version = version;
+      this.maxSize = maxSize;
+      this.expireAfterWrite = expireAfterWrite;
+
+      int cores = Runtime.getRuntime().availableProcessors();
+      int keep = Math.min(cores, 16);
+      this.handles = new ArrayBlockingQueue<>(keep);
+    }
+
+    @SuppressWarnings("unchecked")
+    private static <T> KeyType<T> createKeyType(
+        TypeLiteral<T> type, CacheSerializer<T> serializer) {
+      if (type.getRawType() == String.class) {
+        return (KeyType<T>) StringKeyTypeImpl.INSTANCE;
+      }
+      return new ObjectKeyTypeImpl<>(serializer);
+    }
+
+    synchronized void open() {
+      if (bloomFilter == null) {
+        bloomFilter = buildBloomFilter();
+      }
+    }
+
+    void close() {
+      SqlHandle h;
+      while ((h = handles.poll()) != null) {
+        h.close();
+      }
+    }
+
+    boolean mightContain(K key) {
+      BloomFilter<K> b = bloomFilter;
+      if (b == null) {
+        synchronized (this) {
+          b = bloomFilter;
+          if (b == null) {
+            b = buildBloomFilter();
+            bloomFilter = b;
+          }
+        }
+      }
+      return b == null || b.mightContain(key);
+    }
+
+    private BloomFilter<K> buildBloomFilter() {
+      SqlHandle c = null;
+      try {
+        c = acquire();
+        if (estimatedSize <= 0) {
+          try (PreparedStatement ps =
+              c.conn.prepareStatement("SELECT COUNT(*) FROM data WHERE version=?")) {
+            ps.setInt(1, version);
+            try (ResultSet r = ps.executeQuery()) {
+              estimatedSize = r.next() ? r.getInt(1) : 0;
+            }
+          }
+        }
+
+        BloomFilter<K> b = newBloomFilter();
+        try (PreparedStatement ps = c.conn.prepareStatement("SELECT k FROM data WHERE version=?")) {
+          ps.setInt(1, version);
+          try (ResultSet r = ps.executeQuery()) {
+            while (r.next()) {
+              b.put(keyType.get(r, 1));
+            }
+          }
+        } catch (Exception e) {
+          if (Throwables.getCausalChain(e).stream()
+              .anyMatch(InvalidClassException.class::isInstance)) {
+            // If deserialization failed using default Java serialization, this means we are using
+            // the old serialVersionUID-based invalidation strategy. In that case, authors are
+            // most likely bumping serialVersionUID rather than using the new versioning in the
+            // CacheBinding.  That's ok; we'll continue to support both for now.
+            // TODO(dborowitz): Remove this case when Java serialization is no longer used.
+            logger.atWarning().log(
+                "Entries cached for %s have an incompatible class and can't be deserialized. "
+                    + "Cache is flushed.",
+                url);
+            invalidateAll();
+          } else {
+            throw e;
+          }
+        }
+        return b;
+      } catch (IOException | SQLException e) {
+        logger.atWarning().log("Cannot build BloomFilter for %s: %s", url, e.getMessage());
+        c = close(c);
+        return null;
+      } finally {
+        release(c);
+      }
+    }
+
+    ValueHolder<V> getIfPresent(K key) {
+      SqlHandle c = null;
+      try {
+        c = acquire();
+        if (c.get == null) {
+          c.get = c.conn.prepareStatement("SELECT v, created FROM data WHERE k=? AND version=?");
+        }
+        keyType.set(c.get, 1, key);
+
+        // Silently no results when the only value in the database is an older version. This will
+        // result in put overwriting the stored value with the new version, which is intended.
+        c.get.setInt(2, version);
+
+        try (ResultSet r = c.get.executeQuery()) {
+          if (!r.next()) {
+            missCount.incrementAndGet();
+            return null;
+          }
+
+          Timestamp created = r.getTimestamp(2);
+          if (expired(created)) {
+            invalidate(key);
+            missCount.incrementAndGet();
+            return null;
+          }
+
+          V val = valueSerializer.deserialize(r.getBytes(1));
+          ValueHolder<V> h = new ValueHolder<>(val);
+          h.clean = true;
+          hitCount.incrementAndGet();
+          touch(c, key);
+          return h;
+        } finally {
+          c.get.clearParameters();
+        }
+      } catch (IOException | SQLException e) {
+        if (!isOldClassNameError(e)) {
+          logger.atWarning().withCause(e).log("Cannot read cache %s for %s", url, key);
+        }
+        c = close(c);
+        return null;
+      } finally {
+        release(c);
+      }
+    }
+
+    private static boolean isOldClassNameError(Throwable t) {
+      for (Throwable c : Throwables.getCausalChain(t)) {
+        if (c instanceof ClassNotFoundException && OLD_CLASS_NAMES.contains(c.getMessage())) {
+          return true;
+        }
+      }
+      return false;
+    }
+
+    private boolean expired(Timestamp created) {
+      if (expireAfterWrite == null) {
+        return false;
+      }
+      Duration age = Duration.between(created.toInstant(), TimeUtil.now());
+      return age.compareTo(expireAfterWrite) > 0;
+    }
+
+    private void touch(SqlHandle c, K key) throws IOException, SQLException {
+      if (c.touch == null) {
+        c.touch = c.conn.prepareStatement("UPDATE data SET accessed=? WHERE k=? AND version=?");
+      }
+      try {
+        c.touch.setTimestamp(1, TimeUtil.nowTs());
+        keyType.set(c.touch, 2, key);
+        c.touch.setInt(3, version);
+        c.touch.executeUpdate();
+      } finally {
+        c.touch.clearParameters();
+      }
+    }
+
+    void put(K key, ValueHolder<V> holder) {
+      if (holder.clean) {
+        return;
+      }
+
+      BloomFilter<K> b = bloomFilter;
+      if (b != null) {
+        b.put(key);
+        bloomFilter = b;
+      }
+
+      SqlHandle c = null;
+      try {
+        c = acquire();
+        if (c.put == null) {
+          c.put =
+              c.conn.prepareStatement(
+                  "MERGE INTO data (k, v, version, created, accessed) VALUES(?,?,?,?,?)");
+        }
+        try {
+          keyType.set(c.put, 1, key);
+          c.put.setBytes(2, valueSerializer.serialize(holder.value));
+          c.put.setInt(3, version);
+          c.put.setTimestamp(4, new Timestamp(holder.created));
+          c.put.setTimestamp(5, TimeUtil.nowTs());
+          c.put.executeUpdate();
+          holder.clean = true;
+        } finally {
+          c.put.clearParameters();
+        }
+      } catch (IOException | SQLException e) {
+        logger.atWarning().withCause(e).log("Cannot put into cache %s", url);
+        c = close(c);
+      } finally {
+        release(c);
+      }
+    }
+
+    void invalidate(K key) {
+      SqlHandle c = null;
+      try {
+        c = acquire();
+        invalidate(c, key);
+      } catch (IOException | SQLException e) {
+        logger.atWarning().withCause(e).log("Cannot invalidate cache %s", url);
+        c = close(c);
+      } finally {
+        release(c);
+      }
+    }
+
+    private void invalidate(SqlHandle c, K key) throws IOException, SQLException {
+      if (c.invalidate == null) {
+        c.invalidate = c.conn.prepareStatement("DELETE FROM data WHERE k=? and version=?");
+      }
+      try {
+        keyType.set(c.invalidate, 1, key);
+        c.invalidate.setInt(2, version);
+        c.invalidate.executeUpdate();
+      } finally {
+        c.invalidate.clearParameters();
+      }
+    }
+
+    void invalidateAll() {
+      SqlHandle c = null;
+      try {
+        c = acquire();
+        try (Statement s = c.conn.createStatement()) {
+          s.executeUpdate("DELETE FROM data");
+        }
+        bloomFilter = newBloomFilter();
+      } catch (SQLException e) {
+        logger.atWarning().withCause(e).log("Cannot invalidate cache %s", url);
+        c = close(c);
+      } finally {
+        release(c);
+      }
+    }
+
+    void prune(Cache<K, ?> mem) {
+      SqlHandle c = null;
+      try {
+        c = acquire();
+        try (PreparedStatement ps = c.conn.prepareStatement("DELETE FROM data WHERE version!=?")) {
+          ps.setInt(1, version);
+          int oldEntries = ps.executeUpdate();
+          if (oldEntries > 0) {
+            logger.atInfo().log(
+                "Pruned %d entries not matching version %d from cache %s",
+                oldEntries, version, url);
+          }
+        }
+        try (Statement s = c.conn.createStatement()) {
+          // Compute size without restricting to version (although obsolete data was just pruned
+          // anyway).
+          long used;
+          try (ResultSet r = s.executeQuery("SELECT SUM(space) FROM data")) {
+            used = r.next() ? r.getLong(1) : 0;
+          }
+          if (used <= maxSize) {
+            return;
+          }
+
+          try (ResultSet r =
+              s.executeQuery("SELECT k, space, created FROM data ORDER BY accessed")) {
+            while (maxSize < used && r.next()) {
+              K key = keyType.get(r, 1);
+              Timestamp created = r.getTimestamp(3);
+              if (mem.getIfPresent(key) != null && !expired(created)) {
+                touch(c, key);
+              } else {
+                invalidate(c, key);
+                used -= r.getLong(2);
+              }
+            }
+          }
+        }
+      } catch (IOException | SQLException e) {
+        logger.atWarning().withCause(e).log("Cannot prune cache %s", url);
+        c = close(c);
+      } finally {
+        release(c);
+      }
+    }
+
+    DiskStats diskStats() {
+      long size = 0;
+      long space = 0;
+      SqlHandle c = null;
+      try {
+        c = acquire();
+        try (Statement s = c.conn.createStatement();
+            // Stats include total size regardless of version.
+            ResultSet r = s.executeQuery("SELECT COUNT(*), SUM(space) FROM data")) {
+          if (r.next()) {
+            size = r.getLong(1);
+            space = r.getLong(2);
+          }
+        }
+      } catch (SQLException e) {
+        logger.atWarning().withCause(e).log("Cannot get DiskStats for %s", url);
+        c = close(c);
+      } finally {
+        release(c);
+      }
+      return new DiskStats(size, space, hitCount.get(), missCount.get());
+    }
+
+    private SqlHandle acquire() throws SQLException {
+      SqlHandle h = handles.poll();
+      return h != null ? h : new SqlHandle(url, keyType);
+    }
+
+    private void release(SqlHandle h) {
+      if (h != null && !handles.offer(h)) {
+        h.close();
+      }
+    }
+
+    private SqlHandle close(SqlHandle h) {
+      if (h != null) {
+        h.close();
+      }
+      return null;
+    }
+
+    private BloomFilter<K> newBloomFilter() {
+      int cnt = Math.max(64 * 1024, 2 * estimatedSize);
+      return BloomFilter.create(keyType.funnel(), cnt);
+    }
+  }
+
+  static class SqlHandle {
+    private final String url;
+    Connection conn;
+    PreparedStatement get;
+    PreparedStatement put;
+    PreparedStatement touch;
+    PreparedStatement invalidate;
+
+    SqlHandle(String url, KeyType<?> type) throws SQLException {
+      this.url = url;
+      this.conn = org.h2.Driver.load().connect(url, null);
+      try (Statement stmt = conn.createStatement()) {
+        stmt.addBatch(
+            "CREATE TABLE IF NOT EXISTS data"
+                + "(k "
+                + type.columnType()
+                + " NOT NULL PRIMARY KEY HASH"
+                + ",v OTHER NOT NULL"
+                + ",created TIMESTAMP NOT NULL"
+                + ",accessed TIMESTAMP NOT NULL"
+                + ")");
+        stmt.addBatch(
+            "ALTER TABLE data ADD COLUMN IF NOT EXISTS "
+                + "space BIGINT AS OCTET_LENGTH(k) + OCTET_LENGTH(v)");
+        stmt.addBatch("ALTER TABLE data ADD COLUMN IF NOT EXISTS version INT DEFAULT 0 NOT NULL");
+        stmt.executeBatch();
+      }
+    }
+
+    void close() {
+      get = closeStatement(get);
+      put = closeStatement(put);
+      touch = closeStatement(touch);
+      invalidate = closeStatement(invalidate);
+
+      if (conn != null) {
+        try {
+          conn.close();
+        } catch (SQLException e) {
+          logger.atWarning().withCause(e).log("Cannot close connection to %s", url);
+        } finally {
+          conn = null;
+        }
+      }
+    }
+
+    private PreparedStatement closeStatement(PreparedStatement ps) {
+      if (ps != null) {
+        try {
+          ps.close();
+        } catch (SQLException e) {
+          logger.atWarning().withCause(e).log("Cannot close statement for %s", url);
+        }
+      }
+      return null;
+    }
+  }
+}
diff --git a/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheModule.java b/java/com/google/gerrit/server/cache/h2/H2CacheModule.java
similarity index 100%
rename from gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheModule.java
rename to java/com/google/gerrit/server/cache/h2/H2CacheModule.java
diff --git a/java/com/google/gerrit/server/cache/h2/KeyType.java b/java/com/google/gerrit/server/cache/h2/KeyType.java
new file mode 100644
index 0000000..3045e20
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/h2/KeyType.java
@@ -0,0 +1,31 @@
+// 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.
+
+package com.google.gerrit.server.cache.h2;
+
+import com.google.common.hash.Funnel;
+import java.io.IOException;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+interface KeyType<K> {
+  String columnType();
+
+  K get(ResultSet rs, int col) throws IOException, SQLException;
+
+  void set(PreparedStatement ps, int col, K key) throws IOException, SQLException;
+
+  Funnel<K> funnel();
+}
diff --git a/java/com/google/gerrit/server/cache/h2/ObjectKeyTypeImpl.java b/java/com/google/gerrit/server/cache/h2/ObjectKeyTypeImpl.java
new file mode 100644
index 0000000..591883e
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/h2/ObjectKeyTypeImpl.java
@@ -0,0 +1,59 @@
+// 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.
+
+package com.google.gerrit.server.cache.h2;
+
+import com.google.common.hash.Funnel;
+import com.google.common.hash.Funnels;
+import com.google.common.hash.PrimitiveSink;
+import com.google.gerrit.server.cache.serialize.CacheSerializer;
+import java.io.IOException;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+class ObjectKeyTypeImpl<K> implements KeyType<K> {
+  private final CacheSerializer<K> serializer;
+
+  ObjectKeyTypeImpl(CacheSerializer<K> serializer) {
+    this.serializer = serializer;
+  }
+
+  @Override
+  public String columnType() {
+    return "OTHER";
+  }
+
+  @Override
+  public K get(ResultSet rs, int col) throws IOException, SQLException {
+    return serializer.deserialize(rs.getBytes(col));
+  }
+
+  @Override
+  public void set(PreparedStatement ps, int col, K key) throws IOException, SQLException {
+    ps.setBytes(col, serializer.serialize(key));
+  }
+
+  @Override
+  public Funnel<K> funnel() {
+    return new Funnel<K>() {
+      private static final long serialVersionUID = 1L;
+
+      @Override
+      public void funnel(K from, PrimitiveSink into) {
+        Funnels.byteArrayFunnel().funnel(serializer.serialize(from), into);
+      }
+    };
+  }
+}
diff --git a/java/com/google/gerrit/server/cache/h2/StringKeyTypeImpl.java b/java/com/google/gerrit/server/cache/h2/StringKeyTypeImpl.java
new file mode 100644
index 0000000..8083ea5
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/h2/StringKeyTypeImpl.java
@@ -0,0 +1,47 @@
+// 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.
+
+package com.google.gerrit.server.cache.h2;
+
+import com.google.common.hash.Funnel;
+import com.google.common.hash.Funnels;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+enum StringKeyTypeImpl implements KeyType<String> {
+  INSTANCE;
+
+  @Override
+  public String columnType() {
+    return "VARCHAR(4096)";
+  }
+
+  @Override
+  public String get(ResultSet rs, int col) throws SQLException {
+    return rs.getString(col);
+  }
+
+  @Override
+  public void set(PreparedStatement ps, int col, String value) throws SQLException {
+    ps.setString(col, value);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public Funnel<String> funnel() {
+    Funnel<?> s = Funnels.unencodedCharsFunnel();
+    return (Funnel<String>) s;
+  }
+}
diff --git a/java/com/google/gerrit/server/cache/mem/BUILD b/java/com/google/gerrit/server/cache/mem/BUILD
new file mode 100644
index 0000000..4106714
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/mem/BUILD
@@ -0,0 +1,13 @@
+java_library(
+    name = "mem",
+    srcs = glob(["*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/common:annotations",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/server",
+        "//lib:guava",
+        "//lib/guice",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+    ],
+)
diff --git a/java/com/google/gerrit/server/cache/mem/DefaultMemoryCacheFactory.java b/java/com/google/gerrit/server/cache/mem/DefaultMemoryCacheFactory.java
new file mode 100644
index 0000000..ad1d396
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/mem/DefaultMemoryCacheFactory.java
@@ -0,0 +1,122 @@
+// Copyright (C) 2012 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.google.gerrit.server.cache.mem;
+
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+import static java.util.concurrent.TimeUnit.SECONDS;
+
+import com.google.common.base.Strings;
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.common.cache.Weigher;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.server.cache.CacheDef;
+import com.google.gerrit.server.cache.ForwardingRemovalListener;
+import com.google.gerrit.server.cache.MemoryCacheFactory;
+import com.google.gerrit.server.config.ConfigUtil;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.inject.Inject;
+import java.time.Duration;
+import org.eclipse.jgit.lib.Config;
+
+class DefaultMemoryCacheFactory implements MemoryCacheFactory {
+  private final Config cfg;
+  private final ForwardingRemovalListener.Factory forwardingRemovalListenerFactory;
+
+  @Inject
+  DefaultMemoryCacheFactory(
+      @GerritServerConfig Config config,
+      ForwardingRemovalListener.Factory forwardingRemovalListenerFactory) {
+    this.cfg = config;
+    this.forwardingRemovalListenerFactory = forwardingRemovalListenerFactory;
+  }
+
+  @Override
+  public <K, V> Cache<K, V> build(CacheDef<K, V> def) {
+    return create(def).build();
+  }
+
+  @Override
+  public <K, V> LoadingCache<K, V> build(CacheDef<K, V> def, CacheLoader<K, V> loader) {
+    return create(def).build(loader);
+  }
+
+  @SuppressWarnings("unchecked")
+  private <K, V> CacheBuilder<K, V> create(CacheDef<K, V> def) {
+    CacheBuilder<K, V> builder = newCacheBuilder();
+    builder.recordStats();
+    builder.maximumWeight(
+        cfg.getLong("cache", def.configKey(), "memoryLimit", def.maximumWeight()));
+
+    builder = builder.removalListener(forwardingRemovalListenerFactory.create(def.name()));
+
+    Weigher<K, V> weigher = def.weigher();
+    if (weigher == null) {
+      weigher = unitWeight();
+    }
+    builder.weigher(weigher);
+
+    Duration expireAfterWrite = def.expireAfterWrite();
+    if (has(def.configKey(), "maxAge")) {
+      builder.expireAfterWrite(
+          ConfigUtil.getTimeUnit(
+              cfg, "cache", def.configKey(), "maxAge", toSeconds(expireAfterWrite), SECONDS),
+          SECONDS);
+    } else if (expireAfterWrite != null) {
+      builder.expireAfterWrite(expireAfterWrite.toNanos(), NANOSECONDS);
+    }
+
+    Duration expireAfterAccess = def.expireFromMemoryAfterAccess();
+    if (has(def.configKey(), "expireFromMemoryAfterAccess")) {
+      builder.expireAfterAccess(
+          ConfigUtil.getTimeUnit(
+              cfg,
+              "cache",
+              def.configKey(),
+              "expireFromMemoryAfterAccess",
+              toSeconds(expireAfterAccess),
+              SECONDS),
+          SECONDS);
+    } else if (expireAfterAccess != null) {
+      builder.expireAfterAccess(expireAfterAccess.toNanos(), NANOSECONDS);
+    }
+
+    return builder;
+  }
+
+  private static long toSeconds(@Nullable Duration duration) {
+    return duration != null ? duration.getSeconds() : 0;
+  }
+
+  private boolean has(String name, String var) {
+    return !Strings.isNullOrEmpty(cfg.getString("cache", name, var));
+  }
+
+  @SuppressWarnings("unchecked")
+  private static <K, V> CacheBuilder<K, V> newCacheBuilder() {
+    return (CacheBuilder<K, V>) CacheBuilder.newBuilder();
+  }
+
+  private static <K, V> Weigher<K, V> unitWeight() {
+    return new Weigher<K, V>() {
+      @Override
+      public int weigh(K key, V value) {
+        return 1;
+      }
+    };
+  }
+}
diff --git a/gerrit-cache-mem/src/main/java/com/google/gerrit/server/cache/mem/DefaultMemoryCacheModule.java b/java/com/google/gerrit/server/cache/mem/DefaultMemoryCacheModule.java
similarity index 100%
rename from gerrit-cache-mem/src/main/java/com/google/gerrit/server/cache/mem/DefaultMemoryCacheModule.java
rename to java/com/google/gerrit/server/cache/mem/DefaultMemoryCacheModule.java
diff --git a/java/com/google/gerrit/server/cache/serialize/BUILD b/java/com/google/gerrit/server/cache/serialize/BUILD
new file mode 100644
index 0000000..957a153
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/serialize/BUILD
@@ -0,0 +1,12 @@
+java_library(
+    name = "serialize",
+    srcs = glob(["*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/common:annotations",
+        "//lib:guava",
+        "//lib:gwtorm",
+        "//lib:protobuf",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+    ],
+)
diff --git a/java/com/google/gerrit/server/cache/serialize/BooleanCacheSerializer.java b/java/com/google/gerrit/server/cache/serialize/BooleanCacheSerializer.java
new file mode 100644
index 0000000..50fcf0c
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/serialize/BooleanCacheSerializer.java
@@ -0,0 +1,44 @@
+// 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.
+
+package com.google.gerrit.server.cache.serialize;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Objects.requireNonNull;
+
+import com.google.protobuf.TextFormat;
+import java.util.Arrays;
+
+public enum BooleanCacheSerializer implements CacheSerializer<Boolean> {
+  INSTANCE;
+
+  private static final byte[] TRUE = Boolean.toString(true).getBytes(UTF_8);
+  private static final byte[] FALSE = Boolean.toString(false).getBytes(UTF_8);
+
+  @Override
+  public byte[] serialize(Boolean object) {
+    byte[] bytes = requireNonNull(object) ? TRUE : FALSE;
+    return Arrays.copyOf(bytes, bytes.length);
+  }
+
+  @Override
+  public Boolean deserialize(byte[] in) {
+    if (Arrays.equals(in, TRUE)) {
+      return Boolean.TRUE;
+    } else if (Arrays.equals(in, FALSE)) {
+      return Boolean.FALSE;
+    }
+    throw new IllegalArgumentException("Invalid Boolean value: " + TextFormat.escapeBytes(in));
+  }
+}
diff --git a/java/com/google/gerrit/server/cache/serialize/CacheSerializer.java b/java/com/google/gerrit/server/cache/serialize/CacheSerializer.java
new file mode 100644
index 0000000..2d41f2c
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/serialize/CacheSerializer.java
@@ -0,0 +1,42 @@
+// 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.
+
+package com.google.gerrit.server.cache.serialize;
+
+/**
+ * Interface for serializing/deserializing a type to/from a persistent cache.
+ *
+ * <p>Implementations are null-hostile and will throw exceptions from {@link #serialize} when passed
+ * null values, unless otherwise specified.
+ */
+public interface CacheSerializer<T> {
+  /**
+   * Serializes the object to a new byte array.
+   *
+   * @param object object to serialize.
+   * @return serialized byte array representation.
+   * @throws RuntimeException for malformed input, for example null or an otherwise unsupported
+   *     value.
+   */
+  byte[] serialize(T object);
+
+  /**
+   * Deserializes a single object from the given byte array.
+   *
+   * @param in serialized byte array representation.
+   * @throws RuntimeException for malformed input, for example null or an otherwise corrupt
+   *     serialized representation.
+   */
+  T deserialize(byte[] in);
+}
diff --git a/java/com/google/gerrit/server/cache/serialize/EnumCacheSerializer.java b/java/com/google/gerrit/server/cache/serialize/EnumCacheSerializer.java
new file mode 100644
index 0000000..ecb4963
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/serialize/EnumCacheSerializer.java
@@ -0,0 +1,39 @@
+// 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.
+
+package com.google.gerrit.server.cache.serialize;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.base.Converter;
+import com.google.common.base.Enums;
+
+public class EnumCacheSerializer<E extends Enum<E>> implements CacheSerializer<E> {
+  private final Converter<String, E> converter;
+
+  public EnumCacheSerializer(Class<E> clazz) {
+    this.converter = Enums.stringConverter(clazz);
+  }
+
+  @Override
+  public byte[] serialize(E object) {
+    return converter.reverse().convert(requireNonNull(object)).getBytes(UTF_8);
+  }
+
+  @Override
+  public E deserialize(byte[] in) {
+    return converter.convert(new String(requireNonNull(in), UTF_8));
+  }
+}
diff --git a/java/com/google/gerrit/server/cache/serialize/IntKeyCacheSerializer.java b/java/com/google/gerrit/server/cache/serialize/IntKeyCacheSerializer.java
new file mode 100644
index 0000000..85530f4
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/serialize/IntKeyCacheSerializer.java
@@ -0,0 +1,38 @@
+// 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.
+
+package com.google.gerrit.server.cache.serialize;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.gwtorm.client.IntKey;
+import java.util.function.Function;
+
+public class IntKeyCacheSerializer<K extends IntKey<?>> implements CacheSerializer<K> {
+  private final Function<Integer, K> factory;
+
+  public IntKeyCacheSerializer(Function<Integer, K> factory) {
+    this.factory = requireNonNull(factory);
+  }
+
+  @Override
+  public byte[] serialize(K object) {
+    return IntegerCacheSerializer.INSTANCE.serialize(object.get());
+  }
+
+  @Override
+  public K deserialize(byte[] in) {
+    return factory.apply(IntegerCacheSerializer.INSTANCE.deserialize(in));
+  }
+}
diff --git a/java/com/google/gerrit/server/cache/serialize/IntegerCacheSerializer.java b/java/com/google/gerrit/server/cache/serialize/IntegerCacheSerializer.java
new file mode 100644
index 0000000..4494454
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/serialize/IntegerCacheSerializer.java
@@ -0,0 +1,63 @@
+// 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.
+
+package com.google.gerrit.server.cache.serialize;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.protobuf.CodedInputStream;
+import com.google.protobuf.CodedOutputStream;
+import com.google.protobuf.TextFormat;
+import java.io.IOException;
+import java.util.Arrays;
+
+public enum IntegerCacheSerializer implements CacheSerializer<Integer> {
+  INSTANCE;
+
+  // Same as com.google.protobuf.WireFormat#MAX_VARINT_SIZE. Note that negative values take up more
+  // than MAX_VARINT32_SIZE space.
+  private static final int MAX_VARINT_SIZE = 10;
+
+  @Override
+  public byte[] serialize(Integer object) {
+    byte[] buf = new byte[MAX_VARINT_SIZE];
+    CodedOutputStream cout = CodedOutputStream.newInstance(buf);
+    try {
+      cout.writeInt32NoTag(requireNonNull(object));
+      cout.flush();
+    } catch (IOException e) {
+      throw new IllegalStateException("Failed to serialize int");
+    }
+    int n = cout.getTotalBytesWritten();
+    return n == buf.length ? buf : Arrays.copyOfRange(buf, 0, n);
+  }
+
+  @Override
+  public Integer deserialize(byte[] in) {
+    CodedInputStream cin = CodedInputStream.newInstance(requireNonNull(in));
+    int ret;
+    try {
+      ret = cin.readRawVarint32();
+    } catch (IOException e) {
+      throw new IllegalArgumentException("Failed to deserialize int");
+    }
+    int n = cin.getTotalBytesRead();
+    if (n != in.length) {
+      throw new IllegalArgumentException(
+          "Extra bytes in int representation: "
+              + TextFormat.escapeBytes(Arrays.copyOfRange(in, n, in.length)));
+    }
+    return ret;
+  }
+}
diff --git a/java/com/google/gerrit/server/cache/serialize/JavaCacheSerializer.java b/java/com/google/gerrit/server/cache/serialize/JavaCacheSerializer.java
new file mode 100644
index 0000000..ee71846
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/serialize/JavaCacheSerializer.java
@@ -0,0 +1,57 @@
+// 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.
+
+package com.google.gerrit.server.cache.serialize;
+
+import com.google.gerrit.common.Nullable;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+/**
+ * Serializer that uses default Java serialization.
+ *
+ * <p>Unlike most {@link CacheSerializer} implementations, serializing null is supported.
+ *
+ * @param <T> type to serialize. Must implement {@code Serializable}, but due to implementation
+ *     details this is only checked at runtime.
+ */
+public class JavaCacheSerializer<T> implements CacheSerializer<T> {
+  @Override
+  public byte[] serialize(@Nullable T object) {
+    try (ByteArrayOutputStream bout = new ByteArrayOutputStream();
+        ObjectOutputStream oout = new ObjectOutputStream(bout)) {
+      oout.writeObject(object);
+      oout.flush();
+      return bout.toByteArray();
+    } catch (IOException e) {
+      throw new IllegalArgumentException("Failed to serialize object", e);
+    }
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public T deserialize(byte[] in) {
+    Object object;
+    try (ByteArrayInputStream bin = new ByteArrayInputStream(in);
+        ObjectInputStream oin = new ObjectInputStream(bin)) {
+      object = oin.readObject();
+    } catch (ClassNotFoundException | IOException e) {
+      throw new IllegalArgumentException("Failed to deserialize object", e);
+    }
+    return (T) object;
+  }
+}
diff --git a/java/com/google/gerrit/server/cache/serialize/ObjectIdCacheSerializer.java b/java/com/google/gerrit/server/cache/serialize/ObjectIdCacheSerializer.java
new file mode 100644
index 0000000..500875d
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/serialize/ObjectIdCacheSerializer.java
@@ -0,0 +1,37 @@
+// 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.
+
+package com.google.gerrit.server.cache.serialize;
+
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+
+public enum ObjectIdCacheSerializer implements CacheSerializer<ObjectId> {
+  INSTANCE;
+
+  @Override
+  public byte[] serialize(ObjectId object) {
+    byte[] buf = new byte[Constants.OBJECT_ID_LENGTH];
+    object.copyRawTo(buf, 0);
+    return buf;
+  }
+
+  @Override
+  public ObjectId deserialize(byte[] in) {
+    if (in == null || in.length != Constants.OBJECT_ID_LENGTH) {
+      throw new IllegalArgumentException("Failed to deserialize ObjectId");
+    }
+    return ObjectId.fromRaw(in);
+  }
+}
diff --git a/java/com/google/gerrit/server/cache/serialize/ProtoCacheSerializers.java b/java/com/google/gerrit/server/cache/serialize/ProtoCacheSerializers.java
new file mode 100644
index 0000000..4e0b106
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/serialize/ProtoCacheSerializers.java
@@ -0,0 +1,127 @@
+// 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.
+
+package com.google.gerrit.server.cache.serialize;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static org.eclipse.jgit.lib.Constants.OBJECT_ID_LENGTH;
+
+import com.google.gwtorm.protobuf.ProtobufCodec;
+import com.google.protobuf.ByteString;
+import com.google.protobuf.CodedOutputStream;
+import com.google.protobuf.MessageLite;
+import com.google.protobuf.Parser;
+import java.io.IOException;
+import org.eclipse.jgit.lib.ObjectId;
+
+/** Static utilities for writing protobuf-based {@link CacheSerializer} implementations. */
+public class ProtoCacheSerializers {
+  /**
+   * Serializes a proto to a byte array.
+   *
+   * <p>Guarantees deterministic serialization and thus is suitable for use in persistent caches.
+   * Should be used in preference to {@link MessageLite#toByteArray()}, which is not guaranteed
+   * deterministic.
+   *
+   * @param message the proto message to serialize.
+   * @return a byte array with the message contents.
+   */
+  public static byte[] toByteArray(MessageLite message) {
+    byte[] bytes = new byte[message.getSerializedSize()];
+    CodedOutputStream cout = CodedOutputStream.newInstance(bytes);
+    cout.useDeterministicSerialization();
+    try {
+      message.writeTo(cout);
+      cout.checkNoSpaceLeft();
+      return bytes;
+    } catch (IOException e) {
+      throw new IllegalStateException("exception writing to byte array", e);
+    }
+  }
+
+  /**
+   * Serializes an object to a {@link ByteString} using a protobuf codec.
+   *
+   * <p>Guarantees deterministic serialization and thus is suitable for use in persistent caches.
+   * Should be used in preference to {@link ProtobufCodec#encodeToByteString(Object)}, which is not
+   * guaranteed deterministic.
+   *
+   * @param object the object to serialize.
+   * @param codec codec for serializing.
+   * @return a {@code ByteString} with the message contents.
+   */
+  public static <T> ByteString toByteString(T object, ProtobufCodec<T> codec) {
+    try (ByteString.Output bout = ByteString.newOutput()) {
+      CodedOutputStream cout = CodedOutputStream.newInstance(bout);
+      cout.useDeterministicSerialization();
+      codec.encode(object, cout);
+      cout.flush();
+      return bout.toByteString();
+    } catch (IOException e) {
+      throw new IllegalStateException("exception writing to ByteString", e);
+    }
+  }
+
+  /**
+   * Parses a byte array to a protobuf message.
+   *
+   * @param parser parser for the proto type.
+   * @param in byte array with the message contents.
+   * @return parsed proto.
+   */
+  public static <M extends MessageLite> M parseUnchecked(Parser<M> parser, byte[] in) {
+    try {
+      return parser.parseFrom(in);
+    } catch (IOException e) {
+      throw new IllegalArgumentException("exception parsing byte array to proto", e);
+    }
+  }
+
+  /**
+   * Helper for serializing {@link ObjectId} instances to/from protobuf fields.
+   *
+   * <p>Reuse a single instance's {@link #toByteString(ObjectId)} and {@link
+   * #fromByteString(ByteString)} within a single {@link CacheSerializer#serialize} or {@link
+   * CacheSerializer#deserialize} method body to minimize allocation of temporary buffers.
+   *
+   * <p><strong>Note:</strong> This class is not threadsafe. Instances must not be stored in {@link
+   * CacheSerializer} fields if the serializer instances will be used from multiple threads.
+   */
+  public static class ObjectIdConverter {
+    public static ObjectIdConverter create() {
+      return new ObjectIdConverter();
+    }
+
+    private final byte[] buf = new byte[OBJECT_ID_LENGTH];
+
+    private ObjectIdConverter() {}
+
+    public ByteString toByteString(ObjectId id) {
+      id.copyRawTo(buf, 0);
+      return ByteString.copyFrom(buf);
+    }
+
+    public ObjectId fromByteString(ByteString in) {
+      checkArgument(
+          in.size() == OBJECT_ID_LENGTH,
+          "expected ByteString of length %s: %s",
+          OBJECT_ID_LENGTH,
+          in);
+      in.copyTo(buf, 0);
+      return ObjectId.fromRaw(buf);
+    }
+  }
+
+  private ProtoCacheSerializers() {}
+}
diff --git a/java/com/google/gerrit/server/cache/serialize/StringCacheSerializer.java b/java/com/google/gerrit/server/cache/serialize/StringCacheSerializer.java
new file mode 100644
index 0000000..525b75b
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/serialize/StringCacheSerializer.java
@@ -0,0 +1,70 @@
+// 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.
+
+package com.google.gerrit.server.cache.serialize;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.annotations.VisibleForTesting;
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.CharacterCodingException;
+import java.nio.charset.Charset;
+import java.nio.charset.CodingErrorAction;
+
+public enum StringCacheSerializer implements CacheSerializer<String> {
+  INSTANCE;
+
+  @Override
+  public byte[] serialize(String object) {
+    return serialize(UTF_8, object);
+  }
+
+  @VisibleForTesting
+  static byte[] serialize(Charset charset, String s) {
+    if (s.isEmpty()) {
+      return new byte[0];
+    }
+    try {
+      ByteBuffer buf =
+          charset
+              .newEncoder()
+              .onMalformedInput(CodingErrorAction.REPORT)
+              .onUnmappableCharacter(CodingErrorAction.REPORT)
+              .encode(CharBuffer.wrap(s));
+      byte[] result = new byte[buf.remaining()];
+      buf.get(result);
+      return result;
+    } catch (CharacterCodingException e) {
+      throw new IllegalStateException("Failed to serialize string", e);
+    }
+  }
+
+  @Override
+  public String deserialize(byte[] in) {
+    if (in.length == 0) {
+      return "";
+    }
+    try {
+      return UTF_8
+          .newDecoder()
+          .onMalformedInput(CodingErrorAction.REPORT)
+          .onUnmappableCharacter(CodingErrorAction.REPORT)
+          .decode(ByteBuffer.wrap(in))
+          .toString();
+    } catch (CharacterCodingException e) {
+      throw new IllegalStateException("Failed to deserialize string", e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/cache/testing/BUILD b/java/com/google/gerrit/server/cache/testing/BUILD
new file mode 100644
index 0000000..f87c006
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/testing/BUILD
@@ -0,0 +1,14 @@
+package(default_testonly = True)
+
+java_library(
+    name = "testing",
+    srcs = glob(["*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/server/cache/serialize",
+        "//lib:guava",
+        "//lib:protobuf",
+        "//lib/commons:lang3",
+        "//lib/truth",
+    ],
+)
diff --git a/java/com/google/gerrit/server/cache/testing/CacheSerializerTestUtil.java b/java/com/google/gerrit/server/cache/testing/CacheSerializerTestUtil.java
new file mode 100644
index 0000000..b339e24
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/testing/CacheSerializerTestUtil.java
@@ -0,0 +1,34 @@
+// 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.
+
+package com.google.gerrit.server.cache.testing;
+
+import com.google.protobuf.ByteString;
+
+/** Static utilities for testing cache serializers. */
+public class CacheSerializerTestUtil {
+  public static ByteString byteString(int... ints) {
+    return ByteString.copyFrom(byteArray(ints));
+  }
+
+  public static byte[] byteArray(int... ints) {
+    byte[] bytes = new byte[ints.length];
+    for (int i = 0; i < ints.length; i++) {
+      bytes[i] = (byte) ints[i];
+    }
+    return bytes;
+  }
+
+  private CacheSerializerTestUtil() {}
+}
diff --git a/java/com/google/gerrit/server/cache/testing/SerializedClassSubject.java b/java/com/google/gerrit/server/cache/testing/SerializedClassSubject.java
new file mode 100644
index 0000000..2351e2c
--- /dev/null
+++ b/java/com/google/gerrit/server/cache/testing/SerializedClassSubject.java
@@ -0,0 +1,109 @@
+// 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.
+
+package com.google.gerrit.server.cache.testing;
+
+import static com.google.common.collect.ImmutableMap.toImmutableMap;
+import static com.google.common.truth.Truth.assertAbout;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import com.google.common.truth.FailureMetadata;
+import com.google.common.truth.Subject;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.lang.reflect.Type;
+import java.util.Arrays;
+import java.util.Map;
+import org.apache.commons.lang3.reflect.FieldUtils;
+
+/**
+ * Subject about classes that are serialized into persistent caches.
+ *
+ * <p>Hand-written {@link com.google.gerrit.server.cache.serialize.CacheSerializer CacheSerializer}
+ * implementations depend on the exact representation of the data stored in a class, so it is
+ * important to verify any assumptions about the structure of the serialized classes. This class
+ * contains assertions about serialized classes, and should be used for every class that has a
+ * custom serializer implementation.
+ *
+ * <p>Changing fields of a serialized class (or abstract methods, in the case of {@code @AutoValue}
+ * classes) will likely require changes to the serializer implementation, and may require bumping
+ * the {@link com.google.gerrit.server.cache.PersistentCacheBinding#version(int) version} in the
+ * cache binding, in case the representation has changed in such a way that old serialized data
+ * becomes unreadable.
+ *
+ * <p>Changes to a serialized class such as adding or removing fields generally requires a change to
+ * the hand-written serializer. Usually, serializer implementations should be written in such a way
+ * that new fields are considered optional, and won't require bumping the version.
+ */
+public class SerializedClassSubject extends Subject<SerializedClassSubject, Class<?>> {
+  public static SerializedClassSubject assertThatSerializedClass(Class<?> actual) {
+    // This formulation fails in Eclipse 4.7.3a with "The type
+    // SerializedClassSubject does not define SerializedClassSubject() that is
+    // applicable here", due to
+    // https://bugs.eclipse.org/bugs/show_bug.cgi?id=534694 or a similar bug:
+    // return assertAbout(SerializedClassSubject::new).that(actual);
+    Subject.Factory<SerializedClassSubject, Class<?>> factory =
+        (m, a) -> new SerializedClassSubject(m, a);
+    return assertAbout(factory).that(actual);
+  }
+
+  private SerializedClassSubject(FailureMetadata metadata, Class<?> actual) {
+    super(metadata, actual);
+  }
+
+  public void isAbstract() {
+    isNotNull();
+    assertWithMessage("expected class %s to be abstract", actual().getName())
+        .that(Modifier.isAbstract(actual().getModifiers()))
+        .isTrue();
+  }
+
+  public void isConcrete() {
+    isNotNull();
+    assertWithMessage("expected class %s to be concrete", actual().getName())
+        .that(!Modifier.isAbstract(actual().getModifiers()))
+        .isTrue();
+  }
+
+  public void hasFields(Map<String, Type> expectedFields) {
+    isConcrete();
+    assertThat(
+            FieldUtils.getAllFieldsList(actual()).stream()
+                .filter(f -> !Modifier.isStatic(f.getModifiers()))
+                .collect(toImmutableMap(Field::getName, Field::getGenericType)))
+        .containsExactlyEntriesIn(expectedFields);
+  }
+
+  public void hasAutoValueMethods(Map<String, Type> expectedMethods) {
+    // Would be nice if we could check clazz is an @AutoValue, but the retention is not RUNTIME.
+    isAbstract();
+    assertThat(
+            Arrays.stream(actual().getDeclaredMethods())
+                .filter(m -> !Modifier.isStatic(m.getModifiers()))
+                .filter(m -> Modifier.isAbstract(m.getModifiers()))
+                .filter(m -> m.getParameters().length == 0)
+                .collect(toImmutableMap(Method::getName, Method::getGenericReturnType)))
+        .named("no-argument abstract methods on %s", actual().getName())
+        .isEqualTo(expectedMethods);
+  }
+
+  public void extendsClass(Type superclassType) {
+    isNotNull();
+    assertThat(actual().getGenericSuperclass())
+        .named("superclass of %s", actual().getName())
+        .isEqualTo(superclassType);
+  }
+}
diff --git a/java/com/google/gerrit/server/change/AbandonOp.java b/java/com/google/gerrit/server/change/AbandonOp.java
new file mode 100644
index 0000000..5affd5c
--- /dev/null
+++ b/java/com/google/gerrit/server/change/AbandonOp.java
@@ -0,0 +1,139 @@
+// 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.
+
+package com.google.gerrit.server.change;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ListMultimap;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.api.changes.RecipientType;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.ChangeUtil;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.extensions.events.ChangeAbandoned;
+import com.google.gerrit.server.mail.send.AbandonedSender;
+import com.google.gerrit.server.mail.send.ReplyToChangeSender;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.Context;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+
+public class AbandonOp implements BatchUpdateOp {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final AbandonedSender.Factory abandonedSenderFactory;
+  private final ChangeMessagesUtil cmUtil;
+  private final PatchSetUtil psUtil;
+  private final ChangeAbandoned changeAbandoned;
+
+  private final String msgTxt;
+  private final NotifyHandling notifyHandling;
+  private final ListMultimap<RecipientType, Account.Id> accountsToNotify;
+  private final AccountState accountState;
+
+  private Change change;
+  private PatchSet patchSet;
+  private ChangeMessage message;
+
+  public interface Factory {
+    AbandonOp create(
+        @Assisted @Nullable AccountState accountState,
+        @Assisted @Nullable String msgTxt,
+        @Assisted NotifyHandling notifyHandling,
+        @Assisted ListMultimap<RecipientType, Account.Id> accountsToNotify);
+  }
+
+  @Inject
+  AbandonOp(
+      AbandonedSender.Factory abandonedSenderFactory,
+      ChangeMessagesUtil cmUtil,
+      PatchSetUtil psUtil,
+      ChangeAbandoned changeAbandoned,
+      @Assisted @Nullable AccountState accountState,
+      @Assisted @Nullable String msgTxt,
+      @Assisted NotifyHandling notifyHandling,
+      @Assisted ListMultimap<RecipientType, Account.Id> accountsToNotify) {
+    this.abandonedSenderFactory = abandonedSenderFactory;
+    this.cmUtil = cmUtil;
+    this.psUtil = psUtil;
+    this.changeAbandoned = changeAbandoned;
+
+    this.accountState = accountState;
+    this.msgTxt = Strings.nullToEmpty(msgTxt);
+    this.notifyHandling = notifyHandling;
+    this.accountsToNotify = accountsToNotify;
+  }
+
+  @Nullable
+  public Change getChange() {
+    return change;
+  }
+
+  @Override
+  public boolean updateChange(ChangeContext ctx) throws OrmException, ResourceConflictException {
+    change = ctx.getChange();
+    PatchSet.Id psId = change.currentPatchSetId();
+    ChangeUpdate update = ctx.getUpdate(psId);
+    if (!change.getStatus().isOpen()) {
+      throw new ResourceConflictException("change is " + ChangeUtil.status(change));
+    }
+    patchSet = psUtil.get(ctx.getDb(), ctx.getNotes(), psId);
+    change.setStatus(Change.Status.ABANDONED);
+    change.setLastUpdatedOn(ctx.getWhen());
+
+    update.setStatus(change.getStatus());
+    message = newMessage(ctx);
+    cmUtil.addChangeMessage(ctx.getDb(), update, message);
+    return true;
+  }
+
+  private ChangeMessage newMessage(ChangeContext ctx) {
+    StringBuilder msg = new StringBuilder();
+    msg.append("Abandoned");
+    if (!Strings.nullToEmpty(msgTxt).trim().isEmpty()) {
+      msg.append("\n\n");
+      msg.append(msgTxt.trim());
+    }
+
+    return ChangeMessagesUtil.newMessage(ctx, msg.toString(), ChangeMessagesUtil.TAG_ABANDON);
+  }
+
+  @Override
+  public void postUpdate(Context ctx) throws OrmException {
+    try {
+      ReplyToChangeSender cm = abandonedSenderFactory.create(ctx.getProject(), change.getId());
+      if (accountState != null) {
+        cm.setFrom(accountState.getAccount().getId());
+      }
+      cm.setChangeMessage(message.getMessage(), ctx.getWhen());
+      cm.setNotify(notifyHandling);
+      cm.setAccountsToNotify(accountsToNotify);
+      cm.send();
+    } catch (Exception e) {
+      logger.atSevere().withCause(e).log("Cannot email update for change %s", change.getId());
+    }
+    changeAbandoned.fire(change, patchSet, accountState, msgTxt, ctx.getWhen(), notifyHandling);
+  }
+}
diff --git a/java/com/google/gerrit/server/change/AbandonUtil.java b/java/com/google/gerrit/server/change/AbandonUtil.java
new file mode 100644
index 0000000..f505f6d
--- /dev/null
+++ b/java/com/google/gerrit/server/change/AbandonUtil.java
@@ -0,0 +1,127 @@
+// Copyright (C) 2015 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.google.gerrit.server.change;
+
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.ListMultimap;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.InternalUser;
+import com.google.gerrit.server.config.ChangeCleanupConfig;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.ChangeQueryBuilder;
+import com.google.gerrit.server.query.change.ChangeQueryProcessor;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+@Singleton
+public class AbandonUtil {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final ChangeCleanupConfig cfg;
+  private final Provider<ChangeQueryProcessor> queryProvider;
+  private final ChangeQueryBuilder queryBuilder;
+  private final BatchAbandon batchAbandon;
+  private final InternalUser internalUser;
+
+  @Inject
+  AbandonUtil(
+      ChangeCleanupConfig cfg,
+      InternalUser.Factory internalUserFactory,
+      Provider<ChangeQueryProcessor> queryProvider,
+      ChangeQueryBuilder queryBuilder,
+      BatchAbandon batchAbandon) {
+    this.cfg = cfg;
+    this.queryProvider = queryProvider;
+    this.queryBuilder = queryBuilder;
+    this.batchAbandon = batchAbandon;
+    internalUser = internalUserFactory.create();
+  }
+
+  public void abandonInactiveOpenChanges(BatchUpdate.Factory updateFactory) {
+    if (cfg.getAbandonAfter() <= 0) {
+      return;
+    }
+
+    try {
+      String query =
+          "status:new age:" + TimeUnit.MILLISECONDS.toMinutes(cfg.getAbandonAfter()) + "m";
+      if (!cfg.getAbandonIfMergeable()) {
+        query += " -is:mergeable";
+      }
+
+      List<ChangeData> changesToAbandon =
+          queryProvider.get().enforceVisibility(false).query(queryBuilder.parse(query)).entities();
+      ImmutableListMultimap.Builder<Project.NameKey, ChangeData> builder =
+          ImmutableListMultimap.builder();
+      for (ChangeData cd : changesToAbandon) {
+        builder.put(cd.project(), cd);
+      }
+
+      int count = 0;
+      ListMultimap<Project.NameKey, ChangeData> abandons = builder.build();
+      String message = cfg.getAbandonMessage();
+      for (Project.NameKey project : abandons.keySet()) {
+        Collection<ChangeData> changes = getValidChanges(abandons.get(project), query);
+        try {
+          batchAbandon.batchAbandon(updateFactory, project, internalUser, changes, message);
+          count += changes.size();
+        } catch (Throwable e) {
+          StringBuilder msg = new StringBuilder("Failed to auto-abandon inactive change(s):");
+          for (ChangeData change : changes) {
+            msg.append(" ").append(change.getId().get());
+          }
+          msg.append(".");
+          logger.atSevere().withCause(e).log(msg.toString());
+        }
+      }
+      logger.atInfo().log("Auto-Abandoned %d of %d changes.", count, changesToAbandon.size());
+    } catch (QueryParseException | OrmException e) {
+      logger.atSevere().withCause(e).log(
+          "Failed to query inactive open changes for auto-abandoning.");
+    }
+  }
+
+  private Collection<ChangeData> getValidChanges(Collection<ChangeData> changes, String query)
+      throws OrmException, QueryParseException {
+    Collection<ChangeData> validChanges = new ArrayList<>();
+    for (ChangeData cd : changes) {
+      String newQuery = query + " change:" + cd.getId();
+      List<ChangeData> changesToAbandon =
+          queryProvider
+              .get()
+              .enforceVisibility(false)
+              .query(queryBuilder.parse(newQuery))
+              .entities();
+      if (!changesToAbandon.isEmpty()) {
+        validChanges.add(cd);
+      } else {
+        logger.atFine().log(
+            "Change data with id \"%s\" does not satisfy the query \"%s\""
+                + " any more, hence skipping it in clean up",
+            cd.getId(), query);
+      }
+    }
+    return validChanges;
+  }
+}
diff --git a/java/com/google/gerrit/server/change/AccountPatchReviewStore.java b/java/com/google/gerrit/server/change/AccountPatchReviewStore.java
new file mode 100644
index 0000000..69825ea
--- /dev/null
+++ b/java/com/google/gerrit/server/change/AccountPatchReviewStore.java
@@ -0,0 +1,102 @@
+// 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.
+
+package com.google.gerrit.server.change;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gwtorm.server.OrmException;
+import java.util.Collection;
+import java.util.Optional;
+
+/**
+ * Store for reviewed flags on changes.
+ *
+ * <p>A reviewed flag is a tuple of (patch set ID, file, account ID) and records whether the user
+ * has reviewed a file in a patch set. Each user can easily have thousands of reviewed flags and the
+ * number of reviewed flags is growing without bound. The store must be able handle this data volume
+ * efficiently.
+ *
+ * <p>For a multi-master setup the store must replicate the data between the masters.
+ */
+public interface AccountPatchReviewStore {
+
+  /** Represents patch set id with reviewed files. */
+  @AutoValue
+  abstract class PatchSetWithReviewedFiles {
+    public abstract PatchSet.Id patchSetId();
+
+    public abstract ImmutableSet<String> files();
+
+    public static PatchSetWithReviewedFiles create(PatchSet.Id id, ImmutableSet<String> files) {
+      return new AutoValue_AccountPatchReviewStore_PatchSetWithReviewedFiles(id, files);
+    }
+  }
+
+  /**
+   * Marks the given file in the given patch set as reviewed by the given user.
+   *
+   * @param psId patch set ID
+   * @param accountId account ID of the user
+   * @param path file path
+   * @return {@code true} if the reviewed flag was updated, {@code false} if the reviewed flag was
+   *     already set
+   * @throws OrmException thrown if updating the reviewed flag failed
+   */
+  boolean markReviewed(PatchSet.Id psId, Account.Id accountId, String path) throws OrmException;
+
+  /**
+   * Marks the given files in the given patch set as reviewed by the given user.
+   *
+   * @param psId patch set ID
+   * @param accountId account ID of the user
+   * @param paths file paths
+   * @throws OrmException thrown if updating the reviewed flag failed
+   */
+  void markReviewed(PatchSet.Id psId, Account.Id accountId, Collection<String> paths)
+      throws OrmException;
+
+  /**
+   * Clears the reviewed flag for the given file in the given patch set for the given user.
+   *
+   * @param psId patch set ID
+   * @param accountId account ID of the user
+   * @param path file path
+   * @throws OrmException thrown if clearing the reviewed flag failed
+   */
+  void clearReviewed(PatchSet.Id psId, Account.Id accountId, String path) throws OrmException;
+
+  /**
+   * Clears the reviewed flags for all files in the given patch set for all users.
+   *
+   * @param psId patch set ID
+   * @throws OrmException thrown if clearing the reviewed flags failed
+   */
+  void clearReviewed(PatchSet.Id psId) throws OrmException;
+
+  /**
+   * Find the latest patch set, that is smaller or equals to the given patch set, where at least,
+   * one file has been reviewed by the given user.
+   *
+   * @param psId patch set ID
+   * @param accountId account ID of the user
+   * @return optionally, all files the have been reviewed by the given user that belong to the patch
+   *     set that is smaller or equals to the given patch set
+   * @throws OrmException thrown if accessing the reviewed flags failed
+   */
+  Optional<PatchSetWithReviewedFiles> findReviewed(PatchSet.Id psId, Account.Id accountId)
+      throws OrmException;
+}
diff --git a/java/com/google/gerrit/server/change/ActionJson.java b/java/com/google/gerrit/server/change/ActionJson.java
new file mode 100644
index 0000000..0a9fe81
--- /dev/null
+++ b/java/com/google/gerrit/server/change/ActionJson.java
@@ -0,0 +1,228 @@
+// Copyright (C) 2015 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.google.gerrit.server.change;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.api.changes.ActionVisitor;
+import com.google.gerrit.extensions.common.ActionInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.RevisionInfo;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.extensions.webui.PrivateInternals_UiActionDescription;
+import com.google.gerrit.extensions.webui.UiAction;
+import com.google.gerrit.reviewdb.client.Change.Status;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.extensions.webui.UiActions;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+@Singleton
+public class ActionJson {
+  private final DynamicMap<RestView<RevisionResource>> revisionViews;
+  private final ChangeJson.Factory changeJsonFactory;
+  private final ChangeResource.Factory changeResourceFactory;
+  private final UiActions uiActions;
+  private final DynamicMap<RestView<ChangeResource>> changeViews;
+  private final DynamicSet<ActionVisitor> visitorSet;
+  private final Provider<CurrentUser> userProvider;
+
+  @Inject
+  ActionJson(
+      DynamicMap<RestView<RevisionResource>> views,
+      ChangeJson.Factory changeJsonFactory,
+      ChangeResource.Factory changeResourceFactory,
+      UiActions uiActions,
+      DynamicMap<RestView<ChangeResource>> changeViews,
+      DynamicSet<ActionVisitor> visitorSet,
+      Provider<CurrentUser> userProvider) {
+    this.revisionViews = views;
+    this.changeJsonFactory = changeJsonFactory;
+    this.changeResourceFactory = changeResourceFactory;
+    this.uiActions = uiActions;
+    this.changeViews = changeViews;
+    this.visitorSet = visitorSet;
+    this.userProvider = userProvider;
+  }
+
+  public Map<String, ActionInfo> format(RevisionResource rsrc) throws OrmException {
+    ChangeInfo changeInfo = null;
+    RevisionInfo revisionInfo = null;
+    List<ActionVisitor> visitors = visitors();
+    if (!visitors.isEmpty()) {
+      changeInfo = changeJson().format(rsrc);
+      revisionInfo = requireNonNull(Iterables.getOnlyElement(changeInfo.revisions.values()));
+      changeInfo.revisions = null;
+    }
+    return toActionMap(rsrc, visitors, changeInfo, revisionInfo);
+  }
+
+  private ChangeJson changeJson() {
+    return changeJsonFactory.noOptions();
+  }
+
+  private ArrayList<ActionVisitor> visitors() {
+    return Lists.newArrayList(visitorSet);
+  }
+
+  public ChangeInfo addChangeActions(ChangeInfo to, ChangeNotes notes) {
+    List<ActionVisitor> visitors = visitors();
+    to.actions = toActionMap(notes, visitors, copy(visitors, to));
+    return to;
+  }
+
+  public RevisionInfo addRevisionActions(
+      @Nullable ChangeInfo changeInfo, RevisionInfo to, RevisionResource rsrc) throws OrmException {
+    List<ActionVisitor> visitors = visitors();
+    if (!visitors.isEmpty()) {
+      if (changeInfo != null) {
+        changeInfo = copy(visitors, changeInfo);
+      } else {
+        changeInfo = changeJson().format(rsrc);
+      }
+    }
+    to.actions = toActionMap(rsrc, visitors, changeInfo, copy(visitors, to));
+    return to;
+  }
+
+  private ChangeInfo copy(List<ActionVisitor> visitors, ChangeInfo changeInfo) {
+    if (visitors.isEmpty()) {
+      return null;
+    }
+    // Include all fields from ChangeJson#toChangeInfoImpl that are not protected by any
+    // ListChangesOptions.
+    ChangeInfo copy = new ChangeInfo();
+    copy.project = changeInfo.project;
+    copy.branch = changeInfo.branch;
+    copy.topic = changeInfo.topic;
+    copy.assignee = changeInfo.assignee;
+    copy.hashtags = changeInfo.hashtags;
+    copy.changeId = changeInfo.changeId;
+    copy.submitType = changeInfo.submitType;
+    copy.mergeable = changeInfo.mergeable;
+    copy.insertions = changeInfo.insertions;
+    copy.deletions = changeInfo.deletions;
+    copy.hasReviewStarted = changeInfo.hasReviewStarted;
+    copy.isPrivate = changeInfo.isPrivate;
+    copy.subject = changeInfo.subject;
+    copy.status = changeInfo.status;
+    copy.owner = changeInfo.owner;
+    copy.created = changeInfo.created;
+    copy.updated = changeInfo.updated;
+    copy._number = changeInfo._number;
+    copy.requirements = changeInfo.requirements;
+    copy.revertOf = changeInfo.revertOf;
+    copy.starred = changeInfo.starred;
+    copy.stars = changeInfo.stars;
+    copy.submitted = changeInfo.submitted;
+    copy.submitter = changeInfo.submitter;
+    copy.unresolvedCommentCount = changeInfo.unresolvedCommentCount;
+    copy.workInProgress = changeInfo.workInProgress;
+    copy.id = changeInfo.id;
+    return copy;
+  }
+
+  private RevisionInfo copy(List<ActionVisitor> visitors, RevisionInfo revisionInfo) {
+    if (visitors.isEmpty()) {
+      return null;
+    }
+    // Include all fields from RevisionJson#toRevisionInfo that are not protected by any
+    // ListChangesOptions.
+    RevisionInfo copy = new RevisionInfo();
+    copy.isCurrent = revisionInfo.isCurrent;
+    copy._number = revisionInfo._number;
+    copy.ref = revisionInfo.ref;
+    copy.created = revisionInfo.created;
+    copy.uploader = revisionInfo.uploader;
+    copy.fetch = revisionInfo.fetch;
+    copy.kind = revisionInfo.kind;
+    copy.description = revisionInfo.description;
+    return copy;
+  }
+
+  private Map<String, ActionInfo> toActionMap(
+      ChangeNotes notes, List<ActionVisitor> visitors, ChangeInfo changeInfo) {
+    CurrentUser user = userProvider.get();
+    Map<String, ActionInfo> out = new LinkedHashMap<>();
+    if (!user.isIdentifiedUser()) {
+      return out;
+    }
+
+    Iterable<UiAction.Description> descs =
+        uiActions.from(changeViews, changeResourceFactory.create(notes, user));
+
+    // The followup action is a client-side only operation that does not
+    // have a server side handler. It must be manually registered into the
+    // resulting action map.
+    Status status = notes.getChange().getStatus();
+    if (status.isOpen() || status.equals(Status.MERGED)) {
+      UiAction.Description descr = new UiAction.Description();
+      PrivateInternals_UiActionDescription.setId(descr, "followup");
+      PrivateInternals_UiActionDescription.setMethod(descr, "POST");
+      descr.setTitle("Create follow-up change");
+      descr.setLabel("Follow-Up");
+      descs = Iterables.concat(descs, Collections.singleton(descr));
+    }
+
+    ACTION:
+    for (UiAction.Description d : descs) {
+      ActionInfo actionInfo = new ActionInfo(d);
+      for (ActionVisitor visitor : visitors) {
+        if (!visitor.visit(d.getId(), actionInfo, changeInfo)) {
+          continue ACTION;
+        }
+      }
+      out.put(d.getId(), actionInfo);
+    }
+    return out;
+  }
+
+  private Map<String, ActionInfo> toActionMap(
+      RevisionResource rsrc,
+      List<ActionVisitor> visitors,
+      ChangeInfo changeInfo,
+      RevisionInfo revisionInfo) {
+    if (!rsrc.getUser().isIdentifiedUser()) {
+      return ImmutableMap.of();
+    }
+
+    Map<String, ActionInfo> out = new LinkedHashMap<>();
+    ACTION:
+    for (UiAction.Description d : uiActions.from(revisionViews, rsrc)) {
+      ActionInfo actionInfo = new ActionInfo(d);
+      for (ActionVisitor visitor : visitors) {
+        if (!visitor.visit(d.getId(), actionInfo, changeInfo, revisionInfo)) {
+          continue ACTION;
+        }
+      }
+      out.put(d.getId(), actionInfo);
+    }
+    return out;
+  }
+}
diff --git a/java/com/google/gerrit/server/change/AddReviewersEmail.java b/java/com/google/gerrit/server/change/AddReviewersEmail.java
new file mode 100644
index 0000000..4173950
--- /dev/null
+++ b/java/com/google/gerrit/server/change/AddReviewersEmail.java
@@ -0,0 +1,83 @@
+// 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.
+
+package com.google.gerrit.server.change;
+
+import static com.google.common.collect.ImmutableList.toImmutableList;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ListMultimap;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.api.changes.RecipientType;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.mail.send.AddReviewerSender;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.Collection;
+
+@Singleton
+public class AddReviewersEmail {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final AddReviewerSender.Factory addReviewerSenderFactory;
+
+  @Inject
+  AddReviewersEmail(AddReviewerSender.Factory addReviewerSenderFactory) {
+    this.addReviewerSenderFactory = addReviewerSenderFactory;
+  }
+
+  public void emailReviewers(
+      IdentifiedUser user,
+      Change change,
+      Collection<Account.Id> added,
+      Collection<Account.Id> copied,
+      Collection<Address> addedByEmail,
+      Collection<Address> copiedByEmail,
+      NotifyHandling notify,
+      ListMultimap<RecipientType, Account.Id> accountsToNotify,
+      boolean readyForReview) {
+    // The user knows they added themselves, don't bother emailing them.
+    Account.Id userId = user.getAccountId();
+    ImmutableList<Account.Id> toMail =
+        added.stream().filter(id -> !id.equals(userId)).collect(toImmutableList());
+    ImmutableList<Account.Id> toCopy =
+        copied.stream().filter(id -> !id.equals(userId)).collect(toImmutableList());
+    if (toMail.isEmpty() && toCopy.isEmpty() && addedByEmail.isEmpty() && copiedByEmail.isEmpty()) {
+      return;
+    }
+
+    try {
+      AddReviewerSender cm = addReviewerSenderFactory.create(change.getProject(), change.getId());
+      // Default to silent operation on WIP changes.
+      NotifyHandling defaultNotifyHandling =
+          readyForReview ? NotifyHandling.ALL : NotifyHandling.NONE;
+      cm.setNotify(MoreObjects.firstNonNull(notify, defaultNotifyHandling));
+      cm.setAccountsToNotify(accountsToNotify);
+      cm.setFrom(userId);
+      cm.addReviewers(toMail);
+      cm.addReviewersByEmail(addedByEmail);
+      cm.addExtraCC(toCopy);
+      cm.addExtraCCByEmail(copiedByEmail);
+      cm.send();
+    } catch (Exception err) {
+      logger.atSevere().withCause(err).log(
+          "Cannot send email to new reviewers of change %s", change.getId());
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/change/AddReviewersOp.java b/java/com/google/gerrit/server/change/AddReviewersOp.java
new file mode 100644
index 0000000..6c0aa94
--- /dev/null
+++ b/java/com/google/gerrit/server/change/AddReviewersOp.java
@@ -0,0 +1,278 @@
+// Copyright (C) 2017 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.google.gerrit.server.change;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static com.google.gerrit.extensions.client.ReviewerState.CC;
+import static com.google.gerrit.extensions.client.ReviewerState.REVIEWER;
+import static java.util.Objects.requireNonNull;
+import static java.util.stream.Collectors.toList;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Streams;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.api.changes.RecipientType;
+import com.google.gerrit.extensions.client.ReviewerState;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.extensions.events.ReviewerAdded;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gerrit.server.notedb.ReviewerStateInternal;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.Context;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+public class AddReviewersOp implements BatchUpdateOp {
+  public interface Factory {
+
+    /**
+     * Create a new op.
+     *
+     * <p>Users may be added by account or by email addresses, as determined by {@code accountIds}
+     * and {@code addresses}. The reviewer state for both accounts and email addresses is determined
+     * by {@code state}.
+     *
+     * @param accountIds account IDs to add.
+     * @param addresses email addresses to add.
+     * @param state resulting reviewer state.
+     * @param notify notification handling.
+     * @param accountsToNotify additional accounts to notify.
+     * @return batch update operation.
+     */
+    AddReviewersOp create(
+        Set<Account.Id> accountIds,
+        Collection<Address> addresses,
+        ReviewerState state,
+        @Nullable NotifyHandling notify,
+        ListMultimap<RecipientType, Account.Id> accountsToNotify);
+  }
+
+  @AutoValue
+  public abstract static class Result {
+    public abstract ImmutableList<PatchSetApproval> addedReviewers();
+
+    public abstract ImmutableList<Address> addedReviewersByEmail();
+
+    public abstract ImmutableList<Account.Id> addedCCs();
+
+    public abstract ImmutableList<Address> addedCCsByEmail();
+
+    static Builder builder() {
+      return new AutoValue_AddReviewersOp_Result.Builder();
+    }
+
+    @AutoValue.Builder
+    abstract static class Builder {
+      abstract Builder setAddedReviewers(Iterable<PatchSetApproval> addedReviewers);
+
+      abstract Builder setAddedReviewersByEmail(Iterable<Address> addedReviewersByEmail);
+
+      abstract Builder setAddedCCs(Iterable<Account.Id> addedCCs);
+
+      abstract Builder setAddedCCsByEmail(Iterable<Address> addedCCsByEmail);
+
+      abstract Result build();
+    }
+  }
+
+  private final ApprovalsUtil approvalsUtil;
+  private final PatchSetUtil psUtil;
+  private final ReviewerAdded reviewerAdded;
+  private final AccountCache accountCache;
+  private final ProjectCache projectCache;
+  private final AddReviewersEmail addReviewersEmail;
+  private final NotesMigration migration;
+  private final Set<Account.Id> accountIds;
+  private final Collection<Address> addresses;
+  private final ReviewerState state;
+  private final NotifyHandling notify;
+  private final ListMultimap<RecipientType, Account.Id> accountsToNotify;
+
+  // Unlike addedCCs, addedReviewers is a PatchSetApproval because the AddReviewerResult returned
+  // via the REST API is supposed to include vote information.
+  private List<PatchSetApproval> addedReviewers = ImmutableList.of();
+  private Collection<Address> addedReviewersByEmail = ImmutableList.of();
+  private Collection<Account.Id> addedCCs = ImmutableList.of();
+  private Collection<Address> addedCCsByEmail = ImmutableList.of();
+
+  private Change change;
+  private PatchSet patchSet;
+  private Result opResult;
+
+  @Inject
+  AddReviewersOp(
+      ApprovalsUtil approvalsUtil,
+      PatchSetUtil psUtil,
+      ReviewerAdded reviewerAdded,
+      AccountCache accountCache,
+      ProjectCache projectCache,
+      AddReviewersEmail addReviewersEmail,
+      NotesMigration migration,
+      @Assisted Set<Account.Id> accountIds,
+      @Assisted Collection<Address> addresses,
+      @Assisted ReviewerState state,
+      @Assisted @Nullable NotifyHandling notify,
+      @Assisted ListMultimap<RecipientType, Account.Id> accountsToNotify) {
+    checkArgument(state == REVIEWER || state == CC, "must be %s or %s: %s", REVIEWER, CC, state);
+    this.approvalsUtil = approvalsUtil;
+    this.psUtil = psUtil;
+    this.reviewerAdded = reviewerAdded;
+    this.accountCache = accountCache;
+    this.projectCache = projectCache;
+    this.addReviewersEmail = addReviewersEmail;
+    this.migration = migration;
+
+    this.accountIds = accountIds;
+    this.addresses = addresses;
+    this.state = state;
+    this.notify = notify;
+    this.accountsToNotify = accountsToNotify;
+  }
+
+  void setPatchSet(PatchSet patchSet) {
+    this.patchSet = requireNonNull(patchSet);
+  }
+
+  @Override
+  public boolean updateChange(ChangeContext ctx)
+      throws RestApiException, OrmException, IOException {
+    change = ctx.getChange();
+    if (!accountIds.isEmpty()) {
+      if (migration.readChanges() && state == CC) {
+        addedCCs =
+            approvalsUtil.addCcs(
+                ctx.getNotes(), ctx.getUpdate(change.currentPatchSetId()), accountIds);
+      } else {
+        addedReviewers =
+            approvalsUtil.addReviewers(
+                ctx.getDb(),
+                ctx.getNotes(),
+                ctx.getUpdate(change.currentPatchSetId()),
+                projectCache.checkedGet(change.getProject()).getLabelTypes(change.getDest()),
+                change,
+                accountIds);
+      }
+    }
+
+    ImmutableList<Address> addressesToAdd = ImmutableList.of();
+    ReviewerStateInternal internalState = ReviewerStateInternal.fromReviewerState(state);
+    if (migration.readChanges()) {
+      // TODO(dborowitz): This behavior should live in ApprovalsUtil or something, like addCcs does.
+      ImmutableSet<Address> existing = ctx.getNotes().getReviewersByEmail().byState(internalState);
+      addressesToAdd =
+          addresses.stream().filter(a -> !existing.contains(a)).collect(toImmutableList());
+
+      if (state == CC) {
+        addedCCsByEmail = addressesToAdd;
+      } else {
+        addedReviewersByEmail = addressesToAdd;
+      }
+      for (Address a : addressesToAdd) {
+        ctx.getUpdate(change.currentPatchSetId()).putReviewerByEmail(a, internalState);
+      }
+    }
+    if (addedCCs.isEmpty() && addedReviewers.isEmpty() && addressesToAdd.isEmpty()) {
+      return false;
+    }
+
+    checkAdded();
+
+    if (patchSet == null) {
+      patchSet = requireNonNull(psUtil.current(ctx.getDb(), ctx.getNotes()));
+    }
+    return true;
+  }
+
+  private void checkAdded() {
+    // Should only affect either reviewers or CCs, not both. But the logic in updateChange is
+    // complex, so programmer error is conceivable.
+    boolean addedAnyReviewers = !addedReviewers.isEmpty() || !addedReviewersByEmail.isEmpty();
+    boolean addedAnyCCs = !addedCCs.isEmpty() || !addedCCsByEmail.isEmpty();
+    checkState(
+        !(addedAnyReviewers && addedAnyCCs),
+        "should not have added both reviewers and CCs:\n"
+            + "Arguments:\n"
+            + "  accountIds=%s\n"
+            + "  addresses=%s\n"
+            + "Results:\n"
+            + "  addedReviewers=%s\n"
+            + "  addedReviewersByEmail=%s\n"
+            + "  addedCCs=%s\n"
+            + "  addedCCsByEmail=%s",
+        accountIds,
+        addresses,
+        addedReviewers,
+        addedReviewersByEmail,
+        addedCCs,
+        addedCCsByEmail);
+  }
+
+  @Override
+  public void postUpdate(Context ctx) throws Exception {
+    opResult =
+        Result.builder()
+            .setAddedReviewers(addedReviewers)
+            .setAddedReviewersByEmail(addedReviewersByEmail)
+            .setAddedCCs(addedCCs)
+            .setAddedCCsByEmail(addedCCsByEmail)
+            .build();
+    addReviewersEmail.emailReviewers(
+        ctx.getUser().asIdentifiedUser(),
+        change,
+        Lists.transform(addedReviewers, PatchSetApproval::getAccountId),
+        addedCCs,
+        addedReviewersByEmail,
+        addedCCsByEmail,
+        notify,
+        accountsToNotify,
+        !change.isWorkInProgress());
+    if (!addedReviewers.isEmpty()) {
+      List<AccountState> reviewers =
+          addedReviewers.stream()
+              .map(r -> accountCache.get(r.getAccountId()))
+              .flatMap(Streams::stream)
+              .collect(toList());
+      reviewerAdded.fire(change, patchSet, reviewers, ctx.getAccount(), ctx.getWhen());
+    }
+  }
+
+  public Result getResult() {
+    checkState(opResult != null, "Batch update wasn't executed yet");
+    return opResult;
+  }
+}
diff --git a/java/com/google/gerrit/server/change/ArchiveFormat.java b/java/com/google/gerrit/server/change/ArchiveFormat.java
new file mode 100644
index 0000000..0316c5f
--- /dev/null
+++ b/java/com/google/gerrit/server/change/ArchiveFormat.java
@@ -0,0 +1,77 @@
+// Copyright 2013 Google Inc. All Rights Reserved.
+//
+// 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.google.gerrit.server.change;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.OutputStream;
+import org.apache.commons.compress.archivers.ArchiveOutputStream;
+import org.eclipse.jgit.api.ArchiveCommand;
+import org.eclipse.jgit.api.ArchiveCommand.Format;
+import org.eclipse.jgit.archive.TarFormat;
+import org.eclipse.jgit.archive.Tbz2Format;
+import org.eclipse.jgit.archive.TgzFormat;
+import org.eclipse.jgit.archive.TxzFormat;
+import org.eclipse.jgit.archive.ZipFormat;
+import org.eclipse.jgit.lib.FileMode;
+import org.eclipse.jgit.lib.ObjectLoader;
+
+public enum ArchiveFormat {
+  TGZ("application/x-gzip", new TgzFormat()),
+  TAR("application/x-tar", new TarFormat()),
+  TBZ2("application/x-bzip2", new Tbz2Format()),
+  TXZ("application/x-xz", new TxzFormat()),
+  ZIP("application/x-zip", new ZipFormat());
+
+  private final ArchiveCommand.Format<?> format;
+  private final String mimeType;
+
+  ArchiveFormat(String mimeType, ArchiveCommand.Format<?> format) {
+    this.format = format;
+    this.mimeType = mimeType;
+    ArchiveCommand.registerFormat(name(), format);
+  }
+
+  public String getShortName() {
+    return name().toLowerCase();
+  }
+
+  public String getMimeType() {
+    return mimeType;
+  }
+
+  public String getDefaultSuffix() {
+    return getSuffixes().iterator().next();
+  }
+
+  public Iterable<String> getSuffixes() {
+    return format.suffixes();
+  }
+
+  public ArchiveOutputStream createArchiveOutputStream(OutputStream o) throws IOException {
+    return (ArchiveOutputStream) this.format.createArchiveOutputStream(o);
+  }
+
+  public <T extends Closeable> void putEntry(T out, String path, byte[] data) throws IOException {
+    @SuppressWarnings("unchecked")
+    ArchiveCommand.Format<T> fmt = (Format<T>) format;
+    fmt.putEntry(
+        out,
+        null,
+        path,
+        FileMode.REGULAR_FILE,
+        new ObjectLoader.SmallObject(FileMode.TYPE_FILE, data));
+  }
+}
diff --git a/java/com/google/gerrit/server/change/BatchAbandon.java b/java/com/google/gerrit/server/change/BatchAbandon.java
new file mode 100644
index 0000000..a8e2407
--- /dev/null
+++ b/java/com/google/gerrit/server/change/BatchAbandon.java
@@ -0,0 +1,110 @@
+// Copyright (C) 2012 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.google.gerrit.server.change;
+
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.ListMultimap;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.api.changes.RecipientType;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.Collection;
+
+@Singleton
+public class BatchAbandon {
+  private final Provider<ReviewDb> dbProvider;
+  private final AbandonOp.Factory abandonOpFactory;
+
+  @Inject
+  BatchAbandon(Provider<ReviewDb> dbProvider, AbandonOp.Factory abandonOpFactory) {
+    this.dbProvider = dbProvider;
+    this.abandonOpFactory = abandonOpFactory;
+  }
+
+  /**
+   * If an extension has more than one changes to abandon that belong to the same project, they
+   * should use the batch instead of abandoning one by one.
+   *
+   * <p>It's the caller's responsibility to ensure that all jobs inside the same batch have the
+   * matching project from its ChangeData. Violations will result in a ResourceConflictException.
+   */
+  public void batchAbandon(
+      BatchUpdate.Factory updateFactory,
+      Project.NameKey project,
+      CurrentUser user,
+      Collection<ChangeData> changes,
+      String msgTxt,
+      NotifyHandling notifyHandling,
+      ListMultimap<RecipientType, Account.Id> accountsToNotify)
+      throws RestApiException, UpdateException {
+    if (changes.isEmpty()) {
+      return;
+    }
+    AccountState accountState = user.isIdentifiedUser() ? user.asIdentifiedUser().state() : null;
+    try (BatchUpdate u = updateFactory.create(dbProvider.get(), project, user, TimeUtil.nowTs())) {
+      for (ChangeData change : changes) {
+        if (!project.equals(change.project())) {
+          throw new ResourceConflictException(
+              String.format(
+                  "Project name \"%s\" doesn't match \"%s\"",
+                  change.project().get(), project.get()));
+        }
+        u.addOp(
+            change.getId(),
+            abandonOpFactory.create(accountState, msgTxt, notifyHandling, accountsToNotify));
+      }
+      u.execute();
+    }
+  }
+
+  public void batchAbandon(
+      BatchUpdate.Factory updateFactory,
+      Project.NameKey project,
+      CurrentUser user,
+      Collection<ChangeData> changes,
+      String msgTxt)
+      throws RestApiException, UpdateException {
+    batchAbandon(
+        updateFactory,
+        project,
+        user,
+        changes,
+        msgTxt,
+        NotifyHandling.ALL,
+        ImmutableListMultimap.of());
+  }
+
+  public void batchAbandon(
+      BatchUpdate.Factory updateFactory,
+      Project.NameKey project,
+      CurrentUser user,
+      Collection<ChangeData> changes)
+      throws RestApiException, UpdateException {
+    batchAbandon(
+        updateFactory, project, user, changes, "", NotifyHandling.ALL, ImmutableListMultimap.of());
+  }
+}
diff --git a/java/com/google/gerrit/server/change/ChangeCleanupRunner.java b/java/com/google/gerrit/server/change/ChangeCleanupRunner.java
new file mode 100644
index 0000000..b24d3ce
--- /dev/null
+++ b/java/com/google/gerrit/server/change/ChangeCleanupRunner.java
@@ -0,0 +1,97 @@
+// Copyright (C) 2015 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.google.gerrit.server.change;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.lifecycle.LifecycleModule;
+import com.google.gerrit.server.config.ChangeCleanupConfig;
+import com.google.gerrit.server.git.WorkQueue;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.ManualRequestContext;
+import com.google.gerrit.server.util.OneOffRequestContext;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+
+/** Runnable to enable scheduling change cleanups to run periodically */
+public class ChangeCleanupRunner implements Runnable {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static class Module extends LifecycleModule {
+    @Override
+    protected void configure() {
+      listener().to(Lifecycle.class);
+    }
+  }
+
+  static class Lifecycle implements LifecycleListener {
+    private final WorkQueue queue;
+    private final ChangeCleanupRunner runner;
+    private final ChangeCleanupConfig cfg;
+
+    @Inject
+    Lifecycle(WorkQueue queue, ChangeCleanupRunner runner, ChangeCleanupConfig cfg) {
+      this.queue = queue;
+      this.runner = runner;
+      this.cfg = cfg;
+    }
+
+    @Override
+    public void start() {
+      cfg.getSchedule().ifPresent(s -> queue.scheduleAtFixedRate(runner, s));
+    }
+
+    @Override
+    public void stop() {
+      // handled by WorkQueue.stop() already
+    }
+  }
+
+  private final OneOffRequestContext oneOffRequestContext;
+  private final AbandonUtil abandonUtil;
+  private final RetryHelper retryHelper;
+
+  @Inject
+  ChangeCleanupRunner(
+      OneOffRequestContext oneOffRequestContext, AbandonUtil abandonUtil, RetryHelper retryHelper) {
+    this.oneOffRequestContext = oneOffRequestContext;
+    this.abandonUtil = abandonUtil;
+    this.retryHelper = retryHelper;
+  }
+
+  @Override
+  public void run() {
+    logger.atInfo().log("Running change cleanups.");
+    try (ManualRequestContext ctx = oneOffRequestContext.open()) {
+      // abandonInactiveOpenChanges skips failures instead of throwing, so retrying will never
+      // actually happen. For the purposes of this class that is fine: they'll get tried again the
+      // next time the scheduled task is run.
+      retryHelper.execute(
+          updateFactory -> {
+            abandonUtil.abandonInactiveOpenChanges(updateFactory);
+            return null;
+          });
+    } catch (RestApiException | UpdateException | OrmException e) {
+      logger.atSevere().withCause(e).log("Failed to cleanup changes.");
+    }
+  }
+
+  @Override
+  public String toString() {
+    return "change cleanup runner";
+  }
+}
diff --git a/java/com/google/gerrit/server/change/ChangeEditResource.java b/java/com/google/gerrit/server/change/ChangeEditResource.java
new file mode 100644
index 0000000..392709e
--- /dev/null
+++ b/java/com/google/gerrit/server/change/ChangeEditResource.java
@@ -0,0 +1,63 @@
+// Copyright (C) 2014 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.google.gerrit.server.change;
+
+import com.google.gerrit.extensions.restapi.RestResource;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.server.edit.ChangeEdit;
+import com.google.inject.TypeLiteral;
+
+/**
+ * Represents change edit resource, that is actually two kinds of resources:
+ *
+ * <ul>
+ *   <li>the change edit itself
+ *   <li>a path within the edit
+ * </ul>
+ *
+ * distinguished by whether path is null or not.
+ */
+public class ChangeEditResource implements RestResource {
+  public static final TypeLiteral<RestView<ChangeEditResource>> CHANGE_EDIT_KIND =
+      new TypeLiteral<RestView<ChangeEditResource>>() {};
+
+  private final ChangeResource change;
+  private final ChangeEdit edit;
+  private final String path;
+
+  public ChangeEditResource(ChangeResource change, ChangeEdit edit, String path) {
+    this.change = change;
+    this.edit = edit;
+    this.path = path;
+  }
+
+  // TODO(davido): Make this cacheable.
+  // Should just depend on the SHA-1 of the edit itself.
+  public boolean isCacheable() {
+    return false;
+  }
+
+  public ChangeResource getChangeResource() {
+    return change;
+  }
+
+  public ChangeEdit getChangeEdit() {
+    return edit;
+  }
+
+  public String getPath() {
+    return path;
+  }
+}
diff --git a/java/com/google/gerrit/server/change/ChangeFinder.java b/java/com/google/gerrit/server/change/ChangeFinder.java
new file mode 100644
index 0000000..41d89ed
--- /dev/null
+++ b/java/com/google/gerrit/server/change/ChangeFinder.java
@@ -0,0 +1,280 @@
+// 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.
+
+package com.google.gerrit.server.change;
+
+import com.google.common.base.Throwables;
+import com.google.common.cache.Cache;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+import com.google.common.primitives.Ints;
+import com.google.gerrit.extensions.restapi.DeprecatedIdentifierException;
+import com.google.gerrit.extensions.restapi.Url;
+import com.google.gerrit.index.IndexConfig;
+import com.google.gerrit.metrics.Counter1;
+import com.google.gerrit.metrics.Description;
+import com.google.gerrit.metrics.Field;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RevId;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.cache.CacheModule;
+import com.google.gerrit.server.config.ConfigUtil;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Module;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import com.google.inject.name.Named;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.Config;
+
+@Singleton
+public class ChangeFinder {
+  private static final String CACHE_NAME = "changeid_project";
+
+  public static Module module() {
+    return new CacheModule() {
+      @Override
+      protected void configure() {
+        cache(CACHE_NAME, Change.Id.class, String.class).maximumWeight(1024);
+      }
+    };
+  }
+
+  public enum ChangeIdType {
+    ALL,
+    TRIPLET,
+    NUMERIC_ID,
+    I_HASH,
+    PROJECT_NUMERIC_ID,
+    COMMIT_HASH
+  }
+
+  private final IndexConfig indexConfig;
+  private final Cache<Change.Id, String> changeIdProjectCache;
+  private final Provider<InternalChangeQuery> queryProvider;
+  private final Provider<ReviewDb> reviewDb;
+  private final ChangeNotes.Factory changeNotesFactory;
+  private final Counter1<ChangeIdType> changeIdCounter;
+  private final ImmutableSet<ChangeIdType> allowedIdTypes;
+
+  @Inject
+  ChangeFinder(
+      IndexConfig indexConfig,
+      @Named(CACHE_NAME) Cache<Change.Id, String> changeIdProjectCache,
+      Provider<InternalChangeQuery> queryProvider,
+      Provider<ReviewDb> reviewDb,
+      ChangeNotes.Factory changeNotesFactory,
+      MetricMaker metricMaker,
+      @GerritServerConfig Config config) {
+    this.indexConfig = indexConfig;
+    this.changeIdProjectCache = changeIdProjectCache;
+    this.queryProvider = queryProvider;
+    this.reviewDb = reviewDb;
+    this.changeNotesFactory = changeNotesFactory;
+    this.changeIdCounter =
+        metricMaker.newCounter(
+            "http/server/rest_api/change_id_type",
+            new Description("Total number of API calls per identifier type.")
+                .setRate()
+                .setUnit("requests"),
+            Field.ofEnum(ChangeIdType.class, "change_id_type"));
+    List<ChangeIdType> configuredChangeIdTypes =
+        ConfigUtil.getEnumList(config, "change", "api", "allowedIdentifier", ChangeIdType.ALL);
+    // Ensure that PROJECT_NUMERIC_ID can't be removed
+    configuredChangeIdTypes.add(ChangeIdType.PROJECT_NUMERIC_ID);
+    this.allowedIdTypes = ImmutableSet.copyOf(configuredChangeIdTypes);
+  }
+
+  public ChangeNotes findOne(String id) throws OrmException {
+    List<ChangeNotes> ctls = find(id);
+    if (ctls.size() != 1) {
+      return null;
+    }
+    return ctls.get(0);
+  }
+
+  /**
+   * Find changes matching the given identifier.
+   *
+   * @param id change identifier.
+   * @return possibly-empty list of notes for all matching changes; may or may not be visible.
+   * @throws OrmException if an error occurred querying the database.
+   */
+  public List<ChangeNotes> find(String id) throws OrmException {
+    try {
+      return find(id, false);
+    } catch (DeprecatedIdentifierException e) {
+      // This can't happen because we don't enforce deprecation
+      throw new OrmException(e);
+    }
+  }
+
+  /**
+   * Find changes matching the given identifier.
+   *
+   * @param id change identifier.
+   * @param enforceDeprecation boolean to see if we should throw {@link
+   *     DeprecatedIdentifierException} in case the identifier is deprecated
+   * @return possibly-empty list of notes for all matching changes; may or may not be visible.
+   * @throws OrmException if an error occurred querying the database
+   * @throws DeprecatedIdentifierException if the identifier is deprecated.
+   */
+  public List<ChangeNotes> find(String id, boolean enforceDeprecation)
+      throws OrmException, DeprecatedIdentifierException {
+    if (id.isEmpty()) {
+      return Collections.emptyList();
+    }
+
+    int z = id.lastIndexOf('~');
+    int y = id.lastIndexOf('~', z - 1);
+    if (y < 0 && z > 0) {
+      // Try project~numericChangeId
+      Integer n = Ints.tryParse(id.substring(z + 1));
+      if (n != null) {
+        checkIdType(ChangeIdType.PROJECT_NUMERIC_ID, enforceDeprecation, n.toString());
+        return fromProjectNumber(id.substring(0, z), n.intValue());
+      }
+    }
+
+    if (y < 0 && z < 0) {
+      // Try numeric changeId
+      Integer n = Ints.tryParse(id);
+      if (n != null) {
+        checkIdType(ChangeIdType.NUMERIC_ID, enforceDeprecation, n.toString());
+        return find(new Change.Id(n));
+      }
+    }
+
+    // Use the index to search for changes, but don't return any stored fields,
+    // to force rereading in case the index is stale.
+    InternalChangeQuery query = queryProvider.get().noFields();
+
+    // Try commit hash
+    if (id.matches("^([0-9a-fA-F]{" + RevId.ABBREV_LEN + "," + RevId.LEN + "})$")) {
+      checkIdType(ChangeIdType.COMMIT_HASH, enforceDeprecation, id);
+      return asChangeNotes(query.byCommit(id));
+    }
+
+    if (y > 0 && z > 0) {
+      // Try change triplet (project~branch~Ihash...)
+      Optional<ChangeTriplet> triplet = ChangeTriplet.parse(id, y, z);
+      if (triplet.isPresent()) {
+        ChangeTriplet t = triplet.get();
+        checkIdType(ChangeIdType.TRIPLET, enforceDeprecation, triplet.get().toString());
+        return asChangeNotes(query.byBranchKey(t.branch(), t.id()));
+      }
+    }
+
+    // Try isolated Ihash... format ("Change-Id: Ihash").
+    List<ChangeNotes> notes = asChangeNotes(query.byKeyPrefix(id));
+    if (!notes.isEmpty()) {
+      checkIdType(ChangeIdType.I_HASH, enforceDeprecation, id);
+    }
+    return notes;
+  }
+
+  private List<ChangeNotes> fromProjectNumber(String project, int changeNumber)
+      throws OrmException {
+    Change.Id cId = new Change.Id(changeNumber);
+    try {
+      return ImmutableList.of(
+          changeNotesFactory.createChecked(reviewDb.get(), Project.NameKey.parse(project), cId));
+    } catch (NoSuchChangeException e) {
+      return Collections.emptyList();
+    } catch (OrmException e) {
+      // Distinguish between a RepositoryNotFoundException (project argument invalid) and
+      // other OrmExceptions (failure in the persistence layer).
+      if (Throwables.getRootCause(e) instanceof RepositoryNotFoundException) {
+        return Collections.emptyList();
+      }
+      throw e;
+    }
+  }
+
+  public ChangeNotes findOne(Change.Id id) throws OrmException {
+    List<ChangeNotes> notes = find(id);
+    if (notes.size() != 1) {
+      throw new NoSuchChangeException(id);
+    }
+    return notes.get(0);
+  }
+
+  public List<ChangeNotes> find(Change.Id id) throws OrmException {
+    String project = changeIdProjectCache.getIfPresent(id);
+    if (project != null) {
+      return fromProjectNumber(project, id.get());
+    }
+
+    // Use the index to search for changes, but don't return any stored fields,
+    // to force rereading in case the index is stale.
+    InternalChangeQuery query = queryProvider.get().noFields();
+    List<ChangeData> r = query.byLegacyChangeId(id);
+    if (r.size() == 1) {
+      changeIdProjectCache.put(id, Url.encode(r.get(0).project().get()));
+    }
+    return asChangeNotes(r);
+  }
+
+  private List<ChangeNotes> asChangeNotes(List<ChangeData> cds) throws OrmException {
+    List<ChangeNotes> notes = new ArrayList<>(cds.size());
+    if (!indexConfig.separateChangeSubIndexes()) {
+      for (ChangeData cd : cds) {
+        notes.add(cd.notes());
+      }
+      return notes;
+    }
+
+    // If an index implementation uses separate non-atomic subindexes, it's possible to temporarily
+    // observe a change as present in both subindexes, if this search is concurrent with a write.
+    // Dedup to avoid confusing the caller. We can choose an arbitrary ChangeData instance because
+    // the index results have no stored fields, so the data is already reloaded. (It's also possible
+    // that a change might appear in zero subindexes, but there's nothing we can do here to help
+    // this case.)
+    Set<Change.Id> seen = Sets.newHashSetWithExpectedSize(cds.size());
+    for (ChangeData cd : cds) {
+      if (seen.add(cd.getId())) {
+        notes.add(cd.notes());
+      }
+    }
+    return notes;
+  }
+
+  private void checkIdType(ChangeIdType type, boolean enforceDeprecation, String val)
+      throws DeprecatedIdentifierException {
+    if (enforceDeprecation
+        && !allowedIdTypes.contains(ChangeIdType.ALL)
+        && !allowedIdTypes.contains(type)) {
+      throw new DeprecatedIdentifierException(
+          String.format(
+              "The provided change identifier %s is deprecated. "
+                  + "Use 'project~changeNumber' instead.",
+              val));
+    }
+    changeIdCounter.increment(type);
+  }
+}
diff --git a/java/com/google/gerrit/server/change/ChangeInserter.java b/java/com/google/gerrit/server/change/ChangeInserter.java
new file mode 100644
index 0000000..80d05df
--- /dev/null
+++ b/java/com/google/gerrit/server/change/ChangeInserter.java
@@ -0,0 +1,596 @@
+// Copyright (C) 2013 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.google.gerrit.server.change;
+
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static com.google.common.collect.ImmutableSet.toImmutableSet;
+import static com.google.gerrit.reviewdb.client.Change.INITIAL_PATCH_SET_ID;
+import static com.google.gerrit.server.change.ReviewerAdder.newAddReviewerInputFromCommitIdentity;
+import static com.google.gerrit.server.notedb.ReviewerStateInternal.REVIEWER;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Streams;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.FooterConstants;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.LabelTypes;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.api.changes.RecipientType;
+import com.google.gerrit.extensions.client.ReviewerState;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.client.PatchSetInfo;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.change.ReviewerAdder.InternalAddReviewerInput;
+import com.google.gerrit.server.change.ReviewerAdder.ReviewerAddition;
+import com.google.gerrit.server.change.ReviewerAdder.ReviewerAdditionList;
+import com.google.gerrit.server.config.SendEmailExecutor;
+import com.google.gerrit.server.events.CommitReceivedEvent;
+import com.google.gerrit.server.extensions.events.CommentAdded;
+import com.google.gerrit.server.extensions.events.RevisionCreated;
+import com.google.gerrit.server.git.GroupCollector;
+import com.google.gerrit.server.git.validators.CommitValidationException;
+import com.google.gerrit.server.git.validators.CommitValidators;
+import com.google.gerrit.server.mail.send.CreateChangeSender;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.server.patch.PatchSetInfoFactory;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.ssh.NoSshInfo;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.Context;
+import com.google.gerrit.server.update.InsertChangeOp;
+import com.google.gerrit.server.update.RepoContext;
+import com.google.gerrit.server.util.RequestScopePropagator;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.ReceiveCommand;
+import org.eclipse.jgit.util.ChangeIdUtil;
+
+public class ChangeInserter implements InsertChangeOp {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public interface Factory {
+    ChangeInserter create(Change.Id cid, ObjectId commitId, String refName);
+  }
+
+  private final PermissionBackend permissionBackend;
+  private final ProjectCache projectCache;
+  private final PatchSetInfoFactory patchSetInfoFactory;
+  private final PatchSetUtil psUtil;
+  private final ApprovalsUtil approvalsUtil;
+  private final ChangeMessagesUtil cmUtil;
+  private final CreateChangeSender.Factory createChangeSenderFactory;
+  private final ExecutorService sendEmailExecutor;
+  private final CommitValidators.Factory commitValidatorsFactory;
+  private final RevisionCreated revisionCreated;
+  private final CommentAdded commentAdded;
+  private final ReviewerAdder reviewerAdder;
+
+  private final Change.Id changeId;
+  private final PatchSet.Id psId;
+  private final ObjectId commitId;
+  private final String refName;
+
+  // Fields exposed as setters.
+  private Change.Status status;
+  private String topic;
+  private String message;
+  private String patchSetDescription;
+  private boolean isPrivate;
+  private boolean workInProgress;
+  private List<String> groups = Collections.emptyList();
+  private boolean validate = true;
+  private NotifyHandling notify = NotifyHandling.ALL;
+  private ListMultimap<RecipientType, Account.Id> accountsToNotify = ImmutableListMultimap.of();
+  private Map<String, Short> approvals;
+  private RequestScopePropagator requestScopePropagator;
+  private boolean fireRevisionCreated;
+  private boolean sendMail;
+  private boolean updateRef;
+  private Change.Id revertOf;
+  private ImmutableList<InternalAddReviewerInput> reviewerInputs;
+
+  // Fields set during the insertion process.
+  private ReceiveCommand cmd;
+  private Change change;
+  private ChangeMessage changeMessage;
+  private PatchSetInfo patchSetInfo;
+  private PatchSet patchSet;
+  private String pushCert;
+  private ProjectState projectState;
+  private ReviewerAdditionList reviewerAdditions;
+
+  @Inject
+  ChangeInserter(
+      PermissionBackend permissionBackend,
+      ProjectCache projectCache,
+      PatchSetInfoFactory patchSetInfoFactory,
+      PatchSetUtil psUtil,
+      ApprovalsUtil approvalsUtil,
+      ChangeMessagesUtil cmUtil,
+      CreateChangeSender.Factory createChangeSenderFactory,
+      @SendEmailExecutor ExecutorService sendEmailExecutor,
+      CommitValidators.Factory commitValidatorsFactory,
+      CommentAdded commentAdded,
+      RevisionCreated revisionCreated,
+      ReviewerAdder reviewerAdder,
+      @Assisted Change.Id changeId,
+      @Assisted ObjectId commitId,
+      @Assisted String refName) {
+    this.permissionBackend = permissionBackend;
+    this.projectCache = projectCache;
+    this.patchSetInfoFactory = patchSetInfoFactory;
+    this.psUtil = psUtil;
+    this.approvalsUtil = approvalsUtil;
+    this.cmUtil = cmUtil;
+    this.createChangeSenderFactory = createChangeSenderFactory;
+    this.sendEmailExecutor = sendEmailExecutor;
+    this.commitValidatorsFactory = commitValidatorsFactory;
+    this.revisionCreated = revisionCreated;
+    this.commentAdded = commentAdded;
+    this.reviewerAdder = reviewerAdder;
+
+    this.changeId = changeId;
+    this.psId = new PatchSet.Id(changeId, INITIAL_PATCH_SET_ID);
+    this.commitId = commitId.copy();
+    this.refName = refName;
+    this.reviewerInputs = ImmutableList.of();
+    this.approvals = Collections.emptyMap();
+    this.fireRevisionCreated = true;
+    this.sendMail = true;
+    this.updateRef = true;
+  }
+
+  @Override
+  public Change createChange(Context ctx) throws IOException {
+    change =
+        new Change(
+            getChangeKey(ctx.getRevWalk(), commitId),
+            changeId,
+            ctx.getAccountId(),
+            new Branch.NameKey(ctx.getProject(), refName),
+            ctx.getWhen());
+    change.setStatus(MoreObjects.firstNonNull(status, Change.Status.NEW));
+    change.setTopic(topic);
+    change.setPrivate(isPrivate);
+    change.setWorkInProgress(workInProgress);
+    change.setReviewStarted(!workInProgress);
+    change.setRevertOf(revertOf);
+    return change;
+  }
+
+  private static Change.Key getChangeKey(RevWalk rw, ObjectId id) throws IOException {
+    RevCommit commit = rw.parseCommit(id);
+    rw.parseBody(commit);
+    List<String> idList = commit.getFooterLines(FooterConstants.CHANGE_ID);
+    if (!idList.isEmpty()) {
+      return new Change.Key(idList.get(idList.size() - 1).trim());
+    }
+    ObjectId changeId =
+        ChangeIdUtil.computeChangeId(
+            commit.getTree(),
+            commit,
+            commit.getAuthorIdent(),
+            commit.getCommitterIdent(),
+            commit.getShortMessage());
+    StringBuilder changeIdStr = new StringBuilder();
+    changeIdStr.append("I").append(ObjectId.toString(changeId));
+    return new Change.Key(changeIdStr.toString());
+  }
+
+  public PatchSet.Id getPatchSetId() {
+    return psId;
+  }
+
+  public ObjectId getCommitId() {
+    return commitId;
+  }
+
+  public Change getChange() {
+    checkState(change != null, "getChange() only valid after creating change");
+    return change;
+  }
+
+  public ChangeInserter setTopic(String topic) {
+    checkState(change == null, "setTopic(String) only valid before creating change");
+    this.topic = topic;
+    return this;
+  }
+
+  public ChangeInserter setMessage(String message) {
+    this.message = message;
+    return this;
+  }
+
+  public ChangeInserter setPatchSetDescription(String patchSetDescription) {
+    this.patchSetDescription = patchSetDescription;
+    return this;
+  }
+
+  public ChangeInserter setValidate(boolean validate) {
+    this.validate = validate;
+    return this;
+  }
+
+  public ChangeInserter setNotify(NotifyHandling notify) {
+    this.notify = notify;
+    return this;
+  }
+
+  public ChangeInserter setAccountsToNotify(
+      ListMultimap<RecipientType, Account.Id> accountsToNotify) {
+    this.accountsToNotify = requireNonNull(accountsToNotify);
+    return this;
+  }
+
+  public ChangeInserter setReviewersAndCcs(
+      Iterable<Account.Id> reviewers, Iterable<Account.Id> ccs) {
+    return setReviewersAndCcsAsStrings(
+        Iterables.transform(reviewers, Account.Id::toString),
+        Iterables.transform(ccs, Account.Id::toString));
+  }
+
+  public ChangeInserter setReviewersAndCcsAsStrings(
+      Iterable<String> reviewers, Iterable<String> ccs) {
+    reviewerInputs =
+        Streams.concat(
+                Streams.stream(reviewers)
+                    .distinct()
+                    .map(id -> newAddReviewerInput(id, ReviewerState.REVIEWER)),
+                Streams.stream(ccs).distinct().map(id -> newAddReviewerInput(id, ReviewerState.CC)))
+            .collect(toImmutableList());
+    return this;
+  }
+
+  public ChangeInserter setPrivate(boolean isPrivate) {
+    checkState(change == null, "setPrivate(boolean) only valid before creating change");
+    this.isPrivate = isPrivate;
+    return this;
+  }
+
+  public ChangeInserter setWorkInProgress(boolean workInProgress) {
+    this.workInProgress = workInProgress;
+    return this;
+  }
+
+  public ChangeInserter setStatus(Change.Status status) {
+    checkState(change == null, "setStatus(Change.Status) only valid before creating change");
+    this.status = status;
+    return this;
+  }
+
+  public ChangeInserter setGroups(List<String> groups) {
+    requireNonNull(groups, "groups may not be empty");
+    checkState(patchSet == null, "setGroups(Iterable<String>) only valid before creating change");
+    this.groups = groups;
+    return this;
+  }
+
+  public ChangeInserter setFireRevisionCreated(boolean fireRevisionCreated) {
+    this.fireRevisionCreated = fireRevisionCreated;
+    return this;
+  }
+
+  public ChangeInserter setSendMail(boolean sendMail) {
+    this.sendMail = sendMail;
+    return this;
+  }
+
+  public ChangeInserter setRequestScopePropagator(RequestScopePropagator r) {
+    this.requestScopePropagator = r;
+    return this;
+  }
+
+  public ChangeInserter setRevertOf(Change.Id revertOf) {
+    this.revertOf = revertOf;
+    return this;
+  }
+
+  public void setPushCertificate(String cert) {
+    pushCert = cert;
+  }
+
+  public PatchSet getPatchSet() {
+    checkState(patchSet != null, "getPatchSet() only valid after creating change");
+    return patchSet;
+  }
+
+  public ChangeInserter setApprovals(Map<String, Short> approvals) {
+    this.approvals = approvals;
+    return this;
+  }
+
+  /**
+   * Set whether to include the new patch set ref update in this update.
+   *
+   * <p>If false, the caller is responsible for creating the patch set ref <strong>before</strong>
+   * executing the containing {@code BatchUpdate}.
+   *
+   * <p>Should not be used in new code, as it doesn't result in a single atomic batch ref update for
+   * code and NoteDb meta refs.
+   *
+   * @param updateRef whether to update the ref during {@code updateRepo}.
+   */
+  @Deprecated
+  public ChangeInserter setUpdateRef(boolean updateRef) {
+    this.updateRef = updateRef;
+    return this;
+  }
+
+  public ChangeMessage getChangeMessage() {
+    if (message == null) {
+      return null;
+    }
+    checkState(changeMessage != null, "getChangeMessage() only valid after inserting change");
+    return changeMessage;
+  }
+
+  public ReceiveCommand getCommand() {
+    return cmd;
+  }
+
+  @Override
+  public void updateRepo(RepoContext ctx) throws ResourceConflictException, IOException {
+    cmd = new ReceiveCommand(ObjectId.zeroId(), commitId, psId.toRefName());
+    projectState = projectCache.checkedGet(ctx.getProject());
+    validate(ctx);
+    if (!updateRef) {
+      return;
+    }
+    ctx.addRefUpdate(cmd);
+  }
+
+  @Override
+  public boolean updateChange(ChangeContext ctx)
+      throws RestApiException, OrmException, IOException, PermissionBackendException,
+          ConfigInvalidException {
+    change = ctx.getChange(); // Use defensive copy created by ChangeControl.
+    ReviewDb db = ctx.getDb();
+    patchSetInfo =
+        patchSetInfoFactory.get(ctx.getRevWalk(), ctx.getRevWalk().parseCommit(commitId), psId);
+    ctx.getChange().setCurrentPatchSet(patchSetInfo);
+
+    ChangeUpdate update = ctx.getUpdate(psId);
+    update.setChangeId(change.getKey().get());
+    update.setSubjectForCommit("Create change");
+    update.setBranch(change.getDest().get());
+    update.setTopic(change.getTopic());
+    update.setPsDescription(patchSetDescription);
+    update.setPrivate(isPrivate);
+    update.setWorkInProgress(workInProgress);
+    if (revertOf != null) {
+      update.setRevertOf(revertOf.get());
+    }
+
+    List<String> newGroups = groups;
+    if (newGroups.isEmpty()) {
+      newGroups = GroupCollector.getDefaultGroups(commitId);
+    }
+    patchSet =
+        psUtil.insert(
+            ctx.getDb(),
+            ctx.getRevWalk(),
+            update,
+            psId,
+            commitId,
+            newGroups,
+            pushCert,
+            patchSetDescription);
+
+    /* TODO: fixStatus is used here because the tests
+     * (byStatusClosed() in AbstractQueryChangesTest)
+     * insert changes that are already merged,
+     * and setStatus may not be used to set the Status to merged
+     *
+     * is it possible to make the tests use the merge code path,
+     * instead of setting the status directly?
+     */
+    update.fixStatus(change.getStatus());
+
+    reviewerAdditions =
+        reviewerAdder.prepare(
+            ctx.getDb(), ctx.getNotes(), ctx.getUser(), getReviewerInputs(), true);
+    Optional<ReviewerAddition> reviewerError = reviewerAdditions.getFailures().stream().findFirst();
+    if (reviewerError.isPresent()) {
+      throw new UnprocessableEntityException(reviewerError.get().result.error);
+    }
+    reviewerAdditions.updateChange(ctx, patchSet);
+
+    LabelTypes labelTypes = projectState.getLabelTypes();
+    approvalsUtil.addApprovalsForNewPatchSet(
+        db, update, labelTypes, patchSet, ctx.getUser(), approvals);
+
+    // Check if approvals are changing in with this update. If so, add current user to reviewers.
+    // Note that this is done separately as addReviewers is filtering out the change owner as
+    // reviewer which is needed in several other code paths.
+    // TODO(dborowitz): Still necessary?
+    if (!approvals.isEmpty()) {
+      update.putReviewer(ctx.getAccountId(), REVIEWER);
+    }
+    if (message != null) {
+      changeMessage =
+          ChangeMessagesUtil.newMessage(
+              patchSet.getId(),
+              ctx.getUser(),
+              patchSet.getCreatedOn(),
+              message,
+              ChangeMessagesUtil.uploadedPatchSetTag(workInProgress));
+      cmUtil.addChangeMessage(db, update, changeMessage);
+    }
+    return true;
+  }
+
+  @Override
+  public void postUpdate(Context ctx) throws Exception {
+    reviewerAdditions.postUpdate(ctx);
+    if (sendMail && (notify != NotifyHandling.NONE || !accountsToNotify.isEmpty())) {
+      Runnable sender =
+          new Runnable() {
+            @Override
+            public void run() {
+              try {
+                CreateChangeSender cm =
+                    createChangeSenderFactory.create(change.getProject(), change.getId());
+                cm.setFrom(change.getOwner());
+                cm.setPatchSet(patchSet, patchSetInfo);
+                cm.setNotify(notify);
+                cm.setAccountsToNotify(accountsToNotify);
+                cm.addReviewers(
+                    reviewerAdditions.flattenResults(AddReviewersOp.Result::addedReviewers).stream()
+                        .map(PatchSetApproval::getAccountId)
+                        .collect(toImmutableSet()));
+                cm.addReviewersByEmail(
+                    reviewerAdditions.flattenResults(AddReviewersOp.Result::addedReviewersByEmail));
+                cm.addExtraCC(reviewerAdditions.flattenResults(AddReviewersOp.Result::addedCCs));
+                cm.addExtraCCByEmail(
+                    reviewerAdditions.flattenResults(AddReviewersOp.Result::addedCCsByEmail));
+                cm.send();
+              } catch (Exception e) {
+                logger.atSevere().withCause(e).log(
+                    "Cannot send email for new change %s", change.getId());
+              }
+            }
+
+            @Override
+            public String toString() {
+              return "send-email newchange";
+            }
+          };
+      if (requestScopePropagator != null) {
+        @SuppressWarnings("unused")
+        Future<?> possiblyIgnoredError =
+            sendEmailExecutor.submit(requestScopePropagator.wrap(sender));
+      } else {
+        sender.run();
+      }
+    }
+
+    /* For labels that are not set in this operation, show the "current" value
+     * of 0, and no oldValue as the value was not modified by this operation.
+     * For labels that are set in this operation, the value was modified, so
+     * show a transition from an oldValue of 0 to the new value.
+     */
+    if (fireRevisionCreated) {
+      revisionCreated.fire(change, patchSet, ctx.getAccount(), ctx.getWhen(), notify);
+      if (approvals != null && !approvals.isEmpty()) {
+        List<LabelType> labels = projectState.getLabelTypes(change.getDest()).getLabelTypes();
+        Map<String, Short> allApprovals = new HashMap<>();
+        Map<String, Short> oldApprovals = new HashMap<>();
+        for (LabelType lt : labels) {
+          allApprovals.put(lt.getName(), (short) 0);
+          oldApprovals.put(lt.getName(), null);
+        }
+        for (Map.Entry<String, Short> entry : approvals.entrySet()) {
+          if (entry.getValue() != 0) {
+            allApprovals.put(entry.getKey(), entry.getValue());
+            oldApprovals.put(entry.getKey(), (short) 0);
+          }
+        }
+        commentAdded.fire(
+            change, patchSet, ctx.getAccount(), null, allApprovals, oldApprovals, ctx.getWhen());
+      }
+    }
+  }
+
+  private void validate(RepoContext ctx) throws IOException, ResourceConflictException {
+    if (!validate) {
+      return;
+    }
+
+    try {
+      try (CommitReceivedEvent event =
+          new CommitReceivedEvent(
+              cmd,
+              projectState.getProject(),
+              change.getDest().get(),
+              ctx.getRevWalk().getObjectReader(),
+              commitId,
+              ctx.getIdentifiedUser())) {
+        commitValidatorsFactory
+            .forGerritCommits(
+                permissionBackend.user(ctx.getUser()).project(ctx.getProject()),
+                new Branch.NameKey(ctx.getProject(), refName),
+                ctx.getIdentifiedUser(),
+                new NoSshInfo(),
+                ctx.getRevWalk(),
+                change)
+            .validate(event);
+      }
+    } catch (CommitValidationException e) {
+      throw new ResourceConflictException(e.getFullMessage());
+    }
+  }
+
+  private static InternalAddReviewerInput newAddReviewerInput(
+      String reviewer, ReviewerState state) {
+    // Disable individual emails when adding reviewers, as all reviewers will receive the single
+    // bulk new change email.
+    InternalAddReviewerInput input =
+        ReviewerAdder.newAddReviewerInput(reviewer, state, NotifyHandling.NONE);
+
+    // Ignore failures for reasons like the reviewer being inactive or being unable to see the
+    // change. This is required for the push path, where it automatically sets reviewers from
+    // certain commit footers: putting a nonexistent user in a footer should not cause an error. In
+    // theory we could provide finer control to do this for some reviewers and not others, but it's
+    // not worth complicating the ChangeInserter interface further at this time.
+    input.otherFailureBehavior = ReviewerAdder.FailureBehavior.IGNORE;
+
+    return input;
+  }
+
+  private ImmutableList<InternalAddReviewerInput> getReviewerInputs() {
+    return Streams.concat(
+            reviewerInputs.stream(),
+            Streams.stream(
+                newAddReviewerInputFromCommitIdentity(
+                    change, patchSetInfo.getAuthor().getAccount(), NotifyHandling.NONE)),
+            Streams.stream(
+                newAddReviewerInputFromCommitIdentity(
+                    change, patchSetInfo.getCommitter().getAccount(), NotifyHandling.NONE)))
+        .collect(toImmutableList());
+  }
+}
diff --git a/java/com/google/gerrit/server/change/ChangeJson.java b/java/com/google/gerrit/server/change/ChangeJson.java
new file mode 100644
index 0000000..05cd235
--- /dev/null
+++ b/java/com/google/gerrit/server/change/ChangeJson.java
@@ -0,0 +1,808 @@
+// Copyright (C) 2012 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.google.gerrit.server.change;
+
+import static com.google.gerrit.extensions.client.ListChangesOption.ALL_COMMITS;
+import static com.google.gerrit.extensions.client.ListChangesOption.ALL_REVISIONS;
+import static com.google.gerrit.extensions.client.ListChangesOption.CHANGE_ACTIONS;
+import static com.google.gerrit.extensions.client.ListChangesOption.CHECK;
+import static com.google.gerrit.extensions.client.ListChangesOption.COMMIT_FOOTERS;
+import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_ACTIONS;
+import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_COMMIT;
+import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_REVISION;
+import static com.google.gerrit.extensions.client.ListChangesOption.DETAILED_ACCOUNTS;
+import static com.google.gerrit.extensions.client.ListChangesOption.DETAILED_LABELS;
+import static com.google.gerrit.extensions.client.ListChangesOption.LABELS;
+import static com.google.gerrit.extensions.client.ListChangesOption.MESSAGES;
+import static com.google.gerrit.extensions.client.ListChangesOption.REVIEWED;
+import static com.google.gerrit.extensions.client.ListChangesOption.REVIEWER_UPDATES;
+import static com.google.gerrit.extensions.client.ListChangesOption.SKIP_MERGEABLE;
+import static com.google.gerrit.extensions.client.ListChangesOption.SUBMITTABLE;
+import static com.google.gerrit.extensions.client.ListChangesOption.TRACKING_IDS;
+import static com.google.gerrit.server.ChangeMessagesUtil.createChangeMessageInfo;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.base.Joiner;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Throwables;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.SubmitRecord;
+import com.google.gerrit.common.data.SubmitRecord.Status;
+import com.google.gerrit.common.data.SubmitRequirement;
+import com.google.gerrit.common.data.SubmitTypeRecord;
+import com.google.gerrit.extensions.api.changes.FixInput;
+import com.google.gerrit.extensions.client.ListChangesOption;
+import com.google.gerrit.extensions.client.ReviewerState;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.ApprovalInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.ChangeMessageInfo;
+import com.google.gerrit.extensions.common.LabelInfo;
+import com.google.gerrit.extensions.common.ProblemInfo;
+import com.google.gerrit.extensions.common.ReviewerUpdateInfo;
+import com.google.gerrit.extensions.common.RevisionInfo;
+import com.google.gerrit.extensions.common.SubmitRequirementInfo;
+import com.google.gerrit.extensions.common.TrackingIdInfo;
+import com.google.gerrit.extensions.restapi.Url;
+import com.google.gerrit.index.query.QueryResult;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.metrics.Description;
+import com.google.gerrit.metrics.Description.Units;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.metrics.Timer0;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.GpgException;
+import com.google.gerrit.server.ReviewerByEmailSet;
+import com.google.gerrit.server.ReviewerSet;
+import com.google.gerrit.server.ReviewerStatusUpdate;
+import com.google.gerrit.server.StarredChangesUtil;
+import com.google.gerrit.server.account.AccountInfoComparator;
+import com.google.gerrit.server.account.AccountLoader;
+import com.google.gerrit.server.config.TrackingFooters;
+import com.google.gerrit.server.index.change.ChangeField;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.ReviewerStateInternal;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.RemoveReviewerControl;
+import com.google.gerrit.server.project.SubmitRuleOptions;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.ChangeData.ChangedLines;
+import com.google.gerrit.server.query.change.PluginDefinedAttributesFactory;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.Supplier;
+
+/**
+ * Produces {@link ChangeInfo} (which is serialized to JSON afterwards) from {@link ChangeData}.
+ *
+ * <p>This is intended to be used on request scope, but may be used for converting multiple {@link
+ * ChangeData} objects from different sources.
+ */
+public class ChangeJson {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static final SubmitRuleOptions SUBMIT_RULE_OPTIONS_LENIENT =
+      ChangeField.SUBMIT_RULE_OPTIONS_LENIENT.toBuilder().build();
+
+  public static final SubmitRuleOptions SUBMIT_RULE_OPTIONS_STRICT =
+      ChangeField.SUBMIT_RULE_OPTIONS_STRICT.toBuilder().build();
+
+  static final ImmutableSet<ListChangesOption> REQUIRE_LAZY_LOAD =
+      ImmutableSet.of(
+          ALL_COMMITS,
+          ALL_REVISIONS,
+          CHANGE_ACTIONS,
+          CHECK,
+          COMMIT_FOOTERS,
+          CURRENT_ACTIONS,
+          CURRENT_COMMIT,
+          MESSAGES);
+
+  @Singleton
+  public static class Factory {
+    private final AssistedFactory factory;
+
+    @Inject
+    Factory(AssistedFactory factory) {
+      this.factory = factory;
+    }
+
+    public ChangeJson noOptions() {
+      return create(ImmutableSet.of());
+    }
+
+    public ChangeJson create(Iterable<ListChangesOption> options) {
+      return factory.create(options, Optional.empty());
+    }
+
+    public ChangeJson create(
+        Iterable<ListChangesOption> options,
+        PluginDefinedAttributesFactory pluginDefinedAttributesFactory) {
+      return factory.create(options, Optional.of(pluginDefinedAttributesFactory));
+    }
+
+    public ChangeJson create(ListChangesOption first, ListChangesOption... rest) {
+      return create(Sets.immutableEnumSet(first, rest));
+    }
+  }
+
+  public interface AssistedFactory {
+    ChangeJson create(
+        Iterable<ListChangesOption> options,
+        Optional<PluginDefinedAttributesFactory> pluginDefinedAttributesFactory);
+  }
+
+  @Singleton
+  private static class Metrics {
+    private final Timer0 toChangeInfoLatency;
+    private final Timer0 toChangeInfosLatency;
+    private final Timer0 formatQueryResultsLatency;
+
+    @Inject
+    Metrics(MetricMaker metricMaker) {
+      toChangeInfoLatency =
+          metricMaker.newTimer(
+              "http/server/rest_api/change_json/to_change_info_latency",
+              new Description("Latency for toChangeInfo invocations in ChangeJson")
+                  .setCumulative()
+                  .setUnit(Units.MILLISECONDS));
+      toChangeInfosLatency =
+          metricMaker.newTimer(
+              "http/server/rest_api/change_json/to_change_infos_latency",
+              new Description("Latency for toChangeInfos invocations in ChangeJson")
+                  .setCumulative()
+                  .setUnit(Units.MILLISECONDS));
+      formatQueryResultsLatency =
+          metricMaker.newTimer(
+              "http/server/rest_api/change_json/format_query_results_latency",
+              new Description("Latency for formatQueryResults invocations in ChangeJson")
+                  .setCumulative()
+                  .setUnit(Units.MILLISECONDS));
+    }
+  }
+
+  private final Provider<ReviewDb> db;
+  private final Provider<CurrentUser> userProvider;
+  private final PermissionBackend permissionBackend;
+  private final ChangeData.Factory changeDataFactory;
+  private final AccountLoader.Factory accountLoaderFactory;
+  private final ImmutableSet<ListChangesOption> options;
+  private final ChangeMessagesUtil cmUtil;
+  private final Provider<ConsistencyChecker> checkerProvider;
+  private final ActionJson actionJson;
+  private final ChangeNotes.Factory notesFactory;
+  private final LabelsJson labelsJson;
+  private final RemoveReviewerControl removeReviewerControl;
+  private final TrackingFooters trackingFooters;
+  private final Metrics metrics;
+  private final RevisionJson revisionJson;
+  private final Optional<PluginDefinedAttributesFactory> pluginDefinedAttributesFactory;
+  private final boolean lazyLoad;
+
+  private AccountLoader accountLoader;
+  private FixInput fix;
+
+  @Inject
+  ChangeJson(
+      Provider<ReviewDb> db,
+      Provider<CurrentUser> user,
+      PermissionBackend permissionBackend,
+      ChangeData.Factory cdf,
+      AccountLoader.Factory ailf,
+      ChangeMessagesUtil cmUtil,
+      Provider<ConsistencyChecker> checkerProvider,
+      ActionJson actionJson,
+      ChangeNotes.Factory notesFactory,
+      LabelsJson.Factory labelsJsonFactory,
+      RemoveReviewerControl removeReviewerControl,
+      TrackingFooters trackingFooters,
+      Metrics metrics,
+      RevisionJson.Factory revisionJsonFactory,
+      @Assisted Iterable<ListChangesOption> options,
+      @Assisted Optional<PluginDefinedAttributesFactory> pluginDefinedAttributesFactory) {
+    this.db = db;
+    this.userProvider = user;
+    this.changeDataFactory = cdf;
+    this.permissionBackend = permissionBackend;
+    this.accountLoaderFactory = ailf;
+    this.cmUtil = cmUtil;
+    this.checkerProvider = checkerProvider;
+    this.actionJson = actionJson;
+    this.notesFactory = notesFactory;
+    this.labelsJson = labelsJsonFactory.create(options);
+    this.removeReviewerControl = removeReviewerControl;
+    this.trackingFooters = trackingFooters;
+    this.metrics = metrics;
+    this.revisionJson = revisionJsonFactory.create(options);
+    this.options = Sets.immutableEnumSet(options);
+    this.lazyLoad = containsAnyOf(this.options, REQUIRE_LAZY_LOAD);
+    this.pluginDefinedAttributesFactory = pluginDefinedAttributesFactory;
+
+    logger.atFine().log("options = %s", options);
+  }
+
+  public ChangeJson fix(FixInput fix) {
+    this.fix = fix;
+    return this;
+  }
+
+  public ChangeInfo format(ChangeResource rsrc) throws OrmException {
+    return format(changeDataFactory.create(db.get(), rsrc.getNotes()));
+  }
+
+  public ChangeInfo format(Change change) throws OrmException {
+    return format(changeDataFactory.create(db.get(), change));
+  }
+
+  public ChangeInfo format(Project.NameKey project, Change.Id id) throws OrmException {
+    return format(project, id, ChangeInfo::new);
+  }
+
+  public ChangeInfo format(ChangeData cd) throws OrmException {
+    return format(cd, Optional.empty(), true, ChangeInfo::new);
+  }
+
+  public ChangeInfo format(RevisionResource rsrc) throws OrmException {
+    ChangeData cd = changeDataFactory.create(db.get(), rsrc.getNotes());
+    return format(cd, Optional.of(rsrc.getPatchSet().getId()), true, ChangeInfo::new);
+  }
+
+  public List<List<ChangeInfo>> format(List<QueryResult<ChangeData>> in)
+      throws PermissionBackendException {
+    try (Timer0.Context ignored = metrics.formatQueryResultsLatency.start()) {
+      accountLoader = accountLoaderFactory.create(has(DETAILED_ACCOUNTS));
+      List<List<ChangeInfo>> res = new ArrayList<>(in.size());
+      Map<Change.Id, ChangeInfo> cache = Maps.newHashMapWithExpectedSize(in.size());
+      for (QueryResult<ChangeData> r : in) {
+        List<ChangeInfo> infos = toChangeInfos(r.entities(), cache);
+        infos.forEach(c -> cache.put(new Change.Id(c._number), c));
+        if (!infos.isEmpty() && r.more()) {
+          infos.get(infos.size() - 1)._moreChanges = true;
+        }
+        res.add(infos);
+      }
+      accountLoader.fill();
+      return res;
+    }
+  }
+
+  public List<ChangeInfo> format(Collection<ChangeData> in)
+      throws OrmException, PermissionBackendException {
+    accountLoader = accountLoaderFactory.create(has(DETAILED_ACCOUNTS));
+    ensureLoaded(in);
+    List<ChangeInfo> out = new ArrayList<>(in.size());
+    for (ChangeData cd : in) {
+      out.add(format(cd, Optional.empty(), false, ChangeInfo::new));
+    }
+    accountLoader.fill();
+    return out;
+  }
+
+  public <I extends ChangeInfo> I format(
+      Project.NameKey project, Change.Id id, Supplier<I> changeInfoSupplier) throws OrmException {
+    ChangeNotes notes;
+    try {
+      notes = notesFactory.createChecked(db.get(), project, id);
+    } catch (OrmException e) {
+      if (!has(CHECK)) {
+        throw e;
+      }
+      return checkOnly(changeDataFactory.create(db.get(), project, id), changeInfoSupplier);
+    }
+    return format(
+        changeDataFactory.create(db.get(), notes), Optional.empty(), true, changeInfoSupplier);
+  }
+
+  private static Collection<SubmitRequirementInfo> requirementsFor(ChangeData cd) {
+    Collection<SubmitRequirementInfo> reqInfos = new ArrayList<>();
+    for (SubmitRecord submitRecord : cd.submitRecords(SUBMIT_RULE_OPTIONS_STRICT)) {
+      if (submitRecord.requirements == null) {
+        continue;
+      }
+      for (SubmitRequirement requirement : submitRecord.requirements) {
+        reqInfos.add(requirementToInfo(requirement, submitRecord.status));
+      }
+    }
+    return reqInfos;
+  }
+
+  private static SubmitRequirementInfo requirementToInfo(SubmitRequirement req, Status status) {
+    return new SubmitRequirementInfo(status.name(), req.fallbackText(), req.type(), req.data());
+  }
+
+  private static void finish(ChangeInfo info) {
+    info.id =
+        Joiner.on('~')
+            .join(Url.encode(info.project), Url.encode(info.branch), Url.encode(info.changeId));
+  }
+
+  private static boolean containsAnyOf(
+      ImmutableSet<ListChangesOption> set, ImmutableSet<ListChangesOption> toFind) {
+    return !Sets.intersection(toFind, set).isEmpty();
+  }
+
+  private <I extends ChangeInfo> I format(
+      ChangeData cd,
+      Optional<PatchSet.Id> limitToPsId,
+      boolean fillAccountLoader,
+      Supplier<I> changeInfoSupplier)
+      throws OrmException {
+    try {
+      if (fillAccountLoader) {
+        accountLoader = accountLoaderFactory.create(has(DETAILED_ACCOUNTS));
+        I res = toChangeInfo(cd, limitToPsId, changeInfoSupplier);
+        accountLoader.fill();
+        return res;
+      }
+      return toChangeInfo(cd, limitToPsId, changeInfoSupplier);
+    } catch (PatchListNotAvailableException
+        | GpgException
+        | OrmException
+        | IOException
+        | PermissionBackendException
+        | RuntimeException e) {
+      if (!has(CHECK)) {
+        Throwables.throwIfInstanceOf(e, OrmException.class);
+        throw new OrmException(e);
+      }
+      return checkOnly(cd, changeInfoSupplier);
+    }
+  }
+
+  private void ensureLoaded(Iterable<ChangeData> all) throws OrmException {
+    if (lazyLoad) {
+      ChangeData.ensureChangeLoaded(all);
+      if (has(ALL_REVISIONS)) {
+        ChangeData.ensureAllPatchSetsLoaded(all);
+      } else if (has(CURRENT_REVISION) || has(MESSAGES)) {
+        ChangeData.ensureCurrentPatchSetLoaded(all);
+      }
+      if (has(REVIEWED) && userProvider.get().isIdentifiedUser()) {
+        ChangeData.ensureReviewedByLoadedForOpenChanges(all);
+      }
+      ChangeData.ensureCurrentApprovalsLoaded(all);
+    } else {
+      for (ChangeData cd : all) {
+        cd.setLazyLoad(false);
+      }
+    }
+  }
+
+  private boolean has(ListChangesOption option) {
+    return options.contains(option);
+  }
+
+  private List<ChangeInfo> toChangeInfos(
+      List<ChangeData> changes, Map<Change.Id, ChangeInfo> cache) {
+    try (Timer0.Context ignored = metrics.toChangeInfosLatency.start()) {
+      List<ChangeInfo> changeInfos = new ArrayList<>(changes.size());
+      for (ChangeData cd : changes) {
+        ChangeInfo i = cache.get(cd.getId());
+        if (i != null) {
+          continue;
+        }
+        try {
+          ensureLoaded(Collections.singleton(cd));
+          changeInfos.add(format(cd, Optional.empty(), false, ChangeInfo::new));
+        } catch (OrmException | RuntimeException e) {
+          logger.atWarning().withCause(e).log(
+              "Omitting corrupt change %s from results", cd.getId());
+        }
+      }
+      return changeInfos;
+    }
+  }
+
+  private <I extends ChangeInfo> I checkOnly(ChangeData cd, Supplier<I> changeInfoSupplier) {
+    ChangeNotes notes;
+    try {
+      notes = cd.notes();
+    } catch (OrmException e) {
+      String msg = "Error loading change";
+      logger.atWarning().withCause(e).log(msg + " %s", cd.getId());
+      I info = changeInfoSupplier.get();
+      info._number = cd.getId().get();
+      ProblemInfo p = new ProblemInfo();
+      p.message = msg;
+      info.problems = Lists.newArrayList(p);
+      return info;
+    }
+
+    ConsistencyChecker.Result result = checkerProvider.get().check(notes, fix);
+    I info = changeInfoSupplier.get();
+    Change c = result.change();
+    if (c != null) {
+      info.project = c.getProject().get();
+      info.branch = c.getDest().getShortName();
+      info.topic = c.getTopic();
+      info.changeId = c.getKey().get();
+      info.subject = c.getSubject();
+      info.status = c.getStatus().asChangeStatus();
+      info.owner = new AccountInfo(c.getOwner().get());
+      info.created = c.getCreatedOn();
+      info.updated = c.getLastUpdatedOn();
+      info._number = c.getId().get();
+      info.problems = result.problems();
+      info.isPrivate = c.isPrivate() ? true : null;
+      info.workInProgress = c.isWorkInProgress() ? true : null;
+      info.hasReviewStarted = c.hasReviewStarted();
+      finish(info);
+    } else {
+      info._number = result.id().get();
+      info.problems = result.problems();
+    }
+    return info;
+  }
+
+  private <I extends ChangeInfo> I toChangeInfo(
+      ChangeData cd, Optional<PatchSet.Id> limitToPsId, Supplier<I> changeInfoSupplier)
+      throws PatchListNotAvailableException, GpgException, OrmException, PermissionBackendException,
+          IOException {
+    try (Timer0.Context ignored = metrics.toChangeInfoLatency.start()) {
+      return toChangeInfoImpl(cd, limitToPsId, changeInfoSupplier);
+    }
+  }
+
+  private <I extends ChangeInfo> I toChangeInfoImpl(
+      ChangeData cd, Optional<PatchSet.Id> limitToPsId, Supplier<I> changeInfoSupplier)
+      throws PatchListNotAvailableException, GpgException, OrmException, PermissionBackendException,
+          IOException {
+    I out = changeInfoSupplier.get();
+    CurrentUser user = userProvider.get();
+
+    if (has(CHECK)) {
+      out.problems = checkerProvider.get().check(cd.notes(), fix).problems();
+      // If any problems were fixed, the ChangeData needs to be reloaded.
+      for (ProblemInfo p : out.problems) {
+        if (p.status == ProblemInfo.Status.FIXED) {
+          cd = changeDataFactory.create(cd.db(), cd.project(), cd.getId());
+          break;
+        }
+      }
+    }
+
+    Change in = cd.change();
+    out.project = in.getProject().get();
+    out.branch = in.getDest().getShortName();
+    out.topic = in.getTopic();
+    out.assignee = in.getAssignee() != null ? accountLoader.get(in.getAssignee()) : null;
+    out.hashtags = cd.hashtags();
+    out.changeId = in.getKey().get();
+    if (in.getStatus().isOpen()) {
+      SubmitTypeRecord str = cd.submitTypeRecord();
+      if (str.isOk()) {
+        out.submitType = str.type;
+      }
+      if (!has(SKIP_MERGEABLE)) {
+        out.mergeable = cd.isMergeable();
+      }
+      if (has(SUBMITTABLE)) {
+        out.submittable = submittable(cd);
+      }
+    }
+    Optional<ChangedLines> changedLines = cd.changedLines();
+    if (changedLines.isPresent()) {
+      out.insertions = changedLines.get().insertions;
+      out.deletions = changedLines.get().deletions;
+    }
+    out.isPrivate = in.isPrivate() ? true : null;
+    out.workInProgress = in.isWorkInProgress() ? true : null;
+    out.hasReviewStarted = in.hasReviewStarted();
+    out.subject = in.getSubject();
+    out.status = in.getStatus().asChangeStatus();
+    out.owner = accountLoader.get(in.getOwner());
+    out.created = in.getCreatedOn();
+    out.updated = in.getLastUpdatedOn();
+    out._number = in.getId().get();
+    out.unresolvedCommentCount = cd.unresolvedCommentCount();
+
+    if (user.isIdentifiedUser()) {
+      Collection<String> stars = cd.stars(user.getAccountId());
+      out.starred = stars.contains(StarredChangesUtil.DEFAULT_LABEL) ? true : null;
+      if (!stars.isEmpty()) {
+        out.stars = stars;
+      }
+    }
+
+    if (in.getStatus().isOpen() && has(REVIEWED) && user.isIdentifiedUser()) {
+      out.reviewed = cd.isReviewedBy(user.getAccountId()) ? true : null;
+    }
+
+    out.labels = labelsJson.labelsFor(accountLoader, cd, has(LABELS), has(DETAILED_LABELS));
+    out.requirements = requirementsFor(cd);
+
+    if (out.labels != null && has(DETAILED_LABELS)) {
+      // If limited to specific patch sets but not the current patch set, don't
+      // list permitted labels, since users can't vote on those patch sets.
+      if (user.isIdentifiedUser()
+          && (!limitToPsId.isPresent() || limitToPsId.get().equals(in.currentPatchSetId()))) {
+        out.permittedLabels =
+            cd.change().getStatus() != Change.Status.ABANDONED
+                ? labelsJson.permittedLabels(user.getAccountId(), cd)
+                : ImmutableMap.of();
+      }
+
+      out.reviewers = reviewerMap(cd.reviewers(), cd.reviewersByEmail(), false);
+      out.pendingReviewers = reviewerMap(cd.pendingReviewers(), cd.pendingReviewersByEmail(), true);
+      out.removableReviewers = removableReviewers(cd, out);
+    }
+
+    setSubmitter(cd, out);
+    if (pluginDefinedAttributesFactory.isPresent()) {
+      out.plugins = pluginDefinedAttributesFactory.get().create(cd);
+    }
+    out.revertOf = cd.change().getRevertOf() != null ? cd.change().getRevertOf().get() : null;
+
+    if (has(REVIEWER_UPDATES)) {
+      out.reviewerUpdates = reviewerUpdates(cd);
+    }
+
+    boolean needMessages = has(MESSAGES);
+    boolean needRevisions = has(ALL_REVISIONS) || has(CURRENT_REVISION) || limitToPsId.isPresent();
+    Map<PatchSet.Id, PatchSet> src;
+    if (needMessages || needRevisions) {
+      src = loadPatchSets(cd, limitToPsId);
+    } else {
+      src = null;
+    }
+
+    if (needMessages) {
+      out.messages = messages(cd);
+    }
+    finish(out);
+
+    // This block must come after the ChangeInfo is mostly populated, since
+    // it will be passed to ActionVisitors as-is.
+    if (needRevisions) {
+      out.revisions = revisionJson.getRevisions(accountLoader, cd, src, limitToPsId, out);
+      if (out.revisions != null) {
+        for (Map.Entry<String, RevisionInfo> entry : out.revisions.entrySet()) {
+          if (entry.getValue().isCurrent) {
+            out.currentRevision = entry.getKey();
+            break;
+          }
+        }
+      }
+    }
+
+    if (has(CURRENT_ACTIONS) || has(CHANGE_ACTIONS)) {
+      actionJson.addChangeActions(out, cd.notes());
+    }
+
+    if (has(TRACKING_IDS)) {
+      ListMultimap<String, String> set = trackingFooters.extract(cd.commitFooters());
+      out.trackingIds =
+          set.entries().stream()
+              .map(e -> new TrackingIdInfo(e.getKey(), e.getValue()))
+              .collect(toList());
+    }
+
+    return out;
+  }
+
+  private Map<ReviewerState, Collection<AccountInfo>> reviewerMap(
+      ReviewerSet reviewers, ReviewerByEmailSet reviewersByEmail, boolean includeRemoved) {
+    Map<ReviewerState, Collection<AccountInfo>> reviewerMap = new HashMap<>();
+    for (ReviewerStateInternal state : ReviewerStateInternal.values()) {
+      if (!includeRemoved && state == ReviewerStateInternal.REMOVED) {
+        continue;
+      }
+      Collection<AccountInfo> reviewersByState = toAccountInfo(reviewers.byState(state));
+      reviewersByState.addAll(toAccountInfoByEmail(reviewersByEmail.byState(state)));
+      if (!reviewersByState.isEmpty()) {
+        reviewerMap.put(state.asReviewerState(), reviewersByState);
+      }
+    }
+    return reviewerMap;
+  }
+
+  private Collection<ReviewerUpdateInfo> reviewerUpdates(ChangeData cd) throws OrmException {
+    List<ReviewerStatusUpdate> reviewerUpdates = cd.reviewerUpdates();
+    List<ReviewerUpdateInfo> result = new ArrayList<>(reviewerUpdates.size());
+    for (ReviewerStatusUpdate c : reviewerUpdates) {
+      ReviewerUpdateInfo change = new ReviewerUpdateInfo();
+      change.updated = c.date();
+      change.state = c.state().asReviewerState();
+      change.updatedBy = accountLoader.get(c.updatedBy());
+      change.reviewer = accountLoader.get(c.reviewer());
+      result.add(change);
+    }
+    return result;
+  }
+
+  private boolean submittable(ChangeData cd) {
+    return SubmitRecord.allRecordsOK(cd.submitRecords(SUBMIT_RULE_OPTIONS_STRICT));
+  }
+
+  private void setSubmitter(ChangeData cd, ChangeInfo out) throws OrmException {
+    Optional<PatchSetApproval> s = cd.getSubmitApproval();
+    if (!s.isPresent()) {
+      return;
+    }
+    out.submitted = s.get().getGranted();
+    out.submitter = accountLoader.get(s.get().getAccountId());
+  }
+
+  private Collection<ChangeMessageInfo> messages(ChangeData cd) throws OrmException {
+    List<ChangeMessage> messages = cmUtil.byChange(db.get(), cd.notes());
+    if (messages.isEmpty()) {
+      return Collections.emptyList();
+    }
+
+    List<ChangeMessageInfo> result = Lists.newArrayListWithCapacity(messages.size());
+    for (ChangeMessage message : messages) {
+      result.add(createChangeMessageInfo(message, accountLoader));
+    }
+    return result;
+  }
+
+  private Collection<AccountInfo> removableReviewers(ChangeData cd, ChangeInfo out)
+      throws PermissionBackendException, OrmException {
+    // Although this is called removableReviewers, this method also determines
+    // which CCs are removable.
+    //
+    // For reviewers, we need to look at each approval, because the reviewer
+    // should only be considered removable if *all* of their approvals can be
+    // removed. First, add all reviewers with *any* removable approval to the
+    // "removable" set. Along the way, if we encounter a non-removable approval,
+    // add the reviewer to the "fixed" set. Before we return, remove all members
+    // of "fixed" from "removable", because not all of their approvals can be
+    // removed.
+    Collection<LabelInfo> labels = out.labels.values();
+    Set<Account.Id> fixed = Sets.newHashSetWithExpectedSize(labels.size());
+    Set<Account.Id> removable = Sets.newHashSetWithExpectedSize(labels.size());
+
+    // Check if the user has the permission to remove a reviewer. This means we can bypass the
+    // testRemoveReviewer check for a specific reviewer in the loop saving potentially many
+    // permission checks.
+    boolean canRemoveAnyReviewer =
+        permissionBackendForChange(userProvider.get(), cd).test(ChangePermission.REMOVE_REVIEWER);
+    for (LabelInfo label : labels) {
+      if (label.all == null) {
+        continue;
+      }
+      for (ApprovalInfo ai : label.all) {
+        Account.Id id = new Account.Id(ai._accountId);
+
+        if (canRemoveAnyReviewer
+            || removeReviewerControl.testRemoveReviewer(
+                cd, userProvider.get(), id, MoreObjects.firstNonNull(ai.value, 0))) {
+          removable.add(id);
+        } else {
+          fixed.add(id);
+        }
+      }
+    }
+
+    // CCs are simpler than reviewers. They are removable if the ChangeControl
+    // would permit a non-negative approval by that account to be removed, in
+    // which case add them to removable. We don't need to add unremovable CCs to
+    // "fixed" because we only visit each CC once here.
+    Collection<AccountInfo> ccs = out.reviewers.get(ReviewerState.CC);
+    if (ccs != null) {
+      for (AccountInfo ai : ccs) {
+        if (ai._accountId != null) {
+          Account.Id id = new Account.Id(ai._accountId);
+          if (canRemoveAnyReviewer
+              || removeReviewerControl.testRemoveReviewer(cd, userProvider.get(), id, 0)) {
+            removable.add(id);
+          }
+        }
+      }
+    }
+
+    // Subtract any reviewers with non-removable approvals from the "removable"
+    // set. This also subtracts any CCs that for some reason also hold
+    // unremovable approvals.
+    removable.removeAll(fixed);
+
+    List<AccountInfo> result = Lists.newArrayListWithCapacity(removable.size());
+    for (Account.Id id : removable) {
+      result.add(accountLoader.get(id));
+    }
+    // Reviewers added by email are always removable
+    for (Collection<AccountInfo> infos : out.reviewers.values()) {
+      for (AccountInfo info : infos) {
+        if (info._accountId == null) {
+          result.add(info);
+        }
+      }
+    }
+    return result;
+  }
+
+  private Collection<AccountInfo> toAccountInfo(Collection<Account.Id> accounts) {
+    return accounts.stream()
+        .map(accountLoader::get)
+        .sorted(AccountInfoComparator.ORDER_NULLS_FIRST)
+        .collect(toList());
+  }
+
+  private Collection<AccountInfo> toAccountInfoByEmail(Collection<Address> addresses) {
+    return addresses.stream()
+        .map(a -> new AccountInfo(a.getName(), a.getEmail()))
+        .sorted(AccountInfoComparator.ORDER_NULLS_FIRST)
+        .collect(toList());
+  }
+
+  private Map<PatchSet.Id, PatchSet> loadPatchSets(ChangeData cd, Optional<PatchSet.Id> limitToPsId)
+      throws OrmException {
+    Collection<PatchSet> src;
+    if (has(ALL_REVISIONS) || has(MESSAGES)) {
+      src = cd.patchSets();
+    } else {
+      PatchSet ps;
+      if (limitToPsId.isPresent()) {
+        ps = cd.patchSet(limitToPsId.get());
+        if (ps == null) {
+          throw new OrmException("missing patch set " + limitToPsId.get());
+        }
+      } else {
+        ps = cd.currentPatchSet();
+        if (ps == null) {
+          throw new OrmException("missing current patch set for change " + cd.getId());
+        }
+      }
+      src = Collections.singletonList(ps);
+    }
+    Map<PatchSet.Id, PatchSet> map = Maps.newHashMapWithExpectedSize(src.size());
+    for (PatchSet patchSet : src) {
+      map.put(patchSet.getId(), patchSet);
+    }
+    return map;
+  }
+
+  /**
+   * @return {@link com.google.gerrit.server.permissions.PermissionBackend.ForChange} constructed
+   *     from either an index-backed or a database-backed {@link ChangeData} depending on {@code
+   *     lazyload}.
+   */
+  private PermissionBackend.ForChange permissionBackendForChange(CurrentUser user, ChangeData cd)
+      throws OrmException {
+    PermissionBackend.WithUser withUser = permissionBackend.user(user).database(db);
+    return lazyLoad
+        ? withUser.change(cd)
+        : withUser.indexedChange(cd, notesFactory.createFromIndexedChange(cd.change()));
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeKindCache.java b/java/com/google/gerrit/server/change/ChangeKindCache.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeKindCache.java
rename to java/com/google/gerrit/server/change/ChangeKindCache.java
diff --git a/java/com/google/gerrit/server/change/ChangeKindCacheImpl.java b/java/com/google/gerrit/server/change/ChangeKindCacheImpl.java
new file mode 100644
index 0000000..a6786d8
--- /dev/null
+++ b/java/com/google/gerrit/server/change/ChangeKindCacheImpl.java
@@ -0,0 +1,434 @@
+// Copyright (C) 2013 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.google.gerrit.server.change;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.cache.Cache;
+import com.google.common.cache.Weigher;
+import com.google.common.collect.FluentIterable;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.client.ChangeKind;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.cache.CacheModule;
+import com.google.gerrit.server.cache.proto.Cache.ChangeKindKeyProto;
+import com.google.gerrit.server.cache.serialize.CacheSerializer;
+import com.google.gerrit.server.cache.serialize.EnumCacheSerializer;
+import com.google.gerrit.server.cache.serialize.ProtoCacheSerializers;
+import com.google.gerrit.server.cache.serialize.ProtoCacheSerializers.ObjectIdConverter;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.InMemoryInserter;
+import com.google.gerrit.server.git.MergeUtil;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Module;
+import com.google.inject.name.Named;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Objects;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import org.eclipse.jgit.errors.LargeObjectException;
+import org.eclipse.jgit.lib.AnyObjectId;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.merge.ThreeWayMerger;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+public class ChangeKindCacheImpl implements ChangeKindCache {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final String ID_CACHE = "change_kind";
+
+  public static Module module() {
+    return new CacheModule() {
+      @Override
+      protected void configure() {
+        bind(ChangeKindCache.class).to(ChangeKindCacheImpl.class);
+        persist(ID_CACHE, Key.class, ChangeKind.class)
+            .maximumWeight(2 << 20)
+            .weigher(ChangeKindWeigher.class)
+            .version(1)
+            .keySerializer(new Key.Serializer())
+            .valueSerializer(new EnumCacheSerializer<>(ChangeKind.class));
+      }
+    };
+  }
+
+  @VisibleForTesting
+  public static class NoCache implements ChangeKindCache {
+    private final boolean useRecursiveMerge;
+    private final ChangeData.Factory changeDataFactory;
+    private final GitRepositoryManager repoManager;
+
+    @Inject
+    NoCache(
+        @GerritServerConfig Config serverConfig,
+        ChangeData.Factory changeDataFactory,
+        GitRepositoryManager repoManager) {
+      this.useRecursiveMerge = MergeUtil.useRecursiveMerge(serverConfig);
+      this.changeDataFactory = changeDataFactory;
+      this.repoManager = repoManager;
+    }
+
+    @Override
+    public ChangeKind getChangeKind(
+        Project.NameKey project,
+        @Nullable RevWalk rw,
+        @Nullable Config repoConfig,
+        ObjectId prior,
+        ObjectId next) {
+      try {
+        Key key = Key.create(prior, next, useRecursiveMerge);
+        return new Loader(key, repoManager, project, rw, repoConfig).call();
+      } catch (IOException e) {
+        logger.atWarning().withCause(e).log(
+            "Cannot check trivial rebase of new patch set %s in %s", next.name(), project);
+        return ChangeKind.REWORK;
+      }
+    }
+
+    @Override
+    public ChangeKind getChangeKind(ReviewDb db, Change change, PatchSet patch) {
+      return getChangeKindInternal(this, db, change, patch, changeDataFactory, repoManager);
+    }
+
+    @Override
+    public ChangeKind getChangeKind(
+        @Nullable RevWalk rw, @Nullable Config repoConfig, ChangeData cd, PatchSet patch) {
+      return getChangeKindInternal(this, rw, repoConfig, cd, patch);
+    }
+  }
+
+  @AutoValue
+  public abstract static class Key {
+    public static Key create(AnyObjectId prior, AnyObjectId next, String strategyName) {
+      return new AutoValue_ChangeKindCacheImpl_Key(prior.copy(), next.copy(), strategyName);
+    }
+
+    private static Key create(AnyObjectId prior, AnyObjectId next, boolean useRecursiveMerge) {
+      return create(prior, next, MergeUtil.mergeStrategyName(true, useRecursiveMerge));
+    }
+
+    public abstract ObjectId prior();
+
+    public abstract ObjectId next();
+
+    public abstract String strategyName();
+
+    @VisibleForTesting
+    static class Serializer implements CacheSerializer<Key> {
+      @Override
+      public byte[] serialize(Key object) {
+        ObjectIdConverter idConverter = ObjectIdConverter.create();
+        return ProtoCacheSerializers.toByteArray(
+            ChangeKindKeyProto.newBuilder()
+                .setPrior(idConverter.toByteString(object.prior()))
+                .setNext(idConverter.toByteString(object.next()))
+                .setStrategyName(object.strategyName())
+                .build());
+      }
+
+      @Override
+      public Key deserialize(byte[] in) {
+        ChangeKindKeyProto proto =
+            ProtoCacheSerializers.parseUnchecked(ChangeKindKeyProto.parser(), in);
+        ObjectIdConverter idConverter = ObjectIdConverter.create();
+        return create(
+            idConverter.fromByteString(proto.getPrior()),
+            idConverter.fromByteString(proto.getNext()),
+            proto.getStrategyName());
+      }
+    }
+  }
+
+  private static class Loader implements Callable<ChangeKind> {
+    private final Key key;
+    private final GitRepositoryManager repoManager;
+    private final Project.NameKey projectName;
+    private final RevWalk alreadyOpenRw;
+    private final Config repoConfig;
+
+    private Loader(
+        Key key,
+        GitRepositoryManager repoManager,
+        Project.NameKey projectName,
+        @Nullable RevWalk rw,
+        @Nullable Config repoConfig) {
+      checkArgument(
+          (rw == null && repoConfig == null) || (rw != null && repoConfig != null),
+          "must either provide both revwalk/config, or neither; got %s/%s",
+          rw,
+          repoConfig);
+      this.key = key;
+      this.repoManager = repoManager;
+      this.projectName = projectName;
+      this.alreadyOpenRw = rw;
+      this.repoConfig = repoConfig;
+    }
+
+    @SuppressWarnings("resource") // Resources are manually managed.
+    @Override
+    public ChangeKind call() throws IOException {
+      if (Objects.equals(key.prior(), key.next())) {
+        return ChangeKind.NO_CODE_CHANGE;
+      }
+
+      RevWalk rw = alreadyOpenRw;
+      Config config = repoConfig;
+      Repository repo = null;
+      if (alreadyOpenRw == null) {
+        repo = repoManager.openRepository(projectName);
+        rw = new RevWalk(repo);
+        config = repo.getConfig();
+      }
+      try {
+        RevCommit prior = rw.parseCommit(key.prior());
+        rw.parseBody(prior);
+        RevCommit next = rw.parseCommit(key.next());
+        rw.parseBody(next);
+
+        if (!next.getFullMessage().equals(prior.getFullMessage())) {
+          if (isSameDeltaAndTree(prior, next)) {
+            return ChangeKind.NO_CODE_CHANGE;
+          }
+          return ChangeKind.REWORK;
+        }
+
+        if (isSameDeltaAndTree(prior, next)) {
+          return ChangeKind.NO_CHANGE;
+        }
+
+        if (prior.getParentCount() == 0 || next.getParentCount() == 0) {
+          // At this point we have considered all the kinds that could be applicable to root
+          // commits; the remainder of the checks in this method all assume that both commits have
+          // at least one parent.
+          return ChangeKind.REWORK;
+        }
+
+        if ((prior.getParentCount() > 1 || next.getParentCount() > 1)
+            && !onlyFirstParentChanged(prior, next)) {
+          // Trivial rebases done by machine only work well on 1 parent.
+          return ChangeKind.REWORK;
+        }
+
+        // A trivial rebase can be detected by looking for the next commit
+        // having the same tree as would exist when the prior commit is
+        // cherry-picked onto the next commit's new first parent.
+        try (ObjectInserter ins = new InMemoryInserter(rw.getObjectReader())) {
+          ThreeWayMerger merger = MergeUtil.newThreeWayMerger(ins, config, key.strategyName());
+          merger.setBase(prior.getParent(0));
+          if (merger.merge(next.getParent(0), prior)
+              && merger.getResultTreeId().equals(next.getTree())) {
+            if (prior.getParentCount() == 1) {
+              return ChangeKind.TRIVIAL_REBASE;
+            }
+            return ChangeKind.MERGE_FIRST_PARENT_UPDATE;
+          }
+        } catch (LargeObjectException e) {
+          // Some object is too large for the merge attempt to succeed. Assume
+          // it was a rework.
+        }
+        return ChangeKind.REWORK;
+      } finally {
+        if (repo != null) {
+          rw.close();
+          repo.close();
+        }
+      }
+    }
+
+    public static boolean onlyFirstParentChanged(RevCommit prior, RevCommit next) {
+      return !sameFirstParents(prior, next) && sameRestOfParents(prior, next);
+    }
+
+    private static boolean sameFirstParents(RevCommit prior, RevCommit next) {
+      if (prior.getParentCount() == 0) {
+        return next.getParentCount() == 0;
+      }
+      return prior.getParent(0).equals(next.getParent(0));
+    }
+
+    private static boolean sameRestOfParents(RevCommit prior, RevCommit next) {
+      Set<RevCommit> priorRestParents = allExceptFirstParent(prior.getParents());
+      Set<RevCommit> nextRestParents = allExceptFirstParent(next.getParents());
+      return priorRestParents.equals(nextRestParents);
+    }
+
+    private static Set<RevCommit> allExceptFirstParent(RevCommit[] parents) {
+      return FluentIterable.from(Arrays.asList(parents)).skip(1).toSet();
+    }
+
+    private static boolean isSameDeltaAndTree(RevCommit prior, RevCommit next) {
+      if (!Objects.equals(next.getTree(), prior.getTree())) {
+        return false;
+      }
+
+      if (prior.getParentCount() != next.getParentCount()) {
+        return false;
+      } else if (prior.getParentCount() == 0) {
+        return true;
+      }
+
+      // Make sure that the prior/next delta is the same - not just the tree.
+      // This is done by making sure that the parent trees are equal.
+      for (int i = 0; i < prior.getParentCount(); i++) {
+        if (!Objects.equals(next.getParent(i).getTree(), prior.getParent(i).getTree())) {
+          return false;
+        }
+      }
+      return true;
+    }
+  }
+
+  public static class ChangeKindWeigher implements Weigher<Key, ChangeKind> {
+    @Override
+    public int weigh(Key key, ChangeKind changeKind) {
+      return 16
+          + 2 * 36
+          + 2 * key.strategyName().length() // Size of Key, 64 bit JVM
+          + 2 * changeKind.name().length(); // Size of ChangeKind, 64 bit JVM
+    }
+  }
+
+  private final Cache<Key, ChangeKind> cache;
+  private final boolean useRecursiveMerge;
+  private final ChangeData.Factory changeDataFactory;
+  private final GitRepositoryManager repoManager;
+
+  @Inject
+  ChangeKindCacheImpl(
+      @GerritServerConfig Config serverConfig,
+      @Named(ID_CACHE) Cache<Key, ChangeKind> cache,
+      ChangeData.Factory changeDataFactory,
+      GitRepositoryManager repoManager) {
+    this.cache = cache;
+    this.useRecursiveMerge = MergeUtil.useRecursiveMerge(serverConfig);
+    this.changeDataFactory = changeDataFactory;
+    this.repoManager = repoManager;
+  }
+
+  @Override
+  public ChangeKind getChangeKind(
+      Project.NameKey project,
+      @Nullable RevWalk rw,
+      @Nullable Config repoConfig,
+      ObjectId prior,
+      ObjectId next) {
+    try {
+      Key key = Key.create(prior, next, useRecursiveMerge);
+      return cache.get(key, new Loader(key, repoManager, project, rw, repoConfig));
+    } catch (ExecutionException e) {
+      logger.atWarning().withCause(e).log(
+          "Cannot check trivial rebase of new patch set %s in %s", next.name(), project);
+      return ChangeKind.REWORK;
+    }
+  }
+
+  @Override
+  public ChangeKind getChangeKind(ReviewDb db, Change change, PatchSet patch) {
+    return getChangeKindInternal(this, db, change, patch, changeDataFactory, repoManager);
+  }
+
+  @Override
+  public ChangeKind getChangeKind(
+      @Nullable RevWalk rw, @Nullable Config repoConfig, ChangeData cd, PatchSet patch) {
+    return getChangeKindInternal(this, rw, repoConfig, cd, patch);
+  }
+
+  private static ChangeKind getChangeKindInternal(
+      ChangeKindCache cache,
+      @Nullable RevWalk rw,
+      @Nullable Config repoConfig,
+      ChangeData change,
+      PatchSet patch) {
+    ChangeKind kind = ChangeKind.REWORK;
+    // Trivial case: if we're on the first patch, we don't need to use
+    // the repository.
+    if (patch.getId().get() > 1) {
+      try {
+        Collection<PatchSet> patchSetCollection = change.patchSets();
+        PatchSet priorPs = patch;
+        for (PatchSet ps : patchSetCollection) {
+          if (ps.getId().get() < patch.getId().get()
+              && (ps.getId().get() > priorPs.getId().get() || priorPs == patch)) {
+            // We only want the previous patch set, so walk until the last one
+            priorPs = ps;
+          }
+        }
+
+        // If we still think the previous patch is the current patch,
+        // we only have one patch set.  Return the default.
+        // This can happen if a user creates a draft, uploads a second patch,
+        // and deletes the draft.
+        if (priorPs != patch) {
+          kind =
+              cache.getChangeKind(
+                  change.project(),
+                  rw,
+                  repoConfig,
+                  ObjectId.fromString(priorPs.getRevision().get()),
+                  ObjectId.fromString(patch.getRevision().get()));
+        }
+      } catch (OrmException e) {
+        // Do nothing; assume we have a complex change
+        logger.atWarning().withCause(e).log(
+            "Unable to get change kind for patchSet %s of change %s",
+            patch.getPatchSetId(), change.getId());
+      }
+    }
+    return kind;
+  }
+
+  private static ChangeKind getChangeKindInternal(
+      ChangeKindCache cache,
+      ReviewDb db,
+      Change change,
+      PatchSet patch,
+      ChangeData.Factory changeDataFactory,
+      GitRepositoryManager repoManager) {
+    // TODO - dborowitz: add NEW_CHANGE type for default.
+    ChangeKind kind = ChangeKind.REWORK;
+    // Trivial case: if we're on the first patch, we don't need to open
+    // the repository.
+    if (patch.getId().get() > 1) {
+      try (Repository repo = repoManager.openRepository(change.getProject());
+          RevWalk rw = new RevWalk(repo)) {
+        kind =
+            getChangeKindInternal(
+                cache, rw, repo.getConfig(), changeDataFactory.create(db, change), patch);
+      } catch (IOException e) {
+        // Do nothing; assume we have a complex change
+        logger.atWarning().withCause(e).log(
+            "Unable to get change kind for patchSet %s of change %s",
+            patch.getPatchSetId(), change.getChangeId());
+      }
+    }
+    return kind;
+  }
+}
diff --git a/java/com/google/gerrit/server/change/ChangeMessageResource.java b/java/com/google/gerrit/server/change/ChangeMessageResource.java
new file mode 100644
index 0000000..3c9ef34
--- /dev/null
+++ b/java/com/google/gerrit/server/change/ChangeMessageResource.java
@@ -0,0 +1,63 @@
+// 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.
+
+package com.google.gerrit.server.change;
+
+import com.google.gerrit.extensions.common.ChangeMessageInfo;
+import com.google.gerrit.extensions.restapi.RestResource;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.inject.TypeLiteral;
+
+/** A change message resource. */
+public class ChangeMessageResource implements RestResource {
+  public static final TypeLiteral<RestView<ChangeMessageResource>> CHANGE_MESSAGE_KIND =
+      new TypeLiteral<RestView<ChangeMessageResource>>() {};
+
+  private final ChangeResource changeResource;
+  private final ChangeMessageInfo changeMessage;
+  private final int changeMessageIndex;
+
+  public ChangeMessageResource(
+      ChangeResource changeResource, ChangeMessageInfo changeMessage, int changeMessageIndex) {
+    this.changeResource = changeResource;
+    this.changeMessage = changeMessage;
+    this.changeMessageIndex = changeMessageIndex;
+  }
+
+  public ChangeResource getChangeResource() {
+    return changeResource;
+  }
+
+  public ChangeMessageInfo getChangeMessage() {
+    return changeMessage;
+  }
+
+  public Change.Id getChangeId() {
+    return changeResource.getId();
+  }
+
+  public String getChangeMessageId() {
+    return changeMessage.id;
+  }
+
+  /**
+   * Gets the index of the change message among all messages of the change sorted by creation time.
+   *
+   * @return the index of the change message.
+   */
+  public int getChangeMessageIndex() {
+    return changeMessageIndex;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeMessages.java b/java/com/google/gerrit/server/change/ChangeMessages.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeMessages.java
rename to java/com/google/gerrit/server/change/ChangeMessages.java
diff --git a/java/com/google/gerrit/server/change/ChangeResource.java b/java/com/google/gerrit/server/change/ChangeResource.java
new file mode 100644
index 0000000..d61d56f
--- /dev/null
+++ b/java/com/google/gerrit/server/change/ChangeResource.java
@@ -0,0 +1,226 @@
+// Copyright (C) 2012 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.google.gerrit.server.change;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.ImmutableList;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.hash.Hasher;
+import com.google.common.hash.Hashing;
+import com.google.gerrit.extensions.restapi.RestResource;
+import com.google.gerrit.extensions.restapi.RestResource.HasETag;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.StarredChangesUtil;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.TypeLiteral;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Optional;
+import java.util.Set;
+import org.eclipse.jgit.lib.ObjectId;
+
+public class ChangeResource implements RestResource, HasETag {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  /**
+   * JSON format version number for ETag computations.
+   *
+   * <p>Should be bumped on any JSON format change (new fields, etc.) so that otherwise unmodified
+   * changes get new ETags.
+   */
+  public static final int JSON_FORMAT_VERSION = 1;
+
+  public static final TypeLiteral<RestView<ChangeResource>> CHANGE_KIND =
+      new TypeLiteral<RestView<ChangeResource>>() {};
+
+  public interface Factory {
+    ChangeResource create(ChangeNotes notes, CurrentUser user);
+  }
+
+  private static final String ZERO_ID_STRING = ObjectId.zeroId().name();
+
+  private final Provider<ReviewDb> db;
+  private final AccountCache accountCache;
+  private final ApprovalsUtil approvalUtil;
+  private final PatchSetUtil patchSetUtil;
+  private final PermissionBackend permissionBackend;
+  private final StarredChangesUtil starredChangesUtil;
+  private final ProjectCache projectCache;
+  private final ChangeNotes notes;
+  private final CurrentUser user;
+
+  @Inject
+  ChangeResource(
+      Provider<ReviewDb> db,
+      AccountCache accountCache,
+      ApprovalsUtil approvalUtil,
+      PatchSetUtil patchSetUtil,
+      PermissionBackend permissionBackend,
+      StarredChangesUtil starredChangesUtil,
+      ProjectCache projectCache,
+      @Assisted ChangeNotes notes,
+      @Assisted CurrentUser user) {
+    this.db = db;
+    this.accountCache = accountCache;
+    this.approvalUtil = approvalUtil;
+    this.patchSetUtil = patchSetUtil;
+    this.permissionBackend = permissionBackend;
+    this.starredChangesUtil = starredChangesUtil;
+    this.projectCache = projectCache;
+    this.notes = notes;
+    this.user = user;
+  }
+
+  public PermissionBackend.ForChange permissions() {
+    return permissionBackend.user(user).database(db).change(notes);
+  }
+
+  public CurrentUser getUser() {
+    return user;
+  }
+
+  public Change.Id getId() {
+    return notes.getChangeId();
+  }
+
+  /** @return true if {@link #getUser()} is the change's owner. */
+  public boolean isUserOwner() {
+    Account.Id owner = getChange().getOwner();
+    return user.isIdentifiedUser() && user.asIdentifiedUser().getAccountId().equals(owner);
+  }
+
+  public Change getChange() {
+    return notes.getChange();
+  }
+
+  public Project.NameKey getProject() {
+    return getChange().getProject();
+  }
+
+  public ChangeNotes getNotes() {
+    return notes;
+  }
+
+  // This includes all information relevant for ETag computation
+  // unrelated to the UI.
+  public void prepareETag(Hasher h, CurrentUser user) {
+    h.putInt(JSON_FORMAT_VERSION)
+        .putLong(getChange().getLastUpdatedOn().getTime())
+        .putInt(getChange().getRowVersion())
+        .putInt(user.isIdentifiedUser() ? user.getAccountId().get() : 0);
+
+    if (user.isIdentifiedUser()) {
+      for (AccountGroup.UUID uuid : user.getEffectiveGroups().getKnownGroups()) {
+        h.putBytes(uuid.get().getBytes(UTF_8));
+      }
+    }
+
+    byte[] buf = new byte[20];
+    Set<Account.Id> accounts = new HashSet<>();
+    accounts.add(getChange().getOwner());
+    if (getChange().getAssignee() != null) {
+      accounts.add(getChange().getAssignee());
+    }
+    try {
+      patchSetUtil.byChange(db.get(), notes).stream()
+          .map(PatchSet::getUploader)
+          .forEach(accounts::add);
+
+      // It's intentional to include the states for *all* reviewers into the ETag computation.
+      // We need the states of all current reviewers and CCs because they are part of ChangeInfo.
+      // Including removed reviewers is a cheap way of making sure that the states of accounts that
+      // posted a message on the change are included. Loading all change messages to find the exact
+      // set of accounts that posted a message is too expensive. However everyone who posts a
+      // message is automatically added as reviewer. Hence if we include removed reviewers we can
+      // be sure that we have all accounts that posted messages on the change.
+      accounts.addAll(approvalUtil.getReviewers(db.get(), notes).all());
+    } catch (OrmException e) {
+      // This ETag will be invalidated if it loads next time.
+    }
+
+    for (Account.Id accountId : accounts) {
+      Optional<AccountState> accountState = accountCache.get(accountId);
+      if (accountState.isPresent()) {
+        hashAccount(h, accountState.get(), buf);
+      } else {
+        h.putInt(accountId.get());
+      }
+    }
+
+    ObjectId noteId;
+    try {
+      noteId = notes.loadRevision();
+    } catch (OrmException e) {
+      noteId = null; // This ETag will be invalidated if it loads next time.
+    }
+    hashObjectId(h, noteId, buf);
+    // TODO(dborowitz): Include more NoteDb and other related refs, e.g. drafts
+    // and edits.
+
+    Iterable<ProjectState> projectStateTree;
+    try {
+      projectStateTree = projectCache.checkedGet(getProject()).tree();
+    } catch (IOException e) {
+      logger.atSevere().log("could not load project %s while computing etag", getProject());
+      projectStateTree = ImmutableList.of();
+    }
+
+    for (ProjectState p : projectStateTree) {
+      hashObjectId(h, p.getConfig().getRevision(), buf);
+    }
+  }
+
+  @Override
+  public String getETag() {
+    Hasher h = Hashing.murmur3_128().newHasher();
+    if (user.isIdentifiedUser()) {
+      h.putString(starredChangesUtil.getObjectId(user.getAccountId(), getId()).name(), UTF_8);
+    }
+    prepareETag(h, user);
+    return h.hash().toString();
+  }
+
+  private void hashObjectId(Hasher h, ObjectId id, byte[] buf) {
+    MoreObjects.firstNonNull(id, ObjectId.zeroId()).copyRawTo(buf, 0);
+    h.putBytes(buf);
+  }
+
+  private void hashAccount(Hasher h, AccountState accountState, byte[] buf) {
+    h.putInt(accountState.getAccount().getId().get());
+    h.putString(
+        MoreObjects.firstNonNull(accountState.getAccount().getMetaId(), ZERO_ID_STRING), UTF_8);
+    accountState.getExternalIds().stream().forEach(e -> hashObjectId(h, e.blobId(), buf));
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeTriplet.java b/java/com/google/gerrit/server/change/ChangeTriplet.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeTriplet.java
rename to java/com/google/gerrit/server/change/ChangeTriplet.java
diff --git a/java/com/google/gerrit/server/change/CommentResource.java b/java/com/google/gerrit/server/change/CommentResource.java
new file mode 100644
index 0000000..1b7cbf8
--- /dev/null
+++ b/java/com/google/gerrit/server/change/CommentResource.java
@@ -0,0 +1,55 @@
+// Copyright (C) 2017 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.google.gerrit.server.change;
+
+import com.google.gerrit.extensions.restapi.RestResource;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.inject.TypeLiteral;
+
+public class CommentResource implements RestResource {
+  public static final TypeLiteral<RestView<CommentResource>> COMMENT_KIND =
+      new TypeLiteral<RestView<CommentResource>>() {};
+
+  private final RevisionResource rev;
+  private final Comment comment;
+
+  public CommentResource(RevisionResource rev, Comment c) {
+    this.rev = rev;
+    this.comment = c;
+  }
+
+  public PatchSet getPatchSet() {
+    return rev.getPatchSet();
+  }
+
+  public Comment getComment() {
+    return comment;
+  }
+
+  public String getId() {
+    return comment.key.uuid;
+  }
+
+  public Account.Id getAuthorId() {
+    return comment.author.getId();
+  }
+
+  public RevisionResource getRevisionResource() {
+    return rev;
+  }
+}
diff --git a/java/com/google/gerrit/server/change/ConsistencyChecker.java b/java/com/google/gerrit/server/change/ConsistencyChecker.java
new file mode 100644
index 0000000..128297f
--- /dev/null
+++ b/java/com/google/gerrit/server/change/ConsistencyChecker.java
@@ -0,0 +1,786 @@
+// Copyright (C) 2014 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.google.gerrit.server.change;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.gerrit.reviewdb.client.RefNames.REFS_CHANGES;
+import static com.google.gerrit.reviewdb.server.ReviewDbUtil.intKeyOrdering;
+import static com.google.gerrit.server.ChangeUtil.PS_ID_ORDER;
+import static java.util.Objects.requireNonNull;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.collect.SetMultimap;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.FooterConstants;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.api.changes.FixInput;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.common.ProblemInfo;
+import com.google.gerrit.extensions.common.ProblemInfo.Status;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.reviewdb.server.ReviewDbUtil;
+import com.google.gerrit.server.ChangeUtil;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.account.Accounts;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.PatchSetState;
+import com.google.gerrit.server.patch.PatchSetInfoFactory;
+import com.google.gerrit.server.patch.PatchSetInfoNotAvailableException;
+import com.google.gerrit.server.plugincontext.PluginItemContext;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.BatchUpdateReviewDb;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.RepoContext;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.IncorrectObjectTypeException;
+import org.eclipse.jgit.errors.MissingObjectException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+/**
+ * Checks changes for various kinds of inconsistency and corruption.
+ *
+ * <p>A single instance may be reused for checking multiple changes, but not concurrently.
+ */
+public class ConsistencyChecker {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  @AutoValue
+  public abstract static class Result {
+    private static Result create(ChangeNotes notes, List<ProblemInfo> problems) {
+      return new AutoValue_ConsistencyChecker_Result(
+          notes.getChangeId(), notes.getChange(), problems);
+    }
+
+    public abstract Change.Id id();
+
+    @Nullable
+    public abstract Change change();
+
+    public abstract List<ProblemInfo> problems();
+  }
+
+  private final ChangeNotes.Factory notesFactory;
+  private final Accounts accounts;
+  private final PluginItemContext<AccountPatchReviewStore> accountPatchReviewStore;
+  private final GitRepositoryManager repoManager;
+  private final PatchSetInfoFactory patchSetInfoFactory;
+  private final PatchSetInserter.Factory patchSetInserterFactory;
+  private final PatchSetUtil psUtil;
+  private final Provider<CurrentUser> user;
+  private final Provider<PersonIdent> serverIdent;
+  private final Provider<ReviewDb> db;
+  private final RetryHelper retryHelper;
+
+  private BatchUpdate.Factory updateFactory;
+  private FixInput fix;
+  private ChangeNotes notes;
+  private Repository repo;
+  private RevWalk rw;
+  private ObjectInserter oi;
+
+  private RevCommit tip;
+  private SetMultimap<ObjectId, PatchSet> patchSetsBySha;
+  private PatchSet currPs;
+  private RevCommit currPsCommit;
+
+  private List<ProblemInfo> problems;
+
+  @Inject
+  ConsistencyChecker(
+      @GerritPersonIdent Provider<PersonIdent> serverIdent,
+      ChangeNotes.Factory notesFactory,
+      Accounts accounts,
+      PluginItemContext<AccountPatchReviewStore> accountPatchReviewStore,
+      GitRepositoryManager repoManager,
+      PatchSetInfoFactory patchSetInfoFactory,
+      PatchSetInserter.Factory patchSetInserterFactory,
+      PatchSetUtil psUtil,
+      Provider<CurrentUser> user,
+      Provider<ReviewDb> db,
+      RetryHelper retryHelper) {
+    this.accounts = accounts;
+    this.accountPatchReviewStore = accountPatchReviewStore;
+    this.db = db;
+    this.notesFactory = notesFactory;
+    this.patchSetInfoFactory = patchSetInfoFactory;
+    this.patchSetInserterFactory = patchSetInserterFactory;
+    this.psUtil = psUtil;
+    this.repoManager = repoManager;
+    this.retryHelper = retryHelper;
+    this.serverIdent = serverIdent;
+    this.user = user;
+    reset();
+  }
+
+  private void reset() {
+    updateFactory = null;
+    notes = null;
+    repo = null;
+    rw = null;
+    problems = new ArrayList<>();
+  }
+
+  private Change change() {
+    return notes.getChange();
+  }
+
+  public Result check(ChangeNotes notes, @Nullable FixInput f) {
+    requireNonNull(notes);
+    try {
+      return retryHelper.execute(
+          buf -> {
+            try {
+              reset();
+              this.updateFactory = buf;
+              this.notes = notes;
+              fix = f;
+              checkImpl();
+              return result();
+            } finally {
+              if (rw != null) {
+                rw.getObjectReader().close();
+                rw.close();
+                oi.close();
+              }
+              if (repo != null) {
+                repo.close();
+              }
+            }
+          });
+    } catch (RestApiException e) {
+      return logAndReturnOneProblem(e, notes, "Error checking change: " + e.getMessage());
+    } catch (UpdateException e) {
+      return logAndReturnOneProblem(e, notes, "Error checking change");
+    }
+  }
+
+  private Result logAndReturnOneProblem(Exception e, ChangeNotes notes, String problem) {
+    logger.atWarning().withCause(e).log("Error checking change %s", notes.getChangeId());
+    return Result.create(notes, ImmutableList.of(problem(problem)));
+  }
+
+  private void checkImpl() {
+    checkOwner();
+    checkCurrentPatchSetEntity();
+
+    // All checks that require the repo.
+    if (!openRepo()) {
+      return;
+    }
+    if (!checkPatchSets()) {
+      return;
+    }
+    checkMerged();
+  }
+
+  private void checkOwner() {
+    try {
+      if (!accounts.get(change().getOwner()).isPresent()) {
+        problem("Missing change owner: " + change().getOwner());
+      }
+    } catch (IOException | ConfigInvalidException e) {
+      error("Failed to look up owner", e);
+    }
+  }
+
+  private void checkCurrentPatchSetEntity() {
+    try {
+      currPs = psUtil.current(db.get(), notes);
+      if (currPs == null) {
+        problem(
+            String.format("Current patch set %d not found", change().currentPatchSetId().get()));
+      }
+    } catch (OrmException e) {
+      error("Failed to look up current patch set", e);
+    }
+  }
+
+  private boolean openRepo() {
+    Project.NameKey project = change().getDest().getParentKey();
+    try {
+      repo = repoManager.openRepository(project);
+      oi = repo.newObjectInserter();
+      rw = new RevWalk(oi.newReader());
+      return true;
+    } catch (RepositoryNotFoundException e) {
+      return error("Destination repository not found: " + project, e);
+    } catch (IOException e) {
+      return error("Failed to open repository: " + project, e);
+    }
+  }
+
+  private boolean checkPatchSets() {
+    List<PatchSet> all;
+    try {
+      // Iterate in descending order.
+      all = PS_ID_ORDER.sortedCopy(psUtil.byChange(db.get(), notes));
+    } catch (OrmException e) {
+      return error("Failed to look up patch sets", e);
+    }
+    patchSetsBySha = MultimapBuilder.hashKeys(all.size()).treeSetValues(PS_ID_ORDER).build();
+
+    Map<String, Ref> refs;
+    try {
+      refs =
+          repo.getRefDatabase()
+              .exactRef(all.stream().map(ps -> ps.getId().toRefName()).toArray(String[]::new));
+    } catch (IOException e) {
+      error("error reading refs", e);
+      refs = Collections.emptyMap();
+    }
+
+    List<DeletePatchSetFromDbOp> deletePatchSetOps = new ArrayList<>();
+    for (PatchSet ps : all) {
+      // Check revision format.
+      int psNum = ps.getId().get();
+      String refName = ps.getId().toRefName();
+      ObjectId objId = parseObjectId(ps.getRevision().get(), "patch set " + psNum);
+      if (objId == null) {
+        continue;
+      }
+      patchSetsBySha.put(objId, ps);
+
+      // Check ref existence.
+      ProblemInfo refProblem = null;
+      Ref ref = refs.get(refName);
+      if (ref == null) {
+        refProblem = problem("Ref missing: " + refName);
+      } else if (!objId.equals(ref.getObjectId())) {
+        String actual = ref.getObjectId() != null ? ref.getObjectId().name() : "null";
+        refProblem =
+            problem(
+                String.format(
+                    "Expected %s to point to %s, found %s", ref.getName(), objId.name(), actual));
+      }
+
+      // Check object existence.
+      RevCommit psCommit = parseCommit(objId, String.format("patch set %d", psNum));
+      if (psCommit == null) {
+        if (fix != null && fix.deletePatchSetIfCommitMissing) {
+          deletePatchSetOps.add(new DeletePatchSetFromDbOp(lastProblem(), ps.getId()));
+        }
+        continue;
+      } else if (refProblem != null && fix != null) {
+        fixPatchSetRef(refProblem, ps);
+      }
+      if (ps.getId().equals(change().currentPatchSetId())) {
+        currPsCommit = psCommit;
+      }
+    }
+
+    // Delete any bad patch sets found above, in a single update.
+    deletePatchSets(deletePatchSetOps);
+
+    // Check for duplicates.
+    for (Map.Entry<ObjectId, Collection<PatchSet>> e : patchSetsBySha.asMap().entrySet()) {
+      if (e.getValue().size() > 1) {
+        problem(
+            String.format(
+                "Multiple patch sets pointing to %s: %s",
+                e.getKey().name(), Collections2.transform(e.getValue(), PatchSet::getPatchSetId)));
+      }
+    }
+
+    return currPs != null && currPsCommit != null;
+  }
+
+  private void checkMerged() {
+    String refName = change().getDest().get();
+    Ref dest;
+    try {
+      dest = repo.getRefDatabase().exactRef(refName);
+    } catch (IOException e) {
+      problem("Failed to look up destination ref: " + refName);
+      return;
+    }
+    if (dest == null) {
+      problem("Destination ref not found (may be new branch): " + refName);
+      return;
+    }
+    tip = parseCommit(dest.getObjectId(), "destination ref " + refName);
+    if (tip == null) {
+      return;
+    }
+
+    if (fix != null && fix.expectMergedAs != null) {
+      checkExpectMergedAs();
+    } else {
+      boolean merged;
+      try {
+        merged = rw.isMergedInto(currPsCommit, tip);
+      } catch (IOException e) {
+        problem("Error checking whether patch set " + currPs.getId().get() + " is merged");
+        return;
+      }
+      checkMergedBitMatchesStatus(currPs.getId(), currPsCommit, merged);
+    }
+  }
+
+  private ProblemInfo wrongChangeStatus(PatchSet.Id psId, RevCommit commit) {
+    String refName = change().getDest().get();
+    return problem(
+        String.format(
+            "Patch set %d (%s) is merged into destination ref %s (%s), but change"
+                + " status is %s",
+            psId.get(), commit.name(), refName, tip.name(), change().getStatus()));
+  }
+
+  private void checkMergedBitMatchesStatus(PatchSet.Id psId, RevCommit commit, boolean merged) {
+    String refName = change().getDest().get();
+    if (merged && change().getStatus() != Change.Status.MERGED) {
+      ProblemInfo p = wrongChangeStatus(psId, commit);
+      if (fix != null) {
+        fixMerged(p);
+      }
+    } else if (!merged && change().getStatus() == Change.Status.MERGED) {
+      problem(
+          String.format(
+              "Patch set %d (%s) is not merged into"
+                  + " destination ref %s (%s), but change status is %s",
+              currPs.getId().get(), commit.name(), refName, tip.name(), change().getStatus()));
+    }
+  }
+
+  private void checkExpectMergedAs() {
+    ObjectId objId = parseObjectId(fix.expectMergedAs, "expected merged commit");
+    RevCommit commit = parseCommit(objId, "expected merged commit");
+    if (commit == null) {
+      return;
+    }
+
+    try {
+      if (!rw.isMergedInto(commit, tip)) {
+        problem(
+            String.format(
+                "Expected merged commit %s is not merged into destination ref %s (%s)",
+                commit.name(), change().getDest().get(), tip.name()));
+        return;
+      }
+
+      List<PatchSet.Id> thisCommitPsIds = new ArrayList<>();
+      for (Ref ref : repo.getRefDatabase().getRefsByPrefix(REFS_CHANGES)) {
+        if (!ref.getObjectId().equals(commit)) {
+          continue;
+        }
+        PatchSet.Id psId = PatchSet.Id.fromRef(ref.getName());
+        if (psId == null) {
+          continue;
+        }
+        try {
+          Change c =
+              notesFactory
+                  .createChecked(db.get(), change().getProject(), psId.getParentKey())
+                  .getChange();
+          if (!c.getDest().equals(change().getDest())) {
+            continue;
+          }
+        } catch (OrmException e) {
+          warn(e);
+          // Include this patch set; should cause an error below, which is good.
+        }
+        thisCommitPsIds.add(psId);
+      }
+      switch (thisCommitPsIds.size()) {
+        case 0:
+          // No patch set for this commit; insert one.
+          rw.parseBody(commit);
+          String changeId =
+              Iterables.getFirst(commit.getFooterLines(FooterConstants.CHANGE_ID), null);
+          // Missing Change-Id footer is ok, but mismatched is not.
+          if (changeId != null && !changeId.equals(change().getKey().get())) {
+            problem(
+                String.format(
+                    "Expected merged commit %s has Change-Id: %s, but expected %s",
+                    commit.name(), changeId, change().getKey().get()));
+            return;
+          }
+          insertMergedPatchSet(commit, null, false);
+          break;
+
+        case 1:
+          // Existing patch set ref pointing to this commit.
+          PatchSet.Id id = thisCommitPsIds.get(0);
+          if (id.equals(change().currentPatchSetId())) {
+            // If it's the current patch set, we can just fix the status.
+            fixMerged(wrongChangeStatus(id, commit));
+          } else if (id.get() > change().currentPatchSetId().get()) {
+            // If it's newer than the current patch set, reuse this patch set
+            // ID when inserting a new merged patch set.
+            insertMergedPatchSet(commit, id, true);
+          } else {
+            // If it's older than the current patch set, just delete the old
+            // ref, and use a new ID when inserting a new merged patch set.
+            insertMergedPatchSet(commit, id, false);
+          }
+          break;
+
+        default:
+          problem(
+              String.format(
+                  "Multiple patch sets for expected merged commit %s: %s",
+                  commit.name(), intKeyOrdering().sortedCopy(thisCommitPsIds)));
+          break;
+      }
+    } catch (IOException e) {
+      error("Error looking up expected merged commit " + fix.expectMergedAs, e);
+    }
+  }
+
+  private void insertMergedPatchSet(
+      final RevCommit commit, @Nullable PatchSet.Id psIdToDelete, boolean reuseOldPsId) {
+    ProblemInfo notFound = problem("No patch set found for merged commit " + commit.name());
+    if (!user.get().isIdentifiedUser()) {
+      notFound.status = Status.FIX_FAILED;
+      notFound.outcome = "Must be called by an identified user to insert new patch set";
+      return;
+    }
+    ProblemInfo insertPatchSetProblem;
+    ProblemInfo deleteOldPatchSetProblem;
+
+    if (psIdToDelete == null) {
+      insertPatchSetProblem =
+          problem(
+              String.format(
+                  "Expected merged commit %s has no associated patch set", commit.name()));
+      deleteOldPatchSetProblem = null;
+    } else {
+      String msg =
+          String.format(
+              "Expected merge commit %s corresponds to patch set %s,"
+                  + " not the current patch set %s",
+              commit.name(), psIdToDelete.get(), change().currentPatchSetId().get());
+      // Maybe an identical problem, but different fix.
+      deleteOldPatchSetProblem = reuseOldPsId ? null : problem(msg);
+      insertPatchSetProblem = problem(msg);
+    }
+
+    List<ProblemInfo> currProblems = new ArrayList<>(3);
+    currProblems.add(notFound);
+    if (deleteOldPatchSetProblem != null) {
+      currProblems.add(deleteOldPatchSetProblem);
+    }
+    currProblems.add(insertPatchSetProblem);
+
+    try {
+      PatchSet.Id psId =
+          (psIdToDelete != null && reuseOldPsId)
+              ? psIdToDelete
+              : ChangeUtil.nextPatchSetId(repo, change().currentPatchSetId());
+      PatchSetInserter inserter = patchSetInserterFactory.create(notes, psId, commit);
+      try (BatchUpdate bu = newBatchUpdate()) {
+        bu.setRepository(repo, rw, oi);
+
+        if (psIdToDelete != null) {
+          // Delete the given patch set ref. If reuseOldPsId is true,
+          // PatchSetInserter will reinsert the same ref, making it a no-op.
+          bu.addOp(
+              notes.getChangeId(),
+              new BatchUpdateOp() {
+                @Override
+                public void updateRepo(RepoContext ctx) throws IOException {
+                  ctx.addRefUpdate(commit, ObjectId.zeroId(), psIdToDelete.toRefName());
+                }
+              });
+          if (!reuseOldPsId) {
+            bu.addOp(
+                notes.getChangeId(),
+                new DeletePatchSetFromDbOp(requireNonNull(deleteOldPatchSetProblem), psIdToDelete));
+          }
+        }
+
+        bu.addOp(
+            notes.getChangeId(),
+            inserter
+                .setValidate(false)
+                .setFireRevisionCreated(false)
+                .setNotify(NotifyHandling.NONE)
+                .setAllowClosed(true)
+                .setMessage("Patch set for merged commit inserted by consistency checker"));
+        bu.addOp(notes.getChangeId(), new FixMergedOp(notFound));
+        bu.execute();
+      }
+      notes = notesFactory.createChecked(db.get(), inserter.getChange());
+      insertPatchSetProblem.status = Status.FIXED;
+      insertPatchSetProblem.outcome = "Inserted as patch set " + psId.get();
+    } catch (OrmException | IOException | UpdateException | RestApiException e) {
+      warn(e);
+      for (ProblemInfo pi : currProblems) {
+        pi.status = Status.FIX_FAILED;
+        pi.outcome = "Error inserting merged patch set";
+      }
+      return;
+    }
+  }
+
+  private static class FixMergedOp implements BatchUpdateOp {
+    private final ProblemInfo p;
+
+    private FixMergedOp(ProblemInfo p) {
+      this.p = p;
+    }
+
+    @Override
+    public boolean updateChange(ChangeContext ctx) throws OrmException {
+      ctx.getChange().setStatus(Change.Status.MERGED);
+      ctx.getUpdate(ctx.getChange().currentPatchSetId()).fixStatus(Change.Status.MERGED);
+      p.status = Status.FIXED;
+      p.outcome = "Marked change as merged";
+      return true;
+    }
+  }
+
+  private void fixMerged(ProblemInfo p) {
+    try (BatchUpdate bu = newBatchUpdate()) {
+      bu.setRepository(repo, rw, oi);
+      bu.addOp(notes.getChangeId(), new FixMergedOp(p));
+      bu.execute();
+    } catch (UpdateException | RestApiException e) {
+      logger.atWarning().withCause(e).log("Error marking %s as merged", notes.getChangeId());
+      p.status = Status.FIX_FAILED;
+      p.outcome = "Error updating status to merged";
+    }
+  }
+
+  private BatchUpdate newBatchUpdate() {
+    return updateFactory.create(db.get(), change().getProject(), user.get(), TimeUtil.nowTs());
+  }
+
+  private void fixPatchSetRef(ProblemInfo p, PatchSet ps) {
+    try {
+      RefUpdate ru = repo.updateRef(ps.getId().toRefName());
+      ru.setForceUpdate(true);
+      ru.setNewObjectId(ObjectId.fromString(ps.getRevision().get()));
+      ru.setRefLogIdent(newRefLogIdent());
+      ru.setRefLogMessage("Repair patch set ref", true);
+      RefUpdate.Result result = ru.update();
+      switch (result) {
+        case NEW:
+        case FORCED:
+        case FAST_FORWARD:
+        case NO_CHANGE:
+          p.status = Status.FIXED;
+          p.outcome = "Repaired patch set ref";
+          return;
+        case IO_FAILURE:
+        case LOCK_FAILURE:
+        case NOT_ATTEMPTED:
+        case REJECTED:
+        case REJECTED_CURRENT_BRANCH:
+        case RENAMED:
+        case REJECTED_MISSING_OBJECT:
+        case REJECTED_OTHER_REASON:
+        default:
+          p.status = Status.FIX_FAILED;
+          p.outcome = "Failed to update patch set ref: " + result;
+          return;
+      }
+    } catch (IOException e) {
+      String msg = "Error fixing patch set ref";
+      logger.atWarning().withCause(e).log("%s %s", msg, ps.getId().toRefName());
+      p.status = Status.FIX_FAILED;
+      p.outcome = msg;
+    }
+  }
+
+  private void deletePatchSets(List<DeletePatchSetFromDbOp> ops) {
+    try (BatchUpdate bu = newBatchUpdate()) {
+      bu.setRepository(repo, rw, oi);
+      for (DeletePatchSetFromDbOp op : ops) {
+        checkArgument(op.psId.getParentKey().equals(notes.getChangeId()));
+        bu.addOp(notes.getChangeId(), op);
+      }
+      bu.addOp(notes.getChangeId(), new UpdateCurrentPatchSetOp(ops));
+      bu.execute();
+    } catch (NoPatchSetsWouldRemainException e) {
+      for (DeletePatchSetFromDbOp op : ops) {
+        op.p.status = Status.FIX_FAILED;
+        op.p.outcome = e.getMessage();
+      }
+    } catch (UpdateException | RestApiException e) {
+      String msg = "Error deleting patch set";
+      logger.atWarning().withCause(e).log("%s of change %s", msg, ops.get(0).psId.getParentKey());
+      for (DeletePatchSetFromDbOp op : ops) {
+        // Overwrite existing statuses that were set before the transaction was
+        // rolled back.
+        op.p.status = Status.FIX_FAILED;
+        op.p.outcome = msg;
+      }
+    }
+  }
+
+  private class DeletePatchSetFromDbOp implements BatchUpdateOp {
+    private final ProblemInfo p;
+    private final PatchSet.Id psId;
+
+    private DeletePatchSetFromDbOp(ProblemInfo p, PatchSet.Id psId) {
+      this.p = p;
+      this.psId = psId;
+    }
+
+    @Override
+    public boolean updateChange(ChangeContext ctx)
+        throws OrmException, PatchSetInfoNotAvailableException {
+      // Delete dangling key references.
+      ReviewDb db = BatchUpdateReviewDb.unwrap(ctx.getDb());
+      accountPatchReviewStore.run(s -> s.clearReviewed(psId), OrmException.class);
+      db.changeMessages().delete(db.changeMessages().byChange(psId.getParentKey()));
+      db.patchSetApprovals().delete(db.patchSetApprovals().byPatchSet(psId));
+      db.patchComments().delete(db.patchComments().byPatchSet(psId));
+      db.patchSets().deleteKeys(Collections.singleton(psId));
+
+      // NoteDb requires no additional fiddling; setting the state to deleted is
+      // sufficient to filter everything else out.
+      ctx.getUpdate(psId).setPatchSetState(PatchSetState.DELETED);
+
+      p.status = Status.FIXED;
+      p.outcome = "Deleted patch set";
+      return true;
+    }
+  }
+
+  private static class NoPatchSetsWouldRemainException extends RestApiException {
+    private static final long serialVersionUID = 1L;
+
+    private NoPatchSetsWouldRemainException() {
+      super("Cannot delete patch set; no patch sets would remain");
+    }
+  }
+
+  private class UpdateCurrentPatchSetOp implements BatchUpdateOp {
+    private final Set<PatchSet.Id> toDelete;
+
+    private UpdateCurrentPatchSetOp(List<DeletePatchSetFromDbOp> deleteOps) {
+      toDelete = new HashSet<>();
+      for (DeletePatchSetFromDbOp op : deleteOps) {
+        toDelete.add(op.psId);
+      }
+    }
+
+    @Override
+    public boolean updateChange(ChangeContext ctx)
+        throws OrmException, PatchSetInfoNotAvailableException, NoPatchSetsWouldRemainException {
+      if (!toDelete.contains(ctx.getChange().currentPatchSetId())) {
+        return false;
+      }
+      Set<PatchSet.Id> all = new HashSet<>();
+      // Doesn't make any assumptions about the order in which deletes happen
+      // and whether they are seen by this op; we are already given the full set
+      // of patch sets that will eventually be deleted in this update.
+      for (PatchSet ps : psUtil.byChange(ctx.getDb(), ctx.getNotes())) {
+        if (!toDelete.contains(ps.getId())) {
+          all.add(ps.getId());
+        }
+      }
+      if (all.isEmpty()) {
+        throw new NoPatchSetsWouldRemainException();
+      }
+      PatchSet.Id latest = ReviewDbUtil.intKeyOrdering().max(all);
+      ctx.getChange()
+          .setCurrentPatchSet(patchSetInfoFactory.get(ctx.getDb(), ctx.getNotes(), latest));
+      return true;
+    }
+  }
+
+  private PersonIdent newRefLogIdent() {
+    CurrentUser u = user.get();
+    if (u.isIdentifiedUser()) {
+      return u.asIdentifiedUser().newRefLogIdent();
+    }
+    return serverIdent.get();
+  }
+
+  private ObjectId parseObjectId(String objIdStr, String desc) {
+    try {
+      return ObjectId.fromString(objIdStr);
+    } catch (IllegalArgumentException e) {
+      problem(String.format("Invalid revision on %s: %s", desc, objIdStr));
+      return null;
+    }
+  }
+
+  private RevCommit parseCommit(ObjectId objId, String desc) {
+    try {
+      return rw.parseCommit(objId);
+    } catch (MissingObjectException e) {
+      problem(String.format("Object missing: %s: %s", desc, objId.name()));
+    } catch (IncorrectObjectTypeException e) {
+      problem(String.format("Not a commit: %s: %s", desc, objId.name()));
+    } catch (IOException e) {
+      problem(String.format("Failed to look up: %s: %s", desc, objId.name()));
+    }
+    return null;
+  }
+
+  private ProblemInfo problem(String msg) {
+    ProblemInfo p = new ProblemInfo();
+    p.message = requireNonNull(msg);
+    problems.add(p);
+    return p;
+  }
+
+  private ProblemInfo lastProblem() {
+    return problems.get(problems.size() - 1);
+  }
+
+  private boolean error(String msg, Throwable t) {
+    problem(msg);
+    // TODO(dborowitz): Expose stack trace to administrators.
+    warn(t);
+    return false;
+  }
+
+  private void warn(Throwable t) {
+    logger.atWarning().withCause(t).log(
+        "Error in consistency check of change %s", notes.getChangeId());
+  }
+
+  private Result result() {
+    return Result.create(notes, problems);
+  }
+}
diff --git a/java/com/google/gerrit/server/change/DeleteChangeOp.java b/java/com/google/gerrit/server/change/DeleteChangeOp.java
new file mode 100644
index 0000000..461274b
--- /dev/null
+++ b/java/com/google/gerrit/server/change/DeleteChangeOp.java
@@ -0,0 +1,145 @@
+// Copyright (C) 2015 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.google.gerrit.server.change;
+
+import static com.google.common.base.Preconditions.checkState;
+
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.StarredChangesUtil;
+import com.google.gerrit.server.extensions.events.ChangeDeleted;
+import com.google.gerrit.server.plugincontext.PluginItemContext;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.BatchUpdateReviewDb;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.Order;
+import com.google.gerrit.server.update.RepoContext;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Optional;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+public class DeleteChangeOp implements BatchUpdateOp {
+  private final PatchSetUtil psUtil;
+  private final StarredChangesUtil starredChangesUtil;
+  private final PluginItemContext<AccountPatchReviewStore> accountPatchReviewStore;
+  private final ChangeDeleted changeDeleted;
+
+  private Change.Id id;
+
+  @Inject
+  DeleteChangeOp(
+      PatchSetUtil psUtil,
+      StarredChangesUtil starredChangesUtil,
+      PluginItemContext<AccountPatchReviewStore> accountPatchReviewStore,
+      ChangeDeleted changeDeleted) {
+    this.psUtil = psUtil;
+    this.starredChangesUtil = starredChangesUtil;
+    this.accountPatchReviewStore = accountPatchReviewStore;
+    this.changeDeleted = changeDeleted;
+  }
+
+  @Override
+  public boolean updateChange(ChangeContext ctx)
+      throws RestApiException, OrmException, IOException, NoSuchChangeException {
+    checkState(
+        ctx.getOrder() == Order.DB_BEFORE_REPO, "must use DeleteChangeOp with DB_BEFORE_REPO");
+    checkState(id == null, "cannot reuse DeleteChangeOp");
+
+    id = ctx.getChange().getId();
+    Collection<PatchSet> patchSets = psUtil.byChange(ctx.getDb(), ctx.getNotes());
+
+    ensureDeletable(ctx, id, patchSets);
+    // Cleaning up is only possible as long as the change and its elements are
+    // still part of the database.
+    cleanUpReferences(ctx, id, patchSets);
+    deleteChangeElementsFromDb(ctx, id);
+
+    ctx.deleteChange();
+    changeDeleted.fire(ctx.getChange(), ctx.getAccount(), ctx.getWhen());
+    return true;
+  }
+
+  private void ensureDeletable(ChangeContext ctx, Change.Id id, Collection<PatchSet> patchSets)
+      throws ResourceConflictException, MethodNotAllowedException, IOException {
+    Change.Status status = ctx.getChange().getStatus();
+    if (status == Change.Status.MERGED) {
+      throw new MethodNotAllowedException("Deleting merged change " + id + " is not allowed");
+    }
+    for (PatchSet patchSet : patchSets) {
+      if (isPatchSetMerged(ctx, patchSet)) {
+        throw new ResourceConflictException(
+            String.format(
+                "Cannot delete change %s: patch set %s is already merged",
+                id, patchSet.getPatchSetId()));
+      }
+    }
+  }
+
+  private boolean isPatchSetMerged(ChangeContext ctx, PatchSet patchSet) throws IOException {
+    Optional<ObjectId> destId = ctx.getRepoView().getRef(ctx.getChange().getDest().get());
+    if (!destId.isPresent()) {
+      return false;
+    }
+
+    RevWalk revWalk = ctx.getRevWalk();
+    ObjectId objectId = ObjectId.fromString(patchSet.getRevision().get());
+    return revWalk.isMergedInto(revWalk.parseCommit(objectId), revWalk.parseCommit(destId.get()));
+  }
+
+  private void deleteChangeElementsFromDb(ChangeContext ctx, Change.Id id) throws OrmException {
+    // Only delete from ReviewDb here; deletion from NoteDb is handled in
+    // BatchUpdate.
+    //
+    // This is special. We want to delete exactly the rows that are present in
+    // the database, even when reading everything else from NoteDb, so we need
+    // to bypass the write-only wrapper.
+    ReviewDb db = BatchUpdateReviewDb.unwrap(ctx.getDb());
+    db.patchComments().delete(db.patchComments().byChange(id));
+    db.patchSetApprovals().delete(db.patchSetApprovals().byChange(id));
+    db.patchSets().delete(db.patchSets().byChange(id));
+    db.changeMessages().delete(db.changeMessages().byChange(id));
+  }
+
+  private void cleanUpReferences(ChangeContext ctx, Change.Id id, Collection<PatchSet> patchSets)
+      throws OrmException, NoSuchChangeException {
+    for (PatchSet ps : patchSets) {
+      accountPatchReviewStore.run(s -> s.clearReviewed(ps.getId()), OrmException.class);
+    }
+
+    // Non-atomic operation on Accounts table; not much we can do to make it
+    // atomic.
+    starredChangesUtil.unstarAll(ctx.getChange().getProject(), id);
+  }
+
+  @Override
+  public void updateRepo(RepoContext ctx) throws IOException {
+    String prefix = new PatchSet.Id(id, 1).toRefName();
+    prefix = prefix.substring(0, prefix.length() - 1);
+    for (Map.Entry<String, ObjectId> e : ctx.getRepoView().getRefs(prefix).entrySet()) {
+      ctx.addRefUpdate(e.getValue(), ObjectId.zeroId(), prefix + e.getKey());
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/change/DeleteReviewerByEmailOp.java b/java/com/google/gerrit/server/change/DeleteReviewerByEmailOp.java
new file mode 100644
index 0000000..ad4f4af
--- /dev/null
+++ b/java/com/google/gerrit/server/change/DeleteReviewerByEmailOp.java
@@ -0,0 +1,104 @@
+// Copyright (C) 2017 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.google.gerrit.server.change;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.changes.DeleteReviewerInput;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.ChangeUtil;
+import com.google.gerrit.server.mail.send.DeleteReviewerSender;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.Context;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.util.Collections;
+
+public class DeleteReviewerByEmailOp implements BatchUpdateOp {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public interface Factory {
+    DeleteReviewerByEmailOp create(Address reviewer, DeleteReviewerInput input);
+  }
+
+  private final DeleteReviewerSender.Factory deleteReviewerSenderFactory;
+  private final NotifyUtil notifyUtil;
+  private final Address reviewer;
+  private final DeleteReviewerInput input;
+
+  private ChangeMessage changeMessage;
+  private Change change;
+
+  @Inject
+  DeleteReviewerByEmailOp(
+      DeleteReviewerSender.Factory deleteReviewerSenderFactory,
+      NotifyUtil notifyUtil,
+      @Assisted Address reviewer,
+      @Assisted DeleteReviewerInput input) {
+    this.deleteReviewerSenderFactory = deleteReviewerSenderFactory;
+    this.notifyUtil = notifyUtil;
+    this.reviewer = reviewer;
+    this.input = input;
+  }
+
+  @Override
+  public boolean updateChange(ChangeContext ctx) throws OrmException {
+    change = ctx.getChange();
+    PatchSet.Id psId = ctx.getChange().currentPatchSetId();
+    String msg = "Removed reviewer " + reviewer;
+    changeMessage =
+        new ChangeMessage(
+            new ChangeMessage.Key(change.getId(), ChangeUtil.messageUuid()),
+            ctx.getAccountId(),
+            ctx.getWhen(),
+            psId);
+    changeMessage.setMessage(msg);
+
+    ctx.getUpdate(psId).setChangeMessage(msg);
+    ctx.getUpdate(psId).removeReviewerByEmail(reviewer);
+    return true;
+  }
+
+  @Override
+  public void postUpdate(Context ctx) {
+    if (input.notify == null) {
+      if (change.isWorkInProgress()) {
+        input.notify = NotifyHandling.NONE;
+      } else {
+        input.notify = NotifyHandling.ALL;
+      }
+    }
+    if (!NotifyUtil.shouldNotify(input.notify, input.notifyDetails)) {
+      return;
+    }
+    try {
+      DeleteReviewerSender cm =
+          deleteReviewerSenderFactory.create(ctx.getProject(), change.getId());
+      cm.setFrom(ctx.getAccountId());
+      cm.addReviewersByEmail(Collections.singleton(reviewer));
+      cm.setChangeMessage(changeMessage.getMessage(), changeMessage.getWrittenOn());
+      cm.setNotify(input.notify);
+      cm.setAccountsToNotify(notifyUtil.resolveAccounts(input.notifyDetails));
+      cm.send();
+    } catch (Exception err) {
+      logger.atSevere().withCause(err).log("Cannot email update for change %s", change.getId());
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/change/DeleteReviewerOp.java b/java/com/google/gerrit/server/change/DeleteReviewerOp.java
new file mode 100644
index 0000000..7915cb7
--- /dev/null
+++ b/java/com/google/gerrit/server/change/DeleteReviewerOp.java
@@ -0,0 +1,251 @@
+// Copyright (C) 2017 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.google.gerrit.server.change;
+
+import com.google.common.collect.Iterables;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.LabelTypes;
+import com.google.gerrit.extensions.api.changes.DeleteReviewerInput;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.reviewdb.server.ReviewDbUtil;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.extensions.events.ReviewerDeleted;
+import com.google.gerrit.server.mail.send.DeleteReviewerSender;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.RemoveReviewerControl;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.BatchUpdateReviewDb;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.Context;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class DeleteReviewerOp implements BatchUpdateOp {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public interface Factory {
+    DeleteReviewerOp create(AccountState reviewerAccount, DeleteReviewerInput input);
+  }
+
+  private final ApprovalsUtil approvalsUtil;
+  private final PatchSetUtil psUtil;
+  private final ChangeMessagesUtil cmUtil;
+  private final IdentifiedUser.GenericFactory userFactory;
+  private final ReviewerDeleted reviewerDeleted;
+  private final Provider<IdentifiedUser> user;
+  private final DeleteReviewerSender.Factory deleteReviewerSenderFactory;
+  private final NotesMigration migration;
+  private final NotifyUtil notifyUtil;
+  private final RemoveReviewerControl removeReviewerControl;
+  private final ProjectCache projectCache;
+
+  private final AccountState reviewer;
+  private final DeleteReviewerInput input;
+
+  ChangeMessage changeMessage;
+  Change currChange;
+  PatchSet currPs;
+  Map<String, Short> newApprovals = new HashMap<>();
+  Map<String, Short> oldApprovals = new HashMap<>();
+
+  @Inject
+  DeleteReviewerOp(
+      ApprovalsUtil approvalsUtil,
+      PatchSetUtil psUtil,
+      ChangeMessagesUtil cmUtil,
+      IdentifiedUser.GenericFactory userFactory,
+      ReviewerDeleted reviewerDeleted,
+      Provider<IdentifiedUser> user,
+      DeleteReviewerSender.Factory deleteReviewerSenderFactory,
+      NotesMigration migration,
+      NotifyUtil notifyUtil,
+      RemoveReviewerControl removeReviewerControl,
+      ProjectCache projectCache,
+      @Assisted AccountState reviewerAccount,
+      @Assisted DeleteReviewerInput input) {
+    this.approvalsUtil = approvalsUtil;
+    this.psUtil = psUtil;
+    this.cmUtil = cmUtil;
+    this.userFactory = userFactory;
+    this.reviewerDeleted = reviewerDeleted;
+    this.user = user;
+    this.deleteReviewerSenderFactory = deleteReviewerSenderFactory;
+    this.migration = migration;
+    this.notifyUtil = notifyUtil;
+    this.removeReviewerControl = removeReviewerControl;
+    this.projectCache = projectCache;
+    this.reviewer = reviewerAccount;
+    this.input = input;
+  }
+
+  @Override
+  public boolean updateChange(ChangeContext ctx)
+      throws AuthException, ResourceNotFoundException, OrmException, PermissionBackendException,
+          IOException {
+    Account.Id reviewerId = reviewer.getAccount().getId();
+    // Check of removing this reviewer (even if there is no vote processed by the loop below) is OK
+    removeReviewerControl.checkRemoveReviewer(ctx.getNotes(), ctx.getUser(), reviewerId);
+
+    if (!approvalsUtil.getReviewers(ctx.getDb(), ctx.getNotes()).all().contains(reviewerId)) {
+      throw new ResourceNotFoundException();
+    }
+    currChange = ctx.getChange();
+    currPs = psUtil.current(ctx.getDb(), ctx.getNotes());
+
+    LabelTypes labelTypes = projectCache.checkedGet(ctx.getProject()).getLabelTypes(ctx.getNotes());
+    // removing a reviewer will remove all her votes
+    for (LabelType lt : labelTypes.getLabelTypes()) {
+      newApprovals.put(lt.getName(), (short) 0);
+    }
+
+    StringBuilder msg = new StringBuilder();
+    msg.append("Removed reviewer " + reviewer.getAccount().getFullName());
+    StringBuilder removedVotesMsg = new StringBuilder();
+    removedVotesMsg.append(" with the following votes:\n\n");
+    List<PatchSetApproval> del = new ArrayList<>();
+    boolean votesRemoved = false;
+    for (PatchSetApproval a : approvals(ctx, reviewerId)) {
+      // Check if removing this vote is OK
+      removeReviewerControl.checkRemoveReviewer(ctx.getNotes(), ctx.getUser(), a);
+      del.add(a);
+      if (a.getPatchSetId().equals(currPs.getId()) && a.getValue() != 0) {
+        oldApprovals.put(a.getLabel(), a.getValue());
+        removedVotesMsg
+            .append("* ")
+            .append(a.getLabel())
+            .append(formatLabelValue(a.getValue()))
+            .append(" by ")
+            .append(userFactory.create(a.getAccountId()).getNameEmail())
+            .append("\n");
+        votesRemoved = true;
+      }
+    }
+
+    if (votesRemoved) {
+      msg.append(removedVotesMsg);
+    } else {
+      msg.append(".");
+    }
+    ctx.getDb().patchSetApprovals().delete(del);
+    ChangeUpdate update = ctx.getUpdate(currPs.getId());
+    update.removeReviewer(reviewerId);
+
+    changeMessage =
+        ChangeMessagesUtil.newMessage(ctx, msg.toString(), ChangeMessagesUtil.TAG_DELETE_REVIEWER);
+    cmUtil.addChangeMessage(ctx.getDb(), update, changeMessage);
+
+    return true;
+  }
+
+  @Override
+  public void postUpdate(Context ctx) {
+    if (input.notify == null) {
+      if (currChange.isWorkInProgress()) {
+        input.notify = oldApprovals.isEmpty() ? NotifyHandling.NONE : NotifyHandling.OWNER;
+      } else {
+        input.notify = NotifyHandling.ALL;
+      }
+    }
+    if (NotifyUtil.shouldNotify(input.notify, input.notifyDetails)) {
+      emailReviewers(ctx.getProject(), currChange, changeMessage);
+    }
+    reviewerDeleted.fire(
+        currChange,
+        currPs,
+        reviewer,
+        ctx.getAccount(),
+        changeMessage.getMessage(),
+        newApprovals,
+        oldApprovals,
+        input.notify,
+        ctx.getWhen());
+  }
+
+  private Iterable<PatchSetApproval> approvals(ChangeContext ctx, Account.Id accountId)
+      throws OrmException {
+    Change.Id changeId = ctx.getNotes().getChangeId();
+    Iterable<PatchSetApproval> approvals;
+    PrimaryStorage r = PrimaryStorage.of(ctx.getChange());
+
+    if (migration.readChanges() && r == PrimaryStorage.REVIEW_DB) {
+      // Because NoteDb and ReviewDb have different semantics for zero-value
+      // approvals, we must fall back to ReviewDb as the source of truth here.
+      ReviewDb db = ctx.getDb();
+
+      if (db instanceof BatchUpdateReviewDb) {
+        db = ((BatchUpdateReviewDb) db).unsafeGetDelegate();
+      }
+      db = ReviewDbUtil.unwrapDb(db);
+      approvals = db.patchSetApprovals().byChange(changeId);
+    } else {
+      approvals = approvalsUtil.byChange(ctx.getDb(), ctx.getNotes()).values();
+    }
+
+    return Iterables.filter(approvals, psa -> accountId.equals(psa.getAccountId()));
+  }
+
+  private String formatLabelValue(short value) {
+    if (value > 0) {
+      return "+" + value;
+    }
+    return Short.toString(value);
+  }
+
+  private void emailReviewers(
+      Project.NameKey projectName, Change change, ChangeMessage changeMessage) {
+    Account.Id userId = user.get().getAccountId();
+    if (userId.equals(reviewer.getAccount().getId())) {
+      // The user knows they removed themselves, don't bother emailing them.
+      return;
+    }
+    try {
+      DeleteReviewerSender cm = deleteReviewerSenderFactory.create(projectName, change.getId());
+      cm.setFrom(userId);
+      cm.addReviewers(Collections.singleton(reviewer.getAccount().getId()));
+      cm.setChangeMessage(changeMessage.getMessage(), changeMessage.getWrittenOn());
+      cm.setNotify(input.notify);
+      cm.setAccountsToNotify(notifyUtil.resolveAccounts(input.notifyDetails));
+      cm.send();
+    } catch (Exception err) {
+      logger.atSevere().withCause(err).log("Cannot email update for change %s", change.getId());
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/change/DownloadCommandsJson.java b/java/com/google/gerrit/server/change/DownloadCommandsJson.java
new file mode 100644
index 0000000..f56a16c
--- /dev/null
+++ b/java/com/google/gerrit/server/change/DownloadCommandsJson.java
@@ -0,0 +1,51 @@
+// 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.
+
+package com.google.gerrit.server.change;
+
+import com.google.gerrit.extensions.common.FetchInfo;
+import com.google.gerrit.extensions.config.DownloadCommand;
+import com.google.gerrit.extensions.config.DownloadScheme;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.registration.Extension;
+import java.util.TreeMap;
+
+/** Populates the {@link FetchInfo} which is serialized to JSON afterwards. */
+public class DownloadCommandsJson {
+
+  private DownloadCommandsJson() {}
+
+  /**
+   * Populates the provided {@link FetchInfo} by calling all {@link DownloadCommand} extensions.
+   * Will mutate {@link FetchInfo#commands}.
+   */
+  public static void populateFetchMap(
+      DownloadScheme scheme,
+      DynamicMap<DownloadCommand> commands,
+      String projectName,
+      String refName,
+      FetchInfo fetchInfo) {
+    for (Extension<DownloadCommand> ext : commands) {
+      String commandName = ext.getExportName();
+      DownloadCommand command = ext.getProvider().get();
+      String c = command.getCommand(scheme, projectName, refName);
+      if (c != null) {
+        if (fetchInfo.commands == null) {
+          fetchInfo.commands = new TreeMap<>();
+        }
+        fetchInfo.commands.put(commandName, c);
+      }
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/change/DraftCommentResource.java b/java/com/google/gerrit/server/change/DraftCommentResource.java
new file mode 100644
index 0000000..ef31725
--- /dev/null
+++ b/java/com/google/gerrit/server/change/DraftCommentResource.java
@@ -0,0 +1,56 @@
+// Copyright (C) 2017 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.google.gerrit.server.change;
+
+import com.google.gerrit.extensions.restapi.RestResource;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.CurrentUser;
+import com.google.inject.TypeLiteral;
+
+public class DraftCommentResource implements RestResource {
+  public static final TypeLiteral<RestView<DraftCommentResource>> DRAFT_COMMENT_KIND =
+      new TypeLiteral<RestView<DraftCommentResource>>() {};
+
+  private final RevisionResource rev;
+  private final Comment comment;
+
+  public DraftCommentResource(RevisionResource rev, Comment c) {
+    this.rev = rev;
+    this.comment = c;
+  }
+
+  public CurrentUser getUser() {
+    return rev.getUser();
+  }
+
+  public Change getChange() {
+    return rev.getChange();
+  }
+
+  public PatchSet getPatchSet() {
+    return rev.getPatchSet();
+  }
+
+  public Comment getComment() {
+    return comment;
+  }
+
+  public String getId() {
+    return comment.key.uuid;
+  }
+}
diff --git a/java/com/google/gerrit/server/change/EmailReviewComments.java b/java/com/google/gerrit/server/change/EmailReviewComments.java
new file mode 100644
index 0000000..65bef70
--- /dev/null
+++ b/java/com/google/gerrit/server/change/EmailReviewComments.java
@@ -0,0 +1,188 @@
+// Copyright (C) 2012 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.google.gerrit.server.change;
+
+import static com.google.gerrit.server.CommentsUtil.COMMENT_ORDER;
+
+import com.google.common.collect.ListMultimap;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.api.changes.RecipientType;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.config.SendEmailExecutor;
+import com.google.gerrit.server.mail.send.CommentSender;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.patch.PatchSetInfoFactory;
+import com.google.gerrit.server.util.LabelVote;
+import com.google.gerrit.server.util.RequestContext;
+import com.google.gerrit.server.util.ThreadLocalRequestContext;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.ProvisionException;
+import com.google.inject.assistedinject.Assisted;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+
+public class EmailReviewComments implements Runnable, RequestContext {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public interface Factory {
+    // TODO(dborowitz/wyatta): Rationalize these arguments so HTML and text templates are operating
+    // on the same set of inputs.
+    /**
+     * @param notify setting for handling notification.
+     * @param accountsToNotify detailed map of accounts to notify.
+     * @param notes change notes.
+     * @param patchSet patch set corresponding to the top-level op
+     * @param user user the email should come from.
+     * @param message used by text template only: the full ChangeMessage that will go in the
+     *     database. The contents of this message typically include the "Patch set N" header and "(M
+     *     comments)".
+     * @param comments inline comments.
+     * @param patchSetComment used by HTML template only: some quasi-human-generated text. The
+     *     contents should *not* include a "Patch set N" header or "(M comments)" footer, as these
+     *     will be added automatically in soy in a structured way.
+     * @param labels labels applied as part of this review operation.
+     * @return handle for sending email.
+     */
+    EmailReviewComments create(
+        NotifyHandling notify,
+        ListMultimap<RecipientType, Account.Id> accountsToNotify,
+        ChangeNotes notes,
+        PatchSet patchSet,
+        IdentifiedUser user,
+        ChangeMessage message,
+        List<Comment> comments,
+        String patchSetComment,
+        List<LabelVote> labels);
+  }
+
+  private final ExecutorService sendEmailsExecutor;
+  private final PatchSetInfoFactory patchSetInfoFactory;
+  private final CommentSender.Factory commentSenderFactory;
+  private final SchemaFactory<ReviewDb> schemaFactory;
+  private final ThreadLocalRequestContext requestContext;
+
+  private final NotifyHandling notify;
+  private final ListMultimap<RecipientType, Account.Id> accountsToNotify;
+  private final ChangeNotes notes;
+  private final PatchSet patchSet;
+  private final IdentifiedUser user;
+  private final ChangeMessage message;
+  private final List<Comment> comments;
+  private final String patchSetComment;
+  private final List<LabelVote> labels;
+  private ReviewDb db;
+
+  @Inject
+  EmailReviewComments(
+      @SendEmailExecutor ExecutorService executor,
+      PatchSetInfoFactory patchSetInfoFactory,
+      CommentSender.Factory commentSenderFactory,
+      SchemaFactory<ReviewDb> schemaFactory,
+      ThreadLocalRequestContext requestContext,
+      @Assisted NotifyHandling notify,
+      @Assisted ListMultimap<RecipientType, Account.Id> accountsToNotify,
+      @Assisted ChangeNotes notes,
+      @Assisted PatchSet patchSet,
+      @Assisted IdentifiedUser user,
+      @Assisted ChangeMessage message,
+      @Assisted List<Comment> comments,
+      @Nullable @Assisted String patchSetComment,
+      @Assisted List<LabelVote> labels) {
+    this.sendEmailsExecutor = executor;
+    this.patchSetInfoFactory = patchSetInfoFactory;
+    this.commentSenderFactory = commentSenderFactory;
+    this.schemaFactory = schemaFactory;
+    this.requestContext = requestContext;
+    this.notify = notify;
+    this.accountsToNotify = accountsToNotify;
+    this.notes = notes;
+    this.patchSet = patchSet;
+    this.user = user;
+    this.message = message;
+    this.comments = COMMENT_ORDER.sortedCopy(comments);
+    this.patchSetComment = patchSetComment;
+    this.labels = labels;
+  }
+
+  public void sendAsync() {
+    @SuppressWarnings("unused")
+    Future<?> possiblyIgnoredError = sendEmailsExecutor.submit(this);
+  }
+
+  @Override
+  public void run() {
+    RequestContext old = requestContext.setContext(this);
+    try {
+
+      CommentSender cm = commentSenderFactory.create(notes.getProjectName(), notes.getChangeId());
+      cm.setFrom(user.getAccountId());
+      cm.setPatchSet(patchSet, patchSetInfoFactory.get(notes.getProjectName(), patchSet));
+      cm.setChangeMessage(message.getMessage(), message.getWrittenOn());
+      cm.setComments(comments);
+      cm.setPatchSetComment(patchSetComment);
+      cm.setLabels(labels);
+      cm.setNotify(notify);
+      cm.setAccountsToNotify(accountsToNotify);
+      cm.send();
+    } catch (Exception e) {
+      logger.atSevere().withCause(e).log("Cannot email comments for %s", patchSet.getId());
+    } finally {
+      requestContext.setContext(old);
+      if (db != null) {
+        db.close();
+        db = null;
+      }
+    }
+  }
+
+  @Override
+  public String toString() {
+    return "send-email comments";
+  }
+
+  @Override
+  public CurrentUser getUser() {
+    return user.getRealUser();
+  }
+
+  @Override
+  public Provider<ReviewDb> getReviewDbProvider() {
+    return new Provider<ReviewDb>() {
+      @Override
+      public ReviewDb get() {
+        if (db == null) {
+          try {
+            db = schemaFactory.open();
+          } catch (OrmException e) {
+            throw new ProvisionException("Cannot open ReviewDb", e);
+          }
+        }
+        return db;
+      }
+    };
+  }
+}
diff --git a/java/com/google/gerrit/server/change/FileContentUtil.java b/java/com/google/gerrit/server/change/FileContentUtil.java
new file mode 100644
index 0000000..a806f94
--- /dev/null
+++ b/java/com/google/gerrit/server/change/FileContentUtil.java
@@ -0,0 +1,319 @@
+// Copyright (C) 2013 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.google.gerrit.server.change;
+
+import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
+
+import com.google.common.base.Strings;
+import com.google.common.hash.Hasher;
+import com.google.common.hash.Hashing;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.PatchScript.FileMode;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.BinaryResult;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.mime.FileTypeRegistry;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import eu.medsea.mimeutil.MimeType;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.security.SecureRandom;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+import org.eclipse.jgit.errors.LargeObjectException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectLoader;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.treewalk.TreeWalk;
+import org.eclipse.jgit.util.NB;
+
+@Singleton
+public class FileContentUtil {
+  public static final String TEXT_X_GERRIT_COMMIT_MESSAGE = "text/x-gerrit-commit-message";
+  public static final String TEXT_X_GERRIT_MERGE_LIST = "text/x-gerrit-merge-list";
+  private static final String X_GIT_SYMLINK = "x-git/symlink";
+  private static final String X_GIT_GITLINK = "x-git/gitlink";
+  private static final int MAX_SIZE = 5 << 20;
+  private static final String ZIP_TYPE = "application/zip";
+  private static final SecureRandom rng = new SecureRandom();
+
+  private final GitRepositoryManager repoManager;
+  private final FileTypeRegistry registry;
+
+  @Inject
+  FileContentUtil(GitRepositoryManager repoManager, FileTypeRegistry ftr) {
+    this.repoManager = repoManager;
+    this.registry = ftr;
+  }
+
+  /**
+   * Get the content of a file at a specific commit or one of it's parent commits.
+   *
+   * @param project A {@code Project} that this request refers to.
+   * @param revstr An {@code ObjectId} specifying the commit.
+   * @param path A string specifying the filepath.
+   * @param parent A 1-based parent index to get the content from instead. Null if the content
+   *     should be obtained from {@code revstr} instead.
+   * @return Content of the file as {@code BinaryResult}.
+   * @throws ResourceNotFoundException
+   * @throws IOException
+   */
+  public BinaryResult getContent(
+      ProjectState project, ObjectId revstr, String path, @Nullable Integer parent)
+      throws BadRequestException, ResourceNotFoundException, IOException {
+    try (Repository repo = openRepository(project);
+        RevWalk rw = new RevWalk(repo)) {
+      if (parent != null) {
+        RevCommit revCommit = rw.parseCommit(revstr);
+        if (revCommit == null) {
+          throw new ResourceNotFoundException("commit not found");
+        }
+        if (parent > revCommit.getParentCount()) {
+          throw new BadRequestException("invalid parent");
+        }
+        revstr = rw.parseCommit(revstr).getParent(Integer.max(0, parent - 1)).toObjectId();
+      }
+      return getContent(repo, project, revstr, path);
+    }
+  }
+
+  public BinaryResult getContent(
+      Repository repo, ProjectState project, ObjectId revstr, String path)
+      throws IOException, ResourceNotFoundException {
+    try (RevWalk rw = new RevWalk(repo)) {
+      RevCommit commit = rw.parseCommit(revstr);
+      try (TreeWalk tw = TreeWalk.forPath(rw.getObjectReader(), path, commit.getTree())) {
+        if (tw == null) {
+          throw new ResourceNotFoundException();
+        }
+
+        org.eclipse.jgit.lib.FileMode mode = tw.getFileMode(0);
+        ObjectId id = tw.getObjectId(0);
+        if (mode == org.eclipse.jgit.lib.FileMode.GITLINK) {
+          return BinaryResult.create(id.name()).setContentType(X_GIT_GITLINK).base64();
+        }
+
+        ObjectLoader obj = repo.open(id, OBJ_BLOB);
+        byte[] raw;
+        try {
+          raw = obj.getCachedBytes(MAX_SIZE);
+        } catch (LargeObjectException e) {
+          raw = null;
+        }
+
+        String type;
+        if (mode == org.eclipse.jgit.lib.FileMode.SYMLINK) {
+          type = X_GIT_SYMLINK;
+        } else {
+          type = registry.getMimeType(path, raw).toString();
+          type = resolveContentType(project, path, FileMode.FILE, type);
+        }
+
+        return asBinaryResult(raw, obj).setContentType(type).base64();
+      }
+    }
+  }
+
+  private static BinaryResult asBinaryResult(byte[] raw, ObjectLoader obj) {
+    if (raw != null) {
+      return BinaryResult.create(raw);
+    }
+    BinaryResult result =
+        new BinaryResult() {
+          @Override
+          public void writeTo(OutputStream os) throws IOException {
+            obj.copyTo(os);
+          }
+        };
+    result.setContentLength(obj.getSize());
+    return result;
+  }
+
+  public BinaryResult downloadContent(
+      ProjectState project, ObjectId revstr, String path, @Nullable Integer parent)
+      throws ResourceNotFoundException, IOException {
+    try (Repository repo = openRepository(project);
+        RevWalk rw = new RevWalk(repo)) {
+      String suffix = "new";
+      RevCommit commit = rw.parseCommit(revstr);
+      if (parent != null && parent > 0) {
+        if (commit.getParentCount() == 1) {
+          suffix = "old";
+        } else {
+          suffix = "old" + parent;
+        }
+        commit = rw.parseCommit(commit.getParent(parent - 1));
+      }
+      try (TreeWalk tw = TreeWalk.forPath(rw.getObjectReader(), path, commit.getTree())) {
+        if (tw == null) {
+          throw new ResourceNotFoundException();
+        }
+
+        int mode = tw.getFileMode(0).getObjectType();
+        if (mode != Constants.OBJ_BLOB) {
+          throw new ResourceNotFoundException();
+        }
+
+        ObjectId id = tw.getObjectId(0);
+        ObjectLoader obj = repo.open(id, OBJ_BLOB);
+        byte[] raw;
+        try {
+          raw = obj.getCachedBytes(MAX_SIZE);
+        } catch (LargeObjectException e) {
+          raw = null;
+        }
+
+        MimeType contentType = registry.getMimeType(path, raw);
+        return registry.isSafeInline(contentType)
+            ? wrapBlob(path, obj, raw, contentType, suffix)
+            : zipBlob(path, obj, commit, suffix);
+      }
+    }
+  }
+
+  private BinaryResult wrapBlob(
+      String path,
+      final ObjectLoader obj,
+      byte[] raw,
+      MimeType contentType,
+      @Nullable String suffix) {
+    return asBinaryResult(raw, obj)
+        .setContentType(contentType.toString())
+        .setAttachmentName(safeFileName(path, suffix));
+  }
+
+  @SuppressWarnings("resource")
+  private BinaryResult zipBlob(
+      final String path, ObjectLoader obj, RevCommit commit, @Nullable final String suffix) {
+    final String commitName = commit.getName();
+    final long when = commit.getCommitTime() * 1000L;
+    return new BinaryResult() {
+      @Override
+      public void writeTo(OutputStream os) throws IOException {
+        try (ZipOutputStream zipOut = new ZipOutputStream(os)) {
+          String decoration = randSuffix();
+          if (!Strings.isNullOrEmpty(suffix)) {
+            decoration = suffix + '-' + decoration;
+          }
+          ZipEntry e = new ZipEntry(safeFileName(path, decoration));
+          e.setComment(commitName + ":" + path);
+          e.setSize(obj.getSize());
+          e.setTime(when);
+          zipOut.putNextEntry(e);
+          obj.copyTo(zipOut);
+          zipOut.closeEntry();
+        }
+      }
+    }.setContentType(ZIP_TYPE).setAttachmentName(safeFileName(path, suffix) + ".zip").disableGzip();
+  }
+
+  private static String safeFileName(String fileName, @Nullable String suffix) {
+    // Convert a file path (e.g. "src/Init.c") to a safe file name with
+    // no meta-characters that might be unsafe on any given platform.
+    //
+    int slash = fileName.lastIndexOf('/');
+    if (slash >= 0) {
+      fileName = fileName.substring(slash + 1);
+    }
+
+    StringBuilder r = new StringBuilder(fileName.length());
+    for (int i = 0; i < fileName.length(); i++) {
+      final char c = fileName.charAt(i);
+      if (c == '_' || c == '-' || c == '.' || c == '@') {
+        r.append(c);
+      } else if ('0' <= c && c <= '9') {
+        r.append(c);
+      } else if ('A' <= c && c <= 'Z') {
+        r.append(c);
+      } else if ('a' <= c && c <= 'z') {
+        r.append(c);
+      } else if (c == ' ' || c == '\n' || c == '\r' || c == '\t') {
+        r.append('-');
+      } else {
+        r.append('_');
+      }
+    }
+    fileName = r.toString();
+
+    int ext = fileName.lastIndexOf('.');
+    if (suffix == null) {
+      return fileName;
+    } else if (ext <= 0) {
+      return fileName + "_" + suffix;
+    } else {
+      return fileName.substring(0, ext) + "_" + suffix + fileName.substring(ext);
+    }
+  }
+
+  private static String randSuffix() {
+    // Produce a random suffix that is difficult (or nearly impossible)
+    // for an attacker to guess in advance. This reduces the risk that
+    // an attacker could upload a *.class file and have us send a ZIP
+    // that can be invoked through an applet tag in the victim's browser.
+    //
+    Hasher h = Hashing.murmur3_128().newHasher();
+    byte[] buf = new byte[8];
+
+    NB.encodeInt64(buf, 0, TimeUtil.nowMs());
+    h.putBytes(buf);
+
+    rng.nextBytes(buf);
+    h.putBytes(buf);
+
+    return h.hash().toString();
+  }
+
+  public static String resolveContentType(
+      ProjectState project, String path, FileMode fileMode, String mimeType) {
+    switch (fileMode) {
+      case FILE:
+        if (Patch.COMMIT_MSG.equals(path)) {
+          return TEXT_X_GERRIT_COMMIT_MESSAGE;
+        }
+        if (Patch.MERGE_LIST.equals(path)) {
+          return TEXT_X_GERRIT_MERGE_LIST;
+        }
+        if (project != null) {
+          for (ProjectState p : project.tree()) {
+            String t = p.getConfig().getMimeTypes().getMimeType(path);
+            if (t != null) {
+              return t;
+            }
+          }
+        }
+        return mimeType;
+      case GITLINK:
+        return X_GIT_GITLINK;
+      case SYMLINK:
+        return X_GIT_SYMLINK;
+      default:
+        throw new IllegalStateException("file mode: " + fileMode);
+    }
+  }
+
+  private Repository openRepository(ProjectState project)
+      throws RepositoryNotFoundException, IOException {
+    return repoManager.openRepository(project.getNameKey());
+  }
+}
diff --git a/java/com/google/gerrit/server/change/FileInfoJson.java b/java/com/google/gerrit/server/change/FileInfoJson.java
new file mode 100644
index 0000000..56cc8df
--- /dev/null
+++ b/java/com/google/gerrit/server/change/FileInfoJson.java
@@ -0,0 +1,115 @@
+// Copyright (C) 2013 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.google.gerrit.server.change;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
+import com.google.gerrit.extensions.common.FileInfo;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RevId;
+import com.google.gerrit.server.patch.PatchList;
+import com.google.gerrit.server.patch.PatchListCache;
+import com.google.gerrit.server.patch.PatchListEntry;
+import com.google.gerrit.server.patch.PatchListKey;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.Map;
+import java.util.TreeMap;
+import org.eclipse.jgit.lib.ObjectId;
+
+@Singleton
+public class FileInfoJson {
+  private final PatchListCache patchListCache;
+
+  @Inject
+  FileInfoJson(PatchListCache patchListCache) {
+    this.patchListCache = patchListCache;
+  }
+
+  public Map<String, FileInfo> toFileInfoMap(Change change, PatchSet patchSet)
+      throws PatchListNotAvailableException {
+    return toFileInfoMap(change, patchSet.getRevision(), null);
+  }
+
+  public Map<String, FileInfo> toFileInfoMap(Change change, RevId revision, @Nullable PatchSet base)
+      throws PatchListNotAvailableException {
+    ObjectId objectId = ObjectId.fromString(revision.get());
+    return toFileInfoMap(change, objectId, base);
+  }
+
+  public Map<String, FileInfo> toFileInfoMap(
+      Change change, ObjectId objectId, @Nullable PatchSet base)
+      throws PatchListNotAvailableException {
+    ObjectId a = (base == null) ? null : ObjectId.fromString(base.getRevision().get());
+    return toFileInfoMap(change, PatchListKey.againstCommit(a, objectId, Whitespace.IGNORE_NONE));
+  }
+
+  public Map<String, FileInfo> toFileInfoMap(Change change, RevId revision, int parent)
+      throws PatchListNotAvailableException {
+    ObjectId b = ObjectId.fromString(revision.get());
+    return toFileInfoMap(
+        change, PatchListKey.againstParentNum(parent + 1, b, Whitespace.IGNORE_NONE));
+  }
+
+  private Map<String, FileInfo> toFileInfoMap(Change change, PatchListKey key)
+      throws PatchListNotAvailableException {
+    return toFileInfoMap(change.getProject(), key);
+  }
+
+  public Map<String, FileInfo> toFileInfoMap(Project.NameKey project, PatchListKey key)
+      throws PatchListNotAvailableException {
+    PatchList list = patchListCache.get(key, project);
+
+    Map<String, FileInfo> files = new TreeMap<>();
+    for (PatchListEntry e : list.getPatches()) {
+      FileInfo d = new FileInfo();
+      d.status =
+          e.getChangeType() != Patch.ChangeType.MODIFIED ? e.getChangeType().getCode() : null;
+      d.oldPath = e.getOldName();
+      d.sizeDelta = e.getSizeDelta();
+      d.size = e.getSize();
+      if (e.getPatchType() == Patch.PatchType.BINARY) {
+        d.binary = true;
+      } else {
+        d.linesInserted = e.getInsertions() > 0 ? e.getInsertions() : null;
+        d.linesDeleted = e.getDeletions() > 0 ? e.getDeletions() : null;
+      }
+
+      FileInfo o = files.put(e.getNewName(), d);
+      if (o != null) {
+        // This should only happen on a delete-add break created by JGit
+        // when the file was rewritten and too little content survived. Write
+        // a single record with data from both sides.
+        d.status = Patch.ChangeType.REWRITE.getCode();
+        d.sizeDelta = o.sizeDelta;
+        d.size = o.size;
+        if (o.binary != null && o.binary) {
+          d.binary = true;
+        }
+        if (o.linesInserted != null) {
+          d.linesInserted = o.linesInserted;
+        }
+        if (o.linesDeleted != null) {
+          d.linesDeleted = o.linesDeleted;
+        }
+      }
+    }
+    return files;
+  }
+}
diff --git a/java/com/google/gerrit/server/change/FileResource.java b/java/com/google/gerrit/server/change/FileResource.java
new file mode 100644
index 0000000..bd7557f
--- /dev/null
+++ b/java/com/google/gerrit/server/change/FileResource.java
@@ -0,0 +1,50 @@
+// Copyright (C) 2017 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.google.gerrit.server.change;
+
+import com.google.gerrit.extensions.restapi.RestResource;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.inject.TypeLiteral;
+
+public class FileResource implements RestResource {
+  public static final TypeLiteral<RestView<FileResource>> FILE_KIND =
+      new TypeLiteral<RestView<FileResource>>() {};
+
+  private final RevisionResource rev;
+  private final Patch.Key key;
+
+  public FileResource(RevisionResource rev, String name) {
+    this.rev = rev;
+    this.key = new Patch.Key(rev.getPatchSet().getId(), name);
+  }
+
+  public Patch.Key getPatchKey() {
+    return key;
+  }
+
+  public boolean isCacheable() {
+    return rev.isCacheable();
+  }
+
+  public Account.Id getAccountId() {
+    return rev.getAccountId();
+  }
+
+  public RevisionResource getRevision() {
+    return rev;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/FixResource.java b/java/com/google/gerrit/server/change/FixResource.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/change/FixResource.java
rename to java/com/google/gerrit/server/change/FixResource.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/HashtagsUtil.java b/java/com/google/gerrit/server/change/HashtagsUtil.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/change/HashtagsUtil.java
rename to java/com/google/gerrit/server/change/HashtagsUtil.java
diff --git a/java/com/google/gerrit/server/change/IncludedIn.java b/java/com/google/gerrit/server/change/IncludedIn.java
new file mode 100644
index 0000000..3ac6959
--- /dev/null
+++ b/java/com/google/gerrit/server/change/IncludedIn.java
@@ -0,0 +1,78 @@
+// Copyright (C) 2013 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.google.gerrit.server.change;
+
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.MultimapBuilder;
+import com.google.gerrit.extensions.api.changes.IncludedInInfo;
+import com.google.gerrit.extensions.config.ExternalIncludedIn;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.IncorrectObjectTypeException;
+import org.eclipse.jgit.errors.MissingObjectException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+@Singleton
+public class IncludedIn {
+  private final GitRepositoryManager repoManager;
+  private final PluginSetContext<ExternalIncludedIn> externalIncludedIn;
+
+  @Inject
+  IncludedIn(
+      GitRepositoryManager repoManager, PluginSetContext<ExternalIncludedIn> externalIncludedIn) {
+    this.repoManager = repoManager;
+    this.externalIncludedIn = externalIncludedIn;
+  }
+
+  public IncludedInInfo apply(Project.NameKey project, String revisionId)
+      throws RestApiException, IOException {
+    try (Repository r = repoManager.openRepository(project);
+        RevWalk rw = new RevWalk(r)) {
+      rw.setRetainBody(false);
+      RevCommit rev;
+      try {
+        rev = rw.parseCommit(ObjectId.fromString(revisionId));
+      } catch (IncorrectObjectTypeException err) {
+        throw new BadRequestException(err.getMessage());
+      } catch (MissingObjectException err) {
+        throw new ResourceConflictException(err.getMessage());
+      }
+
+      IncludedInResolver.Result d = IncludedInResolver.resolve(r, rw, rev);
+      ListMultimap<String, String> external = MultimapBuilder.hashKeys().arrayListValues().build();
+      externalIncludedIn.runEach(
+          ext -> {
+            ListMultimap<String, String> extIncludedIns =
+                ext.getIncludedIn(project.get(), rev.name(), d.tags(), d.branches());
+            if (extIncludedIns != null) {
+              external.putAll(extIncludedIns);
+            }
+          });
+
+      return new IncludedInInfo(
+          d.branches(), d.tags(), (!external.isEmpty() ? external.asMap() : null));
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/change/IncludedInResolver.java b/java/com/google/gerrit/server/change/IncludedInResolver.java
new file mode 100644
index 0000000..09ca258
--- /dev/null
+++ b/java/com/google/gerrit/server/change/IncludedInResolver.java
@@ -0,0 +1,218 @@
+// Copyright (C) 2013 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.google.gerrit.server.change;
+
+import static com.google.common.collect.ImmutableSortedSet.toImmutableSortedSet;
+import static java.util.Comparator.comparing;
+import static java.util.Comparator.naturalOrder;
+import static java.util.stream.Collectors.toList;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableSortedSet;
+import com.google.common.collect.LinkedListMultimap;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Lists;
+import com.google.common.flogger.FluentLogger;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.jgit.errors.IncorrectObjectTypeException;
+import org.eclipse.jgit.errors.MissingObjectException;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefDatabase;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevFlag;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+/** Resolve in which tags and branches a commit is included. */
+public class IncludedInResolver {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static Result resolve(Repository repo, RevWalk rw, RevCommit commit) throws IOException {
+    RevFlag flag = newFlag(rw);
+    try {
+      return new IncludedInResolver(repo, rw, commit, flag).resolve();
+    } finally {
+      rw.disposeFlag(flag);
+    }
+  }
+
+  public static boolean includedInAny(
+      final Repository repo, RevWalk rw, RevCommit commit, Collection<Ref> refs)
+      throws IOException {
+    if (refs.isEmpty()) {
+      return false;
+    }
+    RevFlag flag = newFlag(rw);
+    try {
+      return new IncludedInResolver(repo, rw, commit, flag).includedInOne(refs);
+    } finally {
+      rw.disposeFlag(flag);
+    }
+  }
+
+  private static RevFlag newFlag(RevWalk rw) {
+    return rw.newFlag("CONTAINS_TARGET");
+  }
+
+  private final Repository repo;
+  private final RevWalk rw;
+  private final RevCommit target;
+
+  private final RevFlag containsTarget;
+  private ListMultimap<RevCommit, String> commitToRef;
+  private List<RevCommit> tipsByCommitTime;
+
+  private IncludedInResolver(
+      Repository repo, RevWalk rw, RevCommit target, RevFlag containsTarget) {
+    this.repo = repo;
+    this.rw = rw;
+    this.target = target;
+    this.containsTarget = containsTarget;
+  }
+
+  private Result resolve() throws IOException {
+    RefDatabase refDb = repo.getRefDatabase();
+    Collection<Ref> tags = refDb.getRefsByPrefix(Constants.R_TAGS);
+    Collection<Ref> branches = refDb.getRefsByPrefix(Constants.R_HEADS);
+    List<Ref> allTagsAndBranches = Lists.newArrayListWithCapacity(tags.size() + branches.size());
+    allTagsAndBranches.addAll(tags);
+    allTagsAndBranches.addAll(branches);
+    parseCommits(allTagsAndBranches);
+    Set<String> allMatchingTagsAndBranches = includedIn(tipsByCommitTime, 0);
+
+    return new AutoValue_IncludedInResolver_Result(
+        getMatchingRefNames(allMatchingTagsAndBranches, branches),
+        getMatchingRefNames(allMatchingTagsAndBranches, tags));
+  }
+
+  private boolean includedInOne(Collection<Ref> refs) throws IOException {
+    parseCommits(refs);
+    List<RevCommit> before = new ArrayList<>();
+    List<RevCommit> after = new ArrayList<>();
+    partition(before, after);
+    rw.reset();
+    // It is highly likely that the target is reachable from the "after" set
+    // Within the "before" set we are trying to handle cases arising from clock skew
+    return !includedIn(after, 1).isEmpty() || !includedIn(before, 1).isEmpty();
+  }
+
+  /** Resolves which tip refs include the target commit. */
+  private Set<String> includedIn(Collection<RevCommit> tips, int limit)
+      throws IOException, MissingObjectException, IncorrectObjectTypeException {
+    Set<String> result = new HashSet<>();
+    for (RevCommit tip : tips) {
+      boolean commitFound = false;
+      rw.resetRetain(RevFlag.UNINTERESTING, containsTarget);
+      rw.markStart(tip);
+      for (RevCommit commit : rw) {
+        if (commit.equals(target) || commit.has(containsTarget)) {
+          commitFound = true;
+          tip.add(containsTarget);
+          result.addAll(commitToRef.get(tip));
+          break;
+        }
+      }
+      if (!commitFound) {
+        rw.markUninteresting(tip);
+      } else if (0 < limit && limit < result.size()) {
+        break;
+      }
+    }
+    return result;
+  }
+
+  /**
+   * Partition the reference tips into two sets:
+   *
+   * <ul>
+   *   <li>before = commits with time < target.getCommitTime()
+   *   <li>after = commits with time >= target.getCommitTime()
+   * </ul>
+   *
+   * Each of the before/after lists is sorted by the commit time.
+   *
+   * @param before
+   * @param after
+   */
+  private void partition(List<RevCommit> before, List<RevCommit> after) {
+    int insertionPoint =
+        Collections.binarySearch(tipsByCommitTime, target, comparing(RevCommit::getCommitTime));
+    if (insertionPoint < 0) {
+      insertionPoint = -(insertionPoint + 1);
+    }
+    if (0 < insertionPoint) {
+      before.addAll(tipsByCommitTime.subList(0, insertionPoint));
+    }
+    if (insertionPoint < tipsByCommitTime.size()) {
+      after.addAll(tipsByCommitTime.subList(insertionPoint, tipsByCommitTime.size()));
+    }
+  }
+
+  /**
+   * Returns the short names of refs which are as well in the matchingRefs list as well as in the
+   * allRef list.
+   */
+  private static ImmutableSortedSet<String> getMatchingRefNames(
+      Set<String> matchingRefs, Collection<Ref> allRefs) {
+    return allRefs.stream()
+        .map(Ref::getName)
+        .filter(matchingRefs::contains)
+        .map(Repository::shortenRefName)
+        .collect(toImmutableSortedSet(naturalOrder()));
+  }
+
+  /** Parse commit of ref and store the relation between ref and commit. */
+  private void parseCommits(Collection<Ref> refs) throws IOException {
+    if (commitToRef != null) {
+      return;
+    }
+    commitToRef = LinkedListMultimap.create();
+    for (Ref ref : refs) {
+      final RevCommit commit;
+      try {
+        commit = rw.parseCommit(ref.getObjectId());
+      } catch (IncorrectObjectTypeException notCommit) {
+        // Its OK for a tag reference to point to a blob or a tree, this
+        // is common in the Linux kernel or git.git repository.
+        //
+        continue;
+      } catch (MissingObjectException notHere) {
+        // Log the problem with this branch, but keep processing.
+        //
+        logger.atWarning().log(
+            "Reference %s in %s points to dangling object %s",
+            ref.getName(), repo.getDirectory(), ref.getObjectId());
+        continue;
+      }
+      commitToRef.put(commit, ref.getName());
+    }
+    tipsByCommitTime =
+        commitToRef.keySet().stream().sorted(comparing(RevCommit::getCommitTime)).collect(toList());
+  }
+
+  @AutoValue
+  public abstract static class Result {
+    public abstract ImmutableSortedSet<String> branches();
+
+    public abstract ImmutableSortedSet<String> tags();
+  }
+}
diff --git a/java/com/google/gerrit/server/change/LabelNormalizer.java b/java/com/google/gerrit/server/change/LabelNormalizer.java
new file mode 100644
index 0000000..1ec1717
--- /dev/null
+++ b/java/com/google/gerrit/server/change/LabelNormalizer.java
@@ -0,0 +1,131 @@
+// Copyright (C) 2013 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.google.gerrit.server.change;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.LabelTypes;
+import com.google.gerrit.common.data.LabelValue;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Normalizes votes on labels according to project config.
+ *
+ * <p>Votes are recorded in the database for a user based on the state of the project at that time:
+ * what labels are defined for the project. The label definition can change between the time a vote
+ * is originally made and a later point, for example when a change is submitted. This class
+ * normalizes old votes against current project configuration.
+ */
+@Singleton
+public class LabelNormalizer {
+  @AutoValue
+  public abstract static class Result {
+    @VisibleForTesting
+    static Result create(
+        List<PatchSetApproval> unchanged,
+        List<PatchSetApproval> updated,
+        List<PatchSetApproval> deleted) {
+      return new AutoValue_LabelNormalizer_Result(
+          ImmutableList.copyOf(unchanged),
+          ImmutableList.copyOf(updated),
+          ImmutableList.copyOf(deleted));
+    }
+
+    public abstract ImmutableList<PatchSetApproval> unchanged();
+
+    public abstract ImmutableList<PatchSetApproval> updated();
+
+    public abstract ImmutableList<PatchSetApproval> deleted();
+
+    public Iterable<PatchSetApproval> getNormalized() {
+      return Iterables.concat(unchanged(), updated());
+    }
+  }
+
+  private final ProjectCache projectCache;
+
+  @Inject
+  LabelNormalizer(ProjectCache projectCache) {
+    this.projectCache = projectCache;
+  }
+
+  /**
+   * @param notes change notes containing the given approvals.
+   * @param approvals list of approvals.
+   * @return copies of approvals normalized to the defined ranges for the label type. Approvals for
+   *     unknown labels are not included in the output.
+   */
+  public Result normalize(ChangeNotes notes, Collection<PatchSetApproval> approvals)
+      throws IOException {
+    List<PatchSetApproval> unchanged = Lists.newArrayListWithCapacity(approvals.size());
+    List<PatchSetApproval> updated = Lists.newArrayListWithCapacity(approvals.size());
+    List<PatchSetApproval> deleted = Lists.newArrayListWithCapacity(approvals.size());
+    LabelTypes labelTypes = projectCache.checkedGet(notes.getProjectName()).getLabelTypes(notes);
+    for (PatchSetApproval psa : approvals) {
+      Change.Id changeId = psa.getKey().getParentKey().getParentKey();
+      checkArgument(
+          changeId.equals(notes.getChangeId()),
+          "Approval %s does not match change %s",
+          psa.getKey(),
+          notes.getChange().getKey());
+      if (psa.isLegacySubmit()) {
+        unchanged.add(psa);
+        continue;
+      }
+      LabelType label = labelTypes.byLabel(psa.getLabelId());
+      if (label == null) {
+        deleted.add(psa);
+        continue;
+      }
+      PatchSetApproval copy = copy(psa);
+      applyTypeFloor(label, copy);
+      if (copy.getValue() != psa.getValue()) {
+        updated.add(copy);
+      } else {
+        unchanged.add(psa);
+      }
+    }
+    return Result.create(unchanged, updated, deleted);
+  }
+
+  private PatchSetApproval copy(PatchSetApproval src) {
+    return new PatchSetApproval(src.getPatchSetId(), src);
+  }
+
+  private void applyTypeFloor(LabelType lt, PatchSetApproval a) {
+    LabelValue atMin = lt.getMin();
+    if (atMin != null && a.getValue() < atMin.getValue()) {
+      a.setValue(atMin.getValue());
+    }
+    LabelValue atMax = lt.getMax();
+    if (atMax != null && a.getValue() > atMax.getValue()) {
+      a.setValue(atMax.getValue());
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/change/LabelsJson.java b/java/com/google/gerrit/server/change/LabelsJson.java
new file mode 100644
index 0000000..787e8ef
--- /dev/null
+++ b/java/com/google/gerrit/server/change/LabelsJson.java
@@ -0,0 +1,553 @@
+// 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.
+
+package com.google.gerrit.server.change;
+
+import static com.google.common.base.Preconditions.checkState;
+import static java.util.stream.Collectors.toList;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.HashBasedTable;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.LinkedHashMultimap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.collect.SetMultimap;
+import com.google.common.collect.Sets;
+import com.google.common.collect.Table;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.primitives.Ints;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.LabelTypes;
+import com.google.gerrit.common.data.LabelValue;
+import com.google.gerrit.common.data.SubmitRecord;
+import com.google.gerrit.extensions.client.ListChangesOption;
+import com.google.gerrit.extensions.common.ApprovalInfo;
+import com.google.gerrit.extensions.common.LabelInfo;
+import com.google.gerrit.extensions.common.VotingRangeInfo;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Account.Id;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.account.AccountLoader;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.ReviewerStateInternal;
+import com.google.gerrit.server.permissions.LabelPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.Assisted;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+
+/**
+ * Produces label-related entities, like {@link LabelInfo}s, which is serialized to JSON afterwards.
+ */
+public class LabelsJson {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public interface Factory {
+    LabelsJson create(Iterable<ListChangesOption> options);
+  }
+
+  private final Provider<ReviewDb> db;
+  private final ApprovalsUtil approvalsUtil;
+  private final ChangeNotes.Factory notesFactory;
+  private final PermissionBackend permissionBackend;
+  private final boolean lazyLoad;
+
+  @Inject
+  LabelsJson(
+      Provider<ReviewDb> db,
+      ApprovalsUtil approvalsUtil,
+      ChangeNotes.Factory notesFactory,
+      PermissionBackend permissionBackend,
+      @Assisted Iterable<ListChangesOption> options) {
+    this.db = db;
+    this.approvalsUtil = approvalsUtil;
+    this.notesFactory = notesFactory;
+    this.permissionBackend = permissionBackend;
+    this.lazyLoad = containsAnyOf(Sets.immutableEnumSet(options), ChangeJson.REQUIRE_LAZY_LOAD);
+  }
+
+  /**
+   * Returns all {@link LabelInfo}s for a single change. Uses the provided {@link AccountLoader} to
+   * lazily populate accounts. Callers have to call {@link AccountLoader#fill()} afterwards to
+   * populate all accounts in the returned {@link LabelInfo}s.
+   */
+  Map<String, LabelInfo> labelsFor(
+      AccountLoader accountLoader, ChangeData cd, boolean standard, boolean detailed)
+      throws OrmException, PermissionBackendException {
+    if (!standard && !detailed) {
+      return null;
+    }
+
+    LabelTypes labelTypes = cd.getLabelTypes();
+    Map<String, LabelWithStatus> withStatus =
+        cd.change().getStatus() == Change.Status.MERGED
+            ? labelsForSubmittedChange(accountLoader, cd, labelTypes, standard, detailed)
+            : labelsForUnsubmittedChange(accountLoader, cd, labelTypes, standard, detailed);
+    return ImmutableMap.copyOf(Maps.transformValues(withStatus, LabelWithStatus::label));
+  }
+
+  /** Returns all labels that the provided user has permission to vote on. */
+  Map<String, Collection<String>> permittedLabels(Account.Id filterApprovalsBy, ChangeData cd)
+      throws OrmException, PermissionBackendException {
+    boolean isMerged = cd.change().getStatus() == Change.Status.MERGED;
+    LabelTypes labelTypes = cd.getLabelTypes();
+    Map<String, LabelType> toCheck = new HashMap<>();
+    for (SubmitRecord rec : submitRecords(cd)) {
+      if (rec.labels != null) {
+        for (SubmitRecord.Label r : rec.labels) {
+          LabelType type = labelTypes.byLabel(r.label);
+          if (type != null && (!isMerged || type.allowPostSubmit())) {
+            toCheck.put(type.getName(), type);
+          }
+        }
+      }
+    }
+
+    Map<String, Short> labels = null;
+    Set<LabelPermission.WithValue> can =
+        permissionBackendForChange(filterApprovalsBy, cd).testLabels(toCheck.values());
+    SetMultimap<String, String> permitted = LinkedHashMultimap.create();
+    for (SubmitRecord rec : submitRecords(cd)) {
+      if (rec.labels == null) {
+        continue;
+      }
+      for (SubmitRecord.Label r : rec.labels) {
+        LabelType type = labelTypes.byLabel(r.label);
+        if (type == null || (isMerged && !type.allowPostSubmit())) {
+          continue;
+        }
+
+        for (LabelValue v : type.getValues()) {
+          boolean ok = can.contains(new LabelPermission.WithValue(type, v));
+          if (isMerged) {
+            if (labels == null) {
+              labels = currentLabels(filterApprovalsBy, cd);
+            }
+            short prev = labels.getOrDefault(type.getName(), (short) 0);
+            ok &= v.getValue() >= prev;
+          }
+          if (ok) {
+            permitted.put(r.label, v.formatValue());
+          }
+        }
+      }
+    }
+
+    List<String> toClear = Lists.newArrayListWithCapacity(permitted.keySet().size());
+    for (Map.Entry<String, Collection<String>> e : permitted.asMap().entrySet()) {
+      if (isOnlyZero(e.getValue())) {
+        toClear.add(e.getKey());
+      }
+    }
+    for (String label : toClear) {
+      permitted.removeAll(label);
+    }
+    return permitted.asMap();
+  }
+
+  private static boolean containsAnyOf(
+      ImmutableSet<ListChangesOption> set, ImmutableSet<ListChangesOption> toFind) {
+    return !Sets.intersection(toFind, set).isEmpty();
+  }
+
+  private static boolean isOnlyZero(Collection<String> values) {
+    return values.isEmpty() || (values.size() == 1 && values.contains(" 0"));
+  }
+
+  private static void addApproval(LabelInfo label, ApprovalInfo approval) {
+    if (label.all == null) {
+      label.all = new ArrayList<>();
+    }
+    label.all.add(approval);
+  }
+
+  private Map<String, LabelWithStatus> labelsForUnsubmittedChange(
+      AccountLoader accountLoader,
+      ChangeData cd,
+      LabelTypes labelTypes,
+      boolean standard,
+      boolean detailed)
+      throws OrmException, PermissionBackendException {
+    Map<String, LabelWithStatus> labels = initLabels(accountLoader, cd, labelTypes, standard);
+    if (detailed) {
+      setAllApprovals(accountLoader, cd, labels);
+    }
+    for (Map.Entry<String, LabelWithStatus> e : labels.entrySet()) {
+      LabelType type = labelTypes.byLabel(e.getKey());
+      if (type == null) {
+        continue;
+      }
+      if (standard) {
+        for (PatchSetApproval psa : cd.currentApprovals()) {
+          if (type.matches(psa)) {
+            short val = psa.getValue();
+            Account.Id accountId = psa.getAccountId();
+            setLabelScores(accountLoader, type, e.getValue(), val, accountId);
+          }
+        }
+      }
+      if (detailed) {
+        setLabelValues(type, e.getValue());
+      }
+    }
+    return labels;
+  }
+
+  private Integer parseRangeValue(String value) {
+    if (value.startsWith("+")) {
+      value = value.substring(1);
+    } else if (value.startsWith(" ")) {
+      value = value.trim();
+    }
+    return Ints.tryParse(value);
+  }
+
+  private ApprovalInfo approvalInfo(
+      AccountLoader accountLoader,
+      Account.Id id,
+      Integer value,
+      VotingRangeInfo permittedVotingRange,
+      String tag,
+      Timestamp date) {
+    ApprovalInfo ai = new ApprovalInfo(id.get(), value, permittedVotingRange, tag, date);
+    accountLoader.put(ai);
+    return ai;
+  }
+
+  private void setLabelValues(LabelType type, LabelWithStatus l) {
+    l.label().defaultValue = type.getDefaultValue();
+    l.label().values = new LinkedHashMap<>();
+    for (LabelValue v : type.getValues()) {
+      l.label().values.put(v.formatValue(), v.getText());
+    }
+    if (isOnlyZero(l.label().values.keySet())) {
+      l.label().values = null;
+    }
+  }
+
+  private Map<String, Short> currentLabels(Account.Id accountId, ChangeData cd)
+      throws OrmException {
+    Map<String, Short> result = new HashMap<>();
+    for (PatchSetApproval psa :
+        approvalsUtil.byPatchSetUser(
+            db.get(),
+            lazyLoad ? cd.notes() : notesFactory.createFromIndexedChange(cd.change()),
+            cd.change().currentPatchSetId(),
+            accountId,
+            null,
+            null)) {
+      result.put(psa.getLabel(), psa.getValue());
+    }
+    return result;
+  }
+
+  private Map<String, LabelWithStatus> labelsForSubmittedChange(
+      AccountLoader accountLoader,
+      ChangeData cd,
+      LabelTypes labelTypes,
+      boolean standard,
+      boolean detailed)
+      throws OrmException, PermissionBackendException {
+    Set<Account.Id> allUsers = new HashSet<>();
+    if (detailed) {
+      // Users expect to see all reviewers on closed changes, even if they
+      // didn't vote on the latest patch set. If we don't need detailed labels,
+      // we aren't including 0 votes for all users below, so we can just look at
+      // the latest patch set (in the next loop).
+      for (PatchSetApproval psa : cd.approvals().values()) {
+        allUsers.add(psa.getAccountId());
+      }
+    }
+
+    Set<String> labelNames = new HashSet<>();
+    SetMultimap<Id, PatchSetApproval> current = MultimapBuilder.hashKeys().hashSetValues().build();
+    for (PatchSetApproval a : cd.currentApprovals()) {
+      allUsers.add(a.getAccountId());
+      LabelType type = labelTypes.byLabel(a.getLabelId());
+      if (type != null) {
+        labelNames.add(type.getName());
+        // Not worth the effort to distinguish between votable/non-votable for 0
+        // values on closed changes, since they can't vote anyway.
+        current.put(a.getAccountId(), a);
+      }
+    }
+
+    // Since voting on merged changes is allowed all labels which apply to
+    // the change must be returned. All applying labels can be retrieved from
+    // the submit records, which is what initLabels does.
+    // It's not possible to only compute the labels based on the approvals
+    // since merged changes may not have approvals for all labels (e.g. if not
+    // all labels are required for submit or if the change was auto-closed due
+    // to direct push or if new labels were defined after the change was
+    // merged).
+    Map<String, LabelWithStatus> labels;
+    labels = initLabels(accountLoader, cd, labelTypes, standard);
+
+    // Also include all labels for which approvals exists. E.g. there can be
+    // approvals for labels that are ignored by a Prolog submit rule and hence
+    // it wouldn't be included in the submit records.
+    for (String name : labelNames) {
+      if (!labels.containsKey(name)) {
+        labels.put(name, LabelWithStatus.create(new LabelInfo(), null));
+      }
+    }
+
+    if (detailed) {
+      labels.entrySet().stream()
+          .filter(e -> labelTypes.byLabel(e.getKey()) != null)
+          .forEach(e -> setLabelValues(labelTypes.byLabel(e.getKey()), e.getValue()));
+    }
+
+    for (Account.Id accountId : allUsers) {
+      Map<String, ApprovalInfo> byLabel = Maps.newHashMapWithExpectedSize(labels.size());
+      Map<String, VotingRangeInfo> pvr = Collections.emptyMap();
+      if (detailed) {
+        pvr = getPermittedVotingRanges(permittedLabels(accountId, cd));
+        for (Map.Entry<String, LabelWithStatus> entry : labels.entrySet()) {
+          ApprovalInfo ai = approvalInfo(accountLoader, accountId, 0, null, null, null);
+          byLabel.put(entry.getKey(), ai);
+          addApproval(entry.getValue().label(), ai);
+        }
+      }
+      for (PatchSetApproval psa : current.get(accountId)) {
+        LabelType type = labelTypes.byLabel(psa.getLabelId());
+        if (type == null) {
+          continue;
+        }
+
+        short val = psa.getValue();
+        ApprovalInfo info = byLabel.get(type.getName());
+        if (info != null) {
+          info.value = Integer.valueOf(val);
+          info.permittedVotingRange = pvr.getOrDefault(type.getName(), null);
+          info.date = psa.getGranted();
+          info.tag = psa.getTag();
+          if (psa.isPostSubmit()) {
+            info.postSubmit = true;
+          }
+        }
+        if (!standard) {
+          continue;
+        }
+
+        setLabelScores(accountLoader, type, labels.get(type.getName()), val, accountId);
+      }
+    }
+    return labels;
+  }
+
+  private Map<String, LabelWithStatus> initLabels(
+      AccountLoader accountLoader, ChangeData cd, LabelTypes labelTypes, boolean standard) {
+    Map<String, LabelWithStatus> labels = new TreeMap<>(labelTypes.nameComparator());
+    for (SubmitRecord rec : submitRecords(cd)) {
+      if (rec.labels == null) {
+        continue;
+      }
+      for (SubmitRecord.Label r : rec.labels) {
+        LabelWithStatus p = labels.get(r.label);
+        if (p == null || p.status().compareTo(r.status) < 0) {
+          LabelInfo n = new LabelInfo();
+          if (standard) {
+            switch (r.status) {
+              case OK:
+                n.approved = accountLoader.get(r.appliedBy);
+                break;
+              case REJECT:
+                n.rejected = accountLoader.get(r.appliedBy);
+                n.blocking = true;
+                break;
+              case IMPOSSIBLE:
+              case MAY:
+              case NEED:
+              default:
+                break;
+            }
+          }
+
+          n.optional = r.status == SubmitRecord.Label.Status.MAY ? true : null;
+          labels.put(r.label, LabelWithStatus.create(n, r.status));
+        }
+      }
+    }
+    return labels;
+  }
+
+  private void setLabelScores(
+      AccountLoader accountLoader,
+      LabelType type,
+      LabelWithStatus l,
+      short score,
+      Account.Id accountId) {
+    if (l.label().approved != null || l.label().rejected != null) {
+      return;
+    }
+
+    if (type.getMin() == null || type.getMax() == null) {
+      // Can't set score for unknown or misconfigured type.
+      return;
+    }
+
+    if (score != 0) {
+      if (score == type.getMin().getValue()) {
+        l.label().rejected = accountLoader.get(accountId);
+      } else if (score == type.getMax().getValue()) {
+        l.label().approved = accountLoader.get(accountId);
+      } else if (score < 0) {
+        l.label().disliked = accountLoader.get(accountId);
+        l.label().value = score;
+      } else if (score > 0 && l.label().disliked == null) {
+        l.label().recommended = accountLoader.get(accountId);
+        l.label().value = score;
+      }
+    }
+  }
+
+  private void setAllApprovals(
+      AccountLoader accountLoader, ChangeData cd, Map<String, LabelWithStatus> labels)
+      throws OrmException, PermissionBackendException {
+    Change.Status status = cd.change().getStatus();
+    checkState(
+        status != Change.Status.MERGED, "should not call setAllApprovals on %s change", status);
+
+    // Include a user in the output for this label if either:
+    //  - They are an explicit reviewer.
+    //  - They ever voted on this change.
+    Set<Id> allUsers = new HashSet<>();
+    allUsers.addAll(cd.reviewers().byState(ReviewerStateInternal.REVIEWER));
+    for (PatchSetApproval psa : cd.approvals().values()) {
+      allUsers.add(psa.getAccountId());
+    }
+
+    Table<Id, String, PatchSetApproval> current =
+        HashBasedTable.create(allUsers.size(), cd.getLabelTypes().getLabelTypes().size());
+    for (PatchSetApproval psa : cd.currentApprovals()) {
+      current.put(psa.getAccountId(), psa.getLabel(), psa);
+    }
+
+    LabelTypes labelTypes = cd.getLabelTypes();
+    for (Account.Id accountId : allUsers) {
+      PermissionBackend.ForChange perm = permissionBackendForChange(accountId, cd);
+      Map<String, VotingRangeInfo> pvr = getPermittedVotingRanges(permittedLabels(accountId, cd));
+      for (Map.Entry<String, LabelWithStatus> e : labels.entrySet()) {
+        LabelType lt = labelTypes.byLabel(e.getKey());
+        if (lt == null) {
+          // Ignore submit record for undefined label; likely the submit rule
+          // author didn't intend for the label to show up in the table.
+          continue;
+        }
+        Integer value;
+        VotingRangeInfo permittedVotingRange = pvr.getOrDefault(lt.getName(), null);
+        String tag = null;
+        Timestamp date = null;
+        PatchSetApproval psa = current.get(accountId, lt.getName());
+        if (psa != null) {
+          value = Integer.valueOf(psa.getValue());
+          if (value == 0) {
+            // This may be a dummy approval that was inserted when the reviewer
+            // was added. Explicitly check whether the user can vote on this
+            // label.
+            value = perm.test(new LabelPermission(lt)) ? 0 : null;
+          }
+          tag = psa.getTag();
+          date = psa.getGranted();
+          if (psa.isPostSubmit()) {
+            logger.atWarning().log("unexpected post-submit approval on open change: %s", psa);
+          }
+        } else {
+          // Either the user cannot vote on this label, or they were added as a
+          // reviewer but have not responded yet. Explicitly check whether the
+          // user can vote on this label.
+          value = perm.test(new LabelPermission(lt)) ? 0 : null;
+        }
+        addApproval(
+            e.getValue().label(),
+            approvalInfo(accountLoader, accountId, value, permittedVotingRange, tag, date));
+      }
+    }
+  }
+
+  /**
+   * @return {@link com.google.gerrit.server.permissions.PermissionBackend.ForChange} constructed
+   *     from either an index-backed or a database-backed {@link ChangeData} depending on {@code
+   *     lazyload}.
+   */
+  private PermissionBackend.ForChange permissionBackendForChange(Account.Id user, ChangeData cd)
+      throws OrmException {
+    PermissionBackend.WithUser withUser = permissionBackend.absentUser(user).database(db);
+    return lazyLoad
+        ? withUser.change(cd)
+        : withUser.indexedChange(cd, notesFactory.createFromIndexedChange(cd.change()));
+  }
+
+  private List<SubmitRecord> submitRecords(ChangeData cd) {
+    return cd.submitRecords(ChangeJson.SUBMIT_RULE_OPTIONS_LENIENT);
+  }
+
+  private Map<String, VotingRangeInfo> getPermittedVotingRanges(
+      Map<String, Collection<String>> permittedLabels) {
+    Map<String, VotingRangeInfo> permittedVotingRanges =
+        Maps.newHashMapWithExpectedSize(permittedLabels.size());
+    for (String label : permittedLabels.keySet()) {
+      List<Integer> permittedVotingRange =
+          permittedLabels.get(label).stream()
+              .map(this::parseRangeValue)
+              .filter(java.util.Objects::nonNull)
+              .sorted()
+              .collect(toList());
+
+      if (permittedVotingRange.isEmpty()) {
+        permittedVotingRanges.put(label, null);
+      } else {
+        int minPermittedValue = permittedVotingRange.get(0);
+        int maxPermittedValue = Iterables.getLast(permittedVotingRange);
+        permittedVotingRanges.put(label, new VotingRangeInfo(minPermittedValue, maxPermittedValue));
+      }
+    }
+    return permittedVotingRanges;
+  }
+
+  @AutoValue
+  abstract static class LabelWithStatus {
+    private static LabelWithStatus create(LabelInfo label, SubmitRecord.Label.Status status) {
+      return new AutoValue_LabelsJson_LabelWithStatus(label, status);
+    }
+
+    abstract LabelInfo label();
+
+    @Nullable
+    abstract SubmitRecord.Label.Status status();
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityCache.java b/java/com/google/gerrit/server/change/MergeabilityCache.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityCache.java
rename to java/com/google/gerrit/server/change/MergeabilityCache.java
diff --git a/java/com/google/gerrit/server/change/MergeabilityCacheImpl.java b/java/com/google/gerrit/server/change/MergeabilityCacheImpl.java
new file mode 100644
index 0000000..131f3a1
--- /dev/null
+++ b/java/com/google/gerrit/server/change/MergeabilityCacheImpl.java
@@ -0,0 +1,227 @@
+// Copyright (C) 2014 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.google.gerrit.server.change;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.base.Converter;
+import com.google.common.base.Enums;
+import com.google.common.base.MoreObjects;
+import com.google.common.cache.Cache;
+import com.google.common.cache.Weigher;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.util.concurrent.UncheckedExecutionException;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.server.cache.CacheModule;
+import com.google.gerrit.server.cache.proto.Cache.MergeabilityKeyProto;
+import com.google.gerrit.server.cache.serialize.BooleanCacheSerializer;
+import com.google.gerrit.server.cache.serialize.CacheSerializer;
+import com.google.gerrit.server.cache.serialize.ProtoCacheSerializers;
+import com.google.gerrit.server.cache.serialize.ProtoCacheSerializers.ObjectIdConverter;
+import com.google.gerrit.server.git.CodeReviewCommit;
+import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
+import com.google.gerrit.server.submit.SubmitDryRun;
+import com.google.inject.Inject;
+import com.google.inject.Module;
+import com.google.inject.Singleton;
+import com.google.inject.name.Named;
+import java.util.Arrays;
+import java.util.Objects;
+import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+
+@Singleton
+public class MergeabilityCacheImpl implements MergeabilityCache {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final String CACHE_NAME = "mergeability";
+
+  public static Module module() {
+    return new CacheModule() {
+      @Override
+      protected void configure() {
+        persist(CACHE_NAME, EntryKey.class, Boolean.class)
+            .maximumWeight(1 << 20)
+            .weigher(MergeabilityWeigher.class)
+            .version(1)
+            .keySerializer(EntryKey.Serializer.INSTANCE)
+            .valueSerializer(BooleanCacheSerializer.INSTANCE);
+        bind(MergeabilityCache.class).to(MergeabilityCacheImpl.class);
+      }
+    };
+  }
+
+  public static ObjectId toId(Ref ref) {
+    return ref != null && ref.getObjectId() != null ? ref.getObjectId() : ObjectId.zeroId();
+  }
+
+  public static class EntryKey {
+    private ObjectId commit;
+    private ObjectId into;
+    private SubmitType submitType;
+    private String mergeStrategy;
+
+    public EntryKey(ObjectId commit, ObjectId into, SubmitType submitType, String mergeStrategy) {
+      checkArgument(
+          submitType != SubmitType.INHERIT,
+          "Cannot cache %s.%s",
+          SubmitType.class.getSimpleName(),
+          submitType);
+      this.commit = requireNonNull(commit, "commit");
+      this.into = requireNonNull(into, "into");
+      this.submitType = requireNonNull(submitType, "submitType");
+      this.mergeStrategy = requireNonNull(mergeStrategy, "mergeStrategy");
+    }
+
+    public ObjectId getCommit() {
+      return commit;
+    }
+
+    public ObjectId getInto() {
+      return into;
+    }
+
+    public SubmitType getSubmitType() {
+      return submitType;
+    }
+
+    public String getMergeStrategy() {
+      return mergeStrategy;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+      if (o instanceof EntryKey) {
+        EntryKey k = (EntryKey) o;
+        return commit.equals(k.commit)
+            && into.equals(k.into)
+            && submitType == k.submitType
+            && mergeStrategy.equals(k.mergeStrategy);
+      }
+      return false;
+    }
+
+    @Override
+    public int hashCode() {
+      return Objects.hash(commit, into, submitType, mergeStrategy);
+    }
+
+    @Override
+    public String toString() {
+      return MoreObjects.toStringHelper(this)
+          .add("commit", commit.name())
+          .add("into", into.name())
+          .addValue(submitType)
+          .addValue(mergeStrategy)
+          .toString();
+    }
+
+    enum Serializer implements CacheSerializer<EntryKey> {
+      INSTANCE;
+
+      private static final Converter<String, SubmitType> SUBMIT_TYPE_CONVERTER =
+          Enums.stringConverter(SubmitType.class);
+
+      @Override
+      public byte[] serialize(EntryKey object) {
+        ObjectIdConverter idConverter = ObjectIdConverter.create();
+        return ProtoCacheSerializers.toByteArray(
+            MergeabilityKeyProto.newBuilder()
+                .setCommit(idConverter.toByteString(object.getCommit()))
+                .setInto(idConverter.toByteString(object.getInto()))
+                .setSubmitType(SUBMIT_TYPE_CONVERTER.reverse().convert(object.getSubmitType()))
+                .setMergeStrategy(object.getMergeStrategy())
+                .build());
+      }
+
+      @Override
+      public EntryKey deserialize(byte[] in) {
+        MergeabilityKeyProto proto =
+            ProtoCacheSerializers.parseUnchecked(MergeabilityKeyProto.parser(), in);
+        ObjectIdConverter idConverter = ObjectIdConverter.create();
+        return new EntryKey(
+            idConverter.fromByteString(proto.getCommit()),
+            idConverter.fromByteString(proto.getInto()),
+            SUBMIT_TYPE_CONVERTER.convert(proto.getSubmitType()),
+            proto.getMergeStrategy());
+      }
+    }
+  }
+
+  public static class MergeabilityWeigher implements Weigher<EntryKey, Boolean> {
+    @Override
+    public int weigh(EntryKey k, Boolean v) {
+      return 16
+          + 2 * (16 + 20)
+          + 3 * 8 // Size of EntryKey, 64-bit JVM.
+          + 8; // Size of Boolean.
+    }
+  }
+
+  private final SubmitDryRun submitDryRun;
+  private final Cache<EntryKey, Boolean> cache;
+
+  @Inject
+  MergeabilityCacheImpl(
+      SubmitDryRun submitDryRun, @Named(CACHE_NAME) Cache<EntryKey, Boolean> cache) {
+    this.submitDryRun = submitDryRun;
+    this.cache = cache;
+  }
+
+  @Override
+  public boolean get(
+      ObjectId commit,
+      Ref intoRef,
+      SubmitType submitType,
+      String mergeStrategy,
+      Branch.NameKey dest,
+      Repository repo) {
+    ObjectId into = intoRef != null ? intoRef.getObjectId() : ObjectId.zeroId();
+    EntryKey key = new EntryKey(commit, into, submitType, mergeStrategy);
+    try {
+      return cache.get(
+          key,
+          () -> {
+            if (key.into.equals(ObjectId.zeroId())) {
+              return true; // Assume yes on new branch.
+            }
+            try (CodeReviewRevWalk rw = CodeReviewCommit.newRevWalk(repo)) {
+              Set<RevCommit> accepted = SubmitDryRun.getAlreadyAccepted(repo, rw);
+              accepted.add(rw.parseCommit(key.into));
+              accepted.addAll(Arrays.asList(rw.parseCommit(key.commit).getParents()));
+              return submitDryRun.run(
+                  key.submitType, repo, rw, dest, key.into, key.commit, accepted);
+            }
+          });
+    } catch (ExecutionException | UncheckedExecutionException e) {
+      logger.atSevere().withCause(e.getCause()).log(
+          "Error checking mergeability of %s into %s (%s)",
+          key.commit.name(), key.into.name(), key.submitType.name());
+      return false;
+    }
+  }
+
+  @Override
+  public Boolean getIfPresent(
+      ObjectId commit, Ref intoRef, SubmitType submitType, String mergeStrategy) {
+    return cache.getIfPresent(new EntryKey(commit, toId(intoRef), submitType, mergeStrategy));
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/NotifyUtil.java b/java/com/google/gerrit/server/change/NotifyUtil.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/change/NotifyUtil.java
rename to java/com/google/gerrit/server/change/NotifyUtil.java
diff --git a/java/com/google/gerrit/server/change/PatchSetInserter.java b/java/com/google/gerrit/server/change/PatchSetInserter.java
new file mode 100644
index 0000000..24c4237
--- /dev/null
+++ b/java/com/google/gerrit/server/change/PatchSetInserter.java
@@ -0,0 +1,350 @@
+// Copyright (C) 2013 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.google.gerrit.server.change;
+
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.gerrit.server.notedb.ReviewerStateInternal.CC;
+import static com.google.gerrit.server.notedb.ReviewerStateInternal.REVIEWER;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.ListMultimap;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.api.changes.RecipientType;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetInfo;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ApprovalCopier;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.ChangeUtil;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.ReviewerSet;
+import com.google.gerrit.server.events.CommitReceivedEvent;
+import com.google.gerrit.server.extensions.events.RevisionCreated;
+import com.google.gerrit.server.git.validators.CommitValidationException;
+import com.google.gerrit.server.git.validators.CommitValidators;
+import com.google.gerrit.server.mail.send.ReplacePatchSetSender;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.server.patch.PatchSetInfoFactory;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.ssh.NoSshInfo;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.Context;
+import com.google.gerrit.server.update.RepoContext;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.transport.ReceiveCommand;
+
+public class PatchSetInserter implements BatchUpdateOp {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public interface Factory {
+    PatchSetInserter create(ChangeNotes notes, PatchSet.Id psId, ObjectId commitId);
+  }
+
+  // Injected fields.
+  private final PermissionBackend permissionBackend;
+  private final PatchSetInfoFactory patchSetInfoFactory;
+  private final CommitValidators.Factory commitValidatorsFactory;
+  private final ReplacePatchSetSender.Factory replacePatchSetFactory;
+  private final ProjectCache projectCache;
+  private final RevisionCreated revisionCreated;
+  private final ApprovalsUtil approvalsUtil;
+  private final ApprovalCopier approvalCopier;
+  private final ChangeMessagesUtil cmUtil;
+  private final PatchSetUtil psUtil;
+
+  // Assisted-injected fields.
+  private final PatchSet.Id psId;
+  private final ObjectId commitId;
+  // Read prior to running the batch update, so must only be used during
+  // updateRepo; updateChange and later must use the notes from the
+  // ChangeContext.
+  private final ChangeNotes origNotes;
+
+  // Fields exposed as setters.
+  private String message;
+  private String description;
+  private boolean validate = true;
+  private boolean checkAddPatchSetPermission = true;
+  private List<String> groups = Collections.emptyList();
+  private boolean fireRevisionCreated = true;
+  private NotifyHandling notify = NotifyHandling.ALL;
+  private ListMultimap<RecipientType, Account.Id> accountsToNotify = ImmutableListMultimap.of();
+  private boolean allowClosed;
+  private boolean copyApprovals = true;
+
+  // Fields set during some phase of BatchUpdate.Op.
+  private Change change;
+  private PatchSet patchSet;
+  private PatchSetInfo patchSetInfo;
+  private ChangeMessage changeMessage;
+  private ReviewerSet oldReviewers;
+
+  @Inject
+  public PatchSetInserter(
+      PermissionBackend permissionBackend,
+      ApprovalsUtil approvalsUtil,
+      ApprovalCopier approvalCopier,
+      ChangeMessagesUtil cmUtil,
+      PatchSetInfoFactory patchSetInfoFactory,
+      CommitValidators.Factory commitValidatorsFactory,
+      ReplacePatchSetSender.Factory replacePatchSetFactory,
+      PatchSetUtil psUtil,
+      RevisionCreated revisionCreated,
+      ProjectCache projectCache,
+      @Assisted ChangeNotes notes,
+      @Assisted PatchSet.Id psId,
+      @Assisted ObjectId commitId) {
+    this.permissionBackend = permissionBackend;
+    this.approvalsUtil = approvalsUtil;
+    this.approvalCopier = approvalCopier;
+    this.cmUtil = cmUtil;
+    this.patchSetInfoFactory = patchSetInfoFactory;
+    this.commitValidatorsFactory = commitValidatorsFactory;
+    this.replacePatchSetFactory = replacePatchSetFactory;
+    this.psUtil = psUtil;
+    this.revisionCreated = revisionCreated;
+    this.projectCache = projectCache;
+
+    this.origNotes = notes;
+    this.psId = psId;
+    this.commitId = commitId.copy();
+  }
+
+  public PatchSet.Id getPatchSetId() {
+    return psId;
+  }
+
+  public PatchSetInserter setMessage(String message) {
+    this.message = message;
+    return this;
+  }
+
+  public PatchSetInserter setDescription(String description) {
+    this.description = description;
+    return this;
+  }
+
+  public PatchSetInserter setValidate(boolean validate) {
+    this.validate = validate;
+    return this;
+  }
+
+  public PatchSetInserter setCheckAddPatchSetPermission(boolean checkAddPatchSetPermission) {
+    this.checkAddPatchSetPermission = checkAddPatchSetPermission;
+    return this;
+  }
+
+  public PatchSetInserter setGroups(List<String> groups) {
+    requireNonNull(groups, "groups may not be null");
+    this.groups = groups;
+    return this;
+  }
+
+  public PatchSetInserter setFireRevisionCreated(boolean fireRevisionCreated) {
+    this.fireRevisionCreated = fireRevisionCreated;
+    return this;
+  }
+
+  public PatchSetInserter setNotify(NotifyHandling notify) {
+    this.notify = requireNonNull(notify);
+    return this;
+  }
+
+  public PatchSetInserter setAccountsToNotify(
+      ListMultimap<RecipientType, Account.Id> accountsToNotify) {
+    this.accountsToNotify = requireNonNull(accountsToNotify);
+    return this;
+  }
+
+  public PatchSetInserter setAllowClosed(boolean allowClosed) {
+    this.allowClosed = allowClosed;
+    return this;
+  }
+
+  public PatchSetInserter setCopyApprovals(boolean copyApprovals) {
+    this.copyApprovals = copyApprovals;
+    return this;
+  }
+
+  public Change getChange() {
+    checkState(change != null, "getChange() only valid after executing update");
+    return change;
+  }
+
+  public PatchSet getPatchSet() {
+    checkState(patchSet != null, "getPatchSet() only valid after executing update");
+    return patchSet;
+  }
+
+  @Override
+  public void updateRepo(RepoContext ctx)
+      throws AuthException, ResourceConflictException, IOException, OrmException,
+          PermissionBackendException {
+    validate(ctx);
+    ctx.addRefUpdate(ObjectId.zeroId(), commitId, getPatchSetId().toRefName());
+  }
+
+  @Override
+  public boolean updateChange(ChangeContext ctx)
+      throws ResourceConflictException, OrmException, IOException {
+    ReviewDb db = ctx.getDb();
+
+    change = ctx.getChange();
+    ChangeUpdate update = ctx.getUpdate(psId);
+    update.setSubjectForCommit("Create patch set " + psId.get());
+
+    if (!change.getStatus().isOpen() && !allowClosed) {
+      throw new ResourceConflictException(
+          String.format(
+              "Cannot create new patch set of change %s because it is %s",
+              change.getId(), ChangeUtil.status(change)));
+    }
+
+    List<String> newGroups = groups;
+    if (newGroups.isEmpty()) {
+      PatchSet prevPs = psUtil.current(db, ctx.getNotes());
+      if (prevPs != null) {
+        newGroups = prevPs.getGroups();
+      }
+    }
+    patchSet =
+        psUtil.insert(
+            db,
+            ctx.getRevWalk(),
+            ctx.getUpdate(psId),
+            psId,
+            commitId,
+            newGroups,
+            null,
+            description);
+
+    if (notify != NotifyHandling.NONE) {
+      oldReviewers = approvalsUtil.getReviewers(db, ctx.getNotes());
+    }
+
+    if (message != null) {
+      changeMessage =
+          ChangeMessagesUtil.newMessage(
+              patchSet.getId(),
+              ctx.getUser(),
+              ctx.getWhen(),
+              message,
+              ChangeMessagesUtil.uploadedPatchSetTag(change.isWorkInProgress()));
+      changeMessage.setMessage(message);
+    }
+
+    patchSetInfo =
+        patchSetInfoFactory.get(ctx.getRevWalk(), ctx.getRevWalk().parseCommit(commitId), psId);
+    if (!allowClosed) {
+      change.setStatus(Change.Status.NEW);
+    }
+    change.setCurrentPatchSet(patchSetInfo);
+    if (copyApprovals) {
+      approvalCopier.copyInReviewDb(
+          db, ctx.getNotes(), patchSet, ctx.getRevWalk(), ctx.getRepoView().getConfig());
+    }
+    if (changeMessage != null) {
+      cmUtil.addChangeMessage(db, update, changeMessage);
+    }
+    return true;
+  }
+
+  @Override
+  public void postUpdate(Context ctx) throws OrmException {
+    if (notify != NotifyHandling.NONE || !accountsToNotify.isEmpty()) {
+      try {
+        ReplacePatchSetSender cm = replacePatchSetFactory.create(ctx.getProject(), change.getId());
+        cm.setFrom(ctx.getAccountId());
+        cm.setPatchSet(patchSet, patchSetInfo);
+        cm.setChangeMessage(changeMessage.getMessage(), ctx.getWhen());
+        cm.addReviewers(oldReviewers.byState(REVIEWER));
+        cm.addExtraCC(oldReviewers.byState(CC));
+        cm.setNotify(notify);
+        cm.setAccountsToNotify(accountsToNotify);
+        cm.send();
+      } catch (Exception err) {
+        logger.atSevere().withCause(err).log(
+            "Cannot send email for new patch set on change %s", change.getId());
+      }
+    }
+
+    if (fireRevisionCreated) {
+      revisionCreated.fire(change, patchSet, ctx.getAccount(), ctx.getWhen(), notify);
+    }
+  }
+
+  private void validate(RepoContext ctx)
+      throws AuthException, ResourceConflictException, IOException, PermissionBackendException,
+          OrmException {
+    // Not allowed to create a new patch set if the current patch set is locked.
+    psUtil.checkPatchSetNotLocked(origNotes);
+
+    if (checkAddPatchSetPermission) {
+      permissionBackend
+          .user(ctx.getUser())
+          .database(ctx.getDb())
+          .change(origNotes)
+          .check(ChangePermission.ADD_PATCH_SET);
+    }
+    projectCache.checkedGet(ctx.getProject()).checkStatePermitsWrite();
+    if (!validate) {
+      return;
+    }
+
+    String refName = getPatchSetId().toRefName();
+    try (CommitReceivedEvent event =
+        new CommitReceivedEvent(
+            new ReceiveCommand(
+                ObjectId.zeroId(),
+                commitId,
+                refName.substring(0, refName.lastIndexOf('/') + 1) + "new"),
+            projectCache.checkedGet(origNotes.getProjectName()).getProject(),
+            origNotes.getChange().getDest().get(),
+            ctx.getRevWalk().getObjectReader(),
+            commitId,
+            ctx.getIdentifiedUser())) {
+      commitValidatorsFactory
+          .forGerritCommits(
+              permissionBackend.user(ctx.getUser()).project(ctx.getProject()),
+              origNotes.getChange().getDest(),
+              ctx.getIdentifiedUser(),
+              new NoSshInfo(),
+              ctx.getRevWalk(),
+              origNotes.getChange())
+          .validate(event);
+    } catch (CommitValidationException e) {
+      throw new ResourceConflictException(e.getFullMessage());
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/change/PureRevert.java b/java/com/google/gerrit/server/change/PureRevert.java
new file mode 100644
index 0000000..ddc9661
--- /dev/null
+++ b/java/com/google/gerrit/server/change/PureRevert.java
@@ -0,0 +1,129 @@
+// Copyright (C) 2017 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.google.gerrit.server.change;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.common.PureRevertInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.MergeUtil;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.List;
+import org.eclipse.jgit.diff.DiffEntry;
+import org.eclipse.jgit.diff.DiffFormatter;
+import org.eclipse.jgit.errors.InvalidObjectIdException;
+import org.eclipse.jgit.errors.MissingObjectException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.merge.ThreeWayMerger;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+@Singleton
+public class PureRevert {
+  private final MergeUtil.Factory mergeUtilFactory;
+  private final GitRepositoryManager repoManager;
+  private final ProjectCache projectCache;
+  private final ChangeNotes.Factory notesFactory;
+  private final Provider<ReviewDb> dbProvider;
+  private final PatchSetUtil psUtil;
+
+  @Inject
+  PureRevert(
+      MergeUtil.Factory mergeUtilFactory,
+      GitRepositoryManager repoManager,
+      ProjectCache projectCache,
+      ChangeNotes.Factory notesFactory,
+      Provider<ReviewDb> dbProvider,
+      PatchSetUtil psUtil) {
+    this.mergeUtilFactory = mergeUtilFactory;
+    this.repoManager = repoManager;
+    this.projectCache = projectCache;
+    this.notesFactory = notesFactory;
+    this.dbProvider = dbProvider;
+    this.psUtil = psUtil;
+  }
+
+  public PureRevertInfo get(ChangeNotes notes, @Nullable String claimedOriginal)
+      throws OrmException, IOException, BadRequestException, ResourceConflictException {
+    PatchSet currentPatchSet = psUtil.current(dbProvider.get(), notes);
+    if (currentPatchSet == null) {
+      throw new ResourceConflictException("current revision is missing");
+    }
+
+    if (claimedOriginal == null) {
+      if (notes.getChange().getRevertOf() == null) {
+        throw new BadRequestException("no ID was provided and change isn't a revert");
+      }
+      PatchSet ps =
+          psUtil.current(
+              dbProvider.get(),
+              notesFactory.createChecked(
+                  dbProvider.get(), notes.getProjectName(), notes.getChange().getRevertOf()));
+      claimedOriginal = ps.getRevision().get();
+    }
+
+    try (Repository repo = repoManager.openRepository(notes.getProjectName());
+        ObjectInserter oi = repo.newObjectInserter();
+        RevWalk rw = new RevWalk(repo)) {
+      RevCommit claimedOriginalCommit;
+      try {
+        claimedOriginalCommit = rw.parseCommit(ObjectId.fromString(claimedOriginal));
+      } catch (InvalidObjectIdException | MissingObjectException e) {
+        throw new BadRequestException("invalid object ID");
+      }
+      if (claimedOriginalCommit.getParentCount() == 0) {
+        throw new BadRequestException("can't check against initial commit");
+      }
+      RevCommit claimedRevertCommit =
+          rw.parseCommit(ObjectId.fromString(currentPatchSet.getRevision().get()));
+      if (claimedRevertCommit.getParentCount() == 0) {
+        throw new BadRequestException("claimed revert has no parents");
+      }
+      // Rebase claimed revert onto claimed original
+      ThreeWayMerger merger =
+          mergeUtilFactory
+              .create(projectCache.checkedGet(notes.getProjectName()))
+              .newThreeWayMerger(oi, repo.getConfig());
+      merger.setBase(claimedRevertCommit.getParent(0));
+      boolean success = merger.merge(claimedRevertCommit, claimedOriginalCommit);
+      if (!success || merger.getResultTreeId() == null) {
+        // Merge conflict during rebase
+        return new PureRevertInfo(false);
+      }
+
+      // Any differences between claimed original's parent and the rebase result indicate that the
+      // claimedRevert is not a pure revert but made content changes
+      try (DiffFormatter df = new DiffFormatter(new ByteArrayOutputStream())) {
+        df.setReader(oi.newReader(), repo.getConfig());
+        List<DiffEntry> entries =
+            df.scan(claimedOriginalCommit.getParent(0), merger.getResultTreeId());
+        return new PureRevertInfo(entries.isEmpty());
+      }
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/change/RebaseChangeOp.java b/java/com/google/gerrit/server/change/RebaseChangeOp.java
new file mode 100644
index 0000000..1f216f0
--- /dev/null
+++ b/java/com/google/gerrit/server/change/RebaseChangeOp.java
@@ -0,0 +1,291 @@
+// Copyright (C) 2015 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.google.gerrit.server.change;
+
+import static com.google.common.base.Preconditions.checkState;
+
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.restapi.MergeConflictException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.RevId;
+import com.google.gerrit.server.ChangeUtil;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.change.RebaseUtil.Base;
+import com.google.gerrit.server.git.MergeUtil;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.InvalidChangeOperationException;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.Context;
+import com.google.gerrit.server.update.RepoContext;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.merge.ThreeWayMerger;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+public class RebaseChangeOp implements BatchUpdateOp {
+  public interface Factory {
+    RebaseChangeOp create(ChangeNotes notes, PatchSet originalPatchSet, ObjectId baseCommitId);
+  }
+
+  private final PatchSetInserter.Factory patchSetInserterFactory;
+  private final MergeUtil.Factory mergeUtilFactory;
+  private final RebaseUtil rebaseUtil;
+  private final ChangeResource.Factory changeResourceFactory;
+
+  private final ChangeNotes notes;
+  private final PatchSet originalPatchSet;
+  private final IdentifiedUser.GenericFactory identifiedUserFactory;
+  private final ProjectCache projectCache;
+
+  private ObjectId baseCommitId;
+  private PersonIdent committerIdent;
+  private boolean fireRevisionCreated = true;
+  private boolean validate = true;
+  private boolean checkAddPatchSetPermission = true;
+  private boolean forceContentMerge;
+  private boolean copyApprovals = true;
+  private boolean detailedCommitMessage;
+  private boolean postMessage = true;
+  private boolean matchAuthorToCommitterDate = false;
+
+  private RevCommit rebasedCommit;
+  private PatchSet.Id rebasedPatchSetId;
+  private PatchSetInserter patchSetInserter;
+  private PatchSet rebasedPatchSet;
+
+  @Inject
+  RebaseChangeOp(
+      PatchSetInserter.Factory patchSetInserterFactory,
+      MergeUtil.Factory mergeUtilFactory,
+      RebaseUtil rebaseUtil,
+      ChangeResource.Factory changeResourceFactory,
+      IdentifiedUser.GenericFactory identifiedUserFactory,
+      ProjectCache projectCache,
+      @Assisted ChangeNotes notes,
+      @Assisted PatchSet originalPatchSet,
+      @Assisted ObjectId baseCommitId) {
+    this.patchSetInserterFactory = patchSetInserterFactory;
+    this.mergeUtilFactory = mergeUtilFactory;
+    this.rebaseUtil = rebaseUtil;
+    this.changeResourceFactory = changeResourceFactory;
+    this.identifiedUserFactory = identifiedUserFactory;
+    this.projectCache = projectCache;
+    this.notes = notes;
+    this.originalPatchSet = originalPatchSet;
+    this.baseCommitId = baseCommitId;
+  }
+
+  public RebaseChangeOp setCommitterIdent(PersonIdent committerIdent) {
+    this.committerIdent = committerIdent;
+    return this;
+  }
+
+  public RebaseChangeOp setValidate(boolean validate) {
+    this.validate = validate;
+    return this;
+  }
+
+  public RebaseChangeOp setCheckAddPatchSetPermission(boolean checkAddPatchSetPermission) {
+    this.checkAddPatchSetPermission = checkAddPatchSetPermission;
+    return this;
+  }
+
+  public RebaseChangeOp setFireRevisionCreated(boolean fireRevisionCreated) {
+    this.fireRevisionCreated = fireRevisionCreated;
+    return this;
+  }
+
+  public RebaseChangeOp setForceContentMerge(boolean forceContentMerge) {
+    this.forceContentMerge = forceContentMerge;
+    return this;
+  }
+
+  public RebaseChangeOp setCopyApprovals(boolean copyApprovals) {
+    this.copyApprovals = copyApprovals;
+    return this;
+  }
+
+  public RebaseChangeOp setDetailedCommitMessage(boolean detailedCommitMessage) {
+    this.detailedCommitMessage = detailedCommitMessage;
+    return this;
+  }
+
+  public RebaseChangeOp setPostMessage(boolean postMessage) {
+    this.postMessage = postMessage;
+    return this;
+  }
+
+  public RebaseChangeOp setMatchAuthorToCommitterDate(boolean matchAuthorToCommitterDate) {
+    this.matchAuthorToCommitterDate = matchAuthorToCommitterDate;
+    return this;
+  }
+
+  @Override
+  public void updateRepo(RepoContext ctx)
+      throws MergeConflictException, InvalidChangeOperationException, RestApiException, IOException,
+          OrmException, NoSuchChangeException, PermissionBackendException {
+    // Ok that originalPatchSet was not read in a transaction, since we just
+    // need its revision.
+    RevId oldRev = originalPatchSet.getRevision();
+
+    RevWalk rw = ctx.getRevWalk();
+    RevCommit original = rw.parseCommit(ObjectId.fromString(oldRev.get()));
+    rw.parseBody(original);
+    RevCommit baseCommit = rw.parseCommit(baseCommitId);
+    CurrentUser changeOwner = identifiedUserFactory.create(notes.getChange().getOwner());
+
+    String newCommitMessage;
+    if (detailedCommitMessage) {
+      rw.parseBody(baseCommit);
+      newCommitMessage =
+          newMergeUtil()
+              .createCommitMessageOnSubmit(original, baseCommit, notes, originalPatchSet.getId());
+    } else {
+      newCommitMessage = original.getFullMessage();
+    }
+
+    rebasedCommit = rebaseCommit(ctx, original, baseCommit, newCommitMessage);
+    Base base =
+        rebaseUtil.parseBase(
+            new RevisionResource(
+                changeResourceFactory.create(notes, changeOwner), originalPatchSet),
+            baseCommitId.name());
+
+    rebasedPatchSetId =
+        ChangeUtil.nextPatchSetIdFromChangeRefsMap(
+            ctx.getRepoView().getRefs(originalPatchSet.getId().getParentKey().toRefPrefix()),
+            notes.getChange().currentPatchSetId());
+    patchSetInserter =
+        patchSetInserterFactory
+            .create(notes, rebasedPatchSetId, rebasedCommit)
+            .setDescription("Rebase")
+            .setNotify(NotifyHandling.NONE)
+            .setFireRevisionCreated(fireRevisionCreated)
+            .setCopyApprovals(copyApprovals)
+            .setCheckAddPatchSetPermission(checkAddPatchSetPermission)
+            .setValidate(validate);
+    if (postMessage) {
+      patchSetInserter.setMessage(
+          "Patch Set "
+              + rebasedPatchSetId.get()
+              + ": Patch Set "
+              + originalPatchSet.getId().get()
+              + " was rebased");
+    }
+
+    if (base != null) {
+      patchSetInserter.setGroups(base.patchSet().getGroups());
+    }
+    patchSetInserter.updateRepo(ctx);
+  }
+
+  @Override
+  public boolean updateChange(ChangeContext ctx)
+      throws ResourceConflictException, OrmException, IOException {
+    boolean ret = patchSetInserter.updateChange(ctx);
+    rebasedPatchSet = patchSetInserter.getPatchSet();
+    return ret;
+  }
+
+  @Override
+  public void postUpdate(Context ctx) throws OrmException {
+    patchSetInserter.postUpdate(ctx);
+  }
+
+  public RevCommit getRebasedCommit() {
+    checkState(rebasedCommit != null, "getRebasedCommit() only valid after updateRepo");
+    return rebasedCommit;
+  }
+
+  public PatchSet.Id getPatchSetId() {
+    checkState(rebasedPatchSetId != null, "getPatchSetId() only valid after updateRepo");
+    return rebasedPatchSetId;
+  }
+
+  public PatchSet getPatchSet() {
+    checkState(rebasedPatchSet != null, "getPatchSet() only valid after executing update");
+    return rebasedPatchSet;
+  }
+
+  private MergeUtil newMergeUtil() throws IOException {
+    ProjectState project = projectCache.checkedGet(notes.getProjectName());
+    return forceContentMerge
+        ? mergeUtilFactory.create(project, true)
+        : mergeUtilFactory.create(project);
+  }
+
+  /**
+   * Rebase a commit.
+   *
+   * @param ctx repo context.
+   * @param original the commit to rebase.
+   * @param base base to rebase against.
+   * @return the rebased commit.
+   * @throws MergeConflictException the rebase failed due to a merge conflict.
+   * @throws IOException the merge failed for another reason.
+   */
+  private RevCommit rebaseCommit(
+      RepoContext ctx, RevCommit original, ObjectId base, String commitMessage)
+      throws ResourceConflictException, IOException {
+    RevCommit parentCommit = original.getParent(0);
+
+    if (base.equals(parentCommit)) {
+      throw new ResourceConflictException("Change is already up to date.");
+    }
+
+    ThreeWayMerger merger =
+        newMergeUtil().newThreeWayMerger(ctx.getInserter(), ctx.getRepoView().getConfig());
+    merger.setBase(parentCommit);
+    boolean success = merger.merge(original, base);
+
+    if (!success || merger.getResultTreeId() == null) {
+      throw new MergeConflictException(
+          "The change could not be rebased due to a conflict during merge.");
+    }
+
+    CommitBuilder cb = new CommitBuilder();
+    cb.setTreeId(merger.getResultTreeId());
+    cb.setParentId(base);
+    cb.setAuthor(original.getAuthorIdent());
+    cb.setMessage(commitMessage);
+    if (committerIdent != null) {
+      cb.setCommitter(committerIdent);
+    } else {
+      cb.setCommitter(ctx.getIdentifiedUser().newCommitterIdent(ctx.getWhen(), ctx.getTimeZone()));
+    }
+    if (matchAuthorToCommitterDate) {
+      cb.setAuthor(
+          new PersonIdent(
+              cb.getAuthor(), cb.getCommitter().getWhen(), cb.getCommitter().getTimeZone()));
+    }
+    ObjectId objectId = ctx.getInserter().insert(cb);
+    ctx.getInserter().flush();
+    return ctx.getRevWalk().parseCommit(objectId);
+  }
+}
diff --git a/java/com/google/gerrit/server/change/RebaseUtil.java b/java/com/google/gerrit/server/change/RebaseUtil.java
new file mode 100644
index 0000000..22f98b8
--- /dev/null
+++ b/java/com/google/gerrit/server/change/RebaseUtil.java
@@ -0,0 +1,205 @@
+// Copyright (C) 2015 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.google.gerrit.server.change;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.primitives.Ints;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Change.Status;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.RevId;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+/** Utility methods related to rebasing changes. */
+public class RebaseUtil {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final Provider<InternalChangeQuery> queryProvider;
+  private final ChangeNotes.Factory notesFactory;
+  private final Provider<ReviewDb> dbProvider;
+  private final PatchSetUtil psUtil;
+
+  @Inject
+  RebaseUtil(
+      Provider<InternalChangeQuery> queryProvider,
+      ChangeNotes.Factory notesFactory,
+      Provider<ReviewDb> dbProvider,
+      PatchSetUtil psUtil) {
+    this.queryProvider = queryProvider;
+    this.notesFactory = notesFactory;
+    this.dbProvider = dbProvider;
+    this.psUtil = psUtil;
+  }
+
+  public boolean canRebase(PatchSet patchSet, Branch.NameKey dest, Repository git, RevWalk rw) {
+    try {
+      findBaseRevision(patchSet, dest, git, rw);
+      return true;
+    } catch (RestApiException e) {
+      return false;
+    } catch (OrmException | IOException e) {
+      logger.atWarning().withCause(e).log(
+          "Error checking if patch set %s on %s can be rebased", patchSet.getId(), dest);
+      return false;
+    }
+  }
+
+  @AutoValue
+  public abstract static class Base {
+    private static Base create(ChangeNotes notes, PatchSet ps) {
+      if (notes == null) {
+        return null;
+      }
+      return new AutoValue_RebaseUtil_Base(notes, ps);
+    }
+
+    public abstract ChangeNotes notes();
+
+    public abstract PatchSet patchSet();
+  }
+
+  public Base parseBase(RevisionResource rsrc, String base) throws OrmException {
+    ReviewDb db = dbProvider.get();
+
+    // Try parsing the base as a ref string.
+    PatchSet.Id basePatchSetId = PatchSet.Id.fromRef(base);
+    if (basePatchSetId != null) {
+      Change.Id baseChangeId = basePatchSetId.getParentKey();
+      ChangeNotes baseNotes = notesFor(rsrc, baseChangeId);
+      if (baseNotes != null) {
+        return Base.create(
+            notesFor(rsrc, basePatchSetId.getParentKey()),
+            psUtil.get(db, baseNotes, basePatchSetId));
+      }
+    }
+
+    // Try parsing base as a change number (assume current patch set).
+    Integer baseChangeId = Ints.tryParse(base);
+    if (baseChangeId != null) {
+      ChangeNotes baseNotes = notesFor(rsrc, new Change.Id(baseChangeId));
+      if (baseNotes != null) {
+        return Base.create(baseNotes, psUtil.current(db, baseNotes));
+      }
+    }
+
+    // Try parsing as SHA-1.
+    Base ret = null;
+    for (ChangeData cd : queryProvider.get().byProjectCommit(rsrc.getProject(), base)) {
+      for (PatchSet ps : cd.patchSets()) {
+        if (!ps.getRevision().matches(base)) {
+          continue;
+        }
+        if (ret == null || ret.patchSet().getId().get() < ps.getId().get()) {
+          ret = Base.create(cd.notes(), ps);
+        }
+      }
+    }
+    return ret;
+  }
+
+  private ChangeNotes notesFor(RevisionResource rsrc, Change.Id id) throws OrmException {
+    if (rsrc.getChange().getId().equals(id)) {
+      return rsrc.getNotes();
+    }
+    return notesFactory.createChecked(dbProvider.get(), rsrc.getProject(), id);
+  }
+
+  /**
+   * Find the commit onto which a patch set should be rebased.
+   *
+   * <p>This is defined as the latest patch set of the change corresponding to this commit's parent,
+   * or the destination branch tip in the case where the parent's change is merged.
+   *
+   * @param patchSet patch set for which the new base commit should be found.
+   * @param destBranch the destination branch.
+   * @param git the repository.
+   * @param rw the RevWalk.
+   * @return the commit onto which the patch set should be rebased.
+   * @throws RestApiException if rebase is not possible.
+   * @throws IOException if accessing the repository fails.
+   * @throws OrmException if accessing the database fails.
+   */
+  public ObjectId findBaseRevision(
+      PatchSet patchSet, Branch.NameKey destBranch, Repository git, RevWalk rw)
+      throws RestApiException, IOException, OrmException {
+    String baseRev = null;
+    RevCommit commit = rw.parseCommit(ObjectId.fromString(patchSet.getRevision().get()));
+
+    if (commit.getParentCount() > 1) {
+      throw new UnprocessableEntityException("Cannot rebase a change with multiple parents.");
+    } else if (commit.getParentCount() == 0) {
+      throw new UnprocessableEntityException(
+          "Cannot rebase a change without any parents (is this the initial commit?).");
+    }
+
+    RevId parentRev = new RevId(commit.getParent(0).name());
+
+    CHANGES:
+    for (ChangeData cd : queryProvider.get().byBranchCommit(destBranch, parentRev.get())) {
+      for (PatchSet depPatchSet : cd.patchSets()) {
+        if (!depPatchSet.getRevision().equals(parentRev)) {
+          continue;
+        }
+        Change depChange = cd.change();
+        if (depChange.getStatus() == Status.ABANDONED) {
+          throw new ResourceConflictException(
+              "Cannot rebase a change with an abandoned parent: " + depChange.getKey());
+        }
+
+        if (depChange.getStatus().isOpen()) {
+          if (depPatchSet.getId().equals(depChange.currentPatchSetId())) {
+            throw new ResourceConflictException(
+                "Change is already based on the latest patch set of the dependent change.");
+          }
+          baseRev = cd.currentPatchSet().getRevision().get();
+        }
+        break CHANGES;
+      }
+    }
+
+    if (baseRev == null) {
+      // We are dependent on a merged PatchSet or have no PatchSet
+      // dependencies at all.
+      Ref destRef = git.getRefDatabase().exactRef(destBranch.get());
+      if (destRef == null) {
+        throw new UnprocessableEntityException(
+            "The destination branch does not exist: " + destBranch.get());
+      }
+      baseRev = destRef.getObjectId().getName();
+      if (baseRev.equals(parentRev.get())) {
+        throw new ResourceConflictException("Change is already up to date.");
+      }
+    }
+    return ObjectId.fromString(baseRev);
+  }
+}
diff --git a/java/com/google/gerrit/server/change/ReviewerAdder.java b/java/com/google/gerrit/server/change/ReviewerAdder.java
new file mode 100644
index 0000000..fe6090f
--- /dev/null
+++ b/java/com/google/gerrit/server/change/ReviewerAdder.java
@@ -0,0 +1,664 @@
+// 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.
+
+package com.google.gerrit.server.change;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static com.google.common.collect.ImmutableSet.toImmutableSet;
+import static com.google.gerrit.extensions.client.ReviewerState.CC;
+import static com.google.gerrit.extensions.client.ReviewerState.REVIEWER;
+import static java.util.Comparator.comparing;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Ordering;
+import com.google.common.collect.Streams;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.extensions.api.changes.AddReviewerInput;
+import com.google.gerrit.extensions.api.changes.AddReviewerResult;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.api.changes.RecipientType;
+import com.google.gerrit.extensions.api.changes.ReviewerInfo;
+import com.google.gerrit.extensions.client.ReviewerState;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.AnonymousUser;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountLoader;
+import com.google.gerrit.server.account.AccountResolver;
+import com.google.gerrit.server.account.GroupMembers;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.group.GroupResolver;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gerrit.server.mail.send.OutgoingEmailValidator;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.gerrit.server.project.NoSuchProjectException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.Context;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.Function;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Config;
+
+public class ReviewerAdder {
+  public static final int DEFAULT_MAX_REVIEWERS_WITHOUT_CHECK = 10;
+  public static final int DEFAULT_MAX_REVIEWERS = 20;
+
+  public enum FailureBehavior {
+    FAIL,
+    IGNORE;
+  }
+
+  private enum FailureType {
+    NOT_FOUND,
+    OTHER;
+  }
+
+  // TODO(dborowitz): Subclassing is not the right way to do this. We should instead use an internal
+  // type in the public interfaces of ReviewerAdder, rather than passing around the REST API type
+  // internally.
+  public static class InternalAddReviewerInput extends AddReviewerInput {
+    /**
+     * Behavior when identifying reviewers fails for any reason <em>besides</em> the input not
+     * resolving to an account/group/email.
+     */
+    public FailureBehavior otherFailureBehavior = FailureBehavior.FAIL;
+  }
+
+  public static InternalAddReviewerInput newAddReviewerInput(
+      Account.Id reviewer, ReviewerState state, NotifyHandling notify) {
+    // AccountResolver always resolves by ID if the input string is numeric.
+    return newAddReviewerInput(reviewer.toString(), state, notify);
+  }
+
+  public static InternalAddReviewerInput newAddReviewerInput(
+      String reviewer, ReviewerState state, NotifyHandling notify) {
+    InternalAddReviewerInput in = new InternalAddReviewerInput();
+    in.reviewer = reviewer;
+    in.state = state;
+    in.notify = notify;
+    return in;
+  }
+
+  public static Optional<InternalAddReviewerInput> newAddReviewerInputFromCommitIdentity(
+      Change change, @Nullable Account.Id accountId, NotifyHandling notify) {
+    if (accountId == null || accountId.equals(change.getOwner())) {
+      // If git ident couldn't be resolved to a user, or if it's not forged, do nothing.
+      return Optional.empty();
+    }
+
+    InternalAddReviewerInput in = new InternalAddReviewerInput();
+    in.reviewer = accountId.toString();
+    in.state = REVIEWER;
+    in.notify = notify;
+    in.otherFailureBehavior = FailureBehavior.IGNORE;
+    return Optional.of(in);
+  }
+
+  private final AccountResolver accountResolver;
+  private final PermissionBackend permissionBackend;
+  private final GroupResolver groupResolver;
+  private final GroupMembers groupMembers;
+  private final AccountLoader.Factory accountLoaderFactory;
+  private final Config cfg;
+  private final ReviewerJson json;
+  private final NotesMigration migration;
+  private final NotifyUtil notifyUtil;
+  private final ProjectCache projectCache;
+  private final Provider<AnonymousUser> anonymousProvider;
+  private final AddReviewersOp.Factory addReviewersOpFactory;
+  private final OutgoingEmailValidator validator;
+
+  @Inject
+  ReviewerAdder(
+      AccountResolver accountResolver,
+      PermissionBackend permissionBackend,
+      GroupResolver groupResolver,
+      GroupMembers groupMembers,
+      AccountLoader.Factory accountLoaderFactory,
+      @GerritServerConfig Config cfg,
+      ReviewerJson json,
+      NotesMigration migration,
+      NotifyUtil notifyUtil,
+      ProjectCache projectCache,
+      Provider<AnonymousUser> anonymousProvider,
+      AddReviewersOp.Factory addReviewersOpFactory,
+      OutgoingEmailValidator validator) {
+    this.accountResolver = accountResolver;
+    this.permissionBackend = permissionBackend;
+    this.groupResolver = groupResolver;
+    this.groupMembers = groupMembers;
+    this.accountLoaderFactory = accountLoaderFactory;
+    this.cfg = cfg;
+    this.json = json;
+    this.migration = migration;
+    this.notifyUtil = notifyUtil;
+    this.projectCache = projectCache;
+    this.anonymousProvider = anonymousProvider;
+    this.addReviewersOpFactory = addReviewersOpFactory;
+    this.validator = validator;
+  }
+
+  /**
+   * Prepare application of a single {@link AddReviewerInput}.
+   *
+   * @param db database.
+   * @param notes change notes.
+   * @param user user performing the reviewer addition.
+   * @param input input describing user or group to add as a reviewer.
+   * @param allowGroup whether to allow
+   * @return handle describing the addition operation. If the {@code op} field is present, this
+   *     operation may be added to a {@code BatchUpdate}. Otherwise, the {@code error} field
+   *     contains information about an error that occurred
+   * @throws OrmException
+   * @throws IOException
+   * @throws PermissionBackendException
+   * @throws ConfigInvalidException
+   */
+  public ReviewerAddition prepare(
+      ReviewDb db, ChangeNotes notes, CurrentUser user, AddReviewerInput input, boolean allowGroup)
+      throws OrmException, IOException, PermissionBackendException, ConfigInvalidException {
+    requireNonNull(input.reviewer);
+    ListMultimap<RecipientType, Account.Id> accountsToNotify;
+    try {
+      accountsToNotify = notifyUtil.resolveAccounts(input.notifyDetails);
+    } catch (BadRequestException e) {
+      return fail(input, FailureType.OTHER, e.getMessage());
+    }
+    boolean confirmed = input.confirmed();
+    boolean allowByEmail =
+        projectCache
+            .checkedGet(notes.getProjectName())
+            .is(BooleanProjectConfig.ENABLE_REVIEWER_BY_EMAIL);
+
+    ReviewerAddition byAccountId =
+        addByAccountId(db, input, notes, user, accountsToNotify, allowGroup, allowByEmail);
+
+    ReviewerAddition wholeGroup = null;
+    if (byAccountId == null || !byAccountId.exactMatchFound) {
+      wholeGroup =
+          addWholeGroup(
+              db, input, notes, user, accountsToNotify, confirmed, allowGroup, allowByEmail);
+      if (wholeGroup != null && wholeGroup.exactMatchFound) {
+        return wholeGroup;
+      }
+    }
+
+    if (byAccountId != null) {
+      return byAccountId;
+    }
+    if (wholeGroup != null) {
+      return wholeGroup;
+    }
+
+    return addByEmail(db, input, notes, user, accountsToNotify);
+  }
+
+  public ReviewerAddition ccCurrentUser(CurrentUser user, RevisionResource revision) {
+    return new ReviewerAddition(
+        newAddReviewerInput(user.getUserName().orElse(null), CC, NotifyHandling.NONE),
+        revision.getNotes(),
+        revision.getUser(),
+        ImmutableSet.of(user.getAccountId()),
+        null,
+        ImmutableListMultimap.of(),
+        true);
+  }
+
+  @Nullable
+  private ReviewerAddition addByAccountId(
+      ReviewDb db,
+      AddReviewerInput input,
+      ChangeNotes notes,
+      CurrentUser user,
+      ListMultimap<RecipientType, Account.Id> accountsToNotify,
+      boolean allowGroup,
+      boolean allowByEmail)
+      throws OrmException, PermissionBackendException, IOException, ConfigInvalidException {
+    IdentifiedUser reviewerUser;
+    boolean exactMatchFound = false;
+    try {
+      reviewerUser = accountResolver.parse(input.reviewer);
+      if (input.reviewer.equalsIgnoreCase(reviewerUser.getName())
+          || input.reviewer.equals(String.valueOf(reviewerUser.getAccountId()))) {
+        exactMatchFound = true;
+      }
+    } catch (UnprocessableEntityException | AuthException e) {
+      // AuthException won't occur since the user is authenticated at this point.
+      if (!allowGroup && !allowByEmail) {
+        // Only return failure if we aren't going to try other interpretations.
+        return fail(
+            input,
+            FailureType.NOT_FOUND,
+            MessageFormat.format(ChangeMessages.get().reviewerNotFoundUser, input.reviewer));
+      }
+      return null;
+    }
+
+    if (isValidReviewer(db, notes.getChange().getDest(), reviewerUser.getAccount())) {
+      return new ReviewerAddition(
+          input,
+          notes,
+          user,
+          ImmutableSet.of(reviewerUser.getAccountId()),
+          null,
+          accountsToNotify,
+          exactMatchFound);
+    }
+    if (!reviewerUser.getAccount().isActive()) {
+      if (allowByEmail && input.state() == CC) {
+        return null;
+      }
+      return fail(
+          input,
+          FailureType.OTHER,
+          MessageFormat.format(ChangeMessages.get().reviewerInactive, input.reviewer));
+    }
+    return fail(
+        input,
+        FailureType.OTHER,
+        MessageFormat.format(ChangeMessages.get().reviewerCantSeeChange, input.reviewer));
+  }
+
+  @Nullable
+  private ReviewerAddition addWholeGroup(
+      ReviewDb db,
+      AddReviewerInput input,
+      ChangeNotes notes,
+      CurrentUser user,
+      ListMultimap<RecipientType, Account.Id> accountsToNotify,
+      boolean confirmed,
+      boolean allowGroup,
+      boolean allowByEmail)
+      throws IOException, PermissionBackendException {
+    if (!allowGroup) {
+      return null;
+    }
+
+    GroupDescription.Basic group;
+    try {
+      // TODO(dborowitz): This currently doesn't work in the push path because InternalGroupBackend
+      // depends on the Provider<CurrentUser> which returns anonymous in that path.
+      group = groupResolver.parseInternal(input.reviewer);
+    } catch (UnprocessableEntityException e) {
+      if (!allowByEmail) {
+        return fail(
+            input,
+            FailureType.NOT_FOUND,
+            MessageFormat.format(ChangeMessages.get().reviewerNotFoundUserOrGroup, input.reviewer));
+      }
+      return null;
+    }
+
+    if (!isLegalReviewerGroup(group.getGroupUUID())) {
+      return fail(
+          input,
+          FailureType.OTHER,
+          MessageFormat.format(ChangeMessages.get().groupIsNotAllowed, group.getName()));
+    }
+
+    Set<Account.Id> reviewers = new HashSet<>();
+    Set<Account> members;
+    try {
+      members = groupMembers.listAccounts(group.getGroupUUID(), notes.getProjectName());
+    } catch (NoSuchProjectException e) {
+      return fail(input, FailureType.OTHER, e.getMessage());
+    }
+
+    // if maxAllowed is set to 0, it is allowed to add any number of
+    // reviewers
+    int maxAllowed = cfg.getInt("addreviewer", "maxAllowed", DEFAULT_MAX_REVIEWERS);
+    if (maxAllowed > 0 && members.size() > maxAllowed) {
+      return fail(
+          input,
+          FailureType.OTHER,
+          MessageFormat.format(ChangeMessages.get().groupHasTooManyMembers, group.getName()));
+    }
+
+    // if maxWithoutCheck is set to 0, we never ask for confirmation
+    int maxWithoutConfirmation =
+        cfg.getInt("addreviewer", "maxWithoutConfirmation", DEFAULT_MAX_REVIEWERS_WITHOUT_CHECK);
+    if (!confirmed && maxWithoutConfirmation > 0 && members.size() > maxWithoutConfirmation) {
+      return fail(
+          input,
+          FailureType.OTHER,
+          true,
+          MessageFormat.format(
+              ChangeMessages.get().groupManyMembersConfirmation, group.getName(), members.size()));
+    }
+
+    for (Account member : members) {
+      if (isValidReviewer(db, notes.getChange().getDest(), member)) {
+        reviewers.add(member.getId());
+      }
+    }
+
+    return new ReviewerAddition(input, notes, user, reviewers, null, accountsToNotify, true);
+  }
+
+  @Nullable
+  private ReviewerAddition addByEmail(
+      ReviewDb db,
+      AddReviewerInput input,
+      ChangeNotes notes,
+      CurrentUser user,
+      ListMultimap<RecipientType, Account.Id> accountsToNotify)
+      throws PermissionBackendException {
+    try {
+      permissionBackend
+          .user(anonymousProvider.get())
+          .database(db)
+          .change(notes)
+          .check(ChangePermission.READ);
+    } catch (AuthException e) {
+      return fail(
+          input,
+          FailureType.OTHER,
+          MessageFormat.format(ChangeMessages.get().reviewerCantSeeChange, input.reviewer));
+    }
+
+    if (!migration.readChanges()) {
+      // addByEmail depends on NoteDb.
+      return fail(
+          input,
+          FailureType.NOT_FOUND,
+          MessageFormat.format(ChangeMessages.get().reviewerNotFoundUser, input.reviewer));
+    }
+    Address adr = Address.tryParse(input.reviewer);
+    if (adr == null || !validator.isValid(adr.getEmail())) {
+      return fail(
+          input,
+          FailureType.NOT_FOUND,
+          MessageFormat.format(ChangeMessages.get().reviewerInvalid, input.reviewer));
+    }
+    return new ReviewerAddition(
+        input, notes, user, null, ImmutableList.of(adr), accountsToNotify, true);
+  }
+
+  private boolean isValidReviewer(ReviewDb db, Branch.NameKey branch, Account member)
+      throws PermissionBackendException {
+    if (!member.isActive()) {
+      return false;
+    }
+
+    try {
+      // Check ref permission instead of change permission, since change permissions take into
+      // account the private bit, whereas adding a user as a reviewer is explicitly allowing them to
+      // see private changes.
+      permissionBackend
+          .absentUser(member.getId())
+          .database(db)
+          .ref(branch)
+          .check(RefPermission.READ);
+      return true;
+    } catch (AuthException e) {
+      return false;
+    }
+  }
+
+  private ReviewerAddition fail(AddReviewerInput input, FailureType failureType, String error) {
+    return fail(input, failureType, false, error);
+  }
+
+  private ReviewerAddition fail(
+      AddReviewerInput input, FailureType failureType, boolean confirm, String error) {
+    ReviewerAddition addition = new ReviewerAddition(input, failureType);
+    addition.result.confirm = confirm ? true : null;
+    addition.result.error = error;
+    return addition;
+  }
+
+  public class ReviewerAddition {
+    public final AddReviewerResult result;
+    @Nullable public final AddReviewersOp op;
+    public final ImmutableSet<Account.Id> reviewers;
+    public final ImmutableSet<Address> reviewersByEmail;
+    @Nullable final IdentifiedUser caller;
+    final boolean exactMatchFound;
+    private final AddReviewerInput input;
+    @Nullable private final FailureType failureType;
+
+    private ReviewerAddition(AddReviewerInput input, FailureType failureType) {
+      this.input = input;
+      this.failureType = requireNonNull(failureType);
+      result = new AddReviewerResult(input.reviewer);
+      op = null;
+      reviewers = ImmutableSet.of();
+      reviewersByEmail = ImmutableSet.of();
+      caller = null;
+      exactMatchFound = false;
+    }
+
+    private ReviewerAddition(
+        AddReviewerInput input,
+        ChangeNotes notes,
+        CurrentUser caller,
+        @Nullable Iterable<Account.Id> reviewers,
+        @Nullable Iterable<Address> reviewersByEmail,
+        ListMultimap<RecipientType, Account.Id> accountsToNotify,
+        boolean exactMatchFound) {
+      checkArgument(
+          reviewers != null || reviewersByEmail != null,
+          "must have either reviewers or reviewersByEmail");
+
+      this.input = input;
+      this.failureType = null;
+      result = new AddReviewerResult(input.reviewer);
+      // Always silently ignore adding the owner as any type of reviewer on their own change. They
+      // may still be implicitly added as a reviewer if they vote, but not via the reviewer API.
+      this.reviewers = omitOwner(notes, reviewers);
+      this.reviewersByEmail =
+          reviewersByEmail == null ? ImmutableSet.of() : ImmutableSet.copyOf(reviewersByEmail);
+      this.caller = caller.asIdentifiedUser();
+      op =
+          addReviewersOpFactory.create(
+              this.reviewers, this.reviewersByEmail, state(), input.notify, accountsToNotify);
+      this.exactMatchFound = exactMatchFound;
+    }
+
+    private ImmutableSet<Account.Id> omitOwner(ChangeNotes notes, Iterable<Account.Id> reviewers) {
+      return reviewers != null
+          ? Streams.stream(reviewers)
+              .filter(id -> !id.equals(notes.getChange().getOwner()))
+              .collect(toImmutableSet())
+          : ImmutableSet.of();
+    }
+
+    public void gatherResults(ChangeData cd) throws OrmException, PermissionBackendException {
+      checkState(op != null, "addition did not result in an update op");
+      checkState(op.getResult() != null, "op did not return a result");
+
+      // Generate result details and fill AccountLoader. This occurs outside
+      // the Op because the accounts are in a different table.
+      AddReviewersOp.Result opResult = op.getResult();
+      if (migration.readChanges() && state() == CC) {
+        result.ccs = Lists.newArrayListWithCapacity(opResult.addedCCs().size());
+        for (Account.Id accountId : opResult.addedCCs()) {
+          result.ccs.add(json.format(new ReviewerInfo(accountId.get()), accountId, cd));
+        }
+        accountLoaderFactory.create(true).fill(result.ccs);
+        for (Address a : opResult.addedCCsByEmail()) {
+          result.ccs.add(new AccountInfo(a.getName(), a.getEmail()));
+        }
+      } else {
+        result.reviewers = Lists.newArrayListWithCapacity(opResult.addedReviewers().size());
+        for (PatchSetApproval psa : opResult.addedReviewers()) {
+          // New reviewers have value 0, don't bother normalizing.
+          result.reviewers.add(
+              json.format(
+                  new ReviewerInfo(psa.getAccountId().get()),
+                  psa.getAccountId(),
+                  cd,
+                  ImmutableList.of(psa)));
+        }
+        accountLoaderFactory.create(true).fill(result.reviewers);
+        for (Address a : opResult.addedReviewersByEmail()) {
+          result.reviewers.add(ReviewerInfo.byEmail(a.getName(), a.getEmail()));
+        }
+      }
+    }
+
+    public ReviewerState state() {
+      return input.state();
+    }
+
+    public boolean isFailure() {
+      return failureType != null;
+    }
+
+    public boolean isIgnorableFailure() {
+      checkState(failureType != null);
+      FailureBehavior behavior =
+          (input instanceof InternalAddReviewerInput)
+              ? ((InternalAddReviewerInput) input).otherFailureBehavior
+              : FailureBehavior.FAIL;
+      return failureType == FailureType.OTHER && behavior == FailureBehavior.IGNORE;
+    }
+  }
+
+  public static boolean isLegalReviewerGroup(AccountGroup.UUID groupUUID) {
+    return !SystemGroupBackend.isSystemGroup(groupUUID);
+  }
+
+  public ReviewerAdditionList prepare(
+      ReviewDb db,
+      ChangeNotes notes,
+      CurrentUser user,
+      Iterable<? extends AddReviewerInput> inputs,
+      boolean allowGroup)
+      throws OrmException, IOException, PermissionBackendException, ConfigInvalidException {
+    // Process CC ops before reviewer ops, so a user that appears in both lists ends up as a
+    // reviewer; the last call to ChangeUpdate#putReviewer wins. This can happen if the caller
+    // specifies the same string twice, or less obviously if they specify multiple groups with
+    // overlapping members.
+    // TODO(dborowitz): Consider changing interface to allow excluding reviewers that were
+    // previously processed, to proactively prevent overlap so we don't have to rely on this subtle
+    // behavior.
+    ImmutableList<AddReviewerInput> sorted =
+        Streams.stream(inputs)
+            .sorted(
+                comparing(
+                    i -> i.state(), Ordering.explicit(ReviewerState.CC, ReviewerState.REVIEWER)))
+            .collect(toImmutableList());
+    List<ReviewerAddition> additions = new ArrayList<>();
+    for (AddReviewerInput input : sorted) {
+      additions.add(prepare(db, notes, user, input, allowGroup));
+    }
+    return new ReviewerAdditionList(additions);
+  }
+
+  // TODO(dborowitz): This class works, but ultimately feels wrong. It seems like an op but isn't
+  // really an op, it's a collection of ops, and it's only called from the body of other ops. We
+  // could make this class an op, but we would still have AddReviewersOp. Better would probably be
+  // to design a single op that supports combining multiple AddReviewerInputs together. That would
+  // probably also subsume the Addition class itself, which would be a good thing.
+  public static class ReviewerAdditionList {
+    private final ImmutableList<ReviewerAddition> additions;
+
+    private ReviewerAdditionList(List<ReviewerAddition> additions) {
+      this.additions = ImmutableList.copyOf(additions);
+    }
+
+    public ImmutableList<ReviewerAddition> getFailures() {
+      return additions.stream()
+          .filter(a -> a.isFailure() && !a.isIgnorableFailure())
+          .collect(toImmutableList());
+    }
+
+    // We never call updateRepo on the addition ops, which is only ok because it's a no-op.
+
+    public void updateChange(ChangeContext ctx, PatchSet patchSet)
+        throws OrmException, RestApiException, IOException {
+      for (ReviewerAddition addition : additions()) {
+        addition.op.setPatchSet(patchSet);
+        addition.op.updateChange(ctx);
+      }
+    }
+
+    public void postUpdate(Context ctx) throws Exception {
+      for (ReviewerAddition addition : additions()) {
+        if (addition.op != null) {
+          addition.op.postUpdate(ctx);
+        }
+      }
+    }
+
+    public <T> ImmutableSet<T> flattenResults(
+        Function<AddReviewersOp.Result, ? extends Collection<T>> func) {
+      additions()
+          .forEach(
+              a ->
+                  checkArgument(
+                      a.op != null && a.op.getResult() != null, "missing result on %s", a));
+      return additions().stream()
+          .map(a -> a.op.getResult())
+          .map(func)
+          .flatMap(Collection::stream)
+          .collect(toImmutableSet());
+    }
+
+    private ImmutableList<ReviewerAddition> additions() {
+      return additions.stream()
+          .filter(
+              a -> {
+                if (a.isFailure()) {
+                  if (a.isIgnorableFailure()) {
+                    return false;
+                  }
+                  // Shouldn't happen, caller should have checked that there were no errors.
+                  throw new IllegalStateException("error in addition: " + a.result.error);
+                }
+                return true;
+              })
+          .collect(toImmutableList());
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/change/ReviewerJson.java b/java/com/google/gerrit/server/change/ReviewerJson.java
new file mode 100644
index 0000000..ef2c926
--- /dev/null
+++ b/java/com/google/gerrit/server/change/ReviewerJson.java
@@ -0,0 +1,161 @@
+// Copyright (C) 2012 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.google.gerrit.server.change;
+
+import static com.google.gerrit.common.data.LabelValue.formatValue;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.LabelTypes;
+import com.google.gerrit.common.data.SubmitRecord;
+import com.google.gerrit.extensions.api.changes.ReviewerInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.account.AccountLoader;
+import com.google.gerrit.server.permissions.LabelPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.SubmitRuleEvaluator;
+import com.google.gerrit.server.project.SubmitRuleOptions;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.Collection;
+import java.util.List;
+import java.util.TreeMap;
+
+@Singleton
+public class ReviewerJson {
+  private final Provider<ReviewDb> db;
+  private final PermissionBackend permissionBackend;
+  private final ChangeData.Factory changeDataFactory;
+  private final ApprovalsUtil approvalsUtil;
+  private final AccountLoader.Factory accountLoaderFactory;
+  private final SubmitRuleEvaluator submitRuleEvaluator;
+
+  @Inject
+  ReviewerJson(
+      Provider<ReviewDb> db,
+      PermissionBackend permissionBackend,
+      ChangeData.Factory changeDataFactory,
+      ApprovalsUtil approvalsUtil,
+      AccountLoader.Factory accountLoaderFactory,
+      SubmitRuleEvaluator.Factory submitRuleEvaluatorFactory) {
+    this.db = db;
+    this.permissionBackend = permissionBackend;
+    this.changeDataFactory = changeDataFactory;
+    this.approvalsUtil = approvalsUtil;
+    this.accountLoaderFactory = accountLoaderFactory;
+    submitRuleEvaluator = submitRuleEvaluatorFactory.create(SubmitRuleOptions.defaults());
+  }
+
+  public List<ReviewerInfo> format(Collection<ReviewerResource> rsrcs)
+      throws OrmException, PermissionBackendException {
+    List<ReviewerInfo> infos = Lists.newArrayListWithCapacity(rsrcs.size());
+    AccountLoader loader = accountLoaderFactory.create(true);
+    ChangeData cd = null;
+    for (ReviewerResource rsrc : rsrcs) {
+      if (cd == null || !cd.getId().equals(rsrc.getChangeId())) {
+        cd = changeDataFactory.create(db.get(), rsrc.getChangeResource().getNotes());
+      }
+      ReviewerInfo info;
+      if (rsrc.isByEmail()) {
+        Address address = rsrc.getReviewerByEmail();
+        info = ReviewerInfo.byEmail(address.getName(), address.getEmail());
+      } else {
+        Account.Id reviewerAccountId = rsrc.getReviewerUser().getAccountId();
+        info = format(new ReviewerInfo(reviewerAccountId.get()), reviewerAccountId, cd);
+        loader.put(info);
+      }
+      infos.add(info);
+    }
+    loader.fill();
+    return infos;
+  }
+
+  public List<ReviewerInfo> format(ReviewerResource rsrc)
+      throws OrmException, PermissionBackendException {
+    return format(ImmutableList.<ReviewerResource>of(rsrc));
+  }
+
+  public ReviewerInfo format(ReviewerInfo out, Account.Id reviewerAccountId, ChangeData cd)
+      throws OrmException, PermissionBackendException {
+    PatchSet.Id psId = cd.change().currentPatchSetId();
+    return format(
+        out,
+        reviewerAccountId,
+        cd,
+        approvalsUtil.byPatchSetUser(db.get(), cd.notes(), psId, reviewerAccountId, null, null));
+  }
+
+  public ReviewerInfo format(
+      ReviewerInfo out,
+      Account.Id reviewerAccountId,
+      ChangeData cd,
+      Iterable<PatchSetApproval> approvals)
+      throws OrmException, PermissionBackendException {
+    LabelTypes labelTypes = cd.getLabelTypes();
+
+    out.approvals = new TreeMap<>(labelTypes.nameComparator());
+    for (PatchSetApproval ca : approvals) {
+      LabelType at = labelTypes.byLabel(ca.getLabelId());
+      if (at != null) {
+        out.approvals.put(at.getName(), formatValue(ca.getValue()));
+      }
+    }
+
+    // Add dummy approvals for all permitted labels for the user even if they
+    // do not exist in the DB.
+    PatchSet ps = cd.currentPatchSet();
+    if (ps != null) {
+      PermissionBackend.ForChange perm =
+          permissionBackend.absentUser(reviewerAccountId).database(db).change(cd);
+
+      for (SubmitRecord rec : submitRuleEvaluator.evaluate(cd)) {
+        if (rec.labels == null) {
+          continue;
+        }
+        for (SubmitRecord.Label label : rec.labels) {
+          String name = label.label;
+          LabelType type = labelTypes.byLabel(name);
+          if (out.approvals.containsKey(name) || type == null) {
+            continue;
+          }
+
+          try {
+            perm.check(new LabelPermission(type));
+            out.approvals.put(name, formatValue((short) 0));
+          } catch (AuthException e) {
+            // Do nothing.
+          }
+        }
+      }
+    }
+
+    if (out.approvals.isEmpty()) {
+      out.approvals = null;
+    }
+
+    return out;
+  }
+}
diff --git a/java/com/google/gerrit/server/change/ReviewerResource.java b/java/com/google/gerrit/server/change/ReviewerResource.java
new file mode 100644
index 0000000..52f3585
--- /dev/null
+++ b/java/com/google/gerrit/server/change/ReviewerResource.java
@@ -0,0 +1,116 @@
+// Copyright (C) 2017 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.google.gerrit.server.change;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.restapi.RestResource;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.inject.TypeLiteral;
+import com.google.inject.assistedinject.Assisted;
+import com.google.inject.assistedinject.AssistedInject;
+
+public class ReviewerResource implements RestResource {
+  public static final TypeLiteral<RestView<ReviewerResource>> REVIEWER_KIND =
+      new TypeLiteral<RestView<ReviewerResource>>() {};
+
+  public interface Factory {
+    ReviewerResource create(ChangeResource change, Account.Id id);
+
+    ReviewerResource create(RevisionResource revision, Account.Id id);
+  }
+
+  private final ChangeResource change;
+  private final RevisionResource revision;
+  @Nullable private final IdentifiedUser user;
+  @Nullable private final Address address;
+
+  @AssistedInject
+  ReviewerResource(
+      IdentifiedUser.GenericFactory userFactory,
+      @Assisted ChangeResource change,
+      @Assisted Account.Id id) {
+    this.change = change;
+    this.user = userFactory.create(id);
+    this.revision = null;
+    this.address = null;
+  }
+
+  @AssistedInject
+  ReviewerResource(
+      IdentifiedUser.GenericFactory userFactory,
+      @Assisted RevisionResource revision,
+      @Assisted Account.Id id) {
+    this.revision = revision;
+    this.change = revision.getChangeResource();
+    this.user = userFactory.create(id);
+    this.address = null;
+  }
+
+  public ReviewerResource(ChangeResource change, Address address) {
+    this.change = change;
+    this.address = address;
+    this.revision = null;
+    this.user = null;
+  }
+
+  public ReviewerResource(RevisionResource revision, Address address) {
+    this.revision = revision;
+    this.change = revision.getChangeResource();
+    this.address = address;
+    this.user = null;
+  }
+
+  public ChangeResource getChangeResource() {
+    return change;
+  }
+
+  public RevisionResource getRevisionResource() {
+    return revision;
+  }
+
+  public Change.Id getChangeId() {
+    return change.getId();
+  }
+
+  public Change getChange() {
+    return change.getChange();
+  }
+
+  public IdentifiedUser getReviewerUser() {
+    checkArgument(user != null, "no user provided");
+    return user;
+  }
+
+  public Address getReviewerByEmail() {
+    checkArgument(address != null, "no address provided");
+    return address;
+  }
+
+  /**
+   * Check if this resource was constructed by email or by {@code Account.Id}.
+   *
+   * @return true if the resource was constructed by providing an {@code Address}; false if the
+   *     resource was constructed by providing an {@code Account.Id}.
+   */
+  public boolean isByEmail() {
+    return user == null;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ReviewerSuggestion.java b/java/com/google/gerrit/server/change/ReviewerSuggestion.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/change/ReviewerSuggestion.java
rename to java/com/google/gerrit/server/change/ReviewerSuggestion.java
diff --git a/java/com/google/gerrit/server/change/RevisionJson.java b/java/com/google/gerrit/server/change/RevisionJson.java
new file mode 100644
index 0000000..b67028d
--- /dev/null
+++ b/java/com/google/gerrit/server/change/RevisionJson.java
@@ -0,0 +1,393 @@
+// 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.
+
+package com.google.gerrit.server.change;
+
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.gerrit.extensions.client.ListChangesOption.ALL_COMMITS;
+import static com.google.gerrit.extensions.client.ListChangesOption.ALL_FILES;
+import static com.google.gerrit.extensions.client.ListChangesOption.ALL_REVISIONS;
+import static com.google.gerrit.extensions.client.ListChangesOption.COMMIT_FOOTERS;
+import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_ACTIONS;
+import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_COMMIT;
+import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_FILES;
+import static com.google.gerrit.extensions.client.ListChangesOption.DETAILED_ACCOUNTS;
+import static com.google.gerrit.extensions.client.ListChangesOption.DOWNLOAD_COMMANDS;
+import static com.google.gerrit.extensions.client.ListChangesOption.PUSH_CERTIFICATES;
+import static com.google.gerrit.extensions.client.ListChangesOption.WEB_LINKS;
+import static com.google.gerrit.server.CommonConverters.toGitPerson;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.client.ListChangesOption;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.CommitInfo;
+import com.google.gerrit.extensions.common.FetchInfo;
+import com.google.gerrit.extensions.common.PushCertificateInfo;
+import com.google.gerrit.extensions.common.RevisionInfo;
+import com.google.gerrit.extensions.common.WebLinkInfo;
+import com.google.gerrit.extensions.config.DownloadCommand;
+import com.google.gerrit.extensions.config.DownloadScheme;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.registration.Extension;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSet.Id;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.AnonymousUser;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.GpgException;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.WebLinks;
+import com.google.gerrit.server.account.AccountLoader;
+import com.google.gerrit.server.account.GpgApiAdapter;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.MergeUtil;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+/** Produces {@link RevisionInfo} and {@link CommitInfo} which are serialized to JSON afterwards. */
+public class RevisionJson {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public interface Factory {
+    RevisionJson create(Iterable<ListChangesOption> options);
+  }
+
+  private final MergeUtil.Factory mergeUtilFactory;
+  private final IdentifiedUser.GenericFactory userFactory;
+  private final FileInfoJson fileInfoJson;
+  private final GpgApiAdapter gpgApi;
+  private final ChangeResource.Factory changeResourceFactory;
+  private final ChangeKindCache changeKindCache;
+  private final ActionJson actionJson;
+  private final DynamicMap<DownloadScheme> downloadSchemes;
+  private final DynamicMap<DownloadCommand> downloadCommands;
+  private final WebLinks webLinks;
+  private final Provider<CurrentUser> userProvider;
+  private final ProjectCache projectCache;
+  private final ImmutableSet<ListChangesOption> options;
+  private final AccountLoader.Factory accountLoaderFactory;
+  private final AnonymousUser anonymous;
+  private final GitRepositoryManager repoManager;
+  private final PermissionBackend permissionBackend;
+  private final ChangeNotes.Factory notesFactory;
+  private final boolean lazyLoad;
+
+  @Inject
+  RevisionJson(
+      Provider<CurrentUser> userProvider,
+      AnonymousUser anonymous,
+      ProjectCache projectCache,
+      IdentifiedUser.GenericFactory userFactory,
+      MergeUtil.Factory mergeUtilFactory,
+      FileInfoJson fileInfoJson,
+      AccountLoader.Factory accountLoaderFactory,
+      DynamicMap<DownloadScheme> downloadSchemes,
+      DynamicMap<DownloadCommand> downloadCommands,
+      WebLinks webLinks,
+      ActionJson actionJson,
+      GpgApiAdapter gpgApi,
+      ChangeResource.Factory changeResourceFactory,
+      ChangeKindCache changeKindCache,
+      GitRepositoryManager repoManager,
+      PermissionBackend permissionBackend,
+      ChangeNotes.Factory notesFactory,
+      @Assisted Iterable<ListChangesOption> options) {
+    this.userProvider = userProvider;
+    this.anonymous = anonymous;
+    this.projectCache = projectCache;
+    this.userFactory = userFactory;
+    this.mergeUtilFactory = mergeUtilFactory;
+    this.fileInfoJson = fileInfoJson;
+    this.accountLoaderFactory = accountLoaderFactory;
+    this.downloadSchemes = downloadSchemes;
+    this.downloadCommands = downloadCommands;
+    this.webLinks = webLinks;
+    this.actionJson = actionJson;
+    this.gpgApi = gpgApi;
+    this.changeResourceFactory = changeResourceFactory;
+    this.changeKindCache = changeKindCache;
+    this.permissionBackend = permissionBackend;
+    this.notesFactory = notesFactory;
+    this.repoManager = repoManager;
+    this.options = ImmutableSet.copyOf(options);
+    this.lazyLoad = containsAnyOf(this.options, ChangeJson.REQUIRE_LAZY_LOAD);
+  }
+
+  /**
+   * Returns a {@link RevisionInfo} based on a change and patch set. Reads from the repository
+   * depending on the options provided when constructing this instance.
+   */
+  public RevisionInfo getRevisionInfo(ChangeData cd, PatchSet in)
+      throws PatchListNotAvailableException, GpgException, OrmException, IOException,
+          PermissionBackendException {
+    AccountLoader accountLoader = accountLoaderFactory.create(has(DETAILED_ACCOUNTS));
+    try (Repository repo = openRepoIfNecessary(cd.project());
+        RevWalk rw = newRevWalk(repo)) {
+      RevisionInfo rev = toRevisionInfo(accountLoader, cd, in, repo, rw, true, null);
+      accountLoader.fill();
+      return rev;
+    }
+  }
+
+  /**
+   * Returns a {@link CommitInfo} based on a commit and formatting options. Uses the provided
+   * RevWalk and assumes it is backed by an open repository.
+   */
+  public CommitInfo getCommitInfo(
+      Project.NameKey project, RevWalk rw, RevCommit commit, boolean addLinks, boolean fillCommit)
+      throws IOException {
+    CommitInfo info = new CommitInfo();
+    if (fillCommit) {
+      info.commit = commit.name();
+    }
+    info.parents = new ArrayList<>(commit.getParentCount());
+    info.author = toGitPerson(commit.getAuthorIdent());
+    info.committer = toGitPerson(commit.getCommitterIdent());
+    info.subject = commit.getShortMessage();
+    info.message = commit.getFullMessage();
+
+    if (addLinks) {
+      List<WebLinkInfo> links = webLinks.getPatchSetLinks(project, commit.name());
+      info.webLinks = links.isEmpty() ? null : links;
+    }
+
+    for (RevCommit parent : commit.getParents()) {
+      rw.parseBody(parent);
+      CommitInfo i = new CommitInfo();
+      i.commit = parent.name();
+      i.subject = parent.getShortMessage();
+      if (addLinks) {
+        List<WebLinkInfo> parentLinks = webLinks.getParentLinks(project, parent.name());
+        i.webLinks = parentLinks.isEmpty() ? null : parentLinks;
+      }
+      info.parents.add(i);
+    }
+    return info;
+  }
+
+  /**
+   * Returns multiple {@link RevisionInfo}s for a single change. Uses the provided {@link
+   * AccountLoader} to lazily populate accounts. Callers have to call {@link AccountLoader#fill()}
+   * afterwards to populate all accounts in the returned {@link RevisionInfo}s.
+   */
+  Map<String, RevisionInfo> getRevisions(
+      AccountLoader accountLoader,
+      ChangeData cd,
+      Map<PatchSet.Id, PatchSet> map,
+      Optional<Id> limitToPsId,
+      ChangeInfo changeInfo)
+      throws PatchListNotAvailableException, GpgException, OrmException, IOException,
+          PermissionBackendException {
+    Map<String, RevisionInfo> res = new LinkedHashMap<>();
+    try (Repository repo = openRepoIfNecessary(cd.project());
+        RevWalk rw = newRevWalk(repo)) {
+      for (PatchSet in : map.values()) {
+        PatchSet.Id id = in.getId();
+        boolean want;
+        if (has(ALL_REVISIONS)) {
+          want = true;
+        } else if (limitToPsId.isPresent()) {
+          want = id.equals(limitToPsId.get());
+        } else {
+          want = id.equals(cd.change().currentPatchSetId());
+        }
+        if (want) {
+          res.put(
+              in.getRevision().get(),
+              toRevisionInfo(accountLoader, cd, in, repo, rw, false, changeInfo));
+        }
+      }
+      return res;
+    }
+  }
+
+  private Map<String, FetchInfo> makeFetchMap(ChangeData cd, PatchSet in)
+      throws PermissionBackendException, OrmException, IOException {
+    Map<String, FetchInfo> r = new LinkedHashMap<>();
+    for (Extension<DownloadScheme> e : downloadSchemes) {
+      String schemeName = e.getExportName();
+      DownloadScheme scheme = e.getProvider().get();
+      if (!scheme.isEnabled()
+          || (scheme.isAuthRequired() && !userProvider.get().isIdentifiedUser())) {
+        continue;
+      }
+      if (!scheme.isAuthSupported() && !isWorldReadable(cd)) {
+        continue;
+      }
+
+      String projectName = cd.project().get();
+      String url = scheme.getUrl(projectName);
+      String refName = in.getRefName();
+      FetchInfo fetchInfo = new FetchInfo(url, refName);
+      r.put(schemeName, fetchInfo);
+
+      if (has(DOWNLOAD_COMMANDS)) {
+        DownloadCommandsJson.populateFetchMap(
+            scheme, downloadCommands, projectName, refName, fetchInfo);
+      }
+    }
+
+    return r;
+  }
+
+  private RevisionInfo toRevisionInfo(
+      AccountLoader accountLoader,
+      ChangeData cd,
+      PatchSet in,
+      @Nullable Repository repo,
+      @Nullable RevWalk rw,
+      boolean fillCommit,
+      @Nullable ChangeInfo changeInfo)
+      throws PatchListNotAvailableException, GpgException, OrmException, IOException,
+          PermissionBackendException {
+    Change c = cd.change();
+    RevisionInfo out = new RevisionInfo();
+    out.isCurrent = in.getId().equals(c.currentPatchSetId());
+    out._number = in.getId().get();
+    out.ref = in.getRefName();
+    out.created = in.getCreatedOn();
+    out.uploader = accountLoader.get(in.getUploader());
+    out.fetch = makeFetchMap(cd, in);
+    out.kind = changeKindCache.getChangeKind(rw, repo != null ? repo.getConfig() : null, cd, in);
+    out.description = in.getDescription();
+
+    boolean setCommit = has(ALL_COMMITS) || (out.isCurrent && has(CURRENT_COMMIT));
+    boolean addFooters = out.isCurrent && has(COMMIT_FOOTERS);
+    if (setCommit || addFooters) {
+      checkState(rw != null);
+      checkState(repo != null);
+      Project.NameKey project = c.getProject();
+      String rev = in.getRevision().get();
+      RevCommit commit = rw.parseCommit(ObjectId.fromString(rev));
+      rw.parseBody(commit);
+      if (setCommit) {
+        out.commit = getCommitInfo(project, rw, commit, has(WEB_LINKS), fillCommit);
+      }
+      if (addFooters) {
+        Ref ref = repo.exactRef(cd.change().getDest().get());
+        RevCommit mergeTip = null;
+        if (ref != null) {
+          mergeTip = rw.parseCommit(ref.getObjectId());
+          rw.parseBody(mergeTip);
+        }
+        out.commitWithFooters =
+            mergeUtilFactory
+                .create(projectCache.get(project))
+                .createCommitMessageOnSubmit(commit, mergeTip, cd.notes(), in.getId());
+      }
+    }
+
+    if (has(ALL_FILES) || (out.isCurrent && has(CURRENT_FILES))) {
+      out.files = fileInfoJson.toFileInfoMap(c, in);
+      out.files.remove(Patch.COMMIT_MSG);
+      out.files.remove(Patch.MERGE_LIST);
+    }
+
+    if (out.isCurrent && has(CURRENT_ACTIONS) && userProvider.get().isIdentifiedUser()) {
+      actionJson.addRevisionActions(
+          changeInfo,
+          out,
+          new RevisionResource(changeResourceFactory.create(cd.notes(), userProvider.get()), in));
+    }
+
+    if (gpgApi.isEnabled() && has(PUSH_CERTIFICATES)) {
+      if (in.getPushCertificate() != null) {
+        out.pushCertificate =
+            gpgApi.checkPushCertificate(
+                in.getPushCertificate(), userFactory.create(in.getUploader()));
+      } else {
+        out.pushCertificate = new PushCertificateInfo();
+      }
+    }
+
+    return out;
+  }
+
+  private boolean has(ListChangesOption option) {
+    return options.contains(option);
+  }
+
+  /**
+   * @return {@link com.google.gerrit.server.permissions.PermissionBackend.ForChange} constructed
+   *     from either an index-backed or a database-backed {@link ChangeData} depending on {@code
+   *     lazyload}.
+   */
+  private PermissionBackend.ForChange permissionBackendForChange(
+      PermissionBackend.WithUser withUser, ChangeData cd) throws OrmException {
+    return lazyLoad
+        ? withUser.change(cd)
+        : withUser.indexedChange(cd, notesFactory.createFromIndexedChange(cd.change()));
+  }
+
+  private boolean isWorldReadable(ChangeData cd)
+      throws OrmException, PermissionBackendException, IOException {
+    try {
+      permissionBackendForChange(permissionBackend.user(anonymous), cd)
+          .check(ChangePermission.READ);
+    } catch (AuthException ae) {
+      return false;
+    }
+    ProjectState projectState = projectCache.checkedGet(cd.project());
+    if (projectState == null) {
+      logger.atSevere().log("project state for project %s is null", cd.project());
+      return false;
+    }
+    return projectState.statePermitsRead();
+  }
+
+  @Nullable
+  private Repository openRepoIfNecessary(Project.NameKey project) throws IOException {
+    if (has(ALL_COMMITS) || has(CURRENT_COMMIT) || has(COMMIT_FOOTERS)) {
+      return repoManager.openRepository(project);
+    }
+    return null;
+  }
+
+  @Nullable
+  private RevWalk newRevWalk(@Nullable Repository repo) {
+    return repo != null ? new RevWalk(repo) : null;
+  }
+
+  private static boolean containsAnyOf(
+      ImmutableSet<ListChangesOption> set, ImmutableSet<ListChangesOption> toFind) {
+    return !Sets.intersection(toFind, set).isEmpty();
+  }
+}
diff --git a/java/com/google/gerrit/server/change/RevisionResource.java b/java/com/google/gerrit/server/change/RevisionResource.java
new file mode 100644
index 0000000..deb5022
--- /dev/null
+++ b/java/com/google/gerrit/server/change/RevisionResource.java
@@ -0,0 +1,127 @@
+// Copyright (C) 2012 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.google.gerrit.server.change;
+
+import com.google.common.hash.Hasher;
+import com.google.common.hash.Hashing;
+import com.google.gerrit.extensions.restapi.RestResource;
+import com.google.gerrit.extensions.restapi.RestResource.HasETag;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.edit.ChangeEdit;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.inject.TypeLiteral;
+import java.util.Optional;
+
+public class RevisionResource implements RestResource, HasETag {
+  public static final TypeLiteral<RestView<RevisionResource>> REVISION_KIND =
+      new TypeLiteral<RestView<RevisionResource>>() {};
+
+  public static RevisionResource createNonCachable(ChangeResource change, PatchSet ps) {
+    return new RevisionResource(change, ps, Optional.empty(), false);
+  }
+
+  private final ChangeResource change;
+  private final PatchSet ps;
+  private final Optional<ChangeEdit> edit;
+  private final boolean cacheable;
+
+  public RevisionResource(ChangeResource change, PatchSet ps) {
+    this(change, ps, Optional.empty());
+  }
+
+  public RevisionResource(ChangeResource change, PatchSet ps, Optional<ChangeEdit> edit) {
+    this(change, ps, edit, true);
+  }
+
+  private RevisionResource(
+      ChangeResource change, PatchSet ps, Optional<ChangeEdit> edit, boolean cachable) {
+    this.change = change;
+    this.ps = ps;
+    this.edit = edit;
+    this.cacheable = cachable;
+  }
+
+  public boolean isCacheable() {
+    return cacheable;
+  }
+
+  public PermissionBackend.ForChange permissions() {
+    return change.permissions();
+  }
+
+  public ChangeResource getChangeResource() {
+    return change;
+  }
+
+  public Change getChange() {
+    return getChangeResource().getChange();
+  }
+
+  public Project.NameKey getProject() {
+    return getChange().getProject();
+  }
+
+  public ChangeNotes getNotes() {
+    return getChangeResource().getNotes();
+  }
+
+  public PatchSet getPatchSet() {
+    return ps;
+  }
+
+  @Override
+  public String getETag() {
+    Hasher h = Hashing.murmur3_128().newHasher();
+    prepareETag(h, getUser());
+    return h.hash().toString();
+  }
+
+  public void prepareETag(Hasher h, CurrentUser user) {
+    // Conservative estimate: refresh the revision if its parent change has changed, so we don't
+    // have to check whether a given modification affected this revision specifically.
+    change.prepareETag(h, user);
+  }
+
+  public Account.Id getAccountId() {
+    return getUser().getAccountId();
+  }
+
+  public CurrentUser getUser() {
+    return getChangeResource().getUser();
+  }
+
+  public Optional<ChangeEdit> getEdit() {
+    return edit;
+  }
+
+  @Override
+  public String toString() {
+    String s = ps.getId().toString();
+    if (edit.isPresent()) {
+      s = "edit:" + s;
+    }
+    return s;
+  }
+
+  public boolean isCurrent() {
+    return ps.getId().equals(getChange().currentPatchSetId());
+  }
+}
diff --git a/java/com/google/gerrit/server/change/RobotCommentResource.java b/java/com/google/gerrit/server/change/RobotCommentResource.java
new file mode 100644
index 0000000..c4fab58
--- /dev/null
+++ b/java/com/google/gerrit/server/change/RobotCommentResource.java
@@ -0,0 +1,51 @@
+// Copyright (C) 2017 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.google.gerrit.server.change;
+
+import com.google.gerrit.extensions.restapi.RestResource;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.RobotComment;
+import com.google.inject.TypeLiteral;
+
+public class RobotCommentResource implements RestResource {
+  public static final TypeLiteral<RestView<RobotCommentResource>> ROBOT_COMMENT_KIND =
+      new TypeLiteral<RestView<RobotCommentResource>>() {};
+
+  private final RevisionResource rev;
+  private final RobotComment comment;
+
+  public RobotCommentResource(RevisionResource rev, RobotComment c) {
+    this.rev = rev;
+    this.comment = c;
+  }
+
+  public PatchSet getPatchSet() {
+    return rev.getPatchSet();
+  }
+
+  public RobotComment getComment() {
+    return comment;
+  }
+
+  public String getId() {
+    return comment.key.uuid;
+  }
+
+  public Account.Id getAuthorId() {
+    return comment.author.getId();
+  }
+}
diff --git a/java/com/google/gerrit/server/change/SetAssigneeOp.java b/java/com/google/gerrit/server/change/SetAssigneeOp.java
new file mode 100644
index 0000000..f61e95f
--- /dev/null
+++ b/java/com/google/gerrit/server/change/SetAssigneeOp.java
@@ -0,0 +1,134 @@
+// 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.
+
+package com.google.gerrit.server.change;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.extensions.events.AssigneeChanged;
+import com.google.gerrit.server.mail.send.SetAssigneeSender;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.Context;
+import com.google.gerrit.server.validators.AssigneeValidationListener;
+import com.google.gerrit.server.validators.ValidationException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.Assisted;
+
+public class SetAssigneeOp implements BatchUpdateOp {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public interface Factory {
+    SetAssigneeOp create(IdentifiedUser assignee);
+  }
+
+  private final ChangeMessagesUtil cmUtil;
+  private final PluginSetContext<AssigneeValidationListener> validationListeners;
+  private final IdentifiedUser newAssignee;
+  private final AssigneeChanged assigneeChanged;
+  private final SetAssigneeSender.Factory setAssigneeSenderFactory;
+  private final Provider<IdentifiedUser> user;
+  private final IdentifiedUser.GenericFactory userFactory;
+
+  private Change change;
+  private IdentifiedUser oldAssignee;
+
+  @Inject
+  SetAssigneeOp(
+      ChangeMessagesUtil cmUtil,
+      PluginSetContext<AssigneeValidationListener> validationListeners,
+      AssigneeChanged assigneeChanged,
+      SetAssigneeSender.Factory setAssigneeSenderFactory,
+      Provider<IdentifiedUser> user,
+      IdentifiedUser.GenericFactory userFactory,
+      @Assisted IdentifiedUser newAssignee) {
+    this.cmUtil = cmUtil;
+    this.validationListeners = validationListeners;
+    this.assigneeChanged = assigneeChanged;
+    this.setAssigneeSenderFactory = setAssigneeSenderFactory;
+    this.user = user;
+    this.userFactory = userFactory;
+    this.newAssignee = requireNonNull(newAssignee, "assignee");
+  }
+
+  @Override
+  public boolean updateChange(ChangeContext ctx) throws OrmException, RestApiException {
+    change = ctx.getChange();
+    if (newAssignee.getAccountId().equals(change.getAssignee())) {
+      return false;
+    }
+    try {
+      validationListeners.runEach(
+          l -> l.validateAssignee(change, newAssignee.getAccount()), ValidationException.class);
+    } catch (ValidationException e) {
+      throw new ResourceConflictException(e.getMessage(), e);
+    }
+
+    if (change.getAssignee() != null) {
+      oldAssignee = userFactory.create(change.getAssignee());
+    }
+
+    ChangeUpdate update = ctx.getUpdate(change.currentPatchSetId());
+    // notedb
+    update.setAssignee(newAssignee.getAccountId());
+    // reviewdb
+    change.setAssignee(newAssignee.getAccountId());
+    addMessage(ctx, update);
+    return true;
+  }
+
+  private void addMessage(ChangeContext ctx, ChangeUpdate update) throws OrmException {
+    StringBuilder msg = new StringBuilder();
+    msg.append("Assignee ");
+    if (oldAssignee == null) {
+      msg.append("added: ");
+      msg.append(newAssignee.getNameEmail());
+    } else {
+      msg.append("changed from: ");
+      msg.append(oldAssignee.getNameEmail());
+      msg.append(" to: ");
+      msg.append(newAssignee.getNameEmail());
+    }
+    ChangeMessage cmsg =
+        ChangeMessagesUtil.newMessage(ctx, msg.toString(), ChangeMessagesUtil.TAG_SET_ASSIGNEE);
+    cmUtil.addChangeMessage(ctx.getDb(), update, cmsg);
+  }
+
+  @Override
+  public void postUpdate(Context ctx) throws OrmException {
+    try {
+      SetAssigneeSender cm =
+          setAssigneeSenderFactory.create(
+              change.getProject(), change.getId(), newAssignee.getAccountId());
+      cm.setFrom(user.get().getAccountId());
+      cm.send();
+    } catch (Exception err) {
+      logger.atSevere().withCause(err).log(
+          "Cannot send email to new assignee of change %s", change.getId());
+    }
+    assigneeChanged.fire(
+        change, ctx.getAccount(), oldAssignee != null ? oldAssignee.state() : null, ctx.getWhen());
+  }
+}
diff --git a/java/com/google/gerrit/server/change/SetHashtagsOp.java b/java/com/google/gerrit/server/change/SetHashtagsOp.java
new file mode 100644
index 0000000..d11b2df
--- /dev/null
+++ b/java/com/google/gerrit/server/change/SetHashtagsOp.java
@@ -0,0 +1,175 @@
+// Copyright (C) 2015 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.google.gerrit.server.change;
+
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.gerrit.server.change.HashtagsUtil.extractTags;
+
+import com.google.common.base.Joiner;
+import com.google.common.collect.ImmutableSortedSet;
+import com.google.common.collect.Ordering;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.api.changes.HashtagsInput;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.change.HashtagsUtil.InvalidHashtagException;
+import com.google.gerrit.server.extensions.events.HashtagsEdited;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.Context;
+import com.google.gerrit.server.validators.HashtagValidationListener;
+import com.google.gerrit.server.validators.ValidationException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+public class SetHashtagsOp implements BatchUpdateOp {
+  public interface Factory {
+    SetHashtagsOp create(HashtagsInput input);
+  }
+
+  private final NotesMigration notesMigration;
+  private final ChangeMessagesUtil cmUtil;
+  private final PluginSetContext<HashtagValidationListener> validationListeners;
+  private final HashtagsEdited hashtagsEdited;
+  private final HashtagsInput input;
+
+  private boolean fireEvent = true;
+
+  private Change change;
+  private Set<String> toAdd;
+  private Set<String> toRemove;
+  private ImmutableSortedSet<String> updatedHashtags;
+
+  @Inject
+  SetHashtagsOp(
+      NotesMigration notesMigration,
+      ChangeMessagesUtil cmUtil,
+      PluginSetContext<HashtagValidationListener> validationListeners,
+      HashtagsEdited hashtagsEdited,
+      @Assisted @Nullable HashtagsInput input) {
+    this.notesMigration = notesMigration;
+    this.cmUtil = cmUtil;
+    this.validationListeners = validationListeners;
+    this.hashtagsEdited = hashtagsEdited;
+    this.input = input;
+  }
+
+  public SetHashtagsOp setFireEvent(boolean fireEvent) {
+    this.fireEvent = fireEvent;
+    return this;
+  }
+
+  @Override
+  public boolean updateChange(ChangeContext ctx)
+      throws AuthException, BadRequestException, MethodNotAllowedException, OrmException,
+          IOException {
+    if (!notesMigration.readChanges()) {
+      throw new MethodNotAllowedException("Cannot add hashtags; NoteDb is disabled");
+    }
+    if (input == null || (input.add == null && input.remove == null)) {
+      updatedHashtags = ImmutableSortedSet.of();
+      return false;
+    }
+
+    change = ctx.getChange();
+    ChangeUpdate update = ctx.getUpdate(change.currentPatchSetId());
+    ChangeNotes notes = update.getNotes().load();
+
+    try {
+      Set<String> existingHashtags = notes.getHashtags();
+      Set<String> updated = new HashSet<>();
+      toAdd = new HashSet<>(extractTags(input.add));
+      toRemove = new HashSet<>(extractTags(input.remove));
+
+      validationListeners.runEach(
+          l -> l.validateHashtags(update.getChange(), toAdd, toRemove), ValidationException.class);
+      updated.addAll(existingHashtags);
+      toAdd.removeAll(existingHashtags);
+      toRemove.retainAll(existingHashtags);
+      if (updated()) {
+        updated.addAll(toAdd);
+        updated.removeAll(toRemove);
+        update.setHashtags(updated);
+        addMessage(ctx, update);
+      }
+
+      updatedHashtags = ImmutableSortedSet.copyOf(updated);
+      return true;
+    } catch (ValidationException | InvalidHashtagException e) {
+      throw new BadRequestException(e.getMessage(), e);
+    }
+  }
+
+  private void addMessage(ChangeContext ctx, ChangeUpdate update) throws OrmException {
+    StringBuilder msg = new StringBuilder();
+    appendHashtagMessage(msg, "added", toAdd);
+    appendHashtagMessage(msg, "removed", toRemove);
+    ChangeMessage cmsg =
+        ChangeMessagesUtil.newMessage(ctx, msg.toString(), ChangeMessagesUtil.TAG_SET_HASHTAGS);
+    cmUtil.addChangeMessage(ctx.getDb(), update, cmsg);
+  }
+
+  private void appendHashtagMessage(StringBuilder b, String action, Set<String> hashtags) {
+    if (isNullOrEmpty(hashtags)) {
+      return;
+    }
+
+    if (b.length() > 0) {
+      b.append("\n");
+    }
+    b.append("Hashtag");
+    if (hashtags.size() > 1) {
+      b.append("s");
+    }
+    b.append(" ");
+    b.append(action);
+    b.append(": ");
+    b.append(Joiner.on(", ").join(Ordering.natural().sortedCopy(hashtags)));
+  }
+
+  @Override
+  public void postUpdate(Context ctx) throws OrmException {
+    if (updated() && fireEvent) {
+      hashtagsEdited.fire(
+          change, ctx.getAccount(), updatedHashtags, toAdd, toRemove, ctx.getWhen());
+    }
+  }
+
+  public ImmutableSortedSet<String> getUpdatedHashtags() {
+    checkState(updatedHashtags != null, "getUpdatedHashtags() only valid after executing op");
+    return updatedHashtags;
+  }
+
+  private boolean updated() {
+    return !isNullOrEmpty(toAdd) || !isNullOrEmpty(toRemove);
+  }
+
+  private static boolean isNullOrEmpty(Collection<?> coll) {
+    return coll == null || coll.isEmpty();
+  }
+}
diff --git a/java/com/google/gerrit/server/change/SetPrivateOp.java b/java/com/google/gerrit/server/change/SetPrivateOp.java
new file mode 100644
index 0000000..b7f444c
--- /dev/null
+++ b/java/com/google/gerrit/server/change/SetPrivateOp.java
@@ -0,0 +1,110 @@
+// Copyright (C) 2017 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.google.gerrit.server.change;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.extensions.events.PrivateStateChanged;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.Context;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+
+public class SetPrivateOp implements BatchUpdateOp {
+  public static class Input {
+    String message;
+
+    public Input() {}
+
+    public Input(String message) {
+      this.message = message;
+    }
+  }
+
+  public interface Factory {
+    SetPrivateOp create(ChangeMessagesUtil cmUtil, boolean isPrivate, @Nullable Input input);
+  }
+
+  private final PrivateStateChanged privateStateChanged;
+  private final PatchSetUtil psUtil;
+  private final ChangeMessagesUtil cmUtil;
+  private final boolean isPrivate;
+  @Nullable private final Input input;
+
+  private Change change;
+  private PatchSet ps;
+
+  @Inject
+  SetPrivateOp(
+      PrivateStateChanged privateStateChanged,
+      PatchSetUtil psUtil,
+      @Assisted ChangeMessagesUtil cmUtil,
+      @Assisted boolean isPrivate,
+      @Assisted @Nullable Input input) {
+    this.privateStateChanged = privateStateChanged;
+    this.psUtil = psUtil;
+    this.cmUtil = cmUtil;
+    this.isPrivate = isPrivate;
+    this.input = input;
+  }
+
+  @Override
+  public boolean updateChange(ChangeContext ctx) throws ResourceConflictException, OrmException {
+    change = ctx.getChange();
+    ChangeNotes notes = ctx.getNotes();
+    ps = psUtil.get(ctx.getDb(), notes, change.currentPatchSetId());
+    ChangeUpdate update = ctx.getUpdate(change.currentPatchSetId());
+    change.setPrivate(isPrivate);
+    change.setLastUpdatedOn(ctx.getWhen());
+    update.setPrivate(isPrivate);
+    addMessage(ctx, update);
+    return true;
+  }
+
+  @Override
+  public void postUpdate(Context ctx) {
+    privateStateChanged.fire(change, ps, ctx.getAccount(), ctx.getWhen());
+  }
+
+  private void addMessage(ChangeContext ctx, ChangeUpdate update) throws OrmException {
+    Change c = ctx.getChange();
+    StringBuilder buf = new StringBuilder(c.isPrivate() ? "Set private" : "Unset private");
+
+    String m = Strings.nullToEmpty(input == null ? null : input.message).trim();
+    if (!m.isEmpty()) {
+      buf.append("\n\n");
+      buf.append(m);
+    }
+
+    ChangeMessage cmsg =
+        ChangeMessagesUtil.newMessage(
+            ctx,
+            buf.toString(),
+            c.isPrivate()
+                ? ChangeMessagesUtil.TAG_SET_PRIVATE
+                : ChangeMessagesUtil.TAG_UNSET_PRIVATE);
+    cmUtil.addChangeMessage(ctx.getDb(), update, cmsg);
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/SuggestedReviewer.java b/java/com/google/gerrit/server/change/SuggestedReviewer.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/change/SuggestedReviewer.java
rename to java/com/google/gerrit/server/change/SuggestedReviewer.java
diff --git a/java/com/google/gerrit/server/change/TestSubmitInput.java b/java/com/google/gerrit/server/change/TestSubmitInput.java
new file mode 100644
index 0000000..b681bf8
--- /dev/null
+++ b/java/com/google/gerrit/server/change/TestSubmitInput.java
@@ -0,0 +1,20 @@
+package com.google.gerrit.server.change;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.gerrit.extensions.api.changes.SubmitInput;
+import java.util.Queue;
+
+/**
+ * Subclass of {@link SubmitInput} with special bits that may be flipped for testing purposes only.
+ */
+@VisibleForTesting
+public class TestSubmitInput extends SubmitInput {
+  public boolean failAfterRefUpdates;
+
+  /**
+   * For each change being submitted, an element is removed from this queue and, if the value is
+   * true, a bogus ref update is added to the batch, in order to generate a lock failure during
+   * execution.
+   */
+  public Queue<Boolean> generateLockFailures;
+}
diff --git a/java/com/google/gerrit/server/change/VoteResource.java b/java/com/google/gerrit/server/change/VoteResource.java
new file mode 100644
index 0000000..27b5bec
--- /dev/null
+++ b/java/com/google/gerrit/server/change/VoteResource.java
@@ -0,0 +1,40 @@
+// Copyright (C) 2017 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.google.gerrit.server.change;
+
+import com.google.gerrit.extensions.restapi.RestResource;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.inject.TypeLiteral;
+
+public class VoteResource implements RestResource {
+  public static final TypeLiteral<RestView<VoteResource>> VOTE_KIND =
+      new TypeLiteral<RestView<VoteResource>>() {};
+
+  private final ReviewerResource reviewer;
+  private final String label;
+
+  public VoteResource(ReviewerResource reviewer, String label) {
+    this.reviewer = reviewer;
+    this.label = label;
+  }
+
+  public ReviewerResource getReviewer() {
+    return reviewer;
+  }
+
+  public String getLabel() {
+    return label;
+  }
+}
diff --git a/java/com/google/gerrit/server/change/WalkSorter.java b/java/com/google/gerrit/server/change/WalkSorter.java
new file mode 100644
index 0000000..916a62b
--- /dev/null
+++ b/java/com/google/gerrit/server/change/WalkSorter.java
@@ -0,0 +1,268 @@
+// Copyright (C) 2015 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.google.gerrit.server.change;
+
+import static com.google.common.base.Preconditions.checkState;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.collect.Ordering;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Deque;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.jgit.errors.IncorrectObjectTypeException;
+import org.eclipse.jgit.errors.MissingObjectException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevFlag;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+/**
+ * Helper to sort {@link ChangeData}s based on {@link RevWalk} ordering.
+ *
+ * <p>Split changes by project, and map each change to a single commit based on the latest patch
+ * set. The set of patch sets considered may be limited by calling {@link
+ * #includePatchSets(Iterable)}. Perform a standard {@link RevWalk} on each project repository, do
+ * an approximate topo sort, and record the order in which each change's commit is seen.
+ *
+ * <p>Once an order within each project is determined, groups of changes are sorted based on the
+ * project name. This is slightly more stable than sorting on something like the commit or change
+ * timestamp, as it will not unexpectedly reorder large groups of changes on subsequent calls if one
+ * of the changes was updated.
+ */
+public class WalkSorter {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final Ordering<List<PatchSetData>> PROJECT_LIST_SORTER =
+      Ordering.natural()
+          .nullsFirst()
+          .onResultOf(
+              (List<PatchSetData> in) -> {
+                if (in == null || in.isEmpty()) {
+                  return null;
+                }
+                try {
+                  return in.get(0).data().change().getProject();
+                } catch (OrmException e) {
+                  throw new IllegalStateException(e);
+                }
+              });
+
+  private final GitRepositoryManager repoManager;
+  private final Set<PatchSet.Id> includePatchSets;
+  private boolean retainBody;
+
+  @Inject
+  WalkSorter(GitRepositoryManager repoManager) {
+    this.repoManager = repoManager;
+    includePatchSets = new HashSet<>();
+  }
+
+  public WalkSorter includePatchSets(Iterable<PatchSet.Id> patchSets) {
+    Iterables.addAll(includePatchSets, patchSets);
+    return this;
+  }
+
+  public WalkSorter setRetainBody(boolean retainBody) {
+    this.retainBody = retainBody;
+    return this;
+  }
+
+  public Iterable<PatchSetData> sort(Iterable<ChangeData> in) throws OrmException, IOException {
+    ListMultimap<Project.NameKey, ChangeData> byProject =
+        MultimapBuilder.hashKeys().arrayListValues().build();
+    for (ChangeData cd : in) {
+      byProject.put(cd.change().getProject(), cd);
+    }
+
+    List<List<PatchSetData>> sortedByProject = new ArrayList<>(byProject.keySet().size());
+    for (Map.Entry<Project.NameKey, Collection<ChangeData>> e : byProject.asMap().entrySet()) {
+      sortedByProject.add(sortProject(e.getKey(), e.getValue()));
+    }
+    sortedByProject.sort(PROJECT_LIST_SORTER);
+    return Iterables.concat(sortedByProject);
+  }
+
+  private List<PatchSetData> sortProject(Project.NameKey project, Collection<ChangeData> in)
+      throws OrmException, IOException {
+    try (Repository repo = repoManager.openRepository(project);
+        RevWalk rw = new RevWalk(repo)) {
+      rw.setRetainBody(retainBody);
+      ListMultimap<RevCommit, PatchSetData> byCommit = byCommit(rw, in);
+      if (byCommit.isEmpty()) {
+        return ImmutableList.of();
+      } else if (byCommit.size() == 1) {
+        return ImmutableList.of(byCommit.values().iterator().next());
+      }
+
+      // Walk from all patch set SHA-1s, and terminate as soon as we've found
+      // everything we're looking for. This is equivalent to just sorting the
+      // list of commits by the RevWalk's configured order.
+      //
+      // Partially topo sort the list, ensuring no parent is emitted before a
+      // direct child that is also in the input set. This preserves the stable,
+      // expected sort in the case where many commits share the same timestamp,
+      // e.g. a quick rebase. It also avoids JGit's topo sort, which slurps all
+      // interesting commits at the beginning, which is a problem since we don't
+      // know which commits to mark as uninteresting. Finding a reasonable set
+      // of commits to mark uninteresting (the "rootmost" set) is at least as
+      // difficult as just implementing this partial topo sort ourselves.
+      //
+      // (This is slightly less efficient than JGit's topo sort, which uses a
+      // private in-degree field in RevCommit rather than multimaps. We assume
+      // the input size is small enough that this is not an issue.)
+
+      Set<RevCommit> commits = byCommit.keySet();
+      ListMultimap<RevCommit, RevCommit> children = collectChildren(commits);
+      ListMultimap<RevCommit, RevCommit> pending =
+          MultimapBuilder.hashKeys().arrayListValues().build();
+      Deque<RevCommit> todo = new ArrayDeque<>();
+
+      RevFlag done = rw.newFlag("done");
+      markStart(rw, commits);
+      int expected = commits.size();
+      int found = 0;
+      RevCommit c;
+      List<PatchSetData> result = new ArrayList<>(expected);
+      while (found < expected && (c = rw.next()) != null) {
+        if (!commits.contains(c)) {
+          continue;
+        }
+        todo.clear();
+        todo.add(c);
+        int i = 0;
+        while (!todo.isEmpty()) {
+          // Sanity check: we can't pop more than N pending commits, otherwise
+          // we have an infinite loop due to programmer error or something.
+          checkState(++i <= commits.size(), "Too many pending steps while sorting %s", commits);
+          RevCommit t = todo.removeFirst();
+          if (t.has(done)) {
+            continue;
+          }
+          boolean ready = true;
+          for (RevCommit child : children.get(t)) {
+            if (!child.has(done)) {
+              pending.put(child, t);
+              ready = false;
+            }
+          }
+          if (ready) {
+            found += emit(t, byCommit, result, done);
+            todo.addAll(pending.get(t));
+          }
+        }
+      }
+      return result;
+    }
+  }
+
+  private static ListMultimap<RevCommit, RevCommit> collectChildren(Set<RevCommit> commits) {
+    ListMultimap<RevCommit, RevCommit> children =
+        MultimapBuilder.hashKeys().arrayListValues().build();
+    for (RevCommit c : commits) {
+      for (RevCommit p : c.getParents()) {
+        if (commits.contains(p)) {
+          children.put(p, c);
+        }
+      }
+    }
+    return children;
+  }
+
+  private static int emit(
+      RevCommit c,
+      ListMultimap<RevCommit, PatchSetData> byCommit,
+      List<PatchSetData> result,
+      RevFlag done) {
+    if (c.has(done)) {
+      return 0;
+    }
+    c.add(done);
+    Collection<PatchSetData> psds = byCommit.get(c);
+    if (!psds.isEmpty()) {
+      result.addAll(psds);
+      return 1;
+    }
+    return 0;
+  }
+
+  private ListMultimap<RevCommit, PatchSetData> byCommit(RevWalk rw, Collection<ChangeData> in)
+      throws OrmException, IOException {
+    ListMultimap<RevCommit, PatchSetData> byCommit =
+        MultimapBuilder.hashKeys(in.size()).arrayListValues(1).build();
+    for (ChangeData cd : in) {
+      PatchSet maxPs = null;
+      for (PatchSet ps : cd.patchSets()) {
+        if (shouldInclude(ps) && (maxPs == null || ps.getId().get() > maxPs.getId().get())) {
+          maxPs = ps;
+        }
+      }
+      if (maxPs == null) {
+        continue; // No patch sets matched.
+      }
+      ObjectId id = ObjectId.fromString(maxPs.getRevision().get());
+      try {
+        RevCommit c = rw.parseCommit(id);
+        byCommit.put(c, PatchSetData.create(cd, maxPs, c));
+      } catch (MissingObjectException | IncorrectObjectTypeException e) {
+        logger.atWarning().withCause(e).log(
+            "missing commit %s for patch set %s", id.name(), maxPs.getId());
+      }
+    }
+    return byCommit;
+  }
+
+  private boolean shouldInclude(PatchSet ps) {
+    return includePatchSets.isEmpty() || includePatchSets.contains(ps.getId());
+  }
+
+  private static void markStart(RevWalk rw, Iterable<RevCommit> commits) throws IOException {
+    for (RevCommit c : commits) {
+      rw.markStart(c);
+    }
+  }
+
+  @AutoValue
+  public abstract static class PatchSetData {
+    @VisibleForTesting
+    static PatchSetData create(ChangeData cd, PatchSet ps, RevCommit commit) {
+      return new AutoValue_WalkSorter_PatchSetData(cd, ps, commit);
+    }
+
+    public abstract ChangeData data();
+
+    abstract PatchSet patchSet();
+
+    abstract RevCommit commit();
+  }
+}
diff --git a/java/com/google/gerrit/server/change/WorkInProgressOp.java b/java/com/google/gerrit/server/change/WorkInProgressOp.java
new file mode 100644
index 0000000..35b4e6e
--- /dev/null
+++ b/java/com/google/gerrit/server/change/WorkInProgressOp.java
@@ -0,0 +1,179 @@
+// Copyright (C) 2017 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.google.gerrit.server.change;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.extensions.events.WorkInProgressStateChanged;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.Context;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+
+/* Set work in progress or ready for review state on a change */
+public class WorkInProgressOp implements BatchUpdateOp {
+  public static class Input {
+    @Nullable public String message;
+
+    @Nullable public NotifyHandling notify;
+
+    public Input() {}
+
+    public Input(String message) {
+      this.message = message;
+    }
+  }
+
+  public interface Factory {
+    WorkInProgressOp create(boolean workInProgress, Input in);
+  }
+
+  public static void checkPermissions(
+      PermissionBackend permissionBackend, CurrentUser user, Change change)
+      throws PermissionBackendException, AuthException {
+    if (!user.isIdentifiedUser()) {
+      throw new AuthException("Authentication required");
+    }
+
+    if (change.getOwner().equals(user.asIdentifiedUser().getAccountId())) {
+      return;
+    }
+
+    try {
+      permissionBackend.currentUser().check(GlobalPermission.ADMINISTRATE_SERVER);
+      return;
+    } catch (AuthException e) {
+      // Skip.
+    }
+
+    try {
+      permissionBackend
+          .user(user)
+          .project(change.getProject())
+          .check(ProjectPermission.WRITE_CONFIG);
+    } catch (AuthException exp) {
+      throw new AuthException("not allowed to toggle work in progress");
+    }
+  }
+
+  private final ChangeMessagesUtil cmUtil;
+  private final EmailReviewComments.Factory email;
+  private final PatchSetUtil psUtil;
+  private final boolean workInProgress;
+  private final Input in;
+  private final NotifyHandling notify;
+  private final WorkInProgressStateChanged stateChanged;
+
+  private Change change;
+  private ChangeNotes notes;
+  private PatchSet ps;
+  private ChangeMessage cmsg;
+
+  @Inject
+  WorkInProgressOp(
+      ChangeMessagesUtil cmUtil,
+      EmailReviewComments.Factory email,
+      PatchSetUtil psUtil,
+      WorkInProgressStateChanged stateChanged,
+      @Assisted boolean workInProgress,
+      @Assisted Input in) {
+    this.cmUtil = cmUtil;
+    this.email = email;
+    this.psUtil = psUtil;
+    this.stateChanged = stateChanged;
+    this.workInProgress = workInProgress;
+    this.in = in;
+    notify =
+        MoreObjects.firstNonNull(
+            in.notify, workInProgress ? NotifyHandling.NONE : NotifyHandling.ALL);
+  }
+
+  @Override
+  public boolean updateChange(ChangeContext ctx) throws OrmException {
+    change = ctx.getChange();
+    notes = ctx.getNotes();
+    ps = psUtil.get(ctx.getDb(), ctx.getNotes(), change.currentPatchSetId());
+    ChangeUpdate update = ctx.getUpdate(change.currentPatchSetId());
+    change.setWorkInProgress(workInProgress);
+    if (!change.hasReviewStarted() && !workInProgress) {
+      change.setReviewStarted(true);
+    }
+    change.setLastUpdatedOn(ctx.getWhen());
+    update.setWorkInProgress(workInProgress);
+    addMessage(ctx, update);
+    return true;
+  }
+
+  private void addMessage(ChangeContext ctx, ChangeUpdate update) throws OrmException {
+    Change c = ctx.getChange();
+    StringBuilder buf =
+        new StringBuilder(c.isWorkInProgress() ? "Set Work In Progress" : "Set Ready For Review");
+
+    String m = Strings.nullToEmpty(in == null ? null : in.message).trim();
+    if (!m.isEmpty()) {
+      buf.append("\n\n");
+      buf.append(m);
+    }
+
+    cmsg =
+        ChangeMessagesUtil.newMessage(
+            ctx,
+            buf.toString(),
+            c.isWorkInProgress()
+                ? ChangeMessagesUtil.TAG_SET_WIP
+                : ChangeMessagesUtil.TAG_SET_READY);
+
+    cmUtil.addChangeMessage(ctx.getDb(), update, cmsg);
+  }
+
+  @Override
+  public void postUpdate(Context ctx) {
+    stateChanged.fire(change, ps, ctx.getAccount(), ctx.getWhen());
+    if (workInProgress || notify.ordinal() < NotifyHandling.OWNER_REVIEWERS.ordinal()) {
+      return;
+    }
+    email
+        .create(
+            notify,
+            ImmutableListMultimap.of(),
+            notes,
+            ps,
+            ctx.getIdentifiedUser(),
+            cmsg,
+            ImmutableList.of(),
+            cmsg.getMessage(),
+            ImmutableList.of())
+        .sendAsync();
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/AdministrateServerGroups.java b/java/com/google/gerrit/server/config/AdministrateServerGroups.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/AdministrateServerGroups.java
rename to java/com/google/gerrit/server/config/AdministrateServerGroups.java
diff --git a/java/com/google/gerrit/server/config/AdministrateServerGroupsProvider.java b/java/com/google/gerrit/server/config/AdministrateServerGroupsProvider.java
new file mode 100644
index 0000000..d6e61c4
--- /dev/null
+++ b/java/com/google/gerrit/server/config/AdministrateServerGroupsProvider.java
@@ -0,0 +1,65 @@
+// Copyright (C) 2010 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.google.gerrit.server.config;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.data.PermissionRule;
+import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.account.GroupBackends;
+import com.google.gerrit.server.util.RequestContext;
+import com.google.gerrit.server.util.ServerRequestContext;
+import com.google.gerrit.server.util.ThreadLocalRequestContext;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import org.eclipse.jgit.lib.Config;
+
+/** Loads {@link AdministrateServerGroups} from {@code gerrit.config}. */
+public class AdministrateServerGroupsProvider implements Provider<ImmutableSet<GroupReference>> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final ImmutableSet<GroupReference> groups;
+
+  @Inject
+  public AdministrateServerGroupsProvider(
+      GroupBackend groupBackend,
+      @GerritServerConfig Config config,
+      ThreadLocalRequestContext threadContext,
+      ServerRequestContext serverCtx) {
+    RequestContext ctx = threadContext.setContext(serverCtx);
+    try {
+      ImmutableSet.Builder<GroupReference> builder = ImmutableSet.builder();
+      for (String value : config.getStringList("capability", null, "administrateServer")) {
+        PermissionRule rule = PermissionRule.fromString(value, false);
+        String name = rule.getGroup().getName();
+        GroupReference g = GroupBackends.findBestSuggestion(groupBackend, name);
+        if (g != null) {
+          builder.add(g);
+        } else {
+          logger.atWarning().log("Group \"%s\" not available, skipping.", name);
+        }
+      }
+      groups = builder.build();
+    } finally {
+      threadContext.setContext(ctx);
+    }
+  }
+
+  @Override
+  public ImmutableSet<GroupReference> get() {
+    return groups;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/AllProjectsName.java b/java/com/google/gerrit/server/config/AllProjectsName.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/AllProjectsName.java
rename to java/com/google/gerrit/server/config/AllProjectsName.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/AllProjectsNameProvider.java b/java/com/google/gerrit/server/config/AllProjectsNameProvider.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/AllProjectsNameProvider.java
rename to java/com/google/gerrit/server/config/AllProjectsNameProvider.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/AllUsersName.java b/java/com/google/gerrit/server/config/AllUsersName.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/AllUsersName.java
rename to java/com/google/gerrit/server/config/AllUsersName.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/AllUsersNameProvider.java b/java/com/google/gerrit/server/config/AllUsersNameProvider.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/AllUsersNameProvider.java
rename to java/com/google/gerrit/server/config/AllUsersNameProvider.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/AnonymousCowardName.java b/java/com/google/gerrit/server/config/AnonymousCowardName.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/AnonymousCowardName.java
rename to java/com/google/gerrit/server/config/AnonymousCowardName.java
diff --git a/java/com/google/gerrit/server/config/AnonymousCowardNameProvider.java b/java/com/google/gerrit/server/config/AnonymousCowardNameProvider.java
new file mode 100644
index 0000000..6847562
--- /dev/null
+++ b/java/com/google/gerrit/server/config/AnonymousCowardNameProvider.java
@@ -0,0 +1,40 @@
+// Copyright (C) 2011 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.google.gerrit.server.config;
+
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import org.eclipse.jgit.lib.Config;
+
+public class AnonymousCowardNameProvider implements Provider<String> {
+  public static final String DEFAULT = "Name of user not set";
+
+  private final String anonymousCoward;
+
+  @Inject
+  public AnonymousCowardNameProvider(@GerritServerConfig Config cfg) {
+    String anonymousCoward = cfg.getString("user", null, "anonymousCoward");
+    if (anonymousCoward == null) {
+      anonymousCoward = DEFAULT;
+    }
+
+    this.anonymousCoward = anonymousCoward;
+  }
+
+  @Override
+  public String get() {
+    return anonymousCoward;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/AuthConfig.java b/java/com/google/gerrit/server/config/AuthConfig.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/AuthConfig.java
rename to java/com/google/gerrit/server/config/AuthConfig.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/AuthConfigModule.java b/java/com/google/gerrit/server/config/AuthConfigModule.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/AuthConfigModule.java
rename to java/com/google/gerrit/server/config/AuthConfigModule.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/AuthModule.java b/java/com/google/gerrit/server/config/AuthModule.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/AuthModule.java
rename to java/com/google/gerrit/server/config/AuthModule.java
diff --git a/java/com/google/gerrit/server/config/CacheResource.java b/java/com/google/gerrit/server/config/CacheResource.java
new file mode 100644
index 0000000..ffa7b5a
--- /dev/null
+++ b/java/com/google/gerrit/server/config/CacheResource.java
@@ -0,0 +1,61 @@
+// Copyright (C) 2014 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.google.gerrit.server.config;
+
+import com.google.common.cache.Cache;
+import com.google.gerrit.extensions.registration.PluginName;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.inject.Provider;
+import com.google.inject.TypeLiteral;
+
+public class CacheResource extends ConfigResource {
+  public static final TypeLiteral<RestView<CacheResource>> CACHE_KIND =
+      new TypeLiteral<RestView<CacheResource>>() {};
+
+  private final String name;
+  private final Provider<Cache<?, ?>> cacheProvider;
+
+  public CacheResource(String pluginName, String cacheName, Provider<Cache<?, ?>> cacheProvider) {
+    this.name = cacheNameOf(pluginName, cacheName);
+    this.cacheProvider = cacheProvider;
+  }
+
+  public CacheResource(String pluginName, String cacheName, Cache<?, ?> cache) {
+    this(
+        pluginName,
+        cacheName,
+        new Provider<Cache<?, ?>>() {
+          @Override
+          public Cache<?, ?> get() {
+            return cache;
+          }
+        });
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public Cache<?, ?> getCache() {
+    return cacheProvider.get();
+  }
+
+  public static String cacheNameOf(String plugin, String name) {
+    if (PluginName.GERRIT.equals(plugin)) {
+      return name;
+    }
+    return plugin + "-" + name;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/CanonicalWebUrl.java b/java/com/google/gerrit/server/config/CanonicalWebUrl.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/CanonicalWebUrl.java
rename to java/com/google/gerrit/server/config/CanonicalWebUrl.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/CanonicalWebUrlModule.java b/java/com/google/gerrit/server/config/CanonicalWebUrlModule.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/CanonicalWebUrlModule.java
rename to java/com/google/gerrit/server/config/CanonicalWebUrlModule.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/CanonicalWebUrlProvider.java b/java/com/google/gerrit/server/config/CanonicalWebUrlProvider.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/CanonicalWebUrlProvider.java
rename to java/com/google/gerrit/server/config/CanonicalWebUrlProvider.java
diff --git a/java/com/google/gerrit/server/config/CapabilityConstants.java b/java/com/google/gerrit/server/config/CapabilityConstants.java
new file mode 100644
index 0000000..4ab97f8
--- /dev/null
+++ b/java/com/google/gerrit/server/config/CapabilityConstants.java
@@ -0,0 +1,48 @@
+// Copyright (C) 2013 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.google.gerrit.server.config;
+
+import org.eclipse.jgit.nls.NLS;
+import org.eclipse.jgit.nls.TranslationBundle;
+
+public class CapabilityConstants extends TranslationBundle {
+  public static CapabilityConstants get() {
+    return NLS.getBundleFor(CapabilityConstants.class);
+  }
+
+  public String accessDatabase;
+  public String administrateServer;
+  public String batchChangesLimit;
+  public String createAccount;
+  public String createGroup;
+  public String createProject;
+  public String emailReviewers;
+  public String flushCaches;
+  public String killTask;
+  public String maintainServer;
+  public String modifyAccount;
+  public String priority;
+  public String readAs;
+  public String queryLimit;
+  public String runAs;
+  public String runGC;
+  public String streamEvents;
+  public String viewAllAccounts;
+  public String viewCaches;
+  public String viewConnections;
+  public String viewPlugins;
+  public String viewQueue;
+  public String viewAccess;
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/CapabilityResource.java b/java/com/google/gerrit/server/config/CapabilityResource.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/CapabilityResource.java
rename to java/com/google/gerrit/server/config/CapabilityResource.java
diff --git a/java/com/google/gerrit/server/config/ChangeCleanupConfig.java b/java/com/google/gerrit/server/config/ChangeCleanupConfig.java
new file mode 100644
index 0000000..f5c9fc2
--- /dev/null
+++ b/java/com/google/gerrit/server/config/ChangeCleanupConfig.java
@@ -0,0 +1,81 @@
+// Copyright (C) 2015 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.google.gerrit.server.config;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.server.config.ScheduleConfig.Schedule;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.Optional;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.lib.Config;
+
+@Singleton
+public class ChangeCleanupConfig {
+  private static String SECTION = "changeCleanup";
+  private static String KEY_ABANDON_AFTER = "abandonAfter";
+  private static String KEY_ABANDON_IF_MERGEABLE = "abandonIfMergeable";
+  private static String KEY_ABANDON_MESSAGE = "abandonMessage";
+  private static String DEFAULT_ABANDON_MESSAGE =
+      "Auto-Abandoned due to inactivity, see "
+          + "${URL}\n"
+          + "\n"
+          + "If this change is still wanted it should be restored.";
+
+  private final DynamicItem<UrlFormatter> urlFormatter;
+  private final Optional<Schedule> schedule;
+  private final long abandonAfter;
+  private final boolean abandonIfMergeable;
+  private final String abandonMessage;
+
+  @Inject
+  ChangeCleanupConfig(@GerritServerConfig Config cfg, DynamicItem<UrlFormatter> urlFormatter) {
+    this.urlFormatter = urlFormatter;
+    schedule = ScheduleConfig.createSchedule(cfg, SECTION);
+    abandonAfter = readAbandonAfter(cfg);
+    abandonIfMergeable = cfg.getBoolean(SECTION, null, KEY_ABANDON_IF_MERGEABLE, true);
+    abandonMessage = readAbandonMessage(cfg);
+  }
+
+  private long readAbandonAfter(Config cfg) {
+    long abandonAfter =
+        ConfigUtil.getTimeUnit(cfg, SECTION, null, KEY_ABANDON_AFTER, 0, TimeUnit.MILLISECONDS);
+    return abandonAfter >= 0 ? abandonAfter : 0;
+  }
+
+  private String readAbandonMessage(Config cfg) {
+    String abandonMessage = cfg.getString(SECTION, null, KEY_ABANDON_MESSAGE);
+    return Strings.isNullOrEmpty(abandonMessage) ? DEFAULT_ABANDON_MESSAGE : abandonMessage;
+  }
+
+  public Optional<Schedule> getSchedule() {
+    return schedule;
+  }
+
+  public long getAbandonAfter() {
+    return abandonAfter;
+  }
+
+  public boolean getAbandonIfMergeable() {
+    return abandonIfMergeable;
+  }
+
+  public String getAbandonMessage() {
+    String docUrl =
+        urlFormatter.get().getDocUrl("user-change-cleanup.html", "auto-abandon").orElse("");
+    return docUrl.isEmpty() ? abandonMessage : abandonMessage.replace("${URL}", docUrl);
+  }
+}
diff --git a/java/com/google/gerrit/server/config/ChangeUpdateExecutor.java b/java/com/google/gerrit/server/config/ChangeUpdateExecutor.java
new file mode 100644
index 0000000..4c9e5f0
--- /dev/null
+++ b/java/com/google/gerrit/server/config/ChangeUpdateExecutor.java
@@ -0,0 +1,29 @@
+// Copyright (C) 2012 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.google.gerrit.server.config;
+
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.inject.BindingAnnotation;
+import java.lang.annotation.Retention;
+
+/**
+ * Marker on the global {@link ListeningExecutorService} used by asynchronous {@link BatchUpdate}s.
+ */
+@Retention(RUNTIME)
+@BindingAnnotation
+public @interface ChangeUpdateExecutor {}
diff --git a/java/com/google/gerrit/server/config/ConfigKey.java b/java/com/google/gerrit/server/config/ConfigKey.java
new file mode 100644
index 0000000..aa4ffb0
--- /dev/null
+++ b/java/com/google/gerrit/server/config/ConfigKey.java
@@ -0,0 +1,46 @@
+// 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.
+package com.google.gerrit.server.config;
+
+import com.google.auto.value.AutoValue;
+import com.google.gerrit.common.Nullable;
+
+@AutoValue
+public abstract class ConfigKey {
+  public abstract String section();
+
+  @Nullable
+  public abstract String subsection();
+
+  public abstract String name();
+
+  public static ConfigKey create(String section, String subsection, String name) {
+    return new AutoValue_ConfigKey(section, subsection, name);
+  }
+
+  public static ConfigKey create(String section, String name) {
+    return new AutoValue_ConfigKey(section, null, name);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append(section()).append(".");
+    if (subsection() != null) {
+      sb.append(subsection()).append(".");
+    }
+    sb.append(name());
+    return sb.toString();
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/ConfigResource.java b/java/com/google/gerrit/server/config/ConfigResource.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/ConfigResource.java
rename to java/com/google/gerrit/server/config/ConfigResource.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/ConfigSection.java b/java/com/google/gerrit/server/config/ConfigSection.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/ConfigSection.java
rename to java/com/google/gerrit/server/config/ConfigSection.java
diff --git a/java/com/google/gerrit/server/config/ConfigUpdatedEvent.java b/java/com/google/gerrit/server/config/ConfigUpdatedEvent.java
new file mode 100644
index 0000000..a7aff83
--- /dev/null
+++ b/java/com/google/gerrit/server/config/ConfigUpdatedEvent.java
@@ -0,0 +1,194 @@
+// 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.
+package com.google.gerrit.server.config;
+
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.ImmutableMultimap;
+import com.google.common.collect.Multimap;
+import java.util.Collections;
+import java.util.LinkedHashSet;
+import java.util.Objects;
+import java.util.Set;
+import org.apache.commons.lang.StringUtils;
+import org.eclipse.jgit.lib.Config;
+
+/**
+ * This event is produced by {@link GerritServerConfigReloader} and forwarded to callers
+ * implementing {@link GerritConfigListener}.
+ *
+ * <p>The event intends to:
+ *
+ * <p>1. Help the callers figure out if any action should be taken, depending on which entries are
+ * updated in gerrit.config.
+ *
+ * <p>2. Provide the callers with a mechanism to accept/reject the entries of interest: @see
+ * accept(Set<ConfigKey> entries), @see accept(String section), @see reject(Set<ConfigKey> entries)
+ * (+ various overloaded versions of these)
+ */
+public class ConfigUpdatedEvent {
+  public static final Multimap<UpdateResult, ConfigUpdateEntry> NO_UPDATES =
+      new ImmutableMultimap.Builder<UpdateResult, ConfigUpdateEntry>().build();
+  private final Config oldConfig;
+  private final Config newConfig;
+
+  public ConfigUpdatedEvent(Config oldConfig, Config newConfig) {
+    this.oldConfig = oldConfig;
+    this.newConfig = newConfig;
+  }
+
+  public Config getOldConfig() {
+    return this.oldConfig;
+  }
+
+  public Config getNewConfig() {
+    return this.newConfig;
+  }
+
+  private String getString(ConfigKey key, Config config) {
+    return config.getString(key.section(), key.subsection(), key.name());
+  }
+
+  public Multimap<UpdateResult, ConfigUpdateEntry> accept(ConfigKey entry) {
+    return accept(Collections.singleton(entry));
+  }
+
+  public Multimap<UpdateResult, ConfigUpdateEntry> accept(Set<ConfigKey> entries) {
+    return createUpdate(entries, UpdateResult.APPLIED);
+  }
+
+  public Multimap<UpdateResult, ConfigUpdateEntry> accept(String section) {
+    Set<ConfigKey> entries = getEntriesFromSection(oldConfig, section);
+    entries.addAll(getEntriesFromSection(newConfig, section));
+    return createUpdate(entries, UpdateResult.APPLIED);
+  }
+
+  public Multimap<UpdateResult, ConfigUpdateEntry> reject(ConfigKey entry) {
+    return reject(Collections.singleton(entry));
+  }
+
+  public Multimap<UpdateResult, ConfigUpdateEntry> reject(Set<ConfigKey> entries) {
+    return createUpdate(entries, UpdateResult.REJECTED);
+  }
+
+  private static Set<ConfigKey> getEntriesFromSection(Config config, String section) {
+    Set<ConfigKey> res = new LinkedHashSet<>();
+    for (String name : config.getNames(section, true)) {
+      res.add(ConfigKey.create(section, name));
+    }
+    for (String sub : config.getSubsections(section)) {
+      for (String name : config.getNames(section, sub, true)) {
+        res.add(ConfigKey.create(section, sub, name));
+      }
+    }
+    return res;
+  }
+
+  private Multimap<UpdateResult, ConfigUpdateEntry> createUpdate(
+      Set<ConfigKey> entries, UpdateResult updateResult) {
+    Multimap<UpdateResult, ConfigUpdateEntry> updates = ArrayListMultimap.create();
+    entries.stream()
+        .filter(this::isValueUpdated)
+        .map(e -> new ConfigUpdateEntry(e, getString(e, oldConfig), getString(e, newConfig)))
+        .forEach(e -> updates.put(updateResult, e));
+    return updates;
+  }
+
+  public boolean isSectionUpdated(String section) {
+    Set<ConfigKey> entries = getEntriesFromSection(oldConfig, section);
+    entries.addAll(getEntriesFromSection(newConfig, section));
+    return isEntriesUpdated(entries);
+  }
+
+  public boolean isValueUpdated(String section, String subsection, String name) {
+    return !Objects.equals(
+        oldConfig.getString(section, subsection, name),
+        newConfig.getString(section, subsection, name));
+  }
+
+  public boolean isValueUpdated(ConfigKey key) {
+    return isValueUpdated(key.section(), key.subsection(), key.name());
+  }
+
+  public boolean isValueUpdated(String section, String name) {
+    return isValueUpdated(section, null, name);
+  }
+
+  public boolean isEntriesUpdated(Set<ConfigKey> entries) {
+    for (ConfigKey entry : entries) {
+      if (isValueUpdated(entry.section(), entry.subsection(), entry.name())) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  public enum UpdateResult {
+    APPLIED,
+    REJECTED;
+
+    @Override
+    public String toString() {
+      return StringUtils.capitalize(name().toLowerCase());
+    }
+  }
+
+  public enum ConfigEntryType {
+    ADDED,
+    REMOVED,
+    MODIFIED,
+    UNMODIFIED
+  }
+
+  public static class ConfigUpdateEntry {
+    public final ConfigKey key;
+    public final String oldVal;
+    public final String newVal;
+
+    public ConfigUpdateEntry(ConfigKey key, String oldVal, String newVal) {
+      this.key = key;
+      this.oldVal = oldVal;
+      this.newVal = newVal;
+    }
+
+    /** Note: The toString() is used to format the output from @see ReloadConfig. */
+    @Override
+    public String toString() {
+      switch (getUpdateType()) {
+        case ADDED:
+          return String.format("+ %s = %s", key, newVal);
+        case MODIFIED:
+          return String.format("* %s = [%s => %s]", key, oldVal, newVal);
+        case REMOVED:
+          return String.format("- %s = %s", key, oldVal);
+        case UNMODIFIED:
+          return String.format("  %s = %s", key, newVal);
+        default:
+          throw new IllegalStateException("Unexpected UpdateType: " + getUpdateType().name());
+      }
+    }
+
+    public ConfigEntryType getUpdateType() {
+      if (oldVal == null && newVal != null) {
+        return ConfigEntryType.ADDED;
+      }
+      if (oldVal != null && newVal == null) {
+        return ConfigEntryType.REMOVED;
+      }
+      if (Objects.equals(oldVal, newVal)) {
+        return ConfigEntryType.UNMODIFIED;
+      }
+      return ConfigEntryType.MODIFIED;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/config/ConfigUtil.java b/java/com/google/gerrit/server/config/ConfigUtil.java
new file mode 100644
index 0000000..f476adf
--- /dev/null
+++ b/java/com/google/gerrit/server/config/ConfigUtil.java
@@ -0,0 +1,443 @@
+// Copyright (C) 2009 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.google.gerrit.server.config;
+
+import static java.util.Objects.requireNonNull;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Config;
+
+public class ConfigUtil {
+
+  @SuppressWarnings("unchecked")
+  private static <T> T[] allValuesOf(T defaultValue) {
+    try {
+      return (T[]) defaultValue.getClass().getMethod("values").invoke(null);
+    } catch (IllegalArgumentException
+        | NoSuchMethodException
+        | InvocationTargetException
+        | IllegalAccessException
+        | SecurityException e) {
+      throw new IllegalArgumentException("Cannot obtain enumeration values", e);
+    }
+  }
+
+  /**
+   * Parse a Java enumeration from the configuration.
+   *
+   * @param <T> type of the enumeration object.
+   * @param section section the key is in.
+   * @param subsection subsection the key is in, or null if not in a subsection.
+   * @param setting name of the setting to read.
+   * @param valueString string value from git Config
+   * @param all all possible values in the enumeration which should be recognized. This should be
+   *     {@code EnumType.values()}.
+   * @return the selected enumeration value, or {@code defaultValue}.
+   */
+  private static <T extends Enum<?>> T getEnum(
+      final String section,
+      final String subsection,
+      final String setting,
+      String valueString,
+      final T[] all) {
+
+    String n = valueString.replace(' ', '_').replace('-', '_');
+    for (T e : all) {
+      if (e.name().equalsIgnoreCase(n)) {
+        return e;
+      }
+    }
+
+    final StringBuilder r = new StringBuilder();
+    r.append("Value \"");
+    r.append(valueString);
+    r.append("\" not recognized in ");
+    r.append(section);
+    if (subsection != null) {
+      r.append(".");
+      r.append(subsection);
+    }
+    r.append(".");
+    r.append(setting);
+    r.append("; supported values are: ");
+    for (T e : all) {
+      r.append(e.name());
+      r.append(" ");
+    }
+
+    throw new IllegalArgumentException(r.toString().trim());
+  }
+
+  /**
+   * Parse a Java enumeration list from the configuration.
+   *
+   * @param <T> type of the enumeration object.
+   * @param config the configuration file to read.
+   * @param section section the key is in.
+   * @param subsection subsection the key is in, or null if not in a subsection.
+   * @param setting name of the setting to read.
+   * @param defaultValue default value to return if the setting was not set. Must not be null as the
+   *     enumeration values are derived from this.
+   * @return the selected enumeration values list, or {@code defaultValue}.
+   */
+  public static <T extends Enum<?>> List<T> getEnumList(
+      final Config config,
+      final String section,
+      final String subsection,
+      final String setting,
+      final T defaultValue) {
+    final T[] all = allValuesOf(defaultValue);
+    return getEnumList(config, section, subsection, setting, all, defaultValue);
+  }
+
+  /**
+   * Parse a Java enumeration list from the configuration.
+   *
+   * @param <T> type of the enumeration object.
+   * @param config the configuration file to read.
+   * @param section section the key is in.
+   * @param subsection subsection the key is in, or null if not in a subsection.
+   * @param setting name of the setting to read.
+   * @param all all possible values in the enumeration which should be recognized. This should be
+   *     {@code EnumType.values()}.
+   * @param defaultValue default value to return if the setting was not set. This value may be null.
+   * @return the selected enumeration values list, or {@code defaultValue}.
+   */
+  public static <T extends Enum<?>> List<T> getEnumList(
+      final Config config,
+      final String section,
+      final String subsection,
+      final String setting,
+      final T[] all,
+      final T defaultValue) {
+    final List<T> list = new ArrayList<>();
+    final String[] values = config.getStringList(section, subsection, setting);
+    if (values.length == 0) {
+      list.add(defaultValue);
+    } else {
+      for (String string : values) {
+        if (string != null) {
+          list.add(getEnum(section, subsection, setting, string, all));
+        }
+      }
+    }
+    return list;
+  }
+
+  /**
+   * Parse a numerical time unit, such as "1 minute", from the configuration.
+   *
+   * @param config the configuration file to read.
+   * @param section section the key is in.
+   * @param subsection subsection the key is in, or null if not in a subsection.
+   * @param setting name of the setting to read.
+   * @param defaultValue default value to return if no value was set in the configuration file.
+   * @param wantUnit the units of {@code defaultValue} and the return value, as well as the units to
+   *     assume if the value does not contain an indication of the units.
+   * @return the setting, or {@code defaultValue} if not set, expressed in {@code units}.
+   */
+  public static long getTimeUnit(
+      final Config config,
+      final String section,
+      final String subsection,
+      final String setting,
+      final long defaultValue,
+      final TimeUnit wantUnit) {
+    final String valueString = config.getString(section, subsection, setting);
+    if (valueString == null) {
+      return defaultValue;
+    }
+
+    String s = valueString.trim();
+    if (s.length() == 0) {
+      return defaultValue;
+    }
+
+    if (s.startsWith("-") /* negative */) {
+      throw notTimeUnit(section, subsection, setting, valueString);
+    }
+
+    try {
+      return getTimeUnit(s, defaultValue, wantUnit);
+    } catch (IllegalArgumentException notTime) {
+      throw notTimeUnit(section, subsection, setting, valueString);
+    }
+  }
+
+  /**
+   * Parse a numerical time unit, such as "1 minute", from a string.
+   *
+   * @param valueString the string to parse.
+   * @param defaultValue default value to return if no value was set in the configuration file.
+   * @param wantUnit the units of {@code defaultValue} and the return value, as well as the units to
+   *     assume if the value does not contain an indication of the units.
+   * @return the setting, or {@code defaultValue} if not set, expressed in {@code units}.
+   */
+  public static long getTimeUnit(String valueString, long defaultValue, TimeUnit wantUnit) {
+    Matcher m = Pattern.compile("^(0|[1-9][0-9]*)\\s*(.*)$").matcher(valueString);
+    if (!m.matches()) {
+      return defaultValue;
+    }
+
+    String digits = m.group(1);
+    String unitName = m.group(2).trim();
+
+    TimeUnit inputUnit;
+    int inputMul;
+
+    if ("".equals(unitName)) {
+      inputUnit = wantUnit;
+      inputMul = 1;
+
+    } else if (match(unitName, "ms", "milliseconds")) {
+      inputUnit = TimeUnit.MILLISECONDS;
+      inputMul = 1;
+
+    } else if (match(unitName, "s", "sec", "second", "seconds")) {
+      inputUnit = TimeUnit.SECONDS;
+      inputMul = 1;
+
+    } else if (match(unitName, "m", "min", "minute", "minutes")) {
+      inputUnit = TimeUnit.MINUTES;
+      inputMul = 1;
+
+    } else if (match(unitName, "h", "hr", "hour", "hours")) {
+      inputUnit = TimeUnit.HOURS;
+      inputMul = 1;
+
+    } else if (match(unitName, "d", "day", "days")) {
+      inputUnit = TimeUnit.DAYS;
+      inputMul = 1;
+
+    } else if (match(unitName, "w", "week", "weeks")) {
+      inputUnit = TimeUnit.DAYS;
+      inputMul = 7;
+
+    } else if (match(unitName, "mon", "month", "months")) {
+      inputUnit = TimeUnit.DAYS;
+      inputMul = 30;
+
+    } else if (match(unitName, "y", "year", "years")) {
+      inputUnit = TimeUnit.DAYS;
+      inputMul = 365;
+
+    } else {
+      throw notTimeUnit(valueString);
+    }
+
+    try {
+      return wantUnit.convert(Long.parseLong(digits) * inputMul, inputUnit);
+    } catch (NumberFormatException nfe) {
+      throw notTimeUnit(valueString);
+    }
+  }
+
+  public static String getRequired(Config cfg, String section, String name) {
+    final String v = cfg.getString(section, null, name);
+    if (v == null || "".equals(v)) {
+      throw new IllegalArgumentException("No " + section + "." + name + " configured");
+    }
+    return v;
+  }
+
+  /**
+   * Store section by inspecting Java class attributes.
+   *
+   * <p>Optimize the storage by unsetting a variable if it is being set to default value by the
+   * server.
+   *
+   * <p>Fields marked with final or transient modifiers are skipped.
+   *
+   * @param cfg config in which the values should be stored
+   * @param section section
+   * @param sub subsection
+   * @param s instance of class with config values
+   * @param defaults instance of class with default values
+   * @throws ConfigInvalidException
+   */
+  public static <T> void storeSection(Config cfg, String section, String sub, T s, T defaults)
+      throws ConfigInvalidException {
+    try {
+      for (Field f : s.getClass().getDeclaredFields()) {
+        if (skipField(f)) {
+          continue;
+        }
+        Class<?> t = f.getType();
+        String n = f.getName();
+        f.setAccessible(true);
+        Object c = f.get(s);
+        Object d = f.get(defaults);
+        if (!isString(t) && !isCollectionOrMap(t)) {
+          requireNonNull(d, "Default cannot be null for: " + n);
+        }
+        if (c == null || c.equals(d)) {
+          cfg.unset(section, sub, n);
+        } else {
+          if (isString(t)) {
+            cfg.setString(section, sub, n, (String) c);
+          } else if (isInteger(t)) {
+            cfg.setInt(section, sub, n, (Integer) c);
+          } else if (isLong(t)) {
+            cfg.setLong(section, sub, n, (Long) c);
+          } else if (isBoolean(t)) {
+            cfg.setBoolean(section, sub, n, (Boolean) c);
+          } else if (t.isEnum()) {
+            cfg.setEnum(section, sub, n, (Enum<?>) c);
+          } else if (isCollectionOrMap(t)) {
+            // TODO(davido): accept closure passed in from caller
+            continue;
+          } else {
+            throw new ConfigInvalidException("type is unknown: " + t.getName());
+          }
+        }
+      }
+    } catch (SecurityException | IllegalArgumentException | IllegalAccessException e) {
+      throw new ConfigInvalidException("cannot save values", e);
+    }
+  }
+
+  /**
+   * Load section by inspecting Java class attributes.
+   *
+   * <p>Config values are stored optimized: no default values are stored. The loading is performed
+   * eagerly: all values are set.
+   *
+   * <p>Fields marked with final or transient modifiers are skipped.
+   *
+   * @param cfg config from which the values are loaded
+   * @param section section
+   * @param sub subsection
+   * @param s instance of class in which the values are set
+   * @param defaults instance of class with default values
+   * @param i instance to merge during the load. When present, the boolean fields are not nullified
+   *     when their values are false
+   * @return loaded instance
+   * @throws ConfigInvalidException
+   */
+  public static <T> T loadSection(Config cfg, String section, String sub, T s, T defaults, T i)
+      throws ConfigInvalidException {
+    try {
+      for (Field f : s.getClass().getDeclaredFields()) {
+        if (skipField(f)) {
+          continue;
+        }
+        Class<?> t = f.getType();
+        String n = f.getName();
+        f.setAccessible(true);
+        Object d = f.get(defaults);
+        if (!isString(t) && !isCollectionOrMap(t)) {
+          requireNonNull(d, "Default cannot be null for: " + n);
+        }
+        if (isString(t)) {
+          String v = cfg.getString(section, sub, n);
+          if (v == null) {
+            v = (String) d;
+          }
+          f.set(s, v);
+        } else if (isInteger(t)) {
+          f.set(s, cfg.getInt(section, sub, n, (Integer) d));
+        } else if (isLong(t)) {
+          f.set(s, cfg.getLong(section, sub, n, (Long) d));
+        } else if (isBoolean(t)) {
+          boolean b = cfg.getBoolean(section, sub, n, (Boolean) d);
+          if (b || i != null) {
+            f.set(s, b);
+          }
+        } else if (t.isEnum()) {
+          f.set(s, cfg.getEnum(section, sub, n, (Enum<?>) d));
+        } else if (isCollectionOrMap(t)) {
+          // TODO(davido): accept closure passed in from caller
+          continue;
+        } else {
+          throw new ConfigInvalidException("type is unknown: " + t.getName());
+        }
+        if (i != null) {
+          Object o = f.get(i);
+          if (o != null) {
+            f.set(s, o);
+          }
+        }
+      }
+    } catch (SecurityException | IllegalArgumentException | IllegalAccessException e) {
+      throw new ConfigInvalidException("cannot load values", e);
+    }
+    return s;
+  }
+
+  public static boolean skipField(Field field) {
+    int modifiers = field.getModifiers();
+    return Modifier.isFinal(modifiers) || Modifier.isTransient(modifiers);
+  }
+
+  private static boolean isCollectionOrMap(Class<?> t) {
+    return Collection.class.isAssignableFrom(t) || Map.class.isAssignableFrom(t);
+  }
+
+  private static boolean isString(Class<?> t) {
+    return String.class == t;
+  }
+
+  private static boolean isBoolean(Class<?> t) {
+    return Boolean.class == t || boolean.class == t;
+  }
+
+  private static boolean isLong(Class<?> t) {
+    return Long.class == t || long.class == t;
+  }
+
+  private static boolean isInteger(Class<?> t) {
+    return Integer.class == t || int.class == t;
+  }
+
+  private static boolean match(String a, String... cases) {
+    for (String b : cases) {
+      if (b != null && b.equalsIgnoreCase(a)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  private static IllegalArgumentException notTimeUnit(
+      final String section,
+      final String subsection,
+      final String setting,
+      final String valueString) {
+    return new IllegalArgumentException(
+        "Invalid time unit value: "
+            + section
+            + (subsection != null ? "." + subsection : "")
+            + "."
+            + setting
+            + " = "
+            + valueString);
+  }
+
+  private static IllegalArgumentException notTimeUnit(String val) {
+    return new IllegalArgumentException("Invalid time unit value: " + val);
+  }
+
+  private ConfigUtil() {}
+}
diff --git a/java/com/google/gerrit/server/config/DefaultUrlFormatter.java b/java/com/google/gerrit/server/config/DefaultUrlFormatter.java
new file mode 100644
index 0000000..060ee3f
--- /dev/null
+++ b/java/com/google/gerrit/server/config/DefaultUrlFormatter.java
@@ -0,0 +1,45 @@
+// 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.
+
+package com.google.gerrit.server.config;
+
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.inject.AbstractModule;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.Optional;
+
+@Singleton
+public class DefaultUrlFormatter implements UrlFormatter {
+  private final Provider<String> canonicalWebUrlProvider;
+
+  public static class Module extends AbstractModule {
+    @Override
+    protected void configure() {
+      DynamicItem.itemOf(binder(), UrlFormatter.class);
+      DynamicItem.bind(binder(), UrlFormatter.class).to(DefaultUrlFormatter.class);
+    }
+  }
+
+  @Inject
+  public DefaultUrlFormatter(@CanonicalWebUrl Provider<String> canonicalWebUrlProvider) {
+    this.canonicalWebUrlProvider = canonicalWebUrlProvider;
+  }
+
+  @Override
+  public Optional<String> getWebUrl() {
+    return Optional.ofNullable(canonicalWebUrlProvider.get());
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/DisableReverseDnsLookup.java b/java/com/google/gerrit/server/config/DisableReverseDnsLookup.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/DisableReverseDnsLookup.java
rename to java/com/google/gerrit/server/config/DisableReverseDnsLookup.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/DisableReverseDnsLookupProvider.java b/java/com/google/gerrit/server/config/DisableReverseDnsLookupProvider.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/DisableReverseDnsLookupProvider.java
rename to java/com/google/gerrit/server/config/DisableReverseDnsLookupProvider.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/DownloadConfig.java b/java/com/google/gerrit/server/config/DownloadConfig.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/DownloadConfig.java
rename to java/com/google/gerrit/server/config/DownloadConfig.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/EmailExpanderProvider.java b/java/com/google/gerrit/server/config/EmailExpanderProvider.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/EmailExpanderProvider.java
rename to java/com/google/gerrit/server/config/EmailExpanderProvider.java
diff --git a/java/com/google/gerrit/server/config/GcConfig.java b/java/com/google/gerrit/server/config/GcConfig.java
new file mode 100644
index 0000000..3e28827
--- /dev/null
+++ b/java/com/google/gerrit/server/config/GcConfig.java
@@ -0,0 +1,42 @@
+// Copyright (C) 2014 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.google.gerrit.server.config;
+
+import com.google.gerrit.server.config.ScheduleConfig.Schedule;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.Optional;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ConfigConstants;
+
+@Singleton
+public class GcConfig {
+  private final Optional<Schedule> schedule;
+  private final boolean aggressive;
+
+  @Inject
+  GcConfig(@GerritServerConfig Config cfg) {
+    schedule = ScheduleConfig.createSchedule(cfg, ConfigConstants.CONFIG_GC_SECTION);
+    aggressive = cfg.getBoolean(ConfigConstants.CONFIG_GC_SECTION, "aggressive", false);
+  }
+
+  public Optional<Schedule> getSchedule() {
+    return schedule;
+  }
+
+  public boolean isAggressive() {
+    return aggressive;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritConfig.java b/java/com/google/gerrit/server/config/GerritConfig.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/GerritConfig.java
rename to java/com/google/gerrit/server/config/GerritConfig.java
diff --git a/java/com/google/gerrit/server/config/GerritConfigListener.java b/java/com/google/gerrit/server/config/GerritConfigListener.java
new file mode 100644
index 0000000..f5b2976
--- /dev/null
+++ b/java/com/google/gerrit/server/config/GerritConfigListener.java
@@ -0,0 +1,30 @@
+// 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.
+
+package com.google.gerrit.server.config;
+
+import com.google.common.collect.Multimap;
+import com.google.gerrit.extensions.annotations.ExtensionPoint;
+import com.google.gerrit.server.config.ConfigUpdatedEvent.ConfigUpdateEntry;
+import com.google.gerrit.server.config.ConfigUpdatedEvent.UpdateResult;
+import java.util.EventListener;
+
+/**
+ * Implementations of the GerritConfigListener interface expects to react GerritServerConfig
+ * updates. @see ConfigUpdatedEvent.
+ */
+@ExtensionPoint
+public interface GerritConfigListener extends EventListener {
+  Multimap<UpdateResult, ConfigUpdateEntry> configUpdated(ConfigUpdatedEvent event);
+}
diff --git a/java/com/google/gerrit/server/config/GerritConfigListenerHelper.java b/java/com/google/gerrit/server/config/GerritConfigListenerHelper.java
new file mode 100644
index 0000000..d21e1c3
--- /dev/null
+++ b/java/com/google/gerrit/server/config/GerritConfigListenerHelper.java
@@ -0,0 +1,26 @@
+// 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.
+
+package com.google.gerrit.server.config;
+
+import com.google.common.collect.ImmutableSet;
+
+public class GerritConfigListenerHelper {
+  public static GerritConfigListener acceptIfChanged(ConfigKey... keys) {
+    return e ->
+        e.isEntriesUpdated(ImmutableSet.copyOf(keys))
+            ? e.accept(ImmutableSet.copyOf(keys))
+            : ConfigUpdatedEvent.NO_UPDATES;
+  }
+}
diff --git a/java/com/google/gerrit/server/config/GerritGlobalModule.java b/java/com/google/gerrit/server/config/GerritGlobalModule.java
new file mode 100644
index 0000000..b4f9cc7
--- /dev/null
+++ b/java/com/google/gerrit/server/config/GerritGlobalModule.java
@@ -0,0 +1,436 @@
+// 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.
+
+package com.google.gerrit.server.config;
+
+import static com.google.inject.Scopes.SINGLETON;
+
+import com.google.common.cache.Cache;
+import com.google.gerrit.extensions.annotations.Exports;
+import com.google.gerrit.extensions.api.changes.ActionVisitor;
+import com.google.gerrit.extensions.api.projects.CommentLinkInfo;
+import com.google.gerrit.extensions.auth.oauth.OAuthLoginProvider;
+import com.google.gerrit.extensions.auth.oauth.OAuthTokenEncrypter;
+import com.google.gerrit.extensions.common.AccountVisibility;
+import com.google.gerrit.extensions.config.CapabilityDefinition;
+import com.google.gerrit.extensions.config.CloneCommand;
+import com.google.gerrit.extensions.config.DownloadCommand;
+import com.google.gerrit.extensions.config.DownloadScheme;
+import com.google.gerrit.extensions.config.ExternalIncludedIn;
+import com.google.gerrit.extensions.config.FactoryModule;
+import com.google.gerrit.extensions.events.AccountIndexedListener;
+import com.google.gerrit.extensions.events.AgreementSignupListener;
+import com.google.gerrit.extensions.events.AssigneeChangedListener;
+import com.google.gerrit.extensions.events.ChangeAbandonedListener;
+import com.google.gerrit.extensions.events.ChangeDeletedListener;
+import com.google.gerrit.extensions.events.ChangeIndexedListener;
+import com.google.gerrit.extensions.events.ChangeMergedListener;
+import com.google.gerrit.extensions.events.ChangeRestoredListener;
+import com.google.gerrit.extensions.events.ChangeRevertedListener;
+import com.google.gerrit.extensions.events.CommentAddedListener;
+import com.google.gerrit.extensions.events.GarbageCollectorListener;
+import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
+import com.google.gerrit.extensions.events.GroupIndexedListener;
+import com.google.gerrit.extensions.events.HashtagsEditedListener;
+import com.google.gerrit.extensions.events.HeadUpdatedListener;
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.extensions.events.NewProjectCreatedListener;
+import com.google.gerrit.extensions.events.PluginEventListener;
+import com.google.gerrit.extensions.events.PrivateStateChangedListener;
+import com.google.gerrit.extensions.events.ProjectDeletedListener;
+import com.google.gerrit.extensions.events.ProjectIndexedListener;
+import com.google.gerrit.extensions.events.ReviewerAddedListener;
+import com.google.gerrit.extensions.events.ReviewerDeletedListener;
+import com.google.gerrit.extensions.events.RevisionCreatedListener;
+import com.google.gerrit.extensions.events.TopicEditedListener;
+import com.google.gerrit.extensions.events.UsageDataPublishedListener;
+import com.google.gerrit.extensions.events.VoteDeletedListener;
+import com.google.gerrit.extensions.events.WorkInProgressStateChangedListener;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.systemstatus.MessageOfTheDay;
+import com.google.gerrit.extensions.webui.BranchWebLink;
+import com.google.gerrit.extensions.webui.DiffWebLink;
+import com.google.gerrit.extensions.webui.FileHistoryWebLink;
+import com.google.gerrit.extensions.webui.FileWebLink;
+import com.google.gerrit.extensions.webui.ParentWebLink;
+import com.google.gerrit.extensions.webui.PatchSetWebLink;
+import com.google.gerrit.extensions.webui.ProjectWebLink;
+import com.google.gerrit.extensions.webui.TagWebLink;
+import com.google.gerrit.extensions.webui.TopMenu;
+import com.google.gerrit.extensions.webui.WebUiPlugin;
+import com.google.gerrit.server.AnonymousUser;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.CmdLineParserModule;
+import com.google.gerrit.server.CreateGroupPermissionSyncer;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.Sequences;
+import com.google.gerrit.server.account.AccountCacheImpl;
+import com.google.gerrit.server.account.AccountControl;
+import com.google.gerrit.server.account.AccountDeactivator;
+import com.google.gerrit.server.account.AccountExternalIdCreator;
+import com.google.gerrit.server.account.AccountManager;
+import com.google.gerrit.server.account.AccountResolver;
+import com.google.gerrit.server.account.AccountVisibilityProvider;
+import com.google.gerrit.server.account.CapabilityCollection;
+import com.google.gerrit.server.account.EmailExpander;
+import com.google.gerrit.server.account.GroupCacheImpl;
+import com.google.gerrit.server.account.GroupControl;
+import com.google.gerrit.server.account.GroupIncludeCacheImpl;
+import com.google.gerrit.server.account.VersionedAuthorizedKeys;
+import com.google.gerrit.server.account.externalids.ExternalIdModule;
+import com.google.gerrit.server.auth.AuthBackend;
+import com.google.gerrit.server.auth.UniversalAuthBackend;
+import com.google.gerrit.server.auth.oauth.OAuthTokenCache;
+import com.google.gerrit.server.avatar.AvatarProvider;
+import com.google.gerrit.server.cache.CacheRemovalListener;
+import com.google.gerrit.server.change.AbandonOp;
+import com.google.gerrit.server.change.AccountPatchReviewStore;
+import com.google.gerrit.server.change.ChangeFinder;
+import com.google.gerrit.server.change.ChangeJson;
+import com.google.gerrit.server.change.ChangeKindCacheImpl;
+import com.google.gerrit.server.change.LabelsJson;
+import com.google.gerrit.server.change.MergeabilityCacheImpl;
+import com.google.gerrit.server.change.ReviewerSuggestion;
+import com.google.gerrit.server.change.RevisionJson;
+import com.google.gerrit.server.events.EventFactory;
+import com.google.gerrit.server.events.EventListener;
+import com.google.gerrit.server.events.EventsMetrics;
+import com.google.gerrit.server.events.UserScopedEventListener;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.extensions.webui.UiActions;
+import com.google.gerrit.server.git.ChangeMessageModifier;
+import com.google.gerrit.server.git.GitModule;
+import com.google.gerrit.server.git.MergeUtil;
+import com.google.gerrit.server.git.MergedByPushOp;
+import com.google.gerrit.server.git.NotesBranchUtil;
+import com.google.gerrit.server.git.ReceivePackInitializer;
+import com.google.gerrit.server.git.TagCache;
+import com.google.gerrit.server.git.TransferConfig;
+import com.google.gerrit.server.git.receive.ReceiveCommitsModule;
+import com.google.gerrit.server.git.validators.CommitValidationListener;
+import com.google.gerrit.server.git.validators.MergeValidationListener;
+import com.google.gerrit.server.git.validators.MergeValidators;
+import com.google.gerrit.server.git.validators.MergeValidators.AccountMergeValidator;
+import com.google.gerrit.server.git.validators.MergeValidators.GroupMergeValidator;
+import com.google.gerrit.server.git.validators.MergeValidators.ProjectConfigValidator;
+import com.google.gerrit.server.git.validators.OnSubmitValidationListener;
+import com.google.gerrit.server.git.validators.OnSubmitValidators;
+import com.google.gerrit.server.git.validators.RefOperationValidationListener;
+import com.google.gerrit.server.git.validators.RefOperationValidators;
+import com.google.gerrit.server.git.validators.UploadValidationListener;
+import com.google.gerrit.server.git.validators.UploadValidators;
+import com.google.gerrit.server.group.db.GroupDbModule;
+import com.google.gerrit.server.index.change.ReindexAfterRefUpdate;
+import com.google.gerrit.server.mail.AutoReplyMailFilter;
+import com.google.gerrit.server.mail.EmailModule;
+import com.google.gerrit.server.mail.ListMailFilter;
+import com.google.gerrit.server.mail.MailFilter;
+import com.google.gerrit.server.mail.send.AddKeySender;
+import com.google.gerrit.server.mail.send.AddReviewerSender;
+import com.google.gerrit.server.mail.send.CreateChangeSender;
+import com.google.gerrit.server.mail.send.DeleteReviewerSender;
+import com.google.gerrit.server.mail.send.FromAddressGenerator;
+import com.google.gerrit.server.mail.send.FromAddressGeneratorProvider;
+import com.google.gerrit.server.mail.send.InboundEmailRejectionSender;
+import com.google.gerrit.server.mail.send.MailSoyTofuProvider;
+import com.google.gerrit.server.mail.send.MailTemplates;
+import com.google.gerrit.server.mail.send.MergedSender;
+import com.google.gerrit.server.mail.send.RegisterNewEmailSender;
+import com.google.gerrit.server.mail.send.ReplacePatchSetSender;
+import com.google.gerrit.server.mail.send.SetAssigneeSender;
+import com.google.gerrit.server.mime.FileTypeRegistry;
+import com.google.gerrit.server.mime.MimeUtilFileTypeRegistry;
+import com.google.gerrit.server.notedb.NoteDbModule;
+import com.google.gerrit.server.patch.PatchListCacheImpl;
+import com.google.gerrit.server.patch.PatchScriptFactory;
+import com.google.gerrit.server.patch.PatchSetInfoFactory;
+import com.google.gerrit.server.permissions.PermissionCollection;
+import com.google.gerrit.server.permissions.SectionSortCache;
+import com.google.gerrit.server.plugins.ReloadPluginListener;
+import com.google.gerrit.server.project.AccessControlModule;
+import com.google.gerrit.server.project.CommentLinkProvider;
+import com.google.gerrit.server.project.ProjectCacheImpl;
+import com.google.gerrit.server.project.ProjectNameLockManager;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.project.SubmitRuleEvaluator;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.ChangeQueryBuilder;
+import com.google.gerrit.server.query.change.ChangeQueryProcessor;
+import com.google.gerrit.server.query.change.ConflictsCacheImpl;
+import com.google.gerrit.server.restapi.change.SuggestReviewers;
+import com.google.gerrit.server.restapi.group.GroupModule;
+import com.google.gerrit.server.rules.DefaultSubmitRule;
+import com.google.gerrit.server.rules.IgnoreSelfApprovalRule;
+import com.google.gerrit.server.rules.PrologModule;
+import com.google.gerrit.server.rules.RulesCache;
+import com.google.gerrit.server.rules.SubmitRule;
+import com.google.gerrit.server.ssh.SshAddressesModule;
+import com.google.gerrit.server.submit.GitModules;
+import com.google.gerrit.server.submit.MergeSuperSetComputation;
+import com.google.gerrit.server.submit.SubmitStrategy;
+import com.google.gerrit.server.tools.ToolsCatalog;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.util.IdGenerator;
+import com.google.gerrit.server.util.ThreadLocalRequestContext;
+import com.google.gerrit.server.validators.AccountActivationValidationListener;
+import com.google.gerrit.server.validators.AssigneeValidationListener;
+import com.google.gerrit.server.validators.GroupCreationValidationListener;
+import com.google.gerrit.server.validators.HashtagValidationListener;
+import com.google.gerrit.server.validators.OutgoingEmailValidationListener;
+import com.google.gerrit.server.validators.ProjectCreationValidationListener;
+import com.google.gitiles.blame.cache.BlameCache;
+import com.google.gitiles.blame.cache.BlameCacheImpl;
+import com.google.inject.Inject;
+import com.google.inject.TypeLiteral;
+import com.google.inject.internal.UniqueAnnotations;
+import com.google.template.soy.tofu.SoyTofu;
+import java.util.List;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.transport.PostReceiveHook;
+import org.eclipse.jgit.transport.PostUploadHook;
+import org.eclipse.jgit.transport.PreUploadHook;
+
+/** Starts global state with standard dependencies. */
+public class GerritGlobalModule extends FactoryModule {
+  private final Config cfg;
+  private final AuthModule authModule;
+
+  @Inject
+  GerritGlobalModule(@GerritServerConfig Config cfg, AuthModule authModule) {
+    this.cfg = cfg;
+    this.authModule = authModule;
+  }
+
+  @Override
+  protected void configure() {
+    bind(EmailExpander.class).toProvider(EmailExpanderProvider.class).in(SINGLETON);
+
+    bind(IdGenerator.class);
+    bind(RulesCache.class);
+    bind(BlameCache.class).to(BlameCacheImpl.class);
+    bind(Sequences.class);
+    install(authModule);
+    install(AccountCacheImpl.module());
+    install(BatchUpdate.module());
+    install(ChangeKindCacheImpl.module());
+    install(ChangeFinder.module());
+    install(ConflictsCacheImpl.module());
+    install(GroupCacheImpl.module());
+    install(GroupIncludeCacheImpl.module());
+    install(MergeabilityCacheImpl.module());
+    install(PatchListCacheImpl.module());
+    install(ProjectCacheImpl.module());
+    install(SectionSortCache.module());
+    install(SubmitStrategy.module());
+    install(TagCache.module());
+    install(OAuthTokenCache.module());
+
+    install(new AccessControlModule());
+    install(new CmdLineParserModule());
+    install(new EmailModule());
+    install(new ExternalIdModule());
+    install(new GitModule());
+    install(new GroupDbModule());
+    install(new GroupModule());
+    install(new NoteDbModule(cfg));
+    install(new PrologModule());
+    install(new DefaultSubmitRule.Module());
+    install(new IgnoreSelfApprovalRule.Module());
+    install(new ReceiveCommitsModule());
+    install(new SshAddressesModule());
+    install(ThreadLocalRequestContext.module());
+
+    bind(AccountResolver.class);
+
+    factory(AddReviewerSender.Factory.class);
+    factory(DeleteReviewerSender.Factory.class);
+    factory(AddKeySender.Factory.class);
+    factory(CapabilityCollection.Factory.class);
+    factory(ChangeData.AssistedFactory.class);
+    factory(ChangeJson.AssistedFactory.class);
+    factory(CreateChangeSender.Factory.class);
+    factory(LabelsJson.Factory.class);
+    factory(MergedSender.Factory.class);
+    factory(MergeUtil.Factory.class);
+    factory(PatchScriptFactory.Factory.class);
+    factory(ProjectState.Factory.class);
+    factory(RegisterNewEmailSender.Factory.class);
+    factory(ReplacePatchSetSender.Factory.class);
+    factory(RevisionJson.Factory.class);
+    factory(SetAssigneeSender.Factory.class);
+    factory(InboundEmailRejectionSender.Factory.class);
+    bind(PermissionCollection.Factory.class);
+    bind(AccountVisibility.class).toProvider(AccountVisibilityProvider.class).in(SINGLETON);
+    factory(ProjectOwnerGroupsProvider.Factory.class);
+    factory(SubmitRuleEvaluator.Factory.class);
+
+    bind(AuthBackend.class).to(UniversalAuthBackend.class).in(SINGLETON);
+    DynamicSet.setOf(binder(), AuthBackend.class);
+
+    bind(GroupControl.Factory.class).in(SINGLETON);
+    bind(GroupControl.GenericFactory.class).in(SINGLETON);
+
+    bind(FileTypeRegistry.class).to(MimeUtilFileTypeRegistry.class);
+    bind(ToolsCatalog.class);
+    bind(EventFactory.class);
+    bind(TransferConfig.class);
+
+    bind(GcConfig.class);
+    DynamicSet.setOf(binder(), GerritConfigListener.class);
+
+    bind(ChangeCleanupConfig.class);
+    bind(AccountDeactivator.class);
+
+    bind(ApprovalsUtil.class);
+
+    bind(SoyTofu.class).annotatedWith(MailTemplates.class).toProvider(MailSoyTofuProvider.class);
+    bind(FromAddressGenerator.class).toProvider(FromAddressGeneratorProvider.class).in(SINGLETON);
+    bind(Boolean.class)
+        .annotatedWith(DisableReverseDnsLookup.class)
+        .toProvider(DisableReverseDnsLookupProvider.class)
+        .in(SINGLETON);
+
+    bind(PatchSetInfoFactory.class);
+    bind(IdentifiedUser.GenericFactory.class).in(SINGLETON);
+    bind(AccountControl.Factory.class);
+
+    bind(UiActions.class);
+
+    bind(GitReferenceUpdated.class);
+    DynamicMap.mapOf(binder(), new TypeLiteral<Cache<?, ?>>() {});
+    DynamicSet.setOf(binder(), CacheRemovalListener.class);
+    DynamicMap.mapOf(binder(), CapabilityDefinition.class);
+    DynamicSet.setOf(binder(), GitReferenceUpdatedListener.class);
+    DynamicSet.setOf(binder(), AssigneeChangedListener.class);
+    DynamicSet.setOf(binder(), ChangeAbandonedListener.class);
+    DynamicSet.setOf(binder(), ChangeDeletedListener.class);
+    DynamicSet.setOf(binder(), CommentAddedListener.class);
+    DynamicSet.setOf(binder(), HashtagsEditedListener.class);
+    DynamicSet.setOf(binder(), ChangeMergedListener.class);
+    bind(ChangeMergedListener.class)
+        .annotatedWith(Exports.named("CreateGroupPermissionSyncer"))
+        .to(CreateGroupPermissionSyncer.class);
+
+    DynamicSet.setOf(binder(), ChangeRestoredListener.class);
+    DynamicSet.setOf(binder(), ChangeRevertedListener.class);
+    DynamicSet.setOf(binder(), PrivateStateChangedListener.class);
+    DynamicSet.setOf(binder(), ReviewerAddedListener.class);
+    DynamicSet.setOf(binder(), ReviewerDeletedListener.class);
+    DynamicSet.setOf(binder(), VoteDeletedListener.class);
+    DynamicSet.setOf(binder(), WorkInProgressStateChangedListener.class);
+    DynamicSet.setOf(binder(), RevisionCreatedListener.class);
+    DynamicSet.setOf(binder(), TopicEditedListener.class);
+    DynamicSet.setOf(binder(), AgreementSignupListener.class);
+    DynamicSet.setOf(binder(), PluginEventListener.class);
+    DynamicSet.setOf(binder(), ReceivePackInitializer.class);
+    DynamicSet.setOf(binder(), PostReceiveHook.class);
+    DynamicSet.setOf(binder(), PreUploadHook.class);
+    DynamicSet.setOf(binder(), PostUploadHook.class);
+    DynamicSet.setOf(binder(), AccountIndexedListener.class);
+    DynamicSet.setOf(binder(), ChangeIndexedListener.class);
+    DynamicSet.setOf(binder(), GroupIndexedListener.class);
+    DynamicSet.setOf(binder(), ProjectIndexedListener.class);
+    DynamicSet.setOf(binder(), NewProjectCreatedListener.class);
+    DynamicSet.setOf(binder(), ProjectDeletedListener.class);
+    DynamicSet.setOf(binder(), GarbageCollectorListener.class);
+    DynamicSet.setOf(binder(), HeadUpdatedListener.class);
+    DynamicSet.setOf(binder(), UsageDataPublishedListener.class);
+    DynamicSet.bind(binder(), GitReferenceUpdatedListener.class).to(ReindexAfterRefUpdate.class);
+    DynamicSet.bind(binder(), GitReferenceUpdatedListener.class)
+        .to(ProjectConfigEntry.UpdateChecker.class);
+    DynamicSet.setOf(binder(), EventListener.class);
+    DynamicSet.bind(binder(), EventListener.class).to(EventsMetrics.class);
+    DynamicSet.setOf(binder(), UserScopedEventListener.class);
+    DynamicSet.setOf(binder(), CommitValidationListener.class);
+    DynamicSet.setOf(binder(), ChangeMessageModifier.class);
+    DynamicSet.setOf(binder(), RefOperationValidationListener.class);
+    DynamicSet.setOf(binder(), OnSubmitValidationListener.class);
+    DynamicSet.setOf(binder(), MergeValidationListener.class);
+    DynamicSet.setOf(binder(), ProjectCreationValidationListener.class);
+    DynamicSet.setOf(binder(), GroupCreationValidationListener.class);
+    DynamicSet.setOf(binder(), HashtagValidationListener.class);
+    DynamicSet.setOf(binder(), OutgoingEmailValidationListener.class);
+    DynamicSet.setOf(binder(), AccountActivationValidationListener.class);
+    DynamicItem.itemOf(binder(), AvatarProvider.class);
+    DynamicSet.setOf(binder(), LifecycleListener.class);
+    DynamicSet.setOf(binder(), TopMenu.class);
+    DynamicSet.setOf(binder(), MessageOfTheDay.class);
+    DynamicMap.mapOf(binder(), DownloadScheme.class);
+    DynamicMap.mapOf(binder(), DownloadCommand.class);
+    DynamicMap.mapOf(binder(), CloneCommand.class);
+    DynamicMap.mapOf(binder(), ReviewerSuggestion.class);
+    DynamicSet.bind(binder(), GerritConfigListener.class)
+        .toInstance(SuggestReviewers.configListener());
+    DynamicSet.setOf(binder(), ExternalIncludedIn.class);
+    DynamicMap.mapOf(binder(), ProjectConfigEntry.class);
+    DynamicSet.setOf(binder(), PatchSetWebLink.class);
+    DynamicSet.setOf(binder(), ParentWebLink.class);
+    DynamicSet.setOf(binder(), FileWebLink.class);
+    DynamicSet.setOf(binder(), FileHistoryWebLink.class);
+    DynamicSet.setOf(binder(), DiffWebLink.class);
+    DynamicSet.setOf(binder(), ProjectWebLink.class);
+    DynamicSet.setOf(binder(), BranchWebLink.class);
+    DynamicSet.setOf(binder(), TagWebLink.class);
+    DynamicMap.mapOf(binder(), OAuthLoginProvider.class);
+    DynamicItem.itemOf(binder(), OAuthTokenEncrypter.class);
+    DynamicSet.setOf(binder(), AccountExternalIdCreator.class);
+    DynamicSet.setOf(binder(), WebUiPlugin.class);
+    DynamicItem.itemOf(binder(), AccountPatchReviewStore.class);
+    DynamicSet.setOf(binder(), AssigneeValidationListener.class);
+    DynamicSet.setOf(binder(), ActionVisitor.class);
+    DynamicItem.itemOf(binder(), MergeSuperSetComputation.class);
+    DynamicItem.itemOf(binder(), ProjectNameLockManager.class);
+    DynamicSet.setOf(binder(), SubmitRule.class);
+
+    DynamicMap.mapOf(binder(), MailFilter.class);
+    bind(MailFilter.class).annotatedWith(Exports.named("ListMailFilter")).to(ListMailFilter.class);
+    bind(AutoReplyMailFilter.class)
+        .annotatedWith(Exports.named("AutoReplyMailFilter"))
+        .to(AutoReplyMailFilter.class);
+
+    factory(UploadValidators.Factory.class);
+    DynamicSet.setOf(binder(), UploadValidationListener.class);
+
+    DynamicMap.mapOf(binder(), ChangeQueryBuilder.ChangeOperatorFactory.class);
+    DynamicMap.mapOf(binder(), ChangeQueryBuilder.ChangeHasOperandFactory.class);
+    DynamicMap.mapOf(binder(), ChangeQueryProcessor.ChangeAttributeFactory.class);
+
+    install(new GitwebConfig.LegacyModule(cfg));
+
+    bind(AnonymousUser.class);
+
+    factory(AbandonOp.Factory.class);
+    factory(AccountMergeValidator.Factory.class);
+    factory(GroupMergeValidator.Factory.class);
+    factory(RefOperationValidators.Factory.class);
+    factory(OnSubmitValidators.Factory.class);
+    factory(MergeValidators.Factory.class);
+    factory(ProjectConfigValidator.Factory.class);
+    factory(NotesBranchUtil.Factory.class);
+    factory(MergedByPushOp.Factory.class);
+    factory(GitModules.Factory.class);
+    factory(VersionedAuthorizedKeys.Factory.class);
+
+    bind(AccountManager.class);
+
+    bind(new TypeLiteral<List<CommentLinkInfo>>() {}).toProvider(CommentLinkProvider.class);
+    DynamicSet.bind(binder(), GerritConfigListener.class).to(CommentLinkProvider.class);
+
+    bind(ReloadPluginListener.class)
+        .annotatedWith(UniqueAnnotations.create())
+        .to(PluginConfigFactory.class);
+  }
+}
diff --git a/java/com/google/gerrit/server/config/GerritInstanceName.java b/java/com/google/gerrit/server/config/GerritInstanceName.java
new file mode 100644
index 0000000..451e8738
--- /dev/null
+++ b/java/com/google/gerrit/server/config/GerritInstanceName.java
@@ -0,0 +1,30 @@
+// 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.
+
+package com.google.gerrit.server.config;
+
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.inject.BindingAnnotation;
+import java.lang.annotation.Retention;
+
+/**
+ * Marker on a {@link String} holding the instance name for this server.
+ *
+ * <p>Note that the String may be null, if the administrator has not configured the value. Clients
+ * must handle such cases explicitly.
+ */
+@Retention(RUNTIME)
+@BindingAnnotation
+public @interface GerritInstanceName {}
diff --git a/java/com/google/gerrit/server/config/GerritInstanceNameModule.java b/java/com/google/gerrit/server/config/GerritInstanceNameModule.java
new file mode 100644
index 0000000..84fc28a
--- /dev/null
+++ b/java/com/google/gerrit/server/config/GerritInstanceNameModule.java
@@ -0,0 +1,27 @@
+// 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.
+
+package com.google.gerrit.server.config;
+
+import com.google.inject.AbstractModule;
+
+/** Supports binding the {@link GerritInstanceName} annotation. */
+public class GerritInstanceNameModule extends AbstractModule {
+  @Override
+  protected void configure() {
+    bind(String.class)
+        .annotatedWith(GerritInstanceName.class)
+        .toProvider(GerritInstanceNameProvider.class);
+  }
+}
diff --git a/java/com/google/gerrit/server/config/GerritInstanceNameProvider.java b/java/com/google/gerrit/server/config/GerritInstanceNameProvider.java
new file mode 100644
index 0000000..740bb01
--- /dev/null
+++ b/java/com/google/gerrit/server/config/GerritInstanceNameProvider.java
@@ -0,0 +1,68 @@
+// 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.
+
+package com.google.gerrit.server.config;
+
+import com.google.gerrit.common.Nullable;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.net.MalformedURLException;
+import java.net.URL;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.util.SystemReader;
+
+/** Provides {@link GerritInstanceName} from {@code gerrit.name}. */
+@Singleton
+public class GerritInstanceNameProvider implements Provider<String> {
+  private final String instanceName;
+
+  @Inject
+  public GerritInstanceNameProvider(
+      @GerritServerConfig Config config,
+      @CanonicalWebUrl @Nullable Provider<String> canonicalUrlProvider) {
+    this.instanceName = getInstanceName(config, canonicalUrlProvider);
+  }
+
+  @Override
+  public String get() {
+    return instanceName;
+  }
+
+  private static String getInstanceName(
+      Config config, @Nullable Provider<String> canonicalUrlProvider) {
+    String instanceName = config.getString("gerrit", null, "instanceName");
+    if (instanceName != null || canonicalUrlProvider == null) {
+      return instanceName;
+    }
+
+    return extractInstanceName(canonicalUrlProvider.get());
+  }
+
+  private static String extractInstanceName(String canonicalUrl) {
+    if (canonicalUrl != null) {
+      try {
+        return new URL(canonicalUrl).getHost();
+      } catch (MalformedURLException e) {
+        // Try something else.
+      }
+    }
+
+    // Fall back onto whatever the local operating system thinks
+    // this server is called. We hopefully didn't get here as a
+    // good admin would have configured the canonical url.
+    //
+    return SystemReader.getInstance().getHostname();
+  }
+}
diff --git a/java/com/google/gerrit/server/config/GerritOptions.java b/java/com/google/gerrit/server/config/GerritOptions.java
new file mode 100644
index 0000000..0192ddd
--- /dev/null
+++ b/java/com/google/gerrit/server/config/GerritOptions.java
@@ -0,0 +1,47 @@
+// Copyright (C) 2013 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.google.gerrit.server.config;
+
+import org.eclipse.jgit.lib.Config;
+
+public class GerritOptions {
+  private final boolean headless;
+  private final boolean slave;
+  private final boolean enableGwtUi;
+  private final boolean forcePolyGerritDev;
+
+  public GerritOptions(Config cfg, boolean headless, boolean slave, boolean forcePolyGerritDev) {
+    this.slave = slave;
+    this.enableGwtUi = cfg.getBoolean("gerrit", null, "enableGwtUi", true);
+    this.forcePolyGerritDev = forcePolyGerritDev;
+    this.headless = headless;
+  }
+
+  public boolean headless() {
+    return headless;
+  }
+
+  public boolean enableGwtUi() {
+    return !headless && enableGwtUi;
+  }
+
+  public boolean enableMasterFeatures() {
+    return !slave;
+  }
+
+  public boolean forcePolyGerritDev() {
+    return !headless && forcePolyGerritDev;
+  }
+}
diff --git a/java/com/google/gerrit/server/config/GerritRequestModule.java b/java/com/google/gerrit/server/config/GerritRequestModule.java
new file mode 100644
index 0000000..6a1103f
--- /dev/null
+++ b/java/com/google/gerrit/server/config/GerritRequestModule.java
@@ -0,0 +1,32 @@
+// Copyright (C) 2009 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.google.gerrit.server.config;
+
+import static com.google.inject.Scopes.SINGLETON;
+
+import com.google.gerrit.extensions.config.FactoryModule;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.RequestCleanup;
+import com.google.inject.servlet.RequestScoped;
+
+/** Bindings for {@link RequestScoped} entities. */
+public class GerritRequestModule extends FactoryModule {
+  @Override
+  protected void configure() {
+    bind(RequestCleanup.class).in(RequestScoped.class);
+    bind(RequestScopedReviewDbProvider.class);
+    bind(IdentifiedUser.RequestFactory.class).in(SINGLETON);
+  }
+}
diff --git a/java/com/google/gerrit/server/config/GerritRuntime.java b/java/com/google/gerrit/server/config/GerritRuntime.java
new file mode 100644
index 0000000..ac4cede
--- /dev/null
+++ b/java/com/google/gerrit/server/config/GerritRuntime.java
@@ -0,0 +1,24 @@
+// 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.
+
+package com.google.gerrit.server.config;
+
+/** Represents the current runtime environment in which Gerrit is running. */
+public enum GerritRuntime {
+  /** Gerrit is running as a server, with all its features. */
+  DAEMON,
+
+  /** Gerrit is running from the command line, in batch mode (reindex, ...). */
+  BATCH
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerConfig.java b/java/com/google/gerrit/server/config/GerritServerConfig.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerConfig.java
rename to java/com/google/gerrit/server/config/GerritServerConfig.java
diff --git a/java/com/google/gerrit/server/config/GerritServerConfigModule.java b/java/com/google/gerrit/server/config/GerritServerConfigModule.java
new file mode 100644
index 0000000..25ee759
--- /dev/null
+++ b/java/com/google/gerrit/server/config/GerritServerConfigModule.java
@@ -0,0 +1,82 @@
+// Copyright (C) 2009 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.google.gerrit.server.config;
+
+import static com.google.inject.Scopes.SINGLETON;
+
+import com.google.gerrit.server.securestore.DefaultSecureStore;
+import com.google.gerrit.server.securestore.SecureStore;
+import com.google.gerrit.server.securestore.SecureStoreProvider;
+import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.ProvisionException;
+import java.io.IOException;
+import java.nio.file.Path;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.storage.file.FileBasedConfig;
+import org.eclipse.jgit.util.FS;
+
+/** Creates {@link GerritServerConfig}. */
+public class GerritServerConfigModule extends AbstractModule {
+  public static String getSecureStoreClassName(Path sitePath) {
+    if (sitePath != null) {
+      return getSecureStoreFromGerritConfig(sitePath);
+    }
+
+    String secureStoreProperty = System.getProperty("gerrit.secure_store_class");
+    return nullToDefault(secureStoreProperty);
+  }
+
+  private static String getSecureStoreFromGerritConfig(Path sitePath) {
+    AbstractModule m =
+        new AbstractModule() {
+          @Override
+          protected void configure() {
+            bind(Path.class).annotatedWith(SitePath.class).toInstance(sitePath);
+            bind(SitePaths.class);
+          }
+        };
+    Injector injector = Guice.createInjector(m);
+    SitePaths site = injector.getInstance(SitePaths.class);
+    FileBasedConfig cfg = new FileBasedConfig(site.gerrit_config.toFile(), FS.DETECTED);
+    if (!cfg.getFile().exists()) {
+      return DefaultSecureStore.class.getName();
+    }
+
+    try {
+      cfg.load();
+      String className = cfg.getString("gerrit", null, "secureStoreClass");
+      return nullToDefault(className);
+    } catch (IOException | ConfigInvalidException e) {
+      throw new ProvisionException(e.getMessage(), e);
+    }
+  }
+
+  private static String nullToDefault(String className) {
+    return className != null ? className : DefaultSecureStore.class.getName();
+  }
+
+  @Override
+  protected void configure() {
+    bind(SitePaths.class);
+    bind(TrackingFooters.class).toProvider(TrackingFootersProvider.class).in(SINGLETON);
+    bind(Config.class)
+        .annotatedWith(GerritServerConfig.class)
+        .toProvider(GerritServerConfigProvider.class);
+    bind(SecureStore.class).toProvider(SecureStoreProvider.class).in(SINGLETON);
+  }
+}
diff --git a/java/com/google/gerrit/server/config/GerritServerConfigProvider.java b/java/com/google/gerrit/server/config/GerritServerConfigProvider.java
new file mode 100644
index 0000000..8df21da
--- /dev/null
+++ b/java/com/google/gerrit/server/config/GerritServerConfigProvider.java
@@ -0,0 +1,120 @@
+// Copyright (C) 2009 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.google.gerrit.server.config;
+
+import static java.util.stream.Collectors.joining;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gerrit.server.securestore.SecureStore;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.ProvisionException;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.storage.file.FileBasedConfig;
+import org.eclipse.jgit.util.FS;
+
+/**
+ * Provides {@link Config} annotated with {@link GerritServerConfig}.
+ *
+ * <p>To react on config updates, the caller should implement @see GerritConfigListener.
+ *
+ * <p>The few callers that need a reloaded-on-demand config can inject a {@code
+ * GerritServerConfigProvider} and request the lastest config with fetchLatestConfig().
+ */
+@Singleton
+public class GerritServerConfigProvider implements Provider<Config> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final SitePaths site;
+  private final SecureStore secureStore;
+
+  private final Object lock = new Object();
+
+  private GerritConfig gerritConfig;
+
+  @Inject
+  GerritServerConfigProvider(SitePaths site, SecureStore secureStore) {
+    this.site = site;
+    this.secureStore = secureStore;
+    this.gerritConfig = loadConfig();
+  }
+
+  @Override
+  public Config get() {
+    synchronized (lock) {
+      return gerritConfig;
+    }
+  }
+
+  protected ConfigUpdatedEvent updateConfig() {
+    synchronized (lock) {
+      Config oldConfig = gerritConfig;
+      gerritConfig = loadConfig();
+      return new ConfigUpdatedEvent(oldConfig, gerritConfig);
+    }
+  }
+
+  public GerritConfig loadConfig() {
+    FileBasedConfig baseConfig = loadConfig(null, site.gerrit_config);
+    if (!baseConfig.getFile().exists()) {
+      logger.atInfo().log("No %s; assuming defaults", site.gerrit_config.toAbsolutePath());
+    }
+
+    FileBasedConfig noteDbConfigOverBaseConfig = loadConfig(baseConfig, site.notedb_config);
+    checkNoteDbConfig(noteDbConfigOverBaseConfig);
+
+    return new GerritConfig(noteDbConfigOverBaseConfig, baseConfig, secureStore);
+  }
+
+  private static FileBasedConfig loadConfig(@Nullable Config base, Path path) {
+    FileBasedConfig cfg = new FileBasedConfig(base, path.toFile(), FS.DETECTED);
+    try {
+      cfg.load();
+    } catch (IOException | ConfigInvalidException e) {
+      throw new ProvisionException(e.getMessage(), e);
+    }
+    return cfg;
+  }
+
+  private static void checkNoteDbConfig(FileBasedConfig noteDbConfig) {
+    List<String> bad = new ArrayList<>();
+    for (String section : noteDbConfig.getSections()) {
+      if (section.equals(NotesMigration.SECTION_NOTE_DB)) {
+        continue;
+      }
+      for (String subsection : noteDbConfig.getSubsections(section)) {
+        noteDbConfig
+            .getNames(section, subsection, false)
+            .forEach(n -> bad.add(section + "." + subsection + "." + n));
+      }
+      noteDbConfig.getNames(section, false).forEach(n -> bad.add(section + "." + n));
+    }
+    if (!bad.isEmpty()) {
+      throw new ProvisionException(
+          "Non-NoteDb config options not allowed in "
+              + noteDbConfig.getFile()
+              + ":\n"
+              + bad.stream().collect(joining("\n")));
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/config/GerritServerConfigReloader.java b/java/com/google/gerrit/server/config/GerritServerConfigReloader.java
new file mode 100644
index 0000000..09c10740
--- /dev/null
+++ b/java/com/google/gerrit/server/config/GerritServerConfigReloader.java
@@ -0,0 +1,61 @@
+// 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.
+
+package com.google.gerrit.server.config;
+
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.Multimap;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.server.config.ConfigUpdatedEvent.ConfigUpdateEntry;
+import com.google.gerrit.server.config.ConfigUpdatedEvent.UpdateResult;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+/** Issues a configuration reload from the GerritServerConfigProvider and notify all listeners. */
+@Singleton
+public class GerritServerConfigReloader {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final GerritServerConfigProvider configProvider;
+  private final DynamicSet<GerritConfigListener> configListeners;
+
+  @Inject
+  GerritServerConfigReloader(
+      GerritServerConfigProvider configProvider, DynamicSet<GerritConfigListener> configListeners) {
+    this.configProvider = configProvider;
+    this.configListeners = configListeners;
+  }
+
+  /**
+   * Reloads the Gerrit Server Configuration from disk. Synchronized to ensure that one issued
+   * reload is fully completed before a new one starts.
+   */
+  public Multimap<UpdateResult, ConfigUpdateEntry> reloadConfig() {
+    logger.atInfo().log("Starting server configuration reload");
+    Multimap<UpdateResult, ConfigUpdateEntry> updates =
+        fireUpdatedConfigEvent(configProvider.updateConfig());
+    logger.atInfo().log("Server configuration reload completed succesfully");
+    return updates;
+  }
+
+  public Multimap<UpdateResult, ConfigUpdateEntry> fireUpdatedConfigEvent(
+      ConfigUpdatedEvent event) {
+    Multimap<UpdateResult, ConfigUpdateEntry> updates = ArrayListMultimap.create();
+    for (GerritConfigListener configListener : configListeners) {
+      updates.putAll(configListener.configUpdated(event));
+    }
+    return updates;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerId.java b/java/com/google/gerrit/server/config/GerritServerId.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/GerritServerId.java
rename to java/com/google/gerrit/server/config/GerritServerId.java
diff --git a/java/com/google/gerrit/server/config/GerritServerIdProvider.java b/java/com/google/gerrit/server/config/GerritServerIdProvider.java
new file mode 100644
index 0000000..c609cc4
--- /dev/null
+++ b/java/com/google/gerrit/server/config/GerritServerIdProvider.java
@@ -0,0 +1,77 @@
+// 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.
+
+package com.google.gerrit.server.config;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.base.Strings;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.UUID;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.storage.file.FileBasedConfig;
+import org.eclipse.jgit.util.FS;
+
+public class GerritServerIdProvider implements Provider<String> {
+  public static final String SECTION = "gerrit";
+  public static final String KEY = "serverId";
+
+  public static String generate() {
+    return UUID.randomUUID().toString();
+  }
+
+  private final String id;
+
+  @Inject
+  public GerritServerIdProvider(@GerritServerConfig Config cfg, SitePaths sitePaths)
+      throws IOException, ConfigInvalidException {
+    String origId = cfg.getString(SECTION, null, KEY);
+    if (!Strings.isNullOrEmpty(origId)) {
+      id = origId;
+      return;
+    }
+
+    // We're not generally supposed to do work in provider constructors, but this is a bit of a
+    // special case because we really need to have the ID available by the time the dbInjector
+    // is created. This even applies during MigrateToNoteDb, which otherwise would have been a
+    // reasonable place to do the ID generation. Fortunately, it's not much work, and it happens
+    // once.
+    id = generate();
+    Config newCfg = readGerritConfig(sitePaths);
+    newCfg.setString(SECTION, null, KEY, id);
+    Files.write(sitePaths.gerrit_config, newCfg.toText().getBytes(UTF_8));
+  }
+
+  @Override
+  public String get() {
+    return id;
+  }
+
+  private static Config readGerritConfig(SitePaths sitePaths)
+      throws IOException, ConfigInvalidException {
+    // Reread gerrit.config from disk before writing. We can't just use
+    // cfg.toText(), as the @GerritServerConfig only has gerrit.config as a
+    // fallback.
+    FileBasedConfig cfg = new FileBasedConfig(sitePaths.gerrit_config.toFile(), FS.DETECTED);
+    if (!cfg.getFile().exists()) {
+      return new Config();
+    }
+    cfg.load();
+    return cfg;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GitReceivePackGroups.java b/java/com/google/gerrit/server/config/GitReceivePackGroups.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/GitReceivePackGroups.java
rename to java/com/google/gerrit/server/config/GitReceivePackGroups.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GitReceivePackGroupsProvider.java b/java/com/google/gerrit/server/config/GitReceivePackGroupsProvider.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/GitReceivePackGroupsProvider.java
rename to java/com/google/gerrit/server/config/GitReceivePackGroupsProvider.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GitUploadPackGroups.java b/java/com/google/gerrit/server/config/GitUploadPackGroups.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/GitUploadPackGroups.java
rename to java/com/google/gerrit/server/config/GitUploadPackGroups.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GitUploadPackGroupsProvider.java b/java/com/google/gerrit/server/config/GitUploadPackGroupsProvider.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/GitUploadPackGroupsProvider.java
rename to java/com/google/gerrit/server/config/GitUploadPackGroupsProvider.java
diff --git a/java/com/google/gerrit/server/config/GitwebCgiConfig.java b/java/com/google/gerrit/server/config/GitwebCgiConfig.java
new file mode 100644
index 0000000..d7fb83c
--- /dev/null
+++ b/java/com/google/gerrit/server/config/GitwebCgiConfig.java
@@ -0,0 +1,140 @@
+// Copyright (C) 2015 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.google.gerrit.server.config;
+
+import static java.nio.file.Files.isExecutable;
+import static java.nio.file.Files.isRegularFile;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import org.eclipse.jgit.lib.Config;
+
+@Singleton
+public class GitwebCgiConfig {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public GitwebCgiConfig disabled() {
+    return new GitwebCgiConfig();
+  }
+
+  private final Path cgi;
+  private final Path css;
+  private final Path js;
+  private final Path logoPng;
+
+  @Inject
+  GitwebCgiConfig(SitePaths sitePaths, @GerritServerConfig Config cfg) {
+    if (GitwebConfig.isDisabled(cfg)) {
+      cgi = null;
+      css = null;
+      js = null;
+      logoPng = null;
+      return;
+    }
+
+    String cfgCgi = cfg.getString("gitweb", null, "cgi");
+    Path pkgCgi = Paths.get("/usr/lib/cgi-bin/gitweb.cgi");
+    String[] resourcePaths = {
+      "/usr/share/gitweb/static", "/usr/share/gitweb", "/var/www/static", "/var/www",
+    };
+    Path cgi;
+
+    if (cfgCgi != null) {
+      // Use the CGI script configured by the administrator, failing if it
+      // cannot be used as specified.
+      //
+      cgi = sitePaths.resolve(cfgCgi);
+      if (!isRegularFile(cgi)) {
+        throw new IllegalStateException("Cannot find gitweb.cgi: " + cgi);
+      }
+      if (!isExecutable(cgi)) {
+        throw new IllegalStateException("Cannot execute gitweb.cgi: " + cgi);
+      }
+
+      if (!cgi.equals(pkgCgi)) {
+        // Assume the administrator pointed us to the distribution,
+        // which also has the corresponding CSS and logo file.
+        //
+        String absPath = cgi.getParent().toAbsolutePath().toString();
+        resourcePaths = new String[] {absPath + "/static", absPath};
+      }
+
+    } else if (cfg.getString("gitweb", null, "url") != null) {
+      // Use an externally managed gitweb instance, and not an internal one.
+      //
+      cgi = null;
+      resourcePaths = new String[] {};
+
+    } else if (isRegularFile(pkgCgi) && isExecutable(pkgCgi)) {
+      // Use the OS packaged CGI.
+      //
+      logger.atFine().log("Assuming gitweb at %s", pkgCgi);
+      cgi = pkgCgi;
+
+    } else {
+      logger.atWarning().log("gitweb not installed (no %s found)", pkgCgi);
+      cgi = null;
+      resourcePaths = new String[] {};
+    }
+
+    Path css = null;
+    Path js = null;
+    Path logo = null;
+    for (String path : resourcePaths) {
+      Path dir = Paths.get(path);
+      css = dir.resolve("gitweb.css");
+      js = dir.resolve("gitweb.js");
+      logo = dir.resolve("git-logo.png");
+      if (isRegularFile(css) && isRegularFile(logo)) {
+        break;
+      }
+    }
+
+    this.cgi = cgi;
+    this.css = css;
+    this.js = js;
+    this.logoPng = logo;
+  }
+
+  private GitwebCgiConfig() {
+    this.cgi = null;
+    this.css = null;
+    this.js = null;
+    this.logoPng = null;
+  }
+
+  /** @return local path to the CGI executable; null if we shouldn't execute. */
+  public Path getGitwebCgi() {
+    return cgi;
+  }
+
+  /** @return local path of the {@code gitweb.css} matching the CGI. */
+  public Path getGitwebCss() {
+    return css;
+  }
+
+  /** @return local path of the {@code gitweb.js} for the CGI. */
+  public Path getGitwebJs() {
+    return js;
+  }
+
+  /** @return local path of the {@code git-logo.png} for the CGI. */
+  public Path getGitLogoPng() {
+    return logoPng;
+  }
+}
diff --git a/java/com/google/gerrit/server/config/GitwebConfig.java b/java/com/google/gerrit/server/config/GitwebConfig.java
new file mode 100644
index 0000000..b5f09fd
--- /dev/null
+++ b/java/com/google/gerrit/server/config/GitwebConfig.java
@@ -0,0 +1,373 @@
+// Copyright (C) 2009 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.google.gerrit.server.config;
+
+import static com.google.common.base.MoreObjects.firstNonNull;
+import static com.google.common.base.Strings.emptyToNull;
+import static com.google.common.base.Strings.isNullOrEmpty;
+import static com.google.common.base.Strings.nullToEmpty;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.GitwebType;
+import com.google.gerrit.common.data.ParameterizedString;
+import com.google.gerrit.extensions.common.WebLinkInfo;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.restapi.Url;
+import com.google.gerrit.extensions.webui.BranchWebLink;
+import com.google.gerrit.extensions.webui.FileHistoryWebLink;
+import com.google.gerrit.extensions.webui.FileWebLink;
+import com.google.gerrit.extensions.webui.ParentWebLink;
+import com.google.gerrit.extensions.webui.PatchSetWebLink;
+import com.google.gerrit.extensions.webui.ProjectWebLink;
+import com.google.gerrit.extensions.webui.TagWebLink;
+import com.google.inject.AbstractModule;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.net.MalformedURLException;
+import java.net.URL;
+import org.eclipse.jgit.lib.Config;
+
+public class GitwebConfig {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static boolean isDisabled(Config cfg) {
+    return isEmptyString(cfg, "gitweb", null, "url")
+        || isEmptyString(cfg, "gitweb", null, "cgi")
+        || "disabled".equals(cfg.getString("gitweb", null, "type"));
+  }
+
+  public static class LegacyModule extends AbstractModule {
+    private final Config cfg;
+
+    public LegacyModule(Config cfg) {
+      this.cfg = cfg;
+    }
+
+    @Override
+    protected void configure() {
+      GitwebType type = typeFromConfig(cfg);
+      if (type != null) {
+        bind(GitwebType.class).toInstance(type);
+
+        if (!isNullOrEmpty(type.getBranch())) {
+          DynamicSet.bind(binder(), BranchWebLink.class).to(GitwebLinks.class);
+        }
+
+        if (!isNullOrEmpty(type.getTag())) {
+          DynamicSet.bind(binder(), TagWebLink.class).to(GitwebLinks.class);
+        }
+
+        if (!isNullOrEmpty(type.getFile()) || !isNullOrEmpty(type.getRootTree())) {
+          DynamicSet.bind(binder(), FileWebLink.class).to(GitwebLinks.class);
+        }
+
+        if (!isNullOrEmpty(type.getFileHistory())) {
+          DynamicSet.bind(binder(), FileHistoryWebLink.class).to(GitwebLinks.class);
+        }
+
+        if (!isNullOrEmpty(type.getRevision())) {
+          DynamicSet.bind(binder(), PatchSetWebLink.class).to(GitwebLinks.class);
+          DynamicSet.bind(binder(), ParentWebLink.class).to(GitwebLinks.class);
+        }
+
+        if (!isNullOrEmpty(type.getProject())) {
+          DynamicSet.bind(binder(), ProjectWebLink.class).to(GitwebLinks.class);
+        }
+      }
+    }
+  }
+
+  private static boolean isEmptyString(Config cfg, String section, String subsection, String name) {
+    // This is currently the only way to check for the empty string in a JGit
+    // config. Fun!
+    String[] values = cfg.getStringList(section, subsection, name);
+    return values.length > 0 && isNullOrEmpty(values[0]);
+  }
+
+  private static GitwebType typeFromConfig(Config cfg) {
+    GitwebType defaultType = defaultType(cfg.getString("gitweb", null, "type"));
+    if (defaultType == null) {
+      return null;
+    }
+    GitwebType type = new GitwebType();
+
+    type.setLinkName(
+        firstNonNull(cfg.getString("gitweb", null, "linkname"), defaultType.getLinkName()));
+    type.setBranch(firstNonNull(cfg.getString("gitweb", null, "branch"), defaultType.getBranch()));
+    type.setTag(firstNonNull(cfg.getString("gitweb", null, "tag"), defaultType.getTag()));
+    type.setProject(
+        firstNonNull(cfg.getString("gitweb", null, "project"), defaultType.getProject()));
+    type.setRevision(
+        firstNonNull(cfg.getString("gitweb", null, "revision"), defaultType.getRevision()));
+    type.setRootTree(
+        firstNonNull(cfg.getString("gitweb", null, "roottree"), defaultType.getRootTree()));
+    type.setFile(firstNonNull(cfg.getString("gitweb", null, "file"), defaultType.getFile()));
+    type.setFileHistory(
+        firstNonNull(cfg.getString("gitweb", null, "filehistory"), defaultType.getFileHistory()));
+    type.setUrlEncode(cfg.getBoolean("gitweb", null, "urlencode", defaultType.getUrlEncode()));
+    String pathSeparator = cfg.getString("gitweb", null, "pathSeparator");
+    if (pathSeparator != null) {
+      if (pathSeparator.length() == 1) {
+        char c = pathSeparator.charAt(0);
+        if (isValidPathSeparator(c)) {
+          type.setPathSeparator(firstNonNull(c, defaultType.getPathSeparator()));
+        } else {
+          logger.atWarning().log("Invalid gitweb.pathSeparator: %s", c);
+        }
+      } else {
+        logger.atWarning().log("gitweb.pathSeparator is not a single character: %s", pathSeparator);
+      }
+    }
+    return type;
+  }
+
+  private static GitwebType defaultType(String typeName) {
+    GitwebType type = new GitwebType();
+    switch (nullToEmpty(typeName)) {
+      case "gitweb":
+        type.setLinkName("gitweb");
+        type.setProject("?p=${project}.git;a=summary");
+        type.setRevision("?p=${project}.git;a=commit;h=${commit}");
+        type.setBranch("?p=${project}.git;a=shortlog;h=${branch}");
+        type.setTag("?p=${project}.git;a=tag;h=${tag}");
+        type.setRootTree("?p=${project}.git;a=tree;hb=${commit}");
+        type.setFile("?p=${project}.git;hb=${commit};f=${file}");
+        type.setFileHistory("?p=${project}.git;a=history;hb=${branch};f=${file}");
+        break;
+      case "cgit":
+        type.setLinkName("cgit");
+        type.setProject("${project}.git/summary");
+        type.setRevision("${project}.git/commit/?id=${commit}");
+        type.setBranch("${project}.git/log/?h=${branch}");
+        type.setTag("${project}.git/tag/?h=${tag}");
+        type.setRootTree("${project}.git/tree/?h=${commit}");
+        type.setFile("${project}.git/tree/${file}?h=${commit}");
+        type.setFileHistory("${project}.git/log/${file}?h=${branch}");
+        break;
+      case "custom":
+        // For a custom type with no explicit link name, just reuse "gitweb".
+        type.setLinkName("gitweb");
+        type.setProject("");
+        type.setRevision("");
+        type.setBranch("");
+        type.setTag("");
+        type.setRootTree("");
+        type.setFile("");
+        type.setFileHistory("");
+        break;
+      case "":
+      case "disabled":
+      default:
+        return null;
+    }
+    return type;
+  }
+
+  private final String url;
+  private final GitwebType type;
+
+  @Inject
+  GitwebConfig(
+      GitwebCgiConfig cgiConfig,
+      @GerritServerConfig Config cfg,
+      @Nullable @CanonicalWebUrl String gerritUrl)
+      throws MalformedURLException {
+    if (isDisabled(cfg)) {
+      type = null;
+      url = null;
+    } else {
+      String cfgUrl = cfg.getString("gitweb", null, "url");
+      type = typeFromConfig(cfg);
+      if (type == null) {
+        url = null;
+      } else if (cgiConfig.getGitwebCgi() == null) {
+        // Use an externally managed gitweb instance, and not an internal one.
+        url = cfgUrl;
+      } else {
+        String baseGerritUrl;
+        if (gerritUrl != null) {
+          URL u = new URL(gerritUrl);
+          baseGerritUrl = u.getPath();
+        } else {
+          baseGerritUrl = "/";
+        }
+        url = firstNonNull(cfgUrl, baseGerritUrl + "gitweb");
+      }
+    }
+  }
+
+  /** @return GitwebType for gitweb viewer. */
+  @Nullable
+  public GitwebType getGitwebType() {
+    return type;
+  }
+
+  /**
+   * @return URL of the entry point into gitweb. This URL may be relative to our context if gitweb
+   *     is hosted by ourselves; or absolute if its hosted elsewhere; or null if gitweb has not been
+   *     configured.
+   */
+  public String getUrl() {
+    return url;
+  }
+
+  /**
+   * Determines if a given character can be used unencoded in an URL as a replacement for the path
+   * separator '/'.
+   *
+   * <p>Reasoning: http://www.ietf.org/rfc/rfc1738.txt § 2.2:
+   *
+   * <p>... only alphanumerics, the special characters "$-_.+!*'(),", and reserved characters used
+   * for their reserved purposes may be used unencoded within a URL.
+   *
+   * <p>The following characters might occur in file names, however:
+   *
+   * <p>alphanumeric characters,
+   *
+   * <p>"$-_.+!',"
+   */
+  static boolean isValidPathSeparator(char c) {
+    switch (c) {
+      case '*':
+      case '(':
+      case ')':
+        return true;
+      default:
+        return false;
+    }
+  }
+
+  @Singleton
+  static class GitwebLinks
+      implements BranchWebLink,
+          FileHistoryWebLink,
+          FileWebLink,
+          PatchSetWebLink,
+          ParentWebLink,
+          ProjectWebLink,
+          TagWebLink {
+    private final String url;
+    private final GitwebType type;
+    private final ParameterizedString branch;
+    private final ParameterizedString file;
+    private final ParameterizedString fileHistory;
+    private final ParameterizedString project;
+    private final ParameterizedString revision;
+    private final ParameterizedString tag;
+
+    @Inject
+    GitwebLinks(GitwebConfig config, GitwebType type) {
+      this.url = config.getUrl();
+      this.type = type;
+      this.branch = parse(type.getBranch());
+      this.file = parse(firstNonNull(emptyToNull(type.getFile()), nullToEmpty(type.getRootTree())));
+      this.fileHistory = parse(type.getFileHistory());
+      this.project = parse(type.getProject());
+      this.revision = parse(type.getRevision());
+      this.tag = parse(type.getTag());
+    }
+
+    @Override
+    public WebLinkInfo getBranchWebLink(String projectName, String branchName) {
+      if (branch != null) {
+        return link(
+            branch
+                .replace("project", encode(projectName))
+                .replace("branch", encode(branchName))
+                .toString());
+      }
+      return null;
+    }
+
+    @Override
+    public WebLinkInfo getTagWebLink(String projectName, String tagName) {
+      if (tag != null) {
+        return link(
+            tag.replace("project", encode(projectName)).replace("tag", encode(tagName)).toString());
+      }
+      return null;
+    }
+
+    @Override
+    public WebLinkInfo getFileHistoryWebLink(String projectName, String revision, String fileName) {
+      if (fileHistory != null) {
+        return link(
+            fileHistory
+                .replace("project", encode(projectName))
+                .replace("branch", encode(revision))
+                .replace("file", encode(fileName))
+                .toString());
+      }
+      return null;
+    }
+
+    @Override
+    public WebLinkInfo getFileWebLink(String projectName, String revision, String fileName) {
+      if (file != null) {
+        return link(
+            file.replace("project", encode(projectName))
+                .replace("commit", encode(revision))
+                .replace("file", encode(fileName))
+                .toString());
+      }
+      return null;
+    }
+
+    @Override
+    public WebLinkInfo getPatchSetWebLink(String projectName, String commit) {
+      if (revision != null) {
+        return link(
+            revision
+                .replace("project", encode(projectName))
+                .replace("commit", encode(commit))
+                .toString());
+      }
+      return null;
+    }
+
+    @Override
+    public WebLinkInfo getParentWebLink(String projectName, String commit) {
+      // For Gitweb treat parent revision links the same as patch set links
+      return getPatchSetWebLink(projectName, commit);
+    }
+
+    @Override
+    public WebLinkInfo getProjectWeblink(String projectName) {
+      if (project != null) {
+        return link(project.replace("project", encode(projectName)).toString());
+      }
+      return null;
+    }
+
+    private String encode(String val) {
+      if (type.getUrlEncode()) {
+        return Url.encode(type.replacePathSeparator(val));
+      }
+      return val;
+    }
+
+    private WebLinkInfo link(String rest) {
+      return new WebLinkInfo(type.getLinkName(), null, url + rest, null);
+    }
+
+    private static ParameterizedString parse(String pattern) {
+      if (!isNullOrEmpty(pattern)) {
+        return new ParameterizedString(pattern);
+      }
+      return null;
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GlobalPluginConfig.java b/java/com/google/gerrit/server/config/GlobalPluginConfig.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/GlobalPluginConfig.java
rename to java/com/google/gerrit/server/config/GlobalPluginConfig.java
diff --git a/java/com/google/gerrit/server/config/GroupSetProvider.java b/java/com/google/gerrit/server/config/GroupSetProvider.java
new file mode 100644
index 0000000..2255a67
--- /dev/null
+++ b/java/com/google/gerrit/server/config/GroupSetProvider.java
@@ -0,0 +1,62 @@
+// Copyright (C) 2010 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.google.gerrit.server.config;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.account.GroupBackends;
+import com.google.gerrit.server.util.RequestContext;
+import com.google.gerrit.server.util.ServerRequestContext;
+import com.google.gerrit.server.util.ThreadLocalRequestContext;
+import com.google.inject.Provider;
+import java.util.List;
+import java.util.Set;
+
+/** Parses groups referenced in the {@code gerrit.config} file. */
+public abstract class GroupSetProvider implements Provider<Set<AccountGroup.UUID>> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  protected Set<AccountGroup.UUID> groupIds;
+
+  protected GroupSetProvider(
+      GroupBackend groupBackend,
+      ThreadLocalRequestContext threadContext,
+      ServerRequestContext serverCtx,
+      List<String> groupNames) {
+    RequestContext ctx = threadContext.setContext(serverCtx);
+    try {
+      ImmutableSet.Builder<AccountGroup.UUID> builder = ImmutableSet.builder();
+      for (String n : groupNames) {
+        GroupReference g = GroupBackends.findBestSuggestion(groupBackend, n);
+        if (g != null) {
+          builder.add(g.getUUID());
+        } else {
+          logger.atWarning().log("Group \"%s\" not available, skipping.", n);
+        }
+      }
+      groupIds = builder.build();
+    } finally {
+      threadContext.setContext(ctx);
+    }
+  }
+
+  @Override
+  public Set<AccountGroup.UUID> get() {
+    return groupIds;
+  }
+}
diff --git a/java/com/google/gerrit/server/config/PluginConfig.java b/java/com/google/gerrit/server/config/PluginConfig.java
new file mode 100644
index 0000000..13c5442
--- /dev/null
+++ b/java/com/google/gerrit/server/config/PluginConfig.java
@@ -0,0 +1,170 @@
+// Copyright (C) 2013 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.google.gerrit.server.config;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
+import com.google.common.collect.Iterables;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.server.project.ProjectState;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Config;
+
+public class PluginConfig {
+  private static final String PLUGIN = "plugin";
+
+  private final String pluginName;
+  private Config cfg;
+  private final ProjectConfig projectConfig;
+
+  public PluginConfig(String pluginName, Config cfg) {
+    this(pluginName, cfg, null);
+  }
+
+  public PluginConfig(String pluginName, Config cfg, ProjectConfig projectConfig) {
+    this.pluginName = pluginName;
+    this.cfg = cfg;
+    this.projectConfig = projectConfig;
+  }
+
+  PluginConfig withInheritance(ProjectState.Factory projectStateFactory) {
+    if (projectConfig == null) {
+      return this;
+    }
+
+    ProjectState state = projectStateFactory.create(projectConfig);
+    ProjectState parent = Iterables.getFirst(state.parents(), null);
+    if (parent != null) {
+      PluginConfig parentPluginConfig =
+          parent.getConfig().getPluginConfig(pluginName).withInheritance(projectStateFactory);
+      Set<String> allNames = cfg.getNames(PLUGIN, pluginName);
+      cfg = copyConfig(cfg);
+      for (String name : parentPluginConfig.cfg.getNames(PLUGIN, pluginName)) {
+        if (!allNames.contains(name)) {
+          List<String> values =
+              Arrays.asList(parentPluginConfig.cfg.getStringList(PLUGIN, pluginName, name));
+          for (String value : values) {
+            GroupReference groupRef =
+                parentPluginConfig.projectConfig.getGroup(GroupReference.extractGroupName(value));
+            if (groupRef != null) {
+              projectConfig.resolve(groupRef);
+            }
+          }
+          cfg.setStringList(PLUGIN, pluginName, name, values);
+        }
+      }
+    }
+    return this;
+  }
+
+  private static Config copyConfig(Config cfg) {
+    Config copiedCfg = new Config();
+    try {
+      copiedCfg.fromText(cfg.toText());
+    } catch (ConfigInvalidException e) {
+      // cannot happen
+      throw new IllegalStateException(e);
+    }
+    return copiedCfg;
+  }
+
+  public String getString(String name) {
+    return cfg.getString(PLUGIN, pluginName, name);
+  }
+
+  public String getString(String name, String defaultValue) {
+    if (defaultValue == null) {
+      return cfg.getString(PLUGIN, pluginName, name);
+    }
+    return MoreObjects.firstNonNull(cfg.getString(PLUGIN, pluginName, name), defaultValue);
+  }
+
+  public void setString(String name, String value) {
+    if (Strings.isNullOrEmpty(value)) {
+      cfg.unset(PLUGIN, pluginName, name);
+    } else {
+      cfg.setString(PLUGIN, pluginName, name, value);
+    }
+  }
+
+  public String[] getStringList(String name) {
+    return cfg.getStringList(PLUGIN, pluginName, name);
+  }
+
+  public void setStringList(String name, List<String> values) {
+    if (values == null || values.isEmpty()) {
+      cfg.unset(PLUGIN, pluginName, name);
+    } else {
+      cfg.setStringList(PLUGIN, pluginName, name, values);
+    }
+  }
+
+  public int getInt(String name, int defaultValue) {
+    return cfg.getInt(PLUGIN, pluginName, name, defaultValue);
+  }
+
+  public void setInt(String name, int value) {
+    cfg.setInt(PLUGIN, pluginName, name, value);
+  }
+
+  public long getLong(String name, long defaultValue) {
+    return cfg.getLong(PLUGIN, pluginName, name, defaultValue);
+  }
+
+  public void setLong(String name, long value) {
+    cfg.setLong(PLUGIN, pluginName, name, value);
+  }
+
+  public boolean getBoolean(String name, boolean defaultValue) {
+    return cfg.getBoolean(PLUGIN, pluginName, name, defaultValue);
+  }
+
+  public void setBoolean(String name, boolean value) {
+    cfg.setBoolean(PLUGIN, pluginName, name, value);
+  }
+
+  public <T extends Enum<?>> T getEnum(String name, T defaultValue) {
+    return cfg.getEnum(PLUGIN, pluginName, name, defaultValue);
+  }
+
+  public <T extends Enum<?>> void setEnum(String name, T value) {
+    cfg.setEnum(PLUGIN, pluginName, name, value);
+  }
+
+  public <T extends Enum<?>> T getEnum(T[] all, String name, T defaultValue) {
+    return cfg.getEnum(all, PLUGIN, pluginName, name, defaultValue);
+  }
+
+  public void unset(String name) {
+    cfg.unset(PLUGIN, pluginName, name);
+  }
+
+  public Set<String> getNames() {
+    return cfg.getNames(PLUGIN, pluginName, true);
+  }
+
+  public GroupReference getGroupReference(String name) {
+    return projectConfig.getGroup(GroupReference.extractGroupName(getString(name)));
+  }
+
+  public void setGroupReference(String name, GroupReference value) {
+    GroupReference groupRef = projectConfig.resolve(value);
+    setString(name, groupRef.toConfigValue());
+  }
+}
diff --git a/java/com/google/gerrit/server/config/PluginConfigFactory.java b/java/com/google/gerrit/server/config/PluginConfigFactory.java
new file mode 100644
index 0000000..69b300d
--- /dev/null
+++ b/java/com/google/gerrit/server/config/PluginConfigFactory.java
@@ -0,0 +1,377 @@
+// Copyright (C) 2013 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.google.gerrit.server.config;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.plugins.Plugin;
+import com.google.gerrit.server.plugins.ReloadPluginListener;
+import com.google.gerrit.server.project.NoSuchProjectException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectLevelConfig;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.securestore.SecureStore;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.internal.storage.file.FileSnapshot;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.storage.file.FileBasedConfig;
+import org.eclipse.jgit.util.FS;
+
+@Singleton
+public class PluginConfigFactory implements ReloadPluginListener {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final String EXTENSION = ".config";
+
+  private final SitePaths site;
+  private final Provider<Config> cfgProvider;
+  private final ProjectCache projectCache;
+  private final ProjectState.Factory projectStateFactory;
+  private final SecureStore secureStore;
+  private final Map<String, Config> pluginConfigs;
+
+  private volatile FileSnapshot cfgSnapshot;
+  private volatile Config cfg;
+
+  @Inject
+  PluginConfigFactory(
+      SitePaths site,
+      @GerritServerConfig Provider<Config> cfgProvider,
+      ProjectCache projectCache,
+      ProjectState.Factory projectStateFactory,
+      SecureStore secureStore) {
+    this.site = site;
+    this.cfgProvider = cfgProvider;
+    this.projectCache = projectCache;
+    this.projectStateFactory = projectStateFactory;
+    this.secureStore = secureStore;
+
+    this.pluginConfigs = new HashMap<>();
+    this.cfgSnapshot = FileSnapshot.save(site.gerrit_config.toFile());
+    this.cfg = cfgProvider.get();
+  }
+
+  /**
+   * Returns the configuration for the specified plugin that is stored in the 'gerrit.config' file.
+   *
+   * <p>The returned plugin configuration provides access to all parameters of the 'gerrit.config'
+   * file that are set in the 'plugin' subsection of the specified plugin.
+   *
+   * <p>E.g.: [plugin "my-plugin"] myKey = myValue
+   *
+   * @param pluginName the name of the plugin for which the configuration should be returned
+   * @return the plugin configuration from the 'gerrit.config' file
+   */
+  public PluginConfig getFromGerritConfig(String pluginName) {
+    return getFromGerritConfig(pluginName, false);
+  }
+
+  /**
+   * Returns the configuration for the specified plugin that is stored in the 'gerrit.config' file.
+   *
+   * <p>The returned plugin configuration provides access to all parameters of the 'gerrit.config'
+   * file that are set in the 'plugin' subsection of the specified plugin.
+   *
+   * <p>E.g.: [plugin "my-plugin"] myKey = myValue
+   *
+   * @param pluginName the name of the plugin for which the configuration should be returned
+   * @param refresh if <code>true</code> it is checked if the 'gerrit.config' file was modified and
+   *     if yes the Gerrit configuration is reloaded, if <code>false</code> the cached Gerrit
+   *     configuration is used
+   * @return the plugin configuration from the 'gerrit.config' file
+   */
+  public PluginConfig getFromGerritConfig(String pluginName, boolean refresh) {
+    if (refresh && secureStore.isOutdated()) {
+      secureStore.reload();
+    }
+    File configFile = site.gerrit_config.toFile();
+    if (refresh && cfgSnapshot.isModified(configFile)) {
+      cfgSnapshot = FileSnapshot.save(configFile);
+      cfg = cfgProvider.get();
+    }
+    return new PluginConfig(pluginName, cfg);
+  }
+
+  /**
+   * Returns the configuration for the specified plugin that is stored in the 'project.config' file
+   * of the specified project.
+   *
+   * <p>The returned plugin configuration provides access to all parameters of the 'project.config'
+   * file that are set in the 'plugin' subsection of the specified plugin.
+   *
+   * <p>E.g.: [plugin "my-plugin"] myKey = myValue
+   *
+   * @param projectName the name of the project for which the plugin configuration should be
+   *     returned
+   * @param pluginName the name of the plugin for which the configuration should be returned
+   * @return the plugin configuration from the 'project.config' file of the specified project
+   * @throws NoSuchProjectException thrown if the specified project does not exist
+   */
+  public PluginConfig getFromProjectConfig(Project.NameKey projectName, String pluginName)
+      throws NoSuchProjectException {
+    ProjectState projectState = projectCache.get(projectName);
+    if (projectState == null) {
+      throw new NoSuchProjectException(projectName);
+    }
+    return getFromProjectConfig(projectState, pluginName);
+  }
+
+  /**
+   * Returns the configuration for the specified plugin that is stored in the 'project.config' file
+   * of the specified project.
+   *
+   * <p>The returned plugin configuration provides access to all parameters of the 'project.config'
+   * file that are set in the 'plugin' subsection of the specified plugin.
+   *
+   * <p>E.g.: [plugin "my-plugin"] myKey = myValue
+   *
+   * @param projectState the project for which the plugin configuration should be returned
+   * @param pluginName the name of the plugin for which the configuration should be returned
+   * @return the plugin configuration from the 'project.config' file of the specified project
+   */
+  public PluginConfig getFromProjectConfig(ProjectState projectState, String pluginName) {
+    return projectState.getConfig().getPluginConfig(pluginName);
+  }
+
+  /**
+   * Returns the configuration for the specified plugin that is stored in the 'project.config' file
+   * of the specified project. Parameters which are not set in the 'project.config' of this project
+   * are inherited from the parent project's 'project.config' files.
+   *
+   * <p>The returned plugin configuration provides access to all parameters of the 'project.config'
+   * file that are set in the 'plugin' subsection of the specified plugin.
+   *
+   * <p>E.g.: child project: [plugin "my-plugin"] myKey = childValue
+   *
+   * <p>parent project: [plugin "my-plugin"] myKey = parentValue anotherKey = someValue
+   *
+   * <p>return: [plugin "my-plugin"] myKey = childValue anotherKey = someValue
+   *
+   * @param projectName the name of the project for which the plugin configuration should be
+   *     returned
+   * @param pluginName the name of the plugin for which the configuration should be returned
+   * @return the plugin configuration from the 'project.config' file of the specified project with
+   *     inherited non-set parameters from the parent projects
+   * @throws NoSuchProjectException thrown if the specified project does not exist
+   */
+  public PluginConfig getFromProjectConfigWithInheritance(
+      Project.NameKey projectName, String pluginName) throws NoSuchProjectException {
+    return getFromProjectConfig(projectName, pluginName).withInheritance(projectStateFactory);
+  }
+
+  /**
+   * Returns the configuration for the specified plugin that is stored in the 'project.config' file
+   * of the specified project. Parameters which are not set in the 'project.config' of this project
+   * are inherited from the parent project's 'project.config' files.
+   *
+   * <p>The returned plugin configuration provides access to all parameters of the 'project.config'
+   * file that are set in the 'plugin' subsection of the specified plugin.
+   *
+   * <p>E.g.: child project: [plugin "my-plugin"] myKey = childValue
+   *
+   * <p>parent project: [plugin "my-plugin"] myKey = parentValue anotherKey = someValue
+   *
+   * <p>return: [plugin "my-plugin"] myKey = childValue anotherKey = someValue
+   *
+   * @param projectState the project for which the plugin configuration should be returned
+   * @param pluginName the name of the plugin for which the configuration should be returned
+   * @return the plugin configuration from the 'project.config' file of the specified project with
+   *     inherited non-set parameters from the parent projects
+   */
+  public PluginConfig getFromProjectConfigWithInheritance(
+      ProjectState projectState, String pluginName) {
+    return getFromProjectConfig(projectState, pluginName).withInheritance(projectStateFactory);
+  }
+
+  /**
+   * Returns the configuration for the specified plugin that is stored in the plugin configuration
+   * file '{@code etc/<plugin-name>.config}'.
+   *
+   * <p>The plugin configuration is only loaded once and is then cached.
+   *
+   * @param pluginName the name of the plugin for which the configuration should be returned
+   * @return the plugin configuration from the '{@code etc/<plugin-name>.config}' file
+   */
+  public synchronized Config getGlobalPluginConfig(String pluginName) {
+    if (pluginConfigs.containsKey(pluginName)) {
+      return pluginConfigs.get(pluginName);
+    }
+
+    Path pluginConfigFile = site.etc_dir.resolve(pluginName + ".config");
+    FileBasedConfig cfg = new FileBasedConfig(pluginConfigFile.toFile(), FS.DETECTED);
+    GlobalPluginConfig pluginConfig = new GlobalPluginConfig(pluginName, cfg, secureStore);
+    pluginConfigs.put(pluginName, pluginConfig);
+    if (!cfg.getFile().exists()) {
+      logger.atInfo().log("No %s; assuming defaults", pluginConfigFile.toAbsolutePath());
+      return pluginConfig;
+    }
+
+    try {
+      cfg.load();
+    } catch (ConfigInvalidException e) {
+      // This is an error in user input, don't spam logs with a stack trace.
+      logger.atWarning().log("Failed to load %s: %s", pluginConfigFile.toAbsolutePath(), e);
+    } catch (IOException e) {
+      logger.atWarning().withCause(e).log("Failed to load %s", pluginConfigFile.toAbsolutePath());
+    }
+
+    return pluginConfig;
+  }
+
+  /**
+   * Returns the configuration for the specified plugin that is stored in the '{@code
+   * <plugin-name>.config}' file in the 'refs/meta/config' branch of the specified project.
+   *
+   * @param projectName the name of the project for which the plugin configuration should be
+   *     returned
+   * @param pluginName the name of the plugin for which the configuration should be returned
+   * @return the plugin configuration from the '{@code <plugin-name>.config}' file of the specified
+   *     project
+   * @throws NoSuchProjectException thrown if the specified project does not exist
+   */
+  public Config getProjectPluginConfig(Project.NameKey projectName, String pluginName)
+      throws NoSuchProjectException {
+    return getPluginConfig(projectName, pluginName).get();
+  }
+
+  /**
+   * Returns the configuration for the specified plugin that is stored in the '{@code
+   * <plugin-name>.config}' file in the 'refs/meta/config' branch of the specified project.
+   *
+   * @param projectState the project for which the plugin configuration should be returned
+   * @param pluginName the name of the plugin for which the configuration should be returned
+   * @return the plugin configuration from the '{@code <plugin-name>.config}' file of the specified
+   *     project
+   */
+  public Config getProjectPluginConfig(ProjectState projectState, String pluginName) {
+    return projectState.getConfig(pluginName + EXTENSION).get();
+  }
+
+  /**
+   * Returns the configuration for the specified plugin that is stored in the '{@code
+   * <plugin-name>.config}' file in the 'refs/meta/config' branch of the specified project.
+   * Parameters which are not set in the '{@code <plugin-name>.config}' of this project are
+   * inherited from the parent project's '{@code <plugin-name>.config}' files.
+   *
+   * <p>E.g.: child project: [mySection "mySubsection"] myKey = childValue
+   *
+   * <p>parent project: [mySection "mySubsection"] myKey = parentValue anotherKey = someValue
+   *
+   * <p>return: [mySection "mySubsection"] myKey = childValue anotherKey = someValue
+   *
+   * @param projectName the name of the project for which the plugin configuration should be
+   *     returned
+   * @param pluginName the name of the plugin for which the configuration should be returned
+   * @return the plugin configuration from the '{@code <plugin-name>.config}' file of the specified
+   *     project with inheriting non-set parameters from the parent projects
+   * @throws NoSuchProjectException thrown if the specified project does not exist
+   */
+  public Config getProjectPluginConfigWithInheritance(
+      Project.NameKey projectName, String pluginName) throws NoSuchProjectException {
+    return getPluginConfig(projectName, pluginName).getWithInheritance(false);
+  }
+
+  /**
+   * Returns the configuration for the specified plugin that is stored in the '{@code
+   * <plugin-name>.config}' file in the 'refs/meta/config' branch of the specified project.
+   * Parameters which are not set in the '{@code <plugin-name>.config}' of this project are
+   * inherited from the parent project's '{@code <plugin-name>.config}' files.
+   *
+   * <p>E.g.: child project: [mySection "mySubsection"] myKey = childValue
+   *
+   * <p>parent project: [mySection "mySubsection"] myKey = parentValue anotherKey = someValue
+   *
+   * <p>return: [mySection "mySubsection"] myKey = childValue anotherKey = someValue
+   *
+   * @param projectState the project for which the plugin configuration should be returned
+   * @param pluginName the name of the plugin for which the configuration should be returned
+   * @return the plugin configuration from the '{@code <plugin-name>.config}' file of the specified
+   *     project with inheriting non-set parameters from the parent projects
+   */
+  public Config getProjectPluginConfigWithInheritance(
+      ProjectState projectState, String pluginName) {
+    return projectState.getConfig(pluginName + EXTENSION).getWithInheritance(false);
+  }
+
+  /**
+   * Returns the configuration for the specified plugin that is stored in the '{@code
+   * <plugin-name>.config}' file in the 'refs/meta/config' branch of the specified project.
+   * Parameters from the '{@code <plugin-name>.config}' of the parent project are appended to this
+   * project's '{@code <plugin-name>.config}' files.
+   *
+   * <p>E.g.: child project: [mySection "mySubsection"] myKey = childValue
+   *
+   * <p>parent project: [mySection "mySubsection"] myKey = parentValue anotherKey = someValue
+   *
+   * <p>return: [mySection "mySubsection"] myKey = childValue myKey = parentValue anotherKey =
+   * someValue
+   *
+   * @param projectName the name of the project for which the plugin configuration should be
+   *     returned
+   * @param pluginName the name of the plugin for which the configuration should be returned
+   * @return the plugin configuration from the '{@code <plugin-name>.config}' file of the specified
+   *     project with parameters from the parent projects appended to the project values
+   * @throws NoSuchProjectException thrown if the specified project does not exist
+   */
+  public Config getProjectPluginConfigWithMergedInheritance(
+      Project.NameKey projectName, String pluginName) throws NoSuchProjectException {
+    return getPluginConfig(projectName, pluginName).getWithInheritance(true);
+  }
+
+  /**
+   * Returns the configuration for the specified plugin that is stored in the '{@code
+   * <plugin-name>.config}' file in the 'refs/meta/config' branch of the specified project.
+   * Parameters from the '{@code <plugin-name>.config}' of the parent project are appended to this
+   * project's '{@code <plugin-name>.config}' files.
+   *
+   * <p>E.g.: child project: [mySection "mySubsection"] myKey = childValue
+   *
+   * <p>parent project: [mySection "mySubsection"] myKey = parentValue anotherKey = someValue
+   *
+   * <p>return: [mySection "mySubsection"] myKey = childValue myKey = parentValue anotherKey =
+   * someValue
+   *
+   * @param projectState the project for which the plugin configuration should be returned
+   * @param pluginName the name of the plugin for which the configuration should be returned
+   * @return the plugin configuration from the '{@code <plugin-name>.config}' file of the specified
+   *     project with inheriting non-set parameters from the parent projects
+   */
+  public Config getProjectPluginConfigWithMergedInheritance(
+      ProjectState projectState, String pluginName) {
+    return projectState.getConfig(pluginName + EXTENSION).getWithInheritance(true);
+  }
+
+  private ProjectLevelConfig getPluginConfig(Project.NameKey projectName, String pluginName)
+      throws NoSuchProjectException {
+    ProjectState projectState = projectCache.get(projectName);
+    if (projectState == null) {
+      throw new NoSuchProjectException(projectName);
+    }
+    return projectState.getConfig(pluginName + EXTENSION);
+  }
+
+  @Override
+  public synchronized void onReloadPlugin(Plugin oldPlugin, Plugin newPlugin) {
+    pluginConfigs.remove(oldPlugin.getName());
+  }
+}
diff --git a/java/com/google/gerrit/server/config/ProjectConfigEntry.java b/java/com/google/gerrit/server/config/ProjectConfigEntry.java
new file mode 100644
index 0000000..5515f0e
--- /dev/null
+++ b/java/com/google/gerrit/server/config/ProjectConfigEntry.java
@@ -0,0 +1,390 @@
+// Copyright (C) 2013 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.google.gerrit.server.config;
+
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.annotations.ExtensionPoint;
+import com.google.gerrit.extensions.api.projects.ConfigValue;
+import com.google.gerrit.extensions.api.projects.ProjectConfigEntryType;
+import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.registration.Extension;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.inject.Inject;
+import com.google.inject.ProvisionException;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+
+@ExtensionPoint
+public class ProjectConfigEntry {
+  private final String displayName;
+  private final String description;
+  private final boolean inheritable;
+  private final String defaultValue;
+  private final ProjectConfigEntryType type;
+  private final List<String> permittedValues;
+
+  public ProjectConfigEntry(String displayName, String defaultValue) {
+    this(displayName, defaultValue, false);
+  }
+
+  public ProjectConfigEntry(String displayName, String defaultValue, boolean inheritable) {
+    this(displayName, defaultValue, inheritable, null);
+  }
+
+  public ProjectConfigEntry(
+      String displayName, String defaultValue, boolean inheritable, String description) {
+    this(displayName, defaultValue, ProjectConfigEntryType.STRING, null, inheritable, description);
+  }
+
+  public ProjectConfigEntry(String displayName, int defaultValue) {
+    this(displayName, defaultValue, false);
+  }
+
+  public ProjectConfigEntry(String displayName, int defaultValue, boolean inheritable) {
+    this(displayName, defaultValue, inheritable, null);
+  }
+
+  public ProjectConfigEntry(
+      String displayName, int defaultValue, boolean inheritable, String description) {
+    this(
+        displayName,
+        Integer.toString(defaultValue),
+        ProjectConfigEntryType.INT,
+        null,
+        inheritable,
+        description);
+  }
+
+  public ProjectConfigEntry(String displayName, long defaultValue) {
+    this(displayName, defaultValue, false);
+  }
+
+  public ProjectConfigEntry(String displayName, long defaultValue, boolean inheritable) {
+    this(displayName, defaultValue, inheritable, null);
+  }
+
+  public ProjectConfigEntry(
+      String displayName, long defaultValue, boolean inheritable, String description) {
+    this(
+        displayName,
+        Long.toString(defaultValue),
+        ProjectConfigEntryType.LONG,
+        null,
+        inheritable,
+        description);
+  }
+
+  // For inheritable boolean use 'LIST' type with InheritableBoolean
+  public ProjectConfigEntry(String displayName, boolean defaultValue) {
+    this(displayName, defaultValue, null);
+  }
+
+  // For inheritable boolean use 'LIST' type with InheritableBoolean
+  public ProjectConfigEntry(String displayName, boolean defaultValue, String description) {
+    this(
+        displayName,
+        Boolean.toString(defaultValue),
+        ProjectConfigEntryType.BOOLEAN,
+        null,
+        false,
+        description);
+  }
+
+  public ProjectConfigEntry(String displayName, String defaultValue, List<String> permittedValues) {
+    this(displayName, defaultValue, permittedValues, false);
+  }
+
+  public ProjectConfigEntry(
+      String displayName, String defaultValue, List<String> permittedValues, boolean inheritable) {
+    this(displayName, defaultValue, permittedValues, inheritable, null);
+  }
+
+  public ProjectConfigEntry(
+      String displayName,
+      String defaultValue,
+      List<String> permittedValues,
+      boolean inheritable,
+      String description) {
+    this(
+        displayName,
+        defaultValue,
+        ProjectConfigEntryType.LIST,
+        permittedValues,
+        inheritable,
+        description);
+  }
+
+  public <T extends Enum<?>> ProjectConfigEntry(
+      String displayName, T defaultValue, Class<T> permittedValues) {
+    this(displayName, defaultValue, permittedValues, false);
+  }
+
+  public <T extends Enum<?>> ProjectConfigEntry(
+      String displayName, T defaultValue, Class<T> permittedValues, boolean inheritable) {
+    this(displayName, defaultValue, permittedValues, inheritable, null);
+  }
+
+  public <T extends Enum<?>> ProjectConfigEntry(
+      String displayName,
+      T defaultValue,
+      Class<T> permittedValues,
+      boolean inheritable,
+      String description) {
+    this(
+        displayName,
+        defaultValue.name(),
+        ProjectConfigEntryType.LIST,
+        Arrays.stream(permittedValues.getEnumConstants()).map(Enum::name).collect(toList()),
+        inheritable,
+        description);
+  }
+
+  public ProjectConfigEntry(
+      String displayName,
+      String defaultValue,
+      ProjectConfigEntryType type,
+      List<String> permittedValues,
+      boolean inheritable,
+      String description) {
+    this.displayName = displayName;
+    this.defaultValue = defaultValue;
+    this.type = type;
+    this.permittedValues = permittedValues;
+    this.inheritable = inheritable;
+    this.description = description;
+    if (type == ProjectConfigEntryType.ARRAY && inheritable) {
+      throw new ProvisionException("ARRAY doesn't support inheritable values");
+    }
+  }
+
+  public String getDisplayName() {
+    return displayName;
+  }
+
+  public String getDescription() {
+    return description;
+  }
+
+  public boolean isInheritable() {
+    return inheritable;
+  }
+
+  public String getDefaultValue() {
+    return defaultValue;
+  }
+
+  public ProjectConfigEntryType getType() {
+    return type;
+  }
+
+  public List<String> getPermittedValues() {
+    return permittedValues;
+  }
+
+  /**
+   * @param project project state.
+   * @return whether the project is editable.
+   */
+  public boolean isEditable(ProjectState project) {
+    return true;
+  }
+
+  /**
+   * @param project project state.
+   * @return any warning associated with the project.
+   */
+  public String getWarning(ProjectState project) {
+    return null;
+  }
+
+  /**
+   * Called before the project config is updated. To modify the value before the project config is
+   * updated, override this method and return the modified value. Default implementation returns the
+   * same value.
+   *
+   * @param configValue the original configValue that was entered.
+   * @return the modified configValue.
+   */
+  public ConfigValue preUpdate(ConfigValue configValue) {
+    return configValue;
+  }
+
+  /**
+   * Called after reading the project config value. To modify the value before returning it to the
+   * client, override this method and return the modified value. Default implementation returns the
+   * same value.
+   *
+   * @param project the project.
+   * @param value the actual value of the config entry (computed out of the configured value, the
+   *     inherited value and the default value).
+   * @return the modified value.
+   */
+  public String onRead(ProjectState project, String value) {
+    return value;
+  }
+
+  /**
+   * Called after reading the project config value of type ARRAY. To modify the values before
+   * returning it to the client, override this method and return the modified values. Default
+   * implementation returns the same values.
+   *
+   * @param project the project.
+   * @param values the actual values of the config entry (computed out of the configured value, the
+   *     inherited value and the default value).
+   * @return the modified values.
+   */
+  public List<String> onRead(ProjectState project, List<String> values) {
+    return values;
+  }
+
+  /**
+   * Called after a project config is updated.
+   *
+   * @param project project name.
+   * @param oldValue old entry value.
+   * @param newValue new entry value.
+   */
+  public void onUpdate(Project.NameKey project, String oldValue, String newValue) {}
+
+  /**
+   * Called after a project config is updated.
+   *
+   * @param project project name.
+   * @param oldValue old entry value.
+   * @param newValue new entry value.
+   */
+  public void onUpdate(Project.NameKey project, Boolean oldValue, Boolean newValue) {}
+
+  /**
+   * Called after a project config is updated.
+   *
+   * @param project project name.
+   * @param oldValue old entry value.
+   * @param newValue new entry value.
+   */
+  public void onUpdate(Project.NameKey project, Integer oldValue, Integer newValue) {}
+
+  /**
+   * Called after a project config is updated.
+   *
+   * @param project project name.
+   * @param oldValue old entry value.
+   * @param newValue new entry value.
+   */
+  public void onUpdate(Project.NameKey project, Long oldValue, Long newValue) {}
+
+  public static class UpdateChecker implements GitReferenceUpdatedListener {
+    private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+    private final GitRepositoryManager repoManager;
+    private final DynamicMap<ProjectConfigEntry> pluginConfigEntries;
+
+    @Inject
+    UpdateChecker(
+        GitRepositoryManager repoManager, DynamicMap<ProjectConfigEntry> pluginConfigEntries) {
+      this.repoManager = repoManager;
+      this.pluginConfigEntries = pluginConfigEntries;
+    }
+
+    @Override
+    public void onGitReferenceUpdated(Event event) {
+      Project.NameKey p = new Project.NameKey(event.getProjectName());
+      if (!event.getRefName().equals(RefNames.REFS_CONFIG)) {
+        return;
+      }
+
+      try {
+        ProjectConfig oldCfg = parseConfig(p, event.getOldObjectId());
+        ProjectConfig newCfg = parseConfig(p, event.getNewObjectId());
+        if (oldCfg != null && newCfg != null) {
+          for (Extension<ProjectConfigEntry> e : pluginConfigEntries) {
+            ProjectConfigEntry configEntry = e.getProvider().get();
+            String newValue = getValue(newCfg, e);
+            String oldValue = getValue(oldCfg, e);
+            if ((newValue == null && oldValue == null)
+                || (newValue != null && newValue.equals(oldValue))) {
+              return;
+            }
+
+            switch (configEntry.getType()) {
+              case BOOLEAN:
+                configEntry.onUpdate(p, toBoolean(oldValue), toBoolean(newValue));
+                break;
+              case INT:
+                configEntry.onUpdate(p, toInt(oldValue), toInt(newValue));
+                break;
+              case LONG:
+                configEntry.onUpdate(p, toLong(oldValue), toLong(newValue));
+                break;
+              case LIST:
+              case STRING:
+              case ARRAY:
+              default:
+                configEntry.onUpdate(p, oldValue, newValue);
+            }
+          }
+        }
+      } catch (IOException | ConfigInvalidException e) {
+        logger.atSevere().withCause(e).log(
+            "Failed to check if plugin config of project %s was updated.", p.get());
+      }
+    }
+
+    private ProjectConfig parseConfig(Project.NameKey p, String idStr)
+        throws IOException, ConfigInvalidException, RepositoryNotFoundException {
+      ObjectId id = ObjectId.fromString(idStr);
+      if (ObjectId.zeroId().equals(id)) {
+        return null;
+      }
+      try (Repository repo = repoManager.openRepository(p)) {
+        ProjectConfig pc = new ProjectConfig(p);
+        pc.load(repo, id);
+        return pc;
+      }
+    }
+
+    private static String getValue(ProjectConfig cfg, Extension<ProjectConfigEntry> e) {
+      String value = cfg.getPluginConfig(e.getPluginName()).getString(e.getExportName());
+      if (value == null) {
+        value = e.getProvider().get().getDefaultValue();
+      }
+      return value;
+    }
+  }
+
+  private static Boolean toBoolean(String value) {
+    return value != null ? Boolean.parseBoolean(value) : null;
+  }
+
+  private static Integer toInt(String value) {
+    return value != null ? Integer.parseInt(value) : null;
+  }
+
+  private static Long toLong(String value) {
+    return value != null ? Long.parseLong(value) : null;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/ProjectOwnerGroupsProvider.java b/java/com/google/gerrit/server/config/ProjectOwnerGroupsProvider.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/ProjectOwnerGroupsProvider.java
rename to java/com/google/gerrit/server/config/ProjectOwnerGroupsProvider.java
diff --git a/java/com/google/gerrit/server/config/ReceiveCommitsExecutor.java b/java/com/google/gerrit/server/config/ReceiveCommitsExecutor.java
new file mode 100644
index 0000000..16d389c
--- /dev/null
+++ b/java/com/google/gerrit/server/config/ReceiveCommitsExecutor.java
@@ -0,0 +1,26 @@
+// Copyright (C) 2012 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.google.gerrit.server.config;
+
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.inject.BindingAnnotation;
+import java.lang.annotation.Retention;
+import java.util.concurrent.ExecutorService;
+
+/** Marker on the global {@link ExecutorService} used by {@code ReceiveCommits}. */
+@Retention(RUNTIME)
+@BindingAnnotation
+public @interface ReceiveCommitsExecutor {}
diff --git a/java/com/google/gerrit/server/config/RepositoryConfig.java b/java/com/google/gerrit/server/config/RepositoryConfig.java
new file mode 100644
index 0000000..d8c8468
--- /dev/null
+++ b/java/com/google/gerrit/server/config/RepositoryConfig.java
@@ -0,0 +1,103 @@
+// Copyright (C) 2014 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.google.gerrit.server.config;
+
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static java.util.Comparator.comparing;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Objects;
+import org.eclipse.jgit.lib.Config;
+
+@Singleton
+public class RepositoryConfig {
+
+  static final String SECTION_NAME = "repository";
+  static final String OWNER_GROUP_NAME = "ownerGroup";
+  static final String DEFAULT_SUBMIT_TYPE_NAME = "defaultSubmitType";
+  static final String BASE_PATH_NAME = "basePath";
+
+  static final SubmitType DEFAULT_SUBMIT_TYPE = SubmitType.INHERIT;
+
+  private final Config cfg;
+
+  @Inject
+  public RepositoryConfig(@GerritServerConfig Config cfg) {
+    this.cfg = cfg;
+  }
+
+  public SubmitType getDefaultSubmitType(Project.NameKey project) {
+    return cfg.getEnum(
+        SECTION_NAME, findSubSection(project.get()), DEFAULT_SUBMIT_TYPE_NAME, DEFAULT_SUBMIT_TYPE);
+  }
+
+  public ImmutableList<String> getOwnerGroups(Project.NameKey project) {
+    return ImmutableList.copyOf(
+        cfg.getStringList(SECTION_NAME, findSubSection(project.get()), OWNER_GROUP_NAME));
+  }
+
+  public Path getBasePath(Project.NameKey project) {
+    String basePath = cfg.getString(SECTION_NAME, findSubSection(project.get()), BASE_PATH_NAME);
+    return basePath != null ? Paths.get(basePath) : null;
+  }
+
+  public ImmutableList<Path> getAllBasePaths() {
+    return cfg.getSubsections(SECTION_NAME).stream()
+        .map(sub -> cfg.getString(SECTION_NAME, sub, BASE_PATH_NAME))
+        .filter(Objects::nonNull)
+        .map(Paths::get)
+        .collect(toImmutableList());
+  }
+
+  /**
+   * Find the subsection to get repository configuration from.
+   *
+   * <p>Subsection can use the * pattern so if project name matches more than one section, return
+   * the more precise one. E.g if the following subsections are defined:
+   *
+   * <pre>
+   * [repository "somePath/*"]
+   *   name = value
+   * [repository "somePath/somePath/*"]
+   *   name = value
+   * </pre>
+   *
+   * and this method is called with "somePath/somePath/someProject" as project name, it will return
+   * the subsection "somePath/somePath/*"
+   *
+   * @param project Name of the project
+   * @return the name of the subsection, null if none is found
+   */
+  @Nullable
+  private String findSubSection(String project) {
+    return cfg.getSubsections(SECTION_NAME).stream()
+        .filter(ss -> isMatch(ss, project))
+        .max(comparing(String::length))
+        .orElse(null);
+  }
+
+  private boolean isMatch(String subSection, String project) {
+    return project.equals(subSection)
+        || (subSection.endsWith("*")
+            && project.startsWith(subSection.substring(0, subSection.length() - 1)));
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/RequestScopedReviewDbProvider.java b/java/com/google/gerrit/server/config/RequestScopedReviewDbProvider.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/RequestScopedReviewDbProvider.java
rename to java/com/google/gerrit/server/config/RequestScopedReviewDbProvider.java
diff --git a/java/com/google/gerrit/server/config/ScheduleConfig.java b/java/com/google/gerrit/server/config/ScheduleConfig.java
new file mode 100644
index 0000000..c5f53b3
--- /dev/null
+++ b/java/com/google/gerrit/server/config/ScheduleConfig.java
@@ -0,0 +1,343 @@
+// Copyright (C) 2014 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.google.gerrit.server.config;
+
+import static java.time.ZoneId.systemDefault;
+import static java.util.Objects.requireNonNull;
+
+import com.google.auto.value.AutoValue;
+import com.google.auto.value.extension.memoized.Memoized;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import java.time.DayOfWeek;
+import java.time.Duration;
+import java.time.LocalTime;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+import java.time.temporal.ChronoUnit;
+import java.util.Locale;
+import java.util.Optional;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.lib.Config;
+
+/**
+ * This class reads a schedule for running a periodic background job from a Git config.
+ *
+ * <p>A schedule configuration consists of two parameters:
+ *
+ * <ul>
+ *   <li>{@code interval}: Interval for running the periodic background job. The interval must be
+ *       larger than zero. The following suffixes are supported to define the time unit for the
+ *       interval:
+ *       <ul>
+ *         <li>{@code s}, {@code sec}, {@code second}, {@code seconds}
+ *         <li>{@code m}, {@code min}, {@code minute}, {@code minutes}
+ *         <li>{@code h}, {@code hr}, {@code hour}, {@code hours}
+ *         <li>{@code d}, {@code day}, {@code days}
+ *         <li>{@code w}, {@code week}, {@code weeks} ({@code 1 week} is treated as {@code 7 days})
+ *         <li>{@code mon}, {@code month}, {@code months} ({@code 1 month} is treated as {@code 30
+ *             days})
+ *         <li>{@code y}, {@code year}, {@code years} ({@code 1 year} is treated as {@code 365
+ *             days})
+ *       </ul>
+ *   <li>{@code startTime}: The start time defines the first execution of the periodic background
+ *       job. If the configured {@code interval} is shorter than {@code startTime - now} the start
+ *       time will be preponed by the maximum integral multiple of {@code interval} so that the
+ *       start time is still in the future. {@code startTime} must have one of the following
+ *       formats:
+ *       <ul>
+ *         <li>{@code <day of week> <hours>:<minutes>}
+ *         <li>{@code <hours>:<minutes>}
+ *       </ul>
+ *       The placeholders can have the following values:
+ *       <ul>
+ *         <li>{@code <day of week>}: {@code Mon}, {@code Tue}, {@code Wed}, {@code Thu}, {@code
+ *             Fri}, {@code Sat}, {@code Sun}
+ *         <li>{@code <hours>}: {@code 00}-{@code 23}
+ *         <li>{@code <minutes>}: {@code 00}-{@code 59}
+ *       </ul>
+ *       The timezone cannot be specified but is always the system default time-zone.
+ * </ul>
+ *
+ * <p>The section and the subsection from which the {@code interval} and {@code startTime}
+ * parameters are read can be configured.
+ *
+ * <p>Examples for a schedule configuration:
+ *
+ * <ul>
+ *   <li>
+ *       <pre>
+ * foo.startTime = Fri 10:30
+ * foo.interval  = 2 day
+ * </pre>
+ *       Assuming that the server is started on {@code Mon 7:00} then {@code startTime - now} is
+ *       {@code 4 days 3:30 hours}. This is larger than the interval hence the start time is
+ *       preponed by the maximum integral multiple of the interval so that start time is still in
+ *       the future, i.e. preponed by 4 days. This yields a start time of {@code Mon 10:30}, next
+ *       executions are {@code Wed 10:30}, {@code Fri 10:30}. etc.
+ *   <li>
+ *       <pre>
+ * foo.startTime = 6:00
+ * foo.interval = 1 day
+ * </pre>
+ *       Assuming that the server is started on {@code Mon 7:00} then this yields the first run on
+ *       next Tuesday at 6:00 and a repetition interval of 1 day.
+ * </ul>
+ */
+@AutoValue
+public abstract class ScheduleConfig {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  @VisibleForTesting static final String KEY_INTERVAL = "interval";
+  @VisibleForTesting static final String KEY_STARTTIME = "startTime";
+
+  private static final long MISSING_CONFIG = -1L;
+  private static final long INVALID_CONFIG = -2L;
+
+  public static Optional<Schedule> createSchedule(Config config, String section) {
+    return builder(config, section).buildSchedule();
+  }
+
+  public static ScheduleConfig.Builder builder(Config config, String section) {
+    return new AutoValue_ScheduleConfig.Builder()
+        .setNow(computeNow())
+        .setKeyInterval(KEY_INTERVAL)
+        .setKeyStartTime(KEY_STARTTIME)
+        .setConfig(config)
+        .setSection(section);
+  }
+
+  abstract Config config();
+
+  abstract String section();
+
+  @Nullable
+  abstract String subsection();
+
+  abstract String keyInterval();
+
+  abstract String keyStartTime();
+
+  abstract ZonedDateTime now();
+
+  @Memoized
+  public Optional<Schedule> schedule() {
+    long interval = computeInterval(config(), section(), subsection(), keyInterval());
+
+    long initialDelay;
+    if (interval > 0) {
+      initialDelay =
+          computeInitialDelay(config(), section(), subsection(), keyStartTime(), now(), interval);
+    } else {
+      initialDelay = interval;
+    }
+
+    if (isInvalidOrMissing(interval, initialDelay)) {
+      return Optional.empty();
+    }
+
+    return Optional.of(Schedule.create(interval, initialDelay));
+  }
+
+  private boolean isInvalidOrMissing(long interval, long initialDelay) {
+    String key = section() + (subsection() != null ? "." + subsection() : "");
+    if (interval == MISSING_CONFIG && initialDelay == MISSING_CONFIG) {
+      logger.atInfo().log("No schedule configuration for \"%s\".", key);
+      return true;
+    }
+
+    if (interval == MISSING_CONFIG) {
+      logger.atSevere().log(
+          "Incomplete schedule configuration for \"%s\" is ignored. Missing value for \"%s\".",
+          key, key + "." + keyInterval());
+      return true;
+    }
+
+    if (initialDelay == MISSING_CONFIG) {
+      logger.atSevere().log(
+          "Incomplete schedule configuration for \"%s\" is ignored. Missing value for \"%s\".",
+          key, key + "." + keyStartTime());
+      return true;
+    }
+
+    if (interval <= 0 || initialDelay < 0) {
+      logger.atSevere().log("Invalid schedule configuration for \"%s\" is ignored. ", key);
+      return true;
+    }
+
+    return false;
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder b = new StringBuilder();
+    b.append(formatValue(keyInterval()));
+    b.append(", ");
+    b.append(formatValue(keyStartTime()));
+    return b.toString();
+  }
+
+  private String formatValue(String key) {
+    StringBuilder b = new StringBuilder();
+    b.append(section());
+    if (subsection() != null) {
+      b.append(".");
+      b.append(subsection());
+    }
+    b.append(".");
+    b.append(key);
+    String value = config().getString(section(), subsection(), key);
+    if (value != null) {
+      b.append(" = ");
+      b.append(value);
+    } else {
+      b.append(": NA");
+    }
+    return b.toString();
+  }
+
+  private static long computeInterval(
+      Config rc, String section, String subsection, String keyInterval) {
+    try {
+      return ConfigUtil.getTimeUnit(
+          rc, section, subsection, keyInterval, MISSING_CONFIG, TimeUnit.MILLISECONDS);
+    } catch (IllegalArgumentException e) {
+      return INVALID_CONFIG;
+    }
+  }
+
+  private static long computeInitialDelay(
+      Config rc,
+      String section,
+      String subsection,
+      String keyStartTime,
+      ZonedDateTime now,
+      long interval) {
+    String start = rc.getString(section, subsection, keyStartTime);
+    if (start == null) {
+      return MISSING_CONFIG;
+    }
+    return computeInitialDelay(interval, start, now);
+  }
+
+  private static long computeInitialDelay(long interval, String start) {
+    return computeInitialDelay(interval, start, computeNow());
+  }
+
+  private static long computeInitialDelay(long interval, String start, ZonedDateTime now) {
+    requireNonNull(start);
+
+    try {
+      DateTimeFormatter formatter = DateTimeFormatter.ofPattern("[E ]HH:mm").withLocale(Locale.US);
+      LocalTime firstStartTime = LocalTime.parse(start, formatter);
+      ZonedDateTime startTime = now.with(firstStartTime);
+      try {
+        DayOfWeek dayOfWeek = formatter.parse(start, DayOfWeek::from);
+        startTime = startTime.with(dayOfWeek);
+      } catch (DateTimeParseException ignored) {
+        // Day of week is an optional parameter.
+      }
+      startTime = startTime.truncatedTo(ChronoUnit.MINUTES);
+      long delay = Duration.between(now, startTime).toMillis() % interval;
+      if (delay <= 0) {
+        delay += interval;
+      }
+      return delay;
+    } catch (DateTimeParseException e) {
+      return INVALID_CONFIG;
+    }
+  }
+
+  private static ZonedDateTime computeNow() {
+    return ZonedDateTime.now(systemDefault());
+  }
+
+  @AutoValue.Builder
+  public abstract static class Builder {
+    public abstract Builder setConfig(Config config);
+
+    public abstract Builder setSection(String section);
+
+    public abstract Builder setSubsection(@Nullable String subsection);
+
+    public abstract Builder setKeyInterval(String keyInterval);
+
+    public abstract Builder setKeyStartTime(String keyStartTime);
+
+    @VisibleForTesting
+    abstract Builder setNow(ZonedDateTime now);
+
+    abstract ScheduleConfig build();
+
+    public Optional<Schedule> buildSchedule() {
+      return build().schedule();
+    }
+  }
+
+  @AutoValue
+  public abstract static class Schedule {
+    /** Number of milliseconds between events. */
+    public abstract long interval();
+
+    /**
+     * Milliseconds between constructor invocation and first event time.
+     *
+     * <p>If there is any lag between the constructor invocation and queuing the object into an
+     * executor the event will run later, as there is no method to adjust for the scheduling delay.
+     */
+    public abstract long initialDelay();
+
+    /**
+     * Creates a schedule.
+     *
+     * <p>{@link ScheduleConfig} defines details about which values are valid for the {@code
+     * interval} and {@code startTime} parameters.
+     *
+     * @param interval the interval in milliseconds
+     * @param startTime the start time as "{@code <day of week> <hours>:<minutes>}" or "{@code
+     *     <hours>:<minutes>}"
+     * @return the schedule
+     * @throws IllegalArgumentException if any of the parameters is invalid
+     */
+    public static Schedule createOrFail(long interval, String startTime) {
+      return create(interval, startTime).orElseThrow(IllegalArgumentException::new);
+    }
+
+    /**
+     * Creates a schedule.
+     *
+     * <p>{@link ScheduleConfig} defines details about which values are valid for the {@code
+     * interval} and {@code startTime} parameters.
+     *
+     * @param interval the interval in milliseconds
+     * @param startTime the start time as "{@code <day of week> <hours>:<minutes>}" or "{@code
+     *     <hours>:<minutes>}"
+     * @return the schedule or {@link Optional#empty()} if any of the parameters is invalid
+     */
+    public static Optional<Schedule> create(long interval, String startTime) {
+      long initialDelay = computeInitialDelay(interval, startTime);
+      if (interval <= 0 || initialDelay < 0) {
+        return Optional.empty();
+      }
+      return Optional.of(create(interval, initialDelay));
+    }
+
+    static Schedule create(long interval, long initialDelay) {
+      return new AutoValue_ScheduleConfig_Schedule(interval, initialDelay);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/config/SendEmailExecutor.java b/java/com/google/gerrit/server/config/SendEmailExecutor.java
new file mode 100644
index 0000000..cf90cbf
--- /dev/null
+++ b/java/com/google/gerrit/server/config/SendEmailExecutor.java
@@ -0,0 +1,26 @@
+// Copyright (C) 2014 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.google.gerrit.server.config;
+
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.inject.BindingAnnotation;
+import java.lang.annotation.Retention;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+
+/** Marker on the global {@link ScheduledThreadPoolExecutor} used to send email. */
+@Retention(RUNTIME)
+@BindingAnnotation
+public @interface SendEmailExecutor {}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/SitePath.java b/java/com/google/gerrit/server/config/SitePath.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/SitePath.java
rename to java/com/google/gerrit/server/config/SitePath.java
diff --git a/java/com/google/gerrit/server/config/SitePaths.java b/java/com/google/gerrit/server/config/SitePaths.java
new file mode 100644
index 0000000..11ec50c
--- /dev/null
+++ b/java/com/google/gerrit/server/config/SitePaths.java
@@ -0,0 +1,150 @@
+// Copyright (C) 2009 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.google.gerrit.server.config;
+
+import com.google.common.collect.Iterables;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.nio.file.DirectoryStream;
+import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
+import java.nio.file.Path;
+
+/** Important paths within a {@link SitePath}. */
+@Singleton
+public final class SitePaths {
+  public static final String CSS_FILENAME = "GerritSite.css";
+  public static final String HEADER_FILENAME = "GerritSiteHeader.html";
+  public static final String FOOTER_FILENAME = "GerritSiteFooter.html";
+  public static final String THEME_FILENAME = "gerrit-theme.html";
+
+  public final Path site_path;
+  public final Path bin_dir;
+  public final Path etc_dir;
+  public final Path lib_dir;
+  public final Path tmp_dir;
+  public final Path logs_dir;
+  public final Path plugins_dir;
+  public final Path db_dir;
+  public final Path data_dir;
+  public final Path mail_dir;
+  public final Path hooks_dir;
+  public final Path static_dir;
+  public final Path themes_dir;
+  public final Path index_dir;
+
+  public final Path gerrit_sh;
+  public final Path gerrit_service;
+  public final Path gerrit_socket;
+  public final Path gerrit_war;
+
+  public final Path gerrit_config;
+  public final Path secure_config;
+  public final Path notedb_config;
+
+  public final Path ssl_keystore;
+  public final Path ssh_key;
+  public final Path ssh_rsa;
+  public final Path ssh_ecdsa_256;
+  public final Path ssh_ecdsa_384;
+  public final Path ssh_ecdsa_521;
+  public final Path ssh_ed25519;
+  public final Path peer_keys;
+
+  public final Path site_css;
+  public final Path site_header;
+  public final Path site_footer;
+  // For PolyGerrit UI only.
+  public final Path site_theme;
+  public final Path site_gitweb;
+
+  /** {@code true} if {@link #site_path} has not been initialized. */
+  public final boolean isNew;
+
+  @Inject
+  public SitePaths(@SitePath Path sitePath) throws IOException {
+    site_path = sitePath;
+    Path p = sitePath;
+
+    bin_dir = p.resolve("bin");
+    etc_dir = p.resolve("etc");
+    lib_dir = p.resolve("lib");
+    tmp_dir = p.resolve("tmp");
+    plugins_dir = p.resolve("plugins");
+    db_dir = p.resolve("db");
+    data_dir = p.resolve("data");
+    logs_dir = p.resolve("logs");
+    mail_dir = etc_dir.resolve("mail");
+    hooks_dir = p.resolve("hooks");
+    static_dir = p.resolve("static");
+    themes_dir = p.resolve("themes");
+    index_dir = p.resolve("index");
+
+    gerrit_sh = bin_dir.resolve("gerrit.sh");
+    gerrit_service = bin_dir.resolve("gerrit.service");
+    gerrit_socket = bin_dir.resolve("gerrit.socket");
+    gerrit_war = bin_dir.resolve("gerrit.war");
+
+    gerrit_config = etc_dir.resolve("gerrit.config");
+    secure_config = etc_dir.resolve("secure.config");
+    notedb_config = etc_dir.resolve("notedb.config");
+
+    ssl_keystore = etc_dir.resolve("keystore");
+    ssh_key = etc_dir.resolve("ssh_host_key");
+    ssh_rsa = etc_dir.resolve("ssh_host_rsa_key");
+    ssh_ecdsa_256 = etc_dir.resolve("ssh_host_ecdsa_key");
+    ssh_ecdsa_384 = etc_dir.resolve("ssh_host_ecdsa_384_key");
+    ssh_ecdsa_521 = etc_dir.resolve("ssh_host_ecdsa_521_key");
+    ssh_ed25519 = etc_dir.resolve("ssh_host_ed25519_key");
+    peer_keys = etc_dir.resolve("peer_keys");
+
+    site_css = etc_dir.resolve(CSS_FILENAME);
+    site_header = etc_dir.resolve(HEADER_FILENAME);
+    site_footer = etc_dir.resolve(FOOTER_FILENAME);
+    site_gitweb = etc_dir.resolve("gitweb_config.perl");
+
+    // For PolyGerrit UI.
+    site_theme = static_dir.resolve(THEME_FILENAME);
+
+    boolean isNew;
+    try (DirectoryStream<Path> files = Files.newDirectoryStream(site_path)) {
+      isNew = Iterables.isEmpty(files);
+    } catch (NoSuchFileException e) {
+      isNew = true;
+    }
+    this.isNew = isNew;
+  }
+
+  /**
+   * Resolve an absolute or relative path.
+   *
+   * <p>Relative paths are resolved relative to the {@link #site_path}.
+   *
+   * @param path the path string to resolve. May be null.
+   * @return the resolved path; null if {@code path} was null or empty.
+   */
+  public Path resolve(String path) {
+    if (path != null && !path.isEmpty()) {
+      Path loc = site_path.resolve(path).normalize();
+      try {
+        return loc.toRealPath();
+      } catch (IOException e) {
+        return loc.toAbsolutePath();
+      }
+    }
+    return null;
+  }
+}
diff --git a/java/com/google/gerrit/server/config/SysExecutorModule.java b/java/com/google/gerrit/server/config/SysExecutorModule.java
new file mode 100644
index 0000000..f552434
--- /dev/null
+++ b/java/com/google/gerrit/server/config/SysExecutorModule.java
@@ -0,0 +1,100 @@
+// Copyright (C) 2012 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.google.gerrit.server.config;
+
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.common.util.concurrent.MoreExecutors;
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
+import com.google.gerrit.server.FanOutExecutor;
+import com.google.gerrit.server.git.WorkQueue;
+import com.google.gerrit.server.logging.LoggingContextAwareExecutorService;
+import com.google.inject.AbstractModule;
+import com.google.inject.Provides;
+import com.google.inject.Singleton;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.lib.Config;
+
+/**
+ * Module providing the {@link ReceiveCommitsExecutor}.
+ *
+ * <p>This module is intended to be installed at the top level when creating a {@code sysInjector}
+ * in {@code Daemon} or similar, not nested in another module. This ensures the module can be
+ * swapped out for the googlesource.com implementation.
+ */
+public class SysExecutorModule extends AbstractModule {
+  @Override
+  protected void configure() {}
+
+  @Provides
+  @Singleton
+  @ReceiveCommitsExecutor
+  public ExecutorService createReceiveCommitsExecutor(
+      @GerritServerConfig Config config, WorkQueue queues) {
+    int poolSize =
+        config.getInt(
+            "receive", null, "threadPoolSize", Runtime.getRuntime().availableProcessors());
+    return queues.createQueue(poolSize, "ReceiveCommits", true);
+  }
+
+  @Provides
+  @Singleton
+  @SendEmailExecutor
+  public ExecutorService createSendEmailExecutor(
+      @GerritServerConfig Config config, WorkQueue queues) {
+    int poolSize = config.getInt("sendemail", null, "threadPoolSize", 1);
+    if (poolSize == 0) {
+      return MoreExecutors.newDirectExecutorService();
+    }
+    return queues.createQueue(poolSize, "SendEmail", true);
+  }
+
+  @Provides
+  @Singleton
+  @FanOutExecutor
+  public ExecutorService createFanOutExecutor(@GerritServerConfig Config config, WorkQueue queues) {
+    int poolSize = config.getInt("execution", null, "fanOutThreadPoolSize", 25);
+    if (poolSize == 0) {
+      return MoreExecutors.newDirectExecutorService();
+    }
+    return queues.createQueue(poolSize, "FanOut");
+  }
+
+  @Provides
+  @Singleton
+  @ChangeUpdateExecutor
+  public ListeningExecutorService createChangeUpdateExecutor(@GerritServerConfig Config config) {
+    int poolSize = config.getInt("receive", null, "changeUpdateThreads", 1);
+    if (poolSize <= 1) {
+      return MoreExecutors.newDirectExecutorService();
+    }
+    return MoreExecutors.listeningDecorator(
+        new LoggingContextAwareExecutorService(
+            MoreExecutors.getExitingExecutorService(
+                new ThreadPoolExecutor(
+                    1,
+                    poolSize,
+                    10,
+                    TimeUnit.MINUTES,
+                    new ArrayBlockingQueue<Runnable>(poolSize),
+                    new ThreadFactoryBuilder()
+                        .setNameFormat("ChangeUpdate-%d")
+                        .setDaemon(true)
+                        .build(),
+                    new ThreadPoolExecutor.CallerRunsPolicy()))));
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/TaskResource.java b/java/com/google/gerrit/server/config/TaskResource.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/TaskResource.java
rename to java/com/google/gerrit/server/config/TaskResource.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/ThreadSettingsConfig.java b/java/com/google/gerrit/server/config/ThreadSettingsConfig.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/ThreadSettingsConfig.java
rename to java/com/google/gerrit/server/config/ThreadSettingsConfig.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/TopMenuResource.java b/java/com/google/gerrit/server/config/TopMenuResource.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/TopMenuResource.java
rename to java/com/google/gerrit/server/config/TopMenuResource.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/TrackingFooter.java b/java/com/google/gerrit/server/config/TrackingFooter.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/TrackingFooter.java
rename to java/com/google/gerrit/server/config/TrackingFooter.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/TrackingFooters.java b/java/com/google/gerrit/server/config/TrackingFooters.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/TrackingFooters.java
rename to java/com/google/gerrit/server/config/TrackingFooters.java
diff --git a/java/com/google/gerrit/server/config/TrackingFootersProvider.java b/java/com/google/gerrit/server/config/TrackingFootersProvider.java
new file mode 100644
index 0000000..ff1910d
--- /dev/null
+++ b/java/com/google/gerrit/server/config/TrackingFootersProvider.java
@@ -0,0 +1,94 @@
+// Copyright (C) 2010 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.google.gerrit.server.config;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.reviewdb.client.TrackingId;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.regex.PatternSyntaxException;
+import org.eclipse.jgit.lib.Config;
+
+/** Provides a list of all configured {@link TrackingFooter}s. */
+@Singleton
+public class TrackingFootersProvider implements Provider<TrackingFooters> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static String TRACKING_ID_TAG = "trackingid";
+  private static String FOOTER_TAG = "footer";
+  private static String SYSTEM_TAG = "system";
+  private static String REGEX_TAG = "match";
+  private final List<TrackingFooter> trackingFooters = new ArrayList<>();
+
+  @Inject
+  TrackingFootersProvider(@GerritServerConfig Config cfg) {
+    for (String name : cfg.getSubsections(TRACKING_ID_TAG)) {
+      boolean configValid = true;
+
+      Set<String> footers =
+          new HashSet<>(Arrays.asList(cfg.getStringList(TRACKING_ID_TAG, name, FOOTER_TAG)));
+      footers.removeAll(Collections.singleton(null));
+
+      if (footers.isEmpty()) {
+        configValid = false;
+        logger.atSevere().log(
+            "Missing %s.%s.%s in gerrit.config", TRACKING_ID_TAG, name, FOOTER_TAG);
+      }
+
+      String system = cfg.getString(TRACKING_ID_TAG, name, SYSTEM_TAG);
+      if (system == null || system.isEmpty()) {
+        configValid = false;
+        logger.atSevere().log(
+            "Missing %s.%s.%s in gerrit.config", TRACKING_ID_TAG, name, SYSTEM_TAG);
+      } else if (system.length() > TrackingId.TRACKING_SYSTEM_MAX_CHAR) {
+        configValid = false;
+        logger.atSevere().log(
+            "String too long \"%s\" in gerrit.config %s.%s.%s (max %d char)",
+            system, TRACKING_ID_TAG, name, SYSTEM_TAG, TrackingId.TRACKING_SYSTEM_MAX_CHAR);
+      }
+
+      String match = cfg.getString(TRACKING_ID_TAG, name, REGEX_TAG);
+      if (match == null || match.isEmpty()) {
+        configValid = false;
+        logger.atSevere().log(
+            "Missing %s.%s.%s in gerrit.config", TRACKING_ID_TAG, name, REGEX_TAG);
+      }
+
+      if (configValid) {
+        try {
+          for (String footer : footers) {
+            trackingFooters.add(new TrackingFooter(footer, match, system));
+          }
+        } catch (PatternSyntaxException e) {
+          logger.atSevere().log(
+              "Invalid pattern \"%s\" in gerrit.config %s.%s.%s: %s",
+              match, TRACKING_ID_TAG, name, REGEX_TAG, e.getMessage());
+        }
+      }
+    }
+  }
+
+  @Override
+  public TrackingFooters get() {
+    return new TrackingFooters(trackingFooters);
+  }
+}
diff --git a/java/com/google/gerrit/server/config/UrlFormatter.java b/java/com/google/gerrit/server/config/UrlFormatter.java
new file mode 100644
index 0000000..066a3ca
--- /dev/null
+++ b/java/com/google/gerrit/server/config/UrlFormatter.java
@@ -0,0 +1,65 @@
+// 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.
+
+package com.google.gerrit.server.config;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import java.util.Optional;
+
+/**
+ * Formats URLs to different parts of the Gerrit API and UI.
+ *
+ * <p>By default, these gerrit URLs are formed by adding suffixes to the web URL. The interface
+ * centralizes these conventions, and also allows introducing different, custom URL schemes.
+ *
+ * <p>Unfortunately, Gerrit operates in modes for which there is no canonical URL. This can be in
+ * standalone utilities that have no HTTP server (eg. index upgrade commands), in servers that run
+ * SSH only, or in a HTTP/SSH server that is accessed over SSH without canonical web URL configured.
+ */
+public interface UrlFormatter {
+
+  /**
+   * The canonical base URL where this Gerrit installation can be reached.
+   *
+   * <p>For the default implementations below to work, it must end in "/".
+   */
+  Optional<String> getWebUrl();
+
+  /** Returns the URL for viewing a change. */
+  default Optional<String> getChangeViewUrl(Project.NameKey project, Change.Id id) {
+
+    // In the PolyGerrit URL (contrary to REST URLs) there is no need to URL-escape strings, since
+    // the /+/ separator unambiguously defines how to parse the path.
+    return getWebUrl().map(url -> url + "c/" + project.get() + "/+/" + id.get());
+  }
+
+  /** Returns a URL pointing to a section of the settings page. */
+  default Optional<String> getSettingsUrl(@Nullable String section) {
+    return getWebUrl()
+        .map(url -> url + "settings" + (Strings.isNullOrEmpty(section) ? "" : "#" + section));
+  }
+
+  /** Returns a URL pointing to a documentation page, at a given named anchor. */
+  default Optional<String> getDocUrl(String page, String anchor) {
+    return getWebUrl().map(url -> url + "Documentation/" + page + "#" + anchor);
+  }
+
+  /** Returns a REST API URL for a given suffix (eg. "accounts/self/details") */
+  default Optional<String> getRestUrl(String suffix) {
+    return getWebUrl().map(url -> url + suffix);
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/VerboseSuperprojectUpdate.java b/java/com/google/gerrit/server/config/VerboseSuperprojectUpdate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/config/VerboseSuperprojectUpdate.java
rename to java/com/google/gerrit/server/config/VerboseSuperprojectUpdate.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/data/AccountAttribute.java b/java/com/google/gerrit/server/data/AccountAttribute.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/data/AccountAttribute.java
rename to java/com/google/gerrit/server/data/AccountAttribute.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/data/ApprovalAttribute.java b/java/com/google/gerrit/server/data/ApprovalAttribute.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/data/ApprovalAttribute.java
rename to java/com/google/gerrit/server/data/ApprovalAttribute.java
diff --git a/java/com/google/gerrit/server/data/ChangeAttribute.java b/java/com/google/gerrit/server/data/ChangeAttribute.java
new file mode 100644
index 0000000..fde5922
--- /dev/null
+++ b/java/com/google/gerrit/server/data/ChangeAttribute.java
@@ -0,0 +1,54 @@
+// Copyright (C) 2010 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.google.gerrit.server.data;
+
+import com.google.gerrit.extensions.common.PluginDefinedInfo;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gson.annotations.SerializedName;
+import java.util.List;
+
+public class ChangeAttribute {
+  public String project;
+  public String branch;
+  public String topic;
+  public String id;
+  public int number;
+  public String subject;
+  public AccountAttribute owner;
+  public AccountAttribute assignee;
+  public String url;
+  public String commitMessage;
+  public List<String> hashtags;
+
+  public Long createdOn;
+  public Long lastUpdated;
+  public Boolean open;
+  public Change.Status status;
+  public List<MessageAttribute> comments;
+  public Boolean wip;
+
+  @SerializedName("private")
+  public Boolean isPrivate;
+
+  public List<TrackingIdAttribute> trackingIds;
+  public PatchSetAttribute currentPatchSet;
+  public List<PatchSetAttribute> patchSets;
+
+  public List<DependencyAttribute> dependsOn;
+  public List<DependencyAttribute> neededBy;
+  public List<SubmitRecordAttribute> submitRecords;
+  public List<AccountAttribute> allReviewers;
+  public List<PluginDefinedInfo> plugins;
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/data/DependencyAttribute.java b/java/com/google/gerrit/server/data/DependencyAttribute.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/data/DependencyAttribute.java
rename to java/com/google/gerrit/server/data/DependencyAttribute.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/data/MessageAttribute.java b/java/com/google/gerrit/server/data/MessageAttribute.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/data/MessageAttribute.java
rename to java/com/google/gerrit/server/data/MessageAttribute.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/data/PatchAttribute.java b/java/com/google/gerrit/server/data/PatchAttribute.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/data/PatchAttribute.java
rename to java/com/google/gerrit/server/data/PatchAttribute.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/data/PatchSetAttribute.java b/java/com/google/gerrit/server/data/PatchSetAttribute.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/data/PatchSetAttribute.java
rename to java/com/google/gerrit/server/data/PatchSetAttribute.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/data/PatchSetCommentAttribute.java b/java/com/google/gerrit/server/data/PatchSetCommentAttribute.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/data/PatchSetCommentAttribute.java
rename to java/com/google/gerrit/server/data/PatchSetCommentAttribute.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/data/QueryStatsAttribute.java b/java/com/google/gerrit/server/data/QueryStatsAttribute.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/data/QueryStatsAttribute.java
rename to java/com/google/gerrit/server/data/QueryStatsAttribute.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/data/RefUpdateAttribute.java b/java/com/google/gerrit/server/data/RefUpdateAttribute.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/data/RefUpdateAttribute.java
rename to java/com/google/gerrit/server/data/RefUpdateAttribute.java
diff --git a/java/com/google/gerrit/server/data/SubmitLabelAttribute.java b/java/com/google/gerrit/server/data/SubmitLabelAttribute.java
new file mode 100644
index 0000000..fec8f7f
--- /dev/null
+++ b/java/com/google/gerrit/server/data/SubmitLabelAttribute.java
@@ -0,0 +1,25 @@
+// Copyright (C) 2012 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.google.gerrit.server.data;
+
+/**
+ * Represents a {@link com.google.gerrit.common.data.SubmitRecord.Label} that does not depend on
+ * Gerrit internal classes, to be serialized.
+ */
+public class SubmitLabelAttribute {
+  public String label;
+  public String status;
+  public AccountAttribute by;
+}
diff --git a/java/com/google/gerrit/server/data/SubmitRecordAttribute.java b/java/com/google/gerrit/server/data/SubmitRecordAttribute.java
new file mode 100644
index 0000000..2c3d401
--- /dev/null
+++ b/java/com/google/gerrit/server/data/SubmitRecordAttribute.java
@@ -0,0 +1,27 @@
+// Copyright (C) 2012 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.google.gerrit.server.data;
+
+import java.util.List;
+
+/**
+ * Represents a {@link com.google.gerrit.common.data.SubmitRecord} that does not depend on Gerrit
+ * internal classes, to be serialized.
+ */
+public class SubmitRecordAttribute {
+  public String status;
+  public List<SubmitLabelAttribute> labels;
+  public List<SubmitRequirementAttribute> requirements;
+}
diff --git a/java/com/google/gerrit/server/data/SubmitRequirementAttribute.java b/java/com/google/gerrit/server/data/SubmitRequirementAttribute.java
new file mode 100644
index 0000000..3203024
--- /dev/null
+++ b/java/com/google/gerrit/server/data/SubmitRequirementAttribute.java
@@ -0,0 +1,27 @@
+// 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.
+
+package com.google.gerrit.server.data;
+
+import java.util.Map;
+
+/**
+ * Represents a {@link com.google.gerrit.common.data.SubmitRequirement} that does not depend on
+ * Gerrit internal classes, to be serialized
+ */
+public class SubmitRequirementAttribute {
+  public Map<String, String> data;
+  public String type;
+  public String fallbackText;
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/data/TrackingIdAttribute.java b/java/com/google/gerrit/server/data/TrackingIdAttribute.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/data/TrackingIdAttribute.java
rename to java/com/google/gerrit/server/data/TrackingIdAttribute.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/documentation/Constants.java b/java/com/google/gerrit/server/documentation/Constants.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/documentation/Constants.java
rename to java/com/google/gerrit/server/documentation/Constants.java
diff --git a/java/com/google/gerrit/server/documentation/MarkdownFormatter.java b/java/com/google/gerrit/server/documentation/MarkdownFormatter.java
new file mode 100644
index 0000000..2eb46f1
--- /dev/null
+++ b/java/com/google/gerrit/server/documentation/MarkdownFormatter.java
@@ -0,0 +1,178 @@
+// Copyright (C) 2012 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.google.gerrit.server.documentation;
+
+import static com.vladsch.flexmark.profiles.pegdown.Extensions.ALL;
+import static com.vladsch.flexmark.profiles.pegdown.Extensions.HARDWRAPS;
+import static com.vladsch.flexmark.profiles.pegdown.Extensions.SUPPRESS_ALL_HTML;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
+import com.vladsch.flexmark.Extension;
+import com.vladsch.flexmark.ast.Block;
+import com.vladsch.flexmark.ast.Heading;
+import com.vladsch.flexmark.ast.Node;
+import com.vladsch.flexmark.ast.util.TextCollectingVisitor;
+import com.vladsch.flexmark.html.HtmlRenderer;
+import com.vladsch.flexmark.parser.Parser;
+import com.vladsch.flexmark.profiles.pegdown.PegdownOptionsAdapter;
+import com.vladsch.flexmark.util.options.MutableDataHolder;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.URL;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.concurrent.atomic.AtomicBoolean;
+import org.apache.commons.lang.StringEscapeUtils;
+import org.eclipse.jgit.util.RawParseUtils;
+import org.eclipse.jgit.util.TemporaryBuffer;
+
+public class MarkdownFormatter {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final String defaultCss;
+
+  static {
+    AtomicBoolean file = new AtomicBoolean();
+    String src;
+    try {
+      src = readFlexMarkJavaCss(file);
+    } catch (IOException err) {
+      logger.atWarning().withCause(err).log("Cannot load flexmark-java.css");
+      src = "";
+    }
+    defaultCss = file.get() ? null : src;
+  }
+
+  private static String readCSS() {
+    if (defaultCss != null) {
+      return defaultCss;
+    }
+    try {
+      return readFlexMarkJavaCss(new AtomicBoolean());
+    } catch (IOException err) {
+      logger.atWarning().withCause(err).log("Cannot load flexmark-java.css");
+      return "";
+    }
+  }
+
+  private boolean suppressHtml;
+  private String css;
+
+  public MarkdownFormatter suppressHtml() {
+    suppressHtml = true;
+    return this;
+  }
+
+  public MarkdownFormatter setCss(String css) {
+    this.css = StringEscapeUtils.escapeHtml(css);
+    return this;
+  }
+
+  private MutableDataHolder markDownOptions() {
+    int options = ALL & ~(HARDWRAPS);
+    if (suppressHtml) {
+      options |= SUPPRESS_ALL_HTML;
+    }
+
+    MutableDataHolder optionsExt =
+        PegdownOptionsAdapter.flexmarkOptions(
+                options, MarkdownFormatterHeader.HeadingExtension.create())
+            .toMutable();
+
+    ArrayList<Extension> extensions = new ArrayList<>();
+    for (Extension extension : optionsExt.get(com.vladsch.flexmark.parser.Parser.EXTENSIONS)) {
+      extensions.add(extension);
+    }
+
+    return optionsExt;
+  }
+
+  public byte[] markdownToDocHtml(String md, String charEnc) throws UnsupportedEncodingException {
+    Node root = parseMarkdown(md);
+    HtmlRenderer renderer = HtmlRenderer.builder(markDownOptions()).build();
+    String title = findTitle(root);
+
+    StringBuilder html = new StringBuilder();
+    html.append("<html>");
+    html.append("<head>");
+    if (!Strings.isNullOrEmpty(title)) {
+      html.append("<title>").append(title).append("</title>");
+    }
+    html.append("<style type=\"text/css\">\n");
+    if (css != null) {
+      html.append(css);
+    } else {
+      html.append(readCSS());
+    }
+    html.append("\n</style>");
+    html.append("</head>");
+    html.append("<body>\n");
+    html.append(renderer.render(root));
+    html.append("\n</body></html>");
+    return html.toString().getBytes(charEnc);
+  }
+
+  public String extractTitleFromMarkdown(byte[] data, String charEnc) {
+    String md = RawParseUtils.decode(Charset.forName(charEnc), data);
+    return findTitle(parseMarkdown(md));
+  }
+
+  private String findTitle(Node root) {
+    if (root instanceof Heading) {
+      Heading h = (Heading) root;
+      if (h.getLevel() == 1 && h.hasChildren()) {
+        TextCollectingVisitor collectingVisitor = new TextCollectingVisitor();
+        return collectingVisitor.collectAndGetText(h);
+      }
+    }
+
+    if (root instanceof Block && root.hasChildren()) {
+      Node child = root.getFirstChild();
+      while (child != null) {
+        String title = findTitle(child);
+        if (title != null) {
+          return title;
+        }
+        child = child.getNext();
+      }
+    }
+
+    return null;
+  }
+
+  private Node parseMarkdown(String md) {
+    Parser parser = Parser.builder(markDownOptions()).build();
+    Node document = parser.parse(md);
+    return document;
+  }
+
+  private static String readFlexMarkJavaCss(AtomicBoolean file) throws IOException {
+    String name = "flexmark-java.css";
+    URL url = MarkdownFormatter.class.getResource(name);
+    if (url == null) {
+      throw new FileNotFoundException("Resource " + name);
+    }
+    file.set("file".equals(url.getProtocol()));
+    try (InputStream in = url.openStream();
+        TemporaryBuffer.Heap tmp = new TemporaryBuffer.Heap(128 * 1024)) {
+      tmp.copy(in);
+      return new String(tmp.toByteArray(), UTF_8);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/documentation/MarkdownFormatterHeader.java b/java/com/google/gerrit/server/documentation/MarkdownFormatterHeader.java
new file mode 100644
index 0000000..00471fd
--- /dev/null
+++ b/java/com/google/gerrit/server/documentation/MarkdownFormatterHeader.java
@@ -0,0 +1,158 @@
+// 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.
+
+package com.google.gerrit.server.documentation;
+
+import com.vladsch.flexmark.ast.Heading;
+import com.vladsch.flexmark.ast.Node;
+import com.vladsch.flexmark.ext.anchorlink.AnchorLink;
+import com.vladsch.flexmark.ext.anchorlink.internal.AnchorLinkNodeRenderer;
+import com.vladsch.flexmark.html.CustomNodeRenderer;
+import com.vladsch.flexmark.html.HtmlRenderer;
+import com.vladsch.flexmark.html.HtmlRenderer.HtmlRendererExtension;
+import com.vladsch.flexmark.html.HtmlWriter;
+import com.vladsch.flexmark.html.renderer.DelegatingNodeRendererFactory;
+import com.vladsch.flexmark.html.renderer.NodeRenderer;
+import com.vladsch.flexmark.html.renderer.NodeRendererContext;
+import com.vladsch.flexmark.html.renderer.NodeRendererFactory;
+import com.vladsch.flexmark.html.renderer.NodeRenderingHandler;
+import com.vladsch.flexmark.profiles.pegdown.Extensions;
+import com.vladsch.flexmark.profiles.pegdown.PegdownOptionsAdapter;
+import com.vladsch.flexmark.util.options.DataHolder;
+import com.vladsch.flexmark.util.options.MutableDataHolder;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+public class MarkdownFormatterHeader {
+  static class HeadingExtension implements HtmlRendererExtension {
+    @Override
+    public void rendererOptions(final MutableDataHolder options) {
+      // add any configuration settings to options you want to apply to everything, here
+    }
+
+    @Override
+    public void extend(final HtmlRenderer.Builder rendererBuilder, final String rendererType) {
+      rendererBuilder.nodeRendererFactory(new HeadingNodeRenderer.Factory());
+    }
+
+    static HeadingExtension create() {
+      return new HeadingExtension();
+    }
+  }
+
+  static class HeadingNodeRenderer implements NodeRenderer {
+    public HeadingNodeRenderer() {}
+
+    @Override
+    public Set<NodeRenderingHandler<?>> getNodeRenderingHandlers() {
+      return new HashSet<NodeRenderingHandler<? extends Node>>(
+          Arrays.asList(
+              new NodeRenderingHandler<>(
+                  AnchorLink.class,
+                  new CustomNodeRenderer<AnchorLink>() {
+                    @Override
+                    public void render(
+                        AnchorLink node, NodeRendererContext context, HtmlWriter html) {
+                      HeadingNodeRenderer.this.render(node, context);
+                    }
+                  }),
+              new NodeRenderingHandler<>(
+                  Heading.class,
+                  new CustomNodeRenderer<Heading>() {
+                    @Override
+                    public void render(Heading node, NodeRendererContext context, HtmlWriter html) {
+                      HeadingNodeRenderer.this.render(node, context, html);
+                    }
+                  })));
+    }
+
+    void render(final AnchorLink node, final NodeRendererContext context) {
+      Node parent = node.getParent();
+
+      if (parent instanceof Heading && ((Heading) parent).getLevel() == 1) {
+        // render without anchor link
+        context.renderChildren(node);
+      } else {
+        context.delegateRender();
+      }
+    }
+
+    static boolean haveExtension(int extensions, int flags) {
+      return (extensions & flags) != 0;
+    }
+
+    static boolean haveAllExtensions(int extensions, int flags) {
+      return (extensions & flags) == flags;
+    }
+
+    void render(final Heading node, final NodeRendererContext context, final HtmlWriter html) {
+      if (node.getLevel() == 1) {
+        // render without anchor link
+        final int extensions = context.getOptions().get(PegdownOptionsAdapter.PEGDOWN_EXTENSIONS);
+        if (context.getHtmlOptions().renderHeaderId
+            || haveExtension(extensions, Extensions.ANCHORLINKS)
+            || haveAllExtensions(
+                extensions, Extensions.EXTANCHORLINKS | Extensions.EXTANCHORLINKS_WRAP)) {
+          String id = context.getNodeId(node);
+          if (id != null) {
+            html.attr("id", id);
+          }
+        }
+
+        if (context.getHtmlOptions().sourcePositionParagraphLines) {
+          html.srcPos(node.getChars())
+              .withAttr()
+              .tagLine(
+                  "h" + node.getLevel(),
+                  new Runnable() {
+                    @Override
+                    public void run() {
+                      html.srcPos(node.getText()).withAttr().tag("span");
+                      context.renderChildren(node);
+                      html.tag("/span");
+                    }
+                  });
+        } else {
+          html.srcPos(node.getText())
+              .withAttr()
+              .tagLine(
+                  "h" + node.getLevel(),
+                  new Runnable() {
+                    @Override
+                    public void run() {
+                      context.renderChildren(node);
+                    }
+                  });
+        }
+      } else {
+        context.delegateRender();
+      }
+    }
+
+    public static class Factory implements DelegatingNodeRendererFactory {
+      @Override
+      public NodeRenderer create(final DataHolder options) {
+        return new HeadingNodeRenderer();
+      }
+
+      @Override
+      public Set<Class<? extends NodeRendererFactory>> getDelegates() {
+        Set<Class<? extends NodeRendererFactory>> delegates = new HashSet<>();
+        delegates.add(AnchorLinkNodeRenderer.Factory.class);
+        return delegates;
+      }
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/documentation/QueryDocumentationExecutor.java b/java/com/google/gerrit/server/documentation/QueryDocumentationExecutor.java
new file mode 100644
index 0000000..569399b
--- /dev/null
+++ b/java/com/google/gerrit/server/documentation/QueryDocumentationExecutor.java
@@ -0,0 +1,149 @@
+// Copyright (C) 2013 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.google.gerrit.server.documentation;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.flogger.FluentLogger;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.index.DirectoryReader;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.queryparser.simple.SimpleQueryParser;
+import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.ScoreDoc;
+import org.apache.lucene.search.TopDocs;
+import org.apache.lucene.store.Directory;
+import org.apache.lucene.store.IndexOutput;
+import org.apache.lucene.store.RAMDirectory;
+
+@Singleton
+public class QueryDocumentationExecutor {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static Map<String, Float> WEIGHTS =
+      ImmutableMap.of(
+          Constants.TITLE_FIELD, 2.0f,
+          Constants.DOC_FIELD, 1.0f);
+
+  private IndexSearcher searcher;
+  private SimpleQueryParser parser;
+
+  public static class DocResult {
+    public String title;
+    public String url;
+    public String content;
+  }
+
+  @Inject
+  public QueryDocumentationExecutor() {
+    try {
+      Directory dir = readIndexDirectory();
+      if (dir == null) {
+        searcher = null;
+        parser = null;
+        return;
+      }
+      IndexReader reader = DirectoryReader.open(dir);
+      searcher = new IndexSearcher(reader);
+      parser = new SimpleQueryParser(new StandardAnalyzer(), WEIGHTS);
+    } catch (IOException e) {
+      logger.atSevere().withCause(e).log("Cannot initialize documentation full text index");
+      searcher = null;
+      parser = null;
+    }
+  }
+
+  public List<DocResult> doQuery(String q) throws DocQueryException {
+    if (!isAvailable()) {
+      throw new DocQueryException("Documentation search not available");
+    }
+    Query query = parser.parse(q);
+    try {
+      // TODO(fishywang): Currently as we don't have much documentation, we just use MAX_VALUE here
+      // and skipped paging. Maybe add paging later.
+      TopDocs results = searcher.search(query, Integer.MAX_VALUE);
+      ScoreDoc[] hits = results.scoreDocs;
+      long totalHits = results.totalHits;
+
+      List<DocResult> out = new ArrayList<>();
+      for (int i = 0; i < totalHits; i++) {
+        DocResult result = new DocResult();
+        Document doc = searcher.doc(hits[i].doc);
+        result.url = doc.get(Constants.URL_FIELD);
+        result.title = doc.get(Constants.TITLE_FIELD);
+        out.add(result);
+      }
+      return out;
+    } catch (IOException e) {
+      throw new DocQueryException(e);
+    }
+  }
+
+  protected Directory readIndexDirectory() throws IOException {
+    Directory dir = new RAMDirectory();
+    byte[] buffer = new byte[4096];
+    InputStream index = getClass().getResourceAsStream(Constants.INDEX_ZIP);
+    if (index == null) {
+      logger.atWarning().log("No index available");
+      return null;
+    }
+
+    try (ZipInputStream zip = new ZipInputStream(index)) {
+      ZipEntry entry;
+      while ((entry = zip.getNextEntry()) != null) {
+        try (IndexOutput out = dir.createOutput(entry.getName(), null)) {
+          int count;
+          while ((count = zip.read(buffer)) != -1) {
+            out.writeBytes(buffer, count);
+          }
+        }
+      }
+    }
+    // We must NOT call dir.close() here, as DirectoryReader.open() expects an opened directory.
+    return dir;
+  }
+
+  public boolean isAvailable() {
+    return parser != null && searcher != null;
+  }
+
+  public static class DocQueryException extends Exception {
+    private static final long serialVersionUID = 1L;
+
+    DocQueryException() {}
+
+    DocQueryException(String msg) {
+      super(msg);
+    }
+
+    DocQueryException(String msg, Throwable e) {
+      super(msg, e);
+    }
+
+    DocQueryException(Throwable e) {
+      super(e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/edit/ChangeEdit.java b/java/com/google/gerrit/server/edit/ChangeEdit.java
new file mode 100644
index 0000000..11dc380
--- /dev/null
+++ b/java/com/google/gerrit/server/edit/ChangeEdit.java
@@ -0,0 +1,59 @@
+// Copyright (C) 2014 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.google.gerrit.server.edit;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import org.eclipse.jgit.revwalk.RevCommit;
+
+/**
+ * A single user's edit for a change.
+ *
+ * <p>There is max. one edit per user per change. Edits are stored on refs:
+ * refs/users/UU/UUUU/edit-CCCC/P where UU/UUUU is sharded representation of user account, CCCC is
+ * change number and P is the patch set number it is based on.
+ */
+public class ChangeEdit {
+  private final Change change;
+  private final String editRefName;
+  private final RevCommit editCommit;
+  private final PatchSet basePatchSet;
+
+  public ChangeEdit(
+      Change change, String editRefName, RevCommit editCommit, PatchSet basePatchSet) {
+    this.change = requireNonNull(change);
+    this.editRefName = requireNonNull(editRefName);
+    this.editCommit = requireNonNull(editCommit);
+    this.basePatchSet = requireNonNull(basePatchSet);
+  }
+
+  public Change getChange() {
+    return change;
+  }
+
+  public String getRefName() {
+    return editRefName;
+  }
+
+  public RevCommit getEditCommit() {
+    return editCommit;
+  }
+
+  public PatchSet getBasePatchSet() {
+    return basePatchSet;
+  }
+}
diff --git a/java/com/google/gerrit/server/edit/ChangeEditJson.java b/java/com/google/gerrit/server/edit/ChangeEditJson.java
new file mode 100644
index 0000000..55e0aef
--- /dev/null
+++ b/java/com/google/gerrit/server/edit/ChangeEditJson.java
@@ -0,0 +1,107 @@
+// Copyright (C) 2014 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.google.gerrit.server.edit;
+
+import com.google.gerrit.extensions.common.CommitInfo;
+import com.google.gerrit.extensions.common.EditInfo;
+import com.google.gerrit.extensions.common.FetchInfo;
+import com.google.gerrit.extensions.config.DownloadCommand;
+import com.google.gerrit.extensions.config.DownloadScheme;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.registration.Extension;
+import com.google.gerrit.server.CommonConverters;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.change.DownloadCommandsJson;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import org.eclipse.jgit.revwalk.RevCommit;
+
+@Singleton
+public class ChangeEditJson {
+  private final DynamicMap<DownloadCommand> downloadCommands;
+  private final DynamicMap<DownloadScheme> downloadSchemes;
+  private final Provider<CurrentUser> userProvider;
+
+  @Inject
+  ChangeEditJson(
+      DynamicMap<DownloadCommand> downloadCommand,
+      DynamicMap<DownloadScheme> downloadSchemes,
+      Provider<CurrentUser> userProvider) {
+    this.downloadCommands = downloadCommand;
+    this.downloadSchemes = downloadSchemes;
+    this.userProvider = userProvider;
+  }
+
+  public EditInfo toEditInfo(ChangeEdit edit, boolean downloadCommands) {
+    EditInfo out = new EditInfo();
+    out.commit = fillCommit(edit.getEditCommit());
+    out.baseRevision = edit.getBasePatchSet().getRevision().get();
+    out.basePatchSetNumber = edit.getBasePatchSet().getPatchSetId();
+    out.ref = edit.getRefName();
+    if (downloadCommands) {
+      out.fetch = fillFetchMap(edit);
+    }
+    return out;
+  }
+
+  private static CommitInfo fillCommit(RevCommit editCommit) {
+    CommitInfo commit = new CommitInfo();
+    commit.commit = editCommit.toObjectId().getName();
+    commit.author = CommonConverters.toGitPerson(editCommit.getAuthorIdent());
+    commit.committer = CommonConverters.toGitPerson(editCommit.getCommitterIdent());
+    commit.subject = editCommit.getShortMessage();
+    commit.message = editCommit.getFullMessage();
+
+    commit.parents = new ArrayList<>(editCommit.getParentCount());
+    for (RevCommit p : editCommit.getParents()) {
+      CommitInfo i = new CommitInfo();
+      i.commit = p.name();
+      commit.parents.add(i);
+    }
+
+    return commit;
+  }
+
+  private Map<String, FetchInfo> fillFetchMap(ChangeEdit edit) {
+    Map<String, FetchInfo> r = new LinkedHashMap<>();
+    for (Extension<DownloadScheme> e : downloadSchemes) {
+      String schemeName = e.getExportName();
+      DownloadScheme scheme = e.getProvider().get();
+      if (!scheme.isEnabled()
+          || (scheme.isAuthRequired() && !userProvider.get().isIdentifiedUser())) {
+        continue;
+      }
+
+      // No fluff, just stuff
+      if (!scheme.isAuthSupported()) {
+        continue;
+      }
+
+      String projectName = edit.getChange().getProject().get();
+      String refName = edit.getRefName();
+      FetchInfo fetchInfo = new FetchInfo(scheme.getUrl(projectName), refName);
+      r.put(schemeName, fetchInfo);
+
+      DownloadCommandsJson.populateFetchMap(
+          scheme, downloadCommands, projectName, refName, fetchInfo);
+    }
+
+    return r;
+  }
+}
diff --git a/java/com/google/gerrit/server/edit/ChangeEditModifier.java b/java/com/google/gerrit/server/edit/ChangeEditModifier.java
new file mode 100644
index 0000000..ce359a9
--- /dev/null
+++ b/java/com/google/gerrit/server/edit/ChangeEditModifier.java
@@ -0,0 +1,633 @@
+// Copyright (C) 2014 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.google.gerrit.server.edit;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.MergeConflictException;
+import com.google.gerrit.extensions.restapi.RawInput;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.edit.tree.ChangeFileContentModification;
+import com.google.gerrit.server.edit.tree.DeleteFileModification;
+import com.google.gerrit.server.edit.tree.RenameFileModification;
+import com.google.gerrit.server.edit.tree.RestoreFileModification;
+import com.google.gerrit.server.edit.tree.TreeCreator;
+import com.google.gerrit.server.edit.tree.TreeModification;
+import com.google.gerrit.server.index.change.ChangeIndexer;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.InvalidChangeOperationException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.util.CommitMessageUtil;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.List;
+import java.util.Optional;
+import java.util.TimeZone;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.NullProgressMonitor;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.merge.MergeStrategy;
+import org.eclipse.jgit.merge.ThreeWayMerger;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevTree;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.ReceiveCommand;
+
+/**
+ * Utility functions to manipulate change edits.
+ *
+ * <p>This class contains methods to modify edit's content. For retrieving, publishing and deleting
+ * edit see {@link ChangeEditUtil}.
+ *
+ * <p>
+ */
+@Singleton
+public class ChangeEditModifier {
+
+  private final TimeZone tz;
+  private final ChangeIndexer indexer;
+  private final Provider<ReviewDb> reviewDb;
+  private final Provider<CurrentUser> currentUser;
+  private final PermissionBackend permissionBackend;
+  private final ChangeEditUtil changeEditUtil;
+  private final PatchSetUtil patchSetUtil;
+  private final ProjectCache projectCache;
+
+  @Inject
+  ChangeEditModifier(
+      @GerritPersonIdent PersonIdent gerritIdent,
+      ChangeIndexer indexer,
+      Provider<ReviewDb> reviewDb,
+      Provider<CurrentUser> currentUser,
+      PermissionBackend permissionBackend,
+      ChangeEditUtil changeEditUtil,
+      PatchSetUtil patchSetUtil,
+      ProjectCache projectCache) {
+    this.indexer = indexer;
+    this.reviewDb = reviewDb;
+    this.currentUser = currentUser;
+    this.permissionBackend = permissionBackend;
+    this.tz = gerritIdent.getTimeZone();
+    this.changeEditUtil = changeEditUtil;
+    this.patchSetUtil = patchSetUtil;
+    this.projectCache = projectCache;
+  }
+
+  /**
+   * Creates a new change edit.
+   *
+   * @param repository the affected Git repository
+   * @param notes the {@link ChangeNotes} of the change for which the change edit should be created
+   * @throws AuthException if the user isn't authenticated or not allowed to use change edits
+   * @throws InvalidChangeOperationException if a change edit already existed for the change
+   * @throws PermissionBackendException
+   */
+  public void createEdit(Repository repository, ChangeNotes notes)
+      throws AuthException, IOException, InvalidChangeOperationException, OrmException,
+          PermissionBackendException, ResourceConflictException {
+    assertCanEdit(notes);
+
+    Optional<ChangeEdit> changeEdit = lookupChangeEdit(notes);
+    if (changeEdit.isPresent()) {
+      throw new InvalidChangeOperationException(
+          String.format("A change edit already exists for change %s", notes.getChangeId()));
+    }
+
+    PatchSet currentPatchSet = lookupCurrentPatchSet(notes);
+    ObjectId patchSetCommitId = getPatchSetCommitId(currentPatchSet);
+    createEdit(repository, notes, currentPatchSet, patchSetCommitId, TimeUtil.nowTs());
+  }
+
+  /**
+   * Rebase change edit on latest patch set
+   *
+   * @param repository the affected Git repository
+   * @param notes the {@link ChangeNotes} of the change whose change edit should be rebased
+   * @throws AuthException if the user isn't authenticated or not allowed to use change edits
+   * @throws InvalidChangeOperationException if a change edit doesn't exist for the specified
+   *     change, the change edit is already based on the latest patch set, or the change represents
+   *     the root commit
+   * @throws MergeConflictException if rebase fails due to merge conflicts
+   * @throws PermissionBackendException
+   */
+  public void rebaseEdit(Repository repository, ChangeNotes notes)
+      throws AuthException, InvalidChangeOperationException, IOException, OrmException,
+          MergeConflictException, PermissionBackendException, ResourceConflictException {
+    assertCanEdit(notes);
+
+    Optional<ChangeEdit> optionalChangeEdit = lookupChangeEdit(notes);
+    if (!optionalChangeEdit.isPresent()) {
+      throw new InvalidChangeOperationException(
+          String.format("No change edit exists for change %s", notes.getChangeId()));
+    }
+    ChangeEdit changeEdit = optionalChangeEdit.get();
+
+    PatchSet currentPatchSet = lookupCurrentPatchSet(notes);
+    if (isBasedOn(changeEdit, currentPatchSet)) {
+      throw new InvalidChangeOperationException(
+          String.format(
+              "Change edit for change %s is already based on latest patch set %s",
+              notes.getChangeId(), currentPatchSet.getId()));
+    }
+
+    rebase(repository, changeEdit, currentPatchSet);
+  }
+
+  private void rebase(Repository repository, ChangeEdit changeEdit, PatchSet currentPatchSet)
+      throws IOException, MergeConflictException, InvalidChangeOperationException, OrmException {
+    RevCommit currentEditCommit = changeEdit.getEditCommit();
+    if (currentEditCommit.getParentCount() == 0) {
+      throw new InvalidChangeOperationException(
+          "Rebase change edit against root commit not supported");
+    }
+
+    Change change = changeEdit.getChange();
+    RevCommit basePatchSetCommit = lookupCommit(repository, currentPatchSet);
+    RevTree basePatchSetTree = basePatchSetCommit.getTree();
+
+    ObjectId newTreeId = merge(repository, changeEdit, basePatchSetTree);
+    Timestamp nowTimestamp = TimeUtil.nowTs();
+    String commitMessage = currentEditCommit.getFullMessage();
+    ObjectId newEditCommitId =
+        createCommit(repository, basePatchSetCommit, newTreeId, commitMessage, nowTimestamp);
+
+    String newEditRefName = getEditRefName(change, currentPatchSet);
+    updateReferenceWithNameChange(
+        repository,
+        changeEdit.getRefName(),
+        currentEditCommit,
+        newEditRefName,
+        newEditCommitId,
+        nowTimestamp);
+    reindex(change);
+  }
+
+  /**
+   * Modifies the commit message of a change edit. If the change edit doesn't exist, a new one will
+   * be created based on the current patch set.
+   *
+   * @param repository the affected Git repository
+   * @param notes the {@link ChangeNotes} of the change whose change edit's message should be
+   *     modified
+   * @param newCommitMessage the new commit message
+   * @throws AuthException if the user isn't authenticated or not allowed to use change edits
+   * @throws UnchangedCommitMessageException if the commit message is the same as before
+   * @throws PermissionBackendException
+   * @throws BadRequestException if the commit message is malformed
+   */
+  public void modifyMessage(Repository repository, ChangeNotes notes, String newCommitMessage)
+      throws AuthException, IOException, UnchangedCommitMessageException, OrmException,
+          PermissionBackendException, BadRequestException, ResourceConflictException {
+    assertCanEdit(notes);
+    newCommitMessage = CommitMessageUtil.checkAndSanitizeCommitMessage(newCommitMessage);
+
+    Optional<ChangeEdit> optionalChangeEdit = lookupChangeEdit(notes);
+    PatchSet basePatchSet = getBasePatchSet(optionalChangeEdit, notes);
+    RevCommit basePatchSetCommit = lookupCommit(repository, basePatchSet);
+    RevCommit baseCommit =
+        optionalChangeEdit.map(ChangeEdit::getEditCommit).orElse(basePatchSetCommit);
+
+    String currentCommitMessage = baseCommit.getFullMessage();
+    if (newCommitMessage.equals(currentCommitMessage)) {
+      throw new UnchangedCommitMessageException();
+    }
+
+    RevTree baseTree = baseCommit.getTree();
+    Timestamp nowTimestamp = TimeUtil.nowTs();
+    ObjectId newEditCommit =
+        createCommit(repository, basePatchSetCommit, baseTree, newCommitMessage, nowTimestamp);
+
+    if (optionalChangeEdit.isPresent()) {
+      updateEdit(repository, optionalChangeEdit.get(), newEditCommit, nowTimestamp);
+    } else {
+      createEdit(repository, notes, basePatchSet, newEditCommit, nowTimestamp);
+    }
+  }
+
+  /**
+   * Modifies the contents of a file of a change edit. If the change edit doesn't exist, a new one
+   * will be created based on the current patch set.
+   *
+   * @param repository the affected Git repository
+   * @param notes the {@link ChangeNotes} of the change whose change edit should be modified
+   * @param filePath the path of the file whose contents should be modified
+   * @param newContent the new file content
+   * @throws AuthException if the user isn't authenticated or not allowed to use change edits
+   * @throws InvalidChangeOperationException if the file already had the specified content
+   * @throws PermissionBackendException
+   * @throws ResourceConflictException if the project state does not permit the operation
+   */
+  public void modifyFile(
+      Repository repository, ChangeNotes notes, String filePath, RawInput newContent)
+      throws AuthException, InvalidChangeOperationException, IOException, OrmException,
+          PermissionBackendException, ResourceConflictException {
+    modifyTree(repository, notes, new ChangeFileContentModification(filePath, newContent));
+  }
+
+  /**
+   * Deletes a file from the Git tree of a change edit. If the change edit doesn't exist, a new one
+   * will be created based on the current patch set.
+   *
+   * @param repository the affected Git repository
+   * @param notes the {@link ChangeNotes} of the change whose change edit should be modified
+   * @param file path of the file which should be deleted
+   * @throws AuthException if the user isn't authenticated or not allowed to use change edits
+   * @throws InvalidChangeOperationException if the file does not exist
+   * @throws PermissionBackendException
+   * @throws ResourceConflictException if the project state does not permit the operation
+   */
+  public void deleteFile(Repository repository, ChangeNotes notes, String file)
+      throws AuthException, InvalidChangeOperationException, IOException, OrmException,
+          PermissionBackendException, ResourceConflictException {
+    modifyTree(repository, notes, new DeleteFileModification(file));
+  }
+
+  /**
+   * Renames a file of a change edit or moves it to another directory. If the change edit doesn't
+   * exist, a new one will be created based on the current patch set.
+   *
+   * @param repository the affected Git repository
+   * @param notes the {@link ChangeNotes} of the change whose change edit should be modified
+   * @param currentFilePath the current path/name of the file
+   * @param newFilePath the desired path/name of the file
+   * @throws AuthException if the user isn't authenticated or not allowed to use change edits
+   * @throws InvalidChangeOperationException if the file was already renamed to the specified new
+   *     name
+   * @throws PermissionBackendException
+   * @throws ResourceConflictException if the project state does not permit the operation
+   */
+  public void renameFile(
+      Repository repository, ChangeNotes notes, String currentFilePath, String newFilePath)
+      throws AuthException, InvalidChangeOperationException, IOException, OrmException,
+          PermissionBackendException, ResourceConflictException {
+    modifyTree(repository, notes, new RenameFileModification(currentFilePath, newFilePath));
+  }
+
+  /**
+   * Restores a file of a change edit to the state it was in before the patch set on which the
+   * change edit is based. If the change edit doesn't exist, a new one will be created based on the
+   * current patch set.
+   *
+   * @param repository the affected Git repository
+   * @param notes the {@link ChangeNotes} of the change whose change edit should be modified
+   * @param file the path of the file which should be restored
+   * @throws AuthException if the user isn't authenticated or not allowed to use change edits
+   * @throws InvalidChangeOperationException if the file was already restored
+   * @throws PermissionBackendException
+   */
+  public void restoreFile(Repository repository, ChangeNotes notes, String file)
+      throws AuthException, InvalidChangeOperationException, IOException, OrmException,
+          PermissionBackendException, ResourceConflictException {
+    modifyTree(repository, notes, new RestoreFileModification(file));
+  }
+
+  private void modifyTree(
+      Repository repository, ChangeNotes notes, TreeModification treeModification)
+      throws AuthException, IOException, OrmException, InvalidChangeOperationException,
+          PermissionBackendException, ResourceConflictException {
+    assertCanEdit(notes);
+
+    Optional<ChangeEdit> optionalChangeEdit = lookupChangeEdit(notes);
+    PatchSet basePatchSet = getBasePatchSet(optionalChangeEdit, notes);
+    RevCommit basePatchSetCommit = lookupCommit(repository, basePatchSet);
+    RevCommit baseCommit =
+        optionalChangeEdit.map(ChangeEdit::getEditCommit).orElse(basePatchSetCommit);
+
+    ObjectId newTreeId = createNewTree(repository, baseCommit, ImmutableList.of(treeModification));
+
+    String commitMessage = baseCommit.getFullMessage();
+    Timestamp nowTimestamp = TimeUtil.nowTs();
+    ObjectId newEditCommit =
+        createCommit(repository, basePatchSetCommit, newTreeId, commitMessage, nowTimestamp);
+
+    if (optionalChangeEdit.isPresent()) {
+      updateEdit(repository, optionalChangeEdit.get(), newEditCommit, nowTimestamp);
+    } else {
+      createEdit(repository, notes, basePatchSet, newEditCommit, nowTimestamp);
+    }
+  }
+
+  /**
+   * Applies the indicated modifications to the specified patch set. If a change edit exists and is
+   * based on the same patch set, the modified patch set tree is merged with the change edit. If the
+   * change edit doesn't exist, a new one will be created.
+   *
+   * @param repository the affected Git repository
+   * @param notes the {@link ChangeNotes} of the change to which the patch set belongs
+   * @param patchSet the {@code PatchSet} which should be modified
+   * @param treeModifications the modifications which should be applied
+   * @return the resulting {@code ChangeEdit}
+   * @throws AuthException if the user isn't authenticated or not allowed to use change edits
+   * @throws InvalidChangeOperationException if the existing change edit is based on another patch
+   *     set or no change edit exists but the specified patch set isn't the current one
+   * @throws MergeConflictException if the modified patch set tree can't be merged with an existing
+   *     change edit
+   */
+  public ChangeEdit combineWithModifiedPatchSetTree(
+      Repository repository,
+      ChangeNotes notes,
+      PatchSet patchSet,
+      List<TreeModification> treeModifications)
+      throws AuthException, IOException, InvalidChangeOperationException, MergeConflictException,
+          OrmException, PermissionBackendException, ResourceConflictException {
+    assertCanEdit(notes);
+
+    Optional<ChangeEdit> optionalChangeEdit = lookupChangeEdit(notes);
+    ensureAllowedPatchSet(notes, optionalChangeEdit, patchSet);
+
+    RevCommit patchSetCommit = lookupCommit(repository, patchSet);
+    ObjectId newTreeId = createNewTree(repository, patchSetCommit, treeModifications);
+
+    if (optionalChangeEdit.isPresent()) {
+      ChangeEdit changeEdit = optionalChangeEdit.get();
+      newTreeId = merge(repository, changeEdit, newTreeId);
+      if (ObjectId.equals(newTreeId, changeEdit.getEditCommit().getTree())) {
+        // Modifications are already contained in the change edit.
+        return changeEdit;
+      }
+    }
+
+    String commitMessage =
+        optionalChangeEdit.map(ChangeEdit::getEditCommit).orElse(patchSetCommit).getFullMessage();
+    Timestamp nowTimestamp = TimeUtil.nowTs();
+    ObjectId newEditCommit =
+        createCommit(repository, patchSetCommit, newTreeId, commitMessage, nowTimestamp);
+
+    if (optionalChangeEdit.isPresent()) {
+      return updateEdit(repository, optionalChangeEdit.get(), newEditCommit, nowTimestamp);
+    }
+    return createEdit(repository, notes, patchSet, newEditCommit, nowTimestamp);
+  }
+
+  private void assertCanEdit(ChangeNotes notes)
+      throws AuthException, PermissionBackendException, IOException, ResourceConflictException,
+          OrmException {
+    if (!currentUser.get().isIdentifiedUser()) {
+      throw new AuthException("Authentication required");
+    }
+
+    Change c = notes.getChange();
+    if (!c.getStatus().isOpen()) {
+      throw new ResourceConflictException(
+          String.format(
+              "change %s is %s", c.getChangeId(), c.getStatus().toString().toLowerCase()));
+    }
+
+    // Not allowed to edit if the current patch set is locked.
+    patchSetUtil.checkPatchSetNotLocked(notes);
+    try {
+      permissionBackend
+          .currentUser()
+          .database(reviewDb)
+          .change(notes)
+          .check(ChangePermission.ADD_PATCH_SET);
+      projectCache.checkedGet(notes.getProjectName()).checkStatePermitsWrite();
+    } catch (AuthException denied) {
+      throw new AuthException("edit not permitted", denied);
+    }
+  }
+
+  private static void ensureAllowedPatchSet(
+      ChangeNotes notes, Optional<ChangeEdit> optionalChangeEdit, PatchSet patchSet)
+      throws InvalidChangeOperationException {
+    if (optionalChangeEdit.isPresent()) {
+      ChangeEdit changeEdit = optionalChangeEdit.get();
+      if (!isBasedOn(changeEdit, patchSet)) {
+        throw new InvalidChangeOperationException(
+            String.format(
+                "Only the patch set %s on which the existing change edit is based may be modified "
+                    + "(specified patch set: %s)",
+                changeEdit.getBasePatchSet().getId(), patchSet.getId()));
+      }
+    } else {
+      PatchSet.Id patchSetId = patchSet.getId();
+      PatchSet.Id currentPatchSetId = notes.getChange().currentPatchSetId();
+      if (!patchSetId.equals(currentPatchSetId)) {
+        throw new InvalidChangeOperationException(
+            String.format(
+                "A change edit may only be created for the current patch set %s (and not for %s)",
+                currentPatchSetId, patchSetId));
+      }
+    }
+  }
+
+  private Optional<ChangeEdit> lookupChangeEdit(ChangeNotes notes)
+      throws AuthException, IOException {
+    return changeEditUtil.byChange(notes);
+  }
+
+  private PatchSet getBasePatchSet(Optional<ChangeEdit> optionalChangeEdit, ChangeNotes notes)
+      throws OrmException {
+    Optional<PatchSet> editBasePatchSet = optionalChangeEdit.map(ChangeEdit::getBasePatchSet);
+    return editBasePatchSet.isPresent() ? editBasePatchSet.get() : lookupCurrentPatchSet(notes);
+  }
+
+  private PatchSet lookupCurrentPatchSet(ChangeNotes notes) throws OrmException {
+    return patchSetUtil.current(reviewDb.get(), notes);
+  }
+
+  private static boolean isBasedOn(ChangeEdit changeEdit, PatchSet patchSet) {
+    PatchSet editBasePatchSet = changeEdit.getBasePatchSet();
+    return editBasePatchSet.getId().equals(patchSet.getId());
+  }
+
+  private static RevCommit lookupCommit(Repository repository, PatchSet patchSet)
+      throws IOException {
+    ObjectId patchSetCommitId = getPatchSetCommitId(patchSet);
+    return lookupCommit(repository, patchSetCommitId);
+  }
+
+  private static RevCommit lookupCommit(Repository repository, ObjectId commitId)
+      throws IOException {
+    try (RevWalk revWalk = new RevWalk(repository)) {
+      return revWalk.parseCommit(commitId);
+    }
+  }
+
+  private static ObjectId createNewTree(
+      Repository repository, RevCommit baseCommit, List<TreeModification> treeModifications)
+      throws IOException, InvalidChangeOperationException {
+    TreeCreator treeCreator = new TreeCreator(baseCommit);
+    treeCreator.addTreeModifications(treeModifications);
+    ObjectId newTreeId = treeCreator.createNewTreeAndGetId(repository);
+
+    if (ObjectId.equals(newTreeId, baseCommit.getTree())) {
+      throw new InvalidChangeOperationException("no changes were made");
+    }
+    return newTreeId;
+  }
+
+  private static ObjectId merge(Repository repository, ChangeEdit changeEdit, ObjectId newTreeId)
+      throws IOException, MergeConflictException {
+    PatchSet basePatchSet = changeEdit.getBasePatchSet();
+    ObjectId basePatchSetCommitId = getPatchSetCommitId(basePatchSet);
+    ObjectId editCommitId = changeEdit.getEditCommit();
+
+    ThreeWayMerger threeWayMerger = MergeStrategy.RESOLVE.newMerger(repository, true);
+    threeWayMerger.setBase(basePatchSetCommitId);
+    boolean successful = threeWayMerger.merge(newTreeId, editCommitId);
+
+    if (!successful) {
+      throw new MergeConflictException(
+          "The existing change edit could not be merged with another tree.");
+    }
+    return threeWayMerger.getResultTreeId();
+  }
+
+  private ObjectId createCommit(
+      Repository repository,
+      RevCommit basePatchSetCommit,
+      ObjectId tree,
+      String commitMessage,
+      Timestamp timestamp)
+      throws IOException {
+    try (ObjectInserter objectInserter = repository.newObjectInserter()) {
+      CommitBuilder builder = new CommitBuilder();
+      builder.setTreeId(tree);
+      builder.setParentIds(basePatchSetCommit.getParents());
+      builder.setAuthor(basePatchSetCommit.getAuthorIdent());
+      builder.setCommitter(getCommitterIdent(timestamp));
+      builder.setMessage(commitMessage);
+      ObjectId newCommitId = objectInserter.insert(builder);
+      objectInserter.flush();
+      return newCommitId;
+    }
+  }
+
+  private PersonIdent getCommitterIdent(Timestamp commitTimestamp) {
+    IdentifiedUser user = currentUser.get().asIdentifiedUser();
+    return user.newCommitterIdent(commitTimestamp, tz);
+  }
+
+  private static ObjectId getPatchSetCommitId(PatchSet patchSet) {
+    return ObjectId.fromString(patchSet.getRevision().get());
+  }
+
+  private ChangeEdit createEdit(
+      Repository repository,
+      ChangeNotes notes,
+      PatchSet basePatchSet,
+      ObjectId newEditCommitId,
+      Timestamp timestamp)
+      throws IOException, OrmException {
+    Change change = notes.getChange();
+    String editRefName = getEditRefName(change, basePatchSet);
+    updateReference(repository, editRefName, ObjectId.zeroId(), newEditCommitId, timestamp);
+    reindex(change);
+
+    RevCommit newEditCommit = lookupCommit(repository, newEditCommitId);
+    return new ChangeEdit(change, editRefName, newEditCommit, basePatchSet);
+  }
+
+  private String getEditRefName(Change change, PatchSet basePatchSet) {
+    IdentifiedUser me = currentUser.get().asIdentifiedUser();
+    return RefNames.refsEdit(me.getAccountId(), change.getId(), basePatchSet.getId());
+  }
+
+  private ChangeEdit updateEdit(
+      Repository repository, ChangeEdit changeEdit, ObjectId newEditCommitId, Timestamp timestamp)
+      throws IOException, OrmException {
+    String editRefName = changeEdit.getRefName();
+    RevCommit currentEditCommit = changeEdit.getEditCommit();
+    updateReference(repository, editRefName, currentEditCommit, newEditCommitId, timestamp);
+    reindex(changeEdit.getChange());
+
+    RevCommit newEditCommit = lookupCommit(repository, newEditCommitId);
+    return new ChangeEdit(
+        changeEdit.getChange(), editRefName, newEditCommit, changeEdit.getBasePatchSet());
+  }
+
+  private void updateReference(
+      Repository repository,
+      String refName,
+      ObjectId currentObjectId,
+      ObjectId targetObjectId,
+      Timestamp timestamp)
+      throws IOException {
+    RefUpdate ru = repository.updateRef(refName);
+    ru.setExpectedOldObjectId(currentObjectId);
+    ru.setNewObjectId(targetObjectId);
+    ru.setRefLogIdent(getRefLogIdent(timestamp));
+    ru.setRefLogMessage("inline edit (amend)", false);
+    ru.setForceUpdate(true);
+    try (RevWalk revWalk = new RevWalk(repository)) {
+      RefUpdate.Result res = ru.update(revWalk);
+      if (res != RefUpdate.Result.NEW && res != RefUpdate.Result.FORCED) {
+        throw new IOException(
+            "cannot update "
+                + ru.getName()
+                + " in "
+                + repository.getDirectory()
+                + ": "
+                + ru.getResult());
+      }
+    }
+  }
+
+  private void updateReferenceWithNameChange(
+      Repository repository,
+      String currentRefName,
+      ObjectId currentObjectId,
+      String newRefName,
+      ObjectId targetObjectId,
+      Timestamp timestamp)
+      throws IOException {
+    BatchRefUpdate batchRefUpdate = repository.getRefDatabase().newBatchUpdate();
+    batchRefUpdate.addCommand(new ReceiveCommand(ObjectId.zeroId(), targetObjectId, newRefName));
+    batchRefUpdate.addCommand(
+        new ReceiveCommand(currentObjectId, ObjectId.zeroId(), currentRefName));
+    batchRefUpdate.setRefLogMessage("rebase edit", false);
+    batchRefUpdate.setRefLogIdent(getRefLogIdent(timestamp));
+    try (RevWalk revWalk = new RevWalk(repository)) {
+      batchRefUpdate.execute(revWalk, NullProgressMonitor.INSTANCE);
+    }
+    for (ReceiveCommand cmd : batchRefUpdate.getCommands()) {
+      if (cmd.getResult() != ReceiveCommand.Result.OK) {
+        throw new IOException("failed: " + cmd);
+      }
+    }
+  }
+
+  private PersonIdent getRefLogIdent(Timestamp timestamp) {
+    IdentifiedUser user = currentUser.get().asIdentifiedUser();
+    return user.newRefLogIdent(timestamp, tz);
+  }
+
+  private void reindex(Change change) throws IOException, OrmException {
+    indexer.index(reviewDb.get(), change);
+  }
+}
diff --git a/java/com/google/gerrit/server/edit/ChangeEditUtil.java b/java/com/google/gerrit/server/edit/ChangeEditUtil.java
new file mode 100644
index 0000000..d5add76
--- /dev/null
+++ b/java/com/google/gerrit/server/edit/ChangeEditUtil.java
@@ -0,0 +1,304 @@
+// Copyright (C) 2014 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.google.gerrit.server.edit;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+import com.google.common.collect.ListMultimap;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.api.changes.RecipientType;
+import com.google.gerrit.extensions.client.ChangeKind;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ChangeUtil;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.change.ChangeKindCache;
+import com.google.gerrit.server.change.PatchSetInserter;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.index.change.ChangeIndexer;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.RepoContext;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Optional;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+/**
+ * Utility functions to manipulate change edits.
+ *
+ * <p>This class contains methods to retrieve, publish and delete edits. For changing edits see
+ * {@link ChangeEditModifier}.
+ */
+@Singleton
+public class ChangeEditUtil {
+  private final GitRepositoryManager gitManager;
+  private final PatchSetInserter.Factory patchSetInserterFactory;
+  private final ChangeIndexer indexer;
+  private final Provider<ReviewDb> db;
+  private final Provider<CurrentUser> userProvider;
+  private final ChangeKindCache changeKindCache;
+  private final PatchSetUtil psUtil;
+
+  @Inject
+  ChangeEditUtil(
+      GitRepositoryManager gitManager,
+      PatchSetInserter.Factory patchSetInserterFactory,
+      ChangeIndexer indexer,
+      Provider<ReviewDb> db,
+      Provider<CurrentUser> userProvider,
+      ChangeKindCache changeKindCache,
+      PatchSetUtil psUtil) {
+    this.gitManager = gitManager;
+    this.patchSetInserterFactory = patchSetInserterFactory;
+    this.indexer = indexer;
+    this.db = db;
+    this.userProvider = userProvider;
+    this.changeKindCache = changeKindCache;
+    this.psUtil = psUtil;
+  }
+
+  /**
+   * Retrieve edit for a given change.
+   *
+   * <p>At most one change edit can exist per user and change.
+   *
+   * @param notes change notes of change to retrieve change edits for.
+   * @return edit for this change for this user, if present.
+   * @throws AuthException if this is not a logged-in user.
+   * @throws IOException if an error occurs.
+   */
+  public Optional<ChangeEdit> byChange(ChangeNotes notes) throws AuthException, IOException {
+    return byChange(notes, userProvider.get());
+  }
+
+  /**
+   * Retrieve edit for a change and the given user.
+   *
+   * <p>At most one change edit can exist per user and change.
+   *
+   * @param notes change notes of change to retrieve change edits for.
+   * @param user user to retrieve edits as.
+   * @return edit for this change for this user, if present.
+   * @throws AuthException if this is not a logged-in user.
+   * @throws IOException if an error occurs.
+   */
+  public Optional<ChangeEdit> byChange(ChangeNotes notes, CurrentUser user)
+      throws AuthException, IOException {
+    if (!user.isIdentifiedUser()) {
+      throw new AuthException("Authentication required");
+    }
+    IdentifiedUser u = user.asIdentifiedUser();
+    Change change = notes.getChange();
+    try (Repository repo = gitManager.openRepository(change.getProject())) {
+      int n = change.currentPatchSetId().get();
+      String[] refNames = new String[n];
+      for (int i = n; i > 0; i--) {
+        refNames[i - 1] =
+            RefNames.refsEdit(u.getAccountId(), change.getId(), new PatchSet.Id(change.getId(), i));
+      }
+      Ref ref = repo.getRefDatabase().firstExactRef(refNames);
+      if (ref == null) {
+        return Optional.empty();
+      }
+      try (RevWalk rw = new RevWalk(repo)) {
+        RevCommit commit = rw.parseCommit(ref.getObjectId());
+        PatchSet basePs = getBasePatchSet(notes, ref);
+        return Optional.of(new ChangeEdit(change, ref.getName(), commit, basePs));
+      }
+    }
+  }
+
+  /**
+   * Promote change edit to patch set, by squashing the edit into its parent.
+   *
+   * @param updateFactory factory for creating updates.
+   * @param notes the {@code ChangeNotes} of the change to which the change edit belongs
+   * @param user the current user
+   * @param edit change edit to publish
+   * @param notify Notify handling that defines to whom email notifications should be sent after the
+   *     change edit is published.
+   * @param accountsToNotify Accounts that should be notified after the change edit is published.
+   * @throws IOException
+   * @throws OrmException
+   * @throws UpdateException
+   * @throws RestApiException
+   */
+  public void publish(
+      BatchUpdate.Factory updateFactory,
+      ChangeNotes notes,
+      CurrentUser user,
+      final ChangeEdit edit,
+      NotifyHandling notify,
+      ListMultimap<RecipientType, Account.Id> accountsToNotify)
+      throws IOException, OrmException, RestApiException, UpdateException {
+    Change change = edit.getChange();
+    try (Repository repo = gitManager.openRepository(change.getProject());
+        ObjectInserter oi = repo.newObjectInserter();
+        ObjectReader reader = oi.newReader();
+        RevWalk rw = new RevWalk(reader)) {
+      PatchSet basePatchSet = edit.getBasePatchSet();
+      if (!basePatchSet.getId().equals(change.currentPatchSetId())) {
+        throw new ResourceConflictException("only edit for current patch set can be published");
+      }
+
+      RevCommit squashed = squashEdit(rw, oi, edit.getEditCommit(), basePatchSet);
+      PatchSet.Id psId = ChangeUtil.nextPatchSetId(repo, change.currentPatchSetId());
+      PatchSetInserter inserter =
+          patchSetInserterFactory
+              .create(notes, psId, squashed)
+              .setNotify(notify)
+              .setAccountsToNotify(accountsToNotify);
+
+      StringBuilder message =
+          new StringBuilder("Patch Set ").append(inserter.getPatchSetId().get()).append(": ");
+
+      // Previously checked that the base patch set is the current patch set.
+      ObjectId prior = ObjectId.fromString(basePatchSet.getRevision().get());
+      ChangeKind kind =
+          changeKindCache.getChangeKind(change.getProject(), rw, repo.getConfig(), prior, squashed);
+      if (kind == ChangeKind.NO_CODE_CHANGE) {
+        message.append("Commit message was updated.");
+        inserter.setDescription("Edit commit message");
+      } else {
+        message
+            .append("Published edit on patch set ")
+            .append(basePatchSet.getPatchSetId())
+            .append(".");
+      }
+
+      try (BatchUpdate bu =
+          updateFactory.create(db.get(), change.getProject(), user, TimeUtil.nowTs())) {
+        bu.setRepository(repo, rw, oi);
+        bu.addOp(change.getId(), inserter.setMessage(message.toString()));
+        bu.addOp(
+            change.getId(),
+            new BatchUpdateOp() {
+              @Override
+              public void updateRepo(RepoContext ctx) throws Exception {
+                ctx.addRefUpdate(edit.getEditCommit().copy(), ObjectId.zeroId(), edit.getRefName());
+              }
+            });
+        bu.execute();
+      }
+    }
+  }
+
+  /**
+   * Delete change edit.
+   *
+   * @param edit change edit to delete
+   * @throws IOException
+   * @throws OrmException
+   */
+  public void delete(ChangeEdit edit) throws IOException, OrmException {
+    Change change = edit.getChange();
+    try (Repository repo = gitManager.openRepository(change.getProject())) {
+      deleteRef(repo, edit);
+    }
+    indexer.index(db.get(), change);
+  }
+
+  private PatchSet getBasePatchSet(ChangeNotes notes, Ref ref) throws IOException {
+    try {
+      int pos = ref.getName().lastIndexOf('/');
+      checkArgument(pos > 0, "invalid edit ref: %s", ref.getName());
+      String psId = ref.getName().substring(pos + 1);
+      return psUtil.get(
+          db.get(), notes, new PatchSet.Id(notes.getChange().getId(), Integer.parseInt(psId)));
+    } catch (OrmException | NumberFormatException e) {
+      throw new IOException(e);
+    }
+  }
+
+  private RevCommit squashEdit(
+      RevWalk rw, ObjectInserter inserter, RevCommit edit, PatchSet basePatchSet)
+      throws IOException, ResourceConflictException {
+    RevCommit parent = rw.parseCommit(ObjectId.fromString(basePatchSet.getRevision().get()));
+    if (parent.getTree().equals(edit.getTree())
+        && edit.getFullMessage().equals(parent.getFullMessage())) {
+      throw new ResourceConflictException("identical tree and message");
+    }
+    return writeSquashedCommit(rw, inserter, parent, edit);
+  }
+
+  private static void deleteRef(Repository repo, ChangeEdit edit) throws IOException {
+    String refName = edit.getRefName();
+    RefUpdate ru = repo.updateRef(refName, true);
+    ru.setExpectedOldObjectId(edit.getEditCommit());
+    ru.setForceUpdate(true);
+    RefUpdate.Result result = ru.delete();
+    switch (result) {
+      case FORCED:
+      case NEW:
+      case NO_CHANGE:
+        break;
+      case FAST_FORWARD:
+      case IO_FAILURE:
+      case LOCK_FAILURE:
+      case NOT_ATTEMPTED:
+      case REJECTED:
+      case REJECTED_CURRENT_BRANCH:
+      case RENAMED:
+      case REJECTED_MISSING_OBJECT:
+      case REJECTED_OTHER_REASON:
+      default:
+        throw new IOException(String.format("Failed to delete ref %s: %s", refName, result));
+    }
+  }
+
+  private static RevCommit writeSquashedCommit(
+      RevWalk rw, ObjectInserter inserter, RevCommit parent, RevCommit edit) throws IOException {
+    CommitBuilder mergeCommit = new CommitBuilder();
+    for (int i = 0; i < parent.getParentCount(); i++) {
+      mergeCommit.addParentId(parent.getParent(i));
+    }
+    mergeCommit.setAuthor(parent.getAuthorIdent());
+    mergeCommit.setMessage(edit.getFullMessage());
+    mergeCommit.setCommitter(edit.getCommitterIdent());
+    mergeCommit.setTreeId(edit.getTree());
+
+    return rw.parseCommit(commit(inserter, mergeCommit));
+  }
+
+  private static ObjectId commit(ObjectInserter inserter, CommitBuilder mergeCommit)
+      throws IOException {
+    ObjectId id = inserter.insert(mergeCommit);
+    inserter.flush();
+    return id;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/UnchangedCommitMessageException.java b/java/com/google/gerrit/server/edit/UnchangedCommitMessageException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/edit/UnchangedCommitMessageException.java
rename to java/com/google/gerrit/server/edit/UnchangedCommitMessageException.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/AddPath.java b/java/com/google/gerrit/server/edit/tree/AddPath.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/AddPath.java
rename to java/com/google/gerrit/server/edit/tree/AddPath.java
diff --git a/java/com/google/gerrit/server/edit/tree/ChangeFileContentModification.java b/java/com/google/gerrit/server/edit/tree/ChangeFileContentModification.java
new file mode 100644
index 0000000..d91e2e8
--- /dev/null
+++ b/java/com/google/gerrit/server/edit/tree/ChangeFileContentModification.java
@@ -0,0 +1,125 @@
+// Copyright (C) 2017 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.google.gerrit.server.edit.tree;
+
+import static java.util.Objects.requireNonNull;
+import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.io.ByteStreams;
+import com.google.gerrit.extensions.restapi.RawInput;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Collections;
+import java.util.List;
+import org.eclipse.jgit.dircache.DirCacheEditor;
+import org.eclipse.jgit.dircache.DirCacheEntry;
+import org.eclipse.jgit.errors.InvalidObjectIdException;
+import org.eclipse.jgit.lib.FileMode;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+
+/** A {@code TreeModification} which changes the content of a file. */
+public class ChangeFileContentModification implements TreeModification {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final String filePath;
+  private final RawInput newContent;
+
+  public ChangeFileContentModification(String filePath, RawInput newContent) {
+    this.filePath = filePath;
+    this.newContent = requireNonNull(newContent, "new content required");
+  }
+
+  @Override
+  public List<DirCacheEditor.PathEdit> getPathEdits(Repository repository, RevCommit baseCommit) {
+    DirCacheEditor.PathEdit changeContentEdit = new ChangeContent(filePath, newContent, repository);
+    return Collections.singletonList(changeContentEdit);
+  }
+
+  @Override
+  public String getFilePath() {
+    return filePath;
+  }
+
+  @VisibleForTesting
+  RawInput getNewContent() {
+    return newContent;
+  }
+
+  /** A {@code PathEdit} which changes the contents of a file. */
+  private static class ChangeContent extends DirCacheEditor.PathEdit {
+
+    private final RawInput newContent;
+    private final Repository repository;
+
+    ChangeContent(String filePath, RawInput newContent, Repository repository) {
+      super(filePath);
+      this.newContent = newContent;
+      this.repository = repository;
+    }
+
+    @Override
+    public void apply(DirCacheEntry dirCacheEntry) {
+      try {
+        if (dirCacheEntry.getFileMode() == FileMode.GITLINK) {
+          dirCacheEntry.setLength(0);
+          dirCacheEntry.setLastModified(0);
+          ObjectId newObjectId = ObjectId.fromString(getNewContentBytes(), 0);
+          dirCacheEntry.setObjectId(newObjectId);
+        } else {
+          if (dirCacheEntry.getRawMode() == 0) {
+            dirCacheEntry.setFileMode(FileMode.REGULAR_FILE);
+          }
+          ObjectId newBlobObjectId = createNewBlobAndGetItsId();
+          dirCacheEntry.setObjectId(newBlobObjectId);
+        }
+        // Previously, these two exceptions were swallowed. To improve the
+        // situation, we log them now. However, we should think of a better
+        // approach.
+      } catch (IOException e) {
+        String message =
+            String.format("Could not change the content of %s", dirCacheEntry.getPathString());
+        logger.atSevere().withCause(e).log(message);
+      } catch (InvalidObjectIdException e) {
+        logger.atSevere().withCause(e).log("Invalid object id in submodule link");
+      }
+    }
+
+    private ObjectId createNewBlobAndGetItsId() throws IOException {
+      try (ObjectInserter objectInserter = repository.newObjectInserter()) {
+        ObjectId blobObjectId = createNewBlobAndGetItsId(objectInserter);
+        objectInserter.flush();
+        return blobObjectId;
+      }
+    }
+
+    private ObjectId createNewBlobAndGetItsId(ObjectInserter objectInserter) throws IOException {
+      long contentLength = newContent.getContentLength();
+      if (contentLength < 0) {
+        return objectInserter.insert(OBJ_BLOB, getNewContentBytes());
+      }
+      InputStream contentInputStream = newContent.getInputStream();
+      return objectInserter.insert(OBJ_BLOB, contentLength, contentInputStream);
+    }
+
+    private byte[] getNewContentBytes() throws IOException {
+      return ByteStreams.toByteArray(newContent.getInputStream());
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/DeleteFileModification.java b/java/com/google/gerrit/server/edit/tree/DeleteFileModification.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/DeleteFileModification.java
rename to java/com/google/gerrit/server/edit/tree/DeleteFileModification.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/RenameFileModification.java b/java/com/google/gerrit/server/edit/tree/RenameFileModification.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/RenameFileModification.java
rename to java/com/google/gerrit/server/edit/tree/RenameFileModification.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/RestoreFileModification.java b/java/com/google/gerrit/server/edit/tree/RestoreFileModification.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/RestoreFileModification.java
rename to java/com/google/gerrit/server/edit/tree/RestoreFileModification.java
diff --git a/java/com/google/gerrit/server/edit/tree/TreeCreator.java b/java/com/google/gerrit/server/edit/tree/TreeCreator.java
new file mode 100644
index 0000000..e6caf97
--- /dev/null
+++ b/java/com/google/gerrit/server/edit/tree/TreeCreator.java
@@ -0,0 +1,109 @@
+// Copyright (C) 2017 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.google.gerrit.server.edit.tree;
+
+import static java.util.Objects.requireNonNull;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.jgit.dircache.DirCache;
+import org.eclipse.jgit.dircache.DirCacheBuilder;
+import org.eclipse.jgit.dircache.DirCacheEditor;
+import org.eclipse.jgit.dircache.DirCacheEntry;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+
+/**
+ * A creator for a new Git tree. To create the new tree, the tree of another commit is taken as a
+ * basis and modified.
+ */
+public class TreeCreator {
+
+  private final RevCommit baseCommit;
+  private final List<TreeModification> treeModifications = new ArrayList<>();
+
+  public TreeCreator(RevCommit baseCommit) {
+    this.baseCommit = requireNonNull(baseCommit, "baseCommit is required");
+  }
+
+  /**
+   * Apply modifications to the tree which is taken as a basis. If this method is called multiple
+   * times, the modifications are applied subsequently in exactly the order they were provided.
+   *
+   * @param treeModifications modifications which should be applied to the base tree
+   */
+  public void addTreeModifications(List<TreeModification> treeModifications) {
+    requireNonNull(treeModifications, "treeModifications must not be null");
+    this.treeModifications.addAll(treeModifications);
+  }
+
+  /**
+   * Creates the new tree. When this method is called, the specified base tree is read from the
+   * repository, the specified modifications are applied, and the resulting tree is written to the
+   * object store of the repository.
+   *
+   * @param repository the affected Git repository
+   * @return the {@code ObjectId} of the created tree
+   * @throws IOException if problems arise when accessing the repository
+   */
+  public ObjectId createNewTreeAndGetId(Repository repository) throws IOException {
+    DirCache newTree = createNewTree(repository);
+    return writeAndGetId(repository, newTree);
+  }
+
+  private DirCache createNewTree(Repository repository) throws IOException {
+    DirCache newTree = readBaseTree(repository);
+    List<DirCacheEditor.PathEdit> pathEdits = getPathEdits(repository);
+    applyPathEdits(newTree, pathEdits);
+    return newTree;
+  }
+
+  private DirCache readBaseTree(Repository repository) throws IOException {
+    try (ObjectReader objectReader = repository.newObjectReader()) {
+      DirCache dirCache = DirCache.newInCore();
+      DirCacheBuilder dirCacheBuilder = dirCache.builder();
+      dirCacheBuilder.addTree(
+          new byte[0], DirCacheEntry.STAGE_0, objectReader, baseCommit.getTree());
+      dirCacheBuilder.finish();
+      return dirCache;
+    }
+  }
+
+  private List<DirCacheEditor.PathEdit> getPathEdits(Repository repository) throws IOException {
+    List<DirCacheEditor.PathEdit> pathEdits = new ArrayList<>();
+    for (TreeModification treeModification : treeModifications) {
+      pathEdits.addAll(treeModification.getPathEdits(repository, baseCommit));
+    }
+    return pathEdits;
+  }
+
+  private static void applyPathEdits(DirCache tree, List<DirCacheEditor.PathEdit> pathEdits) {
+    DirCacheEditor dirCacheEditor = tree.editor();
+    pathEdits.forEach(dirCacheEditor::add);
+    dirCacheEditor.finish();
+  }
+
+  private static ObjectId writeAndGetId(Repository repository, DirCache tree) throws IOException {
+    try (ObjectInserter objectInserter = repository.newObjectInserter()) {
+      ObjectId treeId = tree.writeTree(objectInserter);
+      objectInserter.flush();
+      return treeId;
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/TreeModification.java b/java/com/google/gerrit/server/edit/tree/TreeModification.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/edit/tree/TreeModification.java
rename to java/com/google/gerrit/server/edit/tree/TreeModification.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/AssigneeChangedEvent.java b/java/com/google/gerrit/server/events/AssigneeChangedEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/events/AssigneeChangedEvent.java
rename to java/com/google/gerrit/server/events/AssigneeChangedEvent.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/ChangeAbandonedEvent.java b/java/com/google/gerrit/server/events/ChangeAbandonedEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/events/ChangeAbandonedEvent.java
rename to java/com/google/gerrit/server/events/ChangeAbandonedEvent.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/ChangeDeletedEvent.java b/java/com/google/gerrit/server/events/ChangeDeletedEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/events/ChangeDeletedEvent.java
rename to java/com/google/gerrit/server/events/ChangeDeletedEvent.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/ChangeEvent.java b/java/com/google/gerrit/server/events/ChangeEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/events/ChangeEvent.java
rename to java/com/google/gerrit/server/events/ChangeEvent.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/ChangeMergedEvent.java b/java/com/google/gerrit/server/events/ChangeMergedEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/events/ChangeMergedEvent.java
rename to java/com/google/gerrit/server/events/ChangeMergedEvent.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/ChangeRestoredEvent.java b/java/com/google/gerrit/server/events/ChangeRestoredEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/events/ChangeRestoredEvent.java
rename to java/com/google/gerrit/server/events/ChangeRestoredEvent.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/CommentAddedEvent.java b/java/com/google/gerrit/server/events/CommentAddedEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/events/CommentAddedEvent.java
rename to java/com/google/gerrit/server/events/CommentAddedEvent.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/CommitReceivedEvent.java b/java/com/google/gerrit/server/events/CommitReceivedEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/events/CommitReceivedEvent.java
rename to java/com/google/gerrit/server/events/CommitReceivedEvent.java
diff --git a/java/com/google/gerrit/server/events/Event.java b/java/com/google/gerrit/server/events/Event.java
new file mode 100644
index 0000000..c07987a
--- /dev/null
+++ b/java/com/google/gerrit/server/events/Event.java
@@ -0,0 +1,30 @@
+// Copyright (C) 2014 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.google.gerrit.server.events;
+
+import com.google.gerrit.server.util.time.TimeUtil;
+
+public abstract class Event {
+  public final String type;
+  public long eventCreatedOn = TimeUtil.nowMs() / 1000L;
+
+  protected Event(String type) {
+    this.type = type;
+  }
+
+  public String getType() {
+    return type;
+  }
+}
diff --git a/java/com/google/gerrit/server/events/EventBroker.java b/java/com/google/gerrit/server/events/EventBroker.java
new file mode 100644
index 0000000..94e9bb1
--- /dev/null
+++ b/java/com/google/gerrit/server/events/EventBroker.java
@@ -0,0 +1,228 @@
+// 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.
+
+package com.google.gerrit.server.events;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.lifecycle.LifecycleModule;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gerrit.server.plugincontext.PluginSetEntryContext;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+/** Distributes Events to listeners if they are allowed to see them */
+@Singleton
+public class EventBroker implements EventDispatcher {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static class Module extends LifecycleModule {
+    @Override
+    protected void configure() {
+      DynamicItem.itemOf(binder(), EventDispatcher.class);
+      DynamicItem.bind(binder(), EventDispatcher.class).to(EventBroker.class);
+    }
+  }
+
+  /** Listeners to receive changes as they happen (limited by visibility of user). */
+  protected final PluginSetContext<UserScopedEventListener> listeners;
+
+  /** Listeners to receive all changes as they happen. */
+  protected final PluginSetContext<EventListener> unrestrictedListeners;
+
+  private final PermissionBackend permissionBackend;
+  protected final ProjectCache projectCache;
+
+  protected final ChangeNotes.Factory notesFactory;
+
+  protected final Provider<ReviewDb> dbProvider;
+
+  @Inject
+  public EventBroker(
+      PluginSetContext<UserScopedEventListener> listeners,
+      PluginSetContext<EventListener> unrestrictedListeners,
+      PermissionBackend permissionBackend,
+      ProjectCache projectCache,
+      ChangeNotes.Factory notesFactory,
+      Provider<ReviewDb> dbProvider) {
+    this.listeners = listeners;
+    this.unrestrictedListeners = unrestrictedListeners;
+    this.permissionBackend = permissionBackend;
+    this.projectCache = projectCache;
+    this.notesFactory = notesFactory;
+    this.dbProvider = dbProvider;
+  }
+
+  @Override
+  public void postEvent(Change change, ChangeEvent event)
+      throws OrmException, PermissionBackendException {
+    fireEvent(change, event);
+  }
+
+  @Override
+  public void postEvent(Branch.NameKey branchName, RefEvent event)
+      throws PermissionBackendException {
+    fireEvent(branchName, event);
+  }
+
+  @Override
+  public void postEvent(Project.NameKey projectName, ProjectEvent event) {
+    fireEvent(projectName, event);
+  }
+
+  @Override
+  public void postEvent(Event event) throws OrmException, PermissionBackendException {
+    fireEvent(event);
+  }
+
+  protected void fireEventForUnrestrictedListeners(Event event) {
+    unrestrictedListeners.runEach(l -> l.onEvent(event));
+  }
+
+  protected void fireEvent(Change change, ChangeEvent event)
+      throws OrmException, PermissionBackendException {
+    for (PluginSetEntryContext<UserScopedEventListener> c : listeners) {
+      CurrentUser user = c.call(l -> l.getUser());
+      if (isVisibleTo(change, user)) {
+        c.run(l -> l.onEvent(event));
+      }
+    }
+    fireEventForUnrestrictedListeners(event);
+  }
+
+  protected void fireEvent(Project.NameKey project, ProjectEvent event) {
+    for (PluginSetEntryContext<UserScopedEventListener> c : listeners) {
+      CurrentUser user = c.call(l -> l.getUser());
+      if (isVisibleTo(project, user)) {
+        c.run(l -> l.onEvent(event));
+      }
+    }
+    fireEventForUnrestrictedListeners(event);
+  }
+
+  protected void fireEvent(Branch.NameKey branchName, RefEvent event)
+      throws PermissionBackendException {
+    for (PluginSetEntryContext<UserScopedEventListener> c : listeners) {
+      CurrentUser user = c.call(l -> l.getUser());
+      if (isVisibleTo(branchName, user)) {
+        c.run(l -> l.onEvent(event));
+      }
+    }
+    fireEventForUnrestrictedListeners(event);
+  }
+
+  protected void fireEvent(Event event) throws OrmException, PermissionBackendException {
+    for (PluginSetEntryContext<UserScopedEventListener> c : listeners) {
+      CurrentUser user = c.call(l -> l.getUser());
+      if (isVisibleTo(event, user)) {
+        c.run(l -> l.onEvent(event));
+      }
+    }
+    fireEventForUnrestrictedListeners(event);
+  }
+
+  protected boolean isVisibleTo(Project.NameKey project, CurrentUser user) {
+    try {
+      ProjectState state = projectCache.get(project);
+      if (state == null || !state.statePermitsRead()) {
+        return false;
+      }
+
+      permissionBackend.user(user).project(project).check(ProjectPermission.ACCESS);
+      return true;
+    } catch (AuthException | PermissionBackendException e) {
+      return false;
+    }
+  }
+
+  protected boolean isVisibleTo(Change change, CurrentUser user)
+      throws OrmException, PermissionBackendException {
+    if (change == null) {
+      return false;
+    }
+    ProjectState pe = projectCache.get(change.getProject());
+    if (pe == null || !pe.statePermitsRead()) {
+      return false;
+    }
+    ReviewDb db = dbProvider.get();
+    try {
+      permissionBackend
+          .user(user)
+          .change(notesFactory.createChecked(db, change))
+          .database(db)
+          .check(ChangePermission.READ);
+      return true;
+    } catch (AuthException e) {
+      return false;
+    }
+  }
+
+  protected boolean isVisibleTo(Branch.NameKey branchName, CurrentUser user)
+      throws PermissionBackendException {
+    ProjectState pe = projectCache.get(branchName.getParentKey());
+    if (pe == null || !pe.statePermitsRead()) {
+      return false;
+    }
+
+    try {
+      permissionBackend.user(user).ref(branchName).check(RefPermission.READ);
+      return true;
+    } catch (AuthException e) {
+      return false;
+    }
+  }
+
+  protected boolean isVisibleTo(Event event, CurrentUser user)
+      throws OrmException, PermissionBackendException {
+    if (event instanceof RefEvent) {
+      RefEvent refEvent = (RefEvent) event;
+      String ref = refEvent.getRefName();
+      if (PatchSet.isChangeRef(ref)) {
+        Change.Id cid = PatchSet.Id.fromRef(ref).getParentKey();
+        try {
+          Change change =
+              notesFactory
+                  .createChecked(dbProvider.get(), refEvent.getProjectNameKey(), cid)
+                  .getChange();
+          return isVisibleTo(change, user);
+        } catch (NoSuchChangeException e) {
+          logger.atFine().log(
+              "Change %s cannot be found, falling back on ref visibility check", cid.id);
+        }
+      }
+      return isVisibleTo(refEvent.getBranchNameKey(), user);
+    } else if (event instanceof ProjectEvent) {
+      return isVisibleTo(((ProjectEvent) event).getProjectNameKey(), user);
+    }
+    return true;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/EventDeserializer.java b/java/com/google/gerrit/server/events/EventDeserializer.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/events/EventDeserializer.java
rename to java/com/google/gerrit/server/events/EventDeserializer.java
diff --git a/java/com/google/gerrit/server/events/EventDispatcher.java b/java/com/google/gerrit/server/events/EventDispatcher.java
new file mode 100644
index 0000000..cbf547e
--- /dev/null
+++ b/java/com/google/gerrit/server/events/EventDispatcher.java
@@ -0,0 +1,63 @@
+// Copyright (C) 2015 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.google.gerrit.server.events;
+
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+
+/** Interface for posting (dispatching) Events */
+public interface EventDispatcher {
+  /**
+   * Post a stream event that is related to a change
+   *
+   * @param change The change that the event is related to
+   * @param event The event to post
+   * @throws OrmException on failure to post the event due to DB error
+   * @throws PermissionBackendException on failure of permission checks
+   */
+  void postEvent(Change change, ChangeEvent event) throws OrmException, PermissionBackendException;
+
+  /**
+   * Post a stream event that is related to a branch
+   *
+   * @param branchName The branch that the event is related to
+   * @param event The event to post
+   * @throws PermissionBackendException on failure of permission checks
+   */
+  void postEvent(Branch.NameKey branchName, RefEvent event) throws PermissionBackendException;
+
+  /**
+   * Post a stream event that is related to a project.
+   *
+   * @param projectName The project that the event is related to.
+   * @param event The event to post.
+   */
+  void postEvent(Project.NameKey projectName, ProjectEvent event);
+
+  /**
+   * Post a stream event generically.
+   *
+   * <p>If you are creating a RefEvent or ChangeEvent from scratch, it is more efficient to use the
+   * specific postEvent methods for those use cases.
+   *
+   * @param event The event to post.
+   * @throws OrmException on failure to post the event due to DB error
+   * @throws PermissionBackendException on failure of permission checks
+   */
+  void postEvent(Event event) throws OrmException, PermissionBackendException;
+}
diff --git a/java/com/google/gerrit/server/events/EventFactory.java b/java/com/google/gerrit/server/events/EventFactory.java
new file mode 100644
index 0000000..2550efd
--- /dev/null
+++ b/java/com/google/gerrit/server/events/EventFactory.java
@@ -0,0 +1,686 @@
+// Copyright (C) 2010 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.google.gerrit.server.events;
+
+import static java.util.Comparator.comparing;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Lists;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.LabelTypes;
+import com.google.gerrit.common.data.SubmitRecord;
+import com.google.gerrit.common.data.SubmitRequirement;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.index.IndexConfig;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.client.UserIdentity;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.account.Emails;
+import com.google.gerrit.server.change.ChangeKindCache;
+import com.google.gerrit.server.config.UrlFormatter;
+import com.google.gerrit.server.data.AccountAttribute;
+import com.google.gerrit.server.data.ApprovalAttribute;
+import com.google.gerrit.server.data.ChangeAttribute;
+import com.google.gerrit.server.data.DependencyAttribute;
+import com.google.gerrit.server.data.MessageAttribute;
+import com.google.gerrit.server.data.PatchAttribute;
+import com.google.gerrit.server.data.PatchSetAttribute;
+import com.google.gerrit.server.data.PatchSetCommentAttribute;
+import com.google.gerrit.server.data.RefUpdateAttribute;
+import com.google.gerrit.server.data.SubmitLabelAttribute;
+import com.google.gerrit.server.data.SubmitRecordAttribute;
+import com.google.gerrit.server.data.SubmitRequirementAttribute;
+import com.google.gerrit.server.data.TrackingIdAttribute;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.patch.PatchList;
+import com.google.gerrit.server.patch.PatchListCache;
+import com.google.gerrit.server.patch.PatchListEntry;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+import com.google.gerrit.server.patch.PatchListObjectTooLargeException;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+@Singleton
+public class EventFactory {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final AccountCache accountCache;
+  private final DynamicItem<UrlFormatter> urlFormatter;
+  private final Emails emails;
+  private final PatchListCache patchListCache;
+  private final Provider<PersonIdent> myIdent;
+  private final ChangeData.Factory changeDataFactory;
+  private final ApprovalsUtil approvalsUtil;
+  private final ChangeKindCache changeKindCache;
+  private final Provider<InternalChangeQuery> queryProvider;
+  private final SchemaFactory<ReviewDb> schema;
+  private final IndexConfig indexConfig;
+
+  @Inject
+  EventFactory(
+      AccountCache accountCache,
+      Emails emails,
+      DynamicItem<UrlFormatter> urlFormatter,
+      PatchListCache patchListCache,
+      @GerritPersonIdent Provider<PersonIdent> myIdent,
+      ChangeData.Factory changeDataFactory,
+      ApprovalsUtil approvalsUtil,
+      ChangeKindCache changeKindCache,
+      Provider<InternalChangeQuery> queryProvider,
+      SchemaFactory<ReviewDb> schema,
+      IndexConfig indexConfig) {
+    this.accountCache = accountCache;
+    this.urlFormatter = urlFormatter;
+    this.emails = emails;
+    this.patchListCache = patchListCache;
+    this.myIdent = myIdent;
+    this.changeDataFactory = changeDataFactory;
+    this.approvalsUtil = approvalsUtil;
+    this.changeKindCache = changeKindCache;
+    this.queryProvider = queryProvider;
+    this.schema = schema;
+    this.indexConfig = indexConfig;
+  }
+
+  /**
+   * Create a ChangeAttribute for the given change suitable for serialization to JSON.
+   *
+   * @param change
+   * @return object suitable for serialization to JSON
+   */
+  public ChangeAttribute asChangeAttribute(Change change, ChangeNotes notes) {
+    try (ReviewDb db = schema.open()) {
+      return asChangeAttribute(db, change, notes);
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log("Cannot open database connection");
+      return new ChangeAttribute();
+    }
+  }
+
+  /**
+   * Create a ChangeAttribute for the given change suitable for serialization to JSON.
+   *
+   * @param db Review database
+   * @param change
+   * @return object suitable for serialization to JSON
+   */
+  public ChangeAttribute asChangeAttribute(ReviewDb db, Change change) {
+    ChangeAttribute a = new ChangeAttribute();
+    a.project = change.getProject().get();
+    a.branch = change.getDest().getShortName();
+    a.topic = change.getTopic();
+    a.id = change.getKey().get();
+    a.number = change.getId().get();
+    a.subject = change.getSubject();
+    try {
+      a.commitMessage = changeDataFactory.create(db, change).commitMessage();
+    } catch (Exception e) {
+      logger.atSevere().withCause(e).log(
+          "Error while getting full commit message for change %d", a.number);
+    }
+    a.url = getChangeUrl(change);
+    a.owner = asAccountAttribute(change.getOwner());
+    a.assignee = asAccountAttribute(change.getAssignee());
+    a.status = change.getStatus();
+    a.createdOn = change.getCreatedOn().getTime() / 1000L;
+    a.wip = change.isWorkInProgress() ? true : null;
+    a.isPrivate = change.isPrivate() ? true : null;
+    return a;
+  }
+
+  /**
+   * Create a ChangeAttribute for the given change suitable for serialization to JSON.
+   *
+   * @param db Review database
+   * @param change
+   * @param notes
+   * @return object suitable for serialization to JSON
+   */
+  public ChangeAttribute asChangeAttribute(ReviewDb db, Change change, ChangeNotes notes)
+      throws OrmException {
+    ChangeAttribute a = asChangeAttribute(db, change);
+    Set<String> hashtags = notes.load().getHashtags();
+    if (!hashtags.isEmpty()) {
+      a.hashtags = new ArrayList<>(hashtags.size());
+      a.hashtags.addAll(hashtags);
+    }
+    return a;
+  }
+  /**
+   * Create a RefUpdateAttribute for the given old ObjectId, new ObjectId, and branch that is
+   * suitable for serialization to JSON.
+   *
+   * @param oldId
+   * @param newId
+   * @param refName
+   * @return object suitable for serialization to JSON
+   */
+  public RefUpdateAttribute asRefUpdateAttribute(
+      ObjectId oldId, ObjectId newId, Branch.NameKey refName) {
+    RefUpdateAttribute ru = new RefUpdateAttribute();
+    ru.newRev = newId != null ? newId.getName() : ObjectId.zeroId().getName();
+    ru.oldRev = oldId != null ? oldId.getName() : ObjectId.zeroId().getName();
+    ru.project = refName.getParentKey().get();
+    ru.refName = refName.get();
+    return ru;
+  }
+
+  /**
+   * Extend the existing ChangeAttribute with additional fields.
+   *
+   * @param a
+   * @param change
+   */
+  public void extend(ChangeAttribute a, Change change) {
+    a.lastUpdated = change.getLastUpdatedOn().getTime() / 1000L;
+    a.open = change.getStatus().isOpen();
+  }
+
+  /**
+   * Add allReviewers to an existing ChangeAttribute.
+   *
+   * @param a
+   * @param notes
+   */
+  public void addAllReviewers(ReviewDb db, ChangeAttribute a, ChangeNotes notes)
+      throws OrmException {
+    Collection<Account.Id> reviewers = approvalsUtil.getReviewers(db, notes).all();
+    if (!reviewers.isEmpty()) {
+      a.allReviewers = Lists.newArrayListWithCapacity(reviewers.size());
+      for (Account.Id id : reviewers) {
+        a.allReviewers.add(asAccountAttribute(id));
+      }
+    }
+  }
+
+  /**
+   * Add submitRecords to an existing ChangeAttribute.
+   *
+   * @param ca
+   * @param submitRecords
+   */
+  public void addSubmitRecords(ChangeAttribute ca, List<SubmitRecord> submitRecords) {
+    ca.submitRecords = new ArrayList<>();
+
+    for (SubmitRecord submitRecord : submitRecords) {
+      SubmitRecordAttribute sa = new SubmitRecordAttribute();
+      sa.status = submitRecord.status.name();
+      if (submitRecord.status != SubmitRecord.Status.RULE_ERROR) {
+        addSubmitRecordLabels(submitRecord, sa);
+        addSubmitRecordRequirements(submitRecord, sa);
+      }
+      ca.submitRecords.add(sa);
+    }
+    // Remove empty lists so a confusing label won't be displayed in the output.
+    if (ca.submitRecords.isEmpty()) {
+      ca.submitRecords = null;
+    }
+  }
+
+  private void addSubmitRecordLabels(SubmitRecord submitRecord, SubmitRecordAttribute sa) {
+    if (submitRecord.labels != null && !submitRecord.labels.isEmpty()) {
+      sa.labels = new ArrayList<>();
+      for (SubmitRecord.Label lbl : submitRecord.labels) {
+        SubmitLabelAttribute la = new SubmitLabelAttribute();
+        la.label = lbl.label;
+        la.status = lbl.status.name();
+        if (lbl.appliedBy != null) {
+          la.by = asAccountAttribute(lbl.appliedBy);
+        }
+        sa.labels.add(la);
+      }
+    }
+  }
+
+  private void addSubmitRecordRequirements(SubmitRecord submitRecord, SubmitRecordAttribute sa) {
+    if (submitRecord.requirements != null && !submitRecord.requirements.isEmpty()) {
+      sa.requirements = new ArrayList<>();
+      for (SubmitRequirement req : submitRecord.requirements) {
+        SubmitRequirementAttribute re = new SubmitRequirementAttribute();
+        re.fallbackText = req.fallbackText();
+        re.type = req.type();
+        re.data = req.data();
+        sa.requirements.add(re);
+      }
+    }
+  }
+
+  public void addDependencies(RevWalk rw, ChangeAttribute ca, Change change, PatchSet currentPs) {
+    if (change == null || currentPs == null) {
+      return;
+    }
+    ca.dependsOn = new ArrayList<>();
+    ca.neededBy = new ArrayList<>();
+    try {
+      addDependsOn(rw, ca, change, currentPs);
+      addNeededBy(rw, ca, change, currentPs);
+    } catch (OrmException | IOException e) {
+      // Squash DB exceptions and leave dependency lists partially filled.
+    }
+    // Remove empty lists so a confusing label won't be displayed in the output.
+    if (ca.dependsOn.isEmpty()) {
+      ca.dependsOn = null;
+    }
+    if (ca.neededBy.isEmpty()) {
+      ca.neededBy = null;
+    }
+  }
+
+  private void addDependsOn(RevWalk rw, ChangeAttribute ca, Change change, PatchSet currentPs)
+      throws OrmException, IOException {
+    RevCommit commit = rw.parseCommit(ObjectId.fromString(currentPs.getRevision().get()));
+    final List<String> parentNames = new ArrayList<>(commit.getParentCount());
+    for (RevCommit p : commit.getParents()) {
+      parentNames.add(p.name());
+    }
+
+    // Find changes in this project having a patch set matching any parent of
+    // this patch set's revision.
+    for (ChangeData cd : queryProvider.get().byProjectCommits(change.getProject(), parentNames)) {
+      for (PatchSet ps : cd.patchSets()) {
+        for (String p : parentNames) {
+          if (!ps.getRevision().get().equals(p)) {
+            continue;
+          }
+          ca.dependsOn.add(newDependsOn(requireNonNull(cd.change()), ps));
+        }
+      }
+    }
+    // Sort by original parent order.
+    ca.dependsOn.sort(
+        comparing(
+            d -> {
+              for (int i = 0; i < parentNames.size(); i++) {
+                if (parentNames.get(i).equals(d.revision)) {
+                  return i;
+                }
+              }
+              return parentNames.size() + 1;
+            }));
+  }
+
+  private void addNeededBy(RevWalk rw, ChangeAttribute ca, Change change, PatchSet currentPs)
+      throws OrmException, IOException {
+    if (currentPs.getGroups().isEmpty()) {
+      return;
+    }
+    String rev = currentPs.getRevision().get();
+    // Find changes in the same related group as this patch set, having a patch
+    // set whose parent matches this patch set's revision.
+    for (ChangeData cd :
+        InternalChangeQuery.byProjectGroups(
+            queryProvider, indexConfig, change.getProject(), currentPs.getGroups())) {
+      PATCH_SETS:
+      for (PatchSet ps : cd.patchSets()) {
+        RevCommit commit = rw.parseCommit(ObjectId.fromString(ps.getRevision().get()));
+        for (RevCommit p : commit.getParents()) {
+          if (!p.name().equals(rev)) {
+            continue;
+          }
+          ca.neededBy.add(newNeededBy(requireNonNull(cd.change()), ps));
+          continue PATCH_SETS;
+        }
+      }
+    }
+  }
+
+  private DependencyAttribute newDependsOn(Change c, PatchSet ps) {
+    DependencyAttribute d = newDependencyAttribute(c, ps);
+    d.isCurrentPatchSet = ps.getId().equals(c.currentPatchSetId());
+    return d;
+  }
+
+  private DependencyAttribute newNeededBy(Change c, PatchSet ps) {
+    return newDependencyAttribute(c, ps);
+  }
+
+  private DependencyAttribute newDependencyAttribute(Change c, PatchSet ps) {
+    DependencyAttribute d = new DependencyAttribute();
+    d.number = c.getId().get();
+    d.id = c.getKey().toString();
+    d.revision = ps.getRevision().get();
+    d.ref = ps.getRefName();
+    return d;
+  }
+
+  public void addTrackingIds(ChangeAttribute a, ListMultimap<String, String> set) {
+    if (!set.isEmpty()) {
+      a.trackingIds = new ArrayList<>(set.size());
+      for (Map.Entry<String, Collection<String>> e : set.asMap().entrySet()) {
+        for (String id : e.getValue()) {
+          TrackingIdAttribute t = new TrackingIdAttribute();
+          t.system = e.getKey();
+          t.id = id;
+          a.trackingIds.add(t);
+        }
+      }
+    }
+  }
+
+  public void addCommitMessage(ChangeAttribute a, String commitMessage) {
+    a.commitMessage = commitMessage;
+  }
+
+  public void addPatchSets(
+      ReviewDb db,
+      RevWalk revWalk,
+      ChangeAttribute ca,
+      Collection<PatchSet> ps,
+      Map<PatchSet.Id, Collection<PatchSetApproval>> approvals,
+      LabelTypes labelTypes) {
+    addPatchSets(db, revWalk, ca, ps, approvals, false, null, labelTypes);
+  }
+
+  public void addPatchSets(
+      ReviewDb db,
+      RevWalk revWalk,
+      ChangeAttribute ca,
+      Collection<PatchSet> ps,
+      Map<PatchSet.Id, Collection<PatchSetApproval>> approvals,
+      boolean includeFiles,
+      Change change,
+      LabelTypes labelTypes) {
+    if (!ps.isEmpty()) {
+      ca.patchSets = new ArrayList<>(ps.size());
+      for (PatchSet p : ps) {
+        PatchSetAttribute psa = asPatchSetAttribute(db, revWalk, change, p);
+        if (approvals != null) {
+          addApprovals(psa, p.getId(), approvals, labelTypes);
+        }
+        ca.patchSets.add(psa);
+        if (includeFiles) {
+          addPatchSetFileNames(psa, change, p);
+        }
+      }
+    }
+  }
+
+  public void addPatchSetComments(
+      PatchSetAttribute patchSetAttribute, Collection<Comment> comments) {
+    for (Comment comment : comments) {
+      if (comment.key.patchSetId == patchSetAttribute.number) {
+        if (patchSetAttribute.comments == null) {
+          patchSetAttribute.comments = new ArrayList<>();
+        }
+        patchSetAttribute.comments.add(asPatchSetLineAttribute(comment));
+      }
+    }
+  }
+
+  public void addPatchSetFileNames(
+      PatchSetAttribute patchSetAttribute, Change change, PatchSet patchSet) {
+    try {
+      PatchList patchList = patchListCache.get(change, patchSet);
+      for (PatchListEntry patch : patchList.getPatches()) {
+        if (patchSetAttribute.files == null) {
+          patchSetAttribute.files = new ArrayList<>();
+        }
+
+        PatchAttribute p = new PatchAttribute();
+        p.file = patch.getNewName();
+        p.fileOld = patch.getOldName();
+        p.type = patch.getChangeType();
+        p.deletions -= patch.getDeletions();
+        p.insertions = patch.getInsertions();
+        patchSetAttribute.files.add(p);
+      }
+    } catch (PatchListObjectTooLargeException e) {
+      logger.atWarning().log("Cannot get patch list: %s", e.getMessage());
+    } catch (PatchListNotAvailableException e) {
+      logger.atSevere().withCause(e).log("Cannot get patch list");
+    }
+  }
+
+  public void addComments(ChangeAttribute ca, Collection<ChangeMessage> messages) {
+    if (!messages.isEmpty()) {
+      ca.comments = new ArrayList<>();
+      for (ChangeMessage message : messages) {
+        ca.comments.add(asMessageAttribute(message));
+      }
+    }
+  }
+
+  /**
+   * Create a PatchSetAttribute for the given patchset suitable for serialization to JSON.
+   *
+   * @param revWalk
+   * @param patchSet
+   * @return object suitable for serialization to JSON
+   */
+  public PatchSetAttribute asPatchSetAttribute(RevWalk revWalk, Change change, PatchSet patchSet) {
+    try (ReviewDb db = schema.open()) {
+      return asPatchSetAttribute(db, revWalk, change, patchSet);
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log("Cannot open database connection");
+      return new PatchSetAttribute();
+    }
+  }
+
+  /**
+   * Create a PatchSetAttribute for the given patchset suitable for serialization to JSON.
+   *
+   * @param db Review database
+   * @param patchSet
+   * @return object suitable for serialization to JSON
+   */
+  public PatchSetAttribute asPatchSetAttribute(
+      ReviewDb db, RevWalk revWalk, Change change, PatchSet patchSet) {
+    PatchSetAttribute p = new PatchSetAttribute();
+    p.revision = patchSet.getRevision().get();
+    p.number = patchSet.getPatchSetId();
+    p.ref = patchSet.getRefName();
+    p.uploader = asAccountAttribute(patchSet.getUploader());
+    p.createdOn = patchSet.getCreatedOn().getTime() / 1000L;
+    PatchSet.Id pId = patchSet.getId();
+    try {
+      p.parents = new ArrayList<>();
+      RevCommit c = revWalk.parseCommit(ObjectId.fromString(p.revision));
+      for (RevCommit parent : c.getParents()) {
+        p.parents.add(parent.name());
+      }
+
+      UserIdentity author = toUserIdentity(c.getAuthorIdent());
+      if (author.getAccount() == null) {
+        p.author = new AccountAttribute();
+        p.author.email = author.getEmail();
+        p.author.name = author.getName();
+        p.author.username = "";
+      } else {
+        p.author = asAccountAttribute(author.getAccount());
+      }
+
+      List<Patch> list = patchListCache.get(change, patchSet).toPatchList(pId);
+      for (Patch pe : list) {
+        if (!Patch.isMagic(pe.getFileName())) {
+          p.sizeDeletions -= pe.getDeletions();
+          p.sizeInsertions += pe.getInsertions();
+        }
+      }
+      p.kind = changeKindCache.getChangeKind(db, change, patchSet);
+    } catch (IOException | OrmException e) {
+      logger.atSevere().withCause(e).log("Cannot load patch set data for %s", patchSet.getId());
+    } catch (PatchListObjectTooLargeException e) {
+      logger.atWarning().log("Cannot get size information for %s: %s", pId, e.getMessage());
+    } catch (PatchListNotAvailableException e) {
+      logger.atSevere().withCause(e).log("Cannot get size information for %s.", pId);
+    }
+    return p;
+  }
+
+  // TODO: The same method exists in PatchSetInfoFactory, find a common place
+  // for it
+  private UserIdentity toUserIdentity(PersonIdent who) throws IOException, OrmException {
+    UserIdentity u = new UserIdentity();
+    u.setName(who.getName());
+    u.setEmail(who.getEmailAddress());
+    u.setDate(new Timestamp(who.getWhen().getTime()));
+    u.setTimeZone(who.getTimeZoneOffset());
+
+    // If only one account has access to this email address, select it
+    // as the identity of the user.
+    //
+    Set<Account.Id> a = emails.getAccountFor(u.getEmail());
+    if (a.size() == 1) {
+      u.setAccount(a.iterator().next());
+    }
+
+    return u;
+  }
+
+  public void addApprovals(
+      PatchSetAttribute p,
+      PatchSet.Id id,
+      Map<PatchSet.Id, Collection<PatchSetApproval>> all,
+      LabelTypes labelTypes) {
+    Collection<PatchSetApproval> list = all.get(id);
+    if (list != null) {
+      addApprovals(p, list, labelTypes);
+    }
+  }
+
+  public void addApprovals(
+      PatchSetAttribute p, Collection<PatchSetApproval> list, LabelTypes labelTypes) {
+    if (!list.isEmpty()) {
+      p.approvals = new ArrayList<>(list.size());
+      for (PatchSetApproval a : list) {
+        if (a.getValue() != 0) {
+          p.approvals.add(asApprovalAttribute(a, labelTypes));
+        }
+      }
+      if (p.approvals.isEmpty()) {
+        p.approvals = null;
+      }
+    }
+  }
+
+  /**
+   * Create an AuthorAttribute for the given account suitable for serialization to JSON.
+   *
+   * @param id
+   * @return object suitable for serialization to JSON
+   */
+  public AccountAttribute asAccountAttribute(Account.Id id) {
+    if (id == null) {
+      return null;
+    }
+    return accountCache.get(id).map(this::asAccountAttribute).orElse(null);
+  }
+
+  /**
+   * Create an AuthorAttribute for the given account suitable for serialization to JSON.
+   *
+   * @param accountState the account state
+   * @return object suitable for serialization to JSON
+   */
+  public AccountAttribute asAccountAttribute(AccountState accountState) {
+    AccountAttribute who = new AccountAttribute();
+    who.name = accountState.getAccount().getFullName();
+    who.email = accountState.getAccount().getPreferredEmail();
+    who.username = accountState.getUserName().orElse(null);
+    return who;
+  }
+
+  /**
+   * Create an AuthorAttribute for the given person ident suitable for serialization to JSON.
+   *
+   * @param ident
+   * @return object suitable for serialization to JSON
+   */
+  public AccountAttribute asAccountAttribute(PersonIdent ident) {
+    AccountAttribute who = new AccountAttribute();
+    who.name = ident.getName();
+    who.email = ident.getEmailAddress();
+    return who;
+  }
+
+  /**
+   * Create an ApprovalAttribute for the given approval suitable for serialization to JSON.
+   *
+   * @param approval
+   * @param labelTypes label types for the containing project
+   * @return object suitable for serialization to JSON
+   */
+  public ApprovalAttribute asApprovalAttribute(PatchSetApproval approval, LabelTypes labelTypes) {
+    ApprovalAttribute a = new ApprovalAttribute();
+    a.type = approval.getLabelId().get();
+    a.value = Short.toString(approval.getValue());
+    a.by = asAccountAttribute(approval.getAccountId());
+    a.grantedOn = approval.getGranted().getTime() / 1000L;
+    a.oldValue = null;
+
+    LabelType lt = labelTypes.byLabel(approval.getLabelId());
+    if (lt != null) {
+      a.description = lt.getName();
+    }
+    return a;
+  }
+
+  public MessageAttribute asMessageAttribute(ChangeMessage message) {
+    MessageAttribute a = new MessageAttribute();
+    a.timestamp = message.getWrittenOn().getTime() / 1000L;
+    a.reviewer =
+        message.getAuthor() != null
+            ? asAccountAttribute(message.getAuthor())
+            : asAccountAttribute(myIdent.get());
+    a.message = message.getMessage();
+    return a;
+  }
+
+  public PatchSetCommentAttribute asPatchSetLineAttribute(Comment c) {
+    PatchSetCommentAttribute a = new PatchSetCommentAttribute();
+    a.reviewer = asAccountAttribute(c.author.getId());
+    a.file = c.key.filename;
+    a.line = c.lineNbr;
+    a.message = c.message;
+    return a;
+  }
+
+  /** Get a link to the change; null if the server doesn't know its own address. */
+  private String getChangeUrl(Change change) {
+    if (change != null) {
+      return urlFormatter.get().getChangeViewUrl(change.getProject(), change.getId()).orElse(null);
+    }
+    return null;
+  }
+}
diff --git a/java/com/google/gerrit/server/events/EventListener.java b/java/com/google/gerrit/server/events/EventListener.java
new file mode 100644
index 0000000..8abca12
--- /dev/null
+++ b/java/com/google/gerrit/server/events/EventListener.java
@@ -0,0 +1,26 @@
+// Copyright (C) 2010 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.google.gerrit.server.events;
+
+import com.google.gerrit.extensions.annotations.ExtensionPoint;
+
+/**
+ * Allows to listen to events without user visibility restrictions. To listen to events visible to a
+ * specific user, use {@link UserScopedEventListener}.
+ */
+@ExtensionPoint
+public interface EventListener {
+  void onEvent(Event event);
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/EventTypes.java b/java/com/google/gerrit/server/events/EventTypes.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/events/EventTypes.java
rename to java/com/google/gerrit/server/events/EventTypes.java
diff --git a/java/com/google/gerrit/server/events/EventsMetrics.java b/java/com/google/gerrit/server/events/EventsMetrics.java
new file mode 100644
index 0000000..f73d6de
--- /dev/null
+++ b/java/com/google/gerrit/server/events/EventsMetrics.java
@@ -0,0 +1,41 @@
+// Copyright (C) 2015 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.google.gerrit.server.events;
+
+import com.google.gerrit.metrics.Counter1;
+import com.google.gerrit.metrics.Description;
+import com.google.gerrit.metrics.Field;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class EventsMetrics implements EventListener {
+  private final Counter1<String> events;
+
+  @Inject
+  public EventsMetrics(MetricMaker metricMaker) {
+    events =
+        metricMaker.newCounter(
+            "events",
+            new Description("Triggered events").setRate().setUnit("triggered events"),
+            Field.ofString("type"));
+  }
+
+  @Override
+  public void onEvent(com.google.gerrit.server.events.Event event) {
+    events.increment(event.getType());
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/HashtagsChangedEvent.java b/java/com/google/gerrit/server/events/HashtagsChangedEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/events/HashtagsChangedEvent.java
rename to java/com/google/gerrit/server/events/HashtagsChangedEvent.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/PatchSetCreatedEvent.java b/java/com/google/gerrit/server/events/PatchSetCreatedEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/events/PatchSetCreatedEvent.java
rename to java/com/google/gerrit/server/events/PatchSetCreatedEvent.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/PatchSetEvent.java b/java/com/google/gerrit/server/events/PatchSetEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/events/PatchSetEvent.java
rename to java/com/google/gerrit/server/events/PatchSetEvent.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/PrivateStateChangedEvent.java b/java/com/google/gerrit/server/events/PrivateStateChangedEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/events/PrivateStateChangedEvent.java
rename to java/com/google/gerrit/server/events/PrivateStateChangedEvent.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/ProjectCreatedEvent.java b/java/com/google/gerrit/server/events/ProjectCreatedEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/events/ProjectCreatedEvent.java
rename to java/com/google/gerrit/server/events/ProjectCreatedEvent.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/ProjectEvent.java b/java/com/google/gerrit/server/events/ProjectEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/events/ProjectEvent.java
rename to java/com/google/gerrit/server/events/ProjectEvent.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/ProjectNameKeySerializer.java b/java/com/google/gerrit/server/events/ProjectNameKeySerializer.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/events/ProjectNameKeySerializer.java
rename to java/com/google/gerrit/server/events/ProjectNameKeySerializer.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/RefEvent.java b/java/com/google/gerrit/server/events/RefEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/events/RefEvent.java
rename to java/com/google/gerrit/server/events/RefEvent.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/RefReceivedEvent.java b/java/com/google/gerrit/server/events/RefReceivedEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/events/RefReceivedEvent.java
rename to java/com/google/gerrit/server/events/RefReceivedEvent.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/RefUpdatedEvent.java b/java/com/google/gerrit/server/events/RefUpdatedEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/events/RefUpdatedEvent.java
rename to java/com/google/gerrit/server/events/RefUpdatedEvent.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/ReviewerAddedEvent.java b/java/com/google/gerrit/server/events/ReviewerAddedEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/events/ReviewerAddedEvent.java
rename to java/com/google/gerrit/server/events/ReviewerAddedEvent.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/ReviewerDeletedEvent.java b/java/com/google/gerrit/server/events/ReviewerDeletedEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/events/ReviewerDeletedEvent.java
rename to java/com/google/gerrit/server/events/ReviewerDeletedEvent.java
diff --git a/java/com/google/gerrit/server/events/StreamEventsApiListener.java b/java/com/google/gerrit/server/events/StreamEventsApiListener.java
new file mode 100644
index 0000000..972266a
--- /dev/null
+++ b/java/com/google/gerrit/server/events/StreamEventsApiListener.java
@@ -0,0 +1,539 @@
+// 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.
+
+package com.google.gerrit.server.events;
+
+import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
+import com.google.common.collect.Sets;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.LabelTypes;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.ApprovalInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.RevisionInfo;
+import com.google.gerrit.extensions.events.AssigneeChangedListener;
+import com.google.gerrit.extensions.events.ChangeAbandonedListener;
+import com.google.gerrit.extensions.events.ChangeDeletedListener;
+import com.google.gerrit.extensions.events.ChangeMergedListener;
+import com.google.gerrit.extensions.events.ChangeRestoredListener;
+import com.google.gerrit.extensions.events.CommentAddedListener;
+import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
+import com.google.gerrit.extensions.events.HashtagsEditedListener;
+import com.google.gerrit.extensions.events.NewProjectCreatedListener;
+import com.google.gerrit.extensions.events.PrivateStateChangedListener;
+import com.google.gerrit.extensions.events.ReviewerAddedListener;
+import com.google.gerrit.extensions.events.ReviewerDeletedListener;
+import com.google.gerrit.extensions.events.RevisionCreatedListener;
+import com.google.gerrit.extensions.events.TopicEditedListener;
+import com.google.gerrit.extensions.events.VoteDeletedListener;
+import com.google.gerrit.extensions.events.WorkInProgressStateChangedListener;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.data.AccountAttribute;
+import com.google.gerrit.server.data.ApprovalAttribute;
+import com.google.gerrit.server.data.ChangeAttribute;
+import com.google.gerrit.server.data.PatchSetAttribute;
+import com.google.gerrit.server.data.RefUpdateAttribute;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.plugincontext.PluginItemContext;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.AbstractModule;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+@Singleton
+public class StreamEventsApiListener
+    implements AssigneeChangedListener,
+        ChangeAbandonedListener,
+        ChangeDeletedListener,
+        ChangeMergedListener,
+        ChangeRestoredListener,
+        WorkInProgressStateChangedListener,
+        PrivateStateChangedListener,
+        CommentAddedListener,
+        GitReferenceUpdatedListener,
+        HashtagsEditedListener,
+        NewProjectCreatedListener,
+        ReviewerAddedListener,
+        ReviewerDeletedListener,
+        RevisionCreatedListener,
+        TopicEditedListener,
+        VoteDeletedListener {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static class Module extends AbstractModule {
+    @Override
+    protected void configure() {
+      DynamicSet.bind(binder(), AssigneeChangedListener.class).to(StreamEventsApiListener.class);
+      DynamicSet.bind(binder(), ChangeAbandonedListener.class).to(StreamEventsApiListener.class);
+      DynamicSet.bind(binder(), ChangeDeletedListener.class).to(StreamEventsApiListener.class);
+      DynamicSet.bind(binder(), ChangeMergedListener.class).to(StreamEventsApiListener.class);
+      DynamicSet.bind(binder(), ChangeRestoredListener.class).to(StreamEventsApiListener.class);
+      DynamicSet.bind(binder(), CommentAddedListener.class).to(StreamEventsApiListener.class);
+      DynamicSet.bind(binder(), GitReferenceUpdatedListener.class)
+          .to(StreamEventsApiListener.class);
+      DynamicSet.bind(binder(), HashtagsEditedListener.class).to(StreamEventsApiListener.class);
+      DynamicSet.bind(binder(), NewProjectCreatedListener.class).to(StreamEventsApiListener.class);
+      DynamicSet.bind(binder(), PrivateStateChangedListener.class)
+          .to(StreamEventsApiListener.class);
+      DynamicSet.bind(binder(), ReviewerAddedListener.class).to(StreamEventsApiListener.class);
+      DynamicSet.bind(binder(), ReviewerDeletedListener.class).to(StreamEventsApiListener.class);
+      DynamicSet.bind(binder(), RevisionCreatedListener.class).to(StreamEventsApiListener.class);
+      DynamicSet.bind(binder(), TopicEditedListener.class).to(StreamEventsApiListener.class);
+      DynamicSet.bind(binder(), VoteDeletedListener.class).to(StreamEventsApiListener.class);
+      DynamicSet.bind(binder(), WorkInProgressStateChangedListener.class)
+          .to(StreamEventsApiListener.class);
+    }
+  }
+
+  private final PluginItemContext<EventDispatcher> dispatcher;
+  private final Provider<ReviewDb> db;
+  private final EventFactory eventFactory;
+  private final ProjectCache projectCache;
+  private final GitRepositoryManager repoManager;
+  private final PatchSetUtil psUtil;
+  private final ChangeNotes.Factory changeNotesFactory;
+
+  @Inject
+  StreamEventsApiListener(
+      PluginItemContext<EventDispatcher> dispatcher,
+      Provider<ReviewDb> db,
+      EventFactory eventFactory,
+      ProjectCache projectCache,
+      GitRepositoryManager repoManager,
+      PatchSetUtil psUtil,
+      ChangeNotes.Factory changeNotesFactory) {
+    this.dispatcher = dispatcher;
+    this.db = db;
+    this.eventFactory = eventFactory;
+    this.projectCache = projectCache;
+    this.repoManager = repoManager;
+    this.psUtil = psUtil;
+    this.changeNotesFactory = changeNotesFactory;
+  }
+
+  private ChangeNotes getNotes(ChangeInfo info) throws OrmException {
+    try {
+      return changeNotesFactory.createChecked(new Change.Id(info._number));
+    } catch (NoSuchChangeException e) {
+      throw new OrmException(e);
+    }
+  }
+
+  private PatchSet getPatchSet(ChangeNotes notes, RevisionInfo info) throws OrmException {
+    return psUtil.get(db.get(), notes, PatchSet.Id.fromRef(info.ref));
+  }
+
+  private Supplier<ChangeAttribute> changeAttributeSupplier(Change change, ChangeNotes notes) {
+    return Suppliers.memoize(
+        new Supplier<ChangeAttribute>() {
+          @Override
+          public ChangeAttribute get() {
+            return eventFactory.asChangeAttribute(change, notes);
+          }
+        });
+  }
+
+  private Supplier<AccountAttribute> accountAttributeSupplier(AccountInfo account) {
+    return Suppliers.memoize(
+        new Supplier<AccountAttribute>() {
+          @Override
+          public AccountAttribute get() {
+            return account != null
+                ? eventFactory.asAccountAttribute(new Account.Id(account._accountId))
+                : null;
+          }
+        });
+  }
+
+  private Supplier<PatchSetAttribute> patchSetAttributeSupplier(
+      final Change change, PatchSet patchSet) {
+    return Suppliers.memoize(
+        new Supplier<PatchSetAttribute>() {
+          @Override
+          public PatchSetAttribute get() {
+            try (Repository repo = repoManager.openRepository(change.getProject());
+                RevWalk revWalk = new RevWalk(repo)) {
+              return eventFactory.asPatchSetAttribute(revWalk, change, patchSet);
+            } catch (IOException e) {
+              throw new RuntimeException(e);
+            }
+          }
+        });
+  }
+
+  private static Map<String, Short> convertApprovalsMap(Map<String, ApprovalInfo> approvals) {
+    Map<String, Short> result = new HashMap<>();
+    for (Entry<String, ApprovalInfo> e : approvals.entrySet()) {
+      Short value = e.getValue().value == null ? null : e.getValue().value.shortValue();
+      result.put(e.getKey(), value);
+    }
+    return result;
+  }
+
+  private ApprovalAttribute getApprovalAttribute(
+      LabelTypes labelTypes, Entry<String, Short> approval, Map<String, Short> oldApprovals) {
+    ApprovalAttribute a = new ApprovalAttribute();
+    a.type = approval.getKey();
+
+    if (oldApprovals != null && !oldApprovals.isEmpty()) {
+      if (oldApprovals.get(approval.getKey()) != null) {
+        a.oldValue = Short.toString(oldApprovals.get(approval.getKey()));
+      }
+    }
+    LabelType lt = labelTypes.byLabel(approval.getKey());
+    if (lt != null) {
+      a.description = lt.getName();
+    }
+    if (approval.getValue() != null) {
+      a.value = Short.toString(approval.getValue());
+    }
+    return a;
+  }
+
+  private Supplier<ApprovalAttribute[]> approvalsAttributeSupplier(
+      final Change change,
+      Map<String, ApprovalInfo> newApprovals,
+      final Map<String, ApprovalInfo> oldApprovals) {
+    final Map<String, Short> approvals = convertApprovalsMap(newApprovals);
+    return Suppliers.memoize(
+        new Supplier<ApprovalAttribute[]>() {
+          @Override
+          public ApprovalAttribute[] get() {
+            LabelTypes labelTypes = projectCache.get(change.getProject()).getLabelTypes();
+            if (approvals.size() > 0) {
+              ApprovalAttribute[] r = new ApprovalAttribute[approvals.size()];
+              int i = 0;
+              for (Map.Entry<String, Short> approval : approvals.entrySet()) {
+                r[i++] =
+                    getApprovalAttribute(labelTypes, approval, convertApprovalsMap(oldApprovals));
+              }
+              return r;
+            }
+            return null;
+          }
+        });
+  }
+
+  String[] hashtagArray(Collection<String> hashtags) {
+    if (hashtags != null && hashtags.size() > 0) {
+      return Sets.newHashSet(hashtags).toArray(new String[hashtags.size()]);
+    }
+    return null;
+  }
+
+  @Override
+  public void onAssigneeChanged(AssigneeChangedListener.Event ev) {
+    try {
+      ChangeNotes notes = getNotes(ev.getChange());
+      Change change = notes.getChange();
+      AssigneeChangedEvent event = new AssigneeChangedEvent(change);
+
+      event.change = changeAttributeSupplier(change, notes);
+      event.changer = accountAttributeSupplier(ev.getWho());
+      event.oldAssignee = accountAttributeSupplier(ev.getOldAssignee());
+
+      dispatcher.run(d -> d.postEvent(change, event));
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log("Failed to dispatch event");
+    }
+  }
+
+  @Override
+  public void onTopicEdited(TopicEditedListener.Event ev) {
+    try {
+      ChangeNotes notes = getNotes(ev.getChange());
+      Change change = notes.getChange();
+      TopicChangedEvent event = new TopicChangedEvent(change);
+
+      event.change = changeAttributeSupplier(change, notes);
+      event.changer = accountAttributeSupplier(ev.getWho());
+      event.oldTopic = ev.getOldTopic();
+
+      dispatcher.run(d -> d.postEvent(change, event));
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log("Failed to dispatch event");
+    }
+  }
+
+  @Override
+  public void onRevisionCreated(RevisionCreatedListener.Event ev) {
+    try {
+      ChangeNotes notes = getNotes(ev.getChange());
+      Change change = notes.getChange();
+      PatchSet patchSet = getPatchSet(notes, ev.getRevision());
+      PatchSetCreatedEvent event = new PatchSetCreatedEvent(change);
+
+      event.change = changeAttributeSupplier(change, notes);
+      event.patchSet = patchSetAttributeSupplier(change, patchSet);
+      event.uploader = accountAttributeSupplier(ev.getWho());
+
+      dispatcher.run(d -> d.postEvent(change, event));
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log("Failed to dispatch event");
+    }
+  }
+
+  @Override
+  public void onReviewerDeleted(ReviewerDeletedListener.Event ev) {
+    try {
+      ChangeNotes notes = getNotes(ev.getChange());
+      Change change = notes.getChange();
+      ReviewerDeletedEvent event = new ReviewerDeletedEvent(change);
+      event.change = changeAttributeSupplier(change, notes);
+      event.patchSet = patchSetAttributeSupplier(change, psUtil.current(db.get(), notes));
+      event.reviewer = accountAttributeSupplier(ev.getReviewer());
+      event.remover = accountAttributeSupplier(ev.getWho());
+      event.comment = ev.getComment();
+      event.approvals =
+          approvalsAttributeSupplier(change, ev.getNewApprovals(), ev.getOldApprovals());
+
+      dispatcher.run(d -> d.postEvent(change, event));
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log("Failed to dispatch event");
+    }
+  }
+
+  @Override
+  public void onReviewersAdded(ReviewerAddedListener.Event ev) {
+    try {
+      ChangeNotes notes = getNotes(ev.getChange());
+      Change change = notes.getChange();
+      ReviewerAddedEvent event = new ReviewerAddedEvent(change);
+
+      event.change = changeAttributeSupplier(change, notes);
+      event.patchSet = patchSetAttributeSupplier(change, psUtil.current(db.get(), notes));
+      for (AccountInfo reviewer : ev.getReviewers()) {
+        event.reviewer = accountAttributeSupplier(reviewer);
+        dispatcher.run(d -> d.postEvent(event));
+      }
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log("Failed to dispatch event");
+    }
+  }
+
+  @Override
+  public void onNewProjectCreated(NewProjectCreatedListener.Event ev) {
+    ProjectCreatedEvent event = new ProjectCreatedEvent();
+    event.projectName = ev.getProjectName();
+    event.headName = ev.getHeadName();
+
+    dispatcher.run(d -> d.postEvent(event.getProjectNameKey(), event));
+  }
+
+  @Override
+  public void onHashtagsEdited(HashtagsEditedListener.Event ev) {
+    try {
+      ChangeNotes notes = getNotes(ev.getChange());
+      Change change = notes.getChange();
+      HashtagsChangedEvent event = new HashtagsChangedEvent(change);
+
+      event.change = changeAttributeSupplier(change, notes);
+      event.editor = accountAttributeSupplier(ev.getWho());
+      event.hashtags = hashtagArray(ev.getHashtags());
+      event.added = hashtagArray(ev.getAddedHashtags());
+      event.removed = hashtagArray(ev.getRemovedHashtags());
+
+      dispatcher.run(d -> d.postEvent(change, event));
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log("Failed to dispatch event");
+    }
+  }
+
+  @Override
+  public void onGitReferenceUpdated(GitReferenceUpdatedListener.Event ev) {
+    RefUpdatedEvent event = new RefUpdatedEvent();
+    if (ev.getUpdater() != null) {
+      event.submitter = accountAttributeSupplier(ev.getUpdater());
+    }
+    final Branch.NameKey refName = new Branch.NameKey(ev.getProjectName(), ev.getRefName());
+    event.refUpdate =
+        Suppliers.memoize(
+            new Supplier<RefUpdateAttribute>() {
+              @Override
+              public RefUpdateAttribute get() {
+                return eventFactory.asRefUpdateAttribute(
+                    ObjectId.fromString(ev.getOldObjectId()),
+                    ObjectId.fromString(ev.getNewObjectId()),
+                    refName);
+              }
+            });
+    dispatcher.run(d -> d.postEvent(refName, event));
+  }
+
+  @Override
+  public void onCommentAdded(CommentAddedListener.Event ev) {
+    try {
+      ChangeNotes notes = getNotes(ev.getChange());
+      Change change = notes.getChange();
+      PatchSet ps = getPatchSet(notes, ev.getRevision());
+      CommentAddedEvent event = new CommentAddedEvent(change);
+
+      event.change = changeAttributeSupplier(change, notes);
+      event.author = accountAttributeSupplier(ev.getWho());
+      event.patchSet = patchSetAttributeSupplier(change, ps);
+      event.comment = ev.getComment();
+      event.approvals = approvalsAttributeSupplier(change, ev.getApprovals(), ev.getOldApprovals());
+
+      dispatcher.run(d -> d.postEvent(change, event));
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log("Failed to dispatch event");
+    }
+  }
+
+  @Override
+  public void onChangeRestored(ChangeRestoredListener.Event ev) {
+    try {
+      ChangeNotes notes = getNotes(ev.getChange());
+      Change change = notes.getChange();
+      ChangeRestoredEvent event = new ChangeRestoredEvent(change);
+
+      event.change = changeAttributeSupplier(change, notes);
+      event.restorer = accountAttributeSupplier(ev.getWho());
+      event.patchSet = patchSetAttributeSupplier(change, psUtil.current(db.get(), notes));
+      event.reason = ev.getReason();
+
+      dispatcher.run(d -> d.postEvent(change, event));
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log("Failed to dispatch event");
+    }
+  }
+
+  @Override
+  public void onChangeMerged(ChangeMergedListener.Event ev) {
+    try {
+      ChangeNotes notes = getNotes(ev.getChange());
+      Change change = notes.getChange();
+      ChangeMergedEvent event = new ChangeMergedEvent(change);
+
+      event.change = changeAttributeSupplier(change, notes);
+      event.submitter = accountAttributeSupplier(ev.getWho());
+      event.patchSet = patchSetAttributeSupplier(change, psUtil.current(db.get(), notes));
+      event.newRev = ev.getNewRevisionId();
+
+      dispatcher.run(d -> d.postEvent(change, event));
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log("Failed to dispatch event");
+    }
+  }
+
+  @Override
+  public void onChangeAbandoned(ChangeAbandonedListener.Event ev) {
+    try {
+      ChangeNotes notes = getNotes(ev.getChange());
+      Change change = notes.getChange();
+      ChangeAbandonedEvent event = new ChangeAbandonedEvent(change);
+
+      event.change = changeAttributeSupplier(change, notes);
+      event.abandoner = accountAttributeSupplier(ev.getWho());
+      event.patchSet = patchSetAttributeSupplier(change, psUtil.current(db.get(), notes));
+      event.reason = ev.getReason();
+
+      dispatcher.run(d -> d.postEvent(change, event));
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log("Failed to dispatch event");
+    }
+  }
+
+  @Override
+  public void onWorkInProgressStateChanged(WorkInProgressStateChangedListener.Event ev) {
+    try {
+      ChangeNotes notes = getNotes(ev.getChange());
+      Change change = notes.getChange();
+      PatchSet patchSet = getPatchSet(notes, ev.getRevision());
+      WorkInProgressStateChangedEvent event = new WorkInProgressStateChangedEvent(change);
+
+      event.change = changeAttributeSupplier(change, notes);
+      event.changer = accountAttributeSupplier(ev.getWho());
+      event.patchSet = patchSetAttributeSupplier(change, patchSet);
+
+      dispatcher.run(d -> d.postEvent(change, event));
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log("Failed to dispatch event");
+    }
+  }
+
+  @Override
+  public void onPrivateStateChanged(PrivateStateChangedListener.Event ev) {
+    try {
+      ChangeNotes notes = getNotes(ev.getChange());
+      Change change = notes.getChange();
+      PatchSet patchSet = getPatchSet(notes, ev.getRevision());
+      PrivateStateChangedEvent event = new PrivateStateChangedEvent(change);
+
+      event.change = changeAttributeSupplier(change, notes);
+      event.changer = accountAttributeSupplier(ev.getWho());
+      event.patchSet = patchSetAttributeSupplier(change, patchSet);
+
+      dispatcher.run(d -> d.postEvent(change, event));
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log("Failed to dispatch event");
+    }
+  }
+
+  @Override
+  public void onVoteDeleted(VoteDeletedListener.Event ev) {
+    try {
+      ChangeNotes notes = getNotes(ev.getChange());
+      Change change = notes.getChange();
+      VoteDeletedEvent event = new VoteDeletedEvent(change);
+
+      event.change = changeAttributeSupplier(change, notes);
+      event.patchSet = patchSetAttributeSupplier(change, psUtil.current(db.get(), notes));
+      event.comment = ev.getMessage();
+      event.reviewer = accountAttributeSupplier(ev.getReviewer());
+      event.remover = accountAttributeSupplier(ev.getWho());
+      event.approvals = approvalsAttributeSupplier(change, ev.getApprovals(), ev.getOldApprovals());
+
+      dispatcher.run(d -> d.postEvent(change, event));
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log("Failed to dispatch event");
+    }
+  }
+
+  @Override
+  public void onChangeDeleted(ChangeDeletedListener.Event ev) {
+    try {
+      ChangeNotes notes = getNotes(ev.getChange());
+      Change change = notes.getChange();
+      ChangeDeletedEvent event = new ChangeDeletedEvent(change);
+
+      event.change = changeAttributeSupplier(change, notes);
+      event.deleter = accountAttributeSupplier(ev.getWho());
+
+      dispatcher.run(d -> d.postEvent(change, event));
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log("Failed to dispatch event");
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/SupplierDeserializer.java b/java/com/google/gerrit/server/events/SupplierDeserializer.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/events/SupplierDeserializer.java
rename to java/com/google/gerrit/server/events/SupplierDeserializer.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/SupplierSerializer.java b/java/com/google/gerrit/server/events/SupplierSerializer.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/events/SupplierSerializer.java
rename to java/com/google/gerrit/server/events/SupplierSerializer.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/TopicChangedEvent.java b/java/com/google/gerrit/server/events/TopicChangedEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/events/TopicChangedEvent.java
rename to java/com/google/gerrit/server/events/TopicChangedEvent.java
diff --git a/java/com/google/gerrit/server/events/UserScopedEventListener.java b/java/com/google/gerrit/server/events/UserScopedEventListener.java
new file mode 100644
index 0000000..2be1fd7
--- /dev/null
+++ b/java/com/google/gerrit/server/events/UserScopedEventListener.java
@@ -0,0 +1,26 @@
+// 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.
+package com.google.gerrit.server.events;
+
+import com.google.gerrit.extensions.annotations.ExtensionPoint;
+import com.google.gerrit.server.CurrentUser;
+
+/**
+ * Allows to listen to events visible to the specified user. To listen to events without user
+ * visibility restrictions, use {@link EventListener}.
+ */
+@ExtensionPoint
+public interface UserScopedEventListener extends EventListener {
+  CurrentUser getUser();
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/VoteDeletedEvent.java b/java/com/google/gerrit/server/events/VoteDeletedEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/events/VoteDeletedEvent.java
rename to java/com/google/gerrit/server/events/VoteDeletedEvent.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/WorkInProgressStateChangedEvent.java b/java/com/google/gerrit/server/events/WorkInProgressStateChangedEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/events/WorkInProgressStateChangedEvent.java
rename to java/com/google/gerrit/server/events/WorkInProgressStateChangedEvent.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AbstractChangeEvent.java b/java/com/google/gerrit/server/extensions/events/AbstractChangeEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AbstractChangeEvent.java
rename to java/com/google/gerrit/server/extensions/events/AbstractChangeEvent.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AbstractNoNotifyEvent.java b/java/com/google/gerrit/server/extensions/events/AbstractNoNotifyEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AbstractNoNotifyEvent.java
rename to java/com/google/gerrit/server/extensions/events/AbstractNoNotifyEvent.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AbstractRevisionEvent.java b/java/com/google/gerrit/server/extensions/events/AbstractRevisionEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/AbstractRevisionEvent.java
rename to java/com/google/gerrit/server/extensions/events/AbstractRevisionEvent.java
diff --git a/java/com/google/gerrit/server/extensions/events/AgreementSignup.java b/java/com/google/gerrit/server/extensions/events/AgreementSignup.java
new file mode 100644
index 0000000..b692cf5
--- /dev/null
+++ b/java/com/google/gerrit/server/extensions/events/AgreementSignup.java
@@ -0,0 +1,63 @@
+// Copyright (C) 2015 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.google.gerrit.server.extensions.events;
+
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.events.AgreementSignupListener;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class AgreementSignup {
+  private final PluginSetContext<AgreementSignupListener> listeners;
+  private final EventUtil util;
+
+  @Inject
+  AgreementSignup(PluginSetContext<AgreementSignupListener> listeners, EventUtil util) {
+    this.listeners = listeners;
+    this.util = util;
+  }
+
+  public void fire(AccountState accountState, String agreementName) {
+    if (listeners.isEmpty()) {
+      return;
+    }
+    Event event = new Event(util.accountInfo(accountState), agreementName);
+    listeners.runEach(l -> l.onAgreementSignup(event));
+  }
+
+  private static class Event extends AbstractNoNotifyEvent
+      implements AgreementSignupListener.Event {
+    private final AccountInfo account;
+    private final String agreementName;
+
+    Event(AccountInfo account, String agreementName) {
+      this.account = account;
+      this.agreementName = agreementName;
+    }
+
+    @Override
+    public AccountInfo getAccount() {
+      return account;
+    }
+
+    @Override
+    public String getAgreementName() {
+      return agreementName;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/extensions/events/AssigneeChanged.java b/java/com/google/gerrit/server/extensions/events/AssigneeChanged.java
new file mode 100644
index 0000000..513a5de
--- /dev/null
+++ b/java/com/google/gerrit/server/extensions/events/AssigneeChanged.java
@@ -0,0 +1,74 @@
+// 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.
+
+package com.google.gerrit.server.extensions.events;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.events.AssigneeChangedListener;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.sql.Timestamp;
+
+@Singleton
+public class AssigneeChanged {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final PluginSetContext<AssigneeChangedListener> listeners;
+  private final EventUtil util;
+
+  @Inject
+  AssigneeChanged(PluginSetContext<AssigneeChangedListener> listeners, EventUtil util) {
+    this.listeners = listeners;
+    this.util = util;
+  }
+
+  public void fire(
+      Change change, AccountState accountState, AccountState oldAssignee, Timestamp when) {
+    if (listeners.isEmpty()) {
+      return;
+    }
+    try {
+      Event event =
+          new Event(
+              util.changeInfo(change),
+              util.accountInfo(accountState),
+              util.accountInfo(oldAssignee),
+              when);
+      listeners.runEach(l -> l.onAssigneeChanged(event));
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log("Couldn't fire event");
+    }
+  }
+
+  private static class Event extends AbstractChangeEvent implements AssigneeChangedListener.Event {
+    private final AccountInfo oldAssignee;
+
+    Event(ChangeInfo change, AccountInfo editor, AccountInfo oldAssignee, Timestamp when) {
+      super(change, editor, when, NotifyHandling.ALL);
+      this.oldAssignee = oldAssignee;
+    }
+
+    @Override
+    public AccountInfo getOldAssignee() {
+      return oldAssignee;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/extensions/events/ChangeAbandoned.java b/java/com/google/gerrit/server/extensions/events/ChangeAbandoned.java
new file mode 100644
index 0000000..3d6700e
--- /dev/null
+++ b/java/com/google/gerrit/server/extensions/events/ChangeAbandoned.java
@@ -0,0 +1,101 @@
+// Copyright (C) 2015 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.google.gerrit.server.extensions.events;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.RevisionInfo;
+import com.google.gerrit.extensions.events.ChangeAbandonedListener;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.GpgException;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+import com.google.gerrit.server.patch.PatchListObjectTooLargeException;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.sql.Timestamp;
+
+@Singleton
+public class ChangeAbandoned {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final PluginSetContext<ChangeAbandonedListener> listeners;
+  private final EventUtil util;
+
+  @Inject
+  ChangeAbandoned(PluginSetContext<ChangeAbandonedListener> listeners, EventUtil util) {
+    this.listeners = listeners;
+    this.util = util;
+  }
+
+  public void fire(
+      Change change,
+      PatchSet ps,
+      AccountState abandoner,
+      String reason,
+      Timestamp when,
+      NotifyHandling notifyHandling) {
+    if (listeners.isEmpty()) {
+      return;
+    }
+    try {
+      Event event =
+          new Event(
+              util.changeInfo(change),
+              util.revisionInfo(change.getProject(), ps),
+              util.accountInfo(abandoner),
+              reason,
+              when,
+              notifyHandling);
+      listeners.runEach(l -> l.onChangeAbandoned(event));
+    } catch (PatchListObjectTooLargeException e) {
+      logger.atWarning().log("Couldn't fire event: %s", e.getMessage());
+    } catch (PatchListNotAvailableException
+        | GpgException
+        | IOException
+        | OrmException
+        | PermissionBackendException e) {
+      logger.atSevere().withCause(e).log("Couldn't fire event");
+    }
+  }
+
+  private static class Event extends AbstractRevisionEvent
+      implements ChangeAbandonedListener.Event {
+    private final String reason;
+
+    Event(
+        ChangeInfo change,
+        RevisionInfo revision,
+        AccountInfo abandoner,
+        String reason,
+        Timestamp when,
+        NotifyHandling notifyHandling) {
+      super(change, revision, abandoner, when, notifyHandling);
+      this.reason = reason;
+    }
+
+    @Override
+    public String getReason() {
+      return reason;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/extensions/events/ChangeDeleted.java b/java/com/google/gerrit/server/extensions/events/ChangeDeleted.java
new file mode 100644
index 0000000..d9eb9f9
--- /dev/null
+++ b/java/com/google/gerrit/server/extensions/events/ChangeDeleted.java
@@ -0,0 +1,60 @@
+// 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.
+
+package com.google.gerrit.server.extensions.events;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.events.ChangeDeletedListener;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.sql.Timestamp;
+
+@Singleton
+public class ChangeDeleted {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final PluginSetContext<ChangeDeletedListener> listeners;
+  private final EventUtil util;
+
+  @Inject
+  ChangeDeleted(PluginSetContext<ChangeDeletedListener> listeners, EventUtil util) {
+    this.listeners = listeners;
+    this.util = util;
+  }
+
+  public void fire(Change change, AccountState deleter, Timestamp when) {
+    if (listeners.isEmpty()) {
+      return;
+    }
+    try {
+      Event event = new Event(util.changeInfo(change), util.accountInfo(deleter), when);
+      listeners.runEach(l -> l.onChangeDeleted(event));
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log("Couldn't fire event");
+    }
+  }
+
+  private static class Event extends AbstractChangeEvent implements ChangeDeletedListener.Event {
+    Event(ChangeInfo change, AccountInfo deleter, Timestamp when) {
+      super(change, deleter, when, NotifyHandling.ALL);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/extensions/events/ChangeMerged.java b/java/com/google/gerrit/server/extensions/events/ChangeMerged.java
new file mode 100644
index 0000000..7b814ae
--- /dev/null
+++ b/java/com/google/gerrit/server/extensions/events/ChangeMerged.java
@@ -0,0 +1,93 @@
+// Copyright (C) 2015 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.google.gerrit.server.extensions.events;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.RevisionInfo;
+import com.google.gerrit.extensions.events.ChangeMergedListener;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.GpgException;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+import com.google.gerrit.server.patch.PatchListObjectTooLargeException;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.sql.Timestamp;
+
+@Singleton
+public class ChangeMerged {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final PluginSetContext<ChangeMergedListener> listeners;
+  private final EventUtil util;
+
+  @Inject
+  ChangeMerged(PluginSetContext<ChangeMergedListener> listeners, EventUtil util) {
+    this.listeners = listeners;
+    this.util = util;
+  }
+
+  public void fire(
+      Change change, PatchSet ps, AccountState merger, String newRevisionId, Timestamp when) {
+    if (listeners.isEmpty()) {
+      return;
+    }
+    try {
+      Event event =
+          new Event(
+              util.changeInfo(change),
+              util.revisionInfo(change.getProject(), ps),
+              util.accountInfo(merger),
+              newRevisionId,
+              when);
+      listeners.runEach(l -> l.onChangeMerged(event));
+    } catch (PatchListObjectTooLargeException e) {
+      logger.atWarning().log("Couldn't fire event: %s", e.getMessage());
+    } catch (PatchListNotAvailableException
+        | GpgException
+        | IOException
+        | OrmException
+        | PermissionBackendException e) {
+      logger.atSevere().withCause(e).log("Couldn't fire event");
+    }
+  }
+
+  private static class Event extends AbstractRevisionEvent implements ChangeMergedListener.Event {
+    private final String newRevisionId;
+
+    Event(
+        ChangeInfo change,
+        RevisionInfo revision,
+        AccountInfo merger,
+        String newRevisionId,
+        Timestamp when) {
+      super(change, revision, merger, when, NotifyHandling.ALL);
+      this.newRevisionId = newRevisionId;
+    }
+
+    @Override
+    public String getNewRevisionId() {
+      return newRevisionId;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/extensions/events/ChangeRestored.java b/java/com/google/gerrit/server/extensions/events/ChangeRestored.java
new file mode 100644
index 0000000..81b04cd
--- /dev/null
+++ b/java/com/google/gerrit/server/extensions/events/ChangeRestored.java
@@ -0,0 +1,94 @@
+// Copyright (C) 2015 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.google.gerrit.server.extensions.events;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.RevisionInfo;
+import com.google.gerrit.extensions.events.ChangeRestoredListener;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.GpgException;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+import com.google.gerrit.server.patch.PatchListObjectTooLargeException;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.sql.Timestamp;
+
+@Singleton
+public class ChangeRestored {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final PluginSetContext<ChangeRestoredListener> listeners;
+  private final EventUtil util;
+
+  @Inject
+  ChangeRestored(PluginSetContext<ChangeRestoredListener> listeners, EventUtil util) {
+    this.listeners = listeners;
+    this.util = util;
+  }
+
+  public void fire(
+      Change change, PatchSet ps, AccountState restorer, String reason, Timestamp when) {
+    if (listeners.isEmpty()) {
+      return;
+    }
+    try {
+      Event event =
+          new Event(
+              util.changeInfo(change),
+              util.revisionInfo(change.getProject(), ps),
+              util.accountInfo(restorer),
+              reason,
+              when);
+      listeners.runEach(l -> l.onChangeRestored(event));
+    } catch (PatchListObjectTooLargeException e) {
+      logger.atWarning().log("Couldn't fire event: %s", e.getMessage());
+    } catch (PatchListNotAvailableException
+        | GpgException
+        | IOException
+        | OrmException
+        | PermissionBackendException e) {
+      logger.atSevere().withCause(e).log("Couldn't fire event");
+    }
+  }
+
+  private static class Event extends AbstractRevisionEvent implements ChangeRestoredListener.Event {
+
+    private String reason;
+
+    Event(
+        ChangeInfo change,
+        RevisionInfo revision,
+        AccountInfo restorer,
+        String reason,
+        Timestamp when) {
+      super(change, revision, restorer, when, NotifyHandling.ALL);
+      this.reason = reason;
+    }
+
+    @Override
+    public String getReason() {
+      return reason;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/extensions/events/ChangeReverted.java b/java/com/google/gerrit/server/extensions/events/ChangeReverted.java
new file mode 100644
index 0000000..ac7aac0
--- /dev/null
+++ b/java/com/google/gerrit/server/extensions/events/ChangeReverted.java
@@ -0,0 +1,66 @@
+// 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.
+
+package com.google.gerrit.server.extensions.events;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.events.ChangeRevertedListener;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.sql.Timestamp;
+
+@Singleton
+public class ChangeReverted {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final PluginSetContext<ChangeRevertedListener> listeners;
+  private final EventUtil util;
+
+  @Inject
+  ChangeReverted(PluginSetContext<ChangeRevertedListener> listeners, EventUtil util) {
+    this.listeners = listeners;
+    this.util = util;
+  }
+
+  public void fire(Change change, Change revertChange, Timestamp when) {
+    if (listeners.isEmpty()) {
+      return;
+    }
+    try {
+      Event event = new Event(util.changeInfo(change), util.changeInfo(revertChange), when);
+      listeners.runEach(l -> l.onChangeReverted(event));
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log("Couldn't fire event");
+    }
+  }
+
+  private static class Event extends AbstractChangeEvent implements ChangeRevertedListener.Event {
+    private final ChangeInfo revertChange;
+
+    Event(ChangeInfo change, ChangeInfo revertChange, Timestamp when) {
+      super(change, revertChange.owner, when, NotifyHandling.ALL);
+      this.revertChange = revertChange;
+    }
+
+    @Override
+    public ChangeInfo getRevertChange() {
+      return revertChange;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/extensions/events/CommentAdded.java b/java/com/google/gerrit/server/extensions/events/CommentAdded.java
new file mode 100644
index 0000000..e224540
--- /dev/null
+++ b/java/com/google/gerrit/server/extensions/events/CommentAdded.java
@@ -0,0 +1,120 @@
+// Copyright (C) 2015 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.google.gerrit.server.extensions.events;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.ApprovalInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.RevisionInfo;
+import com.google.gerrit.extensions.events.CommentAddedListener;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.GpgException;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+import com.google.gerrit.server.patch.PatchListObjectTooLargeException;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.Map;
+
+@Singleton
+public class CommentAdded {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final PluginSetContext<CommentAddedListener> listeners;
+  private final EventUtil util;
+
+  @Inject
+  CommentAdded(PluginSetContext<CommentAddedListener> listeners, EventUtil util) {
+    this.listeners = listeners;
+    this.util = util;
+  }
+
+  public void fire(
+      Change change,
+      PatchSet ps,
+      AccountState author,
+      String comment,
+      Map<String, Short> approvals,
+      Map<String, Short> oldApprovals,
+      Timestamp when) {
+    if (listeners.isEmpty()) {
+      return;
+    }
+    try {
+      Event event =
+          new Event(
+              util.changeInfo(change),
+              util.revisionInfo(change.getProject(), ps),
+              util.accountInfo(author),
+              comment,
+              util.approvals(author, approvals, when),
+              util.approvals(author, oldApprovals, when),
+              when);
+      listeners.runEach(l -> l.onCommentAdded(event));
+    } catch (PatchListObjectTooLargeException e) {
+      logger.atWarning().log("Couldn't fire event: %s", e.getMessage());
+    } catch (PatchListNotAvailableException
+        | GpgException
+        | IOException
+        | OrmException
+        | PermissionBackendException e) {
+      logger.atSevere().withCause(e).log("Couldn't fire event");
+    }
+  }
+
+  private static class Event extends AbstractRevisionEvent implements CommentAddedListener.Event {
+
+    private final String comment;
+    private final Map<String, ApprovalInfo> approvals;
+    private final Map<String, ApprovalInfo> oldApprovals;
+
+    Event(
+        ChangeInfo change,
+        RevisionInfo revision,
+        AccountInfo author,
+        String comment,
+        Map<String, ApprovalInfo> approvals,
+        Map<String, ApprovalInfo> oldApprovals,
+        Timestamp when) {
+      super(change, revision, author, when, NotifyHandling.ALL);
+      this.comment = comment;
+      this.approvals = approvals;
+      this.oldApprovals = oldApprovals;
+    }
+
+    @Override
+    public String getComment() {
+      return comment;
+    }
+
+    @Override
+    public Map<String, ApprovalInfo> getApprovals() {
+      return approvals;
+    }
+
+    @Override
+    public Map<String, ApprovalInfo> getOldApprovals() {
+      return oldApprovals;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/extensions/events/EventUtil.java b/java/com/google/gerrit/server/extensions/events/EventUtil.java
new file mode 100644
index 0000000..485ed50
--- /dev/null
+++ b/java/com/google/gerrit/server/extensions/events/EventUtil.java
@@ -0,0 +1,122 @@
+// Copyright (C) 2015 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.google.gerrit.server.extensions.events;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+import com.google.gerrit.extensions.client.ListChangesOption;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.ApprovalInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.RevisionInfo;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.GpgException;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.change.ChangeJson;
+import com.google.gerrit.server.change.RevisionJson;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Map;
+
+@Singleton
+public class EventUtil {
+  private static final ImmutableSet<ListChangesOption> CHANGE_OPTIONS;
+
+  static {
+    EnumSet<ListChangesOption> opts = EnumSet.allOf(ListChangesOption.class);
+
+    // Some options, like actions, are expensive to compute because they potentially have to walk
+    // lots of history and inspect lots of other changes.
+    opts.remove(ListChangesOption.CHANGE_ACTIONS);
+    opts.remove(ListChangesOption.CURRENT_ACTIONS);
+
+    // CHECK suppresses some exceptions on corrupt changes, which is not appropriate for passing
+    // through the event system as we would rather let them propagate.
+    opts.remove(ListChangesOption.CHECK);
+
+    CHANGE_OPTIONS = Sets.immutableEnumSet(opts);
+  }
+
+  private final ChangeData.Factory changeDataFactory;
+  private final Provider<ReviewDb> db;
+  private final ChangeJson.Factory changeJsonFactory;
+  private final RevisionJson.Factory revisionJsonFactory;
+
+  @Inject
+  EventUtil(
+      ChangeJson.Factory changeJsonFactory,
+      RevisionJson.Factory revisionJsonFactory,
+      ChangeData.Factory changeDataFactory,
+      Provider<ReviewDb> db) {
+    this.changeDataFactory = changeDataFactory;
+    this.db = db;
+    this.changeJsonFactory = changeJsonFactory;
+    this.revisionJsonFactory = revisionJsonFactory;
+  }
+
+  public ChangeInfo changeInfo(Change change) throws OrmException {
+    return changeJsonFactory.create(CHANGE_OPTIONS).format(change);
+  }
+
+  public RevisionInfo revisionInfo(Project project, PatchSet ps)
+      throws OrmException, PatchListNotAvailableException, GpgException, IOException,
+          PermissionBackendException {
+    return revisionInfo(project.getNameKey(), ps);
+  }
+
+  public RevisionInfo revisionInfo(Project.NameKey project, PatchSet ps)
+      throws OrmException, PatchListNotAvailableException, GpgException, IOException,
+          PermissionBackendException {
+    ChangeData cd = changeDataFactory.create(db.get(), project, ps.getId().getParentKey());
+    return revisionJsonFactory.create(CHANGE_OPTIONS).getRevisionInfo(cd, ps);
+  }
+
+  public AccountInfo accountInfo(AccountState accountState) {
+    if (accountState == null || accountState.getAccount().getId() == null) {
+      return null;
+    }
+    Account account = accountState.getAccount();
+    AccountInfo accountInfo = new AccountInfo(account.getId().get());
+    accountInfo.email = account.getPreferredEmail();
+    accountInfo.name = account.getFullName();
+    accountInfo.username = accountState.getUserName().orElse(null);
+    return accountInfo;
+  }
+
+  public Map<String, ApprovalInfo> approvals(
+      AccountState accountState, Map<String, Short> approvals, Timestamp ts) {
+    Map<String, ApprovalInfo> result = new HashMap<>();
+    for (Map.Entry<String, Short> e : approvals.entrySet()) {
+      Integer value = e.getValue() != null ? Integer.valueOf(e.getValue()) : null;
+      result.put(
+          e.getKey(),
+          new ApprovalInfo(accountState.getAccount().getId().get(), value, null, null, ts));
+    }
+    return result;
+  }
+}
diff --git a/java/com/google/gerrit/server/extensions/events/GitReferenceUpdated.java b/java/com/google/gerrit/server/extensions/events/GitReferenceUpdated.java
new file mode 100644
index 0000000..bae17e7
--- /dev/null
+++ b/java/com/google/gerrit/server/extensions/events/GitReferenceUpdated.java
@@ -0,0 +1,231 @@
+// Copyright (C) 2012 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.google.gerrit.server.extensions.events;
+
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.transport.ReceiveCommand;
+
+@Singleton
+public class GitReferenceUpdated {
+  public static final GitReferenceUpdated DISABLED =
+      new GitReferenceUpdated() {
+        @Override
+        public void fire(
+            Project.NameKey project,
+            RefUpdate refUpdate,
+            ReceiveCommand.Type type,
+            AccountState updater) {}
+
+        @Override
+        public void fire(Project.NameKey project, RefUpdate refUpdate, AccountState updater) {}
+
+        @Override
+        public void fire(
+            Project.NameKey project,
+            String ref,
+            ObjectId oldObjectId,
+            ObjectId newObjectId,
+            AccountState updater) {}
+
+        @Override
+        public void fire(Project.NameKey project, ReceiveCommand cmd, AccountState updater) {}
+
+        @Override
+        public void fire(
+            Project.NameKey project, BatchRefUpdate batchRefUpdate, AccountState updater) {}
+      };
+
+  private final PluginSetContext<GitReferenceUpdatedListener> listeners;
+  private final EventUtil util;
+
+  @Inject
+  GitReferenceUpdated(PluginSetContext<GitReferenceUpdatedListener> listeners, EventUtil util) {
+    this.listeners = listeners;
+    this.util = util;
+  }
+
+  private GitReferenceUpdated() {
+    this.listeners = null;
+    this.util = null;
+  }
+
+  public void fire(
+      Project.NameKey project,
+      RefUpdate refUpdate,
+      ReceiveCommand.Type type,
+      AccountState updater) {
+    fire(
+        project,
+        refUpdate.getName(),
+        refUpdate.getOldObjectId(),
+        refUpdate.getNewObjectId(),
+        type,
+        util.accountInfo(updater));
+  }
+
+  public void fire(Project.NameKey project, RefUpdate refUpdate, AccountState updater) {
+    fire(
+        project,
+        refUpdate.getName(),
+        refUpdate.getOldObjectId(),
+        refUpdate.getNewObjectId(),
+        ReceiveCommand.Type.UPDATE,
+        util.accountInfo(updater));
+  }
+
+  public void fire(
+      Project.NameKey project,
+      String ref,
+      ObjectId oldObjectId,
+      ObjectId newObjectId,
+      AccountState updater) {
+    fire(
+        project,
+        ref,
+        oldObjectId,
+        newObjectId,
+        ReceiveCommand.Type.UPDATE,
+        util.accountInfo(updater));
+  }
+
+  public void fire(Project.NameKey project, ReceiveCommand cmd, AccountState updater) {
+    fire(
+        project,
+        cmd.getRefName(),
+        cmd.getOldId(),
+        cmd.getNewId(),
+        cmd.getType(),
+        util.accountInfo(updater));
+  }
+
+  public void fire(Project.NameKey project, BatchRefUpdate batchRefUpdate, AccountState updater) {
+    if (listeners.isEmpty()) {
+      return;
+    }
+    for (ReceiveCommand cmd : batchRefUpdate.getCommands()) {
+      if (cmd.getResult() == ReceiveCommand.Result.OK) {
+        fire(
+            project,
+            cmd.getRefName(),
+            cmd.getOldId(),
+            cmd.getNewId(),
+            cmd.getType(),
+            util.accountInfo(updater));
+      }
+    }
+  }
+
+  private void fire(
+      Project.NameKey project,
+      String ref,
+      ObjectId oldObjectId,
+      ObjectId newObjectId,
+      ReceiveCommand.Type type,
+      AccountInfo updater) {
+    if (listeners.isEmpty()) {
+      return;
+    }
+    ObjectId o = oldObjectId != null ? oldObjectId : ObjectId.zeroId();
+    ObjectId n = newObjectId != null ? newObjectId : ObjectId.zeroId();
+    Event event = new Event(project, ref, o.name(), n.name(), type, updater);
+    listeners.runEach(l -> l.onGitReferenceUpdated(event));
+  }
+
+  public static class Event implements GitReferenceUpdatedListener.Event {
+    private final String projectName;
+    private final String ref;
+    private final String oldObjectId;
+    private final String newObjectId;
+    private final ReceiveCommand.Type type;
+    private final AccountInfo updater;
+
+    Event(
+        Project.NameKey project,
+        String ref,
+        String oldObjectId,
+        String newObjectId,
+        ReceiveCommand.Type type,
+        AccountInfo updater) {
+      this.projectName = project.get();
+      this.ref = ref;
+      this.oldObjectId = oldObjectId;
+      this.newObjectId = newObjectId;
+      this.type = type;
+      this.updater = updater;
+    }
+
+    @Override
+    public String getProjectName() {
+      return projectName;
+    }
+
+    @Override
+    public String getRefName() {
+      return ref;
+    }
+
+    @Override
+    public String getOldObjectId() {
+      return oldObjectId;
+    }
+
+    @Override
+    public String getNewObjectId() {
+      return newObjectId;
+    }
+
+    @Override
+    public boolean isCreate() {
+      return type == ReceiveCommand.Type.CREATE;
+    }
+
+    @Override
+    public boolean isDelete() {
+      return type == ReceiveCommand.Type.DELETE;
+    }
+
+    @Override
+    public boolean isNonFastForward() {
+      return type == ReceiveCommand.Type.UPDATE_NONFASTFORWARD;
+    }
+
+    @Override
+    public AccountInfo getUpdater() {
+      return updater;
+    }
+
+    @Override
+    public String toString() {
+      return String.format(
+          "%s[%s,%s: %s -> %s]",
+          getClass().getSimpleName(), projectName, ref, oldObjectId, newObjectId);
+    }
+
+    @Override
+    public NotifyHandling getNotify() {
+      return NotifyHandling.ALL;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/extensions/events/HashtagsEdited.java b/java/com/google/gerrit/server/extensions/events/HashtagsEdited.java
new file mode 100644
index 0000000..ca0edab
--- /dev/null
+++ b/java/com/google/gerrit/server/extensions/events/HashtagsEdited.java
@@ -0,0 +1,100 @@
+// Copyright (C) 2015 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.google.gerrit.server.extensions.events;
+
+import com.google.common.collect.ImmutableSortedSet;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.events.HashtagsEditedListener;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.sql.Timestamp;
+import java.util.Collection;
+import java.util.Set;
+
+@Singleton
+public class HashtagsEdited {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final PluginSetContext<HashtagsEditedListener> listeners;
+  private final EventUtil util;
+
+  @Inject
+  public HashtagsEdited(PluginSetContext<HashtagsEditedListener> listeners, EventUtil util) {
+    this.listeners = listeners;
+    this.util = util;
+  }
+
+  public void fire(
+      Change change,
+      AccountState editor,
+      ImmutableSortedSet<String> hashtags,
+      Set<String> added,
+      Set<String> removed,
+      Timestamp when) {
+    if (listeners.isEmpty()) {
+      return;
+    }
+    try {
+      Event event =
+          new Event(
+              util.changeInfo(change), util.accountInfo(editor), hashtags, added, removed, when);
+      listeners.runEach(l -> l.onHashtagsEdited(event));
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log("Couldn't fire event");
+    }
+  }
+
+  private static class Event extends AbstractChangeEvent implements HashtagsEditedListener.Event {
+
+    private Collection<String> updatedHashtags;
+    private Collection<String> addedHashtags;
+    private Collection<String> removedHashtags;
+
+    Event(
+        ChangeInfo change,
+        AccountInfo editor,
+        Collection<String> updated,
+        Collection<String> added,
+        Collection<String> removed,
+        Timestamp when) {
+      super(change, editor, when, NotifyHandling.ALL);
+      this.updatedHashtags = updated;
+      this.addedHashtags = added;
+      this.removedHashtags = removed;
+    }
+
+    @Override
+    public Collection<String> getHashtags() {
+      return updatedHashtags;
+    }
+
+    @Override
+    public Collection<String> getAddedHashtags() {
+      return addedHashtags;
+    }
+
+    @Override
+    public Collection<String> getRemovedHashtags() {
+      return removedHashtags;
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/PluginEvent.java b/java/com/google/gerrit/server/extensions/events/PluginEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/PluginEvent.java
rename to java/com/google/gerrit/server/extensions/events/PluginEvent.java
diff --git a/java/com/google/gerrit/server/extensions/events/PrivateStateChanged.java b/java/com/google/gerrit/server/extensions/events/PrivateStateChanged.java
new file mode 100644
index 0000000..358667f
--- /dev/null
+++ b/java/com/google/gerrit/server/extensions/events/PrivateStateChanged.java
@@ -0,0 +1,77 @@
+// Copyright (C) 2017 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.google.gerrit.server.extensions.events;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.RevisionInfo;
+import com.google.gerrit.extensions.events.PrivateStateChangedListener;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.GpgException;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.sql.Timestamp;
+
+@Singleton
+public class PrivateStateChanged {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final PluginSetContext<PrivateStateChangedListener> listeners;
+  private final EventUtil util;
+
+  @Inject
+  PrivateStateChanged(PluginSetContext<PrivateStateChangedListener> listeners, EventUtil util) {
+    this.listeners = listeners;
+    this.util = util;
+  }
+
+  public void fire(Change change, PatchSet patchSet, AccountState account, Timestamp when) {
+    if (listeners.isEmpty()) {
+      return;
+    }
+    try {
+      Event event =
+          new Event(
+              util.changeInfo(change),
+              util.revisionInfo(change.getProject(), patchSet),
+              util.accountInfo(account),
+              when);
+      listeners.runEach(l -> l.onPrivateStateChanged(event));
+    } catch (OrmException
+        | PatchListNotAvailableException
+        | GpgException
+        | IOException
+        | PermissionBackendException e) {
+      logger.atSevere().withCause(e).log("Couldn't fire event");
+    }
+  }
+
+  private static class Event extends AbstractRevisionEvent
+      implements PrivateStateChangedListener.Event {
+
+    protected Event(ChangeInfo change, RevisionInfo revision, AccountInfo who, Timestamp when) {
+      super(change, revision, who, when, NotifyHandling.ALL);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/extensions/events/ReviewerAdded.java b/java/com/google/gerrit/server/extensions/events/ReviewerAdded.java
new file mode 100644
index 0000000..8e5259c
--- /dev/null
+++ b/java/com/google/gerrit/server/extensions/events/ReviewerAdded.java
@@ -0,0 +1,100 @@
+// Copyright (C) 2015 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.google.gerrit.server.extensions.events;
+
+import com.google.common.collect.Lists;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.RevisionInfo;
+import com.google.gerrit.extensions.events.ReviewerAddedListener;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.GpgException;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+import com.google.gerrit.server.patch.PatchListObjectTooLargeException;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.List;
+
+@Singleton
+public class ReviewerAdded {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final PluginSetContext<ReviewerAddedListener> listeners;
+  private final EventUtil util;
+
+  @Inject
+  ReviewerAdded(PluginSetContext<ReviewerAddedListener> listeners, EventUtil util) {
+    this.listeners = listeners;
+    this.util = util;
+  }
+
+  public void fire(
+      Change change,
+      PatchSet patchSet,
+      List<AccountState> reviewers,
+      AccountState adder,
+      Timestamp when) {
+    if (listeners.isEmpty() || reviewers.isEmpty()) {
+      return;
+    }
+
+    try {
+      Event event =
+          new Event(
+              util.changeInfo(change),
+              util.revisionInfo(change.getProject(), patchSet),
+              Lists.transform(reviewers, util::accountInfo),
+              util.accountInfo(adder),
+              when);
+      listeners.runEach(l -> l.onReviewersAdded(event));
+    } catch (PatchListObjectTooLargeException e) {
+      logger.atWarning().log("Couldn't fire event: %s", e.getMessage());
+    } catch (PatchListNotAvailableException
+        | GpgException
+        | IOException
+        | OrmException
+        | PermissionBackendException e) {
+      logger.atSevere().withCause(e).log("Couldn't fire event");
+    }
+  }
+
+  private static class Event extends AbstractRevisionEvent implements ReviewerAddedListener.Event {
+    private final List<AccountInfo> reviewers;
+
+    Event(
+        ChangeInfo change,
+        RevisionInfo revision,
+        List<AccountInfo> reviewers,
+        AccountInfo adder,
+        Timestamp when) {
+      super(change, revision, adder, when, NotifyHandling.ALL);
+      this.reviewers = reviewers;
+    }
+
+    @Override
+    public List<AccountInfo> getReviewers() {
+      return reviewers;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/extensions/events/ReviewerDeleted.java b/java/com/google/gerrit/server/extensions/events/ReviewerDeleted.java
new file mode 100644
index 0000000..89c8f18
--- /dev/null
+++ b/java/com/google/gerrit/server/extensions/events/ReviewerDeleted.java
@@ -0,0 +1,133 @@
+// 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.
+
+package com.google.gerrit.server.extensions.events;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.ApprovalInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.RevisionInfo;
+import com.google.gerrit.extensions.events.ReviewerDeletedListener;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.GpgException;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+import com.google.gerrit.server.patch.PatchListObjectTooLargeException;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.Map;
+
+@Singleton
+public class ReviewerDeleted {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final PluginSetContext<ReviewerDeletedListener> listeners;
+  private final EventUtil util;
+
+  @Inject
+  ReviewerDeleted(PluginSetContext<ReviewerDeletedListener> listeners, EventUtil util) {
+    this.listeners = listeners;
+    this.util = util;
+  }
+
+  public void fire(
+      Change change,
+      PatchSet patchSet,
+      AccountState reviewer,
+      AccountState remover,
+      String message,
+      Map<String, Short> newApprovals,
+      Map<String, Short> oldApprovals,
+      NotifyHandling notify,
+      Timestamp when) {
+    if (listeners.isEmpty()) {
+      return;
+    }
+    try {
+      Event event =
+          new Event(
+              util.changeInfo(change),
+              util.revisionInfo(change.getProject(), patchSet),
+              util.accountInfo(reviewer),
+              util.accountInfo(remover),
+              message,
+              util.approvals(reviewer, newApprovals, when),
+              util.approvals(reviewer, oldApprovals, when),
+              notify,
+              when);
+      listeners.runEach(l -> l.onReviewerDeleted(event));
+    } catch (PatchListObjectTooLargeException e) {
+      logger.atWarning().log("Couldn't fire event: %s", e.getMessage());
+    } catch (PatchListNotAvailableException
+        | GpgException
+        | IOException
+        | OrmException
+        | PermissionBackendException e) {
+      logger.atSevere().withCause(e).log("Couldn't fire event");
+    }
+  }
+
+  private static class Event extends AbstractRevisionEvent
+      implements ReviewerDeletedListener.Event {
+    private final AccountInfo reviewer;
+    private final String comment;
+    private final Map<String, ApprovalInfo> newApprovals;
+    private final Map<String, ApprovalInfo> oldApprovals;
+
+    Event(
+        ChangeInfo change,
+        RevisionInfo revision,
+        AccountInfo reviewer,
+        AccountInfo remover,
+        String comment,
+        Map<String, ApprovalInfo> newApprovals,
+        Map<String, ApprovalInfo> oldApprovals,
+        NotifyHandling notify,
+        Timestamp when) {
+      super(change, revision, remover, when, notify);
+      this.reviewer = reviewer;
+      this.comment = comment;
+      this.newApprovals = newApprovals;
+      this.oldApprovals = oldApprovals;
+    }
+
+    @Override
+    public AccountInfo getReviewer() {
+      return reviewer;
+    }
+
+    @Override
+    public String getComment() {
+      return comment;
+    }
+
+    @Override
+    public Map<String, ApprovalInfo> getNewApprovals() {
+      return newApprovals;
+    }
+
+    @Override
+    public Map<String, ApprovalInfo> getOldApprovals() {
+      return oldApprovals;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/extensions/events/RevisionCreated.java b/java/com/google/gerrit/server/extensions/events/RevisionCreated.java
new file mode 100644
index 0000000..e043e9f
--- /dev/null
+++ b/java/com/google/gerrit/server/extensions/events/RevisionCreated.java
@@ -0,0 +1,107 @@
+// Copyright (C) 2015 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.google.gerrit.server.extensions.events;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.RevisionInfo;
+import com.google.gerrit.extensions.events.RevisionCreatedListener;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.GpgException;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+import com.google.gerrit.server.patch.PatchListObjectTooLargeException;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.sql.Timestamp;
+
+@Singleton
+public class RevisionCreated {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static final RevisionCreated DISABLED =
+      new RevisionCreated() {
+        @Override
+        public void fire(
+            Change change,
+            PatchSet patchSet,
+            AccountState uploader,
+            Timestamp when,
+            NotifyHandling notify) {}
+      };
+
+  private final PluginSetContext<RevisionCreatedListener> listeners;
+  private final EventUtil util;
+
+  @Inject
+  RevisionCreated(PluginSetContext<RevisionCreatedListener> listeners, EventUtil util) {
+    this.listeners = listeners;
+    this.util = util;
+  }
+
+  private RevisionCreated() {
+    this.listeners = null;
+    this.util = null;
+  }
+
+  public void fire(
+      Change change,
+      PatchSet patchSet,
+      AccountState uploader,
+      Timestamp when,
+      NotifyHandling notify) {
+    if (listeners.isEmpty()) {
+      return;
+    }
+    try {
+      Event event =
+          new Event(
+              util.changeInfo(change),
+              util.revisionInfo(change.getProject(), patchSet),
+              util.accountInfo(uploader),
+              when,
+              notify);
+      listeners.runEach(l -> l.onRevisionCreated(event));
+    } catch (PatchListObjectTooLargeException e) {
+      logger.atWarning().log("Couldn't fire event: %s", e.getMessage());
+    } catch (PatchListNotAvailableException
+        | GpgException
+        | IOException
+        | OrmException
+        | PermissionBackendException e) {
+      logger.atSevere().withCause(e).log("Couldn't fire event");
+    }
+  }
+
+  private static class Event extends AbstractRevisionEvent
+      implements RevisionCreatedListener.Event {
+
+    Event(
+        ChangeInfo change,
+        RevisionInfo revision,
+        AccountInfo uploader,
+        Timestamp when,
+        NotifyHandling notify) {
+      super(change, revision, uploader, when, notify);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/extensions/events/TopicEdited.java b/java/com/google/gerrit/server/extensions/events/TopicEdited.java
new file mode 100644
index 0000000..8568c0f
--- /dev/null
+++ b/java/com/google/gerrit/server/extensions/events/TopicEdited.java
@@ -0,0 +1,69 @@
+// Copyright (C) 2015 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.google.gerrit.server.extensions.events;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.events.TopicEditedListener;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.sql.Timestamp;
+
+@Singleton
+public class TopicEdited {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final PluginSetContext<TopicEditedListener> listeners;
+  private final EventUtil util;
+
+  @Inject
+  TopicEdited(PluginSetContext<TopicEditedListener> listeners, EventUtil util) {
+    this.listeners = listeners;
+    this.util = util;
+  }
+
+  public void fire(Change change, AccountState account, String oldTopicName, Timestamp when) {
+    if (listeners.isEmpty()) {
+      return;
+    }
+    try {
+      Event event =
+          new Event(util.changeInfo(change), util.accountInfo(account), oldTopicName, when);
+      listeners.runEach(l -> l.onTopicEdited(event));
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log("Couldn't fire event");
+    }
+  }
+
+  private static class Event extends AbstractChangeEvent implements TopicEditedListener.Event {
+    private final String oldTopic;
+
+    Event(ChangeInfo change, AccountInfo editor, String oldTopic, Timestamp when) {
+      super(change, editor, when, NotifyHandling.ALL);
+      this.oldTopic = oldTopic;
+    }
+
+    @Override
+    public String getOldTopic() {
+      return oldTopic;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/extensions/events/VoteDeleted.java b/java/com/google/gerrit/server/extensions/events/VoteDeleted.java
new file mode 100644
index 0000000..b750851
--- /dev/null
+++ b/java/com/google/gerrit/server/extensions/events/VoteDeleted.java
@@ -0,0 +1,132 @@
+// 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.
+
+package com.google.gerrit.server.extensions.events;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.ApprovalInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.RevisionInfo;
+import com.google.gerrit.extensions.events.VoteDeletedListener;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.GpgException;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+import com.google.gerrit.server.patch.PatchListObjectTooLargeException;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.Map;
+
+@Singleton
+public class VoteDeleted {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final PluginSetContext<VoteDeletedListener> listeners;
+  private final EventUtil util;
+
+  @Inject
+  VoteDeleted(PluginSetContext<VoteDeletedListener> listeners, EventUtil util) {
+    this.listeners = listeners;
+    this.util = util;
+  }
+
+  public void fire(
+      Change change,
+      PatchSet ps,
+      AccountState reviewer,
+      Map<String, Short> approvals,
+      Map<String, Short> oldApprovals,
+      NotifyHandling notify,
+      String message,
+      AccountState remover,
+      Timestamp when) {
+    if (listeners.isEmpty()) {
+      return;
+    }
+    try {
+      Event event =
+          new Event(
+              util.changeInfo(change),
+              util.revisionInfo(change.getProject(), ps),
+              util.accountInfo(reviewer),
+              util.approvals(remover, approvals, when),
+              util.approvals(remover, oldApprovals, when),
+              notify,
+              message,
+              util.accountInfo(remover),
+              when);
+      listeners.runEach(l -> l.onVoteDeleted(event));
+    } catch (PatchListObjectTooLargeException e) {
+      logger.atWarning().log("Couldn't fire event: %s", e.getMessage());
+    } catch (PatchListNotAvailableException
+        | GpgException
+        | IOException
+        | OrmException
+        | PermissionBackendException e) {
+      logger.atSevere().withCause(e).log("Couldn't fire event");
+    }
+  }
+
+  private static class Event extends AbstractRevisionEvent implements VoteDeletedListener.Event {
+    private final AccountInfo reviewer;
+    private final Map<String, ApprovalInfo> approvals;
+    private final Map<String, ApprovalInfo> oldApprovals;
+    private final String message;
+
+    Event(
+        ChangeInfo change,
+        RevisionInfo revision,
+        AccountInfo reviewer,
+        Map<String, ApprovalInfo> approvals,
+        Map<String, ApprovalInfo> oldApprovals,
+        NotifyHandling notify,
+        String message,
+        AccountInfo remover,
+        Timestamp when) {
+      super(change, revision, remover, when, notify);
+      this.reviewer = reviewer;
+      this.approvals = approvals;
+      this.oldApprovals = oldApprovals;
+      this.message = message;
+    }
+
+    @Override
+    public Map<String, ApprovalInfo> getApprovals() {
+      return approvals;
+    }
+
+    @Override
+    public Map<String, ApprovalInfo> getOldApprovals() {
+      return oldApprovals;
+    }
+
+    @Override
+    public String getMessage() {
+      return message;
+    }
+
+    @Override
+    public AccountInfo getReviewer() {
+      return reviewer;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/extensions/events/WorkInProgressStateChanged.java b/java/com/google/gerrit/server/extensions/events/WorkInProgressStateChanged.java
new file mode 100644
index 0000000..6273ad6
--- /dev/null
+++ b/java/com/google/gerrit/server/extensions/events/WorkInProgressStateChanged.java
@@ -0,0 +1,78 @@
+// Copyright (C) 2017 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.google.gerrit.server.extensions.events;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.RevisionInfo;
+import com.google.gerrit.extensions.events.WorkInProgressStateChangedListener;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.GpgException;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.sql.Timestamp;
+
+@Singleton
+public class WorkInProgressStateChanged {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final PluginSetContext<WorkInProgressStateChangedListener> listeners;
+  private final EventUtil util;
+
+  @Inject
+  WorkInProgressStateChanged(
+      PluginSetContext<WorkInProgressStateChangedListener> listeners, EventUtil util) {
+    this.listeners = listeners;
+    this.util = util;
+  }
+
+  public void fire(Change change, PatchSet patchSet, AccountState account, Timestamp when) {
+    if (listeners.isEmpty()) {
+      return;
+    }
+    try {
+      Event event =
+          new Event(
+              util.changeInfo(change),
+              util.revisionInfo(change.getProject(), patchSet),
+              util.accountInfo(account),
+              when);
+      listeners.runEach(l -> l.onWorkInProgressStateChanged(event));
+    } catch (OrmException
+        | PatchListNotAvailableException
+        | GpgException
+        | IOException
+        | PermissionBackendException e) {
+      logger.atSevere().withCause(e).log("Couldn't fire event");
+    }
+  }
+
+  private static class Event extends AbstractRevisionEvent
+      implements WorkInProgressStateChangedListener.Event {
+
+    protected Event(ChangeInfo change, RevisionInfo revision, AccountInfo who, Timestamp when) {
+      super(change, revision, who, when, NotifyHandling.ALL);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/extensions/webui/UiActions.java b/java/com/google/gerrit/server/extensions/webui/UiActions.java
new file mode 100644
index 0000000..3ca2bdb
--- /dev/null
+++ b/java/com/google/gerrit/server/extensions/webui/UiActions.java
@@ -0,0 +1,177 @@
+// Copyright (C) 2013 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.google.gerrit.server.extensions.webui;
+
+import static com.google.gerrit.extensions.conditions.BooleanCondition.and;
+import static com.google.gerrit.extensions.conditions.BooleanCondition.or;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Streams;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.api.access.GlobalOrPluginPermission;
+import com.google.gerrit.extensions.conditions.BooleanCondition;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.registration.Extension;
+import com.google.gerrit.extensions.registration.PluginName;
+import com.google.gerrit.extensions.restapi.RestCollection;
+import com.google.gerrit.extensions.restapi.RestResource;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.extensions.webui.PrivateInternals_UiActionDescription;
+import com.google.gerrit.extensions.webui.UiAction;
+import com.google.gerrit.extensions.webui.UiAction.Description;
+import com.google.gerrit.metrics.Description.Units;
+import com.google.gerrit.metrics.Field;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.metrics.Timer1;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendCondition;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+
+@Singleton
+public class UiActions {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static Predicate<UiAction.Description> enabled() {
+    return UiAction.Description::isEnabled;
+  }
+
+  private final PermissionBackend permissionBackend;
+  private final Timer1<String> uiActionLatency;
+
+  @Inject
+  UiActions(PermissionBackend permissionBackend, MetricMaker metricMaker) {
+    this.permissionBackend = permissionBackend;
+    this.uiActionLatency =
+        metricMaker.newTimer(
+            "http/server/rest_api/ui_actions/latency",
+            new com.google.gerrit.metrics.Description("Latency for RestView#getDescription calls")
+                .setCumulative()
+                .setUnit(Units.MILLISECONDS),
+            Field.ofString("view"));
+  }
+
+  public <R extends RestResource> Iterable<UiAction.Description> from(
+      RestCollection<?, R> collection, R resource) {
+    return from(collection.views(), resource);
+  }
+
+  public <R extends RestResource> Iterable<UiAction.Description> from(
+      DynamicMap<RestView<R>> views, R resource) {
+    List<UiAction.Description> descs =
+        Streams.stream(views)
+            .map(e -> describe(e, resource))
+            .filter(Objects::nonNull)
+            .collect(toList());
+
+    List<PermissionBackendCondition> conds =
+        Streams.concat(
+                descs.stream().flatMap(u -> Streams.stream(visibleCondition(u))),
+                descs.stream().flatMap(u -> Streams.stream(enabledCondition(u))))
+            .collect(toList());
+
+    evaluatePermissionBackendConditions(permissionBackend, conds);
+
+    return descs.stream().filter(Description::isVisible).collect(toList());
+  }
+
+  @VisibleForTesting
+  static void evaluatePermissionBackendConditions(
+      PermissionBackend perm, List<PermissionBackendCondition> conds) {
+    Map<PermissionBackendCondition, PermissionBackendCondition> dedupedConds =
+        new HashMap<>(conds.size());
+    for (PermissionBackendCondition cond : conds) {
+      dedupedConds.put(cond, cond);
+    }
+    perm.bulkEvaluateTest(dedupedConds.keySet());
+    for (PermissionBackendCondition cond : conds) {
+      cond.set(dedupedConds.get(cond).value());
+    }
+  }
+
+  private static Iterable<PermissionBackendCondition> visibleCondition(Description u) {
+    return u.getVisibleCondition().reduce().children(PermissionBackendCondition.class);
+  }
+
+  private static Iterable<PermissionBackendCondition> enabledCondition(Description u) {
+    return u.getEnabledCondition().reduce().children(PermissionBackendCondition.class);
+  }
+
+  @Nullable
+  private <R extends RestResource> UiAction.Description describe(
+      Extension<RestView<R>> e, R resource) {
+    int d = e.getExportName().indexOf('.');
+    if (d < 0) {
+      return null;
+    }
+
+    RestView<R> view;
+    try {
+      view = e.getProvider().get();
+    } catch (RuntimeException err) {
+      logger.atSevere().withCause(err).log(
+          "error creating view %s.%s", e.getPluginName(), e.getExportName());
+      return null;
+    }
+
+    if (!(view instanceof UiAction)) {
+      return null;
+    }
+
+    String name = e.getExportName().substring(d + 1);
+    UiAction.Description dsc;
+    try (Timer1.Context ignored = uiActionLatency.start(name)) {
+      dsc = ((UiAction<R>) view).getDescription(resource);
+    }
+
+    if (dsc == null) {
+      return null;
+    }
+
+    Set<GlobalOrPluginPermission> globalRequired;
+    try {
+      globalRequired = GlobalPermission.fromAnnotation(e.getPluginName(), view.getClass());
+    } catch (PermissionBackendException err) {
+      logger.atSevere().withCause(err).log(
+          "exception testing view %s.%s", e.getPluginName(), e.getExportName());
+      return null;
+    }
+    if (!globalRequired.isEmpty()) {
+      PermissionBackend.WithUser withUser = permissionBackend.currentUser();
+      Iterator<GlobalOrPluginPermission> i = globalRequired.iterator();
+      BooleanCondition p = withUser.testCond(i.next());
+      while (i.hasNext()) {
+        p = or(p, withUser.testCond(i.next()));
+      }
+      dsc.setVisible(and(p, dsc.getVisibleCondition()));
+    }
+
+    PrivateInternals_UiActionDescription.setMethod(dsc, e.getExportName().substring(0, d));
+    PrivateInternals_UiActionDescription.setId(
+        dsc, PluginName.GERRIT.equals(e.getPluginName()) ? name : e.getPluginName() + '~' + name);
+    return dsc;
+  }
+}
diff --git a/java/com/google/gerrit/server/fixes/FixReplacementInterpreter.java b/java/com/google/gerrit/server/fixes/FixReplacementInterpreter.java
new file mode 100644
index 0000000..65f14db
--- /dev/null
+++ b/java/com/google/gerrit/server/fixes/FixReplacementInterpreter.java
@@ -0,0 +1,152 @@
+// Copyright (C) 2017 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.google.gerrit.server.fixes;
+
+import static java.util.Objects.requireNonNull;
+import static java.util.stream.Collectors.groupingBy;
+
+import com.google.gerrit.common.RawInputUtil;
+import com.google.gerrit.extensions.restapi.BinaryResult;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.FixReplacement;
+import com.google.gerrit.server.change.FileContentUtil;
+import com.google.gerrit.server.edit.tree.ChangeFileContentModification;
+import com.google.gerrit.server.edit.tree.TreeModification;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+
+/** An interpreter for {@code FixReplacement}s. */
+@Singleton
+public class FixReplacementInterpreter {
+
+  private static final Comparator<FixReplacement> ASC_RANGE_FIX_REPLACEMENT_COMPARATOR =
+      Comparator.comparing(fixReplacement -> fixReplacement.range);
+
+  private final FileContentUtil fileContentUtil;
+
+  @Inject
+  public FixReplacementInterpreter(FileContentUtil fileContentUtil) {
+    this.fileContentUtil = fileContentUtil;
+  }
+
+  /**
+   * Transforms the given {@code FixReplacement}s into {@code TreeModification}s.
+   *
+   * @param repository the affected Git repository
+   * @param projectState the affected project
+   * @param patchSetCommitId the patch set which should be modified
+   * @param fixReplacements the replacements which should be applied
+   * @return a list of {@code TreeModification}s representing the given replacements
+   * @throws ResourceNotFoundException if a file to which one of the replacements refers doesn't
+   *     exist
+   * @throws ResourceConflictException if the replacements can't be transformed into {@code
+   *     TreeModification}s
+   */
+  public List<TreeModification> toTreeModifications(
+      Repository repository,
+      ProjectState projectState,
+      ObjectId patchSetCommitId,
+      List<FixReplacement> fixReplacements)
+      throws ResourceNotFoundException, IOException, ResourceConflictException {
+    requireNonNull(fixReplacements, "Fix replacements must not be null");
+
+    Map<String, List<FixReplacement>> fixReplacementsPerFilePath =
+        fixReplacements.stream().collect(groupingBy(fixReplacement -> fixReplacement.path));
+
+    List<TreeModification> treeModifications = new ArrayList<>();
+    for (Map.Entry<String, List<FixReplacement>> entry : fixReplacementsPerFilePath.entrySet()) {
+      TreeModification treeModification =
+          toTreeModification(
+              repository, projectState, patchSetCommitId, entry.getKey(), entry.getValue());
+      treeModifications.add(treeModification);
+    }
+    return treeModifications;
+  }
+
+  private TreeModification toTreeModification(
+      Repository repository,
+      ProjectState projectState,
+      ObjectId patchSetCommitId,
+      String filePath,
+      List<FixReplacement> fixReplacements)
+      throws ResourceNotFoundException, IOException, ResourceConflictException {
+    String fileContent = getFileContent(repository, projectState, patchSetCommitId, filePath);
+    String newFileContent = getNewFileContent(fileContent, fixReplacements);
+    return new ChangeFileContentModification(filePath, RawInputUtil.create(newFileContent));
+  }
+
+  private String getFileContent(
+      Repository repository, ProjectState projectState, ObjectId patchSetCommitId, String filePath)
+      throws ResourceNotFoundException, IOException {
+    try (BinaryResult fileContent =
+        fileContentUtil.getContent(repository, projectState, patchSetCommitId, filePath)) {
+      return fileContent.asString();
+    }
+  }
+
+  private static String getNewFileContent(String fileContent, List<FixReplacement> fixReplacements)
+      throws ResourceConflictException {
+    List<FixReplacement> sortedReplacements = new ArrayList<>(fixReplacements);
+    sortedReplacements.sort(ASC_RANGE_FIX_REPLACEMENT_COMPARATOR);
+
+    LineIdentifier lineIdentifier = new LineIdentifier(fileContent);
+    StringModifier fileContentModifier = new StringModifier(fileContent);
+    for (FixReplacement fixReplacement : sortedReplacements) {
+      Comment.Range range = fixReplacement.range;
+      try {
+        int startLineIndex = lineIdentifier.getStartIndexOfLine(range.startLine);
+        int startLineLength = lineIdentifier.getLengthOfLine(range.startLine);
+
+        int endLineIndex = lineIdentifier.getStartIndexOfLine(range.endLine);
+        int endLineLength = lineIdentifier.getLengthOfLine(range.endLine);
+
+        if (range.startChar > startLineLength || range.endChar > endLineLength) {
+          throw new ResourceConflictException(
+              String.format(
+                  "Range %s refers to a non-existent offset (start line length: %s,"
+                      + " end line length: %s)",
+                  toString(range), startLineLength, endLineLength));
+        }
+
+        int startIndex = startLineIndex + range.startChar;
+        int endIndex = endLineIndex + range.endChar;
+        fileContentModifier.replace(startIndex, endIndex, fixReplacement.replacement);
+      } catch (StringIndexOutOfBoundsException e) {
+        // Most of the StringIndexOutOfBoundsException should never occur because we reject fix
+        // replacements for invalid ranges. However, we can't cover all cases for efficiency
+        // reasons. For instance, we don't determine the number of lines in a file. That's why we
+        // need to map this exception and thus provide a meaningful error.
+        throw new ResourceConflictException(
+            String.format("Cannot apply fix replacement for range %s", toString(range)), e);
+      }
+    }
+    return fileContentModifier.getResult();
+  }
+
+  private static String toString(Comment.Range range) {
+    return String.format(
+        "(%s:%s - %s:%s)", range.startLine, range.startChar, range.endLine, range.endChar);
+  }
+}
diff --git a/java/com/google/gerrit/server/fixes/LineIdentifier.java b/java/com/google/gerrit/server/fixes/LineIdentifier.java
new file mode 100644
index 0000000..3d09c34
--- /dev/null
+++ b/java/com/google/gerrit/server/fixes/LineIdentifier.java
@@ -0,0 +1,110 @@
+// Copyright (C) 2017 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.google.gerrit.server.fixes;
+
+import static java.util.Objects.requireNonNull;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * An identifier of lines in a string. Lines are sequences of characters which are separated by any
+ * Unicode linebreak sequence as defined by the regular expression {@code \R}. If data for several
+ * lines is requested, calls which are ordered according to ascending line numbers are the most
+ * efficient.
+ */
+class LineIdentifier {
+
+  private static final Pattern LINE_SEPARATOR_PATTERN = Pattern.compile("\\R");
+  private final Matcher lineSeparatorMatcher;
+
+  private int nextLineNumber;
+  private int nextLineStartIndex;
+  private int currentLineStartIndex;
+  private int currentLineEndIndex;
+
+  LineIdentifier(String string) {
+    requireNonNull(string);
+    lineSeparatorMatcher = LINE_SEPARATOR_PATTERN.matcher(string);
+    reset();
+  }
+
+  /**
+   * Returns the start index of the indicated line within the given string. Start indices are
+   * zero-based while line numbers are one-based.
+   *
+   * <p><b>Note:</b> Requesting data for several lines is more efficient if those calls occur with
+   * increasing line number.
+   *
+   * @param lineNumber the line whose start index should be determined
+   * @return the start index of the line
+   * @throws StringIndexOutOfBoundsException if the line number is negative, zero or greater than
+   *     the identified number of lines
+   */
+  public int getStartIndexOfLine(int lineNumber) {
+    findLine(lineNumber);
+    return currentLineStartIndex;
+  }
+
+  /**
+   * Returns the length of the indicated line in the given string. The character(s) used to separate
+   * lines aren't included in the count. Line numbers are one-based.
+   *
+   * <p><b>Note:</b> Requesting data for several lines is more efficient if those calls occur with
+   * increasing line number.
+   *
+   * @param lineNumber the line whose length should be determined
+   * @return the length of the line
+   * @throws StringIndexOutOfBoundsException if the line number is negative, zero or greater than
+   *     the identified number of lines
+   */
+  public int getLengthOfLine(int lineNumber) {
+    findLine(lineNumber);
+    return currentLineEndIndex - currentLineStartIndex;
+  }
+
+  private void findLine(int targetLineNumber) {
+    if (targetLineNumber <= 0) {
+      throw new StringIndexOutOfBoundsException("Line number must be positive");
+    }
+    if (targetLineNumber < nextLineNumber) {
+      reset();
+    }
+    while (nextLineNumber < targetLineNumber + 1 && lineSeparatorMatcher.find()) {
+      currentLineStartIndex = nextLineStartIndex;
+      currentLineEndIndex = lineSeparatorMatcher.start();
+      nextLineStartIndex = lineSeparatorMatcher.end();
+      nextLineNumber++;
+    }
+
+    // End of string
+    if (nextLineNumber == targetLineNumber) {
+      currentLineStartIndex = nextLineStartIndex;
+      currentLineEndIndex = lineSeparatorMatcher.regionEnd();
+    }
+    if (nextLineNumber < targetLineNumber) {
+      throw new StringIndexOutOfBoundsException(
+          String.format("Line %d isn't available", targetLineNumber));
+    }
+  }
+
+  private void reset() {
+    nextLineNumber = 1;
+    nextLineStartIndex = 0;
+    currentLineStartIndex = 0;
+    currentLineEndIndex = 0;
+    lineSeparatorMatcher.reset();
+  }
+}
diff --git a/java/com/google/gerrit/server/fixes/StringModifier.java b/java/com/google/gerrit/server/fixes/StringModifier.java
new file mode 100644
index 0000000..85d024b
--- /dev/null
+++ b/java/com/google/gerrit/server/fixes/StringModifier.java
@@ -0,0 +1,77 @@
+// Copyright (C) 2017 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.google.gerrit.server.fixes;
+
+import static java.util.Objects.requireNonNull;
+
+/**
+ * A modifier of a string. It allows to replace multiple parts of a string by indicating those parts
+ * with indices based on the unmodified string. There is one limitation though: Replacements which
+ * affect lower indices of the string must be specified before replacements for higher indices.
+ */
+class StringModifier {
+
+  private final StringBuilder stringBuilder;
+
+  private int characterShift = 0;
+  private int previousEndOffset = Integer.MIN_VALUE;
+
+  StringModifier(String string) {
+    requireNonNull(string, "string must not be null");
+    stringBuilder = new StringBuilder(string);
+  }
+
+  /**
+   * Replaces part of the string with another content. When called multiple times, the calls must be
+   * ordered according to increasing start indices. Overlapping replacement regions aren't
+   * supported.
+   *
+   * @param startIndex the beginning index in the unmodified string (inclusive)
+   * @param endIndex the ending index in the unmodified string (exclusive)
+   * @param replacement the string which should be used instead of the original content
+   * @throws StringIndexOutOfBoundsException if the start index is smaller than the end index of a
+   *     previous call of this method
+   */
+  public void replace(int startIndex, int endIndex, String replacement) {
+    requireNonNull(replacement, "replacement string must not be null");
+    if (previousEndOffset > startIndex) {
+      throw new StringIndexOutOfBoundsException(
+          String.format(
+              "Not supported to replace the content starting at index %s after previous "
+                  + "replacement which ended at index %s",
+              startIndex, previousEndOffset));
+    }
+    int shiftedStartIndex = startIndex + characterShift;
+    int shiftedEndIndex = endIndex + characterShift;
+    if (shiftedEndIndex > stringBuilder.length()) {
+      throw new StringIndexOutOfBoundsException(
+          String.format("end %s > length %s", shiftedEndIndex, stringBuilder.length()));
+    }
+    stringBuilder.replace(shiftedStartIndex, shiftedEndIndex, replacement);
+
+    int replacedContentLength = endIndex - startIndex;
+    characterShift += replacement.length() - replacedContentLength;
+    previousEndOffset = endIndex;
+  }
+
+  /**
+   * Returns the modified string including all specified replacements.
+   *
+   * @return the modified string
+   */
+  public String getResult() {
+    return stringBuilder.toString();
+  }
+}
diff --git a/java/com/google/gerrit/server/git/BanCommit.java b/java/com/google/gerrit/server/git/BanCommit.java
new file mode 100644
index 0000000..4991715
--- /dev/null
+++ b/java/com/google/gerrit/server/git/BanCommit.java
@@ -0,0 +1,174 @@
+// Copyright (C) 2012 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.google.gerrit.server.git;
+
+import static com.google.gerrit.reviewdb.client.RefNames.REFS_REJECT_COMMITS;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Date;
+import java.util.List;
+import java.util.TimeZone;
+import org.eclipse.jgit.errors.IncorrectObjectTypeException;
+import org.eclipse.jgit.errors.MissingObjectException;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.notes.Note;
+import org.eclipse.jgit.notes.NoteMap;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+@Singleton
+public class BanCommit {
+  /**
+   * Loads a list of commits to reject from {@code refs/meta/reject-commits}.
+   *
+   * @param repo repository from which the rejected commits should be loaded
+   * @param walk open revwalk on repo.
+   * @return NoteMap of commits to be rejected, null if there are none.
+   * @throws IOException the map cannot be loaded.
+   */
+  public static NoteMap loadRejectCommitsMap(Repository repo, RevWalk walk) throws IOException {
+    try {
+      Ref ref = repo.getRefDatabase().exactRef(RefNames.REFS_REJECT_COMMITS);
+      if (ref == null) {
+        return NoteMap.newEmptyMap();
+      }
+
+      RevCommit map = walk.parseCommit(ref.getObjectId());
+      return NoteMap.read(walk.getObjectReader(), map);
+    } catch (IOException badMap) {
+      throw new IOException("Cannot load " + RefNames.REFS_REJECT_COMMITS, badMap);
+    }
+  }
+
+  private final Provider<IdentifiedUser> currentUser;
+  private final GitRepositoryManager repoManager;
+  private final TimeZone tz;
+  private final PermissionBackend permissionBackend;
+  private NotesBranchUtil.Factory notesBranchUtilFactory;
+
+  @Inject
+  BanCommit(
+      Provider<IdentifiedUser> currentUser,
+      GitRepositoryManager repoManager,
+      @GerritPersonIdent PersonIdent gerritIdent,
+      NotesBranchUtil.Factory notesBranchUtilFactory,
+      PermissionBackend permissionBackend) {
+    this.currentUser = currentUser;
+    this.repoManager = repoManager;
+    this.notesBranchUtilFactory = notesBranchUtilFactory;
+    this.permissionBackend = permissionBackend;
+    this.tz = gerritIdent.getTimeZone();
+  }
+
+  public BanCommitResult ban(
+      Project.NameKey project, CurrentUser user, List<ObjectId> commitsToBan, String reason)
+      throws AuthException, LockFailureException, IOException, PermissionBackendException {
+    permissionBackend.user(user).project(project).check(ProjectPermission.BAN_COMMIT);
+
+    final BanCommitResult result = new BanCommitResult();
+    NoteMap banCommitNotes = NoteMap.newEmptyMap();
+    // Add a note for each banned commit to notes.
+    try (Repository repo = repoManager.openRepository(project);
+        RevWalk revWalk = new RevWalk(repo);
+        ObjectInserter inserter = repo.newObjectInserter()) {
+      ObjectId noteId = null;
+      for (ObjectId commitToBan : commitsToBan) {
+        try {
+          revWalk.parseCommit(commitToBan);
+        } catch (MissingObjectException e) {
+          // Ignore exception, non-existing commits can be banned.
+        } catch (IncorrectObjectTypeException e) {
+          result.notACommit(commitToBan);
+          continue;
+        }
+        if (noteId == null) {
+          noteId = createNoteContent(reason, inserter);
+        }
+        banCommitNotes.set(commitToBan, noteId);
+      }
+      NotesBranchUtil notesBranchUtil = notesBranchUtilFactory.create(project, repo, inserter);
+      NoteMap newlyCreated =
+          notesBranchUtil.commitNewNotes(
+              banCommitNotes,
+              REFS_REJECT_COMMITS,
+              createPersonIdent(),
+              buildCommitMessage(commitsToBan, reason));
+
+      for (Note n : banCommitNotes) {
+        if (newlyCreated.contains(n)) {
+          result.commitBanned(n);
+        } else {
+          result.commitAlreadyBanned(n);
+        }
+      }
+      return result;
+    }
+  }
+
+  private ObjectId createNoteContent(String reason, ObjectInserter inserter) throws IOException {
+    String noteContent = reason != null ? reason : "";
+    if (noteContent.length() > 0 && !noteContent.endsWith("\n")) {
+      noteContent = noteContent + "\n";
+    }
+    return inserter.insert(Constants.OBJ_BLOB, noteContent.getBytes(UTF_8));
+  }
+
+  private PersonIdent createPersonIdent() {
+    Date now = new Date();
+    return currentUser.get().newCommitterIdent(now, tz);
+  }
+
+  private static String buildCommitMessage(List<ObjectId> bannedCommits, String reason) {
+    final StringBuilder commitMsg = new StringBuilder();
+    commitMsg.append("Banning ");
+    commitMsg.append(bannedCommits.size());
+    commitMsg.append(" ");
+    commitMsg.append(bannedCommits.size() == 1 ? "commit" : "commits");
+    commitMsg.append("\n\n");
+    if (reason != null) {
+      commitMsg.append("Reason: ");
+      commitMsg.append(reason);
+      commitMsg.append("\n\n");
+    }
+    commitMsg.append("The following commits are banned:\n");
+    final StringBuilder commitList = new StringBuilder();
+    for (ObjectId c : bannedCommits) {
+      if (commitList.length() > 0) {
+        commitList.append(",\n");
+      }
+      commitList.append(c.getName());
+    }
+    commitMsg.append(commitList);
+    return commitMsg.toString();
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/BanCommitResult.java b/java/com/google/gerrit/server/git/BanCommitResult.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/BanCommitResult.java
rename to java/com/google/gerrit/server/git/BanCommitResult.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/BranchOrderSection.java b/java/com/google/gerrit/server/git/BranchOrderSection.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/BranchOrderSection.java
rename to java/com/google/gerrit/server/git/BranchOrderSection.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeMessageModifier.java b/java/com/google/gerrit/server/git/ChangeMessageModifier.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeMessageModifier.java
rename to java/com/google/gerrit/server/git/ChangeMessageModifier.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeReportFormatter.java b/java/com/google/gerrit/server/git/ChangeReportFormatter.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeReportFormatter.java
rename to java/com/google/gerrit/server/git/ChangeReportFormatter.java
diff --git a/java/com/google/gerrit/server/git/CodeReviewCommit.java b/java/com/google/gerrit/server/git/CodeReviewCommit.java
new file mode 100644
index 0000000..c210dcd
--- /dev/null
+++ b/java/com/google/gerrit/server/git/CodeReviewCommit.java
@@ -0,0 +1,194 @@
+// Copyright (C) 2008 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.google.gerrit.server.git;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Ordering;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.submit.CommitMergeStatus;
+import java.io.IOException;
+import java.util.Optional;
+import java.util.Set;
+import org.eclipse.jgit.errors.IncorrectObjectTypeException;
+import org.eclipse.jgit.errors.MissingObjectException;
+import org.eclipse.jgit.lib.AnyObjectId;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+/** Extended commit entity with code review specific metadata. */
+public class CodeReviewCommit extends RevCommit {
+  /**
+   * Default ordering when merging multiple topologically-equivalent commits.
+   *
+   * <p>Operates only on these commits and does not take ancestry into account.
+   *
+   * <p>Use this in preference to the default order, which comes from {@link AnyObjectId} and only
+   * orders on SHA-1.
+   */
+  public static final Ordering<CodeReviewCommit> ORDER =
+      Ordering.natural()
+          .onResultOf(
+              (CodeReviewCommit c) ->
+                  c.getPatchsetId() != null ? c.getPatchsetId().getParentKey().get() : null)
+          .nullsFirst();
+
+  public static CodeReviewRevWalk newRevWalk(Repository repo) {
+    return new CodeReviewRevWalk(repo);
+  }
+
+  public static CodeReviewRevWalk newRevWalk(ObjectReader reader) {
+    return new CodeReviewRevWalk(reader);
+  }
+
+  public static class CodeReviewRevWalk extends RevWalk {
+    private CodeReviewRevWalk(Repository repo) {
+      super(repo);
+    }
+
+    private CodeReviewRevWalk(ObjectReader reader) {
+      super(reader);
+    }
+
+    @Override
+    protected CodeReviewCommit createCommit(AnyObjectId id) {
+      return new CodeReviewCommit(id);
+    }
+
+    @Override
+    public CodeReviewCommit next()
+        throws MissingObjectException, IncorrectObjectTypeException, IOException {
+      return (CodeReviewCommit) super.next();
+    }
+
+    @Override
+    public void markStart(RevCommit c)
+        throws MissingObjectException, IncorrectObjectTypeException, IOException {
+      checkArgument(c instanceof CodeReviewCommit);
+      super.markStart(c);
+    }
+
+    @Override
+    public void markUninteresting(RevCommit c)
+        throws MissingObjectException, IncorrectObjectTypeException, IOException {
+      checkArgument(c instanceof CodeReviewCommit);
+      super.markUninteresting(c);
+    }
+
+    @Override
+    public CodeReviewCommit lookupCommit(AnyObjectId id) {
+      return (CodeReviewCommit) super.lookupCommit(id);
+    }
+
+    @Override
+    public CodeReviewCommit parseCommit(AnyObjectId id)
+        throws MissingObjectException, IncorrectObjectTypeException, IOException {
+      return (CodeReviewCommit) super.parseCommit(id);
+    }
+  }
+
+  /**
+   * Unique key of the PatchSet entity from the code review system.
+   *
+   * <p>This value is only available on commits that have a PatchSet represented in the code review
+   * system.
+   */
+  private PatchSet.Id patchsetId;
+
+  private ChangeNotes notes;
+
+  /**
+   * The result status for this commit.
+   *
+   * <p>Only valid if {@link #patchsetId} is not null.
+   */
+  private CommitMergeStatus statusCode;
+
+  /**
+   * Message for the status that is returned to the calling user if the status indicates a problem
+   * that prevents submit.
+   */
+  private Optional<String> statusMessage = Optional.empty();
+
+  /** List of files in this commit that contain Git conflict markers. */
+  private ImmutableSet<String> filesWithGitConflicts;
+
+  public CodeReviewCommit(AnyObjectId id) {
+    super(id);
+  }
+
+  public ChangeNotes notes() {
+    return notes;
+  }
+
+  public CommitMergeStatus getStatusCode() {
+    return statusCode;
+  }
+
+  public void setStatusCode(CommitMergeStatus statusCode) {
+    this.statusCode = statusCode;
+  }
+
+  public Optional<String> getStatusMessage() {
+    return statusMessage;
+  }
+
+  public void setStatusMessage(@Nullable String statusMessage) {
+    this.statusMessage = Optional.ofNullable(statusMessage);
+  }
+
+  public ImmutableSet<String> getFilesWithGitConflicts() {
+    return filesWithGitConflicts != null ? filesWithGitConflicts : ImmutableSet.of();
+  }
+
+  public void setFilesWithGitConflicts(@Nullable Set<String> filesWithGitConflicts) {
+    this.filesWithGitConflicts =
+        filesWithGitConflicts != null && !filesWithGitConflicts.isEmpty()
+            ? ImmutableSet.copyOf(filesWithGitConflicts)
+            : null;
+  }
+
+  public PatchSet.Id getPatchsetId() {
+    return patchsetId;
+  }
+
+  public void setPatchsetId(PatchSet.Id patchsetId) {
+    this.patchsetId = patchsetId;
+  }
+
+  public void copyFrom(CodeReviewCommit src) {
+    notes = src.notes;
+    patchsetId = src.patchsetId;
+    statusCode = src.statusCode;
+  }
+
+  public Change change() {
+    return getNotes().getChange();
+  }
+
+  public ChangeNotes getNotes() {
+    return notes;
+  }
+
+  public void setNotes(ChangeNotes notes) {
+    this.notes = notes;
+  }
+}
diff --git a/java/com/google/gerrit/server/git/CommitUtil.java b/java/com/google/gerrit/server/git/CommitUtil.java
new file mode 100644
index 0000000..b0f10f2
--- /dev/null
+++ b/java/com/google/gerrit/server/git/CommitUtil.java
@@ -0,0 +1,51 @@
+// Copyright (C) 2017 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.google.gerrit.server.git;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.common.CommitInfo;
+import com.google.gerrit.server.CommonConverters;
+import java.io.IOException;
+import java.util.ArrayList;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+/** Static utilities for working with {@link RevCommit}s. */
+public class CommitUtil {
+  public static CommitInfo toCommitInfo(RevCommit commit) throws IOException {
+    return toCommitInfo(commit, null);
+  }
+
+  public static CommitInfo toCommitInfo(RevCommit commit, @Nullable RevWalk walk)
+      throws IOException {
+    CommitInfo info = new CommitInfo();
+    info.commit = commit.getName();
+    info.author = CommonConverters.toGitPerson(commit.getAuthorIdent());
+    info.committer = CommonConverters.toGitPerson(commit.getCommitterIdent());
+    info.subject = commit.getShortMessage();
+    info.message = commit.getFullMessage();
+    info.parents = new ArrayList<>(commit.getParentCount());
+    for (int i = 0; i < commit.getParentCount(); i++) {
+      RevCommit p = walk == null ? commit.getParent(i) : walk.parseCommit(commit.getParent(i));
+      CommitInfo parentInfo = new CommitInfo();
+      parentInfo.commit = p.getName();
+      parentInfo.subject = p.getShortMessage();
+      info.parents.add(parentInfo);
+    }
+    return info;
+  }
+
+  private CommitUtil() {}
+}
diff --git a/java/com/google/gerrit/server/git/DefaultAdvertiseRefsHook.java b/java/com/google/gerrit/server/git/DefaultAdvertiseRefsHook.java
new file mode 100644
index 0000000..ef5e65b
--- /dev/null
+++ b/java/com/google/gerrit/server/git/DefaultAdvertiseRefsHook.java
@@ -0,0 +1,50 @@
+// 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.
+
+package com.google.gerrit.server.git;
+
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import java.util.Map;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.AbstractAdvertiseRefsHook;
+import org.eclipse.jgit.transport.ServiceMayNotContinueException;
+
+/**
+ * Wrapper around {@link com.google.gerrit.server.permissions.PermissionBackend.ForProject} that
+ * implements {@link org.eclipse.jgit.transport.AdvertiseRefsHook}.
+ */
+public class DefaultAdvertiseRefsHook extends AbstractAdvertiseRefsHook {
+
+  private final PermissionBackend.ForProject perm;
+  private final PermissionBackend.RefFilterOptions opts;
+
+  public DefaultAdvertiseRefsHook(
+      PermissionBackend.ForProject perm, PermissionBackend.RefFilterOptions opts) {
+    this.perm = perm;
+    this.opts = opts;
+  }
+
+  @Override
+  protected Map<String, Ref> getAdvertisedRefs(Repository repo, RevWalk revWalk)
+      throws ServiceMayNotContinueException {
+    try {
+      return perm.filter(repo.getAllRefs(), repo, opts);
+    } catch (PermissionBackendException e) {
+      throw new ServiceMayNotContinueException(e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/git/DefaultChangeReportFormatter.java b/java/com/google/gerrit/server/git/DefaultChangeReportFormatter.java
new file mode 100644
index 0000000..6a7822e
--- /dev/null
+++ b/java/com/google/gerrit/server/git/DefaultChangeReportFormatter.java
@@ -0,0 +1,96 @@
+// Copyright (C) 2017 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.google.gerrit.server.git;
+
+import static com.google.common.base.Preconditions.checkState;
+
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.config.UrlFormatter;
+import com.google.inject.Inject;
+import java.util.Optional;
+
+/** Print a change description for use in git command-line progress. */
+public class DefaultChangeReportFormatter implements ChangeReportFormatter {
+  private static final int SUBJECT_MAX_LENGTH = 80;
+  private static final String SUBJECT_CROP_APPENDIX = "...";
+  private static final int SUBJECT_CROP_RANGE = 10;
+
+  private final DynamicItem<UrlFormatter> urlFormatter;
+
+  @Inject
+  DefaultChangeReportFormatter(DynamicItem<UrlFormatter> urlFormatter) {
+    this.urlFormatter = urlFormatter;
+  }
+
+  @Override
+  public String newChange(ChangeReportFormatter.Input input) {
+    return formatChangeUrl(input);
+  }
+
+  @Override
+  public String changeUpdated(ChangeReportFormatter.Input input) {
+    return formatChangeUrl(input);
+  }
+
+  @Override
+  public String changeClosed(ChangeReportFormatter.Input input) {
+    Change c = input.change();
+    return String.format(
+        "change %s closed",
+        urlFormatter
+            .get()
+            .getChangeViewUrl(c.getProject(), c.getId())
+            .orElse(c.getId().toString()));
+  }
+
+  protected String cropSubject(String subject) {
+    if (subject.length() > SUBJECT_MAX_LENGTH) {
+      int maxLength = SUBJECT_MAX_LENGTH - SUBJECT_CROP_APPENDIX.length();
+      for (int cropPosition = maxLength;
+          cropPosition > maxLength - SUBJECT_CROP_RANGE;
+          cropPosition--) {
+        if (Character.isWhitespace(subject.charAt(cropPosition - 1))) {
+          return subject.substring(0, cropPosition) + SUBJECT_CROP_APPENDIX;
+        }
+      }
+      return subject.substring(0, maxLength) + SUBJECT_CROP_APPENDIX;
+    }
+    return subject;
+  }
+
+  protected String formatChangeUrl(Input input) {
+    Change c = input.change();
+    Optional<String> changeUrl = urlFormatter.get().getChangeViewUrl(c.getProject(), c.getId());
+    checkState(changeUrl.isPresent());
+
+    StringBuilder m =
+        new StringBuilder()
+            .append("  ")
+            .append(changeUrl.get())
+            .append(" ")
+            .append(cropSubject(input.subject()));
+    if (input.isEdit()) {
+      m.append(" [EDIT]");
+    }
+    if (input.isPrivate()) {
+      m.append(" [PRIVATE]");
+    }
+    if (input.isWorkInProgress()) {
+      m.append(" [WIP]");
+    }
+    return m.toString();
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/DefaultQueueOp.java b/java/com/google/gerrit/server/git/DefaultQueueOp.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/DefaultQueueOp.java
rename to java/com/google/gerrit/server/git/DefaultQueueOp.java
diff --git a/java/com/google/gerrit/server/git/GarbageCollection.java b/java/com/google/gerrit/server/git/GarbageCollection.java
new file mode 100644
index 0000000..3624695
--- /dev/null
+++ b/java/com/google/gerrit/server/git/GarbageCollection.java
@@ -0,0 +1,210 @@
+// Copyright (C) 2012 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.google.gerrit.server.git;
+
+import com.google.common.collect.Sets;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.GarbageCollectionResult;
+import com.google.gerrit.extensions.events.GarbageCollectorListener;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.config.GcConfig;
+import com.google.gerrit.server.extensions.events.AbstractNoNotifyEvent;
+import com.google.inject.Inject;
+import java.io.PrintWriter;
+import java.util.List;
+import java.util.Properties;
+import java.util.Set;
+import org.eclipse.jgit.api.GarbageCollectCommand;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ConfigConstants;
+import org.eclipse.jgit.lib.NullProgressMonitor;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.lib.TextProgressMonitor;
+import org.eclipse.jgit.storage.pack.PackConfig;
+
+public class GarbageCollection {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final GitRepositoryManager repoManager;
+  private final GarbageCollectionQueue gcQueue;
+  private final GcConfig gcConfig;
+  private final DynamicSet<GarbageCollectorListener> listeners;
+
+  public interface Factory {
+    GarbageCollection create();
+  }
+
+  @Inject
+  GarbageCollection(
+      GitRepositoryManager repoManager,
+      GarbageCollectionQueue gcQueue,
+      GcConfig config,
+      DynamicSet<GarbageCollectorListener> listeners) {
+    this.repoManager = repoManager;
+    this.gcQueue = gcQueue;
+    this.gcConfig = config;
+    this.listeners = listeners;
+  }
+
+  public GarbageCollectionResult run(List<Project.NameKey> projectNames) {
+    return run(projectNames, null);
+  }
+
+  public GarbageCollectionResult run(List<Project.NameKey> projectNames, PrintWriter writer) {
+    return run(projectNames, gcConfig.isAggressive(), writer);
+  }
+
+  public GarbageCollectionResult run(
+      List<Project.NameKey> projectNames, boolean aggressive, PrintWriter writer) {
+    GarbageCollectionResult result = new GarbageCollectionResult();
+    Set<Project.NameKey> projectsToGc = gcQueue.addAll(projectNames);
+    for (Project.NameKey projectName :
+        Sets.difference(Sets.newHashSet(projectNames), projectsToGc)) {
+      result.addError(
+          new GarbageCollectionResult.Error(
+              GarbageCollectionResult.Error.Type.GC_ALREADY_SCHEDULED, projectName));
+    }
+    for (Project.NameKey p : projectsToGc) {
+      try (Repository repo = repoManager.openRepository(p)) {
+        logGcConfiguration(p, repo, aggressive);
+        print(writer, "collecting garbage for \"" + p + "\":\n");
+        GarbageCollectCommand gc = Git.wrap(repo).gc();
+        gc.setAggressive(aggressive);
+        logGcInfo(p, "before:", gc.getStatistics());
+        gc.setProgressMonitor(
+            writer != null ? new TextProgressMonitor(writer) : NullProgressMonitor.INSTANCE);
+        Properties statistics = gc.call();
+        logGcInfo(p, "after: ", statistics);
+        print(writer, "done.\n\n");
+        fire(p, statistics);
+      } catch (RepositoryNotFoundException e) {
+        logGcError(writer, p, e);
+        result.addError(
+            new GarbageCollectionResult.Error(
+                GarbageCollectionResult.Error.Type.REPOSITORY_NOT_FOUND, p));
+      } catch (Exception e) {
+        logGcError(writer, p, e);
+        result.addError(
+            new GarbageCollectionResult.Error(GarbageCollectionResult.Error.Type.GC_FAILED, p));
+      } finally {
+        gcQueue.gcFinished(p);
+      }
+    }
+    return result;
+  }
+
+  private void fire(Project.NameKey p, Properties statistics) {
+    if (!listeners.iterator().hasNext()) {
+      return;
+    }
+    Event event = new Event(p, statistics);
+    for (GarbageCollectorListener l : listeners) {
+      try {
+        l.onGarbageCollected(event);
+      } catch (RuntimeException e) {
+        logger.atWarning().withCause(e).log("Failure in GarbageCollectorListener");
+      }
+    }
+  }
+
+  private static void logGcInfo(Project.NameKey projectName, String msg) {
+    logGcInfo(projectName, msg, null);
+  }
+
+  private static void logGcInfo(Project.NameKey projectName, String msg, Properties statistics) {
+    StringBuilder b = new StringBuilder();
+    b.append("[").append(projectName.get()).append("] ");
+    b.append(msg);
+    if (statistics != null) {
+      b.append(" ");
+      String s = statistics.toString();
+      if (s.startsWith("{") && s.endsWith("}")) {
+        s = s.substring(1, s.length() - 1);
+      }
+      b.append(s);
+    }
+    logger.atInfo().log(b.toString());
+  }
+
+  private static void logGcConfiguration(
+      Project.NameKey projectName, Repository repo, boolean aggressive) {
+    StringBuilder b = new StringBuilder();
+    Config cfg = repo.getConfig();
+    b.append("gc.aggressive=").append(aggressive).append("; ");
+    b.append(formatConfigValues(cfg, ConfigConstants.CONFIG_GC_SECTION, null));
+    for (String subsection : cfg.getSubsections(ConfigConstants.CONFIG_GC_SECTION)) {
+      b.append(formatConfigValues(cfg, ConfigConstants.CONFIG_GC_SECTION, subsection));
+    }
+    if (b.length() == 0) {
+      b.append("no set");
+    }
+
+    logGcInfo(projectName, "gc config: " + b.toString());
+    logGcInfo(projectName, "pack config: " + (new PackConfig(repo)).toString());
+  }
+
+  private static String formatConfigValues(Config config, String section, String subsection) {
+    StringBuilder b = new StringBuilder();
+    Set<String> names = config.getNames(section, subsection);
+    for (String name : names) {
+      String value = config.getString(section, subsection, name);
+      b.append(section);
+      if (subsection != null) {
+        b.append(".").append(subsection);
+      }
+      b.append(".");
+      b.append(name).append("=").append(value);
+      b.append("; ");
+    }
+    return b.toString();
+  }
+
+  private static void logGcError(PrintWriter writer, Project.NameKey projectName, Exception e) {
+    print(writer, "failed.\n\n");
+    StringBuilder b = new StringBuilder();
+    b.append("[").append(projectName.get()).append("]");
+    logger.atSevere().withCause(e).log(b.toString());
+  }
+
+  private static void print(PrintWriter writer, String message) {
+    if (writer != null) {
+      writer.print(message);
+    }
+  }
+
+  private static class Event extends AbstractNoNotifyEvent
+      implements GarbageCollectorListener.Event {
+    private final Project.NameKey p;
+    private final Properties statistics;
+
+    Event(Project.NameKey p, Properties statistics) {
+      this.p = p;
+      this.statistics = statistics;
+    }
+
+    @Override
+    public String getProjectName() {
+      return p.get();
+    }
+
+    @Override
+    public Properties getStatistics() {
+      return statistics;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/git/GarbageCollectionLogFile.java b/java/com/google/gerrit/server/git/GarbageCollectionLogFile.java
new file mode 100644
index 0000000..b711708
--- /dev/null
+++ b/java/com/google/gerrit/server/git/GarbageCollectionLogFile.java
@@ -0,0 +1,64 @@
+// Copyright (C) 2012 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.google.gerrit.server.git;
+
+import com.google.common.flogger.backend.Platform;
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.util.SystemLog;
+import com.google.inject.Inject;
+import java.nio.file.Path;
+import org.apache.log4j.LogManager;
+import org.apache.log4j.Logger;
+import org.apache.log4j.PatternLayout;
+import org.eclipse.jgit.lib.Config;
+
+public class GarbageCollectionLogFile implements LifecycleListener {
+  private static final String LOG_NAME = "gc_log";
+
+  @Inject
+  public GarbageCollectionLogFile(SitePaths sitePaths, @GerritServerConfig Config config) {
+    if (SystemLog.shouldConfigure()) {
+      initLogSystem(sitePaths.logs_dir, config.getBoolean("log", "rotate", true));
+    }
+  }
+
+  @Override
+  public void start() {}
+
+  @Override
+  public void stop() {
+    getLogger(GarbageCollection.class).removeAllAppenders();
+    getLogger(GarbageCollectionRunner.class).removeAllAppenders();
+  }
+
+  private static void initLogSystem(Path logdir, boolean rotate) {
+    initGcLogger(logdir, rotate, getLogger(GarbageCollection.class));
+    initGcLogger(logdir, rotate, getLogger(GarbageCollectionRunner.class));
+  }
+
+  private static Logger getLogger(Class<?> clazz) {
+    return LogManager.getLogger(Platform.getBackend(clazz.getName()).getLoggerName());
+  }
+
+  private static void initGcLogger(Path logdir, boolean rotate, Logger gcLogger) {
+    gcLogger.removeAllAppenders();
+    gcLogger.addAppender(
+        SystemLog.createAppender(
+            logdir, LOG_NAME, new PatternLayout("[%d] %-5p %x: %m%n"), rotate));
+    gcLogger.setAdditivity(false);
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollectionModule.java b/java/com/google/gerrit/server/git/GarbageCollectionModule.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollectionModule.java
rename to java/com/google/gerrit/server/git/GarbageCollectionModule.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollectionQueue.java b/java/com/google/gerrit/server/git/GarbageCollectionQueue.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollectionQueue.java
rename to java/com/google/gerrit/server/git/GarbageCollectionQueue.java
diff --git a/java/com/google/gerrit/server/git/GarbageCollectionRunner.java b/java/com/google/gerrit/server/git/GarbageCollectionRunner.java
new file mode 100644
index 0000000..b44251d
--- /dev/null
+++ b/java/com/google/gerrit/server/git/GarbageCollectionRunner.java
@@ -0,0 +1,71 @@
+// Copyright (C) 2014 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.google.gerrit.server.git;
+
+import com.google.common.collect.Lists;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.server.config.GcConfig;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.inject.Inject;
+
+/** Runnable to enable scheduling gc to run periodically */
+public class GarbageCollectionRunner implements Runnable {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  static class Lifecycle implements LifecycleListener {
+    private final WorkQueue queue;
+    private final GarbageCollectionRunner gcRunner;
+    private final GcConfig gcConfig;
+
+    @Inject
+    Lifecycle(WorkQueue queue, GarbageCollectionRunner gcRunner, GcConfig config) {
+      this.queue = queue;
+      this.gcRunner = gcRunner;
+      this.gcConfig = config;
+    }
+
+    @Override
+    public void start() {
+      gcConfig.getSchedule().ifPresent(s -> queue.scheduleAtFixedRate(gcRunner, s));
+    }
+
+    @Override
+    public void stop() {
+      // handled by WorkQueue.stop() already
+    }
+  }
+
+  private final GarbageCollection.Factory garbageCollectionFactory;
+  private final ProjectCache projectCache;
+
+  @Inject
+  GarbageCollectionRunner(
+      GarbageCollection.Factory garbageCollectionFactory, ProjectCache projectCache) {
+    this.garbageCollectionFactory = garbageCollectionFactory;
+    this.projectCache = projectCache;
+  }
+
+  @Override
+  public void run() {
+    logger.atInfo().log("Triggering gc on all repositories");
+    garbageCollectionFactory.create().run(Lists.newArrayList(projectCache.all()));
+  }
+
+  @Override
+  public String toString() {
+    return "GC runner";
+  }
+}
diff --git a/java/com/google/gerrit/server/git/GitModule.java b/java/com/google/gerrit/server/git/GitModule.java
new file mode 100644
index 0000000..24d5580
--- /dev/null
+++ b/java/com/google/gerrit/server/git/GitModule.java
@@ -0,0 +1,33 @@
+// Copyright (C) 2011 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.google.gerrit.server.git;
+
+import com.google.gerrit.extensions.config.FactoryModule;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import org.eclipse.jgit.transport.PostUploadHook;
+
+/** Configures the Git support. */
+public class GitModule extends FactoryModule {
+  @Override
+  protected void configure() {
+    factory(MetaDataUpdate.InternalFactory.class);
+    bind(MetaDataUpdate.Server.class);
+    DynamicSet.bind(binder(), PostUploadHook.class).to(UploadPackMetricsHook.class);
+    DynamicItem.itemOf(binder(), ChangeReportFormatter.class);
+    DynamicItem.bind(binder(), ChangeReportFormatter.class).to(DefaultChangeReportFormatter.class);
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/GitRepositoryManager.java b/java/com/google/gerrit/server/git/GitRepositoryManager.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/GitRepositoryManager.java
rename to java/com/google/gerrit/server/git/GitRepositoryManager.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/GitRepositoryManagerModule.java b/java/com/google/gerrit/server/git/GitRepositoryManagerModule.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/GitRepositoryManagerModule.java
rename to java/com/google/gerrit/server/git/GitRepositoryManagerModule.java
diff --git a/java/com/google/gerrit/server/git/GroupCollector.java b/java/com/google/gerrit/server/git/GroupCollector.java
new file mode 100644
index 0000000..bb65fa8
--- /dev/null
+++ b/java/com/google/gerrit/server/git/GroupCollector.java
@@ -0,0 +1,303 @@
+// Copyright (C) 2015 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.google.gerrit.server.git;
+
+import static com.google.common.base.Preconditions.checkState;
+import static org.eclipse.jgit.revwalk.RevFlag.UNINTERESTING;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.collect.Multimaps;
+import com.google.common.collect.SetMultimap;
+import com.google.common.collect.Sets;
+import com.google.common.collect.SortedSetMultimap;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gwtorm.server.OrmException;
+import java.util.ArrayDeque;
+import java.util.Collection;
+import java.util.Deque;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.revwalk.RevCommit;
+
+/**
+ * Helper for assigning groups to commits during {@code ReceiveCommits}.
+ *
+ * <p>For each commit encountered along a walk between the branch tip and the tip of the push, the
+ * group of a commit is defined as follows:
+ *
+ * <ul>
+ *   <li>If the commit is an existing patch set of a change, the group is read from the group field
+ *       in the corresponding {@link PatchSet} record.
+ *   <li>If all of a commit's parents are merged into the branch, then its group is its own SHA-1.
+ *   <li>If the commit has a single parent that is not yet merged into the branch, then its group is
+ *       the same as the parent's group.
+ *   <li>
+ *   <li>For a merge commit, choose a parent and use that parent's group. If one of the parents has
+ *       a group from a patch set, use that group, otherwise, use the group from the first parent.
+ *       In addition to setting this merge commit's group, use the chosen group for all commits that
+ *       would otherwise use a group from the parents that were not chosen.
+ *   <li>If a merge commit has multiple parents whose group comes from separate patch sets,
+ *       concatenate the groups from those parents together. This indicates two side branches were
+ *       pushed separately, followed by the merge.
+ *   <li>
+ * </ul>
+ *
+ * <p>Callers must call {@link #visit(RevCommit)} on all commits between the current branch tip and
+ * the tip of a push, in reverse topo order (parents before children). Once all commits have been
+ * visited, call {@link #getGroups()} for the result.
+ */
+public class GroupCollector {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static List<String> getDefaultGroups(PatchSet ps) {
+    return ImmutableList.of(ps.getRevision().get());
+  }
+
+  public static List<String> getDefaultGroups(ObjectId commit) {
+    return ImmutableList.of(commit.name());
+  }
+
+  public static List<String> getGroups(RevisionResource rsrc) {
+    if (rsrc.getEdit().isPresent()) {
+      // Groups for an edit are just the base revision's groups, since they have
+      // the same parent.
+      return rsrc.getEdit().get().getBasePatchSet().getGroups();
+    }
+    return rsrc.getPatchSet().getGroups();
+  }
+
+  private interface Lookup {
+    List<String> lookup(PatchSet.Id psId) throws OrmException;
+  }
+
+  private final ListMultimap<ObjectId, PatchSet.Id> patchSetsBySha;
+  private final ListMultimap<ObjectId, String> groups;
+  private final SetMultimap<String, String> groupAliases;
+  private final Lookup groupLookup;
+
+  private boolean done;
+
+  public static GroupCollector create(
+      ListMultimap<ObjectId, Ref> changeRefsById,
+      ReviewDb db,
+      PatchSetUtil psUtil,
+      ChangeNotes.Factory notesFactory,
+      Project.NameKey project) {
+    return new GroupCollector(
+        transformRefs(changeRefsById),
+        new Lookup() {
+          @Override
+          public List<String> lookup(PatchSet.Id psId) throws OrmException {
+            // TODO(dborowitz): Reuse open repository from caller.
+            ChangeNotes notes = notesFactory.createChecked(db, project, psId.getParentKey());
+            PatchSet ps = psUtil.get(db, notes, psId);
+            return ps != null ? ps.getGroups() : null;
+          }
+        });
+  }
+
+  public static GroupCollector createForSchemaUpgradeOnly(
+      ListMultimap<ObjectId, Ref> changeRefsById, ReviewDb db) {
+    return new GroupCollector(
+        transformRefs(changeRefsById),
+        new Lookup() {
+          @Override
+          public List<String> lookup(PatchSet.Id psId) throws OrmException {
+            PatchSet ps = db.patchSets().get(psId);
+            return ps != null ? ps.getGroups() : null;
+          }
+        });
+  }
+
+  private GroupCollector(ListMultimap<ObjectId, PatchSet.Id> patchSetsBySha, Lookup groupLookup) {
+    this.patchSetsBySha = patchSetsBySha;
+    this.groupLookup = groupLookup;
+    groups = MultimapBuilder.hashKeys().arrayListValues().build();
+    groupAliases = MultimapBuilder.hashKeys().hashSetValues().build();
+  }
+
+  private static ListMultimap<ObjectId, PatchSet.Id> transformRefs(
+      ListMultimap<ObjectId, Ref> refs) {
+    return Multimaps.transformValues(refs, r -> PatchSet.Id.fromRef(r.getName()));
+  }
+
+  @VisibleForTesting
+  GroupCollector(
+      ListMultimap<ObjectId, PatchSet.Id> patchSetsBySha,
+      ListMultimap<PatchSet.Id, String> groupLookup) {
+    this(
+        patchSetsBySha,
+        new Lookup() {
+          @Override
+          public List<String> lookup(PatchSet.Id psId) {
+            List<String> groups = groupLookup.get(psId);
+            return !groups.isEmpty() ? groups : null;
+          }
+        });
+  }
+
+  public void visit(RevCommit c) {
+    checkState(!done, "visit() called after getGroups()");
+    Set<RevCommit> interestingParents = getInterestingParents(c);
+
+    if (interestingParents.size() == 0) {
+      // All parents are uninteresting: treat this commit as the root of a new
+      // group of related changes.
+      groups.put(c, c.name());
+      return;
+    } else if (interestingParents.size() == 1) {
+      // Only one parent is new in this push. If it is the only parent, just use
+      // that parent's group. If there are multiple parents, perhaps this commit
+      // is a merge of a side branch. This commit belongs in that parent's group
+      // in that case.
+      groups.putAll(c, groups.get(interestingParents.iterator().next()));
+      return;
+    }
+
+    // Multiple parents, merging at least two branches containing new commits in
+    // this push.
+    Set<String> thisCommitGroups = new TreeSet<>();
+    Set<String> parentGroupsNewInThisPush =
+        Sets.newLinkedHashSetWithExpectedSize(interestingParents.size());
+    for (RevCommit p : interestingParents) {
+      Collection<String> parentGroups = groups.get(p);
+      if (parentGroups.isEmpty()) {
+        throw new IllegalStateException(
+            String.format("no group assigned to parent %s of commit %s", p.name(), c.name()));
+      }
+
+      for (String parentGroup : parentGroups) {
+        if (isGroupFromExistingPatchSet(p, parentGroup)) {
+          // This parent's group is from an existing patch set, i.e. the parent
+          // not new in this push. Use this group for the commit.
+          thisCommitGroups.add(parentGroup);
+        } else {
+          // This parent's group is new in this push.
+          parentGroupsNewInThisPush.add(parentGroup);
+        }
+      }
+    }
+
+    Iterable<String> toAlias;
+    if (thisCommitGroups.isEmpty()) {
+      // All parent groups were new in this push. Pick the first one and alias
+      // other parents' groups to this first parent.
+      String firstParentGroup = parentGroupsNewInThisPush.iterator().next();
+      thisCommitGroups = ImmutableSet.of(firstParentGroup);
+      toAlias = Iterables.skip(parentGroupsNewInThisPush, 1);
+    } else {
+      // For each parent group that was new in this push, alias it to the actual
+      // computed group(s) for this commit.
+      toAlias = parentGroupsNewInThisPush;
+    }
+    groups.putAll(c, thisCommitGroups);
+    for (String pg : toAlias) {
+      groupAliases.putAll(pg, thisCommitGroups);
+    }
+  }
+
+  public SortedSetMultimap<ObjectId, String> getGroups() throws OrmException {
+    done = true;
+    SortedSetMultimap<ObjectId, String> result =
+        MultimapBuilder.hashKeys(groups.keySet().size()).treeSetValues().build();
+    for (Map.Entry<ObjectId, Collection<String>> e : groups.asMap().entrySet()) {
+      ObjectId id = e.getKey();
+      result.putAll(id.copy(), resolveGroups(id, e.getValue()));
+    }
+    return result;
+  }
+
+  private Set<RevCommit> getInterestingParents(RevCommit commit) {
+    Set<RevCommit> result = Sets.newLinkedHashSetWithExpectedSize(commit.getParentCount());
+    for (RevCommit p : commit.getParents()) {
+      if (!p.has(UNINTERESTING)) {
+        result.add(p);
+      }
+    }
+    return result;
+  }
+
+  private boolean isGroupFromExistingPatchSet(RevCommit commit, String group) {
+    ObjectId id = parseGroup(commit, group);
+    return id != null && patchSetsBySha.containsKey(id);
+  }
+
+  private Set<String> resolveGroups(ObjectId forCommit, Collection<String> candidates)
+      throws OrmException {
+    Set<String> actual = Sets.newTreeSet();
+    Set<String> done = Sets.newHashSetWithExpectedSize(candidates.size());
+    Set<String> seen = Sets.newHashSetWithExpectedSize(candidates.size());
+    Deque<String> todo = new ArrayDeque<>(candidates);
+    // BFS through all aliases to find groups that are not aliased to anything
+    // else.
+    while (!todo.isEmpty()) {
+      String g = todo.removeFirst();
+      if (!seen.add(g)) {
+        continue;
+      }
+      Set<String> aliases = groupAliases.get(g);
+      if (aliases.isEmpty()) {
+        if (!done.contains(g)) {
+          Iterables.addAll(actual, resolveGroup(forCommit, g));
+          done.add(g);
+        }
+      } else {
+        todo.addAll(aliases);
+      }
+    }
+    return actual;
+  }
+
+  private ObjectId parseGroup(ObjectId forCommit, String group) {
+    try {
+      return ObjectId.fromString(group);
+    } catch (IllegalArgumentException e) {
+      // Shouldn't happen; some sort of corruption or manual tinkering?
+      logger.atWarning().log("group for commit %s is not a SHA-1: %s", forCommit.name(), group);
+      return null;
+    }
+  }
+
+  private Iterable<String> resolveGroup(ObjectId forCommit, String group) throws OrmException {
+    ObjectId id = parseGroup(forCommit, group);
+    if (id != null) {
+      PatchSet.Id psId = Iterables.getFirst(patchSetsBySha.get(id), null);
+      if (psId != null) {
+        List<String> groups = groupLookup.lookup(psId);
+        // Group for existing patch set may be missing, e.g. if group has not
+        // been migrated yet.
+        if (groups != null && !groups.isEmpty()) {
+          return groups;
+        }
+      }
+    }
+    return ImmutableList.of(group);
+  }
+}
diff --git a/java/com/google/gerrit/server/git/HookUtil.java b/java/com/google/gerrit/server/git/HookUtil.java
new file mode 100644
index 0000000..42d3f69
--- /dev/null
+++ b/java/com/google/gerrit/server/git/HookUtil.java
@@ -0,0 +1,52 @@
+// Copyright (C) 2017 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.google.gerrit.server.git;
+
+import java.io.IOException;
+import java.util.Map;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefDatabase;
+import org.eclipse.jgit.transport.BaseReceivePack;
+import org.eclipse.jgit.transport.ServiceMayNotContinueException;
+
+/** Static utilities for writing git protocol hooks. */
+public class HookUtil {
+  /**
+   * Scan and advertise all refs in the repo if refs have not already been advertised; otherwise,
+   * just return the advertised map.
+   *
+   * @param rp receive-pack handler.
+   * @return map of refs that were advertised.
+   * @throws ServiceMayNotContinueException if a problem occurred.
+   */
+  public static Map<String, Ref> ensureAllRefsAdvertised(BaseReceivePack rp)
+      throws ServiceMayNotContinueException {
+    Map<String, Ref> refs = rp.getAdvertisedRefs();
+    if (refs != null) {
+      return refs;
+    }
+    try {
+      refs = rp.getRepository().getRefDatabase().getRefs(RefDatabase.ALL);
+    } catch (ServiceMayNotContinueException e) {
+      throw e;
+    } catch (IOException e) {
+      throw new ServiceMayNotContinueException(e);
+    }
+    rp.setAdvertisedRefs(refs, rp.getAdvertisedObjects());
+    return refs;
+  }
+
+  private HookUtil() {}
+}
diff --git a/java/com/google/gerrit/server/git/InMemoryInserter.java b/java/com/google/gerrit/server/git/InMemoryInserter.java
new file mode 100644
index 0000000..8d12f2b
--- /dev/null
+++ b/java/com/google/gerrit/server/git/InMemoryInserter.java
@@ -0,0 +1,151 @@
+// 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.
+
+package com.google.gerrit.server.git;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ImmutableList;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.jgit.errors.IncorrectObjectTypeException;
+import org.eclipse.jgit.lib.AbbreviatedObjectId;
+import org.eclipse.jgit.lib.AnyObjectId;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.ObjectLoader;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.transport.PackParser;
+
+public class InMemoryInserter extends ObjectInserter {
+  private final ObjectReader reader;
+  private final Map<ObjectId, InsertedObject> inserted = new LinkedHashMap<>();
+  private final boolean closeReader;
+
+  public InMemoryInserter(ObjectReader reader) {
+    this.reader = requireNonNull(reader);
+    closeReader = false;
+  }
+
+  public InMemoryInserter(Repository repo) {
+    this.reader = repo.newObjectReader();
+    closeReader = true;
+  }
+
+  @Override
+  public ObjectId insert(int type, long length, InputStream in) throws IOException {
+    return insert(InsertedObject.create(type, in));
+  }
+
+  @Override
+  public ObjectId insert(int type, byte[] data) {
+    return insert(type, data, 0, data.length);
+  }
+
+  @Override
+  public ObjectId insert(int type, byte[] data, int off, int len) {
+    return insert(InsertedObject.create(type, data, off, len));
+  }
+
+  public ObjectId insert(InsertedObject obj) {
+    inserted.put(obj.id(), obj);
+    return obj.id();
+  }
+
+  @Override
+  public PackParser newPackParser(InputStream in) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public ObjectReader newReader() {
+    return new Reader();
+  }
+
+  @Override
+  public void flush() {
+    // Do nothing; objects are not written to the repo.
+  }
+
+  @Override
+  public void close() {
+    if (closeReader) {
+      reader.close();
+    }
+  }
+
+  public ImmutableList<InsertedObject> getInsertedObjects() {
+    return ImmutableList.copyOf(inserted.values());
+  }
+
+  public int getInsertedObjectCount() {
+    return inserted.values().size();
+  }
+
+  public void clear() {
+    inserted.clear();
+  }
+
+  private class Reader extends ObjectReader {
+    @Override
+    public ObjectReader newReader() {
+      return new Reader();
+    }
+
+    @Override
+    public Collection<ObjectId> resolve(AbbreviatedObjectId id) throws IOException {
+      Set<ObjectId> result = new HashSet<>();
+      for (ObjectId insId : inserted.keySet()) {
+        if (id.prefixCompare(insId) == 0) {
+          result.add(insId);
+        }
+      }
+      result.addAll(reader.resolve(id));
+      return result;
+    }
+
+    @Override
+    public ObjectLoader open(AnyObjectId objectId, int typeHint) throws IOException {
+      InsertedObject obj = inserted.get(objectId);
+      if (obj == null) {
+        return reader.open(objectId, typeHint);
+      }
+      if (typeHint != OBJ_ANY && obj.type() != typeHint) {
+        throw new IncorrectObjectTypeException(objectId.copy(), typeHint);
+      }
+      return obj.newLoader();
+    }
+
+    @Override
+    public Set<ObjectId> getShallowCommits() throws IOException {
+      return reader.getShallowCommits();
+    }
+
+    @Override
+    public void close() {
+      // Do nothing; this class owns no open resources.
+    }
+
+    @Override
+    public ObjectInserter getCreatedFromInserter() {
+      return InMemoryInserter.this;
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/InsertedObject.java b/java/com/google/gerrit/server/git/InsertedObject.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/InsertedObject.java
rename to java/com/google/gerrit/server/git/InsertedObject.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/LargeObjectException.java b/java/com/google/gerrit/server/git/LargeObjectException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/LargeObjectException.java
rename to java/com/google/gerrit/server/git/LargeObjectException.java
diff --git a/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java b/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java
new file mode 100644
index 0000000..85822a8
--- /dev/null
+++ b/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java
@@ -0,0 +1,306 @@
+// Copyright (C) 2008 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.google.gerrit.server.git;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.lifecycle.LifecycleModule;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.FileVisitOption;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ConfigConstants;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.lib.RepositoryCache;
+import org.eclipse.jgit.lib.RepositoryCache.FileKey;
+import org.eclipse.jgit.lib.RepositoryCacheConfig;
+import org.eclipse.jgit.lib.StoredConfig;
+import org.eclipse.jgit.storage.file.WindowCacheConfig;
+import org.eclipse.jgit.util.FS;
+
+/** Manages Git repositories stored on the local filesystem. */
+@Singleton
+public class LocalDiskRepositoryManager implements GitRepositoryManager {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static class Module extends LifecycleModule {
+    @Override
+    protected void configure() {
+      listener().to(LocalDiskRepositoryManager.Lifecycle.class);
+    }
+  }
+
+  public static class Lifecycle implements LifecycleListener {
+    private final Config serverConfig;
+
+    @Inject
+    Lifecycle(@GerritServerConfig Config cfg) {
+      this.serverConfig = cfg;
+    }
+
+    @Override
+    public void start() {
+      RepositoryCacheConfig repoCacheCfg = new RepositoryCacheConfig();
+      repoCacheCfg.fromConfig(serverConfig);
+      repoCacheCfg.install();
+
+      WindowCacheConfig cfg = new WindowCacheConfig();
+      cfg.fromConfig(serverConfig);
+      if (serverConfig.getString("core", null, "streamFileThreshold") == null) {
+        long mx = Runtime.getRuntime().maxMemory();
+        int limit =
+            (int)
+                Math.min(
+                    mx / 4, // don't use more than 1/4 of the heap.
+                    2047 << 20); // cannot exceed array length
+        if ((5 << 20) < limit && limit % (1 << 20) != 0) {
+          // If the limit is at least 5 MiB but is not a whole multiple
+          // of MiB round up to the next one full megabyte. This is a very
+          // tiny memory increase in exchange for nice round units.
+          limit = ((limit / (1 << 20)) + 1) << 20;
+        }
+
+        String desc;
+        if (limit % (1 << 20) == 0) {
+          desc = String.format("%dm", limit / (1 << 20));
+        } else if (limit % (1 << 10) == 0) {
+          desc = String.format("%dk", limit / (1 << 10));
+        } else {
+          desc = String.format("%d", limit);
+        }
+        logger.atInfo().log("Defaulting core.streamFileThreshold to %s", desc);
+        cfg.setStreamFileThreshold(limit);
+      }
+      cfg.install();
+    }
+
+    @Override
+    public void stop() {}
+  }
+
+  private final Path basePath;
+
+  @Inject
+  LocalDiskRepositoryManager(SitePaths site, @GerritServerConfig Config cfg) {
+    basePath = site.resolve(cfg.getString("gerrit", null, "basePath"));
+    if (basePath == null) {
+      throw new IllegalStateException("gerrit.basePath must be configured");
+    }
+  }
+
+  /**
+   * Return the basePath under which the specified project is stored.
+   *
+   * @param name the name of the project
+   * @return base directory
+   */
+  public Path getBasePath(Project.NameKey name) {
+    return basePath;
+  }
+
+  @Override
+  public Repository openRepository(Project.NameKey name) throws RepositoryNotFoundException {
+    return openRepository(getBasePath(name), name);
+  }
+
+  private Repository openRepository(Path path, Project.NameKey name)
+      throws RepositoryNotFoundException {
+    if (isUnreasonableName(name)) {
+      throw new RepositoryNotFoundException("Invalid name: " + name);
+    }
+    FileKey loc = FileKey.lenient(path.resolve(name.get()).toFile(), FS.DETECTED);
+    try {
+      return RepositoryCache.open(loc);
+    } catch (IOException e) {
+      throw new RepositoryNotFoundException("Cannot open repository " + name, e);
+    }
+  }
+
+  @Override
+  public Repository createRepository(Project.NameKey name)
+      throws RepositoryNotFoundException, RepositoryCaseMismatchException, IOException {
+    Path path = getBasePath(name);
+    if (isUnreasonableName(name)) {
+      throw new RepositoryNotFoundException("Invalid name: " + name);
+    }
+
+    File dir = FileKey.resolve(path.resolve(name.get()).toFile(), FS.DETECTED);
+    if (dir != null) {
+      // Already exists on disk, use the repository we found.
+      //
+      Project.NameKey onDiskName = getProjectName(path, dir.getCanonicalFile().toPath());
+
+      if (!onDiskName.equals(name)) {
+        throw new RepositoryCaseMismatchException(name);
+      }
+
+      throw new IllegalStateException("Repository already exists: " + name);
+    }
+
+    // It doesn't exist under any of the standard permutations
+    // of the repository name, so prefer the standard bare name.
+    //
+    String n = name.get() + Constants.DOT_GIT_EXT;
+    FileKey loc = FileKey.exact(path.resolve(n).toFile(), FS.DETECTED);
+
+    try {
+      Repository db = RepositoryCache.open(loc, false);
+      db.create(true /* bare */);
+
+      StoredConfig config = db.getConfig();
+      config.setBoolean(
+          ConfigConstants.CONFIG_CORE_SECTION,
+          null,
+          ConfigConstants.CONFIG_KEY_LOGALLREFUPDATES,
+          true);
+      config.save();
+
+      // JGit only writes to the reflog for refs/meta/config if the log file
+      // already exists.
+      //
+      File metaConfigLog = new File(db.getDirectory(), "logs/" + RefNames.REFS_CONFIG);
+      if (!metaConfigLog.getParentFile().mkdirs() || !metaConfigLog.createNewFile()) {
+        logger.atSevere().log(
+            "Failed to create ref log for %s in repository %s", RefNames.REFS_CONFIG, name);
+      }
+
+      return db;
+    } catch (IOException e) {
+      throw new RepositoryNotFoundException("Cannot create repository " + name, e);
+    }
+  }
+
+  private boolean isUnreasonableName(Project.NameKey nameKey) {
+    final String name = nameKey.get();
+
+    return name.length() == 0 // no empty paths
+        || name.charAt(name.length() - 1) == '/' // no suffix
+        || name.indexOf('\\') >= 0 // no windows/dos style paths
+        || name.charAt(0) == '/' // no absolute paths
+        || new File(name).isAbsolute() // no absolute paths
+        || name.startsWith("../") // no "l../etc/passwd"
+        || name.contains("/../") // no "foo/../etc/passwd"
+        || name.contains("/./") // "foo/./foo" is insane to ask
+        || name.contains("//") // windows UNC path can be "//..."
+        || name.contains(".git/") // no path segments that end with '.git' as "foo.git/bar"
+        || name.contains("?") // common unix wildcard
+        || name.contains("%") // wildcard or string parameter
+        || name.contains("*") // wildcard
+        || name.contains(":") // Could be used for absolute paths in windows?
+        || name.contains("<") // redirect input
+        || name.contains(">") // redirect output
+        || name.contains("|") // pipe
+        || name.contains("$") // dollar sign
+        || name.contains("\r") // carriage return
+        || name.contains("/+") // delimiter in /changes/
+        || name.contains("~"); // delimiter in /changes/
+  }
+
+  @Override
+  public SortedSet<Project.NameKey> list() {
+    ProjectVisitor visitor = new ProjectVisitor(basePath);
+    scanProjects(visitor);
+    return Collections.unmodifiableSortedSet(visitor.found);
+  }
+
+  protected void scanProjects(ProjectVisitor visitor) {
+    try {
+      Files.walkFileTree(
+          visitor.startFolder,
+          EnumSet.of(FileVisitOption.FOLLOW_LINKS),
+          Integer.MAX_VALUE,
+          visitor);
+    } catch (IOException e) {
+      logger.atSevere().withCause(e).log(
+          "Error walking repository tree %s", visitor.startFolder.toAbsolutePath());
+    }
+  }
+
+  private static Project.NameKey getProjectName(Path startFolder, Path p) {
+    String projectName = startFolder.relativize(p).toString();
+    if (File.separatorChar != '/') {
+      projectName = projectName.replace(File.separatorChar, '/');
+    }
+    if (projectName.endsWith(Constants.DOT_GIT_EXT)) {
+      int newLen = projectName.length() - Constants.DOT_GIT_EXT.length();
+      projectName = projectName.substring(0, newLen);
+    }
+    return new Project.NameKey(projectName);
+  }
+
+  protected class ProjectVisitor extends SimpleFileVisitor<Path> {
+    private final SortedSet<Project.NameKey> found = new TreeSet<>();
+    private Path startFolder;
+
+    public ProjectVisitor(Path startFolder) {
+      setStartFolder(startFolder);
+    }
+
+    public void setStartFolder(Path startFolder) {
+      this.startFolder = startFolder;
+    }
+
+    @Override
+    public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
+        throws IOException {
+      if (!dir.equals(startFolder) && isRepo(dir)) {
+        addProject(dir);
+        return FileVisitResult.SKIP_SUBTREE;
+      }
+      return FileVisitResult.CONTINUE;
+    }
+
+    @Override
+    public FileVisitResult visitFileFailed(Path file, IOException e) {
+      logger.atWarning().log(e.getMessage());
+      return FileVisitResult.CONTINUE;
+    }
+
+    private boolean isRepo(Path p) {
+      String name = p.getFileName().toString();
+      return !name.equals(Constants.DOT_GIT)
+          && (name.endsWith(Constants.DOT_GIT_EXT)
+              || FileKey.isGitRepository(p.toFile(), FS.DETECTED));
+    }
+
+    private void addProject(Path p) {
+      Project.NameKey nameKey = getProjectName(startFolder, p);
+      if (getBasePath(nameKey).equals(startFolder)) {
+        if (isUnreasonableName(nameKey)) {
+          logger.atWarning().log("Ignoring unreasonably named repository %s", p.toAbsolutePath());
+        } else {
+          found.add(nameKey);
+        }
+      }
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/LockFailureException.java b/java/com/google/gerrit/server/git/LockFailureException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/LockFailureException.java
rename to java/com/google/gerrit/server/git/LockFailureException.java
diff --git a/java/com/google/gerrit/server/git/MergeTip.java b/java/com/google/gerrit/server/git/MergeTip.java
new file mode 100644
index 0000000..204f453
--- /dev/null
+++ b/java/com/google/gerrit/server/git/MergeTip.java
@@ -0,0 +1,92 @@
+// Copyright (C) 2014 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.google.gerrit.server.git;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.util.Objects.requireNonNull;
+
+import com.google.gerrit.common.Nullable;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.jgit.lib.ObjectId;
+
+/**
+ * Class describing a merge tip during merge operation.
+ *
+ * <p>The current tip of a {@link MergeTip} may be null if the merge operation is against an unborn
+ * branch, and has not yet been attempted. This is distinct from a null {@link MergeTip} instance,
+ * which may be used to indicate that a merge failed or another error state.
+ */
+public class MergeTip {
+  private CodeReviewCommit initialTip;
+  private CodeReviewCommit branchTip;
+  private Map<ObjectId, ObjectId> mergeResults;
+
+  /**
+   * @param initialTip tip before the merge operation; may be null, indicating an unborn branch.
+   * @param toMerge list of commits to be merged in merge operation; may not be null or empty.
+   */
+  public MergeTip(@Nullable CodeReviewCommit initialTip, Collection<CodeReviewCommit> toMerge) {
+    requireNonNull(toMerge, "toMerge may not be null");
+    checkArgument(!toMerge.isEmpty(), "toMerge may not be empty");
+    this.initialTip = initialTip;
+    this.branchTip = initialTip;
+    this.mergeResults = new HashMap<>();
+    // Assume fast-forward merge until opposite is proven.
+    for (CodeReviewCommit commit : toMerge) {
+      mergeResults.put(commit.copy(), commit.copy());
+    }
+  }
+
+  /**
+   * @return the initial tip of the branch before the merge operation started; may be null,
+   *     indicating a previously unborn branch.
+   */
+  public CodeReviewCommit getInitialTip() {
+    return initialTip;
+  }
+
+  /**
+   * Moves this MergeTip to newTip and appends mergeResult.
+   *
+   * @param newTip The new tip; may not be null.
+   * @param mergedFrom The result of the merge of {@code newTip}.
+   */
+  public void moveTipTo(CodeReviewCommit newTip, ObjectId mergedFrom) {
+    checkArgument(newTip != null);
+    branchTip = newTip;
+    mergeResults.put(mergedFrom, newTip.copy());
+  }
+
+  /**
+   * The merge results of all the merges of this merge operation.
+   *
+   * @return The merge results of the merge operation as a map of SHA-1 to be merged to SHA-1 of the
+   *     merge result.
+   */
+  public Map<ObjectId, ObjectId> getMergeResults() {
+    return mergeResults;
+  }
+
+  /**
+   * @return The current tip of the current merge operation; may be null, indicating an unborn
+   *     branch.
+   */
+  @Nullable
+  public CodeReviewCommit getCurrentTip() {
+    return branchTip;
+  }
+}
diff --git a/java/com/google/gerrit/server/git/MergeUtil.java b/java/com/google/gerrit/server/git/MergeUtil.java
new file mode 100644
index 0000000..f964916
--- /dev/null
+++ b/java/com/google/gerrit/server/git/MergeUtil.java
@@ -0,0 +1,1018 @@
+// Copyright (C) 2012 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.google.gerrit.server.git;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.collect.ImmutableSet.toImmutableSet;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.base.Joiner;
+import com.google.common.base.Strings;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Sets;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.FooterConstants;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.MergeConflictException;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.LabelId;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSet.Id;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.UrlFormatter;
+import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.submit.ChangeAlreadyMergedException;
+import com.google.gerrit.server.submit.CommitMergeStatus;
+import com.google.gerrit.server.submit.IntegrationException;
+import com.google.gerrit.server.submit.MergeIdenticalTreeException;
+import com.google.gerrit.server.submit.MergeSorter;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.Assisted;
+import com.google.inject.assistedinject.AssistedInject;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import org.eclipse.jgit.diff.Sequence;
+import org.eclipse.jgit.dircache.DirCache;
+import org.eclipse.jgit.dircache.DirCacheBuilder;
+import org.eclipse.jgit.dircache.DirCacheEntry;
+import org.eclipse.jgit.errors.AmbiguousObjectException;
+import org.eclipse.jgit.errors.IncorrectObjectTypeException;
+import org.eclipse.jgit.errors.LargeObjectException;
+import org.eclipse.jgit.errors.MissingObjectException;
+import org.eclipse.jgit.errors.NoMergeBaseException;
+import org.eclipse.jgit.errors.NoMergeBaseException.MergeBaseFailureReason;
+import org.eclipse.jgit.errors.RevisionSyntaxException;
+import org.eclipse.jgit.lib.AnyObjectId;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.merge.MergeFormatter;
+import org.eclipse.jgit.merge.MergeResult;
+import org.eclipse.jgit.merge.MergeStrategy;
+import org.eclipse.jgit.merge.Merger;
+import org.eclipse.jgit.merge.ResolveMerger;
+import org.eclipse.jgit.merge.ThreeWayMergeStrategy;
+import org.eclipse.jgit.merge.ThreeWayMerger;
+import org.eclipse.jgit.revwalk.FooterKey;
+import org.eclipse.jgit.revwalk.FooterLine;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevFlag;
+import org.eclipse.jgit.revwalk.RevSort;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.util.TemporaryBuffer;
+
+/**
+ * Utility methods used during the merge process.
+ *
+ * <p><strong>Note:</strong> Unless otherwise specified, the methods in this class <strong>do
+ * not</strong> flush {@link ObjectInserter}s. Callers that want to read back objects before
+ * flushing should use {@link ObjectInserter#newReader()}. This is already the default behavior of
+ * {@code BatchUpdate}.
+ */
+public class MergeUtil {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  static class PluggableCommitMessageGenerator {
+    private final DynamicSet<ChangeMessageModifier> changeMessageModifiers;
+
+    @Inject
+    PluggableCommitMessageGenerator(DynamicSet<ChangeMessageModifier> changeMessageModifiers) {
+      this.changeMessageModifiers = changeMessageModifiers;
+    }
+
+    public String generate(
+        RevCommit original, RevCommit mergeTip, Branch.NameKey dest, String current) {
+      requireNonNull(original.getRawBuffer());
+      if (mergeTip != null) {
+        requireNonNull(mergeTip.getRawBuffer());
+      }
+      for (ChangeMessageModifier changeMessageModifier : changeMessageModifiers) {
+        current = changeMessageModifier.onSubmit(current, original, mergeTip, dest);
+        requireNonNull(
+            current,
+            () ->
+                String.format(
+                    "%s.OnSubmit returned null instead of new commit message",
+                    changeMessageModifier.getClass().getName()));
+      }
+      return current;
+    }
+  }
+
+  private static final String R_HEADS_MASTER = Constants.R_HEADS + Constants.MASTER;
+
+  public static boolean useRecursiveMerge(Config cfg) {
+    return cfg.getBoolean("core", null, "useRecursiveMerge", true);
+  }
+
+  public static ThreeWayMergeStrategy getMergeStrategy(Config cfg) {
+    return useRecursiveMerge(cfg) ? MergeStrategy.RECURSIVE : MergeStrategy.RESOLVE;
+  }
+
+  public interface Factory {
+    MergeUtil create(ProjectState project);
+
+    MergeUtil create(ProjectState project, boolean useContentMerge);
+  }
+
+  private final Provider<ReviewDb> db;
+  private final IdentifiedUser.GenericFactory identifiedUserFactory;
+  private final DynamicItem<UrlFormatter> urlFormatter;
+  private final ApprovalsUtil approvalsUtil;
+  private final ProjectState project;
+  private final boolean useContentMerge;
+  private final boolean useRecursiveMerge;
+  private final PluggableCommitMessageGenerator commitMessageGenerator;
+
+  @AssistedInject
+  MergeUtil(
+      @GerritServerConfig Config serverConfig,
+      Provider<ReviewDb> db,
+      IdentifiedUser.GenericFactory identifiedUserFactory,
+      DynamicItem<UrlFormatter> urlFormatter,
+      ApprovalsUtil approvalsUtil,
+      PluggableCommitMessageGenerator commitMessageGenerator,
+      @Assisted ProjectState project) {
+    this(
+        serverConfig,
+        db,
+        identifiedUserFactory,
+        urlFormatter,
+        approvalsUtil,
+        project,
+        commitMessageGenerator,
+        project.is(BooleanProjectConfig.USE_CONTENT_MERGE));
+  }
+
+  @AssistedInject
+  MergeUtil(
+      @GerritServerConfig Config serverConfig,
+      Provider<ReviewDb> db,
+      IdentifiedUser.GenericFactory identifiedUserFactory,
+      DynamicItem<UrlFormatter> urlFormatter,
+      ApprovalsUtil approvalsUtil,
+      @Assisted ProjectState project,
+      PluggableCommitMessageGenerator commitMessageGenerator,
+      @Assisted boolean useContentMerge) {
+    this.db = db;
+    this.identifiedUserFactory = identifiedUserFactory;
+    this.urlFormatter = urlFormatter;
+    this.approvalsUtil = approvalsUtil;
+    this.project = project;
+    this.useContentMerge = useContentMerge;
+    this.useRecursiveMerge = useRecursiveMerge(serverConfig);
+    this.commitMessageGenerator = commitMessageGenerator;
+  }
+
+  public CodeReviewCommit getFirstFastForward(
+      CodeReviewCommit mergeTip, RevWalk rw, List<CodeReviewCommit> toMerge)
+      throws IntegrationException {
+    for (Iterator<CodeReviewCommit> i = toMerge.iterator(); i.hasNext(); ) {
+      try {
+        final CodeReviewCommit n = i.next();
+        if (mergeTip == null || rw.isMergedInto(mergeTip, n)) {
+          i.remove();
+          return n;
+        }
+      } catch (IOException e) {
+        throw new IntegrationException("Cannot fast-forward test during merge", e);
+      }
+    }
+    return mergeTip;
+  }
+
+  public List<CodeReviewCommit> reduceToMinimalMerge(
+      MergeSorter mergeSorter, Collection<CodeReviewCommit> toSort) throws IntegrationException {
+    List<CodeReviewCommit> result = new ArrayList<>();
+    try {
+      result.addAll(mergeSorter.sort(toSort));
+    } catch (IOException | OrmException e) {
+      throw new IntegrationException("Branch head sorting failed", e);
+    }
+    result.sort(CodeReviewCommit.ORDER);
+    return result;
+  }
+
+  public CodeReviewCommit createCherryPickFromCommit(
+      ObjectInserter inserter,
+      Config repoConfig,
+      RevCommit mergeTip,
+      RevCommit originalCommit,
+      PersonIdent cherryPickCommitterIdent,
+      String commitMsg,
+      CodeReviewRevWalk rw,
+      int parentIndex,
+      boolean ignoreIdenticalTree,
+      boolean allowConflicts)
+      throws MissingObjectException, IncorrectObjectTypeException, IOException,
+          MergeIdenticalTreeException, MergeConflictException, MethodNotAllowedException {
+
+    ThreeWayMerger m = newThreeWayMerger(inserter, repoConfig);
+    m.setBase(originalCommit.getParent(parentIndex));
+
+    DirCache dc = DirCache.newInCore();
+    if (allowConflicts && m instanceof ResolveMerger) {
+      // The DirCache must be set on ResolveMerger before calling
+      // ResolveMerger#merge(AnyObjectId...) otherwise the entries in DirCache don't get populated.
+      ((ResolveMerger) m).setDirCache(dc);
+    }
+
+    ObjectId tree;
+    ImmutableSet<String> filesWithGitConflicts;
+    if (m.merge(mergeTip, originalCommit)) {
+      filesWithGitConflicts = null;
+      tree = m.getResultTreeId();
+      if (tree.equals(mergeTip.getTree()) && !ignoreIdenticalTree) {
+        throw new MergeIdenticalTreeException("identical tree");
+      }
+    } else {
+      if (!allowConflicts) {
+        throw new MergeConflictException("merge conflict");
+      }
+
+      if (!useContentMerge) {
+        // If content merge is disabled we don't have a ResolveMerger and hence cannot merge with
+        // conflict markers.
+        throw new MethodNotAllowedException(
+            "Cherry-pick with allow conflicts requires that content merge is enabled.");
+      }
+
+      // For merging with conflict markers we need a ResolveMerger, double-check that we have one.
+      checkState(m instanceof ResolveMerger, "allow conflicts is not supported");
+      Map<String, MergeResult<? extends Sequence>> mergeResults =
+          ((ResolveMerger) m).getMergeResults();
+
+      filesWithGitConflicts =
+          mergeResults.entrySet().stream()
+              .filter(e -> e.getValue().containsConflicts())
+              .map(Map.Entry::getKey)
+              .collect(toImmutableSet());
+
+      tree =
+          mergeWithConflicts(
+              rw, inserter, dc, "HEAD", mergeTip, "CHANGE", originalCommit, mergeResults);
+    }
+
+    CommitBuilder cherryPickCommit = new CommitBuilder();
+    cherryPickCommit.setTreeId(tree);
+    cherryPickCommit.setParentId(mergeTip);
+    cherryPickCommit.setAuthor(originalCommit.getAuthorIdent());
+    cherryPickCommit.setCommitter(cherryPickCommitterIdent);
+    cherryPickCommit.setMessage(commitMsg);
+    matchAuthorToCommitterDate(project, cherryPickCommit);
+    CodeReviewCommit commit = rw.parseCommit(inserter.insert(cherryPickCommit));
+    commit.setFilesWithGitConflicts(filesWithGitConflicts);
+    return commit;
+  }
+
+  public static ObjectId mergeWithConflicts(
+      RevWalk rw,
+      ObjectInserter ins,
+      DirCache dc,
+      String oursName,
+      RevCommit ours,
+      String theirsName,
+      RevCommit theirs,
+      Map<String, MergeResult<? extends Sequence>> mergeResults)
+      throws IOException {
+    rw.parseBody(ours);
+    rw.parseBody(theirs);
+    String oursMsg = ours.getShortMessage();
+    String theirsMsg = theirs.getShortMessage();
+
+    int nameLength = Math.max(oursName.length(), theirsName.length());
+    String oursNameFormatted =
+        String.format(
+            "%0$-" + nameLength + "s (%s %s)",
+            oursName,
+            ours.abbreviate(6).name(),
+            oursMsg.substring(0, Math.min(oursMsg.length(), 60)));
+    String theirsNameFormatted =
+        String.format(
+            "%0$-" + nameLength + "s (%s %s)",
+            theirsName,
+            theirs.abbreviate(6).name(),
+            theirsMsg.substring(0, Math.min(theirsMsg.length(), 60)));
+
+    MergeFormatter fmt = new MergeFormatter();
+    Map<String, ObjectId> resolved = new HashMap<>();
+    for (Map.Entry<String, MergeResult<? extends Sequence>> entry : mergeResults.entrySet()) {
+      MergeResult<? extends Sequence> p = entry.getValue();
+      try (TemporaryBuffer buf = new TemporaryBuffer.LocalFile(null, 10 * 1024 * 1024)) {
+        fmt.formatMerge(buf, p, "BASE", oursNameFormatted, theirsNameFormatted, UTF_8.name());
+        buf.close();
+
+        try (InputStream in = buf.openInputStream()) {
+          resolved.put(entry.getKey(), ins.insert(Constants.OBJ_BLOB, buf.length(), in));
+        }
+      }
+    }
+
+    DirCacheBuilder builder = dc.builder();
+    int cnt = dc.getEntryCount();
+    for (int i = 0; i < cnt; ) {
+      DirCacheEntry entry = dc.getEntry(i);
+      if (entry.getStage() == 0) {
+        builder.add(entry);
+        i++;
+        continue;
+      }
+
+      int next = dc.nextEntry(i);
+      String path = entry.getPathString();
+      DirCacheEntry res = new DirCacheEntry(path);
+      if (resolved.containsKey(path)) {
+        // For a file with content merge conflict that we produced a result
+        // above on, collapse the file down to a single stage 0 with just
+        // the blob content, and a randomly selected mode (the lowest stage,
+        // which should be the merge base, or ours).
+        res.setFileMode(entry.getFileMode());
+        res.setObjectId(resolved.get(path));
+
+      } else if (next == i + 1) {
+        // If there is exactly one stage present, shouldn't be a conflict...
+        res.setFileMode(entry.getFileMode());
+        res.setObjectId(entry.getObjectId());
+
+      } else if (next == i + 2) {
+        // Two stages suggests a delete/modify conflict. Pick the higher
+        // stage as the automatic result.
+        entry = dc.getEntry(i + 1);
+        res.setFileMode(entry.getFileMode());
+        res.setObjectId(entry.getObjectId());
+
+      } else {
+        // 3 stage conflict, no resolve above
+        // Punt on the 3-stage conflict and show the base, for now.
+        res.setFileMode(entry.getFileMode());
+        res.setObjectId(entry.getObjectId());
+      }
+      builder.add(res);
+      i = next;
+    }
+    builder.finish();
+    return dc.writeTree(ins);
+  }
+
+  public static RevCommit createMergeCommit(
+      ObjectInserter inserter,
+      Config repoConfig,
+      RevCommit mergeTip,
+      RevCommit originalCommit,
+      String mergeStrategy,
+      PersonIdent committerIndent,
+      String commitMsg,
+      RevWalk rw)
+      throws IOException, MergeIdenticalTreeException, MergeConflictException {
+
+    if (!MergeStrategy.THEIRS.getName().equals(mergeStrategy)
+        && rw.isMergedInto(originalCommit, mergeTip)) {
+      throw new ChangeAlreadyMergedException(
+          "'" + originalCommit.getName() + "' has already been merged");
+    }
+
+    Merger m = newMerger(inserter, repoConfig, mergeStrategy);
+    if (m.merge(false, mergeTip, originalCommit)) {
+      ObjectId tree = m.getResultTreeId();
+
+      CommitBuilder mergeCommit = new CommitBuilder();
+      mergeCommit.setTreeId(tree);
+      mergeCommit.setParentIds(mergeTip, originalCommit);
+      mergeCommit.setAuthor(committerIndent);
+      mergeCommit.setCommitter(committerIndent);
+      mergeCommit.setMessage(commitMsg);
+      return rw.parseCommit(inserter.insert(mergeCommit));
+    }
+    List<String> conflicts = ImmutableList.of();
+    if (m instanceof ResolveMerger) {
+      conflicts = ((ResolveMerger) m).getUnmergedPaths();
+    }
+    throw new MergeConflictException(createConflictMessage(conflicts));
+  }
+
+  public static String createConflictMessage(List<String> conflicts) {
+    StringBuilder sb = new StringBuilder("merge conflict(s)");
+    for (String c : conflicts) {
+      sb.append('\n').append(c);
+    }
+    return sb.toString();
+  }
+
+  /**
+   * Adds footers to existing commit message based on the state of the change.
+   *
+   * <p>This adds the following footers if they are missing:
+   *
+   * <ul>
+   *   <li>Reviewed-on: <i>url</i>
+   *   <li>Reviewed-by | Tested-by | <i>Other-Label-Name</i>: <i>reviewer</i>
+   *   <li>Change-Id
+   * </ul>
+   *
+   * @param n
+   * @param notes
+   * @param psId
+   * @return new message
+   */
+  private String createDetailedCommitMessage(RevCommit n, ChangeNotes notes, PatchSet.Id psId) {
+    Change c = notes.getChange();
+    final List<FooterLine> footers = n.getFooterLines();
+    final StringBuilder msgbuf = new StringBuilder();
+    msgbuf.append(n.getFullMessage());
+
+    if (msgbuf.length() == 0) {
+      // WTF, an empty commit message?
+      msgbuf.append("<no commit message provided>");
+    }
+    if (msgbuf.charAt(msgbuf.length() - 1) != '\n') {
+      // Missing a trailing LF? Correct it (perhaps the editor was broken).
+      msgbuf.append('\n');
+    }
+    if (footers.isEmpty()) {
+      // Doesn't end in a "Signed-off-by: ..." style line? Add another line
+      // break to start a new paragraph for the reviewed-by tag lines.
+      //
+      msgbuf.append('\n');
+    }
+
+    if (!contains(footers, FooterConstants.CHANGE_ID, c.getKey().get())) {
+      msgbuf.append(FooterConstants.CHANGE_ID.getName());
+      msgbuf.append(": ");
+      msgbuf.append(c.getKey().get());
+      msgbuf.append('\n');
+    }
+
+    Optional<String> url = urlFormatter.get().getChangeViewUrl(c.getProject(), c.getId());
+    if (url.isPresent()) {
+      if (!contains(footers, FooterConstants.REVIEWED_ON, url.get())) {
+        msgbuf
+            .append(FooterConstants.REVIEWED_ON.getName())
+            .append(": ")
+            .append(url.get())
+            .append('\n');
+      }
+    }
+    PatchSetApproval submitAudit = null;
+
+    for (PatchSetApproval a : safeGetApprovals(notes, psId)) {
+      if (a.getValue() <= 0) {
+        // Negative votes aren't counted.
+        continue;
+      }
+
+      if (a.isLegacySubmit()) {
+        // Submit is treated specially, below (becomes committer)
+        //
+        if (submitAudit == null || a.getGranted().compareTo(submitAudit.getGranted()) > 0) {
+          submitAudit = a;
+        }
+        continue;
+      }
+
+      final Account acc = identifiedUserFactory.create(a.getAccountId()).getAccount();
+      final StringBuilder identbuf = new StringBuilder();
+      if (acc.getFullName() != null && acc.getFullName().length() > 0) {
+        if (identbuf.length() > 0) {
+          identbuf.append(' ');
+        }
+        identbuf.append(acc.getFullName());
+      }
+      if (acc.getPreferredEmail() != null && acc.getPreferredEmail().length() > 0) {
+        if (isSignedOffBy(footers, acc.getPreferredEmail())) {
+          continue;
+        }
+        if (identbuf.length() > 0) {
+          identbuf.append(' ');
+        }
+        identbuf.append('<');
+        identbuf.append(acc.getPreferredEmail());
+        identbuf.append('>');
+      }
+      if (identbuf.length() == 0) {
+        // Nothing reasonable to describe them by? Ignore them.
+        continue;
+      }
+
+      final String tag;
+      if (isCodeReview(a.getLabelId())) {
+        tag = "Reviewed-by";
+      } else if (isVerified(a.getLabelId())) {
+        tag = "Tested-by";
+      } else {
+        final LabelType lt = project.getLabelTypes().byLabel(a.getLabelId());
+        if (lt == null) {
+          continue;
+        }
+        tag = lt.getName();
+      }
+
+      if (!contains(footers, new FooterKey(tag), identbuf.toString())) {
+        msgbuf.append(tag);
+        msgbuf.append(": ");
+        msgbuf.append(identbuf);
+        msgbuf.append('\n');
+      }
+    }
+    return msgbuf.toString();
+  }
+
+  public String createCommitMessageOnSubmit(CodeReviewCommit n, RevCommit mergeTip) {
+    return createCommitMessageOnSubmit(n, mergeTip, n.notes(), n.getPatchsetId());
+  }
+
+  /**
+   * Creates a commit message for a change, which can be customized by plugins.
+   *
+   * <p>By default, adds footers to existing commit message based on the state of the change.
+   * Plugins implementing {@link ChangeMessageModifier} can modify the resulting commit message
+   * arbitrarily.
+   *
+   * @param n
+   * @param mergeTip
+   * @param notes
+   * @param id
+   * @return new message
+   */
+  public String createCommitMessageOnSubmit(
+      RevCommit n, RevCommit mergeTip, ChangeNotes notes, Id id) {
+    return commitMessageGenerator.generate(
+        n, mergeTip, notes.getChange().getDest(), createDetailedCommitMessage(n, notes, id));
+  }
+
+  private static boolean isCodeReview(LabelId id) {
+    return "Code-Review".equalsIgnoreCase(id.get());
+  }
+
+  private static boolean isVerified(LabelId id) {
+    return "Verified".equalsIgnoreCase(id.get());
+  }
+
+  private Iterable<PatchSetApproval> safeGetApprovals(ChangeNotes notes, PatchSet.Id psId) {
+    try {
+      return approvalsUtil.byPatchSet(db.get(), notes, psId, null, null);
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log("Can't read approval records for %s", psId);
+      return Collections.emptyList();
+    }
+  }
+
+  private static boolean contains(List<FooterLine> footers, FooterKey key, String val) {
+    for (FooterLine line : footers) {
+      if (line.matches(key) && val.equals(line.getValue())) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  private static boolean isSignedOffBy(List<FooterLine> footers, String email) {
+    for (FooterLine line : footers) {
+      if (line.matches(FooterKey.SIGNED_OFF_BY) && email.equals(line.getEmailAddress())) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  public boolean canMerge(
+      MergeSorter mergeSorter, Repository repo, CodeReviewCommit mergeTip, CodeReviewCommit toMerge)
+      throws IntegrationException {
+    if (hasMissingDependencies(mergeSorter, toMerge)) {
+      return false;
+    }
+
+    try (ObjectInserter ins = new InMemoryInserter(repo)) {
+      return newThreeWayMerger(ins, repo.getConfig()).merge(new AnyObjectId[] {mergeTip, toMerge});
+    } catch (LargeObjectException e) {
+      logger.atWarning().log("Cannot merge due to LargeObjectException: %s", toMerge.name());
+      return false;
+    } catch (NoMergeBaseException e) {
+      return false;
+    } catch (IOException e) {
+      throw new IntegrationException("Cannot merge " + toMerge.name(), e);
+    }
+  }
+
+  public boolean canFastForward(
+      MergeSorter mergeSorter,
+      CodeReviewCommit mergeTip,
+      CodeReviewRevWalk rw,
+      CodeReviewCommit toMerge)
+      throws IntegrationException {
+    if (hasMissingDependencies(mergeSorter, toMerge)) {
+      return false;
+    }
+
+    try {
+      return mergeTip == null
+          || rw.isMergedInto(mergeTip, toMerge)
+          || rw.isMergedInto(toMerge, mergeTip);
+    } catch (IOException e) {
+      throw new IntegrationException("Cannot fast-forward test during merge", e);
+    }
+  }
+
+  public boolean canCherryPick(
+      MergeSorter mergeSorter,
+      Repository repo,
+      CodeReviewCommit mergeTip,
+      CodeReviewRevWalk rw,
+      CodeReviewCommit toMerge)
+      throws IntegrationException {
+    if (mergeTip == null) {
+      // The branch is unborn. Fast-forward is possible.
+      //
+      return true;
+    }
+
+    if (toMerge.getParentCount() == 0) {
+      // Refuse to merge a root commit into an existing branch,
+      // we cannot obtain a delta for the cherry-pick to apply.
+      //
+      return false;
+    }
+
+    if (toMerge.getParentCount() == 1) {
+      // If there is only one parent, a cherry-pick can be done by
+      // taking the delta relative to that one parent and redoing
+      // that on the current merge tip.
+      //
+      try (ObjectInserter ins = new InMemoryInserter(repo)) {
+        ThreeWayMerger m = newThreeWayMerger(ins, repo.getConfig());
+        m.setBase(toMerge.getParent(0));
+        return m.merge(mergeTip, toMerge);
+      } catch (IOException e) {
+        throw new IntegrationException(
+            String.format(
+                "Cannot merge commit %s with mergetip %s", toMerge.name(), mergeTip.name()),
+            e);
+      }
+    }
+
+    // There are multiple parents, so this is a merge commit. We
+    // don't want to cherry-pick the merge as clients can't easily
+    // rebase their history with that merge present and replaced
+    // by an equivalent merge with a different first parent. So
+    // instead behave as though MERGE_IF_NECESSARY was configured.
+    //
+    return canFastForward(mergeSorter, mergeTip, rw, toMerge)
+        || canMerge(mergeSorter, repo, mergeTip, toMerge);
+  }
+
+  public boolean hasMissingDependencies(MergeSorter mergeSorter, CodeReviewCommit toMerge)
+      throws IntegrationException {
+    try {
+      return !mergeSorter.sort(Collections.singleton(toMerge)).contains(toMerge);
+    } catch (IOException | OrmException e) {
+      throw new IntegrationException("Branch head sorting failed", e);
+    }
+  }
+
+  public CodeReviewCommit mergeOneCommit(
+      PersonIdent author,
+      PersonIdent committer,
+      CodeReviewRevWalk rw,
+      ObjectInserter inserter,
+      Config repoConfig,
+      Branch.NameKey destBranch,
+      CodeReviewCommit mergeTip,
+      CodeReviewCommit n)
+      throws IntegrationException {
+    ThreeWayMerger m = newThreeWayMerger(inserter, repoConfig);
+    try {
+      if (m.merge(new AnyObjectId[] {mergeTip, n})) {
+        return writeMergeCommit(
+            author, committer, rw, inserter, destBranch, mergeTip, m.getResultTreeId(), n);
+      }
+      failed(rw, mergeTip, n, CommitMergeStatus.PATH_CONFLICT);
+    } catch (NoMergeBaseException e) {
+      try {
+        failed(rw, mergeTip, n, getCommitMergeStatus(e.getReason()));
+      } catch (IOException e2) {
+        throw new IntegrationException("Cannot merge " + n.name(), e);
+      }
+    } catch (IOException e) {
+      throw new IntegrationException("Cannot merge " + n.name(), e);
+    }
+    return mergeTip;
+  }
+
+  private static CommitMergeStatus getCommitMergeStatus(MergeBaseFailureReason reason) {
+    switch (reason) {
+      case MULTIPLE_MERGE_BASES_NOT_SUPPORTED:
+      case TOO_MANY_MERGE_BASES:
+      default:
+        return CommitMergeStatus.MANUAL_RECURSIVE_MERGE;
+      case CONFLICTS_DURING_MERGE_BASE_CALCULATION:
+        return CommitMergeStatus.PATH_CONFLICT;
+    }
+  }
+
+  private static CodeReviewCommit failed(
+      CodeReviewRevWalk rw,
+      CodeReviewCommit mergeTip,
+      CodeReviewCommit n,
+      CommitMergeStatus failure)
+      throws MissingObjectException, IncorrectObjectTypeException, IOException {
+    rw.reset();
+    rw.markStart(n);
+    rw.markUninteresting(mergeTip);
+    CodeReviewCommit failed;
+    while ((failed = rw.next()) != null) {
+      failed.setStatusCode(failure);
+    }
+    return failed;
+  }
+
+  public CodeReviewCommit writeMergeCommit(
+      PersonIdent author,
+      PersonIdent committer,
+      CodeReviewRevWalk rw,
+      ObjectInserter inserter,
+      Branch.NameKey destBranch,
+      CodeReviewCommit mergeTip,
+      ObjectId treeId,
+      CodeReviewCommit n)
+      throws IOException, MissingObjectException, IncorrectObjectTypeException {
+    final List<CodeReviewCommit> merged = new ArrayList<>();
+    rw.reset();
+    rw.markStart(n);
+    rw.markUninteresting(mergeTip);
+    CodeReviewCommit crc;
+    while ((crc = rw.next()) != null) {
+      if (crc.getPatchsetId() != null) {
+        merged.add(crc);
+      }
+    }
+
+    StringBuilder msgbuf = new StringBuilder().append(summarize(rw, merged));
+    if (!R_HEADS_MASTER.equals(destBranch.get())) {
+      msgbuf.append(" into ");
+      msgbuf.append(destBranch.getShortName());
+    }
+
+    if (merged.size() > 1) {
+      msgbuf.append("\n\n* changes:\n");
+      for (CodeReviewCommit c : merged) {
+        rw.parseBody(c);
+        msgbuf.append("  ");
+        msgbuf.append(c.getShortMessage());
+        msgbuf.append("\n");
+      }
+    }
+
+    final CommitBuilder mergeCommit = new CommitBuilder();
+    mergeCommit.setTreeId(treeId);
+    mergeCommit.setParentIds(mergeTip, n);
+    mergeCommit.setAuthor(author);
+    mergeCommit.setCommitter(committer);
+    mergeCommit.setMessage(msgbuf.toString());
+
+    CodeReviewCommit mergeResult = rw.parseCommit(inserter.insert(mergeCommit));
+    mergeResult.setNotes(n.getNotes());
+    return mergeResult;
+  }
+
+  private String summarize(RevWalk rw, List<CodeReviewCommit> merged) throws IOException {
+    if (merged.size() == 1) {
+      CodeReviewCommit c = merged.get(0);
+      rw.parseBody(c);
+      return String.format("Merge \"%s\"", c.getShortMessage());
+    }
+
+    LinkedHashSet<String> topics = new LinkedHashSet<>(4);
+    for (CodeReviewCommit c : merged) {
+      if (!Strings.isNullOrEmpty(c.change().getTopic())) {
+        topics.add(c.change().getTopic());
+      }
+    }
+
+    if (topics.size() == 1) {
+      return String.format("Merge changes from topic \"%s\"", Iterables.getFirst(topics, null));
+    } else if (topics.size() > 1) {
+      return String.format("Merge changes from topics \"%s\"", Joiner.on("\", \"").join(topics));
+    } else {
+      return String.format(
+          "Merge changes %s%s",
+          FluentIterable.from(merged)
+              .limit(5)
+              .transform(c -> c.change().getKey().abbreviate())
+              .join(Joiner.on(',')),
+          merged.size() > 5 ? ", ..." : "");
+    }
+  }
+
+  public ThreeWayMerger newThreeWayMerger(ObjectInserter inserter, Config repoConfig) {
+    return newThreeWayMerger(inserter, repoConfig, mergeStrategyName());
+  }
+
+  public String mergeStrategyName() {
+    return mergeStrategyName(useContentMerge, useRecursiveMerge);
+  }
+
+  public static String mergeStrategyName(boolean useContentMerge, boolean useRecursiveMerge) {
+    if (useContentMerge) {
+      // Settings for this project allow us to try and automatically resolve
+      // conflicts within files if needed. Use either the old resolve merger or
+      // new recursive merger, and instruct to operate in core.
+      if (useRecursiveMerge) {
+        return MergeStrategy.RECURSIVE.getName();
+      }
+      return MergeStrategy.RESOLVE.getName();
+    }
+    // No auto conflict resolving allowed. If any of the
+    // affected files was modified, merge will fail.
+    return MergeStrategy.SIMPLE_TWO_WAY_IN_CORE.getName();
+  }
+
+  public static ThreeWayMerger newThreeWayMerger(
+      ObjectInserter inserter, Config repoConfig, String strategyName) {
+    Merger m = newMerger(inserter, repoConfig, strategyName);
+    checkArgument(
+        m instanceof ThreeWayMerger,
+        "merge strategy %s does not support three-way merging",
+        strategyName);
+    return (ThreeWayMerger) m;
+  }
+
+  public static Merger newMerger(ObjectInserter inserter, Config repoConfig, String strategyName) {
+    MergeStrategy strategy = MergeStrategy.get(strategyName);
+    checkArgument(strategy != null, "invalid merge strategy: %s", strategyName);
+    return strategy.newMerger(
+        new ObjectInserter.Filter() {
+          @Override
+          protected ObjectInserter delegate() {
+            return inserter;
+          }
+
+          @Override
+          public void flush() {}
+
+          @Override
+          public void close() {}
+        },
+        repoConfig);
+  }
+
+  public void markCleanMerges(
+      RevWalk rw, RevFlag canMergeFlag, CodeReviewCommit mergeTip, Set<RevCommit> alreadyAccepted)
+      throws IntegrationException {
+    if (mergeTip == null) {
+      // If mergeTip is null here, branchTip was null, indicating a new branch
+      // at the start of the merge process. We also elected to merge nothing,
+      // probably due to missing dependencies. Nothing was cleanly merged.
+      //
+      return;
+    }
+
+    try {
+      rw.resetRetain(canMergeFlag);
+      rw.sort(RevSort.TOPO);
+      rw.sort(RevSort.REVERSE, true);
+      rw.markStart(mergeTip);
+      for (RevCommit c : alreadyAccepted) {
+        // If branch was not created by this submit.
+        if (!Objects.equals(c, mergeTip)) {
+          rw.markUninteresting(c);
+        }
+      }
+
+      CodeReviewCommit c;
+      while ((c = (CodeReviewCommit) rw.next()) != null) {
+        if (c.getPatchsetId() != null && c.getStatusCode() == null) {
+          c.setStatusCode(CommitMergeStatus.CLEAN_MERGE);
+        }
+      }
+    } catch (IOException e) {
+      throw new IntegrationException("Cannot mark clean merges", e);
+    }
+  }
+
+  public Set<Change.Id> findUnmergedChanges(
+      Set<Change.Id> expected,
+      CodeReviewRevWalk rw,
+      RevFlag canMergeFlag,
+      CodeReviewCommit oldTip,
+      CodeReviewCommit mergeTip,
+      Iterable<Change.Id> alreadyMerged)
+      throws IntegrationException {
+    if (mergeTip == null) {
+      return expected;
+    }
+
+    try {
+      Set<Change.Id> found = Sets.newHashSetWithExpectedSize(expected.size());
+      Iterables.addAll(found, alreadyMerged);
+      rw.resetRetain(canMergeFlag);
+      rw.sort(RevSort.TOPO);
+      rw.markStart(mergeTip);
+      if (oldTip != null) {
+        rw.markUninteresting(oldTip);
+      }
+
+      CodeReviewCommit c;
+      while ((c = rw.next()) != null) {
+        if (c.getPatchsetId() == null) {
+          continue;
+        }
+        Change.Id id = c.getPatchsetId().getParentKey();
+        if (!expected.contains(id)) {
+          continue;
+        }
+        found.add(id);
+        if (found.size() == expected.size()) {
+          return Collections.emptySet();
+        }
+      }
+      return Sets.difference(expected, found);
+    } catch (IOException e) {
+      throw new IntegrationException("Cannot check if changes were merged", e);
+    }
+  }
+
+  public static CodeReviewCommit findAnyMergedInto(
+      CodeReviewRevWalk rw, Iterable<CodeReviewCommit> commits, CodeReviewCommit tip)
+      throws IOException {
+    for (CodeReviewCommit c : commits) {
+      // TODO(dborowitz): Seems like this could get expensive for many patch
+      // sets. Is there a more efficient implementation?
+      if (rw.isMergedInto(c, tip)) {
+        return c;
+      }
+    }
+    return null;
+  }
+
+  public static RevCommit resolveCommit(Repository repo, RevWalk rw, String str)
+      throws BadRequestException, ResourceNotFoundException, IOException {
+    try {
+      ObjectId commitId = repo.resolve(str);
+      if (commitId == null) {
+        throw new BadRequestException("Cannot resolve '" + str + "' to a commit");
+      }
+      return rw.parseCommit(commitId);
+    } catch (AmbiguousObjectException | IncorrectObjectTypeException | RevisionSyntaxException e) {
+      throw new BadRequestException(e.getMessage());
+    } catch (MissingObjectException e) {
+      throw new ResourceNotFoundException(e.getMessage());
+    }
+  }
+
+  private static void matchAuthorToCommitterDate(ProjectState project, CommitBuilder commit) {
+    if (project.is(BooleanProjectConfig.MATCH_AUTHOR_TO_COMMITTER_DATE)) {
+      commit.setAuthor(
+          new PersonIdent(
+              commit.getAuthor(),
+              commit.getCommitter().getWhen(),
+              commit.getCommitter().getTimeZone()));
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/git/MergedByPushOp.java b/java/com/google/gerrit/server/git/MergedByPushOp.java
new file mode 100644
index 0000000..b3a1d72
--- /dev/null
+++ b/java/com/google/gerrit/server/git/MergedByPushOp.java
@@ -0,0 +1,205 @@
+// 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.
+
+package com.google.gerrit.server.git;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.LabelId;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.client.PatchSetInfo;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.config.SendEmailExecutor;
+import com.google.gerrit.server.extensions.events.ChangeMerged;
+import com.google.gerrit.server.mail.send.MergedSender;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.server.patch.PatchSetInfoFactory;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.Context;
+import com.google.gerrit.server.util.RequestScopePropagator;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+public class MergedByPushOp implements BatchUpdateOp {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public interface Factory {
+    MergedByPushOp create(
+        RequestScopePropagator requestScopePropagator, PatchSet.Id psId, String refName);
+  }
+
+  private final RequestScopePropagator requestScopePropagator;
+  private final PatchSetInfoFactory patchSetInfoFactory;
+  private final ChangeMessagesUtil cmUtil;
+  private final MergedSender.Factory mergedSenderFactory;
+  private final PatchSetUtil psUtil;
+  private final ExecutorService sendEmailExecutor;
+  private final ChangeMerged changeMerged;
+
+  private final PatchSet.Id psId;
+  private final String refName;
+
+  private Change change;
+  private boolean correctBranch;
+  private Provider<PatchSet> patchSetProvider;
+  private PatchSet patchSet;
+  private PatchSetInfo info;
+
+  @Inject
+  MergedByPushOp(
+      PatchSetInfoFactory patchSetInfoFactory,
+      ChangeMessagesUtil cmUtil,
+      MergedSender.Factory mergedSenderFactory,
+      PatchSetUtil psUtil,
+      @SendEmailExecutor ExecutorService sendEmailExecutor,
+      ChangeMerged changeMerged,
+      @Assisted RequestScopePropagator requestScopePropagator,
+      @Assisted PatchSet.Id psId,
+      @Assisted String refName) {
+    this.patchSetInfoFactory = patchSetInfoFactory;
+    this.cmUtil = cmUtil;
+    this.mergedSenderFactory = mergedSenderFactory;
+    this.psUtil = psUtil;
+    this.sendEmailExecutor = sendEmailExecutor;
+    this.changeMerged = changeMerged;
+    this.requestScopePropagator = requestScopePropagator;
+    this.psId = psId;
+    this.refName = refName;
+  }
+
+  public String getMergedIntoRef() {
+    return refName;
+  }
+
+  public MergedByPushOp setPatchSetProvider(Provider<PatchSet> patchSetProvider) {
+    this.patchSetProvider = requireNonNull(patchSetProvider);
+    return this;
+  }
+
+  @Override
+  public boolean updateChange(ChangeContext ctx) throws OrmException, IOException {
+    change = ctx.getChange();
+    correctBranch = refName.equals(change.getDest().get());
+    if (!correctBranch) {
+      return false;
+    }
+
+    if (patchSetProvider != null) {
+      // Caller might have also arranged for construction of a new patch set
+      // that is not present in the old notes so we can't use PatchSetUtil.
+      patchSet = patchSetProvider.get();
+    } else {
+      patchSet =
+          requireNonNull(
+              psUtil.get(ctx.getDb(), ctx.getNotes(), psId),
+              () -> String.format("patch set %s not found", psId));
+    }
+    info = getPatchSetInfo(ctx);
+
+    ChangeUpdate update = ctx.getUpdate(psId);
+    Change.Status status = change.getStatus();
+    if (status == Change.Status.MERGED) {
+      return true;
+    }
+    change.setCurrentPatchSet(info);
+    change.setStatus(Change.Status.MERGED);
+    // we cannot reconstruct the submit records for when this change was
+    // submitted, this is why we must fix the status
+    update.fixStatus(Change.Status.MERGED);
+    update.setCurrentPatchSet();
+    StringBuilder msgBuf = new StringBuilder();
+    msgBuf.append("Change has been successfully pushed");
+    if (!refName.equals(change.getDest().get())) {
+      msgBuf.append(" into ");
+      if (refName.startsWith(Constants.R_HEADS)) {
+        msgBuf.append("branch ");
+        msgBuf.append(Repository.shortenRefName(refName));
+      } else {
+        msgBuf.append(refName);
+      }
+    }
+    msgBuf.append(".");
+    ChangeMessage msg =
+        ChangeMessagesUtil.newMessage(
+            psId, ctx.getUser(), ctx.getWhen(), msgBuf.toString(), ChangeMessagesUtil.TAG_MERGED);
+    cmUtil.addChangeMessage(ctx.getDb(), update, msg);
+
+    PatchSetApproval submitter =
+        ApprovalsUtil.newApproval(
+            change.currentPatchSetId(), ctx.getUser(), LabelId.legacySubmit(), 1, ctx.getWhen());
+    update.putApproval(submitter.getLabel(), submitter.getValue());
+    ctx.getDb().patchSetApprovals().upsert(Collections.singleton(submitter));
+
+    return true;
+  }
+
+  @Override
+  public void postUpdate(Context ctx) {
+    if (!correctBranch) {
+      return;
+    }
+    @SuppressWarnings("unused") // Runnable already handles errors
+    Future<?> possiblyIgnoredError =
+        sendEmailExecutor.submit(
+            requestScopePropagator.wrap(
+                new Runnable() {
+                  @Override
+                  public void run() {
+                    try {
+                      MergedSender cm =
+                          mergedSenderFactory.create(ctx.getProject(), psId.getParentKey());
+                      cm.setFrom(ctx.getAccountId());
+                      cm.setPatchSet(patchSet, info);
+                      cm.send();
+                    } catch (Exception e) {
+                      logger.atSevere().withCause(e).log(
+                          "Cannot send email for submitted patch set %s", psId);
+                    }
+                  }
+
+                  @Override
+                  public String toString() {
+                    return "send-email merged";
+                  }
+                }));
+
+    changeMerged.fire(
+        change, patchSet, ctx.getAccount(), patchSet.getRevision().get(), ctx.getWhen());
+  }
+
+  private PatchSetInfo getPatchSetInfo(ChangeContext ctx) throws IOException, OrmException {
+    RevWalk rw = ctx.getRevWalk();
+    RevCommit commit =
+        rw.parseCommit(ObjectId.fromString(requireNonNull(patchSet).getRevision().get()));
+    return patchSetInfoFactory.get(rw, commit, psId);
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MultiBaseLocalDiskRepositoryManager.java b/java/com/google/gerrit/server/git/MultiBaseLocalDiskRepositoryManager.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/MultiBaseLocalDiskRepositoryManager.java
rename to java/com/google/gerrit/server/git/MultiBaseLocalDiskRepositoryManager.java
diff --git a/java/com/google/gerrit/server/git/MultiProgressMonitor.java b/java/com/google/gerrit/server/git/MultiProgressMonitor.java
new file mode 100644
index 0000000..b72ea92
--- /dev/null
+++ b/java/com/google/gerrit/server/git/MultiProgressMonitor.java
@@ -0,0 +1,353 @@
+// Copyright (C) 2012 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.google.gerrit.server.git;
+
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+
+import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.List;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ProgressMonitor;
+
+/**
+ * Progress reporting interface that multiplexes multiple sub-tasks.
+ *
+ * <p>Output is of the format:
+ *
+ * <pre>
+ *   Task: subA: 1, subB: 75% (3/4) (-)\r
+ *   Task: subA: 2, subB: 75% (3/4), subC: 1 (\)\r
+ *   Task: subA: 2, subB: 100% (4/4), subC: 1 (|)\r
+ *   Task: subA: 4, subB: 100% (4/4), subC: 4, done    \n
+ * </pre>
+ *
+ * <p>Callers should try to keep task and sub-task descriptions short, since the output should fit
+ * on one terminal line. (Note that git clients do not accept terminal control characters, so true
+ * multi-line progress messages would be impossible.)
+ */
+public class MultiProgressMonitor {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  /** Constant indicating the total work units cannot be predicted. */
+  public static final int UNKNOWN = 0;
+
+  private static final char[] SPINNER_STATES = new char[] {'-', '\\', '|', '/'};
+  private static final char NO_SPINNER = ' ';
+
+  /** Handle for a sub-task. */
+  public class Task implements ProgressMonitor {
+    private final String name;
+    private final int total;
+    private int count;
+    private int lastPercent;
+
+    Task(String subTaskName, int totalWork) {
+      this.name = subTaskName;
+      this.total = totalWork;
+    }
+
+    /**
+     * Indicate that work has been completed on this sub-task.
+     *
+     * <p>Must be called from a worker thread.
+     *
+     * @param completed number of work units completed.
+     */
+    @Override
+    public void update(int completed) {
+      boolean w = false;
+      synchronized (MultiProgressMonitor.this) {
+        count += completed;
+        if (total != UNKNOWN) {
+          int percent = count * 100 / total;
+          if (percent > lastPercent) {
+            lastPercent = percent;
+            w = true;
+          }
+        }
+      }
+      if (w) {
+        wakeUp();
+      }
+    }
+
+    /**
+     * Indicate that this sub-task is finished.
+     *
+     * <p>Must be called from a worker thread.
+     */
+    public void end() {
+      if (total == UNKNOWN && getCount() > 0) {
+        wakeUp();
+      }
+    }
+
+    @Override
+    public void start(int totalTasks) {}
+
+    @Override
+    public void beginTask(String title, int totalWork) {}
+
+    @Override
+    public void endTask() {}
+
+    @Override
+    public boolean isCancelled() {
+      return false;
+    }
+
+    public int getCount() {
+      synchronized (MultiProgressMonitor.this) {
+        return count;
+      }
+    }
+  }
+
+  private final OutputStream out;
+  private final String taskName;
+  private final List<Task> tasks = new CopyOnWriteArrayList<>();
+  private int spinnerIndex;
+  private char spinnerState = NO_SPINNER;
+  private boolean done;
+  private boolean write = true;
+
+  private final long maxIntervalNanos;
+
+  /**
+   * Create a new progress monitor for multiple sub-tasks.
+   *
+   * @param out stream for writing progress messages.
+   * @param taskName name of the overall task.
+   */
+  public MultiProgressMonitor(OutputStream out, String taskName) {
+    this(out, taskName, 500, TimeUnit.MILLISECONDS);
+  }
+
+  /**
+   * Create a new progress monitor for multiple sub-tasks.
+   *
+   * @param out stream for writing progress messages.
+   * @param taskName name of the overall task.
+   * @param maxIntervalTime maximum interval between progress messages.
+   * @param maxIntervalUnit time unit for progress interval.
+   */
+  public MultiProgressMonitor(
+      OutputStream out, String taskName, long maxIntervalTime, TimeUnit maxIntervalUnit) {
+    this.out = out;
+    this.taskName = taskName;
+    maxIntervalNanos = NANOSECONDS.convert(maxIntervalTime, maxIntervalUnit);
+  }
+
+  /**
+   * Wait for a task managed by a {@link Future}, with no timeout.
+   *
+   * @see #waitFor(Future, long, TimeUnit)
+   */
+  public void waitFor(Future<?> workerFuture) throws ExecutionException {
+    waitFor(workerFuture, 0, null);
+  }
+
+  /**
+   * Wait for a task managed by a {@link Future}.
+   *
+   * <p>Must be called from the main thread, <em>not</em> a worker thread. Once a worker thread
+   * calls {@link #end()}, the future has an additional {@code maxInterval} to finish before it is
+   * forcefully cancelled and {@link ExecutionException} is thrown.
+   *
+   * @param workerFuture a future that returns when worker threads are finished.
+   * @param timeoutTime overall timeout for the task; the future is forcefully cancelled if the task
+   *     exceeds the timeout. Non-positive values indicate no timeout.
+   * @param timeoutUnit unit for overall task timeout.
+   * @throws ExecutionException if this thread or a worker thread was interrupted, the worker was
+   *     cancelled, or timed out waiting for a worker to call {@link #end()}.
+   */
+  public void waitFor(Future<?> workerFuture, long timeoutTime, TimeUnit timeoutUnit)
+      throws ExecutionException {
+    long overallStart = System.nanoTime();
+    long deadline;
+    String detailMessage = "";
+    if (timeoutTime > 0) {
+      deadline = overallStart + NANOSECONDS.convert(timeoutTime, timeoutUnit);
+    } else {
+      deadline = 0;
+    }
+
+    synchronized (this) {
+      long left = maxIntervalNanos;
+      while (!done) {
+        long start = System.nanoTime();
+        try {
+          NANOSECONDS.timedWait(this, left);
+        } catch (InterruptedException e) {
+          throw new ExecutionException(e);
+        }
+
+        // Send an update on every wakeup (manual or spurious), but only move
+        // the spinner every maxInterval.
+        long now = System.nanoTime();
+
+        if (deadline > 0 && now > deadline) {
+          workerFuture.cancel(true);
+          if (workerFuture.isCancelled()) {
+            detailMessage =
+                String.format(
+                    "(timeout %sms, cancelled)",
+                    TimeUnit.MILLISECONDS.convert(now - deadline, NANOSECONDS));
+            logger.atWarning().log(
+                "MultiProgressMonitor worker killed after %sms: %s",
+                TimeUnit.MILLISECONDS.convert(now - overallStart, NANOSECONDS), detailMessage);
+          }
+          break;
+        }
+
+        left -= now - start;
+        if (left <= 0) {
+          moveSpinner();
+          left = maxIntervalNanos;
+        }
+        sendUpdate();
+        if (!done && workerFuture.isDone()) {
+          // The worker may not have called end() explicitly, which is likely a
+          // programming error.
+          logger.atWarning().log("MultiProgressMonitor worker did not call end() before returning");
+          end();
+        }
+      }
+      sendDone();
+    }
+
+    // The loop exits as soon as the worker calls end(), but we give it another
+    // maxInterval to finish up and return.
+    try {
+      workerFuture.get(maxIntervalNanos, NANOSECONDS);
+    } catch (InterruptedException e) {
+      throw new ExecutionException(e);
+    } catch (CancellationException e) {
+      throw new ExecutionException(detailMessage, e);
+    } catch (TimeoutException e) {
+      workerFuture.cancel(true);
+      throw new ExecutionException(e);
+    }
+  }
+
+  private synchronized void wakeUp() {
+    notifyAll();
+  }
+
+  /**
+   * Begin a sub-task.
+   *
+   * @param subTask sub-task name.
+   * @param subTaskWork total work units in sub-task, or {@link #UNKNOWN}.
+   * @return sub-task handle.
+   */
+  public Task beginSubTask(String subTask, int subTaskWork) {
+    Task task = new Task(subTask, subTaskWork);
+    tasks.add(task);
+    return task;
+  }
+
+  /**
+   * End the overall task.
+   *
+   * <p>Must be called from a worker thread.
+   */
+  public synchronized void end() {
+    done = true;
+    wakeUp();
+  }
+
+  private void sendDone() {
+    spinnerState = NO_SPINNER;
+    StringBuilder s = format();
+    boolean any = false;
+    for (Task t : tasks) {
+      if (t.count != 0) {
+        any = true;
+        break;
+      }
+    }
+    if (any) {
+      s.append(",");
+    }
+    s.append(" done    \n");
+    send(s);
+  }
+
+  private void moveSpinner() {
+    spinnerIndex = (spinnerIndex + 1) % SPINNER_STATES.length;
+    spinnerState = SPINNER_STATES[spinnerIndex];
+  }
+
+  private void sendUpdate() {
+    send(format());
+  }
+
+  private StringBuilder format() {
+    StringBuilder s = new StringBuilder().append("\r").append(taskName).append(':');
+
+    if (!tasks.isEmpty()) {
+      boolean first = true;
+      for (Task t : tasks) {
+        int count = t.getCount();
+        if (count == 0) {
+          continue;
+        }
+
+        if (!first) {
+          s.append(',');
+        } else {
+          first = false;
+        }
+
+        s.append(' ');
+        if (!Strings.isNullOrEmpty(t.name)) {
+          s.append(t.name).append(": ");
+        }
+        if (t.total == UNKNOWN) {
+          s.append(count);
+        } else {
+          s.append(String.format("%d%% (%d/%d)", count * 100 / t.total, count, t.total));
+        }
+      }
+    }
+
+    if (spinnerState != NO_SPINNER) {
+      // Don't output a spinner until the alarm fires for the first time.
+      s.append(" (").append(spinnerState).append(')');
+    }
+    return s;
+  }
+
+  private void send(StringBuilder s) {
+    if (write) {
+      try {
+        out.write(Constants.encode(s.toString()));
+        out.flush();
+      } catch (IOException e) {
+        write = false;
+      }
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/NotesBranchUtil.java b/java/com/google/gerrit/server/git/NotesBranchUtil.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/NotesBranchUtil.java
rename to java/com/google/gerrit/server/git/NotesBranchUtil.java
diff --git a/java/com/google/gerrit/server/git/NotifyConfig.java b/java/com/google/gerrit/server/git/NotifyConfig.java
new file mode 100644
index 0000000..d39cf12
--- /dev/null
+++ b/java/com/google/gerrit/server/git/NotifyConfig.java
@@ -0,0 +1,118 @@
+// Copyright (C) 2012 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.google.gerrit.server.git;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import java.util.EnumSet;
+import java.util.HashSet;
+import java.util.Set;
+
+public class NotifyConfig implements Comparable<NotifyConfig> {
+  public enum Header {
+    TO,
+    CC,
+    BCC
+  }
+
+  private String name;
+  private EnumSet<NotifyType> types = EnumSet.of(NotifyType.ALL);
+  private String filter;
+
+  private Header header;
+  private Set<GroupReference> groups = new HashSet<>();
+  private Set<Address> addresses = new HashSet<>();
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public boolean isNotify(NotifyType type) {
+    return types.contains(type) || types.contains(NotifyType.ALL);
+  }
+
+  public EnumSet<NotifyType> getNotify() {
+    return types;
+  }
+
+  public void setTypes(EnumSet<NotifyType> newTypes) {
+    types = EnumSet.copyOf(newTypes);
+  }
+
+  public String getFilter() {
+    return filter;
+  }
+
+  public void setFilter(String filter) {
+    if ("*".equals(filter)) {
+      this.filter = null;
+    } else {
+      this.filter = Strings.emptyToNull(filter);
+    }
+  }
+
+  public Header getHeader() {
+    return header;
+  }
+
+  public void setHeader(Header hdr) {
+    header = hdr;
+  }
+
+  public Set<GroupReference> getGroups() {
+    return groups;
+  }
+
+  public Set<Address> getAddresses() {
+    return addresses;
+  }
+
+  public void addEmail(GroupReference group) {
+    groups.add(group);
+  }
+
+  public void addEmail(Address address) {
+    addresses.add(address);
+  }
+
+  @Override
+  public int compareTo(NotifyConfig o) {
+    return name.compareTo(o.name);
+  }
+
+  @Override
+  public int hashCode() {
+    return name.hashCode();
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (obj instanceof NotifyConfig) {
+      return compareTo((NotifyConfig) obj) == 0;
+    }
+    return false;
+  }
+
+  @Override
+  public String toString() {
+    return "NotifyConfig[" + name + " = " + addresses + " + " + groups + "]";
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/PerThreadRequestScope.java b/java/com/google/gerrit/server/git/PerThreadRequestScope.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/PerThreadRequestScope.java
rename to java/com/google/gerrit/server/git/PerThreadRequestScope.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectRunnable.java b/java/com/google/gerrit/server/git/ProjectRunnable.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectRunnable.java
rename to java/com/google/gerrit/server/git/ProjectRunnable.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/QueueProvider.java b/java/com/google/gerrit/server/git/QueueProvider.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/QueueProvider.java
rename to java/com/google/gerrit/server/git/QueueProvider.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceivePackInitializer.java b/java/com/google/gerrit/server/git/ReceivePackInitializer.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/ReceivePackInitializer.java
rename to java/com/google/gerrit/server/git/ReceivePackInitializer.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/RefCache.java b/java/com/google/gerrit/server/git/RefCache.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/RefCache.java
rename to java/com/google/gerrit/server/git/RefCache.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/RepoRefCache.java b/java/com/google/gerrit/server/git/RepoRefCache.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/RepoRefCache.java
rename to java/com/google/gerrit/server/git/RepoRefCache.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/RepositoryCaseMismatchException.java b/java/com/google/gerrit/server/git/RepositoryCaseMismatchException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/RepositoryCaseMismatchException.java
rename to java/com/google/gerrit/server/git/RepositoryCaseMismatchException.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReviewNoteMerger.java b/java/com/google/gerrit/server/git/ReviewNoteMerger.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/ReviewNoteMerger.java
rename to java/com/google/gerrit/server/git/ReviewNoteMerger.java
diff --git a/java/com/google/gerrit/server/git/SearchingChangeCacheImpl.java b/java/com/google/gerrit/server/git/SearchingChangeCacheImpl.java
new file mode 100644
index 0000000..d5e19cc
--- /dev/null
+++ b/java/com/google/gerrit/server/git/SearchingChangeCacheImpl.java
@@ -0,0 +1,165 @@
+// Copyright (C) 2012 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.google.gerrit.server.git;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ReviewerSet;
+import com.google.gerrit.server.cache.CacheModule;
+import com.google.gerrit.server.index.change.ChangeField;
+import com.google.gerrit.server.logging.TraceContext;
+import com.google.gerrit.server.logging.TraceContext.TraceTimer;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gerrit.server.util.ManualRequestContext;
+import com.google.gerrit.server.util.OneOffRequestContext;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import com.google.inject.TypeLiteral;
+import com.google.inject.name.Named;
+import com.google.inject.util.Providers;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+
+@Singleton
+public class SearchingChangeCacheImpl implements GitReferenceUpdatedListener {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  static final String ID_CACHE = "changes";
+
+  public static class Module extends CacheModule {
+    private final boolean slave;
+
+    public Module() {
+      this(false);
+    }
+
+    public Module(boolean slave) {
+      this.slave = slave;
+    }
+
+    @Override
+    protected void configure() {
+      if (slave) {
+        bind(SearchingChangeCacheImpl.class)
+            .toProvider(Providers.<SearchingChangeCacheImpl>of(null));
+      } else {
+        cache(ID_CACHE, Project.NameKey.class, new TypeLiteral<List<CachedChange>>() {})
+            .maximumWeight(0)
+            .loader(Loader.class);
+
+        bind(SearchingChangeCacheImpl.class);
+        DynamicSet.bind(binder(), GitReferenceUpdatedListener.class)
+            .to(SearchingChangeCacheImpl.class);
+      }
+    }
+  }
+
+  @AutoValue
+  abstract static class CachedChange {
+    // Subset of fields in ChangeData, specifically fields needed to serve
+    // VisibleRefFilter without touching the database. More can be added as
+    // necessary.
+    abstract Change change();
+
+    @Nullable
+    abstract ReviewerSet reviewers();
+  }
+
+  private final LoadingCache<Project.NameKey, List<CachedChange>> cache;
+  private final ChangeData.Factory changeDataFactory;
+
+  @Inject
+  SearchingChangeCacheImpl(
+      @Named(ID_CACHE) LoadingCache<Project.NameKey, List<CachedChange>> cache,
+      ChangeData.Factory changeDataFactory) {
+    this.cache = cache;
+    this.changeDataFactory = changeDataFactory;
+  }
+
+  /**
+   * Read changes for the project from the secondary index.
+   *
+   * <p>Returned changes only include the {@code Change} object (with id, branch) and the reviewers.
+   * Additional stored fields are not loaded from the index.
+   *
+   * @param db database handle to populate missing change data (probably unused).
+   * @param project project to read.
+   * @return list of known changes; empty if no changes.
+   */
+  public List<ChangeData> getChangeData(ReviewDb db, Project.NameKey project) {
+    try {
+      List<CachedChange> cached = cache.get(project);
+      List<ChangeData> cds = new ArrayList<>(cached.size());
+      for (CachedChange cc : cached) {
+        ChangeData cd = changeDataFactory.create(db, cc.change());
+        cd.setReviewers(cc.reviewers());
+        cds.add(cd);
+      }
+      return Collections.unmodifiableList(cds);
+    } catch (ExecutionException e) {
+      logger.atWarning().withCause(e).log("Cannot fetch changes for %s", project);
+      return Collections.emptyList();
+    }
+  }
+
+  @Override
+  public void onGitReferenceUpdated(GitReferenceUpdatedListener.Event event) {
+    if (event.getRefName().startsWith(RefNames.REFS_CHANGES)) {
+      cache.invalidate(new Project.NameKey(event.getProjectName()));
+    }
+  }
+
+  static class Loader extends CacheLoader<Project.NameKey, List<CachedChange>> {
+    private final OneOffRequestContext requestContext;
+    private final Provider<InternalChangeQuery> queryProvider;
+
+    @Inject
+    Loader(OneOffRequestContext requestContext, Provider<InternalChangeQuery> queryProvider) {
+      this.requestContext = requestContext;
+      this.queryProvider = queryProvider;
+    }
+
+    @Override
+    public List<CachedChange> load(Project.NameKey key) throws Exception {
+      try (TraceTimer timer = TraceContext.newTimer("Loading changes of project %s", key);
+          ManualRequestContext ctx = requestContext.open()) {
+        List<ChangeData> cds =
+            queryProvider
+                .get()
+                .setRequestedFields(ChangeField.CHANGE, ChangeField.REVIEWER)
+                .byProject(key);
+        List<CachedChange> result = new ArrayList<>(cds.size());
+        for (ChangeData cd : cds) {
+          result.add(
+              new AutoValue_SearchingChangeCacheImpl_CachedChange(cd.change(), cd.getReviewers()));
+        }
+        return Collections.unmodifiableList(result);
+      }
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/git/TagCache.java b/java/com/google/gerrit/server/git/TagCache.java
new file mode 100644
index 0000000..535644d
--- /dev/null
+++ b/java/com/google/gerrit/server/git/TagCache.java
@@ -0,0 +1,93 @@
+// Copyright (C) 2011 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.google.gerrit.server.git;
+
+import com.google.common.cache.Cache;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.cache.CacheModule;
+import com.google.gerrit.server.cache.serialize.StringCacheSerializer;
+import com.google.inject.Inject;
+import com.google.inject.Module;
+import com.google.inject.Singleton;
+import com.google.inject.name.Named;
+import java.util.concurrent.ExecutionException;
+import org.eclipse.jgit.lib.ObjectId;
+
+@Singleton
+public class TagCache {
+  private static final String CACHE_NAME = "git_tags";
+
+  public static Module module() {
+    return new CacheModule() {
+      @Override
+      protected void configure() {
+        persist(CACHE_NAME, String.class, TagSetHolder.class)
+            .version(1)
+            .keySerializer(StringCacheSerializer.INSTANCE)
+            .valueSerializer(TagSetHolder.Serializer.INSTANCE);
+        bind(TagCache.class);
+      }
+    };
+  }
+
+  private final Cache<String, TagSetHolder> cache;
+
+  @Inject
+  TagCache(@Named(CACHE_NAME) Cache<String, TagSetHolder> cache) {
+    this.cache = cache;
+  }
+
+  /**
+   * Advise the cache that a reference fast-forwarded.
+   *
+   * <p>This operation is not necessary, the cache will automatically detect changes made to
+   * references and update itself on demand. However, this method may allow the cache to update more
+   * quickly and reuse the caller's computation of the fast-forward status of a branch.
+   *
+   * @param name project the branch is contained in.
+   * @param refName the branch name.
+   * @param oldValue the old value, before the fast-forward. The cache will only update itself if it
+   *     is still using this old value.
+   * @param newValue the current value, after the fast-forward.
+   */
+  public void updateFastForward(
+      Project.NameKey name, String refName, ObjectId oldValue, ObjectId newValue) {
+    // Be really paranoid and null check everything. This method should
+    // never fail with an exception. Some of these references can be null
+    // (e.g. not all projects are cached, or the cache is not current).
+    //
+    TagSetHolder holder = cache.getIfPresent(name.get());
+    if (holder != null) {
+      TagSet tags = holder.getTagSet();
+      if (tags != null) {
+        if (tags.updateFastForward(refName, oldValue, newValue)) {
+          cache.put(name.get(), holder);
+        }
+      }
+    }
+  }
+
+  public TagSetHolder get(Project.NameKey name) {
+    try {
+      return cache.get(name.get(), () -> new TagSetHolder(name));
+    } catch (ExecutionException e) {
+      throw new IllegalStateException(e);
+    }
+  }
+
+  void put(Project.NameKey name, TagSetHolder tags) {
+    cache.put(name.get(), tags);
+  }
+}
diff --git a/java/com/google/gerrit/server/git/TagMatcher.java b/java/com/google/gerrit/server/git/TagMatcher.java
new file mode 100644
index 0000000..58b4b8b
--- /dev/null
+++ b/java/com/google/gerrit/server/git/TagMatcher.java
@@ -0,0 +1,92 @@
+// Copyright (C) 2011 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.google.gerrit.server.git;
+
+import com.google.gerrit.server.git.TagSet.Tag;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.BitSet;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+
+public class TagMatcher {
+  final BitSet mask = new BitSet();
+  final List<Ref> newRefs = new ArrayList<>();
+  final List<LostRef> lostRefs = new ArrayList<>();
+  final TagSetHolder holder;
+  final TagCache cache;
+  final Repository db;
+  final Collection<Ref> include;
+  TagSet tags;
+  final boolean updated;
+  private boolean rebuiltForNewTags;
+
+  TagMatcher(
+      TagSetHolder holder,
+      TagCache cache,
+      Repository db,
+      Collection<Ref> include,
+      TagSet tags,
+      boolean updated) {
+    this.holder = holder;
+    this.cache = cache;
+    this.db = db;
+    this.include = include;
+    this.tags = tags;
+    this.updated = updated;
+  }
+
+  public boolean isReachable(Ref tagRef) {
+    try {
+      tagRef = db.getRefDatabase().peel(tagRef);
+    } catch (IOException e) {
+      // Ignore
+    }
+
+    ObjectId tagObj = tagRef.getPeeledObjectId();
+    if (tagObj == null) {
+      tagObj = tagRef.getObjectId();
+      if (tagObj == null) {
+        return false;
+      }
+    }
+
+    Tag tag = tags.lookupTag(tagObj);
+    if (tag == null) {
+      if (rebuiltForNewTags) {
+        return false;
+      }
+
+      rebuiltForNewTags = true;
+      holder.rebuildForNewTags(cache, this);
+      return isReachable(tagRef);
+    }
+
+    return tag.has(mask);
+  }
+
+  static class LostRef {
+    final Tag tag;
+    final int flag;
+
+    LostRef(Tag tag, int flag) {
+      this.tag = tag;
+      this.flag = flag;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/git/TagSet.java b/java/com/google/gerrit/server/git/TagSet.java
new file mode 100644
index 0000000..ce8814f
--- /dev/null
+++ b/java/com/google/gerrit/server/git/TagSet.java
@@ -0,0 +1,448 @@
+// Copyright (C) 2011 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.google.gerrit.server.git;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.Maps;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.cache.proto.Cache.TagSetHolderProto.TagSetProto;
+import com.google.gerrit.server.cache.proto.Cache.TagSetHolderProto.TagSetProto.CachedRefProto;
+import com.google.gerrit.server.cache.proto.Cache.TagSetHolderProto.TagSetProto.TagProto;
+import com.google.gerrit.server.cache.serialize.ProtoCacheSerializers.ObjectIdConverter;
+import com.google.protobuf.ByteString;
+import java.io.IOException;
+import java.util.BitSet;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
+import org.eclipse.jgit.errors.IncorrectObjectTypeException;
+import org.eclipse.jgit.lib.AnyObjectId;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectIdOwnerMap;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevSort;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+class TagSet {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final Project.NameKey projectName;
+  private final Map<String, CachedRef> refs;
+  private final ObjectIdOwnerMap<Tag> tags;
+
+  TagSet(Project.NameKey projectName) {
+    this(projectName, new HashMap<>(), new ObjectIdOwnerMap<>());
+  }
+
+  TagSet(Project.NameKey projectName, HashMap<String, CachedRef> refs, ObjectIdOwnerMap<Tag> tags) {
+    this.projectName = projectName;
+    this.refs = refs;
+    this.tags = tags;
+  }
+
+  Project.NameKey getProjectName() {
+    return projectName;
+  }
+
+  Tag lookupTag(AnyObjectId id) {
+    return tags.get(id);
+  }
+
+  // Test methods have obtuse names in addition to annotations, since they expose mutable state
+  // which would be easy to corrupt.
+  @VisibleForTesting
+  Map<String, CachedRef> getRefsForTesting() {
+    return refs;
+  }
+
+  @VisibleForTesting
+  ObjectIdOwnerMap<Tag> getTagsForTesting() {
+    return tags;
+  }
+
+  boolean updateFastForward(String refName, ObjectId oldValue, ObjectId newValue) {
+    CachedRef ref = refs.get(refName);
+    if (ref != null) {
+      // compareAndSet works on reference equality, but this operation
+      // wants to use object equality. Switch out oldValue with cur so the
+      // compareAndSet will function correctly for this operation.
+      //
+      ObjectId cur = ref.get();
+      if (cur.equals(oldValue)) {
+        return ref.compareAndSet(cur, newValue);
+      }
+    }
+    return false;
+  }
+
+  void prepare(TagMatcher m) {
+    @SuppressWarnings("resource")
+    RevWalk rw = null;
+    try {
+      for (Ref currentRef : m.include) {
+        if (currentRef.isSymbolic()) {
+          continue;
+        }
+        if (currentRef.getObjectId() == null) {
+          continue;
+        }
+
+        CachedRef savedRef = refs.get(currentRef.getName());
+        if (savedRef == null) {
+          // If the reference isn't known to the set, return null
+          // and force the caller to rebuild the set in a new copy.
+          m.newRefs.add(currentRef);
+          continue;
+        }
+
+        // The reference has not been moved. It can be used as-is.
+        ObjectId savedObjectId = savedRef.get();
+        if (currentRef.getObjectId().equals(savedObjectId)) {
+          m.mask.set(savedRef.flag);
+          continue;
+        }
+
+        // Check on-the-fly to see if the branch still reaches the tag.
+        // This is very likely for a branch that fast-forwarded.
+        try {
+          if (rw == null) {
+            rw = new RevWalk(m.db);
+            rw.setRetainBody(false);
+          }
+
+          RevCommit savedCommit = rw.parseCommit(savedObjectId);
+          RevCommit currentCommit = rw.parseCommit(currentRef.getObjectId());
+          if (rw.isMergedInto(savedCommit, currentCommit)) {
+            // Fast-forward. Safely update the reference in-place.
+            savedRef.compareAndSet(savedObjectId, currentRef.getObjectId());
+            m.mask.set(savedRef.flag);
+            continue;
+          }
+
+          // The branch rewound. Walk the list of commits removed from
+          // the reference. If any matches to a tag, this has to be removed.
+          boolean err = false;
+          rw.reset();
+          rw.markStart(savedCommit);
+          rw.markUninteresting(currentCommit);
+          rw.sort(RevSort.TOPO, true);
+          RevCommit c;
+          while ((c = rw.next()) != null) {
+            Tag tag = tags.get(c);
+            if (tag != null && tag.refFlags.get(savedRef.flag)) {
+              m.lostRefs.add(new TagMatcher.LostRef(tag, savedRef.flag));
+              err = true;
+            }
+          }
+          if (!err) {
+            // All of the tags are still reachable. Update in-place.
+            savedRef.compareAndSet(savedObjectId, currentRef.getObjectId());
+            m.mask.set(savedRef.flag);
+          }
+
+        } catch (IOException err) {
+          // Defer a cache update until later. No conclusion can be made
+          // based on an exception reading from the repository storage.
+          logger.atWarning().withCause(err).log("Error checking tags of %s", projectName);
+        }
+      }
+    } finally {
+      if (rw != null) {
+        rw.close();
+      }
+    }
+  }
+
+  void build(Repository git, TagSet old, TagMatcher m) {
+    if (old != null && m != null && refresh(old, m)) {
+      return;
+    }
+
+    try (TagWalk rw = new TagWalk(git)) {
+      rw.setRetainBody(false);
+      for (Ref ref : git.getRefDatabase().getRefs()) {
+        if (skip(ref)) {
+          continue;
+
+        } else if (isTag(ref)) {
+          // For a tag, remember where it points to.
+          try {
+            addTag(rw, git.getRefDatabase().peel(ref));
+          } catch (IOException e) {
+            addTag(rw, ref);
+          }
+
+        } else {
+          // New reference to include in the set.
+          addRef(rw, ref);
+        }
+      }
+
+      // Traverse the complete history. Copy any flags from a commit to
+      // all of its ancestors. This automatically updates any Tag object
+      // as the TagCommit and the stored Tag object share the same
+      // underlying bit set.
+      TagCommit c;
+      while ((c = (TagCommit) rw.next()) != null) {
+        BitSet mine = c.refFlags;
+        int pCnt = c.getParentCount();
+        for (int pIdx = 0; pIdx < pCnt; pIdx++) {
+          ((TagCommit) c.getParent(pIdx)).refFlags.or(mine);
+        }
+      }
+    } catch (IOException e) {
+      logger.atWarning().withCause(e).log("Error building tags for repository %s", projectName);
+    }
+  }
+
+  static TagSet fromProto(TagSetProto proto) {
+    ObjectIdConverter idConverter = ObjectIdConverter.create();
+
+    HashMap<String, CachedRef> refs = Maps.newHashMapWithExpectedSize(proto.getRefCount());
+    proto
+        .getRefMap()
+        .forEach(
+            (n, cr) ->
+                refs.put(n, new CachedRef(cr.getFlag(), idConverter.fromByteString(cr.getId()))));
+    ObjectIdOwnerMap<Tag> tags = new ObjectIdOwnerMap<>();
+    proto
+        .getTagList()
+        .forEach(
+            t ->
+                tags.add(
+                    new Tag(
+                        idConverter.fromByteString(t.getId()),
+                        BitSet.valueOf(t.getFlags().asReadOnlyByteBuffer()))));
+    return new TagSet(new Project.NameKey(proto.getProjectName()), refs, tags);
+  }
+
+  TagSetProto toProto() {
+    ObjectIdConverter idConverter = ObjectIdConverter.create();
+    TagSetProto.Builder b = TagSetProto.newBuilder().setProjectName(projectName.get());
+    refs.forEach(
+        (n, cr) ->
+            b.putRef(
+                n,
+                CachedRefProto.newBuilder()
+                    .setId(idConverter.toByteString(cr.get()))
+                    .setFlag(cr.flag)
+                    .build()));
+    tags.forEach(
+        t ->
+            b.addTag(
+                TagProto.newBuilder()
+                    .setId(idConverter.toByteString(t))
+                    .setFlags(ByteString.copyFrom(t.refFlags.toByteArray()))
+                    .build()));
+    return b.build();
+  }
+
+  private boolean refresh(TagSet old, TagMatcher m) {
+    if (m.newRefs.isEmpty()) {
+      // No new references is a simple update. Copy from the old set.
+      copy(old, m);
+      return true;
+    }
+
+    // Only permit a refresh if all new references start from the tip of
+    // an existing references. This happens some of the time within a
+    // Gerrit Code Review server, perhaps about 50% of new references.
+    // Since a complete rebuild is so costly, try this approach first.
+
+    Map<ObjectId, Integer> byObj = new HashMap<>();
+    for (CachedRef r : old.refs.values()) {
+      ObjectId id = r.get();
+      if (!byObj.containsKey(id)) {
+        byObj.put(id, r.flag);
+      }
+    }
+
+    for (Ref newRef : m.newRefs) {
+      ObjectId id = newRef.getObjectId();
+      if (id == null || refs.containsKey(newRef.getName())) {
+        continue;
+      } else if (!byObj.containsKey(id)) {
+        return false;
+      }
+    }
+
+    copy(old, m);
+
+    for (Ref newRef : m.newRefs) {
+      ObjectId id = newRef.getObjectId();
+      if (id == null || refs.containsKey(newRef.getName())) {
+        continue;
+      }
+
+      int srcFlag = byObj.get(id);
+      int newFlag = refs.size();
+      refs.put(newRef.getName(), new CachedRef(newRef, newFlag));
+
+      for (Tag tag : tags) {
+        if (tag.refFlags.get(srcFlag)) {
+          tag.refFlags.set(newFlag);
+        }
+      }
+    }
+
+    return true;
+  }
+
+  private void copy(TagSet old, TagMatcher m) {
+    refs.putAll(old.refs);
+
+    for (Tag srcTag : old.tags) {
+      BitSet mine = new BitSet();
+      mine.or(srcTag.refFlags);
+      tags.add(new Tag(srcTag, mine));
+    }
+
+    for (TagMatcher.LostRef lost : m.lostRefs) {
+      Tag mine = tags.get(lost.tag);
+      if (mine != null) {
+        mine.refFlags.clear(lost.flag);
+      }
+    }
+  }
+
+  private void addTag(TagWalk rw, Ref ref) {
+    ObjectId id = ref.getPeeledObjectId();
+    if (id == null) {
+      id = ref.getObjectId();
+    }
+
+    if (!tags.contains(id)) {
+      BitSet flags;
+      try {
+        flags = ((TagCommit) rw.parseCommit(id)).refFlags;
+      } catch (IncorrectObjectTypeException notCommit) {
+        flags = new BitSet();
+      } catch (IOException e) {
+        logger.atWarning().withCause(e).log("Error on %s of %s", ref.getName(), projectName);
+        flags = new BitSet();
+      }
+      tags.add(new Tag(id, flags));
+    }
+  }
+
+  private void addRef(TagWalk rw, Ref ref) {
+    try {
+      TagCommit commit = (TagCommit) rw.parseCommit(ref.getObjectId());
+      rw.markStart(commit);
+
+      int flag = refs.size();
+      commit.refFlags.set(flag);
+      refs.put(ref.getName(), new CachedRef(ref, flag));
+    } catch (IncorrectObjectTypeException notCommit) {
+      // No need to spam the logs.
+      // Quite many refs will point to non-commits.
+      // For instance, refs from refs/cache-automerge
+      // will often end up here.
+    } catch (IOException e) {
+      logger.atWarning().withCause(e).log("Error on %s of %s", ref.getName(), projectName);
+    }
+  }
+
+  static boolean skip(Ref ref) {
+    return ref.isSymbolic()
+        || ref.getObjectId() == null
+        || PatchSet.isChangeRef(ref.getName())
+        || RefNames.isNoteDbMetaRef(ref.getName())
+        || ref.getName().startsWith(RefNames.REFS_CACHE_AUTOMERGE);
+  }
+
+  private static boolean isTag(Ref ref) {
+    return ref.getName().startsWith(Constants.R_TAGS);
+  }
+
+  @Override
+  public String toString() {
+    return MoreObjects.toStringHelper(this)
+        .add("projectName", projectName)
+        .add("refs", refs)
+        .add("tags", tags)
+        .toString();
+  }
+
+  static final class Tag extends ObjectIdOwnerMap.Entry {
+    @VisibleForTesting final BitSet refFlags;
+
+    Tag(AnyObjectId id, BitSet flags) {
+      super(id);
+      this.refFlags = flags;
+    }
+
+    boolean has(BitSet mask) {
+      return refFlags.intersects(mask);
+    }
+
+    @Override
+    public String toString() {
+      return MoreObjects.toStringHelper(this).addValue(name()).add("refFlags", refFlags).toString();
+    }
+  }
+
+  @VisibleForTesting
+  static final class CachedRef extends AtomicReference<ObjectId> {
+    private static final long serialVersionUID = 1L;
+
+    final int flag;
+
+    CachedRef(Ref ref, int flag) {
+      this(flag, ref.getObjectId());
+    }
+
+    CachedRef(int flag, ObjectId id) {
+      this.flag = flag;
+      set(id);
+    }
+
+    @Override
+    public String toString() {
+      ObjectId id = get();
+      return MoreObjects.toStringHelper(this)
+          .addValue(id != null ? id.name() : "null")
+          .add("flag", flag)
+          .toString();
+    }
+  }
+
+  private static final class TagWalk extends RevWalk {
+    TagWalk(Repository git) {
+      super(git);
+    }
+
+    @Override
+    protected TagCommit createCommit(AnyObjectId id) {
+      return new TagCommit(id);
+    }
+  }
+
+  private static final class TagCommit extends RevCommit {
+    final BitSet refFlags;
+
+    TagCommit(AnyObjectId id) {
+      super(id);
+      refFlags = new BitSet();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/git/TagSetHolder.java b/java/com/google/gerrit/server/git/TagSetHolder.java
new file mode 100644
index 0000000..4c0c035
--- /dev/null
+++ b/java/com/google/gerrit/server/git/TagSetHolder.java
@@ -0,0 +1,128 @@
+// Copyright (C) 2011 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.google.gerrit.server.git;
+
+import static java.util.stream.Collectors.toList;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.cache.proto.Cache.TagSetHolderProto;
+import com.google.gerrit.server.cache.serialize.CacheSerializer;
+import com.google.gerrit.server.cache.serialize.ProtoCacheSerializers;
+import java.util.Collection;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+
+public class TagSetHolder {
+  private final Object buildLock = new Object();
+  private final Project.NameKey projectName;
+
+  @Nullable private volatile TagSet tags;
+
+  TagSetHolder(Project.NameKey projectName) {
+    this.projectName = projectName;
+  }
+
+  Project.NameKey getProjectName() {
+    return projectName;
+  }
+
+  TagSet getTagSet() {
+    return tags;
+  }
+
+  void setTagSet(TagSet tags) {
+    this.tags = tags;
+  }
+
+  public TagMatcher matcher(TagCache cache, Repository db, Collection<Ref> include) {
+    include = include.stream().filter(r -> !TagSet.skip(r)).collect(toList());
+
+    TagSet tags = this.tags;
+    if (tags == null) {
+      tags = build(cache, db);
+    }
+
+    TagMatcher m = new TagMatcher(this, cache, db, include, tags, false);
+    tags.prepare(m);
+    if (!m.newRefs.isEmpty() || !m.lostRefs.isEmpty()) {
+      tags = rebuild(cache, db, tags, m);
+
+      m = new TagMatcher(this, cache, db, include, tags, true);
+      tags.prepare(m);
+    }
+    return m;
+  }
+
+  void rebuildForNewTags(TagCache cache, TagMatcher m) {
+    m.tags = rebuild(cache, m.db, m.tags, null);
+    m.mask.clear();
+    m.newRefs.clear();
+    m.lostRefs.clear();
+    m.tags.prepare(m);
+  }
+
+  private TagSet build(TagCache cache, Repository db) {
+    synchronized (buildLock) {
+      TagSet tags = this.tags;
+      if (tags == null) {
+        tags = new TagSet(projectName);
+        tags.build(db, null, null);
+        this.tags = tags;
+        cache.put(projectName, this);
+      }
+      return tags;
+    }
+  }
+
+  private TagSet rebuild(TagCache cache, Repository db, TagSet old, TagMatcher m) {
+    synchronized (buildLock) {
+      TagSet cur = this.tags;
+      if (cur == old) {
+        cur = new TagSet(projectName);
+        cur.build(db, old, m);
+        this.tags = cur;
+        cache.put(projectName, this);
+      }
+      return cur;
+    }
+  }
+
+  enum Serializer implements CacheSerializer<TagSetHolder> {
+    INSTANCE;
+
+    @Override
+    public byte[] serialize(TagSetHolder object) {
+      TagSetHolderProto.Builder b =
+          TagSetHolderProto.newBuilder().setProjectName(object.projectName.get());
+      TagSet tags = object.tags;
+      if (tags != null) {
+        b.setTags(tags.toProto());
+      }
+      return ProtoCacheSerializers.toByteArray(b.build());
+    }
+
+    @Override
+    public TagSetHolder deserialize(byte[] in) {
+      TagSetHolderProto proto =
+          ProtoCacheSerializers.parseUnchecked(TagSetHolderProto.parser(), in);
+      TagSetHolder holder = new TagSetHolder(new Project.NameKey(proto.getProjectName()));
+      if (proto.hasTags()) {
+        holder.tags = TagSet.fromProto(proto.getTags());
+      }
+      return holder;
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/TaskInfoFactory.java b/java/com/google/gerrit/server/git/TaskInfoFactory.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/TaskInfoFactory.java
rename to java/com/google/gerrit/server/git/TaskInfoFactory.java
diff --git a/java/com/google/gerrit/server/git/TransferConfig.java b/java/com/google/gerrit/server/git/TransferConfig.java
new file mode 100644
index 0000000..55b9448
--- /dev/null
+++ b/java/com/google/gerrit/server/git/TransferConfig.java
@@ -0,0 +1,75 @@
+// Copyright (C) 2010 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.google.gerrit.server.git;
+
+import com.google.gerrit.server.config.ConfigUtil;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.storage.pack.PackConfig;
+
+@Singleton
+public class TransferConfig {
+  private final int timeout;
+  private final PackConfig packConfig;
+  private final long maxObjectSizeLimit;
+  private final String maxObjectSizeLimitFormatted;
+  private final boolean inheritProjectMaxObjectSizeLimit;
+
+  @Inject
+  TransferConfig(@GerritServerConfig Config cfg) {
+    timeout =
+        (int)
+            ConfigUtil.getTimeUnit(
+                cfg,
+                "transfer",
+                null,
+                "timeout", //
+                0,
+                TimeUnit.SECONDS);
+    maxObjectSizeLimit = cfg.getLong("receive", "maxObjectSizeLimit", 0);
+    maxObjectSizeLimitFormatted = cfg.getString("receive", null, "maxObjectSizeLimit");
+    inheritProjectMaxObjectSizeLimit =
+        cfg.getBoolean("receive", "inheritProjectMaxObjectSizeLimit", false);
+
+    packConfig = new PackConfig();
+    packConfig.setDeltaCompress(false);
+    packConfig.setThreads(1);
+    packConfig.fromConfig(cfg);
+  }
+
+  /** @return configured timeout, in seconds. 0 if the timeout is infinite. */
+  public int getTimeout() {
+    return timeout;
+  }
+
+  public PackConfig getPackConfig() {
+    return packConfig;
+  }
+
+  public long getMaxObjectSizeLimit() {
+    return maxObjectSizeLimit;
+  }
+
+  public String getFormattedMaxObjectSizeLimit() {
+    return maxObjectSizeLimitFormatted;
+  }
+
+  public boolean inheritProjectMaxObjectSizeLimit() {
+    return inheritProjectMaxObjectSizeLimit;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/UploadPackInitializer.java b/java/com/google/gerrit/server/git/UploadPackInitializer.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/UploadPackInitializer.java
rename to java/com/google/gerrit/server/git/UploadPackInitializer.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/UploadPackMetricsHook.java b/java/com/google/gerrit/server/git/UploadPackMetricsHook.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/UploadPackMetricsHook.java
rename to java/com/google/gerrit/server/git/UploadPackMetricsHook.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/UserConfigSections.java b/java/com/google/gerrit/server/git/UserConfigSections.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/UserConfigSections.java
rename to java/com/google/gerrit/server/git/UserConfigSections.java
diff --git a/java/com/google/gerrit/server/git/ValidationError.java b/java/com/google/gerrit/server/git/ValidationError.java
new file mode 100644
index 0000000..28d5171
--- /dev/null
+++ b/java/com/google/gerrit/server/git/ValidationError.java
@@ -0,0 +1,64 @@
+// Copyright (C) 2011 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.google.gerrit.server.git;
+
+import java.util.Objects;
+
+/** Indicates a problem with Git based data. */
+public class ValidationError {
+  private final String message;
+
+  public ValidationError(String file, String message) {
+    this(file + ": " + message);
+  }
+
+  public ValidationError(String file, int line, String message) {
+    this(file + ":" + line + ": " + message);
+  }
+
+  public ValidationError(String message) {
+    this.message = message;
+  }
+
+  public String getMessage() {
+    return message;
+  }
+
+  @Override
+  public String toString() {
+    return "ValidationError[" + message + "]";
+  }
+
+  public interface Sink {
+    void error(ValidationError error);
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (o == this) {
+      return true;
+    }
+    if (o instanceof ValidationError) {
+      ValidationError that = (ValidationError) o;
+      return Objects.equals(this.message, that.message);
+    }
+    return false;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hashCode(message);
+  }
+}
diff --git a/java/com/google/gerrit/server/git/WorkQueue.java b/java/com/google/gerrit/server/git/WorkQueue.java
new file mode 100644
index 0000000..a7336f0
--- /dev/null
+++ b/java/com/google/gerrit/server/git/WorkQueue.java
@@ -0,0 +1,721 @@
+// Copyright (C) 2009 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.google.gerrit.server.git;
+
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.base.CaseFormat;
+import com.google.common.base.Supplier;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.lifecycle.LifecycleModule;
+import com.google.gerrit.metrics.Description;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.ScheduleConfig.Schedule;
+import com.google.gerrit.server.logging.LoggingContext;
+import com.google.gerrit.server.logging.LoggingContextAwareRunnable;
+import com.google.gerrit.server.util.IdGenerator;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.lang.Thread.UncaughtExceptionHandler;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.Delayed;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.RunnableScheduledFuture;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.eclipse.jgit.lib.Config;
+
+/** Delayed execution of tasks using a background thread pool. */
+@Singleton
+public class WorkQueue {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static class Lifecycle implements LifecycleListener {
+    private final WorkQueue workQueue;
+
+    @Inject
+    Lifecycle(WorkQueue workQeueue) {
+      this.workQueue = workQeueue;
+    }
+
+    @Override
+    public void start() {}
+
+    @Override
+    public void stop() {
+      workQueue.stop();
+    }
+  }
+
+  public static class Module extends LifecycleModule {
+    @Override
+    protected void configure() {
+      bind(WorkQueue.class);
+      listener().to(Lifecycle.class);
+    }
+  }
+
+  private static final UncaughtExceptionHandler LOG_UNCAUGHT_EXCEPTION =
+      new UncaughtExceptionHandler() {
+        @Override
+        public void uncaughtException(Thread t, Throwable e) {
+          logger.atSevere().withCause(e).log("WorkQueue thread %s threw exception", t.getName());
+        }
+      };
+
+  private final ScheduledExecutorService defaultQueue;
+  private final IdGenerator idGenerator;
+  private final MetricMaker metrics;
+  private final CopyOnWriteArrayList<Executor> queues;
+
+  @Inject
+  WorkQueue(IdGenerator idGenerator, @GerritServerConfig Config cfg, MetricMaker metrics) {
+    this(idGenerator, cfg.getInt("execution", "defaultThreadPoolSize", 1), metrics);
+  }
+
+  /** Constructor to allow binding the WorkQueue more explicitly in a vhost setup. */
+  public WorkQueue(IdGenerator idGenerator, int defaultThreadPoolSize, MetricMaker metrics) {
+    this.idGenerator = idGenerator;
+    this.metrics = metrics;
+    this.queues = new CopyOnWriteArrayList<>();
+    this.defaultQueue = createQueue(defaultThreadPoolSize, "WorkQueue", true);
+  }
+
+  /** Get the default work queue, for miscellaneous tasks. */
+  public ScheduledExecutorService getDefaultQueue() {
+    return defaultQueue;
+  }
+
+  /**
+   * Create a new executor queue.
+   *
+   * <p>Creates a new executor queue without associated metrics. This method is suitable for use by
+   * plugins.
+   *
+   * <p>If metrics are needed, use {@link #createQueue(int, String, int, boolean)} instead.
+   *
+   * @param poolsize the size of the pool.
+   * @param queueName the name of the queue.
+   */
+  public ScheduledExecutorService createQueue(int poolsize, String queueName) {
+    return createQueue(poolsize, queueName, Thread.NORM_PRIORITY, false);
+  }
+
+  /**
+   * Create a new executor queue, with default priority, optionally with metrics.
+   *
+   * <p>Creates a new executor queue, optionally with associated metrics. Metrics should not be
+   * requested for queues created by plugins.
+   *
+   * @param poolsize the size of the pool.
+   * @param queueName the name of the queue.
+   * @param withMetrics whether to create metrics.
+   */
+  public ScheduledThreadPoolExecutor createQueue(
+      int poolsize, String queueName, boolean withMetrics) {
+    return createQueue(poolsize, queueName, Thread.NORM_PRIORITY, withMetrics);
+  }
+
+  /**
+   * Create a new executor queue, optionally with metrics.
+   *
+   * <p>Creates a new executor queue, optionally with associated metrics. Metrics should not be
+   * requested for queues created by plugins.
+   *
+   * @param poolsize the size of the pool.
+   * @param queueName the name of the queue.
+   * @param threadPriority thread priority.
+   * @param withMetrics whether to create metrics.
+   */
+  public ScheduledThreadPoolExecutor createQueue(
+      int poolsize, String queueName, int threadPriority, boolean withMetrics) {
+    Executor executor = new Executor(poolsize, queueName);
+    if (withMetrics) {
+      logger.atInfo().log("Adding metrics for '%s' queue", queueName);
+      executor.buildMetrics(queueName);
+    }
+    executor.setContinueExistingPeriodicTasksAfterShutdownPolicy(false);
+    executor.setExecuteExistingDelayedTasksAfterShutdownPolicy(true);
+    queues.add(executor);
+    if (threadPriority != Thread.NORM_PRIORITY) {
+      ThreadFactory parent = executor.getThreadFactory();
+      executor.setThreadFactory(
+          task -> {
+            Thread t = parent.newThread(task);
+            t.setPriority(threadPriority);
+            return t;
+          });
+    }
+
+    return executor;
+  }
+
+  /** Executes a periodic command at a fixed schedule on the default queue. */
+  public void scheduleAtFixedRate(Runnable command, Schedule schedule) {
+    @SuppressWarnings("unused")
+    Future<?> possiblyIgnoredError =
+        getDefaultQueue()
+            .scheduleAtFixedRate(
+                command, schedule.initialDelay(), schedule.interval(), TimeUnit.MILLISECONDS);
+  }
+
+  /** Get all of the tasks currently scheduled in any work queue. */
+  public List<Task<?>> getTasks() {
+    final List<Task<?>> r = new ArrayList<>();
+    for (Executor e : queues) {
+      e.addAllTo(r);
+    }
+    return r;
+  }
+
+  public <T> List<T> getTaskInfos(TaskInfoFactory<T> factory) {
+    List<T> taskInfos = new ArrayList<>();
+    for (Executor exe : queues) {
+      for (Task<?> task : exe.getTasks()) {
+        taskInfos.add(factory.getTaskInfo(task));
+      }
+    }
+    return taskInfos;
+  }
+
+  /** Locate a task by its unique id, null if no task matches. */
+  public Task<?> getTask(int id) {
+    Task<?> result = null;
+    for (Executor e : queues) {
+      final Task<?> t = e.getTask(id);
+      if (t != null) {
+        if (result != null) {
+          // Don't return the task if we have a duplicate. Lie instead.
+          return null;
+        }
+        result = t;
+      }
+    }
+    return result;
+  }
+
+  public ScheduledThreadPoolExecutor getExecutor(String queueName) {
+    for (Executor e : queues) {
+      if (e.queueName.equals(queueName)) {
+        return e;
+      }
+    }
+    return null;
+  }
+
+  private void stop() {
+    for (Executor p : queues) {
+      p.shutdown();
+      boolean isTerminated;
+      do {
+        try {
+          isTerminated = p.awaitTermination(10, TimeUnit.SECONDS);
+        } catch (InterruptedException ie) {
+          isTerminated = false;
+        }
+      } while (!isTerminated);
+    }
+    queues.clear();
+  }
+
+  /** An isolated queue. */
+  private class Executor extends ScheduledThreadPoolExecutor {
+    private final ConcurrentHashMap<Integer, Task<?>> all;
+    private final String queueName;
+
+    Executor(int corePoolSize, final String queueName) {
+      super(
+          corePoolSize,
+          new ThreadFactory() {
+            private final ThreadFactory parent = Executors.defaultThreadFactory();
+            private final AtomicInteger tid = new AtomicInteger(1);
+
+            @Override
+            public Thread newThread(Runnable task) {
+              final Thread t = parent.newThread(task);
+              t.setName(queueName + "-" + tid.getAndIncrement());
+              t.setUncaughtExceptionHandler(LOG_UNCAUGHT_EXCEPTION);
+              return t;
+            }
+          });
+
+      all =
+          new ConcurrentHashMap<>( //
+              corePoolSize << 1, // table size
+              0.75f, // load factor
+              corePoolSize + 4 // concurrency level
+              );
+      this.queueName = queueName;
+    }
+
+    @Override
+    public void execute(Runnable command) {
+      super.execute(LoggingContext.copy(command));
+    }
+
+    @Override
+    public <T> Future<T> submit(Callable<T> task) {
+      return super.submit(LoggingContext.copy(task));
+    }
+
+    @Override
+    public <T> Future<T> submit(Runnable task, T result) {
+      return super.submit(LoggingContext.copy(task), result);
+    }
+
+    @Override
+    public Future<?> submit(Runnable task) {
+      return super.submit(LoggingContext.copy(task));
+    }
+
+    @Override
+    public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
+        throws InterruptedException {
+      return super.invokeAll(tasks.stream().map(LoggingContext::copy).collect(toList()));
+    }
+
+    @Override
+    public <T> List<Future<T>> invokeAll(
+        Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
+        throws InterruptedException {
+      return super.invokeAll(
+          tasks.stream().map(LoggingContext::copy).collect(toList()), timeout, unit);
+    }
+
+    @Override
+    public <T> T invokeAny(Collection<? extends Callable<T>> tasks)
+        throws InterruptedException, ExecutionException {
+      return super.invokeAny(tasks.stream().map(LoggingContext::copy).collect(toList()));
+    }
+
+    @Override
+    public <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
+        throws InterruptedException, ExecutionException, TimeoutException {
+      return super.invokeAny(
+          tasks.stream().map(LoggingContext::copy).collect(toList()), timeout, unit);
+    }
+
+    @Override
+    public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit) {
+      return super.schedule(LoggingContext.copy(command), delay, unit);
+    }
+
+    @Override
+    public <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit) {
+      return super.schedule(LoggingContext.copy(callable), delay, unit);
+    }
+
+    @Override
+    public ScheduledFuture<?> scheduleAtFixedRate(
+        Runnable command, long initialDelay, long period, TimeUnit unit) {
+      return super.scheduleAtFixedRate(LoggingContext.copy(command), initialDelay, period, unit);
+    }
+
+    @Override
+    public ScheduledFuture<?> scheduleWithFixedDelay(
+        Runnable command, long initialDelay, long delay, TimeUnit unit) {
+      return super.scheduleWithFixedDelay(LoggingContext.copy(command), initialDelay, delay, unit);
+    }
+
+    @Override
+    protected void terminated() {
+      super.terminated();
+      queues.remove(this);
+    }
+
+    private void buildMetrics(String queueName) {
+      metrics.newCallbackMetric(
+          getMetricName(queueName, "max_pool_size"),
+          Long.class,
+          new Description("Maximum allowed number of threads in the pool")
+              .setGauge()
+              .setUnit("threads"),
+          new Supplier<Long>() {
+            @Override
+            public Long get() {
+              return (long) getMaximumPoolSize();
+            }
+          });
+      metrics.newCallbackMetric(
+          getMetricName(queueName, "pool_size"),
+          Long.class,
+          new Description("Current number of threads in the pool").setGauge().setUnit("threads"),
+          new Supplier<Long>() {
+            @Override
+            public Long get() {
+              return (long) getPoolSize();
+            }
+          });
+      metrics.newCallbackMetric(
+          getMetricName(queueName, "active_threads"),
+          Long.class,
+          new Description("Number number of threads that are actively executing tasks")
+              .setGauge()
+              .setUnit("threads"),
+          new Supplier<Long>() {
+            @Override
+            public Long get() {
+              return (long) getActiveCount();
+            }
+          });
+      metrics.newCallbackMetric(
+          getMetricName(queueName, "scheduled_tasks"),
+          Integer.class,
+          new Description("Number of scheduled tasks in the queue").setGauge().setUnit("tasks"),
+          new Supplier<Integer>() {
+            @Override
+            public Integer get() {
+              return getQueue().size();
+            }
+          });
+      metrics.newCallbackMetric(
+          getMetricName(queueName, "total_scheduled_tasks_count"),
+          Long.class,
+          new Description("Total number of tasks that have been scheduled for execution")
+              .setCumulative()
+              .setUnit("tasks"),
+          new Supplier<Long>() {
+            @Override
+            public Long get() {
+              return (long) getTaskCount();
+            }
+          });
+      metrics.newCallbackMetric(
+          getMetricName(queueName, "total_completed_tasks_count"),
+          Long.class,
+          new Description("Total number of tasks that have completed execution")
+              .setCumulative()
+              .setUnit("tasks"),
+          new Supplier<Long>() {
+            @Override
+            public Long get() {
+              return (long) getCompletedTaskCount();
+            }
+          });
+    }
+
+    private String getMetricName(String queueName, String metricName) {
+      String name =
+          CaseFormat.UPPER_CAMEL.to(
+              CaseFormat.LOWER_UNDERSCORE,
+              queueName.replaceFirst("SSH", "Ssh").replaceAll("-", ""));
+      return metrics.sanitizeMetricName(String.format("queue/%s/%s", name, metricName));
+    }
+
+    @Override
+    protected <V> RunnableScheduledFuture<V> decorateTask(
+        Runnable runnable, RunnableScheduledFuture<V> r) {
+      r = super.decorateTask(runnable, r);
+      for (; ; ) {
+        final int id = idGenerator.next();
+
+        Task<V> task;
+
+        if (runnable instanceof LoggingContextAwareRunnable) {
+          runnable = ((LoggingContextAwareRunnable) runnable).unwrap();
+        }
+
+        if (runnable instanceof ProjectRunnable) {
+          task = new ProjectTask<>((ProjectRunnable) runnable, r, this, id);
+        } else {
+          task = new Task<>(runnable, r, this, id);
+        }
+
+        if (all.putIfAbsent(task.getTaskId(), task) == null) {
+          return task;
+        }
+      }
+    }
+
+    @Override
+    protected <V> RunnableScheduledFuture<V> decorateTask(
+        Callable<V> callable, RunnableScheduledFuture<V> task) {
+      throw new UnsupportedOperationException("Callable not implemented");
+    }
+
+    void remove(Task<?> task) {
+      all.remove(task.getTaskId(), task);
+    }
+
+    Task<?> getTask(int id) {
+      return all.get(id);
+    }
+
+    void addAllTo(List<Task<?>> list) {
+      list.addAll(all.values()); // iterator is thread safe
+    }
+
+    Collection<Task<?>> getTasks() {
+      return all.values();
+    }
+  }
+
+  /**
+   * Runnable needing to know it was canceled. Note that cancel is called only in case the task is
+   * not in progress already.
+   */
+  public interface CancelableRunnable extends Runnable {
+    /** Notifies the runnable it was canceled. */
+    void cancel();
+  }
+
+  /**
+   * Base interface handles the case when task was canceled before actual execution and in case it
+   * was started cancel method is not called yet the task itself will be destroyed anyway (it will
+   * result in resource opening errors). This interface gives a chance to implementing classes for
+   * handling such scenario and act accordingly.
+   */
+  public interface CanceledWhileRunning extends CancelableRunnable {
+    /** Notifies the runnable it was canceled during execution. * */
+    void setCanceledWhileRunning();
+  }
+
+  /** A wrapper around a scheduled Runnable, as maintained in the queue. */
+  public static class Task<V> implements RunnableScheduledFuture<V> {
+    /**
+     * Summarized status of a single task.
+     *
+     * <p>Tasks have the following state flow:
+     *
+     * <ol>
+     *   <li>{@link #SLEEPING}: if scheduled with a non-zero delay.
+     *   <li>{@link #READY}: waiting for an available worker thread.
+     *   <li>{@link #RUNNING}: actively executing on a worker thread.
+     *   <li>{@link #DONE}: finished executing, if not periodic.
+     * </ol>
+     */
+    public enum State {
+      // Ordered like this so ordinal matches the order we would
+      // prefer to see tasks sorted in: done before running,
+      // running before ready, ready before sleeping.
+      //
+      DONE,
+      CANCELLED,
+      RUNNING,
+      READY,
+      SLEEPING,
+      OTHER
+    }
+
+    private final Runnable runnable;
+    private final RunnableScheduledFuture<V> task;
+    private final Executor executor;
+    private final int taskId;
+    private final AtomicBoolean running;
+    private final Date startTime;
+
+    Task(Runnable runnable, RunnableScheduledFuture<V> task, Executor executor, int taskId) {
+      this.runnable = runnable;
+      this.task = task;
+      this.executor = executor;
+      this.taskId = taskId;
+      this.running = new AtomicBoolean();
+      this.startTime = new Date();
+    }
+
+    public int getTaskId() {
+      return taskId;
+    }
+
+    public State getState() {
+      if (isCancelled()) {
+        return State.CANCELLED;
+      } else if (isDone() && !isPeriodic()) {
+        return State.DONE;
+      } else if (running.get()) {
+        return State.RUNNING;
+      }
+
+      final long delay = getDelay(TimeUnit.MILLISECONDS);
+      if (delay <= 0) {
+        return State.READY;
+      }
+      return State.SLEEPING;
+    }
+
+    public Date getStartTime() {
+      return startTime;
+    }
+
+    public String getQueueName() {
+      return executor.queueName;
+    }
+
+    @Override
+    public boolean cancel(boolean mayInterruptIfRunning) {
+      if (task.cancel(mayInterruptIfRunning)) {
+        // Tiny abuse of running: if the task needs to know it was
+        // canceled (to clean up resources) and it hasn't started
+        // yet the task's run method won't execute. So we tag it
+        // as running and allow it to clean up. This ensures we do
+        // not invoke cancel twice.
+        //
+        if (runnable instanceof CancelableRunnable) {
+          if (running.compareAndSet(false, true)) {
+            ((CancelableRunnable) runnable).cancel();
+          } else if (runnable instanceof CanceledWhileRunning) {
+            ((CanceledWhileRunning) runnable).setCanceledWhileRunning();
+          }
+        }
+        if (runnable instanceof Future<?>) {
+          // Creating new futures eventually passes through
+          // AbstractExecutorService#schedule, which will convert the Guava
+          // Future to a Runnable, thereby making it impossible for the
+          // cancellation to propagate from ScheduledThreadPool's task back to
+          // the Guava future, so kludge it here.
+          ((Future<?>) runnable).cancel(mayInterruptIfRunning);
+        }
+
+        executor.remove(this);
+        executor.purge();
+        return true;
+      }
+      return false;
+    }
+
+    @Override
+    public int compareTo(Delayed o) {
+      return task.compareTo(o);
+    }
+
+    @Override
+    public V get() throws InterruptedException, ExecutionException {
+      return task.get();
+    }
+
+    @Override
+    public V get(long timeout, TimeUnit unit)
+        throws InterruptedException, ExecutionException, TimeoutException {
+      return task.get(timeout, unit);
+    }
+
+    @Override
+    public long getDelay(TimeUnit unit) {
+      return task.getDelay(unit);
+    }
+
+    @Override
+    public boolean isCancelled() {
+      return task.isCancelled();
+    }
+
+    @Override
+    public boolean isDone() {
+      return task.isDone();
+    }
+
+    @Override
+    public boolean isPeriodic() {
+      return task.isPeriodic();
+    }
+
+    @Override
+    public void run() {
+      if (running.compareAndSet(false, true)) {
+        try {
+          task.run();
+        } finally {
+          if (isPeriodic()) {
+            running.set(false);
+          } else {
+            executor.remove(this);
+          }
+        }
+      }
+    }
+
+    @Override
+    public String toString() {
+      // This is a workaround to be able to print a proper name when the task
+      // is wrapped into a TrustedListenableFutureTask.
+      try {
+        if (runnable
+            .getClass()
+            .isAssignableFrom(
+                Class.forName("com.google.common.util.concurrent.TrustedListenableFutureTask"))) {
+          Class<?> trustedFutureInterruptibleTask =
+              Class.forName(
+                  "com.google.common.util.concurrent.TrustedListenableFutureTask$TrustedFutureInterruptibleTask");
+          for (Field field : runnable.getClass().getDeclaredFields()) {
+            if (field.getType().isAssignableFrom(trustedFutureInterruptibleTask)) {
+              field.setAccessible(true);
+              Object innerObj = field.get(runnable);
+              if (innerObj != null) {
+                for (Field innerField : innerObj.getClass().getDeclaredFields()) {
+                  if (innerField.getType().isAssignableFrom(Callable.class)) {
+                    innerField.setAccessible(true);
+                    return ((Callable<?>) innerField.get(innerObj)).toString();
+                  }
+                }
+              }
+            }
+          }
+        }
+      } catch (ClassNotFoundException | IllegalArgumentException | IllegalAccessException e) {
+        logger.atFine().log(
+            "Cannot get a proper name for TrustedListenableFutureTask: %s", e.getMessage());
+      }
+      return runnable.toString();
+    }
+  }
+
+  /**
+   * Same as Task class, but with a reference to ProjectRunnable, used to retrieve the project name
+   * from the operation queued
+   */
+  public static class ProjectTask<V> extends Task<V> implements ProjectRunnable {
+
+    private final ProjectRunnable runnable;
+
+    ProjectTask(
+        ProjectRunnable runnable, RunnableScheduledFuture<V> task, Executor executor, int taskId) {
+      super(runnable, task, executor, taskId);
+      this.runnable = runnable;
+    }
+
+    @Override
+    public Project.NameKey getProjectNameKey() {
+      return runnable.getProjectNameKey();
+    }
+
+    @Override
+    public String getRemoteName() {
+      return runnable.getRemoteName();
+    }
+
+    @Override
+    public boolean hasCustomizedPrint() {
+      return runnable.hasCustomizedPrint();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/git/meta/MetaDataUpdate.java b/java/com/google/gerrit/server/git/meta/MetaDataUpdate.java
new file mode 100644
index 0000000..bbe0c62
--- /dev/null
+++ b/java/com/google/gerrit/server/git/meta/MetaDataUpdate.java
@@ -0,0 +1,268 @@
+// Copyright (C) 2011 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.google.gerrit.server.git.meta;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.Repository;
+
+/** Helps with the updating of a {@link VersionedMetaData}. */
+public class MetaDataUpdate implements AutoCloseable {
+  public static class User {
+    private final InternalFactory factory;
+    private final GitRepositoryManager mgr;
+    private final PersonIdent serverIdent;
+    private final Provider<IdentifiedUser> identifiedUser;
+
+    @Inject
+    User(
+        InternalFactory factory,
+        GitRepositoryManager mgr,
+        @GerritPersonIdent PersonIdent serverIdent,
+        Provider<IdentifiedUser> identifiedUser) {
+      this.factory = factory;
+      this.mgr = mgr;
+      this.serverIdent = serverIdent;
+      this.identifiedUser = identifiedUser;
+    }
+
+    public PersonIdent getUserPersonIdent() {
+      return createPersonIdent(identifiedUser.get());
+    }
+
+    public MetaDataUpdate create(Project.NameKey name)
+        throws RepositoryNotFoundException, IOException {
+      return create(name, identifiedUser.get());
+    }
+
+    public MetaDataUpdate create(Project.NameKey name, IdentifiedUser user)
+        throws RepositoryNotFoundException, IOException {
+      return create(name, user, null);
+    }
+
+    /**
+     * Create an update using an existing batch ref update.
+     *
+     * <p>This allows batching together updates to multiple metadata refs. For making multiple
+     * commits to a single metadata ref, see {@link VersionedMetaData#openUpdate(MetaDataUpdate)}.
+     *
+     * @param name project name.
+     * @param user user for the update.
+     * @param batch batch update to use; the caller is responsible for committing the update.
+     */
+    public MetaDataUpdate create(Project.NameKey name, IdentifiedUser user, BatchRefUpdate batch)
+        throws RepositoryNotFoundException, IOException {
+      Repository repo = mgr.openRepository(name);
+      MetaDataUpdate md = create(name, repo, user, batch);
+      md.setCloseRepository(true);
+      return md;
+    }
+
+    /**
+     * Create an update using an existing batch ref update.
+     *
+     * <p>This allows batching together updates to multiple metadata refs. For making multiple
+     * commits to a single metadata ref, see {@link VersionedMetaData#openUpdate(MetaDataUpdate)}.
+     *
+     * <p>Important: Create a new MetaDataUpdate instance for each update:
+     *
+     * <pre>
+     * <code>
+     *   try (Repository repo = repoMgr.openRepository(allUsersName);
+     *       RevWalk rw = new RevWalk(repo)) {
+     *     BatchRefUpdate batchUpdate = repo.getRefDatabase().newBatchUpdate();
+     *     // WRONG: create the MetaDataUpdate instance here and reuse it for
+     *     //        all updates in the loop
+     *     for{@code (Map.Entry<Account.Id, DiffPreferencesInfo> e : diffPrefsFromDb)} {
+     *       // CORRECT: create a new MetaDataUpdate instance for each update
+     *       try (MetaDataUpdate md =
+     *           metaDataUpdateFactory.create(allUsersName, batchUpdate)) {
+     *         md.setMessage("Import diff preferences from reviewdb\n");
+     *         VersionedAccountPreferences vPrefs =
+     *             VersionedAccountPreferences.forUser(e.getKey());
+     *         storeSection(vPrefs.getConfig(), UserConfigSections.DIFF, null,
+     *             e.getValue(), DiffPreferencesInfo.defaults());
+     *         vPrefs.commit(md);
+     *       } catch (ConfigInvalidException e) {
+     *         // TODO handle exception
+     *       }
+     *     }
+     *     batchUpdate.execute(rw, NullProgressMonitor.INSTANCE);
+     *   }
+     * </code>
+     * </pre>
+     *
+     * @param name project name.
+     * @param repository the repository to update; the caller is responsible for closing the
+     *     repository.
+     * @param user user for the update.
+     * @param batch batch update to use; the caller is responsible for committing the update.
+     */
+    public MetaDataUpdate create(
+        Project.NameKey name, Repository repository, IdentifiedUser user, BatchRefUpdate batch) {
+      MetaDataUpdate md = factory.create(name, repository, batch);
+      md.getCommitBuilder().setCommitter(serverIdent);
+      md.setAuthor(user);
+      return md;
+    }
+
+    private PersonIdent createPersonIdent(IdentifiedUser user) {
+      return user.newCommitterIdent(serverIdent.getWhen(), serverIdent.getTimeZone());
+    }
+  }
+
+  public static class Server {
+    private final InternalFactory factory;
+    private final GitRepositoryManager mgr;
+    private final PersonIdent serverIdent;
+
+    @Inject
+    Server(
+        InternalFactory factory,
+        GitRepositoryManager mgr,
+        @GerritPersonIdent PersonIdent serverIdent) {
+      this.factory = factory;
+      this.mgr = mgr;
+      this.serverIdent = serverIdent;
+    }
+
+    public MetaDataUpdate create(Project.NameKey name)
+        throws RepositoryNotFoundException, IOException {
+      return create(name, null);
+    }
+
+    /** @see User#create(Project.NameKey, IdentifiedUser, BatchRefUpdate) */
+    public MetaDataUpdate create(Project.NameKey name, BatchRefUpdate batch)
+        throws RepositoryNotFoundException, IOException {
+      Repository repo = mgr.openRepository(name);
+      MetaDataUpdate md = factory.create(name, repo, batch);
+      md.setCloseRepository(true);
+      md.getCommitBuilder().setAuthor(serverIdent);
+      md.getCommitBuilder().setCommitter(serverIdent);
+      return md;
+    }
+  }
+
+  public interface InternalFactory {
+    MetaDataUpdate create(
+        @Assisted Project.NameKey projectName,
+        @Assisted Repository repository,
+        @Assisted @Nullable BatchRefUpdate batch);
+  }
+
+  private final GitReferenceUpdated gitRefUpdated;
+  private final Project.NameKey projectName;
+  private final Repository repository;
+  private final BatchRefUpdate batch;
+  private final CommitBuilder commit;
+  private boolean allowEmpty;
+  private boolean insertChangeId;
+  private boolean closeRepository;
+  private IdentifiedUser author;
+
+  @Inject
+  public MetaDataUpdate(
+      GitReferenceUpdated gitRefUpdated,
+      @Assisted Project.NameKey projectName,
+      @Assisted Repository repository,
+      @Assisted @Nullable BatchRefUpdate batch) {
+    this.gitRefUpdated = gitRefUpdated;
+    this.projectName = projectName;
+    this.repository = repository;
+    this.batch = batch;
+    this.commit = new CommitBuilder();
+  }
+
+  public MetaDataUpdate(
+      GitReferenceUpdated gitRefUpdated, Project.NameKey projectName, Repository repository) {
+    this(gitRefUpdated, projectName, repository, null);
+  }
+
+  /** Set the commit message used when committing the update. */
+  public void setMessage(String message) {
+    getCommitBuilder().setMessage(message);
+  }
+
+  public void setAuthor(IdentifiedUser author) {
+    this.author = author;
+    getCommitBuilder()
+        .setAuthor(
+            author.newCommitterIdent(
+                getCommitBuilder().getCommitter().getWhen(),
+                getCommitBuilder().getCommitter().getTimeZone()));
+  }
+
+  public void setAllowEmpty(boolean allowEmpty) {
+    this.allowEmpty = allowEmpty;
+  }
+
+  public void setInsertChangeId(boolean insertChangeId) {
+    this.insertChangeId = insertChangeId;
+  }
+
+  public void setCloseRepository(boolean closeRepository) {
+    this.closeRepository = closeRepository;
+  }
+
+  /** @return batch in which to run the update, or {@code null} for no batch. */
+  BatchRefUpdate getBatch() {
+    return batch;
+  }
+
+  /** Close the cached Repository handle. */
+  @Override
+  public void close() {
+    if (closeRepository) {
+      getRepository().close();
+    }
+  }
+
+  public Project.NameKey getProjectName() {
+    return projectName;
+  }
+
+  public Repository getRepository() {
+    return repository;
+  }
+
+  boolean allowEmpty() {
+    return allowEmpty;
+  }
+
+  boolean insertChangeId() {
+    return insertChangeId;
+  }
+
+  public CommitBuilder getCommitBuilder() {
+    return commit;
+  }
+
+  protected void fireGitRefUpdatedEvent(RefUpdate ru) {
+    gitRefUpdated.fire(projectName, ru, author == null ? null : author.state());
+  }
+}
diff --git a/java/com/google/gerrit/server/git/meta/TabFile.java b/java/com/google/gerrit/server/git/meta/TabFile.java
new file mode 100644
index 0000000..4c0378a
--- /dev/null
+++ b/java/com/google/gerrit/server/git/meta/TabFile.java
@@ -0,0 +1,143 @@
+// Copyright (C) 2015 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.google.gerrit.server.git.meta;
+
+import static com.google.common.collect.ImmutableList.toImmutableList;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.server.git.ValidationError;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class TabFile {
+  @FunctionalInterface
+  public interface Parser {
+    String parse(String str);
+  }
+
+  public static Parser TRIM = String::trim;
+
+  protected static class Row {
+    public String left;
+    public String right;
+
+    public Row(String left, String right) {
+      this.left = left;
+      this.right = right;
+    }
+  }
+
+  protected static List<Row> parse(
+      String text, String filename, Parser left, Parser right, ValidationError.Sink errors)
+      throws IOException {
+    List<Row> rows = new ArrayList<>();
+    BufferedReader br = new BufferedReader(new StringReader(text));
+    String s;
+    for (int lineNumber = 1; (s = br.readLine()) != null; lineNumber++) {
+      if (s.isEmpty() || s.startsWith("#")) {
+        continue;
+      }
+
+      int tab = s.indexOf('\t');
+      if (tab < 0) {
+        errors.error(new ValidationError(filename, lineNumber, "missing tab delimiter"));
+        continue;
+      }
+
+      Row row = new Row(s.substring(0, tab), s.substring(tab + 1));
+      rows.add(row);
+
+      if (left != null) {
+        row.left = left.parse(row.left);
+      }
+      if (right != null) {
+        row.right = right.parse(row.right);
+      }
+    }
+    return rows;
+  }
+
+  protected static Map<String, String> toMap(List<Row> rows) {
+    Map<String, String> map = new HashMap<>(rows.size());
+    for (Row row : rows) {
+      map.put(row.left, row.right);
+    }
+    return map;
+  }
+
+  protected static String asText(String left, String right, Map<String, String> entries) {
+    if (entries.isEmpty()) {
+      return null;
+    }
+
+    List<Row> rows = new ArrayList<>(entries.size());
+    for (String key : sort(entries.keySet())) {
+      rows.add(new Row(key, entries.get(key)));
+    }
+    return asText(left, right, rows);
+  }
+
+  protected static String asText(String left, String right, List<Row> rows) {
+    if (rows.isEmpty()) {
+      return null;
+    }
+
+    left = "# " + left;
+    int leftLen = left.length();
+    for (Row row : rows) {
+      leftLen = Math.max(leftLen, row.left.length());
+    }
+
+    StringBuilder buf = new StringBuilder();
+    buf.append(pad(leftLen, left));
+    buf.append('\t');
+    buf.append(right);
+    buf.append('\n');
+
+    buf.append('#');
+    buf.append('\n');
+
+    for (Row row : rows) {
+      buf.append(pad(leftLen, row.left));
+      buf.append('\t');
+      buf.append(row.right);
+      buf.append('\n');
+    }
+    return buf.toString();
+  }
+
+  protected static <T extends Comparable<? super T>> ImmutableList<T> sort(Collection<T> m) {
+    return m.stream().sorted().collect(toImmutableList());
+  }
+
+  protected static String pad(int len, String src) {
+    if (len <= src.length()) {
+      return src;
+    }
+
+    StringBuilder r = new StringBuilder(len);
+    r.append(src);
+    while (r.length() < len) {
+      r.append(' ');
+    }
+    return r.toString();
+  }
+}
diff --git a/java/com/google/gerrit/server/git/meta/VersionedMetaData.java b/java/com/google/gerrit/server/git/meta/VersionedMetaData.java
new file mode 100644
index 0000000..8b14177
--- /dev/null
+++ b/java/com/google/gerrit/server/git/meta/VersionedMetaData.java
@@ -0,0 +1,588 @@
+// Copyright (C) 2010 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.google.gerrit.server.git.meta;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.git.LockFailureException;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import org.eclipse.jgit.dircache.DirCache;
+import org.eclipse.jgit.dircache.DirCacheBuilder;
+import org.eclipse.jgit.dircache.DirCacheEditor;
+import org.eclipse.jgit.dircache.DirCacheEditor.DeletePath;
+import org.eclipse.jgit.dircache.DirCacheEditor.PathEdit;
+import org.eclipse.jgit.dircache.DirCacheEntry;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.IncorrectObjectTypeException;
+import org.eclipse.jgit.errors.MissingObjectException;
+import org.eclipse.jgit.lib.AnyObjectId;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.FileMode;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.ObjectLoader;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevTree;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.ReceiveCommand;
+import org.eclipse.jgit.treewalk.TreeWalk;
+import org.eclipse.jgit.util.ChangeIdUtil;
+import org.eclipse.jgit.util.RawParseUtils;
+
+/**
+ * Support for metadata stored within a version controlled branch.
+ *
+ * <p>Implementors are responsible for supplying implementations of the onLoad and onSave methods to
+ * read from the repository, or format an update that can later be written back to the repository.
+ */
+public abstract class VersionedMetaData {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  /**
+   * Path information that does not hold references to any repository data structures, allowing the
+   * application to retain this object for long periods of time.
+   */
+  public static class PathInfo {
+    public final FileMode fileMode;
+    public final String path;
+    public final ObjectId objectId;
+
+    protected PathInfo(TreeWalk tw) {
+      fileMode = tw.getFileMode(0);
+      path = tw.getPathString();
+      objectId = tw.getObjectId(0);
+    }
+  }
+
+  /** The revision at which the data was loaded. Is null for data yet to be created. */
+  @Nullable protected RevCommit revision;
+
+  protected Project.NameKey projectName;
+  protected RevWalk rw;
+  protected ObjectReader reader;
+  protected ObjectInserter inserter;
+  protected DirCache newTree;
+
+  /** @return name of the reference storing this configuration. */
+  protected abstract String getRefName();
+
+  /** Set up the metadata, parsing any state from the loaded revision. */
+  protected abstract void onLoad() throws IOException, ConfigInvalidException;
+
+  /**
+   * Save any changes to the metadata in a commit.
+   *
+   * @return true if the commit should proceed, false to abort.
+   * @throws IOException
+   * @throws ConfigInvalidException
+   */
+  protected abstract boolean onSave(CommitBuilder commit)
+      throws IOException, ConfigInvalidException;
+
+  /** @return revision of the metadata that was loaded. */
+  @Nullable
+  public ObjectId getRevision() {
+    return revision != null ? revision.copy() : null;
+  }
+
+  /**
+   * Load the current version from the branch.
+   *
+   * <p>The repository is not held after the call completes, allowing the application to retain this
+   * object for long periods of time.
+   *
+   * @param projectName the name of the project
+   * @param db repository to access.
+   * @throws IOException
+   * @throws ConfigInvalidException
+   */
+  public void load(Project.NameKey projectName, Repository db)
+      throws IOException, ConfigInvalidException {
+    Ref ref = db.getRefDatabase().exactRef(getRefName());
+    load(projectName, db, ref != null ? ref.getObjectId() : null);
+  }
+
+  /**
+   * Load a specific version from the repository.
+   *
+   * <p>This method is primarily useful for applying updates to a specific revision that was shown
+   * to an end-user in the user interface. If there are conflicts with another user's concurrent
+   * changes, these will be automatically detected at commit time.
+   *
+   * <p>The repository is not held after the call completes, allowing the application to retain this
+   * object for long periods of time.
+   *
+   * @param projectName the name of the project
+   * @param db repository to access.
+   * @param id revision to load.
+   * @throws IOException
+   * @throws ConfigInvalidException
+   */
+  public void load(Project.NameKey projectName, Repository db, @Nullable ObjectId id)
+      throws IOException, ConfigInvalidException {
+    try (RevWalk walk = new RevWalk(db)) {
+      load(projectName, walk, id);
+    }
+  }
+
+  /**
+   * Load a specific version from an open walk.
+   *
+   * <p>This method is primarily useful for applying updates to a specific revision that was shown
+   * to an end-user in the user interface. If there are conflicts with another user's concurrent
+   * changes, these will be automatically detected at commit time.
+   *
+   * <p>The caller retains ownership of the walk and is responsible for closing it. However, this
+   * instance does not hold a reference to the walk or the repository after the call completes,
+   * allowing the application to retain this object for long periods of time.
+   *
+   * @param projectName the name of the project
+   * @param walk open walk to access to access.
+   * @param id revision to load.
+   * @throws IOException
+   * @throws ConfigInvalidException
+   */
+  public void load(Project.NameKey projectName, RevWalk walk, ObjectId id)
+      throws IOException, ConfigInvalidException {
+    this.projectName = projectName;
+    this.rw = walk;
+    this.reader = walk.getObjectReader();
+    try {
+      revision = id != null ? walk.parseCommit(id) : null;
+      onLoad();
+    } finally {
+      this.rw = null;
+      this.reader = null;
+    }
+  }
+
+  public void load(MetaDataUpdate update) throws IOException, ConfigInvalidException {
+    load(update.getProjectName(), update.getRepository());
+  }
+
+  public void load(MetaDataUpdate update, ObjectId id) throws IOException, ConfigInvalidException {
+    load(update.getProjectName(), update.getRepository(), id);
+  }
+
+  /**
+   * Update this metadata branch, recording a new commit on its reference. This method mutates its
+   * receiver.
+   *
+   * @param update helper information to define the update that will occur.
+   * @return the commit that was created
+   * @throws IOException if there is a storage problem and the update cannot be executed as
+   *     requested or if it failed because of a concurrent update to the same reference
+   */
+  public RevCommit commit(MetaDataUpdate update) throws IOException {
+    try (BatchMetaDataUpdate batch = openUpdate(update)) {
+      batch.write(update.getCommitBuilder());
+      return batch.commit();
+    }
+  }
+
+  /**
+   * Creates a new commit and a new ref based on this commit. This method mutates its receiver.
+   *
+   * @param update helper information to define the update that will occur.
+   * @param refName name of the ref that should be created
+   * @return the commit that was created
+   * @throws IOException if there is a storage problem and the update cannot be executed as
+   *     requested or if it failed because of a concurrent update to the same reference
+   */
+  public RevCommit commitToNewRef(MetaDataUpdate update, String refName) throws IOException {
+    try (BatchMetaDataUpdate batch = openUpdate(update)) {
+      batch.write(update.getCommitBuilder());
+      return batch.createRef(refName);
+    }
+  }
+
+  public interface BatchMetaDataUpdate extends AutoCloseable {
+    void write(CommitBuilder commit) throws IOException;
+
+    void write(VersionedMetaData config, CommitBuilder commit) throws IOException;
+
+    RevCommit createRef(String refName) throws IOException;
+
+    RevCommit commit() throws IOException;
+
+    RevCommit commitAt(ObjectId revision) throws IOException;
+
+    @Override
+    void close();
+  }
+
+  /**
+   * Open a batch of updates to the same metadata ref.
+   *
+   * <p>This allows making multiple commits to a single metadata ref, at the end of which is a
+   * single ref update. For batching together updates to multiple refs (each consisting of one or
+   * more commits against their respective refs), create the {@link MetaDataUpdate} with a {@link
+   * BatchRefUpdate}.
+   *
+   * <p>A ref update produced by this {@link BatchMetaDataUpdate} is only committed if there is no
+   * associated {@link BatchRefUpdate}. As a result, the configured ref updated event is not fired
+   * if there is an associated batch.
+   *
+   * @param update helper info about the update.
+   * @throws IOException if the update failed.
+   */
+  public BatchMetaDataUpdate openUpdate(MetaDataUpdate update) throws IOException {
+    final Repository db = update.getRepository();
+
+    inserter = db.newObjectInserter();
+    reader = inserter.newReader();
+    final RevWalk rw = new RevWalk(reader);
+    final RevTree tree = revision != null ? rw.parseTree(revision) : null;
+    newTree = readTree(tree);
+    return new BatchMetaDataUpdate() {
+      RevCommit src = revision;
+      AnyObjectId srcTree = tree;
+
+      @Override
+      public void write(CommitBuilder commit) throws IOException {
+        write(VersionedMetaData.this, commit);
+      }
+
+      private boolean doSave(VersionedMetaData config, CommitBuilder commit) throws IOException {
+        DirCache nt = config.newTree;
+        ObjectReader r = config.reader;
+        ObjectInserter i = config.inserter;
+        RevCommit c = config.revision;
+        try {
+          config.newTree = newTree;
+          config.reader = reader;
+          config.inserter = inserter;
+          config.revision = src;
+          return config.onSave(commit);
+        } catch (ConfigInvalidException e) {
+          throw new IOException(
+              "Cannot update " + getRefName() + " in " + db.getDirectory() + ": " + e.getMessage(),
+              e);
+        } finally {
+          config.newTree = nt;
+          config.reader = r;
+          config.inserter = i;
+          config.revision = c;
+        }
+      }
+
+      @Override
+      public void write(VersionedMetaData config, CommitBuilder commit) throws IOException {
+        checkSameRef(config);
+        if (!doSave(config, commit)) {
+          return;
+        }
+
+        ObjectId res = newTree.writeTree(inserter);
+        if (res.equals(srcTree) && !update.allowEmpty() && (commit.getTreeId() == null)) {
+          // If there are no changes to the content, don't create the commit.
+          return;
+        }
+
+        // If changes are made to the DirCache and those changes are written as
+        // a commit and then the tree ID is set for the CommitBuilder, then
+        // those previous DirCache changes will be ignored and the commit's
+        // tree will be replaced with the ID in the CommitBuilder. The same is
+        // true if you explicitly set tree ID in a commit and then make changes
+        // to the DirCache; that tree ID will be ignored and replaced by that of
+        // the tree for the updated DirCache.
+        if (commit.getTreeId() == null) {
+          commit.setTreeId(res);
+        } else {
+          // In this case, the caller populated the tree without using DirCache.
+          res = commit.getTreeId();
+        }
+
+        if (src != null) {
+          commit.addParentId(src);
+        }
+
+        if (update.insertChangeId()) {
+          ObjectId id =
+              ChangeIdUtil.computeChangeId(
+                  res,
+                  getRevision(),
+                  commit.getAuthor(),
+                  commit.getCommitter(),
+                  commit.getMessage());
+          commit.setMessage(ChangeIdUtil.insertId(commit.getMessage(), id));
+        }
+
+        src = rw.parseCommit(inserter.insert(commit));
+        srcTree = res;
+      }
+
+      private void checkSameRef(VersionedMetaData other) {
+        String thisRef = VersionedMetaData.this.getRefName();
+        String otherRef = other.getRefName();
+        checkArgument(
+            otherRef.equals(thisRef),
+            "cannot add %s for %s to %s on %s",
+            other.getClass().getSimpleName(),
+            otherRef,
+            BatchMetaDataUpdate.class.getSimpleName(),
+            thisRef);
+      }
+
+      @Override
+      public RevCommit createRef(String refName) throws IOException {
+        if (Objects.equals(src, revision)) {
+          return revision;
+        }
+        return updateRef(ObjectId.zeroId(), src, refName);
+      }
+
+      @Override
+      public RevCommit commit() throws IOException {
+        return commitAt(revision);
+      }
+
+      @Override
+      public RevCommit commitAt(ObjectId expected) throws IOException {
+        if (Objects.equals(src, expected)) {
+          return revision;
+        }
+        return updateRef(MoreObjects.firstNonNull(expected, ObjectId.zeroId()), src, getRefName());
+      }
+
+      @Override
+      public void close() {
+        newTree = null;
+
+        rw.close();
+        if (inserter != null) {
+          inserter.close();
+          inserter = null;
+        }
+
+        if (reader != null) {
+          reader.close();
+          reader = null;
+        }
+      }
+
+      private RevCommit updateRef(AnyObjectId oldId, AnyObjectId newId, String refName)
+          throws IOException {
+        BatchRefUpdate bru = update.getBatch();
+        if (bru != null) {
+          bru.addCommand(new ReceiveCommand(oldId.toObjectId(), newId.toObjectId(), refName));
+          inserter.flush();
+          revision = rw.parseCommit(newId);
+          return revision;
+        }
+
+        RefUpdate ru = db.updateRef(refName);
+        ru.setExpectedOldObjectId(oldId);
+        ru.setNewObjectId(newId);
+        ru.setRefLogIdent(update.getCommitBuilder().getAuthor());
+        String message = update.getCommitBuilder().getMessage();
+        if (message == null) {
+          message = "meta data update";
+        }
+        try (BufferedReader reader = new BufferedReader(new StringReader(message))) {
+          // read the subject line and use it as reflog message
+          ru.setRefLogMessage("commit: " + reader.readLine(), true);
+        }
+        inserter.flush();
+        RefUpdate.Result result = ru.update();
+        switch (result) {
+          case NEW:
+          case FAST_FORWARD:
+            revision = rw.parseCommit(ru.getNewObjectId());
+            update.fireGitRefUpdatedEvent(ru);
+            return revision;
+          case LOCK_FAILURE:
+            throw new LockFailureException(
+                "Cannot update "
+                    + ru.getName()
+                    + " in "
+                    + db.getDirectory()
+                    + ": "
+                    + ru.getResult(),
+                ru);
+          case FORCED:
+          case IO_FAILURE:
+          case NOT_ATTEMPTED:
+          case NO_CHANGE:
+          case REJECTED:
+          case REJECTED_CURRENT_BRANCH:
+          case RENAMED:
+          case REJECTED_MISSING_OBJECT:
+          case REJECTED_OTHER_REASON:
+          default:
+            throw new IOException(
+                "Cannot update "
+                    + ru.getName()
+                    + " in "
+                    + db.getDirectory()
+                    + ": "
+                    + ru.getResult());
+        }
+      }
+    };
+  }
+
+  protected DirCache readTree(RevTree tree)
+      throws IOException, MissingObjectException, IncorrectObjectTypeException {
+    DirCache dc = DirCache.newInCore();
+    if (tree != null) {
+      DirCacheBuilder b = dc.builder();
+      b.addTree(new byte[0], DirCacheEntry.STAGE_0, reader, tree);
+      b.finish();
+    }
+    return dc;
+  }
+
+  protected Config readConfig(String fileName) throws IOException, ConfigInvalidException {
+    Config rc = new Config();
+    String text = readUTF8(fileName);
+    if (!text.isEmpty()) {
+      try {
+        rc.fromText(text);
+      } catch (ConfigInvalidException err) {
+        StringBuilder msg =
+            new StringBuilder("Invalid config file ")
+                .append(fileName)
+                .append(" in commit ")
+                .append(revision.name());
+        if (err.getCause() != null) {
+          msg.append(": ").append(err.getCause());
+        }
+        throw new ConfigInvalidException(msg.toString(), err);
+      }
+    }
+    return rc;
+  }
+
+  protected String readUTF8(String fileName) throws IOException {
+    byte[] raw = readFile(fileName);
+    return raw.length != 0 ? RawParseUtils.decode(raw) : "";
+  }
+
+  protected byte[] readFile(String fileName) throws IOException {
+    if (revision == null) {
+      return new byte[] {};
+    }
+
+    logger.atFine().log(
+        "Read file '%s' from ref '%s' of project '%s' from revision '%s'",
+        fileName, getRefName(), projectName, revision.name());
+    try (TreeWalk tw = TreeWalk.forPath(reader, fileName, revision.getTree())) {
+      if (tw != null) {
+        ObjectLoader obj = reader.open(tw.getObjectId(0), Constants.OBJ_BLOB);
+        return obj.getCachedBytes(Integer.MAX_VALUE);
+      }
+    }
+    return new byte[] {};
+  }
+
+  @Nullable
+  protected ObjectId getObjectId(String fileName) throws IOException {
+    if (revision == null) {
+      return null;
+    }
+
+    try (TreeWalk tw = TreeWalk.forPath(reader, fileName, revision.getTree())) {
+      if (tw != null) {
+        return tw.getObjectId(0);
+      }
+    }
+
+    return null;
+  }
+
+  public List<PathInfo> getPathInfos(boolean recursive) throws IOException {
+    try (TreeWalk tw = new TreeWalk(reader)) {
+      tw.addTree(revision.getTree());
+      tw.setRecursive(recursive);
+      List<PathInfo> paths = new ArrayList<>();
+      while (tw.next()) {
+        paths.add(new PathInfo(tw));
+      }
+      return paths;
+    }
+  }
+
+  protected static void set(
+      Config rc, String section, String subsection, String name, String value) {
+    if (value != null) {
+      rc.setString(section, subsection, name, value);
+    } else {
+      rc.unset(section, subsection, name);
+    }
+  }
+
+  protected static void set(
+      Config rc, String section, String subsection, String name, boolean value) {
+    if (value) {
+      rc.setBoolean(section, subsection, name, value);
+    } else {
+      rc.unset(section, subsection, name);
+    }
+  }
+
+  protected static <E extends Enum<?>> void set(
+      Config rc, String section, String subsection, String name, E value, E defaultValue) {
+    if (value != defaultValue) {
+      rc.setEnum(section, subsection, name, value);
+    } else {
+      rc.unset(section, subsection, name);
+    }
+  }
+
+  protected void saveConfig(String fileName, Config cfg) throws IOException {
+    saveUTF8(fileName, cfg.toText());
+  }
+
+  protected void saveUTF8(String fileName, String text) throws IOException {
+    saveFile(fileName, text != null ? Constants.encode(text) : null);
+  }
+
+  protected void saveFile(String fileName, byte[] raw) throws IOException {
+    logger.atFine().log(
+        "Save file '%s' in ref '%s' of project '%s'", fileName, getRefName(), projectName);
+    DirCacheEditor editor = newTree.editor();
+    if (raw != null && 0 < raw.length) {
+      final ObjectId blobId = inserter.insert(Constants.OBJ_BLOB, raw);
+      editor.add(
+          new PathEdit(fileName) {
+            @Override
+            public void apply(DirCacheEntry ent) {
+              ent.setFileMode(FileMode.REGULAR_FILE);
+              ent.setObjectId(blobId);
+            }
+          });
+    } else {
+      editor.add(new DeletePath(fileName));
+    }
+    editor.finish();
+  }
+}
diff --git a/java/com/google/gerrit/server/git/receive/AllRefsWatcher.java b/java/com/google/gerrit/server/git/receive/AllRefsWatcher.java
new file mode 100644
index 0000000..c092c43
--- /dev/null
+++ b/java/com/google/gerrit/server/git/receive/AllRefsWatcher.java
@@ -0,0 +1,50 @@
+// Copyright (C) 2017 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.google.gerrit.server.git.receive;
+
+import static com.google.common.base.Preconditions.checkState;
+
+import com.google.gerrit.server.git.HookUtil;
+import java.util.Map;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.transport.AdvertiseRefsHook;
+import org.eclipse.jgit.transport.BaseReceivePack;
+import org.eclipse.jgit.transport.ServiceMayNotContinueException;
+import org.eclipse.jgit.transport.UploadPack;
+
+/**
+ * Hook that scans all refs and holds onto the results reference.
+ *
+ * <p>This allows a caller who has an {@code AllRefsWatcher} instance to get the full map of refs in
+ * the repo, even if refs are filtered by a later hook or filter.
+ */
+class AllRefsWatcher implements AdvertiseRefsHook {
+  private Map<String, Ref> allRefs;
+
+  @Override
+  public void advertiseRefs(BaseReceivePack rp) throws ServiceMayNotContinueException {
+    allRefs = HookUtil.ensureAllRefsAdvertised(rp);
+  }
+
+  @Override
+  public void advertiseRefs(UploadPack uploadPack) {
+    throw new UnsupportedOperationException();
+  }
+
+  Map<String, Ref> getAllRefs() {
+    checkState(allRefs != null, "getAllRefs() only valid after refs were advertised");
+    return allRefs;
+  }
+}
diff --git a/java/com/google/gerrit/server/git/receive/AsyncReceiveCommits.java b/java/com/google/gerrit/server/git/receive/AsyncReceiveCommits.java
new file mode 100644
index 0000000..882f208
--- /dev/null
+++ b/java/com/google/gerrit/server/git/receive/AsyncReceiveCommits.java
@@ -0,0 +1,369 @@
+// Copyright (C) 2012 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.google.gerrit.server.git.receive;
+
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.Capable;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.metrics.Counter0;
+import com.google.gerrit.metrics.Description;
+import com.google.gerrit.metrics.Description.Units;
+import com.google.gerrit.metrics.Field;
+import com.google.gerrit.metrics.Histogram1;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.metrics.Timer1;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.UsedAt;
+import com.google.gerrit.server.config.ConfigUtil;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.ReceiveCommitsExecutor;
+import com.google.gerrit.server.git.DefaultAdvertiseRefsHook;
+import com.google.gerrit.server.git.MultiProgressMonitor;
+import com.google.gerrit.server.git.ProjectRunnable;
+import com.google.gerrit.server.git.TransferConfig;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackend.RefFilterOptions;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.project.ContributorAgreementsChecker;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gerrit.server.util.MagicBranch;
+import com.google.gerrit.server.util.RequestScopePropagator;
+import com.google.inject.Inject;
+import com.google.inject.PrivateModule;
+import com.google.inject.Provider;
+import com.google.inject.Provides;
+import com.google.inject.Singleton;
+import com.google.inject.assistedinject.Assisted;
+import com.google.inject.assistedinject.FactoryModuleBuilder;
+import com.google.inject.name.Named;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.transport.AdvertiseRefsHook;
+import org.eclipse.jgit.transport.AdvertiseRefsHookChain;
+import org.eclipse.jgit.transport.PreReceiveHook;
+import org.eclipse.jgit.transport.ReceiveCommand;
+import org.eclipse.jgit.transport.ReceiveCommand.Result;
+import org.eclipse.jgit.transport.ReceivePack;
+
+/**
+ * Hook that delegates to {@link ReceiveCommits} in a worker thread.
+ *
+ * <p>Since the work that {@link ReceiveCommits} does may take a long, potentially unbounded amount
+ * of time, it runs in the background so it can be monitored for timeouts and cancelled, and have
+ * stalls reported to the user from the main thread.
+ */
+public class AsyncReceiveCommits implements PreReceiveHook {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final String TIMEOUT_NAME = "ReceiveCommitsOverallTimeout";
+
+  public interface Factory {
+    AsyncReceiveCommits create(
+        ProjectState projectState,
+        IdentifiedUser user,
+        Repository repository,
+        @Nullable MessageSender messageSender);
+  }
+
+  public static class Module extends PrivateModule {
+    @Override
+    public void configure() {
+      install(new FactoryModuleBuilder().build(AsyncReceiveCommits.Factory.class));
+      expose(AsyncReceiveCommits.Factory.class);
+      // Don't expose the binding for ReceiveCommits.Factory. All callers should
+      // be using AsyncReceiveCommits.Factory instead.
+      install(new FactoryModuleBuilder().build(ReceiveCommits.Factory.class));
+      install(new FactoryModuleBuilder().build(BranchCommitValidator.Factory.class));
+    }
+
+    @Provides
+    @Singleton
+    @Named(TIMEOUT_NAME)
+    long getTimeoutMillis(@GerritServerConfig Config cfg) {
+      return ConfigUtil.getTimeUnit(
+          cfg, "receive", null, "timeout", TimeUnit.MINUTES.toMillis(4), TimeUnit.MILLISECONDS);
+    }
+  }
+
+  private class Worker implements ProjectRunnable {
+    final MultiProgressMonitor progress;
+
+    private final Collection<ReceiveCommand> commands;
+
+    private Worker(Collection<ReceiveCommand> commands) {
+      this.commands = commands;
+      progress = new MultiProgressMonitor(new MessageSenderOutputStream(), "Processing changes");
+    }
+
+    @Override
+    public void run() {
+      receiveCommits.processCommands(commands, progress);
+    }
+
+    @Override
+    public Project.NameKey getProjectNameKey() {
+      return receiveCommits.getProject().getNameKey();
+    }
+
+    @Override
+    public String getRemoteName() {
+      return null;
+    }
+
+    @Override
+    public boolean hasCustomizedPrint() {
+      return true;
+    }
+
+    @Override
+    public String toString() {
+      return "receive-commits";
+    }
+
+    void sendMessages() {
+      receiveCommits.sendMessages();
+    }
+
+    private class MessageSenderOutputStream extends OutputStream {
+      @Override
+      public void write(int b) {
+        receiveCommits.getMessageSender().sendBytes(new byte[] {(byte) b});
+      }
+
+      @Override
+      public void write(byte[] what, int off, int len) {
+        receiveCommits.getMessageSender().sendBytes(what, off, len);
+      }
+
+      @Override
+      public void write(byte[] what) {
+        receiveCommits.getMessageSender().sendBytes(what);
+      }
+
+      @Override
+      public void flush() {
+        receiveCommits.getMessageSender().flush();
+      }
+    }
+  }
+
+  @Singleton
+  private static class Metrics {
+    private final Histogram1<ResultChangeIds.Key> changes;
+    private final Timer1<String> latencyPerChange;
+    private final Counter0 timeouts;
+
+    @Inject
+    Metrics(MetricMaker metricMaker) {
+      changes =
+          metricMaker.newHistogram(
+              "receivecommits/changes",
+              new Description("number of changes uploaded in a single push.").setCumulative(),
+              Field.ofEnum(
+                  ResultChangeIds.Key.class,
+                  "type",
+                  "type of update (replace, create, autoclose)"));
+      latencyPerChange =
+          metricMaker.newTimer(
+              "receivecommits/latency",
+              new Description("average delay per updated change")
+                  .setUnit(Units.MILLISECONDS)
+                  .setCumulative(),
+              Field.ofString("type", "type of update (create/replace, autoclose)"));
+
+      timeouts =
+          metricMaker.newCounter(
+              "receivecommits/timeout", new Description("rate of push timeouts").setRate());
+    }
+  }
+
+  private final Metrics metrics;
+  private final ReceiveCommits receiveCommits;
+  private final ResultChangeIds resultChangeIds;
+  private final PermissionBackend.ForProject perm;
+  private final ReceivePack receivePack;
+  private final ExecutorService executor;
+  private final RequestScopePropagator scopePropagator;
+  private final ReceiveConfig receiveConfig;
+  private final ContributorAgreementsChecker contributorAgreements;
+  private final long timeoutMillis;
+  private final ProjectState projectState;
+  private final IdentifiedUser user;
+  private final Repository repo;
+  private final AllRefsWatcher allRefsWatcher;
+
+  @Inject
+  AsyncReceiveCommits(
+      ReceiveCommits.Factory factory,
+      PermissionBackend permissionBackend,
+      Provider<InternalChangeQuery> queryProvider,
+      @ReceiveCommitsExecutor ExecutorService executor,
+      RequestScopePropagator scopePropagator,
+      ReceiveConfig receiveConfig,
+      TransferConfig transferConfig,
+      Provider<LazyPostReceiveHookChain> lazyPostReceive,
+      ContributorAgreementsChecker contributorAgreements,
+      Metrics metrics,
+      @Named(TIMEOUT_NAME) long timeoutMillis,
+      @Assisted ProjectState projectState,
+      @Assisted IdentifiedUser user,
+      @Assisted Repository repo,
+      @Assisted @Nullable MessageSender messageSender)
+      throws PermissionBackendException {
+    this.executor = executor;
+    this.scopePropagator = scopePropagator;
+    this.receiveConfig = receiveConfig;
+    this.contributorAgreements = contributorAgreements;
+    this.timeoutMillis = timeoutMillis;
+    this.projectState = projectState;
+    this.user = user;
+    this.repo = repo;
+    this.metrics = metrics;
+
+    Project.NameKey projectName = projectState.getNameKey();
+    receivePack = new ReceivePack(repo);
+    receivePack.setAllowCreates(true);
+    receivePack.setAllowDeletes(true);
+    receivePack.setAllowNonFastForwards(true);
+    receivePack.setRefLogIdent(user.newRefLogIdent());
+    receivePack.setTimeout(transferConfig.getTimeout());
+    receivePack.setMaxObjectSizeLimit(projectState.getEffectiveMaxObjectSizeLimit().value);
+    receivePack.setCheckReceivedObjects(projectState.getConfig().getCheckReceivedObjects());
+    receivePack.setRefFilter(new ReceiveRefFilter());
+    receivePack.setAllowPushOptions(true);
+    receivePack.setPreReceiveHook(this);
+    receivePack.setPostReceiveHook(lazyPostReceive.get());
+
+    // If the user lacks READ permission, some references may be filtered and hidden from view.
+    // Check objects mentioned inside the incoming pack file are reachable from visible refs.
+    this.perm = permissionBackend.user(user).project(projectName);
+    try {
+      projectState.checkStatePermitsRead();
+      this.perm.check(ProjectPermission.READ);
+    } catch (AuthException | ResourceConflictException e) {
+      receivePack.setCheckReferencedObjectsAreReachable(
+          receiveConfig.checkReferencedObjectsAreReachable);
+    }
+
+    List<AdvertiseRefsHook> advHooks = new ArrayList<>(4);
+    allRefsWatcher = new AllRefsWatcher();
+    advHooks.add(allRefsWatcher);
+    advHooks.add(
+        new DefaultAdvertiseRefsHook(perm, RefFilterOptions.builder().setFilterMeta(true).build()));
+    advHooks.add(new ReceiveCommitsAdvertiseRefsHook(queryProvider, projectName));
+    advHooks.add(new HackPushNegotiateHook());
+    receivePack.setAdvertiseRefsHook(AdvertiseRefsHookChain.newChain(advHooks));
+
+    resultChangeIds = new ResultChangeIds();
+    receiveCommits =
+        factory.create(
+            projectState, user, receivePack, allRefsWatcher, messageSender, resultChangeIds);
+    receiveCommits.init();
+  }
+
+  /** Determine if the user can upload commits. */
+  public Capable canUpload() throws IOException, PermissionBackendException {
+    try {
+      perm.check(ProjectPermission.PUSH_AT_LEAST_ONE_REF);
+    } catch (AuthException e) {
+      return new Capable("Upload denied for project '" + projectState.getName() + "'");
+    }
+
+    try {
+      contributorAgreements.check(projectState.getNameKey(), user);
+    } catch (AuthException e) {
+      return new Capable(e.getMessage());
+    }
+
+    if (receiveConfig.checkMagicRefs) {
+      return MagicBranch.checkMagicBranchRefs(repo, projectState.getProject());
+    }
+    return Capable.OK;
+  }
+
+  @Override
+  public void onPreReceive(ReceivePack rp, Collection<ReceiveCommand> commands) {
+    if (commands.stream().anyMatch(c -> c.getResult() != Result.NOT_ATTEMPTED)) {
+      // Stop processing when command was already processed by previously invoked
+      // pre-receive hooks
+      return;
+    }
+
+    long startNanos = System.nanoTime();
+    Worker w = new Worker(commands);
+    try {
+      w.progress.waitFor(
+          executor.submit(scopePropagator.wrap(w)), timeoutMillis, TimeUnit.MILLISECONDS);
+    } catch (ExecutionException e) {
+      metrics.timeouts.increment();
+      logger.atWarning().withCause(e).log(
+          "Error in ReceiveCommits while processing changes for project %s",
+          projectState.getName());
+      rp.sendError("internal error while processing changes");
+      // ReceiveCommits has tried its best to catch errors, so anything at this
+      // point is very bad.
+      for (ReceiveCommand c : commands) {
+        if (c.getResult() == Result.NOT_ATTEMPTED) {
+          c.setResult(Result.REJECTED_OTHER_REASON, "internal error");
+        }
+      }
+    } finally {
+      w.sendMessages();
+    }
+
+    long deltaNanos = System.nanoTime() - startNanos;
+    int totalChanges = 0;
+    for (ResultChangeIds.Key key : ResultChangeIds.Key.values()) {
+      List<Change.Id> ids = resultChangeIds.get(key);
+      metrics.changes.record(key, ids.size());
+      totalChanges += ids.size();
+    }
+
+    if (totalChanges > 0) {
+      metrics.latencyPerChange.record(
+          resultChangeIds.get(ResultChangeIds.Key.AUTOCLOSED).isEmpty()
+              ? "CREATE_REPLACE"
+              : ResultChangeIds.Key.AUTOCLOSED.name(),
+          deltaNanos / totalChanges,
+          NANOSECONDS);
+    }
+  }
+
+  /** Returns the Change.Ids that were processed in onPreReceive */
+  @UsedAt(UsedAt.Project.GOOGLE)
+  public ResultChangeIds getResultChangeIds() {
+    return resultChangeIds;
+  }
+
+  public ReceivePack getReceivePack() {
+    return receivePack;
+  }
+}
diff --git a/java/com/google/gerrit/server/git/receive/BUILD b/java/com/google/gerrit/server/git/receive/BUILD
new file mode 100644
index 0000000..f762611
--- /dev/null
+++ b/java/com/google/gerrit/server/git/receive/BUILD
@@ -0,0 +1,25 @@
+java_library(
+    name = "receive",
+    srcs = glob(["**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/common:annotations",
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/metrics",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/server/logging",
+        "//java/com/google/gerrit/server/util/time",
+        "//java/com/google/gerrit/util/cli",
+        "//lib:args4j",
+        "//lib:guava",
+        "//lib:gwtorm",
+        "//lib/auto:auto-value",
+        "//lib/auto:auto-value-annotations",
+        "//lib/flogger:api",
+        "//lib/guice",
+        "//lib/guice:guice-assistedinject",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+    ],
+)
diff --git a/java/com/google/gerrit/server/git/receive/BranchCommitValidator.java b/java/com/google/gerrit/server/git/receive/BranchCommitValidator.java
new file mode 100644
index 0000000..64f54d6
--- /dev/null
+++ b/java/com/google/gerrit/server/git/receive/BranchCommitValidator.java
@@ -0,0 +1,132 @@
+// 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.
+
+package com.google.gerrit.server.git.receive;
+
+import static org.eclipse.jgit.transport.ReceiveCommand.Result.REJECTED_OTHER_REASON;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RevId;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.events.CommitReceivedEvent;
+import com.google.gerrit.server.git.validators.CommitValidationException;
+import com.google.gerrit.server.git.validators.CommitValidationMessage;
+import com.google.gerrit.server.git.validators.CommitValidators;
+import com.google.gerrit.server.git.validators.ValidationMessage;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.ssh.SshInfo;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.util.List;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.notes.NoteMap;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.transport.ReceiveCommand;
+
+/** Validates single commits for a branch. */
+public class BranchCommitValidator {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final CommitValidators.Factory commitValidatorsFactory;
+  private final IdentifiedUser user;
+  private final PermissionBackend.ForProject permissions;
+  private final Project project;
+  private final Branch.NameKey branch;
+  private final SshInfo sshInfo;
+
+  interface Factory {
+    BranchCommitValidator create(
+        ProjectState projectState, Branch.NameKey branch, IdentifiedUser user);
+  }
+
+  @Inject
+  BranchCommitValidator(
+      CommitValidators.Factory commitValidatorsFactory,
+      PermissionBackend permissionBackend,
+      SshInfo sshInfo,
+      @Assisted ProjectState projectState,
+      @Assisted Branch.NameKey branch,
+      @Assisted IdentifiedUser user) {
+    this.sshInfo = sshInfo;
+    this.user = user;
+    this.branch = branch;
+    this.commitValidatorsFactory = commitValidatorsFactory;
+    project = projectState.getProject();
+    permissions = permissionBackend.user(user).project(project.getNameKey());
+  }
+
+  /**
+   * Validates a single commit. If the commit does not validate, the command is rejected.
+   *
+   * @param objectReader the object reader to use.
+   * @param cmd the ReceiveCommand executing the push.
+   * @param commit the commit being validated.
+   * @param isMerged whether this is a merge commit created by magicBranch --merge option
+   * @param change the change for which this is a new patchset.
+   */
+  public boolean validCommit(
+      ObjectReader objectReader,
+      ReceiveCommand cmd,
+      RevCommit commit,
+      boolean isMerged,
+      List<ValidationMessage> messages,
+      NoteMap rejectCommits,
+      @Nullable Change change)
+      throws IOException {
+    try (CommitReceivedEvent receiveEvent =
+        new CommitReceivedEvent(cmd, project, branch.get(), objectReader, commit, user)) {
+      CommitValidators validators;
+      if (isMerged) {
+        validators =
+            commitValidatorsFactory.forMergedCommits(permissions, branch, user.asIdentifiedUser());
+      } else {
+        validators =
+            commitValidatorsFactory.forReceiveCommits(
+                permissions,
+                branch,
+                user.asIdentifiedUser(),
+                sshInfo,
+                rejectCommits,
+                receiveEvent.revWalk,
+                change);
+      }
+
+      for (CommitValidationMessage m : validators.validate(receiveEvent)) {
+        messages.add(
+            new CommitValidationMessage(messageForCommit(commit, m.getMessage()), m.getType()));
+      }
+    } catch (CommitValidationException e) {
+      logger.atFine().log("Commit validation failed on %s", commit.name());
+      for (CommitValidationMessage m : e.getMessages()) {
+        // The non-error messages may contain background explanation for the
+        // fatal error, so have to preserve all messages.
+        messages.add(
+            new CommitValidationMessage(messageForCommit(commit, m.getMessage()), m.getType()));
+      }
+      cmd.setResult(REJECTED_OTHER_REASON, messageForCommit(commit, e.getMessage()));
+      return false;
+    }
+    return true;
+  }
+
+  private String messageForCommit(RevCommit c, String msg) {
+    return String.format("commit %s: %s", c.abbreviate(RevId.ABBREV_LEN).name(), msg);
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ChangeProgressOp.java b/java/com/google/gerrit/server/git/receive/ChangeProgressOp.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ChangeProgressOp.java
rename to java/com/google/gerrit/server/git/receive/ChangeProgressOp.java
diff --git a/java/com/google/gerrit/server/git/receive/HackPushNegotiateHook.java b/java/com/google/gerrit/server/git/receive/HackPushNegotiateHook.java
new file mode 100644
index 0000000..bf3d270
--- /dev/null
+++ b/java/com/google/gerrit/server/git/receive/HackPushNegotiateHook.java
@@ -0,0 +1,144 @@
+// Copyright (C) 2010 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.google.gerrit.server.git.receive;
+
+import static org.eclipse.jgit.lib.RefDatabase.ALL;
+
+import com.google.common.collect.Sets;
+import com.google.common.flogger.FluentLogger;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.AdvertiseRefsHook;
+import org.eclipse.jgit.transport.BaseReceivePack;
+import org.eclipse.jgit.transport.ServiceMayNotContinueException;
+import org.eclipse.jgit.transport.UploadPack;
+
+/**
+ * Advertises part of history to git push clients.
+ *
+ * <p>This is a hack to work around the lack of negotiation in the send-pack/receive-pack wire
+ * protocol.
+ *
+ * <p>When the server is frequently advancing master by creating merge commits, the client may not
+ * be able to discover a common ancestor during push. Attempting to push will re-upload a very large
+ * amount of history. This hook hacks in a fake negotiation replacement by walking history and
+ * sending recent commits as {@code ".have"} lines in the wire protocol, allowing the client to find
+ * a common ancestor.
+ */
+public class HackPushNegotiateHook implements AdvertiseRefsHook {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  /** Size of an additional ".have" line. */
+  private static final int HAVE_LINE_LEN = 4 + Constants.OBJECT_ID_STRING_LENGTH + 1 + 5 + 1;
+
+  /**
+   * Maximum number of bytes to "waste" in the advertisement with a peek at this repository's
+   * current reachable history.
+   */
+  private static final int MAX_EXTRA_BYTES = 8192;
+
+  /**
+   * Number of recent commits to advertise immediately, hoping to show a client a nearby merge base.
+   */
+  private static final int BASE_COMMITS = 64;
+
+  /** Number of commits to skip once base has already been shown. */
+  private static final int STEP_COMMITS = 16;
+
+  /** Total number of commits to extract from the history. */
+  private static final int MAX_HISTORY = MAX_EXTRA_BYTES / HAVE_LINE_LEN;
+
+  @Override
+  public void advertiseRefs(UploadPack us) {
+    throw new UnsupportedOperationException("HackPushNegotiateHook cannot be used for UploadPack");
+  }
+
+  @Override
+  public void advertiseRefs(BaseReceivePack rp) throws ServiceMayNotContinueException {
+    Map<String, Ref> r = rp.getAdvertisedRefs();
+    if (r == null) {
+      try {
+        r = rp.getRepository().getRefDatabase().getRefs(ALL);
+      } catch (ServiceMayNotContinueException e) {
+        throw e;
+      } catch (IOException e) {
+        throw new ServiceMayNotContinueException(e);
+      }
+    }
+    rp.setAdvertisedRefs(r, history(r.values(), rp));
+  }
+
+  private Set<ObjectId> history(Collection<Ref> refs, BaseReceivePack rp) {
+    Set<ObjectId> alreadySending = rp.getAdvertisedObjects();
+    if (alreadySending.isEmpty()) {
+      alreadySending = idsOf(refs);
+    }
+
+    int max = MAX_HISTORY - Math.max(0, alreadySending.size() - refs.size());
+    if (max <= 0) {
+      return Collections.emptySet();
+    }
+
+    // Scan history until the advertisement is full.
+    RevWalk rw = rp.getRevWalk();
+    rw.reset();
+    try {
+      for (Ref ref : refs) {
+        try {
+          if (ref.getObjectId() != null) {
+            rw.markStart(rw.parseCommit(ref.getObjectId()));
+          }
+        } catch (IOException badCommit) {
+          continue;
+        }
+      }
+
+      Set<ObjectId> history = Sets.newHashSetWithExpectedSize(max);
+      try {
+        int stepCnt = 0;
+        for (RevCommit c; history.size() < max && (c = rw.next()) != null; ) {
+          if (c.getParentCount() <= 1
+              && !alreadySending.contains(c)
+              && (history.size() < BASE_COMMITS || (++stepCnt % STEP_COMMITS) == 0)) {
+            history.add(c);
+          }
+        }
+      } catch (IOException err) {
+        logger.atSevere().withCause(err).log("error trying to advertise history");
+      }
+      return history;
+    } finally {
+      rw.reset();
+    }
+  }
+
+  private static Set<ObjectId> idsOf(Collection<Ref> refs) {
+    Set<ObjectId> r = Sets.newHashSetWithExpectedSize(refs.size());
+    for (Ref ref : refs) {
+      if (ref.getObjectId() != null) {
+        r.add(ref.getObjectId());
+      }
+    }
+    return r;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/LazyPostReceiveHookChain.java b/java/com/google/gerrit/server/git/receive/LazyPostReceiveHookChain.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/receive/LazyPostReceiveHookChain.java
rename to java/com/google/gerrit/server/git/receive/LazyPostReceiveHookChain.java
diff --git a/java/com/google/gerrit/server/git/receive/MessageSender.java b/java/com/google/gerrit/server/git/receive/MessageSender.java
new file mode 100644
index 0000000..1f66570
--- /dev/null
+++ b/java/com/google/gerrit/server/git/receive/MessageSender.java
@@ -0,0 +1,34 @@
+// Copyright (C) 2017 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.google.gerrit.server.git.receive;
+
+import com.google.gerrit.server.UsedAt;
+
+/**
+ * Interface used by {@link ReceiveCommits} for send messages over the wire during {@code
+ * receive-pack}.
+ */
+@UsedAt(UsedAt.Project.GOOGLE)
+public interface MessageSender {
+  void sendMessage(String what);
+
+  void sendError(String what);
+
+  void sendBytes(byte[] what);
+
+  void sendBytes(byte[] what, int off, int len);
+
+  void flush();
+}
diff --git a/java/com/google/gerrit/server/git/receive/NoteDbPushOption.java b/java/com/google/gerrit/server/git/receive/NoteDbPushOption.java
new file mode 100644
index 0000000..754e4fd
--- /dev/null
+++ b/java/com/google/gerrit/server/git/receive/NoteDbPushOption.java
@@ -0,0 +1,48 @@
+// 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.
+
+package com.google.gerrit.server.git.receive;
+
+import static com.google.common.collect.ImmutableMap.toImmutableMap;
+
+import com.google.common.collect.ImmutableMap;
+import java.util.Arrays;
+import java.util.Locale;
+import java.util.Optional;
+import java.util.function.Function;
+
+/** Possible values for {@code -o notedb=X} push option. */
+public enum NoteDbPushOption {
+  DISALLOW,
+  ALLOW;
+
+  public static final String OPTION_NAME = "notedb";
+
+  private static final ImmutableMap<String, NoteDbPushOption> ALL =
+      Arrays.stream(values()).collect(toImmutableMap(NoteDbPushOption::value, Function.identity()));
+
+  /**
+   * Parses an option value from a lowercase string representation.
+   *
+   * @param value input value.
+   * @return parsed value, or empty if no value matched.
+   */
+  public static Optional<NoteDbPushOption> parse(String value) {
+    return Optional.ofNullable(ALL.get(value));
+  }
+
+  public String value() {
+    return name().toLowerCase(Locale.US);
+  }
+}
diff --git a/java/com/google/gerrit/server/git/receive/ReceiveCommits.java b/java/com/google/gerrit/server/git/receive/ReceiveCommits.java
new file mode 100644
index 0000000..0abaed4
--- /dev/null
+++ b/java/com/google/gerrit/server/git/receive/ReceiveCommits.java
@@ -0,0 +1,3249 @@
+// Copyright (C) 2008 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.google.gerrit.server.git.receive;
+
+import static com.google.common.base.MoreObjects.firstNonNull;
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.collect.ImmutableSet.toImmutableSet;
+import static com.google.gerrit.common.FooterConstants.CHANGE_ID;
+import static com.google.gerrit.reviewdb.client.RefNames.REFS_CHANGES;
+import static com.google.gerrit.reviewdb.client.RefNames.isConfigRef;
+import static com.google.gerrit.server.change.HashtagsUtil.cleanupHashtag;
+import static com.google.gerrit.server.git.MultiProgressMonitor.UNKNOWN;
+import static com.google.gerrit.server.git.receive.ReceiveConstants.COMMAND_REJECTION_MESSAGE_FOOTER;
+import static com.google.gerrit.server.git.receive.ReceiveConstants.ONLY_CHANGE_OWNER_OR_PROJECT_OWNER_CAN_MODIFY_WIP;
+import static com.google.gerrit.server.git.receive.ReceiveConstants.PUSH_OPTION_SKIP_VALIDATION;
+import static com.google.gerrit.server.git.receive.ReceiveConstants.SAME_CHANGE_ID_IN_MULTIPLE_CHANGES;
+import static com.google.gerrit.server.git.validators.CommitValidators.NEW_PATCHSET_PATTERN;
+import static com.google.gerrit.server.mail.MailUtil.getRecipientsFromFooters;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Comparator.comparingInt;
+import static java.util.Objects.requireNonNull;
+import static java.util.stream.Collectors.joining;
+import static java.util.stream.Collectors.toList;
+import static org.eclipse.jgit.lib.Constants.R_HEADS;
+import static org.eclipse.jgit.transport.ReceiveCommand.Result.NOT_ATTEMPTED;
+import static org.eclipse.jgit.transport.ReceiveCommand.Result.OK;
+import static org.eclipse.jgit.transport.ReceiveCommand.Result.REJECTED_MISSING_OBJECT;
+import static org.eclipse.jgit.transport.ReceiveCommand.Result.REJECTED_OTHER_REASON;
+
+import com.google.common.base.Function;
+import com.google.common.base.Joiner;
+import com.google.common.base.Splitter;
+import com.google.common.base.Strings;
+import com.google.common.base.Throwables;
+import com.google.common.collect.BiMap;
+import com.google.common.collect.HashBiMap;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.LinkedListMultimap;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.collect.Sets;
+import com.google.common.collect.SortedSetMultimap;
+import com.google.common.collect.Streams;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.FooterConstants;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.LabelTypes;
+import com.google.gerrit.extensions.api.changes.HashtagsInput;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.api.changes.RecipientType;
+import com.google.gerrit.extensions.api.changes.SubmitInput;
+import com.google.gerrit.extensions.api.projects.ProjectConfigEntryType;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.registration.Extension;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetInfo;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.client.RevId;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.ChangeUtil;
+import com.google.gerrit.server.CreateGroupPermissionSyncer;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.Sequences;
+import com.google.gerrit.server.account.AccountResolver;
+import com.google.gerrit.server.change.ChangeInserter;
+import com.google.gerrit.server.change.SetHashtagsOp;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.PluginConfig;
+import com.google.gerrit.server.config.ProjectConfigEntry;
+import com.google.gerrit.server.edit.ChangeEdit;
+import com.google.gerrit.server.edit.ChangeEditUtil;
+import com.google.gerrit.server.git.BanCommit;
+import com.google.gerrit.server.git.ChangeReportFormatter;
+import com.google.gerrit.server.git.GroupCollector;
+import com.google.gerrit.server.git.MergedByPushOp;
+import com.google.gerrit.server.git.MultiProgressMonitor;
+import com.google.gerrit.server.git.MultiProgressMonitor.Task;
+import com.google.gerrit.server.git.ReceivePackInitializer;
+import com.google.gerrit.server.git.TagCache;
+import com.google.gerrit.server.git.ValidationError;
+import com.google.gerrit.server.git.receive.ResultChangeIds.Key;
+import com.google.gerrit.server.git.validators.CommitValidationMessage;
+import com.google.gerrit.server.git.validators.RefOperationValidationException;
+import com.google.gerrit.server.git.validators.RefOperationValidators;
+import com.google.gerrit.server.git.validators.ValidationMessage;
+import com.google.gerrit.server.index.change.ChangeIndexer;
+import com.google.gerrit.server.logging.RequestId;
+import com.google.gerrit.server.logging.TraceContext;
+import com.google.gerrit.server.mail.MailUtil.MailRecipients;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gerrit.server.patch.PatchSetInfoFactory;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.PermissionDeniedException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gerrit.server.project.CreateRefControl;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.project.NoSuchProjectException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gerrit.server.submit.MergeOp;
+import com.google.gerrit.server.submit.MergeOpRepoManager;
+import com.google.gerrit.server.submit.SubmoduleException;
+import com.google.gerrit.server.submit.SubmoduleOp;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.Context;
+import com.google.gerrit.server.update.RepoContext;
+import com.google.gerrit.server.update.RepoOnlyOp;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryHelper.Action;
+import com.google.gerrit.server.update.RetryHelper.ActionType;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.LabelVote;
+import com.google.gerrit.server.util.MagicBranch;
+import com.google.gerrit.server.util.RequestScopePropagator;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.util.cli.CmdLineParser;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.Assisted;
+import com.google.inject.util.Providers;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import java.util.regex.Matcher;
+import java.util.stream.Stream;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.IncorrectObjectTypeException;
+import org.eclipse.jgit.errors.MissingObjectException;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.notes.NoteMap;
+import org.eclipse.jgit.revwalk.FooterLine;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevObject;
+import org.eclipse.jgit.revwalk.RevSort;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.revwalk.filter.RevFilter;
+import org.eclipse.jgit.transport.ReceiveCommand;
+import org.eclipse.jgit.transport.ReceiveCommand.Result;
+import org.eclipse.jgit.transport.ReceivePack;
+import org.kohsuke.args4j.CmdLineException;
+import org.kohsuke.args4j.Option;
+
+/**
+ * Receives change upload using the Git receive-pack protocol.
+ *
+ * <p>Conceptually, most use of Gerrit is a push of some commits to refs/for/BRANCH. However, the
+ * receive-pack protocol that this is based on allows multiple ref updates to be processed at once.
+ * So we have to be prepared to also handle normal pushes (refs/heads/BRANCH), and legacy pushes
+ * (refs/changes/CHANGE). It is hard to split this class up further, because normal pushes can also
+ * result in updates to reviews, through the autoclose mechanism.
+ */
+class ReceiveCommits {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final String CODE_REVIEW_ERROR =
+      "You need 'Push' rights to upload code review requests.\n"
+          + "Verify that you are pushing to the right branch.";
+  private static final String CANNOT_DELETE_CHANGES = "Cannot delete from '" + REFS_CHANGES + "'";
+  private static final String CANNOT_DELETE_CONFIG =
+      "Cannot delete project configuration from '" + RefNames.REFS_CONFIG + "'";
+
+  interface Factory {
+    ReceiveCommits create(
+        ProjectState projectState,
+        IdentifiedUser user,
+        ReceivePack receivePack,
+        AllRefsWatcher allRefsWatcher,
+        MessageSender messageSender,
+        ResultChangeIds resultChangeIds);
+  }
+
+  private class ReceivePackMessageSender implements MessageSender {
+    @Override
+    public void sendMessage(String what) {
+      receivePack.sendMessage(what);
+    }
+
+    @Override
+    public void sendError(String what) {
+      receivePack.sendError(what);
+    }
+
+    @Override
+    public void sendBytes(byte[] what) {
+      sendBytes(what, 0, what.length);
+    }
+
+    @Override
+    public void sendBytes(byte[] what, int off, int len) {
+      try {
+        receivePack.getMessageOutputStream().write(what, off, len);
+      } catch (IOException e) {
+        // Ignore write failures (matching JGit behavior).
+      }
+    }
+
+    @Override
+    public void flush() {
+      try {
+        receivePack.getMessageOutputStream().flush();
+      } catch (IOException e) {
+        // Ignore write failures (matching JGit behavior).
+      }
+    }
+  }
+
+  private static final Function<Exception, RestApiException> INSERT_EXCEPTION =
+      input -> {
+        if (input instanceof RestApiException) {
+          return (RestApiException) input;
+        } else if ((input instanceof ExecutionException)
+            && (input.getCause() instanceof RestApiException)) {
+          return (RestApiException) input.getCause();
+        }
+        return new RestApiException("Error inserting change/patchset", input);
+      };
+
+  // ReceiveCommits has a lot of fields, sorry. Here and in the constructor they are split up
+  // somewhat, and kept sorted lexicographically within sections, except where later assignments
+  // depend on previous ones.
+
+  // Injected fields.
+  private final AccountResolver accountResolver;
+  private final AllProjectsName allProjectsName;
+  private final BatchUpdate.Factory batchUpdateFactory;
+  private final ChangeEditUtil editUtil;
+  private final ChangeIndexer indexer;
+  private final ChangeInserter.Factory changeInserterFactory;
+  private final ChangeNotes.Factory notesFactory;
+  private final ChangeReportFormatter changeFormatter;
+  private final CmdLineParser.Factory optionParserFactory;
+  private final BranchCommitValidator.Factory commitValidatorFactory;
+  private final CreateGroupPermissionSyncer createGroupPermissionSyncer;
+  private final CreateRefControl createRefControl;
+  private final DynamicMap<ProjectConfigEntry> pluginConfigEntries;
+  private final PluginSetContext<ReceivePackInitializer> initializers;
+  private final MergedByPushOp.Factory mergedByPushOpFactory;
+  private final NotesMigration notesMigration;
+  private final PatchSetInfoFactory patchSetInfoFactory;
+  private final PatchSetUtil psUtil;
+  private final PermissionBackend permissionBackend;
+  private final ProjectCache projectCache;
+  private final Provider<InternalChangeQuery> queryProvider;
+  private final Provider<MergeOp> mergeOpProvider;
+  private final Provider<MergeOpRepoManager> ormProvider;
+  private final ReceiveConfig receiveConfig;
+  private final RefOperationValidators.Factory refValidatorsFactory;
+  private final ReplaceOp.Factory replaceOpFactory;
+  private final RetryHelper retryHelper;
+  private final RequestScopePropagator requestScopePropagator;
+  private final ReviewDb db;
+  private final Sequences seq;
+  private final SetHashtagsOp.Factory hashtagsFactory;
+  private final SubmoduleOp.Factory subOpFactory;
+  private final TagCache tagCache;
+
+  // Assisted injected fields.
+  private final AllRefsWatcher allRefsWatcher;
+  private final ProjectState projectState;
+  private final IdentifiedUser user;
+  private final ReceivePack receivePack;
+
+  // Immutable fields derived from constructor arguments.
+  private final boolean allowProjectOwnersToChangeParent;
+  private final boolean allowPushToRefsChanges;
+  private final LabelTypes labelTypes;
+  private final NoteMap rejectCommits;
+  private final PermissionBackend.ForProject permissions;
+  private final Project project;
+  private final Repository repo;
+
+  // Collections populated during processing.
+  private final List<UpdateGroupsRequest> updateGroups;
+  private final List<ValidationMessage> messages;
+  /** Multimap of error text to refnames that produced that error. */
+  private final ListMultimap<String, String> errors;
+
+  private final ListMultimap<String, String> pushOptions;
+  private final Map<Change.Id, ReplaceRequest> replaceByChange;
+
+  // Collections lazily populated during processing.
+  private ListMultimap<Change.Id, Ref> refsByChange;
+  private ListMultimap<ObjectId, Ref> refsById;
+
+  // Other settings populated during processing.
+  private MagicBranchInput magicBranch;
+  private boolean newChangeForAllNotInTarget;
+  private boolean setChangeAsPrivate;
+  private Optional<NoteDbPushOption> noteDbPushOption;
+  private Optional<String> tracePushOption;
+
+  private MessageSender messageSender;
+  private ResultChangeIds resultChangeIds;
+
+  @Inject
+  ReceiveCommits(
+      AccountResolver accountResolver,
+      AllProjectsName allProjectsName,
+      BatchUpdate.Factory batchUpdateFactory,
+      @GerritServerConfig Config cfg,
+      ChangeEditUtil editUtil,
+      ChangeIndexer indexer,
+      ChangeInserter.Factory changeInserterFactory,
+      ChangeNotes.Factory notesFactory,
+      DynamicItem<ChangeReportFormatter> changeFormatterProvider,
+      CmdLineParser.Factory optionParserFactory,
+      BranchCommitValidator.Factory commitValidatorFactory,
+      CreateGroupPermissionSyncer createGroupPermissionSyncer,
+      CreateRefControl createRefControl,
+      DynamicMap<ProjectConfigEntry> pluginConfigEntries,
+      PluginSetContext<ReceivePackInitializer> initializers,
+      MergedByPushOp.Factory mergedByPushOpFactory,
+      NotesMigration notesMigration,
+      PatchSetInfoFactory patchSetInfoFactory,
+      PatchSetUtil psUtil,
+      PermissionBackend permissionBackend,
+      ProjectCache projectCache,
+      Provider<InternalChangeQuery> queryProvider,
+      Provider<MergeOp> mergeOpProvider,
+      Provider<MergeOpRepoManager> ormProvider,
+      ReceiveConfig receiveConfig,
+      RefOperationValidators.Factory refValidatorsFactory,
+      ReplaceOp.Factory replaceOpFactory,
+      RetryHelper retryHelper,
+      RequestScopePropagator requestScopePropagator,
+      ReviewDb db,
+      Sequences seq,
+      SetHashtagsOp.Factory hashtagsFactory,
+      SubmoduleOp.Factory subOpFactory,
+      TagCache tagCache,
+      @Assisted ProjectState projectState,
+      @Assisted IdentifiedUser user,
+      @Assisted ReceivePack rp,
+      @Assisted AllRefsWatcher allRefsWatcher,
+      @Nullable @Assisted MessageSender messageSender,
+      @Assisted ResultChangeIds resultChangeIds)
+      throws IOException {
+    // Injected fields.
+    this.accountResolver = accountResolver;
+    this.allProjectsName = allProjectsName;
+    this.batchUpdateFactory = batchUpdateFactory;
+    this.changeFormatter = changeFormatterProvider.get();
+    this.changeInserterFactory = changeInserterFactory;
+    this.commitValidatorFactory = commitValidatorFactory;
+    this.createRefControl = createRefControl;
+    this.createGroupPermissionSyncer = createGroupPermissionSyncer;
+    this.db = db;
+    this.editUtil = editUtil;
+    this.hashtagsFactory = hashtagsFactory;
+    this.indexer = indexer;
+    this.initializers = initializers;
+    this.mergeOpProvider = mergeOpProvider;
+    this.mergedByPushOpFactory = mergedByPushOpFactory;
+    this.notesFactory = notesFactory;
+    this.notesMigration = notesMigration;
+    this.optionParserFactory = optionParserFactory;
+    this.ormProvider = ormProvider;
+    this.patchSetInfoFactory = patchSetInfoFactory;
+    this.permissionBackend = permissionBackend;
+    this.pluginConfigEntries = pluginConfigEntries;
+    this.projectCache = projectCache;
+    this.psUtil = psUtil;
+    this.queryProvider = queryProvider;
+    this.receiveConfig = receiveConfig;
+    this.refValidatorsFactory = refValidatorsFactory;
+    this.replaceOpFactory = replaceOpFactory;
+    this.retryHelper = retryHelper;
+    this.requestScopePropagator = requestScopePropagator;
+    this.seq = seq;
+    this.subOpFactory = subOpFactory;
+    this.tagCache = tagCache;
+
+    // Assisted injected fields.
+    this.allRefsWatcher = allRefsWatcher;
+    this.projectState = projectState;
+    this.user = user;
+    this.receivePack = rp;
+
+    // Immutable fields derived from constructor arguments.
+    allowPushToRefsChanges = cfg.getBoolean("receive", "allowPushToRefsChanges", false);
+    repo = rp.getRepository();
+    project = projectState.getProject();
+    labelTypes = projectState.getLabelTypes();
+    permissions = permissionBackend.user(user).project(project.getNameKey());
+    rejectCommits = BanCommit.loadRejectCommitsMap(rp.getRepository(), rp.getRevWalk());
+
+    // Collections populated during processing.
+    errors = MultimapBuilder.linkedHashKeys().arrayListValues().build();
+    messages = new ArrayList<>();
+    pushOptions = LinkedListMultimap.create();
+    replaceByChange = new LinkedHashMap<>();
+    updateGroups = new ArrayList<>();
+
+    this.allowProjectOwnersToChangeParent =
+        cfg.getBoolean("receive", "allowProjectOwnersToChangeParent", false);
+
+    // Other settings populated during processing.
+    newChangeForAllNotInTarget =
+        projectState.is(BooleanProjectConfig.CREATE_NEW_CHANGE_FOR_ALL_NOT_IN_TARGET);
+
+    // Handles for outputting back over the wire to the end user.
+    this.messageSender = messageSender != null ? messageSender : new ReceivePackMessageSender();
+    this.resultChangeIds = resultChangeIds;
+  }
+
+  void init() {
+    initializers.runEach(i -> i.init(projectState.getNameKey(), receivePack));
+  }
+
+  MessageSender getMessageSender() {
+    return messageSender;
+  }
+
+  Project getProject() {
+    return project;
+  }
+
+  private void addMessage(String message, ValidationMessage.Type type) {
+    messages.add(new CommitValidationMessage(message, type));
+  }
+
+  private void addMessage(String message) {
+    messages.add(new CommitValidationMessage(message, ValidationMessage.Type.OTHER));
+  }
+
+  private void addError(String error) {
+    addMessage(error, ValidationMessage.Type.ERROR);
+  }
+
+  void sendMessages() {
+    for (ValidationMessage m : messages) {
+      String msg = m.getType().getPrefix() + m.getMessage();
+
+      // Avoid calling sendError which will add its own error: prefix.
+      messageSender.sendMessage(msg);
+    }
+  }
+
+  void processCommands(Collection<ReceiveCommand> commands, MultiProgressMonitor progress) {
+    Task commandProgress = progress.beginSubTask("refs", UNKNOWN);
+    commands = commands.stream().map(c -> wrapReceiveCommand(c, commandProgress)).collect(toList());
+    processCommandsUnsafe(commands, progress);
+    rejectRemaining(commands, "internal server error");
+
+    // This sends error messages before the 'done' string of the progress monitor is sent.
+    // Currently, the test framework relies on this ordering to understand if pushes completed
+    // successfully.
+    sendErrorMessages();
+
+    commandProgress.end();
+    progress.end();
+  }
+
+  // Process as many commands as possible, but may leave some commands in state NOT_ATTEMPTED.
+  private void processCommandsUnsafe(
+      Collection<ReceiveCommand> commands, MultiProgressMonitor progress) {
+    parsePushOptions();
+    try (TraceContext traceContext =
+        TraceContext.newTrace(
+            tracePushOption.isPresent(),
+            tracePushOption.orElse(null),
+            (tagName, traceId) -> addMessage(tagName + ": " + traceId))) {
+      traceContext.addTag(RequestId.Type.RECEIVE_ID, new RequestId(project.getNameKey().get()));
+
+      // Log the push options here, rather than in parsePushOptions(), so that they are included
+      // into the trace if tracing is enabled.
+      logger.atFine().log("push options: %s", receivePack.getPushOptions());
+
+      if (!projectState.getProject().getState().permitsWrite()) {
+        for (ReceiveCommand cmd : commands) {
+          reject(cmd, "prohibited by Gerrit: project state does not permit write");
+        }
+        return;
+      }
+
+      logger.atFine().log("Parsing %d commands", commands.size());
+
+      List<ReceiveCommand> magicCommands = new ArrayList<>();
+      List<ReceiveCommand> directPatchSetPushCommands = new ArrayList<>();
+      List<ReceiveCommand> regularCommands = new ArrayList<>();
+
+      for (ReceiveCommand cmd : commands) {
+        if (MagicBranch.isMagicBranch(cmd.getRefName())) {
+          magicCommands.add(cmd);
+        } else if (isDirectChangesPush(cmd.getRefName())) {
+          directPatchSetPushCommands.add(cmd);
+        } else {
+          regularCommands.add(cmd);
+        }
+      }
+
+      int commandTypes =
+          (magicCommands.isEmpty() ? 0 : 1)
+              + (directPatchSetPushCommands.isEmpty() ? 0 : 1)
+              + (regularCommands.isEmpty() ? 0 : 1);
+
+      if (commandTypes > 1) {
+        rejectRemaining(commands, "cannot combine normal pushes and magic pushes");
+        return;
+      }
+
+      try {
+        if (!regularCommands.isEmpty()) {
+          handleRegularCommands(regularCommands, progress);
+          return;
+        }
+
+        for (ReceiveCommand cmd : directPatchSetPushCommands) {
+          parseDirectChangesPush(cmd);
+        }
+
+        boolean first = true;
+        for (ReceiveCommand cmd : magicCommands) {
+          if (first) {
+            parseMagicBranch(cmd);
+            first = false;
+          } else {
+            reject(cmd, "duplicate request");
+          }
+        }
+      } catch (PermissionBackendException | NoSuchProjectException | IOException err) {
+        logger.atSevere().withCause(err).log("Failed to process refs in %s", project.getName());
+        return;
+      }
+
+      Task newProgress = progress.beginSubTask("new", UNKNOWN);
+      Task replaceProgress = progress.beginSubTask("updated", UNKNOWN);
+
+      List<CreateRequest> newChanges = Collections.emptyList();
+      if (magicBranch != null && magicBranch.cmd.getResult() == NOT_ATTEMPTED) {
+        newChanges = selectNewAndReplacedChangesFromMagicBranch(newProgress);
+      }
+
+      // Commit validation has already happened, so any changes without Change-Id are for the
+      // deprecated feature.
+      warnAboutMissingChangeId(newChanges);
+      preparePatchSetsForReplace(newChanges);
+      insertChangesAndPatchSets(newChanges, replaceProgress);
+      newProgress.end();
+      replaceProgress.end();
+      queueSuccessMessages(newChanges);
+      refsPublishDeprecationWarning();
+    }
+  }
+
+  private void refsPublishDeprecationWarning() {
+    // TODO(xchangcheng): remove after migrating tools which are using this magic branch.
+    if (magicBranch != null && magicBranch.publish) {
+      addMessage("Pushing to refs/publish/* is deprecated, use refs/for/* instead.");
+    }
+  }
+
+  private void sendErrorMessages() {
+    if (!errors.isEmpty()) {
+      logger.atFine().log("Handling error conditions: %s", errors.keySet());
+      for (String error : errors.keySet()) {
+        receivePack.sendMessage("error: " + buildError(error, errors.get(error)));
+      }
+      receivePack.sendMessage(String.format("User: %s", user.getLoggableName()));
+      receivePack.sendMessage(COMMAND_REJECTION_MESSAGE_FOOTER);
+    }
+  }
+
+  private void handleRegularCommands(List<ReceiveCommand> cmds, MultiProgressMonitor progress)
+      throws PermissionBackendException, IOException, NoSuchProjectException {
+    for (ReceiveCommand cmd : cmds) {
+      parseRegularCommand(cmd);
+    }
+
+    try (BatchUpdate bu =
+            batchUpdateFactory.create(
+                db, project.getNameKey(), user.materializedCopy(), TimeUtil.nowTs());
+        ObjectInserter ins = repo.newObjectInserter();
+        ObjectReader reader = ins.newReader();
+        RevWalk rw = new RevWalk(reader)) {
+      bu.setRepository(repo, rw, ins).updateChangesInParallel();
+      bu.setRefLogMessage("push");
+
+      int added = 0;
+      for (ReceiveCommand cmd : cmds) {
+        if (cmd.getResult() == NOT_ATTEMPTED) {
+          bu.addRepoOnlyOp(new UpdateOneRefOp(cmd));
+          added++;
+        }
+      }
+      logger.atFine().log("Added %d additional ref updates", added);
+      bu.execute();
+    } catch (UpdateException | RestApiException e) {
+      rejectRemaining(cmds, "internal server error");
+      logger.atFine().withCause(e).log("update failed:");
+    }
+
+    Set<Branch.NameKey> branches = new HashSet<>();
+    for (ReceiveCommand c : cmds) {
+      // Most post-update steps should happen in UpdateOneRefOp#postUpdate. The only steps that
+      // should happen in this loop are things that can't happen within one BatchUpdate because
+      // they involve kicking off an additional BatchUpdate.
+      if (c.getResult() != OK) {
+        continue;
+      }
+      if (isHead(c) || isConfig(c)) {
+        switch (c.getType()) {
+          case CREATE:
+          case UPDATE:
+          case UPDATE_NONFASTFORWARD:
+            Task closeProgress = progress.beginSubTask("closed", UNKNOWN);
+            autoCloseChanges(c, closeProgress);
+            closeProgress.end();
+            branches.add(new Branch.NameKey(project.getNameKey(), c.getRefName()));
+            break;
+
+          case DELETE:
+            break;
+        }
+      }
+    }
+
+    // Update superproject gitlinks if required.
+    if (!branches.isEmpty()) {
+      try (MergeOpRepoManager orm = ormProvider.get()) {
+        orm.setContext(db, TimeUtil.nowTs(), user);
+        SubmoduleOp op = subOpFactory.create(branches, orm);
+        op.updateSuperProjects();
+      } catch (SubmoduleException e) {
+        logger.atSevere().withCause(e).log("Can't update the superprojects");
+      }
+    }
+  }
+
+  /** Appends messages for successful change creation/updates. */
+  private void queueSuccessMessages(List<CreateRequest> newChanges) {
+    List<CreateRequest> created =
+        newChanges.stream().filter(r -> r.change != null).collect(toList());
+    List<ReplaceRequest> updated =
+        replaceByChange.values().stream()
+            .filter(r -> r.inputCommand.getResult() == OK)
+            .sorted(comparingInt(r -> r.notes.getChangeId().get()))
+            .collect(toList());
+
+    if (created.isEmpty() && updated.isEmpty()) {
+      return;
+    }
+
+    addMessage("");
+    addMessage("SUCCESS");
+
+    if (!created.isEmpty()) {
+      addMessage("");
+      addMessage("New Changes:");
+      for (CreateRequest c : created) {
+        addMessage(
+            changeFormatter.newChange(
+                ChangeReportFormatter.Input.builder().setChange(c.change).build()));
+      }
+    }
+
+    if (!updated.isEmpty()) {
+      addMessage("");
+      addMessage("Updated Changes:");
+      boolean edit = magicBranch != null && (magicBranch.edit || magicBranch.draft);
+      for (ReplaceRequest u : updated) {
+        String subject;
+        Change change = u.notes.getChange();
+        if (edit) {
+          try {
+            subject = receivePack.getRevWalk().parseCommit(u.newCommitId).getShortMessage();
+          } catch (IOException e) {
+            // Log and fall back to original change subject
+            logger.atWarning().withCause(e).log("failed to get subject for edit patch set");
+            subject = change.getSubject();
+          }
+        } else {
+          subject = u.info.getSubject();
+        }
+
+        boolean isPrivate = change.isPrivate();
+        boolean wip = change.isWorkInProgress();
+        if (magicBranch != null) {
+          if (magicBranch.isPrivate) {
+            isPrivate = true;
+          } else if (magicBranch.removePrivate) {
+            isPrivate = false;
+          }
+          if (magicBranch.workInProgress) {
+            wip = true;
+          } else if (magicBranch.ready) {
+            wip = false;
+          }
+        }
+
+        ChangeReportFormatter.Input input =
+            ChangeReportFormatter.Input.builder()
+                .setChange(change)
+                .setSubject(subject)
+                .setIsEdit(edit)
+                .setIsPrivate(isPrivate)
+                .setIsWorkInProgress(wip)
+                .build();
+        addMessage(changeFormatter.changeUpdated(input));
+      }
+      addMessage("");
+    }
+  }
+
+  private void insertChangesAndPatchSets(List<CreateRequest> newChanges, Task replaceProgress) {
+    ReceiveCommand magicBranchCmd = magicBranch != null ? magicBranch.cmd : null;
+    if (magicBranchCmd != null && magicBranchCmd.getResult() != NOT_ATTEMPTED) {
+      logger.atWarning().log(
+          "Skipping change updates on %s because ref update failed: %s %s",
+          project.getName(),
+          magicBranchCmd.getResult(),
+          Strings.nullToEmpty(magicBranchCmd.getMessage()));
+      return;
+    }
+
+    try (BatchUpdate bu =
+            batchUpdateFactory.create(
+                db, project.getNameKey(), user.materializedCopy(), TimeUtil.nowTs());
+        ObjectInserter ins = repo.newObjectInserter();
+        ObjectReader reader = ins.newReader();
+        RevWalk rw = new RevWalk(reader)) {
+      bu.setRepository(repo, rw, ins).updateChangesInParallel();
+      bu.setRefLogMessage("push");
+
+      logger.atFine().log("Adding %d replace requests", newChanges.size());
+      for (ReplaceRequest replace : replaceByChange.values()) {
+        replace.addOps(bu, replaceProgress);
+      }
+
+      logger.atFine().log("Adding %d create requests", newChanges.size());
+      for (CreateRequest create : newChanges) {
+        create.addOps(bu);
+      }
+
+      logger.atFine().log("Adding %d group update requests", newChanges.size());
+      updateGroups.forEach(r -> r.addOps(bu));
+
+      logger.atFine().log("Executing batch");
+      try {
+        bu.execute();
+      } catch (UpdateException e) {
+        throw INSERT_EXCEPTION.apply(e);
+      }
+
+      replaceByChange.values().stream()
+          .forEach(req -> resultChangeIds.add(Key.REPLACED, req.ontoChange));
+      newChanges.stream().forEach(req -> resultChangeIds.add(Key.CREATED, req.changeId));
+
+      if (magicBranchCmd != null) {
+        magicBranchCmd.setResult(OK);
+      }
+      for (ReplaceRequest replace : replaceByChange.values()) {
+        String rejectMessage = replace.getRejectMessage();
+        if (rejectMessage == null) {
+          if (replace.inputCommand.getResult() == NOT_ATTEMPTED) {
+            // Not necessarily the magic branch, so need to set OK on the original value.
+            replace.inputCommand.setResult(OK);
+          }
+        } else {
+          logger.atFine().log("Rejecting due to message from ReplaceOp");
+          reject(replace.inputCommand, rejectMessage);
+        }
+      }
+
+    } catch (ResourceConflictException e) {
+      addError(e.getMessage());
+      reject(magicBranchCmd, "conflict");
+    } catch (BadRequestException | UnprocessableEntityException e) {
+      logger.atFine().withCause(e).log("Rejecting due to client error");
+      reject(magicBranchCmd, e.getMessage());
+    } catch (RestApiException | IOException e) {
+      logger.atSevere().withCause(e).log("Can't insert change/patch set for %s", project.getName());
+      reject(magicBranchCmd, "internal server error: " + e.getMessage());
+    }
+
+    if (magicBranch != null && magicBranch.submit) {
+      try {
+        submit(newChanges, replaceByChange.values());
+      } catch (ResourceConflictException e) {
+        addError(e.getMessage());
+        reject(magicBranchCmd, "conflict");
+      } catch (RestApiException
+          | OrmException
+          | UpdateException
+          | IOException
+          | ConfigInvalidException
+          | PermissionBackendException e) {
+        logger.atSevere().withCause(e).log("Error submitting changes to %s", project.getName());
+        reject(magicBranchCmd, "error during submit");
+      }
+    }
+  }
+
+  private String buildError(String error, List<String> branches) {
+    StringBuilder sb = new StringBuilder();
+    if (branches.size() == 1) {
+      sb.append("branch ").append(branches.get(0)).append(":\n");
+      sb.append(error);
+      return sb.toString();
+    }
+    sb.append("branches ").append(Joiner.on(", ").join(branches));
+    return sb.append(":\n").append(error).toString();
+  }
+
+  /** Parses push options specified as "git push -o OPTION" */
+  private void parsePushOptions() {
+    List<String> optionList = receivePack.getPushOptions();
+    if (optionList != null) {
+      for (String option : optionList) {
+        int e = option.indexOf('=');
+        if (e > 0) {
+          pushOptions.put(option.substring(0, e), option.substring(e + 1));
+        } else {
+          pushOptions.put(option, "");
+        }
+      }
+    }
+
+    List<String> noteDbValues = pushOptions.get("notedb");
+    if (!noteDbValues.isEmpty()) {
+      // These semantics for duplicates/errors are somewhat arbitrary and may not match e.g. the
+      // CmdLineParser behavior used by MagicBranchInput.
+      String value = noteDbValues.get(noteDbValues.size() - 1);
+      noteDbPushOption = NoteDbPushOption.parse(value);
+      if (!noteDbPushOption.isPresent()) {
+        addError("Invalid value in -o " + NoteDbPushOption.OPTION_NAME + "=" + value);
+      }
+    } else {
+      noteDbPushOption = Optional.of(NoteDbPushOption.DISALLOW);
+    }
+
+    List<String> traceValues = pushOptions.get("trace");
+    if (!traceValues.isEmpty()) {
+      String value = traceValues.get(traceValues.size() - 1);
+      tracePushOption = Optional.of(value);
+    } else {
+      tracePushOption = Optional.empty();
+    }
+  }
+
+  private static boolean isDirectChangesPush(String refname) {
+    Matcher m = NEW_PATCHSET_PATTERN.matcher(refname);
+    return m.matches();
+  }
+
+  private void parseDirectChangesPush(ReceiveCommand cmd) {
+    Matcher m = NEW_PATCHSET_PATTERN.matcher(cmd.getRefName());
+    checkArgument(m.matches());
+
+    if (allowPushToRefsChanges) {
+      // The referenced change must exist and must still be open.
+      Change.Id changeId = Change.Id.parse(m.group(1));
+      parseReplaceCommand(cmd, changeId);
+      messages.add(new ValidationMessage("warning: pushes to refs/changes are deprecated", false));
+    } else {
+      reject(cmd, "upload to refs/changes not allowed");
+    }
+  }
+
+  // Wrap ReceiveCommand so the progress counter works automatically.
+  private ReceiveCommand wrapReceiveCommand(ReceiveCommand cmd, Task progress) {
+    String refname = cmd.getRefName();
+
+    if (projectState.isAllUsers() && RefNames.REFS_USERS_SELF.equals(cmd.getRefName())) {
+      refname = RefNames.refsUsers(user.getAccountId());
+      logger.atFine().log("Swapping out command for %s to %s", RefNames.REFS_USERS_SELF, refname);
+    }
+
+    // We must also update the original, because callers may inspect it afterwards to decide if
+    // the command went through or not.
+    return new ReceiveCommand(cmd.getOldId(), cmd.getNewId(), refname, cmd.getType()) {
+      @Override
+      public void setResult(Result s, String m) {
+        if (getResult() == NOT_ATTEMPTED) { // Only report the progress update once.
+          progress.update(1);
+        }
+        // Counter intuitively, we don't check that results == NOT_ATTEMPTED here.
+        // This is so submit-on-push can still reject the update if the change is created
+        // successfully
+        // (status OK) but the submit failed (merge failed: REJECTED_OTHER_REASON).
+        super.setResult(s, m);
+        cmd.setResult(s, m);
+      }
+    };
+  }
+
+  /*
+   * Interpret a normal push.
+   */
+  private void parseRegularCommand(ReceiveCommand cmd)
+      throws PermissionBackendException, NoSuchProjectException, IOException {
+    if (cmd.getResult() != NOT_ATTEMPTED) {
+      // Already rejected by the core receive process.
+      logger.atFine().log("Already processed by core: %s %s", cmd.getResult(), cmd);
+      return;
+    }
+
+    if (!Repository.isValidRefName(cmd.getRefName()) || cmd.getRefName().contains("//")) {
+      reject(cmd, "not valid ref");
+      return;
+    }
+    if (RefNames.isNoteDbMetaRef(cmd.getRefName())) {
+      // Reject pushes to NoteDb refs without a special option and permission. Note that this
+      // prohibition doesn't depend on NoteDb being enabled in any way, since all sites will
+      // migrate to NoteDb eventually, and we don't want garbage data waiting there when the
+      // migration finishes.
+      logger.atFine().log(
+          "%s NoteDb ref %s with %s=%s",
+          cmd.getType(), cmd.getRefName(), NoteDbPushOption.OPTION_NAME, noteDbPushOption);
+      if (!Optional.of(NoteDbPushOption.ALLOW).equals(noteDbPushOption)) {
+        // Only reject this command, not the whole push. This supports the use case of "git clone
+        // --mirror" followed by "git push --mirror", when the user doesn't really intend to clone
+        // or mirror the NoteDb data; there is no single refspec that describes all refs *except*
+        // NoteDb refs.
+        reject(
+            cmd,
+            "NoteDb update requires -o "
+                + NoteDbPushOption.OPTION_NAME
+                + "="
+                + NoteDbPushOption.ALLOW.value());
+        return;
+      }
+      try {
+        permissionBackend.user(user).check(GlobalPermission.ACCESS_DATABASE);
+      } catch (AuthException e) {
+        reject(cmd, "NoteDb update requires access database permission");
+        return;
+      }
+    }
+
+    switch (cmd.getType()) {
+      case CREATE:
+        parseCreate(cmd);
+        break;
+
+      case UPDATE:
+        parseUpdate(cmd);
+        break;
+
+      case DELETE:
+        parseDelete(cmd);
+        break;
+
+      case UPDATE_NONFASTFORWARD:
+        parseRewind(cmd);
+        break;
+
+      default:
+        reject(cmd, "prohibited by Gerrit: unknown command type " + cmd.getType());
+        return;
+    }
+
+    if (cmd.getResult() != NOT_ATTEMPTED) {
+      return;
+    }
+
+    if (isConfig(cmd)) {
+      validateConfigPush(cmd);
+    }
+  }
+
+  /** Validates a push to refs/meta/config, and reject the command if it fails. */
+  private void validateConfigPush(ReceiveCommand cmd) throws PermissionBackendException {
+    logger.atFine().log("Processing %s command", cmd.getRefName());
+    try {
+      permissions.check(ProjectPermission.WRITE_CONFIG);
+    } catch (AuthException e) {
+      reject(
+          cmd,
+          String.format(
+              "must be either project owner or have %s permission",
+              ProjectPermission.WRITE_CONFIG.describeForException()));
+      return;
+    }
+
+    switch (cmd.getType()) {
+      case CREATE:
+      case UPDATE:
+      case UPDATE_NONFASTFORWARD:
+        try {
+          ProjectConfig cfg = new ProjectConfig(project.getNameKey());
+          cfg.load(project.getNameKey(), receivePack.getRevWalk(), cmd.getNewId());
+          if (!cfg.getValidationErrors().isEmpty()) {
+            addError("Invalid project configuration:");
+            for (ValidationError err : cfg.getValidationErrors()) {
+              addError("  " + err.getMessage());
+            }
+            reject(cmd, "invalid project configuration");
+            logger.atSevere().log(
+                "User %s tried to push invalid project configuration %s for %s",
+                user.getLoggableName(), cmd.getNewId().name(), project.getName());
+            return;
+          }
+          Project.NameKey newParent = cfg.getProject().getParent(allProjectsName);
+          Project.NameKey oldParent = project.getParent(allProjectsName);
+          if (oldParent == null) {
+            // update of the 'All-Projects' project
+            if (newParent != null) {
+              reject(cmd, "invalid project configuration: root project cannot have parent");
+              return;
+            }
+          } else {
+            if (!oldParent.equals(newParent)) {
+              if (allowProjectOwnersToChangeParent) {
+                try {
+                  permissionBackend
+                      .user(user)
+                      .project(project.getNameKey())
+                      .check(ProjectPermission.WRITE_CONFIG);
+                } catch (AuthException e) {
+                  reject(cmd, "invalid project configuration: only project owners can set parent");
+                  return;
+                }
+              } else {
+                try {
+                  permissionBackend.user(user).check(GlobalPermission.ADMINISTRATE_SERVER);
+                } catch (AuthException e) {
+                  reject(cmd, "invalid project configuration: only Gerrit admin can set parent");
+                  return;
+                }
+              }
+            }
+
+            if (projectCache.get(newParent) == null) {
+              reject(cmd, "invalid project configuration: parent does not exist");
+              return;
+            }
+          }
+          validatePluginConfig(cmd, cfg);
+        } catch (Exception e) {
+          reject(cmd, "invalid project configuration");
+          logger.atSevere().withCause(e).log(
+              "User %s tried to push invalid project configuration %s for %s",
+              user.getLoggableName(), cmd.getNewId().name(), project.getName());
+          return;
+        }
+        break;
+
+      case DELETE:
+        break;
+
+      default:
+        reject(
+            cmd,
+            "prohibited by Gerrit: don't know how to handle config update of type "
+                + cmd.getType());
+    }
+  }
+
+  /**
+   * validates a push to refs/meta/config for plugin configuration, and rejects the push if it
+   * fails.
+   */
+  private void validatePluginConfig(ReceiveCommand cmd, ProjectConfig cfg) {
+    for (Extension<ProjectConfigEntry> e : pluginConfigEntries) {
+      PluginConfig pluginCfg = cfg.getPluginConfig(e.getPluginName());
+      ProjectConfigEntry configEntry = e.getProvider().get();
+      String value = pluginCfg.getString(e.getExportName());
+      String oldValue =
+          projectState.getConfig().getPluginConfig(e.getPluginName()).getString(e.getExportName());
+      if (configEntry.getType() == ProjectConfigEntryType.ARRAY) {
+        oldValue =
+            Arrays.stream(
+                    projectState
+                        .getConfig()
+                        .getPluginConfig(e.getPluginName())
+                        .getStringList(e.getExportName()))
+                .collect(joining("\n"));
+      }
+
+      if ((value == null ? oldValue != null : !value.equals(oldValue))
+          && !configEntry.isEditable(projectState)) {
+        reject(
+            cmd,
+            String.format(
+                "invalid project configuration: Not allowed to set parameter"
+                    + " '%s' of plugin '%s' on project '%s'.",
+                e.getExportName(), e.getPluginName(), project.getName()));
+        continue;
+      }
+
+      if (ProjectConfigEntryType.LIST.equals(configEntry.getType())
+          && value != null
+          && !configEntry.getPermittedValues().contains(value)) {
+        reject(
+            cmd,
+            String.format(
+                "invalid project configuration: The value '%s' is "
+                    + "not permitted for parameter '%s' of plugin '%s'.",
+                value, e.getExportName(), e.getPluginName()));
+      }
+    }
+  }
+
+  private void parseCreate(ReceiveCommand cmd)
+      throws PermissionBackendException, NoSuchProjectException, IOException {
+    RevObject obj;
+    try {
+      obj = receivePack.getRevWalk().parseAny(cmd.getNewId());
+    } catch (IOException err) {
+      logger.atSevere().withCause(err).log(
+          "Invalid object %s for %s creation", cmd.getNewId().name(), cmd.getRefName());
+      reject(cmd, "invalid object");
+      return;
+    }
+    logger.atFine().log("Creating %s", cmd);
+
+    if (isHead(cmd) && !isCommit(cmd)) {
+      return;
+    }
+
+    Branch.NameKey branch = new Branch.NameKey(project.getName(), cmd.getRefName());
+    try {
+      // Must pass explicit user instead of injecting a provider into CreateRefControl, since
+      // Provider<CurrentUser> within ReceiveCommits will always return anonymous.
+      createRefControl.checkCreateRef(Providers.of(user), receivePack.getRepository(), branch, obj);
+    } catch (AuthException denied) {
+      rejectProhibited(cmd, denied);
+      return;
+    } catch (ResourceConflictException denied) {
+      reject(cmd, "prohibited by Gerrit: " + denied.getMessage());
+      return;
+    }
+
+    if (validRefOperation(cmd)) {
+      validateRegularPushCommits(new Branch.NameKey(project.getNameKey(), cmd.getRefName()), cmd);
+    }
+  }
+
+  private void parseUpdate(ReceiveCommand cmd) throws PermissionBackendException {
+    logger.atFine().log("Updating %s", cmd);
+    Optional<AuthException> err = checkRefPermission(cmd, RefPermission.UPDATE);
+    if (!err.isPresent()) {
+      if (isHead(cmd) && !isCommit(cmd)) {
+        reject(cmd, "head must point to commit");
+        return;
+      }
+      if (validRefOperation(cmd)) {
+        validateRegularPushCommits(new Branch.NameKey(project.getNameKey(), cmd.getRefName()), cmd);
+      }
+    } else {
+      rejectProhibited(cmd, err.get());
+    }
+  }
+
+  private boolean isCommit(ReceiveCommand cmd) {
+    RevObject obj;
+    try {
+      obj = receivePack.getRevWalk().parseAny(cmd.getNewId());
+    } catch (IOException err) {
+      logger.atSevere().withCause(err).log(
+          "Invalid object %s for %s", cmd.getNewId().name(), cmd.getRefName());
+      reject(cmd, "invalid object");
+      return false;
+    }
+
+    if (obj instanceof RevCommit) {
+      return true;
+    }
+    reject(cmd, "not a commit");
+    return false;
+  }
+
+  private void parseDelete(ReceiveCommand cmd) throws PermissionBackendException {
+    logger.atFine().log("Deleting %s", cmd);
+    if (cmd.getRefName().startsWith(REFS_CHANGES)) {
+      errors.put(CANNOT_DELETE_CHANGES, cmd.getRefName());
+      reject(cmd, "cannot delete changes");
+    } else if (isConfigRef(cmd.getRefName())) {
+      errors.put(CANNOT_DELETE_CONFIG, cmd.getRefName());
+      reject(cmd, "cannot delete project configuration");
+    }
+
+    Optional<AuthException> err = checkRefPermission(cmd, RefPermission.DELETE);
+    if (!err.isPresent()) {
+      validRefOperation(cmd);
+
+    } else {
+      rejectProhibited(cmd, err.get());
+    }
+  }
+
+  private void parseRewind(ReceiveCommand cmd) throws PermissionBackendException {
+    RevCommit newObject;
+    try {
+      newObject = receivePack.getRevWalk().parseCommit(cmd.getNewId());
+    } catch (IncorrectObjectTypeException notCommit) {
+      newObject = null;
+    } catch (IOException err) {
+      logger.atSevere().withCause(err).log(
+          "Invalid object %s for %s forced update", cmd.getNewId().name(), cmd.getRefName());
+      reject(cmd, "invalid object");
+      return;
+    }
+    logger.atFine().log("Rewinding %s", cmd);
+
+    if (newObject != null) {
+      validateRegularPushCommits(new Branch.NameKey(project.getNameKey(), cmd.getRefName()), cmd);
+      if (cmd.getResult() != NOT_ATTEMPTED) {
+        return;
+      }
+    }
+
+    Optional<AuthException> err = checkRefPermission(cmd, RefPermission.FORCE_UPDATE);
+    if (!err.isPresent()) {
+      validRefOperation(cmd);
+    } else {
+      rejectProhibited(cmd, err.get());
+    }
+  }
+
+  private Optional<AuthException> checkRefPermission(ReceiveCommand cmd, RefPermission perm)
+      throws PermissionBackendException {
+    return checkRefPermission(permissions.ref(cmd.getRefName()), perm);
+  }
+
+  private Optional<AuthException> checkRefPermission(
+      PermissionBackend.ForRef forRef, RefPermission perm) throws PermissionBackendException {
+    try {
+      forRef.check(perm);
+      return Optional.empty();
+    } catch (AuthException e) {
+      return Optional.of(e);
+    }
+  }
+
+  private void rejectProhibited(ReceiveCommand cmd, AuthException err) {
+    err.getAdvice().ifPresent(a -> errors.put(a, cmd.getRefName()));
+    reject(cmd, prohibited(err, cmd.getRefName()));
+  }
+
+  private static String prohibited(AuthException e, String alreadyDisplayedResource) {
+    String msg = e.getMessage();
+    if (e instanceof PermissionDeniedException) {
+      PermissionDeniedException pde = (PermissionDeniedException) e;
+      if (pde.getResource().isPresent()
+          && pde.getResource().get().equals(alreadyDisplayedResource)) {
+        // Avoid repeating resource name if exactly the given name was already displayed by the
+        // generic git push machinery.
+        msg = PermissionDeniedException.MESSAGE_PREFIX + pde.describePermission();
+      }
+    }
+    return "prohibited by Gerrit: " + msg;
+  }
+
+  static class MagicBranchInput {
+    private static final Splitter COMMAS = Splitter.on(',').omitEmptyStrings();
+
+    boolean deprecatedTopicSeen;
+    final ReceiveCommand cmd;
+    final LabelTypes labelTypes;
+    final NotesMigration notesMigration;
+    private final boolean defaultPublishComments;
+    Branch.NameKey dest;
+    PermissionBackend.ForRef perm;
+    Set<String> reviewer = Sets.newLinkedHashSet();
+    Set<String> cc = Sets.newLinkedHashSet();
+    Map<String, Short> labels = new HashMap<>();
+    String message;
+    List<RevCommit> baseCommit;
+    CmdLineParser cmdLineParser;
+    Set<String> hashtags = new HashSet<>();
+
+    @Option(name = "--trace", metaVar = "NAME", usage = "enable tracing")
+    String trace;
+
+    @Option(name = "--base", metaVar = "BASE", usage = "merge base of changes")
+    List<ObjectId> base;
+
+    @Option(name = "--topic", metaVar = "NAME", usage = "attach topic to changes")
+    String topic;
+
+    @Option(
+        name = "--draft",
+        usage =
+            "Will be removed. Before that, this option will be mapped to '--private'"
+                + "for new changes and '--edit' for existing changes")
+    boolean draft;
+
+    boolean publish;
+
+    @Option(name = "--private", usage = "mark new/updated change as private")
+    boolean isPrivate;
+
+    @Option(name = "--remove-private", usage = "remove privacy flag from updated change")
+    boolean removePrivate;
+
+    @Option(
+        name = "--wip",
+        aliases = {"-work-in-progress"},
+        usage = "mark change as work in progress")
+    boolean workInProgress;
+
+    @Option(name = "--ready", usage = "mark change as ready")
+    boolean ready;
+
+    @Option(
+        name = "--edit",
+        aliases = {"-e"},
+        usage = "upload as change edit")
+    boolean edit;
+
+    @Option(name = "--submit", usage = "immediately submit the change")
+    boolean submit;
+
+    @Option(name = "--merged", usage = "create single change for a merged commit")
+    boolean merged;
+
+    @Option(name = "--publish-comments", usage = "publish all draft comments on updated changes")
+    private boolean publishComments;
+
+    @Option(
+        name = "--no-publish-comments",
+        aliases = {"--np"},
+        usage = "do not publish draft comments")
+    private boolean noPublishComments;
+
+    @Option(
+        name = "--notify",
+        usage =
+            "Notify handling that defines to whom email notifications "
+                + "should be sent. Allowed values are NONE, OWNER, "
+                + "OWNER_REVIEWERS, ALL. If not set, the default is ALL.")
+    private NotifyHandling notify;
+
+    @Option(
+        name = "--notify-to",
+        metaVar = "USER",
+        usage = "user that should be notified one time by email")
+    List<Account.Id> notifyTo = new ArrayList<>();
+
+    @Option(
+        name = "--notify-cc",
+        metaVar = "USER",
+        usage = "user that should be CC'd one time by email")
+    List<Account.Id> notifyCc = new ArrayList<>();
+
+    @Option(
+        name = "--notify-bcc",
+        metaVar = "USER",
+        usage = "user that should be BCC'd one time by email")
+    List<Account.Id> notifyBcc = new ArrayList<>();
+
+    @Option(
+        name = "--reviewer",
+        aliases = {"-r"},
+        metaVar = "REVIEWER",
+        usage = "add reviewer to changes")
+    void reviewer(String str) {
+      reviewer.add(str);
+    }
+
+    @Option(name = "--cc", metaVar = "CC", usage = "add CC to changes")
+    void cc(String str) {
+      cc.add(str);
+    }
+
+    @Option(
+        name = "--label",
+        aliases = {"-l"},
+        metaVar = "LABEL+VALUE",
+        usage = "label(s) to assign (defaults to +1 if no value provided")
+    void addLabel(String token) throws CmdLineException {
+      LabelVote v = LabelVote.parse(token);
+      try {
+        LabelType.checkName(v.label());
+        ApprovalsUtil.checkLabel(labelTypes, v.label(), v.value());
+      } catch (BadRequestException e) {
+        throw cmdLineParser.reject(e.getMessage());
+      }
+      labels.put(v.label(), v.value());
+    }
+
+    @Option(
+        name = "--message",
+        aliases = {"-m"},
+        metaVar = "MESSAGE",
+        usage = "Comment message to apply to the review")
+    void addMessage(String token) {
+      // Many characters have special meaning in the context of a git ref.
+      //
+      // Clients can use underscores to represent spaces.
+      message = token.replace("_", " ");
+      try {
+        // Other characters can be represented using percent-encoding.
+        message = URLDecoder.decode(message, UTF_8.name());
+      } catch (IllegalArgumentException e) {
+        // Ignore decoding errors; leave message as percent-encoded.
+      } catch (UnsupportedEncodingException e) {
+        // This shouldn't happen; surely URLDecoder recognizes UTF-8.
+        throw new IllegalStateException(e);
+      }
+    }
+
+    @Option(
+        name = "--hashtag",
+        aliases = {"-t"},
+        metaVar = "HASHTAG",
+        usage = "add hashtag to changes")
+    void addHashtag(String token) throws CmdLineException {
+      if (!notesMigration.readChanges()) {
+        throw cmdLineParser.reject("cannot add hashtags; noteDb is disabled");
+      }
+      String hashtag = cleanupHashtag(token);
+      if (!hashtag.isEmpty()) {
+        hashtags.add(hashtag);
+      }
+      // TODO(dpursehouse): validate hashtags
+    }
+
+    MagicBranchInput(
+        IdentifiedUser user,
+        ReceiveCommand cmd,
+        LabelTypes labelTypes,
+        NotesMigration notesMigration) {
+      this.deprecatedTopicSeen = false;
+      this.cmd = cmd;
+      this.draft = cmd.getRefName().startsWith(MagicBranch.NEW_DRAFT_CHANGE);
+      this.publish = cmd.getRefName().startsWith(MagicBranch.NEW_PUBLISH_CHANGE);
+      this.labelTypes = labelTypes;
+      this.notesMigration = notesMigration;
+      GeneralPreferencesInfo prefs = user.state().getGeneralPreferences();
+      this.defaultPublishComments =
+          prefs != null
+              ? firstNonNull(user.state().getGeneralPreferences().publishCommentsOnPush, false)
+              : false;
+    }
+
+    /**
+     * Get reviewer strings from magic branch options, combined with additional recipients computed
+     * from some other place.
+     *
+     * <p>The set of reviewers on a change includes strings passed explicitly via options as well as
+     * account IDs computed from the commit message itself.
+     *
+     * @param additionalRecipients recipients parsed from the commit.
+     * @return set of reviewer strings to pass to {@code ReviewerAdder}.
+     */
+    ImmutableSet<String> getCombinedReviewers(MailRecipients additionalRecipients) {
+      return getCombinedReviewers(reviewer, additionalRecipients.getReviewers());
+    }
+
+    /**
+     * Get CC strings from magic branch options, combined with additional recipients computed from
+     * some other place.
+     *
+     * <p>The set of CCs on a change includes strings passed explicitly via options as well as
+     * account IDs computed from the commit message itself.
+     *
+     * @param additionalRecipients recipients parsed from the commit.
+     * @return set of CC strings to pass to {@code ReviewerAdder}.
+     */
+    ImmutableSet<String> getCombinedCcs(MailRecipients additionalRecipients) {
+      return getCombinedReviewers(cc, additionalRecipients.getCcOnly());
+    }
+
+    private static ImmutableSet<String> getCombinedReviewers(
+        Set<String> strings, Set<Account.Id> ids) {
+      return Streams.concat(strings.stream(), ids.stream().map(Account.Id::toString))
+          .collect(toImmutableSet());
+    }
+
+    ListMultimap<RecipientType, Account.Id> getAccountsToNotify() {
+      ListMultimap<RecipientType, Account.Id> accountsToNotify =
+          MultimapBuilder.hashKeys().arrayListValues().build();
+      accountsToNotify.putAll(RecipientType.TO, notifyTo);
+      accountsToNotify.putAll(RecipientType.CC, notifyCc);
+      accountsToNotify.putAll(RecipientType.BCC, notifyBcc);
+      return accountsToNotify;
+    }
+
+    boolean shouldPublishComments() {
+      if (publishComments) {
+        return true;
+      } else if (noPublishComments) {
+        return false;
+      }
+      return defaultPublishComments;
+    }
+
+    /**
+     * returns the destination ref of the magic branch, and populates options in the cmdLineParser.
+     */
+    String parse(Repository repo, Set<String> refs, ListMultimap<String, String> pushOptions)
+        throws CmdLineException {
+      String ref = RefNames.fullName(MagicBranch.getDestBranchName(cmd.getRefName()));
+
+      ListMultimap<String, String> options = LinkedListMultimap.create(pushOptions);
+
+      // Process and lop off the "%OPTION" suffix.
+      int optionStart = ref.indexOf('%');
+      if (0 < optionStart) {
+        for (String s : COMMAS.split(ref.substring(optionStart + 1))) {
+          int e = s.indexOf('=');
+          if (0 < e) {
+            options.put(s.substring(0, e), s.substring(e + 1));
+          } else {
+            options.put(s, "");
+          }
+        }
+        ref = ref.substring(0, optionStart);
+      }
+
+      if (!options.isEmpty()) {
+        cmdLineParser.parseOptionMap(options);
+      }
+
+      // We accept refs/for/BRANCHNAME/TOPIC. Since we don't know
+      // for sure where the branch ends and the topic starts, look
+      // backward for a split that works. This behavior is deprecated.
+      String head = readHEAD(repo);
+      int split = ref.length();
+      for (; ; ) {
+        String name = ref.substring(0, split);
+        if (refs.contains(name) || name.equals(head)) {
+          break;
+        }
+
+        split = name.lastIndexOf('/', split - 1);
+        if (split <= Constants.R_REFS.length()) {
+          return ref;
+        }
+      }
+      if (split < ref.length()) {
+        topic = Strings.emptyToNull(ref.substring(split + 1));
+        deprecatedTopicSeen = true;
+      }
+      return ref.substring(0, split);
+    }
+
+    NotifyHandling getNotify() {
+      if (notify != null) {
+        return notify;
+      }
+      if (workInProgress) {
+        return NotifyHandling.OWNER;
+      }
+      return NotifyHandling.ALL;
+    }
+
+    NotifyHandling getNotify(ChangeNotes notes) {
+      if (notify != null) {
+        return notify;
+      }
+      if (workInProgress || (!ready && notes.getChange().isWorkInProgress())) {
+        return NotifyHandling.OWNER;
+      }
+      return NotifyHandling.ALL;
+    }
+  }
+
+  /**
+   * Parse the magic branch data (refs/for/BRANCH/OPTIONALTOPIC%OPTIONS) into the magicBranch
+   * member.
+   *
+   * <p>Assumes we are handling a magic branch here.
+   */
+  private void parseMagicBranch(ReceiveCommand cmd) throws PermissionBackendException {
+    logger.atFine().log("Found magic branch %s", cmd.getRefName());
+    MagicBranchInput magicBranch = new MagicBranchInput(user, cmd, labelTypes, notesMigration);
+
+    String ref;
+    magicBranch.cmdLineParser = optionParserFactory.create(magicBranch);
+
+    try {
+      ref = magicBranch.parse(repo, receivePack.getAdvertisedRefs().keySet(), pushOptions);
+    } catch (CmdLineException e) {
+      if (!magicBranch.cmdLineParser.wasHelpRequestedByOption()) {
+        logger.atFine().log("Invalid branch syntax");
+        reject(cmd, e.getMessage());
+        return;
+      }
+      ref = null; // never happens
+    }
+
+    if (magicBranch.topic != null && magicBranch.topic.length() > ChangeUtil.TOPIC_MAX_LENGTH) {
+      reject(
+          cmd, String.format("topic length exceeds the limit (%d)", ChangeUtil.TOPIC_MAX_LENGTH));
+    }
+
+    if (magicBranch.cmdLineParser.wasHelpRequestedByOption()) {
+      StringWriter w = new StringWriter();
+      w.write("\nHelp for refs/for/branch:\n\n");
+      magicBranch.cmdLineParser.printUsage(w, null);
+      addMessage(w.toString());
+      reject(cmd, "see help");
+      return;
+    }
+    if (projectState.isAllUsers() && RefNames.REFS_USERS_SELF.equals(ref)) {
+      logger.atFine().log("Handling %s", RefNames.REFS_USERS_SELF);
+      ref = RefNames.refsUsers(user.getAccountId());
+    }
+    if (!receivePack.getAdvertisedRefs().containsKey(ref)
+        && !ref.equals(readHEAD(repo))
+        && !ref.equals(RefNames.REFS_CONFIG)) {
+      logger.atFine().log("Ref %s not found", ref);
+      if (ref.startsWith(Constants.R_HEADS)) {
+        String n = ref.substring(Constants.R_HEADS.length());
+        reject(cmd, "branch " + n + " not found");
+      } else {
+        reject(cmd, ref + " not found");
+      }
+      return;
+    }
+
+    magicBranch.dest = new Branch.NameKey(project.getNameKey(), ref);
+    magicBranch.perm = permissions.ref(ref);
+
+    Optional<AuthException> err = checkRefPermission(magicBranch.perm, RefPermission.CREATE_CHANGE);
+    if (err.isPresent()) {
+      rejectProhibited(cmd, err.get());
+      return;
+    }
+
+    // TODO(davido): Remove legacy support for drafts magic branch option
+    // after repo-tool supports private and work-in-progress changes.
+    if (magicBranch.draft && !receiveConfig.allowDrafts) {
+      errors.put(CODE_REVIEW_ERROR, ref);
+      reject(cmd, "draft workflow is disabled");
+      return;
+    }
+
+    if (magicBranch.isPrivate && magicBranch.removePrivate) {
+      reject(cmd, "the options 'private' and 'remove-private' are mutually exclusive");
+      return;
+    }
+
+    boolean privateByDefault =
+        projectCache.get(project.getNameKey()).is(BooleanProjectConfig.PRIVATE_BY_DEFAULT);
+    setChangeAsPrivate =
+        magicBranch.draft
+            || magicBranch.isPrivate
+            || (privateByDefault && !magicBranch.removePrivate);
+
+    if (receiveConfig.disablePrivateChanges && setChangeAsPrivate) {
+      reject(cmd, "private changes are disabled");
+      return;
+    }
+
+    if (magicBranch.workInProgress && magicBranch.ready) {
+      reject(cmd, "the options 'wip' and 'ready' are mutually exclusive");
+      return;
+    }
+    if (magicBranch.publishComments && magicBranch.noPublishComments) {
+      reject(
+          cmd, "the options 'publish-comments' and 'no-publish-comments' are mutually exclusive");
+      return;
+    }
+
+    if (magicBranch.submit) {
+      err = checkRefPermission(magicBranch.perm, RefPermission.UPDATE_BY_SUBMIT);
+      if (err.isPresent()) {
+        rejectProhibited(cmd, err.get());
+        return;
+      }
+    }
+
+    RevWalk walk = receivePack.getRevWalk();
+    RevCommit tip;
+    try {
+      tip = walk.parseCommit(magicBranch.cmd.getNewId());
+      logger.atFine().log("Tip of push: %s", tip.name());
+    } catch (IOException ex) {
+      magicBranch.cmd.setResult(REJECTED_MISSING_OBJECT);
+      logger.atSevere().withCause(ex).log("Invalid pack upload; one or more objects weren't sent");
+      return;
+    }
+
+    String destBranch = magicBranch.dest.get();
+    try {
+      if (magicBranch.merged) {
+        if (magicBranch.base != null) {
+          reject(cmd, "cannot use merged with base");
+          return;
+        }
+        RevCommit branchTip = readBranchTip(cmd, magicBranch.dest);
+        if (branchTip == null) {
+          return; // readBranchTip already rejected cmd.
+        }
+        if (!walk.isMergedInto(tip, branchTip)) {
+          reject(cmd, "not merged into branch");
+          return;
+        }
+      }
+
+      // If tip is a merge commit, or the root commit or
+      // if %base or %merged was specified, ignore newChangeForAllNotInTarget.
+      if (tip.getParentCount() > 1
+          || magicBranch.base != null
+          || magicBranch.merged
+          || tip.getParentCount() == 0) {
+        logger.atFine().log("Forcing newChangeForAllNotInTarget = false");
+        newChangeForAllNotInTarget = false;
+      }
+
+      if (magicBranch.base != null) {
+        logger.atFine().log("Handling %%base: %s", magicBranch.base);
+        magicBranch.baseCommit = Lists.newArrayListWithCapacity(magicBranch.base.size());
+        for (ObjectId id : magicBranch.base) {
+          try {
+            magicBranch.baseCommit.add(walk.parseCommit(id));
+          } catch (IncorrectObjectTypeException notCommit) {
+            reject(cmd, "base must be a commit");
+            return;
+          } catch (MissingObjectException e) {
+            reject(cmd, "base not found");
+            return;
+          } catch (IOException e) {
+            logger.atWarning().withCause(e).log(
+                "Project %s cannot read %s", project.getName(), id.name());
+            reject(cmd, "internal server error");
+            return;
+          }
+        }
+      } else if (newChangeForAllNotInTarget) {
+        RevCommit branchTip = readBranchTip(cmd, magicBranch.dest);
+        if (branchTip == null) {
+          return; // readBranchTip already rejected cmd.
+        }
+        magicBranch.baseCommit = Collections.singletonList(branchTip);
+        logger.atFine().log("Set baseCommit = %s", magicBranch.baseCommit.get(0).name());
+      }
+    } catch (IOException ex) {
+      logger.atWarning().withCause(ex).log(
+          "Error walking to %s in project %s", destBranch, project.getName());
+      reject(cmd, "internal server error");
+      return;
+    }
+
+    if (magicBranch.deprecatedTopicSeen) {
+      messages.add(
+          new ValidationMessage(
+              "WARNING: deprecated topic syntax. Use %topic=TOPIC instead", false));
+      logger.atInfo().log("deprecated topic push seen for project %s", project.getName());
+    }
+
+    if (validateConnected(magicBranch.cmd, magicBranch.dest, tip)) {
+      this.magicBranch = magicBranch;
+    }
+  }
+
+  // Validate that the new commits are connected with the target
+  // branch.  If they aren't, we want to abort. We do this check by
+  // looking to see if we can compute a merge base between the new
+  // commits and the target branch head.
+  private boolean validateConnected(ReceiveCommand cmd, Branch.NameKey dest, RevCommit tip) {
+    RevWalk walk = receivePack.getRevWalk();
+    try {
+      Ref targetRef = receivePack.getAdvertisedRefs().get(dest.get());
+      if (targetRef == null || targetRef.getObjectId() == null) {
+        // The destination branch does not yet exist. Assume the
+        // history being sent for review will start it and thus
+        // is "connected" to the branch.
+        logger.atFine().log("Branch is unborn");
+
+        // This is not an error condition.
+        return true;
+      }
+
+      RevCommit h = walk.parseCommit(targetRef.getObjectId());
+      logger.atFine().log("Current branch tip: %s", h.name());
+      RevFilter oldRevFilter = walk.getRevFilter();
+      try {
+        walk.reset();
+        walk.setRevFilter(RevFilter.MERGE_BASE);
+        walk.markStart(tip);
+        walk.markStart(h);
+        if (walk.next() == null) {
+          reject(cmd, "no common ancestry");
+          return false;
+        }
+      } finally {
+        walk.reset();
+        walk.setRevFilter(oldRevFilter);
+      }
+    } catch (IOException e) {
+      cmd.setResult(REJECTED_MISSING_OBJECT);
+      logger.atSevere().withCause(e).log("Invalid pack upload; one or more objects weren't sent");
+      return false;
+    }
+    return true;
+  }
+
+  private static String readHEAD(Repository repo) {
+    try {
+      return repo.getFullBranch();
+    } catch (IOException e) {
+      logger.atSevere().withCause(e).log("Cannot read HEAD symref");
+      return null;
+    }
+  }
+
+  private RevCommit readBranchTip(ReceiveCommand cmd, Branch.NameKey branch) throws IOException {
+    Ref r = allRefs().get(branch.get());
+    if (r == null) {
+      reject(cmd, branch.get() + " not found");
+      return null;
+    }
+    return receivePack.getRevWalk().parseCommit(r.getObjectId());
+  }
+
+  // Handle an upload to refs/changes/XX/CHANGED-NUMBER.
+  private void parseReplaceCommand(ReceiveCommand cmd, Change.Id changeId) {
+    logger.atFine().log("Parsing replace command");
+    if (cmd.getType() != ReceiveCommand.Type.CREATE) {
+      reject(cmd, "invalid usage");
+      return;
+    }
+
+    RevCommit newCommit;
+    try {
+      newCommit = receivePack.getRevWalk().parseCommit(cmd.getNewId());
+      logger.atFine().log("Replacing with %s", newCommit);
+    } catch (IOException e) {
+      logger.atSevere().withCause(e).log("Cannot parse %s as commit", cmd.getNewId().name());
+      reject(cmd, "invalid commit");
+      return;
+    }
+
+    Change changeEnt;
+    try {
+      changeEnt = notesFactory.createChecked(db, project.getNameKey(), changeId).getChange();
+    } catch (NoSuchChangeException e) {
+      logger.atSevere().withCause(e).log("Change not found %s", changeId);
+      reject(cmd, "change " + changeId + " not found");
+      return;
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log("Cannot lookup existing change %s", changeId);
+      reject(cmd, "database error");
+      return;
+    }
+    if (!project.getNameKey().equals(changeEnt.getProject())) {
+      reject(cmd, "change " + changeId + " does not belong to project " + project.getName());
+      return;
+    }
+
+    BranchCommitValidator validator =
+        commitValidatorFactory.create(projectState, changeEnt.getDest(), user);
+    try {
+      if (validator.validCommit(
+          receivePack.getRevWalk().getObjectReader(),
+          cmd,
+          newCommit,
+          false,
+          messages,
+          rejectCommits,
+          changeEnt)) {
+        logger.atFine().log("Replacing change %s", changeEnt.getId());
+        requestReplace(cmd, true, changeEnt, newCommit);
+      }
+    } catch (IOException e) {
+      reject(cmd, "I/O exception validating commit");
+    }
+  }
+
+  /**
+   * Add an update for an existing change. Returns true if it succeeded; rejects the command if it
+   * failed.
+   */
+  private boolean requestReplace(
+      ReceiveCommand cmd, boolean checkMergedInto, Change change, RevCommit newCommit) {
+    if (change.getStatus().isClosed()) {
+      reject(
+          cmd,
+          changeFormatter.changeClosed(
+              ChangeReportFormatter.Input.builder().setChange(change).build()));
+      return false;
+    }
+
+    ReplaceRequest req = new ReplaceRequest(change.getId(), newCommit, cmd, checkMergedInto);
+    if (replaceByChange.containsKey(req.ontoChange)) {
+      reject(cmd, "duplicate request");
+      return false;
+    }
+    replaceByChange.put(req.ontoChange, req);
+    return true;
+  }
+
+  private void warnAboutMissingChangeId(List<CreateRequest> newChanges) {
+    for (CreateRequest create : newChanges) {
+      try {
+        receivePack.getRevWalk().parseBody(create.commit);
+      } catch (IOException e) {
+        continue;
+      }
+      List<String> idList = create.commit.getFooterLines(FooterConstants.CHANGE_ID);
+
+      if (idList.isEmpty()) {
+        messages.add(
+            new ValidationMessage("warning: pushing without Change-Id is deprecated", false));
+        break;
+      }
+    }
+  }
+
+  private List<CreateRequest> selectNewAndReplacedChangesFromMagicBranch(Task newProgress) {
+    logger.atFine().log("Finding new and replaced changes");
+    List<CreateRequest> newChanges = new ArrayList<>();
+
+    ListMultimap<ObjectId, Ref> existing = changeRefsById();
+    GroupCollector groupCollector =
+        GroupCollector.create(changeRefsById(), db, psUtil, notesFactory, project.getNameKey());
+
+    BranchCommitValidator validator =
+        commitValidatorFactory.create(projectState, magicBranch.dest, user);
+
+    try {
+      RevCommit start = setUpWalkForSelectingChanges();
+      if (start == null) {
+        return Collections.emptyList();
+      }
+
+      LinkedHashMap<RevCommit, ChangeLookup> pending = new LinkedHashMap<>();
+      Set<Change.Key> newChangeIds = new HashSet<>();
+      int maxBatchChanges = receiveConfig.getEffectiveMaxBatchChangesLimit(user);
+      int total = 0;
+      int alreadyTracked = 0;
+      boolean rejectImplicitMerges =
+          start.getParentCount() == 1
+              && projectCache
+                  .get(project.getNameKey())
+                  .is(BooleanProjectConfig.REJECT_IMPLICIT_MERGES)
+              // Don't worry about implicit merges when creating changes for
+              // already-merged commits; they're already in history, so it's too
+              // late.
+              && !magicBranch.merged;
+      Set<RevCommit> mergedParents;
+      if (rejectImplicitMerges) {
+        mergedParents = new HashSet<>();
+      } else {
+        mergedParents = null;
+      }
+
+      for (; ; ) {
+        RevCommit c = receivePack.getRevWalk().next();
+        if (c == null) {
+          break;
+        }
+        total++;
+        receivePack.getRevWalk().parseBody(c);
+        String name = c.name();
+        groupCollector.visit(c);
+        Collection<Ref> existingRefs = existing.get(c);
+
+        if (rejectImplicitMerges) {
+          Collections.addAll(mergedParents, c.getParents());
+          mergedParents.remove(c);
+        }
+
+        boolean commitAlreadyTracked = !existingRefs.isEmpty();
+        if (commitAlreadyTracked) {
+          alreadyTracked++;
+          // Corner cases where an existing commit might need a new group:
+          // A) Existing commit has a null group; wasn't assigned during schema
+          //    upgrade, or schema upgrade is performed on a running server.
+          // B) Let A<-B<-C, then:
+          //      1. Push A to refs/heads/master
+          //      2. Push B to refs/for/master
+          //      3. Force push A~ to refs/heads/master
+          //      4. Push C to refs/for/master.
+          //      B will be in existing so we aren't replacing the patch set. It
+          //      used to have its own group, but now needs to to be changed to
+          //      A's group.
+          // C) Commit is a PatchSet of a pre-existing change uploaded with a
+          //    different target branch.
+          for (Ref ref : existingRefs) {
+            updateGroups.add(new UpdateGroupsRequest(ref, c));
+          }
+          if (!(newChangeForAllNotInTarget || magicBranch.base != null)) {
+            continue;
+          }
+        }
+
+        List<String> idList = c.getFooterLines(CHANGE_ID);
+        if (!idList.isEmpty()) {
+          pending.put(
+              c, lookupByChangeKey(c, new Change.Key(idList.get(idList.size() - 1).trim())));
+        } else {
+          pending.put(c, lookupByCommit(c));
+        }
+
+        int n = pending.size() + newChanges.size();
+        if (maxBatchChanges != 0 && n > maxBatchChanges) {
+          logger.atFine().log("%d changes exceeds limit of %d", n, maxBatchChanges);
+          reject(
+              magicBranch.cmd,
+              "the number of pushed changes in a batch exceeds the max limit " + maxBatchChanges);
+          return Collections.emptyList();
+        }
+
+        if (commitAlreadyTracked) {
+          boolean changeExistsOnDestBranch = false;
+          for (ChangeData cd : pending.get(c).destChanges) {
+            if (cd.change().getDest().equals(magicBranch.dest)) {
+              changeExistsOnDestBranch = true;
+              break;
+            }
+          }
+          if (changeExistsOnDestBranch) {
+            continue;
+          }
+
+          logger.atFine().log("Creating new change for %s even though it is already tracked", name);
+        }
+
+        if (!validator.validCommit(
+            receivePack.getRevWalk().getObjectReader(),
+            magicBranch.cmd,
+            c,
+            magicBranch.merged,
+            messages,
+            rejectCommits,
+            null)) {
+          // Not a change the user can propose? Abort as early as possible.
+          logger.atFine().log("Aborting early due to invalid commit");
+          return Collections.emptyList();
+        }
+
+        // Don't allow merges to be uploaded in commit chain via all-not-in-target
+        if (newChangeForAllNotInTarget && c.getParentCount() > 1) {
+          reject(
+              magicBranch.cmd,
+              "Pushing merges in commit chains with 'all not in target' is not allowed,\n"
+                  + "to override please set the base manually");
+          logger.atFine().log("Rejecting merge commit %s with newChangeForAllNotInTarget", name);
+          // TODO(dborowitz): Should we early return here?
+        }
+
+        if (idList.isEmpty()) {
+          newChanges.add(new CreateRequest(c, magicBranch.dest.get(), newProgress));
+          continue;
+        }
+      }
+      logger.atFine().log(
+          "Finished initial RevWalk with %d commits total: %d already"
+              + " tracked, %d new changes with no Change-Id, and %d deferred"
+              + " lookups",
+          total, alreadyTracked, newChanges.size(), pending.size());
+
+      if (rejectImplicitMerges) {
+        rejectImplicitMerges(mergedParents);
+      }
+
+      for (Iterator<ChangeLookup> itr = pending.values().iterator(); itr.hasNext(); ) {
+        ChangeLookup p = itr.next();
+        if (p.changeKey == null) {
+          continue;
+        }
+
+        if (newChangeIds.contains(p.changeKey)) {
+          logger.atFine().log("Multiple commits with Change-Id %s", p.changeKey);
+          reject(magicBranch.cmd, SAME_CHANGE_ID_IN_MULTIPLE_CHANGES);
+          return Collections.emptyList();
+        }
+
+        List<ChangeData> changes = p.destChanges;
+        if (changes.size() > 1) {
+          logger.atFine().log(
+              "Multiple changes in branch %s with Change-Id %s: %s",
+              magicBranch.dest,
+              p.changeKey,
+              changes.stream().map(cd -> cd.getId().toString()).collect(joining()));
+          // WTF, multiple changes in this branch have the same key?
+          // Since the commit is new, the user should recreate it with
+          // a different Change-Id. In practice, we should never see
+          // this error message as Change-Id should be unique per branch.
+          //
+          reject(magicBranch.cmd, p.changeKey.get() + " has duplicates");
+          return Collections.emptyList();
+        }
+
+        if (changes.size() == 1) {
+          // Schedule as a replacement to this one matching change.
+          //
+
+          RevId currentPs = changes.get(0).currentPatchSet().getRevision();
+          // If Commit is already current PatchSet of target Change.
+          if (p.commit.name().equals(currentPs.get())) {
+            if (pending.size() == 1) {
+              // There are no commits left to check, all commits in pending were already
+              // current PatchSet of the corresponding target changes.
+              reject(magicBranch.cmd, "commit(s) already exists (as current patchset)");
+            } else {
+              // Commit is already current PatchSet.
+              // Remove from pending and try next commit.
+              itr.remove();
+              continue;
+            }
+          }
+          if (requestReplace(magicBranch.cmd, false, changes.get(0).change(), p.commit)) {
+            continue;
+          }
+          return Collections.emptyList();
+        }
+
+        if (changes.size() == 0) {
+          if (!isValidChangeId(p.changeKey.get())) {
+            reject(magicBranch.cmd, "invalid Change-Id");
+            return Collections.emptyList();
+          }
+
+          // In case the change look up from the index failed,
+          // double check against the existing refs
+          if (foundInExistingRef(existing.get(p.commit))) {
+            if (pending.size() == 1) {
+              reject(magicBranch.cmd, "commit(s) already exists (as current patchset)");
+              return Collections.emptyList();
+            }
+            itr.remove();
+            continue;
+          }
+          newChangeIds.add(p.changeKey);
+        }
+        newChanges.add(new CreateRequest(p.commit, magicBranch.dest.get(), newProgress));
+      }
+      logger.atFine().log(
+          "Finished deferred lookups with %d updates and %d new changes",
+          replaceByChange.size(), newChanges.size());
+    } catch (IOException e) {
+      // Should never happen, the core receive process would have
+      // identified the missing object earlier before we got control.
+      //
+      magicBranch.cmd.setResult(REJECTED_MISSING_OBJECT);
+      logger.atSevere().withCause(e).log("Invalid pack upload; one or more objects weren't sent");
+      return Collections.emptyList();
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log("Cannot query database to locate prior changes");
+      reject(magicBranch.cmd, "database error");
+      return Collections.emptyList();
+    }
+
+    if (newChanges.isEmpty() && replaceByChange.isEmpty()) {
+      reject(magicBranch.cmd, "no new changes");
+      return Collections.emptyList();
+    }
+    if (!newChanges.isEmpty() && magicBranch.edit) {
+      reject(magicBranch.cmd, "edit is not supported for new changes");
+      return newChanges;
+    }
+
+    try {
+      SortedSetMultimap<ObjectId, String> groups = groupCollector.getGroups();
+      List<Integer> newIds = seq.nextChangeIds(newChanges.size());
+      for (int i = 0; i < newChanges.size(); i++) {
+        CreateRequest create = newChanges.get(i);
+        create.setChangeId(newIds.get(i));
+        create.groups = ImmutableList.copyOf(groups.get(create.commit));
+      }
+      for (ReplaceRequest replace : replaceByChange.values()) {
+        replace.groups = ImmutableList.copyOf(groups.get(replace.newCommitId));
+      }
+      for (UpdateGroupsRequest update : updateGroups) {
+        update.groups = ImmutableList.copyOf((groups.get(update.commit)));
+      }
+      logger.atFine().log("Finished updating groups from GroupCollector");
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log("Error collecting groups for changes");
+      reject(magicBranch.cmd, "internal server error");
+    }
+    return newChanges;
+  }
+
+  private boolean foundInExistingRef(Collection<Ref> existingRefs) throws OrmException {
+    for (Ref ref : existingRefs) {
+      ChangeNotes notes =
+          notesFactory.create(db, project.getNameKey(), Change.Id.fromRef(ref.getName()));
+      Change change = notes.getChange();
+      if (change.getDest().equals(magicBranch.dest)) {
+        logger.atFine().log("Found change %s from existing refs.", change.getKey());
+        // Reindex the change asynchronously, ignoring errors.
+        @SuppressWarnings("unused")
+        Future<?> possiblyIgnoredError = indexer.indexAsync(project.getNameKey(), change.getId());
+        return true;
+      }
+    }
+    return false;
+  }
+
+  private RevCommit setUpWalkForSelectingChanges() throws IOException {
+    RevWalk rw = receivePack.getRevWalk();
+    RevCommit start = rw.parseCommit(magicBranch.cmd.getNewId());
+
+    rw.reset();
+    rw.sort(RevSort.TOPO);
+    rw.sort(RevSort.REVERSE, true);
+    receivePack.getRevWalk().markStart(start);
+    if (magicBranch.baseCommit != null) {
+      markExplicitBasesUninteresting();
+    } else if (magicBranch.merged) {
+      logger.atFine().log("Marking parents of merged commit %s uninteresting", start.name());
+      for (RevCommit c : start.getParents()) {
+        rw.markUninteresting(c);
+      }
+    } else {
+      markHeadsAsUninteresting(rw, magicBranch.dest != null ? magicBranch.dest.get() : null);
+    }
+    return start;
+  }
+
+  private void markExplicitBasesUninteresting() throws IOException {
+    logger.atFine().log("Marking %d base commits uninteresting", magicBranch.baseCommit.size());
+    for (RevCommit c : magicBranch.baseCommit) {
+      receivePack.getRevWalk().markUninteresting(c);
+    }
+    Ref targetRef = allRefs().get(magicBranch.dest.get());
+    if (targetRef != null) {
+      logger.atFine().log(
+          "Marking target ref %s (%s) uninteresting",
+          magicBranch.dest.get(), targetRef.getObjectId().name());
+      receivePack
+          .getRevWalk()
+          .markUninteresting(receivePack.getRevWalk().parseCommit(targetRef.getObjectId()));
+    }
+  }
+
+  private void rejectImplicitMerges(Set<RevCommit> mergedParents) throws IOException {
+    if (!mergedParents.isEmpty()) {
+      Ref targetRef = allRefs().get(magicBranch.dest.get());
+      if (targetRef != null) {
+        RevWalk rw = receivePack.getRevWalk();
+        RevCommit tip = rw.parseCommit(targetRef.getObjectId());
+        boolean containsImplicitMerges = true;
+        for (RevCommit p : mergedParents) {
+          containsImplicitMerges &= !rw.isMergedInto(p, tip);
+        }
+
+        if (containsImplicitMerges) {
+          rw.reset();
+          for (RevCommit p : mergedParents) {
+            rw.markStart(p);
+          }
+          rw.markUninteresting(tip);
+          RevCommit c;
+          while ((c = rw.next()) != null) {
+            rw.parseBody(c);
+            messages.add(
+                new CommitValidationMessage(
+                    "Implicit Merge of " + c.abbreviate(7).name() + " " + c.getShortMessage(),
+                    ValidationMessage.Type.ERROR));
+          }
+          reject(magicBranch.cmd, "implicit merges detected");
+        }
+      }
+    }
+  }
+
+  // Mark all branch tips as uninteresting in the given revwalk,
+  // so we get only the new commits when walking rw.
+  private void markHeadsAsUninteresting(RevWalk rw, @Nullable String forRef) {
+    int i = 0;
+    for (Ref ref : allRefs().values()) {
+      if ((ref.getName().startsWith(R_HEADS) || ref.getName().equals(forRef))
+          && ref.getObjectId() != null) {
+        try {
+          rw.markUninteresting(rw.parseCommit(ref.getObjectId()));
+          i++;
+        } catch (IOException e) {
+          logger.atWarning().withCause(e).log(
+              "Invalid ref %s in %s", ref.getName(), project.getName());
+        }
+      }
+    }
+    logger.atFine().log("Marked %d heads as uninteresting", i);
+  }
+
+  private static boolean isValidChangeId(String idStr) {
+    return idStr.matches("^I[0-9a-fA-F]{40}$") && !idStr.matches("^I00*$");
+  }
+
+  private static class ChangeLookup {
+    final RevCommit commit;
+
+    @Nullable final Change.Key changeKey;
+    final List<ChangeData> destChanges;
+
+    ChangeLookup(RevCommit c, @Nullable Change.Key key, final List<ChangeData> destChanges) {
+      this.commit = c;
+      this.changeKey = key;
+      this.destChanges = destChanges;
+    }
+  }
+
+  private ChangeLookup lookupByChangeKey(RevCommit c, Change.Key key) throws OrmException {
+    return new ChangeLookup(c, key, queryProvider.get().byBranchKey(magicBranch.dest, key));
+  }
+
+  private ChangeLookup lookupByCommit(RevCommit c) throws OrmException {
+    return new ChangeLookup(
+        c, null, queryProvider.get().byBranchCommit(magicBranch.dest, c.getName()));
+  }
+
+  /** Represents a commit for which a Change should be created. */
+  private class CreateRequest {
+    final RevCommit commit;
+    final Task progress;
+    final String refName;
+
+    Change.Id changeId;
+    ReceiveCommand cmd;
+    ChangeInserter ins;
+    List<String> groups = ImmutableList.of();
+
+    Change change;
+
+    CreateRequest(RevCommit commit, String refName, Task progress) {
+      this.commit = commit;
+      this.refName = refName;
+      this.progress = progress;
+    }
+
+    private void setChangeId(int id) {
+      possiblyOverrideWorkInProgress();
+
+      changeId = new Change.Id(id);
+      ins =
+          changeInserterFactory
+              .create(changeId, commit, refName)
+              .setTopic(magicBranch.topic)
+              .setPrivate(setChangeAsPrivate)
+              .setWorkInProgress(magicBranch.workInProgress)
+              // Changes already validated in validateNewCommits.
+              .setValidate(false);
+
+      if (magicBranch.merged) {
+        ins.setStatus(Change.Status.MERGED);
+      }
+      cmd = new ReceiveCommand(ObjectId.zeroId(), commit, ins.getPatchSetId().toRefName());
+      if (receivePack.getPushCertificate() != null) {
+        ins.setPushCertificate(receivePack.getPushCertificate().toTextWithSignature());
+      }
+    }
+
+    private void possiblyOverrideWorkInProgress() {
+      // When wip or ready explicitly provided, leave it as is.
+      if (magicBranch.workInProgress || magicBranch.ready) {
+        return;
+      }
+      magicBranch.workInProgress =
+          projectState.is(BooleanProjectConfig.WORK_IN_PROGRESS_BY_DEFAULT)
+              || firstNonNull(user.state().getGeneralPreferences().workInProgressByDefault, false);
+    }
+
+    private void addOps(BatchUpdate bu) throws RestApiException {
+      checkState(changeId != null, "must call setChangeId before addOps");
+      try {
+        RevWalk rw = receivePack.getRevWalk();
+        rw.parseBody(commit);
+        final PatchSet.Id psId = ins.setGroups(groups).getPatchSetId();
+        Account.Id me = user.getAccountId();
+        List<FooterLine> footerLines = commit.getFooterLines();
+        requireNonNull(magicBranch);
+
+        // TODO(dborowitz): Support reviewers by email from footers? Maybe not: kernel developers
+        // with AOSP accounts already complain about these notifications, and that would make it
+        // worse. Might be better to get rid of the feature entirely:
+        // https://groups.google.com/d/topic/repo-discuss/tIFxY7L4DXk/discussion
+        MailRecipients fromFooters = getRecipientsFromFooters(accountResolver, footerLines);
+        fromFooters.remove(me);
+
+        Map<String, Short> approvals = magicBranch.labels;
+        StringBuilder msg =
+            new StringBuilder(
+                ApprovalsUtil.renderMessageWithApprovals(
+                    psId.get(), approvals, Collections.emptyMap()));
+        msg.append('.');
+        if (!Strings.isNullOrEmpty(magicBranch.message)) {
+          msg.append("\n").append(magicBranch.message);
+        }
+
+        bu.insertChange(
+            ins.setReviewersAndCcsAsStrings(
+                    magicBranch.getCombinedReviewers(fromFooters),
+                    magicBranch.getCombinedCcs(fromFooters))
+                .setApprovals(approvals)
+                .setMessage(msg.toString())
+                .setNotify(magicBranch.getNotify())
+                .setAccountsToNotify(magicBranch.getAccountsToNotify())
+                .setRequestScopePropagator(requestScopePropagator)
+                .setSendMail(true)
+                .setPatchSetDescription(magicBranch.message));
+        if (!magicBranch.hashtags.isEmpty()) {
+          // Any change owner is allowed to add hashtags when creating a change.
+          bu.addOp(
+              changeId,
+              hashtagsFactory.create(new HashtagsInput(magicBranch.hashtags)).setFireEvent(false));
+        }
+        if (!Strings.isNullOrEmpty(magicBranch.topic)) {
+          bu.addOp(
+              changeId,
+              new BatchUpdateOp() {
+                @Override
+                public boolean updateChange(ChangeContext ctx) {
+                  ctx.getUpdate(psId).setTopic(magicBranch.topic);
+                  return true;
+                }
+              });
+        }
+        bu.addOp(
+            changeId,
+            new BatchUpdateOp() {
+              @Override
+              public boolean updateChange(ChangeContext ctx) {
+                CreateRequest.this.change = ctx.getChange();
+                return false;
+              }
+            });
+        bu.addOp(changeId, new ChangeProgressOp(progress));
+      } catch (Exception e) {
+        throw INSERT_EXCEPTION.apply(e);
+      }
+    }
+  }
+
+  private void submit(Collection<CreateRequest> create, Collection<ReplaceRequest> replace)
+      throws OrmException, RestApiException, UpdateException, IOException, ConfigInvalidException,
+          PermissionBackendException {
+    Map<ObjectId, Change> bySha = Maps.newHashMapWithExpectedSize(create.size() + replace.size());
+    for (CreateRequest r : create) {
+      requireNonNull(
+          r.change,
+          () -> String.format("cannot submit new change %s; op may not have run", r.changeId));
+      bySha.put(r.commit, r.change);
+    }
+    for (ReplaceRequest r : replace) {
+      bySha.put(r.newCommitId, r.notes.getChange());
+    }
+    Change tipChange = bySha.get(magicBranch.cmd.getNewId());
+    requireNonNull(
+        tipChange,
+        () ->
+            String.format(
+                "tip of push does not correspond to a change; found these changes: %s", bySha));
+    logger.atFine().log(
+        "Processing submit with tip change %s (%s)", tipChange.getId(), magicBranch.cmd.getNewId());
+    try (MergeOp op = mergeOpProvider.get()) {
+      op.merge(db, tipChange, user, false, new SubmitInput(), false);
+    }
+  }
+
+  private void preparePatchSetsForReplace(List<CreateRequest> newChanges) {
+    try {
+      readChangesForReplace();
+      for (ReplaceRequest req : replaceByChange.values()) {
+        if (req.inputCommand.getResult() == NOT_ATTEMPTED) {
+          req.validateNewPatchSet();
+        }
+      }
+    } catch (OrmException err) {
+      logger.atSevere().withCause(err).log(
+          "Cannot read database before replacement for project %s", project.getName());
+      rejectRemainingRequests(replaceByChange.values(), "internal server error");
+    } catch (IOException | PermissionBackendException err) {
+      logger.atSevere().withCause(err).log(
+          "Cannot read repository before replacement for project %s", project.getName());
+      rejectRemainingRequests(replaceByChange.values(), "internal server error");
+    }
+    logger.atFine().log("Read %d changes to replace", replaceByChange.size());
+
+    if (magicBranch != null && magicBranch.cmd.getResult() != NOT_ATTEMPTED) {
+      // Cancel creations tied to refs/for/ or refs/drafts/ command.
+      for (ReplaceRequest req : replaceByChange.values()) {
+        if (req.inputCommand == magicBranch.cmd && req.cmd != null) {
+          req.cmd.setResult(Result.REJECTED_OTHER_REASON, "aborted");
+        }
+      }
+      for (CreateRequest req : newChanges) {
+        req.cmd.setResult(Result.REJECTED_OTHER_REASON, "aborted");
+      }
+    }
+  }
+
+  private void readChangesForReplace() throws OrmException {
+    Collection<ChangeNotes> allNotes =
+        notesFactory.create(
+            db, replaceByChange.values().stream().map(r -> r.ontoChange).collect(toList()));
+    for (ChangeNotes notes : allNotes) {
+      replaceByChange.get(notes.getChangeId()).notes = notes;
+    }
+  }
+
+  /** Represents a commit that should be stored in a new patchset of an existing change. */
+  private class ReplaceRequest {
+    final Change.Id ontoChange;
+    final ObjectId newCommitId;
+    final ReceiveCommand inputCommand;
+    final boolean checkMergedInto;
+    ChangeNotes notes;
+    BiMap<RevCommit, PatchSet.Id> revisions;
+    PatchSet.Id psId;
+    ReceiveCommand prev;
+    ReceiveCommand cmd;
+    PatchSetInfo info;
+    PatchSet.Id priorPatchSet;
+    List<String> groups = ImmutableList.of();
+    ReplaceOp replaceOp;
+
+    ReplaceRequest(
+        Change.Id toChange, RevCommit newCommit, ReceiveCommand cmd, boolean checkMergedInto) {
+      this.ontoChange = toChange;
+      this.newCommitId = newCommit.copy();
+      this.inputCommand = requireNonNull(cmd);
+      this.checkMergedInto = checkMergedInto;
+
+      revisions = HashBiMap.create();
+      for (Ref ref : refs(toChange)) {
+        try {
+          revisions.forcePut(
+              receivePack.getRevWalk().parseCommit(ref.getObjectId()),
+              PatchSet.Id.fromRef(ref.getName()));
+        } catch (IOException err) {
+          logger.atWarning().withCause(err).log(
+              "Project %s contains invalid change ref %s", project.getName(), ref.getName());
+        }
+      }
+    }
+
+    /**
+     * Validate the new patch set commit for this change.
+     *
+     * <p><strong>Side effects:</strong>
+     *
+     * <ul>
+     *   <li>May add error or warning messages to the progress monitor
+     *   <li>Will reject {@code cmd} prior to returning false
+     *   <li>May reset {@code receivePack.getRevWalk()}; do not call in the middle of a walk.
+     * </ul>
+     *
+     * @return whether the new commit is valid
+     * @throws IOException
+     * @throws OrmException
+     * @throws PermissionBackendException
+     */
+    boolean validateNewPatchSet() throws IOException, OrmException, PermissionBackendException {
+      if (!validateNewPatchSetNoteDb()) {
+        return false;
+      }
+      sameTreeWarning();
+
+      if (magicBranch != null) {
+        validateMagicBranchWipStatusChange();
+        if (inputCommand.getResult() != NOT_ATTEMPTED) {
+          return false;
+        }
+
+        if (magicBranch.edit || magicBranch.draft) {
+          return newEdit();
+        }
+      }
+
+      newPatchSet();
+      return true;
+    }
+
+    boolean validateNewPatchSetForAutoClose()
+        throws IOException, OrmException, PermissionBackendException {
+      if (!validateNewPatchSetNoteDb()) {
+        return false;
+      }
+
+      newPatchSet();
+      return true;
+    }
+
+    /** Validates the new PS against permissions and notedb status. */
+    private boolean validateNewPatchSetNoteDb()
+        throws IOException, OrmException, PermissionBackendException {
+      if (notes == null) {
+        reject(inputCommand, "change " + ontoChange + " not found");
+        return false;
+      }
+
+      Change change = notes.getChange();
+      priorPatchSet = change.currentPatchSetId();
+      if (!revisions.containsValue(priorPatchSet)) {
+        reject(inputCommand, "change " + ontoChange + " missing revisions");
+        return false;
+      }
+
+      RevCommit newCommit = receivePack.getRevWalk().parseCommit(newCommitId);
+
+      // Not allowed to create a new patch set if the current patch set is locked.
+      if (psUtil.isPatchSetLocked(notes)) {
+        reject(inputCommand, "cannot add patch set to " + ontoChange + ".");
+        return false;
+      }
+
+      try {
+        permissions.change(notes).database(db).check(ChangePermission.ADD_PATCH_SET);
+      } catch (AuthException no) {
+        reject(inputCommand, "cannot add patch set to " + ontoChange + ".");
+        return false;
+      }
+
+      if (change.getStatus().isClosed()) {
+        reject(inputCommand, "change " + ontoChange + " closed");
+        return false;
+      } else if (revisions.containsKey(newCommit)) {
+        reject(inputCommand, "commit already exists (in the change)");
+        return false;
+      }
+
+      for (Ref r : receivePack.getRepository().getRefDatabase().getRefsByPrefix("refs/changes")) {
+        if (r.getObjectId().equals(newCommit)) {
+          reject(inputCommand, "commit already exists (in the project)");
+          return false;
+        }
+      }
+
+      for (RevCommit prior : revisions.keySet()) {
+        // Don't allow a change to directly depend upon itself. This is a
+        // very common error due to users making a new commit rather than
+        // amending when trying to address review comments.
+        if (receivePack.getRevWalk().isMergedInto(prior, newCommit)) {
+          reject(inputCommand, SAME_CHANGE_ID_IN_MULTIPLE_CHANGES);
+          return false;
+        }
+      }
+
+      return true;
+    }
+
+    /** Validates whether the WIP change is allowed. Rejects inputCommand if not. */
+    private void validateMagicBranchWipStatusChange() throws PermissionBackendException {
+      Change change = notes.getChange();
+      if ((magicBranch.workInProgress || magicBranch.ready)
+          && magicBranch.workInProgress != change.isWorkInProgress()
+          && !user.getAccountId().equals(change.getOwner())) {
+        boolean hasWriteConfigPermission = false;
+        try {
+          permissions.check(ProjectPermission.WRITE_CONFIG);
+          hasWriteConfigPermission = true;
+        } catch (AuthException e) {
+          // Do nothing.
+        }
+
+        if (!hasWriteConfigPermission) {
+          try {
+            permissionBackend.user(user).check(GlobalPermission.ADMINISTRATE_SERVER);
+          } catch (AuthException e1) {
+            reject(inputCommand, ONLY_CHANGE_OWNER_OR_PROJECT_OWNER_CAN_MODIFY_WIP);
+          }
+        }
+      }
+    }
+
+    /** prints a warning if the new PS has the same tree as the previous commit. */
+    private void sameTreeWarning() throws IOException {
+      RevCommit newCommit = receivePack.getRevWalk().parseCommit(newCommitId);
+      RevCommit priorCommit = revisions.inverse().get(priorPatchSet);
+
+      if (newCommit.getTree().equals(priorCommit.getTree())) {
+        boolean messageEq =
+            Objects.equals(newCommit.getFullMessage(), priorCommit.getFullMessage());
+        boolean parentsEq = parentsEqual(newCommit, priorCommit);
+        boolean authorEq = authorEqual(newCommit, priorCommit);
+        ObjectReader reader = receivePack.getRevWalk().getObjectReader();
+
+        if (messageEq && parentsEq && authorEq) {
+          addMessage(
+              String.format(
+                  "warning: no changes between prior commit %s and new commit %s",
+                  reader.abbreviate(priorCommit).name(), reader.abbreviate(newCommit).name()));
+        } else {
+          StringBuilder msg = new StringBuilder();
+          msg.append("warning: ").append(reader.abbreviate(newCommit).name());
+          msg.append(":");
+          msg.append(" no files changed");
+          if (!authorEq) {
+            msg.append(", author changed");
+          }
+          if (!messageEq) {
+            msg.append(", message updated");
+          }
+          if (!parentsEq) {
+            msg.append(", was rebased");
+          }
+          addMessage(msg.toString());
+        }
+      }
+    }
+
+    /**
+     * Sets cmd and prev to the ReceiveCommands for change edits. Returns false if there was a
+     * failure.
+     */
+    private boolean newEdit() {
+      psId = notes.getChange().currentPatchSetId();
+      Optional<ChangeEdit> edit;
+
+      try {
+        edit = editUtil.byChange(notes, user);
+      } catch (AuthException | IOException e) {
+        logger.atSevere().withCause(e).log("Cannot retrieve edit");
+        return false;
+      }
+
+      if (edit.isPresent()) {
+        if (edit.get().getBasePatchSet().getId().equals(psId)) {
+          // replace edit
+          cmd =
+              new ReceiveCommand(edit.get().getEditCommit(), newCommitId, edit.get().getRefName());
+        } else {
+          // delete old edit ref on rebase
+          prev =
+              new ReceiveCommand(
+                  edit.get().getEditCommit(), ObjectId.zeroId(), edit.get().getRefName());
+          createEditCommand();
+        }
+      } else {
+        createEditCommand();
+      }
+
+      return true;
+    }
+
+    /** Creates a ReceiveCommand for a new edit. */
+    private void createEditCommand() {
+      cmd =
+          new ReceiveCommand(
+              ObjectId.zeroId(),
+              newCommitId,
+              RefNames.refsEdit(user.getAccountId(), notes.getChangeId(), psId));
+    }
+
+    /** Updates 'this' to add a new patchset. */
+    private void newPatchSet() throws IOException, OrmException {
+      RevCommit newCommit = receivePack.getRevWalk().parseCommit(newCommitId);
+      psId =
+          ChangeUtil.nextPatchSetIdFromAllRefsMap(allRefs(), notes.getChange().currentPatchSetId());
+      info = patchSetInfoFactory.get(receivePack.getRevWalk(), newCommit, psId);
+      cmd = new ReceiveCommand(ObjectId.zeroId(), newCommitId, psId.toRefName());
+    }
+
+    void addOps(BatchUpdate bu, @Nullable Task progress) throws IOException {
+      if (magicBranch != null && (magicBranch.edit || magicBranch.draft)) {
+        bu.addOp(notes.getChangeId(), new ReindexOnlyOp());
+        if (prev != null) {
+          bu.addRepoOnlyOp(new UpdateOneRefOp(prev));
+        }
+        bu.addRepoOnlyOp(new UpdateOneRefOp(cmd));
+        return;
+      }
+      RevWalk rw = receivePack.getRevWalk();
+      // TODO(dborowitz): Move to ReplaceOp#updateRepo.
+      RevCommit newCommit = rw.parseCommit(newCommitId);
+      rw.parseBody(newCommit);
+
+      RevCommit priorCommit = revisions.inverse().get(priorPatchSet);
+      replaceOp =
+          replaceOpFactory
+              .create(
+                  projectState,
+                  notes.getChange().getDest(),
+                  checkMergedInto,
+                  priorPatchSet,
+                  priorCommit,
+                  psId,
+                  newCommit,
+                  info,
+                  groups,
+                  magicBranch,
+                  receivePack.getPushCertificate())
+              .setRequestScopePropagator(requestScopePropagator);
+      bu.addOp(notes.getChangeId(), replaceOp);
+      if (progress != null) {
+        bu.addOp(notes.getChangeId(), new ChangeProgressOp(progress));
+      }
+    }
+
+    String getRejectMessage() {
+      return replaceOp != null ? replaceOp.getRejectMessage() : null;
+    }
+  }
+
+  private class UpdateGroupsRequest {
+    final PatchSet.Id psId;
+    final RevCommit commit;
+    List<String> groups = ImmutableList.of();
+
+    UpdateGroupsRequest(Ref ref, RevCommit commit) {
+      this.psId = requireNonNull(PatchSet.Id.fromRef(ref.getName()));
+      this.commit = commit;
+    }
+
+    private void addOps(BatchUpdate bu) {
+      bu.addOp(
+          psId.getParentKey(),
+          new BatchUpdateOp() {
+            @Override
+            public boolean updateChange(ChangeContext ctx) throws OrmException {
+              PatchSet ps = psUtil.get(ctx.getDb(), ctx.getNotes(), psId);
+              List<String> oldGroups = ps.getGroups();
+              if (oldGroups == null) {
+                if (groups == null) {
+                  return false;
+                }
+              } else if (sameGroups(oldGroups, groups)) {
+                return false;
+              }
+              psUtil.setGroups(ctx.getDb(), ctx.getUpdate(psId), ps, groups);
+              return true;
+            }
+          });
+    }
+
+    private boolean sameGroups(List<String> a, List<String> b) {
+      return Sets.newHashSet(a).equals(Sets.newHashSet(b));
+    }
+  }
+
+  private class UpdateOneRefOp implements RepoOnlyOp {
+    final ReceiveCommand cmd;
+
+    private UpdateOneRefOp(ReceiveCommand cmd) {
+      this.cmd = requireNonNull(cmd);
+    }
+
+    @Override
+    public void updateRepo(RepoContext ctx) throws IOException {
+      ctx.addRefUpdate(cmd);
+    }
+
+    @Override
+    public void postUpdate(Context ctx) {
+      String refName = cmd.getRefName();
+      if (cmd.getType() == ReceiveCommand.Type.UPDATE) { // aka fast-forward
+        logger.atFine().log("Updating tag cache on fast-forward of %s", cmd.getRefName());
+        tagCache.updateFastForward(project.getNameKey(), refName, cmd.getOldId(), cmd.getNewId());
+      }
+      if (isConfig(cmd)) {
+        logger.atFine().log("Reloading project in cache");
+        try {
+          projectCache.evict(project);
+        } catch (IOException e) {
+          logger.atWarning().withCause(e).log(
+              "Cannot evict from project cache, name key: %s", project.getName());
+        }
+        ProjectState ps = projectCache.get(project.getNameKey());
+        try {
+          logger.atFine().log("Updating project description");
+          repo.setGitwebDescription(ps.getProject().getDescription());
+        } catch (IOException e) {
+          logger.atWarning().withCause(e).log("cannot update description of %s", project.getName());
+        }
+        if (allProjectsName.equals(project.getNameKey())) {
+          try {
+            createGroupPermissionSyncer.syncIfNeeded();
+          } catch (IOException | ConfigInvalidException e) {
+            logger.atSevere().withCause(e).log("Can't sync create group permissions");
+          }
+        }
+      }
+    }
+  }
+
+  private static class ReindexOnlyOp implements BatchUpdateOp {
+    @Override
+    public boolean updateChange(ChangeContext ctx) {
+      // Trigger reindexing even though change isn't actually updated.
+      return true;
+    }
+  }
+
+  private List<Ref> refs(Change.Id changeId) {
+    return refsByChange().get(changeId);
+  }
+
+  private void initChangeRefMaps() {
+    if (refsByChange == null) {
+      int estRefsPerChange = 4;
+      refsById = MultimapBuilder.hashKeys().arrayListValues().build();
+      refsByChange =
+          MultimapBuilder.hashKeys(allRefs().size() / estRefsPerChange)
+              .arrayListValues(estRefsPerChange)
+              .build();
+      for (Ref ref : allRefs().values()) {
+        ObjectId obj = ref.getObjectId();
+        if (obj != null) {
+          PatchSet.Id psId = PatchSet.Id.fromRef(ref.getName());
+          if (psId != null) {
+            refsById.put(obj, ref);
+            refsByChange.put(psId.getParentKey(), ref);
+          }
+        }
+      }
+    }
+  }
+
+  private ListMultimap<Change.Id, Ref> refsByChange() {
+    initChangeRefMaps();
+    return refsByChange;
+  }
+
+  private ListMultimap<ObjectId, Ref> changeRefsById() {
+    initChangeRefMaps();
+    return refsById;
+  }
+
+  private static boolean parentsEqual(RevCommit a, RevCommit b) {
+    if (a.getParentCount() != b.getParentCount()) {
+      return false;
+    }
+    for (int i = 0; i < a.getParentCount(); i++) {
+      if (!a.getParent(i).equals(b.getParent(i))) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  private static boolean authorEqual(RevCommit a, RevCommit b) {
+    PersonIdent aAuthor = a.getAuthorIdent();
+    PersonIdent bAuthor = b.getAuthorIdent();
+
+    if (aAuthor == null && bAuthor == null) {
+      return true;
+    } else if (aAuthor == null || bAuthor == null) {
+      return false;
+    }
+
+    return Objects.equals(aAuthor.getName(), bAuthor.getName())
+        && Objects.equals(aAuthor.getEmailAddress(), bAuthor.getEmailAddress());
+  }
+
+  // Run RefValidators on the command. If any validator fails, the command status is set to
+  // REJECTED, and the return value is 'false'
+  private boolean validRefOperation(ReceiveCommand cmd) {
+    RefOperationValidators refValidators = refValidatorsFactory.create(getProject(), user, cmd);
+
+    try {
+      messages.addAll(refValidators.validateForRefOperation());
+    } catch (RefOperationValidationException e) {
+      messages.addAll(Lists.newArrayList(e.getMessages()));
+      reject(cmd, e.getMessage());
+      return false;
+    }
+
+    return true;
+  }
+
+  /**
+   * Validates the commits that a regular push brings in.
+   *
+   * <p>On validation failure, the command is rejected.
+   */
+  private void validateRegularPushCommits(Branch.NameKey branch, ReceiveCommand cmd)
+      throws PermissionBackendException {
+    if (!RefNames.REFS_CONFIG.equals(cmd.getRefName())
+        && !(MagicBranch.isMagicBranch(cmd.getRefName())
+            || NEW_PATCHSET_PATTERN.matcher(cmd.getRefName()).matches())
+        && pushOptions.containsKey(PUSH_OPTION_SKIP_VALIDATION)) {
+      if (projectState.is(BooleanProjectConfig.USE_SIGNED_OFF_BY)) {
+        reject(cmd, "requireSignedOffBy prevents option " + PUSH_OPTION_SKIP_VALIDATION);
+        return;
+      }
+
+      Optional<AuthException> err =
+          checkRefPermission(permissions.ref(branch.get()), RefPermission.SKIP_VALIDATION);
+      if (err.isPresent()) {
+        rejectProhibited(cmd, err.get());
+        return;
+      }
+      if (!Iterables.isEmpty(rejectCommits)) {
+        reject(cmd, "reject-commits prevents " + PUSH_OPTION_SKIP_VALIDATION);
+      }
+      logger.atFine().log("Short-circuiting new commit validation");
+      return;
+    }
+
+    BranchCommitValidator validator = commitValidatorFactory.create(projectState, branch, user);
+    RevWalk walk = receivePack.getRevWalk();
+    walk.reset();
+    walk.sort(RevSort.NONE);
+    try {
+      RevObject parsedObject = walk.parseAny(cmd.getNewId());
+      if (!(parsedObject instanceof RevCommit)) {
+        return;
+      }
+      ListMultimap<ObjectId, Ref> existing = changeRefsById();
+      walk.markStart((RevCommit) parsedObject);
+      markHeadsAsUninteresting(walk, cmd.getRefName());
+      int limit = receiveConfig.maxBatchCommits;
+      int n = 0;
+      for (RevCommit c; (c = walk.next()) != null; ) {
+        if (++n > limit) {
+          logger.atFine().log("Number of new commits exceeds limit of %d", limit);
+          reject(
+              cmd,
+              String.format(
+                  "more than %d commits, and %s not set", limit, PUSH_OPTION_SKIP_VALIDATION));
+          return;
+        }
+        if (existing.keySet().contains(c)) {
+          continue;
+        }
+
+        if (!validator.validCommit(
+            walk.getObjectReader(), cmd, c, false, messages, rejectCommits, null)) {
+          break;
+        }
+      }
+      logger.atFine().log("Validated %d new commits", n);
+    } catch (IOException err) {
+      cmd.setResult(REJECTED_MISSING_OBJECT);
+      logger.atSevere().withCause(err).log("Invalid pack upload; one or more objects weren't sent");
+    }
+  }
+
+  private void autoCloseChanges(ReceiveCommand cmd, Task progress) {
+    logger.atFine().log("Starting auto-closing of changes");
+    String refName = cmd.getRefName();
+    Set<Change.Id> ids = new HashSet<>();
+
+    // TODO(dborowitz): Combine this BatchUpdate with the main one in
+    // handleRegularCommands
+    try {
+      retryHelper.execute(
+          updateFactory -> {
+            try (BatchUpdate bu =
+                    updateFactory.create(db, projectState.getNameKey(), user, TimeUtil.nowTs());
+                ObjectInserter ins = repo.newObjectInserter();
+                ObjectReader reader = ins.newReader();
+                RevWalk rw = new RevWalk(reader)) {
+              bu.setRepository(repo, rw, ins).updateChangesInParallel();
+              // TODO(dborowitz): Teach BatchUpdate to ignore missing changes.
+
+              RevCommit newTip = rw.parseCommit(cmd.getNewId());
+              Branch.NameKey branch = new Branch.NameKey(project.getNameKey(), refName);
+
+              rw.reset();
+              rw.markStart(newTip);
+              if (!ObjectId.zeroId().equals(cmd.getOldId())) {
+                rw.markUninteresting(rw.parseCommit(cmd.getOldId()));
+              }
+
+              ListMultimap<ObjectId, Ref> byCommit = changeRefsById();
+              Map<Change.Key, ChangeNotes> byKey = null;
+              List<ReplaceRequest> replaceAndClose = new ArrayList<>();
+
+              int existingPatchSets = 0;
+              int newPatchSets = 0;
+              COMMIT:
+              for (RevCommit c; (c = rw.next()) != null; ) {
+                rw.parseBody(c);
+
+                for (Ref ref : byCommit.get(c.copy())) {
+                  PatchSet.Id psId = PatchSet.Id.fromRef(ref.getName());
+                  Optional<ChangeNotes> notes = getChangeNotes(psId.getParentKey());
+                  if (notes.isPresent() && notes.get().getChange().getDest().equals(branch)) {
+                    existingPatchSets++;
+                    bu.addOp(
+                        psId.getParentKey(),
+                        mergedByPushOpFactory.create(requestScopePropagator, psId, refName));
+                    continue COMMIT;
+                  }
+                }
+
+                for (String changeId : c.getFooterLines(CHANGE_ID)) {
+                  if (byKey == null) {
+                    byKey = executeIndexQuery(() -> openChangesByKeyByBranch(branch));
+                  }
+
+                  ChangeNotes onto = byKey.get(new Change.Key(changeId.trim()));
+                  if (onto != null) {
+                    newPatchSets++;
+                    // Hold onto this until we're done with the walk, as the call to
+                    // req.validate below calls isMergedInto which resets the walk.
+                    ReplaceRequest req = new ReplaceRequest(onto.getChangeId(), c, cmd, false);
+                    req.notes = onto;
+                    replaceAndClose.add(req);
+                    continue COMMIT;
+                  }
+                }
+              }
+
+              for (ReplaceRequest req : replaceAndClose) {
+                Change.Id id = req.notes.getChangeId();
+                if (!req.validateNewPatchSetForAutoClose()) {
+                  logger.atFine().log("Not closing %s because validation failed", id);
+                  continue;
+                }
+                req.addOps(bu, null);
+                bu.addOp(
+                    id,
+                    mergedByPushOpFactory
+                        .create(requestScopePropagator, req.psId, refName)
+                        .setPatchSetProvider(req.replaceOp::getPatchSet));
+                bu.addOp(id, new ChangeProgressOp(progress));
+                ids.add(id);
+              }
+
+              logger.atFine().log(
+                  "Auto-closing %s changes with existing patch sets and %s with new patch sets",
+                  existingPatchSets, newPatchSets);
+              bu.execute();
+            } catch (IOException | OrmException | PermissionBackendException e) {
+              logger.atSevere().withCause(e).log("Failed to auto-close changes");
+              return null;
+            }
+
+            // If we are here, we didn't throw UpdateException. Record the result.
+            // The ordering is indeterminate due to the HashSet; unfortunately, Change.Id doesn't
+            // fit into TreeSet.
+            ids.stream().forEach(id -> resultChangeIds.add(Key.AUTOCLOSED, id));
+
+            return null;
+          },
+          // Use a multiple of the default timeout to account for inner retries that may otherwise
+          // eat up the whole timeout so that no time is left to retry this outer action.
+          RetryHelper.options()
+              .timeout(retryHelper.getDefaultTimeout(ActionType.CHANGE_UPDATE).multipliedBy(5))
+              .build());
+    } catch (RestApiException e) {
+      logger.atSevere().withCause(e).log("Can't insert patchset");
+    } catch (UpdateException e) {
+      logger.atSevere().withCause(e).log("Failed to auto-close changes");
+    }
+  }
+
+  private Optional<ChangeNotes> getChangeNotes(Change.Id changeId) throws OrmException {
+    try {
+      return Optional.of(notesFactory.createChecked(db, project.getNameKey(), changeId));
+    } catch (NoSuchChangeException e) {
+      return Optional.empty();
+    }
+  }
+
+  private <T> T executeIndexQuery(Action<T> action) throws OrmException {
+    try {
+      return retryHelper.execute(ActionType.INDEX_QUERY, action, OrmException.class::isInstance);
+    } catch (Exception e) {
+      Throwables.throwIfUnchecked(e);
+      Throwables.throwIfInstanceOf(e, OrmException.class);
+      throw new OrmException(e);
+    }
+  }
+
+  private Map<Change.Key, ChangeNotes> openChangesByKeyByBranch(Branch.NameKey branch)
+      throws OrmException {
+    Map<Change.Key, ChangeNotes> r = new HashMap<>();
+    for (ChangeData cd : queryProvider.get().byBranchOpen(branch)) {
+      try {
+        r.put(cd.change().getKey(), cd.notes());
+      } catch (NoSuchChangeException e) {
+        // Ignore deleted change
+      }
+    }
+    return r;
+  }
+
+  // allRefsWatcher hooks into the protocol negotation to get a list of all known refs.
+  // This is used as a cache of ref -> sha1 values, and to build an inverse index
+  // of (change => list of refs) and a (SHA1 => refs).
+  private Map<String, Ref> allRefs() {
+    return allRefsWatcher.getAllRefs();
+  }
+
+  private static void reject(ReceiveCommand cmd, String why) {
+    cmd.setResult(REJECTED_OTHER_REASON, why);
+  }
+
+  private static void rejectRemaining(Collection<ReceiveCommand> commands, String why) {
+    rejectRemaining(commands.stream(), why);
+  }
+
+  private static void rejectRemaining(Stream<ReceiveCommand> commands, String why) {
+    commands.filter(cmd -> cmd.getResult() == NOT_ATTEMPTED).forEach(cmd -> reject(cmd, why));
+  }
+
+  private static void rejectRemainingRequests(Collection<ReplaceRequest> requests, String why) {
+    rejectRemaining(requests.stream().map(req -> req.cmd), why);
+  }
+
+  private static boolean isHead(ReceiveCommand cmd) {
+    return cmd.getRefName().startsWith(Constants.R_HEADS);
+  }
+
+  private static boolean isConfig(ReceiveCommand cmd) {
+    return cmd.getRefName().equals(RefNames.REFS_CONFIG);
+  }
+}
diff --git a/java/com/google/gerrit/server/git/receive/ReceiveCommitsAdvertiseRefsHook.java b/java/com/google/gerrit/server/git/receive/ReceiveCommitsAdvertiseRefsHook.java
new file mode 100644
index 0000000..8cbcc88
--- /dev/null
+++ b/java/com/google/gerrit/server/git/receive/ReceiveCommitsAdvertiseRefsHook.java
@@ -0,0 +1,132 @@
+// Copyright (C) 2010 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.google.gerrit.server.git.receive;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.git.HookUtil;
+import com.google.gerrit.server.index.change.ChangeField;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gerrit.server.util.MagicBranch;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Provider;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.transport.AdvertiseRefsHook;
+import org.eclipse.jgit.transport.BaseReceivePack;
+import org.eclipse.jgit.transport.ServiceMayNotContinueException;
+import org.eclipse.jgit.transport.UploadPack;
+
+/** Exposes only the non refs/changes/ reference names. */
+public class ReceiveCommitsAdvertiseRefsHook implements AdvertiseRefsHook {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  @VisibleForTesting
+  @AutoValue
+  public abstract static class Result {
+    public abstract Map<String, Ref> allRefs();
+
+    public abstract Set<ObjectId> additionalHaves();
+  }
+
+  private final Provider<InternalChangeQuery> queryProvider;
+  private final Project.NameKey projectName;
+
+  public ReceiveCommitsAdvertiseRefsHook(
+      Provider<InternalChangeQuery> queryProvider, Project.NameKey projectName) {
+    this.queryProvider = queryProvider;
+    this.projectName = projectName;
+  }
+
+  @Override
+  public void advertiseRefs(UploadPack us) {
+    throw new UnsupportedOperationException(
+        "ReceiveCommitsAdvertiseRefsHook cannot be used for UploadPack");
+  }
+
+  @Override
+  public void advertiseRefs(BaseReceivePack rp) throws ServiceMayNotContinueException {
+    Result r = advertiseRefs(HookUtil.ensureAllRefsAdvertised(rp));
+    rp.setAdvertisedRefs(r.allRefs(), r.additionalHaves());
+  }
+
+  @VisibleForTesting
+  public Result advertiseRefs(Map<String, Ref> oldRefs) {
+    Map<String, Ref> r = Maps.newHashMapWithExpectedSize(oldRefs.size());
+    Set<ObjectId> allPatchSets = Sets.newHashSetWithExpectedSize(oldRefs.size());
+    for (Map.Entry<String, Ref> e : oldRefs.entrySet()) {
+      String name = e.getKey();
+      if (!skip(name)) {
+        r.put(name, e.getValue());
+      }
+      if (name.startsWith(RefNames.REFS_CHANGES)) {
+        allPatchSets.add(e.getValue().getObjectId());
+      }
+    }
+    return new AutoValue_ReceiveCommitsAdvertiseRefsHook_Result(
+        r, advertiseOpenChanges(allPatchSets));
+  }
+
+  private Set<ObjectId> advertiseOpenChanges(Set<ObjectId> allPatchSets) {
+    // Advertise some recent open changes, in case a commit is based on one.
+    int limit = 32;
+    try {
+      Set<ObjectId> r = Sets.newHashSetWithExpectedSize(limit);
+      for (ChangeData cd :
+          queryProvider
+              .get()
+              .setRequestedFields(
+                  // Required for ChangeIsVisibleToPrdicate.
+                  ChangeField.CHANGE,
+                  ChangeField.REVIEWER,
+                  // Required during advertiseOpenChanges.
+                  ChangeField.PATCH_SET)
+              .enforceVisibility(true)
+              .setLimit(limit)
+              .byProjectOpen(projectName)) {
+        PatchSet ps = cd.currentPatchSet();
+        if (ps != null) {
+          ObjectId id = ObjectId.fromString(ps.getRevision().get());
+          // Ensure we actually observed a patch set ref pointing to this
+          // object, in case the database is out of sync with the repo and the
+          // object doesn't actually exist.
+          if (allPatchSets.contains(id)) {
+            r.add(id);
+          }
+        }
+      }
+      return r;
+    } catch (OrmException err) {
+      logger.atSevere().withCause(err).log("Cannot list open changes of %s", projectName);
+      return Collections.emptySet();
+    }
+  }
+
+  private static boolean skip(String name) {
+    return name.startsWith(RefNames.REFS_CHANGES)
+        || name.startsWith(RefNames.REFS_CACHE_AUTOMERGE)
+        || MagicBranch.isMagicBranch(name);
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveCommitsModule.java b/java/com/google/gerrit/server/git/receive/ReceiveCommitsModule.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveCommitsModule.java
rename to java/com/google/gerrit/server/git/receive/ReceiveCommitsModule.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveConfig.java b/java/com/google/gerrit/server/git/receive/ReceiveConfig.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveConfig.java
rename to java/com/google/gerrit/server/git/receive/ReceiveConfig.java
diff --git a/java/com/google/gerrit/server/git/receive/ReceiveConstants.java b/java/com/google/gerrit/server/git/receive/ReceiveConstants.java
new file mode 100644
index 0000000..03a1b33
--- /dev/null
+++ b/java/com/google/gerrit/server/git/receive/ReceiveConstants.java
@@ -0,0 +1,35 @@
+// Copyright (C) 2017 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.google.gerrit.server.git.receive;
+
+import com.google.common.annotations.VisibleForTesting;
+
+public final class ReceiveConstants {
+  public static final String PUSH_OPTION_SKIP_VALIDATION = "skip-validation";
+
+  @VisibleForTesting
+  public static final String ONLY_CHANGE_OWNER_OR_PROJECT_OWNER_CAN_MODIFY_WIP =
+      "only change owner or project owner can modify Work-in-Progress";
+
+  static final String COMMAND_REJECTION_MESSAGE_FOOTER =
+      "Contact an administrator to fix the permissions";
+
+  static final String SAME_CHANGE_ID_IN_MULTIPLE_CHANGES =
+      "same Change-Id in multiple changes.\n"
+          + "Squash the commits with the same Change-Id or "
+          + "ensure Change-Ids are unique for each commit";
+
+  private ReceiveConstants() {}
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveRefFilter.java b/java/com/google/gerrit/server/git/receive/ReceiveRefFilter.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveRefFilter.java
rename to java/com/google/gerrit/server/git/receive/ReceiveRefFilter.java
diff --git a/java/com/google/gerrit/server/git/receive/ReplaceOp.java b/java/com/google/gerrit/server/git/receive/ReplaceOp.java
new file mode 100644
index 0000000..7bb16d81
--- /dev/null
+++ b/java/com/google/gerrit/server/git/receive/ReplaceOp.java
@@ -0,0 +1,682 @@
+// 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.
+
+package com.google.gerrit.server.git.receive;
+
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static com.google.common.collect.ImmutableSet.toImmutableSet;
+import static com.google.gerrit.common.FooterConstants.CHANGE_ID;
+import static com.google.gerrit.server.change.ReviewerAdder.newAddReviewerInputFromCommitIdentity;
+import static com.google.gerrit.server.mail.MailUtil.getRecipientsFromFooters;
+import static com.google.gerrit.server.mail.MailUtil.getRecipientsFromReviewers;
+import static com.google.gerrit.server.notedb.ReviewerStateInternal.REVIEWER;
+import static org.eclipse.jgit.lib.Constants.R_HEADS;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.Streams;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.extensions.api.changes.AddReviewerInput;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.client.ChangeKind;
+import com.google.gerrit.extensions.client.ReviewerState;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.client.PatchSetInfo;
+import com.google.gerrit.server.ApprovalCopier;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.PublishCommentUtil;
+import com.google.gerrit.server.account.AccountResolver;
+import com.google.gerrit.server.change.AddReviewersOp;
+import com.google.gerrit.server.change.ChangeKindCache;
+import com.google.gerrit.server.change.EmailReviewComments;
+import com.google.gerrit.server.change.ReviewerAdder;
+import com.google.gerrit.server.change.ReviewerAdder.InternalAddReviewerInput;
+import com.google.gerrit.server.change.ReviewerAdder.ReviewerAddition;
+import com.google.gerrit.server.change.ReviewerAdder.ReviewerAdditionList;
+import com.google.gerrit.server.config.SendEmailExecutor;
+import com.google.gerrit.server.extensions.events.CommentAdded;
+import com.google.gerrit.server.extensions.events.RevisionCreated;
+import com.google.gerrit.server.git.MergedByPushOp;
+import com.google.gerrit.server.git.receive.ReceiveCommits.MagicBranchInput;
+import com.google.gerrit.server.mail.MailUtil.MailRecipients;
+import com.google.gerrit.server.mail.send.ReplacePatchSetSender;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.Context;
+import com.google.gerrit.server.update.RepoContext;
+import com.google.gerrit.server.util.RequestScopePropagator;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import com.google.inject.util.Providers;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+import java.util.stream.Stream;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.PushCertificate;
+import org.eclipse.jgit.transport.ReceiveCommand;
+
+public class ReplaceOp implements BatchUpdateOp {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public interface Factory {
+    ReplaceOp create(
+        ProjectState projectState,
+        Branch.NameKey dest,
+        boolean checkMergedInto,
+        @Assisted("priorPatchSetId") PatchSet.Id priorPatchSetId,
+        @Assisted("priorCommitId") ObjectId priorCommit,
+        @Assisted("patchSetId") PatchSet.Id patchSetId,
+        @Assisted("commitId") ObjectId commitId,
+        PatchSetInfo info,
+        List<String> groups,
+        @Nullable MagicBranchInput magicBranch,
+        @Nullable PushCertificate pushCertificate);
+  }
+
+  private static final String CHANGE_IS_CLOSED = "change is closed";
+
+  private final AccountResolver accountResolver;
+  private final ApprovalCopier approvalCopier;
+  private final ApprovalsUtil approvalsUtil;
+  private final ChangeData.Factory changeDataFactory;
+  private final ChangeKindCache changeKindCache;
+  private final ChangeMessagesUtil cmUtil;
+  private final CommentsUtil commentsUtil;
+  private final PublishCommentUtil publishCommentUtil;
+  private final EmailReviewComments.Factory emailCommentsFactory;
+  private final ExecutorService sendEmailExecutor;
+  private final RevisionCreated revisionCreated;
+  private final CommentAdded commentAdded;
+  private final MergedByPushOp.Factory mergedByPushOpFactory;
+  private final PatchSetUtil psUtil;
+  private final ReplacePatchSetSender.Factory replacePatchSetFactory;
+  private final ProjectCache projectCache;
+  private final ReviewerAdder reviewerAdder;
+
+  private final ProjectState projectState;
+  private final Branch.NameKey dest;
+  private final boolean checkMergedInto;
+  private final PatchSet.Id priorPatchSetId;
+  private final ObjectId priorCommitId;
+  private final PatchSet.Id patchSetId;
+  private final ObjectId commitId;
+  private final PatchSetInfo info;
+  private final MagicBranchInput magicBranch;
+  private final PushCertificate pushCertificate;
+  private List<String> groups;
+
+  private final Map<String, Short> approvals = new HashMap<>();
+  private RevCommit commit;
+  private ReceiveCommand cmd;
+  private ChangeNotes notes;
+  private PatchSet newPatchSet;
+  private ChangeKind changeKind;
+  private ChangeMessage msg;
+  private List<Comment> comments = ImmutableList.of();
+  private String rejectMessage;
+  private MergedByPushOp mergedByPushOp;
+  private RequestScopePropagator requestScopePropagator;
+  private ReviewerAdditionList reviewerAdditions;
+  private MailRecipients oldRecipients;
+
+  @Inject
+  ReplaceOp(
+      AccountResolver accountResolver,
+      ApprovalCopier approvalCopier,
+      ApprovalsUtil approvalsUtil,
+      ChangeData.Factory changeDataFactory,
+      ChangeKindCache changeKindCache,
+      ChangeMessagesUtil cmUtil,
+      CommentsUtil commentsUtil,
+      PublishCommentUtil publishCommentUtil,
+      EmailReviewComments.Factory emailCommentsFactory,
+      RevisionCreated revisionCreated,
+      CommentAdded commentAdded,
+      MergedByPushOp.Factory mergedByPushOpFactory,
+      PatchSetUtil psUtil,
+      ReplacePatchSetSender.Factory replacePatchSetFactory,
+      ProjectCache projectCache,
+      @SendEmailExecutor ExecutorService sendEmailExecutor,
+      ReviewerAdder reviewerAdder,
+      @Assisted ProjectState projectState,
+      @Assisted Branch.NameKey dest,
+      @Assisted boolean checkMergedInto,
+      @Assisted("priorPatchSetId") PatchSet.Id priorPatchSetId,
+      @Assisted("priorCommitId") ObjectId priorCommitId,
+      @Assisted("patchSetId") PatchSet.Id patchSetId,
+      @Assisted("commitId") ObjectId commitId,
+      @Assisted PatchSetInfo info,
+      @Assisted List<String> groups,
+      @Assisted @Nullable MagicBranchInput magicBranch,
+      @Assisted @Nullable PushCertificate pushCertificate) {
+    this.accountResolver = accountResolver;
+    this.approvalCopier = approvalCopier;
+    this.approvalsUtil = approvalsUtil;
+    this.changeDataFactory = changeDataFactory;
+    this.changeKindCache = changeKindCache;
+    this.cmUtil = cmUtil;
+    this.commentsUtil = commentsUtil;
+    this.publishCommentUtil = publishCommentUtil;
+    this.emailCommentsFactory = emailCommentsFactory;
+    this.revisionCreated = revisionCreated;
+    this.commentAdded = commentAdded;
+    this.mergedByPushOpFactory = mergedByPushOpFactory;
+    this.psUtil = psUtil;
+    this.replacePatchSetFactory = replacePatchSetFactory;
+    this.projectCache = projectCache;
+    this.sendEmailExecutor = sendEmailExecutor;
+    this.reviewerAdder = reviewerAdder;
+
+    this.projectState = projectState;
+    this.dest = dest;
+    this.checkMergedInto = checkMergedInto;
+    this.priorPatchSetId = priorPatchSetId;
+    this.priorCommitId = priorCommitId.copy();
+    this.patchSetId = patchSetId;
+    this.commitId = commitId.copy();
+    this.info = info;
+    this.groups = groups;
+    this.magicBranch = magicBranch;
+    this.pushCertificate = pushCertificate;
+  }
+
+  @Override
+  public void updateRepo(RepoContext ctx) throws Exception {
+    commit = ctx.getRevWalk().parseCommit(commitId);
+    ctx.getRevWalk().parseBody(commit);
+    changeKind =
+        changeKindCache.getChangeKind(
+            projectState.getNameKey(),
+            ctx.getRevWalk(),
+            ctx.getRepoView().getConfig(),
+            priorCommitId,
+            commitId);
+
+    if (checkMergedInto) {
+      String mergedInto = findMergedInto(ctx, dest.get(), commit);
+      if (mergedInto != null) {
+        mergedByPushOp =
+            mergedByPushOpFactory.create(requestScopePropagator, patchSetId, mergedInto);
+      }
+    }
+
+    cmd = new ReceiveCommand(ObjectId.zeroId(), commitId, patchSetId.toRefName());
+    ctx.addRefUpdate(cmd);
+  }
+
+  @Override
+  public boolean updateChange(ChangeContext ctx)
+      throws RestApiException, OrmException, IOException, PermissionBackendException,
+          ConfigInvalidException {
+    notes = ctx.getNotes();
+    Change change = notes.getChange();
+    if (change == null || change.getStatus().isClosed()) {
+      rejectMessage = CHANGE_IS_CLOSED;
+      return false;
+    }
+    if (groups.isEmpty()) {
+      PatchSet prevPs = psUtil.current(ctx.getDb(), notes);
+      groups = prevPs != null ? prevPs.getGroups() : ImmutableList.<String>of();
+    }
+
+    ChangeData cd = changeDataFactory.create(ctx.getDb(), ctx.getNotes());
+    oldRecipients = getRecipientsFromReviewers(cd.reviewers());
+
+    ChangeUpdate update = ctx.getUpdate(patchSetId);
+    update.setSubjectForCommit("Create patch set " + patchSetId.get());
+
+    String reviewMessage = null;
+    String psDescription = null;
+    if (magicBranch != null) {
+      reviewMessage = magicBranch.message;
+      psDescription = magicBranch.message;
+      approvals.putAll(magicBranch.labels);
+      Set<String> hashtags = magicBranch.hashtags;
+      if (hashtags != null && !hashtags.isEmpty()) {
+        hashtags.addAll(notes.getHashtags());
+        update.setHashtags(hashtags);
+      }
+      if (magicBranch.topic != null && !magicBranch.topic.equals(ctx.getChange().getTopic())) {
+        update.setTopic(magicBranch.topic);
+      }
+      if (magicBranch.removePrivate) {
+        change.setPrivate(false);
+        update.setPrivate(false);
+      } else if (magicBranch.isPrivate) {
+        change.setPrivate(true);
+        update.setPrivate(true);
+      }
+      if (magicBranch.ready) {
+        change.setWorkInProgress(false);
+        change.setReviewStarted(true);
+        update.setWorkInProgress(false);
+      } else if (magicBranch.workInProgress) {
+        change.setWorkInProgress(true);
+        update.setWorkInProgress(true);
+      }
+      if (shouldPublishComments()) {
+        boolean workInProgress = change.isWorkInProgress();
+        if (magicBranch != null && magicBranch.workInProgress) {
+          workInProgress = true;
+        }
+        comments = publishComments(ctx, workInProgress);
+      }
+    }
+
+    newPatchSet =
+        psUtil.insert(
+            ctx.getDb(),
+            ctx.getRevWalk(),
+            update,
+            patchSetId,
+            commitId,
+            groups,
+            pushCertificate != null ? pushCertificate.toTextWithSignature() : null,
+            psDescription);
+
+    update.setPsDescription(psDescription);
+    MailRecipients fromFooters = getRecipientsFromFooters(accountResolver, commit.getFooterLines());
+    Iterable<PatchSetApproval> newApprovals =
+        approvalsUtil.addApprovalsForNewPatchSet(
+            ctx.getDb(),
+            update,
+            projectState.getLabelTypes(),
+            newPatchSet,
+            ctx.getUser(),
+            approvals);
+    approvalCopier.copyInReviewDb(
+        ctx.getDb(),
+        ctx.getNotes(),
+        newPatchSet,
+        ctx.getRevWalk(),
+        ctx.getRepoView().getConfig(),
+        newApprovals);
+
+    reviewerAdditions =
+        reviewerAdder.prepare(
+            ctx.getDb(),
+            ctx.getNotes(),
+            ctx.getUser(),
+            getReviewerInputs(magicBranch, fromFooters, ctx.getChange(), info),
+            true);
+    Optional<ReviewerAddition> reviewerError = reviewerAdditions.getFailures().stream().findFirst();
+    if (reviewerError.isPresent()) {
+      throw new UnprocessableEntityException(reviewerError.get().result.error);
+    }
+    reviewerAdditions.updateChange(ctx, newPatchSet);
+
+    // Check if approvals are changing in with this update. If so, add current user to reviewers.
+    // Note that this is done separately as addReviewers is filtering out the change owner as
+    // reviewer which is needed in several other code paths.
+    if (magicBranch != null && !magicBranch.labels.isEmpty()) {
+      update.putReviewer(ctx.getAccountId(), REVIEWER);
+    }
+
+    msg = createChangeMessage(ctx, reviewMessage);
+    cmUtil.addChangeMessage(ctx.getDb(), update, msg);
+
+    if (mergedByPushOp == null) {
+      resetChange(ctx);
+    } else {
+      mergedByPushOp.setPatchSetProvider(Providers.of(newPatchSet)).updateChange(ctx);
+    }
+
+    return true;
+  }
+
+  private static ImmutableList<AddReviewerInput> getReviewerInputs(
+      @Nullable MagicBranchInput magicBranch,
+      MailRecipients fromFooters,
+      Change change,
+      PatchSetInfo psInfo) {
+    // Disable individual emails when adding reviewers, as all reviewers will receive the single
+    // bulk new change email.
+    Stream<AddReviewerInput> inputs =
+        Streams.concat(
+            Streams.stream(
+                newAddReviewerInputFromCommitIdentity(
+                    change, psInfo.getAuthor().getAccount(), NotifyHandling.NONE)),
+            Streams.stream(
+                newAddReviewerInputFromCommitIdentity(
+                    change, psInfo.getCommitter().getAccount(), NotifyHandling.NONE)));
+    if (magicBranch != null) {
+      inputs =
+          Streams.concat(
+              inputs,
+              magicBranch.getCombinedReviewers(fromFooters).stream()
+                  .map(r -> newAddReviewerInput(r, ReviewerState.REVIEWER)),
+              magicBranch.getCombinedCcs(fromFooters).stream()
+                  .map(r -> newAddReviewerInput(r, ReviewerState.CC)));
+    }
+    return inputs.collect(toImmutableList());
+  }
+
+  private static InternalAddReviewerInput newAddReviewerInput(
+      String reviewer, ReviewerState state) {
+    // Disable individual emails when adding reviewers, as all reviewers will receive the single
+    // bulk new patch set email.
+    InternalAddReviewerInput input =
+        ReviewerAdder.newAddReviewerInput(reviewer, state, NotifyHandling.NONE);
+
+    // Ignore failures for reasons like the reviewer being inactive or being unable to see the
+    // change. See discussion in ChangeInserter.
+    input.otherFailureBehavior = ReviewerAdder.FailureBehavior.IGNORE;
+
+    return input;
+  }
+
+  private ChangeMessage createChangeMessage(ChangeContext ctx, String reviewMessage)
+      throws OrmException, IOException {
+    String approvalMessage =
+        ApprovalsUtil.renderMessageWithApprovals(
+            patchSetId.get(), approvals, scanLabels(ctx, approvals));
+    String kindMessage = changeKindMessage(changeKind);
+    StringBuilder message = new StringBuilder(approvalMessage);
+    if (!Strings.isNullOrEmpty(kindMessage)) {
+      message.append(kindMessage);
+    } else {
+      message.append('.');
+    }
+    if (comments.size() == 1) {
+      message.append("\n\n(1 comment)");
+    } else if (comments.size() > 1) {
+      message.append(String.format("\n\n(%d comments)", comments.size()));
+    }
+    if (!Strings.isNullOrEmpty(reviewMessage)) {
+      message.append("\n\n").append(reviewMessage);
+    }
+    boolean workInProgress = ctx.getChange().isWorkInProgress();
+    if (magicBranch != null && magicBranch.workInProgress) {
+      workInProgress = true;
+    }
+    return ChangeMessagesUtil.newMessage(
+        patchSetId,
+        ctx.getUser(),
+        ctx.getWhen(),
+        message.toString(),
+        ChangeMessagesUtil.uploadedPatchSetTag(workInProgress));
+  }
+
+  private String changeKindMessage(ChangeKind changeKind) {
+    switch (changeKind) {
+      case MERGE_FIRST_PARENT_UPDATE:
+        return ": New merge patch set was added with a new first parent relative to Patch Set "
+            + priorPatchSetId.get()
+            + ".";
+      case TRIVIAL_REBASE:
+        return ": Patch Set " + priorPatchSetId.get() + " was rebased.";
+      case NO_CHANGE:
+        return ": New patch set was added with same tree, parent"
+            + (commit.getParentCount() != 1 ? "s" : "")
+            + ", and commit message as Patch Set "
+            + priorPatchSetId.get()
+            + ".";
+      case NO_CODE_CHANGE:
+        return ": Commit message was updated.";
+      case REWORK:
+      default:
+        return null;
+    }
+  }
+
+  private Map<String, PatchSetApproval> scanLabels(ChangeContext ctx, Map<String, Short> approvals)
+      throws OrmException, IOException {
+    Map<String, PatchSetApproval> current = new HashMap<>();
+    // We optimize here and only retrieve current when approvals provided
+    if (!approvals.isEmpty()) {
+      for (PatchSetApproval a :
+          approvalsUtil.byPatchSetUser(
+              ctx.getDb(),
+              ctx.getNotes(),
+              priorPatchSetId,
+              ctx.getAccountId(),
+              ctx.getRevWalk(),
+              ctx.getRepoView().getConfig())) {
+        if (a.isLegacySubmit()) {
+          continue;
+        }
+
+        LabelType lt = projectState.getLabelTypes().byLabel(a.getLabelId());
+        if (lt != null) {
+          current.put(lt.getName(), a);
+        }
+      }
+    }
+    return current;
+  }
+
+  private void resetChange(ChangeContext ctx) {
+    Change change = ctx.getChange();
+    if (!change.currentPatchSetId().equals(priorPatchSetId)) {
+      return;
+    }
+
+    if (magicBranch != null && magicBranch.topic != null) {
+      change.setTopic(magicBranch.topic);
+    }
+    change.setStatus(Change.Status.NEW);
+    change.setCurrentPatchSet(info);
+
+    List<String> idList = commit.getFooterLines(CHANGE_ID);
+    if (idList.isEmpty()) {
+      change.setKey(new Change.Key("I" + commitId.name()));
+    } else {
+      change.setKey(new Change.Key(idList.get(idList.size() - 1).trim()));
+    }
+  }
+
+  private List<Comment> publishComments(ChangeContext ctx, boolean workInProgress)
+      throws OrmException {
+    List<Comment> comments =
+        commentsUtil.draftByChangeAuthor(ctx.getDb(), ctx.getNotes(), ctx.getUser().getAccountId());
+    publishCommentUtil.publish(
+        ctx, patchSetId, comments, ChangeMessagesUtil.uploadedPatchSetTag(workInProgress));
+    return comments;
+  }
+
+  @Override
+  public void postUpdate(Context ctx) throws Exception {
+    reviewerAdditions.postUpdate(ctx);
+    if (changeKind != ChangeKind.TRIVIAL_REBASE) {
+      // TODO(dborowitz): Merge email templates so we only have to send one.
+      Runnable e = new ReplaceEmailTask(ctx);
+      if (requestScopePropagator != null) {
+        @SuppressWarnings("unused")
+        Future<?> possiblyIgnoredError = sendEmailExecutor.submit(requestScopePropagator.wrap(e));
+      } else {
+        e.run();
+      }
+    }
+
+    NotifyHandling notify = magicBranch != null ? magicBranch.getNotify(notes) : NotifyHandling.ALL;
+
+    if (shouldPublishComments()) {
+      emailCommentsFactory
+          .create(
+              notify,
+              magicBranch != null ? magicBranch.getAccountsToNotify() : ImmutableListMultimap.of(),
+              notes,
+              newPatchSet,
+              ctx.getUser().asIdentifiedUser(),
+              msg,
+              comments,
+              msg.getMessage(),
+              ImmutableList.of()) // TODO(dborowitz): Include labels.
+          .sendAsync();
+    }
+
+    revisionCreated.fire(notes.getChange(), newPatchSet, ctx.getAccount(), ctx.getWhen(), notify);
+    try {
+      fireCommentAddedEvent(ctx);
+    } catch (Exception e) {
+      logger.atWarning().withCause(e).log("comment-added event invocation failed");
+    }
+    if (mergedByPushOp != null) {
+      mergedByPushOp.postUpdate(ctx);
+    }
+  }
+
+  private class ReplaceEmailTask implements Runnable {
+    private final Context ctx;
+
+    private ReplaceEmailTask(Context ctx) {
+      this.ctx = ctx;
+    }
+
+    @Override
+    public void run() {
+      try {
+        ReplacePatchSetSender cm =
+            replacePatchSetFactory.create(projectState.getNameKey(), notes.getChangeId());
+        cm.setFrom(ctx.getAccount().getAccount().getId());
+        cm.setPatchSet(newPatchSet, info);
+        cm.setChangeMessage(msg.getMessage(), ctx.getWhen());
+        if (magicBranch != null) {
+          cm.setNotify(magicBranch.getNotify(notes));
+          cm.setAccountsToNotify(magicBranch.getAccountsToNotify());
+        }
+        cm.addReviewers(
+            Streams.concat(
+                    oldRecipients.getReviewers().stream(),
+                    reviewerAdditions.flattenResults(AddReviewersOp.Result::addedReviewers).stream()
+                        .map(PatchSetApproval::getAccountId))
+                .collect(toImmutableSet()));
+        cm.addExtraCC(
+            Streams.concat(
+                    oldRecipients.getCcOnly().stream(),
+                    reviewerAdditions.flattenResults(AddReviewersOp.Result::addedCCs).stream())
+                .collect(toImmutableSet()));
+        // TODO(dborowitz): Support byEmail
+        cm.send();
+      } catch (Exception e) {
+        logger.atSevere().withCause(e).log(
+            "Cannot send email for new patch set %s", newPatchSet.getId());
+      }
+    }
+
+    @Override
+    public String toString() {
+      return "send-email newpatchset";
+    }
+  }
+
+  private void fireCommentAddedEvent(Context ctx) throws IOException {
+    if (approvals.isEmpty()) {
+      return;
+    }
+
+    /* For labels that are not set in this operation, show the "current" value
+     * of 0, and no oldValue as the value was not modified by this operation.
+     * For labels that are set in this operation, the value was modified, so
+     * show a transition from an oldValue of 0 to the new value.
+     */
+    List<LabelType> labels =
+        projectCache.checkedGet(ctx.getProject()).getLabelTypes(notes).getLabelTypes();
+    Map<String, Short> allApprovals = new HashMap<>();
+    Map<String, Short> oldApprovals = new HashMap<>();
+    for (LabelType lt : labels) {
+      allApprovals.put(lt.getName(), (short) 0);
+      oldApprovals.put(lt.getName(), null);
+    }
+    for (Map.Entry<String, Short> entry : approvals.entrySet()) {
+      if (entry.getValue() != 0) {
+        allApprovals.put(entry.getKey(), entry.getValue());
+        oldApprovals.put(entry.getKey(), (short) 0);
+      }
+    }
+
+    commentAdded.fire(
+        notes.getChange(),
+        newPatchSet,
+        ctx.getAccount(),
+        null,
+        allApprovals,
+        oldApprovals,
+        ctx.getWhen());
+  }
+
+  public PatchSet getPatchSet() {
+    return newPatchSet;
+  }
+
+  public Change getChange() {
+    return notes.getChange();
+  }
+
+  public String getRejectMessage() {
+    return rejectMessage;
+  }
+
+  public ReceiveCommand getCommand() {
+    return cmd;
+  }
+
+  public ReplaceOp setRequestScopePropagator(RequestScopePropagator requestScopePropagator) {
+    this.requestScopePropagator = requestScopePropagator;
+    return this;
+  }
+
+  private static String findMergedInto(Context ctx, String first, RevCommit commit) {
+    try {
+      RevWalk rw = ctx.getRevWalk();
+      Optional<ObjectId> firstId = ctx.getRepoView().getRef(first);
+      if (firstId.isPresent() && rw.isMergedInto(commit, rw.parseCommit(firstId.get()))) {
+        return first;
+      }
+
+      for (Map.Entry<String, ObjectId> e : ctx.getRepoView().getRefs(R_HEADS).entrySet()) {
+        if (rw.isMergedInto(commit, rw.parseCommit(e.getValue()))) {
+          return R_HEADS + e.getKey();
+        }
+      }
+      return null;
+    } catch (IOException e) {
+      logger.atWarning().withCause(e).log("Can't check for already submitted change");
+      return null;
+    }
+  }
+
+  private boolean shouldPublishComments() {
+    return magicBranch != null && magicBranch.shouldPublishComments();
+  }
+}
diff --git a/java/com/google/gerrit/server/git/receive/ResultChangeIds.java b/java/com/google/gerrit/server/git/receive/ResultChangeIds.java
new file mode 100644
index 0000000..bbf8d95
--- /dev/null
+++ b/java/com/google/gerrit/server/git/receive/ResultChangeIds.java
@@ -0,0 +1,58 @@
+// 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.
+
+package com.google.gerrit.server.git.receive;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.reviewdb.client.Change;
+import java.util.ArrayList;
+import java.util.EnumMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Keeps track of the change IDs thus far updated by ReceiveCommit.
+ *
+ * <p>This class is thread-safe.
+ */
+public class ResultChangeIds {
+  public enum Key {
+    CREATED,
+    REPLACED,
+    AUTOCLOSED,
+  }
+
+  private final Map<Key, List<Change.Id>> ids;
+
+  ResultChangeIds() {
+    ids = new EnumMap<>(Key.class);
+    for (Key k : Key.values()) {
+      ids.put(k, new ArrayList<>());
+    }
+  }
+
+  /** Record a change ID update as having completed. Thread-safe. */
+  public void add(Key key, Change.Id id) {
+    synchronized (this) {
+      ids.get(key).add(id);
+    }
+  }
+
+  /** Returns change IDs of the given type for which the BatchUpdate succeeded. Thread-safe. */
+  public List<Change.Id> get(Key key) {
+    synchronized (this) {
+      return ImmutableList.copyOf(ids.get(key));
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/git/validators/AccountValidator.java b/java/com/google/gerrit/server/git/validators/AccountValidator.java
new file mode 100644
index 0000000..08870d3
--- /dev/null
+++ b/java/com/google/gerrit/server/git/validators/AccountValidator.java
@@ -0,0 +1,123 @@
+// Copyright (C) 2017 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.google.gerrit.server.git.validators;
+
+import static java.util.stream.Collectors.toSet;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountConfig;
+import com.google.gerrit.server.account.AccountProperties;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.git.ValidationError;
+import com.google.gerrit.server.mail.send.OutgoingEmailValidator;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+public class AccountValidator {
+
+  private final Provider<IdentifiedUser> self;
+  private final AllUsersName allUsersName;
+  private final OutgoingEmailValidator emailValidator;
+
+  @Inject
+  public AccountValidator(
+      Provider<IdentifiedUser> self,
+      AllUsersName allUsersName,
+      OutgoingEmailValidator emailValidator) {
+    this.self = self;
+    this.allUsersName = allUsersName;
+    this.emailValidator = emailValidator;
+  }
+
+  public List<String> validate(
+      Account.Id accountId,
+      Repository allUsersRepo,
+      RevWalk rw,
+      @Nullable ObjectId oldId,
+      ObjectId newId)
+      throws IOException {
+    Optional<Account> oldAccount = Optional.empty();
+    if (oldId != null && !ObjectId.zeroId().equals(oldId)) {
+      try {
+        oldAccount = loadAccount(accountId, allUsersRepo, rw, oldId, null);
+      } catch (ConfigInvalidException e) {
+        // ignore, maybe the new commit is repairing it now
+      }
+    }
+
+    List<String> messages = new ArrayList<>();
+    Optional<Account> newAccount;
+    try {
+      newAccount = loadAccount(accountId, allUsersRepo, rw, newId, messages);
+    } catch (ConfigInvalidException e) {
+      return ImmutableList.of(
+          String.format(
+              "commit '%s' has an invalid '%s' file for account '%s': %s",
+              newId.name(), AccountProperties.ACCOUNT_CONFIG, accountId.get(), e.getMessage()));
+    }
+
+    if (!newAccount.isPresent()) {
+      return ImmutableList.of(String.format("account '%s' does not exist", accountId.get()));
+    }
+
+    if (accountId.equals(self.get().getAccountId()) && !newAccount.get().isActive()) {
+      messages.add("cannot deactivate own account");
+    }
+
+    String newPreferredEmail = newAccount.get().getPreferredEmail();
+    if (newPreferredEmail != null
+        && (!oldAccount.isPresent()
+            || !newPreferredEmail.equals(oldAccount.get().getPreferredEmail()))) {
+      if (!emailValidator.isValid(newPreferredEmail)) {
+        messages.add(
+            String.format(
+                "invalid preferred email '%s' for account '%s'",
+                newPreferredEmail, accountId.get()));
+      }
+    }
+
+    return ImmutableList.copyOf(messages);
+  }
+
+  private Optional<Account> loadAccount(
+      Account.Id accountId,
+      Repository allUsersRepo,
+      RevWalk rw,
+      ObjectId commit,
+      @Nullable List<String> messages)
+      throws IOException, ConfigInvalidException {
+    rw.reset();
+    AccountConfig accountConfig = new AccountConfig(accountId, allUsersName, allUsersRepo);
+    accountConfig.load(allUsersName, rw, commit);
+    if (messages != null) {
+      messages.addAll(
+          accountConfig.getValidationErrors().stream()
+              .map(ValidationError::getMessage)
+              .collect(toSet()));
+    }
+    return accountConfig.getLoadedAccount();
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidationException.java b/java/com/google/gerrit/server/git/validators/CommitValidationException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidationException.java
rename to java/com/google/gerrit/server/git/validators/CommitValidationException.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidationListener.java b/java/com/google/gerrit/server/git/validators/CommitValidationListener.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidationListener.java
rename to java/com/google/gerrit/server/git/validators/CommitValidationListener.java
diff --git a/java/com/google/gerrit/server/git/validators/CommitValidationMessage.java b/java/com/google/gerrit/server/git/validators/CommitValidationMessage.java
new file mode 100644
index 0000000..941b66a
--- /dev/null
+++ b/java/com/google/gerrit/server/git/validators/CommitValidationMessage.java
@@ -0,0 +1,25 @@
+// Copyright (C) 2012 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.google.gerrit.server.git.validators;
+
+public class CommitValidationMessage extends ValidationMessage {
+  public CommitValidationMessage(String message, ValidationMessage.Type type) {
+    super(message, type);
+  }
+
+  public CommitValidationMessage(String message, boolean isError) {
+    super(message, isError);
+  }
+}
diff --git a/java/com/google/gerrit/server/git/validators/CommitValidators.java b/java/com/google/gerrit/server/git/validators/CommitValidators.java
new file mode 100644
index 0000000..b228267
--- /dev/null
+++ b/java/com/google/gerrit/server/git/validators/CommitValidators.java
@@ -0,0 +1,875 @@
+// Copyright (C) 2012 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.google.gerrit.server.git.validators;
+
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.gerrit.reviewdb.client.Change.CHANGE_ID_PATTERN;
+import static com.google.gerrit.reviewdb.client.RefNames.REFS_CHANGES;
+import static com.google.gerrit.reviewdb.client.RefNames.REFS_CONFIG;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Splitter;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.FooterConstants;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo.ConsistencyProblemInfo;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Branch.NameKey;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.externalids.ExternalIdsConsistencyChecker;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.UrlFormatter;
+import com.google.gerrit.server.events.CommitReceivedEvent;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.ValidationError;
+import com.google.gerrit.server.git.validators.ValidationMessage.Type;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.ssh.SshInfo;
+import com.google.gerrit.server.util.MagicBranch;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.jcraft.jsch.HostKey;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.regex.Pattern;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.notes.NoteMap;
+import org.eclipse.jgit.revwalk.FooterKey;
+import org.eclipse.jgit.revwalk.FooterLine;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.util.SystemReader;
+
+/**
+ * Represents a list of CommitValidationListeners to run for a push to one branch of one project.
+ */
+public class CommitValidators {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static final Pattern NEW_PATCHSET_PATTERN =
+      Pattern.compile("^" + REFS_CHANGES + "(?:[0-9][0-9]/)?([1-9][0-9]*)(?:/[1-9][0-9]*)?$");
+
+  @Singleton
+  public static class Factory {
+    private final PersonIdent gerritIdent;
+    private final DynamicItem<UrlFormatter> urlFormatter;
+    private final PluginSetContext<CommitValidationListener> pluginValidators;
+    private final GitRepositoryManager repoManager;
+    private final AllUsersName allUsers;
+    private final AllProjectsName allProjects;
+    private final ExternalIdsConsistencyChecker externalIdsConsistencyChecker;
+    private final AccountValidator accountValidator;
+    private final String installCommitMsgHookCommand;
+    private final ProjectCache projectCache;
+
+    @Inject
+    Factory(
+        @GerritPersonIdent PersonIdent gerritIdent,
+        DynamicItem<UrlFormatter> urlFormatter,
+        @GerritServerConfig Config cfg,
+        PluginSetContext<CommitValidationListener> pluginValidators,
+        GitRepositoryManager repoManager,
+        AllUsersName allUsers,
+        AllProjectsName allProjects,
+        ExternalIdsConsistencyChecker externalIdsConsistencyChecker,
+        AccountValidator accountValidator,
+        ProjectCache projectCache) {
+      this.gerritIdent = gerritIdent;
+      this.urlFormatter = urlFormatter;
+      this.pluginValidators = pluginValidators;
+      this.repoManager = repoManager;
+      this.allUsers = allUsers;
+      this.allProjects = allProjects;
+      this.externalIdsConsistencyChecker = externalIdsConsistencyChecker;
+      this.accountValidator = accountValidator;
+      this.installCommitMsgHookCommand =
+          cfg != null ? cfg.getString("gerrit", null, "installCommitMsgHookCommand") : null;
+      this.projectCache = projectCache;
+    }
+
+    public CommitValidators forReceiveCommits(
+        PermissionBackend.ForProject forProject,
+        Branch.NameKey branch,
+        IdentifiedUser user,
+        SshInfo sshInfo,
+        NoteMap rejectCommits,
+        RevWalk rw,
+        @Nullable Change change)
+        throws IOException {
+      PermissionBackend.ForRef perm = forProject.ref(branch.get());
+      ProjectState projectState = projectCache.checkedGet(branch.getParentKey());
+      return new CommitValidators(
+          ImmutableList.of(
+              new UploadMergesPermissionValidator(perm),
+              new ProjectStateValidationListener(projectState),
+              new AmendedGerritMergeCommitValidationListener(perm, gerritIdent),
+              new AuthorUploaderValidator(user, perm, urlFormatter.get()),
+              new CommitterUploaderValidator(user, perm, urlFormatter.get()),
+              new SignedOffByValidator(user, perm, projectState),
+              new ChangeIdValidator(
+                  projectState,
+                  user,
+                  urlFormatter.get(),
+                  installCommitMsgHookCommand,
+                  sshInfo,
+                  change),
+              new ConfigValidator(branch, user, rw, allUsers, allProjects),
+              new BannedCommitsValidator(rejectCommits),
+              new PluginCommitValidationListener(pluginValidators),
+              new ExternalIdUpdateListener(allUsers, externalIdsConsistencyChecker),
+              new AccountCommitValidator(repoManager, allUsers, accountValidator),
+              new GroupCommitValidator(allUsers)));
+    }
+
+    public CommitValidators forGerritCommits(
+        PermissionBackend.ForProject forProject,
+        NameKey branch,
+        IdentifiedUser user,
+        SshInfo sshInfo,
+        RevWalk rw,
+        @Nullable Change change)
+        throws IOException {
+      PermissionBackend.ForRef perm = forProject.ref(branch.get());
+      ProjectState projectState = projectCache.checkedGet(branch.getParentKey());
+      return new CommitValidators(
+          ImmutableList.of(
+              new UploadMergesPermissionValidator(perm),
+              new ProjectStateValidationListener(projectState),
+              new AmendedGerritMergeCommitValidationListener(perm, gerritIdent),
+              new AuthorUploaderValidator(user, perm, urlFormatter.get()),
+              new SignedOffByValidator(user, perm, projectCache.checkedGet(branch.getParentKey())),
+              new ChangeIdValidator(
+                  projectState,
+                  user,
+                  urlFormatter.get(),
+                  installCommitMsgHookCommand,
+                  sshInfo,
+                  change),
+              new ConfigValidator(branch, user, rw, allUsers, allProjects),
+              new PluginCommitValidationListener(pluginValidators),
+              new ExternalIdUpdateListener(allUsers, externalIdsConsistencyChecker),
+              new AccountCommitValidator(repoManager, allUsers, accountValidator),
+              new GroupCommitValidator(allUsers)));
+    }
+
+    public CommitValidators forMergedCommits(
+        PermissionBackend.ForProject forProject, Branch.NameKey branch, IdentifiedUser user)
+        throws IOException {
+      // Generally only include validators that are based on permissions of the
+      // user creating a change for a merged commit; generally exclude
+      // validators that would require amending the change in order to correct.
+      //
+      // Examples:
+      //  - Change-Id and Signed-off-by can't be added to an already-merged
+      //    commit.
+      //  - If the commit is banned, we can't ban it here. In fact, creating a
+      //    review of a previously merged and recently-banned commit is a use
+      //    case for post-commit code review: so reviewers have a place to
+      //    discuss what to do about it.
+      //  - Plugin validators may do things like require certain commit message
+      //    formats, so we play it safe and exclude them.
+      PermissionBackend.ForRef perm = forProject.ref(branch.get());
+      return new CommitValidators(
+          ImmutableList.of(
+              new UploadMergesPermissionValidator(perm),
+              new ProjectStateValidationListener(projectCache.checkedGet(branch.getParentKey())),
+              new AuthorUploaderValidator(user, perm, urlFormatter.get()),
+              new CommitterUploaderValidator(user, perm, urlFormatter.get())));
+    }
+  }
+
+  private final List<CommitValidationListener> validators;
+
+  CommitValidators(List<CommitValidationListener> validators) {
+    this.validators = validators;
+  }
+
+  public List<CommitValidationMessage> validate(CommitReceivedEvent receiveEvent)
+      throws CommitValidationException {
+    List<CommitValidationMessage> messages = new ArrayList<>();
+    try {
+      for (CommitValidationListener commitValidator : validators) {
+        messages.addAll(commitValidator.onCommitReceived(receiveEvent));
+      }
+    } catch (CommitValidationException e) {
+      logger.atFine().withCause(e).log(
+          "CommitValidationException occurred: %s", e.getFullMessage());
+      // Keep the old messages (and their order) in case of an exception
+      messages.addAll(e.getMessages());
+      throw new CommitValidationException(e.getMessage(), messages);
+    }
+    return messages;
+  }
+
+  public static class ChangeIdValidator implements CommitValidationListener {
+    private static final String CHANGE_ID_PREFIX = FooterConstants.CHANGE_ID.getName() + ":";
+    private static final String MISSING_CHANGE_ID_MSG = "missing Change-Id in message footer";
+    private static final String MISSING_SUBJECT_MSG =
+        "missing subject; Change-Id must be in message footer";
+    private static final String MULTIPLE_CHANGE_ID_MSG =
+        "multiple Change-Id lines in message footer";
+    private static final String INVALID_CHANGE_ID_MSG =
+        "invalid Change-Id line format in message footer";
+
+    @VisibleForTesting
+    public static final String CHANGE_ID_MISMATCH_MSG =
+        "Change-Id in message footer does not match Change-Id of target change";
+
+    private static final Pattern CHANGE_ID = Pattern.compile(CHANGE_ID_PATTERN);
+
+    private final ProjectState projectState;
+    private final UrlFormatter urlFormatter;
+    private final String installCommitMsgHookCommand;
+    private final SshInfo sshInfo;
+    private final IdentifiedUser user;
+    private final Change change;
+
+    public ChangeIdValidator(
+        ProjectState projectState,
+        IdentifiedUser user,
+        UrlFormatter urlFormatter,
+        String installCommitMsgHookCommand,
+        SshInfo sshInfo,
+        Change change) {
+      this.projectState = projectState;
+      this.urlFormatter = urlFormatter;
+      this.installCommitMsgHookCommand = installCommitMsgHookCommand;
+      this.sshInfo = sshInfo;
+      this.user = user;
+      this.change = change;
+    }
+
+    @Override
+    public List<CommitValidationMessage> onCommitReceived(CommitReceivedEvent receiveEvent)
+        throws CommitValidationException {
+      if (!shouldValidateChangeId(receiveEvent)) {
+        return Collections.emptyList();
+      }
+      RevCommit commit = receiveEvent.commit;
+      List<CommitValidationMessage> messages = new ArrayList<>();
+      List<String> idList = commit.getFooterLines(FooterConstants.CHANGE_ID);
+
+      if (idList.isEmpty()) {
+        String shortMsg = commit.getShortMessage();
+        if (shortMsg.startsWith(CHANGE_ID_PREFIX)
+            && CHANGE_ID.matcher(shortMsg.substring(CHANGE_ID_PREFIX.length()).trim()).matches()) {
+          throw new CommitValidationException(MISSING_SUBJECT_MSG);
+        }
+        if (projectState.is(BooleanProjectConfig.REQUIRE_CHANGE_ID)) {
+          messages.add(getMissingChangeIdErrorMsg(MISSING_CHANGE_ID_MSG, commit));
+          throw new CommitValidationException(MISSING_CHANGE_ID_MSG, messages);
+        }
+      } else if (idList.size() > 1) {
+        throw new CommitValidationException(MULTIPLE_CHANGE_ID_MSG, messages);
+      } else {
+        String v = idList.get(idList.size() - 1).trim();
+        // Reject Change-Ids with wrong format and invalid placeholder ID from
+        // Egit (I0000000000000000000000000000000000000000).
+        if (!CHANGE_ID.matcher(v).matches() || v.matches("^I00*$")) {
+          messages.add(getMissingChangeIdErrorMsg(INVALID_CHANGE_ID_MSG, receiveEvent.commit));
+          throw new CommitValidationException(INVALID_CHANGE_ID_MSG, messages);
+        }
+        if (change != null && !v.equals(change.getKey().get())) {
+          throw new CommitValidationException(CHANGE_ID_MISMATCH_MSG);
+        }
+      }
+
+      return Collections.emptyList();
+    }
+
+    private static boolean shouldValidateChangeId(CommitReceivedEvent event) {
+      return MagicBranch.isMagicBranch(event.command.getRefName())
+          || NEW_PATCHSET_PATTERN.matcher(event.command.getRefName()).matches();
+    }
+
+    private CommitValidationMessage getMissingChangeIdErrorMsg(String errMsg, RevCommit c) {
+      StringBuilder sb = new StringBuilder();
+      sb.append(errMsg).append("\n");
+
+      boolean hinted = false;
+      if (c.getFullMessage().contains(CHANGE_ID_PREFIX)) {
+        String lastLine = Iterables.getLast(Splitter.on('\n').split(c.getFullMessage()), "");
+        if (!lastLine.contains(CHANGE_ID_PREFIX)) {
+          hinted = true;
+          sb.append("\n")
+              .append("Hint: run\n")
+              .append("  git commit --amend\n")
+              .append("and move 'Change-Id: Ixxx..' to the bottom on a separate line\n");
+        }
+      }
+
+      // Print only one hint to avoid overwhelming the user.
+      if (!hinted) {
+        sb.append("\nHint: to automatically insert a Change-Id, install the hook:\n")
+            .append(getCommitMessageHookInstallationHint())
+            .append("\n")
+            .append("and then amend the commit:\n")
+            .append("  git commit --amend --no-edit\n");
+      }
+      return new CommitValidationMessage(sb.toString(), Type.ERROR);
+    }
+
+    private String getCommitMessageHookInstallationHint() {
+      if (installCommitMsgHookCommand != null) {
+        return installCommitMsgHookCommand;
+      }
+      final List<HostKey> hostKeys = sshInfo.getHostKeys();
+
+      // If there are no SSH keys, the commit-msg hook must be installed via
+      // HTTP(S)
+      Optional<String> webUrl = urlFormatter.getWebUrl();
+      if (hostKeys.isEmpty()) {
+        checkState(webUrl.isPresent());
+        return String.format(
+            "  f=\"$(git rev-parse --git-dir)/hooks/commit-msg\"; curl -o \"$f\" %stools/hooks/commit-msg ; chmod +x \"$f\"",
+            webUrl.get());
+      }
+
+      // SSH keys exist, so the hook can be installed with scp.
+      String sshHost;
+      int sshPort;
+      String host = hostKeys.get(0).getHost();
+      int c = host.lastIndexOf(':');
+      if (0 <= c) {
+        if (host.startsWith("*:")) {
+          checkState(webUrl.isPresent());
+          sshHost = getGerritHost(webUrl.get());
+        } else {
+          sshHost = host.substring(0, c);
+        }
+        sshPort = Integer.parseInt(host.substring(c + 1));
+      } else {
+        sshHost = host;
+        sshPort = 22;
+      }
+
+      return String.format(
+          "  gitdir=$(git rev-parse --git-dir); scp -p -P %d %s@%s:hooks/commit-msg ${gitdir}/hooks/",
+          sshPort, user.getUserName().orElse("<USERNAME>"), sshHost);
+    }
+  }
+
+  /** If this is the special project configuration branch, validate the config. */
+  public static class ConfigValidator implements CommitValidationListener {
+    private final Branch.NameKey branch;
+    private final IdentifiedUser user;
+    private final RevWalk rw;
+    private final AllUsersName allUsers;
+    private final AllProjectsName allProjects;
+
+    public ConfigValidator(
+        Branch.NameKey branch,
+        IdentifiedUser user,
+        RevWalk rw,
+        AllUsersName allUsers,
+        AllProjectsName allProjects) {
+      this.branch = branch;
+      this.user = user;
+      this.rw = rw;
+      this.allProjects = allProjects;
+      this.allUsers = allUsers;
+    }
+
+    @Override
+    public List<CommitValidationMessage> onCommitReceived(CommitReceivedEvent receiveEvent)
+        throws CommitValidationException {
+      if (REFS_CONFIG.equals(branch.get())) {
+        List<CommitValidationMessage> messages = new ArrayList<>();
+
+        try {
+          ProjectConfig cfg = new ProjectConfig(receiveEvent.project.getNameKey());
+          cfg.load(rw, receiveEvent.command.getNewId());
+          if (!cfg.getValidationErrors().isEmpty()) {
+            addError("Invalid project configuration:", messages);
+            for (ValidationError err : cfg.getValidationErrors()) {
+              addError("  " + err.getMessage(), messages);
+            }
+            throw new ConfigInvalidException("invalid project configuration");
+          }
+          if (allUsers.equals(receiveEvent.project.getNameKey())
+              && !allProjects.equals(cfg.getProject().getParent(allProjects))) {
+            addError("Invalid project configuration:", messages);
+            addError(
+                String.format("  %s must inherit from %s", allUsers.get(), allProjects.get()),
+                messages);
+            throw new ConfigInvalidException("invalid project configuration");
+          }
+        } catch (ConfigInvalidException | IOException e) {
+          logger.atSevere().withCause(e).log(
+              "User %s tried to push an invalid project configuration %s for project %s",
+              user.getLoggableName(),
+              receiveEvent.command.getNewId().name(),
+              receiveEvent.project.getName());
+          throw new CommitValidationException("invalid project configuration", messages);
+        }
+      }
+
+      return Collections.emptyList();
+    }
+  }
+
+  /** Require permission to upload merge commits. */
+  public static class UploadMergesPermissionValidator implements CommitValidationListener {
+    private final PermissionBackend.ForRef perm;
+
+    public UploadMergesPermissionValidator(PermissionBackend.ForRef perm) {
+      this.perm = perm;
+    }
+
+    @Override
+    public List<CommitValidationMessage> onCommitReceived(CommitReceivedEvent receiveEvent)
+        throws CommitValidationException {
+      if (receiveEvent.commit.getParentCount() <= 1) {
+        return Collections.emptyList();
+      }
+      try {
+        perm.check(RefPermission.MERGE);
+        return Collections.emptyList();
+      } catch (AuthException e) {
+        throw new CommitValidationException("you are not allowed to upload merges");
+      } catch (PermissionBackendException e) {
+        logger.atSevere().withCause(e).log("cannot check MERGE");
+        throw new CommitValidationException("internal auth error");
+      }
+    }
+  }
+
+  /** Execute commit validation plug-ins */
+  public static class PluginCommitValidationListener implements CommitValidationListener {
+    private final PluginSetContext<CommitValidationListener> commitValidationListeners;
+
+    public PluginCommitValidationListener(
+        final PluginSetContext<CommitValidationListener> commitValidationListeners) {
+      this.commitValidationListeners = commitValidationListeners;
+    }
+
+    @Override
+    public List<CommitValidationMessage> onCommitReceived(CommitReceivedEvent receiveEvent)
+        throws CommitValidationException {
+      List<CommitValidationMessage> messages = new ArrayList<>();
+      try {
+        commitValidationListeners.runEach(
+            l -> l.onCommitReceived(receiveEvent), CommitValidationException.class);
+      } catch (CommitValidationException e) {
+        messages.addAll(e.getMessages());
+        throw new CommitValidationException(e.getMessage(), messages);
+      }
+      return messages;
+    }
+  }
+
+  public static class SignedOffByValidator implements CommitValidationListener {
+    private final IdentifiedUser user;
+    private final PermissionBackend.ForRef perm;
+    private final ProjectState state;
+
+    public SignedOffByValidator(
+        IdentifiedUser user, PermissionBackend.ForRef perm, ProjectState state) {
+      this.user = user;
+      this.perm = perm;
+      this.state = state;
+    }
+
+    @Override
+    public List<CommitValidationMessage> onCommitReceived(CommitReceivedEvent receiveEvent)
+        throws CommitValidationException {
+      if (!state.is(BooleanProjectConfig.USE_SIGNED_OFF_BY)) {
+        return Collections.emptyList();
+      }
+
+      RevCommit commit = receiveEvent.commit;
+      PersonIdent committer = commit.getCommitterIdent();
+      PersonIdent author = commit.getAuthorIdent();
+
+      boolean sboAuthor = false;
+      boolean sboCommitter = false;
+      boolean sboMe = false;
+      for (FooterLine footer : commit.getFooterLines()) {
+        if (footer.matches(FooterKey.SIGNED_OFF_BY)) {
+          String e = footer.getEmailAddress();
+          if (e != null) {
+            sboAuthor |= author.getEmailAddress().equals(e);
+            sboCommitter |= committer.getEmailAddress().equals(e);
+            sboMe |= user.hasEmailAddress(e);
+          }
+        }
+      }
+      if (!sboAuthor && !sboCommitter && !sboMe) {
+        try {
+          perm.check(RefPermission.FORGE_COMMITTER);
+        } catch (AuthException denied) {
+          throw new CommitValidationException(
+              "not Signed-off-by author/committer/uploader in message footer");
+        } catch (PermissionBackendException e) {
+          logger.atSevere().withCause(e).log("cannot check FORGE_COMMITTER");
+          throw new CommitValidationException("internal auth error");
+        }
+      }
+      return Collections.emptyList();
+    }
+  }
+
+  /** Require that author matches the uploader. */
+  public static class AuthorUploaderValidator implements CommitValidationListener {
+    private final IdentifiedUser user;
+    private final PermissionBackend.ForRef perm;
+    private final UrlFormatter urlFormatter;
+
+    public AuthorUploaderValidator(
+        IdentifiedUser user, PermissionBackend.ForRef perm, UrlFormatter urlFormatter) {
+      this.user = user;
+      this.perm = perm;
+      this.urlFormatter = urlFormatter;
+    }
+
+    @Override
+    public List<CommitValidationMessage> onCommitReceived(CommitReceivedEvent receiveEvent)
+        throws CommitValidationException {
+      PersonIdent author = receiveEvent.commit.getAuthorIdent();
+      if (user.hasEmailAddress(author.getEmailAddress())) {
+        return Collections.emptyList();
+      }
+      try {
+        perm.check(RefPermission.FORGE_AUTHOR);
+        return Collections.emptyList();
+      } catch (AuthException e) {
+        throw new CommitValidationException(
+            "invalid author", invalidEmail("author", author, user, urlFormatter));
+      } catch (PermissionBackendException e) {
+        logger.atSevere().withCause(e).log("cannot check FORGE_AUTHOR");
+        throw new CommitValidationException("internal auth error");
+      }
+    }
+  }
+
+  /** Require that committer matches the uploader. */
+  public static class CommitterUploaderValidator implements CommitValidationListener {
+    private final IdentifiedUser user;
+    private final PermissionBackend.ForRef perm;
+    private final UrlFormatter urlFormatter;
+
+    public CommitterUploaderValidator(
+        IdentifiedUser user, PermissionBackend.ForRef perm, UrlFormatter urlFormatter) {
+      this.user = user;
+      this.perm = perm;
+      this.urlFormatter = urlFormatter;
+    }
+
+    @Override
+    public List<CommitValidationMessage> onCommitReceived(CommitReceivedEvent receiveEvent)
+        throws CommitValidationException {
+      PersonIdent committer = receiveEvent.commit.getCommitterIdent();
+      if (user.hasEmailAddress(committer.getEmailAddress())) {
+        return Collections.emptyList();
+      }
+      try {
+        perm.check(RefPermission.FORGE_COMMITTER);
+        return Collections.emptyList();
+      } catch (AuthException e) {
+        throw new CommitValidationException(
+            "invalid committer", invalidEmail("committer", committer, user, urlFormatter));
+      } catch (PermissionBackendException e) {
+        logger.atSevere().withCause(e).log("cannot check FORGE_COMMITTER");
+        throw new CommitValidationException("internal auth error");
+      }
+    }
+  }
+
+  /**
+   * Don't allow the user to amend a merge created by Gerrit Code Review. This seems to happen all
+   * too often, due to users not paying any attention to what they are doing.
+   */
+  public static class AmendedGerritMergeCommitValidationListener
+      implements CommitValidationListener {
+    private final PermissionBackend.ForRef perm;
+    private final PersonIdent gerritIdent;
+
+    public AmendedGerritMergeCommitValidationListener(
+        PermissionBackend.ForRef perm, PersonIdent gerritIdent) {
+      this.perm = perm;
+      this.gerritIdent = gerritIdent;
+    }
+
+    @Override
+    public List<CommitValidationMessage> onCommitReceived(CommitReceivedEvent receiveEvent)
+        throws CommitValidationException {
+      PersonIdent author = receiveEvent.commit.getAuthorIdent();
+      if (receiveEvent.commit.getParentCount() > 1
+          && author.getName().equals(gerritIdent.getName())
+          && author.getEmailAddress().equals(gerritIdent.getEmailAddress())) {
+        try {
+          // Stop authors from amending the merge commits that Gerrit itself creates.
+          perm.check(RefPermission.FORGE_SERVER);
+        } catch (AuthException denied) {
+          throw new CommitValidationException(
+              String.format(
+                  "pushing merge commit %s by %s requires '%s' permission",
+                  receiveEvent.commit.getId(),
+                  gerritIdent.getEmailAddress(),
+                  RefPermission.FORGE_SERVER.name()));
+        } catch (PermissionBackendException e) {
+          logger.atSevere().withCause(e).log("cannot check FORGE_SERVER");
+          throw new CommitValidationException("internal auth error");
+        }
+      }
+      return Collections.emptyList();
+    }
+  }
+
+  /** Reject banned commits. */
+  public static class BannedCommitsValidator implements CommitValidationListener {
+    private final NoteMap rejectCommits;
+
+    public BannedCommitsValidator(NoteMap rejectCommits) {
+      this.rejectCommits = rejectCommits;
+    }
+
+    @Override
+    public List<CommitValidationMessage> onCommitReceived(CommitReceivedEvent receiveEvent)
+        throws CommitValidationException {
+      try {
+        if (rejectCommits.contains(receiveEvent.commit)) {
+          throw new CommitValidationException(
+              "contains banned commit " + receiveEvent.commit.getName());
+        }
+        return Collections.emptyList();
+      } catch (IOException e) {
+        String m = "error checking banned commits";
+        logger.atWarning().withCause(e).log(m);
+        throw new CommitValidationException(m, e);
+      }
+    }
+  }
+
+  /** Validates updates to refs/meta/external-ids. */
+  public static class ExternalIdUpdateListener implements CommitValidationListener {
+    private final AllUsersName allUsers;
+    private final ExternalIdsConsistencyChecker externalIdsConsistencyChecker;
+
+    public ExternalIdUpdateListener(
+        AllUsersName allUsers, ExternalIdsConsistencyChecker externalIdsConsistencyChecker) {
+      this.externalIdsConsistencyChecker = externalIdsConsistencyChecker;
+      this.allUsers = allUsers;
+    }
+
+    @Override
+    public List<CommitValidationMessage> onCommitReceived(CommitReceivedEvent receiveEvent)
+        throws CommitValidationException {
+      if (allUsers.equals(receiveEvent.project.getNameKey())
+          && RefNames.REFS_EXTERNAL_IDS.equals(receiveEvent.refName)) {
+        try {
+          List<ConsistencyProblemInfo> problems =
+              externalIdsConsistencyChecker.check(receiveEvent.commit);
+          List<CommitValidationMessage> msgs =
+              problems.stream()
+                  .map(
+                      p ->
+                          new CommitValidationMessage(
+                              p.message,
+                              p.status == ConsistencyProblemInfo.Status.ERROR
+                                  ? ValidationMessage.Type.ERROR
+                                  : ValidationMessage.Type.OTHER))
+                  .collect(toList());
+          if (msgs.stream().anyMatch(ValidationMessage::isError)) {
+            throw new CommitValidationException("invalid external IDs", msgs);
+          }
+          return msgs;
+        } catch (IOException | ConfigInvalidException e) {
+          String m = "error validating external IDs";
+          logger.atWarning().withCause(e).log(m);
+          throw new CommitValidationException(m, e);
+        }
+      }
+      return Collections.emptyList();
+    }
+  }
+
+  public static class AccountCommitValidator implements CommitValidationListener {
+    private final GitRepositoryManager repoManager;
+    private final AllUsersName allUsers;
+    private final AccountValidator accountValidator;
+
+    public AccountCommitValidator(
+        GitRepositoryManager repoManager,
+        AllUsersName allUsers,
+        AccountValidator accountValidator) {
+      this.repoManager = repoManager;
+      this.allUsers = allUsers;
+      this.accountValidator = accountValidator;
+    }
+
+    @Override
+    public List<CommitValidationMessage> onCommitReceived(CommitReceivedEvent receiveEvent)
+        throws CommitValidationException {
+      if (!allUsers.equals(receiveEvent.project.getNameKey())) {
+        return Collections.emptyList();
+      }
+
+      if (receiveEvent.command.getRefName().startsWith(MagicBranch.NEW_CHANGE)) {
+        // no validation on push for review, will be checked on submit by
+        // MergeValidators.AccountMergeValidator
+        return Collections.emptyList();
+      }
+
+      Account.Id accountId = Account.Id.fromRef(receiveEvent.refName);
+      if (accountId == null) {
+        return Collections.emptyList();
+      }
+
+      try (Repository repo = repoManager.openRepository(allUsers)) {
+        List<String> errorMessages =
+            accountValidator.validate(
+                accountId,
+                repo,
+                receiveEvent.revWalk,
+                receiveEvent.command.getOldId(),
+                receiveEvent.commit);
+        if (!errorMessages.isEmpty()) {
+          throw new CommitValidationException(
+              "invalid account configuration",
+              errorMessages.stream()
+                  .map(m -> new CommitValidationMessage(m, Type.ERROR))
+                  .collect(toList()));
+        }
+      } catch (IOException e) {
+        String m = String.format("Validating update for account %s failed", accountId.get());
+        logger.atSevere().withCause(e).log(m);
+        throw new CommitValidationException(m, e);
+      }
+      return Collections.emptyList();
+    }
+  }
+
+  /** Rejects updates to group branches. */
+  public static class GroupCommitValidator implements CommitValidationListener {
+    private final AllUsersName allUsers;
+
+    public GroupCommitValidator(AllUsersName allUsers) {
+      this.allUsers = allUsers;
+    }
+
+    @Override
+    public List<CommitValidationMessage> onCommitReceived(CommitReceivedEvent receiveEvent)
+        throws CommitValidationException {
+      // Groups are stored inside the 'All-Users' repository.
+      if (!allUsers.equals(receiveEvent.project.getNameKey())) {
+        return Collections.emptyList();
+      }
+
+      if (receiveEvent.command.getRefName().startsWith(MagicBranch.NEW_CHANGE)) {
+        // no validation on push for review, will be checked on submit by
+        // MergeValidators.GroupMergeValidator
+        return Collections.emptyList();
+      }
+
+      if (RefNames.isGroupRef(receiveEvent.command.getRefName())) {
+        throw new CommitValidationException("group update not allowed");
+      }
+      return Collections.emptyList();
+    }
+  }
+
+  /** Rejects updates to projects that don't allow writes. */
+  public static class ProjectStateValidationListener implements CommitValidationListener {
+    private final ProjectState projectState;
+
+    public ProjectStateValidationListener(ProjectState projectState) {
+      this.projectState = projectState;
+    }
+
+    @Override
+    public List<CommitValidationMessage> onCommitReceived(CommitReceivedEvent receiveEvent)
+        throws CommitValidationException {
+      if (projectState.statePermitsWrite()) {
+        return Collections.emptyList();
+      }
+      throw new CommitValidationException("project state does not permit write");
+    }
+  }
+
+  private static CommitValidationMessage invalidEmail(
+      String type, PersonIdent who, IdentifiedUser currentUser, UrlFormatter urlFormatter) {
+    StringBuilder sb = new StringBuilder();
+
+    sb.append("email address ")
+        .append(who.getEmailAddress())
+        .append(" is not registered in your account, and you lack 'forge ")
+        .append(type)
+        .append("' permission.\n");
+
+    if (currentUser.getEmailAddresses().isEmpty()) {
+      sb.append("You have not registered any email addresses.\n");
+    } else {
+      sb.append("The following addresses are currently registered:\n");
+      for (String address : currentUser.getEmailAddresses()) {
+        sb.append("   ").append(address).append("\n");
+      }
+    }
+
+    if (urlFormatter.getSettingsUrl("").isPresent()) {
+      sb.append("To register an email address, visit:\n")
+          .append(urlFormatter.getSettingsUrl("EmailAddresses").get())
+          .append("\n\n");
+    }
+    return new CommitValidationMessage(sb.toString(), Type.ERROR);
+  }
+
+  /**
+   * Get the Gerrit hostname.
+   *
+   * @return the hostname from the canonical URL if it is configured, otherwise whatever the OS says
+   *     the hostname is.
+   */
+  private static String getGerritHost(String canonicalWebUrl) {
+    if (canonicalWebUrl != null) {
+      try {
+        return new URL(canonicalWebUrl).getHost();
+      } catch (MalformedURLException ignored) {
+      }
+    }
+
+    return SystemReader.getInstance().getHostname();
+  }
+
+  private static void addError(String error, List<CommitValidationMessage> messages) {
+    messages.add(new CommitValidationMessage(error, Type.ERROR));
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/MergeValidationException.java b/java/com/google/gerrit/server/git/validators/MergeValidationException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/validators/MergeValidationException.java
rename to java/com/google/gerrit/server/git/validators/MergeValidationException.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/MergeValidationListener.java b/java/com/google/gerrit/server/git/validators/MergeValidationListener.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/validators/MergeValidationListener.java
rename to java/com/google/gerrit/server/git/validators/MergeValidationListener.java
diff --git a/java/com/google/gerrit/server/git/validators/MergeValidators.java b/java/com/google/gerrit/server/git/validators/MergeValidators.java
new file mode 100644
index 0000000..0422c51
--- /dev/null
+++ b/java/com/google/gerrit/server/git/validators/MergeValidators.java
@@ -0,0 +1,354 @@
+// Copyright (C) 2013 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.google.gerrit.server.git.validators;
+
+import com.google.common.base.Joiner;
+import com.google.common.collect.ImmutableList;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.projects.ProjectConfigEntryType;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.registration.Extension;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountProperties;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.PluginConfig;
+import com.google.gerrit.server.config.ProjectConfigEntry;
+import com.google.gerrit.server.git.CodeReviewCommit;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.List;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+public class MergeValidators {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final PluginSetContext<MergeValidationListener> mergeValidationListeners;
+  private final ProjectConfigValidator.Factory projectConfigValidatorFactory;
+  private final AccountMergeValidator.Factory accountValidatorFactory;
+  private final GroupMergeValidator.Factory groupValidatorFactory;
+
+  public interface Factory {
+    MergeValidators create();
+  }
+
+  @Inject
+  MergeValidators(
+      PluginSetContext<MergeValidationListener> mergeValidationListeners,
+      ProjectConfigValidator.Factory projectConfigValidatorFactory,
+      AccountMergeValidator.Factory accountValidatorFactory,
+      GroupMergeValidator.Factory groupValidatorFactory) {
+    this.mergeValidationListeners = mergeValidationListeners;
+    this.projectConfigValidatorFactory = projectConfigValidatorFactory;
+    this.accountValidatorFactory = accountValidatorFactory;
+    this.groupValidatorFactory = groupValidatorFactory;
+  }
+
+  public void validatePreMerge(
+      Repository repo,
+      CodeReviewCommit commit,
+      ProjectState destProject,
+      Branch.NameKey destBranch,
+      PatchSet.Id patchSetId,
+      IdentifiedUser caller)
+      throws MergeValidationException {
+    List<MergeValidationListener> validators =
+        ImmutableList.of(
+            new PluginMergeValidationListener(mergeValidationListeners),
+            projectConfigValidatorFactory.create(),
+            accountValidatorFactory.create(),
+            groupValidatorFactory.create());
+
+    for (MergeValidationListener validator : validators) {
+      validator.onPreMerge(repo, commit, destProject, destBranch, patchSetId, caller);
+    }
+  }
+
+  public static class ProjectConfigValidator implements MergeValidationListener {
+    private static final String INVALID_CONFIG =
+        "Change contains an invalid project configuration.";
+    private static final String PARENT_NOT_FOUND =
+        "Change contains an invalid project configuration:\nParent project does not exist.";
+    private static final String PLUGIN_VALUE_NOT_EDITABLE =
+        "Change contains an invalid project configuration:\n"
+            + "One of the plugin configuration parameters is not editable.";
+    private static final String PLUGIN_VALUE_NOT_PERMITTED =
+        "Change contains an invalid project configuration:\n"
+            + "One of the plugin configuration parameters has a value that is not"
+            + " permitted.";
+    private static final String ROOT_NO_PARENT =
+        "Change contains an invalid project configuration:\n"
+            + "The root project cannot have a parent.";
+    private static final String SET_BY_ADMIN =
+        "Change contains a project configuration that changes the parent"
+            + " project.\n"
+            + "The change must be submitted by a Gerrit administrator.";
+    private static final String SET_BY_OWNER =
+        "Change contains a project configuration that changes the parent"
+            + " project.\n"
+            + "The change must be submitted by a Gerrit administrator or the project owner.";
+
+    private final AllProjectsName allProjectsName;
+    private final AllUsersName allUsersName;
+    private final ProjectCache projectCache;
+    private final PermissionBackend permissionBackend;
+    private final DynamicMap<ProjectConfigEntry> pluginConfigEntries;
+    private final boolean allowProjectOwnersToChangeParent;
+
+    public interface Factory {
+      ProjectConfigValidator create();
+    }
+
+    @Inject
+    public ProjectConfigValidator(
+        AllProjectsName allProjectsName,
+        AllUsersName allUsersName,
+        ProjectCache projectCache,
+        PermissionBackend permissionBackend,
+        DynamicMap<ProjectConfigEntry> pluginConfigEntries,
+        @GerritServerConfig Config config) {
+      this.allProjectsName = allProjectsName;
+      this.allUsersName = allUsersName;
+      this.projectCache = projectCache;
+      this.permissionBackend = permissionBackend;
+      this.pluginConfigEntries = pluginConfigEntries;
+      this.allowProjectOwnersToChangeParent =
+          config.getBoolean("receive", "allowProjectOwnersToChangeParent", false);
+    }
+
+    @Override
+    public void onPreMerge(
+        final Repository repo,
+        final CodeReviewCommit commit,
+        final ProjectState destProject,
+        final Branch.NameKey destBranch,
+        final PatchSet.Id patchSetId,
+        IdentifiedUser caller)
+        throws MergeValidationException {
+      if (RefNames.REFS_CONFIG.equals(destBranch.get())) {
+        final Project.NameKey newParent;
+        try {
+          ProjectConfig cfg = new ProjectConfig(destProject.getNameKey());
+          cfg.load(destProject.getNameKey(), repo, commit);
+          newParent = cfg.getProject().getParent(allProjectsName);
+          final Project.NameKey oldParent = destProject.getProject().getParent(allProjectsName);
+          if (oldParent == null) {
+            // update of the 'All-Projects' project
+            if (newParent != null) {
+              throw new MergeValidationException(ROOT_NO_PARENT);
+            }
+          } else {
+            if (!oldParent.equals(newParent)) {
+              if (!allowProjectOwnersToChangeParent) {
+                try {
+                  permissionBackend.user(caller).check(GlobalPermission.ADMINISTRATE_SERVER);
+                } catch (AuthException e) {
+                  throw new MergeValidationException(SET_BY_ADMIN);
+                } catch (PermissionBackendException e) {
+                  logger.atWarning().withCause(e).log("Cannot check ADMINISTRATE_SERVER");
+                  throw new MergeValidationException("validation unavailable");
+                }
+              } else {
+                try {
+                  permissionBackend
+                      .user(caller)
+                      .project(destProject.getNameKey())
+                      .check(ProjectPermission.WRITE_CONFIG);
+                } catch (AuthException e) {
+                  throw new MergeValidationException(SET_BY_OWNER);
+                } catch (PermissionBackendException e) {
+                  logger.atWarning().withCause(e).log("Cannot check WRITE_CONFIG");
+                  throw new MergeValidationException("validation unavailable");
+                }
+              }
+              if (allUsersName.equals(destProject.getNameKey())
+                  && !allProjectsName.equals(newParent)) {
+                throw new MergeValidationException(
+                    String.format(
+                        " %s must inherit from %s", allUsersName.get(), allProjectsName.get()));
+              }
+              if (projectCache.get(newParent) == null) {
+                throw new MergeValidationException(PARENT_NOT_FOUND);
+              }
+            }
+          }
+
+          for (Extension<ProjectConfigEntry> e : pluginConfigEntries) {
+            PluginConfig pluginCfg = cfg.getPluginConfig(e.getPluginName());
+            ProjectConfigEntry configEntry = e.getProvider().get();
+
+            String value = pluginCfg.getString(e.getExportName());
+            String oldValue =
+                destProject
+                    .getConfig()
+                    .getPluginConfig(e.getPluginName())
+                    .getString(e.getExportName());
+
+            if ((value == null ? oldValue != null : !value.equals(oldValue))
+                && !configEntry.isEditable(destProject)) {
+              throw new MergeValidationException(PLUGIN_VALUE_NOT_EDITABLE);
+            }
+
+            if (ProjectConfigEntryType.LIST.equals(configEntry.getType())
+                && value != null
+                && !configEntry.getPermittedValues().contains(value)) {
+              throw new MergeValidationException(PLUGIN_VALUE_NOT_PERMITTED);
+            }
+          }
+        } catch (ConfigInvalidException | IOException e) {
+          throw new MergeValidationException(INVALID_CONFIG);
+        }
+      }
+    }
+  }
+
+  /** Execute merge validation plug-ins */
+  public static class PluginMergeValidationListener implements MergeValidationListener {
+    private final PluginSetContext<MergeValidationListener> mergeValidationListeners;
+
+    public PluginMergeValidationListener(
+        PluginSetContext<MergeValidationListener> mergeValidationListeners) {
+      this.mergeValidationListeners = mergeValidationListeners;
+    }
+
+    @Override
+    public void onPreMerge(
+        Repository repo,
+        CodeReviewCommit commit,
+        ProjectState destProject,
+        Branch.NameKey destBranch,
+        PatchSet.Id patchSetId,
+        IdentifiedUser caller)
+        throws MergeValidationException {
+      mergeValidationListeners.runEach(
+          l -> l.onPreMerge(repo, commit, destProject, destBranch, patchSetId, caller),
+          MergeValidationException.class);
+    }
+  }
+
+  public static class AccountMergeValidator implements MergeValidationListener {
+    public interface Factory {
+      AccountMergeValidator create();
+    }
+
+    private final Provider<ReviewDb> dbProvider;
+    private final AllUsersName allUsersName;
+    private final ChangeData.Factory changeDataFactory;
+    private final AccountValidator accountValidator;
+
+    @Inject
+    public AccountMergeValidator(
+        Provider<ReviewDb> dbProvider,
+        AllUsersName allUsersName,
+        ChangeData.Factory changeDataFactory,
+        AccountValidator accountValidator) {
+      this.dbProvider = dbProvider;
+      this.allUsersName = allUsersName;
+      this.changeDataFactory = changeDataFactory;
+      this.accountValidator = accountValidator;
+    }
+
+    @Override
+    public void onPreMerge(
+        Repository repo,
+        CodeReviewCommit commit,
+        ProjectState destProject,
+        Branch.NameKey destBranch,
+        PatchSet.Id patchSetId,
+        IdentifiedUser caller)
+        throws MergeValidationException {
+      Account.Id accountId = Account.Id.fromRef(destBranch.get());
+      if (!allUsersName.equals(destProject.getNameKey()) || accountId == null) {
+        return;
+      }
+
+      ChangeData cd =
+          changeDataFactory.create(
+              dbProvider.get(), destProject.getProject().getNameKey(), patchSetId.getParentKey());
+      try {
+        if (!cd.currentFilePaths().contains(AccountProperties.ACCOUNT_CONFIG)) {
+          return;
+        }
+      } catch (IOException | OrmException e) {
+        logger.atSevere().withCause(e).log("Cannot validate account update");
+        throw new MergeValidationException("account validation unavailable");
+      }
+
+      try (RevWalk rw = new RevWalk(repo)) {
+        List<String> errorMessages = accountValidator.validate(accountId, repo, rw, null, commit);
+        if (!errorMessages.isEmpty()) {
+          throw new MergeValidationException(
+              "invalid account configuration: " + Joiner.on("; ").join(errorMessages));
+        }
+      } catch (IOException e) {
+        logger.atSevere().withCause(e).log("Cannot validate account update");
+        throw new MergeValidationException("account validation unavailable");
+      }
+    }
+  }
+
+  public static class GroupMergeValidator implements MergeValidationListener {
+    public interface Factory {
+      GroupMergeValidator create();
+    }
+
+    private final AllUsersName allUsersName;
+
+    @Inject
+    public GroupMergeValidator(AllUsersName allUsersName) {
+      this.allUsersName = allUsersName;
+    }
+
+    @Override
+    public void onPreMerge(
+        Repository repo,
+        CodeReviewCommit commit,
+        ProjectState destProject,
+        Branch.NameKey destBranch,
+        PatchSet.Id patchSetId,
+        IdentifiedUser caller)
+        throws MergeValidationException {
+      // Groups are stored inside the 'All-Users' repository.
+      if (!allUsersName.equals(destProject.getNameKey())
+          || !RefNames.isGroupRef(destBranch.get())) {
+        return;
+      }
+
+      throw new MergeValidationException("group update not allowed");
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/git/validators/OnSubmitValidationListener.java b/java/com/google/gerrit/server/git/validators/OnSubmitValidationListener.java
new file mode 100644
index 0000000..308fdc0
--- /dev/null
+++ b/java/com/google/gerrit/server/git/validators/OnSubmitValidationListener.java
@@ -0,0 +1,105 @@
+// Copyright (C) 2017 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.google.gerrit.server.git.validators;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.gerrit.extensions.annotations.ExtensionPoint;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.git.RefCache;
+import com.google.gerrit.server.update.ChainedReceiveCommands;
+import com.google.gerrit.server.validators.ValidationException;
+import java.io.IOException;
+import java.util.Optional;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.ReceiveCommand;
+
+/**
+ * Listener to validate ref updates performed during submit operation.
+ *
+ * <p>As submit strategies may generate new commits (e.g. Cherry Pick), this listener allows
+ * validation of resulting new commit before destination branch is updated and new patchset ref is
+ * created.
+ *
+ * <p>If you only care about validating the change being submitted and not the resulting new commit,
+ * consider using {@link MergeValidationListener} instead.
+ */
+@ExtensionPoint
+public interface OnSubmitValidationListener {
+  class Arguments {
+    private Project.NameKey project;
+    private RevWalk rw;
+    private ImmutableMap<String, ReceiveCommand> commands;
+    private RefCache refs;
+
+    /**
+     * @param project project.
+     * @param rw revwalk that can read unflushed objects from {@code refs}.
+     * @param commands commands to be executed.
+     */
+    Arguments(Project.NameKey project, RevWalk rw, ChainedReceiveCommands commands) {
+      this.project = requireNonNull(project);
+      this.rw = requireNonNull(rw);
+      this.refs = requireNonNull(commands);
+      this.commands = ImmutableMap.copyOf(commands.getCommands());
+    }
+
+    /** Get the project name for this operation. */
+    public Project.NameKey getProject() {
+      return project;
+    }
+
+    /**
+     * Get a revwalk for this operation.
+     *
+     * <p>This instance is able to read all objects mentioned in {@link #getCommands()} and {@link
+     * #getRef(String)}.
+     *
+     * @return open revwalk.
+     */
+    public RevWalk getRevWalk() {
+      return rw;
+    }
+
+    /**
+     * @return a map from ref to commands covering all ref operations to be performed on this
+     *     repository as part of the ongoing submit operation.
+     */
+    public ImmutableMap<String, ReceiveCommand> getCommands() {
+      return commands;
+    }
+
+    /**
+     * Get a ref from the repository.
+     *
+     * @param name ref name; can be any ref, not just the ones mentioned in {@link #getCommands()}.
+     * @return latest value of a ref in the repository, as if all commands from {@link
+     *     #getCommands()} had already been applied.
+     * @throws IOException if an error occurred reading the ref.
+     */
+    public Optional<ObjectId> getRef(String name) throws IOException {
+      return refs.get(name);
+    }
+  }
+
+  /**
+   * Called right before branch is updated with new commit or commits as a result of submit.
+   *
+   * <p>If ValidationException is thrown, submitting is aborted.
+   */
+  void preBranchUpdate(Arguments args) throws ValidationException;
+}
diff --git a/java/com/google/gerrit/server/git/validators/OnSubmitValidators.java b/java/com/google/gerrit/server/git/validators/OnSubmitValidators.java
new file mode 100644
index 0000000..409240e
--- /dev/null
+++ b/java/com/google/gerrit/server/git/validators/OnSubmitValidators.java
@@ -0,0 +1,49 @@
+// Copyright (C) 2017 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.google.gerrit.server.git.validators;
+
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.git.validators.OnSubmitValidationListener.Arguments;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gerrit.server.submit.IntegrationException;
+import com.google.gerrit.server.update.ChainedReceiveCommands;
+import com.google.gerrit.server.validators.ValidationException;
+import com.google.inject.Inject;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+public class OnSubmitValidators {
+  public interface Factory {
+    OnSubmitValidators create();
+  }
+
+  private final PluginSetContext<OnSubmitValidationListener> listeners;
+
+  @Inject
+  OnSubmitValidators(PluginSetContext<OnSubmitValidationListener> listeners) {
+    this.listeners = listeners;
+  }
+
+  public void validate(
+      Project.NameKey project, ObjectReader objectReader, ChainedReceiveCommands commands)
+      throws IntegrationException {
+    try (RevWalk rw = new RevWalk(objectReader)) {
+      Arguments args = new Arguments(project, rw, commands);
+      listeners.runEach(l -> l.preBranchUpdate(args), ValidationException.class);
+    } catch (ValidationException e) {
+      throw new IntegrationException(e.getMessage(), e);
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/RefOperationValidationException.java b/java/com/google/gerrit/server/git/validators/RefOperationValidationException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/validators/RefOperationValidationException.java
rename to java/com/google/gerrit/server/git/validators/RefOperationValidationException.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/RefOperationValidationListener.java b/java/com/google/gerrit/server/git/validators/RefOperationValidationListener.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/validators/RefOperationValidationListener.java
rename to java/com/google/gerrit/server/git/validators/RefOperationValidationListener.java
diff --git a/java/com/google/gerrit/server/git/validators/RefOperationValidators.java b/java/com/google/gerrit/server/git/validators/RefOperationValidators.java
new file mode 100644
index 0000000..acae533
--- /dev/null
+++ b/java/com/google/gerrit/server/git/validators/RefOperationValidators.java
@@ -0,0 +1,161 @@
+// Copyright (C) 2014 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.google.gerrit.server.git.validators;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.events.RefReceivedEvent;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gerrit.server.validators.ValidationException;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.transport.ReceiveCommand;
+
+public class RefOperationValidators {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final GetErrorMessages GET_ERRORS = new GetErrorMessages();
+
+  public interface Factory {
+    RefOperationValidators create(Project project, IdentifiedUser user, ReceiveCommand cmd);
+  }
+
+  public static ReceiveCommand getCommand(RefUpdate update, ReceiveCommand.Type type) {
+    return new ReceiveCommand(
+        update.getExpectedOldObjectId(), update.getNewObjectId(), update.getName(), type);
+  }
+
+  private final PermissionBackend.WithUser perm;
+  private final AllUsersName allUsersName;
+  private final PluginSetContext<RefOperationValidationListener> refOperationValidationListeners;
+  private final RefReceivedEvent event;
+
+  @Inject
+  RefOperationValidators(
+      PermissionBackend permissionBackend,
+      AllUsersName allUsersName,
+      PluginSetContext<RefOperationValidationListener> refOperationValidationListeners,
+      @Assisted Project project,
+      @Assisted IdentifiedUser user,
+      @Assisted ReceiveCommand cmd) {
+    this.perm = permissionBackend.user(user);
+    this.allUsersName = allUsersName;
+    this.refOperationValidationListeners = refOperationValidationListeners;
+    event = new RefReceivedEvent();
+    event.command = cmd;
+    event.project = project;
+    event.user = user;
+  }
+
+  public List<ValidationMessage> validateForRefOperation() throws RefOperationValidationException {
+    List<ValidationMessage> messages = new ArrayList<>();
+    boolean withException = false;
+    try {
+      messages.addAll(
+          new DisallowCreationAndDeletionOfUserBranches(perm, allUsersName).onRefOperation(event));
+      refOperationValidationListeners.runEach(
+          l -> l.onRefOperation(event), ValidationException.class);
+    } catch (ValidationException e) {
+      messages.add(new ValidationMessage(e.getMessage(), true));
+      withException = true;
+    }
+
+    if (withException) {
+      throwException(messages, event);
+    }
+
+    return messages;
+  }
+
+  private void throwException(Iterable<ValidationMessage> messages, RefReceivedEvent event)
+      throws RefOperationValidationException {
+    Iterable<ValidationMessage> errors = Iterables.filter(messages, GET_ERRORS);
+    String header =
+        String.format(
+            "Ref \"%s\" %S in project %s validation failed",
+            event.command.getRefName(), event.command.getType(), event.project.getName());
+    logger.atSevere().log(header);
+    throw new RefOperationValidationException(header, errors);
+  }
+
+  private static class GetErrorMessages implements Predicate<ValidationMessage> {
+    @Override
+    public boolean apply(ValidationMessage input) {
+      return input.isError();
+    }
+  }
+
+  private static class DisallowCreationAndDeletionOfUserBranches
+      implements RefOperationValidationListener {
+    private final PermissionBackend.WithUser perm;
+    private final AllUsersName allUsersName;
+
+    DisallowCreationAndDeletionOfUserBranches(
+        PermissionBackend.WithUser perm, AllUsersName allUsersName) {
+      this.perm = perm;
+      this.allUsersName = allUsersName;
+    }
+
+    @Override
+    public List<ValidationMessage> onRefOperation(RefReceivedEvent refEvent)
+        throws ValidationException {
+      if (refEvent.project.getNameKey().equals(allUsersName)) {
+        if (refEvent.command.getRefName().startsWith(RefNames.REFS_USERS)
+            && !refEvent.command.getRefName().equals(RefNames.REFS_USERS_DEFAULT)) {
+          if (refEvent.command.getType().equals(ReceiveCommand.Type.CREATE)) {
+            try {
+              perm.check(GlobalPermission.ACCESS_DATABASE);
+            } catch (AuthException | PermissionBackendException e) {
+              throw new ValidationException("Not allowed to create user branch.");
+            }
+            if (Account.Id.fromRef(refEvent.command.getRefName()) == null) {
+              throw new ValidationException(
+                  String.format(
+                      "Not allowed to create non-user branch under %s.", RefNames.REFS_USERS));
+            }
+          } else if (refEvent.command.getType().equals(ReceiveCommand.Type.DELETE)) {
+            try {
+              perm.check(GlobalPermission.ACCESS_DATABASE);
+            } catch (AuthException | PermissionBackendException e) {
+              throw new ValidationException("Not allowed to delete user branch.");
+            }
+          }
+        }
+
+        if (RefNames.isGroupRef(refEvent.command.getRefName())) {
+          if (refEvent.command.getType().equals(ReceiveCommand.Type.CREATE)) {
+            throw new ValidationException("Not allowed to create group branch.");
+          } else if (refEvent.command.getType().equals(ReceiveCommand.Type.DELETE)) {
+            throw new ValidationException("Not allowed to delete group branch.");
+          }
+        }
+      }
+      return ImmutableList.of();
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/UploadValidationException.java b/java/com/google/gerrit/server/git/validators/UploadValidationException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/validators/UploadValidationException.java
rename to java/com/google/gerrit/server/git/validators/UploadValidationException.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/UploadValidationListener.java b/java/com/google/gerrit/server/git/validators/UploadValidationListener.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/git/validators/UploadValidationListener.java
rename to java/com/google/gerrit/server/git/validators/UploadValidationListener.java
diff --git a/java/com/google/gerrit/server/git/validators/UploadValidators.java b/java/com/google/gerrit/server/git/validators/UploadValidators.java
new file mode 100644
index 0000000..2595283
--- /dev/null
+++ b/java/com/google/gerrit/server/git/validators/UploadValidators.java
@@ -0,0 +1,86 @@
+// Copyright (C) 2014 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.google.gerrit.server.git.validators;
+
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gerrit.server.validators.ValidationException;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.util.Collection;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.transport.PreUploadHook;
+import org.eclipse.jgit.transport.ServiceMayNotContinueException;
+import org.eclipse.jgit.transport.UploadPack;
+
+public class UploadValidators implements PreUploadHook {
+
+  private final PluginSetContext<UploadValidationListener> uploadValidationListeners;
+  private final Project project;
+  private final Repository repository;
+  private final String remoteHost;
+
+  public interface Factory {
+    UploadValidators create(Project project, Repository repository, String remoteAddress);
+  }
+
+  @Inject
+  UploadValidators(
+      PluginSetContext<UploadValidationListener> uploadValidationListeners,
+      @Assisted Project project,
+      @Assisted Repository repository,
+      @Assisted String remoteHost) {
+    this.uploadValidationListeners = uploadValidationListeners;
+    this.project = project;
+    this.repository = repository;
+    this.remoteHost = remoteHost;
+  }
+
+  @Override
+  public void onSendPack(
+      UploadPack up, Collection<? extends ObjectId> wants, Collection<? extends ObjectId> haves)
+      throws ServiceMayNotContinueException {
+    try {
+      uploadValidationListeners.runEach(
+          l -> l.onPreUpload(repository, project, remoteHost, up, wants, haves),
+          ValidationException.class);
+    } catch (ValidationException e) {
+      throw new UploadValidationException(e.getMessage());
+    }
+  }
+
+  @Override
+  public void onBeginNegotiateRound(
+      UploadPack up, Collection<? extends ObjectId> wants, int cntOffered)
+      throws ServiceMayNotContinueException {
+    try {
+      uploadValidationListeners.runEach(
+          l -> l.onBeginNegotiate(repository, project, remoteHost, up, wants, cntOffered),
+          ValidationException.class);
+    } catch (ValidationException e) {
+      throw new UploadValidationException(e.getMessage());
+    }
+  }
+
+  @Override
+  public void onEndNegotiateRound(
+      UploadPack up,
+      Collection<? extends ObjectId> wants,
+      int cntCommon,
+      int cntNotFound,
+      boolean ready)
+      throws ServiceMayNotContinueException {}
+}
diff --git a/java/com/google/gerrit/server/git/validators/ValidationMessage.java b/java/com/google/gerrit/server/git/validators/ValidationMessage.java
new file mode 100644
index 0000000..db59492
--- /dev/null
+++ b/java/com/google/gerrit/server/git/validators/ValidationMessage.java
@@ -0,0 +1,59 @@
+// Copyright (C) 2014 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.google.gerrit.server.git.validators;
+
+public class ValidationMessage {
+  public enum Type {
+    ERROR("ERROR: "),
+    WARNING("WARNING: "),
+    HINT("hint: "),
+    OTHER("");
+
+    private final String prefix;
+
+    Type(String prefix) {
+      this.prefix = prefix;
+    }
+
+    public String getPrefix() {
+      return prefix;
+    }
+  }
+
+  private final String message;
+  private final Type type;
+
+  public ValidationMessage(String message, Type type) {
+    this.message = message;
+    this.type = type;
+  }
+
+  public ValidationMessage(String message, boolean isError) {
+    this.message = message;
+    this.type = (isError ? Type.ERROR : Type.OTHER);
+  }
+
+  public String getMessage() {
+    return message;
+  }
+
+  public Type getType() {
+    return type;
+  }
+
+  public boolean isError() {
+    return type == Type.ERROR;
+  }
+}
diff --git a/java/com/google/gerrit/server/group/GroupAuditService.java b/java/com/google/gerrit/server/group/GroupAuditService.java
new file mode 100644
index 0000000..4b851ea
--- /dev/null
+++ b/java/com/google/gerrit/server/group/GroupAuditService.java
@@ -0,0 +1,50 @@
+// 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.
+
+package com.google.gerrit.server.group;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Account.Id;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.AuditEvent;
+import java.sql.Timestamp;
+
+public interface GroupAuditService {
+  void dispatch(AuditEvent action);
+
+  void dispatchAddMembers(
+      Account.Id actor,
+      AccountGroup.UUID updatedGroup,
+      ImmutableSet<Id> addedMembers,
+      Timestamp addedOn);
+
+  void dispatchDeleteMembers(
+      Account.Id actor,
+      AccountGroup.UUID updatedGroup,
+      ImmutableSet<Account.Id> deletedMembers,
+      Timestamp deletedOn);
+
+  void dispatchAddSubgroups(
+      Account.Id actor,
+      AccountGroup.UUID updatedGroup,
+      ImmutableSet<AccountGroup.UUID> addedSubgroups,
+      Timestamp addedOn);
+
+  void dispatchDeleteSubgroups(
+      Account.Id actor,
+      AccountGroup.UUID updatedGroup,
+      ImmutableSet<AccountGroup.UUID> deletedSubgroups,
+      Timestamp deletedOn);
+}
diff --git a/java/com/google/gerrit/server/group/GroupResolver.java b/java/com/google/gerrit/server/group/GroupResolver.java
new file mode 100644
index 0000000..5fe3e8e
--- /dev/null
+++ b/java/com/google/gerrit/server/group/GroupResolver.java
@@ -0,0 +1,116 @@
+// 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.
+
+package com.google.gerrit.server.group;
+
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.account.GroupBackends;
+import com.google.gerrit.server.account.GroupCache;
+import com.google.gerrit.server.account.GroupControl;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.Optional;
+
+@Singleton
+public class GroupResolver {
+  private final GroupBackend groupBackend;
+  private final GroupCache groupCache;
+  private final GroupControl.Factory groupControlFactory;
+
+  @Inject
+  GroupResolver(
+      GroupBackend groupBackend, GroupCache groupCache, GroupControl.Factory groupControlFactory) {
+    this.groupBackend = groupBackend;
+    this.groupCache = groupCache;
+    this.groupControlFactory = groupControlFactory;
+  }
+
+  /**
+   * Parses a group ID from a request body and returns the group.
+   *
+   * @param id ID of the group, can be a group UUID, a group name or a legacy group ID
+   * @return the group
+   * @throws UnprocessableEntityException thrown if the group ID cannot be resolved or if the group
+   *     is not visible to the calling user
+   */
+  public GroupDescription.Basic parse(String id) throws UnprocessableEntityException {
+    GroupDescription.Basic group = parseId(id);
+    if (group == null || !groupControlFactory.controlFor(group).isVisible()) {
+      throw new UnprocessableEntityException(String.format("Group Not Found: %s", id));
+    }
+    return group;
+  }
+
+  /**
+   * Parses a group ID from a request body and returns the group if it is a Gerrit internal group.
+   *
+   * @param id ID of the group, can be a group UUID, a group name or a legacy group ID
+   * @return the group
+   * @throws UnprocessableEntityException thrown if the group ID cannot be resolved, if the group is
+   *     not visible to the calling user or if it's an external group
+   */
+  public GroupDescription.Internal parseInternal(String id) throws UnprocessableEntityException {
+    GroupDescription.Basic group = parse(id);
+    if (group instanceof GroupDescription.Internal) {
+      return (GroupDescription.Internal) group;
+    }
+
+    throw new UnprocessableEntityException(String.format("External Group Not Allowed: %s", id));
+  }
+
+  /**
+   * Parses a group ID and returns the group without making any permission check whether the current
+   * user can see the group.
+   *
+   * @param id ID of the group, can be a group UUID, a group name or a legacy group ID
+   * @return the group, null if no group is found for the given group ID
+   */
+  public GroupDescription.Basic parseId(String id) {
+    AccountGroup.UUID uuid = new AccountGroup.UUID(id);
+    if (groupBackend.handles(uuid)) {
+      GroupDescription.Basic d = groupBackend.get(uuid);
+      if (d != null) {
+        return d;
+      }
+    }
+
+    // Might be a numeric AccountGroup.Id. -> Internal group.
+    if (id.matches("^[1-9][0-9]*$")) {
+      try {
+        AccountGroup.Id groupId = AccountGroup.Id.parse(id);
+        Optional<InternalGroup> group = groupCache.get(groupId);
+        if (group.isPresent()) {
+          return new InternalGroupDescription(group.get());
+        }
+      } catch (IllegalArgumentException e) {
+        // Ignored
+      }
+    }
+
+    // Might be a group name, be nice and accept unique names.
+    GroupReference ref = GroupBackends.findExactSuggestion(groupBackend, id);
+    if (ref != null) {
+      GroupDescription.Basic d = groupBackend.get(ref.getUUID());
+      if (d != null) {
+        return d;
+      }
+    }
+
+    return null;
+  }
+}
diff --git a/java/com/google/gerrit/server/group/GroupResource.java b/java/com/google/gerrit/server/group/GroupResource.java
new file mode 100644
index 0000000..1050314
--- /dev/null
+++ b/java/com/google/gerrit/server/group/GroupResource.java
@@ -0,0 +1,62 @@
+// Copyright (C) 2017 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.google.gerrit.server.group;
+
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.extensions.restapi.RestResource;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.server.account.GroupControl;
+import com.google.inject.TypeLiteral;
+import java.util.Optional;
+
+public class GroupResource implements RestResource {
+  public static final TypeLiteral<RestView<GroupResource>> GROUP_KIND =
+      new TypeLiteral<RestView<GroupResource>>() {};
+
+  private final GroupControl control;
+
+  public GroupResource(GroupControl control) {
+    this.control = control;
+  }
+
+  GroupResource(GroupResource rsrc) {
+    this.control = rsrc.getControl();
+  }
+
+  public GroupDescription.Basic getGroup() {
+    return control.getGroup();
+  }
+
+  public String getName() {
+    return getGroup().getName();
+  }
+
+  public boolean isInternalGroup() {
+    GroupDescription.Basic group = getGroup();
+    return group instanceof GroupDescription.Internal;
+  }
+
+  public Optional<GroupDescription.Internal> asInternalGroup() {
+    GroupDescription.Basic group = getGroup();
+    if (group instanceof GroupDescription.Internal) {
+      return Optional.of((GroupDescription.Internal) group);
+    }
+    return Optional.empty();
+  }
+
+  public GroupControl getControl() {
+    return control;
+  }
+}
diff --git a/java/com/google/gerrit/server/group/InternalGroup.java b/java/com/google/gerrit/server/group/InternalGroup.java
new file mode 100644
index 0000000..7828586
--- /dev/null
+++ b/java/com/google/gerrit/server/group/InternalGroup.java
@@ -0,0 +1,112 @@
+// Copyright (C) 2017 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.google.gerrit.server.group;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import java.io.Serializable;
+import java.sql.Timestamp;
+import org.eclipse.jgit.lib.ObjectId;
+
+@AutoValue
+public abstract class InternalGroup implements Serializable {
+  private static final long serialVersionUID = 1L;
+
+  public static InternalGroup create(
+      AccountGroup accountGroup,
+      ImmutableSet<Account.Id> members,
+      ImmutableSet<AccountGroup.UUID> subgroups) {
+    return create(accountGroup, members, subgroups, null);
+  }
+
+  public static InternalGroup create(
+      AccountGroup accountGroup,
+      ImmutableSet<Account.Id> members,
+      ImmutableSet<AccountGroup.UUID> subgroups,
+      ObjectId refState) {
+    return builder()
+        .setId(accountGroup.getId())
+        .setNameKey(accountGroup.getNameKey())
+        .setDescription(accountGroup.getDescription())
+        .setOwnerGroupUUID(accountGroup.getOwnerGroupUUID())
+        .setVisibleToAll(accountGroup.isVisibleToAll())
+        .setGroupUUID(accountGroup.getGroupUUID())
+        .setCreatedOn(accountGroup.getCreatedOn())
+        .setMembers(members)
+        .setSubgroups(subgroups)
+        .setRefState(refState)
+        .build();
+  }
+
+  public abstract AccountGroup.Id getId();
+
+  public String getName() {
+    return getNameKey().get();
+  }
+
+  public abstract AccountGroup.NameKey getNameKey();
+
+  @Nullable
+  public abstract String getDescription();
+
+  public abstract AccountGroup.UUID getOwnerGroupUUID();
+
+  public abstract boolean isVisibleToAll();
+
+  public abstract AccountGroup.UUID getGroupUUID();
+
+  public abstract Timestamp getCreatedOn();
+
+  public abstract ImmutableSet<Account.Id> getMembers();
+
+  public abstract ImmutableSet<AccountGroup.UUID> getSubgroups();
+
+  @Nullable
+  public abstract ObjectId getRefState();
+
+  public abstract Builder toBuilder();
+
+  public static Builder builder() {
+    return new AutoValue_InternalGroup.Builder();
+  }
+
+  @AutoValue.Builder
+  public abstract static class Builder {
+    public abstract Builder setId(AccountGroup.Id id);
+
+    public abstract Builder setNameKey(AccountGroup.NameKey name);
+
+    public abstract Builder setDescription(@Nullable String description);
+
+    public abstract Builder setOwnerGroupUUID(AccountGroup.UUID ownerGroupUuid);
+
+    public abstract Builder setVisibleToAll(boolean visibleToAll);
+
+    public abstract Builder setGroupUUID(AccountGroup.UUID groupUuid);
+
+    public abstract Builder setCreatedOn(Timestamp createdOn);
+
+    public abstract Builder setMembers(ImmutableSet<Account.Id> members);
+
+    public abstract Builder setSubgroups(ImmutableSet<AccountGroup.UUID> subgroups);
+
+    public abstract Builder setRefState(ObjectId refState);
+
+    public abstract InternalGroup build();
+  }
+}
diff --git a/java/com/google/gerrit/server/group/InternalGroupDescription.java b/java/com/google/gerrit/server/group/InternalGroupDescription.java
new file mode 100644
index 0000000..1d2252d
--- /dev/null
+++ b/java/com/google/gerrit/server/group/InternalGroupDescription.java
@@ -0,0 +1,92 @@
+// Copyright (C) 2017 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.google.gerrit.server.group;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.PageLinks;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import java.sql.Timestamp;
+
+public class InternalGroupDescription implements GroupDescription.Internal {
+
+  private final InternalGroup internalGroup;
+
+  public InternalGroupDescription(InternalGroup internalGroup) {
+    this.internalGroup = requireNonNull(internalGroup);
+  }
+
+  @Override
+  public AccountGroup.UUID getGroupUUID() {
+    return internalGroup.getGroupUUID();
+  }
+
+  @Override
+  public String getName() {
+    return internalGroup.getName();
+  }
+
+  @Nullable
+  @Override
+  public String getEmailAddress() {
+    return null;
+  }
+
+  @Nullable
+  @Override
+  public String getUrl() {
+    return "#" + PageLinks.toGroup(getGroupUUID());
+  }
+
+  @Override
+  public AccountGroup.Id getId() {
+    return internalGroup.getId();
+  }
+
+  @Override
+  @Nullable
+  public String getDescription() {
+    return internalGroup.getDescription();
+  }
+
+  @Override
+  public AccountGroup.UUID getOwnerGroupUUID() {
+    return internalGroup.getOwnerGroupUUID();
+  }
+
+  @Override
+  public boolean isVisibleToAll() {
+    return internalGroup.isVisibleToAll();
+  }
+
+  @Override
+  public Timestamp getCreatedOn() {
+    return internalGroup.getCreatedOn();
+  }
+
+  @Override
+  public ImmutableSet<Account.Id> getMembers() {
+    return internalGroup.getMembers();
+  }
+
+  @Override
+  public ImmutableSet<AccountGroup.UUID> getSubgroups() {
+    return internalGroup.getSubgroups();
+  }
+}
diff --git a/java/com/google/gerrit/server/group/MemberResource.java b/java/com/google/gerrit/server/group/MemberResource.java
new file mode 100644
index 0000000..b12cadd
--- /dev/null
+++ b/java/com/google/gerrit/server/group/MemberResource.java
@@ -0,0 +1,35 @@
+// Copyright (C) 2017 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.google.gerrit.server.group;
+
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.inject.TypeLiteral;
+
+public class MemberResource extends GroupResource {
+  public static final TypeLiteral<RestView<MemberResource>> MEMBER_KIND =
+      new TypeLiteral<RestView<MemberResource>>() {};
+
+  private final IdentifiedUser user;
+
+  public MemberResource(GroupResource group, IdentifiedUser user) {
+    super(group);
+    this.user = user;
+  }
+
+  public IdentifiedUser getMember() {
+    return user;
+  }
+}
diff --git a/java/com/google/gerrit/server/group/PeriodicGroupIndexer.java b/java/com/google/gerrit/server/group/PeriodicGroupIndexer.java
new file mode 100644
index 0000000..2a9538d
--- /dev/null
+++ b/java/com/google/gerrit/server/group/PeriodicGroupIndexer.java
@@ -0,0 +1,152 @@
+// 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.
+
+package com.google.gerrit.server.group;
+
+import static com.google.common.collect.ImmutableSet.toImmutableSet;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.lifecycle.LifecycleModule;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.ScheduleConfig;
+import com.google.gerrit.server.config.ScheduleConfig.Schedule;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.WorkQueue;
+import com.google.gerrit.server.group.db.GroupNameNotes;
+import com.google.gerrit.server.index.group.GroupIndexer;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.Repository;
+
+/**
+ * Runnable to schedule periodic group reindexing.
+ *
+ * <p>Periodic group indexing is intended to run only on slaves. Replication to slaves happens on
+ * Git level so that Gerrit is not aware of incoming replication events. But slaves need an updated
+ * group index to resolve memberships of users for ACL validation. To keep the group index in slaves
+ * up-to-date this class periodically scans the group refs in the All-Users repository to reindex
+ * groups if they are stale. The ref states of the group refs are cached so that on each run deleted
+ * groups can be detected and reindexed. This means callers of slaves may observe outdated group
+ * information until the next indexing happens. The interval on which group indexing is done is
+ * configurable by setting {@code index.scheduledIndexer.interval} in {@code gerrit.config}. By
+ * default group indexing is done every 5 minutes.
+ *
+ * <p>This class is not able to detect group deletions that were replicated while the slave was
+ * offline. This means if group refs are deleted while the slave is offline these groups are not
+ * removed from the group index when the slave is started. However since group deletion is not
+ * supported this should never happen and one can always do an offline reindex before starting the
+ * slave.
+ */
+public class PeriodicGroupIndexer implements Runnable {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static class Module extends LifecycleModule {
+    @Override
+    protected void configure() {
+      listener().to(Lifecycle.class);
+    }
+  }
+
+  private static class Lifecycle implements LifecycleListener {
+    private final Config cfg;
+    private final WorkQueue queue;
+    private final PeriodicGroupIndexer runner;
+
+    @Inject
+    Lifecycle(@GerritServerConfig Config cfg, WorkQueue queue, PeriodicGroupIndexer runner) {
+      this.cfg = cfg;
+      this.queue = queue;
+      this.runner = runner;
+    }
+
+    @Override
+    public void start() {
+      boolean runOnStartup = cfg.getBoolean("index", "scheduledIndexer", "runOnStartup", true);
+      if (runOnStartup) {
+        runner.run();
+      }
+
+      boolean isEnabled = cfg.getBoolean("index", "scheduledIndexer", "enabled", true);
+      if (!isEnabled) {
+        logger.atWarning().log("index.scheduledIndexer is disabled");
+        return;
+      }
+
+      Schedule schedule =
+          ScheduleConfig.builder(cfg, "index")
+              .setSubsection("scheduledIndexer")
+              .buildSchedule()
+              .orElseGet(() -> Schedule.createOrFail(TimeUnit.MINUTES.toMillis(5), "00:00"));
+      queue.scheduleAtFixedRate(runner, schedule);
+    }
+
+    @Override
+    public void stop() {
+      // handled by WorkQueue.stop() already
+    }
+  }
+
+  private final AllUsersName allUsersName;
+  private final GitRepositoryManager repoManager;
+  private final Provider<GroupIndexer> groupIndexerProvider;
+
+  private ImmutableSet<AccountGroup.UUID> groupUuids;
+
+  @Inject
+  PeriodicGroupIndexer(
+      AllUsersName allUsersName,
+      GitRepositoryManager repoManager,
+      Provider<GroupIndexer> groupIndexerProvider) {
+    this.allUsersName = allUsersName;
+    this.repoManager = repoManager;
+    this.groupIndexerProvider = groupIndexerProvider;
+  }
+
+  @Override
+  public synchronized void run() {
+    try (Repository allUsers = repoManager.openRepository(allUsersName)) {
+      ImmutableSet<AccountGroup.UUID> newGroupUuids =
+          GroupNameNotes.loadAllGroups(allUsers).stream()
+              .map(GroupReference::getUUID)
+              .collect(toImmutableSet());
+      GroupIndexer groupIndexer = groupIndexerProvider.get();
+      int reindexCounter = 0;
+      for (AccountGroup.UUID groupUuid : newGroupUuids) {
+        if (groupIndexer.reindexIfStale(groupUuid)) {
+          reindexCounter++;
+        }
+      }
+      if (groupUuids != null) {
+        // Check if any group was deleted since the last run and if yes remove these groups from the
+        // index.
+        for (AccountGroup.UUID groupUuid : Sets.difference(groupUuids, newGroupUuids)) {
+          groupIndexer.index(groupUuid);
+          reindexCounter++;
+        }
+      }
+      groupUuids = newGroupUuids;
+      logger.atInfo().log("Run group indexer, %s groups reindexed", reindexCounter);
+    } catch (Throwable t) {
+      logger.atSevere().withCause(t).log("Failed to reindex groups");
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/group/SubgroupResource.java b/java/com/google/gerrit/server/group/SubgroupResource.java
new file mode 100644
index 0000000..a33e96b
--- /dev/null
+++ b/java/com/google/gerrit/server/group/SubgroupResource.java
@@ -0,0 +1,40 @@
+// Copyright (C) 2017 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.google.gerrit.server.group;
+
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.inject.TypeLiteral;
+
+public class SubgroupResource extends GroupResource {
+  public static final TypeLiteral<RestView<SubgroupResource>> SUBGROUP_KIND =
+      new TypeLiteral<RestView<SubgroupResource>>() {};
+
+  private final GroupDescription.Basic member;
+
+  public SubgroupResource(GroupResource group, GroupDescription.Basic member) {
+    super(group);
+    this.member = member;
+  }
+
+  public AccountGroup.UUID getMember() {
+    return getMemberDescription().getGroupUUID();
+  }
+
+  public GroupDescription.Basic getMemberDescription() {
+    return member;
+  }
+}
diff --git a/java/com/google/gerrit/server/group/SystemGroupBackend.java b/java/com/google/gerrit/server/group/SystemGroupBackend.java
new file mode 100644
index 0000000..85c1e73
--- /dev/null
+++ b/java/com/google/gerrit/server/group/SystemGroupBackend.java
@@ -0,0 +1,251 @@
+// Copyright (C) 2013 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.google.gerrit.server.group;
+
+import static java.util.Objects.requireNonNull;
+import static java.util.stream.Collectors.toSet;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.StartupCheck;
+import com.google.gerrit.server.StartupException;
+import com.google.gerrit.server.account.AbstractGroupBackend;
+import com.google.gerrit.server.account.GroupMembership;
+import com.google.gerrit.server.account.ListGroupMembership;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.group.db.Groups;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.TreeMap;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Config;
+
+@Singleton
+public class SystemGroupBackend extends AbstractGroupBackend {
+  public static final String SYSTEM_GROUP_SCHEME = "global:";
+
+  /** Common UUID assigned to the "Anonymous Users" group. */
+  public static final AccountGroup.UUID ANONYMOUS_USERS =
+      new AccountGroup.UUID(SYSTEM_GROUP_SCHEME + "Anonymous-Users");
+
+  /** Common UUID assigned to the "Registered Users" group. */
+  public static final AccountGroup.UUID REGISTERED_USERS =
+      new AccountGroup.UUID(SYSTEM_GROUP_SCHEME + "Registered-Users");
+
+  /** Common UUID assigned to the "Project Owners" placeholder group. */
+  public static final AccountGroup.UUID PROJECT_OWNERS =
+      new AccountGroup.UUID(SYSTEM_GROUP_SCHEME + "Project-Owners");
+
+  /** Common UUID assigned to the "Change Owner" placeholder group. */
+  public static final AccountGroup.UUID CHANGE_OWNER =
+      new AccountGroup.UUID(SYSTEM_GROUP_SCHEME + "Change-Owner");
+
+  private static final AccountGroup.UUID[] all = {
+    ANONYMOUS_USERS, REGISTERED_USERS, PROJECT_OWNERS, CHANGE_OWNER,
+  };
+
+  public static boolean isSystemGroup(AccountGroup.UUID uuid) {
+    return uuid.get().startsWith(SYSTEM_GROUP_SCHEME);
+  }
+
+  public static boolean isAnonymousOrRegistered(GroupReference ref) {
+    return isAnonymousOrRegistered(ref.getUUID());
+  }
+
+  public static boolean isAnonymousOrRegistered(AccountGroup.UUID uuid) {
+    return ANONYMOUS_USERS.equals(uuid) || REGISTERED_USERS.equals(uuid);
+  }
+
+  private final ImmutableSet<String> reservedNames;
+  private final SortedMap<String, GroupReference> namesToGroups;
+  private final ImmutableSet<String> names;
+  private final ImmutableMap<AccountGroup.UUID, GroupReference> uuids;
+
+  @Inject
+  @VisibleForTesting
+  public SystemGroupBackend(@GerritServerConfig Config cfg) {
+    SortedMap<String, GroupReference> n = new TreeMap<>();
+    ImmutableMap.Builder<AccountGroup.UUID, GroupReference> u = ImmutableMap.builder();
+
+    ImmutableSet.Builder<String> reservedNamesBuilder = ImmutableSet.builder();
+    for (AccountGroup.UUID uuid : all) {
+      int c = uuid.get().indexOf(':');
+      String defaultName = uuid.get().substring(c + 1).replace('-', ' ');
+      reservedNamesBuilder.add(defaultName);
+      String configuredName = cfg.getString("groups", uuid.get(), "name");
+      GroupReference ref =
+          new GroupReference(uuid, MoreObjects.firstNonNull(configuredName, defaultName));
+      n.put(ref.getName().toLowerCase(Locale.US), ref);
+      u.put(ref.getUUID(), ref);
+    }
+    reservedNames = reservedNamesBuilder.build();
+    namesToGroups = Collections.unmodifiableSortedMap(n);
+    names =
+        ImmutableSet.copyOf(
+            namesToGroups.values().stream().map(GroupReference::getName).collect(toSet()));
+    uuids = u.build();
+  }
+
+  public GroupReference getGroup(AccountGroup.UUID uuid) {
+    return requireNonNull(uuids.get(uuid), () -> String.format("group %s not found", uuid.get()));
+  }
+
+  public Set<String> getNames() {
+    return names;
+  }
+
+  public Set<String> getReservedNames() {
+    return reservedNames;
+  }
+
+  @Override
+  public boolean handles(AccountGroup.UUID uuid) {
+    return isSystemGroup(uuid);
+  }
+
+  @Override
+  public GroupDescription.Basic get(AccountGroup.UUID uuid) {
+    final GroupReference ref = uuids.get(uuid);
+    if (ref == null) {
+      return null;
+    }
+    return new GroupDescription.Basic() {
+      @Override
+      public String getName() {
+        return ref.getName();
+      }
+
+      @Override
+      public AccountGroup.UUID getGroupUUID() {
+        return ref.getUUID();
+      }
+
+      @Override
+      public String getUrl() {
+        return null;
+      }
+
+      @Override
+      public String getEmailAddress() {
+        return null;
+      }
+    };
+  }
+
+  @Override
+  public Collection<GroupReference> suggest(String name, ProjectState project) {
+    String nameLC = name.toLowerCase(Locale.US);
+    SortedMap<String, GroupReference> matches = namesToGroups.tailMap(nameLC);
+    if (matches.isEmpty()) {
+      return Collections.emptyList();
+    }
+
+    List<GroupReference> r = new ArrayList<>(matches.size());
+    for (Map.Entry<String, GroupReference> e : matches.entrySet()) {
+      if (e.getKey().startsWith(nameLC)) {
+        r.add(e.getValue());
+      } else {
+        break;
+      }
+    }
+    return r;
+  }
+
+  @Override
+  public GroupMembership membershipsOf(IdentifiedUser user) {
+    return new ListGroupMembership(ImmutableSet.of(ANONYMOUS_USERS, REGISTERED_USERS));
+  }
+
+  public static class NameCheck implements StartupCheck {
+    private final Config cfg;
+    private final Groups groups;
+
+    @Inject
+    NameCheck(@GerritServerConfig Config cfg, Groups groups) {
+      this.cfg = cfg;
+      this.groups = groups;
+    }
+
+    @Override
+    public void check() throws StartupException {
+      Map<AccountGroup.UUID, String> configuredNames = new HashMap<>();
+      Map<String, AccountGroup.UUID> byLowerCaseConfiguredName = new HashMap<>();
+      for (AccountGroup.UUID uuid : all) {
+        String configuredName = cfg.getString("groups", uuid.get(), "name");
+        if (configuredName != null) {
+          configuredNames.put(uuid, configuredName);
+          byLowerCaseConfiguredName.put(configuredName.toLowerCase(Locale.US), uuid);
+        }
+      }
+      if (configuredNames.isEmpty()) {
+        return;
+      }
+
+      Optional<GroupReference> conflictingGroup;
+      try {
+        conflictingGroup =
+            groups
+                .getAllGroupReferences()
+                .filter(group -> hasConfiguredName(byLowerCaseConfiguredName, group))
+                .findAny();
+
+      } catch (IOException | ConfigInvalidException ignored) {
+        return;
+      }
+
+      if (conflictingGroup.isPresent()) {
+        GroupReference group = conflictingGroup.get();
+        String groupName = group.getName();
+        AccountGroup.UUID systemGroupUuid = byLowerCaseConfiguredName.get(groupName);
+        throw new StartupException(
+            getAmbiguousNameMessage(groupName, group.getUUID(), systemGroupUuid));
+      }
+    }
+
+    private static boolean hasConfiguredName(
+        Map<String, AccountGroup.UUID> byLowerCaseConfiguredName, GroupReference group) {
+      String name = group.getName().toLowerCase(Locale.US);
+      return byLowerCaseConfiguredName.keySet().contains(name);
+    }
+
+    private static String getAmbiguousNameMessage(
+        String groupName, AccountGroup.UUID groupUuid, AccountGroup.UUID systemGroupUuid) {
+      return String.format(
+          "The configured name '%s' for system group '%s' is ambiguous"
+              + " with the name '%s' of existing group '%s'."
+              + " Please remove/change the value for groups.%s.name in"
+              + " gerrit.config.",
+          groupName, systemGroupUuid.get(), groupName, groupUuid.get(), systemGroupUuid.get());
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/group/db/AuditLogFormatter.java b/java/com/google/gerrit/server/group/db/AuditLogFormatter.java
new file mode 100644
index 0000000..508f5ef
--- /dev/null
+++ b/java/com/google/gerrit/server/group/db/AuditLogFormatter.java
@@ -0,0 +1,198 @@
+// Copyright (C) 2017 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.google.gerrit.server.group.db;
+
+import static com.google.common.base.Preconditions.checkState;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.account.GroupBackend;
+import java.util.Optional;
+import java.util.function.Function;
+import org.eclipse.jgit.lib.PersonIdent;
+
+/**
+ * A formatter for entities used in an audit log which is typically represented by NoteDb commits.
+ *
+ * <p>The formatted representation of those entities must be parsable so that we can read them later
+ * on and map them back to their original entities. {@link AuditLogFormatter} and {@link
+ * com.google.gerrit.server.notedb.NoteDbUtil NoteDbUtil} contain some of those parsing/mapping
+ * methods.
+ */
+public class AuditLogFormatter {
+  private final Function<Account.Id, Optional<Account>> accountRetriever;
+  private final Function<AccountGroup.UUID, Optional<GroupDescription.Basic>> groupRetriever;
+  @Nullable private final String serverId;
+
+  public static AuditLogFormatter createBackedBy(
+      AccountCache accountCache, GroupBackend groupBackend, String serverId) {
+    return create(
+        accountId -> getAccount(accountCache, accountId),
+        groupUuid -> getGroup(groupBackend, groupUuid),
+        serverId);
+  }
+
+  private static Optional<Account> getAccount(AccountCache accountCache, Account.Id accountId) {
+    return accountCache.get(accountId).map(AccountState::getAccount);
+  }
+
+  private static Optional<GroupDescription.Basic> getGroup(
+      GroupBackend groupBackend, AccountGroup.UUID groupUuid) {
+    return Optional.ofNullable(groupBackend.get(groupUuid));
+  }
+
+  public static AuditLogFormatter createBackedBy(
+      ImmutableSet<Account> allAccounts,
+      ImmutableSet<GroupDescription.Basic> allGroups,
+      String serverId) {
+    return create(id -> getAccount(allAccounts, id), uuid -> getGroup(allGroups, uuid), serverId);
+  }
+
+  private static Optional<GroupDescription.Basic> getGroup(
+      ImmutableSet<GroupDescription.Basic> groups, AccountGroup.UUID uuid) {
+    return groups.stream().filter(group -> group.getGroupUUID().equals(uuid)).findAny();
+  }
+
+  private static Optional<Account> getAccount(ImmutableSet<Account> accounts, Account.Id id) {
+    return accounts.stream().filter(account -> account.getId().equals(id)).findAny();
+  }
+
+  public static AuditLogFormatter createPartiallyWorkingFallBack() {
+    return new AuditLogFormatter(id -> Optional.empty(), uuid -> Optional.empty());
+  }
+
+  public static AuditLogFormatter create(
+      Function<Account.Id, Optional<Account>> accountRetriever,
+      Function<AccountGroup.UUID, Optional<GroupDescription.Basic>> groupRetriever,
+      String serverId) {
+    return new AuditLogFormatter(accountRetriever, groupRetriever, serverId);
+  }
+
+  private AuditLogFormatter(
+      Function<Account.Id, Optional<Account>> accountRetriever,
+      Function<AccountGroup.UUID, Optional<GroupDescription.Basic>> groupRetriever,
+      String serverId) {
+    this.accountRetriever = requireNonNull(accountRetriever);
+    this.groupRetriever = requireNonNull(groupRetriever);
+    this.serverId = requireNonNull(serverId);
+  }
+
+  private AuditLogFormatter(
+      Function<Account.Id, Optional<Account>> accountRetriever,
+      Function<AccountGroup.UUID, Optional<GroupDescription.Basic>> groupRetriever) {
+    this.accountRetriever = requireNonNull(accountRetriever);
+    this.groupRetriever = requireNonNull(groupRetriever);
+    serverId = null;
+  }
+
+  /**
+   * Creates a parsable {@code PersonIdent} for commits which are used as an audit log.
+   *
+   * <p><em>Parsable</em> means that we can unambiguously identify the original account when being
+   * presented with a {@code PersonIdent} of a commit.
+   *
+   * <p>We typically use the initiator of an action as the author of the commit when using those
+   * commits as an audit log. That's something which has to be specified by a caller of this method
+   * as this class doesn't create any commits itself.
+   *
+   * @param account the {@code Account} of the user who should be represented
+   * @param personIdent a {@code PersonIdent} which provides the timestamp for the created {@code
+   *     PersonIdent}
+   * @return a {@code PersonIdent} which can be used for the author of a commit
+   */
+  public PersonIdent getParsableAuthorIdent(Account account, PersonIdent personIdent) {
+    return getParsableAuthorIdent(account.getName(), account.getId(), personIdent);
+  }
+
+  /**
+   * Creates a parsable {@code PersonIdent} for commits which are used as an audit log.
+   *
+   * <p>See {@link #getParsableAuthorIdent(Account, PersonIdent)} for further details.
+   *
+   * @param accountId the ID of the account of the user who should be represented
+   * @param personIdent a {@code PersonIdent} which provides the timestamp for the created {@code
+   *     PersonIdent}
+   * @return a {@code PersonIdent} which can be used for the author of a commit
+   */
+  public PersonIdent getParsableAuthorIdent(Account.Id accountId, PersonIdent personIdent) {
+    String accountName = getAccountName(accountId);
+    return getParsableAuthorIdent(accountName, accountId, personIdent);
+  }
+
+  /**
+   * Provides a parsable representation of an account for use in e.g. commit messages.
+   *
+   * @param accountId the ID of the account of the user who should be represented
+   * @return the {@code String} representation of the account
+   */
+  public String getParsableAccount(Account.Id accountId) {
+    String accountName = getAccountName(accountId);
+    return formatNameEmail(accountName, getEmailForAuditLog(accountId));
+  }
+
+  /**
+   * Provides a parsable representation of a group for use in e.g. commit messages.
+   *
+   * @param groupUuid the UUID of the group
+   * @return the {@code String} representation of the group
+   */
+  public String getParsableGroup(AccountGroup.UUID groupUuid) {
+    String uuid = groupUuid.get();
+    Optional<GroupDescription.Basic> group = groupRetriever.apply(groupUuid);
+    String name = group.map(GroupDescription.Basic::getName).orElse(uuid);
+    return formatNameEmail(name, uuid);
+  }
+
+  private String getAccountName(Account.Id accountId) {
+    Optional<Account> account = accountRetriever.apply(accountId);
+    return account
+        .map(Account::getName)
+        // Historically, the database did not enforce relational integrity, so it is
+        // possible for groups to have non-existing members.
+        .orElse("No Account for Id #" + accountId);
+  }
+
+  private PersonIdent getParsableAuthorIdent(
+      String accountname, Account.Id accountId, PersonIdent personIdent) {
+    return new PersonIdent(
+        accountname,
+        getEmailForAuditLog(accountId),
+        personIdent.getWhen(),
+        personIdent.getTimeZone());
+  }
+
+  private String getEmailForAuditLog(Account.Id accountId) {
+    // If we ever switch to UUIDs for accounts, consider to remove the serverId and to use a similar
+    // approach as for group UUIDs.
+    checkState(
+        serverId != null, "serverId must be defined; fall-back AuditLogFormatter isn't sufficient");
+    return accountId.get() + "@" + serverId;
+  }
+
+  private static String formatNameEmail(String name, String email) {
+    StringBuilder formattedResult = new StringBuilder();
+    PersonIdent.appendSanitized(formattedResult, name);
+    formattedResult.append(" <");
+    PersonIdent.appendSanitized(formattedResult, email);
+    formattedResult.append(">");
+    return formattedResult.toString();
+  }
+}
diff --git a/java/com/google/gerrit/server/group/db/AuditLogReader.java b/java/com/google/gerrit/server/group/db/AuditLogReader.java
new file mode 100644
index 0000000..61fdb60
--- /dev/null
+++ b/java/com/google/gerrit/server/group/db/AuditLogReader.java
@@ -0,0 +1,262 @@
+// Copyright (C) 2017 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.google.gerrit.server.group.db;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.AccountGroupByIdAud;
+import com.google.gerrit.reviewdb.client.AccountGroupMemberAudit;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.GerritServerId;
+import com.google.gerrit.server.notedb.NoteDbUtil;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.FooterLine;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevSort;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.util.RawParseUtils;
+
+/** NoteDb reader for group audit log. */
+@Singleton
+public class AuditLogReader {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final String serverId;
+  private final AllUsersName allUsersName;
+
+  @Inject
+  public AuditLogReader(@GerritServerId String serverId, AllUsersName allUsersName) {
+    this.serverId = serverId;
+    this.allUsersName = allUsersName;
+  }
+
+  // Having separate methods for reading the two types of audit records mirrors the split in
+  // ReviewDb. Once ReviewDb is gone, the audit record interface becomes more flexible and we can
+  // revisit this, e.g. to do only a single walk, or even change the record types.
+
+  public ImmutableList<AccountGroupMemberAudit> getMembersAudit(
+      Repository allUsersRepo, AccountGroup.UUID uuid) throws IOException, ConfigInvalidException {
+    return getMembersAudit(getGroupId(allUsersRepo, uuid), parseCommits(allUsersRepo, uuid));
+  }
+
+  private ImmutableList<AccountGroupMemberAudit> getMembersAudit(
+      AccountGroup.Id groupId, List<ParsedCommit> commits) {
+    ListMultimap<MemberKey, AccountGroupMemberAudit> audits =
+        MultimapBuilder.hashKeys().linkedListValues().build();
+    ImmutableList.Builder<AccountGroupMemberAudit> result = ImmutableList.builder();
+    for (ParsedCommit pc : commits) {
+      for (Account.Id id : pc.addedMembers()) {
+        MemberKey key = MemberKey.create(groupId, id);
+        AccountGroupMemberAudit audit =
+            new AccountGroupMemberAudit(
+                new AccountGroupMemberAudit.Key(id, groupId, pc.when()), pc.authorId());
+        audits.put(key, audit);
+        result.add(audit);
+      }
+      for (Account.Id id : pc.removedMembers()) {
+        List<AccountGroupMemberAudit> adds = audits.get(MemberKey.create(groupId, id));
+        if (!adds.isEmpty()) {
+          AccountGroupMemberAudit audit = adds.remove(0);
+          audit.removed(pc.authorId(), pc.when());
+        } else {
+          // Match old behavior of DbGroupAuditListener and add a "legacy" add/remove pair.
+          AccountGroupMemberAudit audit =
+              new AccountGroupMemberAudit(
+                  new AccountGroupMemberAudit.Key(id, groupId, pc.when()), pc.authorId());
+          audit.removedLegacy();
+          result.add(audit);
+        }
+      }
+    }
+    return result.build();
+  }
+
+  public ImmutableList<AccountGroupByIdAud> getSubgroupsAudit(
+      Repository repo, AccountGroup.UUID uuid) throws IOException, ConfigInvalidException {
+    return getSubgroupsAudit(getGroupId(repo, uuid), parseCommits(repo, uuid));
+  }
+
+  private ImmutableList<AccountGroupByIdAud> getSubgroupsAudit(
+      AccountGroup.Id groupId, List<ParsedCommit> commits) {
+    ListMultimap<SubgroupKey, AccountGroupByIdAud> audits =
+        MultimapBuilder.hashKeys().linkedListValues().build();
+    ImmutableList.Builder<AccountGroupByIdAud> result = ImmutableList.builder();
+    for (ParsedCommit pc : commits) {
+      for (AccountGroup.UUID uuid : pc.addedSubgroups()) {
+        SubgroupKey key = SubgroupKey.create(groupId, uuid);
+        AccountGroupByIdAud audit =
+            new AccountGroupByIdAud(
+                new AccountGroupByIdAud.Key(groupId, uuid, pc.when()), pc.authorId());
+        audits.put(key, audit);
+        result.add(audit);
+      }
+      for (AccountGroup.UUID uuid : pc.removedSubgroups()) {
+        List<AccountGroupByIdAud> adds = audits.get(SubgroupKey.create(groupId, uuid));
+        if (!adds.isEmpty()) {
+          AccountGroupByIdAud audit = adds.remove(0);
+          audit.removed(pc.authorId(), pc.when());
+        } else {
+          // Unlike members, DbGroupAuditListener didn't insert an add/remove pair here.
+        }
+      }
+    }
+    return result.build();
+  }
+
+  private Optional<ParsedCommit> parse(AccountGroup.UUID uuid, RevCommit c) {
+    Optional<Account.Id> authorId = NoteDbUtil.parseIdent(c.getAuthorIdent(), serverId);
+    if (!authorId.isPresent()) {
+      // Only report audit events from identified users, since this is a non-nullable field in
+      // ReviewDb. May be revisited after groups are fully migrated to NoteDb.
+      return Optional.empty();
+    }
+
+    List<Account.Id> addedMembers = new ArrayList<>();
+    List<AccountGroup.UUID> addedSubgroups = new ArrayList<>();
+    List<Account.Id> removedMembers = new ArrayList<>();
+    List<AccountGroup.UUID> removedSubgroups = new ArrayList<>();
+
+    for (FooterLine line : c.getFooterLines()) {
+      if (line.matches(GroupConfigCommitMessage.FOOTER_ADD_MEMBER)) {
+        parseAccount(uuid, c, line).ifPresent(addedMembers::add);
+      } else if (line.matches(GroupConfigCommitMessage.FOOTER_REMOVE_MEMBER)) {
+        parseAccount(uuid, c, line).ifPresent(removedMembers::add);
+      } else if (line.matches(GroupConfigCommitMessage.FOOTER_ADD_GROUP)) {
+        parseGroup(uuid, c, line).ifPresent(addedSubgroups::add);
+      } else if (line.matches(GroupConfigCommitMessage.FOOTER_REMOVE_GROUP)) {
+        parseGroup(uuid, c, line).ifPresent(removedSubgroups::add);
+      }
+    }
+    return Optional.of(
+        new AutoValue_AuditLogReader_ParsedCommit(
+            authorId.get(),
+            new Timestamp(c.getAuthorIdent().getWhen().getTime()),
+            ImmutableList.copyOf(addedMembers),
+            ImmutableList.copyOf(removedMembers),
+            ImmutableList.copyOf(addedSubgroups),
+            ImmutableList.copyOf(removedSubgroups)));
+  }
+
+  private Optional<Account.Id> parseAccount(AccountGroup.UUID uuid, RevCommit c, FooterLine line) {
+    Optional<Account.Id> result =
+        Optional.ofNullable(RawParseUtils.parsePersonIdent(line.getValue()))
+            .flatMap(ident -> NoteDbUtil.parseIdent(ident, serverId));
+    if (!result.isPresent()) {
+      logInvalid(uuid, c, line);
+    }
+    return result;
+  }
+
+  private static Optional<AccountGroup.UUID> parseGroup(
+      AccountGroup.UUID uuid, RevCommit c, FooterLine line) {
+    PersonIdent ident = RawParseUtils.parsePersonIdent(line.getValue());
+    if (ident == null) {
+      logInvalid(uuid, c, line);
+      return Optional.empty();
+    }
+    return Optional.of(new AccountGroup.UUID(ident.getEmailAddress()));
+  }
+
+  private static void logInvalid(AccountGroup.UUID uuid, RevCommit c, FooterLine line) {
+    logger.atFine().log(
+        "Invalid footer line in commit %s while parsing audit log for group %s: %s",
+        c.name(), uuid, line);
+  }
+
+  private ImmutableList<ParsedCommit> parseCommits(Repository repo, AccountGroup.UUID uuid)
+      throws IOException {
+    try (RevWalk rw = new RevWalk(repo)) {
+      Ref ref = repo.exactRef(RefNames.refsGroups(uuid));
+      if (ref == null) {
+        return ImmutableList.of();
+      }
+
+      rw.reset();
+      rw.markStart(rw.parseCommit(ref.getObjectId()));
+      rw.setRetainBody(true);
+      rw.sort(RevSort.COMMIT_TIME_DESC, true);
+      rw.sort(RevSort.REVERSE, true);
+
+      ImmutableList.Builder<ParsedCommit> result = ImmutableList.builder();
+      RevCommit c;
+      while ((c = rw.next()) != null) {
+        parse(uuid, c).ifPresent(result::add);
+      }
+      return result.build();
+    }
+  }
+
+  private AccountGroup.Id getGroupId(Repository allUsersRepo, AccountGroup.UUID uuid)
+      throws ConfigInvalidException, IOException {
+    // TODO(dborowitz): This re-walks all commits just to find createdOn, which we don't need.
+    return GroupConfig.loadForGroup(allUsersName, allUsersRepo, uuid)
+        .getLoadedGroup()
+        .get()
+        .getId();
+  }
+
+  @AutoValue
+  abstract static class MemberKey {
+    static MemberKey create(AccountGroup.Id groupId, Account.Id memberId) {
+      return new AutoValue_AuditLogReader_MemberKey(groupId, memberId);
+    }
+
+    abstract AccountGroup.Id groupId();
+
+    abstract Account.Id memberId();
+  }
+
+  @AutoValue
+  abstract static class SubgroupKey {
+    static SubgroupKey create(AccountGroup.Id groupId, AccountGroup.UUID subgroupUuid) {
+      return new AutoValue_AuditLogReader_SubgroupKey(groupId, subgroupUuid);
+    }
+
+    abstract AccountGroup.Id groupId();
+
+    abstract AccountGroup.UUID subgroupUuid();
+  }
+
+  @AutoValue
+  abstract static class ParsedCommit {
+    abstract Account.Id authorId();
+
+    abstract Timestamp when();
+
+    abstract ImmutableList<Account.Id> addedMembers();
+
+    abstract ImmutableList<Account.Id> removedMembers();
+
+    abstract ImmutableList<AccountGroup.UUID> addedSubgroups();
+
+    abstract ImmutableList<AccountGroup.UUID> removedSubgroups();
+  }
+}
diff --git a/java/com/google/gerrit/server/group/db/GroupConfig.java b/java/com/google/gerrit/server/group/db/GroupConfig.java
new file mode 100644
index 0000000..66230ea
--- /dev/null
+++ b/java/com/google/gerrit/server/group/db/GroupConfig.java
@@ -0,0 +1,463 @@
+// Copyright (C) 2017 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.google.gerrit.server.group.db;
+
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.collect.ImmutableSet.toImmutableSet;
+import static java.util.Objects.requireNonNull;
+import static java.util.stream.Collectors.joining;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Splitter;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Streams;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.git.meta.VersionedMetaData;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmDuplicateKeyException;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.Arrays;
+import java.util.Optional;
+import java.util.function.Function;
+import java.util.regex.Pattern;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevSort;
+
+/**
+ * A representation of a group in NoteDb.
+ *
+ * <p>Groups in NoteDb can be created by following the descriptions of {@link
+ * #createForNewGroup(Project.NameKey, Repository, InternalGroupCreation)}. For reading groups from
+ * NoteDb or updating them, refer to {@link #loadForGroup(Project.NameKey, Repository,
+ * AccountGroup.UUID)} or {@link #loadForGroupSnapshot(Project.NameKey, Repository,
+ * AccountGroup.UUID, ObjectId)}.
+ *
+ * <p><strong>Note: </strong>Any modification (group creation or update) only becomes permanent (and
+ * hence written to NoteDb) if {@link #commit(MetaDataUpdate)} is called.
+ *
+ * <p><strong>Warning: </strong>This class is a low-level API for groups in NoteDb. Most code which
+ * deals with internal Gerrit groups should use {@link Groups} or {@link GroupsUpdate} instead.
+ *
+ * <p><em>Internal details</em>
+ *
+ * <p>Each group is represented by a commit on a branch as defined by {@link
+ * RefNames#refsGroups(AccountGroup.UUID)}. Previous versions of the group exist as older commits on
+ * the same branch and can be reached by following along the parent references. New commits for
+ * updates are only created if a real modification occurs.
+ *
+ * <p>The commit messages of all commits on that branch form the audit log for the group. The
+ * messages mention any important modifications which happened for the group to avoid costly
+ * computations.
+ *
+ * <p>Within each commit, the properties of a group are spread across three files:
+ *
+ * <ul>
+ *   <li><em>group.config</em>, which holds all basic properties of a group (further specified by
+ *       {@link GroupConfigEntry}), formatted as a JGit {@link Config} file
+ *   <li><em>members</em>, which lists all members (accounts) of a group, formatted as one numeric
+ *       ID per line
+ *   <li><em>subgroups</em>, which lists all subgroups of a group, formatted as one UUID per line
+ * </ul>
+ *
+ * <p>The files <em>members</em> and <em>subgroups</em> need not exist, which means that the group
+ * doesn't have any members or subgroups.
+ */
+public class GroupConfig extends VersionedMetaData {
+  @VisibleForTesting public static final String GROUP_CONFIG_FILE = "group.config";
+  @VisibleForTesting static final String MEMBERS_FILE = "members";
+  @VisibleForTesting static final String SUBGROUPS_FILE = "subgroups";
+  private static final Pattern LINE_SEPARATOR_PATTERN = Pattern.compile("\\R");
+
+  /**
+   * Creates a {@code GroupConfig} for a new group from the {@code InternalGroupCreation} blueprint.
+   * Further, optional properties can be specified by setting an {@code InternalGroupUpdate} via
+   * {@link #setGroupUpdate(InternalGroupUpdate, AuditLogFormatter)} on the returned {@code
+   * GroupConfig}.
+   *
+   * <p><strong>Note: </strong>The returned {@code GroupConfig} has to be committed via {@link
+   * #commit(MetaDataUpdate)} in order to create the group for real.
+   *
+   * @param projectName the name of the project which holds the NoteDb commits for groups
+   * @param repository the repository which holds the NoteDb commits for groups
+   * @param groupCreation an {@code InternalGroupCreation} specifying all properties which are
+   *     required for a new group
+   * @return a {@code GroupConfig} for a group creation
+   * @throws IOException if the repository can't be accessed for some reason
+   * @throws ConfigInvalidException if a group with the same UUID already exists but can't be read
+   *     due to an invalid format
+   * @throws OrmDuplicateKeyException if a group with the same UUID already exists
+   */
+  public static GroupConfig createForNewGroup(
+      Project.NameKey projectName, Repository repository, InternalGroupCreation groupCreation)
+      throws IOException, ConfigInvalidException, OrmDuplicateKeyException {
+    GroupConfig groupConfig = new GroupConfig(groupCreation.getGroupUUID());
+    groupConfig.load(projectName, repository);
+    groupConfig.setGroupCreation(groupCreation);
+    return groupConfig;
+  }
+
+  /**
+   * Creates a {@code GroupConfig} for an existing group.
+   *
+   * <p>The group is automatically loaded within this method and can be accessed via {@link
+   * #getLoadedGroup()}.
+   *
+   * <p>It's safe to call this method for non-existing groups. In that case, {@link
+   * #getLoadedGroup()} won't return any group. Thus, the existence of a group can be easily tested.
+   *
+   * <p>The group represented by the returned {@code GroupConfig} can be updated by setting an
+   * {@code InternalGroupUpdate} via {@link #setGroupUpdate(InternalGroupUpdate, AuditLogFormatter)}
+   * and committing the {@code GroupConfig} via {@link #commit(MetaDataUpdate)}.
+   *
+   * @param projectName the name of the project which holds the NoteDb commits for groups
+   * @param repository the repository which holds the NoteDb commits for groups
+   * @param groupUuid the UUID of the group
+   * @return a {@code GroupConfig} for the group with the specified UUID
+   * @throws IOException if the repository can't be accessed for some reason
+   * @throws ConfigInvalidException if the group exists but can't be read due to an invalid format
+   */
+  public static GroupConfig loadForGroup(
+      Project.NameKey projectName, Repository repository, AccountGroup.UUID groupUuid)
+      throws IOException, ConfigInvalidException {
+    GroupConfig groupConfig = new GroupConfig(groupUuid);
+    groupConfig.load(projectName, repository);
+    return groupConfig;
+  }
+
+  /**
+   * Creates a {@code GroupConfig} for an existing group at a specific revision of the repository.
+   *
+   * <p>This method behaves nearly the same as {@link #loadForGroup(Project.NameKey, Repository,
+   * AccountGroup.UUID)}. The only difference is that {@link #loadForGroup(Project.NameKey,
+   * Repository, AccountGroup.UUID)} loads the group from the current state of the repository
+   * whereas this method loads the group at a specific (maybe past) revision.
+   *
+   * @param projectName the name of the project which holds the NoteDb commits for groups
+   * @param repository the repository which holds the NoteDb commits for groups
+   * @param groupUuid the UUID of the group
+   * @param commitId the revision of the repository at which the group should be loaded
+   * @return a {@code GroupConfig} for the group with the specified UUID
+   * @throws IOException if the repository can't be accessed for some reason
+   * @throws ConfigInvalidException if the group exists but can't be read due to an invalid format
+   */
+  public static GroupConfig loadForGroupSnapshot(
+      Project.NameKey projectName,
+      Repository repository,
+      AccountGroup.UUID groupUuid,
+      ObjectId commitId)
+      throws IOException, ConfigInvalidException {
+    GroupConfig groupConfig = new GroupConfig(groupUuid);
+    groupConfig.load(projectName, repository, commitId);
+    return groupConfig;
+  }
+
+  private final AccountGroup.UUID groupUuid;
+  private final String ref;
+
+  private Optional<InternalGroup> loadedGroup = Optional.empty();
+  private Optional<InternalGroupCreation> groupCreation = Optional.empty();
+  private Optional<InternalGroupUpdate> groupUpdate = Optional.empty();
+  private AuditLogFormatter auditLogFormatter = AuditLogFormatter.createPartiallyWorkingFallBack();
+  private boolean isLoaded = false;
+  private boolean allowSaveEmptyName;
+
+  private GroupConfig(AccountGroup.UUID groupUuid) {
+    this.groupUuid = requireNonNull(groupUuid);
+    ref = RefNames.refsGroups(groupUuid);
+  }
+
+  /**
+   * Returns the group loaded from NoteDb.
+   *
+   * <p>If not any NoteDb commits exist for the group represented by this {@code GroupConfig}, no
+   * group is returned.
+   *
+   * <p>After {@link #commit(MetaDataUpdate)} was called on this {@code GroupConfig}, this method
+   * returns a group which is in line with the latest NoteDb commit for this group. So, after
+   * creating a {@code GroupConfig} for a new group and committing it, this method can be used to
+   * retrieve a representation of the created group. The same holds for the representation of an
+   * updated group.
+   *
+   * @return the loaded group, or an empty {@code Optional} if the group doesn't exist
+   */
+  public Optional<InternalGroup> getLoadedGroup() {
+    checkLoaded();
+    return loadedGroup;
+  }
+
+  /**
+   * Specifies how the current group should be updated.
+   *
+   * <p>If the group is newly created, the {@code InternalGroupUpdate} can be used to specify
+   * optional properties.
+   *
+   * <p><strong>Note: </strong>This method doesn't perform the update. It only contains the
+   * instructions for the update. To apply the update for real and write the result back to NoteDb,
+   * call {@link #commit(MetaDataUpdate)} on this {@code GroupConfig}.
+   *
+   * @param groupUpdate an {@code InternalGroupUpdate} outlining the modifications which should be
+   *     applied
+   * @param auditLogFormatter an {@code AuditLogFormatter} for formatting the commit message in a
+   *     parsable way
+   */
+  public void setGroupUpdate(InternalGroupUpdate groupUpdate, AuditLogFormatter auditLogFormatter) {
+    this.groupUpdate = Optional.of(groupUpdate);
+    this.auditLogFormatter = auditLogFormatter;
+  }
+
+  /**
+   * Allows the new name of a group to be empty during creation or update.
+   *
+   * <p><strong>Note: </strong>This method exists only to support the migration of legacy groups
+   * which don't always necessarily have a name. Nowadays, we enforce that groups always have names.
+   * When we remove the migration code, we can probably remove this method as well.
+   */
+  public void setAllowSaveEmptyName() {
+    this.allowSaveEmptyName = true;
+  }
+
+  private void setGroupCreation(InternalGroupCreation groupCreation)
+      throws OrmDuplicateKeyException {
+    checkLoaded();
+    if (loadedGroup.isPresent()) {
+      throw new OrmDuplicateKeyException(String.format("Group %s already exists", groupUuid.get()));
+    }
+
+    this.groupCreation = Optional.of(groupCreation);
+  }
+
+  @Override
+  public String getRefName() {
+    return ref;
+  }
+
+  @Override
+  protected void onLoad() throws IOException, ConfigInvalidException {
+    if (revision != null) {
+      rw.reset();
+      rw.markStart(revision);
+      rw.sort(RevSort.REVERSE);
+      RevCommit earliestCommit = rw.next();
+      Timestamp createdOn = new Timestamp(earliestCommit.getCommitTime() * 1000L);
+
+      Config config = readConfig(GROUP_CONFIG_FILE);
+      ImmutableSet<Account.Id> members = readMembers();
+      ImmutableSet<AccountGroup.UUID> subgroups = readSubgroups();
+      loadedGroup =
+          Optional.of(
+              createFrom(groupUuid, config, members, subgroups, createdOn, revision.toObjectId()));
+    }
+
+    isLoaded = true;
+  }
+
+  @Override
+  public RevCommit commit(MetaDataUpdate update) throws IOException {
+    RevCommit c = super.commit(update);
+    loadedGroup = Optional.of(loadedGroup.get().toBuilder().setRefState(c.toObjectId()).build());
+    return c;
+  }
+
+  @Override
+  protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException {
+    checkLoaded();
+    if (!groupCreation.isPresent() && !groupUpdate.isPresent()) {
+      // Group was neither created nor changed. -> A new commit isn't necessary.
+      return false;
+    }
+
+    if (!allowSaveEmptyName && getNewName().equals(Optional.of(""))) {
+      throw new ConfigInvalidException(
+          String.format("Name of the group %s must be defined", groupUuid.get()));
+    }
+
+    // Commit timestamps are internally truncated to seconds. To return the correct 'createdOn' time
+    // for new groups, we explicitly need to truncate the timestamp here.
+    Timestamp commitTimestamp =
+        TimeUtil.truncateToSecond(
+            groupUpdate.flatMap(InternalGroupUpdate::getUpdatedOn).orElseGet(TimeUtil::nowTs));
+    commit.setAuthor(new PersonIdent(commit.getAuthor(), commitTimestamp));
+    commit.setCommitter(new PersonIdent(commit.getCommitter(), commitTimestamp));
+
+    InternalGroup updatedGroup = updateGroup(commitTimestamp);
+
+    String commitMessage = createCommitMessage(loadedGroup, updatedGroup);
+    commit.setMessage(commitMessage);
+
+    loadedGroup = Optional.of(updatedGroup);
+    groupCreation = Optional.empty();
+    groupUpdate = Optional.empty();
+
+    return true;
+  }
+
+  private void checkLoaded() {
+    checkState(isLoaded, "Group %s not loaded yet", groupUuid.get());
+  }
+
+  private Optional<String> getNewName() {
+    if (groupUpdate.isPresent()) {
+      return groupUpdate.get().getName().map(n -> Strings.nullToEmpty(n.get()));
+    }
+    if (groupCreation.isPresent()) {
+      return Optional.of(Strings.nullToEmpty(groupCreation.get().getNameKey().get()));
+    }
+    return Optional.empty();
+  }
+
+  private InternalGroup updateGroup(Timestamp commitTimestamp)
+      throws IOException, ConfigInvalidException {
+    Config config = updateGroupProperties();
+
+    ImmutableSet<Account.Id> originalMembers =
+        loadedGroup.map(InternalGroup::getMembers).orElseGet(ImmutableSet::of);
+    Optional<ImmutableSet<Account.Id>> updatedMembers = updateMembers(originalMembers);
+
+    ImmutableSet<AccountGroup.UUID> originalSubgroups =
+        loadedGroup.map(InternalGroup::getSubgroups).orElseGet(ImmutableSet::of);
+    Optional<ImmutableSet<AccountGroup.UUID>> updatedSubgroups = updateSubgroups(originalSubgroups);
+
+    Timestamp createdOn = loadedGroup.map(InternalGroup::getCreatedOn).orElse(commitTimestamp);
+
+    return createFrom(
+        groupUuid,
+        config,
+        updatedMembers.orElse(originalMembers),
+        updatedSubgroups.orElse(originalSubgroups),
+        createdOn,
+        null);
+  }
+
+  private Config updateGroupProperties() throws IOException, ConfigInvalidException {
+    Config config = readConfig(GROUP_CONFIG_FILE);
+    groupCreation.ifPresent(
+        internalGroupCreation ->
+            Arrays.stream(GroupConfigEntry.values())
+                .forEach(configEntry -> configEntry.initNewConfig(config, internalGroupCreation)));
+    groupUpdate.ifPresent(
+        internalGroupUpdate ->
+            Arrays.stream(GroupConfigEntry.values())
+                .forEach(
+                    configEntry -> configEntry.updateConfigValue(config, internalGroupUpdate)));
+    saveConfig(GROUP_CONFIG_FILE, config);
+    return config;
+  }
+
+  private Optional<ImmutableSet<Account.Id>> updateMembers(ImmutableSet<Account.Id> originalMembers)
+      throws IOException {
+    Optional<ImmutableSet<Account.Id>> updatedMembers =
+        groupUpdate
+            .map(InternalGroupUpdate::getMemberModification)
+            .map(memberModification -> memberModification.apply(originalMembers))
+            .map(ImmutableSet::copyOf)
+            .filter(members -> !originalMembers.equals(members));
+    if (updatedMembers.isPresent()) {
+      saveMembers(updatedMembers.get());
+    }
+    return updatedMembers;
+  }
+
+  private Optional<ImmutableSet<AccountGroup.UUID>> updateSubgroups(
+      ImmutableSet<AccountGroup.UUID> originalSubgroups) throws IOException {
+    Optional<ImmutableSet<AccountGroup.UUID>> updatedSubgroups =
+        groupUpdate
+            .map(InternalGroupUpdate::getSubgroupModification)
+            .map(subgroupModification -> subgroupModification.apply(originalSubgroups))
+            .map(ImmutableSet::copyOf)
+            .filter(subgroups -> !originalSubgroups.equals(subgroups));
+    if (updatedSubgroups.isPresent()) {
+      saveSubgroups(updatedSubgroups.get());
+    }
+    return updatedSubgroups;
+  }
+
+  private void saveMembers(ImmutableSet<Account.Id> members) throws IOException {
+    saveToFile(MEMBERS_FILE, members, member -> String.valueOf(member.get()));
+  }
+
+  private void saveSubgroups(ImmutableSet<AccountGroup.UUID> subgroups) throws IOException {
+    saveToFile(SUBGROUPS_FILE, subgroups, AccountGroup.UUID::get);
+  }
+
+  private <E> void saveToFile(
+      String filePath, ImmutableSet<E> elements, Function<E, String> toStringFunction)
+      throws IOException {
+    String fileContent = elements.stream().map(toStringFunction).collect(joining("\n"));
+    saveUTF8(filePath, fileContent);
+  }
+
+  private ImmutableSet<Account.Id> readMembers() throws IOException, ConfigInvalidException {
+    return readFromFile(MEMBERS_FILE, entry -> new Account.Id(Integer.parseInt(entry)));
+  }
+
+  private ImmutableSet<AccountGroup.UUID> readSubgroups()
+      throws IOException, ConfigInvalidException {
+    return readFromFile(SUBGROUPS_FILE, AccountGroup.UUID::new);
+  }
+
+  private <E> ImmutableSet<E> readFromFile(String filePath, Function<String, E> fromStringFunction)
+      throws IOException, ConfigInvalidException {
+    String fileContent = readUTF8(filePath);
+    try {
+      Iterable<String> lines =
+          Splitter.on(LINE_SEPARATOR_PATTERN).trimResults().omitEmptyStrings().split(fileContent);
+      return Streams.stream(lines).map(fromStringFunction).collect(toImmutableSet());
+    } catch (NumberFormatException e) {
+      throw new ConfigInvalidException(
+          String.format("Invalid file %s for commit %s", filePath, revision.name()), e);
+    }
+  }
+
+  private static InternalGroup createFrom(
+      AccountGroup.UUID groupUuid,
+      Config config,
+      ImmutableSet<Account.Id> members,
+      ImmutableSet<AccountGroup.UUID> subgroups,
+      Timestamp createdOn,
+      ObjectId refState)
+      throws ConfigInvalidException {
+    InternalGroup.Builder group = InternalGroup.builder();
+    group.setGroupUUID(groupUuid);
+    for (GroupConfigEntry configEntry : GroupConfigEntry.values()) {
+      configEntry.readFromConfig(groupUuid, group, config);
+    }
+    group.setMembers(members);
+    group.setSubgroups(subgroups);
+    group.setCreatedOn(createdOn);
+    group.setRefState(refState);
+    return group.build();
+  }
+
+  private String createCommitMessage(
+      Optional<InternalGroup> originalGroup, InternalGroup updatedGroup) {
+    GroupConfigCommitMessage commitMessage =
+        new GroupConfigCommitMessage(auditLogFormatter, updatedGroup);
+    originalGroup.ifPresent(commitMessage::setOriginalGroup);
+    return commitMessage.create();
+  }
+}
diff --git a/java/com/google/gerrit/server/group/db/GroupConfigCommitMessage.java b/java/com/google/gerrit/server/group/db/GroupConfigCommitMessage.java
new file mode 100644
index 0000000..5627154
--- /dev/null
+++ b/java/com/google/gerrit/server/group/db/GroupConfigCommitMessage.java
@@ -0,0 +1,119 @@
+// 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.
+
+package com.google.gerrit.server.group.db;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+import com.google.common.collect.Streams;
+import com.google.gerrit.server.group.InternalGroup;
+import java.util.Optional;
+import java.util.Set;
+import java.util.StringJoiner;
+import java.util.function.BiFunction;
+import java.util.function.Function;
+import java.util.stream.Stream;
+import org.eclipse.jgit.revwalk.FooterKey;
+
+/**
+ * A parsable commit message for a NoteDb commit of a group.
+ *
+ * <p>For group creations, it's sufficient to simply call the constructor of this class. For
+ * updates, {@link #setOriginalGroup(InternalGroup)} has to be called as well.
+ */
+class GroupConfigCommitMessage {
+  static final FooterKey FOOTER_ADD_MEMBER = new FooterKey("Add");
+  static final FooterKey FOOTER_REMOVE_MEMBER = new FooterKey("Remove");
+  static final FooterKey FOOTER_ADD_GROUP = new FooterKey("Add-group");
+  static final FooterKey FOOTER_REMOVE_GROUP = new FooterKey("Remove-group");
+
+  private final AuditLogFormatter auditLogFormatter;
+  private final InternalGroup updatedGroup;
+  private Optional<InternalGroup> originalGroup = Optional.empty();
+
+  GroupConfigCommitMessage(AuditLogFormatter auditLogFormatter, InternalGroup updatedGroup) {
+    this.auditLogFormatter = auditLogFormatter;
+    this.updatedGroup = updatedGroup;
+  }
+
+  public void setOriginalGroup(InternalGroup originalGroup) {
+    this.originalGroup = Optional.of(originalGroup);
+  }
+
+  public String create() {
+    String summaryLine = originalGroup.isPresent() ? "Update group" : "Create group";
+
+    StringJoiner footerJoiner = new StringJoiner("\n", "\n\n", "");
+    footerJoiner.setEmptyValue("");
+    Streams.concat(
+            Streams.stream(getFooterForRename()),
+            getFootersForMemberModifications(),
+            getFootersForSubgroupModifications())
+        .sorted()
+        .forEach(footerJoiner::add);
+    String footer = footerJoiner.toString();
+
+    return summaryLine + footer;
+  }
+
+  private Optional<String> getFooterForRename() {
+    if (!originalGroup.isPresent()) {
+      return Optional.empty();
+    }
+
+    String originalName = originalGroup.get().getName();
+    String newName = updatedGroup.getName();
+    if (originalName.equals(newName)) {
+      return Optional.empty();
+    }
+    return Optional.of("Rename from " + originalName + " to " + newName);
+  }
+
+  private Stream<String> getFootersForMemberModifications() {
+    return getFooters(
+        InternalGroup::getMembers,
+        AuditLogFormatter::getParsableAccount,
+        FOOTER_ADD_MEMBER,
+        FOOTER_REMOVE_MEMBER);
+  }
+
+  private Stream<String> getFootersForSubgroupModifications() {
+    return getFooters(
+        InternalGroup::getSubgroups,
+        AuditLogFormatter::getParsableGroup,
+        FOOTER_ADD_GROUP,
+        FOOTER_REMOVE_GROUP);
+  }
+
+  private <T> Stream<String> getFooters(
+      Function<InternalGroup, Set<T>> getElements,
+      BiFunction<AuditLogFormatter, T, String> toParsableString,
+      FooterKey additionFooterKey,
+      FooterKey removalFooterKey) {
+    Set<T> oldElements = originalGroup.map(getElements).orElseGet(ImmutableSet::of);
+    Set<T> newElements = getElements.apply(updatedGroup);
+
+    Function<T, String> toString = element -> toParsableString.apply(auditLogFormatter, element);
+
+    Stream<String> removedElements =
+        Sets.difference(oldElements, newElements).stream()
+            .map(toString)
+            .map((removalFooterKey.getName() + ": ")::concat);
+    Stream<String> addedElements =
+        Sets.difference(newElements, oldElements).stream()
+            .map(toString)
+            .map((additionFooterKey.getName() + ": ")::concat);
+    return Stream.concat(removedElements, addedElements);
+  }
+}
diff --git a/java/com/google/gerrit/server/group/db/GroupConfigEntry.java b/java/com/google/gerrit/server/group/db/GroupConfigEntry.java
new file mode 100644
index 0000000..eff3458
--- /dev/null
+++ b/java/com/google/gerrit/server/group/db/GroupConfigEntry.java
@@ -0,0 +1,229 @@
+// Copyright (C) 2017 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.google.gerrit.server.group.db;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.group.InternalGroup;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Config;
+
+/**
+ * A basic property of a group.
+ *
+ * <p>Each property knows how to read and write its value from/to a JGit {@link Config} file.
+ *
+ * <p><strong>Warning: </strong>This class is a low-level API for properties of groups in NoteDb. It
+ * may only be used by {@link GroupConfig}. Other classes should use {@link InternalGroupUpdate} to
+ * modify the properties of a group.
+ */
+enum GroupConfigEntry {
+  /**
+   * The numeric ID of a group. This property is equivalent to {@link InternalGroup#getId()}.
+   *
+   * <p>This is a mandatory property which may not be changed.
+   */
+  ID("id") {
+    @Override
+    void readFromConfig(AccountGroup.UUID groupUuid, InternalGroup.Builder group, Config config)
+        throws ConfigInvalidException {
+      int id = config.getInt(SECTION_NAME, super.keyName, -1);
+      if (id < 0) {
+        throw new ConfigInvalidException(
+            String.format(
+                "ID of the group %s must not be negative, found %d", groupUuid.get(), id));
+      }
+      group.setId(new AccountGroup.Id(id));
+    }
+
+    @Override
+    void initNewConfig(Config config, InternalGroupCreation group) {
+      AccountGroup.Id id = group.getId();
+
+      // Do not use config.setInt(...) to write the group ID because config.setInt(...) persists
+      // integers that can be expressed in KiB as a unit strings, e.g. "1024" is stored as "1k".
+      // Using config.setString(...) ensures that group IDs are human readable.
+      config.setString(SECTION_NAME, null, super.keyName, Integer.toString(id.get()));
+    }
+
+    @Override
+    void updateConfigValue(Config config, InternalGroupUpdate groupUpdate) {
+      // Updating the ID is not supported.
+    }
+  },
+  /**
+   * The name of a group. This property is equivalent to {@link InternalGroup#getNameKey()}.
+   *
+   * <p>This is a mandatory property.
+   */
+  NAME("name") {
+    @Override
+    void readFromConfig(AccountGroup.UUID groupUuid, InternalGroup.Builder group, Config config) {
+      String name = config.getString(SECTION_NAME, null, super.keyName);
+      // An empty name is invalid in NoteDb; GroupConfig will refuse to store it and it might be
+      // unusable in permissions. But, it was technically valid in the ReviewDb storage layer, and
+      // the NoteDb migration converted such groups faithfully, so we need to be able to read them
+      // back here.
+      name = Strings.nullToEmpty(name);
+      group.setNameKey(new AccountGroup.NameKey(name));
+    }
+
+    @Override
+    void initNewConfig(Config config, InternalGroupCreation group) {
+      AccountGroup.NameKey name = group.getNameKey();
+      config.setString(SECTION_NAME, null, super.keyName, name.get());
+    }
+
+    @Override
+    void updateConfigValue(Config config, InternalGroupUpdate groupUpdate) {
+      groupUpdate
+          .getName()
+          .ifPresent(name -> config.setString(SECTION_NAME, null, super.keyName, name.get()));
+    }
+  },
+  /**
+   * The description of a group. This property is equivalent to {@link
+   * InternalGroup#getDescription()}.
+   *
+   * <p>It defaults to {@code null} if not set.
+   */
+  DESCRIPTION("description") {
+    @Override
+    void readFromConfig(AccountGroup.UUID groupUuid, InternalGroup.Builder group, Config config) {
+      String description = config.getString(SECTION_NAME, null, super.keyName);
+      group.setDescription(Strings.emptyToNull(description));
+    }
+
+    @Override
+    void initNewConfig(Config config, InternalGroupCreation group) {
+      config.setString(SECTION_NAME, null, super.keyName, null);
+    }
+
+    @Override
+    void updateConfigValue(Config config, InternalGroupUpdate groupUpdate) {
+      groupUpdate
+          .getDescription()
+          .ifPresent(
+              description ->
+                  config.setString(
+                      SECTION_NAME, null, super.keyName, Strings.emptyToNull(description)));
+    }
+  },
+  /**
+   * The owner of a group. This property is equivalent to {@link InternalGroup#getOwnerGroupUUID()}.
+   *
+   * <p>It defaults to the group itself if not set.
+   */
+  OWNER_GROUP_UUID("ownerGroupUuid") {
+    @Override
+    void readFromConfig(AccountGroup.UUID groupUuid, InternalGroup.Builder group, Config config)
+        throws ConfigInvalidException {
+      String ownerGroupUuid = config.getString(SECTION_NAME, null, super.keyName);
+      if (Strings.isNullOrEmpty(ownerGroupUuid)) {
+        throw new ConfigInvalidException(
+            String.format("Owner UUID of the group %s must be defined", groupUuid.get()));
+      }
+      group.setOwnerGroupUUID(new AccountGroup.UUID(ownerGroupUuid));
+    }
+
+    @Override
+    void initNewConfig(Config config, InternalGroupCreation group) {
+      config.setString(SECTION_NAME, null, super.keyName, group.getGroupUUID().get());
+    }
+
+    @Override
+    void updateConfigValue(Config config, InternalGroupUpdate groupUpdate) {
+      groupUpdate
+          .getOwnerGroupUUID()
+          .ifPresent(
+              ownerGroupUuid ->
+                  config.setString(SECTION_NAME, null, super.keyName, ownerGroupUuid.get()));
+    }
+  },
+  /**
+   * A flag indicating the visibility of a group. This property is equivalent to {@link
+   * InternalGroup#isVisibleToAll()}.
+   *
+   * <p>It defaults to {@code false} if not set.
+   */
+  VISIBLE_TO_ALL("visibleToAll") {
+    @Override
+    void readFromConfig(AccountGroup.UUID groupUuid, InternalGroup.Builder group, Config config) {
+      boolean visibleToAll = config.getBoolean(SECTION_NAME, super.keyName, false);
+      group.setVisibleToAll(visibleToAll);
+    }
+
+    @Override
+    void initNewConfig(Config config, InternalGroupCreation group) {
+      config.setBoolean(SECTION_NAME, null, super.keyName, false);
+    }
+
+    @Override
+    void updateConfigValue(Config config, InternalGroupUpdate groupUpdate) {
+      groupUpdate
+          .getVisibleToAll()
+          .ifPresent(
+              visibleToAll -> config.setBoolean(SECTION_NAME, null, super.keyName, visibleToAll));
+    }
+  };
+
+  private static final String SECTION_NAME = "group";
+
+  private final String keyName;
+
+  GroupConfigEntry(String keyName) {
+    this.keyName = keyName;
+  }
+
+  /**
+   * Reads the corresponding property of this {@code GroupConfigEntry} from the given {@code
+   * Config}. The read value is written to the corresponding property of {@code
+   * InternalGroup.Builder}.
+   *
+   * @param groupUuid the UUID of the group (necessary for helpful error messages)
+   * @param group the {@code InternalGroup.Builder} whose property value should be set
+   * @param config the {@code Config} from which the value of the property should be read
+   * @throws ConfigInvalidException if the property has an unexpected value
+   */
+  abstract void readFromConfig(
+      AccountGroup.UUID groupUuid, InternalGroup.Builder group, Config config)
+      throws ConfigInvalidException;
+
+  /**
+   * Initializes the corresponding property of this {@code GroupConfigEntry} in the given {@code
+   * Config}.
+   *
+   * <p>If the specified {@code InternalGroupCreation} has an entry for the property, that value is
+   * used. If not, the default value for the property is set. In any case, an existing entry for the
+   * property in the {@code Config} will be overwritten.
+   *
+   * @param config a new {@code Config}, typically without an entry for the property
+   * @param group an {@code InternalGroupCreation} detailing the initial value of mandatory group
+   *     properties
+   */
+  abstract void initNewConfig(Config config, InternalGroupCreation group);
+
+  /**
+   * Updates the corresponding property of this {@code GroupConfigEntry} in the given {@code Config}
+   * if the {@code InternalGroupUpdate} mentions a modification.
+   *
+   * <p>This call is a no-op if the {@code InternalGroupUpdate} doesn't contain a modification for
+   * the property.
+   *
+   * @param config a {@code Config} for which the property should be updated
+   * @param groupUpdate an {@code InternalGroupUpdate} detailing the modifications on a group
+   */
+  abstract void updateConfigValue(Config config, InternalGroupUpdate groupUpdate);
+}
diff --git a/java/com/google/gerrit/server/group/db/GroupDbModule.java b/java/com/google/gerrit/server/group/db/GroupDbModule.java
new file mode 100644
index 0000000..e5676bd
--- /dev/null
+++ b/java/com/google/gerrit/server/group/db/GroupDbModule.java
@@ -0,0 +1,24 @@
+// 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.
+
+package com.google.gerrit.server.group.db;
+
+import com.google.gerrit.extensions.config.FactoryModule;
+
+public class GroupDbModule extends FactoryModule {
+  @Override
+  protected void configure() {
+    factory(RenameGroupOp.Factory.class);
+  }
+}
diff --git a/java/com/google/gerrit/server/group/db/GroupNameNotes.java b/java/com/google/gerrit/server/group/db/GroupNameNotes.java
new file mode 100644
index 0000000..e95e91f
--- /dev/null
+++ b/java/com/google/gerrit/server/group/db/GroupNameNotes.java
@@ -0,0 +1,461 @@
+// Copyright (C) 2017 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.google.gerrit.server.group.db;
+
+import static com.google.common.collect.ImmutableBiMap.toImmutableBiMap;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Objects.requireNonNull;
+import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Strings;
+import com.google.common.collect.HashMultiset;
+import com.google.common.collect.ImmutableBiMap;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Multiset;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.hash.Hashing;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.git.meta.VersionedMetaData;
+import com.google.gwtorm.server.OrmDuplicateKeyException;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.notes.Note;
+import org.eclipse.jgit.notes.NoteMap;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.ReceiveCommand;
+
+/**
+ * An enforcer of unique names for groups in NoteDb.
+ *
+ * <p>The way groups are stored in NoteDb (see {@link GroupConfig}) doesn't enforce unique names,
+ * even though groups in Gerrit must not have duplicate names. The storage format doesn't allow to
+ * quickly look up whether a name has already been used either. That's why we additionally keep a
+ * map of name/UUID pairs and manage it with this class.
+ *
+ * <p>To claim the name for a new group, create an instance of {@code GroupNameNotes} via {@link
+ * #forNewGroup(Project.NameKey, Repository, AccountGroup.UUID, AccountGroup.NameKey)} and call
+ * {@link #commit(com.google.gerrit.server.git.meta.MetaDataUpdate) commit(MetaDataUpdate)} on it.
+ * For renaming, call {@link #forRename(Project.NameKey, Repository, AccountGroup.UUID,
+ * AccountGroup.NameKey, AccountGroup.NameKey)} and also commit the returned {@code GroupNameNotes}.
+ * Both times, the creation of the {@code GroupNameNotes} will fail if the (new) name is already
+ * used. Committing the {@code GroupNameNotes} is necessary to make the adjustments for real.
+ *
+ * <p>The map has an additional benefit: We can quickly iterate over all group name/UUID pairs
+ * without having to load all groups completely (which is costly).
+ *
+ * <p><em>Internal details</em>
+ *
+ * <p>The map of names is represented by Git {@link Note notes}. They are stored on the branch
+ * {@link RefNames#REFS_GROUPNAMES}. Each commit on the branch reflects one moment in time of the
+ * complete map.
+ *
+ * <p>As key for the notes, we use the SHA-1 of the name. As data, they contain a text version of a
+ * JGit {@link Config} file. That config file has two entries:
+ *
+ * <ul>
+ *   <li>the name of the group (as clear text)
+ *   <li>the UUID of the group which currently has this name
+ * </ul>
+ */
+public class GroupNameNotes extends VersionedMetaData {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final String SECTION_NAME = "group";
+  private static final String UUID_PARAM = "uuid";
+  private static final String NAME_PARAM = "name";
+
+  @VisibleForTesting
+  static final String UNIQUE_REF_ERROR = "GroupReference collection must contain unique references";
+
+  /**
+   * Creates an instance of {@code GroupNameNotes} for use when renaming a group.
+   *
+   * <p><strong>Note: </strong>The returned instance of {@code GroupNameNotes} has to be committed
+   * via {@link #commit(com.google.gerrit.server.git.meta.MetaDataUpdate) commit(MetaDataUpdate)} in
+   * order to claim the new name and free up the old one.
+   *
+   * @param projectName the name of the project which holds the commits of the notes
+   * @param repository the repository which holds the commits of the notes
+   * @param groupUuid the UUID of the group which is renamed
+   * @param oldName the current name of the group
+   * @param newName the new name of the group
+   * @return an instance of {@code GroupNameNotes} configured for a specific renaming of a group
+   * @throws IOException if the repository can't be accessed for some reason
+   * @throws ConfigInvalidException if the note for the specified group doesn't exist or is in an
+   *     invalid state
+   * @throws OrmDuplicateKeyException if a group with the new name already exists
+   */
+  public static GroupNameNotes forRename(
+      Project.NameKey projectName,
+      Repository repository,
+      AccountGroup.UUID groupUuid,
+      AccountGroup.NameKey oldName,
+      AccountGroup.NameKey newName)
+      throws IOException, ConfigInvalidException, OrmDuplicateKeyException {
+    requireNonNull(oldName);
+    requireNonNull(newName);
+
+    GroupNameNotes groupNameNotes = new GroupNameNotes(groupUuid, oldName, newName);
+    groupNameNotes.load(projectName, repository);
+    groupNameNotes.ensureNewNameIsNotUsed();
+    return groupNameNotes;
+  }
+
+  /**
+   * Creates an instance of {@code GroupNameNotes} for use when creating a new group.
+   *
+   * <p><strong>Note: </strong>The returned instance of {@code GroupNameNotes} has to be committed
+   * via {@link #commit(com.google.gerrit.server.git.meta.MetaDataUpdate) commit(MetaDataUpdate)} in
+   * order to claim the new name.
+   *
+   * @param projectName the name of the project which holds the commits of the notes
+   * @param repository the repository which holds the commits of the notes
+   * @param groupUuid the UUID of the new group
+   * @param groupName the name of the new group
+   * @return an instance of {@code GroupNameNotes} configured for a specific group creation
+   * @throws IOException if the repository can't be accessed for some reason
+   * @throws ConfigInvalidException in no case so far
+   * @throws OrmDuplicateKeyException if a group with the new name already exists
+   */
+  public static GroupNameNotes forNewGroup(
+      Project.NameKey projectName,
+      Repository repository,
+      AccountGroup.UUID groupUuid,
+      AccountGroup.NameKey groupName)
+      throws IOException, ConfigInvalidException, OrmDuplicateKeyException {
+    requireNonNull(groupName);
+
+    GroupNameNotes groupNameNotes = new GroupNameNotes(groupUuid, null, groupName);
+    groupNameNotes.load(projectName, repository);
+    groupNameNotes.ensureNewNameIsNotUsed();
+    return groupNameNotes;
+  }
+
+  /**
+   * Loads the {@code GroupReference} (name/UUID pair) for the group with the specified name.
+   *
+   * @param repository the repository which holds the commits of the notes
+   * @param groupName the name of the group
+   * @return the corresponding {@code GroupReference} if a group/note with the given name exists
+   * @throws IOException if the repository can't be accessed for some reason
+   * @throws ConfigInvalidException if the note for the specified group is in an invalid state
+   */
+  public static Optional<GroupReference> loadGroup(
+      Repository repository, AccountGroup.NameKey groupName)
+      throws IOException, ConfigInvalidException {
+    Ref ref = repository.exactRef(RefNames.REFS_GROUPNAMES);
+    if (ref == null) {
+      return Optional.empty();
+    }
+
+    try (RevWalk revWalk = new RevWalk(repository);
+        ObjectReader reader = revWalk.getObjectReader()) {
+      RevCommit notesCommit = revWalk.parseCommit(ref.getObjectId());
+      NoteMap noteMap = NoteMap.read(reader, notesCommit);
+      ObjectId noteDataBlobId = noteMap.get(getNoteKey(groupName));
+      if (noteDataBlobId == null) {
+        return Optional.empty();
+      }
+      return Optional.of(getGroupReference(reader, noteDataBlobId));
+    }
+  }
+
+  /**
+   * Loads the {@code GroupReference}s (name/UUID pairs) for all groups.
+   *
+   * <p>Even though group UUIDs should be unique, this class doesn't enforce it. For this reason,
+   * it's technically possible that two of the {@code GroupReference}s have a duplicate UUID but a
+   * different name. In practice, this shouldn't occur unless we introduce a bug in the future.
+   *
+   * @param repository the repository which holds the commits of the notes
+   * @return the {@code GroupReference}s of all existing groups/notes
+   * @throws IOException if the repository can't be accessed for some reason
+   * @throws ConfigInvalidException if one of the notes is in an invalid state
+   */
+  public static ImmutableList<GroupReference> loadAllGroups(Repository repository)
+      throws IOException, ConfigInvalidException {
+    Ref ref = repository.exactRef(RefNames.REFS_GROUPNAMES);
+    if (ref == null) {
+      return ImmutableList.of();
+    }
+    try (RevWalk revWalk = new RevWalk(repository);
+        ObjectReader reader = revWalk.getObjectReader()) {
+      RevCommit notesCommit = revWalk.parseCommit(ref.getObjectId());
+      NoteMap noteMap = NoteMap.read(reader, notesCommit);
+
+      Multiset<GroupReference> groupReferences = HashMultiset.create();
+      for (Note note : noteMap) {
+        GroupReference groupReference = getGroupReference(reader, note.getData());
+        int numOfOccurrences = groupReferences.add(groupReference, 1);
+        if (numOfOccurrences > 1) {
+          GroupsNoteDbConsistencyChecker.logConsistencyProblemAsWarning(
+              "The UUID of group %s (%s) is duplicate in group name notes",
+              groupReference.getName(), groupReference.getUUID());
+        }
+      }
+
+      return ImmutableList.copyOf(groupReferences);
+    }
+  }
+
+  /**
+   * Replaces the map of name/UUID pairs with a new version which matches exactly the passed {@code
+   * GroupReference}s.
+   *
+   * <p>All old entries are discarded and replaced by the new ones.
+   *
+   * <p>This operation also works if the previous map has invalid entries or can't be read anymore.
+   *
+   * <p><strong>Note: </strong>This method doesn't flush the {@code ObjectInserter}. It doesn't
+   * execute the {@code BatchRefUpdate} either.
+   *
+   * @param repository the repository which holds the commits of the notes
+   * @param inserter an {@code ObjectInserter} for that repository
+   * @param bru a {@code BatchRefUpdate} to which this method adds commands
+   * @param groupReferences all {@code GroupReference}s (name/UUID pairs) which should be contained
+   *     in the map of name/UUID pairs
+   * @param ident the {@code PersonIdent} which is used as author and committer for commits
+   * @throws IOException if the repository can't be accessed for some reason
+   */
+  public static void updateAllGroups(
+      Repository repository,
+      ObjectInserter inserter,
+      BatchRefUpdate bru,
+      Collection<GroupReference> groupReferences,
+      PersonIdent ident)
+      throws IOException {
+    // Not strictly necessary for iteration; throws IAE if it encounters duplicates, which is nice.
+    ImmutableBiMap<AccountGroup.UUID, String> biMap = toBiMap(groupReferences);
+
+    try (ObjectReader reader = inserter.newReader();
+        RevWalk rw = new RevWalk(reader)) {
+      // Always start from an empty map, discarding old notes.
+      NoteMap noteMap = NoteMap.newEmptyMap();
+      Ref ref = repository.exactRef(RefNames.REFS_GROUPNAMES);
+      RevCommit oldCommit = ref != null ? rw.parseCommit(ref.getObjectId()) : null;
+
+      for (Map.Entry<AccountGroup.UUID, String> e : biMap.entrySet()) {
+        AccountGroup.NameKey nameKey = new AccountGroup.NameKey(e.getValue());
+        ObjectId noteKey = getNoteKey(nameKey);
+        noteMap.set(noteKey, getAsNoteData(e.getKey(), nameKey), inserter);
+      }
+
+      ObjectId newTreeId = noteMap.writeTree(inserter);
+      if (oldCommit != null && newTreeId.equals(oldCommit.getTree())) {
+        return;
+      }
+      CommitBuilder cb = new CommitBuilder();
+      if (oldCommit != null) {
+        cb.addParentId(oldCommit);
+      }
+      cb.setTreeId(newTreeId);
+      cb.setAuthor(ident);
+      cb.setCommitter(ident);
+      int n = groupReferences.size();
+      cb.setMessage("Store " + n + " group name" + (n != 1 ? "s" : ""));
+      ObjectId newId = inserter.insert(cb).copy();
+
+      ObjectId oldId = oldCommit != null ? oldCommit.copy() : ObjectId.zeroId();
+      bru.addCommand(new ReceiveCommand(oldId, newId, RefNames.REFS_GROUPNAMES));
+    }
+  }
+
+  // Returns UUID <=> Name bimap.
+  private static ImmutableBiMap<AccountGroup.UUID, String> toBiMap(
+      Collection<GroupReference> groupReferences) {
+    try {
+      return groupReferences.stream()
+          .collect(toImmutableBiMap(GroupReference::getUUID, GroupReference::getName));
+    } catch (IllegalArgumentException e) {
+      throw new IllegalArgumentException(UNIQUE_REF_ERROR, e);
+    }
+  }
+
+  private final AccountGroup.UUID groupUuid;
+  private Optional<AccountGroup.NameKey> oldGroupName;
+  private Optional<AccountGroup.NameKey> newGroupName;
+
+  private boolean nameConflicting;
+
+  private GroupNameNotes(
+      AccountGroup.UUID groupUuid,
+      @Nullable AccountGroup.NameKey oldGroupName,
+      @Nullable AccountGroup.NameKey newGroupName) {
+    this.groupUuid = requireNonNull(groupUuid);
+
+    if (Objects.equals(oldGroupName, newGroupName)) {
+      this.oldGroupName = Optional.empty();
+      this.newGroupName = Optional.empty();
+    } else {
+      this.oldGroupName = Optional.ofNullable(oldGroupName);
+      this.newGroupName = Optional.ofNullable(newGroupName);
+    }
+  }
+
+  @Override
+  protected String getRefName() {
+    return RefNames.REFS_GROUPNAMES;
+  }
+
+  @Override
+  protected void onLoad() throws IOException, ConfigInvalidException {
+    nameConflicting = false;
+
+    logger.atFine().log("Reading group notes");
+
+    if (revision != null) {
+      NoteMap noteMap = NoteMap.read(reader, revision);
+      if (newGroupName.isPresent()) {
+        ObjectId newNameId = getNoteKey(newGroupName.get());
+        nameConflicting = noteMap.contains(newNameId);
+      }
+      ensureOldNameIsPresent(noteMap);
+    }
+  }
+
+  private void ensureOldNameIsPresent(NoteMap noteMap) throws IOException, ConfigInvalidException {
+    if (oldGroupName.isPresent()) {
+      AccountGroup.NameKey oldName = oldGroupName.get();
+      ObjectId noteKey = getNoteKey(oldName);
+      ObjectId noteDataBlobId = noteMap.get(noteKey);
+      if (noteDataBlobId == null) {
+        throw new ConfigInvalidException(
+            String.format("Group name '%s' doesn't exist in the list of all names", oldName));
+      }
+      GroupReference group = getGroupReference(reader, noteDataBlobId);
+      AccountGroup.UUID foundUuid = group.getUUID();
+      if (!Objects.equals(groupUuid, foundUuid)) {
+        throw new ConfigInvalidException(
+            String.format(
+                "Name '%s' points to UUID '%s' and not to '%s'", oldName, foundUuid, groupUuid));
+      }
+    }
+  }
+
+  private void ensureNewNameIsNotUsed() throws OrmDuplicateKeyException {
+    if (newGroupName.isPresent() && nameConflicting) {
+      throw new OrmDuplicateKeyException(
+          String.format("Name '%s' is already used", newGroupName.get().get()));
+    }
+  }
+
+  @Override
+  protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException {
+    if (!oldGroupName.isPresent() && !newGroupName.isPresent()) {
+      return false;
+    }
+
+    logger.atFine().log("Updating group notes");
+
+    NoteMap noteMap = revision == null ? NoteMap.newEmptyMap() : NoteMap.read(reader, revision);
+    if (oldGroupName.isPresent()) {
+      removeNote(noteMap, oldGroupName.get(), inserter);
+    }
+
+    if (newGroupName.isPresent()) {
+      addNote(noteMap, newGroupName.get(), groupUuid, inserter);
+    }
+
+    commit.setTreeId(noteMap.writeTree(inserter));
+    commit.setMessage(getCommitMessage());
+
+    oldGroupName = Optional.empty();
+    newGroupName = Optional.empty();
+
+    return true;
+  }
+
+  private static void removeNote(
+      NoteMap noteMap, AccountGroup.NameKey groupName, ObjectInserter inserter) throws IOException {
+    ObjectId noteKey = getNoteKey(groupName);
+    noteMap.set(noteKey, null, inserter);
+  }
+
+  private static void addNote(
+      NoteMap noteMap,
+      AccountGroup.NameKey groupName,
+      AccountGroup.UUID groupUuid,
+      ObjectInserter inserter)
+      throws IOException {
+    ObjectId noteKey = getNoteKey(groupName);
+    noteMap.set(noteKey, getAsNoteData(groupUuid, groupName), inserter);
+  }
+
+  // Use the same approach as ExternalId.Key.sha1().
+  @SuppressWarnings("deprecation")
+  @VisibleForTesting
+  public static ObjectId getNoteKey(AccountGroup.NameKey groupName) {
+    return ObjectId.fromRaw(Hashing.sha1().hashString(groupName.get(), UTF_8).asBytes());
+  }
+
+  private static String getAsNoteData(AccountGroup.UUID uuid, AccountGroup.NameKey groupName) {
+    Config config = new Config();
+    config.setString(SECTION_NAME, null, UUID_PARAM, uuid.get());
+    config.setString(SECTION_NAME, null, NAME_PARAM, groupName.get());
+    return config.toText();
+  }
+
+  private static GroupReference getGroupReference(ObjectReader reader, ObjectId noteDataBlobId)
+      throws IOException, ConfigInvalidException {
+    byte[] noteData = reader.open(noteDataBlobId, OBJ_BLOB).getCachedBytes();
+    return getFromNoteData(noteData);
+  }
+
+  static GroupReference getFromNoteData(byte[] noteData) throws ConfigInvalidException {
+    Config config = new Config();
+    config.fromText(new String(noteData, UTF_8));
+
+    String uuid = config.getString(SECTION_NAME, null, UUID_PARAM);
+    String name = Strings.nullToEmpty(config.getString(SECTION_NAME, null, NAME_PARAM));
+    if (uuid == null) {
+      throw new ConfigInvalidException(String.format("UUID for group '%s' must be defined", name));
+    }
+
+    return new GroupReference(new AccountGroup.UUID(uuid), name);
+  }
+
+  private String getCommitMessage() {
+    if (oldGroupName.isPresent() && newGroupName.isPresent()) {
+      return String.format(
+          "Rename group from '%s' to '%s'", oldGroupName.get(), newGroupName.get());
+    }
+    if (newGroupName.isPresent()) {
+      return String.format("Create group '%s'", newGroupName.get());
+    }
+    if (oldGroupName.isPresent()) {
+      return String.format("Delete group '%s'", oldGroupName.get());
+    }
+    return "No-op";
+  }
+}
diff --git a/java/com/google/gerrit/server/group/db/Groups.java b/java/com/google/gerrit/server/group/db/Groups.java
new file mode 100644
index 0000000..37de011
--- /dev/null
+++ b/java/com/google/gerrit/server/group/db/Groups.java
@@ -0,0 +1,159 @@
+// Copyright (C) 2017 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.google.gerrit.server.group.db;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.AccountGroupByIdAud;
+import com.google.gerrit.reviewdb.client.AccountGroupMemberAudit;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Stream;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Repository;
+
+/**
+ * A database accessor for read calls related to groups.
+ *
+ * <p>All calls which read group related details from the database are gathered here. Other classes
+ * should always use this class instead of accessing the database directly. There are a few
+ * exceptions though: schema classes, wrapper classes, and classes executed during init. The latter
+ * ones should use {@code GroupsOnInit} instead.
+ *
+ * <p>Most callers should not need to read groups directly from the database; they should use the
+ * {@link com.google.gerrit.server.account.GroupCache GroupCache} instead.
+ *
+ * <p>If not explicitly stated, all methods of this class refer to <em>internal</em> groups.
+ */
+@Singleton
+public class Groups {
+  private final GitRepositoryManager repoManager;
+  private final AllUsersName allUsersName;
+  private final AuditLogReader auditLogReader;
+
+  @Inject
+  public Groups(
+      GitRepositoryManager repoManager, AllUsersName allUsersName, AuditLogReader auditLogReader) {
+    this.repoManager = repoManager;
+    this.allUsersName = allUsersName;
+    this.auditLogReader = auditLogReader;
+  }
+
+  /**
+   * Returns the {@code InternalGroup} for the specified UUID if it exists.
+   *
+   * @param groupUuid the UUID of the group
+   * @return the found {@code InternalGroup} if it exists, or else an empty {@code Optional}
+   * @throws IOException if the group couldn't be retrieved from NoteDb
+   * @throws ConfigInvalidException if the group couldn't be retrieved from NoteDb
+   */
+  public Optional<InternalGroup> getGroup(AccountGroup.UUID groupUuid)
+      throws IOException, ConfigInvalidException {
+    try (Repository allUsersRepo = repoManager.openRepository(allUsersName)) {
+      return getGroupFromNoteDb(allUsersName, allUsersRepo, groupUuid);
+    }
+  }
+
+  private static Optional<InternalGroup> getGroupFromNoteDb(
+      AllUsersName allUsersName, Repository allUsersRepository, AccountGroup.UUID groupUuid)
+      throws IOException, ConfigInvalidException {
+    GroupConfig groupConfig = GroupConfig.loadForGroup(allUsersName, allUsersRepository, groupUuid);
+    Optional<InternalGroup> loadedGroup = groupConfig.getLoadedGroup();
+    if (loadedGroup.isPresent()) {
+      // Check consistency with group name notes.
+      GroupsNoteDbConsistencyChecker.ensureConsistentWithGroupNameNotes(
+          allUsersRepository, loadedGroup.get());
+    }
+    return loadedGroup;
+  }
+
+  /**
+   * Returns {@code GroupReference}s for all internal groups.
+   *
+   * @return a stream of the {@code GroupReference}s of all internal groups
+   * @throws IOException if an error occurs while reading from NoteDb
+   * @throws ConfigInvalidException if the data in NoteDb is in an incorrect format
+   */
+  public Stream<GroupReference> getAllGroupReferences() throws IOException, ConfigInvalidException {
+    try (Repository allUsersRepo = repoManager.openRepository(allUsersName)) {
+      return GroupNameNotes.loadAllGroups(allUsersRepo).stream();
+    }
+  }
+
+  /**
+   * Returns all known external groups. External groups are 'known' when they are specified as a
+   * subgroup of an internal group.
+   *
+   * @return a stream of the UUIDs of the known external groups
+   * @throws IOException if an error occurs while reading from NoteDb
+   * @throws ConfigInvalidException if the data in NoteDb is in an incorrect format
+   */
+  public Stream<AccountGroup.UUID> getExternalGroups() throws IOException, ConfigInvalidException {
+    try (Repository allUsersRepo = repoManager.openRepository(allUsersName)) {
+      return getExternalGroupsFromNoteDb(allUsersName, allUsersRepo);
+    }
+  }
+
+  private static Stream<AccountGroup.UUID> getExternalGroupsFromNoteDb(
+      AllUsersName allUsersName, Repository allUsersRepo)
+      throws IOException, ConfigInvalidException {
+    ImmutableList<GroupReference> allInternalGroups = GroupNameNotes.loadAllGroups(allUsersRepo);
+    ImmutableSet.Builder<AccountGroup.UUID> allSubgroups = ImmutableSet.builder();
+    for (GroupReference internalGroup : allInternalGroups) {
+      Optional<InternalGroup> group =
+          getGroupFromNoteDb(allUsersName, allUsersRepo, internalGroup.getUUID());
+      group.map(InternalGroup::getSubgroups).ifPresent(allSubgroups::addAll);
+    }
+    return allSubgroups.build().stream()
+        .filter(groupUuid -> !AccountGroup.isInternalGroup(groupUuid));
+  }
+
+  /**
+   * Returns the membership audit records for a given group.
+   *
+   * @param allUsersRepo All-Users repository.
+   * @param groupUuid the UUID of the group
+   * @return the audit records, in arbitrary order; empty if the group does not exist
+   * @throws IOException if an error occurs while reading from NoteDb
+   * @throws ConfigInvalidException if the group couldn't be retrieved from NoteDb
+   */
+  public List<AccountGroupMemberAudit> getMembersAudit(
+      Repository allUsersRepo, AccountGroup.UUID groupUuid)
+      throws IOException, ConfigInvalidException {
+    return auditLogReader.getMembersAudit(allUsersRepo, groupUuid);
+  }
+
+  /**
+   * Returns the subgroup audit records for a given group.
+   *
+   * @param repo All-Users repository.
+   * @param groupUuid the UUID of the group
+   * @return the audit records, in arbitrary order; empty if the group does not exist
+   * @throws IOException if an error occurs while reading from NoteDb
+   * @throws ConfigInvalidException if the group couldn't be retrieved from NoteDb
+   */
+  public List<AccountGroupByIdAud> getSubgroupsAudit(Repository repo, AccountGroup.UUID groupUuid)
+      throws IOException, ConfigInvalidException {
+    return auditLogReader.getSubgroupsAudit(repo, groupUuid);
+  }
+}
diff --git a/java/com/google/gerrit/server/group/db/GroupsConsistencyChecker.java b/java/com/google/gerrit/server/group/db/GroupsConsistencyChecker.java
new file mode 100644
index 0000000..3afb793
--- /dev/null
+++ b/java/com/google/gerrit/server/group/db/GroupsConsistencyChecker.java
@@ -0,0 +1,164 @@
+// Copyright (C) 2017 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.google.gerrit.server.group.db;
+
+import static com.google.gerrit.extensions.api.config.ConsistencyCheckInfo.ConsistencyProblemInfo.error;
+import static com.google.gerrit.extensions.api.config.ConsistencyCheckInfo.ConsistencyProblemInfo.warning;
+
+import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo.ConsistencyProblemInfo;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.account.Accounts;
+import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Repository;
+
+/**
+ * Checks individual groups for oddities, such as cycles, non-existent subgroups, etc. Only works if
+ * we are writing to NoteDb.
+ */
+@Singleton
+public class GroupsConsistencyChecker {
+  private final AllUsersName allUsersName;
+  private final GroupBackend groupBackend;
+  private final Accounts accounts;
+  private final GitRepositoryManager repoManager;
+  private final GroupsNoteDbConsistencyChecker globalChecker;
+
+  @Inject
+  GroupsConsistencyChecker(
+      AllUsersName allUsersName,
+      GroupBackend groupBackend,
+      Accounts accounts,
+      GitRepositoryManager repositoryManager,
+      GroupsNoteDbConsistencyChecker globalChecker) {
+    this.allUsersName = allUsersName;
+    this.groupBackend = groupBackend;
+    this.accounts = accounts;
+    this.repoManager = repositoryManager;
+    this.globalChecker = globalChecker;
+  }
+
+  /** Checks that all internal group references exist, and that no groups have cycles. */
+  public List<ConsistencyProblemInfo> check() throws IOException {
+    try (Repository repo = repoManager.openRepository(allUsersName)) {
+      GroupsNoteDbConsistencyChecker.Result result = globalChecker.check(repo);
+      if (!result.problems.isEmpty()) {
+        return result.problems;
+      }
+
+      for (InternalGroup g : result.uuidToGroupMap.values()) {
+        result.problems.addAll(checkGroup(g, result.uuidToGroupMap));
+      }
+
+      return result.problems;
+    }
+  }
+
+  /** Checks the metadata for a single group for problems. */
+  private List<ConsistencyProblemInfo> checkGroup(
+      InternalGroup g, Map<AccountGroup.UUID, InternalGroup> byUUID) throws IOException {
+    List<ConsistencyProblemInfo> problems = new ArrayList<>();
+
+    problems.addAll(checkCycle(g, byUUID));
+
+    if (byUUID.get(g.getOwnerGroupUUID()) == null
+        && groupBackend.get(g.getOwnerGroupUUID()) == null) {
+      problems.add(
+          error(
+              "group %s (%s) has nonexistent owner group %s",
+              g.getName(), g.getGroupUUID(), g.getOwnerGroupUUID()));
+    }
+
+    for (AccountGroup.UUID subUuid : g.getSubgroups()) {
+      if (byUUID.get(subUuid) == null && groupBackend.get(subUuid) == null) {
+        problems.add(
+            error(
+                "group %s (%s) has nonexistent subgroup %s",
+                g.getName(), g.getGroupUUID(), subUuid));
+      }
+    }
+
+    for (Account.Id id : g.getMembers().asList()) {
+      Optional<AccountState> account;
+      try {
+        account = accounts.get(id);
+      } catch (ConfigInvalidException e) {
+        problems.add(
+            error(
+                "group %s (%s) has member %s with invalid configuration: %s",
+                g.getName(), g.getGroupUUID(), id, e.getMessage()));
+        continue;
+      }
+      if (!account.isPresent()) {
+        problems.add(
+            error("group %s (%s) has nonexistent member %s", g.getName(), g.getGroupUUID(), id));
+      }
+    }
+    return problems;
+  }
+
+  /** checkCycle walks through root's subgroups recursively, and checks for cycles. */
+  private List<ConsistencyProblemInfo> checkCycle(
+      InternalGroup root, Map<AccountGroup.UUID, InternalGroup> byUUID) {
+    List<ConsistencyProblemInfo> problems = new ArrayList<>();
+    Set<InternalGroup> todo = new LinkedHashSet<>();
+    Set<InternalGroup> seen = new HashSet<>();
+
+    todo.add(root);
+    while (!todo.isEmpty()) {
+      InternalGroup t = todo.iterator().next();
+      todo.remove(t);
+
+      if (seen.contains(t)) {
+        continue;
+      }
+      seen.add(t);
+
+      // We don't check for owner cycles, since those are normal in self-administered groups.
+      for (AccountGroup.UUID subUuid : t.getSubgroups()) {
+        InternalGroup g = byUUID.get(subUuid);
+        if (g == null) {
+          continue;
+        }
+
+        if (Objects.equals(g, root)) {
+          problems.add(
+              warning(
+                  "group %s (%s) contains a cycle: %s (%s) points to it as subgroup.",
+                  root.getName(), root.getGroupUUID(), t.getName(), t.getGroupUUID()));
+        }
+
+        todo.add(g);
+      }
+    }
+    return problems;
+  }
+}
diff --git a/java/com/google/gerrit/server/group/db/GroupsNoteDbConsistencyChecker.java b/java/com/google/gerrit/server/group/db/GroupsNoteDbConsistencyChecker.java
new file mode 100644
index 0000000..58b55ee
--- /dev/null
+++ b/java/com/google/gerrit/server/group/db/GroupsNoteDbConsistencyChecker.java
@@ -0,0 +1,294 @@
+// Copyright (C) 2017 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.google.gerrit.server.group.db;
+
+import static com.google.gerrit.extensions.api.config.ConsistencyCheckInfo.ConsistencyProblemInfo.error;
+import static com.google.gerrit.extensions.api.config.ConsistencyCheckInfo.ConsistencyProblemInfo.warning;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.BiMap;
+import com.google.common.collect.HashBiMap;
+import com.google.common.collect.ImmutableList;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo;
+import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo.ConsistencyProblemInfo;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectLoader;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.notes.Note;
+import org.eclipse.jgit.notes.NoteMap;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+/** Check the referential integrity of NoteDb group storage. */
+@Singleton
+public class GroupsNoteDbConsistencyChecker {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final AllUsersName allUsersName;
+
+  @Inject
+  GroupsNoteDbConsistencyChecker(AllUsersName allUsersName) {
+    this.allUsersName = allUsersName;
+  }
+
+  /**
+   * The result of a consistency check. The UUID map is only non-null if no problems were detected.
+   */
+  public static class Result {
+    public List<ConsistencyProblemInfo> problems;
+
+    @Nullable public Map<AccountGroup.UUID, InternalGroup> uuidToGroupMap;
+  }
+
+  /** Checks for problems with the given All-Users repo. */
+  public Result check(Repository allUsersRepo) throws IOException {
+    Result r = doCheck(allUsersRepo);
+    if (!r.problems.isEmpty()) {
+      r.uuidToGroupMap = null;
+    }
+    return r;
+  }
+
+  private Result doCheck(Repository allUsersRepo) throws IOException {
+    Result result = new Result();
+    result.problems = new ArrayList<>();
+    result.uuidToGroupMap = new HashMap<>();
+
+    BiMap<AccountGroup.UUID, String> uuidNameBiMap = HashBiMap.create();
+
+    // Get all refs in an attempt to avoid seeing half committed group updates.
+    Map<String, Ref> refs = allUsersRepo.getAllRefs();
+    readGroups(allUsersRepo, refs, result);
+    readGroupNames(allUsersRepo, refs, result, uuidNameBiMap);
+    // The sequential IDs are not keys in NoteDb, so no need to check them.
+
+    if (!result.problems.isEmpty()) {
+      return result;
+    }
+
+    // Continue checking if we could read data without problems.
+    result.problems.addAll(checkGlobalConsistency(result.uuidToGroupMap, uuidNameBiMap));
+
+    return result;
+  }
+
+  private void readGroups(Repository allUsersRepo, Map<String, Ref> refs, Result result)
+      throws IOException {
+    for (Map.Entry<String, Ref> entry : refs.entrySet()) {
+      if (!entry.getKey().startsWith(RefNames.REFS_GROUPS)) {
+        continue;
+      }
+
+      AccountGroup.UUID uuid = AccountGroup.UUID.fromRef(entry.getKey());
+      if (uuid == null) {
+        result.problems.add(error("null UUID from %s", entry.getKey()));
+        continue;
+      }
+      try {
+        GroupConfig cfg =
+            GroupConfig.loadForGroupSnapshot(
+                allUsersName, allUsersRepo, uuid, entry.getValue().getObjectId());
+        result.uuidToGroupMap.put(uuid, cfg.getLoadedGroup().get());
+      } catch (ConfigInvalidException e) {
+        result.problems.add(error("group %s does not parse: %s", uuid, e.getMessage()));
+      }
+    }
+  }
+
+  private void readGroupNames(
+      Repository repo,
+      Map<String, Ref> refs,
+      Result result,
+      BiMap<AccountGroup.UUID, String> uuidNameBiMap)
+      throws IOException {
+    Ref ref = refs.get(RefNames.REFS_GROUPNAMES);
+    if (ref == null) {
+      String msg = String.format("ref %s does not exist", RefNames.REFS_GROUPNAMES);
+      result.problems.add(error(msg));
+      return;
+    }
+
+    try (RevWalk rw = new RevWalk(repo)) {
+      RevCommit c = rw.parseCommit(ref.getObjectId());
+      NoteMap nm = NoteMap.read(rw.getObjectReader(), c);
+
+      for (Note note : nm) {
+        ObjectLoader ld = rw.getObjectReader().open(note.getData());
+        byte[] data = ld.getCachedBytes();
+
+        GroupReference gRef;
+        try {
+          gRef = GroupNameNotes.getFromNoteData(data);
+        } catch (ConfigInvalidException e) {
+          result.problems.add(
+              error(
+                  "notename entry %s: %s does not parse: %s",
+                  note, new String(data, StandardCharsets.UTF_8), e.getMessage()));
+          continue;
+        }
+
+        ObjectId nameKey = GroupNameNotes.getNoteKey(new AccountGroup.NameKey(gRef.getName()));
+        if (!Objects.equals(nameKey, note)) {
+          result.problems.add(
+              error("notename entry %s does not match name %s", note, gRef.getName()));
+        }
+
+        // We trust SHA1 to have no collisions, so no need to check uniqueness of name.
+        uuidNameBiMap.put(gRef.getUUID(), gRef.getName());
+      }
+    }
+  }
+
+  /** Check invariants of the group refs with the group name refs. */
+  private List<ConsistencyProblemInfo> checkGlobalConsistency(
+      Map<AccountGroup.UUID, InternalGroup> uuidToGroupMap,
+      BiMap<AccountGroup.UUID, String> uuidNameBiMap) {
+    List<ConsistencyProblemInfo> problems = new ArrayList<>();
+
+    // Check consistency between the data coming from different refs.
+    for (AccountGroup.UUID uuid : uuidToGroupMap.keySet()) {
+      if (!uuidNameBiMap.containsKey(uuid)) {
+        problems.add(error("group %s has no entry in name map", uuid));
+        continue;
+      }
+
+      String noteName = uuidNameBiMap.get(uuid);
+      String groupRefName = uuidToGroupMap.get(uuid).getName();
+      if (!Objects.equals(noteName, groupRefName)) {
+        problems.add(
+            error(
+                "inconsistent name for group %s (name map %s vs. group ref %s)",
+                uuid, noteName, groupRefName));
+      }
+    }
+
+    for (AccountGroup.UUID uuid : uuidNameBiMap.keySet()) {
+      if (!uuidToGroupMap.containsKey(uuid)) {
+        problems.add(
+            error(
+                "name map has entry (%s, %s), entry missing as group ref",
+                uuid, uuidNameBiMap.get(uuid)));
+      }
+    }
+
+    if (problems.isEmpty()) {
+      // Check ids.
+      Map<AccountGroup.Id, InternalGroup> groupById = new HashMap<>();
+      for (InternalGroup g : uuidToGroupMap.values()) {
+        InternalGroup before = groupById.get(g.getId());
+        if (before != null) {
+          problems.add(
+              error(
+                  "shared group id %s for %s (%s) and %s (%s)",
+                  g.getId(),
+                  before.getName(),
+                  before.getGroupUUID(),
+                  g.getName(),
+                  g.getGroupUUID()));
+        }
+        groupById.put(g.getId(), g);
+      }
+    }
+
+    return problems;
+  }
+
+  public static void ensureConsistentWithGroupNameNotes(
+      Repository allUsersRepo, InternalGroup group) throws IOException {
+    List<ConsistencyCheckInfo.ConsistencyProblemInfo> problems =
+        GroupsNoteDbConsistencyChecker.checkWithGroupNameNotes(
+            allUsersRepo, group.getNameKey(), group.getGroupUUID());
+    problems.forEach(GroupsNoteDbConsistencyChecker::logConsistencyProblem);
+  }
+
+  /**
+   * Check group 'uuid' and 'name' read from 'group.config' with group name notes.
+   *
+   * @param allUsersRepo 'All-Users' repository.
+   * @param groupName the name of the group to be checked.
+   * @param groupUUID the {@code AccountGroup.UUID} of the group to be checked.
+   * @return a list of {@code ConsistencyProblemInfo} containing the problem details.
+   */
+  @VisibleForTesting
+  static List<ConsistencyProblemInfo> checkWithGroupNameNotes(
+      Repository allUsersRepo, AccountGroup.NameKey groupName, AccountGroup.UUID groupUUID)
+      throws IOException {
+    try {
+      Optional<GroupReference> groupRef = GroupNameNotes.loadGroup(allUsersRepo, groupName);
+
+      if (!groupRef.isPresent()) {
+        return ImmutableList.of(
+            warning("Group with name '%s' doesn't exist in the list of all names", groupName));
+      }
+
+      AccountGroup.UUID uuid = groupRef.get().getUUID();
+
+      List<ConsistencyProblemInfo> problems = new ArrayList<>();
+      if (!Objects.equals(groupUUID, uuid)) {
+        problems.add(
+            warning(
+                "group with name '%s' has UUID '%s' in 'group.config' but '%s' in group name notes",
+                groupName, groupUUID, uuid));
+      }
+
+      String name = groupName.get();
+      String actualName = groupRef.get().getName();
+      if (!Objects.equals(name, actualName)) {
+        problems.add(
+            warning("group note of name '%s' claims to represent name of '%s'", name, actualName));
+      }
+      return problems;
+    } catch (ConfigInvalidException e) {
+      return ImmutableList.of(
+          warning("fail to check consistency with group name notes: %s", e.getMessage()));
+    }
+  }
+
+  public static void logConsistencyProblemAsWarning(String fmt, Object... args) {
+    logConsistencyProblem(warning(fmt, args));
+  }
+
+  public static void logConsistencyProblem(ConsistencyProblemInfo p) {
+    if (p.status == ConsistencyProblemInfo.Status.WARNING) {
+      logger.atWarning().log(p.message);
+    } else {
+      logger.atSevere().log(p.message);
+    }
+  }
+
+  public static void logFailToLoadFromGroupRefAsWarning(AccountGroup.UUID uuid) {
+    logConsistencyProblem(
+        warning("Group with UUID %s from group name notes failed to load from group ref", uuid));
+  }
+}
diff --git a/java/com/google/gerrit/server/group/db/GroupsUpdate.java b/java/com/google/gerrit/server/group/db/GroupsUpdate.java
new file mode 100644
index 0000000..82a1bf4
--- /dev/null
+++ b/java/com/google/gerrit/server/group/db/GroupsUpdate.java
@@ -0,0 +1,489 @@
+// Copyright (C) 2017 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.google.gerrit.server.group.db;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Throwables;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.errors.NoSuchGroupException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.account.GroupCache;
+import com.google.gerrit.server.account.GroupIncludeCache;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.GerritServerId;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.LockFailureException;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.group.GroupAuditService;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.index.group.GroupIndexer;
+import com.google.gerrit.server.update.RefUpdateUtil;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmDuplicateKeyException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+
+/**
+ * A database accessor for write calls related to groups.
+ *
+ * <p>All calls which write group related details to the database are gathered here. Other classes
+ * should always use this class instead of accessing the database directly. There are a few
+ * exceptions though: schema classes, wrapper classes, and classes executed during init. The latter
+ * ones should use {@code GroupsOnInit} instead.
+ *
+ * <p>If not explicitly stated, all methods of this class refer to <em>internal</em> groups.
+ */
+public class GroupsUpdate {
+  public interface Factory {
+    /**
+     * Creates a {@code GroupsUpdate} which uses the identity of the specified user to mark database
+     * modifications executed by it. For NoteDb, this identity is used as author and committer for
+     * all related commits.
+     *
+     * <p><strong>Note</strong>: Please use this method with care and rather consider to use the
+     * correct annotation on the provider of a {@code GroupsUpdate} instead.
+     *
+     * @param currentUser the user to which modifications should be attributed, or {@code null} if
+     *     the Gerrit server identity should be used
+     */
+    GroupsUpdate create(@Nullable IdentifiedUser currentUser);
+  }
+
+  private final GitRepositoryManager repoManager;
+  private final AllUsersName allUsersName;
+  private final GroupCache groupCache;
+  private final GroupIncludeCache groupIncludeCache;
+  private final Provider<GroupIndexer> indexer;
+  private final GroupAuditService groupAuditService;
+  private final RenameGroupOp.Factory renameGroupOpFactory;
+  @Nullable private final IdentifiedUser currentUser;
+  private final AuditLogFormatter auditLogFormatter;
+  private final PersonIdent authorIdent;
+  private final MetaDataUpdateFactory metaDataUpdateFactory;
+  private final GitReferenceUpdated gitRefUpdated;
+  private final RetryHelper retryHelper;
+
+  @Inject
+  GroupsUpdate(
+      GitRepositoryManager repoManager,
+      AllUsersName allUsersName,
+      GroupBackend groupBackend,
+      GroupCache groupCache,
+      GroupIncludeCache groupIncludeCache,
+      Provider<GroupIndexer> indexer,
+      GroupAuditService auditService,
+      AccountCache accountCache,
+      RenameGroupOp.Factory renameGroupOpFactory,
+      @GerritServerId String serverId,
+      @GerritPersonIdent PersonIdent serverIdent,
+      MetaDataUpdate.InternalFactory metaDataUpdateInternalFactory,
+      GitReferenceUpdated gitRefUpdated,
+      RetryHelper retryHelper,
+      @Assisted @Nullable IdentifiedUser currentUser) {
+    this.repoManager = repoManager;
+    this.allUsersName = allUsersName;
+    this.groupCache = groupCache;
+    this.groupIncludeCache = groupIncludeCache;
+    this.indexer = indexer;
+    this.groupAuditService = auditService;
+    this.renameGroupOpFactory = renameGroupOpFactory;
+    this.gitRefUpdated = gitRefUpdated;
+    this.retryHelper = retryHelper;
+    this.currentUser = currentUser;
+
+    auditLogFormatter = AuditLogFormatter.createBackedBy(accountCache, groupBackend, serverId);
+    metaDataUpdateFactory =
+        getMetaDataUpdateFactory(
+            metaDataUpdateInternalFactory, currentUser, serverIdent, auditLogFormatter);
+    authorIdent = getAuthorIdent(serverIdent, currentUser);
+  }
+
+  private static MetaDataUpdateFactory getMetaDataUpdateFactory(
+      MetaDataUpdate.InternalFactory metaDataUpdateInternalFactory,
+      @Nullable IdentifiedUser currentUser,
+      PersonIdent serverIdent,
+      AuditLogFormatter auditLogFormatter) {
+    return (projectName, repository, batchRefUpdate) -> {
+      MetaDataUpdate metaDataUpdate =
+          metaDataUpdateInternalFactory.create(projectName, repository, batchRefUpdate);
+      metaDataUpdate.getCommitBuilder().setCommitter(serverIdent);
+      PersonIdent authorIdent;
+      if (currentUser != null) {
+        metaDataUpdate.setAuthor(currentUser);
+        authorIdent =
+            auditLogFormatter.getParsableAuthorIdent(currentUser.getAccount(), serverIdent);
+      } else {
+        authorIdent = serverIdent;
+      }
+      metaDataUpdate.getCommitBuilder().setAuthor(authorIdent);
+      return metaDataUpdate;
+    };
+  }
+
+  private static PersonIdent getAuthorIdent(
+      PersonIdent serverIdent, @Nullable IdentifiedUser currentUser) {
+    return currentUser != null ? createPersonIdent(serverIdent, currentUser) : serverIdent;
+  }
+
+  private static PersonIdent createPersonIdent(PersonIdent ident, IdentifiedUser user) {
+    return user.newCommitterIdent(ident.getWhen(), ident.getTimeZone());
+  }
+
+  /**
+   * Creates the specified group for the specified members (accounts).
+   *
+   * @param groupCreation an {@code InternalGroupCreation} which specifies all mandatory properties
+   *     of the group
+   * @param groupUpdate an {@code InternalGroupUpdate} which specifies optional properties of the
+   *     group. If this {@code InternalGroupUpdate} updates a property which was already specified
+   *     by the {@code InternalGroupCreation}, the value of this {@code InternalGroupUpdate} wins.
+   * @throws OrmDuplicateKeyException if a group with the chosen name already exists
+   * @throws IOException if indexing fails, or an error occurs while reading/writing from/to NoteDb
+   * @return the created {@code InternalGroup}
+   */
+  public InternalGroup createGroup(
+      InternalGroupCreation groupCreation, InternalGroupUpdate groupUpdate)
+      throws OrmDuplicateKeyException, IOException, ConfigInvalidException {
+    InternalGroup createdGroup = createGroupInNoteDbWithRetry(groupCreation, groupUpdate);
+    updateCachesOnGroupCreation(createdGroup);
+    dispatchAuditEventsOnGroupCreation(createdGroup);
+    return createdGroup;
+  }
+
+  /**
+   * Updates the specified group.
+   *
+   * @param groupUuid the UUID of the group to update
+   * @param groupUpdate an {@code InternalGroupUpdate} which indicates the desired updates on the
+   *     group
+   * @throws OrmDuplicateKeyException if the new name of the group is used by another group
+   * @throws IOException if indexing fails, or an error occurs while reading/writing from/to NoteDb
+   * @throws NoSuchGroupException if the specified group doesn't exist
+   */
+  public void updateGroup(AccountGroup.UUID groupUuid, InternalGroupUpdate groupUpdate)
+      throws OrmDuplicateKeyException, IOException, NoSuchGroupException, ConfigInvalidException {
+    Optional<Timestamp> updatedOn = groupUpdate.getUpdatedOn();
+    if (!updatedOn.isPresent()) {
+      updatedOn = Optional.of(TimeUtil.nowTs());
+      groupUpdate = groupUpdate.toBuilder().setUpdatedOn(updatedOn.get()).build();
+    }
+
+    UpdateResult result = updateGroupInNoteDbWithRetry(groupUuid, groupUpdate);
+    updateNameInProjectConfigsIfNecessary(result);
+    updateCachesOnGroupUpdate(result);
+    dispatchAuditEventsOnGroupUpdate(result, updatedOn.get());
+  }
+
+  private InternalGroup createGroupInNoteDbWithRetry(
+      InternalGroupCreation groupCreation, InternalGroupUpdate groupUpdate)
+      throws IOException, ConfigInvalidException, OrmDuplicateKeyException {
+    try {
+      return retryHelper.execute(
+          RetryHelper.ActionType.GROUP_UPDATE,
+          () -> createGroupInNoteDb(groupCreation, groupUpdate),
+          LockFailureException.class::isInstance);
+    } catch (Exception e) {
+      Throwables.throwIfUnchecked(e);
+      Throwables.throwIfInstanceOf(e, IOException.class);
+      Throwables.throwIfInstanceOf(e, ConfigInvalidException.class);
+      Throwables.throwIfInstanceOf(e, OrmDuplicateKeyException.class);
+      throw new IOException(e);
+    }
+  }
+
+  @VisibleForTesting
+  public InternalGroup createGroupInNoteDb(
+      InternalGroupCreation groupCreation, InternalGroupUpdate groupUpdate)
+      throws IOException, ConfigInvalidException, OrmDuplicateKeyException {
+    try (Repository allUsersRepo = repoManager.openRepository(allUsersName)) {
+      AccountGroup.NameKey groupName = groupUpdate.getName().orElseGet(groupCreation::getNameKey);
+      GroupNameNotes groupNameNotes =
+          GroupNameNotes.forNewGroup(
+              allUsersName, allUsersRepo, groupCreation.getGroupUUID(), groupName);
+
+      GroupConfig groupConfig =
+          GroupConfig.createForNewGroup(allUsersName, allUsersRepo, groupCreation);
+      groupConfig.setGroupUpdate(groupUpdate, auditLogFormatter);
+
+      commit(allUsersRepo, groupConfig, groupNameNotes);
+
+      return groupConfig
+          .getLoadedGroup()
+          .orElseThrow(
+              () -> new IllegalStateException("Created group wasn't automatically loaded"));
+    }
+  }
+
+  private UpdateResult updateGroupInNoteDbWithRetry(
+      AccountGroup.UUID groupUuid, InternalGroupUpdate groupUpdate)
+      throws IOException, ConfigInvalidException, OrmDuplicateKeyException, NoSuchGroupException {
+    try {
+      return retryHelper.execute(
+          RetryHelper.ActionType.GROUP_UPDATE,
+          () -> updateGroupInNoteDb(groupUuid, groupUpdate),
+          LockFailureException.class::isInstance);
+    } catch (Exception e) {
+      Throwables.throwIfUnchecked(e);
+      Throwables.throwIfInstanceOf(e, IOException.class);
+      Throwables.throwIfInstanceOf(e, ConfigInvalidException.class);
+      Throwables.throwIfInstanceOf(e, OrmDuplicateKeyException.class);
+      Throwables.throwIfInstanceOf(e, NoSuchGroupException.class);
+      throw new IOException(e);
+    }
+  }
+
+  @VisibleForTesting
+  public UpdateResult updateGroupInNoteDb(
+      AccountGroup.UUID groupUuid, InternalGroupUpdate groupUpdate)
+      throws IOException, ConfigInvalidException, OrmDuplicateKeyException, NoSuchGroupException {
+    try (Repository allUsersRepo = repoManager.openRepository(allUsersName)) {
+      GroupConfig groupConfig = GroupConfig.loadForGroup(allUsersName, allUsersRepo, groupUuid);
+      groupConfig.setGroupUpdate(groupUpdate, auditLogFormatter);
+      if (!groupConfig.getLoadedGroup().isPresent()) {
+        throw new NoSuchGroupException(groupUuid);
+      }
+
+      InternalGroup originalGroup = groupConfig.getLoadedGroup().get();
+      GroupNameNotes groupNameNotes = null;
+      if (groupUpdate.getName().isPresent()) {
+        AccountGroup.NameKey oldName = originalGroup.getNameKey();
+        AccountGroup.NameKey newName = groupUpdate.getName().get();
+        groupNameNotes =
+            GroupNameNotes.forRename(allUsersName, allUsersRepo, groupUuid, oldName, newName);
+      }
+
+      commit(allUsersRepo, groupConfig, groupNameNotes);
+
+      InternalGroup updatedGroup =
+          groupConfig
+              .getLoadedGroup()
+              .orElseThrow(
+                  () -> new IllegalStateException("Updated group wasn't automatically loaded"));
+      return getUpdateResult(originalGroup, updatedGroup);
+    }
+  }
+
+  private static UpdateResult getUpdateResult(
+      InternalGroup originalGroup, InternalGroup updatedGroup) {
+    Set<Account.Id> addedMembers =
+        Sets.difference(updatedGroup.getMembers(), originalGroup.getMembers());
+    Set<Account.Id> deletedMembers =
+        Sets.difference(originalGroup.getMembers(), updatedGroup.getMembers());
+    Set<AccountGroup.UUID> addedSubgroups =
+        Sets.difference(updatedGroup.getSubgroups(), originalGroup.getSubgroups());
+    Set<AccountGroup.UUID> deletedSubgroups =
+        Sets.difference(originalGroup.getSubgroups(), updatedGroup.getSubgroups());
+
+    UpdateResult.Builder resultBuilder =
+        UpdateResult.builder()
+            .setGroupUuid(updatedGroup.getGroupUUID())
+            .setGroupId(updatedGroup.getId())
+            .setGroupName(updatedGroup.getNameKey())
+            .setAddedMembers(addedMembers)
+            .setDeletedMembers(deletedMembers)
+            .setAddedSubgroups(addedSubgroups)
+            .setDeletedSubgroups(deletedSubgroups);
+    if (!Objects.equals(originalGroup.getNameKey(), updatedGroup.getNameKey())) {
+      resultBuilder.setPreviousGroupName(originalGroup.getNameKey());
+    }
+    return resultBuilder.build();
+  }
+
+  private void commit(
+      Repository allUsersRepo, GroupConfig groupConfig, @Nullable GroupNameNotes groupNameNotes)
+      throws IOException {
+    BatchRefUpdate batchRefUpdate = allUsersRepo.getRefDatabase().newBatchUpdate();
+    try (MetaDataUpdate metaDataUpdate =
+        metaDataUpdateFactory.create(allUsersName, allUsersRepo, batchRefUpdate)) {
+      groupConfig.commit(metaDataUpdate);
+    }
+    if (groupNameNotes != null) {
+      // MetaDataUpdates unfortunately can't be reused. -> Create a new one.
+      try (MetaDataUpdate metaDataUpdate =
+          metaDataUpdateFactory.create(allUsersName, allUsersRepo, batchRefUpdate)) {
+        groupNameNotes.commit(metaDataUpdate);
+      }
+    }
+
+    RefUpdateUtil.executeChecked(batchRefUpdate, allUsersRepo);
+    gitRefUpdated.fire(
+        allUsersName, batchRefUpdate, currentUser != null ? currentUser.state() : null);
+  }
+
+  private void updateCachesOnGroupCreation(InternalGroup createdGroup) throws IOException {
+    // By UUID is used for the index and hence should be evicted before refreshing the index.
+    groupCache.evict(createdGroup.getGroupUUID());
+    indexer.get().index(createdGroup.getGroupUUID());
+    // These caches use the result from the index and hence must be evicted after refreshing the
+    // index.
+    groupCache.evict(createdGroup.getId());
+    groupCache.evict(createdGroup.getNameKey());
+    createdGroup.getMembers().forEach(groupIncludeCache::evictGroupsWithMember);
+    createdGroup.getSubgroups().forEach(groupIncludeCache::evictParentGroupsOf);
+  }
+
+  private void updateCachesOnGroupUpdate(UpdateResult result) throws IOException {
+    // By UUID is used for the index and hence should be evicted before refreshing the index.
+    groupCache.evict(result.getGroupUuid());
+    indexer.get().index(result.getGroupUuid());
+    // These caches use the result from the index and hence must be evicted after refreshing the
+    // index.
+    groupCache.evict(result.getGroupId());
+    groupCache.evict(result.getGroupName());
+    result.getPreviousGroupName().ifPresent(groupCache::evict);
+
+    result.getAddedMembers().forEach(groupIncludeCache::evictGroupsWithMember);
+    result.getDeletedMembers().forEach(groupIncludeCache::evictGroupsWithMember);
+    result.getAddedSubgroups().forEach(groupIncludeCache::evictParentGroupsOf);
+    result.getDeletedSubgroups().forEach(groupIncludeCache::evictParentGroupsOf);
+  }
+
+  private void updateNameInProjectConfigsIfNecessary(UpdateResult result) {
+    if (result.getPreviousGroupName().isPresent()) {
+      AccountGroup.NameKey previousName = result.getPreviousGroupName().get();
+
+      @SuppressWarnings("unused")
+      Future<?> possiblyIgnoredError =
+          renameGroupOpFactory
+              .create(
+                  authorIdent,
+                  result.getGroupUuid(),
+                  previousName.get(),
+                  result.getGroupName().get())
+              .start(0, TimeUnit.MILLISECONDS);
+    }
+  }
+
+  private void dispatchAuditEventsOnGroupCreation(InternalGroup createdGroup) {
+    if (currentUser == null) {
+      return;
+    }
+
+    if (!createdGroup.getMembers().isEmpty()) {
+      groupAuditService.dispatchAddMembers(
+          currentUser.getAccountId(),
+          createdGroup.getGroupUUID(),
+          createdGroup.getMembers(),
+          createdGroup.getCreatedOn());
+    }
+    if (!createdGroup.getSubgroups().isEmpty()) {
+      groupAuditService.dispatchAddSubgroups(
+          currentUser.getAccountId(),
+          createdGroup.getGroupUUID(),
+          createdGroup.getSubgroups(),
+          createdGroup.getCreatedOn());
+    }
+  }
+
+  private void dispatchAuditEventsOnGroupUpdate(UpdateResult result, Timestamp updatedOn) {
+    if (currentUser == null) {
+      return;
+    }
+
+    if (!result.getAddedMembers().isEmpty()) {
+      groupAuditService.dispatchAddMembers(
+          currentUser.getAccountId(), result.getGroupUuid(), result.getAddedMembers(), updatedOn);
+    }
+    if (!result.getDeletedMembers().isEmpty()) {
+      groupAuditService.dispatchDeleteMembers(
+          currentUser.getAccountId(), result.getGroupUuid(), result.getDeletedMembers(), updatedOn);
+    }
+    if (!result.getAddedSubgroups().isEmpty()) {
+      groupAuditService.dispatchAddSubgroups(
+          currentUser.getAccountId(), result.getGroupUuid(), result.getAddedSubgroups(), updatedOn);
+    }
+    if (!result.getDeletedSubgroups().isEmpty()) {
+      groupAuditService.dispatchDeleteSubgroups(
+          currentUser.getAccountId(),
+          result.getGroupUuid(),
+          result.getDeletedSubgroups(),
+          updatedOn);
+    }
+  }
+
+  @FunctionalInterface
+  private interface MetaDataUpdateFactory {
+    MetaDataUpdate create(
+        Project.NameKey projectName, Repository repository, BatchRefUpdate batchRefUpdate)
+        throws IOException;
+  }
+
+  @AutoValue
+  abstract static class UpdateResult {
+    abstract AccountGroup.UUID getGroupUuid();
+
+    abstract AccountGroup.Id getGroupId();
+
+    abstract AccountGroup.NameKey getGroupName();
+
+    abstract Optional<AccountGroup.NameKey> getPreviousGroupName();
+
+    abstract ImmutableSet<Account.Id> getAddedMembers();
+
+    abstract ImmutableSet<Account.Id> getDeletedMembers();
+
+    abstract ImmutableSet<AccountGroup.UUID> getAddedSubgroups();
+
+    abstract ImmutableSet<AccountGroup.UUID> getDeletedSubgroups();
+
+    static Builder builder() {
+      return new AutoValue_GroupsUpdate_UpdateResult.Builder();
+    }
+
+    @AutoValue.Builder
+    abstract static class Builder {
+      abstract Builder setGroupUuid(AccountGroup.UUID groupUuid);
+
+      abstract Builder setGroupId(AccountGroup.Id groupId);
+
+      abstract Builder setGroupName(AccountGroup.NameKey name);
+
+      abstract Builder setPreviousGroupName(AccountGroup.NameKey previousName);
+
+      abstract Builder setAddedMembers(Set<Account.Id> addedMembers);
+
+      abstract Builder setDeletedMembers(Set<Account.Id> deletedMembers);
+
+      abstract Builder setAddedSubgroups(Set<AccountGroup.UUID> addedSubgroups);
+
+      abstract Builder setDeletedSubgroups(Set<AccountGroup.UUID> deletedSubgroups);
+
+      abstract UpdateResult build();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/group/db/InternalGroupCreation.java b/java/com/google/gerrit/server/group/db/InternalGroupCreation.java
new file mode 100644
index 0000000..bb21d62
--- /dev/null
+++ b/java/com/google/gerrit/server/group/db/InternalGroupCreation.java
@@ -0,0 +1,55 @@
+// Copyright (C) 2017 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.google.gerrit.server.group.db;
+
+import com.google.auto.value.AutoValue;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+
+/**
+ * Definition of all properties necessary for a group creation.
+ *
+ * <p>An instance of {@code InternalGroupCreation} is a blueprint for a group which should be
+ * created.
+ */
+@AutoValue
+public abstract class InternalGroupCreation {
+
+  /** Defines the numeric ID the group should have. */
+  public abstract AccountGroup.Id getId();
+
+  /** Defines the name the group should have. */
+  public abstract AccountGroup.NameKey getNameKey();
+
+  /** Defines the UUID the group should have. */
+  public abstract AccountGroup.UUID getGroupUUID();
+
+  public static Builder builder() {
+    return new AutoValue_InternalGroupCreation.Builder();
+  }
+
+  @AutoValue.Builder
+  public abstract static class Builder {
+    /** @see #getId() */
+    public abstract InternalGroupCreation.Builder setId(AccountGroup.Id id);
+
+    /** @see #getNameKey() */
+    public abstract InternalGroupCreation.Builder setNameKey(AccountGroup.NameKey name);
+
+    /** @see #getGroupUUID() */
+    public abstract InternalGroupCreation.Builder setGroupUUID(AccountGroup.UUID groupUuid);
+
+    public abstract InternalGroupCreation build();
+  }
+}
diff --git a/java/com/google/gerrit/server/group/db/InternalGroupUpdate.java b/java/com/google/gerrit/server/group/db/InternalGroupUpdate.java
new file mode 100644
index 0000000..bff2952
--- /dev/null
+++ b/java/com/google/gerrit/server/group/db/InternalGroupUpdate.java
@@ -0,0 +1,168 @@
+// Copyright (C) 2017 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.google.gerrit.server.group.db;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import java.sql.Timestamp;
+import java.util.Optional;
+import java.util.Set;
+
+/**
+ * Definition of an update to a group.
+ *
+ * <p>An {@code InternalGroupUpdate} only specifies the modifications which should be applied to a
+ * group. Each of the modifications and hence each call on {@link InternalGroupUpdate.Builder} is
+ * optional.
+ */
+@AutoValue
+public abstract class InternalGroupUpdate {
+
+  /** Representation of a member modification as defined by {@link #apply(ImmutableSet)}. */
+  @FunctionalInterface
+  public interface MemberModification {
+
+    /**
+     * Applies the modification to the given members.
+     *
+     * @param originalMembers current members of the group. If used for a group creation, this set
+     *     is empty.
+     * @return the desired resulting members (not the diff of the members!)
+     */
+    Set<Account.Id> apply(ImmutableSet<Account.Id> originalMembers);
+  }
+
+  @FunctionalInterface
+  public interface SubgroupModification {
+    /**
+     * Applies the modification to the given subgroups.
+     *
+     * @param originalSubgroups current subgroups of the group. If used for a group creation, this
+     *     set is empty.
+     * @return the desired resulting subgroups (not the diff of the subgroups!)
+     */
+    Set<AccountGroup.UUID> apply(ImmutableSet<AccountGroup.UUID> originalSubgroups);
+  }
+
+  /** Defines the new name of the group. If not specified, the name remains unchanged. */
+  public abstract Optional<AccountGroup.NameKey> getName();
+
+  /**
+   * Defines the new description of the group. If not specified, the description remains unchanged.
+   *
+   * <p><strong>Note: </strong>Passing the empty string unsets the description.
+   */
+  public abstract Optional<String> getDescription();
+
+  /** Defines the new owner of the group. If not specified, the owner remains unchanged. */
+  public abstract Optional<AccountGroup.UUID> getOwnerGroupUUID();
+
+  /**
+   * Defines the new state of the 'visibleToAll' flag of the group. If not specified, the flag
+   * remains unchanged.
+   */
+  public abstract Optional<Boolean> getVisibleToAll();
+
+  /**
+   * Defines how the members of the group should be modified. By default (that is if nothing is
+   * specified), the members remain unchanged.
+   *
+   * @return a {@link MemberModification} which gets the current members of the group as input and
+   *     outputs the desired resulting members
+   */
+  public abstract MemberModification getMemberModification();
+
+  /**
+   * Defines how the subgroups of the group should be modified. By default (that is if nothing is
+   * specified), the subgroups remain unchanged.
+   *
+   * @return a {@link SubgroupModification} which gets the current subgroups of the group as input
+   *     and outputs the desired resulting subgroups
+   */
+  public abstract SubgroupModification getSubgroupModification();
+
+  /**
+   * Defines the {@code Timestamp} to be used for the NoteDb commits of the update. If not
+   * specified, the current {@code Timestamp} when creating the commit will be used.
+   *
+   * <p>If this {@code InternalGroupUpdate} is passed next to an {@link InternalGroupCreation}
+   * during a group creation, this {@code Timestamp} is used for the NoteDb commits of the new
+   * group. Hence, the {@link com.google.gerrit.server.group.InternalGroup#getCreatedOn()
+   * InternalGroup#getCreatedOn()} field will match this {@code Timestamp}.
+   *
+   * <p><strong>Note: </strong>{@code Timestamp}s of NoteDb commits for groups are used for events
+   * in the audit log. For this reason, specifying this field will have an effect on the resulting
+   * audit log.
+   */
+  public abstract Optional<Timestamp> getUpdatedOn();
+
+  public abstract Builder toBuilder();
+
+  public static Builder builder() {
+    return new AutoValue_InternalGroupUpdate.Builder()
+        .setMemberModification(in -> in)
+        .setSubgroupModification(in -> in);
+  }
+
+  /** A builder for an {@link InternalGroupUpdate}. */
+  @AutoValue.Builder
+  public abstract static class Builder {
+
+    /** @see #getName() */
+    public abstract Builder setName(AccountGroup.NameKey name);
+
+    /** @see #getDescription() */
+    public abstract Builder setDescription(String description);
+
+    /** @see #getOwnerGroupUUID() */
+    public abstract Builder setOwnerGroupUUID(AccountGroup.UUID ownerGroupUUID);
+
+    /** @see #getVisibleToAll() */
+    public abstract Builder setVisibleToAll(boolean visibleToAll);
+
+    /** @see #getMemberModification() */
+    public abstract Builder setMemberModification(MemberModification memberModification);
+
+    /**
+     * Returns the currently defined {@link MemberModification} for the prospective {@link
+     * InternalGroupUpdate}.
+     *
+     * <p>This modification can be tweaked further and passed to {@link
+     * #setMemberModification(InternalGroupUpdate.MemberModification)} in order to combine multiple
+     * member additions, deletions, or other modifications into one update.
+     */
+    public abstract MemberModification getMemberModification();
+
+    /** @see #getSubgroupModification() */
+    public abstract Builder setSubgroupModification(SubgroupModification subgroupModification);
+
+    /**
+     * Returns the currently defined {@link SubgroupModification} for the prospective {@link
+     * InternalGroupUpdate}.
+     *
+     * <p>This modification can be tweaked further and passed to {@link
+     * #setSubgroupModification(InternalGroupUpdate.SubgroupModification)} in order to combine
+     * multiple subgroup additions, deletions, or other modifications into one update.
+     */
+    public abstract SubgroupModification getSubgroupModification();
+
+    /** @see #getUpdatedOn() */
+    public abstract Builder setUpdatedOn(Timestamp timestamp);
+
+    public abstract InternalGroupUpdate build();
+  }
+}
diff --git a/java/com/google/gerrit/server/group/db/RenameGroupOp.java b/java/com/google/gerrit/server/group/db/RenameGroupOp.java
new file mode 100644
index 0000000..eada57d
--- /dev/null
+++ b/java/com/google/gerrit/server/group/db/RenameGroupOp.java
@@ -0,0 +1,155 @@
+// Copyright (C) 2011 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.google.gerrit.server.group.db;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.git.DefaultQueueOp;
+import com.google.gerrit.server.git.WorkQueue;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.PersonIdent;
+
+class RenameGroupOp extends DefaultQueueOp {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  interface Factory {
+    RenameGroupOp create(
+        @Assisted("author") PersonIdent author,
+        @Assisted AccountGroup.UUID uuid,
+        @Assisted("oldName") String oldName,
+        @Assisted("newName") String newName);
+  }
+
+  private static final int MAX_TRIES = 10;
+
+  private final ProjectCache projectCache;
+  private final MetaDataUpdate.Server metaDataUpdateFactory;
+
+  private final PersonIdent author;
+  private final AccountGroup.UUID uuid;
+  private final String oldName;
+  private final String newName;
+  private final List<Project.NameKey> retryOn;
+
+  private boolean tryingAgain;
+
+  @Inject
+  public RenameGroupOp(
+      WorkQueue workQueue,
+      ProjectCache projectCache,
+      MetaDataUpdate.Server metaDataUpdateFactory,
+      @Assisted("author") PersonIdent author,
+      @Assisted AccountGroup.UUID uuid,
+      @Assisted("oldName") String oldName,
+      @Assisted("newName") String newName) {
+    super(workQueue);
+    this.projectCache = projectCache;
+    this.metaDataUpdateFactory = metaDataUpdateFactory;
+
+    this.author = author;
+    this.uuid = uuid;
+    this.oldName = oldName;
+    this.newName = newName;
+    this.retryOn = new ArrayList<>();
+  }
+
+  @Override
+  public void run() {
+    Iterable<Project.NameKey> names = tryingAgain ? retryOn : projectCache.all();
+    for (Project.NameKey projectName : names) {
+      ProjectConfig config = projectCache.get(projectName).getConfig();
+      GroupReference ref = config.getGroup(uuid);
+      if (ref == null || newName.equals(ref.getName())) {
+        continue;
+      }
+
+      try (MetaDataUpdate md = metaDataUpdateFactory.create(projectName)) {
+        rename(md);
+      } catch (RepositoryNotFoundException noProject) {
+        continue;
+      } catch (ConfigInvalidException | IOException err) {
+        logger.atSevere().withCause(err).log("Cannot rename group %s in %s", oldName, projectName);
+      }
+    }
+
+    // If one or more projects did not update, wait 5 minutes and give it
+    // another attempt. If it doesn't update after that, give up.
+    if (!retryOn.isEmpty() && !tryingAgain) {
+      tryingAgain = true;
+      @SuppressWarnings("unused")
+      Future<?> possiblyIgnoredError = start(5, TimeUnit.MINUTES);
+    }
+  }
+
+  private void rename(MetaDataUpdate md) throws IOException, ConfigInvalidException {
+    boolean success = false;
+    for (int attempts = 0; !success && attempts < MAX_TRIES; attempts++) {
+      ProjectConfig config = ProjectConfig.read(md);
+
+      // The group isn't referenced, or its name has been fixed already.
+      //
+      GroupReference ref = config.getGroup(uuid);
+      if (ref == null || newName.equals(ref.getName())) {
+        projectCache.evict(config.getProject());
+        return;
+      }
+
+      ref.setName(newName);
+      md.getCommitBuilder().setAuthor(author);
+      md.setMessage("Rename group " + oldName + " to " + newName + "\n");
+      try {
+        config.commit(md);
+        projectCache.evict(config.getProject());
+        success = true;
+      } catch (IOException e) {
+        logger.atSevere().withCause(e).log(
+            "Could not commit rename of group %s to %s in %s",
+            oldName, newName, md.getProjectName().get());
+        try {
+          Thread.sleep(25 /* milliseconds */);
+        } catch (InterruptedException wakeUp) {
+          continue;
+        }
+      }
+    }
+
+    if (!success) {
+      if (tryingAgain) {
+        logger.atWarning().log(
+            "Could not rename group %s to %s in %s", oldName, newName, md.getProjectName().get());
+      } else {
+        retryOn.add(md.getProjectName());
+      }
+    }
+  }
+
+  @Override
+  public String toString() {
+    return "Rename Group " + oldName;
+  }
+}
diff --git a/java/com/google/gerrit/server/group/db/testing/BUILD b/java/com/google/gerrit/server/group/db/testing/BUILD
new file mode 100644
index 0000000..c13abba
--- /dev/null
+++ b/java/com/google/gerrit/server/group/db/testing/BUILD
@@ -0,0 +1,16 @@
+package(default_visibility = ["//visibility:public"])
+
+java_library(
+    name = "testing",
+    testonly = True,
+    srcs = glob(["*.java"]),
+    deps = [
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//lib:guava",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/jgit/org.eclipse.jgit.junit:junit",
+    ],
+)
diff --git a/java/com/google/gerrit/server/group/db/testing/GroupTestUtil.java b/java/com/google/gerrit/server/group/db/testing/GroupTestUtil.java
new file mode 100644
index 0000000..5a0d28c
--- /dev/null
+++ b/java/com/google/gerrit/server/group/db/testing/GroupTestUtil.java
@@ -0,0 +1,71 @@
+// Copyright (C) 2017 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.google.gerrit.server.group.db.testing;
+
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+/** Test utilities for low-level NoteDb groups. */
+public class GroupTestUtil {
+  public static void updateGroupFile(
+      GitRepositoryManager repoManager,
+      AllUsersName allUsersName,
+      PersonIdent serverIdent,
+      String refName,
+      String fileName,
+      String content)
+      throws Exception {
+    try (Repository repo = repoManager.openRepository(allUsersName)) {
+      updateGroupFile(repo, serverIdent, refName, fileName, content);
+    }
+  }
+
+  public static void updateGroupFile(
+      Repository allUsersRepo,
+      PersonIdent serverIdent,
+      String refName,
+      String fileName,
+      String contents)
+      throws Exception {
+    try (RevWalk rw = new RevWalk(allUsersRepo)) {
+      TestRepository<Repository> testRepository = new TestRepository<>(allUsersRepo, rw);
+      TestRepository<Repository>.CommitBuilder builder =
+          testRepository
+              .branch(refName)
+              .commit()
+              .add(fileName, contents)
+              .message("update group file")
+              .author(serverIdent)
+              .committer(serverIdent);
+
+      Ref ref = allUsersRepo.exactRef(refName);
+      if (ref != null) {
+        RevCommit c = rw.parseCommit(ref.getObjectId());
+        if (c != null) {
+          builder.parent(c);
+        }
+      }
+      builder.create();
+    }
+  }
+
+  private GroupTestUtil() {}
+}
diff --git a/java/com/google/gerrit/server/group/testing/BUILD b/java/com/google/gerrit/server/group/testing/BUILD
new file mode 100644
index 0000000..3ef712c
--- /dev/null
+++ b/java/com/google/gerrit/server/group/testing/BUILD
@@ -0,0 +1,15 @@
+package(default_visibility = ["//visibility:public"])
+
+java_library(
+    name = "testing",
+    testonly = True,
+    srcs = glob(["*.java"]),
+    deps = [
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//lib:guava",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/truth",
+    ],
+)
diff --git a/java/com/google/gerrit/server/group/testing/InternalGroupSubject.java b/java/com/google/gerrit/server/group/testing/InternalGroupSubject.java
new file mode 100644
index 0000000..f0ab638
--- /dev/null
+++ b/java/com/google/gerrit/server/group/testing/InternalGroupSubject.java
@@ -0,0 +1,107 @@
+// Copyright (C) 2017 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.google.gerrit.server.group.testing;
+
+import static com.google.common.truth.Truth.assertAbout;
+
+import com.google.common.truth.BooleanSubject;
+import com.google.common.truth.ComparableSubject;
+import com.google.common.truth.DefaultSubject;
+import com.google.common.truth.FailureMetadata;
+import com.google.common.truth.IterableSubject;
+import com.google.common.truth.StringSubject;
+import com.google.common.truth.Subject;
+import com.google.common.truth.Truth;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.group.InternalGroup;
+import java.sql.Timestamp;
+import org.eclipse.jgit.lib.ObjectId;
+
+public class InternalGroupSubject extends Subject<InternalGroupSubject, InternalGroup> {
+
+  public static InternalGroupSubject assertThat(InternalGroup group) {
+    return assertAbout(InternalGroupSubject::new).that(group);
+  }
+
+  private InternalGroupSubject(FailureMetadata metadata, InternalGroup actual) {
+    super(metadata, actual);
+  }
+
+  public ComparableSubject<?, AccountGroup.UUID> groupUuid() {
+    isNotNull();
+    InternalGroup group = actual();
+    return Truth.assertThat(group.getGroupUUID()).named("groupUuid");
+  }
+
+  public ComparableSubject<?, AccountGroup.NameKey> nameKey() {
+    isNotNull();
+    InternalGroup group = actual();
+    return Truth.assertThat(group.getNameKey()).named("nameKey");
+  }
+
+  public StringSubject name() {
+    isNotNull();
+    InternalGroup group = actual();
+    return Truth.assertThat(group.getName()).named("name");
+  }
+
+  public DefaultSubject id() {
+    isNotNull();
+    InternalGroup group = actual();
+    return Truth.assertThat(group.getId()).named("id");
+  }
+
+  public StringSubject description() {
+    isNotNull();
+    InternalGroup group = actual();
+    return Truth.assertThat(group.getDescription()).named("description");
+  }
+
+  public ComparableSubject<?, AccountGroup.UUID> ownerGroupUuid() {
+    isNotNull();
+    InternalGroup group = actual();
+    return Truth.assertThat(group.getOwnerGroupUUID()).named("ownerGroupUuid");
+  }
+
+  public BooleanSubject visibleToAll() {
+    isNotNull();
+    InternalGroup group = actual();
+    return Truth.assertThat(group.isVisibleToAll()).named("visibleToAll");
+  }
+
+  public ComparableSubject<?, Timestamp> createdOn() {
+    isNotNull();
+    InternalGroup group = actual();
+    return Truth.assertThat(group.getCreatedOn()).named("createdOn");
+  }
+
+  public IterableSubject members() {
+    isNotNull();
+    InternalGroup group = actual();
+    return Truth.assertThat(group.getMembers()).named("members");
+  }
+
+  public IterableSubject subgroups() {
+    isNotNull();
+    InternalGroup group = actual();
+    return Truth.assertThat(group.getSubgroups()).named("subgroups");
+  }
+
+  public ComparableSubject<?, ObjectId> refState() {
+    isNotNull();
+    InternalGroup group = actual();
+    return Truth.assertThat(group.getRefState()).named("refState");
+  }
+}
diff --git a/java/com/google/gerrit/server/group/testing/TestGroupBackend.java b/java/com/google/gerrit/server/group/testing/TestGroupBackend.java
new file mode 100644
index 0000000..550b15c
--- /dev/null
+++ b/java/com/google/gerrit/server/group/testing/TestGroupBackend.java
@@ -0,0 +1,123 @@
+// 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.
+
+package com.google.gerrit.server.group.testing;
+
+import static com.google.common.base.Preconditions.checkState;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.account.GroupMembership;
+import com.google.gerrit.server.project.ProjectState;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+/** Implementation of GroupBackend for tests. */
+public class TestGroupBackend implements GroupBackend {
+  private static final String PREFIX = "testbackend:";
+
+  private final Map<AccountGroup.UUID, GroupDescription.Basic> groups = new HashMap<>();
+
+  /**
+   * Create a group by name.
+   *
+   * @param name the group name, optionally prefixed by "testbackend:".
+   * @return the created group
+   */
+  public GroupDescription.Basic create(String name) {
+    requireNonNull(name);
+    return create(new AccountGroup.UUID(name.startsWith(PREFIX) ? name : PREFIX + name));
+  }
+
+  /**
+   * Create a group by UUID.
+   *
+   * @param uuid the group UUID to add.
+   * @return the created group
+   */
+  public GroupDescription.Basic create(AccountGroup.UUID uuid) {
+    checkState(uuid.get().startsWith(PREFIX), "test group UUID must have prefix '" + PREFIX + "'");
+    if (groups.containsKey(uuid)) {
+      return groups.get(uuid);
+    }
+    GroupDescription.Basic group =
+        new GroupDescription.Basic() {
+          @Override
+          public AccountGroup.UUID getGroupUUID() {
+            return uuid;
+          }
+
+          @Override
+          public String getName() {
+            return uuid.get().substring(PREFIX.length());
+          }
+
+          @Override
+          public String getEmailAddress() {
+            return null;
+          }
+
+          @Override
+          public String getUrl() {
+            return null;
+          }
+        };
+    groups.put(uuid, group);
+    return group;
+  }
+
+  /**
+   * Remove a group. No-op if the group does not exist.
+   *
+   * @param uuid the group.
+   */
+  public void remove(AccountGroup.UUID uuid) {
+    groups.remove(uuid);
+  }
+
+  @Override
+  public boolean handles(AccountGroup.UUID uuid) {
+    if (uuid != null) {
+      String id = uuid.get();
+      return id != null && id.startsWith(PREFIX);
+    }
+    return false;
+  }
+
+  @Override
+  public GroupDescription.Basic get(AccountGroup.UUID uuid) {
+    return uuid == null ? null : groups.get(uuid);
+  }
+
+  @Override
+  public Collection<GroupReference> suggest(String name, ProjectState project) {
+    return ImmutableList.of();
+  }
+
+  @Override
+  public GroupMembership membershipsOf(IdentifiedUser user) {
+    return GroupMembership.EMPTY;
+  }
+
+  @Override
+  public boolean isVisibleToAll(AccountGroup.UUID uuid) {
+    return false;
+  }
+}
diff --git a/java/com/google/gerrit/server/index/AbstractIndexModule.java b/java/com/google/gerrit/server/index/AbstractIndexModule.java
new file mode 100644
index 0000000..352ea4b
--- /dev/null
+++ b/java/com/google/gerrit/server/index/AbstractIndexModule.java
@@ -0,0 +1,110 @@
+// 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.
+
+package com.google.gerrit.server.index;
+
+import com.google.gerrit.index.IndexConfig;
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.index.project.ProjectIndex;
+import com.google.gerrit.lifecycle.LifecycleModule;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.index.account.AccountIndex;
+import com.google.gerrit.server.index.change.ChangeIndex;
+import com.google.gerrit.server.index.group.GroupIndex;
+import com.google.inject.AbstractModule;
+import com.google.inject.Provides;
+import com.google.inject.Singleton;
+import com.google.inject.assistedinject.FactoryModuleBuilder;
+import java.util.Map;
+import org.eclipse.jgit.lib.Config;
+
+public abstract class AbstractIndexModule extends AbstractModule {
+
+  private final int threads;
+  private final Map<String, Integer> singleVersions;
+  private final boolean slave;
+
+  protected AbstractIndexModule(Map<String, Integer> singleVersions, int threads, boolean slave) {
+    this.singleVersions = singleVersions;
+    this.threads = threads;
+    this.slave = slave;
+  }
+
+  @Override
+  protected void configure() {
+    if (slave) {
+      bind(AccountIndex.Factory.class).toInstance(AbstractIndexModule::createDummyIndexFactory);
+      bind(ChangeIndex.Factory.class).toInstance(AbstractIndexModule::createDummyIndexFactory);
+      bind(ProjectIndex.Factory.class).toInstance(AbstractIndexModule::createDummyIndexFactory);
+    } else {
+      install(
+          new FactoryModuleBuilder()
+              .implement(AccountIndex.class, getAccountIndex())
+              .build(AccountIndex.Factory.class));
+      install(
+          new FactoryModuleBuilder()
+              .implement(ChangeIndex.class, getChangeIndex())
+              .build(ChangeIndex.Factory.class));
+      install(
+          new FactoryModuleBuilder()
+              .implement(ProjectIndex.class, getProjectIndex())
+              .build(ProjectIndex.Factory.class));
+    }
+    install(
+        new FactoryModuleBuilder()
+            .implement(GroupIndex.class, getGroupIndex())
+            .build(GroupIndex.Factory.class));
+
+    install(new IndexModule(threads, slave));
+    if (singleVersions == null) {
+      install(new MultiVersionModule());
+    } else {
+      install(new SingleVersionModule(singleVersions));
+    }
+  }
+
+  @SuppressWarnings("unused")
+  private static <T> T createDummyIndexFactory(Schema<?> schema) {
+    throw new UnsupportedOperationException();
+  }
+
+  protected abstract Class<? extends AccountIndex> getAccountIndex();
+
+  protected abstract Class<? extends ChangeIndex> getChangeIndex();
+
+  protected abstract Class<? extends GroupIndex> getGroupIndex();
+
+  protected abstract Class<? extends ProjectIndex> getProjectIndex();
+
+  protected abstract Class<? extends VersionManager> getVersionManager();
+
+  @Provides
+  @Singleton
+  IndexConfig provideIndexConfig(@GerritServerConfig Config cfg) {
+    return getIndexConfig(cfg);
+  }
+
+  protected IndexConfig getIndexConfig(@GerritServerConfig Config cfg) {
+    return IndexConfig.fromConfig(cfg).separateChangeSubIndexes(true).build();
+  }
+
+  private class MultiVersionModule extends LifecycleModule {
+    @Override
+    public void configure() {
+      Class<? extends VersionManager> versionManagerClass = getVersionManager();
+      bind(VersionManager.class).to(versionManagerClass);
+      listener().to(versionManagerClass);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/index/DummyIndexModule.java b/java/com/google/gerrit/server/index/DummyIndexModule.java
new file mode 100644
index 0000000..8b450bc
--- /dev/null
+++ b/java/com/google/gerrit/server/index/DummyIndexModule.java
@@ -0,0 +1,70 @@
+// Copyright (C) 2014 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.google.gerrit.server.index;
+
+import com.google.gerrit.index.Index;
+import com.google.gerrit.index.IndexConfig;
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.index.project.ProjectData;
+import com.google.gerrit.index.project.ProjectIndex;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.index.account.AccountIndex;
+import com.google.gerrit.server.index.change.ChangeIndex;
+import com.google.gerrit.server.index.change.DummyChangeIndex;
+import com.google.gerrit.server.index.group.GroupIndex;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.inject.AbstractModule;
+
+public class DummyIndexModule extends AbstractModule {
+  private static class DummyChangeIndexFactory implements ChangeIndex.Factory {
+    @Override
+    public ChangeIndex create(Schema<ChangeData> schema) {
+      throw new UnsupportedOperationException();
+    }
+  }
+
+  private static class DummyAccountIndexFactory implements AccountIndex.Factory {
+    @Override
+    public AccountIndex create(Schema<AccountState> schema) {
+      throw new UnsupportedOperationException();
+    }
+  }
+
+  private static class DummyGroupIndexFactory implements GroupIndex.Factory {
+    @Override
+    public GroupIndex create(Schema<InternalGroup> schema) {
+      throw new UnsupportedOperationException();
+    }
+  }
+
+  private static class DummyProjectIndexFactory implements ProjectIndex.Factory {
+    @Override
+    public ProjectIndex create(Schema<ProjectData> schema) {
+      throw new UnsupportedOperationException();
+    }
+  }
+
+  @Override
+  protected void configure() {
+    install(new IndexModule(1, true));
+    bind(IndexConfig.class).toInstance(IndexConfig.createDefault());
+    bind(Index.class).toInstance(new DummyChangeIndex());
+    bind(AccountIndex.Factory.class).toInstance(new DummyAccountIndexFactory());
+    bind(ChangeIndex.Factory.class).toInstance(new DummyChangeIndexFactory());
+    bind(GroupIndex.Factory.class).toInstance(new DummyGroupIndexFactory());
+    bind(ProjectIndex.Factory.class).toInstance(new DummyProjectIndexFactory());
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/GerritIndexStatus.java b/java/com/google/gerrit/server/index/GerritIndexStatus.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/index/GerritIndexStatus.java
rename to java/com/google/gerrit/server/index/GerritIndexStatus.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexExecutor.java b/java/com/google/gerrit/server/index/IndexExecutor.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/index/IndexExecutor.java
rename to java/com/google/gerrit/server/index/IndexExecutor.java
diff --git a/java/com/google/gerrit/server/index/IndexModule.java b/java/com/google/gerrit/server/index/IndexModule.java
new file mode 100644
index 0000000..3c9538c
--- /dev/null
+++ b/java/com/google/gerrit/server/index/IndexModule.java
@@ -0,0 +1,265 @@
+// Copyright (C) 2013 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.google.gerrit.server.index;
+
+import static com.google.gerrit.server.git.QueueProvider.QueueType.BATCH;
+import static com.google.gerrit.server.git.QueueProvider.QueueType.INTERACTIVE;
+
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableCollection;
+import com.google.common.collect.ImmutableList;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.common.util.concurrent.MoreExecutors;
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.index.IndexDefinition;
+import com.google.gerrit.index.SchemaDefinitions;
+import com.google.gerrit.index.project.ProjectIndexCollection;
+import com.google.gerrit.index.project.ProjectIndexRewriter;
+import com.google.gerrit.index.project.ProjectIndexer;
+import com.google.gerrit.index.project.ProjectSchemaDefinitions;
+import com.google.gerrit.lifecycle.LifecycleModule;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.git.WorkQueue;
+import com.google.gerrit.server.index.account.AccountIndexCollection;
+import com.google.gerrit.server.index.account.AccountIndexDefinition;
+import com.google.gerrit.server.index.account.AccountIndexRewriter;
+import com.google.gerrit.server.index.account.AccountIndexer;
+import com.google.gerrit.server.index.account.AccountIndexerImpl;
+import com.google.gerrit.server.index.account.AccountSchemaDefinitions;
+import com.google.gerrit.server.index.change.ChangeIndexCollection;
+import com.google.gerrit.server.index.change.ChangeIndexDefinition;
+import com.google.gerrit.server.index.change.ChangeIndexRewriter;
+import com.google.gerrit.server.index.change.ChangeIndexer;
+import com.google.gerrit.server.index.change.ChangeSchemaDefinitions;
+import com.google.gerrit.server.index.group.GroupIndexCollection;
+import com.google.gerrit.server.index.group.GroupIndexDefinition;
+import com.google.gerrit.server.index.group.GroupIndexRewriter;
+import com.google.gerrit.server.index.group.GroupIndexer;
+import com.google.gerrit.server.index.group.GroupIndexerImpl;
+import com.google.gerrit.server.index.group.GroupSchemaDefinitions;
+import com.google.gerrit.server.index.project.ProjectIndexDefinition;
+import com.google.gerrit.server.index.project.ProjectIndexerImpl;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import com.google.inject.Provides;
+import com.google.inject.ProvisionException;
+import com.google.inject.Singleton;
+import java.util.Collection;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.lib.Config;
+
+/**
+ * Module for non-indexer-specific secondary index setup.
+ *
+ * <p>This module should not be used directly except by specific secondary indexer implementations
+ * (e.g. Lucene).
+ */
+public class IndexModule extends LifecycleModule {
+  public enum IndexType {
+    LUCENE,
+    ELASTICSEARCH
+  }
+
+  public static final ImmutableCollection<SchemaDefinitions<?>> ALL_SCHEMA_DEFS =
+      ImmutableList.<SchemaDefinitions<?>>of(
+          AccountSchemaDefinitions.INSTANCE,
+          ChangeSchemaDefinitions.INSTANCE,
+          GroupSchemaDefinitions.INSTANCE,
+          ProjectSchemaDefinitions.INSTANCE);
+
+  /** Type of secondary index. */
+  public static IndexType getIndexType(Injector injector) {
+    Config cfg = injector.getInstance(Key.get(Config.class, GerritServerConfig.class));
+    return cfg.getEnum("index", null, "type", IndexType.LUCENE);
+  }
+
+  private final int threads;
+  private final ListeningExecutorService interactiveExecutor;
+  private final ListeningExecutorService batchExecutor;
+  private final boolean closeExecutorsOnShutdown;
+  private final boolean slave;
+
+  public IndexModule(int threads, boolean slave) {
+    this.threads = threads;
+    this.slave = slave;
+    this.interactiveExecutor = null;
+    this.batchExecutor = null;
+    this.closeExecutorsOnShutdown = true;
+  }
+
+  public IndexModule(
+      ListeningExecutorService interactiveExecutor, ListeningExecutorService batchExecutor) {
+    this.threads = 0;
+    this.interactiveExecutor = interactiveExecutor;
+    this.batchExecutor = batchExecutor;
+    this.closeExecutorsOnShutdown = false;
+    slave = false;
+  }
+
+  @Override
+  protected void configure() {
+
+    bind(AccountIndexRewriter.class);
+    bind(AccountIndexCollection.class);
+    listener().to(AccountIndexCollection.class);
+    factory(AccountIndexerImpl.Factory.class);
+
+    bind(ChangeIndexRewriter.class);
+    bind(ChangeIndexCollection.class);
+    listener().to(ChangeIndexCollection.class);
+    factory(ChangeIndexer.Factory.class);
+
+    bind(GroupIndexRewriter.class);
+    bind(GroupIndexCollection.class);
+    listener().to(GroupIndexCollection.class);
+    factory(GroupIndexerImpl.Factory.class);
+
+    bind(ProjectIndexRewriter.class);
+    bind(ProjectIndexCollection.class);
+    listener().to(ProjectIndexCollection.class);
+    factory(ProjectIndexerImpl.Factory.class);
+
+    if (closeExecutorsOnShutdown) {
+      // The executors must be shutdown _before_ closing the indexes.
+      // On Gerrit start the LifecycleListeners are invoked in the order in which they are
+      // registered, but on shutdown of Gerrit the order is reversed. This means the
+      // LifecycleListener to shutdown the executors must be registered _after_ the
+      // LifecycleListeners that close the indexes. The closing of the indexes is done by
+      // *IndexCollection which have been registered as LifecycleListener above. The
+      // registration of the ShutdownIndexExecutors LifecycleListener must happen afterwards.
+      listener().to(ShutdownIndexExecutors.class);
+    }
+
+    DynamicSet.setOf(binder(), OnlineUpgradeListener.class);
+  }
+
+  @Provides
+  Collection<IndexDefinition<?, ?, ?>> getIndexDefinitions(
+      AccountIndexDefinition accounts,
+      ChangeIndexDefinition changes,
+      GroupIndexDefinition groups,
+      ProjectIndexDefinition projects) {
+    if (slave) {
+      // In slave mode, we only have the group index.
+      return ImmutableList.of(groups);
+    }
+
+    Collection<IndexDefinition<?, ?, ?>> result =
+        ImmutableList.<IndexDefinition<?, ?, ?>>of(accounts, groups, changes, projects);
+    Set<String> expected =
+        FluentIterable.from(ALL_SCHEMA_DEFS).transform(SchemaDefinitions::getName).toSet();
+    Set<String> actual = FluentIterable.from(result).transform(IndexDefinition::getName).toSet();
+    if (!expected.equals(actual)) {
+      throw new ProvisionException(
+          "need index definitions for all schemas: " + expected + " != " + actual);
+    }
+    return result;
+  }
+
+  @Provides
+  @Singleton
+  AccountIndexer getAccountIndexer(
+      AccountIndexerImpl.Factory factory, AccountIndexCollection indexes) {
+    return factory.create(indexes);
+  }
+
+  @Provides
+  @Singleton
+  ChangeIndexer getChangeIndexer(
+      @IndexExecutor(INTERACTIVE) ListeningExecutorService executor,
+      ChangeIndexer.Factory factory,
+      ChangeIndexCollection indexes) {
+    // Bind default indexer to interactive executor; callers who need a
+    // different executor can use the factory directly.
+    return factory.create(executor, indexes);
+  }
+
+  @Provides
+  @Singleton
+  GroupIndexer getGroupIndexer(GroupIndexerImpl.Factory factory, GroupIndexCollection indexes) {
+    return factory.create(indexes);
+  }
+
+  @Provides
+  @Singleton
+  ProjectIndexer getProjectIndexer(
+      ProjectIndexerImpl.Factory factory, ProjectIndexCollection indexes) {
+    return factory.create(indexes);
+  }
+
+  @Provides
+  @Singleton
+  @IndexExecutor(INTERACTIVE)
+  ListeningExecutorService getInteractiveIndexExecutor(
+      @GerritServerConfig Config config, WorkQueue workQueue) {
+    if (interactiveExecutor != null) {
+      return interactiveExecutor;
+    }
+    int threads = this.threads;
+    if (threads < 0) {
+      return MoreExecutors.newDirectExecutorService();
+    } else if (threads == 0) {
+      threads =
+          config.getInt(
+              "index", null, "threads", Runtime.getRuntime().availableProcessors() / 2 + 1);
+    }
+    return MoreExecutors.listeningDecorator(
+        workQueue.createQueue(threads, "Index-Interactive", true));
+  }
+
+  @Provides
+  @Singleton
+  @IndexExecutor(BATCH)
+  ListeningExecutorService getBatchIndexExecutor(
+      @GerritServerConfig Config config, WorkQueue workQueue) {
+    if (batchExecutor != null) {
+      return batchExecutor;
+    }
+    int threads = config.getInt("index", null, "batchThreads", 0);
+    if (threads < 0) {
+      return MoreExecutors.newDirectExecutorService();
+    } else if (threads == 0) {
+      threads = Runtime.getRuntime().availableProcessors();
+    }
+    return MoreExecutors.listeningDecorator(workQueue.createQueue(threads, "Index-Batch", true));
+  }
+
+  @Singleton
+  private static class ShutdownIndexExecutors implements LifecycleListener {
+    private final ListeningExecutorService interactiveExecutor;
+    private final ListeningExecutorService batchExecutor;
+
+    @Inject
+    ShutdownIndexExecutors(
+        @IndexExecutor(INTERACTIVE) ListeningExecutorService interactiveExecutor,
+        @IndexExecutor(BATCH) ListeningExecutorService batchExecutor) {
+      this.interactiveExecutor = interactiveExecutor;
+      this.batchExecutor = batchExecutor;
+    }
+
+    @Override
+    public void start() {}
+
+    @Override
+    public void stop() {
+      MoreExecutors.shutdownAndAwaitTermination(
+          interactiveExecutor, Long.MAX_VALUE, TimeUnit.SECONDS);
+      MoreExecutors.shutdownAndAwaitTermination(batchExecutor, Long.MAX_VALUE, TimeUnit.SECONDS);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/index/IndexUtils.java b/java/com/google/gerrit/server/index/IndexUtils.java
new file mode 100644
index 0000000..9836e82
--- /dev/null
+++ b/java/com/google/gerrit/server/index/IndexUtils.java
@@ -0,0 +1,127 @@
+// Copyright (C) 2013 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.google.gerrit.server.index;
+
+import static com.google.gerrit.server.index.change.ChangeField.CHANGE;
+import static com.google.gerrit.server.index.change.ChangeField.LEGACY_ID;
+import static com.google.gerrit.server.index.change.ChangeField.PROJECT;
+
+import com.google.common.base.Function;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.project.ProjectField;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.index.account.AccountField;
+import com.google.gerrit.server.index.group.GroupField;
+import com.google.gerrit.server.query.change.SingleGroupUser;
+import java.io.IOException;
+import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+public final class IndexUtils {
+  public static final ImmutableMap<String, String> CUSTOM_CHAR_MAPPING =
+      ImmutableMap.of("_", " ", ".", " ");
+
+  public static final Function<Exception, IOException> MAPPER =
+      new Function<Exception, IOException>() {
+        @Override
+        public IOException apply(Exception in) {
+          if (in instanceof IOException) {
+            return (IOException) in;
+          } else if (in instanceof ExecutionException && in.getCause() instanceof IOException) {
+            return (IOException) in.getCause();
+          } else {
+            return new IOException(in);
+          }
+        }
+      };
+
+  public static void setReady(SitePaths sitePaths, String name, int version, boolean ready)
+      throws IOException {
+    try {
+      GerritIndexStatus cfg = new GerritIndexStatus(sitePaths);
+      cfg.setReady(name, version, ready);
+      cfg.save();
+    } catch (ConfigInvalidException e) {
+      throw new IOException(e);
+    }
+  }
+
+  public static boolean getReady(SitePaths sitePaths, String name, int version) throws IOException {
+    try {
+      GerritIndexStatus cfg = new GerritIndexStatus(sitePaths);
+      return cfg.getReady(name, version);
+    } catch (ConfigInvalidException e) {
+      throw new IOException(e);
+    }
+  }
+
+  public static Set<String> accountFields(QueryOptions opts) {
+    return accountFields(opts.fields());
+  }
+
+  public static Set<String> accountFields(Set<String> fields) {
+    return fields.contains(AccountField.ID.getName())
+        ? fields
+        : Sets.union(fields, ImmutableSet.of(AccountField.ID.getName()));
+  }
+
+  public static Set<String> changeFields(QueryOptions opts) {
+    // Ensure we request enough fields to construct a ChangeData. We need both
+    // change ID and project, which can either come via the Change field or
+    // separate fields.
+    Set<String> fs = opts.fields();
+    if (fs.contains(CHANGE.getName())) {
+      // A Change is always sufficient.
+      return fs;
+    }
+    if (fs.contains(PROJECT.getName()) && fs.contains(LEGACY_ID.getName())) {
+      return fs;
+    }
+    return Sets.union(fs, ImmutableSet.of(LEGACY_ID.getName(), PROJECT.getName()));
+  }
+
+  public static Set<String> groupFields(QueryOptions opts) {
+    Set<String> fs = opts.fields();
+    return fs.contains(GroupField.UUID.getName())
+        ? fs
+        : Sets.union(fs, ImmutableSet.of(GroupField.UUID.getName()));
+  }
+
+  public static String describe(CurrentUser user) {
+    if (user.isIdentifiedUser()) {
+      return user.getAccountId().toString();
+    }
+    if (user instanceof SingleGroupUser) {
+      return "group:" + user.getEffectiveGroups().getKnownGroups().iterator().next().toString();
+    }
+    return user.toString();
+  }
+
+  public static Set<String> projectFields(QueryOptions opts) {
+    Set<String> fs = opts.fields();
+    return fs.contains(ProjectField.NAME.getName())
+        ? fs
+        : Sets.union(fs, ImmutableSet.of(ProjectField.NAME.getName()));
+  }
+
+  private IndexUtils() {
+    // hide default constructor
+  }
+}
diff --git a/java/com/google/gerrit/server/index/OnlineReindexer.java b/java/com/google/gerrit/server/index/OnlineReindexer.java
new file mode 100644
index 0000000..ec0e1d4
--- /dev/null
+++ b/java/com/google/gerrit/server/index/OnlineReindexer.java
@@ -0,0 +1,150 @@
+// Copyright (C) 2013 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.google.gerrit.server.index;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.Lists;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.index.Index;
+import com.google.gerrit.index.IndexCollection;
+import com.google.gerrit.index.IndexDefinition;
+import com.google.gerrit.index.SiteIndexer;
+import java.io.IOException;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+public class OnlineReindexer<K, V, I extends Index<K, V>> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final String name;
+  private final IndexCollection<K, V, I> indexes;
+  private final SiteIndexer<K, V, I> batchIndexer;
+  private final int oldVersion;
+  private final int newVersion;
+  private final DynamicSet<OnlineUpgradeListener> listeners;
+  private I index;
+  private final AtomicBoolean running = new AtomicBoolean();
+
+  public OnlineReindexer(
+      IndexDefinition<K, V, I> def,
+      int oldVersion,
+      int newVersion,
+      DynamicSet<OnlineUpgradeListener> listeners) {
+    this.name = def.getName();
+    this.indexes = def.getIndexCollection();
+    this.batchIndexer = def.getSiteIndexer();
+    this.oldVersion = oldVersion;
+    this.newVersion = newVersion;
+    this.listeners = listeners;
+  }
+
+  public void start() {
+    if (running.compareAndSet(false, true)) {
+      Thread t =
+          new Thread() {
+            @Override
+            public void run() {
+              boolean ok = false;
+              try {
+                reindex();
+                ok = true;
+              } catch (IOException e) {
+                logger.atSevere().withCause(e).log(
+                    "Online reindex of %s schema version %s failed", name, version(index));
+              } finally {
+                running.set(false);
+                if (!ok) {
+                  for (OnlineUpgradeListener listener : listeners) {
+                    listener.onFailure(name, oldVersion, newVersion);
+                  }
+                }
+              }
+            }
+          };
+      t.setName(
+          String.format("Reindex %s v%d-v%d", name, version(indexes.getSearchIndex()), newVersion));
+      t.start();
+    }
+  }
+
+  public boolean isRunning() {
+    return running.get();
+  }
+
+  public int getVersion() {
+    return newVersion;
+  }
+
+  private static int version(Index<?, ?> i) {
+    return i.getSchema().getVersion();
+  }
+
+  private void reindex() throws IOException {
+    for (OnlineUpgradeListener listener : listeners) {
+      listener.onStart(name, oldVersion, newVersion);
+    }
+    index =
+        requireNonNull(
+            indexes.getWriteIndex(newVersion),
+            () -> String.format("not an active write schema version: %s %s", name, newVersion));
+    logger.atInfo().log(
+        "Starting online reindex of %s from schema version %s to %s",
+        name, version(indexes.getSearchIndex()), version(index));
+
+    if (oldVersion != newVersion) {
+      index.deleteAll();
+    }
+    SiteIndexer.Result result = batchIndexer.indexAll(index);
+    if (!result.success()) {
+      logger.atSevere().log(
+          "Online reindex of %s schema version %s failed. Successfully"
+              + " indexed %s, failed to index %s",
+          name, version(index), result.doneCount(), result.failedCount());
+      return;
+    }
+    logger.atInfo().log("Reindex %s to version %s complete", name, version(index));
+    activateIndex();
+    for (OnlineUpgradeListener listener : listeners) {
+      listener.onSuccess(name, oldVersion, newVersion);
+    }
+  }
+
+  public void activateIndex() {
+    indexes.setSearchIndex(index);
+    logger.atInfo().log("Using %s schema version %s", name, version(index));
+    try {
+      index.markReady(true);
+    } catch (IOException e) {
+      logger.atWarning().log("Error activating new %s schema version %s", name, version(index));
+    }
+
+    List<I> toRemove = Lists.newArrayListWithExpectedSize(1);
+    for (I i : indexes.getWriteIndexes()) {
+      if (version(i) != version(index)) {
+        toRemove.add(i);
+      }
+    }
+    for (I i : toRemove) {
+      try {
+        i.markReady(false);
+        indexes.removeWriteIndex(version(i));
+      } catch (IOException e) {
+        logger.atWarning().log("Error deactivating old %s schema version %s", name, version(i));
+      }
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/OnlineUpgradeListener.java b/java/com/google/gerrit/server/index/OnlineUpgradeListener.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/index/OnlineUpgradeListener.java
rename to java/com/google/gerrit/server/index/OnlineUpgradeListener.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/OnlineUpgrader.java b/java/com/google/gerrit/server/index/OnlineUpgrader.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/index/OnlineUpgrader.java
rename to java/com/google/gerrit/server/index/OnlineUpgrader.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/ReindexerAlreadyRunningException.java b/java/com/google/gerrit/server/index/ReindexerAlreadyRunningException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/index/ReindexerAlreadyRunningException.java
rename to java/com/google/gerrit/server/index/ReindexerAlreadyRunningException.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/SingleVersionModule.java b/java/com/google/gerrit/server/index/SingleVersionModule.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/index/SingleVersionModule.java
rename to java/com/google/gerrit/server/index/SingleVersionModule.java
diff --git a/java/com/google/gerrit/server/index/VersionManager.java b/java/com/google/gerrit/server/index/VersionManager.java
new file mode 100644
index 0000000..f37472c
--- /dev/null
+++ b/java/com/google/gerrit/server/index/VersionManager.java
@@ -0,0 +1,277 @@
+// Copyright (C) 2017 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.google.gerrit.server.index;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkState;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.index.Index;
+import com.google.gerrit.index.IndexCollection;
+import com.google.gerrit.index.IndexDefinition;
+import com.google.gerrit.index.IndexDefinition.IndexFactory;
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.inject.ProvisionException;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Config;
+
+public abstract class VersionManager implements LifecycleListener {
+  public static boolean getOnlineUpgrade(Config cfg) {
+    return cfg.getBoolean("index", null, "onlineUpgrade", true);
+  }
+
+  public static class Version<V> {
+    public final Schema<V> schema;
+    public final int version;
+    public final boolean exists;
+    public final boolean ready;
+
+    public Version(Schema<V> schema, int version, boolean exists, boolean ready) {
+      checkArgument(schema == null || schema.getVersion() == version);
+      this.schema = schema;
+      this.version = version;
+      this.exists = exists;
+      this.ready = ready;
+    }
+  }
+
+  protected final boolean onlineUpgrade;
+  protected final String runReindexMsg;
+  protected final SitePaths sitePaths;
+
+  private final DynamicSet<OnlineUpgradeListener> listeners;
+
+  // The following fields must be accessed synchronized on this.
+  protected final Map<String, IndexDefinition<?, ?, ?>> defs;
+  protected final Map<String, OnlineReindexer<?, ?, ?>> reindexers;
+
+  protected VersionManager(
+      SitePaths sitePaths,
+      DynamicSet<OnlineUpgradeListener> listeners,
+      Collection<IndexDefinition<?, ?, ?>> defs,
+      boolean onlineUpgrade) {
+    this.sitePaths = sitePaths;
+    this.listeners = listeners;
+    this.defs = Maps.newHashMapWithExpectedSize(defs.size());
+    for (IndexDefinition<?, ?, ?> def : defs) {
+      this.defs.put(def.getName(), def);
+    }
+
+    this.reindexers = Maps.newHashMapWithExpectedSize(defs.size());
+    this.onlineUpgrade = onlineUpgrade;
+    this.runReindexMsg =
+        "No index versions for index '%s' ready; run java -jar "
+            + sitePaths.gerrit_war.toAbsolutePath()
+            + " reindex --index %s";
+  }
+
+  @Override
+  public void start() {
+    GerritIndexStatus cfg = createIndexStatus();
+    for (IndexDefinition<?, ?, ?> def : defs.values()) {
+      initIndex(def, cfg);
+    }
+  }
+
+  @Override
+  public void stop() {
+    // Do nothing; indexes are closed on demand by IndexCollection.
+  }
+
+  /**
+   * Start the online reindexer if the current index is not already the latest.
+   *
+   * @param name index name
+   * @param force start re-index
+   * @return true if started, otherwise false.
+   * @throws ReindexerAlreadyRunningException
+   */
+  public synchronized boolean startReindexer(String name, boolean force)
+      throws ReindexerAlreadyRunningException {
+    OnlineReindexer<?, ?, ?> reindexer = reindexers.get(name);
+    validateReindexerNotRunning(reindexer);
+    if (force || !isLatestIndexVersion(name, reindexer)) {
+      reindexer.start();
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Activate the latest index if the current index is not already the latest.
+   *
+   * @param name index name
+   * @return true if index was activated, otherwise false.
+   * @throws ReindexerAlreadyRunningException
+   */
+  public synchronized boolean activateLatestIndex(String name)
+      throws ReindexerAlreadyRunningException {
+    OnlineReindexer<?, ?, ?> reindexer = reindexers.get(name);
+    validateReindexerNotRunning(reindexer);
+    if (!isLatestIndexVersion(name, reindexer)) {
+      reindexer.activateIndex();
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Tells if an index with this name is currently known or not.
+   *
+   * @param name index name
+   * @return true if index is known and can be used, otherwise false.
+   */
+  public boolean isKnownIndex(String name) {
+    return defs.get(name) != null;
+  }
+
+  protected <K, V, I extends Index<K, V>> void initIndex(
+      IndexDefinition<K, V, I> def, GerritIndexStatus cfg) {
+    TreeMap<Integer, Version<V>> versions = scanVersions(def, cfg);
+    // Search from the most recent ready version.
+    // Write to the most recent ready version and the most recent version.
+    Version<V> search = null;
+    List<Version<V>> write = Lists.newArrayListWithCapacity(2);
+    for (Version<V> v : versions.descendingMap().values()) {
+      if (v.schema == null) {
+        continue;
+      }
+      if (write.isEmpty() && onlineUpgrade) {
+        write.add(v);
+      }
+      if (v.ready) {
+        search = v;
+        if (!write.contains(v)) {
+          write.add(v);
+        }
+        break;
+      }
+    }
+    if (search == null) {
+      throw new ProvisionException(String.format(runReindexMsg, def.getName(), def.getName()));
+    }
+
+    IndexFactory<K, V, I> factory = def.getIndexFactory();
+    I searchIndex = factory.create(search.schema);
+    IndexCollection<K, V, I> indexes = def.getIndexCollection();
+    indexes.setSearchIndex(searchIndex);
+    for (Version<V> v : write) {
+      if (v.version != search.version) {
+        indexes.addWriteIndex(factory.create(v.schema));
+      } else {
+        indexes.addWriteIndex(searchIndex);
+      }
+    }
+
+    markNotReady(def.getName(), versions.values(), write);
+
+    synchronized (this) {
+      if (!reindexers.containsKey(def.getName())) {
+        int latest = write.get(0).version;
+        OnlineReindexer<K, V, I> reindexer =
+            new OnlineReindexer<>(def, search.version, latest, listeners);
+        reindexers.put(def.getName(), reindexer);
+      }
+    }
+  }
+
+  synchronized void startOnlineUpgrade() {
+    checkState(onlineUpgrade, "online upgrade not enabled");
+    for (IndexDefinition<?, ?, ?> def : defs.values()) {
+      String name = def.getName();
+      IndexCollection<?, ?, ?> indexes = def.getIndexCollection();
+      Index<?, ?> search = indexes.getSearchIndex();
+      checkState(
+          search != null, "no search index ready for %s; should have failed at startup", name);
+      int searchVersion = search.getSchema().getVersion();
+
+      List<Index<?, ?>> write = ImmutableList.copyOf(indexes.getWriteIndexes());
+      checkState(
+          !write.isEmpty(),
+          "no write indexes set for %s; should have been initialized at startup",
+          name);
+      int latestWriteVersion = write.get(0).getSchema().getVersion();
+
+      if (latestWriteVersion != searchVersion) {
+        OnlineReindexer<?, ?, ?> reindexer = reindexers.get(name);
+        checkState(
+            reindexer != null,
+            "no reindexer found for %s; should have been initialized at startup",
+            name);
+        reindexer.start();
+      }
+    }
+  }
+
+  protected GerritIndexStatus createIndexStatus() {
+    try {
+      return new GerritIndexStatus(sitePaths);
+    } catch (ConfigInvalidException | IOException e) {
+      throw fail(e);
+    }
+  }
+
+  protected abstract <K, V, I extends Index<K, V>> TreeMap<Integer, Version<V>> scanVersions(
+      IndexDefinition<K, V, I> def, GerritIndexStatus cfg);
+
+  private <V> boolean isDirty(Collection<Version<V>> inUse, Version<V> v) {
+    return !inUse.contains(v) && v.exists;
+  }
+
+  private boolean isLatestIndexVersion(String name, OnlineReindexer<?, ?, ?> reindexer) {
+    int readVersion = defs.get(name).getIndexCollection().getSearchIndex().getSchema().getVersion();
+    return reindexer == null || reindexer.getVersion() == readVersion;
+  }
+
+  private static void validateReindexerNotRunning(OnlineReindexer<?, ?, ?> reindexer)
+      throws ReindexerAlreadyRunningException {
+    if (reindexer != null && reindexer.isRunning()) {
+      throw new ReindexerAlreadyRunningException();
+    }
+  }
+
+  private <V> void markNotReady(
+      String name, Iterable<Version<V>> versions, Collection<Version<V>> inUse) {
+    GerritIndexStatus cfg = createIndexStatus();
+    boolean dirty = false;
+    for (Version<V> v : versions) {
+      if (isDirty(inUse, v)) {
+        cfg.setReady(name, v.version, false);
+        dirty = true;
+      }
+    }
+    if (dirty) {
+      try {
+        cfg.save();
+      } catch (IOException e) {
+        throw fail(e);
+      }
+    }
+  }
+
+  private ProvisionException fail(Throwable t) {
+    return new ProvisionException("Error scanning indexes", t);
+  }
+}
diff --git a/java/com/google/gerrit/server/index/account/AccountField.java b/java/com/google/gerrit/server/index/account/AccountField.java
new file mode 100644
index 0000000..f67a41d
--- /dev/null
+++ b/java/com/google/gerrit/server/index/account/AccountField.java
@@ -0,0 +1,178 @@
+// 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.
+
+package com.google.gerrit.server.index.account;
+
+import static com.google.gerrit.index.FieldDef.exact;
+import static com.google.gerrit.index.FieldDef.integer;
+import static com.google.gerrit.index.FieldDef.prefix;
+import static com.google.gerrit.index.FieldDef.storedOnly;
+import static com.google.gerrit.index.FieldDef.timestamp;
+import static java.util.stream.Collectors.toSet;
+
+import com.google.common.base.Predicates;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.index.FieldDef;
+import com.google.gerrit.index.RefState;
+import com.google.gerrit.index.SchemaUtil;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import java.sql.Timestamp;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Locale;
+import java.util.Set;
+import org.eclipse.jgit.lib.ObjectId;
+
+/** Secondary index schemas for accounts. */
+public class AccountField {
+  public static final FieldDef<AccountState, Integer> ID =
+      integer("id").stored().build(a -> a.getAccount().getId().get());
+
+  /**
+   * External IDs.
+   *
+   * <p>This field includes secondary emails. Use this field only if the current user is allowed to
+   * see secondary emails (requires the {@link GlobalCapability#MODIFY_ACCOUNT} capability).
+   */
+  public static final FieldDef<AccountState, Iterable<String>> EXTERNAL_ID =
+      exact("external_id")
+          .buildRepeatable(a -> Iterables.transform(a.getExternalIds(), id -> id.key().get()));
+
+  /**
+   * Fuzzy prefix match on name and email parts.
+   *
+   * <p>This field includes parts from the secondary emails. Use this field only if the current user
+   * is allowed to see secondary emails (requires the {@link GlobalCapability#MODIFY_ACCOUNT}
+   * capability).
+   *
+   * <p>Use the {@link AccountField#NAME_PART_NO_SECONDARY_EMAIL} if the current user can't see
+   * secondary emails.
+   */
+  public static final FieldDef<AccountState, Iterable<String>> NAME_PART =
+      prefix("name")
+          .buildRepeatable(
+              a -> getNameParts(a, Iterables.transform(a.getExternalIds(), ExternalId::email)));
+
+  /**
+   * Fuzzy prefix match on name and preferred email parts. Parts of secondary emails are not
+   * included.
+   */
+  public static final FieldDef<AccountState, Iterable<String>> NAME_PART_NO_SECONDARY_EMAIL =
+      prefix("name2")
+          .buildRepeatable(a -> getNameParts(a, Arrays.asList(a.getAccount().getPreferredEmail())));
+
+  public static final FieldDef<AccountState, String> FULL_NAME =
+      exact("full_name").build(a -> a.getAccount().getFullName());
+
+  public static final FieldDef<AccountState, String> ACTIVE =
+      exact("inactive").build(a -> a.getAccount().isActive() ? "1" : "0");
+
+  /**
+   * All emails (preferred email + secondary emails). Use this field only if the current user is
+   * allowed to see secondary emails (requires the 'Modify Account' capability).
+   *
+   * <p>Use the {@link AccountField#PREFERRED_EMAIL} if the current user can't see secondary emails.
+   */
+  public static final FieldDef<AccountState, Iterable<String>> EMAIL =
+      prefix("email")
+          .buildRepeatable(
+              a ->
+                  FluentIterable.from(a.getExternalIds())
+                      .transform(ExternalId::email)
+                      .append(Collections.singleton(a.getAccount().getPreferredEmail()))
+                      .filter(Predicates.notNull())
+                      .transform(String::toLowerCase)
+                      .toSet());
+
+  public static final FieldDef<AccountState, String> PREFERRED_EMAIL =
+      prefix("preferredemail")
+          .build(
+              a -> {
+                String preferredEmail = a.getAccount().getPreferredEmail();
+                return preferredEmail != null ? preferredEmail.toLowerCase() : null;
+              });
+
+  public static final FieldDef<AccountState, String> PREFERRED_EMAIL_EXACT =
+      exact("preferredemail_exact").build(a -> a.getAccount().getPreferredEmail());
+
+  public static final FieldDef<AccountState, Timestamp> REGISTERED =
+      timestamp("registered").build(a -> a.getAccount().getRegisteredOn());
+
+  public static final FieldDef<AccountState, String> USERNAME =
+      exact("username").build(a -> a.getUserName().map(String::toLowerCase).orElse(""));
+
+  public static final FieldDef<AccountState, Iterable<String>> WATCHED_PROJECT =
+      exact("watchedproject")
+          .buildRepeatable(
+              a ->
+                  FluentIterable.from(a.getProjectWatches().keySet())
+                      .transform(k -> k.project().get())
+                      .toSet());
+
+  /**
+   * All values of all refs that were used in the course of indexing this document, except the
+   * refs/meta/external-ids notes branch which is handled specially (see {@link
+   * #EXTERNAL_ID_STATE}).
+   *
+   * <p>Emitted as UTF-8 encoded strings of the form {@code project:ref/name:[hex sha]}.
+   */
+  public static final FieldDef<AccountState, Iterable<byte[]>> REF_STATE =
+      storedOnly("ref_state")
+          .buildRepeatable(
+              a -> {
+                if (a.getAccount().getMetaId() == null) {
+                  return ImmutableList.of();
+                }
+
+                return ImmutableList.of(
+                    RefState.create(
+                            RefNames.refsUsers(a.getAccount().getId()),
+                            ObjectId.fromString(a.getAccount().getMetaId()))
+                        .toByteArray(a.getAllUsersNameForIndexing()));
+              });
+
+  /**
+   * All note values of all external IDs that were used in the course of indexing this document.
+   *
+   * <p>Emitted as UTF-8 encoded strings of the form {@code [hex sha of external ID]:[hex sha of
+   * note blob]}, or with other words {@code [note ID]:[note data ID]}.
+   */
+  public static final FieldDef<AccountState, Iterable<byte[]>> EXTERNAL_ID_STATE =
+      storedOnly("external_id_state")
+          .buildRepeatable(
+              a ->
+                  a.getExternalIds().stream()
+                      .filter(e -> e.blobId() != null)
+                      .map(ExternalId::toByteArray)
+                      .collect(toSet()));
+
+  private static final Set<String> getNameParts(AccountState a, Iterable<String> emails) {
+    String fullName = a.getAccount().getFullName();
+    Set<String> parts = SchemaUtil.getNameParts(fullName, emails);
+
+    // Additional values not currently added by getPersonParts.
+    // TODO(dborowitz): Move to getPersonParts and remove this hack.
+    if (fullName != null) {
+      parts.add(fullName.toLowerCase(Locale.US));
+    }
+    return parts;
+  }
+
+  private AccountField() {}
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndex.java b/java/com/google/gerrit/server/index/account/AccountIndex.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndex.java
rename to java/com/google/gerrit/server/index/account/AccountIndex.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexCollection.java b/java/com/google/gerrit/server/index/account/AccountIndexCollection.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexCollection.java
rename to java/com/google/gerrit/server/index/account/AccountIndexCollection.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexDefinition.java b/java/com/google/gerrit/server/index/account/AccountIndexDefinition.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountIndexDefinition.java
rename to java/com/google/gerrit/server/index/account/AccountIndexDefinition.java
diff --git a/java/com/google/gerrit/server/index/account/AccountIndexRewriter.java b/java/com/google/gerrit/server/index/account/AccountIndexRewriter.java
new file mode 100644
index 0000000..35b967c
--- /dev/null
+++ b/java/com/google/gerrit/server/index/account/AccountIndexRewriter.java
@@ -0,0 +1,44 @@
+// 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.
+
+package com.google.gerrit.server.index.account;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.gerrit.index.IndexRewriter;
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.server.account.AccountState;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class AccountIndexRewriter implements IndexRewriter<AccountState> {
+
+  private final AccountIndexCollection indexes;
+
+  @Inject
+  AccountIndexRewriter(AccountIndexCollection indexes) {
+    this.indexes = indexes;
+  }
+
+  @Override
+  public Predicate<AccountState> rewrite(Predicate<AccountState> in, QueryOptions opts)
+      throws QueryParseException {
+    AccountIndex index = indexes.getSearchIndex();
+    requireNonNull(index, "no active search index configured for accounts");
+    return new IndexedAccountQuery(index, in, opts);
+  }
+}
diff --git a/java/com/google/gerrit/server/index/account/AccountIndexer.java b/java/com/google/gerrit/server/index/account/AccountIndexer.java
new file mode 100644
index 0000000..91fa1d9
--- /dev/null
+++ b/java/com/google/gerrit/server/index/account/AccountIndexer.java
@@ -0,0 +1,36 @@
+// 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.
+
+package com.google.gerrit.server.index.account;
+
+import com.google.gerrit.reviewdb.client.Account;
+import java.io.IOException;
+
+public interface AccountIndexer {
+
+  /**
+   * Synchronously index an account.
+   *
+   * @param id account id to index.
+   */
+  void index(Account.Id id) throws IOException;
+
+  /**
+   * Synchronously reindex an account if it is stale.
+   *
+   * @param id account id to index.
+   * @return whether the account was reindexed
+   */
+  boolean reindexIfStale(Account.Id id) throws IOException;
+}
diff --git a/java/com/google/gerrit/server/index/account/AccountIndexerImpl.java b/java/com/google/gerrit/server/index/account/AccountIndexerImpl.java
new file mode 100644
index 0000000..e1b0edd
--- /dev/null
+++ b/java/com/google/gerrit/server/index/account/AccountIndexerImpl.java
@@ -0,0 +1,126 @@
+// 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.
+
+package com.google.gerrit.server.index.account;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.events.AccountIndexedListener;
+import com.google.gerrit.index.Index;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.logging.TraceContext;
+import com.google.gerrit.server.logging.TraceContext.TraceTimer;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.inject.assistedinject.Assisted;
+import com.google.inject.assistedinject.AssistedInject;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Optional;
+
+public class AccountIndexerImpl implements AccountIndexer {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public interface Factory {
+    AccountIndexerImpl create(AccountIndexCollection indexes);
+
+    AccountIndexerImpl create(@Nullable AccountIndex index);
+  }
+
+  private final AccountCache byIdCache;
+  private final PluginSetContext<AccountIndexedListener> indexedListener;
+  private final StalenessChecker stalenessChecker;
+  @Nullable private final AccountIndexCollection indexes;
+  @Nullable private final AccountIndex index;
+
+  @AssistedInject
+  AccountIndexerImpl(
+      AccountCache byIdCache,
+      PluginSetContext<AccountIndexedListener> indexedListener,
+      StalenessChecker stalenessChecker,
+      @Assisted AccountIndexCollection indexes) {
+    this.byIdCache = byIdCache;
+    this.indexedListener = indexedListener;
+    this.stalenessChecker = stalenessChecker;
+    this.indexes = indexes;
+    this.index = null;
+  }
+
+  @AssistedInject
+  AccountIndexerImpl(
+      AccountCache byIdCache,
+      PluginSetContext<AccountIndexedListener> indexedListener,
+      StalenessChecker stalenessChecker,
+      @Assisted @Nullable AccountIndex index) {
+    this.byIdCache = byIdCache;
+    this.indexedListener = indexedListener;
+    this.stalenessChecker = stalenessChecker;
+    this.indexes = null;
+    this.index = index;
+  }
+
+  @Override
+  public void index(Account.Id id) throws IOException {
+    byIdCache.evict(id);
+    Optional<AccountState> accountState = byIdCache.get(id);
+
+    if (accountState.isPresent()) {
+      logger.atFine().log("Replace account %d in index", id.get());
+    } else {
+      logger.atFine().log("Delete account %d from index", id.get());
+    }
+
+    for (Index<Account.Id, AccountState> i : getWriteIndexes()) {
+      // Evict the cache to get an up-to-date value for sure.
+      if (accountState.isPresent()) {
+        try (TraceTimer traceTimer =
+            TraceContext.newTimer(
+                "Replacing account %d in index version %d", id.get(), i.getSchema().getVersion())) {
+          i.replace(accountState.get());
+        }
+      } else {
+        try (TraceTimer traceTimer =
+            TraceContext.newTimer(
+                "Deleteing account %d in index version %d", id.get(), i.getSchema().getVersion())) {
+          i.delete(id);
+        }
+      }
+    }
+    fireAccountIndexedEvent(id.get());
+  }
+
+  @Override
+  public boolean reindexIfStale(Account.Id id) throws IOException {
+    if (stalenessChecker.isStale(id)) {
+      index(id);
+      return true;
+    }
+    return false;
+  }
+
+  private void fireAccountIndexedEvent(int id) {
+    indexedListener.runEach(l -> l.onAccountIndexed(id));
+  }
+
+  private Collection<AccountIndex> getWriteIndexes() {
+    if (indexes != null) {
+      return indexes.getWriteIndexes();
+    }
+
+    return index != null ? Collections.singleton(index) : ImmutableSet.<AccountIndex>of();
+  }
+}
diff --git a/java/com/google/gerrit/server/index/account/AccountSchemaDefinitions.java b/java/com/google/gerrit/server/index/account/AccountSchemaDefinitions.java
new file mode 100644
index 0000000..c41814f
--- /dev/null
+++ b/java/com/google/gerrit/server/index/account/AccountSchemaDefinitions.java
@@ -0,0 +1,60 @@
+// 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.
+
+package com.google.gerrit.server.index.account;
+
+import static com.google.gerrit.index.SchemaUtil.schema;
+
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.index.SchemaDefinitions;
+import com.google.gerrit.server.account.AccountState;
+
+public class AccountSchemaDefinitions extends SchemaDefinitions<AccountState> {
+  @Deprecated
+  static final Schema<AccountState> V4 =
+      schema(
+          AccountField.ACTIVE,
+          AccountField.EMAIL,
+          AccountField.EXTERNAL_ID,
+          AccountField.FULL_NAME,
+          AccountField.ID,
+          AccountField.NAME_PART,
+          AccountField.REGISTERED,
+          AccountField.USERNAME,
+          AccountField.WATCHED_PROJECT);
+
+  @Deprecated static final Schema<AccountState> V5 = schema(V4, AccountField.PREFERRED_EMAIL);
+
+  @Deprecated
+  static final Schema<AccountState> V6 =
+      schema(V5, AccountField.REF_STATE, AccountField.EXTERNAL_ID_STATE);
+
+  @Deprecated static final Schema<AccountState> V7 = schema(V6, AccountField.PREFERRED_EMAIL_EXACT);
+
+  @Deprecated
+  static final Schema<AccountState> V8 = schema(V7, AccountField.NAME_PART_NO_SECONDARY_EMAIL);
+
+  // Bump Lucene version requires reindexing
+  @Deprecated static final Schema<AccountState> V9 = schema(V8);
+
+  // Lucene index was changed to add additional fields for sorting.
+  static final Schema<AccountState> V10 = schema(V9);
+
+  public static final String NAME = "accounts";
+  public static final AccountSchemaDefinitions INSTANCE = new AccountSchemaDefinitions();
+
+  private AccountSchemaDefinitions() {
+    super(NAME, AccountState.class);
+  }
+}
diff --git a/java/com/google/gerrit/server/index/account/AllAccountsIndexer.java b/java/com/google/gerrit/server/index/account/AllAccountsIndexer.java
new file mode 100644
index 0000000..acb7236
--- /dev/null
+++ b/java/com/google/gerrit/server/index/account/AllAccountsIndexer.java
@@ -0,0 +1,129 @@
+// 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.
+
+package com.google.gerrit.server.index.account;
+
+import static com.google.gerrit.server.git.QueueProvider.QueueType.BATCH;
+
+import com.google.common.base.Stopwatch;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.gerrit.index.SiteIndexer;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.account.Accounts;
+import com.google.gerrit.server.index.IndexExecutor;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.eclipse.jgit.lib.ProgressMonitor;
+import org.eclipse.jgit.lib.TextProgressMonitor;
+
+@Singleton
+public class AllAccountsIndexer extends SiteIndexer<Account.Id, AccountState, AccountIndex> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final ListeningExecutorService executor;
+  private final Accounts accounts;
+  private final AccountCache accountCache;
+
+  @Inject
+  AllAccountsIndexer(
+      @IndexExecutor(BATCH) ListeningExecutorService executor,
+      Accounts accounts,
+      AccountCache accountCache) {
+    this.executor = executor;
+    this.accounts = accounts;
+    this.accountCache = accountCache;
+  }
+
+  @Override
+  public SiteIndexer.Result indexAll(AccountIndex index) {
+    ProgressMonitor progress = new TextProgressMonitor(newPrintWriter(progressOut));
+    progress.start(2);
+    Stopwatch sw = Stopwatch.createStarted();
+    List<Account.Id> ids;
+    try {
+      ids = collectAccounts(progress);
+    } catch (IOException e) {
+      logger.atSevere().withCause(e).log("Error collecting accounts");
+      return new SiteIndexer.Result(sw, false, 0, 0);
+    }
+    return reindexAccounts(index, ids, progress);
+  }
+
+  private SiteIndexer.Result reindexAccounts(
+      AccountIndex index, List<Account.Id> ids, ProgressMonitor progress) {
+    progress.beginTask("Reindexing accounts", ids.size());
+    List<ListenableFuture<?>> futures = new ArrayList<>(ids.size());
+    AtomicBoolean ok = new AtomicBoolean(true);
+    AtomicInteger done = new AtomicInteger();
+    AtomicInteger failed = new AtomicInteger();
+    Stopwatch sw = Stopwatch.createStarted();
+    for (Account.Id id : ids) {
+      String desc = "account " + id;
+      ListenableFuture<?> future =
+          executor.submit(
+              () -> {
+                try {
+                  accountCache.evict(id);
+                  Optional<AccountState> a = accountCache.get(id);
+                  if (a.isPresent()) {
+                    index.replace(a.get());
+                  } else {
+                    index.delete(id);
+                  }
+                  verboseWriter.println("Reindexed " + desc);
+                  done.incrementAndGet();
+                } catch (Exception e) {
+                  failed.incrementAndGet();
+                  throw e;
+                }
+                return null;
+              });
+      addErrorListener(future, desc, progress, ok);
+      futures.add(future);
+    }
+
+    try {
+      Futures.successfulAsList(futures).get();
+    } catch (ExecutionException | InterruptedException e) {
+      logger.atSevere().withCause(e).log("Error waiting on account futures");
+      return new SiteIndexer.Result(sw, false, 0, 0);
+    }
+
+    progress.endTask();
+    return new SiteIndexer.Result(sw, ok.get(), done.get(), failed.get());
+  }
+
+  private List<Account.Id> collectAccounts(ProgressMonitor progress) throws IOException {
+    progress.beginTask("Collecting accounts", ProgressMonitor.UNKNOWN);
+    List<Account.Id> ids = new ArrayList<>();
+    for (Account.Id accountId : accounts.allIds()) {
+      ids.add(accountId);
+      progress.update(1);
+    }
+    progress.endTask();
+    return ids;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/IndexedAccountQuery.java b/java/com/google/gerrit/server/index/account/IndexedAccountQuery.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/index/account/IndexedAccountQuery.java
rename to java/com/google/gerrit/server/index/account/IndexedAccountQuery.java
diff --git a/java/com/google/gerrit/server/index/account/StalenessChecker.java b/java/com/google/gerrit/server/index/account/StalenessChecker.java
new file mode 100644
index 0000000..4664700
--- /dev/null
+++ b/java/com/google/gerrit/server/index/account/StalenessChecker.java
@@ -0,0 +1,151 @@
+// Copyright (C) 2017 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.google.gerrit.server.index.account;
+
+import static com.google.common.base.Preconditions.checkState;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.base.Splitter;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.MultimapBuilder;
+import com.google.gerrit.index.IndexConfig;
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.RefState;
+import com.google.gerrit.index.query.FieldBundle;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.account.externalids.ExternalIds;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.index.IndexUtils;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+
+/**
+ * Checks if documents in the account index are stale.
+ *
+ * <p>An index document is considered stale if the stored ref state differs from the SHA1 of the
+ * user branch or if the stored external ID states don't match with the external IDs of the account
+ * from the refs/meta/external-ids branch.
+ */
+@Singleton
+public class StalenessChecker {
+  public static final ImmutableSet<String> FIELDS =
+      ImmutableSet.of(
+          AccountField.ID.getName(),
+          AccountField.REF_STATE.getName(),
+          AccountField.EXTERNAL_ID_STATE.getName());
+
+  private final AccountIndexCollection indexes;
+  private final GitRepositoryManager repoManager;
+  private final AllUsersName allUsersName;
+  private final ExternalIds externalIds;
+  private final IndexConfig indexConfig;
+
+  @Inject
+  StalenessChecker(
+      AccountIndexCollection indexes,
+      GitRepositoryManager repoManager,
+      AllUsersName allUsersName,
+      ExternalIds externalIds,
+      IndexConfig indexConfig) {
+    this.indexes = indexes;
+    this.repoManager = repoManager;
+    this.allUsersName = allUsersName;
+    this.externalIds = externalIds;
+    this.indexConfig = indexConfig;
+  }
+
+  public boolean isStale(Account.Id id) throws IOException {
+    AccountIndex i = indexes.getSearchIndex();
+    if (i == null) {
+      // No index; caller couldn't do anything if it is stale.
+      return false;
+    }
+    if (!i.getSchema().hasField(AccountField.REF_STATE)
+        || !i.getSchema().hasField(AccountField.EXTERNAL_ID_STATE)) {
+      // Index version not new enough for this check.
+      return false;
+    }
+
+    Optional<FieldBundle> result =
+        i.getRaw(id, QueryOptions.create(indexConfig, 0, 1, IndexUtils.accountFields(FIELDS)));
+    if (!result.isPresent()) {
+      // The document is missing in the index.
+      try (Repository repo = repoManager.openRepository(allUsersName)) {
+        Ref ref = repo.exactRef(RefNames.refsUsers(id));
+
+        // Stale if the account actually exists.
+        return ref != null;
+      }
+    }
+
+    for (Map.Entry<Project.NameKey, RefState> e :
+        RefState.parseStates(result.get().getValue(AccountField.REF_STATE)).entries()) {
+      try (Repository repo = repoManager.openRepository(e.getKey())) {
+        if (!e.getValue().match(repo)) {
+          // Ref was modified since the account was indexed.
+          return true;
+        }
+      }
+    }
+
+    Set<ExternalId> extIds = externalIds.byAccount(id);
+    ListMultimap<ObjectId, ObjectId> extIdStates =
+        parseExternalIdStates(result.get().getValue(AccountField.EXTERNAL_ID_STATE));
+    if (extIdStates.size() != extIds.size()) {
+      // External IDs of the account were modified since the account was indexed.
+      return true;
+    }
+    for (ExternalId extId : extIds) {
+      if (!extIdStates.containsEntry(extId.key().sha1(), extId.blobId())) {
+        // External IDs of the account were modified since the account was indexed.
+        return true;
+      }
+    }
+
+    return false;
+  }
+
+  public static ListMultimap<ObjectId, ObjectId> parseExternalIdStates(
+      Iterable<byte[]> extIdStates) {
+    ListMultimap<ObjectId, ObjectId> result = MultimapBuilder.hashKeys().arrayListValues().build();
+
+    if (extIdStates == null) {
+      return result;
+    }
+
+    for (byte[] b : extIdStates) {
+      requireNonNull(b, "invalid external ID state");
+      String s = new String(b, UTF_8);
+      List<String> parts = Splitter.on(':').splitToList(s);
+      checkState(parts.size() == 2, "invalid external ID state: %s", s);
+      result.put(ObjectId.fromString(parts.get(0)), ObjectId.fromString(parts.get(1)));
+    }
+    return result;
+  }
+}
diff --git a/java/com/google/gerrit/server/index/change/AllChangesIndexer.java b/java/com/google/gerrit/server/index/change/AllChangesIndexer.java
new file mode 100644
index 0000000..b0f4de76
--- /dev/null
+++ b/java/com/google/gerrit/server/index/change/AllChangesIndexer.java
@@ -0,0 +1,267 @@
+// Copyright (C) 2013 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.google.gerrit.server.index.change;
+
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.util.concurrent.Futures.successfulAsList;
+import static com.google.common.util.concurrent.Futures.transform;
+import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
+import static com.google.gerrit.server.git.QueueProvider.QueueType.BATCH;
+
+import com.google.common.base.Stopwatch;
+import com.google.common.collect.ComparisonChain;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.gerrit.index.SiteIndexer;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.MultiProgressMonitor;
+import com.google.gerrit.server.git.MultiProgressMonitor.Task;
+import com.google.gerrit.server.index.IndexExecutor;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.ChangeNotes.Factory.ChangeNotesResult;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.atomic.AtomicBoolean;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.ProgressMonitor;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.lib.TextProgressMonitor;
+
+public class AllChangesIndexer extends SiteIndexer<Change.Id, ChangeData, ChangeIndex> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final SchemaFactory<ReviewDb> schemaFactory;
+  private final ChangeData.Factory changeDataFactory;
+  private final GitRepositoryManager repoManager;
+  private final ListeningExecutorService executor;
+  private final ChangeIndexer.Factory indexerFactory;
+  private final ChangeNotes.Factory notesFactory;
+  private final ProjectCache projectCache;
+
+  @Inject
+  AllChangesIndexer(
+      SchemaFactory<ReviewDb> schemaFactory,
+      ChangeData.Factory changeDataFactory,
+      GitRepositoryManager repoManager,
+      @IndexExecutor(BATCH) ListeningExecutorService executor,
+      ChangeIndexer.Factory indexerFactory,
+      ChangeNotes.Factory notesFactory,
+      ProjectCache projectCache) {
+    this.schemaFactory = schemaFactory;
+    this.changeDataFactory = changeDataFactory;
+    this.repoManager = repoManager;
+    this.executor = executor;
+    this.indexerFactory = indexerFactory;
+    this.notesFactory = notesFactory;
+    this.projectCache = projectCache;
+  }
+
+  private static class ProjectHolder implements Comparable<ProjectHolder> {
+    final Project.NameKey name;
+    private final long size;
+
+    ProjectHolder(Project.NameKey name, long size) {
+      this.name = name;
+      this.size = size;
+    }
+
+    @Override
+    public int compareTo(ProjectHolder other) {
+      // Sort projects based on size first to maximize utilization of threads early on.
+      return ComparisonChain.start()
+          .compare(other.size, size)
+          .compare(other.name.get(), name.get())
+          .result();
+    }
+  }
+
+  @Override
+  public Result indexAll(ChangeIndex index) {
+    ProgressMonitor pm = new TextProgressMonitor();
+    pm.beginTask("Collecting projects", ProgressMonitor.UNKNOWN);
+    SortedSet<ProjectHolder> projects = new TreeSet<>();
+    int changeCount = 0;
+    Stopwatch sw = Stopwatch.createStarted();
+    int projectsFailed = 0;
+    for (Project.NameKey name : projectCache.all()) {
+      try (Repository repo = repoManager.openRepository(name)) {
+        long size = estimateSize(repo);
+        changeCount += size;
+        projects.add(new ProjectHolder(name, size));
+      } catch (IOException e) {
+        logger.atSevere().withCause(e).log("Error collecting project %s", name);
+        projectsFailed++;
+        if (projectsFailed > projects.size() / 2) {
+          logger.atSevere().log("Over 50%% of the projects could not be collected: aborted");
+          return new Result(sw, false, 0, 0);
+        }
+      }
+      pm.update(1);
+    }
+    pm.endTask();
+    setTotalWork(changeCount);
+    return indexAll(index, projects);
+  }
+
+  private long estimateSize(Repository repo) throws IOException {
+    // Estimate size based on IDs that show up in ref names. This is not perfect, since patch set
+    // refs may exist for changes whose metadata was never successfully stored. But that's ok, as
+    // the estimate is just used as a heuristic for sorting projects.
+    return repo.getRefDatabase().getRefsByPrefix(RefNames.REFS_CHANGES).stream()
+        .map(r -> Change.Id.fromRef(r.getName()))
+        .filter(Objects::nonNull)
+        .distinct()
+        .count();
+  }
+
+  private SiteIndexer.Result indexAll(ChangeIndex index, SortedSet<ProjectHolder> projects) {
+    Stopwatch sw = Stopwatch.createStarted();
+    MultiProgressMonitor mpm = new MultiProgressMonitor(progressOut, "Reindexing changes");
+    Task projTask = mpm.beginSubTask("projects", projects.size());
+    checkState(totalWork >= 0);
+    Task doneTask = mpm.beginSubTask(null, totalWork);
+    Task failedTask = mpm.beginSubTask("failed", MultiProgressMonitor.UNKNOWN);
+
+    List<ListenableFuture<?>> futures = new ArrayList<>();
+    AtomicBoolean ok = new AtomicBoolean(true);
+
+    for (ProjectHolder project : projects) {
+      ListenableFuture<?> future =
+          executor.submit(
+              reindexProject(
+                  indexerFactory.create(executor, index), project.name, doneTask, failedTask));
+      addErrorListener(future, "project " + project.name, projTask, ok);
+      futures.add(future);
+    }
+
+    try {
+      mpm.waitFor(
+          transform(
+              successfulAsList(futures),
+              x -> {
+                mpm.end();
+                return null;
+              },
+              directExecutor()));
+    } catch (ExecutionException e) {
+      logger.atSevere().withCause(e).log("Error in batch indexer");
+      ok.set(false);
+    }
+    // If too many changes failed, maybe there was a bug in the indexer. Don't
+    // trust the results. This is not an exact percentage since we bump the same
+    // failure counter if a project can't be read, but close enough.
+    int nFailed = failedTask.getCount();
+    int nDone = doneTask.getCount();
+    int nTotal = nFailed + nDone;
+    double pctFailed = ((double) nFailed) / nTotal * 100;
+    if (pctFailed > 10) {
+      logger.atSevere().log(
+          "Failed %s/%s changes (%s%%); not marking new index as ready",
+          nFailed, nTotal, Math.round(pctFailed));
+      ok.set(false);
+    }
+    return new Result(sw, ok.get(), nDone, nFailed);
+  }
+
+  public Callable<Void> reindexProject(
+      ChangeIndexer indexer, Project.NameKey project, Task done, Task failed) {
+    return new ProjectIndexer(indexer, project, done, failed);
+  }
+
+  private class ProjectIndexer implements Callable<Void> {
+    private final ChangeIndexer indexer;
+    private final Project.NameKey project;
+    private final ProgressMonitor done;
+    private final ProgressMonitor failed;
+
+    private ProjectIndexer(
+        ChangeIndexer indexer,
+        Project.NameKey project,
+        ProgressMonitor done,
+        ProgressMonitor failed) {
+      this.indexer = indexer;
+      this.project = project;
+      this.done = done;
+      this.failed = failed;
+    }
+
+    @Override
+    public Void call() throws Exception {
+      try (Repository repo = repoManager.openRepository(project);
+          ReviewDb db = schemaFactory.open()) {
+        // Order of scanning changes is undefined. This is ok if we assume that packfile locality is
+        // not important for indexing, since sites should have a fully populated DiffSummary cache.
+        // It does mean that reindexing after invalidating the DiffSummary cache will be expensive,
+        // but the goal is to invalidate that cache as infrequently as we possibly can. And besides,
+        // we don't have concrete proof that improving packfile locality would help.
+        notesFactory.scan(repo, db, project).forEach(r -> index(db, r));
+      } catch (RepositoryNotFoundException rnfe) {
+        logger.atSevere().log(rnfe.getMessage());
+      }
+      return null;
+    }
+
+    private void index(ReviewDb db, ChangeNotesResult r) {
+      if (r.error().isPresent()) {
+        fail("Failed to read change " + r.id() + " for indexing", true, r.error().get());
+        return;
+      }
+      try {
+        indexer.index(changeDataFactory.create(db, r.notes()));
+        done.update(1);
+        verboseWriter.println("Reindexed change " + r.id());
+      } catch (RejectedExecutionException e) {
+        // Server shutdown, don't spam the logs.
+        failSilently();
+      } catch (Exception e) {
+        fail("Failed to index change " + r.id(), true, e);
+      }
+    }
+
+    private void fail(String error, boolean failed, Exception e) {
+      if (failed) {
+        this.failed.update(1);
+      }
+
+      logger.atWarning().withCause(e).log(error);
+      verboseWriter.println(error);
+    }
+
+    private void failSilently() {
+      this.failed.update(1);
+    }
+
+    @Override
+    public String toString() {
+      return "Index all changes of project " + project.get();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/index/change/ChangeField.java b/java/com/google/gerrit/server/index/change/ChangeField.java
new file mode 100644
index 0000000..da807e7
--- /dev/null
+++ b/java/com/google/gerrit/server/index/change/ChangeField.java
@@ -0,0 +1,879 @@
+// Copyright (C) 2013 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.google.gerrit.server.index.change;
+
+import static com.google.common.base.MoreObjects.firstNonNull;
+import static com.google.gerrit.index.FieldDef.exact;
+import static com.google.gerrit.index.FieldDef.fullText;
+import static com.google.gerrit.index.FieldDef.intRange;
+import static com.google.gerrit.index.FieldDef.integer;
+import static com.google.gerrit.index.FieldDef.prefix;
+import static com.google.gerrit.index.FieldDef.storedOnly;
+import static com.google.gerrit.index.FieldDef.timestamp;
+import static com.google.gerrit.reviewdb.server.ReviewDbCodecs.APPROVAL_CODEC;
+import static com.google.gerrit.reviewdb.server.ReviewDbCodecs.CHANGE_CODEC;
+import static com.google.gerrit.reviewdb.server.ReviewDbCodecs.PATCH_SET_CODEC;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.stream.Collectors.toList;
+import static java.util.stream.Collectors.toSet;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Enums;
+import com.google.common.base.Splitter;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableTable;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Table;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.primitives.Longs;
+import com.google.gerrit.common.data.SubmitRecord;
+import com.google.gerrit.common.data.SubmitRequirement;
+import com.google.gerrit.index.FieldDef;
+import com.google.gerrit.index.RefState;
+import com.google.gerrit.index.SchemaUtil;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.OutputFormat;
+import com.google.gerrit.server.ReviewerByEmailSet;
+import com.google.gerrit.server.ReviewerSet;
+import com.google.gerrit.server.StarredChangesUtil;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.index.change.StalenessChecker.RefStatePattern;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
+import com.google.gerrit.server.notedb.ReviewerStateInternal;
+import com.google.gerrit.server.notedb.RobotCommentNotes;
+import com.google.gerrit.server.project.SubmitRuleOptions;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.ChangeQueryBuilder;
+import com.google.gerrit.server.query.change.ChangeStatusPredicate;
+import com.google.gson.Gson;
+import com.google.gwtorm.protobuf.ProtobufCodec;
+import com.google.gwtorm.server.OrmException;
+import com.google.protobuf.CodedOutputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Stream;
+import org.eclipse.jgit.lib.PersonIdent;
+
+/**
+ * Fields indexed on change documents.
+ *
+ * <p>Each field corresponds to both a field name supported by {@link ChangeQueryBuilder} for
+ * querying that field, and a method on {@link ChangeData} used for populating the corresponding
+ * document fields in the secondary index.
+ *
+ * <p>Field names are all lowercase alphanumeric plus underscore; index implementations may create
+ * unambiguous derived field names containing other characters.
+ */
+public class ChangeField {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static final int NO_ASSIGNEE = -1;
+
+  private static final Gson GSON = OutputFormat.JSON_COMPACT.newGson();
+
+  /** Legacy change ID. */
+  public static final FieldDef<ChangeData, Integer> LEGACY_ID =
+      integer("legacy_id").stored().build(cd -> cd.getId().get());
+
+  /** Newer style Change-Id key. */
+  public static final FieldDef<ChangeData, String> ID =
+      prefix(ChangeQueryBuilder.FIELD_CHANGE_ID).build(changeGetter(c -> c.getKey().get()));
+
+  /** Change status string, in the same format as {@code status:}. */
+  public static final FieldDef<ChangeData, String> STATUS =
+      exact(ChangeQueryBuilder.FIELD_STATUS)
+          .build(changeGetter(c -> ChangeStatusPredicate.canonicalize(c.getStatus())));
+
+  /** Project containing the change. */
+  public static final FieldDef<ChangeData, String> PROJECT =
+      exact(ChangeQueryBuilder.FIELD_PROJECT)
+          .stored()
+          .build(changeGetter(c -> c.getProject().get()));
+
+  /** Project containing the change, as a prefix field. */
+  public static final FieldDef<ChangeData, String> PROJECTS =
+      prefix(ChangeQueryBuilder.FIELD_PROJECTS).build(changeGetter(c -> c.getProject().get()));
+
+  /** Reference (aka branch) the change will submit onto. */
+  public static final FieldDef<ChangeData, String> REF =
+      exact(ChangeQueryBuilder.FIELD_REF).build(changeGetter(c -> c.getDest().get()));
+
+  /** Topic, a short annotation on the branch. */
+  public static final FieldDef<ChangeData, String> EXACT_TOPIC =
+      exact("topic4").build(ChangeField::getTopic);
+
+  /** Topic, a short annotation on the branch. */
+  public static final FieldDef<ChangeData, String> FUZZY_TOPIC =
+      fullText("topic5").build(ChangeField::getTopic);
+
+  /** Submission id assigned by MergeOp. */
+  public static final FieldDef<ChangeData, String> SUBMISSIONID =
+      exact(ChangeQueryBuilder.FIELD_SUBMISSIONID).build(changeGetter(Change::getSubmissionId));
+
+  /** Last update time since January 1, 1970. */
+  public static final FieldDef<ChangeData, Timestamp> UPDATED =
+      timestamp("updated2").stored().build(changeGetter(Change::getLastUpdatedOn));
+
+  /** List of full file paths modified in the current patch set. */
+  public static final FieldDef<ChangeData, Iterable<String>> PATH =
+      // Named for backwards compatibility.
+      exact(ChangeQueryBuilder.FIELD_FILE)
+          .buildRepeatable(cd -> firstNonNull(cd.currentFilePaths(), ImmutableList.of()));
+
+  public static Set<String> getFileParts(ChangeData cd) throws OrmException {
+    List<String> paths;
+    try {
+      paths = cd.currentFilePaths();
+    } catch (IOException e) {
+      throw new OrmException(e);
+    }
+
+    Splitter s = Splitter.on('/').omitEmptyStrings();
+    Set<String> r = new HashSet<>();
+    for (String path : paths) {
+      for (String part : s.split(path)) {
+        r.add(part);
+      }
+    }
+    return r;
+  }
+
+  /** Hashtags tied to a change */
+  public static final FieldDef<ChangeData, Iterable<String>> HASHTAG =
+      exact(ChangeQueryBuilder.FIELD_HASHTAG)
+          .buildRepeatable(cd -> cd.hashtags().stream().map(String::toLowerCase).collect(toSet()));
+
+  /** Hashtags with original case. */
+  public static final FieldDef<ChangeData, Iterable<byte[]>> HASHTAG_CASE_AWARE =
+      storedOnly("_hashtag")
+          .buildRepeatable(
+              cd -> cd.hashtags().stream().map(t -> t.getBytes(UTF_8)).collect(toSet()));
+
+  /** Components of each file path modified in the current patch set. */
+  public static final FieldDef<ChangeData, Iterable<String>> FILE_PART =
+      exact(ChangeQueryBuilder.FIELD_FILEPART).buildRepeatable(ChangeField::getFileParts);
+
+  /** Owner/creator of the change. */
+  public static final FieldDef<ChangeData, Integer> OWNER =
+      integer(ChangeQueryBuilder.FIELD_OWNER).build(changeGetter(c -> c.getOwner().get()));
+
+  /** The user assigned to the change. */
+  public static final FieldDef<ChangeData, Integer> ASSIGNEE =
+      integer(ChangeQueryBuilder.FIELD_ASSIGNEE)
+          .build(changeGetter(c -> c.getAssignee() != null ? c.getAssignee().get() : NO_ASSIGNEE));
+
+  /** Reviewer(s) associated with the change. */
+  public static final FieldDef<ChangeData, Iterable<String>> REVIEWER =
+      exact("reviewer2").stored().buildRepeatable(cd -> getReviewerFieldValues(cd.reviewers()));
+
+  /** Reviewer(s) associated with the change that do not have a gerrit account. */
+  public static final FieldDef<ChangeData, Iterable<String>> REVIEWER_BY_EMAIL =
+      exact("reviewer_by_email")
+          .stored()
+          .buildRepeatable(cd -> getReviewerByEmailFieldValues(cd.reviewersByEmail()));
+
+  /** Reviewer(s) modified during change's current WIP phase. */
+  public static final FieldDef<ChangeData, Iterable<String>> PENDING_REVIEWER =
+      exact(ChangeQueryBuilder.FIELD_PENDING_REVIEWER)
+          .stored()
+          .buildRepeatable(cd -> getReviewerFieldValues(cd.pendingReviewers()));
+
+  /** Reviewer(s) by email modified during change's current WIP phase. */
+  public static final FieldDef<ChangeData, Iterable<String>> PENDING_REVIEWER_BY_EMAIL =
+      exact(ChangeQueryBuilder.FIELD_PENDING_REVIEWER_BY_EMAIL)
+          .stored()
+          .buildRepeatable(cd -> getReviewerByEmailFieldValues(cd.pendingReviewersByEmail()));
+
+  /** References a change that this change reverts. */
+  public static final FieldDef<ChangeData, Integer> REVERT_OF =
+      integer(ChangeQueryBuilder.FIELD_REVERTOF)
+          .build(cd -> cd.change().getRevertOf() != null ? cd.change().getRevertOf().get() : null);
+
+  @VisibleForTesting
+  static List<String> getReviewerFieldValues(ReviewerSet reviewers) {
+    List<String> r = new ArrayList<>(reviewers.asTable().size() * 2);
+    for (Table.Cell<ReviewerStateInternal, Account.Id, Timestamp> c :
+        reviewers.asTable().cellSet()) {
+      String v = getReviewerFieldValue(c.getRowKey(), c.getColumnKey());
+      r.add(v);
+      r.add(v + ',' + c.getValue().getTime());
+    }
+    return r;
+  }
+
+  public static String getReviewerFieldValue(ReviewerStateInternal state, Account.Id id) {
+    return state.toString() + ',' + id;
+  }
+
+  @VisibleForTesting
+  static List<String> getReviewerByEmailFieldValues(ReviewerByEmailSet reviewersByEmail) {
+    List<String> r = new ArrayList<>(reviewersByEmail.asTable().size() * 2);
+    for (Table.Cell<ReviewerStateInternal, Address, Timestamp> c :
+        reviewersByEmail.asTable().cellSet()) {
+      String v = getReviewerByEmailFieldValue(c.getRowKey(), c.getColumnKey());
+      r.add(v);
+      if (c.getColumnKey().getName() != null) {
+        // Add another entry without the name to provide search functionality on the email
+        Address emailOnly = new Address(c.getColumnKey().getEmail());
+        r.add(getReviewerByEmailFieldValue(c.getRowKey(), emailOnly));
+      }
+      r.add(v + ',' + c.getValue().getTime());
+    }
+    return r;
+  }
+
+  public static String getReviewerByEmailFieldValue(ReviewerStateInternal state, Address adr) {
+    return state.toString() + ',' + adr;
+  }
+
+  public static ReviewerSet parseReviewerFieldValues(Change.Id changeId, Iterable<String> values) {
+    ImmutableTable.Builder<ReviewerStateInternal, Account.Id, Timestamp> b =
+        ImmutableTable.builder();
+    for (String v : values) {
+
+      int i = v.indexOf(',');
+      if (i < 0) {
+        logger.atWarning().log(
+            "Invalid value for reviewer field from change %s: %s", changeId.get(), v);
+        continue;
+      }
+
+      int i2 = v.lastIndexOf(',');
+      if (i2 == i) {
+        // Don't log a warning here.
+        // For each reviewer we store 2 values in the reviewer field, one value with the format
+        // "<reviewer-type>,<account-id>" and one value with the format
+        // "<reviewer-type>,<account-id>,<timestamp>" (see #getReviewerFieldValues(ReviewerSet)).
+        // For parsing we are only interested in the "<reviewer-type>,<account-id>,<timestamp>"
+        // value and the "<reviewer-type>,<account-id>" value is ignored here.
+        continue;
+      }
+
+      com.google.common.base.Optional<ReviewerStateInternal> reviewerState =
+          Enums.getIfPresent(ReviewerStateInternal.class, v.substring(0, i));
+      if (!reviewerState.isPresent()) {
+        logger.atWarning().log(
+            "Failed to parse reviewer state of reviewer field from change %s: %s",
+            changeId.get(), v);
+        continue;
+      }
+
+      Optional<Account.Id> accountId = Account.Id.tryParse(v.substring(i + 1, i2));
+      if (!accountId.isPresent()) {
+        logger.atWarning().log(
+            "Failed to parse account ID of reviewer field from change %s: %s", changeId.get(), v);
+        continue;
+      }
+
+      Long l = Longs.tryParse(v.substring(i2 + 1, v.length()));
+      if (l == null) {
+        logger.atWarning().log(
+            "Failed to parse timestamp of reviewer field from change %s: %s", changeId.get(), v);
+        continue;
+      }
+      Timestamp timestamp = new Timestamp(l);
+
+      b.put(reviewerState.get(), accountId.get(), timestamp);
+    }
+    return ReviewerSet.fromTable(b.build());
+  }
+
+  public static ReviewerByEmailSet parseReviewerByEmailFieldValues(
+      Change.Id changeId, Iterable<String> values) {
+    ImmutableTable.Builder<ReviewerStateInternal, Address, Timestamp> b = ImmutableTable.builder();
+    for (String v : values) {
+      int i = v.indexOf(',');
+      if (i < 0) {
+        logger.atWarning().log(
+            "Invalid value for reviewer by email field from change %s: %s", changeId.get(), v);
+        continue;
+      }
+
+      int i2 = v.lastIndexOf(',');
+      if (i2 == i) {
+        // Don't log a warning here.
+        // For each reviewer we store 2 values in the reviewer field, one value with the format
+        // "<reviewer-type>,<email>" and one value with the format
+        // "<reviewer-type>,<email>,<timestamp>" (see
+        // #getReviewerByEmailFieldValues(ReviewerByEmailSet)).
+        // For parsing we are only interested in the "<reviewer-type>,<email>,<timestamp>" value
+        // and the "<reviewer-type>,<email>" value is ignored here.
+        continue;
+      }
+
+      com.google.common.base.Optional<ReviewerStateInternal> reviewerState =
+          Enums.getIfPresent(ReviewerStateInternal.class, v.substring(0, i));
+      if (!reviewerState.isPresent()) {
+        logger.atWarning().log(
+            "Failed to parse reviewer state of reviewer by email field from change %s: %s",
+            changeId.get(), v);
+        continue;
+      }
+
+      Address address = Address.tryParse(v.substring(i + 1, i2));
+      if (address == null) {
+        logger.atWarning().log(
+            "Failed to parse address of reviewer by email field from change %s: %s",
+            changeId.get(), v);
+        continue;
+      }
+
+      Long l = Longs.tryParse(v.substring(i2 + 1, v.length()));
+      if (l == null) {
+        logger.atWarning().log(
+            "Failed to parse timestamp of reviewer by email field from change %s: %s",
+            changeId.get(), v);
+        continue;
+      }
+      Timestamp timestamp = new Timestamp(l);
+
+      b.put(reviewerState.get(), address, timestamp);
+    }
+    return ReviewerByEmailSet.fromTable(b.build());
+  }
+
+  /** Commit ID of any patch set on the change, using prefix match. */
+  public static final FieldDef<ChangeData, Iterable<String>> COMMIT =
+      prefix(ChangeQueryBuilder.FIELD_COMMIT).buildRepeatable(ChangeField::getRevisions);
+
+  /** Commit ID of any patch set on the change, using exact match. */
+  public static final FieldDef<ChangeData, Iterable<String>> EXACT_COMMIT =
+      exact(ChangeQueryBuilder.FIELD_EXACTCOMMIT).buildRepeatable(ChangeField::getRevisions);
+
+  private static Set<String> getRevisions(ChangeData cd) throws OrmException {
+    Set<String> revisions = new HashSet<>();
+    for (PatchSet ps : cd.patchSets()) {
+      if (ps.getRevision() != null) {
+        revisions.add(ps.getRevision().get());
+      }
+    }
+    return revisions;
+  }
+
+  /** Tracking id extracted from a footer. */
+  public static final FieldDef<ChangeData, Iterable<String>> TR =
+      exact(ChangeQueryBuilder.FIELD_TR)
+          .buildRepeatable(cd -> ImmutableSet.copyOf(cd.trackingFooters().values()));
+
+  /** List of labels on the current patch set including change owner votes. */
+  public static final FieldDef<ChangeData, Iterable<String>> LABEL =
+      exact("label2").buildRepeatable(cd -> getLabels(cd, true));
+
+  private static Iterable<String> getLabels(ChangeData cd, boolean owners) throws OrmException {
+    Set<String> allApprovals = new HashSet<>();
+    Set<String> distinctApprovals = new HashSet<>();
+    for (PatchSetApproval a : cd.currentApprovals()) {
+      if (a.getValue() != 0 && !a.isLegacySubmit()) {
+        allApprovals.add(formatLabel(a.getLabel(), a.getValue(), a.getAccountId()));
+        if (owners && cd.change().getOwner().equals(a.getAccountId())) {
+          allApprovals.add(
+              formatLabel(a.getLabel(), a.getValue(), ChangeQueryBuilder.OWNER_ACCOUNT_ID));
+        }
+        distinctApprovals.add(formatLabel(a.getLabel(), a.getValue()));
+      }
+    }
+    allApprovals.addAll(distinctApprovals);
+    return allApprovals;
+  }
+
+  public static Set<String> getAuthorParts(ChangeData cd) throws OrmException, IOException {
+    return SchemaUtil.getPersonParts(cd.getAuthor());
+  }
+
+  public static Set<String> getAuthorNameAndEmail(ChangeData cd) throws OrmException, IOException {
+    return getNameAndEmail(cd.getAuthor());
+  }
+
+  public static Set<String> getCommitterParts(ChangeData cd) throws OrmException, IOException {
+    return SchemaUtil.getPersonParts(cd.getCommitter());
+  }
+
+  public static Set<String> getCommitterNameAndEmail(ChangeData cd)
+      throws OrmException, IOException {
+    return getNameAndEmail(cd.getCommitter());
+  }
+
+  private static Set<String> getNameAndEmail(PersonIdent person) {
+    if (person == null) {
+      return ImmutableSet.of();
+    }
+
+    String name = person.getName().toLowerCase(Locale.US);
+    String email = person.getEmailAddress().toLowerCase(Locale.US);
+
+    StringBuilder nameEmailBuilder = new StringBuilder();
+    PersonIdent.appendSanitized(nameEmailBuilder, name);
+    nameEmailBuilder.append(" <");
+    PersonIdent.appendSanitized(nameEmailBuilder, email);
+    nameEmailBuilder.append('>');
+
+    return ImmutableSet.of(name, email, nameEmailBuilder.toString());
+  }
+
+  /**
+   * The exact email address, or any part of the author name or email address, in the current patch
+   * set.
+   */
+  public static final FieldDef<ChangeData, Iterable<String>> AUTHOR =
+      fullText(ChangeQueryBuilder.FIELD_AUTHOR).buildRepeatable(ChangeField::getAuthorParts);
+
+  /** The exact name, email address and NameEmail of the author. */
+  public static final FieldDef<ChangeData, Iterable<String>> EXACT_AUTHOR =
+      exact(ChangeQueryBuilder.FIELD_EXACTAUTHOR)
+          .buildRepeatable(ChangeField::getAuthorNameAndEmail);
+
+  /**
+   * The exact email address, or any part of the committer name or email address, in the current
+   * patch set.
+   */
+  public static final FieldDef<ChangeData, Iterable<String>> COMMITTER =
+      fullText(ChangeQueryBuilder.FIELD_COMMITTER).buildRepeatable(ChangeField::getCommitterParts);
+
+  /** The exact name, email address, and NameEmail of the committer. */
+  public static final FieldDef<ChangeData, Iterable<String>> EXACT_COMMITTER =
+      exact(ChangeQueryBuilder.FIELD_EXACTCOMMITTER)
+          .buildRepeatable(ChangeField::getCommitterNameAndEmail);
+
+  /** Serialized change object, used for pre-populating results. */
+  public static final FieldDef<ChangeData, byte[]> CHANGE =
+      storedOnly("_change").build(changeGetter(CHANGE_CODEC::encodeToByteArray));
+
+  /** Serialized approvals for the current patch set, used for pre-populating results. */
+  public static final FieldDef<ChangeData, Iterable<byte[]>> APPROVAL =
+      storedOnly("_approval")
+          .buildRepeatable(cd -> toProtos(APPROVAL_CODEC, cd.currentApprovals()));
+
+  public static String formatLabel(String label, int value) {
+    return formatLabel(label, value, null);
+  }
+
+  public static String formatLabel(String label, int value, Account.Id accountId) {
+    return label.toLowerCase()
+        + (value >= 0 ? "+" : "")
+        + value
+        + (accountId != null ? "," + formatAccount(accountId) : "");
+  }
+
+  private static String formatAccount(Account.Id accountId) {
+    if (ChangeQueryBuilder.OWNER_ACCOUNT_ID.equals(accountId)) {
+      return ChangeQueryBuilder.ARG_ID_OWNER;
+    }
+    return Integer.toString(accountId.get());
+  }
+
+  /** Commit message of the current patch set. */
+  public static final FieldDef<ChangeData, String> COMMIT_MESSAGE =
+      fullText(ChangeQueryBuilder.FIELD_MESSAGE).build(ChangeData::commitMessage);
+
+  /** Summary or inline comment. */
+  public static final FieldDef<ChangeData, Iterable<String>> COMMENT =
+      fullText(ChangeQueryBuilder.FIELD_COMMENT)
+          .buildRepeatable(
+              cd ->
+                  Stream.concat(
+                          cd.publishedComments().stream().map(c -> c.message),
+                          cd.messages().stream().map(ChangeMessage::getMessage))
+                      .collect(toSet()));
+
+  /** Number of unresolved comments of the change. */
+  public static final FieldDef<ChangeData, Integer> UNRESOLVED_COMMENT_COUNT =
+      intRange(ChangeQueryBuilder.FIELD_UNRESOLVED_COMMENT_COUNT)
+          .build(ChangeData::unresolvedCommentCount);
+
+  /** Whether the change is mergeable. */
+  public static final FieldDef<ChangeData, String> MERGEABLE =
+      exact(ChangeQueryBuilder.FIELD_MERGEABLE)
+          .stored()
+          .build(
+              cd -> {
+                Boolean m = cd.isMergeable();
+                if (m == null) {
+                  return null;
+                }
+                return m ? "1" : "0";
+              });
+
+  /** The number of inserted lines in this change. */
+  public static final FieldDef<ChangeData, Integer> ADDED =
+      intRange(ChangeQueryBuilder.FIELD_ADDED)
+          .build(cd -> cd.changedLines().isPresent() ? cd.changedLines().get().insertions : null);
+
+  /** The number of deleted lines in this change. */
+  public static final FieldDef<ChangeData, Integer> DELETED =
+      intRange(ChangeQueryBuilder.FIELD_DELETED)
+          .build(cd -> cd.changedLines().isPresent() ? cd.changedLines().get().deletions : null);
+
+  /** The total number of modified lines in this change. */
+  public static final FieldDef<ChangeData, Integer> DELTA =
+      intRange(ChangeQueryBuilder.FIELD_DELTA)
+          .build(cd -> cd.changedLines().map(c -> c.insertions + c.deletions).orElse(null));
+
+  /** Determines if this change is private. */
+  public static final FieldDef<ChangeData, String> PRIVATE =
+      exact(ChangeQueryBuilder.FIELD_PRIVATE).build(cd -> cd.change().isPrivate() ? "1" : "0");
+
+  /** Determines if this change is work in progress. */
+  public static final FieldDef<ChangeData, String> WIP =
+      exact(ChangeQueryBuilder.FIELD_WIP).build(cd -> cd.change().isWorkInProgress() ? "1" : "0");
+
+  /** Determines if this change has started review. */
+  public static final FieldDef<ChangeData, String> STARTED =
+      exact(ChangeQueryBuilder.FIELD_STARTED)
+          .build(cd -> cd.change().hasReviewStarted() ? "1" : "0");
+
+  /** Users who have commented on this change. */
+  public static final FieldDef<ChangeData, Iterable<Integer>> COMMENTBY =
+      integer(ChangeQueryBuilder.FIELD_COMMENTBY)
+          .buildRepeatable(
+              cd ->
+                  Stream.concat(
+                          cd.messages().stream().map(ChangeMessage::getAuthor),
+                          cd.publishedComments().stream().map(c -> c.author.getId()))
+                      .filter(Objects::nonNull)
+                      .map(Account.Id::get)
+                      .collect(toSet()));
+
+  /** Star labels on this change in the format: &lt;account-id&gt;:&lt;label&gt; */
+  public static final FieldDef<ChangeData, Iterable<String>> STAR =
+      exact(ChangeQueryBuilder.FIELD_STAR)
+          .stored()
+          .buildRepeatable(
+              cd ->
+                  Iterables.transform(
+                      cd.stars().entries(),
+                      e ->
+                          StarredChangesUtil.StarField.create(e.getKey(), e.getValue())
+                              .toString()));
+
+  /** Users that have starred the change with any label. */
+  public static final FieldDef<ChangeData, Iterable<Integer>> STARBY =
+      integer(ChangeQueryBuilder.FIELD_STARBY)
+          .buildRepeatable(cd -> Iterables.transform(cd.stars().keySet(), Account.Id::get));
+
+  /** Opaque group identifiers for this change's patch sets. */
+  public static final FieldDef<ChangeData, Iterable<String>> GROUP =
+      exact(ChangeQueryBuilder.FIELD_GROUP)
+          .buildRepeatable(
+              cd ->
+                  cd.patchSets().stream().flatMap(ps -> ps.getGroups().stream()).collect(toSet()));
+
+  /** Serialized patch set object, used for pre-populating results. */
+  public static final FieldDef<ChangeData, Iterable<byte[]>> PATCH_SET =
+      storedOnly("_patch_set").buildRepeatable(cd -> toProtos(PATCH_SET_CODEC, cd.patchSets()));
+
+  /** Users who have edits on this change. */
+  public static final FieldDef<ChangeData, Iterable<Integer>> EDITBY =
+      integer(ChangeQueryBuilder.FIELD_EDITBY)
+          .buildRepeatable(cd -> cd.editsByUser().stream().map(Account.Id::get).collect(toSet()));
+
+  /** Users who have draft comments on this change. */
+  public static final FieldDef<ChangeData, Iterable<Integer>> DRAFTBY =
+      integer(ChangeQueryBuilder.FIELD_DRAFTBY)
+          .buildRepeatable(cd -> cd.draftsByUser().stream().map(Account.Id::get).collect(toSet()));
+
+  public static final Integer NOT_REVIEWED = -1;
+
+  /**
+   * Users the change was reviewed by since the last author update.
+   *
+   * <p>A change is considered reviewed by a user if the latest update by that user is newer than
+   * the latest update by the change author. Both top-level change messages and new patch sets are
+   * considered to be updates.
+   *
+   * <p>If the latest update is by the change owner, then the special value {@link #NOT_REVIEWED} is
+   * emitted.
+   */
+  public static final FieldDef<ChangeData, Iterable<Integer>> REVIEWEDBY =
+      integer(ChangeQueryBuilder.FIELD_REVIEWEDBY)
+          .stored()
+          .buildRepeatable(
+              cd -> {
+                Set<Account.Id> reviewedBy = cd.reviewedBy();
+                if (reviewedBy.isEmpty()) {
+                  return ImmutableSet.of(NOT_REVIEWED);
+                }
+                return reviewedBy.stream().map(Account.Id::get).collect(toList());
+              });
+
+  public static final SubmitRuleOptions SUBMIT_RULE_OPTIONS_LENIENT =
+      SubmitRuleOptions.builder().allowClosed(true).build();
+
+  public static final SubmitRuleOptions SUBMIT_RULE_OPTIONS_STRICT =
+      SubmitRuleOptions.builder().build();
+
+  /**
+   * JSON type for storing SubmitRecords.
+   *
+   * <p>Stored fields need to use a stable format over a long period; this type insulates the index
+   * from implementation changes in SubmitRecord itself.
+   */
+  public static class StoredSubmitRecord {
+    static class StoredLabel {
+      String label;
+      SubmitRecord.Label.Status status;
+      Integer appliedBy;
+    }
+
+    static class StoredRequirement {
+      String fallbackText;
+      String type;
+      Map<String, String> data;
+    }
+
+    SubmitRecord.Status status;
+    List<StoredLabel> labels;
+    List<StoredRequirement> requirements;
+    String errorMessage;
+
+    public StoredSubmitRecord(SubmitRecord rec) {
+      this.status = rec.status;
+      this.errorMessage = rec.errorMessage;
+      if (rec.labels != null) {
+        this.labels = new ArrayList<>(rec.labels.size());
+        for (SubmitRecord.Label label : rec.labels) {
+          StoredLabel sl = new StoredLabel();
+          sl.label = label.label;
+          sl.status = label.status;
+          sl.appliedBy = label.appliedBy != null ? label.appliedBy.get() : null;
+          this.labels.add(sl);
+        }
+      }
+      if (rec.requirements != null) {
+        this.requirements = new ArrayList<>(rec.requirements.size());
+        for (SubmitRequirement requirement : rec.requirements) {
+          StoredRequirement sr = new StoredRequirement();
+          sr.type = requirement.type();
+          sr.fallbackText = requirement.fallbackText();
+          sr.data = requirement.data();
+          this.requirements.add(sr);
+        }
+      }
+    }
+
+    public SubmitRecord toSubmitRecord() {
+      SubmitRecord rec = new SubmitRecord();
+      rec.status = status;
+      rec.errorMessage = errorMessage;
+      if (labels != null) {
+        rec.labels = new ArrayList<>(labels.size());
+        for (StoredLabel label : labels) {
+          SubmitRecord.Label srl = new SubmitRecord.Label();
+          srl.label = label.label;
+          srl.status = label.status;
+          srl.appliedBy = label.appliedBy != null ? new Account.Id(label.appliedBy) : null;
+          rec.labels.add(srl);
+        }
+      }
+      if (requirements != null) {
+        rec.requirements = new ArrayList<>(requirements.size());
+        for (StoredRequirement req : requirements) {
+          SubmitRequirement sr =
+              SubmitRequirement.builder()
+                  .setType(req.type)
+                  .setFallbackText(req.fallbackText)
+                  .setData(req.data)
+                  .build();
+          rec.requirements.add(sr);
+        }
+      }
+      return rec;
+    }
+  }
+
+  public static final FieldDef<ChangeData, Iterable<String>> SUBMIT_RECORD =
+      exact("submit_record").buildRepeatable(ChangeField::formatSubmitRecordValues);
+
+  public static final FieldDef<ChangeData, Iterable<byte[]>> STORED_SUBMIT_RECORD_STRICT =
+      storedOnly("full_submit_record_strict")
+          .buildRepeatable(cd -> storedSubmitRecords(cd, SUBMIT_RULE_OPTIONS_STRICT));
+
+  public static final FieldDef<ChangeData, Iterable<byte[]>> STORED_SUBMIT_RECORD_LENIENT =
+      storedOnly("full_submit_record_lenient")
+          .buildRepeatable(cd -> storedSubmitRecords(cd, SUBMIT_RULE_OPTIONS_LENIENT));
+
+  public static void parseSubmitRecords(
+      Collection<String> values, SubmitRuleOptions opts, ChangeData out) {
+    List<SubmitRecord> records = parseSubmitRecords(values);
+    if (records.isEmpty()) {
+      // Assume no values means the field is not in the index;
+      // SubmitRuleEvaluator ensures the list is non-empty.
+      return;
+    }
+    out.setSubmitRecords(opts, records);
+  }
+
+  @VisibleForTesting
+  static List<SubmitRecord> parseSubmitRecords(Collection<String> values) {
+    return values.stream()
+        .map(v -> GSON.fromJson(v, StoredSubmitRecord.class).toSubmitRecord())
+        .collect(toList());
+  }
+
+  @VisibleForTesting
+  static List<byte[]> storedSubmitRecords(List<SubmitRecord> records) {
+    return Lists.transform(records, r -> GSON.toJson(new StoredSubmitRecord(r)).getBytes(UTF_8));
+  }
+
+  private static Iterable<byte[]> storedSubmitRecords(ChangeData cd, SubmitRuleOptions opts) {
+    return storedSubmitRecords(cd.submitRecords(opts));
+  }
+
+  public static List<String> formatSubmitRecordValues(ChangeData cd) throws OrmException {
+    return formatSubmitRecordValues(
+        cd.submitRecords(SUBMIT_RULE_OPTIONS_STRICT), cd.change().getOwner());
+  }
+
+  @VisibleForTesting
+  static List<String> formatSubmitRecordValues(List<SubmitRecord> records, Account.Id changeOwner) {
+    List<String> result = new ArrayList<>();
+    for (SubmitRecord rec : records) {
+      result.add(rec.status.name());
+      if (rec.labels == null) {
+        continue;
+      }
+      for (SubmitRecord.Label label : rec.labels) {
+        String sl = label.status.toString() + ',' + label.label.toLowerCase();
+        result.add(sl);
+        String slc = sl + ',';
+        if (label.appliedBy != null) {
+          result.add(slc + label.appliedBy.get());
+          if (label.appliedBy.equals(changeOwner)) {
+            result.add(slc + ChangeQueryBuilder.OWNER_ACCOUNT_ID.get());
+          }
+        }
+      }
+    }
+    return result;
+  }
+
+  /**
+   * All values of all refs that were used in the course of indexing this document.
+   *
+   * <p>Emitted as UTF-8 encoded strings of the form {@code project:ref/name:[hex sha]}.
+   */
+  public static final FieldDef<ChangeData, Iterable<byte[]>> REF_STATE =
+      storedOnly("ref_state")
+          .buildRepeatable(
+              cd -> {
+                List<byte[]> result = new ArrayList<>();
+                Project.NameKey project = cd.change().getProject();
+
+                cd.editRefs()
+                    .values()
+                    .forEach(r -> result.add(RefState.of(r).toByteArray(project)));
+                cd.starRefs()
+                    .values()
+                    .forEach(r -> result.add(RefState.of(r.ref()).toByteArray(allUsers(cd))));
+
+                if (PrimaryStorage.of(cd.change()) == PrimaryStorage.NOTE_DB) {
+                  ChangeNotes notes = cd.notes();
+                  result.add(
+                      RefState.create(notes.getRefName(), notes.getMetaId()).toByteArray(project));
+                  notes.getRobotComments(); // Force loading robot comments.
+                  RobotCommentNotes robotNotes = notes.getRobotCommentNotes();
+                  result.add(
+                      RefState.create(robotNotes.getRefName(), robotNotes.getMetaId())
+                          .toByteArray(project));
+                  cd.draftRefs()
+                      .values()
+                      .forEach(r -> result.add(RefState.of(r).toByteArray(allUsers(cd))));
+                }
+
+                return result;
+              });
+
+  /**
+   * All ref wildcard patterns that were used in the course of indexing this document.
+   *
+   * <p>Emitted as UTF-8 encoded strings of the form {@code project:ref/name/*}. See {@link
+   * RefStatePattern} for the pattern format.
+   */
+  public static final FieldDef<ChangeData, Iterable<byte[]>> REF_STATE_PATTERN =
+      storedOnly("ref_state_pattern")
+          .buildRepeatable(
+              cd -> {
+                Change.Id id = cd.getId();
+                Project.NameKey project = cd.change().getProject();
+                List<byte[]> result = new ArrayList<>(3);
+                result.add(
+                    RefStatePattern.create(
+                            RefNames.REFS_USERS + "*/" + RefNames.EDIT_PREFIX + id + "/*")
+                        .toByteArray(project));
+                result.add(
+                    RefStatePattern.create(RefNames.refsStarredChangesPrefix(id) + "*")
+                        .toByteArray(allUsers(cd)));
+                if (PrimaryStorage.of(cd.change()) == PrimaryStorage.NOTE_DB) {
+                  result.add(
+                      RefStatePattern.create(RefNames.refsDraftCommentsPrefix(id) + "*")
+                          .toByteArray(allUsers(cd)));
+                }
+                return result;
+              });
+
+  private static String getTopic(ChangeData cd) throws OrmException {
+    Change c = cd.change();
+    if (c == null) {
+      return null;
+    }
+    return firstNonNull(c.getTopic(), "");
+  }
+
+  private static <T> List<byte[]> toProtos(ProtobufCodec<T> codec, Collection<T> objs)
+      throws OrmException {
+    List<byte[]> result = Lists.newArrayListWithCapacity(objs.size());
+    ByteArrayOutputStream out = new ByteArrayOutputStream(256);
+    try {
+      for (T obj : objs) {
+        out.reset();
+        CodedOutputStream cos = CodedOutputStream.newInstance(out);
+        codec.encode(obj, cos);
+        cos.flush();
+        result.add(out.toByteArray());
+      }
+    } catch (IOException e) {
+      throw new OrmException(e);
+    }
+    return result;
+  }
+
+  private static <T> FieldDef.Getter<ChangeData, T> changeGetter(Function<Change, T> func) {
+    return in -> in.change() != null ? func.apply(in.change()) : null;
+  }
+
+  private static AllUsersName allUsers(ChangeData cd) {
+    return cd.getAllUsersNameForIndexing();
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndex.java b/java/com/google/gerrit/server/index/change/ChangeIndex.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndex.java
rename to java/com/google/gerrit/server/index/change/ChangeIndex.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexCollection.java b/java/com/google/gerrit/server/index/change/ChangeIndexCollection.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexCollection.java
rename to java/com/google/gerrit/server/index/change/ChangeIndexCollection.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexDefinition.java b/java/com/google/gerrit/server/index/change/ChangeIndexDefinition.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexDefinition.java
rename to java/com/google/gerrit/server/index/change/ChangeIndexDefinition.java
diff --git a/java/com/google/gerrit/server/index/change/ChangeIndexRewriter.java b/java/com/google/gerrit/server/index/change/ChangeIndexRewriter.java
new file mode 100644
index 0000000..976813f
--- /dev/null
+++ b/java/com/google/gerrit/server/index/change/ChangeIndexRewriter.java
@@ -0,0 +1,294 @@
+// Copyright (C) 2013 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.google.gerrit.server.index.change;
+
+import static com.google.gerrit.server.query.change.ChangeStatusPredicate.closed;
+import static com.google.gerrit.server.query.change.ChangeStatusPredicate.open;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+import com.google.gerrit.index.FieldDef;
+import com.google.gerrit.index.IndexConfig;
+import com.google.gerrit.index.IndexRewriter;
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.index.query.AndPredicate;
+import com.google.gerrit.index.query.IndexPredicate;
+import com.google.gerrit.index.query.LimitPredicate;
+import com.google.gerrit.index.query.NotPredicate;
+import com.google.gerrit.index.query.OrPredicate;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Change.Status;
+import com.google.gerrit.server.query.change.AndChangeSource;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.ChangeDataSource;
+import com.google.gerrit.server.query.change.ChangeQueryBuilder;
+import com.google.gerrit.server.query.change.ChangeStatusPredicate;
+import com.google.gerrit.server.query.change.OrSource;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.BitSet;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.jgit.util.MutableInteger;
+
+/** Rewriter that pushes boolean logic into the secondary index. */
+@Singleton
+public class ChangeIndexRewriter implements IndexRewriter<ChangeData> {
+  /** Set of all open change statuses. */
+  public static final Set<Change.Status> OPEN_STATUSES;
+
+  /** Set of all closed change statuses. */
+  public static final Set<Change.Status> CLOSED_STATUSES;
+
+  static {
+    EnumSet<Change.Status> open = EnumSet.noneOf(Change.Status.class);
+    EnumSet<Change.Status> closed = EnumSet.noneOf(Change.Status.class);
+    for (Change.Status s : Change.Status.values()) {
+      if (s.isOpen()) {
+        open.add(s);
+      } else {
+        closed.add(s);
+      }
+    }
+    OPEN_STATUSES = Sets.immutableEnumSet(open);
+    CLOSED_STATUSES = Sets.immutableEnumSet(closed);
+  }
+
+  /**
+   * Get the set of statuses that changes matching the given predicate may have.
+   *
+   * @param in predicate
+   * @return the maximal set of statuses that any changes matching the input predicates may have,
+   *     based on examining boolean and {@link ChangeStatusPredicate}s.
+   */
+  public static EnumSet<Change.Status> getPossibleStatus(Predicate<ChangeData> in) {
+    EnumSet<Change.Status> s = extractStatus(in);
+    return s != null ? s : EnumSet.allOf(Change.Status.class);
+  }
+
+  private static EnumSet<Change.Status> extractStatus(Predicate<ChangeData> in) {
+    if (in instanceof ChangeStatusPredicate) {
+      Status status = ((ChangeStatusPredicate) in).getStatus();
+      return status != null ? EnumSet.of(status) : null;
+    } else if (in instanceof NotPredicate) {
+      EnumSet<Status> s = extractStatus(in.getChild(0));
+      return s != null ? EnumSet.complementOf(s) : null;
+    } else if (in instanceof OrPredicate) {
+      EnumSet<Change.Status> r = null;
+      int childrenWithStatus = 0;
+      for (int i = 0; i < in.getChildCount(); i++) {
+        EnumSet<Status> c = extractStatus(in.getChild(i));
+        if (c != null) {
+          if (r == null) {
+            r = EnumSet.noneOf(Change.Status.class);
+          }
+          r.addAll(c);
+          childrenWithStatus++;
+        }
+      }
+      if (r != null && childrenWithStatus < in.getChildCount()) {
+        // At least one child supplied a status but another did not.
+        // Assume all statuses for the children that did not feed a
+        // status at this part of the tree. This matches behavior if
+        // the child was used at the root of a query.
+        return EnumSet.allOf(Change.Status.class);
+      }
+      return r;
+    } else if (in instanceof AndPredicate) {
+      EnumSet<Change.Status> r = null;
+      for (int i = 0; i < in.getChildCount(); i++) {
+        EnumSet<Change.Status> c = extractStatus(in.getChild(i));
+        if (c != null) {
+          if (r == null) {
+            r = EnumSet.allOf(Change.Status.class);
+          }
+          r.retainAll(c);
+        }
+      }
+      return r;
+    }
+    return null;
+  }
+
+  private final ChangeIndexCollection indexes;
+  private final IndexConfig config;
+
+  @Inject
+  ChangeIndexRewriter(ChangeIndexCollection indexes, IndexConfig config) {
+    this.indexes = indexes;
+    this.config = config;
+  }
+
+  @Override
+  public Predicate<ChangeData> rewrite(Predicate<ChangeData> in, QueryOptions opts)
+      throws QueryParseException {
+    Predicate<ChangeData> s = rewriteImpl(in, opts);
+    if (!(s instanceof ChangeDataSource)) {
+      in = Predicate.and(Predicate.or(open(), closed()), in);
+      s = rewriteImpl(in, opts);
+    }
+    if (!(s instanceof ChangeDataSource)) {
+      throw new QueryParseException("invalid query: " + s);
+    }
+    return s;
+  }
+
+  private Predicate<ChangeData> rewriteImpl(Predicate<ChangeData> in, QueryOptions opts)
+      throws QueryParseException {
+    ChangeIndex index = indexes.getSearchIndex();
+
+    MutableInteger leafTerms = new MutableInteger();
+    Predicate<ChangeData> out = rewriteImpl(in, index, opts, leafTerms);
+    if (in == out || out instanceof IndexPredicate) {
+      return new IndexedChangeQuery(index, out, opts);
+    } else if (out == null /* cannot rewrite */) {
+      return in;
+    } else {
+      return out;
+    }
+  }
+
+  /**
+   * Rewrite a single predicate subtree.
+   *
+   * @param in predicate to rewrite.
+   * @param index index whose schema determines which fields are indexed.
+   * @param opts other query options.
+   * @param leafTerms number of leaf index query terms encountered so far.
+   * @return {@code null} if no part of this subtree can be queried in the index directly. {@code
+   *     in} if this subtree and all its children can be queried directly in the index. Otherwise, a
+   *     predicate that is semantically equivalent, with some of its subtrees wrapped to query the
+   *     index directly.
+   * @throws QueryParseException if the underlying index implementation does not support this
+   *     predicate.
+   */
+  private Predicate<ChangeData> rewriteImpl(
+      Predicate<ChangeData> in, ChangeIndex index, QueryOptions opts, MutableInteger leafTerms)
+      throws QueryParseException {
+    if (isIndexPredicate(in, index)) {
+      if (++leafTerms.value > config.maxTerms()) {
+        throw new QueryParseException("too many terms in query");
+      }
+      return in;
+    } else if (in instanceof LimitPredicate) {
+      // Replace any limits with the limit provided by the caller. The caller
+      // should have already searched the predicate tree for limit predicates
+      // and included that in their limit computation.
+      return new LimitPredicate<>(ChangeQueryBuilder.FIELD_LIMIT, opts.limit());
+    } else if (!isRewritePossible(in)) {
+      if (in instanceof IndexPredicate) {
+        throw new QueryParseException("Unsupported index predicate: " + in.toString());
+      }
+      return null; // magic to indicate "in" cannot be rewritten
+    }
+
+    int n = in.getChildCount();
+    BitSet isIndexed = new BitSet(n);
+    BitSet notIndexed = new BitSet(n);
+    BitSet rewritten = new BitSet(n);
+    BitSet changeSource = new BitSet(n);
+    List<Predicate<ChangeData>> newChildren = Lists.newArrayListWithCapacity(n);
+    for (int i = 0; i < n; i++) {
+      Predicate<ChangeData> c = in.getChild(i);
+      Predicate<ChangeData> nc = rewriteImpl(c, index, opts, leafTerms);
+      if (nc == c) {
+        isIndexed.set(i);
+        newChildren.add(c);
+      } else if (nc == null /* cannot rewrite c */) {
+        notIndexed.set(i);
+        newChildren.add(c);
+      } else {
+        if (nc instanceof ChangeDataSource) {
+          changeSource.set(i);
+        }
+        rewritten.set(i);
+        newChildren.add(nc);
+      }
+    }
+
+    if (isIndexed.cardinality() == n) {
+      return in; // All children are indexed, leave as-is for parent.
+    } else if (notIndexed.cardinality() == n) {
+      return null; // Can't rewrite any children, so cannot rewrite in.
+    } else if (rewritten.cardinality() == n) {
+      // All children were rewritten.
+      if (changeSource.cardinality() == n) {
+        return copy(in, newChildren);
+      }
+      return in.copy(newChildren);
+    }
+    return partitionChildren(in, newChildren, isIndexed, index, opts);
+  }
+
+  private boolean isIndexPredicate(Predicate<ChangeData> in, ChangeIndex index) {
+    if (!(in instanceof IndexPredicate)) {
+      return false;
+    }
+    IndexPredicate<ChangeData> p = (IndexPredicate<ChangeData>) in;
+
+    FieldDef<ChangeData, ?> def = p.getField();
+    Schema<ChangeData> schema = index.getSchema();
+    return schema.hasField(def);
+  }
+
+  private Predicate<ChangeData> partitionChildren(
+      Predicate<ChangeData> in,
+      List<Predicate<ChangeData>> newChildren,
+      BitSet isIndexed,
+      ChangeIndex index,
+      QueryOptions opts)
+      throws QueryParseException {
+    if (isIndexed.cardinality() == 1) {
+      int i = isIndexed.nextSetBit(0);
+      newChildren.add(0, new IndexedChangeQuery(index, newChildren.remove(i), opts));
+      return copy(in, newChildren);
+    }
+
+    // Group all indexed predicates into a wrapped subtree.
+    List<Predicate<ChangeData>> indexed = Lists.newArrayListWithCapacity(isIndexed.cardinality());
+
+    List<Predicate<ChangeData>> all =
+        Lists.newArrayListWithCapacity(newChildren.size() - isIndexed.cardinality() + 1);
+
+    for (int i = 0; i < newChildren.size(); i++) {
+      Predicate<ChangeData> c = newChildren.get(i);
+      if (isIndexed.get(i)) {
+        indexed.add(c);
+      } else {
+        all.add(c);
+      }
+    }
+    all.add(0, new IndexedChangeQuery(index, in.copy(indexed), opts));
+    return copy(in, all);
+  }
+
+  private Predicate<ChangeData> copy(Predicate<ChangeData> in, List<Predicate<ChangeData>> all) {
+    if (in instanceof AndPredicate) {
+      return new AndChangeSource(all);
+    } else if (in instanceof OrPredicate) {
+      return new OrSource(all);
+    }
+    return in.copy(all);
+  }
+
+  private static boolean isRewritePossible(Predicate<ChangeData> p) {
+    return p.getChildCount() > 0
+        && (p instanceof AndPredicate || p instanceof OrPredicate || p instanceof NotPredicate);
+  }
+}
diff --git a/java/com/google/gerrit/server/index/change/ChangeIndexer.java b/java/com/google/gerrit/server/index/change/ChangeIndexer.java
new file mode 100644
index 0000000..064af64
--- /dev/null
+++ b/java/com/google/gerrit/server/index/change/ChangeIndexer.java
@@ -0,0 +1,485 @@
+// Copyright (C) 2013 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.google.gerrit.server.index.change;
+
+import static com.google.gerrit.server.git.QueueProvider.QueueType.BATCH;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.common.util.concurrent.Atomics;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.events.ChangeIndexedListener;
+import com.google.gerrit.index.Index;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.index.IndexExecutor;
+import com.google.gerrit.server.index.IndexUtils;
+import com.google.gerrit.server.logging.TraceContext;
+import com.google.gerrit.server.logging.TraceContext.TraceTimer;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.util.RequestContext;
+import com.google.gerrit.server.util.ThreadLocalRequestContext;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.OutOfScopeException;
+import com.google.inject.Provider;
+import com.google.inject.ProvisionException;
+import com.google.inject.assistedinject.Assisted;
+import com.google.inject.assistedinject.AssistedInject;
+import com.google.inject.util.Providers;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.Future;
+import java.util.concurrent.atomic.AtomicReference;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.Config;
+
+/**
+ * Helper for (re)indexing a change document.
+ *
+ * <p>Indexing is run in the background, as it may require substantial work to compute some of the
+ * fields and/or update the index.
+ */
+public class ChangeIndexer {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public interface Factory {
+    ChangeIndexer create(ListeningExecutorService executor, ChangeIndex index);
+
+    ChangeIndexer create(ListeningExecutorService executor, ChangeIndexCollection indexes);
+  }
+
+  @SuppressWarnings("deprecation")
+  public static com.google.common.util.concurrent.CheckedFuture<?, IOException> allAsList(
+      List<? extends ListenableFuture<?>> futures) {
+    // allAsList propagates the first seen exception, wrapped in
+    // ExecutionException, so we can reuse the same mapper as for a single
+    // future. Assume the actual contents of the exception are not useful to
+    // callers. All exceptions are already logged by IndexTask.
+    return Futures.makeChecked(Futures.allAsList(futures), IndexUtils.MAPPER);
+  }
+
+  @Nullable private final ChangeIndexCollection indexes;
+  @Nullable private final ChangeIndex index;
+  private final SchemaFactory<ReviewDb> schemaFactory;
+  private final NotesMigration notesMigration;
+  private final ChangeNotes.Factory changeNotesFactory;
+  private final ChangeData.Factory changeDataFactory;
+  private final ThreadLocalRequestContext context;
+  private final ListeningExecutorService batchExecutor;
+  private final ListeningExecutorService executor;
+  private final PluginSetContext<ChangeIndexedListener> indexedListeners;
+  private final StalenessChecker stalenessChecker;
+  private final boolean autoReindexIfStale;
+
+  @AssistedInject
+  ChangeIndexer(
+      @GerritServerConfig Config cfg,
+      SchemaFactory<ReviewDb> schemaFactory,
+      NotesMigration notesMigration,
+      ChangeNotes.Factory changeNotesFactory,
+      ChangeData.Factory changeDataFactory,
+      ThreadLocalRequestContext context,
+      PluginSetContext<ChangeIndexedListener> indexedListeners,
+      StalenessChecker stalenessChecker,
+      @IndexExecutor(BATCH) ListeningExecutorService batchExecutor,
+      @Assisted ListeningExecutorService executor,
+      @Assisted ChangeIndex index) {
+    this.executor = executor;
+    this.schemaFactory = schemaFactory;
+    this.notesMigration = notesMigration;
+    this.changeNotesFactory = changeNotesFactory;
+    this.changeDataFactory = changeDataFactory;
+    this.context = context;
+    this.indexedListeners = indexedListeners;
+    this.stalenessChecker = stalenessChecker;
+    this.batchExecutor = batchExecutor;
+    this.autoReindexIfStale = autoReindexIfStale(cfg);
+    this.index = index;
+    this.indexes = null;
+  }
+
+  @AssistedInject
+  ChangeIndexer(
+      SchemaFactory<ReviewDb> schemaFactory,
+      @GerritServerConfig Config cfg,
+      NotesMigration notesMigration,
+      ChangeNotes.Factory changeNotesFactory,
+      ChangeData.Factory changeDataFactory,
+      ThreadLocalRequestContext context,
+      PluginSetContext<ChangeIndexedListener> indexedListeners,
+      StalenessChecker stalenessChecker,
+      @IndexExecutor(BATCH) ListeningExecutorService batchExecutor,
+      @Assisted ListeningExecutorService executor,
+      @Assisted ChangeIndexCollection indexes) {
+    this.executor = executor;
+    this.schemaFactory = schemaFactory;
+    this.notesMigration = notesMigration;
+    this.changeNotesFactory = changeNotesFactory;
+    this.changeDataFactory = changeDataFactory;
+    this.context = context;
+    this.indexedListeners = indexedListeners;
+    this.stalenessChecker = stalenessChecker;
+    this.batchExecutor = batchExecutor;
+    this.autoReindexIfStale = autoReindexIfStale(cfg);
+    this.index = null;
+    this.indexes = indexes;
+  }
+
+  private static boolean autoReindexIfStale(Config cfg) {
+    return cfg.getBoolean("index", null, "autoReindexIfStale", false);
+  }
+
+  /**
+   * Start indexing a change.
+   *
+   * @param id change to index.
+   * @return future for the indexing task.
+   */
+  @SuppressWarnings("deprecation")
+  public com.google.common.util.concurrent.CheckedFuture<?, IOException> indexAsync(
+      Project.NameKey project, Change.Id id) {
+    return submit(new IndexTask(project, id));
+  }
+
+  /**
+   * Start indexing multiple changes in parallel.
+   *
+   * @param ids changes to index.
+   * @return future for completing indexing of all changes.
+   */
+  @SuppressWarnings("deprecation")
+  public com.google.common.util.concurrent.CheckedFuture<?, IOException> indexAsync(
+      Project.NameKey project, Collection<Change.Id> ids) {
+    List<ListenableFuture<?>> futures = new ArrayList<>(ids.size());
+    for (Change.Id id : ids) {
+      futures.add(indexAsync(project, id));
+    }
+    return allAsList(futures);
+  }
+
+  /**
+   * Synchronously index a change, then check if the index is stale due to a race condition.
+   *
+   * @param cd change to index.
+   */
+  public void index(ChangeData cd) throws IOException {
+    indexImpl(cd);
+
+    // Always double-check whether the change might be stale immediately after
+    // interactively indexing it. This fixes up the case where two writers write
+    // to the primary storage in one order, and the corresponding index writes
+    // happen in the opposite order:
+    //  1. Writer A writes to primary storage.
+    //  2. Writer B writes to primary storage.
+    //  3. Writer B updates index.
+    //  4. Writer A updates index.
+    //
+    // Without the extra reindexIfStale step, A has no way of knowing that it's
+    // about to overwrite the index document with stale data. It doesn't work to
+    // have A check for staleness before attempting its index update, because
+    // B's index update might not have happened when it does the check.
+    //
+    // With the extra reindexIfStale step after (3)/(4), we are able to detect
+    // and fix the staleness. It doesn't matter which order the two
+    // reindexIfStale calls actually execute in; we are guaranteed that at least
+    // one of them will execute after the second index write, (4).
+    autoReindexIfStale(cd);
+  }
+
+  private void indexImpl(ChangeData cd) throws IOException {
+    logger.atFine().log("Replace change %d in index.", cd.getId().get());
+    for (Index<?, ChangeData> i : getWriteIndexes()) {
+      try (TraceTimer traceTimer =
+          TraceContext.newTimer(
+              "Replacing change %d in index version %d",
+              cd.getId().get(), i.getSchema().getVersion())) {
+        i.replace(cd);
+      }
+    }
+    fireChangeIndexedEvent(cd.project().get(), cd.getId().get());
+  }
+
+  private void fireChangeIndexedEvent(String projectName, int id) {
+    indexedListeners.runEach(l -> l.onChangeIndexed(projectName, id));
+  }
+
+  private void fireChangeDeletedFromIndexEvent(int id) {
+    indexedListeners.runEach(l -> l.onChangeDeleted(id));
+  }
+
+  /**
+   * Synchronously index a change.
+   *
+   * @param db review database.
+   * @param change change to index.
+   */
+  public void index(ReviewDb db, Change change) throws IOException, OrmException {
+    index(newChangeData(db, change));
+  }
+
+  /**
+   * Synchronously index a change.
+   *
+   * @param db review database.
+   * @param project the project to which the change belongs.
+   * @param changeId ID of the change to index.
+   */
+  public void index(ReviewDb db, Project.NameKey project, Change.Id changeId)
+      throws IOException, OrmException {
+    index(newChangeData(db, project, changeId));
+  }
+
+  /**
+   * Start deleting a change.
+   *
+   * @param id change to delete.
+   * @return future for the deleting task.
+   */
+  @SuppressWarnings("deprecation")
+  public com.google.common.util.concurrent.CheckedFuture<?, IOException> deleteAsync(Change.Id id) {
+    return submit(new DeleteTask(id));
+  }
+
+  /**
+   * Synchronously delete a change.
+   *
+   * @param id change ID to delete.
+   */
+  public void delete(Change.Id id) throws IOException {
+    new DeleteTask(id).call();
+  }
+
+  /**
+   * Asynchronously check if a change is stale, and reindex if it is.
+   *
+   * <p>Always run on the batch executor, even if this indexer instance is configured to use a
+   * different executor.
+   *
+   * @param project the project to which the change belongs.
+   * @param id ID of the change to index.
+   * @return future for reindexing the change; returns true if the change was stale.
+   */
+  @SuppressWarnings("deprecation")
+  public com.google.common.util.concurrent.CheckedFuture<Boolean, IOException> reindexIfStale(
+      Project.NameKey project, Change.Id id) {
+    return submit(new ReindexIfStaleTask(project, id), batchExecutor);
+  }
+
+  private void autoReindexIfStale(ChangeData cd) {
+    autoReindexIfStale(cd.project(), cd.getId());
+  }
+
+  private void autoReindexIfStale(Project.NameKey project, Change.Id id) {
+    if (autoReindexIfStale) {
+      // Don't retry indefinitely; if this fails the change will be stale.
+      @SuppressWarnings("unused")
+      Future<?> possiblyIgnoredError = reindexIfStale(project, id);
+    }
+  }
+
+  private Collection<ChangeIndex> getWriteIndexes() {
+    return indexes != null ? indexes.getWriteIndexes() : Collections.singleton(index);
+  }
+
+  @SuppressWarnings("deprecation")
+  private <T> com.google.common.util.concurrent.CheckedFuture<T, IOException> submit(
+      Callable<T> task) {
+    return submit(task, executor);
+  }
+
+  @SuppressWarnings("deprecation")
+  private static <T> com.google.common.util.concurrent.CheckedFuture<T, IOException> submit(
+      Callable<T> task, ListeningExecutorService executor) {
+    return Futures.makeChecked(
+        Futures.nonCancellationPropagating(executor.submit(task)), IndexUtils.MAPPER);
+  }
+
+  private abstract class AbstractIndexTask<T> implements Callable<T> {
+    protected final Project.NameKey project;
+    protected final Change.Id id;
+
+    protected AbstractIndexTask(Project.NameKey project, Change.Id id) {
+      this.project = project;
+      this.id = id;
+    }
+
+    protected abstract T callImpl(Provider<ReviewDb> db) throws Exception;
+
+    @Override
+    public abstract String toString();
+
+    @Override
+    public final T call() throws Exception {
+      try {
+        final AtomicReference<Provider<ReviewDb>> dbRef = Atomics.newReference();
+        RequestContext newCtx =
+            new RequestContext() {
+              @Override
+              public Provider<ReviewDb> getReviewDbProvider() {
+                Provider<ReviewDb> db = dbRef.get();
+                if (db == null) {
+                  try {
+                    db = Providers.of(schemaFactory.open());
+                  } catch (OrmException e) {
+                    throw new ProvisionException("error opening ReviewDb", e);
+                  }
+                  dbRef.set(db);
+                }
+                return db;
+              }
+
+              @Override
+              public CurrentUser getUser() {
+                throw new OutOfScopeException("No user during ChangeIndexer");
+              }
+            };
+        RequestContext oldCtx = context.setContext(newCtx);
+        try {
+          return callImpl(newCtx.getReviewDbProvider());
+        } finally {
+          context.setContext(oldCtx);
+          Provider<ReviewDb> db = dbRef.get();
+          if (db != null) {
+            db.get().close();
+          }
+        }
+      } catch (Exception e) {
+        logger.atSevere().withCause(e).log("Failed to execute %s", this);
+        throw e;
+      }
+    }
+  }
+
+  private class IndexTask extends AbstractIndexTask<Void> {
+    private IndexTask(Project.NameKey project, Change.Id id) {
+      super(project, id);
+    }
+
+    @Override
+    public Void callImpl(Provider<ReviewDb> db) throws Exception {
+      ChangeData cd = newChangeData(db.get(), project, id);
+      index(cd);
+      return null;
+    }
+
+    @Override
+    public String toString() {
+      return "index-change-" + id;
+    }
+  }
+
+  // Not AbstractIndexTask as it doesn't need ReviewDb.
+  private class DeleteTask implements Callable<Void> {
+    private final Change.Id id;
+
+    private DeleteTask(Change.Id id) {
+      this.id = id;
+    }
+
+    @Override
+    public Void call() throws IOException {
+      logger.atFine().log("Delete change %d from index.", id.get());
+      // Don't bother setting a RequestContext to provide the DB.
+      // Implementations should not need to access the DB in order to delete a
+      // change ID.
+      for (ChangeIndex i : getWriteIndexes()) {
+        try (TraceTimer traceTimer =
+            TraceContext.newTimer(
+                "Deleteing change %d in index version %d", id.get(), i.getSchema().getVersion())) {
+          i.delete(id);
+        }
+      }
+      fireChangeDeletedFromIndexEvent(id.get());
+      return null;
+    }
+  }
+
+  private class ReindexIfStaleTask extends AbstractIndexTask<Boolean> {
+    private ReindexIfStaleTask(Project.NameKey project, Change.Id id) {
+      super(project, id);
+    }
+
+    @Override
+    public Boolean callImpl(Provider<ReviewDb> db) throws Exception {
+      try {
+        if (stalenessChecker.isStale(id)) {
+          indexImpl(newChangeData(db.get(), project, id));
+          return true;
+        }
+      } catch (NoSuchChangeException nsce) {
+        logger.atFine().log("Change %s was deleted, aborting reindexing the change.", id.get());
+      } catch (Exception e) {
+        if (!isCausedByRepositoryNotFoundException(e)) {
+          throw e;
+        }
+        logger.atFine().log(
+            "Change %s belongs to deleted project %s, aborting reindexing the change.",
+            id.get(), project.get());
+      }
+      return false;
+    }
+
+    @Override
+    public String toString() {
+      return "reindex-if-stale-change-" + id;
+    }
+  }
+
+  private boolean isCausedByRepositoryNotFoundException(Throwable throwable) {
+    while (throwable != null) {
+      if (throwable instanceof RepositoryNotFoundException) {
+        return true;
+      }
+      throwable = throwable.getCause();
+    }
+    return false;
+  }
+
+  // Avoid auto-rebuilding when reindexing if reading is disabled. This just
+  // increases contention on the meta ref from a background indexing thread
+  // with little benefit. The next actual write to the entity may still incur a
+  // less-contentious rebuild.
+  private ChangeData newChangeData(ReviewDb db, Change change) throws OrmException {
+    if (!notesMigration.readChanges()) {
+      ChangeNotes notes = changeNotesFactory.createWithAutoRebuildingDisabled(change, null);
+      return changeDataFactory.create(db, notes);
+    }
+    return changeDataFactory.create(db, change);
+  }
+
+  private ChangeData newChangeData(ReviewDb db, Project.NameKey project, Change.Id changeId)
+      throws OrmException {
+    if (!notesMigration.readChanges()) {
+      ChangeNotes notes =
+          changeNotesFactory.createWithAutoRebuildingDisabled(db, project, changeId);
+      return changeDataFactory.create(db, notes);
+    }
+    return changeDataFactory.create(db, project, changeId);
+  }
+}
diff --git a/java/com/google/gerrit/server/index/change/ChangeSchemaDefinitions.java b/java/com/google/gerrit/server/index/change/ChangeSchemaDefinitions.java
new file mode 100644
index 0000000..2000cd1
--- /dev/null
+++ b/java/com/google/gerrit/server/index/change/ChangeSchemaDefinitions.java
@@ -0,0 +1,110 @@
+// 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.
+
+package com.google.gerrit.server.index.change;
+
+import static com.google.gerrit.index.SchemaUtil.schema;
+
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.index.SchemaDefinitions;
+import com.google.gerrit.server.query.change.ChangeData;
+
+public class ChangeSchemaDefinitions extends SchemaDefinitions<ChangeData> {
+  @Deprecated
+  static final Schema<ChangeData> V39 =
+      schema(
+          ChangeField.ADDED,
+          ChangeField.APPROVAL,
+          ChangeField.ASSIGNEE,
+          ChangeField.AUTHOR,
+          ChangeField.CHANGE,
+          ChangeField.COMMENT,
+          ChangeField.COMMENTBY,
+          ChangeField.COMMIT,
+          ChangeField.COMMITTER,
+          ChangeField.COMMIT_MESSAGE,
+          ChangeField.DELETED,
+          ChangeField.DELTA,
+          ChangeField.DRAFTBY,
+          ChangeField.EDITBY,
+          ChangeField.EXACT_COMMIT,
+          ChangeField.EXACT_TOPIC,
+          ChangeField.FILE_PART,
+          ChangeField.FUZZY_TOPIC,
+          ChangeField.GROUP,
+          ChangeField.HASHTAG,
+          ChangeField.HASHTAG_CASE_AWARE,
+          ChangeField.ID,
+          ChangeField.LABEL,
+          ChangeField.LEGACY_ID,
+          ChangeField.MERGEABLE,
+          ChangeField.OWNER,
+          ChangeField.PATCH_SET,
+          ChangeField.PATH,
+          ChangeField.PROJECT,
+          ChangeField.PROJECTS,
+          ChangeField.REF,
+          ChangeField.REF_STATE,
+          ChangeField.REF_STATE_PATTERN,
+          ChangeField.REVIEWEDBY,
+          ChangeField.REVIEWER,
+          ChangeField.STAR,
+          ChangeField.STARBY,
+          ChangeField.STATUS,
+          ChangeField.STORED_SUBMIT_RECORD_LENIENT,
+          ChangeField.STORED_SUBMIT_RECORD_STRICT,
+          ChangeField.SUBMISSIONID,
+          ChangeField.SUBMIT_RECORD,
+          ChangeField.TR,
+          ChangeField.UNRESOLVED_COMMENT_COUNT,
+          ChangeField.UPDATED);
+
+  @Deprecated static final Schema<ChangeData> V40 = schema(V39, ChangeField.PRIVATE);
+  @Deprecated static final Schema<ChangeData> V41 = schema(V40, ChangeField.REVIEWER_BY_EMAIL);
+  @Deprecated static final Schema<ChangeData> V42 = schema(V41, ChangeField.WIP);
+
+  @Deprecated
+  static final Schema<ChangeData> V43 =
+      schema(V42, ChangeField.EXACT_AUTHOR, ChangeField.EXACT_COMMITTER);
+
+  @Deprecated
+  static final Schema<ChangeData> V44 =
+      schema(
+          V43,
+          ChangeField.STARTED,
+          ChangeField.PENDING_REVIEWER,
+          ChangeField.PENDING_REVIEWER_BY_EMAIL);
+
+  @Deprecated static final Schema<ChangeData> V45 = schema(V44, ChangeField.REVERT_OF);
+
+  @Deprecated static final Schema<ChangeData> V46 = schema(V45);
+
+  // Removal of draft change workflow requires reindexing
+  @Deprecated static final Schema<ChangeData> V47 = schema(V46);
+
+  // Rename of star label 'mute' to 'reviewed' requires reindexing
+  @Deprecated static final Schema<ChangeData> V48 = schema(V47);
+
+  @Deprecated static final Schema<ChangeData> V49 = schema(V48);
+
+  // Bump Lucene version requires reindexing
+  static final Schema<ChangeData> V50 = schema(V49);
+
+  public static final String NAME = "changes";
+  public static final ChangeSchemaDefinitions INSTANCE = new ChangeSchemaDefinitions();
+
+  private ChangeSchemaDefinitions() {
+    super(NAME, ChangeData.class);
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/DummyChangeIndex.java b/java/com/google/gerrit/server/index/change/DummyChangeIndex.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/index/change/DummyChangeIndex.java
rename to java/com/google/gerrit/server/index/change/DummyChangeIndex.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/IndexedChangeQuery.java b/java/com/google/gerrit/server/index/change/IndexedChangeQuery.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/index/change/IndexedChangeQuery.java
rename to java/com/google/gerrit/server/index/change/IndexedChangeQuery.java
diff --git a/java/com/google/gerrit/server/index/change/ReindexAfterRefUpdate.java b/java/com/google/gerrit/server/index/change/ReindexAfterRefUpdate.java
new file mode 100644
index 0000000..609432b
--- /dev/null
+++ b/java/com/google/gerrit/server/index/change/ReindexAfterRefUpdate.java
@@ -0,0 +1,203 @@
+// Copyright (C) 2014 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.google.gerrit.server.index.change;
+
+import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
+import static com.google.gerrit.server.query.change.ChangeData.asChanges;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.git.QueueProvider.QueueType;
+import com.google.gerrit.server.index.IndexExecutor;
+import com.google.gerrit.server.index.account.AccountIndexer;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gerrit.server.util.ManualRequestContext;
+import com.google.gerrit.server.util.OneOffRequestContext;
+import com.google.gerrit.server.util.RequestContext;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.Future;
+import org.eclipse.jgit.lib.Config;
+
+public class ReindexAfterRefUpdate implements GitReferenceUpdatedListener {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final OneOffRequestContext requestContext;
+  private final Provider<InternalChangeQuery> queryProvider;
+  private final ChangeIndexer.Factory indexerFactory;
+  private final ChangeIndexCollection indexes;
+  private final ChangeNotes.Factory notesFactory;
+  private final AllUsersName allUsersName;
+  private final AccountCache accountCache;
+  private final Provider<AccountIndexer> indexer;
+  private final ListeningExecutorService executor;
+  private final boolean enabled;
+
+  @Inject
+  ReindexAfterRefUpdate(
+      @GerritServerConfig Config cfg,
+      OneOffRequestContext requestContext,
+      Provider<InternalChangeQuery> queryProvider,
+      ChangeIndexer.Factory indexerFactory,
+      ChangeIndexCollection indexes,
+      ChangeNotes.Factory notesFactory,
+      AllUsersName allUsersName,
+      AccountCache accountCache,
+      Provider<AccountIndexer> indexer,
+      @IndexExecutor(QueueType.BATCH) ListeningExecutorService executor) {
+    this.requestContext = requestContext;
+    this.queryProvider = queryProvider;
+    this.indexerFactory = indexerFactory;
+    this.indexes = indexes;
+    this.notesFactory = notesFactory;
+    this.allUsersName = allUsersName;
+    this.accountCache = accountCache;
+    this.indexer = indexer;
+    this.executor = executor;
+    this.enabled = cfg.getBoolean("index", null, "reindexAfterRefUpdate", true);
+  }
+
+  @Override
+  public void onGitReferenceUpdated(Event event) {
+    if (allUsersName.get().equals(event.getProjectName())) {
+      Account.Id accountId = Account.Id.fromRef(event.getRefName());
+      if (accountId != null && !event.getRefName().startsWith(RefNames.REFS_STARRED_CHANGES)) {
+        try {
+          accountCache.evict(accountId);
+          indexer.get().index(accountId);
+        } catch (IOException e) {
+          logger.atSevere().withCause(e).log("Reindex account %s failed.", accountId);
+        }
+      }
+    }
+
+    if (!enabled
+        || event.getRefName().startsWith(RefNames.REFS_CHANGES)
+        || event.getRefName().startsWith(RefNames.REFS_DRAFT_COMMENTS)
+        || event.getRefName().startsWith(RefNames.REFS_USERS)) {
+      return;
+    }
+    Futures.addCallback(
+        executor.submit(new GetChanges(event)),
+        new FutureCallback<List<Change>>() {
+          @Override
+          public void onSuccess(List<Change> changes) {
+            for (Change c : changes) {
+              // Don't retry indefinitely; if this fails changes may be stale.
+              @SuppressWarnings("unused")
+              Future<?> possiblyIgnoredError = executor.submit(new Index(event, c.getId()));
+            }
+          }
+
+          @Override
+          public void onFailure(Throwable ignored) {
+            // Logged by {@link GetChanges#call()}.
+          }
+        },
+        directExecutor());
+  }
+
+  private abstract class Task<V> implements Callable<V> {
+    protected Event event;
+
+    protected Task(Event event) {
+      this.event = event;
+    }
+
+    @Override
+    public final V call() throws Exception {
+      try (ManualRequestContext ctx = requestContext.open()) {
+        return impl(ctx);
+      } catch (Exception e) {
+        logger.atSevere().withCause(e).log("Failed to reindex changes after %s", event);
+        throw e;
+      }
+    }
+
+    protected abstract V impl(RequestContext ctx) throws Exception;
+  }
+
+  private class GetChanges extends Task<List<Change>> {
+    private GetChanges(Event event) {
+      super(event);
+    }
+
+    @Override
+    protected List<Change> impl(RequestContext ctx) throws OrmException {
+      String ref = event.getRefName();
+      Project.NameKey project = new Project.NameKey(event.getProjectName());
+      if (ref.equals(RefNames.REFS_CONFIG)) {
+        return asChanges(queryProvider.get().byProjectOpen(project));
+      }
+      return asChanges(queryProvider.get().byBranchNew(new Branch.NameKey(project, ref)));
+    }
+
+    @Override
+    public String toString() {
+      return "Get changes to reindex caused by "
+          + event.getRefName()
+          + " update of project "
+          + event.getProjectName();
+    }
+  }
+
+  private class Index extends Task<Void> {
+    private final Change.Id id;
+
+    Index(Event event, Change.Id id) {
+      super(event);
+      this.id = id;
+    }
+
+    @Override
+    protected Void impl(RequestContext ctx) throws OrmException, IOException {
+      // Reload change, as some time may have passed since GetChanges.
+      ReviewDb db = ctx.getReviewDbProvider().get();
+      try {
+        Change c =
+            notesFactory
+                .createChecked(db, new Project.NameKey(event.getProjectName()), id)
+                .getChange();
+        indexerFactory.create(executor, indexes).index(db, c);
+      } catch (NoSuchChangeException e) {
+        indexerFactory.create(executor, indexes).delete(id);
+      }
+      return null;
+    }
+
+    @Override
+    public String toString() {
+      return "Index change " + id.get() + " of project " + event.getProjectName();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/index/change/StalenessChecker.java b/java/com/google/gerrit/server/index/change/StalenessChecker.java
new file mode 100644
index 0000000..cf7db6f
--- /dev/null
+++ b/java/com/google/gerrit/server/index/change/StalenessChecker.java
@@ -0,0 +1,265 @@
+// 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.
+
+package com.google.gerrit.server.index.change;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Objects.requireNonNull;
+import static java.util.stream.Collectors.joining;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Splitter;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.collect.SetMultimap;
+import com.google.common.collect.Sets;
+import com.google.common.collect.Streams;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.restapi.Url;
+import com.google.gerrit.index.IndexConfig;
+import com.google.gerrit.index.RefState;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.UsedAt;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import java.util.regex.Pattern;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+
+@Singleton
+public class StalenessChecker {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static final ImmutableSet<String> FIELDS =
+      ImmutableSet.of(
+          ChangeField.CHANGE.getName(),
+          ChangeField.REF_STATE.getName(),
+          ChangeField.REF_STATE_PATTERN.getName());
+
+  private final ChangeIndexCollection indexes;
+  private final GitRepositoryManager repoManager;
+  private final IndexConfig indexConfig;
+  private final Provider<ReviewDb> db;
+
+  @Inject
+  StalenessChecker(
+      ChangeIndexCollection indexes,
+      GitRepositoryManager repoManager,
+      IndexConfig indexConfig,
+      Provider<ReviewDb> db) {
+    this.indexes = indexes;
+    this.repoManager = repoManager;
+    this.indexConfig = indexConfig;
+    this.db = db;
+  }
+
+  public boolean isStale(Change.Id id) throws IOException, OrmException {
+    ChangeIndex i = indexes.getSearchIndex();
+    if (i == null) {
+      return false; // No index; caller couldn't do anything if it is stale.
+    }
+    if (!i.getSchema().hasField(ChangeField.REF_STATE)
+        || !i.getSchema().hasField(ChangeField.REF_STATE_PATTERN)) {
+      return false; // Index version not new enough for this check.
+    }
+
+    Optional<ChangeData> result =
+        i.get(id, IndexedChangeQuery.createOptions(indexConfig, 0, 1, FIELDS));
+    if (!result.isPresent()) {
+      return true; // Not in index, but caller wants it to be.
+    }
+    ChangeData cd = result.get();
+    return isStale(
+        repoManager,
+        id,
+        cd.change(),
+        ChangeNotes.readOneReviewDbChange(db.get(), id),
+        parseStates(cd),
+        parsePatterns(cd));
+  }
+
+  @UsedAt(UsedAt.Project.GOOGLE)
+  public static boolean isStale(
+      GitRepositoryManager repoManager,
+      Change.Id id,
+      Change indexChange,
+      @Nullable Change reviewDbChange,
+      SetMultimap<Project.NameKey, RefState> states,
+      ListMultimap<Project.NameKey, RefStatePattern> patterns) {
+    return reviewDbChangeIsStale(indexChange, reviewDbChange)
+        || refsAreStale(repoManager, id, states, patterns);
+  }
+
+  @VisibleForTesting
+  static boolean refsAreStale(
+      GitRepositoryManager repoManager,
+      Change.Id id,
+      SetMultimap<Project.NameKey, RefState> states,
+      ListMultimap<Project.NameKey, RefStatePattern> patterns) {
+    Set<Project.NameKey> projects = Sets.union(states.keySet(), patterns.keySet());
+
+    for (Project.NameKey p : projects) {
+      if (refsAreStale(repoManager, id, p, states, patterns)) {
+        return true;
+      }
+    }
+
+    return false;
+  }
+
+  @VisibleForTesting
+  static boolean reviewDbChangeIsStale(Change indexChange, @Nullable Change reviewDbChange) {
+    requireNonNull(indexChange);
+    PrimaryStorage storageFromIndex = PrimaryStorage.of(indexChange);
+    PrimaryStorage storageFromReviewDb = PrimaryStorage.of(reviewDbChange);
+    if (reviewDbChange == null) {
+      if (storageFromIndex == PrimaryStorage.REVIEW_DB) {
+        return true; // Index says it should have been in ReviewDb, but it wasn't.
+      }
+      return false; // Not in ReviewDb, but that's ok.
+    }
+    checkArgument(
+        indexChange.getId().equals(reviewDbChange.getId()),
+        "mismatched change ID: %s != %s",
+        indexChange.getId(),
+        reviewDbChange.getId());
+    if (storageFromIndex != storageFromReviewDb) {
+      return true; // Primary storage differs, definitely stale.
+    }
+    if (storageFromReviewDb != PrimaryStorage.REVIEW_DB) {
+      return false; // Not a ReviewDb change, don't check rowVersion.
+    }
+    return reviewDbChange.getRowVersion() != indexChange.getRowVersion();
+  }
+
+  private SetMultimap<Project.NameKey, RefState> parseStates(ChangeData cd) {
+    return RefState.parseStates(cd.getRefStates());
+  }
+
+  private ListMultimap<Project.NameKey, RefStatePattern> parsePatterns(ChangeData cd) {
+    return parsePatterns(cd.getRefStatePatterns());
+  }
+
+  public static ListMultimap<Project.NameKey, RefStatePattern> parsePatterns(
+      Iterable<byte[]> patterns) {
+    RefStatePattern.check(patterns != null, null);
+    ListMultimap<Project.NameKey, RefStatePattern> result =
+        MultimapBuilder.hashKeys().arrayListValues().build();
+    for (byte[] b : patterns) {
+      RefStatePattern.check(b != null, null);
+      String s = new String(b, UTF_8);
+      List<String> parts = Splitter.on(':').splitToList(s);
+      RefStatePattern.check(parts.size() == 2, s);
+      result.put(
+          new Project.NameKey(Url.decode(parts.get(0))), RefStatePattern.create(parts.get(1)));
+    }
+    return result;
+  }
+
+  private static boolean refsAreStale(
+      GitRepositoryManager repoManager,
+      Change.Id id,
+      Project.NameKey project,
+      SetMultimap<Project.NameKey, RefState> allStates,
+      ListMultimap<Project.NameKey, RefStatePattern> allPatterns) {
+    try (Repository repo = repoManager.openRepository(project)) {
+      Set<RefState> states = allStates.get(project);
+      for (RefState state : states) {
+        if (!state.match(repo)) {
+          return true;
+        }
+      }
+      for (RefStatePattern pattern : allPatterns.get(project)) {
+        if (!pattern.match(repo, states)) {
+          return true;
+        }
+      }
+      return false;
+    } catch (IOException e) {
+      logger.atWarning().withCause(e).log("error checking staleness of %s in %s", id, project);
+      return true;
+    }
+  }
+
+  /**
+   * Pattern for matching refs.
+   *
+   * <p>Similar to '*' syntax for native Git refspecs, but slightly more powerful: the pattern may
+   * contain arbitrarily many asterisks. There must be at least one '*' and the first one must
+   * immediately follow a '/'.
+   */
+  @AutoValue
+  public abstract static class RefStatePattern {
+    static RefStatePattern create(String pattern) {
+      int star = pattern.indexOf('*');
+      check(star > 0 && pattern.charAt(star - 1) == '/', pattern);
+      String prefix = pattern.substring(0, star);
+      check(Repository.isValidRefName(pattern.replace('*', 'x')), pattern);
+
+      // Quote everything except the '*'s, which become ".*".
+      String regex =
+          Streams.stream(Splitter.on('*').split(pattern))
+              .map(Pattern::quote)
+              .collect(joining(".*", "^", "$"));
+      return new AutoValue_StalenessChecker_RefStatePattern(
+          pattern, prefix, Pattern.compile(regex));
+    }
+
+    byte[] toByteArray(Project.NameKey project) {
+      return (project.toString() + ':' + pattern()).getBytes(UTF_8);
+    }
+
+    private static void check(boolean condition, String str) {
+      checkArgument(condition, "invalid RefStatePattern: %s", str);
+    }
+
+    abstract String pattern();
+
+    abstract String prefix();
+
+    abstract Pattern regex();
+
+    boolean match(String refName) {
+      return regex().matcher(refName).find();
+    }
+
+    private boolean match(Repository repo, Set<RefState> expected) throws IOException {
+      for (Ref r : repo.getRefDatabase().getRefsByPrefix(prefix())) {
+        if (!match(r.getName())) {
+          continue;
+        }
+        if (!expected.contains(RefState.of(r))) {
+          return false;
+        }
+      }
+      return true;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/index/group/AllGroupsIndexer.java b/java/com/google/gerrit/server/index/group/AllGroupsIndexer.java
new file mode 100644
index 0000000..3474934
--- /dev/null
+++ b/java/com/google/gerrit/server/index/group/AllGroupsIndexer.java
@@ -0,0 +1,136 @@
+// Copyright (C) 2017 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.google.gerrit.server.index.group;
+
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static com.google.gerrit.server.git.QueueProvider.QueueType.BATCH;
+
+import com.google.common.base.Stopwatch;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.index.SiteIndexer;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.account.GroupCache;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.group.db.Groups;
+import com.google.gerrit.server.group.db.GroupsNoteDbConsistencyChecker;
+import com.google.gerrit.server.index.IndexExecutor;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.ProgressMonitor;
+import org.eclipse.jgit.lib.TextProgressMonitor;
+
+@Singleton
+public class AllGroupsIndexer extends SiteIndexer<AccountGroup.UUID, InternalGroup, GroupIndex> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final ListeningExecutorService executor;
+  private final GroupCache groupCache;
+  private final Groups groups;
+
+  @Inject
+  AllGroupsIndexer(
+      @IndexExecutor(BATCH) ListeningExecutorService executor,
+      GroupCache groupCache,
+      Groups groups) {
+    this.executor = executor;
+    this.groupCache = groupCache;
+    this.groups = groups;
+  }
+
+  @Override
+  public SiteIndexer.Result indexAll(GroupIndex index) {
+    ProgressMonitor progress = new TextProgressMonitor(newPrintWriter(progressOut));
+    progress.start(2);
+    Stopwatch sw = Stopwatch.createStarted();
+    List<AccountGroup.UUID> uuids;
+    try {
+      uuids = collectGroups(progress);
+    } catch (IOException | ConfigInvalidException e) {
+      logger.atSevere().withCause(e).log("Error collecting groups");
+      return new SiteIndexer.Result(sw, false, 0, 0);
+    }
+    return reindexGroups(index, uuids, progress);
+  }
+
+  private SiteIndexer.Result reindexGroups(
+      GroupIndex index, List<AccountGroup.UUID> uuids, ProgressMonitor progress) {
+    progress.beginTask("Reindexing groups", uuids.size());
+    List<ListenableFuture<?>> futures = new ArrayList<>(uuids.size());
+    AtomicBoolean ok = new AtomicBoolean(true);
+    AtomicInteger done = new AtomicInteger();
+    AtomicInteger failed = new AtomicInteger();
+    Stopwatch sw = Stopwatch.createStarted();
+    for (AccountGroup.UUID uuid : uuids) {
+      String desc = "group " + uuid;
+      ListenableFuture<?> future =
+          executor.submit(
+              () -> {
+                try {
+                  groupCache.evict(uuid);
+                  Optional<InternalGroup> internalGroup = groupCache.get(uuid);
+                  if (internalGroup.isPresent()) {
+                    index.replace(internalGroup.get());
+                  } else {
+                    index.delete(uuid);
+
+                    // The UUID here is read from group name notes. If it fails to load from group
+                    // cache, there exists an inconsistency.
+                    GroupsNoteDbConsistencyChecker.logFailToLoadFromGroupRefAsWarning(uuid);
+                  }
+                  verboseWriter.println("Reindexed " + desc);
+                  done.incrementAndGet();
+                } catch (Exception e) {
+                  failed.incrementAndGet();
+                  throw e;
+                }
+                return null;
+              });
+      addErrorListener(future, desc, progress, ok);
+      futures.add(future);
+    }
+
+    try {
+      Futures.successfulAsList(futures).get();
+    } catch (ExecutionException | InterruptedException e) {
+      logger.atSevere().withCause(e).log("Error waiting on group futures");
+      return new SiteIndexer.Result(sw, false, 0, 0);
+    }
+
+    progress.endTask();
+    return new SiteIndexer.Result(sw, ok.get(), done.get(), failed.get());
+  }
+
+  private List<AccountGroup.UUID> collectGroups(ProgressMonitor progress)
+      throws IOException, ConfigInvalidException {
+    progress.beginTask("Collecting groups", ProgressMonitor.UNKNOWN);
+    try {
+      return groups.getAllGroupReferences().map(GroupReference::getUUID).collect(toImmutableList());
+    } finally {
+      progress.endTask();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/index/group/GroupField.java b/java/com/google/gerrit/server/index/group/GroupField.java
new file mode 100644
index 0000000..29e3867
--- /dev/null
+++ b/java/com/google/gerrit/server/index/group/GroupField.java
@@ -0,0 +1,89 @@
+// Copyright (C) 2017 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.google.gerrit.server.index.group;
+
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static com.google.gerrit.index.FieldDef.exact;
+import static com.google.gerrit.index.FieldDef.fullText;
+import static com.google.gerrit.index.FieldDef.integer;
+import static com.google.gerrit.index.FieldDef.prefix;
+import static com.google.gerrit.index.FieldDef.storedOnly;
+import static com.google.gerrit.index.FieldDef.timestamp;
+
+import com.google.common.base.MoreObjects;
+import com.google.gerrit.index.FieldDef;
+import com.google.gerrit.index.SchemaUtil;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.group.InternalGroup;
+import java.sql.Timestamp;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+
+/** Secondary index schemas for groups. */
+public class GroupField {
+  /** Legacy group ID. */
+  public static final FieldDef<InternalGroup, Integer> ID =
+      integer("id").build(g -> g.getId().get());
+
+  /** Group UUID. */
+  public static final FieldDef<InternalGroup, String> UUID =
+      exact("uuid").stored().build(g -> g.getGroupUUID().get());
+
+  /** Group owner UUID. */
+  public static final FieldDef<InternalGroup, String> OWNER_UUID =
+      exact("owner_uuid").build(g -> g.getOwnerGroupUUID().get());
+
+  /** Timestamp indicating when this group was created. */
+  public static final FieldDef<InternalGroup, Timestamp> CREATED_ON =
+      timestamp("created_on").build(InternalGroup::getCreatedOn);
+
+  /** Group name. */
+  public static final FieldDef<InternalGroup, String> NAME =
+      exact("name").build(InternalGroup::getName);
+
+  /** Prefix match on group name parts. */
+  public static final FieldDef<InternalGroup, Iterable<String>> NAME_PART =
+      prefix("name_part").buildRepeatable(g -> SchemaUtil.getNameParts(g.getName()));
+
+  /** Group description. */
+  public static final FieldDef<InternalGroup, String> DESCRIPTION =
+      fullText("description").build(InternalGroup::getDescription);
+
+  /** Whether the group is visible to all users. */
+  public static final FieldDef<InternalGroup, String> IS_VISIBLE_TO_ALL =
+      exact("is_visible_to_all").build(g -> g.isVisibleToAll() ? "1" : "0");
+
+  public static final FieldDef<InternalGroup, Iterable<Integer>> MEMBER =
+      integer("member")
+          .buildRepeatable(
+              g -> g.getMembers().stream().map(Account.Id::get).collect(toImmutableList()));
+
+  public static final FieldDef<InternalGroup, Iterable<String>> SUBGROUP =
+      exact("subgroup")
+          .buildRepeatable(
+              g ->
+                  g.getSubgroups().stream().map(AccountGroup.UUID::get).collect(toImmutableList()));
+
+  /** ObjectId of HEAD:refs/groups/<UUID>. */
+  public static final FieldDef<InternalGroup, byte[]> REF_STATE =
+      storedOnly("ref_state")
+          .build(
+              g -> {
+                byte[] a = new byte[Constants.OBJECT_ID_STRING_LENGTH];
+                MoreObjects.firstNonNull(g.getRefState(), ObjectId.zeroId()).copyTo(a, 0);
+                return a;
+              });
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndex.java b/java/com/google/gerrit/server/index/group/GroupIndex.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndex.java
rename to java/com/google/gerrit/server/index/group/GroupIndex.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexCollection.java b/java/com/google/gerrit/server/index/group/GroupIndexCollection.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexCollection.java
rename to java/com/google/gerrit/server/index/group/GroupIndexCollection.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexDefinition.java b/java/com/google/gerrit/server/index/group/GroupIndexDefinition.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/index/group/GroupIndexDefinition.java
rename to java/com/google/gerrit/server/index/group/GroupIndexDefinition.java
diff --git a/java/com/google/gerrit/server/index/group/GroupIndexRewriter.java b/java/com/google/gerrit/server/index/group/GroupIndexRewriter.java
new file mode 100644
index 0000000..157c01a
--- /dev/null
+++ b/java/com/google/gerrit/server/index/group/GroupIndexRewriter.java
@@ -0,0 +1,43 @@
+// Copyright (C) 2017 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.google.gerrit.server.index.group;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.gerrit.index.IndexRewriter;
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GroupIndexRewriter implements IndexRewriter<InternalGroup> {
+  private final GroupIndexCollection indexes;
+
+  @Inject
+  GroupIndexRewriter(GroupIndexCollection indexes) {
+    this.indexes = indexes;
+  }
+
+  @Override
+  public Predicate<InternalGroup> rewrite(Predicate<InternalGroup> in, QueryOptions opts)
+      throws QueryParseException {
+    GroupIndex index = indexes.getSearchIndex();
+    requireNonNull(index, "no active search index configured for groups");
+    return new IndexedGroupQuery(index, in, opts);
+  }
+}
diff --git a/java/com/google/gerrit/server/index/group/GroupIndexer.java b/java/com/google/gerrit/server/index/group/GroupIndexer.java
new file mode 100644
index 0000000..503fd6b
--- /dev/null
+++ b/java/com/google/gerrit/server/index/group/GroupIndexer.java
@@ -0,0 +1,36 @@
+// Copyright (C) 2017 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.google.gerrit.server.index.group;
+
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import java.io.IOException;
+
+public interface GroupIndexer {
+
+  /**
+   * Synchronously index a group.
+   *
+   * @param uuid group UUID to index.
+   */
+  void index(AccountGroup.UUID uuid) throws IOException;
+
+  /**
+   * Synchronously reindex a group if it is stale.
+   *
+   * @param uuid group UUID to index.
+   * @return whether the group was reindexed
+   */
+  boolean reindexIfStale(AccountGroup.UUID uuid) throws IOException;
+}
diff --git a/java/com/google/gerrit/server/index/group/GroupIndexerImpl.java b/java/com/google/gerrit/server/index/group/GroupIndexerImpl.java
new file mode 100644
index 0000000..a9124e1
--- /dev/null
+++ b/java/com/google/gerrit/server/index/group/GroupIndexerImpl.java
@@ -0,0 +1,126 @@
+// Copyright (C) 2017 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.google.gerrit.server.index.group;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.events.GroupIndexedListener;
+import com.google.gerrit.index.Index;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.account.GroupCache;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.logging.TraceContext;
+import com.google.gerrit.server.logging.TraceContext.TraceTimer;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.inject.assistedinject.Assisted;
+import com.google.inject.assistedinject.AssistedInject;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Optional;
+
+public class GroupIndexerImpl implements GroupIndexer {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public interface Factory {
+    GroupIndexerImpl create(GroupIndexCollection indexes);
+
+    GroupIndexerImpl create(@Nullable GroupIndex index);
+  }
+
+  private final GroupCache groupCache;
+  private final PluginSetContext<GroupIndexedListener> indexedListener;
+  private final StalenessChecker stalenessChecker;
+  @Nullable private final GroupIndexCollection indexes;
+  @Nullable private final GroupIndex index;
+
+  @AssistedInject
+  GroupIndexerImpl(
+      GroupCache groupCache,
+      PluginSetContext<GroupIndexedListener> indexedListener,
+      StalenessChecker stalenessChecker,
+      @Assisted GroupIndexCollection indexes) {
+    this.groupCache = groupCache;
+    this.indexedListener = indexedListener;
+    this.stalenessChecker = stalenessChecker;
+    this.indexes = indexes;
+    this.index = null;
+  }
+
+  @AssistedInject
+  GroupIndexerImpl(
+      GroupCache groupCache,
+      PluginSetContext<GroupIndexedListener> indexedListener,
+      StalenessChecker stalenessChecker,
+      @Assisted @Nullable GroupIndex index) {
+    this.groupCache = groupCache;
+    this.indexedListener = indexedListener;
+    this.stalenessChecker = stalenessChecker;
+    this.indexes = null;
+    this.index = index;
+  }
+
+  @Override
+  public void index(AccountGroup.UUID uuid) throws IOException {
+    // Evict the cache to get an up-to-date value for sure.
+    groupCache.evict(uuid);
+    Optional<InternalGroup> internalGroup = groupCache.get(uuid);
+
+    if (internalGroup.isPresent()) {
+      logger.atFine().log("Replace group %s in index", uuid.get());
+    } else {
+      logger.atFine().log("Delete group %s from index", uuid.get());
+    }
+
+    for (Index<AccountGroup.UUID, InternalGroup> i : getWriteIndexes()) {
+      if (internalGroup.isPresent()) {
+        try (TraceTimer traceTimer =
+            TraceContext.newTimer(
+                "Replacing group %s in index version %d", uuid.get(), i.getSchema().getVersion())) {
+          i.replace(internalGroup.get());
+        }
+      } else {
+        try (TraceTimer traceTimer =
+            TraceContext.newTimer(
+                "Deleting group %s in index version %d", uuid.get(), i.getSchema().getVersion())) {
+          i.delete(uuid);
+        }
+      }
+    }
+    fireGroupIndexedEvent(uuid.get());
+  }
+
+  @Override
+  public boolean reindexIfStale(AccountGroup.UUID uuid) throws IOException {
+    if (stalenessChecker.isStale(uuid)) {
+      index(uuid);
+      return true;
+    }
+    return false;
+  }
+
+  private void fireGroupIndexedEvent(String uuid) {
+    indexedListener.runEach(l -> l.onGroupIndexed(uuid));
+  }
+
+  private Collection<GroupIndex> getWriteIndexes() {
+    if (indexes != null) {
+      return indexes.getWriteIndexes();
+    }
+
+    return index != null ? Collections.singleton(index) : ImmutableSet.of();
+  }
+}
diff --git a/java/com/google/gerrit/server/index/group/GroupSchemaDefinitions.java b/java/com/google/gerrit/server/index/group/GroupSchemaDefinitions.java
new file mode 100644
index 0000000..6d0f3b6
--- /dev/null
+++ b/java/com/google/gerrit/server/index/group/GroupSchemaDefinitions.java
@@ -0,0 +1,53 @@
+// Copyright (C) 2017 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.google.gerrit.server.index.group;
+
+import static com.google.gerrit.index.SchemaUtil.schema;
+
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.index.SchemaDefinitions;
+import com.google.gerrit.server.group.InternalGroup;
+
+public class GroupSchemaDefinitions extends SchemaDefinitions<InternalGroup> {
+  @Deprecated
+  static final Schema<InternalGroup> V2 =
+      schema(
+          GroupField.DESCRIPTION,
+          GroupField.ID,
+          GroupField.IS_VISIBLE_TO_ALL,
+          GroupField.NAME,
+          GroupField.NAME_PART,
+          GroupField.OWNER_UUID,
+          GroupField.UUID);
+
+  @Deprecated static final Schema<InternalGroup> V3 = schema(V2, GroupField.CREATED_ON);
+
+  @Deprecated
+  static final Schema<InternalGroup> V4 = schema(V3, GroupField.MEMBER, GroupField.SUBGROUP);
+
+  @Deprecated static final Schema<InternalGroup> V5 = schema(V4, GroupField.REF_STATE);
+
+  // Bump Lucene version requires reindexing
+  @Deprecated static final Schema<InternalGroup> V6 = schema(V5);
+
+  // Lucene index was changed to add an additional field for sorting.
+  static final Schema<InternalGroup> V7 = schema(V6);
+
+  public static final GroupSchemaDefinitions INSTANCE = new GroupSchemaDefinitions();
+
+  private GroupSchemaDefinitions() {
+    super("groups", InternalGroup.class);
+  }
+}
diff --git a/java/com/google/gerrit/server/index/group/IndexedGroupQuery.java b/java/com/google/gerrit/server/index/group/IndexedGroupQuery.java
new file mode 100644
index 0000000..79f25c0
--- /dev/null
+++ b/java/com/google/gerrit/server/index/group/IndexedGroupQuery.java
@@ -0,0 +1,49 @@
+// Copyright (C) 2017 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.google.gerrit.server.index.group;
+
+import com.google.gerrit.index.Index;
+import com.google.gerrit.index.IndexConfig;
+import com.google.gerrit.index.IndexedQuery;
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.query.DataSource;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.group.InternalGroup;
+import java.util.HashSet;
+import java.util.Set;
+
+public class IndexedGroupQuery extends IndexedQuery<AccountGroup.UUID, InternalGroup>
+    implements DataSource<InternalGroup> {
+
+  public static QueryOptions createOptions(
+      IndexConfig config, int start, int limit, Set<String> fields) {
+    // Always include GroupField.UUID since it is needed to load the group from NoteDb.
+    if (!fields.contains(GroupField.UUID.getName())) {
+      fields = new HashSet<>(fields);
+      fields.add(GroupField.UUID.getName());
+    }
+    return QueryOptions.create(config, start, limit, fields);
+  }
+
+  public IndexedGroupQuery(
+      Index<AccountGroup.UUID, InternalGroup> index,
+      Predicate<InternalGroup> pred,
+      QueryOptions opts)
+      throws QueryParseException {
+    super(index, pred, opts.convertForBackend());
+  }
+}
diff --git a/java/com/google/gerrit/server/index/group/StalenessChecker.java b/java/com/google/gerrit/server/index/group/StalenessChecker.java
new file mode 100644
index 0000000..7900287
--- /dev/null
+++ b/java/com/google/gerrit/server/index/group/StalenessChecker.java
@@ -0,0 +1,86 @@
+// Copyright (C) 2017 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.google.gerrit.server.index.group;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.index.IndexConfig;
+import com.google.gerrit.index.query.FieldBundle;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Optional;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+
+/**
+ * Checks if documents in the group index are stale.
+ *
+ * <p>An index document is considered stale if the stored SHA1 differs from the HEAD SHA1 of the
+ * groups branch.
+ *
+ * <p>Note: This only applies to NoteDb.
+ */
+@Singleton
+public class StalenessChecker {
+  public static final ImmutableSet<String> FIELDS =
+      ImmutableSet.of(GroupField.UUID.getName(), GroupField.REF_STATE.getName());
+
+  private final GroupIndexCollection indexes;
+  private final GitRepositoryManager repoManager;
+  private final IndexConfig indexConfig;
+  private final AllUsersName allUsers;
+
+  @Inject
+  StalenessChecker(
+      GroupIndexCollection indexes,
+      GitRepositoryManager repoManager,
+      IndexConfig indexConfig,
+      AllUsersName allUsers) {
+    this.indexes = indexes;
+    this.repoManager = repoManager;
+    this.indexConfig = indexConfig;
+    this.allUsers = allUsers;
+  }
+
+  public boolean isStale(AccountGroup.UUID uuid) throws IOException {
+    GroupIndex i = indexes.getSearchIndex();
+    if (i == null) {
+      return false; // No index; caller couldn't do anything if it is stale.
+    }
+
+    Optional<FieldBundle> result =
+        i.getRaw(uuid, IndexedGroupQuery.createOptions(indexConfig, 0, 1, FIELDS));
+    if (!result.isPresent()) {
+      // The document is missing in the index.
+      try (Repository repo = repoManager.openRepository(allUsers)) {
+        Ref ref = repo.exactRef(RefNames.refsGroups(uuid));
+
+        // Stale if the group actually exists.
+        return ref != null;
+      }
+    }
+
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      Ref ref = repo.exactRef(RefNames.refsGroups(uuid));
+      ObjectId head = ref == null ? ObjectId.zeroId() : ref.getObjectId();
+      return !head.equals(ObjectId.fromString(result.get().getValue(GroupField.REF_STATE), 0));
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/index/project/AllProjectsIndexer.java b/java/com/google/gerrit/server/index/project/AllProjectsIndexer.java
new file mode 100644
index 0000000..305cd25
--- /dev/null
+++ b/java/com/google/gerrit/server/index/project/AllProjectsIndexer.java
@@ -0,0 +1,110 @@
+// Copyright (C) 2017 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.google.gerrit.server.index.project;
+
+import static com.google.gerrit.server.git.QueueProvider.QueueType.BATCH;
+
+import com.google.common.base.Stopwatch;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.gerrit.index.SiteIndexer;
+import com.google.gerrit.index.project.ProjectData;
+import com.google.gerrit.index.project.ProjectIndex;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.index.IndexExecutor;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.eclipse.jgit.lib.ProgressMonitor;
+import org.eclipse.jgit.lib.TextProgressMonitor;
+
+@Singleton
+public class AllProjectsIndexer extends SiteIndexer<Project.NameKey, ProjectData, ProjectIndex> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final ListeningExecutorService executor;
+  private final ProjectCache projectCache;
+
+  @Inject
+  AllProjectsIndexer(
+      @IndexExecutor(BATCH) ListeningExecutorService executor, ProjectCache projectCache) {
+    this.executor = executor;
+    this.projectCache = projectCache;
+  }
+
+  @Override
+  public SiteIndexer.Result indexAll(final ProjectIndex index) {
+    ProgressMonitor progress = new TextProgressMonitor(newPrintWriter(progressOut));
+    progress.start(2);
+    List<Project.NameKey> names = collectProjects(progress);
+    return reindexProjects(index, names, progress);
+  }
+
+  private SiteIndexer.Result reindexProjects(
+      ProjectIndex index, List<Project.NameKey> names, ProgressMonitor progress) {
+    progress.beginTask("Reindexing projects", names.size());
+    List<ListenableFuture<?>> futures = new ArrayList<>(names.size());
+    AtomicBoolean ok = new AtomicBoolean(true);
+    AtomicInteger done = new AtomicInteger();
+    AtomicInteger failed = new AtomicInteger();
+    Stopwatch sw = Stopwatch.createStarted();
+    for (Project.NameKey name : names) {
+      String desc = "project " + name;
+      ListenableFuture<?> future =
+          executor.submit(
+              () -> {
+                try {
+                  projectCache.evict(name);
+                  index.replace(projectCache.get(name).toProjectData());
+                  verboseWriter.println("Reindexed " + desc);
+                  done.incrementAndGet();
+                } catch (Exception e) {
+                  failed.incrementAndGet();
+                  throw e;
+                }
+                return null;
+              });
+      addErrorListener(future, desc, progress, ok);
+      futures.add(future);
+    }
+
+    try {
+      Futures.successfulAsList(futures).get();
+    } catch (ExecutionException | InterruptedException e) {
+      logger.atSevere().withCause(e).log("Error waiting on project futures");
+      return new SiteIndexer.Result(sw, false, 0, 0);
+    }
+
+    progress.endTask();
+    return new SiteIndexer.Result(sw, ok.get(), done.get(), failed.get());
+  }
+
+  private List<Project.NameKey> collectProjects(ProgressMonitor progress) {
+    progress.beginTask("Collecting projects", ProgressMonitor.UNKNOWN);
+    List<Project.NameKey> names = new ArrayList<>();
+    for (Project.NameKey nameKey : projectCache.all()) {
+      names.add(nameKey);
+    }
+    progress.endTask();
+    return names;
+  }
+}
diff --git a/java/com/google/gerrit/server/index/project/ProjectIndexDefinition.java b/java/com/google/gerrit/server/index/project/ProjectIndexDefinition.java
new file mode 100644
index 0000000..ce2b634
--- /dev/null
+++ b/java/com/google/gerrit/server/index/project/ProjectIndexDefinition.java
@@ -0,0 +1,36 @@
+// Copyright (C) 2017 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.google.gerrit.server.index.project;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.index.IndexDefinition;
+import com.google.gerrit.index.project.ProjectData;
+import com.google.gerrit.index.project.ProjectIndex;
+import com.google.gerrit.index.project.ProjectIndexCollection;
+import com.google.gerrit.index.project.ProjectSchemaDefinitions;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.inject.Inject;
+
+public class ProjectIndexDefinition
+    extends IndexDefinition<Project.NameKey, ProjectData, ProjectIndex> {
+
+  @Inject
+  ProjectIndexDefinition(
+      ProjectIndexCollection indexCollection,
+      ProjectIndex.Factory indexFactory,
+      @Nullable AllProjectsIndexer allProjectsIndexer) {
+    super(ProjectSchemaDefinitions.INSTANCE, indexCollection, indexFactory, allProjectsIndexer);
+  }
+}
diff --git a/java/com/google/gerrit/server/index/project/ProjectIndexerImpl.java b/java/com/google/gerrit/server/index/project/ProjectIndexerImpl.java
new file mode 100644
index 0000000..1a74eca
--- /dev/null
+++ b/java/com/google/gerrit/server/index/project/ProjectIndexerImpl.java
@@ -0,0 +1,112 @@
+// Copyright (C) 2017 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.google.gerrit.server.index.project;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.events.ProjectIndexedListener;
+import com.google.gerrit.index.project.ProjectData;
+import com.google.gerrit.index.project.ProjectIndex;
+import com.google.gerrit.index.project.ProjectIndexCollection;
+import com.google.gerrit.index.project.ProjectIndexer;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.logging.TraceContext;
+import com.google.gerrit.server.logging.TraceContext.TraceTimer;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.inject.assistedinject.Assisted;
+import com.google.inject.assistedinject.AssistedInject;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Collections;
+
+public class ProjectIndexerImpl implements ProjectIndexer {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public interface Factory {
+    ProjectIndexerImpl create(ProjectIndexCollection indexes);
+
+    ProjectIndexerImpl create(@Nullable ProjectIndex index);
+  }
+
+  private final ProjectCache projectCache;
+  private final PluginSetContext<ProjectIndexedListener> indexedListener;
+  @Nullable private final ProjectIndexCollection indexes;
+  @Nullable private final ProjectIndex index;
+
+  @AssistedInject
+  ProjectIndexerImpl(
+      ProjectCache projectCache,
+      PluginSetContext<ProjectIndexedListener> indexedListener,
+      @Assisted ProjectIndexCollection indexes) {
+    this.projectCache = projectCache;
+    this.indexedListener = indexedListener;
+    this.indexes = indexes;
+    this.index = null;
+  }
+
+  @AssistedInject
+  ProjectIndexerImpl(
+      ProjectCache projectCache,
+      PluginSetContext<ProjectIndexedListener> indexedListener,
+      @Assisted @Nullable ProjectIndex index) {
+    this.projectCache = projectCache;
+    this.indexedListener = indexedListener;
+    this.indexes = null;
+    this.index = index;
+  }
+
+  @Override
+  public void index(Project.NameKey nameKey) throws IOException {
+    ProjectState projectState = projectCache.get(nameKey);
+    if (projectState != null) {
+      logger.atFine().log("Replace project %s in index", nameKey.get());
+      ProjectData projectData = projectState.toProjectData();
+      for (ProjectIndex i : getWriteIndexes()) {
+        try (TraceTimer traceTimer =
+            TraceContext.newTimer(
+                "Replacing project %s in index version %d",
+                nameKey.get(), i.getSchema().getVersion())) {
+          i.replace(projectData);
+        }
+      }
+      fireProjectIndexedEvent(nameKey.get());
+    } else {
+      logger.atFine().log("Delete project %s from index", nameKey.get());
+      for (ProjectIndex i : getWriteIndexes()) {
+        try (TraceTimer traceTimer =
+            TraceContext.newTimer(
+                "Deleting project %s in index version %d",
+                nameKey.get(), i.getSchema().getVersion())) {
+          i.delete(nameKey);
+        }
+      }
+    }
+  }
+
+  private void fireProjectIndexedEvent(String name) {
+    indexedListener.runEach(l -> l.onProjectIndexed(name));
+  }
+
+  private Collection<ProjectIndex> getWriteIndexes() {
+    if (indexes != null) {
+      return indexes.getWriteIndexes();
+    }
+
+    return index != null ? Collections.singleton(index) : ImmutableSet.of();
+  }
+}
diff --git a/java/com/google/gerrit/server/index/project/StalenessChecker.java b/java/com/google/gerrit/server/index/project/StalenessChecker.java
new file mode 100644
index 0000000..733e486
--- /dev/null
+++ b/java/com/google/gerrit/server/index/project/StalenessChecker.java
@@ -0,0 +1,79 @@
+// 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.
+
+package com.google.gerrit.server.index.project;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.collect.SetMultimap;
+import com.google.gerrit.index.IndexConfig;
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.RefState;
+import com.google.gerrit.index.project.ProjectData;
+import com.google.gerrit.index.project.ProjectField;
+import com.google.gerrit.index.project.ProjectIndex;
+import com.google.gerrit.index.project.ProjectIndexCollection;
+import com.google.gerrit.index.query.FieldBundle;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.util.Optional;
+
+public class StalenessChecker {
+  private static final ImmutableSet<String> FIELDS =
+      ImmutableSet.of(ProjectField.NAME.getName(), ProjectField.REF_STATE.getName());
+
+  private final ProjectCache projectCache;
+  private final ProjectIndexCollection indexes;
+  private final IndexConfig indexConfig;
+
+  @Inject
+  StalenessChecker(
+      ProjectCache projectCache, ProjectIndexCollection indexes, IndexConfig indexConfig) {
+    this.projectCache = projectCache;
+    this.indexes = indexes;
+    this.indexConfig = indexConfig;
+  }
+
+  public boolean isStale(Project.NameKey project) throws IOException {
+    ProjectData projectData = projectCache.get(project).toProjectData();
+    ProjectIndex i = indexes.getSearchIndex();
+    if (i == null) {
+      return false; // No index; caller couldn't do anything if it is stale.
+    }
+
+    Optional<FieldBundle> result =
+        i.getRaw(project, QueryOptions.create(indexConfig, 0, 1, FIELDS));
+    if (!result.isPresent()) {
+      return true;
+    }
+
+    SetMultimap<Project.NameKey, RefState> indexedRefStates =
+        RefState.parseStates(result.get().getValue(ProjectField.REF_STATE));
+
+    SetMultimap<Project.NameKey, RefState> currentRefStates =
+        MultimapBuilder.hashKeys().hashSetValues().build();
+    projectData.tree().stream()
+        .filter(p -> p.getProject().getConfigRefState() != null)
+        .forEach(
+            p ->
+                currentRefStates.put(
+                    p.getProject().getNameKey(),
+                    RefState.create(RefNames.REFS_CONFIG, p.getProject().getConfigRefState())));
+
+    return !currentRefStates.equals(indexedRefStates);
+  }
+}
diff --git a/java/com/google/gerrit/server/ioutil/BUILD b/java/com/google/gerrit/server/ioutil/BUILD
new file mode 100644
index 0000000..15e67af
--- /dev/null
+++ b/java/com/google/gerrit/server/ioutil/BUILD
@@ -0,0 +1,12 @@
+java_library(
+    name = "ioutil",
+    srcs = glob(["**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/reviewdb:client",
+        "//lib:automaton",
+        "//lib:guava",
+        "//lib/jgit/org.eclipse.jgit.archive:jgit-archive",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+    ],
+)
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ioutil/BasicSerialization.java b/java/com/google/gerrit/server/ioutil/BasicSerialization.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/ioutil/BasicSerialization.java
rename to java/com/google/gerrit/server/ioutil/BasicSerialization.java
diff --git a/java/com/google/gerrit/server/ioutil/ColumnFormatter.java b/java/com/google/gerrit/server/ioutil/ColumnFormatter.java
new file mode 100644
index 0000000..ae855c7
--- /dev/null
+++ b/java/com/google/gerrit/server/ioutil/ColumnFormatter.java
@@ -0,0 +1,75 @@
+// Copyright (C) 2012 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.google.gerrit.server.ioutil;
+
+import java.io.PrintWriter;
+
+/**
+ * Simple output formatter for column-oriented data, writing its output to a {@link
+ * java.io.PrintWriter} object. Handles escaping of the column data so that the resulting output is
+ * unambiguous and reasonably safe and machine parsable.
+ */
+public class ColumnFormatter {
+  private char columnSeparator;
+  private boolean firstColumn;
+  private final PrintWriter out;
+
+  /**
+   * @param out The writer to which output should be sent.
+   * @param columnSeparator A character that should serve as the separator token between columns of
+   *     output. As only non-printable characters in the column text are ever escaped, the column
+   *     separator must be a non-printable character if the output needs to be unambiguously parsed.
+   */
+  public ColumnFormatter(PrintWriter out, char columnSeparator) {
+    this.out = out;
+    this.columnSeparator = columnSeparator;
+    this.firstColumn = true;
+  }
+
+  /**
+   * Adds a text string as a new column in the current line of output, taking care of escaping as
+   * necessary.
+   *
+   * @param content the string to add.
+   */
+  public void addColumn(String content) {
+    if (!firstColumn) {
+      out.print(columnSeparator);
+    }
+    out.print(StringUtil.escapeString(content));
+    firstColumn = false;
+  }
+
+  /**
+   * Finishes the output by flushing the current line and takes care of any other cleanup action.
+   */
+  public void finish() {
+    nextLine();
+    out.flush();
+  }
+
+  /**
+   * Flushes the current line of output and makes the formatter ready to start receiving new column
+   * data for a new line (or end-of-file). If the current line is empty nothing is done, i.e.
+   * consecutive calls to this method without intervening calls to {@link #addColumn} will be
+   * squashed.
+   */
+  public void nextLine() {
+    if (!firstColumn) {
+      out.print('\n');
+      firstColumn = true;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/ioutil/HexFormat.java b/java/com/google/gerrit/server/ioutil/HexFormat.java
new file mode 100644
index 0000000..fd9c17a
--- /dev/null
+++ b/java/com/google/gerrit/server/ioutil/HexFormat.java
@@ -0,0 +1,27 @@
+// 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.
+
+package com.google.gerrit.server.ioutil;
+
+public class HexFormat {
+  public static String fromInt(int id) {
+    final char[] r = new char[8];
+    for (int p = 7; 0 <= p; p--) {
+      final int h = id & 0xf;
+      r[p] = h < 10 ? (char) ('0' + h) : (char) ('a' + (h - 10));
+      id >>= 4;
+    }
+    return new String(r);
+  }
+}
diff --git a/java/com/google/gerrit/server/ioutil/HostPlatform.java b/java/com/google/gerrit/server/ioutil/HostPlatform.java
new file mode 100644
index 0000000..5afda3c
--- /dev/null
+++ b/java/com/google/gerrit/server/ioutil/HostPlatform.java
@@ -0,0 +1,46 @@
+// Copyright (C) 2009 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.google.gerrit.server.ioutil;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+
+public final class HostPlatform {
+  private static final boolean win32 = compute("windows");
+  private static final boolean mac = compute("mac");
+
+  /** @return true if this JVM is running on a Windows platform. */
+  public static boolean isWin32() {
+    return win32;
+  }
+
+  public static boolean isMac() {
+    return mac;
+  }
+
+  private static boolean compute(String platform) {
+    final String osDotName =
+        AccessController.doPrivileged(
+            new PrivilegedAction<String>() {
+              @Override
+              public String run() {
+                return System.getProperty("os.name");
+              }
+            });
+    return osDotName != null && osDotName.toLowerCase().contains(platform);
+  }
+
+  private HostPlatform() {}
+}
diff --git a/java/com/google/gerrit/server/ioutil/LimitedByteArrayOutputStream.java b/java/com/google/gerrit/server/ioutil/LimitedByteArrayOutputStream.java
new file mode 100644
index 0000000..015887b
--- /dev/null
+++ b/java/com/google/gerrit/server/ioutil/LimitedByteArrayOutputStream.java
@@ -0,0 +1,68 @@
+// 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.
+
+package com.google.gerrit.server.ioutil;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+/** A stream that throws an exception if it consumes data beyond a configured byte count. */
+public class LimitedByteArrayOutputStream extends OutputStream {
+
+  private final int maxSize;
+  private final ByteArrayOutputStream buffer;
+
+  /**
+   * Constructs a LimitedByteArrayOutputStream, which stores output in memory up to a certain
+   * specified size. When the output exceeds the specified size a LimitExceededException is thrown.
+   *
+   * @param max the maximum size in bytes which may be stored.
+   * @param initial the initial size. It must be smaller than the max size.
+   */
+  public LimitedByteArrayOutputStream(int max, int initial) {
+    checkArgument(initial <= max);
+    maxSize = max;
+    buffer = new ByteArrayOutputStream(initial);
+  }
+
+  private void checkOversize(int additionalSize) throws IOException {
+    if (buffer.size() + additionalSize > maxSize) {
+      throw new LimitExceededException();
+    }
+  }
+
+  @Override
+  public void write(int b) throws IOException {
+    checkOversize(1);
+    buffer.write(b);
+  }
+
+  @Override
+  public void write(byte[] b, int off, int len) throws IOException {
+    checkOversize(len);
+    buffer.write(b, off, len);
+  }
+
+  /** @return a newly allocated byte array with contents of the buffer. */
+  public byte[] toByteArray() {
+    return buffer.toByteArray();
+  }
+
+  public static class LimitExceededException extends IOException {
+    private static final long serialVersionUID = 1L;
+  }
+}
diff --git a/java/com/google/gerrit/server/ioutil/RegexListSearcher.java b/java/com/google/gerrit/server/ioutil/RegexListSearcher.java
new file mode 100644
index 0000000..dda373c
--- /dev/null
+++ b/java/com/google/gerrit/server/ioutil/RegexListSearcher.java
@@ -0,0 +1,100 @@
+// 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.
+
+package com.google.gerrit.server.ioutil;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.Lists;
+import com.google.common.primitives.Chars;
+import dk.brics.automaton.Automaton;
+import dk.brics.automaton.RegExp;
+import dk.brics.automaton.RunAutomaton;
+import java.util.Collections;
+import java.util.List;
+import java.util.function.Function;
+import java.util.stream.Stream;
+
+/** Helper to search sorted lists for elements matching a {@link RegExp}. */
+public final class RegexListSearcher<T> {
+  public static RegexListSearcher<String> ofStrings(String re) {
+    return new RegexListSearcher<>(re, Function.identity());
+  }
+
+  private final RunAutomaton pattern;
+  private final Function<T, String> toStringFunc;
+
+  private final String prefixBegin;
+  private final String prefixEnd;
+  private final int prefixLen;
+  private final boolean prefixOnly;
+
+  public RegexListSearcher(String re, Function<T, String> toStringFunc) {
+    this.toStringFunc = requireNonNull(toStringFunc);
+
+    if (re.startsWith("^")) {
+      re = re.substring(1);
+    }
+
+    if (re.endsWith("$") && !re.endsWith("\\$")) {
+      re = re.substring(0, re.length() - 1);
+    }
+
+    Automaton automaton = new RegExp(re).toAutomaton();
+    prefixBegin = automaton.getCommonPrefix();
+    prefixLen = prefixBegin.length();
+
+    if (0 < prefixLen) {
+      char max = Chars.checkedCast(prefixBegin.charAt(prefixLen - 1) + 1);
+      prefixEnd = prefixBegin.substring(0, prefixLen - 1) + max;
+      prefixOnly = re.equals(prefixBegin + ".*");
+    } else {
+      prefixEnd = "";
+      prefixOnly = false;
+    }
+
+    pattern = prefixOnly ? null : new RunAutomaton(automaton);
+  }
+
+  public Stream<T> search(List<T> list) {
+    requireNonNull(list);
+    int begin;
+    int end;
+
+    if (0 < prefixLen) {
+      // Assumes many consecutive elements may have the same prefix, so the cost of two binary
+      // searches is less than iterating linearly and running the regexp find the endpoints.
+      List<String> strings = Lists.transform(list, toStringFunc::apply);
+      begin = find(strings, prefixBegin);
+      end = find(strings, prefixEnd);
+    } else {
+      begin = 0;
+      end = list.size();
+    }
+    if (begin >= end) {
+      return Stream.empty();
+    }
+
+    Stream<T> result = list.subList(begin, end).stream();
+    if (!prefixOnly) {
+      result = result.filter(x -> pattern.run(toStringFunc.apply(x)));
+    }
+    return result;
+  }
+
+  private static int find(List<String> list, String p) {
+    int r = Collections.binarySearch(list, p);
+    return r < 0 ? -(r + 1) : r;
+  }
+}
diff --git a/java/com/google/gerrit/server/ioutil/StringUtil.java b/java/com/google/gerrit/server/ioutil/StringUtil.java
new file mode 100644
index 0000000..0520dbc
--- /dev/null
+++ b/java/com/google/gerrit/server/ioutil/StringUtil.java
@@ -0,0 +1,53 @@
+// Copyright (C) 2012 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.google.gerrit.server.ioutil;
+
+public class StringUtil {
+  /**
+   * An array of the string representations that should be used in place of the non-printable
+   * characters in the beginning of the ASCII table when escaping a string. The index of each
+   * element in the array corresponds to its ASCII value, i.e. the string representation of ASCII 0
+   * is found in the first element of this array.
+   */
+  private static final String[] NON_PRINTABLE_CHARS = {
+    "\\x00", "\\x01", "\\x02", "\\x03", "\\x04", "\\x05", "\\x06", "\\a",
+    "\\b", "\\t", "\\n", "\\v", "\\f", "\\r", "\\x0e", "\\x0f",
+    "\\x10", "\\x11", "\\x12", "\\x13", "\\x14", "\\x15", "\\x16", "\\x17",
+    "\\x18", "\\x19", "\\x1a", "\\x1b", "\\x1c", "\\x1d", "\\x1e", "\\x1f",
+  };
+
+  /**
+   * Escapes the input string so that all non-printable characters (0x00-0x1f) are represented as a
+   * hex escape (\x00, \x01, ...) or as a C-style escape sequence (\a, \b, \t, \n, \v, \f, or \r).
+   * Backslashes in the input string are doubled (\\).
+   */
+  public static String escapeString(String str) {
+    // Allocate a buffer big enough to cover the case with a string needed
+    // very excessive escaping without having to reallocate the buffer.
+    final StringBuilder result = new StringBuilder(3 * str.length());
+
+    for (int i = 0; i < str.length(); i++) {
+      char c = str.charAt(i);
+      if (c < NON_PRINTABLE_CHARS.length) {
+        result.append(NON_PRINTABLE_CHARS[c]);
+      } else if (c == '\\') {
+        result.append("\\\\");
+      } else {
+        result.append(c);
+      }
+    }
+    return result.toString();
+  }
+}
diff --git a/java/com/google/gerrit/server/logging/BUILD b/java/com/google/gerrit/server/logging/BUILD
new file mode 100644
index 0000000..cf8e9db
--- /dev/null
+++ b/java/com/google/gerrit/server/logging/BUILD
@@ -0,0 +1,15 @@
+java_library(
+    name = "logging",
+    srcs = glob(
+        ["**/*.java"],
+    ),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/common:annotations",
+        "//java/com/google/gerrit/server/util/time",
+        "//lib:guava",
+        "//lib/auto:auto-value",
+        "//lib/auto:auto-value-annotations",
+        "//lib/flogger:api",
+    ],
+)
diff --git a/java/com/google/gerrit/server/logging/CallerFinder.java b/java/com/google/gerrit/server/logging/CallerFinder.java
new file mode 100644
index 0000000..c27dbbb
--- /dev/null
+++ b/java/com/google/gerrit/server/logging/CallerFinder.java
@@ -0,0 +1,238 @@
+// 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.
+
+package com.google.gerrit.server.logging;
+
+import static com.google.common.flogger.LazyArgs.lazy;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableList;
+import com.google.common.flogger.LazyArg;
+import java.util.Optional;
+
+/**
+ * Utility to compute the caller of a method.
+ *
+ * <p>In the logs we see for each entry from where it was triggered (class/method/line) but in case
+ * the logging is done in a utility method or inside of a module this doesn't tell us from where the
+ * action was actually triggered. To get this information we could included the stacktrace into the
+ * logs (by calling {@link
+ * com.google.common.flogger.LoggingApi#withStackTrace(com.google.common.flogger.StackSize)} but
+ * sometimes there are too many uninteresting stacks so that this would blow up the logs too much.
+ * In this case CallerFinder can be used to find the first interesting caller from the current
+ * stacktrace by specifying the class that interesting callers invoke as target.
+ *
+ * <p>Example:
+ *
+ * <p>Index queries are executed by the {@code query(List<String>, List<Predicate<T>>)} method in
+ * {@link com.google.gerrit.index.query.QueryProcessor}. At this place the index query is logged but
+ * from the log we want to see which code triggered this index query.
+ *
+ * <p>E.g. the stacktrace could look like this:
+ *
+ * <pre>
+ * GroupQueryProcessor(QueryProcessor<T>).query(List<String>, List<Predicate<T>>) line: 216
+ * GroupQueryProcessor(QueryProcessor<T>).query(List<Predicate<T>>) line: 188
+ * GroupQueryProcessor(QueryProcessor<T>).query(Predicate<T>) line: 171
+ * InternalGroupQuery(InternalQuery<T>).query(Predicate<T>) line: 81
+ * InternalGroupQuery.getOnlyGroup(Predicate<InternalGroup>, String) line: 67
+ * InternalGroupQuery.byName(NameKey) line: 50
+ * GroupCacheImpl$ByNameLoader.load(String) line: 166
+ * GroupCacheImpl$ByNameLoader.load(Object) line: 1
+ * LocalCache$LoadingValueReference<K,V>.loadFuture(K, CacheLoader<? super K,V>) line: 3527
+ * ...
+ * </pre>
+ *
+ * <p>The first interesting caller is {@code GroupCacheImpl$ByNameLoader.load(String) line: 166}. To
+ * find this caller from the stacktrace we could specify {@link
+ * com.google.gerrit.server.query.group.InternalGroupQuery} as a target since we know that all
+ * internal group queries go through this class:
+ *
+ * <pre>
+ * CallerFinder.builder()
+ *   .addTarget(InternalGroupQuery.class)
+ *   .build();
+ * </pre>
+ *
+ * <p>Since in some places {@link com.google.gerrit.server.query.group.GroupQueryProcessor} may also
+ * be used directly we can add it as a secondary target to catch these callers as well:
+ *
+ * <pre>
+ * CallerFinder.builder()
+ *   .addTarget(InternalGroupQuery.class)
+ *   .addTarget(GroupQueryProcessor.class)
+ *   .build();
+ * </pre>
+ *
+ * <p>However since {@link com.google.gerrit.index.query.QueryProcessor} is also responsible to
+ * execute other index queries (for changes, accounts, projects) we would need to add the classes
+ * for them as targets too. Since there are common base classes we can simply specify the base
+ * classes and request matching of subclasses:
+ *
+ * <pre>
+ * CallerFinder.builder()
+ *   .addTarget(InternalQuery.class)
+ *   .addTarget(QueryProcessor.class)
+ *   .matchSubClasses(true)
+ *   .build();
+ * </pre>
+ *
+ * <p>Another special case is if the entry point is always an inner class of a known interface. E.g.
+ * {@link com.google.gerrit.server.permissions.PermissionBackend} is the entry point for all
+ * permission checks but they are done through inner classes, e.g. {@link
+ * com.google.gerrit.server.permissions.PermissionBackend.ForProject}. In this case matching of
+ * inner classes must be enabled as well:
+ *
+ * <pre>
+ * CallerFinder.builder()
+ *   .addTarget(PermissionBackend.class)
+ *   .matchSubClasses(true)
+ *   .matchInnerClasses(true)
+ *   .build();
+ * </pre>
+ *
+ * <p>Finding the interesting caller requires specifying the entry point class as target. This may
+ * easily break when code is refactored and hence should be used only with care. It's recommended to
+ * use this only when the corresponding code is relatively stable and logging the caller information
+ * brings some significant benefit.
+ *
+ * <p>Based on {@link com.google.common.flogger.util.CallerFinder}.
+ */
+@AutoValue
+public abstract class CallerFinder {
+  public static Builder builder() {
+    return new AutoValue_CallerFinder.Builder()
+        .matchSubClasses(false)
+        .matchInnerClasses(false)
+        .skip(0);
+  }
+
+  /**
+   * The target classes for which the caller should be found, in the order in which they should be
+   * checked.
+   *
+   * @return the target classes for which the caller should be found
+   */
+  public abstract ImmutableList<Class<?>> targets();
+
+  /**
+   * Whether inner classes should be matched.
+   *
+   * @return whether inner classes should be matched
+   */
+  public abstract boolean matchSubClasses();
+
+  /**
+   * Whether sub classes of the target classes should be matched.
+   *
+   * @return whether sub classes of the target classes should be matched
+   */
+  public abstract boolean matchInnerClasses();
+
+  /**
+   * The minimum number of calls known to have occurred between the first call to the target class
+   * and the call of {@link #findCaller()}. If in doubt, specify zero here to avoid accidentally
+   * skipping past the caller.
+   *
+   * @return the number of stack elements to skip when computing the caller
+   */
+  public abstract int skip();
+
+  @AutoValue.Builder
+  public abstract static class Builder {
+    abstract ImmutableList.Builder<Class<?>> targetsBuilder();
+
+    public Builder addTarget(Class<?> target) {
+      targetsBuilder().add(target);
+      return this;
+    }
+
+    public abstract Builder matchSubClasses(boolean matchSubClasses);
+
+    public abstract Builder matchInnerClasses(boolean matchInnerClasses);
+
+    public abstract Builder skip(int skip);
+
+    public abstract CallerFinder build();
+  }
+
+  public LazyArg<String> findCaller() {
+    return lazy(
+        () ->
+            targets().stream()
+                .map(t -> findCallerOf(t, skip() + 1))
+                .filter(Optional::isPresent)
+                .findFirst()
+                .map(Optional::get)
+                .orElse("unknown"));
+  }
+
+  private Optional<String> findCallerOf(Class<?> target, int skip) {
+    // Skip one additional stack frame because we create the Throwable inside this method, not at
+    // the point that this method was invoked.
+    skip++;
+
+    StackTraceElement[] stack = new Throwable().getStackTrace();
+
+    // Note: To avoid having to reflect the getStackTraceDepth() method as well, we assume that we
+    // will find the caller on the stack and simply catch an exception if we fail (which should
+    // hardly ever happen).
+    boolean foundCaller = false;
+    try {
+      for (int index = skip; ; index++) {
+        StackTraceElement element = stack[index];
+        if (isCaller(target, element.getClassName(), matchSubClasses())) {
+          foundCaller = true;
+        } else if (foundCaller) {
+          return Optional.of(element.toString());
+        }
+      }
+    } catch (Exception e) {
+      // This should only happen if a) the caller was not found on the stack
+      // (IndexOutOfBoundsException) b) a class that is mentioned in the stack was not found
+      // (ClassNotFoundException), however we don't want anything to be thrown from here.
+      return Optional.empty();
+    }
+  }
+
+  private boolean isCaller(Class<?> target, String className, boolean matchSubClasses)
+      throws ClassNotFoundException {
+    if (matchSubClasses) {
+      Class<?> clazz = Class.forName(className);
+      while (clazz != null) {
+        if (Object.class.getName().equals(clazz.getName())) {
+          break;
+        }
+
+        if (isCaller(target, clazz.getName(), false)) {
+          return true;
+        }
+        clazz = clazz.getSuperclass();
+      }
+    }
+
+    if (matchInnerClasses()) {
+      int i = className.indexOf('$');
+      if (i > 0) {
+        className = className.substring(0, i);
+      }
+    }
+
+    if (target.getName().equals(className)) {
+      return true;
+    }
+
+    return false;
+  }
+}
diff --git a/java/com/google/gerrit/server/logging/LoggingContext.java b/java/com/google/gerrit/server/logging/LoggingContext.java
new file mode 100644
index 0000000..1e81c29
--- /dev/null
+++ b/java/com/google/gerrit/server/logging/LoggingContext.java
@@ -0,0 +1,123 @@
+// 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.
+
+package com.google.gerrit.server.logging;
+
+import com.google.common.collect.ImmutableSetMultimap;
+import com.google.common.flogger.backend.Tags;
+import java.util.concurrent.Callable;
+import java.util.logging.Level;
+
+/**
+ * Logging context for Flogger.
+ *
+ * <p>To configure this logging context for Flogger set the following system property (also see
+ * {@link com.google.common.flogger.backend.system.DefaultPlatform}):
+ *
+ * <ul>
+ *   <li>{@code
+ *       flogger.logging_context=com.google.gerrit.server.logging.LoggingContext#getInstance}.
+ * </ul>
+ */
+public class LoggingContext extends com.google.common.flogger.backend.system.LoggingContext {
+  private static final LoggingContext INSTANCE = new LoggingContext();
+
+  private static final ThreadLocal<MutableTags> tags = new ThreadLocal<>();
+  private static final ThreadLocal<Boolean> forceLogging = new ThreadLocal<>();
+
+  private LoggingContext() {}
+
+  /** This method is expected to be called via reflection (and might otherwise be unused). */
+  public static LoggingContext getInstance() {
+    return INSTANCE;
+  }
+
+  public static Runnable copy(Runnable runnable) {
+    if (runnable instanceof LoggingContextAwareRunnable) {
+      return runnable;
+    }
+    return new LoggingContextAwareRunnable(runnable);
+  }
+
+  public static <T> Callable<T> copy(Callable<T> callable) {
+    if (callable instanceof LoggingContextAwareCallable) {
+      return callable;
+    }
+    return new LoggingContextAwareCallable<>(callable);
+  }
+
+  @Override
+  public boolean shouldForceLogging(String loggerName, Level level, boolean isEnabled) {
+    return isLoggingForced();
+  }
+
+  @Override
+  public Tags getTags() {
+    MutableTags mutableTags = tags.get();
+    return mutableTags != null ? mutableTags.getTags() : Tags.empty();
+  }
+
+  public ImmutableSetMultimap<String, String> getTagsAsMap() {
+    MutableTags mutableTags = tags.get();
+    return mutableTags != null ? mutableTags.asMap() : ImmutableSetMultimap.of();
+  }
+
+  boolean addTag(String name, String value) {
+    return getMutableTags().add(name, value);
+  }
+
+  void removeTag(String name, String value) {
+    MutableTags mutableTags = getMutableTags();
+    mutableTags.remove(name, value);
+    if (mutableTags.isEmpty()) {
+      tags.remove();
+    }
+  }
+
+  void setTags(ImmutableSetMultimap<String, String> newTags) {
+    if (newTags.isEmpty()) {
+      tags.remove();
+      return;
+    }
+    getMutableTags().set(newTags);
+  }
+
+  void clearTags() {
+    tags.remove();
+  }
+
+  private MutableTags getMutableTags() {
+    MutableTags mutableTags = tags.get();
+    if (mutableTags == null) {
+      mutableTags = new MutableTags();
+      tags.set(mutableTags);
+    }
+    return mutableTags;
+  }
+
+  boolean isLoggingForced() {
+    Boolean force = forceLogging.get();
+    return force != null ? force : false;
+  }
+
+  boolean forceLogging(boolean force) {
+    Boolean oldValue = forceLogging.get();
+    if (force) {
+      forceLogging.set(true);
+    } else {
+      forceLogging.remove();
+    }
+    return oldValue != null ? oldValue : false;
+  }
+}
diff --git a/java/com/google/gerrit/server/logging/LoggingContextAwareCallable.java b/java/com/google/gerrit/server/logging/LoggingContextAwareCallable.java
new file mode 100644
index 0000000..6aff5c4
--- /dev/null
+++ b/java/com/google/gerrit/server/logging/LoggingContextAwareCallable.java
@@ -0,0 +1,66 @@
+// 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.
+
+package com.google.gerrit.server.logging;
+
+import com.google.common.collect.ImmutableSetMultimap;
+import java.util.concurrent.Callable;
+
+/**
+ * Wrapper for a {@link Callable} that copies the {@link LoggingContext} from the current thread to
+ * the thread that executes the callable.
+ *
+ * <p>The state of the logging context that is copied to the thread that executes the callable is
+ * fixed at the creation time of this wrapper. If the callable is submitted to an executor and is
+ * executed later this means that changes that are done to the logging context in between creating
+ * and executing the callable do not apply.
+ *
+ * <p>See {@link LoggingContextAwareRunnable} for an example.
+ *
+ * @see LoggingContextAwareRunnable
+ */
+class LoggingContextAwareCallable<T> implements Callable<T> {
+  private final Callable<T> callable;
+  private final Thread callingThread;
+  private final ImmutableSetMultimap<String, String> tags;
+  private final boolean forceLogging;
+
+  LoggingContextAwareCallable(Callable<T> callable) {
+    this.callable = callable;
+    this.callingThread = Thread.currentThread();
+    this.tags = LoggingContext.getInstance().getTagsAsMap();
+    this.forceLogging = LoggingContext.getInstance().isLoggingForced();
+  }
+
+  @Override
+  public T call() throws Exception {
+    if (callingThread.equals(Thread.currentThread())) {
+      // propagation of logging context is not needed
+      return callable.call();
+    }
+
+    // propagate logging context
+    LoggingContext loggingCtx = LoggingContext.getInstance();
+    ImmutableSetMultimap<String, String> oldTags = loggingCtx.getTagsAsMap();
+    boolean oldForceLogging = loggingCtx.isLoggingForced();
+    loggingCtx.setTags(tags);
+    loggingCtx.forceLogging(forceLogging);
+    try {
+      return callable.call();
+    } finally {
+      loggingCtx.setTags(oldTags);
+      loggingCtx.forceLogging(oldForceLogging);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/logging/LoggingContextAwareExecutorService.java b/java/com/google/gerrit/server/logging/LoggingContextAwareExecutorService.java
new file mode 100644
index 0000000..17e152e3
--- /dev/null
+++ b/java/com/google/gerrit/server/logging/LoggingContextAwareExecutorService.java
@@ -0,0 +1,110 @@
+// 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.
+
+package com.google.gerrit.server.logging;
+
+import static java.util.stream.Collectors.toList;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+/**
+ * An {@link ExecutorService} that copies the {@link LoggingContext} on executing a {@link Runnable}
+ * to the executing thread.
+ */
+public class LoggingContextAwareExecutorService implements ExecutorService {
+  private final ExecutorService executorService;
+
+  public LoggingContextAwareExecutorService(ExecutorService executorService) {
+    this.executorService = executorService;
+  }
+
+  @Override
+  public void execute(Runnable command) {
+    executorService.execute(LoggingContext.copy(command));
+  }
+
+  @Override
+  public void shutdown() {
+    executorService.shutdown();
+  }
+
+  @Override
+  public List<Runnable> shutdownNow() {
+    return executorService.shutdownNow();
+  }
+
+  @Override
+  public boolean isShutdown() {
+    return executorService.isShutdown();
+  }
+
+  @Override
+  public boolean isTerminated() {
+    return executorService.isTerminated();
+  }
+
+  @Override
+  public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException {
+    return executorService.awaitTermination(timeout, unit);
+  }
+
+  @Override
+  public <T> Future<T> submit(Callable<T> task) {
+    return executorService.submit(LoggingContext.copy(task));
+  }
+
+  @Override
+  public <T> Future<T> submit(Runnable task, T result) {
+    return executorService.submit(LoggingContext.copy(task), result);
+  }
+
+  @Override
+  public Future<?> submit(Runnable task) {
+    return executorService.submit(LoggingContext.copy(task));
+  }
+
+  @Override
+  public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
+      throws InterruptedException {
+    return executorService.invokeAll(tasks.stream().map(LoggingContext::copy).collect(toList()));
+  }
+
+  @Override
+  public <T> List<Future<T>> invokeAll(
+      Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
+      throws InterruptedException {
+    return executorService.invokeAll(
+        tasks.stream().map(LoggingContext::copy).collect(toList()), timeout, unit);
+  }
+
+  @Override
+  public <T> T invokeAny(Collection<? extends Callable<T>> tasks)
+      throws InterruptedException, ExecutionException {
+    return executorService.invokeAny(tasks.stream().map(LoggingContext::copy).collect(toList()));
+  }
+
+  @Override
+  public <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
+      throws InterruptedException, ExecutionException, TimeoutException {
+    return executorService.invokeAny(
+        tasks.stream().map(LoggingContext::copy).collect(toList()), timeout, unit);
+  }
+}
diff --git a/java/com/google/gerrit/server/logging/LoggingContextAwareRunnable.java b/java/com/google/gerrit/server/logging/LoggingContextAwareRunnable.java
new file mode 100644
index 0000000..0bd7d00
--- /dev/null
+++ b/java/com/google/gerrit/server/logging/LoggingContextAwareRunnable.java
@@ -0,0 +1,89 @@
+// 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.
+
+package com.google.gerrit.server.logging;
+
+import com.google.common.collect.ImmutableSetMultimap;
+
+/**
+ * Wrapper for a {@link Runnable} that copies the {@link LoggingContext} from the current thread to
+ * the thread that executes the runnable.
+ *
+ * <p>The state of the logging context that is copied to the thread that executes the runnable is
+ * fixed at the creation time of this wrapper. If the runnable is submitted to an executor and is
+ * executed later this means that changes that are done to the logging context in between creating
+ * and executing the runnable do not apply.
+ *
+ * <p>Example:
+ *
+ * <pre>
+ *   try (TraceContext traceContext = TraceContext.newTrace(true, ...)) {
+ *     executor
+ *         .submit(new LoggingContextAwareRunnable(
+ *             () -> {
+ *               // Tracing is enabled since the runnable is created within the TraceContext.
+ *               // Tracing is even enabled if the executor runs the runnable only after the
+ *               // TraceContext was closed.
+ *
+ *               // The tag "foo=bar" is not set, since it was added to the logging context only
+ *               // after this runnable was created.
+ *
+ *               // do stuff
+ *             }))
+ *         .get();
+ *     traceContext.addTag("foo", "bar");
+ *   }
+ * </pre>
+ *
+ * @see LoggingContextAwareCallable
+ */
+public class LoggingContextAwareRunnable implements Runnable {
+  private final Runnable runnable;
+  private final Thread callingThread;
+  private final ImmutableSetMultimap<String, String> tags;
+  private final boolean forceLogging;
+
+  LoggingContextAwareRunnable(Runnable runnable) {
+    this.runnable = runnable;
+    this.callingThread = Thread.currentThread();
+    this.tags = LoggingContext.getInstance().getTagsAsMap();
+    this.forceLogging = LoggingContext.getInstance().isLoggingForced();
+  }
+
+  public Runnable unwrap() {
+    return runnable;
+  }
+
+  @Override
+  public void run() {
+    if (callingThread.equals(Thread.currentThread())) {
+      // propagation of logging context is not needed
+      runnable.run();
+      return;
+    }
+
+    // propagate logging context
+    LoggingContext loggingCtx = LoggingContext.getInstance();
+    ImmutableSetMultimap<String, String> oldTags = loggingCtx.getTagsAsMap();
+    boolean oldForceLogging = loggingCtx.isLoggingForced();
+    loggingCtx.setTags(tags);
+    loggingCtx.forceLogging(forceLogging);
+    try {
+      runnable.run();
+    } finally {
+      loggingCtx.setTags(oldTags);
+      loggingCtx.forceLogging(oldForceLogging);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/logging/LoggingContextAwareScheduledExecutorService.java b/java/com/google/gerrit/server/logging/LoggingContextAwareScheduledExecutorService.java
new file mode 100644
index 0000000..e17a91e
--- /dev/null
+++ b/java/com/google/gerrit/server/logging/LoggingContextAwareScheduledExecutorService.java
@@ -0,0 +1,59 @@
+// 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.
+
+package com.google.gerrit.server.logging;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * A {@link ScheduledExecutorService} that copies the {@link LoggingContext} on executing a {@link
+ * Runnable} to the executing thread.
+ */
+public class LoggingContextAwareScheduledExecutorService extends LoggingContextAwareExecutorService
+    implements ScheduledExecutorService {
+  private final ScheduledExecutorService scheduledExecutorService;
+
+  public LoggingContextAwareScheduledExecutorService(
+      ScheduledExecutorService scheduledExecutorService) {
+    super(scheduledExecutorService);
+    this.scheduledExecutorService = scheduledExecutorService;
+  }
+
+  @Override
+  public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit) {
+    return scheduledExecutorService.schedule(LoggingContext.copy(command), delay, unit);
+  }
+
+  @Override
+  public <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit) {
+    return scheduledExecutorService.schedule(LoggingContext.copy(callable), delay, unit);
+  }
+
+  @Override
+  public ScheduledFuture<?> scheduleAtFixedRate(
+      Runnable command, long initialDelay, long period, TimeUnit unit) {
+    return scheduledExecutorService.scheduleAtFixedRate(
+        LoggingContext.copy(command), initialDelay, period, unit);
+  }
+
+  @Override
+  public ScheduledFuture<?> scheduleWithFixedDelay(
+      Runnable command, long initialDelay, long delay, TimeUnit unit) {
+    return scheduledExecutorService.scheduleWithFixedDelay(
+        LoggingContext.copy(command), initialDelay, delay, unit);
+  }
+}
diff --git a/java/com/google/gerrit/server/logging/MutableTags.java b/java/com/google/gerrit/server/logging/MutableTags.java
new file mode 100644
index 0000000..f70a8db
--- /dev/null
+++ b/java/com/google/gerrit/server/logging/MutableTags.java
@@ -0,0 +1,113 @@
+// 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.
+
+package com.google.gerrit.server.logging;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ImmutableSetMultimap;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.collect.SetMultimap;
+import com.google.common.flogger.backend.Tags;
+
+public class MutableTags {
+  private final SetMultimap<String, String> tagMap =
+      MultimapBuilder.hashKeys().hashSetValues().build();
+  private Tags tags = Tags.empty();
+
+  public Tags getTags() {
+    return tags;
+  }
+
+  /**
+   * Adds a tag if a tag with the same name and value doesn't exist yet.
+   *
+   * @param name the name of the tag
+   * @param value the value of the tag
+   * @return {@code true} if the tag was added, {@code false} if the tag was not added because it
+   *     already exists
+   */
+  public boolean add(String name, String value) {
+    requireNonNull(name, "tag name is required");
+    requireNonNull(value, "tag value is required");
+    boolean ret = tagMap.put(name, value);
+    if (ret) {
+      buildTags();
+    }
+    return ret;
+  }
+
+  /**
+   * Removes the tag with the given name and value.
+   *
+   * @param name the name of the tag
+   * @param value the value of the tag
+   */
+  public void remove(String name, String value) {
+    requireNonNull(name, "tag name is required");
+    requireNonNull(value, "tag value is required");
+    if (tagMap.remove(name, value)) {
+      buildTags();
+    }
+  }
+
+  /**
+   * Checks if the contained tag map is empty.
+   *
+   * @return {@code true} if there are no tags, otherwise {@code false}
+   */
+  public boolean isEmpty() {
+    return tagMap.isEmpty();
+  }
+
+  /** Clears all tags. */
+  public void clear() {
+    tagMap.clear();
+    tags = Tags.empty();
+  }
+
+  /**
+   * Returns the tags as Multimap.
+   *
+   * @return the tags as Multimap
+   */
+  public ImmutableSetMultimap<String, String> asMap() {
+    return ImmutableSetMultimap.copyOf(tagMap);
+  }
+
+  /**
+   * Replaces the existing tags with the provided tags.
+   *
+   * @param tags the tags that should be set.
+   */
+  void set(ImmutableSetMultimap<String, String> tags) {
+    tagMap.clear();
+    tags.forEach(tagMap::put);
+    buildTags();
+  }
+
+  private void buildTags() {
+    if (tagMap.isEmpty()) {
+      if (tags.isEmpty()) {
+        return;
+      }
+      tags = Tags.empty();
+      return;
+    }
+
+    Tags.Builder tagsBuilder = Tags.builder();
+    tagMap.forEach(tagsBuilder::addTag);
+    tags = tagsBuilder.build();
+  }
+}
diff --git a/java/com/google/gerrit/server/logging/RequestId.java b/java/com/google/gerrit/server/logging/RequestId.java
new file mode 100644
index 0000000..ceb5da0
--- /dev/null
+++ b/java/com/google/gerrit/server/logging/RequestId.java
@@ -0,0 +1,77 @@
+// 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.
+
+package com.google.gerrit.server.logging;
+
+import com.google.common.base.Enums;
+import com.google.common.hash.Hasher;
+import com.google.common.hash.Hashing;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.server.util.time.TimeUtil;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+/** Unique identifier for an end-user request, used in logs and similar. */
+public class RequestId {
+  private static final String MACHINE_ID;
+
+  static {
+    String id;
+    try {
+      id = InetAddress.getLocalHost().getHostAddress();
+    } catch (UnknownHostException e) {
+      id = "unknown";
+    }
+    MACHINE_ID = id;
+  }
+
+  public enum Type {
+    RECEIVE_ID,
+    SUBMISSION_ID,
+    TRACE_ID;
+
+    static boolean isId(String id) {
+      return id != null && Enums.getIfPresent(Type.class, id).isPresent();
+    }
+  }
+
+  public static boolean isSet() {
+    return LoggingContext.getInstance().getTagsAsMap().keySet().stream().anyMatch(Type::isId);
+  }
+
+  private final String str;
+
+  public RequestId() {
+    this(null);
+  }
+
+  public RequestId(@Nullable String resourceId) {
+    Hasher h = Hashing.murmur3_128().newHasher();
+    h.putLong(Thread.currentThread().getId()).putUnencodedChars(MACHINE_ID);
+    str =
+        (resourceId != null ? resourceId + "-" : "")
+            + TimeUtil.nowTs().getTime()
+            + "-"
+            + h.hash().toString().substring(0, 8);
+  }
+
+  @Override
+  public String toString() {
+    return str;
+  }
+
+  public String toStringForStorage() {
+    return str.substring(1, str.length() - 1);
+  }
+}
diff --git a/java/com/google/gerrit/server/logging/TraceContext.java b/java/com/google/gerrit/server/logging/TraceContext.java
new file mode 100644
index 0000000..ded34d0
--- /dev/null
+++ b/java/com/google/gerrit/server/logging/TraceContext.java
@@ -0,0 +1,286 @@
+// 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.
+
+package com.google.gerrit.server.logging;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.base.Stopwatch;
+import com.google.common.base.Strings;
+import com.google.common.collect.HashBasedTable;
+import com.google.common.collect.Table;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import java.util.Optional;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
+
+/**
+ * TraceContext that allows to set logging tags and enforce logging.
+ *
+ * <p>The logging tags are attached to all log entries that are triggered while the trace context is
+ * open. If force logging is enabled all logs that are triggered while the trace context is open are
+ * written to the log file regardless of the configured log level.
+ *
+ * <pre>
+ * try (TraceContext traceContext = TraceContext.open()
+ *         .addTag("tag-name", "tag-value")
+ *         .forceLogging()) {
+ *     // This gets logged as: A log [CONTEXT forced=true tag-name="tag-value" ]
+ *     // Since force logging is enabled this gets logged independently of the configured log
+ *     // level.
+ *     logger.atFinest().log("A log");
+ *
+ *     // do stuff
+ * }
+ * </pre>
+ *
+ * <p>The logging tags and the force logging flag are stored in the {@link LoggingContext}. {@link
+ * LoggingContextAwareExecutorService}, {@link LoggingContextAwareScheduledExecutorService} and the
+ * executor in {@link com.google.gerrit.server.git.WorkQueue} ensure that the logging context is
+ * automatically copied to background threads.
+ *
+ * <p>On close of the trace context newly set tags are unset. Force logging is disabled on close if
+ * it got enabled while the trace context was open.
+ *
+ * <p>Trace contexts can be nested:
+ *
+ * <pre>
+ * // Initially there are no tags
+ * logger.atSevere().log("log without tag");
+ *
+ * // a tag can be set by opening a trace context
+ * try (TraceContext ctx = TraceContext.open().addTag("tag1", "value1")) {
+ *   logger.atSevere().log("log with tag1=value1");
+ *
+ *   // while a trace context is open further tags can be added.
+ *   ctx.addTag("tag2", "value2")
+ *   logger.atSevere().log("log with tag1=value1 and tag2=value2");
+ *
+ *   // also by opening another trace context a another tag can be added
+ *   try (TraceContext ctx2 = TraceContext.open().addTag("tag3", "value3")) {
+ *     logger.atSevere().log("log with tag1=value1, tag2=value2 and tag3=value3");
+ *
+ *     // it's possible to have the same tag name with multiple values
+ *     ctx2.addTag("tag3", "value3a")
+ *     logger.atSevere().log("log with tag1=value1, tag2=value2, tag3=value3 and tag3=value3a");
+ *
+ *     // adding a tag with the same name and value as an existing tag has no effect
+ *     try (TraceContext ctx3 = TraceContext.open().addTag("tag3", "value3a")) {
+ *       logger.atSevere().log("log with tag1=value1, tag2=value2, tag3=value3 and tag3=value3a");
+ *     }
+ *
+ *     // closing ctx3 didn't remove tag3=value3a since it was already set before opening ctx3
+ *     logger.atSevere().log("log with tag1=value1, tag2=value2, tag3=value3 and tag3=value3a");
+ *   }
+ *
+ *   // closing ctx2 removed tag3=value3 and tag3-value3a
+ *   logger.atSevere().log("with tag1=value1 and tag2=value2");
+ * }
+ *
+ * // closing ctx1 removed tag1=value1 and tag2=value2
+ * logger.atSevere().log("log without tag");
+ * </pre>
+ */
+public class TraceContext implements AutoCloseable {
+  private static final String PLUGIN_TAG = "PLUGIN";
+
+  public static TraceContext open() {
+    return new TraceContext();
+  }
+
+  /**
+   * Opens a new trace context for request tracing.
+   *
+   * <ul>
+   *   <li>sets a tag with a trace ID
+   *   <li>enables force logging
+   * </ul>
+   *
+   * <p>if no trace ID is provided a new trace ID is only generated if request tracing was not
+   * started yet. If request tracing was already started the given {@code traceIdConsumer} is
+   * invoked with the existing trace ID and no new logging tag is set.
+   *
+   * <p>No-op if {@code trace} is {@code false}.
+   *
+   * @param trace whether tracing should be started
+   * @param traceId trace ID that should be used for tracing, if {@code null} a trace ID is
+   *     generated
+   * @param traceIdConsumer consumer for the trace ID, should be used to return the generated trace
+   *     ID to the client, not invoked if {@code trace} is {@code false}
+   * @return the trace context
+   */
+  public static TraceContext newTrace(
+      boolean trace, @Nullable String traceId, TraceIdConsumer traceIdConsumer) {
+    if (!trace) {
+      // Create an empty trace context.
+      return open();
+    }
+
+    if (!Strings.isNullOrEmpty(traceId)) {
+      traceIdConsumer.accept(RequestId.Type.TRACE_ID.name(), traceId);
+      return open().addTag(RequestId.Type.TRACE_ID, traceId).forceLogging();
+    }
+
+    Optional<String> existingTraceId =
+        LoggingContext.getInstance().getTagsAsMap().get(RequestId.Type.TRACE_ID.name()).stream()
+            .findAny();
+    if (existingTraceId.isPresent()) {
+      // request tracing was already started, no need to generate a new trace ID
+      traceIdConsumer.accept(RequestId.Type.TRACE_ID.name(), existingTraceId.get());
+      return open();
+    }
+
+    RequestId newTraceId = new RequestId();
+    traceIdConsumer.accept(RequestId.Type.TRACE_ID.name(), newTraceId.toString());
+    return open().addTag(RequestId.Type.TRACE_ID, newTraceId).forceLogging();
+  }
+
+  @FunctionalInterface
+  public interface TraceIdConsumer {
+    void accept(String tagName, String traceId);
+  }
+
+  /**
+   * Opens a new timer that logs the time for an operation if request tracing is enabled.
+   *
+   * <p>If request tracing is not enabled this is a no-op.
+   *
+   * @param message the message
+   * @return the trace timer
+   */
+  public static TraceTimer newTimer(String message) {
+    return new TraceTimer(message);
+  }
+
+  /**
+   * Opens a new timer that logs the time for an operation if request tracing is enabled.
+   *
+   * <p>If request tracing is not enabled this is a no-op.
+   *
+   * @param format the message format string
+   * @param arg argument for the message
+   * @return the trace timer
+   */
+  public static TraceTimer newTimer(String format, Object arg) {
+    return new TraceTimer(format, arg);
+  }
+
+  /**
+   * Opens a new timer that logs the time for an operation if request tracing is enabled.
+   *
+   * <p>If request tracing is not enabled this is a no-op.
+   *
+   * @param format the message format string
+   * @param arg1 first argument for the message
+   * @param arg2 second argument for the message
+   * @return the trace timer
+   */
+  public static TraceTimer newTimer(String format, Object arg1, Object arg2) {
+    return new TraceTimer(format, arg1, arg2);
+  }
+
+  /**
+   * Opens a new timer that logs the time for an operation if request tracing is enabled.
+   *
+   * <p>If request tracing is not enabled this is a no-op.
+   *
+   * @param format the message format string
+   * @param arg1 first argument for the message
+   * @param arg2 second argument for the message
+   * @param arg3 third argument for the message
+   * @return the trace timer
+   */
+  public static TraceTimer newTimer(String format, Object arg1, Object arg2, Object arg3) {
+    return new TraceTimer(format, arg1, arg2, arg3);
+  }
+
+  public static class TraceTimer implements AutoCloseable {
+    private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+    private final Consumer<Long> logFn;
+    private final Stopwatch stopwatch;
+
+    private TraceTimer(String message) {
+      this(elapsedMs -> logger.atFine().log(message + " (%d ms)", elapsedMs));
+    }
+
+    private TraceTimer(String format, @Nullable Object arg) {
+      this(elapsedMs -> logger.atFine().log(format + " (%d ms)", arg, elapsedMs));
+    }
+
+    private TraceTimer(String format, @Nullable Object arg1, @Nullable Object arg2) {
+      this(elapsedMs -> logger.atFine().log(format + " (%d ms)", arg1, arg2, elapsedMs));
+    }
+
+    private TraceTimer(
+        String format, @Nullable Object arg1, @Nullable Object arg2, @Nullable Object arg3) {
+      this(elapsedMs -> logger.atFine().log(format + " (%d ms)", arg1, arg2, arg3, elapsedMs));
+    }
+
+    private TraceTimer(Consumer<Long> logFn) {
+      this.logFn = logFn;
+      this.stopwatch = Stopwatch.createStarted();
+    }
+
+    @Override
+    public void close() {
+      stopwatch.stop();
+      logFn.accept(stopwatch.elapsed(TimeUnit.MILLISECONDS));
+    }
+  }
+
+  // Table<TAG_NAME, TAG_VALUE, REMOVE_ON_CLOSE>
+  private final Table<String, String, Boolean> tags = HashBasedTable.create();
+
+  private boolean stopForceLoggingOnClose;
+
+  private TraceContext() {}
+
+  public TraceContext addTag(RequestId.Type requestId, Object tagValue) {
+    return addTag(requireNonNull(requestId, "request ID is required").name(), tagValue);
+  }
+
+  public TraceContext addTag(String tagName, Object tagValue) {
+    String name = requireNonNull(tagName, "tag name is required");
+    String value = requireNonNull(tagValue, "tag value is required").toString();
+    tags.put(name, value, LoggingContext.getInstance().addTag(name, value));
+    return this;
+  }
+
+  public TraceContext addPluginTag(String pluginName) {
+    return addTag(PLUGIN_TAG, pluginName);
+  }
+
+  public TraceContext forceLogging() {
+    if (stopForceLoggingOnClose) {
+      return this;
+    }
+
+    stopForceLoggingOnClose = !LoggingContext.getInstance().forceLogging(true);
+    return this;
+  }
+
+  @Override
+  public void close() {
+    for (Table.Cell<String, String, Boolean> cell : tags.cellSet()) {
+      if (cell.getValue()) {
+        LoggingContext.getInstance().removeTag(cell.getRowKey(), cell.getColumnKey());
+      }
+    }
+    if (stopForceLoggingOnClose) {
+      LoggingContext.getInstance().forceLogging(false);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/mail/AutoReplyMailFilter.java b/java/com/google/gerrit/server/mail/AutoReplyMailFilter.java
new file mode 100644
index 0000000..e18fd42
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/AutoReplyMailFilter.java
@@ -0,0 +1,54 @@
+// 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.
+
+package com.google.gerrit.server.mail;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.mail.MailHeader;
+import com.google.gerrit.mail.MailMessage;
+import com.google.inject.Singleton;
+
+/** Filters out auto-reply messages according to RFC 3834. */
+@Singleton
+public class AutoReplyMailFilter implements MailFilter {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  @Override
+  public boolean shouldProcessMessage(MailMessage message) {
+    for (String header : message.additionalHeaders()) {
+      if (header.startsWith(MailHeader.PRECEDENCE.fieldWithDelimiter())) {
+        String prec = header.substring(MailHeader.PRECEDENCE.fieldWithDelimiter().length()).trim();
+
+        if (prec.equals("list") || prec.equals("junk") || prec.equals("bulk")) {
+          logger.atSevere().log(
+              "Message %s has a Precedence header. Will ignore and delete message.", message.id());
+          return false;
+        }
+
+      } else if (header.startsWith(MailHeader.AUTO_SUBMITTED.fieldWithDelimiter())) {
+        String autoSubmitted =
+            header.substring(MailHeader.AUTO_SUBMITTED.fieldWithDelimiter().length()).trim();
+
+        if (!autoSubmitted.equals("no")) {
+          logger.atSevere().log(
+              "Message %s has an Auto-Submitted header. Will ignore and delete message.",
+              message.id());
+          return false;
+        }
+      }
+    }
+
+    return true;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/EmailModule.java b/java/com/google/gerrit/server/mail/EmailModule.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/mail/EmailModule.java
rename to java/com/google/gerrit/server/mail/EmailModule.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/EmailSettings.java b/java/com/google/gerrit/server/mail/EmailSettings.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/mail/EmailSettings.java
rename to java/com/google/gerrit/server/mail/EmailSettings.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/EmailTokenVerifier.java b/java/com/google/gerrit/server/mail/EmailTokenVerifier.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/mail/EmailTokenVerifier.java
rename to java/com/google/gerrit/server/mail/EmailTokenVerifier.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/Encryption.java b/java/com/google/gerrit/server/mail/Encryption.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/mail/Encryption.java
rename to java/com/google/gerrit/server/mail/Encryption.java
diff --git a/java/com/google/gerrit/server/mail/ListMailFilter.java b/java/com/google/gerrit/server/mail/ListMailFilter.java
new file mode 100644
index 0000000..1549f8d
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/ListMailFilter.java
@@ -0,0 +1,63 @@
+// Copyright (C) 2017 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.google.gerrit.server.mail;
+
+import static java.util.stream.Collectors.joining;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.mail.MailMessage;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.Arrays;
+import java.util.regex.Pattern;
+import org.eclipse.jgit.lib.Config;
+
+@Singleton
+public class ListMailFilter implements MailFilter {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public enum ListFilterMode {
+    OFF,
+    WHITELIST,
+    BLACKLIST
+  }
+
+  private final ListFilterMode mode;
+  private final Pattern mailPattern;
+
+  @Inject
+  ListMailFilter(@GerritServerConfig Config cfg) {
+    this.mode = cfg.getEnum("receiveemail", "filter", "mode", ListFilterMode.OFF);
+    String[] addresses = cfg.getStringList("receiveemail", "filter", "patterns");
+    String concat = Arrays.asList(addresses).stream().collect(joining("|"));
+    this.mailPattern = Pattern.compile(concat);
+  }
+
+  @Override
+  public boolean shouldProcessMessage(MailMessage message) {
+    if (mode == ListFilterMode.OFF) {
+      return true;
+    }
+
+    boolean match = mailPattern.matcher(message.from().getEmail()).find();
+    if ((mode == ListFilterMode.WHITELIST && !match)
+        || (mode == ListFilterMode.BLACKLIST && match)) {
+      logger.atInfo().log("Mail message from %s rejected by list filter", message.from());
+      return false;
+    }
+    return true;
+  }
+}
diff --git a/java/com/google/gerrit/server/mail/MailFilter.java b/java/com/google/gerrit/server/mail/MailFilter.java
new file mode 100644
index 0000000..5fff8a3
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/MailFilter.java
@@ -0,0 +1,34 @@
+// Copyright (C) 2017 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.google.gerrit.server.mail;
+
+import com.google.gerrit.extensions.annotations.ExtensionPoint;
+import com.google.gerrit.mail.MailMessage;
+
+/**
+ * Listener to filter incoming email.
+ *
+ * <p>Invoked by Gerrit for each incoming email.
+ */
+@ExtensionPoint
+public interface MailFilter {
+  /**
+   * Determine if Gerrit should discard or further process the message.
+   *
+   * @param message MailMessage parsed by Gerrit.
+   * @return {@code true}, if Gerrit should process the message, {@code false} otherwise.
+   */
+  boolean shouldProcessMessage(MailMessage message);
+}
diff --git a/java/com/google/gerrit/server/mail/MailUtil.java b/java/com/google/gerrit/server/mail/MailUtil.java
new file mode 100644
index 0000000..507b53f
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/MailUtil.java
@@ -0,0 +1,134 @@
+// Copyright (C) 2013 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.google.gerrit.server.mail;
+
+import static com.google.gerrit.server.notedb.ReviewerStateInternal.CC;
+import static com.google.gerrit.server.notedb.ReviewerStateInternal.REVIEWER;
+
+import com.google.gerrit.common.FooterConstants;
+import com.google.gerrit.common.errors.NoSuchAccountException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.ReviewerSet;
+import com.google.gerrit.server.account.AccountResolver;
+import com.google.gwtorm.server.OrmException;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.regex.Pattern;
+import org.eclipse.jgit.revwalk.FooterKey;
+import org.eclipse.jgit.revwalk.FooterLine;
+
+public class MailUtil {
+
+  public static MailRecipients getRecipientsFromFooters(
+      AccountResolver accountResolver, List<FooterLine> footerLines)
+      throws OrmException, IOException {
+    MailRecipients recipients = new MailRecipients();
+    for (FooterLine footerLine : footerLines) {
+      try {
+        if (isReviewer(footerLine)) {
+          recipients.reviewers.add(toAccountId(accountResolver, footerLine.getValue().trim()));
+        } else if (footerLine.matches(FooterKey.CC)) {
+          recipients.cc.add(toAccountId(accountResolver, footerLine.getValue().trim()));
+        }
+      } catch (NoSuchAccountException e) {
+        continue;
+      }
+    }
+    return recipients;
+  }
+
+  public static MailRecipients getRecipientsFromReviewers(ReviewerSet reviewers) {
+    MailRecipients recipients = new MailRecipients();
+    recipients.reviewers.addAll(reviewers.byState(REVIEWER));
+    recipients.cc.addAll(reviewers.byState(CC));
+    return recipients;
+  }
+
+  private static Account.Id toAccountId(AccountResolver accountResolver, String nameOrEmail)
+      throws OrmException, NoSuchAccountException, IOException {
+    Account a = accountResolver.findByNameOrEmail(nameOrEmail);
+    if (a == null) {
+      throw new NoSuchAccountException("\"" + nameOrEmail + "\" is not registered");
+    }
+    return a.getId();
+  }
+
+  private static boolean isReviewer(FooterLine candidateFooterLine) {
+    return candidateFooterLine.matches(FooterKey.SIGNED_OFF_BY)
+        || candidateFooterLine.matches(FooterKey.ACKED_BY)
+        || candidateFooterLine.matches(FooterConstants.REVIEWED_BY)
+        || candidateFooterLine.matches(FooterConstants.TESTED_BY);
+  }
+
+  public static class MailRecipients {
+    private final Set<Account.Id> reviewers;
+    private final Set<Account.Id> cc;
+
+    public MailRecipients() {
+      this.reviewers = new HashSet<>();
+      this.cc = new HashSet<>();
+    }
+
+    public MailRecipients(Set<Account.Id> reviewers, Set<Account.Id> cc) {
+      this.reviewers = new HashSet<>(reviewers);
+      this.cc = new HashSet<>(cc);
+    }
+
+    public void add(MailRecipients recipients) {
+      reviewers.addAll(recipients.reviewers);
+      cc.addAll(recipients.cc);
+    }
+
+    public void remove(Account.Id toRemove) {
+      reviewers.remove(toRemove);
+      cc.remove(toRemove);
+    }
+
+    public Set<Account.Id> getReviewers() {
+      return Collections.unmodifiableSet(reviewers);
+    }
+
+    public Set<Account.Id> getCcOnly() {
+      final Set<Account.Id> cc = new HashSet<>(this.cc);
+      cc.removeAll(reviewers);
+      return Collections.unmodifiableSet(cc);
+    }
+
+    public Set<Account.Id> getAll() {
+      final Set<Account.Id> all = new HashSet<>(reviewers.size() + cc.size());
+      all.addAll(reviewers);
+      all.addAll(cc);
+      return Collections.unmodifiableSet(all);
+    }
+  }
+
+  /** allow wildcard matching for {@code domains} */
+  public static Pattern glob(String[] domains) {
+    // if domains is not set, match anything
+    if (domains == null || domains.length == 0) {
+      return Pattern.compile(".*");
+    }
+
+    StringBuilder sb = new StringBuilder("");
+    for (String domain : domains) {
+      String quoted = "\\Q" + domain.replace("\\E", "\\E\\\\E\\Q") + "\\E|";
+      sb.append(quoted.replace("*", "\\E.*\\Q"));
+    }
+    return Pattern.compile(sb.substring(0, sb.length() - 1));
+  }
+}
diff --git a/java/com/google/gerrit/server/mail/SignedTokenEmailTokenVerifier.java b/java/com/google/gerrit/server/mail/SignedTokenEmailTokenVerifier.java
new file mode 100644
index 0000000..66fe07e
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/SignedTokenEmailTokenVerifier.java
@@ -0,0 +1,90 @@
+// Copyright (C) 2012 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.google.gerrit.server.mail;
+
+import static com.google.common.base.Preconditions.checkState;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.config.AuthConfig;
+import com.google.gerrit.server.mail.send.RegisterNewEmailSender;
+import com.google.gwtjsonrpc.server.SignedToken;
+import com.google.gwtjsonrpc.server.ValidToken;
+import com.google.gwtjsonrpc.server.XsrfException;
+import com.google.inject.AbstractModule;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.jgit.util.Base64;
+
+/** Verifies the token sent by {@link RegisterNewEmailSender}. */
+@Singleton
+public class SignedTokenEmailTokenVerifier implements EmailTokenVerifier {
+  private final SignedToken emailRegistrationToken;
+
+  public static class Module extends AbstractModule {
+    @Override
+    protected void configure() {
+      bind(EmailTokenVerifier.class).to(SignedTokenEmailTokenVerifier.class);
+    }
+  }
+
+  @Inject
+  SignedTokenEmailTokenVerifier(AuthConfig config) {
+    emailRegistrationToken = config.getEmailRegistrationToken();
+  }
+
+  @Override
+  public String encode(Account.Id accountId, String emailAddress) {
+    checkEmailRegistrationToken();
+    try {
+      String payload = String.format("%s:%s", accountId, emailAddress);
+      byte[] utf8 = payload.getBytes(UTF_8);
+      String base64 = Base64.encodeBytes(utf8);
+      return emailRegistrationToken.newToken(base64);
+    } catch (XsrfException e) {
+      throw new IllegalArgumentException(e);
+    }
+  }
+
+  @Override
+  public ParsedToken decode(String tokenString) throws InvalidTokenException {
+    checkEmailRegistrationToken();
+    ValidToken token;
+    try {
+      token = emailRegistrationToken.checkToken(tokenString, null);
+    } catch (XsrfException err) {
+      throw new InvalidTokenException(err);
+    }
+    if (token == null || token.getData() == null || token.getData().isEmpty()) {
+      throw new InvalidTokenException();
+    }
+
+    String payload = new String(Base64.decode(token.getData()), UTF_8);
+    Matcher matcher = Pattern.compile("^([0-9]+):(.+@.+)$").matcher(payload);
+    if (!matcher.matches()) {
+      throw new InvalidTokenException();
+    }
+    Account.Id id = Account.Id.tryParse(matcher.group(1)).orElseThrow(InvalidTokenException::new);
+    String newEmail = matcher.group(2);
+    return new ParsedToken(id, newEmail);
+  }
+
+  private void checkEmailRegistrationToken() {
+    checkState(
+        emailRegistrationToken != null, "'auth.registerEmailPrivateKey' not set in gerrit.config");
+  }
+}
diff --git a/java/com/google/gerrit/server/mail/receive/ImapMailReceiver.java b/java/com/google/gerrit/server/mail/receive/ImapMailReceiver.java
new file mode 100644
index 0000000..648006d
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/receive/ImapMailReceiver.java
@@ -0,0 +1,139 @@
+// 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.
+
+package com.google.gerrit.server.mail.receive;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.mail.MailMessage;
+import com.google.gerrit.mail.MailParsingException;
+import com.google.gerrit.mail.RawMailParser;
+import com.google.gerrit.server.git.WorkQueue;
+import com.google.gerrit.server.mail.EmailSettings;
+import com.google.gerrit.server.mail.Encryption;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.commons.net.imap.IMAPClient;
+import org.apache.commons.net.imap.IMAPSClient;
+
+@Singleton
+public class ImapMailReceiver extends MailReceiver {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final String INBOX_FOLDER = "INBOX";
+
+  @Inject
+  ImapMailReceiver(EmailSettings mailSettings, MailProcessor mailProcessor, WorkQueue workQueue) {
+    super(mailSettings, mailProcessor, workQueue);
+  }
+
+  /**
+   * Opens a connection to the mail server, removes emails where deletion is pending, reads new
+   * email and closes the connection.
+   *
+   * @param async determines if processing messages should happen asynchronously
+   * @throws MailTransferException in case of a known transport failure
+   * @throws IOException in case of a low-level transport failure
+   */
+  @Override
+  public synchronized void handleEmails(boolean async) throws MailTransferException, IOException {
+    IMAPClient imap;
+    if (mailSettings.encryption != Encryption.NONE) {
+      imap = new IMAPSClient(mailSettings.encryption.name(), true);
+    } else {
+      imap = new IMAPClient();
+    }
+    if (mailSettings.port > 0) {
+      imap.setDefaultPort(mailSettings.port);
+    }
+    // Set a 30s timeout for each operation
+    imap.setDefaultTimeout(30 * 1000);
+    imap.connect(mailSettings.host);
+    try {
+      if (!imap.login(mailSettings.username, mailSettings.password)) {
+        throw new MailTransferException("Could not login to IMAP server");
+      }
+      try {
+        if (!imap.select(INBOX_FOLDER)) {
+          throw new MailTransferException("Could not select IMAP folder " + INBOX_FOLDER);
+        }
+        // Fetch just the internal dates first to know how many messages we
+        // should fetch.
+        if (!imap.fetch("1:*", "(INTERNALDATE)")) {
+          // false indicates that there are no messages to fetch
+          logger.atInfo().log("Fetched 0 messages via IMAP");
+          return;
+        }
+        // Format of reply is one line per email and one line to indicate
+        // that the fetch was successful.
+        // Example:
+        // * 1 FETCH (INTERNALDATE "Mon, 24 Oct 2016 16:53:22 +0200 (CEST)")
+        // * 2 FETCH (INTERNALDATE "Mon, 24 Oct 2016 16:53:22 +0200 (CEST)")
+        // AAAC OK FETCH completed.
+        int numMessages = imap.getReplyStrings().length - 1;
+        logger.atInfo().log("Fetched %d messages via IMAP", numMessages);
+        // Fetch the full version of all emails
+        List<MailMessage> mailMessages = new ArrayList<>(numMessages);
+        for (int i = 1; i <= numMessages; i++) {
+          if (imap.fetch(i + ":" + i, "(BODY.PEEK[])")) {
+            // Obtain full reply
+            String[] rawMessage = imap.getReplyStrings();
+            if (rawMessage.length < 2) {
+              continue;
+            }
+            // First and last line are IMAP status codes. We have already
+            // checked, that the fetch returned true (OK), so we safely ignore
+            // those two lines.
+            StringBuilder b = new StringBuilder(2 * (rawMessage.length - 2));
+            for (int j = 1; j < rawMessage.length - 1; j++) {
+              if (j > 1) {
+                b.append("\n");
+              }
+              b.append(rawMessage[j]);
+            }
+            try {
+              MailMessage mailMessage = RawMailParser.parse(b.toString());
+              if (pendingDeletion.contains(mailMessage.id())) {
+                // Mark message as deleted
+                if (imap.store(i + ":" + i, "+FLAGS", "(\\Deleted)")) {
+                  pendingDeletion.remove(mailMessage.id());
+                } else {
+                  logger.atSevere().log(
+                      "Could not mark mail message as deleted: %s", mailMessage.id());
+                }
+              } else {
+                mailMessages.add(mailMessage);
+              }
+            } catch (MailParsingException e) {
+              logger.atSevere().withCause(e).log("Exception while parsing email after IMAP fetch");
+            }
+          } else {
+            logger.atSevere().log("IMAP fetch failed. Will retry in next fetch cycle.");
+          }
+        }
+        // Permanently delete emails marked for deletion
+        if (!imap.expunge()) {
+          logger.atSevere().log("Could not expunge IMAP emails");
+        }
+        dispatchMailProcessor(mailMessages, async);
+      } finally {
+        imap.logout();
+      }
+    } finally {
+      imap.disconnect();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/mail/receive/MailProcessor.java b/java/com/google/gerrit/server/mail/receive/MailProcessor.java
new file mode 100644
index 0000000..15a71e0
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/receive/MailProcessor.java
@@ -0,0 +1,447 @@
+// 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.
+
+package com.google.gerrit.server.mail.receive;
+
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.ImmutableList;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.client.Side;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.registration.Extension;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.mail.HtmlParser;
+import com.google.gerrit.mail.MailComment;
+import com.google.gerrit.mail.MailHeaderParser;
+import com.google.gerrit.mail.MailMessage;
+import com.google.gerrit.mail.MailMetadata;
+import com.google.gerrit.mail.TextParser;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.PatchLineComment.Status;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.account.Emails;
+import com.google.gerrit.server.change.EmailReviewComments;
+import com.google.gerrit.server.config.UrlFormatter;
+import com.google.gerrit.server.extensions.events.CommentAdded;
+import com.google.gerrit.server.mail.MailFilter;
+import com.google.gerrit.server.mail.send.InboundEmailRejectionSender;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.patch.PatchListCache;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.Context;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.ManualRequestContext;
+import com.google.gerrit.server.util.OneOffRequestContext;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+
+/** A service that can attach the comments from a {@link MailMessage} to a change. */
+@Singleton
+public class MailProcessor {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final Emails emails;
+  private final InboundEmailRejectionSender.Factory emailRejectionSender;
+  private final RetryHelper retryHelper;
+  private final ChangeMessagesUtil changeMessagesUtil;
+  private final CommentsUtil commentsUtil;
+  private final OneOffRequestContext oneOffRequestContext;
+  private final PatchListCache patchListCache;
+  private final PatchSetUtil psUtil;
+  private final Provider<InternalChangeQuery> queryProvider;
+  private final DynamicMap<MailFilter> mailFilters;
+  private final EmailReviewComments.Factory outgoingMailFactory;
+  private final CommentAdded commentAdded;
+  private final ApprovalsUtil approvalsUtil;
+  private final AccountCache accountCache;
+  private final DynamicItem<UrlFormatter> urlFormatter;
+
+  @Inject
+  public MailProcessor(
+      Emails emails,
+      InboundEmailRejectionSender.Factory emailRejectionSender,
+      RetryHelper retryHelper,
+      ChangeMessagesUtil changeMessagesUtil,
+      CommentsUtil commentsUtil,
+      OneOffRequestContext oneOffRequestContext,
+      PatchListCache patchListCache,
+      PatchSetUtil psUtil,
+      Provider<InternalChangeQuery> queryProvider,
+      DynamicMap<MailFilter> mailFilters,
+      EmailReviewComments.Factory outgoingMailFactory,
+      ApprovalsUtil approvalsUtil,
+      CommentAdded commentAdded,
+      AccountCache accountCache,
+      DynamicItem<UrlFormatter> urlFormatter) {
+    this.emails = emails;
+    this.emailRejectionSender = emailRejectionSender;
+    this.retryHelper = retryHelper;
+    this.changeMessagesUtil = changeMessagesUtil;
+    this.commentsUtil = commentsUtil;
+    this.oneOffRequestContext = oneOffRequestContext;
+    this.patchListCache = patchListCache;
+    this.psUtil = psUtil;
+    this.queryProvider = queryProvider;
+    this.mailFilters = mailFilters;
+    this.outgoingMailFactory = outgoingMailFactory;
+    this.commentAdded = commentAdded;
+    this.approvalsUtil = approvalsUtil;
+    this.accountCache = accountCache;
+    this.urlFormatter = urlFormatter;
+  }
+
+  /**
+   * Parses comments from a {@link MailMessage} and persists them on the change.
+   *
+   * @param message {@link MailMessage} to process
+   */
+  public void process(MailMessage message) throws RestApiException, UpdateException {
+    retryHelper.execute(
+        buf -> {
+          processImpl(buf, message);
+          return null;
+        });
+  }
+
+  private void processImpl(BatchUpdate.Factory buf, MailMessage message)
+      throws OrmException, UpdateException, RestApiException, IOException {
+    for (Extension<MailFilter> filter : mailFilters) {
+      if (!filter.getProvider().get().shouldProcessMessage(message)) {
+        logger.atWarning().log(
+            "Message %s filtered by plugin %s %s. Will delete message.",
+            message.id(), filter.getPluginName(), filter.getExportName());
+        return;
+      }
+    }
+
+    MailMetadata metadata = MailHeaderParser.parse(message);
+
+    if (!metadata.hasRequiredFields()) {
+      logger.atSevere().log(
+          "Message %s is missing required metadata, have %s. Will delete message.",
+          message.id(), metadata);
+      sendRejectionEmail(message, InboundEmailRejectionSender.Error.PARSING_ERROR);
+      return;
+    }
+
+    Set<Account.Id> accountIds = emails.getAccountFor(metadata.author);
+
+    if (accountIds.size() != 1) {
+      logger.atSevere().log(
+          "Address %s could not be matched to a unique account. It was matched to %s."
+              + " Will delete message.",
+          metadata.author, accountIds);
+
+      // We don't want to send an email if no accounts are linked to it.
+      if (accountIds.size() > 1) {
+        sendRejectionEmail(message, InboundEmailRejectionSender.Error.UNKNOWN_ACCOUNT);
+      }
+      return;
+    }
+    Account.Id accountId = accountIds.iterator().next();
+    Optional<AccountState> accountState = accountCache.get(accountId);
+    if (!accountState.isPresent()) {
+      logger.atWarning().log("Mail: Account %s doesn't exist. Will delete message.", accountId);
+      return;
+    }
+    if (!accountState.get().getAccount().isActive()) {
+      logger.atWarning().log("Mail: Account %s is inactive. Will delete message.", accountId);
+      sendRejectionEmail(message, InboundEmailRejectionSender.Error.INACTIVE_ACCOUNT);
+      return;
+    }
+
+    persistComments(buf, message, metadata, accountId);
+  }
+
+  private void sendRejectionEmail(MailMessage message, InboundEmailRejectionSender.Error reason) {
+    try {
+      InboundEmailRejectionSender em =
+          emailRejectionSender.create(message.from(), message.id(), reason);
+      em.send();
+    } catch (Exception e) {
+      logger.atSevere().withCause(e).log("Cannot send email to warn for an error");
+    }
+  }
+
+  private void persistComments(
+      BatchUpdate.Factory buf, MailMessage message, MailMetadata metadata, Account.Id sender)
+      throws OrmException, UpdateException, RestApiException {
+    try (ManualRequestContext ctx = oneOffRequestContext.openAs(sender)) {
+      List<ChangeData> changeDataList =
+          queryProvider.get().byLegacyChangeId(new Change.Id(metadata.changeNumber));
+      if (changeDataList.size() != 1) {
+        logger.atSevere().log(
+            "Message %s references unique change %s,"
+                + " but there are %d matching changes in the index."
+                + " Will delete message.",
+            message.id(), metadata.changeNumber, changeDataList.size());
+
+        sendRejectionEmail(message, InboundEmailRejectionSender.Error.INTERNAL_EXCEPTION);
+        return;
+      }
+      ChangeData cd = changeDataList.get(0);
+      if (existingMessageIds(cd).contains(message.id())) {
+        logger.atInfo().log("Message %s was already processed. Will delete message.", message.id());
+        return;
+      }
+      // Get all comments; filter and sort them to get the original list of
+      // comments from the outbound email.
+      // TODO(hiesel) Also filter by original comment author.
+      Collection<Comment> comments =
+          cd.publishedComments().stream()
+              .filter(c -> (c.writtenOn.getTime() / 1000) == (metadata.timestamp.getTime() / 1000))
+              .sorted(CommentsUtil.COMMENT_ORDER)
+              .collect(toList());
+      Project.NameKey project = cd.project();
+
+      // If URL is not defined, we won't be able to parse line comments. We still attempt to get the
+      // other ones.
+      String changeUrl =
+          urlFormatter
+              .get()
+              .getChangeViewUrl(cd.project(), cd.getId())
+              .orElse("http://gerrit.invalid/");
+
+      List<MailComment> parsedComments;
+      if (useHtmlParser(message)) {
+        parsedComments = HtmlParser.parse(message, comments, changeUrl);
+      } else {
+        parsedComments = TextParser.parse(message, comments, changeUrl);
+      }
+
+      if (parsedComments.isEmpty()) {
+        logger.atWarning().log(
+            "Could not parse any comments from %s. Will delete message.", message.id());
+        sendRejectionEmail(message, InboundEmailRejectionSender.Error.PARSING_ERROR);
+        return;
+      }
+
+      Op o = new Op(new PatchSet.Id(cd.getId(), metadata.patchSet), parsedComments, message.id());
+      BatchUpdate batchUpdate = buf.create(cd.db(), project, ctx.getUser(), TimeUtil.nowTs());
+      batchUpdate.addOp(cd.getId(), o);
+      batchUpdate.execute();
+    }
+  }
+
+  private class Op implements BatchUpdateOp {
+    private final PatchSet.Id psId;
+    private final List<MailComment> parsedComments;
+    private final String tag;
+    private ChangeMessage changeMessage;
+    private List<Comment> comments;
+    private PatchSet patchSet;
+    private ChangeNotes notes;
+
+    private Op(PatchSet.Id psId, List<MailComment> parsedComments, String messageId) {
+      this.psId = psId;
+      this.parsedComments = parsedComments;
+      this.tag = "mailMessageId=" + messageId;
+    }
+
+    @Override
+    public boolean updateChange(ChangeContext ctx)
+        throws OrmException, UnprocessableEntityException, PatchListNotAvailableException {
+      patchSet = psUtil.get(ctx.getDb(), ctx.getNotes(), psId);
+      notes = ctx.getNotes();
+      if (patchSet == null) {
+        throw new OrmException("patch set not found: " + psId);
+      }
+
+      changeMessage = generateChangeMessage(ctx);
+      changeMessagesUtil.addChangeMessage(ctx.getDb(), ctx.getUpdate(psId), changeMessage);
+
+      comments = new ArrayList<>();
+      for (MailComment c : parsedComments) {
+        if (c.getType() == MailComment.CommentType.CHANGE_MESSAGE) {
+          continue;
+        }
+        comments.add(
+            persistentCommentFromMailComment(ctx, c, targetPatchSetForComment(ctx, c, patchSet)));
+      }
+      commentsUtil.putComments(
+          ctx.getDb(),
+          ctx.getUpdate(ctx.getChange().currentPatchSetId()),
+          Status.PUBLISHED,
+          comments);
+
+      return true;
+    }
+
+    @Override
+    public void postUpdate(Context ctx) throws Exception {
+      String patchSetComment = null;
+      if (parsedComments.get(0).getType() == MailComment.CommentType.CHANGE_MESSAGE) {
+        patchSetComment = parsedComments.get(0).getMessage();
+      }
+      // Send email notifications
+      outgoingMailFactory
+          .create(
+              NotifyHandling.ALL,
+              ArrayListMultimap.create(),
+              notes,
+              patchSet,
+              ctx.getUser().asIdentifiedUser(),
+              changeMessage,
+              comments,
+              patchSetComment,
+              ImmutableList.of())
+          .sendAsync();
+      // Get previous approvals from this user
+      Map<String, Short> approvals = new HashMap<>();
+      approvalsUtil
+          .byPatchSetUser(
+              ctx.getDb(),
+              notes,
+              psId,
+              ctx.getAccountId(),
+              ctx.getRevWalk(),
+              ctx.getRepoView().getConfig())
+          .forEach(a -> approvals.put(a.getLabel(), a.getValue()));
+      // Fire Gerrit event. Note that approvals can't be granted via email, so old and new approvals
+      // are always the same here.
+      commentAdded.fire(
+          notes.getChange(),
+          patchSet,
+          ctx.getAccount(),
+          changeMessage.getMessage(),
+          approvals,
+          approvals,
+          ctx.getWhen());
+    }
+
+    private ChangeMessage generateChangeMessage(ChangeContext ctx) {
+      String changeMsg = "Patch Set " + psId.get() + ":";
+      if (parsedComments.get(0).getType() == MailComment.CommentType.CHANGE_MESSAGE) {
+        // Add a blank line after Patch Set to follow the default format
+        if (parsedComments.size() > 1) {
+          changeMsg += "\n\n" + numComments(parsedComments.size() - 1);
+        }
+        changeMsg += "\n\n" + parsedComments.get(0).getMessage();
+      } else {
+        changeMsg += "\n\n" + numComments(parsedComments.size());
+      }
+      return ChangeMessagesUtil.newMessage(ctx, changeMsg, tag);
+    }
+
+    private PatchSet targetPatchSetForComment(
+        ChangeContext ctx, MailComment mailComment, PatchSet current) throws OrmException {
+      if (mailComment.getInReplyTo() != null) {
+        return psUtil.get(
+            ctx.getDb(),
+            ctx.getNotes(),
+            new PatchSet.Id(ctx.getChange().getId(), mailComment.getInReplyTo().key.patchSetId));
+      }
+      return current;
+    }
+
+    private Comment persistentCommentFromMailComment(
+        ChangeContext ctx, MailComment mailComment, PatchSet patchSetForComment)
+        throws OrmException, UnprocessableEntityException, PatchListNotAvailableException {
+      String fileName;
+      // The patch set that this comment is based on is different if this
+      // comment was sent in reply to a comment on a previous patch set.
+      Side side;
+      if (mailComment.getInReplyTo() != null) {
+        fileName = mailComment.getInReplyTo().key.filename;
+        side = Side.fromShort(mailComment.getInReplyTo().side);
+      } else {
+        fileName = mailComment.getFileName();
+        side = Side.REVISION;
+      }
+
+      Comment comment =
+          commentsUtil.newComment(
+              ctx,
+              fileName,
+              patchSetForComment.getId(),
+              (short) side.ordinal(),
+              mailComment.getMessage(),
+              false,
+              null);
+
+      comment.tag = tag;
+      if (mailComment.getInReplyTo() != null) {
+        comment.parentUuid = mailComment.getInReplyTo().key.uuid;
+        comment.lineNbr = mailComment.getInReplyTo().lineNbr;
+        comment.range = mailComment.getInReplyTo().range;
+        comment.unresolved = mailComment.getInReplyTo().unresolved;
+      }
+      CommentsUtil.setCommentRevId(comment, patchListCache, ctx.getChange(), patchSetForComment);
+      return comment;
+    }
+  }
+
+  private static boolean useHtmlParser(MailMessage m) {
+    return !Strings.isNullOrEmpty(m.htmlContent());
+  }
+
+  private static String numComments(int numComments) {
+    return "(" + numComments + (numComments > 1 ? " comments)" : " comment)");
+  }
+
+  private Set<String> existingMessageIds(ChangeData cd) throws OrmException {
+    Set<String> existingMessageIds = new HashSet<>();
+    cd.messages().stream()
+        .forEach(
+            m -> {
+              String messageId = CommentsUtil.extractMessageId(m.getTag());
+              if (messageId != null) {
+                existingMessageIds.add(messageId);
+              }
+            });
+    cd.publishedComments().stream()
+        .forEach(
+            c -> {
+              String messageId = CommentsUtil.extractMessageId(c.tag);
+              if (messageId != null) {
+                existingMessageIds.add(messageId);
+              }
+            });
+    return existingMessageIds;
+  }
+}
diff --git a/java/com/google/gerrit/server/mail/receive/MailReceiver.java b/java/com/google/gerrit/server/mail/receive/MailReceiver.java
new file mode 100644
index 0000000..dc99b46
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/receive/MailReceiver.java
@@ -0,0 +1,159 @@
+// 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.
+
+package com.google.gerrit.server.mail.receive;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.lifecycle.LifecycleModule;
+import com.google.gerrit.mail.MailMessage;
+import com.google.gerrit.server.git.WorkQueue;
+import com.google.gerrit.server.mail.EmailSettings;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.concurrent.Future;
+
+/** MailReceiver implements base functionality for receiving emails. */
+public abstract class MailReceiver implements LifecycleListener {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  protected EmailSettings mailSettings;
+  protected Set<String> pendingDeletion;
+  private MailProcessor mailProcessor;
+  private WorkQueue workQueue;
+  private Timer timer;
+
+  public static class Module extends LifecycleModule {
+    private final EmailSettings mailSettings;
+
+    @Inject
+    Module(EmailSettings mailSettings) {
+      this.mailSettings = mailSettings;
+    }
+
+    @Override
+    protected void configure() {
+      if (mailSettings.protocol == Protocol.NONE) {
+        return;
+      }
+      listener().to(MailReceiver.class);
+      switch (mailSettings.protocol) {
+        case IMAP:
+          bind(MailReceiver.class).to(ImapMailReceiver.class);
+          break;
+        case POP3:
+          bind(MailReceiver.class).to(Pop3MailReceiver.class);
+          break;
+        case NONE:
+        default:
+      }
+    }
+  }
+
+  MailReceiver(EmailSettings mailSettings, MailProcessor mailProcessor, WorkQueue workQueue) {
+    this.mailSettings = mailSettings;
+    this.mailProcessor = mailProcessor;
+    this.workQueue = workQueue;
+    pendingDeletion = Collections.synchronizedSet(new HashSet<>());
+  }
+
+  @Override
+  public void start() {
+    if (timer == null) {
+      timer = new Timer();
+    } else {
+      timer.cancel();
+    }
+    timer.scheduleAtFixedRate(
+        new TimerTask() {
+          @Override
+          public void run() {
+            try {
+              MailReceiver.this.handleEmails(true);
+            } catch (MailTransferException | IOException e) {
+              logger.atSevere().withCause(e).log("Error while fetching emails");
+            }
+          }
+        },
+        0L,
+        mailSettings.fetchInterval);
+  }
+
+  @Override
+  public void stop() {
+    if (timer != null) {
+      timer.cancel();
+    }
+  }
+
+  /**
+   * requestDeletion will enqueue an email for deletion and delete it the next time we connect to
+   * the email server. This does not guarantee deletion as the Gerrit instance might fail before we
+   * connect to the email server.
+   *
+   * @param messageId
+   */
+  public void requestDeletion(String messageId) {
+    pendingDeletion.add(messageId);
+  }
+
+  /**
+   * handleEmails will open a connection to the mail server, remove emails where deletion is
+   * pending, read new email and close the connection.
+   *
+   * @param async determines if processing messages should happen asynchronously
+   * @throws MailTransferException in case of a known transport failure
+   * @throws IOException in case of a low-level transport failure
+   */
+  @VisibleForTesting
+  public abstract void handleEmails(boolean async) throws MailTransferException, IOException;
+
+  protected void dispatchMailProcessor(List<MailMessage> messages, boolean async) {
+    for (MailMessage m : messages) {
+      if (async) {
+        @SuppressWarnings("unused")
+        Future<?> possiblyIgnoredError =
+            workQueue
+                .getDefaultQueue()
+                .submit(
+                    () -> {
+                      try {
+                        mailProcessor.process(m);
+                        requestDeletion(m.id());
+                      } catch (RestApiException | UpdateException e) {
+                        logger.atSevere().withCause(e).log(
+                            "Mail: Can't process message %s . Won't delete.", m.id());
+                      }
+                    });
+      } else {
+        // Synchronous processing is used only in tests.
+        try {
+          mailProcessor.process(m);
+          requestDeletion(m.id());
+        } catch (RestApiException | UpdateException e) {
+          logger.atSevere().withCause(e).log("Mail: Can't process messages. Won't delete.");
+        }
+      }
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailTransferException.java b/java/com/google/gerrit/server/mail/receive/MailTransferException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailTransferException.java
rename to java/com/google/gerrit/server/mail/receive/MailTransferException.java
diff --git a/java/com/google/gerrit/server/mail/receive/Pop3MailReceiver.java b/java/com/google/gerrit/server/mail/receive/Pop3MailReceiver.java
new file mode 100644
index 0000000..54971c4
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/receive/Pop3MailReceiver.java
@@ -0,0 +1,125 @@
+// 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.
+
+package com.google.gerrit.server.mail.receive;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.common.primitives.Ints;
+import com.google.gerrit.mail.MailMessage;
+import com.google.gerrit.mail.MailParsingException;
+import com.google.gerrit.mail.RawMailParser;
+import com.google.gerrit.server.git.WorkQueue;
+import com.google.gerrit.server.mail.EmailSettings;
+import com.google.gerrit.server.mail.Encryption;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.commons.net.pop3.POP3Client;
+import org.apache.commons.net.pop3.POP3MessageInfo;
+import org.apache.commons.net.pop3.POP3SClient;
+
+/** An implementation of {@link MailReceiver} for POP3. */
+@Singleton
+public class Pop3MailReceiver extends MailReceiver {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  @Inject
+  Pop3MailReceiver(EmailSettings mailSettings, MailProcessor mailProcessor, WorkQueue workQueue) {
+    super(mailSettings, mailProcessor, workQueue);
+  }
+
+  /**
+   * Opens a connection to the mail server, removes emails where deletion is pending, reads new
+   * email and closes the connection.
+   *
+   * @param async determines if processing messages should happen asynchronously
+   * @throws MailTransferException in case of a known transport failure
+   * @throws IOException in case of a low-level transport failure
+   */
+  @Override
+  public synchronized void handleEmails(boolean async) throws MailTransferException, IOException {
+    POP3Client pop3;
+    if (mailSettings.encryption != Encryption.NONE) {
+      pop3 = new POP3SClient(mailSettings.encryption.name(), true);
+    } else {
+      pop3 = new POP3Client();
+    }
+    if (mailSettings.port > 0) {
+      pop3.setDefaultPort(mailSettings.port);
+    }
+    pop3.connect(mailSettings.host);
+    try {
+      if (!pop3.login(mailSettings.username, mailSettings.password)) {
+        throw new MailTransferException(
+            "Could not login to POP3 email server. Check username and password");
+      }
+      try {
+        POP3MessageInfo[] messages = pop3.listMessages();
+        if (messages == null) {
+          throw new MailTransferException("Could not retrieve message list via POP3");
+        }
+        logger.atInfo().log("Received %d messages via POP3", messages.length);
+        // Fetch messages
+        List<MailMessage> mailMessages = new ArrayList<>();
+        for (POP3MessageInfo msginfo : messages) {
+          if (msginfo == null) {
+            // Message was deleted
+            continue;
+          }
+          try (BufferedReader reader = (BufferedReader) pop3.retrieveMessage(msginfo.number)) {
+            if (reader == null) {
+              throw new MailTransferException(
+                  "Could not retrieve POP3 message header for message " + msginfo.identifier);
+            }
+            int[] message = fetchMessage(reader);
+            MailMessage mailMessage = RawMailParser.parse(message);
+            // Delete messages where deletion is pending. This requires
+            // knowing the integer message ID of the email. We therefore parse
+            // the message first and extract the Message-ID specified in RFC
+            // 822 and delete the message if deletion is pending.
+            if (pendingDeletion.contains(mailMessage.id())) {
+              if (pop3.deleteMessage(msginfo.number)) {
+                pendingDeletion.remove(mailMessage.id());
+              } else {
+                logger.atSevere().log("Could not delete message %d", msginfo.number);
+              }
+            } else {
+              // Process message further
+              mailMessages.add(mailMessage);
+            }
+          } catch (MailParsingException e) {
+            logger.atSevere().log("Could not parse message %d", msginfo.number);
+          }
+        }
+        dispatchMailProcessor(mailMessages, async);
+      } finally {
+        pop3.logout();
+      }
+    } finally {
+      pop3.disconnect();
+    }
+  }
+
+  public final int[] fetchMessage(BufferedReader reader) throws IOException {
+    List<Integer> character = new ArrayList<>();
+    int ch;
+    while ((ch = reader.read()) != -1) {
+      character.add(ch);
+    }
+    return Ints.toArray(character);
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/Protocol.java b/java/com/google/gerrit/server/mail/receive/Protocol.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/Protocol.java
rename to java/com/google/gerrit/server/mail/receive/Protocol.java
diff --git a/java/com/google/gerrit/server/mail/send/AbandonedSender.java b/java/com/google/gerrit/server/mail/send/AbandonedSender.java
new file mode 100644
index 0000000..05dd542
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/AbandonedSender.java
@@ -0,0 +1,61 @@
+// Copyright (C) 2009 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.google.gerrit.server.mail.send;
+
+import com.google.gerrit.common.errors.EmailException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+
+/** Send notice about a change being abandoned by its owner. */
+public class AbandonedSender extends ReplyToChangeSender {
+  public interface Factory extends ReplyToChangeSender.Factory<AbandonedSender> {
+    @Override
+    AbandonedSender create(Project.NameKey project, Change.Id change);
+  }
+
+  @Inject
+  public AbandonedSender(
+      EmailArguments ea, @Assisted Project.NameKey project, @Assisted Change.Id id)
+      throws OrmException {
+    super(ea, "abandon", ChangeEmail.newChangeData(ea, project, id));
+  }
+
+  @Override
+  protected void init() throws EmailException {
+    super.init();
+
+    ccAllApprovals();
+    bccStarredBy();
+    includeWatchers(NotifyType.ABANDONED_CHANGES);
+    removeUsersThatIgnoredTheChange();
+  }
+
+  @Override
+  protected void formatChange() throws EmailException {
+    appendText(textTemplate("Abandoned"));
+    if (useHtml()) {
+      appendHtml(soyHtmlTemplate("AbandonedHtml"));
+    }
+  }
+
+  @Override
+  protected boolean supportsHtml() {
+    return true;
+  }
+}
diff --git a/java/com/google/gerrit/server/mail/send/AddKeySender.java b/java/com/google/gerrit/server/mail/send/AddKeySender.java
new file mode 100644
index 0000000..433bd9b
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/AddKeySender.java
@@ -0,0 +1,154 @@
+// Copyright (C) 2015 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.google.gerrit.server.mail.send;
+
+import com.google.common.base.Joiner;
+import com.google.gerrit.common.errors.EmailException;
+import com.google.gerrit.extensions.api.changes.RecipientType;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountSshKey;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.inject.assistedinject.Assisted;
+import com.google.inject.assistedinject.AssistedInject;
+import java.util.List;
+
+public class AddKeySender extends OutgoingEmail {
+  public interface Factory {
+    AddKeySender create(IdentifiedUser user, AccountSshKey sshKey);
+
+    AddKeySender create(IdentifiedUser user, List<String> gpgKey);
+  }
+
+  private final PermissionBackend permissionBackend;
+  private final IdentifiedUser callingUser;
+  private final IdentifiedUser user;
+  private final AccountSshKey sshKey;
+  private final List<String> gpgKeys;
+
+  @AssistedInject
+  public AddKeySender(
+      EmailArguments ea,
+      PermissionBackend permissionBackend,
+      IdentifiedUser callingUser,
+      @Assisted IdentifiedUser user,
+      @Assisted AccountSshKey sshKey) {
+    super(ea, "addkey");
+    this.permissionBackend = permissionBackend;
+    this.callingUser = callingUser;
+    this.user = user;
+    this.sshKey = sshKey;
+    this.gpgKeys = null;
+  }
+
+  @AssistedInject
+  public AddKeySender(
+      EmailArguments ea,
+      PermissionBackend permissionBackend,
+      IdentifiedUser callingUser,
+      @Assisted IdentifiedUser user,
+      @Assisted List<String> gpgKeys) {
+    super(ea, "addkey");
+    this.permissionBackend = permissionBackend;
+    this.callingUser = callingUser;
+    this.user = user;
+    this.sshKey = null;
+    this.gpgKeys = gpgKeys;
+  }
+
+  @Override
+  protected void init() throws EmailException {
+    super.init();
+    setHeader("Subject", String.format("[Gerrit Code Review] New %s Keys Added", getKeyType()));
+    add(RecipientType.TO, new Address(getEmail()));
+  }
+
+  @Override
+  protected boolean shouldSendMessage() {
+    if (sshKey == null && (gpgKeys == null || gpgKeys.isEmpty())) {
+      // Don't email if no keys were added.
+      return false;
+    }
+
+    if (user.equals(callingUser)) {
+      // Send email if the user self-added a key; this notification is necessary to alert
+      // the user if their account was compromised and a key was unexpectedly added.
+      return true;
+    }
+
+    try {
+      // Don't email if an administrator added a key on behalf of the user.
+      permissionBackend.user(callingUser).check(GlobalPermission.ADMINISTRATE_SERVER);
+      return false;
+    } catch (AuthException | PermissionBackendException e) {
+      // Send email if a non-administrator modified the keys, e.g. by MODIFY_ACCOUNT.
+      return true;
+    }
+  }
+
+  @Override
+  protected void format() throws EmailException {
+    appendText(textTemplate("AddKey"));
+    if (useHtml()) {
+      appendHtml(soyHtmlTemplate("AddKeyHtml"));
+    }
+  }
+
+  public String getEmail() {
+    return user.getAccount().getPreferredEmail();
+  }
+
+  public String getUserNameEmail() {
+    return getUserNameEmailFor(user.getAccountId());
+  }
+
+  public String getKeyType() {
+    if (sshKey != null) {
+      return "SSH";
+    } else if (gpgKeys != null) {
+      return "GPG";
+    }
+    return "Unknown";
+  }
+
+  public String getSshKey() {
+    return (sshKey != null) ? sshKey.sshPublicKey() + "\n" : null;
+  }
+
+  public String getGpgKeys() {
+    if (gpgKeys != null) {
+      return Joiner.on("\n").join(gpgKeys);
+    }
+    return null;
+  }
+
+  @Override
+  protected void setupSoyContext() {
+    super.setupSoyContext();
+    soyContextEmailData.put("email", getEmail());
+    soyContextEmailData.put("gpgKeys", getGpgKeys());
+    soyContextEmailData.put("keyType", getKeyType());
+    soyContextEmailData.put("sshKey", getSshKey());
+    soyContextEmailData.put("userNameEmail", getUserNameEmail());
+  }
+
+  @Override
+  protected boolean supportsHtml() {
+    return true;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/AddReviewerSender.java b/java/com/google/gerrit/server/mail/send/AddReviewerSender.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/mail/send/AddReviewerSender.java
rename to java/com/google/gerrit/server/mail/send/AddReviewerSender.java
diff --git a/java/com/google/gerrit/server/mail/send/ChangeEmail.java b/java/com/google/gerrit/server/mail/send/ChangeEmail.java
new file mode 100644
index 0000000..8b8f6f9
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/ChangeEmail.java
@@ -0,0 +1,599 @@
+// 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.
+
+package com.google.gerrit.server.mail.send;
+
+import com.google.common.base.Splitter;
+import com.google.common.collect.ListMultimap;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.errors.EmailException;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.api.changes.RecipientType;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.mail.MailHeader;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetInfo;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.StarredChangesUtil;
+import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gerrit.server.mail.send.ProjectWatch.Watchers;
+import com.google.gerrit.server.notedb.ReviewerStateInternal;
+import com.google.gerrit.server.patch.PatchList;
+import com.google.gerrit.server.patch.PatchListEntry;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+import com.google.gerrit.server.patch.PatchListObjectTooLargeException;
+import com.google.gerrit.server.patch.PatchSetInfoNotAvailableException;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gwtorm.server.OrmException;
+import com.google.template.soy.data.SoyListData;
+import com.google.template.soy.data.SoyMapData;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.text.MessageFormat;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import org.apache.james.mime4j.dom.field.FieldName;
+import org.eclipse.jgit.diff.DiffFormatter;
+import org.eclipse.jgit.internal.JGitText;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.util.RawParseUtils;
+import org.eclipse.jgit.util.TemporaryBuffer;
+
+/** Sends an email to one or more interested parties. */
+public abstract class ChangeEmail extends NotificationEmail {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  protected static ChangeData newChangeData(
+      EmailArguments ea, Project.NameKey project, Change.Id id) {
+    return ea.changeDataFactory.create(ea.db.get(), project, id);
+  }
+
+  protected final Change change;
+  protected final ChangeData changeData;
+  protected ListMultimap<Account.Id, String> stars;
+  protected PatchSet patchSet;
+  protected PatchSetInfo patchSetInfo;
+  protected String changeMessage;
+  protected Timestamp timestamp;
+
+  protected ProjectState projectState;
+  protected Set<Account.Id> authors;
+  protected boolean emailOnlyAuthors;
+
+  protected ChangeEmail(EmailArguments ea, String mc, ChangeData cd) throws OrmException {
+    super(ea, mc, cd.change().getDest());
+    changeData = cd;
+    change = cd.change();
+    emailOnlyAuthors = false;
+  }
+
+  @Override
+  public void setFrom(Account.Id id) {
+    super.setFrom(id);
+
+    /** Is the from user in an email squelching group? */
+    try {
+      args.permissionBackend.absentUser(id).check(GlobalPermission.EMAIL_REVIEWERS);
+    } catch (AuthException | PermissionBackendException e) {
+      emailOnlyAuthors = true;
+    }
+  }
+
+  public void setPatchSet(PatchSet ps) {
+    patchSet = ps;
+  }
+
+  public void setPatchSet(PatchSet ps, PatchSetInfo psi) {
+    patchSet = ps;
+    patchSetInfo = psi;
+  }
+
+  public void setChangeMessage(String cm, Timestamp t) {
+    changeMessage = cm;
+    timestamp = t;
+  }
+
+  /** Format the message body by calling {@link #appendText(String)}. */
+  @Override
+  protected void format() throws EmailException {
+    formatChange();
+    appendText(textTemplate("ChangeFooter"));
+    if (useHtml()) {
+      appendHtml(soyHtmlTemplate("ChangeFooterHtml"));
+    }
+    formatFooter();
+  }
+
+  /** Format the message body by calling {@link #appendText(String)}. */
+  protected abstract void formatChange() throws EmailException;
+
+  /**
+   * Format the message footer by calling {@link #appendText(String)}.
+   *
+   * @throws EmailException if an error occurred.
+   */
+  protected void formatFooter() throws EmailException {}
+
+  /** Setup the message headers and envelope (TO, CC, BCC). */
+  @Override
+  protected void init() throws EmailException {
+    if (args.projectCache != null) {
+      projectState = args.projectCache.get(change.getProject());
+    } else {
+      projectState = null;
+    }
+
+    if (patchSet == null) {
+      try {
+        patchSet = changeData.currentPatchSet();
+      } catch (OrmException err) {
+        patchSet = null;
+      }
+    }
+
+    if (patchSet != null) {
+      setHeader(MailHeader.PATCH_SET.fieldName(), patchSet.getPatchSetId() + "");
+      if (patchSetInfo == null) {
+        try {
+          patchSetInfo =
+              args.patchSetInfoFactory.get(args.db.get(), changeData.notes(), patchSet.getId());
+        } catch (PatchSetInfoNotAvailableException | OrmException err) {
+          patchSetInfo = null;
+        }
+      }
+    }
+    authors = getAuthors();
+
+    try {
+      stars = changeData.stars();
+    } catch (OrmException e) {
+      throw new EmailException("Failed to load stars for change " + change.getChangeId(), e);
+    }
+
+    super.init();
+    if (timestamp != null) {
+      setHeader(FieldName.DATE, new Date(timestamp.getTime()));
+    }
+    setChangeSubjectHeader();
+    setHeader(MailHeader.CHANGE_ID.fieldName(), "" + change.getKey().get());
+    setHeader(MailHeader.CHANGE_NUMBER.fieldName(), "" + change.getChangeId());
+    setChangeUrlHeader();
+    setCommitIdHeader();
+
+    if (notify.ordinal() >= NotifyHandling.OWNER_REVIEWERS.ordinal()) {
+      try {
+        addByEmail(
+            RecipientType.CC, changeData.reviewersByEmail().byState(ReviewerStateInternal.CC));
+        addByEmail(
+            RecipientType.CC,
+            changeData.reviewersByEmail().byState(ReviewerStateInternal.REVIEWER));
+      } catch (OrmException e) {
+        throw new EmailException("Failed to add unregistered CCs " + change.getChangeId(), e);
+      }
+    }
+  }
+
+  private void setChangeUrlHeader() {
+    final String u = getChangeUrl();
+    if (u != null) {
+      setHeader(MailHeader.CHANGE_URL.fieldName(), "<" + u + ">");
+    }
+  }
+
+  private void setCommitIdHeader() {
+    if (patchSet != null
+        && patchSet.getRevision() != null
+        && patchSet.getRevision().get() != null
+        && patchSet.getRevision().get().length() > 0) {
+      setHeader(MailHeader.COMMIT.fieldName(), patchSet.getRevision().get());
+    }
+  }
+
+  private void setChangeSubjectHeader() {
+    setHeader(FieldName.SUBJECT, textTemplate("ChangeSubject"));
+  }
+
+  /** Get a link to the change; null if the server doesn't know its own address. */
+  @Nullable
+  public String getChangeUrl() {
+    return args.urlFormatter
+        .get()
+        .getChangeViewUrl(change.getProject(), change.getId())
+        .orElse(null);
+  }
+
+  public String getChangeMessageThreadId() {
+    return "<gerrit."
+        + change.getCreatedOn().getTime()
+        + "."
+        + change.getKey().get()
+        + "@"
+        + this.getGerritHost()
+        + ">";
+  }
+
+  /** Get the text of the "cover letter". */
+  public String getCoverLetter() {
+    if (changeMessage != null) {
+      return changeMessage.trim();
+    }
+    return "";
+  }
+
+  /** Create the change message and the affected file list. */
+  public String getChangeDetail() {
+    try {
+      StringBuilder detail = new StringBuilder();
+
+      if (patchSetInfo != null) {
+        detail.append(patchSetInfo.getMessage().trim()).append("\n");
+      } else {
+        detail.append(change.getSubject().trim()).append("\n");
+      }
+
+      if (patchSet != null) {
+        detail.append("---\n");
+        PatchList patchList = getPatchList();
+        for (PatchListEntry p : patchList.getPatches()) {
+          if (Patch.isMagic(p.getNewName())) {
+            continue;
+          }
+          detail
+              .append(p.getChangeType().getCode())
+              .append(" ")
+              .append(p.getNewName())
+              .append("\n");
+        }
+        detail.append(
+            MessageFormat.format(
+                "" //
+                    + "{0,choice,0#0 files|1#1 file|1<{0} files} changed, " //
+                    + "{1,choice,0#0 insertions|1#1 insertion|1<{1} insertions}(+), " //
+                    + "{2,choice,0#0 deletions|1#1 deletion|1<{2} deletions}(-)" //
+                    + "\n",
+                patchList.getPatches().size() - 1, //
+                patchList.getInsertions(), //
+                patchList.getDeletions()));
+        detail.append("\n");
+      }
+      return detail.toString();
+    } catch (Exception err) {
+      logger.atWarning().withCause(err).log("Cannot format change detail");
+      return "";
+    }
+  }
+
+  /** Get the patch list corresponding to patch set patchSetId of this change. */
+  protected PatchList getPatchList(int patchSetId) throws PatchListNotAvailableException {
+    PatchSet ps;
+    if (patchSetId == patchSet.getPatchSetId()) {
+      ps = patchSet;
+    } else {
+      try {
+        ps =
+            args.patchSetUtil.get(
+                changeData.db(), changeData.notes(), new PatchSet.Id(change.getId(), patchSetId));
+      } catch (OrmException e) {
+        throw new PatchListNotAvailableException("Failed to get patchSet");
+      }
+    }
+    return args.patchListCache.get(change, ps);
+  }
+
+  /** Get the patch list corresponding to this patch set. */
+  protected PatchList getPatchList() throws PatchListNotAvailableException {
+    if (patchSet != null) {
+      return args.patchListCache.get(change, patchSet);
+    }
+    throw new PatchListNotAvailableException("no patchSet specified");
+  }
+
+  /** Get the project entity the change is in; null if its been deleted. */
+  protected ProjectState getProjectState() {
+    return projectState;
+  }
+
+  /** TO or CC all vested parties (change owner, patch set uploader, author). */
+  protected void rcptToAuthors(RecipientType rt) {
+    for (Account.Id id : authors) {
+      add(rt, id);
+    }
+  }
+
+  /** BCC any user who has starred this change. */
+  protected void bccStarredBy() {
+    if (!NotifyHandling.ALL.equals(notify)) {
+      return;
+    }
+
+    for (Map.Entry<Account.Id, Collection<String>> e : stars.asMap().entrySet()) {
+      if (e.getValue().contains(StarredChangesUtil.DEFAULT_LABEL)) {
+        super.add(RecipientType.BCC, e.getKey());
+      }
+    }
+  }
+
+  protected void removeUsersThatIgnoredTheChange() {
+    for (Map.Entry<Account.Id, Collection<String>> e : stars.asMap().entrySet()) {
+      if (e.getValue().contains(StarredChangesUtil.IGNORE_LABEL)) {
+        args.accountCache.get(e.getKey()).ifPresent(a -> removeUser(a.getAccount()));
+      }
+    }
+  }
+
+  @Override
+  protected final Watchers getWatchers(NotifyType type, boolean includeWatchersFromNotifyConfig)
+      throws OrmException {
+    if (!NotifyHandling.ALL.equals(notify)) {
+      return new Watchers();
+    }
+
+    ProjectWatch watch = new ProjectWatch(args, branch.getParentKey(), projectState, changeData);
+    return watch.getWatchers(type, includeWatchersFromNotifyConfig);
+  }
+
+  /** Any user who has published comments on this change. */
+  protected void ccAllApprovals() {
+    if (!NotifyHandling.ALL.equals(notify) && !NotifyHandling.OWNER_REVIEWERS.equals(notify)) {
+      return;
+    }
+
+    try {
+      for (Account.Id id : changeData.reviewers().all()) {
+        add(RecipientType.CC, id);
+      }
+    } catch (OrmException err) {
+      logger.atWarning().withCause(err).log("Cannot CC users that reviewed updated change");
+    }
+  }
+
+  /** Users who have non-zero approval codes on the change. */
+  protected void ccExistingReviewers() {
+    if (!NotifyHandling.ALL.equals(notify) && !NotifyHandling.OWNER_REVIEWERS.equals(notify)) {
+      return;
+    }
+
+    try {
+      for (Account.Id id : changeData.reviewers().byState(ReviewerStateInternal.REVIEWER)) {
+        add(RecipientType.CC, id);
+      }
+    } catch (OrmException err) {
+      logger.atWarning().withCause(err).log("Cannot CC users that commented on updated change");
+    }
+  }
+
+  @Override
+  protected void add(RecipientType rt, Account.Id to) {
+    if (!emailOnlyAuthors || authors.contains(to)) {
+      super.add(rt, to);
+    }
+  }
+
+  @Override
+  protected boolean isVisibleTo(Account.Id to) throws PermissionBackendException {
+    if (!projectState.statePermitsRead()) {
+      return false;
+    }
+    try {
+      args.permissionBackend
+          .absentUser(to)
+          .change(changeData)
+          .database(args.db)
+          .check(ChangePermission.READ);
+      return true;
+    } catch (AuthException e) {
+      return false;
+    }
+  }
+
+  /** Find all users who are authors of any part of this change. */
+  protected Set<Account.Id> getAuthors() {
+    Set<Account.Id> authors = new HashSet<>();
+
+    switch (notify) {
+      case NONE:
+        break;
+      case ALL:
+      default:
+        if (patchSet != null) {
+          authors.add(patchSet.getUploader());
+        }
+        if (patchSetInfo != null) {
+          if (patchSetInfo.getAuthor().getAccount() != null) {
+            authors.add(patchSetInfo.getAuthor().getAccount());
+          }
+          if (patchSetInfo.getCommitter().getAccount() != null) {
+            authors.add(patchSetInfo.getCommitter().getAccount());
+          }
+        }
+        // $FALL-THROUGH$
+      case OWNER_REVIEWERS:
+      case OWNER:
+        authors.add(change.getOwner());
+        break;
+    }
+
+    return authors;
+  }
+
+  @Override
+  protected void setupSoyContext() {
+    super.setupSoyContext();
+
+    soyContext.put("changeId", change.getKey().get());
+    soyContext.put("coverLetter", getCoverLetter());
+    soyContext.put("fromName", getNameFor(fromId));
+    soyContext.put("fromEmail", getNameEmailFor(fromId));
+    soyContext.put("diffLines", getDiffTemplateData());
+
+    soyContextEmailData.put("unifiedDiff", getUnifiedDiff());
+    soyContextEmailData.put("changeDetail", getChangeDetail());
+    soyContextEmailData.put("changeUrl", getChangeUrl());
+    soyContextEmailData.put("includeDiff", getIncludeDiff());
+
+    Map<String, String> changeData = new HashMap<>();
+
+    String subject = change.getSubject();
+    String originalSubject = change.getOriginalSubject();
+    changeData.put("subject", subject);
+    changeData.put("originalSubject", originalSubject);
+    changeData.put("shortSubject", shortenSubject(subject));
+    changeData.put("shortOriginalSubject", shortenSubject(originalSubject));
+
+    changeData.put("ownerName", getNameFor(change.getOwner()));
+    changeData.put("ownerEmail", getNameEmailFor(change.getOwner()));
+    changeData.put("changeNumber", Integer.toString(change.getChangeId()));
+    soyContext.put("change", changeData);
+
+    Map<String, Object> patchSetData = new HashMap<>();
+    patchSetData.put("patchSetId", patchSet.getPatchSetId());
+    patchSetData.put("refName", patchSet.getRefName());
+    soyContext.put("patchSet", patchSetData);
+
+    Map<String, Object> patchSetInfoData = new HashMap<>();
+    patchSetInfoData.put("authorName", patchSetInfo.getAuthor().getName());
+    patchSetInfoData.put("authorEmail", patchSetInfo.getAuthor().getEmail());
+    soyContext.put("patchSetInfo", patchSetInfoData);
+
+    footers.add(MailHeader.CHANGE_ID.withDelimiter() + change.getKey().get());
+    footers.add(MailHeader.CHANGE_NUMBER.withDelimiter() + Integer.toString(change.getChangeId()));
+    footers.add(MailHeader.PATCH_SET.withDelimiter() + patchSet.getPatchSetId());
+    footers.add(MailHeader.OWNER.withDelimiter() + getNameEmailFor(change.getOwner()));
+    if (change.getAssignee() != null) {
+      footers.add(MailHeader.ASSIGNEE.withDelimiter() + getNameEmailFor(change.getAssignee()));
+    }
+    for (String reviewer : getEmailsByState(ReviewerStateInternal.REVIEWER)) {
+      footers.add(MailHeader.REVIEWER.withDelimiter() + reviewer);
+    }
+    for (String reviewer : getEmailsByState(ReviewerStateInternal.CC)) {
+      footers.add(MailHeader.CC.withDelimiter() + reviewer);
+    }
+  }
+
+  /**
+   * A shortened subject is the subject limited to 72 characters, with an ellipsis if it exceeds
+   * that limit.
+   */
+  private static String shortenSubject(String subject) {
+    if (subject.length() < 73) {
+      return subject;
+    }
+    return subject.substring(0, 69) + "...";
+  }
+
+  private Set<String> getEmailsByState(ReviewerStateInternal state) {
+    Set<String> reviewers = new TreeSet<>();
+    try {
+      for (Account.Id who : changeData.reviewers().byState(state)) {
+        reviewers.add(getNameEmailFor(who));
+      }
+    } catch (OrmException e) {
+      logger.atWarning().withCause(e).log("Cannot get change reviewers");
+    }
+    return reviewers;
+  }
+
+  public boolean getIncludeDiff() {
+    return args.settings.includeDiff;
+  }
+
+  private static final int HEAP_EST_SIZE = 32 * 1024;
+
+  /** Show patch set as unified difference. */
+  public String getUnifiedDiff() {
+    PatchList patchList;
+    try {
+      patchList = getPatchList();
+      if (patchList.getOldId() == null) {
+        // Octopus merges are not well supported for diff output by Gerrit.
+        // Currently these always have a null oldId in the PatchList.
+        return "[Octopus merge; cannot be formatted as a diff.]\n";
+      }
+    } catch (PatchListObjectTooLargeException e) {
+      logger.atWarning().log("Cannot format patch %s", e.getMessage());
+      return "";
+    } catch (PatchListNotAvailableException e) {
+      logger.atSevere().withCause(e).log("Cannot format patch");
+      return "";
+    }
+
+    int maxSize = args.settings.maximumDiffSize;
+    TemporaryBuffer.Heap buf = new TemporaryBuffer.Heap(Math.min(HEAP_EST_SIZE, maxSize), maxSize);
+    try (DiffFormatter fmt = new DiffFormatter(buf)) {
+      try (Repository git = args.server.openRepository(change.getProject())) {
+        try {
+          fmt.setRepository(git);
+          fmt.setDetectRenames(true);
+          fmt.format(patchList.getOldId(), patchList.getNewId());
+          return RawParseUtils.decode(buf.toByteArray());
+        } catch (IOException e) {
+          if (JGitText.get().inMemoryBufferLimitExceeded.equals(e.getMessage())) {
+            return "";
+          }
+          logger.atSevere().withCause(e).log("Cannot format patch");
+          return "";
+        }
+      } catch (IOException e) {
+        logger.atSevere().withCause(e).log("Cannot open repository to format patch");
+        return "";
+      }
+    }
+  }
+
+  /**
+   * Generate a Soy list of maps representing each line of the unified diff. The line maps will have
+   * a 'type' key which maps to one of 'common', 'add' or 'remove' and a 'text' key which maps to
+   * the line's content.
+   */
+  private SoyListData getDiffTemplateData() {
+    SoyListData result = new SoyListData();
+    Splitter lineSplitter = Splitter.on(System.getProperty("line.separator"));
+    for (String diffLine : lineSplitter.split(getUnifiedDiff())) {
+      SoyMapData lineData = new SoyMapData();
+      lineData.put("text", diffLine);
+
+      // Skip empty lines and lines that look like diff headers.
+      if (diffLine.isEmpty() || diffLine.startsWith("---") || diffLine.startsWith("+++")) {
+        lineData.put("type", "common");
+      } else {
+        switch (diffLine.charAt(0)) {
+          case '+':
+            lineData.put("type", "add");
+            break;
+          case '-':
+            lineData.put("type", "remove");
+            break;
+          default:
+            lineData.put("type", "common");
+            break;
+        }
+      }
+      result.add(lineData);
+    }
+    return result;
+  }
+}
diff --git a/java/com/google/gerrit/server/mail/send/CommentFormatter.java b/java/com/google/gerrit/server/mail/send/CommentFormatter.java
new file mode 100644
index 0000000..2590505
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/CommentFormatter.java
@@ -0,0 +1,182 @@
+// 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.
+
+package com.google.gerrit.server.mail.send;
+
+import static com.google.common.base.Strings.isNullOrEmpty;
+
+import com.google.common.base.Splitter;
+import com.google.gerrit.common.Nullable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class CommentFormatter {
+  public enum BlockType {
+    LIST,
+    PARAGRAPH,
+    PRE_FORMATTED,
+    QUOTE
+  }
+
+  public static class Block {
+    public BlockType type;
+    public String text;
+    public List<String> items; // For the items of list blocks.
+    public List<Block> quotedBlocks; // For the contents of quote blocks.
+  }
+
+  /**
+   * Take a string of comment text that was written using the wiki-Like format and emit a list of
+   * blocks that can be rendered to block-level HTML. This method does not escape HTML.
+   *
+   * <p>Adapted from the {@code wikify} method found in:
+   * com.google.gwtexpui.safehtml.client.SafeHtml
+   *
+   * @param source The raw, unescaped comment in the Gerrit wiki-like format.
+   * @return List of block objects, each with unescaped comment content.
+   */
+  public static List<Block> parse(@Nullable String source) {
+    if (isNullOrEmpty(source)) {
+      return Collections.emptyList();
+    }
+
+    List<Block> result = new ArrayList<>();
+    for (String p : Splitter.on("\n\n").split(source)) {
+      if (isQuote(p)) {
+        result.add(makeQuote(p));
+      } else if (isPreFormat(p)) {
+        result.add(makePre(p));
+      } else if (isList(p)) {
+        makeList(p, result);
+      } else if (!p.isEmpty()) {
+        result.add(makeParagraph(p));
+      }
+    }
+    return result;
+  }
+
+  /**
+   * Take a block of comment text that contains a list and potentially paragraphs (but does not
+   * contain blank lines), generate appropriate block elements and append them to the output list.
+   *
+   * <p>In simple cases, this will generate a single list block. For example, on the following
+   * input.
+   *
+   * <p>* Item one. * Item two. * item three.
+   *
+   * <p>However, if the list is adjacent to a paragraph, it will need to also generate that
+   * paragraph. Consider the following input.
+   *
+   * <p>A bit of text describing the context of the list: * List item one. * List item two. * Et
+   * cetera.
+   *
+   * <p>In this case, {@code makeList} generates a paragraph block object containing the
+   * non-bullet-prefixed text, followed by a list block.
+   *
+   * <p>Adapted from the {@code wikifyList} method found in:
+   * com.google.gwtexpui.safehtml.client.SafeHtml
+   *
+   * @param p The block containing the list (as well as potential paragraphs).
+   * @param out The list of blocks to append to.
+   */
+  private static void makeList(String p, List<Block> out) {
+    Block block = null;
+    StringBuilder textBuilder = null;
+    boolean inList = false;
+    boolean inParagraph = false;
+
+    for (String line : Splitter.on('\n').split(p)) {
+      if (line.startsWith("-") || line.startsWith("*")) {
+        // The next line looks like a list item. If not building a list already,
+        // then create one. Remove the list item marker (* or -) from the line.
+        if (!inList) {
+          if (inParagraph) {
+            // Add the finished paragraph block to the result.
+            inParagraph = false;
+            block.text = textBuilder.toString();
+            out.add(block);
+          }
+
+          inList = true;
+          block = new Block();
+          block.type = BlockType.LIST;
+          block.items = new ArrayList<>();
+        }
+        line = line.substring(1).trim();
+
+      } else if (!inList) {
+        // Otherwise, if a list has not yet been started, but the next line does
+        // not look like a list item, then add the line to a paragraph block. If
+        // a paragraph block has not yet been started, then create one.
+        if (!inParagraph) {
+          inParagraph = true;
+          block = new Block();
+          block.type = BlockType.PARAGRAPH;
+          textBuilder = new StringBuilder();
+        } else {
+          textBuilder.append(" ");
+        }
+        textBuilder.append(line);
+        continue;
+      }
+
+      block.items.add(line);
+    }
+
+    if (block != null) {
+      out.add(block);
+    }
+  }
+
+  private static Block makeQuote(String p) {
+    String quote = p.replaceAll("\n\\s?>\\s?", "\n");
+    if (quote.startsWith("> ")) {
+      quote = quote.substring(2);
+    } else if (quote.startsWith(" > ")) {
+      quote = quote.substring(3);
+    }
+
+    Block block = new Block();
+    block.type = BlockType.QUOTE;
+    block.quotedBlocks = CommentFormatter.parse(quote);
+    return block;
+  }
+
+  private static Block makePre(String p) {
+    Block block = new Block();
+    block.type = BlockType.PRE_FORMATTED;
+    block.text = p;
+    return block;
+  }
+
+  private static Block makeParagraph(String p) {
+    Block block = new Block();
+    block.type = BlockType.PARAGRAPH;
+    block.text = p;
+    return block;
+  }
+
+  private static boolean isQuote(String p) {
+    return p.startsWith("> ") || p.startsWith(" > ");
+  }
+
+  private static boolean isPreFormat(String p) {
+    return p.startsWith(" ") || p.startsWith("\t") || p.contains("\n ") || p.contains("\n\t");
+  }
+
+  private static boolean isList(String p) {
+    return p.startsWith("- ") || p.startsWith("* ") || p.contains("\n- ") || p.contains("\n* ");
+  }
+}
diff --git a/java/com/google/gerrit/server/mail/send/CommentSender.java b/java/com/google/gerrit/server/mail/send/CommentSender.java
new file mode 100644
index 0000000..69a7926
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/CommentSender.java
@@ -0,0 +1,575 @@
+// 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.
+
+package com.google.gerrit.server.mail.send;
+
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Ordering;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.FilenameComparator;
+import com.google.gerrit.common.errors.EmailException;
+import com.google.gerrit.common.errors.NoSuchEntityException;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.mail.MailHeader;
+import com.google.gerrit.mail.MailProcessingUtil;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RobotComment;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.mail.receive.Protocol;
+import com.google.gerrit.server.patch.PatchFile;
+import com.google.gerrit.server.patch.PatchList;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+import com.google.gerrit.server.patch.PatchListObjectTooLargeException;
+import com.google.gerrit.server.util.LabelVote;
+import com.google.gwtorm.client.KeyUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import org.apache.james.mime4j.dom.field.FieldName;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.Repository;
+
+/** Send comments, after the author of them hit used Publish Comments in the UI. */
+public class CommentSender extends ReplyToChangeSender {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public interface Factory {
+    CommentSender create(Project.NameKey project, Change.Id id);
+  }
+
+  private class FileCommentGroup {
+    public String filename;
+    public int patchSetId;
+    public PatchFile fileData;
+    public List<Comment> comments = new ArrayList<>();
+
+    /** @return a web link to the given patch set and file. */
+    public String getLink() {
+      String url = getGerritUrl();
+      if (url == null) {
+        return null;
+      }
+
+      return new StringBuilder()
+          .append(url)
+          .append("#/c/")
+          .append(change.getId())
+          .append('/')
+          .append(patchSetId)
+          .append('/')
+          .append(KeyUtil.encode(filename))
+          .toString();
+    }
+
+    /**
+     * @return A title for the group, i.e. "Commit Message", "Merge List", or "File [[filename]]".
+     */
+    public String getTitle() {
+      if (Patch.COMMIT_MSG.equals(filename)) {
+        return "Commit Message";
+      } else if (Patch.MERGE_LIST.equals(filename)) {
+        return "Merge List";
+      } else {
+        return "File " + filename;
+      }
+    }
+  }
+
+  private List<Comment> inlineComments = Collections.emptyList();
+  private String patchSetComment;
+  private List<LabelVote> labels = Collections.emptyList();
+  private final CommentsUtil commentsUtil;
+  private final boolean incomingEmailEnabled;
+  private final String replyToAddress;
+
+  @Inject
+  public CommentSender(
+      EmailArguments ea,
+      CommentsUtil commentsUtil,
+      @GerritServerConfig Config cfg,
+      @Assisted Project.NameKey project,
+      @Assisted Change.Id id)
+      throws OrmException {
+    super(ea, "comment", newChangeData(ea, project, id));
+    this.commentsUtil = commentsUtil;
+    this.incomingEmailEnabled =
+        cfg.getEnum("receiveemail", null, "protocol", Protocol.NONE).ordinal()
+            > Protocol.NONE.ordinal();
+    this.replyToAddress = cfg.getString("sendemail", null, "replyToAddress");
+  }
+
+  public void setComments(List<Comment> comments) throws OrmException {
+    inlineComments = comments;
+
+    Set<String> paths = new HashSet<>();
+    for (Comment c : comments) {
+      if (!Patch.isMagic(c.key.filename)) {
+        paths.add(c.key.filename);
+      }
+    }
+    changeData.setCurrentFilePaths(Ordering.natural().sortedCopy(paths));
+  }
+
+  public void setPatchSetComment(String comment) {
+    this.patchSetComment = comment;
+  }
+
+  public void setLabels(List<LabelVote> labels) {
+    this.labels = labels;
+  }
+
+  @Override
+  protected void init() throws EmailException {
+    super.init();
+
+    if (notify.compareTo(NotifyHandling.OWNER_REVIEWERS) >= 0) {
+      ccAllApprovals();
+    }
+    if (notify.compareTo(NotifyHandling.ALL) >= 0) {
+      bccStarredBy();
+      includeWatchers(NotifyType.ALL_COMMENTS, !change.isWorkInProgress() && !change.isPrivate());
+    }
+    removeUsersThatIgnoredTheChange();
+
+    // Add header that enables identifying comments on parsed email.
+    // Grouping is currently done by timestamp.
+    setHeader(MailHeader.COMMENT_DATE.fieldName(), timestamp);
+
+    if (incomingEmailEnabled) {
+      if (replyToAddress == null) {
+        // Remove Reply-To and use outbound SMTP (default) instead.
+        removeHeader(FieldName.REPLY_TO);
+      } else {
+        setHeader(FieldName.REPLY_TO, replyToAddress);
+      }
+    }
+  }
+
+  @Override
+  public void formatChange() throws EmailException {
+    appendText(textTemplate("Comment"));
+    if (useHtml()) {
+      appendHtml(soyHtmlTemplate("CommentHtml"));
+    }
+  }
+
+  @Override
+  public void formatFooter() throws EmailException {
+    appendText(textTemplate("CommentFooter"));
+    if (useHtml()) {
+      appendHtml(soyHtmlTemplate("CommentFooterHtml"));
+    }
+  }
+
+  /**
+   * @return a list of FileCommentGroup objects representing the inline comments grouped by the
+   *     file.
+   */
+  private List<CommentSender.FileCommentGroup> getGroupedInlineComments(Repository repo) {
+    List<CommentSender.FileCommentGroup> groups = new ArrayList<>();
+
+    // Loop over the comments and collect them into groups based on the file
+    // location of the comment.
+    FileCommentGroup currentGroup = null;
+    for (Comment c : inlineComments) {
+      // If it's a new group:
+      if (currentGroup == null
+          || !c.key.filename.equals(currentGroup.filename)
+          || c.key.patchSetId != currentGroup.patchSetId) {
+        currentGroup = new FileCommentGroup();
+        currentGroup.filename = c.key.filename;
+        currentGroup.patchSetId = c.key.patchSetId;
+        // Get the patch list:
+        PatchList patchList = null;
+        try {
+          patchList = getPatchList(c.key.patchSetId);
+        } catch (PatchListObjectTooLargeException e) {
+          logger.atWarning().log("Failed to get patch list: %s", e.getMessage());
+        } catch (PatchListNotAvailableException e) {
+          logger.atSevere().withCause(e).log("Failed to get patch list");
+        }
+
+        groups.add(currentGroup);
+        if (patchList != null) {
+          try {
+            currentGroup.fileData = new PatchFile(repo, patchList, c.key.filename);
+          } catch (IOException e) {
+            logger.atWarning().withCause(e).log(
+                "Cannot load %s from %s in %s",
+                c.key.filename, patchList.getNewId().name(), projectState.getName());
+            currentGroup.fileData = null;
+          }
+        }
+      }
+
+      if (currentGroup.fileData != null) {
+        currentGroup.comments.add(c);
+      }
+    }
+
+    groups.sort(Comparator.comparing(g -> g.filename, FilenameComparator.INSTANCE));
+    return groups;
+  }
+
+  /** Get the set of accounts whose comments have been replied to in this email. */
+  private HashSet<Account.Id> getReplyAccounts() {
+    HashSet<Account.Id> replyAccounts = new HashSet<>();
+
+    // Track visited parent UUIDs to avoid cycles.
+    HashSet<String> visitedUuids = new HashSet<>();
+
+    for (Comment comment : inlineComments) {
+      visitedUuids.add(comment.key.uuid);
+
+      // Traverse the parent relation to the top of the comment thread.
+      Comment current = comment;
+      while (current.parentUuid != null && !visitedUuids.contains(current.parentUuid)) {
+        Optional<Comment> optParent = getParent(current);
+        if (!optParent.isPresent()) {
+          // There is a parent UUID, but it cannot be loaded, break from the comment thread.
+          break;
+        }
+
+        Comment parent = optParent.get();
+        replyAccounts.add(parent.author.getId());
+        visitedUuids.add(current.parentUuid);
+        current = parent;
+      }
+    }
+    return replyAccounts;
+  }
+
+  private String getCommentLinePrefix(Comment comment) {
+    int lineNbr = comment.range == null ? comment.lineNbr : comment.range.startLine;
+    StringBuilder sb = new StringBuilder();
+    sb.append("PS").append(comment.key.patchSetId);
+    if (lineNbr != 0) {
+      sb.append(", Line ").append(lineNbr);
+    }
+    sb.append(": ");
+    return sb.toString();
+  }
+
+  /**
+   * @return the lines of file content in fileData that are encompassed by range on the given side.
+   */
+  private List<String> getLinesByRange(Comment.Range range, PatchFile fileData, short side) {
+    List<String> lines = new ArrayList<>();
+
+    for (int n = range.startLine; n <= range.endLine; n++) {
+      String s = getLine(fileData, side, n);
+      if (n == range.startLine && n == range.endLine && range.startChar < range.endChar) {
+        s = s.substring(Math.min(range.startChar, s.length()), Math.min(range.endChar, s.length()));
+      } else if (n == range.startLine) {
+        s = s.substring(Math.min(range.startChar, s.length()));
+      } else if (n == range.endLine) {
+        s = s.substring(0, Math.min(range.endChar, s.length()));
+      }
+      lines.add(s);
+    }
+    return lines;
+  }
+
+  /**
+   * Get the parent comment of a given comment.
+   *
+   * @param child the comment with a potential parent comment.
+   * @return an optional comment that will be present if the given comment has a parent, and is
+   *     empty if it does not.
+   */
+  private Optional<Comment> getParent(Comment child) {
+    if (child.parentUuid == null) {
+      return Optional.empty();
+    }
+
+    Comment.Key key = new Comment.Key(child.parentUuid, child.key.filename, child.key.patchSetId);
+    try {
+      return commentsUtil.getPublished(args.db.get(), changeData.notes(), key);
+    } catch (OrmException e) {
+      logger.atWarning().log("Could not find the parent of this comment: %s", child);
+      return Optional.empty();
+    }
+  }
+
+  /**
+   * Retrieve the file lines referred to by a comment.
+   *
+   * @param comment The comment that refers to some file contents. The comment may be a line comment
+   *     or a ranged comment.
+   * @param fileData The file on which the comment appears.
+   * @return file contents referred to by the comment. If the comment is a line comment, the result
+   *     will be a list of one string. Otherwise it will be a list of one or more strings.
+   */
+  private List<String> getLinesOfComment(Comment comment, PatchFile fileData) {
+    List<String> lines = new ArrayList<>();
+    if (comment.lineNbr == 0) {
+      // file level comment has no line
+      return lines;
+    }
+    if (comment.range == null) {
+      lines.add(getLine(fileData, comment.side, comment.lineNbr));
+    } else {
+      lines.addAll(getLinesByRange(comment.range, fileData, comment.side));
+    }
+    return lines;
+  }
+
+  /**
+   * @return a shortened version of the given comment's message. Will be shortened to 100 characters
+   *     or the first line, or following the last period within the first 100 characters, whichever
+   *     is shorter. If the message is shortened, an ellipsis is appended.
+   */
+  protected static String getShortenedCommentMessage(String message) {
+    int threshold = 100;
+    String fullMessage = message.trim();
+    String msg = fullMessage;
+
+    if (msg.length() > threshold) {
+      msg = msg.substring(0, threshold);
+    }
+
+    int lf = msg.indexOf('\n');
+    int period = msg.lastIndexOf('.');
+
+    if (lf > 0) {
+      // Truncate if a line feed appears within the threshold.
+      msg = msg.substring(0, lf);
+
+    } else if (period > 0) {
+      // Otherwise truncate if there is a period within the threshold.
+      msg = msg.substring(0, period + 1);
+    }
+
+    // Append an ellipsis if the message has been truncated.
+    if (!msg.equals(fullMessage)) {
+      msg += " […]";
+    }
+
+    return msg;
+  }
+
+  protected static String getShortenedCommentMessage(Comment comment) {
+    return getShortenedCommentMessage(comment.message);
+  }
+
+  /**
+   * @return grouped inline comment data mapped to data structures that are suitable for passing
+   *     into Soy.
+   */
+  private List<Map<String, Object>> getCommentGroupsTemplateData(Repository repo) {
+    List<Map<String, Object>> commentGroups = new ArrayList<>();
+
+    for (CommentSender.FileCommentGroup group : getGroupedInlineComments(repo)) {
+      Map<String, Object> groupData = new HashMap<>();
+      groupData.put("link", group.getLink());
+      groupData.put("title", group.getTitle());
+      groupData.put("patchSetId", group.patchSetId);
+
+      List<Map<String, Object>> commentsList = new ArrayList<>();
+      for (Comment comment : group.comments) {
+        Map<String, Object> commentData = new HashMap<>();
+        commentData.put("lines", getLinesOfComment(comment, group.fileData));
+        commentData.put("message", comment.message.trim());
+        List<CommentFormatter.Block> blocks = CommentFormatter.parse(comment.message);
+        commentData.put("messageBlocks", commentBlocksToSoyData(blocks));
+
+        // Set the prefix.
+        String prefix = getCommentLinePrefix(comment);
+        commentData.put("linePrefix", prefix);
+        commentData.put("linePrefixEmpty", Strings.padStart(": ", prefix.length(), ' '));
+
+        // Set line numbers.
+        int startLine;
+        if (comment.range == null) {
+          startLine = comment.lineNbr;
+        } else {
+          startLine = comment.range.startLine;
+          commentData.put("endLine", comment.range.endLine);
+        }
+        commentData.put("startLine", startLine);
+
+        // Set the comment link.
+        if (comment.lineNbr == 0) {
+          commentData.put("link", group.getLink());
+        } else if (comment.side == 0) {
+          commentData.put("link", group.getLink() + "@a" + startLine);
+        } else {
+          commentData.put("link", group.getLink() + '@' + startLine);
+        }
+
+        // Set robot comment data.
+        if (comment instanceof RobotComment) {
+          RobotComment robotComment = (RobotComment) comment;
+          commentData.put("isRobotComment", true);
+          commentData.put("robotId", robotComment.robotId);
+          commentData.put("robotRunId", robotComment.robotRunId);
+          commentData.put("robotUrl", robotComment.url);
+        } else {
+          commentData.put("isRobotComment", false);
+        }
+
+        // If the comment has a quote, don't bother loading the parent message.
+        if (!hasQuote(blocks)) {
+          // Set parent comment info.
+          Optional<Comment> parent = getParent(comment);
+          if (parent.isPresent()) {
+            commentData.put("parentMessage", getShortenedCommentMessage(parent.get()));
+          }
+        }
+
+        commentsList.add(commentData);
+      }
+      groupData.put("comments", commentsList);
+
+      commentGroups.add(groupData);
+    }
+    return commentGroups;
+  }
+
+  private List<Map<String, Object>> commentBlocksToSoyData(List<CommentFormatter.Block> blocks) {
+    return blocks.stream()
+        .map(
+            b -> {
+              Map<String, Object> map = new HashMap<>();
+              switch (b.type) {
+                case PARAGRAPH:
+                  map.put("type", "paragraph");
+                  map.put("text", b.text);
+                  break;
+                case PRE_FORMATTED:
+                  map.put("type", "pre");
+                  map.put("text", b.text);
+                  break;
+                case QUOTE:
+                  map.put("type", "quote");
+                  map.put("quotedBlocks", commentBlocksToSoyData(b.quotedBlocks));
+                  break;
+                case LIST:
+                  map.put("type", "list");
+                  map.put("items", b.items);
+                  break;
+              }
+              return map;
+            })
+        .collect(toList());
+  }
+
+  private boolean hasQuote(List<CommentFormatter.Block> blocks) {
+    for (CommentFormatter.Block block : blocks) {
+      if (block.type == CommentFormatter.BlockType.QUOTE) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  private Repository getRepository() {
+    try {
+      return args.server.openRepository(projectState.getNameKey());
+    } catch (IOException e) {
+      return null;
+    }
+  }
+
+  @Override
+  protected void setupSoyContext() {
+    super.setupSoyContext();
+    boolean hasComments;
+    try (Repository repo = getRepository()) {
+      List<Map<String, Object>> files = getCommentGroupsTemplateData(repo);
+      soyContext.put("commentFiles", files);
+      hasComments = !files.isEmpty();
+    }
+
+    soyContext.put(
+        "patchSetCommentBlocks", commentBlocksToSoyData(CommentFormatter.parse(patchSetComment)));
+    soyContext.put("labels", getLabelVoteSoyData(labels));
+    soyContext.put("commentCount", inlineComments.size());
+    soyContext.put("commentTimestamp", getCommentTimestamp());
+    soyContext.put(
+        "coverLetterBlocks", commentBlocksToSoyData(CommentFormatter.parse(getCoverLetter())));
+
+    footers.add(MailHeader.COMMENT_DATE.withDelimiter() + getCommentTimestamp());
+    footers.add(MailHeader.HAS_COMMENTS.withDelimiter() + (hasComments ? "Yes" : "No"));
+    footers.add(MailHeader.HAS_LABELS.withDelimiter() + (labels.isEmpty() ? "No" : "Yes"));
+
+    for (Account.Id account : getReplyAccounts()) {
+      footers.add(MailHeader.COMMENT_IN_REPLY_TO.withDelimiter() + getNameEmailFor(account));
+    }
+  }
+
+  private String getLine(PatchFile fileInfo, short side, int lineNbr) {
+    try {
+      return fileInfo.getLine(side, lineNbr);
+    } catch (IOException err) {
+      // Default to the empty string if the file cannot be safely read.
+      logger.atWarning().withCause(err).log("Failed to read file on side %d", side);
+      return "";
+    } catch (IndexOutOfBoundsException err) {
+      // Default to the empty string if the given line number does not appear
+      // in the file.
+      logger.atFine().withCause(err).log("Failed to get line number of file on side %d", side);
+      return "";
+    } catch (NoSuchEntityException err) {
+      // Default to the empty string if the side cannot be found.
+      logger.atWarning().withCause(err).log("Side %d of file didn't exist", side);
+      return "";
+    }
+  }
+
+  private List<Map<String, Object>> getLabelVoteSoyData(List<LabelVote> votes) {
+    List<Map<String, Object>> result = new ArrayList<>();
+    for (LabelVote vote : votes) {
+      Map<String, Object> data = new HashMap<>();
+      data.put("label", vote.label());
+
+      // Soy needs the short to be cast as an int for it to get converted to the
+      // correct tamplate type.
+      data.put("value", (int) vote.value());
+      result.add(data);
+    }
+    return result;
+  }
+
+  private String getCommentTimestamp() {
+    // Grouping is currently done by timestamp.
+    return MailProcessingUtil.rfcDateformatter.format(
+        ZonedDateTime.ofInstant(timestamp.toInstant(), ZoneId.of("UTC")));
+  }
+
+  @Override
+  protected boolean supportsHtml() {
+    return true;
+  }
+}
diff --git a/java/com/google/gerrit/server/mail/send/CreateChangeSender.java b/java/com/google/gerrit/server/mail/send/CreateChangeSender.java
new file mode 100644
index 0000000..fc9c14a
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/CreateChangeSender.java
@@ -0,0 +1,85 @@
+// Copyright (C) 2009 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.google.gerrit.server.mail.send;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.errors.EmailException;
+import com.google.gerrit.extensions.api.changes.RecipientType;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gerrit.server.mail.send.ProjectWatch.Watchers;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.util.stream.StreamSupport;
+
+/** Notify interested parties of a brand new change. */
+public class CreateChangeSender extends NewChangeSender {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public interface Factory {
+    CreateChangeSender create(Project.NameKey project, Change.Id id);
+  }
+
+  private final PermissionBackend permissionBackend;
+
+  @Inject
+  public CreateChangeSender(
+      EmailArguments ea,
+      PermissionBackend permissionBackend,
+      @Assisted Project.NameKey project,
+      @Assisted Change.Id id)
+      throws OrmException {
+    super(ea, newChangeData(ea, project, id));
+    this.permissionBackend = permissionBackend;
+  }
+
+  @Override
+  protected void init() throws EmailException {
+    super.init();
+
+    try {
+      // Upgrade watching owners from CC and BCC to TO.
+      Watchers matching =
+          getWatchers(NotifyType.NEW_CHANGES, !change.isWorkInProgress() && !change.isPrivate());
+      // TODO(hiesel): Remove special handling for owners
+      StreamSupport.stream(matching.all().accounts.spliterator(), false)
+          .filter(this::isOwnerOfProjectOrBranch)
+          .forEach(acc -> add(RecipientType.TO, acc));
+      // Add everyone else. Owners added above will not be duplicated.
+      add(RecipientType.TO, matching.to);
+      add(RecipientType.CC, matching.cc);
+      add(RecipientType.BCC, matching.bcc);
+    } catch (OrmException err) {
+      // Just don't CC everyone. Better to send a partial message to those
+      // we already have queued up then to fail deliver entirely to people
+      // who have a lower interest in the change.
+      logger.atWarning().withCause(err).log("Cannot notify watchers for new change");
+    }
+
+    includeWatchers(NotifyType.NEW_PATCHSETS, !change.isWorkInProgress() && !change.isPrivate());
+  }
+
+  private boolean isOwnerOfProjectOrBranch(Account.Id userId) {
+    return permissionBackend
+        .absentUser(userId)
+        .ref(change.getDest())
+        .testOrFalse(RefPermission.WRITE_CONFIG);
+  }
+}
diff --git a/java/com/google/gerrit/server/mail/send/DeleteReviewerSender.java b/java/com/google/gerrit/server/mail/send/DeleteReviewerSender.java
new file mode 100644
index 0000000..576d506
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/DeleteReviewerSender.java
@@ -0,0 +1,103 @@
+// 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.
+
+package com.google.gerrit.server.mail.send;
+
+import com.google.gerrit.common.errors.EmailException;
+import com.google.gerrit.extensions.api.changes.RecipientType;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/** Let users know that a reviewer and possibly her review have been removed. */
+public class DeleteReviewerSender extends ReplyToChangeSender {
+  private final Set<Account.Id> reviewers = new HashSet<>();
+  private final Set<Address> reviewersByEmail = new HashSet<>();
+
+  public interface Factory extends ReplyToChangeSender.Factory<DeleteReviewerSender> {
+    @Override
+    DeleteReviewerSender create(Project.NameKey project, Change.Id change);
+  }
+
+  @Inject
+  public DeleteReviewerSender(
+      EmailArguments ea, @Assisted Project.NameKey project, @Assisted Change.Id id)
+      throws OrmException {
+    super(ea, "deleteReviewer", newChangeData(ea, project, id));
+  }
+
+  public void addReviewers(Collection<Account.Id> cc) {
+    reviewers.addAll(cc);
+  }
+
+  public void addReviewersByEmail(Collection<Address> cc) {
+    reviewersByEmail.addAll(cc);
+  }
+
+  @Override
+  protected void init() throws EmailException {
+    super.init();
+
+    ccAllApprovals();
+    bccStarredBy();
+    ccExistingReviewers();
+    includeWatchers(NotifyType.ALL_COMMENTS);
+    add(RecipientType.TO, reviewers);
+    addByEmail(RecipientType.TO, reviewersByEmail);
+    removeUsersThatIgnoredTheChange();
+  }
+
+  @Override
+  protected void formatChange() throws EmailException {
+    appendText(textTemplate("DeleteReviewer"));
+    if (useHtml()) {
+      appendHtml(soyHtmlTemplate("DeleteReviewerHtml"));
+    }
+  }
+
+  public List<String> getReviewerNames() {
+    if (reviewers.isEmpty() && reviewersByEmail.isEmpty()) {
+      return null;
+    }
+    List<String> names = new ArrayList<>();
+    for (Account.Id id : reviewers) {
+      names.add(getNameFor(id));
+    }
+    for (Address a : reviewersByEmail) {
+      names.add(a.toString());
+    }
+    return names;
+  }
+
+  @Override
+  protected void setupSoyContext() {
+    super.setupSoyContext();
+    soyContextEmailData.put("reviewerNames", getReviewerNames());
+  }
+
+  @Override
+  protected boolean supportsHtml() {
+    return true;
+  }
+}
diff --git a/java/com/google/gerrit/server/mail/send/DeleteVoteSender.java b/java/com/google/gerrit/server/mail/send/DeleteVoteSender.java
new file mode 100644
index 0000000..0c81293
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/DeleteVoteSender.java
@@ -0,0 +1,61 @@
+// 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.
+
+package com.google.gerrit.server.mail.send;
+
+import com.google.gerrit.common.errors.EmailException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+
+/** Send notice about a vote that was removed from a change. */
+public class DeleteVoteSender extends ReplyToChangeSender {
+  public interface Factory extends ReplyToChangeSender.Factory<DeleteVoteSender> {
+    @Override
+    DeleteVoteSender create(Project.NameKey project, Change.Id change);
+  }
+
+  @Inject
+  protected DeleteVoteSender(
+      EmailArguments ea, @Assisted Project.NameKey project, @Assisted Change.Id id)
+      throws OrmException {
+    super(ea, "deleteVote", newChangeData(ea, project, id));
+  }
+
+  @Override
+  protected void init() throws EmailException {
+    super.init();
+
+    ccAllApprovals();
+    bccStarredBy();
+    includeWatchers(NotifyType.ALL_COMMENTS);
+    removeUsersThatIgnoredTheChange();
+  }
+
+  @Override
+  protected void formatChange() throws EmailException {
+    appendText(textTemplate("DeleteVote"));
+    if (useHtml()) {
+      appendHtml(soyHtmlTemplate("DeleteVoteHtml"));
+    }
+  }
+
+  @Override
+  protected boolean supportsHtml() {
+    return true;
+  }
+}
diff --git a/java/com/google/gerrit/server/mail/send/EmailArguments.java b/java/com/google/gerrit/server/mail/send/EmailArguments.java
new file mode 100644
index 0000000..41a464e
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/EmailArguments.java
@@ -0,0 +1,152 @@
+// 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.
+
+package com.google.gerrit.server.mail.send;
+
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.AnonymousUser;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.GerritPersonIdentProvider;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.IdentifiedUser.GenericFactory;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.UsedAt;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.AnonymousCowardName;
+import com.google.gerrit.server.config.GerritInstanceName;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.config.UrlFormatter;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.mail.EmailSettings;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.patch.PatchListCache;
+import com.google.gerrit.server.patch.PatchSetInfoFactory;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.query.account.InternalAccountQuery;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.ChangeQueryBuilder;
+import com.google.gerrit.server.ssh.SshAdvertisedAddresses;
+import com.google.gerrit.server.validators.OutgoingEmailValidationListener;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.template.soy.tofu.SoyTofu;
+import java.util.List;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.PersonIdent;
+
+@UsedAt(UsedAt.Project.PLUGINS_ALL)
+public class EmailArguments {
+  final GitRepositoryManager server;
+  final ProjectCache projectCache;
+  final PermissionBackend permissionBackend;
+  final GroupBackend groupBackend;
+  final AccountCache accountCache;
+  final PatchListCache patchListCache;
+  final PatchSetUtil patchSetUtil;
+  final ApprovalsUtil approvalsUtil;
+  final FromAddressGenerator fromAddressGenerator;
+  final EmailSender emailSender;
+  final PatchSetInfoFactory patchSetInfoFactory;
+  final IdentifiedUser.GenericFactory identifiedUserFactory;
+  final ChangeNotes.Factory changeNotesFactory;
+  final AnonymousUser anonymousUser;
+  final String anonymousCowardName;
+  final PersonIdent gerritPersonIdent;
+  final DynamicItem<UrlFormatter> urlFormatter;
+  final AllProjectsName allProjectsName;
+  final List<String> sshAddresses;
+  final SitePaths site;
+
+  final ChangeQueryBuilder queryBuilder;
+  final Provider<ReviewDb> db;
+  final ChangeData.Factory changeDataFactory;
+  final SoyTofu soyTofu;
+  final EmailSettings settings;
+  final DynamicSet<OutgoingEmailValidationListener> outgoingEmailValidationListeners;
+  final Provider<InternalAccountQuery> accountQueryProvider;
+  final OutgoingEmailValidator validator;
+  final boolean addInstanceNameInSubject;
+  final Provider<String> instanceNameProvider;
+
+  @Inject
+  EmailArguments(
+      GitRepositoryManager server,
+      ProjectCache projectCache,
+      PermissionBackend permissionBackend,
+      GroupBackend groupBackend,
+      AccountCache accountCache,
+      PatchListCache patchListCache,
+      PatchSetUtil patchSetUtil,
+      ApprovalsUtil approvalsUtil,
+      FromAddressGenerator fromAddressGenerator,
+      EmailSender emailSender,
+      PatchSetInfoFactory patchSetInfoFactory,
+      GenericFactory identifiedUserFactory,
+      ChangeNotes.Factory changeNotesFactory,
+      AnonymousUser anonymousUser,
+      @AnonymousCowardName String anonymousCowardName,
+      GerritPersonIdentProvider gerritPersonIdentProvider,
+      DynamicItem<UrlFormatter> urlFormatter,
+      AllProjectsName allProjectsName,
+      ChangeQueryBuilder queryBuilder,
+      Provider<ReviewDb> db,
+      ChangeData.Factory changeDataFactory,
+      @MailTemplates SoyTofu soyTofu,
+      EmailSettings settings,
+      @SshAdvertisedAddresses List<String> sshAddresses,
+      SitePaths site,
+      DynamicSet<OutgoingEmailValidationListener> outgoingEmailValidationListeners,
+      Provider<InternalAccountQuery> accountQueryProvider,
+      OutgoingEmailValidator validator,
+      @GerritInstanceName Provider<String> instanceNameProvider,
+      @GerritServerConfig Config cfg) {
+    this.server = server;
+    this.projectCache = projectCache;
+    this.permissionBackend = permissionBackend;
+    this.groupBackend = groupBackend;
+    this.accountCache = accountCache;
+    this.patchListCache = patchListCache;
+    this.patchSetUtil = patchSetUtil;
+    this.approvalsUtil = approvalsUtil;
+    this.fromAddressGenerator = fromAddressGenerator;
+    this.emailSender = emailSender;
+    this.patchSetInfoFactory = patchSetInfoFactory;
+    this.identifiedUserFactory = identifiedUserFactory;
+    this.changeNotesFactory = changeNotesFactory;
+    this.anonymousUser = anonymousUser;
+    this.anonymousCowardName = anonymousCowardName;
+    this.gerritPersonIdent = gerritPersonIdentProvider.get();
+    this.urlFormatter = urlFormatter;
+    this.allProjectsName = allProjectsName;
+    this.queryBuilder = queryBuilder;
+    this.db = db;
+    this.changeDataFactory = changeDataFactory;
+    this.soyTofu = soyTofu;
+    this.settings = settings;
+    this.sshAddresses = sshAddresses;
+    this.site = site;
+    this.outgoingEmailValidationListeners = outgoingEmailValidationListeners;
+    this.accountQueryProvider = accountQueryProvider;
+    this.validator = validator;
+    this.instanceNameProvider = instanceNameProvider;
+
+    this.addInstanceNameInSubject = cfg.getBoolean("sendemail", "addInstanceNameInSubject", false);
+  }
+}
diff --git a/java/com/google/gerrit/server/mail/send/EmailSender.java b/java/com/google/gerrit/server/mail/send/EmailSender.java
new file mode 100644
index 0000000..ce4964d
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/EmailSender.java
@@ -0,0 +1,77 @@
+// Copyright (C) 2009 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.google.gerrit.server.mail.send;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.errors.EmailException;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.mail.EmailHeader;
+import java.util.Collection;
+import java.util.Map;
+
+/** Sends email messages to third parties. */
+public interface EmailSender {
+  boolean isEnabled();
+
+  /**
+   * Can the address receive messages from us?
+   *
+   * @param address the address to consider.
+   * @return true if this sender will deliver to the address.
+   */
+  boolean canEmail(String address);
+
+  /**
+   * Sends an email message. Messages always contain a text body, but messages can optionally
+   * include an additional HTML body. If both body types are present, {@code send} should construct
+   * a {@code multipart/alternative} message with an appropriately-selected boundary.
+   *
+   * @param from who the message is from.
+   * @param rcpt one or more address where the message will be delivered to. This list overrides any
+   *     To or CC headers in {@code headers}.
+   * @param headers message headers.
+   * @param textBody text to appear in the {@code text/plain} body of the message.
+   * @param htmlBody optional HTML code to appear in the {@code text/html} body of the message.
+   * @throws EmailException the message cannot be sent.
+   */
+  default void send(
+      Address from,
+      Collection<Address> rcpt,
+      Map<String, EmailHeader> headers,
+      String textBody,
+      @Nullable String htmlBody)
+      throws EmailException {
+    send(from, rcpt, headers, textBody);
+  }
+
+  /**
+   * Sends an email message with a text body only (i.e. not HTML or multipart).
+   *
+   * <p>Authors of new implementations of this interface should not use this method to send a
+   * message because this method does not accept the HTML body. Instead, authors should use the
+   * above signature of {@code send}.
+   *
+   * <p>This version of the method is preserved for support of legacy implementations.
+   *
+   * @param from who the message is from.
+   * @param rcpt one or more address where the message will be delivered to. This list overrides any
+   *     To or CC headers in {@code headers}.
+   * @param headers message headers.
+   * @param body text to appear in the body of the message.
+   * @throws EmailException the message cannot be sent.
+   */
+  void send(Address from, Collection<Address> rcpt, Map<String, EmailHeader> headers, String body)
+      throws EmailException;
+}
diff --git a/java/com/google/gerrit/server/mail/send/FromAddressGenerator.java b/java/com/google/gerrit/server/mail/send/FromAddressGenerator.java
new file mode 100644
index 0000000..5baabe9
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/FromAddressGenerator.java
@@ -0,0 +1,25 @@
+// Copyright (C) 2009 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.google.gerrit.server.mail.send;
+
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.reviewdb.client.Account;
+
+/** Constructs an address to send email from. */
+public interface FromAddressGenerator {
+  boolean isGenericAddress(Account.Id fromId);
+
+  Address from(Account.Id fromId);
+}
diff --git a/java/com/google/gerrit/server/mail/send/FromAddressGeneratorProvider.java b/java/com/google/gerrit/server/mail/send/FromAddressGeneratorProvider.java
new file mode 100644
index 0000000..b77909e
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/FromAddressGeneratorProvider.java
@@ -0,0 +1,241 @@
+// Copyright (C) 2009 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.google.gerrit.server.mail.send;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.gerrit.common.data.ParameterizedString;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.config.AnonymousCowardName;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.mail.MailUtil;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Optional;
+import java.util.regex.Pattern;
+import org.apache.commons.codec.binary.Base64;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.PersonIdent;
+
+/** Creates a {@link FromAddressGenerator} from the {@link GerritServerConfig} */
+@Singleton
+public class FromAddressGeneratorProvider implements Provider<FromAddressGenerator> {
+  private final FromAddressGenerator generator;
+
+  @Inject
+  FromAddressGeneratorProvider(
+      @GerritServerConfig Config cfg,
+      @AnonymousCowardName String anonymousCowardName,
+      @GerritPersonIdent PersonIdent myIdent,
+      AccountCache accountCache) {
+    final String from = cfg.getString("sendemail", null, "from");
+    final Address srvAddr = toAddress(myIdent);
+
+    if (from == null || "MIXED".equalsIgnoreCase(from)) {
+      ParameterizedString name = new ParameterizedString("${user} (Code Review)");
+      generator =
+          new PatternGen(srvAddr, accountCache, anonymousCowardName, name, srvAddr.getEmail());
+    } else if ("USER".equalsIgnoreCase(from)) {
+      String[] domains = cfg.getStringList("sendemail", null, "allowedDomain");
+      Pattern domainPattern = MailUtil.glob(domains);
+      ParameterizedString namePattern = new ParameterizedString("${user} (Code Review)");
+      generator =
+          new UserGen(accountCache, domainPattern, anonymousCowardName, namePattern, srvAddr);
+    } else if ("SERVER".equalsIgnoreCase(from)) {
+      generator = new ServerGen(srvAddr);
+    } else {
+      final Address a = Address.parse(from);
+      final ParameterizedString name =
+          a.getName() != null ? new ParameterizedString(a.getName()) : null;
+      if (name == null || name.getParameterNames().isEmpty()) {
+        generator = new ServerGen(a);
+      } else {
+        generator = new PatternGen(srvAddr, accountCache, anonymousCowardName, name, a.getEmail());
+      }
+    }
+  }
+
+  private static Address toAddress(PersonIdent myIdent) {
+    return new Address(myIdent.getName(), myIdent.getEmailAddress());
+  }
+
+  @Override
+  public FromAddressGenerator get() {
+    return generator;
+  }
+
+  static final class UserGen implements FromAddressGenerator {
+    private final AccountCache accountCache;
+    private final Pattern domainPattern;
+    private final String anonymousCowardName;
+    private final ParameterizedString nameRewriteTmpl;
+    private final Address serverAddress;
+
+    /**
+     * From address generator for USER mode
+     *
+     * @param accountCache get user account from id
+     * @param domainPattern allowed user domain pattern that Gerrit can send as the user
+     * @param anonymousCowardName name used when user's full name is missing
+     * @param nameRewriteTmpl name template used for rewriting the sender's name when Gerrit can not
+     *     send as the user
+     * @param serverAddress serverAddress.name is used when fromId is null and serverAddress.email
+     *     is used when Gerrit can not send as the user
+     */
+    UserGen(
+        AccountCache accountCache,
+        Pattern domainPattern,
+        String anonymousCowardName,
+        ParameterizedString nameRewriteTmpl,
+        Address serverAddress) {
+      this.accountCache = accountCache;
+      this.domainPattern = domainPattern;
+      this.anonymousCowardName = anonymousCowardName;
+      this.nameRewriteTmpl = nameRewriteTmpl;
+      this.serverAddress = serverAddress;
+    }
+
+    @Override
+    public boolean isGenericAddress(Account.Id fromId) {
+      return false;
+    }
+
+    @Override
+    public Address from(Account.Id fromId) {
+      String senderName;
+      if (fromId != null) {
+        Optional<Account> a = accountCache.get(fromId).map(AccountState::getAccount);
+        String fullName = a.map(Account::getFullName).orElse(null);
+        String userEmail = a.map(Account::getPreferredEmail).orElse(null);
+        if (canRelay(userEmail)) {
+          return new Address(fullName, userEmail);
+        }
+
+        if (fullName == null || "".equals(fullName.trim())) {
+          fullName = anonymousCowardName;
+        }
+        senderName = nameRewriteTmpl.replace("user", fullName).toString();
+      } else {
+        senderName = serverAddress.getName();
+      }
+
+      String senderEmail;
+      ParameterizedString senderEmailPattern = new ParameterizedString(serverAddress.getEmail());
+      if (senderEmailPattern.getParameterNames().isEmpty()) {
+        senderEmail = senderEmailPattern.getRawPattern();
+      } else {
+        senderEmail = senderEmailPattern.replace("userHash", hashOf(senderName)).toString();
+      }
+      return new Address(senderName, senderEmail);
+    }
+
+    /** check if Gerrit is allowed to send from {@code userEmail}. */
+    private boolean canRelay(String userEmail) {
+      if (userEmail != null) {
+        int index = userEmail.indexOf('@');
+        if (index > 0 && index < userEmail.length() - 1) {
+          return domainPattern.matcher(userEmail.substring(index + 1)).matches();
+        }
+      }
+      return false;
+    }
+  }
+
+  static final class ServerGen implements FromAddressGenerator {
+    private final Address srvAddr;
+
+    ServerGen(Address srvAddr) {
+      this.srvAddr = srvAddr;
+    }
+
+    @Override
+    public boolean isGenericAddress(Account.Id fromId) {
+      return true;
+    }
+
+    @Override
+    public Address from(Account.Id fromId) {
+      return srvAddr;
+    }
+  }
+
+  static final class PatternGen implements FromAddressGenerator {
+    private final ParameterizedString senderEmailPattern;
+    private final Address serverAddress;
+    private final AccountCache accountCache;
+    private final String anonymousCowardName;
+    private final ParameterizedString namePattern;
+
+    PatternGen(
+        final Address serverAddress,
+        final AccountCache accountCache,
+        final String anonymousCowardName,
+        final ParameterizedString namePattern,
+        final String senderEmail) {
+      this.senderEmailPattern = new ParameterizedString(senderEmail);
+      this.serverAddress = serverAddress;
+      this.accountCache = accountCache;
+      this.anonymousCowardName = anonymousCowardName;
+      this.namePattern = namePattern;
+    }
+
+    @Override
+    public boolean isGenericAddress(Account.Id fromId) {
+      return false;
+    }
+
+    @Override
+    public Address from(Account.Id fromId) {
+      final String senderName;
+
+      if (fromId != null) {
+        String fullName =
+            accountCache.get(fromId).map(a -> a.getAccount().getFullName()).orElse(null);
+        if (fullName == null || "".equals(fullName)) {
+          fullName = anonymousCowardName;
+        }
+        senderName = namePattern.replace("user", fullName).toString();
+
+      } else {
+        senderName = serverAddress.getName();
+      }
+
+      String senderEmail;
+      if (senderEmailPattern.getParameterNames().isEmpty()) {
+        senderEmail = senderEmailPattern.getRawPattern();
+      } else {
+        senderEmail = senderEmailPattern.replace("userHash", hashOf(senderName)).toString();
+      }
+      return new Address(senderName, senderEmail);
+    }
+  }
+
+  private static String hashOf(String data) {
+    try {
+      MessageDigest hash = MessageDigest.getInstance("MD5");
+      byte[] bytes = hash.digest(data.getBytes(UTF_8));
+      return Base64.encodeBase64URLSafeString(bytes);
+    } catch (NoSuchAlgorithmException e) {
+      throw new RuntimeException("No MD5 available", e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/mail/send/InboundEmailRejectionSender.java b/java/com/google/gerrit/server/mail/send/InboundEmailRejectionSender.java
new file mode 100644
index 0000000..99edc04
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/InboundEmailRejectionSender.java
@@ -0,0 +1,94 @@
+// 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.
+
+package com.google.gerrit.server.mail.send;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.gerrit.common.errors.EmailException;
+import com.google.gerrit.extensions.api.changes.RecipientType;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.mail.MailHeader;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import org.apache.james.mime4j.dom.field.FieldName;
+
+/** Send an email to inform users that parsing their inbound email failed. */
+public class InboundEmailRejectionSender extends OutgoingEmail {
+
+  /** Used by the templating system to determine what error message should be sent */
+  public enum Error {
+    PARSING_ERROR,
+    INACTIVE_ACCOUNT,
+    UNKNOWN_ACCOUNT,
+    INTERNAL_EXCEPTION;
+  }
+
+  public interface Factory {
+    InboundEmailRejectionSender create(Address to, String threadId, Error reason);
+  }
+
+  private final Address to;
+  private final Error reason;
+  private final String threadId;
+
+  @Inject
+  public InboundEmailRejectionSender(
+      EmailArguments ea, @Assisted Address to, @Assisted String threadId, @Assisted Error reason) {
+    super(ea, "error");
+    this.to = requireNonNull(to);
+    this.threadId = requireNonNull(threadId);
+    this.reason = requireNonNull(reason);
+  }
+
+  @Override
+  protected void init() throws EmailException {
+    super.init();
+    setListIdHeader();
+    setHeader(FieldName.SUBJECT, "[Gerrit Code Review] Unable to process your email");
+
+    add(RecipientType.TO, to);
+
+    if (!threadId.isEmpty()) {
+      setHeader(MailHeader.REFERENCES.fieldName(), threadId);
+    }
+  }
+
+  private void setListIdHeader() {
+    // Set a reasonable list id so that filters can be used to sort messages
+    setHeader("List-Id", "<gerrit-noreply." + getGerritHost() + ">");
+    if (getSettingsUrl() != null) {
+      setHeader("List-Unsubscribe", "<" + getSettingsUrl() + ">");
+    }
+  }
+
+  @Override
+  protected void format() throws EmailException {
+    appendText(textTemplate("InboundEmailRejection_" + reason.name()));
+    if (useHtml()) {
+      appendHtml(soyHtmlTemplate("InboundEmailRejectionHtml_" + reason.name()));
+    }
+  }
+
+  @Override
+  protected void setupSoyContext() {
+    super.setupSoyContext();
+    footers.add(MailHeader.MESSAGE_TYPE.withDelimiter() + messageClass);
+  }
+
+  @Override
+  protected boolean supportsHtml() {
+    return true;
+  }
+}
diff --git a/java/com/google/gerrit/server/mail/send/MailSoyTofuProvider.java b/java/com/google/gerrit/server/mail/send/MailSoyTofuProvider.java
new file mode 100644
index 0000000..8d7df41
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/MailSoyTofuProvider.java
@@ -0,0 +1,117 @@
+// 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.
+
+package com.google.gerrit.server.mail.send;
+
+import com.google.common.io.CharStreams;
+import com.google.common.io.Resources;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.ProvisionException;
+import com.google.inject.Singleton;
+import com.google.template.soy.SoyFileSet;
+import com.google.template.soy.shared.SoyAstCache;
+import com.google.template.soy.tofu.SoyTofu;
+import java.io.IOException;
+import java.io.Reader;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+/** Configures Soy Tofu object for rendering email templates. */
+@Singleton
+public class MailSoyTofuProvider implements Provider<SoyTofu> {
+
+  // Note: will fail to construct the tofu object if this array is empty.
+  private static final String[] TEMPLATES = {
+    "Abandoned.soy",
+    "AbandonedHtml.soy",
+    "AddKey.soy",
+    "AddKeyHtml.soy",
+    "ChangeFooter.soy",
+    "ChangeFooterHtml.soy",
+    "ChangeSubject.soy",
+    "Comment.soy",
+    "CommentHtml.soy",
+    "CommentFooter.soy",
+    "CommentFooterHtml.soy",
+    "DeleteReviewer.soy",
+    "DeleteReviewerHtml.soy",
+    "DeleteVote.soy",
+    "DeleteVoteHtml.soy",
+    "InboundEmailRejection.soy",
+    "InboundEmailRejectionHtml.soy",
+    "Footer.soy",
+    "FooterHtml.soy",
+    "HeaderHtml.soy",
+    "Merged.soy",
+    "MergedHtml.soy",
+    "NewChange.soy",
+    "NewChangeHtml.soy",
+    "NoReplyFooter.soy",
+    "NoReplyFooterHtml.soy",
+    "Private.soy",
+    "RegisterNewEmail.soy",
+    "ReplacePatchSet.soy",
+    "ReplacePatchSetHtml.soy",
+    "Restored.soy",
+    "RestoredHtml.soy",
+    "Reverted.soy",
+    "RevertedHtml.soy",
+    "SetAssignee.soy",
+    "SetAssigneeHtml.soy",
+  };
+
+  private final SitePaths site;
+  private final SoyAstCache cache;
+
+  @Inject
+  MailSoyTofuProvider(SitePaths site, SoyAstCache cache) {
+    this.site = site;
+    this.cache = cache;
+  }
+
+  @Override
+  public SoyTofu get() throws ProvisionException {
+    SoyFileSet.Builder builder = SoyFileSet.builder();
+    builder.setSoyAstCache(cache);
+    for (String name : TEMPLATES) {
+      addTemplate(builder, name);
+    }
+    return builder.build().compileToTofu();
+  }
+
+  private void addTemplate(SoyFileSet.Builder builder, String name) throws ProvisionException {
+    // Load as a file in the mail templates directory if present.
+    Path tmpl = site.mail_dir.resolve(name);
+    if (Files.isRegularFile(tmpl)) {
+      String content;
+      // TODO(davido): Consider using JGit's FileSnapshot to cache based on
+      // mtime.
+      try (Reader r = Files.newBufferedReader(tmpl, StandardCharsets.UTF_8)) {
+        content = CharStreams.toString(r);
+      } catch (IOException err) {
+        throw new ProvisionException(
+            "Failed to read template file " + tmpl.toAbsolutePath().toString(), err);
+      }
+      builder.add(content, tmpl.toAbsolutePath().toString());
+      return;
+    }
+
+    // Otherwise load the template as a resource.
+    String resourcePath = "com/google/gerrit/server/mail/" + name;
+    builder.add(Resources.getResource(resourcePath));
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/MailTemplates.java b/java/com/google/gerrit/server/mail/send/MailTemplates.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/mail/send/MailTemplates.java
rename to java/com/google/gerrit/server/mail/send/MailTemplates.java
diff --git a/java/com/google/gerrit/server/mail/send/MergedSender.java b/java/com/google/gerrit/server/mail/send/MergedSender.java
new file mode 100644
index 0000000..34f959c
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/MergedSender.java
@@ -0,0 +1,140 @@
+// Copyright (C) 2009 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.google.gerrit.server.mail.send;
+
+import com.google.common.collect.HashBasedTable;
+import com.google.common.collect.Table;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.LabelTypes;
+import com.google.gerrit.common.data.LabelValue;
+import com.google.gerrit.common.errors.EmailException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+
+/** Send notice about a change successfully merged. */
+public class MergedSender extends ReplyToChangeSender {
+  public interface Factory {
+    MergedSender create(Project.NameKey project, Change.Id id);
+  }
+
+  private final LabelTypes labelTypes;
+
+  @Inject
+  public MergedSender(EmailArguments ea, @Assisted Project.NameKey project, @Assisted Change.Id id)
+      throws OrmException {
+    super(ea, "merged", newChangeData(ea, project, id));
+    labelTypes = changeData.getLabelTypes();
+  }
+
+  @Override
+  protected void init() throws EmailException {
+    super.init();
+
+    ccAllApprovals();
+    bccStarredBy();
+    includeWatchers(NotifyType.ALL_COMMENTS);
+    includeWatchers(NotifyType.SUBMITTED_CHANGES);
+    removeUsersThatIgnoredTheChange();
+  }
+
+  @Override
+  protected void formatChange() throws EmailException {
+    appendText(textTemplate("Merged"));
+
+    if (useHtml()) {
+      appendHtml(soyHtmlTemplate("MergedHtml"));
+    }
+  }
+
+  public String getApprovals() {
+    try {
+      Table<Account.Id, String, PatchSetApproval> pos = HashBasedTable.create();
+      Table<Account.Id, String, PatchSetApproval> neg = HashBasedTable.create();
+      for (PatchSetApproval ca :
+          args.approvalsUtil.byPatchSet(
+              args.db.get(), changeData.notes(), patchSet.getId(), null, null)) {
+        LabelType lt = labelTypes.byLabel(ca.getLabelId());
+        if (lt == null) {
+          continue;
+        }
+        if (ca.getValue() > 0) {
+          pos.put(ca.getAccountId(), lt.getName(), ca);
+        } else if (ca.getValue() < 0) {
+          neg.put(ca.getAccountId(), lt.getName(), ca);
+        }
+      }
+
+      return format("Approvals", pos) + format("Objections", neg);
+    } catch (OrmException err) {
+      // Don't list the approvals
+    }
+    return "";
+  }
+
+  private String format(String type, Table<Account.Id, String, PatchSetApproval> approvals) {
+    StringBuilder txt = new StringBuilder();
+    if (approvals.isEmpty()) {
+      return "";
+    }
+    txt.append(type).append(":\n");
+    for (Account.Id id : approvals.rowKeySet()) {
+      txt.append("  ");
+      txt.append(getNameFor(id));
+      txt.append(": ");
+      boolean first = true;
+      for (LabelType lt : labelTypes.getLabelTypes()) {
+        PatchSetApproval ca = approvals.get(id, lt.getName());
+        if (ca == null) {
+          continue;
+        }
+
+        if (first) {
+          first = false;
+        } else {
+          txt.append("; ");
+        }
+
+        LabelValue v = lt.getValue(ca);
+        if (v != null) {
+          txt.append(v.getText());
+        } else {
+          txt.append(lt.getName());
+          txt.append('=');
+          txt.append(LabelValue.formatValue(ca.getValue()));
+        }
+      }
+      txt.append('\n');
+    }
+    txt.append('\n');
+    return txt.toString();
+  }
+
+  @Override
+  protected void setupSoyContext() {
+    super.setupSoyContext();
+    soyContextEmailData.put("approvals", getApprovals());
+  }
+
+  @Override
+  protected boolean supportsHtml() {
+    return true;
+  }
+}
diff --git a/java/com/google/gerrit/server/mail/send/NewChangeSender.java b/java/com/google/gerrit/server/mail/send/NewChangeSender.java
new file mode 100644
index 0000000..f94f1ca
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/NewChangeSender.java
@@ -0,0 +1,110 @@
+// Copyright (C) 2009 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.google.gerrit.server.mail.send;
+
+import com.google.gerrit.common.errors.EmailException;
+import com.google.gerrit.extensions.api.changes.RecipientType;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gwtorm.server.OrmException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/** Sends an email alerting a user to a new change for them to review. */
+public abstract class NewChangeSender extends ChangeEmail {
+  private final Set<Account.Id> reviewers = new HashSet<>();
+  private final Set<Address> reviewersByEmail = new HashSet<>();
+  private final Set<Account.Id> extraCC = new HashSet<>();
+  private final Set<Address> extraCCByEmail = new HashSet<>();
+
+  protected NewChangeSender(EmailArguments ea, ChangeData cd) throws OrmException {
+    super(ea, "newchange", cd);
+  }
+
+  public void addReviewers(Collection<Account.Id> cc) {
+    reviewers.addAll(cc);
+  }
+
+  public void addReviewersByEmail(Collection<Address> cc) {
+    reviewersByEmail.addAll(cc);
+  }
+
+  public void addExtraCC(Collection<Account.Id> cc) {
+    extraCC.addAll(cc);
+  }
+
+  public void addExtraCCByEmail(Collection<Address> cc) {
+    extraCCByEmail.addAll(cc);
+  }
+
+  @Override
+  protected void init() throws EmailException {
+    super.init();
+
+    setHeader("Message-ID", getChangeMessageThreadId());
+
+    switch (notify) {
+      case NONE:
+      case OWNER:
+        break;
+      case ALL:
+      default:
+        add(RecipientType.CC, extraCC);
+        extraCCByEmail.stream().forEach(cc -> add(RecipientType.CC, cc));
+        // $FALL-THROUGH$
+      case OWNER_REVIEWERS:
+        add(RecipientType.TO, reviewers, true);
+        addByEmail(RecipientType.TO, reviewersByEmail, true);
+        break;
+    }
+
+    rcptToAuthors(RecipientType.CC);
+  }
+
+  @Override
+  protected void formatChange() throws EmailException {
+    appendText(textTemplate("NewChange"));
+    if (useHtml()) {
+      appendHtml(soyHtmlTemplate("NewChangeHtml"));
+    }
+  }
+
+  public List<String> getReviewerNames() {
+    if (reviewers.isEmpty()) {
+      return null;
+    }
+    List<String> names = new ArrayList<>();
+    for (Account.Id id : reviewers) {
+      names.add(getNameFor(id));
+    }
+    return names;
+  }
+
+  @Override
+  protected void setupSoyContext() {
+    super.setupSoyContext();
+    soyContext.put("ownerName", getNameFor(change.getOwner()));
+    soyContextEmailData.put("reviewerNames", getReviewerNames());
+  }
+
+  @Override
+  protected boolean supportsHtml() {
+    return true;
+  }
+}
diff --git a/java/com/google/gerrit/server/mail/send/NotificationEmail.java b/java/com/google/gerrit/server/mail/send/NotificationEmail.java
new file mode 100644
index 0000000..032bcbf
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/NotificationEmail.java
@@ -0,0 +1,148 @@
+// Copyright (C) 2012 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.google.gerrit.server.mail.send;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.Iterables;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.errors.EmailException;
+import com.google.gerrit.extensions.api.changes.RecipientType;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.mail.MailHeader;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gerrit.server.mail.send.ProjectWatch.Watchers;
+import com.google.gwtorm.server.OrmException;
+import java.util.HashMap;
+import java.util.Map;
+
+/** Common class for notifications that are related to a project and branch */
+public abstract class NotificationEmail extends OutgoingEmail {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  protected Branch.NameKey branch;
+
+  protected NotificationEmail(EmailArguments ea, String mc, Branch.NameKey branch) {
+    super(ea, mc);
+    this.branch = branch;
+  }
+
+  @Override
+  protected void init() throws EmailException {
+    super.init();
+    setListIdHeader();
+  }
+
+  private void setListIdHeader() {
+    // Set a reasonable list id so that filters can be used to sort messages
+    setHeader(
+        "List-Id",
+        "<gerrit-" + branch.getParentKey().get().replace('/', '-') + "." + getGerritHost() + ">");
+    if (getSettingsUrl() != null) {
+      setHeader("List-Unsubscribe", "<" + getSettingsUrl() + ">");
+    }
+  }
+
+  /** Include users and groups that want notification of events. */
+  protected void includeWatchers(NotifyType type) {
+    includeWatchers(type, true);
+  }
+
+  /** Include users and groups that want notification of events. */
+  protected void includeWatchers(NotifyType type, boolean includeWatchersFromNotifyConfig) {
+    try {
+      Watchers matching = getWatchers(type, includeWatchersFromNotifyConfig);
+      add(RecipientType.TO, matching.to);
+      add(RecipientType.CC, matching.cc);
+      add(RecipientType.BCC, matching.bcc);
+    } catch (OrmException err) {
+      // Just don't CC everyone. Better to send a partial message to those
+      // we already have queued up then to fail deliver entirely to people
+      // who have a lower interest in the change.
+      logger.atWarning().withCause(err).log("Cannot BCC watchers for %s", type);
+    }
+  }
+
+  /** Returns all watchers that are relevant */
+  protected abstract Watchers getWatchers(NotifyType type, boolean includeWatchersFromNotifyConfig)
+      throws OrmException;
+
+  /** Add users or email addresses to the TO, CC, or BCC list. */
+  protected void add(RecipientType type, Watchers.List list) {
+    for (Account.Id user : list.accounts) {
+      add(type, user);
+    }
+    for (Address addr : list.emails) {
+      add(type, addr);
+    }
+  }
+
+  public String getSshHost() {
+    String host = Iterables.getFirst(args.sshAddresses, null);
+    if (host == null) {
+      return null;
+    }
+    if (host.startsWith("*:")) {
+      return getGerritHost() + host.substring(1);
+    }
+    return host;
+  }
+
+  @Override
+  protected void setupSoyContext() {
+    super.setupSoyContext();
+
+    String projectName = branch.getParentKey().get();
+    soyContext.put("projectName", projectName);
+    // shortProjectName is the project name with the path abbreviated.
+    soyContext.put("shortProjectName", getShortProjectName(projectName));
+
+    // instanceAndProjectName is the instance's name followed by the abbreviated project path
+    soyContext.put(
+        "instanceAndProjectName",
+        getInstanceAndProjectName(args.instanceNameProvider.get(), projectName));
+    soyContext.put("addInstanceNameInSubject", args.addInstanceNameInSubject);
+
+    soyContextEmailData.put("sshHost", getSshHost());
+
+    Map<String, String> branchData = new HashMap<>();
+    branchData.put("shortName", branch.getShortName());
+    soyContext.put("branch", branchData);
+
+    footers.add(MailHeader.PROJECT.withDelimiter() + branch.getParentKey().get());
+    footers.add("Gerrit-Branch: " + branch.getShortName());
+  }
+
+  @VisibleForTesting
+  protected static String getShortProjectName(String projectName) {
+    int lastIndexSlash = projectName.lastIndexOf('/');
+    if (lastIndexSlash == 0) {
+      return projectName.substring(1); // Remove the first slash
+    }
+
+    return "..." + projectName.substring(lastIndexSlash + 1);
+  }
+
+  @VisibleForTesting
+  protected static String getInstanceAndProjectName(String instanceName, String projectName) {
+    if (instanceName == null || instanceName.isEmpty()) {
+      return getShortProjectName(projectName);
+    }
+    // Extract the project name (everything after the last slash) and prepends it with gerrit's
+    // instance name
+    return instanceName + "/" + projectName.substring(projectName.lastIndexOf('/') + 1);
+  }
+}
diff --git a/java/com/google/gerrit/server/mail/send/OutgoingEmail.java b/java/com/google/gerrit/server/mail/send/OutgoingEmail.java
new file mode 100644
index 0000000..1ef3b25
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/OutgoingEmail.java
@@ -0,0 +1,591 @@
+// 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.
+
+package com.google.gerrit.server.mail.send;
+
+import static com.google.gerrit.extensions.client.GeneralPreferencesInfo.EmailStrategy.CC_ON_OWN_COMMENTS;
+import static com.google.gerrit.extensions.client.GeneralPreferencesInfo.EmailStrategy.DISABLED;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.ListMultimap;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.errors.EmailException;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.api.changes.RecipientType;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo.EmailFormat;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.mail.EmailHeader;
+import com.google.gerrit.mail.EmailHeader.AddressList;
+import com.google.gerrit.mail.MailHeader;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.UserIdentity;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.validators.OutgoingEmailValidationListener;
+import com.google.gerrit.server.validators.ValidationException;
+import com.google.template.soy.data.SanitizedContent;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.StringJoiner;
+import org.apache.james.mime4j.dom.field.FieldName;
+import org.eclipse.jgit.util.SystemReader;
+
+/** Sends an email to one or more interested parties. */
+public abstract class OutgoingEmail {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  protected String messageClass;
+  private final Set<Account.Id> rcptTo = new HashSet<>();
+  private final Map<String, EmailHeader> headers;
+  private final Set<Address> smtpRcptTo = new HashSet<>();
+  private Address smtpFromAddress;
+  private StringBuilder textBody;
+  private StringBuilder htmlBody;
+  private ListMultimap<RecipientType, Account.Id> accountsToNotify = ImmutableListMultimap.of();
+  protected Map<String, Object> soyContext;
+  protected Map<String, Object> soyContextEmailData;
+  protected List<String> footers;
+  protected final EmailArguments args;
+  protected Account.Id fromId;
+  protected NotifyHandling notify = NotifyHandling.ALL;
+
+  protected OutgoingEmail(EmailArguments ea, String mc) {
+    args = ea;
+    messageClass = mc;
+    headers = new LinkedHashMap<>();
+  }
+
+  public void setFrom(Account.Id id) {
+    fromId = id;
+  }
+
+  public void setNotify(NotifyHandling notify) {
+    this.notify = requireNonNull(notify);
+  }
+
+  public void setAccountsToNotify(ListMultimap<RecipientType, Account.Id> accountsToNotify) {
+    this.accountsToNotify = requireNonNull(accountsToNotify);
+  }
+
+  /**
+   * Format and enqueue the message for delivery.
+   *
+   * @throws EmailException
+   */
+  public void send() throws EmailException {
+    if (NotifyHandling.NONE.equals(notify) && accountsToNotify.isEmpty()) {
+      return;
+    }
+
+    if (!args.emailSender.isEnabled()) {
+      // Server has explicitly disabled email sending.
+      //
+      return;
+    }
+
+    init();
+    if (useHtml()) {
+      appendHtml(soyHtmlTemplate("HeaderHtml"));
+    }
+    format();
+    appendText(textTemplate("Footer"));
+    if (useHtml()) {
+      appendHtml(soyHtmlTemplate("FooterHtml"));
+    }
+
+    Set<Address> smtpRcptToPlaintextOnly = new HashSet<>();
+    if (shouldSendMessage()) {
+      if (fromId != null) {
+        Optional<AccountState> fromUser = args.accountCache.get(fromId);
+        if (fromUser.isPresent()) {
+          GeneralPreferencesInfo senderPrefs = fromUser.get().getGeneralPreferences();
+          if (senderPrefs != null && senderPrefs.getEmailStrategy() == CC_ON_OWN_COMMENTS) {
+            // If we are impersonating a user, make sure they receive a CC of
+            // this message so they can always review and audit what we sent
+            // on their behalf to others.
+            //
+            add(RecipientType.CC, fromId);
+          } else if (!accountsToNotify.containsValue(fromId) && rcptTo.remove(fromId)) {
+            // If they don't want a copy, but we queued one up anyway,
+            // drop them from the recipient lists.
+            //
+            removeUser(fromUser.get().getAccount());
+          }
+        }
+      }
+      // Check the preferences of all recipients. If any user has disabled
+      // his email notifications then drop him from recipients' list.
+      // In addition, check if users only want to receive plaintext email.
+      for (Account.Id id : rcptTo) {
+        Optional<AccountState> thisUser = args.accountCache.get(id);
+        if (thisUser.isPresent()) {
+          Account thisUserAccount = thisUser.get().getAccount();
+          GeneralPreferencesInfo prefs = thisUser.get().getGeneralPreferences();
+          if (prefs == null || prefs.getEmailStrategy() == DISABLED) {
+            removeUser(thisUserAccount);
+          } else if (useHtml() && prefs.getEmailFormat() == EmailFormat.PLAINTEXT) {
+            removeUser(thisUserAccount);
+            smtpRcptToPlaintextOnly.add(
+                new Address(thisUserAccount.getFullName(), thisUserAccount.getPreferredEmail()));
+          }
+        }
+        if (smtpRcptTo.isEmpty() && smtpRcptToPlaintextOnly.isEmpty()) {
+          return;
+        }
+      }
+
+      // Set Reply-To only if it hasn't been set by a child class
+      // Reply-To will already be populated for the message types where Gerrit supports
+      // inbound email replies.
+      if (!headers.containsKey(FieldName.REPLY_TO)) {
+        StringJoiner j = new StringJoiner(", ");
+        if (fromId != null) {
+          Address address = toAddress(fromId);
+          if (address != null) {
+            j.add(address.getEmail());
+          }
+        }
+        smtpRcptTo.stream().forEach(a -> j.add(a.getEmail()));
+        smtpRcptToPlaintextOnly.stream().forEach(a -> j.add(a.getEmail()));
+        setHeader(FieldName.REPLY_TO, j.toString());
+      }
+
+      String textPart = textBody.toString();
+      OutgoingEmailValidationListener.Args va = new OutgoingEmailValidationListener.Args();
+      va.messageClass = messageClass;
+      va.smtpFromAddress = smtpFromAddress;
+      va.smtpRcptTo = smtpRcptTo;
+      va.headers = headers;
+      va.body = textPart;
+
+      if (useHtml()) {
+        va.htmlBody = htmlBody.toString();
+      } else {
+        va.htmlBody = null;
+      }
+
+      for (OutgoingEmailValidationListener validator : args.outgoingEmailValidationListeners) {
+        try {
+          validator.validateOutgoingEmail(va);
+        } catch (ValidationException e) {
+          return;
+        }
+      }
+
+      if (!smtpRcptTo.isEmpty()) {
+        // Send multipart message
+        args.emailSender.send(va.smtpFromAddress, va.smtpRcptTo, va.headers, va.body, va.htmlBody);
+      }
+
+      if (!smtpRcptToPlaintextOnly.isEmpty()) {
+        // Send plaintext message
+        Map<String, EmailHeader> shallowCopy = new HashMap<>();
+        shallowCopy.putAll(headers);
+        // Remove To and Cc
+        shallowCopy.remove(FieldName.TO);
+        shallowCopy.remove(FieldName.CC);
+        for (Address a : smtpRcptToPlaintextOnly) {
+          // Add new To
+          EmailHeader.AddressList to = new EmailHeader.AddressList();
+          to.add(a);
+          shallowCopy.put(FieldName.TO, to);
+        }
+        args.emailSender.send(va.smtpFromAddress, smtpRcptToPlaintextOnly, shallowCopy, va.body);
+      }
+    }
+  }
+
+  /** Format the message body by calling {@link #appendText(String)}. */
+  protected abstract void format() throws EmailException;
+
+  /**
+   * Setup the message headers and envelope (TO, CC, BCC).
+   *
+   * @throws EmailException if an error occurred.
+   */
+  protected void init() throws EmailException {
+    setupSoyContext();
+
+    smtpFromAddress = args.fromAddressGenerator.from(fromId);
+    setHeader(FieldName.DATE, new Date());
+    headers.put(FieldName.FROM, new EmailHeader.AddressList(smtpFromAddress));
+    headers.put(FieldName.TO, new EmailHeader.AddressList());
+    headers.put(FieldName.CC, new EmailHeader.AddressList());
+    setHeader(FieldName.MESSAGE_ID, "");
+    setHeader(MailHeader.AUTO_SUBMITTED.fieldName(), "auto-generated");
+
+    for (RecipientType recipientType : accountsToNotify.keySet()) {
+      add(recipientType, accountsToNotify.get(recipientType));
+    }
+
+    setHeader(MailHeader.MESSAGE_TYPE.fieldName(), messageClass);
+    footers.add(MailHeader.MESSAGE_TYPE.withDelimiter() + messageClass);
+    textBody = new StringBuilder();
+    htmlBody = new StringBuilder();
+
+    if (fromId != null && args.fromAddressGenerator.isGenericAddress(fromId)) {
+      appendText(getFromLine());
+    }
+  }
+
+  protected String getFromLine() {
+    StringBuilder f = new StringBuilder();
+    Optional<Account> account = args.accountCache.get(fromId).map(AccountState::getAccount);
+    if (account.isPresent()) {
+      String name = account.get().getFullName();
+      String email = account.get().getPreferredEmail();
+      if ((name != null && !name.isEmpty()) || (email != null && !email.isEmpty())) {
+        f.append("From");
+        if (name != null && !name.isEmpty()) {
+          f.append(" ").append(name);
+        }
+        if (email != null && !email.isEmpty()) {
+          f.append(" <").append(email).append(">");
+        }
+        f.append(":\n\n");
+      }
+    }
+    return f.toString();
+  }
+
+  public String getGerritHost() {
+    if (getGerritUrl() != null) {
+      try {
+        return new URL(getGerritUrl()).getHost();
+      } catch (MalformedURLException e) {
+        // Try something else.
+      }
+    }
+
+    // Fall back onto whatever the local operating system thinks
+    // this server is called. We hopefully didn't get here as a
+    // good admin would have configured the canonical url.
+    //
+    return SystemReader.getInstance().getHostname();
+  }
+
+  public String getSettingsUrl() {
+    if (getGerritUrl() != null) {
+      final StringBuilder r = new StringBuilder();
+      r.append(getGerritUrl());
+      r.append("settings");
+      return r.toString();
+    }
+    return null;
+  }
+
+  public String getGerritUrl() {
+    return args.urlFormatter.get().getWebUrl().orElse(null);
+  }
+
+  /** Set a header in the outgoing message. */
+  protected void setHeader(String name, String value) {
+    headers.put(name, new EmailHeader.String(value));
+  }
+
+  /** Remove a header from the outgoing message. */
+  protected void removeHeader(String name) {
+    headers.remove(name);
+  }
+
+  protected void setHeader(String name, Date date) {
+    headers.put(name, new EmailHeader.Date(date));
+  }
+
+  /** Append text to the outgoing email body. */
+  protected void appendText(String text) {
+    if (text != null) {
+      textBody.append(text);
+    }
+  }
+
+  /** Append html to the outgoing email body. */
+  protected void appendHtml(String html) {
+    if (html != null) {
+      htmlBody.append(html);
+    }
+  }
+
+  /** Lookup a human readable name for an account, usually the "full name". */
+  protected String getNameFor(Account.Id accountId) {
+    if (accountId == null) {
+      return args.gerritPersonIdent.getName();
+    }
+
+    Optional<Account> account = args.accountCache.get(accountId).map(AccountState::getAccount);
+    String name = null;
+    if (account.isPresent()) {
+      name = account.get().getFullName();
+      if (name == null) {
+        name = account.get().getPreferredEmail();
+      }
+    }
+    if (name == null) {
+      name = args.anonymousCowardName + " #" + accountId;
+    }
+    return name;
+  }
+
+  /**
+   * Gets the human readable name and email for an account; if neither are available, returns the
+   * Anonymous Coward name.
+   *
+   * @param accountId user to fetch.
+   * @return name/email of account, or Anonymous Coward if unset.
+   */
+  protected String getNameEmailFor(Account.Id accountId) {
+    Optional<Account> account = args.accountCache.get(accountId).map(AccountState::getAccount);
+    if (account.isPresent()) {
+      String name = account.get().getFullName();
+      String email = account.get().getPreferredEmail();
+      if (name != null && email != null) {
+        return name + " <" + email + ">";
+      } else if (name != null) {
+        return name;
+      } else if (email != null) {
+        return email;
+      }
+    }
+    return args.anonymousCowardName + " #" + accountId;
+  }
+
+  /**
+   * Gets the human readable name and email for an account; if both are unavailable, returns the
+   * username. If no username is set, this function returns null.
+   *
+   * @param accountId user to fetch.
+   * @return name/email of account, username, or null if unset.
+   */
+  protected String getUserNameEmailFor(Account.Id accountId) {
+    Optional<AccountState> accountState = args.accountCache.get(accountId);
+    if (!accountState.isPresent()) {
+      return null;
+    }
+
+    Account account = accountState.get().getAccount();
+    String name = account.getFullName();
+    String email = account.getPreferredEmail();
+    if (name != null && email != null) {
+      return name + " <" + email + ">";
+    } else if (email != null) {
+      return email;
+    } else if (name != null) {
+      return name;
+    }
+    return accountState.get().getUserName().orElse(null);
+  }
+
+  protected boolean shouldSendMessage() {
+    if (textBody.length() == 0) {
+      // If we have no message body, don't send.
+      return false;
+    }
+
+    if (smtpRcptTo.isEmpty()) {
+      // If we have nobody to send this message to, then all of our
+      // selection filters previously for this type of message were
+      // unable to match a destination. Don't bother sending it.
+      return false;
+    }
+
+    if ((accountsToNotify == null || accountsToNotify.isEmpty())
+        && smtpRcptTo.size() == 1
+        && rcptTo.size() == 1
+        && rcptTo.contains(fromId)) {
+      // If the only recipient is also the sender, don't bother.
+      //
+      return false;
+    }
+
+    return true;
+  }
+
+  /** Schedule this message for delivery to the listed accounts. */
+  protected void add(RecipientType rt, Collection<Account.Id> list) {
+    add(rt, list, false);
+  }
+
+  /** Schedule this message for delivery to the listed accounts. */
+  protected void add(RecipientType rt, Collection<Account.Id> list, boolean override) {
+    for (final Account.Id id : list) {
+      add(rt, id, override);
+    }
+  }
+
+  /** Schedule this message for delivery to the listed address. */
+  protected void addByEmail(RecipientType rt, Collection<Address> list) {
+    addByEmail(rt, list, false);
+  }
+
+  /** Schedule this message for delivery to the listed address. */
+  protected void addByEmail(RecipientType rt, Collection<Address> list, boolean override) {
+    for (final Address id : list) {
+      add(rt, id, override);
+    }
+  }
+
+  protected void add(RecipientType rt, UserIdentity who) {
+    add(rt, who, false);
+  }
+
+  protected void add(RecipientType rt, UserIdentity who, boolean override) {
+    if (who != null && who.getAccount() != null) {
+      add(rt, who.getAccount(), override);
+    }
+  }
+
+  /** Schedule delivery of this message to the given account. */
+  protected void add(RecipientType rt, Account.Id to) {
+    add(rt, to, false);
+  }
+
+  protected void add(RecipientType rt, Account.Id to, boolean override) {
+    try {
+      if (!rcptTo.contains(to) && isVisibleTo(to)) {
+        rcptTo.add(to);
+        add(rt, toAddress(to), override);
+      }
+    } catch (PermissionBackendException e) {
+      logger.atSevere().withCause(e).log("Error reading database for account: %s", to);
+    }
+  }
+
+  /**
+   * @param to account.
+   * @throws PermissionBackendException
+   * @return whether this email is visible to the given account.
+   */
+  protected boolean isVisibleTo(Account.Id to) throws PermissionBackendException {
+    return true;
+  }
+
+  /** Schedule delivery of this message to the given account. */
+  protected void add(RecipientType rt, Address addr) {
+    add(rt, addr, false);
+  }
+
+  protected void add(RecipientType rt, Address addr, boolean override) {
+    if (addr != null && addr.getEmail() != null && addr.getEmail().length() > 0) {
+      if (!args.validator.isValid(addr.getEmail())) {
+        logger.atWarning().log("Not emailing %s (invalid email address)", addr.getEmail());
+      } else if (!args.emailSender.canEmail(addr.getEmail())) {
+        logger.atWarning().log("Not emailing %s (prohibited by allowrcpt)", addr.getEmail());
+      } else {
+        if (!smtpRcptTo.add(addr)) {
+          if (!override) {
+            return;
+          }
+          ((EmailHeader.AddressList) headers.get(FieldName.TO)).remove(addr.getEmail());
+          ((EmailHeader.AddressList) headers.get(FieldName.CC)).remove(addr.getEmail());
+        }
+        switch (rt) {
+          case TO:
+            ((EmailHeader.AddressList) headers.get(FieldName.TO)).add(addr);
+            break;
+          case CC:
+            ((EmailHeader.AddressList) headers.get(FieldName.CC)).add(addr);
+            break;
+          case BCC:
+            break;
+        }
+      }
+    }
+  }
+
+  private Address toAddress(Account.Id id) {
+    Optional<Account> accountState = args.accountCache.get(id).map(AccountState::getAccount);
+    if (!accountState.isPresent()) {
+      return null;
+    }
+
+    Account account = accountState.get();
+    String e = account.getPreferredEmail();
+    if (!account.isActive() || e == null) {
+      return null;
+    }
+    return new Address(account.getFullName(), e);
+  }
+
+  protected void setupSoyContext() {
+    soyContext = new HashMap<>();
+    footers = new ArrayList<>();
+
+    soyContext.put("messageClass", messageClass);
+    soyContext.put("footers", footers);
+
+    soyContextEmailData = new HashMap<>();
+    soyContextEmailData.put("settingsUrl", getSettingsUrl());
+    soyContextEmailData.put("instanceName", getInstanceName());
+    soyContextEmailData.put("gerritHost", getGerritHost());
+    soyContextEmailData.put("gerritUrl", getGerritUrl());
+    soyContext.put("email", soyContextEmailData);
+  }
+
+  private String getInstanceName() {
+    return args.instanceNameProvider.get();
+  }
+
+  private String soyTemplate(String name, SanitizedContent.ContentKind kind) {
+    return args.soyTofu
+        .newRenderer("com.google.gerrit.server.mail.template." + name)
+        .setContentKind(kind)
+        .setData(soyContext)
+        .render();
+  }
+
+  protected String textTemplate(String name) {
+    return soyTemplate(name, SanitizedContent.ContentKind.TEXT);
+  }
+
+  protected String soyHtmlTemplate(String name) {
+    return soyTemplate(name, SanitizedContent.ContentKind.HTML);
+  }
+
+  protected void removeUser(Account user) {
+    String fromEmail = user.getPreferredEmail();
+    for (Iterator<Address> j = smtpRcptTo.iterator(); j.hasNext(); ) {
+      if (j.next().getEmail().equals(fromEmail)) {
+        j.remove();
+      }
+    }
+    for (Map.Entry<String, EmailHeader> entry : headers.entrySet()) {
+      // Don't remove fromEmail from the "From" header though!
+      if (entry.getValue() instanceof AddressList && !entry.getKey().equals("From")) {
+        ((AddressList) entry.getValue()).remove(fromEmail);
+      }
+    }
+  }
+
+  protected final boolean useHtml() {
+    return args.settings.html && supportsHtml();
+  }
+
+  /** Override this method to enable HTML in a subclass. */
+  protected boolean supportsHtml() {
+    return false;
+  }
+}
diff --git a/java/com/google/gerrit/server/mail/send/OutgoingEmailValidator.java b/java/com/google/gerrit/server/mail/send/OutgoingEmailValidator.java
new file mode 100644
index 0000000..bc6c89e
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/OutgoingEmailValidator.java
@@ -0,0 +1,48 @@
+// 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.
+
+package com.google.gerrit.server.mail.send;
+
+import static org.apache.commons.validator.routines.DomainValidator.ArrayType.GENERIC_PLUS;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import org.apache.commons.validator.routines.DomainValidator;
+import org.apache.commons.validator.routines.EmailValidator;
+import org.eclipse.jgit.lib.Config;
+
+@Singleton
+public class OutgoingEmailValidator {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  @Inject
+  OutgoingEmailValidator(@GerritServerConfig Config config) {
+    String[] allowTLD = config.getStringList("sendemail", null, "allowTLD");
+    if (allowTLD.length != 0) {
+      try {
+        DomainValidator.updateTLDOverride(GENERIC_PLUS, allowTLD);
+      } catch (IllegalStateException e) {
+        // Should only happen in tests, where the OutgoingEmailValidator
+        // is instantiated repeatedly.
+        logger.atSevere().log("Failed to update TLD override: %s", e.getMessage());
+      }
+    }
+  }
+
+  public boolean isValid(String addr) {
+    return EmailValidator.getInstance(true, true).isValid(addr);
+  }
+}
diff --git a/java/com/google/gerrit/server/mail/send/ProjectWatch.java b/java/com/google/gerrit/server/mail/send/ProjectWatch.java
new file mode 100644
index 0000000..9a86fdb
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/ProjectWatch.java
@@ -0,0 +1,246 @@
+// Copyright (C) 2013 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.google.gerrit.server.mail.send;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gerrit.server.account.ProjectWatches.ProjectWatchKey;
+import com.google.gerrit.server.git.NotifyConfig;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.ChangeQueryBuilder;
+import com.google.gerrit.server.query.change.SingleGroupUser;
+import com.google.gwtorm.server.OrmException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public class ProjectWatch {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  protected final EmailArguments args;
+  protected final ProjectState projectState;
+  protected final Project.NameKey project;
+  protected final ChangeData changeData;
+
+  public ProjectWatch(
+      EmailArguments args,
+      Project.NameKey project,
+      ProjectState projectState,
+      ChangeData changeData) {
+    this.args = args;
+    this.project = project;
+    this.projectState = projectState;
+    this.changeData = changeData;
+  }
+
+  /** Returns all watchers that are relevant */
+  public final Watchers getWatchers(NotifyType type, boolean includeWatchersFromNotifyConfig)
+      throws OrmException {
+    Watchers matching = new Watchers();
+    Set<Account.Id> projectWatchers = new HashSet<>();
+
+    for (AccountState a : args.accountQueryProvider.get().byWatchedProject(project)) {
+      Account.Id accountId = a.getAccount().getId();
+      for (Map.Entry<ProjectWatchKey, ImmutableSet<NotifyType>> e :
+          a.getProjectWatches().entrySet()) {
+        if (project.equals(e.getKey().project())
+            && add(matching, accountId, e.getKey(), e.getValue(), type)) {
+          // We only want to prevent matching All-Projects if this filter hits
+          projectWatchers.add(accountId);
+        }
+      }
+    }
+
+    for (AccountState a : args.accountQueryProvider.get().byWatchedProject(args.allProjectsName)) {
+      for (Map.Entry<ProjectWatchKey, ImmutableSet<NotifyType>> e :
+          a.getProjectWatches().entrySet()) {
+        if (args.allProjectsName.equals(e.getKey().project())) {
+          Account.Id accountId = a.getAccount().getId();
+          if (!projectWatchers.contains(accountId)) {
+            add(matching, accountId, e.getKey(), e.getValue(), type);
+          }
+        }
+      }
+    }
+
+    if (!includeWatchersFromNotifyConfig) {
+      return matching;
+    }
+
+    for (ProjectState state : projectState.tree()) {
+      for (NotifyConfig nc : state.getConfig().getNotifyConfigs()) {
+        if (nc.isNotify(type)) {
+          try {
+            add(matching, nc);
+          } catch (QueryParseException e) {
+            logger.atWarning().log(
+                "Project %s has invalid notify %s filter \"%s\": %s",
+                state.getName(), nc.getName(), nc.getFilter(), e.getMessage());
+          }
+        }
+      }
+    }
+
+    return matching;
+  }
+
+  public static class Watchers {
+    static class List {
+      protected final Set<Account.Id> accounts = new HashSet<>();
+      protected final Set<Address> emails = new HashSet<>();
+
+      private static List union(List... others) {
+        List union = new List();
+        for (List other : others) {
+          union.accounts.addAll(other.accounts);
+          union.emails.addAll(other.emails);
+        }
+        return union;
+      }
+    }
+
+    protected final List to = new List();
+    protected final List cc = new List();
+    protected final List bcc = new List();
+
+    List all() {
+      return List.union(to, cc, bcc);
+    }
+
+    List list(NotifyConfig.Header header) {
+      switch (header) {
+        case TO:
+          return to;
+        case CC:
+          return cc;
+        default:
+        case BCC:
+          return bcc;
+      }
+    }
+  }
+
+  private void add(Watchers matching, NotifyConfig nc) throws OrmException, QueryParseException {
+    for (GroupReference ref : nc.getGroups()) {
+      CurrentUser user = new SingleGroupUser(ref.getUUID());
+      if (filterMatch(user, nc.getFilter())) {
+        deliverToMembers(matching.list(nc.getHeader()), ref.getUUID());
+      }
+    }
+
+    if (!nc.getAddresses().isEmpty()) {
+      if (filterMatch(null, nc.getFilter())) {
+        matching.list(nc.getHeader()).emails.addAll(nc.getAddresses());
+      }
+    }
+  }
+
+  private void deliverToMembers(Watchers.List matching, AccountGroup.UUID startUUID) {
+    Set<AccountGroup.UUID> seen = new HashSet<>();
+    List<AccountGroup.UUID> q = new ArrayList<>();
+
+    seen.add(startUUID);
+    q.add(startUUID);
+
+    while (!q.isEmpty()) {
+      AccountGroup.UUID uuid = q.remove(q.size() - 1);
+      GroupDescription.Basic group = args.groupBackend.get(uuid);
+      if (group == null) {
+        continue;
+      }
+      if (!Strings.isNullOrEmpty(group.getEmailAddress())) {
+        // If the group has an email address, do not expand membership.
+        matching.emails.add(new Address(group.getEmailAddress()));
+        continue;
+      }
+
+      if (!(group instanceof GroupDescription.Internal)) {
+        // Non-internal groups cannot be expanded by the server.
+        continue;
+      }
+
+      GroupDescription.Internal ig = (GroupDescription.Internal) group;
+      matching.accounts.addAll(ig.getMembers());
+      for (AccountGroup.UUID m : ig.getSubgroups()) {
+        if (seen.add(m)) {
+          q.add(m);
+        }
+      }
+    }
+  }
+
+  private boolean add(
+      Watchers matching,
+      Account.Id accountId,
+      ProjectWatchKey key,
+      Set<NotifyType> watchedTypes,
+      NotifyType type)
+      throws OrmException {
+    IdentifiedUser user = args.identifiedUserFactory.create(accountId);
+
+    try {
+      if (filterMatch(user, key.filter())) {
+        // If we are set to notify on this type, add the user.
+        // Otherwise, still return true to stop notifications for this user.
+        if (watchedTypes.contains(type)) {
+          matching.bcc.accounts.add(accountId);
+        }
+        return true;
+      }
+    } catch (QueryParseException e) {
+      // Ignore broken filter expressions.
+    }
+    return false;
+  }
+
+  private boolean filterMatch(CurrentUser user, String filter)
+      throws OrmException, QueryParseException {
+    ChangeQueryBuilder qb;
+    Predicate<ChangeData> p = null;
+
+    if (user == null) {
+      qb = args.queryBuilder.asUser(args.anonymousUser);
+    } else {
+      qb = args.queryBuilder.asUser(user);
+      p = qb.is_visible();
+    }
+
+    if (filter != null) {
+      Predicate<ChangeData> filterPredicate = qb.parse(filter);
+      if (p == null) {
+        p = filterPredicate;
+      } else {
+        p = Predicate.and(filterPredicate, p);
+      }
+    }
+    return p == null || p.asMatchable().match(changeData);
+  }
+}
diff --git a/java/com/google/gerrit/server/mail/send/RegisterNewEmailSender.java b/java/com/google/gerrit/server/mail/send/RegisterNewEmailSender.java
new file mode 100644
index 0000000..3bca00c
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/RegisterNewEmailSender.java
@@ -0,0 +1,82 @@
+// Copyright (C) 2009 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.google.gerrit.server.mail.send;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.gerrit.common.errors.EmailException;
+import com.google.gerrit.extensions.api.changes.RecipientType;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.mail.EmailTokenVerifier;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+
+public class RegisterNewEmailSender extends OutgoingEmail {
+  public interface Factory {
+    RegisterNewEmailSender create(String address);
+  }
+
+  private final EmailTokenVerifier tokenVerifier;
+  private final IdentifiedUser user;
+  private final String addr;
+  private String emailToken;
+
+  @Inject
+  public RegisterNewEmailSender(
+      EmailArguments ea,
+      EmailTokenVerifier etv,
+      IdentifiedUser callingUser,
+      @Assisted final String address) {
+    super(ea, "registernewemail");
+    tokenVerifier = etv;
+    user = callingUser;
+    addr = address;
+  }
+
+  @Override
+  protected void init() throws EmailException {
+    super.init();
+    setHeader("Subject", "[Gerrit Code Review] Email Verification");
+    add(RecipientType.TO, new Address(addr));
+  }
+
+  @Override
+  protected void format() throws EmailException {
+    appendText(textTemplate("RegisterNewEmail"));
+  }
+
+  public String getUserNameEmail() {
+    return getUserNameEmailFor(user.getAccountId());
+  }
+
+  public String getEmailRegistrationToken() {
+    if (emailToken == null) {
+      emailToken = requireNonNull(tokenVerifier.encode(user.getAccountId(), addr), "token");
+    }
+    return emailToken;
+  }
+
+  public boolean isAllowed() {
+    return args.emailSender.canEmail(addr);
+  }
+
+  @Override
+  protected void setupSoyContext() {
+    super.setupSoyContext();
+    soyContextEmailData.put("emailRegistrationToken", getEmailRegistrationToken());
+    soyContextEmailData.put("userNameEmail", getUserNameEmail());
+  }
+}
diff --git a/java/com/google/gerrit/server/mail/send/ReplacePatchSetSender.java b/java/com/google/gerrit/server/mail/send/ReplacePatchSetSender.java
new file mode 100644
index 0000000..2398b82
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/ReplacePatchSetSender.java
@@ -0,0 +1,108 @@
+// Copyright (C) 2009 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.google.gerrit.server.mail.send;
+
+import com.google.gerrit.common.errors.EmailException;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.api.changes.RecipientType;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/** Send notice of new patch sets for reviewers. */
+public class ReplacePatchSetSender extends ReplyToChangeSender {
+  public interface Factory {
+    ReplacePatchSetSender create(Project.NameKey project, Change.Id id);
+  }
+
+  private final Set<Account.Id> reviewers = new HashSet<>();
+  private final Set<Account.Id> extraCC = new HashSet<>();
+
+  @Inject
+  public ReplacePatchSetSender(
+      EmailArguments ea, @Assisted Project.NameKey project, @Assisted Change.Id id)
+      throws OrmException {
+    super(ea, "newpatchset", newChangeData(ea, project, id));
+  }
+
+  public void addReviewers(Collection<Account.Id> cc) {
+    reviewers.addAll(cc);
+  }
+
+  public void addExtraCC(Collection<Account.Id> cc) {
+    extraCC.addAll(cc);
+  }
+
+  @Override
+  protected void init() throws EmailException {
+    super.init();
+
+    if (fromId != null) {
+      // Don't call yourself a reviewer of your own patch set.
+      //
+      reviewers.remove(fromId);
+    }
+    if (notify == NotifyHandling.ALL || notify == NotifyHandling.OWNER_REVIEWERS) {
+      add(RecipientType.TO, reviewers);
+      add(RecipientType.CC, extraCC);
+    }
+    rcptToAuthors(RecipientType.CC);
+    bccStarredBy();
+    includeWatchers(NotifyType.NEW_PATCHSETS, !change.isWorkInProgress() && !change.isPrivate());
+    removeUsersThatIgnoredTheChange();
+  }
+
+  @Override
+  protected void formatChange() throws EmailException {
+    appendText(textTemplate("ReplacePatchSet"));
+    if (useHtml()) {
+      appendHtml(soyHtmlTemplate("ReplacePatchSetHtml"));
+    }
+  }
+
+  public List<String> getReviewerNames() {
+    List<String> names = new ArrayList<>();
+    for (Account.Id id : reviewers) {
+      if (id.equals(fromId)) {
+        continue;
+      }
+      names.add(getNameFor(id));
+    }
+    if (names.isEmpty()) {
+      return null;
+    }
+    return names;
+  }
+
+  @Override
+  protected void setupSoyContext() {
+    super.setupSoyContext();
+    soyContextEmailData.put("reviewerNames", getReviewerNames());
+  }
+
+  @Override
+  protected boolean supportsHtml() {
+    return true;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/ReplyToChangeSender.java b/java/com/google/gerrit/server/mail/send/ReplyToChangeSender.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/mail/send/ReplyToChangeSender.java
rename to java/com/google/gerrit/server/mail/send/ReplyToChangeSender.java
diff --git a/java/com/google/gerrit/server/mail/send/RestoredSender.java b/java/com/google/gerrit/server/mail/send/RestoredSender.java
new file mode 100644
index 0000000..d7f8eb5
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/RestoredSender.java
@@ -0,0 +1,61 @@
+// Copyright (C) 2011 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.google.gerrit.server.mail.send;
+
+import com.google.gerrit.common.errors.EmailException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+
+/** Send notice about a change being restored by its owner. */
+public class RestoredSender extends ReplyToChangeSender {
+  public interface Factory extends ReplyToChangeSender.Factory<RestoredSender> {
+    @Override
+    RestoredSender create(Project.NameKey project, Change.Id id);
+  }
+
+  @Inject
+  public RestoredSender(
+      EmailArguments ea, @Assisted Project.NameKey project, @Assisted Change.Id id)
+      throws OrmException {
+    super(ea, "restore", ChangeEmail.newChangeData(ea, project, id));
+  }
+
+  @Override
+  protected void init() throws EmailException {
+    super.init();
+
+    ccAllApprovals();
+    bccStarredBy();
+    includeWatchers(NotifyType.ALL_COMMENTS);
+    removeUsersThatIgnoredTheChange();
+  }
+
+  @Override
+  protected void formatChange() throws EmailException {
+    appendText(textTemplate("Restored"));
+    if (useHtml()) {
+      appendHtml(soyHtmlTemplate("RestoredHtml"));
+    }
+  }
+
+  @Override
+  protected boolean supportsHtml() {
+    return true;
+  }
+}
diff --git a/java/com/google/gerrit/server/mail/send/RevertedSender.java b/java/com/google/gerrit/server/mail/send/RevertedSender.java
new file mode 100644
index 0000000..21703a3
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/RevertedSender.java
@@ -0,0 +1,60 @@
+// Copyright (C) 2011 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.google.gerrit.server.mail.send;
+
+import com.google.gerrit.common.errors.EmailException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+
+/** Send notice about a change being reverted. */
+public class RevertedSender extends ReplyToChangeSender {
+  public interface Factory {
+    RevertedSender create(Project.NameKey project, Change.Id id);
+  }
+
+  @Inject
+  public RevertedSender(
+      EmailArguments ea, @Assisted Project.NameKey project, @Assisted Change.Id id)
+      throws OrmException {
+    super(ea, "revert", ChangeEmail.newChangeData(ea, project, id));
+  }
+
+  @Override
+  protected void init() throws EmailException {
+    super.init();
+
+    ccAllApprovals();
+    bccStarredBy();
+    includeWatchers(NotifyType.ALL_COMMENTS);
+    removeUsersThatIgnoredTheChange();
+  }
+
+  @Override
+  protected void formatChange() throws EmailException {
+    appendText(textTemplate("Reverted"));
+    if (useHtml()) {
+      appendHtml(soyHtmlTemplate("RevertedHtml"));
+    }
+  }
+
+  @Override
+  protected boolean supportsHtml() {
+    return true;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/SetAssigneeSender.java b/java/com/google/gerrit/server/mail/send/SetAssigneeSender.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/mail/send/SetAssigneeSender.java
rename to java/com/google/gerrit/server/mail/send/SetAssigneeSender.java
diff --git a/java/com/google/gerrit/server/mail/send/SmtpEmailSender.java b/java/com/google/gerrit/server/mail/send/SmtpEmailSender.java
new file mode 100644
index 0000000..8615c04
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/SmtpEmailSender.java
@@ -0,0 +1,408 @@
+// Copyright (C) 2009 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.google.gerrit.server.mail.send;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.io.BaseEncoding;
+import com.google.common.primitives.Ints;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.Version;
+import com.google.gerrit.common.errors.EmailException;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.mail.EmailHeader;
+import com.google.gerrit.server.config.ConfigUtil;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.mail.Encryption;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.inject.AbstractModule;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.BufferedWriter;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.Writer;
+import java.text.SimpleDateFormat;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.concurrent.TimeUnit;
+import org.apache.commons.net.smtp.AuthSMTPClient;
+import org.apache.commons.net.smtp.SMTPClient;
+import org.apache.commons.net.smtp.SMTPReply;
+import org.apache.james.mime4j.codec.QuotedPrintableOutputStream;
+import org.eclipse.jgit.lib.Config;
+
+/** Sends email via a nearby SMTP server. */
+@Singleton
+public class SmtpEmailSender implements EmailSender {
+  /** The socket's connect timeout (0 = infinite timeout) */
+  private static final int DEFAULT_CONNECT_TIMEOUT = 0;
+
+  public static class Module extends AbstractModule {
+    @Override
+    protected void configure() {
+      bind(EmailSender.class).to(SmtpEmailSender.class);
+    }
+  }
+
+  private final boolean enabled;
+  private final int connectTimeout;
+
+  private String smtpHost;
+  private int smtpPort;
+  private String smtpUser;
+  private String smtpPass;
+  private Encryption smtpEncryption;
+  private boolean sslVerify;
+  private Set<String> allowrcpt;
+  private String importance;
+  private int expiryDays;
+
+  @Inject
+  SmtpEmailSender(@GerritServerConfig Config cfg) {
+    enabled = cfg.getBoolean("sendemail", null, "enable", true);
+    connectTimeout =
+        Ints.checkedCast(
+            ConfigUtil.getTimeUnit(
+                cfg,
+                "sendemail",
+                null,
+                "connectTimeout",
+                DEFAULT_CONNECT_TIMEOUT,
+                TimeUnit.MILLISECONDS));
+
+    smtpHost = cfg.getString("sendemail", null, "smtpserver");
+    if (smtpHost == null) {
+      smtpHost = "127.0.0.1";
+    }
+
+    smtpEncryption = cfg.getEnum("sendemail", null, "smtpencryption", Encryption.NONE);
+    sslVerify = cfg.getBoolean("sendemail", null, "sslverify", true);
+
+    final int defaultPort;
+    switch (smtpEncryption) {
+      case SSL:
+        defaultPort = 465;
+        break;
+
+      case NONE:
+      case TLS:
+      default:
+        defaultPort = 25;
+        break;
+    }
+    smtpPort = cfg.getInt("sendemail", null, "smtpserverport", defaultPort);
+
+    smtpUser = cfg.getString("sendemail", null, "smtpuser");
+    smtpPass = cfg.getString("sendemail", null, "smtppass");
+
+    Set<String> rcpt = new HashSet<>();
+    Collections.addAll(rcpt, cfg.getStringList("sendemail", null, "allowrcpt"));
+    allowrcpt = Collections.unmodifiableSet(rcpt);
+    importance = cfg.getString("sendemail", null, "importance");
+    expiryDays = cfg.getInt("sendemail", null, "expiryDays", 0);
+  }
+
+  @Override
+  public boolean isEnabled() {
+    return enabled;
+  }
+
+  @Override
+  public boolean canEmail(String address) {
+    if (!isEnabled()) {
+      return false;
+    }
+
+    if (allowrcpt.isEmpty()) {
+      return true;
+    }
+
+    if (allowrcpt.contains(address)) {
+      return true;
+    }
+
+    String domain = address.substring(address.lastIndexOf('@') + 1);
+    if (allowrcpt.contains(domain) || allowrcpt.contains("@" + domain)) {
+      return true;
+    }
+
+    return false;
+  }
+
+  @Override
+  public void send(
+      final Address from,
+      Collection<Address> rcpt,
+      final Map<String, EmailHeader> callerHeaders,
+      String body)
+      throws EmailException {
+    send(from, rcpt, callerHeaders, body, null);
+  }
+
+  @Override
+  public void send(
+      final Address from,
+      Collection<Address> rcpt,
+      final Map<String, EmailHeader> callerHeaders,
+      String textBody,
+      @Nullable String htmlBody)
+      throws EmailException {
+    if (!isEnabled()) {
+      throw new EmailException("Sending email is disabled");
+    }
+
+    StringBuffer rejected = new StringBuffer();
+    try {
+      final SMTPClient client = open();
+      try {
+        if (!client.setSender(from.getEmail())) {
+          throw new EmailException(
+              "Server " + smtpHost + " rejected from address " + from.getEmail());
+        }
+
+        /* Do not prevent the email from being sent to "good" users simply
+         * because some users get rejected.  If not, a single rejected
+         * project watcher could prevent email for most actions on a project
+         * from being sent to any user!  Instead, queue up the errors, and
+         * throw an exception after sending the email to get the rejected
+         * error(s) logged.
+         */
+        for (Address addr : rcpt) {
+          if (!client.addRecipient(addr.getEmail())) {
+            String error = client.getReplyString();
+            rejected
+                .append("Server ")
+                .append(smtpHost)
+                .append(" rejected recipient ")
+                .append(addr)
+                .append(": ")
+                .append(error);
+          }
+        }
+
+        try (Writer messageDataWriter = client.sendMessageData()) {
+          if (messageDataWriter == null) {
+            /* Include rejected recipient error messages here to not lose that
+             * information. That piece of the puzzle is vital if zero recipients
+             * are accepted and the server consequently rejects the DATA command.
+             */
+            throw new EmailException(
+                rejected
+                    + "Server "
+                    + smtpHost
+                    + " rejected DATA command: "
+                    + client.getReplyString());
+          }
+
+          render(messageDataWriter, callerHeaders, textBody, htmlBody);
+
+          if (!client.completePendingCommand()) {
+            throw new EmailException(
+                "Server " + smtpHost + " rejected message body: " + client.getReplyString());
+          }
+
+          client.logout();
+          if (rejected.length() > 0) {
+            throw new EmailException(rejected.toString());
+          }
+        }
+      } finally {
+        client.disconnect();
+      }
+    } catch (IOException e) {
+      throw new EmailException("Cannot send outgoing email", e);
+    }
+  }
+
+  private void render(
+      Writer out,
+      Map<String, EmailHeader> callerHeaders,
+      String textBody,
+      @Nullable String htmlBody)
+      throws IOException, EmailException {
+    final Map<String, EmailHeader> hdrs = new LinkedHashMap<>(callerHeaders);
+    setMissingHeader(hdrs, "MIME-Version", "1.0");
+    setMissingHeader(hdrs, "Content-Transfer-Encoding", "8bit");
+    setMissingHeader(hdrs, "Content-Disposition", "inline");
+    setMissingHeader(hdrs, "User-Agent", "Gerrit/" + Version.getVersion());
+    if (importance != null) {
+      setMissingHeader(hdrs, "Importance", importance);
+    }
+    if (expiryDays > 0) {
+      Date expiry = new Date(TimeUtil.nowMs() + expiryDays * 24 * 60 * 60 * 1000L);
+      setMissingHeader(
+          hdrs, "Expiry-Date", new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z").format(expiry));
+    }
+
+    String encodedBody;
+    if (htmlBody == null) {
+      setMissingHeader(hdrs, "Content-Type", "text/plain; charset=UTF-8");
+      encodedBody = textBody;
+    } else {
+      String boundary = generateMultipartBoundary(textBody, htmlBody);
+      setMissingHeader(
+          hdrs,
+          "Content-Type",
+          "multipart/alternative; boundary=\"" + boundary + "\"; charset=UTF-8");
+      encodedBody = buildMultipartBody(boundary, textBody, htmlBody);
+    }
+
+    try (Writer w = new BufferedWriter(out)) {
+      for (Map.Entry<String, EmailHeader> h : hdrs.entrySet()) {
+        if (!h.getValue().isEmpty()) {
+          w.write(h.getKey());
+          w.write(": ");
+          h.getValue().write(w);
+          w.write("\r\n");
+        }
+      }
+
+      w.write("\r\n");
+      w.write(encodedBody);
+      w.flush();
+    }
+  }
+
+  public static String generateMultipartBoundary(String textBody, String htmlBody)
+      throws EmailException {
+    byte[] bytes = new byte[8];
+    ThreadLocalRandom rng = ThreadLocalRandom.current();
+
+    // The probability of the boundary being valid is approximately
+    // (2^64 - len(message)) / 2^64.
+    //
+    // The message is much shorter than 2^64 bytes, so if two tries don't
+    // suffice, something is seriously wrong.
+    for (int i = 0; i < 2; i++) {
+      rng.nextBytes(bytes);
+      String boundary = BaseEncoding.base64().encode(bytes);
+      String encBoundary = "--" + boundary;
+      if (textBody.contains(encBoundary) || htmlBody.contains(encBoundary)) {
+        continue;
+      }
+      return boundary;
+    }
+    throw new EmailException("Gave up generating unique MIME boundary");
+  }
+
+  protected String buildMultipartBody(String boundary, String textPart, String htmlPart)
+      throws IOException {
+    String encodedTextPart = quotedPrintableEncode(textPart);
+    String encodedHtmlPart = quotedPrintableEncode(htmlPart);
+
+    // Only declare quoted-printable encoding if there are characters that need to be encoded.
+    String textTransferEncoding = textPart.equals(encodedTextPart) ? "7bit" : "quoted-printable";
+    String htmlTransferEncoding = htmlPart.equals(encodedHtmlPart) ? "7bit" : "quoted-printable";
+
+    return
+    // Output the text part:
+    "--"
+        + boundary
+        + "\r\n"
+        + "Content-Type: text/plain; charset=UTF-8\r\n"
+        + "Content-Transfer-Encoding: "
+        + textTransferEncoding
+        + "\r\n"
+        + "\r\n"
+        + encodedTextPart
+        + "\r\n"
+
+        // Output the HTML part:
+        + "--"
+        + boundary
+        + "\r\n"
+        + "Content-Type: text/html; charset=UTF-8\r\n"
+        + "Content-Transfer-Encoding: "
+        + htmlTransferEncoding
+        + "\r\n"
+        + "\r\n"
+        + encodedHtmlPart
+        + "\r\n"
+
+        // Output the closing boundary.
+        + "--"
+        + boundary
+        + "--\r\n";
+  }
+
+  protected String quotedPrintableEncode(String input) throws IOException {
+    ByteArrayOutputStream s = new ByteArrayOutputStream();
+    try (QuotedPrintableOutputStream qp = new QuotedPrintableOutputStream(s, false)) {
+      qp.write(input.getBytes(UTF_8));
+    }
+    return s.toString();
+  }
+
+  private static void setMissingHeader(Map<String, EmailHeader> hdrs, String name, String value) {
+    if (!hdrs.containsKey(name) || hdrs.get(name).isEmpty()) {
+      hdrs.put(name, new EmailHeader.String(value));
+    }
+  }
+
+  private SMTPClient open() throws EmailException {
+    final AuthSMTPClient client = new AuthSMTPClient(UTF_8.name());
+
+    if (smtpEncryption == Encryption.SSL) {
+      client.enableSSL(sslVerify);
+    }
+
+    client.setConnectTimeout(connectTimeout);
+    try {
+      client.connect(smtpHost, smtpPort);
+      int replyCode = client.getReplyCode();
+      String replyString = client.getReplyString();
+      if (!SMTPReply.isPositiveCompletion(replyCode)) {
+        throw new EmailException(
+            String.format("SMTP server rejected connection: %d: %s", replyCode, replyString));
+      }
+      if (!client.login()) {
+        throw new EmailException("SMTP server rejected HELO/EHLO greeting: " + replyString);
+      }
+
+      if (smtpEncryption == Encryption.TLS) {
+        if (!client.startTLS(smtpHost, smtpPort, sslVerify)) {
+          throw new EmailException("SMTP server does not support TLS");
+        }
+        if (!client.login()) {
+          throw new EmailException("SMTP server rejected login: " + replyString);
+        }
+      }
+
+      if (smtpUser != null && !client.auth(smtpUser, smtpPass)) {
+        throw new EmailException("SMTP server rejected auth: " + replyString);
+      }
+      return client;
+    } catch (IOException | EmailException e) {
+      if (client.isConnected()) {
+        try {
+          client.disconnect();
+        } catch (IOException e2) {
+          // Ignored
+        }
+      }
+      if (e instanceof EmailException) {
+        throw (EmailException) e;
+      }
+      throw new EmailException(e.getMessage(), e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/mime/DefaultFileExtensionRegistry.java b/java/com/google/gerrit/server/mime/DefaultFileExtensionRegistry.java
new file mode 100644
index 0000000..1814e54
--- /dev/null
+++ b/java/com/google/gerrit/server/mime/DefaultFileExtensionRegistry.java
@@ -0,0 +1,116 @@
+// Copyright (C) 2013 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.google.gerrit.server.mime;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.flogger.FluentLogger;
+import eu.medsea.mimeutil.MimeException;
+import eu.medsea.mimeutil.MimeType;
+import eu.medsea.mimeutil.MimeUtil;
+import eu.medsea.mimeutil.detector.MimeDetector;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Properties;
+
+/** Loads mime types from {@code mime-types.properties} at specificity of 2. */
+public class DefaultFileExtensionRegistry extends MimeDetector {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final ImmutableMap<String, MimeType> TYPES;
+
+  static {
+    Properties prop = new Properties();
+    try (InputStream in =
+        DefaultFileExtensionRegistry.class.getResourceAsStream("mime-types.properties")) {
+      prop.load(in);
+    } catch (IOException e) {
+      logger.atWarning().withCause(e).log("Cannot load mime-types.properties");
+    }
+
+    ImmutableMap.Builder<String, MimeType> b = ImmutableMap.builder();
+    for (Map.Entry<Object, Object> e : prop.entrySet()) {
+      MimeType type = new FileExtensionMimeType((String) e.getValue());
+      b.put((String) e.getKey(), type);
+      MimeUtil.addKnownMimeType(type);
+    }
+    TYPES = b.build();
+  }
+
+  @Override
+  public String getDescription() {
+    return getClass().getName();
+  }
+
+  @Override
+  protected Collection<MimeType> getMimeTypesFileName(String name) {
+    int s = name.lastIndexOf('/');
+    if (s >= 0) {
+      name = name.substring(s + 1);
+    }
+
+    MimeType type = TYPES.get(name);
+    if (type != null) {
+      return Collections.singletonList(type);
+    }
+
+    int d = name.lastIndexOf('.');
+    if (0 < d) {
+      type = TYPES.get(name.substring(d + 1));
+      if (type != null) {
+        return Collections.singletonList(type);
+      }
+    }
+
+    return Collections.emptyList();
+  }
+
+  @Override
+  protected Collection<MimeType> getMimeTypesFile(File file) {
+    return getMimeTypesFileName(file.getName());
+  }
+
+  @Override
+  protected Collection<MimeType> getMimeTypesURL(URL url) {
+    return getMimeTypesFileName(url.getPath());
+  }
+
+  @Override
+  protected Collection<MimeType> getMimeTypesInputStream(InputStream arg0) {
+    return Collections.emptyList();
+  }
+
+  @Override
+  protected Collection<MimeType> getMimeTypesByteArray(byte[] arg0) {
+    return Collections.emptyList();
+  }
+
+  private static final class FileExtensionMimeType extends MimeType {
+    private static final long serialVersionUID = 1L;
+
+    FileExtensionMimeType(String mimeType) throws MimeException {
+      super(mimeType);
+    }
+
+    @Override
+    public int getSpecificity() {
+      return 2;
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mime/FileTypeRegistry.java b/java/com/google/gerrit/server/mime/FileTypeRegistry.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/mime/FileTypeRegistry.java
rename to java/com/google/gerrit/server/mime/FileTypeRegistry.java
diff --git a/java/com/google/gerrit/server/mime/MimeUtil2Module.java b/java/com/google/gerrit/server/mime/MimeUtil2Module.java
new file mode 100644
index 0000000..7fdc4fb
--- /dev/null
+++ b/java/com/google/gerrit/server/mime/MimeUtil2Module.java
@@ -0,0 +1,41 @@
+// Copyright (C) 2015 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.google.gerrit.server.mime;
+
+import com.google.gerrit.server.ioutil.HostPlatform;
+import com.google.inject.AbstractModule;
+import com.google.inject.Provides;
+import com.google.inject.Singleton;
+import eu.medsea.mimeutil.MimeUtil2;
+import eu.medsea.mimeutil.detector.ExtensionMimeDetector;
+import eu.medsea.mimeutil.detector.MagicMimeMimeDetector;
+
+public class MimeUtil2Module extends AbstractModule {
+  @Override
+  protected void configure() {}
+
+  @Provides
+  @Singleton
+  MimeUtil2 provideMimeUtil2() {
+    MimeUtil2 m = new MimeUtil2();
+    m.registerMimeDetector(ExtensionMimeDetector.class.getName());
+    m.registerMimeDetector(MagicMimeMimeDetector.class.getName());
+    if (HostPlatform.isWin32()) {
+      m.registerMimeDetector("eu.medsea.mimeutil.detector.WindowsRegistryMimeDetector");
+    }
+    m.registerMimeDetector(DefaultFileExtensionRegistry.class.getName());
+    return m;
+  }
+}
diff --git a/java/com/google/gerrit/server/mime/MimeUtilFileTypeRegistry.java b/java/com/google/gerrit/server/mime/MimeUtilFileTypeRegistry.java
new file mode 100644
index 0000000..0e9a2b7
--- /dev/null
+++ b/java/com/google/gerrit/server/mime/MimeUtilFileTypeRegistry.java
@@ -0,0 +1,145 @@
+// Copyright (C) 2009 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.google.gerrit.server.mime;
+
+import static java.util.Comparator.comparing;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import eu.medsea.mimeutil.MimeException;
+import eu.medsea.mimeutil.MimeType;
+import eu.medsea.mimeutil.MimeUtil2;
+import java.io.InputStream;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.jgit.lib.Config;
+
+@Singleton
+public class MimeUtilFileTypeRegistry implements FileTypeRegistry {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final String KEY_SAFE = "safe";
+  private static final String SECTION_MIMETYPE = "mimetype";
+
+  private final Config cfg;
+  private final MimeUtil2 mimeUtil;
+
+  @Inject
+  MimeUtilFileTypeRegistry(@GerritServerConfig Config gsc, MimeUtil2 mu2) {
+    cfg = gsc;
+    mimeUtil = mu2;
+  }
+
+  /**
+   * Get specificity of mime types with generic types forced to low values
+   *
+   * <p>"application/octet-stream" is forced to -1. "text/plain" is forced to 0. All other mime
+   * types return the specificity reported by mimeType itself.
+   *
+   * @param mimeType The mimeType to get the corrected specificity for.
+   * @return The corrected specificity.
+   */
+  private int getCorrectedMimeSpecificity(MimeType mimeType) {
+    // Although the documentation of MimeType's getSpecificity claims that for
+    // example "application/octet-stream" always has a specificity of 0, it
+    // effectively returns 1 for us. This causes problems when trying to get
+    // the correct mime type via sorting. For example in
+    // [application/octet-stream, image/x-icon] both mime types come with
+    // specificity 1 for us. Hence, getMimeType below may end up using
+    // application/octet-stream instead of the more specific image/x-icon.
+    // Therefore, we have to force the specificity of generic types below the
+    // default of 1.
+    //
+    final String mimeTypeStr = mimeType.toString();
+    if (mimeTypeStr.equals("application/octet-stream")) {
+      return -1;
+    }
+    if (mimeTypeStr.equals("text/plain")) {
+      return 0;
+    }
+    return mimeType.getSpecificity();
+  }
+
+  @Override
+  @SuppressWarnings("unchecked")
+  public MimeType getMimeType(String path, byte[] content) {
+    Set<MimeType> mimeTypes = new HashSet<>();
+    if (content != null && content.length > 0) {
+      try {
+        mimeTypes.addAll(mimeUtil.getMimeTypes(content));
+      } catch (MimeException e) {
+        logger.atWarning().withCause(e).log("Unable to determine MIME type from content");
+      }
+    }
+    return getMimeType(mimeTypes, path);
+  }
+
+  @Override
+  @SuppressWarnings("unchecked")
+  public MimeType getMimeType(String path, InputStream is) {
+    Set<MimeType> mimeTypes = new HashSet<>();
+    try {
+      mimeTypes.addAll(mimeUtil.getMimeTypes(is));
+    } catch (MimeException e) {
+      logger.atWarning().withCause(e).log("Unable to determine MIME type from content");
+    }
+    return getMimeType(mimeTypes, path);
+  }
+
+  @SuppressWarnings("unchecked")
+  private MimeType getMimeType(Set<MimeType> mimeTypes, String path) {
+    try {
+      mimeTypes.addAll(mimeUtil.getMimeTypes(path));
+    } catch (MimeException e) {
+      logger.atWarning().withCause(e).log("Unable to determine MIME type from path");
+    }
+
+    if (isUnknownType(mimeTypes)) {
+      return MimeUtil2.UNKNOWN_MIME_TYPE;
+    }
+
+    return Collections.max(mimeTypes, comparing(this::getCorrectedMimeSpecificity));
+  }
+
+  @Override
+  public boolean isSafeInline(MimeType type) {
+    if (MimeUtil2.UNKNOWN_MIME_TYPE.equals(type)) {
+      // Most browsers perform content type sniffing when they get told
+      // a generic content type. This is bad, so assume we cannot send
+      // the file inline.
+      //
+      return false;
+    }
+
+    final boolean any = isSafe(cfg, "*/*", false);
+    final boolean genericMedia = isSafe(cfg, type.getMediaType() + "/*", any);
+    return isSafe(cfg, type.toString(), genericMedia);
+  }
+
+  private static boolean isSafe(Config cfg, String type, boolean def) {
+    return cfg.getBoolean(SECTION_MIMETYPE, type, KEY_SAFE, def);
+  }
+
+  private static boolean isUnknownType(Collection<MimeType> mimeTypes) {
+    if (mimeTypes.isEmpty()) {
+      return true;
+    }
+    return mimeTypes.size() == 1 && mimeTypes.contains(MimeUtil2.UNKNOWN_MIME_TYPE);
+  }
+}
diff --git a/java/com/google/gerrit/server/notedb/AbstractChangeNotes.java b/java/com/google/gerrit/server/notedb/AbstractChangeNotes.java
new file mode 100644
index 0000000..72f1ba6
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/AbstractChangeNotes.java
@@ -0,0 +1,244 @@
+// Copyright (C) 2014 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.google.gerrit.server.notedb;
+
+import static com.google.gerrit.server.notedb.NoteDbTable.CHANGES;
+import static java.util.Objects.requireNonNull;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.metrics.Timer1;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.notedb.ChangeNotesCommit.ChangeNotesRevWalk;
+import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
+import com.google.gerrit.server.notedb.rebuild.ChangeRebuilder;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+
+/** View of contents at a single ref related to some change. * */
+public abstract class AbstractChangeNotes<T> {
+  @VisibleForTesting
+  @Singleton
+  public static class Args {
+    final GitRepositoryManager repoManager;
+    final NotesMigration migration;
+    final AllUsersName allUsers;
+    final ChangeNoteJson changeNoteJson;
+    final LegacyChangeNoteRead legacyChangeNoteRead;
+    final NoteDbMetrics metrics;
+    final Provider<ReviewDb> db;
+
+    // Providers required to avoid dependency cycles.
+
+    // ChangeRebuilder -> ChangeNotes.Factory -> Args
+    final Provider<ChangeRebuilder> rebuilder;
+
+    // ChangeNoteCache -> Args
+    final Provider<ChangeNotesCache> cache;
+
+    @Inject
+    Args(
+        GitRepositoryManager repoManager,
+        NotesMigration migration,
+        AllUsersName allUsers,
+        ChangeNoteJson changeNoteJson,
+        LegacyChangeNoteRead legacyChangeNoteRead,
+        NoteDbMetrics metrics,
+        Provider<ReviewDb> db,
+        Provider<ChangeRebuilder> rebuilder,
+        Provider<ChangeNotesCache> cache) {
+      this.repoManager = repoManager;
+      this.migration = migration;
+      this.allUsers = allUsers;
+      this.legacyChangeNoteRead = legacyChangeNoteRead;
+      this.changeNoteJson = changeNoteJson;
+      this.metrics = metrics;
+      this.db = db;
+      this.rebuilder = rebuilder;
+      this.cache = cache;
+    }
+  }
+
+  @AutoValue
+  public abstract static class LoadHandle implements AutoCloseable {
+    public static LoadHandle create(ChangeNotesRevWalk walk, ObjectId id) {
+      if (ObjectId.zeroId().equals(id)) {
+        id = null;
+      } else if (id != null) {
+        id = id.copy();
+      }
+      return new AutoValue_AbstractChangeNotes_LoadHandle(requireNonNull(walk), id);
+    }
+
+    public static LoadHandle missing() {
+      return new AutoValue_AbstractChangeNotes_LoadHandle(null, null);
+    }
+
+    @Nullable
+    public abstract ChangeNotesRevWalk walk();
+
+    @Nullable
+    public abstract ObjectId id();
+
+    @Override
+    public void close() {
+      if (walk() != null) {
+        walk().close();
+      }
+    }
+  }
+
+  protected final Args args;
+  protected final PrimaryStorage primaryStorage;
+  protected final boolean autoRebuild;
+  private final Change.Id changeId;
+
+  private ObjectId revision;
+  private boolean loaded;
+
+  AbstractChangeNotes(
+      Args args, Change.Id changeId, @Nullable PrimaryStorage primaryStorage, boolean autoRebuild) {
+    this.args = requireNonNull(args);
+    this.changeId = requireNonNull(changeId);
+    this.primaryStorage = primaryStorage;
+    this.autoRebuild =
+        primaryStorage == PrimaryStorage.REVIEW_DB
+            && !args.migration.disableChangeReviewDb()
+            && autoRebuild;
+  }
+
+  public Change.Id getChangeId() {
+    return changeId;
+  }
+
+  /** @return revision of the metadata that was loaded. */
+  public ObjectId getRevision() {
+    return revision;
+  }
+
+  public T load() throws OrmException {
+    if (loaded) {
+      return self();
+    }
+
+    boolean read = args.migration.readChanges();
+    if (!read && primaryStorage == PrimaryStorage.NOTE_DB) {
+      throw new OrmException("NoteDb is required to read change " + changeId);
+    }
+    boolean readOrWrite = read || args.migration.rawWriteChangesSetting();
+    if (!readOrWrite) {
+      // Don't even open the repo if we neither write to nor read from NoteDb. It's possible that
+      // there is some garbage in the noteDbState field and/or the repo, but at this point NoteDb is
+      // completely off so it's none of our business.
+      loadDefaults();
+      return self();
+    }
+    if (args.migration.failOnLoadForTest()) {
+      throw new OrmException("Reading from NoteDb is disabled");
+    }
+    try (Timer1.Context timer = args.metrics.readLatency.start(CHANGES);
+        Repository repo = args.repoManager.openRepository(getProjectName());
+        // Call openHandle even if reading is disabled, to trigger
+        // auto-rebuilding before this object may get passed to a ChangeUpdate.
+        LoadHandle handle = openHandle(repo)) {
+      if (read) {
+        revision = handle.id();
+        onLoad(handle);
+      } else {
+        loadDefaults();
+      }
+      loaded = true;
+    } catch (ConfigInvalidException | IOException e) {
+      throw new OrmException(e);
+    }
+    return self();
+  }
+
+  protected ObjectId readRef(Repository repo) throws IOException {
+    Ref ref = repo.getRefDatabase().exactRef(getRefName());
+    return ref != null ? ref.getObjectId() : null;
+  }
+
+  /**
+   * Open a handle for reading this entity from a repository.
+   *
+   * <p>Implementations may override this method to provide auto-rebuilding behavior.
+   *
+   * @param repo open repository.
+   * @return handle for reading the entity.
+   * @throws NoSuchChangeException change does not exist.
+   * @throws IOException a repo-level error occurred.
+   */
+  protected LoadHandle openHandle(Repository repo) throws NoSuchChangeException, IOException {
+    return openHandle(repo, readRef(repo));
+  }
+
+  protected LoadHandle openHandle(Repository repo, ObjectId id) {
+    return LoadHandle.create(ChangeNotesCommit.newRevWalk(repo), id);
+  }
+
+  public T reload() throws NoSuchChangeException, OrmException {
+    loaded = false;
+    return load();
+  }
+
+  public ObjectId loadRevision() throws OrmException {
+    if (loaded) {
+      return getRevision();
+    } else if (!args.migration.readChanges()) {
+      return null;
+    }
+    try (Repository repo = args.repoManager.openRepository(getProjectName())) {
+      Ref ref = repo.getRefDatabase().exactRef(getRefName());
+      return ref != null ? ref.getObjectId() : null;
+    } catch (IOException e) {
+      throw new OrmException(e);
+    }
+  }
+
+  /** Load default values for any instance variables when NoteDb is disabled. */
+  protected abstract void loadDefaults();
+
+  /**
+   * @return the NameKey for the project where the notes should be stored, which is not necessarily
+   *     the same as the change's project.
+   */
+  public abstract Project.NameKey getProjectName();
+
+  /** @return name of the reference storing this configuration. */
+  protected abstract String getRefName();
+
+  /** Set up the metadata, parsing any state from the loaded revision. */
+  protected abstract void onLoad(LoadHandle handle)
+      throws NoSuchChangeException, IOException, ConfigInvalidException;
+
+  @SuppressWarnings("unchecked")
+  protected final T self() {
+    return (T) this;
+  }
+}
diff --git a/java/com/google/gerrit/server/notedb/AbstractChangeUpdate.java b/java/com/google/gerrit/server/notedb/AbstractChangeUpdate.java
new file mode 100644
index 0000000..e0cc771
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/AbstractChangeUpdate.java
@@ -0,0 +1,314 @@
+// Copyright (C) 2014 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.google.gerrit.server.notedb;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkState;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.InternalUser;
+import com.google.gwtorm.server.OrmException;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.Date;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+/** A single delta related to a specific patch-set of a change. */
+public abstract class AbstractChangeUpdate {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  protected final NotesMigration migration;
+  protected final ChangeNoteUtil noteUtil;
+  protected final Account.Id accountId;
+  protected final Account.Id realAccountId;
+  protected final PersonIdent authorIdent;
+  protected final Date when;
+  private final long readOnlySkewMs;
+
+  @Nullable private final ChangeNotes notes;
+  private final Change change;
+  protected final PersonIdent serverIdent;
+
+  protected PatchSet.Id psId;
+  private ObjectId result;
+  protected boolean rootOnly;
+
+  protected AbstractChangeUpdate(
+      Config cfg,
+      NotesMigration migration,
+      ChangeNotes notes,
+      CurrentUser user,
+      PersonIdent serverIdent,
+      ChangeNoteUtil noteUtil,
+      Date when) {
+    this.migration = migration;
+    this.noteUtil = noteUtil;
+    this.serverIdent = new PersonIdent(serverIdent, when);
+    this.notes = notes;
+    this.change = notes.getChange();
+    this.accountId = accountId(user);
+    Account.Id realAccountId = accountId(user.getRealUser());
+    this.realAccountId = realAccountId != null ? realAccountId : accountId;
+    this.authorIdent = ident(noteUtil, serverIdent, user, when);
+    this.when = when;
+    this.readOnlySkewMs = NoteDbChangeState.getReadOnlySkew(cfg);
+  }
+
+  protected AbstractChangeUpdate(
+      Config cfg,
+      NotesMigration migration,
+      ChangeNoteUtil noteUtil,
+      PersonIdent serverIdent,
+      @Nullable ChangeNotes notes,
+      @Nullable Change change,
+      Account.Id accountId,
+      Account.Id realAccountId,
+      PersonIdent authorIdent,
+      Date when) {
+    checkArgument(
+        (notes != null && change == null) || (notes == null && change != null),
+        "exactly one of notes or change required");
+    this.migration = migration;
+    this.noteUtil = noteUtil;
+    this.serverIdent = new PersonIdent(serverIdent, when);
+    this.notes = notes;
+    this.change = change != null ? change : notes.getChange();
+    this.accountId = accountId;
+    this.realAccountId = realAccountId;
+    this.authorIdent = authorIdent;
+    this.when = when;
+    this.readOnlySkewMs = NoteDbChangeState.getReadOnlySkew(cfg);
+  }
+
+  private static void checkUserType(CurrentUser user) {
+    checkArgument(
+        (user instanceof IdentifiedUser) || (user instanceof InternalUser),
+        "user must be IdentifiedUser or InternalUser: %s",
+        user);
+  }
+
+  private static Account.Id accountId(CurrentUser u) {
+    checkUserType(u);
+    return (u instanceof IdentifiedUser) ? u.getAccountId() : null;
+  }
+
+  private static PersonIdent ident(
+      ChangeNoteUtil noteUtil, PersonIdent serverIdent, CurrentUser u, Date when) {
+    checkUserType(u);
+    if (u instanceof IdentifiedUser) {
+      return noteUtil.newIdent(u.asIdentifiedUser().getAccount(), when, serverIdent);
+    } else if (u instanceof InternalUser) {
+      return serverIdent;
+    }
+    throw new IllegalStateException();
+  }
+
+  public Change.Id getId() {
+    return change.getId();
+  }
+
+  /**
+   * @return notes for the state of this change prior to this update. If this update is part of a
+   *     series managed by a {@link NoteDbUpdateManager}, then this reflects the state prior to the
+   *     first update in the series. A null return value can only happen when the change is being
+   *     rebuilt from NoteDb. A change that is in the process of being created will result in a
+   *     non-null return value from this method, but a null return value from {@link
+   *     ChangeNotes#getRevision()}.
+   */
+  @Nullable
+  public ChangeNotes getNotes() {
+    return notes;
+  }
+
+  public Change getChange() {
+    return change;
+  }
+
+  public Date getWhen() {
+    return when;
+  }
+
+  public PatchSet.Id getPatchSetId() {
+    return psId;
+  }
+
+  public void setPatchSetId(PatchSet.Id psId) {
+    checkArgument(psId == null || psId.getParentKey().equals(getId()));
+    this.psId = psId;
+  }
+
+  public Account.Id getAccountId() {
+    checkState(
+        accountId != null,
+        "author identity for %s is not from an IdentifiedUser: %s",
+        getClass().getSimpleName(),
+        authorIdent.toExternalString());
+    return accountId;
+  }
+
+  public Account.Id getNullableAccountId() {
+    return accountId;
+  }
+
+  protected PersonIdent newIdent(Account.Id authorId, Date when) {
+    return noteUtil.newIdent(authorId, when, serverIdent);
+  }
+
+  /** Whether no updates have been done. */
+  public abstract boolean isEmpty();
+
+  /** Wether this update can only be a root commit. */
+  public boolean isRootOnly() {
+    return rootOnly;
+  }
+
+  /**
+   * @return the NameKey for the project where the update will be stored, which is not necessarily
+   *     the same as the change's project.
+   */
+  protected abstract Project.NameKey getProjectName();
+
+  protected abstract String getRefName();
+
+  /**
+   * Apply this update to the given inserter.
+   *
+   * @param rw walk for reading back any objects needed for the update.
+   * @param ins inserter to write to; callers should not flush.
+   * @param curr the current tip of the branch prior to this update.
+   * @return commit ID produced by inserting this update's commit, or null if this update is a no-op
+   *     and should be skipped. The zero ID is a valid return value, and indicates the ref should be
+   *     deleted.
+   * @throws OrmException if a Gerrit-level error occurred.
+   * @throws IOException if a lower-level error occurred.
+   */
+  final ObjectId apply(RevWalk rw, ObjectInserter ins, ObjectId curr)
+      throws OrmException, IOException {
+    if (isEmpty()) {
+      return null;
+    }
+
+    // Allow this method to proceed even if migration.failChangeWrites() = true.
+    // This may be used by an auto-rebuilding step that the caller does not plan
+    // to actually store.
+
+    checkArgument(rw.getObjectReader().getCreatedFromInserter() == ins);
+    checkNotReadOnly();
+
+    logger.atFinest().log(
+        "%s for change %s of project %s in %s (NoteDb)",
+        getClass().getSimpleName(), getId(), getProjectName(), getRefName());
+
+    ObjectId z = ObjectId.zeroId();
+    CommitBuilder cb = applyImpl(rw, ins, curr);
+    if (cb == null) {
+      result = z;
+      return z; // Impl intends to delete the ref.
+    } else if (cb == NO_OP_UPDATE) {
+      return null; // Impl is a no-op.
+    }
+    cb.setAuthor(authorIdent);
+    cb.setCommitter(new PersonIdent(serverIdent, when));
+    if (!curr.equals(z)) {
+      cb.setParentId(curr);
+    } else {
+      cb.setParentIds(); // Ref is currently nonexistent, commit has no parents.
+    }
+    if (cb.getTreeId() == null) {
+      if (curr.equals(z)) {
+        cb.setTreeId(emptyTree(ins)); // No parent, assume empty tree.
+      } else {
+        RevCommit p = rw.parseCommit(curr);
+        cb.setTreeId(p.getTree()); // Copy tree from parent.
+      }
+    }
+    result = ins.insert(cb);
+    return result;
+  }
+
+  protected void checkNotReadOnly() throws OrmException {
+    ChangeNotes notes = getNotes();
+    if (notes == null) {
+      // Can only happen during ChangeRebuilder, which will never include a read-only lease.
+      return;
+    }
+    Timestamp until = notes.getReadOnlyUntil();
+    if (until != null && NoteDbChangeState.timeForReadOnlyCheck(readOnlySkewMs).before(until)) {
+      throw new OrmException("change " + notes.getChangeId() + " is read-only until " + until);
+    }
+  }
+
+  /**
+   * Create a commit containing the contents of this update.
+   *
+   * @param ins inserter to write to; callers should not flush.
+   * @return a new commit builder representing this commit, or null to indicate the meta ref should
+   *     be deleted as a result of this update. The parent, author, and committer fields in the
+   *     return value are always overwritten. The tree ID may be unset by this method, which
+   *     indicates to the caller that it should be copied from the parent commit. To indicate that
+   *     this update is a no-op (but this could not be determined by {@link #isEmpty()}), return the
+   *     sentinel {@link #NO_OP_UPDATE}.
+   * @throws OrmException if a Gerrit-level error occurred.
+   * @throws IOException if a lower-level error occurred.
+   */
+  protected abstract CommitBuilder applyImpl(RevWalk rw, ObjectInserter ins, ObjectId curr)
+      throws OrmException, IOException;
+
+  protected static final CommitBuilder NO_OP_UPDATE = new CommitBuilder();
+
+  ObjectId getResult() {
+    return result;
+  }
+
+  public boolean allowWriteToNewRef() {
+    return true;
+  }
+
+  private static ObjectId emptyTree(ObjectInserter ins) throws IOException {
+    return ins.insert(Constants.OBJ_TREE, new byte[] {});
+  }
+
+  protected void verifyComment(Comment c) {
+    checkArgument(c.revId != null, "RevId required for comment: %s", c);
+    checkArgument(
+        c.author.getId().equals(getAccountId()),
+        "The author for the following comment does not match the author of this %s (%s): %s",
+        getClass().getSimpleName(),
+        getAccountId(),
+        c);
+    checkArgument(
+        c.getRealAuthor().getId().equals(realAccountId),
+        "The real author for the following comment does not match the real"
+            + " author of this %s (%s): %s",
+        getClass().getSimpleName(),
+        realAccountId,
+        c);
+  }
+}
diff --git a/java/com/google/gerrit/server/notedb/ChangeBundle.java b/java/com/google/gerrit/server/notedb/ChangeBundle.java
new file mode 100644
index 0000000..058e5e5
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/ChangeBundle.java
@@ -0,0 +1,973 @@
+// 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.
+
+package com.google.gerrit.server.notedb;
+
+import static com.google.common.base.MoreObjects.firstNonNull;
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static com.google.common.collect.ImmutableSortedMap.toImmutableSortedMap;
+import static com.google.gerrit.reviewdb.server.ReviewDbUtil.checkColumns;
+import static com.google.gerrit.reviewdb.server.ReviewDbUtil.intKeyOrdering;
+import static com.google.gerrit.server.notedb.ChangeBundle.Source.NOTE_DB;
+import static com.google.gerrit.server.notedb.ChangeBundle.Source.REVIEW_DB;
+import static com.google.gerrit.server.util.time.TimeUtil.truncateToSecond;
+import static java.util.Comparator.comparing;
+import static java.util.Comparator.naturalOrder;
+import static java.util.Comparator.nullsFirst;
+import static java.util.Objects.requireNonNull;
+import static java.util.stream.Collectors.toList;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.base.CharMatcher;
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
+import com.google.common.base.Strings;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.ImmutableCollection;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSortedMap;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.LinkedListMultimap;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Ordering;
+import com.google.common.collect.Sets;
+import com.google.common.collect.Streams;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.PatchLineComment;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSet.Id;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.server.ChangeUtil;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.ReviewerSet;
+import com.google.gerrit.server.notedb.rebuild.ChangeRebuilderImpl;
+import com.google.gwtorm.client.Column;
+import com.google.gwtorm.server.OrmException;
+import java.lang.reflect.Field;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+
+/**
+ * A bundle of all entities rooted at a single {@link Change} entity.
+ *
+ * <p>See the {@link Change} Javadoc for a depiction of this tree. Bundles may be compared using
+ * {@link #differencesFrom(ChangeBundle)}, which normalizes out the minor implementation differences
+ * between ReviewDb and NoteDb.
+ */
+public class ChangeBundle {
+  public enum Source {
+    REVIEW_DB,
+    NOTE_DB;
+  }
+
+  public static ChangeBundle fromNotes(CommentsUtil commentsUtil, ChangeNotes notes)
+      throws OrmException {
+    return new ChangeBundle(
+        notes.getChange(),
+        notes.getChangeMessages(),
+        notes.getPatchSets().values(),
+        notes.getApprovals().values(),
+        Iterables.concat(
+            CommentsUtil.toPatchLineComments(
+                notes.getChangeId(),
+                PatchLineComment.Status.DRAFT,
+                commentsUtil.draftByChange(null, notes)),
+            CommentsUtil.toPatchLineComments(
+                notes.getChangeId(),
+                PatchLineComment.Status.PUBLISHED,
+                commentsUtil.publishedByChange(null, notes))),
+        notes.getReviewers(),
+        Source.NOTE_DB);
+  }
+
+  private static ImmutableSortedMap<ChangeMessage.Key, ChangeMessage> changeMessageMap(
+      Collection<ChangeMessage> in) {
+    return in.stream()
+        .collect(
+            toImmutableSortedMap(
+                comparing((ChangeMessage.Key k) -> k.getParentKey().get())
+                    .thenComparing(k -> k.get()),
+                cm -> cm.getKey(),
+                cm -> cm));
+  }
+
+  // Unlike the *Map comparators, which are intended to make key lists diffable,
+  // this comparator sorts first on timestamp, then on every other field.
+  private static final Comparator<ChangeMessage> CHANGE_MESSAGE_COMPARATOR =
+      comparing(ChangeMessage::getWrittenOn)
+          .thenComparing(m -> m.getKey().getParentKey().get())
+          .thenComparing(
+              m -> m.getPatchSetId() != null ? m.getPatchSetId().get() : null,
+              nullsFirst(naturalOrder()))
+          .thenComparing(ChangeMessage::getAuthor, intKeyOrdering())
+          .thenComparing(ChangeMessage::getMessage, nullsFirst(naturalOrder()));
+
+  private static ImmutableList<ChangeMessage> changeMessageList(Iterable<ChangeMessage> in) {
+    return Streams.stream(in).sorted(CHANGE_MESSAGE_COMPARATOR).collect(toImmutableList());
+  }
+
+  private static ImmutableSortedMap<Id, PatchSet> patchSetMap(Iterable<PatchSet> in) {
+    return Streams.stream(in)
+        .collect(toImmutableSortedMap(patchSetIdComparator(), PatchSet::getId, ps -> ps));
+  }
+
+  private static ImmutableSortedMap<PatchSetApproval.Key, PatchSetApproval> patchSetApprovalMap(
+      Iterable<PatchSetApproval> in) {
+    return Streams.stream(in)
+        .collect(
+            toImmutableSortedMap(
+                comparing(PatchSetApproval.Key::getParentKey, patchSetIdComparator())
+                    .thenComparing(PatchSetApproval.Key::getAccountId, intKeyOrdering())
+                    .thenComparing(PatchSetApproval.Key::getLabelId),
+                PatchSetApproval::getKey,
+                a -> a));
+  }
+
+  private static ImmutableSortedMap<PatchLineComment.Key, PatchLineComment> patchLineCommentMap(
+      Iterable<PatchLineComment> in) {
+    return Streams.stream(in)
+        .collect(
+            toImmutableSortedMap(
+                comparing(
+                        (PatchLineComment.Key k) -> k.getParentKey().getParentKey(),
+                        patchSetIdComparator())
+                    .thenComparing(PatchLineComment.Key::getParentKey)
+                    .thenComparing(PatchLineComment.Key::get),
+                PatchLineComment::getKey,
+                c -> c));
+  }
+
+  private static Comparator<PatchSet.Id> patchSetIdComparator() {
+    return comparing((PatchSet.Id id) -> id.getParentKey().get()).thenComparing(id -> id.get());
+  }
+
+  static {
+    // Initialization-time checks that the column set hasn't changed since the
+    // last time this file was updated.
+    checkColumns(Change.Id.class, 1);
+
+    checkColumns(
+        Change.class, 1, 2, 3, 4, 5, 7, 8, 10, 12, 13, 14, 17, 18, 19, 20, 21, 22, 23, 101);
+    checkColumns(ChangeMessage.Key.class, 1, 2);
+    checkColumns(ChangeMessage.class, 1, 2, 3, 4, 5, 6, 7);
+    checkColumns(PatchSet.Id.class, 1, 2);
+    checkColumns(PatchSet.class, 1, 2, 3, 4, 6, 8, 9);
+    checkColumns(PatchSetApproval.Key.class, 1, 2, 3);
+    checkColumns(PatchSetApproval.class, 1, 2, 3, 6, 7, 8);
+    checkColumns(PatchLineComment.Key.class, 1, 2);
+    checkColumns(PatchLineComment.class, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
+  }
+
+  private final Change change;
+  private final ImmutableList<ChangeMessage> changeMessages;
+  private final ImmutableSortedMap<PatchSet.Id, PatchSet> patchSets;
+  private final ImmutableMap<PatchSetApproval.Key, PatchSetApproval> patchSetApprovals;
+  private final ImmutableMap<PatchLineComment.Key, PatchLineComment> patchLineComments;
+  private final ReviewerSet reviewers;
+  private final Source source;
+
+  public ChangeBundle(
+      Change change,
+      Iterable<ChangeMessage> changeMessages,
+      Iterable<PatchSet> patchSets,
+      Iterable<PatchSetApproval> patchSetApprovals,
+      Iterable<PatchLineComment> patchLineComments,
+      ReviewerSet reviewers,
+      Source source) {
+    this.change = requireNonNull(change);
+    this.changeMessages = changeMessageList(changeMessages);
+    this.patchSets = ImmutableSortedMap.copyOfSorted(patchSetMap(patchSets));
+    this.patchSetApprovals = ImmutableMap.copyOf(patchSetApprovalMap(patchSetApprovals));
+    this.patchLineComments = ImmutableMap.copyOf(patchLineCommentMap(patchLineComments));
+    this.reviewers = requireNonNull(reviewers);
+    this.source = requireNonNull(source);
+
+    for (ChangeMessage m : this.changeMessages) {
+      checkArgument(m.getKey().getParentKey().equals(change.getId()));
+    }
+    for (PatchSet.Id id : this.patchSets.keySet()) {
+      checkArgument(id.getParentKey().equals(change.getId()));
+    }
+    for (PatchSetApproval.Key k : this.patchSetApprovals.keySet()) {
+      checkArgument(k.getParentKey().getParentKey().equals(change.getId()));
+    }
+    for (PatchLineComment.Key k : this.patchLineComments.keySet()) {
+      checkArgument(k.getParentKey().getParentKey().getParentKey().equals(change.getId()));
+    }
+  }
+
+  public Change getChange() {
+    return change;
+  }
+
+  public ImmutableCollection<ChangeMessage> getChangeMessages() {
+    return changeMessages;
+  }
+
+  public ImmutableCollection<PatchSet> getPatchSets() {
+    return patchSets.values();
+  }
+
+  public ImmutableCollection<PatchSetApproval> getPatchSetApprovals() {
+    return patchSetApprovals.values();
+  }
+
+  public ImmutableCollection<PatchLineComment> getPatchLineComments() {
+    return patchLineComments.values();
+  }
+
+  public ReviewerSet getReviewers() {
+    return reviewers;
+  }
+
+  public Source getSource() {
+    return source;
+  }
+
+  public ImmutableList<String> differencesFrom(ChangeBundle o) {
+    List<String> diffs = new ArrayList<>();
+    diffChanges(diffs, this, o);
+    diffChangeMessages(diffs, this, o);
+    diffPatchSets(diffs, this, o);
+    diffPatchSetApprovals(diffs, this, o);
+    diffReviewers(diffs, this, o);
+    diffPatchLineComments(diffs, this, o);
+    return ImmutableList.copyOf(diffs);
+  }
+
+  private Timestamp getFirstPatchSetTime() {
+    if (patchSets.isEmpty()) {
+      return change.getCreatedOn();
+    }
+    return patchSets.firstEntry().getValue().getCreatedOn();
+  }
+
+  private Timestamp getLatestTimestamp() {
+    Ordering<Timestamp> o = Ordering.natural().nullsFirst();
+    Timestamp ts = null;
+    for (ChangeMessage cm : filterChangeMessages()) {
+      ts = o.max(ts, cm.getWrittenOn());
+    }
+    for (PatchSet ps : getPatchSets()) {
+      ts = o.max(ts, ps.getCreatedOn());
+    }
+    for (PatchSetApproval psa : filterPatchSetApprovals().values()) {
+      ts = o.max(ts, psa.getGranted());
+    }
+    for (PatchLineComment plc : filterPatchLineComments().values()) {
+      // Ignore draft comments, as they do not show up in the change meta graph.
+      if (plc.getStatus() != PatchLineComment.Status.DRAFT) {
+        ts = o.max(ts, plc.getWrittenOn());
+      }
+    }
+    return firstNonNull(ts, change.getLastUpdatedOn());
+  }
+
+  private Map<PatchSetApproval.Key, PatchSetApproval> filterPatchSetApprovals() {
+    return limitToValidPatchSets(patchSetApprovals, PatchSetApproval.Key::getParentKey);
+  }
+
+  private Map<PatchLineComment.Key, PatchLineComment> filterPatchLineComments() {
+    return limitToValidPatchSets(patchLineComments, k -> k.getParentKey().getParentKey());
+  }
+
+  private <K, V> Map<K, V> limitToValidPatchSets(Map<K, V> in, Function<K, PatchSet.Id> func) {
+    return Maps.filterKeys(in, Predicates.compose(validPatchSetPredicate(), func));
+  }
+
+  private Predicate<PatchSet.Id> validPatchSetPredicate() {
+    return patchSets::containsKey;
+  }
+
+  private Collection<ChangeMessage> filterChangeMessages() {
+    final Predicate<PatchSet.Id> validPatchSet = validPatchSetPredicate();
+    return Collections2.filter(
+        changeMessages,
+        m -> {
+          PatchSet.Id psId = m.getPatchSetId();
+          if (psId == null) {
+            return true;
+          }
+          return validPatchSet.apply(psId);
+        });
+  }
+
+  private static void diffChanges(List<String> diffs, ChangeBundle bundleA, ChangeBundle bundleB) {
+    Change a = bundleA.change;
+    Change b = bundleB.change;
+    String desc = a.getId().equals(b.getId()) ? describe(a.getId()) : "Changes";
+
+    boolean excludeCreatedOn = false;
+    boolean excludeCurrentPatchSetId = false;
+    boolean excludeTopic = false;
+    Timestamp aCreated = a.getCreatedOn();
+    Timestamp bCreated = b.getCreatedOn();
+    Timestamp aUpdated = a.getLastUpdatedOn();
+    Timestamp bUpdated = b.getLastUpdatedOn();
+
+    boolean excludeSubject = false;
+    boolean excludeOrigSubj = false;
+    // Subject is not technically a nullable field, but we observed some null
+    // subjects in the wild on googlesource.com, so treat null as empty.
+    String aSubj = Strings.nullToEmpty(a.getSubject());
+    String bSubj = Strings.nullToEmpty(b.getSubject());
+
+    // Allow created timestamp in NoteDb to be any of:
+    //  - The created timestamp of the change.
+    //  - The timestamp of the first remaining patch set.
+    //  - The last updated timestamp, if it is less than the created timestamp.
+    //
+    // Ignore subject if the NoteDb subject starts with the ReviewDb subject.
+    // The NoteDb subject is read directly from the commit, whereas the ReviewDb
+    // subject historically may have been truncated to fit in a SQL varchar
+    // column.
+    //
+    // Ignore original subject on the ReviewDb side when comparing to NoteDb.
+    // This field may have any number of values:
+    //  - It may be null, if the change has had no new patch sets pushed since
+    //    migrating to schema 103.
+    //  - It may match the first patch set subject, if the change was created
+    //    after migrating to schema 103.
+    //  - It may match the subject of the first patch set that was pushed after
+    //    the migration to schema 103, even though that is neither the subject
+    //    of the first patch set nor the subject of the last patch set. (See
+    //    Change#setCurrentPatchSet as of 43b10f86 for this behavior.) This
+    //    subject of an intermediate patch set is not available to the
+    //    ChangeBundle; we would have to get the subject from the repo, which is
+    //    inconvenient at this point.
+    //
+    // Ignore original subject on the ReviewDb side if it equals the subject of
+    // the current patch set.
+    //
+    // For all of the above subject comparisons, first trim any leading spaces
+    // from the NoteDb strings. (We actually do represent the leading spaces
+    // faithfully during conversion, but JGit's FooterLine parser trims them
+    // when reading.)
+    //
+    // Ignore empty topic on the ReviewDb side if it is null on the NoteDb side.
+    //
+    // Ignore currentPatchSetId on NoteDb side if ReviewDb does not point to a
+    // valid patch set.
+    //
+    // Use max timestamp of all ReviewDb entities when comparing with NoteDb.
+    if (bundleA.source == REVIEW_DB && bundleB.source == NOTE_DB) {
+      boolean createdOnMatchesFirstPs =
+          !timestampsDiffer(bundleA, bundleA.getFirstPatchSetTime(), bundleB, bCreated);
+      boolean createdOnMatchesLastUpdatedOn =
+          !timestampsDiffer(bundleA, aUpdated, bundleB, bCreated);
+      boolean createdAfterUpdated = aCreated.compareTo(aUpdated) > 0;
+      excludeCreatedOn =
+          createdOnMatchesFirstPs || (createdAfterUpdated && createdOnMatchesLastUpdatedOn);
+
+      aSubj = cleanReviewDbSubject(aSubj);
+      bSubj = cleanNoteDbSubject(bSubj);
+      excludeCurrentPatchSetId = !bundleA.validPatchSetPredicate().apply(a.currentPatchSetId());
+      excludeSubject = bSubj.startsWith(aSubj) || excludeCurrentPatchSetId;
+      excludeOrigSubj = true;
+      String aTopic = trimOrNull(a.getTopic());
+      excludeTopic =
+          Objects.equals(aTopic, b.getTopic()) || ("".equals(aTopic) && b.getTopic() == null);
+      aUpdated = bundleA.getLatestTimestamp();
+    } else if (bundleA.source == NOTE_DB && bundleB.source == REVIEW_DB) {
+      boolean createdOnMatchesFirstPs =
+          !timestampsDiffer(bundleA, aCreated, bundleB, bundleB.getFirstPatchSetTime());
+      boolean createdOnMatchesLastUpdatedOn =
+          !timestampsDiffer(bundleA, aCreated, bundleB, bUpdated);
+      boolean createdAfterUpdated = bCreated.compareTo(bUpdated) > 0;
+      excludeCreatedOn =
+          createdOnMatchesFirstPs || (createdAfterUpdated && createdOnMatchesLastUpdatedOn);
+
+      aSubj = cleanNoteDbSubject(aSubj);
+      bSubj = cleanReviewDbSubject(bSubj);
+      excludeCurrentPatchSetId = !bundleB.validPatchSetPredicate().apply(b.currentPatchSetId());
+      excludeSubject = aSubj.startsWith(bSubj) || excludeCurrentPatchSetId;
+      excludeOrigSubj = true;
+      String bTopic = trimOrNull(b.getTopic());
+      excludeTopic =
+          Objects.equals(bTopic, a.getTopic()) || (a.getTopic() == null && "".equals(bTopic));
+      bUpdated = bundleB.getLatestTimestamp();
+    }
+
+    String subjectField = "subject";
+    String updatedField = "lastUpdatedOn";
+    List<String> exclude =
+        Lists.newArrayList(subjectField, updatedField, "noteDbState", "rowVersion");
+    if (excludeCreatedOn) {
+      exclude.add("createdOn");
+    }
+    if (excludeCurrentPatchSetId) {
+      exclude.add("currentPatchSetId");
+    }
+    if (excludeOrigSubj) {
+      exclude.add("originalSubject");
+    }
+    if (excludeTopic) {
+      exclude.add("topic");
+    }
+    diffColumnsExcluding(diffs, Change.class, desc, bundleA, a, bundleB, b, exclude);
+
+    // Allow last updated timestamps to either be exactly equal (within slop),
+    // or the NoteDb timestamp to be equal to the latest entity timestamp in the
+    // whole ReviewDb bundle (within slop).
+    if (timestampsDiffer(bundleA, a.getLastUpdatedOn(), bundleB, b.getLastUpdatedOn())) {
+      diffTimestamps(
+          diffs, desc, bundleA, aUpdated, bundleB, bUpdated, "effective last updated time");
+    }
+    if (!excludeSubject) {
+      diffValues(diffs, desc, aSubj, bSubj, subjectField);
+    }
+  }
+
+  private static String trimOrNull(String s) {
+    return s != null ? CharMatcher.whitespace().trimFrom(s) : null;
+  }
+
+  private static String cleanReviewDbSubject(String s) {
+    s = CharMatcher.is(' ').trimLeadingFrom(s);
+
+    // An old JGit bug failed to extract subjects from commits with "\r\n"
+    // terminators: https://bugs.eclipse.org/bugs/show_bug.cgi?id=400707
+    // Changes created with this bug may have "\r\n" converted to "\r " and the
+    // entire commit in the subject. The version of JGit used to read NoteDb
+    // changes parses these subjects correctly, so we need to clean up old
+    // ReviewDb subjects before comparing.
+    int rn = s.indexOf("\r \r ");
+    if (rn >= 0) {
+      s = s.substring(0, rn);
+    }
+    return NoteDbUtil.sanitizeFooter(s);
+  }
+
+  private static String cleanNoteDbSubject(String s) {
+    return NoteDbUtil.sanitizeFooter(s);
+  }
+
+  /**
+   * Set of fields that must always exactly match between ReviewDb and NoteDb.
+   *
+   * <p>Used to limit the worst-case quadratic search when pairing off matching messages below.
+   */
+  @AutoValue
+  abstract static class ChangeMessageCandidate {
+    static ChangeMessageCandidate create(ChangeMessage cm) {
+      return new AutoValue_ChangeBundle_ChangeMessageCandidate(
+          cm.getAuthor(), cm.getMessage(), cm.getTag());
+    }
+
+    @Nullable
+    abstract Account.Id author();
+
+    @Nullable
+    abstract String message();
+
+    @Nullable
+    abstract String tag();
+
+    // Exclude:
+    //  - patch set, which may be null on ReviewDb side but not NoteDb
+    //  - UUID, which is always different between ReviewDb and NoteDb
+    //  - writtenOn, which is fuzzy
+  }
+
+  private static void diffChangeMessages(
+      List<String> diffs, ChangeBundle bundleA, ChangeBundle bundleB) {
+    if (bundleA.source == REVIEW_DB && bundleB.source == REVIEW_DB) {
+      // Both came from ReviewDb: check all fields exactly.
+      Map<ChangeMessage.Key, ChangeMessage> as = changeMessageMap(bundleA.filterChangeMessages());
+      Map<ChangeMessage.Key, ChangeMessage> bs = changeMessageMap(bundleB.filterChangeMessages());
+
+      for (ChangeMessage.Key k : diffKeySets(diffs, as, bs)) {
+        ChangeMessage a = as.get(k);
+        ChangeMessage b = bs.get(k);
+        String desc = describe(k);
+        diffColumns(diffs, ChangeMessage.class, desc, bundleA, a, bundleB, b);
+      }
+      return;
+    }
+    Change.Id id = bundleA.getChange().getId();
+    checkArgument(id.equals(bundleB.getChange().getId()));
+
+    // Try to pair up matching ChangeMessages from each side, and succeed only
+    // if both collections are empty at the end. Quadratic in the worst case,
+    // but easy to reason about.
+    List<ChangeMessage> as = new LinkedList<>(bundleA.filterChangeMessages());
+
+    ListMultimap<ChangeMessageCandidate, ChangeMessage> bs = LinkedListMultimap.create();
+    for (ChangeMessage b : bundleB.filterChangeMessages()) {
+      bs.put(ChangeMessageCandidate.create(b), b);
+    }
+
+    Iterator<ChangeMessage> ait = as.iterator();
+    A:
+    while (ait.hasNext()) {
+      ChangeMessage a = ait.next();
+      Iterator<ChangeMessage> bit = bs.get(ChangeMessageCandidate.create(a)).iterator();
+      while (bit.hasNext()) {
+        ChangeMessage b = bit.next();
+        if (changeMessagesMatch(bundleA, a, bundleB, b)) {
+          ait.remove();
+          bit.remove();
+          continue A;
+        }
+      }
+    }
+
+    if (as.isEmpty() && bs.isEmpty()) {
+      return;
+    }
+    StringBuilder sb =
+        new StringBuilder("ChangeMessages differ for Change.Id ").append(id).append('\n');
+    if (!as.isEmpty()) {
+      sb.append("Only in A:");
+      for (ChangeMessage cm : as) {
+        sb.append("\n  ").append(cm);
+      }
+      if (!bs.isEmpty()) {
+        sb.append('\n');
+      }
+    }
+    if (!bs.isEmpty()) {
+      sb.append("Only in B:");
+      bs.values().stream()
+          .sorted(CHANGE_MESSAGE_COMPARATOR)
+          .forEach(cm -> sb.append("\n  ").append(cm));
+    }
+    diffs.add(sb.toString());
+  }
+
+  private static boolean changeMessagesMatch(
+      ChangeBundle bundleA, ChangeMessage a, ChangeBundle bundleB, ChangeMessage b) {
+    List<String> tempDiffs = new ArrayList<>();
+    String temp = "temp";
+
+    // ReviewDb allows timestamps before patch set was created, but NoteDb
+    // truncates this to the patch set creation timestamp.
+    Timestamp ta = a.getWrittenOn();
+    Timestamp tb = b.getWrittenOn();
+    PatchSet psa = bundleA.patchSets.get(a.getPatchSetId());
+    PatchSet psb = bundleB.patchSets.get(b.getPatchSetId());
+    boolean excludePatchSet = false;
+    boolean excludeWrittenOn = false;
+    if (bundleA.source == REVIEW_DB && bundleB.source == NOTE_DB) {
+      excludePatchSet = a.getPatchSetId() == null;
+      excludeWrittenOn =
+          psa != null
+              && psb != null
+              && ta.before(psa.getCreatedOn())
+              && tb.equals(psb.getCreatedOn());
+    } else if (bundleA.source == NOTE_DB && bundleB.source == REVIEW_DB) {
+      excludePatchSet = b.getPatchSetId() == null;
+      excludeWrittenOn =
+          psa != null
+              && psb != null
+              && tb.before(psb.getCreatedOn())
+              && ta.equals(psa.getCreatedOn());
+    }
+
+    List<String> exclude = Lists.newArrayList("key");
+    if (excludePatchSet) {
+      exclude.add("patchset");
+    }
+    if (excludeWrittenOn) {
+      exclude.add("writtenOn");
+    }
+
+    diffColumnsExcluding(tempDiffs, ChangeMessage.class, temp, bundleA, a, bundleB, b, exclude);
+    return tempDiffs.isEmpty();
+  }
+
+  private static void diffPatchSets(
+      List<String> diffs, ChangeBundle bundleA, ChangeBundle bundleB) {
+    Map<PatchSet.Id, PatchSet> as = bundleA.patchSets;
+    Map<PatchSet.Id, PatchSet> bs = bundleB.patchSets;
+    Optional<PatchSet.Id> minA = as.keySet().stream().min(intKeyOrdering());
+    Optional<PatchSet.Id> minB = bs.keySet().stream().min(intKeyOrdering());
+    Set<PatchSet.Id> ids = diffKeySets(diffs, as, bs);
+
+    // Old versions of Gerrit had a bug that created patch sets during
+    // rebase or submission with a createdOn timestamp earlier than the patch
+    // set it was replacing. (In the cases I examined, it was equal to createdOn
+    // for the change, but we're not counting on this exact behavior.)
+    //
+    // ChangeRebuilder ensures patch set events come out in order, but it's hard
+    // to predict what the resulting timestamps would look like. So, completely
+    // ignore the createdOn timestamps if both:
+    //   * ReviewDb timestamps are non-monotonic.
+    //   * NoteDb timestamps are monotonic.
+    //
+    // Allow the timestamp of the first patch set to match the creation time of
+    // the change.
+    boolean excludeAllCreatedOn = false;
+    if (bundleA.source == REVIEW_DB && bundleB.source == NOTE_DB) {
+      excludeAllCreatedOn = !createdOnIsMonotonic(as, ids) && createdOnIsMonotonic(bs, ids);
+    } else if (bundleA.source == NOTE_DB && bundleB.source == REVIEW_DB) {
+      excludeAllCreatedOn = createdOnIsMonotonic(as, ids) && !createdOnIsMonotonic(bs, ids);
+    }
+
+    for (PatchSet.Id id : ids) {
+      PatchSet a = as.get(id);
+      PatchSet b = bs.get(id);
+      String desc = describe(id);
+      String pushCertField = "pushCertificate";
+
+      boolean excludeCreatedOn = excludeAllCreatedOn;
+      boolean excludeDesc = false;
+      if (bundleA.source == REVIEW_DB && bundleB.source == NOTE_DB) {
+        excludeDesc = Objects.equals(trimOrNull(a.getDescription()), b.getDescription());
+        excludeCreatedOn |=
+            Optional.of(id).equals(minB) && b.getCreatedOn().equals(bundleB.change.getCreatedOn());
+      } else if (bundleA.source == NOTE_DB && bundleB.source == REVIEW_DB) {
+        excludeDesc = Objects.equals(a.getDescription(), trimOrNull(b.getDescription()));
+        excludeCreatedOn |=
+            Optional.of(id).equals(minA) && a.getCreatedOn().equals(bundleA.change.getCreatedOn());
+      }
+
+      List<String> exclude = Lists.newArrayList(pushCertField);
+      if (excludeCreatedOn) {
+        exclude.add("createdOn");
+      }
+      if (excludeDesc) {
+        exclude.add("description");
+      }
+
+      diffColumnsExcluding(diffs, PatchSet.class, desc, bundleA, a, bundleB, b, exclude);
+      diffValues(diffs, desc, trimPushCert(a), trimPushCert(b), pushCertField);
+    }
+  }
+
+  private static String trimPushCert(PatchSet ps) {
+    if (ps.getPushCertificate() == null) {
+      return null;
+    }
+    return CharMatcher.is('\n').trimTrailingFrom(ps.getPushCertificate());
+  }
+
+  private static boolean createdOnIsMonotonic(
+      Map<?, PatchSet> patchSets, Set<PatchSet.Id> limitToIds) {
+    List<PatchSet> orderedById =
+        patchSets.values().stream()
+            .filter(ps -> limitToIds.contains(ps.getId()))
+            .sorted(ChangeUtil.PS_ID_ORDER)
+            .collect(toList());
+    return Ordering.natural().onResultOf(PatchSet::getCreatedOn).isOrdered(orderedById);
+  }
+
+  private static void diffPatchSetApprovals(
+      List<String> diffs, ChangeBundle bundleA, ChangeBundle bundleB) {
+    Map<PatchSetApproval.Key, PatchSetApproval> as = bundleA.filterPatchSetApprovals();
+    Map<PatchSetApproval.Key, PatchSetApproval> bs = bundleB.filterPatchSetApprovals();
+    for (PatchSetApproval.Key k : diffKeySets(diffs, as, bs)) {
+      PatchSetApproval a = as.get(k);
+      PatchSetApproval b = bs.get(k);
+      String desc = describe(k);
+
+      // ReviewDb allows timestamps before patch set was created, but NoteDb
+      // truncates this to the patch set creation timestamp.
+      //
+      // ChangeRebuilder ensures all post-submit approvals happen after the
+      // actual submit, so the timestamps may not line up. This shouldn't really
+      // happen, because postSubmit shouldn't be set in ReviewDb until after the
+      // change is submitted in ReviewDb, but you never know.
+      //
+      // Due to a quirk of PostReview, post-submit 0 votes might not have the
+      // postSubmit bit set in ReviewDb. As these are only used for tombstone
+      // purposes, ignore the postSubmit bit in NoteDb in this case.
+      Timestamp ta = a.getGranted();
+      Timestamp tb = b.getGranted();
+      PatchSet psa = requireNonNull(bundleA.patchSets.get(a.getPatchSetId()));
+      PatchSet psb = requireNonNull(bundleB.patchSets.get(b.getPatchSetId()));
+      boolean excludeGranted = false;
+      boolean excludePostSubmit = false;
+      List<String> exclude = new ArrayList<>(1);
+      if (bundleA.source == REVIEW_DB && bundleB.source == NOTE_DB) {
+        excludeGranted =
+            (ta.before(psa.getCreatedOn()) && tb.equals(psb.getCreatedOn()))
+                || ta.compareTo(tb) < 0;
+        excludePostSubmit = a.getValue() == 0 && b.isPostSubmit();
+      } else if (bundleA.source == NOTE_DB && bundleB.source == REVIEW_DB) {
+        excludeGranted =
+            (tb.before(psb.getCreatedOn()) && ta.equals(psa.getCreatedOn()))
+                || (tb.compareTo(ta) < 0);
+        excludePostSubmit = b.getValue() == 0 && a.isPostSubmit();
+      }
+
+      // Legacy submit approvals may or may not have tags associated with them,
+      // depending on whether ChangeRebuilder happened to group them with the
+      // status change.
+      boolean excludeTag =
+          bundleA.source != bundleB.source && a.isLegacySubmit() && b.isLegacySubmit();
+
+      if (excludeGranted) {
+        exclude.add("granted");
+      }
+      if (excludePostSubmit) {
+        exclude.add("postSubmit");
+      }
+      if (excludeTag) {
+        exclude.add("tag");
+      }
+
+      diffColumnsExcluding(diffs, PatchSetApproval.class, desc, bundleA, a, bundleB, b, exclude);
+    }
+  }
+
+  private static void diffReviewers(
+      List<String> diffs, ChangeBundle bundleA, ChangeBundle bundleB) {
+    diffSets(diffs, bundleA.reviewers.all(), bundleB.reviewers.all(), "reviewer");
+  }
+
+  private static void diffPatchLineComments(
+      List<String> diffs, ChangeBundle bundleA, ChangeBundle bundleB) {
+    Map<PatchLineComment.Key, PatchLineComment> as = bundleA.filterPatchLineComments();
+    Map<PatchLineComment.Key, PatchLineComment> bs = bundleB.filterPatchLineComments();
+    for (PatchLineComment.Key k : diffKeySets(diffs, as, bs)) {
+      PatchLineComment a = as.get(k);
+      PatchLineComment b = bs.get(k);
+      String desc = describe(k);
+      diffColumns(diffs, PatchLineComment.class, desc, bundleA, a, bundleB, b);
+    }
+  }
+
+  private static <T> Set<T> diffKeySets(List<String> diffs, Map<T, ?> a, Map<T, ?> b) {
+    if (a.isEmpty() && b.isEmpty()) {
+      return a.keySet();
+    }
+    String clazz = keyClass((!a.isEmpty() ? a.keySet() : b.keySet()).iterator().next());
+    return diffSets(diffs, a.keySet(), b.keySet(), clazz);
+  }
+
+  private static <T> Set<T> diffSets(List<String> diffs, Set<T> as, Set<T> bs, String desc) {
+    if (as.isEmpty() && bs.isEmpty()) {
+      return as;
+    }
+
+    Set<T> aNotB = Sets.difference(as, bs);
+    Set<T> bNotA = Sets.difference(bs, as);
+    if (aNotB.isEmpty() && bNotA.isEmpty()) {
+      return as;
+    }
+    diffs.add(desc + " sets differ: " + aNotB + " only in A; " + bNotA + " only in B");
+    return Sets.intersection(as, bs);
+  }
+
+  private static <T> void diffColumns(
+      List<String> diffs,
+      Class<T> clazz,
+      String desc,
+      ChangeBundle bundleA,
+      T a,
+      ChangeBundle bundleB,
+      T b) {
+    diffColumnsExcluding(diffs, clazz, desc, bundleA, a, bundleB, b);
+  }
+
+  private static <T> void diffColumnsExcluding(
+      List<String> diffs,
+      Class<T> clazz,
+      String desc,
+      ChangeBundle bundleA,
+      T a,
+      ChangeBundle bundleB,
+      T b,
+      String... exclude) {
+    diffColumnsExcluding(diffs, clazz, desc, bundleA, a, bundleB, b, Arrays.asList(exclude));
+  }
+
+  private static <T> void diffColumnsExcluding(
+      List<String> diffs,
+      Class<T> clazz,
+      String desc,
+      ChangeBundle bundleA,
+      T a,
+      ChangeBundle bundleB,
+      T b,
+      Iterable<String> exclude) {
+    Set<String> toExclude = Sets.newLinkedHashSet(exclude);
+    for (Field f : clazz.getDeclaredFields()) {
+      Column col = f.getAnnotation(Column.class);
+      if (col == null) {
+        continue;
+      } else if (toExclude.remove(f.getName())) {
+        continue;
+      }
+      f.setAccessible(true);
+      try {
+        if (Timestamp.class.isAssignableFrom(f.getType())) {
+          diffTimestamps(diffs, desc, bundleA, a, bundleB, b, f.getName());
+        } else {
+          diffValues(diffs, desc, f.get(a), f.get(b), f.getName());
+        }
+      } catch (IllegalAccessException e) {
+        throw new IllegalArgumentException(e);
+      }
+    }
+    checkArgument(
+        toExclude.isEmpty(),
+        "requested columns to exclude not present in %s: %s",
+        clazz.getSimpleName(),
+        toExclude);
+  }
+
+  private static void diffTimestamps(
+      List<String> diffs,
+      String desc,
+      ChangeBundle bundleA,
+      Object a,
+      ChangeBundle bundleB,
+      Object b,
+      String field) {
+    checkArgument(a.getClass() == b.getClass());
+    Class<?> clazz = a.getClass();
+
+    Timestamp ta;
+    Timestamp tb;
+    try {
+      Field f = clazz.getDeclaredField(field);
+      checkArgument(f.getAnnotation(Column.class) != null);
+      f.setAccessible(true);
+      ta = (Timestamp) f.get(a);
+      tb = (Timestamp) f.get(b);
+    } catch (IllegalAccessException | NoSuchFieldException | SecurityException e) {
+      throw new IllegalArgumentException(e);
+    }
+    diffTimestamps(diffs, desc, bundleA, ta, bundleB, tb, field);
+  }
+
+  private static void diffTimestamps(
+      List<String> diffs,
+      String desc,
+      ChangeBundle bundleA,
+      Timestamp ta,
+      ChangeBundle bundleB,
+      Timestamp tb,
+      String fieldDesc) {
+    if (bundleA.source == bundleB.source || ta == null || tb == null) {
+      diffValues(diffs, desc, ta, tb, fieldDesc);
+    } else if (bundleA.source == NOTE_DB) {
+      diffTimestamps(diffs, desc, bundleA.getChange(), ta, bundleB.getChange(), tb, fieldDesc);
+    } else {
+      diffTimestamps(diffs, desc, bundleB.getChange(), tb, bundleA.getChange(), ta, fieldDesc);
+    }
+  }
+
+  private static boolean timestampsDiffer(
+      ChangeBundle bundleA, Timestamp ta, ChangeBundle bundleB, Timestamp tb) {
+    List<String> tempDiffs = new ArrayList<>(1);
+    diffTimestamps(tempDiffs, "temp", bundleA, ta, bundleB, tb, "temp");
+    return !tempDiffs.isEmpty();
+  }
+
+  private static void diffTimestamps(
+      List<String> diffs,
+      String desc,
+      Change changeFromNoteDb,
+      Timestamp tsFromNoteDb,
+      Change changeFromReviewDb,
+      Timestamp tsFromReviewDb,
+      String field) {
+    // Because ChangeRebuilder may batch events together that are several
+    // seconds apart, the timestamp in NoteDb may actually be several seconds
+    // *earlier* than the timestamp in ReviewDb that it was converted from.
+    checkArgument(
+        tsFromNoteDb.equals(truncateToSecond(tsFromNoteDb)),
+        "%s from NoteDb has non-rounded %s timestamp: %s",
+        desc,
+        field,
+        tsFromNoteDb);
+
+    if (tsFromReviewDb.before(changeFromReviewDb.getCreatedOn())
+        && tsFromNoteDb.equals(changeFromNoteDb.getCreatedOn())) {
+      // Timestamp predates change creation. These are truncated to change
+      // creation time during NoteDb conversion, so allow this if the timestamp
+      // in NoteDb matches the createdOn time in NoteDb.
+      return;
+    }
+
+    long delta = tsFromReviewDb.getTime() - tsFromNoteDb.getTime();
+    long max = ChangeRebuilderImpl.MAX_WINDOW_MS;
+    if (delta < 0 || delta > max) {
+      diffs.add(
+          field
+              + " differs for "
+              + desc
+              + " in NoteDb vs. ReviewDb:"
+              + " {"
+              + tsFromNoteDb
+              + "} != {"
+              + tsFromReviewDb
+              + "}");
+    }
+  }
+
+  private static void diffValues(
+      List<String> diffs, String desc, Object va, Object vb, String name) {
+    if (!Objects.equals(va, vb)) {
+      diffs.add(name + " differs for " + desc + ": {" + va + "} != {" + vb + "}");
+    }
+  }
+
+  private static String describe(Object key) {
+    return keyClass(key) + " " + key;
+  }
+
+  private static String keyClass(Object obj) {
+    Class<?> clazz = obj.getClass();
+    String name = clazz.getSimpleName();
+    checkArgument(name.endsWith("Key") || name.endsWith("Id"), "not an Id/Key class: %s", name);
+    if (name.equals("Key") || name.equals("Id")) {
+      return clazz.getEnclosingClass().getSimpleName() + "." + name;
+    } else if (name.startsWith("AutoValue_")) {
+      return name.substring(name.lastIndexOf('_') + 1);
+    }
+    return name;
+  }
+
+  @Override
+  public String toString() {
+    return getClass().getSimpleName()
+        + "{id="
+        + change.getId()
+        + ", ChangeMessage["
+        + changeMessages.size()
+        + "]"
+        + ", PatchSet["
+        + patchSets.size()
+        + "]"
+        + ", PatchSetApproval["
+        + patchSetApprovals.size()
+        + "]"
+        + ", PatchLineComment["
+        + patchLineComments.size()
+        + "]"
+        + "}";
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeBundleReader.java b/java/com/google/gerrit/server/notedb/ChangeBundleReader.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeBundleReader.java
rename to java/com/google/gerrit/server/notedb/ChangeBundleReader.java
diff --git a/java/com/google/gerrit/server/notedb/ChangeDraftUpdate.java b/java/com/google/gerrit/server/notedb/ChangeDraftUpdate.java
new file mode 100644
index 0000000..169fd2e
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/ChangeDraftUpdate.java
@@ -0,0 +1,273 @@
+// Copyright (C) 2014 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.google.gerrit.server.notedb;
+
+import static com.google.common.base.MoreObjects.firstNonNull;
+import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.Sets;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.PatchLineComment;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.client.RevId;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.assistedinject.Assisted;
+import com.google.inject.assistedinject.AssistedInject;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.notes.NoteMap;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+/**
+ * A single delta to apply atomically to a change.
+ *
+ * <p>This delta contains only draft comments on a single patch set of a change by a single author.
+ * This delta will become a single commit in the All-Users repository.
+ *
+ * <p>This class is not thread safe.
+ */
+public class ChangeDraftUpdate extends AbstractChangeUpdate {
+  public interface Factory {
+    ChangeDraftUpdate create(
+        ChangeNotes notes,
+        @Assisted("effective") Account.Id accountId,
+        @Assisted("real") Account.Id realAccountId,
+        PersonIdent authorIdent,
+        Date when);
+
+    ChangeDraftUpdate create(
+        Change change,
+        @Assisted("effective") Account.Id accountId,
+        @Assisted("real") Account.Id realAccountId,
+        PersonIdent authorIdent,
+        Date when);
+  }
+
+  @AutoValue
+  abstract static class Key {
+    abstract String revId();
+
+    abstract Comment.Key key();
+  }
+
+  private static Key key(Comment c) {
+    return new AutoValue_ChangeDraftUpdate_Key(c.revId, c.key);
+  }
+
+  private final AllUsersName draftsProject;
+
+  private List<Comment> put = new ArrayList<>();
+  private Set<Key> delete = new HashSet<>();
+
+  @AssistedInject
+  private ChangeDraftUpdate(
+      @GerritServerConfig Config cfg,
+      @GerritPersonIdent PersonIdent serverIdent,
+      NotesMigration migration,
+      AllUsersName allUsers,
+      ChangeNoteUtil noteUtil,
+      @Assisted ChangeNotes notes,
+      @Assisted("effective") Account.Id accountId,
+      @Assisted("real") Account.Id realAccountId,
+      @Assisted PersonIdent authorIdent,
+      @Assisted Date when) {
+    super(
+        cfg,
+        migration,
+        noteUtil,
+        serverIdent,
+        notes,
+        null,
+        accountId,
+        realAccountId,
+        authorIdent,
+        when);
+    this.draftsProject = allUsers;
+  }
+
+  @AssistedInject
+  private ChangeDraftUpdate(
+      @GerritServerConfig Config cfg,
+      @GerritPersonIdent PersonIdent serverIdent,
+      NotesMigration migration,
+      AllUsersName allUsers,
+      ChangeNoteUtil noteUtil,
+      @Assisted Change change,
+      @Assisted("effective") Account.Id accountId,
+      @Assisted("real") Account.Id realAccountId,
+      @Assisted PersonIdent authorIdent,
+      @Assisted Date when) {
+    super(
+        cfg,
+        migration,
+        noteUtil,
+        serverIdent,
+        null,
+        change,
+        accountId,
+        realAccountId,
+        authorIdent,
+        when);
+    this.draftsProject = allUsers;
+  }
+
+  public void putComment(Comment c) {
+    verifyComment(c);
+    put.add(c);
+  }
+
+  public void deleteComment(Comment c) {
+    verifyComment(c);
+    delete.add(key(c));
+  }
+
+  public void deleteComment(String revId, Comment.Key key) {
+    delete.add(new AutoValue_ChangeDraftUpdate_Key(revId, key));
+  }
+
+  private CommitBuilder storeCommentsInNotes(
+      RevWalk rw, ObjectInserter ins, ObjectId curr, CommitBuilder cb)
+      throws ConfigInvalidException, OrmException, IOException {
+    RevisionNoteMap<ChangeRevisionNote> rnm = getRevisionNoteMap(rw, curr);
+    Set<RevId> updatedRevs = Sets.newHashSetWithExpectedSize(rnm.revisionNotes.size());
+    RevisionNoteBuilder.Cache cache = new RevisionNoteBuilder.Cache(rnm);
+
+    for (Comment c : put) {
+      if (!delete.contains(key(c))) {
+        cache.get(new RevId(c.revId)).putComment(c);
+      }
+    }
+    for (Key k : delete) {
+      cache.get(new RevId(k.revId())).deleteComment(k.key());
+    }
+
+    Map<RevId, RevisionNoteBuilder> builders = cache.getBuilders();
+    boolean touchedAnyRevs = false;
+    boolean hasComments = false;
+    for (Map.Entry<RevId, RevisionNoteBuilder> e : builders.entrySet()) {
+      updatedRevs.add(e.getKey());
+      ObjectId id = ObjectId.fromString(e.getKey().get());
+      byte[] data = e.getValue().build(noteUtil.getChangeNoteJson());
+      if (!Arrays.equals(data, e.getValue().baseRaw)) {
+        touchedAnyRevs = true;
+      }
+      if (data.length == 0) {
+        rnm.noteMap.remove(id);
+      } else {
+        hasComments = true;
+        ObjectId dataBlob = ins.insert(OBJ_BLOB, data);
+        rnm.noteMap.set(id, dataBlob);
+      }
+    }
+
+    // If we didn't touch any notes, tell the caller this was a no-op update. We
+    // couldn't have done this in isEmpty() below because we hadn't read the old
+    // data yet.
+    if (!touchedAnyRevs) {
+      return NO_OP_UPDATE;
+    }
+
+    // If we touched every revision and there are no comments left, tell the
+    // caller to delete the entire ref.
+    boolean touchedAllRevs = updatedRevs.equals(rnm.revisionNotes.keySet());
+    if (touchedAllRevs && !hasComments) {
+      return null;
+    }
+
+    cb.setTreeId(rnm.noteMap.writeTree(ins));
+    return cb;
+  }
+
+  private RevisionNoteMap<ChangeRevisionNote> getRevisionNoteMap(RevWalk rw, ObjectId curr)
+      throws ConfigInvalidException, OrmException, IOException {
+    if (migration.readChanges()) {
+      // If reading from changes is enabled, then the old DraftCommentNotes
+      // already parsed the revision notes. We can reuse them as long as the ref
+      // hasn't advanced.
+      ChangeNotes changeNotes = getNotes();
+      if (changeNotes != null) {
+        DraftCommentNotes draftNotes = changeNotes.load().getDraftCommentNotes();
+        if (draftNotes != null) {
+          ObjectId idFromNotes = firstNonNull(draftNotes.getRevision(), ObjectId.zeroId());
+          RevisionNoteMap<ChangeRevisionNote> rnm = draftNotes.getRevisionNoteMap();
+          if (idFromNotes.equals(curr) && rnm != null) {
+            return rnm;
+          }
+        }
+      }
+    }
+    NoteMap noteMap;
+    if (!curr.equals(ObjectId.zeroId())) {
+      noteMap = NoteMap.read(rw.getObjectReader(), rw.parseCommit(curr));
+    } else {
+      noteMap = NoteMap.newEmptyMap();
+    }
+    // Even though reading from changes might not be enabled, we need to
+    // parse any existing revision notes so we can merge them.
+    return RevisionNoteMap.parse(
+        noteUtil.getChangeNoteJson(),
+        noteUtil.getLegacyChangeNoteRead(),
+        getId(),
+        rw.getObjectReader(),
+        noteMap,
+        PatchLineComment.Status.DRAFT);
+  }
+
+  @Override
+  protected CommitBuilder applyImpl(RevWalk rw, ObjectInserter ins, ObjectId curr)
+      throws OrmException, IOException {
+    CommitBuilder cb = new CommitBuilder();
+    cb.setMessage("Update draft comments");
+    try {
+      return storeCommentsInNotes(rw, ins, curr, cb);
+    } catch (ConfigInvalidException e) {
+      throw new OrmException(e);
+    }
+  }
+
+  @Override
+  protected Project.NameKey getProjectName() {
+    return draftsProject;
+  }
+
+  @Override
+  protected String getRefName() {
+    return RefNames.refsDraftComments(getId(), accountId);
+  }
+
+  @Override
+  public boolean isEmpty() {
+    return delete.isEmpty() && put.isEmpty();
+  }
+}
diff --git a/java/com/google/gerrit/server/notedb/ChangeNoteJson.java b/java/com/google/gerrit/server/notedb/ChangeNoteJson.java
new file mode 100644
index 0000000..483b2e9
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/ChangeNoteJson.java
@@ -0,0 +1,36 @@
+// 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.
+
+package com.google.gerrit.server.notedb;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.inject.Singleton;
+import java.sql.Timestamp;
+
+@Singleton
+public class ChangeNoteJson {
+  private final Gson gson = newGson();
+
+  static Gson newGson() {
+    return new GsonBuilder()
+        .registerTypeAdapter(Timestamp.class, new CommentTimestampAdapter().nullSafe())
+        .setPrettyPrinting()
+        .create();
+  }
+
+  public Gson getGson() {
+    return gson;
+  }
+}
diff --git a/java/com/google/gerrit/server/notedb/ChangeNoteUtil.java b/java/com/google/gerrit/server/notedb/ChangeNoteUtil.java
new file mode 100644
index 0000000..8a0cabe
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/ChangeNoteUtil.java
@@ -0,0 +1,188 @@
+// Copyright (C) 2013 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.google.gerrit.server.notedb;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.config.GerritServerId;
+import com.google.inject.Inject;
+import java.util.Date;
+import java.util.Optional;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.revwalk.FooterKey;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.util.RawParseUtils;
+
+public class ChangeNoteUtil {
+  public static final FooterKey FOOTER_ASSIGNEE = new FooterKey("Assignee");
+  public static final FooterKey FOOTER_BRANCH = new FooterKey("Branch");
+  public static final FooterKey FOOTER_CHANGE_ID = new FooterKey("Change-id");
+  public static final FooterKey FOOTER_COMMIT = new FooterKey("Commit");
+  public static final FooterKey FOOTER_CURRENT = new FooterKey("Current");
+  public static final FooterKey FOOTER_GROUPS = new FooterKey("Groups");
+  public static final FooterKey FOOTER_HASHTAGS = new FooterKey("Hashtags");
+  public static final FooterKey FOOTER_LABEL = new FooterKey("Label");
+  public static final FooterKey FOOTER_PATCH_SET = new FooterKey("Patch-set");
+  public static final FooterKey FOOTER_PATCH_SET_DESCRIPTION =
+      new FooterKey("Patch-set-description");
+  public static final FooterKey FOOTER_PRIVATE = new FooterKey("Private");
+  public static final FooterKey FOOTER_READ_ONLY_UNTIL = new FooterKey("Read-only-until");
+  public static final FooterKey FOOTER_REAL_USER = new FooterKey("Real-user");
+  public static final FooterKey FOOTER_STATUS = new FooterKey("Status");
+  public static final FooterKey FOOTER_SUBJECT = new FooterKey("Subject");
+  public static final FooterKey FOOTER_SUBMISSION_ID = new FooterKey("Submission-id");
+  public static final FooterKey FOOTER_SUBMITTED_WITH = new FooterKey("Submitted-with");
+  public static final FooterKey FOOTER_TOPIC = new FooterKey("Topic");
+  public static final FooterKey FOOTER_TAG = new FooterKey("Tag");
+  public static final FooterKey FOOTER_WORK_IN_PROGRESS = new FooterKey("Work-in-progress");
+  public static final FooterKey FOOTER_REVERT_OF = new FooterKey("Revert-of");
+
+  static final String AUTHOR = "Author";
+  static final String BASE_PATCH_SET = "Base-for-patch-set";
+  static final String COMMENT_RANGE = "Comment-range";
+  static final String FILE = "File";
+  static final String LENGTH = "Bytes";
+  static final String PARENT = "Parent";
+  static final String PARENT_NUMBER = "Parent-number";
+  static final String PATCH_SET = "Patch-set";
+  static final String REAL_AUTHOR = "Real-author";
+  static final String REVISION = "Revision";
+  static final String UUID = "UUID";
+  static final String UNRESOLVED = "Unresolved";
+  static final String TAG = FOOTER_TAG.getName();
+
+  private final LegacyChangeNoteRead legacyChangeNoteRead;
+  private final ChangeNoteJson changeNoteJson;
+  private final String serverId;
+
+  @Inject
+  public ChangeNoteUtil(
+      ChangeNoteJson changeNoteJson,
+      LegacyChangeNoteRead legacyChangeNoteRead,
+      @GerritServerId String serverId) {
+    this.serverId = serverId;
+    this.changeNoteJson = changeNoteJson;
+    this.legacyChangeNoteRead = legacyChangeNoteRead;
+  }
+
+  public LegacyChangeNoteRead getLegacyChangeNoteRead() {
+    return legacyChangeNoteRead;
+  }
+
+  public ChangeNoteJson getChangeNoteJson() {
+    return changeNoteJson;
+  }
+
+  public PersonIdent newIdent(Account.Id authorId, Date when, PersonIdent serverIdent) {
+    return new PersonIdent(
+        "Gerrit User " + authorId.toString(),
+        authorId.get() + "@" + serverId,
+        when,
+        serverIdent.getTimeZone());
+  }
+
+  @VisibleForTesting
+  public PersonIdent newIdent(Account author, Date when, PersonIdent serverIdent) {
+    return new PersonIdent(
+        "Gerrit User " + author.getId(),
+        author.getId().get() + "@" + serverId,
+        when,
+        serverIdent.getTimeZone());
+  }
+
+  public static Optional<CommitMessageRange> parseCommitMessageRange(RevCommit commit) {
+    byte[] raw = commit.getRawBuffer();
+    int size = raw.length;
+
+    int subjectStart = RawParseUtils.commitMessage(raw, 0);
+    if (subjectStart < 0 || subjectStart >= size) {
+      return Optional.empty();
+    }
+
+    int subjectEnd = RawParseUtils.endOfParagraph(raw, subjectStart);
+    if (subjectEnd == size) {
+      return Optional.empty();
+    }
+
+    int changeMessageStart;
+
+    if (raw[subjectEnd] == '\n') {
+      changeMessageStart = subjectEnd + 2; // \n\n ends paragraph
+    } else if (raw[subjectEnd] == '\r') {
+      changeMessageStart = subjectEnd + 4; // \r\n\r\n ends paragraph
+    } else {
+      return Optional.empty();
+    }
+
+    int ptr = size - 1;
+    int changeMessageEnd = -1;
+    while (ptr > changeMessageStart) {
+      ptr = RawParseUtils.prevLF(raw, ptr, '\r');
+      if (ptr == -1) {
+        break;
+      }
+      if (raw[ptr] == '\n') {
+        changeMessageEnd = ptr - 1;
+        break;
+      } else if (raw[ptr] == '\r') {
+        changeMessageEnd = ptr - 3;
+        break;
+      }
+    }
+
+    if (ptr <= changeMessageStart) {
+      return Optional.empty();
+    }
+
+    CommitMessageRange range =
+        CommitMessageRange.builder()
+            .subjectStart(subjectStart)
+            .subjectEnd(subjectEnd)
+            .changeMessageStart(changeMessageStart)
+            .changeMessageEnd(changeMessageEnd)
+            .build();
+
+    return Optional.of(range);
+  }
+
+  @AutoValue
+  public abstract static class CommitMessageRange {
+    public abstract int subjectStart();
+
+    public abstract int subjectEnd();
+
+    public abstract int changeMessageStart();
+
+    public abstract int changeMessageEnd();
+
+    public static Builder builder() {
+      return new AutoValue_ChangeNoteUtil_CommitMessageRange.Builder();
+    }
+
+    @AutoValue.Builder
+    public abstract static class Builder {
+      abstract Builder subjectStart(int subjectStart);
+
+      abstract Builder subjectEnd(int subjectEnd);
+
+      abstract Builder changeMessageStart(int changeMessageStart);
+
+      abstract Builder changeMessageEnd(int changeMessageEnd);
+
+      abstract CommitMessageRange build();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/notedb/ChangeNotes.java b/java/com/google/gerrit/server/notedb/ChangeNotes.java
new file mode 100644
index 0000000..086b2e2
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/ChangeNotes.java
@@ -0,0 +1,786 @@
+// Copyright (C) 2013 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.google.gerrit.server.notedb;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.gerrit.reviewdb.client.RefNames.changeMetaRef;
+import static com.google.gerrit.server.notedb.NoteDbTable.CHANGES;
+import static java.util.Comparator.comparing;
+import static java.util.Objects.requireNonNull;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableSortedMap;
+import com.google.common.collect.ImmutableSortedSet;
+import com.google.common.collect.Iterators;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.collect.Multimaps;
+import com.google.common.collect.Ordering;
+import com.google.common.collect.Sets;
+import com.google.common.collect.Sets.SetView;
+import com.google.common.collect.Streams;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.SubmitRecord;
+import com.google.gerrit.metrics.Timer1;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.client.RevId;
+import com.google.gerrit.reviewdb.client.RobotComment;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.reviewdb.server.ReviewDbUtil;
+import com.google.gerrit.server.ReviewerByEmailSet;
+import com.google.gerrit.server.ReviewerSet;
+import com.google.gerrit.server.ReviewerStatusUpdate;
+import com.google.gerrit.server.git.RefCache;
+import com.google.gerrit.server.git.RepoRefCache;
+import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
+import com.google.gerrit.server.notedb.rebuild.ChangeRebuilder;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Predicate;
+import java.util.stream.Stream;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+
+/** View of a single {@link Change} based on the log of its notes branch. */
+public class ChangeNotes extends AbstractChangeNotes<ChangeNotes> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  static final Ordering<PatchSetApproval> PSA_BY_TIME =
+      Ordering.from(comparing(PatchSetApproval::getGranted));
+
+  public static final Ordering<ChangeMessage> MESSAGE_BY_TIME =
+      Ordering.from(comparing(ChangeMessage::getWrittenOn));
+
+  public static ConfigInvalidException parseException(
+      Change.Id changeId, String fmt, Object... args) {
+    return new ConfigInvalidException("Change " + changeId + ": " + String.format(fmt, args));
+  }
+
+  @Nullable
+  public static Change readOneReviewDbChange(ReviewDb db, Change.Id id) throws OrmException {
+    return ReviewDbUtil.unwrapDb(db).changes().get(id);
+  }
+
+  @Singleton
+  public static class Factory {
+    private final Args args;
+    private final Provider<InternalChangeQuery> queryProvider;
+    private final ProjectCache projectCache;
+
+    @VisibleForTesting
+    @Inject
+    public Factory(
+        Args args, Provider<InternalChangeQuery> queryProvider, ProjectCache projectCache) {
+      this.args = args;
+      this.queryProvider = queryProvider;
+      this.projectCache = projectCache;
+    }
+
+    public ChangeNotes createChecked(ReviewDb db, Change c) throws OrmException {
+      return createChecked(db, c.getProject(), c.getId());
+    }
+
+    public ChangeNotes createChecked(ReviewDb db, Project.NameKey project, Change.Id changeId)
+        throws OrmException {
+      Change change = readOneReviewDbChange(db, changeId);
+      if (change == null) {
+        if (!args.migration.readChanges()) {
+          throw new NoSuchChangeException(changeId);
+        }
+        // Change isn't in ReviewDb, but its primary storage might be in NoteDb.
+        // Prepopulate the change exists with proper noteDbState field.
+        change = newNoteDbOnlyChange(project, changeId);
+      } else if (!change.getProject().equals(project)) {
+        throw new NoSuchChangeException(changeId);
+      }
+      return new ChangeNotes(args, change).load();
+    }
+
+    public ChangeNotes createChecked(Change.Id changeId) throws OrmException {
+      InternalChangeQuery query = queryProvider.get().noFields();
+      List<ChangeData> changes = query.byLegacyChangeId(changeId);
+      if (changes.isEmpty()) {
+        throw new NoSuchChangeException(changeId);
+      }
+      if (changes.size() != 1) {
+        logger.atSevere().log("Multiple changes found for %d", changeId.get());
+        throw new NoSuchChangeException(changeId);
+      }
+      return changes.get(0).notes();
+    }
+
+    public static Change newNoteDbOnlyChange(Project.NameKey project, Change.Id changeId) {
+      Change change =
+          new Change(
+              null, changeId, null, new Branch.NameKey(project, "INVALID_NOTE_DB_ONLY"), null);
+      change.setNoteDbState(NoteDbChangeState.NOTE_DB_PRIMARY_STATE);
+      return change;
+    }
+
+    private Change loadChangeFromDb(ReviewDb db, Project.NameKey project, Change.Id changeId)
+        throws OrmException {
+      checkArgument(project != null, "project is required");
+      Change change = readOneReviewDbChange(db, changeId);
+
+      if (change == null) {
+        if (args.migration.readChanges()) {
+          return newNoteDbOnlyChange(project, changeId);
+        }
+        throw new NoSuchChangeException(changeId);
+      }
+      checkArgument(
+          change.getProject().equals(project),
+          "passed project %s when creating ChangeNotes for %s, but actual project is %s",
+          project,
+          changeId,
+          change.getProject());
+      return change;
+    }
+
+    public ChangeNotes create(ReviewDb db, Project.NameKey project, Change.Id changeId)
+        throws OrmException {
+      return new ChangeNotes(args, loadChangeFromDb(db, project, changeId)).load();
+    }
+
+    public ChangeNotes createWithAutoRebuildingDisabled(
+        ReviewDb db, Project.NameKey project, Change.Id changeId) throws OrmException {
+      return new ChangeNotes(args, loadChangeFromDb(db, project, changeId), true, false, null)
+          .load();
+    }
+
+    /**
+     * Create change notes for a change that was loaded from index. This method should only be used
+     * when database access is harmful and potentially stale data from the index is acceptable.
+     *
+     * @param change change loaded from secondary index
+     * @return change notes
+     */
+    public ChangeNotes createFromIndexedChange(Change change) {
+      return new ChangeNotes(args, change);
+    }
+
+    public ChangeNotes createForBatchUpdate(Change change, boolean shouldExist)
+        throws OrmException {
+      return new ChangeNotes(args, change, shouldExist, false, null).load();
+    }
+
+    public ChangeNotes createWithAutoRebuildingDisabled(Change change, RefCache refs)
+        throws OrmException {
+      return new ChangeNotes(args, change, true, false, refs).load();
+    }
+
+    // TODO(ekempin): Remove when database backend is deleted
+    /**
+     * Instantiate ChangeNotes for a change that has been loaded by a batch read from the database.
+     */
+    private ChangeNotes createFromChangeOnlyWhenNoteDbDisabled(Change change) throws OrmException {
+      checkState(
+          !args.migration.readChanges(),
+          "do not call createFromChangeWhenNoteDbDisabled when NoteDb is enabled");
+      return new ChangeNotes(args, change).load();
+    }
+
+    public List<ChangeNotes> create(ReviewDb db, Collection<Change.Id> changeIds)
+        throws OrmException {
+      List<ChangeNotes> notes = new ArrayList<>();
+      if (args.migration.readChanges()) {
+        for (Change.Id changeId : changeIds) {
+          try {
+            notes.add(createChecked(changeId));
+          } catch (NoSuchChangeException e) {
+            // Ignore missing changes to match Access#get(Iterable) behavior.
+          }
+        }
+        return notes;
+      }
+
+      for (Change c : ReviewDbUtil.unwrapDb(db).changes().get(changeIds)) {
+        notes.add(createFromChangeOnlyWhenNoteDbDisabled(c));
+      }
+      return notes;
+    }
+
+    public List<ChangeNotes> create(
+        ReviewDb db,
+        Project.NameKey project,
+        Collection<Change.Id> changeIds,
+        Predicate<ChangeNotes> predicate)
+        throws OrmException {
+      List<ChangeNotes> notes = new ArrayList<>();
+      if (args.migration.readChanges()) {
+        for (Change.Id cid : changeIds) {
+          try {
+            ChangeNotes cn = create(db, project, cid);
+            if (cn.getChange() != null && predicate.test(cn)) {
+              notes.add(cn);
+            }
+          } catch (NoSuchChangeException e) {
+            // Match ReviewDb behavior, returning not found; maybe the caller learned about it from
+            // a dangling patch set ref or something.
+            continue;
+          }
+        }
+        return notes;
+      }
+
+      for (Change c : ReviewDbUtil.unwrapDb(db).changes().get(changeIds)) {
+        if (c != null && project.equals(c.getDest().getParentKey())) {
+          ChangeNotes cn = createFromChangeOnlyWhenNoteDbDisabled(c);
+          if (predicate.test(cn)) {
+            notes.add(cn);
+          }
+        }
+      }
+      return notes;
+    }
+
+    public ListMultimap<Project.NameKey, ChangeNotes> create(
+        ReviewDb db, Predicate<ChangeNotes> predicate) throws IOException, OrmException {
+      ListMultimap<Project.NameKey, ChangeNotes> m =
+          MultimapBuilder.hashKeys().arrayListValues().build();
+      if (args.migration.readChanges()) {
+        for (Project.NameKey project : projectCache.all()) {
+          try (Repository repo = args.repoManager.openRepository(project)) {
+            scanNoteDb(repo, db, project)
+                .filter(r -> !r.error().isPresent())
+                .map(ChangeNotesResult::notes)
+                .filter(predicate)
+                .forEach(n -> m.put(n.getProjectName(), n));
+          }
+        }
+      } else {
+        for (Change change : ReviewDbUtil.unwrapDb(db).changes().all()) {
+          ChangeNotes notes = createFromChangeOnlyWhenNoteDbDisabled(change);
+          if (predicate.test(notes)) {
+            m.put(change.getProject(), notes);
+          }
+        }
+      }
+      return ImmutableListMultimap.copyOf(m);
+    }
+
+    public Stream<ChangeNotesResult> scan(Repository repo, ReviewDb db, Project.NameKey project)
+        throws IOException {
+      return args.migration.readChanges() ? scanNoteDb(repo, db, project) : scanReviewDb(repo, db);
+    }
+
+    private Stream<ChangeNotesResult> scanReviewDb(Repository repo, ReviewDb db)
+        throws IOException {
+      // Scan IDs that might exist in ReviewDb, assuming that each change has at least one patch set
+      // ref. Not all changes might exist: some patch set refs might have been written where the
+      // corresponding ReviewDb write failed. These will be silently filtered out by the batch get
+      // call below, which is intended.
+      Set<Change.Id> ids = scanChangeIds(repo).fromPatchSetRefs();
+
+      // A batch size of N may overload get(Iterable), so use something smaller, but still >1.
+      return Streams.stream(Iterators.partition(ids.iterator(), 30))
+          .flatMap(
+              batch -> {
+                try {
+                  return Streams.stream(ReviewDbUtil.unwrapDb(db).changes().get(batch))
+                      .map(this::toResult)
+                      .filter(Objects::nonNull);
+                } catch (OrmException e) {
+                  // Return this error for each Id in the input batch.
+                  return batch.stream().map(id -> ChangeNotesResult.error(id, e));
+                }
+              });
+    }
+
+    private Stream<ChangeNotesResult> scanNoteDb(
+        Repository repo, ReviewDb db, Project.NameKey project) throws IOException {
+      ScanResult sr = scanChangeIds(repo);
+      PrimaryStorage defaultStorage = args.migration.changePrimaryStorage();
+
+      return sr.all().stream()
+          .map(id -> scanOneNoteDbChange(db, project, sr, defaultStorage, id))
+          .filter(Objects::nonNull);
+    }
+
+    private ChangeNotesResult scanOneNoteDbChange(
+        ReviewDb db,
+        Project.NameKey project,
+        ScanResult sr,
+        PrimaryStorage defaultStorage,
+        Change.Id id) {
+      Change change;
+      try {
+        change = readOneReviewDbChange(db, id);
+      } catch (OrmException e) {
+        return ChangeNotesResult.error(id, e);
+      }
+
+      if (change == null) {
+        if (!sr.fromMetaRefs().contains(id)) {
+          // Stray patch set refs can happen due to normal error conditions, e.g. failed
+          // push processing, so aren't worth even a warning.
+          return null;
+        }
+        if (defaultStorage == PrimaryStorage.REVIEW_DB) {
+          // If changes should exist in ReviewDb, it's worth warning about a meta ref with
+          // no corresponding ReviewDb data.
+          logger.atWarning().log(
+              "skipping change %s found in project %s but not in ReviewDb", id, project);
+          return null;
+        }
+        // TODO(dborowitz): See discussion in NoteDbBatchUpdate#newChangeContext.
+        change = ChangeNotes.Factory.newNoteDbOnlyChange(project, id);
+      } else if (!change.getProject().equals(project)) {
+        logger.atSevere().log(
+            "skipping change %s found in project %s because ReviewDb change has project %s",
+            id, project, change.getProject());
+        return null;
+      }
+      logger.atFine().log("adding change %s found in project %s", id, project);
+      return toResult(change);
+    }
+
+    @Nullable
+    private ChangeNotesResult toResult(Change rawChangeFromReviewDbOrNoteDb) {
+      ChangeNotes n = new ChangeNotes(args, rawChangeFromReviewDbOrNoteDb);
+      try {
+        n.load();
+      } catch (OrmException e) {
+        return ChangeNotesResult.error(n.getChangeId(), e);
+      }
+      return ChangeNotesResult.notes(n);
+    }
+
+    /** Result of {@link #scan(Repository, ReviewDb, Project.NameKey)}. */
+    @AutoValue
+    public abstract static class ChangeNotesResult {
+      static ChangeNotesResult error(Change.Id id, OrmException e) {
+        return new AutoValue_ChangeNotes_Factory_ChangeNotesResult(id, Optional.of(e), null);
+      }
+
+      static ChangeNotesResult notes(ChangeNotes notes) {
+        return new AutoValue_ChangeNotes_Factory_ChangeNotesResult(
+            notes.getChangeId(), Optional.empty(), notes);
+      }
+
+      /** Change ID that was scanned. */
+      public abstract Change.Id id();
+
+      /** Error encountered while loading this change, if any. */
+      public abstract Optional<OrmException> error();
+
+      /**
+       * Notes loaded for this change.
+       *
+       * @return notes.
+       * @throws IllegalStateException if there was an error loading the change; callers must check
+       *     that {@link #error()} is absent before attempting to look up the notes.
+       */
+      public ChangeNotes notes() {
+        checkState(maybeNotes() != null, "no ChangeNotes loaded; check error().isPresent() first");
+        return maybeNotes();
+      }
+
+      @Nullable
+      abstract ChangeNotes maybeNotes();
+    }
+
+    @AutoValue
+    abstract static class ScanResult {
+      abstract ImmutableSet<Change.Id> fromPatchSetRefs();
+
+      abstract ImmutableSet<Change.Id> fromMetaRefs();
+
+      SetView<Change.Id> all() {
+        return Sets.union(fromPatchSetRefs(), fromMetaRefs());
+      }
+    }
+
+    private static ScanResult scanChangeIds(Repository repo) throws IOException {
+      ImmutableSet.Builder<Change.Id> fromPs = ImmutableSet.builder();
+      ImmutableSet.Builder<Change.Id> fromMeta = ImmutableSet.builder();
+      for (Ref r : repo.getRefDatabase().getRefsByPrefix(RefNames.REFS_CHANGES)) {
+        Change.Id id = Change.Id.fromRef(r.getName());
+        if (id != null) {
+          (r.getName().endsWith(RefNames.META_SUFFIX) ? fromMeta : fromPs).add(id);
+        }
+      }
+      return new AutoValue_ChangeNotes_Factory_ScanResult(fromPs.build(), fromMeta.build());
+    }
+  }
+
+  private final boolean shouldExist;
+  private final RefCache refs;
+
+  private Change change;
+  private ChangeNotesState state;
+
+  // Parsed note map state, used by ChangeUpdate to make in-place editing of
+  // notes easier.
+  RevisionNoteMap<ChangeRevisionNote> revisionNoteMap;
+
+  private NoteDbUpdateManager.Result rebuildResult;
+  private DraftCommentNotes draftCommentNotes;
+  private RobotCommentNotes robotCommentNotes;
+
+  // Lazy defensive copies of mutable ReviewDb types, to avoid polluting the
+  // ChangeNotesCache from handlers.
+  private ImmutableSortedMap<PatchSet.Id, PatchSet> patchSets;
+  private ImmutableListMultimap<PatchSet.Id, PatchSetApproval> approvals;
+  private ImmutableSet<Comment.Key> commentKeys;
+
+  @VisibleForTesting
+  public ChangeNotes(Args args, Change change) {
+    this(args, change, true, true, null);
+  }
+
+  private ChangeNotes(
+      Args args, Change change, boolean shouldExist, boolean autoRebuild, @Nullable RefCache refs) {
+    super(args, change.getId(), PrimaryStorage.of(change), autoRebuild);
+    this.change = new Change(change);
+    this.shouldExist = shouldExist;
+    this.refs = refs;
+  }
+
+  public Change getChange() {
+    return change;
+  }
+
+  public ObjectId getMetaId() {
+    return state.metaId();
+  }
+
+  public ImmutableSortedMap<PatchSet.Id, PatchSet> getPatchSets() {
+    if (patchSets == null) {
+      ImmutableSortedMap.Builder<PatchSet.Id, PatchSet> b =
+          ImmutableSortedMap.orderedBy(comparing(PatchSet.Id::get));
+      for (Map.Entry<PatchSet.Id, PatchSet> e : state.patchSets()) {
+        b.put(e.getKey(), new PatchSet(e.getValue()));
+      }
+      patchSets = b.build();
+    }
+    return patchSets;
+  }
+
+  public ImmutableListMultimap<PatchSet.Id, PatchSetApproval> getApprovals() {
+    if (approvals == null) {
+      ImmutableListMultimap.Builder<PatchSet.Id, PatchSetApproval> b =
+          ImmutableListMultimap.builder();
+      for (Map.Entry<PatchSet.Id, PatchSetApproval> e : state.approvals()) {
+        b.put(e.getKey(), new PatchSetApproval(e.getValue()));
+      }
+      approvals = b.build();
+    }
+    return approvals;
+  }
+
+  public ReviewerSet getReviewers() {
+    return state.reviewers();
+  }
+
+  /** @return reviewers that do not currently have a Gerrit account and were added by email. */
+  public ReviewerByEmailSet getReviewersByEmail() {
+    return state.reviewersByEmail();
+  }
+
+  /** @return reviewers that were modified during this change's current WIP phase. */
+  public ReviewerSet getPendingReviewers() {
+    return state.pendingReviewers();
+  }
+
+  /** @return reviewers by email that were modified during this change's current WIP phase. */
+  public ReviewerByEmailSet getPendingReviewersByEmail() {
+    return state.pendingReviewersByEmail();
+  }
+
+  public ImmutableList<ReviewerStatusUpdate> getReviewerUpdates() {
+    return state.reviewerUpdates();
+  }
+
+  /** @return an ImmutableSet of Account.Ids of all users that have been assigned to this change. */
+  public ImmutableSet<Account.Id> getPastAssignees() {
+    return state.pastAssignees();
+  }
+
+  /** @return a ImmutableSet of all hashtags for this change sorted in alphabetical order. */
+  public ImmutableSet<String> getHashtags() {
+    return ImmutableSortedSet.copyOf(state.hashtags());
+  }
+
+  /** @return a list of all users who have ever been a reviewer on this change. */
+  public ImmutableList<Account.Id> getAllPastReviewers() {
+    return state.allPastReviewers();
+  }
+
+  /**
+   * @return submit records stored during the most recent submit; only for changes that were
+   *     actually submitted.
+   */
+  public ImmutableList<SubmitRecord> getSubmitRecords() {
+    return state.submitRecords();
+  }
+
+  /** @return all change messages, in chronological order, oldest first. */
+  public ImmutableList<ChangeMessage> getChangeMessages() {
+    return state.changeMessages();
+  }
+
+  /** @return inline comments on each revision. */
+  public ImmutableListMultimap<RevId, Comment> getComments() {
+    return state.publishedComments();
+  }
+
+  public ImmutableSet<Comment.Key> getCommentKeys() {
+    if (commentKeys == null) {
+      ImmutableSet.Builder<Comment.Key> b = ImmutableSet.builder();
+      for (Comment c : getComments().values()) {
+        b.add(new Comment.Key(c.key));
+      }
+      commentKeys = b.build();
+    }
+    return commentKeys;
+  }
+
+  public ImmutableListMultimap<RevId, Comment> getDraftComments(Account.Id author)
+      throws OrmException {
+    return getDraftComments(author, null);
+  }
+
+  public ImmutableListMultimap<RevId, Comment> getDraftComments(
+      Account.Id author, @Nullable Ref ref) throws OrmException {
+    loadDraftComments(author, ref);
+    // Filter out any zombie draft comments. These are drafts that are also in
+    // the published map, and arise when the update to All-Users to delete them
+    // during the publish operation failed.
+    return ImmutableListMultimap.copyOf(
+        Multimaps.filterEntries(
+            draftCommentNotes.getComments(), e -> !getCommentKeys().contains(e.getValue().key)));
+  }
+
+  public ImmutableListMultimap<RevId, RobotComment> getRobotComments() throws OrmException {
+    loadRobotComments();
+    return robotCommentNotes.getComments();
+  }
+
+  /**
+   * If draft comments have already been loaded for this author, then they will not be reloaded.
+   * However, this method will load the comments if no draft comments have been loaded or if the
+   * caller would like the drafts for another author.
+   */
+  private void loadDraftComments(Account.Id author, @Nullable Ref ref) throws OrmException {
+    if (draftCommentNotes == null || !author.equals(draftCommentNotes.getAuthor()) || ref != null) {
+      draftCommentNotes =
+          new DraftCommentNotes(args, change, author, autoRebuild, rebuildResult, ref);
+      draftCommentNotes.load();
+    }
+  }
+
+  private void loadRobotComments() throws OrmException {
+    if (robotCommentNotes == null) {
+      robotCommentNotes = new RobotCommentNotes(args, change);
+      robotCommentNotes.load();
+    }
+  }
+
+  @VisibleForTesting
+  DraftCommentNotes getDraftCommentNotes() {
+    return draftCommentNotes;
+  }
+
+  public RobotCommentNotes getRobotCommentNotes() {
+    return robotCommentNotes;
+  }
+
+  public boolean containsComment(Comment c) throws OrmException {
+    if (containsCommentPublished(c)) {
+      return true;
+    }
+    loadDraftComments(c.author.getId(), null);
+    return draftCommentNotes.containsComment(c);
+  }
+
+  public boolean containsCommentPublished(Comment c) {
+    for (Comment l : getComments().values()) {
+      if (c.key.equals(l.key)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @Override
+  public String getRefName() {
+    return changeMetaRef(getChangeId());
+  }
+
+  public PatchSet getCurrentPatchSet() {
+    PatchSet.Id psId = change.currentPatchSetId();
+    return requireNonNull(
+        getPatchSets().get(psId), () -> String.format("missing current patch set %s", psId.get()));
+  }
+
+  @VisibleForTesting
+  public Timestamp getReadOnlyUntil() {
+    return state.readOnlyUntil();
+  }
+
+  @Override
+  protected void onLoad(LoadHandle handle)
+      throws NoSuchChangeException, IOException, ConfigInvalidException {
+    ObjectId rev = handle.id();
+    if (rev == null) {
+      if (args.migration.readChanges()
+          && PrimaryStorage.of(change) == PrimaryStorage.NOTE_DB
+          && shouldExist) {
+        throw new NoSuchChangeException(getChangeId());
+      }
+      loadDefaults();
+      return;
+    }
+
+    ChangeNotesCache.Value v =
+        args.cache.get().get(getProjectName(), getChangeId(), rev, handle.walk());
+    state = v.state();
+    state.copyColumnsTo(change);
+    revisionNoteMap = v.revisionNoteMap();
+  }
+
+  @Override
+  protected void loadDefaults() {
+    state = ChangeNotesState.empty(change);
+  }
+
+  @Override
+  public Project.NameKey getProjectName() {
+    return change.getProject();
+  }
+
+  @Override
+  protected ObjectId readRef(Repository repo) throws IOException {
+    return refs != null ? refs.get(getRefName()).orElse(null) : super.readRef(repo);
+  }
+
+  @Override
+  protected LoadHandle openHandle(Repository repo) throws NoSuchChangeException, IOException {
+    if (autoRebuild) {
+      NoteDbChangeState state = NoteDbChangeState.parse(change);
+      if (args.migration.disableChangeReviewDb()) {
+        checkState(
+            state != null,
+            "shouldn't have null NoteDbChangeState when ReviewDb disabled: %s",
+            change);
+      }
+      ObjectId id = readRef(repo);
+      if (id == null) {
+        // Meta ref doesn't exist in NoteDb.
+
+        if (state == null) {
+          // Either ReviewDb change is being newly created, or it exists in ReviewDb but has not yet
+          // been rebuilt for the first time, e.g. because we just turned on write-only mode. In
+          // both cases, we don't want to auto-rebuild, just proceed with an empty ChangeNotes.
+          return super.openHandle(repo, id);
+        } else if (shouldExist && state.getPrimaryStorage() == PrimaryStorage.NOTE_DB) {
+          throw new NoSuchChangeException(getChangeId());
+        }
+
+        // ReviewDb claims NoteDb state exists, but meta ref isn't present: fall through and
+        // auto-rebuild if necessary.
+      }
+      RefCache refs = this.refs != null ? this.refs : new RepoRefCache(repo);
+      if (!NoteDbChangeState.isChangeUpToDate(state, refs, getChangeId())) {
+        return rebuildAndOpen(repo, id);
+      }
+    }
+    return super.openHandle(repo);
+  }
+
+  private LoadHandle rebuildAndOpen(Repository repo, ObjectId oldId) throws IOException {
+    Timer1.Context timer = args.metrics.autoRebuildLatency.start(CHANGES);
+    try {
+      Change.Id cid = getChangeId();
+      ReviewDb db = args.db.get();
+      ChangeRebuilder rebuilder = args.rebuilder.get();
+      NoteDbUpdateManager.Result r;
+      try (NoteDbUpdateManager manager = rebuilder.stage(db, cid)) {
+        if (manager == null) {
+          return super.openHandle(repo, oldId); // May be null in tests.
+        }
+        manager.setRefLogMessage("Auto-rebuilding change");
+        r = manager.stageAndApplyDelta(change);
+        try {
+          rebuilder.execute(db, cid, manager);
+          repo.scanForRepoChanges();
+        } catch (OrmException | IOException e) {
+          // Rebuilding failed. Most likely cause is contention on one or more
+          // change refs; there are other types of errors that can happen during
+          // rebuilding, but generally speaking they should happen during stage(),
+          // not execute(). Assume that some other worker is going to successfully
+          // store the rebuilt state, which is deterministic given an input
+          // ChangeBundle.
+          //
+          // Parse notes from the staged result so we can return something useful
+          // to the caller instead of throwing.
+          logger.atFine().log("Rebuilding change %s failed: %s", getChangeId(), e.getMessage());
+          args.metrics.autoRebuildFailureCount.increment(CHANGES);
+          rebuildResult = requireNonNull(r);
+          requireNonNull(r.newState());
+          requireNonNull(r.staged());
+          requireNonNull(r.staged().changeObjects());
+          return LoadHandle.create(
+              ChangeNotesCommit.newStagedRevWalk(repo, r.staged().changeObjects()),
+              r.newState().getChangeMetaId());
+        }
+      }
+      return LoadHandle.create(ChangeNotesCommit.newRevWalk(repo), r.newState().getChangeMetaId());
+    } catch (NoSuchChangeException e) {
+      return super.openHandle(repo, oldId);
+    } catch (OrmException e) {
+      throw new IOException(e);
+    } finally {
+      logger.atFine().log(
+          "Rebuilt change %s in project %s in %s ms",
+          getChangeId(),
+          getProjectName(),
+          TimeUnit.MILLISECONDS.convert(timer.stop(), TimeUnit.NANOSECONDS));
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/notedb/ChangeNotesCache.java b/java/com/google/gerrit/server/notedb/ChangeNotesCache.java
new file mode 100644
index 0000000..cc316e5
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/ChangeNotesCache.java
@@ -0,0 +1,393 @@
+// 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.
+
+package com.google.gerrit.server.notedb;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.cache.Cache;
+import com.google.common.collect.Table;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.ReviewerByEmailSet;
+import com.google.gerrit.server.ReviewerSet;
+import com.google.gerrit.server.cache.CacheModule;
+import com.google.gerrit.server.cache.proto.Cache.ChangeNotesKeyProto;
+import com.google.gerrit.server.cache.serialize.CacheSerializer;
+import com.google.gerrit.server.cache.serialize.ProtoCacheSerializers;
+import com.google.gerrit.server.cache.serialize.ProtoCacheSerializers.ObjectIdConverter;
+import com.google.gerrit.server.notedb.AbstractChangeNotes.Args;
+import com.google.gerrit.server.notedb.ChangeNotesCommit.ChangeNotesRevWalk;
+import com.google.inject.Inject;
+import com.google.inject.Module;
+import com.google.inject.Singleton;
+import com.google.inject.name.Named;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.ObjectId;
+
+@Singleton
+public class ChangeNotesCache {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  @VisibleForTesting static final String CACHE_NAME = "change_notes";
+
+  public static Module module() {
+    return new CacheModule() {
+      @Override
+      protected void configure() {
+        bind(ChangeNotesCache.class);
+        persist(CACHE_NAME, Key.class, ChangeNotesState.class)
+            .weigher(Weigher.class)
+            .maximumWeight(10 << 20)
+            .diskLimit(-1)
+            .version(1)
+            .keySerializer(Key.Serializer.INSTANCE)
+            .valueSerializer(ChangeNotesState.Serializer.INSTANCE);
+      }
+    };
+  }
+
+  @AutoValue
+  public abstract static class Key {
+    static Key create(Project.NameKey project, Change.Id changeId, ObjectId id) {
+      return new AutoValue_ChangeNotesCache_Key(project, changeId, id.copy());
+    }
+
+    abstract Project.NameKey project();
+
+    abstract Change.Id changeId();
+
+    abstract ObjectId id();
+
+    @VisibleForTesting
+    enum Serializer implements CacheSerializer<Key> {
+      INSTANCE;
+
+      @Override
+      public byte[] serialize(Key object) {
+        return ProtoCacheSerializers.toByteArray(
+            ChangeNotesKeyProto.newBuilder()
+                .setProject(object.project().get())
+                .setChangeId(object.changeId().get())
+                .setId(ObjectIdConverter.create().toByteString(object.id()))
+                .build());
+      }
+
+      @Override
+      public Key deserialize(byte[] in) {
+        ChangeNotesKeyProto proto =
+            ProtoCacheSerializers.parseUnchecked(ChangeNotesKeyProto.parser(), in);
+        return Key.create(
+            new Project.NameKey(proto.getProject()),
+            new Change.Id(proto.getChangeId()),
+            ObjectIdConverter.create().fromByteString(proto.getId()));
+      }
+    }
+  }
+
+  public static class Weigher implements com.google.common.cache.Weigher<Key, ChangeNotesState> {
+    // Single object overhead.
+    private static final int O = 16;
+
+    // Single pointer overhead.
+    private static final int P = 8;
+
+    // Single IntKey overhead.
+    private static final int K = O + 4;
+
+    // Single Timestamp overhead.
+    private static final int T = O + 8;
+
+    @Override
+    public int weigh(Key key, ChangeNotesState state) {
+      // Take all columns and all collection sizes into account, but use
+      // estimated average element sizes rather than iterating over collections.
+      // Numbers are largely hand-wavy based on
+      // http://stackoverflow.com/questions/258120/what-is-the-memory-consumption-of-an-object-in-java
+      return P
+          + O
+          + 20 // metaId
+          + K // changeId
+          + str(40) // changeKey
+          + T // createdOn
+          + T // lastUpdatedOn
+          + P
+          + K // owner
+          + P
+          + str(state.columns().branch())
+          + P
+          + patchSetId() // currentPatchSetId
+          + P
+          + str(state.columns().subject())
+          + P
+          + str(state.columns().topic())
+          + P
+          + str(state.columns().originalSubject())
+          + P
+          + str(state.columns().submissionId())
+          + ptr(state.columns().assignee(), K) // assignee
+          + P // status
+          + P
+          + set(state.pastAssignees(), K)
+          + P
+          + set(state.hashtags(), str(10))
+          + P
+          + list(state.patchSets(), patchSet())
+          + P
+          + reviewerSet(state.reviewers(), 2) // REVIEWER or CC
+          + P
+          + reviewerSet(state.reviewersByEmail(), 2) // REVIEWER or CC
+          + P
+          + reviewerSet(state.pendingReviewers(), 3) // includes REMOVED
+          + P
+          + reviewerSet(state.pendingReviewersByEmail(), 3) // includes REMOVED
+          + P
+          + list(state.allPastReviewers(), approval())
+          + P
+          + list(state.reviewerUpdates(), 4 * O + K + K + P)
+          + P
+          + list(state.submitRecords(), P + list(2, str(4) + P + K) + P)
+          + P
+          + list(state.changeMessages(), changeMessage())
+          + P
+          + map(state.publishedComments().asMap(), comment())
+          + T // readOnlyUntil
+          + 1 // isPrivate
+          + 1 // workInProgress
+          + 1; // reviewStarted
+    }
+
+    private static int ptr(Object o, int size) {
+      return o != null ? P + size : P;
+    }
+
+    private static int str(String s) {
+      if (s == null) {
+        return P;
+      }
+      return str(s.length());
+    }
+
+    private static int str(int n) {
+      return 8 + 24 + 2 * n;
+    }
+
+    private static int patchSetId() {
+      return O + 4 + O + 4;
+    }
+
+    private static int set(Set<?> set, int elemSize) {
+      if (set == null) {
+        return P;
+      }
+      return hashtable(set.size(), elemSize);
+    }
+
+    private static int map(Map<?, ?> map, int elemSize) {
+      if (map == null) {
+        return P;
+      }
+      return hashtable(map.size(), elemSize);
+    }
+
+    private static int hashtable(int n, int elemSize) {
+      // Made up numbers.
+      int overhead = 32;
+      int elemOverhead = O + 32;
+      return overhead + elemOverhead * n * elemSize;
+    }
+
+    private static int list(List<?> list, int elemSize) {
+      if (list == null) {
+        return P;
+      }
+      return list(list.size(), elemSize);
+    }
+
+    private static int list(int n, int elemSize) {
+      return O + O + n * (P + elemSize);
+    }
+
+    private static int hashBasedTable(
+        Table<?, ?, ?> table, int numRows, int rowKey, int columnKey, int elemSize) {
+      return O
+          + hashtable(numRows, rowKey + hashtable(0, 0))
+          + hashtable(table.size(), columnKey + elemSize);
+    }
+
+    private static int reviewerSet(ReviewerSet reviewers, int numRows) {
+      final int rowKey = 1; // ReviewerStateInternal
+      final int columnKey = K; // Account.Id
+      final int cellValue = T; // Timestamp
+      return hashBasedTable(reviewers.asTable(), numRows, rowKey, columnKey, cellValue);
+    }
+
+    private static int reviewerSet(ReviewerByEmailSet reviewers, int numRows) {
+      final int rowKey = 1; // ReviewerStateInternal
+      final int columnKey = P + 2 * str(20); // name and email, just a guess
+      final int cellValue = T; // Timestamp
+      return hashBasedTable(reviewers.asTable(), numRows, rowKey, columnKey, cellValue);
+    }
+
+    private static int patchSet() {
+      return O
+          + P
+          + patchSetId()
+          + str(40) // revision
+          + P
+          + K // uploader
+          + P
+          + T // createdOn
+          + 1 // draft
+          + str(40) // groups
+          + P; // pushCertificate
+    }
+
+    private static int approval() {
+      return O
+          + P
+          + patchSetId()
+          + P
+          + K
+          + P
+          + O
+          + str(10)
+          + 2 // value
+          + P
+          + T // granted
+          + P // tag
+          + P; // realAccountId
+    }
+
+    private static int changeMessage() {
+      int key = K + str(20);
+      return O
+          + P
+          + key
+          + P
+          + K // author
+          + P
+          + T // writtenON
+          + str(64) // message
+          + P
+          + patchSetId()
+          + P
+          + P; // realAuthor
+    }
+
+    private static int comment() {
+      int key = P + str(20) + P + str(32) + 4;
+      int ident = O + 4;
+      return O
+          + P
+          + key
+          + 4 // lineNbr
+          + P
+          + ident // author
+          + P
+          + ident // realAuthor
+          + P
+          + T // writtenOn
+          + 2 // side
+          + str(32) // message
+          + str(10) // parentUuid
+          + (P + O + 4 + 4 + 4 + 4) / 2 // range on 50% of comments
+          + P // tag
+          + P
+          + str(40) // revId
+          + P
+          + str(36); // serverId
+    }
+  }
+
+  @AutoValue
+  abstract static class Value {
+    abstract ChangeNotesState state();
+
+    /**
+     * The {@link RevisionNoteMap} produced while parsing this change.
+     *
+     * <p>These instances are mutable and non-threadsafe, so it is only safe to return it to the
+     * caller that actually incurred the cache miss. It is only used as an optimization; {@link
+     * ChangeNotes} is capable of lazily loading it as necessary.
+     */
+    @Nullable
+    abstract RevisionNoteMap<ChangeRevisionNote> revisionNoteMap();
+  }
+
+  private class Loader implements Callable<ChangeNotesState> {
+    private final Key key;
+    private final ChangeNotesRevWalk rw;
+
+    private RevisionNoteMap<ChangeRevisionNote> revisionNoteMap;
+
+    private Loader(Key key, ChangeNotesRevWalk rw) {
+      this.key = key;
+      this.rw = rw;
+    }
+
+    @Override
+    public ChangeNotesState call() throws ConfigInvalidException, IOException {
+      logger.atFine().log(
+          "Load change notes for change %s of project %s", key.changeId(), key.project());
+      ChangeNotesParser parser =
+          new ChangeNotesParser(
+              key.changeId(),
+              key.id(),
+              rw,
+              args.changeNoteJson,
+              args.legacyChangeNoteRead,
+              args.metrics);
+      ChangeNotesState result = parser.parseAll();
+      // This assignment only happens if call() was actually called, which only
+      // happens when Cache#get(K, Callable<V>) incurs a cache miss.
+      revisionNoteMap = parser.getRevisionNoteMap();
+      return result;
+    }
+  }
+
+  private final Cache<Key, ChangeNotesState> cache;
+  private final Args args;
+
+  @Inject
+  ChangeNotesCache(@Named(CACHE_NAME) Cache<Key, ChangeNotesState> cache, Args args) {
+    this.cache = cache;
+    this.args = args;
+  }
+
+  Value get(Project.NameKey project, Change.Id changeId, ObjectId metaId, ChangeNotesRevWalk rw)
+      throws IOException {
+    try {
+      Key key = Key.create(project, changeId, metaId);
+      Loader loader = new Loader(key, rw);
+      ChangeNotesState s = cache.get(key, loader);
+      return new AutoValue_ChangeNotesCache_Value(s, loader.revisionNoteMap);
+    } catch (ExecutionException e) {
+      throw new IOException(
+          String.format(
+              "Error loading %s in %s at %s",
+              RefNames.changeMetaRef(changeId), project, metaId.name()),
+          e);
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesCommit.java b/java/com/google/gerrit/server/notedb/ChangeNotesCommit.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesCommit.java
rename to java/com/google/gerrit/server/notedb/ChangeNotesCommit.java
diff --git a/java/com/google/gerrit/server/notedb/ChangeNotesParser.java b/java/com/google/gerrit/server/notedb/ChangeNotesParser.java
new file mode 100644
index 0000000..cbb7020
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/ChangeNotesParser.java
@@ -0,0 +1,1121 @@
+// Copyright (C) 2014 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.google.gerrit.server.notedb;
+
+import static com.google.common.base.MoreObjects.firstNonNull;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_ASSIGNEE;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_BRANCH;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_CHANGE_ID;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_COMMIT;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_CURRENT;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_GROUPS;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_HASHTAGS;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_LABEL;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_PATCH_SET;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_PATCH_SET_DESCRIPTION;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_PRIVATE;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_READ_ONLY_UNTIL;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_REAL_USER;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_REVERT_OF;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_STATUS;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_SUBJECT;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_SUBMISSION_ID;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_SUBMITTED_WITH;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_TAG;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_TOPIC;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_WORK_IN_PROGRESS;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.parseCommitMessageRange;
+import static com.google.gerrit.server.notedb.NoteDbTable.CHANGES;
+import static java.util.stream.Collectors.joining;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.base.Enums;
+import com.google.common.base.Splitter;
+import com.google.common.collect.HashBasedTable;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableTable;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.collect.Sets;
+import com.google.common.collect.Table;
+import com.google.common.collect.Tables;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.primitives.Ints;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.SubmitRecord;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.metrics.Timer1;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.LabelId;
+import com.google.gerrit.reviewdb.client.PatchLineComment;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.client.RevId;
+import com.google.gerrit.reviewdb.server.ReviewDbUtil;
+import com.google.gerrit.server.ReviewerByEmailSet;
+import com.google.gerrit.server.ReviewerSet;
+import com.google.gerrit.server.ReviewerStatusUpdate;
+import com.google.gerrit.server.notedb.ChangeNotesCommit.ChangeNotesRevWalk;
+import com.google.gerrit.server.util.LabelVote;
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.sql.Timestamp;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.function.Function;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.InvalidObjectIdException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.notes.NoteMap;
+import org.eclipse.jgit.revwalk.FooterKey;
+import org.eclipse.jgit.util.GitDateParser;
+import org.eclipse.jgit.util.RawParseUtils;
+
+class ChangeNotesParser {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  // Sentinel RevId indicating a mutable field on a patch set was parsed, but
+  // the parser does not yet know its commit SHA-1.
+  private static final RevId PARTIAL_PATCH_SET = new RevId("INVALID PARTIAL PATCH SET");
+
+  @AutoValue
+  abstract static class ApprovalKey {
+    abstract PatchSet.Id psId();
+
+    abstract Account.Id accountId();
+
+    abstract String label();
+
+    private static ApprovalKey create(PatchSet.Id psId, Account.Id accountId, String label) {
+      return new AutoValue_ChangeNotesParser_ApprovalKey(psId, accountId, label);
+    }
+  }
+
+  // Private final members initialized in the constructor.
+  private final ChangeNoteJson changeNoteJson;
+  private final LegacyChangeNoteRead legacyChangeNoteRead;
+
+  private final NoteDbMetrics metrics;
+  private final Change.Id id;
+  private final ObjectId tip;
+  private final ChangeNotesRevWalk walk;
+
+  // Private final but mutable members initialized in the constructor and filled
+  // in during the parsing process.
+  private final Table<Account.Id, ReviewerStateInternal, Timestamp> reviewers;
+  private final Table<Address, ReviewerStateInternal, Timestamp> reviewersByEmail;
+  private final List<Account.Id> allPastReviewers;
+  private final List<ReviewerStatusUpdate> reviewerUpdates;
+  private final List<SubmitRecord> submitRecords;
+  private final ListMultimap<RevId, Comment> comments;
+  private final Map<PatchSet.Id, PatchSet> patchSets;
+  private final Set<PatchSet.Id> deletedPatchSets;
+  private final Map<PatchSet.Id, PatchSetState> patchSetStates;
+  private final List<PatchSet.Id> currentPatchSets;
+  private final Map<ApprovalKey, PatchSetApproval> approvals;
+  private final List<PatchSetApproval> bufferedApprovals;
+  private final List<ChangeMessage> allChangeMessages;
+
+  // Non-final private members filled in during the parsing process.
+  private String branch;
+  private Change.Status status;
+  private String topic;
+  private Optional<Account.Id> assignee;
+  private List<Account.Id> pastAssignees;
+  private Set<String> hashtags;
+  private Timestamp createdOn;
+  private Timestamp lastUpdatedOn;
+  private Account.Id ownerId;
+  private String changeId;
+  private String subject;
+  private String originalSubject;
+  private String submissionId;
+  private String tag;
+  private RevisionNoteMap<ChangeRevisionNote> revisionNoteMap;
+  private Timestamp readOnlyUntil;
+  private Boolean isPrivate;
+  private Boolean workInProgress;
+  private Boolean previousWorkInProgressFooter;
+  private Boolean hasReviewStarted;
+  private ReviewerSet pendingReviewers;
+  private ReviewerByEmailSet pendingReviewersByEmail;
+  private Change.Id revertOf;
+
+  ChangeNotesParser(
+      Change.Id changeId,
+      ObjectId tip,
+      ChangeNotesRevWalk walk,
+      ChangeNoteJson changeNoteJson,
+      LegacyChangeNoteRead legacyChangeNoteRead,
+      NoteDbMetrics metrics) {
+    this.id = changeId;
+    this.tip = tip;
+    this.walk = walk;
+    this.changeNoteJson = changeNoteJson;
+    this.legacyChangeNoteRead = legacyChangeNoteRead;
+    this.metrics = metrics;
+    approvals = new LinkedHashMap<>();
+    bufferedApprovals = new ArrayList<>();
+    reviewers = HashBasedTable.create();
+    reviewersByEmail = HashBasedTable.create();
+    pendingReviewers = ReviewerSet.empty();
+    pendingReviewersByEmail = ReviewerByEmailSet.empty();
+    allPastReviewers = new ArrayList<>();
+    reviewerUpdates = new ArrayList<>();
+    submitRecords = Lists.newArrayListWithExpectedSize(1);
+    allChangeMessages = new ArrayList<>();
+    comments = MultimapBuilder.hashKeys().arrayListValues().build();
+    patchSets = new HashMap<>();
+    deletedPatchSets = new HashSet<>();
+    patchSetStates = new HashMap<>();
+    currentPatchSets = new ArrayList<>();
+  }
+
+  ChangeNotesState parseAll() throws ConfigInvalidException, IOException {
+    // Don't include initial parse in timer, as this might do more I/O to page
+    // in the block containing most commits. Later reads are not guaranteed to
+    // avoid I/O, but often should.
+    walk.reset();
+    walk.markStart(walk.parseCommit(tip));
+
+    try (Timer1.Context timer = metrics.parseLatency.start(CHANGES)) {
+      ChangeNotesCommit commit;
+      while ((commit = walk.next()) != null) {
+        parse(commit);
+      }
+      if (hasReviewStarted == null) {
+        if (previousWorkInProgressFooter == null) {
+          hasReviewStarted = true;
+        } else {
+          hasReviewStarted = !previousWorkInProgressFooter;
+        }
+      }
+      parseNotes();
+      allPastReviewers.addAll(reviewers.rowKeySet());
+      pruneReviewers();
+      pruneReviewersByEmail();
+
+      updatePatchSetStates();
+      checkMandatoryFooters();
+    }
+
+    return buildState();
+  }
+
+  RevisionNoteMap<ChangeRevisionNote> getRevisionNoteMap() {
+    return revisionNoteMap;
+  }
+
+  private ChangeNotesState buildState() {
+    return ChangeNotesState.create(
+        tip.copy(),
+        id,
+        new Change.Key(changeId),
+        createdOn,
+        lastUpdatedOn,
+        ownerId,
+        branch,
+        buildCurrentPatchSetId(),
+        subject,
+        topic,
+        originalSubject,
+        submissionId,
+        assignee != null ? assignee.orElse(null) : null,
+        status,
+        Sets.newLinkedHashSet(Lists.reverse(pastAssignees)),
+        firstNonNull(hashtags, ImmutableSet.of()),
+        patchSets,
+        buildApprovals(),
+        ReviewerSet.fromTable(Tables.transpose(reviewers)),
+        ReviewerByEmailSet.fromTable(Tables.transpose(reviewersByEmail)),
+        pendingReviewers,
+        pendingReviewersByEmail,
+        allPastReviewers,
+        buildReviewerUpdates(),
+        submitRecords,
+        buildAllMessages(),
+        comments,
+        readOnlyUntil,
+        firstNonNull(isPrivate, false),
+        firstNonNull(workInProgress, false),
+        firstNonNull(hasReviewStarted, true),
+        revertOf);
+  }
+
+  private PatchSet.Id buildCurrentPatchSetId() {
+    // currentPatchSets are in parse order, i.e. newest first. Pick the first
+    // patch set that was marked as current, excluding deleted patch sets.
+    for (PatchSet.Id psId : currentPatchSets) {
+      if (patchSets.containsKey(psId)) {
+        return psId;
+      }
+    }
+    return null;
+  }
+
+  private ListMultimap<PatchSet.Id, PatchSetApproval> buildApprovals() {
+    ListMultimap<PatchSet.Id, PatchSetApproval> result =
+        MultimapBuilder.hashKeys().arrayListValues().build();
+    for (PatchSetApproval a : approvals.values()) {
+      if (!patchSets.containsKey(a.getPatchSetId())) {
+        continue; // Patch set deleted or missing.
+      } else if (allPastReviewers.contains(a.getAccountId())
+          && !reviewers.containsRow(a.getAccountId())) {
+        continue; // Reviewer was explicitly removed.
+      }
+      result.put(a.getPatchSetId(), a);
+    }
+    result.keySet().forEach(k -> result.get(k).sort(ChangeNotes.PSA_BY_TIME));
+    return result;
+  }
+
+  private List<ReviewerStatusUpdate> buildReviewerUpdates() {
+    List<ReviewerStatusUpdate> result = new ArrayList<>();
+    HashMap<Account.Id, ReviewerStateInternal> lastState = new HashMap<>();
+    for (ReviewerStatusUpdate u : Lists.reverse(reviewerUpdates)) {
+      if (!Objects.equals(ownerId, u.reviewer()) && lastState.get(u.reviewer()) != u.state()) {
+        result.add(u);
+        lastState.put(u.reviewer(), u.state());
+      }
+    }
+    return result;
+  }
+
+  private List<ChangeMessage> buildAllMessages() {
+    return Lists.reverse(allChangeMessages);
+  }
+
+  private void parse(ChangeNotesCommit commit) throws ConfigInvalidException {
+    Timestamp ts = new Timestamp(commit.getCommitterIdent().getWhen().getTime());
+
+    createdOn = ts;
+    parseTag(commit);
+
+    if (branch == null) {
+      branch = parseBranch(commit);
+    }
+
+    PatchSet.Id psId = parsePatchSetId(commit);
+    PatchSetState psState = parsePatchSetState(commit);
+    if (psState != null) {
+      if (!patchSetStates.containsKey(psId)) {
+        patchSetStates.put(psId, psState);
+      }
+      if (psState == PatchSetState.DELETED) {
+        deletedPatchSets.add(psId);
+      }
+    }
+
+    Account.Id accountId = parseIdent(commit);
+    if (accountId != null) {
+      ownerId = accountId;
+    }
+    Account.Id realAccountId = parseRealAccountId(commit, accountId);
+
+    if (changeId == null) {
+      changeId = parseChangeId(commit);
+    }
+
+    String currSubject = parseSubject(commit);
+    if (currSubject != null) {
+      if (subject == null) {
+        subject = currSubject;
+      }
+      originalSubject = currSubject;
+    }
+
+    parseChangeMessage(psId, accountId, realAccountId, commit, ts);
+    if (topic == null) {
+      topic = parseTopic(commit);
+    }
+
+    parseHashtags(commit);
+    parseAssignee(commit);
+
+    if (submissionId == null) {
+      submissionId = parseSubmissionId(commit);
+    }
+
+    ObjectId currRev = parseRevision(commit);
+    if (currRev != null) {
+      parsePatchSet(psId, currRev, accountId, ts);
+    }
+    parseGroups(psId, commit);
+    parseCurrentPatchSet(psId, commit);
+
+    if (submitRecords.isEmpty()) {
+      // Only parse the most recent set of submit records; any older ones are
+      // still there, but not currently used.
+      parseSubmitRecords(commit.getFooterLineValues(FOOTER_SUBMITTED_WITH));
+    }
+
+    if (status == null) {
+      status = parseStatus(commit);
+    }
+
+    // Parse approvals after status to treat approvals in the same commit as
+    // "Status: merged" as non-post-submit.
+    for (String line : commit.getFooterLineValues(FOOTER_LABEL)) {
+      parseApproval(psId, accountId, realAccountId, ts, line);
+    }
+
+    for (ReviewerStateInternal state : ReviewerStateInternal.values()) {
+      for (String line : commit.getFooterLineValues(state.getFooterKey())) {
+        parseReviewer(ts, state, line);
+      }
+      for (String line : commit.getFooterLineValues(state.getByEmailFooterKey())) {
+        parseReviewerByEmail(ts, state, line);
+      }
+      // Don't update timestamp when a reviewer was added, matching RevewDb
+      // behavior.
+    }
+
+    if (readOnlyUntil == null) {
+      parseReadOnlyUntil(commit);
+    }
+
+    if (isPrivate == null) {
+      parseIsPrivate(commit);
+    }
+
+    if (revertOf == null) {
+      revertOf = parseRevertOf(commit);
+    }
+
+    previousWorkInProgressFooter = null;
+    parseWorkInProgress(commit);
+
+    if (lastUpdatedOn == null || ts.after(lastUpdatedOn)) {
+      lastUpdatedOn = ts;
+    }
+
+    parseDescription(psId, commit);
+  }
+
+  private String parseSubmissionId(ChangeNotesCommit commit) throws ConfigInvalidException {
+    return parseOneFooter(commit, FOOTER_SUBMISSION_ID);
+  }
+
+  private String parseBranch(ChangeNotesCommit commit) throws ConfigInvalidException {
+    String branch = parseOneFooter(commit, FOOTER_BRANCH);
+    return branch != null ? RefNames.fullName(branch) : null;
+  }
+
+  private String parseChangeId(ChangeNotesCommit commit) throws ConfigInvalidException {
+    return parseOneFooter(commit, FOOTER_CHANGE_ID);
+  }
+
+  private String parseSubject(ChangeNotesCommit commit) throws ConfigInvalidException {
+    return parseOneFooter(commit, FOOTER_SUBJECT);
+  }
+
+  private Account.Id parseRealAccountId(ChangeNotesCommit commit, Account.Id effectiveAccountId)
+      throws ConfigInvalidException {
+    String realUser = parseOneFooter(commit, FOOTER_REAL_USER);
+    if (realUser == null) {
+      return effectiveAccountId;
+    }
+    PersonIdent ident = RawParseUtils.parsePersonIdent(realUser);
+    return legacyChangeNoteRead.parseIdent(ident, id);
+  }
+
+  private String parseTopic(ChangeNotesCommit commit) throws ConfigInvalidException {
+    return parseOneFooter(commit, FOOTER_TOPIC);
+  }
+
+  private String parseOneFooter(ChangeNotesCommit commit, FooterKey footerKey)
+      throws ConfigInvalidException {
+    List<String> footerLines = commit.getFooterLineValues(footerKey);
+    if (footerLines.isEmpty()) {
+      return null;
+    } else if (footerLines.size() > 1) {
+      throw expectedOneFooter(footerKey, footerLines);
+    }
+    return footerLines.get(0);
+  }
+
+  private String parseExactlyOneFooter(ChangeNotesCommit commit, FooterKey footerKey)
+      throws ConfigInvalidException {
+    String line = parseOneFooter(commit, footerKey);
+    if (line == null) {
+      throw expectedOneFooter(footerKey, Collections.<String>emptyList());
+    }
+    return line;
+  }
+
+  private ObjectId parseRevision(ChangeNotesCommit commit) throws ConfigInvalidException {
+    String sha = parseOneFooter(commit, FOOTER_COMMIT);
+    if (sha == null) {
+      return null;
+    }
+    try {
+      return ObjectId.fromString(sha);
+    } catch (InvalidObjectIdException e) {
+      ConfigInvalidException cie = invalidFooter(FOOTER_COMMIT, sha);
+      cie.initCause(e);
+      throw cie;
+    }
+  }
+
+  private void parsePatchSet(PatchSet.Id psId, ObjectId rev, Account.Id accountId, Timestamp ts)
+      throws ConfigInvalidException {
+    if (accountId == null) {
+      throw parseException("patch set %s requires an identified user as uploader", psId.get());
+    }
+    PatchSet ps = patchSets.get(psId);
+    if (ps == null) {
+      ps = new PatchSet(psId);
+      patchSets.put(psId, ps);
+    } else if (!ps.getRevision().equals(PARTIAL_PATCH_SET)) {
+      if (deletedPatchSets.contains(psId)) {
+        // Do not update PS details as PS was deleted and this meta data is of
+        // no relevance
+        return;
+      }
+      throw new ConfigInvalidException(
+          String.format(
+              "Multiple revisions parsed for patch set %s: %s and %s",
+              psId.get(), patchSets.get(psId).getRevision(), rev.name()));
+    }
+    ps.setRevision(new RevId(rev.name()));
+    ps.setUploader(accountId);
+    ps.setCreatedOn(ts);
+  }
+
+  private void parseGroups(PatchSet.Id psId, ChangeNotesCommit commit)
+      throws ConfigInvalidException {
+    String groupsStr = parseOneFooter(commit, FOOTER_GROUPS);
+    if (groupsStr == null) {
+      return;
+    }
+    PatchSet ps = patchSets.get(psId);
+    if (ps == null) {
+      ps = new PatchSet(psId);
+      ps.setRevision(PARTIAL_PATCH_SET);
+      patchSets.put(psId, ps);
+    } else if (!ps.getGroups().isEmpty()) {
+      return;
+    }
+    ps.setGroups(PatchSet.splitGroups(groupsStr));
+  }
+
+  private void parseCurrentPatchSet(PatchSet.Id psId, ChangeNotesCommit commit)
+      throws ConfigInvalidException {
+    // This commit implies a new current patch set if either it creates a new
+    // patch set, or sets the current field explicitly.
+    boolean current = false;
+    if (parseOneFooter(commit, FOOTER_COMMIT) != null) {
+      current = true;
+    } else {
+      String currentStr = parseOneFooter(commit, FOOTER_CURRENT);
+      if (Boolean.TRUE.toString().equalsIgnoreCase(currentStr)) {
+        current = true;
+      } else if (currentStr != null) {
+        // Only "true" is allowed; unsetting the current patch set makes no
+        // sense.
+        throw invalidFooter(FOOTER_CURRENT, currentStr);
+      }
+    }
+    if (current) {
+      currentPatchSets.add(psId);
+    }
+  }
+
+  private void parseHashtags(ChangeNotesCommit commit) throws ConfigInvalidException {
+    // Commits are parsed in reverse order and only the last set of hashtags
+    // should be used.
+    if (hashtags != null) {
+      return;
+    }
+    List<String> hashtagsLines = commit.getFooterLineValues(FOOTER_HASHTAGS);
+    if (hashtagsLines.isEmpty()) {
+      return;
+    } else if (hashtagsLines.size() > 1) {
+      throw expectedOneFooter(FOOTER_HASHTAGS, hashtagsLines);
+    } else if (hashtagsLines.get(0).isEmpty()) {
+      hashtags = ImmutableSet.of();
+    } else {
+      hashtags = Sets.newHashSet(Splitter.on(',').split(hashtagsLines.get(0)));
+    }
+  }
+
+  private void parseAssignee(ChangeNotesCommit commit) throws ConfigInvalidException {
+    if (pastAssignees == null) {
+      pastAssignees = Lists.newArrayList();
+    }
+    String assigneeValue = parseOneFooter(commit, FOOTER_ASSIGNEE);
+    if (assigneeValue != null) {
+      Optional<Account.Id> parsedAssignee;
+      if (assigneeValue.equals("")) {
+        // Empty footer found, assignee deleted
+        parsedAssignee = Optional.empty();
+      } else {
+        PersonIdent ident = RawParseUtils.parsePersonIdent(assigneeValue);
+        parsedAssignee = Optional.ofNullable(legacyChangeNoteRead.parseIdent(ident, id));
+      }
+      if (assignee == null) {
+        assignee = parsedAssignee;
+      }
+      if (parsedAssignee.isPresent()) {
+        pastAssignees.add(parsedAssignee.get());
+      }
+    }
+  }
+
+  private void parseTag(ChangeNotesCommit commit) throws ConfigInvalidException {
+    tag = null;
+    List<String> tagLines = commit.getFooterLineValues(FOOTER_TAG);
+    if (tagLines.isEmpty()) {
+      return;
+    } else if (tagLines.size() == 1) {
+      tag = tagLines.get(0);
+    } else {
+      throw expectedOneFooter(FOOTER_TAG, tagLines);
+    }
+  }
+
+  private Change.Status parseStatus(ChangeNotesCommit commit) throws ConfigInvalidException {
+    List<String> statusLines = commit.getFooterLineValues(FOOTER_STATUS);
+    if (statusLines.isEmpty()) {
+      return null;
+    } else if (statusLines.size() > 1) {
+      throw expectedOneFooter(FOOTER_STATUS, statusLines);
+    }
+    Change.Status status =
+        Enums.getIfPresent(Change.Status.class, statusLines.get(0).toUpperCase()).orNull();
+    if (status == null) {
+      throw invalidFooter(FOOTER_STATUS, statusLines.get(0));
+    }
+    // All approvals after MERGED and before the next status change get the postSubmit
+    // bit. (Currently the state can't change from MERGED to something else, but just in case.) The
+    // exception is the legacy SUBM approval, which is never considered post-submit, but might end
+    // up sorted after the submit during rebuilding.
+    if (status == Change.Status.MERGED) {
+      for (PatchSetApproval psa : bufferedApprovals) {
+        if (!psa.isLegacySubmit()) {
+          psa.setPostSubmit(true);
+        }
+      }
+    }
+    bufferedApprovals.clear();
+    return status;
+  }
+
+  private PatchSet.Id parsePatchSetId(ChangeNotesCommit commit) throws ConfigInvalidException {
+    String psIdLine = parseExactlyOneFooter(commit, FOOTER_PATCH_SET);
+    int s = psIdLine.indexOf(' ');
+    String psIdStr = s < 0 ? psIdLine : psIdLine.substring(0, s);
+    Integer psId = Ints.tryParse(psIdStr);
+    if (psId == null) {
+      throw invalidFooter(FOOTER_PATCH_SET, psIdStr);
+    }
+    return new PatchSet.Id(id, psId);
+  }
+
+  private PatchSetState parsePatchSetState(ChangeNotesCommit commit) throws ConfigInvalidException {
+    String psIdLine = parseExactlyOneFooter(commit, FOOTER_PATCH_SET);
+    int s = psIdLine.indexOf(' ');
+    if (s < 0) {
+      return null;
+    }
+    String withParens = psIdLine.substring(s + 1);
+    if (withParens.startsWith("(") && withParens.endsWith(")")) {
+      PatchSetState state =
+          Enums.getIfPresent(
+                  PatchSetState.class,
+                  withParens.substring(1, withParens.length() - 1).toUpperCase())
+              .orNull();
+      if (state != null) {
+        return state;
+      }
+    }
+    throw invalidFooter(FOOTER_PATCH_SET, psIdLine);
+  }
+
+  private void parseDescription(PatchSet.Id psId, ChangeNotesCommit commit)
+      throws ConfigInvalidException {
+    List<String> descLines = commit.getFooterLineValues(FOOTER_PATCH_SET_DESCRIPTION);
+    if (descLines.isEmpty()) {
+      return;
+    } else if (descLines.size() == 1) {
+      String desc = descLines.get(0).trim();
+      PatchSet ps = patchSets.get(psId);
+      if (ps == null) {
+        ps = new PatchSet(psId);
+        ps.setRevision(PARTIAL_PATCH_SET);
+        patchSets.put(psId, ps);
+      }
+      if (ps.getDescription() == null) {
+        ps.setDescription(desc);
+      }
+    } else {
+      throw expectedOneFooter(FOOTER_PATCH_SET_DESCRIPTION, descLines);
+    }
+  }
+
+  private void parseChangeMessage(
+      PatchSet.Id psId,
+      Account.Id accountId,
+      Account.Id realAccountId,
+      ChangeNotesCommit commit,
+      Timestamp ts) {
+    Optional<String> changeMsgString = getChangeMessageString(commit);
+    if (!changeMsgString.isPresent()) {
+      return;
+    }
+
+    ChangeMessage changeMessage =
+        new ChangeMessage(
+            new ChangeMessage.Key(psId.getParentKey(), commit.name()), accountId, ts, psId);
+    changeMessage.setMessage(changeMsgString.get());
+    changeMessage.setTag(tag);
+    changeMessage.setRealAuthor(realAccountId);
+    allChangeMessages.add(changeMessage);
+  }
+
+  public static Optional<String> getChangeMessageString(ChangeNotesCommit commit) {
+    byte[] raw = commit.getRawBuffer();
+    Charset enc = RawParseUtils.parseEncoding(raw);
+
+    Optional<ChangeNoteUtil.CommitMessageRange> range = parseCommitMessageRange(commit);
+    return range.map(
+        commitMessageRange ->
+            RawParseUtils.decode(
+                enc,
+                raw,
+                commitMessageRange.changeMessageStart(),
+                commitMessageRange.changeMessageEnd() + 1));
+  }
+
+  private void parseNotes() throws IOException, ConfigInvalidException {
+    ObjectReader reader = walk.getObjectReader();
+    ChangeNotesCommit tipCommit = walk.parseCommit(tip);
+    revisionNoteMap =
+        RevisionNoteMap.parse(
+            changeNoteJson,
+            legacyChangeNoteRead,
+            id,
+            reader,
+            NoteMap.read(reader, tipCommit),
+            PatchLineComment.Status.PUBLISHED);
+    Map<RevId, ChangeRevisionNote> rns = revisionNoteMap.revisionNotes;
+
+    for (Map.Entry<RevId, ChangeRevisionNote> e : rns.entrySet()) {
+      for (Comment c : e.getValue().getComments()) {
+        comments.put(e.getKey(), c);
+      }
+    }
+
+    for (PatchSet ps : patchSets.values()) {
+      ChangeRevisionNote rn = rns.get(ps.getRevision());
+      if (rn != null && rn.getPushCert() != null) {
+        ps.setPushCertificate(rn.getPushCert());
+      }
+    }
+  }
+
+  private void parseApproval(
+      PatchSet.Id psId, Account.Id accountId, Account.Id realAccountId, Timestamp ts, String line)
+      throws ConfigInvalidException {
+    if (accountId == null) {
+      throw parseException("patch set %s requires an identified user as uploader", psId.get());
+    }
+    PatchSetApproval psa;
+    if (line.startsWith("-")) {
+      psa = parseRemoveApproval(psId, accountId, realAccountId, ts, line);
+    } else {
+      psa = parseAddApproval(psId, accountId, realAccountId, ts, line);
+    }
+    bufferedApprovals.add(psa);
+  }
+
+  private PatchSetApproval parseAddApproval(
+      PatchSet.Id psId, Account.Id committerId, Account.Id realAccountId, Timestamp ts, String line)
+      throws ConfigInvalidException {
+    // There are potentially 3 accounts involved here:
+    //  1. The account from the commit, which is the effective IdentifiedUser
+    //     that produced the update.
+    //  2. The account in the label footer itself, which is used during submit
+    //     to copy other users' labels to a new patch set.
+    //  3. The account in the Real-user footer, indicating that the whole
+    //     update operation was executed by this user on behalf of the effective
+    //     user.
+    Account.Id effectiveAccountId;
+    String labelVoteStr;
+    int s = line.indexOf(' ');
+    if (s > 0) {
+      // Account in the label line (2) becomes the effective ID of the
+      // approval. If there is a real user (3) different from the commit user
+      // (2), we actually don't store that anywhere in this case; it's more
+      // important to record that the real user (3) actually initiated submit.
+      labelVoteStr = line.substring(0, s);
+      PersonIdent ident = RawParseUtils.parsePersonIdent(line.substring(s + 1));
+      checkFooter(ident != null, FOOTER_LABEL, line);
+      effectiveAccountId = legacyChangeNoteRead.parseIdent(ident, id);
+    } else {
+      labelVoteStr = line;
+      effectiveAccountId = committerId;
+    }
+
+    LabelVote l;
+    try {
+      l = LabelVote.parseWithEquals(labelVoteStr);
+    } catch (IllegalArgumentException e) {
+      ConfigInvalidException pe = parseException("invalid %s: %s", FOOTER_LABEL, line);
+      pe.initCause(e);
+      throw pe;
+    }
+
+    PatchSetApproval psa =
+        new PatchSetApproval(
+            new PatchSetApproval.Key(psId, effectiveAccountId, new LabelId(l.label())),
+            l.value(),
+            ts);
+    psa.setTag(tag);
+    if (!Objects.equals(realAccountId, committerId)) {
+      psa.setRealAccountId(realAccountId);
+    }
+    ApprovalKey k = ApprovalKey.create(psId, effectiveAccountId, l.label());
+    if (!approvals.containsKey(k)) {
+      approvals.put(k, psa);
+    }
+    return psa;
+  }
+
+  private PatchSetApproval parseRemoveApproval(
+      PatchSet.Id psId, Account.Id committerId, Account.Id realAccountId, Timestamp ts, String line)
+      throws ConfigInvalidException {
+    // See comments in parseAddApproval about the various users involved.
+    Account.Id effectiveAccountId;
+    String label;
+    int s = line.indexOf(' ');
+    if (s > 0) {
+      label = line.substring(1, s);
+      PersonIdent ident = RawParseUtils.parsePersonIdent(line.substring(s + 1));
+      checkFooter(ident != null, FOOTER_LABEL, line);
+      effectiveAccountId = legacyChangeNoteRead.parseIdent(ident, id);
+    } else {
+      label = line.substring(1);
+      effectiveAccountId = committerId;
+    }
+
+    try {
+      LabelType.checkNameInternal(label);
+    } catch (IllegalArgumentException e) {
+      ConfigInvalidException pe = parseException("invalid %s: %s", FOOTER_LABEL, line);
+      pe.initCause(e);
+      throw pe;
+    }
+
+    // Store an actual 0-vote approval in the map for a removed approval, for
+    // several reasons:
+    //  - This is closer to the ReviewDb representation, which leads to less
+    //    confusion and special-casing of NoteDb.
+    //  - More importantly, ApprovalCopier needs an actual approval in order to
+    //    block copying an earlier approval over a later delete.
+    PatchSetApproval remove =
+        new PatchSetApproval(
+            new PatchSetApproval.Key(psId, effectiveAccountId, new LabelId(label)), (short) 0, ts);
+    if (!Objects.equals(realAccountId, committerId)) {
+      remove.setRealAccountId(realAccountId);
+    }
+    ApprovalKey k = ApprovalKey.create(psId, effectiveAccountId, label);
+    if (!approvals.containsKey(k)) {
+      approvals.put(k, remove);
+    }
+    return remove;
+  }
+
+  private void parseSubmitRecords(List<String> lines) throws ConfigInvalidException {
+    SubmitRecord rec = null;
+
+    for (String line : lines) {
+      int c = line.indexOf(": ");
+      if (c < 0) {
+        rec = new SubmitRecord();
+        submitRecords.add(rec);
+        int s = line.indexOf(' ');
+        String statusStr = s >= 0 ? line.substring(0, s) : line;
+        rec.status = Enums.getIfPresent(SubmitRecord.Status.class, statusStr).orNull();
+        checkFooter(rec.status != null, FOOTER_SUBMITTED_WITH, line);
+        if (s >= 0) {
+          rec.errorMessage = line.substring(s);
+        }
+      } else {
+        checkFooter(rec != null, FOOTER_SUBMITTED_WITH, line);
+        SubmitRecord.Label label = new SubmitRecord.Label();
+        if (rec.labels == null) {
+          rec.labels = new ArrayList<>();
+        }
+        rec.labels.add(label);
+
+        label.status =
+            Enums.getIfPresent(SubmitRecord.Label.Status.class, line.substring(0, c)).orNull();
+        checkFooter(label.status != null, FOOTER_SUBMITTED_WITH, line);
+        int c2 = line.indexOf(": ", c + 2);
+        if (c2 >= 0) {
+          label.label = line.substring(c + 2, c2);
+          PersonIdent ident = RawParseUtils.parsePersonIdent(line.substring(c2 + 2));
+          checkFooter(ident != null, FOOTER_SUBMITTED_WITH, line);
+          label.appliedBy = legacyChangeNoteRead.parseIdent(ident, id);
+        } else {
+          label.label = line.substring(c + 2);
+        }
+      }
+    }
+  }
+
+  private Account.Id parseIdent(ChangeNotesCommit commit) throws ConfigInvalidException {
+    // Check if the author name/email is the same as the committer name/email,
+    // i.e. was the server ident at the time this commit was made.
+    PersonIdent a = commit.getAuthorIdent();
+    PersonIdent c = commit.getCommitterIdent();
+    if (a.getName().equals(c.getName()) && a.getEmailAddress().equals(c.getEmailAddress())) {
+      return null;
+    }
+    return legacyChangeNoteRead.parseIdent(commit.getAuthorIdent(), id);
+  }
+
+  private void parseReviewer(Timestamp ts, ReviewerStateInternal state, String line)
+      throws ConfigInvalidException {
+    PersonIdent ident = RawParseUtils.parsePersonIdent(line);
+    if (ident == null) {
+      throw invalidFooter(state.getFooterKey(), line);
+    }
+    Account.Id accountId = legacyChangeNoteRead.parseIdent(ident, id);
+    reviewerUpdates.add(ReviewerStatusUpdate.create(ts, ownerId, accountId, state));
+    if (!reviewers.containsRow(accountId)) {
+      reviewers.put(accountId, state, ts);
+    }
+  }
+
+  private void parseReviewerByEmail(Timestamp ts, ReviewerStateInternal state, String line)
+      throws ConfigInvalidException {
+    Address adr;
+    try {
+      adr = Address.parse(line);
+    } catch (IllegalArgumentException e) {
+      throw invalidFooter(state.getByEmailFooterKey(), line);
+    }
+    if (!reviewersByEmail.containsRow(adr)) {
+      reviewersByEmail.put(adr, state, ts);
+    }
+  }
+
+  private void parseReadOnlyUntil(ChangeNotesCommit commit) throws ConfigInvalidException {
+    String raw = parseOneFooter(commit, FOOTER_READ_ONLY_UNTIL);
+    if (raw == null) {
+      return;
+    }
+    try {
+      readOnlyUntil = new Timestamp(GitDateParser.parse(raw, null, Locale.US).getTime());
+    } catch (ParseException e) {
+      ConfigInvalidException cie = invalidFooter(FOOTER_READ_ONLY_UNTIL, raw);
+      cie.initCause(e);
+      throw cie;
+    }
+  }
+
+  private void parseIsPrivate(ChangeNotesCommit commit) throws ConfigInvalidException {
+    String raw = parseOneFooter(commit, FOOTER_PRIVATE);
+    if (raw == null) {
+      return;
+    } else if (Boolean.TRUE.toString().equalsIgnoreCase(raw)) {
+      isPrivate = true;
+      return;
+    } else if (Boolean.FALSE.toString().equalsIgnoreCase(raw)) {
+      isPrivate = false;
+      return;
+    }
+    throw invalidFooter(FOOTER_PRIVATE, raw);
+  }
+
+  private void parseWorkInProgress(ChangeNotesCommit commit) throws ConfigInvalidException {
+    String raw = parseOneFooter(commit, FOOTER_WORK_IN_PROGRESS);
+    if (raw == null) {
+      // No change to WIP state in this revision.
+      previousWorkInProgressFooter = null;
+      return;
+    } else if (Boolean.TRUE.toString().equalsIgnoreCase(raw)) {
+      // This revision moves the change into WIP.
+      previousWorkInProgressFooter = true;
+      if (workInProgress == null) {
+        // Because this is the first time workInProgress is being set, we know
+        // that this change's current state is WIP. All the reviewer updates
+        // we've seen so far are pending, so take a snapshot of the reviewers
+        // and reviewersByEmail tables.
+        pendingReviewers =
+            ReviewerSet.fromTable(Tables.transpose(ImmutableTable.copyOf(reviewers)));
+        pendingReviewersByEmail =
+            ReviewerByEmailSet.fromTable(Tables.transpose(ImmutableTable.copyOf(reviewersByEmail)));
+        workInProgress = true;
+      }
+      return;
+    } else if (Boolean.FALSE.toString().equalsIgnoreCase(raw)) {
+      previousWorkInProgressFooter = false;
+      hasReviewStarted = true;
+      if (workInProgress == null) {
+        workInProgress = false;
+      }
+      return;
+    }
+    throw invalidFooter(FOOTER_WORK_IN_PROGRESS, raw);
+  }
+
+  private Change.Id parseRevertOf(ChangeNotesCommit commit) throws ConfigInvalidException {
+    String footer = parseOneFooter(commit, FOOTER_REVERT_OF);
+    if (footer == null) {
+      return null;
+    }
+    Integer revertOf = Ints.tryParse(footer);
+    if (revertOf == null) {
+      throw invalidFooter(FOOTER_REVERT_OF, footer);
+    }
+    return new Change.Id(revertOf);
+  }
+
+  private void pruneReviewers() {
+    Iterator<Table.Cell<Account.Id, ReviewerStateInternal, Timestamp>> rit =
+        reviewers.cellSet().iterator();
+    while (rit.hasNext()) {
+      Table.Cell<Account.Id, ReviewerStateInternal, Timestamp> e = rit.next();
+      if (e.getColumnKey() == ReviewerStateInternal.REMOVED) {
+        rit.remove();
+      }
+    }
+  }
+
+  private void pruneReviewersByEmail() {
+    Iterator<Table.Cell<Address, ReviewerStateInternal, Timestamp>> rit =
+        reviewersByEmail.cellSet().iterator();
+    while (rit.hasNext()) {
+      Table.Cell<Address, ReviewerStateInternal, Timestamp> e = rit.next();
+      if (e.getColumnKey() == ReviewerStateInternal.REMOVED) {
+        rit.remove();
+      }
+    }
+  }
+
+  private void updatePatchSetStates() {
+    Set<PatchSet.Id> missing = new TreeSet<>(ReviewDbUtil.intKeyOrdering());
+    for (Iterator<PatchSet> it = patchSets.values().iterator(); it.hasNext(); ) {
+      PatchSet ps = it.next();
+      if (ps.getRevision().equals(PARTIAL_PATCH_SET)) {
+        missing.add(ps.getId());
+        it.remove();
+      }
+    }
+    for (Map.Entry<PatchSet.Id, PatchSetState> e : patchSetStates.entrySet()) {
+      switch (e.getValue()) {
+        case PUBLISHED:
+        default:
+          break;
+
+        case DELETED:
+          patchSets.remove(e.getKey());
+          break;
+      }
+    }
+
+    // Post-process other collections to remove items corresponding to deleted
+    // (or otherwise missing) patch sets. This is safer than trying to prevent
+    // insertion, as it will also filter out items racily added after the patch
+    // set was deleted.
+    int pruned =
+        pruneEntitiesForMissingPatchSets(allChangeMessages, ChangeMessage::getPatchSetId, missing);
+    pruned +=
+        pruneEntitiesForMissingPatchSets(
+            comments.values(), c -> new PatchSet.Id(id, c.key.patchSetId), missing);
+    pruned +=
+        pruneEntitiesForMissingPatchSets(
+            approvals.values(), PatchSetApproval::getPatchSetId, missing);
+
+    if (!missing.isEmpty()) {
+      logger.atWarning().log(
+          "ignoring %s additional entities due to missing patch sets: %s", pruned, missing);
+    }
+  }
+
+  private <T> int pruneEntitiesForMissingPatchSets(
+      Iterable<T> ents, Function<T, PatchSet.Id> psIdFunc, Set<PatchSet.Id> missing) {
+    int pruned = 0;
+    for (Iterator<T> it = ents.iterator(); it.hasNext(); ) {
+      PatchSet.Id psId = psIdFunc.apply(it.next());
+      if (!patchSets.containsKey(psId)) {
+        pruned++;
+        missing.add(psId);
+        it.remove();
+      } else if (deletedPatchSets.contains(psId)) {
+        it.remove(); // Not an error we need to report, don't increment pruned.
+      }
+    }
+    return pruned;
+  }
+
+  private void checkMandatoryFooters() throws ConfigInvalidException {
+    List<FooterKey> missing = new ArrayList<>();
+    if (branch == null) {
+      missing.add(FOOTER_BRANCH);
+    }
+    if (changeId == null) {
+      missing.add(FOOTER_CHANGE_ID);
+    }
+    if (originalSubject == null || subject == null) {
+      missing.add(FOOTER_SUBJECT);
+    }
+    if (!missing.isEmpty()) {
+      throw parseException(
+          "Missing footers: " + missing.stream().map(FooterKey::getName).collect(joining(", ")));
+    }
+  }
+
+  private ConfigInvalidException expectedOneFooter(FooterKey footer, List<String> actual) {
+    return parseException("missing or multiple %s: %s", footer.getName(), actual);
+  }
+
+  private ConfigInvalidException invalidFooter(FooterKey footer, String actual) {
+    return parseException("invalid %s: %s", footer.getName(), actual);
+  }
+
+  private void checkFooter(boolean expr, FooterKey footer, String actual)
+      throws ConfigInvalidException {
+    if (!expr) {
+      throw invalidFooter(footer, actual);
+    }
+  }
+
+  private ConfigInvalidException parseException(String fmt, Object... args) {
+    return ChangeNotes.parseException(id, fmt, args);
+  }
+}
diff --git a/java/com/google/gerrit/server/notedb/ChangeNotesState.java b/java/com/google/gerrit/server/notedb/ChangeNotesState.java
new file mode 100644
index 0000000..02fe416
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/ChangeNotesState.java
@@ -0,0 +1,684 @@
+// 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.
+
+package com.google.gerrit.server.notedb;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static com.google.common.collect.ImmutableListMultimap.toImmutableListMultimap;
+import static com.google.common.collect.ImmutableSet.toImmutableSet;
+import static com.google.gerrit.reviewdb.server.ReviewDbCodecs.APPROVAL_CODEC;
+import static com.google.gerrit.reviewdb.server.ReviewDbCodecs.MESSAGE_CODEC;
+import static com.google.gerrit.reviewdb.server.ReviewDbCodecs.PATCH_SET_CODEC;
+import static com.google.gerrit.server.cache.serialize.ProtoCacheSerializers.toByteString;
+import static java.util.Objects.requireNonNull;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Converter;
+import com.google.common.base.Enums;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableTable;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Table;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.SubmitRecord;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RevId;
+import com.google.gerrit.server.OutputFormat;
+import com.google.gerrit.server.ReviewerByEmailSet;
+import com.google.gerrit.server.ReviewerSet;
+import com.google.gerrit.server.ReviewerStatusUpdate;
+import com.google.gerrit.server.cache.proto.Cache.ChangeNotesStateProto;
+import com.google.gerrit.server.cache.proto.Cache.ChangeNotesStateProto.ChangeColumnsProto;
+import com.google.gerrit.server.cache.proto.Cache.ChangeNotesStateProto.ReviewerByEmailSetEntryProto;
+import com.google.gerrit.server.cache.proto.Cache.ChangeNotesStateProto.ReviewerSetEntryProto;
+import com.google.gerrit.server.cache.proto.Cache.ChangeNotesStateProto.ReviewerStatusUpdateProto;
+import com.google.gerrit.server.cache.serialize.CacheSerializer;
+import com.google.gerrit.server.cache.serialize.ProtoCacheSerializers;
+import com.google.gerrit.server.cache.serialize.ProtoCacheSerializers.ObjectIdConverter;
+import com.google.gerrit.server.index.change.ChangeField.StoredSubmitRecord;
+import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
+import com.google.gson.Gson;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.jgit.lib.ObjectId;
+
+/**
+ * Immutable state associated with a change meta ref at a given commit.
+ *
+ * <p>One instance is the output of a single {@link ChangeNotesParser}, and contains types required
+ * to support public methods on {@link ChangeNotes}. It is intended to be cached in-process.
+ *
+ * <p>Note that {@link ChangeNotes} contains more than just a single {@code ChangeNoteState}, such
+ * as per-draft information, so that class is not cached directly.
+ */
+@AutoValue
+public abstract class ChangeNotesState {
+  static ChangeNotesState empty(Change change) {
+    return Builder.empty(change.getId()).build();
+  }
+
+  static Builder builder() {
+    return new AutoValue_ChangeNotesState.Builder();
+  }
+
+  static ChangeNotesState create(
+      ObjectId metaId,
+      Change.Id changeId,
+      Change.Key changeKey,
+      Timestamp createdOn,
+      Timestamp lastUpdatedOn,
+      Account.Id owner,
+      String branch,
+      @Nullable PatchSet.Id currentPatchSetId,
+      String subject,
+      @Nullable String topic,
+      @Nullable String originalSubject,
+      @Nullable String submissionId,
+      @Nullable Account.Id assignee,
+      @Nullable Change.Status status,
+      Set<Account.Id> pastAssignees,
+      Set<String> hashtags,
+      Map<PatchSet.Id, PatchSet> patchSets,
+      ListMultimap<PatchSet.Id, PatchSetApproval> approvals,
+      ReviewerSet reviewers,
+      ReviewerByEmailSet reviewersByEmail,
+      ReviewerSet pendingReviewers,
+      ReviewerByEmailSet pendingReviewersByEmail,
+      List<Account.Id> allPastReviewers,
+      List<ReviewerStatusUpdate> reviewerUpdates,
+      List<SubmitRecord> submitRecords,
+      List<ChangeMessage> changeMessages,
+      ListMultimap<RevId, Comment> publishedComments,
+      @Nullable Timestamp readOnlyUntil,
+      boolean isPrivate,
+      boolean workInProgress,
+      boolean reviewStarted,
+      @Nullable Change.Id revertOf) {
+    requireNonNull(
+        metaId,
+        () ->
+            String.format(
+                "metaId is required when passing arguments to create(...)."
+                    + " To create an empty %s without"
+                    + " NoteDb data, use empty(...) instead",
+                ChangeNotesState.class.getSimpleName()));
+    return builder()
+        .metaId(metaId)
+        .changeId(changeId)
+        .columns(
+            ChangeColumns.builder()
+                .changeKey(changeKey)
+                .createdOn(createdOn)
+                .lastUpdatedOn(lastUpdatedOn)
+                .owner(owner)
+                .branch(branch)
+                .status(status)
+                .currentPatchSetId(currentPatchSetId)
+                .subject(subject)
+                .topic(topic)
+                .originalSubject(originalSubject)
+                .submissionId(submissionId)
+                .assignee(assignee)
+                .isPrivate(isPrivate)
+                .workInProgress(workInProgress)
+                .reviewStarted(reviewStarted)
+                .revertOf(revertOf)
+                .build())
+        .pastAssignees(pastAssignees)
+        .hashtags(hashtags)
+        .patchSets(patchSets.entrySet())
+        .approvals(approvals.entries())
+        .reviewers(reviewers)
+        .reviewersByEmail(reviewersByEmail)
+        .pendingReviewers(pendingReviewers)
+        .pendingReviewersByEmail(pendingReviewersByEmail)
+        .allPastReviewers(allPastReviewers)
+        .reviewerUpdates(reviewerUpdates)
+        .submitRecords(submitRecords)
+        .changeMessages(changeMessages)
+        .publishedComments(publishedComments)
+        .readOnlyUntil(readOnlyUntil)
+        .build();
+  }
+
+  /**
+   * Subset of Change columns that can be represented in NoteDb.
+   *
+   * <p>Notable exceptions include rowVersion and noteDbState, which are only make sense when read
+   * from NoteDb, so they cannot be cached.
+   *
+   * <p>Fields should match the column names in {@link Change}, and are in listed column order.
+   */
+  @AutoValue
+  abstract static class ChangeColumns {
+    static Builder builder() {
+      return new AutoValue_ChangeNotesState_ChangeColumns.Builder();
+    }
+
+    abstract Change.Key changeKey();
+
+    abstract Timestamp createdOn();
+
+    abstract Timestamp lastUpdatedOn();
+
+    abstract Account.Id owner();
+
+    // Project not included, as it's not stored anywhere in the meta ref.
+    abstract String branch();
+
+    // TODO(dborowitz): Use a sensible default other than null
+    @Nullable
+    abstract Change.Status status();
+
+    @Nullable
+    abstract PatchSet.Id currentPatchSetId();
+
+    abstract String subject();
+
+    @Nullable
+    abstract String topic();
+
+    @Nullable
+    abstract String originalSubject();
+
+    @Nullable
+    abstract String submissionId();
+
+    @Nullable
+    abstract Account.Id assignee();
+
+    abstract boolean isPrivate();
+
+    abstract boolean workInProgress();
+
+    abstract boolean reviewStarted();
+
+    @Nullable
+    abstract Change.Id revertOf();
+
+    abstract Builder toBuilder();
+
+    @AutoValue.Builder
+    abstract static class Builder {
+      abstract Builder changeKey(Change.Key changeKey);
+
+      abstract Builder createdOn(Timestamp createdOn);
+
+      abstract Builder lastUpdatedOn(Timestamp lastUpdatedOn);
+
+      abstract Builder owner(Account.Id owner);
+
+      abstract Builder branch(String branch);
+
+      abstract Builder currentPatchSetId(@Nullable PatchSet.Id currentPatchSetId);
+
+      abstract Builder subject(String subject);
+
+      abstract Builder topic(@Nullable String topic);
+
+      abstract Builder originalSubject(@Nullable String originalSubject);
+
+      abstract Builder submissionId(@Nullable String submissionId);
+
+      abstract Builder assignee(@Nullable Account.Id assignee);
+
+      abstract Builder status(@Nullable Change.Status status);
+
+      abstract Builder isPrivate(boolean isPrivate);
+
+      abstract Builder workInProgress(boolean workInProgress);
+
+      abstract Builder reviewStarted(boolean reviewStarted);
+
+      abstract Builder revertOf(@Nullable Change.Id revertOf);
+
+      abstract ChangeColumns build();
+    }
+  }
+
+  // Only null if NoteDb is disabled.
+  @Nullable
+  abstract ObjectId metaId();
+
+  abstract Change.Id changeId();
+
+  // Only null if NoteDb is disabled.
+  @Nullable
+  abstract ChangeColumns columns();
+
+  // Other related to this Change.
+  abstract ImmutableSet<Account.Id> pastAssignees();
+
+  abstract ImmutableSet<String> hashtags();
+
+  abstract ImmutableList<Map.Entry<PatchSet.Id, PatchSet>> patchSets();
+
+  abstract ImmutableList<Map.Entry<PatchSet.Id, PatchSetApproval>> approvals();
+
+  abstract ReviewerSet reviewers();
+
+  abstract ReviewerByEmailSet reviewersByEmail();
+
+  abstract ReviewerSet pendingReviewers();
+
+  abstract ReviewerByEmailSet pendingReviewersByEmail();
+
+  abstract ImmutableList<Account.Id> allPastReviewers();
+
+  abstract ImmutableList<ReviewerStatusUpdate> reviewerUpdates();
+
+  abstract ImmutableList<SubmitRecord> submitRecords();
+
+  abstract ImmutableList<ChangeMessage> changeMessages();
+
+  abstract ImmutableListMultimap<RevId, Comment> publishedComments();
+
+  @Nullable
+  abstract Timestamp readOnlyUntil();
+
+  Change newChange(Project.NameKey project) {
+    ChangeColumns c = requireNonNull(columns(), "columns are required");
+    Change change =
+        new Change(
+            c.changeKey(),
+            changeId(),
+            c.owner(),
+            new Branch.NameKey(project, c.branch()),
+            c.createdOn());
+    copyNonConstructorColumnsTo(change);
+    change.setNoteDbState(NoteDbChangeState.NOTE_DB_PRIMARY_STATE);
+    return change;
+  }
+
+  void copyColumnsTo(Change change) throws IOException {
+    ChangeColumns c = columns();
+    checkState(
+        c != null && metaId() != null,
+        "missing columns or metaId in ChangeNotesState; is NoteDb enabled? %s",
+        this);
+    checkMetaId(change);
+    change.setKey(c.changeKey());
+    change.setOwner(c.owner());
+    change.setDest(new Branch.NameKey(change.getProject(), c.branch()));
+    change.setCreatedOn(c.createdOn());
+    copyNonConstructorColumnsTo(change);
+  }
+
+  private void checkMetaId(Change change) throws IOException {
+    NoteDbChangeState state = NoteDbChangeState.parse(change);
+    if (state == null) {
+      return; // Can happen during small NoteDb tests.
+    } else if (state.getPrimaryStorage() == PrimaryStorage.NOTE_DB) {
+      return;
+    }
+    checkState(state.getRefState().isPresent(), "expected RefState: %s", state);
+    ObjectId idFromState = state.getRefState().get().changeMetaId();
+    if (!idFromState.equals(metaId())) {
+      throw new IOException(
+          "cannot copy ChangeNotesState into Change "
+              + changeId()
+              + "; this ChangeNotesState was created from "
+              + metaId()
+              + ", but change requires state "
+              + idFromState);
+    }
+  }
+
+  private void copyNonConstructorColumnsTo(Change change) {
+    ChangeColumns c = requireNonNull(columns(), "columns are required");
+    if (c.status() != null) {
+      change.setStatus(c.status());
+    }
+    change.setTopic(Strings.emptyToNull(c.topic()));
+    change.setLastUpdatedOn(c.lastUpdatedOn());
+    change.setSubmissionId(c.submissionId());
+    change.setAssignee(c.assignee());
+    change.setPrivate(c.isPrivate());
+    change.setWorkInProgress(c.workInProgress());
+    change.setReviewStarted(c.reviewStarted());
+    change.setRevertOf(c.revertOf());
+
+    if (!patchSets().isEmpty()) {
+      change.setCurrentPatchSet(c.currentPatchSetId(), c.subject(), c.originalSubject());
+    } else {
+      // TODO(dborowitz): This should be an error, but for now it's required for
+      // some tests to pass.
+      change.clearCurrentPatchSet();
+    }
+  }
+
+  @AutoValue.Builder
+  abstract static class Builder {
+    static Builder empty(Change.Id changeId) {
+      return new AutoValue_ChangeNotesState.Builder()
+          .changeId(changeId)
+          .pastAssignees(ImmutableSet.of())
+          .hashtags(ImmutableSet.of())
+          .patchSets(ImmutableList.of())
+          .approvals(ImmutableList.of())
+          .reviewers(ReviewerSet.empty())
+          .reviewersByEmail(ReviewerByEmailSet.empty())
+          .pendingReviewers(ReviewerSet.empty())
+          .pendingReviewersByEmail(ReviewerByEmailSet.empty())
+          .allPastReviewers(ImmutableList.of())
+          .reviewerUpdates(ImmutableList.of())
+          .submitRecords(ImmutableList.of())
+          .changeMessages(ImmutableList.of())
+          .publishedComments(ImmutableListMultimap.of());
+    }
+
+    abstract Builder metaId(ObjectId metaId);
+
+    abstract Builder changeId(Change.Id changeId);
+
+    abstract Builder columns(ChangeColumns columns);
+
+    abstract Builder pastAssignees(Set<Account.Id> pastAssignees);
+
+    abstract Builder hashtags(Iterable<String> hashtags);
+
+    abstract Builder patchSets(Iterable<Map.Entry<PatchSet.Id, PatchSet>> patchSets);
+
+    abstract Builder approvals(Iterable<Map.Entry<PatchSet.Id, PatchSetApproval>> approvals);
+
+    abstract Builder reviewers(ReviewerSet reviewers);
+
+    abstract Builder reviewersByEmail(ReviewerByEmailSet reviewersByEmail);
+
+    abstract Builder pendingReviewers(ReviewerSet pendingReviewers);
+
+    abstract Builder pendingReviewersByEmail(ReviewerByEmailSet pendingReviewersByEmail);
+
+    abstract Builder allPastReviewers(List<Account.Id> allPastReviewers);
+
+    abstract Builder reviewerUpdates(List<ReviewerStatusUpdate> reviewerUpdates);
+
+    abstract Builder submitRecords(List<SubmitRecord> submitRecords);
+
+    abstract Builder changeMessages(List<ChangeMessage> changeMessages);
+
+    abstract Builder publishedComments(ListMultimap<RevId, Comment> publishedComments);
+
+    abstract Builder readOnlyUntil(@Nullable Timestamp readOnlyUntil);
+
+    abstract ChangeNotesState build();
+  }
+
+  enum Serializer implements CacheSerializer<ChangeNotesState> {
+    INSTANCE;
+
+    @VisibleForTesting static final Gson GSON = OutputFormat.JSON_COMPACT.newGson();
+
+    private static final Converter<String, Change.Status> STATUS_CONVERTER =
+        Enums.stringConverter(Change.Status.class);
+    private static final Converter<String, ReviewerStateInternal> REVIEWER_STATE_CONVERTER =
+        Enums.stringConverter(ReviewerStateInternal.class);
+
+    @Override
+    public byte[] serialize(ChangeNotesState object) {
+      checkArgument(object.metaId() != null, "meta ID is required in: %s", object);
+      checkArgument(object.columns() != null, "ChangeColumns is required in: %s", object);
+      ChangeNotesStateProto.Builder b = ChangeNotesStateProto.newBuilder();
+
+      b.setMetaId(ObjectIdConverter.create().toByteString(object.metaId()))
+          .setChangeId(object.changeId().get())
+          .setColumns(toChangeColumnsProto(object.columns()));
+
+      object.pastAssignees().forEach(a -> b.addPastAssignee(a.get()));
+      object.hashtags().forEach(b::addHashtag);
+      object.patchSets().forEach(e -> b.addPatchSet(toByteString(e.getValue(), PATCH_SET_CODEC)));
+      object.approvals().forEach(e -> b.addApproval(toByteString(e.getValue(), APPROVAL_CODEC)));
+
+      object.reviewers().asTable().cellSet().forEach(c -> b.addReviewer(toReviewerSetEntry(c)));
+      object
+          .reviewersByEmail()
+          .asTable()
+          .cellSet()
+          .forEach(c -> b.addReviewerByEmail(toReviewerByEmailSetEntry(c)));
+      object
+          .pendingReviewers()
+          .asTable()
+          .cellSet()
+          .forEach(c -> b.addPendingReviewer(toReviewerSetEntry(c)));
+      object
+          .pendingReviewersByEmail()
+          .asTable()
+          .cellSet()
+          .forEach(c -> b.addPendingReviewerByEmail(toReviewerByEmailSetEntry(c)));
+
+      object.allPastReviewers().forEach(a -> b.addPastReviewer(a.get()));
+      object.reviewerUpdates().forEach(u -> b.addReviewerUpdate(toReviewerStatusUpdateProto(u)));
+      object
+          .submitRecords()
+          .forEach(r -> b.addSubmitRecord(GSON.toJson(new StoredSubmitRecord(r))));
+      object.changeMessages().forEach(m -> b.addChangeMessage(toByteString(m, MESSAGE_CODEC)));
+      object.publishedComments().values().forEach(c -> b.addPublishedComment(GSON.toJson(c)));
+
+      if (object.readOnlyUntil() != null) {
+        b.setReadOnlyUntil(object.readOnlyUntil().getTime()).setHasReadOnlyUntil(true);
+      }
+
+      return ProtoCacheSerializers.toByteArray(b.build());
+    }
+
+    private static ChangeColumnsProto toChangeColumnsProto(ChangeColumns cols) {
+      ChangeColumnsProto.Builder b =
+          ChangeColumnsProto.newBuilder()
+              .setChangeKey(cols.changeKey().get())
+              .setCreatedOn(cols.createdOn().getTime())
+              .setLastUpdatedOn(cols.lastUpdatedOn().getTime())
+              .setOwner(cols.owner().get())
+              .setBranch(cols.branch());
+      if (cols.currentPatchSetId() != null) {
+        b.setCurrentPatchSetId(cols.currentPatchSetId().get()).setHasCurrentPatchSetId(true);
+      }
+      b.setSubject(cols.subject());
+      if (cols.topic() != null) {
+        b.setTopic(cols.topic()).setHasTopic(true);
+      }
+      if (cols.originalSubject() != null) {
+        b.setOriginalSubject(cols.originalSubject()).setHasOriginalSubject(true);
+      }
+      if (cols.submissionId() != null) {
+        b.setSubmissionId(cols.submissionId()).setHasSubmissionId(true);
+      }
+      if (cols.assignee() != null) {
+        b.setAssignee(cols.assignee().get()).setHasAssignee(true);
+      }
+      if (cols.status() != null) {
+        b.setStatus(STATUS_CONVERTER.reverse().convert(cols.status())).setHasStatus(true);
+      }
+      b.setIsPrivate(cols.isPrivate())
+          .setWorkInProgress(cols.workInProgress())
+          .setReviewStarted(cols.reviewStarted());
+      if (cols.revertOf() != null) {
+        b.setRevertOf(cols.revertOf().get()).setHasRevertOf(true);
+      }
+      return b.build();
+    }
+
+    private static ReviewerSetEntryProto toReviewerSetEntry(
+        Table.Cell<ReviewerStateInternal, Account.Id, Timestamp> c) {
+      return ReviewerSetEntryProto.newBuilder()
+          .setState(REVIEWER_STATE_CONVERTER.reverse().convert(c.getRowKey()))
+          .setAccountId(c.getColumnKey().get())
+          .setTimestamp(c.getValue().getTime())
+          .build();
+    }
+
+    private static ReviewerByEmailSetEntryProto toReviewerByEmailSetEntry(
+        Table.Cell<ReviewerStateInternal, Address, Timestamp> c) {
+      return ReviewerByEmailSetEntryProto.newBuilder()
+          .setState(REVIEWER_STATE_CONVERTER.reverse().convert(c.getRowKey()))
+          .setAddress(c.getColumnKey().toHeaderString())
+          .setTimestamp(c.getValue().getTime())
+          .build();
+    }
+
+    private static ReviewerStatusUpdateProto toReviewerStatusUpdateProto(ReviewerStatusUpdate u) {
+      return ReviewerStatusUpdateProto.newBuilder()
+          .setDate(u.date().getTime())
+          .setUpdatedBy(u.updatedBy().get())
+          .setReviewer(u.reviewer().get())
+          .setState(REVIEWER_STATE_CONVERTER.reverse().convert(u.state()))
+          .build();
+    }
+
+    @Override
+    public ChangeNotesState deserialize(byte[] in) {
+      ChangeNotesStateProto proto =
+          ProtoCacheSerializers.parseUnchecked(ChangeNotesStateProto.parser(), in);
+      Change.Id changeId = new Change.Id(proto.getChangeId());
+
+      ChangeNotesState.Builder b =
+          builder()
+              .metaId(ObjectIdConverter.create().fromByteString(proto.getMetaId()))
+              .changeId(changeId)
+              .columns(toChangeColumns(changeId, proto.getColumns()))
+              .pastAssignees(
+                  proto.getPastAssigneeList().stream()
+                      .map(Account.Id::new)
+                      .collect(toImmutableSet()))
+              .hashtags(proto.getHashtagList())
+              .patchSets(
+                  proto.getPatchSetList().stream()
+                      .map(PATCH_SET_CODEC::decode)
+                      .map(ps -> Maps.immutableEntry(ps.getId(), ps))
+                      .collect(toImmutableList()))
+              .approvals(
+                  proto.getApprovalList().stream()
+                      .map(APPROVAL_CODEC::decode)
+                      .map(a -> Maps.immutableEntry(a.getPatchSetId(), a))
+                      .collect(toImmutableList()))
+              .reviewers(toReviewerSet(proto.getReviewerList()))
+              .reviewersByEmail(toReviewerByEmailSet(proto.getReviewerByEmailList()))
+              .pendingReviewers(toReviewerSet(proto.getPendingReviewerList()))
+              .pendingReviewersByEmail(toReviewerByEmailSet(proto.getPendingReviewerByEmailList()))
+              .allPastReviewers(
+                  proto.getPastReviewerList().stream()
+                      .map(Account.Id::new)
+                      .collect(toImmutableList()))
+              .reviewerUpdates(toReviewerStatusUpdateList(proto.getReviewerUpdateList()))
+              .submitRecords(
+                  proto.getSubmitRecordList().stream()
+                      .map(r -> GSON.fromJson(r, StoredSubmitRecord.class).toSubmitRecord())
+                      .collect(toImmutableList()))
+              .changeMessages(
+                  proto.getChangeMessageList().stream()
+                      .map(MESSAGE_CODEC::decode)
+                      .collect(toImmutableList()))
+              .publishedComments(
+                  proto.getPublishedCommentList().stream()
+                      .map(r -> GSON.fromJson(r, Comment.class))
+                      .collect(toImmutableListMultimap(c -> new RevId(c.revId), c -> c)));
+      if (proto.getHasReadOnlyUntil()) {
+        b.readOnlyUntil(new Timestamp(proto.getReadOnlyUntil()));
+      }
+      return b.build();
+    }
+
+    private static ChangeColumns toChangeColumns(Change.Id changeId, ChangeColumnsProto proto) {
+      ChangeColumns.Builder b =
+          ChangeColumns.builder()
+              .changeKey(new Change.Key(proto.getChangeKey()))
+              .createdOn(new Timestamp(proto.getCreatedOn()))
+              .lastUpdatedOn(new Timestamp(proto.getLastUpdatedOn()))
+              .owner(new Account.Id(proto.getOwner()))
+              .branch(proto.getBranch());
+      if (proto.getHasCurrentPatchSetId()) {
+        b.currentPatchSetId(new PatchSet.Id(changeId, proto.getCurrentPatchSetId()));
+      }
+      b.subject(proto.getSubject());
+      if (proto.getHasTopic()) {
+        b.topic(proto.getTopic());
+      }
+      if (proto.getHasOriginalSubject()) {
+        b.originalSubject(proto.getOriginalSubject());
+      }
+      if (proto.getHasSubmissionId()) {
+        b.submissionId(proto.getSubmissionId());
+      }
+      if (proto.getHasAssignee()) {
+        b.assignee(new Account.Id(proto.getAssignee()));
+      }
+      if (proto.getHasStatus()) {
+        b.status(STATUS_CONVERTER.convert(proto.getStatus()));
+      }
+      b.isPrivate(proto.getIsPrivate())
+          .workInProgress(proto.getWorkInProgress())
+          .reviewStarted(proto.getReviewStarted());
+      if (proto.getHasRevertOf()) {
+        b.revertOf(new Change.Id(proto.getRevertOf()));
+      }
+      return b.build();
+    }
+
+    private static ReviewerSet toReviewerSet(List<ReviewerSetEntryProto> protos) {
+      ImmutableTable.Builder<ReviewerStateInternal, Account.Id, Timestamp> b =
+          ImmutableTable.builder();
+      for (ReviewerSetEntryProto e : protos) {
+        b.put(
+            REVIEWER_STATE_CONVERTER.convert(e.getState()),
+            new Account.Id(e.getAccountId()),
+            new Timestamp(e.getTimestamp()));
+      }
+      return ReviewerSet.fromTable(b.build());
+    }
+
+    private static ReviewerByEmailSet toReviewerByEmailSet(
+        List<ReviewerByEmailSetEntryProto> protos) {
+      ImmutableTable.Builder<ReviewerStateInternal, Address, Timestamp> b =
+          ImmutableTable.builder();
+      for (ReviewerByEmailSetEntryProto e : protos) {
+        b.put(
+            REVIEWER_STATE_CONVERTER.convert(e.getState()),
+            Address.parse(e.getAddress()),
+            new Timestamp(e.getTimestamp()));
+      }
+      return ReviewerByEmailSet.fromTable(b.build());
+    }
+
+    private static ImmutableList<ReviewerStatusUpdate> toReviewerStatusUpdateList(
+        List<ReviewerStatusUpdateProto> protos) {
+      ImmutableList.Builder<ReviewerStatusUpdate> b = ImmutableList.builder();
+      for (ReviewerStatusUpdateProto proto : protos) {
+        b.add(
+            ReviewerStatusUpdate.create(
+                new Timestamp(proto.getDate()),
+                new Account.Id(proto.getUpdatedBy()),
+                new Account.Id(proto.getReviewer()),
+                REVIEWER_STATE_CONVERTER.convert(proto.getState())));
+      }
+      return b.build();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/notedb/ChangeRevisionNote.java b/java/com/google/gerrit/server/notedb/ChangeRevisionNote.java
new file mode 100644
index 0000000..66dd5e8
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/ChangeRevisionNote.java
@@ -0,0 +1,116 @@
+// 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.
+
+package com.google.gerrit.server.notedb;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.primitives.Bytes;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.PatchLineComment;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.List;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.util.MutableInteger;
+import org.eclipse.jgit.util.RawParseUtils;
+
+class ChangeRevisionNote extends RevisionNote<Comment> {
+  private static final byte[] CERT_HEADER = "certificate version ".getBytes(UTF_8);
+  // See org.eclipse.jgit.transport.PushCertificateParser.END_SIGNATURE
+  private static final byte[] END_SIGNATURE = "-----END PGP SIGNATURE-----\n".getBytes(UTF_8);
+
+  private final ChangeNoteJson noteJson;
+  private final LegacyChangeNoteRead legacyChangeNoteRead;
+  private final Change.Id changeId;
+  private final PatchLineComment.Status status;
+  private String pushCert;
+
+  ChangeRevisionNote(
+      ChangeNoteJson noteJson,
+      LegacyChangeNoteRead legacyChangeNoteRead,
+      Change.Id changeId,
+      ObjectReader reader,
+      ObjectId noteId,
+      PatchLineComment.Status status) {
+    super(reader, noteId);
+    this.legacyChangeNoteRead = legacyChangeNoteRead;
+    this.noteJson = noteJson;
+    this.changeId = changeId;
+    this.status = status;
+  }
+
+  public String getPushCert() {
+    checkParsed();
+    return pushCert;
+  }
+
+  @Override
+  protected List<Comment> parse(byte[] raw, int offset) throws IOException, ConfigInvalidException {
+    MutableInteger p = new MutableInteger();
+    p.value = offset;
+
+    if (isJson(raw, p.value)) {
+      RevisionNoteData data = parseJson(noteJson, raw, p.value);
+      if (status == PatchLineComment.Status.PUBLISHED) {
+        pushCert = data.pushCert;
+      } else {
+        pushCert = null;
+      }
+      return data.comments;
+    }
+
+    if (status == PatchLineComment.Status.PUBLISHED) {
+      pushCert = parsePushCert(changeId, raw, p);
+      trimLeadingEmptyLines(raw, p);
+    } else {
+      pushCert = null;
+    }
+    List<Comment> comments = legacyChangeNoteRead.parseNote(raw, p, changeId);
+    comments.forEach(c -> c.legacyFormat = true);
+    return comments;
+  }
+
+  static boolean isJson(byte[] raw, int offset) {
+    return raw[offset] == '{' || raw[offset] == '[';
+  }
+
+  private RevisionNoteData parseJson(ChangeNoteJson noteUtil, byte[] raw, int offset)
+      throws IOException {
+    try (InputStream is = new ByteArrayInputStream(raw, offset, raw.length - offset);
+        Reader r = new InputStreamReader(is, UTF_8)) {
+      return noteUtil.getGson().fromJson(r, RevisionNoteData.class);
+    }
+  }
+
+  private static String parsePushCert(Change.Id changeId, byte[] bytes, MutableInteger p)
+      throws ConfigInvalidException {
+    if (RawParseUtils.match(bytes, p.value, CERT_HEADER) < 0) {
+      return null;
+    }
+    int end = Bytes.indexOf(bytes, END_SIGNATURE);
+    if (end < 0) {
+      throw ChangeNotes.parseException(changeId, "invalid push certificate in note");
+    }
+    int start = p.value;
+    p.value = end + END_SIGNATURE.length;
+    return new String(bytes, start, p.value, UTF_8);
+  }
+}
diff --git a/java/com/google/gerrit/server/notedb/ChangeUpdate.java b/java/com/google/gerrit/server/notedb/ChangeUpdate.java
new file mode 100644
index 0000000..0d9b962
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/ChangeUpdate.java
@@ -0,0 +1,889 @@
+// Copyright (C) 2013 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.google.gerrit.server.notedb;
+
+import static com.google.common.base.MoreObjects.firstNonNull;
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.gerrit.reviewdb.client.RefNames.changeMetaRef;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_ASSIGNEE;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_BRANCH;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_CHANGE_ID;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_COMMIT;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_CURRENT;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_GROUPS;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_HASHTAGS;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_LABEL;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_PATCH_SET;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_PATCH_SET_DESCRIPTION;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_PRIVATE;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_READ_ONLY_UNTIL;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_REAL_USER;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_REVERT_OF;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_STATUS;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_SUBJECT;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_SUBMISSION_ID;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_SUBMITTED_WITH;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_TAG;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_TOPIC;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_WORK_IN_PROGRESS;
+import static com.google.gerrit.server.notedb.NoteDbUtil.sanitizeFooter;
+import static java.util.Comparator.comparing;
+import static java.util.Objects.requireNonNull;
+import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Joiner;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Table;
+import com.google.common.collect.TreeBasedTable;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.SubmitRecord;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.PatchLineComment;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RevId;
+import com.google.gerrit.reviewdb.client.RobotComment;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.logging.RequestId;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.util.LabelVote;
+import com.google.gwtorm.client.IntKey;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.assistedinject.Assisted;
+import com.google.inject.assistedinject.AssistedInject;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.notes.NoteMap;
+import org.eclipse.jgit.revwalk.FooterKey;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+/**
+ * A delta to apply to a change.
+ *
+ * <p>This delta will become two unique commits: one in the AllUsers repo that will contain the
+ * draft comments on this change and one in the notes branch that will contain approvals, reviewers,
+ * change status, subject, submit records, the change message, and published comments. There are
+ * limitations on the set of modifications that can be handled in a single update. In particular,
+ * there is a single author and timestamp for each update.
+ *
+ * <p>This class is not thread-safe.
+ */
+public class ChangeUpdate extends AbstractChangeUpdate {
+  public interface Factory {
+    ChangeUpdate create(ChangeNotes notes, CurrentUser user);
+
+    ChangeUpdate create(ChangeNotes notes, CurrentUser user, Date when);
+
+    ChangeUpdate create(
+        Change change,
+        @Assisted("effective") @Nullable Account.Id accountId,
+        @Assisted("real") @Nullable Account.Id realAccountId,
+        PersonIdent authorIdent,
+        Date when,
+        Comparator<String> labelNameComparator);
+
+    @VisibleForTesting
+    ChangeUpdate create(
+        ChangeNotes notes, CurrentUser user, Date when, Comparator<String> labelNameComparator);
+  }
+
+  private final NoteDbUpdateManager.Factory updateManagerFactory;
+  private final ChangeDraftUpdate.Factory draftUpdateFactory;
+  private final RobotCommentUpdate.Factory robotCommentUpdateFactory;
+  private final DeleteCommentRewriter.Factory deleteCommentRewriterFactory;
+
+  private final Table<String, Account.Id, Optional<Short>> approvals;
+  private final Map<Account.Id, ReviewerStateInternal> reviewers = new LinkedHashMap<>();
+  private final Map<Address, ReviewerStateInternal> reviewersByEmail = new LinkedHashMap<>();
+  private final List<Comment> comments = new ArrayList<>();
+
+  private String commitSubject;
+  private String subject;
+  private String changeId;
+  private String branch;
+  private Change.Status status;
+  private List<SubmitRecord> submitRecords;
+  private String submissionId;
+  private String topic;
+  private String commit;
+  private Optional<Account.Id> assignee;
+  private Set<String> hashtags;
+  private String changeMessage;
+  private String tag;
+  private PatchSetState psState;
+  private Iterable<String> groups;
+  private String pushCert;
+  private boolean isAllowWriteToNewtRef;
+  private String psDescription;
+  private boolean currentPatchSet;
+  private Timestamp readOnlyUntil;
+  private Boolean isPrivate;
+  private Boolean workInProgress;
+  private Integer revertOf;
+
+  private ChangeDraftUpdate draftUpdate;
+  private RobotCommentUpdate robotCommentUpdate;
+  private DeleteCommentRewriter deleteCommentRewriter;
+  private DeleteChangeMessageRewriter deleteChangeMessageRewriter;
+
+  @AssistedInject
+  private ChangeUpdate(
+      @GerritServerConfig Config cfg,
+      @GerritPersonIdent PersonIdent serverIdent,
+      NotesMigration migration,
+      NoteDbUpdateManager.Factory updateManagerFactory,
+      ChangeDraftUpdate.Factory draftUpdateFactory,
+      RobotCommentUpdate.Factory robotCommentUpdateFactory,
+      DeleteCommentRewriter.Factory deleteCommentRewriterFactory,
+      ProjectCache projectCache,
+      @Assisted ChangeNotes notes,
+      @Assisted CurrentUser user,
+      ChangeNoteUtil noteUtil) {
+    this(
+        cfg,
+        serverIdent,
+        migration,
+        updateManagerFactory,
+        draftUpdateFactory,
+        robotCommentUpdateFactory,
+        deleteCommentRewriterFactory,
+        projectCache,
+        notes,
+        user,
+        serverIdent.getWhen(),
+        noteUtil);
+  }
+
+  @AssistedInject
+  private ChangeUpdate(
+      @GerritServerConfig Config cfg,
+      @GerritPersonIdent PersonIdent serverIdent,
+      NotesMigration migration,
+      NoteDbUpdateManager.Factory updateManagerFactory,
+      ChangeDraftUpdate.Factory draftUpdateFactory,
+      RobotCommentUpdate.Factory robotCommentUpdateFactory,
+      DeleteCommentRewriter.Factory deleteCommentRewriterFactory,
+      ProjectCache projectCache,
+      @Assisted ChangeNotes notes,
+      @Assisted CurrentUser user,
+      @Assisted Date when,
+      ChangeNoteUtil noteUtil) {
+    this(
+        cfg,
+        serverIdent,
+        migration,
+        updateManagerFactory,
+        draftUpdateFactory,
+        robotCommentUpdateFactory,
+        deleteCommentRewriterFactory,
+        notes,
+        user,
+        when,
+        projectCache.get(notes.getProjectName()).getLabelTypes().nameComparator(),
+        noteUtil);
+  }
+
+  private static Table<String, Account.Id, Optional<Short>> approvals(
+      Comparator<String> nameComparator) {
+    return TreeBasedTable.create(nameComparator, comparing(IntKey::get));
+  }
+
+  @AssistedInject
+  private ChangeUpdate(
+      @GerritServerConfig Config cfg,
+      @GerritPersonIdent PersonIdent serverIdent,
+      NotesMigration migration,
+      NoteDbUpdateManager.Factory updateManagerFactory,
+      ChangeDraftUpdate.Factory draftUpdateFactory,
+      RobotCommentUpdate.Factory robotCommentUpdateFactory,
+      DeleteCommentRewriter.Factory deleteCommentRewriterFactory,
+      @Assisted ChangeNotes notes,
+      @Assisted CurrentUser user,
+      @Assisted Date when,
+      @Assisted Comparator<String> labelNameComparator,
+      ChangeNoteUtil noteUtil) {
+    super(cfg, migration, notes, user, serverIdent, noteUtil, when);
+    this.updateManagerFactory = updateManagerFactory;
+    this.draftUpdateFactory = draftUpdateFactory;
+    this.robotCommentUpdateFactory = robotCommentUpdateFactory;
+    this.deleteCommentRewriterFactory = deleteCommentRewriterFactory;
+    this.approvals = approvals(labelNameComparator);
+  }
+
+  @AssistedInject
+  private ChangeUpdate(
+      @GerritServerConfig Config cfg,
+      @GerritPersonIdent PersonIdent serverIdent,
+      NotesMigration migration,
+      NoteDbUpdateManager.Factory updateManagerFactory,
+      ChangeDraftUpdate.Factory draftUpdateFactory,
+      RobotCommentUpdate.Factory robotCommentUpdateFactory,
+      DeleteCommentRewriter.Factory deleteCommentRewriterFactory,
+      ChangeNoteUtil noteUtil,
+      @Assisted Change change,
+      @Assisted("effective") @Nullable Account.Id accountId,
+      @Assisted("real") @Nullable Account.Id realAccountId,
+      @Assisted PersonIdent authorIdent,
+      @Assisted Date when,
+      @Assisted Comparator<String> labelNameComparator) {
+    super(
+        cfg,
+        migration,
+        noteUtil,
+        serverIdent,
+        null,
+        change,
+        accountId,
+        realAccountId,
+        authorIdent,
+        when);
+    this.draftUpdateFactory = draftUpdateFactory;
+    this.robotCommentUpdateFactory = robotCommentUpdateFactory;
+    this.updateManagerFactory = updateManagerFactory;
+    this.deleteCommentRewriterFactory = deleteCommentRewriterFactory;
+    this.approvals = approvals(labelNameComparator);
+  }
+
+  public ObjectId commit() throws IOException, OrmException {
+    try (NoteDbUpdateManager updateManager = updateManagerFactory.create(getProjectName())) {
+      updateManager.add(this);
+      updateManager.stageAndApplyDelta(getChange());
+      updateManager.execute();
+    }
+    return getResult();
+  }
+
+  public void setChangeId(String changeId) {
+    String old = getChange().getKey().get();
+    checkArgument(
+        old.equals(changeId),
+        "The Change-Id was already set to %s, so we cannot set this Change-Id: %s",
+        old,
+        changeId);
+    this.changeId = changeId;
+  }
+
+  public void setBranch(String branch) {
+    this.branch = branch;
+  }
+
+  public void setStatus(Change.Status status) {
+    checkArgument(status != Change.Status.MERGED, "use merge(Iterable<SubmitRecord>)");
+    this.status = status;
+  }
+
+  public void fixStatus(Change.Status status) {
+    this.status = status;
+  }
+
+  public void putApproval(String label, short value) {
+    putApprovalFor(getAccountId(), label, value);
+  }
+
+  public void putApprovalFor(Account.Id reviewer, String label, short value) {
+    approvals.put(label, reviewer, Optional.of(value));
+  }
+
+  public void removeApproval(String label) {
+    removeApprovalFor(getAccountId(), label);
+  }
+
+  public void removeApprovalFor(Account.Id reviewer, String label) {
+    approvals.put(label, reviewer, Optional.empty());
+  }
+
+  public void merge(RequestId submissionId, Iterable<SubmitRecord> submitRecords) {
+    this.status = Change.Status.MERGED;
+    this.submissionId = submissionId.toStringForStorage();
+    this.submitRecords = ImmutableList.copyOf(submitRecords);
+    checkArgument(!this.submitRecords.isEmpty(), "no submit records specified at submit time");
+  }
+
+  @Deprecated // Only until we improve ChangeRebuilder to call merge().
+  public void setSubmissionId(String submissionId) {
+    this.submissionId = submissionId;
+  }
+
+  public void setSubjectForCommit(String commitSubject) {
+    this.commitSubject = commitSubject;
+  }
+
+  public void setSubject(String subject) {
+    this.subject = subject;
+  }
+
+  @VisibleForTesting
+  ObjectId getCommit() {
+    return ObjectId.fromString(commit);
+  }
+
+  public void setChangeMessage(String changeMessage) {
+    this.changeMessage = changeMessage;
+  }
+
+  public void setTag(String tag) {
+    this.tag = tag;
+  }
+
+  public void setPsDescription(String psDescription) {
+    this.psDescription = psDescription;
+  }
+
+  public void putComment(PatchLineComment.Status status, Comment c) {
+    verifyComment(c);
+    createDraftUpdateIfNull();
+    if (status == PatchLineComment.Status.DRAFT) {
+      draftUpdate.putComment(c);
+    } else {
+      comments.add(c);
+      // Always delete the corresponding comment from drafts. Published comments
+      // are immutable, meaning in normal operation we only hit this path when
+      // publishing a comment. It's exactly in that case that we have to delete
+      // the draft.
+      draftUpdate.deleteComment(c);
+    }
+  }
+
+  public void putRobotComment(RobotComment c) {
+    verifyComment(c);
+    createRobotCommentUpdateIfNull();
+    robotCommentUpdate.putComment(c);
+  }
+
+  public void deleteComment(Comment c) {
+    verifyComment(c);
+    createDraftUpdateIfNull().deleteComment(c);
+  }
+
+  public void deleteCommentByRewritingHistory(String uuid, String newMessage) {
+    deleteCommentRewriter =
+        deleteCommentRewriterFactory.create(getChange().getId(), uuid, newMessage);
+  }
+
+  public void deleteChangeMessageByRewritingHistory(int targetMessageIdx, String newMessage) {
+    deleteChangeMessageRewriter =
+        new DeleteChangeMessageRewriter(getChange().getId(), targetMessageIdx, newMessage);
+  }
+
+  @VisibleForTesting
+  ChangeDraftUpdate createDraftUpdateIfNull() {
+    if (draftUpdate == null) {
+      ChangeNotes notes = getNotes();
+      if (notes != null) {
+        draftUpdate = draftUpdateFactory.create(notes, accountId, realAccountId, authorIdent, when);
+      } else {
+        // tests will always take the notes != null path above.
+        draftUpdate =
+            draftUpdateFactory.create(getChange(), accountId, realAccountId, authorIdent, when);
+      }
+    }
+    return draftUpdate;
+  }
+
+  @VisibleForTesting
+  RobotCommentUpdate createRobotCommentUpdateIfNull() {
+    if (robotCommentUpdate == null) {
+      ChangeNotes notes = getNotes();
+      if (notes != null) {
+        robotCommentUpdate =
+            robotCommentUpdateFactory.create(notes, accountId, realAccountId, authorIdent, when);
+      } else {
+        robotCommentUpdate =
+            robotCommentUpdateFactory.create(
+                getChange(), accountId, realAccountId, authorIdent, when);
+      }
+    }
+    return robotCommentUpdate;
+  }
+
+  public void setTopic(String topic) {
+    this.topic = Strings.nullToEmpty(topic);
+  }
+
+  public void setCommit(RevWalk rw, ObjectId id) throws IOException {
+    setCommit(rw, id, null);
+  }
+
+  public void setCommit(RevWalk rw, ObjectId id, String pushCert) throws IOException {
+    RevCommit commit = rw.parseCommit(id);
+    rw.parseBody(commit);
+    this.commit = commit.name();
+    subject = commit.getShortMessage();
+    this.pushCert = pushCert;
+  }
+
+  /**
+   * Set the revision without depending on the commit being present in the repository; should only
+   * be used for converting old corrupt commits.
+   */
+  public void setRevisionForMissingCommit(String id, String pushCert) {
+    commit = id;
+    this.pushCert = pushCert;
+  }
+
+  public void setHashtags(Set<String> hashtags) {
+    this.hashtags = hashtags;
+  }
+
+  public void setAssignee(Account.Id assignee) {
+    checkArgument(assignee != null, "use removeAssignee");
+    this.assignee = Optional.of(assignee);
+  }
+
+  public void removeAssignee() {
+    this.assignee = Optional.empty();
+  }
+
+  public Map<Account.Id, ReviewerStateInternal> getReviewers() {
+    return reviewers;
+  }
+
+  public void putReviewer(Account.Id reviewer, ReviewerStateInternal type) {
+    checkArgument(type != ReviewerStateInternal.REMOVED, "invalid ReviewerType");
+    reviewers.put(reviewer, type);
+  }
+
+  public void removeReviewer(Account.Id reviewer) {
+    reviewers.put(reviewer, ReviewerStateInternal.REMOVED);
+  }
+
+  public void putReviewerByEmail(Address reviewer, ReviewerStateInternal type) {
+    checkArgument(type != ReviewerStateInternal.REMOVED, "invalid ReviewerType");
+    reviewersByEmail.put(reviewer, type);
+  }
+
+  public void removeReviewerByEmail(Address reviewer) {
+    reviewersByEmail.put(reviewer, ReviewerStateInternal.REMOVED);
+  }
+
+  public void setPatchSetState(PatchSetState psState) {
+    this.psState = psState;
+  }
+
+  public void setCurrentPatchSet() {
+    this.currentPatchSet = true;
+  }
+
+  public void setGroups(List<String> groups) {
+    requireNonNull(groups, "groups may not be null");
+    this.groups = groups;
+  }
+
+  public void setRevertOf(int revertOf) {
+    int ownId = getChange().getId().get();
+    checkArgument(ownId != revertOf, "A change cannot revert itself");
+    this.revertOf = revertOf;
+    rootOnly = true;
+  }
+
+  /** @return the tree id for the updated tree */
+  private ObjectId storeRevisionNotes(RevWalk rw, ObjectInserter inserter, ObjectId curr)
+      throws ConfigInvalidException, OrmException, IOException {
+    if (comments.isEmpty() && pushCert == null) {
+      return null;
+    }
+    RevisionNoteMap<ChangeRevisionNote> rnm = getRevisionNoteMap(rw, curr);
+
+    RevisionNoteBuilder.Cache cache = new RevisionNoteBuilder.Cache(rnm);
+    for (Comment c : comments) {
+      c.tag = tag;
+      cache.get(new RevId(c.revId)).putComment(c);
+    }
+    if (pushCert != null) {
+      checkState(commit != null);
+      cache.get(new RevId(commit)).setPushCertificate(pushCert);
+    }
+    Map<RevId, RevisionNoteBuilder> builders = cache.getBuilders();
+    checkComments(rnm.revisionNotes, builders);
+
+    for (Map.Entry<RevId, RevisionNoteBuilder> e : builders.entrySet()) {
+      ObjectId data = inserter.insert(OBJ_BLOB, e.getValue().build(noteUtil.getChangeNoteJson()));
+      rnm.noteMap.set(ObjectId.fromString(e.getKey().get()), data);
+    }
+
+    return rnm.noteMap.writeTree(inserter);
+  }
+
+  private RevisionNoteMap<ChangeRevisionNote> getRevisionNoteMap(RevWalk rw, ObjectId curr)
+      throws ConfigInvalidException, OrmException, IOException {
+    if (curr.equals(ObjectId.zeroId())) {
+      return RevisionNoteMap.emptyMap();
+    }
+    if (migration.readChanges()) {
+      // If reading from changes is enabled, then the old ChangeNotes may have
+      // already parsed the revision notes. We can reuse them as long as the ref
+      // hasn't advanced.
+      ChangeNotes notes = getNotes();
+      if (notes != null && notes.revisionNoteMap != null) {
+        ObjectId idFromNotes = firstNonNull(notes.load().getRevision(), ObjectId.zeroId());
+        if (idFromNotes.equals(curr)) {
+          return notes.revisionNoteMap;
+        }
+      }
+    }
+    NoteMap noteMap = NoteMap.read(rw.getObjectReader(), rw.parseCommit(curr));
+    // Even though reading from changes might not be enabled, we need to
+    // parse any existing revision notes so we can merge them.
+    return RevisionNoteMap.parse(
+        noteUtil.getChangeNoteJson(),
+        noteUtil.getLegacyChangeNoteRead(),
+        getId(),
+        rw.getObjectReader(),
+        noteMap,
+        PatchLineComment.Status.PUBLISHED);
+  }
+
+  private void checkComments(
+      Map<RevId, ChangeRevisionNote> existingNotes, Map<RevId, RevisionNoteBuilder> toUpdate)
+      throws OrmException {
+    // Prohibit various kinds of illegal operations on comments.
+    Set<Comment.Key> existing = new HashSet<>();
+    for (ChangeRevisionNote rn : existingNotes.values()) {
+      for (Comment c : rn.getComments()) {
+        existing.add(c.key);
+        if (draftUpdate != null) {
+          // Take advantage of an existing update on All-Users to prune any
+          // published comments from drafts. NoteDbUpdateManager takes care of
+          // ensuring that this update is applied before its dependent draft
+          // update.
+          //
+          // Deleting aggressively in this way, combined with filtering out
+          // duplicate published/draft comments in ChangeNotes#getDraftComments,
+          // makes up for the fact that updates between the change repo and
+          // All-Users are not atomic.
+          //
+          // TODO(dborowitz): We might want to distinguish between deleted
+          // drafts that we're fixing up after the fact by putting them in a
+          // separate commit. But note that we don't care much about the commit
+          // graph of the draft ref, particularly because the ref is completely
+          // deleted when all drafts are gone.
+          draftUpdate.deleteComment(c.revId, c.key);
+        }
+      }
+    }
+
+    for (RevisionNoteBuilder b : toUpdate.values()) {
+      for (Comment c : b.put.values()) {
+        if (existing.contains(c.key)) {
+          throw new OrmException("Cannot update existing published comment: " + c);
+        }
+      }
+    }
+  }
+
+  @Override
+  protected String getRefName() {
+    return changeMetaRef(getId());
+  }
+
+  @Override
+  protected CommitBuilder applyImpl(RevWalk rw, ObjectInserter ins, ObjectId curr)
+      throws OrmException, IOException {
+    checkState(
+        deleteCommentRewriter == null && deleteChangeMessageRewriter == null,
+        "cannot update and rewrite ref in one BatchUpdate");
+
+    CommitBuilder cb = new CommitBuilder();
+
+    int ps = psId != null ? psId.get() : getChange().currentPatchSetId().get();
+    StringBuilder msg = new StringBuilder();
+    if (commitSubject != null) {
+      msg.append(commitSubject);
+    } else {
+      msg.append("Update patch set ").append(ps);
+    }
+    msg.append("\n\n");
+
+    if (changeMessage != null) {
+      msg.append(changeMessage);
+      msg.append("\n\n");
+    }
+
+    addPatchSetFooter(msg, ps);
+
+    if (currentPatchSet) {
+      addFooter(msg, FOOTER_CURRENT, Boolean.TRUE);
+    }
+
+    if (psDescription != null) {
+      addFooter(msg, FOOTER_PATCH_SET_DESCRIPTION, psDescription);
+    }
+
+    if (changeId != null) {
+      addFooter(msg, FOOTER_CHANGE_ID, changeId);
+    }
+
+    if (subject != null) {
+      addFooter(msg, FOOTER_SUBJECT, subject);
+    }
+
+    if (branch != null) {
+      addFooter(msg, FOOTER_BRANCH, branch);
+    }
+
+    if (status != null) {
+      addFooter(msg, FOOTER_STATUS, status.name().toLowerCase());
+    }
+
+    if (topic != null) {
+      addFooter(msg, FOOTER_TOPIC, topic);
+    }
+
+    if (commit != null) {
+      addFooter(msg, FOOTER_COMMIT, commit);
+    }
+
+    if (assignee != null) {
+      if (assignee.isPresent()) {
+        addFooter(msg, FOOTER_ASSIGNEE);
+        addIdent(msg, assignee.get()).append('\n');
+      } else {
+        addFooter(msg, FOOTER_ASSIGNEE).append('\n');
+      }
+    }
+
+    Joiner comma = Joiner.on(',');
+    if (hashtags != null) {
+      addFooter(msg, FOOTER_HASHTAGS, comma.join(hashtags));
+    }
+
+    if (tag != null) {
+      addFooter(msg, FOOTER_TAG, tag);
+    }
+
+    if (groups != null) {
+      addFooter(msg, FOOTER_GROUPS, comma.join(groups));
+    }
+
+    for (Map.Entry<Account.Id, ReviewerStateInternal> e : reviewers.entrySet()) {
+      addFooter(msg, e.getValue().getFooterKey());
+      addIdent(msg, e.getKey()).append('\n');
+    }
+
+    for (Map.Entry<Address, ReviewerStateInternal> e : reviewersByEmail.entrySet()) {
+      addFooter(msg, e.getValue().getByEmailFooterKey(), e.getKey().toString());
+    }
+
+    for (Table.Cell<String, Account.Id, Optional<Short>> c : approvals.cellSet()) {
+      addFooter(msg, FOOTER_LABEL);
+      // Label names/values are safe to append without sanitizing.
+      if (!c.getValue().isPresent()) {
+        msg.append('-').append(c.getRowKey());
+      } else {
+        msg.append(LabelVote.create(c.getRowKey(), c.getValue().get()).formatWithEquals());
+      }
+      Account.Id id = c.getColumnKey();
+      if (!id.equals(getAccountId())) {
+        addIdent(msg.append(' '), id);
+      }
+      msg.append('\n');
+    }
+
+    if (submissionId != null) {
+      addFooter(msg, FOOTER_SUBMISSION_ID, submissionId);
+    }
+
+    if (submitRecords != null) {
+      for (SubmitRecord rec : submitRecords) {
+        addFooter(msg, FOOTER_SUBMITTED_WITH).append(rec.status);
+        if (rec.errorMessage != null) {
+          msg.append(' ').append(sanitizeFooter(rec.errorMessage));
+        }
+        msg.append('\n');
+
+        if (rec.labels != null) {
+          for (SubmitRecord.Label label : rec.labels) {
+            // Label names/values are safe to append without sanitizing.
+            addFooter(msg, FOOTER_SUBMITTED_WITH)
+                .append(label.status)
+                .append(": ")
+                .append(label.label);
+            if (label.appliedBy != null) {
+              msg.append(": ");
+              addIdent(msg, label.appliedBy);
+            }
+            msg.append('\n');
+          }
+        }
+        // TODO(maximeg) We might want to list plugins that validated this submission.
+      }
+    }
+
+    if (!Objects.equals(accountId, realAccountId)) {
+      addFooter(msg, FOOTER_REAL_USER);
+      addIdent(msg, realAccountId).append('\n');
+    }
+
+    if (readOnlyUntil != null) {
+      addFooter(msg, FOOTER_READ_ONLY_UNTIL, NoteDbUtil.formatTime(serverIdent, readOnlyUntil));
+    }
+
+    if (isPrivate != null) {
+      addFooter(msg, FOOTER_PRIVATE, isPrivate);
+    }
+
+    if (workInProgress != null) {
+      addFooter(msg, FOOTER_WORK_IN_PROGRESS, workInProgress);
+    }
+
+    if (revertOf != null) {
+      addFooter(msg, FOOTER_REVERT_OF, revertOf);
+    }
+
+    cb.setMessage(msg.toString());
+    try {
+      ObjectId treeId = storeRevisionNotes(rw, ins, curr);
+      if (treeId != null) {
+        cb.setTreeId(treeId);
+      }
+    } catch (ConfigInvalidException e) {
+      throw new OrmException(e);
+    }
+    return cb;
+  }
+
+  private void addPatchSetFooter(StringBuilder sb, int ps) {
+    addFooter(sb, FOOTER_PATCH_SET).append(ps);
+    if (psState != null) {
+      sb.append(" (").append(psState.name().toLowerCase()).append(')');
+    }
+    sb.append('\n');
+  }
+
+  @Override
+  protected Project.NameKey getProjectName() {
+    return getChange().getProject();
+  }
+
+  @Override
+  public boolean isEmpty() {
+    return commitSubject == null
+        && approvals.isEmpty()
+        && changeMessage == null
+        && comments.isEmpty()
+        && reviewers.isEmpty()
+        && reviewersByEmail.isEmpty()
+        && changeId == null
+        && branch == null
+        && status == null
+        && submissionId == null
+        && submitRecords == null
+        && assignee == null
+        && hashtags == null
+        && topic == null
+        && commit == null
+        && psState == null
+        && groups == null
+        && tag == null
+        && psDescription == null
+        && !currentPatchSet
+        && readOnlyUntil == null
+        && isPrivate == null
+        && workInProgress == null
+        && revertOf == null;
+  }
+
+  ChangeDraftUpdate getDraftUpdate() {
+    return draftUpdate;
+  }
+
+  RobotCommentUpdate getRobotCommentUpdate() {
+    return robotCommentUpdate;
+  }
+
+  public DeleteCommentRewriter getDeleteCommentRewriter() {
+    return deleteCommentRewriter;
+  }
+
+  public DeleteChangeMessageRewriter getDeleteChangeMessageRewriter() {
+    return deleteChangeMessageRewriter;
+  }
+
+  public void setAllowWriteToNewRef(boolean allow) {
+    isAllowWriteToNewtRef = allow;
+  }
+
+  @Override
+  public boolean allowWriteToNewRef() {
+    return isAllowWriteToNewtRef;
+  }
+
+  public void setPrivate(boolean isPrivate) {
+    this.isPrivate = isPrivate;
+  }
+
+  public void setWorkInProgress(boolean workInProgress) {
+    this.workInProgress = workInProgress;
+  }
+
+  void setReadOnlyUntil(Timestamp readOnlyUntil) {
+    this.readOnlyUntil = readOnlyUntil;
+  }
+
+  private static StringBuilder addFooter(StringBuilder sb, FooterKey footer) {
+    return sb.append(footer.getName()).append(": ");
+  }
+
+  private static void addFooter(StringBuilder sb, FooterKey footer, Object... values) {
+    addFooter(sb, footer);
+    for (Object value : values) {
+      sb.append(sanitizeFooter(Objects.toString(value)));
+    }
+    sb.append('\n');
+  }
+
+  private StringBuilder addIdent(StringBuilder sb, Account.Id accountId) {
+    PersonIdent ident = newIdent(accountId, when);
+
+    PersonIdent.appendSanitized(sb, ident.getName());
+    sb.append(" <");
+    PersonIdent.appendSanitized(sb, ident.getEmailAddress());
+    sb.append('>');
+    return sb;
+  }
+
+  @Override
+  protected void checkNotReadOnly() throws OrmException {
+    // Allow setting Read-only-until to 0 to release an existing lease.
+    if (readOnlyUntil != null && readOnlyUntil.getTime() == 0) {
+      return;
+    }
+    super.checkNotReadOnly();
+  }
+}
diff --git a/java/com/google/gerrit/server/notedb/CommentJsonMigrator.java b/java/com/google/gerrit/server/notedb/CommentJsonMigrator.java
new file mode 100644
index 0000000..361c435
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/CommentJsonMigrator.java
@@ -0,0 +1,253 @@
+// Copyright (C) 2017 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.google.gerrit.server.notedb;
+
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchLineComment.Status;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.client.RevId;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.GerritServerIdProvider;
+import com.google.gerrit.server.update.RefUpdateUtil;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.List;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.internal.storage.file.FileRepository;
+import org.eclipse.jgit.internal.storage.file.PackInserter;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.ObjectLoader;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.notes.Note;
+import org.eclipse.jgit.notes.NoteMap;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevSort;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.ReceiveCommand;
+import org.eclipse.jgit.util.MutableInteger;
+
+@Singleton
+public class CommentJsonMigrator {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static class ProjectMigrationResult {
+    public int skipped;
+    public boolean ok;
+    public List<String> refsUpdated;
+  }
+
+  private final LegacyChangeNoteRead legacyChangeNoteRead;
+  private final ChangeNoteJson changeNoteJson;
+  private final AllUsersName allUsers;
+
+  @Inject
+  CommentJsonMigrator(
+      ChangeNoteJson changeNoteJson,
+      GerritServerIdProvider gerritServerIdProvider,
+      AllUsersName allUsers) {
+    this.changeNoteJson = changeNoteJson;
+    this.allUsers = allUsers;
+    this.legacyChangeNoteRead = new LegacyChangeNoteRead(gerritServerIdProvider.get());
+  }
+
+  CommentJsonMigrator(ChangeNoteJson changeNoteJson, String serverId, AllUsersName allUsers) {
+    this.changeNoteJson = changeNoteJson;
+    this.legacyChangeNoteRead = new LegacyChangeNoteRead(serverId);
+    this.allUsers = allUsers;
+  }
+
+  public ProjectMigrationResult migrateProject(
+      Project.NameKey project, Repository repo, boolean dryRun) {
+    ProjectMigrationResult progress = new ProjectMigrationResult();
+    progress.ok = true;
+    progress.skipped = 0;
+    progress.refsUpdated = ImmutableList.of();
+    try (RevWalk rw = new RevWalk(repo);
+        ObjectInserter ins = newPackInserter(repo)) {
+      BatchRefUpdate bru = repo.getRefDatabase().newBatchUpdate();
+      bru.setAllowNonFastForwards(true);
+      progress.ok &= migrateChanges(project, repo, rw, ins, bru);
+      if (project.equals(allUsers)) {
+        progress.ok &= migrateDrafts(allUsers, repo, rw, ins, bru);
+      }
+
+      progress.refsUpdated =
+          bru.getCommands().stream().map(c -> c.getRefName()).collect(toImmutableList());
+      if (!bru.getCommands().isEmpty()) {
+        if (!dryRun) {
+          ins.flush();
+          RefUpdateUtil.executeChecked(bru, rw);
+        }
+      } else {
+        progress.skipped++;
+      }
+    } catch (IOException e) {
+      progress.ok = false;
+    }
+
+    return progress;
+  }
+
+  private boolean migrateChanges(
+      Project.NameKey project, Repository repo, RevWalk rw, ObjectInserter ins, BatchRefUpdate bru)
+      throws IOException {
+    boolean ok = true;
+    for (Ref ref : repo.getRefDatabase().getRefsByPrefix(RefNames.REFS_CHANGES)) {
+      Change.Id changeId = Change.Id.fromRef(ref.getName());
+      if (changeId == null || !ref.getName().equals(RefNames.changeMetaRef(changeId))) {
+        continue;
+      }
+      ok &= migrateOne(project, rw, ins, bru, Status.PUBLISHED, changeId, ref);
+    }
+    return ok;
+  }
+
+  private boolean migrateDrafts(
+      Project.NameKey allUsers,
+      Repository allUsersRepo,
+      RevWalk rw,
+      ObjectInserter ins,
+      BatchRefUpdate bru)
+      throws IOException {
+    boolean ok = true;
+    for (Ref ref : allUsersRepo.getRefDatabase().getRefsByPrefix(RefNames.REFS_DRAFT_COMMENTS)) {
+      Change.Id changeId = Change.Id.fromAllUsersRef(ref.getName());
+      if (changeId == null) {
+        continue;
+      }
+      ok &= migrateOne(allUsers, rw, ins, bru, Status.DRAFT, changeId, ref);
+    }
+    return ok;
+  }
+
+  private boolean migrateOne(
+      Project.NameKey project,
+      RevWalk rw,
+      ObjectInserter ins,
+      BatchRefUpdate bru,
+      Status status,
+      Change.Id changeId,
+      Ref ref) {
+    ObjectId oldId = ref.getObjectId();
+    try {
+      if (!hasAnyLegacyComments(rw, oldId)) {
+        return true;
+      }
+    } catch (IOException e) {
+      logger.atInfo().log(
+          String.format(
+              "Error reading change %s in %s; attempting migration anyway", changeId, project),
+          e);
+    }
+
+    try {
+      reset(rw, oldId);
+
+      ObjectReader reader = rw.getObjectReader();
+      ObjectId newId = null;
+      RevCommit c;
+      while ((c = rw.next()) != null) {
+        CommitBuilder cb = new CommitBuilder();
+        cb.setAuthor(c.getAuthorIdent());
+        cb.setCommitter(c.getCommitterIdent());
+        cb.setMessage(c.getFullMessage());
+        cb.setEncoding(c.getEncoding());
+        if (newId != null) {
+          cb.setParentId(newId);
+        }
+
+        // Read/write using the low-level RevisionNote API, which works regardless of NotesMigration
+        // state.
+        NoteMap noteMap = NoteMap.read(reader, c);
+        RevisionNoteMap<ChangeRevisionNote> revNoteMap =
+            RevisionNoteMap.parse(
+                changeNoteJson, legacyChangeNoteRead, changeId, reader, noteMap, status);
+        RevisionNoteBuilder.Cache cache = new RevisionNoteBuilder.Cache(revNoteMap);
+
+        for (RevId revId : revNoteMap.revisionNotes.keySet()) {
+          // Call cache.get on each known RevId to read the old note in whichever format, then write
+          // the note in JSON format.
+          byte[] data = cache.get(revId).build(changeNoteJson);
+          noteMap.set(ObjectId.fromString(revId.get()), ins.insert(OBJ_BLOB, data));
+        }
+        cb.setTreeId(noteMap.writeTree(ins));
+        newId = ins.insert(cb);
+      }
+
+      bru.addCommand(new ReceiveCommand(oldId, newId, ref.getName()));
+      return true;
+    } catch (ConfigInvalidException | IOException e) {
+      logger.atInfo().log(String.format("Error migrating change %s in %s", changeId, project), e);
+      return false;
+    }
+  }
+
+  private static boolean hasAnyLegacyComments(RevWalk rw, ObjectId id) throws IOException {
+    ObjectReader reader = rw.getObjectReader();
+    reset(rw, id);
+
+    // Check the note map at each commit, not just the tip. It's possible that the server switched
+    // from legacy to JSON partway through its history, which would have mixed legacy/JSON comments
+    // in its history. Although the tip commit would continue to parse once we remove the legacy
+    // parser, our goal is really to expunge all vestiges of the old format, which implies rewriting
+    // history (and thus returning true) in this case.
+    RevCommit c;
+    while ((c = rw.next()) != null) {
+      NoteMap noteMap = NoteMap.read(reader, c);
+      for (Note note : noteMap) {
+        // Match pre-parsing logic in RevisionNote#parse().
+        ObjectLoader objectLoader = reader.open(note.getData(), OBJ_BLOB);
+        if (objectLoader.isLarge()) {
+          throw new IOException(String.format("Comment note %s is too large", note.name()));
+        }
+        byte[] raw = objectLoader.getCachedBytes();
+        MutableInteger p = new MutableInteger();
+        RevisionNote.trimLeadingEmptyLines(raw, p);
+        if (!ChangeRevisionNote.isJson(raw, p.value)) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+  private static void reset(RevWalk rw, ObjectId id) throws IOException {
+    rw.reset();
+    rw.sort(RevSort.TOPO);
+    rw.sort(RevSort.REVERSE);
+    rw.markStart(rw.parseCommit(id));
+  }
+
+  private static ObjectInserter newPackInserter(Repository repo) {
+    if (!(repo instanceof FileRepository)) {
+      return repo.newObjectInserter();
+    }
+    PackInserter ins = ((FileRepository) repo).getObjectDatabase().newPackInserter();
+    ins.checkExisting(false);
+    return ins;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/CommentTimestampAdapter.java b/java/com/google/gerrit/server/notedb/CommentTimestampAdapter.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/notedb/CommentTimestampAdapter.java
rename to java/com/google/gerrit/server/notedb/CommentTimestampAdapter.java
diff --git a/java/com/google/gerrit/server/notedb/DeleteChangeMessageRewriter.java b/java/com/google/gerrit/server/notedb/DeleteChangeMessageRewriter.java
new file mode 100644
index 0000000..212aa37
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/DeleteChangeMessageRewriter.java
@@ -0,0 +1,133 @@
+// 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.
+
+package com.google.gerrit.server.notedb;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.parseCommitMessageRange;
+import static org.eclipse.jgit.util.RawParseUtils.decode;
+
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.RefNames;
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.util.Optional;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevSort;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.util.RawParseUtils;
+
+/**
+ * Deletes a change message from NoteDb by rewriting the commit history. After deletion, the whole
+ * change message will be replaced by a new message indicating the original change message has been
+ * deleted for the given reason.
+ */
+public class DeleteChangeMessageRewriter implements NoteDbRewriter {
+
+  private final Change.Id changeId;
+  private final int targetMessageIdx;
+  private final String newChangeMessage;
+
+  DeleteChangeMessageRewriter(Change.Id changeId, int targetMessageIdx, String newChangeMessage) {
+    this.changeId = changeId;
+    this.targetMessageIdx = targetMessageIdx;
+    this.newChangeMessage = newChangeMessage;
+  }
+
+  @Override
+  public String getRefName() {
+    return RefNames.changeMetaRef(changeId);
+  }
+
+  @Override
+  public ObjectId rewriteCommitHistory(RevWalk revWalk, ObjectInserter inserter, ObjectId currTip)
+      throws IOException {
+    checkArgument(!currTip.equals(ObjectId.zeroId()));
+
+    // Walk from the first commit of the branch.
+    revWalk.reset();
+    revWalk.markStart(revWalk.parseCommit(currTip));
+    revWalk.sort(RevSort.TOPO);
+    revWalk.sort(RevSort.REVERSE);
+
+    ObjectId newTipId = null;
+    RevCommit originalCommit;
+    int idx = 0;
+    while ((originalCommit = revWalk.next()) != null) {
+      if (idx < targetMessageIdx) {
+        newTipId = originalCommit;
+        idx++;
+        continue;
+      }
+
+      String newCommitMessage =
+          (idx == targetMessageIdx)
+              ? createNewCommitMessage(originalCommit)
+              : originalCommit.getFullMessage();
+      newTipId = rewriteOneCommit(originalCommit, newTipId, newCommitMessage, inserter);
+
+      idx++;
+    }
+    return newTipId;
+  }
+
+  private String createNewCommitMessage(RevCommit commit) {
+    byte[] raw = commit.getRawBuffer();
+
+    Optional<ChangeNoteUtil.CommitMessageRange> range = parseCommitMessageRange(commit);
+    checkState(range.isPresent(), "failed to parse commit message");
+
+    // Only replace the commit message body, which is the user-provided message. The subject and
+    // footers are NoteDb metadata.
+    Charset encoding = RawParseUtils.parseEncoding(raw);
+    String prefix =
+        decode(encoding, raw, range.get().subjectStart(), range.get().changeMessageStart());
+    String postfix = decode(encoding, raw, range.get().changeMessageEnd() + 1, raw.length);
+    return prefix + newChangeMessage + postfix;
+  }
+
+  /**
+   * Rewrites one commit.
+   *
+   * @param originalCommit the original commit to be rewritten.
+   * @param parentCommitId the parent of the new commit. For the first rewritten commit, it's the
+   *     parent of 'originalCommit'. For the latter rewritten commits, it's the commit rewritten
+   *     just before it.
+   * @param commitMessage the full commit message of the new commit.
+   * @param inserter the {@code ObjectInserter} for the rewrite process.
+   * @return the {@code objectId} of the new commit.
+   * @throws IOException
+   */
+  private ObjectId rewriteOneCommit(
+      RevCommit originalCommit,
+      ObjectId parentCommitId,
+      String commitMessage,
+      ObjectInserter inserter)
+      throws IOException {
+    CommitBuilder cb = new CommitBuilder();
+    if (parentCommitId != null) {
+      cb.setParentId(parentCommitId);
+    }
+    cb.setTreeId(originalCommit.getTree());
+    cb.setMessage(commitMessage);
+    cb.setCommitter(originalCommit.getCommitterIdent());
+    cb.setAuthor(originalCommit.getAuthorIdent());
+    cb.setEncoding(originalCommit.getEncoding());
+    return inserter.insert(cb);
+  }
+}
diff --git a/java/com/google/gerrit/server/notedb/DeleteCommentRewriter.java b/java/com/google/gerrit/server/notedb/DeleteCommentRewriter.java
new file mode 100644
index 0000000..656e9ec
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/DeleteCommentRewriter.java
@@ -0,0 +1,256 @@
+// Copyright (C) 2017 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.google.gerrit.server.notedb;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.gerrit.reviewdb.client.PatchLineComment.Status.PUBLISHED;
+import static java.util.stream.Collectors.toList;
+import static java.util.stream.Collectors.toMap;
+import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.client.RevId;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.notes.NoteMap;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevSort;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+/**
+ * Deletes a published comment from NoteDb by rewriting the commit history. Instead of deleting the
+ * whole comment, it just replaces the comment's message with a new message.
+ */
+public class DeleteCommentRewriter implements NoteDbRewriter {
+
+  public interface Factory {
+    /**
+     * Creates a DeleteCommentRewriter instance.
+     *
+     * @param id the id of the change which contains the target comment.
+     * @param uuid the uuid of the target comment.
+     * @param newMessage the message used to replace the old message of the target comment.
+     * @return the DeleteCommentRewriter instance
+     */
+    DeleteCommentRewriter create(
+        Change.Id id, @Assisted("uuid") String uuid, @Assisted("newMessage") String newMessage);
+  }
+
+  private final ChangeNoteUtil noteUtil;
+  private final Change.Id changeId;
+  private final String uuid;
+  private final String newMessage;
+
+  @Inject
+  DeleteCommentRewriter(
+      ChangeNoteUtil noteUtil,
+      @Assisted Change.Id changeId,
+      @Assisted("uuid") String uuid,
+      @Assisted("newMessage") String newMessage) {
+    this.noteUtil = noteUtil;
+    this.changeId = changeId;
+    this.uuid = uuid;
+    this.newMessage = newMessage;
+  }
+
+  @Override
+  public String getRefName() {
+    return RefNames.changeMetaRef(changeId);
+  }
+
+  @Override
+  public ObjectId rewriteCommitHistory(RevWalk revWalk, ObjectInserter inserter, ObjectId currTip)
+      throws IOException, ConfigInvalidException, OrmException {
+    checkArgument(!currTip.equals(ObjectId.zeroId()));
+
+    // Walk from the first commit of the branch.
+    revWalk.reset();
+    revWalk.markStart(revWalk.parseCommit(currTip));
+    revWalk.sort(RevSort.REVERSE);
+
+    ObjectReader reader = revWalk.getObjectReader();
+    RevCommit newTipCommit = revWalk.next(); // The first commit will not be rewritten.
+    Map<String, Comment> parentComments =
+        getPublishedComments(noteUtil, changeId, reader, NoteMap.read(reader, newTipCommit));
+
+    boolean rewrite = false;
+    RevCommit originalCommit;
+    while ((originalCommit = revWalk.next()) != null) {
+      NoteMap noteMap = NoteMap.read(reader, originalCommit);
+      Map<String, Comment> currComments = getPublishedComments(noteUtil, changeId, reader, noteMap);
+
+      if (!rewrite && currComments.containsKey(uuid)) {
+        rewrite = true;
+      }
+
+      if (!rewrite) {
+        parentComments = currComments;
+        newTipCommit = originalCommit;
+        continue;
+      }
+
+      List<Comment> putInComments = getPutInComments(parentComments, currComments);
+      List<Comment> deletedComments = getDeletedComments(parentComments, currComments);
+      newTipCommit =
+          revWalk.parseCommit(
+              rewriteCommit(
+                  originalCommit, newTipCommit, inserter, reader, putInComments, deletedComments));
+      parentComments = currComments;
+    }
+
+    return newTipCommit;
+  }
+
+  /**
+   * Gets all the comments which are presented at a commit. Note they include the comments put in by
+   * the previous commits.
+   */
+  @VisibleForTesting
+  public static Map<String, Comment> getPublishedComments(
+      ChangeNoteJson changeNoteJson,
+      LegacyChangeNoteRead legacyChangeNoteRead,
+      Change.Id changeId,
+      ObjectReader reader,
+      NoteMap noteMap)
+      throws IOException, ConfigInvalidException {
+    return RevisionNoteMap.parse(
+            changeNoteJson, legacyChangeNoteRead, changeId, reader, noteMap, PUBLISHED)
+        .revisionNotes.values().stream()
+        .flatMap(n -> n.getComments().stream())
+        .collect(toMap(c -> c.key.uuid, Function.identity()));
+  }
+
+  public static Map<String, Comment> getPublishedComments(
+      ChangeNoteUtil noteUtil, Change.Id changeId, ObjectReader reader, NoteMap noteMap)
+      throws IOException, ConfigInvalidException {
+    return getPublishedComments(
+        noteUtil.getChangeNoteJson(),
+        noteUtil.getLegacyChangeNoteRead(),
+        changeId,
+        reader,
+        noteMap);
+  }
+  /**
+   * Gets the comments put in by the current commit. The message of the target comment will be
+   * replaced by the new message.
+   *
+   * @param parMap the comment map of the parent commit.
+   * @param curMap the comment map of the current commit.
+   * @return The comments put in by the current commit.
+   */
+  private List<Comment> getPutInComments(Map<String, Comment> parMap, Map<String, Comment> curMap) {
+    List<Comment> comments = new ArrayList<>();
+    for (String key : curMap.keySet()) {
+      if (!parMap.containsKey(key)) {
+        Comment comment = curMap.get(key);
+        if (key.equals(uuid)) {
+          comment.message = newMessage;
+        }
+        comments.add(comment);
+      }
+    }
+    return comments;
+  }
+
+  /**
+   * Gets the comments deleted by the current commit.
+   *
+   * @param parMap the comment map of the parent commit.
+   * @param curMap the comment map of the current commit.
+   * @return The comments deleted by the current commit.
+   */
+  private List<Comment> getDeletedComments(
+      Map<String, Comment> parMap, Map<String, Comment> curMap) {
+    return parMap.entrySet().stream()
+        .filter(c -> !curMap.containsKey(c.getKey()))
+        .map(Map.Entry::getValue)
+        .collect(toList());
+  }
+
+  /**
+   * Rewrites one commit.
+   *
+   * @param originalCommit the original commit to be rewritten.
+   * @param parentCommit the parent of the new commit.
+   * @param inserter the {@code ObjectInserter} for the rewrite process.
+   * @param reader the {@code ObjectReader} for the rewrite process.
+   * @param putInComments the comments put in by this commit.
+   * @param deletedComments the comments deleted by this commit.
+   * @return the {@code objectId} of the new commit.
+   * @throws IOException
+   * @throws ConfigInvalidException
+   */
+  private ObjectId rewriteCommit(
+      RevCommit originalCommit,
+      RevCommit parentCommit,
+      ObjectInserter inserter,
+      ObjectReader reader,
+      List<Comment> putInComments,
+      List<Comment> deletedComments)
+      throws IOException, ConfigInvalidException {
+    RevisionNoteMap<ChangeRevisionNote> revNotesMap =
+        RevisionNoteMap.parse(
+            noteUtil.getChangeNoteJson(),
+            noteUtil.getLegacyChangeNoteRead(),
+            changeId,
+            reader,
+            NoteMap.read(reader, parentCommit),
+            PUBLISHED);
+    RevisionNoteBuilder.Cache cache = new RevisionNoteBuilder.Cache(revNotesMap);
+
+    for (Comment c : putInComments) {
+      cache.get(new RevId(c.revId)).putComment(c);
+    }
+
+    for (Comment c : deletedComments) {
+      cache.get(new RevId(c.revId)).deleteComment(c.key);
+    }
+
+    Map<RevId, RevisionNoteBuilder> builders = cache.getBuilders();
+    for (Map.Entry<RevId, RevisionNoteBuilder> entry : builders.entrySet()) {
+      ObjectId objectId = ObjectId.fromString(entry.getKey().get());
+      byte[] data = entry.getValue().build(noteUtil.getChangeNoteJson());
+      if (data.length == 0) {
+        revNotesMap.noteMap.remove(objectId);
+      } else {
+        revNotesMap.noteMap.set(objectId, inserter.insert(OBJ_BLOB, data));
+      }
+    }
+
+    CommitBuilder cb = new CommitBuilder();
+    cb.setParentId(parentCommit);
+    cb.setTreeId(revNotesMap.noteMap.writeTree(inserter));
+    cb.setMessage(originalCommit.getFullMessage());
+    cb.setCommitter(originalCommit.getCommitterIdent());
+    cb.setAuthor(originalCommit.getAuthorIdent());
+    cb.setEncoding(originalCommit.getEncoding());
+
+    return inserter.insert(cb);
+  }
+}
diff --git a/java/com/google/gerrit/server/notedb/DraftCommentNotes.java b/java/com/google/gerrit/server/notedb/DraftCommentNotes.java
new file mode 100644
index 0000000..8acc8d4
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/DraftCommentNotes.java
@@ -0,0 +1,261 @@
+// Copyright (C) 2014 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.google.gerrit.server.notedb;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.gerrit.reviewdb.client.RefNames.refsDraftComments;
+import static com.google.gerrit.server.notedb.NoteDbTable.CHANGES;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.metrics.Timer1;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.PatchLineComment;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RevId;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.git.RepoRefCache;
+import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
+import com.google.gerrit.server.notedb.NoteDbUpdateManager.StagedResult;
+import com.google.gerrit.server.notedb.rebuild.ChangeRebuilder;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.assistedinject.Assisted;
+import com.google.inject.assistedinject.AssistedInject;
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.notes.NoteMap;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.transport.ReceiveCommand;
+
+/** View of the draft comments for a single {@link Change} based on the log of its drafts branch. */
+public class DraftCommentNotes extends AbstractChangeNotes<DraftCommentNotes> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public interface Factory {
+    DraftCommentNotes create(Change change, Account.Id accountId);
+
+    DraftCommentNotes createWithAutoRebuildingDisabled(Change.Id changeId, Account.Id accountId);
+  }
+
+  private final Change change;
+  private final Account.Id author;
+  private final NoteDbUpdateManager.Result rebuildResult;
+  private final Ref ref;
+
+  private ImmutableListMultimap<RevId, Comment> comments;
+  private RevisionNoteMap<ChangeRevisionNote> revisionNoteMap;
+
+  @AssistedInject
+  DraftCommentNotes(Args args, @Assisted Change change, @Assisted Account.Id author) {
+    this(args, change, author, true, null, null);
+  }
+
+  @AssistedInject
+  DraftCommentNotes(Args args, @Assisted Change.Id changeId, @Assisted Account.Id author) {
+    // PrimaryStorage is unknown; this should only called by
+    // PatchLineCommentsUtil#draftByAuthor, which can live with this.
+    super(args, changeId, null, false);
+    this.change = null;
+    this.author = author;
+    this.rebuildResult = null;
+    this.ref = null;
+  }
+
+  DraftCommentNotes(
+      Args args,
+      Change change,
+      Account.Id author,
+      boolean autoRebuild,
+      @Nullable NoteDbUpdateManager.Result rebuildResult,
+      @Nullable Ref ref) {
+    super(args, change.getId(), PrimaryStorage.of(change), autoRebuild);
+    this.change = change;
+    this.author = author;
+    this.rebuildResult = rebuildResult;
+    this.ref = ref;
+    if (ref != null) {
+      checkArgument(
+          ref.getName().equals(getRefName()),
+          "draft ref not for change %s and account %s: %s",
+          getChangeId(),
+          author,
+          ref.getName());
+    }
+  }
+
+  RevisionNoteMap<ChangeRevisionNote> getRevisionNoteMap() {
+    return revisionNoteMap;
+  }
+
+  public Account.Id getAuthor() {
+    return author;
+  }
+
+  public ImmutableListMultimap<RevId, Comment> getComments() {
+    return comments;
+  }
+
+  public boolean containsComment(Comment c) {
+    for (Comment existing : comments.values()) {
+      if (c.key.equals(existing.key)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @Override
+  protected String getRefName() {
+    return refsDraftComments(getChangeId(), author);
+  }
+
+  @Override
+  protected ObjectId readRef(Repository repo) throws IOException {
+    if (ref != null) {
+      return ref.getObjectId();
+    }
+    return super.readRef(repo);
+  }
+
+  @Override
+  protected void onLoad(LoadHandle handle) throws IOException, ConfigInvalidException {
+    ObjectId rev = handle.id();
+    if (rev == null) {
+      loadDefaults();
+      return;
+    }
+
+    logger.atFine().log(
+        "Load draft comment notes for change %s of project %s", getChangeId(), getProjectName());
+    RevCommit tipCommit = handle.walk().parseCommit(rev);
+    ObjectReader reader = handle.walk().getObjectReader();
+    revisionNoteMap =
+        RevisionNoteMap.parse(
+            args.changeNoteJson,
+            args.legacyChangeNoteRead,
+            getChangeId(),
+            reader,
+            NoteMap.read(reader, tipCommit),
+            PatchLineComment.Status.DRAFT);
+    ListMultimap<RevId, Comment> cs = MultimapBuilder.hashKeys().arrayListValues().build();
+    for (ChangeRevisionNote rn : revisionNoteMap.revisionNotes.values()) {
+      for (Comment c : rn.getComments()) {
+        cs.put(new RevId(c.revId), c);
+      }
+    }
+    comments = ImmutableListMultimap.copyOf(cs);
+  }
+
+  @Override
+  protected void loadDefaults() {
+    comments = ImmutableListMultimap.of();
+  }
+
+  @Override
+  public Project.NameKey getProjectName() {
+    return args.allUsers;
+  }
+
+  @Override
+  protected LoadHandle openHandle(Repository repo) throws NoSuchChangeException, IOException {
+    if (rebuildResult != null) {
+      StagedResult sr = requireNonNull(rebuildResult.staged());
+      return LoadHandle.create(
+          ChangeNotesCommit.newStagedRevWalk(repo, sr.allUsersObjects()),
+          findNewId(sr.allUsersCommands(), getRefName()));
+    } else if (change != null && autoRebuild) {
+      NoteDbChangeState state = NoteDbChangeState.parse(change);
+      // Only check if this particular user's drafts are up to date, to avoid
+      // reading unnecessary refs.
+      if (!NoteDbChangeState.areDraftsUpToDate(
+          state, new RepoRefCache(repo), getChangeId(), author)) {
+        return rebuildAndOpen(repo);
+      }
+    }
+    return super.openHandle(repo);
+  }
+
+  private static ObjectId findNewId(Iterable<ReceiveCommand> cmds, String refName) {
+    for (ReceiveCommand cmd : cmds) {
+      if (cmd.getRefName().equals(refName)) {
+        return cmd.getNewId();
+      }
+    }
+    return null;
+  }
+
+  private LoadHandle rebuildAndOpen(Repository repo) throws NoSuchChangeException, IOException {
+    Timer1.Context timer = args.metrics.autoRebuildLatency.start(CHANGES);
+    try {
+      Change.Id cid = getChangeId();
+      ReviewDb db = args.db.get();
+      ChangeRebuilder rebuilder = args.rebuilder.get();
+      NoteDbUpdateManager.Result r;
+      try (NoteDbUpdateManager manager = rebuilder.stage(db, cid)) {
+        if (manager == null) {
+          return super.openHandle(repo); // May be null in tests.
+        }
+        r = manager.stageAndApplyDelta(change);
+        try {
+          rebuilder.execute(db, cid, manager);
+          repo.scanForRepoChanges();
+        } catch (OrmException | IOException e) {
+          // See ChangeNotes#rebuildAndOpen.
+          logger.atFine().log(
+              "Rebuilding change %s via drafts failed: %s", getChangeId(), e.getMessage());
+          args.metrics.autoRebuildFailureCount.increment(CHANGES);
+          requireNonNull(r.staged());
+          return LoadHandle.create(
+              ChangeNotesCommit.newStagedRevWalk(repo, r.staged().allUsersObjects()), draftsId(r));
+        }
+      }
+      return LoadHandle.create(ChangeNotesCommit.newRevWalk(repo), draftsId(r));
+    } catch (NoSuchChangeException e) {
+      return super.openHandle(repo);
+    } catch (OrmException e) {
+      throw new IOException(e);
+    } finally {
+      logger.atFine().log(
+          "Rebuilt change %s in %s in %s ms via drafts",
+          getChangeId(),
+          change != null ? "project " + change.getProject() : "unknown project",
+          TimeUnit.MILLISECONDS.convert(timer.stop(), TimeUnit.NANOSECONDS));
+    }
+  }
+
+  private ObjectId draftsId(NoteDbUpdateManager.Result r) {
+    requireNonNull(r);
+    requireNonNull(r.newState());
+    return r.newState().getDraftIds().get(author);
+  }
+
+  @VisibleForTesting
+  NoteMap getNoteMap() {
+    return revisionNoteMap != null ? revisionNoteMap.noteMap : null;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/GwtormChangeBundleReader.java b/java/com/google/gerrit/server/notedb/GwtormChangeBundleReader.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/notedb/GwtormChangeBundleReader.java
rename to java/com/google/gerrit/server/notedb/GwtormChangeBundleReader.java
diff --git a/java/com/google/gerrit/server/notedb/LegacyChangeNoteRead.java b/java/com/google/gerrit/server/notedb/LegacyChangeNoteRead.java
new file mode 100644
index 0000000..819c8ac
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/LegacyChangeNoteRead.java
@@ -0,0 +1,402 @@
+// 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.
+
+package com.google.gerrit.server.notedb;
+
+import static com.google.gerrit.server.notedb.ChangeNotes.parseException;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.Comment.Key;
+import com.google.gerrit.reviewdb.client.CommentRange;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.RevId;
+import com.google.gerrit.server.config.GerritServerId;
+import com.google.inject.Inject;
+import java.sql.Timestamp;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.util.GitDateParser;
+import org.eclipse.jgit.util.MutableInteger;
+import org.eclipse.jgit.util.QuotedString;
+import org.eclipse.jgit.util.RawParseUtils;
+
+public class LegacyChangeNoteRead {
+  private final String serverId;
+
+  @Inject
+  public LegacyChangeNoteRead(@GerritServerId String serverId) {
+    this.serverId = serverId;
+  }
+
+  public Account.Id parseIdent(PersonIdent ident, Change.Id changeId)
+      throws ConfigInvalidException {
+    return NoteDbUtil.parseIdent(ident, serverId)
+        .orElseThrow(
+            () ->
+                parseException(
+                    changeId,
+                    "invalid identity, expected <id>@%s: %s",
+                    serverId,
+                    ident.getEmailAddress()));
+  }
+
+  private static boolean match(byte[] note, MutableInteger p, byte[] expected) {
+    int m = RawParseUtils.match(note, p.value, expected);
+    return m == p.value + expected.length;
+  }
+
+  public List<Comment> parseNote(byte[] note, MutableInteger p, Change.Id changeId)
+      throws ConfigInvalidException {
+    if (p.value >= note.length) {
+      return ImmutableList.of();
+    }
+    Set<Key> seen = new HashSet<>();
+    List<Comment> result = new ArrayList<>();
+    int sizeOfNote = note.length;
+    byte[] psb = ChangeNoteUtil.PATCH_SET.getBytes(UTF_8);
+    byte[] bpsb = ChangeNoteUtil.BASE_PATCH_SET.getBytes(UTF_8);
+    byte[] bpn = ChangeNoteUtil.PARENT_NUMBER.getBytes(UTF_8);
+
+    RevId revId = new RevId(parseStringField(note, p, changeId, ChangeNoteUtil.REVISION));
+    String fileName = null;
+    PatchSet.Id psId = null;
+    boolean isForBase = false;
+    Integer parentNumber = null;
+
+    while (p.value < sizeOfNote) {
+      boolean matchPs = match(note, p, psb);
+      boolean matchBase = match(note, p, bpsb);
+      if (matchPs) {
+        fileName = null;
+        psId = parsePsId(note, p, changeId, ChangeNoteUtil.PATCH_SET);
+        isForBase = false;
+      } else if (matchBase) {
+        fileName = null;
+        psId = parsePsId(note, p, changeId, ChangeNoteUtil.BASE_PATCH_SET);
+        isForBase = true;
+        if (match(note, p, bpn)) {
+          parentNumber = parseParentNumber(note, p, changeId);
+        }
+      } else if (psId == null) {
+        throw parseException(
+            changeId,
+            "missing %s or %s header",
+            ChangeNoteUtil.PATCH_SET,
+            ChangeNoteUtil.BASE_PATCH_SET);
+      }
+
+      Comment c = parseComment(note, p, fileName, psId, revId, isForBase, parentNumber);
+      fileName = c.key.filename;
+      if (!seen.add(c.key)) {
+        throw parseException(changeId, "multiple comments for %s in note", c.key);
+      }
+      result.add(c);
+    }
+    return result;
+  }
+
+  private Comment parseComment(
+      byte[] note,
+      MutableInteger curr,
+      String currentFileName,
+      PatchSet.Id psId,
+      RevId revId,
+      boolean isForBase,
+      Integer parentNumber)
+      throws ConfigInvalidException {
+    Change.Id changeId = psId.getParentKey();
+
+    // Check if there is a new file.
+    boolean newFile =
+        (RawParseUtils.match(note, curr.value, ChangeNoteUtil.FILE.getBytes(UTF_8))) != -1;
+    if (newFile) {
+      // If so, parse the new file name.
+      currentFileName = parseFilename(note, curr, changeId);
+    } else if (currentFileName == null) {
+      throw parseException(changeId, "could not parse %s", ChangeNoteUtil.FILE);
+    }
+
+    CommentRange range = parseCommentRange(note, curr);
+    if (range == null) {
+      throw parseException(changeId, "could not parse %s", ChangeNoteUtil.COMMENT_RANGE);
+    }
+
+    Timestamp commentTime = parseTimestamp(note, curr, changeId);
+    Account.Id aId = parseAuthor(note, curr, changeId, ChangeNoteUtil.AUTHOR);
+    boolean hasRealAuthor =
+        (RawParseUtils.match(note, curr.value, ChangeNoteUtil.REAL_AUTHOR.getBytes(UTF_8))) != -1;
+    Account.Id raId = null;
+    if (hasRealAuthor) {
+      raId = parseAuthor(note, curr, changeId, ChangeNoteUtil.REAL_AUTHOR);
+    }
+
+    boolean hasParent =
+        (RawParseUtils.match(note, curr.value, ChangeNoteUtil.PARENT.getBytes(UTF_8))) != -1;
+    String parentUUID = null;
+    boolean unresolved = false;
+    if (hasParent) {
+      parentUUID = parseStringField(note, curr, changeId, ChangeNoteUtil.PARENT);
+    }
+    boolean hasUnresolved =
+        (RawParseUtils.match(note, curr.value, ChangeNoteUtil.UNRESOLVED.getBytes(UTF_8))) != -1;
+    if (hasUnresolved) {
+      unresolved = parseBooleanField(note, curr, changeId, ChangeNoteUtil.UNRESOLVED);
+    }
+
+    String uuid = parseStringField(note, curr, changeId, ChangeNoteUtil.UUID);
+
+    boolean hasTag =
+        (RawParseUtils.match(note, curr.value, ChangeNoteUtil.TAG.getBytes(UTF_8))) != -1;
+    String tag = null;
+    if (hasTag) {
+      tag = parseStringField(note, curr, changeId, ChangeNoteUtil.TAG);
+    }
+
+    int commentLength = parseCommentLength(note, curr, changeId);
+
+    String message = RawParseUtils.decode(UTF_8, note, curr.value, curr.value + commentLength);
+    checkResult(message, "message contents", changeId);
+
+    Comment c =
+        new Comment(
+            new Comment.Key(uuid, currentFileName, psId.get()),
+            aId,
+            commentTime,
+            isForBase ? (short) (parentNumber == null ? 0 : -parentNumber) : (short) 1,
+            message,
+            serverId,
+            unresolved);
+    c.lineNbr = range.getEndLine();
+    c.parentUuid = parentUUID;
+    c.tag = tag;
+    c.setRevId(revId);
+    if (raId != null) {
+      c.setRealAuthor(raId);
+    }
+
+    if (range.getStartCharacter() != -1) {
+      c.setRange(range);
+    }
+
+    curr.value = RawParseUtils.nextLF(note, curr.value + commentLength);
+    curr.value = RawParseUtils.nextLF(note, curr.value);
+    return c;
+  }
+
+  private static String parseStringField(
+      byte[] note, MutableInteger curr, Change.Id changeId, String fieldName)
+      throws ConfigInvalidException {
+    int endOfLine = RawParseUtils.nextLF(note, curr.value);
+    checkHeaderLineFormat(note, curr, fieldName, changeId);
+    int startOfField = RawParseUtils.endOfFooterLineKey(note, curr.value) + 2;
+    curr.value = endOfLine;
+    return RawParseUtils.decode(UTF_8, note, startOfField, endOfLine - 1);
+  }
+
+  /**
+   * @return a comment range. If the comment range line in the note only has one number, we return a
+   *     CommentRange with that one number as the end line and the other fields as -1. If the
+   *     comment range line in the note contains a whole comment range, then we return a
+   *     CommentRange with all fields set. If the line is not correctly formatted, return null.
+   */
+  private static CommentRange parseCommentRange(byte[] note, MutableInteger ptr) {
+    CommentRange range = new CommentRange(-1, -1, -1, -1);
+
+    int last = ptr.value;
+    int startLine = RawParseUtils.parseBase10(note, ptr.value, ptr);
+    if (ptr.value == last) {
+      return null;
+    } else if (note[ptr.value] == '\n') {
+      range.setEndLine(startLine);
+      ptr.value += 1;
+      return range;
+    } else if (note[ptr.value] == ':') {
+      range.setStartLine(startLine);
+      ptr.value += 1;
+    } else {
+      return null;
+    }
+
+    last = ptr.value;
+    int startChar = RawParseUtils.parseBase10(note, ptr.value, ptr);
+    if (ptr.value == last) {
+      return null;
+    } else if (note[ptr.value] == '-') {
+      range.setStartCharacter(startChar);
+      ptr.value += 1;
+    } else {
+      return null;
+    }
+
+    last = ptr.value;
+    int endLine = RawParseUtils.parseBase10(note, ptr.value, ptr);
+    if (ptr.value == last) {
+      return null;
+    } else if (note[ptr.value] == ':') {
+      range.setEndLine(endLine);
+      ptr.value += 1;
+    } else {
+      return null;
+    }
+
+    last = ptr.value;
+    int endChar = RawParseUtils.parseBase10(note, ptr.value, ptr);
+    if (ptr.value == last) {
+      return null;
+    } else if (note[ptr.value] == '\n') {
+      range.setEndCharacter(endChar);
+      ptr.value += 1;
+    } else {
+      return null;
+    }
+    return range;
+  }
+
+  private static PatchSet.Id parsePsId(
+      byte[] note, MutableInteger curr, Change.Id changeId, String fieldName)
+      throws ConfigInvalidException {
+    checkHeaderLineFormat(note, curr, fieldName, changeId);
+    int startOfPsId = RawParseUtils.endOfFooterLineKey(note, curr.value) + 1;
+    MutableInteger i = new MutableInteger();
+    int patchSetId = RawParseUtils.parseBase10(note, startOfPsId, i);
+    int endOfLine = RawParseUtils.nextLF(note, curr.value);
+    if (i.value != endOfLine - 1) {
+      throw parseException(changeId, "could not parse %s", fieldName);
+    }
+    checkResult(patchSetId, "patchset id", changeId);
+    curr.value = endOfLine;
+    return new PatchSet.Id(changeId, patchSetId);
+  }
+
+  private static Integer parseParentNumber(byte[] note, MutableInteger curr, Change.Id changeId)
+      throws ConfigInvalidException {
+    checkHeaderLineFormat(note, curr, ChangeNoteUtil.PARENT_NUMBER, changeId);
+
+    int start = RawParseUtils.endOfFooterLineKey(note, curr.value) + 1;
+    MutableInteger i = new MutableInteger();
+    int parentNumber = RawParseUtils.parseBase10(note, start, i);
+    int endOfLine = RawParseUtils.nextLF(note, curr.value);
+    if (i.value != endOfLine - 1) {
+      throw parseException(changeId, "could not parse %s", ChangeNoteUtil.PARENT_NUMBER);
+    }
+    checkResult(parentNumber, "parent number", changeId);
+    curr.value = endOfLine;
+    return Integer.valueOf(parentNumber);
+  }
+
+  private static String parseFilename(byte[] note, MutableInteger curr, Change.Id changeId)
+      throws ConfigInvalidException {
+    checkHeaderLineFormat(note, curr, ChangeNoteUtil.FILE, changeId);
+    int startOfFileName = RawParseUtils.endOfFooterLineKey(note, curr.value) + 2;
+    int endOfLine = RawParseUtils.nextLF(note, curr.value);
+    curr.value = endOfLine;
+    curr.value = RawParseUtils.nextLF(note, curr.value);
+    return QuotedString.GIT_PATH.dequote(
+        RawParseUtils.decode(UTF_8, note, startOfFileName, endOfLine - 1));
+  }
+
+  private static Timestamp parseTimestamp(byte[] note, MutableInteger curr, Change.Id changeId)
+      throws ConfigInvalidException {
+    int endOfLine = RawParseUtils.nextLF(note, curr.value);
+    Timestamp commentTime;
+    String dateString = RawParseUtils.decode(UTF_8, note, curr.value, endOfLine - 1);
+    try {
+      commentTime = new Timestamp(GitDateParser.parse(dateString, null, Locale.US).getTime());
+    } catch (ParseException e) {
+      throw new ConfigInvalidException("could not parse comment timestamp", e);
+    }
+    curr.value = endOfLine;
+    return checkResult(commentTime, "comment timestamp", changeId);
+  }
+
+  private Account.Id parseAuthor(
+      byte[] note, MutableInteger curr, Change.Id changeId, String fieldName)
+      throws ConfigInvalidException {
+    checkHeaderLineFormat(note, curr, fieldName, changeId);
+    int startOfAccountId = RawParseUtils.endOfFooterLineKey(note, curr.value) + 2;
+    PersonIdent ident = RawParseUtils.parsePersonIdent(note, startOfAccountId);
+    Account.Id aId = parseIdent(ident, changeId);
+    curr.value = RawParseUtils.nextLF(note, curr.value);
+    return checkResult(aId, fieldName, changeId);
+  }
+
+  private static int parseCommentLength(byte[] note, MutableInteger curr, Change.Id changeId)
+      throws ConfigInvalidException {
+    checkHeaderLineFormat(note, curr, ChangeNoteUtil.LENGTH, changeId);
+    int startOfLength = RawParseUtils.endOfFooterLineKey(note, curr.value) + 1;
+    MutableInteger i = new MutableInteger();
+    i.value = startOfLength;
+    int commentLength = RawParseUtils.parseBase10(note, startOfLength, i);
+    if (i.value == startOfLength) {
+      throw parseException(changeId, "could not parse %s", ChangeNoteUtil.LENGTH);
+    }
+    int endOfLine = RawParseUtils.nextLF(note, curr.value);
+    if (i.value != endOfLine - 1) {
+      throw parseException(changeId, "could not parse %s", ChangeNoteUtil.LENGTH);
+    }
+    curr.value = endOfLine;
+    return checkResult(commentLength, "comment length", changeId);
+  }
+
+  private boolean parseBooleanField(
+      byte[] note, MutableInteger curr, Change.Id changeId, String fieldName)
+      throws ConfigInvalidException {
+    String str = parseStringField(note, curr, changeId, fieldName);
+    if ("true".equalsIgnoreCase(str)) {
+      return true;
+    } else if ("false".equalsIgnoreCase(str)) {
+      return false;
+    }
+    throw parseException(changeId, "invalid boolean for %s: %s", fieldName, str);
+  }
+
+  private static <T> T checkResult(T o, String fieldName, Change.Id changeId)
+      throws ConfigInvalidException {
+    if (o == null) {
+      throw parseException(changeId, "could not parse %s", fieldName);
+    }
+    return o;
+  }
+
+  private static int checkResult(int i, String fieldName, Change.Id changeId)
+      throws ConfigInvalidException {
+    if (i <= 0) {
+      throw parseException(changeId, "could not parse %s", fieldName);
+    }
+    return i;
+  }
+
+  private static void checkHeaderLineFormat(
+      byte[] note, MutableInteger curr, String fieldName, Change.Id changeId)
+      throws ConfigInvalidException {
+    boolean correct = RawParseUtils.match(note, curr.value, fieldName.getBytes(UTF_8)) != -1;
+    int p = curr.value + fieldName.length();
+    correct &= (p < note.length && note[p] == ':');
+    p++;
+    correct &= (p < note.length && note[p] == ' ');
+    if (!correct) {
+      throw parseException(changeId, "could not parse %s", fieldName);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/notedb/LegacyChangeNoteWrite.java b/java/com/google/gerrit/server/notedb/LegacyChangeNoteWrite.java
new file mode 100644
index 0000000..c9711b5
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/LegacyChangeNoteWrite.java
@@ -0,0 +1,196 @@
+// 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.
+
+package com.google.gerrit.server.notedb;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static com.google.gerrit.server.CommentsUtil.COMMENT_ORDER;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ListMultimap;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.UsedAt;
+import com.google.gerrit.server.config.GerritServerId;
+import com.google.inject.Inject;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.sql.Timestamp;
+import java.util.Date;
+import java.util.List;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.util.QuotedString;
+
+public class LegacyChangeNoteWrite {
+
+  private final PersonIdent serverIdent;
+  private final String serverId;
+
+  @Inject
+  public LegacyChangeNoteWrite(
+      @GerritPersonIdent PersonIdent serverIdent, @GerritServerId String serverId) {
+    this.serverIdent = serverIdent;
+    this.serverId = serverId;
+  }
+
+  public PersonIdent newIdent(Account.Id authorId, Date when, PersonIdent serverIdent) {
+    return new PersonIdent(
+        authorId.toString(), authorId.get() + "@" + serverId, when, serverIdent.getTimeZone());
+  }
+
+  @VisibleForTesting
+  public PersonIdent newIdent(Account author, Date when, PersonIdent serverIdent) {
+    return new PersonIdent(
+        author.toString(), author.getId().get() + "@" + serverId, when, serverIdent.getTimeZone());
+  }
+
+  public String getServerId() {
+    return serverId;
+  }
+
+  private void appendHeaderField(PrintWriter writer, String field, String value) {
+    writer.print(field);
+    writer.print(": ");
+    writer.print(value);
+    writer.print('\n');
+  }
+
+  /**
+   * Build a note that contains the metadata for and the contents of all of the comments in the
+   * given comments.
+   *
+   * @param comments Comments to be written to the output stream, keyed by patch set ID; multiple
+   *     patch sets are allowed since base revisions may be shared across patch sets. All of the
+   *     comments must share the same RevId, and all the comments for a given patch set must have
+   *     the same side.
+   * @param out output stream to write to.
+   */
+  @UsedAt(UsedAt.Project.GOOGLE)
+  public void buildNote(ListMultimap<Integer, Comment> comments, OutputStream out) {
+    if (comments.isEmpty()) {
+      return;
+    }
+
+    ImmutableList<Integer> psIds = comments.keySet().stream().sorted().collect(toImmutableList());
+
+    OutputStreamWriter streamWriter = new OutputStreamWriter(out, UTF_8);
+    try (PrintWriter writer = new PrintWriter(streamWriter)) {
+      String revId = comments.values().iterator().next().revId;
+      appendHeaderField(writer, ChangeNoteUtil.REVISION, revId);
+
+      for (int psId : psIds) {
+        List<Comment> psComments = COMMENT_ORDER.sortedCopy(comments.get(psId));
+        Comment first = psComments.get(0);
+
+        short side = first.side;
+        appendHeaderField(
+            writer,
+            side <= 0 ? ChangeNoteUtil.BASE_PATCH_SET : ChangeNoteUtil.PATCH_SET,
+            Integer.toString(psId));
+        if (side < 0) {
+          appendHeaderField(writer, ChangeNoteUtil.PARENT_NUMBER, Integer.toString(-side));
+        }
+
+        String currentFilename = null;
+
+        for (Comment c : psComments) {
+          checkArgument(
+              revId.equals(c.revId),
+              "All comments being added must have all the same RevId. The "
+                  + "comment below does not have the same RevId as the others "
+                  + "(%s).\n%s",
+              revId,
+              c);
+          checkArgument(
+              side == c.side,
+              "All comments being added must all have the same side. The "
+                  + "comment below does not have the same side as the others "
+                  + "(%s).\n%s",
+              side,
+              c);
+          String commentFilename = QuotedString.GIT_PATH.quote(c.key.filename);
+
+          if (!commentFilename.equals(currentFilename)) {
+            currentFilename = commentFilename;
+            writer.print("File: ");
+            writer.print(commentFilename);
+            writer.print("\n\n");
+          }
+
+          appendOneComment(writer, c);
+        }
+      }
+    }
+  }
+
+  private void appendOneComment(PrintWriter writer, Comment c) {
+    // The CommentRange field for a comment is allowed to be null. If it is
+    // null, then in the first line, we simply use the line number field for a
+    // comment instead. If it isn't null, we write the comment range itself.
+    Comment.Range range = c.range;
+    if (range != null) {
+      writer.print(range.startLine);
+      writer.print(':');
+      writer.print(range.startChar);
+      writer.print('-');
+      writer.print(range.endLine);
+      writer.print(':');
+      writer.print(range.endChar);
+    } else {
+      writer.print(c.lineNbr);
+    }
+    writer.print("\n");
+
+    writer.print(NoteDbUtil.formatTime(serverIdent, c.writtenOn));
+    writer.print("\n");
+
+    appendIdent(writer, ChangeNoteUtil.AUTHOR, c.author.getId(), c.writtenOn);
+    if (!c.getRealAuthor().equals(c.author)) {
+      appendIdent(writer, ChangeNoteUtil.REAL_AUTHOR, c.getRealAuthor().getId(), c.writtenOn);
+    }
+
+    String parent = c.parentUuid;
+    if (parent != null) {
+      appendHeaderField(writer, ChangeNoteUtil.PARENT, parent);
+    }
+
+    appendHeaderField(writer, ChangeNoteUtil.UNRESOLVED, Boolean.toString(c.unresolved));
+    appendHeaderField(writer, ChangeNoteUtil.UUID, c.key.uuid);
+
+    if (c.tag != null) {
+      appendHeaderField(writer, ChangeNoteUtil.TAG, c.tag);
+    }
+
+    byte[] messageBytes = c.message.getBytes(UTF_8);
+    appendHeaderField(writer, ChangeNoteUtil.LENGTH, Integer.toString(messageBytes.length));
+
+    writer.print(c.message);
+    writer.print("\n\n");
+  }
+
+  private void appendIdent(PrintWriter writer, String header, Account.Id id, Timestamp ts) {
+    PersonIdent ident = newIdent(id, ts, serverIdent);
+    StringBuilder name = new StringBuilder();
+    PersonIdent.appendSanitized(name, ident.getName());
+    name.append(" <");
+    PersonIdent.appendSanitized(name, ident.getEmailAddress());
+    name.append('>');
+    appendHeaderField(writer, header, name.toString());
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/MutableNotesMigration.java b/java/com/google/gerrit/server/notedb/MutableNotesMigration.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/notedb/MutableNotesMigration.java
rename to java/com/google/gerrit/server/notedb/MutableNotesMigration.java
diff --git a/java/com/google/gerrit/server/notedb/NoteDbChangeState.java b/java/com/google/gerrit/server/notedb/NoteDbChangeState.java
new file mode 100644
index 0000000..e6b82e6
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/NoteDbChangeState.java
@@ -0,0 +1,477 @@
+// 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.
+
+package com.google.gerrit.server.notedb;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.gerrit.reviewdb.client.RefNames.changeMetaRef;
+import static com.google.gerrit.reviewdb.client.RefNames.refsDraftComments;
+import static com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage.NOTE_DB;
+import static com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage.REVIEW_DB;
+import static java.util.Objects.requireNonNull;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Splitter;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Maps;
+import com.google.common.primitives.Longs;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.server.ReviewDbUtil;
+import com.google.gerrit.server.git.RefCache;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmRuntimeException;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+
+/**
+ * The state of all relevant NoteDb refs across all repos corresponding to a given Change entity.
+ *
+ * <p>Stored serialized in the {@code Change#noteDbState} field, and used to determine whether the
+ * state in NoteDb is out of date.
+ *
+ * <p>Serialized in one of the forms:
+ *
+ * <ul>
+ *   <li>[meta-sha],[account1]=[drafts-sha],[account2]=[drafts-sha]...
+ *   <li>R,[meta-sha],[account1]=[drafts-sha],[account2]=[drafts-sha]...
+ *   <li>R=[read-only-until],[meta-sha],[account1]=[drafts-sha],[account2]=[drafts-sha]...
+ *   <li>N
+ *   <li>N=[read-only-until]
+ * </ul>
+ *
+ * in numeric account ID order, with hex SHA-1s for human readability.
+ */
+public class NoteDbChangeState {
+  public static final String NOTE_DB_PRIMARY_STATE = "N";
+
+  public enum PrimaryStorage {
+    REVIEW_DB('R'),
+    NOTE_DB('N');
+
+    private final char code;
+
+    PrimaryStorage(char code) {
+      this.code = code;
+    }
+
+    public static PrimaryStorage of(@Nullable Change c) {
+      return of(NoteDbChangeState.parse(c));
+    }
+
+    public static PrimaryStorage of(@Nullable NoteDbChangeState s) {
+      return s != null ? s.getPrimaryStorage() : REVIEW_DB;
+    }
+  }
+
+  @AutoValue
+  public abstract static class Delta {
+    @VisibleForTesting
+    public static Delta create(
+        Change.Id changeId,
+        Optional<ObjectId> newChangeMetaId,
+        Map<Account.Id, ObjectId> newDraftIds) {
+      if (newDraftIds == null) {
+        newDraftIds = ImmutableMap.of();
+      }
+      return new AutoValue_NoteDbChangeState_Delta(
+          changeId, newChangeMetaId, ImmutableMap.copyOf(newDraftIds));
+    }
+
+    abstract Change.Id changeId();
+
+    abstract Optional<ObjectId> newChangeMetaId();
+
+    abstract ImmutableMap<Account.Id, ObjectId> newDraftIds();
+  }
+
+  @AutoValue
+  public abstract static class RefState {
+    @VisibleForTesting
+    public static RefState create(ObjectId changeMetaId, Map<Account.Id, ObjectId> draftIds) {
+      return new AutoValue_NoteDbChangeState_RefState(
+          changeMetaId.copy(),
+          ImmutableMap.copyOf(Maps.filterValues(draftIds, id -> !ObjectId.zeroId().equals(id))));
+    }
+
+    private static Optional<RefState> parse(Change.Id changeId, List<String> parts) {
+      checkArgument(!parts.isEmpty(), "missing state string for change %s", changeId);
+      ObjectId changeMetaId = ObjectId.fromString(parts.get(0));
+      Map<Account.Id, ObjectId> draftIds = Maps.newHashMapWithExpectedSize(parts.size() - 1);
+      Splitter s = Splitter.on('=');
+      for (int i = 1; i < parts.size(); i++) {
+        String p = parts.get(i);
+        List<String> draftParts = s.splitToList(p);
+        checkArgument(
+            draftParts.size() == 2, "invalid draft state part for change %s: %s", changeId, p);
+        Optional<Account.Id> accountId = Account.Id.tryParse(draftParts.get(0));
+        checkArgument(
+            accountId.isPresent(),
+            "invalid account ID in draft state part for change %s: %s",
+            changeId,
+            p);
+        draftIds.put(accountId.get(), ObjectId.fromString(draftParts.get(1)));
+      }
+      return Optional.of(create(changeMetaId, draftIds));
+    }
+
+    abstract ObjectId changeMetaId();
+
+    abstract ImmutableMap<Account.Id, ObjectId> draftIds();
+
+    @Override
+    public String toString() {
+      return appendTo(new StringBuilder()).toString();
+    }
+
+    StringBuilder appendTo(StringBuilder sb) {
+      sb.append(changeMetaId().name());
+      for (Account.Id id : ReviewDbUtil.intKeyOrdering().sortedCopy(draftIds().keySet())) {
+        sb.append(',').append(id.get()).append('=').append(draftIds().get(id).name());
+      }
+      return sb;
+    }
+  }
+
+  public static NoteDbChangeState parse(@Nullable Change c) {
+    return c != null ? parse(c.getId(), c.getNoteDbState()) : null;
+  }
+
+  @VisibleForTesting
+  public static NoteDbChangeState parse(Change.Id id, @Nullable String str) {
+    if (Strings.isNullOrEmpty(str)) {
+      // Return null rather than Optional as this is what goes in the field in
+      // ReviewDb.
+      return null;
+    }
+    List<String> parts = Splitter.on(',').splitToList(str);
+    String first = parts.get(0);
+    Optional<Timestamp> readOnlyUntil = parseReadOnlyUntil(id, str, first);
+
+    // Only valid NOTE_DB state is "N".
+    if (parts.size() == 1 && first.charAt(0) == NOTE_DB.code) {
+      return new NoteDbChangeState(id, NOTE_DB, Optional.empty(), readOnlyUntil);
+    }
+
+    // Otherwise it must be REVIEW_DB, either "R,<RefState>" or just
+    // "<RefState>". Allow length > 0 for forward compatibility.
+    if (first.length() > 0) {
+      Optional<RefState> refState;
+      if (first.charAt(0) == REVIEW_DB.code) {
+        refState = RefState.parse(id, parts.subList(1, parts.size()));
+      } else {
+        refState = RefState.parse(id, parts);
+      }
+      return new NoteDbChangeState(id, REVIEW_DB, refState, readOnlyUntil);
+    }
+    throw invalidState(id, str);
+  }
+
+  private static Optional<Timestamp> parseReadOnlyUntil(
+      Change.Id id, String fullStr, String first) {
+    if (first.length() > 2 && first.charAt(1) == '=') {
+      Long ts = Longs.tryParse(first.substring(2));
+      if (ts == null) {
+        throw invalidState(id, fullStr);
+      }
+      return Optional.of(new Timestamp(ts));
+    }
+    return Optional.empty();
+  }
+
+  private static IllegalArgumentException invalidState(Change.Id id, String str) {
+    return new IllegalArgumentException("invalid state string for change " + id + ": " + str);
+  }
+
+  /**
+   * Apply a delta to the state stored in a change entity.
+   *
+   * <p>This method does not check whether the old state was read-only; it is up to the caller to
+   * not violate read-only semantics when storing the change back in ReviewDb.
+   *
+   * @param change change entity. The delta is applied against this entity's {@code noteDbState} and
+   *     the new state is stored back in the entity as a side effect.
+   * @param delta delta to apply.
+   * @return new state, equivalent to what is stored in {@code change} as a side effect.
+   */
+  public static NoteDbChangeState applyDelta(Change change, Delta delta) {
+    if (delta == null) {
+      return null;
+    }
+    String oldStr = change.getNoteDbState();
+    if (oldStr == null && !delta.newChangeMetaId().isPresent()) {
+      // Neither an old nor a new meta ID was present, most likely because we
+      // aren't writing a NoteDb graph at all for this change at this point. No
+      // point in proceeding.
+      return null;
+    }
+    NoteDbChangeState oldState = parse(change.getId(), oldStr);
+    if (oldState != null && oldState.getPrimaryStorage() == NOTE_DB) {
+      // NOTE_DB state doesn't include RefState, so applying a delta is a no-op.
+      return oldState;
+    }
+
+    ObjectId changeMetaId;
+    if (delta.newChangeMetaId().isPresent()) {
+      changeMetaId = delta.newChangeMetaId().get();
+      if (changeMetaId.equals(ObjectId.zeroId())) {
+        change.setNoteDbState(null);
+        return null;
+      }
+    } else {
+      changeMetaId = oldState.getChangeMetaId();
+    }
+
+    Map<Account.Id, ObjectId> draftIds = new HashMap<>();
+    if (oldState != null) {
+      draftIds.putAll(oldState.getDraftIds());
+    }
+    for (Map.Entry<Account.Id, ObjectId> e : delta.newDraftIds().entrySet()) {
+      if (e.getValue().equals(ObjectId.zeroId())) {
+        draftIds.remove(e.getKey());
+      } else {
+        draftIds.put(e.getKey(), e.getValue());
+      }
+    }
+
+    NoteDbChangeState state =
+        new NoteDbChangeState(
+            change.getId(),
+            oldState != null ? oldState.getPrimaryStorage() : REVIEW_DB,
+            Optional.of(RefState.create(changeMetaId, draftIds)),
+            // Copy old read-only deadline rather than advancing it; the caller is
+            // still responsible for finishing the rest of its work before the lease
+            // runs out.
+            oldState != null ? oldState.getReadOnlyUntil() : Optional.empty());
+    change.setNoteDbState(state.toString());
+    return state;
+  }
+
+  // TODO(dborowitz): Ugly. Refactor these static methods into a Checker class
+  // or something. They do not belong in NoteDbChangeState itself because:
+  //  - need to inject Config but don't want a whole Factory
+  //  - can't be methods on NoteDbChangeState because state is nullable (though
+  //    we could also solve this by inventing an empty-but-non-null state)
+  // Also we should clean up duplicated code between static/non-static methods.
+  public static boolean isChangeUpToDate(
+      @Nullable NoteDbChangeState state, RefCache changeRepoRefs, Change.Id changeId)
+      throws IOException {
+    if (PrimaryStorage.of(state) == NOTE_DB) {
+      return true; // Primary storage is NoteDb, up to date by definition.
+    }
+    if (state == null) {
+      return !changeRepoRefs.get(changeMetaRef(changeId)).isPresent();
+    }
+    return state.isChangeUpToDate(changeRepoRefs);
+  }
+
+  public static boolean areDraftsUpToDate(
+      @Nullable NoteDbChangeState state,
+      RefCache draftsRepoRefs,
+      Change.Id changeId,
+      Account.Id accountId)
+      throws IOException {
+    if (PrimaryStorage.of(state) == NOTE_DB) {
+      return true; // Primary storage is NoteDb, up to date by definition.
+    }
+    if (state == null) {
+      return !draftsRepoRefs.get(refsDraftComments(changeId, accountId)).isPresent();
+    }
+    return state.areDraftsUpToDate(draftsRepoRefs, accountId);
+  }
+
+  public static long getReadOnlySkew(Config cfg) {
+    return cfg.getTimeUnit("notedb", null, "maxTimestampSkew", 1000, TimeUnit.MILLISECONDS);
+  }
+
+  static Timestamp timeForReadOnlyCheck(long skewMs) {
+    // Subtract some slop in case the machine that set the change's read-only
+    // lease has a clock behind ours.
+    return new Timestamp(TimeUtil.nowMs() - skewMs);
+  }
+
+  public static void checkNotReadOnly(@Nullable Change change, long skewMs) {
+    checkNotReadOnly(parse(change), skewMs);
+  }
+
+  public static void checkNotReadOnly(@Nullable NoteDbChangeState state, long skewMs) {
+    if (state == null) {
+      return; // No state means ReviewDb primary non-read-only.
+    } else if (state.isReadOnly(timeForReadOnlyCheck(skewMs))) {
+      throw new OrmRuntimeException(
+          "change "
+              + state.getChangeId()
+              + " is read-only until "
+              + state.getReadOnlyUntil().get());
+    }
+  }
+
+  private final Change.Id changeId;
+  private final PrimaryStorage primaryStorage;
+  private final Optional<RefState> refState;
+  private final Optional<Timestamp> readOnlyUntil;
+
+  public NoteDbChangeState(
+      Change.Id changeId,
+      PrimaryStorage primaryStorage,
+      Optional<RefState> refState,
+      Optional<Timestamp> readOnlyUntil) {
+    this.changeId = requireNonNull(changeId);
+    this.primaryStorage = requireNonNull(primaryStorage);
+    this.refState = requireNonNull(refState);
+    this.readOnlyUntil = requireNonNull(readOnlyUntil);
+
+    switch (primaryStorage) {
+      case REVIEW_DB:
+        checkArgument(
+            refState.isPresent(),
+            "expected RefState for change %s with primary storage %s",
+            changeId,
+            primaryStorage);
+        break;
+      case NOTE_DB:
+        checkArgument(
+            !refState.isPresent(),
+            "expected no RefState for change %s with primary storage %s",
+            changeId,
+            primaryStorage);
+        break;
+      default:
+        throw new IllegalStateException("invalid PrimaryStorage: " + primaryStorage);
+    }
+  }
+
+  public PrimaryStorage getPrimaryStorage() {
+    return primaryStorage;
+  }
+
+  public boolean isChangeUpToDate(RefCache changeRepoRefs) throws IOException {
+    if (primaryStorage == NOTE_DB) {
+      return true; // Primary storage is NoteDb, up to date by definition.
+    }
+    Optional<ObjectId> id = changeRepoRefs.get(changeMetaRef(changeId));
+    if (!id.isPresent()) {
+      return getChangeMetaId().equals(ObjectId.zeroId());
+    }
+    return id.get().equals(getChangeMetaId());
+  }
+
+  public boolean areDraftsUpToDate(RefCache draftsRepoRefs, Account.Id accountId)
+      throws IOException {
+    if (primaryStorage == NOTE_DB) {
+      return true; // Primary storage is NoteDb, up to date by definition.
+    }
+    Optional<ObjectId> id = draftsRepoRefs.get(refsDraftComments(changeId, accountId));
+    if (!id.isPresent()) {
+      return !getDraftIds().containsKey(accountId);
+    }
+    return id.get().equals(getDraftIds().get(accountId));
+  }
+
+  public boolean isUpToDate(RefCache changeRepoRefs, RefCache draftsRepoRefs) throws IOException {
+    if (primaryStorage == NOTE_DB) {
+      return true; // Primary storage is NoteDb, up to date by definition.
+    }
+    if (!isChangeUpToDate(changeRepoRefs)) {
+      return false;
+    }
+    for (Account.Id accountId : getDraftIds().keySet()) {
+      if (!areDraftsUpToDate(draftsRepoRefs, accountId)) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  public boolean isReadOnly(Timestamp now) {
+    return readOnlyUntil.isPresent() && now.before(readOnlyUntil.get());
+  }
+
+  public Optional<Timestamp> getReadOnlyUntil() {
+    return readOnlyUntil;
+  }
+
+  public NoteDbChangeState withReadOnlyUntil(Timestamp ts) {
+    return new NoteDbChangeState(changeId, primaryStorage, refState, Optional.of(ts));
+  }
+
+  public Change.Id getChangeId() {
+    return changeId;
+  }
+
+  public ObjectId getChangeMetaId() {
+    return refState().changeMetaId();
+  }
+
+  public ImmutableMap<Account.Id, ObjectId> getDraftIds() {
+    return refState().draftIds();
+  }
+
+  public Optional<RefState> getRefState() {
+    return refState;
+  }
+
+  private RefState refState() {
+    checkState(refState.isPresent(), "state for %s has no RefState: %s", changeId, this);
+    return refState.get();
+  }
+
+  @Override
+  public String toString() {
+    switch (primaryStorage) {
+      case REVIEW_DB:
+        if (!readOnlyUntil.isPresent()) {
+          // Don't include enum field, just IDs (though parse would accept it).
+          return refState().toString();
+        }
+        return primaryStorage.code + "=" + readOnlyUntil.get().getTime() + "," + refState.get();
+      case NOTE_DB:
+        if (!readOnlyUntil.isPresent()) {
+          return NOTE_DB_PRIMARY_STATE;
+        }
+        return primaryStorage.code + "=" + readOnlyUntil.get().getTime();
+      default:
+        throw new IllegalArgumentException("Unsupported PrimaryStorage: " + primaryStorage);
+    }
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(changeId, primaryStorage, refState, readOnlyUntil);
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (!(o instanceof NoteDbChangeState)) {
+      return false;
+    }
+    NoteDbChangeState s = (NoteDbChangeState) o;
+    return changeId.equals(s.changeId)
+        && primaryStorage.equals(s.primaryStorage)
+        && refState.equals(s.refState)
+        && readOnlyUntil.equals(s.readOnlyUntil);
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbMetrics.java b/java/com/google/gerrit/server/notedb/NoteDbMetrics.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbMetrics.java
rename to java/com/google/gerrit/server/notedb/NoteDbMetrics.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbModule.java b/java/com/google/gerrit/server/notedb/NoteDbModule.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbModule.java
rename to java/com/google/gerrit/server/notedb/NoteDbModule.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbRewriter.java b/java/com/google/gerrit/server/notedb/NoteDbRewriter.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbRewriter.java
rename to java/com/google/gerrit/server/notedb/NoteDbRewriter.java
diff --git a/java/com/google/gerrit/server/notedb/NoteDbTable.java b/java/com/google/gerrit/server/notedb/NoteDbTable.java
new file mode 100644
index 0000000..e299fdf
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/NoteDbTable.java
@@ -0,0 +1,30 @@
+// 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.
+
+package com.google.gerrit.server.notedb;
+
+public enum NoteDbTable {
+  ACCOUNTS,
+  GROUPS,
+  CHANGES;
+
+  public String key() {
+    return name().toLowerCase();
+  }
+
+  @Override
+  public String toString() {
+    return key();
+  }
+}
diff --git a/java/com/google/gerrit/server/notedb/NoteDbUpdateManager.java b/java/com/google/gerrit/server/notedb/NoteDbUpdateManager.java
new file mode 100644
index 0000000..12448fb
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/NoteDbUpdateManager.java
@@ -0,0 +1,894 @@
+// 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.
+
+package com.google.gerrit.server.notedb;
+
+import static com.google.common.base.MoreObjects.firstNonNull;
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.gerrit.reviewdb.client.RefNames.REFS_DRAFT_COMMENTS;
+import static com.google.gerrit.server.notedb.NoteDbTable.CHANGES;
+import static java.util.Objects.requireNonNull;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.HashBasedTable;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.collect.Table;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.metrics.Timer1;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.InMemoryInserter;
+import com.google.gerrit.server.git.InsertedObject;
+import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
+import com.google.gerrit.server.update.ChainedReceiveCommands;
+import com.google.gerrit.server.update.RefUpdateUtil;
+import com.google.gerrit.server.update.RetryingRestModifyView;
+import com.google.gwtorm.server.OrmConcurrencyException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.PushCertificate;
+import org.eclipse.jgit.transport.ReceiveCommand;
+
+/**
+ * Object to manage a single sequence of updates to NoteDb.
+ *
+ * <p>Instances are one-time-use. Handles updating both the change repo and the All-Users repo for
+ * any affected changes, with proper ordering.
+ *
+ * <p>To see the state that would be applied prior to executing the full sequence of updates, use
+ * {@link #stage()}.
+ */
+public class NoteDbUpdateManager implements AutoCloseable {
+  public static final String CHANGES_READ_ONLY = "NoteDb changes are read-only";
+
+  private static final ImmutableList<String> PACKAGE_PREFIXES =
+      ImmutableList.of("com.google.gerrit.server.", "com.google.gerrit.");
+  private static final ImmutableSet<String> SERVLET_NAMES =
+      ImmutableSet.of(
+          "com.google.gerrit.httpd.restapi.RestApiServlet", RetryingRestModifyView.class.getName());
+
+  public interface Factory {
+    NoteDbUpdateManager create(Project.NameKey projectName);
+  }
+
+  @AutoValue
+  public abstract static class StagedResult {
+    private static StagedResult create(
+        Change.Id id, NoteDbChangeState.Delta delta, OpenRepo changeRepo, OpenRepo allUsersRepo) {
+      ImmutableList<ReceiveCommand> changeCommands = ImmutableList.of();
+      ImmutableList<InsertedObject> changeObjects = ImmutableList.of();
+      if (changeRepo != null) {
+        changeCommands = changeRepo.getCommandsSnapshot();
+        changeObjects = changeRepo.getInsertedObjects();
+      }
+      ImmutableList<ReceiveCommand> allUsersCommands = ImmutableList.of();
+      ImmutableList<InsertedObject> allUsersObjects = ImmutableList.of();
+      if (allUsersRepo != null) {
+        allUsersCommands = allUsersRepo.getCommandsSnapshot();
+        allUsersObjects = allUsersRepo.getInsertedObjects();
+      }
+      return new AutoValue_NoteDbUpdateManager_StagedResult(
+          id, delta,
+          changeCommands, changeObjects,
+          allUsersCommands, allUsersObjects);
+    }
+
+    public abstract Change.Id id();
+
+    @Nullable
+    public abstract NoteDbChangeState.Delta delta();
+
+    public abstract ImmutableList<ReceiveCommand> changeCommands();
+
+    /**
+     * Objects inserted into the change repo for this change.
+     *
+     * <p>Includes all objects inserted for any change in this repo that may have been processed by
+     * the corresponding {@link NoteDbUpdateManager} instance, not just those objects that were
+     * inserted to handle this specific change's updates.
+     *
+     * @return inserted objects, or null if the corresponding {@link NoteDbUpdateManager} was
+     *     configured not to {@link NoteDbUpdateManager#setSaveObjects(boolean) save objects}.
+     */
+    @Nullable
+    public abstract ImmutableList<InsertedObject> changeObjects();
+
+    public abstract ImmutableList<ReceiveCommand> allUsersCommands();
+
+    /**
+     * Objects inserted into the All-Users repo for this change.
+     *
+     * <p>Includes all objects inserted into All-Users for any change that may have been processed
+     * by the corresponding {@link NoteDbUpdateManager} instance, not just those objects that were
+     * inserted to handle this specific change's updates.
+     *
+     * @return inserted objects, or null if the corresponding {@link NoteDbUpdateManager} was
+     *     configured not to {@link NoteDbUpdateManager#setSaveObjects(boolean) save objects}.
+     */
+    @Nullable
+    public abstract ImmutableList<InsertedObject> allUsersObjects();
+  }
+
+  @AutoValue
+  public abstract static class Result {
+    static Result create(NoteDbUpdateManager.StagedResult staged, NoteDbChangeState newState) {
+      return new AutoValue_NoteDbUpdateManager_Result(newState, staged);
+    }
+
+    @Nullable
+    public abstract NoteDbChangeState newState();
+
+    @Nullable
+    abstract NoteDbUpdateManager.StagedResult staged();
+  }
+
+  public static class OpenRepo implements AutoCloseable {
+    public final Repository repo;
+    public final RevWalk rw;
+    public final ChainedReceiveCommands cmds;
+
+    private final InMemoryInserter inMemIns;
+    private final ObjectInserter tempIns;
+    @Nullable private final ObjectInserter finalIns;
+
+    private final boolean close;
+    private final boolean saveObjects;
+
+    private OpenRepo(
+        Repository repo,
+        RevWalk rw,
+        @Nullable ObjectInserter ins,
+        ChainedReceiveCommands cmds,
+        boolean close,
+        boolean saveObjects) {
+      ObjectReader reader = rw.getObjectReader();
+      checkArgument(
+          ins == null || reader.getCreatedFromInserter() == ins,
+          "expected reader to be created from %s, but was %s",
+          ins,
+          reader.getCreatedFromInserter());
+      this.repo = requireNonNull(repo);
+
+      if (saveObjects) {
+        this.inMemIns = new InMemoryInserter(rw.getObjectReader());
+        this.tempIns = inMemIns;
+      } else {
+        checkArgument(ins != null);
+        this.inMemIns = null;
+        this.tempIns = ins;
+      }
+
+      this.rw = new RevWalk(tempIns.newReader());
+      this.finalIns = ins;
+      this.cmds = requireNonNull(cmds);
+      this.close = close;
+      this.saveObjects = saveObjects;
+    }
+
+    public Optional<ObjectId> getObjectId(String refName) throws IOException {
+      return cmds.get(refName);
+    }
+
+    ImmutableList<ReceiveCommand> getCommandsSnapshot() {
+      return ImmutableList.copyOf(cmds.getCommands().values());
+    }
+
+    @Nullable
+    ImmutableList<InsertedObject> getInsertedObjects() {
+      return saveObjects ? inMemIns.getInsertedObjects() : null;
+    }
+
+    void flush() throws IOException {
+      flushToFinalInserter();
+      finalIns.flush();
+    }
+
+    void flushToFinalInserter() throws IOException {
+      if (!saveObjects) {
+        return;
+      }
+      checkState(finalIns != null);
+      for (InsertedObject obj : inMemIns.getInsertedObjects()) {
+        finalIns.insert(obj.type(), obj.data().toByteArray());
+      }
+      inMemIns.clear();
+    }
+
+    @Override
+    public void close() {
+      rw.getObjectReader().close();
+      rw.close();
+      if (close) {
+        if (finalIns != null) {
+          finalIns.close();
+        }
+        repo.close();
+      }
+    }
+  }
+
+  private final Provider<PersonIdent> serverIdent;
+  private final GitRepositoryManager repoManager;
+  private final NotesMigration migration;
+  private final AllUsersName allUsersName;
+  private final NoteDbMetrics metrics;
+  private final Project.NameKey projectName;
+  private final ListMultimap<String, ChangeUpdate> changeUpdates;
+  private final ListMultimap<String, ChangeDraftUpdate> draftUpdates;
+  private final ListMultimap<String, RobotCommentUpdate> robotCommentUpdates;
+  private final ListMultimap<String, NoteDbRewriter> rewriters;
+  private final Set<Change.Id> toDelete;
+
+  private OpenRepo changeRepo;
+  private OpenRepo allUsersRepo;
+  private Map<Change.Id, StagedResult> staged;
+  private boolean checkExpectedState = true;
+  private boolean saveObjects = true;
+  private boolean atomicRefUpdates = true;
+  private String refLogMessage;
+  private PersonIdent refLogIdent;
+  private PushCertificate pushCert;
+
+  @Inject
+  NoteDbUpdateManager(
+      @GerritPersonIdent Provider<PersonIdent> serverIdent,
+      GitRepositoryManager repoManager,
+      NotesMigration migration,
+      AllUsersName allUsersName,
+      NoteDbMetrics metrics,
+      @Assisted Project.NameKey projectName) {
+    this.serverIdent = serverIdent;
+    this.repoManager = repoManager;
+    this.migration = migration;
+    this.allUsersName = allUsersName;
+    this.metrics = metrics;
+    this.projectName = projectName;
+    changeUpdates = MultimapBuilder.hashKeys().arrayListValues().build();
+    draftUpdates = MultimapBuilder.hashKeys().arrayListValues().build();
+    robotCommentUpdates = MultimapBuilder.hashKeys().arrayListValues().build();
+    rewriters = MultimapBuilder.hashKeys().arrayListValues().build();
+    toDelete = new HashSet<>();
+  }
+
+  @Override
+  public void close() {
+    try {
+      if (allUsersRepo != null) {
+        OpenRepo r = allUsersRepo;
+        allUsersRepo = null;
+        r.close();
+      }
+    } finally {
+      if (changeRepo != null) {
+        OpenRepo r = changeRepo;
+        changeRepo = null;
+        r.close();
+      }
+    }
+  }
+
+  public NoteDbUpdateManager setChangeRepo(
+      Repository repo, RevWalk rw, @Nullable ObjectInserter ins, ChainedReceiveCommands cmds) {
+    checkState(changeRepo == null, "change repo already initialized");
+    changeRepo = new OpenRepo(repo, rw, ins, cmds, false, saveObjects);
+    return this;
+  }
+
+  public NoteDbUpdateManager setAllUsersRepo(
+      Repository repo, RevWalk rw, @Nullable ObjectInserter ins, ChainedReceiveCommands cmds) {
+    checkState(allUsersRepo == null, "All-Users repo already initialized");
+    allUsersRepo = new OpenRepo(repo, rw, ins, cmds, false, saveObjects);
+    return this;
+  }
+
+  public NoteDbUpdateManager setCheckExpectedState(boolean checkExpectedState) {
+    this.checkExpectedState = checkExpectedState;
+    return this;
+  }
+
+  /**
+   * Set whether to save objects and make them available in {@link StagedResult}s.
+   *
+   * <p>If set, all objects inserted into all repos managed by this instance will be buffered in
+   * memory, and the {@link StagedResult}s will return non-null lists from {@link
+   * StagedResult#changeObjects()} and {@link StagedResult#allUsersObjects()}.
+   *
+   * <p>Not recommended if modifying a large number of changes with a single manager.
+   *
+   * @param saveObjects whether to save objects; defaults to true.
+   * @return this
+   */
+  public NoteDbUpdateManager setSaveObjects(boolean saveObjects) {
+    this.saveObjects = saveObjects;
+    return this;
+  }
+
+  /**
+   * Set whether to use atomic ref updates.
+   *
+   * <p>Can be set to false when the change updates represented by this manager aren't logically
+   * related, e.g. when the updater is only used to group objects together with a single inserter.
+   *
+   * @param atomicRefUpdates whether to use atomic ref updates; defaults to true.
+   * @return this
+   */
+  public NoteDbUpdateManager setAtomicRefUpdates(boolean atomicRefUpdates) {
+    this.atomicRefUpdates = atomicRefUpdates;
+    return this;
+  }
+
+  public NoteDbUpdateManager setRefLogMessage(String message) {
+    this.refLogMessage = message;
+    return this;
+  }
+
+  public NoteDbUpdateManager setRefLogIdent(PersonIdent ident) {
+    this.refLogIdent = ident;
+    return this;
+  }
+
+  /**
+   * Set a push certificate for the push that originally triggered this NoteDb update.
+   *
+   * <p>The pusher will not necessarily have specified any of the NoteDb refs explicitly, such as
+   * when processing a push to {@code refs/for/master}. That's fine; this is just passed to the
+   * underlying {@link BatchRefUpdate}, and the implementation decides what to do with it.
+   *
+   * <p>The cert should be associated with the main repo. There is currently no way of associating a
+   * push cert with the {@code All-Users} repo, since it is not currently possible to update draft
+   * changes via push.
+   *
+   * @param pushCert push certificate; may be null.
+   * @return this
+   */
+  public NoteDbUpdateManager setPushCertificate(PushCertificate pushCert) {
+    this.pushCert = pushCert;
+    return this;
+  }
+
+  public OpenRepo getChangeRepo() throws IOException {
+    initChangeRepo();
+    return changeRepo;
+  }
+
+  public OpenRepo getAllUsersRepo() throws IOException {
+    initAllUsersRepo();
+    return allUsersRepo;
+  }
+
+  private void initChangeRepo() throws IOException {
+    if (changeRepo == null) {
+      changeRepo = openRepo(projectName);
+    }
+  }
+
+  private void initAllUsersRepo() throws IOException {
+    if (allUsersRepo == null) {
+      allUsersRepo = openRepo(allUsersName);
+    }
+  }
+
+  private OpenRepo openRepo(Project.NameKey p) throws IOException {
+    Repository repo = repoManager.openRepository(p); // Closed by OpenRepo#close.
+    ObjectInserter ins = repo.newObjectInserter(); // Closed by OpenRepo#close.
+    ObjectReader reader = ins.newReader(); // Not closed by OpenRepo#close.
+    try (RevWalk rw = new RevWalk(reader)) { // Doesn't escape OpenRepo constructor.
+      return new OpenRepo(repo, rw, ins, new ChainedReceiveCommands(repo), true, saveObjects) {
+        @Override
+        public void close() {
+          reader.close();
+          super.close();
+        }
+      };
+    }
+  }
+
+  private boolean isEmpty() {
+    if (!migration.commitChangeWrites()) {
+      return true;
+    }
+    return changeUpdates.isEmpty()
+        && draftUpdates.isEmpty()
+        && robotCommentUpdates.isEmpty()
+        && rewriters.isEmpty()
+        && toDelete.isEmpty()
+        && !hasCommands(changeRepo)
+        && !hasCommands(allUsersRepo);
+  }
+
+  private static boolean hasCommands(@Nullable OpenRepo or) {
+    return or != null && !or.cmds.isEmpty();
+  }
+
+  /**
+   * Add an update to the list of updates to execute.
+   *
+   * <p>Updates should only be added to the manager after all mutations have been made, as this
+   * method may eagerly access the update.
+   *
+   * @param update the update to add.
+   */
+  public void add(ChangeUpdate update) {
+    checkArgument(
+        update.getProjectName().equals(projectName),
+        "update for project %s cannot be added to manager for project %s",
+        update.getProjectName(),
+        projectName);
+    checkState(staged == null, "cannot add new update after staging");
+    checkArgument(
+        !rewriters.containsKey(update.getRefName()),
+        "cannot update & rewrite ref %s in one BatchUpdate",
+        update.getRefName());
+
+    ChangeDraftUpdate du = update.getDraftUpdate();
+    if (du != null) {
+      draftUpdates.put(du.getRefName(), du);
+    }
+    RobotCommentUpdate rcu = update.getRobotCommentUpdate();
+    if (rcu != null) {
+      robotCommentUpdates.put(rcu.getRefName(), rcu);
+    }
+    DeleteCommentRewriter deleteCommentRewriter = update.getDeleteCommentRewriter();
+    if (deleteCommentRewriter != null) {
+      // Checks whether there is any ChangeUpdate or rewriter added earlier for the same ref.
+      checkArgument(
+          !changeUpdates.containsKey(deleteCommentRewriter.getRefName()),
+          "cannot update & rewrite ref %s in one BatchUpdate",
+          deleteCommentRewriter.getRefName());
+      checkArgument(
+          !rewriters.containsKey(deleteCommentRewriter.getRefName()),
+          "cannot rewrite the same ref %s in one BatchUpdate",
+          deleteCommentRewriter.getRefName());
+      rewriters.put(deleteCommentRewriter.getRefName(), deleteCommentRewriter);
+    }
+
+    DeleteChangeMessageRewriter deleteChangeMessageRewriter =
+        update.getDeleteChangeMessageRewriter();
+    if (deleteChangeMessageRewriter != null) {
+      // Checks whether there is any ChangeUpdate or rewriter added earlier for the same ref.
+      checkArgument(
+          !changeUpdates.containsKey(deleteChangeMessageRewriter.getRefName()),
+          "cannot update & rewrite ref %s in one BatchUpdate",
+          deleteChangeMessageRewriter.getRefName());
+      checkArgument(
+          !rewriters.containsKey(deleteChangeMessageRewriter.getRefName()),
+          "cannot rewrite the same ref %s in one BatchUpdate",
+          deleteChangeMessageRewriter.getRefName());
+      rewriters.put(deleteChangeMessageRewriter.getRefName(), deleteChangeMessageRewriter);
+    }
+
+    changeUpdates.put(update.getRefName(), update);
+  }
+
+  public void add(ChangeDraftUpdate draftUpdate) {
+    checkState(staged == null, "cannot add new update after staging");
+    draftUpdates.put(draftUpdate.getRefName(), draftUpdate);
+  }
+
+  public void deleteChange(Change.Id id) {
+    checkState(staged == null, "cannot add new change to delete after staging");
+    toDelete.add(id);
+  }
+
+  /**
+   * Stage updates in the manager's internal list of commands.
+   *
+   * @return map of the state that would get written to the applicable repo(s) for each affected
+   *     change.
+   * @throws OrmException if a database layer error occurs.
+   * @throws IOException if a storage layer error occurs.
+   */
+  public Map<Change.Id, StagedResult> stage() throws OrmException, IOException {
+    if (staged != null) {
+      return staged;
+    }
+    try (Timer1.Context timer = metrics.stageUpdateLatency.start(CHANGES)) {
+      staged = new HashMap<>();
+      if (isEmpty()) {
+        return staged;
+      }
+
+      initChangeRepo();
+      if (!draftUpdates.isEmpty() || !toDelete.isEmpty()) {
+        initAllUsersRepo();
+      }
+      checkExpectedState();
+      addCommands();
+
+      Table<Change.Id, Account.Id, ObjectId> allDraftIds = getDraftIds();
+      Set<Change.Id> changeIds = new HashSet<>();
+      for (ReceiveCommand cmd : changeRepo.getCommandsSnapshot()) {
+        Change.Id changeId = Change.Id.fromRef(cmd.getRefName());
+        if (changeId == null || !cmd.getRefName().equals(RefNames.changeMetaRef(changeId))) {
+          // Not a meta ref update, likely due to a repo update along with the change meta update.
+          continue;
+        }
+        changeIds.add(changeId);
+        Optional<ObjectId> metaId = Optional.of(cmd.getNewId());
+        staged.put(
+            changeId,
+            StagedResult.create(
+                changeId,
+                NoteDbChangeState.Delta.create(
+                    changeId, metaId, allDraftIds.rowMap().remove(changeId)),
+                changeRepo,
+                allUsersRepo));
+      }
+
+      for (Map.Entry<Change.Id, Map<Account.Id, ObjectId>> e : allDraftIds.rowMap().entrySet()) {
+        // If a change remains in the table at this point, it means we are
+        // updating its drafts but not the change itself.
+        StagedResult r =
+            StagedResult.create(
+                e.getKey(),
+                NoteDbChangeState.Delta.create(e.getKey(), Optional.empty(), e.getValue()),
+                changeRepo,
+                allUsersRepo);
+        checkState(
+            r.changeCommands().isEmpty(),
+            "should not have change commands when updating only drafts: %s",
+            r);
+        staged.put(r.id(), r);
+      }
+
+      return staged;
+    }
+  }
+
+  public Result stageAndApplyDelta(Change change) throws OrmException, IOException {
+    StagedResult sr = stage().get(change.getId());
+    NoteDbChangeState newState =
+        NoteDbChangeState.applyDelta(change, sr != null ? sr.delta() : null);
+    return Result.create(sr, newState);
+  }
+
+  private Table<Change.Id, Account.Id, ObjectId> getDraftIds() {
+    Table<Change.Id, Account.Id, ObjectId> draftIds = HashBasedTable.create();
+    if (allUsersRepo == null) {
+      return draftIds;
+    }
+    for (ReceiveCommand cmd : allUsersRepo.getCommandsSnapshot()) {
+      String r = cmd.getRefName();
+      if (r.startsWith(REFS_DRAFT_COMMENTS)) {
+        Change.Id changeId = Change.Id.fromRefPart(r.substring(REFS_DRAFT_COMMENTS.length()));
+        Account.Id accountId = Account.Id.fromRefSuffix(r);
+        checkDraftRef(accountId != null && changeId != null, r);
+        draftIds.put(changeId, accountId, cmd.getNewId());
+      }
+    }
+    return draftIds;
+  }
+
+  public void flush() throws IOException {
+    if (changeRepo != null) {
+      changeRepo.flush();
+    }
+    if (allUsersRepo != null) {
+      allUsersRepo.flush();
+    }
+  }
+
+  @Nullable
+  public BatchRefUpdate execute() throws OrmException, IOException {
+    return execute(false);
+  }
+
+  @Nullable
+  public BatchRefUpdate execute(boolean dryrun) throws OrmException, IOException {
+    // Check before even inspecting the list, as this is a programmer error.
+    if (migration.failChangeWrites()) {
+      throw new OrmException(CHANGES_READ_ONLY);
+    }
+    if (isEmpty()) {
+      return null;
+    }
+    try (Timer1.Context timer = metrics.updateLatency.start(CHANGES)) {
+      stage();
+      // ChangeUpdates must execute before ChangeDraftUpdates.
+      //
+      // ChangeUpdate will automatically delete draft comments for any published
+      // comments, but the updates to the two repos don't happen atomically.
+      // Thus if the change meta update succeeds and the All-Users update fails,
+      // we may have stale draft comments. Doing it in this order allows stale
+      // comments to be filtered out by ChangeNotes, reflecting the fact that
+      // comments can only go from DRAFT to PUBLISHED, not vice versa.
+      BatchRefUpdate result = execute(changeRepo, dryrun, pushCert);
+      execute(allUsersRepo, dryrun, null);
+      return result;
+    } finally {
+      close();
+    }
+  }
+
+  private BatchRefUpdate execute(OpenRepo or, boolean dryrun, @Nullable PushCertificate pushCert)
+      throws IOException {
+    if (or == null || or.cmds.isEmpty()) {
+      return null;
+    }
+    if (!dryrun) {
+      or.flush();
+    } else {
+      // OpenRepo buffers objects separately; caller may assume that objects are available in the
+      // inserter it previously passed via setChangeRepo.
+      or.flushToFinalInserter();
+    }
+
+    BatchRefUpdate bru = or.repo.getRefDatabase().newBatchUpdate();
+    bru.setPushCertificate(pushCert);
+    if (refLogMessage != null) {
+      bru.setRefLogMessage(refLogMessage, false);
+    } else {
+      bru.setRefLogMessage(firstNonNull(guessRestApiHandler(), "Update NoteDb refs"), false);
+    }
+    bru.setRefLogIdent(refLogIdent != null ? refLogIdent : serverIdent.get());
+    bru.setAtomic(atomicRefUpdates);
+    or.cmds.addTo(bru);
+    bru.setAllowNonFastForwards(true);
+
+    if (!dryrun) {
+      RefUpdateUtil.executeChecked(bru, or.rw);
+    }
+    return bru;
+  }
+
+  private static String guessRestApiHandler() {
+    StackTraceElement[] trace = Thread.currentThread().getStackTrace();
+    int i = findRestApiServlet(trace);
+    if (i < 0) {
+      return null;
+    }
+    try {
+      for (i--; i >= 0; i--) {
+        String cn = trace[i].getClassName();
+        Class<?> cls = Class.forName(cn);
+        if (RestModifyView.class.isAssignableFrom(cls) && cls != RetryingRestModifyView.class) {
+          return viewName(cn);
+        }
+      }
+      return null;
+    } catch (ClassNotFoundException e) {
+      return null;
+    }
+  }
+
+  private static String viewName(String cn) {
+    String impl = cn.replace('$', '.');
+    for (String p : PACKAGE_PREFIXES) {
+      if (impl.startsWith(p)) {
+        return impl.substring(p.length());
+      }
+    }
+    return impl;
+  }
+
+  private static int findRestApiServlet(StackTraceElement[] trace) {
+    for (int i = 0; i < trace.length; i++) {
+      if (SERVLET_NAMES.contains(trace[i].getClassName())) {
+        return i;
+      }
+    }
+    return -1;
+  }
+
+  private void addCommands() throws OrmException, IOException {
+    if (isEmpty()) {
+      return;
+    }
+    checkState(changeRepo != null, "must set change repo");
+    if (!draftUpdates.isEmpty()) {
+      checkState(allUsersRepo != null, "must set all users repo");
+    }
+    addUpdates(changeUpdates, changeRepo);
+    if (!draftUpdates.isEmpty()) {
+      addUpdates(draftUpdates, allUsersRepo);
+    }
+    if (!robotCommentUpdates.isEmpty()) {
+      addUpdates(robotCommentUpdates, changeRepo);
+    }
+    if (!rewriters.isEmpty()) {
+      addRewrites(rewriters, changeRepo);
+    }
+
+    for (Change.Id id : toDelete) {
+      doDelete(id);
+    }
+    checkExpectedState();
+  }
+
+  private void doDelete(Change.Id id) throws IOException {
+    String metaRef = RefNames.changeMetaRef(id);
+    Optional<ObjectId> old = changeRepo.cmds.get(metaRef);
+    if (old.isPresent()) {
+      changeRepo.cmds.add(new ReceiveCommand(old.get(), ObjectId.zeroId(), metaRef));
+    }
+
+    // Just scan repo for ref names, but get "old" values from cmds.
+    for (Ref r :
+        allUsersRepo.repo.getRefDatabase().getRefsByPrefix(RefNames.refsDraftCommentsPrefix(id))) {
+      old = allUsersRepo.cmds.get(r.getName());
+      if (old.isPresent()) {
+        allUsersRepo.cmds.add(new ReceiveCommand(old.get(), ObjectId.zeroId(), r.getName()));
+      }
+    }
+  }
+
+  public static class MismatchedStateException extends OrmException {
+    private static final long serialVersionUID = 1L;
+
+    private MismatchedStateException(Change.Id id, NoteDbChangeState expectedState) {
+      super(
+          String.format(
+              "cannot apply NoteDb updates for change %s; change meta ref does not match %s",
+              id, expectedState.getChangeMetaId().name()));
+    }
+  }
+
+  private void checkExpectedState() throws OrmException, IOException {
+    if (!checkExpectedState) {
+      return;
+    }
+
+    // Refuse to apply an update unless the state in NoteDb matches the state
+    // claimed in the ref. This means we may have failed a NoteDb ref update,
+    // and it would be incorrect to claim that the ref is up to date after this
+    // pipeline.
+    //
+    // Generally speaking, this case should be rare; in most cases, we should
+    // have detected and auto-fixed the stale state when creating ChangeNotes
+    // that got passed into the ChangeUpdate.
+    for (Collection<ChangeUpdate> us : changeUpdates.asMap().values()) {
+      ChangeUpdate u = us.iterator().next();
+      NoteDbChangeState expectedState = NoteDbChangeState.parse(u.getChange());
+
+      if (expectedState == null) {
+        // No previous state means we haven't previously written NoteDb graphs
+        // for this change yet. This means either:
+        //  - The change is new, and we'll be creating its ref.
+        //  - We short-circuited before adding any commands that update this
+        //    ref, and we won't stage a delta for this change either.
+        // Either way, it is safe to proceed here rather than throwing
+        // MismatchedStateException.
+        continue;
+      }
+
+      if (expectedState.getPrimaryStorage() == PrimaryStorage.NOTE_DB) {
+        // NoteDb is primary, no need to compare state to ReviewDb.
+        continue;
+      }
+
+      if (!expectedState.isChangeUpToDate(changeRepo.cmds.getRepoRefCache())) {
+        throw new MismatchedStateException(u.getId(), expectedState);
+      }
+    }
+
+    for (Collection<ChangeDraftUpdate> us : draftUpdates.asMap().values()) {
+      ChangeDraftUpdate u = us.iterator().next();
+      NoteDbChangeState expectedState = NoteDbChangeState.parse(u.getChange());
+
+      if (expectedState == null || expectedState.getPrimaryStorage() == PrimaryStorage.NOTE_DB) {
+        continue; // See above.
+      }
+
+      Account.Id accountId = u.getAccountId();
+      if (!expectedState.areDraftsUpToDate(allUsersRepo.cmds.getRepoRefCache(), accountId)) {
+        ObjectId expectedDraftId =
+            firstNonNull(expectedState.getDraftIds().get(accountId), ObjectId.zeroId());
+        throw new OrmConcurrencyException(
+            String.format(
+                "cannot apply NoteDb updates for change %s;"
+                    + " draft ref for account %s does not match %s",
+                u.getId(), accountId, expectedDraftId.name()));
+      }
+    }
+  }
+
+  private static <U extends AbstractChangeUpdate> void addUpdates(
+      ListMultimap<String, U> all, OpenRepo or) throws OrmException, IOException {
+    for (Map.Entry<String, Collection<U>> e : all.asMap().entrySet()) {
+      String refName = e.getKey();
+      Collection<U> updates = e.getValue();
+      ObjectId old = or.cmds.get(refName).orElse(ObjectId.zeroId());
+      // Only actually write to the ref if one of the updates explicitly allows
+      // us to do so, i.e. it is known to represent a new change. This avoids
+      // writing partial change meta if the change hasn't been backfilled yet.
+      if (!allowWrite(updates, old)) {
+        continue;
+      }
+
+      ObjectId curr = old;
+      for (U u : updates) {
+        if (u.isRootOnly() && !old.equals(ObjectId.zeroId())) {
+          throw new OrmException("Given ChangeUpdate is only allowed on initial commit");
+        }
+        ObjectId next = u.apply(or.rw, or.tempIns, curr);
+        if (next == null) {
+          continue;
+        }
+        curr = next;
+      }
+      if (!old.equals(curr)) {
+        or.cmds.add(new ReceiveCommand(old, curr, refName));
+      }
+    }
+  }
+
+  private static void addRewrites(ListMultimap<String, NoteDbRewriter> rewriters, OpenRepo openRepo)
+      throws OrmException, IOException {
+    for (Map.Entry<String, Collection<NoteDbRewriter>> entry : rewriters.asMap().entrySet()) {
+      String refName = entry.getKey();
+      ObjectId oldTip = openRepo.cmds.get(refName).orElse(ObjectId.zeroId());
+
+      if (oldTip.equals(ObjectId.zeroId())) {
+        throw new OrmException(String.format("Ref %s is empty", refName));
+      }
+
+      ObjectId currTip = oldTip;
+      try {
+        for (NoteDbRewriter noteDbRewriter : entry.getValue()) {
+          ObjectId nextTip =
+              noteDbRewriter.rewriteCommitHistory(openRepo.rw, openRepo.tempIns, currTip);
+          if (nextTip != null) {
+            currTip = nextTip;
+          }
+        }
+      } catch (ConfigInvalidException e) {
+        throw new OrmException("Cannot rewrite commit history", e);
+      }
+
+      if (!oldTip.equals(currTip)) {
+        openRepo.cmds.add(new ReceiveCommand(oldTip, currTip, refName));
+      }
+    }
+  }
+
+  private static <U extends AbstractChangeUpdate> boolean allowWrite(
+      Collection<U> updates, ObjectId old) {
+    if (!old.equals(ObjectId.zeroId())) {
+      return true;
+    }
+    return updates.iterator().next().allowWriteToNewRef();
+  }
+
+  private static void checkDraftRef(boolean condition, String refName) {
+    checkState(condition, "invalid draft ref: %s", refName);
+  }
+}
diff --git a/java/com/google/gerrit/server/notedb/NoteDbUtil.java b/java/com/google/gerrit/server/notedb/NoteDbUtil.java
new file mode 100644
index 0000000..21fada8
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/NoteDbUtil.java
@@ -0,0 +1,68 @@
+// Copyright (C) 2017 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.google.gerrit.server.notedb;
+
+import com.google.common.base.CharMatcher;
+import com.google.common.primitives.Ints;
+import com.google.gerrit.reviewdb.client.Account;
+import java.sql.Timestamp;
+import java.util.Optional;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.util.GitDateFormatter;
+import org.eclipse.jgit.util.GitDateFormatter.Format;
+
+public class NoteDbUtil {
+
+  /**
+   * Returns an AccountId for the given email address. Returns empty if the address isn't on this
+   * server.
+   */
+  public static Optional<Account.Id> parseIdent(PersonIdent ident, String serverId) {
+    String email = ident.getEmailAddress();
+    int at = email.indexOf('@');
+    if (at >= 0) {
+      String host = email.substring(at + 1, email.length());
+      if (host.equals(serverId)) {
+        Integer id = Ints.tryParse(email.substring(0, at));
+        if (id != null) {
+          return Optional.of(new Account.Id(id));
+        }
+      }
+    }
+    return Optional.empty();
+  }
+
+  private NoteDbUtil() {}
+
+  public static String formatTime(PersonIdent ident, Timestamp t) {
+    GitDateFormatter dateFormatter = new GitDateFormatter(Format.DEFAULT);
+    // TODO(dborowitz): Use a ThreadLocal or use Joda.
+    PersonIdent newIdent = new PersonIdent(ident, t);
+    return dateFormatter.formatDate(newIdent);
+  }
+
+  private static final CharMatcher INVALID_FOOTER_CHARS = CharMatcher.anyOf("\r\n\0");
+
+  static String sanitizeFooter(String value) {
+    // Remove characters that would confuse JGit's footer parser if they were
+    // included in footer values, for example by splitting the footer block into
+    // multiple paragraphs.
+    //
+    // One painful example: RevCommit#getShorMessage() might return a message
+    // containing "\r\r", which RevCommit#getFooterLines() will treat as an
+    // empty paragraph for the purposes of footer parsing.
+    return INVALID_FOOTER_CHARS.trimAndCollapseFrom(value, ' ');
+  }
+}
diff --git a/java/com/google/gerrit/server/notedb/NotesMigration.java b/java/com/google/gerrit/server/notedb/NotesMigration.java
new file mode 100644
index 0000000..9cee2cd
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/NotesMigration.java
@@ -0,0 +1,250 @@
+// Copyright (C) 2017 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.google.gerrit.server.notedb;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.gerrit.server.notedb.NoteDbTable.CHANGES;
+
+import com.google.auto.value.AutoValue;
+import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
+import com.google.inject.AbstractModule;
+import java.util.concurrent.atomic.AtomicReference;
+import org.eclipse.jgit.lib.Config;
+
+/**
+ * Current low-level settings of the NoteDb migration for changes.
+ *
+ * <p>This class only describes the migration state of the {@link
+ * com.google.gerrit.reviewdb.client.Change Change} entity group, since it is possible for a given
+ * site to be in different states of the Change NoteDb migration process while staying at the same
+ * ReviewDb schema version. It does <em>not</em> describe the migration state of non-Change tables;
+ * those are automatically migrated using the ReviewDb schema migration process, so the NoteDb
+ * migration state at a given ReviewDb schema cannot vary.
+ *
+ * <p>In many places, core Gerrit code should not directly care about the NoteDb migration state,
+ * and should prefer high-level APIs like {@link com.google.gerrit.server.ApprovalsUtil
+ * ApprovalsUtil} that don't require callers to inspect the migration state. The
+ * <em>implementation</em> of those utilities does care about the state, and should query the {@code
+ * NotesMigration} for the properties of the migration, for example, {@link #changePrimaryStorage()
+ * where new changes should be stored}.
+ *
+ * <p>Core Gerrit code is mostly interested in one facet of the migration at a time (reading or
+ * writing, say), but not all combinations of return values are supported or even make sense.
+ *
+ * <p>This class controls the state of the migration according to options in {@code gerrit.config}.
+ * In general, any changes to these options should only be made by adventurous administrators, who
+ * know what they're doing, on non-production data, for the purposes of testing the NoteDb
+ * implementation. Changing options quite likely requires re-running {@code MigrateToNoteDb}. For
+ * these reasons, the options remain undocumented.
+ *
+ * <p><strong>Note:</strong> Callers should not assume the values returned by {@code
+ * NotesMigration}'s methods will not change in a running server.
+ */
+public abstract class NotesMigration {
+  public static final String SECTION_NOTE_DB = "noteDb";
+  public static final String READ = "read";
+  public static final String WRITE = "write";
+  public static final String DISABLE_REVIEW_DB = "disableReviewDb";
+
+  private static final String PRIMARY_STORAGE = "primaryStorage";
+  private static final String SEQUENCE = "sequence";
+
+  public static class Module extends AbstractModule {
+    @Override
+    public void configure() {
+      bind(MutableNotesMigration.class);
+      bind(NotesMigration.class).to(MutableNotesMigration.class);
+    }
+  }
+
+  @AutoValue
+  abstract static class Snapshot {
+    static Builder builder() {
+      // Default values are defined as what we would read from an empty config.
+      return create(new Config()).toBuilder();
+    }
+
+    static Snapshot create(Config cfg) {
+      return new AutoValue_NotesMigration_Snapshot.Builder()
+          .setWriteChanges(cfg.getBoolean(SECTION_NOTE_DB, CHANGES.key(), WRITE, false))
+          .setReadChanges(cfg.getBoolean(SECTION_NOTE_DB, CHANGES.key(), READ, false))
+          .setReadChangeSequence(cfg.getBoolean(SECTION_NOTE_DB, CHANGES.key(), SEQUENCE, false))
+          .setChangePrimaryStorage(
+              cfg.getEnum(
+                  SECTION_NOTE_DB, CHANGES.key(), PRIMARY_STORAGE, PrimaryStorage.REVIEW_DB))
+          .setDisableChangeReviewDb(
+              cfg.getBoolean(SECTION_NOTE_DB, CHANGES.key(), DISABLE_REVIEW_DB, false))
+          .setFailOnLoadForTest(false) // Only set in tests, can't be set via config.
+          .build();
+    }
+
+    abstract boolean writeChanges();
+
+    abstract boolean readChanges();
+
+    abstract boolean readChangeSequence();
+
+    abstract PrimaryStorage changePrimaryStorage();
+
+    abstract boolean disableChangeReviewDb();
+
+    abstract boolean failOnLoadForTest();
+
+    abstract Builder toBuilder();
+
+    void setConfigValues(Config cfg) {
+      cfg.setBoolean(SECTION_NOTE_DB, CHANGES.key(), WRITE, writeChanges());
+      cfg.setBoolean(SECTION_NOTE_DB, CHANGES.key(), READ, readChanges());
+      cfg.setBoolean(SECTION_NOTE_DB, CHANGES.key(), SEQUENCE, readChangeSequence());
+      cfg.setEnum(SECTION_NOTE_DB, CHANGES.key(), PRIMARY_STORAGE, changePrimaryStorage());
+      cfg.setBoolean(SECTION_NOTE_DB, CHANGES.key(), DISABLE_REVIEW_DB, disableChangeReviewDb());
+    }
+
+    @AutoValue.Builder
+    abstract static class Builder {
+      abstract Builder setWriteChanges(boolean writeChanges);
+
+      abstract Builder setReadChanges(boolean readChanges);
+
+      abstract Builder setReadChangeSequence(boolean readChangeSequence);
+
+      abstract Builder setChangePrimaryStorage(PrimaryStorage changePrimaryStorage);
+
+      abstract Builder setDisableChangeReviewDb(boolean disableChangeReviewDb);
+
+      abstract Builder setFailOnLoadForTest(boolean failOnLoadForTest);
+
+      abstract Snapshot autoBuild();
+
+      Snapshot build() {
+        Snapshot s = autoBuild();
+        checkArgument(
+            !(s.disableChangeReviewDb() && s.changePrimaryStorage() != PrimaryStorage.NOTE_DB),
+            "cannot disable ReviewDb for changes if default change primary storage is ReviewDb");
+        return s;
+      }
+    }
+  }
+
+  protected final AtomicReference<Snapshot> snapshot;
+
+  /**
+   * Read changes from NoteDb.
+   *
+   * <p>Change data is read from NoteDb refs, but ReviewDb is still the source of truth. If the
+   * loader determines NoteDb is out of date, the change data in NoteDb will be transparently
+   * rebuilt. This means that some code paths that look read-only may in fact attempt to write.
+   *
+   * <p>If true and {@code writeChanges() = false}, changes can still be read from NoteDb, but any
+   * attempts to write will generate an error.
+   */
+  public final boolean readChanges() {
+    return snapshot.get().readChanges();
+  }
+
+  /**
+   * Write changes to NoteDb.
+   *
+   * <p>This method is awkwardly named because you should be using either {@link
+   * #commitChangeWrites()} or {@link #failChangeWrites()} instead.
+   *
+   * <p>Updates to change data are written to NoteDb refs, but ReviewDb is still the source of
+   * truth. Change data will not be written unless the NoteDb refs are already up to date, and the
+   * write path will attempt to rebuild the change if not.
+   *
+   * <p>If false, the behavior when attempting to write depends on {@code readChanges()}. If {@code
+   * readChanges() = false}, writes to NoteDb are simply ignored; if {@code true}, any attempts to
+   * write will generate an error.
+   */
+  public final boolean rawWriteChangesSetting() {
+    return snapshot.get().writeChanges();
+  }
+
+  /**
+   * Read sequential change ID numbers from NoteDb.
+   *
+   * <p>If true, change IDs are read from {@code refs/sequences/changes} in All-Projects. If false,
+   * change IDs are read from ReviewDb's native sequences.
+   */
+  public final boolean readChangeSequence() {
+    return snapshot.get().readChangeSequence();
+  }
+
+  /** @return default primary storage for new changes. */
+  public final PrimaryStorage changePrimaryStorage() {
+    return snapshot.get().changePrimaryStorage();
+  }
+
+  /**
+   * Disable ReviewDb access for changes.
+   *
+   * <p>When set, ReviewDb operations involving the Changes table become no-ops. Lookups return no
+   * results; updates do nothing, as does opening, committing, or rolling back a transaction on the
+   * Changes table.
+   */
+  public final boolean disableChangeReviewDb() {
+    return snapshot.get().disableChangeReviewDb();
+  }
+
+  /**
+   * Whether to fail when reading any data from NoteDb.
+   *
+   * <p>Used in conjunction with {@link #readChanges()} for tests.
+   */
+  public boolean failOnLoadForTest() {
+    return snapshot.get().failOnLoadForTest();
+  }
+
+  public final boolean commitChangeWrites() {
+    // It may seem odd that readChanges() without writeChanges() means we should
+    // attempt to commit writes. However, this method is used by callers to know
+    // whether or not they should short-circuit and skip attempting to read or
+    // write NoteDb refs.
+    //
+    // It is possible for commitChangeWrites() to return true and
+    // failChangeWrites() to also return true, causing an error later in the
+    // same codepath. This specific condition is used by the auto-rebuilding
+    // path to rebuild a change and stage the results, but not commit them due
+    // to failChangeWrites().
+    return rawWriteChangesSetting() || readChanges();
+  }
+
+  public final boolean failChangeWrites() {
+    return !rawWriteChangesSetting() && readChanges();
+  }
+
+  public final void setConfigValues(Config cfg) {
+    snapshot.get().setConfigValues(cfg);
+  }
+
+  @Override
+  public final boolean equals(Object o) {
+    return o instanceof NotesMigration
+        && snapshot.get().equals(((NotesMigration) o).snapshot.get());
+  }
+
+  @Override
+  public final int hashCode() {
+    return snapshot.get().hashCode();
+  }
+
+  protected NotesMigration(Snapshot snapshot) {
+    this.snapshot = new AtomicReference<>(snapshot);
+  }
+
+  final Snapshot snapshot() {
+    return snapshot.get();
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NotesMigrationState.java b/java/com/google/gerrit/server/notedb/NotesMigrationState.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/notedb/NotesMigrationState.java
rename to java/com/google/gerrit/server/notedb/NotesMigrationState.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/PatchSetState.java b/java/com/google/gerrit/server/notedb/PatchSetState.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/notedb/PatchSetState.java
rename to java/com/google/gerrit/server/notedb/PatchSetState.java
diff --git a/java/com/google/gerrit/server/notedb/PrimaryStorageMigrator.java b/java/com/google/gerrit/server/notedb/PrimaryStorageMigrator.java
new file mode 100644
index 0000000..7b427b4
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/PrimaryStorageMigrator.java
@@ -0,0 +1,510 @@
+// Copyright (C) 2017 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.google.gerrit.server.notedb;
+
+import static com.google.common.base.Preconditions.checkState;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+import static java.util.concurrent.TimeUnit.SECONDS;
+
+import com.github.rholder.retry.RetryException;
+import com.github.rholder.retry.Retryer;
+import com.github.rholder.retry.RetryerBuilder;
+import com.github.rholder.retry.StopStrategies;
+import com.github.rholder.retry.WaitStrategies;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Stopwatch;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.reviewdb.server.ReviewDbUtil;
+import com.google.gerrit.server.InternalUser;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.RepoRefCache;
+import com.google.gerrit.server.index.change.ChangeField;
+import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
+import com.google.gerrit.server.notedb.NoteDbChangeState.RefState;
+import com.google.gerrit.server.notedb.rebuild.ChangeRebuilder;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.AtomicUpdate;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.OrmRuntimeException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.atomic.AtomicBoolean;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+
+/** Helper to migrate the {@link PrimaryStorage} of individual changes. */
+@Singleton
+public class PrimaryStorageMigrator {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  /**
+   * Exception thrown during migration if the change has no {@code noteDbState} field at the
+   * beginning of the migration.
+   */
+  public static class NoNoteDbStateException extends RuntimeException {
+    private static final long serialVersionUID = 1L;
+
+    private NoNoteDbStateException(Change.Id id) {
+      super("change " + id + " has no note_db_state; rebuild it first");
+    }
+  }
+
+  private final AllUsersName allUsers;
+  private final ChangeNotes.Factory changeNotesFactory;
+  private final ChangeRebuilder rebuilder;
+  private final ChangeUpdate.Factory updateFactory;
+  private final GitRepositoryManager repoManager;
+  private final InternalUser.Factory internalUserFactory;
+  private final Provider<InternalChangeQuery> queryProvider;
+  private final Provider<ReviewDb> db;
+  private final RetryHelper retryHelper;
+
+  private final long skewMs;
+  private final long timeoutMs;
+  private final Retryer<NoteDbChangeState> testEnsureRebuiltRetryer;
+
+  @Inject
+  PrimaryStorageMigrator(
+      @GerritServerConfig Config cfg,
+      Provider<ReviewDb> db,
+      GitRepositoryManager repoManager,
+      AllUsersName allUsers,
+      ChangeRebuilder rebuilder,
+      ChangeNotes.Factory changeNotesFactory,
+      Provider<InternalChangeQuery> queryProvider,
+      ChangeUpdate.Factory updateFactory,
+      InternalUser.Factory internalUserFactory,
+      RetryHelper retryHelper) {
+    this(
+        cfg,
+        db,
+        repoManager,
+        allUsers,
+        rebuilder,
+        null,
+        changeNotesFactory,
+        queryProvider,
+        updateFactory,
+        internalUserFactory,
+        retryHelper);
+  }
+
+  @VisibleForTesting
+  public PrimaryStorageMigrator(
+      Config cfg,
+      Provider<ReviewDb> db,
+      GitRepositoryManager repoManager,
+      AllUsersName allUsers,
+      ChangeRebuilder rebuilder,
+      @Nullable Retryer<NoteDbChangeState> testEnsureRebuiltRetryer,
+      ChangeNotes.Factory changeNotesFactory,
+      Provider<InternalChangeQuery> queryProvider,
+      ChangeUpdate.Factory updateFactory,
+      InternalUser.Factory internalUserFactory,
+      RetryHelper retryHelper) {
+    this.db = db;
+    this.repoManager = repoManager;
+    this.allUsers = allUsers;
+    this.rebuilder = rebuilder;
+    this.testEnsureRebuiltRetryer = testEnsureRebuiltRetryer;
+    this.changeNotesFactory = changeNotesFactory;
+    this.queryProvider = queryProvider;
+    this.updateFactory = updateFactory;
+    this.internalUserFactory = internalUserFactory;
+    this.retryHelper = retryHelper;
+    skewMs = NoteDbChangeState.getReadOnlySkew(cfg);
+
+    String s = "notedb";
+    timeoutMs =
+        cfg.getTimeUnit(
+            s,
+            null,
+            "primaryStorageMigrationTimeout",
+            MILLISECONDS.convert(60, SECONDS),
+            MILLISECONDS);
+  }
+
+  /**
+   * Migrate a change's primary storage from ReviewDb to NoteDb.
+   *
+   * <p>This method will return only if the primary storage of the change is NoteDb afterwards. (It
+   * may return early if the primary storage was already NoteDb.)
+   *
+   * <p>If this method throws an exception, then the primary storage of the change is probably not
+   * NoteDb. (It is possible that the primary storage of the change is NoteDb in this case, but
+   * there was an error reading the state.) Moreover, after an exception, the change may be
+   * read-only until a lease expires. If the caller chooses to retry, they should wait until the
+   * read-only lease expires; this method will fail relatively quickly if called on a read-only
+   * change.
+   *
+   * <p>Note that if the change is read-only after this method throws an exception, that does not
+   * necessarily guarantee that the read-only lease was acquired during that particular method
+   * invocation; this call may have in fact failed because another thread acquired the lease first.
+   *
+   * @param id change ID.
+   * @throws OrmException if a ReviewDb-level error occurs.
+   * @throws IOException if a repo-level error occurs.
+   */
+  public void migrateToNoteDbPrimary(Change.Id id) throws OrmException, IOException {
+    // Since there are multiple non-atomic steps in this method, we need to
+    // consider what happens when there is another writer concurrent with the
+    // thread executing this method.
+    //
+    // Let:
+    // * OR = other writer writes noteDbState & new data to ReviewDb (in one
+    //        transaction)
+    // * ON = other writer writes to NoteDb
+    // * MRO = migrator sets state to read-only
+    // * MR = ensureRebuilt writes rebuilt noteDbState to ReviewDb (but does not
+    //        otherwise update ReviewDb in this transaction)
+    // * MN = ensureRebuilt writes rebuilt state to NoteDb
+    //
+    // Consider all the interleavings of these operations.
+    //
+    // * OR,ON,MRO,...
+    //   Other writer completes before migrator begins; this is not a concurrent
+    //   write.
+    // * MRO,...,OR,...
+    //   OR will fail, since it atomically checks that the noteDbState is not
+    //   read-only before proceeding. This results in an exception, but not a
+    //   concurrent write.
+    //
+    // Thus all the "interesting" interleavings start with OR,MRO, and differ on
+    // where ON falls relative to MR/MN.
+    //
+    // * OR,MRO,ON,MR,MN
+    //   The other NoteDb write succeeds despite the noteDbState being
+    //   read-only. Because the read-only state from MRO includes the update
+    //   from OR, the change is up-to-date at this point. Thus MR,MN is a no-op.
+    //   The end result is an up-to-date, read-only change.
+    //
+    // * OR,MRO,MR,ON,MN
+    //   The change is out-of-date when ensureRebuilt begins, because OR
+    //   succeeded but the corresponding ON has not happened yet. ON will
+    //   succeed, because there have been no intervening NoteDb writes. MN will
+    //   fail, because ON updated the state in NoteDb to something other than
+    //   what MR claimed. This leaves the change in an out-of-date, read-only
+    //   state.
+    //
+    //   If this method threw an exception in this case, the change would
+    //   eventually switch back to read-write when the read-only lease expires,
+    //   so this situation is recoverable. However, it would be inconvenient for
+    //   a change to be read-only for so long.
+    //
+    //   Thus, as an optimization, we have a retry loop that attempts
+    //   ensureRebuilt while still holding the same read-only lease. This
+    //   effectively results in the interleaving OR,MR,ON,MR,MN; in contrast
+    //   with the previous case, here, MR/MN actually rebuilds the change. In
+    //   the case of a write failure, MR/MN might fail and get retried again. If
+    //   it exceeds the maximum number of retries, an exception is thrown.
+    //
+    // * OR,MRO,MR,MN,ON
+    //   The change is out-of-date when ensureRebuilt begins. The change is
+    //   rebuilt, leaving a new state in NoteDb. ON will fail, because the old
+    //   NoteDb state has changed since the ref state was read when the update
+    //   began (prior to OR). This results in an exception from ON, but the end
+    //   result is still an up-to-date, read-only change. The end user that
+    //   initiated the other write observes an error, but this is no different
+    //   from other errors that need retrying, e.g. due to a backend write
+    //   failure.
+
+    Stopwatch sw = Stopwatch.createStarted();
+    Change readOnlyChange = setReadOnlyInReviewDb(id); // MRO
+    if (readOnlyChange == null) {
+      return; // Already migrated.
+    }
+
+    NoteDbChangeState rebuiltState;
+    try {
+      // MR,MN
+      rebuiltState =
+          ensureRebuiltRetryer(sw)
+              .call(
+                  () ->
+                      ensureRebuilt(
+                          readOnlyChange.getProject(),
+                          id,
+                          NoteDbChangeState.parse(readOnlyChange)));
+    } catch (RetryException | ExecutionException e) {
+      throw new OrmException(e);
+    }
+
+    // At this point, the noteDbState in ReviewDb is read-only, and it is
+    // guaranteed to match the state actually in NoteDb. Now it is safe to set
+    // the primary storage to NoteDb.
+
+    setPrimaryStorageNoteDb(id, rebuiltState);
+    logger.atFine().log(
+        "Migrated change %s to NoteDb primary in %sms", id, sw.elapsed(MILLISECONDS));
+  }
+
+  private Change setReadOnlyInReviewDb(Change.Id id) throws OrmException {
+    AtomicBoolean alreadyMigrated = new AtomicBoolean(false);
+    Change result =
+        db().changes()
+            .atomicUpdate(
+                id,
+                new AtomicUpdate<Change>() {
+                  @Override
+                  public Change update(Change change) {
+                    NoteDbChangeState state = NoteDbChangeState.parse(change);
+                    if (state == null) {
+                      // Could rebuild the change here, but that's more complexity, and this
+                      // normally shouldn't happen.
+                      //
+                      // Known cases where this happens are described in and handled by
+                      // NoteDbMigrator#canSkipPrimaryStorageMigration.
+                      throw new NoNoteDbStateException(id);
+                    }
+                    // If the change is already read-only, then the lease is held by another
+                    // (likely failed) migrator thread. Fail early, as we can't take over
+                    // the lease.
+                    NoteDbChangeState.checkNotReadOnly(change, skewMs);
+                    if (state.getPrimaryStorage() != PrimaryStorage.NOTE_DB) {
+                      Timestamp now = TimeUtil.nowTs();
+                      Timestamp until = new Timestamp(now.getTime() + timeoutMs);
+                      change.setNoteDbState(state.withReadOnlyUntil(until).toString());
+                    } else {
+                      alreadyMigrated.set(true);
+                    }
+                    return change;
+                  }
+                });
+    return alreadyMigrated.get() ? null : result;
+  }
+
+  private Retryer<NoteDbChangeState> ensureRebuiltRetryer(Stopwatch sw) {
+    if (testEnsureRebuiltRetryer != null) {
+      return testEnsureRebuiltRetryer;
+    }
+    // Retry the ensureRebuilt step with backoff until half the timeout has
+    // expired, leaving the remaining half for the rest of the steps.
+    long remainingNanos = (MILLISECONDS.toNanos(timeoutMs) / 2) - sw.elapsed(NANOSECONDS);
+    remainingNanos = Math.max(remainingNanos, 0);
+    return RetryerBuilder.<NoteDbChangeState>newBuilder()
+        .retryIfException(e -> (e instanceof IOException) || (e instanceof OrmException))
+        .withWaitStrategy(
+            WaitStrategies.join(
+                WaitStrategies.exponentialWait(250, MILLISECONDS),
+                WaitStrategies.randomWait(50, MILLISECONDS)))
+        .withStopStrategy(StopStrategies.stopAfterDelay(remainingNanos, NANOSECONDS))
+        .build();
+  }
+
+  private NoteDbChangeState ensureRebuilt(
+      Project.NameKey project, Change.Id id, NoteDbChangeState readOnlyState)
+      throws IOException, OrmException, RepositoryNotFoundException {
+    try (Repository changeRepo = repoManager.openRepository(project);
+        Repository allUsersRepo = repoManager.openRepository(allUsers)) {
+      if (!readOnlyState.isUpToDate(new RepoRefCache(changeRepo), new RepoRefCache(allUsersRepo))) {
+        NoteDbUpdateManager.Result r = rebuilder.rebuildEvenIfReadOnly(db(), id);
+        checkState(
+            r.newState().getReadOnlyUntil().equals(readOnlyState.getReadOnlyUntil()),
+            "state after rebuilding has different read-only lease: %s != %s",
+            r.newState(),
+            readOnlyState);
+        readOnlyState = r.newState();
+      }
+    }
+    return readOnlyState;
+  }
+
+  private void setPrimaryStorageNoteDb(Change.Id id, NoteDbChangeState expectedState)
+      throws OrmException {
+    db().changes()
+        .atomicUpdate(
+            id,
+            new AtomicUpdate<Change>() {
+              @Override
+              public Change update(Change change) {
+                NoteDbChangeState state = NoteDbChangeState.parse(change);
+                if (!Objects.equals(state, expectedState)) {
+                  throw new OrmRuntimeException(badState(state, expectedState));
+                }
+                Timestamp until = state.getReadOnlyUntil().get();
+                if (TimeUtil.nowTs().after(until)) {
+                  throw new OrmRuntimeException(
+                      "read-only lease on change " + id + " expired at " + until);
+                }
+                change.setNoteDbState(NoteDbChangeState.NOTE_DB_PRIMARY_STATE);
+                return change;
+              }
+            });
+  }
+
+  private ReviewDb db() {
+    return ReviewDbUtil.unwrapDb(db.get());
+  }
+
+  private String badState(NoteDbChangeState actual, NoteDbChangeState expected) {
+    return "state changed unexpectedly: " + actual + " != " + expected;
+  }
+
+  public void migrateToReviewDbPrimary(Change.Id id, @Nullable Project.NameKey project)
+      throws OrmException, IOException {
+    // Migrating back to ReviewDb primary is much simpler than the original migration to NoteDb
+    // primary, because when NoteDb is primary, each write only goes to one storage location rather
+    // than both. We only need to consider whether a concurrent writer (OR) conflicts with the first
+    // setReadOnlyInNoteDb step (MR) in this method.
+    //
+    // If OR wins, then either:
+    // * MR will set read-only after OR is completed, which is not a concurrent write.
+    // * MR will fail to set read-only with a lock failure. The caller will have to retry, but the
+    //   change is not in a read-only state, so behavior is not degraded in the meantime.
+    //
+    // If MR wins, then either:
+    // * OR will fail with a read-only exception (via AbstractChangeNotes#apply).
+    // * OR will fail with a lock failure.
+    //
+    // In all of these scenarios, the change is read-only if and only if MR succeeds.
+    //
+    // There will be no concurrent writes to ReviewDb for this change until
+    // setPrimaryStorageReviewDb completes, because ReviewDb writes are not attempted when primary
+    // storage is NoteDb. After the primary storage changes back, it is possible for subsequent
+    // NoteDb writes to conflict with the releaseReadOnlyLeaseInNoteDb step, but at this point,
+    // since ReviewDb is primary, we are back to ignoring them.
+    Stopwatch sw = Stopwatch.createStarted();
+    if (project == null) {
+      project = getProject(id);
+    }
+    ObjectId newMetaId = setReadOnlyInNoteDb(project, id);
+    rebuilder.rebuildReviewDb(db(), project, id);
+    setPrimaryStorageReviewDb(id, newMetaId);
+    releaseReadOnlyLeaseInNoteDb(project, id);
+    logger.atFine().log(
+        "Migrated change %s to ReviewDb primary in %sms", id, sw.elapsed(MILLISECONDS));
+  }
+
+  private ObjectId setReadOnlyInNoteDb(Project.NameKey project, Change.Id id)
+      throws OrmException, IOException {
+    Timestamp now = TimeUtil.nowTs();
+    Timestamp until = new Timestamp(now.getTime() + timeoutMs);
+    ChangeUpdate update =
+        updateFactory.create(
+            changeNotesFactory.createChecked(db.get(), project, id), internalUserFactory.create());
+    update.setReadOnlyUntil(until);
+    return update.commit();
+  }
+
+  private void setPrimaryStorageReviewDb(Change.Id id, ObjectId newMetaId)
+      throws OrmException, IOException {
+    ImmutableMap.Builder<Account.Id, ObjectId> draftIds = ImmutableMap.builder();
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      for (Ref draftRef :
+          repo.getRefDatabase().getRefsByPrefix(RefNames.refsDraftCommentsPrefix(id))) {
+        Account.Id accountId = Account.Id.fromRef(draftRef.getName());
+        if (accountId != null) {
+          draftIds.put(accountId, draftRef.getObjectId().copy());
+        }
+      }
+    }
+    NoteDbChangeState newState =
+        new NoteDbChangeState(
+            id,
+            PrimaryStorage.REVIEW_DB,
+            Optional.of(RefState.create(newMetaId, draftIds.build())),
+            Optional.empty());
+    db().changes()
+        .atomicUpdate(
+            id,
+            new AtomicUpdate<Change>() {
+              @Override
+              public Change update(Change change) {
+                if (PrimaryStorage.of(change) != PrimaryStorage.NOTE_DB) {
+                  throw new OrmRuntimeException(
+                      "change " + id + " is not NoteDb primary: " + change.getNoteDbState());
+                }
+                change.setNoteDbState(newState.toString());
+                return change;
+              }
+            });
+  }
+
+  private void releaseReadOnlyLeaseInNoteDb(Project.NameKey project, Change.Id id)
+      throws OrmException {
+    // Use a BatchUpdate since ReviewDb is primary at this point, so it needs to reflect the update.
+    // (In practice retrying won't happen, since we aren't using fused updates at this point.)
+    try {
+      retryHelper.execute(
+          updateFactory -> {
+            try (BatchUpdate bu =
+                updateFactory.create(
+                    db.get(), project, internalUserFactory.create(), TimeUtil.nowTs())) {
+              bu.addOp(
+                  id,
+                  new BatchUpdateOp() {
+                    @Override
+                    public boolean updateChange(ChangeContext ctx) {
+                      ctx.getUpdate(ctx.getChange().currentPatchSetId())
+                          .setReadOnlyUntil(new Timestamp(0));
+                      return true;
+                    }
+                  });
+              bu.execute();
+              return null;
+            }
+          });
+    } catch (RestApiException | UpdateException e) {
+      throw new OrmException(e);
+    }
+  }
+
+  private Project.NameKey getProject(Change.Id id) throws OrmException {
+    List<ChangeData> cds =
+        queryProvider.get().setRequestedFields(ChangeField.PROJECT).byLegacyChangeId(id);
+    Set<Project.NameKey> projects = new TreeSet<>();
+    for (ChangeData cd : cds) {
+      projects.add(cd.project());
+    }
+    if (projects.size() != 1) {
+      throw new OrmException(
+          "zero or multiple projects found for change "
+              + id
+              + ", must specify project explicitly: "
+              + projects);
+    }
+    return projects.iterator().next();
+  }
+}
diff --git a/java/com/google/gerrit/server/notedb/RepoSequence.java b/java/com/google/gerrit/server/notedb/RepoSequence.java
new file mode 100644
index 0000000..4c497ac
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/RepoSequence.java
@@ -0,0 +1,397 @@
+// 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.
+
+package com.google.gerrit.server.notedb;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.gerrit.reviewdb.client.RefNames.REFS;
+import static com.google.gerrit.reviewdb.client.RefNames.REFS_SEQUENCES;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Objects.requireNonNull;
+import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
+
+import com.github.rholder.retry.RetryException;
+import com.github.rholder.retry.Retryer;
+import com.github.rholder.retry.RetryerBuilder;
+import com.github.rholder.retry.StopStrategies;
+import com.github.rholder.retry.WaitStrategies;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.CharMatcher;
+import com.google.common.base.Predicates;
+import com.google.common.base.Throwables;
+import com.google.common.collect.ImmutableList;
+import com.google.common.primitives.Ints;
+import com.google.common.util.concurrent.Runnables;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gwtorm.server.OrmException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+import org.eclipse.jgit.errors.IncorrectObjectTypeException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.ObjectLoader;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.RefUpdate.Result;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.ReceiveCommand;
+
+/**
+ * Class for managing an incrementing sequence backed by a git repository.
+ *
+ * <p>The current sequence number is stored as UTF-8 text in a blob pointed to by a ref in the
+ * {@code refs/sequences/*} namespace. Multiple processes can share the same sequence by
+ * incrementing the counter using normal git ref updates. To amortize the cost of these ref updates,
+ * processes can increment the counter by a larger number and hand out numbers from that range in
+ * memory until they run out. This means concurrent processes will hand out somewhat non-monotonic
+ * numbers.
+ */
+public class RepoSequence {
+  @FunctionalInterface
+  public interface Seed {
+    int get() throws OrmException;
+  }
+
+  @VisibleForTesting
+  static RetryerBuilder<RefUpdate.Result> retryerBuilder() {
+    return RetryerBuilder.<RefUpdate.Result>newBuilder()
+        .retryIfResult(Predicates.equalTo(RefUpdate.Result.LOCK_FAILURE))
+        .withWaitStrategy(
+            WaitStrategies.join(
+                WaitStrategies.exponentialWait(5, TimeUnit.SECONDS),
+                WaitStrategies.randomWait(50, TimeUnit.MILLISECONDS)))
+        .withStopStrategy(StopStrategies.stopAfterDelay(30, TimeUnit.SECONDS));
+  }
+
+  private static final Retryer<RefUpdate.Result> RETRYER = retryerBuilder().build();
+
+  private final GitRepositoryManager repoManager;
+  private final GitReferenceUpdated gitRefUpdated;
+  private final Project.NameKey projectName;
+  private final String refName;
+  private final Seed seed;
+  private final int floor;
+  private final int batchSize;
+  private final Runnable afterReadRef;
+  private final Retryer<RefUpdate.Result> retryer;
+
+  // Protects all non-final fields.
+  private final Lock counterLock;
+
+  private int limit;
+  private int counter;
+
+  @VisibleForTesting int acquireCount;
+
+  public RepoSequence(
+      GitRepositoryManager repoManager,
+      GitReferenceUpdated gitRefUpdated,
+      Project.NameKey projectName,
+      String name,
+      Seed seed,
+      int batchSize) {
+    this(
+        repoManager,
+        gitRefUpdated,
+        projectName,
+        name,
+        seed,
+        batchSize,
+        Runnables.doNothing(),
+        RETRYER,
+        0);
+  }
+
+  public RepoSequence(
+      GitRepositoryManager repoManager,
+      GitReferenceUpdated gitRefUpdated,
+      Project.NameKey projectName,
+      String name,
+      Seed seed,
+      int batchSize,
+      int floor) {
+    this(
+        repoManager,
+        gitRefUpdated,
+        projectName,
+        name,
+        seed,
+        batchSize,
+        Runnables.doNothing(),
+        RETRYER,
+        floor);
+  }
+
+  @VisibleForTesting
+  RepoSequence(
+      GitRepositoryManager repoManager,
+      GitReferenceUpdated gitRefUpdated,
+      Project.NameKey projectName,
+      String name,
+      Seed seed,
+      int batchSize,
+      Runnable afterReadRef,
+      Retryer<RefUpdate.Result> retryer) {
+    this(repoManager, gitRefUpdated, projectName, name, seed, batchSize, afterReadRef, retryer, 0);
+  }
+
+  RepoSequence(
+      GitRepositoryManager repoManager,
+      GitReferenceUpdated gitRefUpdated,
+      Project.NameKey projectName,
+      String name,
+      Seed seed,
+      int batchSize,
+      Runnable afterReadRef,
+      Retryer<RefUpdate.Result> retryer,
+      int floor) {
+    this.repoManager = requireNonNull(repoManager, "repoManager");
+    this.gitRefUpdated = requireNonNull(gitRefUpdated, "gitRefUpdated");
+    this.projectName = requireNonNull(projectName, "projectName");
+
+    checkArgument(
+        name != null
+            && !name.startsWith(REFS)
+            && !name.startsWith(REFS_SEQUENCES.substring(REFS.length())),
+        "name should be a suffix to follow \"refs/sequences/\", got: %s",
+        name);
+    this.refName = RefNames.REFS_SEQUENCES + name;
+
+    this.seed = requireNonNull(seed, "seed");
+    this.floor = floor;
+
+    checkArgument(batchSize > 0, "expected batchSize > 0, got: %s", batchSize);
+    this.batchSize = batchSize;
+    this.afterReadRef = requireNonNull(afterReadRef, "afterReadRef");
+    this.retryer = requireNonNull(retryer, "retryer");
+
+    counterLock = new ReentrantLock(true);
+  }
+
+  public int next() throws OrmException {
+    counterLock.lock();
+    try {
+      if (counter >= limit) {
+        acquire(batchSize);
+      }
+      return counter++;
+    } finally {
+      counterLock.unlock();
+    }
+  }
+
+  public ImmutableList<Integer> next(int count) throws OrmException {
+    if (count == 0) {
+      return ImmutableList.of();
+    }
+    checkArgument(count > 0, "count is negative: %s", count);
+    counterLock.lock();
+    try {
+      List<Integer> ids = new ArrayList<>(count);
+      while (counter < limit) {
+        ids.add(counter++);
+        if (ids.size() == count) {
+          return ImmutableList.copyOf(ids);
+        }
+      }
+      acquire(Math.max(count - ids.size(), batchSize));
+      while (ids.size() < count) {
+        ids.add(counter++);
+      }
+      return ImmutableList.copyOf(ids);
+    } finally {
+      counterLock.unlock();
+    }
+  }
+
+  @VisibleForTesting
+  public void set(int val) throws OrmException {
+    // Don't bother spinning. This is only for tests, and a test that calls set
+    // concurrently with other writes is doing it wrong.
+    counterLock.lock();
+    try {
+      try (Repository repo = repoManager.openRepository(projectName);
+          RevWalk rw = new RevWalk(repo)) {
+        checkResult(store(repo, rw, null, val));
+        counter = limit;
+      } catch (IOException e) {
+        throw new OrmException(e);
+      }
+    } finally {
+      counterLock.unlock();
+    }
+  }
+
+  public void increaseTo(int val) throws OrmException {
+    counterLock.lock();
+    try {
+      try (Repository repo = repoManager.openRepository(projectName);
+          RevWalk rw = new RevWalk(repo)) {
+        TryIncreaseTo attempt = new TryIncreaseTo(repo, rw, val);
+        checkResult(retryer.call(attempt));
+        counter = limit;
+      } catch (ExecutionException | RetryException e) {
+        if (e.getCause() != null) {
+          Throwables.throwIfInstanceOf(e.getCause(), OrmException.class);
+        }
+        throw new OrmException(e);
+      } catch (IOException e) {
+        throw new OrmException(e);
+      }
+    } finally {
+      counterLock.unlock();
+    }
+  }
+
+  private void acquire(int count) throws OrmException {
+    try (Repository repo = repoManager.openRepository(projectName);
+        RevWalk rw = new RevWalk(repo)) {
+      TryAcquire attempt = new TryAcquire(repo, rw, count);
+      checkResult(retryer.call(attempt));
+      counter = attempt.next;
+      limit = counter + count;
+      acquireCount++;
+    } catch (ExecutionException | RetryException e) {
+      if (e.getCause() != null) {
+        Throwables.throwIfInstanceOf(e.getCause(), OrmException.class);
+      }
+      throw new OrmException(e);
+    } catch (IOException e) {
+      throw new OrmException(e);
+    }
+  }
+
+  private void checkResult(RefUpdate.Result result) throws OrmException {
+    if (!refUpdated(result) && result != Result.NO_CHANGE) {
+      throw new OrmException("failed to update " + refName + ": " + result);
+    }
+  }
+
+  private boolean refUpdated(RefUpdate.Result result) {
+    return result == RefUpdate.Result.NEW || result == RefUpdate.Result.FORCED;
+  }
+
+  private class TryAcquire implements Callable<RefUpdate.Result> {
+    private final Repository repo;
+    private final RevWalk rw;
+    private final int count;
+
+    private int next;
+
+    private TryAcquire(Repository repo, RevWalk rw, int count) {
+      this.repo = repo;
+      this.rw = rw;
+      this.count = count;
+    }
+
+    @Override
+    public RefUpdate.Result call() throws Exception {
+      Ref ref = repo.exactRef(refName);
+      afterReadRef.run();
+      ObjectId oldId;
+      if (ref == null) {
+        oldId = ObjectId.zeroId();
+        next = seed.get();
+      } else {
+        oldId = ref.getObjectId();
+        next = parse(rw, oldId);
+      }
+      next = Math.max(floor, next);
+      return store(repo, rw, oldId, next + count);
+    }
+  }
+
+  private class TryIncreaseTo implements Callable<RefUpdate.Result> {
+    private final Repository repo;
+    private final RevWalk rw;
+    private final int value;
+
+    private TryIncreaseTo(Repository repo, RevWalk rw, int value) {
+      this.repo = repo;
+      this.rw = rw;
+      this.value = value;
+    }
+
+    @Override
+    public RefUpdate.Result call() throws Exception {
+      Ref ref = repo.exactRef(refName);
+      afterReadRef.run();
+      ObjectId oldId;
+      if (ref == null) {
+        oldId = ObjectId.zeroId();
+      } else {
+        oldId = ref.getObjectId();
+        int next = parse(rw, oldId);
+        if (next >= value) {
+          // a concurrent write updated the ref already to this or a higher value
+          return RefUpdate.Result.NO_CHANGE;
+        }
+      }
+      return store(repo, rw, oldId, value);
+    }
+  }
+
+  private int parse(RevWalk rw, ObjectId id) throws IOException, OrmException {
+    ObjectLoader ol = rw.getObjectReader().open(id, OBJ_BLOB);
+    if (ol.getType() != OBJ_BLOB) {
+      // In theory this should be thrown by open but not all implementations
+      // may do it properly (certainly InMemoryRepository doesn't).
+      throw new IncorrectObjectTypeException(id, OBJ_BLOB);
+    }
+    String str = CharMatcher.whitespace().trimFrom(new String(ol.getCachedBytes(), UTF_8));
+    Integer val = Ints.tryParse(str);
+    if (val == null) {
+      throw new OrmException("invalid value in " + refName + " blob at " + id.name());
+    }
+    return val;
+  }
+
+  private RefUpdate.Result store(Repository repo, RevWalk rw, @Nullable ObjectId oldId, int val)
+      throws IOException {
+    ObjectId newId;
+    try (ObjectInserter ins = repo.newObjectInserter()) {
+      newId = ins.insert(OBJ_BLOB, Integer.toString(val).getBytes(UTF_8));
+      ins.flush();
+    }
+    RefUpdate ru = repo.updateRef(refName);
+    if (oldId != null) {
+      ru.setExpectedOldObjectId(oldId);
+    }
+    ru.disableRefLog();
+    ru.setNewObjectId(newId);
+    ru.setForceUpdate(true); // Required for non-commitish updates.
+    RefUpdate.Result result = ru.update(rw);
+    if (refUpdated(result)) {
+      gitRefUpdated.fire(projectName, ru, null);
+    }
+    return result;
+  }
+
+  public static ReceiveCommand storeNew(ObjectInserter ins, String name, int val)
+      throws IOException {
+    ObjectId newId = ins.insert(OBJ_BLOB, Integer.toString(val).getBytes(UTF_8));
+    return new ReceiveCommand(ObjectId.zeroId(), newId, RefNames.REFS_SEQUENCES + name);
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ReviewerStateInternal.java b/java/com/google/gerrit/server/notedb/ReviewerStateInternal.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/notedb/ReviewerStateInternal.java
rename to java/com/google/gerrit/server/notedb/ReviewerStateInternal.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNote.java b/java/com/google/gerrit/server/notedb/RevisionNote.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNote.java
rename to java/com/google/gerrit/server/notedb/RevisionNote.java
diff --git a/java/com/google/gerrit/server/notedb/RevisionNoteBuilder.java b/java/com/google/gerrit/server/notedb/RevisionNoteBuilder.java
new file mode 100644
index 0000000..b8c7d7d
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/RevisionNoteBuilder.java
@@ -0,0 +1,139 @@
+// 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.
+
+package com.google.gerrit.server.notedb;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.gerrit.server.CommentsUtil.COMMENT_ORDER;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Maps;
+import com.google.common.collect.MultimapBuilder;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.RevId;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+class RevisionNoteBuilder {
+  static class Cache {
+    private final RevisionNoteMap<? extends RevisionNote<? extends Comment>> revisionNoteMap;
+    private final Map<RevId, RevisionNoteBuilder> builders;
+
+    Cache(RevisionNoteMap<? extends RevisionNote<? extends Comment>> revisionNoteMap) {
+      this.revisionNoteMap = revisionNoteMap;
+      this.builders = new HashMap<>();
+    }
+
+    RevisionNoteBuilder get(RevId revId) {
+      RevisionNoteBuilder b = builders.get(revId);
+      if (b == null) {
+        b = new RevisionNoteBuilder(revisionNoteMap.revisionNotes.get(revId));
+        builders.put(revId, b);
+      }
+      return b;
+    }
+
+    Map<RevId, RevisionNoteBuilder> getBuilders() {
+      return Collections.unmodifiableMap(builders);
+    }
+  }
+
+  final byte[] baseRaw;
+  final List<? extends Comment> baseComments;
+  final Map<Comment.Key, Comment> put;
+  final Set<Comment.Key> delete;
+
+  private String pushCert;
+
+  RevisionNoteBuilder(RevisionNote<? extends Comment> base) {
+    if (base != null) {
+      baseRaw = base.getRaw();
+      baseComments = base.getComments();
+      put = Maps.newHashMapWithExpectedSize(baseComments.size());
+      if (base instanceof ChangeRevisionNote) {
+        pushCert = ((ChangeRevisionNote) base).getPushCert();
+      }
+    } else {
+      baseRaw = new byte[0];
+      baseComments = Collections.emptyList();
+      put = new HashMap<>();
+      pushCert = null;
+    }
+    delete = new HashSet<>();
+  }
+
+  public byte[] build(ChangeNoteUtil noteUtil) throws IOException {
+    return build(noteUtil.getChangeNoteJson());
+  }
+
+  public byte[] build(ChangeNoteJson changeNoteJson) throws IOException {
+    ByteArrayOutputStream out = new ByteArrayOutputStream();
+    buildNoteJson(changeNoteJson, out);
+    return out.toByteArray();
+  }
+
+  void putComment(Comment comment) {
+    checkArgument(!delete.contains(comment.key), "cannot both delete and put %s", comment.key);
+    put.put(comment.key, comment);
+  }
+
+  void deleteComment(Comment.Key key) {
+    checkArgument(!put.containsKey(key), "cannot both delete and put %s", key);
+    delete.add(key);
+  }
+
+  void setPushCertificate(String pushCert) {
+    this.pushCert = pushCert;
+  }
+
+  private ListMultimap<Integer, Comment> buildCommentMap() {
+    ListMultimap<Integer, Comment> all = MultimapBuilder.hashKeys().arrayListValues().build();
+
+    for (Comment c : baseComments) {
+      if (!delete.contains(c.key) && !put.containsKey(c.key)) {
+        all.put(c.key.patchSetId, c);
+      }
+    }
+    for (Comment c : put.values()) {
+      if (!delete.contains(c.key)) {
+        all.put(c.key.patchSetId, c);
+      }
+    }
+    return all;
+  }
+
+  private void buildNoteJson(ChangeNoteJson noteUtil, OutputStream out) throws IOException {
+    ListMultimap<Integer, Comment> comments = buildCommentMap();
+    if (comments.isEmpty() && pushCert == null) {
+      return;
+    }
+
+    RevisionNoteData data = new RevisionNoteData();
+    data.comments = COMMENT_ORDER.sortedCopy(comments.values());
+    data.pushCert = pushCert;
+
+    try (OutputStreamWriter osw = new OutputStreamWriter(out, UTF_8)) {
+      noteUtil.getGson().toJson(data, osw);
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNoteData.java b/java/com/google/gerrit/server/notedb/RevisionNoteData.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNoteData.java
rename to java/com/google/gerrit/server/notedb/RevisionNoteData.java
diff --git a/java/com/google/gerrit/server/notedb/RevisionNoteMap.java b/java/com/google/gerrit/server/notedb/RevisionNoteMap.java
new file mode 100644
index 0000000..17a061a
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/RevisionNoteMap.java
@@ -0,0 +1,74 @@
+// 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.
+
+package com.google.gerrit.server.notedb;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.PatchLineComment;
+import com.google.gerrit.reviewdb.client.RevId;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.notes.Note;
+import org.eclipse.jgit.notes.NoteMap;
+
+class RevisionNoteMap<T extends RevisionNote<? extends Comment>> {
+  final NoteMap noteMap;
+  final ImmutableMap<RevId, T> revisionNotes;
+
+  static RevisionNoteMap<ChangeRevisionNote> parse(
+      ChangeNoteJson noteJson,
+      LegacyChangeNoteRead legacyChangeNoteRead,
+      Change.Id changeId,
+      ObjectReader reader,
+      NoteMap noteMap,
+      PatchLineComment.Status status)
+      throws ConfigInvalidException, IOException {
+    Map<RevId, ChangeRevisionNote> result = new HashMap<>();
+    for (Note note : noteMap) {
+      ChangeRevisionNote rn =
+          new ChangeRevisionNote(
+              noteJson, legacyChangeNoteRead, changeId, reader, note.getData(), status);
+      rn.parse();
+      result.put(new RevId(note.name()), rn);
+    }
+    return new RevisionNoteMap<>(noteMap, ImmutableMap.copyOf(result));
+  }
+
+  static RevisionNoteMap<RobotCommentsRevisionNote> parseRobotComments(
+      ChangeNoteJson changeNoteJson, ObjectReader reader, NoteMap noteMap)
+      throws ConfigInvalidException, IOException {
+    Map<RevId, RobotCommentsRevisionNote> result = new HashMap<>();
+    for (Note note : noteMap) {
+      RobotCommentsRevisionNote rn =
+          new RobotCommentsRevisionNote(changeNoteJson, reader, note.getData());
+      rn.parse();
+      result.put(new RevId(note.name()), rn);
+    }
+    return new RevisionNoteMap<>(noteMap, ImmutableMap.copyOf(result));
+  }
+
+  static <T extends RevisionNote<? extends Comment>> RevisionNoteMap<T> emptyMap() {
+    return new RevisionNoteMap<>(NoteMap.newEmptyMap(), ImmutableMap.<RevId, T>of());
+  }
+
+  private RevisionNoteMap(NoteMap noteMap, ImmutableMap<RevId, T> revisionNotes) {
+    this.noteMap = noteMap;
+    this.revisionNotes = revisionNotes;
+  }
+}
diff --git a/java/com/google/gerrit/server/notedb/RobotCommentNotes.java b/java/com/google/gerrit/server/notedb/RobotCommentNotes.java
new file mode 100644
index 0000000..a05e6a1
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/RobotCommentNotes.java
@@ -0,0 +1,117 @@
+// 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.
+
+package com.google.gerrit.server.notedb;
+
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.client.RevId;
+import com.google.gerrit.reviewdb.client.RobotComment;
+import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.notes.NoteMap;
+import org.eclipse.jgit.revwalk.RevCommit;
+
+public class RobotCommentNotes extends AbstractChangeNotes<RobotCommentNotes> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public interface Factory {
+    RobotCommentNotes create(Change change);
+  }
+
+  private final Change change;
+
+  private ImmutableListMultimap<RevId, RobotComment> comments;
+  private RevisionNoteMap<RobotCommentsRevisionNote> revisionNoteMap;
+  private ObjectId metaId;
+
+  @Inject
+  RobotCommentNotes(Args args, @Assisted Change change) {
+    super(args, change.getId(), PrimaryStorage.of(change), false);
+    this.change = change;
+  }
+
+  RevisionNoteMap<RobotCommentsRevisionNote> getRevisionNoteMap() {
+    return revisionNoteMap;
+  }
+
+  public ImmutableListMultimap<RevId, RobotComment> getComments() {
+    return comments;
+  }
+
+  public boolean containsComment(RobotComment c) {
+    for (RobotComment existing : comments.values()) {
+      if (c.key.equals(existing.key)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @Override
+  public String getRefName() {
+    return RefNames.robotCommentsRef(getChangeId());
+  }
+
+  @Nullable
+  public ObjectId getMetaId() {
+    return metaId;
+  }
+
+  @Override
+  protected void onLoad(LoadHandle handle) throws IOException, ConfigInvalidException {
+    metaId = handle.id();
+    if (metaId == null) {
+      loadDefaults();
+      return;
+    }
+    metaId = metaId.copy();
+
+    logger.atFine().log(
+        "Load robot comment notes for change %s of project %s", getChangeId(), getProjectName());
+    RevCommit tipCommit = handle.walk().parseCommit(metaId);
+    ObjectReader reader = handle.walk().getObjectReader();
+    revisionNoteMap =
+        RevisionNoteMap.parseRobotComments(
+            args.changeNoteJson, reader, NoteMap.read(reader, tipCommit));
+    ListMultimap<RevId, RobotComment> cs = MultimapBuilder.hashKeys().arrayListValues().build();
+    for (RobotCommentsRevisionNote rn : revisionNoteMap.revisionNotes.values()) {
+      for (RobotComment c : rn.getComments()) {
+        cs.put(new RevId(c.revId), c);
+      }
+    }
+    comments = ImmutableListMultimap.copyOf(cs);
+  }
+
+  @Override
+  protected void loadDefaults() {
+    comments = ImmutableListMultimap.of();
+  }
+
+  @Override
+  public Project.NameKey getProjectName() {
+    return change.getProject();
+  }
+}
diff --git a/java/com/google/gerrit/server/notedb/RobotCommentUpdate.java b/java/com/google/gerrit/server/notedb/RobotCommentUpdate.java
new file mode 100644
index 0000000..e7ac5b7
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/RobotCommentUpdate.java
@@ -0,0 +1,235 @@
+// 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.
+
+package com.google.gerrit.server.notedb;
+
+import static com.google.common.base.MoreObjects.firstNonNull;
+import static com.google.gerrit.reviewdb.client.RefNames.robotCommentsRef;
+import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
+
+import com.google.common.collect.Sets;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RevId;
+import com.google.gerrit.reviewdb.client.RobotComment;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.assistedinject.Assisted;
+import com.google.inject.assistedinject.AssistedInject;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.notes.NoteMap;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+/**
+ * A single delta to apply atomically to a change.
+ *
+ * <p>This delta contains only robot comments on a single patch set of a change by a single author.
+ * This delta will become a single commit in the repository.
+ *
+ * <p>This class is not thread safe.
+ */
+public class RobotCommentUpdate extends AbstractChangeUpdate {
+  public interface Factory {
+    RobotCommentUpdate create(
+        ChangeNotes notes,
+        @Assisted("effective") Account.Id accountId,
+        @Assisted("real") Account.Id realAccountId,
+        PersonIdent authorIdent,
+        Date when);
+
+    RobotCommentUpdate create(
+        Change change,
+        @Assisted("effective") Account.Id accountId,
+        @Assisted("real") Account.Id realAccountId,
+        PersonIdent authorIdent,
+        Date when);
+  }
+
+  private List<RobotComment> put = new ArrayList<>();
+
+  @AssistedInject
+  private RobotCommentUpdate(
+      @GerritServerConfig Config cfg,
+      @GerritPersonIdent PersonIdent serverIdent,
+      NotesMigration migration,
+      ChangeNoteUtil noteUtil,
+      @Assisted ChangeNotes notes,
+      @Assisted("effective") Account.Id accountId,
+      @Assisted("real") Account.Id realAccountId,
+      @Assisted PersonIdent authorIdent,
+      @Assisted Date when) {
+    super(
+        cfg,
+        migration,
+        noteUtil,
+        serverIdent,
+        notes,
+        null,
+        accountId,
+        realAccountId,
+        authorIdent,
+        when);
+  }
+
+  @AssistedInject
+  private RobotCommentUpdate(
+      @GerritServerConfig Config cfg,
+      @GerritPersonIdent PersonIdent serverIdent,
+      NotesMigration migration,
+      ChangeNoteUtil noteUtil,
+      @Assisted Change change,
+      @Assisted("effective") Account.Id accountId,
+      @Assisted("real") Account.Id realAccountId,
+      @Assisted PersonIdent authorIdent,
+      @Assisted Date when) {
+    super(
+        cfg,
+        migration,
+        noteUtil,
+        serverIdent,
+        null,
+        change,
+        accountId,
+        realAccountId,
+        authorIdent,
+        when);
+  }
+
+  public void putComment(RobotComment c) {
+    verifyComment(c);
+    put.add(c);
+  }
+
+  private CommitBuilder storeCommentsInNotes(
+      RevWalk rw, ObjectInserter ins, ObjectId curr, CommitBuilder cb)
+      throws ConfigInvalidException, OrmException, IOException {
+    RevisionNoteMap<RobotCommentsRevisionNote> rnm = getRevisionNoteMap(rw, curr);
+    Set<RevId> updatedRevs = Sets.newHashSetWithExpectedSize(rnm.revisionNotes.size());
+    RevisionNoteBuilder.Cache cache = new RevisionNoteBuilder.Cache(rnm);
+
+    for (RobotComment c : put) {
+      cache.get(new RevId(c.revId)).putComment(c);
+    }
+
+    Map<RevId, RevisionNoteBuilder> builders = cache.getBuilders();
+    boolean touchedAnyRevs = false;
+    boolean hasComments = false;
+    for (Map.Entry<RevId, RevisionNoteBuilder> e : builders.entrySet()) {
+      updatedRevs.add(e.getKey());
+      ObjectId id = ObjectId.fromString(e.getKey().get());
+      byte[] data = e.getValue().build(noteUtil);
+      if (!Arrays.equals(data, e.getValue().baseRaw)) {
+        touchedAnyRevs = true;
+      }
+      if (data.length == 0) {
+        rnm.noteMap.remove(id);
+      } else {
+        hasComments = true;
+        ObjectId dataBlob = ins.insert(OBJ_BLOB, data);
+        rnm.noteMap.set(id, dataBlob);
+      }
+    }
+
+    // If we didn't touch any notes, tell the caller this was a no-op update. We
+    // couldn't have done this in isEmpty() below because we hadn't read the old
+    // data yet.
+    if (!touchedAnyRevs) {
+      return NO_OP_UPDATE;
+    }
+
+    // If we touched every revision and there are no comments left, tell the
+    // caller to delete the entire ref.
+    boolean touchedAllRevs = updatedRevs.equals(rnm.revisionNotes.keySet());
+    if (touchedAllRevs && !hasComments) {
+      return null;
+    }
+
+    cb.setTreeId(rnm.noteMap.writeTree(ins));
+    return cb;
+  }
+
+  private RevisionNoteMap<RobotCommentsRevisionNote> getRevisionNoteMap(RevWalk rw, ObjectId curr)
+      throws ConfigInvalidException, OrmException, IOException {
+    if (curr.equals(ObjectId.zeroId())) {
+      return RevisionNoteMap.emptyMap();
+    }
+    if (migration.readChanges()) {
+      // If reading from changes is enabled, then the old RobotCommentNotes
+      // already parsed the revision notes. We can reuse them as long as the ref
+      // hasn't advanced.
+      ChangeNotes changeNotes = getNotes();
+      if (changeNotes != null) {
+        RobotCommentNotes robotCommentNotes = changeNotes.load().getRobotCommentNotes();
+        if (robotCommentNotes != null) {
+          ObjectId idFromNotes = firstNonNull(robotCommentNotes.getRevision(), ObjectId.zeroId());
+          RevisionNoteMap<RobotCommentsRevisionNote> rnm = robotCommentNotes.getRevisionNoteMap();
+          if (idFromNotes.equals(curr) && rnm != null) {
+            return rnm;
+          }
+        }
+      }
+    }
+    NoteMap noteMap;
+    if (!curr.equals(ObjectId.zeroId())) {
+      noteMap = NoteMap.read(rw.getObjectReader(), rw.parseCommit(curr));
+    } else {
+      noteMap = NoteMap.newEmptyMap();
+    }
+    // Even though reading from changes might not be enabled, we need to
+    // parse any existing revision notes so we can merge them.
+    return RevisionNoteMap.parseRobotComments(
+        noteUtil.getChangeNoteJson(), rw.getObjectReader(), noteMap);
+  }
+
+  @Override
+  protected CommitBuilder applyImpl(RevWalk rw, ObjectInserter ins, ObjectId curr)
+      throws OrmException, IOException {
+    CommitBuilder cb = new CommitBuilder();
+    cb.setMessage("Update robot comments");
+    try {
+      return storeCommentsInNotes(rw, ins, curr, cb);
+    } catch (ConfigInvalidException e) {
+      throw new OrmException(e);
+    }
+  }
+
+  @Override
+  protected Project.NameKey getProjectName() {
+    return getNotes().getProjectName();
+  }
+
+  @Override
+  protected String getRefName() {
+    return robotCommentsRef(getId());
+  }
+
+  @Override
+  public boolean isEmpty() {
+    return put.isEmpty();
+  }
+}
diff --git a/java/com/google/gerrit/server/notedb/RobotCommentsRevisionNote.java b/java/com/google/gerrit/server/notedb/RobotCommentsRevisionNote.java
new file mode 100644
index 0000000..6c3cc86
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/RobotCommentsRevisionNote.java
@@ -0,0 +1,44 @@
+// 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.
+
+package com.google.gerrit.server.notedb;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.gerrit.reviewdb.client.RobotComment;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.List;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectReader;
+
+public class RobotCommentsRevisionNote extends RevisionNote<RobotComment> {
+  private final ChangeNoteJson noteUtil;
+
+  RobotCommentsRevisionNote(ChangeNoteJson noteUtil, ObjectReader reader, ObjectId noteId) {
+    super(reader, noteId);
+    this.noteUtil = noteUtil;
+  }
+
+  @Override
+  protected List<RobotComment> parse(byte[] raw, int offset) throws IOException {
+    try (InputStream is = new ByteArrayInputStream(raw, offset, raw.length - offset);
+        Reader r = new InputStreamReader(is, UTF_8)) {
+      return noteUtil.getGson().fromJson(r, RobotCommentsRevisionNoteData.class).comments;
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RobotCommentsRevisionNoteData.java b/java/com/google/gerrit/server/notedb/RobotCommentsRevisionNoteData.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/notedb/RobotCommentsRevisionNoteData.java
rename to java/com/google/gerrit/server/notedb/RobotCommentsRevisionNoteData.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/TestChangeRebuilderWrapper.java b/java/com/google/gerrit/server/notedb/TestChangeRebuilderWrapper.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/notedb/TestChangeRebuilderWrapper.java
rename to java/com/google/gerrit/server/notedb/TestChangeRebuilderWrapper.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/AbortUpdateException.java b/java/com/google/gerrit/server/notedb/rebuild/AbortUpdateException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/AbortUpdateException.java
rename to java/com/google/gerrit/server/notedb/rebuild/AbortUpdateException.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ApprovalEvent.java b/java/com/google/gerrit/server/notedb/rebuild/ApprovalEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ApprovalEvent.java
rename to java/com/google/gerrit/server/notedb/rebuild/ApprovalEvent.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ChangeMessageEvent.java b/java/com/google/gerrit/server/notedb/rebuild/ChangeMessageEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ChangeMessageEvent.java
rename to java/com/google/gerrit/server/notedb/rebuild/ChangeMessageEvent.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ChangeRebuilder.java b/java/com/google/gerrit/server/notedb/rebuild/ChangeRebuilder.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ChangeRebuilder.java
rename to java/com/google/gerrit/server/notedb/rebuild/ChangeRebuilder.java
diff --git a/java/com/google/gerrit/server/notedb/rebuild/ChangeRebuilderImpl.java b/java/com/google/gerrit/server/notedb/rebuild/ChangeRebuilderImpl.java
new file mode 100644
index 0000000..0d516e5
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/rebuild/ChangeRebuilderImpl.java
@@ -0,0 +1,685 @@
+// Copyright (C) 2014 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.google.gerrit.server.notedb.rebuild;
+
+import static com.google.common.base.MoreObjects.firstNonNull;
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.gerrit.reviewdb.client.RefNames.changeMetaRef;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_HASHTAGS;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_PATCH_SET;
+import static java.util.Objects.requireNonNull;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.base.Splitter;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableCollection;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.collect.Ordering;
+import com.google.common.collect.Sets;
+import com.google.common.collect.Table;
+import com.google.common.primitives.Ints;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.PatchLineComment;
+import com.google.gerrit.reviewdb.client.PatchLineComment.Status;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.reviewdb.server.ReviewDbUtil;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.GerritServerId;
+import com.google.gerrit.server.notedb.ChangeBundle;
+import com.google.gerrit.server.notedb.ChangeBundleReader;
+import com.google.gerrit.server.notedb.ChangeDraftUpdate;
+import com.google.gerrit.server.notedb.ChangeNoteUtil;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.server.notedb.NoteDbChangeState;
+import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
+import com.google.gerrit.server.notedb.NoteDbUpdateManager;
+import com.google.gerrit.server.notedb.NoteDbUpdateManager.OpenRepo;
+import com.google.gerrit.server.notedb.NoteDbUpdateManager.Result;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gerrit.server.notedb.ReviewerStateInternal;
+import com.google.gerrit.server.patch.PatchListCache;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.update.ChainedReceiveCommands;
+import com.google.gwtorm.client.Key;
+import com.google.gwtorm.server.Access;
+import com.google.gwtorm.server.AtomicUpdate;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.TreeMap;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.ReceiveCommand;
+
+public class ChangeRebuilderImpl extends ChangeRebuilder {
+  /**
+   * The maximum amount of time between the ReviewDb timestamp of the first and last events batched
+   * together into a single NoteDb update.
+   *
+   * <p>Used to account for the fact that different records with their own timestamps (e.g. {@link
+   * PatchSetApproval} and {@link ChangeMessage}) historically didn't necessarily use the same
+   * timestamp, and tended to call {@code System.currentTimeMillis()} independently.
+   */
+  public static final long MAX_WINDOW_MS = SECONDS.toMillis(3);
+
+  /**
+   * The maximum amount of time between two consecutive events to consider them to be in the same
+   * batch.
+   */
+  static final long MAX_DELTA_MS = SECONDS.toMillis(1);
+
+  private final ChangeBundleReader bundleReader;
+  private final ChangeDraftUpdate.Factory draftUpdateFactory;
+  private final ChangeNoteUtil changeNoteUtil;
+  private final ChangeNotes.Factory notesFactory;
+  private final ChangeUpdate.Factory updateFactory;
+  private final CommentsUtil commentsUtil;
+  private final NoteDbUpdateManager.Factory updateManagerFactory;
+  private final NotesMigration migration;
+  private final PatchListCache patchListCache;
+  private final PersonIdent serverIdent;
+  private final ProjectCache projectCache;
+  private final String serverId;
+  private final long skewMs;
+
+  @Inject
+  ChangeRebuilderImpl(
+      @GerritServerConfig Config cfg,
+      SchemaFactory<ReviewDb> schemaFactory,
+      ChangeBundleReader bundleReader,
+      ChangeDraftUpdate.Factory draftUpdateFactory,
+      ChangeNoteUtil changeNoteUtil,
+      ChangeNotes.Factory notesFactory,
+      ChangeUpdate.Factory updateFactory,
+      CommentsUtil commentsUtil,
+      NoteDbUpdateManager.Factory updateManagerFactory,
+      NotesMigration migration,
+      PatchListCache patchListCache,
+      @GerritPersonIdent PersonIdent serverIdent,
+      @Nullable ProjectCache projectCache,
+      @GerritServerId String serverId) {
+    super(schemaFactory);
+    this.bundleReader = bundleReader;
+    this.draftUpdateFactory = draftUpdateFactory;
+    this.changeNoteUtil = changeNoteUtil;
+    this.notesFactory = notesFactory;
+    this.updateFactory = updateFactory;
+    this.commentsUtil = commentsUtil;
+    this.updateManagerFactory = updateManagerFactory;
+    this.migration = migration;
+    this.patchListCache = patchListCache;
+    this.serverIdent = serverIdent;
+    this.projectCache = projectCache;
+    this.serverId = serverId;
+    this.skewMs = NoteDbChangeState.getReadOnlySkew(cfg);
+  }
+
+  @Override
+  public Result rebuild(ReviewDb db, Change.Id changeId) throws IOException, OrmException {
+    return rebuild(db, changeId, true);
+  }
+
+  @Override
+  public Result rebuildEvenIfReadOnly(ReviewDb db, Change.Id changeId)
+      throws IOException, OrmException {
+    return rebuild(db, changeId, false);
+  }
+
+  private Result rebuild(ReviewDb db, Change.Id changeId, boolean checkReadOnly)
+      throws IOException, OrmException {
+    db = ReviewDbUtil.unwrapDb(db);
+    // Read change just to get project; this instance is then discarded so we can read a consistent
+    // ChangeBundle inside a transaction.
+    Change change = db.changes().get(changeId);
+    if (change == null) {
+      throw new NoSuchChangeException(changeId);
+    }
+    try (NoteDbUpdateManager manager = updateManagerFactory.create(change.getProject())) {
+      buildUpdates(manager, bundleReader.fromReviewDb(db, changeId));
+      return execute(db, changeId, manager, checkReadOnly, true);
+    }
+  }
+
+  @Override
+  public Result rebuild(NoteDbUpdateManager manager, ChangeBundle bundle)
+      throws NoSuchChangeException, IOException, OrmException {
+    Change change = new Change(bundle.getChange());
+    buildUpdates(manager, bundle);
+    return manager.stageAndApplyDelta(change);
+  }
+
+  @Override
+  public NoteDbUpdateManager stage(ReviewDb db, Change.Id changeId)
+      throws IOException, OrmException {
+    db = ReviewDbUtil.unwrapDb(db);
+    Change change = checkNoteDbState(ChangeNotes.readOneReviewDbChange(db, changeId));
+    if (change == null) {
+      throw new NoSuchChangeException(changeId);
+    }
+    NoteDbUpdateManager manager = updateManagerFactory.create(change.getProject());
+    buildUpdates(manager, bundleReader.fromReviewDb(db, changeId));
+    manager.stage();
+    return manager;
+  }
+
+  @Override
+  public Result execute(ReviewDb db, Change.Id changeId, NoteDbUpdateManager manager)
+      throws OrmException, IOException {
+    return execute(db, changeId, manager, true, true);
+  }
+
+  public Result execute(
+      ReviewDb db,
+      Change.Id changeId,
+      NoteDbUpdateManager manager,
+      boolean checkReadOnly,
+      boolean executeManager)
+      throws OrmException, IOException {
+    db = ReviewDbUtil.unwrapDb(db);
+    Change change = checkNoteDbState(ChangeNotes.readOneReviewDbChange(db, changeId));
+    if (change == null) {
+      throw new NoSuchChangeException(changeId);
+    }
+
+    String oldNoteDbStateStr = change.getNoteDbState();
+    Result r = manager.stageAndApplyDelta(change);
+    String newNoteDbStateStr = change.getNoteDbState();
+    if (newNoteDbStateStr == null) {
+      throw new OrmException(
+          String.format(
+              "Rebuilding change %s produced no writes to NoteDb: %s",
+              changeId, bundleReader.fromReviewDb(db, changeId)));
+    }
+    NoteDbChangeState newNoteDbState =
+        requireNonNull(NoteDbChangeState.parse(changeId, newNoteDbStateStr));
+    try {
+      db.changes()
+          .atomicUpdate(
+              changeId,
+              new AtomicUpdate<Change>() {
+                @Override
+                public Change update(Change change) {
+                  if (checkReadOnly) {
+                    NoteDbChangeState.checkNotReadOnly(change, skewMs);
+                  }
+                  String currNoteDbStateStr = change.getNoteDbState();
+                  if (Objects.equals(currNoteDbStateStr, newNoteDbStateStr)) {
+                    // Another thread completed the same rebuild we were about to.
+                    throw new AbortUpdateException();
+                  } else if (!Objects.equals(oldNoteDbStateStr, currNoteDbStateStr)) {
+                    // Another thread updated the state to something else.
+                    throw new ConflictingUpdateRuntimeException(change, oldNoteDbStateStr);
+                  }
+                  change.setNoteDbState(newNoteDbStateStr);
+                  return change;
+                }
+              });
+    } catch (ConflictingUpdateRuntimeException e) {
+      // Rethrow as an OrmException so the caller knows to use staged results. Strictly speaking
+      // they are not completely up to date, but result we send to the caller is the same as if this
+      // rebuild had executed before the other thread.
+      throw new ConflictingUpdateException(e);
+    } catch (AbortUpdateException e) {
+      if (newNoteDbState.isUpToDate(
+          manager.getChangeRepo().cmds.getRepoRefCache(),
+          manager.getAllUsersRepo().cmds.getRepoRefCache())) {
+        // If the state in ReviewDb matches NoteDb at this point, it means another thread
+        // successfully completed this rebuild. It's ok to not execute the update in this case,
+        // since the object referenced in the Result was flushed to the repo by whatever thread won
+        // the race.
+        return r;
+      }
+      // If the state doesn't match, that means another thread attempted this rebuild, but
+      // failed. Fall through and try to update the ref again.
+    }
+    if (migration.failChangeWrites()) {
+      // Don't even attempt to execute if read-only, it would fail anyway. But do throw an exception
+      // to the caller so they know to use the staged results instead of reading from the repo.
+      throw new OrmException(NoteDbUpdateManager.CHANGES_READ_ONLY);
+    }
+    if (executeManager) {
+      manager.execute();
+    }
+    return r;
+  }
+
+  static Change checkNoteDbState(Change c) throws OrmException {
+    // Can only rebuild a change if its primary storage is ReviewDb.
+    NoteDbChangeState s = NoteDbChangeState.parse(c);
+    if (s != null && s.getPrimaryStorage() != PrimaryStorage.REVIEW_DB) {
+      throw new OrmException(String.format("cannot rebuild change %s with state %s", c.getId(), s));
+    }
+    return c;
+  }
+
+  @Override
+  public void buildUpdates(NoteDbUpdateManager manager, ChangeBundle bundle)
+      throws IOException, OrmException {
+    manager.setCheckExpectedState(false).setRefLogMessage("Rebuilding change");
+    Change change = new Change(bundle.getChange());
+    if (bundle.getPatchSets().isEmpty()) {
+      throw new NoPatchSetsException(change.getId());
+    }
+    if (change.getLastUpdatedOn().compareTo(change.getCreatedOn()) < 0) {
+      // A bug in data migration might set created_on to the time of the migration. The
+      // correct timestamps were lost, but we can at least set it so created_on is not after
+      // last_updated_on.
+      // See https://bugs.chromium.org/p/gerrit/issues/detail?id=7397
+      change.setCreatedOn(change.getLastUpdatedOn());
+    }
+
+    // We will rebuild all events, except for draft comments, in buckets based on author and
+    // timestamp.
+    List<Event> events = new ArrayList<>();
+    ListMultimap<Account.Id, DraftCommentEvent> draftCommentEvents =
+        MultimapBuilder.hashKeys().arrayListValues().build();
+
+    events.addAll(getHashtagsEvents(change, manager));
+
+    // Delete ref only after hashtags have been read.
+    deleteChangeMetaRef(change, manager.getChangeRepo().cmds);
+    deleteDraftRefs(change, manager.getAllUsersRepo());
+
+    Integer minPsNum = getMinPatchSetNum(bundle);
+    TreeMap<PatchSet.Id, PatchSetEvent> patchSetEvents =
+        new TreeMap<>(ReviewDbUtil.intKeyOrdering());
+
+    for (PatchSet ps : bundle.getPatchSets()) {
+      PatchSetEvent pse = new PatchSetEvent(change, ps, manager.getChangeRepo().rw);
+      patchSetEvents.put(ps.getId(), pse);
+      events.add(pse);
+      for (Comment c : getComments(bundle, serverId, Status.PUBLISHED, ps)) {
+        CommentEvent e = new CommentEvent(c, change, ps, patchListCache);
+        events.add(e.addDep(pse));
+      }
+      for (Comment c : getComments(bundle, serverId, Status.DRAFT, ps)) {
+        DraftCommentEvent e = new DraftCommentEvent(c, change, ps, patchListCache);
+        draftCommentEvents.put(c.author.getId(), e);
+      }
+    }
+    ensurePatchSetOrder(patchSetEvents);
+
+    for (PatchSetApproval psa : bundle.getPatchSetApprovals()) {
+      PatchSetEvent pse = patchSetEvents.get(psa.getPatchSetId());
+      if (pse != null) {
+        events.add(new ApprovalEvent(psa, change.getCreatedOn()).addDep(pse));
+      }
+    }
+
+    for (Table.Cell<ReviewerStateInternal, Account.Id, Timestamp> r :
+        bundle.getReviewers().asTable().cellSet()) {
+      events.add(new ReviewerEvent(r, change.getCreatedOn()));
+    }
+
+    Change noteDbChange = new Change(null, null, null, null, null);
+    for (ChangeMessage msg : bundle.getChangeMessages()) {
+      Event msgEvent = new ChangeMessageEvent(change, noteDbChange, msg, change.getCreatedOn());
+      if (msg.getPatchSetId() != null) {
+        PatchSetEvent pse = patchSetEvents.get(msg.getPatchSetId());
+        if (pse == null) {
+          continue; // Ignore events for missing patch sets.
+        }
+        msgEvent.addDep(pse);
+      }
+      events.add(msgEvent);
+    }
+
+    sortAndFillEvents(change, noteDbChange, bundle.getPatchSets(), events, minPsNum);
+
+    EventList<Event> el = new EventList<>();
+    for (Event e : events) {
+      if (!el.canAdd(e)) {
+        flushEventsToUpdate(manager, el, change);
+        checkState(el.canAdd(e));
+      }
+      el.add(e);
+    }
+    flushEventsToUpdate(manager, el, change);
+
+    EventList<DraftCommentEvent> plcel = new EventList<>();
+    for (Account.Id author : draftCommentEvents.keys()) {
+      for (DraftCommentEvent e : Ordering.natural().sortedCopy(draftCommentEvents.get(author))) {
+        if (!plcel.canAdd(e)) {
+          flushEventsToDraftUpdate(manager, plcel, change);
+          checkState(plcel.canAdd(e));
+        }
+        plcel.add(e);
+      }
+      flushEventsToDraftUpdate(manager, plcel, change);
+    }
+  }
+
+  private static Integer getMinPatchSetNum(ChangeBundle bundle) {
+    Integer minPsNum = null;
+    for (PatchSet ps : bundle.getPatchSets()) {
+      int n = ps.getId().get();
+      if (minPsNum == null || n < minPsNum) {
+        minPsNum = n;
+      }
+    }
+    return minPsNum;
+  }
+
+  private static void ensurePatchSetOrder(TreeMap<PatchSet.Id, PatchSetEvent> events) {
+    if (events.isEmpty()) {
+      return;
+    }
+    Iterator<PatchSetEvent> it = events.values().iterator();
+    PatchSetEvent curr = it.next();
+    while (it.hasNext()) {
+      PatchSetEvent next = it.next();
+      next.addDep(curr);
+      curr = next;
+    }
+  }
+
+  private static List<Comment> getComments(
+      ChangeBundle bundle, String serverId, PatchLineComment.Status status, PatchSet ps) {
+    return bundle.getPatchLineComments().stream()
+        .filter(c -> c.getPatchSetId().equals(ps.getId()) && c.getStatus() == status)
+        .map(plc -> plc.asComment(serverId))
+        .sorted(CommentsUtil.COMMENT_ORDER)
+        .collect(toList());
+  }
+
+  private void sortAndFillEvents(
+      Change change,
+      Change noteDbChange,
+      ImmutableCollection<PatchSet> patchSets,
+      List<Event> events,
+      Integer minPsNum) {
+    Event finalUpdates = new FinalUpdatesEvent(change, noteDbChange, patchSets);
+    events.add(finalUpdates);
+    setPostSubmitDeps(events);
+    new EventSorter(events).sort();
+
+    // Ensure the first event in the list creates the change, setting the author and any required
+    // footers. Also force the creation time of the first patch set to match the creation time of
+    // the change.
+    Event first = events.get(0);
+    if (first instanceof PatchSetEvent && change.getOwner().equals(first.user)) {
+      first.when = change.getCreatedOn();
+      ((PatchSetEvent) first).createChange = true;
+    } else {
+      events.add(0, new CreateChangeEvent(change, minPsNum));
+    }
+
+    // Final pass to correct some inconsistencies.
+    //
+    // First, fill in any missing patch set IDs using the latest patch set of the change at the time
+    // of the event, because NoteDb can't represent actions with no associated patch set ID. This
+    // workaround is as if a user added a ChangeMessage on the change by replying from the latest
+    // patch set.
+    //
+    // Start with the first patch set that actually exists. If there are no patch sets at all,
+    // minPsNum will be null, so just bail and use 1 as the patch set ID.
+    //
+    // Second, ensure timestamps are nondecreasing, by copying the previous timestamp if this
+    // happens. This assumes that the only way this can happen is due to dependency constraints, and
+    // it is ok to give an event the same timestamp as one of its dependencies.
+    int ps = firstNonNull(minPsNum, 1);
+    for (int i = 0; i < events.size(); i++) {
+      Event e = events.get(i);
+      if (e.psId == null) {
+        e.psId = new PatchSet.Id(change.getId(), ps);
+      } else {
+        ps = Math.max(ps, e.psId.get());
+      }
+
+      if (i > 0) {
+        Event p = events.get(i - 1);
+        if (e.when.before(p.when)) {
+          e.when = p.when;
+        }
+      }
+    }
+  }
+
+  private void setPostSubmitDeps(List<Event> events) {
+    Optional<Event> submitEvent =
+        Lists.reverse(events).stream().filter(Event::isSubmit).findFirst();
+    if (submitEvent.isPresent()) {
+      events.stream().filter(Event::isPostSubmitApproval).forEach(e -> e.addDep(submitEvent.get()));
+    }
+  }
+
+  private void flushEventsToUpdate(
+      NoteDbUpdateManager manager, EventList<Event> events, Change change)
+      throws OrmException, IOException {
+    if (events.isEmpty()) {
+      return;
+    }
+    Comparator<String> labelNameComparator;
+    if (projectCache != null) {
+      labelNameComparator = projectCache.get(change.getProject()).getLabelTypes().nameComparator();
+    } else {
+      // No project cache available, bail and use natural ordering; there's no semantic difference
+      // anyway difference.
+      labelNameComparator = Ordering.natural();
+    }
+    ChangeUpdate update =
+        updateFactory.create(
+            change,
+            events.getAccountId(),
+            events.getRealAccountId(),
+            newAuthorIdent(events),
+            events.getWhen(),
+            labelNameComparator);
+    update.setAllowWriteToNewRef(true);
+    update.setPatchSetId(events.getPatchSetId());
+    update.setTag(events.getTag());
+    for (Event e : events) {
+      e.apply(update);
+    }
+    manager.add(update);
+    events.clear();
+  }
+
+  private void flushEventsToDraftUpdate(
+      NoteDbUpdateManager manager, EventList<DraftCommentEvent> events, Change change) {
+    if (events.isEmpty()) {
+      return;
+    }
+    ChangeDraftUpdate update =
+        draftUpdateFactory.create(
+            change,
+            events.getAccountId(),
+            events.getRealAccountId(),
+            newAuthorIdent(events),
+            events.getWhen());
+    update.setPatchSetId(events.getPatchSetId());
+    for (DraftCommentEvent e : events) {
+      e.applyDraft(update);
+    }
+    manager.add(update);
+    events.clear();
+  }
+
+  private PersonIdent newAuthorIdent(EventList<?> events) {
+    Account.Id id = events.getAccountId();
+    if (id == null) {
+      return new PersonIdent(serverIdent, events.getWhen());
+    }
+    return changeNoteUtil.newIdent(id, events.getWhen(), serverIdent);
+  }
+
+  private List<HashtagsEvent> getHashtagsEvents(Change change, NoteDbUpdateManager manager)
+      throws IOException {
+    String refName = changeMetaRef(change.getId());
+    Optional<ObjectId> old = manager.getChangeRepo().getObjectId(refName);
+    if (!old.isPresent()) {
+      return Collections.emptyList();
+    }
+
+    RevWalk rw = manager.getChangeRepo().rw;
+    List<HashtagsEvent> events = new ArrayList<>();
+    rw.reset();
+    rw.markStart(rw.parseCommit(old.get()));
+    for (RevCommit commit : rw) {
+      Account.Id authorId;
+      try {
+        authorId =
+            changeNoteUtil
+                .getLegacyChangeNoteRead()
+                .parseIdent(commit.getAuthorIdent(), change.getId());
+      } catch (ConfigInvalidException e) {
+        continue; // Corrupt data, no valid hashtags in this commit.
+      }
+      PatchSet.Id psId = parsePatchSetId(change, commit);
+      Set<String> hashtags = parseHashtags(commit);
+      if (authorId == null || psId == null || hashtags == null) {
+        continue;
+      }
+
+      Timestamp commitTime = new Timestamp(commit.getCommitterIdent().getWhen().getTime());
+      events.add(new HashtagsEvent(psId, authorId, commitTime, hashtags, change.getCreatedOn()));
+    }
+    return events;
+  }
+
+  private Set<String> parseHashtags(RevCommit commit) {
+    List<String> hashtagsLines = commit.getFooterLines(FOOTER_HASHTAGS);
+    if (hashtagsLines.isEmpty() || hashtagsLines.size() > 1) {
+      return null;
+    }
+
+    if (hashtagsLines.get(0).isEmpty()) {
+      return ImmutableSet.of();
+    }
+    return Sets.newHashSet(Splitter.on(',').split(hashtagsLines.get(0)));
+  }
+
+  private PatchSet.Id parsePatchSetId(Change change, RevCommit commit) {
+    List<String> psIdLines = commit.getFooterLines(FOOTER_PATCH_SET);
+    if (psIdLines.size() != 1) {
+      return null;
+    }
+    Integer psId = Ints.tryParse(psIdLines.get(0));
+    if (psId == null) {
+      return null;
+    }
+    return new PatchSet.Id(change.getId(), psId);
+  }
+
+  private void deleteChangeMetaRef(Change change, ChainedReceiveCommands cmds) throws IOException {
+    String refName = changeMetaRef(change.getId());
+    Optional<ObjectId> old = cmds.get(refName);
+    if (old.isPresent()) {
+      cmds.add(new ReceiveCommand(old.get(), ObjectId.zeroId(), refName));
+    }
+  }
+
+  private void deleteDraftRefs(Change change, OpenRepo allUsersRepo) throws IOException {
+    for (Ref r :
+        allUsersRepo
+            .repo
+            .getRefDatabase()
+            .getRefsByPrefix(RefNames.refsDraftCommentsPrefix(change.getId()))) {
+      allUsersRepo.cmds.add(new ReceiveCommand(r.getObjectId(), ObjectId.zeroId(), r.getName()));
+    }
+  }
+
+  static void createChange(ChangeUpdate update, Change change) {
+    update.setSubjectForCommit("Create change");
+    update.setChangeId(change.getKey().get());
+    update.setBranch(change.getDest().get());
+    update.setSubject(change.getOriginalSubject());
+    if (change.getRevertOf() != null) {
+      update.setRevertOf(change.getRevertOf().get());
+    }
+  }
+
+  @Override
+  public void rebuildReviewDb(ReviewDb db, Project.NameKey project, Change.Id changeId)
+      throws OrmException {
+    // TODO(dborowitz): Fail fast if changes tables are disabled in ReviewDb.
+    ChangeNotes notes = notesFactory.create(db, project, changeId);
+    ChangeBundle bundle = ChangeBundle.fromNotes(commentsUtil, notes);
+
+    db = ReviewDbUtil.unwrapDb(db);
+    db.changes().beginTransaction(changeId);
+    try {
+      Change c = db.changes().get(changeId);
+      if (c != null) {
+        PrimaryStorage ps = PrimaryStorage.of(c);
+        switch (ps) {
+          case REVIEW_DB:
+            return; // Nothing to do.
+          case NOTE_DB:
+            break; // Continue and rebuild.
+          default:
+            throw new OrmException("primary storage of " + changeId + " is " + ps);
+        }
+      } else {
+        c = notes.getChange();
+      }
+      db.changes().upsert(Collections.singleton(c));
+      putExactlyEntities(
+          db.changeMessages(), db.changeMessages().byChange(c.getId()), bundle.getChangeMessages());
+      putExactlyEntities(db.patchSets(), db.patchSets().byChange(c.getId()), bundle.getPatchSets());
+      putExactlyEntities(
+          db.patchSetApprovals(),
+          db.patchSetApprovals().byChange(c.getId()),
+          bundle.getPatchSetApprovals());
+      putExactlyEntities(
+          db.patchComments(),
+          db.patchComments().byChange(c.getId()),
+          bundle.getPatchLineComments());
+      db.commit();
+    } finally {
+      db.rollback();
+    }
+  }
+
+  private static <T, K extends Key<?>> void putExactlyEntities(
+      Access<T, K> access, Iterable<T> existing, Collection<T> ents) throws OrmException {
+    Set<K> toKeep = access.toMap(ents).keySet();
+    access.delete(
+        FluentIterable.from(existing).filter(e -> !toKeep.contains(access.primaryKey(e))));
+    access.upsert(ents);
+  }
+}
diff --git a/java/com/google/gerrit/server/notedb/rebuild/CommentEvent.java b/java/com/google/gerrit/server/notedb/rebuild/CommentEvent.java
new file mode 100644
index 0000000..8f7b387
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/rebuild/CommentEvent.java
@@ -0,0 +1,82 @@
+// 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.
+
+package com.google.gerrit.server.notedb.rebuild;
+
+import static com.google.gerrit.server.CommentsUtil.setCommentRevId;
+
+import com.google.common.base.MoreObjects.ToStringHelper;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.PatchLineComment;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.server.patch.PatchListCache;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+
+class CommentEvent extends Event {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public final Comment c;
+  private final Change change;
+  private final PatchSet ps;
+  private final PatchListCache cache;
+
+  CommentEvent(Comment c, Change change, PatchSet ps, PatchListCache cache) {
+    super(
+        CommentsUtil.getCommentPsId(change.getId(), c),
+        c.author.getId(),
+        c.getRealAuthor().getId(),
+        c.writtenOn,
+        change.getCreatedOn(),
+        c.tag);
+    this.c = c;
+    this.change = change;
+    this.ps = ps;
+    this.cache = cache;
+  }
+
+  @Override
+  boolean uniquePerUpdate() {
+    return false;
+  }
+
+  @Override
+  protected boolean canHaveTag() {
+    return true;
+  }
+
+  @Override
+  void apply(ChangeUpdate update) {
+    checkUpdate(update);
+    if (c.revId == null) {
+      try {
+        setCommentRevId(c, cache, change, ps);
+      } catch (PatchListNotAvailableException e) {
+        logger.atWarning().log(
+            "Unable to determine parent commit of patch set %s (%s); omitting inline comment %s",
+            ps.getId(), ps.getRevision(), c);
+        return;
+      }
+    }
+    update.putComment(PatchLineComment.Status.PUBLISHED, c);
+  }
+
+  @Override
+  protected void addToString(ToStringHelper helper) {
+    helper.add("message", c.message);
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ConflictingUpdateException.java b/java/com/google/gerrit/server/notedb/rebuild/ConflictingUpdateException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ConflictingUpdateException.java
rename to java/com/google/gerrit/server/notedb/rebuild/ConflictingUpdateException.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ConflictingUpdateRuntimeException.java b/java/com/google/gerrit/server/notedb/rebuild/ConflictingUpdateRuntimeException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ConflictingUpdateRuntimeException.java
rename to java/com/google/gerrit/server/notedb/rebuild/ConflictingUpdateRuntimeException.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/CreateChangeEvent.java b/java/com/google/gerrit/server/notedb/rebuild/CreateChangeEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/CreateChangeEvent.java
rename to java/com/google/gerrit/server/notedb/rebuild/CreateChangeEvent.java
diff --git a/java/com/google/gerrit/server/notedb/rebuild/DraftCommentEvent.java b/java/com/google/gerrit/server/notedb/rebuild/DraftCommentEvent.java
new file mode 100644
index 0000000..2a2795d
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/rebuild/DraftCommentEvent.java
@@ -0,0 +1,81 @@
+// 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.
+
+package com.google.gerrit.server.notedb.rebuild;
+
+import static com.google.gerrit.server.CommentsUtil.setCommentRevId;
+
+import com.google.common.base.MoreObjects.ToStringHelper;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.notedb.ChangeDraftUpdate;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.server.patch.PatchListCache;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+
+class DraftCommentEvent extends Event {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public final Comment c;
+  private final Change change;
+  private final PatchSet ps;
+  private final PatchListCache cache;
+
+  DraftCommentEvent(Comment c, Change change, PatchSet ps, PatchListCache cache) {
+    super(
+        CommentsUtil.getCommentPsId(change.getId(), c),
+        c.author.getId(),
+        c.getRealAuthor().getId(),
+        c.writtenOn,
+        change.getCreatedOn(),
+        c.tag);
+    this.c = c;
+    this.change = change;
+    this.ps = ps;
+    this.cache = cache;
+  }
+
+  @Override
+  boolean uniquePerUpdate() {
+    return false;
+  }
+
+  @Override
+  void apply(ChangeUpdate update) {
+    throw new UnsupportedOperationException();
+  }
+
+  void applyDraft(ChangeDraftUpdate draftUpdate) {
+    if (c.revId == null) {
+      try {
+        setCommentRevId(c, cache, change, ps);
+      } catch (PatchListNotAvailableException e) {
+        logger.atWarning().log(
+            "Unable to determine parent commit of patch set %s (%s);"
+                + " omitting draft inline comment %s",
+            ps.getId(), ps.getRevision(), c);
+        return;
+      }
+    }
+    draftUpdate.putComment(c);
+  }
+
+  @Override
+  protected void addToString(ToStringHelper helper) {
+    helper.add("message", c.message);
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/Event.java b/java/com/google/gerrit/server/notedb/rebuild/Event.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/Event.java
rename to java/com/google/gerrit/server/notedb/rebuild/Event.java
diff --git a/java/com/google/gerrit/server/notedb/rebuild/EventList.java b/java/com/google/gerrit/server/notedb/rebuild/EventList.java
new file mode 100644
index 0000000..e83814d
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/rebuild/EventList.java
@@ -0,0 +1,170 @@
+// 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.
+
+package com.google.gerrit.server.notedb.rebuild;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkState;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.Lists;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.Objects;
+
+class EventList<E extends Event> implements Iterable<E> {
+  private final ArrayList<E> list = new ArrayList<>();
+  private boolean isSubmit;
+
+  @Override
+  public Iterator<E> iterator() {
+    return list.iterator();
+  }
+
+  void add(E e) {
+    list.add(e);
+    if (e.isSubmit()) {
+      isSubmit = true;
+    }
+  }
+
+  void clear() {
+    list.clear();
+    isSubmit = false;
+  }
+
+  boolean isEmpty() {
+    return list.isEmpty();
+  }
+
+  boolean canAdd(E e) {
+    if (isEmpty()) {
+      return true;
+    }
+    if (e instanceof FinalUpdatesEvent) {
+      return false; // FinalUpdatesEvent always gets its own update.
+    }
+
+    Event last = getLast();
+    if (!Objects.equals(e.user, last.user)
+        || !Objects.equals(e.realUser, last.realUser)
+        || !e.psId.equals(last.psId)) {
+      return false; // Different patch set or author.
+    }
+    if (e.canHaveTag() && canHaveTag() && !Objects.equals(e.tag, getTag())) {
+      // We should trust the tag field, and it doesn't match.
+      return false;
+    }
+    if (e.isPostSubmitApproval() && isSubmit) {
+      // Post-submit approvals must come after the update that submits.
+      return false;
+    }
+
+    long t = e.when.getTime();
+    long tFirst = getFirstTime();
+    long tLast = getLastTime();
+    checkArgument(t >= tLast, "event %s is before previous event in list %s", e, last);
+    if (t - tLast > ChangeRebuilderImpl.MAX_DELTA_MS
+        || t - tFirst > ChangeRebuilderImpl.MAX_WINDOW_MS) {
+      return false; // Too much time elapsed.
+    }
+
+    if (!e.uniquePerUpdate()) {
+      return true;
+    }
+    for (Event o : this) {
+      if (e.getClass() == o.getClass()) {
+        return false; // Only one event of this type allowed per update.
+      }
+    }
+
+    // TODO(dborowitz): Additional heuristics, like keeping events separate if
+    // they affect overlapping fields within a single entity.
+
+    return true;
+  }
+
+  Timestamp getWhen() {
+    return get(0).when;
+  }
+
+  PatchSet.Id getPatchSetId() {
+    PatchSet.Id id = requireNonNull(get(0).psId);
+    for (int i = 1; i < size(); i++) {
+      checkState(
+          get(i).psId.equals(id), "mismatched patch sets in EventList: %s != %s", id, get(i).psId);
+    }
+    return id;
+  }
+
+  Account.Id getAccountId() {
+    Account.Id id = get(0).user;
+    for (int i = 1; i < size(); i++) {
+      checkState(
+          Objects.equals(id, get(i).user),
+          "mismatched users in EventList: %s != %s",
+          id,
+          get(i).user);
+    }
+    return id;
+  }
+
+  Account.Id getRealAccountId() {
+    Account.Id id = get(0).realUser;
+    for (int i = 1; i < size(); i++) {
+      checkState(
+          Objects.equals(id, get(i).realUser),
+          "mismatched real users in EventList: %s != %s",
+          id,
+          get(i).realUser);
+    }
+    return id;
+  }
+
+  String getTag() {
+    for (E e : Lists.reverse(list)) {
+      if (e.tag != null) {
+        return e.tag;
+      }
+    }
+    return null;
+  }
+
+  private boolean canHaveTag() {
+    return list.stream().anyMatch(Event::canHaveTag);
+  }
+
+  private E get(int i) {
+    return list.get(i);
+  }
+
+  private int size() {
+    return list.size();
+  }
+
+  private E getLast() {
+    return list.get(list.size() - 1);
+  }
+
+  private long getLastTime() {
+    return getLast().when.getTime();
+  }
+
+  private long getFirstTime() {
+    return list.get(0).when.getTime();
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/EventSorter.java b/java/com/google/gerrit/server/notedb/rebuild/EventSorter.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/EventSorter.java
rename to java/com/google/gerrit/server/notedb/rebuild/EventSorter.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/FinalUpdatesEvent.java b/java/com/google/gerrit/server/notedb/rebuild/FinalUpdatesEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/FinalUpdatesEvent.java
rename to java/com/google/gerrit/server/notedb/rebuild/FinalUpdatesEvent.java
diff --git a/java/com/google/gerrit/server/notedb/rebuild/GcAllUsers.java b/java/com/google/gerrit/server/notedb/rebuild/GcAllUsers.java
new file mode 100644
index 0000000..f2a5cc6
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/rebuild/GcAllUsers.java
@@ -0,0 +1,121 @@
+// 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.
+
+package com.google.gerrit.server.notedb.rebuild;
+
+import static java.util.Objects.requireNonNull;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_GC_SECTION;
+import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_AUTO;
+
+import com.google.common.base.Throwables;
+import com.google.common.collect.ImmutableList;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.GarbageCollectionResult;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.git.GarbageCollection;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.LocalDiskRepositoryManager;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.function.Consumer;
+import org.eclipse.jgit.lib.Repository;
+
+@Singleton
+public class GcAllUsers {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final AllUsersName allUsers;
+  private final GarbageCollection.Factory gcFactory;
+  private final GitRepositoryManager repoManager;
+
+  @Inject
+  GcAllUsers(
+      AllUsersName allUsers,
+      GarbageCollection.Factory gcFactory,
+      GitRepositoryManager repoManager) {
+    this.allUsers = allUsers;
+    this.gcFactory = gcFactory;
+    this.repoManager = repoManager;
+  }
+
+  public void runWithLogger() {
+    // Print log messages using logger, and skip progress.
+    run(s -> logger.atInfo().log(s), null);
+  }
+
+  public void run(PrintWriter writer) {
+    // Print both log messages and progress to given writer.
+    run(requireNonNull(writer)::println, writer);
+  }
+
+  private void run(Consumer<String> logOneLine, @Nullable PrintWriter progressWriter) {
+    if (!(repoManager instanceof LocalDiskRepositoryManager)) {
+      logOneLine.accept("Skipping GC of " + allUsers + "; not a local disk repo");
+      return;
+    }
+    if (!enableAutoGc(logOneLine)) {
+      logOneLine.accept(
+          "Skipping GC of "
+              + allUsers
+              + " due to disabling "
+              + CONFIG_GC_SECTION
+              + "."
+              + CONFIG_KEY_AUTO);
+      logOneLine.accept(
+          "If loading accounts is slow after the NoteDb migration, run `git gc` on "
+              + allUsers
+              + " manually");
+      return;
+    }
+
+    if (progressWriter == null) {
+      // Mimic log line from GarbageCollection.
+      logOneLine.accept("collecting garbage for \"" + allUsers + "\":\n");
+    }
+    GarbageCollectionResult result =
+        gcFactory.create().run(ImmutableList.of(allUsers), progressWriter);
+    if (!result.hasErrors()) {
+      return;
+    }
+    for (GarbageCollectionResult.Error e : result.getErrors()) {
+      switch (e.getType()) {
+        case GC_ALREADY_SCHEDULED:
+          logOneLine.accept("GC already scheduled for " + e.getProjectName());
+          break;
+        case GC_FAILED:
+          logOneLine.accept("GC failed for " + e.getProjectName());
+          break;
+        case REPOSITORY_NOT_FOUND:
+          logOneLine.accept(e.getProjectName() + " repo not found");
+          break;
+        default:
+          logOneLine.accept("GC failed for " + e.getProjectName() + ": " + e.getType());
+          break;
+      }
+    }
+  }
+
+  private boolean enableAutoGc(Consumer<String> logOneLine) {
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      return repo.getConfig().getInt(CONFIG_GC_SECTION, CONFIG_KEY_AUTO, -1) != 0;
+    } catch (IOException e) {
+      logOneLine.accept(
+          "Error reading config for " + allUsers + ":\n" + Throwables.getStackTraceAsString(e));
+      return false;
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/HashtagsEvent.java b/java/com/google/gerrit/server/notedb/rebuild/HashtagsEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/HashtagsEvent.java
rename to java/com/google/gerrit/server/notedb/rebuild/HashtagsEvent.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/MigrationException.java b/java/com/google/gerrit/server/notedb/rebuild/MigrationException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/MigrationException.java
rename to java/com/google/gerrit/server/notedb/rebuild/MigrationException.java
diff --git a/java/com/google/gerrit/server/notedb/rebuild/NoteDbMigrator.java b/java/com/google/gerrit/server/notedb/rebuild/NoteDbMigrator.java
new file mode 100644
index 0000000..1ac1da2
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/rebuild/NoteDbMigrator.java
@@ -0,0 +1,1053 @@
+// Copyright (C) 2017 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.google.gerrit.server.notedb.rebuild;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.gerrit.reviewdb.server.ReviewDbUtil.unwrapDb;
+import static com.google.gerrit.server.notedb.NotesMigration.SECTION_NOTE_DB;
+import static com.google.gerrit.server.notedb.NotesMigrationState.NOTE_DB;
+import static com.google.gerrit.server.notedb.NotesMigrationState.READ_WRITE_NO_SEQUENCE;
+import static com.google.gerrit.server.notedb.NotesMigrationState.READ_WRITE_WITH_SEQUENCE_NOTE_DB_PRIMARY;
+import static com.google.gerrit.server.notedb.NotesMigrationState.READ_WRITE_WITH_SEQUENCE_REVIEW_DB_PRIMARY;
+import static com.google.gerrit.server.notedb.NotesMigrationState.WRITE;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Comparator.comparing;
+import static java.util.Objects.requireNonNull;
+import static java.util.stream.Collectors.joining;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Stopwatch;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.collect.Ordering;
+import com.google.common.collect.SetMultimap;
+import com.google.common.collect.Streams;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.common.util.concurrent.MoreExecutors;
+import com.google.gerrit.common.FormatUtil;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.reviewdb.server.ReviewDbWrapper;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.InternalUser;
+import com.google.gerrit.server.Sequences;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.GerritServerConfigProvider;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.LockFailureException;
+import com.google.gerrit.server.git.WorkQueue;
+import com.google.gerrit.server.notedb.ChangeBundleReader;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.MutableNotesMigration;
+import com.google.gerrit.server.notedb.NoteDbTable;
+import com.google.gerrit.server.notedb.NoteDbUpdateManager;
+import com.google.gerrit.server.notedb.NotesMigrationState;
+import com.google.gerrit.server.notedb.PrimaryStorageMigrator;
+import com.google.gerrit.server.notedb.PrimaryStorageMigrator.NoNoteDbStateException;
+import com.google.gerrit.server.notedb.RepoSequence;
+import com.google.gerrit.server.notedb.rebuild.ChangeRebuilder.NoPatchSetsException;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.update.ChainedReceiveCommands;
+import com.google.gerrit.server.update.RefUpdateUtil;
+import com.google.gerrit.server.util.ManualRequestContext;
+import com.google.gerrit.server.util.ThreadLocalRequestContext;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.internal.storage.file.FileRepository;
+import org.eclipse.jgit.internal.storage.file.PackInserter;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.ProgressMonitor;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.lib.TextProgressMonitor;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.storage.file.FileBasedConfig;
+import org.eclipse.jgit.transport.ReceiveCommand;
+import org.eclipse.jgit.util.FS;
+import org.eclipse.jgit.util.io.NullOutputStream;
+
+/** One stop shop for migrating a site's change storage from ReviewDb to NoteDb. */
+public class NoteDbMigrator implements AutoCloseable {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final String AUTO_MIGRATE = "autoMigrate";
+  private static final String TRIAL = "trial";
+
+  public static boolean getAutoMigrate(Config cfg) {
+    return cfg.getBoolean(SECTION_NOTE_DB, NoteDbTable.CHANGES.key(), AUTO_MIGRATE, false);
+  }
+
+  private static void setAutoMigrate(Config cfg, boolean autoMigrate) {
+    cfg.setBoolean(SECTION_NOTE_DB, NoteDbTable.CHANGES.key(), AUTO_MIGRATE, autoMigrate);
+  }
+
+  public static boolean getTrialMode(Config cfg) {
+    return cfg.getBoolean(SECTION_NOTE_DB, NoteDbTable.CHANGES.key(), TRIAL, false);
+  }
+
+  public static void setTrialMode(Config cfg, boolean trial) {
+    cfg.setBoolean(SECTION_NOTE_DB, NoteDbTable.CHANGES.key(), TRIAL, trial);
+  }
+
+  public static class Builder {
+    private final Config cfg;
+    private final SitePaths sitePaths;
+    private final Provider<PersonIdent> serverIdent;
+    private final AllUsersName allUsers;
+    private final SchemaFactory<ReviewDb> schemaFactory;
+    private final GitRepositoryManager repoManager;
+    private final NoteDbUpdateManager.Factory updateManagerFactory;
+    private final ChangeBundleReader bundleReader;
+    private final AllProjectsName allProjects;
+    private final InternalUser.Factory userFactory;
+    private final ThreadLocalRequestContext requestContext;
+    private final ChangeRebuilderImpl rebuilder;
+    private final WorkQueue workQueue;
+    private final MutableNotesMigration globalNotesMigration;
+    private final PrimaryStorageMigrator primaryStorageMigrator;
+    private final DynamicSet<NotesMigrationStateListener> listeners;
+
+    private int threads;
+    private ImmutableList<Project.NameKey> projects = ImmutableList.of();
+    private ImmutableList<Project.NameKey> skipProjects = ImmutableList.of();
+    private ImmutableList<Change.Id> changes = ImmutableList.of();
+    private OutputStream progressOut = NullOutputStream.INSTANCE;
+    private NotesMigrationState stopAtState;
+    private boolean trial;
+    private boolean forceRebuild;
+    private int sequenceGap = -1;
+    private boolean autoMigrate;
+
+    @Inject
+    Builder(
+        GerritServerConfigProvider configProvider,
+        SitePaths sitePaths,
+        @GerritPersonIdent Provider<PersonIdent> serverIdent,
+        AllUsersName allUsers,
+        SchemaFactory<ReviewDb> schemaFactory,
+        GitRepositoryManager repoManager,
+        NoteDbUpdateManager.Factory updateManagerFactory,
+        ChangeBundleReader bundleReader,
+        AllProjectsName allProjects,
+        ThreadLocalRequestContext requestContext,
+        InternalUser.Factory userFactory,
+        ChangeRebuilderImpl rebuilder,
+        WorkQueue workQueue,
+        MutableNotesMigration globalNotesMigration,
+        PrimaryStorageMigrator primaryStorageMigrator,
+        DynamicSet<NotesMigrationStateListener> listeners) {
+      // Reload gerrit.config/notedb.config on each migrator invocation, in case a previous
+      // migration in the same process modified the on-disk contents. This ensures the defaults for
+      // trial/autoMigrate get set correctly below.
+      this.cfg = configProvider.loadConfig();
+      this.sitePaths = sitePaths;
+      this.serverIdent = serverIdent;
+      this.allUsers = allUsers;
+      this.schemaFactory = schemaFactory;
+      this.repoManager = repoManager;
+      this.updateManagerFactory = updateManagerFactory;
+      this.bundleReader = bundleReader;
+      this.allProjects = allProjects;
+      this.requestContext = requestContext;
+      this.userFactory = userFactory;
+      this.rebuilder = rebuilder;
+      this.workQueue = workQueue;
+      this.globalNotesMigration = globalNotesMigration;
+      this.primaryStorageMigrator = primaryStorageMigrator;
+      this.listeners = listeners;
+      this.trial = getTrialMode(cfg);
+      this.autoMigrate = getAutoMigrate(cfg);
+    }
+
+    /**
+     * Set the number of threads used by parallelizable phases of the migration, such as rebuilding
+     * all changes.
+     *
+     * <p>Not all phases are parallelizable, and calling {@link #rebuild()} directly will do
+     * substantial work in the calling thread regardless of the number of threads configured.
+     *
+     * <p>By default, all work is done in the calling thread.
+     *
+     * @param threads thread count; if less than 2, all work happens in the calling thread.
+     * @return this.
+     */
+    public Builder setThreads(int threads) {
+      this.threads = threads;
+      return this;
+    }
+
+    /**
+     * Limit the set of projects that are processed.
+     *
+     * <p>Incompatible with {@link #setChanges(Collection)}.
+     *
+     * <p>By default, all projects will be processed.
+     *
+     * @param projects set of projects; if null or empty, all projects will be processed.
+     * @return this.
+     */
+    public Builder setProjects(@Nullable Collection<Project.NameKey> projects) {
+      this.projects = projects != null ? ImmutableList.copyOf(projects) : ImmutableList.of();
+      return this;
+    }
+
+    /**
+     * Process all projects except these
+     *
+     * <p>Incompatible with {@link #setProjects(Collection)} and {@link #setChanges(Collection)}
+     *
+     * <p>By default, all projects will be processed.
+     *
+     * @param skipProjects set of projects; if null or empty all project will be processed
+     * @return this.
+     */
+    public Builder setSkipProjects(@Nullable Collection<Project.NameKey> skipProjects) {
+      this.skipProjects =
+          skipProjects != null ? ImmutableList.copyOf(skipProjects) : ImmutableList.of();
+      return this;
+    }
+
+    /**
+     * Limit the set of changes that are processed.
+     *
+     * <p>Incompatible with {@link #setProjects(Collection)}.
+     *
+     * <p>By default, all changes will be processed.
+     *
+     * @param changes set of changes; if null or empty, all changes will be processed.
+     * @return this.
+     */
+    public Builder setChanges(@Nullable Collection<Change.Id> changes) {
+      this.changes = changes != null ? ImmutableList.copyOf(changes) : ImmutableList.of();
+      return this;
+    }
+
+    /**
+     * Set output stream for progress monitors.
+     *
+     * <p>By default, there is no progress monitor output (although there may be other logs).
+     *
+     * @param progressOut output stream.
+     * @return this.
+     */
+    public Builder setProgressOut(OutputStream progressOut) {
+      this.progressOut = requireNonNull(progressOut);
+      return this;
+    }
+
+    /**
+     * Stop at a specific migration state, for testing only.
+     *
+     * @param stopAtState state to stop at.
+     * @return this.
+     */
+    @VisibleForTesting
+    public Builder setStopAtStateForTesting(NotesMigrationState stopAtState) {
+      this.stopAtState = stopAtState;
+      return this;
+    }
+
+    /**
+     * Rebuild in "trial mode": configure Gerrit to write to and read from NoteDb, but leave
+     * ReviewDb as the source of truth for all changes.
+     *
+     * <p>By default, trial mode is off, and NoteDb is the source of truth for all changes following
+     * the migration.
+     *
+     * @param trial whether to rebuild in trial mode.
+     * @return this.
+     */
+    public Builder setTrialMode(boolean trial) {
+      this.trial = trial;
+      return this;
+    }
+
+    /**
+     * Rebuild all changes in NoteDb from ReviewDb, even if Gerrit is currently configured to read
+     * from NoteDb.
+     *
+     * <p>Only supported if ReviewDb is still the source of truth for all changes.
+     *
+     * <p>By default, force rebuilding is off.
+     *
+     * @param forceRebuild whether to force rebuilding.
+     * @return this.
+     */
+    public Builder setForceRebuild(boolean forceRebuild) {
+      this.forceRebuild = forceRebuild;
+      return this;
+    }
+
+    /**
+     * Gap between ReviewDb change sequence numbers and NoteDb.
+     *
+     * <p>If NoteDb sequences are enabled in a running server, there is a race between the migration
+     * step that calls {@code nextChangeId()} to seed the ref, and other threads that call {@code
+     * nextChangeId()} to create new changes. In order to prevent these operations stepping on one
+     * another, we use this value to skip some predefined sequence numbers. This is strongly
+     * recommended in a running server.
+     *
+     * <p>If the migration takes place offline, there is no race with other threads, and this option
+     * may be set to 0. However, admins may still choose to use a gap, for example to make it easier
+     * to distinguish changes that were created before and after the NoteDb migration.
+     *
+     * <p>By default, uses the value from {@code noteDb.changes.initialSequenceGap} in {@code
+     * gerrit.config}, which defaults to 1000.
+     *
+     * @param sequenceGap sequence gap size; if negative, use the default.
+     * @return this.
+     */
+    public Builder setSequenceGap(int sequenceGap) {
+      this.sequenceGap = sequenceGap;
+      return this;
+    }
+
+    /**
+     * Enable auto-migration on subsequent daemon launches.
+     *
+     * <p>If true, prior to running any migration steps, sets the necessary configuration in {@code
+     * gerrit.config} to make {@code gerrit.war daemon} retry the migration on next startup, if it
+     * fails.
+     *
+     * @param autoMigrate whether to set auto-migration config.
+     * @return this.
+     */
+    public Builder setAutoMigrate(boolean autoMigrate) {
+      this.autoMigrate = autoMigrate;
+      return this;
+    }
+
+    public NoteDbMigrator build() throws MigrationException {
+      return new NoteDbMigrator(
+          sitePaths,
+          schemaFactory,
+          serverIdent,
+          allUsers,
+          repoManager,
+          updateManagerFactory,
+          bundleReader,
+          allProjects,
+          requestContext,
+          userFactory,
+          rebuilder,
+          globalNotesMigration,
+          primaryStorageMigrator,
+          listeners,
+          threads > 1
+              ? MoreExecutors.listeningDecorator(
+                  workQueue.createQueue(threads, "RebuildChange", true))
+              : MoreExecutors.newDirectExecutorService(),
+          projects,
+          skipProjects,
+          changes,
+          progressOut,
+          stopAtState,
+          trial,
+          forceRebuild,
+          sequenceGap >= 0 ? sequenceGap : Sequences.getChangeSequenceGap(cfg),
+          autoMigrate);
+    }
+  }
+
+  private final FileBasedConfig gerritConfig;
+  private final FileBasedConfig noteDbConfig;
+  private final SchemaFactory<ReviewDb> schemaFactory;
+  private final Provider<PersonIdent> serverIdent;
+  private final AllUsersName allUsers;
+  private final GitRepositoryManager repoManager;
+  private final NoteDbUpdateManager.Factory updateManagerFactory;
+  private final ChangeBundleReader bundleReader;
+  private final AllProjectsName allProjects;
+  private final ThreadLocalRequestContext requestContext;
+  private final InternalUser.Factory userFactory;
+  private final ChangeRebuilderImpl rebuilder;
+  private final MutableNotesMigration globalNotesMigration;
+  private final PrimaryStorageMigrator primaryStorageMigrator;
+  private final DynamicSet<NotesMigrationStateListener> listeners;
+
+  private final ListeningExecutorService executor;
+  private final ImmutableList<Project.NameKey> projects;
+  private final ImmutableList<Project.NameKey> skipProjects;
+  private final ImmutableList<Change.Id> changes;
+  private final OutputStream progressOut;
+  private final NotesMigrationState stopAtState;
+  private final boolean trial;
+  private final boolean forceRebuild;
+  private final int sequenceGap;
+  private final boolean autoMigrate;
+
+  private NoteDbMigrator(
+      SitePaths sitePaths,
+      SchemaFactory<ReviewDb> schemaFactory,
+      Provider<PersonIdent> serverIdent,
+      AllUsersName allUsers,
+      GitRepositoryManager repoManager,
+      NoteDbUpdateManager.Factory updateManagerFactory,
+      ChangeBundleReader bundleReader,
+      AllProjectsName allProjects,
+      ThreadLocalRequestContext requestContext,
+      InternalUser.Factory userFactory,
+      ChangeRebuilderImpl rebuilder,
+      MutableNotesMigration globalNotesMigration,
+      PrimaryStorageMigrator primaryStorageMigrator,
+      DynamicSet<NotesMigrationStateListener> listeners,
+      ListeningExecutorService executor,
+      ImmutableList<Project.NameKey> projects,
+      ImmutableList<Project.NameKey> skipProjects,
+      ImmutableList<Change.Id> changes,
+      OutputStream progressOut,
+      NotesMigrationState stopAtState,
+      boolean trial,
+      boolean forceRebuild,
+      int sequenceGap,
+      boolean autoMigrate)
+      throws MigrationException {
+    if (ImmutableList.of(!changes.isEmpty(), !projects.isEmpty(), !skipProjects.isEmpty()).stream()
+            .filter(e -> e)
+            .count()
+        > 1) {
+      throw new MigrationException("Cannot combine changes, projects and skipProjects");
+    }
+    if (sequenceGap < 0) {
+      throw new MigrationException("Sequence gap must be non-negative: " + sequenceGap);
+    }
+
+    this.schemaFactory = schemaFactory;
+    this.serverIdent = serverIdent;
+    this.allUsers = allUsers;
+    this.rebuilder = rebuilder;
+    this.repoManager = repoManager;
+    this.updateManagerFactory = updateManagerFactory;
+    this.bundleReader = bundleReader;
+    this.allProjects = allProjects;
+    this.requestContext = requestContext;
+    this.userFactory = userFactory;
+    this.globalNotesMigration = globalNotesMigration;
+    this.primaryStorageMigrator = primaryStorageMigrator;
+    this.listeners = listeners;
+    this.executor = executor;
+    this.projects = projects;
+    this.skipProjects = skipProjects;
+    this.changes = changes;
+    this.progressOut = progressOut;
+    this.stopAtState = stopAtState;
+    this.trial = trial;
+    this.forceRebuild = forceRebuild;
+    this.sequenceGap = sequenceGap;
+    this.autoMigrate = autoMigrate;
+
+    // Stack notedb.config over gerrit.config, in the same way as GerritServerConfigProvider.
+    this.gerritConfig = new FileBasedConfig(sitePaths.gerrit_config.toFile(), FS.detect());
+    this.noteDbConfig =
+        new FileBasedConfig(gerritConfig, sitePaths.notedb_config.toFile(), FS.detect());
+  }
+
+  @Override
+  public void close() {
+    executor.shutdownNow();
+  }
+
+  public void migrate() throws OrmException, IOException {
+    if (!changes.isEmpty() || !projects.isEmpty() || !skipProjects.isEmpty()) {
+      throw new MigrationException(
+          "Cannot set changes or projects or skipProjects during full migration; call rebuild() instead");
+    }
+    Optional<NotesMigrationState> maybeState = loadState();
+    if (!maybeState.isPresent()) {
+      throw new MigrationException("Could not determine initial migration state");
+    }
+
+    NotesMigrationState state = maybeState.get();
+    if (trial && state.compareTo(READ_WRITE_NO_SEQUENCE) > 0) {
+      throw new MigrationException(
+          "Migration has already progressed past the endpoint of the \"trial mode\" state;"
+              + " NoteDb is already the primary storage for some changes");
+    }
+    if (forceRebuild && state.compareTo(READ_WRITE_WITH_SEQUENCE_REVIEW_DB_PRIMARY) > 0) {
+      throw new MigrationException(
+          "Cannot force rebuild changes; NoteDb is already the primary storage for some changes");
+    }
+    setControlFlags();
+
+    boolean rebuilt = false;
+    while (state.compareTo(NOTE_DB) < 0) {
+      if (state.equals(stopAtState)) {
+        return;
+      }
+      boolean stillNeedsRebuild = forceRebuild && !rebuilt;
+      if (trial && state.compareTo(READ_WRITE_NO_SEQUENCE) >= 0) {
+        if (stillNeedsRebuild && state == READ_WRITE_NO_SEQUENCE) {
+          // We're at the end state of trial mode, but still need a rebuild due to forceRebuild. Let
+          // the loop go one more time.
+        } else {
+          return;
+        }
+      }
+      switch (state) {
+        case REVIEW_DB:
+          state = turnOnWrites(state);
+          break;
+        case WRITE:
+          state = rebuildAndEnableReads(state);
+          rebuilt = true;
+          break;
+        case READ_WRITE_NO_SEQUENCE:
+          if (stillNeedsRebuild) {
+            state = rebuildAndEnableReads(state);
+            rebuilt = true;
+          } else {
+            state = enableSequences(state);
+          }
+          break;
+        case READ_WRITE_WITH_SEQUENCE_REVIEW_DB_PRIMARY:
+          if (stillNeedsRebuild) {
+            state = rebuildAndEnableReads(state);
+            rebuilt = true;
+          } else {
+            state = setNoteDbPrimary(state);
+          }
+          break;
+        case READ_WRITE_WITH_SEQUENCE_NOTE_DB_PRIMARY:
+          // The only way we can get here is if there was a failure on a previous run of
+          // setNoteDbPrimary, since that method moves to NOTE_DB if it completes
+          // successfully. Assume that not all changes were converted and re-run the step.
+          // migrateToNoteDbPrimary is a relatively fast no-op for already-migrated changes, so this
+          // isn't actually repeating work.
+          state = setNoteDbPrimary(state);
+          break;
+        case NOTE_DB:
+          // Done!
+          break;
+        default:
+          throw new MigrationException(
+              "Migration out of the following state is not supported:\n" + state.toText());
+      }
+    }
+  }
+
+  private NotesMigrationState turnOnWrites(NotesMigrationState prev) throws IOException {
+    return saveState(prev, WRITE);
+  }
+
+  private NotesMigrationState rebuildAndEnableReads(NotesMigrationState prev)
+      throws OrmException, IOException {
+    rebuild();
+    return saveState(prev, READ_WRITE_NO_SEQUENCE);
+  }
+
+  private NotesMigrationState enableSequences(NotesMigrationState prev)
+      throws OrmException, IOException {
+    try (ReviewDb db = schemaFactory.open()) {
+      @SuppressWarnings("deprecation")
+      final int nextChangeId = db.nextChangeId();
+
+      RepoSequence seq =
+          new RepoSequence(
+              repoManager,
+              GitReferenceUpdated.DISABLED,
+              allProjects,
+              Sequences.NAME_CHANGES,
+              // If sequenceGap is 0, this writes into the sequence ref the same ID that is returned
+              // by the call to seq.next() below. If we actually used this as a change ID, that
+              // would be a problem, but we just discard it, so this is safe.
+              () -> nextChangeId + sequenceGap - 1,
+              1,
+              nextChangeId);
+      seq.next();
+    }
+    return saveState(prev, READ_WRITE_WITH_SEQUENCE_REVIEW_DB_PRIMARY);
+  }
+
+  private NotesMigrationState setNoteDbPrimary(NotesMigrationState prev)
+      throws MigrationException, OrmException, IOException {
+    checkState(
+        projects.isEmpty() && changes.isEmpty() && skipProjects.isEmpty(),
+        "Should not have attempted setNoteDbPrimary with a subset of changes");
+    checkState(
+        prev == READ_WRITE_WITH_SEQUENCE_REVIEW_DB_PRIMARY
+            || prev == READ_WRITE_WITH_SEQUENCE_NOTE_DB_PRIMARY,
+        "Unexpected start state for setNoteDbPrimary: %s",
+        prev);
+
+    // Before changing the primary storage of old changes, ensure new changes are created with
+    // NoteDb primary.
+    prev = saveState(prev, READ_WRITE_WITH_SEQUENCE_NOTE_DB_PRIMARY);
+
+    Stopwatch sw = Stopwatch.createStarted();
+    logger.atInfo().log("Setting primary storage to NoteDb");
+    List<Change.Id> allChanges;
+    try (ReviewDb db = unwrapDb(schemaFactory.open())) {
+      allChanges = Streams.stream(db.changes().all()).map(Change::getId).collect(toList());
+    }
+
+    try (ContextHelper contextHelper = new ContextHelper()) {
+      List<ListenableFuture<Boolean>> futures =
+          allChanges.stream()
+              .map(
+                  id ->
+                      executor.submit(
+                          () -> {
+                            try (ManualRequestContext ctx = contextHelper.open()) {
+                              try {
+                                primaryStorageMigrator.migrateToNoteDbPrimary(id);
+                              } catch (NoNoteDbStateException e) {
+                                if (canSkipPrimaryStorageMigration(
+                                    ctx.getReviewDbProvider().get(), id)) {
+                                  logger.atWarning().withCause(e).log(
+                                      "Change %s previously failed to rebuild;"
+                                          + " skipping primary storage migration",
+                                      id);
+                                } else {
+                                  throw e;
+                                }
+                              }
+                              return true;
+                            } catch (Exception e) {
+                              logger.atSevere().withCause(e).log(
+                                  "Error migrating primary storage for %s", id);
+                              return false;
+                            }
+                          }))
+              .collect(toList());
+
+      boolean ok = futuresToBoolean(futures, "Error migrating primary storage");
+      double t = sw.elapsed(TimeUnit.MILLISECONDS) / 1000d;
+      logger.atInfo().log(
+          "Migrated primary storage of %d changes in %.01fs (%.01f/s)\n",
+          allChanges.size(), t, allChanges.size() / t);
+      if (!ok) {
+        throw new MigrationException("Migrating primary storage for some changes failed, see log");
+      }
+    }
+
+    return disableReviewDb(prev);
+  }
+
+  /**
+   * Checks whether a change is so corrupt that it can be completely skipped by the primary storage
+   * migration step.
+   *
+   * <p>To get to the point where this method is called from {@link #setNoteDbPrimary}, it means we
+   * attempted to rebuild it, and encountered an error that was then caught in {@link
+   * #rebuildProject} and skipped. As a result, there is no {@code noteDbState} field in the change
+   * by the time we get to {@link #setNoteDbPrimary}, so {@code migrateToNoteDbPrimary} throws an
+   * exception.
+   *
+   * <p>We have to do this hacky double-checking because we don't have a way for the rebuilding
+   * phase to communicate to the primary storage migration phase that the change is skippable. It
+   * would be possible to store this info in some field in this class, but there is no guarantee
+   * that the rebuild and primary storage migration phases are run in the same JVM invocation.
+   *
+   * <p>In an ideal world, we could do this through the {@link
+   * com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage} enum, having a separate value
+   * for errors. However, that would be an invasive change touching many non-migration-related parts
+   * of the NoteDb migration code, which is too risky to attempt in the stable branch where this bug
+   * had to be fixed.
+   *
+   * <p>As of this writing, the only case where this happens is when a change has no patch sets.
+   */
+  private static boolean canSkipPrimaryStorageMigration(ReviewDb db, Change.Id id) {
+    try {
+      return Iterables.isEmpty(unwrapDb(db).patchSets().byChange(id));
+    } catch (Exception e) {
+      logger.atSevere().withCause(e).log(
+          "Error checking if change %s can be skipped, assuming no", id);
+      return false;
+    }
+  }
+
+  private NotesMigrationState disableReviewDb(NotesMigrationState prev) throws IOException {
+    return saveState(prev, NOTE_DB, c -> setAutoMigrate(c, false));
+  }
+
+  private Optional<NotesMigrationState> loadState() throws IOException {
+    try {
+      gerritConfig.load();
+      noteDbConfig.load();
+      return NotesMigrationState.forConfig(noteDbConfig);
+    } catch (ConfigInvalidException | IllegalArgumentException e) {
+      logger.atWarning().withCause(e).log(
+          "error reading NoteDb migration options from %s", noteDbConfig.getFile());
+      return Optional.empty();
+    }
+  }
+
+  private NotesMigrationState saveState(
+      NotesMigrationState expectedOldState, NotesMigrationState newState) throws IOException {
+    return saveState(expectedOldState, newState, c -> {});
+  }
+
+  private NotesMigrationState saveState(
+      NotesMigrationState expectedOldState,
+      NotesMigrationState newState,
+      Consumer<Config> additionalUpdates)
+      throws IOException {
+    synchronized (globalNotesMigration) {
+      // This read-modify-write is racy. We're counting on the fact that no other Gerrit operation
+      // modifies gerrit.config, and hoping that admins don't either.
+      Optional<NotesMigrationState> actualOldState = loadState();
+      if (!actualOldState.equals(Optional.of(expectedOldState))) {
+        throw new MigrationException(
+            "Cannot move to new state:\n"
+                + newState.toText()
+                + "\n\n"
+                + "Expected this state in gerrit.config:\n"
+                + expectedOldState.toText()
+                + "\n\n"
+                + (actualOldState.isPresent()
+                    ? "But found this state:\n" + actualOldState.get().toText()
+                    : "But could not parse the current state"));
+      }
+
+      preStateChange(expectedOldState, newState);
+
+      newState.setConfigValues(noteDbConfig);
+      additionalUpdates.accept(noteDbConfig);
+      noteDbConfig.save();
+
+      // Only set in-memory state once it's been persisted to storage.
+      globalNotesMigration.setFrom(newState);
+      logger.atInfo().log("Migration state: %s => %s", expectedOldState, newState);
+
+      return newState;
+    }
+  }
+
+  private void preStateChange(NotesMigrationState oldState, NotesMigrationState newState)
+      throws IOException {
+    for (NotesMigrationStateListener listener : listeners) {
+      listener.preStateChange(oldState, newState);
+    }
+  }
+
+  private void setControlFlags() throws MigrationException {
+    synchronized (globalNotesMigration) {
+      try {
+        noteDbConfig.load();
+        setAutoMigrate(noteDbConfig, autoMigrate);
+        setTrialMode(noteDbConfig, trial);
+        noteDbConfig.save();
+      } catch (ConfigInvalidException | IOException e) {
+        throw new MigrationException("Error saving auto-migration config", e);
+      }
+    }
+  }
+
+  public void rebuild() throws MigrationException, OrmException {
+    if (!globalNotesMigration.commitChangeWrites()) {
+      throw new MigrationException("Cannot rebuild without noteDb.changes.write=true");
+    }
+    Stopwatch sw = Stopwatch.createStarted();
+    logger.atInfo().log("Rebuilding changes in NoteDb");
+
+    ImmutableListMultimap<Project.NameKey, Change.Id> changesByProject = getChangesByProject();
+    List<ListenableFuture<Boolean>> futures = new ArrayList<>();
+    try (ContextHelper contextHelper = new ContextHelper()) {
+      List<Project.NameKey> projectNames =
+          Ordering.usingToString().sortedCopy(changesByProject.keySet());
+      for (Project.NameKey project : projectNames) {
+        ListenableFuture<Boolean> future =
+            executor.submit(
+                () -> {
+                  try {
+                    return rebuildProject(contextHelper.getReviewDb(), changesByProject, project);
+                  } catch (Exception e) {
+                    logger.atSevere().withCause(e).log("Error rebuilding project %s", project);
+                    return false;
+                  }
+                });
+        futures.add(future);
+      }
+
+      boolean ok = futuresToBoolean(futures, "Error rebuilding projects");
+      double t = sw.elapsed(TimeUnit.MILLISECONDS) / 1000d;
+      logger.atInfo().log(
+          "Rebuilt %d changes in %.01fs (%.01f/s)\n",
+          changesByProject.size(), t, changesByProject.size() / t);
+      if (!ok) {
+        throw new MigrationException("Rebuilding some changes failed, see log");
+      }
+    }
+  }
+
+  private ImmutableListMultimap<Project.NameKey, Change.Id> getChangesByProject()
+      throws OrmException {
+    // Memoize all changes so we can close the db connection and allow other threads to use the full
+    // connection pool.
+    SetMultimap<Project.NameKey, Change.Id> out =
+        MultimapBuilder.treeKeys(comparing(Project.NameKey::get))
+            .treeSetValues(comparing(Change.Id::get))
+            .build();
+    try (ReviewDb db = unwrapDb(schemaFactory.open())) {
+      if (!projects.isEmpty()) {
+        return byProject(db.changes().all(), c -> projects.contains(c.getProject()), out);
+      }
+      if (!skipProjects.isEmpty()) {
+        return byProject(db.changes().all(), c -> !skipProjects.contains(c.getProject()), out);
+      }
+      if (!changes.isEmpty()) {
+        return byProject(db.changes().get(changes), c -> true, out);
+      }
+      return byProject(db.changes().all(), c -> true, out);
+    }
+  }
+
+  private static ImmutableListMultimap<Project.NameKey, Change.Id> byProject(
+      Iterable<Change> changes,
+      Predicate<Change> pred,
+      SetMultimap<Project.NameKey, Change.Id> out) {
+    Streams.stream(changes).filter(pred).forEach(c -> out.put(c.getProject(), c.getId()));
+    return ImmutableListMultimap.copyOf(out);
+  }
+
+  private static ObjectInserter newPackInserter(Repository repo) {
+    if (!(repo instanceof FileRepository)) {
+      return repo.newObjectInserter();
+    }
+    PackInserter ins = ((FileRepository) repo).getObjectDatabase().newPackInserter();
+    ins.checkExisting(false);
+    return ins;
+  }
+
+  private boolean rebuildProject(
+      ReviewDb db,
+      ImmutableListMultimap<Project.NameKey, Change.Id> allChanges,
+      Project.NameKey project) {
+    checkArgument(allChanges.containsKey(project));
+    boolean ok = true;
+    ProgressMonitor pm =
+        new TextProgressMonitor(
+            new PrintWriter(new BufferedWriter(new OutputStreamWriter(progressOut, UTF_8))));
+    try (Repository changeRepo = repoManager.openRepository(project);
+        // Only use a PackInserter for the change repo, not All-Users.
+        //
+        // It's not possible to share a single inserter for All-Users across all project tasks, and
+        // we don't want to add one pack per project to All-Users. Adding many loose objects is
+        // preferable to many packs.
+        //
+        // Anyway, the number of objects inserted into All-Users is proportional to the number
+        // of pending draft comments, which should not be high (relative to the total number of
+        // changes), so the number of loose objects shouldn't be too unreasonable.
+        ObjectInserter changeIns = newPackInserter(changeRepo);
+        ObjectReader changeReader = changeIns.newReader();
+        RevWalk changeRw = new RevWalk(changeReader);
+        Repository allUsersRepo = repoManager.openRepository(allUsers);
+        ObjectInserter allUsersIns = allUsersRepo.newObjectInserter();
+        ObjectReader allUsersReader = allUsersIns.newReader();
+        RevWalk allUsersRw = new RevWalk(allUsersReader)) {
+      ChainedReceiveCommands changeCmds = new ChainedReceiveCommands(changeRepo);
+      ChainedReceiveCommands allUsersCmds = new ChainedReceiveCommands(allUsersRepo);
+
+      Collection<Change.Id> changes = allChanges.get(project);
+      pm.beginTask(FormatUtil.elide("Rebuilding " + project.get(), 50), changes.size());
+      int toSave = 0;
+      try {
+        for (Change.Id changeId : changes) {
+          // NoteDbUpdateManager assumes that all commands in its OpenRepo were added by itself, so
+          // we can't share the top-level ChainedReceiveCommands. Use a new set of commands sharing
+          // the same underlying repo, and copy commands back to the top-level
+          // ChainedReceiveCommands later. This also assumes that each ref in the final list of
+          // commands was only modified by a single NoteDbUpdateManager; since we use one manager
+          // per change, and each ref corresponds to exactly one change, this assumption should be
+          // safe.
+          ChainedReceiveCommands tmpChangeCmds =
+              new ChainedReceiveCommands(changeCmds.getRepoRefCache());
+          ChainedReceiveCommands tmpAllUsersCmds =
+              new ChainedReceiveCommands(allUsersCmds.getRepoRefCache());
+
+          try (NoteDbUpdateManager manager =
+              updateManagerFactory
+                  .create(project)
+                  .setAtomicRefUpdates(false)
+                  .setSaveObjects(false)
+                  .setChangeRepo(changeRepo, changeRw, changeIns, tmpChangeCmds)
+                  .setAllUsersRepo(allUsersRepo, allUsersRw, allUsersIns, tmpAllUsersCmds)) {
+            rebuild(db, changeId, manager);
+
+            // Executing with dryRun=true writes all objects to the underlying inserters and adds
+            // commands to the ChainedReceiveCommands. Afterwards, we can discard the manager, so we
+            // don't keep using any memory beyond what may be buffered in the PackInserter.
+            manager.execute(true);
+
+            tmpChangeCmds.getCommands().values().forEach(c -> addCommand(changeCmds, c));
+            tmpAllUsersCmds.getCommands().values().forEach(c -> addCommand(allUsersCmds, c));
+
+            toSave++;
+          } catch (NoPatchSetsException e) {
+            logger.atWarning().log(e.getMessage());
+          } catch (ConflictingUpdateException ex) {
+            logger.atWarning().log(
+                "Rebuilding detected a conflicting ReviewDb update for change %s;"
+                    + " will be auto-rebuilt at runtime",
+                changeId);
+          } catch (Throwable t) {
+            logger.atSevere().withCause(t).log("Failed to rebuild change %s", changeId);
+            ok = false;
+          }
+          pm.update(1);
+        }
+      } finally {
+        pm.endTask();
+      }
+
+      pm.beginTask(FormatUtil.elide("Saving " + project.get(), 50), ProgressMonitor.UNKNOWN);
+      try {
+        save(changeRepo, changeRw, changeIns, changeCmds);
+        save(allUsersRepo, allUsersRw, allUsersIns, allUsersCmds);
+        // This isn't really useful progress. If we passed a real ProgressMonitor to
+        // BatchRefUpdate#execute we might get something more incremental, but that doesn't allow us
+        // to specify the repo name in the task text.
+        pm.update(toSave);
+      } catch (LockFailureException e) {
+        logger.atWarning().log(
+            "Rebuilding detected a conflicting NoteDb update for the following refs, which will"
+                + " be auto-rebuilt at runtime: %s",
+            e.getFailedRefs().stream().distinct().sorted().collect(joining(", ")));
+      } catch (IOException e) {
+        logger.atSevere().withCause(e).log("Failed to save NoteDb state for %s", project);
+      } finally {
+        pm.endTask();
+      }
+    } catch (RepositoryNotFoundException e) {
+      logger.atWarning().log("Repository %s not found", project);
+    } catch (IOException e) {
+      logger.atSevere().withCause(e).log("Failed to rebuild project %s", project);
+    }
+    return ok;
+  }
+
+  private void rebuild(ReviewDb db, Change.Id changeId, NoteDbUpdateManager manager)
+      throws OrmException, IOException {
+    // Match ChangeRebuilderImpl#stage, but without calling manager.stage(), since that can only be
+    // called after building updates for all changes.
+    Change change =
+        ChangeRebuilderImpl.checkNoteDbState(ChangeNotes.readOneReviewDbChange(db, changeId));
+    if (change == null) {
+      // Could log here instead, but this matches the behavior of ChangeRebuilderImpl#stage.
+      throw new NoSuchChangeException(changeId);
+    }
+    rebuilder.buildUpdates(manager, bundleReader.fromReviewDb(db, changeId));
+
+    rebuilder.execute(db, changeId, manager, true, false);
+  }
+
+  private static void addCommand(ChainedReceiveCommands cmds, ReceiveCommand cmd) {
+    // ChainedReceiveCommands doesn't allow no-ops, but these occur when rebuilding a
+    // previously-rebuilt change.
+    if (!cmd.getOldId().equals(cmd.getNewId())) {
+      cmds.add(cmd);
+    }
+  }
+
+  private void save(Repository repo, RevWalk rw, ObjectInserter ins, ChainedReceiveCommands cmds)
+      throws IOException {
+    if (cmds.isEmpty()) {
+      return;
+    }
+    ins.flush();
+    BatchRefUpdate bru = repo.getRefDatabase().newBatchUpdate();
+    bru.setRefLogMessage("Migrate changes to NoteDb", false);
+    bru.setRefLogIdent(serverIdent.get());
+    bru.setAtomic(false);
+    bru.setAllowNonFastForwards(true);
+    cmds.addTo(bru);
+    RefUpdateUtil.executeChecked(bru, rw);
+  }
+
+  private static boolean futuresToBoolean(List<ListenableFuture<Boolean>> futures, String errMsg) {
+    try {
+      return Futures.allAsList(futures).get().stream().allMatch(b -> b);
+    } catch (InterruptedException | ExecutionException e) {
+      logger.atSevere().withCause(e).log(errMsg);
+      return false;
+    }
+  }
+
+  private class ContextHelper implements AutoCloseable {
+    private final Thread callingThread;
+    private ReviewDb db;
+    private Runnable closeDb;
+
+    ContextHelper() {
+      callingThread = Thread.currentThread();
+    }
+
+    ManualRequestContext open() throws OrmException {
+      return new ManualRequestContext(
+          userFactory.create(),
+          // Reuse the same lazily-opened ReviewDb on the original calling thread, otherwise open
+          // SchemaFactory in the normal way.
+          Thread.currentThread().equals(callingThread) ? this::getReviewDb : schemaFactory,
+          requestContext);
+    }
+
+    synchronized ReviewDb getReviewDb() throws OrmException {
+      if (db == null) {
+        ReviewDb actual = schemaFactory.open();
+        closeDb = actual::close;
+        db =
+            new ReviewDbWrapper(unwrapDb(actual)) {
+              @Override
+              public void close() {
+                // Closed by ContextHelper#close.
+              }
+            };
+      }
+      return db;
+    }
+
+    @Override
+    public synchronized void close() {
+      if (db != null) {
+        closeDb.run();
+        db = null;
+        closeDb = null;
+      }
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/NotesMigrationStateListener.java b/java/com/google/gerrit/server/notedb/rebuild/NotesMigrationStateListener.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/NotesMigrationStateListener.java
rename to java/com/google/gerrit/server/notedb/rebuild/NotesMigrationStateListener.java
diff --git a/java/com/google/gerrit/server/notedb/rebuild/OnlineNoteDbMigrator.java b/java/com/google/gerrit/server/notedb/rebuild/OnlineNoteDbMigrator.java
new file mode 100644
index 0000000..b5a8236
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/rebuild/OnlineNoteDbMigrator.java
@@ -0,0 +1,108 @@
+// Copyright (C) 2017 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.google.gerrit.server.notedb.rebuild;
+
+import com.google.common.base.Stopwatch;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.lifecycle.LifecycleModule;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.index.OnlineUpgrader;
+import com.google.gerrit.server.index.VersionManager;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import com.google.inject.name.Named;
+import com.google.inject.name.Names;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.lib.Config;
+
+@Singleton
+public class OnlineNoteDbMigrator implements LifecycleListener {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final String TRIAL = "OnlineNoteDbMigrator/trial";
+
+  public static class Module extends LifecycleModule {
+    private final boolean trial;
+
+    public Module(boolean trial) {
+      this.trial = trial;
+    }
+
+    @Override
+    public void configure() {
+      listener().to(OnlineNoteDbMigrator.class);
+      bindConstant().annotatedWith(Names.named(TRIAL)).to(trial);
+    }
+  }
+
+  private final GcAllUsers gcAllUsers;
+  private final OnlineUpgrader indexUpgrader;
+  private final Provider<NoteDbMigrator.Builder> migratorBuilderProvider;
+  private final boolean upgradeIndex;
+  private final boolean trial;
+
+  @Inject
+  OnlineNoteDbMigrator(
+      @GerritServerConfig Config cfg,
+      GcAllUsers gcAllUsers,
+      OnlineUpgrader indexUpgrader,
+      Provider<NoteDbMigrator.Builder> migratorBuilderProvider,
+      @Named(TRIAL) boolean trial) {
+    this.gcAllUsers = gcAllUsers;
+    this.indexUpgrader = indexUpgrader;
+    this.migratorBuilderProvider = migratorBuilderProvider;
+    this.upgradeIndex = VersionManager.getOnlineUpgrade(cfg);
+    this.trial = trial || NoteDbMigrator.getTrialMode(cfg);
+  }
+
+  @Override
+  public void start() {
+    Thread t = new Thread(this::migrate);
+    t.setDaemon(true);
+    t.setName(getClass().getSimpleName());
+    t.start();
+  }
+
+  private void migrate() {
+    logger.atInfo().log("Starting online NoteDb migration");
+    if (upgradeIndex) {
+      logger.atInfo().log(
+          "Online index schema upgrades will be deferred until NoteDb migration is complete");
+    }
+    Stopwatch sw = Stopwatch.createStarted();
+    // TODO(dborowitz): Tune threads, maybe expose a progress monitor somewhere.
+    try (NoteDbMigrator migrator =
+        migratorBuilderProvider.get().setAutoMigrate(true).setTrialMode(trial).build()) {
+      migrator.migrate();
+    } catch (Exception e) {
+      logger.atSevere().withCause(e).log("Error in online NoteDb migration");
+    }
+    gcAllUsers.runWithLogger();
+    logger.atInfo().log("Online NoteDb migration completed in %ss", sw.elapsed(TimeUnit.SECONDS));
+
+    if (upgradeIndex) {
+      logger.atInfo().log("Starting deferred index schema upgrades");
+      indexUpgrader.start();
+    }
+  }
+
+  @Override
+  public void stop() {
+    // Do nothing; upgrade process uses daemon threads and knows how to recover from failures on
+    // next attempt.
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/PatchSetEvent.java b/java/com/google/gerrit/server/notedb/rebuild/PatchSetEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/PatchSetEvent.java
rename to java/com/google/gerrit/server/notedb/rebuild/PatchSetEvent.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ReviewerEvent.java b/java/com/google/gerrit/server/notedb/rebuild/ReviewerEvent.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ReviewerEvent.java
rename to java/com/google/gerrit/server/notedb/rebuild/ReviewerEvent.java
diff --git a/java/com/google/gerrit/server/patch/AutoMerger.java b/java/com/google/gerrit/server/patch/AutoMerger.java
new file mode 100644
index 0000000..285c37d
--- /dev/null
+++ b/java/com/google/gerrit/server/patch/AutoMerger.java
@@ -0,0 +1,198 @@
+// 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.
+
+package com.google.gerrit.server.patch;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.UsedAt;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.git.InMemoryInserter;
+import com.google.gerrit.server.git.MergeUtil;
+import com.google.inject.Inject;
+import java.io.IOException;
+import org.eclipse.jgit.dircache.DirCache;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.merge.ResolveMerger;
+import org.eclipse.jgit.merge.ThreeWayMergeStrategy;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevObject;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+public class AutoMerger {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  @UsedAt(UsedAt.Project.GOOGLE)
+  public static boolean cacheAutomerge(Config cfg) {
+    return cfg.getBoolean("change", null, "cacheAutomerge", true);
+  }
+
+  private final PersonIdent gerritIdent;
+  private final boolean save;
+
+  @Inject
+  AutoMerger(@GerritServerConfig Config cfg, @GerritPersonIdent PersonIdent gerritIdent) {
+    save = cacheAutomerge(cfg);
+    this.gerritIdent = gerritIdent;
+  }
+
+  /**
+   * Perform an auto-merge of the parents of the given merge commit.
+   *
+   * @return auto-merge commit or {@code null} if an auto-merge commit couldn't be created. Headers
+   *     of the returned RevCommit are parsed.
+   */
+  public RevCommit merge(
+      Repository repo,
+      RevWalk rw,
+      ObjectInserter ins,
+      RevCommit merge,
+      ThreeWayMergeStrategy mergeStrategy)
+      throws IOException {
+    checkArgument(rw.getObjectReader().getCreatedFromInserter() == ins);
+    InMemoryInserter tmpIns = null;
+    if (ins instanceof InMemoryInserter) {
+      // Caller gave us an in-memory inserter, so ensure anything we write from
+      // this method is visible to them.
+      tmpIns = (InMemoryInserter) ins;
+    } else if (!save) {
+      // If we don't plan on saving results, use a fully in-memory inserter.
+      // Using just a non-flushing wrapper is not sufficient, since in
+      // particular DfsInserter might try to write to storage after exceeding an
+      // internal buffer size.
+      tmpIns = new InMemoryInserter(rw.getObjectReader());
+    }
+
+    rw.parseHeaders(merge);
+    String refName = RefNames.refsCacheAutomerge(merge.name());
+    Ref ref = repo.getRefDatabase().exactRef(refName);
+    if (ref != null && ref.getObjectId() != null) {
+      RevObject obj = rw.parseAny(ref.getObjectId());
+      if (obj instanceof RevCommit) {
+        return (RevCommit) obj;
+      }
+      return commit(repo, rw, tmpIns, ins, refName, obj, merge);
+    }
+
+    ResolveMerger m = (ResolveMerger) mergeStrategy.newMerger(repo, true);
+    DirCache dc = DirCache.newInCore();
+    m.setDirCache(dc);
+    m.setObjectInserter(tmpIns == null ? new NonFlushingWrapper(ins) : tmpIns);
+
+    boolean couldMerge;
+    try {
+      couldMerge = m.merge(merge.getParents());
+    } catch (IOException | RuntimeException e) {
+      // It is not safe to continue further down in this method as throwing
+      // an exception most likely means that the merge tree was not created
+      // and m.getMergeResults() is empty. This would mean that all paths are
+      // unmerged and Gerrit UI would show all paths in the patch list.
+      logger.atWarning().withCause(e).log("Error attempting automerge %s", refName);
+      return null;
+    }
+
+    ObjectId treeId;
+    if (couldMerge) {
+      treeId = m.getResultTreeId();
+    } else {
+      treeId =
+          MergeUtil.mergeWithConflicts(
+              rw,
+              ins,
+              dc,
+              "HEAD",
+              merge.getParent(0),
+              "BRANCH",
+              merge.getParent(1),
+              m.getMergeResults());
+    }
+
+    return commit(repo, rw, tmpIns, ins, refName, treeId, merge);
+  }
+
+  private RevCommit commit(
+      Repository repo,
+      RevWalk rw,
+      @Nullable InMemoryInserter tmpIns,
+      ObjectInserter ins,
+      String refName,
+      ObjectId tree,
+      RevCommit merge)
+      throws IOException {
+    rw.parseHeaders(merge);
+    // For maximum stability, choose a single ident using the committer time of
+    // the input commit, using the server name and timezone.
+    PersonIdent ident =
+        new PersonIdent(
+            gerritIdent, merge.getCommitterIdent().getWhen(), gerritIdent.getTimeZone());
+    CommitBuilder cb = new CommitBuilder();
+    cb.setAuthor(ident);
+    cb.setCommitter(ident);
+    cb.setTreeId(tree);
+    cb.setMessage("Auto-merge of " + merge.name() + '\n');
+    for (RevCommit p : merge.getParents()) {
+      cb.addParentId(p);
+    }
+
+    if (!save) {
+      checkArgument(tmpIns != null);
+      try (ObjectReader tmpReader = tmpIns.newReader();
+          RevWalk tmpRw = new RevWalk(tmpReader)) {
+        return tmpRw.parseCommit(tmpIns.insert(cb));
+      }
+    }
+
+    checkArgument(tmpIns == null);
+    checkArgument(!(ins instanceof InMemoryInserter));
+    ObjectId commitId = ins.insert(cb);
+    ins.flush();
+
+    RefUpdate ru = repo.updateRef(refName);
+    ru.setNewObjectId(commitId);
+    ru.disableRefLog();
+    ru.forceUpdate();
+    return rw.parseCommit(commitId);
+  }
+
+  private static class NonFlushingWrapper extends ObjectInserter.Filter {
+    private final ObjectInserter ins;
+
+    private NonFlushingWrapper(ObjectInserter ins) {
+      this.ins = ins;
+    }
+
+    @Override
+    protected ObjectInserter delegate() {
+      return ins;
+    }
+
+    @Override
+    public void flush() {}
+
+    @Override
+    public void close() {}
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/CharText.java b/java/com/google/gerrit/server/patch/CharText.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/patch/CharText.java
rename to java/com/google/gerrit/server/patch/CharText.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/CharTextComparator.java b/java/com/google/gerrit/server/patch/CharTextComparator.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/patch/CharTextComparator.java
rename to java/com/google/gerrit/server/patch/CharTextComparator.java
diff --git a/java/com/google/gerrit/server/patch/ComparisonType.java b/java/com/google/gerrit/server/patch/ComparisonType.java
new file mode 100644
index 0000000..260c507
--- /dev/null
+++ b/java/com/google/gerrit/server/patch/ComparisonType.java
@@ -0,0 +1,77 @@
+// 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.
+
+package com.google.gerrit.server.patch;
+
+import static com.google.gerrit.server.ioutil.BasicSerialization.readVarInt32;
+import static com.google.gerrit.server.ioutil.BasicSerialization.writeVarInt32;
+import static java.util.Objects.requireNonNull;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+public class ComparisonType {
+
+  /** 1-based parent */
+  private final Integer parentNum;
+
+  private final boolean autoMerge;
+
+  public static ComparisonType againstOtherPatchSet() {
+    return new ComparisonType(null, false);
+  }
+
+  public static ComparisonType againstParent(int parentNum) {
+    return new ComparisonType(parentNum, false);
+  }
+
+  public static ComparisonType againstAutoMerge() {
+    return new ComparisonType(null, true);
+  }
+
+  private ComparisonType(Integer parentNum, boolean autoMerge) {
+    this.parentNum = parentNum;
+    this.autoMerge = autoMerge;
+  }
+
+  public boolean isAgainstParentOrAutoMerge() {
+    return isAgainstParent() || isAgainstAutoMerge();
+  }
+
+  public boolean isAgainstParent() {
+    return parentNum != null;
+  }
+
+  public boolean isAgainstAutoMerge() {
+    return autoMerge;
+  }
+
+  public int getParentNum() {
+    requireNonNull(parentNum);
+    return parentNum;
+  }
+
+  void writeTo(OutputStream out) throws IOException {
+    writeVarInt32(out, parentNum != null ? parentNum : 0);
+    writeVarInt32(out, autoMerge ? 1 : 0);
+  }
+
+  static ComparisonType readFrom(InputStream in) throws IOException {
+    int p = readVarInt32(in);
+    Integer parentNum = p > 0 ? p : null;
+    boolean autoMerge = readVarInt32(in) != 0;
+    return new ComparisonType(parentNum, autoMerge);
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffExecutor.java b/java/com/google/gerrit/server/patch/DiffExecutor.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffExecutor.java
rename to java/com/google/gerrit/server/patch/DiffExecutor.java
diff --git a/java/com/google/gerrit/server/patch/DiffExecutorModule.java b/java/com/google/gerrit/server/patch/DiffExecutorModule.java
new file mode 100644
index 0000000..eb6a280
--- /dev/null
+++ b/java/com/google/gerrit/server/patch/DiffExecutorModule.java
@@ -0,0 +1,39 @@
+// Copyright (C) 2015 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.google.gerrit.server.patch;
+
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
+import com.google.gerrit.server.logging.LoggingContextAwareExecutorService;
+import com.google.inject.AbstractModule;
+import com.google.inject.Provides;
+import com.google.inject.Singleton;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/** Module providing the {@link DiffExecutor}. */
+public class DiffExecutorModule extends AbstractModule {
+
+  @Override
+  protected void configure() {}
+
+  @Provides
+  @Singleton
+  @DiffExecutor
+  public ExecutorService createDiffExecutor() {
+    return new LoggingContextAwareExecutorService(
+        Executors.newCachedThreadPool(
+            new ThreadFactoryBuilder().setNameFormat("Diff-%d").setDaemon(true).build()));
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffSummary.java b/java/com/google/gerrit/server/patch/DiffSummary.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffSummary.java
rename to java/com/google/gerrit/server/patch/DiffSummary.java
diff --git a/java/com/google/gerrit/server/patch/DiffSummaryKey.java b/java/com/google/gerrit/server/patch/DiffSummaryKey.java
new file mode 100644
index 0000000..1f4fa07
--- /dev/null
+++ b/java/com/google/gerrit/server/patch/DiffSummaryKey.java
@@ -0,0 +1,114 @@
+// 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.
+
+package com.google.gerrit.server.patch;
+
+import static org.eclipse.jgit.lib.ObjectIdSerializer.read;
+import static org.eclipse.jgit.lib.ObjectIdSerializer.readWithoutMarker;
+import static org.eclipse.jgit.lib.ObjectIdSerializer.write;
+import static org.eclipse.jgit.lib.ObjectIdSerializer.writeWithoutMarker;
+
+import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.Objects;
+import org.eclipse.jgit.lib.ObjectId;
+
+public class DiffSummaryKey implements Serializable {
+  public static final long serialVersionUID = 1L;
+
+  /** see PatchListKey#oldId */
+  private transient ObjectId oldId;
+
+  /** see PatchListKey#parentNum */
+  private transient Integer parentNum;
+
+  private transient ObjectId newId;
+  private transient Whitespace whitespace;
+
+  public static DiffSummaryKey fromPatchListKey(PatchListKey plk) {
+    return new DiffSummaryKey(
+        plk.getOldId(), plk.getParentNum(), plk.getNewId(), plk.getWhitespace());
+  }
+
+  private DiffSummaryKey(ObjectId oldId, Integer parentNum, ObjectId newId, Whitespace whitespace) {
+    this.oldId = oldId;
+    this.parentNum = parentNum;
+    this.newId = newId;
+    this.whitespace = whitespace;
+  }
+
+  PatchListKey toPatchListKey() {
+    return new PatchListKey(oldId, parentNum, newId, whitespace);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(oldId, parentNum, newId, whitespace);
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (o instanceof DiffSummaryKey) {
+      DiffSummaryKey k = (DiffSummaryKey) o;
+      return Objects.equals(oldId, k.oldId)
+          && Objects.equals(parentNum, k.parentNum)
+          && Objects.equals(newId, k.newId)
+          && whitespace == k.whitespace;
+    }
+    return false;
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder n = new StringBuilder();
+    n.append("DiffSummaryKey[");
+    n.append(oldId != null ? oldId.name() : "BASE");
+    n.append("..");
+    n.append(newId.name());
+    n.append(" ");
+    if (parentNum != null) {
+      n.append(parentNum);
+      n.append(" ");
+    }
+    n.append(whitespace.name());
+    n.append("]");
+    return n.toString();
+  }
+
+  private void writeObject(ObjectOutputStream out) throws IOException {
+    write(out, oldId);
+    out.writeInt(parentNum == null ? 0 : parentNum);
+    writeWithoutMarker(out, newId);
+    Character c = PatchListKey.WHITESPACE_TYPES.get(whitespace);
+    if (c == null) {
+      throw new IOException("Invalid whitespace type: " + whitespace);
+    }
+    out.writeChar(c);
+  }
+
+  private void readObject(ObjectInputStream in) throws IOException {
+    oldId = read(in);
+    int n = in.readInt();
+    parentNum = n == 0 ? null : Integer.valueOf(n);
+    newId = readWithoutMarker(in);
+    char t = in.readChar();
+    whitespace = PatchListKey.WHITESPACE_TYPES.inverse().get(t);
+    if (whitespace == null) {
+      throw new IOException("Invalid whitespace type code: " + t);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/patch/DiffSummaryLoader.java b/java/com/google/gerrit/server/patch/DiffSummaryLoader.java
new file mode 100644
index 0000000..9153638
--- /dev/null
+++ b/java/com/google/gerrit/server/patch/DiffSummaryLoader.java
@@ -0,0 +1,73 @@
+// 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.
+
+package com.google.gerrit.server.patch;
+
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Callable;
+
+public class DiffSummaryLoader implements Callable<DiffSummary> {
+  public interface Factory {
+    DiffSummaryLoader create(DiffSummaryKey key, Project.NameKey project);
+  }
+
+  private final PatchListCache patchListCache;
+  private final DiffSummaryKey key;
+  private final Project.NameKey project;
+
+  @Inject
+  DiffSummaryLoader(PatchListCache plc, @Assisted DiffSummaryKey k, @Assisted Project.NameKey p) {
+    patchListCache = plc;
+    key = k;
+    project = p;
+  }
+
+  @Override
+  public DiffSummary call() throws Exception {
+    PatchList patchList = patchListCache.get(key.toPatchListKey(), project);
+    return toDiffSummary(patchList);
+  }
+
+  private DiffSummary toDiffSummary(PatchList patchList) {
+    List<String> r = new ArrayList<>(patchList.getPatches().size());
+    for (PatchListEntry e : patchList.getPatches()) {
+      if (Patch.isMagic(e.getNewName())) {
+        continue;
+      }
+      switch (e.getChangeType()) {
+        case ADDED:
+        case MODIFIED:
+        case DELETED:
+        case COPIED:
+        case REWRITE:
+          r.add(e.getNewName());
+          break;
+
+        case RENAMED:
+          r.add(e.getOldName());
+          r.add(e.getNewName());
+          break;
+      }
+    }
+    return new DiffSummary(
+        r.stream().sorted().toArray(String[]::new),
+        patchList.getInsertions(),
+        patchList.getDeletions());
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffSummaryWeigher.java b/java/com/google/gerrit/server/patch/DiffSummaryWeigher.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/patch/DiffSummaryWeigher.java
rename to java/com/google/gerrit/server/patch/DiffSummaryWeigher.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/EditTransformer.java b/java/com/google/gerrit/server/patch/EditTransformer.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/patch/EditTransformer.java
rename to java/com/google/gerrit/server/patch/EditTransformer.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineDiff.java b/java/com/google/gerrit/server/patch/IntraLineDiff.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineDiff.java
rename to java/com/google/gerrit/server/patch/IntraLineDiff.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineDiffArgs.java b/java/com/google/gerrit/server/patch/IntraLineDiffArgs.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineDiffArgs.java
rename to java/com/google/gerrit/server/patch/IntraLineDiffArgs.java
diff --git a/java/com/google/gerrit/server/patch/IntraLineDiffKey.java b/java/com/google/gerrit/server/patch/IntraLineDiffKey.java
new file mode 100644
index 0000000..ccf4e6b
--- /dev/null
+++ b/java/com/google/gerrit/server/patch/IntraLineDiffKey.java
@@ -0,0 +1,35 @@
+// Copyright (C) 2010 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.google.gerrit.server.patch;
+
+import com.google.auto.value.AutoValue;
+import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
+import java.io.Serializable;
+import org.eclipse.jgit.lib.ObjectId;
+
+@AutoValue
+public abstract class IntraLineDiffKey implements Serializable {
+  public static final long serialVersionUID = 13L;
+
+  public static IntraLineDiffKey create(ObjectId aId, ObjectId bId, Whitespace whitespace) {
+    return new AutoValue_IntraLineDiffKey(aId, bId, whitespace);
+  }
+
+  public abstract ObjectId getBlobA();
+
+  public abstract ObjectId getBlobB();
+
+  public abstract Whitespace getWhitespace();
+}
diff --git a/java/com/google/gerrit/server/patch/IntraLineLoader.java b/java/com/google/gerrit/server/patch/IntraLineLoader.java
new file mode 100644
index 0000000..022fd9e
--- /dev/null
+++ b/java/com/google/gerrit/server/patch/IntraLineLoader.java
@@ -0,0 +1,320 @@
+// Copyright (C) 2009 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.google.gerrit.server.patch;
+
+import com.google.common.base.Throwables;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.server.config.ConfigUtil;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.regex.Pattern;
+import org.eclipse.jgit.diff.Edit;
+import org.eclipse.jgit.diff.MyersDiff;
+import org.eclipse.jgit.diff.ReplaceEdit;
+import org.eclipse.jgit.lib.Config;
+
+class IntraLineLoader implements Callable<IntraLineDiff> {
+  static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  interface Factory {
+    IntraLineLoader create(IntraLineDiffKey key, IntraLineDiffArgs args);
+  }
+
+  private static final Pattern BLANK_LINE_RE =
+      Pattern.compile("^[ \\t]*(|[{}]|/\\*\\*?|\\*)[ \\t]*$");
+
+  private static final Pattern CONTROL_BLOCK_START_RE = Pattern.compile("[{:][ \\t]*$");
+
+  private final ExecutorService diffExecutor;
+  private final long timeoutMillis;
+  private final IntraLineDiffKey key;
+  private final IntraLineDiffArgs args;
+
+  @Inject
+  IntraLineLoader(
+      @DiffExecutor ExecutorService diffExecutor,
+      @GerritServerConfig Config cfg,
+      @Assisted IntraLineDiffKey key,
+      @Assisted IntraLineDiffArgs args) {
+    this.diffExecutor = diffExecutor;
+    timeoutMillis =
+        ConfigUtil.getTimeUnit(
+            cfg,
+            "cache",
+            PatchListCacheImpl.INTRA_NAME,
+            "timeout",
+            TimeUnit.MILLISECONDS.convert(5, TimeUnit.SECONDS),
+            TimeUnit.MILLISECONDS);
+    this.key = key;
+    this.args = args;
+  }
+
+  @Override
+  public IntraLineDiff call() throws Exception {
+    Future<IntraLineDiff> result =
+        diffExecutor.submit(
+            () ->
+                IntraLineLoader.compute(
+                    args.aText(), args.bText(), args.edits(), args.editsDueToRebase()));
+    try {
+      return result.get(timeoutMillis, TimeUnit.MILLISECONDS);
+    } catch (InterruptedException | TimeoutException e) {
+      logger.atWarning().log(
+          "%s ms timeout reached for IntraLineDiff"
+              + " in project %s on commit %s for path %s comparing %s..%s",
+          timeoutMillis,
+          args.project(),
+          args.commit().name(),
+          args.path(),
+          key.getBlobA().name(),
+          key.getBlobB().name());
+      result.cancel(true);
+      return new IntraLineDiff(IntraLineDiff.Status.TIMEOUT);
+    } catch (ExecutionException e) {
+      // If there was an error computing the result, carry it
+      // up to the caller so the cache knows this key is invalid.
+      Throwables.throwIfInstanceOf(e.getCause(), Exception.class);
+      throw new Exception(e.getMessage(), e.getCause());
+    }
+  }
+
+  static IntraLineDiff compute(
+      Text aText,
+      Text bText,
+      ImmutableList<Edit> immutableEdits,
+      ImmutableSet<Edit> immutableEditsDueToRebase) {
+    List<Edit> edits = new ArrayList<>(immutableEdits);
+    combineLineEdits(edits, immutableEditsDueToRebase, aText, bText);
+
+    for (int i = 0; i < edits.size(); i++) {
+      Edit e = edits.get(i);
+
+      if (e.getType() == Edit.Type.REPLACE) {
+        CharText a = new CharText(aText, e.getBeginA(), e.getEndA());
+        CharText b = new CharText(bText, e.getBeginB(), e.getEndB());
+        CharTextComparator cmp = new CharTextComparator();
+
+        List<Edit> wordEdits = MyersDiff.INSTANCE.diff(cmp, a, b);
+
+        // Combine edits that are really close together. If they are
+        // just a few characters apart we tend to get better results
+        // by joining them together and taking the whole span.
+        //
+        for (int j = 0; j < wordEdits.size() - 1; ) {
+          Edit c = wordEdits.get(j);
+          Edit n = wordEdits.get(j + 1);
+
+          if (n.getBeginA() - c.getEndA() <= 5 || n.getBeginB() - c.getEndB() <= 5) {
+            int ab = c.getBeginA();
+            int ae = n.getEndA();
+
+            int bb = c.getBeginB();
+            int be = n.getEndB();
+
+            if (canCoalesce(a, c.getEndA(), n.getBeginA())
+                && canCoalesce(b, c.getEndB(), n.getBeginB())) {
+              wordEdits.set(j, new Edit(ab, ae, bb, be));
+              wordEdits.remove(j + 1);
+              continue;
+            }
+          }
+
+          j++;
+        }
+
+        // Apply some simple rules to fix up some of the edits. Our
+        // logic above, along with our per-character difference tends
+        // to produce some crazy stuff.
+        //
+        for (int j = 0; j < wordEdits.size(); j++) {
+          Edit c = wordEdits.get(j);
+          int ab = c.getBeginA();
+          int ae = c.getEndA();
+
+          int bb = c.getBeginB();
+          int be = c.getEndB();
+
+          // Sometimes the diff generator produces an INSERT or DELETE
+          // right up against a REPLACE, but we only find this after
+          // we've also played some shifting games on the prior edit.
+          // If that happened to us, coalesce them together so we can
+          // correct this mess for the user. If we don't we wind up
+          // with silly stuff like "es" -> "es = Addresses".
+          //
+          if (1 < j) {
+            Edit p = wordEdits.get(j - 1);
+            if (p.getEndA() == ab || p.getEndB() == bb) {
+              if (p.getEndA() == ab && p.getBeginA() < p.getEndA()) {
+                ab = p.getBeginA();
+              }
+              if (p.getEndB() == bb && p.getBeginB() < p.getEndB()) {
+                bb = p.getBeginB();
+              }
+              wordEdits.remove(--j);
+            }
+          }
+
+          // We sometimes collapsed an edit together in a strange way,
+          // such that the edges of each text is identical. Fix by
+          // by dropping out that incorrectly replaced region.
+          //
+          while (ab < ae && bb < be && cmp.equals(a, ab, b, bb)) {
+            ab++;
+            bb++;
+          }
+          while (ab < ae && bb < be && cmp.equals(a, ae - 1, b, be - 1)) {
+            ae--;
+            be--;
+          }
+
+          // The leading part of an edit and its trailing part in the same
+          // text might be identical. Slide down that edit and use the tail
+          // rather than the leading bit.
+          //
+          while (0 < ab
+              && ab < ae
+              && a.charAt(ab - 1) != '\n'
+              && cmp.equals(a, ab - 1, a, ae - 1)) {
+            ab--;
+            ae--;
+          }
+          if (!a.isLineStart(ab) || !a.contains(ab, ae, '\n')) {
+            while (ab < ae && ae < a.size() && cmp.equals(a, ab, a, ae)) {
+              ab++;
+              ae++;
+              if (a.charAt(ae - 1) == '\n') {
+                break;
+              }
+            }
+          }
+
+          while (0 < bb
+              && bb < be
+              && b.charAt(bb - 1) != '\n'
+              && cmp.equals(b, bb - 1, b, be - 1)) {
+            bb--;
+            be--;
+          }
+          if (!b.isLineStart(bb) || !b.contains(bb, be, '\n')) {
+            while (bb < be && be < b.size() && cmp.equals(b, bb, b, be)) {
+              bb++;
+              be++;
+              if (b.charAt(be - 1) == '\n') {
+                break;
+              }
+            }
+          }
+
+          // If most of a line was modified except the LF was common, make
+          // the LF part of the modification region. This is easier to read.
+          //
+          if (ab < ae //
+              && (ab == 0 || a.charAt(ab - 1) == '\n') //
+              && ae < a.size()
+              && a.charAt(ae - 1) != '\n'
+              && a.charAt(ae) == '\n') {
+            ae++;
+          }
+          if (bb < be //
+              && (bb == 0 || b.charAt(bb - 1) == '\n') //
+              && be < b.size()
+              && b.charAt(be - 1) != '\n'
+              && b.charAt(be) == '\n') {
+            be++;
+          }
+
+          wordEdits.set(j, new Edit(ab, ae, bb, be));
+        }
+
+        edits.set(i, new ReplaceEdit(e, wordEdits));
+      }
+    }
+
+    return new IntraLineDiff(edits);
+  }
+
+  private static void combineLineEdits(
+      List<Edit> edits, ImmutableSet<Edit> editsDueToRebase, Text a, Text b) {
+    for (int j = 0; j < edits.size() - 1; ) {
+      Edit c = edits.get(j);
+      Edit n = edits.get(j + 1);
+
+      if (editsDueToRebase.contains(c) || editsDueToRebase.contains(n)) {
+        // Don't combine any edits which were identified as being introduced by a rebase as we would
+        // lose that information because of the combination.
+        j++;
+        continue;
+      }
+
+      // Combine edits that are really close together. Right now our rule
+      // is, coalesce two line edits which are only one line apart if that
+      // common context line is either a "pointless line", or is identical
+      // on both sides and starts a new block of code. These are mostly
+      // block reindents to add or remove control flow operators.
+      //
+      final int ad = n.getBeginA() - c.getEndA();
+      final int bd = n.getBeginB() - c.getEndB();
+      if ((1 <= ad && isBlankLineGap(a, c.getEndA(), n.getBeginA()))
+          || (1 <= bd && isBlankLineGap(b, c.getEndB(), n.getBeginB()))
+          || (ad == 1 && bd == 1 && isControlBlockStart(a, c.getEndA()))) {
+        int ab = c.getBeginA();
+        int ae = n.getEndA();
+
+        int bb = c.getBeginB();
+        int be = n.getEndB();
+
+        edits.set(j, new Edit(ab, ae, bb, be));
+        edits.remove(j + 1);
+        continue;
+      }
+
+      j++;
+    }
+  }
+
+  private static boolean isBlankLineGap(Text a, int b, int e) {
+    for (; b < e; b++) {
+      if (!BLANK_LINE_RE.matcher(a.getString(b)).matches()) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  private static boolean isControlBlockStart(Text a, int idx) {
+    return CONTROL_BLOCK_START_RE.matcher(a.getString(idx)).find();
+  }
+
+  private static boolean canCoalesce(CharText a, int b, int e) {
+    while (b < e) {
+      if (a.charAt(b++) == '\n') {
+        return false;
+      }
+    }
+    return true;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineWeigher.java b/java/com/google/gerrit/server/patch/IntraLineWeigher.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineWeigher.java
rename to java/com/google/gerrit/server/patch/IntraLineWeigher.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/MergeListBuilder.java b/java/com/google/gerrit/server/patch/MergeListBuilder.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/patch/MergeListBuilder.java
rename to java/com/google/gerrit/server/patch/MergeListBuilder.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchFile.java b/java/com/google/gerrit/server/patch/PatchFile.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchFile.java
rename to java/com/google/gerrit/server/patch/PatchFile.java
diff --git a/java/com/google/gerrit/server/patch/PatchList.java b/java/com/google/gerrit/server/patch/PatchList.java
new file mode 100644
index 0000000..dd717ba
--- /dev/null
+++ b/java/com/google/gerrit/server/patch/PatchList.java
@@ -0,0 +1,202 @@
+// Copyright (C) 2009 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.google.gerrit.server.patch;
+
+import static com.google.gerrit.server.ioutil.BasicSerialization.readBytes;
+import static com.google.gerrit.server.ioutil.BasicSerialization.readVarInt32;
+import static com.google.gerrit.server.ioutil.BasicSerialization.writeBytes;
+import static com.google.gerrit.server.ioutil.BasicSerialization.writeVarInt32;
+import static org.eclipse.jgit.lib.ObjectIdSerializer.read;
+import static org.eclipse.jgit.lib.ObjectIdSerializer.readWithoutMarker;
+import static org.eclipse.jgit.lib.ObjectIdSerializer.write;
+import static org.eclipse.jgit.lib.ObjectIdSerializer.writeWithoutMarker;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.zip.DeflaterOutputStream;
+import java.util.zip.InflaterInputStream;
+import org.eclipse.jgit.lib.AnyObjectId;
+import org.eclipse.jgit.lib.ObjectId;
+
+public class PatchList implements Serializable {
+  private static final long serialVersionUID = PatchListKey.serialVersionUID;
+
+  private static final Comparator<PatchListEntry> PATCH_CMP =
+      Comparator.comparing(PatchListEntry::getNewName, PatchList::comparePaths);
+
+  @VisibleForTesting
+  static int comparePaths(String a, String b) {
+    int m1 = Patch.isMagic(a) ? (a.equals(Patch.MERGE_LIST) ? 2 : 1) : 3;
+    int m2 = Patch.isMagic(b) ? (b.equals(Patch.MERGE_LIST) ? 2 : 1) : 3;
+
+    if (m1 != m2) {
+      return m1 - m2;
+    } else if (m1 < 3) {
+      return 0;
+    }
+
+    // m1 == m2 == 3: normal names.
+    return a.compareTo(b);
+  }
+
+  @Nullable private transient ObjectId oldId;
+  private transient ObjectId newId;
+  private transient boolean isMerge;
+  private transient ComparisonType comparisonType;
+  private transient int insertions;
+  private transient int deletions;
+  private transient PatchListEntry[] patches;
+
+  public PatchList(
+      @Nullable AnyObjectId oldId,
+      AnyObjectId newId,
+      boolean isMerge,
+      ComparisonType comparisonType,
+      PatchListEntry[] patches) {
+    this.oldId = oldId != null ? oldId.copy() : null;
+    this.newId = newId.copy();
+    this.isMerge = isMerge;
+    this.comparisonType = comparisonType;
+
+    Arrays.sort(patches, 0, patches.length, PATCH_CMP);
+
+    // Skip magic files
+    int i = 0;
+    for (; i < patches.length; i++) {
+      if (!Patch.isMagic(patches[i].getNewName())) {
+        break;
+      }
+    }
+    for (; i < patches.length; i++) {
+      insertions += patches[i].getInsertions();
+      deletions += patches[i].getDeletions();
+    }
+
+    this.patches = patches;
+  }
+
+  /** Old side tree or commit; null only if this is a combined diff. */
+  @Nullable
+  public ObjectId getOldId() {
+    return oldId;
+  }
+
+  /** New side commit. */
+  public ObjectId getNewId() {
+    return newId;
+  }
+
+  /** Get a sorted, unmodifiable list of all files in this list. */
+  public List<PatchListEntry> getPatches() {
+    return Collections.unmodifiableList(Arrays.asList(patches));
+  }
+
+  /** @return the comparison type */
+  public ComparisonType getComparisonType() {
+    return comparisonType;
+  }
+
+  /** @return total number of new lines added. */
+  public int getInsertions() {
+    return insertions;
+  }
+
+  /** @return total number of lines removed. */
+  public int getDeletions() {
+    return deletions;
+  }
+
+  /**
+   * Get a sorted, modifiable list of all files in this list.
+   *
+   * <p>The returned list items do not populate:
+   *
+   * <ul>
+   *   <li>{@link Patch#getCommentCount()}
+   *   <li>{@link Patch#getDraftCount()}
+   *   <li>{@link Patch#isReviewedByCurrentUser()}
+   * </ul>
+   *
+   * @param setId the patch set identity these patches belong to. This really should not need to be
+   *     specified, but is a current legacy artifact of how the cache is keyed versus how the
+   *     database is keyed.
+   */
+  public List<Patch> toPatchList(PatchSet.Id setId) {
+    final ArrayList<Patch> r = new ArrayList<>(patches.length);
+    for (PatchListEntry e : patches) {
+      r.add(e.toPatch(setId));
+    }
+    return r;
+  }
+
+  /** Find an entry by name, returning an empty entry if not present. */
+  public PatchListEntry get(String fileName) {
+    final int index = search(fileName);
+    return 0 <= index ? patches[index] : PatchListEntry.empty(fileName);
+  }
+
+  private int search(String fileName) {
+    PatchListEntry want = PatchListEntry.empty(fileName);
+    return Arrays.binarySearch(patches, 0, patches.length, want, PATCH_CMP);
+  }
+
+  private void writeObject(ObjectOutputStream output) throws IOException {
+    final ByteArrayOutputStream buf = new ByteArrayOutputStream();
+    try (DeflaterOutputStream out = new DeflaterOutputStream(buf)) {
+      write(out, oldId);
+      writeWithoutMarker(out, newId);
+      writeVarInt32(out, isMerge ? 1 : 0);
+      comparisonType.writeTo(out);
+      writeVarInt32(out, insertions);
+      writeVarInt32(out, deletions);
+      writeVarInt32(out, patches.length);
+      for (PatchListEntry p : patches) {
+        p.writeTo(out);
+      }
+    }
+    writeBytes(output, buf.toByteArray());
+  }
+
+  private void readObject(ObjectInputStream input) throws IOException {
+    final ByteArrayInputStream buf = new ByteArrayInputStream(readBytes(input));
+    try (InflaterInputStream in = new InflaterInputStream(buf)) {
+      oldId = read(in);
+      newId = readWithoutMarker(in);
+      isMerge = readVarInt32(in) != 0;
+      comparisonType = ComparisonType.readFrom(in);
+      insertions = readVarInt32(in);
+      deletions = readVarInt32(in);
+      final int cnt = readVarInt32(in);
+      final PatchListEntry[] all = new PatchListEntry[cnt];
+      for (int i = 0; i < all.length; i++) {
+        all[i] = PatchListEntry.readFrom(in);
+      }
+      patches = all;
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListCache.java b/java/com/google/gerrit/server/patch/PatchListCache.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListCache.java
rename to java/com/google/gerrit/server/patch/PatchListCache.java
diff --git a/java/com/google/gerrit/server/patch/PatchListCacheImpl.java b/java/com/google/gerrit/server/patch/PatchListCacheImpl.java
new file mode 100644
index 0000000..6039fff
--- /dev/null
+++ b/java/com/google/gerrit/server/patch/PatchListCacheImpl.java
@@ -0,0 +1,191 @@
+// Copyright (C) 2009 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.google.gerrit.server.patch;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.cache.Cache;
+import com.google.common.util.concurrent.UncheckedExecutionException;
+import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.cache.CacheModule;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.inject.Inject;
+import com.google.inject.Module;
+import com.google.inject.Singleton;
+import com.google.inject.name.Named;
+import java.util.concurrent.ExecutionException;
+import org.eclipse.jgit.errors.LargeObjectException;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+
+/** Provides a cached list of {@link PatchListEntry}. */
+@Singleton
+public class PatchListCacheImpl implements PatchListCache {
+  static final String FILE_NAME = "diff";
+  static final String INTRA_NAME = "diff_intraline";
+  static final String DIFF_SUMMARY = "diff_summary";
+
+  public static Module module() {
+    return new CacheModule() {
+      @Override
+      protected void configure() {
+        factory(PatchListLoader.Factory.class);
+        persist(FILE_NAME, PatchListKey.class, PatchList.class)
+            .maximumWeight(10 << 20)
+            .weigher(PatchListWeigher.class);
+
+        factory(IntraLineLoader.Factory.class);
+        persist(INTRA_NAME, IntraLineDiffKey.class, IntraLineDiff.class)
+            .maximumWeight(10 << 20)
+            .weigher(IntraLineWeigher.class);
+
+        factory(DiffSummaryLoader.Factory.class);
+        persist(DIFF_SUMMARY, DiffSummaryKey.class, DiffSummary.class)
+            .maximumWeight(10 << 20)
+            .weigher(DiffSummaryWeigher.class)
+            .diskLimit(1 << 30);
+
+        bind(PatchListCacheImpl.class);
+        bind(PatchListCache.class).to(PatchListCacheImpl.class);
+      }
+    };
+  }
+
+  private final Cache<PatchListKey, PatchList> fileCache;
+  private final Cache<IntraLineDiffKey, IntraLineDiff> intraCache;
+  private final Cache<DiffSummaryKey, DiffSummary> diffSummaryCache;
+  private final PatchListLoader.Factory fileLoaderFactory;
+  private final IntraLineLoader.Factory intraLoaderFactory;
+  private final DiffSummaryLoader.Factory diffSummaryLoaderFactory;
+  private final boolean computeIntraline;
+
+  @Inject
+  PatchListCacheImpl(
+      @Named(FILE_NAME) Cache<PatchListKey, PatchList> fileCache,
+      @Named(INTRA_NAME) Cache<IntraLineDiffKey, IntraLineDiff> intraCache,
+      @Named(DIFF_SUMMARY) Cache<DiffSummaryKey, DiffSummary> diffSummaryCache,
+      PatchListLoader.Factory fileLoaderFactory,
+      IntraLineLoader.Factory intraLoaderFactory,
+      DiffSummaryLoader.Factory diffSummaryLoaderFactory,
+      @GerritServerConfig Config cfg) {
+    this.fileCache = fileCache;
+    this.intraCache = intraCache;
+    this.diffSummaryCache = diffSummaryCache;
+    this.fileLoaderFactory = fileLoaderFactory;
+    this.intraLoaderFactory = intraLoaderFactory;
+    this.diffSummaryLoaderFactory = diffSummaryLoaderFactory;
+
+    this.computeIntraline =
+        cfg.getBoolean(
+            "cache", INTRA_NAME, "enabled", cfg.getBoolean("cache", "diff", "intraline", true));
+  }
+
+  @Override
+  public PatchList get(PatchListKey key, Project.NameKey project)
+      throws PatchListNotAvailableException {
+    try {
+      PatchList pl = fileCache.get(key, fileLoaderFactory.create(key, project));
+      if (pl instanceof LargeObjectTombstone) {
+        throw new PatchListObjectTooLargeException(
+            "Error computing " + key + ". Previous attempt failed with LargeObjectException");
+      }
+      return pl;
+    } catch (ExecutionException e) {
+      PatchListLoader.logger.atWarning().withCause(e).log("Error computing %s", key);
+      throw new PatchListNotAvailableException(e);
+    } catch (UncheckedExecutionException e) {
+      if (e.getCause() instanceof LargeObjectException) {
+        // Cache negative result so we don't need to redo expensive computations that would yield
+        // the same result.
+        fileCache.put(key, new LargeObjectTombstone());
+        PatchListLoader.logger.atWarning().withCause(e).log("Error computing %s", key);
+        throw new PatchListNotAvailableException(e);
+      }
+      throw e;
+    }
+  }
+
+  @Override
+  public PatchList get(Change change, PatchSet patchSet) throws PatchListNotAvailableException {
+    return get(change, patchSet, null);
+  }
+
+  @Override
+  public ObjectId getOldId(Change change, PatchSet patchSet, Integer parentNum)
+      throws PatchListNotAvailableException {
+    return get(change, patchSet, parentNum).getOldId();
+  }
+
+  private PatchList get(Change change, PatchSet patchSet, Integer parentNum)
+      throws PatchListNotAvailableException {
+    Project.NameKey project = change.getProject();
+    if (patchSet.getRevision() == null) {
+      throw new PatchListNotAvailableException("revision is null for " + patchSet.getId());
+    }
+    ObjectId b = ObjectId.fromString(patchSet.getRevision().get());
+    Whitespace ws = Whitespace.IGNORE_NONE;
+    if (parentNum != null) {
+      return get(PatchListKey.againstParentNum(parentNum, b, ws), project);
+    }
+    return get(PatchListKey.againstDefaultBase(b, ws), project);
+  }
+
+  @Override
+  public IntraLineDiff getIntraLineDiff(IntraLineDiffKey key, IntraLineDiffArgs args) {
+    if (computeIntraline) {
+      try {
+        return intraCache.get(key, intraLoaderFactory.create(key, args));
+      } catch (ExecutionException | LargeObjectException e) {
+        IntraLineLoader.logger.atWarning().withCause(e).log("Error computing %s", key);
+        return new IntraLineDiff(IntraLineDiff.Status.ERROR);
+      }
+    }
+    return new IntraLineDiff(IntraLineDiff.Status.DISABLED);
+  }
+
+  @Override
+  public DiffSummary getDiffSummary(DiffSummaryKey key, Project.NameKey project)
+      throws PatchListNotAvailableException {
+    try {
+      return diffSummaryCache.get(key, diffSummaryLoaderFactory.create(key, project));
+    } catch (ExecutionException e) {
+      PatchListLoader.logger.atWarning().withCause(e).log("Error computing %s", key);
+      throw new PatchListNotAvailableException(e);
+    } catch (UncheckedExecutionException e) {
+      if (e.getCause() instanceof LargeObjectException) {
+        PatchListLoader.logger.atWarning().withCause(e).log("Error computing %s", key);
+        throw new PatchListNotAvailableException(e);
+      }
+      throw e;
+    }
+  }
+
+  /** Used to cache negative results in {@code fileCache}. */
+  @VisibleForTesting
+  public static class LargeObjectTombstone extends PatchList {
+    private static final long serialVersionUID = 1L;
+
+    @VisibleForTesting
+    public LargeObjectTombstone() {
+      // Initialize super class with valid values. We don't care about the inner state, but need to
+      // pass valid values that don't break (de)serialization.
+      super(
+          null, ObjectId.zeroId(), false, ComparisonType.againstAutoMerge(), new PatchListEntry[0]);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/patch/PatchListEntry.java b/java/com/google/gerrit/server/patch/PatchListEntry.java
new file mode 100644
index 0000000..6b1a153
--- /dev/null
+++ b/java/com/google/gerrit/server/patch/PatchListEntry.java
@@ -0,0 +1,389 @@
+// Copyright (C) 2009 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.google.gerrit.server.patch;
+
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static com.google.common.collect.ImmutableSet.toImmutableSet;
+import static com.google.gerrit.server.ioutil.BasicSerialization.readBytes;
+import static com.google.gerrit.server.ioutil.BasicSerialization.readEnum;
+import static com.google.gerrit.server.ioutil.BasicSerialization.readFixInt64;
+import static com.google.gerrit.server.ioutil.BasicSerialization.readString;
+import static com.google.gerrit.server.ioutil.BasicSerialization.readVarInt32;
+import static com.google.gerrit.server.ioutil.BasicSerialization.writeBytes;
+import static com.google.gerrit.server.ioutil.BasicSerialization.writeEnum;
+import static com.google.gerrit.server.ioutil.BasicSerialization.writeFixInt64;
+import static com.google.gerrit.server.ioutil.BasicSerialization.writeString;
+import static com.google.gerrit.server.ioutil.BasicSerialization.writeVarInt32;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.reviewdb.client.Patch.ChangeType;
+import com.google.gerrit.reviewdb.client.Patch.PatchType;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.jgit.diff.Edit;
+import org.eclipse.jgit.patch.CombinedFileHeader;
+import org.eclipse.jgit.patch.FileHeader;
+import org.eclipse.jgit.util.IntList;
+import org.eclipse.jgit.util.RawParseUtils;
+
+public class PatchListEntry {
+  private static final byte[] EMPTY_HEADER = {};
+
+  static PatchListEntry empty(String fileName) {
+    return new PatchListEntry(
+        ChangeType.MODIFIED,
+        PatchType.UNIFIED,
+        null,
+        fileName,
+        EMPTY_HEADER,
+        ImmutableList.of(),
+        ImmutableSet.of(),
+        0,
+        0,
+        0,
+        0);
+  }
+
+  private final ChangeType changeType;
+  private final PatchType patchType;
+  private final String oldName;
+  private final String newName;
+  private final byte[] header;
+  private final ImmutableList<Edit> edits;
+  private final ImmutableSet<Edit> editsDueToRebase;
+  private final int insertions;
+  private final int deletions;
+  private final long size;
+  private final long sizeDelta;
+  // Note: When adding new fields, the serialVersionUID in PatchListKey must be
+  // incremented so that entries from the cache are automatically invalidated.
+
+  PatchListEntry(
+      FileHeader hdr, List<Edit> editList, Set<Edit> editsDueToRebase, long size, long sizeDelta) {
+    changeType = toChangeType(hdr);
+    patchType = toPatchType(hdr);
+
+    switch (changeType) {
+      case DELETED:
+        oldName = null;
+        newName = hdr.getOldPath();
+        break;
+
+      case ADDED:
+      case MODIFIED:
+      case REWRITE:
+        oldName = null;
+        newName = hdr.getNewPath();
+        break;
+
+      case COPIED:
+      case RENAMED:
+        oldName = hdr.getOldPath();
+        newName = hdr.getNewPath();
+        break;
+
+      default:
+        throw new IllegalArgumentException("Unsupported type " + changeType);
+    }
+
+    header = compact(hdr);
+
+    if (hdr instanceof CombinedFileHeader || hdr.getHunks().isEmpty()) {
+      edits = ImmutableList.of();
+    } else {
+      edits = ImmutableList.copyOf(editList);
+    }
+    this.editsDueToRebase = ImmutableSet.copyOf(editsDueToRebase);
+
+    int ins = 0;
+    int del = 0;
+    for (Edit e : editList) {
+      if (!editsDueToRebase.contains(e)) {
+        del += e.getEndA() - e.getBeginA();
+        ins += e.getEndB() - e.getBeginB();
+      }
+    }
+    insertions = ins;
+    deletions = del;
+    this.size = size;
+    this.sizeDelta = sizeDelta;
+  }
+
+  private PatchListEntry(
+      ChangeType changeType,
+      PatchType patchType,
+      String oldName,
+      String newName,
+      byte[] header,
+      ImmutableList<Edit> edits,
+      ImmutableSet<Edit> editsDueToRebase,
+      int insertions,
+      int deletions,
+      long size,
+      long sizeDelta) {
+    this.changeType = changeType;
+    this.patchType = patchType;
+    this.oldName = oldName;
+    this.newName = newName;
+    this.header = header;
+    this.edits = edits;
+    this.editsDueToRebase = editsDueToRebase;
+    this.insertions = insertions;
+    this.deletions = deletions;
+    this.size = size;
+    this.sizeDelta = sizeDelta;
+  }
+
+  int weigh() {
+    int size = 16 + 6 * 8 + 2 * 4 + 20 + 16 + 8 + 4 + 20;
+    size += stringSize(oldName);
+    size += stringSize(newName);
+    size += header.length;
+    size += (8 + 16 + 4 * 4) * edits.size();
+    size += (8 + 16 + 4 * 4) * editsDueToRebase.size();
+    return size;
+  }
+
+  private static int stringSize(String str) {
+    if (str != null) {
+      return 16 + 3 * 4 + 16 + str.length() * 2;
+    }
+    return 0;
+  }
+
+  public ChangeType getChangeType() {
+    return changeType;
+  }
+
+  public PatchType getPatchType() {
+    return patchType;
+  }
+
+  public String getOldName() {
+    return oldName;
+  }
+
+  public String getNewName() {
+    return newName;
+  }
+
+  public ImmutableList<Edit> getEdits() {
+    // Edits are mutable objects. As we serialize PatchListEntry asynchronously in H2CacheImpl, we
+    // must ensure that its state isn't modified until it was properly stored in the cache.
+    return deepCopyEdits(edits);
+  }
+
+  public ImmutableSet<Edit> getEditsDueToRebase() {
+    return deepCopyEdits(editsDueToRebase);
+  }
+
+  public int getInsertions() {
+    return insertions;
+  }
+
+  public int getDeletions() {
+    return deletions;
+  }
+
+  public long getSize() {
+    return size;
+  }
+
+  public long getSizeDelta() {
+    return sizeDelta;
+  }
+
+  public List<String> getHeaderLines() {
+    final IntList m = RawParseUtils.lineMap(header, 0, header.length);
+    final List<String> headerLines = new ArrayList<>(m.size() - 1);
+    for (int i = 1; i < m.size() - 1; i++) {
+      final int b = m.get(i);
+      int e = m.get(i + 1);
+      if (header[e - 1] == '\n') {
+        e--;
+      }
+      headerLines.add(RawParseUtils.decode(UTF_8, header, b, e));
+    }
+    return headerLines;
+  }
+
+  Patch toPatch(PatchSet.Id setId) {
+    final Patch p = new Patch(new Patch.Key(setId, getNewName()));
+    p.setChangeType(getChangeType());
+    p.setPatchType(getPatchType());
+    p.setSourceFileName(getOldName());
+    p.setInsertions(insertions);
+    p.setDeletions(deletions);
+    return p;
+  }
+
+  private static ImmutableList<Edit> deepCopyEdits(List<Edit> edits) {
+    return edits.stream().map(PatchListEntry::copy).collect(toImmutableList());
+  }
+
+  private static ImmutableSet<Edit> deepCopyEdits(Set<Edit> edits) {
+    return edits.stream().map(PatchListEntry::copy).collect(toImmutableSet());
+  }
+
+  private static Edit copy(Edit edit) {
+    return new Edit(edit.getBeginA(), edit.getEndA(), edit.getBeginB(), edit.getEndB());
+  }
+
+  void writeTo(OutputStream out) throws IOException {
+    writeEnum(out, changeType);
+    writeEnum(out, patchType);
+    writeString(out, oldName);
+    writeString(out, newName);
+    writeBytes(out, header);
+    writeVarInt32(out, insertions);
+    writeVarInt32(out, deletions);
+    writeFixInt64(out, size);
+    writeFixInt64(out, sizeDelta);
+
+    writeEditArray(out, edits);
+    writeEditArray(out, editsDueToRebase);
+  }
+
+  private static void writeEditArray(OutputStream out, Collection<Edit> edits) throws IOException {
+    writeVarInt32(out, edits.size());
+    for (Edit edit : edits) {
+      writeVarInt32(out, edit.getBeginA());
+      writeVarInt32(out, edit.getEndA());
+      writeVarInt32(out, edit.getBeginB());
+      writeVarInt32(out, edit.getEndB());
+    }
+  }
+
+  static PatchListEntry readFrom(InputStream in) throws IOException {
+    ChangeType changeType = readEnum(in, ChangeType.values());
+    PatchType patchType = readEnum(in, PatchType.values());
+    String oldName = readString(in);
+    String newName = readString(in);
+    byte[] hdr = readBytes(in);
+    int ins = readVarInt32(in);
+    int del = readVarInt32(in);
+    long size = readFixInt64(in);
+    long sizeDelta = readFixInt64(in);
+
+    Edit[] editArray = readEditArray(in);
+    Edit[] editsDueToRebase = readEditArray(in);
+
+    return new PatchListEntry(
+        changeType,
+        patchType,
+        oldName,
+        newName,
+        hdr,
+        ImmutableList.copyOf(editArray),
+        ImmutableSet.copyOf(editsDueToRebase),
+        ins,
+        del,
+        size,
+        sizeDelta);
+  }
+
+  private static Edit[] readEditArray(InputStream in) throws IOException {
+    int numEdits = readVarInt32(in);
+    Edit[] edits = new Edit[numEdits];
+    for (int i = 0; i < numEdits; i++) {
+      int beginA = readVarInt32(in);
+      int endA = readVarInt32(in);
+      int beginB = readVarInt32(in);
+      int endB = readVarInt32(in);
+      edits[i] = new Edit(beginA, endA, beginB, endB);
+    }
+    return edits;
+  }
+
+  private static byte[] compact(FileHeader h) {
+    final int end = end(h);
+    if (h.getStartOffset() == 0 && end == h.getBuffer().length) {
+      return h.getBuffer();
+    }
+
+    final byte[] buf = new byte[end - h.getStartOffset()];
+    System.arraycopy(h.getBuffer(), h.getStartOffset(), buf, 0, buf.length);
+    return buf;
+  }
+
+  private static int end(FileHeader h) {
+    if (h instanceof CombinedFileHeader) {
+      return h.getEndOffset();
+    }
+    if (!h.getHunks().isEmpty()) {
+      return h.getHunks().get(0).getStartOffset();
+    }
+    return h.getEndOffset();
+  }
+
+  private static ChangeType toChangeType(FileHeader hdr) {
+    switch (hdr.getChangeType()) {
+      case ADD:
+        return Patch.ChangeType.ADDED;
+      case MODIFY:
+        return Patch.ChangeType.MODIFIED;
+      case DELETE:
+        return Patch.ChangeType.DELETED;
+      case RENAME:
+        return Patch.ChangeType.RENAMED;
+      case COPY:
+        return Patch.ChangeType.COPIED;
+      default:
+        throw new IllegalArgumentException("Unsupported type " + hdr.getChangeType());
+    }
+  }
+
+  private static PatchType toPatchType(FileHeader hdr) {
+    PatchType pt;
+
+    switch (hdr.getPatchType()) {
+      case UNIFIED:
+        pt = Patch.PatchType.UNIFIED;
+        break;
+      case GIT_BINARY:
+      case BINARY:
+        pt = Patch.PatchType.BINARY;
+        break;
+      default:
+        throw new IllegalArgumentException("Unsupported type " + hdr.getPatchType());
+    }
+
+    if (pt != PatchType.BINARY) {
+      final byte[] buf = hdr.getBuffer();
+      for (int ptr = hdr.getStartOffset(); ptr < hdr.getEndOffset(); ptr++) {
+        if (buf[ptr] == '\0') {
+          // Its really binary, but Git couldn't see the nul early enough
+          // to realize its binary, and instead produced the diff.
+          //
+          // Force it to be a binary; it really should have been that.
+          //
+          pt = PatchType.BINARY;
+          break;
+        }
+      }
+    }
+
+    return pt;
+  }
+}
diff --git a/java/com/google/gerrit/server/patch/PatchListKey.java b/java/com/google/gerrit/server/patch/PatchListKey.java
new file mode 100644
index 0000000..2df6d66
--- /dev/null
+++ b/java/com/google/gerrit/server/patch/PatchListKey.java
@@ -0,0 +1,181 @@
+// Copyright (C) 2009 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.google.gerrit.server.patch;
+
+import static com.google.common.base.Preconditions.checkState;
+import static org.eclipse.jgit.lib.ObjectIdSerializer.read;
+import static org.eclipse.jgit.lib.ObjectIdSerializer.readWithoutMarker;
+import static org.eclipse.jgit.lib.ObjectIdSerializer.write;
+import static org.eclipse.jgit.lib.ObjectIdSerializer.writeWithoutMarker;
+
+import com.google.common.collect.ImmutableBiMap;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.Objects;
+import org.eclipse.jgit.lib.AnyObjectId;
+import org.eclipse.jgit.lib.ObjectId;
+
+public class PatchListKey implements Serializable {
+  public static final long serialVersionUID = 32L;
+
+  public static final ImmutableBiMap<Whitespace, Character> WHITESPACE_TYPES =
+      ImmutableBiMap.of(
+          Whitespace.IGNORE_NONE, 'N',
+          Whitespace.IGNORE_TRAILING, 'E',
+          Whitespace.IGNORE_LEADING_AND_TRAILING, 'S',
+          Whitespace.IGNORE_ALL, 'A');
+
+  static {
+    checkState(WHITESPACE_TYPES.size() == Whitespace.values().length);
+  }
+
+  public static PatchListKey againstDefaultBase(AnyObjectId newId, Whitespace ws) {
+    return new PatchListKey(null, newId, ws);
+  }
+
+  public static PatchListKey againstParentNum(int parentNum, AnyObjectId newId, Whitespace ws) {
+    return new PatchListKey(parentNum, newId, ws);
+  }
+
+  public static PatchListKey againstCommit(
+      AnyObjectId otherCommitId, AnyObjectId newId, Whitespace whitespace) {
+    return new PatchListKey(otherCommitId, newId, whitespace);
+  }
+
+  /**
+   * Old patch-set ID
+   *
+   * <p>When null, it represents the Base of the newId for a non-merge commit.
+   *
+   * <p>When newId is a merge commit, null value of the oldId represents either the auto-merge
+   * commit of the newId or a parent commit of the newId. These two cases are distinguished by the
+   * parentNum.
+   */
+  private transient ObjectId oldId;
+
+  /**
+   * 1-based parent number when newId is a merge commit
+   *
+   * <p>For the auto-merge case this field is null.
+   *
+   * <p>Used only when oldId is null and newId is a merge commit
+   */
+  private transient Integer parentNum;
+
+  private transient ObjectId newId;
+  private transient Whitespace whitespace;
+
+  private PatchListKey(AnyObjectId a, AnyObjectId b, Whitespace ws) {
+    oldId = a != null ? a.copy() : null;
+    newId = b.copy();
+    whitespace = ws;
+  }
+
+  private PatchListKey(int parentNum, AnyObjectId b, Whitespace ws) {
+    this.parentNum = Integer.valueOf(parentNum);
+    newId = b.copy();
+    whitespace = ws;
+  }
+
+  /** For use only by DiffSummaryKey. */
+  PatchListKey(ObjectId oldId, Integer parentNum, ObjectId newId, Whitespace whitespace) {
+    this.oldId = oldId;
+    this.parentNum = parentNum;
+    this.newId = newId;
+    this.whitespace = whitespace;
+  }
+
+  /** Old side commit, or null to assume ancestor or combined merge. */
+  @Nullable
+  public ObjectId getOldId() {
+    return oldId;
+  }
+
+  /** Parent number (old side) of the new side (merge) commit */
+  @Nullable
+  public Integer getParentNum() {
+    return parentNum;
+  }
+
+  /** New side commit name. */
+  public ObjectId getNewId() {
+    return newId;
+  }
+
+  public Whitespace getWhitespace() {
+    return whitespace;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(oldId, parentNum, newId, whitespace);
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (o instanceof PatchListKey) {
+      PatchListKey k = (PatchListKey) o;
+      return Objects.equals(oldId, k.oldId)
+          && Objects.equals(parentNum, k.parentNum)
+          && Objects.equals(newId, k.newId)
+          && whitespace == k.whitespace;
+    }
+    return false;
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder n = new StringBuilder();
+    n.append("PatchListKey[");
+    n.append(oldId != null ? oldId.name() : "BASE");
+    n.append("..");
+    n.append(newId.name());
+    n.append(" ");
+    if (parentNum != null) {
+      n.append(parentNum);
+      n.append(" ");
+    }
+    n.append(whitespace.name());
+    n.append("]");
+    return n.toString();
+  }
+
+  private void writeObject(ObjectOutputStream out) throws IOException {
+    write(out, oldId);
+    out.writeInt(parentNum == null ? 0 : parentNum);
+    writeWithoutMarker(out, newId);
+    Character c = WHITESPACE_TYPES.get(whitespace);
+    if (c == null) {
+      throw new IOException("Invalid whitespace type: " + whitespace);
+    }
+    out.writeChar(c);
+  }
+
+  private void readObject(ObjectInputStream in) throws IOException {
+    oldId = read(in);
+    int n = in.readInt();
+    parentNum = n == 0 ? null : Integer.valueOf(n);
+    newId = readWithoutMarker(in);
+    char t = in.readChar();
+    whitespace = WHITESPACE_TYPES.inverse().get(t);
+    if (whitespace == null) {
+      throw new IOException("Invalid whitespace type code: " + t);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/patch/PatchListLoader.java b/java/com/google/gerrit/server/patch/PatchListLoader.java
new file mode 100644
index 0000000..08de537
--- /dev/null
+++ b/java/com/google/gerrit/server/patch/PatchListLoader.java
@@ -0,0 +1,596 @@
+// Copyright (C) 2009 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.google.gerrit.server.patch;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.stream.Collectors.toSet;
+import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.base.Throwables;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMultimap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Multimap;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.config.ConfigUtil;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.InMemoryInserter;
+import com.google.gerrit.server.git.MergeUtil;
+import com.google.gerrit.server.patch.EditTransformer.ContextAwareEdit;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import org.eclipse.jgit.diff.DiffEntry;
+import org.eclipse.jgit.diff.DiffEntry.ChangeType;
+import org.eclipse.jgit.diff.DiffFormatter;
+import org.eclipse.jgit.diff.Edit;
+import org.eclipse.jgit.diff.EditList;
+import org.eclipse.jgit.diff.HistogramDiff;
+import org.eclipse.jgit.diff.RawText;
+import org.eclipse.jgit.diff.RawTextComparator;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.FileMode;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.merge.ThreeWayMergeStrategy;
+import org.eclipse.jgit.patch.FileHeader;
+import org.eclipse.jgit.patch.FileHeader.PatchType;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevObject;
+import org.eclipse.jgit.revwalk.RevTree;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.treewalk.TreeWalk;
+import org.eclipse.jgit.util.io.DisabledOutputStream;
+
+public class PatchListLoader implements Callable<PatchList> {
+  static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public interface Factory {
+    PatchListLoader create(PatchListKey key, Project.NameKey project);
+  }
+
+  private final GitRepositoryManager repoManager;
+  private final PatchListCache patchListCache;
+  private final ThreeWayMergeStrategy mergeStrategy;
+  private final ExecutorService diffExecutor;
+  private final AutoMerger autoMerger;
+  private final PatchListKey key;
+  private final Project.NameKey project;
+  private final long timeoutMillis;
+  private final boolean save;
+
+  @Inject
+  PatchListLoader(
+      GitRepositoryManager mgr,
+      PatchListCache plc,
+      @GerritServerConfig Config cfg,
+      @DiffExecutor ExecutorService de,
+      AutoMerger am,
+      @Assisted PatchListKey k,
+      @Assisted Project.NameKey p) {
+    repoManager = mgr;
+    patchListCache = plc;
+    mergeStrategy = MergeUtil.getMergeStrategy(cfg);
+    diffExecutor = de;
+    autoMerger = am;
+    key = k;
+    project = p;
+    timeoutMillis =
+        ConfigUtil.getTimeUnit(
+            cfg,
+            "cache",
+            PatchListCacheImpl.FILE_NAME,
+            "timeout",
+            TimeUnit.MILLISECONDS.convert(5, TimeUnit.SECONDS),
+            TimeUnit.MILLISECONDS);
+    save = AutoMerger.cacheAutomerge(cfg);
+  }
+
+  @Override
+  public PatchList call() throws IOException, PatchListNotAvailableException {
+    try (Repository repo = repoManager.openRepository(project);
+        ObjectInserter ins = newInserter(repo);
+        ObjectReader reader = ins.newReader();
+        RevWalk rw = new RevWalk(reader)) {
+      return readPatchList(repo, rw, ins);
+    }
+  }
+
+  private static RawTextComparator comparatorFor(Whitespace ws) {
+    switch (ws) {
+      case IGNORE_ALL:
+        return RawTextComparator.WS_IGNORE_ALL;
+
+      case IGNORE_TRAILING:
+        return RawTextComparator.WS_IGNORE_TRAILING;
+
+      case IGNORE_LEADING_AND_TRAILING:
+        return RawTextComparator.WS_IGNORE_CHANGE;
+
+      case IGNORE_NONE:
+      default:
+        return RawTextComparator.DEFAULT;
+    }
+  }
+
+  private ObjectInserter newInserter(Repository repo) {
+    return save ? repo.newObjectInserter() : new InMemoryInserter(repo);
+  }
+
+  private PatchList readPatchList(Repository repo, RevWalk rw, ObjectInserter ins)
+      throws IOException, PatchListNotAvailableException {
+    ObjectReader reader = rw.getObjectReader();
+    checkArgument(reader.getCreatedFromInserter() == ins);
+    RawTextComparator cmp = comparatorFor(key.getWhitespace());
+    try (DiffFormatter df = new DiffFormatter(DisabledOutputStream.INSTANCE)) {
+      RevCommit b = rw.parseCommit(key.getNewId());
+      RevObject a = aFor(key, repo, rw, ins, b);
+
+      if (a == null) {
+        // TODO(sop) Remove this case.
+        // This is an octopus merge commit which should be compared against the
+        // auto-merge. However since we don't support computing the auto-merge
+        // for octopus merge commits, we fall back to diffing against the first
+        // parent, even though this wasn't what was requested.
+        //
+        ComparisonType comparisonType = ComparisonType.againstParent(1);
+        PatchListEntry[] entries = new PatchListEntry[2];
+        entries[0] = newCommitMessage(cmp, reader, null, b);
+        entries[1] = newMergeList(cmp, reader, null, b, comparisonType);
+        return new PatchList(a, b, true, comparisonType, entries);
+      }
+
+      ComparisonType comparisonType = getComparisonType(a, b);
+
+      RevCommit aCommit = a instanceof RevCommit ? (RevCommit) a : null;
+      RevTree aTree = rw.parseTree(a);
+      RevTree bTree = b.getTree();
+
+      df.setReader(reader, repo.getConfig());
+      df.setDiffComparator(cmp);
+      df.setDetectRenames(true);
+      List<DiffEntry> diffEntries = df.scan(aTree, bTree);
+
+      EditsDueToRebaseResult editsDueToRebaseResult =
+          determineEditsDueToRebase(aCommit, b, diffEntries, df, rw);
+      diffEntries = editsDueToRebaseResult.getRelevantOriginalDiffEntries();
+      Multimap<String, ContextAwareEdit> editsDueToRebasePerFilePath =
+          editsDueToRebaseResult.getEditsDueToRebasePerFilePath();
+
+      List<PatchListEntry> entries = new ArrayList<>();
+      entries.add(
+          newCommitMessage(
+              cmp, reader, comparisonType.isAgainstParentOrAutoMerge() ? null : aCommit, b));
+      boolean isMerge = b.getParentCount() > 1;
+      if (isMerge) {
+        entries.add(
+            newMergeList(
+                cmp,
+                reader,
+                comparisonType.isAgainstParentOrAutoMerge() ? null : aCommit,
+                b,
+                comparisonType));
+      }
+      for (DiffEntry diffEntry : diffEntries) {
+        Set<ContextAwareEdit> editsDueToRebase =
+            getEditsDueToRebase(editsDueToRebasePerFilePath, diffEntry);
+        Optional<PatchListEntry> patchListEntry =
+            getPatchListEntry(reader, df, diffEntry, aTree, bTree, editsDueToRebase);
+        patchListEntry.ifPresent(entries::add);
+      }
+      return new PatchList(
+          a, b, isMerge, comparisonType, entries.toArray(new PatchListEntry[entries.size()]));
+    }
+  }
+
+  /**
+   * Identifies the edits which are present between {@code commitA} and {@code commitB} due to other
+   * commits in between those two. Edits which cannot be clearly attributed to those other commits
+   * (because they overlap with modifications introduced by {@code commitA} or {@code commitB}) are
+   * omitted from the result. The edits are expressed as differences between {@code treeA} of {@code
+   * commitA} and {@code treeB} of {@code commitB}.
+   *
+   * <p><b>Note:</b> If one of the commits is a merge commit, an empty {@code Multimap} will be
+   * returned.
+   *
+   * <p><b>Warning:</b> This method assumes that commitA and commitB are either a parent and child
+   * commit or represent two patch sets which belong to the same change. No checks are made to
+   * confirm this assumption! Passing arbitrary commits to this method may lead to strange results
+   * or take very long.
+   *
+   * <p>This logic could be expanded to arbitrary commits if the following adjustments were applied:
+   *
+   * <ul>
+   *   <li>If {@code commitA} is an ancestor of {@code commitB} (or the other way around), {@code
+   *       commitA} (or {@code commitB}) is used instead of its parent in this method.
+   *   <li>Special handling for merge commits is added. If only one of them is a merge commit, the
+   *       whole computation has to be done between the single parent and all parents of the merge
+   *       commit. If both of them are merge commits, all combinations of parents have to be
+   *       considered. Alternatively, we could decide to not support this feature for merge commits
+   *       (or just for specific types of merge commits).
+   * </ul>
+   *
+   * @param commitA the commit defining {@code treeA}
+   * @param commitB the commit defining {@code treeB}
+   * @param diffEntries the list of {@code DiffEntries} for the diff between {@code commitA} and
+   *     {@code commitB}
+   * @param df the {@code DiffFormatter}
+   * @param rw the current {@code RevWalk}
+   * @return an aggregated result of the computation
+   * @throws PatchListNotAvailableException if the edits can't be identified
+   * @throws IOException if an error occurred while accessing the repository
+   */
+  private EditsDueToRebaseResult determineEditsDueToRebase(
+      RevCommit commitA,
+      RevCommit commitB,
+      List<DiffEntry> diffEntries,
+      DiffFormatter df,
+      RevWalk rw)
+      throws PatchListNotAvailableException, IOException {
+    if (commitA == null
+        || isRootOrMergeCommit(commitA)
+        || isRootOrMergeCommit(commitB)
+        || areParentChild(commitA, commitB)
+        || haveCommonParent(commitA, commitB)) {
+      return EditsDueToRebaseResult.create(diffEntries, ImmutableMultimap.of());
+    }
+
+    PatchListKey oldKey = PatchListKey.againstDefaultBase(key.getOldId(), key.getWhitespace());
+    PatchList oldPatchList = patchListCache.get(oldKey, project);
+    PatchListKey newKey = PatchListKey.againstDefaultBase(key.getNewId(), key.getWhitespace());
+    PatchList newPatchList = patchListCache.get(newKey, project);
+
+    List<PatchListEntry> oldPatches = oldPatchList.getPatches();
+    List<PatchListEntry> newPatches = newPatchList.getPatches();
+    // TODO(aliceks): Have separate but more limited lists for parents and patch sets (but don't
+    // mess up renames/copies).
+    Set<String> touchedFilePaths = new HashSet<>();
+    for (PatchListEntry patchListEntry : oldPatches) {
+      touchedFilePaths.addAll(getTouchedFilePaths(patchListEntry));
+    }
+    for (PatchListEntry patchListEntry : newPatches) {
+      touchedFilePaths.addAll(getTouchedFilePaths(patchListEntry));
+    }
+
+    List<DiffEntry> relevantDiffEntries =
+        diffEntries.stream()
+            .filter(diffEntry -> isTouched(touchedFilePaths, diffEntry))
+            .collect(toImmutableList());
+
+    RevCommit parentCommitA = commitA.getParent(0);
+    rw.parseBody(parentCommitA);
+    RevCommit parentCommitB = commitB.getParent(0);
+    rw.parseBody(parentCommitB);
+    List<DiffEntry> parentDiffEntries = df.scan(parentCommitA, parentCommitB);
+    // TODO(aliceks): Find a way to not construct a PatchListEntry as it contains many unnecessary
+    // details and we don't fill all of them properly.
+    List<PatchListEntry> parentPatchListEntries =
+        getRelevantPatchListEntries(
+            parentDiffEntries, parentCommitA, parentCommitB, touchedFilePaths, df);
+
+    EditTransformer editTransformer = new EditTransformer(parentPatchListEntries);
+    editTransformer.transformReferencesOfSideA(oldPatches);
+    editTransformer.transformReferencesOfSideB(newPatches);
+    return EditsDueToRebaseResult.create(
+        relevantDiffEntries, editTransformer.getEditsPerFilePath());
+  }
+
+  private static boolean isRootOrMergeCommit(RevCommit commit) {
+    return commit.getParentCount() != 1;
+  }
+
+  private static boolean areParentChild(RevCommit commitA, RevCommit commitB) {
+    return ObjectId.equals(commitA.getParent(0), commitB)
+        || ObjectId.equals(commitB.getParent(0), commitA);
+  }
+
+  private static boolean haveCommonParent(RevCommit commitA, RevCommit commitB) {
+    return ObjectId.equals(commitA.getParent(0), commitB.getParent(0));
+  }
+
+  private static Set<String> getTouchedFilePaths(PatchListEntry patchListEntry) {
+    String oldFilePath = patchListEntry.getOldName();
+    String newFilePath = patchListEntry.getNewName();
+
+    return oldFilePath == null
+        ? ImmutableSet.of(newFilePath)
+        : ImmutableSet.of(oldFilePath, newFilePath);
+  }
+
+  private static boolean isTouched(Set<String> touchedFilePaths, DiffEntry diffEntry) {
+    String oldFilePath = diffEntry.getOldPath();
+    String newFilePath = diffEntry.getNewPath();
+    // One of the above file paths could be /dev/null but we need not explicitly check for this
+    // value as the set of file paths shouldn't contain it.
+    return touchedFilePaths.contains(oldFilePath) || touchedFilePaths.contains(newFilePath);
+  }
+
+  private List<PatchListEntry> getRelevantPatchListEntries(
+      List<DiffEntry> parentDiffEntries,
+      RevCommit parentCommitA,
+      RevCommit parentCommitB,
+      Set<String> touchedFilePaths,
+      DiffFormatter diffFormatter)
+      throws IOException {
+    List<PatchListEntry> parentPatchListEntries = new ArrayList<>(parentDiffEntries.size());
+    for (DiffEntry parentDiffEntry : parentDiffEntries) {
+      if (!isTouched(touchedFilePaths, parentDiffEntry)) {
+        continue;
+      }
+      FileHeader fileHeader = toFileHeader(parentCommitB, diffFormatter, parentDiffEntry);
+      // The code which uses this PatchListEntry doesn't care about the last three parameters. As
+      // they are expensive to compute, we use arbitrary values for them.
+      PatchListEntry patchListEntry =
+          newEntry(parentCommitA.getTree(), fileHeader, ImmutableSet.of(), 0, 0);
+      parentPatchListEntries.add(patchListEntry);
+    }
+    return parentPatchListEntries;
+  }
+
+  private static Set<ContextAwareEdit> getEditsDueToRebase(
+      Multimap<String, ContextAwareEdit> editsDueToRebasePerFilePath, DiffEntry diffEntry) {
+    if (editsDueToRebasePerFilePath.isEmpty()) {
+      return ImmutableSet.of();
+    }
+
+    String filePath = diffEntry.getNewPath();
+    if (diffEntry.getChangeType() == ChangeType.DELETE) {
+      filePath = diffEntry.getOldPath();
+    }
+    return ImmutableSet.copyOf(editsDueToRebasePerFilePath.get(filePath));
+  }
+
+  private Optional<PatchListEntry> getPatchListEntry(
+      ObjectReader objectReader,
+      DiffFormatter diffFormatter,
+      DiffEntry diffEntry,
+      RevTree treeA,
+      RevTree treeB,
+      Set<ContextAwareEdit> editsDueToRebase)
+      throws IOException {
+    FileHeader fileHeader = toFileHeader(key.getNewId(), diffFormatter, diffEntry);
+    long oldSize = getFileSize(objectReader, diffEntry.getOldMode(), diffEntry.getOldPath(), treeA);
+    long newSize = getFileSize(objectReader, diffEntry.getNewMode(), diffEntry.getNewPath(), treeB);
+    Set<Edit> contentEditsDueToRebase = getContentEdits(editsDueToRebase);
+    PatchListEntry patchListEntry =
+        newEntry(treeA, fileHeader, contentEditsDueToRebase, newSize, newSize - oldSize);
+    // All edits in a file are due to rebase -> exclude the file from the diff.
+    if (EditTransformer.toEdits(patchListEntry).allMatch(editsDueToRebase::contains)) {
+      return Optional.empty();
+    }
+    return Optional.of(patchListEntry);
+  }
+
+  private static Set<Edit> getContentEdits(Set<ContextAwareEdit> editsDueToRebase) {
+    return editsDueToRebase.stream()
+        .map(ContextAwareEdit::toEdit)
+        .filter(Optional::isPresent)
+        .map(Optional::get)
+        .collect(toSet());
+  }
+
+  private ComparisonType getComparisonType(RevObject a, RevCommit b) {
+    for (int i = 0; i < b.getParentCount(); i++) {
+      if (b.getParent(i).equals(a)) {
+        return ComparisonType.againstParent(i + 1);
+      }
+    }
+
+    if (key.getOldId() == null && b.getParentCount() > 0) {
+      return ComparisonType.againstAutoMerge();
+    }
+
+    return ComparisonType.againstOtherPatchSet();
+  }
+
+  private static long getFileSize(ObjectReader reader, FileMode mode, String path, RevTree t)
+      throws IOException {
+    if (!isBlob(mode)) {
+      return 0;
+    }
+    try (TreeWalk tw = TreeWalk.forPath(reader, path, t)) {
+      return tw != null ? reader.open(tw.getObjectId(0), OBJ_BLOB).getSize() : 0;
+    }
+  }
+
+  private static boolean isBlob(FileMode mode) {
+    int t = mode.getBits() & FileMode.TYPE_MASK;
+    return t == FileMode.TYPE_FILE || t == FileMode.TYPE_SYMLINK;
+  }
+
+  private FileHeader toFileHeader(
+      ObjectId commitB, DiffFormatter diffFormatter, DiffEntry diffEntry) throws IOException {
+
+    Future<FileHeader> result =
+        diffExecutor.submit(
+            () -> {
+              synchronized (diffEntry) {
+                return diffFormatter.toFileHeader(diffEntry);
+              }
+            });
+
+    try {
+      return result.get(timeoutMillis, TimeUnit.MILLISECONDS);
+    } catch (InterruptedException | TimeoutException e) {
+      logger.atWarning().log(
+          "%s ms timeout reached for Diff loader in project %s"
+              + " on commit %s on path %s comparing %s..%s",
+          timeoutMillis,
+          project,
+          commitB.name(),
+          diffEntry.getNewPath(),
+          diffEntry.getOldId().name(),
+          diffEntry.getNewId().name());
+      result.cancel(true);
+      synchronized (diffEntry) {
+        return toFileHeaderWithoutMyersDiff(diffFormatter, diffEntry);
+      }
+    } catch (ExecutionException e) {
+      // If there was an error computing the result, carry it
+      // up to the caller so the cache knows this key is invalid.
+      Throwables.throwIfInstanceOf(e.getCause(), IOException.class);
+      throw new IOException(e.getMessage(), e.getCause());
+    }
+  }
+
+  private FileHeader toFileHeaderWithoutMyersDiff(DiffFormatter diffFormatter, DiffEntry diffEntry)
+      throws IOException {
+    HistogramDiff histogramDiff = new HistogramDiff();
+    histogramDiff.setFallbackAlgorithm(null);
+    diffFormatter.setDiffAlgorithm(histogramDiff);
+    return diffFormatter.toFileHeader(diffEntry);
+  }
+
+  private PatchListEntry newCommitMessage(
+      RawTextComparator cmp, ObjectReader reader, RevCommit aCommit, RevCommit bCommit)
+      throws IOException {
+    Text aText = aCommit != null ? Text.forCommit(reader, aCommit) : Text.EMPTY;
+    Text bText = Text.forCommit(reader, bCommit);
+    return createPatchListEntry(cmp, aCommit, aText, bText, Patch.COMMIT_MSG);
+  }
+
+  private PatchListEntry newMergeList(
+      RawTextComparator cmp,
+      ObjectReader reader,
+      RevCommit aCommit,
+      RevCommit bCommit,
+      ComparisonType comparisonType)
+      throws IOException {
+    Text aText = aCommit != null ? Text.forMergeList(comparisonType, reader, aCommit) : Text.EMPTY;
+    Text bText = Text.forMergeList(comparisonType, reader, bCommit);
+    return createPatchListEntry(cmp, aCommit, aText, bText, Patch.MERGE_LIST);
+  }
+
+  private static PatchListEntry createPatchListEntry(
+      RawTextComparator cmp, RevCommit aCommit, Text aText, Text bText, String fileName) {
+    byte[] rawHdr = getRawHeader(aCommit != null, fileName);
+    byte[] aContent = aText.getContent();
+    byte[] bContent = bText.getContent();
+    long size = bContent.length;
+    long sizeDelta = size - aContent.length;
+    RawText aRawText = new RawText(aContent);
+    RawText bRawText = new RawText(bContent);
+    EditList edits = new HistogramDiff().diff(cmp, aRawText, bRawText);
+    FileHeader fh = new FileHeader(rawHdr, edits, PatchType.UNIFIED);
+    return new PatchListEntry(fh, edits, ImmutableSet.of(), size, sizeDelta);
+  }
+
+  private static byte[] getRawHeader(boolean hasA, String fileName) {
+    StringBuilder hdr = new StringBuilder();
+    hdr.append("diff --git");
+    if (hasA) {
+      hdr.append(" a/").append(fileName);
+    } else {
+      hdr.append(" ").append(FileHeader.DEV_NULL);
+    }
+    hdr.append(" b/").append(fileName);
+    hdr.append("\n");
+
+    if (hasA) {
+      hdr.append("--- a/").append(fileName).append("\n");
+    } else {
+      hdr.append("--- ").append(FileHeader.DEV_NULL).append("\n");
+    }
+    hdr.append("+++ b/").append(fileName).append("\n");
+    return hdr.toString().getBytes(UTF_8);
+  }
+
+  private static PatchListEntry newEntry(
+      RevTree aTree, FileHeader fileHeader, Set<Edit> editsDueToRebase, long size, long sizeDelta) {
+    if (aTree == null // want combined diff
+        || fileHeader.getPatchType() != PatchType.UNIFIED
+        || fileHeader.getHunks().isEmpty()) {
+      return new PatchListEntry(fileHeader, ImmutableList.of(), ImmutableSet.of(), size, sizeDelta);
+    }
+
+    List<Edit> edits = fileHeader.toEditList();
+    if (edits.isEmpty()) {
+      return new PatchListEntry(fileHeader, ImmutableList.of(), ImmutableSet.of(), size, sizeDelta);
+    }
+    return new PatchListEntry(fileHeader, edits, editsDueToRebase, size, sizeDelta);
+  }
+
+  private RevObject aFor(
+      PatchListKey key, Repository repo, RevWalk rw, ObjectInserter ins, RevCommit b)
+      throws IOException {
+    if (key.getOldId() != null) {
+      return rw.parseAny(key.getOldId());
+    }
+
+    switch (b.getParentCount()) {
+      case 0:
+        return rw.parseAny(emptyTree(ins));
+      case 1:
+        {
+          RevCommit r = b.getParent(0);
+          rw.parseBody(r);
+          return r;
+        }
+      case 2:
+        if (key.getParentNum() != null) {
+          RevCommit r = b.getParent(key.getParentNum() - 1);
+          rw.parseBody(r);
+          return r;
+        }
+        return autoMerger.merge(repo, rw, ins, b, mergeStrategy);
+      default:
+        // TODO(sop) handle an octopus merge.
+        return null;
+    }
+  }
+
+  private static ObjectId emptyTree(ObjectInserter ins) throws IOException {
+    ObjectId id = ins.insert(Constants.OBJ_TREE, new byte[] {});
+    ins.flush();
+    return id;
+  }
+
+  @AutoValue
+  abstract static class EditsDueToRebaseResult {
+    public static EditsDueToRebaseResult create(
+        List<DiffEntry> relevantDiffEntries,
+        Multimap<String, ContextAwareEdit> editsDueToRebasePerFilePath) {
+      return new AutoValue_PatchListLoader_EditsDueToRebaseResult(
+          relevantDiffEntries, editsDueToRebasePerFilePath);
+    }
+
+    public abstract List<DiffEntry> getRelevantOriginalDiffEntries();
+
+    /** Returns the edits per file path they modify in {@code treeB}. */
+    public abstract Multimap<String, ContextAwareEdit> getEditsDueToRebasePerFilePath();
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListNotAvailableException.java b/java/com/google/gerrit/server/patch/PatchListNotAvailableException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListNotAvailableException.java
rename to java/com/google/gerrit/server/patch/PatchListNotAvailableException.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListObjectTooLargeException.java b/java/com/google/gerrit/server/patch/PatchListObjectTooLargeException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListObjectTooLargeException.java
rename to java/com/google/gerrit/server/patch/PatchListObjectTooLargeException.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListWeigher.java b/java/com/google/gerrit/server/patch/PatchListWeigher.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListWeigher.java
rename to java/com/google/gerrit/server/patch/PatchListWeigher.java
diff --git a/java/com/google/gerrit/server/patch/PatchScriptBuilder.java b/java/com/google/gerrit/server/patch/PatchScriptBuilder.java
new file mode 100644
index 0000000..61f0180
--- /dev/null
+++ b/java/com/google/gerrit/server/patch/PatchScriptBuilder.java
@@ -0,0 +1,620 @@
+// Copyright (C) 2009 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.google.gerrit.server.patch;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Comparator.comparing;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.common.data.CommentDetail;
+import com.google.gerrit.common.data.PatchScript;
+import com.google.gerrit.common.data.PatchScript.DisplayMethod;
+import com.google.gerrit.extensions.client.DiffPreferencesInfo;
+import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
+import com.google.gerrit.prettify.common.EditList;
+import com.google.gerrit.prettify.common.SparseFileContent;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.mime.FileTypeRegistry;
+import com.google.inject.Inject;
+import eu.medsea.mimeutil.MimeType;
+import eu.medsea.mimeutil.MimeUtil2;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Optional;
+import org.eclipse.jgit.diff.Edit;
+import org.eclipse.jgit.errors.CorruptObjectException;
+import org.eclipse.jgit.errors.IncorrectObjectTypeException;
+import org.eclipse.jgit.errors.MissingObjectException;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.FileMode;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevTree;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.treewalk.TreeWalk;
+
+class PatchScriptBuilder {
+  static final int MAX_CONTEXT = 5000000;
+  static final int BIG_FILE = 9000;
+
+  private static final Comparator<Edit> EDIT_SORT = comparing(Edit::getBeginA);
+
+  private Repository db;
+  private Project.NameKey projectKey;
+  private ObjectReader reader;
+  private Change change;
+  private DiffPreferencesInfo diffPrefs;
+  private ComparisonType comparisonType;
+  private ObjectId aId;
+  private ObjectId bId;
+
+  private final Side a;
+  private final Side b;
+
+  private List<Edit> edits;
+  private final FileTypeRegistry registry;
+  private final PatchListCache patchListCache;
+  private int context;
+
+  @Inject
+  PatchScriptBuilder(FileTypeRegistry ftr, PatchListCache plc) {
+    a = new Side();
+    b = new Side();
+    registry = ftr;
+    patchListCache = plc;
+  }
+
+  void setRepository(Repository r, Project.NameKey projectKey) {
+    this.db = r;
+    this.projectKey = projectKey;
+  }
+
+  void setChange(Change c) {
+    this.change = c;
+  }
+
+  void setDiffPrefs(DiffPreferencesInfo dp) {
+    diffPrefs = dp;
+
+    context = diffPrefs.context;
+    if (context == DiffPreferencesInfo.WHOLE_FILE_CONTEXT) {
+      context = MAX_CONTEXT;
+    } else if (context > MAX_CONTEXT) {
+      context = MAX_CONTEXT;
+    }
+  }
+
+  void setTrees(ComparisonType ct, ObjectId a, ObjectId b) {
+    comparisonType = ct;
+    aId = a;
+    bId = b;
+  }
+
+  PatchScript toPatchScript(PatchListEntry content, CommentDetail comments, List<Patch> history)
+      throws IOException {
+    reader = db.newObjectReader();
+    try {
+      return build(content, comments, history);
+    } finally {
+      reader.close();
+    }
+  }
+
+  private PatchScript build(PatchListEntry content, CommentDetail comments, List<Patch> history)
+      throws IOException {
+    boolean intralineDifferenceIsPossible = true;
+    boolean intralineFailure = false;
+    boolean intralineTimeout = false;
+
+    a.path = oldName(content);
+    b.path = newName(content);
+
+    a.resolve(null, aId);
+    b.resolve(a, bId);
+
+    edits = new ArrayList<>(content.getEdits());
+    ImmutableSet<Edit> editsDueToRebase = content.getEditsDueToRebase();
+
+    if (!isModify(content)) {
+      intralineDifferenceIsPossible = false;
+    } else if (diffPrefs.intralineDifference) {
+      IntraLineDiff d =
+          patchListCache.getIntraLineDiff(
+              IntraLineDiffKey.create(a.id, b.id, diffPrefs.ignoreWhitespace),
+              IntraLineDiffArgs.create(
+                  a.src, b.src, edits, editsDueToRebase, projectKey, bId, b.path));
+      if (d != null) {
+        switch (d.getStatus()) {
+          case EDIT_LIST:
+            edits = new ArrayList<>(d.getEdits());
+            break;
+
+          case DISABLED:
+            intralineDifferenceIsPossible = false;
+            break;
+
+          case ERROR:
+            intralineDifferenceIsPossible = false;
+            intralineFailure = true;
+            break;
+
+          case TIMEOUT:
+            intralineDifferenceIsPossible = false;
+            intralineTimeout = true;
+            break;
+        }
+      } else {
+        intralineDifferenceIsPossible = false;
+        intralineFailure = true;
+      }
+    }
+
+    correctForDifferencesInNewlineAtEnd();
+
+    if (comments != null) {
+      ensureCommentsVisible(comments);
+    }
+
+    boolean hugeFile = false;
+    if (a.src == b.src && a.size() <= context && content.getEdits().isEmpty()) {
+      // Odd special case; the files are identical (100% rename or copy)
+      // and the user has asked for context that is larger than the file.
+      // Send them the entire file, with an empty edit after the last line.
+      //
+      for (int i = 0; i < a.size(); i++) {
+        a.addLine(i);
+      }
+      edits = new ArrayList<>(1);
+      edits.add(new Edit(a.size(), a.size()));
+
+    } else {
+      if (BIG_FILE < Math.max(a.size(), b.size())) {
+        // IF the file is really large, we disable things to avoid choking
+        // the browser client.
+        //
+        hugeFile = true;
+      }
+
+      // In order to expand the skipped common lines or syntax highlight the
+      // file properly we need to give the client the complete file contents.
+      // So force our context temporarily to the complete file size.
+      //
+      context = MAX_CONTEXT;
+
+      packContent(diffPrefs.ignoreWhitespace != Whitespace.IGNORE_NONE);
+    }
+
+    return new PatchScript(
+        change.getKey(),
+        content.getChangeType(),
+        content.getOldName(),
+        content.getNewName(),
+        a.fileMode,
+        b.fileMode,
+        content.getHeaderLines(),
+        diffPrefs,
+        a.dst,
+        b.dst,
+        edits,
+        editsDueToRebase,
+        a.displayMethod,
+        b.displayMethod,
+        a.mimeType.toString(),
+        b.mimeType.toString(),
+        comments,
+        history,
+        hugeFile,
+        intralineDifferenceIsPossible,
+        intralineFailure,
+        intralineTimeout,
+        content.getPatchType() == Patch.PatchType.BINARY,
+        aId == null ? null : aId.getName(),
+        bId == null ? null : bId.getName());
+  }
+
+  private static boolean isModify(PatchListEntry content) {
+    switch (content.getChangeType()) {
+      case MODIFIED:
+      case COPIED:
+      case RENAMED:
+      case REWRITE:
+        return true;
+
+      case ADDED:
+      case DELETED:
+      default:
+        return false;
+    }
+  }
+
+  private static String oldName(PatchListEntry entry) {
+    switch (entry.getChangeType()) {
+      case ADDED:
+        return null;
+      case DELETED:
+      case MODIFIED:
+      case REWRITE:
+        return entry.getNewName();
+      case COPIED:
+      case RENAMED:
+      default:
+        return entry.getOldName();
+    }
+  }
+
+  private static String newName(PatchListEntry entry) {
+    switch (entry.getChangeType()) {
+      case DELETED:
+        return null;
+      case ADDED:
+      case MODIFIED:
+      case COPIED:
+      case RENAMED:
+      case REWRITE:
+      default:
+        return entry.getNewName();
+    }
+  }
+
+  private void correctForDifferencesInNewlineAtEnd() {
+    // a.src.size() is the size ignoring a newline at the end whereas a.size() considers it.
+    int aSize = a.src.size();
+    int bSize = b.src.size();
+
+    if (edits.isEmpty() && (aSize == 0 || bSize == 0)) {
+      // The diff was requested for a file which was either added or deleted but which JGit doesn't
+      // consider a file addition/deletion (e.g. requesting a diff for the old file name of a
+      // renamed file looks like a deletion).
+      return;
+    }
+
+    Optional<Edit> lastEdit = getLast(edits);
+    if (isNewlineAtEndDeleted()) {
+      Optional<Edit> lastLineEdit = lastEdit.filter(edit -> edit.getEndA() == aSize);
+      if (lastLineEdit.isPresent()) {
+        lastLineEdit.get().extendA();
+      } else {
+        Edit newlineEdit = new Edit(aSize, aSize + 1, bSize, bSize);
+        edits.add(newlineEdit);
+      }
+    } else if (isNewlineAtEndAdded()) {
+      Optional<Edit> lastLineEdit = lastEdit.filter(edit -> edit.getEndB() == bSize);
+      if (lastLineEdit.isPresent()) {
+        lastLineEdit.get().extendB();
+      } else {
+        Edit newlineEdit = new Edit(aSize, aSize, bSize, bSize + 1);
+        edits.add(newlineEdit);
+      }
+    }
+  }
+
+  private static <T> Optional<T> getLast(List<T> list) {
+    return list.isEmpty() ? Optional.empty() : Optional.ofNullable(list.get(list.size() - 1));
+  }
+
+  private boolean isNewlineAtEndDeleted() {
+    return !a.src.isMissingNewlineAtEnd() && b.src.isMissingNewlineAtEnd();
+  }
+
+  private boolean isNewlineAtEndAdded() {
+    return a.src.isMissingNewlineAtEnd() && !b.src.isMissingNewlineAtEnd();
+  }
+
+  private void ensureCommentsVisible(CommentDetail comments) {
+    if (comments.getCommentsA().isEmpty() && comments.getCommentsB().isEmpty()) {
+      // No comments, no additional dummy edits are required.
+      //
+      return;
+    }
+
+    // Construct empty Edit blocks around each location where a comment is.
+    // This will force the later packContent method to include the regions
+    // containing comments, potentially combining those regions together if
+    // they have overlapping contexts. UI renders will also be able to make
+    // correct hunks from this, but because the Edit is empty they will not
+    // style it specially.
+    //
+    final List<Edit> empty = new ArrayList<>();
+    int lastLine;
+
+    lastLine = -1;
+    for (Comment c : comments.getCommentsA()) {
+      final int a = c.lineNbr;
+      if (lastLine != a) {
+        final int b = mapA2B(a - 1);
+        if (0 <= b) {
+          safeAdd(empty, new Edit(a - 1, b));
+        }
+        lastLine = a;
+      }
+    }
+
+    lastLine = -1;
+    for (Comment c : comments.getCommentsB()) {
+      int b = c.lineNbr;
+      if (lastLine != b) {
+        final int a = mapB2A(b - 1);
+        if (0 <= a) {
+          safeAdd(empty, new Edit(a, b - 1));
+        }
+        lastLine = b;
+      }
+    }
+
+    // Sort the final list by the index in A, so packContent can combine
+    // them correctly later.
+    //
+    edits.addAll(empty);
+    edits.sort(EDIT_SORT);
+  }
+
+  private void safeAdd(List<Edit> empty, Edit toAdd) {
+    final int a = toAdd.getBeginA();
+    final int b = toAdd.getBeginB();
+    for (Edit e : edits) {
+      if (e.getBeginA() <= a && a <= e.getEndA()) {
+        return;
+      }
+      if (e.getBeginB() <= b && b <= e.getEndB()) {
+        return;
+      }
+    }
+    empty.add(toAdd);
+  }
+
+  private int mapA2B(int a) {
+    if (edits.isEmpty()) {
+      // Magic special case of an unmodified file.
+      //
+      return a;
+    }
+
+    for (int i = 0; i < edits.size(); i++) {
+      final Edit e = edits.get(i);
+      if (a < e.getBeginA()) {
+        if (i == 0) {
+          // Special case of context at start of file.
+          //
+          return a;
+        }
+        return e.getBeginB() - (e.getBeginA() - a);
+      }
+      if (e.getBeginA() <= a && a <= e.getEndA()) {
+        return -1;
+      }
+    }
+
+    final Edit last = edits.get(edits.size() - 1);
+    return last.getEndB() + (a - last.getEndA());
+  }
+
+  private int mapB2A(int b) {
+    if (edits.isEmpty()) {
+      // Magic special case of an unmodified file.
+      //
+      return b;
+    }
+
+    for (int i = 0; i < edits.size(); i++) {
+      final Edit e = edits.get(i);
+      if (b < e.getBeginB()) {
+        if (i == 0) {
+          // Special case of context at start of file.
+          //
+          return b;
+        }
+        return e.getBeginA() - (e.getBeginB() - b);
+      }
+      if (e.getBeginB() <= b && b <= e.getEndB()) {
+        return -1;
+      }
+    }
+
+    final Edit last = edits.get(edits.size() - 1);
+    return last.getEndA() + (b - last.getEndB());
+  }
+
+  private void packContent(boolean ignoredWhitespace) {
+    EditList list = new EditList(edits, context, a.size(), b.size());
+    for (EditList.Hunk hunk : list.getHunks()) {
+      while (hunk.next()) {
+        if (hunk.isContextLine()) {
+          String lineA = a.getSourceLine(hunk.getCurA());
+          a.dst.addLine(hunk.getCurA(), lineA);
+
+          if (ignoredWhitespace) {
+            // If we ignored whitespace in some form, also get the line
+            // from b when it does not exactly match the line from a.
+            //
+            String lineB = b.getSourceLine(hunk.getCurB());
+            if (!lineA.equals(lineB)) {
+              b.dst.addLine(hunk.getCurB(), lineB);
+            }
+          }
+          hunk.incBoth();
+          continue;
+        }
+
+        if (hunk.isDeletedA()) {
+          a.addLine(hunk.getCurA());
+          hunk.incA();
+        }
+
+        if (hunk.isInsertedB()) {
+          b.addLine(hunk.getCurB());
+          hunk.incB();
+        }
+      }
+    }
+  }
+
+  private class Side {
+    String path;
+    ObjectId id;
+    FileMode mode;
+    byte[] srcContent;
+    Text src;
+    MimeType mimeType = MimeUtil2.UNKNOWN_MIME_TYPE;
+    DisplayMethod displayMethod = DisplayMethod.DIFF;
+    PatchScript.FileMode fileMode = PatchScript.FileMode.FILE;
+    final SparseFileContent dst = new SparseFileContent();
+
+    int size() {
+      if (src == null) {
+        return 0;
+      }
+      if (src.isMissingNewlineAtEnd()) {
+        return src.size();
+      }
+      return src.size() + 1;
+    }
+
+    void addLine(int lineNumber) {
+      String lineContent = getSourceLine(lineNumber);
+      dst.addLine(lineNumber, lineContent);
+    }
+
+    String getSourceLine(int lineNumber) {
+      return lineNumber >= src.size() ? "" : src.getString(lineNumber);
+    }
+
+    void resolve(Side other, ObjectId within) throws IOException {
+      try {
+        final boolean reuse;
+        if (Patch.COMMIT_MSG.equals(path)) {
+          if (comparisonType.isAgainstParentOrAutoMerge()
+              && (aId == within || within.equals(aId))) {
+            id = ObjectId.zeroId();
+            src = Text.EMPTY;
+            srcContent = Text.NO_BYTES;
+            mode = FileMode.MISSING;
+            displayMethod = DisplayMethod.NONE;
+          } else {
+            id = within;
+            src = Text.forCommit(reader, within);
+            srcContent = src.getContent();
+            if (src == Text.EMPTY) {
+              mode = FileMode.MISSING;
+              displayMethod = DisplayMethod.NONE;
+            } else {
+              mode = FileMode.REGULAR_FILE;
+            }
+          }
+          reuse = false;
+        } else if (Patch.MERGE_LIST.equals(path)) {
+          if (comparisonType.isAgainstParentOrAutoMerge()
+              && (aId == within || within.equals(aId))) {
+            id = ObjectId.zeroId();
+            src = Text.EMPTY;
+            srcContent = Text.NO_BYTES;
+            mode = FileMode.MISSING;
+            displayMethod = DisplayMethod.NONE;
+          } else {
+            id = within;
+            src = Text.forMergeList(comparisonType, reader, within);
+            srcContent = src.getContent();
+            if (src == Text.EMPTY) {
+              mode = FileMode.MISSING;
+              displayMethod = DisplayMethod.NONE;
+            } else {
+              mode = FileMode.REGULAR_FILE;
+            }
+          }
+          reuse = false;
+        } else {
+          final TreeWalk tw = find(within);
+
+          id = tw != null ? tw.getObjectId(0) : ObjectId.zeroId();
+          mode = tw != null ? tw.getFileMode(0) : FileMode.MISSING;
+          reuse =
+              other != null
+                  && other.id.equals(id)
+                  && (other.mode == mode || isBothFile(other.mode, mode));
+
+          if (reuse) {
+            srcContent = other.srcContent;
+
+          } else if (mode.getObjectType() == Constants.OBJ_BLOB) {
+            srcContent = Text.asByteArray(db.open(id, Constants.OBJ_BLOB));
+
+          } else if (mode.getObjectType() == Constants.OBJ_COMMIT) {
+            String strContent = "Subproject commit " + ObjectId.toString(id);
+            srcContent = strContent.getBytes(UTF_8);
+
+          } else {
+            srcContent = Text.NO_BYTES;
+          }
+
+          if (reuse) {
+            mimeType = other.mimeType;
+            displayMethod = other.displayMethod;
+            src = other.src;
+
+          } else if (srcContent.length > 0 && FileMode.SYMLINK != mode) {
+            mimeType = registry.getMimeType(path, srcContent);
+            if ("image".equals(mimeType.getMediaType()) && registry.isSafeInline(mimeType)) {
+              displayMethod = DisplayMethod.IMG;
+            }
+          }
+        }
+
+        if (mode == FileMode.MISSING) {
+          displayMethod = DisplayMethod.NONE;
+        }
+
+        if (!reuse) {
+          if (srcContent == Text.NO_BYTES) {
+            src = Text.EMPTY;
+          } else {
+            src = new Text(srcContent);
+          }
+        }
+
+        dst.setSize(size());
+
+        if (mode == FileMode.SYMLINK) {
+          fileMode = PatchScript.FileMode.SYMLINK;
+        } else if (mode == FileMode.GITLINK) {
+          fileMode = PatchScript.FileMode.GITLINK;
+        }
+      } catch (IOException err) {
+        throw new IOException("Cannot read " + within.name() + ":" + path, err);
+      }
+    }
+
+    private TreeWalk find(ObjectId within)
+        throws MissingObjectException, IncorrectObjectTypeException, CorruptObjectException,
+            IOException {
+      if (path == null || within == null) {
+        return null;
+      }
+      try (RevWalk rw = new RevWalk(reader)) {
+        final RevTree tree = rw.parseTree(within);
+        return TreeWalk.forPath(reader, path, tree);
+      }
+    }
+  }
+
+  private static boolean isBothFile(FileMode a, FileMode b) {
+    return (a.getBits() & FileMode.TYPE_FILE) == FileMode.TYPE_FILE
+        && (b.getBits() & FileMode.TYPE_FILE) == FileMode.TYPE_FILE;
+  }
+}
diff --git a/java/com/google/gerrit/server/patch/PatchScriptFactory.java b/java/com/google/gerrit/server/patch/PatchScriptFactory.java
new file mode 100644
index 0000000..b1e0e3c
--- /dev/null
+++ b/java/com/google/gerrit/server/patch/PatchScriptFactory.java
@@ -0,0 +1,417 @@
+// Copyright (C) 2009 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.google.gerrit.server.patch;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.CommentDetail;
+import com.google.gerrit.common.data.PatchScript;
+import com.google.gerrit.extensions.client.DiffPreferencesInfo;
+import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.reviewdb.client.Patch.ChangeType;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.edit.ChangeEdit;
+import com.google.gerrit.server.edit.ChangeEditUtil;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.LargeObjectException;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.InvalidChangeOperationException;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.Assisted;
+import com.google.inject.assistedinject.AssistedInject;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.Callable;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+
+public class PatchScriptFactory implements Callable<PatchScript> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public interface Factory {
+    PatchScriptFactory create(
+        ChangeNotes notes,
+        String fileName,
+        @Assisted("patchSetA") PatchSet.Id patchSetA,
+        @Assisted("patchSetB") PatchSet.Id patchSetB,
+        DiffPreferencesInfo diffPrefs);
+
+    PatchScriptFactory create(
+        ChangeNotes notes,
+        String fileName,
+        int parentNum,
+        PatchSet.Id patchSetB,
+        DiffPreferencesInfo diffPrefs);
+  }
+
+  private final GitRepositoryManager repoManager;
+  private final PatchSetUtil psUtil;
+  private final Provider<PatchScriptBuilder> builderFactory;
+  private final PatchListCache patchListCache;
+  private final ReviewDb db;
+  private final CommentsUtil commentsUtil;
+
+  private final String fileName;
+  @Nullable private final PatchSet.Id psa;
+  private final int parentNum;
+  private final PatchSet.Id psb;
+  private final DiffPreferencesInfo diffPrefs;
+  private final ChangeEditUtil editReader;
+  private final Provider<CurrentUser> userProvider;
+  private final PermissionBackend permissionBackend;
+  private final ProjectCache projectCache;
+  private Optional<ChangeEdit> edit;
+
+  private final Change.Id changeId;
+  private boolean loadHistory = true;
+  private boolean loadComments = true;
+
+  private ChangeNotes notes;
+  private ObjectId aId;
+  private ObjectId bId;
+  private List<Patch> history;
+  private CommentDetail comments;
+
+  @AssistedInject
+  PatchScriptFactory(
+      GitRepositoryManager grm,
+      PatchSetUtil psUtil,
+      Provider<PatchScriptBuilder> builderFactory,
+      PatchListCache patchListCache,
+      ReviewDb db,
+      CommentsUtil commentsUtil,
+      ChangeEditUtil editReader,
+      Provider<CurrentUser> userProvider,
+      PermissionBackend permissionBackend,
+      ProjectCache projectCache,
+      @Assisted ChangeNotes notes,
+      @Assisted String fileName,
+      @Assisted("patchSetA") @Nullable PatchSet.Id patchSetA,
+      @Assisted("patchSetB") PatchSet.Id patchSetB,
+      @Assisted DiffPreferencesInfo diffPrefs) {
+    this.repoManager = grm;
+    this.psUtil = psUtil;
+    this.builderFactory = builderFactory;
+    this.patchListCache = patchListCache;
+    this.db = db;
+    this.notes = notes;
+    this.commentsUtil = commentsUtil;
+    this.editReader = editReader;
+    this.userProvider = userProvider;
+    this.permissionBackend = permissionBackend;
+    this.projectCache = projectCache;
+
+    this.fileName = fileName;
+    this.psa = patchSetA;
+    this.parentNum = -1;
+    this.psb = patchSetB;
+    this.diffPrefs = diffPrefs;
+
+    changeId = patchSetB.getParentKey();
+  }
+
+  @AssistedInject
+  PatchScriptFactory(
+      GitRepositoryManager grm,
+      PatchSetUtil psUtil,
+      Provider<PatchScriptBuilder> builderFactory,
+      PatchListCache patchListCache,
+      ReviewDb db,
+      CommentsUtil commentsUtil,
+      ChangeEditUtil editReader,
+      Provider<CurrentUser> userProvider,
+      PermissionBackend permissionBackend,
+      ProjectCache projectCache,
+      @Assisted ChangeNotes notes,
+      @Assisted String fileName,
+      @Assisted int parentNum,
+      @Assisted PatchSet.Id patchSetB,
+      @Assisted DiffPreferencesInfo diffPrefs) {
+    this.repoManager = grm;
+    this.psUtil = psUtil;
+    this.builderFactory = builderFactory;
+    this.patchListCache = patchListCache;
+    this.db = db;
+    this.notes = notes;
+    this.commentsUtil = commentsUtil;
+    this.editReader = editReader;
+    this.userProvider = userProvider;
+    this.permissionBackend = permissionBackend;
+    this.projectCache = projectCache;
+
+    this.fileName = fileName;
+    this.psa = null;
+    this.parentNum = parentNum;
+    this.psb = patchSetB;
+    this.diffPrefs = diffPrefs;
+
+    changeId = patchSetB.getParentKey();
+    checkArgument(parentNum >= 0, "parentNum must be >= 0");
+  }
+
+  public void setLoadHistory(boolean load) {
+    loadHistory = load;
+  }
+
+  public void setLoadComments(boolean load) {
+    loadComments = load;
+  }
+
+  @Override
+  public PatchScript call()
+      throws OrmException, LargeObjectException, AuthException, InvalidChangeOperationException,
+          IOException, PermissionBackendException {
+    if (parentNum < 0) {
+      validatePatchSetId(psa);
+    }
+    validatePatchSetId(psb);
+
+    PatchSet psEntityA = psa != null ? psUtil.get(db, notes, psa) : null;
+    PatchSet psEntityB = psb.get() == 0 ? new PatchSet(psb) : psUtil.get(db, notes, psb);
+    if (psEntityA != null || psEntityB != null) {
+      try {
+        permissionBackend.currentUser().change(notes).database(db).check(ChangePermission.READ);
+      } catch (AuthException e) {
+        throw new NoSuchChangeException(changeId);
+      }
+    }
+
+    if (!projectCache.checkedGet(notes.getProjectName()).statePermitsRead()) {
+      throw new NoSuchChangeException(changeId);
+    }
+
+    try (Repository git = repoManager.openRepository(notes.getProjectName())) {
+      bId = toObjectId(psEntityB);
+      if (parentNum < 0) {
+        aId = psEntityA != null ? toObjectId(psEntityA) : null;
+      }
+
+      try {
+        final PatchList list = listFor(keyFor(diffPrefs.ignoreWhitespace));
+        final PatchScriptBuilder b = newBuilder(list, git);
+        final PatchListEntry content = list.get(fileName);
+
+        loadCommentsAndHistory(content.getChangeType(), content.getOldName(), content.getNewName());
+
+        return b.toPatchScript(content, comments, history);
+      } catch (PatchListNotAvailableException e) {
+        throw new NoSuchChangeException(changeId, e);
+      } catch (IOException e) {
+        logger.atSevere().withCause(e).log("File content unavailable");
+        throw new NoSuchChangeException(changeId, e);
+      } catch (org.eclipse.jgit.errors.LargeObjectException err) {
+        throw new LargeObjectException("File content is too large", err);
+      }
+    } catch (RepositoryNotFoundException e) {
+      logger.atSevere().withCause(e).log("Repository %s not found", notes.getProjectName());
+      throw new NoSuchChangeException(changeId, e);
+    } catch (IOException e) {
+      logger.atSevere().withCause(e).log("Cannot open repository %s", notes.getProjectName());
+      throw new NoSuchChangeException(changeId, e);
+    }
+  }
+
+  private PatchListKey keyFor(Whitespace whitespace) {
+    if (parentNum < 0) {
+      return PatchListKey.againstCommit(aId, bId, whitespace);
+    }
+    return PatchListKey.againstParentNum(parentNum + 1, bId, whitespace);
+  }
+
+  private PatchList listFor(PatchListKey key) throws PatchListNotAvailableException {
+    return patchListCache.get(key, notes.getProjectName());
+  }
+
+  private PatchScriptBuilder newBuilder(PatchList list, Repository git) {
+    final PatchScriptBuilder b = builderFactory.get();
+    b.setRepository(git, notes.getProjectName());
+    b.setChange(notes.getChange());
+    b.setDiffPrefs(diffPrefs);
+    b.setTrees(list.getComparisonType(), list.getOldId(), list.getNewId());
+    return b;
+  }
+
+  private ObjectId toObjectId(PatchSet ps) throws AuthException, IOException, OrmException {
+    if (ps.getId().get() == 0) {
+      return getEditRev();
+    }
+    if (ps.getRevision() == null || ps.getRevision().get() == null) {
+      throw new NoSuchChangeException(changeId);
+    }
+
+    try {
+      return ObjectId.fromString(ps.getRevision().get());
+    } catch (IllegalArgumentException e) {
+      logger.atSevere().log("Patch set %s has invalid revision", ps.getId());
+      throw new NoSuchChangeException(changeId, e);
+    }
+  }
+
+  private ObjectId getEditRev() throws AuthException, IOException, OrmException {
+    edit = editReader.byChange(notes);
+    if (edit.isPresent()) {
+      return edit.get().getEditCommit();
+    }
+    throw new NoSuchChangeException(notes.getChangeId());
+  }
+
+  private void validatePatchSetId(PatchSet.Id psId) throws NoSuchChangeException {
+    if (psId == null) { // OK, means use base;
+    } else if (changeId.equals(psId.getParentKey())) { // OK, same change;
+    } else {
+      throw new NoSuchChangeException(changeId);
+    }
+  }
+
+  private void loadCommentsAndHistory(ChangeType changeType, String oldName, String newName)
+      throws OrmException {
+    Map<Patch.Key, Patch> byKey = new HashMap<>();
+
+    if (loadHistory) {
+      // This seems like a cheap trick. It doesn't properly account for a
+      // file that gets renamed between patch set 1 and patch set 2. We
+      // will wind up packing the wrong Patch object because we didn't do
+      // proper rename detection between the patch sets.
+      //
+      history = new ArrayList<>();
+      for (PatchSet ps : psUtil.byChange(db, notes)) {
+        String name = fileName;
+        if (psa != null) {
+          switch (changeType) {
+            case COPIED:
+            case RENAMED:
+              if (ps.getId().equals(psa)) {
+                name = oldName;
+              }
+              break;
+
+            case MODIFIED:
+            case DELETED:
+            case ADDED:
+            case REWRITE:
+              break;
+          }
+        }
+
+        Patch p = new Patch(new Patch.Key(ps.getId(), name));
+        history.add(p);
+        byKey.put(p.getKey(), p);
+      }
+      if (edit != null && edit.isPresent()) {
+        Patch p = new Patch(new Patch.Key(new PatchSet.Id(psb.getParentKey(), 0), fileName));
+        history.add(p);
+        byKey.put(p.getKey(), p);
+      }
+    }
+
+    if (loadComments && edit == null) {
+      comments = new CommentDetail(psa, psb);
+      switch (changeType) {
+        case ADDED:
+        case MODIFIED:
+          loadPublished(byKey, newName);
+          break;
+
+        case DELETED:
+          loadPublished(byKey, newName);
+          break;
+
+        case COPIED:
+        case RENAMED:
+          if (psa != null) {
+            loadPublished(byKey, oldName);
+          }
+          loadPublished(byKey, newName);
+          break;
+
+        case REWRITE:
+          break;
+      }
+
+      CurrentUser user = userProvider.get();
+      if (user.isIdentifiedUser()) {
+        Account.Id me = user.getAccountId();
+        switch (changeType) {
+          case ADDED:
+          case MODIFIED:
+            loadDrafts(byKey, me, newName);
+            break;
+
+          case DELETED:
+            loadDrafts(byKey, me, newName);
+            break;
+
+          case COPIED:
+          case RENAMED:
+            if (psa != null) {
+              loadDrafts(byKey, me, oldName);
+            }
+            loadDrafts(byKey, me, newName);
+            break;
+
+          case REWRITE:
+            break;
+        }
+      }
+    }
+  }
+
+  private void loadPublished(Map<Patch.Key, Patch> byKey, String file) throws OrmException {
+    for (Comment c : commentsUtil.publishedByChangeFile(db, notes, changeId, file)) {
+      comments.include(notes.getChangeId(), c);
+      PatchSet.Id psId = new PatchSet.Id(notes.getChangeId(), c.key.patchSetId);
+      Patch.Key pKey = new Patch.Key(psId, c.key.filename);
+      Patch p = byKey.get(pKey);
+      if (p != null) {
+        p.setCommentCount(p.getCommentCount() + 1);
+      }
+    }
+  }
+
+  private void loadDrafts(Map<Patch.Key, Patch> byKey, Account.Id me, String file)
+      throws OrmException {
+    for (Comment c : commentsUtil.draftByChangeFileAuthor(db, notes, file, me)) {
+      comments.include(notes.getChangeId(), c);
+      PatchSet.Id psId = new PatchSet.Id(notes.getChangeId(), c.key.patchSetId);
+      Patch.Key pKey = new Patch.Key(psId, c.key.filename);
+      Patch p = byKey.get(pKey);
+      if (p != null) {
+        p.setDraftCount(p.getDraftCount() + 1);
+      }
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchSetInfoFactory.java b/java/com/google/gerrit/server/patch/PatchSetInfoFactory.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchSetInfoFactory.java
rename to java/com/google/gerrit/server/patch/PatchSetInfoFactory.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchSetInfoNotAvailableException.java b/java/com/google/gerrit/server/patch/PatchSetInfoNotAvailableException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchSetInfoNotAvailableException.java
rename to java/com/google/gerrit/server/patch/PatchSetInfoNotAvailableException.java
diff --git a/java/com/google/gerrit/server/patch/Text.java b/java/com/google/gerrit/server/patch/Text.java
new file mode 100644
index 0000000..172dbaf
--- /dev/null
+++ b/java/com/google/gerrit/server/patch/Text.java
@@ -0,0 +1,190 @@
+// Copyright (C) 2009 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.google.gerrit.server.patch;
+
+import static java.nio.charset.StandardCharsets.ISO_8859_1;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.flogger.FluentLogger;
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.nio.charset.IllegalCharsetNameException;
+import java.nio.charset.UnsupportedCharsetException;
+import java.text.SimpleDateFormat;
+import org.eclipse.jgit.diff.RawText;
+import org.eclipse.jgit.errors.LargeObjectException;
+import org.eclipse.jgit.errors.MissingObjectException;
+import org.eclipse.jgit.lib.AnyObjectId;
+import org.eclipse.jgit.lib.ObjectLoader;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.storage.pack.PackConfig;
+import org.eclipse.jgit.util.RawParseUtils;
+import org.mozilla.universalchardet.UniversalDetector;
+
+public class Text extends RawText {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final int bigFileThreshold = PackConfig.DEFAULT_BIG_FILE_THRESHOLD;
+
+  public static final byte[] NO_BYTES = {};
+  public static final Text EMPTY = new Text(NO_BYTES);
+
+  public static Text forCommit(ObjectReader reader, AnyObjectId commitId) throws IOException {
+    try (RevWalk rw = new RevWalk(reader)) {
+      RevCommit c;
+      if (commitId instanceof RevCommit) {
+        c = (RevCommit) commitId;
+      } else {
+        c = rw.parseCommit(commitId);
+      }
+
+      StringBuilder b = new StringBuilder();
+      switch (c.getParentCount()) {
+        case 0:
+          break;
+        case 1:
+          {
+            RevCommit p = c.getParent(0);
+            rw.parseBody(p);
+            b.append("Parent:     ");
+            b.append(reader.abbreviate(p, 8).name());
+            b.append(" (");
+            b.append(p.getShortMessage());
+            b.append(")\n");
+            break;
+          }
+        default:
+          for (int i = 0; i < c.getParentCount(); i++) {
+            RevCommit p = c.getParent(i);
+            rw.parseBody(p);
+            b.append(i == 0 ? "Merge Of:   " : "            ");
+            b.append(reader.abbreviate(p, 8).name());
+            b.append(" (");
+            b.append(p.getShortMessage());
+            b.append(")\n");
+          }
+      }
+      appendPersonIdent(b, "Author", c.getAuthorIdent());
+      appendPersonIdent(b, "Commit", c.getCommitterIdent());
+      b.append("\n");
+      b.append(c.getFullMessage());
+      return new Text(b.toString().getBytes(UTF_8));
+    }
+  }
+
+  public static Text forMergeList(
+      ComparisonType comparisonType, ObjectReader reader, AnyObjectId commitId) throws IOException {
+    try (RevWalk rw = new RevWalk(reader)) {
+      RevCommit c = rw.parseCommit(commitId);
+      StringBuilder b = new StringBuilder();
+      switch (c.getParentCount()) {
+        case 0:
+          break;
+        case 1:
+          {
+            break;
+          }
+        default:
+          int uniterestingParent =
+              comparisonType.isAgainstParent() ? comparisonType.getParentNum() : 1;
+
+          b.append("Merge List:\n\n");
+          for (RevCommit commit : MergeListBuilder.build(rw, c, uniterestingParent)) {
+            b.append("* ");
+            b.append(reader.abbreviate(commit, 8).name());
+            b.append(" ");
+            b.append(commit.getShortMessage());
+            b.append("\n");
+          }
+      }
+      return new Text(b.toString().getBytes(UTF_8));
+    }
+  }
+
+  private static void appendPersonIdent(StringBuilder b, String field, PersonIdent person) {
+    if (person != null) {
+      b.append(field).append(":    ");
+      if (person.getName() != null) {
+        b.append(" ");
+        b.append(person.getName());
+      }
+      if (person.getEmailAddress() != null) {
+        b.append(" <");
+        b.append(person.getEmailAddress());
+        b.append(">");
+      }
+      b.append("\n");
+
+      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ZZZ");
+      sdf.setTimeZone(person.getTimeZone());
+      b.append(field).append("Date: ");
+      b.append(sdf.format(person.getWhen()));
+      b.append("\n");
+    }
+  }
+
+  public static byte[] asByteArray(ObjectLoader ldr)
+      throws MissingObjectException, LargeObjectException, IOException {
+    return ldr.getCachedBytes(bigFileThreshold);
+  }
+
+  private static Charset charset(byte[] content, String encoding) {
+    if (encoding == null) {
+      UniversalDetector d = new UniversalDetector(null);
+      d.handleData(content, 0, content.length);
+      d.dataEnd();
+      encoding = d.getDetectedCharset();
+    }
+    if (encoding == null) {
+      return ISO_8859_1;
+    }
+    try {
+      return Charset.forName(encoding);
+
+    } catch (IllegalCharsetNameException err) {
+      logger.atSevere().log("Invalid detected charset name '%s': %s", encoding, err);
+      return ISO_8859_1;
+
+    } catch (UnsupportedCharsetException err) {
+      logger.atSevere().log("Detected charset '%s' not supported: %s", encoding, err);
+      return ISO_8859_1;
+    }
+  }
+
+  private Charset charset;
+
+  public Text(byte[] r) {
+    super(r);
+  }
+
+  public Text(ObjectLoader ldr) throws MissingObjectException, LargeObjectException, IOException {
+    this(asByteArray(ldr));
+  }
+
+  public byte[] getContent() {
+    return content;
+  }
+
+  @Override
+  protected String decode(int s, int e) {
+    if (charset == null) {
+      charset = charset(content, null);
+    }
+    return RawParseUtils.decode(charset, content, s, e);
+  }
+}
diff --git a/java/com/google/gerrit/server/permissions/ChangeControl.java b/java/com/google/gerrit/server/permissions/ChangeControl.java
new file mode 100644
index 0000000..f4e659e
--- /dev/null
+++ b/java/com/google/gerrit/server/permissions/ChangeControl.java
@@ -0,0 +1,371 @@
+// Copyright (C) 2009 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.google.gerrit.server.permissions;
+
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.gerrit.server.permissions.DefaultPermissionMappings.labelPermissionName;
+import static com.google.gerrit.server.permissions.LabelPermission.ForUser.ON_BEHALF_OF;
+
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.common.data.PermissionRange;
+import com.google.gerrit.extensions.conditions.BooleanCondition;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.permissions.PermissionBackend.ForChange;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.Collection;
+import java.util.EnumSet;
+import java.util.Map;
+import java.util.Set;
+
+/** Access control management for a user accessing a single change. */
+class ChangeControl {
+  @Singleton
+  static class Factory {
+    private final ChangeData.Factory changeDataFactory;
+    private final ChangeNotes.Factory notesFactory;
+
+    @Inject
+    Factory(ChangeData.Factory changeDataFactory, ChangeNotes.Factory notesFactory) {
+      this.changeDataFactory = changeDataFactory;
+      this.notesFactory = notesFactory;
+    }
+
+    ChangeControl create(
+        RefControl refControl, ReviewDb db, Project.NameKey project, Change.Id changeId)
+        throws OrmException {
+      return create(refControl, notesFactory.create(db, project, changeId));
+    }
+
+    ChangeControl create(RefControl refControl, ChangeNotes notes) {
+      return new ChangeControl(changeDataFactory, refControl, notes);
+    }
+  }
+
+  private final ChangeData.Factory changeDataFactory;
+  private final RefControl refControl;
+  private final ChangeNotes notes;
+
+  private ChangeControl(
+      ChangeData.Factory changeDataFactory, RefControl refControl, ChangeNotes notes) {
+    this.changeDataFactory = changeDataFactory;
+    this.refControl = refControl;
+    this.notes = notes;
+  }
+
+  ForChange asForChange(@Nullable ChangeData cd, @Nullable Provider<ReviewDb> db) {
+    return new ForChangeImpl(cd, db);
+  }
+
+  private CurrentUser getUser() {
+    return refControl.getUser();
+  }
+
+  private ProjectControl getProjectControl() {
+    return refControl.getProjectControl();
+  }
+
+  private Change getChange() {
+    return notes.getChange();
+  }
+
+  /** Can this user see this change? */
+  private boolean isVisible(ReviewDb db, @Nullable ChangeData cd) throws OrmException {
+    if (getChange().isPrivate() && !isPrivateVisible(db, cd)) {
+      return false;
+    }
+    return refControl.isVisible();
+  }
+
+  /** Can this user abandon this change? */
+  private boolean canAbandon() {
+    return isOwner() // owner (aka creator) of the change can abandon
+        || refControl.isOwner() // branch owner can abandon
+        || getProjectControl().isOwner() // project owner can abandon
+        || refControl.canPerform(Permission.ABANDON) // user can abandon a specific ref
+        || getProjectControl().isAdmin();
+  }
+
+  /** Can this user rebase this change? */
+  private boolean canRebase() {
+    return (isOwner() || refControl.canSubmit(isOwner()) || refControl.canRebase())
+        && refControl.asForRef().testOrFalse(RefPermission.CREATE_CHANGE);
+  }
+
+  /** Can this user restore this change? */
+  private boolean canRestore() {
+    // Anyone who can abandon the change can restore it, as long as they can create changes.
+    return canAbandon() && refControl.asForRef().testOrFalse(RefPermission.CREATE_CHANGE);
+  }
+
+  /** The range of permitted values associated with a label permission. */
+  private PermissionRange getRange(String permission) {
+    return refControl.getRange(permission, isOwner());
+  }
+
+  /** Can this user add a patch set to this change? */
+  private boolean canAddPatchSet() {
+    if (!refControl.asForRef().testOrFalse(RefPermission.CREATE_CHANGE)) {
+      return false;
+    }
+    if (isOwner()) {
+      return true;
+    }
+    return refControl.canAddPatchSet();
+  }
+
+  /** Is this user the owner of the change? */
+  private boolean isOwner() {
+    if (getUser().isIdentifiedUser()) {
+      Account.Id id = getUser().asIdentifiedUser().getAccountId();
+      return id.equals(getChange().getOwner());
+    }
+    return false;
+  }
+
+  /** Is this user assigned to this change? */
+  private boolean isAssignee() {
+    Account.Id currentAssignee = notes.getChange().getAssignee();
+    if (currentAssignee != null && getUser().isIdentifiedUser()) {
+      Account.Id id = getUser().getAccountId();
+      return id.equals(currentAssignee);
+    }
+    return false;
+  }
+
+  /** Is this user a reviewer for the change? */
+  private boolean isReviewer(ReviewDb db, @Nullable ChangeData cd) throws OrmException {
+    if (getUser().isIdentifiedUser()) {
+      cd = cd != null ? cd : changeDataFactory.create(db, notes);
+      Collection<Account.Id> results = cd.reviewers().all();
+      return results.contains(getUser().getAccountId());
+    }
+    return false;
+  }
+
+  /** Can this user edit the topic name? */
+  private boolean canEditTopicName() {
+    if (getChange().getStatus().isOpen()) {
+      return isOwner() // owner (aka creator) of the change can edit topic
+          || refControl.isOwner() // branch owner can edit topic
+          || getProjectControl().isOwner() // project owner can edit topic
+          || refControl.canPerform(
+              Permission.EDIT_TOPIC_NAME) // user can edit topic on a specific ref
+          || getProjectControl().isAdmin();
+    }
+    return refControl.canForceEditTopicName();
+  }
+
+  /** Can this user edit the description? */
+  private boolean canEditDescription() {
+    if (getChange().getStatus().isOpen()) {
+      return isOwner() // owner (aka creator) of the change can edit desc
+          || refControl.isOwner() // branch owner can edit desc
+          || getProjectControl().isOwner() // project owner can edit desc
+          || getProjectControl().isAdmin();
+    }
+    return false;
+  }
+
+  private boolean canEditAssignee() {
+    return isOwner()
+        || getProjectControl().isOwner()
+        || refControl.canPerform(Permission.EDIT_ASSIGNEE)
+        || isAssignee();
+  }
+
+  /** Can this user edit the hashtag name? */
+  private boolean canEditHashtags() {
+    return isOwner() // owner (aka creator) of the change can edit hashtags
+        || refControl.isOwner() // branch owner can edit hashtags
+        || getProjectControl().isOwner() // project owner can edit hashtags
+        || refControl.canPerform(
+            Permission.EDIT_HASHTAGS) // user can edit hashtag on a specific ref
+        || getProjectControl().isAdmin();
+  }
+
+  private boolean isPrivateVisible(ReviewDb db, ChangeData cd) throws OrmException {
+    return isOwner()
+        || isReviewer(db, cd)
+        || refControl.canPerform(Permission.VIEW_PRIVATE_CHANGES)
+        || getUser().isInternalUser();
+  }
+
+  private class ForChangeImpl extends ForChange {
+    private ChangeData cd;
+    private Map<String, PermissionRange> labels;
+    private String resourcePath;
+
+    ForChangeImpl(@Nullable ChangeData cd, @Nullable Provider<ReviewDb> db) {
+      this.cd = cd;
+      this.db = db;
+    }
+
+    private ReviewDb db() {
+      if (db != null) {
+        return db.get();
+      } else if (cd != null) {
+        return cd.db();
+      } else {
+        return null;
+      }
+    }
+
+    private ChangeData changeData() {
+      if (cd == null) {
+        ReviewDb reviewDb = db();
+        checkState(reviewDb != null, "need ReviewDb");
+        cd = changeDataFactory.create(reviewDb, notes);
+      }
+      return cd;
+    }
+
+    @Override
+    public String resourcePath() {
+      if (resourcePath == null) {
+        resourcePath =
+            String.format(
+                "/projects/%s/+changes/%s",
+                getProjectControl().getProjectState().getName(), changeData().getId().get());
+      }
+      return resourcePath;
+    }
+
+    @Override
+    public void check(ChangePermissionOrLabel perm)
+        throws AuthException, PermissionBackendException {
+      if (!can(perm)) {
+        throw new AuthException(perm.describeForException() + " not permitted");
+      }
+    }
+
+    @Override
+    public <T extends ChangePermissionOrLabel> Set<T> test(Collection<T> permSet)
+        throws PermissionBackendException {
+      Set<T> ok = newSet(permSet);
+      for (T perm : permSet) {
+        if (can(perm)) {
+          ok.add(perm);
+        }
+      }
+      return ok;
+    }
+
+    @Override
+    public BooleanCondition testCond(ChangePermissionOrLabel perm) {
+      return new PermissionBackendCondition.ForChange(this, perm, getUser());
+    }
+
+    private boolean can(ChangePermissionOrLabel perm) throws PermissionBackendException {
+      if (perm instanceof ChangePermission) {
+        return can((ChangePermission) perm);
+      } else if (perm instanceof LabelPermission) {
+        return can((LabelPermission) perm);
+      } else if (perm instanceof LabelPermission.WithValue) {
+        return can((LabelPermission.WithValue) perm);
+      }
+      throw new PermissionBackendException(perm + " unsupported");
+    }
+
+    private boolean can(ChangePermission perm) throws PermissionBackendException {
+      try {
+        switch (perm) {
+          case READ:
+            return isVisible(db(), changeData());
+          case ABANDON:
+            return canAbandon();
+          case DELETE:
+            return (getProjectControl().isAdmin() || (refControl.canDeleteChanges(isOwner())));
+          case ADD_PATCH_SET:
+            return canAddPatchSet();
+          case EDIT_ASSIGNEE:
+            return canEditAssignee();
+          case EDIT_DESCRIPTION:
+            return canEditDescription();
+          case EDIT_HASHTAGS:
+            return canEditHashtags();
+          case EDIT_TOPIC_NAME:
+            return canEditTopicName();
+          case REBASE:
+            return canRebase();
+          case RESTORE:
+            return canRestore();
+          case SUBMIT:
+            return refControl.canSubmit(isOwner());
+
+          case REMOVE_REVIEWER:
+          case SUBMIT_AS:
+            return refControl.canPerform(changePermissionName(perm));
+        }
+      } catch (OrmException e) {
+        throw new PermissionBackendException("unavailable", e);
+      }
+      throw new PermissionBackendException(perm + " unsupported");
+    }
+
+    private boolean can(LabelPermission perm) {
+      return !label(labelPermissionName(perm)).isEmpty();
+    }
+
+    private boolean can(LabelPermission.WithValue perm) {
+      PermissionRange r = label(labelPermissionName(perm));
+      if (perm.forUser() == ON_BEHALF_OF && r.isEmpty()) {
+        return false;
+      }
+      return r.contains(perm.value());
+    }
+
+    private PermissionRange label(String permission) {
+      if (labels == null) {
+        labels = Maps.newHashMapWithExpectedSize(4);
+      }
+      PermissionRange r = labels.get(permission);
+      if (r == null) {
+        r = getRange(permission);
+        labels.put(permission, r);
+      }
+      return r;
+    }
+  }
+
+  private static <T extends ChangePermissionOrLabel> Set<T> newSet(Collection<T> permSet) {
+    if (permSet instanceof EnumSet) {
+      @SuppressWarnings({"unchecked", "rawtypes"})
+      Set<T> s = ((EnumSet) permSet).clone();
+      s.clear();
+      return s;
+    }
+    return Sets.newHashSetWithExpectedSize(permSet.size());
+  }
+
+  private static String changePermissionName(ChangePermission changePermission) {
+    // Within this class, it's programmer error to call this method on a
+    // ChangePermission that isn't associated with a permission name.
+    return DefaultPermissionMappings.changePermissionName(changePermission)
+        .orElseThrow(() -> new IllegalStateException("no name for " + changePermission));
+  }
+}
diff --git a/java/com/google/gerrit/server/permissions/ChangePermission.java b/java/com/google/gerrit/server/permissions/ChangePermission.java
new file mode 100644
index 0000000..ca1c460
--- /dev/null
+++ b/java/com/google/gerrit/server/permissions/ChangePermission.java
@@ -0,0 +1,74 @@
+// Copyright (C) 2017 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.google.gerrit.server.permissions;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.gerrit.extensions.api.access.GerritPermission;
+
+public enum ChangePermission implements ChangePermissionOrLabel {
+  READ,
+  /**
+   * The change can't be restored if its current patch set is locked.
+   *
+   * <p>Before checking this permission, the caller should first verify the current patch set of the
+   * change is not locked by calling {@code PatchSetUtil.isPatchSetLocked}.
+   */
+  RESTORE,
+  DELETE,
+  /**
+   * The change can't be abandoned if its current patch set is locked.
+   *
+   * <p>Before checking this permission, the caller should first verify the current patch set of the
+   * change is not locked by calling {@code PatchSetUtil.isPatchSetLocked}.
+   */
+  ABANDON,
+  EDIT_ASSIGNEE,
+  EDIT_DESCRIPTION,
+  EDIT_HASHTAGS,
+  EDIT_TOPIC_NAME,
+  REMOVE_REVIEWER,
+  /**
+   * A new patch set can't be added if the patch set is locked for the change.
+   *
+   * <p>Before checking this permission, the caller should first verify the current patch set of the
+   * change is not locked by calling {@code PatchSetUtil.isPatchSetLocked}.
+   */
+  ADD_PATCH_SET,
+  /**
+   * The change can't be rebased if its current patch set is locked.
+   *
+   * <p>Before checking this permission, the caller should first verify the current patch set of the
+   * change is not locked by calling {@code PatchSetUtil.isPatchSetLocked}.
+   */
+  REBASE,
+  SUBMIT,
+  SUBMIT_AS("submit on behalf of other users");
+
+  private final String description;
+
+  ChangePermission() {
+    this.description = null;
+  }
+
+  ChangePermission(String description) {
+    this.description = requireNonNull(description);
+  }
+
+  @Override
+  public String describeForException() {
+    return description != null ? description : GerritPermission.describeEnumValue(this);
+  }
+}
diff --git a/java/com/google/gerrit/server/permissions/ChangePermissionOrLabel.java b/java/com/google/gerrit/server/permissions/ChangePermissionOrLabel.java
new file mode 100644
index 0000000..2824efd
--- /dev/null
+++ b/java/com/google/gerrit/server/permissions/ChangePermissionOrLabel.java
@@ -0,0 +1,20 @@
+// Copyright (C) 2017 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.google.gerrit.server.permissions;
+
+import com.google.gerrit.extensions.api.access.GerritPermission;
+
+/** A {@link ChangePermission} or a {@link LabelPermission}. */
+public interface ChangePermissionOrLabel extends GerritPermission {}
diff --git a/java/com/google/gerrit/server/permissions/DefaultPermissionBackend.java b/java/com/google/gerrit/server/permissions/DefaultPermissionBackend.java
new file mode 100644
index 0000000..1782ac9
--- /dev/null
+++ b/java/com/google/gerrit/server/permissions/DefaultPermissionBackend.java
@@ -0,0 +1,280 @@
+// Copyright (C) 2017 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.google.gerrit.server.permissions;
+
+import static com.google.gerrit.server.permissions.DefaultPermissionMappings.globalPermissionName;
+import static java.util.Objects.requireNonNull;
+import static java.util.stream.Collectors.toSet;
+
+import com.google.common.collect.Sets;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.PermissionRule;
+import com.google.gerrit.common.data.PermissionRule.Action;
+import com.google.gerrit.extensions.api.access.GlobalOrPluginPermission;
+import com.google.gerrit.extensions.api.access.PluginPermission;
+import com.google.gerrit.extensions.conditions.BooleanCondition;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.PeerDaemonUser;
+import com.google.gerrit.server.account.CapabilityCollection;
+import com.google.gerrit.server.cache.PerThreadCache;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.Collection;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+
+@Singleton
+public class DefaultPermissionBackend extends PermissionBackend {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final CurrentUser.PropertyKey<Boolean> IS_ADMIN = CurrentUser.PropertyKey.create();
+
+  private final Provider<CurrentUser> currentUser;
+  private final ProjectCache projectCache;
+  private final ProjectControl.Factory projectControlFactory;
+  private final IdentifiedUser.GenericFactory identifiedUserFactory;
+
+  @Inject
+  DefaultPermissionBackend(
+      Provider<CurrentUser> currentUser,
+      ProjectCache projectCache,
+      ProjectControl.Factory projectControlFactory,
+      IdentifiedUser.GenericFactory identifiedUserFactory) {
+    this.currentUser = currentUser;
+    this.projectCache = projectCache;
+    this.projectControlFactory = projectControlFactory;
+    this.identifiedUserFactory = identifiedUserFactory;
+  }
+
+  private CapabilityCollection capabilities() {
+    return projectCache.getAllProjects().getCapabilityCollection();
+  }
+
+  @Override
+  public WithUser currentUser() {
+    return new WithUserImpl(currentUser.get());
+  }
+
+  @Override
+  public WithUser user(CurrentUser user) {
+    return new WithUserImpl(requireNonNull(user, "user"));
+  }
+
+  @Override
+  public WithUser absentUser(Account.Id id) {
+    IdentifiedUser identifiedUser = identifiedUserFactory.create(requireNonNull(id, "user"));
+    return new WithUserImpl(identifiedUser);
+  }
+
+  @Override
+  public boolean usesDefaultCapabilities() {
+    return true;
+  }
+
+  class WithUserImpl extends WithUser {
+    private final CurrentUser user;
+    private Boolean admin;
+
+    WithUserImpl(CurrentUser user) {
+      this.user = requireNonNull(user, "user");
+    }
+
+    @Override
+    public ForProject project(Project.NameKey project) {
+      try {
+        ProjectState state = projectCache.checkedGet(project);
+        ProjectControl control =
+            PerThreadCache.getOrCompute(
+                PerThreadCache.Key.create(ProjectControl.class, project, user.getCacheKey()),
+                () -> projectControlFactory.create(user, state));
+        return control.asForProject().database(db);
+      } catch (Exception e) {
+        Throwable cause = e.getCause() != null ? e.getCause() : e;
+        return FailedPermissionBackend.project(
+            "project '" + project.get() + "' is unavailable", cause);
+      }
+    }
+
+    @Override
+    public void check(GlobalOrPluginPermission perm)
+        throws AuthException, PermissionBackendException {
+      if (!can(perm)) {
+        throw new AuthException(perm.describeForException() + " not permitted");
+      }
+    }
+
+    @Override
+    public <T extends GlobalOrPluginPermission> Set<T> test(Collection<T> permSet)
+        throws PermissionBackendException {
+      Set<T> ok = newSet(permSet);
+      for (T perm : permSet) {
+        if (can(perm)) {
+          ok.add(perm);
+        }
+      }
+      return ok;
+    }
+
+    @Override
+    public BooleanCondition testCond(GlobalOrPluginPermission perm) {
+      return new PermissionBackendCondition.WithUser(this, perm, user);
+    }
+
+    private boolean can(GlobalOrPluginPermission perm) throws PermissionBackendException {
+      if (perm instanceof GlobalPermission) {
+        return can((GlobalPermission) perm);
+      } else if (perm instanceof PluginPermission) {
+        PluginPermission pluginPermission = (PluginPermission) perm;
+        return has(DefaultPermissionMappings.pluginPermissionName(pluginPermission))
+            || (pluginPermission.fallBackToAdmin() && isAdmin());
+      }
+      throw new PermissionBackendException(perm + " unsupported");
+    }
+
+    private boolean can(GlobalPermission perm) throws PermissionBackendException {
+      switch (perm) {
+        case ADMINISTRATE_SERVER:
+          return isAdmin();
+        case EMAIL_REVIEWERS:
+          return canEmailReviewers();
+
+        case FLUSH_CACHES:
+        case KILL_TASK:
+        case RUN_GC:
+        case VIEW_CACHES:
+        case VIEW_QUEUE:
+          return has(globalPermissionName(perm)) || can(GlobalPermission.MAINTAIN_SERVER);
+
+        case CREATE_ACCOUNT:
+        case CREATE_GROUP:
+        case CREATE_PROJECT:
+        case MAINTAIN_SERVER:
+        case MODIFY_ACCOUNT:
+        case READ_AS:
+        case STREAM_EVENTS:
+        case VIEW_ALL_ACCOUNTS:
+        case VIEW_CONNECTIONS:
+        case VIEW_PLUGINS:
+        case VIEW_ACCESS:
+          return has(globalPermissionName(perm)) || isAdmin();
+
+        case ACCESS_DATABASE:
+        case RUN_AS:
+          return has(globalPermissionName(perm));
+      }
+      throw new PermissionBackendException(perm + " unsupported");
+    }
+
+    private boolean isAdmin() {
+      if (admin == null) {
+        admin = computeAdmin();
+        if (admin) {
+          logger.atFinest().log(
+              "user %s is an administrator of the server", user.getLoggableName());
+        } else {
+          logger.atFinest().log(
+              "user %s is not an administrator of the server", user.getLoggableName());
+        }
+      }
+      return admin;
+    }
+
+    private Boolean computeAdmin() {
+      Optional<Boolean> r = user.get(IS_ADMIN);
+      if (r.isPresent()) {
+        return r.get();
+      }
+
+      boolean isAdmin;
+      if (user.isImpersonating()) {
+        isAdmin = false;
+      } else if (user instanceof PeerDaemonUser) {
+        isAdmin = true;
+      } else {
+        isAdmin = allow(capabilities().administrateServer);
+      }
+      user.put(IS_ADMIN, isAdmin);
+      return isAdmin;
+    }
+
+    private boolean canEmailReviewers() {
+      List<PermissionRule> email = capabilities().emailReviewers;
+      if (allow(email)) {
+        logger.atFinest().log(
+            "user %s can email reviewers (allowed by %s)", user.getLoggableName(), email);
+        return true;
+      }
+
+      if (notDenied(email)) {
+        logger.atFinest().log(
+            "user %s can email reviewers (not denied by %s)", user.getLoggableName(), email);
+        return true;
+      }
+
+      logger.atFinest().log("user %s cannot email reviewers", user.getLoggableName());
+      return false;
+    }
+
+    private boolean has(String permissionName) {
+      boolean has = allow(capabilities().getPermission(requireNonNull(permissionName)));
+      if (has) {
+        logger.atFinest().log(
+            "user %s has global capability %s", user.getLoggableName(), permissionName);
+      } else {
+        logger.atFinest().log(
+            "user %s doesn't have global capability %s", user.getLoggableName(), permissionName);
+      }
+      return has;
+    }
+
+    private boolean allow(Collection<PermissionRule> rules) {
+      return user.getEffectiveGroups()
+          .containsAnyOf(
+              rules.stream()
+                  .filter(r -> r.getAction() == Action.ALLOW)
+                  .map(r -> r.getGroup().getUUID())
+                  .collect(toSet()));
+    }
+
+    private boolean notDenied(Collection<PermissionRule> rules) {
+      Set<AccountGroup.UUID> denied =
+          rules.stream()
+              .filter(r -> r.getAction() != Action.ALLOW)
+              .map(r -> r.getGroup().getUUID())
+              .collect(toSet());
+      return denied.isEmpty() || !user.getEffectiveGroups().containsAnyOf(denied);
+    }
+  }
+
+  private static <T extends GlobalOrPluginPermission> Set<T> newSet(Collection<T> permSet) {
+    if (permSet instanceof EnumSet) {
+      @SuppressWarnings({"unchecked", "rawtypes"})
+      Set<T> s = ((EnumSet) permSet).clone();
+      s.clear();
+      return s;
+    }
+    return Sets.newHashSetWithExpectedSize(permSet.size());
+  }
+}
diff --git a/java/com/google/gerrit/server/permissions/DefaultPermissionBackendModule.java b/java/com/google/gerrit/server/permissions/DefaultPermissionBackendModule.java
new file mode 100644
index 0000000..f3a3c78
--- /dev/null
+++ b/java/com/google/gerrit/server/permissions/DefaultPermissionBackendModule.java
@@ -0,0 +1,37 @@
+// Copyright (C) 2017 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.google.gerrit.server.permissions;
+
+import com.google.gerrit.extensions.config.FactoryModule;
+import com.google.inject.AbstractModule;
+
+/** Binds the default {@link PermissionBackend}. */
+public class DefaultPermissionBackendModule extends AbstractModule {
+  @Override
+  protected void configure() {
+    install(new LegacyControlsModule());
+  }
+
+  /** Binds legacy ProjectControl, RefControl, ChangeControl. */
+  public static class LegacyControlsModule extends FactoryModule {
+    @Override
+    protected void configure() {
+      // TODO(hiesel) Hide ProjectControl, RefControl, ChangeControl related bindings.
+      factory(ProjectControl.Factory.class);
+      factory(DefaultRefFilter.Factory.class);
+      bind(ChangeControl.Factory.class);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/permissions/DefaultPermissionMappings.java b/java/com/google/gerrit/server/permissions/DefaultPermissionMappings.java
new file mode 100644
index 0000000..ece29df
--- /dev/null
+++ b/java/com/google/gerrit/server/permissions/DefaultPermissionMappings.java
@@ -0,0 +1,170 @@
+// 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.
+
+package com.google.gerrit.server.permissions;
+
+import static com.google.common.base.Preconditions.checkState;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ImmutableBiMap;
+import com.google.common.collect.ImmutableMap;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.access.GlobalOrPluginPermission;
+import com.google.gerrit.extensions.api.access.PluginPermission;
+import com.google.gerrit.server.permissions.LabelPermission.ForUser;
+import java.util.EnumSet;
+import java.util.Optional;
+import java.util.Set;
+
+/**
+ * Mappings from {@link com.google.gerrit.extensions.api.access.GerritPermission} enum instances to
+ * the permission names used by {@link DefaultPermissionBackend}.
+ *
+ * <p>These should be considered implementation details of {@code DefaultPermissionBackend}; a
+ * backend that doesn't respect the default permission model will not need to consult these.
+ * However, implementations may also choose to respect certain aspects of the default permission
+ * model, so this class is provided as public to aid those implementations.
+ */
+public class DefaultPermissionMappings {
+  private static final ImmutableBiMap<GlobalPermission, String> CAPABILITIES =
+      ImmutableBiMap.<GlobalPermission, String>builder()
+          .put(GlobalPermission.ACCESS_DATABASE, GlobalCapability.ACCESS_DATABASE)
+          .put(GlobalPermission.ADMINISTRATE_SERVER, GlobalCapability.ADMINISTRATE_SERVER)
+          .put(GlobalPermission.CREATE_ACCOUNT, GlobalCapability.CREATE_ACCOUNT)
+          .put(GlobalPermission.CREATE_GROUP, GlobalCapability.CREATE_GROUP)
+          .put(GlobalPermission.CREATE_PROJECT, GlobalCapability.CREATE_PROJECT)
+          .put(GlobalPermission.EMAIL_REVIEWERS, GlobalCapability.EMAIL_REVIEWERS)
+          .put(GlobalPermission.FLUSH_CACHES, GlobalCapability.FLUSH_CACHES)
+          .put(GlobalPermission.KILL_TASK, GlobalCapability.KILL_TASK)
+          .put(GlobalPermission.MAINTAIN_SERVER, GlobalCapability.MAINTAIN_SERVER)
+          .put(GlobalPermission.MODIFY_ACCOUNT, GlobalCapability.MODIFY_ACCOUNT)
+          .put(GlobalPermission.READ_AS, GlobalCapability.READ_AS)
+          .put(GlobalPermission.RUN_AS, GlobalCapability.RUN_AS)
+          .put(GlobalPermission.RUN_GC, GlobalCapability.RUN_GC)
+          .put(GlobalPermission.STREAM_EVENTS, GlobalCapability.STREAM_EVENTS)
+          .put(GlobalPermission.VIEW_ALL_ACCOUNTS, GlobalCapability.VIEW_ALL_ACCOUNTS)
+          .put(GlobalPermission.VIEW_CACHES, GlobalCapability.VIEW_CACHES)
+          .put(GlobalPermission.VIEW_CONNECTIONS, GlobalCapability.VIEW_CONNECTIONS)
+          .put(GlobalPermission.VIEW_PLUGINS, GlobalCapability.VIEW_PLUGINS)
+          .put(GlobalPermission.VIEW_QUEUE, GlobalCapability.VIEW_QUEUE)
+          .put(GlobalPermission.VIEW_ACCESS, GlobalCapability.VIEW_ACCESS)
+          .build();
+
+  static {
+    checkMapContainsAllEnumValues(CAPABILITIES, GlobalPermission.class);
+  }
+
+  private static final ImmutableBiMap<ProjectPermission, String> PROJECT_PERMISSIONS =
+      ImmutableBiMap.<ProjectPermission, String>builder()
+          .put(ProjectPermission.READ, Permission.READ)
+          .build();
+
+  private static final ImmutableBiMap<RefPermission, String> REF_PERMISSIONS =
+      ImmutableBiMap.<RefPermission, String>builder()
+          .put(RefPermission.READ, Permission.READ)
+          .put(RefPermission.CREATE, Permission.CREATE)
+          .put(RefPermission.DELETE, Permission.DELETE)
+          .put(RefPermission.UPDATE, Permission.PUSH)
+          .put(RefPermission.FORGE_AUTHOR, Permission.FORGE_AUTHOR)
+          .put(RefPermission.FORGE_COMMITTER, Permission.FORGE_COMMITTER)
+          .put(RefPermission.FORGE_SERVER, Permission.FORGE_SERVER)
+          .put(RefPermission.CREATE_TAG, Permission.CREATE_TAG)
+          .put(RefPermission.CREATE_SIGNED_TAG, Permission.CREATE_SIGNED_TAG)
+          .put(RefPermission.READ_PRIVATE_CHANGES, Permission.VIEW_PRIVATE_CHANGES)
+          .build();
+
+  private static final ImmutableBiMap<ChangePermission, String> CHANGE_PERMISSIONS =
+      ImmutableBiMap.<ChangePermission, String>builder()
+          .put(ChangePermission.READ, Permission.READ)
+          .put(ChangePermission.ABANDON, Permission.ABANDON)
+          .put(ChangePermission.EDIT_ASSIGNEE, Permission.EDIT_ASSIGNEE)
+          .put(ChangePermission.EDIT_HASHTAGS, Permission.EDIT_HASHTAGS)
+          .put(ChangePermission.EDIT_TOPIC_NAME, Permission.EDIT_TOPIC_NAME)
+          .put(ChangePermission.REMOVE_REVIEWER, Permission.REMOVE_REVIEWER)
+          .put(ChangePermission.ADD_PATCH_SET, Permission.ADD_PATCH_SET)
+          .put(ChangePermission.REBASE, Permission.REBASE)
+          .put(ChangePermission.SUBMIT, Permission.SUBMIT)
+          .put(ChangePermission.SUBMIT_AS, Permission.SUBMIT_AS)
+          .build();
+
+  private static <T extends Enum<T>> void checkMapContainsAllEnumValues(
+      ImmutableMap<T, String> actual, Class<T> clazz) {
+    Set<T> expected = EnumSet.allOf(clazz);
+    checkState(
+        actual.keySet().equals(expected),
+        "all %s values must be defined, found: %s",
+        clazz.getSimpleName(),
+        actual.keySet());
+  }
+
+  public static String globalPermissionName(GlobalPermission globalPermission) {
+    return requireNonNull(CAPABILITIES.get(globalPermission));
+  }
+
+  public static Optional<GlobalPermission> globalPermission(String capabilityName) {
+    return Optional.ofNullable(CAPABILITIES.inverse().get(capabilityName));
+  }
+
+  public static String pluginPermissionName(PluginPermission pluginPermission) {
+    return pluginPermission.pluginName() + '-' + pluginPermission.capability();
+  }
+
+  public static String globalOrPluginPermissionName(GlobalOrPluginPermission permission) {
+    return permission instanceof GlobalPermission
+        ? globalPermissionName((GlobalPermission) permission)
+        : pluginPermissionName((PluginPermission) permission);
+  }
+
+  public static Optional<String> projectPermissionName(ProjectPermission projectPermission) {
+    return Optional.ofNullable(PROJECT_PERMISSIONS.get(projectPermission));
+  }
+
+  public static Optional<ProjectPermission> projectPermission(String permissionName) {
+    return Optional.ofNullable(PROJECT_PERMISSIONS.inverse().get(permissionName));
+  }
+
+  public static Optional<String> refPermissionName(RefPermission refPermission) {
+    return Optional.ofNullable(REF_PERMISSIONS.get(refPermission));
+  }
+
+  public static Optional<RefPermission> refPermission(String permissionName) {
+    return Optional.ofNullable(REF_PERMISSIONS.inverse().get(permissionName));
+  }
+
+  public static Optional<String> changePermissionName(ChangePermission changePermission) {
+    return Optional.ofNullable(CHANGE_PERMISSIONS.get(changePermission));
+  }
+
+  public static Optional<ChangePermission> changePermission(String permissionName) {
+    return Optional.ofNullable(CHANGE_PERMISSIONS.inverse().get(permissionName));
+  }
+
+  public static String labelPermissionName(LabelPermission labelPermission) {
+    if (labelPermission.forUser() == ForUser.ON_BEHALF_OF) {
+      return Permission.forLabelAs(labelPermission.label());
+    }
+    return Permission.forLabel(labelPermission.label());
+  }
+
+  // TODO(dborowitz): Can these share a common superinterface?
+  public static String labelPermissionName(LabelPermission.WithValue labelPermission) {
+    if (labelPermission.forUser() == ForUser.ON_BEHALF_OF) {
+      return Permission.forLabelAs(labelPermission.label());
+    }
+    return Permission.forLabel(labelPermission.label());
+  }
+
+  private DefaultPermissionMappings() {}
+}
diff --git a/java/com/google/gerrit/server/permissions/DefaultRefFilter.java b/java/com/google/gerrit/server/permissions/DefaultRefFilter.java
new file mode 100644
index 0000000..55d7c6c
--- /dev/null
+++ b/java/com/google/gerrit/server/permissions/DefaultRefFilter.java
@@ -0,0 +1,426 @@
+// Copyright (C) 2010 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.google.gerrit.server.permissions;
+
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static com.google.gerrit.reviewdb.client.RefNames.REFS_CACHE_AUTOMERGE;
+import static com.google.gerrit.reviewdb.client.RefNames.REFS_CHANGES;
+import static com.google.gerrit.reviewdb.client.RefNames.REFS_CONFIG;
+import static com.google.gerrit.reviewdb.client.RefNames.REFS_USERS_SELF;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Maps;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.metrics.Counter0;
+import com.google.gerrit.metrics.Description;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.GroupCache;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.git.SearchingChangeCacheImpl;
+import com.google.gerrit.server.git.TagCache;
+import com.google.gerrit.server.git.TagMatcher;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.ChangeNotes.Factory.ChangeNotesResult;
+import com.google.gerrit.server.permissions.PermissionBackend.RefFilterOptions;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.lib.SymbolicRef;
+
+class DefaultRefFilter {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  interface Factory {
+    DefaultRefFilter create(ProjectControl projectControl);
+  }
+
+  private final TagCache tagCache;
+  private final ChangeNotes.Factory changeNotesFactory;
+  @Nullable private final SearchingChangeCacheImpl changeCache;
+  private final Provider<ReviewDb> db;
+  private final GroupCache groupCache;
+  private final PermissionBackend permissionBackend;
+  private final ProjectControl projectControl;
+  private final CurrentUser user;
+  private final ProjectState projectState;
+  private final PermissionBackend.ForProject permissionBackendForProject;
+  private final Counter0 fullFilterCount;
+  private final Counter0 skipFilterCount;
+  private final boolean skipFullRefEvaluationIfAllRefsAreVisible;
+
+  private Map<Change.Id, Branch.NameKey> visibleChanges;
+
+  @Inject
+  DefaultRefFilter(
+      TagCache tagCache,
+      ChangeNotes.Factory changeNotesFactory,
+      @Nullable SearchingChangeCacheImpl changeCache,
+      Provider<ReviewDb> db,
+      GroupCache groupCache,
+      PermissionBackend permissionBackend,
+      @GerritServerConfig Config config,
+      MetricMaker metricMaker,
+      @Assisted ProjectControl projectControl) {
+    this.tagCache = tagCache;
+    this.changeNotesFactory = changeNotesFactory;
+    this.changeCache = changeCache;
+    this.db = db;
+    this.groupCache = groupCache;
+    this.permissionBackend = permissionBackend;
+    this.skipFullRefEvaluationIfAllRefsAreVisible =
+        config.getBoolean("auth", "skipFullRefEvaluationIfAllRefsAreVisible", true);
+    this.projectControl = projectControl;
+
+    this.user = projectControl.getUser();
+    this.projectState = projectControl.getProjectState();
+    this.permissionBackendForProject =
+        permissionBackend.user(user).database(db).project(projectState.getNameKey());
+    this.fullFilterCount =
+        metricMaker.newCounter(
+            "permissions/ref_filter/full_filter_count",
+            new Description("Rate of full ref filter operations").setRate());
+    this.skipFilterCount =
+        metricMaker.newCounter(
+            "permissions/ref_filter/skip_filter_count",
+            new Description(
+                    "Rate of ref filter operations where we skip full evaluation"
+                        + " because the user can read all refs")
+                .setRate());
+  }
+
+  Map<String, Ref> filter(Map<String, Ref> refs, Repository repo, RefFilterOptions opts)
+      throws PermissionBackendException {
+    if (projectState.isAllUsers()) {
+      refs = addUsersSelfSymref(refs);
+    }
+
+    if (skipFullRefEvaluationIfAllRefsAreVisible && !projectState.isAllUsers()) {
+      if (projectState.statePermitsRead()
+          && checkProjectPermission(permissionBackendForProject, ProjectPermission.READ)) {
+        skipFilterCount.increment();
+        return refs;
+      } else if (projectControl.allRefsAreVisible(ImmutableSet.of(RefNames.REFS_CONFIG))) {
+        skipFilterCount.increment();
+        return fastHideRefsMetaConfig(refs);
+      }
+    }
+    fullFilterCount.increment();
+
+    boolean viewMetadata;
+    boolean isAdmin;
+    Account.Id userId;
+    IdentifiedUser identifiedUser;
+    PermissionBackend.WithUser withUser = permissionBackend.user(user);
+    if (user.isIdentifiedUser()) {
+      viewMetadata = withUser.testOrFalse(GlobalPermission.ACCESS_DATABASE);
+      isAdmin = withUser.testOrFalse(GlobalPermission.ADMINISTRATE_SERVER);
+      identifiedUser = user.asIdentifiedUser();
+      userId = identifiedUser.getAccountId();
+    } else {
+      viewMetadata = false;
+      isAdmin = false;
+      userId = null;
+      identifiedUser = null;
+    }
+
+    Map<String, Ref> result = new HashMap<>();
+    List<Ref> deferredTags = new ArrayList<>();
+
+    for (Ref ref : refs.values()) {
+      String name = ref.getName();
+      Change.Id changeId;
+      Account.Id accountId;
+      AccountGroup.UUID accountGroupUuid;
+      if (name.startsWith(REFS_CACHE_AUTOMERGE) || (opts.filterMeta() && isMetadata(name))) {
+        continue;
+      } else if (RefNames.isRefsEdit(name)) {
+        // Edits are visible only to the owning user, if change is visible.
+        if (viewMetadata || visibleEdit(repo, name)) {
+          result.put(name, ref);
+        }
+      } else if ((changeId = Change.Id.fromRef(name)) != null) {
+        // Change ref is visible only if the change is visible.
+        if (viewMetadata || visible(repo, changeId)) {
+          result.put(name, ref);
+        }
+      } else if ((accountId = Account.Id.fromRef(name)) != null) {
+        // Account ref is visible only to the corresponding account.
+        if (viewMetadata || (accountId.equals(userId) && canReadRef(name))) {
+          result.put(name, ref);
+        }
+      } else if ((accountGroupUuid = AccountGroup.UUID.fromRef(name)) != null) {
+        // Group ref is visible only to the corresponding owner group.
+        InternalGroup group = groupCache.get(accountGroupUuid).orElse(null);
+        if (viewMetadata
+            || (group != null
+                && isGroupOwner(group, identifiedUser, isAdmin)
+                && canReadRef(name))) {
+          result.put(name, ref);
+        }
+      } else if (isTag(ref)) {
+        // If its a tag, consider it later.
+        if (ref.getObjectId() != null) {
+          deferredTags.add(ref);
+        }
+      } else if (name.startsWith(RefNames.REFS_SEQUENCES)) {
+        // Sequences are internal database implementation details.
+        if (viewMetadata) {
+          result.put(name, ref);
+        }
+      } else if (projectState.isAllUsers()
+          && (name.equals(RefNames.REFS_EXTERNAL_IDS) || name.equals(RefNames.REFS_GROUPNAMES))) {
+        // The notes branches with the external IDs / group names must not be exposed to normal
+        // users.
+        if (viewMetadata) {
+          result.put(name, ref);
+        }
+      } else if (canReadRef(ref.getLeaf().getName())) {
+        // Use the leaf to lookup the control data. If the reference is
+        // symbolic we want the control around the final target. If its
+        // not symbolic then getLeaf() is a no-op returning ref itself.
+        result.put(name, ref);
+      } else if (isRefsUsersSelf(ref)) {
+        // viewMetadata allows to see all account refs, hence refs/users/self should be included as
+        // well
+        if (viewMetadata) {
+          result.put(name, ref);
+        }
+      }
+    }
+
+    // If we have tags that were deferred, we need to do a revision walk
+    // to identify what tags we can actually reach, and what we cannot.
+    //
+    if (!deferredTags.isEmpty() && (!result.isEmpty() || opts.filterTagsSeparately())) {
+      TagMatcher tags =
+          tagCache
+              .get(projectState.getNameKey())
+              .matcher(
+                  tagCache,
+                  repo,
+                  opts.filterTagsSeparately()
+                      ? filter(
+                              repo.getAllRefs(),
+                              repo,
+                              opts.toBuilder().setFilterTagsSeparately(false).build())
+                          .values()
+                      : result.values());
+      for (Ref tag : deferredTags) {
+        if (tags.isReachable(tag)) {
+          result.put(tag.getName(), tag);
+        }
+      }
+    }
+
+    return result;
+  }
+
+  private Map<String, Ref> fastHideRefsMetaConfig(Map<String, Ref> refs)
+      throws PermissionBackendException {
+    if (refs.containsKey(REFS_CONFIG) && !canReadRef(REFS_CONFIG)) {
+      Map<String, Ref> r = new HashMap<>(refs);
+      r.remove(REFS_CONFIG);
+      return r;
+    }
+    return refs;
+  }
+
+  private Map<String, Ref> addUsersSelfSymref(Map<String, Ref> refs) {
+    if (user.isIdentifiedUser()) {
+      Ref r = refs.get(RefNames.refsUsers(user.getAccountId()));
+      if (r != null) {
+        SymbolicRef s = new SymbolicRef(REFS_USERS_SELF, r);
+        refs = new HashMap<>(refs);
+        refs.put(s.getName(), s);
+      }
+    }
+    return refs;
+  }
+
+  private boolean visible(Repository repo, Change.Id changeId) throws PermissionBackendException {
+    if (visibleChanges == null) {
+      if (changeCache == null) {
+        visibleChanges = visibleChangesByScan(repo);
+      } else {
+        visibleChanges = visibleChangesBySearch();
+      }
+    }
+    return visibleChanges.containsKey(changeId);
+  }
+
+  private boolean visibleEdit(Repository repo, String name) throws PermissionBackendException {
+    Change.Id id = Change.Id.fromEditRefPart(name);
+    // Initialize if it wasn't yet
+    if (visibleChanges == null) {
+      visible(repo, id);
+    }
+    if (id == null) {
+      return false;
+    }
+    if (user.isIdentifiedUser()
+        && name.startsWith(RefNames.refsEditPrefix(user.asIdentifiedUser().getAccountId()))
+        && visible(repo, id)) {
+      return true;
+    }
+    if (visibleChanges.containsKey(id)) {
+      try {
+        // Default to READ_PRIVATE_CHANGES as there is no special permission for reading edits.
+        permissionBackendForProject
+            .ref(visibleChanges.get(id).get())
+            .check(RefPermission.READ_PRIVATE_CHANGES);
+        return true;
+      } catch (AuthException e) {
+        return false;
+      }
+    }
+    return false;
+  }
+
+  private Map<Change.Id, Branch.NameKey> visibleChangesBySearch()
+      throws PermissionBackendException {
+    Project.NameKey project = projectState.getNameKey();
+    try {
+      Map<Change.Id, Branch.NameKey> visibleChanges = new HashMap<>();
+      for (ChangeData cd : changeCache.getChangeData(db.get(), project)) {
+        ChangeNotes notes = changeNotesFactory.createFromIndexedChange(cd.change());
+        if (!projectState.statePermitsRead()) {
+          continue;
+        }
+        try {
+          permissionBackendForProject.indexedChange(cd, notes).check(ChangePermission.READ);
+          visibleChanges.put(cd.getId(), cd.change().getDest());
+        } catch (AuthException e) {
+          // Do nothing.
+        }
+      }
+      return visibleChanges;
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log(
+          "Cannot load changes for project %s, assuming no changes are visible", project);
+      return Collections.emptyMap();
+    }
+  }
+
+  private Map<Change.Id, Branch.NameKey> visibleChangesByScan(Repository repo)
+      throws PermissionBackendException {
+    Project.NameKey p = projectState.getNameKey();
+    ImmutableList<ChangeNotesResult> changes;
+    try {
+      changes = changeNotesFactory.scan(repo, db.get(), p).collect(toImmutableList());
+    } catch (IOException e) {
+      logger.atSevere().withCause(e).log(
+          "Cannot load changes for project %s, assuming no changes are visible", p);
+      return Collections.emptyMap();
+    }
+
+    Map<Change.Id, Branch.NameKey> result = Maps.newHashMapWithExpectedSize(changes.size());
+    for (ChangeNotesResult notesResult : changes) {
+      ChangeNotes notes = toNotes(notesResult);
+      if (notes != null) {
+        result.put(notes.getChangeId(), notes.getChange().getDest());
+      }
+    }
+    return result;
+  }
+
+  @Nullable
+  private ChangeNotes toNotes(ChangeNotesResult r) throws PermissionBackendException {
+    if (r.error().isPresent()) {
+      logger.atWarning().withCause(r.error().get()).log(
+          "Failed to load change %s in %s", r.id(), projectState.getName());
+      return null;
+    }
+
+    if (!projectState.statePermitsRead()) {
+      return null;
+    }
+
+    try {
+      permissionBackendForProject.change(r.notes()).check(ChangePermission.READ);
+      return r.notes();
+    } catch (AuthException e) {
+      // Skip.
+    }
+    return null;
+  }
+
+  private boolean isMetadata(String name) {
+    return name.startsWith(REFS_CHANGES) || RefNames.isRefsEdit(name);
+  }
+
+  private static boolean isTag(Ref ref) {
+    return ref.getLeaf().getName().startsWith(Constants.R_TAGS);
+  }
+
+  private static boolean isRefsUsersSelf(Ref ref) {
+    return ref.getName().startsWith(REFS_USERS_SELF);
+  }
+
+  private boolean canReadRef(String ref) throws PermissionBackendException {
+    try {
+      permissionBackendForProject.ref(ref).check(RefPermission.READ);
+    } catch (AuthException e) {
+      return false;
+    }
+    return projectState.statePermitsRead();
+  }
+
+  private boolean checkProjectPermission(
+      PermissionBackend.ForProject forProject, ProjectPermission perm)
+      throws PermissionBackendException {
+    try {
+      forProject.check(perm);
+    } catch (AuthException e) {
+      return false;
+    }
+    return true;
+  }
+
+  private boolean isGroupOwner(
+      InternalGroup group, @Nullable IdentifiedUser user, boolean isAdmin) {
+    requireNonNull(group);
+
+    // Keep this logic in sync with GroupControl#isOwner().
+    return isAdmin
+        || (user != null && user.getEffectiveGroups().contains(group.getOwnerGroupUUID()));
+  }
+}
diff --git a/java/com/google/gerrit/server/permissions/FailedPermissionBackend.java b/java/com/google/gerrit/server/permissions/FailedPermissionBackend.java
new file mode 100644
index 0000000..bd7c549
--- /dev/null
+++ b/java/com/google/gerrit/server/permissions/FailedPermissionBackend.java
@@ -0,0 +1,247 @@
+// Copyright (C) 2017 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.google.gerrit.server.permissions;
+
+import com.google.gerrit.extensions.api.access.GlobalOrPluginPermission;
+import com.google.gerrit.extensions.conditions.BooleanCondition;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.permissions.PermissionBackend.ForChange;
+import com.google.gerrit.server.permissions.PermissionBackend.ForProject;
+import com.google.gerrit.server.permissions.PermissionBackend.ForRef;
+import com.google.gerrit.server.permissions.PermissionBackend.RefFilterOptions;
+import com.google.gerrit.server.permissions.PermissionBackend.WithUser;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.inject.Provider;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+
+/**
+ * Helpers for {@link PermissionBackend} that must fail.
+ *
+ * <p>These helpers are useful to curry failure state identified inside a non-throwing factory
+ * method to the throwing {@code check} or {@code test} methods.
+ */
+public class FailedPermissionBackend {
+  public static WithUser user(String message) {
+    return new FailedWithUser(message, null);
+  }
+
+  public static WithUser user(String message, Throwable cause) {
+    return new FailedWithUser(message, cause);
+  }
+
+  public static ForProject project(String message) {
+    return project(message, null);
+  }
+
+  public static ForProject project(String message, Throwable cause) {
+    return new FailedProject(message, cause);
+  }
+
+  public static ForRef ref(String message) {
+    return ref(message, null);
+  }
+
+  public static ForRef ref(String message, Throwable cause) {
+    return new FailedRef(message, cause);
+  }
+
+  public static ForChange change(String message) {
+    return change(message, null);
+  }
+
+  public static ForChange change(String message, Throwable cause) {
+    return new FailedChange(message, cause);
+  }
+
+  private FailedPermissionBackend() {}
+
+  private static class FailedWithUser extends WithUser {
+    private final String message;
+    private final Throwable cause;
+
+    FailedWithUser(String message, Throwable cause) {
+      this.message = message;
+      this.cause = cause;
+    }
+
+    @Override
+    public ForProject project(Project.NameKey project) {
+      return new FailedProject(message, cause);
+    }
+
+    @Override
+    public void check(GlobalOrPluginPermission perm) throws PermissionBackendException {
+      throw new PermissionBackendException(message, cause);
+    }
+
+    @Override
+    public <T extends GlobalOrPluginPermission> Set<T> test(Collection<T> permSet)
+        throws PermissionBackendException {
+      throw new PermissionBackendException(message, cause);
+    }
+
+    @Override
+    public BooleanCondition testCond(GlobalOrPluginPermission perm) {
+      throw new UnsupportedOperationException(
+          "FailedPermissionBackend does not support conditions");
+    }
+  }
+
+  private static class FailedProject extends ForProject {
+    private final String message;
+    private final Throwable cause;
+
+    FailedProject(String message, Throwable cause) {
+      this.message = message;
+      this.cause = cause;
+    }
+
+    @Override
+    public ForProject database(Provider<ReviewDb> db) {
+      return this;
+    }
+
+    @Override
+    public String resourcePath() {
+      throw new UnsupportedOperationException(
+          "FailedPermissionBackend is not scoped to a resource");
+    }
+
+    @Override
+    public ForRef ref(String ref) {
+      return new FailedRef(message, cause);
+    }
+
+    @Override
+    public void check(ProjectPermission perm) throws PermissionBackendException {
+      throw new PermissionBackendException(message, cause);
+    }
+
+    @Override
+    public Set<ProjectPermission> test(Collection<ProjectPermission> permSet)
+        throws PermissionBackendException {
+      throw new PermissionBackendException(message, cause);
+    }
+
+    @Override
+    public BooleanCondition testCond(ProjectPermission perm) {
+      throw new UnsupportedOperationException(
+          "FailedPermissionBackend does not support conditions");
+    }
+
+    @Override
+    public Map<String, Ref> filter(Map<String, Ref> refs, Repository repo, RefFilterOptions opts)
+        throws PermissionBackendException {
+      throw new PermissionBackendException(message, cause);
+    }
+  }
+
+  private static class FailedRef extends ForRef {
+    private final String message;
+    private final Throwable cause;
+
+    FailedRef(String message, Throwable cause) {
+      this.message = message;
+      this.cause = cause;
+    }
+
+    @Override
+    public ForRef database(Provider<ReviewDb> db) {
+      return this;
+    }
+
+    @Override
+    public String resourcePath() {
+      throw new UnsupportedOperationException(
+          "FailedPermissionBackend is not scoped to a resource");
+    }
+
+    @Override
+    public ForChange change(ChangeData cd) {
+      return new FailedChange(message, cause);
+    }
+
+    @Override
+    public ForChange change(ChangeNotes notes) {
+      return new FailedChange(message, cause);
+    }
+
+    @Override
+    public ForChange indexedChange(ChangeData cd, ChangeNotes notes) {
+      return new FailedChange(message, cause);
+    }
+
+    @Override
+    public void check(RefPermission perm) throws PermissionBackendException {
+      throw new PermissionBackendException(message, cause);
+    }
+
+    @Override
+    public Set<RefPermission> test(Collection<RefPermission> permSet)
+        throws PermissionBackendException {
+      throw new PermissionBackendException(message, cause);
+    }
+
+    @Override
+    public BooleanCondition testCond(RefPermission perm) {
+      throw new UnsupportedOperationException(
+          "FailedPermissionBackend does not support conditions");
+    }
+  }
+
+  private static class FailedChange extends ForChange {
+    private final String message;
+    private final Throwable cause;
+
+    FailedChange(String message, Throwable cause) {
+      this.message = message;
+      this.cause = cause;
+    }
+
+    @Override
+    public ForChange database(Provider<ReviewDb> db) {
+      return this;
+    }
+
+    @Override
+    public String resourcePath() {
+      throw new UnsupportedOperationException(
+          "FailedPermissionBackend is not scoped to a resource");
+    }
+
+    @Override
+    public void check(ChangePermissionOrLabel perm) throws PermissionBackendException {
+      throw new PermissionBackendException(message, cause);
+    }
+
+    @Override
+    public <T extends ChangePermissionOrLabel> Set<T> test(Collection<T> permSet)
+        throws PermissionBackendException {
+      throw new PermissionBackendException(message, cause);
+    }
+
+    @Override
+    public BooleanCondition testCond(ChangePermissionOrLabel perm) {
+      throw new UnsupportedOperationException(
+          "FailedPermissionBackend does not support conditions");
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/permissions/GlobalPermission.java b/java/com/google/gerrit/server/permissions/GlobalPermission.java
new file mode 100644
index 0000000..07c9e84
--- /dev/null
+++ b/java/com/google/gerrit/server/permissions/GlobalPermission.java
@@ -0,0 +1,156 @@
+// Copyright (C) 2017 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.google.gerrit.server.permissions;
+
+import static com.google.gerrit.server.permissions.DefaultPermissionMappings.globalPermission;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.annotations.CapabilityScope;
+import com.google.gerrit.extensions.annotations.RequiresAnyCapability;
+import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.extensions.api.access.GerritPermission;
+import com.google.gerrit.extensions.api.access.GlobalOrPluginPermission;
+import com.google.gerrit.extensions.api.access.PluginPermission;
+import com.google.gerrit.extensions.registration.PluginName;
+import java.lang.annotation.Annotation;
+import java.util.Collections;
+import java.util.LinkedHashSet;
+import java.util.Optional;
+import java.util.Set;
+
+/** Global server permissions built into Gerrit. */
+public enum GlobalPermission implements GlobalOrPluginPermission {
+  ACCESS_DATABASE,
+  ADMINISTRATE_SERVER,
+  CREATE_ACCOUNT,
+  CREATE_GROUP,
+  CREATE_PROJECT,
+  EMAIL_REVIEWERS,
+  FLUSH_CACHES,
+  KILL_TASK,
+  MAINTAIN_SERVER,
+  MODIFY_ACCOUNT,
+  READ_AS,
+  RUN_AS,
+  RUN_GC,
+  STREAM_EVENTS,
+  VIEW_ALL_ACCOUNTS,
+  VIEW_CACHES,
+  VIEW_CONNECTIONS,
+  VIEW_PLUGINS,
+  VIEW_QUEUE,
+  VIEW_ACCESS;
+
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  /**
+   * Extracts the {@code @RequiresCapability} or {@code @RequiresAnyCapability} annotation.
+   *
+   * @param pluginName name of the declaring plugin. May be {@code null} or {@code "gerrit"} for
+   *     classes originating from the core server.
+   * @param clazz target class to extract annotation from.
+   * @return empty set if no annotations were found, or a collection of permissions, any of which
+   *     are suitable to enable access.
+   * @throws PermissionBackendException the annotation could not be parsed.
+   */
+  public static Set<GlobalOrPluginPermission> fromAnnotation(
+      @Nullable String pluginName, Class<?> clazz) throws PermissionBackendException {
+    RequiresCapability rc = findAnnotation(clazz, RequiresCapability.class);
+    RequiresAnyCapability rac = findAnnotation(clazz, RequiresAnyCapability.class);
+    if (rc != null && rac != null) {
+      logger.atSevere().log(
+          "Class %s uses both @%s and @%s",
+          clazz.getName(),
+          RequiresCapability.class.getSimpleName(),
+          RequiresAnyCapability.class.getSimpleName());
+      throw new PermissionBackendException("cannot extract permission");
+    } else if (rc != null) {
+      return Collections.singleton(
+          resolve(
+              pluginName,
+              rc.value(),
+              rc.scope(),
+              rc.fallBackToAdmin(),
+              clazz,
+              RequiresCapability.class));
+    } else if (rac != null) {
+      Set<GlobalOrPluginPermission> r = new LinkedHashSet<>();
+      for (String capability : rac.value()) {
+        r.add(
+            resolve(
+                pluginName,
+                capability,
+                rac.scope(),
+                rac.fallBackToAdmin(),
+                clazz,
+                RequiresAnyCapability.class));
+      }
+      return Collections.unmodifiableSet(r);
+    } else {
+      return Collections.emptySet();
+    }
+  }
+
+  public static Set<GlobalOrPluginPermission> fromAnnotation(Class<?> clazz)
+      throws PermissionBackendException {
+    return fromAnnotation(null, clazz);
+  }
+
+  private static GlobalOrPluginPermission resolve(
+      @Nullable String pluginName,
+      String capability,
+      CapabilityScope scope,
+      boolean fallBackToAdmin,
+      Class<?> clazz,
+      Class<?> annotationClass)
+      throws PermissionBackendException {
+    if (pluginName != null
+        && !PluginName.GERRIT.equals(pluginName)
+        && (scope == CapabilityScope.PLUGIN || scope == CapabilityScope.CONTEXT)) {
+      return new PluginPermission(pluginName, capability, fallBackToAdmin);
+    }
+
+    if (scope == CapabilityScope.PLUGIN) {
+      logger.atSevere().log(
+          "Class %s uses @%s(scope=%s), but is not within a plugin",
+          clazz.getName(), annotationClass.getSimpleName(), scope.name());
+      throw new PermissionBackendException("cannot extract permission");
+    }
+
+    Optional<GlobalPermission> perm = globalPermission(capability);
+    if (!perm.isPresent()) {
+      logger.atSevere().log("Class %s requires unknown capability %s", clazz.getName(), capability);
+      throw new PermissionBackendException("cannot extract permission");
+    }
+    return perm.get();
+  }
+
+  @Nullable
+  private static <T extends Annotation> T findAnnotation(Class<?> clazz, Class<T> annotation) {
+    for (; clazz != null; clazz = clazz.getSuperclass()) {
+      T t = clazz.getAnnotation(annotation);
+      if (t != null) {
+        return t;
+      }
+    }
+    return null;
+  }
+
+  @Override
+  public String describeForException() {
+    return GerritPermission.describeEnumValue(this);
+  }
+}
diff --git a/java/com/google/gerrit/server/permissions/LabelPermission.java b/java/com/google/gerrit/server/permissions/LabelPermission.java
new file mode 100644
index 0000000..7cce9c4
--- /dev/null
+++ b/java/com/google/gerrit/server/permissions/LabelPermission.java
@@ -0,0 +1,247 @@
+// Copyright (C) 2017 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.google.gerrit.server.permissions;
+
+import static com.google.gerrit.server.permissions.LabelPermission.ForUser.ON_BEHALF_OF;
+import static com.google.gerrit.server.permissions.LabelPermission.ForUser.SELF;
+import static java.util.Objects.requireNonNull;
+
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.LabelValue;
+import com.google.gerrit.server.util.LabelVote;
+
+/** Permission representing a label. */
+public class LabelPermission implements ChangePermissionOrLabel {
+  public enum ForUser {
+    SELF,
+    ON_BEHALF_OF;
+  }
+
+  private final ForUser forUser;
+  private final String name;
+
+  /**
+   * Construct a reference to a label permission.
+   *
+   * @param type type description of the label.
+   */
+  public LabelPermission(LabelType type) {
+    this(SELF, type);
+  }
+
+  /**
+   * Construct a reference to a label permission.
+   *
+   * @param forUser {@code SELF} (default) or {@code ON_BEHALF_OF} for labelAs behavior.
+   * @param type type description of the label.
+   */
+  public LabelPermission(ForUser forUser, LabelType type) {
+    this(forUser, type.getName());
+  }
+
+  /**
+   * Construct a reference to a label permission.
+   *
+   * @param name name of the label, e.g. {@code "Code-Review"} or {@code "Verified"}.
+   */
+  public LabelPermission(String name) {
+    this(SELF, name);
+  }
+
+  /**
+   * Construct a reference to a label permission.
+   *
+   * @param forUser {@code SELF} (default) or {@code ON_BEHALF_OF} for labelAs behavior.
+   * @param name name of the label, e.g. {@code "Code-Review"} or {@code "Verified"}.
+   */
+  public LabelPermission(ForUser forUser, String name) {
+    this.forUser = requireNonNull(forUser, "ForUser");
+    this.name = LabelType.checkName(name);
+  }
+
+  /** @return {@code SELF} or {@code ON_BEHALF_OF} (or labelAs). */
+  public ForUser forUser() {
+    return forUser;
+  }
+
+  /** @return name of the label, e.g. {@code "Code-Review"}. */
+  public String label() {
+    return name;
+  }
+
+  @Override
+  public String describeForException() {
+    if (forUser == ON_BEHALF_OF) {
+      return "label on behalf of " + name;
+    }
+    return "label " + name;
+  }
+
+  @Override
+  public int hashCode() {
+    return name.hashCode();
+  }
+
+  @Override
+  public boolean equals(Object other) {
+    if (other instanceof LabelPermission) {
+      LabelPermission b = (LabelPermission) other;
+      return forUser == b.forUser && name.equals(b.name);
+    }
+    return false;
+  }
+
+  @Override
+  public String toString() {
+    if (forUser == ON_BEHALF_OF) {
+      return "LabelAs[" + name + ']';
+    }
+    return "Label[" + name + ']';
+  }
+
+  /** A {@link LabelPermission} at a specific value. */
+  public static class WithValue implements ChangePermissionOrLabel {
+    private final ForUser forUser;
+    private final LabelVote label;
+
+    /**
+     * Construct a reference to a label at a specific value.
+     *
+     * @param type description of the label.
+     * @param value numeric score assigned to the label.
+     */
+    public WithValue(LabelType type, LabelValue value) {
+      this(SELF, type, value);
+    }
+
+    /**
+     * Construct a reference to a label at a specific value.
+     *
+     * @param type description of the label.
+     * @param value numeric score assigned to the label.
+     */
+    public WithValue(LabelType type, short value) {
+      this(SELF, type.getName(), value);
+    }
+
+    /**
+     * Construct a reference to a label at a specific value.
+     *
+     * @param forUser {@code SELF} (default) or {@code ON_BEHALF_OF} for labelAs behavior.
+     * @param type description of the label.
+     * @param value numeric score assigned to the label.
+     */
+    public WithValue(ForUser forUser, LabelType type, LabelValue value) {
+      this(forUser, type.getName(), value.getValue());
+    }
+
+    /**
+     * Construct a reference to a label at a specific value.
+     *
+     * @param forUser {@code SELF} (default) or {@code ON_BEHALF_OF} for labelAs behavior.
+     * @param type description of the label.
+     * @param value numeric score assigned to the label.
+     */
+    public WithValue(ForUser forUser, LabelType type, short value) {
+      this(forUser, type.getName(), value);
+    }
+
+    /**
+     * Construct a reference to a label at a specific value.
+     *
+     * @param name name of the label, e.g. {@code "Code-Review"} or {@code "Verified"}.
+     * @param value numeric score assigned to the label.
+     */
+    public WithValue(String name, short value) {
+      this(SELF, name, value);
+    }
+
+    /**
+     * Construct a reference to a label at a specific value.
+     *
+     * @param forUser {@code SELF} (default) or {@code ON_BEHALF_OF} for labelAs behavior.
+     * @param name name of the label, e.g. {@code "Code-Review"} or {@code "Verified"}.
+     * @param value numeric score assigned to the label.
+     */
+    public WithValue(ForUser forUser, String name, short value) {
+      this(forUser, LabelVote.create(name, value));
+    }
+
+    /**
+     * Construct a reference to a label at a specific value.
+     *
+     * @param label label name and vote.
+     */
+    public WithValue(LabelVote label) {
+      this(SELF, label);
+    }
+
+    /**
+     * Construct a reference to a label at a specific value.
+     *
+     * @param forUser {@code SELF} (default) or {@code ON_BEHALF_OF} for labelAs behavior.
+     * @param label label name and vote.
+     */
+    public WithValue(ForUser forUser, LabelVote label) {
+      this.forUser = requireNonNull(forUser, "ForUser");
+      this.label = requireNonNull(label, "LabelVote");
+    }
+
+    /** @return {@code SELF} or {@code ON_BEHALF_OF} (or labelAs). */
+    public ForUser forUser() {
+      return forUser;
+    }
+
+    /** @return name of the label, e.g. {@code "Code-Review"}. */
+    public String label() {
+      return label.label();
+    }
+
+    /** @return specific value of the label, e.g. 1 or 2. */
+    public short value() {
+      return label.value();
+    }
+
+    @Override
+    public String describeForException() {
+      if (forUser == ON_BEHALF_OF) {
+        return "label on behalf of " + label.formatWithEquals();
+      }
+      return "label " + label.formatWithEquals();
+    }
+
+    @Override
+    public int hashCode() {
+      return label.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object other) {
+      if (other instanceof WithValue) {
+        WithValue b = (WithValue) other;
+        return forUser == b.forUser && label.equals(b.label);
+      }
+      return false;
+    }
+
+    @Override
+    public String toString() {
+      if (forUser == ON_BEHALF_OF) {
+        return "LabelAs[" + label.format() + ']';
+      }
+      return "Label[" + label.format() + ']';
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/permissions/PermissionBackend.java b/java/com/google/gerrit/server/permissions/PermissionBackend.java
new file mode 100644
index 0000000..fea42b5
--- /dev/null
+++ b/java/com/google/gerrit/server/permissions/PermissionBackend.java
@@ -0,0 +1,510 @@
+// Copyright (C) 2017 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.google.gerrit.server.permissions;
+
+import static java.util.Objects.requireNonNull;
+import static java.util.stream.Collectors.toSet;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.Sets;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.extensions.api.access.GlobalOrPluginPermission;
+import com.google.gerrit.extensions.conditions.BooleanCondition;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.ImplementedBy;
+import com.google.inject.Provider;
+import com.google.inject.util.Providers;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+
+/**
+ * Checks authorization to perform an action on a project, reference, or change.
+ *
+ * <p>{@code check} methods should be used during action handlers to verify the user is allowed to
+ * exercise the specified permission. For convenience in implementation {@code check} methods throw
+ * {@link AuthException} if the permission is denied.
+ *
+ * <p>{@code test} methods should be used when constructing replies to the client and the result
+ * object needs to include a true/false hint indicating the user's ability to exercise the
+ * permission. This is suitable for configuring UI button state, but should not be relied upon to
+ * guard handlers before making state changes.
+ *
+ * <p>{@code PermissionBackend} is a singleton for the server, acting as a factory for lightweight
+ * request instances. Implementation classes may cache supporting data inside of {@link WithUser},
+ * {@link ForProject}, {@link ForRef}, and {@link ForChange} instances, in addition to storing
+ * within {@link CurrentUser} using a {@link com.google.gerrit.server.CurrentUser.PropertyKey}.
+ * {@link GlobalPermission} caching for {@link WithUser} may best cached inside {@link CurrentUser}
+ * as {@link WithUser} instances are frequently created.
+ *
+ * <p>Example use:
+ *
+ * <pre>
+ *   private final PermissionBackend permissions;
+ *   private final Provider<CurrentUser> user;
+ *
+ *   @Inject
+ *   Foo(PermissionBackend permissions, Provider<CurrentUser> user) {
+ *     this.permissions = permissions;
+ *     this.user = user;
+ *   }
+ *
+ *   public void apply(...) {
+ *     permissions.user(user).change(cd).check(ChangePermission.SUBMIT);
+ *   }
+ *
+ *   public UiAction.Description getDescription(ChangeResource rsrc) {
+ *     return new UiAction.Description()
+ *       .setLabel("Submit")
+ *       .setVisible(rsrc.permissions().testCond(ChangePermission.SUBMIT));
+ * }
+ * </pre>
+ */
+@ImplementedBy(DefaultPermissionBackend.class)
+public abstract class PermissionBackend {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  /** Returns an instance scoped to the current user. */
+  public abstract WithUser currentUser();
+
+  /**
+   * Returns an instance scoped to the specified user. Should be used in cases where the user could
+   * either be the issuer of the current request or an impersonated user. PermissionBackends that do
+   * not support impersonation can fail with an {@code IllegalStateException}.
+   *
+   * <p>If an instance scoped to the current user is desired, use {@code currentUser()} instead.
+   */
+  public abstract WithUser user(CurrentUser user);
+
+  /**
+   * Returns an instance scoped to the provided user. Should be used in cases where the caller wants
+   * to check the permissions of a user who is not the issuer of the current request and not the
+   * target of impersonation.
+   *
+   * <p>Usage should be very limited as this can expose a group-oracle.
+   */
+  public abstract WithUser absentUser(Account.Id id);
+
+  /**
+   * Check whether this {@code PermissionBackend} respects the same global capabilities as the
+   * {@link DefaultPermissionBackend}.
+   *
+   * <p>If true, then it makes sense for downstream callers to refer to built-in Gerrit capability
+   * names in user-facing error messages, for example.
+   *
+   * @return whether this is the default permission backend.
+   */
+  public boolean usesDefaultCapabilities() {
+    return false;
+  }
+
+  /**
+   * Throw {@link ResourceNotFoundException} if this backend does not use the default global
+   * capabilities.
+   */
+  public void checkUsesDefaultCapabilities() throws ResourceNotFoundException {
+    if (!usesDefaultCapabilities()) {
+      throw new ResourceNotFoundException("Gerrit capabilities not used on this server");
+    }
+  }
+
+  /**
+   * Bulk evaluate a set of {@link PermissionBackendCondition} for view handling.
+   *
+   * <p>Overridden implementations should call {@link PermissionBackendCondition#set(boolean)} to
+   * cache the result of {@code testOrFalse} in the condition for later evaluation. Caching the
+   * result will bypass the usual invocation of {@code testOrFalse}.
+   *
+   * @param conds conditions to consider.
+   */
+  public void bulkEvaluateTest(Set<PermissionBackendCondition> conds) {
+    // Do nothing by default. The default implementation of PermissionBackendCondition
+    // delegates to the appropriate testOrFalse method in PermissionBackend.
+  }
+
+  /** PermissionBackend with an optional per-request ReviewDb handle. */
+  public abstract static class AcceptsReviewDb<T> {
+    protected Provider<ReviewDb> db;
+
+    public T database(Provider<ReviewDb> db) {
+      if (db != null) {
+        this.db = db;
+      }
+      return self();
+    }
+
+    public T database(ReviewDb db) {
+      return database(Providers.of(requireNonNull(db, "ReviewDb")));
+    }
+
+    @SuppressWarnings("unchecked")
+    private T self() {
+      return (T) this;
+    }
+  }
+
+  /** PermissionBackend scoped to a specific user. */
+  public abstract static class WithUser extends AcceptsReviewDb<WithUser> {
+    /** Returns an instance scoped for the specified project. */
+    public abstract ForProject project(Project.NameKey project);
+
+    /** Returns an instance scoped for the {@code ref}, and its parent project. */
+    public ForRef ref(Branch.NameKey ref) {
+      return project(ref.getParentKey()).ref(ref.get()).database(db);
+    }
+
+    /** Returns an instance scoped for the change, and its destination ref and project. */
+    public ForChange change(ChangeData cd) {
+      try {
+        return ref(cd.change().getDest()).change(cd);
+      } catch (OrmException e) {
+        return FailedPermissionBackend.change("unavailable", e);
+      }
+    }
+
+    /** Returns an instance scoped for the change, and its destination ref and project. */
+    public ForChange change(ChangeNotes notes) {
+      return ref(notes.getChange().getDest()).change(notes);
+    }
+
+    /**
+     * Returns an instance scoped for the change loaded from index, and its destination ref and
+     * project. This method should only be used when database access is harmful and potentially
+     * stale data from the index is acceptable.
+     */
+    public ForChange indexedChange(ChangeData cd, ChangeNotes notes) {
+      return ref(notes.getChange().getDest()).indexedChange(cd, notes);
+    }
+
+    /** Verify scoped user can {@code perm}, throwing if denied. */
+    public abstract void check(GlobalOrPluginPermission perm)
+        throws AuthException, PermissionBackendException;
+
+    /**
+     * Verify scoped user can perform at least one listed permission.
+     *
+     * <p>If {@code any} is empty, the method completes normally and allows the caller to continue.
+     * Since no permissions were supplied to check, its assumed no permissions are necessary to
+     * continue with the caller's operation.
+     *
+     * <p>If the user has at least one of the permissions in {@code any}, the method completes
+     * normally, possibly without checking all listed permissions.
+     *
+     * <p>If {@code any} is non-empty and the user has none, {@link AuthException} is thrown for one
+     * of the failed permissions.
+     *
+     * @param any set of permissions to check.
+     */
+    public void checkAny(Set<GlobalOrPluginPermission> any)
+        throws PermissionBackendException, AuthException {
+      for (Iterator<GlobalOrPluginPermission> itr = any.iterator(); itr.hasNext(); ) {
+        try {
+          check(itr.next());
+          return;
+        } catch (AuthException err) {
+          if (!itr.hasNext()) {
+            throw err;
+          }
+        }
+      }
+    }
+
+    /** Filter {@code permSet} to permissions scoped user might be able to perform. */
+    public abstract <T extends GlobalOrPluginPermission> Set<T> test(Collection<T> permSet)
+        throws PermissionBackendException;
+
+    public boolean test(GlobalOrPluginPermission perm) throws PermissionBackendException {
+      return test(Collections.singleton(perm)).contains(perm);
+    }
+
+    public boolean testOrFalse(GlobalOrPluginPermission perm) {
+      try {
+        return test(perm);
+      } catch (PermissionBackendException e) {
+        logger.atWarning().withCause(e).log("Cannot test %s; assuming false", perm);
+        return false;
+      }
+    }
+
+    public abstract BooleanCondition testCond(GlobalOrPluginPermission perm);
+
+    /**
+     * Filter a set of projects using {@code check(perm)}.
+     *
+     * @param perm required permission in a project to be included in result.
+     * @param projects candidate set of projects; may be empty.
+     * @return filtered set of {@code projects} where {@code check(perm)} was successful.
+     * @throws PermissionBackendException backend cannot access its internal state.
+     */
+    public Set<Project.NameKey> filter(ProjectPermission perm, Collection<Project.NameKey> projects)
+        throws PermissionBackendException {
+      requireNonNull(perm, "ProjectPermission");
+      requireNonNull(projects, "projects");
+      Set<Project.NameKey> allowed = Sets.newHashSetWithExpectedSize(projects.size());
+      for (Project.NameKey project : projects) {
+        try {
+          project(project).check(perm);
+          allowed.add(project);
+        } catch (AuthException e) {
+          // Do not include this project in allowed.
+        } catch (PermissionBackendException e) {
+          if (e.getCause() instanceof RepositoryNotFoundException) {
+            logger.atWarning().withCause(e).log(
+                "Could not find repository of the project %s", project.get());
+            // Do not include this project because doesn't exist
+          } else {
+            throw e;
+          }
+        }
+      }
+      return allowed;
+    }
+  }
+
+  /** PermissionBackend scoped to a user and project. */
+  public abstract static class ForProject extends AcceptsReviewDb<ForProject> {
+    /** Returns the fully qualified resource path that this instance is scoped to. */
+    public abstract String resourcePath();
+
+    /** Returns an instance scoped for {@code ref} in this project. */
+    public abstract ForRef ref(String ref);
+
+    /** Returns an instance scoped for the change, and its destination ref and project. */
+    public ForChange change(ChangeData cd) {
+      try {
+        return ref(cd.change().getDest().get()).change(cd);
+      } catch (OrmException e) {
+        return FailedPermissionBackend.change("unavailable", e);
+      }
+    }
+
+    /** Returns an instance scoped for the change, and its destination ref and project. */
+    public ForChange change(ChangeNotes notes) {
+      return ref(notes.getChange().getDest().get()).change(notes);
+    }
+
+    /**
+     * Returns an instance scoped for the change loaded from index, and its destination ref and
+     * project. This method should only be used when database access is harmful and potentially
+     * stale data from the index is acceptable.
+     */
+    public ForChange indexedChange(ChangeData cd, ChangeNotes notes) {
+      return ref(notes.getChange().getDest().get()).indexedChange(cd, notes);
+    }
+
+    /** Verify scoped user can {@code perm}, throwing if denied. */
+    public abstract void check(ProjectPermission perm)
+        throws AuthException, PermissionBackendException;
+
+    /** Filter {@code permSet} to permissions scoped user might be able to perform. */
+    public abstract Set<ProjectPermission> test(Collection<ProjectPermission> permSet)
+        throws PermissionBackendException;
+
+    public boolean test(ProjectPermission perm) throws PermissionBackendException {
+      return test(EnumSet.of(perm)).contains(perm);
+    }
+
+    public boolean testOrFalse(ProjectPermission perm) {
+      try {
+        return test(perm);
+      } catch (PermissionBackendException e) {
+        logger.atWarning().withCause(e).log("Cannot test %s; assuming false", perm);
+        return false;
+      }
+    }
+
+    public abstract BooleanCondition testCond(ProjectPermission perm);
+
+    /**
+     * Filter a map of references by visibility.
+     *
+     * @param refs a map of references to filter.
+     * @param repo an open {@link Repository} handle for this instance's project
+     * @param opts further options for filtering.
+     * @return a partition of the provided refs that are visible to the user that this instance is
+     *     scoped to.
+     * @throws PermissionBackendException if failure consulting backend configuration.
+     */
+    public abstract Map<String, Ref> filter(
+        Map<String, Ref> refs, Repository repo, RefFilterOptions opts)
+        throws PermissionBackendException;
+  }
+
+  /** Options for filtering refs using {@link ForProject}. */
+  @AutoValue
+  public abstract static class RefFilterOptions {
+    /** Remove all NoteDb refs (refs/changes/*, refs/users/*, edit refs) from the result. */
+    public abstract boolean filterMeta();
+
+    /** Separately add reachable tags. */
+    public abstract boolean filterTagsSeparately();
+
+    public abstract Builder toBuilder();
+
+    public static Builder builder() {
+      return new AutoValue_PermissionBackend_RefFilterOptions.Builder()
+          .setFilterMeta(false)
+          .setFilterTagsSeparately(false);
+    }
+
+    @AutoValue.Builder
+    public abstract static class Builder {
+      public abstract Builder setFilterMeta(boolean val);
+
+      public abstract Builder setFilterTagsSeparately(boolean val);
+
+      public abstract RefFilterOptions build();
+    }
+
+    public static RefFilterOptions defaults() {
+      return builder().build();
+    }
+  }
+
+  /** PermissionBackend scoped to a user, project and reference. */
+  public abstract static class ForRef extends AcceptsReviewDb<ForRef> {
+    /** Returns a fully qualified resource path that this instance is scoped to. */
+    public abstract String resourcePath();
+
+    /** Returns an instance scoped to change. */
+    public abstract ForChange change(ChangeData cd);
+
+    /** Returns an instance scoped to change. */
+    public abstract ForChange change(ChangeNotes notes);
+
+    /**
+     * @return instance scoped to change loaded from index. This method should only be used when
+     *     database access is harmful and potentially stale data from the index is acceptable.
+     */
+    public abstract ForChange indexedChange(ChangeData cd, ChangeNotes notes);
+
+    /** Verify scoped user can {@code perm}, throwing if denied. */
+    public abstract void check(RefPermission perm) throws AuthException, PermissionBackendException;
+
+    /** Filter {@code permSet} to permissions scoped user might be able to perform. */
+    public abstract Set<RefPermission> test(Collection<RefPermission> permSet)
+        throws PermissionBackendException;
+
+    public boolean test(RefPermission perm) throws PermissionBackendException {
+      return test(EnumSet.of(perm)).contains(perm);
+    }
+
+    /**
+     * Test if user may be able to perform the permission.
+     *
+     * <p>Similar to {@link #test(RefPermission)} except this method returns {@code false} instead
+     * of throwing an exception.
+     *
+     * @param perm the permission to test.
+     * @return true if the user might be able to perform the permission; false if the user may be
+     *     missing the necessary grants or state, or if the backend threw an exception.
+     */
+    public boolean testOrFalse(RefPermission perm) {
+      try {
+        return test(perm);
+      } catch (PermissionBackendException e) {
+        logger.atWarning().withCause(e).log("Cannot test %s; assuming false", perm);
+        return false;
+      }
+    }
+
+    public abstract BooleanCondition testCond(RefPermission perm);
+  }
+
+  /** PermissionBackend scoped to a user, project, reference and change. */
+  public abstract static class ForChange extends AcceptsReviewDb<ForChange> {
+    /** Returns the fully qualified resource path that this instance is scoped to. */
+    public abstract String resourcePath();
+
+    /** Verify scoped user can {@code perm}, throwing if denied. */
+    public abstract void check(ChangePermissionOrLabel perm)
+        throws AuthException, PermissionBackendException;
+
+    /** Filter {@code permSet} to permissions scoped user might be able to perform. */
+    public abstract <T extends ChangePermissionOrLabel> Set<T> test(Collection<T> permSet)
+        throws PermissionBackendException;
+
+    public boolean test(ChangePermissionOrLabel perm) throws PermissionBackendException {
+      return test(Collections.singleton(perm)).contains(perm);
+    }
+
+    /**
+     * Test if user may be able to perform the permission.
+     *
+     * <p>Similar to {@link #test(ChangePermissionOrLabel)} except this method returns {@code false}
+     * instead of throwing an exception.
+     *
+     * @param perm the permission to test.
+     * @return true if the user might be able to perform the permission; false if the user may be
+     *     missing the necessary grants or state, or if the backend threw an exception.
+     */
+    public boolean testOrFalse(ChangePermissionOrLabel perm) {
+      try {
+        return test(perm);
+      } catch (PermissionBackendException e) {
+        logger.atWarning().withCause(e).log("Cannot test %s; assuming false", perm);
+        return false;
+      }
+    }
+
+    public abstract BooleanCondition testCond(ChangePermissionOrLabel perm);
+
+    /**
+     * Test which values of a label the user may be able to set.
+     *
+     * @param label definition of the label to test values of.
+     * @return set containing values the user may be able to use; may be empty if none.
+     * @throws PermissionBackendException if failure consulting backend configuration.
+     */
+    public Set<LabelPermission.WithValue> test(LabelType label) throws PermissionBackendException {
+      return test(valuesOf(requireNonNull(label, "LabelType")));
+    }
+
+    /**
+     * Test which values of a group of labels the user may be able to set.
+     *
+     * @param types definition of the labels to test values of.
+     * @return set containing values the user may be able to use; may be empty if none.
+     * @throws PermissionBackendException if failure consulting backend configuration.
+     */
+    public Set<LabelPermission.WithValue> testLabels(Collection<LabelType> types)
+        throws PermissionBackendException {
+      requireNonNull(types, "LabelType");
+      return test(types.stream().flatMap((t) -> valuesOf(t).stream()).collect(toSet()));
+    }
+
+    private static Set<LabelPermission.WithValue> valuesOf(LabelType label) {
+      return label.getValues().stream()
+          .map((v) -> new LabelPermission.WithValue(label, v))
+          .collect(toSet());
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/permissions/PermissionBackendCondition.java b/java/com/google/gerrit/server/permissions/PermissionBackendCondition.java
new file mode 100644
index 0000000..1b6b087
--- /dev/null
+++ b/java/com/google/gerrit/server/permissions/PermissionBackendCondition.java
@@ -0,0 +1,253 @@
+// Copyright (C) 2017 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.google.gerrit.server.permissions;
+
+import com.google.gerrit.extensions.api.access.GlobalOrPluginPermission;
+import com.google.gerrit.extensions.conditions.BooleanCondition;
+import com.google.gerrit.extensions.conditions.PrivateInternals_BooleanCondition;
+import com.google.gerrit.server.CurrentUser;
+import java.util.Objects;
+
+/** {@link BooleanCondition} to evaluate a permission. */
+public abstract class PermissionBackendCondition
+    extends PrivateInternals_BooleanCondition.SubclassOnlyInCoreServer {
+  Boolean value;
+
+  /**
+   * Assign a specific {@code testOrFalse} result to this condition.
+   *
+   * <p>By setting the condition to a specific value the condition will bypass calling {@link
+   * PermissionBackend} during {@code value()}, and immediately return the set value instead.
+   *
+   * @param val value to return from {@code value()}.
+   */
+  public void set(boolean val) {
+    value = val;
+  }
+
+  @Override
+  public abstract String toString();
+
+  @Override
+  public boolean evaluatesTrivially() {
+    // PermissionBackendCondition needs to contact PermissionBackend so trivial evaluation is not
+    // possible.
+    return false;
+  }
+
+  @Override
+  public BooleanCondition reduce() {
+    // No reductions can be made
+    return this;
+  }
+
+  public static class WithUser extends PermissionBackendCondition {
+    private final PermissionBackend.WithUser impl;
+    private final GlobalOrPluginPermission perm;
+    private final CurrentUser user;
+
+    public WithUser(
+        PermissionBackend.WithUser impl, GlobalOrPluginPermission perm, CurrentUser user) {
+      this.impl = impl;
+      this.perm = perm;
+      this.user = user;
+    }
+
+    public PermissionBackend.WithUser withUser() {
+      return impl;
+    }
+
+    public GlobalOrPluginPermission permission() {
+      return perm;
+    }
+
+    @Override
+    public boolean value() {
+      return value != null ? value : impl.testOrFalse(perm);
+    }
+
+    @Override
+    public String toString() {
+      return "PermissionBackendCondition.WithUser(" + perm + ")";
+    }
+
+    @Override
+    public int hashCode() {
+      return Objects.hash(perm, hashForUser(user));
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+      if (!(obj instanceof WithUser)) {
+        return false;
+      }
+      WithUser other = (WithUser) obj;
+      return Objects.equals(perm, other.perm) && usersAreEqual(user, other.user);
+    }
+  }
+
+  public static class ForProject extends PermissionBackendCondition {
+    private final PermissionBackend.ForProject impl;
+    private final ProjectPermission perm;
+    private final CurrentUser user;
+
+    public ForProject(PermissionBackend.ForProject impl, ProjectPermission perm, CurrentUser user) {
+      this.impl = impl;
+      this.perm = perm;
+      this.user = user;
+    }
+
+    public PermissionBackend.ForProject project() {
+      return impl;
+    }
+
+    public ProjectPermission permission() {
+      return perm;
+    }
+
+    @Override
+    public boolean value() {
+      return value != null ? value : impl.testOrFalse(perm);
+    }
+
+    @Override
+    public String toString() {
+      return "PermissionBackendCondition.ForProject(" + perm + ")";
+    }
+
+    @Override
+    public int hashCode() {
+      return Objects.hash(perm, impl.resourcePath(), hashForUser(user));
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+      if (!(obj instanceof ForProject)) {
+        return false;
+      }
+      ForProject other = (ForProject) obj;
+      return Objects.equals(perm, other.perm)
+          && Objects.equals(impl.resourcePath(), other.impl.resourcePath())
+          && usersAreEqual(user, other.user);
+    }
+  }
+
+  public static class ForRef extends PermissionBackendCondition {
+    private final PermissionBackend.ForRef impl;
+    private final RefPermission perm;
+    private final CurrentUser user;
+
+    public ForRef(PermissionBackend.ForRef impl, RefPermission perm, CurrentUser user) {
+      this.impl = impl;
+      this.perm = perm;
+      this.user = user;
+    }
+
+    public PermissionBackend.ForRef ref() {
+      return impl;
+    }
+
+    public RefPermission permission() {
+      return perm;
+    }
+
+    @Override
+    public boolean value() {
+      return value != null ? value : impl.testOrFalse(perm);
+    }
+
+    @Override
+    public String toString() {
+      return "PermissionBackendCondition.ForRef(" + perm + ")";
+    }
+
+    @Override
+    public int hashCode() {
+      return Objects.hash(perm, impl.resourcePath(), hashForUser(user));
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+      if (!(obj instanceof ForRef)) {
+        return false;
+      }
+      ForRef other = (ForRef) obj;
+      return Objects.equals(perm, other.perm)
+          && Objects.equals(impl.resourcePath(), other.impl.resourcePath())
+          && usersAreEqual(user, other.user);
+    }
+  }
+
+  public static class ForChange extends PermissionBackendCondition {
+    private final PermissionBackend.ForChange impl;
+    private final ChangePermissionOrLabel perm;
+    private final CurrentUser user;
+
+    public ForChange(
+        PermissionBackend.ForChange impl, ChangePermissionOrLabel perm, CurrentUser user) {
+      this.impl = impl;
+      this.perm = perm;
+      this.user = user;
+    }
+
+    public PermissionBackend.ForChange change() {
+      return impl;
+    }
+
+    public ChangePermissionOrLabel permission() {
+      return perm;
+    }
+
+    @Override
+    public boolean value() {
+      return value != null ? value : impl.testOrFalse(perm);
+    }
+
+    @Override
+    public String toString() {
+      return "PermissionBackendCondition.ForChange(" + perm + ")";
+    }
+
+    @Override
+    public int hashCode() {
+      return Objects.hash(perm, impl.resourcePath(), hashForUser(user));
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+      if (!(obj instanceof ForChange)) {
+        return false;
+      }
+      ForChange other = (ForChange) obj;
+      return Objects.equals(perm, other.perm)
+          && Objects.equals(impl.resourcePath(), other.impl.resourcePath())
+          && usersAreEqual(user, other.user);
+    }
+  }
+
+  private static int hashForUser(CurrentUser user) {
+    if (!user.isIdentifiedUser()) {
+      return 0;
+    }
+    return user.getAccountId().get();
+  }
+
+  private static boolean usersAreEqual(CurrentUser user1, CurrentUser user2) {
+    if (user1.isIdentifiedUser() && user2.isIdentifiedUser()) {
+      return user1.getAccountId().equals(user2.getAccountId());
+    }
+    return false;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/permissions/PermissionBackendException.java b/java/com/google/gerrit/server/permissions/PermissionBackendException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/permissions/PermissionBackendException.java
rename to java/com/google/gerrit/server/permissions/PermissionBackendException.java
diff --git a/java/com/google/gerrit/server/permissions/PermissionCollection.java b/java/com/google/gerrit/server/permissions/PermissionCollection.java
new file mode 100644
index 0000000..1a3198d
--- /dev/null
+++ b/java/com/google/gerrit/server/permissions/PermissionCollection.java
@@ -0,0 +1,298 @@
+// Copyright (C) 2011 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.google.gerrit.server.permissions;
+
+import static com.google.gerrit.common.data.PermissionRule.Action.BLOCK;
+import static com.google.gerrit.server.project.RefPattern.isRE;
+import static java.util.stream.Collectors.mapping;
+import static java.util.stream.Collectors.toList;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.Lists;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.common.data.PermissionRule;
+import com.google.gerrit.common.data.PermissionRule.Action;
+import com.google.gerrit.metrics.Description;
+import com.google.gerrit.metrics.Description.Units;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.metrics.Timer0;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.project.RefPattern;
+import com.google.gerrit.server.project.RefPatternMatcher.ExpandParameters;
+import com.google.gerrit.server.project.SectionMatcher;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * Effective permissions applied to a reference in a project.
+ *
+ * <p>A collection may be user specific if a matching {@link AccessSection} uses "${username}" in
+ * its name. The permissions granted in that section may only be granted to the username that
+ * appears in the reference name, and also only if the user is a member of the relevant group.
+ */
+public class PermissionCollection {
+  @Singleton
+  public static class Factory {
+    private final SectionSortCache sorter;
+    // TODO(hiesel): Remove this once we got production data
+    private final Timer0 filterLatency;
+
+    @Inject
+    Factory(SectionSortCache sorter, MetricMaker metricMaker) {
+      this.sorter = sorter;
+      this.filterLatency =
+          metricMaker.newTimer(
+              "permissions/permission_collection/filter_latency",
+              new Description("Latency for access filter computations in PermissionCollection")
+                  .setCumulative()
+                  .setUnit(Units.NANOSECONDS));
+    }
+
+    /**
+     * Drop the SectionMatchers that don't apply to the current ref. The user is only used for
+     * expanding per-user ref patterns, and not for checking group memberships.
+     *
+     * @param matcherList the input sections.
+     * @param ref the ref name for which to filter.
+     * @param user Only used for expanding per-user ref patterns.
+     * @param out the filtered sections.
+     * @return true if the result is only valid for this user.
+     */
+    private static boolean filterRefMatchingSections(
+        Iterable<SectionMatcher> matcherList,
+        String ref,
+        CurrentUser user,
+        Map<AccessSection, Project.NameKey> out) {
+      boolean perUser = false;
+      for (SectionMatcher sm : matcherList) {
+        // If the matcher has to expand parameters and its prefix matches the
+        // reference there is a very good chance the reference is actually user
+        // specific, even if the matcher does not match the reference. Since its
+        // difficult to prove this is true all of the time, use an approximation
+        // to prevent reuse of collections across users accessing the same
+        // reference at the same time.
+        //
+        // This check usually gets caching right, as most per-user references
+        // use a common prefix like "refs/sandbox/" or "refs/heads/users/"
+        // that will never be shared with non-user references, and the per-user
+        // references are usually less frequent than the non-user references.
+        if (sm.getMatcher() instanceof ExpandParameters) {
+          if (!((ExpandParameters) sm.getMatcher()).matchPrefix(ref)) {
+            continue;
+          }
+          perUser = true;
+          if (sm.match(ref, user)) {
+            out.put(sm.getSection(), sm.getProject());
+          }
+        } else if (sm.match(ref, null)) {
+          out.put(sm.getSection(), sm.getProject());
+        }
+      }
+      return perUser;
+    }
+
+    /**
+     * Get all permissions that apply to a reference. The user is only used for per-user ref names,
+     * so the return value may include permissions for groups the user is not part of.
+     *
+     * @param matcherList collection of sections that should be considered, in priority order
+     *     (project specific definitions must appear before inherited ones).
+     * @param ref reference being accessed.
+     * @param user if the reference is a per-user reference, e.g. access sections using the
+     *     parameter variable "${username}" will have each username inserted into them to see if
+     *     they apply to the reference named by {@code ref}.
+     * @return map of permissions that apply to this reference, keyed by permission name.
+     */
+    PermissionCollection filter(
+        Iterable<SectionMatcher> matcherList, String ref, CurrentUser user) {
+      try (Timer0.Context ignored = filterLatency.start()) {
+        if (isRE(ref)) {
+          ref = RefPattern.shortestExample(ref);
+        } else if (ref.endsWith("/*")) {
+          ref = ref.substring(0, ref.length() - 1);
+        }
+
+        // LinkedHashMap to maintain input ordering.
+        Map<AccessSection, Project.NameKey> sectionToProject = new LinkedHashMap<>();
+        boolean perUser = filterRefMatchingSections(matcherList, ref, user, sectionToProject);
+        List<AccessSection> sections = Lists.newArrayList(sectionToProject.keySet());
+
+        // Sort by ref pattern specificity. For equally specific patterns, the sections from the
+        // project closer to the current one come first.
+        sorter.sort(ref, sections);
+
+        // For block permissions, we want a different order: first, we want to go from parent to
+        // child.
+        List<Map.Entry<AccessSection, Project.NameKey>> accessDescending =
+            Lists.reverse(Lists.newArrayList(sectionToProject.entrySet()));
+
+        Map<Project.NameKey, List<AccessSection>> accessByProject =
+            accessDescending.stream()
+                .collect(
+                    Collectors.groupingBy(
+                        Map.Entry::getValue,
+                        LinkedHashMap::new,
+                        mapping(Map.Entry::getKey, toList())));
+        // Within each project, sort by ref specificity.
+        for (List<AccessSection> secs : accessByProject.values()) {
+          sorter.sort(ref, secs);
+        }
+
+        return new PermissionCollection(
+            Lists.newArrayList(accessByProject.values()), sections, perUser);
+      }
+    }
+  }
+
+  /** Returns permissions in the right order for evaluating BLOCK status. */
+  List<List<Permission>> getBlockRules(String perm) {
+    List<List<Permission>> ps = blockPerProjectByPermission.get(perm);
+    if (ps == null) {
+      ps = calculateBlockRules(perm);
+      blockPerProjectByPermission.put(perm, ps);
+    }
+    return ps;
+  }
+
+  /** Returns permissions in the right order for evaluating ALLOW/DENY status. */
+  List<PermissionRule> getAllowRules(String perm) {
+    List<PermissionRule> ps = rulesByPermission.get(perm);
+    if (ps == null) {
+      ps = calculateAllowRules(perm);
+      rulesByPermission.put(perm, ps);
+    }
+    return ps;
+  }
+
+  /** calculates permissions for ALLOW processing. */
+  private List<PermissionRule> calculateAllowRules(String permName) {
+    Set<SeenRule> seen = new HashSet<>();
+
+    List<PermissionRule> r = new ArrayList<>();
+    for (AccessSection s : accessSectionsUpward) {
+      Permission p = s.getPermission(permName);
+      if (p == null) {
+        continue;
+      }
+      for (PermissionRule pr : p.getRules()) {
+        SeenRule sr = SeenRule.create(s, pr);
+        if (seen.contains(sr)) {
+          // We allow only one rule per (ref-pattern, group) tuple. This is used to implement DENY:
+          // If we see a DENY before an ALLOW rule, that causes the ALLOW rule to be skipped here,
+          // negating access.
+          continue;
+        }
+        seen.add(sr);
+
+        if (pr.getAction() == BLOCK) {
+          // Block rules are handled elsewhere.
+          continue;
+        }
+
+        if (pr.getAction() == PermissionRule.Action.DENY) {
+          // DENY rules work by not adding ALLOW rules. Nothing else to do.
+          continue;
+        }
+        r.add(pr);
+      }
+      if (p.getExclusiveGroup()) {
+        // We found an exclusive permission, so no need to further go up the hierarchy.
+        break;
+      }
+    }
+    return r;
+  }
+
+  // Calculates the inputs for determining BLOCK status, grouped by project.
+  private List<List<Permission>> calculateBlockRules(String permName) {
+    List<List<Permission>> result = new ArrayList<>();
+    for (List<AccessSection> secs : this.accessSectionsPerProjectDownward) {
+      List<Permission> perms = new ArrayList<>();
+      boolean blockFound = false;
+      for (AccessSection sec : secs) {
+        Permission p = sec.getPermission(permName);
+        if (p == null) {
+          continue;
+        }
+        for (PermissionRule pr : p.getRules()) {
+          if (blockFound || pr.getAction() == Action.BLOCK) {
+            blockFound = true;
+            break;
+          }
+        }
+
+        perms.add(p);
+      }
+
+      if (blockFound) {
+        result.add(perms);
+      }
+    }
+    return result;
+  }
+
+  private List<List<AccessSection>> accessSectionsPerProjectDownward;
+  private List<AccessSection> accessSectionsUpward;
+
+  private final Map<String, List<PermissionRule>> rulesByPermission;
+  private final Map<String, List<List<Permission>>> blockPerProjectByPermission;
+  private final boolean perUser;
+
+  private PermissionCollection(
+      List<List<AccessSection>> accessSectionsDownward,
+      List<AccessSection> accessSectionsUpward,
+      boolean perUser) {
+    this.accessSectionsPerProjectDownward = accessSectionsDownward;
+    this.accessSectionsUpward = accessSectionsUpward;
+    this.rulesByPermission = new HashMap<>();
+    this.blockPerProjectByPermission = new HashMap<>();
+    this.perUser = perUser;
+  }
+
+  /**
+   * @return true if a "${username}" pattern might need to be expanded to build this collection,
+   *     making the results user specific.
+   */
+  public boolean isUserSpecific() {
+    return perUser;
+  }
+
+  /** (ref, permission, group) tuple. */
+  @AutoValue
+  abstract static class SeenRule {
+    public abstract String refPattern();
+
+    @Nullable
+    public abstract AccountGroup.UUID group();
+
+    static SeenRule create(AccessSection section, @Nullable PermissionRule rule) {
+      AccountGroup.UUID group =
+          rule != null && rule.getGroup() != null ? rule.getGroup().getUUID() : null;
+      return new AutoValue_PermissionCollection_SeenRule(section.getName(), group);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/permissions/PermissionDeniedException.java b/java/com/google/gerrit/server/permissions/PermissionDeniedException.java
new file mode 100644
index 0000000..b9e86cd
--- /dev/null
+++ b/java/com/google/gerrit/server/permissions/PermissionDeniedException.java
@@ -0,0 +1,58 @@
+// 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.
+
+package com.google.gerrit.server.permissions;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.gerrit.extensions.api.access.GerritPermission;
+import com.google.gerrit.extensions.restapi.AuthException;
+import java.util.Optional;
+
+/**
+ * This signals that some permission check failed. The message is short so it can print on a
+ * single-line in the Git output.
+ */
+public class PermissionDeniedException extends AuthException {
+  private static final long serialVersionUID = 1L;
+
+  public static final String MESSAGE_PREFIX = "not permitted: ";
+
+  private final GerritPermission permission;
+  private final Optional<String> resource;
+
+  public PermissionDeniedException(GerritPermission permission) {
+    super(MESSAGE_PREFIX + requireNonNull(permission).describeForException());
+    this.permission = permission;
+    this.resource = Optional.empty();
+  }
+
+  public PermissionDeniedException(GerritPermission permission, String resource) {
+    super(
+        MESSAGE_PREFIX
+            + requireNonNull(permission).describeForException()
+            + " on "
+            + requireNonNull(resource));
+    this.permission = permission;
+    this.resource = Optional.of(resource);
+  }
+
+  public String describePermission() {
+    return permission.describeForException();
+  }
+
+  public Optional<String> getResource() {
+    return resource;
+  }
+}
diff --git a/java/com/google/gerrit/server/permissions/ProjectControl.java b/java/com/google/gerrit/server/permissions/ProjectControl.java
new file mode 100644
index 0000000..787bee4
--- /dev/null
+++ b/java/com/google/gerrit/server/permissions/ProjectControl.java
@@ -0,0 +1,442 @@
+// Copyright (C) 2009 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.google.gerrit.server.permissions;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.gerrit.reviewdb.client.RefNames.REFS_TAGS;
+
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.common.data.PermissionRule;
+import com.google.gerrit.extensions.conditions.BooleanCondition;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.GroupMembership;
+import com.google.gerrit.server.config.GitReceivePackGroups;
+import com.google.gerrit.server.config.GitUploadPackGroups;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.permissions.PermissionBackend.ForChange;
+import com.google.gerrit.server.permissions.PermissionBackend.ForProject;
+import com.google.gerrit.server.permissions.PermissionBackend.ForRef;
+import com.google.gerrit.server.permissions.PermissionBackend.RefFilterOptions;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.project.SectionMatcher;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+
+/** Access control management for a user accessing a project's data. */
+class ProjectControl {
+  interface Factory {
+    ProjectControl create(CurrentUser who, ProjectState ps);
+  }
+
+  private final Set<AccountGroup.UUID> uploadGroups;
+  private final Set<AccountGroup.UUID> receiveGroups;
+  private final PermissionBackend permissionBackend;
+  private final CurrentUser user;
+  private final ProjectState state;
+  private final ChangeControl.Factory changeControlFactory;
+  private final PermissionCollection.Factory permissionFilter;
+  private final DefaultRefFilter.Factory refFilterFactory;
+
+  private List<SectionMatcher> allSections;
+  private Map<String, RefControl> refControls;
+  private Boolean declaredOwner;
+
+  @Inject
+  ProjectControl(
+      @GitUploadPackGroups Set<AccountGroup.UUID> uploadGroups,
+      @GitReceivePackGroups Set<AccountGroup.UUID> receiveGroups,
+      PermissionCollection.Factory permissionFilter,
+      ChangeControl.Factory changeControlFactory,
+      PermissionBackend permissionBackend,
+      DefaultRefFilter.Factory refFilterFactory,
+      @Assisted CurrentUser who,
+      @Assisted ProjectState ps) {
+    this.changeControlFactory = changeControlFactory;
+    this.uploadGroups = uploadGroups;
+    this.receiveGroups = receiveGroups;
+    this.permissionFilter = permissionFilter;
+    this.permissionBackend = permissionBackend;
+    this.refFilterFactory = refFilterFactory;
+    user = who;
+    state = ps;
+  }
+
+  ForProject asForProject() {
+    return new ForProjectImpl();
+  }
+
+  ChangeControl controlFor(ReviewDb db, Change change) throws OrmException {
+    return changeControlFactory.create(
+        controlForRef(change.getDest()), db, change.getProject(), change.getId());
+  }
+
+  ChangeControl controlFor(ChangeNotes notes) {
+    return changeControlFactory.create(controlForRef(notes.getChange().getDest()), notes);
+  }
+
+  RefControl controlForRef(Branch.NameKey ref) {
+    return controlForRef(ref.get());
+  }
+
+  public RefControl controlForRef(String refName) {
+    if (refControls == null) {
+      refControls = new HashMap<>();
+    }
+    RefControl ctl = refControls.get(refName);
+    if (ctl == null) {
+      PermissionCollection relevant = permissionFilter.filter(access(), refName, user);
+      ctl = new RefControl(this, refName, relevant);
+      refControls.put(refName, ctl);
+    }
+    return ctl;
+  }
+
+  CurrentUser getUser() {
+    return user;
+  }
+
+  ProjectState getProjectState() {
+    return state;
+  }
+
+  Project getProject() {
+    return state.getProject();
+  }
+
+  /** Is this user a project owner? */
+  boolean isOwner() {
+    return (isDeclaredOwner() && controlForRef("refs/*").canPerform(Permission.OWNER)) || isAdmin();
+  }
+
+  /**
+   * @return {@code Capable.OK} if the user can upload to at least one reference. Does not check
+   *     Contributor Agreements.
+   */
+  boolean canPushToAtLeastOneRef() {
+    return canPerformOnAnyRef(Permission.PUSH)
+        || canPerformOnAnyRef(Permission.CREATE_TAG)
+        || isOwner();
+  }
+
+  boolean isAdmin() {
+    try {
+      permissionBackend.user(user).check(GlobalPermission.ADMINISTRATE_SERVER);
+      return true;
+    } catch (AuthException | PermissionBackendException e) {
+      return false;
+    }
+  }
+
+  boolean match(PermissionRule rule, boolean isChangeOwner) {
+    return match(rule.getGroup().getUUID(), isChangeOwner);
+  }
+
+  boolean allRefsAreVisible(Set<String> ignore) {
+    return user.isInternalUser() || canPerformOnAllRefs(Permission.READ, ignore);
+  }
+
+  /** Can the user run upload pack? */
+  private boolean canRunUploadPack() {
+    for (AccountGroup.UUID group : uploadGroups) {
+      if (match(group)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /** Can the user run receive pack? */
+  private boolean canRunReceivePack() {
+    for (AccountGroup.UUID group : receiveGroups) {
+      if (match(group)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  private boolean canAddRefs() {
+    return (canPerformOnAnyRef(Permission.CREATE) || isAdmin());
+  }
+
+  private boolean canAddTagRefs() {
+    return (canPerformOnTagRef(Permission.CREATE) || isAdmin());
+  }
+
+  private boolean canCreateChanges() {
+    for (SectionMatcher matcher : access()) {
+      AccessSection section = matcher.getSection();
+      if (section.getName().startsWith("refs/for/")) {
+        Permission permission = section.getPermission(Permission.PUSH);
+        if (permission != null && controlForRef(section.getName()).canPerform(Permission.PUSH)) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+  private boolean isDeclaredOwner() {
+    if (declaredOwner == null) {
+      GroupMembership effectiveGroups = user.getEffectiveGroups();
+      declaredOwner = effectiveGroups.containsAnyOf(state.getAllOwners());
+    }
+    return declaredOwner;
+  }
+
+  private boolean canPerformOnTagRef(String permissionName) {
+    for (SectionMatcher matcher : access()) {
+      AccessSection section = matcher.getSection();
+
+      if (section.getName().startsWith(REFS_TAGS)) {
+        Permission permission = section.getPermission(permissionName);
+        if (permission == null) {
+          continue;
+        }
+
+        Boolean can = canPerform(permissionName, section, permission);
+        if (can != null) {
+          return can;
+        }
+      }
+    }
+
+    return false;
+  }
+
+  private boolean canPerformOnAnyRef(String permissionName) {
+    for (SectionMatcher matcher : access()) {
+      AccessSection section = matcher.getSection();
+      Permission permission = section.getPermission(permissionName);
+      if (permission == null) {
+        continue;
+      }
+
+      Boolean can = canPerform(permissionName, section, permission);
+      if (can != null) {
+        return can;
+      }
+    }
+
+    return false;
+  }
+
+  private Boolean canPerform(String permissionName, AccessSection section, Permission permission) {
+    for (PermissionRule rule : permission.getRules()) {
+      if (rule.isBlock() || rule.isDeny() || !match(rule)) {
+        continue;
+      }
+
+      // Being in a group that was granted this permission is only an
+      // approximation.  There might be overrides and doNotInherit
+      // that would render this to be false.
+      //
+      if (controlForRef(section.getName()).canPerform(permissionName)) {
+        return true;
+      }
+      break;
+    }
+    return null;
+  }
+
+  private boolean canPerformOnAllRefs(String permission, Set<String> ignore) {
+    boolean canPerform = false;
+    Set<String> patterns = allRefPatterns(permission);
+    if (patterns.contains(AccessSection.ALL)) {
+      // Only possible if granted on the pattern that
+      // matches every possible reference.  Check all
+      // patterns also have the permission.
+      //
+      for (String pattern : patterns) {
+        if (controlForRef(pattern).canPerform(permission)) {
+          canPerform = true;
+        } else if (ignore.contains(pattern)) {
+          continue;
+        } else {
+          return false;
+        }
+      }
+    }
+    return canPerform;
+  }
+
+  private Set<String> allRefPatterns(String permissionName) {
+    Set<String> all = new HashSet<>();
+    for (SectionMatcher matcher : access()) {
+      AccessSection section = matcher.getSection();
+      Permission permission = section.getPermission(permissionName);
+      if (permission != null) {
+        all.add(section.getName());
+      }
+    }
+    return all;
+  }
+
+  private List<SectionMatcher> access() {
+    if (allSections == null) {
+      allSections = state.getAllSections();
+    }
+    return allSections;
+  }
+
+  private boolean match(PermissionRule rule) {
+    return match(rule.getGroup().getUUID());
+  }
+
+  private boolean match(AccountGroup.UUID uuid) {
+    return match(uuid, false);
+  }
+
+  private boolean match(AccountGroup.UUID uuid, boolean isChangeOwner) {
+    if (SystemGroupBackend.PROJECT_OWNERS.equals(uuid)) {
+      return isDeclaredOwner();
+    } else if (SystemGroupBackend.CHANGE_OWNER.equals(uuid)) {
+      return isChangeOwner;
+    } else {
+      return user.getEffectiveGroups().contains(uuid);
+    }
+  }
+
+  private class ForProjectImpl extends ForProject {
+    private DefaultRefFilter refFilter;
+    private String resourcePath;
+
+    @Override
+    public String resourcePath() {
+      if (resourcePath == null) {
+        resourcePath = "/projects/" + getProjectState().getName();
+      }
+      return resourcePath;
+    }
+
+    @Override
+    public ForRef ref(String ref) {
+      return controlForRef(ref).asForRef().database(db);
+    }
+
+    @Override
+    public ForChange change(ChangeData cd) {
+      try {
+        checkProject(cd.change());
+        return super.change(cd);
+      } catch (OrmException e) {
+        return FailedPermissionBackend.change("unavailable", e);
+      }
+    }
+
+    @Override
+    public ForChange change(ChangeNotes notes) {
+      checkProject(notes.getChange());
+      return super.change(notes);
+    }
+
+    private void checkProject(Change change) {
+      Project.NameKey project = getProject().getNameKey();
+      checkArgument(
+          project.equals(change.getProject()),
+          "expected change in project %s, not %s",
+          project,
+          change.getProject());
+    }
+
+    @Override
+    public void check(ProjectPermission perm) throws AuthException, PermissionBackendException {
+      if (!can(perm)) {
+        throw new AuthException(perm.describeForException() + " not permitted");
+      }
+    }
+
+    @Override
+    public Set<ProjectPermission> test(Collection<ProjectPermission> permSet)
+        throws PermissionBackendException {
+      EnumSet<ProjectPermission> ok = EnumSet.noneOf(ProjectPermission.class);
+      for (ProjectPermission perm : permSet) {
+        if (can(perm)) {
+          ok.add(perm);
+        }
+      }
+      return ok;
+    }
+
+    @Override
+    public BooleanCondition testCond(ProjectPermission perm) {
+      return new PermissionBackendCondition.ForProject(this, perm, getUser());
+    }
+
+    @Override
+    public Map<String, Ref> filter(Map<String, Ref> refs, Repository repo, RefFilterOptions opts)
+        throws PermissionBackendException {
+      if (refFilter == null) {
+        refFilter = refFilterFactory.create(ProjectControl.this);
+      }
+      return refFilter.filter(refs, repo, opts);
+    }
+
+    private boolean can(ProjectPermission perm) throws PermissionBackendException {
+      switch (perm) {
+        case ACCESS:
+          return user.isInternalUser() || isOwner() || canPerformOnAnyRef(Permission.READ);
+
+        case READ:
+          return allRefsAreVisible(Collections.emptySet());
+
+        case CREATE_REF:
+          return canAddRefs();
+        case CREATE_TAG_REF:
+          return canAddTagRefs();
+        case CREATE_CHANGE:
+          return canCreateChanges();
+
+        case RUN_RECEIVE_PACK:
+          return canRunReceivePack();
+        case RUN_UPLOAD_PACK:
+          return canRunUploadPack();
+
+        case PUSH_AT_LEAST_ONE_REF:
+          return canPushToAtLeastOneRef();
+
+        case READ_CONFIG:
+          return controlForRef(RefNames.REFS_CONFIG).isVisible();
+
+        case BAN_COMMIT:
+        case READ_REFLOG:
+        case WRITE_CONFIG:
+          return isOwner();
+      }
+      throw new PermissionBackendException(perm + " unsupported");
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/permissions/ProjectPermission.java b/java/com/google/gerrit/server/permissions/ProjectPermission.java
new file mode 100644
index 0000000..ca04f3b
--- /dev/null
+++ b/java/com/google/gerrit/server/permissions/ProjectPermission.java
@@ -0,0 +1,118 @@
+// Copyright (C) 2017 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.google.gerrit.server.permissions;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.gerrit.extensions.api.access.GerritPermission;
+import com.google.gerrit.reviewdb.client.RefNames;
+
+public enum ProjectPermission implements GerritPermission {
+  /**
+   * Can access at least one reference or change within the repository.
+   *
+   * <p>Checking this permission instead of {@link #READ} may require filtering to hide specific
+   * references or changes, which can be expensive.
+   */
+  ACCESS("access at least one ref"),
+
+  /**
+   * Can read all references in the repository.
+   *
+   * <p>This is a stronger form of {@link #ACCESS} where no filtering is required.
+   */
+  READ,
+
+  /**
+   * Can create at least one reference in the project.
+   *
+   * <p>This project level permission only validates the user may create some type of reference
+   * within the project. The exact reference name must be checked at creation:
+   *
+   * <pre>permissionBackend
+   *    .user(user)
+   *    .project(proj)
+   *    .ref(ref)
+   *    .check(RefPermission.CREATE);
+   * </pre>
+   */
+  CREATE_REF,
+
+  /**
+   * Can create at least one tag reference in the project.
+   *
+   * <p>This project level permission only validates the user may create some tag reference within
+   * the project. The exact reference name must be checked at creation:
+   *
+   * <pre>permissionBackend
+   *    .user(user)
+   *    .project(proj)
+   *    .ref(ref)
+   *    .check(RefPermission.CREATE);
+   * </pre>
+   */
+  CREATE_TAG_REF,
+
+  /**
+   * Can create at least one change in the project.
+   *
+   * <p>This project level permission only validates the user may create a change for some branch
+   * within the project. The exact reference name must be checked at creation:
+   *
+   * <pre>permissionBackend
+   *    .user(user)
+   *    .project(proj)
+   *    .ref(ref)
+   *    .check(RefPermission.CREATE_CHANGE);
+   * </pre>
+   */
+  CREATE_CHANGE,
+
+  /** Can run receive pack. */
+  RUN_RECEIVE_PACK("run receive-pack"),
+
+  /** Can run upload pack. */
+  RUN_UPLOAD_PACK("run upload-pack"),
+
+  /** Allow read access to refs/meta/config. */
+  READ_CONFIG("read " + RefNames.REFS_CONFIG),
+
+  /** Allow write access to refs/meta/config. */
+  WRITE_CONFIG("write " + RefNames.REFS_CONFIG),
+
+  /** Allow banning commits from Gerrit preventing pushes of these commits. */
+  BAN_COMMIT,
+
+  /** Allow accessing the project's reflog. */
+  READ_REFLOG,
+
+  /** Can push to at least one reference within the repository. */
+  PUSH_AT_LEAST_ONE_REF("push to at least one ref");
+
+  private final String description;
+
+  ProjectPermission() {
+    this.description = null;
+  }
+
+  ProjectPermission(String description) {
+    this.description = requireNonNull(description);
+  }
+
+  @Override
+  public String describeForException() {
+    return description != null ? description : GerritPermission.describeEnumValue(this);
+  }
+}
diff --git a/java/com/google/gerrit/server/permissions/RefControl.java b/java/com/google/gerrit/server/permissions/RefControl.java
new file mode 100644
index 0000000..74b04a3
--- /dev/null
+++ b/java/com/google/gerrit/server/permissions/RefControl.java
@@ -0,0 +1,638 @@
+// Copyright (C) 2010 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.google.gerrit.server.permissions;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.common.data.PermissionRange;
+import com.google.gerrit.common.data.PermissionRule;
+import com.google.gerrit.common.data.PermissionRule.Action;
+import com.google.gerrit.extensions.conditions.BooleanCondition;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.logging.CallerFinder;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.permissions.PermissionBackend.ForChange;
+import com.google.gerrit.server.permissions.PermissionBackend.ForRef;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.util.MagicBranch;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.util.Providers;
+import java.util.Collection;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.Set;
+
+/** Manages access control for Git references (aka branches, tags). */
+class RefControl {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final ProjectControl projectControl;
+  private final String refName;
+
+  /** All permissions that apply to this reference. */
+  private final PermissionCollection relevant;
+
+  private final CallerFinder callerFinder;
+
+  // The next 4 members are cached canPerform() permissions.
+
+  private Boolean owner;
+  private Boolean canForgeAuthor;
+  private Boolean canForgeCommitter;
+  private Boolean isVisible;
+
+  RefControl(ProjectControl projectControl, String ref, PermissionCollection relevant) {
+    this.projectControl = projectControl;
+    this.refName = ref;
+    this.relevant = relevant;
+    this.callerFinder =
+        CallerFinder.builder()
+            .addTarget(PermissionBackend.class)
+            .matchSubClasses(true)
+            .matchInnerClasses(true)
+            .skip(1)
+            .build();
+  }
+
+  ProjectControl getProjectControl() {
+    return projectControl;
+  }
+
+  CurrentUser getUser() {
+    return projectControl.getUser();
+  }
+
+  /** Is this user a ref owner? */
+  boolean isOwner() {
+    if (owner == null) {
+      if (canPerform(Permission.OWNER)) {
+        owner = true;
+
+      } else {
+        owner = projectControl.isOwner();
+      }
+    }
+    return owner;
+  }
+
+  /** Can this user see this reference exists? */
+  boolean isVisible() {
+    if (isVisible == null) {
+      isVisible = getUser().isInternalUser() || canPerform(Permission.READ);
+    }
+    return isVisible;
+  }
+
+  /** @return true if this user can add a new patch set to this ref */
+  boolean canAddPatchSet() {
+    return projectControl
+        .controlForRef(MagicBranch.NEW_CHANGE + refName)
+        .canPerform(Permission.ADD_PATCH_SET);
+  }
+
+  /** @return true if this user can rebase changes on this ref */
+  boolean canRebase() {
+    return canPerform(Permission.REBASE);
+  }
+
+  /** @return true if this user can submit patch sets to this ref */
+  boolean canSubmit(boolean isChangeOwner) {
+    if (RefNames.REFS_CONFIG.equals(refName)) {
+      // Always allow project owners to submit configuration changes.
+      // Submitting configuration changes modifies the access control
+      // rules. Allowing this to be done by a non-project-owner opens
+      // a security hole enabling editing of access rules, and thus
+      // granting of powers beyond submitting to the configuration.
+      return projectControl.isOwner();
+    }
+    return canPerform(Permission.SUBMIT, isChangeOwner, false);
+  }
+
+  /** @return true if this user can force edit topic names. */
+  boolean canForceEditTopicName() {
+    return canPerform(Permission.EDIT_TOPIC_NAME, false, true);
+  }
+
+  /** @return true if this user can delete changes. */
+  boolean canDeleteChanges(boolean isChangeOwner) {
+    return canPerform(Permission.DELETE_CHANGES)
+        || (isChangeOwner && canPerform(Permission.DELETE_OWN_CHANGES, isChangeOwner, false));
+  }
+
+  /** The range of permitted values associated with a label permission. */
+  PermissionRange getRange(String permission) {
+    return getRange(permission, false);
+  }
+
+  /** The range of permitted values associated with a label permission. */
+  PermissionRange getRange(String permission, boolean isChangeOwner) {
+    if (Permission.hasRange(permission)) {
+      return toRange(permission, isChangeOwner);
+    }
+    return null;
+  }
+
+  /** True if the user has this permission. Works only for non labels. */
+  boolean canPerform(String permissionName) {
+    return canPerform(permissionName, false, false);
+  }
+
+  ForRef asForRef() {
+    return new ForRefImpl();
+  }
+
+  private boolean canUpload() {
+    return projectControl.controlForRef("refs/for/" + refName).canPerform(Permission.PUSH);
+  }
+
+  /** @return true if this user can submit merge patch sets to this ref */
+  private boolean canUploadMerges() {
+    return projectControl.controlForRef("refs/for/" + refName).canPerform(Permission.PUSH_MERGE);
+  }
+
+  /** @return true if the user can update the reference as a fast-forward. */
+  private boolean canUpdate() {
+    if (RefNames.REFS_CONFIG.equals(refName) && !projectControl.isOwner()) {
+      // Pushing requires being at least project owner, in addition to push.
+      // Pushing configuration changes modifies the access control
+      // rules. Allowing this to be done by a non-project-owner opens
+      // a security hole enabling editing of access rules, and thus
+      // granting of powers beyond pushing to the configuration.
+
+      // On the AllProjects project the owner access right cannot be assigned,
+      // this why for the AllProjects project we allow administrators to push
+      // configuration changes if they have push without being project owner.
+      if (!(projectControl.getProjectState().isAllProjects() && projectControl.isAdmin())) {
+        return false;
+      }
+    }
+    return canPerform(Permission.PUSH);
+  }
+
+  /** @return true if the user can rewind (force push) the reference. */
+  private boolean canForceUpdate() {
+    if (canPushWithForce()) {
+      return true;
+    }
+
+    switch (getUser().getAccessPath()) {
+      case GIT:
+        return false;
+
+      case JSON_RPC:
+      case REST_API:
+      case SSH_COMMAND:
+      case UNKNOWN:
+      case WEB_BROWSER:
+      default:
+        return (isOwner() && !isBlocked(Permission.PUSH, false, true)) || projectControl.isAdmin();
+    }
+  }
+
+  private boolean canPushWithForce() {
+    if (RefNames.REFS_CONFIG.equals(refName) && !projectControl.isOwner()) {
+      // Pushing requires being at least project owner, in addition to push.
+      // Pushing configuration changes modifies the access control
+      // rules. Allowing this to be done by a non-project-owner opens
+      // a security hole enabling editing of access rules, and thus
+      // granting of powers beyond pushing to the configuration.
+      return false;
+    }
+    return canPerform(Permission.PUSH, false, true);
+  }
+
+  /**
+   * Determines whether the user can delete the Git ref controlled by this object.
+   *
+   * @return {@code true} if the user specified can delete a Git ref.
+   */
+  private boolean canDelete() {
+    switch (getUser().getAccessPath()) {
+      case GIT:
+        return canPushWithForce() || canPerform(Permission.DELETE);
+
+      case JSON_RPC:
+      case REST_API:
+      case SSH_COMMAND:
+      case UNKNOWN:
+      case WEB_BROWSER:
+      default:
+        return
+        // We allow owner to delete refs even if they have no force-push rights. We forbid
+        // it if force push is blocked, though. See commit 40bd5741026863c99bea13eb5384bd27855c5e1b
+        (isOwner() && !isBlocked(Permission.PUSH, false, true))
+            || canPushWithForce()
+            || canPerform(Permission.DELETE)
+            || projectControl.isAdmin();
+    }
+  }
+
+  /** @return true if this user can forge the author line in a commit. */
+  private boolean canForgeAuthor() {
+    if (canForgeAuthor == null) {
+      canForgeAuthor = canPerform(Permission.FORGE_AUTHOR);
+    }
+    return canForgeAuthor;
+  }
+
+  /** @return true if this user can forge the committer line in a commit. */
+  private boolean canForgeCommitter() {
+    if (canForgeCommitter == null) {
+      canForgeCommitter = canPerform(Permission.FORGE_COMMITTER);
+    }
+    return canForgeCommitter;
+  }
+
+  /** @return true if this user can forge the server on the committer line. */
+  private boolean canForgeGerritServerIdentity() {
+    return canPerform(Permission.FORGE_SERVER);
+  }
+
+  private static boolean isAllow(PermissionRule pr, boolean withForce) {
+    return pr.getAction() == Action.ALLOW && (pr.getForce() || !withForce);
+  }
+
+  private static boolean isBlock(PermissionRule pr, boolean withForce) {
+    // BLOCK with force specified is a weaker rule than without.
+    return pr.getAction() == Action.BLOCK && (!pr.getForce() || withForce);
+  }
+
+  private PermissionRange toRange(String permissionName, boolean isChangeOwner) {
+    int blockAllowMin = Integer.MIN_VALUE, blockAllowMax = Integer.MAX_VALUE;
+
+    projectLoop:
+    for (List<Permission> ps : relevant.getBlockRules(permissionName)) {
+      boolean blockFound = false;
+      int projectBlockAllowMin = Integer.MIN_VALUE, projectBlockAllowMax = Integer.MAX_VALUE;
+
+      for (Permission p : ps) {
+        if (p.getExclusiveGroup()) {
+          for (PermissionRule pr : p.getRules()) {
+            if (pr.getAction() == Action.ALLOW && projectControl.match(pr, isChangeOwner)) {
+              // exclusive override, usually for a more specific ref.
+              continue projectLoop;
+            }
+          }
+        }
+
+        for (PermissionRule pr : p.getRules()) {
+          if (pr.getAction() == Action.BLOCK && projectControl.match(pr, isChangeOwner)) {
+            projectBlockAllowMin = pr.getMin() + 1;
+            projectBlockAllowMax = pr.getMax() - 1;
+            blockFound = true;
+          }
+        }
+
+        if (blockFound) {
+          for (PermissionRule pr : p.getRules()) {
+            if (pr.getAction() == Action.ALLOW && projectControl.match(pr, isChangeOwner)) {
+              projectBlockAllowMin = pr.getMin();
+              projectBlockAllowMax = pr.getMax();
+              break;
+            }
+          }
+          break;
+        }
+      }
+
+      blockAllowMin = Math.max(projectBlockAllowMin, blockAllowMin);
+      blockAllowMax = Math.min(projectBlockAllowMax, blockAllowMax);
+    }
+
+    int voteMin = 0, voteMax = 0;
+    for (PermissionRule pr : relevant.getAllowRules(permissionName)) {
+      if (pr.getAction() == PermissionRule.Action.ALLOW
+          && projectControl.match(pr, isChangeOwner)) {
+        // For votes, contrary to normal permissions, we aggregate all applicable rules.
+        voteMin = Math.min(voteMin, pr.getMin());
+        voteMax = Math.max(voteMax, pr.getMax());
+      }
+    }
+
+    return new PermissionRange(
+        permissionName, Math.max(voteMin, blockAllowMin), Math.min(voteMax, blockAllowMax));
+  }
+
+  private boolean isBlocked(String permissionName, boolean isChangeOwner, boolean withForce) {
+    // Permissions are ordered by (more general project, more specific ref). Because Permission
+    // does not have back pointers, we can't tell what ref-pattern or project each permission comes
+    // from.
+    List<List<Permission>> downwardPerProject = relevant.getBlockRules(permissionName);
+
+    projectLoop:
+    for (List<Permission> projectRules : downwardPerProject) {
+      boolean overrideFound = false;
+      for (Permission p : projectRules) {
+        // If this is an exclusive ALLOW, then block rules from the same project are ignored.
+        if (p.getExclusiveGroup()) {
+          for (PermissionRule pr : p.getRules()) {
+            if (isAllow(pr, withForce) && projectControl.match(pr, isChangeOwner)) {
+              overrideFound = true;
+              break;
+            }
+          }
+        }
+        if (overrideFound) {
+          // Found an exclusive override, nothing further to do in this project.
+          continue projectLoop;
+        }
+
+        boolean blocked = false;
+        for (PermissionRule pr : p.getRules()) {
+          if (!withForce && pr.getForce()) {
+            // force on block rule only applies to withForce permission.
+            continue;
+          }
+
+          if (isBlock(pr, withForce) && projectControl.match(pr, isChangeOwner)) {
+            blocked = true;
+            break;
+          }
+        }
+
+        if (blocked) {
+          // ALLOW in the same AccessSection (ie. in the same Permission) overrides the BLOCK.
+          for (PermissionRule pr : p.getRules()) {
+            if (isAllow(pr, withForce) && projectControl.match(pr, isChangeOwner)) {
+              blocked = false;
+              break;
+            }
+          }
+        }
+
+        if (blocked) {
+          return true;
+        }
+      }
+    }
+
+    return false;
+  }
+
+  /** True if the user has this permission. */
+  private boolean canPerform(String permissionName, boolean isChangeOwner, boolean withForce) {
+    if (isBlocked(permissionName, isChangeOwner, withForce)) {
+      logger.atFine().log(
+          "'%s' cannot perform '%s' with force=%s on project '%s' for ref '%s' (caller: %s)"
+              + " because this permission is blocked",
+          getUser().getLoggableName(),
+          permissionName,
+          withForce,
+          projectControl.getProject().getName(),
+          refName,
+          callerFinder.findCaller());
+      return false;
+    }
+
+    for (PermissionRule pr : relevant.getAllowRules(permissionName)) {
+      if (isAllow(pr, withForce) && projectControl.match(pr, isChangeOwner)) {
+        logger.atFine().log(
+            "'%s' can perform '%s' with force=%s on project '%s' for ref '%s' (caller: %s)",
+            getUser().getLoggableName(),
+            permissionName,
+            withForce,
+            projectControl.getProject().getName(),
+            refName,
+            callerFinder.findCaller());
+        return true;
+      }
+    }
+
+    logger.atFine().log(
+        "'%s' cannot perform '%s' with force=%s on project '%s' for ref '%s' (caller: %s)",
+        getUser().getLoggableName(),
+        permissionName,
+        withForce,
+        projectControl.getProject().getName(),
+        refName,
+        callerFinder.findCaller());
+    return false;
+  }
+
+  private class ForRefImpl extends ForRef {
+    private String resourcePath;
+
+    @Override
+    public String resourcePath() {
+      if (resourcePath == null) {
+        resourcePath =
+            String.format(
+                "/projects/%s/+refs/%s", getProjectControl().getProjectState().getName(), refName);
+      }
+      return resourcePath;
+    }
+
+    @Override
+    public ForChange change(ChangeData cd) {
+      try {
+        // TODO(hiesel) Force callers to call database() and use db instead of cd.db()
+        return getProjectControl()
+            .controlFor(cd.db(), cd.change())
+            .asForChange(cd, Providers.of(cd.db()));
+      } catch (OrmException e) {
+        return FailedPermissionBackend.change("unavailable", e);
+      }
+    }
+
+    @Override
+    public ForChange change(ChangeNotes notes) {
+      Project.NameKey project = getProjectControl().getProject().getNameKey();
+      Change change = notes.getChange();
+      checkArgument(
+          project.equals(change.getProject()),
+          "expected change in project %s, not %s",
+          project,
+          change.getProject());
+      return getProjectControl().controlFor(notes).asForChange(null, db);
+    }
+
+    @Override
+    public ForChange indexedChange(ChangeData cd, ChangeNotes notes) {
+      return getProjectControl().controlFor(notes).asForChange(cd, db);
+    }
+
+    @Override
+    public void check(RefPermission perm) throws AuthException, PermissionBackendException {
+      if (!can(perm)) {
+        PermissionDeniedException pde = new PermissionDeniedException(perm, refName);
+        switch (perm) {
+          case UPDATE:
+            if (refName.equals(RefNames.REFS_CONFIG)) {
+              pde.setAdvice(
+                  "Configuration changes can only be pushed by project owners\n"
+                      + "who also have 'Push' rights on "
+                      + RefNames.REFS_CONFIG);
+            } else {
+              pde.setAdvice("To push into this reference you need 'Push' rights.");
+            }
+            break;
+          case DELETE:
+            pde.setAdvice(
+                "You need 'Delete Reference' rights or 'Push' rights with the \n"
+                    + "'Force Push' flag set to delete references.");
+            break;
+          case CREATE_CHANGE:
+            // This is misleading in the default permission backend, since "create change" on a
+            // branch is encoded as "push" on refs/for/DESTINATION.
+            pde.setAdvice(
+                "You need 'Create Change' rights to upload code review requests.\n"
+                    + "Verify that you are pushing to the right branch.");
+            break;
+          case CREATE:
+            pde.setAdvice("You need 'Create' rights to create new references.");
+            break;
+          case CREATE_SIGNED_TAG:
+            pde.setAdvice("You need 'Create Signed Tag' rights to push a signed tag.");
+            break;
+          case CREATE_TAG:
+            pde.setAdvice("You need 'Create Tag' rights to push a normal tag.");
+            break;
+          case FORCE_UPDATE:
+            pde.setAdvice(
+                "You need 'Push' rights with 'Force' flag set to do a non-fastforward push.");
+            break;
+          case FORGE_AUTHOR:
+            pde.setAdvice(
+                "You need 'Forge Author' rights to push commits with another user as author.");
+            break;
+          case FORGE_COMMITTER:
+            pde.setAdvice(
+                "You need 'Forge Committer' rights to push commits with another user as committer.");
+            break;
+          case FORGE_SERVER:
+            pde.setAdvice(
+                "You need 'Forge Server' rights to push merge commits authored by the server.");
+            break;
+          case MERGE:
+            pde.setAdvice(
+                "You need 'Push Merge' in addition to 'Push' rights to push merge commits.");
+            break;
+
+          case READ:
+            pde.setAdvice("You need 'Read' rights to fetch or clone this ref.");
+            break;
+
+          case READ_CONFIG:
+            pde.setAdvice("You need 'Read' rights on refs/meta/config to see the configuration.");
+            break;
+          case READ_PRIVATE_CHANGES:
+            pde.setAdvice("You need 'Read Private Changes' to see private changes.");
+            break;
+          case SET_HEAD:
+            pde.setAdvice("You need 'Set HEAD' rights to set the default branch.");
+            break;
+          case SKIP_VALIDATION:
+            pde.setAdvice(
+                "You need 'Forge Author', 'Forge Server', 'Forge Committer'\n"
+                    + "and 'Push Merge' rights to skip validation.");
+            break;
+          case UPDATE_BY_SUBMIT:
+            pde.setAdvice(
+                "You need 'Submit' rights on refs/for/ to submit changes during change upload.");
+            break;
+
+          case WRITE_CONFIG:
+            pde.setAdvice("You need 'Write' rights on refs/meta/config.");
+            break;
+        }
+        throw pde;
+      }
+    }
+
+    @Override
+    public Set<RefPermission> test(Collection<RefPermission> permSet)
+        throws PermissionBackendException {
+      EnumSet<RefPermission> ok = EnumSet.noneOf(RefPermission.class);
+      for (RefPermission perm : permSet) {
+        if (can(perm)) {
+          ok.add(perm);
+        }
+      }
+      return ok;
+    }
+
+    @Override
+    public BooleanCondition testCond(RefPermission perm) {
+      return new PermissionBackendCondition.ForRef(this, perm, getUser());
+    }
+
+    private boolean can(RefPermission perm) throws PermissionBackendException {
+      switch (perm) {
+        case READ:
+          return isVisible();
+        case CREATE:
+          // TODO This isn't an accurate test.
+          return canPerform(refPermissionName(perm));
+        case DELETE:
+          return canDelete();
+        case UPDATE:
+          return canUpdate();
+        case FORCE_UPDATE:
+          return canForceUpdate();
+        case SET_HEAD:
+          return projectControl.isOwner();
+
+        case FORGE_AUTHOR:
+          return canForgeAuthor();
+        case FORGE_COMMITTER:
+          return canForgeCommitter();
+        case FORGE_SERVER:
+          return canForgeGerritServerIdentity();
+        case MERGE:
+          return canUploadMerges();
+
+        case CREATE_CHANGE:
+          return canUpload();
+
+        case CREATE_TAG:
+        case CREATE_SIGNED_TAG:
+          return canPerform(refPermissionName(perm));
+
+        case UPDATE_BY_SUBMIT:
+          return projectControl.controlForRef(MagicBranch.NEW_CHANGE + refName).canSubmit(true);
+
+        case READ_PRIVATE_CHANGES:
+          return canPerform(Permission.VIEW_PRIVATE_CHANGES);
+
+        case READ_CONFIG:
+          return projectControl
+              .controlForRef(RefNames.REFS_CONFIG)
+              .canPerform(RefPermission.READ.name());
+        case WRITE_CONFIG:
+          return isOwner();
+
+        case SKIP_VALIDATION:
+          return canForgeAuthor()
+              && canForgeCommitter()
+              && canForgeGerritServerIdentity()
+              && canUploadMerges();
+      }
+      throw new PermissionBackendException(perm + " unsupported");
+    }
+  }
+
+  private static String refPermissionName(RefPermission refPermission) {
+    // Within this class, it's programmer error to call this method on a
+    // RefPermission that isn't associated with a permission name.
+    return DefaultPermissionMappings.refPermissionName(refPermission)
+        .orElseThrow(() -> new IllegalStateException("no name for " + refPermission));
+  }
+}
diff --git a/java/com/google/gerrit/server/permissions/RefPermission.java b/java/com/google/gerrit/server/permissions/RefPermission.java
new file mode 100644
index 0000000..09eed24
--- /dev/null
+++ b/java/com/google/gerrit/server/permissions/RefPermission.java
@@ -0,0 +1,91 @@
+// Copyright (C) 2017 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.google.gerrit.server.permissions;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.gerrit.extensions.api.access.GerritPermission;
+
+public enum RefPermission implements GerritPermission {
+  READ,
+  CREATE,
+
+  /**
+   * Before checking this permission, the caller needs to verify the branch is deletable and reject
+   * early if the branch should never be deleted. For example, the refs/meta/config branch should
+   * never be deleted because deleting this branch would destroy all Gerrit specific metadata about
+   * the project, including its access rules. If a project is to be removed from Gerrit, its
+   * repository should be removed first.
+   */
+  DELETE,
+  UPDATE,
+  FORCE_UPDATE,
+  SET_HEAD("set HEAD"),
+
+  FORGE_AUTHOR,
+  FORGE_COMMITTER,
+  FORGE_SERVER,
+  MERGE,
+  /**
+   * Before checking this permission, the caller should verify {@code USE_SIGNED_OFF_BY} is false.
+   * If it's true, the request should be rejected directly without further check this permission.
+   */
+  SKIP_VALIDATION,
+
+  /** Create a change to code review a commit. */
+  CREATE_CHANGE,
+
+  /** Create a tag. */
+  CREATE_TAG,
+
+  /** Create a signed tag. */
+  CREATE_SIGNED_TAG,
+
+  /**
+   * Creates changes, then also immediately submits them during {@code push}.
+   *
+   * <p>This is similar to {@link #UPDATE} except it constructs changes first, then submits them
+   * according to the submit strategy, which may include cherry-pick or rebase. By creating changes
+   * for each commit, automatic server side rebase, and post-update review are enabled.
+   */
+  UPDATE_BY_SUBMIT,
+
+  /**
+   * Can read all private changes on the ref. Typically granted to CI systems if they should run on
+   * private changes.
+   */
+  READ_PRIVATE_CHANGES,
+
+  /** Read access to ref's config section in {@code project.config}. */
+  READ_CONFIG("read ref config"),
+
+  /** Write access to ref's config section in {@code project.config}. */
+  WRITE_CONFIG("write ref config");
+
+  private final String description;
+
+  RefPermission() {
+    this.description = null;
+  }
+
+  RefPermission(String description) {
+    this.description = requireNonNull(description);
+  }
+
+  @Override
+  public String describeForException() {
+    return description != null ? description : GerritPermission.describeEnumValue(this);
+  }
+}
diff --git a/java/com/google/gerrit/server/permissions/SectionSortCache.java b/java/com/google/gerrit/server/permissions/SectionSortCache.java
new file mode 100644
index 0000000..e5392b0
--- /dev/null
+++ b/java/com/google/gerrit/server/permissions/SectionSortCache.java
@@ -0,0 +1,162 @@
+// Copyright (C) 2011 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.google.gerrit.server.permissions;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.cache.Cache;
+import com.google.common.collect.ImmutableList;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.server.cache.CacheModule;
+import com.google.gerrit.server.util.MostSpecificComparator;
+import com.google.inject.Inject;
+import com.google.inject.Module;
+import com.google.inject.Singleton;
+import com.google.inject.name.Named;
+import java.util.ArrayList;
+import java.util.IdentityHashMap;
+import java.util.List;
+
+/**
+ * Caches the order AccessSections should be sorted for evaluation.
+ *
+ * <p>Access specifications for a more specific ref (eg. refs/heads/master rather than refs/heads/*)
+ * take precedence in ACL evaluations. So for each combination of (ref, list of access specs) we
+ * have to order the access specs by their distance from the ref to be matched. This is expensive,
+ * so cache the sorted ordering.
+ */
+@Singleton
+public class SectionSortCache {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final String CACHE_NAME = "permission_sort";
+
+  public static Module module() {
+    return new CacheModule() {
+      @Override
+      protected void configure() {
+        cache(CACHE_NAME, EntryKey.class, EntryVal.class);
+        bind(SectionSortCache.class);
+      }
+    };
+  }
+
+  private final Cache<EntryKey, EntryVal> cache;
+
+  @Inject
+  SectionSortCache(@Named(CACHE_NAME) Cache<EntryKey, EntryVal> cache) {
+    this.cache = cache;
+  }
+
+  // Sorts the given sections, but does not disturb ordering between equally exact sections.
+  void sort(String ref, List<AccessSection> sections) {
+    final int cnt = sections.size();
+    if (cnt <= 1) {
+      return;
+    }
+
+    EntryKey key = EntryKey.create(ref, sections);
+    EntryVal val = cache.getIfPresent(key);
+    if (val != null) {
+      int[] srcIdx = val.order;
+      if (srcIdx != null) {
+        AccessSection[] srcList = copy(sections);
+        for (int i = 0; i < cnt; i++) {
+          sections.set(i, srcList[srcIdx[i]]);
+        }
+      } else {
+        // Identity transform. No sorting is required.
+      }
+
+    } else {
+      boolean poison = false;
+      IdentityHashMap<AccessSection, Integer> srcMap = new IdentityHashMap<>();
+      for (int i = 0; i < cnt; i++) {
+        poison |= srcMap.put(sections.get(i), i) != null;
+      }
+
+      sections.sort(new MostSpecificComparator(ref));
+
+      int[] srcIdx;
+      if (isIdentityTransform(sections, srcMap)) {
+        srcIdx = null;
+      } else {
+        srcIdx = new int[cnt];
+        for (int i = 0; i < cnt; i++) {
+          srcIdx[i] = srcMap.get(sections.get(i));
+        }
+      }
+
+      if (poison) {
+        logger.atSevere().log("Received duplicate AccessSection instances, not caching sort");
+      } else {
+        cache.put(key, new EntryVal(srcIdx));
+      }
+    }
+  }
+
+  private static AccessSection[] copy(List<AccessSection> sections) {
+    return sections.toArray(new AccessSection[sections.size()]);
+  }
+
+  private static boolean isIdentityTransform(
+      List<AccessSection> sections, IdentityHashMap<AccessSection, Integer> srcMap) {
+    for (int i = 0; i < sections.size(); i++) {
+      if (i != srcMap.get(sections.get(i))) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  @AutoValue
+  abstract static class EntryKey {
+    public abstract String ref();
+
+    public abstract List<String> patterns();
+
+    public abstract int cachedHashCode();
+
+    static EntryKey create(String refName, List<AccessSection> sections) {
+      int hc = refName.hashCode();
+      List<String> patterns = new ArrayList<>(sections.size());
+      for (AccessSection s : sections) {
+        String n = s.getName();
+        patterns.add(n);
+        hc = hc * 31 + n.hashCode();
+      }
+      return new AutoValue_SectionSortCache_EntryKey(refName, ImmutableList.copyOf(patterns), hc);
+    }
+
+    @Override
+    public int hashCode() {
+      return cachedHashCode();
+    }
+  }
+
+  static final class EntryVal {
+    /**
+     * Maps the input index to the output index.
+     *
+     * <p>For {@code x == order[y]} the expression means move the item at source position {@code x}
+     * to the output position {@code y}.
+     */
+    final int[] order;
+
+    EntryVal(int[] order) {
+      this.order = order;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/plugincontext/PluginContext.java b/java/com/google/gerrit/server/plugincontext/PluginContext.java
new file mode 100644
index 0000000..70b23e3
--- /dev/null
+++ b/java/com/google/gerrit/server/plugincontext/PluginContext.java
@@ -0,0 +1,415 @@
+// 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.
+
+package com.google.gerrit.server.plugincontext;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.base.Strings;
+import com.google.common.base.Throwables;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.registration.Extension;
+import com.google.gerrit.metrics.Counter3;
+import com.google.gerrit.metrics.Description;
+import com.google.gerrit.metrics.Description.Units;
+import com.google.gerrit.metrics.DisabledMetricMaker;
+import com.google.gerrit.metrics.Field;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.metrics.Timer3;
+import com.google.gerrit.server.logging.TraceContext;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+/**
+ * Context for invoking plugin extensions.
+ *
+ * <p>Invoking a plugin extension through a PluginContext sets a logging tag with the plugin name is
+ * set. This way any errors that are triggered by the plugin extension (even if they happen in
+ * Gerrit code which is called by the plugin extension) can be easily attributed to the plugin.
+ *
+ * <p>If possible plugin extensions should be invoked through:
+ *
+ * <ul>
+ *   <li>{@link PluginItemContext} for extensions from {@link DynamicItem}
+ *   <li>{@link PluginSetContext} for extensions from {@link DynamicSet}
+ *   <li>{@link PluginMapContext} for extensions from {@link DynamicMap}
+ * </ul>
+ *
+ * <p>A plugin context can be manually opened by invoking the newTrace methods. This should only be
+ * needed if an extension throws multiple exceptions that need to be handled:
+ *
+ * <pre>
+ * public interface Foo {
+ *   void doFoo() throws Exception1, Exception2, Exception3;
+ * }
+ *
+ * ...
+ *
+ * for (Extension<Foo> fooExtension : fooDynamicMap) {
+ *   try (TraceContext traceContext = PluginContext.newTrace(fooExtension)) {
+ *     fooExtension.get().doFoo();
+ *   }
+ * }
+ * </pre>
+ *
+ * <p>This class hosts static methods with generic functionality to invoke plugin extensions with a
+ * trace context that are commonly used by {@link PluginItemContext}, {@link PluginSetContext} and
+ * {@link PluginMapContext}.
+ *
+ * <p>The run* methods execute an extension but don't deliver a result back to the caller.
+ * Exceptions can be caught and logged.
+ *
+ * <p>The call* methods execute an extension and deliver a result back to the caller.
+ */
+public class PluginContext<T> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  @FunctionalInterface
+  public interface ExtensionImplConsumer<T> {
+    void run(T t) throws Exception;
+  }
+
+  @FunctionalInterface
+  public interface ExtensionImplFunction<T, R> {
+    R call(T input);
+  }
+
+  @FunctionalInterface
+  public interface CheckedExtensionImplFunction<T, R, X extends Exception> {
+    R call(T input) throws X;
+  }
+
+  @FunctionalInterface
+  public interface ExtensionConsumer<T extends Extension<?>> {
+    void run(T extension) throws Exception;
+  }
+
+  @FunctionalInterface
+  public interface ExtensionFunction<T extends Extension<?>, R> {
+    R call(T extension);
+  }
+
+  @FunctionalInterface
+  public interface CheckedExtensionFunction<T extends Extension<?>, R, X extends Exception> {
+    R call(T extension) throws X;
+  }
+
+  @Singleton
+  public static class PluginMetrics {
+    public static final PluginMetrics DISABLED_INSTANCE =
+        new PluginMetrics(new DisabledMetricMaker());
+
+    final Timer3<String, String, String> latency;
+    final Counter3<String, String, String> errorCount;
+
+    @Inject
+    PluginMetrics(MetricMaker metricMaker) {
+      this.latency =
+          metricMaker.newTimer(
+              "plugin/latency",
+              new Description("Latency for plugin invocation")
+                  .setCumulative()
+                  .setUnit(Units.MILLISECONDS),
+              Field.ofString("plugin_name"),
+              Field.ofString("class_name"),
+              Field.ofString("export_name"));
+      this.errorCount =
+          metricMaker.newCounter(
+              "plugin/error_count",
+              new Description("Number of plugin errors").setCumulative().setUnit("errors"),
+              Field.ofString("plugin_name"),
+              Field.ofString("class_name"),
+              Field.ofString("export_name"));
+    }
+
+    Timer3.Context startLatency(Extension<?> extension) {
+      return latency.start(
+          extension.getPluginName(),
+          extension.get().getClass().getName(),
+          Strings.nullToEmpty(extension.getExportName()));
+    }
+
+    void incrementErrorCount(Extension<?> extension) {
+      errorCount.increment(
+          extension.getPluginName(),
+          extension.get().getClass().getName(),
+          Strings.nullToEmpty(extension.getExportName()));
+    }
+  }
+
+  /**
+   * Opens a new trace context for invoking a plugin extension.
+   *
+   * @param dynamicItem dynamic item that holds the extension implementation that is being invoked
+   *     from within the trace context
+   * @return the created trace context
+   */
+  public static <T> TraceContext newTrace(DynamicItem<T> dynamicItem) {
+    Extension<T> extension = dynamicItem.getEntry();
+    if (extension == null) {
+      return TraceContext.open();
+    }
+    return newTrace(extension);
+  }
+
+  /**
+   * Opens a new trace context for invoking a plugin extension.
+   *
+   * @param extension extension that is being invoked from within the trace context
+   * @return the created trace context
+   */
+  public static <T> TraceContext newTrace(Extension<T> extension) {
+    return TraceContext.open().addPluginTag(requireNonNull(extension).getPluginName());
+  }
+
+  /**
+   * Runs a plugin extension. All exceptions from the plugin extension are caught and logged.
+   *
+   * <p>The consumer gets the extension implementation provided that should be invoked.
+   *
+   * @param pluginMetrics the plugin metrics
+   * @param extension extension that is being invoked
+   * @param extensionImplConsumer the consumer that invokes the extension
+   */
+  static <T> void runLogExceptions(
+      PluginMetrics pluginMetrics,
+      Extension<T> extension,
+      ExtensionImplConsumer<T> extensionImplConsumer) {
+    T extensionImpl = extension.get();
+    if (extensionImpl == null) {
+      return;
+    }
+    try (TraceContext traceContext = newTrace(extension);
+        Timer3.Context ctx = pluginMetrics.startLatency(extension)) {
+      extensionImplConsumer.run(extensionImpl);
+    } catch (Throwable e) {
+      pluginMetrics.incrementErrorCount(extension);
+      logger.atWarning().withCause(e).log(
+          "Failure in %s of plugin %s", extensionImpl.getClass(), extension.getPluginName());
+    }
+  }
+
+  /**
+   * Runs a plugin extension. All exceptions from the plugin extension are caught and logged.
+   *
+   * <p>The consumer get the {@link Extension} provided that should be invoked. The extension
+   * provides access to the plugin name and the export name.
+   *
+   * @param pluginMetrics the plugin metrics
+   * @param extension extension that is being invoked
+   * @param extensionConsumer the consumer that invokes the extension
+   */
+  static <T> void runLogExceptions(
+      PluginMetrics pluginMetrics,
+      Extension<T> extension,
+      ExtensionConsumer<Extension<T>> extensionConsumer) {
+    T extensionImpl = extension.get();
+    if (extensionImpl == null) {
+      return;
+    }
+
+    try (TraceContext traceContext = newTrace(extension);
+        Timer3.Context ctx = pluginMetrics.startLatency(extension)) {
+      extensionConsumer.run(extension);
+    } catch (Throwable e) {
+      pluginMetrics.incrementErrorCount(extension);
+      logger.atWarning().withCause(e).log(
+          "Failure in %s of plugin %s", extensionImpl.getClass(), extension.getPluginName());
+    }
+  }
+
+  /**
+   * Runs a plugin extension. All exceptions from the plugin extension except exceptions of the
+   * specified type are caught and logged. Exceptions of the specified type are thrown and must be
+   * handled by the caller.
+   *
+   * <p>The consumer gets the extension implementation provided that should be invoked.
+   *
+   * @param pluginMetrics the plugin metrics
+   * @param extension extension that is being invoked
+   * @param extensionImplConsumer the consumer that invokes the extension
+   * @param exceptionClass type of the exceptions that should be thrown
+   * @throws X expected exception from the plugin extension
+   */
+  static <T, X extends Exception> void runLogExceptions(
+      PluginMetrics pluginMetrics,
+      Extension<T> extension,
+      ExtensionImplConsumer<T> extensionImplConsumer,
+      Class<X> exceptionClass)
+      throws X {
+    T extensionImpl = extension.get();
+    if (extensionImpl == null) {
+      return;
+    }
+
+    try (TraceContext traceContext = newTrace(extension);
+        Timer3.Context ctx = pluginMetrics.startLatency(extension)) {
+      extensionImplConsumer.run(extensionImpl);
+    } catch (Throwable e) {
+      Throwables.throwIfInstanceOf(e, exceptionClass);
+      Throwables.throwIfUnchecked(e);
+      pluginMetrics.incrementErrorCount(extension);
+      logger.atWarning().withCause(e).log(
+          "Failure in %s of plugin invoke%s", extensionImpl.getClass(), extension.getPluginName());
+    }
+  }
+
+  /**
+   * Runs a plugin extension. All exceptions from the plugin extension except exceptions of the
+   * specified type are caught and logged. Exceptions of the specified type are thrown and must be
+   * handled by the caller.
+   *
+   * <p>The consumer get the {@link Extension} provided that should be invoked. The extension
+   * provides access to the plugin name and the export name.
+   *
+   * @param pluginMetrics the plugin metrics
+   * @param extension extension that is being invoked
+   * @param extensionConsumer the consumer that invokes the extension
+   * @param exceptionClass type of the exceptions that should be thrown
+   * @throws X expected exception from the plugin extension
+   */
+  static <T, X extends Exception> void runLogExceptions(
+      PluginMetrics pluginMetrics,
+      Extension<T> extension,
+      ExtensionConsumer<Extension<T>> extensionConsumer,
+      Class<X> exceptionClass)
+      throws X {
+    T extensionImpl = extension.get();
+    if (extensionImpl == null) {
+      return;
+    }
+
+    try (TraceContext traceContext = newTrace(extension);
+        Timer3.Context ctx = pluginMetrics.startLatency(extension)) {
+      extensionConsumer.run(extension);
+    } catch (Throwable e) {
+      Throwables.throwIfInstanceOf(e, exceptionClass);
+      Throwables.throwIfUnchecked(e);
+      pluginMetrics.incrementErrorCount(extension);
+      logger.atWarning().withCause(e).log(
+          "Failure in %s of plugin %s", extensionImpl.getClass(), extension.getPluginName());
+    }
+  }
+
+  /**
+   * Calls a plugin extension and returns the result from the plugin extension call.
+   *
+   * <p>The function gets the extension implementation provided that should be invoked.
+   *
+   * @param pluginMetrics the plugin metrics
+   * @param extension extension that is being invoked
+   * @param extensionImplFunction function that invokes the extension
+   * @return the result from the plugin extension
+   */
+  static <T, R> R call(
+      PluginMetrics pluginMetrics,
+      Extension<T> extension,
+      ExtensionImplFunction<T, R> extensionImplFunction) {
+    try (TraceContext traceContext = newTrace(extension);
+        Timer3.Context ctx = pluginMetrics.startLatency(extension)) {
+      return extensionImplFunction.call(extension.get());
+    }
+  }
+
+  /**
+   * Calls a plugin extension and returns the result from the plugin extension call. Exceptions of
+   * the specified type are thrown and must be handled by the caller.
+   *
+   * <p>The function gets the extension implementation provided that should be invoked.
+   *
+   * @param pluginMetrics the plugin metrics
+   * @param extension extension that is being invoked
+   * @param checkedExtensionImplFunction function that invokes the extension
+   * @param exceptionClass type of the exceptions that should be thrown
+   * @return the result from the plugin extension
+   * @throws X expected exception from the plugin extension
+   */
+  static <T, R, X extends Exception> R call(
+      PluginMetrics pluginMetrics,
+      Extension<T> extension,
+      CheckedExtensionImplFunction<T, R, X> checkedExtensionImplFunction,
+      Class<X> exceptionClass)
+      throws X {
+    try (TraceContext traceContext = newTrace(extension);
+        Timer3.Context ctx = pluginMetrics.startLatency(extension)) {
+      try {
+        return checkedExtensionImplFunction.call(extension.get());
+      } catch (Exception e) {
+        // The only exception that can be thrown is X, but we cannot catch X since it is a generic
+        // type.
+        Throwables.throwIfInstanceOf(e, exceptionClass);
+        Throwables.throwIfUnchecked(e);
+        throw new IllegalStateException("unexpected exception: " + e.getMessage(), e);
+      }
+    }
+  }
+
+  /**
+   * Calls a plugin extension and returns the result from the plugin extension call.
+   *
+   * <p>The function get the {@link Extension} provided that should be invoked. The extension
+   * provides access to the plugin name and the export name.
+   *
+   * @param pluginMetrics the plugin metrics
+   * @param extension extension that is being invoked
+   * @param extensionFunction function that invokes the extension
+   * @return the result from the plugin extension
+   */
+  static <T, R> R call(
+      PluginMetrics pluginMetrics,
+      Extension<T> extension,
+      ExtensionFunction<Extension<T>, R> extensionFunction) {
+    try (TraceContext traceContext = newTrace(extension);
+        Timer3.Context ctx = pluginMetrics.startLatency(extension)) {
+      return extensionFunction.call(extension);
+    }
+  }
+
+  /**
+   * Calls a plugin extension and returns the result from the plugin extension call. Exceptions of
+   * the specified type are thrown and must be handled by the caller.
+   *
+   * <p>The function get the {@link Extension} provided that should be invoked. The extension
+   * provides access to the plugin name and the export name.
+   *
+   * @param pluginMetrics the plugin metrics
+   * @param extension extension that is being invoked
+   * @param checkedExtensionFunction function that invokes the extension
+   * @param exceptionClass type of the exceptions that should be thrown
+   * @return the result from the plugin extension
+   * @throws X expected exception from the plugin extension
+   */
+  static <T, R, X extends Exception> R call(
+      PluginMetrics pluginMetrics,
+      Extension<T> extension,
+      CheckedExtensionFunction<Extension<T>, R, X> checkedExtensionFunction,
+      Class<X> exceptionClass)
+      throws X {
+    try (TraceContext traceContext = newTrace(extension);
+        Timer3.Context ctx = pluginMetrics.startLatency(extension)) {
+      try {
+        return checkedExtensionFunction.call(extension);
+      } catch (Exception e) {
+        // The only exception that can be thrown is X, but we cannot catch X since it is a generic
+        // type.
+        Throwables.throwIfInstanceOf(e, exceptionClass);
+        Throwables.throwIfUnchecked(e);
+        throw new IllegalStateException("unexpected exception: " + e.getMessage(), e);
+      }
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/plugincontext/PluginItemContext.java b/java/com/google/gerrit/server/plugincontext/PluginItemContext.java
new file mode 100644
index 0000000..421b3ad
--- /dev/null
+++ b/java/com/google/gerrit/server/plugincontext/PluginItemContext.java
@@ -0,0 +1,194 @@
+// 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.
+
+package com.google.gerrit.server.plugincontext;
+
+import static com.google.common.base.Preconditions.checkState;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.extensions.registration.Extension;
+import com.google.gerrit.server.plugincontext.PluginContext.CheckedExtensionImplFunction;
+import com.google.gerrit.server.plugincontext.PluginContext.ExtensionImplConsumer;
+import com.google.gerrit.server.plugincontext.PluginContext.ExtensionImplFunction;
+import com.google.gerrit.server.plugincontext.PluginContext.PluginMetrics;
+import com.google.inject.Inject;
+
+/**
+ * Context to invoke an extension from a {@link DynamicItem}.
+ *
+ * <p>When the plugin extension is invoked a logging tag with the plugin name is set. This way any
+ * errors that are triggered by the plugin extension (even if they happen in Gerrit code which is
+ * called by the plugin extension) can be easily attributed to the plugin.
+ *
+ * <p>The run* methods execute an extension but don't deliver a result back to the caller.
+ * Exceptions can be caught and logged.
+ *
+ * <p>The call* methods execute an extension and deliver a result back to the caller.
+ *
+ * <p>Example if all exceptions should be caught and logged:
+ *
+ * <pre>
+ * fooPluginItemContext.run(foo -> foo.doFoo());
+ * </pre>
+ *
+ * <p>Example if all exceptions, but one, should be caught and logged:
+ *
+ * <pre>
+ * try {
+ *   fooPluginItemContext.run(foo -> foo.doFoo(), MyException.class);
+ * } catch (MyException e) {
+ *   // handle the exception
+ * }
+ * </pre>
+ *
+ * <p>Example if return values should be handled:
+ *
+ * <pre>
+ * Object result = fooPluginItemContext.call(foo -> foo.getFoo());
+ * </pre>
+ *
+ * <p>Example if return values and a single exception should be handled:
+ *
+ * <pre>
+ * Object result;
+ * try {
+ *   result = fooPluginItemContext.call(foo -> foo.getFoo(), MyException.class);
+ * } catch (MyException e) {
+ *   // handle the exception
+ * }
+ * </pre>
+ *
+ * <p>Example if several exceptions should be handled:
+ *
+ * <pre>
+ * try (TraceContext traceContext = PluginContext.newTrace(fooDynamicItem.getEntry())) {
+ *   fooDynamicItem.get().doFoo();
+ * } catch (MyException1 | MyException2 | MyException3 e) {
+ *   // handle the exception
+ * }
+ * </pre>
+ */
+public class PluginItemContext<T> {
+  @Nullable private final DynamicItem<T> dynamicItem;
+  private final PluginMetrics pluginMetrics;
+
+  @VisibleForTesting
+  @Inject
+  public PluginItemContext(DynamicItem<T> dynamicItem, PluginMetrics pluginMetrics) {
+    this.dynamicItem = dynamicItem;
+    this.pluginMetrics = pluginMetrics;
+  }
+
+  /**
+   * Checks if an implementation for this extension point has been registered.
+   *
+   * @return {@code true} if an implementation for this extension point has been registered,
+   *     otherwise {@code false}
+   */
+  public boolean hasImplementation() {
+    return dynamicItem.getEntry() != null;
+  }
+
+  /**
+   * Returns the name of the plugin that registered the extension.
+   *
+   * @return the plugin name, {@code null} if no implementation is registered for this extension
+   *     point
+   */
+  @Nullable
+  public String getPluginName() {
+    return dynamicItem.getPluginName();
+  }
+
+  /**
+   * Invokes the plugin extension of the item. All exceptions from the plugin extension are caught
+   * and logged.
+   *
+   * <p>The consumer gets the extension implementation provided that should be invoked.
+   *
+   * <p>No-op if no implementation is registered for this extension point.
+   *
+   * @param extensionImplConsumer consumer that invokes the extension
+   */
+  public void run(ExtensionImplConsumer<T> extensionImplConsumer) {
+    Extension<T> extension = dynamicItem.getEntry();
+    if (extension == null) {
+      return;
+    }
+    PluginContext.runLogExceptions(pluginMetrics, extension, extensionImplConsumer);
+  }
+
+  /**
+   * Invokes the plugin extension of the item. All exceptions from the plugin extension are caught
+   * and logged.
+   *
+   * <p>The consumer gets the extension implementation provided that should be invoked.
+   *
+   * <p>No-op if no implementation is registered for this extension point.
+   *
+   * @param extensionImplConsumer consumer that invokes the extension
+   * @param exceptionClass type of the exceptions that should be thrown
+   * @throws X expected exception from the plugin extension
+   */
+  public <X extends Exception> void run(
+      ExtensionImplConsumer<T> extensionImplConsumer, Class<X> exceptionClass) throws X {
+    Extension<T> extension = dynamicItem.getEntry();
+    if (extension == null) {
+      return;
+    }
+    PluginContext.runLogExceptions(pluginMetrics, extension, extensionImplConsumer, exceptionClass);
+  }
+
+  /**
+   * Calls the plugin extension of the item and returns the result from the plugin extension call.
+   *
+   * <p>The function gets the extension implementation provided that should be invoked.
+   *
+   * <p>Fails with {@link IllegalStateException} if no implementation is registered for the item.
+   *
+   * @param extensionImplFunction function that invokes the extension
+   * @return the result from the plugin extension
+   * @throws IllegalStateException if no implementation is registered for the item
+   */
+  public <R> R call(ExtensionImplFunction<T, R> extensionImplFunction) {
+    Extension<T> extension = dynamicItem.getEntry();
+    checkState(extension != null);
+    return PluginContext.call(pluginMetrics, extension, extensionImplFunction);
+  }
+
+  /**
+   * Calls the plugin extension of the item and returns the result from the plugin extension call.
+   * Exceptions of the specified type are thrown and must be handled by the caller.
+   *
+   * <p>The function gets the extension implementation provided that should be invoked.
+   *
+   * <p>Fails with {@link IllegalStateException} if no implementation is registered for the item.
+   *
+   * @param checkedExtensionImplFunction function that invokes the extension
+   * @param exceptionClass type of the exceptions that should be thrown
+   * @return the result from the plugin extension
+   * @throws X expected exception from the plugin extension
+   * @throws IllegalStateException if no implementation is registered for the item
+   */
+  public <R, X extends Exception> R call(
+      CheckedExtensionImplFunction<T, R, X> checkedExtensionImplFunction, Class<X> exceptionClass)
+      throws X {
+    Extension<T> extension = dynamicItem.getEntry();
+    checkState(extension != null);
+    return PluginContext.call(
+        pluginMetrics, extension, checkedExtensionImplFunction, exceptionClass);
+  }
+}
diff --git a/java/com/google/gerrit/server/plugincontext/PluginMapContext.java b/java/com/google/gerrit/server/plugincontext/PluginMapContext.java
new file mode 100644
index 0000000..b02ad27
--- /dev/null
+++ b/java/com/google/gerrit/server/plugincontext/PluginMapContext.java
@@ -0,0 +1,176 @@
+// 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.
+
+package com.google.gerrit.server.plugincontext;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.Iterators;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.registration.Extension;
+import com.google.gerrit.server.plugincontext.PluginContext.ExtensionConsumer;
+import com.google.gerrit.server.plugincontext.PluginContext.PluginMetrics;
+import com.google.inject.Inject;
+import java.util.Iterator;
+import java.util.SortedSet;
+
+/**
+ * Context to invoke extensions from a {@link DynamicMap}.
+ *
+ * <p>When a plugin extension is invoked a logging tag with the plugin name is set. This way any
+ * errors that are triggered by the plugin extension (even if they happen in Gerrit code which is
+ * called by the plugin extension) can be easily attributed to the plugin.
+ *
+ * <p>Example if all exceptions should be caught and logged:
+ *
+ * <pre>
+ * Map<String, Object> results = new HashMap<>();
+ * fooPluginMapContext.runEach(
+ *     extension -> results.put(extension.getExportName(), extension.get().getFoo());
+ * </pre>
+ *
+ * <p>Example if all exceptions, but one, should be caught and logged:
+ *
+ * <pre>
+ * Map<String, Object> results = new HashMap<>();
+ * try {
+ *   fooPluginMapContext.runEach(
+ *       extension -> results.put(extension.getExportName(), extension.get().getFoo(),
+ *       MyException.class);
+ * } catch (MyException e) {
+ *   // handle the exception
+ * }
+ * </pre>
+ *
+ * <p>Example if return values should be handled:
+ *
+ * <pre>
+ * Map<String, Object> results = new HashMap<>();
+ * for (PluginMapEntryContext<Foo> c : fooPluginMapContext) {
+ *   if (c.call(extension -> extension.get().handles(x))) {
+ *     c.run(extension -> results.put(extension.getExportName(), extension.get().getFoo());
+ *   }
+ * }
+ * </pre>
+ *
+ * <p>Example if return values and a single exception should be handled:
+ *
+ * <pre>
+ * Map<String, Object> results = new HashMap<>();
+ * try {
+ *   for (PluginMapEntryContext<Foo> c : fooPluginMapContext) {
+ *     if (c.call(extension -> extension.handles(x), MyException.class)) {
+ *       c.run(extension -> results.put(extension.getExportName(), extension.get().getFoo(),
+ *           MyException.class);
+ *     }
+ *   }
+ * } catch (MyException e) {
+ *   // handle the exception
+ * }
+ * </pre>
+ *
+ * <p>Example if several exceptions should be handled:
+ *
+ * <pre>
+ * for (Extension<Foo> fooExtension : fooDynamicMap) {
+ *   try (TraceContext traceContext = PluginContext.newTrace(fooExtension)) {
+ *     fooExtension.get().doFoo();
+ *   } catch (MyException1 | MyException2 | MyException3 e) {
+ *     // handle the exception
+ *   }
+ * }
+ * </pre>
+ */
+public class PluginMapContext<T> implements Iterable<PluginMapEntryContext<T>> {
+  private final DynamicMap<T> dynamicMap;
+  private final PluginMetrics pluginMetrics;
+
+  @VisibleForTesting
+  @Inject
+  public PluginMapContext(DynamicMap<T> dynamicMap, PluginMetrics pluginMetrics) {
+    this.dynamicMap = dynamicMap;
+    this.pluginMetrics = pluginMetrics;
+  }
+
+  /**
+   * Iterator that provides contexts for invoking the extensions in this map.
+   *
+   * <p>This is useful if:
+   *
+   * <ul>
+   *   <li>invoking of each extension returns a result that should be handled
+   *   <li>a sequence of invocations should be done on each extension
+   * </ul>
+   */
+  @Override
+  public Iterator<PluginMapEntryContext<T>> iterator() {
+    return Iterators.transform(
+        dynamicMap.iterator(), e -> new PluginMapEntryContext<>(e, pluginMetrics));
+  }
+
+  /**
+   * Checks if no implementations for this extension point have been registered.
+   *
+   * @return {@code true} if no implementations for this extension point have been registered,
+   *     otherwise {@code false}
+   */
+  public boolean isEmpty() {
+    return !dynamicMap.iterator().hasNext();
+  }
+
+  /**
+   * Returns a sorted list of the plugins that have registered implementations for this extension
+   * point.
+   *
+   * @return sorted list of the plugins that have registered implementations for this extension
+   *     point
+   */
+  public SortedSet<String> plugins() {
+    return dynamicMap.plugins();
+  }
+
+  /**
+   * Invokes each extension in the map. All exceptions from the plugin extensions are caught and
+   * logged.
+   *
+   * <p>The consumer get the {@link Extension} provided that should be invoked. The extension
+   * provides access to the plugin name and the export name.
+   *
+   * <p>All extension in the map are invoked, even if invoking some of the extensions failed.
+   *
+   * @param extensionConsumer consumer that invokes the extension
+   */
+  public void runEach(ExtensionConsumer<Extension<T>> extensionConsumer) {
+    dynamicMap.forEach(p -> PluginContext.runLogExceptions(pluginMetrics, p, extensionConsumer));
+  }
+
+  /**
+   * Invokes each extension in the map. All exceptions from the plugin extensions except exceptions
+   * of the specified type are caught and logged.
+   *
+   * <p>The consumer get the {@link Extension} provided that should be invoked. The extension
+   * provides access to the plugin name and the export name.
+   *
+   * <p>All extension in the map are invoked, even if invoking some of the extensions failed.
+   *
+   * @param extensionConsumer consumer that invokes the extension
+   * @param exceptionClass type of the exceptions that should be thrown
+   * @throws X expected exception from the plugin extension
+   */
+  public <X extends Exception> void runEach(
+      ExtensionConsumer<Extension<T>> extensionConsumer, Class<X> exceptionClass) throws X {
+    for (Extension<T> extension : dynamicMap) {
+      PluginContext.runLogExceptions(pluginMetrics, extension, extensionConsumer, exceptionClass);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/plugincontext/PluginMapEntryContext.java b/java/com/google/gerrit/server/plugincontext/PluginMapEntryContext.java
new file mode 100644
index 0000000..68589cf
--- /dev/null
+++ b/java/com/google/gerrit/server/plugincontext/PluginMapEntryContext.java
@@ -0,0 +1,173 @@
+// 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.
+
+package com.google.gerrit.server.plugincontext;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.registration.Extension;
+import com.google.gerrit.server.plugincontext.PluginContext.CheckedExtensionFunction;
+import com.google.gerrit.server.plugincontext.PluginContext.ExtensionConsumer;
+import com.google.gerrit.server.plugincontext.PluginContext.ExtensionFunction;
+import com.google.gerrit.server.plugincontext.PluginContext.PluginMetrics;
+
+/**
+ * Context to invoke an extension from {@link DynamicMap}.
+ *
+ * <p>When the plugin extension is invoked a logging tag with the plugin name is set. This way any
+ * errors that are triggered by the plugin extension (even if they happen in Gerrit code which is
+ * called by the plugin extension) can be easily attributed to the plugin.
+ *
+ * <p>The run* methods execute the extension but don't deliver a result back to the caller.
+ * Exceptions can be caught and logged.
+ *
+ * <p>The call* methods execute the extension and deliver a result back to the caller.
+ *
+ * <pre>
+ * Map<String, Object> results = new HashMap<>();
+ * fooPluginMapEntryContext.run(
+ *     extension -> results.put(extension.getExportName(), extension.get().getFoo());
+ * </pre>
+ *
+ * <p>Example if all exceptions, but one, should be caught and logged:
+ *
+ * <pre>
+ * Map<String, Object> results = new HashMap<>();
+ * try {
+ *   fooPluginMapEntryContext.run(
+ *     extension -> results.put(extension.getExportName(), extension.get().getFoo(),
+ *     MyException.class);
+ * } catch (MyException e) {
+ *   // handle the exception
+ * }
+ * </pre>
+ *
+ * <p>Example if return values should be handled:
+ *
+ * <pre>
+ * Object result = fooPluginMapEntryContext.call(extension -> extension.get().getFoo());
+ * </pre>
+ *
+ * <p>Example if return values and a single exception should be handled:
+ *
+ * <pre>
+ * Object result;
+ * try {
+ *   result = fooPluginMapEntryContext.call(extension -> extension.get().getFoo(), MyException.class);
+ * } catch (MyException e) {
+ *   // handle the exception
+ * }
+ * </pre>
+ *
+ * <p>Example if several exceptions should be handled:
+ *
+ * <pre>
+ * for (Extension<Foo> fooExtension : fooDynamicMap) {
+ *   try (TraceContext traceContext = PluginContext.newTrace(fooExtension)) {
+ *     fooExtension.get().doFoo();
+ *   } catch (MyException1 | MyException2 | MyException3 e) {
+ *     // handle the exception
+ *   }
+ * }
+ * </pre>
+ */
+public class PluginMapEntryContext<T> {
+  private final Extension<T> extension;
+  private final PluginMetrics pluginMetrics;
+
+  PluginMapEntryContext(Extension<T> extension, PluginMetrics pluginMetrics) {
+    requireNonNull(extension);
+    requireNonNull(extension.getExportName(), "export name must be set for plugin map entries");
+    this.extension = extension;
+    this.pluginMetrics = pluginMetrics;
+  }
+
+  /**
+   * Returns the name of the plugin that registered this map entry.
+   *
+   * @return the plugin name
+   */
+  public String getPluginName() {
+    return extension.getPluginName();
+  }
+
+  /**
+   * Returns the export name for which this map entry was registered.
+   *
+   * @return the export name
+   */
+  public String getExportName() {
+    return extension.getExportName();
+  }
+
+  /**
+   * Invokes the plugin extension. All exceptions from the plugin extension are caught and logged.
+   *
+   * <p>The consumer get the {@link Extension} provided that should be invoked. The extension
+   * provides access to the plugin name and the export name.
+   *
+   * @param extensionConsumer consumer that invokes the extension
+   */
+  public void run(ExtensionConsumer<Extension<T>> extensionConsumer) {
+    PluginContext.runLogExceptions(pluginMetrics, extension, extensionConsumer);
+  }
+
+  /**
+   * Invokes the plugin extension. All exceptions from the plugin extension are caught and logged.
+   *
+   * <p>The consumer get the {@link Extension} provided that should be invoked. The extension
+   * provides access to the plugin name and the export name.
+   *
+   * @param extensionConsumer consumer that invokes the extension
+   * @param exceptionClass type of the exceptions that should be thrown
+   * @throws X expected exception from the plugin extension
+   */
+  public <X extends Exception> void run(
+      ExtensionConsumer<Extension<T>> extensionConsumer, Class<X> exceptionClass) throws X {
+    PluginContext.runLogExceptions(pluginMetrics, extension, extensionConsumer, exceptionClass);
+  }
+
+  /**
+   * Calls the plugin extension and returns the result from the plugin extension call.
+   *
+   * <p>The consumer get the {@link Extension} provided that should be invoked. The extension
+   * provides access to the plugin name and the export name.
+   *
+   * @param extensionFunction function that invokes the extension
+   * @return the result from the plugin extension
+   */
+  public <R> R call(ExtensionFunction<Extension<T>, R> extensionFunction) {
+    return PluginContext.call(pluginMetrics, extension, extensionFunction);
+  }
+
+  /**
+   * Calls the plugin extension and returns the result from the plugin extension call. Exceptions of
+   * the specified type are thrown and must be handled by the caller.
+   *
+   * <p>The consumer get the {@link Extension} provided that should be invoked. The extension
+   * provides access to the plugin name and the export name.
+   *
+   * @param checkedExtensionFunction function that invokes the extension
+   * @param exceptionClass type of the exceptions that should be thrown
+   * @return the result from the plugin extension
+   * @throws X expected exception from the plugin extension
+   */
+  public <R, X extends Exception> R call(
+      CheckedExtensionFunction<Extension<T>, R, X> checkedExtensionFunction,
+      Class<X> exceptionClass)
+      throws X {
+    return PluginContext.call(pluginMetrics, extension, checkedExtensionFunction, exceptionClass);
+  }
+}
diff --git a/java/com/google/gerrit/server/plugincontext/PluginSetContext.java b/java/com/google/gerrit/server/plugincontext/PluginSetContext.java
new file mode 100644
index 0000000..a297e58
--- /dev/null
+++ b/java/com/google/gerrit/server/plugincontext/PluginSetContext.java
@@ -0,0 +1,169 @@
+// 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.
+
+package com.google.gerrit.server.plugincontext;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.Iterators;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.registration.Extension;
+import com.google.gerrit.server.plugincontext.PluginContext.ExtensionImplConsumer;
+import com.google.gerrit.server.plugincontext.PluginContext.PluginMetrics;
+import com.google.inject.Inject;
+import java.util.Iterator;
+import java.util.SortedSet;
+
+/**
+ * Context to invoke extensions from a {@link DynamicSet}.
+ *
+ * <p>When a plugin extension is invoked a logging tag with the plugin name is set. This way any
+ * errors that are triggered by the plugin extension (even if they happen in Gerrit code which is
+ * called by the plugin extension) can be easily attributed to the plugin.
+ *
+ * <p>Example if all exceptions should be caught and logged:
+ *
+ * <pre>
+ * fooPluginSetContext.runEach(foo -> foo.doFoo());
+ * </pre>
+ *
+ * <p>Example if all exceptions, but one, should be caught and logged:
+ *
+ * <pre>
+ * try {
+ *   fooPluginSetContext.runEach(foo -> foo.doFoo(), MyException.class);
+ * } catch (MyException e) {
+ *   // handle the exception
+ * }
+ * </pre>
+ *
+ * <p>Example if return values should be handled:
+ *
+ * <pre>
+ * for (PluginSetEntryContext<Foo> c : fooPluginSetContext) {
+ *   if (c.call(foo -> foo.handles(x))) {
+ *     c.run(foo -> foo.doFoo());
+ *   }
+ * }
+ * </pre>
+ *
+ * <p>Example if return values and a single exception should be handled:
+ *
+ * <pre>
+ * try {
+ *   for (PluginSetEntryContext<Foo> c : fooPluginSetContext) {
+ *     if (c.call(foo -> foo.handles(x), MyException.class)) {
+ *       c.run(foo -> foo.doFoo(), MyException.class);
+ *     }
+ *   }
+ * } catch (MyException e) {
+ *   // handle the exception
+ * }
+ * </pre>
+ *
+ * <p>Example if several exceptions should be handled:
+ *
+ * <pre>
+ * for (Extension<Foo> fooExtension : fooDynamicSet.entries()) {
+ *   try (TraceContext traceContext = PluginContext.newTrace(fooExtension)) {
+ *     fooExtension.get().doFoo();
+ *   } catch (MyException1 | MyException2 | MyException3 e) {
+ *     // handle the exception
+ *   }
+ * }
+ * </pre>
+ */
+public class PluginSetContext<T> implements Iterable<PluginSetEntryContext<T>> {
+  private final DynamicSet<T> dynamicSet;
+  private final PluginMetrics pluginMetrics;
+
+  @VisibleForTesting
+  @Inject
+  public PluginSetContext(DynamicSet<T> dynamicSet, PluginMetrics pluginMetrics) {
+    this.dynamicSet = dynamicSet;
+    this.pluginMetrics = pluginMetrics;
+  }
+
+  /**
+   * Iterator that provides contexts for invoking the extensions in this set.
+   *
+   * <p>This is useful if:
+   *
+   * <ul>
+   *   <li>invoking of each extension returns a result that should be handled
+   *   <li>a sequence of invocations should be done on each extension
+   * </ul>
+   */
+  @Override
+  public Iterator<PluginSetEntryContext<T>> iterator() {
+    return Iterators.transform(
+        dynamicSet.entries().iterator(), e -> new PluginSetEntryContext<>(e, pluginMetrics));
+  }
+
+  /**
+   * Checks if no implementations for this extension point have been registered.
+   *
+   * @return {@code true} if no implementations for this extension point have been registered,
+   *     otherwise {@code false}
+   */
+  public boolean isEmpty() {
+    return !dynamicSet.iterator().hasNext();
+  }
+
+  /**
+   * Returns a sorted list of the plugins that have registered implementations for this extension
+   * point.
+   *
+   * @return sorted list of the plugins that have registered implementations for this extension
+   *     point
+   */
+  public SortedSet<String> plugins() {
+    return dynamicSet.plugins();
+  }
+
+  /**
+   * Invokes each extension in the set. All exceptions from the plugin extensions are caught and
+   * logged.
+   *
+   * <p>The consumer gets the extension implementation provided that should be invoked.
+   *
+   * <p>All extension in the set are invoked, even if invoking some of the extensions failed.
+   *
+   * @param extensionImplConsumer consumer that invokes the extension
+   */
+  public void runEach(ExtensionImplConsumer<T> extensionImplConsumer) {
+    dynamicSet
+        .entries()
+        .forEach(p -> PluginContext.runLogExceptions(pluginMetrics, p, extensionImplConsumer));
+  }
+
+  /**
+   * Invokes each extension in the set. All exceptions from the plugin extensions except exceptions
+   * of the specified type are caught and logged.
+   *
+   * <p>The consumer gets the extension implementation provided that should be invoked.
+   *
+   * <p>All extension in the set are invoked, even if invoking some of the extensions failed.
+   *
+   * @param extensionImplConsumer consumer that invokes the extension
+   * @param exceptionClass type of the exceptions that should be thrown
+   * @throws X expected exception from the plugin extension
+   */
+  public <X extends Exception> void runEach(
+      ExtensionImplConsumer<T> extensionImplConsumer, Class<X> exceptionClass) throws X {
+    for (Extension<T> extension : dynamicSet.entries()) {
+      PluginContext.runLogExceptions(
+          pluginMetrics, extension, extensionImplConsumer, exceptionClass);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/plugincontext/PluginSetEntryContext.java b/java/com/google/gerrit/server/plugincontext/PluginSetEntryContext.java
new file mode 100644
index 0000000..2268c07
--- /dev/null
+++ b/java/com/google/gerrit/server/plugincontext/PluginSetEntryContext.java
@@ -0,0 +1,170 @@
+// 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.
+
+package com.google.gerrit.server.plugincontext;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.registration.Extension;
+import com.google.gerrit.server.plugincontext.PluginContext.CheckedExtensionImplFunction;
+import com.google.gerrit.server.plugincontext.PluginContext.ExtensionImplConsumer;
+import com.google.gerrit.server.plugincontext.PluginContext.ExtensionImplFunction;
+import com.google.gerrit.server.plugincontext.PluginContext.PluginMetrics;
+
+/**
+ * Context to invoke an extension from {@link DynamicSet}.
+ *
+ * <p>When the plugin extension is invoked a logging tag with the plugin name is set. This way any
+ * errors that are triggered by the plugin extension (even if they happen in Gerrit code which is
+ * called by the plugin extension) can be easily attributed to the plugin.
+ *
+ * <p>The run* methods execute the extension but don't deliver a result back to the caller.
+ * Exceptions can be caught and logged.
+ *
+ * <p>The call* methods execute the extension and deliver a result back to the caller.
+ *
+ * <p>Example if all exceptions should be caught and logged:
+ *
+ * <pre>
+ * fooPluginSetEntryContext.run(foo -> foo.doFoo());
+ * </pre>
+ *
+ * <p>Example if all exceptions, but one, should be caught and logged:
+ *
+ * <pre>
+ * try {
+ *   fooPluginSetEntryContext.run(foo -> foo.doFoo(), MyException.class);
+ * } catch (MyException e) {
+ *   // handle the exception
+ * }
+ * </pre>
+ *
+ * <p>Example if return values should be handled:
+ *
+ * <pre>
+ * Object result = fooPluginSetEntryContext.call(foo -> foo.getFoo());
+ * </pre>
+ *
+ * <p>Example if return values and a single exception should be handled:
+ *
+ * <pre>
+ * Object result;
+ * try {
+ *   result = fooPluginSetEntryContext.call(foo -> foo.getFoo(), MyException.class);
+ * } catch (MyException e) {
+ *   // handle the exception
+ * }
+ * </pre>
+ *
+ * <p>Example if several exceptions should be handled:
+ *
+ * <pre>
+ * for (Extension<Foo> fooExtension : fooDynamicSet.entries()) {
+ *   try (TraceContext traceContext = PluginContext.newTrace(fooExtension)) {
+ *     fooExtension.get().doFoo();
+ *   } catch (MyException1 | MyException2 | MyException3 e) {
+ *     // handle the exception
+ *   }
+ * }
+ * </pre>
+ */
+public class PluginSetEntryContext<T> {
+  private final Extension<T> extension;
+  private final PluginMetrics pluginMetrics;
+
+  PluginSetEntryContext(Extension<T> extension, PluginMetrics pluginMetrics) {
+    this.extension = requireNonNull(extension);
+    this.pluginMetrics = pluginMetrics;
+  }
+
+  /**
+   * Returns the name of the plugin that registered this extension.
+   *
+   * @return the plugin name
+   */
+  public String getPluginName() {
+    return extension.getPluginName();
+  }
+
+  /**
+   * Returns the implementation of this extension.
+   *
+   * <p>Should only be used in exceptional cases to get direct access to the extension
+   * implementation. If possible the extension should be invoked through {@link
+   * #run(PluginContext.ExtensionImplConsumer)}, {@link #run(PluginContext.ExtensionImplConsumer,
+   * java.lang.Class)}, {@link #call(PluginContext.ExtensionImplFunction)} and {@link
+   * #call(PluginContext.CheckedExtensionImplFunction, java.lang.Class)}.
+   *
+   * @return the implementation of this extension
+   */
+  public T get() {
+    return extension.get();
+  }
+
+  /**
+   * Invokes the plugin extension. All exceptions from the plugin extension are caught and logged.
+   *
+   * <p>The consumer gets the extension implementation provided that should be invoked.
+   *
+   * @param extensionImplConsumer consumer that invokes the extension
+   */
+  public void run(ExtensionImplConsumer<T> extensionImplConsumer) {
+    PluginContext.runLogExceptions(pluginMetrics, extension, extensionImplConsumer);
+  }
+
+  /**
+   * Invokes the plugin extension. All exceptions from the plugin extension are caught and logged.
+   *
+   * <p>The consumer gets the extension implementation provided that should be invoked.
+   *
+   * @param extensionImplConsumer consumer that invokes the extension
+   * @param exceptionClass type of the exceptions that should be thrown
+   * @throws X expected exception from the plugin extension
+   */
+  public <X extends Exception> void run(
+      ExtensionImplConsumer<T> extensionImplConsumer, Class<X> exceptionClass) throws X {
+    PluginContext.runLogExceptions(pluginMetrics, extension, extensionImplConsumer, exceptionClass);
+  }
+
+  /**
+   * Calls the plugin extension and returns the result from the plugin extension call.
+   *
+   * <p>The function gets the extension point provided that should be invoked.
+   *
+   * @param extensionImplFunction function that invokes the extension
+   * @return the result from the plugin extension
+   */
+  public <R> R call(ExtensionImplFunction<T, R> extensionImplFunction) {
+    return PluginContext.call(pluginMetrics, extension, extensionImplFunction);
+  }
+
+  /**
+   * Calls the plugin extension and returns the result from the plugin extension call. Exceptions of
+   * the specified type are thrown and must be handled by the caller.
+   *
+   * <p>The function gets the extension implementation provided that should be invoked.
+   *
+   * @param checkedExtensionImplFunction function that invokes the extension
+   * @param exceptionClass type of the exceptions that should be thrown
+   * @return the result from the plugin extension
+   * @throws X expected exception from the plugin extension
+   */
+  public <R, X extends Exception> R call(
+      CheckedExtensionImplFunction<T, R, X> checkedExtensionImplFunction, Class<X> exceptionClass)
+      throws X {
+    return PluginContext.call(
+        pluginMetrics, extension, checkedExtensionImplFunction, exceptionClass);
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/AbstractPreloadedPluginScanner.java b/java/com/google/gerrit/server/plugins/AbstractPreloadedPluginScanner.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/plugins/AbstractPreloadedPluginScanner.java
rename to java/com/google/gerrit/server/plugins/AbstractPreloadedPluginScanner.java
diff --git a/java/com/google/gerrit/server/plugins/AutoRegisterModules.java b/java/com/google/gerrit/server/plugins/AutoRegisterModules.java
new file mode 100644
index 0000000..fde61ff
--- /dev/null
+++ b/java/com/google/gerrit/server/plugins/AutoRegisterModules.java
@@ -0,0 +1,249 @@
+// Copyright (C) 2012 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.google.gerrit.server.plugins;
+
+import static com.google.gerrit.extensions.webui.JavaScriptPlugin.STATIC_INIT_JS;
+import static com.google.gerrit.server.plugins.AutoRegisterUtil.calculateBindAnnotation;
+import static com.google.gerrit.server.plugins.PluginGuiceEnvironment.is;
+
+import com.google.common.collect.LinkedListMultimap;
+import com.google.common.collect.ListMultimap;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.annotations.Export;
+import com.google.gerrit.extensions.annotations.ExtensionPoint;
+import com.google.gerrit.extensions.annotations.Listen;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.webui.JavaScriptPlugin;
+import com.google.gerrit.extensions.webui.WebUiPlugin;
+import com.google.gerrit.server.plugins.PluginContentScanner.ExtensionMetaData;
+import com.google.inject.AbstractModule;
+import com.google.inject.Module;
+import com.google.inject.Scopes;
+import com.google.inject.TypeLiteral;
+import java.io.IOException;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.ParameterizedType;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+class AutoRegisterModules {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final String pluginName;
+  private final PluginGuiceEnvironment env;
+  private final PluginContentScanner scanner;
+  private final ClassLoader classLoader;
+  private final ModuleGenerator sshGen;
+  private final ModuleGenerator httpGen;
+
+  private Set<Class<?>> sysSingletons;
+  private ListMultimap<TypeLiteral<?>, Class<?>> sysListen;
+  private String initJs;
+
+  Module sysModule;
+  Module sshModule;
+  Module httpModule;
+
+  AutoRegisterModules(
+      String pluginName,
+      PluginGuiceEnvironment env,
+      PluginContentScanner scanner,
+      ClassLoader classLoader) {
+    this.pluginName = pluginName;
+    this.env = env;
+    this.scanner = scanner;
+    this.classLoader = classLoader;
+    this.sshGen = env.hasSshModule() ? env.newSshModuleGenerator() : new ModuleGenerator.NOP();
+    this.httpGen = env.hasHttpModule() ? env.newHttpModuleGenerator() : new ModuleGenerator.NOP();
+  }
+
+  AutoRegisterModules discover() throws InvalidPluginException {
+    sysSingletons = new HashSet<>();
+    sysListen = LinkedListMultimap.create();
+    initJs = null;
+
+    sshGen.setPluginName(pluginName);
+    httpGen.setPluginName(pluginName);
+
+    scan();
+
+    if (!sysSingletons.isEmpty() || !sysListen.isEmpty() || initJs != null) {
+      sysModule = makeSystemModule();
+    }
+    sshModule = sshGen.create();
+    httpModule = httpGen.create();
+    return this;
+  }
+
+  private Module makeSystemModule() {
+    return new AbstractModule() {
+      @Override
+      protected void configure() {
+        for (Class<?> clazz : sysSingletons) {
+          bind(clazz).in(Scopes.SINGLETON);
+        }
+        for (Map.Entry<TypeLiteral<?>, Class<?>> e : sysListen.entries()) {
+          @SuppressWarnings("unchecked")
+          TypeLiteral<Object> type = (TypeLiteral<Object>) e.getKey();
+
+          @SuppressWarnings("unchecked")
+          Class<Object> impl = (Class<Object>) e.getValue();
+
+          Annotation n = calculateBindAnnotation(impl);
+          bind(type).annotatedWith(n).to(impl);
+        }
+        if (initJs != null) {
+          DynamicSet.bind(binder(), WebUiPlugin.class).toInstance(new JavaScriptPlugin(initJs));
+        }
+      }
+    };
+  }
+
+  private void scan() throws InvalidPluginException {
+    Map<Class<? extends Annotation>, Iterable<ExtensionMetaData>> extensions =
+        scanner.scan(pluginName, Arrays.asList(Export.class, Listen.class));
+    for (ExtensionMetaData export : extensions.get(Export.class)) {
+      export(export);
+    }
+    for (ExtensionMetaData listener : extensions.get(Listen.class)) {
+      listen(listener);
+    }
+    if (env.hasHttpModule()) {
+      exportInitJs();
+    }
+  }
+
+  private void exportInitJs() {
+    try {
+      if (scanner.getEntry(STATIC_INIT_JS).isPresent()) {
+        initJs = STATIC_INIT_JS;
+      }
+    } catch (IOException e) {
+      logger.atWarning().withCause(e).log(
+          "Cannot access %s from plugin %s: "
+              + "JavaScript auto-discovered plugin will not be registered",
+          STATIC_INIT_JS, pluginName);
+    }
+  }
+
+  private void export(ExtensionMetaData def) throws InvalidPluginException {
+    Class<?> clazz;
+    try {
+      clazz = Class.forName(def.className, false, classLoader);
+    } catch (ClassNotFoundException err) {
+      throw new InvalidPluginException(
+          String.format("Cannot load %s with @Export(\"%s\")", def.className, def.annotationValue),
+          err);
+    }
+
+    Export export = clazz.getAnnotation(Export.class);
+    if (export == null) {
+      logger.atWarning().log(
+          "In plugin %s asm incorrectly parsed %s with @Export(\"%s\")",
+          pluginName, clazz.getName(), def.annotationValue);
+      return;
+    }
+
+    if (is("org.apache.sshd.server.Command", clazz)) {
+      sshGen.export(export, clazz);
+    } else if (is("javax.servlet.http.HttpServlet", clazz)) {
+      httpGen.export(export, clazz);
+      listen(clazz, clazz);
+    } else {
+      int cnt = sysListen.size();
+      listen(clazz, clazz);
+      if (cnt == sysListen.size()) {
+        // If no bindings were recorded, the extension isn't recognized.
+        throw new InvalidPluginException(
+            String.format(
+                "Class %s with @Export(\"%s\") not supported", clazz.getName(), export.value()));
+      }
+    }
+  }
+
+  private void listen(ExtensionMetaData def) throws InvalidPluginException {
+    Class<?> clazz;
+    try {
+      clazz = Class.forName(def.className, false, classLoader);
+    } catch (ClassNotFoundException err) {
+      throw new InvalidPluginException(
+          String.format("Cannot load %s with @Listen", def.className), err);
+    }
+
+    Listen listen = clazz.getAnnotation(Listen.class);
+    if (listen != null) {
+      listen(clazz, clazz);
+    } else {
+      logger.atWarning().log(
+          "In plugin %s asm incorrectly parsed %s with @Listen", pluginName, clazz.getName());
+    }
+  }
+
+  private void listen(java.lang.reflect.Type type, Class<?> clazz) throws InvalidPluginException {
+    while (type != null) {
+      Class<?> rawType;
+      if (type instanceof ParameterizedType) {
+        rawType = (Class<?>) ((ParameterizedType) type).getRawType();
+      } else if (type instanceof Class) {
+        rawType = (Class<?>) type;
+      } else {
+        return;
+      }
+
+      if (rawType.getAnnotation(ExtensionPoint.class) != null) {
+        TypeLiteral<?> tl = TypeLiteral.get(type);
+        if (env.hasDynamicItem(tl)) {
+          sysSingletons.add(clazz);
+          sysListen.put(tl, clazz);
+          httpGen.listen(tl, clazz);
+          sshGen.listen(tl, clazz);
+        } else if (env.hasDynamicSet(tl)) {
+          sysSingletons.add(clazz);
+          sysListen.put(tl, clazz);
+          httpGen.listen(tl, clazz);
+          sshGen.listen(tl, clazz);
+        } else if (env.hasDynamicMap(tl)) {
+          if (clazz.getAnnotation(Export.class) == null) {
+            throw new InvalidPluginException(
+                String.format(
+                    "Class %s requires @Export(\"name\") annotation for %s",
+                    clazz.getName(), rawType.getName()));
+          }
+          sysSingletons.add(clazz);
+          sysListen.put(tl, clazz);
+          httpGen.listen(tl, clazz);
+          sshGen.listen(tl, clazz);
+        } else {
+          throw new InvalidPluginException(
+              String.format(
+                  "Cannot register %s, server does not accept %s",
+                  clazz.getName(), rawType.getName()));
+        }
+        return;
+      }
+
+      java.lang.reflect.Type[] interfaces = rawType.getGenericInterfaces();
+      if (interfaces != null) {
+        for (java.lang.reflect.Type i : interfaces) {
+          listen(i, clazz);
+        }
+      }
+
+      type = rawType.getGenericSuperclass();
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/AutoRegisterUtil.java b/java/com/google/gerrit/server/plugins/AutoRegisterUtil.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/plugins/AutoRegisterUtil.java
rename to java/com/google/gerrit/server/plugins/AutoRegisterUtil.java
diff --git a/java/com/google/gerrit/server/plugins/CleanupHandle.java b/java/com/google/gerrit/server/plugins/CleanupHandle.java
new file mode 100644
index 0000000..87d6bb0
--- /dev/null
+++ b/java/com/google/gerrit/server/plugins/CleanupHandle.java
@@ -0,0 +1,50 @@
+// Copyright (C) 2012 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.google.gerrit.server.plugins;
+
+import com.google.common.flogger.FluentLogger;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.jar.JarFile;
+
+class CleanupHandle {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final Path tmp;
+  private final JarFile jarFile;
+
+  CleanupHandle(Path tmp, JarFile jarFile) {
+    this.tmp = tmp;
+    this.jarFile = jarFile;
+  }
+
+  void cleanup() {
+    try {
+      jarFile.close();
+    } catch (IOException err) {
+      logger.atSevere().withCause(err).log("Cannot close %s", jarFile.getName());
+    }
+    try {
+      Files.deleteIfExists(tmp);
+      logger.atInfo().log("Cleaned plugin %s", tmp.getFileName());
+    } catch (IOException e) {
+      logger.atWarning().withCause(e).log(
+          "Cannot delete %s, retrying to delete it on termination of the virtual machine",
+          tmp.toAbsolutePath());
+      tmp.toFile().deleteOnExit();
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/CopyConfigModule.java b/java/com/google/gerrit/server/plugins/CopyConfigModule.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/plugins/CopyConfigModule.java
rename to java/com/google/gerrit/server/plugins/CopyConfigModule.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/DelegatingClassLoader.java b/java/com/google/gerrit/server/plugins/DelegatingClassLoader.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/plugins/DelegatingClassLoader.java
rename to java/com/google/gerrit/server/plugins/DelegatingClassLoader.java
diff --git a/java/com/google/gerrit/server/plugins/DisablePlugin.java b/java/com/google/gerrit/server/plugins/DisablePlugin.java
new file mode 100644
index 0000000..62eb993
--- /dev/null
+++ b/java/com/google/gerrit/server/plugins/DisablePlugin.java
@@ -0,0 +1,52 @@
+// Copyright (C) 2012 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.google.gerrit.server.plugins;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.common.PluginInfo;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class DisablePlugin implements RestModifyView<PluginResource, Input> {
+
+  private final PluginLoader loader;
+  private final PermissionBackend permissionBackend;
+
+  @Inject
+  DisablePlugin(PluginLoader loader, PermissionBackend permissionBackend) {
+    this.loader = loader;
+    this.permissionBackend = permissionBackend;
+  }
+
+  @Override
+  public PluginInfo apply(PluginResource resource, Input input) throws RestApiException {
+    try {
+      permissionBackend.currentUser().check(GlobalPermission.ADMINISTRATE_SERVER);
+    } catch (PermissionBackendException e) {
+      throw new RestApiException("Could not check permission", e);
+    }
+    loader.checkRemoteAdminEnabled();
+    String name = resource.getName();
+    loader.disablePlugins(ImmutableSet.of(name));
+    return ListPlugins.toPluginInfo(loader.get(name));
+  }
+}
diff --git a/java/com/google/gerrit/server/plugins/EnablePlugin.java b/java/com/google/gerrit/server/plugins/EnablePlugin.java
new file mode 100644
index 0000000..569bc39
--- /dev/null
+++ b/java/com/google/gerrit/server/plugins/EnablePlugin.java
@@ -0,0 +1,57 @@
+// Copyright (C) 2012 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.google.gerrit.server.plugins;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.common.PluginInfo;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
+@Singleton
+public class EnablePlugin implements RestModifyView<PluginResource, Input> {
+
+  private final PluginLoader loader;
+
+  @Inject
+  EnablePlugin(PluginLoader loader) {
+    this.loader = loader;
+  }
+
+  @Override
+  public PluginInfo apply(PluginResource resource, Input input) throws RestApiException {
+    loader.checkRemoteAdminEnabled();
+    String name = resource.getName();
+    try {
+      loader.enablePlugins(ImmutableSet.of(name));
+    } catch (PluginInstallException e) {
+      StringWriter buf = new StringWriter();
+      buf.write(String.format("cannot enable %s\n", name));
+      PrintWriter pw = new PrintWriter(buf);
+      e.printStackTrace(pw);
+      pw.flush();
+      throw new ResourceConflictException(buf.toString());
+    }
+    return ListPlugins.toPluginInfo(loader.get(name));
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/GetStatus.java b/java/com/google/gerrit/server/plugins/GetStatus.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/plugins/GetStatus.java
rename to java/com/google/gerrit/server/plugins/GetStatus.java
diff --git a/java/com/google/gerrit/server/plugins/InstallPlugin.java b/java/com/google/gerrit/server/plugins/InstallPlugin.java
new file mode 100644
index 0000000..a79a5a6
--- /dev/null
+++ b/java/com/google/gerrit/server/plugins/InstallPlugin.java
@@ -0,0 +1,134 @@
+// Copyright (C) 2012 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.google.gerrit.server.plugins;
+
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.extensions.api.plugins.InstallPluginInput;
+import com.google.gerrit.extensions.common.PluginInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestCollectionCreateView;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.net.URL;
+import java.util.zip.ZipException;
+
+@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
+public class InstallPlugin implements RestModifyView<TopLevelResource, InstallPluginInput> {
+  private final PluginLoader loader;
+
+  private String name;
+  private boolean created;
+
+  @Inject
+  InstallPlugin(PluginLoader loader) {
+    this.loader = loader;
+  }
+
+  public InstallPlugin setName(String name) {
+    this.name = name;
+    return this;
+  }
+
+  public InstallPlugin setCreated(boolean created) {
+    this.created = created;
+    return this;
+  }
+
+  @Override
+  public Response<PluginInfo> apply(TopLevelResource resource, InstallPluginInput input)
+      throws RestApiException, IOException {
+    loader.checkRemoteAdminEnabled();
+    try {
+      try (InputStream in = openStream(input)) {
+        String pluginName = loader.installPluginFromStream(name, in);
+        PluginInfo info = ListPlugins.toPluginInfo(loader.get(pluginName));
+        return created ? Response.created(info) : Response.ok(info);
+      }
+    } catch (PluginInstallException e) {
+      StringWriter buf = new StringWriter();
+      buf.write(String.format("cannot install %s", name));
+      if (e.getCause() instanceof ZipException) {
+        buf.write(": ");
+        buf.write(e.getCause().getMessage());
+      } else {
+        buf.write(":\n");
+        PrintWriter pw = new PrintWriter(buf);
+        e.printStackTrace(pw);
+        pw.flush();
+      }
+      throw new BadRequestException(buf.toString());
+    }
+  }
+
+  private InputStream openStream(InstallPluginInput input) throws IOException, BadRequestException {
+    if (input.raw != null) {
+      return input.raw.getInputStream();
+    }
+    try {
+      return new URL(input.url).openStream();
+    } catch (IOException e) {
+      throw new BadRequestException(e.getMessage());
+    }
+  }
+
+  @RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
+  @Singleton
+  static class Create
+      implements RestCollectionCreateView<TopLevelResource, PluginResource, InstallPluginInput> {
+    private final PluginLoader loader;
+    private final Provider<InstallPlugin> install;
+
+    @Inject
+    Create(PluginLoader loader, Provider<InstallPlugin> install) {
+      this.loader = loader;
+      this.install = install;
+    }
+
+    @Override
+    public Response<PluginInfo> apply(
+        TopLevelResource parentResource, IdString id, InstallPluginInput input) throws Exception {
+      loader.checkRemoteAdminEnabled();
+      return install.get().setName(id.get()).setCreated(true).apply(parentResource, input);
+    }
+  }
+
+  @RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
+  @Singleton
+  static class Overwrite implements RestModifyView<PluginResource, InstallPluginInput> {
+    private final Provider<InstallPlugin> install;
+
+    @Inject
+    Overwrite(Provider<InstallPlugin> install) {
+      this.install = install;
+    }
+
+    @Override
+    public Response<PluginInfo> apply(PluginResource resource, InstallPluginInput input)
+        throws RestApiException, IOException {
+      return install.get().setName(resource.getName()).apply(TopLevelResource.INSTANCE, input);
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/InvalidPluginException.java b/java/com/google/gerrit/server/plugins/InvalidPluginException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/plugins/InvalidPluginException.java
rename to java/com/google/gerrit/server/plugins/InvalidPluginException.java
diff --git a/java/com/google/gerrit/server/plugins/JarPluginProvider.java b/java/com/google/gerrit/server/plugins/JarPluginProvider.java
new file mode 100644
index 0000000..5b80059
--- /dev/null
+++ b/java/com/google/gerrit/server/plugins/JarPluginProvider.java
@@ -0,0 +1,175 @@
+// Copyright (C) 2014 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.google.gerrit.server.plugins;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.registration.PluginName;
+import com.google.gerrit.server.config.PluginConfig;
+import com.google.gerrit.server.config.PluginConfigFactory;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+import org.eclipse.jgit.internal.storage.file.FileSnapshot;
+
+public class JarPluginProvider implements ServerPluginProvider {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  static final String PLUGIN_TMP_PREFIX = "plugin_";
+  static final String JAR_EXTENSION = ".jar";
+
+  private final Path tmpDir;
+  private final PluginConfigFactory configFactory;
+
+  @Inject
+  JarPluginProvider(SitePaths sitePaths, PluginConfigFactory configFactory) {
+    this.tmpDir = sitePaths.tmp_dir;
+    this.configFactory = configFactory;
+  }
+
+  @Override
+  public boolean handles(Path srcPath) {
+    String fileName = srcPath.getFileName().toString();
+    return fileName.endsWith(JAR_EXTENSION) || fileName.endsWith(JAR_EXTENSION + ".disabled");
+  }
+
+  @Override
+  public String getPluginName(Path srcPath) {
+    try {
+      return MoreObjects.firstNonNull(getJarPluginName(srcPath), PluginUtil.nameOf(srcPath));
+    } catch (IOException e) {
+      throw new IllegalArgumentException(
+          "Invalid plugin file " + srcPath + ": cannot get plugin name", e);
+    }
+  }
+
+  public static String getJarPluginName(Path srcPath) throws IOException {
+    try (JarFile jarFile = new JarFile(srcPath.toFile())) {
+      return jarFile.getManifest().getMainAttributes().getValue("Gerrit-PluginName");
+    }
+  }
+
+  @Override
+  public ServerPlugin get(Path srcPath, FileSnapshot snapshot, PluginDescription description)
+      throws InvalidPluginException {
+    try {
+      String name = getPluginName(srcPath);
+      String extension = getExtension(srcPath);
+      try (InputStream in = Files.newInputStream(srcPath)) {
+        Path tmp = PluginUtil.asTemp(in, tempNameFor(name), extension, tmpDir);
+        return loadJarPlugin(name, srcPath, snapshot, tmp, description);
+      }
+    } catch (IOException e) {
+      throw new InvalidPluginException("Cannot load Jar plugin " + srcPath, e);
+    }
+  }
+
+  @Override
+  public String getProviderPluginName() {
+    return PluginName.GERRIT;
+  }
+
+  private static String getExtension(Path path) {
+    return getExtension(path.getFileName().toString());
+  }
+
+  private static String getExtension(String name) {
+    int ext = name.lastIndexOf('.');
+    return 0 < ext ? name.substring(ext) : "";
+  }
+
+  private static String tempNameFor(String name) {
+    SimpleDateFormat fmt = new SimpleDateFormat("yyMMdd_HHmm");
+    return PLUGIN_TMP_PREFIX + name + "_" + fmt.format(new Date()) + "_";
+  }
+
+  public static Path storeInTemp(String pluginName, InputStream in, SitePaths sitePaths)
+      throws IOException {
+    if (!Files.exists(sitePaths.tmp_dir)) {
+      Files.createDirectories(sitePaths.tmp_dir);
+    }
+    return PluginUtil.asTemp(in, tempNameFor(pluginName), ".jar", sitePaths.tmp_dir);
+  }
+
+  private ServerPlugin loadJarPlugin(
+      String name, Path srcJar, FileSnapshot snapshot, Path tmp, PluginDescription description)
+      throws IOException, InvalidPluginException, MalformedURLException {
+    JarFile jarFile = new JarFile(tmp.toFile());
+    boolean keep = false;
+    try {
+      Manifest manifest = jarFile.getManifest();
+      Plugin.ApiType type = Plugin.getApiType(manifest);
+
+      List<URL> urls = new ArrayList<>(2);
+      String overlay = System.getProperty("gerrit.plugin-classes");
+      if (overlay != null) {
+        Path classes = Paths.get(overlay).resolve(name).resolve("main");
+        if (Files.isDirectory(classes)) {
+          logger.atInfo().log("plugin %s: including %s", name, classes);
+          urls.add(classes.toUri().toURL());
+        }
+      }
+      urls.add(tmp.toUri().toURL());
+
+      ClassLoader pluginLoader =
+          URLClassLoader.newInstance(
+              urls.toArray(new URL[urls.size()]), PluginUtil.parentFor(type));
+
+      JarScanner jarScanner = createJarScanner(tmp);
+      PluginConfig pluginConfig = configFactory.getFromGerritConfig(name);
+
+      ServerPlugin plugin =
+          new ServerPlugin(
+              name,
+              description.canonicalUrl,
+              description.user,
+              srcJar,
+              snapshot,
+              jarScanner,
+              description.dataDir,
+              pluginLoader,
+              pluginConfig.getString("metricsPrefix", null),
+              description.gerritRuntime);
+      plugin.setCleanupHandle(new CleanupHandle(tmp, jarFile));
+      keep = true;
+      return plugin;
+    } finally {
+      if (!keep) {
+        jarFile.close();
+      }
+    }
+  }
+
+  private JarScanner createJarScanner(Path srcJar) throws InvalidPluginException {
+    try {
+      return new JarScanner(srcJar);
+    } catch (IOException e) {
+      throw new InvalidPluginException("Cannot scan plugin file " + srcJar, e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/plugins/JarScanner.java b/java/com/google/gerrit/server/plugins/JarScanner.java
new file mode 100644
index 0000000..1a9b859
--- /dev/null
+++ b/java/com/google/gerrit/server/plugins/JarScanner.java
@@ -0,0 +1,343 @@
+// Copyright (C) 2014 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.google.gerrit.server.plugins;
+
+import static com.google.common.base.MoreObjects.firstNonNull;
+import static com.google.common.collect.Iterables.transform;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.flogger.FluentLogger;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.annotation.Annotation;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.jar.Attributes;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+import org.eclipse.jgit.util.IO;
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.Attribute;
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+
+public class JarScanner implements PluginContentScanner, AutoCloseable {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final int SKIP_ALL =
+      ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES;
+  private final JarFile jarFile;
+
+  public JarScanner(Path src) throws IOException {
+    this.jarFile = new JarFile(src.toFile());
+  }
+
+  @Override
+  public Map<Class<? extends Annotation>, Iterable<ExtensionMetaData>> scan(
+      String pluginName, Iterable<Class<? extends Annotation>> annotations)
+      throws InvalidPluginException {
+    Set<String> descriptors = new HashSet<>();
+    ListMultimap<String, JarScanner.ClassData> rawMap =
+        MultimapBuilder.hashKeys().arrayListValues().build();
+    Map<Class<? extends Annotation>, String> classObjToClassDescr = new HashMap<>();
+
+    for (Class<? extends Annotation> annotation : annotations) {
+      String descriptor = Type.getType(annotation).getDescriptor();
+      descriptors.add(descriptor);
+      classObjToClassDescr.put(annotation, descriptor);
+    }
+
+    Enumeration<JarEntry> e = jarFile.entries();
+    while (e.hasMoreElements()) {
+      JarEntry entry = e.nextElement();
+      if (skip(entry)) {
+        continue;
+      }
+
+      ClassData def = new ClassData(descriptors);
+      try {
+        new ClassReader(read(jarFile, entry)).accept(def, SKIP_ALL);
+      } catch (IOException err) {
+        throw new InvalidPluginException("Cannot auto-register", err);
+      } catch (RuntimeException err) {
+        logger.atWarning().withCause(err).log(
+            "Plugin %s has invalid class file %s inside of %s",
+            pluginName, entry.getName(), jarFile.getName());
+        continue;
+      }
+
+      if (!Strings.isNullOrEmpty(def.annotationName)) {
+        if (def.isConcrete()) {
+          rawMap.put(def.annotationName, def);
+        } else {
+          logger.atWarning().log(
+              "Plugin %s tries to @%s(\"%s\") abstract class %s",
+              pluginName, def.annotationName, def.annotationValue, def.className);
+        }
+      }
+    }
+
+    ImmutableMap.Builder<Class<? extends Annotation>, Iterable<ExtensionMetaData>> result =
+        ImmutableMap.builder();
+
+    for (Class<? extends Annotation> annotoation : annotations) {
+      String descr = classObjToClassDescr.get(annotoation);
+      Collection<ClassData> discoverdData = rawMap.get(descr);
+      Collection<ClassData> values = firstNonNull(discoverdData, Collections.<ClassData>emptySet());
+
+      result.put(
+          annotoation,
+          transform(values, cd -> new ExtensionMetaData(cd.className, cd.annotationValue)));
+    }
+
+    return result.build();
+  }
+
+  public List<String> findSubClassesOf(Class<?> superClass) throws IOException {
+    return findSubClassesOf(superClass.getName());
+  }
+
+  @Override
+  public void close() throws IOException {
+    jarFile.close();
+  }
+
+  private List<String> findSubClassesOf(String superClass) throws IOException {
+    String name = superClass.replace('.', '/');
+
+    List<String> classes = new ArrayList<>();
+    Enumeration<JarEntry> e = jarFile.entries();
+    while (e.hasMoreElements()) {
+      JarEntry entry = e.nextElement();
+      if (skip(entry)) {
+        continue;
+      }
+
+      ClassData def = new ClassData(Collections.<String>emptySet());
+      try {
+        new ClassReader(read(jarFile, entry)).accept(def, SKIP_ALL);
+      } catch (RuntimeException err) {
+        logger.atWarning().withCause(err).log(
+            "Jar %s has invalid class file %s", jarFile.getName(), entry.getName());
+        continue;
+      }
+
+      if (name.equals(def.superName)) {
+        classes.addAll(findSubClassesOf(def.className));
+        if (def.isConcrete()) {
+          classes.add(def.className);
+        }
+      }
+    }
+
+    return classes;
+  }
+
+  private static boolean skip(JarEntry entry) {
+    if (!entry.getName().endsWith(".class")) {
+      return true; // Avoid non-class resources.
+    }
+    if (entry.getSize() <= 0) {
+      return true; // Directories have 0 size.
+    }
+    if (entry.getSize() >= 1024 * 1024) {
+      return true; // Do not scan huge class files.
+    }
+    return false;
+  }
+
+  private static byte[] read(JarFile jarFile, JarEntry entry) throws IOException {
+    byte[] data = new byte[(int) entry.getSize()];
+    try (InputStream in = jarFile.getInputStream(entry)) {
+      IO.readFully(in, data, 0, data.length);
+    }
+    return data;
+  }
+
+  public static class ClassData extends ClassVisitor {
+    int access;
+    String className;
+    String superName;
+    String annotationName;
+    String annotationValue;
+    String[] interfaces;
+    Collection<String> exports;
+
+    private ClassData(Collection<String> exports) {
+      super(Opcodes.ASM6);
+      this.exports = exports;
+    }
+
+    boolean isConcrete() {
+      return (access & Opcodes.ACC_ABSTRACT) == 0 && (access & Opcodes.ACC_INTERFACE) == 0;
+    }
+
+    @Override
+    public void visit(
+        int version,
+        int access,
+        String name,
+        String signature,
+        String superName,
+        String[] interfaces) {
+      this.className = Type.getObjectType(name).getClassName();
+      this.access = access;
+      this.superName = superName;
+    }
+
+    @Override
+    public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
+      if (!visible) {
+        return null;
+      }
+      Optional<String> found = exports.stream().filter(x -> x.equals(desc)).findAny();
+      if (found.isPresent()) {
+        annotationName = desc;
+        return new AbstractAnnotationVisitor() {
+          @Override
+          public void visit(String name, Object value) {
+            annotationValue = (String) value;
+          }
+        };
+      }
+      return null;
+    }
+
+    @Override
+    public void visitSource(String arg0, String arg1) {}
+
+    @Override
+    public void visitOuterClass(String arg0, String arg1, String arg2) {}
+
+    @Override
+    public MethodVisitor visitMethod(
+        int arg0, String arg1, String arg2, String arg3, String[] arg4) {
+      return null;
+    }
+
+    @Override
+    public void visitInnerClass(String arg0, String arg1, String arg2, int arg3) {}
+
+    @Override
+    public FieldVisitor visitField(int arg0, String arg1, String arg2, String arg3, Object arg4) {
+      return null;
+    }
+
+    @Override
+    public void visitEnd() {}
+
+    @Override
+    public void visitAttribute(Attribute arg0) {}
+  }
+
+  private abstract static class AbstractAnnotationVisitor extends AnnotationVisitor {
+    AbstractAnnotationVisitor() {
+      super(Opcodes.ASM6);
+    }
+
+    @Override
+    public AnnotationVisitor visitAnnotation(String arg0, String arg1) {
+      return null;
+    }
+
+    @Override
+    public AnnotationVisitor visitArray(String arg0) {
+      return null;
+    }
+
+    @Override
+    public void visitEnum(String arg0, String arg1, String arg2) {}
+
+    @Override
+    public void visitEnd() {}
+  }
+
+  @Override
+  public Optional<PluginEntry> getEntry(String resourcePath) throws IOException {
+    JarEntry jarEntry = jarFile.getJarEntry(resourcePath);
+    if (jarEntry == null || jarEntry.getSize() == 0) {
+      return Optional.empty();
+    }
+
+    return Optional.of(resourceOf(jarEntry));
+  }
+
+  @Override
+  public Enumeration<PluginEntry> entries() {
+    return Collections.enumeration(
+        Lists.transform(
+            Collections.list(jarFile.entries()),
+            jarEntry -> {
+              try {
+                return resourceOf(jarEntry);
+              } catch (IOException e) {
+                throw new IllegalArgumentException(
+                    "Cannot convert jar entry " + jarEntry + " to a resource", e);
+              }
+            }));
+  }
+
+  @Override
+  public InputStream getInputStream(PluginEntry entry) throws IOException {
+    return jarFile.getInputStream(jarFile.getEntry(entry.getName()));
+  }
+
+  @Override
+  public Manifest getManifest() throws IOException {
+    return jarFile.getManifest();
+  }
+
+  private PluginEntry resourceOf(JarEntry jarEntry) throws IOException {
+    return new PluginEntry(
+        jarEntry.getName(),
+        jarEntry.getTime(),
+        Optional.of(jarEntry.getSize()),
+        attributesOf(jarEntry));
+  }
+
+  private Map<Object, String> attributesOf(JarEntry jarEntry) throws IOException {
+    Attributes attributes = jarEntry.getAttributes();
+    if (attributes == null) {
+      return Collections.emptyMap();
+    }
+    return Maps.transformEntries(
+        attributes,
+        new Maps.EntryTransformer<Object, Object, String>() {
+          @Override
+          public String transformEntry(Object key, Object value) {
+            return (String) value;
+          }
+        });
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JsPlugin.java b/java/com/google/gerrit/server/plugins/JsPlugin.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/plugins/JsPlugin.java
rename to java/com/google/gerrit/server/plugins/JsPlugin.java
diff --git a/java/com/google/gerrit/server/plugins/ListPlugins.java b/java/com/google/gerrit/server/plugins/ListPlugins.java
new file mode 100644
index 0000000..84e63d0
--- /dev/null
+++ b/java/com/google/gerrit/server/plugins/ListPlugins.java
@@ -0,0 +1,164 @@
+// Copyright (C) 2012 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.google.gerrit.server.plugins;
+
+import static java.util.Comparator.comparing;
+import static java.util.stream.Collectors.toMap;
+
+import com.google.common.collect.Streams;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.extensions.api.plugins.Plugins;
+import com.google.gerrit.extensions.common.PluginInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.extensions.restapi.Url;
+import com.google.inject.Inject;
+import java.util.Locale;
+import java.util.SortedMap;
+import java.util.TreeMap;
+import java.util.regex.Pattern;
+import java.util.stream.Stream;
+import org.kohsuke.args4j.Option;
+
+/** List the installed plugins. */
+@RequiresCapability(GlobalCapability.VIEW_PLUGINS)
+public class ListPlugins implements RestReadView<TopLevelResource> {
+  private final PluginLoader pluginLoader;
+
+  private boolean all;
+  private int limit;
+  private int start;
+  private String matchPrefix;
+  private String matchSubstring;
+  private String matchRegex;
+
+  @Option(
+      name = "--all",
+      aliases = {"-a"},
+      usage = "List all plugins, including disabled plugins")
+  public void setAll(boolean all) {
+    this.all = all;
+  }
+
+  @Option(
+      name = "--limit",
+      aliases = {"-n"},
+      metaVar = "CNT",
+      usage = "maximum number of plugins to list")
+  public void setLimit(int limit) {
+    this.limit = limit;
+  }
+
+  @Option(
+      name = "--start",
+      aliases = {"-S"},
+      metaVar = "CNT",
+      usage = "number of plugins to skip")
+  public void setStart(int start) {
+    this.start = start;
+  }
+
+  @Option(
+      name = "--prefix",
+      aliases = {"-p"},
+      metaVar = "PREFIX",
+      usage = "match plugin prefix")
+  public void setMatchPrefix(String matchPrefix) {
+    this.matchPrefix = matchPrefix;
+  }
+
+  @Option(
+      name = "--match",
+      aliases = {"-m"},
+      metaVar = "MATCH",
+      usage = "match plugin substring")
+  public void setMatchSubstring(String matchSubstring) {
+    this.matchSubstring = matchSubstring;
+  }
+
+  @Option(name = "-r", metaVar = "REGEX", usage = "match plugin regex")
+  public void setMatchRegex(String matchRegex) {
+    this.matchRegex = matchRegex;
+  }
+
+  @Inject
+  protected ListPlugins(PluginLoader pluginLoader) {
+    this.pluginLoader = pluginLoader;
+  }
+
+  public ListPlugins request(Plugins.ListRequest request) {
+    this.setAll(request.getAll());
+    this.setStart(request.getStart());
+    this.setLimit(request.getLimit());
+    this.setMatchPrefix(request.getPrefix());
+    this.setMatchSubstring(request.getSubstring());
+    this.setMatchRegex(request.getRegex());
+    return this;
+  }
+
+  @Override
+  public SortedMap<String, PluginInfo> apply(TopLevelResource resource) throws BadRequestException {
+    Stream<Plugin> s = Streams.stream(pluginLoader.getPlugins(all));
+    if (matchPrefix != null) {
+      checkMatchOptions(matchSubstring == null && matchRegex == null);
+      s = s.filter(p -> p.getName().startsWith(matchPrefix));
+    } else if (matchSubstring != null) {
+      checkMatchOptions(matchPrefix == null && matchRegex == null);
+      String substring = matchSubstring.toLowerCase(Locale.US);
+      s = s.filter(p -> p.getName().toLowerCase(Locale.US).contains(substring));
+    } else if (matchRegex != null) {
+      checkMatchOptions(matchPrefix == null && matchSubstring == null);
+      Pattern pattern = Pattern.compile(matchRegex);
+      s = s.filter(p -> pattern.matcher(p.getName()).matches());
+    }
+    s = s.sorted(comparing(Plugin::getName));
+    if (start > 0) {
+      s = s.skip(start);
+    }
+    if (limit > 0) {
+      s = s.limit(limit);
+    }
+    return new TreeMap<>(s.collect(toMap(Plugin::getName, ListPlugins::toPluginInfo)));
+  }
+
+  private void checkMatchOptions(boolean cond) throws BadRequestException {
+    if (!cond) {
+      throw new BadRequestException("specify exactly one of p/m/r");
+    }
+  }
+
+  public static PluginInfo toPluginInfo(Plugin p) {
+    String id;
+    String version;
+    String indexUrl;
+    String filename;
+    Boolean disabled;
+
+    id = Url.encode(p.getName());
+    version = p.getVersion();
+    disabled = p.isDisabled() ? true : null;
+    if (p.getSrcFile() != null) {
+      indexUrl = String.format("plugins/%s/", p.getName());
+      filename = p.getSrcFile().getFileName().toString();
+    } else {
+      indexUrl = null;
+      filename = null;
+    }
+
+    return new PluginInfo(id, version, indexUrl, filename, disabled);
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ModuleGenerator.java b/java/com/google/gerrit/server/plugins/ModuleGenerator.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/plugins/ModuleGenerator.java
rename to java/com/google/gerrit/server/plugins/ModuleGenerator.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/MultipleProvidersForPluginException.java b/java/com/google/gerrit/server/plugins/MultipleProvidersForPluginException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/plugins/MultipleProvidersForPluginException.java
rename to java/com/google/gerrit/server/plugins/MultipleProvidersForPluginException.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/Plugin.java b/java/com/google/gerrit/server/plugins/Plugin.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/plugins/Plugin.java
rename to java/com/google/gerrit/server/plugins/Plugin.java
diff --git a/java/com/google/gerrit/server/plugins/PluginCleanerTask.java b/java/com/google/gerrit/server/plugins/PluginCleanerTask.java
new file mode 100644
index 0000000..6919bbc
--- /dev/null
+++ b/java/com/google/gerrit/server/plugins/PluginCleanerTask.java
@@ -0,0 +1,97 @@
+// Copyright (C) 2012 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.google.gerrit.server.plugins;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.server.git.WorkQueue;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+@Singleton
+class PluginCleanerTask implements Runnable {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final WorkQueue workQueue;
+  private final PluginLoader loader;
+  private volatile int pending;
+  private Future<?> self;
+  private int attempts;
+  private long start;
+
+  @Inject
+  PluginCleanerTask(WorkQueue workQueue, PluginLoader loader) {
+    this.workQueue = workQueue;
+    this.loader = loader;
+  }
+
+  @Override
+  public void run() {
+    try {
+      for (int t = 0; t < 2 * (attempts + 1); t++) {
+        System.gc();
+        Thread.sleep(50);
+      }
+    } catch (InterruptedException e) {
+      // Ignored
+    }
+
+    int left = loader.processPendingCleanups();
+    synchronized (this) {
+      pending = left;
+      self = null;
+
+      if (0 < left) {
+        long waiting = TimeUtil.nowMs() - start;
+        logger.atWarning().log(
+            "%d plugins still waiting to be reclaimed after %d minutes",
+            pending, TimeUnit.MILLISECONDS.toMinutes(waiting));
+        attempts = Math.min(attempts + 1, 15);
+        ensureScheduled();
+      } else {
+        attempts = 0;
+      }
+    }
+  }
+
+  @Override
+  public String toString() {
+    int p = pending;
+    if (0 < p) {
+      return String.format("Plugin Cleaner (waiting for %d plugins)", p);
+    }
+    return "Plugin Cleaner";
+  }
+
+  synchronized void clean(int expect) {
+    if (self == null && pending == 0) {
+      start = TimeUtil.nowMs();
+    }
+    pending = expect;
+    ensureScheduled();
+  }
+
+  private void ensureScheduled() {
+    if (self == null && 0 < pending) {
+      if (attempts == 1) {
+        self = workQueue.getDefaultQueue().schedule(this, 30, TimeUnit.SECONDS);
+      } else {
+        self = workQueue.getDefaultQueue().schedule(this, attempts + 1, TimeUnit.MINUTES);
+      }
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginContentScanner.java b/java/com/google/gerrit/server/plugins/PluginContentScanner.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginContentScanner.java
rename to java/com/google/gerrit/server/plugins/PluginContentScanner.java
diff --git a/java/com/google/gerrit/server/plugins/PluginEntry.java b/java/com/google/gerrit/server/plugins/PluginEntry.java
new file mode 100644
index 0000000..3a6c7b2
--- /dev/null
+++ b/java/com/google/gerrit/server/plugins/PluginEntry.java
@@ -0,0 +1,73 @@
+// Copyright (C) 2014 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.google.gerrit.server.plugins;
+
+import static java.util.Comparator.comparing;
+
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Map;
+import java.util.Optional;
+
+/**
+ * Plugin static resource entry
+ *
+ * <p>Bean representing a static resource inside a plugin. All static resources are available at
+ * {@code <plugin web url>/static} and served by the HttpPluginServlet.
+ */
+public class PluginEntry {
+  public static final String ATTR_CHARACTER_ENCODING = "Character-Encoding";
+  public static final String ATTR_CONTENT_TYPE = "Content-Type";
+  public static final Comparator<PluginEntry> COMPARATOR_BY_NAME = comparing(PluginEntry::getName);
+
+  private static final Map<Object, String> EMPTY_ATTRS = Collections.emptyMap();
+  private static final Optional<Long> NO_SIZE = Optional.empty();
+
+  private final String name;
+  private final long time;
+  private final Optional<Long> size;
+  private final Map<Object, String> attrs;
+
+  public PluginEntry(String name, long time, Optional<Long> size, Map<Object, String> attrs) {
+    this.name = name;
+    this.time = time;
+    this.size = size;
+    this.attrs = attrs;
+  }
+
+  public PluginEntry(String name, long time, Optional<Long> size) {
+    this(name, time, size, EMPTY_ATTRS);
+  }
+
+  public PluginEntry(String name, long time) {
+    this(name, time, NO_SIZE, EMPTY_ATTRS);
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public long getTime() {
+    return time;
+  }
+
+  public Optional<Long> getSize() {
+    return size;
+  }
+
+  public Map<Object, String> getAttrs() {
+    return attrs;
+  }
+}
diff --git a/java/com/google/gerrit/server/plugins/PluginGuiceEnvironment.java b/java/com/google/gerrit/server/plugins/PluginGuiceEnvironment.java
new file mode 100644
index 0000000..ed9d2c7
--- /dev/null
+++ b/java/com/google/gerrit/server/plugins/PluginGuiceEnvironment.java
@@ -0,0 +1,649 @@
+// Copyright (C) 2012 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.google.gerrit.server.plugins;
+
+import static com.google.gerrit.extensions.registration.PrivateInternals_DynamicTypes.dynamicItemsOf;
+import static com.google.gerrit.extensions.registration.PrivateInternals_DynamicTypes.dynamicMapsOf;
+import static com.google.gerrit.extensions.registration.PrivateInternals_DynamicTypes.dynamicSetsOf;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.LinkedListMultimap;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Lists;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.annotations.RootRelative;
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.registration.PrivateInternals_DynamicMapImpl;
+import com.google.gerrit.extensions.registration.PrivateInternals_DynamicTypes;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import com.google.gerrit.extensions.registration.ReloadableRegistrationHandle;
+import com.google.gerrit.extensions.systemstatus.ServerInformation;
+import com.google.gerrit.extensions.webui.WebUiPlugin;
+import com.google.gerrit.index.IndexCollection;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.server.util.PluginRequestContext;
+import com.google.gerrit.server.util.RequestContext;
+import com.google.gerrit.server.util.ThreadLocalRequestContext;
+import com.google.inject.AbstractModule;
+import com.google.inject.Binding;
+import com.google.inject.Guice;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import com.google.inject.Module;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import com.google.inject.TypeLiteral;
+import com.google.inject.internal.UniqueAnnotations;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.ParameterizedType;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArrayList;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Tracks Guice bindings that should be exposed to loaded plugins.
+ *
+ * <p>This is an internal implementation detail of how the main server is able to export its
+ * explicit Guice bindings to tightly coupled plugins, giving them access to singletons and request
+ * scoped resources just like any core code.
+ */
+@Singleton
+public class PluginGuiceEnvironment {
+  private final Injector sysInjector;
+  private final ServerInformation srvInfo;
+  private final ThreadLocalRequestContext local;
+  private final CopyConfigModule copyConfigModule;
+  private final Set<Key<?>> copyConfigKeys;
+  private final List<StartPluginListener> onStart;
+  private final List<StopPluginListener> onStop;
+  private final List<ReloadPluginListener> onReload;
+  private final MetricMaker serverMetrics;
+
+  private Module sysModule;
+  private Module sshModule;
+  private Module httpModule;
+
+  private Provider<ModuleGenerator> sshGen;
+  private Provider<ModuleGenerator> httpGen;
+
+  private Map<TypeLiteral<?>, DynamicItem<?>> sysItems;
+  private Map<TypeLiteral<?>, DynamicItem<?>> sshItems;
+  private Map<TypeLiteral<?>, DynamicItem<?>> httpItems;
+
+  private Map<TypeLiteral<?>, DynamicSet<?>> sysSets;
+  private Map<TypeLiteral<?>, DynamicSet<?>> sshSets;
+  private Map<TypeLiteral<?>, DynamicSet<?>> httpSets;
+
+  private Map<TypeLiteral<?>, DynamicMap<?>> sysMaps;
+  private Map<TypeLiteral<?>, DynamicMap<?>> sshMaps;
+  private Map<TypeLiteral<?>, DynamicMap<?>> httpMaps;
+
+  @Inject
+  PluginGuiceEnvironment(
+      Injector sysInjector,
+      ThreadLocalRequestContext local,
+      ServerInformation srvInfo,
+      CopyConfigModule ccm,
+      MetricMaker serverMetrics) {
+    this.sysInjector = sysInjector;
+    this.srvInfo = srvInfo;
+    this.local = local;
+    this.copyConfigModule = ccm;
+    this.copyConfigKeys = Guice.createInjector(ccm).getAllBindings().keySet();
+    this.serverMetrics = serverMetrics;
+
+    onStart = new CopyOnWriteArrayList<>();
+    onStart.addAll(listeners(sysInjector, StartPluginListener.class));
+
+    onStop = new CopyOnWriteArrayList<>();
+    onStop.addAll(listeners(sysInjector, StopPluginListener.class));
+
+    onReload = new CopyOnWriteArrayList<>();
+    onReload.addAll(listeners(sysInjector, ReloadPluginListener.class));
+
+    sysItems = dynamicItemsOf(sysInjector);
+    sysSets = dynamicSetsOf(sysInjector);
+    sysMaps = dynamicMapsOf(sysInjector);
+  }
+
+  ServerInformation getServerInformation() {
+    return srvInfo;
+  }
+
+  MetricMaker getServerMetrics() {
+    return serverMetrics;
+  }
+
+  boolean hasDynamicItem(TypeLiteral<?> type) {
+    return sysItems.containsKey(type)
+        || (sshItems != null && sshItems.containsKey(type))
+        || (httpItems != null && httpItems.containsKey(type));
+  }
+
+  boolean hasDynamicSet(TypeLiteral<?> type) {
+    return sysSets.containsKey(type)
+        || (sshSets != null && sshSets.containsKey(type))
+        || (httpSets != null && httpSets.containsKey(type));
+  }
+
+  boolean hasDynamicMap(TypeLiteral<?> type) {
+    return sysMaps.containsKey(type)
+        || (sshMaps != null && sshMaps.containsKey(type))
+        || (httpMaps != null && httpMaps.containsKey(type));
+  }
+
+  public Module getSysModule() {
+    return sysModule;
+  }
+
+  public void setDbCfgInjector(Injector dbInjector, Injector cfgInjector) {
+    final Module db = copy(dbInjector);
+    final Module cm = copy(cfgInjector);
+    final Module sm = copy(sysInjector);
+    sysModule =
+        new AbstractModule() {
+          @Override
+          protected void configure() {
+            install(copyConfigModule);
+            install(db);
+            install(cm);
+            install(sm);
+          }
+        };
+  }
+
+  public void setSshInjector(Injector injector) {
+    sshModule = copy(injector);
+    sshGen = injector.getProvider(ModuleGenerator.class);
+    sshItems = dynamicItemsOf(injector);
+    sshSets = dynamicSetsOf(injector);
+    sshMaps = dynamicMapsOf(injector);
+    onStart.addAll(listeners(injector, StartPluginListener.class));
+    onStop.addAll(listeners(injector, StopPluginListener.class));
+    onReload.addAll(listeners(injector, ReloadPluginListener.class));
+  }
+
+  boolean hasSshModule() {
+    return sshModule != null;
+  }
+
+  Module getSshModule() {
+    return sshModule;
+  }
+
+  ModuleGenerator newSshModuleGenerator() {
+    return sshGen.get();
+  }
+
+  public void setHttpInjector(Injector injector) {
+    httpModule = copy(injector);
+    httpGen = injector.getProvider(ModuleGenerator.class);
+    httpItems = dynamicItemsOf(injector);
+    httpSets = httpDynamicSetsOf(injector);
+    httpMaps = dynamicMapsOf(injector);
+    onStart.addAll(listeners(injector, StartPluginListener.class));
+    onStop.addAll(listeners(injector, StopPluginListener.class));
+    onReload.addAll(listeners(injector, ReloadPluginListener.class));
+  }
+
+  private Map<TypeLiteral<?>, DynamicSet<?>> httpDynamicSetsOf(Injector i) {
+    // Copy binding of DynamicSet<WebUiPlugin> from sysInjector to HTTP.
+    // This supports older plugins that bound a plugin in the HttpModule.
+    TypeLiteral<WebUiPlugin> key = TypeLiteral.get(WebUiPlugin.class);
+    DynamicSet<?> web = sysSets.get(key);
+    requireNonNull(web, "DynamicSet<WebUiPlugin> exists in sysInjector");
+
+    Map<TypeLiteral<?>, DynamicSet<?>> m = new HashMap<>(dynamicSetsOf(i));
+    m.put(key, web);
+    return Collections.unmodifiableMap(m);
+  }
+
+  boolean hasHttpModule() {
+    return httpModule != null;
+  }
+
+  Module getHttpModule() {
+    return httpModule;
+  }
+
+  ModuleGenerator newHttpModuleGenerator() {
+    return httpGen.get();
+  }
+
+  public RequestContext enter(Plugin plugin) {
+    return local.setContext(new PluginRequestContext(plugin.getPluginUser()));
+  }
+
+  public void exit(RequestContext old) {
+    local.setContext(old);
+  }
+
+  public void onStartPlugin(Plugin plugin) {
+    RequestContext oldContext = enter(plugin);
+    try {
+      attachItem(sysItems, plugin.getSysInjector(), plugin);
+      attachItem(sshItems, plugin.getSshInjector(), plugin);
+      attachItem(httpItems, plugin.getHttpInjector(), plugin);
+
+      attachSet(sysSets, plugin.getSysInjector(), plugin);
+      attachSet(sshSets, plugin.getSshInjector(), plugin);
+      attachSet(httpSets, plugin.getHttpInjector(), plugin);
+
+      attachMap(sysMaps, plugin.getSysInjector(), plugin);
+      attachMap(sshMaps, plugin.getSshInjector(), plugin);
+      attachMap(httpMaps, plugin.getHttpInjector(), plugin);
+    } finally {
+      exit(oldContext);
+    }
+
+    for (StartPluginListener l : onStart) {
+      l.onStartPlugin(plugin);
+    }
+  }
+
+  public void onStopPlugin(Plugin plugin) {
+    for (StopPluginListener l : onStop) {
+      l.onStopPlugin(plugin);
+    }
+  }
+
+  private void attachItem(
+      Map<TypeLiteral<?>, DynamicItem<?>> items, @Nullable Injector src, Plugin plugin) {
+    for (RegistrationHandle h :
+        PrivateInternals_DynamicTypes.attachItems(src, plugin.getName(), items)) {
+      plugin.add(h);
+    }
+  }
+
+  private void attachSet(
+      Map<TypeLiteral<?>, DynamicSet<?>> sets, @Nullable Injector src, Plugin plugin) {
+    for (RegistrationHandle h :
+        PrivateInternals_DynamicTypes.attachSets(src, plugin.getName(), sets)) {
+      plugin.add(h);
+    }
+  }
+
+  private void attachMap(
+      Map<TypeLiteral<?>, DynamicMap<?>> maps, @Nullable Injector src, Plugin plugin) {
+    for (RegistrationHandle h :
+        PrivateInternals_DynamicTypes.attachMaps(src, plugin.getName(), maps)) {
+      plugin.add(h);
+    }
+  }
+
+  void onReloadPlugin(Plugin oldPlugin, Plugin newPlugin) {
+    // Index all old registrations by the raw type. These may be replaced
+    // during the reattach calls below. Any that are not replaced will be
+    // removed when the old plugin does its stop routine.
+    ListMultimap<TypeLiteral<?>, ReloadableRegistrationHandle<?>> old = LinkedListMultimap.create();
+    for (ReloadableRegistrationHandle<?> h : oldPlugin.getReloadableHandles()) {
+      old.put(h.getKey().getTypeLiteral(), h);
+    }
+
+    RequestContext oldContext = enter(newPlugin);
+    try {
+      reattachMap(old, sysMaps, newPlugin.getSysInjector(), newPlugin);
+      reattachMap(old, sshMaps, newPlugin.getSshInjector(), newPlugin);
+      reattachMap(old, httpMaps, newPlugin.getHttpInjector(), newPlugin);
+
+      reattachSet(old, sysSets, newPlugin.getSysInjector(), newPlugin);
+      reattachSet(old, sshSets, newPlugin.getSshInjector(), newPlugin);
+      reattachSet(old, httpSets, newPlugin.getHttpInjector(), newPlugin);
+
+      reattachItem(old, sysItems, newPlugin.getSysInjector(), newPlugin);
+      reattachItem(old, sshItems, newPlugin.getSshInjector(), newPlugin);
+      reattachItem(old, httpItems, newPlugin.getHttpInjector(), newPlugin);
+    } finally {
+      exit(oldContext);
+    }
+
+    for (ReloadPluginListener l : onReload) {
+      l.onReloadPlugin(oldPlugin, newPlugin);
+    }
+  }
+
+  private void reattachMap(
+      ListMultimap<TypeLiteral<?>, ReloadableRegistrationHandle<?>> oldHandles,
+      Map<TypeLiteral<?>, DynamicMap<?>> maps,
+      @Nullable Injector src,
+      Plugin newPlugin) {
+    if (src == null || maps == null || maps.isEmpty()) {
+      return;
+    }
+
+    for (Map.Entry<TypeLiteral<?>, DynamicMap<?>> e : maps.entrySet()) {
+      @SuppressWarnings("unchecked")
+      TypeLiteral<Object> type = (TypeLiteral<Object>) e.getKey();
+
+      @SuppressWarnings("unchecked")
+      PrivateInternals_DynamicMapImpl<Object> map =
+          (PrivateInternals_DynamicMapImpl<Object>) e.getValue();
+
+      Map<Annotation, ReloadableRegistrationHandle<?>> am = new HashMap<>();
+      for (ReloadableRegistrationHandle<?> h : oldHandles.get(type)) {
+        Annotation a = h.getKey().getAnnotation();
+        if (a != null && !UNIQUE_ANNOTATION.isInstance(a)) {
+          am.put(a, h);
+        }
+      }
+
+      for (Binding<?> binding : bindings(src, e.getKey())) {
+        @SuppressWarnings("unchecked")
+        Binding<Object> b = (Binding<Object>) binding;
+        Key<Object> key = b.getKey();
+        if (key.getAnnotation() == null) {
+          continue;
+        }
+
+        @SuppressWarnings("unchecked")
+        ReloadableRegistrationHandle<Object> h =
+            (ReloadableRegistrationHandle<Object>) am.remove(key.getAnnotation());
+        if (h != null) {
+          replace(newPlugin, h, b);
+          oldHandles.remove(type, h);
+        } else {
+          newPlugin.add(map.put(newPlugin.getName(), b.getKey(), b.getProvider()));
+        }
+      }
+    }
+  }
+
+  /** Type used to declare unique annotations. Guice hides this, so extract it. */
+  private static final Class<?> UNIQUE_ANNOTATION = UniqueAnnotations.create().annotationType();
+
+  private void reattachSet(
+      ListMultimap<TypeLiteral<?>, ReloadableRegistrationHandle<?>> oldHandles,
+      Map<TypeLiteral<?>, DynamicSet<?>> sets,
+      @Nullable Injector src,
+      Plugin newPlugin) {
+    if (src == null || sets == null || sets.isEmpty()) {
+      return;
+    }
+
+    for (Map.Entry<TypeLiteral<?>, DynamicSet<?>> e : sets.entrySet()) {
+      @SuppressWarnings("unchecked")
+      TypeLiteral<Object> type = (TypeLiteral<Object>) e.getKey();
+
+      @SuppressWarnings("unchecked")
+      DynamicSet<Object> set = (DynamicSet<Object>) e.getValue();
+
+      // Index all old handles that match this DynamicSet<T> keyed by
+      // annotations. Ignore the unique annotations, thereby favoring
+      // the @Named annotations or some other non-unique naming.
+      Map<Annotation, ReloadableRegistrationHandle<?>> am = new HashMap<>();
+      List<ReloadableRegistrationHandle<?>> old = oldHandles.get(type);
+      Iterator<ReloadableRegistrationHandle<?>> oi = old.iterator();
+      while (oi.hasNext()) {
+        ReloadableRegistrationHandle<?> h = oi.next();
+        Annotation a = h.getKey().getAnnotation();
+        if (a != null && !UNIQUE_ANNOTATION.isInstance(a)) {
+          am.put(a, h);
+          oi.remove();
+        }
+      }
+
+      // Replace old handles with new bindings, favoring cases where there
+      // is an exact match on an @Named annotation. If there is no match
+      // pick any handle and replace it. We generally expect only one
+      // handle of each DynamicSet type when using unique annotations, but
+      // possibly multiple ones if @Named was used. Plugin authors that want
+      // atomic replacement across reloads should use @Named annotations with
+      // stable names that do not change across plugin versions to ensure the
+      // handles are swapped correctly.
+      oi = old.iterator();
+      for (Binding<?> binding : bindings(src, type)) {
+        @SuppressWarnings("unchecked")
+        Binding<Object> b = (Binding<Object>) binding;
+        Key<Object> key = b.getKey();
+        if (key.getAnnotation() == null) {
+          continue;
+        }
+
+        @SuppressWarnings("unchecked")
+        ReloadableRegistrationHandle<Object> h1 =
+            (ReloadableRegistrationHandle<Object>) am.remove(key.getAnnotation());
+        if (h1 != null) {
+          replace(newPlugin, h1, b);
+        } else if (oi.hasNext()) {
+          @SuppressWarnings("unchecked")
+          ReloadableRegistrationHandle<Object> h2 =
+              (ReloadableRegistrationHandle<Object>) oi.next();
+          oi.remove();
+          replace(newPlugin, h2, b);
+        } else {
+          newPlugin.add(set.add(newPlugin.getName(), b.getKey(), b.getProvider()));
+        }
+      }
+    }
+  }
+
+  private void reattachItem(
+      ListMultimap<TypeLiteral<?>, ReloadableRegistrationHandle<?>> oldHandles,
+      Map<TypeLiteral<?>, DynamicItem<?>> items,
+      @Nullable Injector src,
+      Plugin newPlugin) {
+    if (src == null || items == null || items.isEmpty()) {
+      return;
+    }
+
+    for (Map.Entry<TypeLiteral<?>, DynamicItem<?>> e : items.entrySet()) {
+      @SuppressWarnings("unchecked")
+      TypeLiteral<Object> type = (TypeLiteral<Object>) e.getKey();
+
+      @SuppressWarnings("unchecked")
+      DynamicItem<Object> item = (DynamicItem<Object>) e.getValue();
+
+      Iterator<ReloadableRegistrationHandle<?>> oi = oldHandles.get(type).iterator();
+
+      for (Binding<?> binding : bindings(src, type)) {
+        @SuppressWarnings("unchecked")
+        Binding<Object> b = (Binding<Object>) binding;
+        if (oi.hasNext()) {
+          @SuppressWarnings("unchecked")
+          ReloadableRegistrationHandle<Object> h = (ReloadableRegistrationHandle<Object>) oi.next();
+          oi.remove();
+          replace(newPlugin, h, b);
+        } else {
+          newPlugin.add(item.set(b.getKey(), b.getProvider(), newPlugin.getName()));
+        }
+      }
+    }
+  }
+
+  private static <T> void replace(
+      Plugin newPlugin, ReloadableRegistrationHandle<T> h, Binding<T> b) {
+    RegistrationHandle n = h.replace(b.getKey(), b.getProvider());
+    if (n != null) {
+      newPlugin.add(n);
+    }
+  }
+
+  static <T> List<T> listeners(Injector src, Class<T> type) {
+    List<Binding<T>> bindings = bindings(src, TypeLiteral.get(type));
+    int cnt = bindings != null ? bindings.size() : 0;
+    List<T> found = Lists.newArrayListWithCapacity(cnt);
+    if (bindings != null) {
+      for (Binding<T> b : bindings) {
+        found.add(b.getProvider().get());
+      }
+    }
+    return found;
+  }
+
+  private static <T> List<Binding<T>> bindings(Injector src, TypeLiteral<T> type) {
+    return src.findBindingsByType(type);
+  }
+
+  private Module copy(Injector src) {
+    Set<TypeLiteral<?>> dynamicTypes = new HashSet<>();
+    Set<TypeLiteral<?>> dynamicItemTypes = new HashSet<>();
+    for (Map.Entry<Key<?>, Binding<?>> e : src.getBindings().entrySet()) {
+      TypeLiteral<?> type = e.getKey().getTypeLiteral();
+      if (type.getRawType() == DynamicItem.class) {
+        ParameterizedType t = (ParameterizedType) type.getType();
+        dynamicItemTypes.add(TypeLiteral.get(t.getActualTypeArguments()[0]));
+      } else if (type.getRawType() == DynamicSet.class || type.getRawType() == DynamicMap.class) {
+        ParameterizedType t = (ParameterizedType) type.getType();
+        dynamicTypes.add(TypeLiteral.get(t.getActualTypeArguments()[0]));
+      }
+    }
+
+    final Map<Key<?>, Binding<?>> bindings = new LinkedHashMap<>();
+    for (Map.Entry<Key<?>, Binding<?>> e : src.getBindings().entrySet()) {
+      if (dynamicTypes.contains(e.getKey().getTypeLiteral())
+          && e.getKey().getAnnotation() != null) {
+        // A type used in DynamicSet or DynamicMap that has an annotation
+        // must be picked up by the set/map itself. A type used in either
+        // but without an annotation may be magic glue implementing F and
+        // using DynamicSet<F> or DynamicMap<F> internally. That should be
+        // exported to plugins.
+        continue;
+      } else if (dynamicItemTypes.contains(e.getKey().getTypeLiteral())) {
+        continue;
+      } else if (shouldCopy(e.getKey())) {
+        bindings.put(e.getKey(), e.getValue());
+      }
+    }
+    bindings.remove(Key.get(Injector.class));
+    bindings.remove(Key.get(java.util.logging.Logger.class));
+
+    @Nullable
+    final Binding<HttpServletRequest> requestBinding =
+        src.getExistingBinding(Key.get(HttpServletRequest.class));
+
+    @Nullable
+    final Binding<HttpServletResponse> responseBinding =
+        src.getExistingBinding(Key.get(HttpServletResponse.class));
+
+    return new AbstractModule() {
+      @SuppressWarnings("unchecked")
+      @Override
+      protected void configure() {
+        for (Map.Entry<Key<?>, Binding<?>> e : bindings.entrySet()) {
+          Key<Object> k = (Key<Object>) e.getKey();
+          Binding<Object> b = (Binding<Object>) e.getValue();
+          bind(k).toProvider(b.getProvider());
+        }
+
+        if (requestBinding != null) {
+          bind(HttpServletRequest.class)
+              .annotatedWith(RootRelative.class)
+              .toProvider(requestBinding.getProvider());
+        }
+        if (responseBinding != null) {
+          bind(HttpServletResponse.class)
+              .annotatedWith(RootRelative.class)
+              .toProvider(responseBinding.getProvider());
+        }
+      }
+    };
+  }
+
+  private boolean shouldCopy(Key<?> key) {
+    if (copyConfigKeys.contains(key)) {
+      return false;
+    }
+    Class<?> type = key.getTypeLiteral().getRawType();
+    if (LifecycleListener.class.isAssignableFrom(type)
+        // This is needed for secondary index to work from plugin listeners
+        && !IndexCollection.class.isAssignableFrom(type)) {
+      return false;
+    }
+    if (StartPluginListener.class.isAssignableFrom(type)) {
+      return false;
+    }
+    if (StopPluginListener.class.isAssignableFrom(type)) {
+      return false;
+    }
+    if (MetricMaker.class.isAssignableFrom(type)) {
+      return false;
+    }
+
+    if (type.getName().startsWith("com.google.inject.")) {
+      return false;
+    }
+
+    if (is("org.apache.sshd.server.Command", type)) {
+      return false;
+    }
+
+    if (is("javax.servlet.Filter", type)) {
+      return false;
+    }
+    if (is("javax.servlet.ServletContext", type)) {
+      return false;
+    }
+    if (is("javax.servlet.ServletRequest", type)) {
+      return false;
+    }
+    if (is("javax.servlet.ServletResponse", type)) {
+      return false;
+    }
+    if (is("javax.servlet.http.HttpServlet", type)) {
+      return false;
+    }
+    if (is("javax.servlet.http.HttpServletRequest", type)) {
+      return false;
+    }
+    if (is("javax.servlet.http.HttpServletResponse", type)) {
+      return false;
+    }
+    if (is("javax.servlet.http.HttpSession", type)) {
+      return false;
+    }
+    if (Map.class.isAssignableFrom(type)
+        && key.getAnnotationType() != null
+        && "com.google.inject.servlet.RequestParameters"
+            .equals(key.getAnnotationType().getName())) {
+      return false;
+    }
+    if (type.getName().startsWith("com.google.gerrit.httpd.GitOverHttpServlet$")) {
+      return false;
+    }
+    return true;
+  }
+
+  static boolean is(String name, Class<?> type) {
+    while (type != null) {
+      if (name.equals(type.getName())) {
+        return true;
+      }
+
+      Class<?>[] interfaces = type.getInterfaces();
+      if (interfaces != null) {
+        for (Class<?> i : interfaces) {
+          if (is(name, i)) {
+            return true;
+          }
+        }
+      }
+
+      type = type.getSuperclass();
+    }
+    return false;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginInstallException.java b/java/com/google/gerrit/server/plugins/PluginInstallException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginInstallException.java
rename to java/com/google/gerrit/server/plugins/PluginInstallException.java
diff --git a/java/com/google/gerrit/server/plugins/PluginLoader.java b/java/com/google/gerrit/server/plugins/PluginLoader.java
new file mode 100644
index 0000000..57e7e49
--- /dev/null
+++ b/java/com/google/gerrit/server/plugins/PluginLoader.java
@@ -0,0 +1,732 @@
+// Copyright (C) 2012 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.google.gerrit.server.plugins;
+
+import com.google.common.base.CharMatcher;
+import com.google.common.base.Joiner;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
+import com.google.common.collect.ComparisonChain;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.LinkedHashMultimap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.SetMultimap;
+import com.google.common.collect.Sets;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.systemstatus.ServerInformation;
+import com.google.gerrit.server.PluginUser;
+import com.google.gerrit.server.cache.PersistentCacheFactory;
+import com.google.gerrit.server.config.CanonicalWebUrl;
+import com.google.gerrit.server.config.ConfigUtil;
+import com.google.gerrit.server.config.GerritRuntime;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.plugins.ServerPluginProvider.PluginDescription;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.DirectoryStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.AbstractMap;
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Queue;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.internal.storage.file.FileSnapshot;
+import org.eclipse.jgit.lib.Config;
+
+@Singleton
+public class PluginLoader implements LifecycleListener {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public String getPluginName(Path srcPath) {
+    return MoreObjects.firstNonNull(getGerritPluginName(srcPath), PluginUtil.nameOf(srcPath));
+  }
+
+  private final Path pluginsDir;
+  private final Path dataDir;
+  private final Path tempDir;
+  private final PluginGuiceEnvironment env;
+  private final ServerInformationImpl srvInfoImpl;
+  private final PluginUser.Factory pluginUserFactory;
+  private final ConcurrentMap<String, Plugin> running = Maps.newConcurrentMap();
+  private final ConcurrentMap<String, Plugin> disabled = Maps.newConcurrentMap();
+  private final Map<String, FileSnapshot> broken = Maps.newHashMap();
+  private final Map<Plugin, CleanupHandle> cleanupHandles = Maps.newConcurrentMap();
+  private final Queue<Plugin> toCleanup = new ArrayDeque<>();
+  private final Provider<PluginCleanerTask> cleaner;
+  private final PluginScannerThread scanner;
+  private final Provider<String> urlProvider;
+  private final PersistentCacheFactory persistentCacheFactory;
+  private final boolean remoteAdmin;
+  private final UniversalServerPluginProvider serverPluginFactory;
+  private final GerritRuntime gerritRuntime;
+
+  @Inject
+  public PluginLoader(
+      SitePaths sitePaths,
+      PluginGuiceEnvironment pe,
+      ServerInformationImpl sii,
+      PluginUser.Factory puf,
+      Provider<PluginCleanerTask> pct,
+      @GerritServerConfig Config cfg,
+      @CanonicalWebUrl Provider<String> provider,
+      PersistentCacheFactory cacheFactory,
+      UniversalServerPluginProvider pluginFactory,
+      GerritRuntime gerritRuntime) {
+    pluginsDir = sitePaths.plugins_dir;
+    dataDir = sitePaths.data_dir;
+    tempDir = sitePaths.tmp_dir;
+    env = pe;
+    srvInfoImpl = sii;
+    pluginUserFactory = puf;
+    cleaner = pct;
+    urlProvider = provider;
+    persistentCacheFactory = cacheFactory;
+    serverPluginFactory = pluginFactory;
+
+    remoteAdmin = cfg.getBoolean("plugins", null, "allowRemoteAdmin", false);
+    this.gerritRuntime = gerritRuntime;
+
+    long checkFrequency =
+        ConfigUtil.getTimeUnit(
+            cfg,
+            "plugins",
+            null,
+            "checkFrequency",
+            TimeUnit.MINUTES.toMillis(1),
+            TimeUnit.MILLISECONDS);
+    if (checkFrequency > 0) {
+      scanner = new PluginScannerThread(this, checkFrequency);
+    } else {
+      scanner = null;
+    }
+  }
+
+  public boolean isRemoteAdminEnabled() {
+    return remoteAdmin;
+  }
+
+  public void checkRemoteAdminEnabled() throws MethodNotAllowedException {
+    if (!remoteAdmin) {
+      throw new MethodNotAllowedException("remote plugin administration is disabled");
+    }
+  }
+
+  public Plugin get(String name) {
+    Plugin p = running.get(name);
+    if (p != null) {
+      return p;
+    }
+    return disabled.get(name);
+  }
+
+  public Iterable<Plugin> getPlugins(boolean all) {
+    if (!all) {
+      return running.values();
+    }
+    List<Plugin> plugins = new ArrayList<>(running.values());
+    plugins.addAll(disabled.values());
+    return plugins;
+  }
+
+  public String installPluginFromStream(String originalName, InputStream in)
+      throws IOException, PluginInstallException {
+    checkRemoteInstall();
+
+    String fileName = originalName;
+    Path tmp = PluginUtil.asTemp(in, ".next_" + fileName + "_", ".tmp", pluginsDir);
+    String name = MoreObjects.firstNonNull(getGerritPluginName(tmp), PluginUtil.nameOf(fileName));
+    if (!originalName.equals(name)) {
+      logger.atWarning().log(
+          "Plugin provides its own name: <%s>, use it instead of the input name: <%s>",
+          name, originalName);
+    }
+
+    String fileExtension = getExtension(fileName);
+    Path dst = pluginsDir.resolve(name + fileExtension);
+    synchronized (this) {
+      Plugin active = running.get(name);
+      if (active != null) {
+        fileName = active.getSrcFile().getFileName().toString();
+        logger.atInfo().log("Replacing plugin %s", active.getName());
+        Path old = pluginsDir.resolve(".last_" + fileName);
+        Files.deleteIfExists(old);
+        Files.move(active.getSrcFile(), old);
+      }
+
+      Files.deleteIfExists(pluginsDir.resolve(fileName + ".disabled"));
+      Files.move(tmp, dst);
+      try {
+        Plugin plugin = runPlugin(name, dst, active);
+        if (active == null) {
+          logger.atInfo().log("Installed plugin %s", plugin.getName());
+        }
+      } catch (PluginInstallException e) {
+        Files.deleteIfExists(dst);
+        throw e;
+      }
+
+      cleanInBackground();
+    }
+
+    return name;
+  }
+
+  private synchronized void unloadPlugin(Plugin plugin) {
+    persistentCacheFactory.onStop(plugin.getName());
+    String name = plugin.getName();
+    logger.atInfo().log("Unloading plugin %s, version %s", name, plugin.getVersion());
+    plugin.stop(env);
+    env.onStopPlugin(plugin);
+    running.remove(name);
+    disabled.remove(name);
+    toCleanup.add(plugin);
+  }
+
+  public void disablePlugins(Set<String> names) {
+    if (!isRemoteAdminEnabled()) {
+      logger.atWarning().log(
+          "Remote plugin administration is disabled, ignoring disablePlugins(%s)", names);
+      return;
+    }
+
+    synchronized (this) {
+      for (String name : names) {
+        Plugin active = running.get(name);
+        if (active == null) {
+          continue;
+        }
+
+        logger.atInfo().log("Disabling plugin %s", active.getName());
+        Path off =
+            active.getSrcFile().resolveSibling(active.getSrcFile().getFileName() + ".disabled");
+        try {
+          Files.move(active.getSrcFile(), off);
+        } catch (IOException e) {
+          logger.atSevere().withCause(e).log("Failed to disable plugin");
+          // In theory we could still unload the plugin even if the rename
+          // failed. However, it would be reloaded on the next server startup,
+          // which is probably not what the user expects.
+          continue;
+        }
+
+        unloadPlugin(active);
+        try {
+          FileSnapshot snapshot = FileSnapshot.save(off.toFile());
+          Plugin offPlugin = loadPlugin(name, off, snapshot);
+          disabled.put(name, offPlugin);
+        } catch (Throwable e) {
+          // This shouldn't happen, as the plugin was loaded earlier.
+          logger.atWarning().withCause(e.getCause()).log(
+              "Cannot load disabled plugin %s", active.getName());
+        }
+      }
+      cleanInBackground();
+    }
+  }
+
+  public void enablePlugins(Set<String> names) throws PluginInstallException {
+    if (!isRemoteAdminEnabled()) {
+      logger.atWarning().log(
+          "Remote plugin administration is disabled, ignoring enablePlugins(%s)", names);
+      return;
+    }
+
+    synchronized (this) {
+      for (String name : names) {
+        Plugin off = disabled.get(name);
+        if (off == null) {
+          continue;
+        }
+
+        logger.atInfo().log("Enabling plugin %s", name);
+        String n = off.getSrcFile().toFile().getName();
+        if (n.endsWith(".disabled")) {
+          n = n.substring(0, n.lastIndexOf('.'));
+        }
+        Path on = pluginsDir.resolve(n);
+        try {
+          Files.move(off.getSrcFile(), on);
+        } catch (IOException e) {
+          logger.atSevere().withCause(e).log("Failed to move plugin %s into place", name);
+          continue;
+        }
+        disabled.remove(name);
+        runPlugin(name, on, null);
+      }
+      cleanInBackground();
+    }
+  }
+
+  private void removeStalePluginFiles() {
+    DirectoryStream.Filter<Path> filter =
+        new DirectoryStream.Filter<Path>() {
+          @Override
+          public boolean accept(Path entry) throws IOException {
+            return entry.getFileName().toString().startsWith("plugin_");
+          }
+        };
+    try (DirectoryStream<Path> files = Files.newDirectoryStream(tempDir, filter)) {
+      for (Path file : files) {
+        logger.atInfo().log("Removing stale plugin file: %s", file.toFile().getName());
+        try {
+          Files.delete(file);
+        } catch (IOException e) {
+          logger.atSevere().log(
+              "Failed to remove stale plugin file %s: %s", file.toFile().getName(), e.getMessage());
+        }
+      }
+    } catch (IOException e) {
+      logger.atWarning().log("Unable to discover stale plugin files: %s", e.getMessage());
+    }
+  }
+
+  @Override
+  public synchronized void start() {
+    removeStalePluginFiles();
+    Path absolutePath = pluginsDir.toAbsolutePath();
+    if (!Files.exists(absolutePath)) {
+      logger.atInfo().log("%s does not exist; creating", absolutePath);
+      try {
+        Files.createDirectories(absolutePath);
+      } catch (IOException e) {
+        logger.atSevere().log("Failed to create %s: %s", absolutePath, e.getMessage());
+      }
+    }
+    logger.atInfo().log("Loading plugins from %s", absolutePath);
+    srvInfoImpl.state = ServerInformation.State.STARTUP;
+    rescan();
+    srvInfoImpl.state = ServerInformation.State.RUNNING;
+    if (scanner != null) {
+      scanner.start();
+    }
+  }
+
+  @Override
+  public void stop() {
+    if (scanner != null) {
+      scanner.end();
+    }
+    srvInfoImpl.state = ServerInformation.State.SHUTDOWN;
+    synchronized (this) {
+      for (Plugin p : running.values()) {
+        unloadPlugin(p);
+      }
+      running.clear();
+      disabled.clear();
+      broken.clear();
+      if (!toCleanup.isEmpty()) {
+        System.gc();
+        processPendingCleanups();
+      }
+    }
+  }
+
+  public void reload(List<String> names) throws InvalidPluginException, PluginInstallException {
+    synchronized (this) {
+      List<Plugin> reload = Lists.newArrayListWithCapacity(names.size());
+      List<String> bad = Lists.newArrayListWithExpectedSize(4);
+      for (String name : names) {
+        Plugin active = running.get(name);
+        if (active != null) {
+          reload.add(active);
+        } else {
+          bad.add(name);
+        }
+      }
+      if (!bad.isEmpty()) {
+        throw new InvalidPluginException(
+            String.format("Plugin(s) \"%s\" not running", Joiner.on("\", \"").join(bad)));
+      }
+
+      for (Plugin active : reload) {
+        String name = active.getName();
+        try {
+          logger.atInfo().log("Reloading plugin %s", name);
+          Plugin newPlugin = runPlugin(name, active.getSrcFile(), active);
+          logger.atInfo().log(
+              "Reloaded plugin %s, version %s", newPlugin.getName(), newPlugin.getVersion());
+        } catch (PluginInstallException e) {
+          logger.atWarning().withCause(e.getCause()).log("Cannot reload plugin %s", name);
+          throw e;
+        }
+      }
+
+      cleanInBackground();
+    }
+  }
+
+  public synchronized void rescan() {
+    SetMultimap<String, Path> pluginsFiles = prunePlugins(pluginsDir);
+    if (pluginsFiles.isEmpty()) {
+      return;
+    }
+
+    syncDisabledPlugins(pluginsFiles);
+
+    Map<String, Path> activePlugins = filterDisabled(pluginsFiles);
+    for (Map.Entry<String, Path> entry : jarsFirstSortedPluginsSet(activePlugins)) {
+      String name = entry.getKey();
+      Path path = entry.getValue();
+      String fileName = path.getFileName().toString();
+      if (!isUiPlugin(fileName) && !serverPluginFactory.handles(path)) {
+        logger.atWarning().log(
+            "No Plugin provider was found that handles this file format: %s", fileName);
+        continue;
+      }
+
+      FileSnapshot brokenTime = broken.get(name);
+      if (brokenTime != null && !brokenTime.isModified(path.toFile())) {
+        continue;
+      }
+
+      Plugin active = running.get(name);
+      if (active != null && !active.isModified(path)) {
+        continue;
+      }
+
+      if (active != null) {
+        logger.atInfo().log("Reloading plugin %s", active.getName());
+      }
+
+      try {
+        Plugin loadedPlugin = runPlugin(name, path, active);
+        if (!loadedPlugin.isDisabled()) {
+          logger.atInfo().log(
+              "%s plugin %s, version %s",
+              active == null ? "Loaded" : "Reloaded",
+              loadedPlugin.getName(),
+              loadedPlugin.getVersion());
+        }
+      } catch (PluginInstallException e) {
+        logger.atWarning().withCause(e.getCause()).log("Cannot load plugin %s", name);
+      }
+    }
+
+    cleanInBackground();
+  }
+
+  private void addAllEntries(Map<String, Path> from, TreeSet<Entry<String, Path>> to) {
+    Iterator<Entry<String, Path>> it = from.entrySet().iterator();
+    while (it.hasNext()) {
+      Entry<String, Path> entry = it.next();
+      to.add(new AbstractMap.SimpleImmutableEntry<>(entry.getKey(), entry.getValue()));
+    }
+  }
+
+  private TreeSet<Entry<String, Path>> jarsFirstSortedPluginsSet(Map<String, Path> activePlugins) {
+    TreeSet<Entry<String, Path>> sortedPlugins =
+        Sets.newTreeSet(
+            new Comparator<Entry<String, Path>>() {
+              @Override
+              public int compare(Entry<String, Path> e1, Entry<String, Path> e2) {
+                Path n1 = e1.getValue().getFileName();
+                Path n2 = e2.getValue().getFileName();
+                return ComparisonChain.start()
+                    .compareTrueFirst(isJar(n1), isJar(n2))
+                    .compare(n1, n2)
+                    .result();
+              }
+
+              private boolean isJar(Path n1) {
+                return n1.toString().endsWith(".jar");
+              }
+            });
+
+    addAllEntries(activePlugins, sortedPlugins);
+    return sortedPlugins;
+  }
+
+  private void syncDisabledPlugins(SetMultimap<String, Path> jars) {
+    stopRemovedPlugins(jars);
+    dropRemovedDisabledPlugins(jars);
+  }
+
+  private Plugin runPlugin(String name, Path plugin, Plugin oldPlugin)
+      throws PluginInstallException {
+    FileSnapshot snapshot = FileSnapshot.save(plugin.toFile());
+    try {
+      Plugin newPlugin = loadPlugin(name, plugin, snapshot);
+      if (newPlugin.getCleanupHandle() != null) {
+        cleanupHandles.put(newPlugin, newPlugin.getCleanupHandle());
+      }
+      /*
+       * Pluggable plugin provider may have assigned a plugin name that could be
+       * actually different from the initial one assigned during scan. It is
+       * safer then to reassign it.
+       */
+      name = newPlugin.getName();
+      boolean reload = oldPlugin != null && oldPlugin.canReload() && newPlugin.canReload();
+      if (!reload && oldPlugin != null) {
+        unloadPlugin(oldPlugin);
+      }
+      if (!newPlugin.isDisabled()) {
+        try {
+          newPlugin.start(env);
+        } catch (Throwable e) {
+          newPlugin.stop(env);
+          throw e;
+        }
+      }
+      if (reload) {
+        env.onReloadPlugin(oldPlugin, newPlugin);
+        unloadPlugin(oldPlugin);
+      } else if (!newPlugin.isDisabled()) {
+        env.onStartPlugin(newPlugin);
+      }
+      if (!newPlugin.isDisabled()) {
+        running.put(name, newPlugin);
+      } else {
+        disabled.put(name, newPlugin);
+      }
+      broken.remove(name);
+      return newPlugin;
+    } catch (Throwable err) {
+      broken.put(name, snapshot);
+      throw new PluginInstallException(err);
+    }
+  }
+
+  private void stopRemovedPlugins(SetMultimap<String, Path> jars) {
+    Set<String> unload = Sets.newHashSet(running.keySet());
+    for (Map.Entry<String, Collection<Path>> entry : jars.asMap().entrySet()) {
+      for (Path path : entry.getValue()) {
+        if (!path.getFileName().toString().endsWith(".disabled")) {
+          unload.remove(entry.getKey());
+        }
+      }
+    }
+    for (String name : unload) {
+      unloadPlugin(running.get(name));
+    }
+  }
+
+  private void dropRemovedDisabledPlugins(SetMultimap<String, Path> jars) {
+    Set<String> unload = Sets.newHashSet(disabled.keySet());
+    for (Map.Entry<String, Collection<Path>> entry : jars.asMap().entrySet()) {
+      for (Path path : entry.getValue()) {
+        if (path.getFileName().toString().endsWith(".disabled")) {
+          unload.remove(entry.getKey());
+        }
+      }
+    }
+    for (String name : unload) {
+      disabled.remove(name);
+    }
+  }
+
+  synchronized int processPendingCleanups() {
+    Iterator<Plugin> iterator = toCleanup.iterator();
+    while (iterator.hasNext()) {
+      Plugin plugin = iterator.next();
+      iterator.remove();
+
+      CleanupHandle cleanupHandle = cleanupHandles.remove(plugin);
+      if (cleanupHandle != null) {
+        cleanupHandle.cleanup();
+      }
+    }
+    return toCleanup.size();
+  }
+
+  private void cleanInBackground() {
+    int cnt = toCleanup.size();
+    if (0 < cnt) {
+      cleaner.get().clean(cnt);
+    }
+  }
+
+  private String getExtension(String name) {
+    int ext = name.lastIndexOf('.');
+    return 0 < ext ? name.substring(ext) : "";
+  }
+
+  private Plugin loadPlugin(String name, Path srcPlugin, FileSnapshot snapshot)
+      throws InvalidPluginException {
+    String pluginName = srcPlugin.getFileName().toString();
+    if (isUiPlugin(pluginName)) {
+      return loadJsPlugin(name, srcPlugin, snapshot);
+    } else if (serverPluginFactory.handles(srcPlugin)) {
+      return loadServerPlugin(srcPlugin, snapshot);
+    } else {
+      throw new InvalidPluginException(
+          String.format("Unsupported plugin type: %s", srcPlugin.getFileName()));
+    }
+  }
+
+  private Path getPluginDataDir(String name) {
+    return dataDir.resolve(name);
+  }
+
+  private String getPluginCanonicalWebUrl(String name) {
+    String canonicalWebUrl = urlProvider.get();
+    if (Strings.isNullOrEmpty(canonicalWebUrl)) {
+      return "/plugins/" + name;
+    }
+
+    String url =
+        String.format(
+            "%s/plugins/%s/", CharMatcher.is('/').trimTrailingFrom(canonicalWebUrl), name);
+    return url;
+  }
+
+  private Plugin loadJsPlugin(String name, Path srcJar, FileSnapshot snapshot) {
+    return new JsPlugin(name, srcJar, pluginUserFactory.create(name), snapshot);
+  }
+
+  private ServerPlugin loadServerPlugin(Path scriptFile, FileSnapshot snapshot)
+      throws InvalidPluginException {
+    String name = serverPluginFactory.getPluginName(scriptFile);
+    return serverPluginFactory.get(
+        scriptFile,
+        snapshot,
+        new PluginDescription(
+            pluginUserFactory.create(name),
+            getPluginCanonicalWebUrl(name),
+            getPluginDataDir(name),
+            gerritRuntime));
+  }
+
+  // Only one active plugin per plugin name can exist for each plugin name.
+  // Filter out disabled plugins and transform the multimap to a map
+  private Map<String, Path> filterDisabled(SetMultimap<String, Path> pluginPaths) {
+    Map<String, Path> activePlugins = Maps.newHashMapWithExpectedSize(pluginPaths.keys().size());
+    for (String name : pluginPaths.keys()) {
+      for (Path pluginPath : pluginPaths.asMap().get(name)) {
+        if (!pluginPath.getFileName().toString().endsWith(".disabled")) {
+          assert !activePlugins.containsKey(name);
+          activePlugins.put(name, pluginPath);
+        }
+      }
+    }
+    return activePlugins;
+  }
+
+  // Scan the $site_path/plugins directory and fetch all files and directories.
+  // The Key in returned multimap is the plugin name initially assigned from its filename.
+  // Values are the files. Plugins can optionally provide their name in MANIFEST file.
+  // If multiple plugin files provide the same plugin name, then only
+  // the first plugin remains active and all other plugins with the same
+  // name are disabled.
+  //
+  // NOTE: Bear in mind that the plugin name can be reassigned after load by the
+  //       Server plugin provider.
+  public SetMultimap<String, Path> prunePlugins(Path pluginsDir) {
+    List<Path> pluginPaths = scanPathsInPluginsDirectory(pluginsDir);
+    SetMultimap<String, Path> map;
+    map = asMultimap(pluginPaths);
+    for (String plugin : map.keySet()) {
+      Collection<Path> files = map.asMap().get(plugin);
+      if (files.size() == 1) {
+        continue;
+      }
+      // retrieve enabled plugins
+      Iterable<Path> enabled = filterDisabledPlugins(files);
+      // If we have only one (the winner) plugin, nothing to do
+      if (!Iterables.skip(enabled, 1).iterator().hasNext()) {
+        continue;
+      }
+      Path winner = Iterables.getFirst(enabled, null);
+      assert winner != null;
+      // Disable all loser plugins by renaming their file names to
+      // "file.disabled" and replace the disabled files in the multimap.
+      Collection<Path> elementsToRemove = new ArrayList<>();
+      Collection<Path> elementsToAdd = new ArrayList<>();
+      for (Path loser : Iterables.skip(enabled, 1)) {
+        logger.atWarning().log(
+            "Plugin <%s> was disabled, because"
+                + " another plugin <%s>"
+                + " with the same name <%s> already exists",
+            loser, winner, plugin);
+        Path disabledPlugin = Paths.get(loser + ".disabled");
+        elementsToAdd.add(disabledPlugin);
+        elementsToRemove.add(loser);
+        try {
+          Files.move(loser, disabledPlugin);
+        } catch (IOException e) {
+          logger.atWarning().withCause(e).log("Failed to fully disable plugin %s", loser);
+        }
+      }
+      Iterables.removeAll(files, elementsToRemove);
+      Iterables.addAll(files, elementsToAdd);
+    }
+    return map;
+  }
+
+  private List<Path> scanPathsInPluginsDirectory(Path pluginsDir) {
+    try {
+      return PluginUtil.listPlugins(pluginsDir);
+    } catch (IOException e) {
+      logger.atSevere().withCause(e).log("Cannot list %s", pluginsDir.toAbsolutePath());
+      return ImmutableList.of();
+    }
+  }
+
+  private Iterable<Path> filterDisabledPlugins(Collection<Path> paths) {
+    return Iterables.filter(paths, p -> !p.getFileName().toString().endsWith(".disabled"));
+  }
+
+  public String getGerritPluginName(Path srcPath) {
+    String fileName = srcPath.getFileName().toString();
+    if (isUiPlugin(fileName)) {
+      return fileName.substring(0, fileName.lastIndexOf('.'));
+    }
+    if (serverPluginFactory.handles(srcPath)) {
+      return serverPluginFactory.getPluginName(srcPath);
+    }
+    return null;
+  }
+
+  private SetMultimap<String, Path> asMultimap(List<Path> plugins) {
+    SetMultimap<String, Path> map = LinkedHashMultimap.create();
+    for (Path srcPath : plugins) {
+      map.put(getPluginName(srcPath), srcPath);
+    }
+    return map;
+  }
+
+  private boolean isUiPlugin(String name) {
+    return isPlugin(name, "js") || isPlugin(name, "html");
+  }
+
+  private boolean isPlugin(String fileName, String ext) {
+    String fullExt = "." + ext;
+    return fileName.endsWith(fullExt) || fileName.endsWith(fullExt + ".disabled");
+  }
+
+  private void checkRemoteInstall() throws PluginInstallException {
+    if (!isRemoteAdminEnabled()) {
+      throw new PluginInstallException("remote installation is disabled");
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginMetricMaker.java b/java/com/google/gerrit/server/plugins/PluginMetricMaker.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginMetricMaker.java
rename to java/com/google/gerrit/server/plugins/PluginMetricMaker.java
diff --git a/java/com/google/gerrit/server/plugins/PluginModule.java b/java/com/google/gerrit/server/plugins/PluginModule.java
new file mode 100644
index 0000000..6bc37bd
--- /dev/null
+++ b/java/com/google/gerrit/server/plugins/PluginModule.java
@@ -0,0 +1,42 @@
+// Copyright (C) 2012 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.google.gerrit.server.plugins;
+
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.systemstatus.ServerInformation;
+import com.google.gerrit.lifecycle.LifecycleModule;
+import com.google.gerrit.server.PluginUser;
+import com.google.gerrit.server.config.GerritRuntime;
+
+public class PluginModule extends LifecycleModule {
+  @Override
+  protected void configure() {
+    requireBinding(GerritRuntime.class);
+
+    factory(PluginUser.Factory.class);
+    bind(ServerInformationImpl.class);
+    bind(ServerInformation.class).to(ServerInformationImpl.class);
+
+    bind(PluginCleanerTask.class);
+    bind(PluginGuiceEnvironment.class);
+    bind(PluginLoader.class);
+    bind(CopyConfigModule.class);
+    listener().to(PluginLoader.class);
+
+    DynamicSet.setOf(binder(), ServerPluginProvider.class);
+    DynamicSet.bind(binder(), ServerPluginProvider.class).to(JarPluginProvider.class);
+    bind(UniversalServerPluginProvider.class);
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginResource.java b/java/com/google/gerrit/server/plugins/PluginResource.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginResource.java
rename to java/com/google/gerrit/server/plugins/PluginResource.java
diff --git a/java/com/google/gerrit/server/plugins/PluginRestApiModule.java b/java/com/google/gerrit/server/plugins/PluginRestApiModule.java
new file mode 100644
index 0000000..8dbea78
--- /dev/null
+++ b/java/com/google/gerrit/server/plugins/PluginRestApiModule.java
@@ -0,0 +1,38 @@
+// Copyright (C) 2013 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.google.gerrit.server.plugins;
+
+import static com.google.gerrit.server.plugins.PluginResource.PLUGIN_KIND;
+
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.RestApiModule;
+import com.google.gerrit.server.PluginUser;
+import com.google.inject.Key;
+
+public class PluginRestApiModule extends RestApiModule {
+  @Override
+  protected void configure() {
+    requireBinding(Key.get(PluginUser.Factory.class));
+    bind(PluginsCollection.class);
+    DynamicMap.mapOf(binder(), PLUGIN_KIND);
+    create(PLUGIN_KIND).to(InstallPlugin.Create.class);
+    put(PLUGIN_KIND).to(InstallPlugin.Overwrite.class);
+    delete(PLUGIN_KIND).to(DisablePlugin.class);
+    get(PLUGIN_KIND, "status").to(GetStatus.class);
+    post(PLUGIN_KIND, "disable").to(DisablePlugin.class);
+    post(PLUGIN_KIND, "enable").to(EnablePlugin.class);
+    post(PLUGIN_KIND, "reload").to(ReloadPlugin.class);
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginScannerThread.java b/java/com/google/gerrit/server/plugins/PluginScannerThread.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginScannerThread.java
rename to java/com/google/gerrit/server/plugins/PluginScannerThread.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginUtil.java b/java/com/google/gerrit/server/plugins/PluginUtil.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginUtil.java
rename to java/com/google/gerrit/server/plugins/PluginUtil.java
diff --git a/java/com/google/gerrit/server/plugins/PluginsCollection.java b/java/com/google/gerrit/server/plugins/PluginsCollection.java
new file mode 100644
index 0000000..7cc006e
--- /dev/null
+++ b/java/com/google/gerrit/server/plugins/PluginsCollection.java
@@ -0,0 +1,65 @@
+// Copyright (C) 2012 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.google.gerrit.server.plugins;
+
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestCollection;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@Singleton
+public class PluginsCollection implements RestCollection<TopLevelResource, PluginResource> {
+
+  private final DynamicMap<RestView<PluginResource>> views;
+  private final PluginLoader loader;
+  private final Provider<ListPlugins> list;
+
+  @Inject
+  public PluginsCollection(
+      DynamicMap<RestView<PluginResource>> views, PluginLoader loader, Provider<ListPlugins> list) {
+    this.views = views;
+    this.loader = loader;
+    this.list = list;
+  }
+
+  @Override
+  public RestView<TopLevelResource> list() throws ResourceNotFoundException {
+    return list.get();
+  }
+
+  @Override
+  public PluginResource parse(TopLevelResource parent, IdString id)
+      throws ResourceNotFoundException {
+    return parse(id.get());
+  }
+
+  public PluginResource parse(String id) throws ResourceNotFoundException {
+    Plugin p = loader.get(id);
+    if (p == null) {
+      throw new ResourceNotFoundException(id);
+    }
+    return new PluginResource(p);
+  }
+
+  @Override
+  public DynamicMap<RestView<PluginResource>> views() {
+    return views;
+  }
+}
diff --git a/java/com/google/gerrit/server/plugins/ReloadPlugin.java b/java/com/google/gerrit/server/plugins/ReloadPlugin.java
new file mode 100644
index 0000000..1134f50
--- /dev/null
+++ b/java/com/google/gerrit/server/plugins/ReloadPlugin.java
@@ -0,0 +1,57 @@
+// Copyright (C) 2012 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.google.gerrit.server.plugins;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.common.PluginInfo;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
+@Singleton
+public class ReloadPlugin implements RestModifyView<PluginResource, Input> {
+
+  private final PluginLoader loader;
+
+  @Inject
+  ReloadPlugin(PluginLoader loader) {
+    this.loader = loader;
+  }
+
+  @Override
+  public PluginInfo apply(PluginResource resource, Input input) throws ResourceConflictException {
+    String name = resource.getName();
+    try {
+      loader.reload(ImmutableList.of(name));
+    } catch (InvalidPluginException e) {
+      throw new ResourceConflictException(e.getMessage());
+    } catch (PluginInstallException e) {
+      StringWriter buf = new StringWriter();
+      buf.write(String.format("cannot reload %s\n", name));
+      PrintWriter pw = new PrintWriter(buf);
+      e.printStackTrace(pw);
+      pw.flush();
+      throw new ResourceConflictException(buf.toString());
+    }
+    return ListPlugins.toPluginInfo(loader.get(name));
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ReloadPluginListener.java b/java/com/google/gerrit/server/plugins/ReloadPluginListener.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/plugins/ReloadPluginListener.java
rename to java/com/google/gerrit/server/plugins/ReloadPluginListener.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerInformationImpl.java b/java/com/google/gerrit/server/plugins/ServerInformationImpl.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerInformationImpl.java
rename to java/com/google/gerrit/server/plugins/ServerInformationImpl.java
diff --git a/java/com/google/gerrit/server/plugins/ServerPlugin.java b/java/com/google/gerrit/server/plugins/ServerPlugin.java
new file mode 100644
index 0000000..f236202
--- /dev/null
+++ b/java/com/google/gerrit/server/plugins/ServerPlugin.java
@@ -0,0 +1,308 @@
+// Copyright (C) 2012 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.google.gerrit.server.plugins;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import com.google.gerrit.extensions.registration.ReloadableRegistrationHandle;
+import com.google.gerrit.lifecycle.LifecycleManager;
+import com.google.gerrit.server.PluginUser;
+import com.google.gerrit.server.config.GerritRuntime;
+import com.google.gerrit.server.util.RequestContext;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Module;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.jar.Attributes;
+import java.util.jar.Manifest;
+import org.eclipse.jgit.internal.storage.file.FileSnapshot;
+
+public class ServerPlugin extends Plugin {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final Manifest manifest;
+  private final PluginContentScanner scanner;
+  private final Path dataDir;
+  private final String pluginCanonicalWebUrl;
+  private final ClassLoader classLoader;
+  private final String metricsPrefix;
+  private final GerritRuntime gerritRuntime;
+  protected Class<? extends Module> sysModule;
+  protected Class<? extends Module> batchModule;
+  protected Class<? extends Module> sshModule;
+  protected Class<? extends Module> httpModule;
+
+  private Injector sysInjector;
+  private Injector sshInjector;
+  private Injector httpInjector;
+  private LifecycleManager serverManager;
+  private List<ReloadableRegistrationHandle<?>> reloadableHandles;
+
+  public ServerPlugin(
+      String name,
+      String pluginCanonicalWebUrl,
+      PluginUser pluginUser,
+      Path srcJar,
+      FileSnapshot snapshot,
+      PluginContentScanner scanner,
+      Path dataDir,
+      ClassLoader classLoader,
+      String metricsPrefix,
+      GerritRuntime gerritRuntime)
+      throws InvalidPluginException {
+    super(
+        name,
+        srcJar,
+        pluginUser,
+        snapshot,
+        scanner == null ? ApiType.PLUGIN : Plugin.getApiType(getPluginManifest(scanner)));
+    this.pluginCanonicalWebUrl = pluginCanonicalWebUrl;
+    this.scanner = scanner;
+    this.dataDir = dataDir;
+    this.classLoader = classLoader;
+    this.manifest = scanner == null ? null : getPluginManifest(scanner);
+    this.metricsPrefix = metricsPrefix;
+    this.gerritRuntime = gerritRuntime;
+    if (manifest != null) {
+      loadGuiceModules(manifest, classLoader);
+    }
+  }
+
+  private void loadGuiceModules(Manifest manifest, ClassLoader classLoader)
+      throws InvalidPluginException {
+    Attributes main = manifest.getMainAttributes();
+    String sysName = main.getValue("Gerrit-Module");
+    String sshName = main.getValue("Gerrit-SshModule");
+    String httpName = main.getValue("Gerrit-HttpModule");
+    String batchName = main.getValue("Gerrit-BatchModule");
+
+    if (!Strings.isNullOrEmpty(sshName) && getApiType() != Plugin.ApiType.PLUGIN) {
+      throw new InvalidPluginException(
+          String.format(
+              "Using Gerrit-SshModule requires Gerrit-ApiType: %s", Plugin.ApiType.PLUGIN));
+    }
+
+    try {
+      this.batchModule = load(batchName, classLoader);
+      this.sysModule = load(sysName, classLoader);
+      this.sshModule = load(sshName, classLoader);
+      this.httpModule = load(httpName, classLoader);
+    } catch (ClassNotFoundException e) {
+      throw new InvalidPluginException("Unable to load plugin Guice Modules", e);
+    }
+  }
+
+  @SuppressWarnings("unchecked")
+  protected static Class<? extends Module> load(@Nullable String name, ClassLoader pluginLoader)
+      throws ClassNotFoundException {
+    if (Strings.isNullOrEmpty(name)) {
+      return null;
+    }
+
+    Class<?> clazz = Class.forName(name, false, pluginLoader);
+    if (!Module.class.isAssignableFrom(clazz)) {
+      throw new ClassCastException(
+          String.format("Class %s does not implement %s", name, Module.class.getName()));
+    }
+    return (Class<? extends Module>) clazz;
+  }
+
+  Path getDataDir() {
+    return dataDir;
+  }
+
+  String getPluginCanonicalWebUrl() {
+    return pluginCanonicalWebUrl;
+  }
+
+  String getMetricsPrefix() {
+    return metricsPrefix;
+  }
+
+  private static Manifest getPluginManifest(PluginContentScanner scanner)
+      throws InvalidPluginException {
+    try {
+      return scanner.getManifest();
+    } catch (IOException e) {
+      throw new InvalidPluginException("Cannot get plugin manifest", e);
+    }
+  }
+
+  @Override
+  @Nullable
+  public String getVersion() {
+    Attributes main = manifest.getMainAttributes();
+    return main.getValue(Attributes.Name.IMPLEMENTATION_VERSION);
+  }
+
+  @Override
+  protected boolean canReload() {
+    Attributes main = manifest.getMainAttributes();
+    String v = main.getValue("Gerrit-ReloadMode");
+    if (Strings.isNullOrEmpty(v) || "reload".equalsIgnoreCase(v)) {
+      return true;
+    } else if ("restart".equalsIgnoreCase(v)) {
+      return false;
+    } else {
+      logger.atWarning().log(
+          "Plugin %s has invalid Gerrit-ReloadMode %s; assuming restart", getName(), v);
+      return false;
+    }
+  }
+
+  @Override
+  protected void start(PluginGuiceEnvironment env) throws Exception {
+    RequestContext oldContext = env.enter(this);
+    try {
+      startPlugin(env);
+    } finally {
+      env.exit(oldContext);
+    }
+  }
+
+  private void startPlugin(PluginGuiceEnvironment env) throws Exception {
+    Injector root = newRootInjector(env);
+    serverManager = new LifecycleManager();
+    serverManager.add(root);
+
+    if (gerritRuntime == GerritRuntime.BATCH) {
+      if (batchModule != null) {
+        sysInjector = root.createChildInjector(root.getInstance(batchModule));
+        serverManager.add(sysInjector);
+      } else {
+        sysInjector = root;
+      }
+
+      serverManager.start();
+      return;
+    }
+
+    AutoRegisterModules auto = null;
+    if (sysModule == null && sshModule == null && httpModule == null) {
+      auto = new AutoRegisterModules(getName(), env, scanner, classLoader);
+      auto.discover();
+    }
+
+    if (sysModule != null) {
+      sysInjector = root.createChildInjector(root.getInstance(sysModule));
+      serverManager.add(sysInjector);
+    } else if (auto != null && auto.sysModule != null) {
+      sysInjector = root.createChildInjector(auto.sysModule);
+      serverManager.add(sysInjector);
+    } else {
+      sysInjector = root;
+    }
+
+    if (env.hasSshModule()) {
+      List<Module> modules = new ArrayList<>();
+      if (getApiType() == ApiType.PLUGIN) {
+        modules.add(env.getSshModule());
+      }
+      if (sshModule != null) {
+        modules.add(sysInjector.getInstance(sshModule));
+        sshInjector = sysInjector.createChildInjector(modules);
+        serverManager.add(sshInjector);
+      } else if (auto != null && auto.sshModule != null) {
+        modules.add(auto.sshModule);
+        sshInjector = sysInjector.createChildInjector(modules);
+        serverManager.add(sshInjector);
+      }
+    }
+
+    if (env.hasHttpModule()) {
+      List<Module> modules = new ArrayList<>();
+      if (getApiType() == ApiType.PLUGIN) {
+        modules.add(env.getHttpModule());
+      }
+      if (httpModule != null) {
+        modules.add(sysInjector.getInstance(httpModule));
+        httpInjector = sysInjector.createChildInjector(modules);
+        serverManager.add(httpInjector);
+      } else if (auto != null && auto.httpModule != null) {
+        modules.add(auto.httpModule);
+        httpInjector = sysInjector.createChildInjector(modules);
+        serverManager.add(httpInjector);
+      }
+    }
+
+    serverManager.start();
+  }
+
+  private Injector newRootInjector(PluginGuiceEnvironment env) {
+    List<Module> modules = Lists.newArrayListWithCapacity(2);
+    if (getApiType() == ApiType.PLUGIN) {
+      modules.add(env.getSysModule());
+    }
+    modules.add(new ServerPluginInfoModule(this, env.getServerMetrics()));
+    return Guice.createInjector(modules);
+  }
+
+  @Override
+  protected void stop(PluginGuiceEnvironment env) {
+    if (serverManager != null) {
+      RequestContext oldContext = env.enter(this);
+      try {
+        serverManager.stop();
+      } finally {
+        env.exit(oldContext);
+      }
+      serverManager = null;
+      sysInjector = null;
+      sshInjector = null;
+      httpInjector = null;
+    }
+  }
+
+  @Override
+  public Injector getSysInjector() {
+    return sysInjector;
+  }
+
+  @Override
+  @Nullable
+  public Injector getSshInjector() {
+    return sshInjector;
+  }
+
+  @Override
+  @Nullable
+  public Injector getHttpInjector() {
+    return httpInjector;
+  }
+
+  @Override
+  public void add(RegistrationHandle handle) {
+    if (serverManager != null) {
+      if (handle instanceof ReloadableRegistrationHandle) {
+        if (reloadableHandles == null) {
+          reloadableHandles = new ArrayList<>();
+        }
+        reloadableHandles.add((ReloadableRegistrationHandle<?>) handle);
+      }
+      serverManager.add(handle);
+    }
+  }
+
+  @Override
+  public PluginContentScanner getContentScanner() {
+    return scanner;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPluginInfoModule.java b/java/com/google/gerrit/server/plugins/ServerPluginInfoModule.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPluginInfoModule.java
rename to java/com/google/gerrit/server/plugins/ServerPluginInfoModule.java
diff --git a/java/com/google/gerrit/server/plugins/ServerPluginProvider.java b/java/com/google/gerrit/server/plugins/ServerPluginProvider.java
new file mode 100644
index 0000000..f2f64c2
--- /dev/null
+++ b/java/com/google/gerrit/server/plugins/ServerPluginProvider.java
@@ -0,0 +1,104 @@
+// Copyright (C) 2014 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.google.gerrit.server.plugins;
+
+import com.google.gerrit.extensions.annotations.ExtensionPoint;
+import com.google.gerrit.server.PluginUser;
+import com.google.gerrit.server.config.GerritRuntime;
+import java.nio.file.Path;
+import org.eclipse.jgit.internal.storage.file.FileSnapshot;
+
+/**
+ * Provider of one Server plugin from one external file
+ *
+ * <p>Allows to load one plugin from one external file or one directory by declaring the ability to
+ * handle it.
+ *
+ * <p>In order to load multiple files into a single plugin, group them into a directory tree and
+ * then load the directory root as a single plugin.
+ */
+@ExtensionPoint
+public interface ServerPluginProvider {
+
+  /** Descriptor of the Plugin that ServerPluginProvider has to load. */
+  class PluginDescription {
+    public final PluginUser user;
+    public final String canonicalUrl;
+    public final Path dataDir;
+    final GerritRuntime gerritRuntime;
+
+    /**
+     * Creates a new PluginDescription for ServerPluginProvider.
+     *
+     * @param user Gerrit user for interacting with plugins
+     * @param canonicalUrl plugin root Web URL
+     * @param dataDir directory for plugin data
+     * @param gerritRuntime current Gerrit runtime (daemon, batch, ...)
+     */
+    public PluginDescription(
+        PluginUser user, String canonicalUrl, Path dataDir, GerritRuntime gerritRuntime) {
+      this.user = user;
+      this.canonicalUrl = canonicalUrl;
+      this.dataDir = dataDir;
+      this.gerritRuntime = gerritRuntime;
+    }
+  }
+
+  /**
+   * Declares the availability to manage an external file or directory
+   *
+   * @param srcPath the external file or directory
+   * @return true if file or directory can be loaded into a Server Plugin
+   */
+  boolean handles(Path srcPath);
+
+  /**
+   * Returns the plugin name of an external file or directory
+   *
+   * <p>Should be called only if {@link #handles(Path) handles(srcFile)} returns true and thus
+   * srcFile is a supported plugin format. An IllegalArgumentException is thrown otherwise as
+   * srcFile is not a valid file format for extracting its plugin name.
+   *
+   * @param srcPath external file or directory
+   * @return plugin name
+   */
+  String getPluginName(Path srcPath);
+
+  /**
+   * Loads an external file or directory into a Server plugin.
+   *
+   * <p>Should be called only if {@link #handles(Path) handles(srcFile)} returns true and thus
+   * srcFile is a supported plugin format. An IllegalArgumentException is thrown otherwise as
+   * srcFile is not a valid file format for extracting its plugin name.
+   *
+   * @param srcPath external file or directory
+   * @param snapshot snapshot of the external file
+   * @param pluginDescriptor descriptor of the ServerPlugin to load
+   * @throws InvalidPluginException if plugin is supposed to be handled but cannot be loaded for any
+   *     other reason
+   */
+  ServerPlugin get(Path srcPath, FileSnapshot snapshot, PluginDescription pluginDescriptor)
+      throws InvalidPluginException;
+
+  /**
+   * Returns the plugin name of this provider.
+   *
+   * <p>Allows to identify which plugin provided the current ServerPluginProvider by returning the
+   * plugin name. Helpful for troubleshooting plugin loading problems.
+   *
+   * @return plugin name of this provider
+   */
+  String getProviderPluginName();
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/StartPluginListener.java b/java/com/google/gerrit/server/plugins/StartPluginListener.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/plugins/StartPluginListener.java
rename to java/com/google/gerrit/server/plugins/StartPluginListener.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/StopPluginListener.java b/java/com/google/gerrit/server/plugins/StopPluginListener.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/plugins/StopPluginListener.java
rename to java/com/google/gerrit/server/plugins/StopPluginListener.java
diff --git a/java/com/google/gerrit/server/plugins/TestServerPlugin.java b/java/com/google/gerrit/server/plugins/TestServerPlugin.java
new file mode 100644
index 0000000..3751c3f
--- /dev/null
+++ b/java/com/google/gerrit/server/plugins/TestServerPlugin.java
@@ -0,0 +1,91 @@
+// 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.
+
+package com.google.gerrit.server.plugins;
+
+import com.google.gerrit.server.PluginUser;
+import com.google.gerrit.server.config.GerritRuntime;
+import java.nio.file.Path;
+
+public class TestServerPlugin extends ServerPlugin {
+  private final ClassLoader classLoader;
+  private String sysName;
+  private String httpName;
+  private String sshName;
+
+  public TestServerPlugin(
+      String name,
+      String pluginCanonicalWebUrl,
+      PluginUser user,
+      ClassLoader classloader,
+      String sysName,
+      String httpName,
+      String sshName,
+      Path dataDir)
+      throws InvalidPluginException {
+    super(
+        name,
+        pluginCanonicalWebUrl,
+        user,
+        null,
+        null,
+        null,
+        dataDir,
+        classloader,
+        null,
+        GerritRuntime.DAEMON);
+    this.classLoader = classloader;
+    this.sysName = sysName;
+    this.httpName = httpName;
+    this.sshName = sshName;
+    loadGuiceModules();
+  }
+
+  private void loadGuiceModules() throws InvalidPluginException {
+    try {
+      this.sysModule = load(sysName, classLoader);
+      this.httpModule = load(httpName, classLoader);
+      this.sshModule = load(sshName, classLoader);
+    } catch (ClassNotFoundException e) {
+      throw new InvalidPluginException("Unable to load plugin Guice Modules", e);
+    }
+  }
+
+  @Override
+  public String getVersion() {
+    return "1.0";
+  }
+
+  @Override
+  protected boolean canReload() {
+    return false;
+  }
+
+  @Override
+  // Widen access modifier in derived class
+  public void start(PluginGuiceEnvironment env) throws Exception {
+    super.start(env);
+  }
+
+  @Override
+  // Widen access modifier in derived class
+  public void stop(PluginGuiceEnvironment env) {
+    super.stop(env);
+  }
+
+  @Override
+  public PluginContentScanner getContentScanner() {
+    return null;
+  }
+}
diff --git a/java/com/google/gerrit/server/plugins/UniversalServerPluginProvider.java b/java/com/google/gerrit/server/plugins/UniversalServerPluginProvider.java
new file mode 100644
index 0000000..4d89482
--- /dev/null
+++ b/java/com/google/gerrit/server/plugins/UniversalServerPluginProvider.java
@@ -0,0 +1,94 @@
+// Copyright (C) 2014 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.google.gerrit.server.plugins;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.registration.PluginName;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.jgit.internal.storage.file.FileSnapshot;
+
+@Singleton
+class UniversalServerPluginProvider implements ServerPluginProvider {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final DynamicSet<ServerPluginProvider> serverPluginProviders;
+
+  @Inject
+  UniversalServerPluginProvider(DynamicSet<ServerPluginProvider> sf) {
+    this.serverPluginProviders = sf;
+  }
+
+  @Override
+  public ServerPlugin get(Path srcPath, FileSnapshot snapshot, PluginDescription pluginDescription)
+      throws InvalidPluginException {
+    return providerOf(srcPath).get(srcPath, snapshot, pluginDescription);
+  }
+
+  @Override
+  public String getPluginName(Path srcPath) {
+    return providerOf(srcPath).getPluginName(srcPath);
+  }
+
+  @Override
+  public boolean handles(Path srcPath) {
+    List<ServerPluginProvider> providers = providersForHandlingPlugin(srcPath);
+    switch (providers.size()) {
+      case 1:
+        return true;
+      case 0:
+        return false;
+      default:
+        throw new MultipleProvidersForPluginException(srcPath, providers);
+    }
+  }
+
+  @Override
+  public String getProviderPluginName() {
+    return PluginName.GERRIT;
+  }
+
+  private ServerPluginProvider providerOf(Path srcPath) {
+    List<ServerPluginProvider> providers = providersForHandlingPlugin(srcPath);
+    switch (providers.size()) {
+      case 1:
+        return providers.get(0);
+      case 0:
+        throw new IllegalArgumentException(
+            "No ServerPluginProvider found/loaded to handle plugin file "
+                + srcPath.toAbsolutePath());
+      default:
+        throw new MultipleProvidersForPluginException(srcPath, providers);
+    }
+  }
+
+  private List<ServerPluginProvider> providersForHandlingPlugin(Path srcPath) {
+    List<ServerPluginProvider> providers = new ArrayList<>();
+    for (ServerPluginProvider serverPluginProvider : serverPluginProviders) {
+      boolean handles = serverPluginProvider.handles(srcPath);
+      logger.atFine().log(
+          "File %s handled by %s ? => %s",
+          srcPath, serverPluginProvider.getProviderPluginName(), handles);
+      if (handles) {
+        providers.add(serverPluginProvider);
+      }
+    }
+    return providers;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/AccessControlModule.java b/java/com/google/gerrit/server/project/AccessControlModule.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/project/AccessControlModule.java
rename to java/com/google/gerrit/server/project/AccessControlModule.java
diff --git a/java/com/google/gerrit/server/project/AccountsSection.java b/java/com/google/gerrit/server/project/AccountsSection.java
new file mode 100644
index 0000000..30bd244
--- /dev/null
+++ b/java/com/google/gerrit/server/project/AccountsSection.java
@@ -0,0 +1,35 @@
+// Copyright (C) 2010 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.google.gerrit.server.project;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.common.data.PermissionRule;
+import java.util.ArrayList;
+import java.util.List;
+
+public class AccountsSection {
+  protected List<PermissionRule> sameGroupVisibility;
+
+  public ImmutableList<PermissionRule> getSameGroupVisibility() {
+    if (sameGroupVisibility == null) {
+      sameGroupVisibility = ImmutableList.of();
+    }
+    return ImmutableList.copyOf(sameGroupVisibility);
+  }
+
+  public void setSameGroupVisibility(List<PermissionRule> sameGroupVisibility) {
+    this.sameGroupVisibility = new ArrayList<>(sameGroupVisibility);
+  }
+}
diff --git a/java/com/google/gerrit/server/project/BooleanProjectConfigTransformations.java b/java/com/google/gerrit/server/project/BooleanProjectConfigTransformations.java
new file mode 100644
index 0000000..79eccbb
--- /dev/null
+++ b/java/com/google/gerrit/server/project/BooleanProjectConfigTransformations.java
@@ -0,0 +1,122 @@
+// Copyright (C) 2017 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.google.gerrit.server.project;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+import com.google.gerrit.extensions.api.projects.ConfigInfo;
+import com.google.gerrit.extensions.api.projects.ConfigInfo.InheritedBooleanInfo;
+import com.google.gerrit.extensions.api.projects.ConfigInput;
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
+import java.util.Arrays;
+import java.util.HashSet;
+
+/** Provides transformations to get and set BooleanProjectConfigs from the API. */
+public class BooleanProjectConfigTransformations {
+
+  private static ImmutableMap<BooleanProjectConfig, Mapper> MAPPER =
+      ImmutableMap.<BooleanProjectConfig, Mapper>builder()
+          .put(
+              BooleanProjectConfig.USE_CONTRIBUTOR_AGREEMENTS,
+              new Mapper(i -> i.useContributorAgreements, (i, v) -> i.useContributorAgreements = v))
+          .put(
+              BooleanProjectConfig.USE_SIGNED_OFF_BY,
+              new Mapper(i -> i.useSignedOffBy, (i, v) -> i.useSignedOffBy = v))
+          .put(
+              BooleanProjectConfig.USE_CONTENT_MERGE,
+              new Mapper(i -> i.useContentMerge, (i, v) -> i.useContentMerge = v))
+          .put(
+              BooleanProjectConfig.REQUIRE_CHANGE_ID,
+              new Mapper(i -> i.requireChangeId, (i, v) -> i.requireChangeId = v))
+          .put(
+              BooleanProjectConfig.CREATE_NEW_CHANGE_FOR_ALL_NOT_IN_TARGET,
+              new Mapper(
+                  i -> i.createNewChangeForAllNotInTarget,
+                  (i, v) -> i.createNewChangeForAllNotInTarget = v))
+          .put(
+              BooleanProjectConfig.ENABLE_SIGNED_PUSH,
+              new Mapper(i -> i.enableSignedPush, (i, v) -> i.enableSignedPush = v))
+          .put(
+              BooleanProjectConfig.REQUIRE_SIGNED_PUSH,
+              new Mapper(i -> i.requireSignedPush, (i, v) -> i.requireSignedPush = v))
+          .put(
+              BooleanProjectConfig.REJECT_IMPLICIT_MERGES,
+              new Mapper(i -> i.rejectImplicitMerges, (i, v) -> i.rejectImplicitMerges = v))
+          .put(
+              BooleanProjectConfig.PRIVATE_BY_DEFAULT,
+              new Mapper(i -> i.privateByDefault, (i, v) -> i.privateByDefault = v))
+          .put(
+              BooleanProjectConfig.ENABLE_REVIEWER_BY_EMAIL,
+              new Mapper(i -> i.enableReviewerByEmail, (i, v) -> i.enableReviewerByEmail = v))
+          .put(
+              BooleanProjectConfig.MATCH_AUTHOR_TO_COMMITTER_DATE,
+              new Mapper(
+                  i -> i.matchAuthorToCommitterDate, (i, v) -> i.matchAuthorToCommitterDate = v))
+          .put(
+              BooleanProjectConfig.REJECT_EMPTY_COMMIT,
+              new Mapper(i -> i.rejectEmptyCommit, (i, v) -> i.rejectEmptyCommit = v))
+          .put(
+              BooleanProjectConfig.WORK_IN_PROGRESS_BY_DEFAULT,
+              new Mapper(i -> i.workInProgressByDefault, (i, v) -> i.workInProgressByDefault = v))
+          .build();
+
+  static {
+    // Verify that each BooleanProjectConfig has to/from API mappers in
+    // BooleanProjectConfigTransformations
+    if (!Sets.symmetricDifference(
+            MAPPER.keySet(), new HashSet<>(Arrays.asList(BooleanProjectConfig.values())))
+        .isEmpty()) {
+      throw new IllegalStateException(
+          "All values of BooleanProjectConfig must have transformations associated with them");
+    }
+  }
+
+  @FunctionalInterface
+  private interface ToApi {
+    void apply(ConfigInfo info, InheritedBooleanInfo val);
+  }
+
+  @FunctionalInterface
+  private interface FromApi {
+    InheritableBoolean apply(ConfigInput input);
+  }
+
+  public static void set(BooleanProjectConfig cfg, ConfigInfo info, InheritedBooleanInfo val) {
+    MAPPER.get(cfg).set(info, val);
+  }
+
+  public static InheritableBoolean get(BooleanProjectConfig cfg, ConfigInput input) {
+    return MAPPER.get(cfg).get(input);
+  }
+
+  private static class Mapper {
+    private final FromApi fromApi;
+    private final ToApi toApi;
+
+    private Mapper(FromApi fromApi, ToApi toApi) {
+      this.fromApi = fromApi;
+      this.toApi = toApi;
+    }
+
+    public void set(ConfigInfo info, InheritedBooleanInfo val) {
+      toApi.apply(info, val);
+    }
+
+    public InheritableBoolean get(ConfigInput input) {
+      return fromApi.apply(input);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/project/BranchResource.java b/java/com/google/gerrit/server/project/BranchResource.java
new file mode 100644
index 0000000..622b1dd
--- /dev/null
+++ b/java/com/google/gerrit/server/project/BranchResource.java
@@ -0,0 +1,49 @@
+// Copyright (C) 2013 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.google.gerrit.server.project;
+
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.server.CurrentUser;
+import com.google.inject.TypeLiteral;
+import org.eclipse.jgit.lib.Ref;
+
+public class BranchResource extends RefResource {
+  public static final TypeLiteral<RestView<BranchResource>> BRANCH_KIND =
+      new TypeLiteral<RestView<BranchResource>>() {};
+
+  private final String refName;
+  private final String revision;
+
+  public BranchResource(ProjectState projectState, CurrentUser user, Ref ref) {
+    super(projectState, user);
+    this.refName = ref.getName();
+    this.revision = ref.getObjectId() != null ? ref.getObjectId().name() : null;
+  }
+
+  public Branch.NameKey getBranchKey() {
+    return new Branch.NameKey(getNameKey(), refName);
+  }
+
+  @Override
+  public String getRef() {
+    return refName;
+  }
+
+  @Override
+  public String getRevision() {
+    return revision;
+  }
+}
diff --git a/java/com/google/gerrit/server/project/ChildProjectResource.java b/java/com/google/gerrit/server/project/ChildProjectResource.java
new file mode 100644
index 0000000..4b641ca
--- /dev/null
+++ b/java/com/google/gerrit/server/project/ChildProjectResource.java
@@ -0,0 +1,46 @@
+// Copyright (C) 2017 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.google.gerrit.server.project;
+
+import com.google.common.collect.Iterables;
+import com.google.gerrit.extensions.restapi.RestResource;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.inject.TypeLiteral;
+
+public class ChildProjectResource implements RestResource {
+  public static final TypeLiteral<RestView<ChildProjectResource>> CHILD_PROJECT_KIND =
+      new TypeLiteral<RestView<ChildProjectResource>>() {};
+
+  private final ProjectResource parent;
+  private final ProjectState child;
+
+  public ChildProjectResource(ProjectResource parent, ProjectState child) {
+    this.parent = parent;
+    this.child = child;
+  }
+
+  public ProjectResource getParent() {
+    return parent;
+  }
+
+  public ProjectState getChild() {
+    return child;
+  }
+
+  public boolean isDirectChild() {
+    ProjectState firstParent = Iterables.getFirst(child.parents(), null);
+    return firstParent != null && parent.getNameKey().equals(firstParent.getNameKey());
+  }
+}
diff --git a/java/com/google/gerrit/server/project/ChildProjects.java b/java/com/google/gerrit/server/project/ChildProjects.java
new file mode 100644
index 0000000..ce9992e
--- /dev/null
+++ b/java/com/google/gerrit/server/project/ChildProjects.java
@@ -0,0 +1,106 @@
+// Copyright (C) 2017 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.google.gerrit.server.project;
+
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.Multimap;
+import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/** Retrieve child projects (ie. projects whose access inherits from a given parent.) */
+@Singleton
+public class ChildProjects {
+  private final ProjectCache projectCache;
+  private final PermissionBackend permissionBackend;
+  private final AllProjectsName allProjects;
+  private final ProjectJson json;
+
+  @Inject
+  ChildProjects(
+      ProjectCache projectCache,
+      PermissionBackend permissionBackend,
+      AllProjectsName allProjectsName,
+      ProjectJson json) {
+    this.projectCache = projectCache;
+    this.permissionBackend = permissionBackend;
+    this.allProjects = allProjectsName;
+    this.json = json;
+  }
+
+  /** Gets all child projects recursively. */
+  public List<ProjectInfo> list(Project.NameKey parent) throws PermissionBackendException {
+    Map<Project.NameKey, Project> projects = readAllReadableProjects();
+    Multimap<Project.NameKey, Project.NameKey> children = parentToChildren(projects);
+    PermissionBackend.WithUser perm = permissionBackend.currentUser();
+
+    List<ProjectInfo> results = new ArrayList<>();
+    depthFirstFormat(results, perm, projects, children, parent);
+    return results;
+  }
+
+  private Map<Project.NameKey, Project> readAllReadableProjects() {
+    Map<Project.NameKey, Project> projects = new HashMap<>();
+    for (Project.NameKey name : projectCache.all()) {
+      ProjectState c = projectCache.get(name);
+      if (c != null && c.statePermitsRead()) {
+        projects.put(c.getNameKey(), c.getProject());
+      }
+    }
+    return projects;
+  }
+
+  /** Map of parent project to direct child. */
+  private Multimap<Project.NameKey, Project.NameKey> parentToChildren(
+      Map<Project.NameKey, Project> projects) {
+    Multimap<Project.NameKey, Project.NameKey> m = ArrayListMultimap.create();
+    for (Map.Entry<Project.NameKey, Project> e : projects.entrySet()) {
+      if (!allProjects.equals(e.getKey())) {
+        m.put(e.getValue().getParent(allProjects), e.getKey());
+      }
+    }
+    return m;
+  }
+
+  private void depthFirstFormat(
+      List<ProjectInfo> results,
+      PermissionBackend.WithUser perm,
+      Map<Project.NameKey, Project> projects,
+      Multimap<Project.NameKey, Project.NameKey> children,
+      Project.NameKey parent)
+      throws PermissionBackendException {
+    List<Project.NameKey> canSee =
+        perm.filter(ProjectPermission.ACCESS, children.get(parent)).stream()
+            .sorted()
+            .collect(toList());
+    children.removeAll(parent); // removing all entries prevents cycles.
+
+    for (Project.NameKey c : canSee) {
+      results.add(json.format(projects.get(c)));
+      depthFirstFormat(results, perm, projects, children, c);
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/CommentLinkInfoImpl.java b/java/com/google/gerrit/server/project/CommentLinkInfoImpl.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/project/CommentLinkInfoImpl.java
rename to java/com/google/gerrit/server/project/CommentLinkInfoImpl.java
diff --git a/java/com/google/gerrit/server/project/CommentLinkProvider.java b/java/com/google/gerrit/server/project/CommentLinkProvider.java
new file mode 100644
index 0000000..4987d00
--- /dev/null
+++ b/java/com/google/gerrit/server/project/CommentLinkProvider.java
@@ -0,0 +1,76 @@
+// Copyright (C) 2012 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.google.gerrit.server.project;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Multimap;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.projects.CommentLinkInfo;
+import com.google.gerrit.server.config.ConfigUpdatedEvent;
+import com.google.gerrit.server.config.ConfigUpdatedEvent.ConfigUpdateEntry;
+import com.google.gerrit.server.config.ConfigUpdatedEvent.UpdateResult;
+import com.google.gerrit.server.config.GerritConfigListener;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.jgit.lib.Config;
+
+@Singleton
+public class CommentLinkProvider implements Provider<List<CommentLinkInfo>>, GerritConfigListener {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private volatile List<CommentLinkInfo> commentLinks;
+
+  @Inject
+  CommentLinkProvider(@GerritServerConfig Config cfg) {
+    this.commentLinks = parseConfig(cfg);
+  }
+
+  private List<CommentLinkInfo> parseConfig(Config cfg) {
+    Set<String> subsections = cfg.getSubsections(ProjectConfig.COMMENTLINK);
+    List<CommentLinkInfo> cls = Lists.newArrayListWithCapacity(subsections.size());
+    for (String name : subsections) {
+      try {
+        CommentLinkInfoImpl cl = ProjectConfig.buildCommentLink(cfg, name, true);
+        if (cl.isOverrideOnly()) {
+          logger.atWarning().log("commentlink %s empty except for \"enabled\"", name);
+          continue;
+        }
+        cls.add(cl);
+      } catch (IllegalArgumentException e) {
+        logger.atWarning().log("invalid commentlink: %s", e.getMessage());
+      }
+    }
+    return ImmutableList.copyOf(cls);
+  }
+
+  @Override
+  public List<CommentLinkInfo> get() {
+    return commentLinks;
+  }
+
+  @Override
+  public Multimap<UpdateResult, ConfigUpdateEntry> configUpdated(ConfigUpdatedEvent event) {
+    if (event.isSectionUpdated(ProjectConfig.COMMENTLINK)) {
+      commentLinks = parseConfig(event.getNewConfig());
+      return event.accept(ProjectConfig.COMMENTLINK);
+    }
+    return ConfigUpdatedEvent.NO_UPDATES;
+  }
+}
diff --git a/java/com/google/gerrit/server/project/CommitResource.java b/java/com/google/gerrit/server/project/CommitResource.java
new file mode 100644
index 0000000..f71c7fe
--- /dev/null
+++ b/java/com/google/gerrit/server/project/CommitResource.java
@@ -0,0 +1,41 @@
+// Copyright (C) 2017 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.google.gerrit.server.project;
+
+import com.google.gerrit.extensions.restapi.RestResource;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.inject.TypeLiteral;
+import org.eclipse.jgit.revwalk.RevCommit;
+
+public class CommitResource implements RestResource {
+  public static final TypeLiteral<RestView<CommitResource>> COMMIT_KIND =
+      new TypeLiteral<RestView<CommitResource>>() {};
+
+  private final ProjectResource project;
+  private final RevCommit commit;
+
+  public CommitResource(ProjectResource project, RevCommit commit) {
+    this.project = project;
+    this.commit = commit;
+  }
+
+  public ProjectState getProjectState() {
+    return project.getProjectState();
+  }
+
+  public RevCommit getCommit() {
+    return commit;
+  }
+}
diff --git a/java/com/google/gerrit/server/project/ConfiguredMimeTypes.java b/java/com/google/gerrit/server/project/ConfiguredMimeTypes.java
new file mode 100644
index 0000000..a6661f7
--- /dev/null
+++ b/java/com/google/gerrit/server/project/ConfiguredMimeTypes.java
@@ -0,0 +1,113 @@
+// Copyright (C) 2014 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.google.gerrit.server.project;
+
+import com.google.common.flogger.FluentLogger;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
+import org.eclipse.jgit.errors.InvalidPatternException;
+import org.eclipse.jgit.fnmatch.FileNameMatcher;
+import org.eclipse.jgit.lib.Config;
+
+public class ConfiguredMimeTypes {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final String MIMETYPE = "mimetype";
+  private static final String KEY_PATH = "path";
+
+  private final List<TypeMatcher> matchers;
+
+  ConfiguredMimeTypes(String projectName, Config rc) {
+    Set<String> types = rc.getSubsections(MIMETYPE);
+    if (types.isEmpty()) {
+      matchers = Collections.emptyList();
+    } else {
+      matchers = new ArrayList<>();
+      for (String typeName : types) {
+        for (String path : rc.getStringList(MIMETYPE, typeName, KEY_PATH)) {
+          try {
+            add(typeName, path);
+          } catch (PatternSyntaxException | InvalidPatternException e) {
+            logger.atWarning().log(
+                "Ignoring invalid %s.%s.%s = %s in project %s: %s",
+                MIMETYPE, typeName, KEY_PATH, path, projectName, e.getMessage());
+          }
+        }
+      }
+    }
+  }
+
+  private void add(String typeName, String path)
+      throws PatternSyntaxException, InvalidPatternException {
+    if (path.startsWith("^")) {
+      matchers.add(new ReType(typeName, path));
+    } else {
+      matchers.add(new FnType(typeName, path));
+    }
+  }
+
+  public String getMimeType(String path) {
+    for (TypeMatcher m : matchers) {
+      if (m.matches(path)) {
+        return m.type;
+      }
+    }
+    return null;
+  }
+
+  private abstract static class TypeMatcher {
+    final String type;
+
+    TypeMatcher(String type) {
+      this.type = type;
+    }
+
+    abstract boolean matches(String path);
+  }
+
+  private static class FnType extends TypeMatcher {
+    private final FileNameMatcher matcher;
+
+    FnType(String type, String pattern) throws InvalidPatternException {
+      super(type);
+      this.matcher = new FileNameMatcher(pattern, null);
+    }
+
+    @Override
+    boolean matches(String input) {
+      FileNameMatcher m = new FileNameMatcher(matcher);
+      m.append(input);
+      return m.isMatch();
+    }
+  }
+
+  private static class ReType extends TypeMatcher {
+    private final Pattern re;
+
+    ReType(String type, String pattern) throws PatternSyntaxException {
+      super(type);
+      this.re = Pattern.compile(pattern);
+    }
+
+    @Override
+    boolean matches(String input) {
+      return re.matcher(input).matches();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/project/ContributorAgreementsChecker.java b/java/com/google/gerrit/server/project/ContributorAgreementsChecker.java
new file mode 100644
index 0000000..84b8af3
--- /dev/null
+++ b/java/com/google/gerrit/server/project/ContributorAgreementsChecker.java
@@ -0,0 +1,118 @@
+// Copyright (C) 2017 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.google.gerrit.server.project;
+
+import com.google.gerrit.common.data.ContributorAgreement;
+import com.google.gerrit.common.data.PermissionRule;
+import com.google.gerrit.common.data.PermissionRule.Action;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.metrics.Counter0;
+import com.google.gerrit.metrics.Description;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.AccountGroup.UUID;
+import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.config.UrlFormatter;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+@Singleton
+public class ContributorAgreementsChecker {
+
+  private final DynamicItem<UrlFormatter> urlFormatter;
+  private final ProjectCache projectCache;
+  private final Metrics metrics;
+
+  @Singleton
+  protected static class Metrics {
+    final Counter0 claCheckCount;
+
+    @Inject
+    Metrics(MetricMaker metricMaker) {
+      claCheckCount =
+          metricMaker.newCounter(
+              "license/cla_check_count",
+              new Description("Total number of CLA check requests").setRate().setUnit("requests"));
+    }
+  }
+
+  @Inject
+  ContributorAgreementsChecker(
+      DynamicItem<UrlFormatter> urlFormatter, ProjectCache projectCache, Metrics metrics) {
+    this.urlFormatter = urlFormatter;
+    this.projectCache = projectCache;
+    this.metrics = metrics;
+  }
+
+  /**
+   * Checks if the user has signed a contributor agreement for the project.
+   *
+   * @throws AuthException if the user has not signed a contributor agreement for the project
+   * @throws IOException if project states could not be loaded
+   */
+  public void check(Project.NameKey project, CurrentUser user) throws IOException, AuthException {
+    metrics.claCheckCount.increment();
+
+    ProjectState projectState = projectCache.checkedGet(project);
+    if (projectState == null) {
+      throw new IOException("Can't load All-Projects");
+    }
+
+    if (!projectState.is(BooleanProjectConfig.USE_CONTRIBUTOR_AGREEMENTS)) {
+      return;
+    }
+
+    if (!user.isIdentifiedUser()) {
+      throw new AuthException("Must be logged in to verify Contributor Agreement");
+    }
+
+    IdentifiedUser iUser = user.asIdentifiedUser();
+    Collection<ContributorAgreement> contributorAgreements =
+        projectCache.getAllProjects().getConfig().getContributorAgreements();
+    List<UUID> okGroupIds = new ArrayList<>();
+    for (ContributorAgreement ca : contributorAgreements) {
+      List<AccountGroup.UUID> groupIds;
+      groupIds = okGroupIds;
+
+      for (PermissionRule rule : ca.getAccepted()) {
+        if ((rule.getAction() == Action.ALLOW)
+            && (rule.getGroup() != null)
+            && (rule.getGroup().getUUID() != null)) {
+          groupIds.add(new AccountGroup.UUID(rule.getGroup().getUUID().get()));
+        }
+      }
+    }
+
+    if (!iUser.getEffectiveGroups().containsAnyOf(okGroupIds)) {
+      final StringBuilder msg = new StringBuilder();
+      msg.append("No Contributor Agreement on file for user ")
+          .append(iUser.getNameEmail())
+          .append(" (id=")
+          .append(iUser.getAccountId())
+          .append(")");
+
+      msg.append(urlFormatter.get().getSettingsUrl("Agreements").orElse(""));
+      throw new AuthException(msg.toString());
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/project/CreateProjectArgs.java b/java/com/google/gerrit/server/project/CreateProjectArgs.java
new file mode 100644
index 0000000..a68bd84
--- /dev/null
+++ b/java/com/google/gerrit/server/project/CreateProjectArgs.java
@@ -0,0 +1,69 @@
+// Copyright (C) 2011 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.google.gerrit.server.project;
+
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Project;
+import java.util.List;
+
+public class CreateProjectArgs {
+
+  private Project.NameKey projectName;
+  public List<AccountGroup.UUID> ownerIds;
+  public Project.NameKey newParent;
+  public String projectDescription;
+  public SubmitType submitType;
+  public InheritableBoolean contributorAgreements;
+  public InheritableBoolean signedOffBy;
+  public boolean permissionsOnly;
+  public List<String> branch;
+  public InheritableBoolean contentMerge;
+  public InheritableBoolean newChangeForAllNotInTarget;
+  public InheritableBoolean changeIdRequired;
+  public InheritableBoolean rejectEmptyCommit;
+  public InheritableBoolean enableSignedPush;
+  public InheritableBoolean requireSignedPush;
+  public boolean createEmptyCommit;
+  public String maxObjectSizeLimit;
+
+  public CreateProjectArgs() {
+    contributorAgreements = InheritableBoolean.INHERIT;
+    signedOffBy = InheritableBoolean.INHERIT;
+    contentMerge = InheritableBoolean.INHERIT;
+    changeIdRequired = InheritableBoolean.INHERIT;
+    newChangeForAllNotInTarget = InheritableBoolean.INHERIT;
+    enableSignedPush = InheritableBoolean.INHERIT;
+    requireSignedPush = InheritableBoolean.INHERIT;
+    submitType = SubmitType.MERGE_IF_NECESSARY;
+  }
+
+  public Project.NameKey getProject() {
+    return projectName;
+  }
+
+  public String getProjectName() {
+    return projectName != null ? projectName.get() : null;
+  }
+
+  public void setProjectName(String n) {
+    projectName = n != null ? new Project.NameKey(n) : null;
+  }
+
+  public void setProjectName(Project.NameKey n) {
+    projectName = n;
+  }
+}
diff --git a/java/com/google/gerrit/server/project/CreateRefControl.java b/java/com/google/gerrit/server/project/CreateRefControl.java
new file mode 100644
index 0000000..f89e298
--- /dev/null
+++ b/java/com/google/gerrit/server/project/CreateRefControl.java
@@ -0,0 +1,146 @@
+// Copyright (C) 2017 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.google.gerrit.server.project;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevObject;
+import org.eclipse.jgit.revwalk.RevTag;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+/** Manages access control for creating Git references (aka branches, tags). */
+@Singleton
+public class CreateRefControl {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final PermissionBackend permissionBackend;
+  private final ProjectCache projectCache;
+  private final Reachable reachable;
+
+  @Inject
+  CreateRefControl(
+      PermissionBackend permissionBackend, ProjectCache projectCache, Reachable reachable) {
+    this.permissionBackend = permissionBackend;
+    this.projectCache = projectCache;
+    this.reachable = reachable;
+  }
+
+  /**
+   * Checks whether the {@link CurrentUser} can create a new Git ref.
+   *
+   * @param user the user performing the operation
+   * @param repo repository on which user want to create
+   * @param branch the branch the new {@link RevObject} should be created on
+   * @param object the object the user will start the reference with
+   * @throws AuthException if creation is denied; the message explains the denial.
+   * @throws PermissionBackendException on failure of permission checks.
+   * @throws ResourceConflictException if the project state does not permit the operation
+   */
+  public void checkCreateRef(
+      Provider<? extends CurrentUser> user,
+      Repository repo,
+      Branch.NameKey branch,
+      RevObject object)
+      throws AuthException, PermissionBackendException, NoSuchProjectException, IOException,
+          ResourceConflictException {
+    ProjectState ps = projectCache.checkedGet(branch.getParentKey());
+    if (ps == null) {
+      throw new NoSuchProjectException(branch.getParentKey());
+    }
+    ps.checkStatePermitsWrite();
+
+    PermissionBackend.ForRef perm = permissionBackend.user(user.get()).ref(branch);
+    if (object instanceof RevCommit) {
+      perm.check(RefPermission.CREATE);
+      checkCreateCommit(repo, (RevCommit) object, ps.getNameKey(), perm);
+    } else if (object instanceof RevTag) {
+      RevTag tag = (RevTag) object;
+      try (RevWalk rw = new RevWalk(repo)) {
+        rw.parseBody(tag);
+      } catch (IOException e) {
+        logger.atSevere().withCause(e).log(
+            "RevWalk(%s) parsing %s:", branch.getParentKey(), tag.name());
+        throw e;
+      }
+
+      // If tagger is present, require it matches the user's email.
+      PersonIdent tagger = tag.getTaggerIdent();
+      if (tagger != null
+          && (!user.get().isIdentifiedUser()
+              || !user.get().asIdentifiedUser().hasEmailAddress(tagger.getEmailAddress()))) {
+        perm.check(RefPermission.FORGE_COMMITTER);
+      }
+
+      RevObject target = tag.getObject();
+      if (target instanceof RevCommit) {
+        checkCreateCommit(repo, (RevCommit) target, ps.getNameKey(), perm);
+      } else {
+        checkCreateRef(user, repo, branch, target);
+      }
+
+      // If the tag has a PGP signature, allow a lower level of permission
+      // than if it doesn't have a PGP signature.
+      PermissionBackend.ForRef forRef = permissionBackend.user(user.get()).ref(branch);
+      if (tag.getFullMessage().contains("-----BEGIN PGP SIGNATURE-----\n")) {
+        forRef.check(RefPermission.CREATE_SIGNED_TAG);
+      } else {
+        forRef.check(RefPermission.CREATE_TAG);
+      }
+    }
+  }
+
+  /**
+   * Check if the user is allowed to create a new commit object if this creation would introduce a
+   * new commit to the repository.
+   */
+  private void checkCreateCommit(
+      Repository repo, RevCommit commit, Project.NameKey project, PermissionBackend.ForRef forRef)
+      throws AuthException, PermissionBackendException {
+    try {
+      // If the user has update (push) permission, they can create the ref regardless
+      // of whether they are pushing any new objects along with the create.
+      forRef.check(RefPermission.UPDATE);
+      return;
+    } catch (AuthException denied) {
+      // Fall through to check reachability.
+    }
+    if (reachable.fromHeadsOrTags(project, repo, commit)) {
+      // If the user has no push permissions, check whether the object is
+      // merged into a branch or tag readable by this user. If so, they are
+      // not effectively "pushing" more objects, so they can create the ref
+      // even if they don't have push permission.
+      return;
+    }
+
+    throw new AuthException(
+        String.format(
+            "%s for creating new commit object not permitted",
+            RefPermission.UPDATE.describeForException()));
+  }
+}
diff --git a/java/com/google/gerrit/server/project/DashboardResource.java b/java/com/google/gerrit/server/project/DashboardResource.java
new file mode 100644
index 0000000..54f958a
--- /dev/null
+++ b/java/com/google/gerrit/server/project/DashboardResource.java
@@ -0,0 +1,76 @@
+// Copyright (C) 2017 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.google.gerrit.server.project;
+
+import com.google.gerrit.extensions.restapi.RestResource;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.server.CurrentUser;
+import com.google.inject.TypeLiteral;
+import org.eclipse.jgit.lib.Config;
+
+public class DashboardResource implements RestResource {
+  public static final TypeLiteral<RestView<DashboardResource>> DASHBOARD_KIND =
+      new TypeLiteral<RestView<DashboardResource>>() {};
+
+  public static DashboardResource projectDefault(ProjectState projectState, CurrentUser user) {
+    return new DashboardResource(projectState, user, null, null, null, true);
+  }
+
+  private final ProjectState projectState;
+  private final CurrentUser user;
+  private final String refName;
+  private final String pathName;
+  private final Config config;
+  private final boolean projectDefault;
+
+  public DashboardResource(
+      ProjectState projectState,
+      CurrentUser user,
+      String refName,
+      String pathName,
+      Config config,
+      boolean projectDefault) {
+    this.projectState = projectState;
+    this.user = user;
+    this.refName = refName;
+    this.pathName = pathName;
+    this.config = config;
+    this.projectDefault = projectDefault;
+  }
+
+  public ProjectState getProjectState() {
+    return projectState;
+  }
+
+  public CurrentUser getUser() {
+    return user;
+  }
+
+  public String getRefName() {
+    return refName;
+  }
+
+  public String getPathName() {
+    return pathName;
+  }
+
+  public Config getConfig() {
+    return config;
+  }
+
+  public boolean isProjectDefault() {
+    return projectDefault;
+  }
+}
diff --git a/java/com/google/gerrit/server/project/DefaultProjectNameLockManager.java b/java/com/google/gerrit/server/project/DefaultProjectNameLockManager.java
new file mode 100644
index 0000000..3fb5d2a
--- /dev/null
+++ b/java/com/google/gerrit/server/project/DefaultProjectNameLockManager.java
@@ -0,0 +1,41 @@
+// Copyright (C) 2017 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.google.gerrit.server.project;
+
+import com.google.common.util.concurrent.Striped;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.inject.AbstractModule;
+import com.google.inject.Singleton;
+import java.util.concurrent.locks.Lock;
+
+@Singleton
+public class DefaultProjectNameLockManager implements ProjectNameLockManager {
+
+  public static class Module extends AbstractModule {
+    @Override
+    protected void configure() {
+      DynamicItem.bind(binder(), ProjectNameLockManager.class)
+          .to(DefaultProjectNameLockManager.class);
+    }
+  }
+
+  Striped<Lock> locks = Striped.lock(10);
+
+  @Override
+  public Lock getLock(Project.NameKey name) {
+    return locks.get(name);
+  }
+}
diff --git a/java/com/google/gerrit/server/project/FileResource.java b/java/com/google/gerrit/server/project/FileResource.java
new file mode 100644
index 0000000..6e5375a
--- /dev/null
+++ b/java/com/google/gerrit/server/project/FileResource.java
@@ -0,0 +1,68 @@
+// Copyright (C) 2017 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.google.gerrit.server.project;
+
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestResource;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.inject.TypeLiteral;
+import java.io.IOException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevTree;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.treewalk.TreeWalk;
+
+public class FileResource implements RestResource {
+  public static final TypeLiteral<RestView<FileResource>> FILE_KIND =
+      new TypeLiteral<RestView<FileResource>>() {};
+
+  public static FileResource create(
+      GitRepositoryManager repoManager, ProjectState projectState, ObjectId rev, String path)
+      throws ResourceNotFoundException, IOException {
+    try (Repository repo = repoManager.openRepository(projectState.getNameKey());
+        RevWalk rw = new RevWalk(repo)) {
+      RevTree tree = rw.parseTree(rev);
+      if (TreeWalk.forPath(repo, path, tree) != null) {
+        return new FileResource(projectState, rev, path);
+      }
+    }
+    throw new ResourceNotFoundException(IdString.fromDecoded(path));
+  }
+
+  private final ProjectState projectState;
+  private final ObjectId rev;
+  private final String path;
+
+  public FileResource(ProjectState projectState, ObjectId rev, String path) {
+    this.projectState = projectState;
+    this.rev = rev;
+    this.path = path;
+  }
+
+  public ProjectState getProjectState() {
+    return projectState;
+  }
+
+  public ObjectId getRev() {
+    return rev;
+  }
+
+  public String getPath() {
+    return path;
+  }
+}
diff --git a/java/com/google/gerrit/server/project/GroupList.java b/java/com/google/gerrit/server/project/GroupList.java
new file mode 100644
index 0000000..fdb8740
--- /dev/null
+++ b/java/com/google/gerrit/server/project/GroupList.java
@@ -0,0 +1,116 @@
+// Copyright (C) 2014 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.google.gerrit.server.project;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.git.ValidationError;
+import com.google.gerrit.server.git.meta.TabFile;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public class GroupList extends TabFile {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static final String FILE_NAME = "groups";
+
+  private final Map<AccountGroup.UUID, GroupReference> byUUID;
+
+  private GroupList(Map<AccountGroup.UUID, GroupReference> byUUID) {
+    this.byUUID = byUUID;
+  }
+
+  public static GroupList parse(Project.NameKey project, String text, ValidationError.Sink errors)
+      throws IOException {
+    List<Row> rows = parse(text, FILE_NAME, TRIM, TRIM, errors);
+    Map<AccountGroup.UUID, GroupReference> groupsByUUID = new HashMap<>(rows.size());
+    for (Row row : rows) {
+      if (row.left == null) {
+        logger.atWarning().log("null field in group list for %s:\n%s", project, text);
+        continue;
+      }
+      AccountGroup.UUID uuid = new AccountGroup.UUID(row.left);
+      String name = row.right;
+      GroupReference ref = new GroupReference(uuid, name);
+
+      groupsByUUID.put(uuid, ref);
+    }
+
+    return new GroupList(groupsByUUID);
+  }
+
+  public GroupReference byUUID(AccountGroup.UUID uuid) {
+    return byUUID.get(uuid);
+  }
+
+  public GroupReference resolve(GroupReference group) {
+    if (group != null) {
+      if (group.getUUID() == null || group.getUUID().get() == null) {
+        // A GroupReference from ProjectConfig that refers to a group not found
+        // in this file will have a null UUID. Since there may be multiple
+        // different missing references, it's not appropriate to cache the
+        // results, nor return null the set from #uuids.
+        return group;
+      }
+      GroupReference ref = byUUID.get(group.getUUID());
+      if (ref != null) {
+        return ref;
+      }
+      byUUID.put(group.getUUID(), group);
+    }
+    return group;
+  }
+
+  public Collection<GroupReference> references() {
+    return byUUID.values();
+  }
+
+  public Set<AccountGroup.UUID> uuids() {
+    return byUUID.keySet();
+  }
+
+  public void put(AccountGroup.UUID uuid, GroupReference reference) {
+    if (uuid == null || uuid.get() == null) {
+      return; // See note in #resolve above.
+    }
+    byUUID.put(uuid, reference);
+  }
+
+  public String asText() {
+    if (byUUID.isEmpty()) {
+      return null;
+    }
+
+    List<Row> rows = new ArrayList<>(byUUID.size());
+    for (GroupReference g : sort(byUUID.values())) {
+      if (g.getUUID() != null && g.getName() != null) {
+        rows.add(new Row(g.getUUID().get(), g.getName()));
+      }
+    }
+
+    return asText("UUID", "Group Name", rows);
+  }
+
+  public void retainUUIDs(Collection<AccountGroup.UUID> toBeRetained) {
+    byUUID.keySet().retainAll(toBeRetained);
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/InvalidChangeOperationException.java b/java/com/google/gerrit/server/project/InvalidChangeOperationException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/project/InvalidChangeOperationException.java
rename to java/com/google/gerrit/server/project/InvalidChangeOperationException.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/NoSuchChangeException.java b/java/com/google/gerrit/server/project/NoSuchChangeException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/project/NoSuchChangeException.java
rename to java/com/google/gerrit/server/project/NoSuchChangeException.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/NoSuchProjectException.java b/java/com/google/gerrit/server/project/NoSuchProjectException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/project/NoSuchProjectException.java
rename to java/com/google/gerrit/server/project/NoSuchProjectException.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/NoSuchRefException.java b/java/com/google/gerrit/server/project/NoSuchRefException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/project/NoSuchRefException.java
rename to java/com/google/gerrit/server/project/NoSuchRefException.java
diff --git a/java/com/google/gerrit/server/project/ProjectCache.java b/java/com/google/gerrit/server/project/ProjectCache.java
new file mode 100644
index 0000000..c7858dd
--- /dev/null
+++ b/java/com/google/gerrit/server/project/ProjectCache.java
@@ -0,0 +1,109 @@
+// Copyright (C) 2008 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.google.gerrit.server.project;
+
+import com.google.common.collect.ImmutableSortedSet;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Project;
+import java.io.IOException;
+import java.util.Set;
+
+/** Cache of project information, including access rights. */
+public interface ProjectCache {
+  /** @return the parent state for all projects on this server. */
+  ProjectState getAllProjects();
+
+  /** @return the project state of the project storing meta data for all users. */
+  ProjectState getAllUsers();
+
+  /**
+   * Get the cached data for a project by its unique name.
+   *
+   * @param projectName name of the project.
+   * @return the cached data; null if no such project exists, projectName is null or an error
+   *     occurred.
+   * @see #checkedGet(com.google.gerrit.reviewdb.client.Project.NameKey)
+   */
+  ProjectState get(@Nullable Project.NameKey projectName);
+
+  /**
+   * Get the cached data for a project by its unique name.
+   *
+   * @param projectName name of the project.
+   * @throws IOException when there was an error.
+   * @return the cached data; null if no such project exists or projectName is null.
+   */
+  ProjectState checkedGet(@Nullable Project.NameKey projectName) throws IOException;
+
+  /**
+   * Get the cached data for a project by its unique name.
+   *
+   * @param projectName name of the project.
+   * @param strict true when any error generates an exception
+   * @throws Exception in case of any error (strict = true) or only for I/O or other internal
+   *     errors.
+   * @return the cached data or null when strict = false
+   */
+  public ProjectState checkedGet(Project.NameKey projectName, boolean strict) throws Exception;
+
+  /**
+   * Invalidate the cached information about the given project, and triggers reindexing for it
+   *
+   * @param p project that is being evicted
+   * @throws IOException thrown if the reindexing fails
+   */
+  void evict(Project p) throws IOException;
+
+  /**
+   * Invalidate the cached information about the given project, and triggers reindexing for it
+   *
+   * @param p the NameKey of the project that is being evicted
+   * @throws IOException thrown if the reindexing fails
+   */
+  void evict(Project.NameKey p) throws IOException;
+
+  /**
+   * Remove information about the given project from the cache. It will no longer be returned from
+   * {@link #all()}.
+   */
+  void remove(Project p) throws IOException;
+
+  /**
+   * Remove information about the given project from the cache. It will no longer be returned from
+   * {@link #all()}.
+   */
+  void remove(Project.NameKey name) throws IOException;
+
+  /** @return sorted iteration of projects. */
+  ImmutableSortedSet<Project.NameKey> all();
+
+  /**
+   * @return estimated set of relevant groups extracted from hot project access rules. If the cache
+   *     is cold or too small for the entire project set of the server, this set may be incomplete.
+   */
+  Set<AccountGroup.UUID> guessRelevantGroupUUIDs();
+
+  /**
+   * Filter the set of registered project names by common prefix.
+   *
+   * @param prefix common prefix.
+   * @return sorted iteration of projects sharing the same prefix.
+   */
+  ImmutableSortedSet<Project.NameKey> byName(String prefix);
+
+  /** Notify the cache that a new project was constructed. */
+  void onCreateProject(Project.NameKey newProjectName) throws IOException;
+}
diff --git a/java/com/google/gerrit/server/project/ProjectCacheClock.java b/java/com/google/gerrit/server/project/ProjectCacheClock.java
new file mode 100644
index 0000000..eb451fd
--- /dev/null
+++ b/java/com/google/gerrit/server/project/ProjectCacheClock.java
@@ -0,0 +1,100 @@
+// Copyright (C) 2012 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.google.gerrit.server.project;
+
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.server.config.ConfigUtil;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.logging.LoggingContextAwareScheduledExecutorService;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
+import org.eclipse.jgit.lib.Config;
+
+/** Ticks periodically to force refresh events for {@link ProjectCacheImpl}. */
+@Singleton
+public class ProjectCacheClock implements LifecycleListener {
+  private final Config serverConfig;
+
+  private final AtomicLong generation = new AtomicLong();
+
+  private ScheduledExecutorService executor;
+
+  @Inject
+  public ProjectCacheClock(@GerritServerConfig Config serverConfig) {
+    this.serverConfig = serverConfig;
+  }
+
+  @Override
+  public void start() {
+    long checkFrequencyMillis = checkFrequency(serverConfig);
+
+    if (checkFrequencyMillis == Long.MAX_VALUE) {
+      // Start with generation 1 (to avoid magic 0 below).
+      // Do not begin background thread, disabling the clock.
+      generation.set(1);
+    } else if (10 < checkFrequencyMillis) {
+      // Start with generation 1 (to avoid magic 0 below).
+      generation.set(1);
+      executor =
+          new LoggingContextAwareScheduledExecutorService(
+              Executors.newScheduledThreadPool(
+                  1,
+                  new ThreadFactoryBuilder()
+                      .setNameFormat("ProjectCacheClock-%d")
+                      .setDaemon(true)
+                      .setPriority(Thread.MIN_PRIORITY)
+                      .build()));
+      @SuppressWarnings("unused") // Runnable already handles errors
+      Future<?> possiblyIgnoredError =
+          executor.scheduleAtFixedRate(
+              generation::incrementAndGet,
+              checkFrequencyMillis,
+              checkFrequencyMillis,
+              TimeUnit.MILLISECONDS);
+    } else {
+      // Magic generation 0 triggers ProjectState to always
+      // check on each needsRefresh() request we make to it.
+      generation.set(0);
+    }
+  }
+
+  @Override
+  public void stop() {
+    if (executor != null) {
+      executor.shutdown();
+    }
+  }
+
+  long read() {
+    return generation.get();
+  }
+
+  private static long checkFrequency(Config serverConfig) {
+    String freq = serverConfig.getString("cache", "projects", "checkFrequency");
+    if (freq != null && ("disabled".equalsIgnoreCase(freq) || "off".equalsIgnoreCase(freq))) {
+      return Long.MAX_VALUE;
+    }
+    return TimeUnit.MILLISECONDS.convert(
+        ConfigUtil.getTimeUnit(
+            serverConfig, "cache", "projects", "checkFrequency", 5, TimeUnit.MINUTES),
+        TimeUnit.MINUTES);
+  }
+}
diff --git a/java/com/google/gerrit/server/project/ProjectCacheImpl.java b/java/com/google/gerrit/server/project/ProjectCacheImpl.java
new file mode 100644
index 0000000..8ddeea3
--- /dev/null
+++ b/java/com/google/gerrit/server/project/ProjectCacheImpl.java
@@ -0,0 +1,321 @@
+// Copyright (C) 2008 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.google.gerrit.server.project;
+
+import static java.util.stream.Collectors.toSet;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Throwables;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableSortedSet;
+import com.google.common.collect.Sets;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.index.project.ProjectIndexer;
+import com.google.gerrit.lifecycle.LifecycleModule;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.cache.CacheModule;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.logging.TraceContext;
+import com.google.gerrit.server.logging.TraceContext.TraceTimer;
+import com.google.inject.Inject;
+import com.google.inject.Module;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import com.google.inject.TypeLiteral;
+import com.google.inject.name.Named;
+import java.io.IOException;
+import java.util.Objects;
+import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.Repository;
+
+/** Cache of project information, including access rights. */
+@Singleton
+public class ProjectCacheImpl implements ProjectCache {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static final String CACHE_NAME = "projects";
+
+  private static final String CACHE_LIST = "project_list";
+
+  public static Module module() {
+    return new CacheModule() {
+      @Override
+      protected void configure() {
+        cache(CACHE_NAME, String.class, ProjectState.class).loader(Loader.class);
+
+        cache(CACHE_LIST, ListKey.class, new TypeLiteral<ImmutableSortedSet<Project.NameKey>>() {})
+            .maximumWeight(1)
+            .loader(Lister.class);
+
+        bind(ProjectCacheImpl.class);
+        bind(ProjectCache.class).to(ProjectCacheImpl.class);
+
+        install(
+            new LifecycleModule() {
+              @Override
+              protected void configure() {
+                listener().to(ProjectCacheWarmer.class);
+                listener().to(ProjectCacheClock.class);
+              }
+            });
+      }
+    };
+  }
+
+  private final AllProjectsName allProjectsName;
+  private final AllUsersName allUsersName;
+  private final LoadingCache<String, ProjectState> byName;
+  private final LoadingCache<ListKey, ImmutableSortedSet<Project.NameKey>> list;
+  private final Lock listLock;
+  private final ProjectCacheClock clock;
+  private final Provider<ProjectIndexer> indexer;
+
+  @Inject
+  ProjectCacheImpl(
+      final AllProjectsName allProjectsName,
+      final AllUsersName allUsersName,
+      @Named(CACHE_NAME) LoadingCache<String, ProjectState> byName,
+      @Named(CACHE_LIST) LoadingCache<ListKey, ImmutableSortedSet<Project.NameKey>> list,
+      ProjectCacheClock clock,
+      Provider<ProjectIndexer> indexer) {
+    this.allProjectsName = allProjectsName;
+    this.allUsersName = allUsersName;
+    this.byName = byName;
+    this.list = list;
+    this.listLock = new ReentrantLock(true /* fair */);
+    this.clock = clock;
+    this.indexer = indexer;
+  }
+
+  @Override
+  public ProjectState getAllProjects() {
+    ProjectState state = get(allProjectsName);
+    if (state == null) {
+      // This should never occur, the server must have this
+      // project to process anything.
+      throw new IllegalStateException("Missing project " + allProjectsName);
+    }
+    return state;
+  }
+
+  @Override
+  public ProjectState getAllUsers() {
+    ProjectState state = get(allUsersName);
+    if (state == null) {
+      // This should never occur.
+      throw new IllegalStateException("Missing project " + allUsersName);
+    }
+    return state;
+  }
+
+  @Override
+  public ProjectState get(Project.NameKey projectName) {
+    try {
+      return checkedGet(projectName);
+    } catch (IOException e) {
+      logger.atWarning().withCause(e).log("Cannot read project %s", projectName);
+      return null;
+    }
+  }
+
+  @Override
+  public ProjectState checkedGet(Project.NameKey projectName) throws IOException {
+    if (projectName == null) {
+      return null;
+    }
+    try {
+      return strictCheckedGet(projectName);
+    } catch (Exception e) {
+      if (!(e.getCause() instanceof RepositoryNotFoundException)) {
+        logger.atWarning().withCause(e).log("Cannot read project %s", projectName.get());
+        if (e.getCause() != null) {
+          Throwables.throwIfInstanceOf(e.getCause(), IOException.class);
+        }
+        throw new IOException(e);
+      }
+      logger.atFine().withCause(e).log("Cannot find project %s", projectName.get());
+      return null;
+    }
+  }
+
+  @Override
+  public ProjectState checkedGet(Project.NameKey projectName, boolean strict) throws Exception {
+    return strict ? strictCheckedGet(projectName) : checkedGet(projectName);
+  }
+
+  private ProjectState strictCheckedGet(Project.NameKey projectName) throws Exception {
+    ProjectState state = byName.get(projectName.get());
+    if (state != null && state.needsRefresh(clock.read())) {
+      byName.invalidate(projectName.get());
+      state = byName.get(projectName.get());
+    }
+    return state;
+  }
+
+  @Override
+  public void evict(Project p) throws IOException {
+    evict(p.getNameKey());
+  }
+
+  @Override
+  public void evict(Project.NameKey p) throws IOException {
+    if (p != null) {
+      logger.atFine().log("Evict project '%s'", p.get());
+      byName.invalidate(p.get());
+    }
+    indexer.get().index(p);
+  }
+
+  @Override
+  public void remove(Project p) throws IOException {
+    remove(p.getNameKey());
+  }
+
+  @Override
+  public void remove(Project.NameKey name) throws IOException {
+    listLock.lock();
+    try {
+      list.put(
+          ListKey.ALL,
+          ImmutableSortedSet.copyOf(Sets.difference(list.get(ListKey.ALL), ImmutableSet.of(name))));
+    } catch (ExecutionException e) {
+      logger.atWarning().withCause(e).log("Cannot list available projects");
+    } finally {
+      listLock.unlock();
+    }
+    evict(name);
+  }
+
+  @Override
+  public void onCreateProject(Project.NameKey newProjectName) throws IOException {
+    listLock.lock();
+    try {
+      list.put(
+          ListKey.ALL,
+          ImmutableSortedSet.copyOf(
+              Sets.union(list.get(ListKey.ALL), ImmutableSet.of(newProjectName))));
+    } catch (ExecutionException e) {
+      logger.atWarning().withCause(e).log("Cannot list available projects");
+    } finally {
+      listLock.unlock();
+    }
+    indexer.get().index(newProjectName);
+  }
+
+  @Override
+  public ImmutableSortedSet<Project.NameKey> all() {
+    try {
+      return list.get(ListKey.ALL);
+    } catch (ExecutionException e) {
+      logger.atWarning().withCause(e).log("Cannot list available projects");
+      return ImmutableSortedSet.of();
+    }
+  }
+
+  @Override
+  public Set<AccountGroup.UUID> guessRelevantGroupUUIDs() {
+    return all().stream()
+        .map(n -> byName.getIfPresent(n.get()))
+        .filter(Objects::nonNull)
+        .flatMap(p -> p.getConfig().getAllGroupUUIDs().stream())
+        // getAllGroupUUIDs shouldn't really return null UUIDs, but harden
+        // against them just in case there is a bug or corner case.
+        .filter(id -> id != null && id.get() != null)
+        .collect(toSet());
+  }
+
+  @Override
+  public ImmutableSortedSet<Project.NameKey> byName(String pfx) {
+    Project.NameKey start = new Project.NameKey(pfx);
+    Project.NameKey end = new Project.NameKey(pfx + Character.MAX_VALUE);
+    try {
+      // Right endpoint is exclusive, but U+FFFF is a non-character so no project ends with it.
+      return list.get(ListKey.ALL).subSet(start, end);
+    } catch (ExecutionException e) {
+      logger.atWarning().withCause(e).log("Cannot look up projects for prefix %s", pfx);
+      return ImmutableSortedSet.of();
+    }
+  }
+
+  static class Loader extends CacheLoader<String, ProjectState> {
+    private final ProjectState.Factory projectStateFactory;
+    private final GitRepositoryManager mgr;
+    private final ProjectCacheClock clock;
+
+    @Inject
+    Loader(ProjectState.Factory psf, GitRepositoryManager g, ProjectCacheClock clock) {
+      projectStateFactory = psf;
+      mgr = g;
+      this.clock = clock;
+    }
+
+    @Override
+    public ProjectState load(String projectName) throws Exception {
+      try (TraceTimer timer = TraceContext.newTimer("Loading project %s", projectName)) {
+        long now = clock.read();
+        Project.NameKey key = new Project.NameKey(projectName);
+        try (Repository git = mgr.openRepository(key)) {
+          ProjectConfig cfg = new ProjectConfig(key);
+          cfg.load(key, git);
+
+          ProjectState state = projectStateFactory.create(cfg);
+          state.initLastCheck(now);
+          return state;
+        }
+      }
+    }
+  }
+
+  static class ListKey {
+    static final ListKey ALL = new ListKey();
+
+    private ListKey() {}
+  }
+
+  static class Lister extends CacheLoader<ListKey, ImmutableSortedSet<Project.NameKey>> {
+    private final GitRepositoryManager mgr;
+
+    @Inject
+    Lister(GitRepositoryManager mgr) {
+      this.mgr = mgr;
+    }
+
+    @Override
+    public ImmutableSortedSet<Project.NameKey> load(ListKey key) throws Exception {
+      try (TraceTimer timer = TraceContext.newTimer("Loading project list")) {
+        return ImmutableSortedSet.copyOf(mgr.list());
+      }
+    }
+  }
+
+  @VisibleForTesting
+  public void evictAllByName() {
+    byName.invalidateAll();
+  }
+
+  @VisibleForTesting
+  public long sizeAllByName() {
+    return byName.size();
+  }
+}
diff --git a/java/com/google/gerrit/server/project/ProjectCacheWarmer.java b/java/com/google/gerrit/server/project/ProjectCacheWarmer.java
new file mode 100644
index 0000000..10cf2de
--- /dev/null
+++ b/java/com/google/gerrit/server/project/ProjectCacheWarmer.java
@@ -0,0 +1,76 @@
+// Copyright (C) 2014 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.google.gerrit.server.project;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.logging.LoggingContextAwareExecutorService;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.lib.Config;
+
+@Singleton
+public class ProjectCacheWarmer implements LifecycleListener {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final Config config;
+  private final ProjectCache cache;
+
+  @Inject
+  ProjectCacheWarmer(@GerritServerConfig Config config, ProjectCache cache) {
+    this.config = config;
+    this.cache = cache;
+  }
+
+  @Override
+  public void start() {
+    int cpus = Runtime.getRuntime().availableProcessors();
+    if (config.getBoolean("cache", "projects", "loadOnStartup", false)) {
+      ExecutorService pool =
+          new LoggingContextAwareExecutorService(
+              new ScheduledThreadPoolExecutor(
+                  config.getInt("cache", "projects", "loadThreads", cpus),
+                  new ThreadFactoryBuilder().setNameFormat("ProjectCacheLoader-%d").build()));
+      Thread scheduler =
+          new Thread(
+              () -> {
+                for (Project.NameKey name : cache.all()) {
+                  pool.execute(() -> cache.get(name));
+                }
+                pool.shutdown();
+                try {
+                  pool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
+                  logger.atInfo().log("Finished loading project cache");
+                } catch (InterruptedException e) {
+                  logger.atWarning().log("Interrupted while waiting for project cache to load");
+                }
+              });
+      scheduler.setName("ProjectCacheWarmer");
+      scheduler.setDaemon(true);
+
+      logger.atInfo().log("Loading project cache");
+      scheduler.start();
+    }
+  }
+
+  @Override
+  public void stop() {}
+}
diff --git a/java/com/google/gerrit/server/project/ProjectConfig.java b/java/com/google/gerrit/server/project/ProjectConfig.java
new file mode 100644
index 0000000..81cc78b
--- /dev/null
+++ b/java/com/google/gerrit/server/project/ProjectConfig.java
@@ -0,0 +1,1483 @@
+// Copyright (C) 2010 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.google.gerrit.server.project;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static com.google.gerrit.common.data.Permission.isPermission;
+import static com.google.gerrit.reviewdb.client.Project.DEFAULT_SUBMIT_TYPE;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.base.CharMatcher;
+import com.google.common.base.Joiner;
+import com.google.common.base.Splitter;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Maps;
+import com.google.common.primitives.Shorts;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.ContributorAgreement;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.data.LabelFunction;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.LabelValue;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.common.data.PermissionRule;
+import com.google.gerrit.common.data.PermissionRule.Action;
+import com.google.gerrit.common.data.RefConfigSection;
+import com.google.gerrit.common.data.SubscribeSection;
+import com.google.gerrit.common.errors.InvalidNameException;
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.extensions.client.ProjectState;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gerrit.server.config.ConfigUtil;
+import com.google.gerrit.server.config.PluginConfig;
+import com.google.gerrit.server.git.BranchOrderSection;
+import com.google.gerrit.server.git.NotifyConfig;
+import com.google.gerrit.server.git.ValidationError;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.git.meta.VersionedMetaData;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.RefSpec;
+
+public class ProjectConfig extends VersionedMetaData implements ValidationError.Sink {
+  public static final String COMMENTLINK = "commentlink";
+  public static final String LABEL = "label";
+  public static final String KEY_FUNCTION = "function";
+  public static final String KEY_DEFAULT_VALUE = "defaultValue";
+  public static final String KEY_COPY_MIN_SCORE = "copyMinScore";
+  public static final String KEY_ALLOW_POST_SUBMIT = "allowPostSubmit";
+  public static final String KEY_IGNORE_SELF_APPROVAL = "ignoreSelfApproval";
+  public static final String KEY_COPY_MAX_SCORE = "copyMaxScore";
+  public static final String KEY_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE =
+      "copyAllScoresOnMergeFirstParentUpdate";
+  public static final String KEY_COPY_ALL_SCORES_ON_TRIVIAL_REBASE = "copyAllScoresOnTrivialRebase";
+  public static final String KEY_COPY_ALL_SCORES_IF_NO_CODE_CHANGE = "copyAllScoresIfNoCodeChange";
+  public static final String KEY_COPY_ALL_SCORES_IF_NO_CHANGE = "copyAllScoresIfNoChange";
+  public static final String KEY_VALUE = "value";
+  public static final String KEY_CAN_OVERRIDE = "canOverride";
+  public static final String KEY_BRANCH = "branch";
+
+  private static final String KEY_MATCH = "match";
+  private static final String KEY_HTML = "html";
+  private static final String KEY_LINK = "link";
+  private static final String KEY_ENABLED = "enabled";
+
+  public static final String PROJECT_CONFIG = "project.config";
+
+  private static final String PROJECT = "project";
+  private static final String KEY_DESCRIPTION = "description";
+
+  public static final String ACCESS = "access";
+  private static final String KEY_INHERIT_FROM = "inheritFrom";
+  private static final String KEY_GROUP_PERMISSIONS = "exclusiveGroupPermissions";
+
+  private static final String ACCOUNTS = "accounts";
+  private static final String KEY_SAME_GROUP_VISIBILITY = "sameGroupVisibility";
+
+  private static final String BRANCH_ORDER = "branchOrder";
+  private static final String BRANCH = "branch";
+
+  private static final String CONTRIBUTOR_AGREEMENT = "contributor-agreement";
+  private static final String KEY_ACCEPTED = "accepted";
+  private static final String KEY_AUTO_VERIFY = "autoVerify";
+  private static final String KEY_AGREEMENT_URL = "agreementUrl";
+
+  private static final String NOTIFY = "notify";
+  private static final String KEY_EMAIL = "email";
+  private static final String KEY_FILTER = "filter";
+  private static final String KEY_TYPE = "type";
+  private static final String KEY_HEADER = "header";
+
+  private static final String CAPABILITY = "capability";
+
+  private static final String RECEIVE = "receive";
+  private static final String KEY_CHECK_RECEIVED_OBJECTS = "checkReceivedObjects";
+
+  private static final String SUBMIT = "submit";
+  private static final String KEY_ACTION = "action";
+  private static final String KEY_STATE = "state";
+
+  private static final String KEY_MAX_OBJECT_SIZE_LIMIT = "maxObjectSizeLimit";
+
+  private static final String SUBSCRIBE_SECTION = "allowSuperproject";
+  private static final String SUBSCRIBE_MATCH_REFS = "matching";
+  private static final String SUBSCRIBE_MULTI_MATCH_REFS = "all";
+
+  private static final String DASHBOARD = "dashboard";
+  private static final String KEY_DEFAULT = "default";
+  private static final String KEY_LOCAL_DEFAULT = "local-default";
+
+  private static final String LEGACY_PERMISSION_PUSH_TAG = "pushTag";
+  private static final String LEGACY_PERMISSION_PUSH_SIGNED_TAG = "pushSignedTag";
+
+  private static final String PLUGIN = "plugin";
+
+  private static final ProjectState DEFAULT_STATE_VALUE = ProjectState.ACTIVE;
+
+  private static final String EXTENSION_PANELS = "extension-panels";
+  private static final String KEY_PANEL = "panel";
+
+  private static final Pattern EXCLUSIVE_PERMISSIONS_SPLIT_PATTERN = Pattern.compile("[, \t]{1,}");
+
+  private Project project;
+  private AccountsSection accountsSection;
+  private GroupList groupList;
+  private Map<String, AccessSection> accessSections;
+  private BranchOrderSection branchOrderSection;
+  private Map<String, ContributorAgreement> contributorAgreements;
+  private Map<String, NotifyConfig> notifySections;
+  private Map<String, LabelType> labelSections;
+  private ConfiguredMimeTypes mimeTypes;
+  private Map<Project.NameKey, SubscribeSection> subscribeSections;
+  private List<CommentLinkInfoImpl> commentLinkSections;
+  private List<ValidationError> validationErrors;
+  private ObjectId rulesId;
+  private long maxObjectSizeLimit;
+  private Map<String, Config> pluginConfigs;
+  private boolean checkReceivedObjects;
+  private Set<String> sectionsWithUnknownPermissions;
+  private boolean hasLegacyPermissions;
+  private Map<String, List<String>> extensionPanelSections;
+  private Map<String, GroupReference> groupsByName;
+
+  public static ProjectConfig read(MetaDataUpdate update)
+      throws IOException, ConfigInvalidException {
+    ProjectConfig r = new ProjectConfig(update.getProjectName());
+    r.load(update);
+    return r;
+  }
+
+  public static ProjectConfig read(MetaDataUpdate update, ObjectId id)
+      throws IOException, ConfigInvalidException {
+    ProjectConfig r = new ProjectConfig(update.getProjectName());
+    r.load(update, id);
+    return r;
+  }
+
+  public static CommentLinkInfoImpl buildCommentLink(Config cfg, String name, boolean allowRaw)
+      throws IllegalArgumentException {
+    String match = cfg.getString(COMMENTLINK, name, KEY_MATCH);
+    if (match != null) {
+      // Unfortunately this validation isn't entirely complete. Clients
+      // can have exceptions trying to evaluate the pattern if they don't
+      // support a token used, even if the server does support the token.
+      //
+      // At the minimum, we can trap problems related to unmatched groups.
+      Pattern.compile(match);
+    }
+
+    String link = cfg.getString(COMMENTLINK, name, KEY_LINK);
+    String html = cfg.getString(COMMENTLINK, name, KEY_HTML);
+    boolean hasHtml = !Strings.isNullOrEmpty(html);
+
+    String rawEnabled = cfg.getString(COMMENTLINK, name, KEY_ENABLED);
+    Boolean enabled;
+    if (rawEnabled != null) {
+      enabled = cfg.getBoolean(COMMENTLINK, name, KEY_ENABLED, true);
+    } else {
+      enabled = null;
+    }
+    checkArgument(allowRaw || !hasHtml, "Raw html replacement not allowed");
+
+    if (Strings.isNullOrEmpty(match)
+        && Strings.isNullOrEmpty(link)
+        && !hasHtml
+        && enabled != null) {
+      if (enabled) {
+        return new CommentLinkInfoImpl.Enabled(name);
+      }
+      return new CommentLinkInfoImpl.Disabled(name);
+    }
+    return new CommentLinkInfoImpl(name, match, link, html, enabled);
+  }
+
+  public void addCommentLinkSection(CommentLinkInfoImpl commentLink) {
+    commentLinkSections.add(commentLink);
+  }
+
+  public ProjectConfig(Project.NameKey projectName) {
+    this.projectName = projectName;
+  }
+
+  public void load(Repository repo) throws IOException, ConfigInvalidException {
+    super.load(projectName, repo);
+  }
+
+  public void load(Repository repo, @Nullable ObjectId revision)
+      throws IOException, ConfigInvalidException {
+    super.load(projectName, repo, revision);
+  }
+
+  public void load(RevWalk rw, @Nullable ObjectId revision)
+      throws IOException, ConfigInvalidException {
+    super.load(projectName, rw, revision);
+  }
+
+  public Project.NameKey getName() {
+    return projectName;
+  }
+
+  public Project getProject() {
+    return project;
+  }
+
+  public AccountsSection getAccountsSection() {
+    return accountsSection;
+  }
+
+  public Map<String, List<String>> getExtensionPanelSections() {
+    return extensionPanelSections;
+  }
+
+  public AccessSection getAccessSection(String name) {
+    return getAccessSection(name, false);
+  }
+
+  public AccessSection getAccessSection(String name, boolean create) {
+    AccessSection as = accessSections.get(name);
+    if (as == null && create) {
+      as = new AccessSection(name);
+      accessSections.put(name, as);
+    }
+    return as;
+  }
+
+  public Collection<AccessSection> getAccessSections() {
+    return sort(accessSections.values());
+  }
+
+  public BranchOrderSection getBranchOrderSection() {
+    return branchOrderSection;
+  }
+
+  public Map<Project.NameKey, SubscribeSection> getSubscribeSections() {
+    return subscribeSections;
+  }
+
+  public Collection<SubscribeSection> getSubscribeSections(Branch.NameKey branch) {
+    Collection<SubscribeSection> ret = new ArrayList<>();
+    for (SubscribeSection s : subscribeSections.values()) {
+      if (s.appliesTo(branch)) {
+        ret.add(s);
+      }
+    }
+    return ret;
+  }
+
+  public void addSubscribeSection(SubscribeSection s) {
+    subscribeSections.put(s.getProject(), s);
+  }
+
+  public void remove(AccessSection section) {
+    if (section != null) {
+      String name = section.getName();
+      if (sectionsWithUnknownPermissions.contains(name)) {
+        AccessSection a = accessSections.get(name);
+        a.setPermissions(new ArrayList<Permission>());
+      } else {
+        accessSections.remove(name);
+      }
+    }
+  }
+
+  public void remove(AccessSection section, Permission permission) {
+    if (permission == null) {
+      remove(section);
+    } else if (section != null) {
+      AccessSection a = accessSections.get(section.getName());
+      a.remove(permission);
+      if (a.getPermissions().isEmpty()) {
+        remove(a);
+      }
+    }
+  }
+
+  public void remove(AccessSection section, Permission permission, PermissionRule rule) {
+    if (rule == null) {
+      remove(section, permission);
+    } else if (section != null && permission != null) {
+      AccessSection a = accessSections.get(section.getName());
+      if (a == null) {
+        return;
+      }
+      Permission p = a.getPermission(permission.getName());
+      if (p == null) {
+        return;
+      }
+      p.remove(rule);
+      if (p.getRules().isEmpty()) {
+        a.remove(permission);
+      }
+      if (a.getPermissions().isEmpty()) {
+        remove(a);
+      }
+    }
+  }
+
+  public void replace(AccessSection section) {
+    for (Permission permission : section.getPermissions()) {
+      for (PermissionRule rule : permission.getRules()) {
+        rule.setGroup(resolve(rule.getGroup()));
+      }
+    }
+
+    accessSections.put(section.getName(), section);
+  }
+
+  public ContributorAgreement getContributorAgreement(String name) {
+    return getContributorAgreement(name, false);
+  }
+
+  public ContributorAgreement getContributorAgreement(String name, boolean create) {
+    ContributorAgreement ca = contributorAgreements.get(name);
+    if (ca == null && create) {
+      ca = new ContributorAgreement(name);
+      contributorAgreements.put(name, ca);
+    }
+    return ca;
+  }
+
+  public Collection<ContributorAgreement> getContributorAgreements() {
+    return sort(contributorAgreements.values());
+  }
+
+  public void remove(ContributorAgreement section) {
+    if (section != null) {
+      accessSections.remove(section.getName());
+    }
+  }
+
+  public void replace(ContributorAgreement section) {
+    section.setAutoVerify(resolve(section.getAutoVerify()));
+    for (PermissionRule rule : section.getAccepted()) {
+      rule.setGroup(resolve(rule.getGroup()));
+    }
+
+    contributorAgreements.put(section.getName(), section);
+  }
+
+  public Collection<NotifyConfig> getNotifyConfigs() {
+    return notifySections.values();
+  }
+
+  public void putNotifyConfig(String name, NotifyConfig nc) {
+    notifySections.put(name, nc);
+  }
+
+  public Map<String, LabelType> getLabelSections() {
+    return labelSections;
+  }
+
+  public Collection<CommentLinkInfoImpl> getCommentLinkSections() {
+    return commentLinkSections;
+  }
+
+  public ConfiguredMimeTypes getMimeTypes() {
+    return mimeTypes;
+  }
+
+  public GroupReference resolve(GroupReference group) {
+    GroupReference groupRef = groupList.resolve(group);
+    if (groupRef != null
+        && groupRef.getUUID() != null
+        && !groupsByName.containsKey(groupRef.getName())) {
+      groupsByName.put(groupRef.getName(), groupRef);
+    }
+    return groupRef;
+  }
+
+  /** @return the group reference, if the group is used by at least one rule. */
+  public GroupReference getGroup(AccountGroup.UUID uuid) {
+    return groupList.byUUID(uuid);
+  }
+
+  /**
+   * @return the group reference corresponding to the specified group name if the group is used by
+   *     at least one rule or plugin value.
+   */
+  public GroupReference getGroup(String groupName) {
+    return groupsByName.get(groupName);
+  }
+
+  /** @return set of all groups used by this configuration. */
+  public Set<AccountGroup.UUID> getAllGroupUUIDs() {
+    return groupList.uuids();
+  }
+
+  /**
+   * @return the project's rules.pl ObjectId, if present in the branch. Null if it doesn't exist.
+   */
+  public ObjectId getRulesId() {
+    return rulesId;
+  }
+
+  /** @return the maxObjectSizeLimit configured on this project, or zero if not configured. */
+  public long getMaxObjectSizeLimit() {
+    return maxObjectSizeLimit;
+  }
+
+  /** @return the checkReceivedObjects for this project, default is true. */
+  public boolean getCheckReceivedObjects() {
+    return checkReceivedObjects;
+  }
+
+  /**
+   * Check all GroupReferences use current group name, repairing stale ones.
+   *
+   * @param groupBackend cache to use when looking up group information by UUID.
+   * @return true if one or more group names was stale.
+   */
+  public boolean updateGroupNames(GroupBackend groupBackend) {
+    boolean dirty = false;
+    for (GroupReference ref : groupList.references()) {
+      GroupDescription.Basic g = groupBackend.get(ref.getUUID());
+      if (g != null && !g.getName().equals(ref.getName())) {
+        dirty = true;
+        ref.setName(g.getName());
+      }
+    }
+    return dirty;
+  }
+
+  /**
+   * Get the validation errors, if any were discovered during load.
+   *
+   * @return list of errors; empty list if there are no errors.
+   */
+  public List<ValidationError> getValidationErrors() {
+    if (validationErrors != null) {
+      return Collections.unmodifiableList(validationErrors);
+    }
+    return Collections.emptyList();
+  }
+
+  @Override
+  protected String getRefName() {
+    return RefNames.REFS_CONFIG;
+  }
+
+  @Override
+  protected void onLoad() throws IOException, ConfigInvalidException {
+    readGroupList();
+    groupsByName = mapGroupReferences();
+
+    rulesId = getObjectId("rules.pl");
+    Config rc = readConfig(PROJECT_CONFIG);
+    project = new Project(projectName);
+
+    Project p = project;
+    p.setDescription(rc.getString(PROJECT, null, KEY_DESCRIPTION));
+    if (p.getDescription() == null) {
+      p.setDescription("");
+    }
+    if (revision != null) {
+      p.setConfigRefState(revision.toObjectId().name());
+    }
+
+    if (rc.getStringList(ACCESS, null, KEY_INHERIT_FROM).length > 1) {
+      // The config must not contain more than one parent to inherit from
+      // as there is no guarantee which of the parents would be used then.
+      error(new ValidationError(PROJECT_CONFIG, "Cannot inherit from multiple projects"));
+    }
+    p.setParentName(rc.getString(ACCESS, null, KEY_INHERIT_FROM));
+
+    for (BooleanProjectConfig config : BooleanProjectConfig.values()) {
+      p.setBooleanConfig(
+          config,
+          getEnum(
+              rc,
+              config.getSection(),
+              config.getSubSection(),
+              config.getName(),
+              InheritableBoolean.INHERIT));
+    }
+
+    p.setMaxObjectSizeLimit(rc.getString(RECEIVE, null, KEY_MAX_OBJECT_SIZE_LIMIT));
+
+    p.setSubmitType(getEnum(rc, SUBMIT, null, KEY_ACTION, DEFAULT_SUBMIT_TYPE));
+    p.setState(getEnum(rc, PROJECT, null, KEY_STATE, DEFAULT_STATE_VALUE));
+
+    p.setDefaultDashboard(rc.getString(DASHBOARD, null, KEY_DEFAULT));
+    p.setLocalDefaultDashboard(rc.getString(DASHBOARD, null, KEY_LOCAL_DEFAULT));
+
+    loadAccountsSection(rc);
+    loadContributorAgreements(rc);
+    loadAccessSections(rc);
+    loadBranchOrderSection(rc);
+    loadNotifySections(rc);
+    loadLabelSections(rc);
+    loadCommentLinkSections(rc);
+    loadSubscribeSections(rc);
+    mimeTypes = new ConfiguredMimeTypes(projectName.get(), rc);
+    loadPluginSections(rc);
+    loadReceiveSection(rc);
+    loadExtensionPanelSections(rc);
+  }
+
+  private void loadAccountsSection(Config rc) {
+    accountsSection = new AccountsSection();
+    accountsSection.setSameGroupVisibility(
+        loadPermissionRules(rc, ACCOUNTS, null, KEY_SAME_GROUP_VISIBILITY, groupsByName, false));
+  }
+
+  private void loadExtensionPanelSections(Config rc) {
+    Map<String, String> lowerNames = Maps.newHashMapWithExpectedSize(2);
+    extensionPanelSections = new LinkedHashMap<>();
+    for (String name : rc.getSubsections(EXTENSION_PANELS)) {
+      String lower = name.toLowerCase();
+      if (lowerNames.containsKey(lower)) {
+        error(
+            new ValidationError(
+                PROJECT_CONFIG,
+                String.format(
+                    "Extension Panels \"%s\" conflicts with \"%s\"", name, lowerNames.get(lower))));
+      }
+      lowerNames.put(lower, name);
+      extensionPanelSections.put(
+          name,
+          new ArrayList<>(Arrays.asList(rc.getStringList(EXTENSION_PANELS, name, KEY_PANEL))));
+    }
+  }
+
+  private void loadContributorAgreements(Config rc) {
+    contributorAgreements = new HashMap<>();
+    for (String name : rc.getSubsections(CONTRIBUTOR_AGREEMENT)) {
+      ContributorAgreement ca = getContributorAgreement(name, true);
+      ca.setDescription(rc.getString(CONTRIBUTOR_AGREEMENT, name, KEY_DESCRIPTION));
+      ca.setAgreementUrl(rc.getString(CONTRIBUTOR_AGREEMENT, name, KEY_AGREEMENT_URL));
+      ca.setAccepted(
+          loadPermissionRules(rc, CONTRIBUTOR_AGREEMENT, name, KEY_ACCEPTED, groupsByName, false));
+
+      List<PermissionRule> rules =
+          loadPermissionRules(
+              rc, CONTRIBUTOR_AGREEMENT, name, KEY_AUTO_VERIFY, groupsByName, false);
+      if (rules.isEmpty()) {
+        ca.setAutoVerify(null);
+      } else if (rules.size() > 1) {
+        error(
+            new ValidationError(
+                PROJECT_CONFIG,
+                "Invalid rule in "
+                    + CONTRIBUTOR_AGREEMENT
+                    + "."
+                    + name
+                    + "."
+                    + KEY_AUTO_VERIFY
+                    + ": at most one group may be set"));
+      } else if (rules.get(0).getAction() != Action.ALLOW) {
+        error(
+            new ValidationError(
+                PROJECT_CONFIG,
+                "Invalid rule in "
+                    + CONTRIBUTOR_AGREEMENT
+                    + "."
+                    + name
+                    + "."
+                    + KEY_AUTO_VERIFY
+                    + ": the group must be allowed"));
+      } else {
+        ca.setAutoVerify(rules.get(0).getGroup());
+      }
+    }
+  }
+
+  /**
+   * Parses the [notify] sections out of the configuration file.
+   *
+   * <pre>
+   *   [notify "reviewers"]
+   *     email = group Reviewers
+   *     type = new_changes
+   *
+   *   [notify "dev-team"]
+   *     email = dev-team@example.com
+   *     filter = branch:master
+   *
+   *   [notify "qa"]
+   *     email = qa@example.com
+   *     filter = branch:\"^(maint|stable)-.*\"
+   *     type = submitted_changes
+   * </pre>
+   */
+  private void loadNotifySections(Config rc) {
+    notifySections = new HashMap<>();
+    for (String sectionName : rc.getSubsections(NOTIFY)) {
+      NotifyConfig n = new NotifyConfig();
+      n.setName(sectionName);
+      n.setFilter(rc.getString(NOTIFY, sectionName, KEY_FILTER));
+
+      EnumSet<NotifyType> types = EnumSet.noneOf(NotifyType.class);
+      types.addAll(ConfigUtil.getEnumList(rc, NOTIFY, sectionName, KEY_TYPE, NotifyType.ALL));
+      n.setTypes(types);
+      n.setHeader(rc.getEnum(NOTIFY, sectionName, KEY_HEADER, NotifyConfig.Header.BCC));
+
+      for (String dst : rc.getStringList(NOTIFY, sectionName, KEY_EMAIL)) {
+        String groupName = GroupReference.extractGroupName(dst);
+        if (groupName != null) {
+          GroupReference ref = groupsByName.get(groupName);
+          if (ref == null) {
+            ref = new GroupReference(null, groupName);
+            groupsByName.put(ref.getName(), ref);
+          }
+          if (ref.getUUID() != null) {
+            n.addEmail(ref);
+          } else {
+            error(
+                new ValidationError(
+                    PROJECT_CONFIG,
+                    "group \"" + ref.getName() + "\" not in " + GroupList.FILE_NAME));
+          }
+        } else if (dst.startsWith("user ")) {
+          error(new ValidationError(PROJECT_CONFIG, dst + " not supported"));
+        } else {
+          try {
+            n.addEmail(Address.parse(dst));
+          } catch (IllegalArgumentException err) {
+            error(
+                new ValidationError(
+                    PROJECT_CONFIG,
+                    "notify section \"" + sectionName + "\" has invalid email \"" + dst + "\""));
+          }
+        }
+      }
+      notifySections.put(sectionName, n);
+    }
+  }
+
+  private void loadAccessSections(Config rc) {
+    accessSections = new HashMap<>();
+    sectionsWithUnknownPermissions = new HashSet<>();
+    for (String refName : rc.getSubsections(ACCESS)) {
+      if (RefConfigSection.isValid(refName) && isValidRegex(refName)) {
+        AccessSection as = getAccessSection(refName, true);
+
+        for (String varName : rc.getStringList(ACCESS, refName, KEY_GROUP_PERMISSIONS)) {
+          for (String n : Splitter.on(EXCLUSIVE_PERMISSIONS_SPLIT_PATTERN).split(varName)) {
+            n = convertLegacyPermission(n);
+            if (isPermission(n)) {
+              as.getPermission(n, true).setExclusiveGroup(true);
+            }
+          }
+        }
+
+        for (String varName : rc.getNames(ACCESS, refName)) {
+          String convertedName = convertLegacyPermission(varName);
+          if (isPermission(convertedName)) {
+            Permission perm = as.getPermission(convertedName, true);
+            loadPermissionRules(
+                rc,
+                ACCESS,
+                refName,
+                varName,
+                groupsByName,
+                perm,
+                Permission.hasRange(convertedName));
+          } else {
+            sectionsWithUnknownPermissions.add(as.getName());
+          }
+        }
+      }
+    }
+
+    AccessSection capability = null;
+    for (String varName : rc.getNames(CAPABILITY)) {
+      if (capability == null) {
+        capability = new AccessSection(AccessSection.GLOBAL_CAPABILITIES);
+        accessSections.put(AccessSection.GLOBAL_CAPABILITIES, capability);
+      }
+      Permission perm = capability.getPermission(varName, true);
+      loadPermissionRules(
+          rc, CAPABILITY, null, varName, groupsByName, perm, GlobalCapability.hasRange(varName));
+    }
+  }
+
+  private boolean isValidRegex(String refPattern) {
+    try {
+      RefPattern.validateRegExp(refPattern);
+    } catch (InvalidNameException e) {
+      error(new ValidationError(PROJECT_CONFIG, "Invalid ref name: " + e.getMessage()));
+      return false;
+    }
+    return true;
+  }
+
+  private void loadBranchOrderSection(Config rc) {
+    if (rc.getSections().contains(BRANCH_ORDER)) {
+      branchOrderSection = new BranchOrderSection(rc.getStringList(BRANCH_ORDER, null, BRANCH));
+    }
+  }
+
+  private ImmutableList<PermissionRule> loadPermissionRules(
+      Config rc,
+      String section,
+      String subsection,
+      String varName,
+      Map<String, GroupReference> groupsByName,
+      boolean useRange) {
+    Permission perm = new Permission(varName);
+    loadPermissionRules(rc, section, subsection, varName, groupsByName, perm, useRange);
+    return ImmutableList.copyOf(perm.getRules());
+  }
+
+  private void loadPermissionRules(
+      Config rc,
+      String section,
+      String subsection,
+      String varName,
+      Map<String, GroupReference> groupsByName,
+      Permission perm,
+      boolean useRange) {
+    for (String ruleString : rc.getStringList(section, subsection, varName)) {
+      PermissionRule rule;
+      try {
+        rule = PermissionRule.fromString(ruleString, useRange);
+      } catch (IllegalArgumentException notRule) {
+        error(
+            new ValidationError(
+                PROJECT_CONFIG,
+                "Invalid rule in "
+                    + section
+                    + (subsection != null ? "." + subsection : "")
+                    + "."
+                    + varName
+                    + ": "
+                    + notRule.getMessage()));
+        continue;
+      }
+
+      GroupReference ref = groupsByName.get(rule.getGroup().getName());
+      if (ref == null) {
+        // The group wasn't mentioned in the groups table, so there is
+        // no valid UUID for it. Pool the reference anyway so at least
+        // all rules in the same file share the same GroupReference.
+        //
+        ref = rule.getGroup();
+        groupsByName.put(ref.getName(), ref);
+        error(
+            new ValidationError(
+                PROJECT_CONFIG, "group \"" + ref.getName() + "\" not in " + GroupList.FILE_NAME));
+      }
+
+      rule.setGroup(ref);
+      perm.add(rule);
+    }
+  }
+
+  private static LabelValue parseLabelValue(String src) {
+    List<String> parts =
+        ImmutableList.copyOf(
+            Splitter.on(CharMatcher.whitespace()).omitEmptyStrings().limit(2).split(src));
+    if (parts.isEmpty()) {
+      throw new IllegalArgumentException("empty value");
+    }
+    String valueText = parts.size() > 1 ? parts.get(1) : "";
+    return new LabelValue(Shorts.checkedCast(PermissionRule.parseInt(parts.get(0))), valueText);
+  }
+
+  private void loadLabelSections(Config rc) {
+    Map<String, String> lowerNames = Maps.newHashMapWithExpectedSize(2);
+    labelSections = new LinkedHashMap<>();
+    for (String name : rc.getSubsections(LABEL)) {
+      String lower = name.toLowerCase();
+      if (lowerNames.containsKey(lower)) {
+        error(
+            new ValidationError(
+                PROJECT_CONFIG,
+                String.format("Label \"%s\" conflicts with \"%s\"", name, lowerNames.get(lower))));
+      }
+      lowerNames.put(lower, name);
+
+      List<LabelValue> values = new ArrayList<>();
+      for (String value : rc.getStringList(LABEL, name, KEY_VALUE)) {
+        try {
+          values.add(parseLabelValue(value));
+        } catch (IllegalArgumentException notValue) {
+          error(
+              new ValidationError(
+                  PROJECT_CONFIG,
+                  String.format(
+                      "Invalid %s \"%s\" for label \"%s\": %s",
+                      KEY_VALUE, value, name, notValue.getMessage())));
+        }
+      }
+
+      LabelType label;
+      try {
+        label = new LabelType(name, values);
+      } catch (IllegalArgumentException badName) {
+        error(new ValidationError(PROJECT_CONFIG, String.format("Invalid label \"%s\"", name)));
+        continue;
+      }
+
+      String functionName = rc.getString(LABEL, name, KEY_FUNCTION);
+      Optional<LabelFunction> function =
+          functionName != null
+              ? LabelFunction.parse(functionName)
+              : Optional.of(LabelFunction.MAX_WITH_BLOCK);
+      if (!function.isPresent()) {
+        error(
+            new ValidationError(
+                PROJECT_CONFIG,
+                String.format(
+                    "Invalid %s for label \"%s\". Valid names are: %s",
+                    KEY_FUNCTION, name, Joiner.on(", ").join(LabelFunction.ALL.keySet()))));
+      }
+      label.setFunction(function.orElse(null));
+
+      if (!values.isEmpty()) {
+        short dv = (short) rc.getInt(LABEL, name, KEY_DEFAULT_VALUE, 0);
+        if (isInRange(dv, values)) {
+          label.setDefaultValue(dv);
+        } else {
+          error(
+              new ValidationError(
+                  PROJECT_CONFIG,
+                  String.format(
+                      "Invalid %s \"%s\" for label \"%s\"", KEY_DEFAULT_VALUE, dv, name)));
+        }
+      }
+      label.setAllowPostSubmit(
+          rc.getBoolean(LABEL, name, KEY_ALLOW_POST_SUBMIT, LabelType.DEF_ALLOW_POST_SUBMIT));
+      label.setIgnoreSelfApproval(
+          rc.getBoolean(LABEL, name, KEY_IGNORE_SELF_APPROVAL, LabelType.DEF_IGNORE_SELF_APPROVAL));
+      label.setCopyMinScore(
+          rc.getBoolean(LABEL, name, KEY_COPY_MIN_SCORE, LabelType.DEF_COPY_MIN_SCORE));
+      label.setCopyMaxScore(
+          rc.getBoolean(LABEL, name, KEY_COPY_MAX_SCORE, LabelType.DEF_COPY_MAX_SCORE));
+      label.setCopyAllScoresOnMergeFirstParentUpdate(
+          rc.getBoolean(
+              LABEL,
+              name,
+              KEY_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE,
+              LabelType.DEF_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE));
+      label.setCopyAllScoresOnTrivialRebase(
+          rc.getBoolean(
+              LABEL,
+              name,
+              KEY_COPY_ALL_SCORES_ON_TRIVIAL_REBASE,
+              LabelType.DEF_COPY_ALL_SCORES_ON_TRIVIAL_REBASE));
+      label.setCopyAllScoresIfNoCodeChange(
+          rc.getBoolean(
+              LABEL,
+              name,
+              KEY_COPY_ALL_SCORES_IF_NO_CODE_CHANGE,
+              LabelType.DEF_COPY_ALL_SCORES_IF_NO_CODE_CHANGE));
+      label.setCopyAllScoresIfNoChange(
+          rc.getBoolean(
+              LABEL,
+              name,
+              KEY_COPY_ALL_SCORES_IF_NO_CHANGE,
+              LabelType.DEF_COPY_ALL_SCORES_IF_NO_CHANGE));
+      label.setCanOverride(
+          rc.getBoolean(LABEL, name, KEY_CAN_OVERRIDE, LabelType.DEF_CAN_OVERRIDE));
+      label.setRefPatterns(getStringListOrNull(rc, LABEL, name, KEY_BRANCH));
+      labelSections.put(name, label);
+    }
+  }
+
+  private boolean isInRange(short value, List<LabelValue> labelValues) {
+    for (LabelValue lv : labelValues) {
+      if (lv.getValue() == value) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  private List<String> getStringListOrNull(
+      Config rc, String section, String subSection, String name) {
+    String[] ac = rc.getStringList(section, subSection, name);
+    return ac.length == 0 ? null : Arrays.asList(ac);
+  }
+
+  private void loadCommentLinkSections(Config rc) {
+    Set<String> subsections = rc.getSubsections(COMMENTLINK);
+    commentLinkSections = new ArrayList<>(subsections.size());
+    for (String name : subsections) {
+      try {
+        commentLinkSections.add(buildCommentLink(rc, name, false));
+      } catch (PatternSyntaxException e) {
+        error(
+            new ValidationError(
+                PROJECT_CONFIG,
+                String.format(
+                    "Invalid pattern \"%s\" in commentlink.%s.match: %s",
+                    rc.getString(COMMENTLINK, name, KEY_MATCH), name, e.getMessage())));
+      } catch (IllegalArgumentException e) {
+        error(
+            new ValidationError(
+                PROJECT_CONFIG,
+                String.format(
+                    "Error in pattern \"%s\" in commentlink.%s.match: %s",
+                    rc.getString(COMMENTLINK, name, KEY_MATCH), name, e.getMessage())));
+      }
+    }
+  }
+
+  private void loadSubscribeSections(Config rc) throws ConfigInvalidException {
+    Set<String> subsections = rc.getSubsections(SUBSCRIBE_SECTION);
+    subscribeSections = new HashMap<>();
+    try {
+      for (String projectName : subsections) {
+        Project.NameKey p = new Project.NameKey(projectName);
+        SubscribeSection ss = new SubscribeSection(p);
+        for (String s :
+            rc.getStringList(SUBSCRIBE_SECTION, projectName, SUBSCRIBE_MULTI_MATCH_REFS)) {
+          ss.addMultiMatchRefSpec(s);
+        }
+        for (String s : rc.getStringList(SUBSCRIBE_SECTION, projectName, SUBSCRIBE_MATCH_REFS)) {
+          ss.addMatchingRefSpec(s);
+        }
+        subscribeSections.put(p, ss);
+      }
+    } catch (IllegalArgumentException e) {
+      throw new ConfigInvalidException(e.getMessage());
+    }
+  }
+
+  private void loadReceiveSection(Config rc) {
+    checkReceivedObjects = rc.getBoolean(RECEIVE, KEY_CHECK_RECEIVED_OBJECTS, true);
+    maxObjectSizeLimit = rc.getLong(RECEIVE, null, KEY_MAX_OBJECT_SIZE_LIMIT, 0);
+  }
+
+  private void loadPluginSections(Config rc) {
+    pluginConfigs = new HashMap<>();
+    for (String plugin : rc.getSubsections(PLUGIN)) {
+      Config pluginConfig = new Config();
+      pluginConfigs.put(plugin, pluginConfig);
+      for (String name : rc.getNames(PLUGIN, plugin)) {
+        String value = rc.getString(PLUGIN, plugin, name);
+        String groupName = GroupReference.extractGroupName(value);
+        if (groupName != null) {
+          GroupReference ref = groupsByName.get(groupName);
+          if (ref == null) {
+            error(
+                new ValidationError(
+                    PROJECT_CONFIG, "group \"" + groupName + "\" not in " + GroupList.FILE_NAME));
+          }
+          rc.setString(PLUGIN, plugin, name, value);
+        }
+        pluginConfig.setStringList(
+            PLUGIN, plugin, name, Arrays.asList(rc.getStringList(PLUGIN, plugin, name)));
+      }
+    }
+  }
+
+  public PluginConfig getPluginConfig(String pluginName) {
+    Config pluginConfig = pluginConfigs.get(pluginName);
+    if (pluginConfig == null) {
+      pluginConfig = new Config();
+      pluginConfigs.put(pluginName, pluginConfig);
+    }
+    return new PluginConfig(pluginName, pluginConfig, this);
+  }
+
+  private void readGroupList() throws IOException {
+    groupList = GroupList.parse(projectName, readUTF8(GroupList.FILE_NAME), this);
+  }
+
+  private Map<String, GroupReference> mapGroupReferences() {
+    Collection<GroupReference> references = groupList.references();
+    Map<String, GroupReference> result = new HashMap<>(references.size());
+    for (GroupReference ref : references) {
+      result.put(ref.getName(), ref);
+    }
+
+    return result;
+  }
+
+  @Override
+  protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException {
+    if (commit.getMessage() == null || "".equals(commit.getMessage())) {
+      commit.setMessage("Updated project configuration\n");
+    }
+
+    Config rc = readConfig(PROJECT_CONFIG);
+    Project p = project;
+
+    if (p.getDescription() != null && !p.getDescription().isEmpty()) {
+      rc.setString(PROJECT, null, KEY_DESCRIPTION, p.getDescription());
+    } else {
+      rc.unset(PROJECT, null, KEY_DESCRIPTION);
+    }
+    set(rc, ACCESS, null, KEY_INHERIT_FROM, p.getParentName());
+
+    for (BooleanProjectConfig config : BooleanProjectConfig.values()) {
+      set(
+          rc,
+          config.getSection(),
+          config.getSubSection(),
+          config.getName(),
+          p.getBooleanConfig(config),
+          InheritableBoolean.INHERIT);
+    }
+
+    set(
+        rc,
+        RECEIVE,
+        null,
+        KEY_MAX_OBJECT_SIZE_LIMIT,
+        validMaxObjectSizeLimit(p.getMaxObjectSizeLimit()));
+
+    set(rc, SUBMIT, null, KEY_ACTION, p.getConfiguredSubmitType(), DEFAULT_SUBMIT_TYPE);
+
+    set(rc, PROJECT, null, KEY_STATE, p.getState(), DEFAULT_STATE_VALUE);
+
+    set(rc, DASHBOARD, null, KEY_DEFAULT, p.getDefaultDashboard());
+    set(rc, DASHBOARD, null, KEY_LOCAL_DEFAULT, p.getLocalDefaultDashboard());
+
+    Set<AccountGroup.UUID> keepGroups = new HashSet<>();
+    saveAccountsSection(rc, keepGroups);
+    saveContributorAgreements(rc, keepGroups);
+    saveAccessSections(rc, keepGroups);
+    saveNotifySections(rc, keepGroups);
+    savePluginSections(rc, keepGroups);
+    groupList.retainUUIDs(keepGroups);
+    saveLabelSections(rc);
+    saveCommentLinkSections(rc);
+    saveSubscribeSections(rc);
+
+    saveConfig(PROJECT_CONFIG, rc);
+    saveGroupList();
+    return true;
+  }
+
+  public static String validMaxObjectSizeLimit(String value) throws ConfigInvalidException {
+    if (value == null) {
+      return null;
+    }
+    value = value.trim();
+    if (value.isEmpty()) {
+      return null;
+    }
+    Config cfg = new Config();
+    cfg.fromText("[s]\nn=" + value);
+    try {
+      long s = cfg.getLong("s", "n", 0);
+      if (s < 0) {
+        throw new ConfigInvalidException(
+            String.format(
+                "Negative value '%s' not allowed as %s", value, KEY_MAX_OBJECT_SIZE_LIMIT));
+      }
+      if (s == 0) {
+        // return null for the default so that it is not persisted
+        return null;
+      }
+      return value;
+    } catch (IllegalArgumentException e) {
+      throw new ConfigInvalidException(
+          String.format("Value '%s' not parseable as a Long", value), e);
+    }
+  }
+
+  private void saveAccountsSection(Config rc, Set<AccountGroup.UUID> keepGroups) {
+    if (accountsSection != null) {
+      rc.setStringList(
+          ACCOUNTS,
+          null,
+          KEY_SAME_GROUP_VISIBILITY,
+          ruleToStringList(accountsSection.getSameGroupVisibility(), keepGroups));
+    }
+  }
+
+  private void saveCommentLinkSections(Config rc) {
+    if (commentLinkSections != null) {
+      for (CommentLinkInfoImpl cm : commentLinkSections) {
+        rc.setString(COMMENTLINK, cm.name, KEY_MATCH, cm.match);
+        if (!Strings.isNullOrEmpty(cm.html)) {
+          rc.setString(COMMENTLINK, cm.name, KEY_HTML, cm.html);
+        }
+        if (!Strings.isNullOrEmpty(cm.link)) {
+          rc.setString(COMMENTLINK, cm.name, KEY_LINK, cm.link);
+        }
+        if (cm.enabled != null && !cm.enabled) {
+          rc.setBoolean(COMMENTLINK, cm.name, KEY_ENABLED, cm.enabled);
+        }
+      }
+    }
+  }
+
+  private void saveContributorAgreements(Config rc, Set<AccountGroup.UUID> keepGroups) {
+    for (ContributorAgreement ca : sort(contributorAgreements.values())) {
+      set(rc, CONTRIBUTOR_AGREEMENT, ca.getName(), KEY_DESCRIPTION, ca.getDescription());
+      set(rc, CONTRIBUTOR_AGREEMENT, ca.getName(), KEY_AGREEMENT_URL, ca.getAgreementUrl());
+
+      if (ca.getAutoVerify() != null) {
+        if (ca.getAutoVerify().getUUID() != null) {
+          keepGroups.add(ca.getAutoVerify().getUUID());
+        }
+        String autoVerify = new PermissionRule(ca.getAutoVerify()).asString(false);
+        set(rc, CONTRIBUTOR_AGREEMENT, ca.getName(), KEY_AUTO_VERIFY, autoVerify);
+      } else {
+        rc.unset(CONTRIBUTOR_AGREEMENT, ca.getName(), KEY_AUTO_VERIFY);
+      }
+
+      rc.setStringList(
+          CONTRIBUTOR_AGREEMENT,
+          ca.getName(),
+          KEY_ACCEPTED,
+          ruleToStringList(ca.getAccepted(), keepGroups));
+    }
+  }
+
+  private void saveNotifySections(Config rc, Set<AccountGroup.UUID> keepGroups) {
+    for (NotifyConfig nc : sort(notifySections.values())) {
+      nc.getGroups().stream()
+          .map(gr -> gr.getUUID())
+          .filter(Objects::nonNull)
+          .forEach(keepGroups::add);
+      List<String> email =
+          nc.getGroups().stream()
+              .map(gr -> new PermissionRule(gr).asString(false))
+              .sorted()
+              .collect(toList());
+
+      // Separate stream operation so that emails list contains 2 sorted sub-lists.
+      nc.getAddresses().stream().map(Address::toString).sorted().forEach(email::add);
+
+      set(rc, NOTIFY, nc.getName(), KEY_HEADER, nc.getHeader(), NotifyConfig.Header.BCC);
+      if (email.isEmpty()) {
+        rc.unset(NOTIFY, nc.getName(), KEY_EMAIL);
+      } else {
+        rc.setStringList(NOTIFY, nc.getName(), KEY_EMAIL, email);
+      }
+
+      if (nc.getNotify().equals(EnumSet.of(NotifyType.ALL))) {
+        rc.unset(NOTIFY, nc.getName(), KEY_TYPE);
+      } else {
+        List<String> types = new ArrayList<>(4);
+        for (NotifyType t : NotifyType.values()) {
+          if (nc.isNotify(t)) {
+            types.add(t.name().toLowerCase(Locale.US));
+          }
+        }
+        rc.setStringList(NOTIFY, nc.getName(), KEY_TYPE, types);
+      }
+
+      set(rc, NOTIFY, nc.getName(), KEY_FILTER, nc.getFilter());
+    }
+  }
+
+  private List<String> ruleToStringList(
+      List<PermissionRule> list, Set<AccountGroup.UUID> keepGroups) {
+    List<String> rules = new ArrayList<>();
+    for (PermissionRule rule : sort(list)) {
+      if (rule.getGroup().getUUID() != null) {
+        keepGroups.add(rule.getGroup().getUUID());
+      }
+      rules.add(rule.asString(false));
+    }
+    return rules;
+  }
+
+  private void saveAccessSections(Config rc, Set<AccountGroup.UUID> keepGroups) {
+    AccessSection capability = accessSections.get(AccessSection.GLOBAL_CAPABILITIES);
+    if (capability != null) {
+      Set<String> have = new HashSet<>();
+      for (Permission permission : sort(capability.getPermissions())) {
+        have.add(permission.getName().toLowerCase());
+
+        boolean needRange = GlobalCapability.hasRange(permission.getName());
+        List<String> rules = new ArrayList<>();
+        for (PermissionRule rule : sort(permission.getRules())) {
+          GroupReference group = resolve(rule.getGroup());
+          if (group.getUUID() != null) {
+            keepGroups.add(group.getUUID());
+          }
+          rules.add(rule.asString(needRange));
+        }
+        rc.setStringList(CAPABILITY, null, permission.getName(), rules);
+      }
+      for (String varName : rc.getNames(CAPABILITY)) {
+        if (!have.contains(varName.toLowerCase())) {
+          rc.unset(CAPABILITY, null, varName);
+        }
+      }
+    } else {
+      rc.unsetSection(CAPABILITY, null);
+    }
+
+    for (AccessSection as : sort(accessSections.values())) {
+      String refName = as.getName();
+      if (AccessSection.GLOBAL_CAPABILITIES.equals(refName)) {
+        continue;
+      }
+
+      StringBuilder doNotInherit = new StringBuilder();
+      for (Permission perm : sort(as.getPermissions())) {
+        if (perm.getExclusiveGroup()) {
+          if (0 < doNotInherit.length()) {
+            doNotInherit.append(' ');
+          }
+          doNotInherit.append(perm.getName());
+        }
+      }
+      if (0 < doNotInherit.length()) {
+        rc.setString(ACCESS, refName, KEY_GROUP_PERMISSIONS, doNotInherit.toString());
+      } else {
+        rc.unset(ACCESS, refName, KEY_GROUP_PERMISSIONS);
+      }
+
+      Set<String> have = new HashSet<>();
+      for (Permission permission : sort(as.getPermissions())) {
+        have.add(permission.getName().toLowerCase());
+
+        boolean needRange = Permission.hasRange(permission.getName());
+        List<String> rules = new ArrayList<>();
+        for (PermissionRule rule : sort(permission.getRules())) {
+          GroupReference group = resolve(rule.getGroup());
+          if (group.getUUID() != null) {
+            keepGroups.add(group.getUUID());
+          }
+          rules.add(rule.asString(needRange));
+        }
+        rc.setStringList(ACCESS, refName, permission.getName(), rules);
+      }
+
+      for (String varName : rc.getNames(ACCESS, refName)) {
+        if (isPermission(convertLegacyPermission(varName))
+            && !have.contains(varName.toLowerCase())) {
+          rc.unset(ACCESS, refName, varName);
+        }
+      }
+    }
+
+    for (String name : rc.getSubsections(ACCESS)) {
+      if (RefConfigSection.isValid(name) && !accessSections.containsKey(name)) {
+        rc.unsetSection(ACCESS, name);
+      }
+    }
+  }
+
+  private void saveLabelSections(Config rc) {
+    List<String> existing = new ArrayList<>(rc.getSubsections(LABEL));
+    if (!new ArrayList<>(labelSections.keySet()).equals(existing)) {
+      // Order of sections changed, remove and rewrite them all.
+      for (String name : existing) {
+        rc.unsetSection(LABEL, name);
+      }
+    }
+
+    Set<String> toUnset = new HashSet<>(existing);
+    for (Map.Entry<String, LabelType> e : labelSections.entrySet()) {
+      String name = e.getKey();
+      LabelType label = e.getValue();
+      toUnset.remove(name);
+      rc.setString(LABEL, name, KEY_FUNCTION, label.getFunction().getFunctionName());
+      rc.setInt(LABEL, name, KEY_DEFAULT_VALUE, label.getDefaultValue());
+
+      setBooleanConfigKey(
+          rc,
+          LABEL,
+          name,
+          KEY_ALLOW_POST_SUBMIT,
+          label.allowPostSubmit(),
+          LabelType.DEF_ALLOW_POST_SUBMIT);
+      setBooleanConfigKey(
+          rc,
+          LABEL,
+          name,
+          KEY_IGNORE_SELF_APPROVAL,
+          label.ignoreSelfApproval(),
+          LabelType.DEF_IGNORE_SELF_APPROVAL);
+      setBooleanConfigKey(
+          rc,
+          LABEL,
+          name,
+          KEY_COPY_MIN_SCORE,
+          label.isCopyMinScore(),
+          LabelType.DEF_COPY_MIN_SCORE);
+      setBooleanConfigKey(
+          rc,
+          LABEL,
+          name,
+          KEY_COPY_MAX_SCORE,
+          label.isCopyMaxScore(),
+          LabelType.DEF_COPY_MAX_SCORE);
+      setBooleanConfigKey(
+          rc,
+          LABEL,
+          name,
+          KEY_COPY_ALL_SCORES_ON_TRIVIAL_REBASE,
+          label.isCopyAllScoresOnTrivialRebase(),
+          LabelType.DEF_COPY_ALL_SCORES_ON_TRIVIAL_REBASE);
+      setBooleanConfigKey(
+          rc,
+          LABEL,
+          name,
+          KEY_COPY_ALL_SCORES_IF_NO_CODE_CHANGE,
+          label.isCopyAllScoresIfNoCodeChange(),
+          LabelType.DEF_COPY_ALL_SCORES_IF_NO_CODE_CHANGE);
+      setBooleanConfigKey(
+          rc,
+          LABEL,
+          name,
+          KEY_COPY_ALL_SCORES_IF_NO_CHANGE,
+          label.isCopyAllScoresIfNoChange(),
+          LabelType.DEF_COPY_ALL_SCORES_IF_NO_CHANGE);
+      setBooleanConfigKey(
+          rc,
+          LABEL,
+          name,
+          KEY_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE,
+          label.isCopyAllScoresOnMergeFirstParentUpdate(),
+          LabelType.DEF_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE);
+      setBooleanConfigKey(
+          rc, LABEL, name, KEY_CAN_OVERRIDE, label.canOverride(), LabelType.DEF_CAN_OVERRIDE);
+      List<String> values = new ArrayList<>(label.getValues().size());
+      for (LabelValue value : label.getValues()) {
+        values.add(value.format().trim());
+      }
+      rc.setStringList(LABEL, name, KEY_VALUE, values);
+
+      List<String> refPatterns = label.getRefPatterns();
+      if (refPatterns != null && !refPatterns.isEmpty()) {
+        rc.setStringList(LABEL, name, KEY_BRANCH, refPatterns);
+      }
+    }
+
+    for (String name : toUnset) {
+      rc.unsetSection(LABEL, name);
+    }
+  }
+
+  private static void setBooleanConfigKey(
+      Config rc, String section, String name, String key, boolean value, boolean defaultValue) {
+    if (value == defaultValue) {
+      rc.unset(section, name, key);
+    } else {
+      rc.setBoolean(section, name, key, value);
+    }
+  }
+
+  private void savePluginSections(Config rc, Set<AccountGroup.UUID> keepGroups) {
+    List<String> existing = new ArrayList<>(rc.getSubsections(PLUGIN));
+    for (String name : existing) {
+      rc.unsetSection(PLUGIN, name);
+    }
+
+    for (Entry<String, Config> e : pluginConfigs.entrySet()) {
+      String plugin = e.getKey();
+      Config pluginConfig = e.getValue();
+      for (String name : pluginConfig.getNames(PLUGIN, plugin)) {
+        String value = pluginConfig.getString(PLUGIN, plugin, name);
+        String groupName = GroupReference.extractGroupName(value);
+        if (groupName != null) {
+          GroupReference ref = groupsByName.get(groupName);
+          if (ref != null && ref.getUUID() != null) {
+            keepGroups.add(ref.getUUID());
+            pluginConfig.setString(PLUGIN, plugin, name, "group " + ref.getName());
+          }
+        }
+        rc.setStringList(
+            PLUGIN, plugin, name, Arrays.asList(pluginConfig.getStringList(PLUGIN, plugin, name)));
+      }
+    }
+  }
+
+  private void saveGroupList() throws IOException {
+    saveUTF8(GroupList.FILE_NAME, groupList.asText());
+  }
+
+  private void saveSubscribeSections(Config rc) {
+    for (Project.NameKey p : subscribeSections.keySet()) {
+      SubscribeSection s = subscribeSections.get(p);
+      List<String> matchings = new ArrayList<>();
+      for (RefSpec r : s.getMatchingRefSpecs()) {
+        matchings.add(r.toString());
+      }
+      rc.setStringList(SUBSCRIBE_SECTION, p.get(), SUBSCRIBE_MATCH_REFS, matchings);
+
+      List<String> multimatchs = new ArrayList<>();
+      for (RefSpec r : s.getMultiMatchRefSpecs()) {
+        multimatchs.add(r.toString());
+      }
+      rc.setStringList(SUBSCRIBE_SECTION, p.get(), SUBSCRIBE_MULTI_MATCH_REFS, multimatchs);
+    }
+  }
+
+  private <E extends Enum<?>> E getEnum(
+      Config rc, String section, String subsection, String name, E defaultValue) {
+    try {
+      return rc.getEnum(section, subsection, name, defaultValue);
+    } catch (IllegalArgumentException err) {
+      error(new ValidationError(PROJECT_CONFIG, err.getMessage()));
+      return defaultValue;
+    }
+  }
+
+  @Override
+  public void error(ValidationError error) {
+    if (validationErrors == null) {
+      validationErrors = new ArrayList<>(4);
+    }
+    validationErrors.add(error);
+  }
+
+  private static <T extends Comparable<? super T>> ImmutableList<T> sort(Collection<T> m) {
+    return m.stream().sorted().collect(toImmutableList());
+  }
+
+  public boolean hasLegacyPermissions() {
+    return hasLegacyPermissions;
+  }
+
+  private String convertLegacyPermission(String permissionName) {
+    switch (permissionName) {
+      case LEGACY_PERMISSION_PUSH_TAG:
+        hasLegacyPermissions = true;
+        return Permission.CREATE_TAG;
+      case LEGACY_PERMISSION_PUSH_SIGNED_TAG:
+        hasLegacyPermissions = true;
+        return Permission.CREATE_SIGNED_TAG;
+      default:
+        return permissionName;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/project/ProjectHierarchyIterator.java b/java/com/google/gerrit/server/project/ProjectHierarchyIterator.java
new file mode 100644
index 0000000..27bde72
--- /dev/null
+++ b/java/com/google/gerrit/server/project/ProjectHierarchyIterator.java
@@ -0,0 +1,102 @@
+// Copyright (C) 2013 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.google.gerrit.server.project;
+
+import com.google.common.base.Joiner;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.config.AllProjectsName;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Set;
+
+/**
+ * Iterates from a project up through its parents to All-Projects.
+ *
+ * <p>If a cycle is detected the cycle is broken and All-Projects is visited.
+ */
+class ProjectHierarchyIterator implements Iterator<ProjectState> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final ProjectCache cache;
+  private final AllProjectsName allProjectsName;
+  private final Set<Project.NameKey> seen;
+  private ProjectState next;
+
+  ProjectHierarchyIterator(ProjectCache c, AllProjectsName all, ProjectState firstResult) {
+    cache = c;
+    allProjectsName = all;
+
+    seen = Sets.newLinkedHashSet();
+    seen.add(firstResult.getNameKey());
+    next = firstResult;
+  }
+
+  @Override
+  public boolean hasNext() {
+    return next != null;
+  }
+
+  @Override
+  public ProjectState next() {
+    ProjectState n = next;
+    if (n == null) {
+      throw new NoSuchElementException();
+    }
+    next = computeNext(n);
+    return n;
+  }
+
+  private ProjectState computeNext(ProjectState n) {
+    Project.NameKey parentName = n.getProject().getParent();
+    if (parentName != null && visit(parentName)) {
+      ProjectState p = cache.get(parentName);
+      if (p != null) {
+        return p;
+      }
+    }
+
+    // Parent does not exist or was already visited.
+    // Fall back to visit All-Projects exactly once.
+    if (seen.add(allProjectsName)) {
+      return cache.get(allProjectsName);
+    }
+    return null;
+  }
+
+  private boolean visit(Project.NameKey parentName) {
+    if (seen.add(parentName)) {
+      return true;
+    }
+
+    List<String> order = Lists.newArrayListWithCapacity(seen.size() + 1);
+    for (Project.NameKey p : seen) {
+      order.add(p.get());
+    }
+    int idx = order.lastIndexOf(parentName.get());
+    order.add(parentName.get());
+    logger.atWarning().log(
+        "Cycle detected in projects: %s", Joiner.on(" -> ").join(order.subList(idx, order.size())));
+    return false;
+  }
+
+  @Override
+  public void remove() {
+    throw new UnsupportedOperationException();
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectJson.java b/java/com/google/gerrit/server/project/ProjectJson.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectJson.java
rename to java/com/google/gerrit/server/project/ProjectJson.java
diff --git a/java/com/google/gerrit/server/project/ProjectLevelConfig.java b/java/com/google/gerrit/server/project/ProjectLevelConfig.java
new file mode 100644
index 0000000..961d1fc
--- /dev/null
+++ b/java/com/google/gerrit/server/project/ProjectLevelConfig.java
@@ -0,0 +1,139 @@
+// Copyright (C) 2013 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.google.gerrit.server.project;
+
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Streams;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.git.meta.VersionedMetaData;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Set;
+import java.util.stream.Stream;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Config;
+
+/** Configuration file in the projects refs/meta/config branch. */
+public class ProjectLevelConfig extends VersionedMetaData {
+  private final String fileName;
+  private final ProjectState project;
+  private Config cfg;
+
+  public ProjectLevelConfig(String fileName, ProjectState project) {
+    this.fileName = fileName;
+    this.project = project;
+  }
+
+  @Override
+  protected String getRefName() {
+    return RefNames.REFS_CONFIG;
+  }
+
+  @Override
+  protected void onLoad() throws IOException, ConfigInvalidException {
+    cfg = readConfig(fileName);
+  }
+
+  public Config get() {
+    if (cfg == null) {
+      cfg = new Config();
+    }
+    return cfg;
+  }
+
+  public Config getWithInheritance() {
+    return getWithInheritance(false);
+  }
+
+  /**
+   * Get a Config that includes the values from all parent projects.
+   *
+   * <p>Merging means that matching sections/subsection will be merged to include the values from
+   * both parent and child config.
+   *
+   * <p>No merging means that matching sections/subsections in the child project will replace the
+   * corresponding value from the parent.
+   *
+   * @param merge whether to merge parent values with child values or not.
+   * @return a combined config.
+   */
+  public Config getWithInheritance(boolean merge) {
+    Config cfgWithInheritance = new Config();
+    try {
+      cfgWithInheritance.fromText(get().toText());
+    } catch (ConfigInvalidException e) {
+      // cannot happen
+    }
+    ProjectState parent = Iterables.getFirst(project.parents(), null);
+    if (parent != null) {
+      Config parentCfg = parent.getConfig(fileName).getWithInheritance();
+      for (String section : parentCfg.getSections()) {
+        Set<String> allNames = get().getNames(section);
+        for (String name : parentCfg.getNames(section)) {
+          String[] parentValues = parentCfg.getStringList(section, null, name);
+          if (!allNames.contains(name)) {
+            cfgWithInheritance.setStringList(section, null, name, Arrays.asList(parentValues));
+          } else if (merge) {
+            cfgWithInheritance.setStringList(
+                section,
+                null,
+                name,
+                Stream.concat(
+                        Arrays.stream(cfg.getStringList(section, null, name)),
+                        Arrays.stream(parentValues))
+                    .sorted()
+                    .distinct()
+                    .collect(toList()));
+          }
+        }
+
+        for (String subsection : parentCfg.getSubsections(section)) {
+          allNames = get().getNames(section, subsection);
+          for (String name : parentCfg.getNames(section, subsection)) {
+            String[] parentValues = parentCfg.getStringList(section, subsection, name);
+            if (!allNames.contains(name)) {
+              cfgWithInheritance.setStringList(
+                  section, subsection, name, Arrays.asList(parentValues));
+            } else if (merge) {
+              cfgWithInheritance.setStringList(
+                  section,
+                  subsection,
+                  name,
+                  Streams.concat(
+                          Arrays.stream(cfg.getStringList(section, subsection, name)),
+                          Arrays.stream(parentValues))
+                      .sorted()
+                      .distinct()
+                      .collect(toList()));
+            }
+          }
+        }
+      }
+    }
+    return cfgWithInheritance;
+  }
+
+  @Override
+  protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException {
+    if (commit.getMessage() == null || "".equals(commit.getMessage())) {
+      commit.setMessage("Updated configuration\n");
+    }
+    saveConfig(fileName, cfg);
+    return true;
+  }
+}
diff --git a/java/com/google/gerrit/server/project/ProjectNameLockManager.java b/java/com/google/gerrit/server/project/ProjectNameLockManager.java
new file mode 100644
index 0000000..4666c32
--- /dev/null
+++ b/java/com/google/gerrit/server/project/ProjectNameLockManager.java
@@ -0,0 +1,22 @@
+// Copyright (C) 2017 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.google.gerrit.server.project;
+
+import com.google.gerrit.reviewdb.client.Project;
+import java.util.concurrent.locks.Lock;
+
+public interface ProjectNameLockManager {
+  public Lock getLock(Project.NameKey name);
+}
diff --git a/java/com/google/gerrit/server/project/ProjectResource.java b/java/com/google/gerrit/server/project/ProjectResource.java
new file mode 100644
index 0000000..22b7bd9
--- /dev/null
+++ b/java/com/google/gerrit/server/project/ProjectResource.java
@@ -0,0 +1,55 @@
+// Copyright (C) 2012 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.google.gerrit.server.project;
+
+import com.google.gerrit.extensions.restapi.RestResource;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.CurrentUser;
+import com.google.inject.TypeLiteral;
+
+public class ProjectResource implements RestResource {
+  public static final TypeLiteral<RestView<ProjectResource>> PROJECT_KIND =
+      new TypeLiteral<RestView<ProjectResource>>() {};
+
+  private final ProjectState projectState;
+  private final CurrentUser user;
+
+  public ProjectResource(ProjectState projectState, CurrentUser user) {
+    this.projectState = projectState;
+    this.user = user;
+  }
+
+  ProjectResource(ProjectResource rsrc) {
+    this.projectState = rsrc.getProjectState();
+    this.user = rsrc.getUser();
+  }
+
+  public String getName() {
+    return projectState.getName();
+  }
+
+  public Project.NameKey getNameKey() {
+    return projectState.getNameKey();
+  }
+
+  public ProjectState getProjectState() {
+    return projectState;
+  }
+
+  public CurrentUser getUser() {
+    return user;
+  }
+}
diff --git a/java/com/google/gerrit/server/project/ProjectState.java b/java/com/google/gerrit/server/project/ProjectState.java
new file mode 100644
index 0000000..75ce483
--- /dev/null
+++ b/java/com/google/gerrit/server/project/ProjectState.java
@@ -0,0 +1,660 @@
+// Copyright (C) 2008 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.google.gerrit.server.project;
+
+import static com.google.gerrit.common.data.PermissionRule.Action.ALLOW;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.LabelTypes;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.common.data.PermissionRule;
+import com.google.gerrit.common.data.RefConfigSection;
+import com.google.gerrit.common.data.SubscribeSection;
+import com.google.gerrit.extensions.api.projects.CommentLinkInfo;
+import com.google.gerrit.extensions.api.projects.ThemeInfo;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.index.project.ProjectData;
+import com.google.gerrit.metrics.Description;
+import com.google.gerrit.metrics.Description.Units;
+import com.google.gerrit.metrics.Field;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.metrics.Timer1;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.account.CapabilityCollection;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.git.BranchOrderSection;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.TransferConfig;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+
+/** Cached information on a project. */
+public class ProjectState {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public interface Factory {
+    ProjectState create(ProjectConfig config);
+  }
+
+  private final boolean isAllProjects;
+  private final boolean isAllUsers;
+  private final SitePaths sitePaths;
+  private final AllProjectsName allProjectsName;
+  private final ProjectCache projectCache;
+  private final GitRepositoryManager gitMgr;
+  private final List<CommentLinkInfo> commentLinks;
+
+  private final ProjectConfig config;
+  private final Map<String, ProjectLevelConfig> configs;
+  private final Set<AccountGroup.UUID> localOwners;
+  private final long globalMaxObjectSizeLimit;
+  private final boolean inheritProjectMaxObjectSizeLimit;
+
+  // TODO(hiesel): Remove this once we got production data
+  private final Timer1<String> computationLatency;
+
+  /** Last system time the configuration's revision was examined. */
+  private volatile long lastCheckGeneration;
+
+  /** Local access sections, wrapped in SectionMatchers for faster evaluation. */
+  private volatile List<SectionMatcher> localAccessSections;
+
+  // TODO(dborowitz): Delete when the GWT UI gets deleted; in the meantime, don't bother with any
+  // refactoring.
+  /** Theme information loaded from site_path/themes. */
+  private volatile ThemeInfo theme;
+
+  /** If this is all projects, the capabilities used by the server. */
+  private final CapabilityCollection capabilities;
+
+  /** All label types applicable to changes in this project. */
+  private LabelTypes labelTypes;
+
+  @Inject
+  public ProjectState(
+      SitePaths sitePaths,
+      ProjectCache projectCache,
+      AllProjectsName allProjectsName,
+      AllUsersName allUsersName,
+      GitRepositoryManager gitMgr,
+      List<CommentLinkInfo> commentLinks,
+      CapabilityCollection.Factory limitsFactory,
+      TransferConfig transferConfig,
+      MetricMaker metricMaker,
+      @Assisted ProjectConfig config) {
+    this.sitePaths = sitePaths;
+    this.projectCache = projectCache;
+    this.isAllProjects = config.getProject().getNameKey().equals(allProjectsName);
+    this.isAllUsers = config.getProject().getNameKey().equals(allUsersName);
+    this.allProjectsName = allProjectsName;
+    this.gitMgr = gitMgr;
+    this.commentLinks = commentLinks;
+    this.config = config;
+    this.configs = new HashMap<>();
+    this.capabilities =
+        isAllProjects
+            ? limitsFactory.create(config.getAccessSection(AccessSection.GLOBAL_CAPABILITIES))
+            : null;
+    this.globalMaxObjectSizeLimit = transferConfig.getMaxObjectSizeLimit();
+    this.inheritProjectMaxObjectSizeLimit = transferConfig.inheritProjectMaxObjectSizeLimit();
+
+    this.computationLatency =
+        metricMaker.newTimer(
+            "permissions/project_state/computation_latency",
+            new Description("Latency for access computations in ProjectState")
+                .setCumulative()
+                .setUnit(Units.NANOSECONDS),
+            Field.ofString("method"));
+
+    if (isAllProjects && !Permission.canBeOnAllProjects(AccessSection.ALL, Permission.OWNER)) {
+      localOwners = Collections.emptySet();
+    } else {
+      HashSet<AccountGroup.UUID> groups = new HashSet<>();
+      AccessSection all = config.getAccessSection(AccessSection.ALL);
+      if (all != null) {
+        Permission owner = all.getPermission(Permission.OWNER);
+        if (owner != null) {
+          for (PermissionRule rule : owner.getRules()) {
+            GroupReference ref = rule.getGroup();
+            if (rule.getAction() == ALLOW && ref.getUUID() != null) {
+              groups.add(ref.getUUID());
+            }
+          }
+        }
+      }
+      localOwners = Collections.unmodifiableSet(groups);
+    }
+  }
+
+  void initLastCheck(long generation) {
+    lastCheckGeneration = generation;
+  }
+
+  boolean needsRefresh(long generation) {
+    if (generation <= 0) {
+      return isRevisionOutOfDate();
+    }
+    if (lastCheckGeneration != generation) {
+      lastCheckGeneration = generation;
+      return isRevisionOutOfDate();
+    }
+    return false;
+  }
+
+  private boolean isRevisionOutOfDate() {
+    try (Repository git = gitMgr.openRepository(getNameKey())) {
+      Ref ref = git.getRefDatabase().exactRef(RefNames.REFS_CONFIG);
+      if (ref == null || ref.getObjectId() == null) {
+        return true;
+      }
+      return !ref.getObjectId().equals(config.getRevision());
+    } catch (IOException gone) {
+      return true;
+    }
+  }
+
+  /**
+   * @return cached computation of all global capabilities. This should only be invoked on the state
+   *     from {@link ProjectCache#getAllProjects()}. Null on any other project.
+   */
+  public CapabilityCollection getCapabilityCollection() {
+    return capabilities;
+  }
+
+  /**
+   * Returns true if the Prolog engine is expected to run for this project, that is if this project
+   * or a parent possesses a rules.pl file.
+   */
+  public boolean hasPrologRules() {
+    // We check if this project has a rules.pl file
+    if (getConfig().getRulesId() != null) {
+      return true;
+    }
+
+    // If not, we check the parents.
+    return parents().stream()
+        .map(ProjectState::getConfig)
+        .map(ProjectConfig::getRulesId)
+        .anyMatch(Objects::nonNull);
+  }
+
+  public Project getProject() {
+    return config.getProject();
+  }
+
+  public Project.NameKey getNameKey() {
+    return getProject().getNameKey();
+  }
+
+  public String getName() {
+    return getNameKey().get();
+  }
+
+  public ProjectConfig getConfig() {
+    return config;
+  }
+
+  public ProjectLevelConfig getConfig(String fileName) {
+    if (configs.containsKey(fileName)) {
+      return configs.get(fileName);
+    }
+
+    ProjectLevelConfig cfg = new ProjectLevelConfig(fileName, this);
+    try (Repository git = gitMgr.openRepository(getNameKey())) {
+      cfg.load(getNameKey(), git, config.getRevision());
+    } catch (IOException | ConfigInvalidException e) {
+      logger.atWarning().withCause(e).log("Failed to load %s for %s", fileName, getName());
+    }
+
+    configs.put(fileName, cfg);
+    return cfg;
+  }
+
+  public long getMaxObjectSizeLimit() {
+    return config.getMaxObjectSizeLimit();
+  }
+
+  public boolean statePermitsRead() {
+    return getProject().getState().permitsRead();
+  }
+
+  public void checkStatePermitsRead() throws ResourceConflictException {
+    if (!statePermitsRead()) {
+      throw new ResourceConflictException(
+          "project state " + getProject().getState().name() + " does not permit read");
+    }
+  }
+
+  public boolean statePermitsWrite() {
+    return getProject().getState().permitsWrite();
+  }
+
+  public void checkStatePermitsWrite() throws ResourceConflictException {
+    if (!statePermitsWrite()) {
+      throw new ResourceConflictException(
+          "project state " + getProject().getState().name() + " does not permit write");
+    }
+  }
+
+  public static class EffectiveMaxObjectSizeLimit {
+    public long value;
+    public String summary;
+  }
+
+  private static final String MAY_NOT_SET = "This project may not set a higher limit.";
+
+  @VisibleForTesting
+  public static final String INHERITED_FROM_PARENT = "Inherited from parent project '%s'.";
+
+  @VisibleForTesting
+  public static final String OVERRIDDEN_BY_PARENT =
+      "Overridden by parent project '%s'. " + MAY_NOT_SET;
+
+  @VisibleForTesting
+  public static final String INHERITED_FROM_GLOBAL = "Inherited from the global config.";
+
+  @VisibleForTesting
+  public static final String OVERRIDDEN_BY_GLOBAL =
+      "Overridden by the global config. " + MAY_NOT_SET;
+
+  public EffectiveMaxObjectSizeLimit getEffectiveMaxObjectSizeLimit() {
+    EffectiveMaxObjectSizeLimit result = new EffectiveMaxObjectSizeLimit();
+
+    result.value = config.getMaxObjectSizeLimit();
+
+    if (inheritProjectMaxObjectSizeLimit) {
+      for (ProjectState parent : parents()) {
+        long parentValue = parent.config.getMaxObjectSizeLimit();
+        if (parentValue > 0 && result.value > 0) {
+          if (parentValue < result.value) {
+            result.value = parentValue;
+            result.summary = String.format(OVERRIDDEN_BY_PARENT, parent.config.getName());
+          }
+        } else if (parentValue > 0) {
+          result.value = parentValue;
+          result.summary = String.format(INHERITED_FROM_PARENT, parent.config.getName());
+        }
+      }
+    }
+
+    if (globalMaxObjectSizeLimit > 0 && result.value > 0) {
+      if (globalMaxObjectSizeLimit < result.value) {
+        result.value = globalMaxObjectSizeLimit;
+        result.summary = OVERRIDDEN_BY_GLOBAL;
+      }
+    } else if (globalMaxObjectSizeLimit > result.value) {
+      // zero means "no limit", in this case the max is more limiting
+      result.value = globalMaxObjectSizeLimit;
+      result.summary = INHERITED_FROM_GLOBAL;
+    }
+    return result;
+  }
+
+  /** Get the sections that pertain only to this project. */
+  List<SectionMatcher> getLocalAccessSections() {
+    List<SectionMatcher> sm = localAccessSections;
+    if (sm == null) {
+      Collection<AccessSection> fromConfig = config.getAccessSections();
+      sm = new ArrayList<>(fromConfig.size());
+      for (AccessSection section : fromConfig) {
+        if (isAllProjects) {
+          List<Permission> copy = Lists.newArrayListWithCapacity(section.getPermissions().size());
+          for (Permission p : section.getPermissions()) {
+            if (Permission.canBeOnAllProjects(section.getName(), p.getName())) {
+              copy.add(p);
+            }
+          }
+          section = new AccessSection(section.getName());
+          section.setPermissions(copy);
+        }
+
+        SectionMatcher matcher = SectionMatcher.wrap(getNameKey(), section);
+        if (matcher != null) {
+          sm.add(matcher);
+        }
+      }
+      localAccessSections = sm;
+    }
+    return sm;
+  }
+
+  /**
+   * Obtain all local and inherited sections. This collection is looked up dynamically and is not
+   * cached. Callers should try to cache this result per-request as much as possible.
+   */
+  public List<SectionMatcher> getAllSections() {
+    try (Timer1.Context ignored = computationLatency.start("getAllSections")) {
+      if (isAllProjects) {
+        return getLocalAccessSections();
+      }
+
+      List<SectionMatcher> all = new ArrayList<>();
+      Iterable<ProjectState> tree = tree();
+      try (Timer1.Context ignored2 = computationLatency.start("getAllSections-parsing-only")) {
+        for (ProjectState s : tree) {
+          all.addAll(s.getLocalAccessSections());
+        }
+      }
+      return all;
+    }
+  }
+
+  /**
+   * @return all {@link AccountGroup}'s to which the owner privilege for 'refs/*' is assigned for
+   *     this project (the local owners), if there are no local owners the local owners of the
+   *     nearest parent project that has local owners are returned
+   */
+  public Set<AccountGroup.UUID> getOwners() {
+    for (ProjectState p : tree()) {
+      if (!p.localOwners.isEmpty()) {
+        return p.localOwners;
+      }
+    }
+    return Collections.emptySet();
+  }
+
+  /**
+   * @return all {@link AccountGroup}'s that are allowed to administrate the complete project. This
+   *     includes all groups to which the owner privilege for 'refs/*' is assigned for this project
+   *     (the local owners) and all groups to which the owner privilege for 'refs/*' is assigned for
+   *     one of the parent projects (the inherited owners).
+   */
+  public Set<AccountGroup.UUID> getAllOwners() {
+    Set<AccountGroup.UUID> result = new HashSet<>();
+
+    for (ProjectState p : tree()) {
+      result.addAll(p.localOwners);
+    }
+
+    return result;
+  }
+
+  /**
+   * @return an iterable that walks through this project and then the parents of this project.
+   *     Starts from this project and progresses up the hierarchy to All-Projects.
+   */
+  public Iterable<ProjectState> tree() {
+    return new Iterable<ProjectState>() {
+      @Override
+      public Iterator<ProjectState> iterator() {
+        return new ProjectHierarchyIterator(projectCache, allProjectsName, ProjectState.this);
+      }
+    };
+  }
+
+  /**
+   * @return an iterable that walks in-order from All-Projects through the project hierarchy to this
+   *     project.
+   */
+  public Iterable<ProjectState> treeInOrder() {
+    List<ProjectState> projects = Lists.newArrayList(tree());
+    Collections.reverse(projects);
+    return projects;
+  }
+
+  /**
+   * @return an iterable that walks through the parents of this project. Starts from the immediate
+   *     parent of this project and progresses up the hierarchy to All-Projects.
+   */
+  public FluentIterable<ProjectState> parents() {
+    return FluentIterable.from(tree()).skip(1);
+  }
+
+  public boolean isAllProjects() {
+    return isAllProjects;
+  }
+
+  public boolean isAllUsers() {
+    return isAllUsers;
+  }
+
+  public boolean is(BooleanProjectConfig config) {
+    for (ProjectState s : tree()) {
+      switch (s.getProject().getBooleanConfig(config)) {
+        case TRUE:
+          return true;
+        case FALSE:
+          return false;
+        case INHERIT:
+        default:
+          continue;
+      }
+    }
+    return false;
+  }
+
+  /** All available label types. */
+  public LabelTypes getLabelTypes() {
+    if (labelTypes == null) {
+      labelTypes = loadLabelTypes();
+    }
+    return labelTypes;
+  }
+
+  /** All available label types for this change. */
+  public LabelTypes getLabelTypes(ChangeNotes notes) {
+    return getLabelTypes(notes.getChange().getDest());
+  }
+
+  /** All available label types for this branch. */
+  public LabelTypes getLabelTypes(Branch.NameKey destination) {
+    List<LabelType> all = getLabelTypes().getLabelTypes();
+
+    List<LabelType> r = Lists.newArrayListWithCapacity(all.size());
+    for (LabelType l : all) {
+      List<String> refs = l.getRefPatterns();
+      if (refs == null) {
+        r.add(l);
+      } else {
+        for (String refPattern : refs) {
+          if (refPattern.contains("${")) {
+            logger.atWarning().log(
+                "Ref pattern for label %s in project %s contains illegal expanded parameters: %s."
+                    + " Ref pattern will be ignored.",
+                l, getName(), refPattern);
+            continue;
+          }
+
+          if (RefConfigSection.isValid(refPattern) && match(destination, refPattern)) {
+            r.add(l);
+            break;
+          }
+        }
+      }
+    }
+
+    return new LabelTypes(r);
+  }
+
+  public List<CommentLinkInfo> getCommentLinks() {
+    Map<String, CommentLinkInfo> cls = new LinkedHashMap<>();
+    for (CommentLinkInfo cl : commentLinks) {
+      cls.put(cl.name.toLowerCase(), cl);
+    }
+    for (ProjectState s : treeInOrder()) {
+      for (CommentLinkInfoImpl cl : s.getConfig().getCommentLinkSections()) {
+        String name = cl.name.toLowerCase();
+        if (cl.isOverrideOnly()) {
+          CommentLinkInfo parent = cls.get(name);
+          if (parent == null) {
+            continue; // Ignore invalid overrides.
+          }
+          cls.put(name, cl.inherit(parent));
+        } else {
+          cls.put(name, cl);
+        }
+      }
+    }
+    return ImmutableList.copyOf(cls.values());
+  }
+
+  public BranchOrderSection getBranchOrderSection() {
+    for (ProjectState s : tree()) {
+      BranchOrderSection section = s.getConfig().getBranchOrderSection();
+      if (section != null) {
+        return section;
+      }
+    }
+    return null;
+  }
+
+  public Collection<SubscribeSection> getSubscribeSections(Branch.NameKey branch) {
+    Collection<SubscribeSection> ret = new ArrayList<>();
+    for (ProjectState s : tree()) {
+      ret.addAll(s.getConfig().getSubscribeSections(branch));
+    }
+    return ret;
+  }
+
+  public ThemeInfo getTheme() {
+    ThemeInfo theme = this.theme;
+    if (theme == null) {
+      synchronized (this) {
+        theme = this.theme;
+        if (theme == null) {
+          theme = loadTheme();
+          this.theme = theme;
+        }
+      }
+    }
+    if (theme == ThemeInfo.INHERIT) {
+      ProjectState parent = Iterables.getFirst(parents(), null);
+      return parent != null ? parent.getTheme() : null;
+    }
+    return theme;
+  }
+
+  public Set<GroupReference> getAllGroups() {
+    return getGroups(getAllSections());
+  }
+
+  public Set<GroupReference> getLocalGroups() {
+    return getGroups(getLocalAccessSections());
+  }
+
+  public SubmitType getSubmitType() {
+    for (ProjectState s : tree()) {
+      SubmitType t = s.getProject().getConfiguredSubmitType();
+      if (t != SubmitType.INHERIT) {
+        return t;
+      }
+    }
+    return Project.DEFAULT_ALL_PROJECTS_SUBMIT_TYPE;
+  }
+
+  private static Set<GroupReference> getGroups(List<SectionMatcher> sectionMatcherList) {
+    final Set<GroupReference> all = new HashSet<>();
+    for (SectionMatcher matcher : sectionMatcherList) {
+      final AccessSection section = matcher.getSection();
+      for (Permission permission : section.getPermissions()) {
+        for (PermissionRule rule : permission.getRules()) {
+          all.add(rule.getGroup());
+        }
+      }
+    }
+    return all;
+  }
+
+  private ThemeInfo loadTheme() {
+    String name = getConfig().getProject().getName();
+    Path dir = sitePaths.themes_dir.resolve(name);
+    if (!Files.exists(dir)) {
+      return ThemeInfo.INHERIT;
+    } else if (!Files.isDirectory(dir)) {
+      logger.atWarning().log("Bad theme for %s: not a directory", name);
+      return ThemeInfo.INHERIT;
+    }
+    try {
+      return new ThemeInfo(
+          readFile(dir.resolve(SitePaths.CSS_FILENAME)),
+          readFile(dir.resolve(SitePaths.HEADER_FILENAME)),
+          readFile(dir.resolve(SitePaths.FOOTER_FILENAME)));
+    } catch (IOException e) {
+      logger.atSevere().withCause(e).log("Error reading theme for %s", name);
+      return ThemeInfo.INHERIT;
+    }
+  }
+
+  public ProjectData toProjectData() {
+    ProjectData project = null;
+    for (ProjectState state : treeInOrder()) {
+      project = new ProjectData(state.getProject(), Optional.ofNullable(project));
+    }
+    return project;
+  }
+
+  private String readFile(Path p) throws IOException {
+    return Files.exists(p) ? new String(Files.readAllBytes(p), UTF_8) : null;
+  }
+
+  private LabelTypes loadLabelTypes() {
+    Map<String, LabelType> types = new LinkedHashMap<>();
+    for (ProjectState s : treeInOrder()) {
+      for (LabelType type : s.getConfig().getLabelSections().values()) {
+        String lower = type.getName().toLowerCase();
+        LabelType old = types.get(lower);
+        if (old == null || old.canOverride()) {
+          types.put(lower, type);
+        }
+      }
+    }
+    List<LabelType> all = Lists.newArrayListWithCapacity(types.size());
+    for (LabelType type : types.values()) {
+      if (!type.getValues().isEmpty()) {
+        all.add(type);
+      }
+    }
+    return new LabelTypes(Collections.unmodifiableList(all));
+  }
+
+  private boolean match(Branch.NameKey destination, String refPattern) {
+    return RefPatternMatcher.getMatcher(refPattern).match(destination.get(), null);
+  }
+}
diff --git a/java/com/google/gerrit/server/project/ProjectsConsistencyChecker.java b/java/com/google/gerrit/server/project/ProjectsConsistencyChecker.java
new file mode 100644
index 0000000..894037d
--- /dev/null
+++ b/java/com/google/gerrit/server/project/ProjectsConsistencyChecker.java
@@ -0,0 +1,331 @@
+// 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.
+
+package com.google.gerrit.server.project;
+
+import static com.google.gerrit.common.FooterConstants.CHANGE_ID;
+import static com.google.gerrit.index.query.Predicate.and;
+import static com.google.gerrit.index.query.Predicate.or;
+import static com.google.gerrit.server.query.change.ChangeStatusPredicate.open;
+import static java.util.stream.Collectors.toSet;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Strings;
+import com.google.common.base.Throwables;
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.extensions.api.changes.FixInput;
+import com.google.gerrit.extensions.api.projects.CheckProjectInput;
+import com.google.gerrit.extensions.api.projects.CheckProjectInput.AutoCloseableChangesCheckInput;
+import com.google.gerrit.extensions.api.projects.CheckProjectResultInfo;
+import com.google.gerrit.extensions.api.projects.CheckProjectResultInfo.AutoCloseableChangesCheckResult;
+import com.google.gerrit.extensions.client.ListChangesOption;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.index.IndexConfig;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.change.ChangeJson;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.index.change.ChangeField;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.ChangeIdPredicate;
+import com.google.gerrit.server.query.change.CommitPredicate;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gerrit.server.query.change.ProjectPredicate;
+import com.google.gerrit.server.query.change.RefPredicate;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryHelper.ActionType;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevSort;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+@Singleton
+public class ProjectsConsistencyChecker {
+  @VisibleForTesting public static final int AUTO_CLOSE_MAX_COMMITS_LIMIT = 10000;
+
+  private final GitRepositoryManager repoManager;
+  private final RetryHelper retryHelper;
+  private final Provider<InternalChangeQuery> changeQueryProvider;
+  private final ChangeJson.Factory changeJsonFactory;
+  private final IndexConfig indexConfig;
+
+  @Inject
+  ProjectsConsistencyChecker(
+      GitRepositoryManager repoManager,
+      RetryHelper retryHelper,
+      Provider<InternalChangeQuery> changeQueryProvider,
+      ChangeJson.Factory changeJsonFactory,
+      IndexConfig indexConfig) {
+    this.repoManager = repoManager;
+    this.retryHelper = retryHelper;
+    this.changeQueryProvider = changeQueryProvider;
+    this.changeJsonFactory = changeJsonFactory;
+    this.indexConfig = indexConfig;
+  }
+
+  public CheckProjectResultInfo check(Project.NameKey projectName, CheckProjectInput input)
+      throws IOException, OrmException, RestApiException {
+    CheckProjectResultInfo r = new CheckProjectResultInfo();
+    if (input.autoCloseableChangesCheck != null) {
+      r.autoCloseableChangesCheckResult =
+          checkForAutoCloseableChanges(projectName, input.autoCloseableChangesCheck);
+    }
+    return r;
+  }
+
+  private AutoCloseableChangesCheckResult checkForAutoCloseableChanges(
+      Project.NameKey projectName, AutoCloseableChangesCheckInput input)
+      throws IOException, OrmException, RestApiException {
+    AutoCloseableChangesCheckResult r = new AutoCloseableChangesCheckResult();
+    if (Strings.isNullOrEmpty(input.branch)) {
+      throw new BadRequestException("branch is required");
+    }
+
+    boolean fix = input.fix != null ? input.fix : false;
+
+    if (input.maxCommits != null && input.maxCommits > AUTO_CLOSE_MAX_COMMITS_LIMIT) {
+      throw new BadRequestException(
+          "max commits can at most be set to " + AUTO_CLOSE_MAX_COMMITS_LIMIT);
+    }
+    int maxCommits = input.maxCommits != null ? input.maxCommits : AUTO_CLOSE_MAX_COMMITS_LIMIT;
+
+    // Result that we want to return to the client.
+    List<ChangeInfo> autoCloseableChanges = new ArrayList<>();
+
+    // Remember the change IDs of all changes that we already included into the result, so that we
+    // can avoid including the same change twice.
+    Set<Change.Id> seenChanges = new HashSet<>();
+
+    try (Repository repo = repoManager.openRepository(projectName);
+        RevWalk rw = new RevWalk(repo)) {
+      String branch = RefNames.fullName(input.branch);
+      Ref ref = repo.exactRef(branch);
+      if (ref == null) {
+        throw new UnprocessableEntityException(
+            String.format("branch '%s' not found", input.branch));
+      }
+
+      rw.reset();
+      rw.markStart(rw.parseCommit(ref.getObjectId()));
+      rw.sort(RevSort.TOPO);
+      rw.sort(RevSort.REVERSE);
+
+      // Cache the SHA1's of all merged commits. We need this for knowing which commit merged the
+      // change when auto-closing changes by commit.
+      List<ObjectId> mergedSha1s = new ArrayList<>();
+
+      // Cache the Change-Id to commit SHA1 mapping for all Change-Id's that we find in merged
+      // commits. We need this for knowing which commit merged the change when auto-closing
+      // changes by Change-Id.
+      Map<Change.Key, ObjectId> changeIdToMergedSha1 = new HashMap<>();
+
+      // Base predicate which is fixed for every change query.
+      Predicate<ChangeData> basePredicate =
+          and(new ProjectPredicate(projectName.get()), new RefPredicate(branch), open());
+
+      int maxLeafPredicates = indexConfig.maxTerms() - basePredicate.getLeafCount();
+
+      // List of predicates by which we want to find open changes for the branch. These predicates
+      // will be combined with the 'or' operator.
+      List<Predicate<ChangeData>> predicates = new ArrayList<>(maxLeafPredicates);
+
+      RevCommit commit;
+      int skippedCommits = 0;
+      int walkedCommits = 0;
+      while ((commit = rw.next()) != null) {
+        if (input.skipCommits != null && skippedCommits < input.skipCommits) {
+          skippedCommits++;
+          continue;
+        }
+
+        if (walkedCommits >= maxCommits) {
+          break;
+        }
+        walkedCommits++;
+
+        ObjectId commitId = commit.copy();
+        mergedSha1s.add(commitId);
+
+        // Consider all Change-Id lines since this is what ReceiveCommits#autoCloseChanges does.
+        List<String> changeIds = commit.getFooterLines(CHANGE_ID);
+
+        // Number of predicates that we need to add for this commit, 1 per Change-Id plus one for
+        // the commit.
+        int newPredicatesCount = changeIds.size() + 1;
+
+        // We accumulated the max number of query terms that can be used in one query, execute
+        // the query and start a new one.
+        if (predicates.size() + newPredicatesCount > maxLeafPredicates) {
+          autoCloseableChanges.addAll(
+              executeQueryAndAutoCloseChanges(
+                  basePredicate, seenChanges, predicates, fix, changeIdToMergedSha1, mergedSha1s));
+          mergedSha1s.clear();
+          changeIdToMergedSha1.clear();
+          predicates.clear();
+
+          if (newPredicatesCount > maxLeafPredicates) {
+            // Whee, a single commit generates more than maxLeafPredicates predicates. Give up.
+            throw new ResourceConflictException(
+                String.format(
+                    "commit %s contains more Change-Ids than we can handle", commit.name()));
+          }
+        }
+
+        changeIds.forEach(
+            changeId -> {
+              // It can happen that there are multiple merged commits with the same Change-Id
+              // footer (e.g. if a change was cherry-picked to a stable branch stable branch which
+              // then got merged back into master, or just by directly pushing several commits
+              // with the same Change-Id). In this case it is hard to say which of the commits
+              // should be used to auto-close an open change with the same Change-Id (and branch).
+              // Possible approaches are:
+              // 1. use the oldest commit with that Change-Id to auto-close the change
+              // 2. use the newest commit with that Change-Id to auto-close the change
+              // Possibility 1. has the disadvantage that the commit may have been merged before
+              // the change was created in which case it is strange how it could auto-close the
+              // change. Also this strategy would require to walk all commits since otherwise we
+              // cannot be sure that we have seen the oldest commit with that Change-Id.
+              // Possibility 2 has the disadvantage that it doesn't produce the same result as if
+              // auto-closing on push would have worked, since on direct push the first commit with
+              // a Change-Id of an open change would have closed that change. Also for this we
+              // would need to consider all commits that are skipped.
+              // Since both possibilities are not perfect and require extra effort we choose the
+              // easiest approach, which is use the newest commit with that Change-Id that we have
+              // seen (this means we ignore skipped commits). This should be okay since the
+              // important thing for callers is that auto-closable changes are closed. Which of the
+              // commits is used to auto-close a change if there are several candidates is of minor
+              // importance and hence can be non-deterministic.
+              Change.Key changeKey = new Change.Key(changeId);
+              if (!changeIdToMergedSha1.containsKey(changeKey)) {
+                changeIdToMergedSha1.put(changeKey, commitId);
+              }
+
+              // Find changes that have a matching Change-Id.
+              predicates.add(new ChangeIdPredicate(changeId));
+            });
+
+        // Find changes that have a matching commit.
+        predicates.add(new CommitPredicate(commit.name()));
+      }
+
+      if (predicates.size() > 0) {
+        // Execute the query with the remaining predicates that were collected.
+        autoCloseableChanges.addAll(
+            executeQueryAndAutoCloseChanges(
+                basePredicate, seenChanges, predicates, fix, changeIdToMergedSha1, mergedSha1s));
+      }
+    }
+
+    r.autoCloseableChanges = autoCloseableChanges;
+    return r;
+  }
+
+  private List<ChangeInfo> executeQueryAndAutoCloseChanges(
+      Predicate<ChangeData> basePredicate,
+      Set<Change.Id> seenChanges,
+      List<Predicate<ChangeData>> predicates,
+      boolean fix,
+      Map<Change.Key, ObjectId> changeIdToMergedSha1,
+      List<ObjectId> mergedSha1s)
+      throws OrmException {
+    if (predicates.isEmpty()) {
+      return ImmutableList.of();
+    }
+
+    try {
+      List<ChangeData> queryResult =
+          retryHelper.execute(
+              ActionType.INDEX_QUERY,
+              () -> {
+                // Execute the query.
+                return changeQueryProvider
+                    .get()
+                    .setRequestedFields(ChangeField.CHANGE, ChangeField.PATCH_SET)
+                    .query(and(basePredicate, or(predicates)));
+              },
+              OrmException.class::isInstance);
+
+      // Result for this query that we want to return to the client.
+      List<ChangeInfo> autoCloseableChangesByBranch = new ArrayList<>();
+
+      for (ChangeData autoCloseableChange : queryResult) {
+        // Skip changes that we have already processed, either by this query or by
+        // earlier queries.
+        if (seenChanges.add(autoCloseableChange.getId())) {
+          retryHelper.execute(
+              ActionType.CHANGE_UPDATE,
+              () -> {
+                // Auto-close by change
+                if (changeIdToMergedSha1.containsKey(autoCloseableChange.change().getKey())) {
+                  autoCloseableChangesByBranch.add(
+                      changeJson(
+                              fix, changeIdToMergedSha1.get(autoCloseableChange.change().getKey()))
+                          .format(autoCloseableChange));
+                  return null;
+                }
+
+                // Auto-close by commit
+                for (ObjectId patchSetSha1 :
+                    autoCloseableChange.patchSets().stream()
+                        .map(ps -> ObjectId.fromString(ps.getRevision().get()))
+                        .collect(toSet())) {
+                  if (mergedSha1s.contains(patchSetSha1)) {
+                    autoCloseableChangesByBranch.add(
+                        changeJson(fix, patchSetSha1).format(autoCloseableChange));
+                    break;
+                  }
+                }
+                return null;
+              },
+              OrmException.class::isInstance);
+        }
+      }
+
+      return autoCloseableChangesByBranch;
+    } catch (Exception e) {
+      Throwables.throwIfUnchecked(e);
+      Throwables.throwIfInstanceOf(e, OrmException.class);
+      throw new OrmException(e);
+    }
+  }
+
+  private ChangeJson changeJson(Boolean fix, ObjectId mergedAs) {
+    ChangeJson changeJson = changeJsonFactory.create(ListChangesOption.CHECK);
+    if (fix != null && fix.booleanValue()) {
+      FixInput fixInput = new FixInput();
+      fixInput.expectMergedAs = mergedAs.name();
+      changeJson.fix(fixInput);
+    }
+    return changeJson;
+  }
+}
diff --git a/java/com/google/gerrit/server/project/Reachable.java b/java/com/google/gerrit/server/project/Reachable.java
new file mode 100644
index 0000000..63fda19
--- /dev/null
+++ b/java/com/google/gerrit/server/project/Reachable.java
@@ -0,0 +1,86 @@
+// Copyright (C) 2017 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.google.gerrit.server.project;
+
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Maps;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.change.IncludedInResolver;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackend.RefFilterOptions;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Map;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefDatabase;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+/**
+ * Report whether a commit is reachable from a set of commits. This is used for checking if a user
+ * has read permissions on a commit.
+ */
+@Singleton
+public class Reachable {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final PermissionBackend permissionBackend;
+
+  @Inject
+  Reachable(PermissionBackend permissionBackend) {
+    this.permissionBackend = permissionBackend;
+  }
+
+  /** @return true if a commit is reachable from a given set of refs. */
+  public boolean fromRefs(
+      Project.NameKey project, Repository repo, RevCommit commit, Map<String, Ref> refs) {
+    try (RevWalk rw = new RevWalk(repo)) {
+      Map<String, Ref> filtered =
+          permissionBackend
+              .currentUser()
+              .project(project)
+              .filter(refs, repo, RefFilterOptions.builder().setFilterTagsSeparately(true).build());
+      return IncludedInResolver.includedInAny(repo, rw, commit, filtered.values());
+    } catch (IOException | PermissionBackendException e) {
+      logger.atSevere().withCause(e).log(
+          "Cannot verify permissions to commit object %s in repository %s", commit.name(), project);
+      return false;
+    }
+  }
+
+  /** @return true if a commit is reachable from a repo's branches and tags. */
+  boolean fromHeadsOrTags(Project.NameKey project, Repository repo, RevCommit commit) {
+    try {
+      RefDatabase refdb = repo.getRefDatabase();
+      Collection<Ref> heads = refdb.getRefsByPrefix(Constants.R_HEADS);
+      Collection<Ref> tags = refdb.getRefsByPrefix(Constants.R_TAGS);
+      Map<String, Ref> refs = Maps.newHashMapWithExpectedSize(heads.size() + tags.size());
+      for (Ref r : Iterables.concat(heads, tags)) {
+        refs.put(r.getName(), r);
+      }
+      return fromRefs(project, repo, commit, refs);
+    } catch (IOException e) {
+      logger.atSevere().withCause(e).log(
+          "Cannot verify permissions to commit object %s in repository %s", commit.name(), project);
+      return false;
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefFilter.java b/java/com/google/gerrit/server/project/RefFilter.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/project/RefFilter.java
rename to java/com/google/gerrit/server/project/RefFilter.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefPattern.java b/java/com/google/gerrit/server/project/RefPattern.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/project/RefPattern.java
rename to java/com/google/gerrit/server/project/RefPattern.java
diff --git a/java/com/google/gerrit/server/project/RefPatternMatcher.java b/java/com/google/gerrit/server/project/RefPatternMatcher.java
new file mode 100644
index 0000000..0e9f03f
--- /dev/null
+++ b/java/com/google/gerrit/server/project/RefPatternMatcher.java
@@ -0,0 +1,165 @@
+// Copyright (C) 2013 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.google.gerrit.server.project;
+
+import static com.google.common.collect.ImmutableSet.toImmutableSet;
+import static com.google.gerrit.server.project.RefPattern.isRE;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Streams;
+import com.google.gerrit.common.data.ParameterizedString;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.CurrentUser;
+import dk.brics.automaton.Automaton;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Pattern;
+import java.util.stream.Stream;
+
+public abstract class RefPatternMatcher {
+  public static RefPatternMatcher getMatcher(String pattern) {
+    if (pattern.contains("${")) {
+      return new ExpandParameters(pattern);
+    } else if (isRE(pattern)) {
+      return new Regexp(pattern);
+    } else if (pattern.endsWith("/*")) {
+      return new Prefix(pattern.substring(0, pattern.length() - 1));
+    } else {
+      return new Exact(pattern);
+    }
+  }
+
+  public abstract boolean match(String ref, CurrentUser user);
+
+  private static class Exact extends RefPatternMatcher {
+    private final String expect;
+
+    Exact(String name) {
+      expect = name;
+    }
+
+    @Override
+    public boolean match(String ref, CurrentUser user) {
+      return expect.equals(ref);
+    }
+  }
+
+  private static class Prefix extends RefPatternMatcher {
+    private final String prefix;
+
+    Prefix(String pfx) {
+      prefix = pfx;
+    }
+
+    @Override
+    public boolean match(String ref, CurrentUser user) {
+      return ref.startsWith(prefix);
+    }
+  }
+
+  private static class Regexp extends RefPatternMatcher {
+    private final Pattern pattern;
+
+    Regexp(String re) {
+      pattern = Pattern.compile(re);
+    }
+
+    @Override
+    public boolean match(String ref, CurrentUser user) {
+      return pattern.matcher(ref).matches();
+    }
+  }
+
+  public static class ExpandParameters extends RefPatternMatcher {
+    private final ParameterizedString template;
+    private final String prefix;
+
+    ExpandParameters(String pattern) {
+      template = new ParameterizedString(pattern);
+
+      if (isRE(pattern)) {
+        // Replace ${username} and ${shardeduserid} with ":PLACEHOLDER:"
+        // as : is not legal in a reference and the string :PLACEHOLDER:
+        // is not likely to be a valid part of the regex. This later
+        // allows the pattern prefix to be clipped, saving time on
+        // evaluation.
+        String replacement = ":PLACEHOLDER:";
+        Map<String, String> params =
+            ImmutableMap.of(
+                RefPattern.USERID_SHARDED, replacement,
+                RefPattern.USERNAME, replacement);
+        Automaton am = RefPattern.toRegExp(template.replace(params)).toAutomaton();
+        String rePrefix = am.getCommonPrefix();
+        prefix = rePrefix.substring(0, rePrefix.indexOf(replacement));
+      } else {
+        prefix = pattern.substring(0, pattern.indexOf("${"));
+      }
+    }
+
+    @Override
+    public boolean match(String ref, CurrentUser user) {
+      if (!ref.startsWith(prefix)) {
+        return false;
+      }
+
+      for (String username : getUsernames(user)) {
+        String u;
+        if (isRE(template.getPattern())) {
+          u = Pattern.quote(username);
+        } else {
+          u = username;
+        }
+
+        Account.Id accountId = user.isIdentifiedUser() ? user.getAccountId() : null;
+        RefPatternMatcher next = getMatcher(expand(template, u, accountId));
+        if (next != null && next.match(expand(ref, u, accountId), user)) {
+          return true;
+        }
+      }
+      return false;
+    }
+
+    private ImmutableSet<String> getUsernames(CurrentUser user) {
+      Stream<String> usernames = Streams.stream(user.getUserName());
+      if (user.isIdentifiedUser()) {
+        usernames = Streams.concat(usernames, user.asIdentifiedUser().getEmailAddresses().stream());
+      }
+      return usernames.collect(toImmutableSet());
+    }
+
+    public boolean matchPrefix(String ref) {
+      return ref.startsWith(prefix);
+    }
+
+    private String expand(String parameterizedRef, String userName, Account.Id accountId) {
+      if (parameterizedRef.contains("${")) {
+        return expand(new ParameterizedString(parameterizedRef), userName, accountId);
+      }
+      return parameterizedRef;
+    }
+
+    private String expand(
+        ParameterizedString parameterizedRef, String userName, Account.Id accountId) {
+      Map<String, String> params = new HashMap<>();
+      params.put(RefPattern.USERNAME, userName);
+      if (accountId != null) {
+        params.put(RefPattern.USERID_SHARDED, RefNames.shard(accountId.get()));
+      }
+      return parameterizedRef.replace(params);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/project/RefResource.java b/java/com/google/gerrit/server/project/RefResource.java
new file mode 100644
index 0000000..ac2735d
--- /dev/null
+++ b/java/com/google/gerrit/server/project/RefResource.java
@@ -0,0 +1,30 @@
+// 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.
+
+package com.google.gerrit.server.project;
+
+import com.google.gerrit.server.CurrentUser;
+
+public abstract class RefResource extends ProjectResource {
+
+  public RefResource(ProjectState projectState, CurrentUser user) {
+    super(projectState, user);
+  }
+
+  /** @return the ref's name */
+  public abstract String getRef();
+
+  /** @return the ref's revision */
+  public abstract String getRevision();
+}
diff --git a/java/com/google/gerrit/server/project/RefUtil.java b/java/com/google/gerrit/server/project/RefUtil.java
new file mode 100644
index 0000000..9f1fa4a
--- /dev/null
+++ b/java/com/google/gerrit/server/project/RefUtil.java
@@ -0,0 +1,132 @@
+// 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.
+
+package com.google.gerrit.server.project;
+
+import static org.eclipse.jgit.lib.Constants.R_REFS;
+import static org.eclipse.jgit.lib.Constants.R_TAGS;
+
+import com.google.common.collect.Iterables;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import java.io.IOException;
+import java.util.Collections;
+import org.eclipse.jgit.errors.IncorrectObjectTypeException;
+import org.eclipse.jgit.errors.MissingObjectException;
+import org.eclipse.jgit.errors.RevisionSyntaxException;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefDatabase;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.ObjectWalk;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+public class RefUtil {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private RefUtil() {}
+
+  public static ObjectId parseBaseRevision(
+      Repository repo, Project.NameKey projectName, String baseRevision)
+      throws InvalidRevisionException {
+    try {
+      ObjectId revid = repo.resolve(baseRevision);
+      if (revid == null) {
+        throw new InvalidRevisionException();
+      }
+      return revid;
+    } catch (IOException err) {
+      logger.atSevere().withCause(err).log(
+          "Cannot resolve \"%s\" in project \"%s\"", baseRevision, projectName.get());
+      throw new InvalidRevisionException();
+    } catch (RevisionSyntaxException err) {
+      logger.atSevere().withCause(err).log("Invalid revision syntax \"%s\"", baseRevision);
+      throw new InvalidRevisionException();
+    }
+  }
+
+  public static RevWalk verifyConnected(Repository repo, ObjectId revid)
+      throws InvalidRevisionException {
+    try {
+      ObjectWalk rw = new ObjectWalk(repo);
+      try {
+        rw.markStart(rw.parseCommit(revid));
+      } catch (IncorrectObjectTypeException err) {
+        throw new InvalidRevisionException();
+      }
+      RefDatabase refDb = repo.getRefDatabase();
+      Iterable<Ref> refs =
+          Iterables.concat(
+              refDb.getRefsByPrefix(Constants.R_HEADS), refDb.getRefsByPrefix(Constants.R_TAGS));
+      Ref rc = refDb.exactRef(RefNames.REFS_CONFIG);
+      if (rc != null) {
+        refs = Iterables.concat(refs, Collections.singleton(rc));
+      }
+      for (Ref r : refs) {
+        try {
+          rw.markUninteresting(rw.parseAny(r.getObjectId()));
+        } catch (MissingObjectException err) {
+          continue;
+        }
+      }
+      rw.checkConnectivity();
+      return rw;
+    } catch (IncorrectObjectTypeException | MissingObjectException err) {
+      throw new InvalidRevisionException();
+    } catch (IOException err) {
+      logger.atSevere().withCause(err).log(
+          "Repository \"%s\" may be corrupt; suggest running git fsck", repo.getDirectory());
+      throw new InvalidRevisionException();
+    }
+  }
+
+  public static String getRefPrefix(String refName) {
+    int i = refName.lastIndexOf('/');
+    if (i > Constants.R_HEADS.length() - 1) {
+      return refName.substring(0, i);
+    }
+    return Constants.R_HEADS;
+  }
+
+  public static String normalizeTagRef(String tag) throws BadRequestException {
+    String result = tag;
+    while (result.startsWith("/")) {
+      result = result.substring(1);
+    }
+    if (result.startsWith(R_REFS) && !result.startsWith(R_TAGS)) {
+      throw new BadRequestException("invalid tag name \"" + result + "\"");
+    }
+    if (!result.startsWith(R_TAGS)) {
+      result = R_TAGS + result;
+    }
+    if (!Repository.isValidRefName(result)) {
+      throw new BadRequestException("invalid tag name \"" + result + "\"");
+    }
+    return result;
+  }
+
+  /** Error indicating the revision is invalid as supplied. */
+  public static class InvalidRevisionException extends Exception {
+    private static final long serialVersionUID = 1L;
+
+    public static final String MESSAGE = "Invalid Revision";
+
+    InvalidRevisionException() {
+      super(MESSAGE);
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefValidationHelper.java b/java/com/google/gerrit/server/project/RefValidationHelper.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/project/RefValidationHelper.java
rename to java/com/google/gerrit/server/project/RefValidationHelper.java
diff --git a/java/com/google/gerrit/server/project/RemoveReviewerControl.java b/java/com/google/gerrit/server/project/RemoveReviewerControl.java
new file mode 100644
index 0000000..df98f5e
--- /dev/null
+++ b/java/com/google/gerrit/server/project/RemoveReviewerControl.java
@@ -0,0 +1,150 @@
+// Copyright (C) 2017 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.google.gerrit.server.project;
+
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@Singleton
+public class RemoveReviewerControl {
+  private final PermissionBackend permissionBackend;
+  private final Provider<ReviewDb> dbProvider;
+
+  @Inject
+  RemoveReviewerControl(PermissionBackend permissionBackend, Provider<ReviewDb> dbProvider) {
+    this.permissionBackend = permissionBackend;
+    this.dbProvider = dbProvider;
+  }
+
+  /**
+   * Checks if removing the given reviewer and patch set approval is OK.
+   *
+   * @throws AuthException if this user is not allowed to remove this approval.
+   * @throws PermissionBackendException on failure of permission checks.
+   */
+  public void checkRemoveReviewer(
+      ChangeNotes notes, CurrentUser currentUser, PatchSetApproval approval)
+      throws PermissionBackendException, AuthException {
+    checkRemoveReviewer(notes, currentUser, approval.getAccountId(), approval.getValue());
+  }
+
+  /**
+   * Checks if removing the given reviewer is OK. Does not check if removing any approvals the
+   * reviewer might have given is OK.
+   *
+   * @throws AuthException if this user is not allowed to remove this approval.
+   * @throws PermissionBackendException on failure of permission checks.
+   */
+  public void checkRemoveReviewer(ChangeNotes notes, CurrentUser currentUser, Account.Id reviewer)
+      throws PermissionBackendException, AuthException {
+    checkRemoveReviewer(notes, currentUser, reviewer, 0);
+  }
+
+  /** @return true if the user is allowed to remove this reviewer. */
+  public boolean testRemoveReviewer(
+      ChangeData cd, CurrentUser currentUser, Account.Id reviewer, int value)
+      throws PermissionBackendException, OrmException {
+    if (canRemoveReviewerWithoutPermissionCheck(
+        permissionBackend, cd.change(), currentUser, reviewer, value)) {
+      return true;
+    }
+    return permissionBackend
+        .user(currentUser)
+        .change(cd)
+        .database(dbProvider)
+        .test(ChangePermission.REMOVE_REVIEWER);
+  }
+
+  private void checkRemoveReviewer(
+      ChangeNotes notes, CurrentUser currentUser, Account.Id reviewer, int val)
+      throws PermissionBackendException, AuthException {
+    if (canRemoveReviewerWithoutPermissionCheck(
+        permissionBackend, notes.getChange(), currentUser, reviewer, val)) {
+      return;
+    }
+
+    permissionBackend
+        .user(currentUser)
+        .change(notes)
+        .database(dbProvider)
+        .check(ChangePermission.REMOVE_REVIEWER);
+  }
+
+  private static boolean canRemoveReviewerWithoutPermissionCheck(
+      PermissionBackend permissionBackend,
+      Change change,
+      CurrentUser currentUser,
+      Account.Id reviewer,
+      int value)
+      throws PermissionBackendException {
+    if (change.getStatus().equals(Change.Status.MERGED)) {
+      return false;
+    }
+
+    if (currentUser.isIdentifiedUser()) {
+      Account.Id aId = currentUser.getAccountId();
+      if (aId.equals(reviewer)) {
+        return true; // A user can always remove themselves.
+      } else if (aId.equals(change.getOwner()) && 0 <= value) {
+        return true; // The change owner may remove any zero or positive score.
+      }
+    }
+
+    // Users with the remove reviewer permission, the branch owner, project
+    // owner and site admin can remove anyone
+    PermissionBackend.WithUser withUser = permissionBackend.user(currentUser);
+    PermissionBackend.ForProject forProject = withUser.project(change.getProject());
+    if (check(forProject.ref(change.getDest().get()), RefPermission.WRITE_CONFIG)
+        || check(withUser, GlobalPermission.ADMINISTRATE_SERVER)) {
+      return true;
+    }
+    return false;
+  }
+
+  private static boolean check(PermissionBackend.ForRef forRef, RefPermission perm)
+      throws PermissionBackendException {
+    try {
+      forRef.check(perm);
+      return true;
+    } catch (AuthException e) {
+      return false;
+    }
+  }
+
+  private static boolean check(PermissionBackend.WithUser withUser, GlobalPermission perm)
+      throws PermissionBackendException {
+    try {
+      withUser.check(perm);
+      return true;
+    } catch (AuthException e) {
+      return false;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/project/RuleEvalException.java b/java/com/google/gerrit/server/project/RuleEvalException.java
new file mode 100644
index 0000000..7e3c739
--- /dev/null
+++ b/java/com/google/gerrit/server/project/RuleEvalException.java
@@ -0,0 +1,27 @@
+// Copyright (C) 2012 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.google.gerrit.server.project;
+
+public class RuleEvalException extends Exception {
+  private static final long serialVersionUID = 1L;
+
+  public RuleEvalException(String message) {
+    super(message);
+  }
+
+  public RuleEvalException(String message, Throwable cause) {
+    super(message, cause);
+  }
+}
diff --git a/java/com/google/gerrit/server/project/SectionMatcher.java b/java/com/google/gerrit/server/project/SectionMatcher.java
new file mode 100644
index 0000000..11b1f37
--- /dev/null
+++ b/java/com/google/gerrit/server/project/SectionMatcher.java
@@ -0,0 +1,63 @@
+// Copyright (C) 2011 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.google.gerrit.server.project;
+
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.Project.NameKey;
+import com.google.gerrit.server.CurrentUser;
+
+/**
+ * Matches an AccessSection against a reference name.
+ *
+ * <p>These matchers are "compiled" versions of the AccessSection name, supporting faster selection
+ * of which sections are relevant to any given input reference.
+ */
+public class SectionMatcher extends RefPatternMatcher {
+  static SectionMatcher wrap(Project.NameKey project, AccessSection section) {
+    String ref = section.getName();
+    if (AccessSection.isValid(ref)) {
+      return new SectionMatcher(project, section, getMatcher(ref));
+    }
+    return null;
+  }
+
+  private final Project.NameKey project;
+  private final AccessSection section;
+  private final RefPatternMatcher matcher;
+
+  public SectionMatcher(Project.NameKey project, AccessSection section, RefPatternMatcher matcher) {
+    this.project = project;
+    this.section = section;
+    this.matcher = matcher;
+  }
+
+  @Override
+  public boolean match(String ref, CurrentUser user) {
+    return this.matcher.match(ref, user);
+  }
+
+  public AccessSection getSection() {
+    return section;
+  }
+
+  public RefPatternMatcher getMatcher() {
+    return matcher;
+  }
+
+  public NameKey getProject() {
+    return project;
+  }
+}
diff --git a/java/com/google/gerrit/server/project/SubmitRuleEvaluator.java b/java/com/google/gerrit/server/project/SubmitRuleEvaluator.java
new file mode 100644
index 0000000..7150fae
--- /dev/null
+++ b/java/com/google/gerrit/server/project/SubmitRuleEvaluator.java
@@ -0,0 +1,158 @@
+// Copyright (C) 2012 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.google.gerrit.server.project;
+
+import com.google.common.collect.Streams;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.SubmitRecord;
+import com.google.gerrit.common.data.SubmitTypeRecord;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.rules.PrologRule;
+import com.google.gerrit.server.rules.SubmitRule;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * Evaluates a submit-like Prolog rule found in the rules.pl file of the current project and filters
+ * the results through rules found in the parent projects, all the way up to All-Projects.
+ */
+public class SubmitRuleEvaluator {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final String DEFAULT_MSG = "Error evaluating project rules, check server log";
+
+  private final ProjectCache projectCache;
+  private final PrologRule prologRule;
+  private final PluginSetContext<SubmitRule> submitRules;
+  private final SubmitRuleOptions opts;
+
+  public interface Factory {
+    /** Returns a new {@link SubmitRuleEvaluator} with the specified options */
+    SubmitRuleEvaluator create(SubmitRuleOptions options);
+  }
+
+  @Inject
+  private SubmitRuleEvaluator(
+      ProjectCache projectCache,
+      PrologRule prologRule,
+      PluginSetContext<SubmitRule> submitRules,
+      @Assisted SubmitRuleOptions options) {
+    this.projectCache = projectCache;
+    this.prologRule = prologRule;
+    this.submitRules = submitRules;
+
+    this.opts = options;
+  }
+
+  public static List<SubmitRecord> defaultRuleError() {
+    return createRuleError(DEFAULT_MSG);
+  }
+
+  public static List<SubmitRecord> createRuleError(String err) {
+    SubmitRecord rec = new SubmitRecord();
+    rec.status = SubmitRecord.Status.RULE_ERROR;
+    rec.errorMessage = err;
+    return Collections.singletonList(rec);
+  }
+
+  public static SubmitTypeRecord defaultTypeError() {
+    return SubmitTypeRecord.error(DEFAULT_MSG);
+  }
+
+  /**
+   * Evaluate the submit rules.
+   *
+   * @return List of {@link SubmitRecord} objects returned from the evaluated rules, including any
+   *     errors.
+   * @param cd ChangeData to evaluate
+   */
+  public List<SubmitRecord> evaluate(ChangeData cd) {
+    Change change;
+    ProjectState projectState;
+    try {
+      change = cd.change();
+      if (change == null) {
+        throw new OrmException("Change not found");
+      }
+
+      projectState = projectCache.get(cd.project());
+      if (projectState == null) {
+        throw new NoSuchProjectException(cd.project());
+      }
+    } catch (OrmException | NoSuchProjectException e) {
+      return ruleError("Error looking up change " + cd.getId(), e);
+    }
+
+    if (!opts.allowClosed() && change.getStatus().isClosed()) {
+      SubmitRecord rec = new SubmitRecord();
+      rec.status = SubmitRecord.Status.CLOSED;
+      return Collections.singletonList(rec);
+    }
+
+    // We evaluate all the plugin-defined evaluators,
+    // and then we collect the results in one list.
+    return Streams.stream(submitRules)
+        .map(c -> c.call(s -> s.evaluate(cd, opts)))
+        .flatMap(Collection::stream)
+        .collect(Collectors.toList());
+  }
+
+  private List<SubmitRecord> ruleError(String err, Exception e) {
+    if (opts.logErrors()) {
+      if (e == null) {
+        logger.atSevere().log(err);
+      } else {
+        logger.atSevere().withCause(e).log(err);
+      }
+      return defaultRuleError();
+    }
+    return createRuleError(err);
+  }
+
+  /**
+   * Evaluate the submit type rules to get the submit type.
+   *
+   * @return record from the evaluated rules.
+   * @param cd
+   */
+  public SubmitTypeRecord getSubmitType(ChangeData cd) {
+    ProjectState projectState;
+    try {
+      projectState = projectCache.get(cd.project());
+      if (projectState == null) {
+        throw new NoSuchProjectException(cd.project());
+      }
+    } catch (NoSuchProjectException e) {
+      return typeError("Error looking up change " + cd.getId(), e);
+    }
+
+    return prologRule.getSubmitType(cd, opts);
+  }
+
+  private SubmitTypeRecord typeError(String err, Exception e) {
+    if (opts.logErrors()) {
+      logger.atSevere().withCause(e).log(err);
+      return defaultTypeError();
+    }
+    return SubmitTypeRecord.error(err);
+  }
+}
diff --git a/java/com/google/gerrit/server/project/SubmitRuleOptions.java b/java/com/google/gerrit/server/project/SubmitRuleOptions.java
new file mode 100644
index 0000000..a4340b2
--- /dev/null
+++ b/java/com/google/gerrit/server/project/SubmitRuleOptions.java
@@ -0,0 +1,67 @@
+// 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.
+
+package com.google.gerrit.server.project;
+
+import com.google.auto.value.AutoValue;
+import com.google.gerrit.common.Nullable;
+
+/**
+ * Stable identifier for options passed to a particular submit rule evaluator.
+ *
+ * <p>Used to test whether it is ok to reuse a cached list of submit records. Does not include a
+ * change or patch set ID; callers are responsible for checking those on their own.
+ */
+@AutoValue
+public abstract class SubmitRuleOptions {
+  private static final SubmitRuleOptions defaults =
+      new AutoValue_SubmitRuleOptions.Builder()
+          .allowClosed(false)
+          .skipFilters(false)
+          .logErrors(true)
+          .rule(null)
+          .build();
+
+  public static SubmitRuleOptions defaults() {
+    return defaults;
+  }
+
+  public static Builder builder() {
+    return defaults.toBuilder();
+  }
+
+  public abstract boolean allowClosed();
+
+  public abstract boolean skipFilters();
+
+  public abstract boolean logErrors();
+
+  @Nullable
+  public abstract String rule();
+
+  public abstract Builder toBuilder();
+
+  @AutoValue.Builder
+  public abstract static class Builder {
+    public abstract SubmitRuleOptions.Builder allowClosed(boolean allowClosed);
+
+    public abstract SubmitRuleOptions.Builder skipFilters(boolean skipFilters);
+
+    public abstract SubmitRuleOptions.Builder rule(@Nullable String rule);
+
+    public abstract SubmitRuleOptions.Builder logErrors(boolean logErrors);
+
+    public abstract SubmitRuleOptions build();
+  }
+}
diff --git a/java/com/google/gerrit/server/project/SuggestParentCandidates.java b/java/com/google/gerrit/server/project/SuggestParentCandidates.java
new file mode 100644
index 0000000..d3dfdcd
--- /dev/null
+++ b/java/com/google/gerrit/server/project/SuggestParentCandidates.java
@@ -0,0 +1,65 @@
+// Copyright (C) 2011 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.google.gerrit.server.project;
+
+import static java.util.stream.Collectors.toList;
+
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+@Singleton
+public class SuggestParentCandidates {
+  private final ProjectCache projectCache;
+  private final PermissionBackend permissionBackend;
+  private final AllProjectsName allProjects;
+
+  @Inject
+  SuggestParentCandidates(
+      ProjectCache projectCache, PermissionBackend permissionBackend, AllProjectsName allProjects) {
+    this.projectCache = projectCache;
+    this.permissionBackend = permissionBackend;
+    this.allProjects = allProjects;
+  }
+
+  public List<Project.NameKey> getNameKeys() throws PermissionBackendException {
+    return permissionBackend.currentUser().filter(ProjectPermission.ACCESS, readableParents())
+        .stream()
+        .sorted()
+        .collect(toList());
+  }
+
+  private Set<Project.NameKey> readableParents() {
+    Set<Project.NameKey> parents = new HashSet<>();
+    for (Project.NameKey p : projectCache.all()) {
+      ProjectState ps = projectCache.get(p);
+      if (ps != null && ps.statePermitsRead()) {
+        Project.NameKey parent = ps.getProject().getParent();
+        if (parent != null) {
+          parents.add(parent);
+        }
+      }
+    }
+    parents.add(allProjects);
+    return parents;
+  }
+}
diff --git a/java/com/google/gerrit/server/project/TagResource.java b/java/com/google/gerrit/server/project/TagResource.java
new file mode 100644
index 0000000..08ef669
--- /dev/null
+++ b/java/com/google/gerrit/server/project/TagResource.java
@@ -0,0 +1,46 @@
+// Copyright (C) 2014 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.google.gerrit.server.project;
+
+import com.google.gerrit.extensions.api.projects.TagInfo;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.server.CurrentUser;
+import com.google.inject.TypeLiteral;
+
+public class TagResource extends RefResource {
+  public static final TypeLiteral<RestView<TagResource>> TAG_KIND =
+      new TypeLiteral<RestView<TagResource>>() {};
+
+  private final TagInfo tagInfo;
+
+  public TagResource(ProjectState projectState, CurrentUser user, TagInfo tagInfo) {
+    super(projectState, user);
+    this.tagInfo = tagInfo;
+  }
+
+  public TagInfo getTagInfo() {
+    return tagInfo;
+  }
+
+  @Override
+  public String getRef() {
+    return tagInfo.ref;
+  }
+
+  @Override
+  public String getRevision() {
+    return tagInfo.revision;
+  }
+}
diff --git a/java/com/google/gerrit/server/project/testing/BUILD b/java/com/google/gerrit/server/project/testing/BUILD
new file mode 100644
index 0000000..f221e00
--- /dev/null
+++ b/java/com/google/gerrit/server/project/testing/BUILD
@@ -0,0 +1,11 @@
+java_library(
+    name = "project-test-util",
+    testonly = True,
+    srcs = glob(["*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+    ],
+)
diff --git a/java/com/google/gerrit/server/project/testing/Util.java b/java/com/google/gerrit/server/project/testing/Util.java
new file mode 100644
index 0000000..abfd2bd
--- /dev/null
+++ b/java/com/google/gerrit/server/project/testing/Util.java
@@ -0,0 +1,227 @@
+// Copyright (C) 2013 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.google.gerrit.server.project.testing;
+
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.data.LabelFunction;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.LabelValue;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.common.data.PermissionRange;
+import com.google.gerrit.common.data.PermissionRule;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.project.ProjectConfig;
+import java.util.Arrays;
+
+public class Util {
+  public static final AccountGroup.UUID ADMIN = new AccountGroup.UUID("test.admin");
+  public static final AccountGroup.UUID DEVS = new AccountGroup.UUID("test.devs");
+
+  public static final LabelType codeReview() {
+    return category(
+        "Code-Review",
+        value(2, "Looks good to me, approved"),
+        value(1, "Looks good to me, but someone else must approve"),
+        value(0, "No score"),
+        value(-1, "I would prefer this is not merged as is"),
+        value(-2, "This shall not be merged"));
+  }
+
+  public static final LabelType verified() {
+    return category("Verified", value(1, "Verified"), value(0, "No score"), value(-1, "Fails"));
+  }
+
+  public static final LabelType patchSetLock() {
+    LabelType label =
+        category("Patch-Set-Lock", value(1, "Patch Set Locked"), value(0, "Patch Set Unlocked"));
+    label.setFunction(LabelFunction.PATCH_SET_LOCK);
+    return label;
+  }
+
+  public static LabelValue value(int value, String text) {
+    return new LabelValue((short) value, text);
+  }
+
+  public static LabelType category(String name, LabelValue... values) {
+    return new LabelType(name, Arrays.asList(values));
+  }
+
+  public static PermissionRule newRule(ProjectConfig project, AccountGroup.UUID groupUUID) {
+    GroupReference group = new GroupReference(groupUUID, groupUUID.get());
+    group = project.resolve(group);
+
+    return new PermissionRule(group);
+  }
+
+  public static PermissionRule allow(
+      ProjectConfig project,
+      String permissionName,
+      int min,
+      int max,
+      AccountGroup.UUID group,
+      String ref) {
+    PermissionRule rule = newRule(project, group);
+    rule.setMin(min);
+    rule.setMax(max);
+    return grant(project, permissionName, rule, ref);
+  }
+
+  public static PermissionRule allowExclusive(
+      ProjectConfig project,
+      String permissionName,
+      int min,
+      int max,
+      AccountGroup.UUID group,
+      String ref) {
+    PermissionRule rule = newRule(project, group);
+    rule.setMin(min);
+    rule.setMax(max);
+    return grant(project, permissionName, rule, ref, true);
+  }
+
+  public static PermissionRule block(
+      ProjectConfig project,
+      String permissionName,
+      int min,
+      int max,
+      AccountGroup.UUID group,
+      String ref) {
+    PermissionRule rule = newRule(project, group);
+    rule.setMin(min);
+    rule.setMax(max);
+    PermissionRule r = grant(project, permissionName, rule, ref);
+    r.setBlock();
+    return r;
+  }
+
+  public static PermissionRule allow(
+      ProjectConfig project, String permissionName, AccountGroup.UUID group, String ref) {
+    return grant(project, permissionName, newRule(project, group), ref);
+  }
+
+  public static PermissionRule allow(
+      ProjectConfig project,
+      String permissionName,
+      AccountGroup.UUID group,
+      String ref,
+      boolean exclusive) {
+    return grant(project, permissionName, newRule(project, group), ref, exclusive);
+  }
+
+  public static PermissionRule allow(
+      ProjectConfig project, String capabilityName, AccountGroup.UUID group) {
+    PermissionRule rule = newRule(project, group);
+    project
+        .getAccessSection(AccessSection.GLOBAL_CAPABILITIES, true)
+        .getPermission(capabilityName, true)
+        .add(rule);
+    if (GlobalCapability.hasRange(capabilityName)) {
+      PermissionRange.WithDefaults range = GlobalCapability.getRange(capabilityName);
+      if (range != null) {
+        rule.setRange(range.getDefaultMin(), range.getDefaultMax());
+      }
+    }
+    return rule;
+  }
+
+  public static PermissionRule remove(
+      ProjectConfig project, String capabilityName, AccountGroup.UUID group) {
+    PermissionRule rule = newRule(project, group);
+    project
+        .getAccessSection(AccessSection.GLOBAL_CAPABILITIES, true)
+        .getPermission(capabilityName, true)
+        .remove(rule);
+    return rule;
+  }
+
+  public static PermissionRule remove(
+      ProjectConfig project, String permissionName, AccountGroup.UUID group, String ref) {
+    PermissionRule rule = newRule(project, group);
+    project.getAccessSection(ref, true).getPermission(permissionName, true).remove(rule);
+    return rule;
+  }
+
+  public static PermissionRule block(
+      ProjectConfig project, String capabilityName, AccountGroup.UUID group) {
+    PermissionRule rule = newRule(project, group);
+    project
+        .getAccessSection(AccessSection.GLOBAL_CAPABILITIES, true)
+        .getPermission(capabilityName, true)
+        .add(rule);
+    return rule;
+  }
+
+  public static PermissionRule block(
+      ProjectConfig project, String permissionName, AccountGroup.UUID group, String ref) {
+    PermissionRule r = grant(project, permissionName, newRule(project, group), ref);
+    r.setBlock();
+    return r;
+  }
+
+  public static PermissionRule blockLabel(
+      ProjectConfig project, String labelName, AccountGroup.UUID group, String ref) {
+    return blockLabel(project, labelName, -1, 1, group, ref);
+  }
+
+  public static PermissionRule blockLabel(
+      ProjectConfig project,
+      String labelName,
+      int min,
+      int max,
+      AccountGroup.UUID group,
+      String ref) {
+    PermissionRule r = grant(project, Permission.LABEL + labelName, newRule(project, group), ref);
+    r.setBlock();
+    r.setRange(min, max);
+    return r;
+  }
+
+  public static PermissionRule deny(
+      ProjectConfig project, String permissionName, AccountGroup.UUID group, String ref) {
+    PermissionRule r = grant(project, permissionName, newRule(project, group), ref);
+    r.setDeny();
+    return r;
+  }
+
+  public static void doNotInherit(ProjectConfig project, String permissionName, String ref) {
+    project
+        .getAccessSection(ref, true) //
+        .getPermission(permissionName, true) //
+        .setExclusiveGroup(true);
+  }
+
+  private static PermissionRule grant(
+      ProjectConfig project, String permissionName, PermissionRule rule, String ref) {
+    return grant(project, permissionName, rule, ref, false);
+  }
+
+  private static PermissionRule grant(
+      ProjectConfig project,
+      String permissionName,
+      PermissionRule rule,
+      String ref,
+      boolean exclusive) {
+    Permission permission = project.getAccessSection(ref, true).getPermission(permissionName, true);
+    if (exclusive) {
+      permission.setExclusiveGroup(exclusive);
+    }
+    permission.add(rule);
+    return rule;
+  }
+
+  private Util() {}
+}
diff --git a/java/com/google/gerrit/server/query/account/AccountIsVisibleToPredicate.java b/java/com/google/gerrit/server/query/account/AccountIsVisibleToPredicate.java
new file mode 100644
index 0000000..bd7b7fe
--- /dev/null
+++ b/java/com/google/gerrit/server/query/account/AccountIsVisibleToPredicate.java
@@ -0,0 +1,47 @@
+// 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.
+
+package com.google.gerrit.server.query.account;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.index.query.IsVisibleToPredicate;
+import com.google.gerrit.server.account.AccountControl;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.index.IndexUtils;
+import com.google.gwtorm.server.OrmException;
+
+public class AccountIsVisibleToPredicate extends IsVisibleToPredicate<AccountState> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  protected final AccountControl accountControl;
+
+  public AccountIsVisibleToPredicate(AccountControl accountControl) {
+    super(AccountQueryBuilder.FIELD_VISIBLETO, IndexUtils.describe(accountControl.getUser()));
+    this.accountControl = accountControl;
+  }
+
+  @Override
+  public boolean match(AccountState accountState) throws OrmException {
+    boolean canSee = accountControl.canSee(accountState);
+    if (!canSee) {
+      logger.atFine().log("Filter out non-visisble account: %s", accountState);
+    }
+    return canSee;
+  }
+
+  @Override
+  public int getCost() {
+    return 1;
+  }
+}
diff --git a/java/com/google/gerrit/server/query/account/AccountPredicates.java b/java/com/google/gerrit/server/query/account/AccountPredicates.java
new file mode 100644
index 0000000..57a0dcc
--- /dev/null
+++ b/java/com/google/gerrit/server/query/account/AccountPredicates.java
@@ -0,0 +1,154 @@
+// 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.
+
+package com.google.gerrit.server.query.account;
+
+import com.google.common.collect.Lists;
+import com.google.common.primitives.Ints;
+import com.google.gerrit.index.FieldDef;
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.index.query.IndexPredicate;
+import com.google.gerrit.index.query.Matchable;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryBuilder;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.index.account.AccountField;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gwtorm.server.OrmException;
+import java.util.List;
+
+public class AccountPredicates {
+  public static boolean hasActive(Predicate<AccountState> p) {
+    return QueryBuilder.find(p, AccountPredicate.class, AccountField.ACTIVE.getName()) != null;
+  }
+
+  public static Predicate<AccountState> andActive(Predicate<AccountState> p) {
+    return Predicate.and(p, isActive());
+  }
+
+  public static Predicate<AccountState> defaultPredicate(
+      Schema<AccountState> schema, boolean canSeeSecondaryEmails, String query) {
+    // Adapt the capacity of this list when adding more default predicates.
+    List<Predicate<AccountState>> preds = Lists.newArrayListWithCapacity(3);
+    Integer id = Ints.tryParse(query);
+    if (id != null) {
+      preds.add(id(new Account.Id(id)));
+    }
+    if (canSeeSecondaryEmails) {
+      preds.add(equalsNameIncludingSecondaryEmails(query));
+    } else {
+      if (schema.hasField(AccountField.NAME_PART_NO_SECONDARY_EMAIL)) {
+        preds.add(equalsName(query));
+      } else {
+        preds.add(AccountPredicates.fullName(query));
+        if (schema.hasField(AccountField.PREFERRED_EMAIL)) {
+          preds.add(AccountPredicates.preferredEmail(query));
+        }
+      }
+    }
+    preds.add(username(query));
+    // Adapt the capacity of the "predicates" list when adding more default
+    // predicates.
+    return Predicate.or(preds);
+  }
+
+  public static Predicate<AccountState> id(Account.Id accountId) {
+    return new AccountPredicate(
+        AccountField.ID, AccountQueryBuilder.FIELD_ACCOUNT, accountId.toString());
+  }
+
+  public static Predicate<AccountState> emailIncludingSecondaryEmails(String email) {
+    return new AccountPredicate(
+        AccountField.EMAIL, AccountQueryBuilder.FIELD_EMAIL, email.toLowerCase());
+  }
+
+  public static Predicate<AccountState> preferredEmail(String email) {
+    return new AccountPredicate(
+        AccountField.PREFERRED_EMAIL,
+        AccountQueryBuilder.FIELD_PREFERRED_EMAIL,
+        email.toLowerCase());
+  }
+
+  public static Predicate<AccountState> preferredEmailExact(String email) {
+    return new AccountPredicate(
+        AccountField.PREFERRED_EMAIL_EXACT, AccountQueryBuilder.FIELD_PREFERRED_EMAIL_EXACT, email);
+  }
+
+  public static Predicate<AccountState> equalsNameIncludingSecondaryEmails(String name) {
+    return new AccountPredicate(
+        AccountField.NAME_PART, AccountQueryBuilder.FIELD_NAME, name.toLowerCase());
+  }
+
+  public static Predicate<AccountState> equalsName(String name) {
+    return new AccountPredicate(
+        AccountField.NAME_PART_NO_SECONDARY_EMAIL,
+        AccountQueryBuilder.FIELD_NAME,
+        name.toLowerCase());
+  }
+
+  public static Predicate<AccountState> externalIdIncludingSecondaryEmails(String externalId) {
+    return new AccountPredicate(AccountField.EXTERNAL_ID, externalId);
+  }
+
+  public static Predicate<AccountState> fullName(String fullName) {
+    return new AccountPredicate(AccountField.FULL_NAME, fullName);
+  }
+
+  public static Predicate<AccountState> isActive() {
+    return new AccountPredicate(AccountField.ACTIVE, "1");
+  }
+
+  public static Predicate<AccountState> isNotActive() {
+    return new AccountPredicate(AccountField.ACTIVE, "0");
+  }
+
+  public static Predicate<AccountState> username(String username) {
+    return new AccountPredicate(
+        AccountField.USERNAME, AccountQueryBuilder.FIELD_USERNAME, username.toLowerCase());
+  }
+
+  public static Predicate<AccountState> watchedProject(Project.NameKey project) {
+    return new AccountPredicate(AccountField.WATCHED_PROJECT, project.get());
+  }
+
+  public static Predicate<AccountState> cansee(
+      AccountQueryBuilder.Arguments args, ChangeNotes changeNotes) {
+    return new CanSeeChangePredicate(args.db, args.permissionBackend, changeNotes);
+  }
+
+  static class AccountPredicate extends IndexPredicate<AccountState>
+      implements Matchable<AccountState> {
+    AccountPredicate(FieldDef<AccountState, ?> def, String value) {
+      super(def, value);
+    }
+
+    AccountPredicate(FieldDef<AccountState, ?> def, String name, String value) {
+      super(def, name, value);
+    }
+
+    @Override
+    public boolean match(AccountState object) throws OrmException {
+      return true;
+    }
+
+    @Override
+    public int getCost() {
+      return 1;
+    }
+  }
+
+  private AccountPredicates() {}
+}
diff --git a/java/com/google/gerrit/server/query/account/AccountQueryBuilder.java b/java/com/google/gerrit/server/query/account/AccountQueryBuilder.java
new file mode 100644
index 0000000..148c633
--- /dev/null
+++ b/java/com/google/gerrit/server/query/account/AccountQueryBuilder.java
@@ -0,0 +1,246 @@
+// 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.
+
+package com.google.gerrit.server.query.account;
+
+import com.google.common.base.Splitter;
+import com.google.common.collect.Lists;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.primitives.Ints;
+import com.google.gerrit.common.errors.NotSignedInException;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.index.Index;
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.index.query.LimitPredicate;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryBuilder;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.change.ChangeFinder;
+import com.google.gerrit.server.index.account.AccountField;
+import com.google.gerrit.server.index.account.AccountIndexCollection;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.ProvisionException;
+
+/** Parses a query string meant to be applied to account objects. */
+public class AccountQueryBuilder extends QueryBuilder<AccountState> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static final String FIELD_ACCOUNT = "account";
+  public static final String FIELD_CAN_SEE = "cansee";
+  public static final String FIELD_EMAIL = "email";
+  public static final String FIELD_LIMIT = "limit";
+  public static final String FIELD_NAME = "name";
+  public static final String FIELD_PREFERRED_EMAIL = "preferredemail";
+  public static final String FIELD_PREFERRED_EMAIL_EXACT = "preferredemail_exact";
+  public static final String FIELD_USERNAME = "username";
+  public static final String FIELD_VISIBLETO = "visibleto";
+
+  private static final QueryBuilder.Definition<AccountState, AccountQueryBuilder> mydef =
+      new QueryBuilder.Definition<>(AccountQueryBuilder.class);
+
+  public static class Arguments {
+    final Provider<ReviewDb> db;
+    final ChangeFinder changeFinder;
+    final PermissionBackend permissionBackend;
+
+    private final Provider<CurrentUser> self;
+    private final AccountIndexCollection indexes;
+
+    @Inject
+    public Arguments(
+        Provider<CurrentUser> self,
+        AccountIndexCollection indexes,
+        Provider<ReviewDb> db,
+        ChangeFinder changeFinder,
+        PermissionBackend permissionBackend) {
+      this.self = self;
+      this.indexes = indexes;
+      this.db = db;
+      this.changeFinder = changeFinder;
+      this.permissionBackend = permissionBackend;
+    }
+
+    IdentifiedUser getIdentifiedUser() throws QueryParseException {
+      try {
+        CurrentUser u = getUser();
+        if (u.isIdentifiedUser()) {
+          return u.asIdentifiedUser();
+        }
+        throw new QueryParseException(NotSignedInException.MESSAGE);
+      } catch (ProvisionException e) {
+        throw new QueryParseException(NotSignedInException.MESSAGE, e);
+      }
+    }
+
+    CurrentUser getUser() throws QueryParseException {
+      try {
+        return self.get();
+      } catch (ProvisionException e) {
+        throw new QueryParseException(NotSignedInException.MESSAGE, e);
+      }
+    }
+
+    Schema<AccountState> schema() {
+      Index<?, AccountState> index = indexes != null ? indexes.getSearchIndex() : null;
+      return index != null ? index.getSchema() : null;
+    }
+  }
+
+  private final Arguments args;
+
+  @Inject
+  AccountQueryBuilder(Arguments args) {
+    super(mydef);
+    this.args = args;
+  }
+
+  @Operator
+  public Predicate<AccountState> cansee(String change)
+      throws QueryParseException, OrmException, PermissionBackendException {
+    ChangeNotes changeNotes = args.changeFinder.findOne(change);
+    if (changeNotes == null) {
+      throw error(String.format("change %s not found", change));
+    }
+
+    try {
+      args.permissionBackend
+          .user(args.getUser())
+          .database(args.db)
+          .change(changeNotes)
+          .check(ChangePermission.READ);
+    } catch (AuthException e) {
+      throw error(String.format("change %s not found", change));
+    }
+
+    return AccountPredicates.cansee(args, changeNotes);
+  }
+
+  @Operator
+  public Predicate<AccountState> email(String email)
+      throws PermissionBackendException, QueryParseException {
+    if (canSeeSecondaryEmails()) {
+      return AccountPredicates.emailIncludingSecondaryEmails(email);
+    }
+
+    if (args.schema().hasField(AccountField.PREFERRED_EMAIL)) {
+      return AccountPredicates.preferredEmail(email);
+    }
+
+    throw new QueryParseException("'email' operator is not supported by account index version");
+  }
+
+  @Operator
+  public Predicate<AccountState> is(String value) throws QueryParseException {
+    if ("active".equalsIgnoreCase(value)) {
+      return AccountPredicates.isActive();
+    }
+    if ("inactive".equalsIgnoreCase(value)) {
+      return AccountPredicates.isNotActive();
+    }
+    throw error("Invalid query");
+  }
+
+  @Operator
+  public Predicate<AccountState> limit(String query) throws QueryParseException {
+    Integer limit = Ints.tryParse(query);
+    if (limit == null) {
+      throw error("Invalid limit: " + query);
+    }
+    return new LimitPredicate<>(FIELD_LIMIT, limit);
+  }
+
+  @Operator
+  public Predicate<AccountState> name(String name)
+      throws PermissionBackendException, QueryParseException {
+    if (canSeeSecondaryEmails()) {
+      return AccountPredicates.equalsNameIncludingSecondaryEmails(name);
+    }
+
+    if (args.schema().hasField(AccountField.NAME_PART_NO_SECONDARY_EMAIL)) {
+      return AccountPredicates.equalsName(name);
+    }
+
+    return AccountPredicates.fullName(name);
+  }
+
+  @Operator
+  public Predicate<AccountState> username(String username) {
+    return AccountPredicates.username(username);
+  }
+
+  public Predicate<AccountState> defaultQuery(String query) {
+    return Predicate.and(
+        Lists.transform(
+            Splitter.on(' ').omitEmptyStrings().splitToList(query), this::defaultField));
+  }
+
+  @Override
+  protected Predicate<AccountState> defaultField(String query) {
+    Predicate<AccountState> defaultPredicate =
+        AccountPredicates.defaultPredicate(args.schema(), checkedCanSeeSecondaryEmails(), query);
+    if (query.startsWith("cansee:")) {
+      try {
+        return cansee(query.substring(7));
+      } catch (OrmException | QueryParseException | PermissionBackendException e) {
+        // Ignore, fall back to default query
+      }
+    }
+
+    if ("self".equalsIgnoreCase(query) || "me".equalsIgnoreCase(query)) {
+      try {
+        return Predicate.or(defaultPredicate, AccountPredicates.id(self()));
+      } catch (QueryParseException e) {
+        // Skip.
+      }
+    }
+    return defaultPredicate;
+  }
+
+  private Account.Id self() throws QueryParseException {
+    return args.getIdentifiedUser().getAccountId();
+  }
+
+  private boolean canSeeSecondaryEmails() throws PermissionBackendException, QueryParseException {
+    try {
+      args.permissionBackend.user(args.getUser()).check(GlobalPermission.MODIFY_ACCOUNT);
+      return true;
+    } catch (AuthException e) {
+      return false;
+    }
+  }
+
+  private boolean checkedCanSeeSecondaryEmails() {
+    try {
+      return canSeeSecondaryEmails();
+    } catch (PermissionBackendException e) {
+      logger.atSevere().withCause(e).log("Permission check failed");
+      return false;
+    } catch (QueryParseException e) {
+      // User is not signed in.
+      return false;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/query/account/AccountQueryProcessor.java b/java/com/google/gerrit/server/query/account/AccountQueryProcessor.java
new file mode 100644
index 0000000..7a7381d
--- /dev/null
+++ b/java/com/google/gerrit/server/query/account/AccountQueryProcessor.java
@@ -0,0 +1,82 @@
+// 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.
+
+package com.google.gerrit.server.query.account;
+
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.gerrit.server.query.account.AccountQueryBuilder.FIELD_LIMIT;
+
+import com.google.gerrit.index.IndexConfig;
+import com.google.gerrit.index.query.AndSource;
+import com.google.gerrit.index.query.IndexPredicate;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryProcessor;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.AccountControl;
+import com.google.gerrit.server.account.AccountLimits;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.index.account.AccountIndexCollection;
+import com.google.gerrit.server.index.account.AccountIndexRewriter;
+import com.google.gerrit.server.index.account.AccountSchemaDefinitions;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+
+/**
+ * Query processor for the account index.
+ *
+ * <p>Instances are one-time-use. Other singleton classes should inject a Provider rather than
+ * holding on to a single instance.
+ */
+public class AccountQueryProcessor extends QueryProcessor<AccountState> {
+  private final AccountControl.Factory accountControlFactory;
+
+  static {
+    // It is assumed that basic rewrites do not touch visibleto predicates.
+    checkState(
+        !AccountIsVisibleToPredicate.class.isAssignableFrom(IndexPredicate.class),
+        "AccountQueryProcessor assumes visibleto is not used by the index rewriter.");
+  }
+
+  @Inject
+  protected AccountQueryProcessor(
+      Provider<CurrentUser> userProvider,
+      AccountLimits.Factory limitsFactory,
+      MetricMaker metricMaker,
+      IndexConfig indexConfig,
+      AccountIndexCollection indexes,
+      AccountIndexRewriter rewriter,
+      AccountControl.Factory accountControlFactory) {
+    super(
+        metricMaker,
+        AccountSchemaDefinitions.INSTANCE,
+        indexConfig,
+        indexes,
+        rewriter,
+        FIELD_LIMIT,
+        () -> limitsFactory.create(userProvider.get()).getQueryLimit());
+    this.accountControlFactory = accountControlFactory;
+  }
+
+  @Override
+  protected Predicate<AccountState> enforceVisibility(Predicate<AccountState> pred) {
+    return new AndSource<>(
+        pred, new AccountIsVisibleToPredicate(accountControlFactory.get()), start);
+  }
+
+  @Override
+  protected String formatForLogging(AccountState accountState) {
+    return accountState.getAccount().getId().toString();
+  }
+}
diff --git a/java/com/google/gerrit/server/query/account/CanSeeChangePredicate.java b/java/com/google/gerrit/server/query/account/CanSeeChangePredicate.java
new file mode 100644
index 0000000..fb3549c
--- /dev/null
+++ b/java/com/google/gerrit/server/query/account/CanSeeChangePredicate.java
@@ -0,0 +1,61 @@
+// 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.
+
+package com.google.gerrit.server.query.account;
+
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.index.query.PostFilterPredicate;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Provider;
+
+public class CanSeeChangePredicate extends PostFilterPredicate<AccountState> {
+  private final Provider<ReviewDb> db;
+  private final PermissionBackend permissionBackend;
+  private final ChangeNotes changeNotes;
+
+  CanSeeChangePredicate(
+      Provider<ReviewDb> db, PermissionBackend permissionBackend, ChangeNotes changeNotes) {
+    super(AccountQueryBuilder.FIELD_CAN_SEE, changeNotes.getChangeId().toString());
+    this.db = db;
+    this.permissionBackend = permissionBackend;
+    this.changeNotes = changeNotes;
+  }
+
+  @Override
+  public boolean match(AccountState accountState) throws OrmException {
+    try {
+      permissionBackend
+          .absentUser(accountState.getAccount().getId())
+          .database(db)
+          .change(changeNotes)
+          .check(ChangePermission.READ);
+      return true;
+    } catch (PermissionBackendException e) {
+      throw new OrmException("Failed to check if account can see change", e);
+    } catch (AuthException e) {
+      return false;
+    }
+  }
+
+  @Override
+  public int getCost() {
+    return 1;
+  }
+}
diff --git a/java/com/google/gerrit/server/query/account/InternalAccountQuery.java b/java/com/google/gerrit/server/query/account/InternalAccountQuery.java
new file mode 100644
index 0000000..e8e72a8
--- /dev/null
+++ b/java/com/google/gerrit/server/query/account/InternalAccountQuery.java
@@ -0,0 +1,171 @@
+// 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.
+
+package com.google.gerrit.server.query.account;
+
+import static java.util.stream.Collectors.toList;
+import static java.util.stream.Collectors.toSet;
+
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.Multimap;
+import com.google.gerrit.index.FieldDef;
+import com.google.gerrit.index.IndexConfig;
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.index.query.InternalQuery;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.index.account.AccountField;
+import com.google.gerrit.server.index.account.AccountIndexCollection;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Query wrapper for the account index.
+ *
+ * <p>Instances are one-time-use. Other singleton classes should inject a Provider rather than
+ * holding on to a single instance.
+ */
+public class InternalAccountQuery extends InternalQuery<AccountState> {
+  @Inject
+  InternalAccountQuery(
+      AccountQueryProcessor queryProcessor,
+      AccountIndexCollection indexes,
+      IndexConfig indexConfig) {
+    super(queryProcessor, indexes, indexConfig);
+  }
+
+  @Override
+  public InternalAccountQuery setLimit(int n) {
+    super.setLimit(n);
+    return this;
+  }
+
+  @Override
+  public InternalAccountQuery enforceVisibility(boolean enforce) {
+    super.enforceVisibility(enforce);
+    return this;
+  }
+
+  @SafeVarargs
+  @Override
+  public final InternalAccountQuery setRequestedFields(FieldDef<AccountState, ?>... fields) {
+    super.setRequestedFields(fields);
+    return this;
+  }
+
+  @Override
+  public InternalAccountQuery noFields() {
+    super.noFields();
+    return this;
+  }
+
+  public List<AccountState> byDefault(String query) throws OrmException {
+    return query(AccountPredicates.defaultPredicate(schema(), true, query));
+  }
+
+  public List<AccountState> byExternalId(String scheme, String id) throws OrmException {
+    return byExternalId(ExternalId.Key.create(scheme, id));
+  }
+
+  public List<AccountState> byExternalId(ExternalId.Key externalId) throws OrmException {
+    return query(AccountPredicates.externalIdIncludingSecondaryEmails(externalId.toString()));
+  }
+
+  public List<AccountState> byFullName(String fullName) throws OrmException {
+    return query(AccountPredicates.fullName(fullName));
+  }
+
+  /**
+   * Queries for accounts that have a preferred email that exactly matches the given email.
+   *
+   * @param email preferred email by which accounts should be found
+   * @return list of accounts that have a preferred email that exactly matches the given email
+   * @throws OrmException if query cannot be parsed
+   */
+  public List<AccountState> byPreferredEmail(String email) throws OrmException {
+    if (hasPreferredEmailExact()) {
+      return query(AccountPredicates.preferredEmailExact(email));
+    }
+
+    if (!hasPreferredEmail()) {
+      return ImmutableList.of();
+    }
+
+    return query(AccountPredicates.preferredEmail(email)).stream()
+        .filter(a -> a.getAccount().getPreferredEmail().equals(email))
+        .collect(toList());
+  }
+
+  /**
+   * Makes multiple queries for accounts by preferred email (exact match).
+   *
+   * @param emails preferred emails by which accounts should be found
+   * @return multimap of the given emails to accounts that have a preferred email that exactly
+   *     matches this email
+   * @throws OrmException if query cannot be parsed
+   */
+  public Multimap<String, AccountState> byPreferredEmail(String... emails) throws OrmException {
+    List<String> emailList = Arrays.asList(emails);
+
+    if (hasPreferredEmailExact()) {
+      List<List<AccountState>> r =
+          query(emailList.stream().map(AccountPredicates::preferredEmailExact).collect(toList()));
+      Multimap<String, AccountState> accountsByEmail = ArrayListMultimap.create();
+      for (int i = 0; i < emailList.size(); i++) {
+        accountsByEmail.putAll(emailList.get(i), r.get(i));
+      }
+      return accountsByEmail;
+    }
+
+    if (!hasPreferredEmail()) {
+      return ImmutableListMultimap.of();
+    }
+
+    List<List<AccountState>> r =
+        query(emailList.stream().map(AccountPredicates::preferredEmail).collect(toList()));
+    Multimap<String, AccountState> accountsByEmail = ArrayListMultimap.create();
+    for (int i = 0; i < emailList.size(); i++) {
+      String email = emailList.get(i);
+      Set<AccountState> matchingAccounts =
+          r.get(i).stream()
+              .filter(a -> a.getAccount().getPreferredEmail().equals(email))
+              .collect(toSet());
+      accountsByEmail.putAll(email, matchingAccounts);
+    }
+    return accountsByEmail;
+  }
+
+  public List<AccountState> byWatchedProject(Project.NameKey project) throws OrmException {
+    return query(AccountPredicates.watchedProject(project));
+  }
+
+  private boolean hasField(FieldDef<AccountState, ?> field) {
+    Schema<AccountState> s = schema();
+    return (s != null && s.hasField(field));
+  }
+
+  private boolean hasPreferredEmail() {
+    return hasField(AccountField.PREFERRED_EMAIL);
+  }
+
+  private boolean hasPreferredEmailExact() {
+    return hasField(AccountField.PREFERRED_EMAIL_EXACT);
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AddedPredicate.java b/java/com/google/gerrit/server/query/change/AddedPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/AddedPredicate.java
rename to java/com/google/gerrit/server/query/change/AddedPredicate.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AfterPredicate.java b/java/com/google/gerrit/server/query/change/AfterPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/AfterPredicate.java
rename to java/com/google/gerrit/server/query/change/AfterPredicate.java
diff --git a/java/com/google/gerrit/server/query/change/AgePredicate.java b/java/com/google/gerrit/server/query/change/AgePredicate.java
new file mode 100644
index 0000000..29f1b8a
--- /dev/null
+++ b/java/com/google/gerrit/server/query/change/AgePredicate.java
@@ -0,0 +1,53 @@
+// Copyright (C) 2010 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.google.gerrit.server.query.change;
+
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.SECONDS;
+
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.config.ConfigUtil;
+import com.google.gerrit.server.index.change.ChangeField;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmException;
+import java.sql.Timestamp;
+
+public class AgePredicate extends TimestampRangeChangePredicate {
+  protected final long cut;
+
+  public AgePredicate(String value) {
+    super(ChangeField.UPDATED, ChangeQueryBuilder.FIELD_AGE, value);
+
+    long s = ConfigUtil.getTimeUnit(getValue(), 0, SECONDS);
+    long ms = MILLISECONDS.convert(s, SECONDS);
+    this.cut = TimeUtil.nowMs() - ms;
+  }
+
+  @Override
+  public Timestamp getMinTimestamp() {
+    return new Timestamp(0);
+  }
+
+  @Override
+  public Timestamp getMaxTimestamp() {
+    return new Timestamp(cut);
+  }
+
+  @Override
+  public boolean match(ChangeData object) throws OrmException {
+    Change change = object.change();
+    return change != null && change.getLastUpdatedOn().getTime() <= cut;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AndChangeSource.java b/java/com/google/gerrit/server/query/change/AndChangeSource.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/AndChangeSource.java
rename to java/com/google/gerrit/server/query/change/AndChangeSource.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AssigneePredicate.java b/java/com/google/gerrit/server/query/change/AssigneePredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/AssigneePredicate.java
rename to java/com/google/gerrit/server/query/change/AssigneePredicate.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AuthorPredicate.java b/java/com/google/gerrit/server/query/change/AuthorPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/AuthorPredicate.java
rename to java/com/google/gerrit/server/query/change/AuthorPredicate.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/BeforePredicate.java b/java/com/google/gerrit/server/query/change/BeforePredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/BeforePredicate.java
rename to java/com/google/gerrit/server/query/change/BeforePredicate.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/BooleanPredicate.java b/java/com/google/gerrit/server/query/change/BooleanPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/BooleanPredicate.java
rename to java/com/google/gerrit/server/query/change/BooleanPredicate.java
diff --git a/java/com/google/gerrit/server/query/change/ChangeData.java b/java/com/google/gerrit/server/query/change/ChangeData.java
new file mode 100644
index 0000000..83d68db
--- /dev/null
+++ b/java/com/google/gerrit/server/query/change/ChangeData.java
@@ -0,0 +1,1273 @@
+// Copyright (C) 2009 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.google.gerrit.server.query.change;
+
+import static com.google.gerrit.server.ApprovalsUtil.sortApprovals;
+import static java.util.Objects.requireNonNull;
+import static java.util.stream.Collectors.toList;
+import static java.util.stream.Collectors.toMap;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableSortedSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.LabelTypes;
+import com.google.gerrit.common.data.SubmitRecord;
+import com.google.gerrit.common.data.SubmitTypeRecord;
+import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.client.RobotComment;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.ReviewerByEmailSet;
+import com.google.gerrit.server.ReviewerSet;
+import com.google.gerrit.server.ReviewerStatusUpdate;
+import com.google.gerrit.server.StarredChangesUtil;
+import com.google.gerrit.server.StarredChangesUtil.StarRef;
+import com.google.gerrit.server.change.MergeabilityCache;
+import com.google.gerrit.server.change.PureRevert;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.TrackingFooters;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.MergeUtil;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gerrit.server.patch.DiffSummary;
+import com.google.gerrit.server.patch.DiffSummaryKey;
+import com.google.gerrit.server.patch.PatchListCache;
+import com.google.gerrit.server.patch.PatchListKey;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.project.SubmitRuleEvaluator;
+import com.google.gerrit.server.project.SubmitRuleOptions;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.ResultSet;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Stream;
+import org.eclipse.jgit.errors.IncorrectObjectTypeException;
+import org.eclipse.jgit.errors.MissingObjectException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.FooterLine;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+public class ChangeData {
+  private static final int BATCH_SIZE = 50;
+
+  public static List<Change> asChanges(List<ChangeData> changeDatas) throws OrmException {
+    List<Change> result = new ArrayList<>(changeDatas.size());
+    for (ChangeData cd : changeDatas) {
+      result.add(cd.change());
+    }
+    return result;
+  }
+
+  public static Map<Change.Id, ChangeData> asMap(List<ChangeData> changes) {
+    return changes.stream().collect(toMap(ChangeData::getId, Function.identity()));
+  }
+
+  public static void ensureChangeLoaded(Iterable<ChangeData> changes) throws OrmException {
+    ChangeData first = Iterables.getFirst(changes, null);
+    if (first == null) {
+      return;
+    } else if (first.notesMigration.readChanges()) {
+      for (ChangeData cd : changes) {
+        cd.change();
+      }
+      return;
+    }
+
+    Map<Change.Id, ChangeData> missing = new HashMap<>();
+    for (ChangeData cd : changes) {
+      if (cd.change == null) {
+        missing.put(cd.getId(), cd);
+      }
+    }
+    if (missing.isEmpty()) {
+      return;
+    }
+    for (ChangeNotes notes : first.notesFactory.create(first.db, missing.keySet())) {
+      missing.get(notes.getChangeId()).change = notes.getChange();
+    }
+  }
+
+  public static void ensureAllPatchSetsLoaded(Iterable<ChangeData> changes) throws OrmException {
+    ChangeData first = Iterables.getFirst(changes, null);
+    if (first == null) {
+      return;
+    } else if (first.notesMigration.readChanges()) {
+      for (ChangeData cd : changes) {
+        cd.patchSets();
+      }
+      return;
+    }
+
+    List<ResultSet<PatchSet>> results = new ArrayList<>(BATCH_SIZE);
+    for (List<ChangeData> batch : Iterables.partition(changes, BATCH_SIZE)) {
+      results.clear();
+      for (ChangeData cd : batch) {
+        if (cd.patchSets == null) {
+          results.add(cd.db.patchSets().byChange(cd.getId()));
+        } else {
+          results.add(null);
+        }
+      }
+      for (int i = 0; i < batch.size(); i++) {
+        ResultSet<PatchSet> result = results.get(i);
+        if (result != null) {
+          batch.get(i).patchSets = result.toList();
+        }
+      }
+    }
+  }
+
+  public static void ensureCurrentPatchSetLoaded(Iterable<ChangeData> changes) throws OrmException {
+    ChangeData first = Iterables.getFirst(changes, null);
+    if (first == null) {
+      return;
+    } else if (first.notesMigration.readChanges()) {
+      for (ChangeData cd : changes) {
+        cd.currentPatchSet();
+      }
+      return;
+    }
+
+    Map<PatchSet.Id, ChangeData> missing = new HashMap<>();
+    for (ChangeData cd : changes) {
+      if (cd.currentPatchSet == null && cd.patchSets == null) {
+        missing.put(cd.change().currentPatchSetId(), cd);
+      }
+    }
+    if (missing.isEmpty()) {
+      return;
+    }
+    for (PatchSet ps : first.db.patchSets().get(missing.keySet())) {
+      missing.get(ps.getId()).currentPatchSet = ps;
+    }
+  }
+
+  public static void ensureCurrentApprovalsLoaded(Iterable<ChangeData> changes)
+      throws OrmException {
+    ChangeData first = Iterables.getFirst(changes, null);
+    if (first == null) {
+      return;
+    } else if (first.notesMigration.readChanges()) {
+      for (ChangeData cd : changes) {
+        cd.currentApprovals();
+      }
+      return;
+    }
+
+    List<ResultSet<PatchSetApproval>> results = new ArrayList<>(BATCH_SIZE);
+    for (List<ChangeData> batch : Iterables.partition(changes, BATCH_SIZE)) {
+      results.clear();
+      for (ChangeData cd : batch) {
+        if (cd.currentApprovals == null) {
+          PatchSet.Id psId = cd.change().currentPatchSetId();
+          results.add(cd.db.patchSetApprovals().byPatchSet(psId));
+        } else {
+          results.add(null);
+        }
+      }
+      for (int i = 0; i < batch.size(); i++) {
+        ResultSet<PatchSetApproval> result = results.get(i);
+        if (result != null) {
+          batch.get(i).currentApprovals = sortApprovals(result);
+        }
+      }
+    }
+  }
+
+  public static void ensureMessagesLoaded(Iterable<ChangeData> changes) throws OrmException {
+    ChangeData first = Iterables.getFirst(changes, null);
+    if (first == null) {
+      return;
+    } else if (first.notesMigration.readChanges()) {
+      for (ChangeData cd : changes) {
+        cd.messages();
+      }
+      return;
+    }
+
+    List<ResultSet<ChangeMessage>> results = new ArrayList<>(BATCH_SIZE);
+    for (List<ChangeData> batch : Iterables.partition(changes, BATCH_SIZE)) {
+      results.clear();
+      for (ChangeData cd : batch) {
+        if (cd.messages == null) {
+          PatchSet.Id psId = cd.change().currentPatchSetId();
+          results.add(cd.db.changeMessages().byPatchSet(psId));
+        } else {
+          results.add(null);
+        }
+      }
+      for (int i = 0; i < batch.size(); i++) {
+        ResultSet<ChangeMessage> result = results.get(i);
+        if (result != null) {
+          batch.get(i).messages = result.toList();
+        }
+      }
+    }
+  }
+
+  public static void ensureReviewedByLoadedForOpenChanges(Iterable<ChangeData> changes)
+      throws OrmException {
+    List<ChangeData> pending = new ArrayList<>();
+    for (ChangeData cd : changes) {
+      if (cd.reviewedBy == null && cd.change().getStatus().isOpen()) {
+        pending.add(cd);
+      }
+    }
+
+    if (!pending.isEmpty()) {
+      ensureAllPatchSetsLoaded(pending);
+      ensureMessagesLoaded(pending);
+      for (ChangeData cd : pending) {
+        cd.reviewedBy();
+      }
+    }
+  }
+
+  public static class Factory {
+    private final AssistedFactory assistedFactory;
+
+    @Inject
+    Factory(AssistedFactory assistedFactory) {
+      this.assistedFactory = assistedFactory;
+    }
+
+    public ChangeData create(ReviewDb db, Project.NameKey project, Change.Id id) {
+      return assistedFactory.create(db, project, id, null, null);
+    }
+
+    public ChangeData create(ReviewDb db, Change change) {
+      return assistedFactory.create(db, change.getProject(), change.getId(), change, null);
+    }
+
+    public ChangeData create(ReviewDb db, ChangeNotes notes) {
+      return assistedFactory.create(
+          db, notes.getChange().getProject(), notes.getChangeId(), notes.getChange(), notes);
+    }
+  }
+
+  public interface AssistedFactory {
+    ChangeData create(
+        ReviewDb db,
+        Project.NameKey project,
+        Change.Id id,
+        @Nullable Change change,
+        @Nullable ChangeNotes notes);
+  }
+
+  /**
+   * Create an instance for testing only.
+   *
+   * <p>Attempting to lazy load data will fail with NPEs. Callers may consider manually setting
+   * fields that can be set.
+   *
+   * @param id change ID
+   * @return instance for testing.
+   */
+  public static ChangeData createForTest(
+      Project.NameKey project, Change.Id id, int currentPatchSetId) {
+    ChangeData cd =
+        new ChangeData(
+            null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+            null, null, null, project, id, null, null);
+    cd.currentPatchSet = new PatchSet(new PatchSet.Id(id, currentPatchSetId));
+    return cd;
+  }
+
+  // Injected fields.
+  private @Nullable final StarredChangesUtil starredChangesUtil;
+  private final AllUsersName allUsersName;
+  private final ApprovalsUtil approvalsUtil;
+  private final ChangeMessagesUtil cmUtil;
+  private final ChangeNotes.Factory notesFactory;
+  private final CommentsUtil commentsUtil;
+  private final GitRepositoryManager repoManager;
+  private final MergeUtil.Factory mergeUtilFactory;
+  private final MergeabilityCache mergeabilityCache;
+  private final NotesMigration notesMigration;
+  private final PatchListCache patchListCache;
+  private final PatchSetUtil psUtil;
+  private final ProjectCache projectCache;
+  private final TrackingFooters trackingFooters;
+  private final PureRevert pureRevert;
+  private final SubmitRuleEvaluator.Factory submitRuleEvaluatorFactory;
+
+  // Required assisted injected fields.
+  private final ReviewDb db;
+  private final Project.NameKey project;
+  private final Change.Id legacyId;
+
+  // Lazily populated fields, including optional assisted injected fields.
+
+  private final Map<SubmitRuleOptions, List<SubmitRecord>> submitRecords =
+      Maps.newLinkedHashMapWithExpectedSize(1);
+
+  private boolean lazyLoad = true;
+  private Change change;
+  private ChangeNotes notes;
+  private String commitMessage;
+  private List<FooterLine> commitFooters;
+  private PatchSet currentPatchSet;
+  private Collection<PatchSet> patchSets;
+  private ListMultimap<PatchSet.Id, PatchSetApproval> allApprovals;
+  private List<PatchSetApproval> currentApprovals;
+  private List<String> currentFiles;
+  private Optional<DiffSummary> diffSummary;
+  private Collection<Comment> publishedComments;
+  private Collection<RobotComment> robotComments;
+  private CurrentUser visibleTo;
+  private List<ChangeMessage> messages;
+  private Optional<ChangedLines> changedLines;
+  private SubmitTypeRecord submitTypeRecord;
+  private Boolean mergeable;
+  private Set<String> hashtags;
+  private Map<Account.Id, Ref> editsByUser;
+  private Set<Account.Id> reviewedBy;
+  private Map<Account.Id, Ref> draftsByUser;
+  private ImmutableListMultimap<Account.Id, String> stars;
+  private StarsOf starsOf;
+  private ImmutableMap<Account.Id, StarRef> starRefs;
+  private ReviewerSet reviewers;
+  private ReviewerByEmailSet reviewersByEmail;
+  private ReviewerSet pendingReviewers;
+  private ReviewerByEmailSet pendingReviewersByEmail;
+  private List<ReviewerStatusUpdate> reviewerUpdates;
+  private PersonIdent author;
+  private PersonIdent committer;
+  private int parentCount;
+  private Integer unresolvedCommentCount;
+  private LabelTypes labelTypes;
+
+  private ImmutableList<byte[]> refStates;
+  private ImmutableList<byte[]> refStatePatterns;
+
+  @Inject
+  private ChangeData(
+      @Nullable StarredChangesUtil starredChangesUtil,
+      ApprovalsUtil approvalsUtil,
+      AllUsersName allUsersName,
+      ChangeMessagesUtil cmUtil,
+      ChangeNotes.Factory notesFactory,
+      CommentsUtil commentsUtil,
+      GitRepositoryManager repoManager,
+      MergeUtil.Factory mergeUtilFactory,
+      MergeabilityCache mergeabilityCache,
+      NotesMigration notesMigration,
+      PatchListCache patchListCache,
+      PatchSetUtil psUtil,
+      ProjectCache projectCache,
+      TrackingFooters trackingFooters,
+      PureRevert pureRevert,
+      SubmitRuleEvaluator.Factory submitRuleEvaluatorFactory,
+      @Assisted ReviewDb db,
+      @Assisted Project.NameKey project,
+      @Assisted Change.Id id,
+      @Assisted @Nullable Change change,
+      @Assisted @Nullable ChangeNotes notes) {
+    this.approvalsUtil = approvalsUtil;
+    this.allUsersName = allUsersName;
+    this.cmUtil = cmUtil;
+    this.notesFactory = notesFactory;
+    this.commentsUtil = commentsUtil;
+    this.repoManager = repoManager;
+    this.mergeUtilFactory = mergeUtilFactory;
+    this.mergeabilityCache = mergeabilityCache;
+    this.notesMigration = notesMigration;
+    this.patchListCache = patchListCache;
+    this.psUtil = psUtil;
+    this.projectCache = projectCache;
+    this.starredChangesUtil = starredChangesUtil;
+    this.trackingFooters = trackingFooters;
+    this.pureRevert = pureRevert;
+    this.submitRuleEvaluatorFactory = submitRuleEvaluatorFactory;
+
+    // May be null in tests when created via createForTest above, in which case lazy-loading will
+    // intentionally fail with NPE. Still not marked @Nullable in the constructor, to force callers
+    // using Guice to pass a non-null value.
+    this.db = db;
+
+    this.project = project;
+    this.legacyId = id;
+
+    this.change = change;
+    this.notes = notes;
+  }
+
+  /**
+   * If false, omit fields that require database/repo IO.
+   *
+   * <p>This is used to enforce that the dashboard is rendered from the index only. If {@code
+   * lazyLoad} is on, the {@code ChangeData} object will load from the database ("lazily") when a
+   * field accessor is called.
+   */
+  public ChangeData setLazyLoad(boolean load) {
+    lazyLoad = load;
+    return this;
+  }
+
+  public ReviewDb db() {
+    return db;
+  }
+
+  public AllUsersName getAllUsersNameForIndexing() {
+    return allUsersName;
+  }
+
+  public void setCurrentFilePaths(List<String> filePaths) throws OrmException {
+    PatchSet ps = currentPatchSet();
+    if (ps != null) {
+      currentFiles = ImmutableList.copyOf(filePaths);
+    }
+  }
+
+  public List<String> currentFilePaths() throws IOException, OrmException {
+    if (currentFiles == null) {
+      if (!lazyLoad) {
+        return Collections.emptyList();
+      }
+      Optional<DiffSummary> p = getDiffSummary();
+      currentFiles = p.map(DiffSummary::getPaths).orElse(Collections.emptyList());
+    }
+    return currentFiles;
+  }
+
+  private Optional<DiffSummary> getDiffSummary() throws OrmException, IOException {
+    if (diffSummary == null) {
+      if (!lazyLoad) {
+        return Optional.empty();
+      }
+
+      Change c = change();
+      PatchSet ps = currentPatchSet();
+      if (c == null || ps == null || !loadCommitData()) {
+        return Optional.empty();
+      }
+
+      ObjectId id = ObjectId.fromString(ps.getRevision().get());
+      Whitespace ws = Whitespace.IGNORE_NONE;
+      PatchListKey pk =
+          parentCount > 1
+              ? PatchListKey.againstParentNum(1, id, ws)
+              : PatchListKey.againstDefaultBase(id, ws);
+      DiffSummaryKey key = DiffSummaryKey.fromPatchListKey(pk);
+      try {
+        diffSummary = Optional.of(patchListCache.getDiffSummary(key, c.getProject()));
+      } catch (PatchListNotAvailableException e) {
+        diffSummary = Optional.empty();
+      }
+    }
+    return diffSummary;
+  }
+
+  private Optional<ChangedLines> computeChangedLines() throws OrmException, IOException {
+    Optional<DiffSummary> ds = getDiffSummary();
+    if (ds.isPresent()) {
+      return Optional.of(ds.get().getChangedLines());
+    }
+    return Optional.empty();
+  }
+
+  public Optional<ChangedLines> changedLines() throws OrmException, IOException {
+    if (changedLines == null) {
+      if (!lazyLoad) {
+        return Optional.empty();
+      }
+      changedLines = computeChangedLines();
+    }
+    return changedLines;
+  }
+
+  public void setChangedLines(int insertions, int deletions) {
+    changedLines = Optional.of(new ChangedLines(insertions, deletions));
+  }
+
+  public void setNoChangedLines() {
+    changedLines = Optional.empty();
+  }
+
+  public Change.Id getId() {
+    return legacyId;
+  }
+
+  public Project.NameKey project() {
+    return project;
+  }
+
+  boolean fastIsVisibleTo(CurrentUser user) {
+    return visibleTo == user;
+  }
+
+  void cacheVisibleTo(CurrentUser user) {
+    visibleTo = user;
+  }
+
+  public Change change() throws OrmException {
+    if (change == null && lazyLoad) {
+      reloadChange();
+    }
+    return change;
+  }
+
+  public void setChange(Change c) {
+    change = c;
+  }
+
+  public Change reloadChange() throws OrmException {
+    try {
+      notes = notesFactory.createChecked(db, project, legacyId);
+    } catch (NoSuchChangeException e) {
+      throw new OrmException("Unable to load change " + legacyId, e);
+    }
+    change = notes.getChange();
+    setPatchSets(null);
+    return change;
+  }
+
+  public LabelTypes getLabelTypes() throws OrmException {
+    if (labelTypes == null) {
+      ProjectState state;
+      try {
+        state = projectCache.checkedGet(project());
+      } catch (IOException e) {
+        throw new OrmException("project state not available", e);
+      }
+      labelTypes = state.getLabelTypes(change().getDest());
+    }
+    return labelTypes;
+  }
+
+  public ChangeNotes notes() throws OrmException {
+    if (notes == null) {
+      if (!lazyLoad) {
+        throw new OrmException("ChangeNotes not available, lazyLoad = false");
+      }
+      notes = notesFactory.create(db, project(), legacyId);
+    }
+    return notes;
+  }
+
+  public PatchSet currentPatchSet() throws OrmException {
+    if (currentPatchSet == null) {
+      Change c = change();
+      if (c == null) {
+        return null;
+      }
+      for (PatchSet p : patchSets()) {
+        if (p.getId().equals(c.currentPatchSetId())) {
+          currentPatchSet = p;
+          return p;
+        }
+      }
+    }
+    return currentPatchSet;
+  }
+
+  public List<PatchSetApproval> currentApprovals() throws OrmException {
+    if (currentApprovals == null) {
+      if (!lazyLoad) {
+        return Collections.emptyList();
+      }
+      Change c = change();
+      if (c == null) {
+        currentApprovals = Collections.emptyList();
+      } else {
+        try {
+          currentApprovals =
+              ImmutableList.copyOf(
+                  approvalsUtil.byPatchSet(db, notes(), c.currentPatchSetId(), null, null));
+        } catch (OrmException e) {
+          if (e.getCause() instanceof NoSuchChangeException) {
+            currentApprovals = Collections.emptyList();
+          } else {
+            throw e;
+          }
+        }
+      }
+    }
+    return currentApprovals;
+  }
+
+  public void setCurrentApprovals(List<PatchSetApproval> approvals) {
+    currentApprovals = approvals;
+  }
+
+  public String commitMessage() throws IOException, OrmException {
+    if (commitMessage == null) {
+      if (!loadCommitData()) {
+        return null;
+      }
+    }
+    return commitMessage;
+  }
+
+  public List<FooterLine> commitFooters() throws IOException, OrmException {
+    if (commitFooters == null) {
+      if (!loadCommitData()) {
+        return null;
+      }
+    }
+    return commitFooters;
+  }
+
+  public ListMultimap<String, String> trackingFooters() throws IOException, OrmException {
+    return trackingFooters.extract(commitFooters());
+  }
+
+  public PersonIdent getAuthor() throws IOException, OrmException {
+    if (author == null) {
+      if (!loadCommitData()) {
+        return null;
+      }
+    }
+    return author;
+  }
+
+  public PersonIdent getCommitter() throws IOException, OrmException {
+    if (committer == null) {
+      if (!loadCommitData()) {
+        return null;
+      }
+    }
+    return committer;
+  }
+
+  private boolean loadCommitData()
+      throws OrmException, RepositoryNotFoundException, IOException, MissingObjectException,
+          IncorrectObjectTypeException {
+    PatchSet ps = currentPatchSet();
+    if (ps == null) {
+      return false;
+    }
+    String sha1 = ps.getRevision().get();
+    try (Repository repo = repoManager.openRepository(project());
+        RevWalk walk = new RevWalk(repo)) {
+      RevCommit c = walk.parseCommit(ObjectId.fromString(sha1));
+      commitMessage = c.getFullMessage();
+      commitFooters = c.getFooterLines();
+      author = c.getAuthorIdent();
+      committer = c.getCommitterIdent();
+      parentCount = c.getParentCount();
+    }
+    return true;
+  }
+
+  /**
+   * @return patches for the change, in patch set ID order.
+   * @throws OrmException an error occurred reading the database.
+   */
+  public Collection<PatchSet> patchSets() throws OrmException {
+    if (patchSets == null) {
+      patchSets = psUtil.byChange(db, notes());
+    }
+    return patchSets;
+  }
+
+  public void setPatchSets(Collection<PatchSet> patchSets) {
+    this.currentPatchSet = null;
+    this.patchSets = patchSets;
+  }
+
+  /**
+   * @return patch with the given ID, or null if it does not exist.
+   * @throws OrmException an error occurred reading the database.
+   */
+  public PatchSet patchSet(PatchSet.Id psId) throws OrmException {
+    if (currentPatchSet != null && currentPatchSet.getId().equals(psId)) {
+      return currentPatchSet;
+    }
+    for (PatchSet ps : patchSets()) {
+      if (ps.getId().equals(psId)) {
+        return ps;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * @return all patch set approvals for the change, keyed by ID, ordered by timestamp within each
+   *     patch set.
+   * @throws OrmException an error occurred reading the database.
+   */
+  public ListMultimap<PatchSet.Id, PatchSetApproval> approvals() throws OrmException {
+    if (allApprovals == null) {
+      if (!lazyLoad) {
+        return ImmutableListMultimap.of();
+      }
+      allApprovals = approvalsUtil.byChange(db, notes());
+    }
+    return allApprovals;
+  }
+
+  /**
+   * @return The submit ('SUBM') approval label
+   * @throws OrmException an error occurred reading the database.
+   */
+  public Optional<PatchSetApproval> getSubmitApproval() throws OrmException {
+    return currentApprovals().stream().filter(PatchSetApproval::isLegacySubmit).findFirst();
+  }
+
+  public ReviewerSet reviewers() throws OrmException {
+    if (reviewers == null) {
+      if (!lazyLoad) {
+        return ReviewerSet.empty();
+      }
+      reviewers = approvalsUtil.getReviewers(notes(), approvals().values());
+    }
+    return reviewers;
+  }
+
+  public void setReviewers(ReviewerSet reviewers) {
+    this.reviewers = reviewers;
+  }
+
+  public ReviewerSet getReviewers() {
+    return reviewers;
+  }
+
+  public ReviewerByEmailSet reviewersByEmail() throws OrmException {
+    if (reviewersByEmail == null) {
+      if (!lazyLoad) {
+        return ReviewerByEmailSet.empty();
+      }
+      reviewersByEmail = notes().getReviewersByEmail();
+    }
+    return reviewersByEmail;
+  }
+
+  public void setReviewersByEmail(ReviewerByEmailSet reviewersByEmail) {
+    this.reviewersByEmail = reviewersByEmail;
+  }
+
+  public ReviewerByEmailSet getReviewersByEmail() {
+    return reviewersByEmail;
+  }
+
+  public void setPendingReviewers(ReviewerSet pendingReviewers) {
+    this.pendingReviewers = pendingReviewers;
+  }
+
+  public ReviewerSet getPendingReviewers() {
+    return this.pendingReviewers;
+  }
+
+  public ReviewerSet pendingReviewers() throws OrmException {
+    if (pendingReviewers == null) {
+      if (!lazyLoad) {
+        return ReviewerSet.empty();
+      }
+      pendingReviewers = notes().getPendingReviewers();
+    }
+    return pendingReviewers;
+  }
+
+  public void setPendingReviewersByEmail(ReviewerByEmailSet pendingReviewersByEmail) {
+    this.pendingReviewersByEmail = pendingReviewersByEmail;
+  }
+
+  public ReviewerByEmailSet getPendingReviewersByEmail() {
+    return pendingReviewersByEmail;
+  }
+
+  public ReviewerByEmailSet pendingReviewersByEmail() throws OrmException {
+    if (pendingReviewersByEmail == null) {
+      if (!lazyLoad) {
+        return ReviewerByEmailSet.empty();
+      }
+      pendingReviewersByEmail = notes().getPendingReviewersByEmail();
+    }
+    return pendingReviewersByEmail;
+  }
+
+  public List<ReviewerStatusUpdate> reviewerUpdates() throws OrmException {
+    if (reviewerUpdates == null) {
+      if (!lazyLoad) {
+        return Collections.emptyList();
+      }
+      reviewerUpdates = approvalsUtil.getReviewerUpdates(notes());
+    }
+    return reviewerUpdates;
+  }
+
+  public void setReviewerUpdates(List<ReviewerStatusUpdate> reviewerUpdates) {
+    this.reviewerUpdates = reviewerUpdates;
+  }
+
+  public List<ReviewerStatusUpdate> getReviewerUpdates() {
+    return reviewerUpdates;
+  }
+
+  public Collection<Comment> publishedComments() throws OrmException {
+    if (publishedComments == null) {
+      if (!lazyLoad) {
+        return Collections.emptyList();
+      }
+      publishedComments = commentsUtil.publishedByChange(db, notes());
+    }
+    return publishedComments;
+  }
+
+  public Collection<RobotComment> robotComments() throws OrmException {
+    if (robotComments == null) {
+      if (!lazyLoad) {
+        return Collections.emptyList();
+      }
+      robotComments = commentsUtil.robotCommentsByChange(notes());
+    }
+    return robotComments;
+  }
+
+  public Integer unresolvedCommentCount() throws OrmException {
+    if (unresolvedCommentCount == null) {
+      if (!lazyLoad) {
+        return null;
+      }
+
+      List<Comment> comments =
+          Stream.concat(publishedComments().stream(), robotComments().stream()).collect(toList());
+
+      // Build a map of uuid to list of direct descendants.
+      Map<String, List<Comment>> forest = new HashMap<>();
+      for (Comment comment : comments) {
+        List<Comment> siblings = forest.get(comment.parentUuid);
+        if (siblings == null) {
+          siblings = new ArrayList<>();
+          forest.put(comment.parentUuid, siblings);
+        }
+        siblings.add(comment);
+      }
+
+      // Find latest comment in each thread and apply to unresolved counter.
+      int unresolved = 0;
+      if (forest.containsKey(null)) {
+        for (Comment root : forest.get(null)) {
+          if (getLatestComment(forest, root).unresolved) {
+            unresolved++;
+          }
+        }
+      }
+      unresolvedCommentCount = unresolved;
+    }
+
+    return unresolvedCommentCount;
+  }
+
+  protected Comment getLatestComment(Map<String, List<Comment>> forest, Comment root) {
+    List<Comment> children = forest.get(root.key.uuid);
+    if (children == null) {
+      return root;
+    }
+    Comment latest = null;
+    for (Comment comment : children) {
+      Comment branchLatest = getLatestComment(forest, comment);
+      if (latest == null || branchLatest.writtenOn.after(latest.writtenOn)) {
+        latest = branchLatest;
+      }
+    }
+    return latest;
+  }
+
+  public void setUnresolvedCommentCount(Integer count) {
+    this.unresolvedCommentCount = count;
+  }
+
+  public List<ChangeMessage> messages() throws OrmException {
+    if (messages == null) {
+      if (!lazyLoad) {
+        return Collections.emptyList();
+      }
+      messages = cmUtil.byChange(db, notes());
+    }
+    return messages;
+  }
+
+  public List<SubmitRecord> submitRecords(SubmitRuleOptions options) {
+    List<SubmitRecord> records = submitRecords.get(options);
+    if (records == null) {
+      if (!lazyLoad) {
+        return Collections.emptyList();
+      }
+      records = submitRuleEvaluatorFactory.create(options).evaluate(this);
+      submitRecords.put(options, records);
+    }
+    return records;
+  }
+
+  @Nullable
+  public List<SubmitRecord> getSubmitRecords(SubmitRuleOptions options) {
+    return submitRecords.get(options);
+  }
+
+  public void setSubmitRecords(SubmitRuleOptions options, List<SubmitRecord> records) {
+    submitRecords.put(options, records);
+  }
+
+  public SubmitTypeRecord submitTypeRecord() {
+    if (submitTypeRecord == null) {
+      submitTypeRecord =
+          submitRuleEvaluatorFactory.create(SubmitRuleOptions.defaults()).getSubmitType(this);
+    }
+    return submitTypeRecord;
+  }
+
+  public void setMergeable(Boolean mergeable) {
+    this.mergeable = mergeable;
+  }
+
+  @Nullable
+  public Boolean isMergeable() throws OrmException {
+    if (mergeable == null) {
+      Change c = change();
+      if (c == null) {
+        return null;
+      }
+      if (c.getStatus() == Change.Status.MERGED) {
+        mergeable = true;
+      } else if (c.getStatus() == Change.Status.ABANDONED) {
+        return null;
+      } else if (c.isWorkInProgress()) {
+        return null;
+      } else {
+        if (!lazyLoad) {
+          return null;
+        }
+        PatchSet ps = currentPatchSet();
+        if (ps == null) {
+          return null;
+        }
+
+        try (Repository repo = repoManager.openRepository(project())) {
+          Ref ref = repo.getRefDatabase().exactRef(c.getDest().get());
+          SubmitTypeRecord str = submitTypeRecord();
+          if (!str.isOk()) {
+            // If submit type rules are broken, it's definitely not mergeable.
+            // No need to log, as SubmitRuleEvaluator already did it for us.
+            return false;
+          }
+          String mergeStrategy =
+              mergeUtilFactory.create(projectCache.get(project())).mergeStrategyName();
+          mergeable =
+              mergeabilityCache.get(
+                  ObjectId.fromString(ps.getRevision().get()),
+                  ref,
+                  str.type,
+                  mergeStrategy,
+                  c.getDest(),
+                  repo);
+        } catch (IOException e) {
+          throw new OrmException(e);
+        }
+      }
+    }
+    return mergeable;
+  }
+
+  public Set<Account.Id> editsByUser() throws OrmException {
+    return editRefs().keySet();
+  }
+
+  public Map<Account.Id, Ref> editRefs() throws OrmException {
+    if (editsByUser == null) {
+      if (!lazyLoad) {
+        return Collections.emptyMap();
+      }
+      Change c = change();
+      if (c == null) {
+        return Collections.emptyMap();
+      }
+      editsByUser = new HashMap<>();
+      Change.Id id = requireNonNull(change.getId());
+      try (Repository repo = repoManager.openRepository(project())) {
+        for (Ref ref : repo.getRefDatabase().getRefsByPrefix(RefNames.REFS_USERS)) {
+          String name = ref.getName().substring(RefNames.REFS_USERS.length());
+          if (id.equals(Change.Id.fromEditRefPart(name))) {
+            Account.Id accountId = Account.Id.fromRefPart(name);
+            if (accountId != null) {
+              editsByUser.put(accountId, ref);
+            }
+          }
+        }
+      } catch (IOException e) {
+        throw new OrmException(e);
+      }
+    }
+    return editsByUser;
+  }
+
+  public Set<Account.Id> draftsByUser() throws OrmException {
+    return draftRefs().keySet();
+  }
+
+  public Map<Account.Id, Ref> draftRefs() throws OrmException {
+    if (draftsByUser == null) {
+      if (!lazyLoad) {
+        return Collections.emptyMap();
+      }
+      Change c = change();
+      if (c == null) {
+        return Collections.emptyMap();
+      }
+
+      draftsByUser = new HashMap<>();
+      if (notesMigration.readChanges()) {
+        for (Ref ref : commentsUtil.getDraftRefs(notes.getChangeId())) {
+          Account.Id account = Account.Id.fromRefSuffix(ref.getName());
+          if (account != null
+              // Double-check that any drafts exist for this user after
+              // filtering out zombies. If some but not all drafts in the ref
+              // were zombies, the returned Ref still includes those zombies;
+              // this is suboptimal, but is ok for the purposes of
+              // draftsByUser(), and easier than trying to rebuild the change at
+              // this point.
+              && !notes().getDraftComments(account, ref).isEmpty()) {
+            draftsByUser.put(account, ref);
+          }
+        }
+      } else {
+        for (Comment sc : commentsUtil.draftByChange(db, notes())) {
+          draftsByUser.put(sc.author.getId(), null);
+        }
+      }
+    }
+    return draftsByUser;
+  }
+
+  public boolean isReviewedBy(Account.Id accountId) throws OrmException {
+    Collection<String> stars = stars(accountId);
+
+    PatchSet ps = currentPatchSet();
+    if (ps != null) {
+      if (stars.contains(StarredChangesUtil.REVIEWED_LABEL + "/" + ps.getPatchSetId())) {
+        return true;
+      }
+
+      if (stars.contains(StarredChangesUtil.UNREVIEWED_LABEL + "/" + ps.getPatchSetId())) {
+        return false;
+      }
+    }
+
+    return reviewedBy().contains(accountId);
+  }
+
+  public Set<Account.Id> reviewedBy() throws OrmException {
+    if (reviewedBy == null) {
+      if (!lazyLoad) {
+        return Collections.emptySet();
+      }
+      Change c = change();
+      if (c == null) {
+        return Collections.emptySet();
+      }
+      List<ReviewedByEvent> events = new ArrayList<>();
+      for (ChangeMessage msg : messages()) {
+        if (msg.getAuthor() != null) {
+          events.add(ReviewedByEvent.create(msg));
+        }
+      }
+      events = Lists.reverse(events);
+      reviewedBy = new LinkedHashSet<>();
+      Account.Id owner = c.getOwner();
+      for (ReviewedByEvent event : events) {
+        if (owner.equals(event.author())) {
+          break;
+        }
+        reviewedBy.add(event.author());
+      }
+    }
+    return reviewedBy;
+  }
+
+  public void setReviewedBy(Set<Account.Id> reviewedBy) {
+    this.reviewedBy = reviewedBy;
+  }
+
+  public Set<String> hashtags() throws OrmException {
+    if (hashtags == null) {
+      if (!lazyLoad) {
+        return Collections.emptySet();
+      }
+      hashtags = notes().getHashtags();
+    }
+    return hashtags;
+  }
+
+  public void setHashtags(Set<String> hashtags) {
+    this.hashtags = hashtags;
+  }
+
+  public ImmutableListMultimap<Account.Id, String> stars() throws OrmException {
+    if (stars == null) {
+      if (!lazyLoad) {
+        return ImmutableListMultimap.of();
+      }
+      ImmutableListMultimap.Builder<Account.Id, String> b = ImmutableListMultimap.builder();
+      for (Map.Entry<Account.Id, StarRef> e : starRefs().entrySet()) {
+        b.putAll(e.getKey(), e.getValue().labels());
+      }
+      return b.build();
+    }
+    return stars;
+  }
+
+  public void setStars(ListMultimap<Account.Id, String> stars) {
+    this.stars = ImmutableListMultimap.copyOf(stars);
+  }
+
+  public ImmutableMap<Account.Id, StarRef> starRefs() throws OrmException {
+    if (starRefs == null) {
+      if (!lazyLoad) {
+        return ImmutableMap.of();
+      }
+      starRefs = requireNonNull(starredChangesUtil).byChange(legacyId);
+    }
+    return starRefs;
+  }
+
+  public Set<String> stars(Account.Id accountId) throws OrmException {
+    if (starsOf != null) {
+      if (!starsOf.accountId().equals(accountId)) {
+        starsOf = null;
+      }
+    }
+    if (starsOf == null) {
+      if (stars != null) {
+        starsOf = StarsOf.create(accountId, stars.get(accountId));
+      } else {
+        if (!lazyLoad) {
+          return ImmutableSet.of();
+        }
+        starsOf = StarsOf.create(accountId, starredChangesUtil.getLabels(accountId, legacyId));
+      }
+    }
+    return starsOf.stars();
+  }
+
+  /**
+   * @return {@code null} if {@code revertOf} is {@code null}; true if the change is a pure revert;
+   *     false otherwise.
+   */
+  @Nullable
+  public Boolean isPureRevert() throws OrmException {
+    if (change().getRevertOf() == null) {
+      return null;
+    }
+    try {
+      return pureRevert.get(notes(), null).isPureRevert;
+    } catch (IOException | BadRequestException | ResourceConflictException e) {
+      throw new OrmException("could not compute pure revert", e);
+    }
+  }
+
+  @Override
+  public String toString() {
+    MoreObjects.ToStringHelper h = MoreObjects.toStringHelper(this);
+    if (change != null) {
+      h.addValue(change);
+    } else {
+      h.addValue(legacyId);
+    }
+    return h.toString();
+  }
+
+  public static class ChangedLines {
+    public final int insertions;
+    public final int deletions;
+
+    public ChangedLines(int insertions, int deletions) {
+      this.insertions = insertions;
+      this.deletions = deletions;
+    }
+  }
+
+  public ImmutableList<byte[]> getRefStates() {
+    return refStates;
+  }
+
+  public void setRefStates(Iterable<byte[]> refStates) {
+    this.refStates = ImmutableList.copyOf(refStates);
+  }
+
+  public ImmutableList<byte[]> getRefStatePatterns() {
+    return refStatePatterns;
+  }
+
+  public void setRefStatePatterns(Iterable<byte[]> refStatePatterns) {
+    this.refStatePatterns = ImmutableList.copyOf(refStatePatterns);
+  }
+
+  @AutoValue
+  abstract static class ReviewedByEvent {
+    private static ReviewedByEvent create(ChangeMessage msg) {
+      return new AutoValue_ChangeData_ReviewedByEvent(msg.getAuthor(), msg.getWrittenOn());
+    }
+
+    public abstract Account.Id author();
+
+    public abstract Timestamp ts();
+  }
+
+  @AutoValue
+  abstract static class StarsOf {
+    private static StarsOf create(Account.Id accountId, Iterable<String> stars) {
+      return new AutoValue_ChangeData_StarsOf(accountId, ImmutableSortedSet.copyOf(stars));
+    }
+
+    public abstract Account.Id accountId();
+
+    public abstract ImmutableSortedSet<String> stars();
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeDataSource.java b/java/com/google/gerrit/server/query/change/ChangeDataSource.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeDataSource.java
rename to java/com/google/gerrit/server/query/change/ChangeDataSource.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeIdPredicate.java b/java/com/google/gerrit/server/query/change/ChangeIdPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeIdPredicate.java
rename to java/com/google/gerrit/server/query/change/ChangeIdPredicate.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeIndexPredicate.java b/java/com/google/gerrit/server/query/change/ChangeIndexPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeIndexPredicate.java
rename to java/com/google/gerrit/server/query/change/ChangeIndexPredicate.java
diff --git a/java/com/google/gerrit/server/query/change/ChangeIsVisibleToPredicate.java b/java/com/google/gerrit/server/query/change/ChangeIsVisibleToPredicate.java
new file mode 100644
index 0000000..f81ea15
--- /dev/null
+++ b/java/com/google/gerrit/server/query/change/ChangeIsVisibleToPredicate.java
@@ -0,0 +1,116 @@
+// Copyright (C) 2010 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.google.gerrit.server.query.change;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.index.query.IsVisibleToPredicate;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.AnonymousUser;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.index.IndexUtils;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Provider;
+import java.io.IOException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+
+public class ChangeIsVisibleToPredicate extends IsVisibleToPredicate<ChangeData> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  protected final Provider<ReviewDb> db;
+  protected final ChangeNotes.Factory notesFactory;
+  protected final CurrentUser user;
+  protected final PermissionBackend permissionBackend;
+  protected final ProjectCache projectCache;
+  private final Provider<AnonymousUser> anonymousUserProvider;
+
+  public ChangeIsVisibleToPredicate(
+      Provider<ReviewDb> db,
+      ChangeNotes.Factory notesFactory,
+      CurrentUser user,
+      PermissionBackend permissionBackend,
+      ProjectCache projectCache,
+      Provider<AnonymousUser> anonymousUserProvider) {
+    super(ChangeQueryBuilder.FIELD_VISIBLETO, IndexUtils.describe(user));
+    this.db = db;
+    this.notesFactory = notesFactory;
+    this.user = user;
+    this.permissionBackend = permissionBackend;
+    this.projectCache = projectCache;
+    this.anonymousUserProvider = anonymousUserProvider;
+  }
+
+  @Override
+  public boolean match(ChangeData cd) throws OrmException {
+    if (cd.fastIsVisibleTo(user)) {
+      return true;
+    }
+    Change change = cd.change();
+    if (change == null) {
+      return false;
+    }
+
+    ChangeNotes notes = notesFactory.createFromIndexedChange(change);
+
+    try {
+      ProjectState projectState = projectCache.checkedGet(cd.project());
+      if (projectState == null) {
+        logger.atFine().log("Filter out change %s of non-existing project %s", cd, cd.project());
+        return false;
+      }
+      if (!projectState.statePermitsRead()) {
+        logger.atFine().log("Filter out change %s of non-reabable project %s", cd, cd.project());
+        return false;
+      }
+    } catch (IOException e) {
+      throw new OrmException("unable to read project state", e);
+    }
+
+    PermissionBackend.WithUser withUser =
+        user.isIdentifiedUser()
+            ? permissionBackend.absentUser(user.getAccountId())
+            : permissionBackend.user(anonymousUserProvider.get());
+    try {
+      withUser.indexedChange(cd, notes).database(db).check(ChangePermission.READ);
+    } catch (PermissionBackendException e) {
+      Throwable cause = e.getCause();
+      if (cause instanceof RepositoryNotFoundException) {
+        logger.atWarning().withCause(e).log(
+            "Filter out change %s because the corresponding repository %s was not found",
+            cd, cd.project());
+        return false;
+      }
+      throw new OrmException("unable to check permissions on change " + cd.getId(), e);
+    } catch (AuthException e) {
+      logger.atFine().log("Filter out non-visisble change: %s", cd);
+      return false;
+    }
+
+    cd.cacheVisibleTo(user);
+    return true;
+  }
+
+  @Override
+  public int getCost() {
+    return 1;
+  }
+}
diff --git a/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java b/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
new file mode 100644
index 0000000..fb34393
--- /dev/null
+++ b/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
@@ -0,0 +1,1382 @@
+// Copyright (C) 2009 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.google.gerrit.server.query.change;
+
+import static com.google.gerrit.reviewdb.client.Change.CHANGE_ID_PATTERN;
+import static com.google.gerrit.server.query.change.ChangeData.asChanges;
+import static java.util.stream.Collectors.toList;
+import static java.util.stream.Collectors.toSet;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Enums;
+import com.google.common.base.Splitter;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.primitives.Ints;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.data.SubmitRecord;
+import com.google.gerrit.common.errors.NotSignedInException;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.registration.Extension;
+import com.google.gerrit.index.IndexConfig;
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.index.SchemaUtil;
+import com.google.gerrit.index.query.LimitPredicate;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryBuilder;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.index.query.QueryRequiresAuthException;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.AnonymousUser;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.StarredChangesUtil;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountResolver;
+import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.account.GroupBackends;
+import com.google.gerrit.server.account.GroupMembers;
+import com.google.gerrit.server.account.VersionedAccountDestinations;
+import com.google.gerrit.server.account.VersionedAccountQueries;
+import com.google.gerrit.server.change.ChangeTriplet;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.index.change.ChangeField;
+import com.google.gerrit.server.index.change.ChangeIndex;
+import com.google.gerrit.server.index.change.ChangeIndexCollection;
+import com.google.gerrit.server.index.change.ChangeIndexRewriter;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gerrit.server.notedb.ReviewerStateInternal;
+import com.google.gerrit.server.patch.PatchListCache;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.project.ChildProjects;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.submit.SubmitDryRun;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.ProvisionException;
+import com.google.inject.util.Providers;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.regex.Pattern;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.Repository;
+
+/** Parses a query string meant to be applied to change objects. */
+public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
+  public interface ChangeOperatorFactory extends OperatorFactory<ChangeData, ChangeQueryBuilder> {}
+
+  /**
+   * Converts a operand (operator value) passed to an operator into a {@link Predicate}.
+   *
+   * <p>Register a ChangeOperandFactory in a config Module like this (note, for an example we are
+   * using the has predicate, when other predicate plugin operands are created they can be
+   * registered in a similar manner):
+   *
+   * <p>bind(ChangeHasOperandFactory.class) .annotatedWith(Exports.named("your has operand"))
+   * .to(YourClass.class);
+   */
+  private interface ChangeOperandFactory {
+    Predicate<ChangeData> create(ChangeQueryBuilder builder) throws QueryParseException;
+  }
+
+  public interface ChangeHasOperandFactory extends ChangeOperandFactory {}
+
+  private static final Pattern PAT_LEGACY_ID = Pattern.compile("^[1-9][0-9]*$");
+  private static final Pattern PAT_CHANGE_ID = Pattern.compile(CHANGE_ID_PATTERN);
+  private static final Pattern DEF_CHANGE =
+      Pattern.compile("^(?:[1-9][0-9]*|(?:[^~]+~[^~]+~)?[iI][0-9a-f]{4,}.*)$");
+
+  static final int MAX_ACCOUNTS_PER_DEFAULT_FIELD = 10;
+
+  // NOTE: As new search operations are added, please keep the
+  // SearchSuggestOracle up to date.
+
+  public static final String FIELD_ADDED = "added";
+  public static final String FIELD_AGE = "age";
+  public static final String FIELD_ASSIGNEE = "assignee";
+  public static final String FIELD_AUTHOR = "author";
+  public static final String FIELD_EXACTAUTHOR = "exactauthor";
+  public static final String FIELD_BEFORE = "before";
+  public static final String FIELD_CHANGE = "change";
+  public static final String FIELD_CHANGE_ID = "change_id";
+  public static final String FIELD_COMMENT = "comment";
+  public static final String FIELD_COMMENTBY = "commentby";
+  public static final String FIELD_COMMIT = "commit";
+  public static final String FIELD_COMMITTER = "committer";
+  public static final String FIELD_EXACTCOMMITTER = "exactcommitter";
+  public static final String FIELD_CONFLICTS = "conflicts";
+  public static final String FIELD_DELETED = "deleted";
+  public static final String FIELD_DELTA = "delta";
+  public static final String FIELD_DESTINATION = "destination";
+  public static final String FIELD_DRAFTBY = "draftby";
+  public static final String FIELD_EDITBY = "editby";
+  public static final String FIELD_EXACTCOMMIT = "exactcommit";
+  public static final String FIELD_FILE = "file";
+  public static final String FIELD_FILEPART = "filepart";
+  public static final String FIELD_GROUP = "group";
+  public static final String FIELD_HASHTAG = "hashtag";
+  public static final String FIELD_LABEL = "label";
+  public static final String FIELD_LIMIT = "limit";
+  public static final String FIELD_MERGE = "merge";
+  public static final String FIELD_MERGEABLE = "mergeable2";
+  public static final String FIELD_MESSAGE = "message";
+  public static final String FIELD_OWNER = "owner";
+  public static final String FIELD_OWNERIN = "ownerin";
+  public static final String FIELD_PARENTPROJECT = "parentproject";
+  public static final String FIELD_PATH = "path";
+  public static final String FIELD_PENDING_REVIEWER = "pendingreviewer";
+  public static final String FIELD_PENDING_REVIEWER_BY_EMAIL = "pendingreviewerbyemail";
+  public static final String FIELD_PRIVATE = "private";
+  public static final String FIELD_PROJECT = "project";
+  public static final String FIELD_PROJECTS = "projects";
+  public static final String FIELD_REF = "ref";
+  public static final String FIELD_REVIEWEDBY = "reviewedby";
+  public static final String FIELD_REVIEWER = "reviewer";
+  public static final String FIELD_REVIEWERIN = "reviewerin";
+  public static final String FIELD_STAR = "star";
+  public static final String FIELD_STARBY = "starby";
+  public static final String FIELD_STARREDBY = "starredby";
+  public static final String FIELD_STARTED = "started";
+  public static final String FIELD_STATUS = "status";
+  public static final String FIELD_SUBMISSIONID = "submissionid";
+  public static final String FIELD_TR = "tr";
+  public static final String FIELD_UNRESOLVED_COMMENT_COUNT = "unresolved";
+  public static final String FIELD_VISIBLETO = "visibleto";
+  public static final String FIELD_WATCHEDBY = "watchedby";
+  public static final String FIELD_WIP = "wip";
+  public static final String FIELD_REVERTOF = "revertof";
+
+  public static final String ARG_ID_USER = "user";
+  public static final String ARG_ID_GROUP = "group";
+  public static final String ARG_ID_OWNER = "owner";
+  public static final Account.Id OWNER_ACCOUNT_ID = new Account.Id(0);
+
+  private static final QueryBuilder.Definition<ChangeData, ChangeQueryBuilder> mydef =
+      new QueryBuilder.Definition<>(ChangeQueryBuilder.class);
+
+  @VisibleForTesting
+  public static class Arguments {
+    final AccountCache accountCache;
+    final AccountResolver accountResolver;
+    final AllProjectsName allProjectsName;
+    final AllUsersName allUsersName;
+    final PermissionBackend permissionBackend;
+    final ChangeData.Factory changeDataFactory;
+    final ChangeIndex index;
+    final ChangeIndexRewriter rewriter;
+    final ChangeNotes.Factory notesFactory;
+    final CommentsUtil commentsUtil;
+    final ConflictsCache conflictsCache;
+    final DynamicMap<ChangeHasOperandFactory> hasOperands;
+    final DynamicMap<ChangeOperatorFactory> opFactories;
+    final GitRepositoryManager repoManager;
+    final GroupBackend groupBackend;
+    final IdentifiedUser.GenericFactory userFactory;
+    final IndexConfig indexConfig;
+    final NotesMigration notesMigration;
+    final PatchListCache patchListCache;
+    final ProjectCache projectCache;
+    final Provider<InternalChangeQuery> queryProvider;
+    final ChildProjects childProjects;
+    final Provider<ReviewDb> db;
+    final StarredChangesUtil starredChangesUtil;
+    final SubmitDryRun submitDryRun;
+    final GroupMembers groupMembers;
+    final Provider<AnonymousUser> anonymousUserProvider;
+
+    private final Provider<CurrentUser> self;
+
+    @Inject
+    @VisibleForTesting
+    public Arguments(
+        Provider<ReviewDb> db,
+        Provider<InternalChangeQuery> queryProvider,
+        ChangeIndexRewriter rewriter,
+        DynamicMap<ChangeOperatorFactory> opFactories,
+        DynamicMap<ChangeHasOperandFactory> hasOperands,
+        IdentifiedUser.GenericFactory userFactory,
+        Provider<CurrentUser> self,
+        PermissionBackend permissionBackend,
+        ChangeNotes.Factory notesFactory,
+        ChangeData.Factory changeDataFactory,
+        CommentsUtil commentsUtil,
+        AccountResolver accountResolver,
+        GroupBackend groupBackend,
+        AllProjectsName allProjectsName,
+        AllUsersName allUsersName,
+        PatchListCache patchListCache,
+        GitRepositoryManager repoManager,
+        ProjectCache projectCache,
+        ChildProjects childProjects,
+        ChangeIndexCollection indexes,
+        SubmitDryRun submitDryRun,
+        ConflictsCache conflictsCache,
+        IndexConfig indexConfig,
+        StarredChangesUtil starredChangesUtil,
+        AccountCache accountCache,
+        NotesMigration notesMigration,
+        GroupMembers groupMembers,
+        Provider<AnonymousUser> anonymousUserProvider) {
+      this(
+          db,
+          queryProvider,
+          rewriter,
+          opFactories,
+          hasOperands,
+          userFactory,
+          self,
+          permissionBackend,
+          notesFactory,
+          changeDataFactory,
+          commentsUtil,
+          accountResolver,
+          groupBackend,
+          allProjectsName,
+          allUsersName,
+          patchListCache,
+          repoManager,
+          projectCache,
+          childProjects,
+          submitDryRun,
+          conflictsCache,
+          indexes != null ? indexes.getSearchIndex() : null,
+          indexConfig,
+          starredChangesUtil,
+          accountCache,
+          notesMigration,
+          groupMembers,
+          anonymousUserProvider);
+    }
+
+    private Arguments(
+        Provider<ReviewDb> db,
+        Provider<InternalChangeQuery> queryProvider,
+        ChangeIndexRewriter rewriter,
+        DynamicMap<ChangeOperatorFactory> opFactories,
+        DynamicMap<ChangeHasOperandFactory> hasOperands,
+        IdentifiedUser.GenericFactory userFactory,
+        Provider<CurrentUser> self,
+        PermissionBackend permissionBackend,
+        ChangeNotes.Factory notesFactory,
+        ChangeData.Factory changeDataFactory,
+        CommentsUtil commentsUtil,
+        AccountResolver accountResolver,
+        GroupBackend groupBackend,
+        AllProjectsName allProjectsName,
+        AllUsersName allUsersName,
+        PatchListCache patchListCache,
+        GitRepositoryManager repoManager,
+        ProjectCache projectCache,
+        ChildProjects childProjects,
+        SubmitDryRun submitDryRun,
+        ConflictsCache conflictsCache,
+        ChangeIndex index,
+        IndexConfig indexConfig,
+        StarredChangesUtil starredChangesUtil,
+        AccountCache accountCache,
+        NotesMigration notesMigration,
+        GroupMembers groupMembers,
+        Provider<AnonymousUser> anonymousUserProvider) {
+      this.db = db;
+      this.queryProvider = queryProvider;
+      this.rewriter = rewriter;
+      this.opFactories = opFactories;
+      this.userFactory = userFactory;
+      this.self = self;
+      this.permissionBackend = permissionBackend;
+      this.notesFactory = notesFactory;
+      this.changeDataFactory = changeDataFactory;
+      this.commentsUtil = commentsUtil;
+      this.accountResolver = accountResolver;
+      this.groupBackend = groupBackend;
+      this.allProjectsName = allProjectsName;
+      this.allUsersName = allUsersName;
+      this.patchListCache = patchListCache;
+      this.repoManager = repoManager;
+      this.projectCache = projectCache;
+      this.childProjects = childProjects;
+      this.submitDryRun = submitDryRun;
+      this.conflictsCache = conflictsCache;
+      this.index = index;
+      this.indexConfig = indexConfig;
+      this.starredChangesUtil = starredChangesUtil;
+      this.accountCache = accountCache;
+      this.hasOperands = hasOperands;
+      this.notesMigration = notesMigration;
+      this.groupMembers = groupMembers;
+      this.anonymousUserProvider = anonymousUserProvider;
+    }
+
+    Arguments asUser(CurrentUser otherUser) {
+      return new Arguments(
+          db,
+          queryProvider,
+          rewriter,
+          opFactories,
+          hasOperands,
+          userFactory,
+          Providers.of(otherUser),
+          permissionBackend,
+          notesFactory,
+          changeDataFactory,
+          commentsUtil,
+          accountResolver,
+          groupBackend,
+          allProjectsName,
+          allUsersName,
+          patchListCache,
+          repoManager,
+          projectCache,
+          childProjects,
+          submitDryRun,
+          conflictsCache,
+          index,
+          indexConfig,
+          starredChangesUtil,
+          accountCache,
+          notesMigration,
+          groupMembers,
+          anonymousUserProvider);
+    }
+
+    Arguments asUser(Account.Id otherId) {
+      try {
+        CurrentUser u = self.get();
+        if (u.isIdentifiedUser() && otherId.equals(u.getAccountId())) {
+          return this;
+        }
+      } catch (ProvisionException e) {
+        // Doesn't match current user, continue.
+      }
+      return asUser(userFactory.create(otherId));
+    }
+
+    IdentifiedUser getIdentifiedUser() throws QueryRequiresAuthException {
+      try {
+        CurrentUser u = getUser();
+        if (u.isIdentifiedUser()) {
+          return u.asIdentifiedUser();
+        }
+        throw new QueryRequiresAuthException(NotSignedInException.MESSAGE);
+      } catch (ProvisionException e) {
+        throw new QueryRequiresAuthException(NotSignedInException.MESSAGE, e);
+      }
+    }
+
+    CurrentUser getUser() throws QueryRequiresAuthException {
+      try {
+        return self.get();
+      } catch (ProvisionException e) {
+        throw new QueryRequiresAuthException(NotSignedInException.MESSAGE, e);
+      }
+    }
+
+    Schema<ChangeData> getSchema() {
+      return index != null ? index.getSchema() : null;
+    }
+  }
+
+  private final Arguments args;
+
+  @Inject
+  ChangeQueryBuilder(Arguments args) {
+    super(mydef);
+    this.args = args;
+    setupDynamicOperators();
+  }
+
+  @VisibleForTesting
+  protected ChangeQueryBuilder(
+      Definition<ChangeData, ? extends QueryBuilder<ChangeData>> def, Arguments args) {
+    super(def);
+    this.args = args;
+  }
+
+  private void setupDynamicOperators() {
+    for (Extension<ChangeOperatorFactory> e : args.opFactories) {
+      String name = e.getExportName() + "_" + e.getPluginName();
+      opFactories.put(name, e.getProvider().get());
+    }
+  }
+
+  public Arguments getArgs() {
+    return args;
+  }
+
+  public ChangeQueryBuilder asUser(CurrentUser user) {
+    return new ChangeQueryBuilder(builderDef, args.asUser(user));
+  }
+
+  @Operator
+  public Predicate<ChangeData> age(String value) {
+    return new AgePredicate(value);
+  }
+
+  @Operator
+  public Predicate<ChangeData> before(String value) throws QueryParseException {
+    return new BeforePredicate(value);
+  }
+
+  @Operator
+  public Predicate<ChangeData> until(String value) throws QueryParseException {
+    return before(value);
+  }
+
+  @Operator
+  public Predicate<ChangeData> after(String value) throws QueryParseException {
+    return new AfterPredicate(value);
+  }
+
+  @Operator
+  public Predicate<ChangeData> since(String value) throws QueryParseException {
+    return after(value);
+  }
+
+  @Operator
+  public Predicate<ChangeData> change(String query) throws QueryParseException {
+    Optional<ChangeTriplet> triplet = ChangeTriplet.parse(query);
+    if (triplet.isPresent()) {
+      return Predicate.and(
+          project(triplet.get().project().get()),
+          branch(triplet.get().branch().get()),
+          new ChangeIdPredicate(parseChangeId(triplet.get().id().get())));
+    }
+    if (PAT_LEGACY_ID.matcher(query).matches()) {
+      Integer id = Ints.tryParse(query);
+      if (id != null) {
+        return new LegacyChangeIdPredicate(new Change.Id(id));
+      }
+    } else if (PAT_CHANGE_ID.matcher(query).matches()) {
+      return new ChangeIdPredicate(parseChangeId(query));
+    }
+
+    throw new QueryParseException("Invalid change format");
+  }
+
+  @Operator
+  public Predicate<ChangeData> comment(String value) {
+    return new CommentPredicate(args.index, value);
+  }
+
+  @Operator
+  public Predicate<ChangeData> status(String statusName) {
+    if ("reviewed".equalsIgnoreCase(statusName)) {
+      return IsReviewedPredicate.create();
+    }
+    return ChangeStatusPredicate.parse(statusName);
+  }
+
+  public Predicate<ChangeData> status_open() {
+    return ChangeStatusPredicate.open();
+  }
+
+  @Operator
+  public Predicate<ChangeData> has(String value) throws QueryParseException {
+    if ("star".equalsIgnoreCase(value)) {
+      return starredby(self());
+    }
+
+    if ("stars".equalsIgnoreCase(value)) {
+      return new HasStarsPredicate(self());
+    }
+
+    if ("draft".equalsIgnoreCase(value)) {
+      return draftby(self());
+    }
+
+    if ("edit".equalsIgnoreCase(value)) {
+      return new EditByPredicate(self());
+    }
+
+    if ("unresolved".equalsIgnoreCase(value)) {
+      return new IsUnresolvedPredicate();
+    }
+
+    // for plugins the value will be operandName_pluginName
+    List<String> names = Lists.newArrayList(Splitter.on('_').split(value));
+    if (names.size() == 2) {
+      ChangeHasOperandFactory op = args.hasOperands.get(names.get(1), names.get(0));
+      if (op != null) {
+        return op.create(this);
+      }
+    }
+
+    throw new IllegalArgumentException();
+  }
+
+  @Operator
+  public Predicate<ChangeData> is(String value) throws QueryParseException {
+    if ("starred".equalsIgnoreCase(value)) {
+      return starredby(self());
+    }
+
+    if ("watched".equalsIgnoreCase(value)) {
+      return new IsWatchedByPredicate(args, false);
+    }
+
+    if ("visible".equalsIgnoreCase(value)) {
+      return is_visible();
+    }
+
+    if ("reviewed".equalsIgnoreCase(value)) {
+      return IsReviewedPredicate.create();
+    }
+
+    if ("owner".equalsIgnoreCase(value)) {
+      return new OwnerPredicate(self());
+    }
+
+    if ("reviewer".equalsIgnoreCase(value)) {
+      if (args.getSchema().hasField(ChangeField.WIP)) {
+        return Predicate.and(
+            Predicate.not(new BooleanPredicate(ChangeField.WIP)),
+            ReviewerPredicate.reviewer(args, self()));
+      }
+      return ReviewerPredicate.reviewer(args, self());
+    }
+
+    if ("cc".equalsIgnoreCase(value)) {
+      return ReviewerPredicate.cc(self());
+    }
+
+    if ("mergeable".equalsIgnoreCase(value)) {
+      return new BooleanPredicate(ChangeField.MERGEABLE);
+    }
+
+    if ("private".equalsIgnoreCase(value)) {
+      if (args.getSchema().hasField(ChangeField.PRIVATE)) {
+        return new BooleanPredicate(ChangeField.PRIVATE);
+      }
+      throw new QueryParseException(
+          "'is:private' operator is not supported by change index version");
+    }
+
+    if ("assigned".equalsIgnoreCase(value)) {
+      return Predicate.not(new AssigneePredicate(new Account.Id(ChangeField.NO_ASSIGNEE)));
+    }
+
+    if ("unassigned".equalsIgnoreCase(value)) {
+      return new AssigneePredicate(new Account.Id(ChangeField.NO_ASSIGNEE));
+    }
+
+    if ("submittable".equalsIgnoreCase(value)) {
+      return new SubmittablePredicate(SubmitRecord.Status.OK);
+    }
+
+    if ("ignored".equalsIgnoreCase(value)) {
+      return star("ignore");
+    }
+
+    if ("started".equalsIgnoreCase(value)) {
+      if (args.getSchema().hasField(ChangeField.STARTED)) {
+        return new BooleanPredicate(ChangeField.STARTED);
+      }
+      throw new QueryParseException(
+          "'is:started' operator is not supported by change index version");
+    }
+
+    if ("wip".equalsIgnoreCase(value)) {
+      if (args.getSchema().hasField(ChangeField.WIP)) {
+        return new BooleanPredicate(ChangeField.WIP);
+      }
+      throw new QueryParseException("'is:wip' operator is not supported by change index version");
+    }
+
+    return status(value);
+  }
+
+  @Operator
+  public Predicate<ChangeData> commit(String id) {
+    return new CommitPredicate(id);
+  }
+
+  @Operator
+  public Predicate<ChangeData> conflicts(String value) throws OrmException, QueryParseException {
+    List<Change> changes = parseChange(value);
+    List<Predicate<ChangeData>> or = new ArrayList<>(changes.size());
+    for (Change c : changes) {
+      or.add(ConflictsPredicate.create(args, value, c));
+    }
+    return Predicate.or(or);
+  }
+
+  @Operator
+  public Predicate<ChangeData> p(String name) {
+    return project(name);
+  }
+
+  @Operator
+  public Predicate<ChangeData> project(String name) {
+    if (name.startsWith("^")) {
+      return new RegexProjectPredicate(name);
+    }
+    return new ProjectPredicate(name);
+  }
+
+  @Operator
+  public Predicate<ChangeData> projects(String name) {
+    return new ProjectPrefixPredicate(name);
+  }
+
+  @Operator
+  public Predicate<ChangeData> parentproject(String name) {
+    return new ParentProjectPredicate(args.projectCache, args.childProjects, name);
+  }
+
+  @Operator
+  public Predicate<ChangeData> repository(String name) {
+    return project(name);
+  }
+
+  @Operator
+  public Predicate<ChangeData> repositories(String name) {
+    return projects(name);
+  }
+
+  @Operator
+  public Predicate<ChangeData> parentrepository(String name) {
+    return parentproject(name);
+  }
+
+  @Operator
+  public Predicate<ChangeData> repo(String name) {
+    return project(name);
+  }
+
+  @Operator
+  public Predicate<ChangeData> repos(String name) {
+    return projects(name);
+  }
+
+  @Operator
+  public Predicate<ChangeData> parentrepo(String name) {
+    return parentproject(name);
+  }
+
+  @Operator
+  public Predicate<ChangeData> branch(String name) {
+    if (name.startsWith("^")) {
+      return ref("^" + RefNames.fullName(name.substring(1)));
+    }
+    return ref(RefNames.fullName(name));
+  }
+
+  @Operator
+  public Predicate<ChangeData> hashtag(String hashtag) {
+    return new HashtagPredicate(hashtag);
+  }
+
+  @Operator
+  public Predicate<ChangeData> topic(String name) {
+    return new ExactTopicPredicate(name);
+  }
+
+  @Operator
+  public Predicate<ChangeData> intopic(String name) {
+    if (name.startsWith("^")) {
+      return new RegexTopicPredicate(name);
+    }
+    if (name.isEmpty()) {
+      return new ExactTopicPredicate(name);
+    }
+    return new FuzzyTopicPredicate(name, args.index);
+  }
+
+  @Operator
+  public Predicate<ChangeData> ref(String ref) {
+    if (ref.startsWith("^")) {
+      return new RegexRefPredicate(ref);
+    }
+    return new RefPredicate(ref);
+  }
+
+  @Operator
+  public Predicate<ChangeData> f(String file) {
+    return file(file);
+  }
+
+  @Operator
+  public Predicate<ChangeData> file(String file) {
+    if (file.startsWith("^")) {
+      return new RegexPathPredicate(file);
+    }
+    return EqualsFilePredicate.create(args, file);
+  }
+
+  @Operator
+  public Predicate<ChangeData> path(String path) {
+    if (path.startsWith("^")) {
+      return new RegexPathPredicate(path);
+    }
+    return new EqualsPathPredicate(FIELD_PATH, path);
+  }
+
+  @Operator
+  public Predicate<ChangeData> label(String name)
+      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
+    Set<Account.Id> accounts = null;
+    AccountGroup.UUID group = null;
+
+    // Parse for:
+    // label:CodeReview=1,user=jsmith or
+    // label:CodeReview=1,jsmith or
+    // label:CodeReview=1,group=android_approvers or
+    // label:CodeReview=1,android_approvers
+    // user/groups without a label will first attempt to match user
+    // Special case: votes by owners can be tracked with ",owner":
+    // label:Code-Review+2,owner
+    // label:Code-Review+2,user=owner
+    List<String> splitReviewer = Lists.newArrayList(Splitter.on(',').limit(2).split(name));
+    name = splitReviewer.get(0); // remove all but the vote piece, e.g.'CodeReview=1'
+
+    if (splitReviewer.size() == 2) {
+      // process the user/group piece
+      PredicateArgs lblArgs = new PredicateArgs(splitReviewer.get(1));
+
+      for (Map.Entry<String, String> pair : lblArgs.keyValue.entrySet()) {
+        if (pair.getKey().equalsIgnoreCase(ARG_ID_USER)) {
+          if (pair.getValue().equals(ARG_ID_OWNER)) {
+            accounts = Collections.singleton(OWNER_ACCOUNT_ID);
+          } else {
+            accounts = parseAccount(pair.getValue());
+          }
+        } else if (pair.getKey().equalsIgnoreCase(ARG_ID_GROUP)) {
+          group = parseGroup(pair.getValue()).getUUID();
+        } else {
+          throw new QueryParseException("Invalid argument identifier '" + pair.getKey() + "'");
+        }
+      }
+
+      for (String value : lblArgs.positional) {
+        if (accounts != null || group != null) {
+          throw new QueryParseException("more than one user/group specified (" + value + ")");
+        }
+        try {
+          if (value.equals(ARG_ID_OWNER)) {
+            accounts = Collections.singleton(OWNER_ACCOUNT_ID);
+          } else {
+            accounts = parseAccount(value);
+          }
+        } catch (QueryParseException qpex) {
+          // If it doesn't match an account, see if it matches a group
+          // (accounts get precedence)
+          try {
+            group = parseGroup(value).getUUID();
+          } catch (QueryParseException e) {
+            throw error("Neither user nor group " + value + " found", e);
+          }
+        }
+      }
+    }
+
+    if (group != null) {
+      accounts = getMembers(group);
+    }
+
+    // If the vote piece looks like Code-Review=NEED with a valid non-numeric
+    // submit record status, interpret as a submit record query.
+    int eq = name.indexOf('=');
+    if (args.getSchema().hasField(ChangeField.SUBMIT_RECORD) && eq > 0) {
+      String statusName = name.substring(eq + 1).toUpperCase();
+      if (!isInt(statusName)) {
+        SubmitRecord.Label.Status status =
+            Enums.getIfPresent(SubmitRecord.Label.Status.class, statusName).orNull();
+        if (status == null) {
+          throw error("Invalid label status " + statusName + " in " + name);
+        }
+        return SubmitRecordPredicate.create(name.substring(0, eq), status, accounts);
+      }
+    }
+
+    return new LabelPredicate(args, name, accounts, group);
+  }
+
+  private static boolean isInt(String s) {
+    if (s == null) {
+      return false;
+    }
+    if (s.startsWith("+")) {
+      s = s.substring(1);
+    }
+    return Ints.tryParse(s) != null;
+  }
+
+  @Operator
+  public Predicate<ChangeData> message(String text) {
+    return new MessagePredicate(args.index, text);
+  }
+
+  @Operator
+  public Predicate<ChangeData> star(String label) throws QueryParseException {
+    return new StarPredicate(self(), label);
+  }
+
+  @Operator
+  public Predicate<ChangeData> starredby(String who)
+      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
+    return starredby(parseAccount(who));
+  }
+
+  private Predicate<ChangeData> starredby(Set<Account.Id> who) {
+    List<Predicate<ChangeData>> p = Lists.newArrayListWithCapacity(who.size());
+    for (Account.Id id : who) {
+      p.add(starredby(id));
+    }
+    return Predicate.or(p);
+  }
+
+  private Predicate<ChangeData> starredby(Account.Id who) {
+    return new StarPredicate(who, StarredChangesUtil.DEFAULT_LABEL);
+  }
+
+  @Operator
+  public Predicate<ChangeData> watchedby(String who)
+      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
+    Set<Account.Id> m = parseAccount(who);
+    List<IsWatchedByPredicate> p = Lists.newArrayListWithCapacity(m.size());
+
+    Account.Id callerId;
+    try {
+      CurrentUser caller = args.self.get();
+      callerId = caller.isIdentifiedUser() ? caller.getAccountId() : null;
+    } catch (ProvisionException e) {
+      callerId = null;
+    }
+
+    for (Account.Id id : m) {
+      // Each child IsWatchedByPredicate includes a visibility filter for the
+      // corresponding user, to ensure that predicate subtree only returns
+      // changes visible to that user. The exception is if one of the users is
+      // the caller of this method, in which case visibility is already being
+      // checked at the top level.
+      p.add(new IsWatchedByPredicate(args.asUser(id), !id.equals(callerId)));
+    }
+    return Predicate.or(p);
+  }
+
+  @Operator
+  public Predicate<ChangeData> draftby(String who)
+      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
+    Set<Account.Id> m = parseAccount(who);
+    List<Predicate<ChangeData>> p = Lists.newArrayListWithCapacity(m.size());
+    for (Account.Id id : m) {
+      p.add(draftby(id));
+    }
+    return Predicate.or(p);
+  }
+
+  private Predicate<ChangeData> draftby(Account.Id who) {
+    return new HasDraftByPredicate(who);
+  }
+
+  private boolean isSelf(String who) {
+    return "self".equals(who) || "me".equals(who);
+  }
+
+  @Operator
+  public Predicate<ChangeData> visibleto(String who)
+      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
+    if (isSelf(who)) {
+      return is_visible();
+    }
+    Set<Account.Id> m = args.accountResolver.findAll(who);
+    if (!m.isEmpty()) {
+      List<Predicate<ChangeData>> p = Lists.newArrayListWithCapacity(m.size());
+      for (Account.Id id : m) {
+        return visibleto(args.userFactory.create(id));
+      }
+      return Predicate.or(p);
+    }
+
+    // If its not an account, maybe its a group?
+    Collection<GroupReference> suggestions = args.groupBackend.suggest(who, null);
+    if (!suggestions.isEmpty()) {
+      HashSet<AccountGroup.UUID> ids = new HashSet<>();
+      for (GroupReference ref : suggestions) {
+        ids.add(ref.getUUID());
+      }
+      return visibleto(new SingleGroupUser(ids));
+    }
+
+    throw error("No user or group matches \"" + who + "\".");
+  }
+
+  public Predicate<ChangeData> visibleto(CurrentUser user) {
+    return new ChangeIsVisibleToPredicate(
+        args.db,
+        args.notesFactory,
+        user,
+        args.permissionBackend,
+        args.projectCache,
+        args.anonymousUserProvider);
+  }
+
+  public Predicate<ChangeData> is_visible() throws QueryParseException {
+    return visibleto(args.getUser());
+  }
+
+  @Operator
+  public Predicate<ChangeData> o(String who)
+      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
+    return owner(who);
+  }
+
+  @Operator
+  public Predicate<ChangeData> owner(String who)
+      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
+    return owner(parseAccount(who));
+  }
+
+  private Predicate<ChangeData> owner(Set<Account.Id> who) {
+    List<OwnerPredicate> p = Lists.newArrayListWithCapacity(who.size());
+    for (Account.Id id : who) {
+      p.add(new OwnerPredicate(id));
+    }
+    return Predicate.or(p);
+  }
+
+  private Predicate<ChangeData> ownerDefaultField(String who)
+      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
+    Set<Account.Id> accounts = parseAccount(who);
+    if (accounts.size() > MAX_ACCOUNTS_PER_DEFAULT_FIELD) {
+      return Predicate.any();
+    }
+    return owner(accounts);
+  }
+
+  @Operator
+  public Predicate<ChangeData> assignee(String who)
+      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
+    return assignee(parseAccount(who));
+  }
+
+  private Predicate<ChangeData> assignee(Set<Account.Id> who) {
+    List<AssigneePredicate> p = Lists.newArrayListWithCapacity(who.size());
+    for (Account.Id id : who) {
+      p.add(new AssigneePredicate(id));
+    }
+    return Predicate.or(p);
+  }
+
+  @Operator
+  public Predicate<ChangeData> ownerin(String group) throws QueryParseException, IOException {
+    GroupReference g = GroupBackends.findBestSuggestion(args.groupBackend, group);
+    if (g == null) {
+      throw error("Group " + group + " not found");
+    }
+
+    AccountGroup.UUID groupId = g.getUUID();
+    GroupDescription.Basic groupDescription = args.groupBackend.get(groupId);
+    if (!(groupDescription instanceof GroupDescription.Internal)) {
+      return new OwnerinPredicate(args.userFactory, groupId);
+    }
+
+    Set<Account.Id> accounts = getMembers(groupId);
+    List<OwnerPredicate> p = Lists.newArrayListWithCapacity(accounts.size());
+    for (Account.Id id : accounts) {
+      p.add(new OwnerPredicate(id));
+    }
+    return Predicate.or(p);
+  }
+
+  @Operator
+  public Predicate<ChangeData> r(String who)
+      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
+    return reviewer(who);
+  }
+
+  @Operator
+  public Predicate<ChangeData> reviewer(String who)
+      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
+    return reviewer(who, false);
+  }
+
+  private Predicate<ChangeData> reviewerDefaultField(String who)
+      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
+    return reviewer(who, true);
+  }
+
+  private Predicate<ChangeData> reviewer(String who, boolean forDefaultField)
+      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
+    Predicate<ChangeData> byState =
+        reviewerByState(who, ReviewerStateInternal.REVIEWER, forDefaultField);
+    if (Objects.equals(byState, Predicate.<ChangeData>any())) {
+      return Predicate.any();
+    }
+    if (args.getSchema().hasField(ChangeField.WIP)) {
+      return Predicate.and(Predicate.not(new BooleanPredicate(ChangeField.WIP)), byState);
+    }
+    return byState;
+  }
+
+  @Operator
+  public Predicate<ChangeData> cc(String who)
+      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
+    return reviewerByState(who, ReviewerStateInternal.CC, false);
+  }
+
+  @Operator
+  public Predicate<ChangeData> reviewerin(String group) throws QueryParseException {
+    GroupReference g = GroupBackends.findBestSuggestion(args.groupBackend, group);
+    if (g == null) {
+      throw error("Group " + group + " not found");
+    }
+    return new ReviewerinPredicate(args.userFactory, g.getUUID());
+  }
+
+  @Operator
+  public Predicate<ChangeData> tr(String trackingId) {
+    return new TrackingIdPredicate(trackingId);
+  }
+
+  @Operator
+  public Predicate<ChangeData> bug(String trackingId) {
+    return tr(trackingId);
+  }
+
+  @Operator
+  public Predicate<ChangeData> limit(String query) throws QueryParseException {
+    Integer limit = Ints.tryParse(query);
+    if (limit == null) {
+      throw error("Invalid limit: " + query);
+    }
+    return new LimitPredicate<>(FIELD_LIMIT, limit);
+  }
+
+  @Operator
+  public Predicate<ChangeData> added(String value) throws QueryParseException {
+    return new AddedPredicate(value);
+  }
+
+  @Operator
+  public Predicate<ChangeData> deleted(String value) throws QueryParseException {
+    return new DeletedPredicate(value);
+  }
+
+  @Operator
+  public Predicate<ChangeData> size(String value) throws QueryParseException {
+    return delta(value);
+  }
+
+  @Operator
+  public Predicate<ChangeData> delta(String value) throws QueryParseException {
+    return new DeltaPredicate(value);
+  }
+
+  @Operator
+  public Predicate<ChangeData> commentby(String who)
+      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
+    return commentby(parseAccount(who));
+  }
+
+  private Predicate<ChangeData> commentby(Set<Account.Id> who) {
+    List<CommentByPredicate> p = Lists.newArrayListWithCapacity(who.size());
+    for (Account.Id id : who) {
+      p.add(new CommentByPredicate(id));
+    }
+    return Predicate.or(p);
+  }
+
+  @Operator
+  public Predicate<ChangeData> from(String who)
+      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
+    Set<Account.Id> ownerIds = parseAccount(who);
+    return Predicate.or(owner(ownerIds), commentby(ownerIds));
+  }
+
+  @Operator
+  public Predicate<ChangeData> query(String name) throws QueryParseException {
+    try (Repository git = args.repoManager.openRepository(args.allUsersName)) {
+      VersionedAccountQueries q = VersionedAccountQueries.forUser(self());
+      q.load(args.allUsersName, git);
+      String query = q.getQueryList().getQuery(name);
+      if (query != null) {
+        return parse(query);
+      }
+    } catch (RepositoryNotFoundException e) {
+      throw new QueryParseException(
+          "Unknown named query (no " + args.allUsersName + " repo): " + name, e);
+    } catch (IOException | ConfigInvalidException e) {
+      throw new QueryParseException("Error parsing named query: " + name, e);
+    }
+    throw new QueryParseException("Unknown named query: " + name);
+  }
+
+  @Operator
+  public Predicate<ChangeData> reviewedby(String who)
+      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
+    return IsReviewedPredicate.create(parseAccount(who));
+  }
+
+  @Operator
+  public Predicate<ChangeData> destination(String name) throws QueryParseException {
+    try (Repository git = args.repoManager.openRepository(args.allUsersName)) {
+      VersionedAccountDestinations d = VersionedAccountDestinations.forUser(self());
+      d.load(args.allUsersName, git);
+      Set<Branch.NameKey> destinations = d.getDestinationList().getDestinations(name);
+      if (destinations != null && !destinations.isEmpty()) {
+        return new DestinationPredicate(destinations, name);
+      }
+    } catch (RepositoryNotFoundException e) {
+      throw new QueryParseException(
+          "Unknown named destination (no " + args.allUsersName + " repo): " + name, e);
+    } catch (IOException | ConfigInvalidException e) {
+      throw new QueryParseException("Error parsing named destination: " + name, e);
+    }
+    throw new QueryParseException("Unknown named destination: " + name);
+  }
+
+  @Operator
+  public Predicate<ChangeData> author(String who) throws QueryParseException {
+    if (args.getSchema().hasField(ChangeField.EXACT_AUTHOR)) {
+      return getAuthorOrCommitterPredicate(
+          who.trim(), ExactAuthorPredicate::new, AuthorPredicate::new);
+    }
+    return getAuthorOrCommitterFullTextPredicate(who.trim(), AuthorPredicate::new);
+  }
+
+  @Operator
+  public Predicate<ChangeData> committer(String who) throws QueryParseException {
+    if (args.getSchema().hasField(ChangeField.EXACT_COMMITTER)) {
+      return getAuthorOrCommitterPredicate(
+          who.trim(), ExactCommitterPredicate::new, CommitterPredicate::new);
+    }
+    return getAuthorOrCommitterFullTextPredicate(who.trim(), CommitterPredicate::new);
+  }
+
+  @Operator
+  public Predicate<ChangeData> submittable(String str) throws QueryParseException {
+    SubmitRecord.Status status =
+        Enums.getIfPresent(SubmitRecord.Status.class, str.toUpperCase()).orNull();
+    if (status == null) {
+      throw error("invalid value for submittable:" + str);
+    }
+    return new SubmittablePredicate(status);
+  }
+
+  @Operator
+  public Predicate<ChangeData> unresolved(String value) throws QueryParseException {
+    return new IsUnresolvedPredicate(value);
+  }
+
+  @Operator
+  public Predicate<ChangeData> revertof(String value) throws QueryParseException {
+    if (args.getSchema().hasField(ChangeField.REVERT_OF)) {
+      return new RevertOfPredicate(value);
+    }
+    throw new QueryParseException("'revertof' operator is not supported by change index version");
+  }
+
+  @Override
+  protected Predicate<ChangeData> defaultField(String query) throws QueryParseException {
+    if (query.startsWith("refs/")) {
+      return ref(query);
+    } else if (DEF_CHANGE.matcher(query).matches()) {
+      List<Predicate<ChangeData>> predicates = Lists.newArrayListWithCapacity(2);
+      try {
+        predicates.add(change(query));
+      } catch (QueryParseException e) {
+        // Skip.
+      }
+
+      // For PAT_LEGACY_ID, it may also be the prefix of some commits.
+      if (query.length() >= 6 && PAT_LEGACY_ID.matcher(query).matches()) {
+        predicates.add(commit(query));
+      }
+
+      return Predicate.or(predicates);
+    }
+
+    // Adapt the capacity of this list when adding more default predicates.
+    List<Predicate<ChangeData>> predicates = Lists.newArrayListWithCapacity(11);
+    try {
+      Predicate<ChangeData> p = ownerDefaultField(query);
+      if (!Objects.equals(p, Predicate.<ChangeData>any())) {
+        predicates.add(p);
+      }
+    } catch (OrmException | IOException | ConfigInvalidException | QueryParseException e) {
+      // Skip.
+    }
+    try {
+      Predicate<ChangeData> p = reviewerDefaultField(query);
+      if (!Objects.equals(p, Predicate.<ChangeData>any())) {
+        predicates.add(p);
+      }
+    } catch (OrmException | IOException | ConfigInvalidException | QueryParseException e) {
+      // Skip.
+    }
+    predicates.add(file(query));
+    try {
+      predicates.add(label(query));
+    } catch (OrmException | IOException | ConfigInvalidException | QueryParseException e) {
+      // Skip.
+    }
+    predicates.add(commit(query));
+    predicates.add(message(query));
+    predicates.add(comment(query));
+    predicates.add(projects(query));
+    predicates.add(ref(query));
+    predicates.add(branch(query));
+    predicates.add(topic(query));
+    // Adapt the capacity of the "predicates" list when adding more default
+    // predicates.
+    return Predicate.or(predicates);
+  }
+
+  private Predicate<ChangeData> getAuthorOrCommitterPredicate(
+      String who,
+      Function<String, Predicate<ChangeData>> exactPredicateFunc,
+      Function<String, Predicate<ChangeData>> fullPredicateFunc)
+      throws QueryParseException {
+    if (Address.tryParse(who) != null) {
+      return exactPredicateFunc.apply(who);
+    }
+    return getAuthorOrCommitterFullTextPredicate(who, fullPredicateFunc);
+  }
+
+  private Predicate<ChangeData> getAuthorOrCommitterFullTextPredicate(
+      String who, Function<String, Predicate<ChangeData>> fullPredicateFunc)
+      throws QueryParseException {
+    Set<String> parts = SchemaUtil.getNameParts(who);
+    if (parts.isEmpty()) {
+      throw error("invalid value");
+    }
+
+    List<Predicate<ChangeData>> predicates =
+        parts.stream().map(fullPredicateFunc).collect(toList());
+    return Predicate.and(predicates);
+  }
+
+  private Set<Account.Id> getMembers(AccountGroup.UUID g) throws IOException {
+    Set<Account.Id> accounts;
+    Set<Account.Id> allMembers =
+        args.groupMembers.listAccounts(g).stream().map(Account::getId).collect(toSet());
+    int maxTerms = args.indexConfig.maxTerms();
+    if (allMembers.size() > maxTerms) {
+      // limit the number of query terms otherwise Gerrit will barf
+      accounts = ImmutableSet.copyOf(Iterables.limit(allMembers, maxTerms));
+    } else {
+      accounts = allMembers;
+    }
+    return accounts;
+  }
+
+  private Set<Account.Id> parseAccount(String who)
+      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
+    if (isSelf(who)) {
+      return Collections.singleton(self());
+    }
+    Set<Account.Id> matches = args.accountResolver.findAll(who);
+    if (matches.isEmpty()) {
+      throw error("User " + who + " not found");
+    }
+    return matches;
+  }
+
+  private GroupReference parseGroup(String group) throws QueryParseException {
+    GroupReference g = GroupBackends.findBestSuggestion(args.groupBackend, group);
+    if (g == null) {
+      throw error("Group " + group + " not found");
+    }
+    return g;
+  }
+
+  private List<Change> parseChange(String value) throws OrmException, QueryParseException {
+    if (PAT_LEGACY_ID.matcher(value).matches()) {
+      return asChanges(args.queryProvider.get().byLegacyChangeId(Change.Id.parse(value)));
+    } else if (PAT_CHANGE_ID.matcher(value).matches()) {
+      List<Change> changes = asChanges(args.queryProvider.get().byKeyPrefix(parseChangeId(value)));
+      if (changes.isEmpty()) {
+        throw error("Change " + value + " not found");
+      }
+      return changes;
+    }
+
+    throw error("Change " + value + " not found");
+  }
+
+  private static String parseChangeId(String value) {
+    if (value.charAt(0) == 'i') {
+      value = "I" + value.substring(1);
+    }
+    return value;
+  }
+
+  private Account.Id self() throws QueryParseException {
+    return args.getIdentifiedUser().getAccountId();
+  }
+
+  public Predicate<ChangeData> reviewerByState(
+      String who, ReviewerStateInternal state, boolean forDefaultField)
+      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
+    Predicate<ChangeData> reviewerByEmailPredicate = null;
+    if (args.index.getSchema().hasField(ChangeField.REVIEWER_BY_EMAIL)) {
+      Address address = Address.tryParse(who);
+      if (address != null) {
+        reviewerByEmailPredicate = ReviewerByEmailPredicate.forState(address, state);
+      }
+    }
+
+    Predicate<ChangeData> reviewerPredicate = null;
+    try {
+      Set<Account.Id> accounts = parseAccount(who);
+      if (!forDefaultField || accounts.size() <= MAX_ACCOUNTS_PER_DEFAULT_FIELD) {
+        reviewerPredicate =
+            Predicate.or(
+                accounts.stream()
+                    .map(id -> ReviewerPredicate.forState(id, state))
+                    .collect(toList()));
+      }
+    } catch (QueryParseException e) {
+      // Propagate this exception only if we can't use 'who' to query by email
+      if (reviewerByEmailPredicate == null) {
+        throw e;
+      }
+    }
+
+    if (reviewerPredicate != null && reviewerByEmailPredicate != null) {
+      return Predicate.or(reviewerPredicate, reviewerByEmailPredicate);
+    } else if (reviewerPredicate != null) {
+      return reviewerPredicate;
+    } else if (reviewerByEmailPredicate != null) {
+      return reviewerByEmailPredicate;
+    } else {
+      return Predicate.any();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/query/change/ChangeQueryProcessor.java b/java/com/google/gerrit/server/query/change/ChangeQueryProcessor.java
new file mode 100644
index 0000000..9a49ffe
--- /dev/null
+++ b/java/com/google/gerrit/server/query/change/ChangeQueryProcessor.java
@@ -0,0 +1,177 @@
+// Copyright (C) 2010 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.google.gerrit.server.query.change;
+
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.gerrit.server.query.change.ChangeQueryBuilder.FIELD_LIMIT;
+
+import com.google.gerrit.extensions.common.PluginDefinedInfo;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.index.IndexConfig;
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.query.IndexPredicate;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryProcessor;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.AnonymousUser;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.DynamicOptions;
+import com.google.gerrit.server.DynamicOptions.DynamicBean;
+import com.google.gerrit.server.account.AccountLimits;
+import com.google.gerrit.server.index.change.ChangeIndexCollection;
+import com.google.gerrit.server.index.change.ChangeIndexRewriter;
+import com.google.gerrit.server.index.change.ChangeSchemaDefinitions;
+import com.google.gerrit.server.index.change.IndexedChangeQuery;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Query processor for the change index.
+ *
+ * <p>Instances are one-time-use. Other singleton classes should inject a Provider rather than
+ * holding on to a single instance.
+ */
+public class ChangeQueryProcessor extends QueryProcessor<ChangeData>
+    implements DynamicOptions.BeanReceiver, PluginDefinedAttributesFactory {
+  /**
+   * Register a ChangeAttributeFactory in a config Module like this:
+   *
+   * <p>bind(ChangeAttributeFactory.class) .annotatedWith(Exports.named("export-name"))
+   * .to(YourClass.class);
+   */
+  public interface ChangeAttributeFactory {
+    PluginDefinedInfo create(ChangeData a, ChangeQueryProcessor qp, String plugin);
+  }
+
+  private final Provider<ReviewDb> db;
+  private final Provider<CurrentUser> userProvider;
+  private final ChangeNotes.Factory notesFactory;
+  private final DynamicMap<ChangeAttributeFactory> attributeFactories;
+  private final PermissionBackend permissionBackend;
+  private final ProjectCache projectCache;
+  private final Provider<AnonymousUser> anonymousUserProvider;
+  private final Map<String, DynamicBean> dynamicBeans = new HashMap<>();
+
+  static {
+    // It is assumed that basic rewrites do not touch visibleto predicates.
+    checkState(
+        !ChangeIsVisibleToPredicate.class.isAssignableFrom(IndexPredicate.class),
+        "ChangeQueryProcessor assumes visibleto is not used by the index rewriter.");
+  }
+
+  @Inject
+  ChangeQueryProcessor(
+      Provider<CurrentUser> userProvider,
+      AccountLimits.Factory limitsFactory,
+      MetricMaker metricMaker,
+      IndexConfig indexConfig,
+      ChangeIndexCollection indexes,
+      ChangeIndexRewriter rewriter,
+      Provider<ReviewDb> db,
+      ChangeNotes.Factory notesFactory,
+      DynamicMap<ChangeAttributeFactory> attributeFactories,
+      PermissionBackend permissionBackend,
+      ProjectCache projectCache,
+      Provider<AnonymousUser> anonymousUserProvider) {
+    super(
+        metricMaker,
+        ChangeSchemaDefinitions.INSTANCE,
+        indexConfig,
+        indexes,
+        rewriter,
+        FIELD_LIMIT,
+        () -> limitsFactory.create(userProvider.get()).getQueryLimit());
+    this.db = db;
+    this.userProvider = userProvider;
+    this.notesFactory = notesFactory;
+    this.attributeFactories = attributeFactories;
+    this.permissionBackend = permissionBackend;
+    this.projectCache = projectCache;
+    this.anonymousUserProvider = anonymousUserProvider;
+  }
+
+  @Override
+  public ChangeQueryProcessor enforceVisibility(boolean enforce) {
+    super.enforceVisibility(enforce);
+    return this;
+  }
+
+  @Override
+  protected QueryOptions createOptions(
+      IndexConfig indexConfig, int start, int limit, Set<String> requestedFields) {
+    return IndexedChangeQuery.createOptions(indexConfig, start, limit, requestedFields);
+  }
+
+  @Override
+  public void setDynamicBean(String plugin, DynamicBean dynamicBean) {
+    dynamicBeans.put(plugin, dynamicBean);
+  }
+
+  public DynamicBean getDynamicBean(String plugin) {
+    return dynamicBeans.get(plugin);
+  }
+
+  @Override
+  public List<PluginDefinedInfo> create(ChangeData cd) {
+    List<PluginDefinedInfo> plugins = new ArrayList<>(attributeFactories.plugins().size());
+    for (String plugin : attributeFactories.plugins()) {
+      for (Provider<ChangeAttributeFactory> provider :
+          attributeFactories.byPlugin(plugin).values()) {
+        PluginDefinedInfo pda = null;
+        try {
+          pda = provider.get().create(cd, this, plugin);
+        } catch (RuntimeException e) {
+          /* Eat runtime exceptions so that queries don't fail. */
+        }
+        if (pda != null) {
+          pda.name = plugin;
+          plugins.add(pda);
+        }
+      }
+    }
+    if (plugins.isEmpty()) {
+      plugins = null;
+    }
+    return plugins;
+  }
+
+  @Override
+  protected Predicate<ChangeData> enforceVisibility(Predicate<ChangeData> pred) {
+    return new AndChangeSource(
+        pred,
+        new ChangeIsVisibleToPredicate(
+            db,
+            notesFactory,
+            userProvider.get(),
+            permissionBackend,
+            projectCache,
+            anonymousUserProvider),
+        start);
+  }
+
+  @Override
+  protected String formatForLogging(ChangeData changeData) {
+    return changeData.getId().toString();
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeRegexPredicate.java b/java/com/google/gerrit/server/query/change/ChangeRegexPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeRegexPredicate.java
rename to java/com/google/gerrit/server/query/change/ChangeRegexPredicate.java
diff --git a/java/com/google/gerrit/server/query/change/ChangeStatusPredicate.java b/java/com/google/gerrit/server/query/change/ChangeStatusPredicate.java
new file mode 100644
index 0000000..8dc17d3
--- /dev/null
+++ b/java/com/google/gerrit/server/query/change/ChangeStatusPredicate.java
@@ -0,0 +1,147 @@
+// Copyright (C) 2009 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.google.gerrit.server.query.change;
+
+import static com.google.common.base.Preconditions.checkState;
+import static java.util.Objects.requireNonNull;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Change.Status;
+import com.google.gerrit.server.index.change.ChangeField;
+import com.google.gwtorm.server.OrmException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.NavigableMap;
+import java.util.Objects;
+import java.util.TreeMap;
+
+/**
+ * Predicate for a {@link Status}.
+ *
+ * <p>The actual name of this operator can differ, it usually comes as {@code status:} but may also
+ * be {@code is:} to help do-what-i-meanery for end-users searching for changes. Either operator
+ * name has the same meaning.
+ *
+ * <p>Status names are looked up by prefix case-insensitively.
+ */
+public final class ChangeStatusPredicate extends ChangeIndexPredicate {
+  private static final String INVALID_STATUS = "__invalid__";
+  private static final Predicate<ChangeData> NONE = new ChangeStatusPredicate(null);
+
+  private static final TreeMap<String, Predicate<ChangeData>> PREDICATES;
+  private static final Predicate<ChangeData> CLOSED;
+  private static final Predicate<ChangeData> OPEN;
+
+  static {
+    PREDICATES = new TreeMap<>();
+    List<Predicate<ChangeData>> open = new ArrayList<>();
+    List<Predicate<ChangeData>> closed = new ArrayList<>();
+
+    for (Change.Status s : Change.Status.values()) {
+      ChangeStatusPredicate p = forStatus(s);
+      String str = canonicalize(s);
+      checkState(
+          !INVALID_STATUS.equals(str),
+          "invalid status sentinel %s cannot match canonicalized status string %s",
+          INVALID_STATUS,
+          str);
+      PREDICATES.put(str, p);
+      (s.isOpen() ? open : closed).add(p);
+    }
+
+    CLOSED = Predicate.or(closed);
+    OPEN = Predicate.or(open);
+
+    PREDICATES.put("closed", CLOSED);
+    PREDICATES.put("open", OPEN);
+    PREDICATES.put("pending", OPEN);
+  }
+
+  public static String canonicalize(Change.Status status) {
+    return status.name().toLowerCase();
+  }
+
+  public static Predicate<ChangeData> parse(String value) {
+    String lower = value.toLowerCase();
+    NavigableMap<String, Predicate<ChangeData>> head = PREDICATES.tailMap(lower, true);
+    if (!head.isEmpty()) {
+      // Assume no statuses share a common prefix so we can only walk one entry.
+      Map.Entry<String, Predicate<ChangeData>> e = head.entrySet().iterator().next();
+      if (e.getKey().startsWith(lower)) {
+        return e.getValue();
+      }
+    }
+    return NONE;
+  }
+
+  public static Predicate<ChangeData> open() {
+    return OPEN;
+  }
+
+  public static Predicate<ChangeData> closed() {
+    return CLOSED;
+  }
+
+  public static ChangeStatusPredicate forStatus(Change.Status status) {
+    return new ChangeStatusPredicate(requireNonNull(status));
+  }
+
+  @Nullable private final Change.Status status;
+
+  private ChangeStatusPredicate(@Nullable Change.Status status) {
+    super(ChangeField.STATUS, status != null ? canonicalize(status) : INVALID_STATUS);
+    this.status = status;
+  }
+
+  /**
+   * Get the status for this predicate.
+   *
+   * @return the status, or null if this predicate is intended to never match any changes.
+   */
+  @Nullable
+  public Change.Status getStatus() {
+    return status;
+  }
+
+  @Override
+  public boolean match(ChangeData object) throws OrmException {
+    Change change = object.change();
+    return change != null && Objects.equals(status, change.getStatus());
+  }
+
+  @Override
+  public int getCost() {
+    return 0;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hashCode(status);
+  }
+
+  @Override
+  public boolean equals(Object other) {
+    return (other instanceof ChangeStatusPredicate)
+        && Objects.equals(status, ((ChangeStatusPredicate) other).status);
+  }
+
+  @Override
+  public String toString() {
+    return getOperator() + ":" + getValue();
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/CommentByPredicate.java b/java/com/google/gerrit/server/query/change/CommentByPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/CommentByPredicate.java
rename to java/com/google/gerrit/server/query/change/CommentByPredicate.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/CommentPredicate.java b/java/com/google/gerrit/server/query/change/CommentPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/CommentPredicate.java
rename to java/com/google/gerrit/server/query/change/CommentPredicate.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/CommitPredicate.java b/java/com/google/gerrit/server/query/change/CommitPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/CommitPredicate.java
rename to java/com/google/gerrit/server/query/change/CommitPredicate.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/CommitterPredicate.java b/java/com/google/gerrit/server/query/change/CommitterPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/CommitterPredicate.java
rename to java/com/google/gerrit/server/query/change/CommitterPredicate.java
diff --git a/java/com/google/gerrit/server/query/change/ConflictKey.java b/java/com/google/gerrit/server/query/change/ConflictKey.java
new file mode 100644
index 0000000..42f5b13
--- /dev/null
+++ b/java/com/google/gerrit/server/query/change/ConflictKey.java
@@ -0,0 +1,93 @@
+// Copyright (C) 2013 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.google.gerrit.server.query.change;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Converter;
+import com.google.common.base.Enums;
+import com.google.common.collect.Ordering;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.server.cache.proto.Cache.ConflictKeyProto;
+import com.google.gerrit.server.cache.serialize.CacheSerializer;
+import com.google.gerrit.server.cache.serialize.ProtoCacheSerializers;
+import com.google.gerrit.server.cache.serialize.ProtoCacheSerializers.ObjectIdConverter;
+import org.eclipse.jgit.lib.AnyObjectId;
+import org.eclipse.jgit.lib.ObjectId;
+
+@AutoValue
+public abstract class ConflictKey {
+  public static ConflictKey create(
+      AnyObjectId commit, AnyObjectId otherCommit, SubmitType submitType, boolean contentMerge) {
+    ObjectId commitCopy = commit.copy();
+    ObjectId otherCommitCopy = otherCommit.copy();
+    if (submitType == SubmitType.FAST_FORWARD_ONLY) {
+      // The conflict check for FF-only is non-symmetrical, and we need to treat (X, Y) differently
+      // from (Y, X). Store the commits in the input order.
+      return new AutoValue_ConflictKey(commitCopy, otherCommitCopy, submitType, contentMerge);
+    }
+    // Otherwise, the check is symmetrical; sort commit/otherCommit before storing, so the actual
+    // key is independent of the order in which they are passed to this method.
+    return new AutoValue_ConflictKey(
+        Ordering.natural().min(commitCopy, otherCommitCopy),
+        Ordering.natural().max(commitCopy, otherCommitCopy),
+        submitType,
+        contentMerge);
+  }
+
+  @VisibleForTesting
+  static ConflictKey createWithoutNormalization(
+      AnyObjectId commit, AnyObjectId otherCommit, SubmitType submitType, boolean contentMerge) {
+    return new AutoValue_ConflictKey(commit.copy(), otherCommit.copy(), submitType, contentMerge);
+  }
+
+  public abstract ObjectId commit();
+
+  public abstract ObjectId otherCommit();
+
+  public abstract SubmitType submitType();
+
+  public abstract boolean contentMerge();
+
+  public enum Serializer implements CacheSerializer<ConflictKey> {
+    INSTANCE;
+
+    private static final Converter<String, SubmitType> SUBMIT_TYPE_CONVERTER =
+        Enums.stringConverter(SubmitType.class);
+
+    @Override
+    public byte[] serialize(ConflictKey object) {
+      ObjectIdConverter idConverter = ObjectIdConverter.create();
+      return ProtoCacheSerializers.toByteArray(
+          ConflictKeyProto.newBuilder()
+              .setCommit(idConverter.toByteString(object.commit()))
+              .setOtherCommit(idConverter.toByteString(object.otherCommit()))
+              .setSubmitType(SUBMIT_TYPE_CONVERTER.reverse().convert(object.submitType()))
+              .setContentMerge(object.contentMerge())
+              .build());
+    }
+
+    @Override
+    public ConflictKey deserialize(byte[] in) {
+      ConflictKeyProto proto = ProtoCacheSerializers.parseUnchecked(ConflictKeyProto.parser(), in);
+      ObjectIdConverter idConverter = ObjectIdConverter.create();
+      return create(
+          idConverter.fromByteString(proto.getCommit()),
+          idConverter.fromByteString(proto.getOtherCommit()),
+          SUBMIT_TYPE_CONVERTER.convert(proto.getSubmitType()),
+          proto.getContentMerge());
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/query/change/ConflictsCache.java b/java/com/google/gerrit/server/query/change/ConflictsCache.java
new file mode 100644
index 0000000..c7ee79b
--- /dev/null
+++ b/java/com/google/gerrit/server/query/change/ConflictsCache.java
@@ -0,0 +1,25 @@
+// Copyright (C) 2013 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.google.gerrit.server.query.change;
+
+import com.google.gerrit.common.Nullable;
+
+public interface ConflictsCache {
+
+  void put(ConflictKey key, boolean value);
+
+  @Nullable
+  Boolean getIfPresent(ConflictKey key);
+}
diff --git a/java/com/google/gerrit/server/query/change/ConflictsCacheImpl.java b/java/com/google/gerrit/server/query/change/ConflictsCacheImpl.java
new file mode 100644
index 0000000..426c5d6
--- /dev/null
+++ b/java/com/google/gerrit/server/query/change/ConflictsCacheImpl.java
@@ -0,0 +1,59 @@
+// Copyright (C) 2013 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.google.gerrit.server.query.change;
+
+import com.google.common.cache.Cache;
+import com.google.gerrit.server.cache.CacheModule;
+import com.google.gerrit.server.cache.serialize.BooleanCacheSerializer;
+import com.google.inject.Inject;
+import com.google.inject.Module;
+import com.google.inject.Singleton;
+import com.google.inject.name.Named;
+
+@Singleton
+public class ConflictsCacheImpl implements ConflictsCache {
+  public static final String NAME = "conflicts";
+
+  public static Module module() {
+    return new CacheModule() {
+      @Override
+      protected void configure() {
+        persist(NAME, ConflictKey.class, Boolean.class)
+            .version(1)
+            .keySerializer(ConflictKey.Serializer.INSTANCE)
+            .valueSerializer(BooleanCacheSerializer.INSTANCE)
+            .maximumWeight(37400);
+        bind(ConflictsCache.class).to(ConflictsCacheImpl.class);
+      }
+    };
+  }
+
+  private final Cache<ConflictKey, Boolean> conflictsCache;
+
+  @Inject
+  public ConflictsCacheImpl(@Named(NAME) Cache<ConflictKey, Boolean> conflictsCache) {
+    this.conflictsCache = conflictsCache;
+  }
+
+  @Override
+  public void put(ConflictKey key, boolean value) {
+    conflictsCache.put(key, value);
+  }
+
+  @Override
+  public Boolean getIfPresent(ConflictKey key) {
+    return conflictsCache.getIfPresent(key);
+  }
+}
diff --git a/java/com/google/gerrit/server/query/change/ConflictsPredicate.java b/java/com/google/gerrit/server/query/change/ConflictsPredicate.java
new file mode 100644
index 0000000..7dc7a0b
--- /dev/null
+++ b/java/com/google/gerrit/server/query/change/ConflictsPredicate.java
@@ -0,0 +1,204 @@
+// Copyright (C) 2013 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.google.gerrit.server.query.change;
+
+import com.google.gerrit.common.data.SubmitTypeRecord;
+import com.google.gerrit.index.query.PostFilterPredicate;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.git.CodeReviewCommit;
+import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
+import com.google.gerrit.server.project.NoSuchProjectException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.query.change.ChangeQueryBuilder.Arguments;
+import com.google.gerrit.server.submit.IntegrationException;
+import com.google.gerrit.server.submit.SubmitDryRun;
+import com.google.gwtorm.server.OrmException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+public class ConflictsPredicate {
+  // UI code may depend on this string, so use caution when changing.
+  protected static final String TOO_MANY_FILES = "too many files to find conflicts";
+
+  private ConflictsPredicate() {}
+
+  public static Predicate<ChangeData> create(Arguments args, String value, Change c)
+      throws QueryParseException, OrmException {
+    ChangeData cd;
+    List<String> files;
+    try {
+      cd = args.changeDataFactory.create(args.db.get(), c);
+      files = cd.currentFilePaths();
+    } catch (IOException e) {
+      throw new OrmException(e);
+    }
+
+    if (3 + files.size() > args.indexConfig.maxTerms()) {
+      // Short-circuit with a nice error message if we exceed the index
+      // backend's term limit. This assumes that "conflicts:foo" is the entire
+      // query; if there are more terms in the input, we might not
+      // short-circuit here, which will result in a more generic error message
+      // later on in the query parsing.
+      throw new QueryParseException(TOO_MANY_FILES);
+    }
+
+    List<Predicate<ChangeData>> filePredicates = new ArrayList<>(files.size());
+    for (String file : files) {
+      filePredicates.add(new EqualsPathPredicate(ChangeQueryBuilder.FIELD_PATH, file));
+    }
+
+    List<Predicate<ChangeData>> and = new ArrayList<>(5);
+    and.add(new ProjectPredicate(c.getProject().get()));
+    and.add(new RefPredicate(c.getDest().get()));
+    and.add(Predicate.not(new LegacyChangeIdPredicate(c.getId())));
+    and.add(Predicate.or(filePredicates));
+
+    ChangeDataCache changeDataCache = new ChangeDataCache(cd, args.projectCache);
+    and.add(new CheckConflict(value, args, c, changeDataCache));
+    return Predicate.and(and);
+  }
+
+  private static final class CheckConflict extends PostFilterPredicate<ChangeData> {
+    private final Arguments args;
+    private final Branch.NameKey dest;
+    private final ChangeDataCache changeDataCache;
+
+    CheckConflict(String value, Arguments args, Change c, ChangeDataCache changeDataCache) {
+      super(ChangeQueryBuilder.FIELD_CONFLICTS, value);
+      this.args = args;
+      this.dest = c.getDest();
+      this.changeDataCache = changeDataCache;
+    }
+
+    @Override
+    public boolean match(ChangeData object) throws OrmException {
+      Change otherChange = object.change();
+      if (otherChange == null || !otherChange.getDest().equals(dest)) {
+        return false;
+      }
+
+      SubmitTypeRecord str = object.submitTypeRecord();
+      if (!str.isOk()) {
+        return false;
+      }
+
+      ProjectState projectState;
+      try {
+        projectState = changeDataCache.getProjectState();
+      } catch (NoSuchProjectException e) {
+        return false;
+      }
+
+      ObjectId other = ObjectId.fromString(object.currentPatchSet().getRevision().get());
+      ConflictKey conflictsKey =
+          ConflictKey.create(
+              changeDataCache.getTestAgainst(),
+              other,
+              str.type,
+              projectState.is(BooleanProjectConfig.USE_CONTENT_MERGE));
+      Boolean maybeConflicts = args.conflictsCache.getIfPresent(conflictsKey);
+      if (maybeConflicts != null) {
+        return maybeConflicts;
+      }
+
+      try (Repository repo = args.repoManager.openRepository(otherChange.getProject());
+          CodeReviewRevWalk rw = CodeReviewCommit.newRevWalk(repo)) {
+        boolean conflicts =
+            !args.submitDryRun.run(
+                str.type,
+                repo,
+                rw,
+                otherChange.getDest(),
+                changeDataCache.getTestAgainst(),
+                other,
+                getAlreadyAccepted(repo, rw));
+        args.conflictsCache.put(conflictsKey, conflicts);
+        return conflicts;
+      } catch (IntegrationException | NoSuchProjectException | IOException e) {
+        throw new OrmException(e);
+      }
+    }
+
+    @Override
+    public int getCost() {
+      return 5;
+    }
+
+    private Set<RevCommit> getAlreadyAccepted(Repository repo, RevWalk rw)
+        throws IntegrationException {
+      try {
+        Set<RevCommit> accepted = new HashSet<>();
+        SubmitDryRun.addCommits(changeDataCache.getAlreadyAccepted(repo), rw, accepted);
+        ObjectId tip = changeDataCache.getTestAgainst();
+        if (tip != null) {
+          accepted.add(rw.parseCommit(tip));
+        }
+        return accepted;
+      } catch (OrmException | IOException e) {
+        throw new IntegrationException("Failed to determine already accepted commits.", e);
+      }
+    }
+  }
+
+  private static class ChangeDataCache {
+    private final ChangeData cd;
+    private final ProjectCache projectCache;
+
+    private ObjectId testAgainst;
+    private ProjectState projectState;
+    private Set<ObjectId> alreadyAccepted;
+
+    ChangeDataCache(ChangeData cd, ProjectCache projectCache) {
+      this.cd = cd;
+      this.projectCache = projectCache;
+    }
+
+    ObjectId getTestAgainst() throws OrmException {
+      if (testAgainst == null) {
+        testAgainst = ObjectId.fromString(cd.currentPatchSet().getRevision().get());
+      }
+      return testAgainst;
+    }
+
+    ProjectState getProjectState() throws NoSuchProjectException {
+      if (projectState == null) {
+        projectState = projectCache.get(cd.project());
+        if (projectState == null) {
+          throw new NoSuchProjectException(cd.project());
+        }
+      }
+      return projectState;
+    }
+
+    Set<ObjectId> getAlreadyAccepted(Repository repo) throws IOException {
+      if (alreadyAccepted == null) {
+        alreadyAccepted = SubmitDryRun.getAlreadyAccepted(repo);
+      }
+      return alreadyAccepted;
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/DeletedPredicate.java b/java/com/google/gerrit/server/query/change/DeletedPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/DeletedPredicate.java
rename to java/com/google/gerrit/server/query/change/DeletedPredicate.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/DeltaPredicate.java b/java/com/google/gerrit/server/query/change/DeltaPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/DeltaPredicate.java
rename to java/com/google/gerrit/server/query/change/DeltaPredicate.java
diff --git a/java/com/google/gerrit/server/query/change/DestinationPredicate.java b/java/com/google/gerrit/server/query/change/DestinationPredicate.java
new file mode 100644
index 0000000..a824a87
--- /dev/null
+++ b/java/com/google/gerrit/server/query/change/DestinationPredicate.java
@@ -0,0 +1,44 @@
+// Copyright (C) 2015 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.google.gerrit.server.query.change;
+
+import com.google.gerrit.index.query.PostFilterPredicate;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gwtorm.server.OrmException;
+import java.util.Set;
+
+public class DestinationPredicate extends PostFilterPredicate<ChangeData> {
+  protected Set<Branch.NameKey> destinations;
+
+  public DestinationPredicate(Set<Branch.NameKey> destinations, String value) {
+    super(ChangeQueryBuilder.FIELD_DESTINATION, value);
+    this.destinations = destinations;
+  }
+
+  @Override
+  public boolean match(ChangeData object) throws OrmException {
+    Change change = object.change();
+    if (change == null) {
+      return false;
+    }
+    return destinations.contains(change.getDest());
+  }
+
+  @Override
+  public int getCost() {
+    return 1;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/EditByPredicate.java b/java/com/google/gerrit/server/query/change/EditByPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/EditByPredicate.java
rename to java/com/google/gerrit/server/query/change/EditByPredicate.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/EqualsFilePredicate.java b/java/com/google/gerrit/server/query/change/EqualsFilePredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/EqualsFilePredicate.java
rename to java/com/google/gerrit/server/query/change/EqualsFilePredicate.java
diff --git a/java/com/google/gerrit/server/query/change/EqualsLabelPredicate.java b/java/com/google/gerrit/server/query/change/EqualsLabelPredicate.java
new file mode 100644
index 0000000..54e22f3
--- /dev/null
+++ b/java/com/google/gerrit/server/query/change/EqualsLabelPredicate.java
@@ -0,0 +1,144 @@
+// Copyright (C) 2013 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.google.gerrit.server.query.change;
+
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.LabelTypes;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.index.change.ChangeField;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Provider;
+import java.io.IOException;
+
+public class EqualsLabelPredicate extends ChangeIndexPredicate {
+  protected final ProjectCache projectCache;
+  protected final PermissionBackend permissionBackend;
+  protected final IdentifiedUser.GenericFactory userFactory;
+  protected final Provider<ReviewDb> dbProvider;
+  protected final String label;
+  protected final int expVal;
+  protected final Account.Id account;
+  protected final AccountGroup.UUID group;
+
+  public EqualsLabelPredicate(
+      LabelPredicate.Args args, String label, int expVal, Account.Id account) {
+    super(ChangeField.LABEL, ChangeField.formatLabel(label, expVal, account));
+    this.permissionBackend = args.permissionBackend;
+    this.projectCache = args.projectCache;
+    this.userFactory = args.userFactory;
+    this.dbProvider = args.dbProvider;
+    this.group = args.group;
+    this.label = label;
+    this.expVal = expVal;
+    this.account = account;
+  }
+
+  @Override
+  public boolean match(ChangeData object) throws OrmException {
+    Change c = object.change();
+    if (c == null) {
+      // The change has disappeared.
+      //
+      return false;
+    }
+
+    ProjectState project = projectCache.get(c.getDest().getParentKey());
+    if (project == null) {
+      // The project has disappeared.
+      //
+      return false;
+    }
+
+    LabelType labelType = type(project.getLabelTypes(), label);
+    if (labelType == null) {
+      return false; // Label is not defined by this project.
+    }
+
+    boolean hasVote = false;
+    for (PatchSetApproval p : object.currentApprovals()) {
+      if (labelType.matches(p)) {
+        hasVote = true;
+        if (match(object, p.getValue(), p.getAccountId())) {
+          return true;
+        }
+      }
+    }
+
+    if (!hasVote && expVal == 0) {
+      return true;
+    }
+
+    return false;
+  }
+
+  protected static LabelType type(LabelTypes types, String toFind) {
+    if (types.byLabel(toFind) != null) {
+      return types.byLabel(toFind);
+    }
+
+    for (LabelType lt : types.getLabelTypes()) {
+      if (toFind.equalsIgnoreCase(lt.getName())) {
+        return lt;
+      }
+    }
+    return null;
+  }
+
+  protected boolean match(ChangeData cd, short value, Account.Id approver) {
+    if (value != expVal) {
+      return false;
+    }
+
+    if (account != null && !account.equals(approver)) {
+      return false;
+    }
+
+    IdentifiedUser reviewer = userFactory.create(approver);
+    if (group != null && !reviewer.getEffectiveGroups().contains(group)) {
+      return false;
+    }
+
+    // Check the user has 'READ' permission.
+    try {
+      PermissionBackend.ForChange perm =
+          permissionBackend.absentUser(approver).database(dbProvider).change(cd);
+      ProjectState projectState = projectCache.checkedGet(cd.project());
+      if (projectState == null || !projectState.statePermitsRead()) {
+        return false;
+      }
+
+      perm.check(ChangePermission.READ);
+      return true;
+    } catch (PermissionBackendException | IOException | AuthException e) {
+      return false;
+    }
+  }
+
+  @Override
+  public int getCost() {
+    return 1 + (group == null ? 0 : 1);
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/EqualsPathPredicate.java b/java/com/google/gerrit/server/query/change/EqualsPathPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/EqualsPathPredicate.java
rename to java/com/google/gerrit/server/query/change/EqualsPathPredicate.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ExactAuthorPredicate.java b/java/com/google/gerrit/server/query/change/ExactAuthorPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/ExactAuthorPredicate.java
rename to java/com/google/gerrit/server/query/change/ExactAuthorPredicate.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ExactCommitterPredicate.java b/java/com/google/gerrit/server/query/change/ExactCommitterPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/ExactCommitterPredicate.java
rename to java/com/google/gerrit/server/query/change/ExactCommitterPredicate.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ExactTopicPredicate.java b/java/com/google/gerrit/server/query/change/ExactTopicPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/ExactTopicPredicate.java
rename to java/com/google/gerrit/server/query/change/ExactTopicPredicate.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/FuzzyTopicPredicate.java b/java/com/google/gerrit/server/query/change/FuzzyTopicPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/FuzzyTopicPredicate.java
rename to java/com/google/gerrit/server/query/change/FuzzyTopicPredicate.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/GroupPredicate.java b/java/com/google/gerrit/server/query/change/GroupPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/GroupPredicate.java
rename to java/com/google/gerrit/server/query/change/GroupPredicate.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/HasDraftByPredicate.java b/java/com/google/gerrit/server/query/change/HasDraftByPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/HasDraftByPredicate.java
rename to java/com/google/gerrit/server/query/change/HasDraftByPredicate.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/HasStarsPredicate.java b/java/com/google/gerrit/server/query/change/HasStarsPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/HasStarsPredicate.java
rename to java/com/google/gerrit/server/query/change/HasStarsPredicate.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/HashtagPredicate.java b/java/com/google/gerrit/server/query/change/HashtagPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/HashtagPredicate.java
rename to java/com/google/gerrit/server/query/change/HashtagPredicate.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/IntegerRangeChangePredicate.java b/java/com/google/gerrit/server/query/change/IntegerRangeChangePredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/IntegerRangeChangePredicate.java
rename to java/com/google/gerrit/server/query/change/IntegerRangeChangePredicate.java
diff --git a/java/com/google/gerrit/server/query/change/InternalChangeQuery.java b/java/com/google/gerrit/server/query/change/InternalChangeQuery.java
new file mode 100644
index 0000000..495d27c
--- /dev/null
+++ b/java/com/google/gerrit/server/query/change/InternalChangeQuery.java
@@ -0,0 +1,345 @@
+// Copyright (C) 2014 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.google.gerrit.server.query.change;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.gerrit.index.query.Predicate.and;
+import static com.google.gerrit.index.query.Predicate.not;
+import static com.google.gerrit.index.query.Predicate.or;
+import static com.google.gerrit.server.query.change.ChangeStatusPredicate.open;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Strings;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+import com.google.gerrit.index.FieldDef;
+import com.google.gerrit.index.IndexConfig;
+import com.google.gerrit.index.query.InternalQuery;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.index.change.ChangeIndexCollection;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+
+/**
+ * Query wrapper for the change index.
+ *
+ * <p>Instances are one-time-use. Other singleton classes should inject a Provider rather than
+ * holding on to a single instance.
+ */
+public class InternalChangeQuery extends InternalQuery<ChangeData> {
+  private static Predicate<ChangeData> ref(Branch.NameKey branch) {
+    return new RefPredicate(branch.get());
+  }
+
+  private static Predicate<ChangeData> change(Change.Key key) {
+    return new ChangeIdPredicate(key.get());
+  }
+
+  private static Predicate<ChangeData> project(Project.NameKey project) {
+    return new ProjectPredicate(project.get());
+  }
+
+  private static Predicate<ChangeData> status(Change.Status status) {
+    return ChangeStatusPredicate.forStatus(status);
+  }
+
+  private static Predicate<ChangeData> commit(String id) {
+    return new CommitPredicate(id);
+  }
+
+  private final ChangeData.Factory changeDataFactory;
+  private final ChangeNotes.Factory notesFactory;
+
+  @Inject
+  InternalChangeQuery(
+      ChangeQueryProcessor queryProcessor,
+      ChangeIndexCollection indexes,
+      IndexConfig indexConfig,
+      ChangeData.Factory changeDataFactory,
+      ChangeNotes.Factory notesFactory) {
+    super(queryProcessor, indexes, indexConfig);
+    this.changeDataFactory = changeDataFactory;
+    this.notesFactory = notesFactory;
+  }
+
+  @Override
+  public InternalChangeQuery setLimit(int n) {
+    super.setLimit(n);
+    return this;
+  }
+
+  @Override
+  public InternalChangeQuery enforceVisibility(boolean enforce) {
+    super.enforceVisibility(enforce);
+    return this;
+  }
+
+  @SafeVarargs
+  @Override
+  public final InternalChangeQuery setRequestedFields(FieldDef<ChangeData, ?>... fields) {
+    super.setRequestedFields(fields);
+    return this;
+  }
+
+  @Override
+  public InternalChangeQuery noFields() {
+    super.noFields();
+    return this;
+  }
+
+  public List<ChangeData> byKey(Change.Key key) throws OrmException {
+    return byKeyPrefix(key.get());
+  }
+
+  public List<ChangeData> byKeyPrefix(String prefix) throws OrmException {
+    return query(new ChangeIdPredicate(prefix));
+  }
+
+  public List<ChangeData> byLegacyChangeId(Change.Id id) throws OrmException {
+    return query(new LegacyChangeIdPredicate(id));
+  }
+
+  public List<ChangeData> byLegacyChangeIds(Collection<Change.Id> ids) throws OrmException {
+    List<Predicate<ChangeData>> preds = new ArrayList<>(ids.size());
+    for (Change.Id id : ids) {
+      preds.add(new LegacyChangeIdPredicate(id));
+    }
+    return query(or(preds));
+  }
+
+  public List<ChangeData> byBranchKey(Branch.NameKey branch, Change.Key key) throws OrmException {
+    return query(byBranchKeyPred(branch, key));
+  }
+
+  public List<ChangeData> byBranchKeyOpen(Project.NameKey project, String branch, Change.Key key)
+      throws OrmException {
+    return query(and(byBranchKeyPred(new Branch.NameKey(project, branch), key), open()));
+  }
+
+  public static Predicate<ChangeData> byBranchKeyOpenPred(
+      Project.NameKey project, String branch, Change.Key key) {
+    return and(byBranchKeyPred(new Branch.NameKey(project, branch), key), open());
+  }
+
+  private static Predicate<ChangeData> byBranchKeyPred(Branch.NameKey branch, Change.Key key) {
+    return and(ref(branch), project(branch.getParentKey()), change(key));
+  }
+
+  public List<ChangeData> byProject(Project.NameKey project) throws OrmException {
+    return query(project(project));
+  }
+
+  public List<ChangeData> byBranchOpen(Branch.NameKey branch) throws OrmException {
+    return query(and(ref(branch), project(branch.getParentKey()), open()));
+  }
+
+  public List<ChangeData> byBranchNew(Branch.NameKey branch) throws OrmException {
+    return query(and(ref(branch), project(branch.getParentKey()), status(Change.Status.NEW)));
+  }
+
+  public Iterable<ChangeData> byCommitsOnBranchNotMerged(
+      Repository repo, ReviewDb db, Branch.NameKey branch, Collection<String> hashes)
+      throws OrmException, IOException {
+    return byCommitsOnBranchNotMerged(
+        repo,
+        db,
+        branch,
+        hashes,
+        // Account for all commit predicates plus ref, project, status.
+        indexConfig.maxTerms() - 3);
+  }
+
+  @VisibleForTesting
+  Iterable<ChangeData> byCommitsOnBranchNotMerged(
+      Repository repo,
+      ReviewDb db,
+      Branch.NameKey branch,
+      Collection<String> hashes,
+      int indexLimit)
+      throws OrmException, IOException {
+    if (hashes.size() > indexLimit) {
+      return byCommitsOnBranchNotMergedFromDatabase(repo, db, branch, hashes);
+    }
+    return byCommitsOnBranchNotMergedFromIndex(branch, hashes);
+  }
+
+  private Iterable<ChangeData> byCommitsOnBranchNotMergedFromDatabase(
+      Repository repo, ReviewDb db, Branch.NameKey branch, Collection<String> hashes)
+      throws OrmException, IOException {
+    Set<Change.Id> changeIds = Sets.newHashSetWithExpectedSize(hashes.size());
+    String lastPrefix = null;
+    for (Ref ref : repo.getRefDatabase().getRefsByPrefix(RefNames.REFS_CHANGES)) {
+      String r = ref.getName();
+      if ((lastPrefix != null && r.startsWith(lastPrefix))
+          || !hashes.contains(ref.getObjectId().name())) {
+        continue;
+      }
+      Change.Id id = Change.Id.fromRef(r);
+      if (id == null) {
+        continue;
+      }
+      if (changeIds.add(id)) {
+        lastPrefix = r.substring(0, r.lastIndexOf('/'));
+      }
+    }
+
+    List<ChangeNotes> notes =
+        notesFactory.create(
+            db,
+            branch.getParentKey(),
+            changeIds,
+            cn -> {
+              Change c = cn.getChange();
+              return c.getDest().equals(branch) && c.getStatus() != Change.Status.MERGED;
+            });
+    return Lists.transform(notes, n -> changeDataFactory.create(db, n));
+  }
+
+  private Iterable<ChangeData> byCommitsOnBranchNotMergedFromIndex(
+      Branch.NameKey branch, Collection<String> hashes) throws OrmException {
+    return query(
+        and(
+            ref(branch),
+            project(branch.getParentKey()),
+            not(status(Change.Status.MERGED)),
+            or(commits(hashes))));
+  }
+
+  private static List<Predicate<ChangeData>> commits(Collection<String> hashes) {
+    List<Predicate<ChangeData>> commits = new ArrayList<>(hashes.size());
+    for (String s : hashes) {
+      commits.add(commit(s));
+    }
+    return commits;
+  }
+
+  public List<ChangeData> byProjectOpen(Project.NameKey project) throws OrmException {
+    return query(and(project(project), open()));
+  }
+
+  public List<ChangeData> byTopicOpen(String topic) throws OrmException {
+    return query(and(new ExactTopicPredicate(topic), open()));
+  }
+
+  public List<ChangeData> byCommit(ObjectId id) throws OrmException {
+    return byCommit(id.name());
+  }
+
+  public List<ChangeData> byCommit(String hash) throws OrmException {
+    return query(commit(hash));
+  }
+
+  public List<ChangeData> byProjectCommit(Project.NameKey project, ObjectId id)
+      throws OrmException {
+    return byProjectCommit(project, id.name());
+  }
+
+  public List<ChangeData> byProjectCommit(Project.NameKey project, String hash)
+      throws OrmException {
+    return query(and(project(project), commit(hash)));
+  }
+
+  public List<ChangeData> byProjectCommits(Project.NameKey project, List<String> hashes)
+      throws OrmException {
+    int n = indexConfig.maxTerms() - 1;
+    checkArgument(hashes.size() <= n, "cannot exceed %s commits", n);
+    return query(and(project(project), or(commits(hashes))));
+  }
+
+  public List<ChangeData> byBranchCommit(String project, String branch, String hash)
+      throws OrmException {
+    return query(byBranchCommitPred(project, branch, hash));
+  }
+
+  public List<ChangeData> byBranchCommit(Branch.NameKey branch, String hash) throws OrmException {
+    return byBranchCommit(branch.getParentKey().get(), branch.get(), hash);
+  }
+
+  public List<ChangeData> byBranchCommitOpen(String project, String branch, String hash)
+      throws OrmException {
+    return query(and(byBranchCommitPred(project, branch, hash), open()));
+  }
+
+  public static Predicate<ChangeData> byBranchCommitOpenPred(
+      Project.NameKey project, String branch, String hash) {
+    return and(byBranchCommitPred(project.get(), branch, hash), open());
+  }
+
+  private static Predicate<ChangeData> byBranchCommitPred(
+      String project, String branch, String hash) {
+    return and(new ProjectPredicate(project), new RefPredicate(branch), commit(hash));
+  }
+
+  public List<ChangeData> bySubmissionId(String cs) throws OrmException {
+    if (Strings.isNullOrEmpty(cs)) {
+      return Collections.emptyList();
+    }
+    return query(new SubmissionIdPredicate(cs));
+  }
+
+  private List<ChangeData> byProjectGroups(Project.NameKey project, Collection<String> groups)
+      throws OrmException {
+    int n = indexConfig.maxTerms() - 1;
+    checkArgument(groups.size() <= n, "cannot exceed %s groups", n);
+    List<GroupPredicate> groupPredicates = new ArrayList<>(groups.size());
+    for (String g : groups) {
+      groupPredicates.add(new GroupPredicate(g));
+    }
+    return query(and(project(project), or(groupPredicates)));
+  }
+
+  // Batching via multiple queries requires passing in a Provider since the underlying
+  // QueryProcessor instance is not reusable.
+  public static List<ChangeData> byProjectGroups(
+      Provider<InternalChangeQuery> queryProvider,
+      IndexConfig indexConfig,
+      Project.NameKey project,
+      Collection<String> groups)
+      throws OrmException {
+    int batchSize = indexConfig.maxTerms() - 1;
+    if (groups.size() <= batchSize) {
+      return queryProvider.get().enforceVisibility(true).byProjectGroups(project, groups);
+    }
+    Set<Change.Id> seen = new HashSet<>();
+    List<ChangeData> result = new ArrayList<>();
+    for (List<String> part : Iterables.partition(groups, batchSize)) {
+      for (ChangeData cd :
+          queryProvider.get().enforceVisibility(true).byProjectGroups(project, part)) {
+        if (!seen.add(cd.getId())) {
+          result.add(cd);
+        }
+      }
+    }
+    return result;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/IsReviewedPredicate.java b/java/com/google/gerrit/server/query/change/IsReviewedPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/IsReviewedPredicate.java
rename to java/com/google/gerrit/server/query/change/IsReviewedPredicate.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/IsUnresolvedPredicate.java b/java/com/google/gerrit/server/query/change/IsUnresolvedPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/IsUnresolvedPredicate.java
rename to java/com/google/gerrit/server/query/change/IsUnresolvedPredicate.java
diff --git a/java/com/google/gerrit/server/query/change/IsWatchedByPredicate.java b/java/com/google/gerrit/server/query/change/IsWatchedByPredicate.java
new file mode 100644
index 0000000..87845d4
--- /dev/null
+++ b/java/com/google/gerrit/server/query/change/IsWatchedByPredicate.java
@@ -0,0 +1,119 @@
+// Copyright (C) 2010 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.google.gerrit.server.query.change;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.index.query.AndPredicate;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryBuilder;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.ProjectWatches.ProjectWatchKey;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+public class IsWatchedByPredicate extends AndPredicate<ChangeData> {
+  protected static String describe(CurrentUser user) {
+    if (user.isIdentifiedUser()) {
+      return user.getAccountId().toString();
+    }
+    return user.toString();
+  }
+
+  protected final CurrentUser user;
+
+  public IsWatchedByPredicate(ChangeQueryBuilder.Arguments args, boolean checkIsVisible)
+      throws QueryParseException {
+    super(filters(args, checkIsVisible));
+    this.user = args.getUser();
+  }
+
+  protected static List<Predicate<ChangeData>> filters(
+      ChangeQueryBuilder.Arguments args, boolean checkIsVisible) throws QueryParseException {
+    List<Predicate<ChangeData>> r = new ArrayList<>();
+    ChangeQueryBuilder builder = new ChangeQueryBuilder(args);
+    for (ProjectWatchKey w : getWatches(args)) {
+      Predicate<ChangeData> f = null;
+      if (w.filter() != null) {
+        try {
+          f = builder.parse(w.filter());
+          if (QueryBuilder.find(f, IsWatchedByPredicate.class) != null) {
+            // If the query is going to infinite loop, assume it
+            // will never match and return null. Yes this test
+            // prevents you from having a filter that matches what
+            // another user is filtering on. :-)
+            continue;
+          }
+        } catch (QueryParseException e) {
+          continue;
+        }
+      }
+
+      Predicate<ChangeData> p;
+      if (w.project().equals(args.allProjectsName)) {
+        p = null;
+      } else {
+        p = builder.project(w.project().get());
+      }
+
+      if (p != null && f != null) {
+        r.add(and(p, f));
+      } else if (p != null) {
+        r.add(p);
+      } else if (f != null) {
+        r.add(f);
+      } else {
+        r.add(builder.status_open());
+      }
+    }
+    if (r.isEmpty()) {
+      return none();
+    } else if (checkIsVisible) {
+      return ImmutableList.of(or(r), builder.is_visible());
+    } else {
+      return ImmutableList.of(or(r));
+    }
+  }
+
+  protected static Collection<ProjectWatchKey> getWatches(ChangeQueryBuilder.Arguments args)
+      throws QueryParseException {
+    CurrentUser user = args.getUser();
+    if (user.isIdentifiedUser()) {
+      return user.asIdentifiedUser().state().getProjectWatches().keySet();
+    }
+    return Collections.<ProjectWatchKey>emptySet();
+  }
+
+  protected static List<Predicate<ChangeData>> none() {
+    Predicate<ChangeData> any = any();
+    return ImmutableList.of(not(any));
+  }
+
+  @Override
+  public int getCost() {
+    return 1;
+  }
+
+  @Override
+  public String toString() {
+    String val = describe(user);
+    if (val.indexOf(' ') < 0) {
+      return ChangeQueryBuilder.FIELD_WATCHEDBY + ":" + val;
+    }
+    return ChangeQueryBuilder.FIELD_WATCHEDBY + ":\"" + val + "\"";
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/LabelPredicate.java b/java/com/google/gerrit/server/query/change/LabelPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/LabelPredicate.java
rename to java/com/google/gerrit/server/query/change/LabelPredicate.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/LegacyChangeIdPredicate.java b/java/com/google/gerrit/server/query/change/LegacyChangeIdPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/LegacyChangeIdPredicate.java
rename to java/com/google/gerrit/server/query/change/LegacyChangeIdPredicate.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/MessagePredicate.java b/java/com/google/gerrit/server/query/change/MessagePredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/MessagePredicate.java
rename to java/com/google/gerrit/server/query/change/MessagePredicate.java
diff --git a/java/com/google/gerrit/server/query/change/OrSource.java b/java/com/google/gerrit/server/query/change/OrSource.java
new file mode 100644
index 0000000..b3e1c27
--- /dev/null
+++ b/java/com/google/gerrit/server/query/change/OrSource.java
@@ -0,0 +1,84 @@
+// Copyright (C) 2010 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.google.gerrit.server.query.change;
+
+import com.google.gerrit.index.query.FieldBundle;
+import com.google.gerrit.index.query.OrPredicate;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gwtorm.server.ListResultSet;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.ResultSet;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class OrSource extends OrPredicate<ChangeData> implements ChangeDataSource {
+  private int cardinality = -1;
+
+  public OrSource(Collection<? extends Predicate<ChangeData>> that) {
+    super(that);
+  }
+
+  @Override
+  public ResultSet<ChangeData> read() throws OrmException {
+    // TODO(spearce) This probably should be more lazy.
+    //
+    List<ChangeData> r = new ArrayList<>();
+    Set<Change.Id> have = new HashSet<>();
+    for (Predicate<ChangeData> p : getChildren()) {
+      if (p instanceof ChangeDataSource) {
+        for (ChangeData cd : ((ChangeDataSource) p).read()) {
+          if (have.add(cd.getId())) {
+            r.add(cd);
+          }
+        }
+      } else {
+        throw new OrmException("No ChangeDataSource: " + p);
+      }
+    }
+    return new ListResultSet<>(r);
+  }
+
+  @Override
+  public ResultSet<FieldBundle> readRaw() throws OrmException {
+    throw new UnsupportedOperationException("not implemented");
+  }
+
+  @Override
+  public boolean hasChange() {
+    for (Predicate<ChangeData> p : getChildren()) {
+      if (!(p instanceof ChangeDataSource) || !((ChangeDataSource) p).hasChange()) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  @Override
+  public int getCardinality() {
+    if (cardinality < 0) {
+      cardinality = 0;
+      for (Predicate<ChangeData> p : getChildren()) {
+        if (p instanceof ChangeDataSource) {
+          cardinality += ((ChangeDataSource) p).getCardinality();
+        }
+      }
+    }
+    return cardinality;
+  }
+}
diff --git a/java/com/google/gerrit/server/query/change/OutputStreamQuery.java b/java/com/google/gerrit/server/query/change/OutputStreamQuery.java
new file mode 100644
index 0000000..17c23b6
--- /dev/null
+++ b/java/com/google/gerrit/server/query/change/OutputStreamQuery.java
@@ -0,0 +1,469 @@
+// Copyright (C) 2014 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.google.gerrit.server.query.change;
+
+import static com.google.common.base.Preconditions.checkState;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.LabelTypes;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.index.query.QueryResult;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.DynamicOptions;
+import com.google.gerrit.server.config.TrackingFooters;
+import com.google.gerrit.server.data.ChangeAttribute;
+import com.google.gerrit.server.data.PatchSetAttribute;
+import com.google.gerrit.server.data.QueryStatsAttribute;
+import com.google.gerrit.server.events.EventFactory;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.project.SubmitRuleEvaluator;
+import com.google.gerrit.server.project.SubmitRuleOptions;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gson.Gson;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.lang.reflect.Field;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.util.io.DisabledOutputStream;
+
+/**
+ * Change query implementation that outputs to a stream in the style of an SSH command.
+ *
+ * <p>Instances are one-time-use. Other singleton classes should inject a Provider rather than
+ * holding on to a single instance.
+ */
+public class OutputStreamQuery {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final DateTimeFormatter dtf =
+      DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss zzz")
+          .withLocale(Locale.US)
+          .withZone(ZoneId.systemDefault());
+
+  public enum OutputFormat {
+    TEXT,
+    JSON
+  }
+
+  private final ReviewDb db;
+  private final GitRepositoryManager repoManager;
+  private final ChangeQueryBuilder queryBuilder;
+  private final ChangeQueryProcessor queryProcessor;
+  private final EventFactory eventFactory;
+  private final TrackingFooters trackingFooters;
+  private final SubmitRuleEvaluator.Factory submitRuleEvaluatorFactory;
+
+  private OutputFormat outputFormat = OutputFormat.TEXT;
+  private boolean includePatchSets;
+  private boolean includeCurrentPatchSet;
+  private boolean includeApprovals;
+  private boolean includeComments;
+  private boolean includeFiles;
+  private boolean includeCommitMessage;
+  private boolean includeDependencies;
+  private boolean includeSubmitRecords;
+  private boolean includeAllReviewers;
+
+  private OutputStream outputStream = DisabledOutputStream.INSTANCE;
+  private PrintWriter out;
+
+  @Inject
+  OutputStreamQuery(
+      ReviewDb db,
+      GitRepositoryManager repoManager,
+      ChangeQueryBuilder queryBuilder,
+      ChangeQueryProcessor queryProcessor,
+      EventFactory eventFactory,
+      TrackingFooters trackingFooters,
+      SubmitRuleEvaluator.Factory submitRuleEvaluatorFactory) {
+    this.db = db;
+    this.repoManager = repoManager;
+    this.queryBuilder = queryBuilder;
+    this.queryProcessor = queryProcessor;
+    this.eventFactory = eventFactory;
+    this.trackingFooters = trackingFooters;
+    this.submitRuleEvaluatorFactory = submitRuleEvaluatorFactory;
+  }
+
+  void setLimit(int n) {
+    queryProcessor.setUserProvidedLimit(n);
+  }
+
+  public void setStart(int n) {
+    queryProcessor.setStart(n);
+  }
+
+  public void setIncludePatchSets(boolean on) {
+    includePatchSets = on;
+  }
+
+  public boolean getIncludePatchSets() {
+    return includePatchSets;
+  }
+
+  public void setIncludeCurrentPatchSet(boolean on) {
+    includeCurrentPatchSet = on;
+  }
+
+  public boolean getIncludeCurrentPatchSet() {
+    return includeCurrentPatchSet;
+  }
+
+  public void setIncludeApprovals(boolean on) {
+    includeApprovals = on;
+  }
+
+  public void setIncludeComments(boolean on) {
+    includeComments = on;
+  }
+
+  public void setIncludeFiles(boolean on) {
+    includeFiles = on;
+  }
+
+  public boolean getIncludeFiles() {
+    return includeFiles;
+  }
+
+  public void setIncludeDependencies(boolean on) {
+    includeDependencies = on;
+  }
+
+  public boolean getIncludeDependencies() {
+    return includeDependencies;
+  }
+
+  public void setIncludeCommitMessage(boolean on) {
+    includeCommitMessage = on;
+  }
+
+  public void setIncludeSubmitRecords(boolean on) {
+    includeSubmitRecords = on;
+  }
+
+  public void setIncludeAllReviewers(boolean on) {
+    includeAllReviewers = on;
+  }
+
+  public void setOutput(OutputStream out, OutputFormat fmt) {
+    this.outputStream = out;
+    this.outputFormat = fmt;
+  }
+
+  public void setDynamicBean(String plugin, DynamicOptions.DynamicBean dynamicBean) {
+    queryProcessor.setDynamicBean(plugin, dynamicBean);
+  }
+
+  public void query(String queryString) throws IOException {
+    out =
+        new PrintWriter( //
+            new BufferedWriter( //
+                new OutputStreamWriter(outputStream, UTF_8)));
+    try {
+      if (queryProcessor.isDisabled()) {
+        ErrorMessage m = new ErrorMessage();
+        m.message = "query disabled";
+        show(m);
+        return;
+      }
+
+      try {
+        final QueryStatsAttribute stats = new QueryStatsAttribute();
+        stats.runTimeMilliseconds = TimeUtil.nowMs();
+
+        Map<Project.NameKey, Repository> repos = new HashMap<>();
+        Map<Project.NameKey, RevWalk> revWalks = new HashMap<>();
+        QueryResult<ChangeData> results = queryProcessor.query(queryBuilder.parse(queryString));
+        try {
+          for (ChangeData d : results.entities()) {
+            show(buildChangeAttribute(d, repos, revWalks));
+          }
+        } finally {
+          closeAll(revWalks.values(), repos.values());
+        }
+
+        stats.rowCount = results.entities().size();
+        stats.moreChanges = results.more();
+        stats.runTimeMilliseconds = TimeUtil.nowMs() - stats.runTimeMilliseconds;
+        show(stats);
+      } catch (OrmException err) {
+        logger.atSevere().withCause(err).log("Cannot execute query: %s", queryString);
+
+        ErrorMessage m = new ErrorMessage();
+        m.message = "cannot query database";
+        show(m);
+
+      } catch (QueryParseException e) {
+        ErrorMessage m = new ErrorMessage();
+        m.message = e.getMessage();
+        show(m);
+      }
+    } finally {
+      try {
+        out.flush();
+      } finally {
+        out = null;
+      }
+    }
+  }
+
+  private ChangeAttribute buildChangeAttribute(
+      ChangeData d, Map<Project.NameKey, Repository> repos, Map<Project.NameKey, RevWalk> revWalks)
+      throws OrmException, IOException {
+    LabelTypes labelTypes = d.getLabelTypes();
+    ChangeAttribute c = eventFactory.asChangeAttribute(db, d.change(), d.notes());
+    eventFactory.extend(c, d.change());
+
+    if (!trackingFooters.isEmpty()) {
+      eventFactory.addTrackingIds(c, d.trackingFooters());
+    }
+
+    if (includeAllReviewers) {
+      eventFactory.addAllReviewers(db, c, d.notes());
+    }
+
+    if (includeSubmitRecords) {
+      SubmitRuleOptions options = SubmitRuleOptions.builder().allowClosed(true).build();
+      eventFactory.addSubmitRecords(c, submitRuleEvaluatorFactory.create(options).evaluate(d));
+    }
+
+    if (includeCommitMessage) {
+      eventFactory.addCommitMessage(c, d.commitMessage());
+    }
+
+    RevWalk rw = null;
+    if (includePatchSets || includeCurrentPatchSet || includeDependencies) {
+      Project.NameKey p = d.change().getProject();
+      rw = revWalks.get(p);
+      // Cache and reuse repos and revwalks.
+      if (rw == null) {
+        Repository repo = repoManager.openRepository(p);
+        checkState(repos.put(p, repo) == null);
+        rw = new RevWalk(repo);
+        revWalks.put(p, rw);
+      }
+    }
+
+    if (includePatchSets) {
+      eventFactory.addPatchSets(
+          db,
+          rw,
+          c,
+          d.patchSets(),
+          includeApprovals ? d.approvals().asMap() : null,
+          includeFiles,
+          d.change(),
+          labelTypes);
+    }
+
+    if (includeCurrentPatchSet) {
+      PatchSet current = d.currentPatchSet();
+      if (current != null) {
+        c.currentPatchSet = eventFactory.asPatchSetAttribute(db, rw, d.change(), current);
+        eventFactory.addApprovals(c.currentPatchSet, d.currentApprovals(), labelTypes);
+
+        if (includeFiles) {
+          eventFactory.addPatchSetFileNames(c.currentPatchSet, d.change(), d.currentPatchSet());
+        }
+        if (includeComments) {
+          eventFactory.addPatchSetComments(c.currentPatchSet, d.publishedComments());
+        }
+      }
+    }
+
+    if (includeComments) {
+      eventFactory.addComments(c, d.messages());
+      if (includePatchSets) {
+        eventFactory.addPatchSets(
+            db,
+            rw,
+            c,
+            d.patchSets(),
+            includeApprovals ? d.approvals().asMap() : null,
+            includeFiles,
+            d.change(),
+            labelTypes);
+        for (PatchSetAttribute attribute : c.patchSets) {
+          eventFactory.addPatchSetComments(attribute, d.publishedComments());
+        }
+      }
+    }
+
+    if (includeDependencies) {
+      eventFactory.addDependencies(rw, c, d.change(), d.currentPatchSet());
+    }
+
+    c.plugins = queryProcessor.create(d);
+    return c;
+  }
+
+  private static void closeAll(Iterable<RevWalk> revWalks, Iterable<Repository> repos) {
+    if (repos != null) {
+      for (Repository repo : repos) {
+        repo.close();
+      }
+    }
+    if (revWalks != null) {
+      for (RevWalk revWalk : revWalks) {
+        revWalk.close();
+      }
+    }
+  }
+
+  private void show(Object data) {
+    switch (outputFormat) {
+      default:
+      case TEXT:
+        if (data instanceof ChangeAttribute) {
+          out.print("change ");
+          out.print(((ChangeAttribute) data).id);
+          out.print("\n");
+          showText(data, 1);
+        } else {
+          showText(data, 0);
+        }
+        out.print('\n');
+        break;
+
+      case JSON:
+        out.print(new Gson().toJson(data));
+        out.print('\n');
+        break;
+    }
+  }
+
+  private void showText(Object data, int depth) {
+    for (Field f : fieldsOf(data.getClass())) {
+      Object val;
+      try {
+        val = f.get(data);
+      } catch (IllegalArgumentException err) {
+        continue;
+      } catch (IllegalAccessException err) {
+        continue;
+      }
+      if (val == null) {
+        continue;
+      }
+
+      showField(f.getName(), val, depth);
+    }
+  }
+
+  private String indent(int spaces) {
+    if (spaces == 0) {
+      return "";
+    }
+    return String.format("%" + spaces + "s", " ");
+  }
+
+  private void showField(String field, Object value, int depth) {
+    final int spacesDepthRatio = 2;
+    String indent = indent(depth * spacesDepthRatio);
+    out.print(indent);
+    out.print(field);
+    out.print(':');
+    if (value instanceof String && ((String) value).contains("\n")) {
+      out.print(' ');
+      // Idention for multi-line text is
+      // current depth indetion + length of field + length of ": "
+      indent = indent(indent.length() + field.length() + spacesDepthRatio);
+      out.print(((String) value).replaceAll("\n", "\n" + indent).trim());
+      out.print('\n');
+    } else if (value instanceof Long && isDateField(field)) {
+      out.print(' ');
+      out.print(dtf.format(Instant.ofEpochSecond((Long) value)));
+      out.print('\n');
+    } else if (isPrimitive(value)) {
+      out.print(' ');
+      out.print(value);
+      out.print('\n');
+    } else if (value instanceof Collection) {
+      out.print('\n');
+      boolean firstElement = true;
+      for (Object thing : ((Collection<?>) value)) {
+        // The name of the collection was initially printed at the beginning
+        // of this routine.  Beginning at the second sub-element, reprint
+        // the collection name so humans can separate individual elements
+        // with less strain and error.
+        //
+        if (firstElement) {
+          firstElement = false;
+        } else {
+          out.print(indent);
+          out.print(field);
+          out.print(":\n");
+        }
+        if (isPrimitive(thing)) {
+          out.print(' ');
+          out.print(value);
+          out.print('\n');
+        } else {
+          showText(thing, depth + 1);
+        }
+      }
+    } else {
+      out.print('\n');
+      showText(value, depth + 1);
+    }
+  }
+
+  private static boolean isPrimitive(Object value) {
+    return value instanceof String //
+        || value instanceof Number //
+        || value instanceof Boolean //
+        || value instanceof Enum;
+  }
+
+  private static boolean isDateField(String name) {
+    return "lastUpdated".equals(name) //
+        || "grantedOn".equals(name) //
+        || "timestamp".equals(name) //
+        || "createdOn".equals(name);
+  }
+
+  private List<Field> fieldsOf(Class<?> type) {
+    List<Field> r = new ArrayList<>();
+    if (type.getSuperclass() != null) {
+      r.addAll(fieldsOf(type.getSuperclass()));
+    }
+    r.addAll(Arrays.asList(type.getDeclaredFields()));
+    return r;
+  }
+
+  static class ErrorMessage {
+    public final String type = "error";
+    public String message;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/OwnerPredicate.java b/java/com/google/gerrit/server/query/change/OwnerPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/OwnerPredicate.java
rename to java/com/google/gerrit/server/query/change/OwnerPredicate.java
diff --git a/java/com/google/gerrit/server/query/change/OwnerinPredicate.java b/java/com/google/gerrit/server/query/change/OwnerinPredicate.java
new file mode 100644
index 0000000..c48bdd5
--- /dev/null
+++ b/java/com/google/gerrit/server/query/change/OwnerinPredicate.java
@@ -0,0 +1,47 @@
+// Copyright (C) 2011 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.google.gerrit.server.query.change;
+
+import com.google.gerrit.index.query.PostFilterPredicate;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gwtorm.server.OrmException;
+
+public class OwnerinPredicate extends PostFilterPredicate<ChangeData> {
+  protected final IdentifiedUser.GenericFactory userFactory;
+  protected final AccountGroup.UUID uuid;
+
+  public OwnerinPredicate(IdentifiedUser.GenericFactory userFactory, AccountGroup.UUID uuid) {
+    super(ChangeQueryBuilder.FIELD_OWNERIN, uuid.get());
+    this.userFactory = userFactory;
+    this.uuid = uuid;
+  }
+
+  @Override
+  public boolean match(ChangeData object) throws OrmException {
+    final Change change = object.change();
+    if (change == null) {
+      return false;
+    }
+    final IdentifiedUser owner = userFactory.create(change.getOwner());
+    return owner.getEffectiveGroups().contains(uuid);
+  }
+
+  @Override
+  public int getCost() {
+    return 2;
+  }
+}
diff --git a/java/com/google/gerrit/server/query/change/ParentProjectPredicate.java b/java/com/google/gerrit/server/query/change/ParentProjectPredicate.java
new file mode 100644
index 0000000..17d6448
--- /dev/null
+++ b/java/com/google/gerrit/server/query/change/ParentProjectPredicate.java
@@ -0,0 +1,64 @@
+// Copyright (C) 2013 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.google.gerrit.server.query.change;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.index.query.OrPredicate;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ChildProjects;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class ParentProjectPredicate extends OrPredicate<ChangeData> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  protected final String value;
+
+  public ParentProjectPredicate(
+      ProjectCache projectCache, ChildProjects childProjects, String value) {
+    super(predicates(projectCache, childProjects, value));
+    this.value = value;
+  }
+
+  protected static List<Predicate<ChangeData>> predicates(
+      ProjectCache projectCache, ChildProjects childProjects, String value) {
+    ProjectState projectState = projectCache.get(new Project.NameKey(value));
+    if (projectState == null) {
+      return Collections.emptyList();
+    }
+
+    List<Predicate<ChangeData>> r = new ArrayList<>();
+    r.add(new ProjectPredicate(projectState.getName()));
+    try {
+      for (ProjectInfo p : childProjects.list(projectState.getNameKey())) {
+        r.add(new ProjectPredicate(p.name));
+      }
+    } catch (PermissionBackendException e) {
+      logger.atWarning().withCause(e).log("cannot check permissions to expand child projects");
+    }
+    return r;
+  }
+
+  @Override
+  public String toString() {
+    return ChangeQueryBuilder.FIELD_PARENTPROJECT + ":" + value;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/PluginDefinedAttributesFactory.java b/java/com/google/gerrit/server/query/change/PluginDefinedAttributesFactory.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/PluginDefinedAttributesFactory.java
rename to java/com/google/gerrit/server/query/change/PluginDefinedAttributesFactory.java
diff --git a/java/com/google/gerrit/server/query/change/PredicateArgs.java b/java/com/google/gerrit/server/query/change/PredicateArgs.java
new file mode 100644
index 0000000..ad7917e
--- /dev/null
+++ b/java/com/google/gerrit/server/query/change/PredicateArgs.java
@@ -0,0 +1,65 @@
+// Copyright (C) 2013 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.google.gerrit.server.query.change;
+
+import com.google.common.base.Splitter;
+import com.google.gerrit.index.query.QueryParseException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * This class is used to extract comma separated values in a predicate.
+ *
+ * <p>If tags for the values are present (e.g. "branch=jb_2.3,vote=approved") then the args are
+ * placed in a map that maps tag to value (e.g., "branch" to "jb_2.3"). If no tag is present (e.g.
+ * "jb_2.3,approved") then the args are placed into a positional list. Args may be mixed so some may
+ * appear in the map and others in the positional list (e.g. "vote=approved,jb_2.3).
+ */
+public class PredicateArgs {
+  public List<String> positional;
+  public Map<String, String> keyValue;
+
+  /**
+   * Parses query arguments into {@link #keyValue} and/or {@link #positional}..
+   *
+   * <p>Labels for these arguments should be kept in ChangeQueryBuilder as {@code ARG_ID_[argument
+   * name]}.
+   *
+   * @param args arguments to be parsed
+   * @throws QueryParseException
+   */
+  PredicateArgs(String args) throws QueryParseException {
+    positional = new ArrayList<>();
+    keyValue = new HashMap<>();
+
+    for (String arg : Splitter.on(',').split(args)) {
+      List<String> splitKeyValue = Splitter.on('=').splitToList(arg);
+
+      if (splitKeyValue.size() == 1) {
+        positional.add(splitKeyValue.get(0));
+      } else if (splitKeyValue.size() == 2) {
+        if (!keyValue.containsKey(splitKeyValue.get(0))) {
+          keyValue.put(splitKeyValue.get(0), splitKeyValue.get(1));
+        } else {
+          throw new QueryParseException("Duplicate key " + splitKeyValue.get(0));
+        }
+      } else {
+        throw new QueryParseException("invalid arg " + arg);
+      }
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ProjectPredicate.java b/java/com/google/gerrit/server/query/change/ProjectPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/ProjectPredicate.java
rename to java/com/google/gerrit/server/query/change/ProjectPredicate.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ProjectPrefixPredicate.java b/java/com/google/gerrit/server/query/change/ProjectPrefixPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/ProjectPrefixPredicate.java
rename to java/com/google/gerrit/server/query/change/ProjectPrefixPredicate.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RefPredicate.java b/java/com/google/gerrit/server/query/change/RefPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/RefPredicate.java
rename to java/com/google/gerrit/server/query/change/RefPredicate.java
diff --git a/java/com/google/gerrit/server/query/change/RegexPathPredicate.java b/java/com/google/gerrit/server/query/change/RegexPathPredicate.java
new file mode 100644
index 0000000..f694904
--- /dev/null
+++ b/java/com/google/gerrit/server/query/change/RegexPathPredicate.java
@@ -0,0 +1,43 @@
+// Copyright (C) 2010 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.google.gerrit.server.query.change;
+
+import com.google.gerrit.server.index.change.ChangeField;
+import com.google.gerrit.server.ioutil.RegexListSearcher;
+import com.google.gwtorm.server.OrmException;
+import java.io.IOException;
+import java.util.List;
+
+public class RegexPathPredicate extends ChangeRegexPredicate {
+  public RegexPathPredicate(String re) {
+    super(ChangeField.PATH, re);
+  }
+
+  @Override
+  public boolean match(ChangeData object) throws OrmException {
+    List<String> files;
+    try {
+      files = object.currentFilePaths();
+    } catch (IOException e) {
+      throw new OrmException(e);
+    }
+    return RegexListSearcher.ofStrings(getValue()).search(files).findAny().isPresent();
+  }
+
+  @Override
+  public int getCost() {
+    return 1;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexProjectPredicate.java b/java/com/google/gerrit/server/query/change/RegexProjectPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexProjectPredicate.java
rename to java/com/google/gerrit/server/query/change/RegexProjectPredicate.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexRefPredicate.java b/java/com/google/gerrit/server/query/change/RegexRefPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexRefPredicate.java
rename to java/com/google/gerrit/server/query/change/RegexRefPredicate.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexTopicPredicate.java b/java/com/google/gerrit/server/query/change/RegexTopicPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexTopicPredicate.java
rename to java/com/google/gerrit/server/query/change/RegexTopicPredicate.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RevertOfPredicate.java b/java/com/google/gerrit/server/query/change/RevertOfPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/RevertOfPredicate.java
rename to java/com/google/gerrit/server/query/change/RevertOfPredicate.java
diff --git a/java/com/google/gerrit/server/query/change/ReviewerByEmailPredicate.java b/java/com/google/gerrit/server/query/change/ReviewerByEmailPredicate.java
new file mode 100644
index 0000000..667c630
--- /dev/null
+++ b/java/com/google/gerrit/server/query/change/ReviewerByEmailPredicate.java
@@ -0,0 +1,54 @@
+// Copyright (C) 2017 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.google.gerrit.server.query.change;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.server.index.change.ChangeField;
+import com.google.gerrit.server.notedb.ReviewerStateInternal;
+import com.google.gwtorm.server.OrmException;
+
+class ReviewerByEmailPredicate extends ChangeIndexPredicate {
+
+  static Predicate<ChangeData> forState(Address adr, ReviewerStateInternal state) {
+    checkArgument(state != ReviewerStateInternal.REMOVED, "can't query by removed reviewer");
+    return new ReviewerByEmailPredicate(state, adr);
+  }
+
+  private final ReviewerStateInternal state;
+  private final Address adr;
+
+  private ReviewerByEmailPredicate(ReviewerStateInternal state, Address adr) {
+    super(ChangeField.REVIEWER_BY_EMAIL, ChangeField.getReviewerByEmailFieldValue(state, adr));
+    this.state = state;
+    this.adr = adr;
+  }
+
+  Address getAddress() {
+    return adr;
+  }
+
+  @Override
+  public boolean match(ChangeData cd) throws OrmException {
+    return cd.reviewersByEmail().asTable().get(state, adr) != null;
+  }
+
+  @Override
+  public int getCost() {
+    return 1;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ReviewerPredicate.java b/java/com/google/gerrit/server/query/change/ReviewerPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/ReviewerPredicate.java
rename to java/com/google/gerrit/server/query/change/ReviewerPredicate.java
diff --git a/java/com/google/gerrit/server/query/change/ReviewerinPredicate.java b/java/com/google/gerrit/server/query/change/ReviewerinPredicate.java
new file mode 100644
index 0000000..a0aa8b5
--- /dev/null
+++ b/java/com/google/gerrit/server/query/change/ReviewerinPredicate.java
@@ -0,0 +1,53 @@
+// Copyright (C) 2011 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.google.gerrit.server.query.change;
+
+import com.google.gerrit.index.query.PostFilterPredicate;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.notedb.ReviewerStateInternal;
+import com.google.gwtorm.server.OrmException;
+
+public class ReviewerinPredicate extends PostFilterPredicate<ChangeData> {
+  protected final IdentifiedUser.GenericFactory userFactory;
+  protected final AccountGroup.UUID uuid;
+
+  public ReviewerinPredicate(IdentifiedUser.GenericFactory userFactory, AccountGroup.UUID uuid) {
+    super(ChangeQueryBuilder.FIELD_REVIEWERIN, uuid.get());
+    this.userFactory = userFactory;
+    this.uuid = uuid;
+  }
+
+  protected AccountGroup.UUID getAccountGroupUUID() {
+    return uuid;
+  }
+
+  @Override
+  public boolean match(ChangeData object) throws OrmException {
+    for (Account.Id accountId : object.reviewers().byState(ReviewerStateInternal.REVIEWER)) {
+      IdentifiedUser reviewer = userFactory.create(accountId);
+      if (reviewer.getEffectiveGroups().contains(uuid)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @Override
+  public int getCost() {
+    return 3;
+  }
+}
diff --git a/java/com/google/gerrit/server/query/change/SingleGroupUser.java b/java/com/google/gerrit/server/query/change/SingleGroupUser.java
new file mode 100644
index 0000000..a49e8c5
--- /dev/null
+++ b/java/com/google/gerrit/server/query/change/SingleGroupUser.java
@@ -0,0 +1,44 @@
+// Copyright (C) 2009 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.google.gerrit.server.query.change;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.GroupMembership;
+import com.google.gerrit.server.account.ListGroupMembership;
+import java.util.Set;
+
+public final class SingleGroupUser extends CurrentUser {
+  private final GroupMembership groups;
+
+  public SingleGroupUser(AccountGroup.UUID groupId) {
+    this(ImmutableSet.of(groupId));
+  }
+
+  public SingleGroupUser(Set<AccountGroup.UUID> groups) {
+    this.groups = new ListGroupMembership(groups);
+  }
+
+  @Override
+  public GroupMembership getEffectiveGroups() {
+    return groups;
+  }
+
+  @Override
+  public Object getCacheKey() {
+    return groups.getKnownGroups();
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/StarPredicate.java b/java/com/google/gerrit/server/query/change/StarPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/StarPredicate.java
rename to java/com/google/gerrit/server/query/change/StarPredicate.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/SubmissionIdPredicate.java b/java/com/google/gerrit/server/query/change/SubmissionIdPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/SubmissionIdPredicate.java
rename to java/com/google/gerrit/server/query/change/SubmissionIdPredicate.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/SubmitRecordPredicate.java b/java/com/google/gerrit/server/query/change/SubmitRecordPredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/SubmitRecordPredicate.java
rename to java/com/google/gerrit/server/query/change/SubmitRecordPredicate.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/SubmittablePredicate.java b/java/com/google/gerrit/server/query/change/SubmittablePredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/SubmittablePredicate.java
rename to java/com/google/gerrit/server/query/change/SubmittablePredicate.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/TimestampRangeChangePredicate.java b/java/com/google/gerrit/server/query/change/TimestampRangeChangePredicate.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/change/TimestampRangeChangePredicate.java
rename to java/com/google/gerrit/server/query/change/TimestampRangeChangePredicate.java
diff --git a/java/com/google/gerrit/server/query/change/TrackingIdPredicate.java b/java/com/google/gerrit/server/query/change/TrackingIdPredicate.java
new file mode 100644
index 0000000..4f751c5
--- /dev/null
+++ b/java/com/google/gerrit/server/query/change/TrackingIdPredicate.java
@@ -0,0 +1,43 @@
+// Copyright (C) 2010 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.google.gerrit.server.query.change;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.server.index.change.ChangeField;
+import com.google.gwtorm.server.OrmException;
+import java.io.IOException;
+
+public class TrackingIdPredicate extends ChangeIndexPredicate {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public TrackingIdPredicate(String trackingId) {
+    super(ChangeField.TR, trackingId);
+  }
+
+  @Override
+  public boolean match(ChangeData cd) throws OrmException {
+    try {
+      return cd.trackingFooters().containsValue(getValue());
+    } catch (IOException e) {
+      logger.atWarning().withCause(e).log("Cannot extract footers from %s", cd.getId());
+    }
+    return false;
+  }
+
+  @Override
+  public int getCost() {
+    return 1;
+  }
+}
diff --git a/java/com/google/gerrit/server/query/group/GroupIsVisibleToPredicate.java b/java/com/google/gerrit/server/query/group/GroupIsVisibleToPredicate.java
new file mode 100644
index 0000000..144a81c
--- /dev/null
+++ b/java/com/google/gerrit/server/query/group/GroupIsVisibleToPredicate.java
@@ -0,0 +1,58 @@
+// Copyright (C) 2017 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.google.gerrit.server.query.group;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.errors.NoSuchGroupException;
+import com.google.gerrit.index.query.IsVisibleToPredicate;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.GroupControl;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.index.IndexUtils;
+import com.google.gerrit.server.query.account.AccountQueryBuilder;
+import com.google.gwtorm.server.OrmException;
+
+public class GroupIsVisibleToPredicate extends IsVisibleToPredicate<InternalGroup> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  protected final GroupControl.GenericFactory groupControlFactory;
+  protected final CurrentUser user;
+
+  public GroupIsVisibleToPredicate(
+      GroupControl.GenericFactory groupControlFactory, CurrentUser user) {
+    super(AccountQueryBuilder.FIELD_VISIBLETO, IndexUtils.describe(user));
+    this.groupControlFactory = groupControlFactory;
+    this.user = user;
+  }
+
+  @Override
+  public boolean match(InternalGroup group) throws OrmException {
+    try {
+      boolean canSee = groupControlFactory.controlFor(user, group.getGroupUUID()).isVisible();
+      if (!canSee) {
+        logger.atFine().log("Filter out non-visisble group: %s", group.getGroupUUID());
+      }
+      return canSee;
+    } catch (NoSuchGroupException e) {
+      // Ignored
+      return false;
+    }
+  }
+
+  @Override
+  public int getCost() {
+    return 1;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/group/GroupPredicates.java b/java/com/google/gerrit/server/query/group/GroupPredicates.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/query/group/GroupPredicates.java
rename to java/com/google/gerrit/server/query/group/GroupPredicates.java
diff --git a/java/com/google/gerrit/server/query/group/GroupQueryBuilder.java b/java/com/google/gerrit/server/query/group/GroupQueryBuilder.java
new file mode 100644
index 0000000..296dc17
--- /dev/null
+++ b/java/com/google/gerrit/server/query/group/GroupQueryBuilder.java
@@ -0,0 +1,179 @@
+// Copyright (C) 2017 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.google.gerrit.server.query.group;
+
+import static com.google.common.collect.ImmutableList.toImmutableList;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+import com.google.common.primitives.Ints;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.index.query.LimitPredicate;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryBuilder;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.account.AccountResolver;
+import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.account.GroupBackends;
+import com.google.gerrit.server.account.GroupCache;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+/** Parses a query string meant to be applied to group objects. */
+public class GroupQueryBuilder extends QueryBuilder<InternalGroup> {
+  public static final String FIELD_UUID = "uuid";
+  public static final String FIELD_DESCRIPTION = "description";
+  public static final String FIELD_INNAME = "inname";
+  public static final String FIELD_NAME = "name";
+  public static final String FIELD_OWNER = "owner";
+  public static final String FIELD_LIMIT = "limit";
+
+  private static final QueryBuilder.Definition<InternalGroup, GroupQueryBuilder> mydef =
+      new QueryBuilder.Definition<>(GroupQueryBuilder.class);
+
+  public static class Arguments {
+    final GroupCache groupCache;
+    final GroupBackend groupBackend;
+    final AccountResolver accountResolver;
+
+    @Inject
+    Arguments(GroupCache groupCache, GroupBackend groupBackend, AccountResolver accountResolver) {
+      this.groupCache = groupCache;
+      this.groupBackend = groupBackend;
+      this.accountResolver = accountResolver;
+    }
+  }
+
+  private final Arguments args;
+
+  @Inject
+  GroupQueryBuilder(Arguments args) {
+    super(mydef);
+    this.args = args;
+  }
+
+  @Operator
+  public Predicate<InternalGroup> uuid(String uuid) {
+    return GroupPredicates.uuid(new AccountGroup.UUID(uuid));
+  }
+
+  @Operator
+  public Predicate<InternalGroup> description(String description) throws QueryParseException {
+    if (Strings.isNullOrEmpty(description)) {
+      throw error("description operator requires a value");
+    }
+
+    return GroupPredicates.description(description);
+  }
+
+  @Operator
+  public Predicate<InternalGroup> inname(String namePart) {
+    if (namePart.isEmpty()) {
+      return name(namePart);
+    }
+    return GroupPredicates.inname(namePart);
+  }
+
+  @Operator
+  public Predicate<InternalGroup> name(String name) {
+    return GroupPredicates.name(name);
+  }
+
+  @Operator
+  public Predicate<InternalGroup> owner(String owner) throws QueryParseException {
+    AccountGroup.UUID groupUuid = parseGroup(owner);
+    return GroupPredicates.owner(groupUuid);
+  }
+
+  @Operator
+  public Predicate<InternalGroup> is(String value) throws QueryParseException {
+    if ("visibletoall".equalsIgnoreCase(value)) {
+      return GroupPredicates.isVisibleToAll();
+    }
+    throw error("Invalid query");
+  }
+
+  @Override
+  protected Predicate<InternalGroup> defaultField(String query) throws QueryParseException {
+    // Adapt the capacity of this list when adding more default predicates.
+    List<Predicate<InternalGroup>> preds = Lists.newArrayListWithCapacity(5);
+    preds.add(uuid(query));
+    preds.add(name(query));
+    preds.add(inname(query));
+    if (!Strings.isNullOrEmpty(query)) {
+      preds.add(description(query));
+    }
+    try {
+      preds.add(owner(query));
+    } catch (QueryParseException e) {
+      // Skip.
+    }
+    return Predicate.or(preds);
+  }
+
+  @Operator
+  public Predicate<InternalGroup> member(String query)
+      throws QueryParseException, OrmException, ConfigInvalidException, IOException {
+    Set<Account.Id> accounts = parseAccount(query);
+    List<Predicate<InternalGroup>> predicates =
+        accounts.stream().map(GroupPredicates::member).collect(toImmutableList());
+    return Predicate.or(predicates);
+  }
+
+  @Operator
+  public Predicate<InternalGroup> subgroup(String query) throws QueryParseException {
+    AccountGroup.UUID groupUuid = parseGroup(query);
+    return GroupPredicates.subgroup(groupUuid);
+  }
+
+  @Operator
+  public Predicate<InternalGroup> limit(String query) throws QueryParseException {
+    Integer limit = Ints.tryParse(query);
+    if (limit == null) {
+      throw error("Invalid limit: " + query);
+    }
+    return new LimitPredicate<>(FIELD_LIMIT, limit);
+  }
+
+  private Set<Account.Id> parseAccount(String nameOrEmail)
+      throws QueryParseException, OrmException, IOException, ConfigInvalidException {
+    Set<Account.Id> foundAccounts = args.accountResolver.findAll(nameOrEmail);
+    if (foundAccounts.isEmpty()) {
+      throw error("User " + nameOrEmail + " not found");
+    }
+    return foundAccounts;
+  }
+
+  private AccountGroup.UUID parseGroup(String groupNameOrUuid) throws QueryParseException {
+    Optional<InternalGroup> group = args.groupCache.get(new AccountGroup.UUID(groupNameOrUuid));
+    if (group.isPresent()) {
+      return group.get().getGroupUUID();
+    }
+    GroupReference groupReference =
+        GroupBackends.findBestSuggestion(args.groupBackend, groupNameOrUuid);
+    if (groupReference == null) {
+      throw error("Group " + groupNameOrUuid + " not found");
+    }
+    return groupReference.getUUID();
+  }
+}
diff --git a/java/com/google/gerrit/server/query/group/GroupQueryProcessor.java b/java/com/google/gerrit/server/query/group/GroupQueryProcessor.java
new file mode 100644
index 0000000..86c574d
--- /dev/null
+++ b/java/com/google/gerrit/server/query/group/GroupQueryProcessor.java
@@ -0,0 +1,84 @@
+// Copyright (C) 2017 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.google.gerrit.server.query.group;
+
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.gerrit.server.query.group.GroupQueryBuilder.FIELD_LIMIT;
+
+import com.google.gerrit.index.IndexConfig;
+import com.google.gerrit.index.query.AndSource;
+import com.google.gerrit.index.query.IndexPredicate;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryProcessor;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.AccountLimits;
+import com.google.gerrit.server.account.GroupControl;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.index.group.GroupIndexCollection;
+import com.google.gerrit.server.index.group.GroupIndexRewriter;
+import com.google.gerrit.server.index.group.GroupSchemaDefinitions;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+
+/**
+ * Query processor for the group index.
+ *
+ * <p>Instances are one-time-use. Other singleton classes should inject a Provider rather than
+ * holding on to a single instance.
+ */
+public class GroupQueryProcessor extends QueryProcessor<InternalGroup> {
+  private final Provider<CurrentUser> userProvider;
+  private final GroupControl.GenericFactory groupControlFactory;
+
+  static {
+    // It is assumed that basic rewrites do not touch visibleto predicates.
+    checkState(
+        !GroupIsVisibleToPredicate.class.isAssignableFrom(IndexPredicate.class),
+        "GroupQueryProcessor assumes visibleto is not used by the index rewriter.");
+  }
+
+  @Inject
+  protected GroupQueryProcessor(
+      Provider<CurrentUser> userProvider,
+      AccountLimits.Factory limitsFactory,
+      MetricMaker metricMaker,
+      IndexConfig indexConfig,
+      GroupIndexCollection indexes,
+      GroupIndexRewriter rewriter,
+      GroupControl.GenericFactory groupControlFactory) {
+    super(
+        metricMaker,
+        GroupSchemaDefinitions.INSTANCE,
+        indexConfig,
+        indexes,
+        rewriter,
+        FIELD_LIMIT,
+        () -> limitsFactory.create(userProvider.get()).getQueryLimit());
+    this.userProvider = userProvider;
+    this.groupControlFactory = groupControlFactory;
+  }
+
+  @Override
+  protected Predicate<InternalGroup> enforceVisibility(Predicate<InternalGroup> pred) {
+    return new AndSource<>(
+        pred, new GroupIsVisibleToPredicate(groupControlFactory, userProvider.get()), start);
+  }
+
+  @Override
+  protected String formatForLogging(InternalGroup internalGroup) {
+    return internalGroup.getGroupUUID().get();
+  }
+}
diff --git a/java/com/google/gerrit/server/query/group/InternalGroupQuery.java b/java/com/google/gerrit/server/query/group/InternalGroupQuery.java
new file mode 100644
index 0000000..d9808f2
--- /dev/null
+++ b/java/com/google/gerrit/server/query/group/InternalGroupQuery.java
@@ -0,0 +1,81 @@
+// Copyright (C) 2017 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.google.gerrit.server.query.group;
+
+import static com.google.common.collect.ImmutableList.toImmutableList;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.index.IndexConfig;
+import com.google.gerrit.index.query.InternalQuery;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.index.group.GroupIndexCollection;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * Query wrapper for the group index.
+ *
+ * <p>Instances are one-time-use. Other singleton classes should inject a Provider rather than
+ * holding on to a single instance.
+ */
+public class InternalGroupQuery extends InternalQuery<InternalGroup> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  @Inject
+  InternalGroupQuery(
+      GroupQueryProcessor queryProcessor, GroupIndexCollection indexes, IndexConfig indexConfig) {
+    super(queryProcessor, indexes, indexConfig);
+  }
+
+  public Optional<InternalGroup> byName(AccountGroup.NameKey groupName) throws OrmException {
+    return getOnlyGroup(GroupPredicates.name(groupName.get()), "group name '" + groupName + "'");
+  }
+
+  public Optional<InternalGroup> byId(AccountGroup.Id groupId) throws OrmException {
+    return getOnlyGroup(GroupPredicates.id(groupId), "group id '" + groupId + "'");
+  }
+
+  public List<InternalGroup> byMember(Account.Id memberId) throws OrmException {
+    return query(GroupPredicates.member(memberId));
+  }
+
+  public List<InternalGroup> bySubgroup(AccountGroup.UUID subgroupId) throws OrmException {
+    return query(GroupPredicates.subgroup(subgroupId));
+  }
+
+  private Optional<InternalGroup> getOnlyGroup(
+      Predicate<InternalGroup> predicate, String groupDescription) throws OrmException {
+    List<InternalGroup> groups = query(predicate);
+    if (groups.isEmpty()) {
+      return Optional.empty();
+    }
+
+    if (groups.size() == 1) {
+      return Optional.of(Iterables.getOnlyElement(groups));
+    }
+
+    ImmutableList<AccountGroup.UUID> groupUuids =
+        groups.stream().map(InternalGroup::getGroupUUID).collect(toImmutableList());
+    logger.atWarning().log("Ambiguous %s for groups %s.", groupDescription, groupUuids);
+    return Optional.empty();
+  }
+}
diff --git a/java/com/google/gerrit/server/query/project/ProjectIsVisibleToPredicate.java b/java/com/google/gerrit/server/query/project/ProjectIsVisibleToPredicate.java
new file mode 100644
index 0000000..b1c5af0
--- /dev/null
+++ b/java/com/google/gerrit/server/query/project/ProjectIsVisibleToPredicate.java
@@ -0,0 +1,61 @@
+// Copyright (C) 2017 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.google.gerrit.server.query.project;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.index.project.ProjectData;
+import com.google.gerrit.index.query.IsVisibleToPredicate;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.index.IndexUtils;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.query.account.AccountQueryBuilder;
+import com.google.gwtorm.server.OrmException;
+
+public class ProjectIsVisibleToPredicate extends IsVisibleToPredicate<ProjectData> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  protected final PermissionBackend permissionBackend;
+  protected final CurrentUser user;
+
+  public ProjectIsVisibleToPredicate(PermissionBackend permissionBackend, CurrentUser user) {
+    super(AccountQueryBuilder.FIELD_VISIBLETO, IndexUtils.describe(user));
+    this.permissionBackend = permissionBackend;
+    this.user = user;
+  }
+
+  @Override
+  public boolean match(ProjectData pd) throws OrmException {
+    if (!pd.getProject().getState().permitsRead()) {
+      logger.atFine().log("Filter out non-readable project: %s", pd);
+      return false;
+    }
+
+    boolean canSee =
+        permissionBackend
+            .user(user)
+            .project(pd.getProject().getNameKey())
+            .testOrFalse(ProjectPermission.ACCESS);
+    if (!canSee) {
+      logger.atFine().log("Filter out non-visible project: %s", pd);
+    }
+    return canSee;
+  }
+
+  @Override
+  public int getCost() {
+    return 1;
+  }
+}
diff --git a/java/com/google/gerrit/server/query/project/ProjectPredicates.java b/java/com/google/gerrit/server/query/project/ProjectPredicates.java
new file mode 100644
index 0000000..5f13236
--- /dev/null
+++ b/java/com/google/gerrit/server/query/project/ProjectPredicates.java
@@ -0,0 +1,47 @@
+// Copyright (C) 2017 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.google.gerrit.server.query.project;
+
+import com.google.gerrit.extensions.client.ProjectState;
+import com.google.gerrit.index.project.ProjectData;
+import com.google.gerrit.index.project.ProjectField;
+import com.google.gerrit.index.project.ProjectPredicate;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.reviewdb.client.Project;
+import java.util.Locale;
+
+public class ProjectPredicates {
+  public static Predicate<ProjectData> name(Project.NameKey nameKey) {
+    return new ProjectPredicate(ProjectField.NAME, nameKey.get());
+  }
+
+  public static Predicate<ProjectData> parent(Project.NameKey parentNameKey) {
+    return new ProjectPredicate(ProjectField.PARENT_NAME, parentNameKey.get());
+  }
+
+  public static Predicate<ProjectData> inname(String name) {
+    return new ProjectPredicate(ProjectField.NAME_PART, name.toLowerCase(Locale.US));
+  }
+
+  public static Predicate<ProjectData> description(String description) {
+    return new ProjectPredicate(ProjectField.DESCRIPTION, description);
+  }
+
+  public static Predicate<ProjectData> state(ProjectState state) {
+    return new ProjectPredicate(ProjectField.STATE, state.name());
+  }
+
+  private ProjectPredicates() {}
+}
diff --git a/java/com/google/gerrit/server/query/project/ProjectQueryBuilder.java b/java/com/google/gerrit/server/query/project/ProjectQueryBuilder.java
new file mode 100644
index 0000000..4923015
--- /dev/null
+++ b/java/com/google/gerrit/server/query/project/ProjectQueryBuilder.java
@@ -0,0 +1,106 @@
+// Copyright (C) 2017 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.google.gerrit.server.query.project;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+import com.google.common.primitives.Ints;
+import com.google.gerrit.extensions.client.ProjectState;
+import com.google.gerrit.index.project.ProjectData;
+import com.google.gerrit.index.query.LimitPredicate;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryBuilder;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.inject.Inject;
+import java.util.List;
+
+/** Parses a query string meant to be applied to project objects. */
+public class ProjectQueryBuilder extends QueryBuilder<ProjectData> {
+  public static final String FIELD_LIMIT = "limit";
+
+  private static final QueryBuilder.Definition<ProjectData, ProjectQueryBuilder> mydef =
+      new QueryBuilder.Definition<>(ProjectQueryBuilder.class);
+
+  @Inject
+  ProjectQueryBuilder() {
+    super(mydef);
+  }
+
+  @Operator
+  public Predicate<ProjectData> name(String name) {
+    return ProjectPredicates.name(new Project.NameKey(name));
+  }
+
+  @Operator
+  public Predicate<ProjectData> parent(String parentName) {
+    return ProjectPredicates.parent(new Project.NameKey(parentName));
+  }
+
+  @Operator
+  public Predicate<ProjectData> inname(String namePart) {
+    if (namePart.isEmpty()) {
+      return name(namePart);
+    }
+    return ProjectPredicates.inname(namePart);
+  }
+
+  @Operator
+  public Predicate<ProjectData> description(String description) throws QueryParseException {
+    if (Strings.isNullOrEmpty(description)) {
+      throw error("description operator requires a value");
+    }
+
+    return ProjectPredicates.description(description);
+  }
+
+  @Operator
+  public Predicate<ProjectData> state(String state) throws QueryParseException {
+    if (Strings.isNullOrEmpty(state)) {
+      throw error("state operator requires a value");
+    }
+    ProjectState parsedState;
+    try {
+      parsedState = ProjectState.valueOf(state.replace('-', '_').toUpperCase());
+    } catch (IllegalArgumentException e) {
+      throw error("state operator must be either 'active' or 'read-only'");
+    }
+    if (parsedState == ProjectState.HIDDEN) {
+      throw error("state operator must be either 'active' or 'read-only'");
+    }
+    return ProjectPredicates.state(parsedState);
+  }
+
+  @Override
+  protected Predicate<ProjectData> defaultField(String query) throws QueryParseException {
+    // Adapt the capacity of this list when adding more default predicates.
+    List<Predicate<ProjectData>> preds = Lists.newArrayListWithCapacity(3);
+    preds.add(name(query));
+    preds.add(inname(query));
+    if (!Strings.isNullOrEmpty(query)) {
+      preds.add(description(query));
+    }
+    return Predicate.or(preds);
+  }
+
+  @Operator
+  public Predicate<ProjectData> limit(String query) throws QueryParseException {
+    Integer limit = Ints.tryParse(query);
+    if (limit == null) {
+      throw error("Invalid limit: " + query);
+    }
+    return new LimitPredicate<>(FIELD_LIMIT, limit);
+  }
+}
diff --git a/java/com/google/gerrit/server/query/project/ProjectQueryProcessor.java b/java/com/google/gerrit/server/query/project/ProjectQueryProcessor.java
new file mode 100644
index 0000000..66eab7b
--- /dev/null
+++ b/java/com/google/gerrit/server/query/project/ProjectQueryProcessor.java
@@ -0,0 +1,84 @@
+// Copyright (C) 2017 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.google.gerrit.server.query.project;
+
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.gerrit.server.query.project.ProjectQueryBuilder.FIELD_LIMIT;
+
+import com.google.gerrit.index.IndexConfig;
+import com.google.gerrit.index.project.ProjectData;
+import com.google.gerrit.index.project.ProjectIndexCollection;
+import com.google.gerrit.index.project.ProjectIndexRewriter;
+import com.google.gerrit.index.project.ProjectSchemaDefinitions;
+import com.google.gerrit.index.query.AndSource;
+import com.google.gerrit.index.query.IndexPredicate;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryProcessor;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.AccountLimits;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+
+/**
+ * Query processor for the project index.
+ *
+ * <p>Instances are one-time-use. Other singleton classes should inject a Provider rather than
+ * holding on to a single instance.
+ */
+public class ProjectQueryProcessor extends QueryProcessor<ProjectData> {
+  private final PermissionBackend permissionBackend;
+  private final Provider<CurrentUser> userProvider;
+
+  static {
+    // It is assumed that basic rewrites do not touch visibleto predicates.
+    checkState(
+        !ProjectIsVisibleToPredicate.class.isAssignableFrom(IndexPredicate.class),
+        "ProjectQueryProcessor assumes visibleto is not used by the index rewriter.");
+  }
+
+  @Inject
+  protected ProjectQueryProcessor(
+      Provider<CurrentUser> userProvider,
+      AccountLimits.Factory limitsFactory,
+      MetricMaker metricMaker,
+      IndexConfig indexConfig,
+      ProjectIndexCollection indexes,
+      ProjectIndexRewriter rewriter,
+      PermissionBackend permissionBackend) {
+    super(
+        metricMaker,
+        ProjectSchemaDefinitions.INSTANCE,
+        indexConfig,
+        indexes,
+        rewriter,
+        FIELD_LIMIT,
+        () -> limitsFactory.create(userProvider.get()).getQueryLimit());
+    this.permissionBackend = permissionBackend;
+    this.userProvider = userProvider;
+  }
+
+  @Override
+  protected Predicate<ProjectData> enforceVisibility(Predicate<ProjectData> pred) {
+    return new AndSource<>(
+        pred, new ProjectIsVisibleToPredicate(permissionBackend, userProvider.get()), start);
+  }
+
+  @Override
+  protected String formatForLogging(ProjectData projectData) {
+    return projectData.getProject().getName();
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/BUILD b/java/com/google/gerrit/server/restapi/BUILD
new file mode 100644
index 0000000..1df431e
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/BUILD
@@ -0,0 +1,41 @@
+package(
+    default_visibility = ["//visibility:public"],
+)
+
+java_library(
+    name = "restapi",
+    srcs = glob(["**/*.java"]),
+    deps = [
+        "//java/com/google/gerrit/common:annotations",
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/index",
+        "//java/com/google/gerrit/index:query_exception",
+        "//java/com/google/gerrit/index/project",
+        "//java/com/google/gerrit/mail",
+        "//java/com/google/gerrit/metrics",
+        "//java/com/google/gerrit/prettify:server",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/server/ioutil",
+        "//java/com/google/gerrit/server/logging",
+        "//java/com/google/gerrit/server/util/time",
+        "//java/com/google/gerrit/util/cli",
+        "//java/org/eclipse/jgit:server",
+        "//lib:args4j",
+        "//lib:blame-cache",
+        "//lib:gson",
+        "//lib:guava",
+        "//lib:gwtorm",
+        "//lib:servlet-api-3_1",
+        "//lib/auto:auto-value",
+        "//lib/auto:auto-value-annotations",
+        "//lib/commons:codec",
+        "//lib/commons:compress",
+        "//lib/commons:lang",
+        "//lib/flogger:api",
+        "//lib/guice",
+        "//lib/guice:guice-assistedinject",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+    ],
+)
diff --git a/java/com/google/gerrit/server/restapi/RestApiModule.java b/java/com/google/gerrit/server/restapi/RestApiModule.java
new file mode 100644
index 0000000..dc2fe5f
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/RestApiModule.java
@@ -0,0 +1,33 @@
+// 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.
+
+package com.google.gerrit.server.restapi;
+
+import com.google.gerrit.server.plugins.PluginRestApiModule;
+import com.google.gerrit.server.restapi.config.RestCacheAdminModule;
+import com.google.inject.AbstractModule;
+
+public class RestApiModule extends AbstractModule {
+  @Override
+  protected void configure() {
+    install(new com.google.gerrit.server.restapi.access.Module());
+    install(new com.google.gerrit.server.restapi.account.Module());
+    install(new com.google.gerrit.server.restapi.change.Module());
+    install(new com.google.gerrit.server.restapi.config.Module());
+    install(new RestCacheAdminModule());
+    install(new com.google.gerrit.server.restapi.group.Module());
+    install(new PluginRestApiModule());
+    install(new com.google.gerrit.server.restapi.project.Module());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/access/AccessCollection.java b/java/com/google/gerrit/server/restapi/access/AccessCollection.java
new file mode 100644
index 0000000..8ae2ce7
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/access/AccessCollection.java
@@ -0,0 +1,53 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.access;
+
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestCollection;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@Singleton
+public class AccessCollection implements RestCollection<TopLevelResource, AccessResource> {
+  private final Provider<ListAccess> list;
+  private final DynamicMap<RestView<AccessResource>> views;
+
+  @Inject
+  public AccessCollection(Provider<ListAccess> list, DynamicMap<RestView<AccessResource>> views) {
+    this.list = list;
+    this.views = views;
+  }
+
+  @Override
+  public RestView<TopLevelResource> list() {
+    return list.get();
+  }
+
+  @Override
+  public AccessResource parse(TopLevelResource parent, IdString id)
+      throws ResourceNotFoundException {
+    throw new ResourceNotFoundException(id);
+  }
+
+  @Override
+  public DynamicMap<RestView<AccessResource>> views() {
+    return views;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/access/AccessResource.java b/java/com/google/gerrit/server/restapi/access/AccessResource.java
new file mode 100644
index 0000000..915165b
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/access/AccessResource.java
@@ -0,0 +1,24 @@
+// Copyright (C) 2017 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.google.gerrit.server.restapi.access;
+
+import com.google.gerrit.extensions.restapi.RestResource;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.inject.TypeLiteral;
+
+public class AccessResource implements RestResource {
+  public static final TypeLiteral<RestView<AccessResource>> ACCESS_KIND =
+      new TypeLiteral<RestView<AccessResource>>() {};
+}
diff --git a/java/com/google/gerrit/server/restapi/access/ListAccess.java b/java/com/google/gerrit/server/restapi/access/ListAccess.java
new file mode 100644
index 0000000..3f01c6c
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/access/ListAccess.java
@@ -0,0 +1,60 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.access;
+
+import com.google.gerrit.extensions.api.access.ProjectAccessInfo;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.restapi.project.GetAccess;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import org.kohsuke.args4j.Option;
+
+public class ListAccess implements RestReadView<TopLevelResource> {
+
+  @Option(
+      name = "--project",
+      aliases = {"-p"},
+      metaVar = "PROJECT",
+      usage = "projects for which the access rights should be returned")
+  private List<String> projects = new ArrayList<>();
+
+  private final GetAccess getAccess;
+
+  @Inject
+  public ListAccess(GetAccess getAccess) {
+    this.getAccess = getAccess;
+  }
+
+  @Override
+  public Map<String, ProjectAccessInfo> apply(TopLevelResource resource)
+      throws ResourceNotFoundException, ResourceConflictException, IOException,
+          PermissionBackendException, OrmException {
+    Map<String, ProjectAccessInfo> access = new TreeMap<>();
+    for (String p : projects) {
+      access.put(p, getAccess.apply(new Project.NameKey(p)));
+    }
+    return access;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/access/Module.java b/java/com/google/gerrit/server/restapi/access/Module.java
new file mode 100644
index 0000000..7da2e26b
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/access/Module.java
@@ -0,0 +1,29 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.access;
+
+import static com.google.gerrit.server.restapi.access.AccessResource.ACCESS_KIND;
+
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.RestApiModule;
+
+public class Module extends RestApiModule {
+  @Override
+  protected void configure() {
+    bind(AccessCollection.class);
+
+    DynamicMap.mapOf(binder(), ACCESS_KIND);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/AccountsCollection.java b/java/com/google/gerrit/server/restapi/account/AccountsCollection.java
new file mode 100644
index 0000000..c301ab2
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/AccountsCollection.java
@@ -0,0 +1,75 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.account;
+
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestCollection;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountControl;
+import com.google.gerrit.server.account.AccountResolver;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class AccountsCollection implements RestCollection<TopLevelResource, AccountResource> {
+  private final AccountResolver accountResolver;
+  private final AccountControl.Factory accountControlFactory;
+  private final Provider<QueryAccounts> list;
+  private final DynamicMap<RestView<AccountResource>> views;
+
+  @Inject
+  public AccountsCollection(
+      AccountResolver accountResolver,
+      AccountControl.Factory accountControlFactory,
+      Provider<QueryAccounts> list,
+      DynamicMap<RestView<AccountResource>> views) {
+    this.accountResolver = accountResolver;
+    this.accountControlFactory = accountControlFactory;
+    this.list = list;
+    this.views = views;
+  }
+
+  @Override
+  public AccountResource parse(TopLevelResource root, IdString id)
+      throws ResourceNotFoundException, AuthException, OrmException, IOException,
+          ConfigInvalidException {
+    IdentifiedUser user = accountResolver.parseId(id.get());
+    if (user == null || !accountControlFactory.get().canSee(user.getAccount())) {
+      throw new ResourceNotFoundException(
+          String.format("Account '%s' is not found or ambiguous", id));
+    }
+    return new AccountResource(user);
+  }
+
+  @Override
+  public RestView<TopLevelResource> list() throws ResourceNotFoundException {
+    return list.get();
+  }
+
+  @Override
+  public DynamicMap<RestView<AccountResource>> views() {
+    return views;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/AddSshKey.java b/java/com/google/gerrit/server/restapi/account/AddSshKey.java
new file mode 100644
index 0000000..4bdf52c
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/AddSshKey.java
@@ -0,0 +1,117 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.account;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.common.io.ByteSource;
+import com.google.gerrit.common.errors.EmailException;
+import com.google.gerrit.common.errors.InvalidSshKeyException;
+import com.google.gerrit.extensions.api.accounts.SshKeyInput;
+import com.google.gerrit.extensions.common.SshKeyInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.RawInput;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestCollectionModifyView;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.AccountSshKey;
+import com.google.gerrit.server.account.VersionedAuthorizedKeys;
+import com.google.gerrit.server.mail.send.AddKeySender;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.ssh.SshKeyCache;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.io.InputStream;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class AddSshKey
+    implements RestCollectionModifyView<AccountResource, AccountResource.SshKey, SshKeyInput> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final Provider<CurrentUser> self;
+  private final PermissionBackend permissionBackend;
+  private final VersionedAuthorizedKeys.Accessor authorizedKeys;
+  private final SshKeyCache sshKeyCache;
+  private final AddKeySender.Factory addKeyFactory;
+
+  @Inject
+  AddSshKey(
+      Provider<CurrentUser> self,
+      PermissionBackend permissionBackend,
+      VersionedAuthorizedKeys.Accessor authorizedKeys,
+      SshKeyCache sshKeyCache,
+      AddKeySender.Factory addKeyFactory) {
+    this.self = self;
+    this.permissionBackend = permissionBackend;
+    this.authorizedKeys = authorizedKeys;
+    this.sshKeyCache = sshKeyCache;
+    this.addKeyFactory = addKeyFactory;
+  }
+
+  @Override
+  public Response<SshKeyInfo> apply(AccountResource rsrc, SshKeyInput input)
+      throws AuthException, BadRequestException, OrmException, IOException, ConfigInvalidException,
+          PermissionBackendException {
+    if (!self.get().hasSameAccountId(rsrc.getUser())) {
+      permissionBackend.currentUser().check(GlobalPermission.ADMINISTRATE_SERVER);
+    }
+    return apply(rsrc.getUser(), input);
+  }
+
+  public Response<SshKeyInfo> apply(IdentifiedUser user, SshKeyInput input)
+      throws BadRequestException, IOException, ConfigInvalidException {
+    if (input == null) {
+      input = new SshKeyInput();
+    }
+    if (input.raw == null) {
+      throw new BadRequestException("SSH public key missing");
+    }
+
+    final RawInput rawKey = input.raw;
+    String sshPublicKey =
+        new ByteSource() {
+          @Override
+          public InputStream openStream() throws IOException {
+            return rawKey.getInputStream();
+          }
+        }.asCharSource(UTF_8).read();
+
+    try {
+      AccountSshKey sshKey = authorizedKeys.addKey(user.getAccountId(), sshPublicKey);
+
+      try {
+        addKeyFactory.create(user, sshKey).send();
+      } catch (EmailException e) {
+        logger.atSevere().withCause(e).log(
+            "Cannot send SSH key added message to %s", user.getAccount().getPreferredEmail());
+      }
+
+      user.getUserName().ifPresent(sshKeyCache::evict);
+      return Response.<SshKeyInfo>created(GetSshKeys.newSshKeyInfo(sshKey));
+    } catch (InvalidSshKeyException e) {
+      throw new BadRequestException(e.getMessage());
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/Capabilities.java b/java/com/google/gerrit/server/restapi/account/Capabilities.java
new file mode 100644
index 0000000..07b1214
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/Capabilities.java
@@ -0,0 +1,106 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.account;
+
+import static com.google.gerrit.server.permissions.DefaultPermissionMappings.globalOrPluginPermissionName;
+import static com.google.gerrit.server.permissions.DefaultPermissionMappings.globalPermission;
+
+import com.google.gerrit.extensions.api.access.GlobalOrPluginPermission;
+import com.google.gerrit.extensions.api.access.PluginPermission;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ChildCollection;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.AccountResource.Capability;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.Optional;
+
+@Singleton
+public class Capabilities implements ChildCollection<AccountResource, AccountResource.Capability> {
+  private final Provider<CurrentUser> self;
+  private final PermissionBackend permissionBackend;
+  private final DynamicMap<RestView<AccountResource.Capability>> views;
+  private final Provider<GetCapabilities> get;
+
+  @Inject
+  Capabilities(
+      Provider<CurrentUser> self,
+      PermissionBackend permissionBackend,
+      DynamicMap<RestView<AccountResource.Capability>> views,
+      Provider<GetCapabilities> get) {
+    this.self = self;
+    this.permissionBackend = permissionBackend;
+    this.views = views;
+    this.get = get;
+  }
+
+  @Override
+  public GetCapabilities list() throws ResourceNotFoundException {
+    return get.get();
+  }
+
+  @Override
+  public Capability parse(AccountResource parent, IdString id)
+      throws ResourceNotFoundException, AuthException, PermissionBackendException {
+    permissionBackend.checkUsesDefaultCapabilities();
+    IdentifiedUser target = parent.getUser();
+    if (!self.get().hasSameAccountId(target)) {
+      permissionBackend.currentUser().check(GlobalPermission.ADMINISTRATE_SERVER);
+    }
+
+    GlobalOrPluginPermission perm = parse(id);
+    try {
+      permissionBackend.absentUser(target.getAccountId()).check(perm);
+      return new AccountResource.Capability(target, globalOrPluginPermissionName(perm));
+    } catch (AuthException e) {
+      throw new ResourceNotFoundException(id);
+    }
+  }
+
+  private GlobalOrPluginPermission parse(IdString id) throws ResourceNotFoundException {
+    String name = id.get();
+    Optional<GlobalPermission> perm = globalPermission(name);
+    if (perm.isPresent()) {
+      return perm.get();
+    }
+
+    int dash = name.lastIndexOf('-');
+    if (dash < 0) {
+      throw new ResourceNotFoundException(id);
+    }
+
+    String pluginName = name.substring(0, dash);
+    String capability = name.substring(dash + 1);
+    if (pluginName.isEmpty() || capability.isEmpty()) {
+      throw new ResourceNotFoundException(id);
+    }
+    return new PluginPermission(pluginName, capability);
+  }
+
+  @Override
+  public DynamicMap<RestView<Capability>> views() {
+    return views;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/CreateAccount.java b/java/com/google/gerrit/server/restapi/account/CreateAccount.java
new file mode 100644
index 0000000..4185f36
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/CreateAccount.java
@@ -0,0 +1,201 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.account;
+
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_MAILTO;
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_USERNAME;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.common.errors.InvalidSshKeyException;
+import com.google.gerrit.common.errors.NoSuchGroupException;
+import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.extensions.api.accounts.AccountInput;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestCollectionCreateView;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.Sequences;
+import com.google.gerrit.server.UserInitiated;
+import com.google.gerrit.server.account.AccountExternalIdCreator;
+import com.google.gerrit.server.account.AccountLoader;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.AccountsUpdate;
+import com.google.gerrit.server.account.VersionedAuthorizedKeys;
+import com.google.gerrit.server.account.externalids.DuplicateExternalIdKeyException;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.group.GroupResolver;
+import com.google.gerrit.server.group.db.GroupsUpdate;
+import com.google.gerrit.server.group.db.InternalGroupUpdate;
+import com.google.gerrit.server.mail.send.OutgoingEmailValidator;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.ssh.SshKeyCache;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@RequiresCapability(GlobalCapability.CREATE_ACCOUNT)
+@Singleton
+public class CreateAccount
+    implements RestCollectionCreateView<TopLevelResource, AccountResource, AccountInput> {
+  private final Sequences seq;
+  private final GroupResolver groupResolver;
+  private final VersionedAuthorizedKeys.Accessor authorizedKeys;
+  private final SshKeyCache sshKeyCache;
+  private final Provider<AccountsUpdate> accountsUpdateProvider;
+  private final AccountLoader.Factory infoLoader;
+  private final DynamicSet<AccountExternalIdCreator> externalIdCreators;
+  private final Provider<GroupsUpdate> groupsUpdate;
+  private final OutgoingEmailValidator validator;
+
+  @Inject
+  CreateAccount(
+      Sequences seq,
+      GroupResolver groupResolver,
+      VersionedAuthorizedKeys.Accessor authorizedKeys,
+      SshKeyCache sshKeyCache,
+      @UserInitiated Provider<AccountsUpdate> accountsUpdateProvider,
+      AccountLoader.Factory infoLoader,
+      DynamicSet<AccountExternalIdCreator> externalIdCreators,
+      @UserInitiated Provider<GroupsUpdate> groupsUpdate,
+      OutgoingEmailValidator validator) {
+    this.seq = seq;
+    this.groupResolver = groupResolver;
+    this.authorizedKeys = authorizedKeys;
+    this.sshKeyCache = sshKeyCache;
+    this.accountsUpdateProvider = accountsUpdateProvider;
+    this.infoLoader = infoLoader;
+    this.externalIdCreators = externalIdCreators;
+    this.groupsUpdate = groupsUpdate;
+    this.validator = validator;
+  }
+
+  @Override
+  public Response<AccountInfo> apply(
+      TopLevelResource rsrc, IdString id, @Nullable AccountInput input)
+      throws BadRequestException, ResourceConflictException, UnprocessableEntityException,
+          OrmException, IOException, ConfigInvalidException, PermissionBackendException {
+    return apply(id, input != null ? input : new AccountInput());
+  }
+
+  public Response<AccountInfo> apply(IdString id, AccountInput input)
+      throws BadRequestException, ResourceConflictException, UnprocessableEntityException,
+          OrmException, IOException, ConfigInvalidException, PermissionBackendException {
+    String username = id.get();
+    if (input.username != null && !username.equals(input.username)) {
+      throw new BadRequestException("username must match URL");
+    }
+    if (!ExternalId.isValidUsername(username)) {
+      throw new BadRequestException("Invalid username '" + username + "'");
+    }
+
+    Set<AccountGroup.UUID> groups = parseGroups(input.groups);
+
+    Account.Id accountId = new Account.Id(seq.nextAccountId());
+    List<ExternalId> extIds = new ArrayList<>();
+
+    if (input.email != null) {
+      if (!validator.isValid(input.email)) {
+        throw new BadRequestException("invalid email address");
+      }
+      extIds.add(ExternalId.createEmail(accountId, input.email));
+    }
+
+    extIds.add(ExternalId.createUsername(username, accountId, input.httpPassword));
+    for (AccountExternalIdCreator c : externalIdCreators) {
+      extIds.addAll(c.create(accountId, username, input.email));
+    }
+
+    try {
+      accountsUpdateProvider
+          .get()
+          .insert(
+              "Create Account via API",
+              accountId,
+              u -> u.setFullName(input.name).setPreferredEmail(input.email).addExternalIds(extIds));
+    } catch (DuplicateExternalIdKeyException e) {
+      if (e.getDuplicateKey().isScheme(SCHEME_USERNAME)) {
+        throw new ResourceConflictException(
+            "username '" + e.getDuplicateKey().id() + "' already exists");
+      } else if (e.getDuplicateKey().isScheme(SCHEME_MAILTO)) {
+        throw new UnprocessableEntityException(
+            "email '" + e.getDuplicateKey().id() + "' already exists");
+      } else {
+        // AccountExternalIdCreator returned an external ID that already exists
+        throw e;
+      }
+    }
+
+    for (AccountGroup.UUID groupUuid : groups) {
+      try {
+        addGroupMember(groupUuid, accountId);
+      } catch (NoSuchGroupException e) {
+        throw new UnprocessableEntityException(String.format("Group %s not found", groupUuid));
+      }
+    }
+
+    if (input.sshKey != null) {
+      try {
+        authorizedKeys.addKey(accountId, input.sshKey);
+        sshKeyCache.evict(username);
+      } catch (InvalidSshKeyException e) {
+        throw new BadRequestException(e.getMessage());
+      }
+    }
+
+    AccountLoader loader = infoLoader.create(true);
+    AccountInfo info = loader.get(accountId);
+    loader.fill();
+    return Response.created(info);
+  }
+
+  private Set<AccountGroup.UUID> parseGroups(List<String> groups)
+      throws UnprocessableEntityException {
+    Set<AccountGroup.UUID> groupUuids = new HashSet<>();
+    if (groups != null) {
+      for (String g : groups) {
+        GroupDescription.Internal internalGroup = groupResolver.parseInternal(g);
+        groupUuids.add(internalGroup.getGroupUUID());
+      }
+    }
+    return groupUuids;
+  }
+
+  private void addGroupMember(AccountGroup.UUID groupUuid, Account.Id accountId)
+      throws OrmException, IOException, NoSuchGroupException, ConfigInvalidException {
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder()
+            .setMemberModification(memberIds -> Sets.union(memberIds, ImmutableSet.of(accountId)))
+            .build();
+    groupsUpdate.get().updateGroup(groupUuid, groupUpdate);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/CreateEmail.java b/java/com/google/gerrit/server/restapi/account/CreateEmail.java
new file mode 100644
index 0000000..e4e8525
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/CreateEmail.java
@@ -0,0 +1,152 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.account;
+
+import static com.google.gerrit.extensions.client.AuthType.DEVELOPMENT_BECOME_ANY_ACCOUNT;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.errors.EmailException;
+import com.google.gerrit.extensions.api.accounts.EmailInput;
+import com.google.gerrit.extensions.client.AccountFieldName;
+import com.google.gerrit.extensions.common.EmailInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestCollectionCreateView;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountException;
+import com.google.gerrit.server.account.AccountManager;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.AuthRequest;
+import com.google.gerrit.server.account.Realm;
+import com.google.gerrit.server.config.AuthConfig;
+import com.google.gerrit.server.mail.send.OutgoingEmailValidator;
+import com.google.gerrit.server.mail.send.RegisterNewEmailSender;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class CreateEmail
+    implements RestCollectionCreateView<AccountResource, AccountResource.Email, EmailInput> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final Provider<CurrentUser> self;
+  private final Realm realm;
+  private final PermissionBackend permissionBackend;
+  private final AccountManager accountManager;
+  private final RegisterNewEmailSender.Factory registerNewEmailFactory;
+  private final PutPreferred putPreferred;
+  private final OutgoingEmailValidator validator;
+  private final boolean isDevMode;
+
+  @Inject
+  CreateEmail(
+      Provider<CurrentUser> self,
+      Realm realm,
+      PermissionBackend permissionBackend,
+      AuthConfig authConfig,
+      AccountManager accountManager,
+      RegisterNewEmailSender.Factory registerNewEmailFactory,
+      PutPreferred putPreferred,
+      OutgoingEmailValidator validator) {
+    this.self = self;
+    this.realm = realm;
+    this.permissionBackend = permissionBackend;
+    this.accountManager = accountManager;
+    this.registerNewEmailFactory = registerNewEmailFactory;
+    this.putPreferred = putPreferred;
+    this.validator = validator;
+    this.isDevMode = authConfig.getAuthType() == DEVELOPMENT_BECOME_ANY_ACCOUNT;
+  }
+
+  @Override
+  public Response<EmailInfo> apply(AccountResource rsrc, IdString id, EmailInput input)
+      throws RestApiException, OrmException, EmailException, MethodNotAllowedException, IOException,
+          ConfigInvalidException, PermissionBackendException {
+    if (input == null) {
+      input = new EmailInput();
+    }
+
+    if (!self.get().hasSameAccountId(rsrc.getUser()) || input.noConfirmation) {
+      permissionBackend.currentUser().check(GlobalPermission.MODIFY_ACCOUNT);
+    }
+
+    if (!realm.allowsEdit(AccountFieldName.REGISTER_NEW_EMAIL)) {
+      throw new MethodNotAllowedException("realm does not allow adding emails");
+    }
+
+    return apply(rsrc.getUser(), id, input);
+  }
+
+  /** To be used from plugins that want to create emails without permission checks. */
+  public Response<EmailInfo> apply(IdentifiedUser user, IdString id, EmailInput input)
+      throws RestApiException, OrmException, EmailException, MethodNotAllowedException, IOException,
+          ConfigInvalidException, PermissionBackendException {
+    String email = id.get().trim();
+
+    if (input == null) {
+      input = new EmailInput();
+    }
+
+    if (input.email != null && !email.equals(input.email)) {
+      throw new BadRequestException("email address must match URL");
+    }
+
+    if (!validator.isValid(email)) {
+      throw new BadRequestException("invalid email address");
+    }
+
+    EmailInfo info = new EmailInfo();
+    info.email = email;
+    if (input.noConfirmation || isDevMode) {
+      if (isDevMode) {
+        logger.atWarning().log("skipping email validation in developer mode");
+      }
+      try {
+        accountManager.link(user.getAccountId(), AuthRequest.forEmail(email));
+      } catch (AccountException e) {
+        throw new ResourceConflictException(e.getMessage());
+      }
+      if (input.preferred) {
+        putPreferred.apply(new AccountResource.Email(user, email), null);
+        info.preferred = true;
+      }
+    } else {
+      try {
+        RegisterNewEmailSender sender = registerNewEmailFactory.create(email);
+        if (!sender.isAllowed()) {
+          throw new MethodNotAllowedException("Not allowed to add email address " + email);
+        }
+        sender.send();
+        info.pendingConfirmation = true;
+      } catch (EmailException | RuntimeException e) {
+        logger.atSevere().withCause(e).log("Cannot send email verification message to %s", email);
+        throw e;
+      }
+    }
+    return Response.created(info);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/DeleteActive.java b/java/com/google/gerrit/server/restapi/account/DeleteActive.java
new file mode 100644
index 0000000..4302513
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/DeleteActive.java
@@ -0,0 +1,55 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.account;
+
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.SetInactiveFlag;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@RequiresCapability(GlobalCapability.MODIFY_ACCOUNT)
+@Singleton
+public class DeleteActive implements RestModifyView<AccountResource, Input> {
+
+  private final Provider<IdentifiedUser> self;
+  private final SetInactiveFlag setInactiveFlag;
+
+  @Inject
+  DeleteActive(SetInactiveFlag setInactiveFlag, Provider<IdentifiedUser> self) {
+    this.setInactiveFlag = setInactiveFlag;
+    this.self = self;
+  }
+
+  @Override
+  public Response<?> apply(AccountResource rsrc, Input input)
+      throws RestApiException, OrmException, IOException, ConfigInvalidException {
+    if (self.get().hasSameAccountId(rsrc.getUser())) {
+      throw new ResourceConflictException("cannot deactivate own account");
+    }
+    return setInactiveFlag.deactivate(rsrc.getUser().getAccountId());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/DeleteDraftComments.java b/java/com/google/gerrit/server/restapi/account/DeleteDraftComments.java
new file mode 100644
index 0000000..108ee0e
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/DeleteDraftComments.java
@@ -0,0 +1,211 @@
+// 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.
+
+package com.google.gerrit.server.restapi.account;
+
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static com.google.gerrit.server.CommentsUtil.setCommentRevId;
+
+import com.google.common.base.CharMatcher;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.api.accounts.DeleteDraftCommentsInput;
+import com.google.gerrit.extensions.api.accounts.DeletedDraftCommentInfo;
+import com.google.gerrit.extensions.client.ListChangesOption;
+import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Account.Id;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.change.ChangeJson;
+import com.google.gerrit.server.patch.PatchListCache;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.ChangeQueryBuilder;
+import com.google.gerrit.server.query.change.HasDraftByPredicate;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gerrit.server.restapi.change.CommentJson;
+import com.google.gerrit.server.restapi.change.CommentJson.CommentFormatter;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.BatchUpdate.Factory;
+import com.google.gerrit.server.update.BatchUpdateListener;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+@Singleton
+public class DeleteDraftComments
+    implements RestModifyView<AccountResource, DeleteDraftCommentsInput> {
+
+  private final Provider<ReviewDb> db;
+  private final Provider<CurrentUser> userProvider;
+  private final BatchUpdate.Factory batchUpdateFactory;
+  private final Provider<ChangeQueryBuilder> queryBuilderProvider;
+  private final Provider<InternalChangeQuery> queryProvider;
+  private final ChangeData.Factory changeDataFactory;
+  private final ChangeJson.Factory changeJsonFactory;
+  private final Provider<CommentJson> commentJsonProvider;
+  private final CommentsUtil commentsUtil;
+  private final PatchSetUtil psUtil;
+  private final PatchListCache patchListCache;
+
+  @Inject
+  DeleteDraftComments(
+      Provider<ReviewDb> db,
+      Provider<CurrentUser> userProvider,
+      Factory batchUpdateFactory,
+      Provider<ChangeQueryBuilder> queryBuilderProvider,
+      Provider<InternalChangeQuery> queryProvider,
+      ChangeData.Factory changeDataFactory,
+      ChangeJson.Factory changeJsonFactory,
+      Provider<CommentJson> commentJsonProvider,
+      CommentsUtil commentsUtil,
+      PatchSetUtil psUtil,
+      PatchListCache patchListCache) {
+    this.db = db;
+    this.userProvider = userProvider;
+    this.batchUpdateFactory = batchUpdateFactory;
+    this.queryBuilderProvider = queryBuilderProvider;
+    this.queryProvider = queryProvider;
+    this.changeDataFactory = changeDataFactory;
+    this.changeJsonFactory = changeJsonFactory;
+    this.commentJsonProvider = commentJsonProvider;
+    this.commentsUtil = commentsUtil;
+    this.psUtil = psUtil;
+    this.patchListCache = patchListCache;
+  }
+
+  @Override
+  public ImmutableList<DeletedDraftCommentInfo> apply(
+      AccountResource rsrc, DeleteDraftCommentsInput input)
+      throws RestApiException, OrmException, UpdateException {
+    CurrentUser user = userProvider.get();
+    if (!user.isIdentifiedUser()) {
+      throw new AuthException("Authentication required");
+    }
+    if (!rsrc.getUser().hasSameAccountId(user)) {
+      // Disallow even for admins or users with Modify Account. Drafts are not like preferences or
+      // other account info; there is no way even for admins to read or delete another user's drafts
+      // using the normal draft endpoints under the change resource, so disallow it here as well.
+      // (Admins may still call this endpoint with impersonation, but in that case it would pass the
+      // hasSameAccountId check.)
+      throw new AuthException("Cannot delete drafts of other user");
+    }
+
+    CommentFormatter commentFormatter = commentJsonProvider.get().newCommentFormatter();
+    Account.Id accountId = rsrc.getUser().getAccountId();
+    Timestamp now = TimeUtil.nowTs();
+    Map<Project.NameKey, BatchUpdate> updates = new LinkedHashMap<>();
+    List<Op> ops = new ArrayList<>();
+    for (ChangeData cd :
+        queryProvider
+            .get()
+            // Don't attempt to mutate any changes the user can't currently see.
+            .enforceVisibility(true)
+            .query(predicate(accountId, input))) {
+      BatchUpdate update =
+          updates.computeIfAbsent(
+              cd.project(), p -> batchUpdateFactory.create(db.get(), p, rsrc.getUser(), now));
+      Op op = new Op(commentFormatter, accountId);
+      update.addOp(cd.getId(), op);
+      ops.add(op);
+    }
+
+    // Currently there's no way to let some updates succeed even if others fail. Even if there were,
+    // all updates from this operation only happen in All-Users and thus are fully atomic, so
+    // allowing partial failure would have little value.
+    batchUpdateFactory.execute(updates.values(), BatchUpdateListener.NONE, false);
+
+    return ops.stream().map(Op::getResult).filter(Objects::nonNull).collect(toImmutableList());
+  }
+
+  private Predicate<ChangeData> predicate(Account.Id accountId, DeleteDraftCommentsInput input)
+      throws BadRequestException {
+    Predicate<ChangeData> hasDraft = new HasDraftByPredicate(accountId);
+    if (CharMatcher.whitespace().trimFrom(Strings.nullToEmpty(input.query)).isEmpty()) {
+      return hasDraft;
+    }
+    try {
+      return Predicate.and(hasDraft, queryBuilderProvider.get().parse(input.query));
+    } catch (QueryParseException e) {
+      throw new BadRequestException("Invalid query: " + e.getMessage(), e);
+    }
+  }
+
+  private class Op implements BatchUpdateOp {
+    private final CommentFormatter commentFormatter;
+    private final Account.Id accountId;
+    private DeletedDraftCommentInfo result;
+
+    Op(CommentFormatter commentFormatter, Id accountId) {
+      this.commentFormatter = commentFormatter;
+      this.accountId = accountId;
+    }
+
+    @Override
+    public boolean updateChange(ChangeContext ctx)
+        throws OrmException, PatchListNotAvailableException, PermissionBackendException {
+      ImmutableList.Builder<CommentInfo> comments = ImmutableList.builder();
+      boolean dirty = false;
+      for (Comment c : commentsUtil.draftByChangeAuthor(ctx.getDb(), ctx.getNotes(), accountId)) {
+        dirty = true;
+        PatchSet.Id psId = new PatchSet.Id(ctx.getChange().getId(), c.key.patchSetId);
+        setCommentRevId(
+            c, patchListCache, ctx.getChange(), psUtil.get(ctx.getDb(), ctx.getNotes(), psId));
+        commentsUtil.deleteComments(ctx.getDb(), ctx.getUpdate(psId), Collections.singleton(c));
+        comments.add(commentFormatter.format(c));
+      }
+      if (dirty) {
+        result = new DeletedDraftCommentInfo();
+        result.change =
+            changeJsonFactory
+                .create(ListChangesOption.SKIP_MERGEABLE)
+                .format(changeDataFactory.create(ctx.getDb(), ctx.getNotes()));
+        result.deleted = comments.build();
+      }
+      return dirty;
+    }
+
+    @Nullable
+    DeletedDraftCommentInfo getResult() {
+      return result;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/DeleteEmail.java b/java/com/google/gerrit/server/restapi/account/DeleteEmail.java
new file mode 100644
index 0000000..6bacde2
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/DeleteEmail.java
@@ -0,0 +1,103 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.account;
+
+import static java.util.stream.Collectors.toSet;
+
+import com.google.gerrit.extensions.client.AccountFieldName;
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountException;
+import com.google.gerrit.server.account.AccountManager;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.Realm;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.account.externalids.ExternalIds;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class DeleteEmail implements RestModifyView<AccountResource.Email, Input> {
+
+  private final Provider<CurrentUser> self;
+  private final Realm realm;
+  private final PermissionBackend permissionBackend;
+  private final AccountManager accountManager;
+  private final ExternalIds externalIds;
+
+  @Inject
+  DeleteEmail(
+      Provider<CurrentUser> self,
+      Realm realm,
+      PermissionBackend permissionBackend,
+      AccountManager accountManager,
+      ExternalIds externalIds) {
+    this.self = self;
+    this.realm = realm;
+    this.permissionBackend = permissionBackend;
+    this.accountManager = accountManager;
+    this.externalIds = externalIds;
+  }
+
+  @Override
+  public Response<?> apply(AccountResource.Email rsrc, Input input)
+      throws AuthException, ResourceNotFoundException, ResourceConflictException,
+          MethodNotAllowedException, OrmException, IOException, ConfigInvalidException,
+          PermissionBackendException {
+    if (!self.get().hasSameAccountId(rsrc.getUser())) {
+      permissionBackend.currentUser().check(GlobalPermission.MODIFY_ACCOUNT);
+    }
+    return apply(rsrc.getUser(), rsrc.getEmail());
+  }
+
+  public Response<?> apply(IdentifiedUser user, String email)
+      throws ResourceNotFoundException, ResourceConflictException, MethodNotAllowedException,
+          OrmException, IOException, ConfigInvalidException {
+    if (!realm.allowsEdit(AccountFieldName.REGISTER_NEW_EMAIL)) {
+      throw new MethodNotAllowedException("realm does not allow deleting emails");
+    }
+
+    Set<ExternalId> extIds =
+        externalIds.byAccount(user.getAccountId()).stream()
+            .filter(e -> email.equals(e.email()))
+            .collect(toSet());
+    if (extIds.isEmpty()) {
+      throw new ResourceNotFoundException(email);
+    }
+
+    try {
+      accountManager.unlink(
+          user.getAccountId(), extIds.stream().map(ExternalId::key).collect(toSet()));
+    } catch (AccountException e) {
+      throw new ResourceConflictException(e.getMessage());
+    }
+    return Response.none();
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/DeleteExternalIds.java b/java/com/google/gerrit/server/restapi/account/DeleteExternalIds.java
new file mode 100644
index 0000000..9fb535c
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/DeleteExternalIds.java
@@ -0,0 +1,112 @@
+// Copyright (C) 2017 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.google.gerrit.server.restapi.account;
+
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_USERNAME;
+import static java.util.stream.Collectors.toMap;
+import static java.util.stream.Collectors.toSet;
+
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.AccountException;
+import com.google.gerrit.server.account.AccountManager;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.account.externalids.ExternalIds;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.function.Function;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class DeleteExternalIds implements RestModifyView<AccountResource, List<String>> {
+  private final PermissionBackend permissionBackend;
+  private final AccountManager accountManager;
+  private final ExternalIds externalIds;
+  private final Provider<CurrentUser> self;
+
+  @Inject
+  DeleteExternalIds(
+      PermissionBackend permissionBackend,
+      AccountManager accountManager,
+      ExternalIds externalIds,
+      Provider<CurrentUser> self) {
+    this.permissionBackend = permissionBackend;
+    this.accountManager = accountManager;
+    this.externalIds = externalIds;
+    this.self = self;
+  }
+
+  @Override
+  public Response<?> apply(AccountResource resource, List<String> extIds)
+      throws RestApiException, IOException, OrmException, ConfigInvalidException,
+          PermissionBackendException {
+    if (!self.get().hasSameAccountId(resource.getUser())) {
+      permissionBackend.currentUser().check(GlobalPermission.ACCESS_DATABASE);
+    }
+
+    if (extIds == null || extIds.size() == 0) {
+      throw new BadRequestException("external IDs are required");
+    }
+
+    Map<ExternalId.Key, ExternalId> externalIdMap =
+        externalIds.byAccount(resource.getUser().getAccountId()).stream()
+            .collect(toMap(ExternalId::key, Function.identity()));
+
+    List<ExternalId> toDelete = new ArrayList<>();
+    Optional<ExternalId.Key> last = resource.getUser().getLastLoginExternalIdKey();
+    for (String externalIdStr : extIds) {
+      ExternalId id = externalIdMap.get(ExternalId.Key.parse(externalIdStr));
+
+      if (id == null) {
+        throw new UnprocessableEntityException(
+            String.format("External id %s does not exist", externalIdStr));
+      }
+
+      if ((!id.isScheme(SCHEME_USERNAME))
+          && (!last.isPresent() || (!last.get().equals(id.key())))) {
+        toDelete.add(id);
+      } else {
+        throw new ResourceConflictException(
+            String.format("External id %s cannot be deleted", externalIdStr));
+      }
+    }
+
+    try {
+      accountManager.unlink(
+          resource.getUser().getAccountId(),
+          toDelete.stream().map(ExternalId::key).collect(toSet()));
+    } catch (AccountException e) {
+      throw new ResourceConflictException(e.getMessage());
+    }
+
+    return Response.none();
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/DeleteSshKey.java b/java/com/google/gerrit/server/restapi/account/DeleteSshKey.java
new file mode 100644
index 0000000..b7b3c83
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/DeleteSshKey.java
@@ -0,0 +1,69 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.account;
+
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.VersionedAuthorizedKeys;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.ssh.SshKeyCache;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+
+@Singleton
+public class DeleteSshKey implements RestModifyView<AccountResource.SshKey, Input> {
+
+  private final Provider<CurrentUser> self;
+  private final PermissionBackend permissionBackend;
+  private final VersionedAuthorizedKeys.Accessor authorizedKeys;
+  private final SshKeyCache sshKeyCache;
+
+  @Inject
+  DeleteSshKey(
+      Provider<CurrentUser> self,
+      PermissionBackend permissionBackend,
+      VersionedAuthorizedKeys.Accessor authorizedKeys,
+      SshKeyCache sshKeyCache) {
+    this.self = self;
+    this.permissionBackend = permissionBackend;
+    this.authorizedKeys = authorizedKeys;
+    this.sshKeyCache = sshKeyCache;
+  }
+
+  @Override
+  public Response<?> apply(AccountResource.SshKey rsrc, Input input)
+      throws AuthException, OrmException, RepositoryNotFoundException, IOException,
+          ConfigInvalidException, PermissionBackendException {
+    if (!self.get().hasSameAccountId(rsrc.getUser())) {
+      permissionBackend.currentUser().check(GlobalPermission.ADMINISTRATE_SERVER);
+    }
+
+    authorizedKeys.deleteKey(rsrc.getUser().getAccountId(), rsrc.getSshKey().seq());
+    rsrc.getUser().getUserName().ifPresent(sshKeyCache::evict);
+
+    return Response.none();
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/DeleteWatchedProjects.java b/java/com/google/gerrit/server/restapi/account/DeleteWatchedProjects.java
new file mode 100644
index 0000000..deb70fe
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/DeleteWatchedProjects.java
@@ -0,0 +1,85 @@
+// 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.
+
+package com.google.gerrit.server.restapi.account;
+
+import static java.util.stream.Collectors.toList;
+
+import com.google.gerrit.extensions.client.ProjectWatchInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.UserInitiated;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.AccountsUpdate;
+import com.google.gerrit.server.account.ProjectWatches.ProjectWatchKey;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.List;
+import java.util.Objects;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class DeleteWatchedProjects
+    implements RestModifyView<AccountResource, List<ProjectWatchInfo>> {
+  private final Provider<IdentifiedUser> self;
+  private final PermissionBackend permissionBackend;
+  private final Provider<AccountsUpdate> accountsUpdateProvider;
+
+  @Inject
+  DeleteWatchedProjects(
+      Provider<IdentifiedUser> self,
+      PermissionBackend permissionBackend,
+      @UserInitiated Provider<AccountsUpdate> accountsUpdateProvider) {
+    this.self = self;
+    this.permissionBackend = permissionBackend;
+    this.accountsUpdateProvider = accountsUpdateProvider;
+  }
+
+  @Override
+  public Response<?> apply(AccountResource rsrc, List<ProjectWatchInfo> input)
+      throws AuthException, UnprocessableEntityException, OrmException, IOException,
+          ConfigInvalidException, PermissionBackendException {
+    if (!self.get().hasSameAccountId(rsrc.getUser())) {
+      permissionBackend.currentUser().check(GlobalPermission.ADMINISTRATE_SERVER);
+    }
+    if (input == null) {
+      return Response.none();
+    }
+
+    Account.Id accountId = rsrc.getUser().getAccountId();
+    accountsUpdateProvider
+        .get()
+        .update(
+            "Delete Project Watches via API",
+            accountId,
+            u ->
+                u.deleteProjectWatches(
+                    input.stream()
+                        .filter(Objects::nonNull)
+                        .map(w -> ProjectWatchKey.create(new Project.NameKey(w.project), w.filter))
+                        .collect(toList())));
+    return Response.none();
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/EmailsCollection.java b/java/com/google/gerrit/server/restapi/account/EmailsCollection.java
new file mode 100644
index 0000000..434b9d6
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/EmailsCollection.java
@@ -0,0 +1,82 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.account;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ChildCollection;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.AccountResource.Email;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@Singleton
+public class EmailsCollection implements ChildCollection<AccountResource, AccountResource.Email> {
+  private final DynamicMap<RestView<AccountResource.Email>> views;
+  private final GetEmails list;
+  private final Provider<CurrentUser> self;
+  private final PermissionBackend permissionBackend;
+
+  @Inject
+  EmailsCollection(
+      DynamicMap<RestView<AccountResource.Email>> views,
+      GetEmails list,
+      Provider<CurrentUser> self,
+      PermissionBackend permissionBackend) {
+    this.views = views;
+    this.list = list;
+    this.self = self;
+    this.permissionBackend = permissionBackend;
+  }
+
+  @Override
+  public RestView<AccountResource> list() {
+    return list;
+  }
+
+  @Override
+  public AccountResource.Email parse(AccountResource rsrc, IdString id)
+      throws ResourceNotFoundException, PermissionBackendException, AuthException {
+    if (!self.get().hasSameAccountId(rsrc.getUser())) {
+      permissionBackend.currentUser().check(GlobalPermission.ADMINISTRATE_SERVER);
+    }
+
+    if ("preferred".equals(id.get())) {
+      String email = rsrc.getUser().getAccount().getPreferredEmail();
+      if (Strings.isNullOrEmpty(email)) {
+        throw new ResourceNotFoundException(id);
+      }
+      return new AccountResource.Email(rsrc.getUser(), email);
+    } else if (rsrc.getUser().hasEmailAddress(id.get())) {
+      return new AccountResource.Email(rsrc.getUser(), id.get());
+    } else {
+      throw new ResourceNotFoundException(id);
+    }
+  }
+
+  @Override
+  public DynamicMap<RestView<Email>> views() {
+    return views;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/GetAccount.java b/java/com/google/gerrit/server/restapi/account/GetAccount.java
new file mode 100644
index 0000000..6b73ae3b
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/GetAccount.java
@@ -0,0 +1,42 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.account;
+
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.account.AccountLoader;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GetAccount implements RestReadView<AccountResource> {
+  private final AccountLoader.Factory infoFactory;
+
+  @Inject
+  GetAccount(AccountLoader.Factory infoFactory) {
+    this.infoFactory = infoFactory;
+  }
+
+  @Override
+  public AccountInfo apply(AccountResource rsrc) throws OrmException, PermissionBackendException {
+    AccountLoader loader = infoFactory.create(true);
+    AccountInfo info = loader.get(rsrc.getUser().getAccountId());
+    loader.fill();
+    return info;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/GetActive.java b/java/com/google/gerrit/server/restapi/account/GetActive.java
new file mode 100644
index 0000000..66493f8
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/GetActive.java
@@ -0,0 +1,31 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.account;
+
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GetActive implements RestReadView<AccountResource> {
+  @Override
+  public Response<String> apply(AccountResource rsrc) {
+    if (rsrc.getUser().getAccount().isActive()) {
+      return Response.ok("ok");
+    }
+    return Response.none();
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/GetAgreements.java b/java/com/google/gerrit/server/restapi/account/GetAgreements.java
new file mode 100644
index 0000000..edcbc35
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/GetAgreements.java
@@ -0,0 +1,102 @@
+// 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.
+
+package com.google.gerrit.server.restapi.account;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.ContributorAgreement;
+import com.google.gerrit.common.data.PermissionRule;
+import com.google.gerrit.common.data.PermissionRule.Action;
+import com.google.gerrit.extensions.common.AgreementInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.restapi.config.AgreementJson;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.jgit.lib.Config;
+
+@Singleton
+public class GetAgreements implements RestReadView<AccountResource> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final Provider<CurrentUser> self;
+  private final ProjectCache projectCache;
+  private final AgreementJson agreementJson;
+  private final boolean agreementsEnabled;
+
+  @Inject
+  GetAgreements(
+      Provider<CurrentUser> self,
+      ProjectCache projectCache,
+      AgreementJson agreementJson,
+      @GerritServerConfig Config config) {
+    this.self = self;
+    this.projectCache = projectCache;
+    this.agreementJson = agreementJson;
+    this.agreementsEnabled = config.getBoolean("auth", "contributorAgreements", false);
+  }
+
+  @Override
+  public List<AgreementInfo> apply(AccountResource resource)
+      throws RestApiException, PermissionBackendException {
+    if (!agreementsEnabled) {
+      throw new MethodNotAllowedException("contributor agreements disabled");
+    }
+
+    if (!self.get().isIdentifiedUser()) {
+      throw new AuthException("not allowed to get contributor agreements");
+    }
+
+    IdentifiedUser user = self.get().asIdentifiedUser();
+    if (user != resource.getUser()) {
+      throw new AuthException("not allowed to get contributor agreements");
+    }
+
+    List<AgreementInfo> results = new ArrayList<>();
+    Collection<ContributorAgreement> cas =
+        projectCache.getAllProjects().getConfig().getContributorAgreements();
+    for (ContributorAgreement ca : cas) {
+      List<AccountGroup.UUID> groupIds = new ArrayList<>();
+      for (PermissionRule rule : ca.getAccepted()) {
+        if ((rule.getAction() == Action.ALLOW) && (rule.getGroup() != null)) {
+          if (rule.getGroup().getUUID() != null) {
+            groupIds.add(rule.getGroup().getUUID());
+          } else {
+            logger.atWarning().log(
+                "group \"%s\" does not exist, referenced in CLA \"%s\"",
+                rule.getGroup().getName(), ca.getName());
+          }
+        }
+      }
+
+      if (user.getEffectiveGroups().containsAnyOf(groupIds)) {
+        results.add(agreementJson.format(ca));
+      }
+    }
+    return results;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/GetAvatar.java b/java/com/google/gerrit/server/restapi/account/GetAvatar.java
new file mode 100644
index 0000000..3c1752d
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/GetAvatar.java
@@ -0,0 +1,60 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.account;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.extensions.restapi.CacheControl;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.avatar.AvatarProvider;
+import com.google.inject.Inject;
+import java.util.concurrent.TimeUnit;
+import org.kohsuke.args4j.Option;
+
+public class GetAvatar implements RestReadView<AccountResource> {
+  private final DynamicItem<AvatarProvider> avatarProvider;
+
+  private int size;
+
+  @Option(
+      name = "--size",
+      aliases = {"-s"},
+      usage = "recommended size in pixels, height and width")
+  public void setSize(int s) {
+    size = s;
+  }
+
+  @Inject
+  GetAvatar(DynamicItem<AvatarProvider> avatarProvider) {
+    this.avatarProvider = avatarProvider;
+  }
+
+  @Override
+  public Response.Redirect apply(AccountResource rsrc) throws ResourceNotFoundException {
+    AvatarProvider impl = avatarProvider.get();
+    if (impl == null) {
+      throw (new ResourceNotFoundException()).caching(CacheControl.PUBLIC(1, TimeUnit.DAYS));
+    }
+
+    String url = impl.getUrl(rsrc.getUser(), size);
+    if (Strings.isNullOrEmpty(url)) {
+      throw (new ResourceNotFoundException()).caching(CacheControl.PUBLIC(1, TimeUnit.HOURS));
+    }
+    return Response.redirect(url);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/GetAvatarChangeUrl.java b/java/com/google/gerrit/server/restapi/account/GetAvatarChangeUrl.java
new file mode 100644
index 0000000..904b15f
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/GetAvatarChangeUrl.java
@@ -0,0 +1,48 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.account;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.avatar.AvatarProvider;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GetAvatarChangeUrl implements RestReadView<AccountResource> {
+  private final DynamicItem<AvatarProvider> avatarProvider;
+
+  @Inject
+  GetAvatarChangeUrl(DynamicItem<AvatarProvider> avatarProvider) {
+    this.avatarProvider = avatarProvider;
+  }
+
+  @Override
+  public String apply(AccountResource rsrc) throws ResourceNotFoundException {
+    AvatarProvider impl = avatarProvider.get();
+    if (impl == null) {
+      throw new ResourceNotFoundException();
+    }
+
+    String url = impl.getChangeAvatarUrl(rsrc.getUser());
+    if (Strings.isNullOrEmpty(url)) {
+      throw new ResourceNotFoundException();
+    }
+    return url;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/GetCapabilities.java b/java/com/google/gerrit/server/restapi/account/GetCapabilities.java
new file mode 100644
index 0000000..7889f6e
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/GetCapabilities.java
@@ -0,0 +1,180 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.account;
+
+import static com.google.gerrit.common.data.GlobalCapability.PRIORITY;
+import static com.google.gerrit.server.permissions.DefaultPermissionMappings.globalOrPluginPermissionName;
+import static com.google.gerrit.server.permissions.DefaultPermissionMappings.globalPermissionName;
+import static com.google.gerrit.server.permissions.DefaultPermissionMappings.pluginPermissionName;
+
+import com.google.common.collect.Iterables;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.common.data.PermissionRange;
+import com.google.gerrit.extensions.api.access.GlobalOrPluginPermission;
+import com.google.gerrit.extensions.api.access.PluginPermission;
+import com.google.gerrit.extensions.config.CapabilityDefinition;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.BinaryResult;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.OptionUtil;
+import com.google.gerrit.server.OutputFormat;
+import com.google.gerrit.server.account.AccountLimits;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.AccountResource.Capability;
+import com.google.gerrit.server.git.QueueProvider;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gson.reflect.TypeToken;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+import org.kohsuke.args4j.Option;
+
+public class GetCapabilities implements RestReadView<AccountResource> {
+  @Option(name = "-q", metaVar = "CAP", usage = "Capability to inspect")
+  void addQuery(String name) {
+    if (query == null) {
+      query = new HashSet<>();
+    }
+    Iterables.addAll(query, OptionUtil.splitOptionValue(name));
+  }
+
+  private Set<String> query;
+
+  private final PermissionBackend permissionBackend;
+  private final AccountLimits.Factory limitsFactory;
+  private final Provider<CurrentUser> self;
+  private final DynamicMap<CapabilityDefinition> pluginCapabilities;
+
+  @Inject
+  GetCapabilities(
+      PermissionBackend permissionBackend,
+      AccountLimits.Factory limitsFactory,
+      Provider<CurrentUser> self,
+      DynamicMap<CapabilityDefinition> pluginCapabilities) {
+    this.permissionBackend = permissionBackend;
+    this.limitsFactory = limitsFactory;
+    this.self = self;
+    this.pluginCapabilities = pluginCapabilities;
+  }
+
+  @Override
+  public Object apply(AccountResource resource)
+      throws RestApiException, PermissionBackendException {
+    permissionBackend.checkUsesDefaultCapabilities();
+    PermissionBackend.WithUser perm = permissionBackend.currentUser();
+    if (!self.get().hasSameAccountId(resource.getUser())) {
+      perm.check(GlobalPermission.ADMINISTRATE_SERVER);
+      perm = permissionBackend.absentUser(resource.getUser().getAccountId());
+    }
+
+    Map<String, Object> have = new LinkedHashMap<>();
+    for (GlobalOrPluginPermission p : perm.test(permissionsToTest())) {
+      have.put(globalOrPluginPermissionName(p), true);
+    }
+
+    AccountLimits limits = limitsFactory.create(resource.getUser());
+    addRanges(have, limits);
+    addPriority(have, limits);
+
+    return OutputFormat.JSON
+        .newGson()
+        .toJsonTree(have, new TypeToken<Map<String, Object>>() {}.getType());
+  }
+
+  private Set<GlobalOrPluginPermission> permissionsToTest() {
+    Set<GlobalOrPluginPermission> toTest = new HashSet<>();
+    for (GlobalPermission p : GlobalPermission.values()) {
+      if (want(globalPermissionName(p))) {
+        toTest.add(p);
+      }
+    }
+
+    for (String pluginName : pluginCapabilities.plugins()) {
+      for (String capability : pluginCapabilities.byPlugin(pluginName).keySet()) {
+        PluginPermission p = new PluginPermission(pluginName, capability);
+        if (want(pluginPermissionName(p))) {
+          toTest.add(p);
+        }
+      }
+    }
+    return toTest;
+  }
+
+  private boolean want(String name) {
+    return query == null || query.contains(name.toLowerCase());
+  }
+
+  private void addRanges(Map<String, Object> have, AccountLimits limits) {
+    for (String name : GlobalCapability.getRangeNames()) {
+      if (want(name) && limits.hasExplicitRange(name)) {
+        have.put(name, new Range(limits.getRange(name)));
+      }
+    }
+  }
+
+  private void addPriority(Map<String, Object> have, AccountLimits limits) {
+    QueueProvider.QueueType queue = limits.getQueueType();
+    if (queue != QueueProvider.QueueType.INTERACTIVE
+        || (query != null && query.contains(PRIORITY))) {
+      have.put(PRIORITY, queue);
+    }
+  }
+
+  private static class Range {
+    private transient PermissionRange range;
+
+    @SuppressWarnings("unused")
+    private int min;
+
+    @SuppressWarnings("unused")
+    private int max;
+
+    Range(PermissionRange r) {
+      range = r;
+      min = r.getMin();
+      max = r.getMax();
+    }
+
+    @Override
+    public String toString() {
+      return range.toString();
+    }
+  }
+
+  @Singleton
+  public static class CheckOne implements RestReadView<AccountResource.Capability> {
+    private final PermissionBackend permissionBackend;
+
+    @Inject
+    CheckOne(PermissionBackend permissionBackend) {
+      this.permissionBackend = permissionBackend;
+    }
+
+    @Override
+    public BinaryResult apply(Capability resource) throws ResourceNotFoundException {
+      permissionBackend.checkUsesDefaultCapabilities();
+      return BinaryResult.create("ok\n");
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/GetDetail.java b/java/com/google/gerrit/server/restapi/account/GetDetail.java
new file mode 100644
index 0000000..97d0c60
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/GetDetail.java
@@ -0,0 +1,49 @@
+// Copyright (C) 2015 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.google.gerrit.server.restapi.account;
+
+import com.google.gerrit.extensions.common.AccountDetailInfo;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.account.AccountDirectory.FillOptions;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.InternalAccountDirectory;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.Collections;
+import java.util.EnumSet;
+
+@Singleton
+public class GetDetail implements RestReadView<AccountResource> {
+  private final InternalAccountDirectory directory;
+
+  @Inject
+  public GetDetail(InternalAccountDirectory directory) {
+    this.directory = directory;
+  }
+
+  @Override
+  public AccountDetailInfo apply(AccountResource rsrc)
+      throws OrmException, PermissionBackendException {
+    Account a = rsrc.getUser().getAccount();
+    AccountDetailInfo info = new AccountDetailInfo(a.getId().get());
+    info.registeredOn = a.getRegisteredOn();
+    info.inactive = !a.isActive() ? true : null;
+    directory.fillAccountInfo(Collections.singleton(info), EnumSet.allOf(FillOptions.class));
+    return info;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/GetDiffPreferences.java b/java/com/google/gerrit/server/restapi/account/GetDiffPreferences.java
new file mode 100644
index 0000000..40201a8
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/GetDiffPreferences.java
@@ -0,0 +1,63 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.account;
+
+import com.google.gerrit.extensions.client.DiffPreferencesInfo;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class GetDiffPreferences implements RestReadView<AccountResource> {
+  private final Provider<CurrentUser> self;
+  private final PermissionBackend permissionBackend;
+  private final AccountCache accountCache;
+
+  @Inject
+  GetDiffPreferences(
+      Provider<CurrentUser> self, PermissionBackend permissionBackend, AccountCache accountCache) {
+    this.self = self;
+    this.permissionBackend = permissionBackend;
+    this.accountCache = accountCache;
+  }
+
+  @Override
+  public DiffPreferencesInfo apply(AccountResource rsrc)
+      throws RestApiException, ConfigInvalidException, IOException, PermissionBackendException {
+    if (!self.get().hasSameAccountId(rsrc.getUser())) {
+      permissionBackend.currentUser().check(GlobalPermission.ADMINISTRATE_SERVER);
+    }
+
+    Account.Id id = rsrc.getUser().getAccountId();
+    return accountCache
+        .get(id)
+        .map(AccountState::getDiffPreferences)
+        .orElseThrow(() -> new ResourceNotFoundException(IdString.fromDecoded(id.toString())));
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/GetEditPreferences.java b/java/com/google/gerrit/server/restapi/account/GetEditPreferences.java
new file mode 100644
index 0000000..0ecd6ea
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/GetEditPreferences.java
@@ -0,0 +1,63 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.account;
+
+import com.google.gerrit.extensions.client.EditPreferencesInfo;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class GetEditPreferences implements RestReadView<AccountResource> {
+  private final Provider<CurrentUser> self;
+  private final PermissionBackend permissionBackend;
+  private final AccountCache accountCache;
+
+  @Inject
+  GetEditPreferences(
+      Provider<CurrentUser> self, PermissionBackend permissionBackend, AccountCache accountCache) {
+    this.self = self;
+    this.permissionBackend = permissionBackend;
+    this.accountCache = accountCache;
+  }
+
+  @Override
+  public EditPreferencesInfo apply(AccountResource rsrc)
+      throws RestApiException, IOException, ConfigInvalidException, PermissionBackendException {
+    if (!self.get().hasSameAccountId(rsrc.getUser())) {
+      permissionBackend.currentUser().check(GlobalPermission.MODIFY_ACCOUNT);
+    }
+
+    Account.Id id = rsrc.getUser().getAccountId();
+    return accountCache
+        .get(id)
+        .map(AccountState::getEditPreferences)
+        .orElseThrow(() -> new ResourceNotFoundException(IdString.fromDecoded(id.toString())));
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/GetEmail.java b/java/com/google/gerrit/server/restapi/account/GetEmail.java
new file mode 100644
index 0000000..3118380
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/GetEmail.java
@@ -0,0 +1,35 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.account;
+
+import com.google.gerrit.extensions.common.EmailInfo;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GetEmail implements RestReadView<AccountResource.Email> {
+  @Inject
+  public GetEmail() {}
+
+  @Override
+  public EmailInfo apply(AccountResource.Email rsrc) {
+    EmailInfo e = new EmailInfo();
+    e.email = rsrc.getEmail();
+    e.preferred(rsrc.getUser().getAccount().getPreferredEmail());
+    return e;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/GetEmails.java b/java/com/google/gerrit/server/restapi/account/GetEmails.java
new file mode 100644
index 0000000..8c21536
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/GetEmails.java
@@ -0,0 +1,64 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.account;
+
+import static java.util.Comparator.comparing;
+import static java.util.stream.Collectors.toList;
+
+import com.google.gerrit.extensions.common.EmailInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.List;
+import java.util.Objects;
+
+@Singleton
+public class GetEmails implements RestReadView<AccountResource> {
+  private final Provider<CurrentUser> self;
+  private final PermissionBackend permissionBackend;
+
+  @Inject
+  GetEmails(Provider<CurrentUser> self, PermissionBackend permissionBackend) {
+    this.self = self;
+    this.permissionBackend = permissionBackend;
+  }
+
+  @Override
+  public List<EmailInfo> apply(AccountResource rsrc)
+      throws AuthException, PermissionBackendException {
+    if (!self.get().hasSameAccountId(rsrc.getUser())) {
+      permissionBackend.currentUser().check(GlobalPermission.MODIFY_ACCOUNT);
+    }
+    return rsrc.getUser().getEmailAddresses().stream()
+        .filter(Objects::nonNull)
+        .map(e -> toEmailInfo(rsrc, e))
+        .sorted(comparing((EmailInfo e) -> e.email))
+        .collect(toList());
+  }
+
+  private static EmailInfo toEmailInfo(AccountResource rsrc, String email) {
+    EmailInfo e = new EmailInfo();
+    e.email = email;
+    e.preferred(rsrc.getUser().getAccount().getPreferredEmail());
+    return e;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/GetExternalIds.java b/java/com/google/gerrit/server/restapi/account/GetExternalIds.java
new file mode 100644
index 0000000..7a420ab
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/GetExternalIds.java
@@ -0,0 +1,93 @@
+// Copyright (C) 2017 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.google.gerrit.server.restapi.account;
+
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_USERNAME;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import com.google.gerrit.extensions.common.AccountExternalIdInfo;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.account.externalids.ExternalIds;
+import com.google.gerrit.server.config.AuthConfig;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+
+@Singleton
+public class GetExternalIds implements RestReadView<AccountResource> {
+  private final PermissionBackend permissionBackend;
+  private final ExternalIds externalIds;
+  private final Provider<CurrentUser> self;
+  private final AuthConfig authConfig;
+
+  @Inject
+  GetExternalIds(
+      PermissionBackend permissionBackend,
+      ExternalIds externalIds,
+      Provider<CurrentUser> self,
+      AuthConfig authConfig) {
+    this.permissionBackend = permissionBackend;
+    this.externalIds = externalIds;
+    this.self = self;
+    this.authConfig = authConfig;
+  }
+
+  @Override
+  public List<AccountExternalIdInfo> apply(AccountResource resource)
+      throws RestApiException, IOException, OrmException, PermissionBackendException {
+    if (!self.get().hasSameAccountId(resource.getUser())) {
+      permissionBackend.currentUser().check(GlobalPermission.ACCESS_DATABASE);
+    }
+
+    Collection<ExternalId> ids = externalIds.byAccount(resource.getUser().getAccountId());
+    if (ids.isEmpty()) {
+      return ImmutableList.of();
+    }
+    List<AccountExternalIdInfo> result = Lists.newArrayListWithCapacity(ids.size());
+    for (ExternalId id : ids) {
+      AccountExternalIdInfo info = new AccountExternalIdInfo();
+      info.identity = id.key().get();
+      info.emailAddress = id.email();
+      info.trusted = toBoolean(authConfig.isIdentityTrustable(Collections.singleton(id)));
+      // The identity can be deleted only if its not the one used to
+      // establish this web session, and if only if an identity was
+      // actually used to establish this web session.
+      if (!id.isScheme(SCHEME_USERNAME)) {
+        Optional<ExternalId.Key> last = resource.getUser().getLastLoginExternalIdKey();
+        info.canDelete = toBoolean(!last.isPresent() || !last.get().get().equals(info.identity));
+      }
+      result.add(info);
+    }
+    return result;
+  }
+
+  private static Boolean toBoolean(boolean v) {
+    return v ? v : null;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/GetGroups.java b/java/com/google/gerrit/server/restapi/account/GetGroups.java
new file mode 100644
index 0000000..ad9746e
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/GetGroups.java
@@ -0,0 +1,65 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.account;
+
+import com.google.gerrit.common.errors.NoSuchGroupException;
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.GroupControl;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.restapi.group.GroupJson;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+@Singleton
+public class GetGroups implements RestReadView<AccountResource> {
+  private final GroupControl.Factory groupControlFactory;
+  private final GroupJson json;
+
+  @Inject
+  GetGroups(GroupControl.Factory groupControlFactory, GroupJson json) {
+    this.groupControlFactory = groupControlFactory;
+    this.json = json;
+  }
+
+  @Override
+  public List<GroupInfo> apply(AccountResource resource)
+      throws OrmException, PermissionBackendException {
+    IdentifiedUser user = resource.getUser();
+    Account.Id userId = user.getAccountId();
+    Set<AccountGroup.UUID> knownGroups = user.getEffectiveGroups().getKnownGroups();
+    List<GroupInfo> visibleGroups = new ArrayList<>();
+    for (AccountGroup.UUID uuid : knownGroups) {
+      GroupControl ctl;
+      try {
+        ctl = groupControlFactory.controlFor(uuid);
+      } catch (NoSuchGroupException e) {
+        continue;
+      }
+      if (ctl.isVisible() && ctl.canSeeMember(userId)) {
+        visibleGroups.add(json.format(ctl.getGroup()));
+      }
+    }
+    return visibleGroups;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/GetName.java b/java/com/google/gerrit/server/restapi/account/GetName.java
new file mode 100644
index 0000000..bdf379e
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/GetName.java
@@ -0,0 +1,28 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.account;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GetName implements RestReadView<AccountResource> {
+  @Override
+  public String apply(AccountResource rsrc) {
+    return Strings.nullToEmpty(rsrc.getUser().getAccount().getFullName());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/GetOAuthToken.java b/java/com/google/gerrit/server/restapi/account/GetOAuthToken.java
new file mode 100644
index 0000000..395c159
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/GetOAuthToken.java
@@ -0,0 +1,95 @@
+// 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.
+
+package com.google.gerrit.server.restapi.account;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.auth.oauth.OAuthToken;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.auth.oauth.OAuthTokenCache;
+import com.google.gerrit.server.config.CanonicalWebUrl;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+@Singleton
+public class GetOAuthToken implements RestReadView<AccountResource> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final String BEARER_TYPE = "bearer";
+
+  private final Provider<CurrentUser> self;
+  private final OAuthTokenCache tokenCache;
+  private final Provider<String> canonicalWebUrlProvider;
+
+  @Inject
+  GetOAuthToken(
+      Provider<CurrentUser> self,
+      OAuthTokenCache tokenCache,
+      @CanonicalWebUrl Provider<String> urlProvider) {
+    this.self = self;
+    this.tokenCache = tokenCache;
+    this.canonicalWebUrlProvider = urlProvider;
+  }
+
+  @Override
+  public OAuthTokenInfo apply(AccountResource rsrc)
+      throws AuthException, ResourceNotFoundException {
+    if (!self.get().hasSameAccountId(rsrc.getUser())) {
+      throw new AuthException("not allowed to get access token");
+    }
+    OAuthToken accessToken = tokenCache.get(rsrc.getUser().getAccountId());
+    if (accessToken == null) {
+      throw new ResourceNotFoundException();
+    }
+    OAuthTokenInfo accessTokenInfo = new OAuthTokenInfo();
+    accessTokenInfo.username = rsrc.getUser().getUserName().orElse(null);
+    accessTokenInfo.resourceHost = getHostName(canonicalWebUrlProvider.get());
+    accessTokenInfo.accessToken = accessToken.getToken();
+    accessTokenInfo.providerId = accessToken.getProviderId();
+    accessTokenInfo.expiresAt = Long.toString(accessToken.getExpiresAt());
+    accessTokenInfo.type = BEARER_TYPE;
+    return accessTokenInfo;
+  }
+
+  private static String getHostName(String canonicalWebUrl) {
+    if (canonicalWebUrl == null) {
+      logger.atSevere().log(
+          "No canonicalWebUrl defined in gerrit.config, OAuth may not work properly");
+      return null;
+    }
+
+    try {
+      return new URI(canonicalWebUrl).getHost();
+    } catch (URISyntaxException e) {
+      logger.atSevere().withCause(e).log("Invalid canonicalWebUrl '%s'", canonicalWebUrl);
+      return null;
+    }
+  }
+
+  public static class OAuthTokenInfo {
+    public String username;
+    public String resourceHost;
+    public String accessToken;
+    public String providerId;
+    public String expiresAt;
+    public String type;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/GetPreferences.java b/java/com/google/gerrit/server/restapi/account/GetPreferences.java
new file mode 100644
index 0000000..3d20642
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/GetPreferences.java
@@ -0,0 +1,88 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.account;
+
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
+import com.google.gerrit.extensions.config.DownloadScheme;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.registration.Extension;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GetPreferences implements RestReadView<AccountResource> {
+  private final Provider<CurrentUser> self;
+  private final PermissionBackend permissionBackend;
+  private final AccountCache accountCache;
+  private final DynamicMap<DownloadScheme> downloadSchemes;
+
+  @Inject
+  GetPreferences(
+      Provider<CurrentUser> self,
+      PermissionBackend permissionBackend,
+      AccountCache accountCache,
+      DynamicMap<DownloadScheme> downloadSchemes) {
+    this.self = self;
+    this.permissionBackend = permissionBackend;
+    this.accountCache = accountCache;
+    this.downloadSchemes = downloadSchemes;
+  }
+
+  @Override
+  public GeneralPreferencesInfo apply(AccountResource rsrc)
+      throws RestApiException, PermissionBackendException {
+    if (!self.get().hasSameAccountId(rsrc.getUser())) {
+      permissionBackend.currentUser().check(GlobalPermission.MODIFY_ACCOUNT);
+    }
+
+    Account.Id id = rsrc.getUser().getAccountId();
+    GeneralPreferencesInfo preferencesInfo =
+        accountCache
+            .get(id)
+            .map(AccountState::getGeneralPreferences)
+            .orElseThrow(() -> new ResourceNotFoundException(IdString.fromDecoded(id.toString())));
+    return unsetDownloadSchemeIfUnsupported(preferencesInfo);
+  }
+
+  private GeneralPreferencesInfo unsetDownloadSchemeIfUnsupported(
+      GeneralPreferencesInfo preferencesInfo) {
+    if (preferencesInfo.downloadScheme == null) {
+      return preferencesInfo;
+    }
+
+    for (Extension<DownloadScheme> e : downloadSchemes) {
+      if (e.getExportName().equals(preferencesInfo.downloadScheme)
+          && e.getProvider().get().isEnabled()) {
+        return preferencesInfo;
+      }
+    }
+
+    preferencesInfo.downloadScheme = null;
+    return preferencesInfo;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/GetSshKey.java b/java/com/google/gerrit/server/restapi/account/GetSshKey.java
new file mode 100644
index 0000000..dc72663
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/GetSshKey.java
@@ -0,0 +1,30 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.account;
+
+import com.google.gerrit.extensions.common.SshKeyInfo;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.AccountResource.SshKey;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GetSshKey implements RestReadView<AccountResource.SshKey> {
+
+  @Override
+  public SshKeyInfo apply(SshKey rsrc) {
+    return GetSshKeys.newSshKeyInfo(rsrc.getSshKey());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/GetSshKeys.java b/java/com/google/gerrit/server/restapi/account/GetSshKeys.java
new file mode 100644
index 0000000..a49f9df
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/GetSshKeys.java
@@ -0,0 +1,81 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.account;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+import com.google.gerrit.extensions.common.SshKeyInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.AccountSshKey;
+import com.google.gerrit.server.account.VersionedAuthorizedKeys;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.List;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+
+@Singleton
+public class GetSshKeys implements RestReadView<AccountResource> {
+
+  private final Provider<CurrentUser> self;
+  private final PermissionBackend permissionBackend;
+  private final VersionedAuthorizedKeys.Accessor authorizedKeys;
+
+  @Inject
+  GetSshKeys(
+      Provider<CurrentUser> self,
+      PermissionBackend permissionBackend,
+      VersionedAuthorizedKeys.Accessor authorizedKeys) {
+    this.self = self;
+    this.permissionBackend = permissionBackend;
+    this.authorizedKeys = authorizedKeys;
+  }
+
+  @Override
+  public List<SshKeyInfo> apply(AccountResource rsrc)
+      throws AuthException, OrmException, RepositoryNotFoundException, IOException,
+          ConfigInvalidException, PermissionBackendException {
+    if (!self.get().hasSameAccountId(rsrc.getUser())) {
+      permissionBackend.currentUser().check(GlobalPermission.MODIFY_ACCOUNT);
+    }
+    return apply(rsrc.getUser());
+  }
+
+  public List<SshKeyInfo> apply(IdentifiedUser user)
+      throws RepositoryNotFoundException, IOException, ConfigInvalidException {
+    return Lists.transform(authorizedKeys.getKeys(user.getAccountId()), GetSshKeys::newSshKeyInfo);
+  }
+
+  public static SshKeyInfo newSshKeyInfo(AccountSshKey sshKey) {
+    SshKeyInfo info = new SshKeyInfo();
+    info.seq = sshKey.seq();
+    info.sshPublicKey = sshKey.sshPublicKey();
+    info.encodedKey = sshKey.encodedKey();
+    info.algorithm = sshKey.algorithm();
+    info.comment = Strings.emptyToNull(sshKey.comment());
+    info.valid = sshKey.valid();
+    return info;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/GetStatus.java b/java/com/google/gerrit/server/restapi/account/GetStatus.java
new file mode 100644
index 0000000..bc7094f
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/GetStatus.java
@@ -0,0 +1,28 @@
+// Copyright (C) 2017 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.google.gerrit.server.restapi.account;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GetStatus implements RestReadView<AccountResource> {
+  @Override
+  public String apply(AccountResource rsrc) {
+    return Strings.nullToEmpty(rsrc.getUser().getAccount().getStatus());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/GetUsername.java b/java/com/google/gerrit/server/restapi/account/GetUsername.java
new file mode 100644
index 0000000..01185c3
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/GetUsername.java
@@ -0,0 +1,33 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.account;
+
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GetUsername implements RestReadView<AccountResource> {
+  @Inject
+  public GetUsername() {}
+
+  @Override
+  public String apply(AccountResource rsrc) throws AuthException, ResourceNotFoundException {
+    return rsrc.getUser().getUserName().orElseThrow(ResourceNotFoundException::new);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/GetWatchedProjects.java b/java/com/google/gerrit/server/restapi/account/GetWatchedProjects.java
new file mode 100644
index 0000000..ba8c72a
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/GetWatchedProjects.java
@@ -0,0 +1,92 @@
+// 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.
+
+package com.google.gerrit.server.restapi.account;
+
+import static java.util.Comparator.comparing;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.extensions.client.ProjectWatchInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.account.Accounts;
+import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gerrit.server.account.ProjectWatches.ProjectWatchKey;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.List;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class GetWatchedProjects implements RestReadView<AccountResource> {
+  private final PermissionBackend permissionBackend;
+  private final Provider<IdentifiedUser> self;
+  private final Accounts accounts;
+
+  @Inject
+  public GetWatchedProjects(
+      PermissionBackend permissionBackend, Provider<IdentifiedUser> self, Accounts accounts) {
+    this.permissionBackend = permissionBackend;
+    this.self = self;
+    this.accounts = accounts;
+  }
+
+  @Override
+  public List<ProjectWatchInfo> apply(AccountResource rsrc)
+      throws OrmException, AuthException, IOException, ConfigInvalidException,
+          PermissionBackendException, ResourceNotFoundException {
+    if (!self.get().hasSameAccountId(rsrc.getUser())) {
+      permissionBackend.currentUser().check(GlobalPermission.ADMINISTRATE_SERVER);
+    }
+
+    Account.Id accountId = rsrc.getUser().getAccountId();
+    AccountState account = accounts.get(accountId).orElseThrow(ResourceNotFoundException::new);
+    return account.getProjectWatches().entrySet().stream()
+        .map(e -> toProjectWatchInfo(e.getKey(), e.getValue()))
+        .sorted(
+            comparing((ProjectWatchInfo pwi) -> pwi.project)
+                .thenComparing(pwi -> Strings.nullToEmpty(pwi.filter)))
+        .collect(toList());
+  }
+
+  private static ProjectWatchInfo toProjectWatchInfo(
+      ProjectWatchKey key, ImmutableSet<NotifyType> watchTypes) {
+    ProjectWatchInfo pwi = new ProjectWatchInfo();
+    pwi.filter = key.filter();
+    pwi.project = key.project().get();
+    pwi.notifyAbandonedChanges = toBoolean(watchTypes.contains(NotifyType.ABANDONED_CHANGES));
+    pwi.notifyNewChanges = toBoolean(watchTypes.contains(NotifyType.NEW_CHANGES));
+    pwi.notifyNewPatchSets = toBoolean(watchTypes.contains(NotifyType.NEW_PATCHSETS));
+    pwi.notifySubmittedChanges = toBoolean(watchTypes.contains(NotifyType.SUBMITTED_CHANGES));
+    pwi.notifyAllComments = toBoolean(watchTypes.contains(NotifyType.ALL_COMMENTS));
+    return pwi;
+  }
+
+  private static Boolean toBoolean(boolean value) {
+    return value ? true : null;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/Index.java b/java/com/google/gerrit/server/restapi/account/Index.java
new file mode 100644
index 0000000..6ddfc0f4
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/Index.java
@@ -0,0 +1,59 @@
+// 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.
+
+package com.google.gerrit.server.restapi.account;
+
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.index.account.AccountIndexer;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+
+@Singleton
+public class Index implements RestModifyView<AccountResource, Input> {
+
+  private final Provider<AccountIndexer> accountIndexer;
+  private final PermissionBackend permissionBackend;
+  private final Provider<CurrentUser> self;
+
+  @Inject
+  Index(
+      Provider<AccountIndexer> accountIndexer,
+      PermissionBackend permissionBackend,
+      Provider<CurrentUser> self) {
+    this.accountIndexer = accountIndexer;
+    this.permissionBackend = permissionBackend;
+    this.self = self;
+  }
+
+  @Override
+  public Response<?> apply(AccountResource rsrc, Input input)
+      throws IOException, AuthException, PermissionBackendException {
+    if (!self.get().hasSameAccountId(rsrc.getUser())) {
+      permissionBackend.currentUser().check(GlobalPermission.MODIFY_ACCOUNT);
+    }
+
+    accountIndexer.get().index(rsrc.getUser().getAccountId());
+    return Response.none();
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/Module.java b/java/com/google/gerrit/server/restapi/account/Module.java
new file mode 100644
index 0000000..9b012f7
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/Module.java
@@ -0,0 +1,132 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.account;
+
+import static com.google.gerrit.server.account.AccountResource.ACCOUNT_KIND;
+import static com.google.gerrit.server.account.AccountResource.CAPABILITY_KIND;
+import static com.google.gerrit.server.account.AccountResource.EMAIL_KIND;
+import static com.google.gerrit.server.account.AccountResource.SSH_KEY_KIND;
+import static com.google.gerrit.server.account.AccountResource.STARRED_CHANGE_KIND;
+import static com.google.gerrit.server.account.AccountResource.Star.STAR_KIND;
+
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.RestApiModule;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.ServerInitiated;
+import com.google.gerrit.server.UserInitiated;
+import com.google.gerrit.server.account.AccountsUpdate;
+import com.google.gerrit.server.account.externalids.ExternalIdNotes;
+import com.google.inject.Provides;
+
+public class Module extends RestApiModule {
+  @Override
+  protected void configure() {
+    bind(AccountsCollection.class);
+    bind(Capabilities.class);
+
+    DynamicMap.mapOf(binder(), ACCOUNT_KIND);
+    DynamicMap.mapOf(binder(), CAPABILITY_KIND);
+    DynamicMap.mapOf(binder(), EMAIL_KIND);
+    DynamicMap.mapOf(binder(), SSH_KEY_KIND);
+    DynamicMap.mapOf(binder(), STARRED_CHANGE_KIND);
+    DynamicMap.mapOf(binder(), STAR_KIND);
+
+    create(ACCOUNT_KIND).to(CreateAccount.class);
+    put(ACCOUNT_KIND).to(PutAccount.class);
+    get(ACCOUNT_KIND).to(GetAccount.class);
+    get(ACCOUNT_KIND, "detail").to(GetDetail.class);
+    post(ACCOUNT_KIND, "index").to(Index.class);
+    get(ACCOUNT_KIND, "name").to(GetName.class);
+    put(ACCOUNT_KIND, "name").to(PutName.class);
+    delete(ACCOUNT_KIND, "name").to(PutName.class);
+    get(ACCOUNT_KIND, "status").to(GetStatus.class);
+    put(ACCOUNT_KIND, "status").to(PutStatus.class);
+    get(ACCOUNT_KIND, "username").to(GetUsername.class);
+    put(ACCOUNT_KIND, "username").to(PutUsername.class);
+    get(ACCOUNT_KIND, "active").to(GetActive.class);
+    put(ACCOUNT_KIND, "active").to(PutActive.class);
+    delete(ACCOUNT_KIND, "active").to(DeleteActive.class);
+    child(ACCOUNT_KIND, "emails").to(EmailsCollection.class);
+    create(EMAIL_KIND).to(CreateEmail.class);
+    get(EMAIL_KIND).to(GetEmail.class);
+    put(EMAIL_KIND).to(PutEmail.class);
+    delete(EMAIL_KIND).to(DeleteEmail.class);
+    put(EMAIL_KIND, "preferred").to(PutPreferred.class);
+    put(ACCOUNT_KIND, "password.http").to(PutHttpPassword.class);
+    delete(ACCOUNT_KIND, "password.http").to(PutHttpPassword.class);
+    get(ACCOUNT_KIND, "watched.projects").to(GetWatchedProjects.class);
+    post(ACCOUNT_KIND, "watched.projects").to(PostWatchedProjects.class);
+    post(ACCOUNT_KIND, "watched.projects:delete").to(DeleteWatchedProjects.class);
+
+    child(ACCOUNT_KIND, "sshkeys").to(SshKeys.class);
+    postOnCollection(SSH_KEY_KIND).to(AddSshKey.class);
+    get(SSH_KEY_KIND).to(GetSshKey.class);
+    delete(SSH_KEY_KIND).to(DeleteSshKey.class);
+
+    get(ACCOUNT_KIND, "oauthtoken").to(GetOAuthToken.class);
+
+    get(ACCOUNT_KIND, "avatar").to(GetAvatar.class);
+    get(ACCOUNT_KIND, "avatar.change.url").to(GetAvatarChangeUrl.class);
+
+    child(ACCOUNT_KIND, "capabilities").to(Capabilities.class);
+
+    get(ACCOUNT_KIND, "groups").to(GetGroups.class);
+    get(ACCOUNT_KIND, "preferences").to(GetPreferences.class);
+    put(ACCOUNT_KIND, "preferences").to(SetPreferences.class);
+    get(ACCOUNT_KIND, "preferences.diff").to(GetDiffPreferences.class);
+    put(ACCOUNT_KIND, "preferences.diff").to(SetDiffPreferences.class);
+    get(ACCOUNT_KIND, "preferences.edit").to(GetEditPreferences.class);
+    put(ACCOUNT_KIND, "preferences.edit").to(SetEditPreferences.class);
+    get(CAPABILITY_KIND).to(GetCapabilities.CheckOne.class);
+
+    get(ACCOUNT_KIND, "agreements").to(GetAgreements.class);
+    put(ACCOUNT_KIND, "agreements").to(PutAgreement.class);
+
+    child(ACCOUNT_KIND, "starred.changes").to(StarredChanges.class);
+    create(STARRED_CHANGE_KIND).to(StarredChanges.Create.class);
+    put(STARRED_CHANGE_KIND).to(StarredChanges.Put.class);
+    delete(STARRED_CHANGE_KIND).to(StarredChanges.Delete.class);
+    bind(StarredChanges.Create.class);
+
+    child(ACCOUNT_KIND, "stars.changes").to(Stars.class);
+    get(STAR_KIND).to(Stars.Get.class);
+    post(STAR_KIND).to(Stars.Post.class);
+
+    get(ACCOUNT_KIND, "external.ids").to(GetExternalIds.class);
+    post(ACCOUNT_KIND, "external.ids:delete").to(DeleteExternalIds.class);
+
+    post(ACCOUNT_KIND, "drafts:delete").to(DeleteDraftComments.class);
+
+    // The gpgkeys REST endpoints are bound via GpgApiModule.
+
+    factory(AccountsUpdate.Factory.class);
+  }
+
+  @Provides
+  @ServerInitiated
+  AccountsUpdate provideServerInitiatedAccountsUpdate(
+      AccountsUpdate.Factory accountsUpdateFactory, ExternalIdNotes.Factory extIdNotesFactory) {
+    return accountsUpdateFactory.create(null, extIdNotesFactory);
+  }
+
+  @Provides
+  @UserInitiated
+  AccountsUpdate provideUserInitiatedAccountsUpdate(
+      AccountsUpdate.Factory accountsUpdateFactory,
+      IdentifiedUser currentUser,
+      ExternalIdNotes.Factory extIdNotesFactory) {
+    return accountsUpdateFactory.create(currentUser, extIdNotesFactory);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/PostWatchedProjects.java b/java/com/google/gerrit/server/restapi/account/PostWatchedProjects.java
new file mode 100644
index 0000000..f29a0eb
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/PostWatchedProjects.java
@@ -0,0 +1,132 @@
+// 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.
+
+package com.google.gerrit.server.restapi.account;
+
+import com.google.gerrit.extensions.client.ProjectWatchInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.UserInitiated;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.AccountsUpdate;
+import com.google.gerrit.server.account.ProjectWatches;
+import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gerrit.server.account.ProjectWatches.ProjectWatchKey;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.restapi.project.ProjectsCollection;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class PostWatchedProjects
+    implements RestModifyView<AccountResource, List<ProjectWatchInfo>> {
+  private final Provider<IdentifiedUser> self;
+  private final PermissionBackend permissionBackend;
+  private final GetWatchedProjects getWatchedProjects;
+  private final ProjectsCollection projectsCollection;
+  private final Provider<AccountsUpdate> accountsUpdateProvider;
+
+  @Inject
+  public PostWatchedProjects(
+      Provider<IdentifiedUser> self,
+      PermissionBackend permissionBackend,
+      GetWatchedProjects getWatchedProjects,
+      ProjectsCollection projectsCollection,
+      @UserInitiated Provider<AccountsUpdate> accountsUpdateProvider) {
+    this.self = self;
+    this.permissionBackend = permissionBackend;
+    this.getWatchedProjects = getWatchedProjects;
+    this.projectsCollection = projectsCollection;
+    this.accountsUpdateProvider = accountsUpdateProvider;
+  }
+
+  @Override
+  public List<ProjectWatchInfo> apply(AccountResource rsrc, List<ProjectWatchInfo> input)
+      throws OrmException, RestApiException, IOException, ConfigInvalidException,
+          PermissionBackendException {
+    if (!self.get().hasSameAccountId(rsrc.getUser())) {
+      permissionBackend.currentUser().check(GlobalPermission.ADMINISTRATE_SERVER);
+    }
+
+    Map<ProjectWatchKey, Set<NotifyType>> projectWatches = asMap(input);
+    accountsUpdateProvider
+        .get()
+        .update(
+            "Update Project Watches via API",
+            rsrc.getUser().getAccountId(),
+            u -> u.updateProjectWatches(projectWatches));
+    return getWatchedProjects.apply(rsrc);
+  }
+
+  private Map<ProjectWatchKey, Set<NotifyType>> asMap(List<ProjectWatchInfo> input)
+      throws RestApiException, IOException, PermissionBackendException {
+    Map<ProjectWatchKey, Set<NotifyType>> m = new HashMap<>();
+    for (ProjectWatchInfo info : input) {
+      if (info.project == null) {
+        throw new BadRequestException("project name must be specified");
+      }
+
+      ProjectWatchKey key =
+          ProjectWatchKey.create(projectsCollection.parse(info.project).getNameKey(), info.filter);
+      if (m.containsKey(key)) {
+        throw new BadRequestException(
+            "duplicate entry for project " + format(info.project, info.filter));
+      }
+
+      Set<NotifyType> notifyValues = EnumSet.noneOf(NotifyType.class);
+      if (toBoolean(info.notifyAbandonedChanges)) {
+        notifyValues.add(NotifyType.ABANDONED_CHANGES);
+      }
+      if (toBoolean(info.notifyAllComments)) {
+        notifyValues.add(NotifyType.ALL_COMMENTS);
+      }
+      if (toBoolean(info.notifyNewChanges)) {
+        notifyValues.add(NotifyType.NEW_CHANGES);
+      }
+      if (toBoolean(info.notifyNewPatchSets)) {
+        notifyValues.add(NotifyType.NEW_PATCHSETS);
+      }
+      if (toBoolean(info.notifySubmittedChanges)) {
+        notifyValues.add(NotifyType.SUBMITTED_CHANGES);
+      }
+
+      m.put(key, notifyValues);
+    }
+    return m;
+  }
+
+  private boolean toBoolean(Boolean b) {
+    return b == null ? false : b;
+  }
+
+  private static String format(String project, String filter) {
+    return project
+        + (filter != null && !ProjectWatches.FILTER_ALL.equals(filter)
+            ? " and filter " + filter
+            : "");
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/PutAccount.java b/java/com/google/gerrit/server/restapi/account/PutAccount.java
new file mode 100644
index 0000000..4c84c19
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/PutAccount.java
@@ -0,0 +1,32 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.account;
+
+import com.google.gerrit.extensions.api.accounts.AccountInput;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.inject.Singleton;
+
+@Singleton
+public class PutAccount implements RestModifyView<AccountResource, AccountInput> {
+  @Override
+  public Response<AccountInfo> apply(AccountResource resource, AccountInput input)
+      throws ResourceConflictException {
+    throw new ResourceConflictException("account exists");
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/PutActive.java b/java/com/google/gerrit/server/restapi/account/PutActive.java
new file mode 100644
index 0000000..8255781
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/PutActive.java
@@ -0,0 +1,47 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.account;
+
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.SetInactiveFlag;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@RequiresCapability(GlobalCapability.MODIFY_ACCOUNT)
+@Singleton
+public class PutActive implements RestModifyView<AccountResource, Input> {
+
+  private final SetInactiveFlag setInactiveFlag;
+
+  @Inject
+  PutActive(SetInactiveFlag setInactiveFlag) {
+    this.setInactiveFlag = setInactiveFlag;
+  }
+
+  @Override
+  public Response<String> apply(AccountResource rsrc, Input input)
+      throws RestApiException, OrmException, IOException, ConfigInvalidException {
+    return setInactiveFlag.activate(rsrc.getUser().getAccountId());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/PutAgreement.java b/java/com/google/gerrit/server/restapi/account/PutAgreement.java
new file mode 100644
index 0000000..0d8a816
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/PutAgreement.java
@@ -0,0 +1,105 @@
+// 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.
+
+package com.google.gerrit.server.restapi.account;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.common.data.ContributorAgreement;
+import com.google.gerrit.common.errors.NoSuchGroupException;
+import com.google.gerrit.extensions.api.accounts.AgreementInput;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.extensions.events.AgreementSignup;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.restapi.group.AddMembers;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Config;
+
+@Singleton
+public class PutAgreement implements RestModifyView<AccountResource, AgreementInput> {
+  private final ProjectCache projectCache;
+  private final Provider<IdentifiedUser> self;
+  private final AgreementSignup agreementSignup;
+  private final AddMembers addMembers;
+  private final boolean agreementsEnabled;
+
+  @Inject
+  PutAgreement(
+      ProjectCache projectCache,
+      Provider<IdentifiedUser> self,
+      AgreementSignup agreementSignup,
+      AddMembers addMembers,
+      @GerritServerConfig Config config) {
+    this.projectCache = projectCache;
+    this.self = self;
+    this.agreementSignup = agreementSignup;
+    this.addMembers = addMembers;
+    this.agreementsEnabled = config.getBoolean("auth", "contributorAgreements", false);
+  }
+
+  @Override
+  public Response<String> apply(AccountResource resource, AgreementInput input)
+      throws IOException, OrmException, RestApiException, ConfigInvalidException {
+    if (!agreementsEnabled) {
+      throw new MethodNotAllowedException("contributor agreements disabled");
+    }
+
+    if (!self.get().hasSameAccountId(resource.getUser())) {
+      throw new AuthException("not allowed to enter contributor agreement");
+    }
+
+    String agreementName = Strings.nullToEmpty(input.name);
+    ContributorAgreement ca =
+        projectCache.getAllProjects().getConfig().getContributorAgreement(agreementName);
+    if (ca == null) {
+      throw new UnprocessableEntityException("contributor agreement not found");
+    }
+
+    if (ca.getAutoVerify() == null) {
+      throw new BadRequestException("cannot enter a non-autoVerify agreement");
+    }
+
+    AccountGroup.UUID uuid = ca.getAutoVerify().getUUID();
+    if (uuid == null) {
+      throw new ResourceConflictException("autoverify group uuid not found");
+    }
+
+    AccountState accountState = self.get().state();
+    try {
+      addMembers.addMembers(uuid, ImmutableSet.of(accountState.getAccount().getId()));
+    } catch (NoSuchGroupException e) {
+      throw new ResourceConflictException("autoverify group not found");
+    }
+    agreementSignup.fire(accountState, agreementName);
+
+    return Response.ok(agreementName);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/PutEmail.java b/java/com/google/gerrit/server/restapi/account/PutEmail.java
new file mode 100644
index 0000000..6ee9003
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/PutEmail.java
@@ -0,0 +1,31 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.account;
+
+import com.google.gerrit.extensions.api.accounts.EmailInput;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.inject.Singleton;
+
+@Singleton
+public class PutEmail implements RestModifyView<AccountResource.Email, EmailInput> {
+  @Override
+  public Response<?> apply(AccountResource.Email rsrc, EmailInput input)
+      throws ResourceConflictException {
+    throw new ResourceConflictException("email exists");
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/PutHttpPassword.java b/java/com/google/gerrit/server/restapi/account/PutHttpPassword.java
new file mode 100644
index 0000000..4bbd8fc
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/PutHttpPassword.java
@@ -0,0 +1,138 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.account;
+
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_USERNAME;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.common.HttpPasswordInput;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.UsedAt;
+import com.google.gerrit.server.UserInitiated;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.AccountsUpdate;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.account.externalids.ExternalIds;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.util.Optional;
+import org.apache.commons.codec.binary.Base64;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+public class PutHttpPassword implements RestModifyView<AccountResource, HttpPasswordInput> {
+  private static final int LEN = 31;
+  private static final SecureRandom rng;
+
+  static {
+    try {
+      rng = SecureRandom.getInstance("SHA1PRNG");
+    } catch (NoSuchAlgorithmException e) {
+      throw new RuntimeException("Cannot create RNG for password generator", e);
+    }
+  }
+
+  private final Provider<CurrentUser> self;
+  private final PermissionBackend permissionBackend;
+  private final ExternalIds externalIds;
+  private final Provider<AccountsUpdate> accountsUpdateProvider;
+
+  @Inject
+  PutHttpPassword(
+      Provider<CurrentUser> self,
+      PermissionBackend permissionBackend,
+      ExternalIds externalIds,
+      @UserInitiated Provider<AccountsUpdate> accountsUpdateProvider) {
+    this.self = self;
+    this.permissionBackend = permissionBackend;
+    this.externalIds = externalIds;
+    this.accountsUpdateProvider = accountsUpdateProvider;
+  }
+
+  @Override
+  public Response<String> apply(AccountResource rsrc, HttpPasswordInput input)
+      throws AuthException, ResourceNotFoundException, ResourceConflictException, OrmException,
+          IOException, ConfigInvalidException, PermissionBackendException {
+    if (!self.get().hasSameAccountId(rsrc.getUser())) {
+      permissionBackend.currentUser().check(GlobalPermission.ADMINISTRATE_SERVER);
+    }
+
+    if (input == null) {
+      input = new HttpPasswordInput();
+    }
+    input.httpPassword = Strings.emptyToNull(input.httpPassword);
+
+    String newPassword;
+    if (input.generate) {
+      newPassword = generate();
+    } else if (input.httpPassword == null) {
+      newPassword = null;
+    } else {
+      // Only administrators can explicitly set the password.
+      permissionBackend.currentUser().check(GlobalPermission.ADMINISTRATE_SERVER);
+      newPassword = input.httpPassword;
+    }
+    return apply(rsrc.getUser(), newPassword);
+  }
+
+  public Response<String> apply(IdentifiedUser user, String newPassword)
+      throws ResourceNotFoundException, ResourceConflictException, OrmException, IOException,
+          ConfigInvalidException {
+    String userName =
+        user.getUserName().orElseThrow(() -> new ResourceConflictException("username must be set"));
+    Optional<ExternalId> optionalExtId =
+        externalIds.get(ExternalId.Key.create(SCHEME_USERNAME, userName));
+    ExternalId extId = optionalExtId.orElseThrow(ResourceNotFoundException::new);
+    accountsUpdateProvider
+        .get()
+        .update(
+            "Set HTTP Password via API",
+            extId.accountId(),
+            u ->
+                u.updateExternalId(
+                    ExternalId.createWithPassword(
+                        extId.key(), extId.accountId(), extId.email(), newPassword)));
+
+    return Strings.isNullOrEmpty(newPassword) ? Response.<String>none() : Response.ok(newPassword);
+  }
+
+  @UsedAt(UsedAt.Project.PLUGIN_SERVICEUSER)
+  public static String generate() {
+    byte[] rand = new byte[LEN];
+    rng.nextBytes(rand);
+
+    byte[] enc = Base64.encodeBase64(rand, false);
+    StringBuilder r = new StringBuilder(enc.length);
+    for (int i = 0; i < enc.length; i++) {
+      if (enc[i] == '=') {
+        break;
+      }
+      r.append((char) enc[i]);
+    }
+    return r.toString();
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/PutName.java b/java/com/google/gerrit/server/restapi/account/PutName.java
new file mode 100644
index 0000000..1e00aac
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/PutName.java
@@ -0,0 +1,92 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.account;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.client.AccountFieldName;
+import com.google.gerrit.extensions.common.NameInput;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.ServerInitiated;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.account.AccountsUpdate;
+import com.google.gerrit.server.account.Realm;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class PutName implements RestModifyView<AccountResource, NameInput> {
+  private final Provider<CurrentUser> self;
+  private final Realm realm;
+  private final PermissionBackend permissionBackend;
+  private final Provider<AccountsUpdate> accountsUpdateProvider;
+
+  @Inject
+  PutName(
+      Provider<CurrentUser> self,
+      Realm realm,
+      PermissionBackend permissionBackend,
+      @ServerInitiated Provider<AccountsUpdate> accountsUpdateProvider) {
+    this.self = self;
+    this.realm = realm;
+    this.permissionBackend = permissionBackend;
+    this.accountsUpdateProvider = accountsUpdateProvider;
+  }
+
+  @Override
+  public Response<String> apply(AccountResource rsrc, NameInput input)
+      throws AuthException, MethodNotAllowedException, ResourceNotFoundException, OrmException,
+          IOException, PermissionBackendException, ConfigInvalidException {
+    if (!self.get().hasSameAccountId(rsrc.getUser())) {
+      permissionBackend.currentUser().check(GlobalPermission.MODIFY_ACCOUNT);
+    }
+    return apply(rsrc.getUser(), input);
+  }
+
+  public Response<String> apply(IdentifiedUser user, NameInput input)
+      throws MethodNotAllowedException, ResourceNotFoundException, IOException,
+          ConfigInvalidException, OrmException {
+    if (input == null) {
+      input = new NameInput();
+    }
+
+    if (!realm.allowsEdit(AccountFieldName.FULL_NAME)) {
+      throw new MethodNotAllowedException("realm does not allow editing name");
+    }
+
+    String newName = input.name;
+    AccountState accountState =
+        accountsUpdateProvider
+            .get()
+            .update("Set Full Name via API", user.getAccountId(), u -> u.setFullName(newName))
+            .orElseThrow(() -> new ResourceNotFoundException("account not found"));
+    return Strings.isNullOrEmpty(accountState.getAccount().getFullName())
+        ? Response.none()
+        : Response.ok(accountState.getAccount().getFullName());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/PutPreferred.java b/java/com/google/gerrit/server/restapi/account/PutPreferred.java
new file mode 100644
index 0000000..265bf53
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/PutPreferred.java
@@ -0,0 +1,152 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.account;
+
+import static java.util.stream.Collectors.toList;
+import static java.util.stream.Collectors.toSet;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.ServerInitiated;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.AccountsUpdate;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.account.externalids.ExternalIds;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class PutPreferred implements RestModifyView<AccountResource.Email, Input> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final Provider<CurrentUser> self;
+  private final PermissionBackend permissionBackend;
+  private final Provider<AccountsUpdate> accountsUpdateProvider;
+  private final ExternalIds externalIds;
+
+  @Inject
+  PutPreferred(
+      Provider<CurrentUser> self,
+      PermissionBackend permissionBackend,
+      @ServerInitiated Provider<AccountsUpdate> accountsUpdateProvider,
+      ExternalIds externalIds) {
+    this.self = self;
+    this.permissionBackend = permissionBackend;
+    this.accountsUpdateProvider = accountsUpdateProvider;
+    this.externalIds = externalIds;
+  }
+
+  @Override
+  public Response<String> apply(AccountResource.Email rsrc, Input input)
+      throws RestApiException, OrmException, IOException, PermissionBackendException,
+          ConfigInvalidException {
+    if (!self.get().hasSameAccountId(rsrc.getUser())) {
+      permissionBackend.currentUser().check(GlobalPermission.MODIFY_ACCOUNT);
+    }
+    return apply(rsrc.getUser(), rsrc.getEmail());
+  }
+
+  public Response<String> apply(IdentifiedUser user, String preferredEmail)
+      throws RestApiException, IOException, ConfigInvalidException, OrmException {
+    AtomicReference<Optional<RestApiException>> exception = new AtomicReference<>(Optional.empty());
+    AtomicBoolean alreadyPreferred = new AtomicBoolean(false);
+    accountsUpdateProvider
+        .get()
+        .update(
+            "Set Preferred Email via API",
+            user.getAccountId(),
+            (a, u) -> {
+              if (preferredEmail.equals(a.getAccount().getPreferredEmail())) {
+                alreadyPreferred.set(true);
+              } else {
+                // check if the user has a matching email
+                String matchingEmail = null;
+                for (String email :
+                    a.getExternalIds().stream()
+                        .map(ExternalId::email)
+                        .filter(Objects::nonNull)
+                        .collect(toSet())) {
+                  if (email.equals(preferredEmail)) {
+                    // we have an email that matches exactly, prefer this one
+                    matchingEmail = email;
+                    break;
+                  } else if (matchingEmail == null && email.equalsIgnoreCase(preferredEmail)) {
+                    // we found an email that matches but has a different case
+                    matchingEmail = email;
+                  }
+                }
+
+                if (matchingEmail == null) {
+                  // user doesn't have an external ID for this email
+                  if (user.hasEmailAddress(preferredEmail)) {
+                    // but Realm says the user is allowed to use this email
+                    Set<ExternalId> existingExtIdsWithThisEmail =
+                        externalIds.byEmail(preferredEmail);
+                    if (!existingExtIdsWithThisEmail.isEmpty()) {
+                      // but the email is already assigned to another account
+                      logger.atWarning().log(
+                          "Cannot set preferred email %s for account %s because it is owned"
+                              + " by the following account(s): %s",
+                          preferredEmail,
+                          user.getAccountId(),
+                          existingExtIdsWithThisEmail.stream()
+                              .map(ExternalId::accountId)
+                              .collect(toList()));
+                      exception.set(
+                          Optional.of(
+                              new ResourceConflictException("email in use by another account")));
+                      return;
+                    }
+
+                    // claim the email now
+                    u.addExternalId(ExternalId.createEmail(a.getAccount().getId(), preferredEmail));
+                    matchingEmail = preferredEmail;
+                  } else {
+                    // Realm says that the email doesn't belong to the user. This can only happen as
+                    // a race condition because EmailsCollection would have thrown
+                    // ResourceNotFoundException already before invoking this REST endpoint.
+                    exception.set(Optional.of(new ResourceNotFoundException(preferredEmail)));
+                    return;
+                  }
+                }
+                u.setPreferredEmail(matchingEmail);
+              }
+            })
+        .orElseThrow(() -> new ResourceNotFoundException("account not found"));
+    if (exception.get().isPresent()) {
+      throw exception.get().get();
+    }
+    return alreadyPreferred.get() ? Response.ok("") : Response.created("");
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/PutStatus.java b/java/com/google/gerrit/server/restapi/account/PutStatus.java
new file mode 100644
index 0000000..9aee0a3
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/PutStatus.java
@@ -0,0 +1,81 @@
+// Copyright (C) 2017 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.google.gerrit.server.restapi.account;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.api.accounts.StatusInput;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.ServerInitiated;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.account.AccountsUpdate;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class PutStatus implements RestModifyView<AccountResource, StatusInput> {
+  private final Provider<CurrentUser> self;
+  private final PermissionBackend permissionBackend;
+  private final Provider<AccountsUpdate> accountsUpdateProvider;
+
+  @Inject
+  PutStatus(
+      Provider<CurrentUser> self,
+      PermissionBackend permissionBackend,
+      @ServerInitiated Provider<AccountsUpdate> accountsUpdateProvider) {
+    this.self = self;
+    this.permissionBackend = permissionBackend;
+    this.accountsUpdateProvider = accountsUpdateProvider;
+  }
+
+  @Override
+  public Response<String> apply(AccountResource rsrc, StatusInput input)
+      throws AuthException, ResourceNotFoundException, OrmException, IOException,
+          PermissionBackendException, ConfigInvalidException {
+    if (!self.get().hasSameAccountId(rsrc.getUser())) {
+      permissionBackend.currentUser().check(GlobalPermission.MODIFY_ACCOUNT);
+    }
+    return apply(rsrc.getUser(), input);
+  }
+
+  public Response<String> apply(IdentifiedUser user, StatusInput input)
+      throws ResourceNotFoundException, IOException, ConfigInvalidException, OrmException {
+    if (input == null) {
+      input = new StatusInput();
+    }
+
+    String newStatus = input.status;
+    AccountState accountState =
+        accountsUpdateProvider
+            .get()
+            .update("Set Status via API", user.getAccountId(), u -> u.setStatus(newStatus))
+            .orElseThrow(() -> new ResourceNotFoundException("account not found"));
+    return Strings.isNullOrEmpty(accountState.getAccount().getStatus())
+        ? Response.none()
+        : Response.ok(accountState.getAccount().getStatus());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/PutUsername.java b/java/com/google/gerrit/server/restapi/account/PutUsername.java
new file mode 100644
index 0000000..856a5db
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/PutUsername.java
@@ -0,0 +1,125 @@
+// Copyright (C) 2015 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.google.gerrit.server.restapi.account;
+
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_USERNAME;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.api.accounts.UsernameInput;
+import com.google.gerrit.extensions.client.AccountFieldName;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.ServerInitiated;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.AccountsUpdate;
+import com.google.gerrit.server.account.Realm;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.account.externalids.ExternalIds;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.ssh.SshKeyCache;
+import com.google.gwtorm.server.OrmDuplicateKeyException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Optional;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class PutUsername implements RestModifyView<AccountResource, UsernameInput> {
+  private final Provider<CurrentUser> self;
+  private final PermissionBackend permissionBackend;
+  private final ExternalIds externalIds;
+  private final Provider<AccountsUpdate> accountsUpdateProvider;
+  private final SshKeyCache sshKeyCache;
+  private final Realm realm;
+
+  @Inject
+  PutUsername(
+      Provider<CurrentUser> self,
+      PermissionBackend permissionBackend,
+      ExternalIds externalIds,
+      @ServerInitiated Provider<AccountsUpdate> accountsUpdateProvider,
+      SshKeyCache sshKeyCache,
+      Realm realm) {
+    this.self = self;
+    this.permissionBackend = permissionBackend;
+    this.externalIds = externalIds;
+    this.accountsUpdateProvider = accountsUpdateProvider;
+    this.sshKeyCache = sshKeyCache;
+    this.realm = realm;
+  }
+
+  @Override
+  public String apply(AccountResource rsrc, UsernameInput input)
+      throws AuthException, MethodNotAllowedException, UnprocessableEntityException,
+          ResourceConflictException, OrmException, IOException, ConfigInvalidException,
+          PermissionBackendException {
+    if (!self.get().hasSameAccountId(rsrc.getUser())) {
+      permissionBackend.currentUser().check(GlobalPermission.ADMINISTRATE_SERVER);
+    }
+
+    if (!realm.allowsEdit(AccountFieldName.USER_NAME)) {
+      throw new MethodNotAllowedException("realm does not allow editing username");
+    }
+
+    if (input == null) {
+      input = new UsernameInput();
+    }
+
+    Account.Id accountId = rsrc.getUser().getAccountId();
+    if (!externalIds.byAccount(accountId, SCHEME_USERNAME).isEmpty()) {
+      throw new MethodNotAllowedException("Username cannot be changed.");
+    }
+
+    if (Strings.isNullOrEmpty(input.username)) {
+      return input.username;
+    }
+
+    if (!ExternalId.isValidUsername(input.username)) {
+      throw new UnprocessableEntityException("invalid username");
+    }
+
+    ExternalId.Key key = ExternalId.Key.create(SCHEME_USERNAME, input.username);
+    try {
+      accountsUpdateProvider
+          .get()
+          .update(
+              "Set Username via API",
+              accountId,
+              u -> u.addExternalId(ExternalId.create(key, accountId, null, null)));
+    } catch (OrmDuplicateKeyException dupeErr) {
+      // If we are using this identity, don't report the exception.
+      Optional<ExternalId> other = externalIds.get(key);
+      if (other.isPresent() && other.get().accountId().equals(accountId)) {
+        return input.username;
+      }
+
+      // Otherwise, someone else has this identity.
+      throw new ResourceConflictException("username already used");
+    }
+
+    sshKeyCache.evict(input.username);
+    return input.username;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/QueryAccounts.java b/java/com/google/gerrit/server/restapi/account/QueryAccounts.java
new file mode 100644
index 0000000..2c0512c
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/QueryAccounts.java
@@ -0,0 +1,231 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.account;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.extensions.client.ListAccountsOption;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.AccountVisibility;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.index.query.QueryResult;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.account.AccountDirectory.FillOptions;
+import com.google.gerrit.server.account.AccountInfoComparator;
+import com.google.gerrit.server.account.AccountLoader;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.query.account.AccountPredicates;
+import com.google.gerrit.server.query.account.AccountQueryBuilder;
+import com.google.gerrit.server.query.account.AccountQueryProcessor;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.jgit.lib.Config;
+import org.kohsuke.args4j.Option;
+
+public class QueryAccounts implements RestReadView<TopLevelResource> {
+  private static final int MAX_SUGGEST_RESULTS = 100;
+
+  private final PermissionBackend permissionBackend;
+  private final AccountLoader.Factory accountLoaderFactory;
+  private final AccountQueryBuilder queryBuilder;
+  private final AccountQueryProcessor queryProcessor;
+  private final boolean suggestConfig;
+  private final int suggestFrom;
+
+  private AccountLoader accountLoader;
+  private boolean suggest;
+  private int suggestLimit = 10;
+  private String query;
+  private Integer start;
+  private EnumSet<ListAccountsOption> options;
+
+  @Option(name = "--suggest", metaVar = "SUGGEST", usage = "suggest users")
+  public void setSuggest(boolean suggest) {
+    this.suggest = suggest;
+  }
+
+  @Option(
+      name = "--limit",
+      aliases = {"-n"},
+      metaVar = "CNT",
+      usage = "maximum number of users to return")
+  public void setLimit(int n) {
+    queryProcessor.setUserProvidedLimit(n);
+
+    if (n < 0) {
+      suggestLimit = 10;
+    } else if (n == 0) {
+      suggestLimit = MAX_SUGGEST_RESULTS;
+    } else {
+      suggestLimit = Math.min(n, MAX_SUGGEST_RESULTS);
+    }
+  }
+
+  @Option(name = "-o", usage = "Output options per account")
+  public void addOption(ListAccountsOption o) {
+    options.add(o);
+  }
+
+  @Option(name = "-O", usage = "Output option flags, in hex")
+  void setOptionFlagsHex(String hex) {
+    options.addAll(ListAccountsOption.fromBits(Integer.parseInt(hex, 16)));
+  }
+
+  @Option(
+      name = "--query",
+      aliases = {"-q"},
+      metaVar = "QUERY",
+      usage = "match users")
+  public void setQuery(String query) {
+    this.query = query;
+  }
+
+  @Option(
+      name = "--start",
+      aliases = {"-S"},
+      metaVar = "CNT",
+      usage = "Number of accounts to skip")
+  public void setStart(int start) {
+    this.start = start;
+  }
+
+  @Inject
+  QueryAccounts(
+      PermissionBackend permissionBackend,
+      AccountLoader.Factory accountLoaderFactory,
+      AccountQueryBuilder queryBuilder,
+      AccountQueryProcessor queryProcessor,
+      @GerritServerConfig Config cfg) {
+    this.permissionBackend = permissionBackend;
+    this.accountLoaderFactory = accountLoaderFactory;
+    this.queryBuilder = queryBuilder;
+    this.queryProcessor = queryProcessor;
+    this.suggestFrom = cfg.getInt("suggest", null, "from", 0);
+    this.options = EnumSet.noneOf(ListAccountsOption.class);
+
+    if ("off".equalsIgnoreCase(cfg.getString("suggest", null, "accounts"))) {
+      suggestConfig = false;
+    } else {
+      boolean suggest;
+      try {
+        AccountVisibility av = cfg.getEnum("suggest", null, "accounts", AccountVisibility.ALL);
+        suggest = (av != AccountVisibility.NONE);
+      } catch (IllegalArgumentException err) {
+        suggest = cfg.getBoolean("suggest", null, "accounts", true);
+      }
+      this.suggestConfig = suggest;
+    }
+  }
+
+  @Override
+  public List<AccountInfo> apply(TopLevelResource rsrc)
+      throws OrmException, RestApiException, PermissionBackendException {
+    if (Strings.isNullOrEmpty(query)) {
+      throw new BadRequestException("missing query field");
+    }
+
+    if (suggest && (!suggestConfig || query.length() < suggestFrom)) {
+      return Collections.emptyList();
+    }
+
+    Set<FillOptions> fillOptions = EnumSet.of(FillOptions.ID);
+    if (options.contains(ListAccountsOption.DETAILS)) {
+      fillOptions.addAll(AccountLoader.DETAILED_OPTIONS);
+    }
+    boolean modifyAccountCapabilityChecked = false;
+    if (options.contains(ListAccountsOption.ALL_EMAILS)) {
+      permissionBackend.currentUser().check(GlobalPermission.MODIFY_ACCOUNT);
+      modifyAccountCapabilityChecked = true;
+      fillOptions.add(FillOptions.EMAIL);
+      fillOptions.add(FillOptions.SECONDARY_EMAILS);
+    }
+    if (suggest) {
+      fillOptions.addAll(AccountLoader.DETAILED_OPTIONS);
+      fillOptions.add(FillOptions.EMAIL);
+
+      if (modifyAccountCapabilityChecked) {
+        fillOptions.add(FillOptions.SECONDARY_EMAILS);
+      } else {
+        try {
+          permissionBackend.currentUser().check(GlobalPermission.MODIFY_ACCOUNT);
+          fillOptions.add(FillOptions.SECONDARY_EMAILS);
+        } catch (AuthException e) {
+          // Do nothing.
+        }
+      }
+    }
+    accountLoader = accountLoaderFactory.create(fillOptions);
+
+    if (queryProcessor.isDisabled()) {
+      throw new MethodNotAllowedException("query disabled");
+    }
+
+    if (start != null) {
+      queryProcessor.setStart(start);
+    }
+
+    Map<Account.Id, AccountInfo> matches = new LinkedHashMap<>();
+    try {
+      Predicate<AccountState> queryPred;
+      if (suggest) {
+        queryPred = queryBuilder.defaultQuery(query);
+        queryProcessor.setUserProvidedLimit(suggestLimit);
+      } else {
+        queryPred = queryBuilder.parse(query);
+      }
+      if (!AccountPredicates.hasActive(queryPred)) {
+        // if neither 'is:active' nor 'is:inactive' appears in the query only
+        // active accounts should be queried
+        queryPred = AccountPredicates.andActive(queryPred);
+      }
+      QueryResult<AccountState> result = queryProcessor.query(queryPred);
+      for (AccountState accountState : result.entities()) {
+        Account.Id id = accountState.getAccount().getId();
+        matches.put(id, accountLoader.get(id));
+      }
+
+      accountLoader.fill();
+
+      List<AccountInfo> sorted =
+          AccountInfoComparator.ORDER_NULLS_LAST.sortedCopy(matches.values());
+      if (!sorted.isEmpty() && result.more()) {
+        sorted.get(sorted.size() - 1)._moreAccounts = true;
+      }
+      return sorted;
+    } catch (QueryParseException e) {
+      if (suggest) {
+        return ImmutableList.of();
+      }
+      throw new BadRequestException(e.getMessage());
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/SetDiffPreferences.java b/java/com/google/gerrit/server/restapi/account/SetDiffPreferences.java
new file mode 100644
index 0000000..f4fa354
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/SetDiffPreferences.java
@@ -0,0 +1,75 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.account;
+
+import com.google.gerrit.extensions.client.DiffPreferencesInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.UserInitiated;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.account.AccountsUpdate;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+
+@Singleton
+public class SetDiffPreferences implements RestModifyView<AccountResource, DiffPreferencesInfo> {
+  private final Provider<CurrentUser> self;
+  private final PermissionBackend permissionBackend;
+  private final Provider<AccountsUpdate> accountsUpdateProvider;
+
+  @Inject
+  SetDiffPreferences(
+      Provider<CurrentUser> self,
+      PermissionBackend permissionBackend,
+      @UserInitiated Provider<AccountsUpdate> accountsUpdateProvider) {
+    this.self = self;
+    this.permissionBackend = permissionBackend;
+    this.accountsUpdateProvider = accountsUpdateProvider;
+  }
+
+  @Override
+  public DiffPreferencesInfo apply(AccountResource rsrc, DiffPreferencesInfo input)
+      throws RestApiException, ConfigInvalidException, RepositoryNotFoundException, IOException,
+          PermissionBackendException, OrmException {
+    if (!self.get().hasSameAccountId(rsrc.getUser())) {
+      permissionBackend.currentUser().check(GlobalPermission.MODIFY_ACCOUNT);
+    }
+
+    if (input == null) {
+      throw new BadRequestException("input must be provided");
+    }
+
+    Account.Id id = rsrc.getUser().getAccountId();
+    return accountsUpdateProvider
+        .get()
+        .update("Set Diff Preferences via API", id, u -> u.setDiffPreferences(input))
+        .map(AccountState::getDiffPreferences)
+        .orElseThrow(() -> new ResourceNotFoundException(IdString.fromDecoded(id.toString())));
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/SetEditPreferences.java b/java/com/google/gerrit/server/restapi/account/SetEditPreferences.java
new file mode 100644
index 0000000..4e3f1d5
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/SetEditPreferences.java
@@ -0,0 +1,76 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.account;
+
+import com.google.gerrit.extensions.client.EditPreferencesInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.UserInitiated;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.account.AccountsUpdate;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+
+@Singleton
+public class SetEditPreferences implements RestModifyView<AccountResource, EditPreferencesInfo> {
+
+  private final Provider<CurrentUser> self;
+  private final PermissionBackend permissionBackend;
+  private final Provider<AccountsUpdate> accountsUpdateProvider;
+
+  @Inject
+  SetEditPreferences(
+      Provider<CurrentUser> self,
+      PermissionBackend permissionBackend,
+      @UserInitiated Provider<AccountsUpdate> accountsUpdateProvider) {
+    this.self = self;
+    this.permissionBackend = permissionBackend;
+    this.accountsUpdateProvider = accountsUpdateProvider;
+  }
+
+  @Override
+  public EditPreferencesInfo apply(AccountResource rsrc, EditPreferencesInfo input)
+      throws RestApiException, RepositoryNotFoundException, IOException, ConfigInvalidException,
+          PermissionBackendException, OrmException {
+    if (!self.get().hasSameAccountId(rsrc.getUser())) {
+      permissionBackend.currentUser().check(GlobalPermission.MODIFY_ACCOUNT);
+    }
+
+    if (input == null) {
+      throw new BadRequestException("input must be provided");
+    }
+
+    Account.Id id = rsrc.getUser().getAccountId();
+    return accountsUpdateProvider
+        .get()
+        .update("Set Edit Preferences via API", id, u -> u.setEditPreferences(input))
+        .map(AccountState::getEditPreferences)
+        .orElseThrow(() -> new ResourceNotFoundException(IdString.fromDecoded(id.toString())));
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/SetPreferences.java b/java/com/google/gerrit/server/restapi/account/SetPreferences.java
new file mode 100644
index 0000000..2471689
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/SetPreferences.java
@@ -0,0 +1,94 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.account;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
+import com.google.gerrit.extensions.config.DownloadScheme;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.registration.Extension;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.UserInitiated;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.account.AccountsUpdate;
+import com.google.gerrit.server.account.Preferences;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class SetPreferences implements RestModifyView<AccountResource, GeneralPreferencesInfo> {
+  private final Provider<CurrentUser> self;
+  private final PermissionBackend permissionBackend;
+  private final Provider<AccountsUpdate> accountsUpdateProvider;
+  private final DynamicMap<DownloadScheme> downloadSchemes;
+
+  @Inject
+  SetPreferences(
+      Provider<CurrentUser> self,
+      PermissionBackend permissionBackend,
+      @UserInitiated Provider<AccountsUpdate> accountsUpdateProvider,
+      DynamicMap<DownloadScheme> downloadSchemes) {
+    this.self = self;
+    this.permissionBackend = permissionBackend;
+    this.accountsUpdateProvider = accountsUpdateProvider;
+    this.downloadSchemes = downloadSchemes;
+  }
+
+  @Override
+  public GeneralPreferencesInfo apply(AccountResource rsrc, GeneralPreferencesInfo input)
+      throws RestApiException, IOException, ConfigInvalidException, PermissionBackendException,
+          OrmException {
+    if (!self.get().hasSameAccountId(rsrc.getUser())) {
+      permissionBackend.currentUser().check(GlobalPermission.MODIFY_ACCOUNT);
+    }
+
+    checkDownloadScheme(input.downloadScheme);
+    Preferences.validateMy(input.my);
+    Account.Id id = rsrc.getUser().getAccountId();
+
+    return accountsUpdateProvider
+        .get()
+        .update("Set General Preferences via API", id, u -> u.setGeneralPreferences(input))
+        .map(AccountState::getGeneralPreferences)
+        .orElseThrow(() -> new ResourceNotFoundException(IdString.fromDecoded(id.toString())));
+  }
+
+  private void checkDownloadScheme(String downloadScheme) throws BadRequestException {
+    if (Strings.isNullOrEmpty(downloadScheme)) {
+      return;
+    }
+
+    for (Extension<DownloadScheme> e : downloadSchemes) {
+      if (e.getExportName().equals(downloadScheme) && e.getProvider().get().isEnabled()) {
+        return;
+      }
+    }
+    throw new BadRequestException("Unsupported download scheme: " + downloadScheme);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/SshKeys.java b/java/com/google/gerrit/server/restapi/account/SshKeys.java
new file mode 100644
index 0000000..4e44c71
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/SshKeys.java
@@ -0,0 +1,98 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.account;
+
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ChildCollection;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.AccountSshKey;
+import com.google.gerrit.server.account.VersionedAuthorizedKeys;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class SshKeys implements ChildCollection<AccountResource, AccountResource.SshKey> {
+  private final DynamicMap<RestView<AccountResource.SshKey>> views;
+  private final GetSshKeys list;
+  private final Provider<CurrentUser> self;
+  private final PermissionBackend permissionBackend;
+  private final VersionedAuthorizedKeys.Accessor authorizedKeys;
+
+  @Inject
+  SshKeys(
+      DynamicMap<RestView<AccountResource.SshKey>> views,
+      GetSshKeys list,
+      Provider<CurrentUser> self,
+      PermissionBackend permissionBackend,
+      VersionedAuthorizedKeys.Accessor authorizedKeys) {
+    this.views = views;
+    this.list = list;
+    this.self = self;
+    this.permissionBackend = permissionBackend;
+    this.authorizedKeys = authorizedKeys;
+  }
+
+  @Override
+  public RestView<AccountResource> list() {
+    return list;
+  }
+
+  @Override
+  public AccountResource.SshKey parse(AccountResource rsrc, IdString id)
+      throws ResourceNotFoundException, OrmException, IOException, ConfigInvalidException,
+          PermissionBackendException {
+    if (!self.get().hasSameAccountId(rsrc.getUser())) {
+      try {
+        permissionBackend.currentUser().check(GlobalPermission.MODIFY_ACCOUNT);
+      } catch (AuthException e) {
+        // If lacking MODIFY_ACCOUNT claim the resource does not exist.
+        throw new ResourceNotFoundException();
+      }
+    }
+    return parse(rsrc.getUser(), id);
+  }
+
+  public AccountResource.SshKey parse(IdentifiedUser user, IdString id)
+      throws ResourceNotFoundException, IOException, ConfigInvalidException {
+    try {
+      int seq = Integer.parseInt(id.get(), 10);
+      AccountSshKey sshKey = authorizedKeys.getKey(user.getAccountId(), seq);
+      if (sshKey == null) {
+        throw new ResourceNotFoundException(id);
+      }
+      return new AccountResource.SshKey(user, sshKey);
+    } catch (NumberFormatException e) {
+      throw new ResourceNotFoundException(id);
+    }
+  }
+
+  @Override
+  public DynamicMap<RestView<AccountResource.SshKey>> views() {
+    return views;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/account/StarredChanges.java b/java/com/google/gerrit/server/restapi/account/StarredChanges.java
new file mode 100644
index 0000000..4849698
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/StarredChanges.java
@@ -0,0 +1,200 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.account;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ChildCollection;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestCollectionCreateView;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.StarredChangesUtil;
+import com.google.gerrit.server.StarredChangesUtil.IllegalLabelException;
+import com.google.gerrit.server.StarredChangesUtil.MutuallyExclusiveLabelsException;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.restapi.change.ChangesCollection;
+import com.google.gerrit.server.restapi.change.QueryChanges;
+import com.google.gwtorm.server.OrmDuplicateKeyException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+
+@Singleton
+public class StarredChanges
+    implements ChildCollection<AccountResource, AccountResource.StarredChange> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final ChangesCollection changes;
+  private final DynamicMap<RestView<AccountResource.StarredChange>> views;
+  private final StarredChangesUtil starredChangesUtil;
+
+  @Inject
+  StarredChanges(
+      ChangesCollection changes,
+      DynamicMap<RestView<AccountResource.StarredChange>> views,
+      StarredChangesUtil starredChangesUtil) {
+    this.changes = changes;
+    this.views = views;
+    this.starredChangesUtil = starredChangesUtil;
+  }
+
+  @Override
+  public AccountResource.StarredChange parse(AccountResource parent, IdString id)
+      throws RestApiException, OrmException, PermissionBackendException, IOException {
+    IdentifiedUser user = parent.getUser();
+    ChangeResource change = changes.parse(TopLevelResource.INSTANCE, id);
+    if (starredChangesUtil
+        .getLabels(user.getAccountId(), change.getId())
+        .contains(StarredChangesUtil.DEFAULT_LABEL)) {
+      return new AccountResource.StarredChange(user, change);
+    }
+    throw new ResourceNotFoundException(id);
+  }
+
+  @Override
+  public DynamicMap<RestView<AccountResource.StarredChange>> views() {
+    return views;
+  }
+
+  @Override
+  public RestView<AccountResource> list() throws ResourceNotFoundException {
+    return new RestReadView<AccountResource>() {
+      @Override
+      public Object apply(AccountResource self)
+          throws BadRequestException, AuthException, OrmException, PermissionBackendException {
+        QueryChanges query = changes.list();
+        query.addQuery("starredby:" + self.getUser().getAccountId().get());
+        return query.apply(TopLevelResource.INSTANCE);
+      }
+    };
+  }
+
+  @Singleton
+  public static class Create
+      implements RestCollectionCreateView<
+          AccountResource, AccountResource.StarredChange, EmptyInput> {
+    private final Provider<CurrentUser> self;
+    private final ChangesCollection changes;
+    private final StarredChangesUtil starredChangesUtil;
+
+    @Inject
+    Create(
+        Provider<CurrentUser> self,
+        ChangesCollection changes,
+        StarredChangesUtil starredChangesUtil) {
+      this.self = self;
+      this.changes = changes;
+      this.starredChangesUtil = starredChangesUtil;
+    }
+
+    @Override
+    public Response<?> apply(AccountResource rsrc, IdString id, EmptyInput in)
+        throws RestApiException, OrmException, IOException {
+      if (!self.get().hasSameAccountId(rsrc.getUser())) {
+        throw new AuthException("not allowed to add starred change");
+      }
+
+      ChangeResource change;
+      try {
+        change = changes.parse(TopLevelResource.INSTANCE, id);
+      } catch (ResourceNotFoundException e) {
+        throw new UnprocessableEntityException(String.format("change %s not found", id.get()));
+      } catch (OrmException | PermissionBackendException | IOException e) {
+        logger.atSevere().withCause(e).log("cannot resolve change");
+        throw new UnprocessableEntityException("internal server error");
+      }
+
+      try {
+        starredChangesUtil.star(
+            self.get().getAccountId(),
+            change.getProject(),
+            change.getId(),
+            StarredChangesUtil.DEFAULT_LABELS,
+            null);
+      } catch (MutuallyExclusiveLabelsException e) {
+        throw new ResourceConflictException(e.getMessage());
+      } catch (IllegalLabelException e) {
+        throw new BadRequestException(e.getMessage());
+      } catch (OrmDuplicateKeyException e) {
+        return Response.none();
+      }
+      return Response.none();
+    }
+  }
+
+  @Singleton
+  public static class Put implements RestModifyView<AccountResource.StarredChange, EmptyInput> {
+    private final Provider<CurrentUser> self;
+
+    @Inject
+    Put(Provider<CurrentUser> self) {
+      this.self = self;
+    }
+
+    @Override
+    public Response<?> apply(AccountResource.StarredChange rsrc, EmptyInput in)
+        throws AuthException {
+      if (!self.get().hasSameAccountId(rsrc.getUser())) {
+        throw new AuthException("not allowed update starred changes");
+      }
+      return Response.none();
+    }
+  }
+
+  @Singleton
+  public static class Delete implements RestModifyView<AccountResource.StarredChange, EmptyInput> {
+    private final Provider<CurrentUser> self;
+    private final StarredChangesUtil starredChangesUtil;
+
+    @Inject
+    Delete(Provider<CurrentUser> self, StarredChangesUtil starredChangesUtil) {
+      this.self = self;
+      this.starredChangesUtil = starredChangesUtil;
+    }
+
+    @Override
+    public Response<?> apply(AccountResource.StarredChange rsrc, EmptyInput in)
+        throws AuthException, OrmException, IOException, IllegalLabelException {
+      if (!self.get().hasSameAccountId(rsrc.getUser())) {
+        throw new AuthException("not allowed remove starred change");
+      }
+      starredChangesUtil.star(
+          self.get().getAccountId(),
+          rsrc.getChange().getProject(),
+          rsrc.getChange().getId(),
+          null,
+          StarredChangesUtil.DEFAULT_LABELS);
+      return Response.none();
+    }
+  }
+
+  public static class EmptyInput {}
+}
diff --git a/java/com/google/gerrit/server/restapi/account/Stars.java b/java/com/google/gerrit/server/restapi/account/Stars.java
new file mode 100644
index 0000000..5c4c4d5
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/Stars.java
@@ -0,0 +1,161 @@
+// 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.
+
+package com.google.gerrit.server.restapi.account;
+
+import com.google.gerrit.extensions.api.changes.StarsInput;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ChildCollection;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.StarredChangesUtil;
+import com.google.gerrit.server.StarredChangesUtil.IllegalLabelException;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.AccountResource.Star;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.restapi.change.ChangesCollection;
+import com.google.gerrit.server.restapi.change.QueryChanges;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+import java.util.SortedSet;
+
+@Singleton
+public class Stars implements ChildCollection<AccountResource, AccountResource.Star> {
+
+  private final ChangesCollection changes;
+  private final ListStarredChanges listStarredChanges;
+  private final StarredChangesUtil starredChangesUtil;
+  private final DynamicMap<RestView<AccountResource.Star>> views;
+
+  @Inject
+  Stars(
+      ChangesCollection changes,
+      ListStarredChanges listStarredChanges,
+      StarredChangesUtil starredChangesUtil,
+      DynamicMap<RestView<AccountResource.Star>> views) {
+    this.changes = changes;
+    this.listStarredChanges = listStarredChanges;
+    this.starredChangesUtil = starredChangesUtil;
+    this.views = views;
+  }
+
+  @Override
+  public Star parse(AccountResource parent, IdString id)
+      throws RestApiException, OrmException, PermissionBackendException, IOException {
+    IdentifiedUser user = parent.getUser();
+    ChangeResource change = changes.parse(TopLevelResource.INSTANCE, id);
+    Set<String> labels = starredChangesUtil.getLabels(user.getAccountId(), change.getId());
+    return new AccountResource.Star(user, change, labels);
+  }
+
+  @Override
+  public DynamicMap<RestView<Star>> views() {
+    return views;
+  }
+
+  @Override
+  public ListStarredChanges list() {
+    return listStarredChanges;
+  }
+
+  @Singleton
+  public static class ListStarredChanges implements RestReadView<AccountResource> {
+    private final Provider<CurrentUser> self;
+    private final ChangesCollection changes;
+
+    @Inject
+    ListStarredChanges(Provider<CurrentUser> self, ChangesCollection changes) {
+      this.self = self;
+      this.changes = changes;
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public List<ChangeInfo> apply(AccountResource rsrc)
+        throws BadRequestException, AuthException, OrmException, PermissionBackendException {
+      if (!self.get().hasSameAccountId(rsrc.getUser())) {
+        throw new AuthException("not allowed to list stars of another account");
+      }
+      QueryChanges query = changes.list();
+      query.addQuery("has:stars");
+      return (List<ChangeInfo>) query.apply(TopLevelResource.INSTANCE);
+    }
+  }
+
+  @Singleton
+  public static class Get implements RestReadView<AccountResource.Star> {
+    private final Provider<CurrentUser> self;
+    private final StarredChangesUtil starredChangesUtil;
+
+    @Inject
+    Get(Provider<CurrentUser> self, StarredChangesUtil starredChangesUtil) {
+      this.self = self;
+      this.starredChangesUtil = starredChangesUtil;
+    }
+
+    @Override
+    public SortedSet<String> apply(AccountResource.Star rsrc) throws AuthException, OrmException {
+      if (!self.get().hasSameAccountId(rsrc.getUser())) {
+        throw new AuthException("not allowed to get stars of another account");
+      }
+      return starredChangesUtil.getLabels(self.get().getAccountId(), rsrc.getChange().getId());
+    }
+  }
+
+  @Singleton
+  public static class Post implements RestModifyView<AccountResource.Star, StarsInput> {
+    private final Provider<CurrentUser> self;
+    private final StarredChangesUtil starredChangesUtil;
+
+    @Inject
+    Post(Provider<CurrentUser> self, StarredChangesUtil starredChangesUtil) {
+      this.self = self;
+      this.starredChangesUtil = starredChangesUtil;
+    }
+
+    @Override
+    public Collection<String> apply(AccountResource.Star rsrc, StarsInput in)
+        throws AuthException, BadRequestException, OrmException {
+      if (!self.get().hasSameAccountId(rsrc.getUser())) {
+        throw new AuthException("not allowed to update stars of another account");
+      }
+      try {
+        return starredChangesUtil.star(
+            self.get().getAccountId(),
+            rsrc.getChange().getProject(),
+            rsrc.getChange().getId(),
+            in.add,
+            in.remove);
+      } catch (IllegalLabelException e) {
+        throw new BadRequestException(e.getMessage());
+      }
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/Abandon.java b/java/com/google/gerrit/server/restapi/change/Abandon.java
new file mode 100644
index 0000000..ccce998
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/Abandon.java
@@ -0,0 +1,169 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.change;
+
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.ListMultimap;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.changes.AbandonInput;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.api.changes.RecipientType;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.webui.UiAction;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.change.AbandonOp;
+import com.google.gerrit.server.change.ChangeJson;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.NotifyUtil;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestModifyView;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class Abandon extends RetryingRestModifyView<ChangeResource, AbandonInput, ChangeInfo>
+    implements UiAction<ChangeResource> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final Provider<ReviewDb> dbProvider;
+  private final ChangeJson.Factory json;
+  private final AbandonOp.Factory abandonOpFactory;
+  private final NotifyUtil notifyUtil;
+  private final PatchSetUtil patchSetUtil;
+
+  @Inject
+  Abandon(
+      Provider<ReviewDb> dbProvider,
+      ChangeJson.Factory json,
+      RetryHelper retryHelper,
+      AbandonOp.Factory abandonOpFactory,
+      NotifyUtil notifyUtil,
+      PatchSetUtil patchSetUtil) {
+    super(retryHelper);
+    this.dbProvider = dbProvider;
+    this.json = json;
+    this.abandonOpFactory = abandonOpFactory;
+    this.notifyUtil = notifyUtil;
+    this.patchSetUtil = patchSetUtil;
+  }
+
+  @Override
+  protected ChangeInfo applyImpl(
+      BatchUpdate.Factory updateFactory, ChangeResource rsrc, AbandonInput input)
+      throws RestApiException, UpdateException, OrmException, PermissionBackendException,
+          IOException, ConfigInvalidException {
+    // Not allowed to abandon if the current patch set is locked.
+    patchSetUtil.checkPatchSetNotLocked(rsrc.getNotes());
+
+    rsrc.permissions().database(dbProvider).check(ChangePermission.ABANDON);
+
+    NotifyHandling notify = input.notify == null ? defaultNotify(rsrc.getChange()) : input.notify;
+    Change change =
+        abandon(
+            updateFactory,
+            rsrc.getNotes(),
+            rsrc.getUser(),
+            input.message,
+            notify,
+            notifyUtil.resolveAccounts(input.notifyDetails));
+    return json.noOptions().format(change);
+  }
+
+  private NotifyHandling defaultNotify(Change change) {
+    return change.hasReviewStarted() ? NotifyHandling.ALL : NotifyHandling.OWNER;
+  }
+
+  public Change abandon(BatchUpdate.Factory updateFactory, ChangeNotes notes, CurrentUser user)
+      throws RestApiException, UpdateException {
+    return abandon(
+        updateFactory,
+        notes,
+        user,
+        "",
+        defaultNotify(notes.getChange()),
+        ImmutableListMultimap.of());
+  }
+
+  public Change abandon(
+      BatchUpdate.Factory updateFactory, ChangeNotes notes, CurrentUser user, String msgTxt)
+      throws RestApiException, UpdateException {
+    return abandon(
+        updateFactory,
+        notes,
+        user,
+        msgTxt,
+        defaultNotify(notes.getChange()),
+        ImmutableListMultimap.of());
+  }
+
+  public Change abandon(
+      BatchUpdate.Factory updateFactory,
+      ChangeNotes notes,
+      CurrentUser user,
+      String msgTxt,
+      NotifyHandling notifyHandling,
+      ListMultimap<RecipientType, Account.Id> accountsToNotify)
+      throws RestApiException, UpdateException {
+    AccountState accountState = user.isIdentifiedUser() ? user.asIdentifiedUser().state() : null;
+    AbandonOp op = abandonOpFactory.create(accountState, msgTxt, notifyHandling, accountsToNotify);
+    try (BatchUpdate u =
+        updateFactory.create(dbProvider.get(), notes.getProjectName(), user, TimeUtil.nowTs())) {
+      u.addOp(notes.getChangeId(), op).execute();
+    }
+    return op.getChange();
+  }
+
+  @Override
+  public UiAction.Description getDescription(ChangeResource rsrc) {
+    UiAction.Description description =
+        new UiAction.Description()
+            .setLabel("Abandon")
+            .setTitle("Abandon the change")
+            .setVisible(false);
+
+    Change change = rsrc.getChange();
+    if (!change.getStatus().isOpen()) {
+      return description;
+    }
+
+    try {
+      if (patchSetUtil.isPatchSetLocked(rsrc.getNotes())) {
+        return description;
+      }
+    } catch (OrmException | IOException e) {
+      logger.atSevere().withCause(e).log(
+          "Failed to check if the current patch set of change %s is locked", change.getId());
+      return description;
+    }
+
+    return description.setVisible(rsrc.permissions().testOrFalse(ChangePermission.ABANDON));
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/AllowedFormats.java b/java/com/google/gerrit/server/restapi/change/AllowedFormats.java
new file mode 100644
index 0000000..2e313a1
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/AllowedFormats.java
@@ -0,0 +1,59 @@
+// 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.
+
+package com.google.gerrit.server.restapi.change;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Sets;
+import com.google.gerrit.server.change.ArchiveFormat;
+import com.google.gerrit.server.config.DownloadConfig;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+@Singleton
+public class AllowedFormats {
+  final ImmutableMap<String, ArchiveFormat> extensions;
+  final ImmutableSet<ArchiveFormat> allowed;
+
+  @Inject
+  AllowedFormats(DownloadConfig cfg) {
+    Map<String, ArchiveFormat> exts = new HashMap<>();
+    for (ArchiveFormat format : cfg.getArchiveFormats()) {
+      for (String ext : format.getSuffixes()) {
+        exts.put(ext, format);
+      }
+      exts.put(format.name().toLowerCase(), format);
+    }
+    extensions = ImmutableMap.copyOf(exts);
+
+    // Zip is not supported because it may be interpreted by a Java plugin as a
+    // valid JAR file, whose code would have access to cookies on the domain.
+    allowed =
+        Sets.immutableEnumSet(
+            Iterables.filter(cfg.getArchiveFormats(), f -> f != ArchiveFormat.ZIP));
+  }
+
+  public Set<ArchiveFormat> getAllowed() {
+    return allowed;
+  }
+
+  public ImmutableMap<String, ArchiveFormat> getExtensions() {
+    return extensions;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/ApplyFix.java b/java/com/google/gerrit/server/restapi/change/ApplyFix.java
new file mode 100644
index 0000000..e4940ec
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/ApplyFix.java
@@ -0,0 +1,90 @@
+// Copyright (C) 2017 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.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.common.EditInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.change.FixResource;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.edit.ChangeEdit;
+import com.google.gerrit.server.edit.ChangeEditJson;
+import com.google.gerrit.server.edit.ChangeEditModifier;
+import com.google.gerrit.server.edit.tree.TreeModification;
+import com.google.gerrit.server.fixes.FixReplacementInterpreter;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.InvalidChangeOperationException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.List;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+
+@Singleton
+public class ApplyFix implements RestModifyView<FixResource, Void> {
+
+  private final GitRepositoryManager gitRepositoryManager;
+  private final FixReplacementInterpreter fixReplacementInterpreter;
+  private final ChangeEditModifier changeEditModifier;
+  private final ChangeEditJson changeEditJson;
+  private final ProjectCache projectCache;
+
+  @Inject
+  public ApplyFix(
+      GitRepositoryManager gitRepositoryManager,
+      FixReplacementInterpreter fixReplacementInterpreter,
+      ChangeEditModifier changeEditModifier,
+      ChangeEditJson changeEditJson,
+      ProjectCache projectCache) {
+    this.gitRepositoryManager = gitRepositoryManager;
+    this.fixReplacementInterpreter = fixReplacementInterpreter;
+    this.changeEditModifier = changeEditModifier;
+    this.changeEditJson = changeEditJson;
+    this.projectCache = projectCache;
+  }
+
+  @Override
+  public Response<EditInfo> apply(FixResource fixResource, Void nothing)
+      throws AuthException, OrmException, ResourceConflictException, IOException,
+          ResourceNotFoundException, PermissionBackendException {
+    RevisionResource revisionResource = fixResource.getRevisionResource();
+    Project.NameKey project = revisionResource.getProject();
+    ProjectState projectState = projectCache.checkedGet(project);
+    PatchSet patchSet = revisionResource.getPatchSet();
+    ObjectId patchSetCommitId = ObjectId.fromString(patchSet.getRevision().get());
+
+    try (Repository repository = gitRepositoryManager.openRepository(project)) {
+      List<TreeModification> treeModifications =
+          fixReplacementInterpreter.toTreeModifications(
+              repository, projectState, patchSetCommitId, fixResource.getFixReplacements());
+      ChangeEdit changeEdit =
+          changeEditModifier.combineWithModifiedPatchSetTree(
+              repository, revisionResource.getNotes(), patchSet, treeModifications);
+      return Response.ok(changeEditJson.toEditInfo(changeEdit, false));
+    } catch (InvalidChangeOperationException e) {
+      throw new ResourceConflictException(e.getMessage());
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/ChangeEdits.java b/java/com/google/gerrit/server/restapi/change/ChangeEdits.java
new file mode 100644
index 0000000..cabb30d
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/ChangeEdits.java
@@ -0,0 +1,489 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.change;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.common.DiffWebLinkInfo;
+import com.google.gerrit.extensions.common.EditInfo;
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.BinaryResult;
+import com.google.gerrit.extensions.restapi.ChildCollection;
+import com.google.gerrit.extensions.restapi.DefaultInput;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.RawInput;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestCollectionCreateView;
+import com.google.gerrit.extensions.restapi.RestCollectionDeleteMissingView;
+import com.google.gerrit.extensions.restapi.RestCollectionModifyView;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.WebLinks;
+import com.google.gerrit.server.change.ChangeEditResource;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.FileContentUtil;
+import com.google.gerrit.server.change.FileInfoJson;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.edit.ChangeEdit;
+import com.google.gerrit.server.edit.ChangeEditJson;
+import com.google.gerrit.server.edit.ChangeEditModifier;
+import com.google.gerrit.server.edit.ChangeEditUtil;
+import com.google.gerrit.server.edit.UnchangedCommitMessageException;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.InvalidChangeOperationException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.List;
+import java.util.Optional;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.kohsuke.args4j.Option;
+
+@Singleton
+public class ChangeEdits implements ChildCollection<ChangeResource, ChangeEditResource> {
+  private final DynamicMap<RestView<ChangeEditResource>> views;
+  private final Provider<Detail> detail;
+  private final ChangeEditUtil editUtil;
+
+  @Inject
+  ChangeEdits(
+      DynamicMap<RestView<ChangeEditResource>> views,
+      Provider<Detail> detail,
+      ChangeEditUtil editUtil) {
+    this.views = views;
+    this.detail = detail;
+    this.editUtil = editUtil;
+  }
+
+  @Override
+  public DynamicMap<RestView<ChangeEditResource>> views() {
+    return views;
+  }
+
+  @Override
+  public RestView<ChangeResource> list() {
+    return detail.get();
+  }
+
+  @Override
+  public ChangeEditResource parse(ChangeResource rsrc, IdString id)
+      throws ResourceNotFoundException, AuthException, IOException, OrmException {
+    Optional<ChangeEdit> edit = editUtil.byChange(rsrc.getNotes(), rsrc.getUser());
+    if (!edit.isPresent()) {
+      throw new ResourceNotFoundException(id);
+    }
+    return new ChangeEditResource(rsrc, edit.get(), id.get());
+  }
+
+  /**
+   * Create handler that is activated when collection element is accessed but doesn't exist, e. g.
+   * PUT request with a path was called but change edit wasn't created yet. Change edit is created
+   * and PUT handler is called.
+   */
+  public static class Create
+      implements RestCollectionCreateView<ChangeResource, ChangeEditResource, Put.Input> {
+    private final Put putEdit;
+
+    @Inject
+    Create(Put putEdit) {
+      this.putEdit = putEdit;
+    }
+
+    @Override
+    public Response<?> apply(ChangeResource resource, IdString id, Put.Input input)
+        throws AuthException, ResourceConflictException, IOException, OrmException,
+            PermissionBackendException {
+      putEdit.apply(resource, id.get(), input.content);
+      return Response.none();
+    }
+  }
+
+  public static class DeleteFile
+      implements RestCollectionDeleteMissingView<ChangeResource, ChangeEditResource, Input> {
+    private final DeleteContent deleteContent;
+
+    @Inject
+    DeleteFile(DeleteContent deleteContent) {
+      this.deleteContent = deleteContent;
+    }
+
+    @Override
+    public Response<?> apply(ChangeResource rsrc, IdString id, Input in)
+        throws IOException, AuthException, ResourceConflictException, OrmException,
+            PermissionBackendException {
+      return deleteContent.apply(rsrc, id.get());
+    }
+  }
+
+  // TODO(davido): Turn the boolean options to ChangeEditOption enum,
+  // like it's already the case for ListChangesOption/ListGroupsOption
+  public static class Detail implements RestReadView<ChangeResource> {
+    private final ChangeEditUtil editUtil;
+    private final ChangeEditJson editJson;
+    private final FileInfoJson fileInfoJson;
+    private final Revisions revisions;
+
+    private String base;
+    private boolean list;
+    private boolean downloadCommands;
+
+    @Option(name = "--base", metaVar = "revision-id")
+    public void setBase(String base) {
+      this.base = base;
+    }
+
+    @Option(name = "--list")
+    public void setList(boolean list) {
+      this.list = list;
+    }
+
+    @Option(name = "--download-commands")
+    public void setDownloadCommands(boolean downloadCommands) {
+      this.downloadCommands = downloadCommands;
+    }
+
+    @Inject
+    Detail(
+        ChangeEditUtil editUtil,
+        ChangeEditJson editJson,
+        FileInfoJson fileInfoJson,
+        Revisions revisions) {
+      this.editJson = editJson;
+      this.editUtil = editUtil;
+      this.fileInfoJson = fileInfoJson;
+      this.revisions = revisions;
+    }
+
+    @Override
+    public Response<EditInfo> apply(ChangeResource rsrc)
+        throws AuthException, IOException, ResourceNotFoundException, OrmException,
+            PermissionBackendException {
+      Optional<ChangeEdit> edit = editUtil.byChange(rsrc.getNotes(), rsrc.getUser());
+      if (!edit.isPresent()) {
+        return Response.none();
+      }
+
+      EditInfo editInfo = editJson.toEditInfo(edit.get(), downloadCommands);
+      if (list) {
+        PatchSet basePatchSet = null;
+        if (base != null) {
+          RevisionResource baseResource = revisions.parse(rsrc, IdString.fromDecoded(base));
+          basePatchSet = baseResource.getPatchSet();
+        }
+        try {
+          editInfo.files =
+              fileInfoJson.toFileInfoMap(
+                  rsrc.getChange(), edit.get().getEditCommit(), basePatchSet);
+        } catch (PatchListNotAvailableException e) {
+          throw new ResourceNotFoundException(e.getMessage());
+        }
+      }
+      return Response.ok(editInfo);
+    }
+  }
+
+  /**
+   * Post to edit collection resource. Two different operations are supported:
+   *
+   * <ul>
+   *   <li>Create non existing change edit
+   *   <li>Restore path in existing change edit
+   * </ul>
+   *
+   * The combination of two operations in one request is supported.
+   */
+  @Singleton
+  public static class Post
+      implements RestCollectionModifyView<ChangeResource, ChangeEditResource, Post.Input> {
+    public static class Input {
+      public String restorePath;
+      public String oldPath;
+      public String newPath;
+    }
+
+    private final ChangeEditModifier editModifier;
+    private final GitRepositoryManager repositoryManager;
+
+    @Inject
+    Post(ChangeEditModifier editModifier, GitRepositoryManager repositoryManager) {
+      this.editModifier = editModifier;
+      this.repositoryManager = repositoryManager;
+    }
+
+    @Override
+    public Response<?> apply(ChangeResource resource, Post.Input input)
+        throws AuthException, IOException, ResourceConflictException, OrmException,
+            PermissionBackendException {
+      Project.NameKey project = resource.getProject();
+      try (Repository repository = repositoryManager.openRepository(project)) {
+        if (isRestoreFile(input)) {
+          editModifier.restoreFile(repository, resource.getNotes(), input.restorePath);
+        } else if (isRenameFile(input)) {
+          editModifier.renameFile(repository, resource.getNotes(), input.oldPath, input.newPath);
+        } else {
+          editModifier.createEdit(repository, resource.getNotes());
+        }
+      } catch (InvalidChangeOperationException e) {
+        throw new ResourceConflictException(e.getMessage());
+      }
+      return Response.none();
+    }
+
+    private static boolean isRestoreFile(Input input) {
+      return input != null && !Strings.isNullOrEmpty(input.restorePath);
+    }
+
+    private static boolean isRenameFile(Input input) {
+      return input != null
+          && !Strings.isNullOrEmpty(input.oldPath)
+          && !Strings.isNullOrEmpty(input.newPath);
+    }
+  }
+
+  /** Put handler that is activated when PUT request is called on collection element. */
+  @Singleton
+  public static class Put implements RestModifyView<ChangeEditResource, Put.Input> {
+    public static class Input {
+      @DefaultInput public RawInput content;
+    }
+
+    private final ChangeEditModifier editModifier;
+    private final GitRepositoryManager repositoryManager;
+
+    @Inject
+    Put(ChangeEditModifier editModifier, GitRepositoryManager repositoryManager) {
+      this.editModifier = editModifier;
+      this.repositoryManager = repositoryManager;
+    }
+
+    @Override
+    public Response<?> apply(ChangeEditResource rsrc, Input input)
+        throws AuthException, ResourceConflictException, IOException, OrmException,
+            PermissionBackendException {
+      return apply(rsrc.getChangeResource(), rsrc.getPath(), input.content);
+    }
+
+    public Response<?> apply(ChangeResource rsrc, String path, RawInput newContent)
+        throws ResourceConflictException, AuthException, IOException, OrmException,
+            PermissionBackendException {
+      if (Strings.isNullOrEmpty(path) || path.charAt(0) == '/') {
+        throw new ResourceConflictException("Invalid path: " + path);
+      }
+
+      try (Repository repository = repositoryManager.openRepository(rsrc.getProject())) {
+        editModifier.modifyFile(repository, rsrc.getNotes(), path, newContent);
+      } catch (InvalidChangeOperationException e) {
+        throw new ResourceConflictException(e.getMessage());
+      }
+      return Response.none();
+    }
+  }
+
+  /**
+   * Handler to delete a file.
+   *
+   * <p>This deletes the file from the repository completely. This is not the same as reverting or
+   * restoring a file to its previous contents.
+   */
+  @Singleton
+  public static class DeleteContent implements RestModifyView<ChangeEditResource, Input> {
+
+    private final ChangeEditModifier editModifier;
+    private final GitRepositoryManager repositoryManager;
+
+    @Inject
+    DeleteContent(ChangeEditModifier editModifier, GitRepositoryManager repositoryManager) {
+      this.editModifier = editModifier;
+      this.repositoryManager = repositoryManager;
+    }
+
+    @Override
+    public Response<?> apply(ChangeEditResource rsrc, Input input)
+        throws AuthException, ResourceConflictException, OrmException, IOException,
+            PermissionBackendException {
+      return apply(rsrc.getChangeResource(), rsrc.getPath());
+    }
+
+    public Response<?> apply(ChangeResource rsrc, String filePath)
+        throws AuthException, IOException, OrmException, ResourceConflictException,
+            PermissionBackendException {
+      try (Repository repository = repositoryManager.openRepository(rsrc.getProject())) {
+        editModifier.deleteFile(repository, rsrc.getNotes(), filePath);
+      } catch (InvalidChangeOperationException e) {
+        throw new ResourceConflictException(e.getMessage());
+      }
+      return Response.none();
+    }
+  }
+
+  public static class Get implements RestReadView<ChangeEditResource> {
+    private final FileContentUtil fileContentUtil;
+    private final ProjectCache projectCache;
+
+    @Option(
+        name = "--base",
+        aliases = {"-b"},
+        usage = "whether to load the content on the base revision instead of the change edit")
+    private boolean base;
+
+    @Inject
+    Get(FileContentUtil fileContentUtil, ProjectCache projectCache) {
+      this.fileContentUtil = fileContentUtil;
+      this.projectCache = projectCache;
+    }
+
+    @Override
+    public Response<BinaryResult> apply(ChangeEditResource rsrc) throws IOException {
+      try {
+        ChangeEdit edit = rsrc.getChangeEdit();
+        return Response.ok(
+            fileContentUtil.getContent(
+                projectCache.checkedGet(rsrc.getChangeResource().getProject()),
+                base
+                    ? ObjectId.fromString(edit.getBasePatchSet().getRevision().get())
+                    : edit.getEditCommit(),
+                rsrc.getPath(),
+                null));
+      } catch (ResourceNotFoundException | BadRequestException e) {
+        return Response.none();
+      }
+    }
+  }
+
+  @Singleton
+  public static class GetMeta implements RestReadView<ChangeEditResource> {
+    private final WebLinks webLinks;
+
+    @Inject
+    GetMeta(WebLinks webLinks) {
+      this.webLinks = webLinks;
+    }
+
+    @Override
+    public FileInfo apply(ChangeEditResource rsrc) {
+      FileInfo r = new FileInfo();
+      ChangeEdit edit = rsrc.getChangeEdit();
+      Change change = edit.getChange();
+      List<DiffWebLinkInfo> links =
+          webLinks.getDiffLinks(
+              change.getProject().get(),
+              change.getChangeId(),
+              edit.getBasePatchSet().getPatchSetId(),
+              edit.getBasePatchSet().getRefName(),
+              rsrc.getPath(),
+              0,
+              edit.getRefName(),
+              rsrc.getPath());
+      r.webLinks = links.isEmpty() ? null : links;
+      return r;
+    }
+
+    public static class FileInfo {
+      public List<DiffWebLinkInfo> webLinks;
+    }
+  }
+
+  @Singleton
+  public static class EditMessage implements RestModifyView<ChangeResource, EditMessage.Input> {
+    public static class Input {
+      @DefaultInput public String message;
+    }
+
+    private final ChangeEditModifier editModifier;
+    private final GitRepositoryManager repositoryManager;
+
+    @Inject
+    EditMessage(ChangeEditModifier editModifier, GitRepositoryManager repositoryManager) {
+      this.editModifier = editModifier;
+      this.repositoryManager = repositoryManager;
+    }
+
+    @Override
+    public Object apply(ChangeResource rsrc, Input input)
+        throws AuthException, IOException, BadRequestException, ResourceConflictException,
+            OrmException, PermissionBackendException {
+      if (input == null || Strings.isNullOrEmpty(input.message)) {
+        throw new BadRequestException("commit message must be provided");
+      }
+
+      Project.NameKey project = rsrc.getProject();
+      try (Repository repository = repositoryManager.openRepository(project)) {
+        editModifier.modifyMessage(repository, rsrc.getNotes(), input.message);
+      } catch (UnchangedCommitMessageException e) {
+        throw new ResourceConflictException(e.getMessage());
+      }
+
+      return Response.none();
+    }
+  }
+
+  public static class GetMessage implements RestReadView<ChangeResource> {
+    private final GitRepositoryManager repoManager;
+    private final ChangeEditUtil editUtil;
+
+    @Option(
+        name = "--base",
+        aliases = {"-b"},
+        usage = "whether to load the message on the base revision instead of the change edit")
+    private boolean base;
+
+    @Inject
+    GetMessage(GitRepositoryManager repoManager, ChangeEditUtil editUtil) {
+      this.repoManager = repoManager;
+      this.editUtil = editUtil;
+    }
+
+    @Override
+    public BinaryResult apply(ChangeResource rsrc)
+        throws AuthException, IOException, ResourceNotFoundException, OrmException {
+      Optional<ChangeEdit> edit = editUtil.byChange(rsrc.getNotes(), rsrc.getUser());
+      String msg;
+      if (edit.isPresent()) {
+        if (base) {
+          try (Repository repo = repoManager.openRepository(rsrc.getProject());
+              RevWalk rw = new RevWalk(repo)) {
+            RevCommit commit =
+                rw.parseCommit(
+                    ObjectId.fromString(edit.get().getBasePatchSet().getRevision().get()));
+            msg = commit.getFullMessage();
+          }
+        } else {
+          msg = edit.get().getEditCommit().getFullMessage();
+        }
+
+        return BinaryResult.create(msg)
+            .setContentType(FileContentUtil.TEXT_X_GERRIT_COMMIT_MESSAGE)
+            .base64();
+      }
+      throw new ResourceNotFoundException();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/ChangeIncludedIn.java b/java/com/google/gerrit/server/restapi/change/ChangeIncludedIn.java
new file mode 100644
index 0000000..12b3797
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/ChangeIncludedIn.java
@@ -0,0 +1,50 @@
+// 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.
+
+package com.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.api.changes.IncludedInInfo;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.IncludedIn;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+
+@Singleton
+public class ChangeIncludedIn implements RestReadView<ChangeResource> {
+  private Provider<ReviewDb> db;
+  private PatchSetUtil psUtil;
+  private IncludedIn includedIn;
+
+  @Inject
+  ChangeIncludedIn(Provider<ReviewDb> db, PatchSetUtil psUtil, IncludedIn includedIn) {
+    this.db = db;
+    this.psUtil = psUtil;
+    this.includedIn = includedIn;
+  }
+
+  @Override
+  public IncludedInInfo apply(ChangeResource rsrc)
+      throws RestApiException, OrmException, IOException {
+    PatchSet ps = psUtil.current(db.get(), rsrc.getNotes());
+    return includedIn.apply(rsrc.getProject(), ps.getRevision().get());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/ChangeMessages.java b/java/com/google/gerrit/server/restapi/change/ChangeMessages.java
new file mode 100644
index 0000000..25fc350
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/ChangeMessages.java
@@ -0,0 +1,74 @@
+// 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.
+
+package com.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.common.ChangeMessageInfo;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.ChildCollection;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.server.change.ChangeMessageResource;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.List;
+
+@Singleton
+public class ChangeMessages implements ChildCollection<ChangeResource, ChangeMessageResource> {
+  private final DynamicMap<RestView<ChangeMessageResource>> views;
+  private final ListChangeMessages listChangeMessages;
+
+  @Inject
+  ChangeMessages(
+      DynamicMap<RestView<ChangeMessageResource>> views, ListChangeMessages listChangeMessages) {
+    this.views = views;
+    this.listChangeMessages = listChangeMessages;
+  }
+
+  @Override
+  public DynamicMap<RestView<ChangeMessageResource>> views() {
+    return views;
+  }
+
+  @Override
+  public ListChangeMessages list() {
+    return listChangeMessages;
+  }
+
+  @Override
+  public ChangeMessageResource parse(ChangeResource parent, IdString id)
+      throws OrmException, ResourceNotFoundException, PermissionBackendException {
+    String uuid = id.get();
+
+    List<ChangeMessageInfo> changeMessages = listChangeMessages.apply(parent);
+    int index = -1;
+    for (int i = 0; i < changeMessages.size(); ++i) {
+      ChangeMessageInfo changeMessage = changeMessages.get(i);
+      if (changeMessage.id.equals(uuid)) {
+        index = i;
+        break;
+      }
+    }
+
+    if (index < 0) {
+      throw new ResourceNotFoundException(String.format("change message %s not found", uuid));
+    }
+
+    return new ChangeMessageResource(parent, changeMessages.get(index), index);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/ChangesCollection.java b/java/com/google/gerrit/server/restapi/change/ChangesCollection.java
new file mode 100644
index 0000000..561c27c
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/ChangesCollection.java
@@ -0,0 +1,149 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestCollection;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.change.ChangeFinder;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.List;
+
+@Singleton
+public class ChangesCollection implements RestCollection<TopLevelResource, ChangeResource> {
+  private final Provider<ReviewDb> db;
+  private final Provider<CurrentUser> user;
+  private final Provider<QueryChanges> queryFactory;
+  private final DynamicMap<RestView<ChangeResource>> views;
+  private final ChangeFinder changeFinder;
+  private final ChangeResource.Factory changeResourceFactory;
+  private final PermissionBackend permissionBackend;
+  private final ProjectCache projectCache;
+
+  @Inject
+  public ChangesCollection(
+      Provider<ReviewDb> db,
+      Provider<CurrentUser> user,
+      Provider<QueryChanges> queryFactory,
+      DynamicMap<RestView<ChangeResource>> views,
+      ChangeFinder changeFinder,
+      ChangeResource.Factory changeResourceFactory,
+      PermissionBackend permissionBackend,
+      ProjectCache projectCache) {
+    this.db = db;
+    this.user = user;
+    this.queryFactory = queryFactory;
+    this.views = views;
+    this.changeFinder = changeFinder;
+    this.changeResourceFactory = changeResourceFactory;
+    this.permissionBackend = permissionBackend;
+    this.projectCache = projectCache;
+  }
+
+  @Override
+  public QueryChanges list() {
+    return queryFactory.get();
+  }
+
+  @Override
+  public DynamicMap<RestView<ChangeResource>> views() {
+    return views;
+  }
+
+  @Override
+  public ChangeResource parse(TopLevelResource root, IdString id)
+      throws RestApiException, OrmException, PermissionBackendException, IOException {
+    List<ChangeNotes> notes = changeFinder.find(id.encoded(), true);
+    if (notes.isEmpty()) {
+      throw new ResourceNotFoundException(id);
+    } else if (notes.size() != 1) {
+      throw new ResourceNotFoundException("Multiple changes found for " + id);
+    }
+
+    ChangeNotes change = notes.get(0);
+    if (!canRead(change)) {
+      throw new ResourceNotFoundException(id);
+    }
+    checkProjectStatePermitsRead(change.getProjectName());
+    return changeResourceFactory.create(change, user.get());
+  }
+
+  public ChangeResource parse(Change.Id id)
+      throws RestApiException, OrmException, PermissionBackendException, IOException {
+    List<ChangeNotes> notes = changeFinder.find(id);
+    if (notes.isEmpty()) {
+      throw new ResourceNotFoundException(toIdString(id));
+    } else if (notes.size() != 1) {
+      throw new ResourceNotFoundException("Multiple changes found for " + id);
+    }
+
+    ChangeNotes change = notes.get(0);
+    if (!canRead(change)) {
+      throw new ResourceNotFoundException(toIdString(id));
+    }
+    checkProjectStatePermitsRead(change.getProjectName());
+    return changeResourceFactory.create(change, user.get());
+  }
+
+  private static IdString toIdString(Change.Id id) {
+    return IdString.fromDecoded(id.toString());
+  }
+
+  public ChangeResource parse(ChangeNotes notes, CurrentUser user) {
+    return changeResourceFactory.create(notes, user);
+  }
+
+  private boolean canRead(ChangeNotes notes) throws PermissionBackendException, IOException {
+    try {
+      permissionBackend.currentUser().change(notes).database(db).check(ChangePermission.READ);
+    } catch (AuthException e) {
+      return false;
+    }
+    ProjectState projectState = projectCache.checkedGet(notes.getProjectName());
+    if (projectState == null) {
+      return false;
+    }
+    return projectState.statePermitsRead();
+  }
+
+  private void checkProjectStatePermitsRead(Project.NameKey project)
+      throws IOException, RestApiException {
+    ProjectState projectState = projectCache.checkedGet(project);
+    if (projectState == null) {
+      throw new ResourceNotFoundException("project not found: " + project.get());
+    }
+    projectState.checkStatePermitsRead();
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/Check.java b/java/com/google/gerrit/server/restapi/change/Check.java
new file mode 100644
index 0000000..dd0ce10
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/Check.java
@@ -0,0 +1,72 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.api.changes.FixInput;
+import com.google.gerrit.extensions.client.ListChangesOption;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.change.ChangeJson;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.project.NoSuchProjectException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+
+@Singleton
+public class Check
+    implements RestReadView<ChangeResource>, RestModifyView<ChangeResource, FixInput> {
+  private final PermissionBackend permissionBackend;
+  private final ChangeJson.Factory jsonFactory;
+
+  @Inject
+  Check(PermissionBackend permissionBackend, ChangeJson.Factory json) {
+    this.permissionBackend = permissionBackend;
+    this.jsonFactory = json;
+  }
+
+  @Override
+  public Response<ChangeInfo> apply(ChangeResource rsrc) throws RestApiException, OrmException {
+    return Response.withMustRevalidate(newChangeJson().format(rsrc));
+  }
+
+  @Override
+  public Response<ChangeInfo> apply(ChangeResource rsrc, FixInput input)
+      throws RestApiException, OrmException, PermissionBackendException, NoSuchProjectException,
+          IOException {
+    PermissionBackend.WithUser perm = permissionBackend.currentUser();
+    if (!rsrc.isUserOwner()) {
+      try {
+        perm.project(rsrc.getProject()).check(ProjectPermission.READ_CONFIG);
+      } catch (AuthException e) {
+        perm.check(GlobalPermission.MAINTAIN_SERVER);
+      }
+    }
+    return Response.withMustRevalidate(newChangeJson().fix(input).format(rsrc));
+  }
+
+  private ChangeJson newChangeJson() {
+    return jsonFactory.create(ListChangesOption.CHECK);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/CherryPick.java b/java/com/google/gerrit/server/restapi/change/CherryPick.java
new file mode 100644
index 0000000..b68122e
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/CherryPick.java
@@ -0,0 +1,141 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.change;
+
+import static com.google.gerrit.extensions.conditions.BooleanCondition.and;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.changes.CherryPickInput;
+import com.google.gerrit.extensions.common.CherryPickChangeInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.webui.UiAction;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.change.ChangeJson;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.gerrit.server.project.ContributorAgreementsChecker;
+import com.google.gerrit.server.project.InvalidChangeOperationException;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.project.NoSuchProjectException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.submit.IntegrationException;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestModifyView;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class CherryPick
+    extends RetryingRestModifyView<RevisionResource, CherryPickInput, CherryPickChangeInfo>
+    implements UiAction<RevisionResource> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final PermissionBackend permissionBackend;
+  private final CherryPickChange cherryPickChange;
+  private final ChangeJson.Factory json;
+  private final ContributorAgreementsChecker contributorAgreements;
+  private final ProjectCache projectCache;
+
+  @Inject
+  CherryPick(
+      PermissionBackend permissionBackend,
+      RetryHelper retryHelper,
+      CherryPickChange cherryPickChange,
+      ChangeJson.Factory json,
+      ContributorAgreementsChecker contributorAgreements,
+      ProjectCache projectCache) {
+    super(retryHelper);
+    this.permissionBackend = permissionBackend;
+    this.cherryPickChange = cherryPickChange;
+    this.json = json;
+    this.contributorAgreements = contributorAgreements;
+    this.projectCache = projectCache;
+  }
+
+  @Override
+  public CherryPickChangeInfo applyImpl(
+      BatchUpdate.Factory updateFactory, RevisionResource rsrc, CherryPickInput input)
+      throws OrmException, IOException, UpdateException, RestApiException,
+          PermissionBackendException, ConfigInvalidException, NoSuchProjectException {
+    input.parent = input.parent == null ? 1 : input.parent;
+    if (input.message == null || input.message.trim().isEmpty()) {
+      throw new BadRequestException("message must be non-empty");
+    } else if (input.destination == null || input.destination.trim().isEmpty()) {
+      throw new BadRequestException("destination must be non-empty");
+    }
+
+    String refName = RefNames.fullName(input.destination);
+    contributorAgreements.check(rsrc.getProject(), rsrc.getUser());
+
+    permissionBackend
+        .currentUser()
+        .project(rsrc.getChange().getProject())
+        .ref(refName)
+        .check(RefPermission.CREATE_CHANGE);
+    projectCache.checkedGet(rsrc.getProject()).checkStatePermitsWrite();
+
+    try {
+      CherryPickChange.Result cherryPickResult =
+          cherryPickChange.cherryPick(
+              updateFactory,
+              rsrc.getChange(),
+              rsrc.getPatchSet(),
+              input,
+              new Branch.NameKey(rsrc.getProject(), refName));
+      CherryPickChangeInfo changeInfo =
+          json.noOptions()
+              .format(rsrc.getProject(), cherryPickResult.changeId(), CherryPickChangeInfo::new);
+      changeInfo.containsGitConflicts =
+          !cherryPickResult.filesWithGitConflicts().isEmpty() ? true : null;
+      return changeInfo;
+    } catch (InvalidChangeOperationException e) {
+      throw new BadRequestException(e.getMessage());
+    } catch (IntegrationException | NoSuchChangeException e) {
+      throw new ResourceConflictException(e.getMessage());
+    }
+  }
+
+  @Override
+  public UiAction.Description getDescription(RevisionResource rsrc) {
+    boolean projectStatePermitsWrite = false;
+    try {
+      projectStatePermitsWrite = projectCache.checkedGet(rsrc.getProject()).statePermitsWrite();
+    } catch (IOException e) {
+      logger.atSevere().withCause(e).log(
+          "Failed to check if project state permits write: %s", rsrc.getProject());
+    }
+    return new UiAction.Description()
+        .setLabel("Cherry Pick")
+        .setTitle("Cherry pick change to a different branch")
+        .setVisible(
+            and(
+                rsrc.isCurrent() && projectStatePermitsWrite,
+                permissionBackend
+                    .currentUser()
+                    .project(rsrc.getProject())
+                    .testCond(ProjectPermission.CREATE_CHANGE)));
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/CherryPickChange.java b/java/com/google/gerrit/server/restapi/change/CherryPickChange.java
new file mode 100644
index 0000000..b0ebd2b
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/CherryPickChange.java
@@ -0,0 +1,399 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.change;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.common.FooterConstants;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.api.changes.CherryPickInput;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.MergeConflictException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Change.Status;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.ChangeUtil;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.ReviewerSet;
+import com.google.gerrit.server.Sequences;
+import com.google.gerrit.server.change.ChangeInserter;
+import com.google.gerrit.server.change.NotifyUtil;
+import com.google.gerrit.server.change.PatchSetInserter;
+import com.google.gerrit.server.git.CodeReviewCommit;
+import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.MergeUtil;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.ReviewerStateInternal;
+import com.google.gerrit.server.project.InvalidChangeOperationException;
+import com.google.gerrit.server.project.NoSuchProjectException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gerrit.server.submit.IntegrationException;
+import com.google.gerrit.server.submit.MergeIdenticalTreeException;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.TimeZone;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.InvalidObjectIdException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.util.ChangeIdUtil;
+
+@Singleton
+public class CherryPickChange {
+  @AutoValue
+  abstract static class Result {
+    static Result create(Change.Id changeId, ImmutableSet<String> filesWithGitConflicts) {
+      return new AutoValue_CherryPickChange_Result(changeId, filesWithGitConflicts);
+    }
+
+    abstract Change.Id changeId();
+
+    abstract ImmutableSet<String> filesWithGitConflicts();
+  }
+
+  private final Provider<ReviewDb> dbProvider;
+  private final Sequences seq;
+  private final Provider<InternalChangeQuery> queryProvider;
+  private final GitRepositoryManager gitManager;
+  private final TimeZone serverTimeZone;
+  private final Provider<IdentifiedUser> user;
+  private final ChangeInserter.Factory changeInserterFactory;
+  private final PatchSetInserter.Factory patchSetInserterFactory;
+  private final MergeUtil.Factory mergeUtilFactory;
+  private final ChangeNotes.Factory changeNotesFactory;
+  private final ProjectCache projectCache;
+  private final ApprovalsUtil approvalsUtil;
+  private final NotifyUtil notifyUtil;
+
+  @Inject
+  CherryPickChange(
+      Provider<ReviewDb> dbProvider,
+      Sequences seq,
+      Provider<InternalChangeQuery> queryProvider,
+      @GerritPersonIdent PersonIdent myIdent,
+      GitRepositoryManager gitManager,
+      Provider<IdentifiedUser> user,
+      ChangeInserter.Factory changeInserterFactory,
+      PatchSetInserter.Factory patchSetInserterFactory,
+      MergeUtil.Factory mergeUtilFactory,
+      ChangeNotes.Factory changeNotesFactory,
+      ProjectCache projectCache,
+      ApprovalsUtil approvalsUtil,
+      NotifyUtil notifyUtil) {
+    this.dbProvider = dbProvider;
+    this.seq = seq;
+    this.queryProvider = queryProvider;
+    this.gitManager = gitManager;
+    this.serverTimeZone = myIdent.getTimeZone();
+    this.user = user;
+    this.changeInserterFactory = changeInserterFactory;
+    this.patchSetInserterFactory = patchSetInserterFactory;
+    this.mergeUtilFactory = mergeUtilFactory;
+    this.changeNotesFactory = changeNotesFactory;
+    this.projectCache = projectCache;
+    this.approvalsUtil = approvalsUtil;
+    this.notifyUtil = notifyUtil;
+  }
+
+  public Result cherryPick(
+      BatchUpdate.Factory batchUpdateFactory,
+      Change change,
+      PatchSet patch,
+      CherryPickInput input,
+      Branch.NameKey dest)
+      throws OrmException, IOException, InvalidChangeOperationException, IntegrationException,
+          UpdateException, RestApiException, ConfigInvalidException, NoSuchProjectException {
+    return cherryPick(
+        batchUpdateFactory,
+        change,
+        change.getProject(),
+        ObjectId.fromString(patch.getRevision().get()),
+        input,
+        dest);
+  }
+
+  public Result cherryPick(
+      BatchUpdate.Factory batchUpdateFactory,
+      @Nullable Change sourceChange,
+      Project.NameKey project,
+      ObjectId sourceCommit,
+      CherryPickInput input,
+      Branch.NameKey dest)
+      throws OrmException, IOException, InvalidChangeOperationException, IntegrationException,
+          UpdateException, RestApiException, ConfigInvalidException, NoSuchProjectException {
+
+    IdentifiedUser identifiedUser = user.get();
+    try (Repository git = gitManager.openRepository(project);
+        // This inserter and revwalk *must* be passed to any BatchUpdates
+        // created later on, to ensure the cherry-picked commit is flushed
+        // before patch sets are updated.
+        ObjectInserter oi = git.newObjectInserter();
+        ObjectReader reader = oi.newReader();
+        CodeReviewRevWalk revWalk = CodeReviewCommit.newRevWalk(reader)) {
+      Ref destRef = git.getRefDatabase().exactRef(dest.get());
+      if (destRef == null) {
+        throw new InvalidChangeOperationException(
+            String.format("Branch %s does not exist.", dest.get()));
+      }
+
+      RevCommit baseCommit = getBaseCommit(destRef, project.get(), revWalk, input.base);
+
+      CodeReviewCommit commitToCherryPick = revWalk.parseCommit(sourceCommit);
+
+      if (input.parent <= 0 || input.parent > commitToCherryPick.getParentCount()) {
+        throw new InvalidChangeOperationException(
+            String.format(
+                "Cherry Pick: Parent %s does not exist. Please specify a parent in"
+                    + " range [1, %s].",
+                input.parent, commitToCherryPick.getParentCount()));
+      }
+
+      Timestamp now = TimeUtil.nowTs();
+      PersonIdent committerIdent = identifiedUser.newCommitterIdent(now, serverTimeZone);
+
+      final ObjectId computedChangeId =
+          ChangeIdUtil.computeChangeId(
+              commitToCherryPick.getTree(),
+              baseCommit,
+              commitToCherryPick.getAuthorIdent(),
+              committerIdent,
+              input.message);
+      String commitMessage = ChangeIdUtil.insertId(input.message, computedChangeId).trim() + '\n';
+
+      CodeReviewCommit cherryPickCommit;
+      ProjectState projectState = projectCache.checkedGet(dest.getParentKey());
+      if (projectState == null) {
+        throw new NoSuchProjectException(dest.getParentKey());
+      }
+      try {
+        MergeUtil mergeUtil;
+        if (input.allowConflicts) {
+          // allowConflicts requires to use content merge
+          mergeUtil = mergeUtilFactory.create(projectState, true);
+        } else {
+          // use content merge only if it's configured on the project
+          mergeUtil = mergeUtilFactory.create(projectState);
+        }
+        cherryPickCommit =
+            mergeUtil.createCherryPickFromCommit(
+                oi,
+                git.getConfig(),
+                baseCommit,
+                commitToCherryPick,
+                committerIdent,
+                commitMessage,
+                revWalk,
+                input.parent - 1,
+                false,
+                input.allowConflicts);
+
+        Change.Key changeKey;
+        final List<String> idList = cherryPickCommit.getFooterLines(FooterConstants.CHANGE_ID);
+        if (!idList.isEmpty()) {
+          final String idStr = idList.get(idList.size() - 1).trim();
+          changeKey = new Change.Key(idStr);
+        } else {
+          changeKey = new Change.Key("I" + computedChangeId.name());
+        }
+
+        Branch.NameKey newDest = new Branch.NameKey(project, destRef.getName());
+        List<ChangeData> destChanges =
+            queryProvider.get().setLimit(2).byBranchKey(newDest, changeKey);
+        if (destChanges.size() > 1) {
+          throw new InvalidChangeOperationException(
+              "Several changes with key "
+                  + changeKey
+                  + " reside on the same branch. "
+                  + "Cannot create a new patch set.");
+        }
+        try (BatchUpdate bu =
+            batchUpdateFactory.create(dbProvider.get(), project, identifiedUser, now)) {
+          bu.setRepository(git, revWalk, oi);
+          Change.Id changeId;
+          if (destChanges.size() == 1) {
+            // The change key exists on the destination branch. The cherry pick
+            // will be added as a new patch set.
+            changeId = insertPatchSet(bu, git, destChanges.get(0).notes(), cherryPickCommit, input);
+          } else {
+            // Change key not found on destination branch. We can create a new
+            // change.
+            String newTopic = null;
+            if (sourceChange != null && !Strings.isNullOrEmpty(sourceChange.getTopic())) {
+              newTopic = sourceChange.getTopic() + "-" + newDest.getShortName();
+            }
+            changeId =
+                createNewChange(
+                    bu, cherryPickCommit, dest.get(), newTopic, sourceChange, sourceCommit, input);
+          }
+          bu.execute();
+          return Result.create(changeId, cherryPickCommit.getFilesWithGitConflicts());
+        }
+      } catch (MergeIdenticalTreeException | MergeConflictException e) {
+        throw new IntegrationException("Cherry pick failed: " + e.getMessage());
+      }
+    }
+  }
+
+  private RevCommit getBaseCommit(Ref destRef, String project, RevWalk revWalk, String base)
+      throws RestApiException, IOException, OrmException {
+    RevCommit destRefTip = revWalk.parseCommit(destRef.getObjectId());
+    // The tip commit of the destination ref is the default base for the newly created change.
+    if (Strings.isNullOrEmpty(base)) {
+      return destRefTip;
+    }
+
+    ObjectId baseObjectId;
+    try {
+      baseObjectId = ObjectId.fromString(base);
+    } catch (InvalidObjectIdException e) {
+      throw new BadRequestException(String.format("Base %s doesn't represent a valid SHA-1", base));
+    }
+
+    RevCommit baseCommit = revWalk.parseCommit(baseObjectId);
+    InternalChangeQuery changeQuery = queryProvider.get();
+    changeQuery.enforceVisibility(true);
+    List<ChangeData> changeDatas = changeQuery.byBranchCommit(project, destRef.getName(), base);
+
+    if (changeDatas.isEmpty()) {
+      if (revWalk.isMergedInto(baseCommit, destRefTip)) {
+        // The base commit is a merged commit with no change associated.
+        return baseCommit;
+      }
+      throw new UnprocessableEntityException(
+          String.format("Commit %s does not exist on branch %s", base, destRef.getName()));
+    } else if (changeDatas.size() != 1) {
+      throw new ResourceConflictException("Multiple changes found for commit " + base);
+    }
+
+    Change change = changeDatas.get(0).change();
+    Change.Status status = change.getStatus();
+    if (status == Status.NEW || status == Status.MERGED) {
+      // The base commit is a valid change revision.
+      return baseCommit;
+    }
+
+    throw new ResourceConflictException(
+        String.format(
+            "Change %s with commit %s is %s", change.getChangeId(), base, status.asChangeStatus()));
+  }
+
+  private Change.Id insertPatchSet(
+      BatchUpdate bu,
+      Repository git,
+      ChangeNotes destNotes,
+      CodeReviewCommit cherryPickCommit,
+      CherryPickInput input)
+      throws IOException, OrmException, BadRequestException, ConfigInvalidException {
+    Change destChange = destNotes.getChange();
+    PatchSet.Id psId = ChangeUtil.nextPatchSetId(git, destChange.currentPatchSetId());
+    PatchSetInserter inserter = patchSetInserterFactory.create(destNotes, psId, cherryPickCommit);
+    inserter
+        .setMessage("Uploaded patch set " + inserter.getPatchSetId().get() + ".")
+        .setNotify(input.notify)
+        .setAccountsToNotify(notifyUtil.resolveAccounts(input.notifyDetails));
+    bu.addOp(destChange.getId(), inserter);
+    return destChange.getId();
+  }
+
+  private Change.Id createNewChange(
+      BatchUpdate bu,
+      CodeReviewCommit cherryPickCommit,
+      String refName,
+      String topic,
+      @Nullable Change sourceChange,
+      ObjectId sourceCommit,
+      CherryPickInput input)
+      throws OrmException, IOException, BadRequestException, ConfigInvalidException {
+    Change.Id changeId = new Change.Id(seq.nextChangeId());
+    ChangeInserter ins = changeInserterFactory.create(changeId, cherryPickCommit, refName);
+    Branch.NameKey sourceBranch = sourceChange == null ? null : sourceChange.getDest();
+    ins.setMessage(
+            messageForDestinationChange(
+                ins.getPatchSetId(), sourceBranch, sourceCommit, cherryPickCommit))
+        .setTopic(topic)
+        .setWorkInProgress(
+            (sourceChange != null && sourceChange.isWorkInProgress())
+                || !cherryPickCommit.getFilesWithGitConflicts().isEmpty())
+        .setNotify(input.notify)
+        .setAccountsToNotify(notifyUtil.resolveAccounts(input.notifyDetails));
+    if (input.keepReviewers && sourceChange != null) {
+      ReviewerSet reviewerSet =
+          approvalsUtil.getReviewers(
+              dbProvider.get(), changeNotesFactory.createChecked(dbProvider.get(), sourceChange));
+      Set<Account.Id> reviewers =
+          new HashSet<>(reviewerSet.byState(ReviewerStateInternal.REVIEWER));
+      reviewers.add(sourceChange.getOwner());
+      reviewers.remove(user.get().getAccountId());
+      Set<Account.Id> ccs = new HashSet<>(reviewerSet.byState(ReviewerStateInternal.CC));
+      ccs.remove(user.get().getAccountId());
+      ins.setReviewersAndCcs(reviewers, ccs);
+    }
+    bu.insertChange(ins);
+    return changeId;
+  }
+
+  private String messageForDestinationChange(
+      PatchSet.Id patchSetId,
+      Branch.NameKey sourceBranch,
+      ObjectId sourceCommit,
+      CodeReviewCommit cherryPickCommit) {
+    StringBuilder stringBuilder = new StringBuilder("Patch Set ").append(patchSetId.get());
+    if (sourceBranch != null) {
+      stringBuilder.append(": Cherry Picked from branch ").append(sourceBranch.getShortName());
+    } else {
+      stringBuilder.append(": Cherry Picked from commit ").append(sourceCommit.getName());
+    }
+    stringBuilder.append(".");
+
+    if (!cherryPickCommit.getFilesWithGitConflicts().isEmpty()) {
+      stringBuilder.append("\n\nThe following files contain Git conflicts:\n");
+      cherryPickCommit.getFilesWithGitConflicts().stream()
+          .sorted()
+          .forEach(filePath -> stringBuilder.append("* ").append(filePath).append("\n"));
+    }
+
+    return stringBuilder.toString();
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/CherryPickCommit.java b/java/com/google/gerrit/server/restapi/change/CherryPickCommit.java
new file mode 100644
index 0000000..f76689c
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/CherryPickCommit.java
@@ -0,0 +1,119 @@
+// Copyright (C) 2017 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.google.gerrit.server.restapi.change;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.api.changes.CherryPickInput;
+import com.google.gerrit.extensions.common.CherryPickChangeInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.change.ChangeJson;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.gerrit.server.project.CommitResource;
+import com.google.gerrit.server.project.ContributorAgreementsChecker;
+import com.google.gerrit.server.project.InvalidChangeOperationException;
+import com.google.gerrit.server.project.NoSuchProjectException;
+import com.google.gerrit.server.submit.IntegrationException;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestModifyView;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.revwalk.RevCommit;
+
+@Singleton
+public class CherryPickCommit
+    extends RetryingRestModifyView<CommitResource, CherryPickInput, CherryPickChangeInfo> {
+  private final PermissionBackend permissionBackend;
+  private final Provider<CurrentUser> user;
+  private final CherryPickChange cherryPickChange;
+  private final ChangeJson.Factory json;
+  private final ContributorAgreementsChecker contributorAgreements;
+
+  @Inject
+  CherryPickCommit(
+      RetryHelper retryHelper,
+      Provider<CurrentUser> user,
+      CherryPickChange cherryPickChange,
+      ChangeJson.Factory json,
+      PermissionBackend permissionBackend,
+      ContributorAgreementsChecker contributorAgreements) {
+    super(retryHelper);
+    this.permissionBackend = permissionBackend;
+    this.user = user;
+    this.cherryPickChange = cherryPickChange;
+    this.json = json;
+    this.contributorAgreements = contributorAgreements;
+  }
+
+  @Override
+  public CherryPickChangeInfo applyImpl(
+      BatchUpdate.Factory updateFactory, CommitResource rsrc, CherryPickInput input)
+      throws OrmException, IOException, UpdateException, RestApiException,
+          PermissionBackendException, ConfigInvalidException, NoSuchProjectException {
+    RevCommit commit = rsrc.getCommit();
+    String message = Strings.nullToEmpty(input.message).trim();
+    input.message = message.isEmpty() ? commit.getFullMessage() : message;
+    String destination = Strings.nullToEmpty(input.destination).trim();
+    input.parent = input.parent == null ? 1 : input.parent;
+    Project.NameKey projectName = rsrc.getProjectState().getNameKey();
+
+    if (destination.isEmpty()) {
+      throw new BadRequestException("destination must be non-empty");
+    }
+
+    String refName = RefNames.fullName(destination);
+    contributorAgreements.check(projectName, user.get());
+    permissionBackend
+        .currentUser()
+        .project(projectName)
+        .ref(refName)
+        .check(RefPermission.CREATE_CHANGE);
+    rsrc.getProjectState().checkStatePermitsWrite();
+
+    try {
+      CherryPickChange.Result cherryPickResult =
+          cherryPickChange.cherryPick(
+              updateFactory,
+              null,
+              projectName,
+              commit,
+              input,
+              new Branch.NameKey(rsrc.getProjectState().getNameKey(), refName));
+      CherryPickChangeInfo changeInfo =
+          json.noOptions()
+              .format(projectName, cherryPickResult.changeId(), CherryPickChangeInfo::new);
+      changeInfo.containsGitConflicts =
+          !cherryPickResult.filesWithGitConflicts().isEmpty() ? true : null;
+      return changeInfo;
+    } catch (InvalidChangeOperationException e) {
+      throw new BadRequestException(e.getMessage());
+    } catch (IntegrationException e) {
+      throw new ResourceConflictException(e.getMessage());
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/CommentJson.java b/java/com/google/gerrit/server/restapi/change/CommentJson.java
new file mode 100644
index 0000000..7112bbf
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/CommentJson.java
@@ -0,0 +1,216 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.change;
+
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static com.google.gerrit.server.CommentsUtil.COMMENT_INFO_ORDER;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Streams;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.client.Comment.Range;
+import com.google.gerrit.extensions.client.Side;
+import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.common.FixReplacementInfo;
+import com.google.gerrit.extensions.common.FixSuggestionInfo;
+import com.google.gerrit.extensions.common.RobotCommentInfo;
+import com.google.gerrit.extensions.restapi.Url;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.FixReplacement;
+import com.google.gerrit.reviewdb.client.FixSuggestion;
+import com.google.gerrit.reviewdb.client.RobotComment;
+import com.google.gerrit.server.account.AccountLoader;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.inject.Inject;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+public class CommentJson {
+
+  private final AccountLoader.Factory accountLoaderFactory;
+
+  private boolean fillAccounts = true;
+  private boolean fillPatchSet;
+
+  @Inject
+  CommentJson(AccountLoader.Factory accountLoaderFactory) {
+    this.accountLoaderFactory = accountLoaderFactory;
+  }
+
+  CommentJson setFillAccounts(boolean fillAccounts) {
+    this.fillAccounts = fillAccounts;
+    return this;
+  }
+
+  CommentJson setFillPatchSet(boolean fillPatchSet) {
+    this.fillPatchSet = fillPatchSet;
+    return this;
+  }
+
+  public CommentFormatter newCommentFormatter() {
+    return new CommentFormatter();
+  }
+
+  public RobotCommentFormatter newRobotCommentFormatter() {
+    return new RobotCommentFormatter();
+  }
+
+  private abstract class BaseCommentFormatter<F extends Comment, T extends CommentInfo> {
+    public T format(F comment) throws PermissionBackendException {
+      AccountLoader loader = fillAccounts ? accountLoaderFactory.create(true) : null;
+      T info = toInfo(comment, loader);
+      if (loader != null) {
+        loader.fill();
+      }
+      return info;
+    }
+
+    public Map<String, List<T>> format(Iterable<F> comments) throws PermissionBackendException {
+      AccountLoader loader = fillAccounts ? accountLoaderFactory.create(true) : null;
+
+      Map<String, List<T>> out = new TreeMap<>();
+
+      for (F c : comments) {
+        T o = toInfo(c, loader);
+        List<T> list = out.get(o.path);
+        if (list == null) {
+          list = new ArrayList<>();
+          out.put(o.path, list);
+        }
+        o.path = null;
+        list.add(o);
+      }
+
+      out.values().forEach(l -> l.sort(COMMENT_INFO_ORDER));
+
+      if (loader != null) {
+        loader.fill();
+      }
+      return out;
+    }
+
+    public ImmutableList<T> formatAsList(Iterable<F> comments) throws PermissionBackendException {
+      AccountLoader loader = fillAccounts ? accountLoaderFactory.create(true) : null;
+
+      ImmutableList<T> out =
+          Streams.stream(comments)
+              .map(c -> toInfo(c, loader))
+              .sorted(COMMENT_INFO_ORDER)
+              .collect(toImmutableList());
+
+      if (loader != null) {
+        loader.fill();
+      }
+      return out;
+    }
+
+    protected abstract T toInfo(F comment, AccountLoader loader);
+
+    protected void fillCommentInfo(Comment c, CommentInfo r, AccountLoader loader) {
+      if (fillPatchSet) {
+        r.patchSet = c.key.patchSetId;
+      }
+      r.id = Url.encode(c.key.uuid);
+      r.path = c.key.filename;
+      if (c.side <= 0) {
+        r.side = Side.PARENT;
+        if (c.side < 0) {
+          r.parent = -c.side;
+        }
+      }
+      if (c.lineNbr > 0) {
+        r.line = c.lineNbr;
+      }
+      r.inReplyTo = Url.encode(c.parentUuid);
+      r.message = Strings.emptyToNull(c.message);
+      r.updated = c.writtenOn;
+      r.range = toRange(c.range);
+      r.tag = c.tag;
+      r.unresolved = c.unresolved;
+      if (loader != null) {
+        r.author = loader.get(c.author.getId());
+      }
+    }
+
+    protected Range toRange(Comment.Range commentRange) {
+      Range range = null;
+      if (commentRange != null) {
+        range = new Range();
+        range.startLine = commentRange.startLine;
+        range.startCharacter = commentRange.startChar;
+        range.endLine = commentRange.endLine;
+        range.endCharacter = commentRange.endChar;
+      }
+      return range;
+    }
+  }
+
+  public class CommentFormatter extends BaseCommentFormatter<Comment, CommentInfo> {
+    @Override
+    protected CommentInfo toInfo(Comment c, AccountLoader loader) {
+      CommentInfo ci = new CommentInfo();
+      fillCommentInfo(c, ci, loader);
+      return ci;
+    }
+
+    private CommentFormatter() {}
+  }
+
+  class RobotCommentFormatter extends BaseCommentFormatter<RobotComment, RobotCommentInfo> {
+    @Override
+    protected RobotCommentInfo toInfo(RobotComment c, AccountLoader loader) {
+      RobotCommentInfo rci = new RobotCommentInfo();
+      rci.robotId = c.robotId;
+      rci.robotRunId = c.robotRunId;
+      rci.url = c.url;
+      rci.properties = c.properties;
+      rci.fixSuggestions = toFixSuggestionInfos(c.fixSuggestions);
+      fillCommentInfo(c, rci, loader);
+      return rci;
+    }
+
+    private List<FixSuggestionInfo> toFixSuggestionInfos(
+        @Nullable List<FixSuggestion> fixSuggestions) {
+      if (fixSuggestions == null || fixSuggestions.isEmpty()) {
+        return null;
+      }
+
+      return fixSuggestions.stream().map(this::toFixSuggestionInfo).collect(toList());
+    }
+
+    private FixSuggestionInfo toFixSuggestionInfo(FixSuggestion fixSuggestion) {
+      FixSuggestionInfo fixSuggestionInfo = new FixSuggestionInfo();
+      fixSuggestionInfo.fixId = fixSuggestion.fixId;
+      fixSuggestionInfo.description = fixSuggestion.description;
+      fixSuggestionInfo.replacements =
+          fixSuggestion.replacements.stream().map(this::toFixReplacementInfo).collect(toList());
+      return fixSuggestionInfo;
+    }
+
+    private FixReplacementInfo toFixReplacementInfo(FixReplacement fixReplacement) {
+      FixReplacementInfo fixReplacementInfo = new FixReplacementInfo();
+      fixReplacementInfo.path = fixReplacement.path;
+      fixReplacementInfo.range = toRange(fixReplacement.range);
+      fixReplacementInfo.replacement = fixReplacement.replacement;
+      return fixReplacementInfo;
+    }
+
+    private RobotCommentFormatter() {}
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/Comments.java b/java/com/google/gerrit/server/restapi/change/Comments.java
new file mode 100644
index 0000000..f563cc6
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/Comments.java
@@ -0,0 +1,76 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.ChildCollection;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.change.CommentResource;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@Singleton
+public class Comments implements ChildCollection<RevisionResource, CommentResource> {
+  private final DynamicMap<RestView<CommentResource>> views;
+  private final ListRevisionComments list;
+  private final Provider<ReviewDb> dbProvider;
+  private final CommentsUtil commentsUtil;
+
+  @Inject
+  Comments(
+      DynamicMap<RestView<CommentResource>> views,
+      ListRevisionComments list,
+      Provider<ReviewDb> dbProvider,
+      CommentsUtil commentsUtil) {
+    this.views = views;
+    this.list = list;
+    this.dbProvider = dbProvider;
+    this.commentsUtil = commentsUtil;
+  }
+
+  @Override
+  public DynamicMap<RestView<CommentResource>> views() {
+    return views;
+  }
+
+  @Override
+  public ListRevisionComments list() {
+    return list;
+  }
+
+  @Override
+  public CommentResource parse(RevisionResource rev, IdString id)
+      throws ResourceNotFoundException, OrmException {
+    String uuid = id.get();
+    ChangeNotes notes = rev.getNotes();
+
+    for (Comment c :
+        commentsUtil.publishedByPatchSet(dbProvider.get(), notes, rev.getPatchSet().getId())) {
+      if (uuid.equals(c.key.uuid)) {
+        return new CommentResource(rev, c);
+      }
+    }
+    throw new ResourceNotFoundException(id);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/CreateChange.java b/java/com/google/gerrit/server/restapi/change/CreateChange.java
new file mode 100644
index 0000000..fd25658
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/CreateChange.java
@@ -0,0 +1,412 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.change;
+
+import static org.eclipse.jgit.lib.Constants.SIGNED_OFF_BY_TAG;
+
+import com.google.common.base.Joiner;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
+import com.google.common.collect.Iterables;
+import com.google.gerrit.extensions.client.ChangeStatus;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.ChangeInput;
+import com.google.gerrit.extensions.common.MergeInput;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.Sequences;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.change.ChangeFinder;
+import com.google.gerrit.server.change.ChangeInserter;
+import com.google.gerrit.server.change.ChangeJson;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.NotifyUtil;
+import com.google.gerrit.server.config.AnonymousCowardName;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.MergeUtil;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.gerrit.server.project.ContributorAgreementsChecker;
+import com.google.gerrit.server.project.InvalidChangeOperationException;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.restapi.project.CommitsCollection;
+import com.google.gerrit.server.restapi.project.ProjectsCollection;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestCollectionModifyView;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.sql.Timestamp;
+import java.util.Collections;
+import java.util.List;
+import java.util.TimeZone;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.InvalidObjectIdException;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.lib.TreeFormatter;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.util.ChangeIdUtil;
+
+@Singleton
+public class CreateChange
+    extends RetryingRestCollectionModifyView<
+        TopLevelResource, ChangeResource, ChangeInput, Response<ChangeInfo>> {
+  private final String anonymousCowardName;
+  private final Provider<ReviewDb> db;
+  private final GitRepositoryManager gitManager;
+  private final Sequences seq;
+  private final TimeZone serverTimeZone;
+  private final PermissionBackend permissionBackend;
+  private final Provider<CurrentUser> user;
+  private final ProjectsCollection projectsCollection;
+  private final CommitsCollection commits;
+  private final ChangeInserter.Factory changeInserterFactory;
+  private final ChangeJson.Factory jsonFactory;
+  private final ChangeFinder changeFinder;
+  private final PatchSetUtil psUtil;
+  private final MergeUtil.Factory mergeUtilFactory;
+  private final SubmitType submitType;
+  private final NotifyUtil notifyUtil;
+  private final ContributorAgreementsChecker contributorAgreements;
+  private final boolean disablePrivateChanges;
+
+  @Inject
+  CreateChange(
+      @AnonymousCowardName String anonymousCowardName,
+      Provider<ReviewDb> db,
+      GitRepositoryManager gitManager,
+      Sequences seq,
+      @GerritPersonIdent PersonIdent myIdent,
+      PermissionBackend permissionBackend,
+      Provider<CurrentUser> user,
+      ProjectsCollection projectsCollection,
+      CommitsCollection commits,
+      ChangeInserter.Factory changeInserterFactory,
+      ChangeJson.Factory json,
+      ChangeFinder changeFinder,
+      RetryHelper retryHelper,
+      PatchSetUtil psUtil,
+      @GerritServerConfig Config config,
+      MergeUtil.Factory mergeUtilFactory,
+      NotifyUtil notifyUtil,
+      ContributorAgreementsChecker contributorAgreements) {
+    super(retryHelper);
+    this.anonymousCowardName = anonymousCowardName;
+    this.db = db;
+    this.gitManager = gitManager;
+    this.seq = seq;
+    this.serverTimeZone = myIdent.getTimeZone();
+    this.permissionBackend = permissionBackend;
+    this.user = user;
+    this.projectsCollection = projectsCollection;
+    this.commits = commits;
+    this.changeInserterFactory = changeInserterFactory;
+    this.jsonFactory = json;
+    this.changeFinder = changeFinder;
+    this.psUtil = psUtil;
+    this.submitType = config.getEnum("project", null, "submitType", SubmitType.MERGE_IF_NECESSARY);
+    this.disablePrivateChanges = config.getBoolean("change", null, "disablePrivateChanges", false);
+    this.mergeUtilFactory = mergeUtilFactory;
+    this.notifyUtil = notifyUtil;
+    this.contributorAgreements = contributorAgreements;
+  }
+
+  @Override
+  protected Response<ChangeInfo> applyImpl(
+      BatchUpdate.Factory updateFactory, TopLevelResource parent, ChangeInput input)
+      throws OrmException, IOException, InvalidChangeOperationException, RestApiException,
+          UpdateException, PermissionBackendException, ConfigInvalidException {
+    if (Strings.isNullOrEmpty(input.project)) {
+      throw new BadRequestException("project must be non-empty");
+    }
+
+    if (Strings.isNullOrEmpty(input.branch)) {
+      throw new BadRequestException("branch must be non-empty");
+    }
+
+    String subject = clean(Strings.nullToEmpty(input.subject));
+    if (Strings.isNullOrEmpty(subject)) {
+      throw new BadRequestException("commit message must be non-empty");
+    }
+
+    if (input.status != null) {
+      if (input.status != ChangeStatus.NEW) {
+        throw new BadRequestException("unsupported change status");
+      }
+    }
+
+    if (input.baseChange != null && input.baseCommit != null) {
+      throw new BadRequestException("only provide one of base_change or base_commit");
+    }
+
+    ProjectResource rsrc = projectsCollection.parse(input.project);
+    boolean privateByDefault = rsrc.getProjectState().is(BooleanProjectConfig.PRIVATE_BY_DEFAULT);
+    boolean isPrivate = input.isPrivate == null ? privateByDefault : input.isPrivate;
+
+    if (isPrivate && disablePrivateChanges) {
+      throw new MethodNotAllowedException("private changes are disabled");
+    }
+
+    contributorAgreements.check(rsrc.getNameKey(), rsrc.getUser());
+
+    Project.NameKey project = rsrc.getNameKey();
+    String refName = RefNames.fullName(input.branch);
+    permissionBackend
+        .currentUser()
+        .project(project)
+        .ref(refName)
+        .check(RefPermission.CREATE_CHANGE);
+    rsrc.getProjectState().checkStatePermitsWrite();
+
+    try (Repository git = gitManager.openRepository(project);
+        ObjectInserter oi = git.newObjectInserter();
+        ObjectReader reader = oi.newReader();
+        RevWalk rw = new RevWalk(reader)) {
+      ObjectId parentCommit;
+      List<String> groups;
+      Ref destRef = git.getRefDatabase().exactRef(refName);
+      if (input.baseChange != null) {
+        List<ChangeNotes> notes = changeFinder.find(input.baseChange);
+        if (notes.size() != 1) {
+          throw new UnprocessableEntityException("Base change not found: " + input.baseChange);
+        }
+        ChangeNotes change = Iterables.getOnlyElement(notes);
+        try {
+          permissionBackend.currentUser().change(change).database(db).check(ChangePermission.READ);
+        } catch (AuthException e) {
+          throw new UnprocessableEntityException("Read not permitted for " + input.baseChange);
+        }
+        PatchSet ps = psUtil.current(db.get(), change);
+        parentCommit = ObjectId.fromString(ps.getRevision().get());
+        groups = ps.getGroups();
+      } else if (input.baseCommit != null) {
+        try {
+          parentCommit = ObjectId.fromString(input.baseCommit);
+        } catch (InvalidObjectIdException e) {
+          throw new UnprocessableEntityException(
+              String.format("Base %s doesn't represent a valid SHA-1", input.baseCommit));
+        }
+        RevCommit parentRevCommit = rw.parseCommit(parentCommit);
+        RevCommit destRefRevCommit = rw.parseCommit(destRef.getObjectId());
+        if (!rw.isMergedInto(parentRevCommit, destRefRevCommit)) {
+          throw new BadRequestException(
+              String.format("Commit %s doesn't exist on ref %s", input.baseCommit, refName));
+        }
+        groups = Collections.emptyList();
+      } else {
+        if (destRef != null) {
+          if (Boolean.TRUE.equals(input.newBranch)) {
+            throw new ResourceConflictException(
+                String.format("Branch %s already exists.", refName));
+          }
+          parentCommit = destRef.getObjectId();
+        } else {
+          if (Boolean.TRUE.equals(input.newBranch)) {
+            parentCommit = null;
+          } else {
+            throw new BadRequestException("Must provide a destination branch");
+          }
+        }
+        groups = Collections.emptyList();
+      }
+      RevCommit mergeTip = parentCommit == null ? null : rw.parseCommit(parentCommit);
+
+      Timestamp now = TimeUtil.nowTs();
+      IdentifiedUser me = user.get().asIdentifiedUser();
+      PersonIdent author = me.newCommitterIdent(now, serverTimeZone);
+      AccountState accountState = me.state();
+      GeneralPreferencesInfo info = accountState.getGeneralPreferences();
+
+      boolean isWorkInProgress =
+          input.workInProgress == null
+              ? rsrc.getProjectState().is(BooleanProjectConfig.WORK_IN_PROGRESS_BY_DEFAULT)
+                  || MoreObjects.firstNonNull(info.workInProgressByDefault, false)
+              : input.workInProgress;
+
+      // Add a Change-Id line if there isn't already one
+      String commitMessage = subject;
+      if (ChangeIdUtil.indexOfChangeId(commitMessage, "\n") == -1) {
+        ObjectId treeId = mergeTip == null ? emptyTreeId(oi) : mergeTip.getTree();
+        ObjectId id = ChangeIdUtil.computeChangeId(treeId, mergeTip, author, author, commitMessage);
+        commitMessage = ChangeIdUtil.insertId(commitMessage, id);
+      }
+
+      if (Boolean.TRUE.equals(info.signedOffBy)) {
+        commitMessage =
+            Joiner.on("\n")
+                .join(
+                    commitMessage.trim(),
+                    String.format(
+                        "%s%s",
+                        SIGNED_OFF_BY_TAG,
+                        accountState.getAccount().getNameEmail(anonymousCowardName)));
+      }
+
+      RevCommit c;
+      if (input.merge != null) {
+        // create a merge commit
+        if (!(submitType.equals(SubmitType.MERGE_ALWAYS)
+            || submitType.equals(SubmitType.MERGE_IF_NECESSARY))) {
+          throw new BadRequestException("Submit type: " + submitType + " is not supported");
+        }
+        c =
+            newMergeCommit(
+                git, oi, rw, rsrc.getProjectState(), mergeTip, input.merge, author, commitMessage);
+      } else {
+        // create an empty commit
+        c = newCommit(oi, rw, author, mergeTip, commitMessage);
+      }
+
+      Change.Id changeId = new Change.Id(seq.nextChangeId());
+      ChangeInserter ins = changeInserterFactory.create(changeId, c, refName);
+      ins.setMessage(String.format("Uploaded patch set %s.", ins.getPatchSetId().get()));
+      String topic = input.topic;
+      if (topic != null) {
+        topic = Strings.emptyToNull(topic.trim());
+      }
+      ins.setTopic(topic);
+      ins.setPrivate(isPrivate);
+      ins.setWorkInProgress(isWorkInProgress);
+      ins.setGroups(groups);
+      ins.setNotify(input.notify);
+      ins.setAccountsToNotify(notifyUtil.resolveAccounts(input.notifyDetails));
+      try (BatchUpdate bu = updateFactory.create(db.get(), project, me, now)) {
+        bu.setRepository(git, rw, oi);
+        bu.insertChange(ins);
+        bu.execute();
+      }
+      ChangeJson json = jsonFactory.noOptions();
+      return Response.created(json.format(ins.getChange()));
+    } catch (IllegalArgumentException e) {
+      throw new BadRequestException(e.getMessage());
+    }
+  }
+
+  private static RevCommit newCommit(
+      ObjectInserter oi,
+      RevWalk rw,
+      PersonIdent authorIdent,
+      RevCommit mergeTip,
+      String commitMessage)
+      throws IOException {
+    CommitBuilder commit = new CommitBuilder();
+    if (mergeTip == null) {
+      commit.setTreeId(emptyTreeId(oi));
+    } else {
+      commit.setTreeId(mergeTip.getTree().getId());
+      commit.setParentId(mergeTip);
+    }
+    commit.setAuthor(authorIdent);
+    commit.setCommitter(authorIdent);
+    commit.setMessage(commitMessage);
+    return rw.parseCommit(insert(oi, commit));
+  }
+
+  private RevCommit newMergeCommit(
+      Repository repo,
+      ObjectInserter oi,
+      RevWalk rw,
+      ProjectState projectState,
+      RevCommit mergeTip,
+      MergeInput merge,
+      PersonIdent authorIdent,
+      String commitMessage)
+      throws RestApiException, IOException {
+    if (Strings.isNullOrEmpty(merge.source)) {
+      throw new BadRequestException("merge.source must be non-empty");
+    }
+
+    RevCommit sourceCommit = MergeUtil.resolveCommit(repo, rw, merge.source);
+    if (!commits.canRead(projectState, repo, sourceCommit)) {
+      throw new BadRequestException("do not have read permission for: " + merge.source);
+    }
+
+    MergeUtil mergeUtil = mergeUtilFactory.create(projectState);
+    // default merge strategy from project settings
+    String mergeStrategy =
+        MoreObjects.firstNonNull(
+            Strings.emptyToNull(merge.strategy), mergeUtil.mergeStrategyName());
+
+    return MergeUtil.createMergeCommit(
+        oi,
+        repo.getConfig(),
+        mergeTip,
+        sourceCommit,
+        mergeStrategy,
+        authorIdent,
+        commitMessage,
+        rw);
+  }
+
+  private static ObjectId insert(ObjectInserter inserter, CommitBuilder commit)
+      throws IOException, UnsupportedEncodingException {
+    ObjectId id = inserter.insert(commit);
+    inserter.flush();
+    return id;
+  }
+
+  private static ObjectId emptyTreeId(ObjectInserter inserter) throws IOException {
+    return inserter.insert(new TreeFormatter());
+  }
+
+  /**
+   * Remove comment lines from a commit message.
+   *
+   * <p>Based on {@link org.eclipse.jgit.util.ChangeIdUtil#clean}.
+   *
+   * @param msg
+   * @return message without comment lines, possibly empty.
+   */
+  private String clean(String msg) {
+    return msg.replaceAll("(?m)^#.*$\n?", "").trim();
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/CreateDraftComment.java b/java/com/google/gerrit/server/restapi/change/CreateDraftComment.java
new file mode 100644
index 0000000..0e93c55
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/CreateDraftComment.java
@@ -0,0 +1,135 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.change;
+
+import static com.google.gerrit.server.CommentsUtil.setCommentRevId;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.api.changes.DraftInput;
+import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.extensions.restapi.Url;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.PatchLineComment.Status;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.patch.PatchListCache;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestModifyView;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.Collections;
+
+@Singleton
+public class CreateDraftComment
+    extends RetryingRestModifyView<RevisionResource, DraftInput, Response<CommentInfo>> {
+  private final Provider<ReviewDb> db;
+  private final Provider<CommentJson> commentJson;
+  private final CommentsUtil commentsUtil;
+  private final PatchSetUtil psUtil;
+  private final PatchListCache patchListCache;
+
+  @Inject
+  CreateDraftComment(
+      Provider<ReviewDb> db,
+      RetryHelper retryHelper,
+      Provider<CommentJson> commentJson,
+      CommentsUtil commentsUtil,
+      PatchSetUtil psUtil,
+      PatchListCache patchListCache) {
+    super(retryHelper);
+    this.db = db;
+    this.commentJson = commentJson;
+    this.commentsUtil = commentsUtil;
+    this.psUtil = psUtil;
+    this.patchListCache = patchListCache;
+  }
+
+  @Override
+  protected Response<CommentInfo> applyImpl(
+      BatchUpdate.Factory updateFactory, RevisionResource rsrc, DraftInput in)
+      throws RestApiException, UpdateException, OrmException, PermissionBackendException {
+    if (Strings.isNullOrEmpty(in.path)) {
+      throw new BadRequestException("path must be non-empty");
+    } else if (in.message == null || in.message.trim().isEmpty()) {
+      throw new BadRequestException("message must be non-empty");
+    } else if (in.line != null && in.line < 0) {
+      throw new BadRequestException("line must be >= 0");
+    } else if (in.line != null && in.range != null && in.line != in.range.endLine) {
+      throw new BadRequestException("range endLine must be on the same line as the comment");
+    }
+
+    try (BatchUpdate bu =
+        updateFactory.create(db.get(), rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
+      Op op = new Op(rsrc.getPatchSet().getId(), in);
+      bu.addOp(rsrc.getChange().getId(), op);
+      bu.execute();
+      return Response.created(
+          commentJson.get().setFillAccounts(false).newCommentFormatter().format(op.comment));
+    }
+  }
+
+  private class Op implements BatchUpdateOp {
+    private final PatchSet.Id psId;
+    private final DraftInput in;
+
+    private Comment comment;
+
+    private Op(PatchSet.Id psId, DraftInput in) {
+      this.psId = psId;
+      this.in = in;
+    }
+
+    @Override
+    public boolean updateChange(ChangeContext ctx)
+        throws ResourceNotFoundException, OrmException, UnprocessableEntityException,
+            PatchListNotAvailableException {
+      PatchSet ps = psUtil.get(ctx.getDb(), ctx.getNotes(), psId);
+      if (ps == null) {
+        throw new ResourceNotFoundException("patch set not found: " + psId);
+      }
+      String parentUuid = Url.decode(in.inReplyTo);
+
+      comment =
+          commentsUtil.newComment(
+              ctx, in.path, ps.getId(), in.side(), in.message.trim(), in.unresolved, parentUuid);
+      comment.setLineNbrAndRange(in.line, in.range);
+      comment.tag = in.tag;
+
+      setCommentRevId(comment, patchListCache, ctx.getChange(), ps);
+
+      commentsUtil.putComments(
+          ctx.getDb(), ctx.getUpdate(psId), Status.DRAFT, Collections.singleton(comment));
+      ctx.dontBumpLastUpdatedOn();
+      return true;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/CreateMergePatchSet.java b/java/com/google/gerrit/server/restapi/change/CreateMergePatchSet.java
new file mode 100644
index 0000000..1b85d0b
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/CreateMergePatchSet.java
@@ -0,0 +1,269 @@
+// 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.
+
+package com.google.gerrit.server.restapi.change;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
+import com.google.common.collect.Iterables;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.client.ListChangesOption;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.MergeInput;
+import com.google.gerrit.extensions.common.MergePatchSetInput;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.MergeConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ChangeUtil;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.change.ChangeFinder;
+import com.google.gerrit.server.change.ChangeJson;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.PatchSetInserter;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.MergeUtil;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.restapi.project.CommitsCollection;
+import com.google.gerrit.server.submit.MergeIdenticalTreeException;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestModifyView;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.List;
+import java.util.TimeZone;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.util.ChangeIdUtil;
+
+@Singleton
+public class CreateMergePatchSet
+    extends RetryingRestModifyView<ChangeResource, MergePatchSetInput, Response<ChangeInfo>> {
+  private final Provider<ReviewDb> db;
+  private final GitRepositoryManager gitManager;
+  private final CommitsCollection commits;
+  private final TimeZone serverTimeZone;
+  private final Provider<CurrentUser> user;
+  private final ChangeJson.Factory jsonFactory;
+  private final PatchSetUtil psUtil;
+  private final MergeUtil.Factory mergeUtilFactory;
+  private final PatchSetInserter.Factory patchSetInserterFactory;
+  private final ProjectCache projectCache;
+  private final ChangeFinder changeFinder;
+  private final PermissionBackend permissionBackend;
+
+  @Inject
+  CreateMergePatchSet(
+      Provider<ReviewDb> db,
+      GitRepositoryManager gitManager,
+      CommitsCollection commits,
+      @GerritPersonIdent PersonIdent myIdent,
+      Provider<CurrentUser> user,
+      ChangeJson.Factory json,
+      PatchSetUtil psUtil,
+      MergeUtil.Factory mergeUtilFactory,
+      RetryHelper retryHelper,
+      PatchSetInserter.Factory patchSetInserterFactory,
+      ProjectCache projectCache,
+      ChangeFinder changeFinder,
+      PermissionBackend permissionBackend) {
+    super(retryHelper);
+    this.db = db;
+    this.gitManager = gitManager;
+    this.commits = commits;
+    this.serverTimeZone = myIdent.getTimeZone();
+    this.user = user;
+    this.jsonFactory = json;
+    this.psUtil = psUtil;
+    this.mergeUtilFactory = mergeUtilFactory;
+    this.patchSetInserterFactory = patchSetInserterFactory;
+    this.projectCache = projectCache;
+    this.changeFinder = changeFinder;
+    this.permissionBackend = permissionBackend;
+  }
+
+  @Override
+  protected Response<ChangeInfo> applyImpl(
+      BatchUpdate.Factory updateFactory, ChangeResource rsrc, MergePatchSetInput in)
+      throws OrmException, IOException, RestApiException, UpdateException,
+          PermissionBackendException {
+    // Not allowed to create a new patch set if the current patch set is locked.
+    psUtil.checkPatchSetNotLocked(rsrc.getNotes());
+
+    rsrc.permissions().database(db).check(ChangePermission.ADD_PATCH_SET);
+
+    ProjectState projectState = projectCache.checkedGet(rsrc.getProject());
+    projectState.checkStatePermitsWrite();
+
+    MergeInput merge = in.merge;
+    if (merge == null || Strings.isNullOrEmpty(merge.source)) {
+      throw new BadRequestException("merge.source must be non-empty");
+    }
+    in.baseChange = Strings.nullToEmpty(in.baseChange).trim();
+
+    PatchSet ps = psUtil.current(db.get(), rsrc.getNotes());
+    Change change = rsrc.getChange();
+    Project.NameKey project = change.getProject();
+    Branch.NameKey dest = change.getDest();
+    try (Repository git = gitManager.openRepository(project);
+        ObjectInserter oi = git.newObjectInserter();
+        ObjectReader reader = oi.newReader();
+        RevWalk rw = new RevWalk(reader)) {
+
+      RevCommit sourceCommit = MergeUtil.resolveCommit(git, rw, merge.source);
+      if (!commits.canRead(projectState, git, sourceCommit)) {
+        throw new ResourceNotFoundException(
+            "cannot find source commit: " + merge.source + " to merge.");
+      }
+
+      RevCommit currentPsCommit;
+      List<String> groups = null;
+      if (!in.inheritParent && !in.baseChange.isEmpty()) {
+        PatchSet basePS = findBasePatchSet(in.baseChange);
+        currentPsCommit = rw.parseCommit(ObjectId.fromString(basePS.getRevision().get()));
+        groups = basePS.getGroups();
+      } else {
+        currentPsCommit = rw.parseCommit(ObjectId.fromString(ps.getRevision().get()));
+      }
+
+      Timestamp now = TimeUtil.nowTs();
+      IdentifiedUser me = user.get().asIdentifiedUser();
+      PersonIdent author = me.newCommitterIdent(now, serverTimeZone);
+      RevCommit newCommit =
+          createMergeCommit(
+              in,
+              projectState,
+              dest,
+              git,
+              oi,
+              rw,
+              currentPsCommit,
+              sourceCommit,
+              author,
+              ObjectId.fromString(change.getKey().get().substring(1)));
+
+      PatchSet.Id nextPsId = ChangeUtil.nextPatchSetId(ps.getId());
+      PatchSetInserter psInserter =
+          patchSetInserterFactory.create(rsrc.getNotes(), nextPsId, newCommit);
+      try (BatchUpdate bu = updateFactory.create(db.get(), project, me, now)) {
+        bu.setRepository(git, rw, oi);
+        psInserter
+            .setMessage("Uploaded patch set " + nextPsId.get() + ".")
+            .setNotify(NotifyHandling.NONE)
+            .setCheckAddPatchSetPermission(false)
+            .setNotify(NotifyHandling.NONE);
+        if (groups != null) {
+          psInserter.setGroups(groups);
+        }
+        bu.addOp(rsrc.getId(), psInserter);
+        bu.execute();
+      }
+
+      ChangeJson json = jsonFactory.create(ListChangesOption.CURRENT_REVISION);
+      return Response.ok(json.format(psInserter.getChange()));
+    }
+  }
+
+  private PatchSet findBasePatchSet(String baseChange)
+      throws PermissionBackendException, OrmException, UnprocessableEntityException {
+    List<ChangeNotes> notes = changeFinder.find(baseChange);
+    if (notes.size() != 1) {
+      throw new UnprocessableEntityException("Base change not found: " + baseChange);
+    }
+    ChangeNotes change = Iterables.getOnlyElement(notes);
+    try {
+      permissionBackend.currentUser().change(change).database(db).check(ChangePermission.READ);
+    } catch (AuthException e) {
+      throw new UnprocessableEntityException("Read not permitted for " + baseChange);
+    }
+    return psUtil.current(db.get(), change);
+  }
+
+  private RevCommit createMergeCommit(
+      MergePatchSetInput in,
+      ProjectState projectState,
+      Branch.NameKey dest,
+      Repository git,
+      ObjectInserter oi,
+      RevWalk rw,
+      RevCommit currentPsCommit,
+      RevCommit sourceCommit,
+      PersonIdent author,
+      ObjectId changeId)
+      throws ResourceNotFoundException, MergeIdenticalTreeException, MergeConflictException,
+          IOException {
+
+    ObjectId parentCommit;
+    if (in.inheritParent) {
+      // inherit first parent from previous patch set
+      parentCommit = currentPsCommit.getParent(0);
+    } else if (!in.baseChange.isEmpty()) {
+      parentCommit = currentPsCommit.getId();
+    } else {
+      // get the current branch tip of destination branch
+      Ref destRef = git.getRefDatabase().exactRef(dest.get());
+      if (destRef != null) {
+        parentCommit = destRef.getObjectId();
+      } else {
+        throw new ResourceNotFoundException("cannot find destination branch");
+      }
+    }
+    RevCommit mergeTip = rw.parseCommit(parentCommit);
+
+    String commitMsg;
+    if (Strings.emptyToNull(in.subject) != null) {
+      commitMsg = ChangeIdUtil.insertId(in.subject, changeId);
+    } else {
+      // reuse previous patch set commit message
+      commitMsg = currentPsCommit.getFullMessage();
+    }
+
+    String mergeStrategy =
+        MoreObjects.firstNonNull(
+            Strings.emptyToNull(in.merge.strategy),
+            mergeUtilFactory.create(projectState).mergeStrategyName());
+
+    return MergeUtil.createMergeCommit(
+        oi, git.getConfig(), mergeTip, sourceCommit, mergeStrategy, author, commitMsg, rw);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/DeleteAssignee.java b/java/com/google/gerrit/server/restapi/change/DeleteAssignee.java
new file mode 100644
index 0000000..7d68022
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/DeleteAssignee.java
@@ -0,0 +1,132 @@
+// 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.
+
+package com.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountLoader;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.extensions.events.AssigneeChanged;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.Context;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestModifyView;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@Singleton
+public class DeleteAssignee
+    extends RetryingRestModifyView<ChangeResource, Input, Response<AccountInfo>> {
+
+  private final ChangeMessagesUtil cmUtil;
+  private final Provider<ReviewDb> db;
+  private final AssigneeChanged assigneeChanged;
+  private final IdentifiedUser.GenericFactory userFactory;
+  private final AccountLoader.Factory accountLoaderFactory;
+
+  @Inject
+  DeleteAssignee(
+      RetryHelper retryHelper,
+      ChangeMessagesUtil cmUtil,
+      Provider<ReviewDb> db,
+      AssigneeChanged assigneeChanged,
+      IdentifiedUser.GenericFactory userFactory,
+      AccountLoader.Factory accountLoaderFactory) {
+    super(retryHelper);
+    this.cmUtil = cmUtil;
+    this.db = db;
+    this.assigneeChanged = assigneeChanged;
+    this.userFactory = userFactory;
+    this.accountLoaderFactory = accountLoaderFactory;
+  }
+
+  @Override
+  protected Response<AccountInfo> applyImpl(
+      BatchUpdate.Factory updateFactory, ChangeResource rsrc, Input input)
+      throws RestApiException, UpdateException, OrmException, PermissionBackendException {
+    rsrc.permissions().check(ChangePermission.EDIT_ASSIGNEE);
+
+    try (BatchUpdate bu =
+        updateFactory.create(db.get(), rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
+      Op op = new Op();
+      bu.addOp(rsrc.getChange().getId(), op);
+      bu.execute();
+      Account.Id deletedAssignee = op.getDeletedAssignee();
+      return deletedAssignee == null
+          ? Response.none()
+          : Response.ok(accountLoaderFactory.create(true).fillOne(deletedAssignee));
+    }
+  }
+
+  private class Op implements BatchUpdateOp {
+    private Change change;
+    private AccountState deletedAssignee;
+
+    @Override
+    public boolean updateChange(ChangeContext ctx) throws RestApiException, OrmException {
+      change = ctx.getChange();
+      ChangeUpdate update = ctx.getUpdate(change.currentPatchSetId());
+      Account.Id currentAssigneeId = change.getAssignee();
+      if (currentAssigneeId == null) {
+        return false;
+      }
+      IdentifiedUser deletedAssigneeUser = userFactory.create(currentAssigneeId);
+      deletedAssignee = deletedAssigneeUser.state();
+      // noteDb
+      update.removeAssignee();
+      // reviewDb
+      change.setAssignee(null);
+      addMessage(ctx, update, deletedAssigneeUser);
+      return true;
+    }
+
+    public Account.Id getDeletedAssignee() {
+      return deletedAssignee != null ? deletedAssignee.getAccount().getId() : null;
+    }
+
+    private void addMessage(ChangeContext ctx, ChangeUpdate update, IdentifiedUser deletedAssignee)
+        throws OrmException {
+      ChangeMessage cmsg =
+          ChangeMessagesUtil.newMessage(
+              ctx,
+              "Assignee deleted: " + deletedAssignee.getNameEmail(),
+              ChangeMessagesUtil.TAG_DELETE_ASSIGNEE);
+      cmUtil.addChangeMessage(ctx.getDb(), update, cmsg);
+    }
+
+    @Override
+    public void postUpdate(Context ctx) throws OrmException {
+      assigneeChanged.fire(change, ctx.getAccount(), deletedAssignee, ctx.getWhen());
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/DeleteChange.java b/java/com/google/gerrit/server/restapi/change/DeleteChange.java
new file mode 100644
index 0000000..fe2c516
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/DeleteChange.java
@@ -0,0 +1,93 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.change;
+
+import static com.google.gerrit.extensions.conditions.BooleanCondition.and;
+
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.webui.UiAction;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.DeleteChangeOp;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.Order;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestModifyView;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@Singleton
+public class DeleteChange extends RetryingRestModifyView<ChangeResource, Input, Response<?>>
+    implements UiAction<ChangeResource> {
+
+  private final Provider<ReviewDb> db;
+  private final Provider<DeleteChangeOp> opProvider;
+
+  @Inject
+  public DeleteChange(
+      Provider<ReviewDb> db, RetryHelper retryHelper, Provider<DeleteChangeOp> opProvider) {
+    super(retryHelper);
+    this.db = db;
+    this.opProvider = opProvider;
+  }
+
+  @Override
+  protected Response<?> applyImpl(
+      BatchUpdate.Factory updateFactory, ChangeResource rsrc, Input input)
+      throws RestApiException, UpdateException, PermissionBackendException {
+    if (!isChangeDeletable(rsrc.getChange().getStatus())) {
+      throw new MethodNotAllowedException("delete not permitted");
+    }
+    rsrc.permissions().database(db).check(ChangePermission.DELETE);
+
+    try (BatchUpdate bu =
+        updateFactory.create(db.get(), rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
+      Change.Id id = rsrc.getChange().getId();
+      bu.setOrder(Order.DB_BEFORE_REPO);
+      bu.addOp(id, opProvider.get());
+      bu.execute();
+    }
+    return Response.none();
+  }
+
+  @Override
+  public UiAction.Description getDescription(ChangeResource rsrc) {
+    Change.Status status = rsrc.getChange().getStatus();
+    PermissionBackend.ForChange perm = rsrc.permissions().database(db);
+    return new UiAction.Description()
+        .setLabel("Delete")
+        .setTitle("Delete change " + rsrc.getId())
+        .setVisible(and(isChangeDeletable(status), perm.testCond(ChangePermission.DELETE)));
+  }
+
+  private static boolean isChangeDeletable(Change.Status status) {
+    if (status == Change.Status.MERGED) {
+      // Merged changes should never be deleted.
+      return false;
+    }
+    // New or abandoned changes can be deleted with the right permissions.
+    return true;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/DeleteChangeEdit.java b/java/com/google/gerrit/server/restapi/change/DeleteChangeEdit.java
new file mode 100644
index 0000000..d49a804
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/DeleteChangeEdit.java
@@ -0,0 +1,54 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestCollectionModifyView;
+import com.google.gerrit.server.change.ChangeEditResource;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.edit.ChangeEdit;
+import com.google.gerrit.server.edit.ChangeEditUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Optional;
+
+@Singleton
+public class DeleteChangeEdit
+    implements RestCollectionModifyView<ChangeResource, ChangeEditResource, Input> {
+  private final ChangeEditUtil editUtil;
+
+  @Inject
+  DeleteChangeEdit(ChangeEditUtil editUtil) {
+    this.editUtil = editUtil;
+  }
+
+  @Override
+  public Response<?> apply(ChangeResource rsrc, Input input)
+      throws AuthException, ResourceNotFoundException, IOException, OrmException {
+    Optional<ChangeEdit> edit = editUtil.byChange(rsrc.getNotes(), rsrc.getUser());
+    if (edit.isPresent()) {
+      editUtil.delete(edit.get());
+    } else {
+      throw new ResourceNotFoundException();
+    }
+
+    return Response.none();
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/DeleteChangeMessage.java b/java/com/google/gerrit/server/restapi/change/DeleteChangeMessage.java
new file mode 100644
index 0000000..881d106
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/DeleteChangeMessage.java
@@ -0,0 +1,175 @@
+// 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.
+
+package com.google.gerrit.server.restapi.change;
+
+import static com.google.gerrit.server.ChangeMessagesUtil.createChangeMessageInfo;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Strings;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.api.changes.DeleteChangeMessageInput;
+import com.google.gerrit.extensions.common.ChangeMessageInfo;
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.AccountLoader;
+import com.google.gerrit.server.change.ChangeMessageResource;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestModifyView;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.List;
+
+/** Deletes a change message by rewriting history. */
+@Singleton
+public class DeleteChangeMessage
+    extends RetryingRestModifyView<
+        ChangeMessageResource, DeleteChangeMessageInput, Response<ChangeMessageInfo>> {
+
+  private final Provider<CurrentUser> userProvider;
+  private final Provider<ReviewDb> dbProvider;
+  private final PermissionBackend permissionBackend;
+  private final ChangeMessagesUtil changeMessagesUtil;
+  private final AccountLoader.Factory accountLoaderFactory;
+  private final ChangeNotes.Factory notesFactory;
+
+  @Inject
+  public DeleteChangeMessage(
+      Provider<CurrentUser> userProvider,
+      Provider<ReviewDb> dbProvider,
+      PermissionBackend permissionBackend,
+      ChangeMessagesUtil changeMessagesUtil,
+      AccountLoader.Factory accountLoaderFactory,
+      ChangeNotes.Factory notesFactory,
+      RetryHelper retryHelper) {
+    super(retryHelper);
+    this.userProvider = userProvider;
+    this.dbProvider = dbProvider;
+    this.permissionBackend = permissionBackend;
+    this.changeMessagesUtil = changeMessagesUtil;
+    this.accountLoaderFactory = accountLoaderFactory;
+    this.notesFactory = notesFactory;
+  }
+
+  @Override
+  public Response<ChangeMessageInfo> applyImpl(
+      BatchUpdate.Factory updateFactory,
+      ChangeMessageResource resource,
+      DeleteChangeMessageInput input)
+      throws RestApiException, PermissionBackendException, OrmException, UpdateException,
+          IOException {
+    CurrentUser user = userProvider.get();
+    permissionBackend.user(user).check(GlobalPermission.ADMINISTRATE_SERVER);
+
+    String newChangeMessage =
+        createNewChangeMessage(user.asIdentifiedUser().getName(), input.reason);
+    DeleteChangeMessageOp deleteChangeMessageOp =
+        new DeleteChangeMessageOp(resource.getChangeMessageIndex(), newChangeMessage);
+    try (BatchUpdate batchUpdate =
+        updateFactory.create(
+            dbProvider.get(), resource.getChangeResource().getProject(), user, TimeUtil.nowTs())) {
+      batchUpdate.addOp(resource.getChangeId(), deleteChangeMessageOp).execute();
+    }
+
+    ChangeMessageInfo updatedMessageInfo =
+        createUpdatedChangeMessageInfo(resource.getChangeId(), resource.getChangeMessageIndex());
+    return Response.created(updatedMessageInfo);
+  }
+
+  private ChangeMessageInfo createUpdatedChangeMessageInfo(Change.Id id, int targetIdx)
+      throws OrmException, PermissionBackendException {
+    List<ChangeMessage> messages =
+        changeMessagesUtil.byChange(dbProvider.get(), notesFactory.createChecked(id));
+    ChangeMessage updatedChangeMessage = messages.get(targetIdx);
+    AccountLoader accountLoader = accountLoaderFactory.create(true);
+    ChangeMessageInfo info = createChangeMessageInfo(updatedChangeMessage, accountLoader);
+    accountLoader.fill();
+    return info;
+  }
+
+  @VisibleForTesting
+  public static String createNewChangeMessage(String deletedBy, @Nullable String deletedReason) {
+    requireNonNull(deletedBy, "user name must not be null");
+
+    if (Strings.isNullOrEmpty(deletedReason)) {
+      return createNewChangeMessage(deletedBy);
+    }
+    return String.format("Change message removed by: %s\nReason: %s", deletedBy, deletedReason);
+  }
+
+  @VisibleForTesting
+  public static String createNewChangeMessage(String deletedBy) {
+    requireNonNull(deletedBy, "user name must not be null");
+
+    return "Change message removed by: " + deletedBy;
+  }
+
+  private class DeleteChangeMessageOp implements BatchUpdateOp {
+    private final int targetMessageIdx;
+    private final String newMessage;
+
+    DeleteChangeMessageOp(int targetMessageIdx, String newMessage) {
+      this.targetMessageIdx = targetMessageIdx;
+      this.newMessage = newMessage;
+    }
+
+    @Override
+    public boolean updateChange(ChangeContext ctx) throws OrmException {
+      PatchSet.Id psId = ctx.getChange().currentPatchSetId();
+      changeMessagesUtil.replaceChangeMessage(
+          ctx.getDb(), ctx.getUpdate(psId), targetMessageIdx, newMessage);
+      return true;
+    }
+  }
+
+  @Singleton
+  public static class DefaultDeleteChangeMessage
+      extends RetryingRestModifyView<ChangeMessageResource, Input, Response<ChangeMessageInfo>> {
+    private final DeleteChangeMessage deleteChangeMessage;
+
+    @Inject
+    public DefaultDeleteChangeMessage(
+        DeleteChangeMessage deleteChangeMessage, RetryHelper retryHelper) {
+      super(retryHelper);
+      this.deleteChangeMessage = deleteChangeMessage;
+    }
+
+    @Override
+    protected Response<ChangeMessageInfo> applyImpl(
+        BatchUpdate.Factory updateFactory, ChangeMessageResource resource, Input input)
+        throws Exception {
+      return deleteChangeMessage.applyImpl(updateFactory, resource, new DeleteChangeMessageInput());
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/DeleteComment.java b/java/com/google/gerrit/server/restapi/change/DeleteComment.java
new file mode 100644
index 0000000..2ddf359
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/DeleteComment.java
@@ -0,0 +1,141 @@
+// Copyright (C) 2017 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.google.gerrit.server.restapi.change;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.api.changes.DeleteCommentInput;
+import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.change.CommentResource;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestModifyView;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.List;
+import java.util.Optional;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class DeleteComment
+    extends RetryingRestModifyView<CommentResource, DeleteCommentInput, CommentInfo> {
+
+  private final Provider<CurrentUser> userProvider;
+  private final Provider<ReviewDb> dbProvider;
+  private final PermissionBackend permissionBackend;
+  private final CommentsUtil commentsUtil;
+  private final Provider<CommentJson> commentJson;
+  private final ChangeNotes.Factory notesFactory;
+
+  @Inject
+  public DeleteComment(
+      Provider<CurrentUser> userProvider,
+      Provider<ReviewDb> dbProvider,
+      PermissionBackend permissionBackend,
+      RetryHelper retryHelper,
+      CommentsUtil commentsUtil,
+      Provider<CommentJson> commentJson,
+      ChangeNotes.Factory notesFactory) {
+    super(retryHelper);
+    this.userProvider = userProvider;
+    this.dbProvider = dbProvider;
+    this.permissionBackend = permissionBackend;
+    this.commentsUtil = commentsUtil;
+    this.commentJson = commentJson;
+    this.notesFactory = notesFactory;
+  }
+
+  @Override
+  public CommentInfo applyImpl(
+      BatchUpdate.Factory batchUpdateFactory, CommentResource rsrc, DeleteCommentInput input)
+      throws RestApiException, IOException, ConfigInvalidException, OrmException,
+          PermissionBackendException, UpdateException {
+    CurrentUser user = userProvider.get();
+    permissionBackend.user(user).check(GlobalPermission.ADMINISTRATE_SERVER);
+
+    if (input == null) {
+      input = new DeleteCommentInput();
+    }
+
+    String newMessage = getCommentNewMessage(user.asIdentifiedUser().getName(), input.reason);
+    DeleteCommentOp deleteCommentOp = new DeleteCommentOp(rsrc, newMessage);
+    try (BatchUpdate batchUpdate =
+        batchUpdateFactory.create(
+            dbProvider.get(), rsrc.getRevisionResource().getProject(), user, TimeUtil.nowTs())) {
+      batchUpdate.addOp(rsrc.getRevisionResource().getChange().getId(), deleteCommentOp).execute();
+    }
+
+    ChangeNotes updatedNotes =
+        notesFactory.createChecked(rsrc.getRevisionResource().getChange().getId());
+    List<Comment> changeComments = commentsUtil.publishedByChange(dbProvider.get(), updatedNotes);
+    Optional<Comment> updatedComment =
+        changeComments.stream().filter(c -> c.key.equals(rsrc.getComment().key)).findFirst();
+    if (!updatedComment.isPresent()) {
+      // This should not happen as this endpoint should not remove the whole comment.
+      throw new ResourceNotFoundException("comment not found: " + rsrc.getComment().key);
+    }
+
+    return commentJson.get().newCommentFormatter().format(updatedComment.get());
+  }
+
+  private static String getCommentNewMessage(String name, String reason) {
+    StringBuilder stringBuilder = new StringBuilder("Comment removed by: ").append(name);
+    if (!Strings.isNullOrEmpty(reason)) {
+      stringBuilder.append("; Reason: ").append(reason);
+    }
+    return stringBuilder.toString();
+  }
+
+  private class DeleteCommentOp implements BatchUpdateOp {
+    private final CommentResource rsrc;
+    private final String newMessage;
+
+    DeleteCommentOp(CommentResource rsrc, String newMessage) {
+      this.rsrc = rsrc;
+      this.newMessage = newMessage;
+    }
+
+    @Override
+    public boolean updateChange(ChangeContext ctx)
+        throws ResourceConflictException, OrmException, ResourceNotFoundException {
+      PatchSet.Id psId = ctx.getChange().currentPatchSetId();
+      commentsUtil.deleteCommentByRewritingHistory(
+          ctx.getDb(),
+          ctx.getUpdate(psId),
+          rsrc.getComment().key,
+          rsrc.getPatchSet().getId(),
+          newMessage);
+      return true;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/DeleteDraftComment.java b/java/com/google/gerrit/server/restapi/change/DeleteDraftComment.java
new file mode 100644
index 0000000..f8e3add
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/DeleteDraftComment.java
@@ -0,0 +1,110 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.change;
+
+import static com.google.gerrit.server.CommentsUtil.setCommentRevId;
+
+import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.change.DraftCommentResource;
+import com.google.gerrit.server.patch.PatchListCache;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestModifyView;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.Collections;
+import java.util.Optional;
+
+@Singleton
+public class DeleteDraftComment
+    extends RetryingRestModifyView<DraftCommentResource, Input, Response<CommentInfo>> {
+
+  private final Provider<ReviewDb> db;
+  private final CommentsUtil commentsUtil;
+  private final PatchSetUtil psUtil;
+  private final PatchListCache patchListCache;
+
+  @Inject
+  DeleteDraftComment(
+      Provider<ReviewDb> db,
+      CommentsUtil commentsUtil,
+      PatchSetUtil psUtil,
+      RetryHelper retryHelper,
+      PatchListCache patchListCache) {
+    super(retryHelper);
+    this.db = db;
+    this.commentsUtil = commentsUtil;
+    this.psUtil = psUtil;
+    this.patchListCache = patchListCache;
+  }
+
+  @Override
+  protected Response<CommentInfo> applyImpl(
+      BatchUpdate.Factory updateFactory, DraftCommentResource rsrc, Input input)
+      throws RestApiException, UpdateException {
+    try (BatchUpdate bu =
+        updateFactory.create(
+            db.get(), rsrc.getChange().getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
+      Op op = new Op(rsrc.getComment().key);
+      bu.addOp(rsrc.getChange().getId(), op);
+      bu.execute();
+    }
+    return Response.none();
+  }
+
+  private class Op implements BatchUpdateOp {
+    private final Comment.Key key;
+
+    private Op(Comment.Key key) {
+      this.key = key;
+    }
+
+    @Override
+    public boolean updateChange(ChangeContext ctx)
+        throws ResourceNotFoundException, OrmException, PatchListNotAvailableException {
+      Optional<Comment> maybeComment =
+          commentsUtil.getDraft(ctx.getDb(), ctx.getNotes(), ctx.getIdentifiedUser(), key);
+      if (!maybeComment.isPresent()) {
+        return false; // Nothing to do.
+      }
+      PatchSet.Id psId = new PatchSet.Id(ctx.getChange().getId(), key.patchSetId);
+      PatchSet ps = psUtil.get(ctx.getDb(), ctx.getNotes(), psId);
+      if (ps == null) {
+        throw new ResourceNotFoundException("patch set not found: " + psId);
+      }
+      Comment c = maybeComment.get();
+      setCommentRevId(c, patchListCache, ctx.getChange(), ps);
+      commentsUtil.deleteComments(ctx.getDb(), ctx.getUpdate(psId), Collections.singleton(c));
+      ctx.dontBumpLastUpdatedOn();
+      return true;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/DeletePrivate.java b/java/com/google/gerrit/server/restapi/change/DeletePrivate.java
new file mode 100644
index 0000000..9ecd56e
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/DeletePrivate.java
@@ -0,0 +1,88 @@
+// Copyright (C) 2017 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.google.gerrit.server.restapi.change;
+
+import static com.google.gerrit.extensions.conditions.BooleanCondition.or;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.conditions.BooleanCondition;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.SetPrivateOp;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestModifyView;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@Singleton
+public class DeletePrivate
+    extends RetryingRestModifyView<ChangeResource, SetPrivateOp.Input, Response<String>> {
+  private final ChangeMessagesUtil cmUtil;
+  private final Provider<ReviewDb> dbProvider;
+  private final PermissionBackend permissionBackend;
+  private final SetPrivateOp.Factory setPrivateOpFactory;
+
+  @Inject
+  DeletePrivate(
+      Provider<ReviewDb> dbProvider,
+      RetryHelper retryHelper,
+      ChangeMessagesUtil cmUtil,
+      PermissionBackend permissionBackend,
+      SetPrivateOp.Factory setPrivateOpFactory) {
+    super(retryHelper);
+    this.dbProvider = dbProvider;
+    this.cmUtil = cmUtil;
+    this.permissionBackend = permissionBackend;
+    this.setPrivateOpFactory = setPrivateOpFactory;
+  }
+
+  @Override
+  protected Response<String> applyImpl(
+      BatchUpdate.Factory updateFactory, ChangeResource rsrc, @Nullable SetPrivateOp.Input input)
+      throws RestApiException, UpdateException {
+    if (!canDeletePrivate(rsrc).value()) {
+      throw new AuthException("not allowed to unmark private");
+    }
+
+    if (!rsrc.getChange().isPrivate()) {
+      throw new ResourceConflictException("change is not private");
+    }
+
+    SetPrivateOp op = setPrivateOpFactory.create(cmUtil, false, input);
+    try (BatchUpdate u =
+        updateFactory.create(
+            dbProvider.get(), rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
+      u.addOp(rsrc.getId(), op).execute();
+    }
+
+    return Response.none();
+  }
+
+  protected BooleanCondition canDeletePrivate(ChangeResource rsrc) {
+    PermissionBackend.WithUser user = permissionBackend.user(rsrc.getUser());
+    return or(rsrc.isUserOwner(), user.testCond(GlobalPermission.ADMINISTRATE_SERVER));
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/DeletePrivateByPost.java b/java/com/google/gerrit/server/restapi/change/DeletePrivateByPost.java
new file mode 100644
index 0000000..f73705b
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/DeletePrivateByPost.java
@@ -0,0 +1,49 @@
+// Copyright (C) 2017 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.google.gerrit.server.restapi.change;
+
+import static com.google.gerrit.extensions.conditions.BooleanCondition.and;
+
+import com.google.gerrit.extensions.webui.UiAction;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.SetPrivateOp;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@Singleton
+public class DeletePrivateByPost extends DeletePrivate implements UiAction<ChangeResource> {
+  @Inject
+  DeletePrivateByPost(
+      Provider<ReviewDb> dbProvider,
+      RetryHelper retryHelper,
+      ChangeMessagesUtil cmUtil,
+      PermissionBackend permissionBackend,
+      SetPrivateOp.Factory setPrivateOpFactory) {
+    super(dbProvider, retryHelper, cmUtil, permissionBackend, setPrivateOpFactory);
+  }
+
+  @Override
+  public Description getDescription(ChangeResource rsrc) {
+    return new UiAction.Description()
+        .setLabel("Unmark private")
+        .setTitle("Unmark change as private")
+        .setVisible(and(rsrc.getChange().isPrivate(), canDeletePrivate(rsrc)));
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/DeleteReviewer.java b/java/com/google/gerrit/server/restapi/change/DeleteReviewer.java
new file mode 100644
index 0000000..83ae7b3
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/DeleteReviewer.java
@@ -0,0 +1,79 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.api.changes.DeleteReviewerInput;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.change.DeleteReviewerByEmailOp;
+import com.google.gerrit.server.change.DeleteReviewerOp;
+import com.google.gerrit.server.change.ReviewerResource;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestModifyView;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@Singleton
+public class DeleteReviewer
+    extends RetryingRestModifyView<ReviewerResource, DeleteReviewerInput, Response<?>> {
+
+  private final Provider<ReviewDb> dbProvider;
+  private final DeleteReviewerOp.Factory deleteReviewerOpFactory;
+  private final DeleteReviewerByEmailOp.Factory deleteReviewerByEmailOpFactory;
+
+  @Inject
+  DeleteReviewer(
+      Provider<ReviewDb> dbProvider,
+      RetryHelper retryHelper,
+      DeleteReviewerOp.Factory deleteReviewerOpFactory,
+      DeleteReviewerByEmailOp.Factory deleteReviewerByEmailOpFactory) {
+    super(retryHelper);
+    this.dbProvider = dbProvider;
+    this.deleteReviewerOpFactory = deleteReviewerOpFactory;
+    this.deleteReviewerByEmailOpFactory = deleteReviewerByEmailOpFactory;
+  }
+
+  @Override
+  protected Response<?> applyImpl(
+      BatchUpdate.Factory updateFactory, ReviewerResource rsrc, DeleteReviewerInput input)
+      throws RestApiException, UpdateException {
+    if (input == null) {
+      input = new DeleteReviewerInput();
+    }
+
+    try (BatchUpdate bu =
+        updateFactory.create(
+            dbProvider.get(),
+            rsrc.getChangeResource().getProject(),
+            rsrc.getChangeResource().getUser(),
+            TimeUtil.nowTs())) {
+      BatchUpdateOp op;
+      if (rsrc.isByEmail()) {
+        op = deleteReviewerByEmailOpFactory.create(rsrc.getReviewerByEmail(), input);
+      } else {
+        op = deleteReviewerOpFactory.create(rsrc.getReviewerUser().state(), input);
+      }
+      bu.addOp(rsrc.getChange().getId(), op);
+      bu.execute();
+    }
+    return Response.none();
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/DeleteVote.java b/java/com/google/gerrit/server/restapi/change/DeleteVote.java
new file mode 100644
index 0000000..57649fad
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/DeleteVote.java
@@ -0,0 +1,269 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.change;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.LabelTypes;
+import com.google.gerrit.extensions.api.changes.DeleteVoteInput;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.LabelId;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.change.NotifyUtil;
+import com.google.gerrit.server.change.ReviewerResource;
+import com.google.gerrit.server.change.VoteResource;
+import com.google.gerrit.server.extensions.events.VoteDeleted;
+import com.google.gerrit.server.mail.send.DeleteVoteSender;
+import com.google.gerrit.server.mail.send.ReplyToChangeSender;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.project.RemoveReviewerControl;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.Context;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestModifyView;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.LabelVote;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+@Singleton
+public class DeleteVote extends RetryingRestModifyView<VoteResource, DeleteVoteInput, Response<?>> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final Provider<ReviewDb> db;
+  private final ApprovalsUtil approvalsUtil;
+  private final PatchSetUtil psUtil;
+  private final ChangeMessagesUtil cmUtil;
+  private final IdentifiedUser.GenericFactory userFactory;
+  private final VoteDeleted voteDeleted;
+  private final DeleteVoteSender.Factory deleteVoteSenderFactory;
+  private final NotifyUtil notifyUtil;
+  private final RemoveReviewerControl removeReviewerControl;
+  private final ProjectCache projectCache;
+
+  @Inject
+  DeleteVote(
+      Provider<ReviewDb> db,
+      RetryHelper retryHelper,
+      ApprovalsUtil approvalsUtil,
+      PatchSetUtil psUtil,
+      ChangeMessagesUtil cmUtil,
+      IdentifiedUser.GenericFactory userFactory,
+      VoteDeleted voteDeleted,
+      DeleteVoteSender.Factory deleteVoteSenderFactory,
+      NotifyUtil notifyUtil,
+      RemoveReviewerControl removeReviewerControl,
+      ProjectCache projectCache) {
+    super(retryHelper);
+    this.db = db;
+    this.approvalsUtil = approvalsUtil;
+    this.psUtil = psUtil;
+    this.cmUtil = cmUtil;
+    this.userFactory = userFactory;
+    this.voteDeleted = voteDeleted;
+    this.deleteVoteSenderFactory = deleteVoteSenderFactory;
+    this.notifyUtil = notifyUtil;
+    this.removeReviewerControl = removeReviewerControl;
+    this.projectCache = projectCache;
+  }
+
+  @Override
+  protected Response<?> applyImpl(
+      BatchUpdate.Factory updateFactory, VoteResource rsrc, DeleteVoteInput input)
+      throws RestApiException, UpdateException, IOException {
+    if (input == null) {
+      input = new DeleteVoteInput();
+    }
+    if (input.label != null && !rsrc.getLabel().equals(input.label)) {
+      throw new BadRequestException("label must match URL");
+    }
+    if (input.notify == null) {
+      input.notify = NotifyHandling.ALL;
+    }
+    ReviewerResource r = rsrc.getReviewer();
+    Change change = r.getChange();
+
+    if (r.getRevisionResource() != null && !r.getRevisionResource().isCurrent()) {
+      throw new MethodNotAllowedException("Cannot delete vote on non-current patch set");
+    }
+
+    try (BatchUpdate bu =
+        updateFactory.create(
+            db.get(), change.getProject(), r.getChangeResource().getUser(), TimeUtil.nowTs())) {
+      bu.addOp(
+          change.getId(),
+          new Op(
+              projectCache.checkedGet(r.getChange().getProject()),
+              r.getReviewerUser().state(),
+              rsrc.getLabel(),
+              input));
+      bu.execute();
+    }
+
+    return Response.none();
+  }
+
+  private class Op implements BatchUpdateOp {
+    private final ProjectState projectState;
+    private final AccountState accountState;
+    private final String label;
+    private final DeleteVoteInput input;
+
+    private ChangeMessage changeMessage;
+    private Change change;
+    private PatchSet ps;
+    private Map<String, Short> newApprovals = new HashMap<>();
+    private Map<String, Short> oldApprovals = new HashMap<>();
+
+    private Op(
+        ProjectState projectState, AccountState accountState, String label, DeleteVoteInput input) {
+      this.projectState = projectState;
+      this.accountState = accountState;
+      this.label = label;
+      this.input = input;
+    }
+
+    @Override
+    public boolean updateChange(ChangeContext ctx)
+        throws OrmException, AuthException, ResourceNotFoundException, IOException,
+            PermissionBackendException {
+      change = ctx.getChange();
+      PatchSet.Id psId = change.currentPatchSetId();
+      ps = psUtil.current(db.get(), ctx.getNotes());
+
+      boolean found = false;
+      LabelTypes labelTypes = projectState.getLabelTypes(ctx.getNotes());
+
+      Account.Id accountId = accountState.getAccount().getId();
+
+      for (PatchSetApproval a :
+          approvalsUtil.byPatchSetUser(
+              ctx.getDb(),
+              ctx.getNotes(),
+              psId,
+              accountId,
+              ctx.getRevWalk(),
+              ctx.getRepoView().getConfig())) {
+        if (labelTypes.byLabel(a.getLabelId()) == null) {
+          continue; // Ignore undefined labels.
+        } else if (!a.getLabel().equals(label)) {
+          // Populate map for non-matching labels, needed by VoteDeleted.
+          newApprovals.put(a.getLabel(), a.getValue());
+          continue;
+        } else {
+          try {
+            removeReviewerControl.checkRemoveReviewer(ctx.getNotes(), ctx.getUser(), a);
+          } catch (AuthException e) {
+            throw new AuthException("delete vote not permitted", e);
+          }
+        }
+        // Set the approval to 0 if vote is being removed.
+        newApprovals.put(a.getLabel(), (short) 0);
+        found = true;
+
+        // Set old value, as required by VoteDeleted.
+        oldApprovals.put(a.getLabel(), a.getValue());
+        break;
+      }
+      if (!found) {
+        throw new ResourceNotFoundException();
+      }
+
+      ctx.getUpdate(psId).removeApprovalFor(accountId, label);
+      ctx.getDb().patchSetApprovals().upsert(Collections.singleton(deletedApproval(ctx)));
+
+      StringBuilder msg = new StringBuilder();
+      msg.append("Removed ");
+      LabelVote.appendTo(msg, label, requireNonNull(oldApprovals.get(label)));
+      msg.append(" by ").append(userFactory.create(accountId).getNameEmail()).append("\n");
+      changeMessage =
+          ChangeMessagesUtil.newMessage(ctx, msg.toString(), ChangeMessagesUtil.TAG_DELETE_VOTE);
+      cmUtil.addChangeMessage(ctx.getDb(), ctx.getUpdate(psId), changeMessage);
+
+      return true;
+    }
+
+    private PatchSetApproval deletedApproval(ChangeContext ctx) {
+      // Set the effective user to the account we're trying to remove, and don't
+      // set the real user; this preserves the calling user as the NoteDb
+      // committer.
+      return new PatchSetApproval(
+          new PatchSetApproval.Key(
+              ps.getId(), accountState.getAccount().getId(), new LabelId(label)),
+          (short) 0,
+          ctx.getWhen());
+    }
+
+    @Override
+    public void postUpdate(Context ctx) {
+      if (changeMessage == null) {
+        return;
+      }
+
+      IdentifiedUser user = ctx.getIdentifiedUser();
+      if (NotifyUtil.shouldNotify(input.notify, input.notifyDetails)) {
+        try {
+          ReplyToChangeSender cm = deleteVoteSenderFactory.create(ctx.getProject(), change.getId());
+          cm.setFrom(user.getAccountId());
+          cm.setChangeMessage(changeMessage.getMessage(), ctx.getWhen());
+          cm.setNotify(input.notify);
+          cm.setAccountsToNotify(notifyUtil.resolveAccounts(input.notifyDetails));
+          cm.send();
+        } catch (Exception e) {
+          logger.atSevere().withCause(e).log("Cannot email update for change %s", change.getId());
+        }
+      }
+
+      voteDeleted.fire(
+          change,
+          ps,
+          accountState,
+          newApprovals,
+          oldApprovals,
+          input.notify,
+          changeMessage.getMessage(),
+          user.state(),
+          ctx.getWhen());
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/DownloadContent.java b/java/com/google/gerrit/server/restapi/change/DownloadContent.java
new file mode 100644
index 0000000..b6564c0
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/DownloadContent.java
@@ -0,0 +1,53 @@
+// Copyright (C) 2015 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.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.restapi.BinaryResult;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.change.FileContentUtil;
+import com.google.gerrit.server.change.FileResource;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.io.IOException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.kohsuke.args4j.Option;
+
+public class DownloadContent implements RestReadView<FileResource> {
+  private final FileContentUtil fileContentUtil;
+  private final ProjectCache projectCache;
+
+  @Option(name = "--parent")
+  private Integer parent;
+
+  @Inject
+  DownloadContent(FileContentUtil fileContentUtil, ProjectCache projectCache) {
+    this.fileContentUtil = fileContentUtil;
+    this.projectCache = projectCache;
+  }
+
+  @Override
+  public BinaryResult apply(FileResource rsrc)
+      throws ResourceNotFoundException, IOException, NoSuchChangeException, OrmException {
+    String path = rsrc.getPatchKey().get();
+    RevisionResource rev = rsrc.getRevision();
+    ObjectId revstr = ObjectId.fromString(rev.getPatchSet().getRevision().get());
+    return fileContentUtil.downloadContent(
+        projectCache.checkedGet(rev.getProject()), revstr, path, parent);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/DraftComments.java b/java/com/google/gerrit/server/restapi/change/DraftComments.java
new file mode 100644
index 0000000..b8e24a5
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/DraftComments.java
@@ -0,0 +1,87 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ChildCollection;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.change.DraftCommentResource;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@Singleton
+public class DraftComments implements ChildCollection<RevisionResource, DraftCommentResource> {
+  private final DynamicMap<RestView<DraftCommentResource>> views;
+  private final Provider<CurrentUser> user;
+  private final ListRevisionDrafts list;
+  private final Provider<ReviewDb> dbProvider;
+  private final CommentsUtil commentsUtil;
+
+  @Inject
+  DraftComments(
+      DynamicMap<RestView<DraftCommentResource>> views,
+      Provider<CurrentUser> user,
+      ListRevisionDrafts list,
+      Provider<ReviewDb> dbProvider,
+      CommentsUtil commentsUtil) {
+    this.views = views;
+    this.user = user;
+    this.list = list;
+    this.dbProvider = dbProvider;
+    this.commentsUtil = commentsUtil;
+  }
+
+  @Override
+  public DynamicMap<RestView<DraftCommentResource>> views() {
+    return views;
+  }
+
+  @Override
+  public ListRevisionDrafts list() throws AuthException {
+    checkIdentifiedUser();
+    return list;
+  }
+
+  @Override
+  public DraftCommentResource parse(RevisionResource rev, IdString id)
+      throws ResourceNotFoundException, OrmException, AuthException {
+    checkIdentifiedUser();
+    String uuid = id.get();
+    for (Comment c :
+        commentsUtil.draftByPatchSetAuthor(
+            dbProvider.get(), rev.getPatchSet().getId(), rev.getAccountId(), rev.getNotes())) {
+      if (uuid.equals(c.key.uuid)) {
+        return new DraftCommentResource(rev, c);
+      }
+    }
+    throw new ResourceNotFoundException(id);
+  }
+
+  private void checkIdentifiedUser() throws AuthException {
+    if (!(user.get().isIdentifiedUser())) {
+      throw new AuthException("drafts only available to authenticated users");
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/Files.java b/java/com/google/gerrit/server/restapi/change/Files.java
new file mode 100644
index 0000000..1bb6bf2
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/Files.java
@@ -0,0 +1,355 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.change;
+
+import com.google.common.collect.Lists;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.hash.Hasher;
+import com.google.common.hash.Hashing;
+import com.google.gerrit.extensions.common.FileInfo;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.CacheControl;
+import com.google.gerrit.extensions.restapi.ChildCollection;
+import com.google.gerrit.extensions.restapi.ETagView;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.change.AccountPatchReviewStore;
+import com.google.gerrit.server.change.AccountPatchReviewStore.PatchSetWithReviewedFiles;
+import com.google.gerrit.server.change.FileInfoJson;
+import com.google.gerrit.server.change.FileResource;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.patch.PatchList;
+import com.google.gerrit.server.patch.PatchListCache;
+import com.google.gerrit.server.patch.PatchListKey;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+import com.google.gerrit.server.patch.PatchListObjectTooLargeException;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.plugincontext.PluginItemContext;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.treewalk.TreeWalk;
+import org.eclipse.jgit.treewalk.filter.PathFilterGroup;
+import org.kohsuke.args4j.Option;
+
+@Singleton
+public class Files implements ChildCollection<RevisionResource, FileResource> {
+  private final DynamicMap<RestView<FileResource>> views;
+  private final Provider<ListFiles> list;
+
+  @Inject
+  Files(DynamicMap<RestView<FileResource>> views, Provider<ListFiles> list) {
+    this.views = views;
+    this.list = list;
+  }
+
+  @Override
+  public DynamicMap<RestView<FileResource>> views() {
+    return views;
+  }
+
+  @Override
+  public RestView<RevisionResource> list() throws AuthException {
+    return list.get();
+  }
+
+  @Override
+  public FileResource parse(RevisionResource rev, IdString id) {
+    return new FileResource(rev, id.get());
+  }
+
+  public static final class ListFiles implements ETagView<RevisionResource> {
+    private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+    @Option(name = "--base", metaVar = "revision-id")
+    String base;
+
+    @Option(name = "--parent", metaVar = "parent-number")
+    int parentNum;
+
+    @Option(name = "--reviewed")
+    boolean reviewed;
+
+    @Option(name = "-q")
+    String query;
+
+    private final Provider<ReviewDb> db;
+    private final Provider<CurrentUser> self;
+    private final FileInfoJson fileInfoJson;
+    private final Revisions revisions;
+    private final GitRepositoryManager gitManager;
+    private final PatchListCache patchListCache;
+    private final PatchSetUtil psUtil;
+    private final PluginItemContext<AccountPatchReviewStore> accountPatchReviewStore;
+
+    @Inject
+    ListFiles(
+        Provider<ReviewDb> db,
+        Provider<CurrentUser> self,
+        FileInfoJson fileInfoJson,
+        Revisions revisions,
+        GitRepositoryManager gitManager,
+        PatchListCache patchListCache,
+        PatchSetUtil psUtil,
+        PluginItemContext<AccountPatchReviewStore> accountPatchReviewStore) {
+      this.db = db;
+      this.self = self;
+      this.fileInfoJson = fileInfoJson;
+      this.revisions = revisions;
+      this.gitManager = gitManager;
+      this.patchListCache = patchListCache;
+      this.psUtil = psUtil;
+      this.accountPatchReviewStore = accountPatchReviewStore;
+    }
+
+    public ListFiles setReviewed(boolean r) {
+      this.reviewed = r;
+      return this;
+    }
+
+    @Override
+    public Response<?> apply(RevisionResource resource)
+        throws AuthException, BadRequestException, ResourceNotFoundException, OrmException,
+            RepositoryNotFoundException, IOException, PatchListNotAvailableException,
+            PermissionBackendException {
+      checkOptions();
+      if (reviewed) {
+        return Response.ok(reviewed(resource));
+      } else if (query != null) {
+        return Response.ok(query(resource));
+      }
+
+      Response<Map<String, FileInfo>> r;
+      if (base != null) {
+        RevisionResource baseResource =
+            revisions.parse(resource.getChangeResource(), IdString.fromDecoded(base));
+        r =
+            Response.ok(
+                fileInfoJson.toFileInfoMap(
+                    resource.getChange(),
+                    resource.getPatchSet().getRevision(),
+                    baseResource.getPatchSet()));
+      } else if (parentNum > 0) {
+        r =
+            Response.ok(
+                fileInfoJson.toFileInfoMap(
+                    resource.getChange(), resource.getPatchSet().getRevision(), parentNum - 1));
+      } else {
+        r = Response.ok(fileInfoJson.toFileInfoMap(resource.getChange(), resource.getPatchSet()));
+      }
+
+      if (resource.isCacheable()) {
+        r.caching(CacheControl.PRIVATE(7, TimeUnit.DAYS));
+      }
+      return r;
+    }
+
+    private void checkOptions() throws BadRequestException {
+      int supplied = 0;
+      if (base != null) {
+        supplied++;
+      }
+      if (parentNum > 0) {
+        supplied++;
+      }
+      if (reviewed) {
+        supplied++;
+      }
+      if (query != null) {
+        supplied++;
+      }
+      if (supplied > 1) {
+        throw new BadRequestException("cannot combine base, parent, reviewed, query");
+      }
+    }
+
+    private List<String> query(RevisionResource resource)
+        throws RepositoryNotFoundException, IOException {
+      Project.NameKey project = resource.getChange().getProject();
+      try (Repository git = gitManager.openRepository(project);
+          ObjectReader or = git.newObjectReader();
+          RevWalk rw = new RevWalk(or);
+          TreeWalk tw = new TreeWalk(or)) {
+        RevCommit c =
+            rw.parseCommit(ObjectId.fromString(resource.getPatchSet().getRevision().get()));
+
+        tw.addTree(c.getTree());
+        tw.setRecursive(true);
+        List<String> paths = new ArrayList<>();
+        while (tw.next() && paths.size() < 20) {
+          String s = tw.getPathString();
+          if (s.contains(query)) {
+            paths.add(s);
+          }
+        }
+        return paths;
+      }
+    }
+
+    private Collection<String> reviewed(RevisionResource resource)
+        throws AuthException, OrmException {
+      CurrentUser user = self.get();
+      if (!(user.isIdentifiedUser())) {
+        throw new AuthException("Authentication required");
+      }
+
+      Account.Id userId = user.getAccountId();
+      PatchSet patchSetId = resource.getPatchSet();
+      Optional<PatchSetWithReviewedFiles> o;
+      o =
+          accountPatchReviewStore.call(
+              s -> s.findReviewed(patchSetId.getId(), userId), OrmException.class);
+
+      if (o.isPresent()) {
+        PatchSetWithReviewedFiles res = o.get();
+        if (res.patchSetId().equals(patchSetId.getId())) {
+          return res.files();
+        }
+
+        try {
+          return copy(res.files(), res.patchSetId(), resource, userId);
+        } catch (PatchListObjectTooLargeException e) {
+          logger.atWarning().log("Cannot copy patch review flags: %s", e.getMessage());
+        } catch (IOException | PatchListNotAvailableException e) {
+          logger.atWarning().withCause(e).log("Cannot copy patch review flags");
+        }
+      }
+
+      return Collections.emptyList();
+    }
+
+    private List<String> copy(
+        Set<String> paths, PatchSet.Id old, RevisionResource resource, Account.Id userId)
+        throws IOException, PatchListNotAvailableException, OrmException {
+      Project.NameKey project = resource.getChange().getProject();
+      try (Repository git = gitManager.openRepository(project);
+          ObjectReader reader = git.newObjectReader();
+          RevWalk rw = new RevWalk(reader);
+          TreeWalk tw = new TreeWalk(reader)) {
+        Change change = resource.getChange();
+        PatchSet patchSet = psUtil.get(db.get(), resource.getNotes(), old);
+        if (patchSet == null) {
+          throw new PatchListNotAvailableException(
+              String.format(
+                  "patch set %s of change %s not found", old.get(), change.getId().get()));
+        }
+
+        PatchList oldList = patchListCache.get(change, patchSet);
+
+        PatchList curList = patchListCache.get(change, resource.getPatchSet());
+
+        int sz = paths.size();
+        List<String> pathList = Lists.newArrayListWithCapacity(sz);
+
+        tw.setFilter(PathFilterGroup.createFromStrings(paths));
+        tw.setRecursive(true);
+        int o = tw.addTree(rw.parseCommit(oldList.getNewId()).getTree());
+        int c = tw.addTree(rw.parseCommit(curList.getNewId()).getTree());
+
+        int op = -1;
+        if (oldList.getOldId() != null) {
+          op = tw.addTree(rw.parseTree(oldList.getOldId()));
+        }
+
+        int cp = -1;
+        if (curList.getOldId() != null) {
+          cp = tw.addTree(rw.parseTree(curList.getOldId()));
+        }
+
+        while (tw.next()) {
+          String path = tw.getPathString();
+          if (tw.getRawMode(o) != 0
+              && tw.getRawMode(c) != 0
+              && tw.idEqual(o, c)
+              && paths.contains(path)) {
+            // File exists in previously reviewed oldList and in curList.
+            // File content is identical.
+            pathList.add(path);
+          } else if (op >= 0
+              && cp >= 0
+              && tw.getRawMode(o) == 0
+              && tw.getRawMode(c) == 0
+              && tw.getRawMode(op) != 0
+              && tw.getRawMode(cp) != 0
+              && tw.idEqual(op, cp)
+              && paths.contains(path)) {
+            // File was deleted in previously reviewed oldList and curList.
+            // File exists in ancestor of oldList and curList.
+            // File content is identical in ancestors.
+            pathList.add(path);
+          }
+        }
+
+        accountPatchReviewStore.run(
+            s -> s.markReviewed(resource.getPatchSet().getId(), userId, pathList),
+            OrmException.class);
+        return pathList;
+      }
+    }
+
+    public ListFiles setQuery(String query) {
+      this.query = query;
+      return this;
+    }
+
+    public ListFiles setBase(String base) {
+      this.base = base;
+      return this;
+    }
+
+    public ListFiles setParent(int parentNum) {
+      this.parentNum = parentNum;
+      return this;
+    }
+
+    @Override
+    public String getETag(RevisionResource resource) {
+      Hasher h = Hashing.murmur3_128().newHasher();
+      resource.prepareETag(h, resource.getUser());
+      // File list comes from the PatchListCache, so any change to the key or value should
+      // invalidate ETag.
+      h.putLong(PatchListKey.serialVersionUID);
+      return h.hash().toString();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/Fixes.java b/java/com/google/gerrit/server/restapi/change/Fixes.java
new file mode 100644
index 0000000..1d8726d
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/Fixes.java
@@ -0,0 +1,73 @@
+// Copyright (C) 2017 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.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.ChildCollection;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.reviewdb.client.FixSuggestion;
+import com.google.gerrit.reviewdb.client.RobotComment;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.change.FixResource;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.List;
+import java.util.Objects;
+
+@Singleton
+public class Fixes implements ChildCollection<RevisionResource, FixResource> {
+
+  private final DynamicMap<RestView<FixResource>> views;
+  private final CommentsUtil commentsUtil;
+
+  @Inject
+  Fixes(DynamicMap<RestView<FixResource>> views, CommentsUtil commentsUtil) {
+    this.views = views;
+    this.commentsUtil = commentsUtil;
+  }
+
+  @Override
+  public RestView<RevisionResource> list() throws ResourceNotFoundException {
+    throw new ResourceNotFoundException();
+  }
+
+  @Override
+  public FixResource parse(RevisionResource revisionResource, IdString id)
+      throws ResourceNotFoundException, OrmException {
+    String fixId = id.get();
+    ChangeNotes changeNotes = revisionResource.getNotes();
+
+    List<RobotComment> robotComments =
+        commentsUtil.robotCommentsByPatchSet(changeNotes, revisionResource.getPatchSet().getId());
+    for (RobotComment robotComment : robotComments) {
+      for (FixSuggestion fixSuggestion : robotComment.fixSuggestions) {
+        if (Objects.equals(fixId, fixSuggestion.fixId)) {
+          return new FixResource(revisionResource, fixSuggestion.replacements);
+        }
+      }
+    }
+    throw new ResourceNotFoundException(id);
+  }
+
+  @Override
+  public DynamicMap<RestView<FixResource>> views() {
+    return views;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/GetArchive.java b/java/com/google/gerrit/server/restapi/change/GetArchive.java
new file mode 100644
index 0000000..1bd1bce
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/GetArchive.java
@@ -0,0 +1,109 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.change;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.BinaryResult;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.change.ArchiveFormat;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.io.OutputStream;
+import org.eclipse.jgit.api.ArchiveCommand;
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.kohsuke.args4j.Option;
+
+public class GetArchive implements RestReadView<RevisionResource> {
+  private final GitRepositoryManager repoManager;
+  private final AllowedFormats allowedFormats;
+
+  @Option(name = "--format")
+  private String format;
+
+  @Inject
+  GetArchive(GitRepositoryManager repoManager, AllowedFormats allowedFormats) {
+    this.repoManager = repoManager;
+    this.allowedFormats = allowedFormats;
+  }
+
+  @Override
+  public BinaryResult apply(RevisionResource rsrc)
+      throws BadRequestException, IOException, MethodNotAllowedException {
+    if (Strings.isNullOrEmpty(format)) {
+      throw new BadRequestException("format is not specified");
+    }
+    final ArchiveFormat f = allowedFormats.extensions.get("." + format);
+    if (f == null) {
+      throw new BadRequestException("unknown archive format");
+    }
+    if (f == ArchiveFormat.ZIP) {
+      throw new MethodNotAllowedException("zip format is disabled");
+    }
+    boolean close = true;
+    final Repository repo = repoManager.openRepository(rsrc.getProject());
+    try {
+      final RevCommit commit;
+      String name;
+      try (RevWalk rw = new RevWalk(repo)) {
+        commit = rw.parseCommit(ObjectId.fromString(rsrc.getPatchSet().getRevision().get()));
+        name = name(f, rw, commit);
+      }
+
+      BinaryResult bin =
+          new BinaryResult() {
+            @Override
+            public void writeTo(OutputStream out) throws IOException {
+              try {
+                new ArchiveCommand(repo)
+                    .setFormat(f.name())
+                    .setTree(commit.getTree())
+                    .setOutputStream(out)
+                    .call();
+              } catch (GitAPIException e) {
+                throw new IOException(e);
+              }
+            }
+
+            @Override
+            public void close() throws IOException {
+              repo.close();
+            }
+          };
+
+      bin.disableGzip().setContentType(f.getMimeType()).setAttachmentName(name);
+
+      close = false;
+      return bin;
+    } finally {
+      if (close) {
+        repo.close();
+      }
+    }
+  }
+
+  private static String name(ArchiveFormat format, RevWalk rw, RevCommit commit)
+      throws IOException {
+    return String.format(
+        "%s%s", rw.getObjectReader().abbreviate(commit, 7).name(), format.getDefaultSuffix());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/GetAssignee.java b/java/com/google/gerrit/server/restapi/change/GetAssignee.java
new file mode 100644
index 0000000..e95f8d8
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/GetAssignee.java
@@ -0,0 +1,47 @@
+// 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.
+
+package com.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.account.AccountLoader;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.Optional;
+
+@Singleton
+public class GetAssignee implements RestReadView<ChangeResource> {
+  private final AccountLoader.Factory accountLoaderFactory;
+
+  @Inject
+  GetAssignee(AccountLoader.Factory accountLoaderFactory) {
+    this.accountLoaderFactory = accountLoaderFactory;
+  }
+
+  @Override
+  public Response<AccountInfo> apply(ChangeResource rsrc)
+      throws OrmException, PermissionBackendException {
+    Optional<Account.Id> assignee = Optional.ofNullable(rsrc.getChange().getAssignee());
+    if (assignee.isPresent()) {
+      return Response.ok(accountLoaderFactory.create(true).fillOne(assignee.get()));
+    }
+    return Response.none();
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/GetBlame.java b/java/com/google/gerrit/server/restapi/change/GetBlame.java
new file mode 100644
index 0000000..c7a8015
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/GetBlame.java
@@ -0,0 +1,163 @@
+// Copyright (C) 2015 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.google.gerrit.server.restapi.change;
+
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.MultimapBuilder;
+import com.google.gerrit.extensions.common.BlameInfo;
+import com.google.gerrit.extensions.common.RangeInfo;
+import com.google.gerrit.extensions.restapi.CacheControl;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.change.FileResource;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.MergeUtil;
+import com.google.gerrit.server.patch.AutoMerger;
+import com.google.gerrit.server.project.InvalidChangeOperationException;
+import com.google.gitiles.blame.cache.BlameCache;
+import com.google.gitiles.blame.cache.Region;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.merge.ThreeWayMergeStrategy;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.kohsuke.args4j.Option;
+
+public class GetBlame implements RestReadView<FileResource> {
+
+  private final GitRepositoryManager repoManager;
+  private final BlameCache blameCache;
+  private final ThreeWayMergeStrategy mergeStrategy;
+  private final AutoMerger autoMerger;
+
+  @Option(
+      name = "--base",
+      aliases = {"-b"},
+      usage =
+          "whether to load the blame of the base revision (the direct"
+              + " parent of the change) instead of the change")
+  private boolean base;
+
+  @Inject
+  GetBlame(
+      GitRepositoryManager repoManager,
+      BlameCache blameCache,
+      @GerritServerConfig Config cfg,
+      AutoMerger autoMerger) {
+    this.repoManager = repoManager;
+    this.blameCache = blameCache;
+    this.mergeStrategy = MergeUtil.getMergeStrategy(cfg);
+    this.autoMerger = autoMerger;
+  }
+
+  @Override
+  public Response<List<BlameInfo>> apply(FileResource resource)
+      throws RestApiException, OrmException, IOException, InvalidChangeOperationException {
+    Project.NameKey project = resource.getRevision().getChange().getProject();
+    try (Repository repository = repoManager.openRepository(project);
+        ObjectInserter ins = repository.newObjectInserter();
+        ObjectReader reader = ins.newReader();
+        RevWalk revWalk = new RevWalk(reader)) {
+      String refName =
+          resource.getRevision().getEdit().isPresent()
+              ? resource.getRevision().getEdit().get().getRefName()
+              : resource.getRevision().getPatchSet().getRefName();
+
+      Ref ref = repository.findRef(refName);
+      if (ref == null) {
+        throw new ResourceNotFoundException("unknown ref " + refName);
+      }
+      ObjectId objectId = ref.getObjectId();
+      RevCommit revCommit = revWalk.parseCommit(objectId);
+      RevCommit[] parents = revCommit.getParents();
+
+      String path = resource.getPatchKey().getFileName();
+
+      List<BlameInfo> result;
+      if (!base) {
+        result = blame(revCommit, path, repository, revWalk);
+
+      } else if (parents.length == 0) {
+        throw new ResourceNotFoundException("Initial commit doesn't have base");
+
+      } else if (parents.length == 1) {
+        result = blame(parents[0], path, repository, revWalk);
+
+      } else if (parents.length == 2) {
+        ObjectId automerge = autoMerger.merge(repository, revWalk, ins, revCommit, mergeStrategy);
+        result = blame(automerge, path, repository, revWalk);
+
+      } else {
+        throw new ResourceNotFoundException(
+            "Cannot generate blame for merge commit with more than 2 parents");
+      }
+
+      Response<List<BlameInfo>> r = Response.ok(result);
+      if (resource.isCacheable()) {
+        r.caching(CacheControl.PRIVATE(7, TimeUnit.DAYS));
+      }
+      return r;
+    }
+  }
+
+  private List<BlameInfo> blame(ObjectId id, String path, Repository repository, RevWalk revWalk)
+      throws IOException {
+    ListMultimap<BlameInfo, RangeInfo> ranges =
+        MultimapBuilder.hashKeys().arrayListValues().build();
+    List<BlameInfo> result = new ArrayList<>();
+    if (blameCache.findLastCommit(repository, id, path) == null) {
+      return result;
+    }
+
+    List<Region> blameRegions = blameCache.get(repository, id, path);
+    int from = 1;
+    for (Region region : blameRegions) {
+      RevCommit commit = revWalk.parseCommit(region.getSourceCommit());
+      BlameInfo blameInfo = toBlameInfo(commit, region.getSourceAuthor());
+      ranges.put(blameInfo, new RangeInfo(from, from + region.getCount() - 1));
+      from += region.getCount();
+    }
+
+    for (BlameInfo key : ranges.keySet()) {
+      key.ranges = ranges.get(key);
+      result.add(key);
+    }
+    return result;
+  }
+
+  private static BlameInfo toBlameInfo(RevCommit commit, PersonIdent sourceAuthor) {
+    BlameInfo blameInfo = new BlameInfo();
+    blameInfo.author = sourceAuthor.getName();
+    blameInfo.id = commit.getName();
+    blameInfo.commitMsg = commit.getFullMessage();
+    blameInfo.time = commit.getCommitTime();
+    return blameInfo;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/GetChange.java b/java/com/google/gerrit/server/restapi/change/GetChange.java
new file mode 100644
index 0000000..a8f8bbb
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/GetChange.java
@@ -0,0 +1,56 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.client.ListChangesOption;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.change.ChangeJson;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.util.EnumSet;
+import org.kohsuke.args4j.Option;
+
+public class GetChange implements RestReadView<ChangeResource> {
+  private final ChangeJson.Factory json;
+  private final EnumSet<ListChangesOption> options = EnumSet.noneOf(ListChangesOption.class);
+
+  @Option(name = "-o", usage = "Output options")
+  void addOption(ListChangesOption o) {
+    options.add(o);
+  }
+
+  @Option(name = "-O", usage = "Output option flags, in hex")
+  void setOptionFlagsHex(String hex) {
+    options.addAll(ListChangesOption.fromBits(Integer.parseInt(hex, 16)));
+  }
+
+  @Inject
+  GetChange(ChangeJson.Factory json) {
+    this.json = json;
+  }
+
+  @Override
+  public Response<ChangeInfo> apply(ChangeResource rsrc) throws OrmException {
+    return Response.withMustRevalidate(json.create(options).format(rsrc));
+  }
+
+  Response<ChangeInfo> apply(RevisionResource rsrc) throws OrmException {
+    return Response.withMustRevalidate(json.create(options).format(rsrc));
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/GetChangeMessage.java b/java/com/google/gerrit/server/restapi/change/GetChangeMessage.java
new file mode 100644
index 0000000..f55785d
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/GetChangeMessage.java
@@ -0,0 +1,29 @@
+// 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.
+
+package com.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.common.ChangeMessageInfo;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.change.ChangeMessageResource;
+import com.google.inject.Singleton;
+
+/** Gets one change message. */
+@Singleton
+public class GetChangeMessage implements RestReadView<ChangeMessageResource> {
+  @Override
+  public ChangeMessageInfo apply(ChangeMessageResource resource) {
+    return resource.getChangeMessage();
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/GetComment.java b/java/com/google/gerrit/server/restapi/change/GetComment.java
new file mode 100644
index 0000000..d067dff
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/GetComment.java
@@ -0,0 +1,40 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.change.CommentResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GetComment implements RestReadView<CommentResource> {
+
+  private final Provider<CommentJson> commentJson;
+
+  @Inject
+  GetComment(Provider<CommentJson> commentJson) {
+    this.commentJson = commentJson;
+  }
+
+  @Override
+  public CommentInfo apply(CommentResource rsrc) throws OrmException, PermissionBackendException {
+    return commentJson.get().newCommentFormatter().format(rsrc.getComment());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/GetCommit.java b/java/com/google/gerrit/server/restapi/change/GetCommit.java
new file mode 100644
index 0000000..29286cb
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/GetCommit.java
@@ -0,0 +1,71 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.change;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.extensions.common.CommitInfo;
+import com.google.gerrit.extensions.restapi.CacheControl;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.change.RevisionJson;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.kohsuke.args4j.Option;
+
+public class GetCommit implements RestReadView<RevisionResource> {
+  private final GitRepositoryManager repoManager;
+  private final RevisionJson.Factory json;
+
+  private boolean addLinks;
+
+  @Inject
+  GetCommit(GitRepositoryManager repoManager, RevisionJson.Factory json) {
+    this.repoManager = repoManager;
+    this.json = json;
+  }
+
+  @Option(name = "--links", usage = "Include weblinks")
+  public GetCommit setAddLinks(boolean addLinks) {
+    this.addLinks = addLinks;
+    return this;
+  }
+
+  @Override
+  public Response<CommitInfo> apply(RevisionResource rsrc) throws IOException {
+    Project.NameKey p = rsrc.getChange().getProject();
+    try (Repository repo = repoManager.openRepository(p);
+        RevWalk rw = new RevWalk(repo)) {
+      String rev = rsrc.getPatchSet().getRevision().get();
+      RevCommit commit = rw.parseCommit(ObjectId.fromString(rev));
+      rw.parseBody(commit);
+      CommitInfo info =
+          json.create(ImmutableSet.of())
+              .getCommitInfo(rsrc.getProject(), rw, commit, addLinks, true);
+      Response<CommitInfo> r = Response.ok(info);
+      if (rsrc.isCacheable()) {
+        r.caching(CacheControl.PRIVATE(7, TimeUnit.DAYS));
+      }
+      return r;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/GetContent.java b/java/com/google/gerrit/server/restapi/change/GetContent.java
new file mode 100644
index 0000000..6b9bf17
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/GetContent.java
@@ -0,0 +1,125 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.BinaryResult;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.change.FileContentUtil;
+import com.google.gerrit.server.change.FileResource;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.patch.ComparisonType;
+import com.google.gerrit.server.patch.Text;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.kohsuke.args4j.Option;
+
+public class GetContent implements RestReadView<FileResource> {
+  private final Provider<ReviewDb> db;
+  private final GitRepositoryManager gitManager;
+  private final PatchSetUtil psUtil;
+  private final FileContentUtil fileContentUtil;
+  private final ProjectCache projectCache;
+
+  @Option(name = "--parent")
+  private Integer parent;
+
+  @Inject
+  GetContent(
+      Provider<ReviewDb> db,
+      GitRepositoryManager gitManager,
+      PatchSetUtil psUtil,
+      FileContentUtil fileContentUtil,
+      ProjectCache projectCache) {
+    this.db = db;
+    this.gitManager = gitManager;
+    this.psUtil = psUtil;
+    this.fileContentUtil = fileContentUtil;
+    this.projectCache = projectCache;
+  }
+
+  @Override
+  public BinaryResult apply(FileResource rsrc)
+      throws ResourceNotFoundException, IOException, BadRequestException, OrmException {
+    String path = rsrc.getPatchKey().get();
+    if (Patch.COMMIT_MSG.equals(path)) {
+      String msg = getMessage(rsrc.getRevision().getChangeResource().getNotes());
+      return BinaryResult.create(msg)
+          .setContentType(FileContentUtil.TEXT_X_GERRIT_COMMIT_MESSAGE)
+          .base64();
+    } else if (Patch.MERGE_LIST.equals(path)) {
+      byte[] mergeList = getMergeList(rsrc.getRevision().getChangeResource().getNotes());
+      return BinaryResult.create(mergeList)
+          .setContentType(FileContentUtil.TEXT_X_GERRIT_MERGE_LIST)
+          .base64();
+    }
+    return fileContentUtil.getContent(
+        projectCache.checkedGet(rsrc.getRevision().getProject()),
+        ObjectId.fromString(rsrc.getRevision().getPatchSet().getRevision().get()),
+        path,
+        parent);
+  }
+
+  private String getMessage(ChangeNotes notes) throws OrmException, IOException {
+    Change.Id changeId = notes.getChangeId();
+    PatchSet ps = psUtil.current(db.get(), notes);
+    if (ps == null) {
+      throw new NoSuchChangeException(changeId);
+    }
+
+    try (Repository git = gitManager.openRepository(notes.getProjectName());
+        RevWalk revWalk = new RevWalk(git)) {
+      RevCommit commit = revWalk.parseCommit(ObjectId.fromString(ps.getRevision().get()));
+      return commit.getFullMessage();
+    } catch (RepositoryNotFoundException e) {
+      throw new NoSuchChangeException(changeId, e);
+    }
+  }
+
+  private byte[] getMergeList(ChangeNotes notes) throws OrmException, IOException {
+    Change.Id changeId = notes.getChangeId();
+    PatchSet ps = psUtil.current(db.get(), notes);
+    if (ps == null) {
+      throw new NoSuchChangeException(changeId);
+    }
+
+    try (Repository git = gitManager.openRepository(notes.getProjectName());
+        RevWalk revWalk = new RevWalk(git)) {
+      return Text.forMergeList(
+              ComparisonType.againstAutoMerge(),
+              revWalk.getObjectReader(),
+              ObjectId.fromString(ps.getRevision().get()))
+          .getContent();
+    } catch (RepositoryNotFoundException e) {
+      throw new NoSuchChangeException(changeId, e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/GetDescription.java b/java/com/google/gerrit/server/restapi/change/GetDescription.java
new file mode 100644
index 0000000..1a7ec63
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/GetDescription.java
@@ -0,0 +1,28 @@
+// 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.
+
+package com.google.gerrit.server.restapi.change;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GetDescription implements RestReadView<RevisionResource> {
+  @Override
+  public String apply(RevisionResource rsrc) {
+    return Strings.nullToEmpty(rsrc.getPatchSet().getDescription());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/GetDetail.java b/java/com/google/gerrit/server/restapi/change/GetDetail.java
new file mode 100644
index 0000000..ab75ab7
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/GetDetail.java
@@ -0,0 +1,53 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.client.ListChangesOption;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import org.kohsuke.args4j.Option;
+
+public class GetDetail implements RestReadView<ChangeResource> {
+  private final GetChange delegate;
+
+  @Option(name = "-o", usage = "Output options")
+  void addOption(ListChangesOption o) {
+    delegate.addOption(o);
+  }
+
+  @Option(name = "-O", usage = "Output option flags, in hex")
+  void setOptionFlagsHex(String hex) {
+    delegate.setOptionFlagsHex(hex);
+  }
+
+  @Inject
+  GetDetail(GetChange delegate) {
+    this.delegate = delegate;
+    delegate.addOption(ListChangesOption.LABELS);
+    delegate.addOption(ListChangesOption.DETAILED_LABELS);
+    delegate.addOption(ListChangesOption.DETAILED_ACCOUNTS);
+    delegate.addOption(ListChangesOption.MESSAGES);
+    delegate.addOption(ListChangesOption.REVIEWER_UPDATES);
+  }
+
+  @Override
+  public Response<ChangeInfo> apply(ChangeResource rsrc) throws OrmException {
+    return delegate.apply(rsrc);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/GetDiff.java b/java/com/google/gerrit/server/restapi/change/GetDiff.java
new file mode 100644
index 0000000..1fae739
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/GetDiff.java
@@ -0,0 +1,458 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.change;
+
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.gerrit.util.cli.Localizable.localizable;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.gerrit.common.data.PatchScript;
+import com.google.gerrit.common.data.PatchScript.DisplayMethod;
+import com.google.gerrit.extensions.client.DiffPreferencesInfo;
+import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
+import com.google.gerrit.extensions.common.ChangeType;
+import com.google.gerrit.extensions.common.DiffInfo;
+import com.google.gerrit.extensions.common.DiffInfo.ContentEntry;
+import com.google.gerrit.extensions.common.DiffInfo.FileMeta;
+import com.google.gerrit.extensions.common.DiffInfo.IntraLineStatus;
+import com.google.gerrit.extensions.common.DiffWebLinkInfo;
+import com.google.gerrit.extensions.common.WebLinkInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.CacheControl;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.prettify.common.SparseFileContent;
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.WebLinks;
+import com.google.gerrit.server.change.FileContentUtil;
+import com.google.gerrit.server.change.FileResource;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.git.LargeObjectException;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.patch.PatchScriptFactory;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.InvalidChangeOperationException;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.diff.Edit;
+import org.eclipse.jgit.diff.ReplaceEdit;
+import org.kohsuke.args4j.CmdLineException;
+import org.kohsuke.args4j.CmdLineParser;
+import org.kohsuke.args4j.NamedOptionDef;
+import org.kohsuke.args4j.Option;
+import org.kohsuke.args4j.OptionDef;
+import org.kohsuke.args4j.spi.OptionHandler;
+import org.kohsuke.args4j.spi.Parameters;
+import org.kohsuke.args4j.spi.Setter;
+
+public class GetDiff implements RestReadView<FileResource> {
+  private static final ImmutableMap<Patch.ChangeType, ChangeType> CHANGE_TYPE =
+      Maps.immutableEnumMap(
+          new ImmutableMap.Builder<Patch.ChangeType, ChangeType>()
+              .put(Patch.ChangeType.ADDED, ChangeType.ADDED)
+              .put(Patch.ChangeType.MODIFIED, ChangeType.MODIFIED)
+              .put(Patch.ChangeType.DELETED, ChangeType.DELETED)
+              .put(Patch.ChangeType.RENAMED, ChangeType.RENAMED)
+              .put(Patch.ChangeType.COPIED, ChangeType.COPIED)
+              .put(Patch.ChangeType.REWRITE, ChangeType.REWRITE)
+              .build());
+
+  private final ProjectCache projectCache;
+  private final PatchScriptFactory.Factory patchScriptFactoryFactory;
+  private final Revisions revisions;
+  private final WebLinks webLinks;
+
+  @Option(name = "--base", metaVar = "REVISION")
+  String base;
+
+  @Option(name = "--parent", metaVar = "parent-number")
+  int parentNum;
+
+  @Deprecated
+  @Option(name = "--ignore-whitespace")
+  IgnoreWhitespace ignoreWhitespace;
+
+  @Option(name = "--whitespace")
+  Whitespace whitespace;
+
+  @Option(name = "--context", handler = ContextOptionHandler.class)
+  int context = DiffPreferencesInfo.DEFAULT_CONTEXT;
+
+  @Option(name = "--intraline")
+  boolean intraline;
+
+  @Option(name = "--weblinks-only")
+  boolean webLinksOnly;
+
+  @Inject
+  GetDiff(
+      ProjectCache projectCache,
+      PatchScriptFactory.Factory patchScriptFactoryFactory,
+      Revisions revisions,
+      WebLinks webLinks) {
+    this.projectCache = projectCache;
+    this.patchScriptFactoryFactory = patchScriptFactoryFactory;
+    this.revisions = revisions;
+    this.webLinks = webLinks;
+  }
+
+  @Override
+  public Response<DiffInfo> apply(FileResource resource)
+      throws ResourceConflictException, ResourceNotFoundException, OrmException, AuthException,
+          InvalidChangeOperationException, IOException, PermissionBackendException {
+    DiffPreferencesInfo prefs = new DiffPreferencesInfo();
+    if (whitespace != null) {
+      prefs.ignoreWhitespace = whitespace;
+    } else if (ignoreWhitespace != null) {
+      prefs.ignoreWhitespace = ignoreWhitespace.whitespace;
+    } else {
+      prefs.ignoreWhitespace = Whitespace.IGNORE_LEADING_AND_TRAILING;
+    }
+    prefs.context = context;
+    prefs.intralineDifference = intraline;
+
+    PatchScriptFactory psf;
+    PatchSet basePatchSet = null;
+    PatchSet.Id pId = resource.getPatchKey().getParentKey();
+    String fileName = resource.getPatchKey().getFileName();
+    ChangeNotes notes = resource.getRevision().getNotes();
+    if (base != null) {
+      RevisionResource baseResource =
+          revisions.parse(resource.getRevision().getChangeResource(), IdString.fromDecoded(base));
+      basePatchSet = baseResource.getPatchSet();
+      psf = patchScriptFactoryFactory.create(notes, fileName, basePatchSet.getId(), pId, prefs);
+    } else if (parentNum > 0) {
+      psf = patchScriptFactoryFactory.create(notes, fileName, parentNum - 1, pId, prefs);
+    } else {
+      psf = patchScriptFactoryFactory.create(notes, fileName, null, pId, prefs);
+    }
+
+    try {
+      psf.setLoadHistory(false);
+      psf.setLoadComments(context != DiffPreferencesInfo.WHOLE_FILE_CONTEXT);
+      PatchScript ps = psf.call();
+      Content content = new Content(ps);
+      Set<Edit> editsDueToRebase = ps.getEditsDueToRebase();
+      for (Edit edit : ps.getEdits()) {
+        if (edit.getType() == Edit.Type.EMPTY) {
+          continue;
+        }
+        content.addCommon(edit.getBeginA());
+
+        checkState(
+            content.nextA == edit.getBeginA(),
+            "nextA = %s; want %s",
+            content.nextA,
+            edit.getBeginA());
+        checkState(
+            content.nextB == edit.getBeginB(),
+            "nextB = %s; want %s",
+            content.nextB,
+            edit.getBeginB());
+        switch (edit.getType()) {
+          case DELETE:
+          case INSERT:
+          case REPLACE:
+            List<Edit> internalEdit =
+                edit instanceof ReplaceEdit ? ((ReplaceEdit) edit).getInternalEdits() : null;
+            boolean dueToRebase = editsDueToRebase.contains(edit);
+            content.addDiff(edit.getEndA(), edit.getEndB(), internalEdit, dueToRebase);
+            break;
+          case EMPTY:
+          default:
+            throw new IllegalStateException();
+        }
+      }
+      content.addCommon(ps.getA().size());
+
+      ProjectState state = projectCache.get(resource.getRevision().getChange().getProject());
+
+      DiffInfo result = new DiffInfo();
+      String revA = basePatchSet != null ? basePatchSet.getRefName() : content.commitIdA;
+      String revB =
+          resource.getRevision().getEdit().isPresent()
+              ? resource.getRevision().getEdit().get().getRefName()
+              : resource.getRevision().getPatchSet().getRefName();
+
+      List<DiffWebLinkInfo> links =
+          webLinks.getDiffLinks(
+              state.getName(),
+              resource.getPatchKey().getParentKey().getParentKey().get(),
+              basePatchSet != null ? basePatchSet.getId().get() : null,
+              revA,
+              MoreObjects.firstNonNull(ps.getOldName(), ps.getNewName()),
+              resource.getPatchKey().getParentKey().get(),
+              revB,
+              ps.getNewName());
+      result.webLinks = links.isEmpty() ? null : links;
+
+      if (!webLinksOnly) {
+        if (ps.isBinary()) {
+          result.binary = true;
+        }
+        if (ps.getDisplayMethodA() != DisplayMethod.NONE) {
+          result.metaA = new FileMeta();
+          result.metaA.name = MoreObjects.firstNonNull(ps.getOldName(), ps.getNewName());
+          result.metaA.contentType =
+              FileContentUtil.resolveContentType(
+                  state, result.metaA.name, ps.getFileModeA(), ps.getMimeTypeA());
+          result.metaA.lines = ps.getA().size();
+          result.metaA.webLinks = getFileWebLinks(state.getProject(), revA, result.metaA.name);
+          result.metaA.commitId = content.commitIdA;
+        }
+
+        if (ps.getDisplayMethodB() != DisplayMethod.NONE) {
+          result.metaB = new FileMeta();
+          result.metaB.name = ps.getNewName();
+          result.metaB.contentType =
+              FileContentUtil.resolveContentType(
+                  state, result.metaB.name, ps.getFileModeB(), ps.getMimeTypeB());
+          result.metaB.lines = ps.getB().size();
+          result.metaB.webLinks = getFileWebLinks(state.getProject(), revB, result.metaB.name);
+          result.metaB.commitId = content.commitIdB;
+        }
+
+        if (intraline) {
+          if (ps.hasIntralineTimeout()) {
+            result.intralineStatus = IntraLineStatus.TIMEOUT;
+          } else if (ps.hasIntralineFailure()) {
+            result.intralineStatus = IntraLineStatus.FAILURE;
+          } else {
+            result.intralineStatus = IntraLineStatus.OK;
+          }
+        }
+
+        result.changeType = CHANGE_TYPE.get(ps.getChangeType());
+        if (result.changeType == null) {
+          throw new IllegalStateException("unknown change type: " + ps.getChangeType());
+        }
+
+        if (ps.getPatchHeader().size() > 0) {
+          result.diffHeader = ps.getPatchHeader();
+        }
+        result.content = content.lines;
+      }
+
+      Response<DiffInfo> r = Response.ok(result);
+      if (resource.isCacheable()) {
+        r.caching(CacheControl.PRIVATE(7, TimeUnit.DAYS));
+      }
+      return r;
+    } catch (NoSuchChangeException e) {
+      throw new ResourceNotFoundException(e.getMessage(), e);
+    } catch (LargeObjectException e) {
+      throw new ResourceConflictException(e.getMessage(), e);
+    }
+  }
+
+  private List<WebLinkInfo> getFileWebLinks(Project project, String rev, String file) {
+    List<WebLinkInfo> links = webLinks.getFileLinks(project.getName(), rev, file);
+    return links.isEmpty() ? null : links;
+  }
+
+  public GetDiff setBase(String base) {
+    this.base = base;
+    return this;
+  }
+
+  public GetDiff setParent(int parentNum) {
+    this.parentNum = parentNum;
+    return this;
+  }
+
+  public GetDiff setContext(int context) {
+    this.context = context;
+    return this;
+  }
+
+  public GetDiff setIntraline(boolean intraline) {
+    this.intraline = intraline;
+    return this;
+  }
+
+  public GetDiff setWhitespace(Whitespace whitespace) {
+    this.whitespace = whitespace;
+    return this;
+  }
+
+  private static class Content {
+    final List<ContentEntry> lines;
+    final SparseFileContent fileA;
+    final SparseFileContent fileB;
+    final boolean ignoreWS;
+    final String commitIdA;
+    final String commitIdB;
+
+    int nextA;
+    int nextB;
+
+    Content(PatchScript ps) {
+      lines = Lists.newArrayListWithExpectedSize(ps.getEdits().size() + 2);
+      fileA = ps.getA();
+      fileB = ps.getB();
+      ignoreWS = ps.isIgnoreWhitespace();
+      commitIdA = ps.getCommitIdA();
+      commitIdB = ps.getCommitIdB();
+    }
+
+    void addCommon(int end) {
+      end = Math.min(end, fileA.size());
+      if (nextA >= end) {
+        return;
+      }
+
+      while (nextA < end) {
+        if (!fileA.contains(nextA)) {
+          int endRegion = Math.min(end, nextA == 0 ? fileA.first() : fileA.next(nextA - 1));
+          int len = endRegion - nextA;
+          entry().skip = len;
+          nextA = endRegion;
+          nextB += len;
+          continue;
+        }
+
+        ContentEntry e = null;
+        for (int i = nextA; i == nextA && i < end; i = fileA.next(i), nextA++, nextB++) {
+          if (ignoreWS && fileB.contains(nextB)) {
+            if (e == null || e.common == null) {
+              e = entry();
+              e.a = Lists.newArrayListWithCapacity(end - nextA);
+              e.b = Lists.newArrayListWithCapacity(end - nextA);
+              e.common = true;
+            }
+            e.a.add(fileA.get(nextA));
+            e.b.add(fileB.get(nextB));
+          } else {
+            if (e == null || e.common != null) {
+              e = entry();
+              e.ab = Lists.newArrayListWithCapacity(end - nextA);
+            }
+            e.ab.add(fileA.get(nextA));
+          }
+        }
+      }
+    }
+
+    void addDiff(int endA, int endB, List<Edit> internalEdit, boolean dueToRebase) {
+      int lenA = endA - nextA;
+      int lenB = endB - nextB;
+      checkState(lenA > 0 || lenB > 0);
+
+      ContentEntry e = entry();
+      if (lenA > 0) {
+        e.a = Lists.newArrayListWithCapacity(lenA);
+        for (; nextA < endA; nextA++) {
+          e.a.add(fileA.get(nextA));
+        }
+      }
+      if (lenB > 0) {
+        e.b = Lists.newArrayListWithCapacity(lenB);
+        for (; nextB < endB; nextB++) {
+          e.b.add(fileB.get(nextB));
+        }
+      }
+      if (internalEdit != null && !internalEdit.isEmpty()) {
+        e.editA = Lists.newArrayListWithCapacity(internalEdit.size() * 2);
+        e.editB = Lists.newArrayListWithCapacity(internalEdit.size() * 2);
+        int lastA = 0;
+        int lastB = 0;
+        for (Edit edit : internalEdit) {
+          if (edit.getBeginA() != edit.getEndA()) {
+            e.editA.add(
+                ImmutableList.of(edit.getBeginA() - lastA, edit.getEndA() - edit.getBeginA()));
+            lastA = edit.getEndA();
+          }
+          if (edit.getBeginB() != edit.getEndB()) {
+            e.editB.add(
+                ImmutableList.of(edit.getBeginB() - lastB, edit.getEndB() - edit.getBeginB()));
+            lastB = edit.getEndB();
+          }
+        }
+      }
+      e.dueToRebase = dueToRebase ? true : null;
+    }
+
+    private ContentEntry entry() {
+      ContentEntry e = new ContentEntry();
+      lines.add(e);
+      return e;
+    }
+  }
+
+  @Deprecated
+  enum IgnoreWhitespace {
+    NONE(DiffPreferencesInfo.Whitespace.IGNORE_NONE),
+    TRAILING(DiffPreferencesInfo.Whitespace.IGNORE_TRAILING),
+    CHANGED(DiffPreferencesInfo.Whitespace.IGNORE_LEADING_AND_TRAILING),
+    ALL(DiffPreferencesInfo.Whitespace.IGNORE_ALL);
+
+    private final DiffPreferencesInfo.Whitespace whitespace;
+
+    IgnoreWhitespace(DiffPreferencesInfo.Whitespace whitespace) {
+      this.whitespace = whitespace;
+    }
+  }
+
+  public static class ContextOptionHandler extends OptionHandler<Short> {
+    public ContextOptionHandler(CmdLineParser parser, OptionDef option, Setter<Short> setter) {
+      super(parser, option, setter);
+    }
+
+    @Override
+    public final int parseArguments(Parameters params) throws CmdLineException {
+      final String value = params.getParameter(0);
+      short context;
+      if ("all".equalsIgnoreCase(value)) {
+        context = DiffPreferencesInfo.WHOLE_FILE_CONTEXT;
+      } else {
+        try {
+          context = Short.parseShort(value, 10);
+          if (context < 0) {
+            throw new NumberFormatException();
+          }
+        } catch (NumberFormatException e) {
+          throw new CmdLineException(
+              owner,
+              localizable("\"%s\" is not a valid value for \"%s\""),
+              value,
+              ((NamedOptionDef) option).name());
+        }
+      }
+      setter.addValue(context);
+      return 1;
+    }
+
+    @Override
+    public final String getDefaultMetaVariable() {
+      return "ALL|# LINES";
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/GetDraftComment.java b/java/com/google/gerrit/server/restapi/change/GetDraftComment.java
new file mode 100644
index 0000000..6049607
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/GetDraftComment.java
@@ -0,0 +1,41 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.change.DraftCommentResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GetDraftComment implements RestReadView<DraftCommentResource> {
+
+  private final Provider<CommentJson> commentJson;
+
+  @Inject
+  GetDraftComment(Provider<CommentJson> commentJson) {
+    this.commentJson = commentJson;
+  }
+
+  @Override
+  public CommentInfo apply(DraftCommentResource rsrc)
+      throws OrmException, PermissionBackendException {
+    return commentJson.get().newCommentFormatter().format(rsrc.getComment());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/GetHashtags.java b/java/com/google/gerrit/server/restapi/change/GetHashtags.java
new file mode 100644
index 0000000..8369acf
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/GetHashtags.java
@@ -0,0 +1,41 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.Set;
+
+@Singleton
+public class GetHashtags implements RestReadView<ChangeResource> {
+  @Override
+  public Response<Set<String>> apply(ChangeResource req)
+      throws AuthException, OrmException, IOException, BadRequestException {
+    ChangeNotes notes = req.getNotes().load();
+    Set<String> hashtags = notes.getHashtags();
+    if (hashtags == null) {
+      hashtags = Collections.emptySet();
+    }
+    return Response.ok(hashtags);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/GetMergeList.java b/java/com/google/gerrit/server/restapi/change/GetMergeList.java
new file mode 100644
index 0000000..8e7e693
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/GetMergeList.java
@@ -0,0 +1,100 @@
+// 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.
+
+package com.google.gerrit.server.restapi.change;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.extensions.common.CommitInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.CacheControl;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.change.RevisionJson;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.patch.MergeListBuilder;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.kohsuke.args4j.Option;
+
+public class GetMergeList implements RestReadView<RevisionResource> {
+  private final GitRepositoryManager repoManager;
+  private final RevisionJson.Factory json;
+
+  @Option(name = "--parent", usage = "Uninteresting parent (1-based, default = 1)")
+  private int uninterestingParent = 1;
+
+  @Option(name = "--links", usage = "Include weblinks")
+  private boolean addLinks;
+
+  @Inject
+  GetMergeList(GitRepositoryManager repoManager, RevisionJson.Factory json) {
+    this.repoManager = repoManager;
+    this.json = json;
+  }
+
+  public void setUninterestingParent(int uninterestingParent) {
+    this.uninterestingParent = uninterestingParent;
+  }
+
+  public void setAddLinks(boolean addLinks) {
+    this.addLinks = addLinks;
+  }
+
+  @Override
+  public Response<List<CommitInfo>> apply(RevisionResource rsrc)
+      throws BadRequestException, IOException {
+    Project.NameKey p = rsrc.getChange().getProject();
+    try (Repository repo = repoManager.openRepository(p);
+        RevWalk rw = new RevWalk(repo)) {
+      String rev = rsrc.getPatchSet().getRevision().get();
+      RevCommit commit = rw.parseCommit(ObjectId.fromString(rev));
+      rw.parseBody(commit);
+
+      if (uninterestingParent < 1 || uninterestingParent > commit.getParentCount()) {
+        throw new BadRequestException("No such parent: " + uninterestingParent);
+      }
+
+      if (commit.getParentCount() < 2) {
+        return createResponse(rsrc, ImmutableList.<CommitInfo>of());
+      }
+
+      List<RevCommit> commits = MergeListBuilder.build(rw, commit, uninterestingParent);
+      List<CommitInfo> result = new ArrayList<>(commits.size());
+      RevisionJson changeJson = json.create(ImmutableSet.of());
+      for (RevCommit c : commits) {
+        result.add(changeJson.getCommitInfo(rsrc.getProject(), rw, c, addLinks, true));
+      }
+      return createResponse(rsrc, result);
+    }
+  }
+
+  private static Response<List<CommitInfo>> createResponse(
+      RevisionResource rsrc, List<CommitInfo> result) {
+    Response<List<CommitInfo>> r = Response.ok(result);
+    if (rsrc.isCacheable()) {
+      r.caching(CacheControl.PRIVATE(7, TimeUnit.DAYS));
+    }
+    return r;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/GetPastAssignees.java b/java/com/google/gerrit/server/restapi/change/GetPastAssignees.java
new file mode 100644
index 0000000..279cfe3
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/GetPastAssignees.java
@@ -0,0 +1,56 @@
+// 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.
+
+package com.google.gerrit.server.restapi.change;
+
+import static java.util.stream.Collectors.toList;
+
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.account.AccountLoader;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+@Singleton
+public class GetPastAssignees implements RestReadView<ChangeResource> {
+  private final AccountLoader.Factory accountLoaderFactory;
+
+  @Inject
+  GetPastAssignees(AccountLoader.Factory accountLoaderFactory) {
+    this.accountLoaderFactory = accountLoaderFactory;
+  }
+
+  @Override
+  public Response<List<AccountInfo>> apply(ChangeResource rsrc)
+      throws OrmException, PermissionBackendException {
+
+    Set<Account.Id> pastAssignees = rsrc.getNotes().load().getPastAssignees();
+    if (pastAssignees == null) {
+      return Response.ok(Collections.emptyList());
+    }
+
+    AccountLoader accountLoader = accountLoaderFactory.create(true);
+    List<AccountInfo> infos = pastAssignees.stream().map(accountLoader::get).collect(toList());
+    accountLoader.fill();
+    return Response.ok(infos);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/GetPatch.java b/java/com/google/gerrit/server/restapi/change/GetPatch.java
new file mode 100644
index 0000000..ccad9e0
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/GetPatch.java
@@ -0,0 +1,195 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.change;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.gerrit.extensions.restapi.BinaryResult;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Locale;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+import org.eclipse.jgit.diff.DiffFormatter;
+import org.eclipse.jgit.lib.AbbreviatedObjectId;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.treewalk.filter.PathFilter;
+import org.kohsuke.args4j.Option;
+
+public class GetPatch implements RestReadView<RevisionResource> {
+  private final GitRepositoryManager repoManager;
+
+  private final String FILE_NOT_FOUND = "File not found: %s.";
+
+  @Option(name = "--zip")
+  private boolean zip;
+
+  @Option(name = "--download")
+  private boolean download;
+
+  @Option(name = "--path")
+  private String path;
+
+  @Inject
+  GetPatch(GitRepositoryManager repoManager) {
+    this.repoManager = repoManager;
+  }
+
+  @Override
+  public BinaryResult apply(RevisionResource rsrc)
+      throws ResourceConflictException, IOException, ResourceNotFoundException {
+    final Repository repo = repoManager.openRepository(rsrc.getProject());
+    boolean close = true;
+    try {
+      final RevWalk rw = new RevWalk(repo);
+      try {
+        final RevCommit commit =
+            rw.parseCommit(ObjectId.fromString(rsrc.getPatchSet().getRevision().get()));
+        RevCommit[] parents = commit.getParents();
+        if (parents.length > 1) {
+          throw new ResourceConflictException("Revision has more than 1 parent.");
+        } else if (parents.length == 0) {
+          throw new ResourceConflictException("Revision has no parent.");
+        }
+        final RevCommit base = parents[0];
+        rw.parseBody(base);
+
+        BinaryResult bin =
+            new BinaryResult() {
+              @Override
+              public void writeTo(OutputStream out) throws IOException {
+                if (zip) {
+                  ZipOutputStream zos = new ZipOutputStream(out);
+                  ZipEntry e = new ZipEntry(fileName(rw, commit));
+                  e.setTime(commit.getCommitTime() * 1000L);
+                  zos.putNextEntry(e);
+                  format(zos);
+                  zos.closeEntry();
+                  zos.finish();
+                } else {
+                  format(out);
+                }
+              }
+
+              private void format(OutputStream out) throws IOException {
+                // Only add header if no path is specified
+                if (path == null) {
+                  out.write(formatEmailHeader(commit).getBytes(UTF_8));
+                }
+                try (DiffFormatter fmt = new DiffFormatter(out)) {
+                  fmt.setRepository(repo);
+                  if (path != null) {
+                    fmt.setPathFilter(PathFilter.create(path));
+                  }
+                  fmt.format(base.getTree(), commit.getTree());
+                  fmt.flush();
+                }
+              }
+
+              @Override
+              public void close() throws IOException {
+                rw.close();
+                repo.close();
+              }
+            };
+
+        if (path != null && bin.asString().isEmpty()) {
+          throw new ResourceNotFoundException(String.format(FILE_NOT_FOUND, path));
+        }
+
+        if (zip) {
+          bin.disableGzip()
+              .setContentType("application/zip")
+              .setAttachmentName(fileName(rw, commit) + ".zip");
+        } else {
+          bin.base64()
+              .setContentType("application/mbox")
+              .setAttachmentName(download ? fileName(rw, commit) + ".base64" : null);
+        }
+
+        close = false;
+        return bin;
+      } finally {
+        if (close) {
+          rw.close();
+        }
+      }
+    } finally {
+      if (close) {
+        repo.close();
+      }
+    }
+  }
+
+  public GetPatch setPath(String path) {
+    this.path = path;
+    return this;
+  }
+
+  private static String formatEmailHeader(RevCommit commit) {
+    StringBuilder b = new StringBuilder();
+    PersonIdent author = commit.getAuthorIdent();
+    String subject = commit.getShortMessage();
+    String msg = commit.getFullMessage().substring(subject.length());
+    if (msg.startsWith("\n\n")) {
+      msg = msg.substring(2);
+    }
+    b.append("From ")
+        .append(commit.getName())
+        .append(' ')
+        .append(
+            "Mon Sep 17 00:00:00 2001\n") // Fixed timestamp to match output of C Git's format-patch
+        .append("From: ")
+        .append(author.getName())
+        .append(" <")
+        .append(author.getEmailAddress())
+        .append(">\n")
+        .append("Date: ")
+        .append(formatDate(author))
+        .append('\n')
+        .append("Subject: [PATCH] ")
+        .append(subject)
+        .append('\n')
+        .append('\n')
+        .append(msg);
+    if (!msg.endsWith("\n")) {
+      b.append('\n');
+    }
+    return b.append("---\n\n").toString();
+  }
+
+  private static String formatDate(PersonIdent author) {
+    SimpleDateFormat df = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US);
+    df.setCalendar(Calendar.getInstance(author.getTimeZone(), Locale.US));
+    return df.format(author.getWhen());
+  }
+
+  private static String fileName(RevWalk rw, RevCommit commit) throws IOException {
+    AbbreviatedObjectId id = rw.getObjectReader().abbreviate(commit, 7);
+    return id.name() + ".diff";
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/GetPureRevert.java b/java/com/google/gerrit/server/restapi/change/GetPureRevert.java
new file mode 100644
index 0000000..75019af
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/GetPureRevert.java
@@ -0,0 +1,54 @@
+// Copyright (C) 2017 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.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.common.PureRevertInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.PureRevert;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.io.IOException;
+import org.kohsuke.args4j.Option;
+
+public class GetPureRevert implements RestReadView<ChangeResource> {
+
+  private final PureRevert pureRevert;
+  @Nullable private String claimedOriginal;
+
+  @Option(
+      name = "--claimed-original",
+      aliases = {"-o"},
+      usage = "SHA1 (40 digit hex) of the original commit")
+  public void setClaimedOriginal(String claimedOriginal) {
+    this.claimedOriginal = claimedOriginal;
+  }
+
+  @Inject
+  GetPureRevert(PureRevert pureRevert) {
+    this.pureRevert = pureRevert;
+  }
+
+  @Override
+  public PureRevertInfo apply(ChangeResource rsrc)
+      throws ResourceConflictException, IOException, BadRequestException, OrmException,
+          AuthException {
+    return pureRevert.get(rsrc.getNotes(), claimedOriginal);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/GetRelated.java b/java/com/google/gerrit/server/restapi/change/GetRelated.java
new file mode 100644
index 0000000..3eea736
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/GetRelated.java
@@ -0,0 +1,171 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.change;
+
+import static java.util.stream.Collectors.toSet;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.Lists;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.api.changes.RelatedChangeAndCommitInfo;
+import com.google.gerrit.extensions.api.changes.RelatedChangesInfo;
+import com.google.gerrit.extensions.common.CommitInfo;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.index.IndexConfig;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CommonConverters;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.NoSuchProjectException;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.revwalk.RevCommit;
+
+@Singleton
+public class GetRelated implements RestReadView<RevisionResource> {
+  private final Provider<ReviewDb> db;
+  private final Provider<InternalChangeQuery> queryProvider;
+  private final PatchSetUtil psUtil;
+  private final RelatedChangesSorter sorter;
+  private final IndexConfig indexConfig;
+
+  @Inject
+  GetRelated(
+      Provider<ReviewDb> db,
+      Provider<InternalChangeQuery> queryProvider,
+      PatchSetUtil psUtil,
+      RelatedChangesSorter sorter,
+      IndexConfig indexConfig) {
+    this.db = db;
+    this.queryProvider = queryProvider;
+    this.psUtil = psUtil;
+    this.sorter = sorter;
+    this.indexConfig = indexConfig;
+  }
+
+  @Override
+  public RelatedChangesInfo apply(RevisionResource rsrc)
+      throws RepositoryNotFoundException, IOException, OrmException, NoSuchProjectException,
+          PermissionBackendException {
+    RelatedChangesInfo relatedChangesInfo = new RelatedChangesInfo();
+    relatedChangesInfo.changes = getRelated(rsrc);
+    return relatedChangesInfo;
+  }
+
+  private List<RelatedChangeAndCommitInfo> getRelated(RevisionResource rsrc)
+      throws OrmException, IOException, PermissionBackendException {
+    Set<String> groups = getAllGroups(rsrc.getNotes(), db.get(), psUtil);
+    if (groups.isEmpty()) {
+      return Collections.emptyList();
+    }
+
+    List<ChangeData> cds =
+        InternalChangeQuery.byProjectGroups(
+            queryProvider, indexConfig, rsrc.getChange().getProject(), groups);
+    if (cds.isEmpty()) {
+      return Collections.emptyList();
+    }
+    if (cds.size() == 1 && cds.get(0).getId().equals(rsrc.getChange().getId())) {
+      return Collections.emptyList();
+    }
+    List<RelatedChangeAndCommitInfo> result = new ArrayList<>(cds.size());
+
+    boolean isEdit = rsrc.getEdit().isPresent();
+    PatchSet basePs = isEdit ? rsrc.getEdit().get().getBasePatchSet() : rsrc.getPatchSet();
+
+    reloadChangeIfStale(cds, basePs);
+
+    for (RelatedChangesSorter.PatchSetData d : sorter.sort(cds, basePs)) {
+      PatchSet ps = d.patchSet();
+      RevCommit commit;
+      if (isEdit && ps.getId().equals(basePs.getId())) {
+        // Replace base of an edit with the edit itself.
+        ps = rsrc.getPatchSet();
+        commit = rsrc.getEdit().get().getEditCommit();
+      } else {
+        commit = d.commit();
+      }
+      result.add(newChangeAndCommit(rsrc.getProject(), d.data().change(), ps, commit));
+    }
+
+    if (result.size() == 1) {
+      RelatedChangeAndCommitInfo r = result.get(0);
+      if (r.commit != null && r.commit.commit.equals(rsrc.getPatchSet().getRevision().get())) {
+        return Collections.emptyList();
+      }
+    }
+    return result;
+  }
+
+  @VisibleForTesting
+  public static Set<String> getAllGroups(ChangeNotes notes, ReviewDb db, PatchSetUtil psUtil)
+      throws OrmException {
+    return psUtil.byChange(db, notes).stream()
+        .flatMap(ps -> ps.getGroups().stream())
+        .collect(toSet());
+  }
+
+  private void reloadChangeIfStale(List<ChangeData> cds, PatchSet wantedPs) throws OrmException {
+    for (ChangeData cd : cds) {
+      if (cd.getId().equals(wantedPs.getId().getParentKey())) {
+        if (cd.patchSet(wantedPs.getId()) == null) {
+          cd.reloadChange();
+        }
+      }
+    }
+  }
+
+  static RelatedChangeAndCommitInfo newChangeAndCommit(
+      Project.NameKey project, @Nullable Change change, @Nullable PatchSet ps, RevCommit c) {
+    RelatedChangeAndCommitInfo info = new RelatedChangeAndCommitInfo();
+    info.project = project.get();
+
+    if (change != null) {
+      info.changeId = change.getKey().get();
+      info._changeNumber = change.getChangeId();
+      info._revisionNumber = ps != null ? ps.getPatchSetId() : null;
+      PatchSet.Id curr = change.currentPatchSetId();
+      info._currentRevisionNumber = curr != null ? curr.get() : null;
+      info.status = change.getStatus().asChangeStatus().toString();
+    }
+
+    info.commit = new CommitInfo();
+    info.commit.commit = c.name();
+    info.commit.parents = Lists.newArrayListWithCapacity(c.getParentCount());
+    for (int i = 0; i < c.getParentCount(); i++) {
+      CommitInfo p = new CommitInfo();
+      p.commit = c.getParent(i).name();
+      info.commit.parents.add(p);
+    }
+    info.commit.author = CommonConverters.toGitPerson(c.getAuthorIdent());
+    info.commit.subject = c.getShortMessage();
+    return info;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/GetReview.java b/java/com/google/gerrit/server/restapi/change/GetReview.java
new file mode 100644
index 0000000..40e132d
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/GetReview.java
@@ -0,0 +1,41 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.client.ListChangesOption;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GetReview implements RestReadView<RevisionResource> {
+  private final GetChange delegate;
+
+  @Inject
+  GetReview(GetChange delegate) {
+    this.delegate = delegate;
+    delegate.addOption(ListChangesOption.DETAILED_LABELS);
+    delegate.addOption(ListChangesOption.DETAILED_ACCOUNTS);
+  }
+
+  @Override
+  public Response<ChangeInfo> apply(RevisionResource rsrc) throws OrmException {
+    return delegate.apply(rsrc);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/GetReviewer.java b/java/com/google/gerrit/server/restapi/change/GetReviewer.java
new file mode 100644
index 0000000..a11380b
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/GetReviewer.java
@@ -0,0 +1,41 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.api.changes.ReviewerInfo;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.change.ReviewerJson;
+import com.google.gerrit.server.change.ReviewerResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.List;
+
+@Singleton
+public class GetReviewer implements RestReadView<ReviewerResource> {
+  private final ReviewerJson json;
+
+  @Inject
+  GetReviewer(ReviewerJson json) {
+    this.json = json;
+  }
+
+  @Override
+  public List<ReviewerInfo> apply(ReviewerResource rsrc)
+      throws OrmException, PermissionBackendException {
+    return json.format(rsrc);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/GetRevisionActions.java b/java/com/google/gerrit/server/restapi/change/GetRevisionActions.java
new file mode 100644
index 0000000..03b95a6
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/GetRevisionActions.java
@@ -0,0 +1,86 @@
+// Copyright (C) 2015 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.google.gerrit.server.restapi.change;
+
+import com.google.common.hash.Hasher;
+import com.google.common.hash.Hashing;
+import com.google.gerrit.extensions.common.ActionInfo;
+import com.google.gerrit.extensions.restapi.ETagView;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.change.ActionJson;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.submit.ChangeSet;
+import com.google.gerrit.server.submit.MergeSuperSet;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.OrmRuntimeException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Map;
+import org.eclipse.jgit.lib.Config;
+
+@Singleton
+public class GetRevisionActions implements ETagView<RevisionResource> {
+  private final ActionJson delegate;
+  private final Config config;
+  private final Provider<ReviewDb> dbProvider;
+  private final Provider<MergeSuperSet> mergeSuperSet;
+  private final ChangeResource.Factory changeResourceFactory;
+
+  @Inject
+  GetRevisionActions(
+      ActionJson delegate,
+      Provider<ReviewDb> dbProvider,
+      Provider<MergeSuperSet> mergeSuperSet,
+      ChangeResource.Factory changeResourceFactory,
+      @GerritServerConfig Config config) {
+    this.delegate = delegate;
+    this.dbProvider = dbProvider;
+    this.mergeSuperSet = mergeSuperSet;
+    this.changeResourceFactory = changeResourceFactory;
+    this.config = config;
+  }
+
+  @Override
+  public Response<Map<String, ActionInfo>> apply(RevisionResource rsrc) throws OrmException {
+    return Response.withMustRevalidate(delegate.format(rsrc));
+  }
+
+  @Override
+  public String getETag(RevisionResource rsrc) {
+    Hasher h = Hashing.murmur3_128().newHasher();
+    CurrentUser user = rsrc.getUser();
+    try {
+      rsrc.getChangeResource().prepareETag(h, user);
+      h.putBoolean(MergeSuperSet.wholeTopicEnabled(config));
+      ReviewDb db = dbProvider.get();
+      ChangeSet cs = mergeSuperSet.get().completeChangeSet(db, rsrc.getChange(), user);
+      for (ChangeData cd : cs.changes()) {
+        changeResourceFactory.create(cd.notes(), user).prepareETag(h, user);
+      }
+      h.putBoolean(cs.furtherHiddenChanges());
+    } catch (IOException | OrmException | PermissionBackendException e) {
+      throw new OrmRuntimeException(e);
+    }
+    return h.hash().toString();
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/GetRobotComment.java b/java/com/google/gerrit/server/restapi/change/GetRobotComment.java
new file mode 100644
index 0000000..0197068
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/GetRobotComment.java
@@ -0,0 +1,41 @@
+// 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.
+
+package com.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.common.RobotCommentInfo;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.change.RobotCommentResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GetRobotComment implements RestReadView<RobotCommentResource> {
+
+  private final Provider<CommentJson> commentJson;
+
+  @Inject
+  GetRobotComment(Provider<CommentJson> commentJson) {
+    this.commentJson = commentJson;
+  }
+
+  @Override
+  public RobotCommentInfo apply(RobotCommentResource rsrc)
+      throws OrmException, PermissionBackendException {
+    return commentJson.get().newRobotCommentFormatter().format(rsrc.getComment());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/GetTopic.java b/java/com/google/gerrit/server/restapi/change/GetTopic.java
new file mode 100644
index 0000000..7ab1cb1
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/GetTopic.java
@@ -0,0 +1,28 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.change;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GetTopic implements RestReadView<ChangeResource> {
+  @Override
+  public String apply(ChangeResource rsrc) {
+    return Strings.nullToEmpty(rsrc.getChange().getTopic());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/Ignore.java b/java/com/google/gerrit/server/restapi/change/Ignore.java
new file mode 100644
index 0000000..e319451
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/Ignore.java
@@ -0,0 +1,81 @@
+// Copyright (C) 2017 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.google.gerrit.server.restapi.change;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.webui.UiAction;
+import com.google.gerrit.server.StarredChangesUtil;
+import com.google.gerrit.server.StarredChangesUtil.IllegalLabelException;
+import com.google.gerrit.server.StarredChangesUtil.MutuallyExclusiveLabelsException;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class Ignore implements RestModifyView<ChangeResource, Input>, UiAction<ChangeResource> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final StarredChangesUtil stars;
+
+  @Inject
+  Ignore(StarredChangesUtil stars) {
+    this.stars = stars;
+  }
+
+  @Override
+  public Description getDescription(ChangeResource rsrc) {
+    return new UiAction.Description()
+        .setLabel("Ignore")
+        .setTitle("Ignore the change")
+        .setVisible(canIgnore(rsrc));
+  }
+
+  @Override
+  public Response<String> apply(ChangeResource rsrc, Input input)
+      throws RestApiException, OrmException, IllegalLabelException {
+    try {
+      if (rsrc.isUserOwner()) {
+        throw new BadRequestException("cannot ignore own change");
+      }
+
+      if (!isIgnored(rsrc)) {
+        stars.ignore(rsrc);
+      }
+      return Response.ok("");
+    } catch (MutuallyExclusiveLabelsException e) {
+      throw new ResourceConflictException(e.getMessage());
+    }
+  }
+
+  private boolean canIgnore(ChangeResource rsrc) {
+    return !rsrc.isUserOwner() && !isIgnored(rsrc);
+  }
+
+  private boolean isIgnored(ChangeResource rsrc) {
+    try {
+      return stars.isIgnored(rsrc);
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log("failed to check ignored star");
+    }
+    return false;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/Index.java b/java/com/google/gerrit/server/restapi/change/Index.java
new file mode 100644
index 0000000..a5dd868
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/Index.java
@@ -0,0 +1,62 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.index.change.ChangeIndexer;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestModifyView;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+
+@Singleton
+public class Index extends RetryingRestModifyView<ChangeResource, Input, Response<?>> {
+
+  private final Provider<ReviewDb> db;
+  private final PermissionBackend permissionBackend;
+  private final ChangeIndexer indexer;
+
+  @Inject
+  Index(
+      Provider<ReviewDb> db,
+      RetryHelper retryHelper,
+      PermissionBackend permissionBackend,
+      ChangeIndexer indexer) {
+    super(retryHelper);
+    this.db = db;
+    this.permissionBackend = permissionBackend;
+    this.indexer = indexer;
+  }
+
+  @Override
+  protected Response<?> applyImpl(
+      BatchUpdate.Factory updateFactory, ChangeResource rsrc, Input input)
+      throws IOException, AuthException, OrmException, PermissionBackendException {
+    permissionBackend.currentUser().check(GlobalPermission.MAINTAIN_SERVER);
+    indexer.index(db.get(), rsrc.getChange());
+    return Response.none();
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/ListChangeComments.java b/java/com/google/gerrit/server/restapi/change/ListChangeComments.java
new file mode 100644
index 0000000..40f4642
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/ListChangeComments.java
@@ -0,0 +1,62 @@
+// Copyright (C) 2015 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.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.List;
+import java.util.Map;
+
+@Singleton
+public class ListChangeComments implements RestReadView<ChangeResource> {
+  private final Provider<ReviewDb> db;
+  private final ChangeData.Factory changeDataFactory;
+  private final Provider<CommentJson> commentJson;
+  private final CommentsUtil commentsUtil;
+
+  @Inject
+  ListChangeComments(
+      Provider<ReviewDb> db,
+      ChangeData.Factory changeDataFactory,
+      Provider<CommentJson> commentJson,
+      CommentsUtil commentsUtil) {
+    this.db = db;
+    this.changeDataFactory = changeDataFactory;
+    this.commentJson = commentJson;
+    this.commentsUtil = commentsUtil;
+  }
+
+  @Override
+  public Map<String, List<CommentInfo>> apply(ChangeResource rsrc)
+      throws AuthException, OrmException, PermissionBackendException {
+    ChangeData cd = changeDataFactory.create(db.get(), rsrc.getNotes());
+    return commentJson
+        .get()
+        .setFillAccounts(true)
+        .setFillPatchSet(true)
+        .newCommentFormatter()
+        .format(commentsUtil.publishedByChange(db.get(), cd.notes()));
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/ListChangeDrafts.java b/java/com/google/gerrit/server/restapi/change/ListChangeDrafts.java
new file mode 100644
index 0000000..a524f6d
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/ListChangeDrafts.java
@@ -0,0 +1,68 @@
+// Copyright (C) 2015 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.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.List;
+import java.util.Map;
+
+@Singleton
+public class ListChangeDrafts implements RestReadView<ChangeResource> {
+  private final Provider<ReviewDb> db;
+  private final ChangeData.Factory changeDataFactory;
+  private final Provider<CommentJson> commentJson;
+  private final CommentsUtil commentsUtil;
+
+  @Inject
+  ListChangeDrafts(
+      Provider<ReviewDb> db,
+      ChangeData.Factory changeDataFactory,
+      Provider<CommentJson> commentJson,
+      CommentsUtil commentsUtil) {
+    this.db = db;
+    this.changeDataFactory = changeDataFactory;
+    this.commentJson = commentJson;
+    this.commentsUtil = commentsUtil;
+  }
+
+  @Override
+  public Map<String, List<CommentInfo>> apply(ChangeResource rsrc)
+      throws AuthException, OrmException, PermissionBackendException {
+    if (!rsrc.getUser().isIdentifiedUser()) {
+      throw new AuthException("Authentication required");
+    }
+    ChangeData cd = changeDataFactory.create(db.get(), rsrc.getNotes());
+    List<Comment> drafts =
+        commentsUtil.draftByChangeAuthor(db.get(), cd.notes(), rsrc.getUser().getAccountId());
+    return commentJson
+        .get()
+        .setFillAccounts(false)
+        .setFillPatchSet(true)
+        .newCommentFormatter()
+        .format(drafts);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/ListChangeMessages.java b/java/com/google/gerrit/server/restapi/change/ListChangeMessages.java
new file mode 100644
index 0000000..9ce2157
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/ListChangeMessages.java
@@ -0,0 +1,62 @@
+// 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.
+
+package com.google.gerrit.server.restapi.change;
+
+import static com.google.gerrit.server.ChangeMessagesUtil.createChangeMessageInfo;
+
+import com.google.gerrit.extensions.common.ChangeMessageInfo;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.account.AccountLoader;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Singleton
+public class ListChangeMessages implements RestReadView<ChangeResource> {
+  private final Provider<ReviewDb> dbProvider;
+  private final ChangeMessagesUtil changeMessagesUtil;
+  private final AccountLoader accountLoader;
+
+  @Inject
+  public ListChangeMessages(
+      Provider<ReviewDb> dbProvider,
+      ChangeMessagesUtil changeMessagesUtil,
+      AccountLoader.Factory accountLoaderFactory) {
+    this.dbProvider = dbProvider;
+    this.changeMessagesUtil = changeMessagesUtil;
+    this.accountLoader = accountLoaderFactory.create(true);
+  }
+
+  @Override
+  public List<ChangeMessageInfo> apply(ChangeResource resource)
+      throws OrmException, PermissionBackendException {
+    List<ChangeMessage> messages =
+        changeMessagesUtil.byChange(dbProvider.get(), resource.getNotes());
+    List<ChangeMessageInfo> messageInfos =
+        messages.stream()
+            .map(m -> createChangeMessageInfo(m, accountLoader))
+            .collect(Collectors.toList());
+    accountLoader.fill();
+    return messageInfos;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/ListChangeRobotComments.java b/java/com/google/gerrit/server/restapi/change/ListChangeRobotComments.java
new file mode 100644
index 0000000..dc92ced
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/ListChangeRobotComments.java
@@ -0,0 +1,60 @@
+// 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.
+
+package com.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.common.RobotCommentInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.util.List;
+import java.util.Map;
+
+public class ListChangeRobotComments implements RestReadView<ChangeResource> {
+  private final Provider<ReviewDb> db;
+  private final ChangeData.Factory changeDataFactory;
+  private final Provider<CommentJson> commentJson;
+  private final CommentsUtil commentsUtil;
+
+  @Inject
+  ListChangeRobotComments(
+      Provider<ReviewDb> db,
+      ChangeData.Factory changeDataFactory,
+      Provider<CommentJson> commentJson,
+      CommentsUtil commentsUtil) {
+    this.db = db;
+    this.changeDataFactory = changeDataFactory;
+    this.commentJson = commentJson;
+    this.commentsUtil = commentsUtil;
+  }
+
+  @Override
+  public Map<String, List<RobotCommentInfo>> apply(ChangeResource rsrc)
+      throws AuthException, OrmException, PermissionBackendException {
+    ChangeData cd = changeDataFactory.create(db.get(), rsrc.getNotes());
+    return commentJson
+        .get()
+        .setFillAccounts(true)
+        .setFillPatchSet(true)
+        .newRobotCommentFormatter()
+        .format(commentsUtil.robotCommentsByChange(cd.notes()));
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/ListReviewers.java b/java/com/google/gerrit/server/restapi/change/ListReviewers.java
new file mode 100644
index 0000000..3fb4b02
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/ListReviewers.java
@@ -0,0 +1,71 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.api.changes.ReviewerInfo;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.ReviewerJson;
+import com.google.gerrit.server.change.ReviewerResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+@Singleton
+public class ListReviewers implements RestReadView<ChangeResource> {
+  private final Provider<ReviewDb> dbProvider;
+  private final ApprovalsUtil approvalsUtil;
+  private final ReviewerJson json;
+  private final ReviewerResource.Factory resourceFactory;
+
+  @Inject
+  ListReviewers(
+      Provider<ReviewDb> dbProvider,
+      ApprovalsUtil approvalsUtil,
+      ReviewerResource.Factory resourceFactory,
+      ReviewerJson json) {
+    this.dbProvider = dbProvider;
+    this.approvalsUtil = approvalsUtil;
+    this.resourceFactory = resourceFactory;
+    this.json = json;
+  }
+
+  @Override
+  public List<ReviewerInfo> apply(ChangeResource rsrc)
+      throws OrmException, PermissionBackendException {
+    Map<String, ReviewerResource> reviewers = new LinkedHashMap<>();
+    ReviewDb db = dbProvider.get();
+    for (Account.Id accountId : approvalsUtil.getReviewers(db, rsrc.getNotes()).all()) {
+      if (!reviewers.containsKey(accountId.toString())) {
+        reviewers.put(accountId.toString(), resourceFactory.create(rsrc, accountId));
+      }
+    }
+    for (Address adr : rsrc.getNotes().getReviewersByEmail().all()) {
+      if (!reviewers.containsKey(adr.toString())) {
+        reviewers.put(adr.toString(), new ReviewerResource(rsrc, adr));
+      }
+    }
+    return json.format(reviewers.values());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/ListRevisionComments.java b/java/com/google/gerrit/server/restapi/change/ListRevisionComments.java
new file mode 100644
index 0000000..964e560
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/ListRevisionComments.java
@@ -0,0 +1,45 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@Singleton
+public class ListRevisionComments extends ListRevisionDrafts {
+  @Inject
+  ListRevisionComments(
+      Provider<ReviewDb> db, Provider<CommentJson> commentJson, CommentsUtil commentsUtil) {
+    super(db, commentJson, commentsUtil);
+  }
+
+  @Override
+  protected boolean includeAuthorInfo() {
+    return true;
+  }
+
+  @Override
+  protected Iterable<Comment> listComments(RevisionResource rsrc) throws OrmException {
+    ChangeNotes notes = rsrc.getNotes();
+    return commentsUtil.publishedByPatchSet(db.get(), notes, rsrc.getPatchSet().getId());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/ListRevisionDrafts.java b/java/com/google/gerrit/server/restapi/change/ListRevisionDrafts.java
new file mode 100644
index 0000000..dbd0ccf
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/ListRevisionDrafts.java
@@ -0,0 +1,73 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.change;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.List;
+import java.util.Map;
+
+@Singleton
+public class ListRevisionDrafts implements RestReadView<RevisionResource> {
+  protected final Provider<ReviewDb> db;
+  protected final Provider<CommentJson> commentJson;
+  protected final CommentsUtil commentsUtil;
+
+  @Inject
+  ListRevisionDrafts(
+      Provider<ReviewDb> db, Provider<CommentJson> commentJson, CommentsUtil commentsUtil) {
+    this.db = db;
+    this.commentJson = commentJson;
+    this.commentsUtil = commentsUtil;
+  }
+
+  protected Iterable<Comment> listComments(RevisionResource rsrc) throws OrmException {
+    return commentsUtil.draftByPatchSetAuthor(
+        db.get(), rsrc.getPatchSet().getId(), rsrc.getAccountId(), rsrc.getNotes());
+  }
+
+  protected boolean includeAuthorInfo() {
+    return false;
+  }
+
+  @Override
+  public Map<String, List<CommentInfo>> apply(RevisionResource rsrc)
+      throws OrmException, PermissionBackendException {
+    return commentJson
+        .get()
+        .setFillAccounts(includeAuthorInfo())
+        .newCommentFormatter()
+        .format(listComments(rsrc));
+  }
+
+  public ImmutableList<CommentInfo> getComments(RevisionResource rsrc)
+      throws OrmException, PermissionBackendException {
+    return commentJson
+        .get()
+        .setFillAccounts(includeAuthorInfo())
+        .newCommentFormatter()
+        .formatAsList(listComments(rsrc));
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/ListRevisionReviewers.java b/java/com/google/gerrit/server/restapi/change/ListRevisionReviewers.java
new file mode 100644
index 0000000..7add548
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/ListRevisionReviewers.java
@@ -0,0 +1,76 @@
+// Copyright (C) 2017 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.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.api.changes.ReviewerInfo;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.change.ReviewerJson;
+import com.google.gerrit.server.change.ReviewerResource;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+@Singleton
+class ListRevisionReviewers implements RestReadView<RevisionResource> {
+  private final Provider<ReviewDb> dbProvider;
+  private final ApprovalsUtil approvalsUtil;
+  private final ReviewerJson json;
+  private final ReviewerResource.Factory resourceFactory;
+
+  @Inject
+  ListRevisionReviewers(
+      Provider<ReviewDb> dbProvider,
+      ApprovalsUtil approvalsUtil,
+      ReviewerResource.Factory resourceFactory,
+      ReviewerJson json) {
+    this.dbProvider = dbProvider;
+    this.approvalsUtil = approvalsUtil;
+    this.resourceFactory = resourceFactory;
+    this.json = json;
+  }
+
+  @Override
+  public List<ReviewerInfo> apply(RevisionResource rsrc)
+      throws OrmException, MethodNotAllowedException, PermissionBackendException {
+    if (!rsrc.isCurrent()) {
+      throw new MethodNotAllowedException("Cannot list reviewers on non-current patch set");
+    }
+
+    Map<String, ReviewerResource> reviewers = new LinkedHashMap<>();
+    ReviewDb db = dbProvider.get();
+    for (Account.Id accountId : approvalsUtil.getReviewers(db, rsrc.getNotes()).all()) {
+      if (!reviewers.containsKey(accountId.toString())) {
+        reviewers.put(accountId.toString(), resourceFactory.create(rsrc, accountId));
+      }
+    }
+    for (Address address : rsrc.getNotes().getReviewersByEmail().all()) {
+      if (!reviewers.containsKey(address.toString())) {
+        reviewers.put(address.toString(), new ReviewerResource(rsrc, address));
+      }
+    }
+    return json.format(reviewers.values());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/ListRobotComments.java b/java/com/google/gerrit/server/restapi/change/ListRobotComments.java
new file mode 100644
index 0000000..99366aa
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/ListRobotComments.java
@@ -0,0 +1,68 @@
+// 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.
+
+package com.google.gerrit.server.restapi.change;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.extensions.common.RobotCommentInfo;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.client.RobotComment;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.List;
+import java.util.Map;
+
+@Singleton
+public class ListRobotComments implements RestReadView<RevisionResource> {
+  protected final Provider<ReviewDb> db;
+  protected final Provider<CommentJson> commentJson;
+  protected final CommentsUtil commentsUtil;
+
+  @Inject
+  ListRobotComments(
+      Provider<ReviewDb> db, Provider<CommentJson> commentJson, CommentsUtil commentsUtil) {
+    this.db = db;
+    this.commentJson = commentJson;
+    this.commentsUtil = commentsUtil;
+  }
+
+  @Override
+  public Map<String, List<RobotCommentInfo>> apply(RevisionResource rsrc)
+      throws OrmException, PermissionBackendException {
+    return commentJson
+        .get()
+        .setFillAccounts(true)
+        .newRobotCommentFormatter()
+        .format(listComments(rsrc));
+  }
+
+  public ImmutableList<RobotCommentInfo> getComments(RevisionResource rsrc)
+      throws OrmException, PermissionBackendException {
+    return commentJson
+        .get()
+        .setFillAccounts(true)
+        .newRobotCommentFormatter()
+        .formatAsList(listComments(rsrc));
+  }
+
+  private Iterable<RobotComment> listComments(RevisionResource rsrc) throws OrmException {
+    return commentsUtil.robotCommentsByPatchSet(rsrc.getNotes(), rsrc.getPatchSet().getId());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/MarkAsReviewed.java b/java/com/google/gerrit/server/restapi/change/MarkAsReviewed.java
new file mode 100644
index 0000000..7c9ba73
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/MarkAsReviewed.java
@@ -0,0 +1,77 @@
+// Copyright (C) 2017 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.google.gerrit.server.restapi.change;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.webui.UiAction;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.StarredChangesUtil;
+import com.google.gerrit.server.StarredChangesUtil.IllegalLabelException;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@Singleton
+public class MarkAsReviewed
+    implements RestModifyView<ChangeResource, Input>, UiAction<ChangeResource> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final Provider<ReviewDb> dbProvider;
+  private final ChangeData.Factory changeDataFactory;
+  private final StarredChangesUtil stars;
+
+  @Inject
+  MarkAsReviewed(
+      Provider<ReviewDb> dbProvider,
+      ChangeData.Factory changeDataFactory,
+      StarredChangesUtil stars) {
+    this.dbProvider = dbProvider;
+    this.changeDataFactory = changeDataFactory;
+    this.stars = stars;
+  }
+
+  @Override
+  public Description getDescription(ChangeResource rsrc) {
+    return new UiAction.Description()
+        .setLabel("Mark Reviewed")
+        .setTitle("Mark the change as reviewed to unhighlight it in the dashboard")
+        .setVisible(!isReviewed(rsrc));
+  }
+
+  @Override
+  public Response<String> apply(ChangeResource rsrc, Input input)
+      throws RestApiException, OrmException, IllegalLabelException {
+    stars.markAsReviewed(rsrc);
+    return Response.ok("");
+  }
+
+  private boolean isReviewed(ChangeResource rsrc) {
+    try {
+      return changeDataFactory
+          .create(dbProvider.get(), rsrc.getNotes())
+          .isReviewedBy(rsrc.getUser().asIdentifiedUser().getAccountId());
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log("failed to check if change is reviewed");
+    }
+    return false;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/MarkAsUnreviewed.java b/java/com/google/gerrit/server/restapi/change/MarkAsUnreviewed.java
new file mode 100644
index 0000000..6e15dcc
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/MarkAsUnreviewed.java
@@ -0,0 +1,76 @@
+// Copyright (C) 2017 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.google.gerrit.server.restapi.change;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.webui.UiAction;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.StarredChangesUtil;
+import com.google.gerrit.server.StarredChangesUtil.IllegalLabelException;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@Singleton
+public class MarkAsUnreviewed
+    implements RestModifyView<ChangeResource, Input>, UiAction<ChangeResource> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final Provider<ReviewDb> dbProvider;
+  private final ChangeData.Factory changeDataFactory;
+  private final StarredChangesUtil stars;
+
+  @Inject
+  MarkAsUnreviewed(
+      Provider<ReviewDb> dbProvider,
+      ChangeData.Factory changeDataFactory,
+      StarredChangesUtil stars) {
+    this.dbProvider = dbProvider;
+    this.changeDataFactory = changeDataFactory;
+    this.stars = stars;
+  }
+
+  @Override
+  public Description getDescription(ChangeResource rsrc) {
+    return new UiAction.Description()
+        .setLabel("Mark Unreviewed")
+        .setTitle("Mark the change as unreviewed to highlight it in the dashboard")
+        .setVisible(isReviewed(rsrc));
+  }
+
+  @Override
+  public Response<String> apply(ChangeResource rsrc, Input input)
+      throws OrmException, IllegalLabelException {
+    stars.markAsUnreviewed(rsrc);
+    return Response.ok("");
+  }
+
+  private boolean isReviewed(ChangeResource rsrc) {
+    try {
+      return changeDataFactory
+          .create(dbProvider.get(), rsrc.getNotes())
+          .isReviewedBy(rsrc.getUser().asIdentifiedUser().getAccountId());
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log("failed to check if change is reviewed");
+    }
+    return false;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/Mergeable.java b/java/com/google/gerrit/server/restapi/change/Mergeable.java
new file mode 100644
index 0000000..b196347
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/Mergeable.java
@@ -0,0 +1,210 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.change;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.SubmitTypeRecord;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.extensions.common.MergeableInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.reviewdb.server.ReviewDbUtil;
+import com.google.gerrit.server.ChangeUtil;
+import com.google.gerrit.server.change.MergeabilityCache;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.git.BranchOrderSection;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.MergeUtil;
+import com.google.gerrit.server.index.change.ChangeIndexer;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.project.SubmitRuleEvaluator;
+import com.google.gerrit.server.project.SubmitRuleOptions;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.Future;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.kohsuke.args4j.Option;
+
+public class Mergeable implements RestReadView<RevisionResource> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  @Option(
+      name = "--other-branches",
+      aliases = {"-o"},
+      usage = "test mergeability for other branches too")
+  private boolean otherBranches;
+
+  private final GitRepositoryManager gitManager;
+  private final ProjectCache projectCache;
+  private final MergeUtil.Factory mergeUtilFactory;
+  private final ChangeData.Factory changeDataFactory;
+  private final Provider<ReviewDb> db;
+  private final ChangeIndexer indexer;
+  private final MergeabilityCache cache;
+  private final SubmitRuleEvaluator submitRuleEvaluator;
+
+  @Inject
+  Mergeable(
+      GitRepositoryManager gitManager,
+      ProjectCache projectCache,
+      MergeUtil.Factory mergeUtilFactory,
+      ChangeData.Factory changeDataFactory,
+      Provider<ReviewDb> db,
+      ChangeIndexer indexer,
+      MergeabilityCache cache,
+      SubmitRuleEvaluator.Factory submitRuleEvaluatorFactory) {
+    this.gitManager = gitManager;
+    this.projectCache = projectCache;
+    this.mergeUtilFactory = mergeUtilFactory;
+    this.changeDataFactory = changeDataFactory;
+    this.db = db;
+    this.indexer = indexer;
+    this.cache = cache;
+    submitRuleEvaluator = submitRuleEvaluatorFactory.create(SubmitRuleOptions.defaults());
+  }
+
+  public void setOtherBranches(boolean otherBranches) {
+    this.otherBranches = otherBranches;
+  }
+
+  @Override
+  public MergeableInfo apply(RevisionResource resource)
+      throws AuthException, ResourceConflictException, BadRequestException, OrmException,
+          IOException {
+    Change change = resource.getChange();
+    PatchSet ps = resource.getPatchSet();
+    MergeableInfo result = new MergeableInfo();
+
+    if (!change.getStatus().isOpen()) {
+      throw new ResourceConflictException("change is " + ChangeUtil.status(change));
+    } else if (!ps.getId().equals(change.currentPatchSetId())) {
+      // Only the current revision is mergeable. Others always fail.
+      return result;
+    }
+
+    ChangeData cd = changeDataFactory.create(db.get(), resource.getNotes());
+    result.submitType = getSubmitType(cd);
+
+    try (Repository git = gitManager.openRepository(change.getProject())) {
+      ObjectId commit = toId(ps);
+      Ref ref = git.getRefDatabase().exactRef(change.getDest().get());
+      ProjectState projectState = projectCache.get(change.getProject());
+      String strategy = mergeUtilFactory.create(projectState).mergeStrategyName();
+      result.strategy = strategy;
+      result.mergeable = isMergable(git, change, commit, ref, result.submitType, strategy);
+
+      if (otherBranches) {
+        result.mergeableInto = new ArrayList<>();
+        BranchOrderSection branchOrder = projectState.getBranchOrderSection();
+        if (branchOrder != null) {
+          int prefixLen = Constants.R_HEADS.length();
+          String[] names = branchOrder.getMoreStable(ref.getName());
+          Map<String, Ref> refs = git.getRefDatabase().exactRef(names);
+          for (String n : names) {
+            Ref other = refs.get(n);
+            if (other == null) {
+              continue;
+            }
+            if (cache.get(commit, other, SubmitType.CHERRY_PICK, strategy, change.getDest(), git)) {
+              result.mergeableInto.add(other.getName().substring(prefixLen));
+            }
+          }
+        }
+      }
+    }
+    return result;
+  }
+
+  private SubmitType getSubmitType(ChangeData cd) throws OrmException {
+    SubmitTypeRecord rec = submitRuleEvaluator.getSubmitType(cd);
+    if (rec.status != SubmitTypeRecord.Status.OK) {
+      throw new OrmException("Submit type rule failed: " + rec);
+    }
+    return rec.type;
+  }
+
+  private boolean isMergable(
+      Repository git,
+      Change change,
+      ObjectId commit,
+      Ref ref,
+      SubmitType submitType,
+      String strategy)
+      throws OrmException {
+    if (commit == null) {
+      return false;
+    }
+
+    Boolean old = cache.getIfPresent(commit, ref, submitType, strategy);
+    if (old != null) {
+      return old;
+    }
+    return refresh(change, commit, ref, submitType, strategy, git, old);
+  }
+
+  private static ObjectId toId(PatchSet ps) {
+    try {
+      return ObjectId.fromString(ps.getRevision().get());
+    } catch (IllegalArgumentException e) {
+      logger.atSevere().log("Invalid revision on patch set %s", ps);
+      return null;
+    }
+  }
+
+  private boolean refresh(
+      final Change change,
+      ObjectId commit,
+      final Ref ref,
+      SubmitType type,
+      String strategy,
+      Repository git,
+      Boolean old)
+      throws OrmException {
+    final boolean mergeable = cache.get(commit, ref, type, strategy, change.getDest(), git);
+    if (!Objects.equals(mergeable, old)) {
+      invalidateETag(change.getId(), db.get());
+
+      @SuppressWarnings("unused")
+      Future<?> possiblyIgnoredError = indexer.indexAsync(change.getProject(), change.getId());
+    }
+    return mergeable;
+  }
+
+  private static void invalidateETag(Change.Id id, ReviewDb db) throws OrmException {
+    // Empty update of Change to bump rowVersion, changing its ETag.
+    // TODO(dborowitz): Include cache info in ETag somehow instead.
+    db = ReviewDbUtil.unwrapDb(db);
+    Change c = db.changes().get(id);
+    if (c != null) {
+      db.changes().update(Collections.singleton(c));
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/Module.java b/java/com/google/gerrit/server/restapi/change/Module.java
new file mode 100644
index 0000000..8824247
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/Module.java
@@ -0,0 +1,205 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.change;
+
+import static com.google.gerrit.server.change.ChangeEditResource.CHANGE_EDIT_KIND;
+import static com.google.gerrit.server.change.ChangeMessageResource.CHANGE_MESSAGE_KIND;
+import static com.google.gerrit.server.change.ChangeResource.CHANGE_KIND;
+import static com.google.gerrit.server.change.CommentResource.COMMENT_KIND;
+import static com.google.gerrit.server.change.DraftCommentResource.DRAFT_COMMENT_KIND;
+import static com.google.gerrit.server.change.FileResource.FILE_KIND;
+import static com.google.gerrit.server.change.FixResource.FIX_KIND;
+import static com.google.gerrit.server.change.ReviewerResource.REVIEWER_KIND;
+import static com.google.gerrit.server.change.RevisionResource.REVISION_KIND;
+import static com.google.gerrit.server.change.RobotCommentResource.ROBOT_COMMENT_KIND;
+import static com.google.gerrit.server.change.VoteResource.VOTE_KIND;
+
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.RestApiModule;
+import com.google.gerrit.server.account.AccountLoader;
+import com.google.gerrit.server.change.AddReviewersOp;
+import com.google.gerrit.server.change.ChangeInserter;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.DeleteReviewerByEmailOp;
+import com.google.gerrit.server.change.DeleteReviewerOp;
+import com.google.gerrit.server.change.EmailReviewComments;
+import com.google.gerrit.server.change.PatchSetInserter;
+import com.google.gerrit.server.change.RebaseChangeOp;
+import com.google.gerrit.server.change.ReviewerResource;
+import com.google.gerrit.server.change.SetAssigneeOp;
+import com.google.gerrit.server.change.SetHashtagsOp;
+import com.google.gerrit.server.change.SetPrivateOp;
+import com.google.gerrit.server.change.WorkInProgressOp;
+import com.google.gerrit.server.restapi.change.Reviewed.DeleteReviewed;
+import com.google.gerrit.server.restapi.change.Reviewed.PutReviewed;
+
+public class Module extends RestApiModule {
+  @Override
+  protected void configure() {
+    bind(ChangesCollection.class);
+    bind(Revisions.class);
+    bind(Reviewers.class);
+    bind(RevisionReviewers.class);
+    bind(DraftComments.class);
+    bind(Comments.class);
+    bind(RobotComments.class);
+    bind(Fixes.class);
+    bind(Files.class);
+    bind(Votes.class);
+
+    DynamicMap.mapOf(binder(), CHANGE_KIND);
+    DynamicMap.mapOf(binder(), COMMENT_KIND);
+    DynamicMap.mapOf(binder(), ROBOT_COMMENT_KIND);
+    DynamicMap.mapOf(binder(), FIX_KIND);
+    DynamicMap.mapOf(binder(), DRAFT_COMMENT_KIND);
+    DynamicMap.mapOf(binder(), FILE_KIND);
+    DynamicMap.mapOf(binder(), REVIEWER_KIND);
+    DynamicMap.mapOf(binder(), REVISION_KIND);
+    DynamicMap.mapOf(binder(), CHANGE_EDIT_KIND);
+    DynamicMap.mapOf(binder(), VOTE_KIND);
+    DynamicMap.mapOf(binder(), CHANGE_MESSAGE_KIND);
+
+    postOnCollection(CHANGE_KIND).to(CreateChange.class);
+    get(CHANGE_KIND).to(GetChange.class);
+    post(CHANGE_KIND, "merge").to(CreateMergePatchSet.class);
+    get(CHANGE_KIND, "detail").to(GetDetail.class);
+    get(CHANGE_KIND, "topic").to(GetTopic.class);
+    get(CHANGE_KIND, "in").to(ChangeIncludedIn.class);
+    get(CHANGE_KIND, "assignee").to(GetAssignee.class);
+    get(CHANGE_KIND, "past_assignees").to(GetPastAssignees.class);
+    put(CHANGE_KIND, "assignee").to(PutAssignee.class);
+    delete(CHANGE_KIND, "assignee").to(DeleteAssignee.class);
+    get(CHANGE_KIND, "hashtags").to(GetHashtags.class);
+    get(CHANGE_KIND, "comments").to(ListChangeComments.class);
+    get(CHANGE_KIND, "robotcomments").to(ListChangeRobotComments.class);
+    get(CHANGE_KIND, "drafts").to(ListChangeDrafts.class);
+    get(CHANGE_KIND, "check").to(Check.class);
+    get(CHANGE_KIND, "pure_revert").to(GetPureRevert.class);
+    post(CHANGE_KIND, "check").to(Check.class);
+    put(CHANGE_KIND, "topic").to(PutTopic.class);
+    delete(CHANGE_KIND, "topic").to(PutTopic.class);
+    delete(CHANGE_KIND).to(DeleteChange.class);
+    post(CHANGE_KIND, "abandon").to(Abandon.class);
+    post(CHANGE_KIND, "hashtags").to(PostHashtags.class);
+    post(CHANGE_KIND, "restore").to(Restore.class);
+    post(CHANGE_KIND, "revert").to(Revert.class);
+    post(CHANGE_KIND, "submit").to(Submit.CurrentRevision.class);
+    get(CHANGE_KIND, "submitted_together").to(SubmittedTogether.class);
+    post(CHANGE_KIND, "rebase").to(Rebase.CurrentRevision.class);
+    post(CHANGE_KIND, "index").to(Index.class);
+    post(CHANGE_KIND, "rebuild.notedb").to(Rebuild.class);
+    post(CHANGE_KIND, "move").to(Move.class);
+    post(CHANGE_KIND, "private").to(PostPrivate.class);
+    post(CHANGE_KIND, "private.delete").to(DeletePrivateByPost.class);
+    delete(CHANGE_KIND, "private").to(DeletePrivate.class);
+    put(CHANGE_KIND, "ignore").to(Ignore.class);
+    put(CHANGE_KIND, "unignore").to(Unignore.class);
+    put(CHANGE_KIND, "reviewed").to(MarkAsReviewed.class);
+    put(CHANGE_KIND, "unreviewed").to(MarkAsUnreviewed.class);
+    post(CHANGE_KIND, "wip").to(SetWorkInProgress.class);
+    post(CHANGE_KIND, "ready").to(SetReadyForReview.class);
+    put(CHANGE_KIND, "message").to(PutMessage.class);
+
+    get(CHANGE_KIND, "suggest_reviewers").to(SuggestChangeReviewers.class);
+    child(CHANGE_KIND, "reviewers").to(Reviewers.class);
+    postOnCollection(REVIEWER_KIND).to(PostReviewers.class);
+    get(REVIEWER_KIND).to(GetReviewer.class);
+    delete(REVIEWER_KIND).to(DeleteReviewer.class);
+    post(REVIEWER_KIND, "delete").to(DeleteReviewer.class);
+    child(REVIEWER_KIND, "votes").to(Votes.class);
+    delete(VOTE_KIND).to(DeleteVote.class);
+    post(VOTE_KIND, "delete").to(DeleteVote.class);
+
+    child(CHANGE_KIND, "revisions").to(Revisions.class);
+    get(REVISION_KIND, "actions").to(GetRevisionActions.class);
+    post(REVISION_KIND, "cherrypick").to(CherryPick.class);
+    get(REVISION_KIND, "commit").to(GetCommit.class);
+    get(REVISION_KIND, "mergeable").to(Mergeable.class);
+    get(REVISION_KIND, "related").to(GetRelated.class);
+    get(REVISION_KIND, "review").to(GetReview.class);
+    post(REVISION_KIND, "review").to(PostReview.class);
+    get(REVISION_KIND, "preview_submit").to(PreviewSubmit.class);
+    post(REVISION_KIND, "submit").to(Submit.class);
+    post(REVISION_KIND, "rebase").to(Rebase.class);
+    put(REVISION_KIND, "description").to(PutDescription.class);
+    get(REVISION_KIND, "description").to(GetDescription.class);
+    get(REVISION_KIND, "patch").to(GetPatch.class);
+    get(REVISION_KIND, "submit_type").to(TestSubmitType.Get.class);
+    post(REVISION_KIND, "test.submit_rule").to(TestSubmitRule.class);
+    post(REVISION_KIND, "test.submit_type").to(TestSubmitType.class);
+    get(REVISION_KIND, "archive").to(GetArchive.class);
+    get(REVISION_KIND, "mergelist").to(GetMergeList.class);
+
+    child(REVISION_KIND, "reviewers").to(RevisionReviewers.class);
+
+    child(REVISION_KIND, "drafts").to(DraftComments.class);
+    put(REVISION_KIND, "drafts").to(CreateDraftComment.class);
+    get(DRAFT_COMMENT_KIND).to(GetDraftComment.class);
+    put(DRAFT_COMMENT_KIND).to(PutDraftComment.class);
+    delete(DRAFT_COMMENT_KIND).to(DeleteDraftComment.class);
+
+    child(REVISION_KIND, "comments").to(Comments.class);
+    get(COMMENT_KIND).to(GetComment.class);
+    delete(COMMENT_KIND).to(DeleteComment.class);
+    post(COMMENT_KIND, "delete").to(DeleteComment.class);
+
+    child(REVISION_KIND, "robotcomments").to(RobotComments.class);
+    get(ROBOT_COMMENT_KIND).to(GetRobotComment.class);
+    child(REVISION_KIND, "fixes").to(Fixes.class);
+    post(FIX_KIND, "apply").to(ApplyFix.class);
+
+    child(REVISION_KIND, "files").to(Files.class);
+    put(FILE_KIND, "reviewed").to(PutReviewed.class);
+    delete(FILE_KIND, "reviewed").to(DeleteReviewed.class);
+    get(FILE_KIND, "content").to(GetContent.class);
+    get(FILE_KIND, "download").to(DownloadContent.class);
+    get(FILE_KIND, "diff").to(GetDiff.class);
+    get(FILE_KIND, "blame").to(GetBlame.class);
+
+    child(CHANGE_KIND, "edit").to(ChangeEdits.class);
+    create(CHANGE_EDIT_KIND).to(ChangeEdits.Create.class);
+    deleteMissing(CHANGE_EDIT_KIND).to(ChangeEdits.DeleteFile.class);
+    postOnCollection(CHANGE_EDIT_KIND).to(ChangeEdits.Post.class);
+    deleteOnCollection(CHANGE_EDIT_KIND).to(DeleteChangeEdit.class);
+    post(CHANGE_KIND, "edit:publish").to(PublishChangeEdit.class);
+    post(CHANGE_KIND, "edit:rebase").to(RebaseChangeEdit.class);
+    put(CHANGE_KIND, "edit:message").to(ChangeEdits.EditMessage.class);
+    get(CHANGE_KIND, "edit:message").to(ChangeEdits.GetMessage.class);
+    put(CHANGE_EDIT_KIND, "/").to(ChangeEdits.Put.class);
+    delete(CHANGE_EDIT_KIND).to(ChangeEdits.DeleteContent.class);
+    get(CHANGE_EDIT_KIND, "/").to(ChangeEdits.Get.class);
+    get(CHANGE_EDIT_KIND, "meta").to(ChangeEdits.GetMeta.class);
+
+    child(CHANGE_KIND, "messages").to(ChangeMessages.class);
+    get(CHANGE_MESSAGE_KIND).to(GetChangeMessage.class);
+    delete(CHANGE_MESSAGE_KIND).to(DeleteChangeMessage.DefaultDeleteChangeMessage.class);
+    post(CHANGE_MESSAGE_KIND, "delete").to(DeleteChangeMessage.class);
+
+    factory(AccountLoader.Factory.class);
+    factory(ChangeInserter.Factory.class);
+    factory(ChangeResource.Factory.class);
+    factory(DeleteReviewerByEmailOp.Factory.class);
+    factory(DeleteReviewerOp.Factory.class);
+    factory(EmailReviewComments.Factory.class);
+    factory(PatchSetInserter.Factory.class);
+    factory(AddReviewersOp.Factory.class);
+    factory(RebaseChangeOp.Factory.class);
+    factory(ReviewerResource.Factory.class);
+    factory(SetAssigneeOp.Factory.class);
+    factory(SetHashtagsOp.Factory.class);
+    factory(SetPrivateOp.Factory.class);
+    factory(WorkInProgressOp.Factory.class);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/Move.java b/java/com/google/gerrit/server/restapi/change/Move.java
new file mode 100644
index 0000000..013d3e9
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/Move.java
@@ -0,0 +1,321 @@
+// Copyright (C) 2015 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.google.gerrit.server.restapi.change;
+
+import static com.google.gerrit.extensions.conditions.BooleanCondition.and;
+import static com.google.gerrit.server.permissions.ChangePermission.ABANDON;
+import static com.google.gerrit.server.permissions.RefPermission.CREATE_CHANGE;
+import static com.google.gerrit.server.query.change.ChangeData.asChanges;
+
+import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.extensions.api.changes.MoveInput;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.webui.UiAction;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Change.Status;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.LabelId;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.ChangeUtil;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.change.ChangeJson;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestModifyView;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+@Singleton
+public class Move extends RetryingRestModifyView<ChangeResource, MoveInput, ChangeInfo>
+    implements UiAction<ChangeResource> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final PermissionBackend permissionBackend;
+  private final Provider<ReviewDb> dbProvider;
+  private final ChangeJson.Factory json;
+  private final GitRepositoryManager repoManager;
+  private final Provider<InternalChangeQuery> queryProvider;
+  private final ChangeMessagesUtil cmUtil;
+  private final PatchSetUtil psUtil;
+  private final ApprovalsUtil approvalsUtil;
+  private final ProjectCache projectCache;
+
+  @Inject
+  Move(
+      PermissionBackend permissionBackend,
+      Provider<ReviewDb> dbProvider,
+      ChangeJson.Factory json,
+      GitRepositoryManager repoManager,
+      Provider<InternalChangeQuery> queryProvider,
+      ChangeMessagesUtil cmUtil,
+      RetryHelper retryHelper,
+      PatchSetUtil psUtil,
+      ApprovalsUtil approvalsUtil,
+      ProjectCache projectCache) {
+    super(retryHelper);
+    this.permissionBackend = permissionBackend;
+    this.dbProvider = dbProvider;
+    this.json = json;
+    this.repoManager = repoManager;
+    this.queryProvider = queryProvider;
+    this.cmUtil = cmUtil;
+    this.psUtil = psUtil;
+    this.approvalsUtil = approvalsUtil;
+    this.projectCache = projectCache;
+  }
+
+  @Override
+  protected ChangeInfo applyImpl(
+      BatchUpdate.Factory updateFactory, ChangeResource rsrc, MoveInput input)
+      throws RestApiException, OrmException, UpdateException, PermissionBackendException,
+          IOException {
+    Change change = rsrc.getChange();
+    Project.NameKey project = rsrc.getProject();
+    IdentifiedUser caller = rsrc.getUser().asIdentifiedUser();
+    if (input.destinationBranch == null) {
+      throw new BadRequestException("destination branch is required");
+    }
+    input.destinationBranch = RefNames.fullName(input.destinationBranch);
+
+    if (change.getStatus().isClosed()) {
+      throw new ResourceConflictException("Change is " + ChangeUtil.status(change));
+    }
+
+    Branch.NameKey newDest = new Branch.NameKey(project, input.destinationBranch);
+    if (change.getDest().equals(newDest)) {
+      throw new ResourceConflictException("Change is already destined for the specified branch");
+    }
+
+    // Not allowed to move if the current patch set is locked.
+    psUtil.checkPatchSetNotLocked(rsrc.getNotes());
+
+    // Move requires abandoning this change, and creating a new change.
+    try {
+      rsrc.permissions().database(dbProvider).check(ABANDON);
+      permissionBackend.user(caller).database(dbProvider).ref(newDest).check(CREATE_CHANGE);
+    } catch (AuthException denied) {
+      throw new AuthException("move not permitted", denied);
+    }
+    projectCache.checkedGet(project).checkStatePermitsWrite();
+
+    Op op = new Op(input);
+    try (BatchUpdate u =
+        updateFactory.create(dbProvider.get(), project, caller, TimeUtil.nowTs())) {
+      u.addOp(change.getId(), op);
+      u.execute();
+    }
+    return json.noOptions().format(op.getChange());
+  }
+
+  private class Op implements BatchUpdateOp {
+    private final MoveInput input;
+
+    private Change change;
+    private Branch.NameKey newDestKey;
+
+    Op(MoveInput input) {
+      this.input = input;
+    }
+
+    @Nullable
+    public Change getChange() {
+      return change;
+    }
+
+    @Override
+    public boolean updateChange(ChangeContext ctx)
+        throws OrmException, ResourceConflictException, IOException {
+      change = ctx.getChange();
+      if (change.getStatus() != Status.NEW) {
+        throw new ResourceConflictException("Change is " + ChangeUtil.status(change));
+      }
+
+      Project.NameKey projectKey = change.getProject();
+      newDestKey = new Branch.NameKey(projectKey, input.destinationBranch);
+      Branch.NameKey changePrevDest = change.getDest();
+      if (changePrevDest.equals(newDestKey)) {
+        throw new ResourceConflictException("Change is already destined for the specified branch");
+      }
+
+      final PatchSet.Id patchSetId = change.currentPatchSetId();
+      try (Repository repo = repoManager.openRepository(projectKey);
+          RevWalk revWalk = new RevWalk(repo)) {
+        RevCommit currPatchsetRevCommit =
+            revWalk.parseCommit(
+                ObjectId.fromString(
+                    psUtil.current(ctx.getDb(), ctx.getNotes()).getRevision().get()));
+        if (currPatchsetRevCommit.getParentCount() > 1) {
+          throw new ResourceConflictException("Merge commit cannot be moved");
+        }
+
+        ObjectId refId = repo.resolve(input.destinationBranch);
+        // Check if destination ref exists in project repo
+        if (refId == null) {
+          throw new ResourceConflictException(
+              "Destination " + input.destinationBranch + " not found in the project");
+        }
+        RevCommit refCommit = revWalk.parseCommit(refId);
+        if (revWalk.isMergedInto(currPatchsetRevCommit, refCommit)) {
+          throw new ResourceConflictException(
+              "Current patchset revision is reachable from tip of " + input.destinationBranch);
+        }
+      }
+
+      Change.Key changeKey = change.getKey();
+      if (!asChanges(queryProvider.get().byBranchKey(newDestKey, changeKey)).isEmpty()) {
+        throw new ResourceConflictException(
+            "Destination "
+                + newDestKey.getShortName()
+                + " has a different change with same change key "
+                + changeKey);
+      }
+
+      if (!change.currentPatchSetId().equals(patchSetId)) {
+        throw new ResourceConflictException("Patch set is not current");
+      }
+
+      PatchSet.Id psId = change.currentPatchSetId();
+      ChangeUpdate update = ctx.getUpdate(psId);
+      update.setBranch(newDestKey.get());
+      change.setDest(newDestKey);
+
+      updateApprovals(ctx, update, psId, projectKey);
+
+      StringBuilder msgBuf = new StringBuilder();
+      msgBuf.append("Change destination moved from ");
+      msgBuf.append(changePrevDest.getShortName());
+      msgBuf.append(" to ");
+      msgBuf.append(newDestKey.getShortName());
+      if (!Strings.isNullOrEmpty(input.message)) {
+        msgBuf.append("\n\n");
+        msgBuf.append(input.message);
+      }
+      ChangeMessage cmsg =
+          ChangeMessagesUtil.newMessage(ctx, msgBuf.toString(), ChangeMessagesUtil.TAG_MOVE);
+      cmUtil.addChangeMessage(ctx.getDb(), update, cmsg);
+
+      return true;
+    }
+
+    /**
+     * We have a long discussion about how to deal with its votes after moving a change from one
+     * branch to another. In the end, we think only keeping the veto votes is the best way since
+     * it's simple for us and less confusing for our users. See the discussion in the following
+     * proposal: https://gerrit-review.googlesource.com/c/gerrit/+/129171
+     */
+    private void updateApprovals(
+        ChangeContext ctx, ChangeUpdate update, PatchSet.Id psId, Project.NameKey project)
+        throws IOException, OrmException {
+      List<PatchSetApproval> approvals = new ArrayList<>();
+      for (PatchSetApproval psa :
+          approvalsUtil.byPatchSet(
+              ctx.getDb(), ctx.getNotes(), psId, ctx.getRevWalk(), ctx.getRepoView().getConfig())) {
+        ProjectState projectState = projectCache.checkedGet(project);
+        LabelType type = projectState.getLabelTypes(ctx.getNotes()).byLabel(psa.getLabelId());
+        // Only keep veto votes, defined as votes where:
+        // 1- the label function allows minimum values to block submission.
+        // 2- the vote holds the minimum value.
+        if (type == null || (type.isMaxNegative(psa) && type.getFunction().isBlock())) {
+          continue;
+        }
+
+        // Remove votes from NoteDb.
+        update.removeApprovalFor(psa.getAccountId(), psa.getLabel());
+        approvals.add(
+            new PatchSetApproval(
+                new PatchSetApproval.Key(psId, psa.getAccountId(), new LabelId(psa.getLabel())),
+                (short) 0,
+                ctx.getWhen()));
+      }
+      // Remove votes from ReviewDb.
+      ctx.getDb().patchSetApprovals().upsert(approvals);
+    }
+  }
+
+  @Override
+  public UiAction.Description getDescription(ChangeResource rsrc) {
+    UiAction.Description description =
+        new UiAction.Description()
+            .setLabel("Move Change")
+            .setTitle("Move change to a different branch")
+            .setVisible(false);
+
+    Change change = rsrc.getChange();
+    if (!change.getStatus().isOpen()) {
+      return description;
+    }
+
+    try {
+      if (!projectCache.checkedGet(rsrc.getProject()).statePermitsWrite()) {
+        return description;
+      }
+    } catch (IOException e) {
+      logger.atSevere().withCause(e).log(
+          "Failed to check if project state permits write: %s", rsrc.getProject());
+      return description;
+    }
+
+    try {
+      if (psUtil.isPatchSetLocked(rsrc.getNotes())) {
+        return description;
+      }
+    } catch (OrmException | IOException e) {
+      logger.atSevere().withCause(e).log(
+          "Failed to check if the current patch set of change %s is locked", change.getId());
+      return description;
+    }
+
+    return description.setVisible(
+        and(
+            permissionBackend.user(rsrc.getUser()).ref(change.getDest()).testCond(CREATE_CHANGE),
+            rsrc.permissions().database(dbProvider).testCond(ABANDON)));
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/PostHashtags.java b/java/com/google/gerrit/server/restapi/change/PostHashtags.java
new file mode 100644
index 0000000..c67fb67
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/PostHashtags.java
@@ -0,0 +1,74 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.change;
+
+import com.google.common.collect.ImmutableSortedSet;
+import com.google.gerrit.extensions.api.changes.HashtagsInput;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.webui.UiAction;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.SetHashtagsOp;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestModifyView;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@Singleton
+public class PostHashtags
+    extends RetryingRestModifyView<
+        ChangeResource, HashtagsInput, Response<ImmutableSortedSet<String>>>
+    implements UiAction<ChangeResource> {
+  private final Provider<ReviewDb> db;
+  private final SetHashtagsOp.Factory hashtagsFactory;
+
+  @Inject
+  PostHashtags(
+      Provider<ReviewDb> db, RetryHelper retryHelper, SetHashtagsOp.Factory hashtagsFactory) {
+    super(retryHelper);
+    this.db = db;
+    this.hashtagsFactory = hashtagsFactory;
+  }
+
+  @Override
+  protected Response<ImmutableSortedSet<String>> applyImpl(
+      BatchUpdate.Factory updateFactory, ChangeResource req, HashtagsInput input)
+      throws RestApiException, UpdateException, PermissionBackendException {
+    req.permissions().check(ChangePermission.EDIT_HASHTAGS);
+
+    try (BatchUpdate bu =
+        updateFactory.create(
+            db.get(), req.getChange().getProject(), req.getUser(), TimeUtil.nowTs())) {
+      SetHashtagsOp op = hashtagsFactory.create(input);
+      bu.addOp(req.getId(), op);
+      bu.execute();
+      return Response.<ImmutableSortedSet<String>>ok(op.getUpdatedHashtags());
+    }
+  }
+
+  @Override
+  public UiAction.Description getDescription(ChangeResource rsrc) {
+    return new UiAction.Description()
+        .setLabel("Edit Hashtags")
+        .setVisible(rsrc.permissions().testCond(ChangePermission.EDIT_HASHTAGS));
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/PostPrivate.java b/java/com/google/gerrit/server/restapi/change/PostPrivate.java
new file mode 100644
index 0000000..a506624
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/PostPrivate.java
@@ -0,0 +1,111 @@
+// Copyright (C) 2017 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.google.gerrit.server.restapi.change;
+
+import static com.google.gerrit.extensions.conditions.BooleanCondition.and;
+import static com.google.gerrit.extensions.conditions.BooleanCondition.or;
+
+import com.google.gerrit.extensions.conditions.BooleanCondition;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.webui.UiAction;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.SetPrivateOp;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestModifyView;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import org.eclipse.jgit.lib.Config;
+
+@Singleton
+public class PostPrivate
+    extends RetryingRestModifyView<ChangeResource, SetPrivateOp.Input, Response<String>>
+    implements UiAction<ChangeResource> {
+  private final ChangeMessagesUtil cmUtil;
+  private final Provider<ReviewDb> dbProvider;
+  private final PermissionBackend permissionBackend;
+  private final SetPrivateOp.Factory setPrivateOpFactory;
+  private final boolean disablePrivateChanges;
+
+  @Inject
+  PostPrivate(
+      Provider<ReviewDb> dbProvider,
+      RetryHelper retryHelper,
+      ChangeMessagesUtil cmUtil,
+      PermissionBackend permissionBackend,
+      SetPrivateOp.Factory setPrivateOpFactory,
+      @GerritServerConfig Config config) {
+    super(retryHelper);
+    this.dbProvider = dbProvider;
+    this.cmUtil = cmUtil;
+    this.permissionBackend = permissionBackend;
+    this.setPrivateOpFactory = setPrivateOpFactory;
+    this.disablePrivateChanges = config.getBoolean("change", null, "disablePrivateChanges", false);
+  }
+
+  @Override
+  public Response<String> applyImpl(
+      BatchUpdate.Factory updateFactory, ChangeResource rsrc, SetPrivateOp.Input input)
+      throws RestApiException, UpdateException {
+    if (disablePrivateChanges) {
+      throw new MethodNotAllowedException("private changes are disabled");
+    }
+
+    if (!canSetPrivate(rsrc).value()) {
+      throw new AuthException("not allowed to mark private");
+    }
+
+    if (rsrc.getChange().isPrivate()) {
+      return Response.ok("");
+    }
+
+    SetPrivateOp op = setPrivateOpFactory.create(cmUtil, true, input);
+    try (BatchUpdate u =
+        updateFactory.create(
+            dbProvider.get(), rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
+      u.addOp(rsrc.getId(), op).execute();
+    }
+
+    return Response.created("");
+  }
+
+  @Override
+  public Description getDescription(ChangeResource rsrc) {
+    Change change = rsrc.getChange();
+    return new UiAction.Description()
+        .setLabel("Mark private")
+        .setTitle("Mark change as private")
+        .setVisible(and(!disablePrivateChanges && !change.isPrivate(), canSetPrivate(rsrc)));
+  }
+
+  private BooleanCondition canSetPrivate(ChangeResource rsrc) {
+    PermissionBackend.WithUser user = permissionBackend.user(rsrc.getUser());
+    return or(
+        rsrc.isUserOwner() && rsrc.getChange().getStatus() != Change.Status.MERGED,
+        user.testCond(GlobalPermission.ADMINISTRATE_SERVER));
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/PostReview.java b/java/com/google/gerrit/server/restapi/change/PostReview.java
new file mode 100644
index 0000000..845f584
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/PostReview.java
@@ -0,0 +1,1416 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.change;
+
+import static com.google.common.base.MoreObjects.firstNonNull;
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.gerrit.server.CommentsUtil.setCommentRevId;
+import static com.google.gerrit.server.notedb.ReviewerStateInternal.REVIEWER;
+import static com.google.gerrit.server.permissions.LabelPermission.ForUser.ON_BEHALF_OF;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Objects.requireNonNull;
+import static java.util.stream.Collectors.groupingBy;
+import static java.util.stream.Collectors.joining;
+import static java.util.stream.Collectors.toList;
+import static java.util.stream.Collectors.toSet;
+import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.base.Strings;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Ordering;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.hash.HashCode;
+import com.google.common.hash.Hashing;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.LabelTypes;
+import com.google.gerrit.extensions.api.changes.AddReviewerInput;
+import com.google.gerrit.extensions.api.changes.AddReviewerResult;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.api.changes.RecipientType;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput.CommentInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput.DraftHandling;
+import com.google.gerrit.extensions.api.changes.ReviewInput.RobotCommentInput;
+import com.google.gerrit.extensions.api.changes.ReviewResult;
+import com.google.gerrit.extensions.api.changes.ReviewerInfo;
+import com.google.gerrit.extensions.client.Comment.Range;
+import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
+import com.google.gerrit.extensions.client.ReviewerState;
+import com.google.gerrit.extensions.client.Side;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.FixReplacementInfo;
+import com.google.gerrit.extensions.common.FixSuggestionInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.extensions.restapi.Url;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.FixReplacement;
+import com.google.gerrit.reviewdb.client.FixSuggestion;
+import com.google.gerrit.reviewdb.client.LabelId;
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.reviewdb.client.PatchLineComment.Status;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.client.RobotComment;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.ChangeUtil;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.OutputFormat;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.PublishCommentUtil;
+import com.google.gerrit.server.ReviewerSet;
+import com.google.gerrit.server.account.AccountResolver;
+import com.google.gerrit.server.change.AddReviewersEmail;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.EmailReviewComments;
+import com.google.gerrit.server.change.NotifyUtil;
+import com.google.gerrit.server.change.ReviewerAdder;
+import com.google.gerrit.server.change.ReviewerAdder.ReviewerAddition;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.change.WorkInProgressOp;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.extensions.events.CommentAdded;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gerrit.server.patch.DiffSummary;
+import com.google.gerrit.server.patch.DiffSummaryKey;
+import com.google.gerrit.server.patch.PatchListCache;
+import com.google.gerrit.server.patch.PatchListKey;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.LabelPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.Context;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestModifyView;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.LabelVote;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gson.Gson;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.OptionalInt;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+
+@Singleton
+public class PostReview
+    extends RetryingRestModifyView<RevisionResource, ReviewInput, Response<ReviewResult>> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static final String ERROR_ADDING_REVIEWER = "error adding reviewer";
+  public static final String ERROR_WIP_READY_MUTUALLY_EXCLUSIVE =
+      "work_in_progress and ready are mutually exclusive";
+
+  public static final String START_REVIEW_MESSAGE = "This change is ready for review.";
+
+  private static final Gson GSON = OutputFormat.JSON_COMPACT.newGson();
+  private static final int DEFAULT_ROBOT_COMMENT_SIZE_LIMIT_IN_BYTES = 1024 * 1024;
+
+  private final Provider<ReviewDb> db;
+  private final ChangeResource.Factory changeResourceFactory;
+  private final ChangeData.Factory changeDataFactory;
+  private final ApprovalsUtil approvalsUtil;
+  private final ChangeMessagesUtil cmUtil;
+  private final CommentsUtil commentsUtil;
+  private final PublishCommentUtil publishCommentUtil;
+  private final PatchSetUtil psUtil;
+  private final PatchListCache patchListCache;
+  private final AccountResolver accountResolver;
+  private final EmailReviewComments.Factory email;
+  private final CommentAdded commentAdded;
+  private final ReviewerAdder reviewerAdder;
+  private final AddReviewersEmail addReviewersEmail;
+  private final NotesMigration migration;
+  private final NotifyUtil notifyUtil;
+  private final Config gerritConfig;
+  private final WorkInProgressOp.Factory workInProgressOpFactory;
+  private final ProjectCache projectCache;
+  private final PermissionBackend permissionBackend;
+  private final boolean strictLabels;
+
+  @Inject
+  PostReview(
+      Provider<ReviewDb> db,
+      RetryHelper retryHelper,
+      ChangeResource.Factory changeResourceFactory,
+      ChangeData.Factory changeDataFactory,
+      ApprovalsUtil approvalsUtil,
+      ChangeMessagesUtil cmUtil,
+      CommentsUtil commentsUtil,
+      PublishCommentUtil publishCommentUtil,
+      PatchSetUtil psUtil,
+      PatchListCache patchListCache,
+      AccountResolver accountResolver,
+      EmailReviewComments.Factory email,
+      CommentAdded commentAdded,
+      ReviewerAdder reviewerAdder,
+      AddReviewersEmail addReviewersEmail,
+      NotesMigration migration,
+      NotifyUtil notifyUtil,
+      @GerritServerConfig Config gerritConfig,
+      WorkInProgressOp.Factory workInProgressOpFactory,
+      ProjectCache projectCache,
+      PermissionBackend permissionBackend) {
+    super(retryHelper);
+    this.db = db;
+    this.changeResourceFactory = changeResourceFactory;
+    this.changeDataFactory = changeDataFactory;
+    this.commentsUtil = commentsUtil;
+    this.publishCommentUtil = publishCommentUtil;
+    this.psUtil = psUtil;
+    this.patchListCache = patchListCache;
+    this.approvalsUtil = approvalsUtil;
+    this.cmUtil = cmUtil;
+    this.accountResolver = accountResolver;
+    this.email = email;
+    this.commentAdded = commentAdded;
+    this.reviewerAdder = reviewerAdder;
+    this.addReviewersEmail = addReviewersEmail;
+    this.migration = migration;
+    this.notifyUtil = notifyUtil;
+    this.gerritConfig = gerritConfig;
+    this.workInProgressOpFactory = workInProgressOpFactory;
+    this.projectCache = projectCache;
+    this.permissionBackend = permissionBackend;
+    this.strictLabels = gerritConfig.getBoolean("change", "strictLabels", false);
+  }
+
+  @Override
+  protected Response<ReviewResult> applyImpl(
+      BatchUpdate.Factory updateFactory, RevisionResource revision, ReviewInput input)
+      throws RestApiException, UpdateException, OrmException, IOException,
+          PermissionBackendException, ConfigInvalidException, PatchListNotAvailableException {
+    return apply(updateFactory, revision, input, TimeUtil.nowTs());
+  }
+
+  public Response<ReviewResult> apply(
+      BatchUpdate.Factory updateFactory, RevisionResource revision, ReviewInput input, Timestamp ts)
+      throws RestApiException, UpdateException, OrmException, IOException,
+          PermissionBackendException, ConfigInvalidException, PatchListNotAvailableException {
+    // Respect timestamp, but truncate at change created-on time.
+    ts = Ordering.natural().max(ts, revision.getChange().getCreatedOn());
+    if (revision.getEdit().isPresent()) {
+      throw new ResourceConflictException("cannot post review on edit");
+    }
+    ProjectState projectState = projectCache.checkedGet(revision.getProject());
+    LabelTypes labelTypes = projectState.getLabelTypes(revision.getNotes());
+    input.drafts = firstNonNull(input.drafts, DraftHandling.KEEP);
+    if (input.onBehalfOf != null) {
+      revision = onBehalfOf(revision, labelTypes, input);
+    }
+    if (input.labels != null) {
+      checkLabels(revision, labelTypes, input.labels);
+    }
+    if (input.comments != null) {
+      cleanUpComments(input.comments);
+      checkComments(revision, input.comments);
+    }
+    if (input.robotComments != null) {
+      if (!migration.readChanges()) {
+        throw new MethodNotAllowedException("robot comments not supported");
+      }
+      checkRobotComments(revision, input.robotComments);
+    }
+
+    NotifyHandling reviewerNotify = input.notify;
+    if (input.notify == null) {
+      input.notify = defaultNotify(revision.getChange(), input);
+    }
+
+    ListMultimap<RecipientType, Account.Id> accountsToNotify =
+        notifyUtil.resolveAccounts(input.notifyDetails);
+
+    Map<String, AddReviewerResult> reviewerJsonResults = null;
+    List<ReviewerAddition> reviewerResults = Lists.newArrayList();
+    boolean hasError = false;
+    boolean confirm = false;
+    if (input.reviewers != null) {
+      reviewerJsonResults = Maps.newHashMap();
+      for (AddReviewerInput reviewerInput : input.reviewers) {
+        // Prevent individual AddReviewersOps from sending one email each. Instead, we call
+        // batchEmailReviewers at the very end to send out a single email.
+        // TODO(dborowitz): I think this still sends out separate emails if any of input.reviewers
+        // specifies explicit accountsToNotify. Unclear whether that's a good thing.
+        reviewerInput.notify = NotifyHandling.NONE;
+
+        ReviewerAddition result =
+            reviewerAdder.prepare(
+                db.get(), revision.getNotes(), revision.getUser(), reviewerInput, true);
+        reviewerJsonResults.put(reviewerInput.reviewer, result.result);
+        if (result.result.error != null) {
+          hasError = true;
+          continue;
+        }
+        if (result.result.confirm != null) {
+          confirm = true;
+          continue;
+        }
+        reviewerResults.add(result);
+      }
+    }
+
+    ReviewResult output = new ReviewResult();
+    output.reviewers = reviewerJsonResults;
+    if (hasError || confirm) {
+      output.error = ERROR_ADDING_REVIEWER;
+      return Response.withStatusCode(SC_BAD_REQUEST, output);
+    }
+    output.labels = input.labels;
+
+    try (BatchUpdate bu =
+        updateFactory.create(db.get(), revision.getChange().getProject(), revision.getUser(), ts)) {
+      Account.Id id = revision.getUser().getAccountId();
+      boolean ccOrReviewer = false;
+      if (input.labels != null && !input.labels.isEmpty()) {
+        ccOrReviewer = input.labels.values().stream().filter(v -> v != 0).findFirst().isPresent();
+      }
+
+      if (!ccOrReviewer) {
+        // Check if user was already CCed or reviewing prior to this review.
+        ReviewerSet currentReviewers =
+            approvalsUtil.getReviewers(db.get(), revision.getChangeResource().getNotes());
+        ccOrReviewer = currentReviewers.all().contains(id);
+      }
+
+      // Apply reviewer changes first. Revision emails should be sent to the
+      // updated set of reviewers. Also keep track of whether the user added
+      // themselves as a reviewer or to the CC list.
+      for (ReviewerAddition reviewerResult : reviewerResults) {
+        bu.addOp(revision.getChange().getId(), reviewerResult.op);
+        if (!ccOrReviewer && reviewerResult.result.reviewers != null) {
+          for (ReviewerInfo reviewerInfo : reviewerResult.result.reviewers) {
+            if (Objects.equals(id.get(), reviewerInfo._accountId)) {
+              ccOrReviewer = true;
+              break;
+            }
+          }
+        }
+        if (!ccOrReviewer && reviewerResult.result.ccs != null) {
+          for (AccountInfo accountInfo : reviewerResult.result.ccs) {
+            if (Objects.equals(id.get(), accountInfo._accountId)) {
+              ccOrReviewer = true;
+              break;
+            }
+          }
+        }
+      }
+
+      if (!ccOrReviewer) {
+        // User posting this review isn't currently in the reviewer or CC list,
+        // isn't being explicitly added, and isn't voting on any label.
+        // Automatically CC them on this change so they receive replies.
+        ReviewerAddition selfAddition = reviewerAdder.ccCurrentUser(revision.getUser(), revision);
+        bu.addOp(revision.getChange().getId(), selfAddition.op);
+      }
+
+      // Add WorkInProgressOp if requested.
+      if (input.ready || input.workInProgress) {
+        if (input.ready && input.workInProgress) {
+          output.error = ERROR_WIP_READY_MUTUALLY_EXCLUSIVE;
+          return Response.withStatusCode(SC_BAD_REQUEST, output);
+        }
+
+        WorkInProgressOp.checkPermissions(
+            permissionBackend, revision.getUser(), revision.getChange());
+
+        if (input.ready) {
+          output.ready = true;
+        }
+
+        // Suppress notifications in WorkInProgressOp, we'll take care of
+        // them in this endpoint.
+        WorkInProgressOp.Input wipIn = new WorkInProgressOp.Input();
+        wipIn.notify = NotifyHandling.NONE;
+        bu.addOp(
+            revision.getChange().getId(),
+            workInProgressOpFactory.create(input.workInProgress, wipIn));
+      }
+
+      // Add the review op.
+      bu.addOp(
+          revision.getChange().getId(),
+          new Op(projectState, revision.getPatchSet().getId(), input, accountsToNotify));
+
+      bu.execute();
+
+      // Re-read change to take into account results of the update.
+      ChangeData cd =
+          changeDataFactory.create(db.get(), revision.getProject(), revision.getChange().getId());
+      for (ReviewerAddition reviewerResult : reviewerResults) {
+        reviewerResult.gatherResults(cd);
+      }
+
+      boolean readyForReview =
+          (output.ready != null && output.ready) || !revision.getChange().isWorkInProgress();
+      // Sending from AddReviewersOp was suppressed so we can send a single batch email here.
+      batchEmailReviewers(
+          revision.getUser(),
+          revision.getChange(),
+          reviewerResults,
+          reviewerNotify,
+          accountsToNotify,
+          readyForReview);
+    }
+
+    return Response.ok(output);
+  }
+
+  private NotifyHandling defaultNotify(Change c, ReviewInput in) {
+    boolean workInProgress = c.isWorkInProgress();
+    if (in.workInProgress) {
+      workInProgress = true;
+    }
+    if (in.ready) {
+      workInProgress = false;
+    }
+
+    if (ChangeMessagesUtil.isAutogenerated(in.tag)) {
+      // Autogenerated comments default to lower notify levels.
+      return workInProgress ? NotifyHandling.OWNER : NotifyHandling.OWNER_REVIEWERS;
+    }
+
+    if (workInProgress && !c.hasReviewStarted()) {
+      // If review hasn't started we want to minimize recipients, no matter who
+      // the author is.
+      return NotifyHandling.OWNER;
+    }
+
+    return NotifyHandling.ALL;
+  }
+
+  private void batchEmailReviewers(
+      CurrentUser user,
+      Change change,
+      List<ReviewerAddition> reviewerAdditions,
+      @Nullable NotifyHandling notify,
+      ListMultimap<RecipientType, Account.Id> accountsToNotify,
+      boolean readyForReview) {
+    List<Account.Id> to = new ArrayList<>();
+    List<Account.Id> cc = new ArrayList<>();
+    List<Address> toByEmail = new ArrayList<>();
+    List<Address> ccByEmail = new ArrayList<>();
+    for (ReviewerAddition addition : reviewerAdditions) {
+      if (addition.state() == ReviewerState.REVIEWER) {
+        to.addAll(addition.reviewers);
+        toByEmail.addAll(addition.reviewersByEmail);
+      } else if (addition.state() == ReviewerState.CC) {
+        cc.addAll(addition.reviewers);
+        ccByEmail.addAll(addition.reviewersByEmail);
+      }
+    }
+    addReviewersEmail.emailReviewers(
+        user.asIdentifiedUser(),
+        change,
+        to,
+        cc,
+        toByEmail,
+        ccByEmail,
+        notify,
+        accountsToNotify,
+        readyForReview);
+  }
+
+  private RevisionResource onBehalfOf(RevisionResource rev, LabelTypes labelTypes, ReviewInput in)
+      throws BadRequestException, AuthException, UnprocessableEntityException, OrmException,
+          PermissionBackendException, IOException, ConfigInvalidException {
+    if (in.labels == null || in.labels.isEmpty()) {
+      throw new AuthException(
+          String.format("label required to post review on behalf of \"%s\"", in.onBehalfOf));
+    }
+    if (in.drafts != DraftHandling.KEEP) {
+      throw new AuthException("not allowed to modify other user's drafts");
+    }
+
+    CurrentUser caller = rev.getUser();
+    PermissionBackend.ForChange perm = rev.permissions().database(db);
+    Iterator<Map.Entry<String, Short>> itr = in.labels.entrySet().iterator();
+    while (itr.hasNext()) {
+      Map.Entry<String, Short> ent = itr.next();
+      LabelType type = labelTypes.byLabel(ent.getKey());
+      if (type == null) {
+        if (strictLabels) {
+          throw new BadRequestException(
+              String.format("label \"%s\" is not a configured label", ent.getKey()));
+        }
+        itr.remove();
+        continue;
+      }
+
+      if (!caller.isInternalUser()) {
+        try {
+          perm.check(new LabelPermission.WithValue(ON_BEHALF_OF, type, ent.getValue()));
+        } catch (AuthException e) {
+          throw new AuthException(
+              String.format(
+                  "not permitted to modify label \"%s\" on behalf of \"%s\"",
+                  type.getName(), in.onBehalfOf));
+        }
+      }
+    }
+    if (in.labels.isEmpty()) {
+      throw new AuthException(
+          String.format("label required to post review on behalf of \"%s\"", in.onBehalfOf));
+    }
+
+    IdentifiedUser reviewer = accountResolver.parseOnBehalfOf(caller, in.onBehalfOf);
+    try {
+      permissionBackend
+          .user(reviewer)
+          .database(db)
+          .change(rev.getNotes())
+          .check(ChangePermission.READ);
+    } catch (AuthException e) {
+      throw new UnprocessableEntityException(
+          String.format("on_behalf_of account %s cannot see change", reviewer.getAccountId()));
+    }
+
+    return new RevisionResource(
+        changeResourceFactory.create(rev.getNotes(), reviewer), rev.getPatchSet());
+  }
+
+  private void checkLabels(RevisionResource rsrc, LabelTypes labelTypes, Map<String, Short> labels)
+      throws BadRequestException, AuthException, PermissionBackendException {
+    PermissionBackend.ForChange perm = rsrc.permissions();
+    Iterator<Map.Entry<String, Short>> itr = labels.entrySet().iterator();
+    while (itr.hasNext()) {
+      Map.Entry<String, Short> ent = itr.next();
+      LabelType lt = labelTypes.byLabel(ent.getKey());
+      if (lt == null) {
+        if (strictLabels) {
+          throw new BadRequestException(
+              String.format("label \"%s\" is not a configured label", ent.getKey()));
+        }
+        itr.remove();
+        continue;
+      }
+
+      if (ent.getValue() == null || ent.getValue() == 0) {
+        // Always permit 0, even if it is not within range.
+        // Later null/0 will be deleted and revoke the label.
+        continue;
+      }
+
+      if (lt.getValue(ent.getValue()) == null) {
+        if (strictLabels) {
+          throw new BadRequestException(
+              String.format("label \"%s\": %d is not a valid value", ent.getKey(), ent.getValue()));
+        }
+        itr.remove();
+        continue;
+      }
+
+      short val = ent.getValue();
+      try {
+        perm.check(new LabelPermission.WithValue(lt, val));
+      } catch (AuthException e) {
+        throw new AuthException(
+            String.format("Applying label \"%s\": %d is restricted", lt.getName(), val));
+      }
+    }
+  }
+
+  private static <T extends CommentInput> void cleanUpComments(
+      Map<String, List<T>> commentsPerPath) {
+    Iterator<List<T>> mapValueIterator = commentsPerPath.values().iterator();
+    while (mapValueIterator.hasNext()) {
+      List<T> comments = mapValueIterator.next();
+      if (comments == null) {
+        mapValueIterator.remove();
+        continue;
+      }
+
+      cleanUpComments(comments);
+      if (comments.isEmpty()) {
+        mapValueIterator.remove();
+      }
+    }
+  }
+
+  private static <T extends CommentInput> void cleanUpComments(List<T> comments) {
+    Iterator<T> commentsIterator = comments.iterator();
+    while (commentsIterator.hasNext()) {
+      T comment = commentsIterator.next();
+      if (comment == null) {
+        commentsIterator.remove();
+        continue;
+      }
+
+      comment.message = Strings.nullToEmpty(comment.message).trim();
+      if (comment.message.isEmpty()) {
+        commentsIterator.remove();
+      }
+    }
+  }
+
+  private <T extends CommentInput> void checkComments(
+      RevisionResource revision, Map<String, List<T>> commentsPerPath)
+      throws BadRequestException, PatchListNotAvailableException {
+    Set<String> revisionFilePaths = getAffectedFilePaths(revision);
+    for (Map.Entry<String, List<T>> entry : commentsPerPath.entrySet()) {
+      String path = entry.getKey();
+      PatchSet.Id patchSetId = revision.getPatchSet().getId();
+      ensurePathRefersToAvailableOrMagicFile(path, revisionFilePaths, patchSetId);
+
+      List<T> comments = entry.getValue();
+      for (T comment : comments) {
+        ensureLineIsNonNegative(comment.line, path);
+        ensureCommentNotOnMagicFilesOfAutoMerge(path, comment);
+        ensureRangeIsValid(path, comment.range);
+      }
+    }
+  }
+
+  private Set<String> getAffectedFilePaths(RevisionResource revision)
+      throws PatchListNotAvailableException {
+    ObjectId newId = ObjectId.fromString(revision.getPatchSet().getRevision().get());
+    DiffSummaryKey key =
+        DiffSummaryKey.fromPatchListKey(
+            PatchListKey.againstDefaultBase(newId, Whitespace.IGNORE_NONE));
+    DiffSummary ds = patchListCache.getDiffSummary(key, revision.getProject());
+    return new HashSet<>(ds.getPaths());
+  }
+
+  private static void ensurePathRefersToAvailableOrMagicFile(
+      String path, Set<String> availableFilePaths, PatchSet.Id patchSetId)
+      throws BadRequestException {
+    if (!availableFilePaths.contains(path) && !Patch.isMagic(path)) {
+      throw new BadRequestException(
+          String.format("file %s not found in revision %s", path, patchSetId));
+    }
+  }
+
+  private static void ensureLineIsNonNegative(Integer line, String path)
+      throws BadRequestException {
+    if (line != null && line < 0) {
+      throw new BadRequestException(
+          String.format("negative line number %d not allowed on %s", line, path));
+    }
+  }
+
+  private static <T extends CommentInput> void ensureCommentNotOnMagicFilesOfAutoMerge(
+      String path, T comment) throws BadRequestException {
+    if (Patch.isMagic(path) && comment.side == Side.PARENT && comment.parent == null) {
+      throw new BadRequestException(String.format("cannot comment on %s on auto-merge", path));
+    }
+  }
+
+  private void checkRobotComments(
+      RevisionResource revision, Map<String, List<RobotCommentInput>> in)
+      throws BadRequestException, PatchListNotAvailableException {
+    cleanUpComments(in);
+    for (Map.Entry<String, List<RobotCommentInput>> e : in.entrySet()) {
+      String commentPath = e.getKey();
+      for (RobotCommentInput c : e.getValue()) {
+        ensureSizeOfJsonInputIsWithinBounds(c);
+        ensureRobotIdIsSet(c.robotId, commentPath);
+        ensureRobotRunIdIsSet(c.robotRunId, commentPath);
+        ensureFixSuggestionsAreAddable(c.fixSuggestions, commentPath);
+      }
+    }
+    checkComments(revision, in);
+  }
+
+  private void ensureSizeOfJsonInputIsWithinBounds(RobotCommentInput robotCommentInput)
+      throws BadRequestException {
+    OptionalInt robotCommentSizeLimit = getRobotCommentSizeLimit();
+    if (robotCommentSizeLimit.isPresent()) {
+      int sizeLimit = robotCommentSizeLimit.getAsInt();
+      byte[] robotCommentBytes = GSON.toJson(robotCommentInput).getBytes(StandardCharsets.UTF_8);
+      int robotCommentSize = robotCommentBytes.length;
+      if (robotCommentSize > sizeLimit) {
+        throw new BadRequestException(
+            String.format(
+                "Size %d (bytes) of robot comment is greater than limit %d (bytes)",
+                robotCommentSize, sizeLimit));
+      }
+    }
+  }
+
+  private OptionalInt getRobotCommentSizeLimit() {
+    int robotCommentSizeLimit =
+        gerritConfig.getInt(
+            "change", "robotCommentSizeLimit", DEFAULT_ROBOT_COMMENT_SIZE_LIMIT_IN_BYTES);
+    if (robotCommentSizeLimit <= 0) {
+      return OptionalInt.empty();
+    }
+    return OptionalInt.of(robotCommentSizeLimit);
+  }
+
+  private static void ensureRobotIdIsSet(String robotId, String commentPath)
+      throws BadRequestException {
+    if (robotId == null) {
+      throw new BadRequestException(
+          String.format("robotId is missing for robot comment on %s", commentPath));
+    }
+  }
+
+  private static void ensureRobotRunIdIsSet(String robotRunId, String commentPath)
+      throws BadRequestException {
+    if (robotRunId == null) {
+      throw new BadRequestException(
+          String.format("robotRunId is missing for robot comment on %s", commentPath));
+    }
+  }
+
+  private static void ensureFixSuggestionsAreAddable(
+      List<FixSuggestionInfo> fixSuggestionInfos, String commentPath) throws BadRequestException {
+    if (fixSuggestionInfos == null) {
+      return;
+    }
+
+    for (FixSuggestionInfo fixSuggestionInfo : fixSuggestionInfos) {
+      ensureDescriptionIsSet(commentPath, fixSuggestionInfo.description);
+      ensureFixReplacementsAreAddable(commentPath, fixSuggestionInfo.replacements);
+    }
+  }
+
+  private static void ensureDescriptionIsSet(String commentPath, String description)
+      throws BadRequestException {
+    if (description == null) {
+      throw new BadRequestException(
+          String.format(
+              "A description is required for the suggested fix of the robot comment on %s",
+              commentPath));
+    }
+  }
+
+  private static void ensureFixReplacementsAreAddable(
+      String commentPath, List<FixReplacementInfo> fixReplacementInfos) throws BadRequestException {
+    ensureReplacementsArePresent(commentPath, fixReplacementInfos);
+
+    for (FixReplacementInfo fixReplacementInfo : fixReplacementInfos) {
+      ensureReplacementPathIsSet(commentPath, fixReplacementInfo.path);
+      ensureRangeIsSet(commentPath, fixReplacementInfo.range);
+      ensureRangeIsValid(commentPath, fixReplacementInfo.range);
+      ensureReplacementStringIsSet(commentPath, fixReplacementInfo.replacement);
+    }
+
+    Map<String, List<FixReplacementInfo>> replacementsPerFilePath =
+        fixReplacementInfos.stream().collect(groupingBy(fixReplacement -> fixReplacement.path));
+    for (List<FixReplacementInfo> sameFileReplacements : replacementsPerFilePath.values()) {
+      ensureRangesDoNotOverlap(commentPath, sameFileReplacements);
+    }
+  }
+
+  private static void ensureReplacementsArePresent(
+      String commentPath, List<FixReplacementInfo> fixReplacementInfos) throws BadRequestException {
+    if (fixReplacementInfos == null || fixReplacementInfos.isEmpty()) {
+      throw new BadRequestException(
+          String.format(
+              "At least one replacement is "
+                  + "required for the suggested fix of the robot comment on %s",
+              commentPath));
+    }
+  }
+
+  private static void ensureReplacementPathIsSet(String commentPath, String replacementPath)
+      throws BadRequestException {
+    if (replacementPath == null) {
+      throw new BadRequestException(
+          String.format(
+              "A file path must be given for the replacement of the robot comment on %s",
+              commentPath));
+    }
+  }
+
+  private static void ensureRangeIsSet(String commentPath, Range range) throws BadRequestException {
+    if (range == null) {
+      throw new BadRequestException(
+          String.format(
+              "A range must be given for the replacement of the robot comment on %s", commentPath));
+    }
+  }
+
+  private static void ensureRangeIsValid(String commentPath, Range range)
+      throws BadRequestException {
+    if (range == null) {
+      return;
+    }
+    if (!range.isValid()) {
+      throw new BadRequestException(
+          String.format(
+              "Range (%s:%s - %s:%s) is not valid for the comment on %s",
+              range.startLine,
+              range.startCharacter,
+              range.endLine,
+              range.endCharacter,
+              commentPath));
+    }
+  }
+
+  private static void ensureReplacementStringIsSet(String commentPath, String replacement)
+      throws BadRequestException {
+    if (replacement == null) {
+      throw new BadRequestException(
+          String.format(
+              "A content for replacement "
+                  + "must be indicated for the replacement of the robot comment on %s",
+              commentPath));
+    }
+  }
+
+  private static void ensureRangesDoNotOverlap(
+      String commentPath, List<FixReplacementInfo> fixReplacementInfos) throws BadRequestException {
+    List<Range> sortedRanges =
+        fixReplacementInfos.stream()
+            .map(fixReplacementInfo -> fixReplacementInfo.range)
+            .sorted()
+            .collect(toList());
+
+    int previousEndLine = 0;
+    int previousOffset = -1;
+    for (Range range : sortedRanges) {
+      if (range.startLine < previousEndLine
+          || (range.startLine == previousEndLine && range.startCharacter < previousOffset)) {
+        throw new BadRequestException(
+            String.format("Replacements overlap for the robot comment on %s", commentPath));
+      }
+      previousEndLine = range.endLine;
+      previousOffset = range.endCharacter;
+    }
+  }
+
+  /** Used to compare Comments with CommentInput comments. */
+  @AutoValue
+  abstract static class CommentSetEntry {
+    private static CommentSetEntry create(
+        String filename,
+        int patchSetId,
+        Integer line,
+        Side side,
+        HashCode message,
+        Comment.Range range) {
+      return new AutoValue_PostReview_CommentSetEntry(
+          filename, patchSetId, line, side, message, range);
+    }
+
+    public static CommentSetEntry create(Comment comment) {
+      return create(
+          comment.key.filename,
+          comment.key.patchSetId,
+          comment.lineNbr,
+          Side.fromShort(comment.side),
+          Hashing.murmur3_128().hashString(comment.message, UTF_8),
+          comment.range);
+    }
+
+    abstract String filename();
+
+    abstract int patchSetId();
+
+    @Nullable
+    abstract Integer line();
+
+    abstract Side side();
+
+    abstract HashCode message();
+
+    @Nullable
+    abstract Comment.Range range();
+  }
+
+  private class Op implements BatchUpdateOp {
+    private final ProjectState projectState;
+    private final PatchSet.Id psId;
+    private final ReviewInput in;
+    private final ListMultimap<RecipientType, Account.Id> accountsToNotify;
+
+    private IdentifiedUser user;
+    private ChangeNotes notes;
+    private PatchSet ps;
+    private ChangeMessage message;
+    private List<Comment> comments = new ArrayList<>();
+    private List<LabelVote> labelDelta = new ArrayList<>();
+    private Map<String, Short> approvals = new HashMap<>();
+    private Map<String, Short> oldApprovals = new HashMap<>();
+
+    private Op(
+        ProjectState projectState,
+        PatchSet.Id psId,
+        ReviewInput in,
+        ListMultimap<RecipientType, Account.Id> accountsToNotify) {
+      this.projectState = projectState;
+      this.psId = psId;
+      this.in = in;
+      this.accountsToNotify = requireNonNull(accountsToNotify);
+    }
+
+    @Override
+    public boolean updateChange(ChangeContext ctx)
+        throws OrmException, ResourceConflictException, UnprocessableEntityException, IOException,
+            PatchListNotAvailableException {
+      user = ctx.getIdentifiedUser();
+      notes = ctx.getNotes();
+      ps = psUtil.get(ctx.getDb(), ctx.getNotes(), psId);
+      boolean dirty = false;
+      dirty |= insertComments(ctx);
+      dirty |= insertRobotComments(ctx);
+      dirty |= updateLabels(projectState, ctx);
+      dirty |= insertMessage(ctx);
+      return dirty;
+    }
+
+    @Override
+    public void postUpdate(Context ctx) throws OrmException {
+      if (message == null) {
+        return;
+      }
+      if (in.notify.compareTo(NotifyHandling.NONE) > 0 || !accountsToNotify.isEmpty()) {
+        email
+            .create(
+                in.notify,
+                accountsToNotify,
+                notes,
+                ps,
+                user,
+                message,
+                comments,
+                in.message,
+                labelDelta)
+            .sendAsync();
+      }
+      commentAdded.fire(
+          notes.getChange(),
+          ps,
+          user.state(),
+          message.getMessage(),
+          approvals,
+          oldApprovals,
+          ctx.getWhen());
+    }
+
+    private boolean insertComments(ChangeContext ctx)
+        throws OrmException, UnprocessableEntityException, PatchListNotAvailableException {
+      Map<String, List<CommentInput>> map = in.comments;
+      if (map == null) {
+        map = Collections.emptyMap();
+      }
+
+      Map<String, Comment> drafts = Collections.emptyMap();
+      if (!map.isEmpty() || in.drafts != DraftHandling.KEEP) {
+        if (in.drafts == DraftHandling.PUBLISH_ALL_REVISIONS) {
+          drafts = changeDrafts(ctx);
+        } else {
+          drafts = patchSetDrafts(ctx);
+        }
+      }
+
+      List<Comment> toPublish = new ArrayList<>();
+
+      Set<CommentSetEntry> existingIds =
+          in.omitDuplicateComments ? readExistingComments(ctx) : Collections.emptySet();
+
+      for (Map.Entry<String, List<CommentInput>> ent : map.entrySet()) {
+        String path = ent.getKey();
+        for (CommentInput c : ent.getValue()) {
+          String parent = Url.decode(c.inReplyTo);
+          Comment e = drafts.remove(Url.decode(c.id));
+          if (e == null) {
+            e = commentsUtil.newComment(ctx, path, psId, c.side(), c.message, c.unresolved, parent);
+          } else {
+            e.writtenOn = ctx.getWhen();
+            e.side = c.side();
+            e.message = c.message;
+          }
+
+          setCommentRevId(e, patchListCache, ctx.getChange(), ps);
+          e.setLineNbrAndRange(c.line, c.range);
+          e.tag = in.tag;
+
+          if (existingIds.contains(CommentSetEntry.create(e))) {
+            continue;
+          }
+          toPublish.add(e);
+        }
+      }
+
+      switch (in.drafts) {
+        case PUBLISH:
+        case PUBLISH_ALL_REVISIONS:
+          publishCommentUtil.publish(ctx, psId, drafts.values(), in.tag);
+          comments.addAll(drafts.values());
+          break;
+        case KEEP:
+        default:
+          break;
+      }
+      ChangeUpdate u = ctx.getUpdate(psId);
+      commentsUtil.putComments(ctx.getDb(), u, Status.PUBLISHED, toPublish);
+      comments.addAll(toPublish);
+      return !toPublish.isEmpty();
+    }
+
+    private boolean insertRobotComments(ChangeContext ctx)
+        throws OrmException, PatchListNotAvailableException {
+      if (in.robotComments == null) {
+        return false;
+      }
+
+      List<RobotComment> newRobotComments = getNewRobotComments(ctx);
+      commentsUtil.putRobotComments(ctx.getUpdate(psId), newRobotComments);
+      comments.addAll(newRobotComments);
+      return !newRobotComments.isEmpty();
+    }
+
+    private List<RobotComment> getNewRobotComments(ChangeContext ctx)
+        throws OrmException, PatchListNotAvailableException {
+      List<RobotComment> toAdd = new ArrayList<>(in.robotComments.size());
+
+      Set<CommentSetEntry> existingIds =
+          in.omitDuplicateComments ? readExistingRobotComments(ctx) : Collections.emptySet();
+
+      for (Map.Entry<String, List<RobotCommentInput>> ent : in.robotComments.entrySet()) {
+        String path = ent.getKey();
+        for (RobotCommentInput c : ent.getValue()) {
+          RobotComment e = createRobotCommentFromInput(ctx, path, c);
+          if (existingIds.contains(CommentSetEntry.create(e))) {
+            continue;
+          }
+          toAdd.add(e);
+        }
+      }
+      return toAdd;
+    }
+
+    private RobotComment createRobotCommentFromInput(
+        ChangeContext ctx, String path, RobotCommentInput robotCommentInput)
+        throws PatchListNotAvailableException {
+      RobotComment robotComment =
+          commentsUtil.newRobotComment(
+              ctx,
+              path,
+              psId,
+              robotCommentInput.side(),
+              robotCommentInput.message,
+              robotCommentInput.robotId,
+              robotCommentInput.robotRunId);
+      robotComment.parentUuid = Url.decode(robotCommentInput.inReplyTo);
+      robotComment.url = robotCommentInput.url;
+      robotComment.properties = robotCommentInput.properties;
+      robotComment.setLineNbrAndRange(robotCommentInput.line, robotCommentInput.range);
+      robotComment.tag = in.tag;
+      setCommentRevId(robotComment, patchListCache, ctx.getChange(), ps);
+      robotComment.fixSuggestions = createFixSuggestionsFromInput(robotCommentInput.fixSuggestions);
+      return robotComment;
+    }
+
+    private List<FixSuggestion> createFixSuggestionsFromInput(
+        List<FixSuggestionInfo> fixSuggestionInfos) {
+      if (fixSuggestionInfos == null) {
+        return Collections.emptyList();
+      }
+
+      List<FixSuggestion> fixSuggestions = new ArrayList<>(fixSuggestionInfos.size());
+      for (FixSuggestionInfo fixSuggestionInfo : fixSuggestionInfos) {
+        fixSuggestions.add(createFixSuggestionFromInput(fixSuggestionInfo));
+      }
+      return fixSuggestions;
+    }
+
+    private FixSuggestion createFixSuggestionFromInput(FixSuggestionInfo fixSuggestionInfo) {
+      List<FixReplacement> fixReplacements = toFixReplacements(fixSuggestionInfo.replacements);
+      String fixId = ChangeUtil.messageUuid();
+      return new FixSuggestion(fixId, fixSuggestionInfo.description, fixReplacements);
+    }
+
+    private List<FixReplacement> toFixReplacements(List<FixReplacementInfo> fixReplacementInfos) {
+      return fixReplacementInfos.stream().map(this::toFixReplacement).collect(toList());
+    }
+
+    private FixReplacement toFixReplacement(FixReplacementInfo fixReplacementInfo) {
+      Comment.Range range = new Comment.Range(fixReplacementInfo.range);
+      return new FixReplacement(fixReplacementInfo.path, range, fixReplacementInfo.replacement);
+    }
+
+    private Set<CommentSetEntry> readExistingComments(ChangeContext ctx) throws OrmException {
+      return commentsUtil.publishedByChange(ctx.getDb(), ctx.getNotes()).stream()
+          .map(CommentSetEntry::create)
+          .collect(toSet());
+    }
+
+    private Set<CommentSetEntry> readExistingRobotComments(ChangeContext ctx) throws OrmException {
+      return commentsUtil.robotCommentsByChange(ctx.getNotes()).stream()
+          .map(CommentSetEntry::create)
+          .collect(toSet());
+    }
+
+    private Map<String, Comment> changeDrafts(ChangeContext ctx) throws OrmException {
+      Map<String, Comment> drafts = new HashMap<>();
+      for (Comment c :
+          commentsUtil.draftByChangeAuthor(ctx.getDb(), ctx.getNotes(), user.getAccountId())) {
+        c.tag = in.tag;
+        drafts.put(c.key.uuid, c);
+      }
+      return drafts;
+    }
+
+    private Map<String, Comment> patchSetDrafts(ChangeContext ctx) throws OrmException {
+      Map<String, Comment> drafts = new HashMap<>();
+      for (Comment c :
+          commentsUtil.draftByPatchSetAuthor(
+              ctx.getDb(), psId, user.getAccountId(), ctx.getNotes())) {
+        drafts.put(c.key.uuid, c);
+      }
+      return drafts;
+    }
+
+    private Map<String, Short> approvalsByKey(Collection<PatchSetApproval> patchsetApprovals) {
+      Map<String, Short> labels = new HashMap<>();
+      for (PatchSetApproval psa : patchsetApprovals) {
+        labels.put(psa.getLabel(), psa.getValue());
+      }
+      return labels;
+    }
+
+    private Map<String, Short> getAllApprovals(
+        LabelTypes labelTypes, Map<String, Short> current, Map<String, Short> input) {
+      Map<String, Short> allApprovals = new HashMap<>();
+      for (LabelType lt : labelTypes.getLabelTypes()) {
+        allApprovals.put(lt.getName(), (short) 0);
+      }
+      // set approvals to existing votes
+      if (current != null) {
+        allApprovals.putAll(current);
+      }
+      // set approvals to new votes
+      if (input != null) {
+        allApprovals.putAll(input);
+      }
+      return allApprovals;
+    }
+
+    private Map<String, Short> getPreviousApprovals(
+        Map<String, Short> allApprovals, Map<String, Short> current) {
+      Map<String, Short> previous = new HashMap<>();
+      for (Map.Entry<String, Short> approval : allApprovals.entrySet()) {
+        // assume vote is 0 if there is no vote
+        if (!current.containsKey(approval.getKey())) {
+          previous.put(approval.getKey(), (short) 0);
+        } else {
+          previous.put(approval.getKey(), current.get(approval.getKey()));
+        }
+      }
+      return previous;
+    }
+
+    private boolean isReviewer(ChangeContext ctx) throws OrmException {
+      if (ctx.getAccountId().equals(ctx.getChange().getOwner())) {
+        return true;
+      }
+      ChangeData cd = changeDataFactory.create(db.get(), ctx.getNotes());
+      ReviewerSet reviewers = cd.reviewers();
+      if (reviewers.byState(REVIEWER).contains(ctx.getAccountId())) {
+        return true;
+      }
+      return false;
+    }
+
+    private boolean updateLabels(ProjectState projectState, ChangeContext ctx)
+        throws OrmException, ResourceConflictException, IOException {
+      Map<String, Short> inLabels = firstNonNull(in.labels, Collections.emptyMap());
+
+      // If no labels were modified and change is closed, abort early.
+      // This avoids trying to record a modified label caused by a user
+      // losing access to a label after the change was submitted.
+      if (inLabels.isEmpty() && ctx.getChange().getStatus().isClosed()) {
+        return false;
+      }
+
+      List<PatchSetApproval> del = new ArrayList<>();
+      List<PatchSetApproval> ups = new ArrayList<>();
+      Map<String, PatchSetApproval> current = scanLabels(projectState, ctx, del);
+      LabelTypes labelTypes = projectState.getLabelTypes(ctx.getNotes());
+      Map<String, Short> allApprovals =
+          getAllApprovals(labelTypes, approvalsByKey(current.values()), inLabels);
+      Map<String, Short> previous =
+          getPreviousApprovals(allApprovals, approvalsByKey(current.values()));
+
+      ChangeUpdate update = ctx.getUpdate(psId);
+      for (Map.Entry<String, Short> ent : allApprovals.entrySet()) {
+        String name = ent.getKey();
+        LabelType lt = requireNonNull(labelTypes.byLabel(name), name);
+
+        PatchSetApproval c = current.remove(lt.getName());
+        String normName = lt.getName();
+        approvals.put(normName, (short) 0);
+        if (ent.getValue() == null || ent.getValue() == 0) {
+          // User requested delete of this label.
+          oldApprovals.put(normName, null);
+          if (c != null) {
+            if (c.getValue() != 0) {
+              addLabelDelta(normName, (short) 0);
+              oldApprovals.put(normName, previous.get(normName));
+            }
+            del.add(c);
+            update.putApproval(normName, (short) 0);
+          }
+        } else if (c != null && c.getValue() != ent.getValue()) {
+          c.setValue(ent.getValue());
+          c.setGranted(ctx.getWhen());
+          c.setTag(in.tag);
+          ctx.getUser().updateRealAccountId(c::setRealAccountId);
+          ups.add(c);
+          addLabelDelta(normName, c.getValue());
+          oldApprovals.put(normName, previous.get(normName));
+          approvals.put(normName, c.getValue());
+          update.putApproval(normName, ent.getValue());
+        } else if (c != null && c.getValue() == ent.getValue()) {
+          current.put(normName, c);
+          oldApprovals.put(normName, null);
+          approvals.put(normName, c.getValue());
+        } else if (c == null) {
+          c = ApprovalsUtil.newApproval(psId, user, lt.getLabelId(), ent.getValue(), ctx.getWhen());
+          c.setTag(in.tag);
+          c.setGranted(ctx.getWhen());
+          ups.add(c);
+          addLabelDelta(normName, c.getValue());
+          oldApprovals.put(normName, previous.get(normName));
+          approvals.put(normName, c.getValue());
+          update.putReviewer(user.getAccountId(), REVIEWER);
+          update.putApproval(normName, ent.getValue());
+        }
+      }
+
+      validatePostSubmitLabels(ctx, labelTypes, previous, ups, del);
+
+      // Return early if user is not a reviewer and not posting any labels.
+      // This allows us to preserve their CC status.
+      if (current.isEmpty() && del.isEmpty() && ups.isEmpty() && !isReviewer(ctx)) {
+        return false;
+      }
+
+      forceCallerAsReviewer(projectState, ctx, current, ups, del);
+
+      if (!del.isEmpty()) {
+        ctx.getDb().patchSetApprovals().delete(del);
+      }
+
+      if (!ups.isEmpty()) {
+        ctx.getDb().patchSetApprovals().upsert(ups);
+      }
+
+      return !del.isEmpty() || !ups.isEmpty();
+    }
+
+    private void validatePostSubmitLabels(
+        ChangeContext ctx,
+        LabelTypes labelTypes,
+        Map<String, Short> previous,
+        List<PatchSetApproval> ups,
+        List<PatchSetApproval> del)
+        throws ResourceConflictException {
+      if (ctx.getChange().getStatus().isOpen()) {
+        return; // Not closed, nothing to validate.
+      } else if (del.isEmpty() && ups.isEmpty()) {
+        return; // No new votes.
+      } else if (ctx.getChange().getStatus() != Change.Status.MERGED) {
+        throw new ResourceConflictException("change is closed");
+      }
+
+      // Disallow reducing votes on any labels post-submit. This assumes the
+      // high values were broadly necessary to submit, so reducing them would
+      // make it possible to take a merged change and make it no longer
+      // submittable.
+      List<PatchSetApproval> reduced = new ArrayList<>(ups.size() + del.size());
+      List<String> disallowed = new ArrayList<>(labelTypes.getLabelTypes().size());
+
+      for (PatchSetApproval psa : del) {
+        LabelType lt = requireNonNull(labelTypes.byLabel(psa.getLabel()));
+        String normName = lt.getName();
+        if (!lt.allowPostSubmit()) {
+          disallowed.add(normName);
+        }
+        Short prev = previous.get(normName);
+        if (prev != null && prev != 0) {
+          reduced.add(psa);
+        }
+      }
+
+      for (PatchSetApproval psa : ups) {
+        LabelType lt = requireNonNull(labelTypes.byLabel(psa.getLabel()));
+        String normName = lt.getName();
+        if (!lt.allowPostSubmit()) {
+          disallowed.add(normName);
+        }
+        Short prev = previous.get(normName);
+        if (prev == null) {
+          continue;
+        }
+        checkState(prev != psa.getValue()); // Should be filtered out above.
+        if (prev > psa.getValue()) {
+          reduced.add(psa);
+        } else {
+          // Set postSubmit bit in ReviewDb; not required for NoteDb, which sets
+          // it automatically.
+          psa.setPostSubmit(true);
+        }
+      }
+
+      if (!disallowed.isEmpty()) {
+        throw new ResourceConflictException(
+            "Voting on labels disallowed after submit: "
+                + disallowed.stream().distinct().sorted().collect(joining(", ")));
+      }
+      if (!reduced.isEmpty()) {
+        throw new ResourceConflictException(
+            "Cannot reduce vote on labels for closed change: "
+                + reduced.stream()
+                    .map(PatchSetApproval::getLabel)
+                    .distinct()
+                    .sorted()
+                    .collect(joining(", ")));
+      }
+    }
+
+    private void forceCallerAsReviewer(
+        ProjectState projectState,
+        ChangeContext ctx,
+        Map<String, PatchSetApproval> current,
+        List<PatchSetApproval> ups,
+        List<PatchSetApproval> del) {
+      if (current.isEmpty() && ups.isEmpty()) {
+        // TODO Find another way to link reviewers to changes.
+        if (del.isEmpty()) {
+          // If no existing label is being set to 0, hack in the caller
+          // as a reviewer by picking the first server-wide LabelType.
+          List<LabelType> labelTypes = projectState.getLabelTypes(ctx.getNotes()).getLabelTypes();
+          if (labelTypes.isEmpty()) {
+            logger.atWarning().log(
+                "no label type found for project %s, change %s",
+                projectState.getName(), ctx.getChange().getChangeId());
+            return;
+          }
+
+          LabelId labelId = labelTypes.get(0).getLabelId();
+          PatchSetApproval c = ApprovalsUtil.newApproval(psId, user, labelId, 0, ctx.getWhen());
+          c.setTag(in.tag);
+          c.setGranted(ctx.getWhen());
+          ups.add(c);
+        } else {
+          // Pick a random label that is about to be deleted and keep it.
+          Iterator<PatchSetApproval> i = del.iterator();
+          PatchSetApproval c = i.next();
+          c.setValue((short) 0);
+          c.setGranted(ctx.getWhen());
+          i.remove();
+          ups.add(c);
+        }
+      }
+      ctx.getUpdate(ctx.getChange().currentPatchSetId()).putReviewer(user.getAccountId(), REVIEWER);
+    }
+
+    private Map<String, PatchSetApproval> scanLabels(
+        ProjectState projectState, ChangeContext ctx, List<PatchSetApproval> del)
+        throws OrmException, IOException {
+      LabelTypes labelTypes = projectState.getLabelTypes(ctx.getNotes());
+      Map<String, PatchSetApproval> current = new HashMap<>();
+
+      for (PatchSetApproval a :
+          approvalsUtil.byPatchSetUser(
+              ctx.getDb(),
+              ctx.getNotes(),
+              psId,
+              user.getAccountId(),
+              ctx.getRevWalk(),
+              ctx.getRepoView().getConfig())) {
+        if (a.isLegacySubmit()) {
+          continue;
+        }
+
+        LabelType lt = labelTypes.byLabel(a.getLabelId());
+        if (lt != null) {
+          current.put(lt.getName(), a);
+        } else {
+          del.add(a);
+        }
+      }
+      return current;
+    }
+
+    private boolean insertMessage(ChangeContext ctx) throws OrmException {
+      String msg = Strings.nullToEmpty(in.message).trim();
+
+      StringBuilder buf = new StringBuilder();
+      for (LabelVote d : labelDelta) {
+        buf.append(" ").append(d.format());
+      }
+      if (comments.size() == 1) {
+        buf.append("\n\n(1 comment)");
+      } else if (comments.size() > 1) {
+        buf.append(String.format("\n\n(%d comments)", comments.size()));
+      }
+      if (!msg.isEmpty()) {
+        buf.append("\n\n").append(msg);
+      } else if (in.ready) {
+        buf.append("\n\n" + START_REVIEW_MESSAGE);
+      }
+      if (buf.length() == 0) {
+        return false;
+      }
+
+      message =
+          ChangeMessagesUtil.newMessage(
+              psId, user, ctx.getWhen(), "Patch Set " + psId.get() + ":" + buf, in.tag);
+      cmUtil.addChangeMessage(ctx.getDb(), ctx.getUpdate(psId), message);
+      return true;
+    }
+
+    private void addLabelDelta(String name, short value) {
+      labelDelta.add(LabelVote.create(name, value));
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/PostReviewers.java b/java/com/google/gerrit/server/restapi/change/PostReviewers.java
new file mode 100644
index 0000000..3e66189
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/PostReviewers.java
@@ -0,0 +1,89 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.api.changes.AddReviewerInput;
+import com.google.gerrit.extensions.api.changes.AddReviewerResult;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.ReviewerAdder;
+import com.google.gerrit.server.change.ReviewerAdder.ReviewerAddition;
+import com.google.gerrit.server.change.ReviewerResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestCollectionModifyView;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class PostReviewers
+    extends RetryingRestCollectionModifyView<
+        ChangeResource, ReviewerResource, AddReviewerInput, AddReviewerResult> {
+
+  private final Provider<ReviewDb> dbProvider;
+  private final ChangeData.Factory changeDataFactory;
+  private final ReviewerAdder reviewerAdder;
+
+  @Inject
+  PostReviewers(
+      Provider<ReviewDb> db,
+      ChangeData.Factory changeDataFactory,
+      RetryHelper retryHelper,
+      ReviewerAdder reviewerAdder) {
+    super(retryHelper);
+    this.dbProvider = db;
+    this.changeDataFactory = changeDataFactory;
+    this.reviewerAdder = reviewerAdder;
+  }
+
+  @Override
+  protected AddReviewerResult applyImpl(
+      BatchUpdate.Factory updateFactory, ChangeResource rsrc, AddReviewerInput input)
+      throws IOException, OrmException, RestApiException, UpdateException,
+          PermissionBackendException, ConfigInvalidException {
+    if (input.reviewer == null) {
+      throw new BadRequestException("missing reviewer field");
+    }
+
+    ReviewerAddition addition =
+        reviewerAdder.prepare(dbProvider.get(), rsrc.getNotes(), rsrc.getUser(), input, true);
+    if (addition.op == null) {
+      return addition.result;
+    }
+    try (BatchUpdate bu =
+        updateFactory.create(
+            dbProvider.get(), rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
+      Change.Id id = rsrc.getChange().getId();
+      bu.addOp(id, addition.op);
+      bu.execute();
+    }
+
+    // Re-read change to take into account results of the update.
+    addition.gatherResults(
+        changeDataFactory.create(dbProvider.get(), rsrc.getProject(), rsrc.getId()));
+    return addition.result;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/PreviewSubmit.java b/java/com/google/gerrit/server/restapi/change/PreviewSubmit.java
new file mode 100644
index 0000000..18e86d1
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/PreviewSubmit.java
@@ -0,0 +1,194 @@
+// 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.
+
+package com.google.gerrit.server.restapi.change;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.api.changes.SubmitInput;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.BinaryResult;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.NotImplementedException;
+import com.google.gerrit.extensions.restapi.PreconditionFailedException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ChangeUtil;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.change.ArchiveFormat;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.ioutil.LimitedByteArrayOutputStream;
+import com.google.gerrit.server.ioutil.LimitedByteArrayOutputStream.LimitExceededException;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.NoSuchProjectException;
+import com.google.gerrit.server.submit.MergeOp;
+import com.google.gerrit.server.submit.MergeOpRepoManager;
+import com.google.gerrit.server.submit.MergeOpRepoManager.OpenRepo;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Collection;
+import org.apache.commons.compress.archivers.ArchiveOutputStream;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.NullProgressMonitor;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.storage.pack.PackConfig;
+import org.eclipse.jgit.transport.BundleWriter;
+import org.eclipse.jgit.transport.ReceiveCommand;
+import org.kohsuke.args4j.Option;
+
+@Singleton
+public class PreviewSubmit implements RestReadView<RevisionResource> {
+  private static final int MAX_DEFAULT_BUNDLE_SIZE = 100 * 1024 * 1024;
+
+  private final Provider<ReviewDb> dbProvider;
+  private final Provider<MergeOp> mergeOpProvider;
+  private final AllowedFormats allowedFormats;
+  private int maxBundleSize;
+  private String format;
+
+  @Option(name = "--format")
+  public void setFormat(String f) {
+    this.format = f;
+  }
+
+  @Inject
+  PreviewSubmit(
+      Provider<ReviewDb> dbProvider,
+      Provider<MergeOp> mergeOpProvider,
+      AllowedFormats allowedFormats,
+      @GerritServerConfig Config cfg) {
+    this.dbProvider = dbProvider;
+    this.mergeOpProvider = mergeOpProvider;
+    this.allowedFormats = allowedFormats;
+    this.maxBundleSize = cfg.getInt("download", "maxBundleSize", MAX_DEFAULT_BUNDLE_SIZE);
+  }
+
+  @Override
+  public BinaryResult apply(RevisionResource rsrc)
+      throws OrmException, RestApiException, UpdateException, IOException, ConfigInvalidException,
+          PermissionBackendException {
+    if (Strings.isNullOrEmpty(format)) {
+      throw new BadRequestException("format is not specified");
+    }
+    ArchiveFormat f = allowedFormats.extensions.get("." + format);
+    if (f == null && format.equals("tgz")) {
+      // Always allow tgz, even when the allowedFormats doesn't contain it.
+      // Then we allow at least one format even if the list of allowed
+      // formats is empty.
+      f = ArchiveFormat.TGZ;
+    }
+    if (f == null) {
+      throw new BadRequestException("unknown archive format");
+    }
+
+    Change change = rsrc.getChange();
+    if (!change.getStatus().isOpen()) {
+      throw new PreconditionFailedException("change is " + ChangeUtil.status(change));
+    }
+    if (!rsrc.getUser().isIdentifiedUser()) {
+      throw new MethodNotAllowedException("Anonymous users cannot submit");
+    }
+
+    return getBundles(rsrc, f);
+  }
+
+  private BinaryResult getBundles(RevisionResource rsrc, ArchiveFormat f)
+      throws OrmException, RestApiException, UpdateException, IOException, ConfigInvalidException,
+          PermissionBackendException {
+    ReviewDb db = dbProvider.get();
+    IdentifiedUser caller = rsrc.getUser().asIdentifiedUser();
+    Change change = rsrc.getChange();
+
+    @SuppressWarnings("resource") // Returned BinaryResult takes ownership and handles closing.
+    MergeOp op = mergeOpProvider.get();
+    try {
+      op.merge(db, change, caller, false, new SubmitInput(), true);
+      BinaryResult bin = new SubmitPreviewResult(op, f, maxBundleSize);
+      bin.disableGzip()
+          .setContentType(f.getMimeType())
+          .setAttachmentName("submit-preview-" + change.getChangeId() + "." + format);
+      return bin;
+    } catch (OrmException
+        | RestApiException
+        | UpdateException
+        | IOException
+        | ConfigInvalidException
+        | RuntimeException
+        | PermissionBackendException e) {
+      op.close();
+      throw e;
+    }
+  }
+
+  private static class SubmitPreviewResult extends BinaryResult {
+
+    private final MergeOp mergeOp;
+    private final ArchiveFormat archiveFormat;
+    private final int maxBundleSize;
+
+    private SubmitPreviewResult(MergeOp mergeOp, ArchiveFormat archiveFormat, int maxBundleSize) {
+      this.mergeOp = mergeOp;
+      this.archiveFormat = archiveFormat;
+      this.maxBundleSize = maxBundleSize;
+    }
+
+    @Override
+    public void writeTo(OutputStream out) throws IOException {
+      try (ArchiveOutputStream aos = archiveFormat.createArchiveOutputStream(out)) {
+        MergeOpRepoManager orm = mergeOp.getMergeOpRepoManager();
+        for (Project.NameKey p : mergeOp.getAllProjects()) {
+          OpenRepo or = orm.getRepo(p);
+          BundleWriter bw = new BundleWriter(or.getCodeReviewRevWalk().getObjectReader());
+          bw.setObjectCountCallback(null);
+          bw.setPackConfig(new PackConfig(or.getRepo()));
+          Collection<ReceiveCommand> refs = or.getUpdate().getRefUpdates().values();
+          for (ReceiveCommand r : refs) {
+            bw.include(r.getRefName(), r.getNewId());
+            ObjectId oldId = r.getOldId();
+            if (!oldId.equals(ObjectId.zeroId())
+                // Probably the client doesn't already have NoteDb data.
+                && !RefNames.isNoteDbMetaRef(r.getRefName())) {
+              bw.assume(or.getCodeReviewRevWalk().parseCommit(oldId));
+            }
+          }
+          LimitedByteArrayOutputStream bos = new LimitedByteArrayOutputStream(maxBundleSize, 1024);
+          bw.writeBundle(NullProgressMonitor.INSTANCE, bos);
+          // This naming scheme cannot produce directory/file conflicts
+          // as no projects contains ".git/":
+          String path = p.get() + ".git";
+          archiveFormat.putEntry(aos, path, bos.toByteArray());
+        }
+      } catch (LimitExceededException e) {
+        throw new NotImplementedException("The bundle is too big to generate at the server");
+      } catch (NoSuchProjectException e) {
+        throw new IOException(e);
+      }
+    }
+
+    @Override
+    public void close() throws IOException {
+      mergeOp.close();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/PublishChangeEdit.java b/java/com/google/gerrit/server/restapi/change/PublishChangeEdit.java
new file mode 100644
index 0000000..3d401c4
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/PublishChangeEdit.java
@@ -0,0 +1,80 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.api.changes.PublishChangeEditInput;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.NotifyUtil;
+import com.google.gerrit.server.edit.ChangeEdit;
+import com.google.gerrit.server.edit.ChangeEditUtil;
+import com.google.gerrit.server.project.ContributorAgreementsChecker;
+import com.google.gerrit.server.project.NoSuchProjectException;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestModifyView;
+import com.google.gerrit.server.update.UpdateException;
+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 org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class PublishChangeEdit
+    extends RetryingRestModifyView<ChangeResource, PublishChangeEditInput, Response<?>> {
+  private final ChangeEditUtil editUtil;
+  private final NotifyUtil notifyUtil;
+  private final ContributorAgreementsChecker contributorAgreementsChecker;
+
+  @Inject
+  PublishChangeEdit(
+      RetryHelper retryHelper,
+      ChangeEditUtil editUtil,
+      NotifyUtil notifyUtil,
+      ContributorAgreementsChecker contributorAgreementsChecker) {
+    super(retryHelper);
+    this.editUtil = editUtil;
+    this.notifyUtil = notifyUtil;
+    this.contributorAgreementsChecker = contributorAgreementsChecker;
+  }
+
+  @Override
+  protected Response<?> applyImpl(
+      BatchUpdate.Factory updateFactory, ChangeResource rsrc, PublishChangeEditInput in)
+      throws IOException, OrmException, RestApiException, UpdateException, ConfigInvalidException,
+          NoSuchProjectException {
+    contributorAgreementsChecker.check(rsrc.getProject(), rsrc.getUser());
+    Optional<ChangeEdit> edit = editUtil.byChange(rsrc.getNotes(), rsrc.getUser());
+    if (!edit.isPresent()) {
+      throw new ResourceConflictException(
+          String.format("no edit exists for change %s", rsrc.getChange().getChangeId()));
+    }
+    if (in == null) {
+      in = new PublishChangeEditInput();
+    }
+    editUtil.publish(
+        updateFactory,
+        rsrc.getNotes(),
+        rsrc.getUser(),
+        edit.get(),
+        in.notify,
+        notifyUtil.resolveAccounts(in.notifyDetails));
+    return Response.none();
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/PutAssignee.java b/java/com/google/gerrit/server/restapi/change/PutAssignee.java
new file mode 100644
index 0000000..7878ce5
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/PutAssignee.java
@@ -0,0 +1,136 @@
+// 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.
+
+package com.google.gerrit.server.restapi.change;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.api.changes.AddReviewerInput;
+import com.google.gerrit.extensions.api.changes.AssigneeInput;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.client.ReviewerState;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.extensions.webui.UiAction;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountLoader;
+import com.google.gerrit.server.account.AccountResolver;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.ReviewerAdder;
+import com.google.gerrit.server.change.ReviewerAdder.ReviewerAddition;
+import com.google.gerrit.server.change.SetAssigneeOp;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestModifyView;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class PutAssignee extends RetryingRestModifyView<ChangeResource, AssigneeInput, AccountInfo>
+    implements UiAction<ChangeResource> {
+
+  private final AccountResolver accountResolver;
+  private final SetAssigneeOp.Factory assigneeFactory;
+  private final Provider<ReviewDb> db;
+  private final ReviewerAdder reviewerAdder;
+  private final AccountLoader.Factory accountLoaderFactory;
+  private final PermissionBackend permissionBackend;
+
+  @Inject
+  PutAssignee(
+      AccountResolver accountResolver,
+      SetAssigneeOp.Factory assigneeFactory,
+      RetryHelper retryHelper,
+      Provider<ReviewDb> db,
+      ReviewerAdder reviewerAdder,
+      AccountLoader.Factory accountLoaderFactory,
+      PermissionBackend permissionBackend) {
+    super(retryHelper);
+    this.accountResolver = accountResolver;
+    this.assigneeFactory = assigneeFactory;
+    this.db = db;
+    this.reviewerAdder = reviewerAdder;
+    this.accountLoaderFactory = accountLoaderFactory;
+    this.permissionBackend = permissionBackend;
+  }
+
+  @Override
+  protected AccountInfo applyImpl(
+      BatchUpdate.Factory updateFactory, ChangeResource rsrc, AssigneeInput input)
+      throws RestApiException, UpdateException, OrmException, IOException,
+          PermissionBackendException, ConfigInvalidException {
+    rsrc.permissions().check(ChangePermission.EDIT_ASSIGNEE);
+
+    input.assignee = Strings.nullToEmpty(input.assignee).trim();
+    if (input.assignee.isEmpty()) {
+      throw new BadRequestException("missing assignee field");
+    }
+
+    IdentifiedUser assignee = accountResolver.parse(input.assignee);
+    if (!assignee.getAccount().isActive()) {
+      throw new UnprocessableEntityException(input.assignee + " is not active");
+    }
+    try {
+      permissionBackend
+          .absentUser(assignee.getAccountId())
+          .database(db)
+          .change(rsrc.getNotes())
+          .check(ChangePermission.READ);
+    } catch (AuthException e) {
+      throw new AuthException("read not permitted for " + input.assignee);
+    }
+
+    try (BatchUpdate bu =
+        updateFactory.create(
+            db.get(), rsrc.getChange().getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
+      SetAssigneeOp op = assigneeFactory.create(assignee);
+      bu.addOp(rsrc.getId(), op);
+
+      ReviewerAddition reviewersAddition = addAssigneeAsCC(rsrc, input.assignee);
+      bu.addOp(rsrc.getId(), reviewersAddition.op);
+
+      bu.execute();
+      return accountLoaderFactory.create(true).fillOne(assignee.getAccountId());
+    }
+  }
+
+  private ReviewerAddition addAssigneeAsCC(ChangeResource rsrc, String assignee)
+      throws OrmException, IOException, PermissionBackendException, ConfigInvalidException {
+    AddReviewerInput reviewerInput = new AddReviewerInput();
+    reviewerInput.reviewer = assignee;
+    reviewerInput.state = ReviewerState.CC;
+    reviewerInput.confirmed = true;
+    reviewerInput.notify = NotifyHandling.NONE;
+    return reviewerAdder.prepare(db.get(), rsrc.getNotes(), rsrc.getUser(), reviewerInput, false);
+  }
+
+  @Override
+  public UiAction.Description getDescription(ChangeResource rsrc) {
+    return new UiAction.Description()
+        .setLabel("Edit Assignee")
+        .setVisible(rsrc.permissions().testCond(ChangePermission.EDIT_ASSIGNEE));
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/PutDescription.java b/java/com/google/gerrit/server/restapi/change/PutDescription.java
new file mode 100644
index 0000000..3b5edb2
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/PutDescription.java
@@ -0,0 +1,131 @@
+// 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.
+
+package com.google.gerrit.server.restapi.change;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.common.DescriptionInput;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.webui.UiAction;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestModifyView;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.Collections;
+
+@Singleton
+public class PutDescription
+    extends RetryingRestModifyView<RevisionResource, DescriptionInput, Response<String>>
+    implements UiAction<RevisionResource> {
+  private final Provider<ReviewDb> dbProvider;
+  private final ChangeMessagesUtil cmUtil;
+  private final PatchSetUtil psUtil;
+
+  @Inject
+  PutDescription(
+      Provider<ReviewDb> dbProvider,
+      ChangeMessagesUtil cmUtil,
+      RetryHelper retryHelper,
+      PatchSetUtil psUtil) {
+    super(retryHelper);
+    this.dbProvider = dbProvider;
+    this.cmUtil = cmUtil;
+    this.psUtil = psUtil;
+  }
+
+  @Override
+  protected Response<String> applyImpl(
+      BatchUpdate.Factory updateFactory, RevisionResource rsrc, DescriptionInput input)
+      throws UpdateException, RestApiException, PermissionBackendException {
+    rsrc.permissions().check(ChangePermission.EDIT_DESCRIPTION);
+
+    Op op = new Op(input != null ? input : new DescriptionInput(), rsrc.getPatchSet().getId());
+    try (BatchUpdate u =
+        updateFactory.create(
+            dbProvider.get(), rsrc.getChange().getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
+      u.addOp(rsrc.getChange().getId(), op);
+      u.execute();
+    }
+    return Strings.isNullOrEmpty(op.newDescription)
+        ? Response.none()
+        : Response.ok(op.newDescription);
+  }
+
+  private class Op implements BatchUpdateOp {
+    private final DescriptionInput input;
+    private final PatchSet.Id psId;
+
+    private String oldDescription;
+    private String newDescription;
+
+    Op(DescriptionInput input, PatchSet.Id psId) {
+      this.input = input;
+      this.psId = psId;
+    }
+
+    @Override
+    public boolean updateChange(ChangeContext ctx) throws OrmException {
+      PatchSet ps = psUtil.get(ctx.getDb(), ctx.getNotes(), psId);
+      ChangeUpdate update = ctx.getUpdate(psId);
+      newDescription = Strings.nullToEmpty(input.description);
+      oldDescription = Strings.nullToEmpty(ps.getDescription());
+      if (oldDescription.equals(newDescription)) {
+        return false;
+      }
+      String summary;
+      if (oldDescription.isEmpty()) {
+        summary = "Description set to \"" + newDescription + "\"";
+      } else if (newDescription.isEmpty()) {
+        summary = "Description \"" + oldDescription + "\" removed";
+      } else {
+        summary = "Description changed to \"" + newDescription + "\"";
+      }
+
+      ps.setDescription(newDescription);
+      update.setPsDescription(newDescription);
+
+      ctx.getDb().patchSets().update(Collections.singleton(ps));
+
+      ChangeMessage cmsg =
+          ChangeMessagesUtil.newMessage(
+              psId, ctx.getUser(), ctx.getWhen(), summary, ChangeMessagesUtil.TAG_SET_DESCRIPTION);
+      cmUtil.addChangeMessage(ctx.getDb(), update, cmsg);
+      return true;
+    }
+  }
+
+  @Override
+  public UiAction.Description getDescription(RevisionResource rsrc) {
+    return new UiAction.Description()
+        .setLabel("Edit Description")
+        .setVisible(rsrc.permissions().testCond(ChangePermission.EDIT_DESCRIPTION));
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/PutDraftComment.java b/java/com/google/gerrit/server/restapi/change/PutDraftComment.java
new file mode 100644
index 0000000..72358bd
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/PutDraftComment.java
@@ -0,0 +1,177 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.change;
+
+import static com.google.gerrit.server.CommentsUtil.setCommentRevId;
+
+import com.google.gerrit.extensions.api.changes.DraftInput;
+import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.Url;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.PatchLineComment.Status;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.change.DraftCommentResource;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.server.patch.PatchListCache;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestModifyView;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.sql.Timestamp;
+import java.util.Collections;
+import java.util.Optional;
+
+@Singleton
+public class PutDraftComment
+    extends RetryingRestModifyView<DraftCommentResource, DraftInput, Response<CommentInfo>> {
+
+  private final Provider<ReviewDb> db;
+  private final DeleteDraftComment delete;
+  private final CommentsUtil commentsUtil;
+  private final PatchSetUtil psUtil;
+  private final Provider<CommentJson> commentJson;
+  private final PatchListCache patchListCache;
+
+  @Inject
+  PutDraftComment(
+      Provider<ReviewDb> db,
+      DeleteDraftComment delete,
+      CommentsUtil commentsUtil,
+      PatchSetUtil psUtil,
+      RetryHelper retryHelper,
+      Provider<CommentJson> commentJson,
+      PatchListCache patchListCache) {
+    super(retryHelper);
+    this.db = db;
+    this.delete = delete;
+    this.commentsUtil = commentsUtil;
+    this.psUtil = psUtil;
+    this.commentJson = commentJson;
+    this.patchListCache = patchListCache;
+  }
+
+  @Override
+  protected Response<CommentInfo> applyImpl(
+      BatchUpdate.Factory updateFactory, DraftCommentResource rsrc, DraftInput in)
+      throws RestApiException, UpdateException, OrmException, PermissionBackendException {
+    if (in == null || in.message == null || in.message.trim().isEmpty()) {
+      return delete.applyImpl(updateFactory, rsrc, null);
+    } else if (in.id != null && !rsrc.getId().equals(in.id)) {
+      throw new BadRequestException("id must match URL");
+    } else if (in.line != null && in.line < 0) {
+      throw new BadRequestException("line must be >= 0");
+    } else if (in.line != null && in.range != null && in.line != in.range.endLine) {
+      throw new BadRequestException("range endLine must be on the same line as the comment");
+    }
+
+    try (BatchUpdate bu =
+        updateFactory.create(
+            db.get(), rsrc.getChange().getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
+      Op op = new Op(rsrc.getComment().key, in);
+      bu.addOp(rsrc.getChange().getId(), op);
+      bu.execute();
+      return Response.ok(
+          commentJson.get().setFillAccounts(false).newCommentFormatter().format(op.comment));
+    }
+  }
+
+  private class Op implements BatchUpdateOp {
+    private final Comment.Key key;
+    private final DraftInput in;
+
+    private Comment comment;
+
+    private Op(Comment.Key key, DraftInput in) {
+      this.key = key;
+      this.in = in;
+    }
+
+    @Override
+    public boolean updateChange(ChangeContext ctx)
+        throws ResourceNotFoundException, OrmException, PatchListNotAvailableException {
+      Optional<Comment> maybeComment =
+          commentsUtil.getDraft(ctx.getDb(), ctx.getNotes(), ctx.getIdentifiedUser(), key);
+      if (!maybeComment.isPresent()) {
+        // Disappeared out from under us. Can't easily fall back to insert,
+        // because the input might be missing required fields. Just give up.
+        throw new ResourceNotFoundException("comment not found: " + key);
+      }
+      Comment origComment = maybeComment.get();
+      comment = new Comment(origComment);
+      // Copy constructor preserved old real author; replace with current real
+      // user.
+      ctx.getUser().updateRealAccountId(comment::setRealAuthor);
+
+      PatchSet.Id psId = new PatchSet.Id(ctx.getChange().getId(), origComment.key.patchSetId);
+      ChangeUpdate update = ctx.getUpdate(psId);
+
+      PatchSet ps = psUtil.get(ctx.getDb(), ctx.getNotes(), psId);
+      if (ps == null) {
+        throw new ResourceNotFoundException("patch set not found: " + psId);
+      }
+      if (in.path != null && !in.path.equals(origComment.key.filename)) {
+        // Updating the path alters the primary key, which isn't possible.
+        // Delete then recreate the comment instead of an update.
+
+        commentsUtil.deleteComments(ctx.getDb(), update, Collections.singleton(origComment));
+        comment.key.filename = in.path;
+      }
+      setCommentRevId(comment, patchListCache, ctx.getChange(), ps);
+      commentsUtil.putComments(
+          ctx.getDb(),
+          update,
+          Status.DRAFT,
+          Collections.singleton(update(comment, in, ctx.getWhen())));
+      ctx.dontBumpLastUpdatedOn();
+      return true;
+    }
+  }
+
+  private static Comment update(Comment e, DraftInput in, Timestamp when) {
+    if (in.side != null) {
+      e.side = in.side();
+    }
+    if (in.inReplyTo != null) {
+      e.parentUuid = Url.decode(in.inReplyTo);
+    }
+    e.setLineNbrAndRange(in.line, in.range);
+    e.message = in.message.trim();
+    e.writtenOn = when;
+    if (in.tag != null) {
+      // TODO(dborowitz): Can we support changing tags via PUT?
+      e.tag = in.tag;
+    }
+    if (in.unresolved != null) {
+      e.unresolved = in.unresolved;
+    }
+    return e;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/PutMessage.java b/java/com/google/gerrit/server/restapi/change/PutMessage.java
new file mode 100644
index 0000000..bcd0e9e
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/PutMessage.java
@@ -0,0 +1,221 @@
+// Copyright (C) 2017 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.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.common.FooterConstants;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.common.CommitMessageInput;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ChangeUtil;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.NotifyUtil;
+import com.google.gerrit.server.change.PatchSetInserter;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestModifyView;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.CommitMessageUtil;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.List;
+import java.util.TimeZone;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+@Singleton
+public class PutMessage
+    extends RetryingRestModifyView<ChangeResource, CommitMessageInput, Response<?>> {
+
+  private final GitRepositoryManager repositoryManager;
+  private final Provider<CurrentUser> userProvider;
+  private final Provider<ReviewDb> db;
+  private final TimeZone tz;
+  private final PatchSetInserter.Factory psInserterFactory;
+  private final PermissionBackend permissionBackend;
+  private final PatchSetUtil psUtil;
+  private final NotifyUtil notifyUtil;
+  private final ProjectCache projectCache;
+
+  @Inject
+  PutMessage(
+      RetryHelper retryHelper,
+      GitRepositoryManager repositoryManager,
+      Provider<CurrentUser> userProvider,
+      Provider<ReviewDb> db,
+      PatchSetInserter.Factory psInserterFactory,
+      PermissionBackend permissionBackend,
+      @GerritPersonIdent PersonIdent gerritIdent,
+      PatchSetUtil psUtil,
+      NotifyUtil notifyUtil,
+      ProjectCache projectCache) {
+    super(retryHelper);
+    this.repositoryManager = repositoryManager;
+    this.userProvider = userProvider;
+    this.db = db;
+    this.psInserterFactory = psInserterFactory;
+    this.tz = gerritIdent.getTimeZone();
+    this.permissionBackend = permissionBackend;
+    this.psUtil = psUtil;
+    this.notifyUtil = notifyUtil;
+    this.projectCache = projectCache;
+  }
+
+  @Override
+  protected Response<String> applyImpl(
+      BatchUpdate.Factory updateFactory, ChangeResource resource, CommitMessageInput input)
+      throws IOException, RestApiException, UpdateException, PermissionBackendException,
+          OrmException, ConfigInvalidException {
+    PatchSet ps = psUtil.current(db.get(), resource.getNotes());
+    if (ps == null) {
+      throw new ResourceConflictException("current revision is missing");
+    }
+
+    if (input == null) {
+      throw new BadRequestException("input cannot be null");
+    }
+    String sanitizedCommitMessage = CommitMessageUtil.checkAndSanitizeCommitMessage(input.message);
+
+    ensureCanEditCommitMessage(resource.getNotes());
+    ensureChangeIdIsCorrect(
+        projectCache.checkedGet(resource.getProject()).is(BooleanProjectConfig.REQUIRE_CHANGE_ID),
+        resource.getChange().getKey().get(),
+        sanitizedCommitMessage);
+
+    NotifyHandling notify = input.notify;
+    if (notify == null) {
+      notify = resource.getChange().isWorkInProgress() ? NotifyHandling.OWNER : NotifyHandling.ALL;
+    }
+
+    try (Repository repository = repositoryManager.openRepository(resource.getProject());
+        RevWalk revWalk = new RevWalk(repository);
+        ObjectInserter objectInserter = repository.newObjectInserter()) {
+      RevCommit patchSetCommit = revWalk.parseCommit(ObjectId.fromString(ps.getRevision().get()));
+
+      String currentCommitMessage = patchSetCommit.getFullMessage();
+      if (input.message.equals(currentCommitMessage)) {
+        throw new ResourceConflictException("new and existing commit message are the same");
+      }
+
+      Timestamp ts = TimeUtil.nowTs();
+      try (BatchUpdate bu =
+          updateFactory.create(
+              db.get(), resource.getChange().getProject(), userProvider.get(), ts)) {
+        // Ensure that BatchUpdate will update the same repo
+        bu.setRepository(repository, new RevWalk(objectInserter.newReader()), objectInserter);
+
+        PatchSet.Id psId = ChangeUtil.nextPatchSetId(repository, ps.getId());
+        ObjectId newCommit =
+            createCommit(objectInserter, patchSetCommit, sanitizedCommitMessage, ts);
+        PatchSetInserter inserter = psInserterFactory.create(resource.getNotes(), psId, newCommit);
+        inserter.setMessage(
+            String.format("Patch Set %s: Commit message was updated.", psId.getId()));
+        inserter.setDescription("Edit commit message");
+        inserter.setNotify(notify);
+        inserter.setAccountsToNotify(notifyUtil.resolveAccounts(input.notifyDetails));
+        bu.addOp(resource.getChange().getId(), inserter);
+        bu.execute();
+      }
+    }
+    return Response.ok("ok");
+  }
+
+  private ObjectId createCommit(
+      ObjectInserter objectInserter,
+      RevCommit basePatchSetCommit,
+      String commitMessage,
+      Timestamp timestamp)
+      throws IOException {
+    CommitBuilder builder = new CommitBuilder();
+    builder.setTreeId(basePatchSetCommit.getTree());
+    builder.setParentIds(basePatchSetCommit.getParents());
+    builder.setAuthor(basePatchSetCommit.getAuthorIdent());
+    builder.setCommitter(userProvider.get().asIdentifiedUser().newCommitterIdent(timestamp, tz));
+    builder.setMessage(commitMessage);
+    ObjectId newCommitId = objectInserter.insert(builder);
+    objectInserter.flush();
+    return newCommitId;
+  }
+
+  private void ensureCanEditCommitMessage(ChangeNotes changeNotes)
+      throws AuthException, PermissionBackendException, IOException, ResourceConflictException,
+          OrmException {
+    if (!userProvider.get().isIdentifiedUser()) {
+      throw new AuthException("Authentication required");
+    }
+
+    // Not allowed to put message if the current patch set is locked.
+    psUtil.checkPatchSetNotLocked(changeNotes);
+    try {
+      permissionBackend
+          .user(userProvider.get())
+          .database(db.get())
+          .change(changeNotes)
+          .check(ChangePermission.ADD_PATCH_SET);
+      projectCache.checkedGet(changeNotes.getProjectName()).checkStatePermitsWrite();
+    } catch (AuthException denied) {
+      throw new AuthException("modifying commit message not permitted", denied);
+    }
+  }
+
+  private static void ensureChangeIdIsCorrect(
+      boolean requireChangeId, String currentChangeId, String newCommitMessage)
+      throws ResourceConflictException, BadRequestException {
+    RevCommit revCommit =
+        RevCommit.parse(
+            Constants.encode("tree " + ObjectId.zeroId().name() + "\n\n" + newCommitMessage));
+
+    // Check that the commit message without footers is not empty
+    CommitMessageUtil.checkAndSanitizeCommitMessage(revCommit.getShortMessage());
+
+    List<String> changeIdFooters = revCommit.getFooterLines(FooterConstants.CHANGE_ID);
+    if (requireChangeId && changeIdFooters.isEmpty()) {
+      throw new ResourceConflictException("missing Change-Id footer");
+    }
+    if (!changeIdFooters.isEmpty() && !changeIdFooters.get(0).equals(currentChangeId)) {
+      throw new ResourceConflictException("wrong Change-Id footer");
+    }
+    if (changeIdFooters.size() > 1) {
+      throw new ResourceConflictException("multiple Change-Id footers");
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/PutTopic.java b/java/com/google/gerrit/server/restapi/change/PutTopic.java
new file mode 100644
index 0000000..7f56c91
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/PutTopic.java
@@ -0,0 +1,144 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.change;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.api.changes.TopicInput;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.webui.UiAction;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.ChangeUtil;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.extensions.events.TopicEdited;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.Context;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestModifyView;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@Singleton
+public class PutTopic extends RetryingRestModifyView<ChangeResource, TopicInput, Response<String>>
+    implements UiAction<ChangeResource> {
+  private final Provider<ReviewDb> dbProvider;
+  private final ChangeMessagesUtil cmUtil;
+  private final TopicEdited topicEdited;
+
+  @Inject
+  PutTopic(
+      Provider<ReviewDb> dbProvider,
+      ChangeMessagesUtil cmUtil,
+      RetryHelper retryHelper,
+      TopicEdited topicEdited) {
+    super(retryHelper);
+    this.dbProvider = dbProvider;
+    this.cmUtil = cmUtil;
+    this.topicEdited = topicEdited;
+  }
+
+  @Override
+  protected Response<String> applyImpl(
+      BatchUpdate.Factory updateFactory, ChangeResource req, TopicInput input)
+      throws UpdateException, RestApiException, PermissionBackendException {
+    req.permissions().check(ChangePermission.EDIT_TOPIC_NAME);
+
+    if (input != null
+        && input.topic != null
+        && input.topic.length() > ChangeUtil.TOPIC_MAX_LENGTH) {
+      throw new BadRequestException(
+          String.format("topic length exceeds the limit (%s)", ChangeUtil.TOPIC_MAX_LENGTH));
+    }
+
+    TopicInput sanitizedInput = input == null ? new TopicInput() : input;
+    if (sanitizedInput.topic != null) {
+      sanitizedInput.topic = sanitizedInput.topic.trim();
+    }
+
+    Op op = new Op(sanitizedInput);
+    try (BatchUpdate u =
+        updateFactory.create(
+            dbProvider.get(), req.getChange().getProject(), req.getUser(), TimeUtil.nowTs())) {
+      u.addOp(req.getId(), op);
+      u.execute();
+    }
+    return Strings.isNullOrEmpty(op.newTopicName) ? Response.none() : Response.ok(op.newTopicName);
+  }
+
+  private class Op implements BatchUpdateOp {
+    private final TopicInput input;
+
+    private Change change;
+    private String oldTopicName;
+    private String newTopicName;
+
+    Op(TopicInput input) {
+      this.input = input;
+    }
+
+    @Override
+    public boolean updateChange(ChangeContext ctx) throws OrmException {
+      change = ctx.getChange();
+      ChangeUpdate update = ctx.getUpdate(change.currentPatchSetId());
+      newTopicName = Strings.nullToEmpty(input.topic);
+      oldTopicName = Strings.nullToEmpty(change.getTopic());
+      if (oldTopicName.equals(newTopicName)) {
+        return false;
+      }
+      String summary;
+      if (oldTopicName.isEmpty()) {
+        summary = "Topic set to " + newTopicName;
+      } else if (newTopicName.isEmpty()) {
+        summary = "Topic " + oldTopicName + " removed";
+      } else {
+        summary = String.format("Topic changed from %s to %s", oldTopicName, newTopicName);
+      }
+      change.setTopic(Strings.emptyToNull(newTopicName));
+      update.setTopic(change.getTopic());
+
+      ChangeMessage cmsg =
+          ChangeMessagesUtil.newMessage(ctx, summary, ChangeMessagesUtil.TAG_SET_TOPIC);
+      cmUtil.addChangeMessage(ctx.getDb(), update, cmsg);
+      return true;
+    }
+
+    @Override
+    public void postUpdate(Context ctx) {
+      if (change != null) {
+        topicEdited.fire(change, ctx.getAccount(), oldTopicName, ctx.getWhen());
+      }
+    }
+  }
+
+  @Override
+  public UiAction.Description getDescription(ChangeResource rsrc) {
+    return new UiAction.Description()
+        .setLabel("Edit Topic")
+        .setVisible(rsrc.permissions().testCond(ChangePermission.EDIT_TOPIC_NAME));
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/QueryChanges.java b/java/com/google/gerrit/server/restapi/change/QueryChanges.java
new file mode 100644
index 0000000..d1eea44
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/QueryChanges.java
@@ -0,0 +1,149 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.change;
+
+import com.google.common.collect.Iterables;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.client.ListChangesOption;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.index.query.QueryRequiresAuthException;
+import com.google.gerrit.index.query.QueryResult;
+import com.google.gerrit.server.DynamicOptions;
+import com.google.gerrit.server.change.ChangeJson;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.ChangeQueryBuilder;
+import com.google.gerrit.server.query.change.ChangeQueryProcessor;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.List;
+import org.kohsuke.args4j.Option;
+
+public class QueryChanges implements RestReadView<TopLevelResource>, DynamicOptions.BeanReceiver {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final ChangeJson.Factory json;
+  private final ChangeQueryBuilder qb;
+  private final ChangeQueryProcessor imp;
+  private EnumSet<ListChangesOption> options;
+
+  @Option(
+      name = "--query",
+      aliases = {"-q"},
+      metaVar = "QUERY",
+      usage = "Query string")
+  private List<String> queries;
+
+  @Option(
+      name = "--limit",
+      aliases = {"-n"},
+      metaVar = "CNT",
+      usage = "Maximum number of results to return")
+  public void setLimit(int limit) {
+    imp.setUserProvidedLimit(limit);
+  }
+
+  @Option(name = "-o", usage = "Output options per change")
+  public void addOption(ListChangesOption o) {
+    options.add(o);
+  }
+
+  @Option(name = "-O", usage = "Output option flags, in hex")
+  void setOptionFlagsHex(String hex) {
+    options.addAll(ListChangesOption.fromBits(Integer.parseInt(hex, 16)));
+  }
+
+  @Option(
+      name = "--start",
+      aliases = {"-S"},
+      metaVar = "CNT",
+      usage = "Number of changes to skip")
+  public void setStart(int start) {
+    imp.setStart(start);
+  }
+
+  @Override
+  public void setDynamicBean(String plugin, DynamicOptions.DynamicBean dynamicBean) {
+    imp.setDynamicBean(plugin, dynamicBean);
+  }
+
+  @Inject
+  QueryChanges(ChangeJson.Factory json, ChangeQueryBuilder qb, ChangeQueryProcessor qp) {
+    this.json = json;
+    this.qb = qb;
+    this.imp = qp;
+
+    options = EnumSet.noneOf(ListChangesOption.class);
+  }
+
+  public void addQuery(String query) {
+    if (queries == null) {
+      queries = new ArrayList<>();
+    }
+    queries.add(query);
+  }
+
+  public String getQuery(int i) {
+    return queries.get(i);
+  }
+
+  @Override
+  public List<?> apply(TopLevelResource rsrc)
+      throws BadRequestException, AuthException, OrmException, PermissionBackendException {
+    List<List<ChangeInfo>> out;
+    try {
+      out = query();
+    } catch (QueryRequiresAuthException e) {
+      throw new AuthException("Must be signed-in to use this operator");
+    } catch (QueryParseException e) {
+      logger.atFine().withCause(e).log("Reject change query with 400 Bad Request: %s", queries);
+      throw new BadRequestException(e.getMessage(), e);
+    }
+    return out.size() == 1 ? out.get(0) : out;
+  }
+
+  private List<List<ChangeInfo>> query()
+      throws OrmException, QueryParseException, PermissionBackendException {
+    if (imp.isDisabled()) {
+      throw new QueryParseException("query disabled");
+    }
+    if (queries == null || queries.isEmpty()) {
+      queries = Collections.singletonList("status:open");
+    } else if (queries.size() > 10) {
+      // Hard-code a default maximum number of queries to prevent
+      // users from submitting too much to the server in a single call.
+      throw new QueryParseException("limit of 10 queries");
+    }
+
+    int cnt = queries.size();
+    List<QueryResult<ChangeData>> results = imp.query(qb.parse(queries));
+    List<List<ChangeInfo>> res = json.create(options, this.imp).format(results);
+    for (int n = 0; n < cnt; n++) {
+      List<ChangeInfo> info = res.get(n);
+      if (results.get(n).more() && !info.isEmpty()) {
+        Iterables.getLast(info)._moreChanges = true;
+      }
+    }
+    return res;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/Rebase.java b/java/com/google/gerrit/server/restapi/change/Rebase.java
new file mode 100644
index 0000000..2e2f565
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/Rebase.java
@@ -0,0 +1,282 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.change;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.changes.RebaseInput;
+import com.google.gerrit.extensions.client.ListChangesOption;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.webui.UiAction;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Change.Status;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ChangeUtil;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.change.ChangeJson;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.RebaseChangeOp;
+import com.google.gerrit.server.change.RebaseUtil;
+import com.google.gerrit.server.change.RebaseUtil.Base;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestModifyView;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+@Singleton
+public class Rebase extends RetryingRestModifyView<RevisionResource, RebaseInput, ChangeInfo>
+    implements RestModifyView<RevisionResource, RebaseInput>, UiAction<RevisionResource> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final ImmutableSet<ListChangesOption> OPTIONS =
+      Sets.immutableEnumSet(ListChangesOption.CURRENT_REVISION, ListChangesOption.CURRENT_COMMIT);
+
+  private final GitRepositoryManager repoManager;
+  private final RebaseChangeOp.Factory rebaseFactory;
+  private final RebaseUtil rebaseUtil;
+  private final ChangeJson.Factory json;
+  private final Provider<ReviewDb> dbProvider;
+  private final PermissionBackend permissionBackend;
+  private final ProjectCache projectCache;
+  private final PatchSetUtil patchSetUtil;
+
+  @Inject
+  public Rebase(
+      RetryHelper retryHelper,
+      GitRepositoryManager repoManager,
+      RebaseChangeOp.Factory rebaseFactory,
+      RebaseUtil rebaseUtil,
+      ChangeJson.Factory json,
+      Provider<ReviewDb> dbProvider,
+      PermissionBackend permissionBackend,
+      ProjectCache projectCache,
+      PatchSetUtil patchSetUtil) {
+    super(retryHelper);
+    this.repoManager = repoManager;
+    this.rebaseFactory = rebaseFactory;
+    this.rebaseUtil = rebaseUtil;
+    this.json = json;
+    this.dbProvider = dbProvider;
+    this.permissionBackend = permissionBackend;
+    this.projectCache = projectCache;
+    this.patchSetUtil = patchSetUtil;
+  }
+
+  @Override
+  protected ChangeInfo applyImpl(
+      BatchUpdate.Factory updateFactory, RevisionResource rsrc, RebaseInput input)
+      throws OrmException, UpdateException, RestApiException, IOException,
+          PermissionBackendException {
+    // Not allowed to rebase if the current patch set is locked.
+    patchSetUtil.checkPatchSetNotLocked(rsrc.getNotes());
+
+    rsrc.permissions().database(dbProvider).check(ChangePermission.REBASE);
+    projectCache.checkedGet(rsrc.getProject()).checkStatePermitsWrite();
+
+    Change change = rsrc.getChange();
+    try (Repository repo = repoManager.openRepository(change.getProject());
+        ObjectInserter oi = repo.newObjectInserter();
+        ObjectReader reader = oi.newReader();
+        RevWalk rw = new RevWalk(reader);
+        BatchUpdate bu =
+            updateFactory.create(
+                dbProvider.get(), change.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
+      if (!change.getStatus().isOpen()) {
+        throw new ResourceConflictException("change is " + ChangeUtil.status(change));
+      } else if (!hasOneParent(rw, rsrc.getPatchSet())) {
+        throw new ResourceConflictException(
+            "cannot rebase merge commits or commit with no ancestor");
+      }
+      bu.setRepository(repo, rw, oi);
+      bu.addOp(
+          change.getId(),
+          rebaseFactory
+              .create(rsrc.getNotes(), rsrc.getPatchSet(), findBaseRev(repo, rw, rsrc, input))
+              .setForceContentMerge(true)
+              .setFireRevisionCreated(true));
+      bu.execute();
+    }
+    return json.create(OPTIONS).format(change.getProject(), change.getId());
+  }
+
+  private ObjectId findBaseRev(
+      Repository repo, RevWalk rw, RevisionResource rsrc, RebaseInput input)
+      throws RestApiException, OrmException, IOException, NoSuchChangeException, AuthException,
+          PermissionBackendException {
+    Branch.NameKey destRefKey = rsrc.getChange().getDest();
+    if (input == null || input.base == null) {
+      return rebaseUtil.findBaseRevision(rsrc.getPatchSet(), destRefKey, repo, rw);
+    }
+
+    Change change = rsrc.getChange();
+    String str = input.base.trim();
+    if (str.equals("")) {
+      // Remove existing dependency to other patch set.
+      Ref destRef = repo.exactRef(destRefKey.get());
+      if (destRef == null) {
+        throw new ResourceConflictException(
+            "can't rebase onto tip of branch " + destRefKey.get() + "; branch doesn't exist");
+      }
+      return destRef.getObjectId();
+    }
+
+    Base base = rebaseUtil.parseBase(rsrc, str);
+    if (base == null) {
+      throw new ResourceConflictException("base revision is missing: " + str);
+    }
+    PatchSet.Id baseId = base.patchSet().getId();
+    if (change.getId().equals(baseId.getParentKey())) {
+      throw new ResourceConflictException("cannot rebase change onto itself");
+    }
+
+    permissionBackend
+        .user(rsrc.getUser())
+        .database(dbProvider)
+        .change(base.notes())
+        .check(ChangePermission.READ);
+
+    Change baseChange = base.notes().getChange();
+    if (!baseChange.getProject().equals(change.getProject())) {
+      throw new ResourceConflictException(
+          "base change is in wrong project: " + baseChange.getProject());
+    } else if (!baseChange.getDest().equals(change.getDest())) {
+      throw new ResourceConflictException(
+          "base change is targeting wrong branch: " + baseChange.getDest());
+    } else if (baseChange.getStatus() == Status.ABANDONED) {
+      throw new ResourceConflictException("base change is abandoned: " + baseChange.getKey());
+    } else if (isMergedInto(rw, rsrc.getPatchSet(), base.patchSet())) {
+      throw new ResourceConflictException(
+          "base change "
+              + baseChange.getKey()
+              + " is a descendant of the current change - recursion not allowed");
+    }
+    return ObjectId.fromString(base.patchSet().getRevision().get());
+  }
+
+  private boolean isMergedInto(RevWalk rw, PatchSet base, PatchSet tip) throws IOException {
+    ObjectId baseId = ObjectId.fromString(base.getRevision().get());
+    ObjectId tipId = ObjectId.fromString(tip.getRevision().get());
+    return rw.isMergedInto(rw.parseCommit(baseId), rw.parseCommit(tipId));
+  }
+
+  private boolean hasOneParent(RevWalk rw, PatchSet ps) throws IOException {
+    // Prevent rebase of exotic changes (merge commit, no ancestor).
+    RevCommit c = rw.parseCommit(ObjectId.fromString(ps.getRevision().get()));
+    return c.getParentCount() == 1;
+  }
+
+  @Override
+  public UiAction.Description getDescription(RevisionResource rsrc) {
+    UiAction.Description description =
+        new UiAction.Description()
+            .setLabel("Rebase")
+            .setTitle("Rebase onto tip of branch or parent change")
+            .setVisible(false);
+
+    Change change = rsrc.getChange();
+    if (!(change.getStatus().isOpen() && rsrc.isCurrent())) {
+      return description;
+    }
+
+    try {
+      if (!projectCache.checkedGet(rsrc.getProject()).statePermitsWrite()) {
+        return description;
+      }
+    } catch (IOException e) {
+      logger.atSevere().withCause(e).log(
+          "Failed to check if project state permits write: %s", rsrc.getProject());
+      return description;
+    }
+
+    try {
+      if (patchSetUtil.isPatchSetLocked(rsrc.getNotes())) {
+        return description;
+      }
+    } catch (OrmException | IOException e) {
+      logger.atSevere().withCause(e).log(
+          "Failed to check if the current patch set of change %s is locked", change.getId());
+      return description;
+    }
+
+    boolean enabled = false;
+    try (Repository repo = repoManager.openRepository(change.getDest().getParentKey());
+        RevWalk rw = new RevWalk(repo)) {
+      if (hasOneParent(rw, rsrc.getPatchSet())) {
+        enabled = rebaseUtil.canRebase(rsrc.getPatchSet(), change.getDest(), repo, rw);
+      }
+    } catch (IOException e) {
+      logger.atSevere().withCause(e).log(
+          "Failed to check if patch set can be rebased: %s", rsrc.getPatchSet());
+      return description;
+    }
+
+    if (rsrc.permissions().database(dbProvider).testOrFalse(ChangePermission.REBASE)) {
+      return description.setVisible(true).setEnabled(enabled);
+    }
+    return description;
+  }
+
+  public static class CurrentRevision
+      extends RetryingRestModifyView<ChangeResource, RebaseInput, ChangeInfo> {
+    private final PatchSetUtil psUtil;
+    private final Rebase rebase;
+
+    @Inject
+    CurrentRevision(RetryHelper retryHelper, PatchSetUtil psUtil, Rebase rebase) {
+      super(retryHelper);
+      this.psUtil = psUtil;
+      this.rebase = rebase;
+    }
+
+    @Override
+    protected ChangeInfo applyImpl(
+        BatchUpdate.Factory updateFactory, ChangeResource rsrc, RebaseInput input)
+        throws OrmException, UpdateException, RestApiException, IOException,
+            PermissionBackendException {
+      PatchSet ps = psUtil.current(rebase.dbProvider.get(), rsrc.getNotes());
+      if (ps == null) {
+        throw new ResourceConflictException("current revision is missing");
+      }
+      return rebase.applyImpl(updateFactory, new RevisionResource(rsrc, ps), input);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/RebaseChangeEdit.java b/java/com/google/gerrit/server/restapi/change/RebaseChangeEdit.java
new file mode 100644
index 0000000..6020e95
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/RebaseChangeEdit.java
@@ -0,0 +1,63 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.edit.ChangeEditModifier;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.InvalidChangeOperationException;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestModifyView;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.lib.Repository;
+
+@Singleton
+public class RebaseChangeEdit extends RetryingRestModifyView<ChangeResource, Input, Response<?>> {
+  private final GitRepositoryManager repositoryManager;
+  private final ChangeEditModifier editModifier;
+
+  @Inject
+  RebaseChangeEdit(
+      RetryHelper retryHelper,
+      GitRepositoryManager repositoryManager,
+      ChangeEditModifier editModifier) {
+    super(retryHelper);
+    this.repositoryManager = repositoryManager;
+    this.editModifier = editModifier;
+  }
+
+  @Override
+  protected Response<?> applyImpl(BatchUpdate.Factory updateFactory, ChangeResource rsrc, Input in)
+      throws AuthException, ResourceConflictException, IOException, OrmException,
+          PermissionBackendException {
+    Project.NameKey project = rsrc.getProject();
+    try (Repository repository = repositoryManager.openRepository(project)) {
+      editModifier.rebaseEdit(repository, rsrc.getNotes());
+    } catch (InvalidChangeOperationException e) {
+      throw new ResourceConflictException(e.getMessage());
+    }
+    return Response.none();
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/Rebuild.java b/java/com/google/gerrit/server/restapi/change/Rebuild.java
new file mode 100644
index 0000000..dc390cc
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/Rebuild.java
@@ -0,0 +1,109 @@
+// 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.
+
+package com.google.gerrit.server.restapi.change;
+
+import static java.util.stream.Collectors.joining;
+
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.BinaryResult;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.reviewdb.server.ReviewDbUtil;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.notedb.ChangeBundle;
+import com.google.gerrit.server.notedb.ChangeBundleReader;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gerrit.server.notedb.rebuild.ChangeRebuilder;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.List;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class Rebuild implements RestModifyView<ChangeResource, Input> {
+
+  private final Provider<ReviewDb> db;
+  private final NotesMigration migration;
+  private final ChangeRebuilder rebuilder;
+  private final ChangeBundleReader bundleReader;
+  private final CommentsUtil commentsUtil;
+  private final ChangeNotes.Factory notesFactory;
+
+  @Inject
+  Rebuild(
+      Provider<ReviewDb> db,
+      NotesMigration migration,
+      ChangeRebuilder rebuilder,
+      ChangeBundleReader bundleReader,
+      CommentsUtil commentsUtil,
+      ChangeNotes.Factory notesFactory) {
+    this.db = db;
+    this.migration = migration;
+    this.rebuilder = rebuilder;
+    this.bundleReader = bundleReader;
+    this.commentsUtil = commentsUtil;
+    this.notesFactory = notesFactory;
+  }
+
+  @Override
+  public BinaryResult apply(ChangeResource rsrc, Input input)
+      throws ResourceNotFoundException, IOException, OrmException, ConfigInvalidException,
+          ResourceConflictException {
+    if (!migration.commitChangeWrites()) {
+      throw new ResourceNotFoundException();
+    }
+    if (!migration.readChanges()) {
+      // ChangeBundle#fromNotes currently doesn't work if reading isn't enabled,
+      // so don't attempt a diff.
+      rebuild(rsrc);
+      return BinaryResult.create("Rebuilt change successfully");
+    }
+
+    // Not the same transaction as the rebuild, so may result in spurious diffs
+    // in the case of races. This should be easy enough to detect by rerunning.
+    ChangeBundle reviewDbBundle =
+        bundleReader.fromReviewDb(ReviewDbUtil.unwrapDb(db.get()), rsrc.getId());
+    if (reviewDbBundle == null) {
+      throw new ResourceConflictException("change is missing in ReviewDb");
+    }
+    rebuild(rsrc);
+    ChangeNotes notes = notesFactory.create(db.get(), rsrc.getChange().getProject(), rsrc.getId());
+    ChangeBundle noteDbBundle = ChangeBundle.fromNotes(commentsUtil, notes);
+    List<String> diffs = reviewDbBundle.differencesFrom(noteDbBundle);
+    if (diffs.isEmpty()) {
+      return BinaryResult.create("No differences between ReviewDb and NoteDb");
+    }
+    return BinaryResult.create(
+        diffs.stream().collect(joining("\n", "Differences between ReviewDb and NoteDb:\n", "\n")));
+  }
+
+  private void rebuild(ChangeResource rsrc)
+      throws ResourceNotFoundException, OrmException, IOException {
+    try {
+      rebuilder.rebuild(db.get(), rsrc.getId());
+    } catch (NoSuchChangeException e) {
+      throw new ResourceNotFoundException(IdString.fromDecoded(rsrc.getId().toString()));
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/RelatedChangesSorter.java b/java/com/google/gerrit/server/restapi/change/RelatedChangesSorter.java
new file mode 100644
index 0000000..51f70bd
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/RelatedChangesSorter.java
@@ -0,0 +1,284 @@
+// Copyright (C) 2015 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.google.gerrit.server.restapi.change;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.util.Objects.requireNonNull;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.MultimapBuilder;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Deque;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+@Singleton
+class RelatedChangesSorter {
+  private final GitRepositoryManager repoManager;
+  private final PermissionBackend permissionBackend;
+  private final Provider<ReviewDb> dbProvider;
+  private final ProjectCache projectCache;
+
+  @Inject
+  RelatedChangesSorter(
+      GitRepositoryManager repoManager,
+      PermissionBackend permissionBackend,
+      Provider<ReviewDb> dbProvider,
+      ProjectCache projectCache) {
+    this.repoManager = repoManager;
+    this.permissionBackend = permissionBackend;
+    this.dbProvider = dbProvider;
+    this.projectCache = projectCache;
+  }
+
+  public List<PatchSetData> sort(List<ChangeData> in, PatchSet startPs)
+      throws OrmException, IOException, PermissionBackendException {
+    checkArgument(!in.isEmpty(), "Input may not be empty");
+    // Map of all patch sets, keyed by commit SHA-1.
+    Map<String, PatchSetData> byId = collectById(in);
+    PatchSetData start = byId.get(startPs.getRevision().get());
+    checkArgument(start != null, "%s not found in %s", startPs, in);
+
+    // Map of patch set -> immediate parent.
+    ListMultimap<PatchSetData, PatchSetData> parents =
+        MultimapBuilder.hashKeys(in.size()).arrayListValues(3).build();
+    // Map of patch set -> immediate children.
+    ListMultimap<PatchSetData, PatchSetData> children =
+        MultimapBuilder.hashKeys(in.size()).arrayListValues(3).build();
+    // All other patch sets of the same change as startPs.
+    List<PatchSetData> otherPatchSetsOfStart = new ArrayList<>();
+
+    for (ChangeData cd : in) {
+      for (PatchSet ps : cd.patchSets()) {
+        PatchSetData thisPsd = requireNonNull(byId.get(ps.getRevision().get()));
+        if (cd.getId().equals(start.id()) && !ps.getId().equals(start.psId())) {
+          otherPatchSetsOfStart.add(thisPsd);
+        }
+        for (RevCommit p : thisPsd.commit().getParents()) {
+          PatchSetData parentPsd = byId.get(p.name());
+          if (parentPsd != null) {
+            parents.put(thisPsd, parentPsd);
+            children.put(parentPsd, thisPsd);
+          }
+        }
+      }
+    }
+
+    Collection<PatchSetData> ancestors = walkAncestors(parents, start);
+    List<PatchSetData> descendants =
+        walkDescendants(children, start, otherPatchSetsOfStart, ancestors);
+    List<PatchSetData> result = new ArrayList<>(ancestors.size() + descendants.size() - 1);
+    result.addAll(Lists.reverse(descendants));
+    result.addAll(ancestors);
+    return result;
+  }
+
+  private Map<String, PatchSetData> collectById(List<ChangeData> in)
+      throws OrmException, IOException {
+    Project.NameKey project = in.get(0).change().getProject();
+    Map<String, PatchSetData> result = Maps.newHashMapWithExpectedSize(in.size() * 3);
+    try (Repository repo = repoManager.openRepository(project);
+        RevWalk rw = new RevWalk(repo)) {
+      rw.setRetainBody(true);
+      for (ChangeData cd : in) {
+        checkArgument(
+            cd.change().getProject().equals(project),
+            "Expected change %s in project %s, found %s",
+            cd.getId(),
+            project,
+            cd.change().getProject());
+        for (PatchSet ps : cd.patchSets()) {
+          String id = ps.getRevision().get();
+          RevCommit c = rw.parseCommit(ObjectId.fromString(id));
+          PatchSetData psd = PatchSetData.create(cd, ps, c);
+          result.put(id, psd);
+        }
+      }
+    }
+    return result;
+  }
+
+  private Collection<PatchSetData> walkAncestors(
+      ListMultimap<PatchSetData, PatchSetData> parents, PatchSetData start)
+      throws PermissionBackendException, IOException {
+    LinkedHashSet<PatchSetData> result = new LinkedHashSet<>();
+    Deque<PatchSetData> pending = new ArrayDeque<>();
+    pending.add(start);
+    while (!pending.isEmpty()) {
+      PatchSetData psd = pending.remove();
+      if (result.contains(psd) || !isVisible(psd)) {
+        continue;
+      }
+      result.add(psd);
+      pending.addAll(Lists.reverse(parents.get(psd)));
+    }
+    return result;
+  }
+
+  private List<PatchSetData> walkDescendants(
+      ListMultimap<PatchSetData, PatchSetData> children,
+      PatchSetData start,
+      List<PatchSetData> otherPatchSetsOfStart,
+      Iterable<PatchSetData> ancestors)
+      throws PermissionBackendException, IOException {
+    Set<Change.Id> alreadyEmittedChanges = new HashSet<>();
+    addAllChangeIds(alreadyEmittedChanges, ancestors);
+
+    // Prefer descendants found by following the original patch set passed in.
+    List<PatchSetData> result =
+        walkDescendentsImpl(alreadyEmittedChanges, children, ImmutableList.of(start));
+    addAllChangeIds(alreadyEmittedChanges, result);
+
+    // Then, go back and add new indirect descendants found by following any
+    // other patch sets of start. These show up after all direct descendants,
+    // because we wouldn't know where in the walk to insert them.
+    result.addAll(walkDescendentsImpl(alreadyEmittedChanges, children, otherPatchSetsOfStart));
+    return result;
+  }
+
+  private static void addAllChangeIds(
+      Collection<Change.Id> changeIds, Iterable<PatchSetData> psds) {
+    for (PatchSetData psd : psds) {
+      changeIds.add(psd.id());
+    }
+  }
+
+  private List<PatchSetData> walkDescendentsImpl(
+      Set<Change.Id> alreadyEmittedChanges,
+      ListMultimap<PatchSetData, PatchSetData> children,
+      List<PatchSetData> start)
+      throws PermissionBackendException, IOException {
+    if (start.isEmpty()) {
+      return ImmutableList.of();
+    }
+    Map<Change.Id, PatchSet.Id> maxPatchSetIds = new HashMap<>();
+    Set<PatchSetData> seen = new HashSet<>();
+    List<PatchSetData> allPatchSets = new ArrayList<>();
+    Deque<PatchSetData> pending = new ArrayDeque<>();
+    pending.addAll(start);
+    while (!pending.isEmpty()) {
+      PatchSetData psd = pending.remove();
+      if (seen.contains(psd) || !isVisible(psd)) {
+        continue;
+      }
+      seen.add(psd);
+      if (!alreadyEmittedChanges.contains(psd.id())) {
+        // Don't emit anything for changes that were previously emitted, even
+        // though different patch sets might show up later. However, do
+        // continue walking through them for the purposes of finding indirect
+        // descendants.
+        PatchSet.Id oldMax = maxPatchSetIds.get(psd.id());
+        if (oldMax == null || psd.psId().get() > oldMax.get()) {
+          maxPatchSetIds.put(psd.id(), psd.psId());
+        }
+        allPatchSets.add(psd);
+      }
+      // Depth-first search with newest children first.
+      for (PatchSetData child : children.get(psd)) {
+        pending.addFirst(child);
+      }
+    }
+
+    // If we saw the same change multiple times, prefer the latest patch set.
+    List<PatchSetData> result = new ArrayList<>(allPatchSets.size());
+    for (PatchSetData psd : allPatchSets) {
+      if (requireNonNull(maxPatchSetIds.get(psd.id())).equals(psd.psId())) {
+        result.add(psd);
+      }
+    }
+    return result;
+  }
+
+  private boolean isVisible(PatchSetData psd) throws PermissionBackendException, IOException {
+    PermissionBackend.WithUser perm = permissionBackend.currentUser().database(dbProvider);
+    try {
+      perm.change(psd.data()).check(ChangePermission.READ);
+    } catch (AuthException e) {
+      return false;
+    }
+    ProjectState state = projectCache.checkedGet(psd.data().project());
+    return state != null && state.statePermitsRead();
+  }
+
+  @AutoValue
+  abstract static class PatchSetData {
+    @VisibleForTesting
+    static PatchSetData create(ChangeData cd, PatchSet ps, RevCommit commit) {
+      return new AutoValue_RelatedChangesSorter_PatchSetData(cd, ps, commit);
+    }
+
+    abstract ChangeData data();
+
+    abstract PatchSet patchSet();
+
+    abstract RevCommit commit();
+
+    PatchSet.Id psId() {
+      return patchSet().getId();
+    }
+
+    Change.Id id() {
+      return psId().getParentKey();
+    }
+
+    @Override
+    public int hashCode() {
+      return Objects.hash(patchSet().getId(), commit());
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+      if (!(obj instanceof PatchSetData)) {
+        return false;
+      }
+      PatchSetData o = (PatchSetData) obj;
+      return Objects.equals(patchSet().getId(), o.patchSet().getId())
+          && Objects.equals(commit(), o.commit());
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/Restore.java b/java/com/google/gerrit/server/restapi/change/Restore.java
new file mode 100644
index 0000000..d6f9e2b
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/Restore.java
@@ -0,0 +1,198 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.change;
+
+import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.changes.RestoreInput;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.webui.UiAction;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Change.Status;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.ChangeUtil;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.change.ChangeJson;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.extensions.events.ChangeRestored;
+import com.google.gerrit.server.mail.send.ReplyToChangeSender;
+import com.google.gerrit.server.mail.send.RestoredSender;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.Context;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestModifyView;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+
+@Singleton
+public class Restore extends RetryingRestModifyView<ChangeResource, RestoreInput, ChangeInfo>
+    implements UiAction<ChangeResource> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final RestoredSender.Factory restoredSenderFactory;
+  private final Provider<ReviewDb> dbProvider;
+  private final ChangeJson.Factory json;
+  private final ChangeMessagesUtil cmUtil;
+  private final PatchSetUtil psUtil;
+  private final ChangeRestored changeRestored;
+  private final ProjectCache projectCache;
+
+  @Inject
+  Restore(
+      RestoredSender.Factory restoredSenderFactory,
+      Provider<ReviewDb> dbProvider,
+      ChangeJson.Factory json,
+      ChangeMessagesUtil cmUtil,
+      PatchSetUtil psUtil,
+      RetryHelper retryHelper,
+      ChangeRestored changeRestored,
+      ProjectCache projectCache) {
+    super(retryHelper);
+    this.restoredSenderFactory = restoredSenderFactory;
+    this.dbProvider = dbProvider;
+    this.json = json;
+    this.cmUtil = cmUtil;
+    this.psUtil = psUtil;
+    this.changeRestored = changeRestored;
+    this.projectCache = projectCache;
+  }
+
+  @Override
+  protected ChangeInfo applyImpl(
+      BatchUpdate.Factory updateFactory, ChangeResource rsrc, RestoreInput input)
+      throws RestApiException, UpdateException, OrmException, PermissionBackendException,
+          IOException {
+    // Not allowed to restore if the current patch set is locked.
+    psUtil.checkPatchSetNotLocked(rsrc.getNotes());
+
+    rsrc.permissions().database(dbProvider).check(ChangePermission.RESTORE);
+    projectCache.checkedGet(rsrc.getProject()).checkStatePermitsWrite();
+
+    Op op = new Op(input);
+    try (BatchUpdate u =
+        updateFactory.create(
+            dbProvider.get(), rsrc.getChange().getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
+      u.addOp(rsrc.getId(), op).execute();
+    }
+    return json.noOptions().format(op.change);
+  }
+
+  private class Op implements BatchUpdateOp {
+    private final RestoreInput input;
+
+    private Change change;
+    private PatchSet patchSet;
+    private ChangeMessage message;
+
+    private Op(RestoreInput input) {
+      this.input = input;
+    }
+
+    @Override
+    public boolean updateChange(ChangeContext ctx) throws OrmException, ResourceConflictException {
+      change = ctx.getChange();
+      if (change == null || change.getStatus() != Status.ABANDONED) {
+        throw new ResourceConflictException("change is " + ChangeUtil.status(change));
+      }
+      PatchSet.Id psId = change.currentPatchSetId();
+      ChangeUpdate update = ctx.getUpdate(psId);
+      patchSet = psUtil.get(ctx.getDb(), ctx.getNotes(), psId);
+      change.setStatus(Status.NEW);
+      change.setLastUpdatedOn(ctx.getWhen());
+      update.setStatus(change.getStatus());
+
+      message = newMessage(ctx);
+      cmUtil.addChangeMessage(ctx.getDb(), update, message);
+      return true;
+    }
+
+    private ChangeMessage newMessage(ChangeContext ctx) {
+      StringBuilder msg = new StringBuilder();
+      msg.append("Restored");
+      if (!Strings.nullToEmpty(input.message).trim().isEmpty()) {
+        msg.append("\n\n");
+        msg.append(input.message.trim());
+      }
+      return ChangeMessagesUtil.newMessage(ctx, msg.toString(), ChangeMessagesUtil.TAG_RESTORE);
+    }
+
+    @Override
+    public void postUpdate(Context ctx) throws OrmException {
+      try {
+        ReplyToChangeSender cm = restoredSenderFactory.create(ctx.getProject(), change.getId());
+        cm.setFrom(ctx.getAccountId());
+        cm.setChangeMessage(message.getMessage(), ctx.getWhen());
+        cm.send();
+      } catch (Exception e) {
+        logger.atSevere().withCause(e).log("Cannot email update for change %s", change.getId());
+      }
+      changeRestored.fire(
+          change, patchSet, ctx.getAccount(), Strings.emptyToNull(input.message), ctx.getWhen());
+    }
+  }
+
+  @Override
+  public UiAction.Description getDescription(ChangeResource rsrc) {
+    UiAction.Description description =
+        new UiAction.Description()
+            .setLabel("Restore")
+            .setTitle("Restore the change")
+            .setVisible(false);
+
+    Change change = rsrc.getChange();
+    if (change.getStatus() != Status.ABANDONED) {
+      return description;
+    }
+
+    try {
+      if (!projectCache.checkedGet(rsrc.getProject()).statePermitsWrite()) {
+        return description;
+      }
+    } catch (IOException e) {
+      logger.atSevere().withCause(e).log(
+          "Failed to check if project state permits write: %s", rsrc.getProject());
+      return description;
+    }
+
+    try {
+      if (psUtil.isPatchSetLocked(rsrc.getNotes())) {
+        return description;
+      }
+    } catch (OrmException | IOException e) {
+      logger.atSevere().withCause(e).log(
+          "Failed to check if the current patch set of change %s is locked", change.getId());
+      return description;
+    }
+
+    boolean visible = rsrc.permissions().database(dbProvider).testOrFalse(ChangePermission.RESTORE);
+    return description.setVisible(visible);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/Revert.java b/java/com/google/gerrit/server/restapi/change/Revert.java
new file mode 100644
index 0000000..7309fde
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/Revert.java
@@ -0,0 +1,333 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.change;
+
+import static com.google.gerrit.extensions.conditions.BooleanCondition.and;
+import static com.google.gerrit.server.permissions.RefPermission.CREATE_CHANGE;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ListMultimap;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.api.changes.RecipientType;
+import com.google.gerrit.extensions.api.changes.RevertInput;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.webui.UiAction;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.ChangeUtil;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.ReviewerSet;
+import com.google.gerrit.server.Sequences;
+import com.google.gerrit.server.change.ChangeInserter;
+import com.google.gerrit.server.change.ChangeJson;
+import com.google.gerrit.server.change.ChangeMessages;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.NotifyUtil;
+import com.google.gerrit.server.extensions.events.ChangeReverted;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.mail.send.RevertedSender;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.ReviewerStateInternal;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ContributorAgreementsChecker;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.project.NoSuchProjectException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.Context;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestModifyView;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.text.MessageFormat;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.util.ChangeIdUtil;
+
+@Singleton
+public class Revert extends RetryingRestModifyView<ChangeResource, RevertInput, ChangeInfo>
+    implements UiAction<ChangeResource> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final Provider<ReviewDb> db;
+  private final PermissionBackend permissionBackend;
+  private final GitRepositoryManager repoManager;
+  private final ChangeInserter.Factory changeInserterFactory;
+  private final ChangeMessagesUtil cmUtil;
+  private final Sequences seq;
+  private final PatchSetUtil psUtil;
+  private final RevertedSender.Factory revertedSenderFactory;
+  private final ChangeJson.Factory json;
+  private final Provider<PersonIdent> serverIdent;
+  private final ApprovalsUtil approvalsUtil;
+  private final ChangeReverted changeReverted;
+  private final ContributorAgreementsChecker contributorAgreements;
+  private final ProjectCache projectCache;
+  private final NotifyUtil notifyUtil;
+
+  @Inject
+  Revert(
+      Provider<ReviewDb> db,
+      PermissionBackend permissionBackend,
+      GitRepositoryManager repoManager,
+      ChangeInserter.Factory changeInserterFactory,
+      ChangeMessagesUtil cmUtil,
+      RetryHelper retryHelper,
+      Sequences seq,
+      PatchSetUtil psUtil,
+      RevertedSender.Factory revertedSenderFactory,
+      ChangeJson.Factory json,
+      @GerritPersonIdent Provider<PersonIdent> serverIdent,
+      ApprovalsUtil approvalsUtil,
+      ChangeReverted changeReverted,
+      ContributorAgreementsChecker contributorAgreements,
+      ProjectCache projectCache,
+      NotifyUtil notifyUtil) {
+    super(retryHelper);
+    this.db = db;
+    this.permissionBackend = permissionBackend;
+    this.repoManager = repoManager;
+    this.changeInserterFactory = changeInserterFactory;
+    this.cmUtil = cmUtil;
+    this.seq = seq;
+    this.psUtil = psUtil;
+    this.revertedSenderFactory = revertedSenderFactory;
+    this.json = json;
+    this.serverIdent = serverIdent;
+    this.approvalsUtil = approvalsUtil;
+    this.changeReverted = changeReverted;
+    this.contributorAgreements = contributorAgreements;
+    this.projectCache = projectCache;
+    this.notifyUtil = notifyUtil;
+  }
+
+  @Override
+  public ChangeInfo applyImpl(
+      BatchUpdate.Factory updateFactory, ChangeResource rsrc, RevertInput input)
+      throws IOException, OrmException, RestApiException, UpdateException, NoSuchChangeException,
+          PermissionBackendException, NoSuchProjectException, ConfigInvalidException {
+    Change change = rsrc.getChange();
+    if (change.getStatus() != Change.Status.MERGED) {
+      throw new ResourceConflictException("change is " + ChangeUtil.status(change));
+    }
+
+    contributorAgreements.check(rsrc.getProject(), rsrc.getUser());
+    permissionBackend.user(rsrc.getUser()).ref(change.getDest()).check(CREATE_CHANGE);
+    projectCache.checkedGet(rsrc.getProject()).checkStatePermitsWrite();
+
+    Change.Id revertId = revert(updateFactory, rsrc.getNotes(), rsrc.getUser(), input);
+    return json.noOptions().format(rsrc.getProject(), revertId);
+  }
+
+  private Change.Id revert(
+      BatchUpdate.Factory updateFactory, ChangeNotes notes, CurrentUser user, RevertInput input)
+      throws OrmException, IOException, RestApiException, UpdateException, ConfigInvalidException {
+    String message = Strings.emptyToNull(input.message);
+    Change.Id changeIdToRevert = notes.getChangeId();
+    PatchSet.Id patchSetId = notes.getChange().currentPatchSetId();
+    PatchSet patch = psUtil.get(db.get(), notes, patchSetId);
+    if (patch == null) {
+      throw new ResourceNotFoundException(changeIdToRevert.toString());
+    }
+
+    Project.NameKey project = notes.getProjectName();
+    try (Repository git = repoManager.openRepository(project);
+        ObjectInserter oi = git.newObjectInserter();
+        ObjectReader reader = oi.newReader();
+        RevWalk revWalk = new RevWalk(reader)) {
+      RevCommit commitToRevert =
+          revWalk.parseCommit(ObjectId.fromString(patch.getRevision().get()));
+      if (commitToRevert.getParentCount() == 0) {
+        throw new ResourceConflictException("Cannot revert initial commit");
+      }
+
+      Timestamp now = TimeUtil.nowTs();
+      PersonIdent committerIdent = serverIdent.get();
+      PersonIdent authorIdent =
+          user.asIdentifiedUser().newCommitterIdent(now, committerIdent.getTimeZone());
+
+      RevCommit parentToCommitToRevert = commitToRevert.getParent(0);
+      revWalk.parseHeaders(parentToCommitToRevert);
+
+      CommitBuilder revertCommitBuilder = new CommitBuilder();
+      revertCommitBuilder.addParentId(commitToRevert);
+      revertCommitBuilder.setTreeId(parentToCommitToRevert.getTree());
+      revertCommitBuilder.setAuthor(authorIdent);
+      revertCommitBuilder.setCommitter(authorIdent);
+
+      Change changeToRevert = notes.getChange();
+      if (message == null) {
+        message =
+            MessageFormat.format(
+                ChangeMessages.get().revertChangeDefaultMessage,
+                changeToRevert.getSubject(),
+                patch.getRevision().get());
+      }
+
+      ObjectId computedChangeId =
+          ChangeIdUtil.computeChangeId(
+              parentToCommitToRevert.getTree(),
+              commitToRevert,
+              authorIdent,
+              committerIdent,
+              message);
+      revertCommitBuilder.setMessage(ChangeIdUtil.insertId(message, computedChangeId, true));
+
+      Change.Id changeId = new Change.Id(seq.nextChangeId());
+      ObjectId id = oi.insert(revertCommitBuilder);
+      RevCommit revertCommit = revWalk.parseCommit(id);
+
+      ListMultimap<RecipientType, Account.Id> accountsToNotify =
+          notifyUtil.resolveAccounts(input.notifyDetails);
+
+      ChangeInserter ins =
+          changeInserterFactory
+              .create(changeId, revertCommit, notes.getChange().getDest().get())
+              .setTopic(changeToRevert.getTopic());
+      ins.setMessage("Uploaded patch set 1.");
+      ins.setNotify(input.notify);
+      ins.setAccountsToNotify(accountsToNotify);
+
+      ReviewerSet reviewerSet = approvalsUtil.getReviewers(db.get(), notes);
+
+      Set<Account.Id> reviewers = new HashSet<>();
+      reviewers.add(changeToRevert.getOwner());
+      reviewers.addAll(reviewerSet.byState(ReviewerStateInternal.REVIEWER));
+      reviewers.remove(user.getAccountId());
+      Set<Account.Id> ccs = new HashSet<>(reviewerSet.byState(ReviewerStateInternal.CC));
+      ccs.remove(user.getAccountId());
+      ins.setReviewersAndCcs(reviewers, ccs);
+      ins.setRevertOf(changeIdToRevert);
+
+      try (BatchUpdate bu = updateFactory.create(db.get(), project, user, now)) {
+        bu.setRepository(git, revWalk, oi);
+        bu.insertChange(ins);
+        bu.addOp(changeId, new NotifyOp(changeToRevert, ins, input.notify, accountsToNotify));
+        bu.addOp(changeToRevert.getId(), new PostRevertedMessageOp(computedChangeId));
+        bu.execute();
+      }
+      return changeId;
+    } catch (RepositoryNotFoundException e) {
+      throw new ResourceNotFoundException(changeIdToRevert.toString(), e);
+    }
+  }
+
+  @Override
+  public UiAction.Description getDescription(ChangeResource rsrc) {
+    Change change = rsrc.getChange();
+    boolean projectStatePermitsWrite = false;
+    try {
+      projectStatePermitsWrite = projectCache.checkedGet(rsrc.getProject()).statePermitsWrite();
+    } catch (IOException e) {
+      logger.atSevere().withCause(e).log(
+          "Failed to check if project state permits write: %s", rsrc.getProject());
+    }
+    return new UiAction.Description()
+        .setLabel("Revert")
+        .setTitle("Revert the change")
+        .setVisible(
+            and(
+                change.getStatus() == Change.Status.MERGED && projectStatePermitsWrite,
+                permissionBackend
+                    .user(rsrc.getUser())
+                    .ref(change.getDest())
+                    .testCond(CREATE_CHANGE)));
+  }
+
+  private class NotifyOp implements BatchUpdateOp {
+    private final Change change;
+    private final ChangeInserter ins;
+    private final NotifyHandling notifyHandling;
+    private final ListMultimap<RecipientType, Account.Id> accountsToNotify;
+
+    NotifyOp(
+        Change change,
+        ChangeInserter ins,
+        NotifyHandling notifyHandling,
+        ListMultimap<RecipientType, Account.Id> accountsToNotify) {
+      this.change = change;
+      this.ins = ins;
+      this.notifyHandling = notifyHandling;
+      this.accountsToNotify = accountsToNotify;
+    }
+
+    @Override
+    public void postUpdate(Context ctx) throws Exception {
+      changeReverted.fire(change, ins.getChange(), ctx.getWhen());
+      try {
+        RevertedSender cm = revertedSenderFactory.create(ctx.getProject(), change.getId());
+        cm.setFrom(ctx.getAccountId());
+        cm.setNotify(notifyHandling);
+        cm.setAccountsToNotify(accountsToNotify);
+        cm.send();
+      } catch (Exception err) {
+        logger.atSevere().withCause(err).log(
+            "Cannot send email for revert change %s", change.getId());
+      }
+    }
+  }
+
+  private class PostRevertedMessageOp implements BatchUpdateOp {
+    private final ObjectId computedChangeId;
+
+    PostRevertedMessageOp(ObjectId computedChangeId) {
+      this.computedChangeId = computedChangeId;
+    }
+
+    @Override
+    public boolean updateChange(ChangeContext ctx) throws Exception {
+      Change change = ctx.getChange();
+      PatchSet.Id patchSetId = change.currentPatchSetId();
+      ChangeMessage changeMessage =
+          ChangeMessagesUtil.newMessage(
+              ctx,
+              "Created a revert of this change as I" + computedChangeId.name(),
+              ChangeMessagesUtil.TAG_REVERT);
+      cmUtil.addChangeMessage(ctx.getDb(), ctx.getUpdate(patchSetId), changeMessage);
+      return true;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/Reviewed.java b/java/com/google/gerrit/server/restapi/change/Reviewed.java
new file mode 100644
index 0000000..accc355
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/Reviewed.java
@@ -0,0 +1,75 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.change.AccountPatchReviewStore;
+import com.google.gerrit.server.change.FileResource;
+import com.google.gerrit.server.plugincontext.PluginItemContext;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+public class Reviewed {
+
+  @Singleton
+  public static class PutReviewed implements RestModifyView<FileResource, Input> {
+    private final PluginItemContext<AccountPatchReviewStore> accountPatchReviewStore;
+
+    @Inject
+    PutReviewed(PluginItemContext<AccountPatchReviewStore> accountPatchReviewStore) {
+      this.accountPatchReviewStore = accountPatchReviewStore;
+    }
+
+    @Override
+    public Response<String> apply(FileResource resource, Input input) throws OrmException {
+      boolean reviewFlagUpdated =
+          accountPatchReviewStore.call(
+              s ->
+                  s.markReviewed(
+                      resource.getPatchKey().getParentKey(),
+                      resource.getAccountId(),
+                      resource.getPatchKey().getFileName()),
+              OrmException.class);
+      return reviewFlagUpdated ? Response.created("") : Response.ok("");
+    }
+  }
+
+  @Singleton
+  public static class DeleteReviewed implements RestModifyView<FileResource, Input> {
+    private final PluginItemContext<AccountPatchReviewStore> accountPatchReviewStore;
+
+    @Inject
+    DeleteReviewed(PluginItemContext<AccountPatchReviewStore> accountPatchReviewStore) {
+      this.accountPatchReviewStore = accountPatchReviewStore;
+    }
+
+    @Override
+    public Response<?> apply(FileResource resource, Input input) throws OrmException {
+      accountPatchReviewStore.run(
+          s ->
+              s.clearReviewed(
+                  resource.getPatchKey().getParentKey(),
+                  resource.getAccountId(),
+                  resource.getPatchKey().getFileName()),
+          OrmException.class);
+      return Response.none();
+    }
+  }
+
+  private Reviewed() {}
+}
diff --git a/java/com/google/gerrit/server/restapi/change/ReviewerRecommender.java b/java/com/google/gerrit/server/restapi/change/ReviewerRecommender.java
new file mode 100644
index 0000000..ece52bf
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/ReviewerRecommender.java
@@ -0,0 +1,293 @@
+// 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.
+
+package com.google.gerrit.server.restapi.change;
+
+import static com.google.gerrit.server.notedb.ReviewerStateInternal.REVIEWER;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.FanOutExecutor;
+import com.google.gerrit.server.change.ReviewerSuggestion;
+import com.google.gerrit.server.change.SuggestedReviewer;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.index.change.ChangeField;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.plugincontext.PluginMapContext;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.ChangeQueryBuilder;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Stream;
+import org.apache.commons.lang.mutable.MutableDouble;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Config;
+
+public class ReviewerRecommender {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final double BASE_REVIEWER_WEIGHT = 10;
+  private static final double BASE_OWNER_WEIGHT = 1;
+  private static final double BASE_COMMENT_WEIGHT = 0.5;
+  private static final double[] WEIGHTS =
+      new double[] {
+        BASE_REVIEWER_WEIGHT, BASE_OWNER_WEIGHT, BASE_COMMENT_WEIGHT,
+      };
+  private static final long PLUGIN_QUERY_TIMEOUT = 500; // ms
+
+  private final ChangeQueryBuilder changeQueryBuilder;
+  private final Config config;
+  private final PluginMapContext<ReviewerSuggestion> reviewerSuggestionPluginMap;
+  private final Provider<InternalChangeQuery> queryProvider;
+  private final ExecutorService executor;
+  private final Provider<ReviewDb> dbProvider;
+  private final ApprovalsUtil approvalsUtil;
+
+  @Inject
+  ReviewerRecommender(
+      ChangeQueryBuilder changeQueryBuilder,
+      PluginMapContext<ReviewerSuggestion> reviewerSuggestionPluginMap,
+      Provider<InternalChangeQuery> queryProvider,
+      @FanOutExecutor ExecutorService executor,
+      Provider<ReviewDb> dbProvider,
+      ApprovalsUtil approvalsUtil,
+      @GerritServerConfig Config config) {
+    this.changeQueryBuilder = changeQueryBuilder;
+    this.config = config;
+    this.queryProvider = queryProvider;
+    this.reviewerSuggestionPluginMap = reviewerSuggestionPluginMap;
+    this.executor = executor;
+    this.dbProvider = dbProvider;
+    this.approvalsUtil = approvalsUtil;
+  }
+
+  public List<Account.Id> suggestReviewers(
+      @Nullable ChangeNotes changeNotes,
+      SuggestReviewers suggestReviewers,
+      ProjectState projectState,
+      List<Account.Id> candidateList)
+      throws OrmException, IOException, ConfigInvalidException {
+    logger.atFine().log("Candidates %s", candidateList);
+
+    String query = suggestReviewers.getQuery();
+    logger.atFine().log("query: %s", query);
+
+    double baseWeight = config.getInt("addReviewer", "baseWeight", 1);
+    logger.atFine().log("base weight: %s", baseWeight);
+
+    Map<Account.Id, MutableDouble> reviewerScores;
+    if (Strings.isNullOrEmpty(query)) {
+      reviewerScores = baseRankingForEmptyQuery(baseWeight);
+    } else {
+      reviewerScores = baseRankingForCandidateList(candidateList, projectState, baseWeight);
+    }
+    logger.atFine().log("Base reviewer scores: %s", reviewerScores);
+
+    // Send the query along with a candidate list to all plugins and merge the
+    // results. Plugins don't necessarily need to use the candidates list, they
+    // can also return non-candidate account ids.
+    List<Callable<Set<SuggestedReviewer>>> tasks =
+        new ArrayList<>(reviewerSuggestionPluginMap.plugins().size());
+    List<Double> weights = new ArrayList<>(reviewerSuggestionPluginMap.plugins().size());
+
+    reviewerSuggestionPluginMap.runEach(
+        extension -> {
+          tasks.add(
+              () ->
+                  extension
+                      .get()
+                      .suggestReviewers(
+                          projectState.getNameKey(),
+                          changeNotes != null ? changeNotes.getChangeId() : null,
+                          query,
+                          reviewerScores.keySet()));
+          String key = extension.getPluginName() + "-" + extension.getExportName();
+          String pluginWeight = config.getString("addReviewer", key, "weight");
+          if (Strings.isNullOrEmpty(pluginWeight)) {
+            pluginWeight = "1";
+          }
+          logger.atFine().log("weight for %s: %s", key, pluginWeight);
+          try {
+            weights.add(Double.parseDouble(pluginWeight));
+          } catch (NumberFormatException e) {
+            logger.atSevere().withCause(e).log("Exception while parsing weight for %s", key);
+            weights.add(1d);
+          }
+        });
+
+    try {
+      List<Future<Set<SuggestedReviewer>>> futures =
+          executor.invokeAll(tasks, PLUGIN_QUERY_TIMEOUT, TimeUnit.MILLISECONDS);
+      Iterator<Double> weightIterator = weights.iterator();
+      for (Future<Set<SuggestedReviewer>> f : futures) {
+        double weight = weightIterator.next();
+        for (SuggestedReviewer s : f.get()) {
+          if (reviewerScores.containsKey(s.account)) {
+            reviewerScores.get(s.account).add(s.score * weight);
+          } else {
+            reviewerScores.put(s.account, new MutableDouble(s.score * weight));
+          }
+        }
+      }
+      logger.atFine().log("Reviewer scores: %s", reviewerScores);
+    } catch (ExecutionException | InterruptedException e) {
+      logger.atSevere().withCause(e).log("Exception while suggesting reviewers");
+      return ImmutableList.of();
+    }
+
+    if (changeNotes != null) {
+      // Remove change owner
+      if (reviewerScores.remove(changeNotes.getChange().getOwner()) != null) {
+        logger.atFine().log("Remove change owner %s", changeNotes.getChange().getOwner());
+      }
+
+      // Remove existing reviewers
+      approvalsUtil
+          .getReviewers(dbProvider.get(), changeNotes)
+          .byState(REVIEWER)
+          .forEach(
+              r -> {
+                if (reviewerScores.remove(r) != null) {
+                  logger.atFine().log("Remove existing reviewer %s", r);
+                }
+              });
+    }
+
+    // Sort results
+    Stream<Entry<Account.Id, MutableDouble>> sorted =
+        reviewerScores.entrySet().stream()
+            .sorted(Collections.reverseOrder(Map.Entry.comparingByValue()));
+    List<Account.Id> sortedSuggestions = sorted.map(Map.Entry::getKey).collect(toList());
+    logger.atFine().log("Sorted suggestions: %s", sortedSuggestions);
+    return sortedSuggestions;
+  }
+
+  private Map<Account.Id, MutableDouble> baseRankingForEmptyQuery(double baseWeight)
+      throws OrmException, IOException, ConfigInvalidException {
+    // Get the user's last 25 changes, check approvals
+    try {
+      List<ChangeData> result =
+          queryProvider
+              .get()
+              .setLimit(25)
+              .setRequestedFields(ChangeField.APPROVAL)
+              .query(changeQueryBuilder.owner("self"));
+      Map<Account.Id, MutableDouble> suggestions = new HashMap<>();
+      for (ChangeData cd : result) {
+        for (PatchSetApproval approval : cd.currentApprovals()) {
+          Account.Id id = approval.getAccountId();
+          if (suggestions.containsKey(id)) {
+            suggestions.get(id).add(baseWeight);
+          } else {
+            suggestions.put(id, new MutableDouble(baseWeight));
+          }
+        }
+      }
+      return suggestions;
+    } catch (QueryParseException e) {
+      // Unhandled, because owner:self will never provoke a QueryParseException
+      logger.atSevere().withCause(e).log("Exception while suggesting reviewers");
+      return ImmutableMap.of();
+    }
+  }
+
+  private Map<Account.Id, MutableDouble> baseRankingForCandidateList(
+      List<Account.Id> candidates, ProjectState projectState, double baseWeight)
+      throws OrmException, IOException, ConfigInvalidException {
+    // Get each reviewer's activity based on number of applied labels
+    // (weighted 10d), number of comments (weighted 0.5d) and number of owned
+    // changes (weighted 1d).
+    Map<Account.Id, MutableDouble> reviewers = new LinkedHashMap<>();
+    if (candidates.size() == 0) {
+      return reviewers;
+    }
+    List<Predicate<ChangeData>> predicates = new ArrayList<>();
+    for (Account.Id id : candidates) {
+      try {
+        Predicate<ChangeData> projectQuery = changeQueryBuilder.project(projectState.getName());
+
+        // Get all labels for this project and create a compound OR query to
+        // fetch all changes where users have applied one of these labels
+        List<LabelType> labelTypes = projectState.getLabelTypes().getLabelTypes();
+        List<Predicate<ChangeData>> labelPredicates = new ArrayList<>(labelTypes.size());
+        for (LabelType type : labelTypes) {
+          labelPredicates.add(changeQueryBuilder.label(type.getName() + ",user=" + id));
+        }
+        Predicate<ChangeData> reviewerQuery =
+            Predicate.and(projectQuery, Predicate.or(labelPredicates));
+
+        Predicate<ChangeData> ownerQuery =
+            Predicate.and(projectQuery, changeQueryBuilder.owner(id.toString()));
+        Predicate<ChangeData> commentedByQuery =
+            Predicate.and(projectQuery, changeQueryBuilder.commentby(id.toString()));
+
+        predicates.add(reviewerQuery);
+        predicates.add(ownerQuery);
+        predicates.add(commentedByQuery);
+        reviewers.put(id, new MutableDouble());
+      } catch (QueryParseException e) {
+        // Unhandled: If an exception is thrown, we won't increase the
+        // candidates's score
+        logger.atSevere().withCause(e).log("Exception while suggesting reviewers");
+      }
+    }
+
+    List<List<ChangeData>> result = queryProvider.get().setLimit(25).noFields().query(predicates);
+
+    Iterator<List<ChangeData>> queryResultIterator = result.iterator();
+    Iterator<Account.Id> reviewersIterator = reviewers.keySet().iterator();
+
+    int i = 0;
+    Account.Id currentId = null;
+    while (queryResultIterator.hasNext()) {
+      List<ChangeData> currentResult = queryResultIterator.next();
+      if (i % WEIGHTS.length == 0) {
+        currentId = reviewersIterator.next();
+      }
+
+      reviewers.get(currentId).add(WEIGHTS[i % WEIGHTS.length] * baseWeight * currentResult.size());
+      i++;
+    }
+    return reviewers;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/Reviewers.java b/java/com/google/gerrit/server/restapi/change/Reviewers.java
new file mode 100644
index 0000000..f0aef13
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/Reviewers.java
@@ -0,0 +1,104 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ChildCollection;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.ReviewerResource;
+import com.google.gerrit.server.restapi.account.AccountsCollection;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Collection;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class Reviewers implements ChildCollection<ChangeResource, ReviewerResource> {
+  private final DynamicMap<RestView<ReviewerResource>> views;
+  private final Provider<ReviewDb> dbProvider;
+  private final ApprovalsUtil approvalsUtil;
+  private final AccountsCollection accounts;
+  private final ReviewerResource.Factory resourceFactory;
+  private final ListReviewers list;
+
+  @Inject
+  Reviewers(
+      Provider<ReviewDb> dbProvider,
+      ApprovalsUtil approvalsUtil,
+      AccountsCollection accounts,
+      ReviewerResource.Factory resourceFactory,
+      DynamicMap<RestView<ReviewerResource>> views,
+      ListReviewers list) {
+    this.dbProvider = dbProvider;
+    this.approvalsUtil = approvalsUtil;
+    this.accounts = accounts;
+    this.resourceFactory = resourceFactory;
+    this.views = views;
+    this.list = list;
+  }
+
+  @Override
+  public DynamicMap<RestView<ReviewerResource>> views() {
+    return views;
+  }
+
+  @Override
+  public RestView<ChangeResource> list() {
+    return list;
+  }
+
+  @Override
+  public ReviewerResource parse(ChangeResource rsrc, IdString id)
+      throws OrmException, ResourceNotFoundException, AuthException, IOException,
+          ConfigInvalidException {
+    Address address = Address.tryParse(id.get());
+
+    Account.Id accountId = null;
+    try {
+      accountId = accounts.parse(TopLevelResource.INSTANCE, id).getUser().getAccountId();
+    } catch (ResourceNotFoundException e) {
+      if (address == null) {
+        throw e;
+      }
+    }
+    // See if the id exists as a reviewer for this change
+    if (accountId != null && fetchAccountIds(rsrc).contains(accountId)) {
+      return resourceFactory.create(rsrc, accountId);
+    }
+
+    // See if the address exists as a reviewer on the change
+    if (address != null && rsrc.getNotes().getReviewersByEmail().all().contains(address)) {
+      return new ReviewerResource(rsrc, address);
+    }
+
+    throw new ResourceNotFoundException(id);
+  }
+
+  private Collection<Account.Id> fetchAccountIds(ChangeResource rsrc) throws OrmException {
+    return approvalsUtil.getReviewers(dbProvider.get(), rsrc.getNotes()).all();
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/ReviewersUtil.java b/java/com/google/gerrit/server/restapi/change/ReviewersUtil.java
new file mode 100644
index 0000000..1c97431
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/ReviewersUtil.java
@@ -0,0 +1,445 @@
+// 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.
+
+package com.google.gerrit.server.restapi.change;
+
+import static com.google.common.flogger.LazyArgs.lazy;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.extensions.common.GroupBaseInfo;
+import com.google.gerrit.extensions.common.SuggestedReviewerInfo;
+import com.google.gerrit.extensions.restapi.Url;
+import com.google.gerrit.index.IndexConfig;
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.query.FieldBundle;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.metrics.Description;
+import com.google.gerrit.metrics.Description.Units;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.metrics.Timer0;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.AccountControl;
+import com.google.gerrit.server.account.AccountDirectory.FillOptions;
+import com.google.gerrit.server.account.AccountLoader;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.account.GroupMembers;
+import com.google.gerrit.server.change.ReviewerAdder;
+import com.google.gerrit.server.index.account.AccountField;
+import com.google.gerrit.server.index.account.AccountIndexCollection;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.NoSuchProjectException;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.query.account.AccountPredicates;
+import com.google.gerrit.server.query.account.AccountQueryBuilder;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.ResultSet;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+public class ReviewersUtil {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  @Singleton
+  private static class Metrics {
+    final Timer0 queryAccountsLatency;
+    final Timer0 recommendAccountsLatency;
+    final Timer0 loadAccountsLatency;
+    final Timer0 queryGroupsLatency;
+    final Timer0 filterVisibility;
+
+    @Inject
+    Metrics(MetricMaker metricMaker) {
+      queryAccountsLatency =
+          metricMaker.newTimer(
+              "reviewer_suggestion/query_accounts",
+              new Description("Latency for querying accounts for reviewer suggestion")
+                  .setCumulative()
+                  .setUnit(Units.MILLISECONDS));
+      recommendAccountsLatency =
+          metricMaker.newTimer(
+              "reviewer_suggestion/recommend_accounts",
+              new Description("Latency for recommending accounts for reviewer suggestion")
+                  .setCumulative()
+                  .setUnit(Units.MILLISECONDS));
+      loadAccountsLatency =
+          metricMaker.newTimer(
+              "reviewer_suggestion/load_accounts",
+              new Description("Latency for loading accounts for reviewer suggestion")
+                  .setCumulative()
+                  .setUnit(Units.MILLISECONDS));
+      queryGroupsLatency =
+          metricMaker.newTimer(
+              "reviewer_suggestion/query_groups",
+              new Description("Latency for querying groups for reviewer suggestion")
+                  .setCumulative()
+                  .setUnit(Units.MILLISECONDS));
+      filterVisibility =
+          metricMaker.newTimer(
+              "reviewer_suggestion/filter_visibility",
+              new Description("Latency for removing users that can't see the change")
+                  .setCumulative()
+                  .setUnit(Units.MILLISECONDS));
+    }
+  }
+
+  // Generate a candidate list at 2x the size of what the user wants to see to
+  // give the ranking algorithm a good set of candidates it can work with
+  private static final int CANDIDATE_LIST_MULTIPLIER = 2;
+
+  private final AccountLoader.Factory accountLoaderFactory;
+  private final AccountQueryBuilder accountQueryBuilder;
+  private final GroupBackend groupBackend;
+  private final GroupMembers groupMembers;
+  private final ReviewerRecommender reviewerRecommender;
+  private final Metrics metrics;
+  private final AccountIndexCollection accountIndexes;
+  private final IndexConfig indexConfig;
+  private final AccountControl.Factory accountControlFactory;
+  private final Provider<CurrentUser> self;
+
+  @Inject
+  ReviewersUtil(
+      AccountLoader.Factory accountLoaderFactory,
+      AccountQueryBuilder accountQueryBuilder,
+      GroupBackend groupBackend,
+      GroupMembers groupMembers,
+      ReviewerRecommender reviewerRecommender,
+      Metrics metrics,
+      AccountIndexCollection accountIndexes,
+      IndexConfig indexConfig,
+      AccountControl.Factory accountControlFactory,
+      Provider<CurrentUser> self) {
+    this.accountLoaderFactory = accountLoaderFactory;
+    this.accountQueryBuilder = accountQueryBuilder;
+    this.groupBackend = groupBackend;
+    this.groupMembers = groupMembers;
+    this.reviewerRecommender = reviewerRecommender;
+    this.metrics = metrics;
+    this.accountIndexes = accountIndexes;
+    this.indexConfig = indexConfig;
+    this.accountControlFactory = accountControlFactory;
+    this.self = self;
+  }
+
+  public interface VisibilityControl {
+    boolean isVisibleTo(Account.Id account) throws OrmException;
+  }
+
+  public List<SuggestedReviewerInfo> suggestReviewers(
+      @Nullable ChangeNotes changeNotes,
+      SuggestReviewers suggestReviewers,
+      ProjectState projectState,
+      VisibilityControl visibilityControl,
+      boolean excludeGroups)
+      throws IOException, OrmException, ConfigInvalidException, PermissionBackendException {
+    CurrentUser currentUser = self.get();
+    if (changeNotes != null) {
+      logger.atFine().log(
+          "Suggesting reviewers for change %s to user %s.",
+          changeNotes.getChangeId().get(), currentUser.getLoggableName());
+    } else {
+      logger.atFine().log(
+          "Suggesting default reviewers for project %s to user %s.",
+          projectState.getName(), currentUser.getLoggableName());
+    }
+
+    String query = suggestReviewers.getQuery();
+    logger.atFine().log("Query: %s", query);
+    int limit = suggestReviewers.getLimit();
+
+    if (!suggestReviewers.getSuggestAccounts()) {
+      logger.atFine().log("Reviewer suggestion is disabled.");
+      return Collections.emptyList();
+    }
+
+    List<Account.Id> candidateList = new ArrayList<>();
+    if (!Strings.isNullOrEmpty(query)) {
+      candidateList = suggestAccounts(suggestReviewers);
+      logger.atFine().log("Candidate list: %s", candidateList);
+    }
+
+    List<Account.Id> sortedRecommendations =
+        recommendAccounts(changeNotes, suggestReviewers, projectState, candidateList);
+    logger.atFine().log("Sorted recommendations: %s", sortedRecommendations);
+
+    // Filter accounts by visibility and enforce limit
+    List<Account.Id> filteredRecommendations = new ArrayList<>();
+    try (Timer0.Context ctx = metrics.filterVisibility.start()) {
+      for (Account.Id reviewer : sortedRecommendations) {
+        if (filteredRecommendations.size() >= limit) {
+          break;
+        }
+        // Check if change is visible to reviewer and if the current user can see reviewer
+        if (visibilityControl.isVisibleTo(reviewer)
+            && accountControlFactory.get().canSee(reviewer)) {
+          filteredRecommendations.add(reviewer);
+        }
+      }
+    }
+    logger.atFine().log("Filtered recommendations: %s", filteredRecommendations);
+
+    List<SuggestedReviewerInfo> suggestedReviewers =
+        suggestReviewers(
+            suggestReviewers,
+            projectState,
+            visibilityControl,
+            excludeGroups,
+            filteredRecommendations);
+    logger.atFine().log(
+        "Suggested reviewers: %s", lazy(() -> formatSuggestedReviewers(suggestedReviewers)));
+    return suggestedReviewers;
+  }
+
+  private List<Account.Id> suggestAccounts(SuggestReviewers suggestReviewers) throws OrmException {
+    try (Timer0.Context ctx = metrics.queryAccountsLatency.start()) {
+      try {
+        // For performance reasons we don't use AccountQueryProvider as it would always load the
+        // complete account from the cache (or worse, from NoteDb) even though we only need the ID
+        // which we can directly get from the returned results.
+        Predicate<AccountState> pred =
+            Predicate.and(
+                AccountPredicates.isActive(),
+                accountQueryBuilder.defaultQuery(suggestReviewers.getQuery()));
+        logger.atFine().log("accounts index query: %s", pred);
+        ResultSet<FieldBundle> result =
+            accountIndexes
+                .getSearchIndex()
+                .getSource(
+                    pred,
+                    QueryOptions.create(
+                        indexConfig,
+                        0,
+                        suggestReviewers.getLimit() * CANDIDATE_LIST_MULTIPLIER,
+                        ImmutableSet.of(AccountField.ID.getName())))
+                .readRaw();
+        List<Account.Id> matches =
+            result.toList().stream()
+                .map(f -> new Account.Id(f.getValue(AccountField.ID).intValue()))
+                .collect(toList());
+        logger.atFine().log("Matches: %s", matches);
+        return matches;
+      } catch (QueryParseException e) {
+        return ImmutableList.of();
+      }
+    }
+  }
+
+  private List<SuggestedReviewerInfo> suggestReviewers(
+      SuggestReviewers suggestReviewers,
+      ProjectState projectState,
+      VisibilityControl visibilityControl,
+      boolean excludeGroups,
+      List<Account.Id> filteredRecommendations)
+      throws OrmException, PermissionBackendException, IOException {
+    List<SuggestedReviewerInfo> suggestedReviewers = loadAccounts(filteredRecommendations);
+
+    int limit = suggestReviewers.getLimit();
+    if (!excludeGroups
+        && suggestedReviewers.size() < limit
+        && !Strings.isNullOrEmpty(suggestReviewers.getQuery())) {
+      // Add groups at the end as individual accounts are usually more
+      // important.
+      suggestedReviewers.addAll(
+          suggestAccountGroups(
+              suggestReviewers,
+              projectState,
+              visibilityControl,
+              limit - suggestedReviewers.size()));
+    }
+
+    if (suggestedReviewers.size() > limit) {
+      suggestedReviewers = suggestedReviewers.subList(0, limit);
+      logger.atFine().log("Limited suggested reviewers to %d accounts.", limit);
+    }
+    return suggestedReviewers;
+  }
+
+  private List<Account.Id> recommendAccounts(
+      @Nullable ChangeNotes changeNotes,
+      SuggestReviewers suggestReviewers,
+      ProjectState projectState,
+      List<Account.Id> candidateList)
+      throws OrmException, IOException, ConfigInvalidException {
+    try (Timer0.Context ctx = metrics.recommendAccountsLatency.start()) {
+      return reviewerRecommender.suggestReviewers(
+          changeNotes, suggestReviewers, projectState, candidateList);
+    }
+  }
+
+  private List<SuggestedReviewerInfo> loadAccounts(List<Account.Id> accountIds)
+      throws PermissionBackendException {
+    Set<FillOptions> fillOptions =
+        Sets.union(AccountLoader.DETAILED_OPTIONS, EnumSet.of(FillOptions.SECONDARY_EMAILS));
+    AccountLoader accountLoader = accountLoaderFactory.create(fillOptions);
+
+    try (Timer0.Context ctx = metrics.loadAccountsLatency.start()) {
+      List<SuggestedReviewerInfo> reviewer =
+          accountIds.stream()
+              .map(accountLoader::get)
+              .filter(Objects::nonNull)
+              .map(
+                  a -> {
+                    SuggestedReviewerInfo info = new SuggestedReviewerInfo();
+                    info.account = a;
+                    info.count = 1;
+                    return info;
+                  })
+              .collect(toList());
+      accountLoader.fill();
+      return reviewer;
+    }
+  }
+
+  private List<SuggestedReviewerInfo> suggestAccountGroups(
+      SuggestReviewers suggestReviewers,
+      ProjectState projectState,
+      VisibilityControl visibilityControl,
+      int limit)
+      throws OrmException, IOException {
+    try (Timer0.Context ctx = metrics.queryGroupsLatency.start()) {
+      List<SuggestedReviewerInfo> groups = new ArrayList<>();
+      for (GroupReference g : suggestAccountGroups(suggestReviewers, projectState)) {
+        GroupAsReviewer result =
+            suggestGroupAsReviewer(
+                suggestReviewers, projectState.getProject(), g, visibilityControl);
+        if (result.allowed || result.allowedWithConfirmation) {
+          GroupBaseInfo info = new GroupBaseInfo();
+          info.id = Url.encode(g.getUUID().get());
+          info.name = g.getName();
+          SuggestedReviewerInfo suggestedReviewerInfo = new SuggestedReviewerInfo();
+          suggestedReviewerInfo.group = info;
+          suggestedReviewerInfo.count = result.size;
+          if (result.allowedWithConfirmation) {
+            suggestedReviewerInfo.confirm = true;
+          }
+          groups.add(suggestedReviewerInfo);
+          if (groups.size() >= limit) {
+            break;
+          }
+        }
+      }
+      return groups;
+    }
+  }
+
+  private List<GroupReference> suggestAccountGroups(
+      SuggestReviewers suggestReviewers, ProjectState projectState) {
+    return Lists.newArrayList(
+        Iterables.limit(
+            groupBackend.suggest(suggestReviewers.getQuery(), projectState),
+            suggestReviewers.getLimit()));
+  }
+
+  private static class GroupAsReviewer {
+    boolean allowed;
+    boolean allowedWithConfirmation;
+    int size;
+  }
+
+  private GroupAsReviewer suggestGroupAsReviewer(
+      SuggestReviewers suggestReviewers,
+      Project project,
+      GroupReference group,
+      VisibilityControl visibilityControl)
+      throws OrmException, IOException {
+    GroupAsReviewer result = new GroupAsReviewer();
+    int maxAllowed = suggestReviewers.getMaxAllowed();
+    int maxAllowedWithoutConfirmation = suggestReviewers.getMaxAllowedWithoutConfirmation();
+    logger.atFine().log("maxAllowedWithoutConfirmation: " + maxAllowedWithoutConfirmation);
+
+    if (!ReviewerAdder.isLegalReviewerGroup(group.getUUID())) {
+      logger.atFine().log("Ignore group %s that is not legal as reviewer", group.getUUID());
+      return result;
+    }
+
+    try {
+      Set<Account> members = groupMembers.listAccounts(group.getUUID(), project.getNameKey());
+
+      if (members.isEmpty()) {
+        logger.atFine().log("Ignore group %s since it has no members", group.getUUID());
+        return result;
+      }
+
+      result.size = members.size();
+      if (maxAllowed > 0 && result.size > maxAllowed) {
+        return result;
+      }
+
+      boolean needsConfirmation = result.size > maxAllowedWithoutConfirmation;
+      if (needsConfirmation) {
+        logger.atFine().log(
+            "group %s needs confirmation to be added as reviewer, it has %d members",
+            group.getUUID(), result.size);
+      }
+
+      // require that at least one member in the group can see the change
+      for (Account account : members) {
+        if (visibilityControl.isVisibleTo(account.getId())) {
+          if (needsConfirmation) {
+            result.allowedWithConfirmation = true;
+          } else {
+            result.allowed = true;
+          }
+          logger.atFine().log("Suggest group %s", group.getUUID());
+          return result;
+        }
+      }
+      logger.atFine().log(
+          "Ignore group %s since none of its members can see the change", group.getUUID());
+    } catch (NoSuchProjectException e) {
+      return result;
+    }
+
+    return result;
+  }
+
+  private static String formatSuggestedReviewers(List<SuggestedReviewerInfo> suggestedReviewers) {
+    return suggestedReviewers.stream()
+        .map(
+            r -> {
+              if (r.account != null) {
+                return "a/" + r.account._accountId;
+              } else if (r.group != null) {
+                return "g/" + r.group.id;
+              } else {
+                return "";
+              }
+            })
+        .collect(toList())
+        .toString();
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/RevisionReviewers.java b/java/com/google/gerrit/server/restapi/change/RevisionReviewers.java
new file mode 100644
index 0000000..b9b7a4f
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/RevisionReviewers.java
@@ -0,0 +1,106 @@
+// Copyright (C) 2017 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.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ChildCollection;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.change.ReviewerResource;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.restapi.account.AccountsCollection;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Collection;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class RevisionReviewers implements ChildCollection<RevisionResource, ReviewerResource> {
+  private final DynamicMap<RestView<ReviewerResource>> views;
+  private final Provider<ReviewDb> dbProvider;
+  private final ApprovalsUtil approvalsUtil;
+  private final AccountsCollection accounts;
+  private final ReviewerResource.Factory resourceFactory;
+  private final ListRevisionReviewers list;
+
+  @Inject
+  RevisionReviewers(
+      Provider<ReviewDb> dbProvider,
+      ApprovalsUtil approvalsUtil,
+      AccountsCollection accounts,
+      ReviewerResource.Factory resourceFactory,
+      DynamicMap<RestView<ReviewerResource>> views,
+      ListRevisionReviewers list) {
+    this.dbProvider = dbProvider;
+    this.approvalsUtil = approvalsUtil;
+    this.accounts = accounts;
+    this.resourceFactory = resourceFactory;
+    this.views = views;
+    this.list = list;
+  }
+
+  @Override
+  public DynamicMap<RestView<ReviewerResource>> views() {
+    return views;
+  }
+
+  @Override
+  public RestView<RevisionResource> list() {
+    return list;
+  }
+
+  @Override
+  public ReviewerResource parse(RevisionResource rsrc, IdString id)
+      throws OrmException, ResourceNotFoundException, AuthException, MethodNotAllowedException,
+          IOException, ConfigInvalidException {
+    if (!rsrc.isCurrent()) {
+      throw new MethodNotAllowedException("Cannot access on non-current patch set");
+    }
+    Address address = Address.tryParse(id.get());
+
+    Account.Id accountId = null;
+    try {
+      accountId = accounts.parse(TopLevelResource.INSTANCE, id).getUser().getAccountId();
+    } catch (ResourceNotFoundException e) {
+      if (address == null) {
+        throw e;
+      }
+    }
+    Collection<Account.Id> reviewers =
+        approvalsUtil.getReviewers(dbProvider.get(), rsrc.getNotes()).all();
+    // See if the id exists as a reviewer for this change
+    if (reviewers.contains(accountId)) {
+      return resourceFactory.create(rsrc, accountId);
+    }
+
+    // See if the address exists as a reviewer on the change
+    if (address != null && rsrc.getNotes().getReviewersByEmail().all().contains(address)) {
+      return new ReviewerResource(rsrc, address);
+    }
+
+    throw new ResourceNotFoundException(id);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/Revisions.java b/java/com/google/gerrit/server/restapi/change/Revisions.java
new file mode 100644
index 0000000..557d77a
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/Revisions.java
@@ -0,0 +1,177 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.change;
+
+import com.google.common.base.Joiner;
+import com.google.common.collect.Lists;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ChildCollection;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.RevId;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.edit.ChangeEdit;
+import com.google.gerrit.server.edit.ChangeEditUtil;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import org.eclipse.jgit.lib.ObjectId;
+
+@Singleton
+public class Revisions implements ChildCollection<ChangeResource, RevisionResource> {
+  private final DynamicMap<RestView<RevisionResource>> views;
+  private final Provider<ReviewDb> dbProvider;
+  private final ChangeEditUtil editUtil;
+  private final PatchSetUtil psUtil;
+  private final PermissionBackend permissionBackend;
+  private final ProjectCache projectCache;
+
+  @Inject
+  Revisions(
+      DynamicMap<RestView<RevisionResource>> views,
+      Provider<ReviewDb> dbProvider,
+      ChangeEditUtil editUtil,
+      PatchSetUtil psUtil,
+      PermissionBackend permissionBackend,
+      ProjectCache projectCache) {
+    this.views = views;
+    this.dbProvider = dbProvider;
+    this.editUtil = editUtil;
+    this.psUtil = psUtil;
+    this.permissionBackend = permissionBackend;
+    this.projectCache = projectCache;
+  }
+
+  @Override
+  public DynamicMap<RestView<RevisionResource>> views() {
+    return views;
+  }
+
+  @Override
+  public RestView<ChangeResource> list() throws ResourceNotFoundException {
+    throw new ResourceNotFoundException();
+  }
+
+  @Override
+  public RevisionResource parse(ChangeResource change, IdString id)
+      throws ResourceNotFoundException, AuthException, OrmException, IOException,
+          PermissionBackendException {
+    if (id.get().equals("current")) {
+      PatchSet ps = psUtil.current(dbProvider.get(), change.getNotes());
+      if (ps != null && visible(change)) {
+        return RevisionResource.createNonCachable(change, ps);
+      }
+      throw new ResourceNotFoundException(id);
+    }
+
+    List<RevisionResource> match = Lists.newArrayListWithExpectedSize(2);
+    for (RevisionResource rsrc : find(change, id.get())) {
+      if (visible(change)) {
+        match.add(rsrc);
+      }
+    }
+    switch (match.size()) {
+      case 0:
+        throw new ResourceNotFoundException(id);
+      case 1:
+        return match.get(0);
+      default:
+        throw new ResourceNotFoundException(
+            "Multiple patch sets for \"" + id.get() + "\": " + Joiner.on("; ").join(match));
+    }
+  }
+
+  private boolean visible(ChangeResource change) throws PermissionBackendException, IOException {
+    try {
+      permissionBackend
+          .user(change.getUser())
+          .change(change.getNotes())
+          .database(dbProvider)
+          .check(ChangePermission.READ);
+      return projectCache.checkedGet(change.getProject()).statePermitsRead();
+    } catch (AuthException e) {
+      return false;
+    }
+  }
+
+  private List<RevisionResource> find(ChangeResource change, String id)
+      throws OrmException, IOException, AuthException {
+    if (id.equals("0") || id.equals("edit")) {
+      return loadEdit(change, null);
+    } else if (id.length() < 6 && id.matches("^[1-9][0-9]{0,4}$")) {
+      // Legacy patch set number syntax.
+      return byLegacyPatchSetId(change, id);
+    } else if (id.length() < 4 || id.length() > RevId.LEN) {
+      // Require a minimum of 4 digits.
+      // Impossibly long identifier will never match.
+      return Collections.emptyList();
+    } else {
+      List<RevisionResource> out = new ArrayList<>();
+      for (PatchSet ps : psUtil.byChange(dbProvider.get(), change.getNotes())) {
+        if (ps.getRevision() != null && ps.getRevision().get().startsWith(id)) {
+          out.add(new RevisionResource(change, ps));
+        }
+      }
+      // Not an existing patch set on a change, but might be an edit.
+      if (out.isEmpty() && id.length() == RevId.LEN) {
+        return loadEdit(change, new RevId(id));
+      }
+      return out;
+    }
+  }
+
+  private List<RevisionResource> byLegacyPatchSetId(ChangeResource change, String id)
+      throws OrmException {
+    PatchSet ps =
+        psUtil.get(
+            dbProvider.get(),
+            change.getNotes(),
+            new PatchSet.Id(change.getId(), Integer.parseInt(id)));
+    if (ps != null) {
+      return Collections.singletonList(new RevisionResource(change, ps));
+    }
+    return Collections.emptyList();
+  }
+
+  private List<RevisionResource> loadEdit(ChangeResource change, RevId revid)
+      throws AuthException, IOException {
+    Optional<ChangeEdit> edit = editUtil.byChange(change.getNotes(), change.getUser());
+    if (edit.isPresent()) {
+      PatchSet ps = new PatchSet(new PatchSet.Id(change.getId(), 0));
+      RevId editRevId = new RevId(ObjectId.toString(edit.get().getEditCommit()));
+      ps.setRevision(editRevId);
+      if (revid == null || editRevId.equals(revid)) {
+        return Collections.singletonList(new RevisionResource(change, ps, edit));
+      }
+    }
+    return Collections.emptyList();
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/RobotComments.java b/java/com/google/gerrit/server/restapi/change/RobotComments.java
new file mode 100644
index 0000000..6570ae0
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/RobotComments.java
@@ -0,0 +1,70 @@
+// 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.
+
+package com.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.ChildCollection;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.reviewdb.client.RobotComment;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.change.RobotCommentResource;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class RobotComments implements ChildCollection<RevisionResource, RobotCommentResource> {
+  private final DynamicMap<RestView<RobotCommentResource>> views;
+  private final ListRobotComments list;
+  private final CommentsUtil commentsUtil;
+
+  @Inject
+  RobotComments(
+      DynamicMap<RestView<RobotCommentResource>> views,
+      ListRobotComments list,
+      CommentsUtil commentsUtil) {
+    this.views = views;
+    this.list = list;
+    this.commentsUtil = commentsUtil;
+  }
+
+  @Override
+  public DynamicMap<RestView<RobotCommentResource>> views() {
+    return views;
+  }
+
+  @Override
+  public ListRobotComments list() {
+    return list;
+  }
+
+  @Override
+  public RobotCommentResource parse(RevisionResource rev, IdString id)
+      throws ResourceNotFoundException, OrmException {
+    String uuid = id.get();
+    ChangeNotes notes = rev.getNotes();
+
+    for (RobotComment c : commentsUtil.robotCommentsByPatchSet(notes, rev.getPatchSet().getId())) {
+      if (uuid.equals(c.key.uuid)) {
+        return new RobotCommentResource(rev, c);
+      }
+    }
+    throw new ResourceNotFoundException(id);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/SetReadyForReview.java b/java/com/google/gerrit/server/restapi/change/SetReadyForReview.java
new file mode 100644
index 0000000..f911147
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/SetReadyForReview.java
@@ -0,0 +1,109 @@
+// Copyright (C) 2017 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.google.gerrit.server.restapi.change;
+
+import static com.google.gerrit.extensions.conditions.BooleanCondition.and;
+import static com.google.gerrit.extensions.conditions.BooleanCondition.or;
+
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.webui.UiAction;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Change.Status;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ChangeUtil;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.WorkInProgressOp;
+import com.google.gerrit.server.change.WorkInProgressOp.Input;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestModifyView;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@Singleton
+public class SetReadyForReview extends RetryingRestModifyView<ChangeResource, Input, Response<?>>
+    implements UiAction<ChangeResource> {
+  private final WorkInProgressOp.Factory opFactory;
+  private final Provider<ReviewDb> db;
+  private final PermissionBackend permissionBackend;
+  private final Provider<CurrentUser> user;
+
+  @Inject
+  SetReadyForReview(
+      RetryHelper retryHelper,
+      WorkInProgressOp.Factory opFactory,
+      Provider<ReviewDb> db,
+      PermissionBackend permissionBackend,
+      Provider<CurrentUser> user) {
+    super(retryHelper);
+    this.opFactory = opFactory;
+    this.db = db;
+    this.permissionBackend = permissionBackend;
+    this.user = user;
+  }
+
+  @Override
+  protected Response<?> applyImpl(
+      BatchUpdate.Factory updateFactory, ChangeResource rsrc, Input input)
+      throws RestApiException, UpdateException, PermissionBackendException {
+    WorkInProgressOp.checkPermissions(permissionBackend, user.get(), rsrc.getChange());
+
+    Change change = rsrc.getChange();
+    if (change.getStatus() != Status.NEW) {
+      throw new ResourceConflictException("change is " + ChangeUtil.status(change));
+    }
+
+    if (!change.isWorkInProgress()) {
+      throw new ResourceConflictException("change is not work in progress");
+    }
+
+    try (BatchUpdate bu =
+        updateFactory.create(db.get(), rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
+      bu.addOp(rsrc.getChange().getId(), opFactory.create(false, input));
+      bu.execute();
+      return Response.ok("");
+    }
+  }
+
+  @Override
+  public Description getDescription(ChangeResource rsrc) {
+    return new Description()
+        .setLabel("Start Review")
+        .setTitle("Set Ready For Review")
+        .setVisible(
+            and(
+                rsrc.getChange().getStatus() == Status.NEW && rsrc.getChange().isWorkInProgress(),
+                or(
+                    rsrc.isUserOwner(),
+                    or(
+                        permissionBackend
+                            .currentUser()
+                            .testCond(GlobalPermission.ADMINISTRATE_SERVER),
+                        permissionBackend
+                            .currentUser()
+                            .project(rsrc.getProject())
+                            .testCond(ProjectPermission.WRITE_CONFIG)))));
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/SetWorkInProgress.java b/java/com/google/gerrit/server/restapi/change/SetWorkInProgress.java
new file mode 100644
index 0000000..da5d8bb
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/SetWorkInProgress.java
@@ -0,0 +1,109 @@
+// Copyright (C) 2017 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.google.gerrit.server.restapi.change;
+
+import static com.google.gerrit.extensions.conditions.BooleanCondition.and;
+import static com.google.gerrit.extensions.conditions.BooleanCondition.or;
+
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.webui.UiAction;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Change.Status;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ChangeUtil;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.WorkInProgressOp;
+import com.google.gerrit.server.change.WorkInProgressOp.Input;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestModifyView;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@Singleton
+public class SetWorkInProgress extends RetryingRestModifyView<ChangeResource, Input, Response<?>>
+    implements UiAction<ChangeResource> {
+  private final WorkInProgressOp.Factory opFactory;
+  private final Provider<ReviewDb> db;
+  private final PermissionBackend permissionBackend;
+  private final Provider<CurrentUser> user;
+
+  @Inject
+  SetWorkInProgress(
+      WorkInProgressOp.Factory opFactory,
+      RetryHelper retryHelper,
+      Provider<ReviewDb> db,
+      PermissionBackend permissionBackend,
+      Provider<CurrentUser> user) {
+    super(retryHelper);
+    this.opFactory = opFactory;
+    this.db = db;
+    this.permissionBackend = permissionBackend;
+    this.user = user;
+  }
+
+  @Override
+  protected Response<?> applyImpl(
+      BatchUpdate.Factory updateFactory, ChangeResource rsrc, Input input)
+      throws RestApiException, UpdateException, PermissionBackendException {
+    WorkInProgressOp.checkPermissions(permissionBackend, user.get(), rsrc.getChange());
+
+    Change change = rsrc.getChange();
+    if (change.getStatus() != Status.NEW) {
+      throw new ResourceConflictException("change is " + ChangeUtil.status(change));
+    }
+
+    if (change.isWorkInProgress()) {
+      throw new ResourceConflictException("change is already work in progress");
+    }
+
+    try (BatchUpdate bu =
+        updateFactory.create(db.get(), rsrc.getProject(), rsrc.getUser(), TimeUtil.nowTs())) {
+      bu.addOp(rsrc.getChange().getId(), opFactory.create(true, input));
+      bu.execute();
+      return Response.ok("");
+    }
+  }
+
+  @Override
+  public Description getDescription(ChangeResource rsrc) {
+    return new Description()
+        .setLabel("WIP")
+        .setTitle("Set Work In Progress")
+        .setVisible(
+            and(
+                rsrc.getChange().getStatus() == Status.NEW && !rsrc.getChange().isWorkInProgress(),
+                or(
+                    rsrc.isUserOwner(),
+                    or(
+                        permissionBackend
+                            .currentUser()
+                            .testCond(GlobalPermission.ADMINISTRATE_SERVER),
+                        permissionBackend
+                            .currentUser()
+                            .project(rsrc.getProject())
+                            .testCond(ProjectPermission.WRITE_CONFIG)))));
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/Submit.java b/java/com/google/gerrit/server/restapi/change/Submit.java
new file mode 100644
index 0000000..773d12d
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/Submit.java
@@ -0,0 +1,528 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.change;
+
+import static java.util.stream.Collectors.joining;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Sets;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.ParameterizedString;
+import com.google.gerrit.extensions.api.changes.SubmitInput;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.extensions.webui.UiAction;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RevId;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ChangeUtil;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.ProjectUtil;
+import com.google.gerrit.server.account.AccountResolver;
+import com.google.gerrit.server.change.ChangeJson;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gerrit.server.submit.ChangeSet;
+import com.google.gerrit.server.submit.MergeOp;
+import com.google.gerrit.server.submit.MergeSuperSet;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.OrmRuntimeException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+@Singleton
+public class Submit
+    implements RestModifyView<RevisionResource, SubmitInput>, UiAction<RevisionResource> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final String DEFAULT_TOOLTIP = "Submit patch set ${patchSet} into ${branch}";
+  private static final String DEFAULT_TOOLTIP_ANCESTORS =
+      "Submit patch set ${patchSet} and ancestors (${submitSize} changes "
+          + "altogether) into ${branch}";
+  private static final String DEFAULT_TOPIC_TOOLTIP =
+      "Submit all ${topicSize} changes of the same topic "
+          + "(${submitSize} changes including ancestors and other "
+          + "changes related by topic)";
+  private static final String BLOCKED_HIDDEN_SUBMIT_TOOLTIP =
+      "This change depends on other hidden changes which are not ready";
+  private static final String CLICK_FAILURE_TOOLTIP = "Clicking the button would fail";
+  private static final String CHANGE_UNMERGEABLE = "Problems with integrating this change";
+
+  public static class Output {
+    transient Change change;
+
+    private Output(Change c) {
+      change = c;
+    }
+  }
+
+  private final Provider<ReviewDb> dbProvider;
+  private final GitRepositoryManager repoManager;
+  private final PermissionBackend permissionBackend;
+  private final ChangeData.Factory changeDataFactory;
+  private final ChangeNotes.Factory changeNotesFactory;
+  private final Provider<MergeOp> mergeOpProvider;
+  private final Provider<MergeSuperSet> mergeSuperSet;
+  private final AccountResolver accountResolver;
+  private final String label;
+  private final String labelWithParents;
+  private final ParameterizedString titlePattern;
+  private final ParameterizedString titlePatternWithAncestors;
+  private final String submitTopicLabel;
+  private final ParameterizedString submitTopicTooltip;
+  private final boolean submitWholeTopic;
+  private final Provider<InternalChangeQuery> queryProvider;
+  private final PatchSetUtil psUtil;
+  private final ProjectCache projectCache;
+
+  @Inject
+  Submit(
+      Provider<ReviewDb> dbProvider,
+      GitRepositoryManager repoManager,
+      PermissionBackend permissionBackend,
+      ChangeData.Factory changeDataFactory,
+      ChangeNotes.Factory changeNotesFactory,
+      Provider<MergeOp> mergeOpProvider,
+      Provider<MergeSuperSet> mergeSuperSet,
+      AccountResolver accountResolver,
+      @GerritServerConfig Config cfg,
+      Provider<InternalChangeQuery> queryProvider,
+      PatchSetUtil psUtil,
+      ProjectCache projectCache) {
+    this.dbProvider = dbProvider;
+    this.repoManager = repoManager;
+    this.permissionBackend = permissionBackend;
+    this.changeDataFactory = changeDataFactory;
+    this.changeNotesFactory = changeNotesFactory;
+    this.mergeOpProvider = mergeOpProvider;
+    this.mergeSuperSet = mergeSuperSet;
+    this.accountResolver = accountResolver;
+    this.label =
+        MoreObjects.firstNonNull(
+            Strings.emptyToNull(cfg.getString("change", null, "submitLabel")), "Submit");
+    this.labelWithParents =
+        MoreObjects.firstNonNull(
+            Strings.emptyToNull(cfg.getString("change", null, "submitLabelWithParents")),
+            "Submit including parents");
+    this.titlePattern =
+        new ParameterizedString(
+            MoreObjects.firstNonNull(
+                cfg.getString("change", null, "submitTooltip"), DEFAULT_TOOLTIP));
+    this.titlePatternWithAncestors =
+        new ParameterizedString(
+            MoreObjects.firstNonNull(
+                cfg.getString("change", null, "submitTooltipAncestors"),
+                DEFAULT_TOOLTIP_ANCESTORS));
+    submitWholeTopic = MergeSuperSet.wholeTopicEnabled(cfg);
+    this.submitTopicLabel =
+        MoreObjects.firstNonNull(
+            Strings.emptyToNull(cfg.getString("change", null, "submitTopicLabel")),
+            "Submit whole topic");
+    this.submitTopicTooltip =
+        new ParameterizedString(
+            MoreObjects.firstNonNull(
+                cfg.getString("change", null, "submitTopicTooltip"), DEFAULT_TOPIC_TOOLTIP));
+    this.queryProvider = queryProvider;
+    this.psUtil = psUtil;
+    this.projectCache = projectCache;
+  }
+
+  @Override
+  public Output apply(RevisionResource rsrc, SubmitInput input)
+      throws RestApiException, RepositoryNotFoundException, IOException, OrmException,
+          PermissionBackendException, UpdateException, ConfigInvalidException {
+    input.onBehalfOf = Strings.emptyToNull(input.onBehalfOf);
+    IdentifiedUser submitter;
+    if (input.onBehalfOf != null) {
+      submitter = onBehalfOf(rsrc, input);
+    } else {
+      rsrc.permissions().check(ChangePermission.SUBMIT);
+      submitter = rsrc.getUser().asIdentifiedUser();
+    }
+    projectCache.checkedGet(rsrc.getProject()).checkStatePermitsWrite();
+
+    return new Output(mergeChange(rsrc, submitter, input));
+  }
+
+  public Change mergeChange(RevisionResource rsrc, IdentifiedUser submitter, SubmitInput input)
+      throws OrmException, RestApiException, IOException, UpdateException, ConfigInvalidException,
+          PermissionBackendException {
+    Change change = rsrc.getChange();
+    if (!change.getStatus().isOpen()) {
+      throw new ResourceConflictException("change is " + ChangeUtil.status(change));
+    } else if (!ProjectUtil.branchExists(repoManager, change.getDest())) {
+      throw new ResourceConflictException(
+          String.format("destination branch \"%s\" not found.", change.getDest().get()));
+    } else if (!rsrc.getPatchSet().getId().equals(change.currentPatchSetId())) {
+      // TODO Allow submitting non-current revision by changing the current.
+      throw new ResourceConflictException(
+          String.format(
+              "revision %s is not current revision", rsrc.getPatchSet().getRevision().get()));
+    }
+
+    try (MergeOp op = mergeOpProvider.get()) {
+      ReviewDb db = dbProvider.get();
+      op.merge(db, change, submitter, true, input, false);
+      try {
+        change =
+            changeNotesFactory.createChecked(db, change.getProject(), change.getId()).getChange();
+      } catch (NoSuchChangeException e) {
+        throw new ResourceConflictException("change is deleted");
+      }
+    }
+
+    switch (change.getStatus()) {
+      case MERGED:
+        return change;
+      case NEW:
+        throw new RestApiException(
+            "change unexpectedly had status " + change.getStatus() + " after submit attempt");
+      case ABANDONED:
+      default:
+        throw new ResourceConflictException("change is " + ChangeUtil.status(change));
+    }
+  }
+
+  /**
+   * Returns a message describing what prevents the current change from being submitted - or null.
+   * This method only considers parent changes, and changes in the same topic. The caller is
+   * responsible for making sure the current change to be submitted can indeed be submitted
+   * (permissions, submit rules, is not a WIP...)
+   *
+   * @param cd the change the user is currently looking at
+   * @param cs set of changes to be submitted at once
+   * @param user the user who is checking to submit
+   * @return a reason why any of the changes is not submittable or null
+   */
+  private String problemsForSubmittingChangeset(ChangeData cd, ChangeSet cs, CurrentUser user) {
+    try {
+      if (cs.furtherHiddenChanges()) {
+        logger.atFine().log(
+            "Change %d cannot be submitted by user %s because it depends on hidden changes: %s",
+            cd.getId().get(), user.getLoggableName(), cs.nonVisibleChanges());
+        return BLOCKED_HIDDEN_SUBMIT_TOOLTIP;
+      }
+      for (ChangeData c : cs.changes()) {
+        if (cd.getId().equals(c.getId())) {
+          // We ignore the change about to be submitted, as these checks are already done in the
+          // #apply and #getDescription methods.
+          continue;
+        }
+        Set<ChangePermission> can =
+            permissionBackend
+                .user(user)
+                .database(dbProvider)
+                .change(c)
+                .test(EnumSet.of(ChangePermission.READ, ChangePermission.SUBMIT));
+        if (!can.contains(ChangePermission.READ)) {
+          logger.atFine().log(
+              "Change %d cannot be submitted by user %s because it depends on change %d which the user cannot read",
+              cd.getId().get(), user.getLoggableName(), c.getId().get());
+          return BLOCKED_HIDDEN_SUBMIT_TOOLTIP;
+        }
+        if (!can.contains(ChangePermission.SUBMIT)) {
+          return "You don't have permission to submit change " + c.getId();
+        }
+        if (c.change().isWorkInProgress()) {
+          return "Change " + c.getId() + " is marked work in progress";
+        }
+        try {
+          MergeOp.checkSubmitRule(c, false);
+        } catch (ResourceConflictException e) {
+          return "Change " + c.getId() + " is not ready: " + e.getMessage();
+        }
+      }
+
+      Collection<ChangeData> unmergeable = unmergeableChanges(cs);
+      if (unmergeable == null) {
+        return CLICK_FAILURE_TOOLTIP;
+      } else if (!unmergeable.isEmpty()) {
+        for (ChangeData c : unmergeable) {
+          if (c.change().getKey().equals(cd.change().getKey())) {
+            return CHANGE_UNMERGEABLE;
+          }
+        }
+
+        return "Problems with change(s): "
+            + unmergeable.stream().map(c -> c.getId().toString()).collect(joining(", "));
+      }
+    } catch (PermissionBackendException | OrmException | IOException e) {
+      logger.atSevere().withCause(e).log("Error checking if change is submittable");
+      throw new OrmRuntimeException("Could not determine problems for the change", e);
+    }
+    return null;
+  }
+
+  @Override
+  public UiAction.Description getDescription(RevisionResource resource) {
+    Change change = resource.getChange();
+    if (!change.getStatus().isOpen()
+        || change.isWorkInProgress()
+        || !resource.isCurrent()
+        || !resource.permissions().testOrFalse(ChangePermission.SUBMIT)) {
+      return null; // submit not visible
+    }
+
+    try {
+      if (!projectCache.checkedGet(resource.getProject()).statePermitsWrite()) {
+        return null; // submit not visible
+      }
+    } catch (IOException e) {
+      logger.atSevere().withCause(e).log("Error checking if change is submittable");
+      throw new OrmRuntimeException("Could not determine problems for the change", e);
+    }
+
+    ReviewDb db = dbProvider.get();
+    ChangeData cd = changeDataFactory.create(db, resource.getNotes());
+    try {
+      MergeOp.checkSubmitRule(cd, false);
+    } catch (ResourceConflictException e) {
+      return null; // submit not visible
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log("Error checking if change is submittable");
+      throw new OrmRuntimeException("Could not determine problems for the change", e);
+    }
+
+    ChangeSet cs;
+    try {
+      cs = mergeSuperSet.get().completeChangeSet(db, cd.change(), resource.getUser());
+    } catch (OrmException | IOException | PermissionBackendException e) {
+      throw new OrmRuntimeException(
+          "Could not determine complete set of changes to be submitted", e);
+    }
+
+    String topic = change.getTopic();
+    int topicSize = 0;
+    if (!Strings.isNullOrEmpty(topic)) {
+      topicSize = getChangesByTopic(topic).size();
+    }
+    boolean treatWithTopic = submitWholeTopic && !Strings.isNullOrEmpty(topic) && topicSize > 1;
+
+    String submitProblems = problemsForSubmittingChangeset(cd, cs, resource.getUser());
+
+    Boolean enabled;
+    try {
+      // Recheck mergeability rather than using value stored in the index,
+      // which may be stale.
+      // TODO(dborowitz): This is ugly; consider providing a way to not read
+      // stored fields from the index in the first place.
+      // cd.setMergeable(null);
+      // That was done in unmergeableChanges which was called by
+      // problemsForSubmittingChangeset, so now it is safe to read from
+      // the cache, as it yields the same result.
+      enabled = cd.isMergeable();
+    } catch (OrmException e) {
+      throw new OrmRuntimeException("Could not determine mergeability", e);
+    }
+
+    if (submitProblems != null) {
+      return new UiAction.Description()
+          .setLabel(treatWithTopic ? submitTopicLabel : (cs.size() > 1) ? labelWithParents : label)
+          .setTitle(submitProblems)
+          .setVisible(true)
+          .setEnabled(false);
+    }
+
+    if (treatWithTopic) {
+      Map<String, String> params =
+          ImmutableMap.of(
+              "topicSize", String.valueOf(topicSize),
+              "submitSize", String.valueOf(cs.size()));
+      return new UiAction.Description()
+          .setLabel(submitTopicLabel)
+          .setTitle(Strings.emptyToNull(submitTopicTooltip.replace(params)))
+          .setVisible(true)
+          .setEnabled(Boolean.TRUE.equals(enabled));
+    }
+    RevId revId = resource.getPatchSet().getRevision();
+    Map<String, String> params =
+        ImmutableMap.of(
+            "patchSet", String.valueOf(resource.getPatchSet().getPatchSetId()),
+            "branch", change.getDest().getShortName(),
+            "commit", ObjectId.fromString(revId.get()).abbreviate(7).name(),
+            "submitSize", String.valueOf(cs.size()));
+    ParameterizedString tp = cs.size() > 1 ? titlePatternWithAncestors : titlePattern;
+    return new UiAction.Description()
+        .setLabel(cs.size() > 1 ? labelWithParents : label)
+        .setTitle(Strings.emptyToNull(tp.replace(params)))
+        .setVisible(true)
+        .setEnabled(Boolean.TRUE.equals(enabled));
+  }
+
+  public Collection<ChangeData> unmergeableChanges(ChangeSet cs) throws OrmException, IOException {
+    Set<ChangeData> mergeabilityMap = new HashSet<>();
+    for (ChangeData change : cs.changes()) {
+      mergeabilityMap.add(change);
+    }
+
+    ListMultimap<Branch.NameKey, ChangeData> cbb = cs.changesByBranch();
+    for (Branch.NameKey branch : cbb.keySet()) {
+      Collection<ChangeData> targetBranch = cbb.get(branch);
+      HashMap<Change.Id, RevCommit> commits = findCommits(targetBranch, branch.getParentKey());
+
+      Set<ObjectId> allParents = Sets.newHashSetWithExpectedSize(cs.size());
+      for (RevCommit commit : commits.values()) {
+        for (RevCommit parent : commit.getParents()) {
+          allParents.add(parent.getId());
+        }
+      }
+
+      for (ChangeData change : targetBranch) {
+        RevCommit commit = commits.get(change.getId());
+        boolean isMergeCommit = commit.getParentCount() > 1;
+        boolean isLastInChain = !allParents.contains(commit.getId());
+
+        // Recheck mergeability rather than using value stored in the index,
+        // which may be stale.
+        // TODO(dborowitz): This is ugly; consider providing a way to not read
+        // stored fields from the index in the first place.
+        change.setMergeable(null);
+        Boolean mergeable = change.isMergeable();
+        if (mergeable == null) {
+          // Skip whole check, cannot determine if mergeable
+          return null;
+        }
+        if (mergeable) {
+          mergeabilityMap.remove(change);
+        }
+
+        if (isLastInChain && isMergeCommit && mergeable) {
+          for (ChangeData c : targetBranch) {
+            mergeabilityMap.remove(c);
+          }
+          break;
+        }
+      }
+    }
+    return mergeabilityMap;
+  }
+
+  private HashMap<Change.Id, RevCommit> findCommits(
+      Collection<ChangeData> changes, Project.NameKey project) throws IOException, OrmException {
+    HashMap<Change.Id, RevCommit> commits = new HashMap<>();
+    try (Repository repo = repoManager.openRepository(project);
+        RevWalk walk = new RevWalk(repo)) {
+      for (ChangeData change : changes) {
+        RevCommit commit =
+            walk.parseCommit(
+                ObjectId.fromString(
+                    psUtil.current(dbProvider.get(), change.notes()).getRevision().get()));
+        commits.put(change.getId(), commit);
+      }
+    }
+    return commits;
+  }
+
+  private IdentifiedUser onBehalfOf(RevisionResource rsrc, SubmitInput in)
+      throws AuthException, UnprocessableEntityException, OrmException, PermissionBackendException,
+          IOException, ConfigInvalidException {
+    PermissionBackend.ForChange perm = rsrc.permissions().database(dbProvider);
+    perm.check(ChangePermission.SUBMIT);
+    perm.check(ChangePermission.SUBMIT_AS);
+
+    CurrentUser caller = rsrc.getUser();
+    IdentifiedUser submitter = accountResolver.parseOnBehalfOf(caller, in.onBehalfOf);
+    try {
+      permissionBackend
+          .user(submitter)
+          .database(dbProvider)
+          .change(rsrc.getNotes())
+          .check(ChangePermission.READ);
+    } catch (AuthException e) {
+      throw new UnprocessableEntityException(
+          String.format("on_behalf_of account %s cannot see change", submitter.getAccountId()));
+    }
+    return submitter;
+  }
+
+  private List<ChangeData> getChangesByTopic(String topic) {
+    try {
+      return queryProvider.get().byTopicOpen(topic);
+    } catch (OrmException e) {
+      throw new OrmRuntimeException(e);
+    }
+  }
+
+  public static class CurrentRevision implements RestModifyView<ChangeResource, SubmitInput> {
+    private final Provider<ReviewDb> dbProvider;
+    private final Submit submit;
+    private final ChangeJson.Factory json;
+    private final PatchSetUtil psUtil;
+
+    @Inject
+    CurrentRevision(
+        Provider<ReviewDb> dbProvider,
+        Submit submit,
+        ChangeJson.Factory json,
+        PatchSetUtil psUtil) {
+      this.dbProvider = dbProvider;
+      this.submit = submit;
+      this.json = json;
+      this.psUtil = psUtil;
+    }
+
+    @Override
+    public ChangeInfo apply(ChangeResource rsrc, SubmitInput input)
+        throws RestApiException, RepositoryNotFoundException, IOException, OrmException,
+            PermissionBackendException, UpdateException, ConfigInvalidException {
+      PatchSet ps = psUtil.current(dbProvider.get(), rsrc.getNotes());
+      if (ps == null) {
+        throw new ResourceConflictException("current revision is missing");
+      }
+
+      Output out = submit.apply(new RevisionResource(rsrc, ps), input);
+      return json.noOptions().format(out.change);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/SubmittedTogether.java b/java/com/google/gerrit/server/restapi/change/SubmittedTogether.java
new file mode 100644
index 0000000..fa40329
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/SubmittedTogether.java
@@ -0,0 +1,197 @@
+// Copyright (C) 2015 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.google.gerrit.server.restapi.change;
+
+import static com.google.gerrit.extensions.api.changes.SubmittedTogetherOption.NON_VISIBLE_CHANGES;
+import static java.util.Collections.reverseOrder;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.changes.SubmittedTogetherInfo;
+import com.google.gerrit.extensions.api.changes.SubmittedTogetherOption;
+import com.google.gerrit.extensions.client.ChangeStatus;
+import com.google.gerrit.extensions.client.ListChangesOption;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.change.ChangeJson;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.WalkSorter;
+import com.google.gerrit.server.change.WalkSorter.PatchSetData;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gerrit.server.submit.ChangeSet;
+import com.google.gerrit.server.submit.MergeSuperSet;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.EnumSet;
+import java.util.List;
+import org.kohsuke.args4j.Option;
+
+public class SubmittedTogether implements RestReadView<ChangeResource> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final EnumSet<SubmittedTogetherOption> options =
+      EnumSet.noneOf(SubmittedTogetherOption.class);
+
+  private final EnumSet<ListChangesOption> jsonOpt =
+      EnumSet.of(ListChangesOption.CURRENT_REVISION, ListChangesOption.SUBMITTABLE);
+
+  private static final Comparator<ChangeData> COMPARATOR =
+      Comparator.comparing(ChangeData::project).thenComparing(cd -> cd.getId().id, reverseOrder());
+
+  private final ChangeJson.Factory json;
+  private final Provider<ReviewDb> dbProvider;
+  private final Provider<InternalChangeQuery> queryProvider;
+  private final Provider<MergeSuperSet> mergeSuperSet;
+  private final Provider<WalkSorter> sorter;
+
+  @Option(name = "-o", usage = "Output options")
+  void addOption(String option) {
+    for (ListChangesOption o : ListChangesOption.values()) {
+      if (o.name().equalsIgnoreCase(option)) {
+        jsonOpt.add(o);
+        return;
+      }
+    }
+
+    for (SubmittedTogetherOption o : SubmittedTogetherOption.values()) {
+      if (o.name().equalsIgnoreCase(option)) {
+        options.add(o);
+        return;
+      }
+    }
+
+    throw new IllegalArgumentException("option not recognized: " + option);
+  }
+
+  @Inject
+  SubmittedTogether(
+      ChangeJson.Factory json,
+      Provider<ReviewDb> dbProvider,
+      Provider<InternalChangeQuery> queryProvider,
+      Provider<MergeSuperSet> mergeSuperSet,
+      Provider<WalkSorter> sorter) {
+    this.json = json;
+    this.dbProvider = dbProvider;
+    this.queryProvider = queryProvider;
+    this.mergeSuperSet = mergeSuperSet;
+    this.sorter = sorter;
+  }
+
+  public SubmittedTogether addListChangesOption(EnumSet<ListChangesOption> o) {
+    jsonOpt.addAll(o);
+    return this;
+  }
+
+  public SubmittedTogether addSubmittedTogetherOption(EnumSet<SubmittedTogetherOption> o) {
+    options.addAll(o);
+    return this;
+  }
+
+  @Override
+  public Object apply(ChangeResource resource)
+      throws AuthException, BadRequestException, ResourceConflictException, IOException,
+          OrmException, PermissionBackendException {
+    SubmittedTogetherInfo info = applyInfo(resource);
+    if (options.isEmpty()) {
+      return info.changes;
+    }
+    return info;
+  }
+
+  public SubmittedTogetherInfo applyInfo(ChangeResource resource)
+      throws AuthException, IOException, OrmException, PermissionBackendException {
+    Change c = resource.getChange();
+    try {
+      List<ChangeData> cds;
+      int hidden;
+
+      if (c.getStatus().isOpen()) {
+        ChangeSet cs =
+            mergeSuperSet.get().completeChangeSet(dbProvider.get(), c, resource.getUser());
+        cds = ensureRequiredDataIsLoaded(cs.changes().asList());
+        hidden = cs.nonVisibleChanges().size();
+      } else if (c.getStatus().asChangeStatus() == ChangeStatus.MERGED) {
+        cds = queryProvider.get().bySubmissionId(c.getSubmissionId());
+        hidden = 0;
+      } else {
+        cds = Collections.emptyList();
+        hidden = 0;
+      }
+
+      if (hidden != 0 && !options.contains(NON_VISIBLE_CHANGES)) {
+        throw new AuthException("change would be submitted with a change that you cannot see");
+      }
+
+      cds = sort(cds, hidden);
+      SubmittedTogetherInfo info = new SubmittedTogetherInfo();
+      info.changes = json.create(jsonOpt).format(cds);
+      info.nonVisibleChanges = hidden;
+      return info;
+    } catch (OrmException | IOException e) {
+      logger.atSevere().withCause(e).log("Error on getting a ChangeSet");
+      throw e;
+    }
+  }
+
+  private List<ChangeData> sort(List<ChangeData> cds, int hidden) throws OrmException, IOException {
+    if (cds.size() <= 1 && hidden == 0) {
+      // Skip sorting for singleton lists, to avoid WalkSorter opening the
+      // repo just to fill out the commit field in PatchSetData.
+      return Collections.emptyList();
+    }
+
+    long numProjectsDistinct = cds.stream().map(ChangeData::project).distinct().count();
+    long numProjects = cds.stream().map(ChangeData::project).count();
+
+    if (numProjects == numProjectsDistinct || numProjectsDistinct > 5) {
+      // We either have only a single change per project which means that WalkSorter won't make a
+      // difference compared to our index-backed sort, or we are looking at more than 5 projects
+      // which would make WalkSorter too expensive for this call.
+      return cds.stream().sorted(COMPARATOR).collect(toList());
+    }
+
+    // Perform more expensive walk-sort.
+    List<ChangeData> sorted = new ArrayList<>(cds.size());
+    for (PatchSetData psd : sorter.get().sort(cds)) {
+      sorted.add(psd.data());
+    }
+    return sorted;
+  }
+
+  private static List<ChangeData> ensureRequiredDataIsLoaded(List<ChangeData> cds)
+      throws OrmException {
+    // TODO(hiesel): Instead of calling these manually, either implement a helper that brings a
+    // database-backed change on-par with an index-backed change in terms of the populated fields in
+    // ChangeData or check if any of the ChangeDatas was loaded from the database and allow
+    // lazyloading if so.
+    for (ChangeData cd : cds) {
+      cd.submitRecords(ChangeJson.SUBMIT_RULE_OPTIONS_LENIENT);
+      cd.submitRecords(ChangeJson.SUBMIT_RULE_OPTIONS_STRICT);
+      cd.currentPatchSet();
+    }
+    return cds;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/SuggestChangeReviewers.java b/java/com/google/gerrit/server/restapi/change/SuggestChangeReviewers.java
new file mode 100644
index 0000000..0ce5750
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/SuggestChangeReviewers.java
@@ -0,0 +1,99 @@
+// 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.
+
+package com.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.common.AccountVisibility;
+import com.google.gerrit.extensions.common.SuggestedReviewerInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.restapi.change.ReviewersUtil.VisibilityControl;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.List;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Config;
+import org.kohsuke.args4j.Option;
+
+public class SuggestChangeReviewers extends SuggestReviewers
+    implements RestReadView<ChangeResource> {
+
+  @Option(
+      name = "--exclude-groups",
+      aliases = {"-e"},
+      usage = "exclude groups from query")
+  boolean excludeGroups;
+
+  private final PermissionBackend permissionBackend;
+  private final Provider<CurrentUser> self;
+  private final ProjectCache projectCache;
+
+  @Inject
+  SuggestChangeReviewers(
+      AccountVisibility av,
+      Provider<ReviewDb> dbProvider,
+      PermissionBackend permissionBackend,
+      Provider<CurrentUser> self,
+      @GerritServerConfig Config cfg,
+      ReviewersUtil reviewersUtil,
+      ProjectCache projectCache) {
+    super(av, dbProvider, cfg, reviewersUtil);
+    this.permissionBackend = permissionBackend;
+    this.self = self;
+    this.projectCache = projectCache;
+  }
+
+  @Override
+  public List<SuggestedReviewerInfo> apply(ChangeResource rsrc)
+      throws AuthException, BadRequestException, OrmException, IOException, ConfigInvalidException,
+          PermissionBackendException {
+    if (!self.get().isIdentifiedUser()) {
+      throw new AuthException("Authentication required");
+    }
+    return reviewersUtil.suggestReviewers(
+        rsrc.getNotes(),
+        this,
+        projectCache.checkedGet(rsrc.getProject()),
+        getVisibility(rsrc),
+        excludeGroups);
+  }
+
+  private VisibilityControl getVisibility(ChangeResource rsrc) {
+
+    return new VisibilityControl() {
+      @Override
+      public boolean isVisibleTo(Account.Id account) {
+        // Use the destination reference, not the change, as private changes deny anyone who is not
+        // already a reviewer.
+        return permissionBackend
+            .absentUser(account)
+            .database(dbProvider)
+            .ref(rsrc.getChange().getDest())
+            .testOrFalse(RefPermission.READ);
+      }
+    };
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/SuggestReviewers.java b/java/com/google/gerrit/server/restapi/change/SuggestReviewers.java
new file mode 100644
index 0000000..6e94218
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/SuggestReviewers.java
@@ -0,0 +1,119 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.change;
+
+import static com.google.gerrit.server.config.GerritConfigListenerHelper.acceptIfChanged;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.common.AccountVisibility;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.change.ReviewerAdder;
+import com.google.gerrit.server.config.ConfigKey;
+import com.google.gerrit.server.config.GerritConfigListener;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import org.eclipse.jgit.lib.Config;
+import org.kohsuke.args4j.Option;
+
+public class SuggestReviewers {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final int DEFAULT_MAX_SUGGESTED = 10;
+
+  protected final Provider<ReviewDb> dbProvider;
+  protected final ReviewersUtil reviewersUtil;
+
+  private final boolean suggestAccounts;
+  private final int maxAllowed;
+  private final int maxAllowedWithoutConfirmation;
+  protected int limit;
+  protected String query;
+  protected final int maxSuggestedReviewers;
+
+  @Option(
+      name = "--limit",
+      aliases = {"-n"},
+      metaVar = "CNT",
+      usage = "maximum number of reviewers to list")
+  public void setLimit(int l) {
+    this.limit = l <= 0 ? maxSuggestedReviewers : Math.min(l, maxSuggestedReviewers);
+  }
+
+  @Option(
+      name = "--query",
+      aliases = {"-q"},
+      metaVar = "QUERY",
+      usage = "match reviewers query")
+  public void setQuery(String q) {
+    this.query = q;
+  }
+
+  public String getQuery() {
+    return query;
+  }
+
+  public boolean getSuggestAccounts() {
+    return suggestAccounts;
+  }
+
+  public int getLimit() {
+    return limit;
+  }
+
+  public int getMaxAllowed() {
+    return maxAllowed;
+  }
+
+  public int getMaxAllowedWithoutConfirmation() {
+    return maxAllowedWithoutConfirmation;
+  }
+
+  @Inject
+  public SuggestReviewers(
+      AccountVisibility av,
+      Provider<ReviewDb> dbProvider,
+      @GerritServerConfig Config cfg,
+      ReviewersUtil reviewersUtil) {
+    this.dbProvider = dbProvider;
+    this.reviewersUtil = reviewersUtil;
+    this.maxSuggestedReviewers =
+        cfg.getInt("suggest", "maxSuggestedReviewers", DEFAULT_MAX_SUGGESTED);
+    this.limit = this.maxSuggestedReviewers;
+    String suggest = cfg.getString("suggest", null, "accounts");
+    if ("OFF".equalsIgnoreCase(suggest) || "false".equalsIgnoreCase(suggest)) {
+      this.suggestAccounts = false;
+    } else {
+      this.suggestAccounts = (av != AccountVisibility.NONE);
+    }
+
+    this.maxAllowed = cfg.getInt("addreviewer", "maxAllowed", ReviewerAdder.DEFAULT_MAX_REVIEWERS);
+    this.maxAllowedWithoutConfirmation =
+        cfg.getInt(
+            "addreviewer",
+            "maxWithoutConfirmation",
+            ReviewerAdder.DEFAULT_MAX_REVIEWERS_WITHOUT_CHECK);
+
+    logger.atFine().log("AccountVisibility: %s", av.name());
+  }
+
+  public static GerritConfigListener configListener() {
+    return acceptIfChanged(
+        ConfigKey.create("suggest", "maxSuggestedReviewers"),
+        ConfigKey.create("suggest", "accounts"),
+        ConfigKey.create("addreviewer", "maxAllowed"),
+        ConfigKey.create("addreviewer", "maxWithoutConfirmation"));
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/TestSubmitRule.java b/java/com/google/gerrit/server/restapi/change/TestSubmitRule.java
new file mode 100644
index 0000000..c7eb781
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/TestSubmitRule.java
@@ -0,0 +1,166 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.change;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import com.google.gerrit.common.data.SubmitRecord;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.TestSubmitRuleInfo;
+import com.google.gerrit.extensions.common.TestSubmitRuleInput;
+import com.google.gerrit.extensions.common.TestSubmitRuleInput.Filters;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.account.AccountLoader;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.project.SubmitRuleOptions;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.rules.DefaultSubmitRule;
+import com.google.gerrit.server.rules.PrologRule;
+import com.google.gerrit.server.rules.RulesCache;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.util.LinkedHashMap;
+import java.util.List;
+import org.kohsuke.args4j.Option;
+
+public class TestSubmitRule implements RestModifyView<RevisionResource, TestSubmitRuleInput> {
+  private final Provider<ReviewDb> db;
+  private final ChangeData.Factory changeDataFactory;
+  private final RulesCache rules;
+  private final AccountLoader.Factory accountInfoFactory;
+  private final ProjectCache projectCache;
+  private final DefaultSubmitRule defaultSubmitRule;
+  private final PrologRule prologRule;
+
+  @Option(name = "--filters", usage = "impact of filters in parent projects")
+  private Filters filters = Filters.RUN;
+
+  @Inject
+  TestSubmitRule(
+      Provider<ReviewDb> db,
+      ChangeData.Factory changeDataFactory,
+      RulesCache rules,
+      AccountLoader.Factory infoFactory,
+      ProjectCache projectCache,
+      DefaultSubmitRule defaultSubmitRule,
+      PrologRule prologRule) {
+    this.db = db;
+    this.changeDataFactory = changeDataFactory;
+    this.rules = rules;
+    this.accountInfoFactory = infoFactory;
+    this.projectCache = projectCache;
+    this.defaultSubmitRule = defaultSubmitRule;
+    this.prologRule = prologRule;
+  }
+
+  @Override
+  public List<TestSubmitRuleInfo> apply(RevisionResource rsrc, TestSubmitRuleInput input)
+      throws AuthException, OrmException, PermissionBackendException, BadRequestException {
+    if (input == null) {
+      input = new TestSubmitRuleInput();
+    }
+    if (input.rule != null && !rules.isProjectRulesEnabled()) {
+      throw new AuthException("project rules are disabled");
+    }
+    input.filters = MoreObjects.firstNonNull(input.filters, filters);
+
+    SubmitRuleOptions opts =
+        SubmitRuleOptions.builder()
+            .skipFilters(input.filters == Filters.SKIP)
+            .rule(input.rule)
+            .logErrors(false)
+            .build();
+
+    ProjectState projectState = projectCache.get(rsrc.getProject());
+    if (projectState == null) {
+      throw new BadRequestException("project not found");
+    }
+    ChangeData cd = changeDataFactory.create(db.get(), rsrc.getNotes());
+    List<SubmitRecord> records;
+    if (projectState.hasPrologRules() || input.rule != null) {
+      records = ImmutableList.copyOf(prologRule.evaluate(cd, opts));
+    } else {
+      // No rules were provided as input and we have no rules.pl. This means we are supposed to run
+      // the default rules. Nowadays, the default rules are implemented in Java, not Prolog.
+      // Therefore, we call the DefaultRuleEvaluator instead.
+      records = ImmutableList.copyOf(defaultSubmitRule.evaluate(cd, opts));
+    }
+
+    List<TestSubmitRuleInfo> out = Lists.newArrayListWithCapacity(records.size());
+    AccountLoader accounts = accountInfoFactory.create(true);
+    for (SubmitRecord r : records) {
+      out.add(newSubmitRuleInfo(r, accounts));
+    }
+    accounts.fill();
+    return out;
+  }
+
+  private static TestSubmitRuleInfo newSubmitRuleInfo(SubmitRecord r, AccountLoader accounts) {
+    TestSubmitRuleInfo info = new TestSubmitRuleInfo();
+    info.status = r.status.name();
+    info.errorMessage = r.errorMessage;
+
+    if (r.labels != null) {
+      for (SubmitRecord.Label n : r.labels) {
+        AccountInfo who = n.appliedBy != null ? accounts.get(n.appliedBy) : new AccountInfo(null);
+        label(info, n, who);
+      }
+    }
+    return info;
+  }
+
+  private static void label(TestSubmitRuleInfo info, SubmitRecord.Label n, AccountInfo who) {
+    switch (n.status) {
+      case OK:
+        if (info.ok == null) {
+          info.ok = new LinkedHashMap<>();
+        }
+        info.ok.put(n.label, who);
+        break;
+      case REJECT:
+        if (info.reject == null) {
+          info.reject = new LinkedHashMap<>();
+        }
+        info.reject.put(n.label, who);
+        break;
+      case NEED:
+        if (info.need == null) {
+          info.need = new LinkedHashMap<>();
+        }
+        info.need.put(n.label, TestSubmitRuleInfo.None.INSTANCE);
+        break;
+      case MAY:
+        if (info.may == null) {
+          info.may = new LinkedHashMap<>();
+        }
+        info.may.put(n.label, who);
+        break;
+      case IMPOSSIBLE:
+        if (info.impossible == null) {
+          info.impossible = new LinkedHashMap<>();
+        }
+        info.impossible.put(n.label, TestSubmitRuleInfo.None.INSTANCE);
+        break;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/TestSubmitType.java b/java/com/google/gerrit/server/restapi/change/TestSubmitType.java
new file mode 100644
index 0000000..c1be1ce
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/TestSubmitType.java
@@ -0,0 +1,101 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.change;
+
+import com.google.common.base.MoreObjects;
+import com.google.gerrit.common.data.SubmitTypeRecord;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.extensions.common.TestSubmitRuleInput;
+import com.google.gerrit.extensions.common.TestSubmitRuleInput.Filters;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.project.SubmitRuleEvaluator;
+import com.google.gerrit.server.project.SubmitRuleOptions;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.rules.RulesCache;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import org.kohsuke.args4j.Option;
+
+public class TestSubmitType implements RestModifyView<RevisionResource, TestSubmitRuleInput> {
+  private final Provider<ReviewDb> db;
+  private final ChangeData.Factory changeDataFactory;
+  private final RulesCache rules;
+  private final SubmitRuleEvaluator.Factory submitRuleEvaluatorFactory;
+
+  @Option(name = "--filters", usage = "impact of filters in parent projects")
+  private Filters filters = Filters.RUN;
+
+  @Inject
+  TestSubmitType(
+      Provider<ReviewDb> db,
+      ChangeData.Factory changeDataFactory,
+      RulesCache rules,
+      SubmitRuleEvaluator.Factory submitRuleEvaluatorFactory) {
+    this.db = db;
+    this.changeDataFactory = changeDataFactory;
+    this.rules = rules;
+    this.submitRuleEvaluatorFactory = submitRuleEvaluatorFactory;
+  }
+
+  @Override
+  public SubmitType apply(RevisionResource rsrc, TestSubmitRuleInput input)
+      throws AuthException, BadRequestException, OrmException {
+    if (input == null) {
+      input = new TestSubmitRuleInput();
+    }
+    if (input.rule != null && !rules.isProjectRulesEnabled()) {
+      throw new AuthException("project rules are disabled");
+    }
+    input.filters = MoreObjects.firstNonNull(input.filters, filters);
+
+    SubmitRuleOptions opts =
+        SubmitRuleOptions.builder()
+            .logErrors(false)
+            .skipFilters(input.filters == Filters.SKIP)
+            .rule(input.rule)
+            .build();
+
+    SubmitRuleEvaluator evaluator = submitRuleEvaluatorFactory.create(opts);
+    ChangeData cd = changeDataFactory.create(db.get(), rsrc.getNotes());
+    SubmitTypeRecord rec = evaluator.getSubmitType(cd);
+
+    if (rec.status != SubmitTypeRecord.Status.OK) {
+      throw new BadRequestException(String.format("rule produced invalid result: %s", rec));
+    }
+
+    return rec.type;
+  }
+
+  public static class Get implements RestReadView<RevisionResource> {
+    private final TestSubmitType test;
+
+    @Inject
+    Get(TestSubmitType test) {
+      this.test = test;
+    }
+
+    @Override
+    public SubmitType apply(RevisionResource resource)
+        throws AuthException, BadRequestException, OrmException {
+      return test.apply(resource, null);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/Unignore.java b/java/com/google/gerrit/server/restapi/change/Unignore.java
new file mode 100644
index 0000000..6f2144a
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/Unignore.java
@@ -0,0 +1,65 @@
+// Copyright (C) 2017 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.google.gerrit.server.restapi.change;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.webui.UiAction;
+import com.google.gerrit.server.StarredChangesUtil;
+import com.google.gerrit.server.StarredChangesUtil.IllegalLabelException;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class Unignore implements RestModifyView<ChangeResource, Input>, UiAction<ChangeResource> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final StarredChangesUtil stars;
+
+  @Inject
+  Unignore(StarredChangesUtil stars) {
+    this.stars = stars;
+  }
+
+  @Override
+  public Description getDescription(ChangeResource rsrc) {
+    return new UiAction.Description()
+        .setLabel("Unignore")
+        .setTitle("Unignore the change")
+        .setVisible(isIgnored(rsrc));
+  }
+
+  @Override
+  public Response<String> apply(ChangeResource rsrc, Input input)
+      throws OrmException, IllegalLabelException {
+    if (isIgnored(rsrc)) {
+      stars.unignore(rsrc);
+    }
+    return Response.ok("");
+  }
+
+  private boolean isIgnored(ChangeResource rsrc) {
+    try {
+      return stars.isIgnored(rsrc);
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log("failed to check ignored star");
+    }
+    return false;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/change/Votes.java b/java/com/google/gerrit/server/restapi/change/Votes.java
new file mode 100644
index 0000000..3b2548c
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/Votes.java
@@ -0,0 +1,100 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.change;
+
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ChildCollection;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.change.ReviewerResource;
+import com.google.gerrit.server.change.VoteResource;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.Map;
+import java.util.TreeMap;
+
+@Singleton
+public class Votes implements ChildCollection<ReviewerResource, VoteResource> {
+  private final DynamicMap<RestView<VoteResource>> views;
+  private final List list;
+
+  @Inject
+  Votes(DynamicMap<RestView<VoteResource>> views, List list) {
+    this.views = views;
+    this.list = list;
+  }
+
+  @Override
+  public DynamicMap<RestView<VoteResource>> views() {
+    return views;
+  }
+
+  @Override
+  public RestView<ReviewerResource> list() throws AuthException {
+    return list;
+  }
+
+  @Override
+  public VoteResource parse(ReviewerResource reviewer, IdString id)
+      throws ResourceNotFoundException, OrmException, AuthException, MethodNotAllowedException {
+    if (reviewer.getRevisionResource() != null && !reviewer.getRevisionResource().isCurrent()) {
+      throw new MethodNotAllowedException("Cannot access on non-current patch set");
+    }
+    return new VoteResource(reviewer, id.get());
+  }
+
+  @Singleton
+  public static class List implements RestReadView<ReviewerResource> {
+    private final Provider<ReviewDb> db;
+    private final ApprovalsUtil approvalsUtil;
+
+    @Inject
+    List(Provider<ReviewDb> db, ApprovalsUtil approvalsUtil) {
+      this.db = db;
+      this.approvalsUtil = approvalsUtil;
+    }
+
+    @Override
+    public Map<String, Short> apply(ReviewerResource rsrc)
+        throws OrmException, MethodNotAllowedException {
+      if (rsrc.getRevisionResource() != null && !rsrc.getRevisionResource().isCurrent()) {
+        throw new MethodNotAllowedException("Cannot list votes on non-current patch set");
+      }
+
+      Map<String, Short> votes = new TreeMap<>();
+      Iterable<PatchSetApproval> byPatchSetUser =
+          approvalsUtil.byPatchSetUser(
+              db.get(),
+              rsrc.getChangeResource().getNotes(),
+              rsrc.getChange().currentPatchSetId(),
+              rsrc.getReviewerUser().getAccountId(),
+              null,
+              null);
+      for (PatchSetApproval psa : byPatchSetUser) {
+        votes.put(psa.getLabel(), psa.getValue());
+      }
+      return votes;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/config/AgreementJson.java b/java/com/google/gerrit/server/restapi/config/AgreementJson.java
new file mode 100644
index 0000000..02e5f68
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/config/AgreementJson.java
@@ -0,0 +1,72 @@
+// 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.
+
+package com.google.gerrit.server.restapi.config;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.ContributorAgreement;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.errors.NoSuchGroupException;
+import com.google.gerrit.extensions.common.AgreementInfo;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.GroupControl;
+import com.google.gerrit.server.group.GroupResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.restapi.group.GroupJson;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+
+public class AgreementJson {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final Provider<CurrentUser> self;
+  private final IdentifiedUser.GenericFactory identifiedUserFactory;
+  private final GroupControl.GenericFactory genericGroupControlFactory;
+  private final GroupJson groupJson;
+
+  @Inject
+  AgreementJson(
+      Provider<CurrentUser> self,
+      IdentifiedUser.GenericFactory identifiedUserFactory,
+      GroupControl.GenericFactory genericGroupControlFactory,
+      GroupJson groupJson) {
+    this.self = self;
+    this.identifiedUserFactory = identifiedUserFactory;
+    this.genericGroupControlFactory = genericGroupControlFactory;
+    this.groupJson = groupJson;
+  }
+
+  public AgreementInfo format(ContributorAgreement ca) throws PermissionBackendException {
+    AgreementInfo info = new AgreementInfo();
+    info.name = ca.getName();
+    info.description = ca.getDescription();
+    info.url = ca.getAgreementUrl();
+    GroupReference autoVerifyGroup = ca.getAutoVerify();
+    if (autoVerifyGroup != null && self.get().isIdentifiedUser()) {
+      IdentifiedUser user = identifiedUserFactory.create(self.get().getAccountId());
+      try {
+        GroupControl gc = genericGroupControlFactory.controlFor(user, autoVerifyGroup.getUUID());
+        GroupResource group = new GroupResource(gc);
+        info.autoVerifyGroup = groupJson.format(group);
+      } catch (NoSuchGroupException | OrmException e) {
+        logger.atWarning().log(
+            "autoverify group \"%s\" does not exist, referenced in CLA \"%s\"",
+            autoVerifyGroup.getName(), ca.getName());
+      }
+    }
+    return info;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/config/CachesCollection.java b/java/com/google/gerrit/server/restapi/config/CachesCollection.java
new file mode 100644
index 0000000..a4b8802
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/config/CachesCollection.java
@@ -0,0 +1,88 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.config;
+
+import static com.google.gerrit.common.data.GlobalCapability.MAINTAIN_SERVER;
+import static com.google.gerrit.common.data.GlobalCapability.VIEW_CACHES;
+
+import com.google.common.cache.Cache;
+import com.google.gerrit.extensions.annotations.RequiresAnyCapability;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.registration.PluginName;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ChildCollection;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.server.config.CacheResource;
+import com.google.gerrit.server.config.ConfigResource;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@RequiresAnyCapability({VIEW_CACHES, MAINTAIN_SERVER})
+@Singleton
+public class CachesCollection implements ChildCollection<ConfigResource, CacheResource> {
+
+  private final DynamicMap<RestView<CacheResource>> views;
+  private final Provider<ListCaches> list;
+  private final PermissionBackend permissionBackend;
+  private final DynamicMap<Cache<?, ?>> cacheMap;
+
+  @Inject
+  CachesCollection(
+      DynamicMap<RestView<CacheResource>> views,
+      Provider<ListCaches> list,
+      PermissionBackend permissionBackend,
+      DynamicMap<Cache<?, ?>> cacheMap) {
+    this.views = views;
+    this.list = list;
+    this.permissionBackend = permissionBackend;
+    this.cacheMap = cacheMap;
+  }
+
+  @Override
+  public RestView<ConfigResource> list() {
+    return list.get();
+  }
+
+  @Override
+  public CacheResource parse(ConfigResource parent, IdString id)
+      throws AuthException, ResourceNotFoundException, PermissionBackendException {
+    permissionBackend.currentUser().check(GlobalPermission.VIEW_CACHES);
+
+    String cacheName = id.get();
+    String pluginName = PluginName.GERRIT;
+    int i = cacheName.lastIndexOf('-');
+    if (i != -1) {
+      pluginName = cacheName.substring(0, i);
+      cacheName = cacheName.length() > i + 1 ? cacheName.substring(i + 1) : "";
+    }
+
+    Provider<Cache<?, ?>> cacheProvider = cacheMap.byPlugin(pluginName).get(cacheName);
+    if (cacheProvider == null) {
+      throw new ResourceNotFoundException(id);
+    }
+    return new CacheResource(pluginName, cacheName, cacheProvider);
+  }
+
+  @Override
+  public DynamicMap<RestView<CacheResource>> views() {
+    return views;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/config/CapabilitiesCollection.java b/java/com/google/gerrit/server/restapi/config/CapabilitiesCollection.java
new file mode 100644
index 0000000..ae1278d
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/config/CapabilitiesCollection.java
@@ -0,0 +1,53 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.config;
+
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.ChildCollection;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.server.config.CapabilityResource;
+import com.google.gerrit.server.config.ConfigResource;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class CapabilitiesCollection implements ChildCollection<ConfigResource, CapabilityResource> {
+  private final DynamicMap<RestView<CapabilityResource>> views;
+  private final ListCapabilities list;
+
+  @Inject
+  CapabilitiesCollection(DynamicMap<RestView<CapabilityResource>> views, ListCapabilities list) {
+    this.views = views;
+    this.list = list;
+  }
+
+  @Override
+  public RestView<ConfigResource> list() throws ResourceNotFoundException {
+    return list;
+  }
+
+  @Override
+  public CapabilityResource parse(ConfigResource parent, IdString id)
+      throws ResourceNotFoundException {
+    throw new ResourceNotFoundException(id);
+  }
+
+  @Override
+  public DynamicMap<RestView<CapabilityResource>> views() {
+    return views;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/config/CheckConsistency.java b/java/com/google/gerrit/server/restapi/config/CheckConsistency.java
new file mode 100644
index 0000000..a16736b
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/config/CheckConsistency.java
@@ -0,0 +1,87 @@
+// Copyright (C) 2017 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.google.gerrit.server.restapi.config;
+
+import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo;
+import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo.CheckAccountExternalIdsResultInfo;
+import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo.CheckAccountsResultInfo;
+import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo.CheckGroupsResultInfo;
+import com.google.gerrit.extensions.api.config.ConsistencyCheckInput;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.account.AccountsConsistencyChecker;
+import com.google.gerrit.server.account.externalids.ExternalIdsConsistencyChecker;
+import com.google.gerrit.server.config.ConfigResource;
+import com.google.gerrit.server.group.db.GroupsConsistencyChecker;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class CheckConsistency implements RestModifyView<ConfigResource, ConsistencyCheckInput> {
+  private final PermissionBackend permissionBackend;
+  private final AccountsConsistencyChecker accountsConsistencyChecker;
+  private final ExternalIdsConsistencyChecker externalIdsConsistencyChecker;
+  private final GroupsConsistencyChecker groupsConsistencyChecker;
+
+  @Inject
+  CheckConsistency(
+      PermissionBackend permissionBackend,
+      AccountsConsistencyChecker accountsConsistencyChecker,
+      ExternalIdsConsistencyChecker externalIdsConsistencyChecker,
+      GroupsConsistencyChecker groupsChecker) {
+    this.permissionBackend = permissionBackend;
+    this.accountsConsistencyChecker = accountsConsistencyChecker;
+    this.externalIdsConsistencyChecker = externalIdsConsistencyChecker;
+    this.groupsConsistencyChecker = groupsChecker;
+  }
+
+  @Override
+  public ConsistencyCheckInfo apply(ConfigResource resource, ConsistencyCheckInput input)
+      throws RestApiException, IOException, OrmException, PermissionBackendException,
+          ConfigInvalidException {
+    permissionBackend.currentUser().check(GlobalPermission.ACCESS_DATABASE);
+
+    if (input == null
+        || (input.checkAccounts == null
+            && input.checkAccountExternalIds == null
+            && input.checkGroups == null)) {
+      throw new BadRequestException("input required");
+    }
+
+    ConsistencyCheckInfo consistencyCheckInfo = new ConsistencyCheckInfo();
+    if (input.checkAccounts != null) {
+      consistencyCheckInfo.checkAccountsResult =
+          new CheckAccountsResultInfo(accountsConsistencyChecker.check());
+    }
+    if (input.checkAccountExternalIds != null) {
+      consistencyCheckInfo.checkAccountExternalIdsResult =
+          new CheckAccountExternalIdsResultInfo(externalIdsConsistencyChecker.check());
+    }
+
+    if (input.checkGroups != null) {
+      consistencyCheckInfo.checkGroupsResult =
+          new CheckGroupsResultInfo(groupsConsistencyChecker.check());
+    }
+
+    return consistencyCheckInfo;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/config/ConfigCollection.java b/java/com/google/gerrit/server/restapi/config/ConfigCollection.java
new file mode 100644
index 0000000..47f4134
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/config/ConfigCollection.java
@@ -0,0 +1,53 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.config;
+
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestCollection;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.server.config.ConfigResource;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class ConfigCollection implements RestCollection<TopLevelResource, ConfigResource> {
+  private final DynamicMap<RestView<ConfigResource>> views;
+
+  @Inject
+  public ConfigCollection(DynamicMap<RestView<ConfigResource>> views) {
+    this.views = views;
+  }
+
+  @Override
+  public RestView<TopLevelResource> list() throws ResourceNotFoundException {
+    throw new ResourceNotFoundException();
+  }
+
+  @Override
+  public DynamicMap<RestView<ConfigResource>> views() {
+    return views;
+  }
+
+  @Override
+  public ConfigResource parse(TopLevelResource root, IdString id) throws ResourceNotFoundException {
+    if (id.get().equals("server")) {
+      return new ConfigResource();
+    }
+    throw new ResourceNotFoundException(id);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/config/ConfirmEmail.java b/java/com/google/gerrit/server/restapi/config/ConfirmEmail.java
new file mode 100644
index 0000000..5a1592f
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/config/ConfirmEmail.java
@@ -0,0 +1,86 @@
+// Copyright (C) 2015 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.google.gerrit.server.restapi.config;
+
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.DefaultInput;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.AccountException;
+import com.google.gerrit.server.account.AccountManager;
+import com.google.gerrit.server.config.ConfigResource;
+import com.google.gerrit.server.mail.EmailTokenVerifier;
+import com.google.gerrit.server.restapi.config.ConfirmEmail.Input;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class ConfirmEmail implements RestModifyView<ConfigResource, Input> {
+  public static class Input {
+    @DefaultInput public String token;
+  }
+
+  private final Provider<CurrentUser> self;
+  private final EmailTokenVerifier emailTokenVerifier;
+  private final AccountManager accountManager;
+
+  @Inject
+  public ConfirmEmail(
+      Provider<CurrentUser> self,
+      EmailTokenVerifier emailTokenVerifier,
+      AccountManager accountManager) {
+    this.self = self;
+    this.emailTokenVerifier = emailTokenVerifier;
+    this.accountManager = accountManager;
+  }
+
+  @Override
+  public Response<?> apply(ConfigResource rsrc, Input input)
+      throws AuthException, UnprocessableEntityException, OrmException, IOException,
+          ConfigInvalidException {
+    CurrentUser user = self.get();
+    if (!user.isIdentifiedUser()) {
+      throw new AuthException("Authentication required");
+    }
+
+    if (input == null) {
+      input = new Input();
+    }
+    if (input.token == null) {
+      throw new UnprocessableEntityException("missing token");
+    }
+
+    try {
+      EmailTokenVerifier.ParsedToken token = emailTokenVerifier.decode(input.token);
+      Account.Id accId = user.getAccountId();
+      if (accId.equals(token.getAccountId())) {
+        accountManager.link(accId, token.toAuthRequest());
+        return Response.none();
+      }
+      throw new UnprocessableEntityException("invalid token");
+    } catch (EmailTokenVerifier.InvalidTokenException e) {
+      throw new UnprocessableEntityException("invalid token");
+    } catch (AccountException e) {
+      throw new UnprocessableEntityException(e.getMessage());
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/config/DeleteTask.java b/java/com/google/gerrit/server/restapi/config/DeleteTask.java
new file mode 100644
index 0000000..a08b036
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/config/DeleteTask.java
@@ -0,0 +1,41 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.config;
+
+import static com.google.gerrit.common.data.GlobalCapability.KILL_TASK;
+import static com.google.gerrit.common.data.GlobalCapability.MAINTAIN_SERVER;
+import static javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
+
+import com.google.gerrit.extensions.annotations.RequiresAnyCapability;
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.config.TaskResource;
+import com.google.gerrit.server.git.WorkQueue.Task;
+import com.google.inject.Singleton;
+
+@Singleton
+@RequiresAnyCapability({KILL_TASK, MAINTAIN_SERVER})
+public class DeleteTask implements RestModifyView<TaskResource, Input> {
+
+  @Override
+  public Response<?> apply(TaskResource rsrc, Input input) {
+    Task<?> task = rsrc.getTask();
+    boolean taskDeleted = task.cancel(true);
+    return taskDeleted
+        ? Response.none()
+        : Response.withStatusCode(SC_INTERNAL_SERVER_ERROR, "Unable to kill task " + task);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/config/FlushCache.java b/java/com/google/gerrit/server/restapi/config/FlushCache.java
new file mode 100644
index 0000000..9ea9e33
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/config/FlushCache.java
@@ -0,0 +1,55 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.config;
+
+import static com.google.gerrit.common.data.GlobalCapability.FLUSH_CACHES;
+import static com.google.gerrit.common.data.GlobalCapability.MAINTAIN_SERVER;
+
+import com.google.gerrit.extensions.annotations.RequiresAnyCapability;
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.config.CacheResource;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@RequiresAnyCapability({FLUSH_CACHES, MAINTAIN_SERVER})
+@Singleton
+public class FlushCache implements RestModifyView<CacheResource, Input> {
+
+  public static final String WEB_SESSIONS = "web_sessions";
+
+  private final PermissionBackend permissionBackend;
+
+  @Inject
+  public FlushCache(PermissionBackend permissionBackend) {
+    this.permissionBackend = permissionBackend;
+  }
+
+  @Override
+  public Response<String> apply(CacheResource rsrc, Input input)
+      throws AuthException, PermissionBackendException {
+    if (WEB_SESSIONS.equals(rsrc.getName())) {
+      permissionBackend.currentUser().check(GlobalPermission.MAINTAIN_SERVER);
+    }
+
+    rsrc.getCache().invalidateAll();
+    return Response.ok("");
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/config/GetCache.java b/java/com/google/gerrit/server/restapi/config/GetCache.java
new file mode 100644
index 0000000..5abaf1e
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/config/GetCache.java
@@ -0,0 +1,28 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.config;
+
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.config.CacheResource;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GetCache implements RestReadView<CacheResource> {
+
+  @Override
+  public ListCaches.CacheInfo apply(CacheResource rsrc) {
+    return new ListCaches.CacheInfo(rsrc.getName(), rsrc.getCache());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/config/GetDiffPreferences.java b/java/com/google/gerrit/server/restapi/config/GetDiffPreferences.java
new file mode 100644
index 0000000..13c2818
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/config/GetDiffPreferences.java
@@ -0,0 +1,50 @@
+// 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.
+
+package com.google.gerrit.server.restapi.config;
+
+import com.google.gerrit.extensions.client.DiffPreferencesInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.account.Preferences;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.ConfigResource;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Repository;
+
+@Singleton
+public class GetDiffPreferences implements RestReadView<ConfigResource> {
+
+  private final AllUsersName allUsersName;
+  private final GitRepositoryManager gitManager;
+
+  @Inject
+  GetDiffPreferences(GitRepositoryManager gitManager, AllUsersName allUsersName) {
+    this.allUsersName = allUsersName;
+    this.gitManager = gitManager;
+  }
+
+  @Override
+  public DiffPreferencesInfo apply(ConfigResource configResource)
+      throws BadRequestException, ResourceConflictException, IOException, ConfigInvalidException {
+    try (Repository git = gitManager.openRepository(allUsersName)) {
+      return Preferences.readDefaultDiffPreferences(allUsersName, git);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/config/GetEditPreferences.java b/java/com/google/gerrit/server/restapi/config/GetEditPreferences.java
new file mode 100644
index 0000000..2ec547b
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/config/GetEditPreferences.java
@@ -0,0 +1,49 @@
+// 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.
+
+package com.google.gerrit.server.restapi.config;
+
+import com.google.gerrit.extensions.client.EditPreferencesInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.account.Preferences;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.ConfigResource;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Repository;
+
+@Singleton
+public class GetEditPreferences implements RestReadView<ConfigResource> {
+  private final AllUsersName allUsersName;
+  private final GitRepositoryManager gitManager;
+
+  @Inject
+  GetEditPreferences(GitRepositoryManager gitManager, AllUsersName allUsersName) {
+    this.allUsersName = allUsersName;
+    this.gitManager = gitManager;
+  }
+
+  @Override
+  public EditPreferencesInfo apply(ConfigResource configResource)
+      throws BadRequestException, ResourceConflictException, IOException, ConfigInvalidException {
+    try (Repository git = gitManager.openRepository(allUsersName)) {
+      return Preferences.readDefaultEditPreferences(allUsersName, git);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/config/GetPreferences.java b/java/com/google/gerrit/server/restapi/config/GetPreferences.java
new file mode 100644
index 0000000..4dbbc8c
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/config/GetPreferences.java
@@ -0,0 +1,47 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.config;
+
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.account.Preferences;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.ConfigResource;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Repository;
+
+@Singleton
+public class GetPreferences implements RestReadView<ConfigResource> {
+  private final GitRepositoryManager gitMgr;
+  private final AllUsersName allUsersName;
+
+  @Inject
+  public GetPreferences(GitRepositoryManager gitMgr, AllUsersName allUsersName) {
+    this.gitMgr = gitMgr;
+    this.allUsersName = allUsersName;
+  }
+
+  @Override
+  public GeneralPreferencesInfo apply(ConfigResource rsrc)
+      throws IOException, ConfigInvalidException {
+    try (Repository git = gitMgr.openRepository(allUsersName)) {
+      return Preferences.readDefaultGeneralPreferences(allUsersName, git);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/config/GetServerInfo.java b/java/com/google/gerrit/server/restapi/config/GetServerInfo.java
new file mode 100644
index 0000000..eca26c3
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/config/GetServerInfo.java
@@ -0,0 +1,412 @@
+// Copyright (C) 2015 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.google.gerrit.server.restapi.config;
+
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.base.CharMatcher;
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+import com.google.gerrit.common.data.ContributorAgreement;
+import com.google.gerrit.extensions.client.UiType;
+import com.google.gerrit.extensions.common.AccountsInfo;
+import com.google.gerrit.extensions.common.AuthInfo;
+import com.google.gerrit.extensions.common.ChangeConfigInfo;
+import com.google.gerrit.extensions.common.DownloadInfo;
+import com.google.gerrit.extensions.common.DownloadSchemeInfo;
+import com.google.gerrit.extensions.common.GerritInfo;
+import com.google.gerrit.extensions.common.PluginConfigInfo;
+import com.google.gerrit.extensions.common.ReceiveInfo;
+import com.google.gerrit.extensions.common.ServerInfo;
+import com.google.gerrit.extensions.common.SshdInfo;
+import com.google.gerrit.extensions.common.SuggestInfo;
+import com.google.gerrit.extensions.common.UserConfigInfo;
+import com.google.gerrit.extensions.config.CloneCommand;
+import com.google.gerrit.extensions.config.DownloadCommand;
+import com.google.gerrit.extensions.config.DownloadScheme;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.extensions.webui.WebUiPlugin;
+import com.google.gerrit.server.EnableSignedPush;
+import com.google.gerrit.server.account.AccountVisibilityProvider;
+import com.google.gerrit.server.account.Realm;
+import com.google.gerrit.server.avatar.AvatarProvider;
+import com.google.gerrit.server.change.ArchiveFormat;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.AnonymousCowardName;
+import com.google.gerrit.server.config.AuthConfig;
+import com.google.gerrit.server.config.ConfigResource;
+import com.google.gerrit.server.config.ConfigUtil;
+import com.google.gerrit.server.config.GerritOptions;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.documentation.QueryDocumentationExecutor;
+import com.google.gerrit.server.index.change.ChangeField;
+import com.google.gerrit.server.index.change.ChangeIndexCollection;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.plugincontext.PluginItemContext;
+import com.google.gerrit.server.plugincontext.PluginMapContext;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.restapi.change.AllowedFormats;
+import com.google.gerrit.server.submit.MergeSuperSet;
+import com.google.inject.Inject;
+import java.nio.file.Files;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.lib.Config;
+
+public class GetServerInfo implements RestReadView<ConfigResource> {
+  private static final String URL_ALIAS = "urlAlias";
+  private static final String KEY_MATCH = "match";
+  private static final String KEY_TOKEN = "token";
+
+  private final Config config;
+  private final AccountVisibilityProvider accountVisibilityProvider;
+  private final AuthConfig authConfig;
+  private final Realm realm;
+  private final PluginMapContext<DownloadScheme> downloadSchemes;
+  private final PluginMapContext<DownloadCommand> downloadCommands;
+  private final PluginMapContext<CloneCommand> cloneCommands;
+  private final PluginSetContext<WebUiPlugin> plugins;
+  private final AllowedFormats archiveFormats;
+  private final AllProjectsName allProjectsName;
+  private final AllUsersName allUsersName;
+  private final String anonymousCowardName;
+  private final PluginItemContext<AvatarProvider> avatar;
+  private final boolean enableSignedPush;
+  private final QueryDocumentationExecutor docSearcher;
+  private final NotesMigration migration;
+  private final ProjectCache projectCache;
+  private final AgreementJson agreementJson;
+  private final GerritOptions gerritOptions;
+  private final ChangeIndexCollection indexes;
+  private final SitePaths sitePaths;
+
+  @Inject
+  public GetServerInfo(
+      @GerritServerConfig Config config,
+      AccountVisibilityProvider accountVisibilityProvider,
+      AuthConfig authConfig,
+      Realm realm,
+      PluginMapContext<DownloadScheme> downloadSchemes,
+      PluginMapContext<DownloadCommand> downloadCommands,
+      PluginMapContext<CloneCommand> cloneCommands,
+      PluginSetContext<WebUiPlugin> webUiPlugins,
+      AllowedFormats archiveFormats,
+      AllProjectsName allProjectsName,
+      AllUsersName allUsersName,
+      @AnonymousCowardName String anonymousCowardName,
+      PluginItemContext<AvatarProvider> avatar,
+      @EnableSignedPush boolean enableSignedPush,
+      QueryDocumentationExecutor docSearcher,
+      NotesMigration migration,
+      ProjectCache projectCache,
+      AgreementJson agreementJson,
+      GerritOptions gerritOptions,
+      ChangeIndexCollection indexes,
+      SitePaths sitePaths) {
+    this.config = config;
+    this.accountVisibilityProvider = accountVisibilityProvider;
+    this.authConfig = authConfig;
+    this.realm = realm;
+    this.downloadSchemes = downloadSchemes;
+    this.downloadCommands = downloadCommands;
+    this.cloneCommands = cloneCommands;
+    this.plugins = webUiPlugins;
+    this.archiveFormats = archiveFormats;
+    this.allProjectsName = allProjectsName;
+    this.allUsersName = allUsersName;
+    this.anonymousCowardName = anonymousCowardName;
+    this.avatar = avatar;
+    this.enableSignedPush = enableSignedPush;
+    this.docSearcher = docSearcher;
+    this.migration = migration;
+    this.projectCache = projectCache;
+    this.agreementJson = agreementJson;
+    this.gerritOptions = gerritOptions;
+    this.indexes = indexes;
+    this.sitePaths = sitePaths;
+  }
+
+  @Override
+  public ServerInfo apply(ConfigResource rsrc) throws PermissionBackendException {
+    ServerInfo info = new ServerInfo();
+    info.accounts = getAccountsInfo();
+    info.auth = getAuthInfo();
+    info.change = getChangeInfo();
+    info.download = getDownloadInfo();
+    info.gerrit = getGerritInfo();
+    info.noteDbEnabled = toBoolean(isNoteDbEnabled());
+    info.plugin = getPluginInfo();
+    info.defaultTheme = getDefaultTheme();
+    info.sshd = getSshdInfo();
+    info.suggest = getSuggestInfo();
+
+    Map<String, String> urlAliases = getUrlAliasesInfo();
+    info.urlAliases = !urlAliases.isEmpty() ? urlAliases : null;
+
+    info.user = getUserInfo();
+    info.receive = getReceiveInfo();
+    return info;
+  }
+
+  private AccountsInfo getAccountsInfo() {
+    AccountsInfo info = new AccountsInfo();
+    info.visibility = accountVisibilityProvider.get();
+    return info;
+  }
+
+  private AuthInfo getAuthInfo() throws PermissionBackendException {
+    AuthInfo info = new AuthInfo();
+    info.authType = authConfig.getAuthType();
+    info.useContributorAgreements = toBoolean(authConfig.isUseContributorAgreements());
+    info.editableAccountFields = new ArrayList<>(realm.getEditableFields());
+    info.switchAccountUrl = authConfig.getSwitchAccountUrl();
+    info.gitBasicAuthPolicy = authConfig.getGitBasicAuthPolicy();
+
+    if (info.useContributorAgreements != null) {
+      Collection<ContributorAgreement> agreements =
+          projectCache.getAllProjects().getConfig().getContributorAgreements();
+      if (!agreements.isEmpty()) {
+        info.contributorAgreements = Lists.newArrayListWithCapacity(agreements.size());
+        for (ContributorAgreement agreement : agreements) {
+          info.contributorAgreements.add(agreementJson.format(agreement));
+        }
+      }
+    }
+
+    switch (info.authType) {
+      case LDAP:
+      case LDAP_BIND:
+        info.registerUrl = authConfig.getRegisterUrl();
+        info.registerText = authConfig.getRegisterText();
+        info.editFullNameUrl = authConfig.getEditFullNameUrl();
+        break;
+
+      case CUSTOM_EXTENSION:
+        info.registerUrl = authConfig.getRegisterUrl();
+        info.registerText = authConfig.getRegisterText();
+        info.editFullNameUrl = authConfig.getEditFullNameUrl();
+        info.httpPasswordUrl = authConfig.getHttpPasswordUrl();
+        break;
+
+      case HTTP:
+      case HTTP_LDAP:
+        info.loginUrl = authConfig.getLoginUrl();
+        info.loginText = authConfig.getLoginText();
+        break;
+
+      case CLIENT_SSL_CERT_LDAP:
+      case DEVELOPMENT_BECOME_ANY_ACCOUNT:
+      case OAUTH:
+      case OPENID:
+      case OPENID_SSO:
+        break;
+    }
+    return info;
+  }
+
+  private ChangeConfigInfo getChangeInfo() {
+    ChangeConfigInfo info = new ChangeConfigInfo();
+    info.allowBlame = toBoolean(config.getBoolean("change", "allowBlame", true));
+    boolean hasAssigneeInIndex =
+        indexes.getSearchIndex().getSchema().hasField(ChangeField.ASSIGNEE);
+    info.showAssigneeInChangesTable =
+        toBoolean(
+            config.getBoolean("change", "showAssigneeInChangesTable", false) && hasAssigneeInIndex);
+    info.largeChange = config.getInt("change", "largeChange", 500);
+    info.replyTooltip =
+        Optional.ofNullable(config.getString("change", null, "replyTooltip"))
+                .orElse("Reply and score")
+            + " (Shortcut: a)";
+    info.replyLabel =
+        Optional.ofNullable(config.getString("change", null, "replyLabel")).orElse("Reply")
+            + "\u2026";
+    info.updateDelay =
+        (int) ConfigUtil.getTimeUnit(config, "change", null, "updateDelay", 300, TimeUnit.SECONDS);
+    info.submitWholeTopic = MergeSuperSet.wholeTopicEnabled(config);
+    info.disablePrivateChanges =
+        toBoolean(this.config.getBoolean("change", null, "disablePrivateChanges", false));
+    return info;
+  }
+
+  private DownloadInfo getDownloadInfo() {
+    DownloadInfo info = new DownloadInfo();
+    info.schemes = new HashMap<>();
+    downloadSchemes.runEach(
+        extension -> {
+          DownloadScheme scheme = extension.get();
+          if (scheme.isEnabled() && scheme.getUrl("${project}") != null) {
+            info.schemes.put(extension.getExportName(), getDownloadSchemeInfo(scheme));
+          }
+        });
+    info.archives =
+        archiveFormats.getAllowed().stream().map(ArchiveFormat::getShortName).collect(toList());
+    return info;
+  }
+
+  private DownloadSchemeInfo getDownloadSchemeInfo(DownloadScheme scheme) {
+    DownloadSchemeInfo info = new DownloadSchemeInfo();
+    info.url = scheme.getUrl("${project}");
+    info.isAuthRequired = toBoolean(scheme.isAuthRequired());
+    info.isAuthSupported = toBoolean(scheme.isAuthSupported());
+
+    info.commands = new HashMap<>();
+    downloadCommands.runEach(
+        extension -> {
+          String commandName = extension.getExportName();
+          DownloadCommand command = extension.get();
+          String c = command.getCommand(scheme, "${project}", "${ref}");
+          if (c != null) {
+            info.commands.put(commandName, c);
+          }
+        });
+
+    info.cloneCommands = new HashMap<>();
+    cloneCommands.runEach(
+        extension -> {
+          String commandName = extension.getExportName();
+          CloneCommand command = extension.getProvider().get();
+          String c = command.getCommand(scheme, "${project-path}/${project-base-name}");
+          if (c != null) {
+            c =
+                c.replaceAll(
+                    "\\$\\{project-path\\}/\\$\\{project-base-name\\}", "\\$\\{project\\}");
+            info.cloneCommands.put(commandName, c);
+          }
+        });
+
+    return info;
+  }
+
+  private GerritInfo getGerritInfo() {
+    GerritInfo info = new GerritInfo();
+    info.allProjects = allProjectsName.get();
+    info.allUsers = allUsersName.get();
+    info.reportBugUrl = config.getString("gerrit", null, "reportBugUrl");
+    info.reportBugText = config.getString("gerrit", null, "reportBugText");
+    info.docUrl = getDocUrl();
+    info.docSearch = docSearcher.isAvailable();
+    info.editGpgKeys =
+        toBoolean(enableSignedPush && config.getBoolean("gerrit", null, "editGpgKeys", true));
+    info.webUis = EnumSet.noneOf(UiType.class);
+    info.webUis.add(UiType.POLYGERRIT);
+    if (gerritOptions.enableGwtUi()) {
+      info.webUis.add(UiType.GWT);
+    }
+    info.primaryWeblinkName = config.getString("gerrit", null, "primaryWeblinkName");
+    return info;
+  }
+
+  private String getDocUrl() {
+    String docUrl = config.getString("gerrit", null, "docUrl");
+    if (Strings.isNullOrEmpty(docUrl)) {
+      return null;
+    }
+    return CharMatcher.is('/').trimTrailingFrom(docUrl) + '/';
+  }
+
+  private boolean isNoteDbEnabled() {
+    return migration.readChanges();
+  }
+
+  private PluginConfigInfo getPluginInfo() {
+    PluginConfigInfo info = new PluginConfigInfo();
+    info.hasAvatars = toBoolean(avatar.hasImplementation());
+    info.jsResourcePaths = new ArrayList<>();
+    info.htmlResourcePaths = new ArrayList<>();
+    plugins.runEach(
+        plugin -> {
+          String path =
+              String.format(
+                  "plugins/%s/%s", plugin.getPluginName(), plugin.getJavaScriptResourcePath());
+          if (path.endsWith(".html")) {
+            info.htmlResourcePaths.add(path);
+          } else {
+            info.jsResourcePaths.add(path);
+          }
+        });
+    return info;
+  }
+
+  private static final String DEFAULT_THEME = "/static/" + SitePaths.THEME_FILENAME;
+
+  private String getDefaultTheme() {
+    if (config.getString("theme", null, "enableDefault") == null) {
+      // If not explicitly enabled or disabled, check for the existence of the theme file.
+      return Files.exists(sitePaths.site_theme) ? DEFAULT_THEME : null;
+    }
+    if (config.getBoolean("theme", null, "enableDefault", true)) {
+      // Return non-null theme path without checking for file existence. Even if the file doesn't
+      // exist under the site path, it may be served from a CDN (in which case it's up to the admin
+      // to also pass a proper asset path to the index Soy template).
+      return DEFAULT_THEME;
+    }
+    return null;
+  }
+
+  private Map<String, String> getUrlAliasesInfo() {
+    Map<String, String> urlAliases = new HashMap<>();
+    for (String subsection : config.getSubsections(URL_ALIAS)) {
+      urlAliases.put(
+          config.getString(URL_ALIAS, subsection, KEY_MATCH),
+          config.getString(URL_ALIAS, subsection, KEY_TOKEN));
+    }
+    return urlAliases;
+  }
+
+  private SshdInfo getSshdInfo() {
+    String[] addr = config.getStringList("sshd", null, "listenAddress");
+    if (addr.length == 1 && isOff(addr[0])) {
+      return null;
+    }
+    return new SshdInfo();
+  }
+
+  private static boolean isOff(String listenHostname) {
+    return "off".equalsIgnoreCase(listenHostname)
+        || "none".equalsIgnoreCase(listenHostname)
+        || "no".equalsIgnoreCase(listenHostname);
+  }
+
+  private SuggestInfo getSuggestInfo() {
+    SuggestInfo info = new SuggestInfo();
+    info.from = config.getInt("suggest", "from", 0);
+    return info;
+  }
+
+  private UserConfigInfo getUserInfo() {
+    UserConfigInfo info = new UserConfigInfo();
+    info.anonymousCowardName = anonymousCowardName;
+    return info;
+  }
+
+  private ReceiveInfo getReceiveInfo() {
+    ReceiveInfo info = new ReceiveInfo();
+    info.enableSignedPush = enableSignedPush;
+    return info;
+  }
+
+  private static Boolean toBoolean(boolean v) {
+    return v ? v : null;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/config/GetSummary.java b/java/com/google/gerrit/server/restapi/config/GetSummary.java
new file mode 100644
index 0000000..a382436
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/config/GetSummary.java
@@ -0,0 +1,281 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.config;
+
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.config.ConfigResource;
+import com.google.gerrit.server.config.SitePath;
+import com.google.gerrit.server.git.WorkQueue;
+import com.google.gerrit.server.git.WorkQueue.Task;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.lang.management.ManagementFactory;
+import java.lang.management.OperatingSystemMXBean;
+import java.lang.management.RuntimeMXBean;
+import java.lang.management.ThreadInfo;
+import java.lang.management.ThreadMXBean;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.jgit.storage.file.WindowCacheStats;
+import org.kohsuke.args4j.Option;
+
+@RequiresCapability(GlobalCapability.MAINTAIN_SERVER)
+public class GetSummary implements RestReadView<ConfigResource> {
+
+  private final WorkQueue workQueue;
+  private final Path sitePath;
+
+  @Option(name = "--gc", usage = "perform Java GC before retrieving memory stats")
+  private boolean gc;
+
+  public GetSummary setGc(boolean gc) {
+    this.gc = gc;
+    return this;
+  }
+
+  @Option(name = "--jvm", usage = "include details about the JVM")
+  private boolean jvm;
+
+  public GetSummary setJvm(boolean jvm) {
+    this.jvm = jvm;
+    return this;
+  }
+
+  @Inject
+  public GetSummary(WorkQueue workQueue, @SitePath Path sitePath) {
+    this.workQueue = workQueue;
+    this.sitePath = sitePath;
+  }
+
+  @Override
+  public SummaryInfo apply(ConfigResource rsrc) {
+    if (gc) {
+      System.gc();
+      System.runFinalization();
+      System.gc();
+    }
+
+    SummaryInfo summary = new SummaryInfo();
+    summary.taskSummary = getTaskSummary();
+    summary.memSummary = getMemSummary();
+    summary.threadSummary = getThreadSummary();
+    if (jvm) {
+      summary.jvmSummary = getJvmSummary();
+    }
+    return summary;
+  }
+
+  private TaskSummaryInfo getTaskSummary() {
+    Collection<Task<?>> pending = workQueue.getTasks();
+    int tasksTotal = pending.size();
+    int tasksRunning = 0;
+    int tasksReady = 0;
+    int tasksSleeping = 0;
+    for (Task<?> task : pending) {
+      switch (task.getState()) {
+        case RUNNING:
+          tasksRunning++;
+          break;
+        case READY:
+          tasksReady++;
+          break;
+        case SLEEPING:
+          tasksSleeping++;
+          break;
+        case CANCELLED:
+        case DONE:
+        case OTHER:
+          break;
+      }
+    }
+
+    TaskSummaryInfo taskSummary = new TaskSummaryInfo();
+    taskSummary.total = toInteger(tasksTotal);
+    taskSummary.running = toInteger(tasksRunning);
+    taskSummary.ready = toInteger(tasksReady);
+    taskSummary.sleeping = toInteger(tasksSleeping);
+    return taskSummary;
+  }
+
+  private MemSummaryInfo getMemSummary() {
+    Runtime r = Runtime.getRuntime();
+    long mMax = r.maxMemory();
+    long mFree = r.freeMemory();
+    long mTotal = r.totalMemory();
+    long mInuse = mTotal - mFree;
+
+    int jgitOpen = WindowCacheStats.getOpenFiles();
+    long jgitBytes = WindowCacheStats.getOpenBytes();
+
+    MemSummaryInfo memSummaryInfo = new MemSummaryInfo();
+    memSummaryInfo.total = bytes(mTotal);
+    memSummaryInfo.used = bytes(mInuse - jgitBytes);
+    memSummaryInfo.free = bytes(mFree);
+    memSummaryInfo.buffers = bytes(jgitBytes);
+    memSummaryInfo.max = bytes(mMax);
+    memSummaryInfo.openFiles = toInteger(jgitOpen);
+    return memSummaryInfo;
+  }
+
+  private ThreadSummaryInfo getThreadSummary() {
+    Runtime r = Runtime.getRuntime();
+    ThreadSummaryInfo threadInfo = new ThreadSummaryInfo();
+    threadInfo.cpus = r.availableProcessors();
+    threadInfo.threads = toInteger(ManagementFactory.getThreadMXBean().getThreadCount());
+
+    List<String> prefixes =
+        Arrays.asList(
+            "H2",
+            "HTTP",
+            "IntraLineDiff",
+            "ReceiveCommits",
+            "SSH git-receive-pack",
+            "SSH git-upload-pack",
+            "SSH-Interactive-Worker",
+            "SSH-Stream-Worker",
+            "SshCommandStart",
+            "sshd-SshServer");
+    String other = "Other";
+    ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
+
+    threadInfo.counts = new HashMap<>();
+    for (long id : threadMXBean.getAllThreadIds()) {
+      ThreadInfo info = threadMXBean.getThreadInfo(id);
+      if (info == null) {
+        continue;
+      }
+      String name = info.getThreadName();
+      Thread.State state = info.getThreadState();
+      String group = other;
+      for (String p : prefixes) {
+        if (name.startsWith(p)) {
+          group = p;
+          break;
+        }
+      }
+      Map<Thread.State, Integer> counts = threadInfo.counts.get(group);
+      if (counts == null) {
+        counts = new HashMap<>();
+        threadInfo.counts.put(group, counts);
+      }
+      Integer c = counts.get(state);
+      counts.put(state, c != null ? c + 1 : 1);
+    }
+
+    return threadInfo;
+  }
+
+  private JvmSummaryInfo getJvmSummary() {
+    OperatingSystemMXBean osBean = ManagementFactory.getOperatingSystemMXBean();
+    RuntimeMXBean runtimeBean = ManagementFactory.getRuntimeMXBean();
+
+    JvmSummaryInfo jvmSummary = new JvmSummaryInfo();
+    jvmSummary.vmVendor = runtimeBean.getVmVendor();
+    jvmSummary.vmName = runtimeBean.getVmName();
+    jvmSummary.vmVersion = runtimeBean.getVmVersion();
+    jvmSummary.osName = osBean.getName();
+    jvmSummary.osVersion = osBean.getVersion();
+    jvmSummary.osArch = osBean.getArch();
+    jvmSummary.user = System.getProperty("user.name");
+
+    try {
+      jvmSummary.host = InetAddress.getLocalHost().getHostName();
+    } catch (UnknownHostException e) {
+      // Ignored
+    }
+
+    jvmSummary.currentWorkingDirectory = path(Paths.get(".").toAbsolutePath().getParent());
+    jvmSummary.site = path(sitePath);
+    return jvmSummary;
+  }
+
+  private static Integer toInteger(int i) {
+    return i != 0 ? i : null;
+  }
+
+  private static String bytes(double value) {
+    value /= 1024;
+    String suffix = "k";
+
+    if (value > 1024) {
+      value /= 1024;
+      suffix = "m";
+    }
+    if (value > 1024) {
+      value /= 1024;
+      suffix = "g";
+    }
+    return String.format("%1$6.2f%2$s", value, suffix).trim();
+  }
+
+  private static String path(Path path) {
+    try {
+      return path.toRealPath().normalize().toString();
+    } catch (IOException err) {
+      return path.toAbsolutePath().normalize().toString();
+    }
+  }
+
+  public static class SummaryInfo {
+    public TaskSummaryInfo taskSummary;
+    public MemSummaryInfo memSummary;
+    public ThreadSummaryInfo threadSummary;
+    public JvmSummaryInfo jvmSummary;
+  }
+
+  public static class TaskSummaryInfo {
+    public Integer total;
+    public Integer running;
+    public Integer ready;
+    public Integer sleeping;
+  }
+
+  public static class MemSummaryInfo {
+    public String total;
+    public String used;
+    public String free;
+    public String buffers;
+    public String max;
+    public Integer openFiles;
+  }
+
+  public static class ThreadSummaryInfo {
+    public Integer cpus;
+    public Integer threads;
+    public Map<String, Map<Thread.State, Integer>> counts;
+  }
+
+  public static class JvmSummaryInfo {
+    public String vmVendor;
+    public String vmName;
+    public String vmVersion;
+    public String osName;
+    public String osVersion;
+    public String osArch;
+    public String user;
+    public String host;
+    public String currentWorkingDirectory;
+    public String site;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/config/GetTask.java b/java/com/google/gerrit/server/restapi/config/GetTask.java
new file mode 100644
index 0000000..a32f3ba
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/config/GetTask.java
@@ -0,0 +1,28 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.config;
+
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.config.TaskResource;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GetTask implements RestReadView<TaskResource> {
+
+  @Override
+  public ListTasks.TaskInfo apply(TaskResource rsrc) {
+    return new ListTasks.TaskInfo(rsrc.getTask());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/config/GetVersion.java b/java/com/google/gerrit/server/restapi/config/GetVersion.java
new file mode 100644
index 0000000..8135719
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/config/GetVersion.java
@@ -0,0 +1,33 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.config;
+
+import com.google.gerrit.common.Version;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.config.ConfigResource;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GetVersion implements RestReadView<ConfigResource> {
+  @Override
+  public String apply(ConfigResource resource) throws ResourceNotFoundException {
+    String version = Version.getVersion();
+    if (version == null) {
+      throw new ResourceNotFoundException();
+    }
+    return version;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/config/ListCaches.java b/java/com/google/gerrit/server/restapi/config/ListCaches.java
new file mode 100644
index 0000000..f310ed7
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/config/ListCaches.java
@@ -0,0 +1,202 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.config;
+
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static com.google.gerrit.common.data.GlobalCapability.MAINTAIN_SERVER;
+import static com.google.gerrit.common.data.GlobalCapability.VIEW_CACHES;
+import static com.google.gerrit.server.config.CacheResource.cacheNameOf;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.stream.Collectors.joining;
+
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheStats;
+import com.google.common.collect.Streams;
+import com.google.gerrit.extensions.annotations.RequiresAnyCapability;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.registration.Extension;
+import com.google.gerrit.extensions.restapi.BinaryResult;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.cache.PersistentCache;
+import com.google.gerrit.server.config.ConfigResource;
+import com.google.inject.Inject;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.stream.Stream;
+import org.kohsuke.args4j.Option;
+
+@RequiresAnyCapability({VIEW_CACHES, MAINTAIN_SERVER})
+public class ListCaches implements RestReadView<ConfigResource> {
+  private final DynamicMap<Cache<?, ?>> cacheMap;
+
+  public enum OutputFormat {
+    LIST,
+    TEXT_LIST
+  }
+
+  @Option(name = "--format", usage = "output format")
+  private OutputFormat format;
+
+  public ListCaches setFormat(OutputFormat format) {
+    this.format = format;
+    return this;
+  }
+
+  @Inject
+  public ListCaches(DynamicMap<Cache<?, ?>> cacheMap) {
+    this.cacheMap = cacheMap;
+  }
+
+  public Map<String, CacheInfo> getCacheInfos() {
+    Map<String, CacheInfo> cacheInfos = new TreeMap<>();
+    for (Extension<Cache<?, ?>> e : cacheMap) {
+      cacheInfos.put(
+          cacheNameOf(e.getPluginName(), e.getExportName()), new CacheInfo(e.getProvider().get()));
+    }
+    return cacheInfos;
+  }
+
+  @Override
+  public Object apply(ConfigResource rsrc) {
+    if (format == null) {
+      return getCacheInfos();
+    }
+    Stream<String> cacheNames =
+        Streams.stream(cacheMap)
+            .map(e -> cacheNameOf(e.getPluginName(), e.getExportName()))
+            .sorted();
+    if (OutputFormat.TEXT_LIST.equals(format)) {
+      return BinaryResult.create(cacheNames.collect(joining("\n")))
+          .base64()
+          .setContentType("text/plain")
+          .setCharacterEncoding(UTF_8);
+    }
+    return cacheNames.collect(toImmutableList());
+  }
+
+  public enum CacheType {
+    MEM,
+    DISK
+  }
+
+  public static class CacheInfo {
+    public String name;
+    public CacheType type;
+    public EntriesInfo entries;
+    public String averageGet;
+    public HitRatioInfo hitRatio;
+
+    public CacheInfo(Cache<?, ?> cache) {
+      this(null, cache);
+    }
+
+    public CacheInfo(String name, Cache<?, ?> cache) {
+      this.name = name;
+
+      CacheStats stat = cache.stats();
+
+      entries = new EntriesInfo();
+      entries.setMem(cache.size());
+
+      averageGet = duration(stat.averageLoadPenalty());
+
+      hitRatio = new HitRatioInfo();
+      hitRatio.setMem(stat.hitCount(), stat.requestCount());
+
+      if (cache instanceof PersistentCache) {
+        type = CacheType.DISK;
+        PersistentCache.DiskStats diskStats = ((PersistentCache) cache).diskStats();
+        entries.setDisk(diskStats.size());
+        entries.setSpace(diskStats.space());
+        hitRatio.setDisk(diskStats.hitCount(), diskStats.requestCount());
+      } else {
+        type = CacheType.MEM;
+      }
+    }
+
+    private static String duration(double ns) {
+      if (ns < 0.5) {
+        return null;
+      }
+      String suffix = "ns";
+      if (ns >= 1000.0) {
+        ns /= 1000.0;
+        suffix = "us";
+      }
+      if (ns >= 1000.0) {
+        ns /= 1000.0;
+        suffix = "ms";
+      }
+      if (ns >= 1000.0) {
+        ns /= 1000.0;
+        suffix = "s";
+      }
+      return String.format("%4.1f%s", ns, suffix).trim();
+    }
+  }
+
+  public static class EntriesInfo {
+    public Long mem;
+    public Long disk;
+    public String space;
+
+    public void setMem(long mem) {
+      this.mem = mem != 0 ? mem : null;
+    }
+
+    public void setDisk(long disk) {
+      this.disk = disk != 0 ? disk : null;
+    }
+
+    public void setSpace(double value) {
+      space = bytes(value);
+    }
+
+    private static String bytes(double value) {
+      value /= 1024;
+      String suffix = "k";
+
+      if (value > 1024) {
+        value /= 1024;
+        suffix = "m";
+      }
+      if (value > 1024) {
+        value /= 1024;
+        suffix = "g";
+      }
+      return String.format("%1$6.2f%2$s", value, suffix).trim();
+    }
+  }
+
+  public static class HitRatioInfo {
+    public Integer mem;
+    public Integer disk;
+
+    public void setMem(long value, long total) {
+      mem = percent(value, total);
+    }
+
+    public void setDisk(long value, long total) {
+      disk = percent(value, total);
+    }
+
+    private static Integer percent(long value, long total) {
+      if (total <= 0) {
+        return null;
+      }
+      return (int) ((100 * value) / total);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/config/ListCapabilities.java b/java/com/google/gerrit/server/restapi/config/ListCapabilities.java
new file mode 100644
index 0000000..fa9bfde
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/config/ListCapabilities.java
@@ -0,0 +1,100 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.config;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.config.CapabilityDefinition;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.config.CapabilityConstants;
+import com.google.gerrit.server.config.ConfigResource;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+/** List capabilities visible to the calling user. */
+@Singleton
+public class ListCapabilities implements RestReadView<ConfigResource> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final Pattern PLUGIN_NAME_PATTERN = Pattern.compile("^[a-zA-Z0-9-]+$");
+
+  private final PermissionBackend permissionBackend;
+  private final DynamicMap<CapabilityDefinition> pluginCapabilities;
+
+  @Inject
+  public ListCapabilities(
+      PermissionBackend permissionBackend, DynamicMap<CapabilityDefinition> pluginCapabilities) {
+    this.permissionBackend = permissionBackend;
+    this.pluginCapabilities = pluginCapabilities;
+  }
+
+  @Override
+  public Map<String, CapabilityInfo> apply(ConfigResource resource)
+      throws ResourceNotFoundException, IllegalAccessException, NoSuchFieldException {
+    permissionBackend.checkUsesDefaultCapabilities();
+    return ImmutableMap.<String, CapabilityInfo>builder()
+        .putAll(collectCoreCapabilities())
+        .putAll(collectPluginCapabilities())
+        .build();
+  }
+
+  public Map<String, CapabilityInfo> collectPluginCapabilities() {
+    Map<String, CapabilityInfo> output = new HashMap<>();
+    for (String pluginName : pluginCapabilities.plugins()) {
+      if (!PLUGIN_NAME_PATTERN.matcher(pluginName).matches()) {
+        logger.atWarning().log(
+            "Plugin name '%s' must match '%s' to use capabilities; rename the plugin",
+            pluginName, PLUGIN_NAME_PATTERN.pattern());
+        continue;
+      }
+      for (Map.Entry<String, Provider<CapabilityDefinition>> entry :
+          pluginCapabilities.byPlugin(pluginName).entrySet()) {
+        String id = String.format("%s-%s", pluginName, entry.getKey());
+        output.put(id, new CapabilityInfo(id, entry.getValue().get().getDescription()));
+      }
+    }
+    return output;
+  }
+
+  private Map<String, CapabilityInfo> collectCoreCapabilities()
+      throws IllegalAccessException, NoSuchFieldException {
+    Map<String, CapabilityInfo> output = new HashMap<>();
+    Class<? extends CapabilityConstants> bundleClass = CapabilityConstants.get().getClass();
+    CapabilityConstants c = CapabilityConstants.get();
+    for (String id : GlobalCapability.getAllNames()) {
+      String name = (String) bundleClass.getField(id).get(c);
+      output.put(id, new CapabilityInfo(id, name));
+    }
+    return output;
+  }
+
+  public static class CapabilityInfo {
+    public String id;
+    public String name;
+
+    public CapabilityInfo(String id, String name) {
+      this.id = id;
+      this.name = name;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/config/ListTasks.java b/java/com/google/gerrit/server/restapi/config/ListTasks.java
new file mode 100644
index 0000000..7402c15
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/config/ListTasks.java
@@ -0,0 +1,145 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.config;
+
+import static java.util.Comparator.comparing;
+import static java.util.stream.Collectors.toList;
+
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.config.ConfigResource;
+import com.google.gerrit.server.git.WorkQueue;
+import com.google.gerrit.server.git.WorkQueue.ProjectTask;
+import com.google.gerrit.server.git.WorkQueue.Task;
+import com.google.gerrit.server.ioutil.HexFormat;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+@Singleton
+public class ListTasks implements RestReadView<ConfigResource> {
+  private final PermissionBackend permissionBackend;
+  private final WorkQueue workQueue;
+  private final Provider<CurrentUser> self;
+  private final ProjectCache projectCache;
+
+  @Inject
+  public ListTasks(
+      PermissionBackend permissionBackend,
+      WorkQueue workQueue,
+      Provider<CurrentUser> self,
+      ProjectCache projectCache) {
+    this.permissionBackend = permissionBackend;
+    this.workQueue = workQueue;
+    this.self = self;
+    this.projectCache = projectCache;
+  }
+
+  @Override
+  public List<TaskInfo> apply(ConfigResource resource)
+      throws AuthException, PermissionBackendException {
+    CurrentUser user = self.get();
+    if (!user.isIdentifiedUser()) {
+      throw new AuthException("Authentication required");
+    }
+
+    List<TaskInfo> allTasks = getTasks();
+    try {
+      permissionBackend.user(user).check(GlobalPermission.VIEW_QUEUE);
+      return allTasks;
+    } catch (AuthException e) {
+      // Fall through to filter tasks.
+    }
+
+    Map<String, Boolean> visibilityCache = new HashMap<>();
+    List<TaskInfo> visibleTasks = new ArrayList<>();
+    for (TaskInfo task : allTasks) {
+      if (task.projectName != null) {
+        Boolean visible = visibilityCache.get(task.projectName);
+        if (visible == null) {
+          Project.NameKey nameKey = new Project.NameKey(task.projectName);
+          ProjectState state = projectCache.get(nameKey);
+          if (state == null || !state.statePermitsRead()) {
+            visible = false;
+          } else {
+            try {
+              permissionBackend.user(user).project(nameKey).check(ProjectPermission.ACCESS);
+              visible = true;
+            } catch (AuthException e) {
+              visible = false;
+            }
+          }
+          visibilityCache.put(task.projectName, visible);
+        }
+        if (visible) {
+          visibleTasks.add(task);
+        }
+      }
+    }
+    return visibleTasks;
+  }
+
+  private List<TaskInfo> getTasks() {
+    return workQueue.getTaskInfos(TaskInfo::new).stream()
+        .sorted(
+            comparing((TaskInfo t) -> t.state.ordinal())
+                .thenComparing(t -> t.delay)
+                .thenComparing(t -> t.command))
+        .collect(toList());
+  }
+
+  public static class TaskInfo {
+    public String id;
+    public Task.State state;
+    public Timestamp startTime;
+    public long delay;
+    public String command;
+    public String remoteName;
+    public String projectName;
+    public String queueName;
+
+    public TaskInfo(Task<?> task) {
+      this.id = HexFormat.fromInt(task.getTaskId());
+      this.state = task.getState();
+      this.startTime = new Timestamp(task.getStartTime().getTime());
+      this.delay = task.getDelay(TimeUnit.MILLISECONDS);
+      this.command = task.toString();
+      this.queueName = task.getQueueName();
+
+      if (task instanceof ProjectTask) {
+        ProjectTask<?> projectTask = ((ProjectTask<?>) task);
+        Project.NameKey name = projectTask.getProjectNameKey();
+        if (name != null) {
+          this.projectName = name.get();
+        }
+        this.remoteName = projectTask.getRemoteName();
+      }
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/config/ListTopMenus.java b/java/com/google/gerrit/server/restapi/config/ListTopMenus.java
new file mode 100644
index 0000000..7a85bcd
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/config/ListTopMenus.java
@@ -0,0 +1,43 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.config;
+
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.extensions.webui.TopMenu;
+import com.google.gerrit.server.config.ConfigResource;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.ArrayList;
+import java.util.List;
+
+@Singleton
+class ListTopMenus implements RestReadView<ConfigResource> {
+  private final DynamicSet<TopMenu> extensions;
+
+  @Inject
+  ListTopMenus(DynamicSet<TopMenu> extensions) {
+    this.extensions = extensions;
+  }
+
+  @Override
+  public List<TopMenu.MenuEntry> apply(ConfigResource resource) {
+    List<TopMenu.MenuEntry> entries = new ArrayList<>();
+    for (TopMenu extension : extensions) {
+      entries.addAll(extension.getEntries());
+    }
+    return entries;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/config/Module.java b/java/com/google/gerrit/server/restapi/config/Module.java
new file mode 100644
index 0000000..c4a6f56
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/config/Module.java
@@ -0,0 +1,49 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.config;
+
+import static com.google.gerrit.server.config.ConfigResource.CONFIG_KIND;
+import static com.google.gerrit.server.config.TaskResource.TASK_KIND;
+
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.RestApiModule;
+import com.google.gerrit.server.config.CapabilityResource;
+import com.google.gerrit.server.config.TopMenuResource;
+
+public class Module extends RestApiModule {
+  @Override
+  protected void configure() {
+    DynamicMap.mapOf(binder(), CapabilityResource.CAPABILITY_KIND);
+    DynamicMap.mapOf(binder(), CONFIG_KIND);
+    DynamicMap.mapOf(binder(), TASK_KIND);
+    DynamicMap.mapOf(binder(), TopMenuResource.TOP_MENU_KIND);
+    child(CONFIG_KIND, "capabilities").to(CapabilitiesCollection.class);
+    child(CONFIG_KIND, "tasks").to(TasksCollection.class);
+    get(TASK_KIND).to(GetTask.class);
+    delete(TASK_KIND).to(DeleteTask.class);
+    child(CONFIG_KIND, "top-menus").to(TopMenuCollection.class);
+    get(CONFIG_KIND, "version").to(GetVersion.class);
+    get(CONFIG_KIND, "info").to(GetServerInfo.class);
+    post(CONFIG_KIND, "check.consistency").to(CheckConsistency.class);
+    post(CONFIG_KIND, "reload").to(ReloadConfig.class);
+    get(CONFIG_KIND, "preferences").to(GetPreferences.class);
+    put(CONFIG_KIND, "preferences").to(SetPreferences.class);
+    get(CONFIG_KIND, "preferences.diff").to(GetDiffPreferences.class);
+    put(CONFIG_KIND, "preferences.diff").to(SetDiffPreferences.class);
+    get(CONFIG_KIND, "preferences.edit").to(GetEditPreferences.class);
+    put(CONFIG_KIND, "preferences.edit").to(SetEditPreferences.class);
+    put(CONFIG_KIND, "email.confirm").to(ConfirmEmail.class);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/config/PostCaches.java b/java/com/google/gerrit/server/restapi/config/PostCaches.java
new file mode 100644
index 0000000..c633af0
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/config/PostCaches.java
@@ -0,0 +1,135 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.config;
+
+import static com.google.gerrit.common.data.GlobalCapability.FLUSH_CACHES;
+import static com.google.gerrit.common.data.GlobalCapability.MAINTAIN_SERVER;
+
+import com.google.common.cache.Cache;
+import com.google.gerrit.extensions.annotations.RequiresAnyCapability;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.registration.Extension;
+import com.google.gerrit.extensions.registration.PluginName;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestCollectionModifyView;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.server.config.CacheResource;
+import com.google.gerrit.server.config.ConfigResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.restapi.config.PostCaches.Input;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.ArrayList;
+import java.util.List;
+
+@RequiresAnyCapability({FLUSH_CACHES, MAINTAIN_SERVER})
+@Singleton
+public class PostCaches implements RestCollectionModifyView<ConfigResource, CacheResource, Input> {
+  public static class Input {
+    public Operation operation;
+    public List<String> caches;
+
+    public Input() {}
+
+    public Input(Operation op) {
+      this(op, null);
+    }
+
+    public Input(Operation op, List<String> c) {
+      operation = op;
+      caches = c;
+    }
+  }
+
+  public enum Operation {
+    FLUSH_ALL,
+    FLUSH
+  }
+
+  private final DynamicMap<Cache<?, ?>> cacheMap;
+  private final FlushCache flushCache;
+
+  @Inject
+  public PostCaches(DynamicMap<Cache<?, ?>> cacheMap, FlushCache flushCache) {
+    this.cacheMap = cacheMap;
+    this.flushCache = flushCache;
+  }
+
+  @Override
+  public Response<String> apply(ConfigResource rsrc, Input input)
+      throws AuthException, BadRequestException, UnprocessableEntityException,
+          PermissionBackendException {
+    if (input == null || input.operation == null) {
+      throw new BadRequestException("operation must be specified");
+    }
+
+    switch (input.operation) {
+      case FLUSH_ALL:
+        if (input.caches != null) {
+          throw new BadRequestException(
+              "specifying caches is not allowed for operation 'FLUSH_ALL'");
+        }
+        flushAll();
+        return Response.ok("");
+      case FLUSH:
+        if (input.caches == null || input.caches.isEmpty()) {
+          throw new BadRequestException("caches must be specified for operation 'FLUSH'");
+        }
+        flush(input.caches);
+        return Response.ok("");
+      default:
+        throw new BadRequestException("unsupported operation: " + input.operation);
+    }
+  }
+
+  private void flushAll() throws AuthException, PermissionBackendException {
+    for (Extension<Cache<?, ?>> e : cacheMap) {
+      CacheResource cacheResource =
+          new CacheResource(e.getPluginName(), e.getExportName(), e.getProvider());
+      if (FlushCache.WEB_SESSIONS.equals(cacheResource.getName())) {
+        continue;
+      }
+      flushCache.apply(cacheResource, null);
+    }
+  }
+
+  private void flush(List<String> cacheNames)
+      throws UnprocessableEntityException, AuthException, PermissionBackendException {
+    List<CacheResource> cacheResources = new ArrayList<>(cacheNames.size());
+
+    for (String n : cacheNames) {
+      String pluginName = PluginName.GERRIT;
+      String cacheName = n;
+      int i = cacheName.lastIndexOf('-');
+      if (i != -1) {
+        pluginName = cacheName.substring(0, i);
+        cacheName = cacheName.length() > i + 1 ? cacheName.substring(i + 1) : "";
+      }
+
+      Cache<?, ?> cache = cacheMap.get(pluginName, cacheName);
+      if (cache != null) {
+        cacheResources.add(new CacheResource(pluginName, cacheName, cache));
+      } else {
+        throw new UnprocessableEntityException(String.format("cache %s not found", n));
+      }
+    }
+
+    for (CacheResource rsrc : cacheResources) {
+      flushCache.apply(rsrc, null);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/config/ReloadConfig.java b/java/com/google/gerrit/server/restapi/config/ReloadConfig.java
new file mode 100644
index 0000000..0685a58
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/config/ReloadConfig.java
@@ -0,0 +1,77 @@
+// 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.
+
+package com.google.gerrit.server.restapi.config;
+
+import static com.google.common.collect.ImmutableList.toImmutableList;
+
+import com.google.common.collect.Multimap;
+import com.google.gerrit.extensions.api.config.ConfigUpdateEntryInfo;
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.config.ConfigResource;
+import com.google.gerrit.server.config.ConfigUpdatedEvent.ConfigUpdateEntry;
+import com.google.gerrit.server.config.ConfigUpdatedEvent.UpdateResult;
+import com.google.gerrit.server.config.GerritServerConfigReloader;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.inject.Inject;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+public class ReloadConfig implements RestModifyView<ConfigResource, Input> {
+
+  private GerritServerConfigReloader config;
+  private PermissionBackend permissions;
+
+  @Inject
+  ReloadConfig(GerritServerConfigReloader config, PermissionBackend permissions) {
+    this.config = config;
+    this.permissions = permissions;
+  }
+
+  @Override
+  public Map<String, List<ConfigUpdateEntryInfo>> apply(ConfigResource resource, Input input)
+      throws RestApiException, PermissionBackendException {
+    permissions.currentUser().check(GlobalPermission.ADMINISTRATE_SERVER);
+    Multimap<UpdateResult, ConfigUpdateEntry> updates = config.reloadConfig();
+    if (updates.isEmpty()) {
+      return Collections.emptyMap();
+    }
+    return updates.asMap().entrySet().stream()
+        .collect(
+            Collectors.toMap(
+                e -> e.getKey().name().toLowerCase(), e -> toEntryInfos(e.getValue())));
+  }
+
+  private static List<ConfigUpdateEntryInfo> toEntryInfos(
+      Collection<ConfigUpdateEntry> updateEntries) {
+    return updateEntries.stream()
+        .map(ReloadConfig::toConfigUpdateEntryInfo)
+        .collect(toImmutableList());
+  }
+
+  private static ConfigUpdateEntryInfo toConfigUpdateEntryInfo(ConfigUpdateEntry e) {
+    ConfigUpdateEntryInfo uei = new ConfigUpdateEntryInfo();
+    uei.configKey = e.key.toString();
+    uei.oldValue = e.oldVal;
+    uei.newValue = e.newVal;
+    return uei;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/config/RestCacheAdminModule.java b/java/com/google/gerrit/server/restapi/config/RestCacheAdminModule.java
new file mode 100644
index 0000000..c929bc6
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/config/RestCacheAdminModule.java
@@ -0,0 +1,34 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.config;
+
+import static com.google.gerrit.server.config.CacheResource.CACHE_KIND;
+import static com.google.gerrit.server.config.ConfigResource.CONFIG_KIND;
+
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.RestApiModule;
+
+public class RestCacheAdminModule extends RestApiModule {
+
+  @Override
+  protected void configure() {
+    DynamicMap.mapOf(binder(), CACHE_KIND);
+    child(CONFIG_KIND, "caches").to(CachesCollection.class);
+    postOnCollection(CACHE_KIND).to(PostCaches.class);
+    get(CACHE_KIND).to(GetCache.class);
+    post(CACHE_KIND, "flush").to(FlushCache.class);
+    get(CONFIG_KIND, "summary").to(GetSummary.class);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/config/SetDiffPreferences.java b/java/com/google/gerrit/server/restapi/config/SetDiffPreferences.java
new file mode 100644
index 0000000..068f332
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/config/SetDiffPreferences.java
@@ -0,0 +1,88 @@
+// 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.
+
+package com.google.gerrit.server.restapi.config;
+
+import static com.google.gerrit.server.config.ConfigUtil.skipField;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.extensions.client.DiffPreferencesInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.Preferences;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.ConfigResource;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
+@Singleton
+public class SetDiffPreferences implements RestModifyView<ConfigResource, DiffPreferencesInfo> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final Provider<MetaDataUpdate.User> metaDataUpdateFactory;
+  private final AllUsersName allUsersName;
+  private final AccountCache accountCache;
+
+  @Inject
+  SetDiffPreferences(
+      Provider<MetaDataUpdate.User> metaDataUpdateFactory,
+      AllUsersName allUsersName,
+      AccountCache accountCache) {
+    this.metaDataUpdateFactory = metaDataUpdateFactory;
+    this.allUsersName = allUsersName;
+    this.accountCache = accountCache;
+  }
+
+  @Override
+  public DiffPreferencesInfo apply(ConfigResource configResource, DiffPreferencesInfo input)
+      throws BadRequestException, IOException, ConfigInvalidException {
+    if (input == null) {
+      throw new BadRequestException("input must be provided");
+    }
+    if (!hasSetFields(input)) {
+      throw new BadRequestException("unsupported option");
+    }
+
+    try (MetaDataUpdate md = metaDataUpdateFactory.get().create(allUsersName)) {
+      DiffPreferencesInfo updatedPrefs = Preferences.updateDefaultDiffPreferences(md, input);
+      accountCache.evictAll();
+      return updatedPrefs;
+    }
+  }
+
+  private static boolean hasSetFields(DiffPreferencesInfo in) {
+    try {
+      for (Field field : in.getClass().getDeclaredFields()) {
+        if (skipField(field)) {
+          continue;
+        }
+        if (field.get(in) != null) {
+          return true;
+        }
+      }
+    } catch (IllegalAccessException e) {
+      logger.atWarning().withCause(e).log("Unable to verify input");
+    }
+    return false;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/config/SetEditPreferences.java b/java/com/google/gerrit/server/restapi/config/SetEditPreferences.java
new file mode 100644
index 0000000..daca734
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/config/SetEditPreferences.java
@@ -0,0 +1,88 @@
+// 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.
+
+package com.google.gerrit.server.restapi.config;
+
+import static com.google.gerrit.server.config.ConfigUtil.skipField;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.extensions.client.EditPreferencesInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.Preferences;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.ConfigResource;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
+@Singleton
+public class SetEditPreferences implements RestModifyView<ConfigResource, EditPreferencesInfo> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final Provider<MetaDataUpdate.User> metaDataUpdateFactory;
+  private final AllUsersName allUsersName;
+  private final AccountCache accountCache;
+
+  @Inject
+  SetEditPreferences(
+      Provider<MetaDataUpdate.User> metaDataUpdateFactory,
+      AllUsersName allUsersName,
+      AccountCache accountCache) {
+    this.metaDataUpdateFactory = metaDataUpdateFactory;
+    this.allUsersName = allUsersName;
+    this.accountCache = accountCache;
+  }
+
+  @Override
+  public EditPreferencesInfo apply(ConfigResource configResource, EditPreferencesInfo input)
+      throws BadRequestException, IOException, ConfigInvalidException {
+    if (input == null) {
+      throw new BadRequestException("input must be provided");
+    }
+    if (!hasSetFields(input)) {
+      throw new BadRequestException("unsupported option");
+    }
+
+    try (MetaDataUpdate md = metaDataUpdateFactory.get().create(allUsersName)) {
+      EditPreferencesInfo updatedPrefs = Preferences.updateDefaultEditPreferences(md, input);
+      accountCache.evictAll();
+      return updatedPrefs;
+    }
+  }
+
+  private static boolean hasSetFields(EditPreferencesInfo in) {
+    try {
+      for (Field field : in.getClass().getDeclaredFields()) {
+        if (skipField(field)) {
+          continue;
+        }
+        if (field.get(in) != null) {
+          return true;
+        }
+      }
+    } catch (IllegalAccessException e) {
+      logger.atSevere().withCause(e).log("Unable to verify input");
+    }
+    return false;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/config/SetPreferences.java b/java/com/google/gerrit/server/restapi/config/SetPreferences.java
new file mode 100644
index 0000000..6a0c22b
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/config/SetPreferences.java
@@ -0,0 +1,85 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.config;
+
+import static com.google.gerrit.server.config.ConfigUtil.skipField;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.Preferences;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.ConfigResource;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
+@Singleton
+public class SetPreferences implements RestModifyView<ConfigResource, GeneralPreferencesInfo> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final Provider<MetaDataUpdate.User> metaDataUpdateFactory;
+  private final AllUsersName allUsersName;
+  private final AccountCache accountCache;
+
+  @Inject
+  SetPreferences(
+      Provider<MetaDataUpdate.User> metaDataUpdateFactory,
+      AllUsersName allUsersName,
+      AccountCache accountCache) {
+    this.metaDataUpdateFactory = metaDataUpdateFactory;
+    this.allUsersName = allUsersName;
+    this.accountCache = accountCache;
+  }
+
+  @Override
+  public GeneralPreferencesInfo apply(ConfigResource rsrc, GeneralPreferencesInfo input)
+      throws BadRequestException, IOException, ConfigInvalidException {
+    if (!hasSetFields(input)) {
+      throw new BadRequestException("unsupported option");
+    }
+    Preferences.validateMy(input.my);
+    try (MetaDataUpdate md = metaDataUpdateFactory.get().create(allUsersName)) {
+      GeneralPreferencesInfo updatedPrefs = Preferences.updateDefaultGeneralPreferences(md, input);
+      accountCache.evictAll();
+      return updatedPrefs;
+    }
+  }
+
+  private static boolean hasSetFields(GeneralPreferencesInfo in) {
+    try {
+      for (Field field : in.getClass().getDeclaredFields()) {
+        if (skipField(field)) {
+          continue;
+        }
+        if (field.get(in) != null) {
+          return true;
+        }
+      }
+    } catch (IllegalAccessException e) {
+      logger.atSevere().withCause(e).log("Unable to verify input");
+    }
+    return false;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/config/TasksCollection.java b/java/com/google/gerrit/server/restapi/config/TasksCollection.java
new file mode 100644
index 0000000..dda54a0
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/config/TasksCollection.java
@@ -0,0 +1,121 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.config;
+
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ChildCollection;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.config.ConfigResource;
+import com.google.gerrit.server.config.TaskResource;
+import com.google.gerrit.server.git.WorkQueue;
+import com.google.gerrit.server.git.WorkQueue.ProjectTask;
+import com.google.gerrit.server.git.WorkQueue.Task;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+@Singleton
+public class TasksCollection implements ChildCollection<ConfigResource, TaskResource> {
+  private final DynamicMap<RestView<TaskResource>> views;
+  private final ListTasks list;
+  private final WorkQueue workQueue;
+  private final Provider<CurrentUser> self;
+  private final PermissionBackend permissionBackend;
+  private final ProjectCache projectCache;
+
+  @Inject
+  TasksCollection(
+      DynamicMap<RestView<TaskResource>> views,
+      ListTasks list,
+      WorkQueue workQueue,
+      Provider<CurrentUser> self,
+      PermissionBackend permissionBackend,
+      ProjectCache projectCache) {
+    this.views = views;
+    this.list = list;
+    this.workQueue = workQueue;
+    this.self = self;
+    this.permissionBackend = permissionBackend;
+    this.projectCache = projectCache;
+  }
+
+  @Override
+  public RestView<ConfigResource> list() {
+    return list;
+  }
+
+  @Override
+  public TaskResource parse(ConfigResource parent, IdString id)
+      throws ResourceNotFoundException, AuthException, PermissionBackendException,
+          ResourceConflictException {
+    CurrentUser user = self.get();
+    if (!user.isIdentifiedUser()) {
+      throw new AuthException("Authentication required");
+    }
+
+    int taskId;
+    try {
+      taskId = (int) Long.parseLong(id.get(), 16);
+    } catch (NumberFormatException e) {
+      throw new ResourceNotFoundException(id);
+    }
+
+    Task<?> task = workQueue.getTask(taskId);
+    if (task instanceof ProjectTask) {
+      Project.NameKey nameKey = ((ProjectTask<?>) task).getProjectNameKey();
+      ProjectState state = projectCache.get(nameKey);
+      if (state == null) {
+        throw new ResourceNotFoundException(String.format("project %s not found", nameKey));
+      }
+
+      state.checkStatePermitsRead();
+
+      try {
+        permissionBackend.user(user).project(nameKey).check(ProjectPermission.ACCESS);
+        return new TaskResource(task);
+      } catch (AuthException e) {
+        // Fall through and try view queue permission.
+      }
+    }
+
+    if (task != null) {
+      try {
+        permissionBackend.user(user).check(GlobalPermission.VIEW_QUEUE);
+        return new TaskResource(task);
+      } catch (AuthException e) {
+        // Fall through and return not found.
+      }
+    }
+
+    throw new ResourceNotFoundException(id);
+  }
+
+  @Override
+  public DynamicMap<RestView<TaskResource>> views() {
+    return views;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/config/TopMenuCollection.java b/java/com/google/gerrit/server/restapi/config/TopMenuCollection.java
new file mode 100644
index 0000000..cca1475
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/config/TopMenuCollection.java
@@ -0,0 +1,53 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.config;
+
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.ChildCollection;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.server.config.ConfigResource;
+import com.google.gerrit.server.config.TopMenuResource;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class TopMenuCollection implements ChildCollection<ConfigResource, TopMenuResource> {
+  private final DynamicMap<RestView<TopMenuResource>> views;
+  private final ListTopMenus list;
+
+  @Inject
+  TopMenuCollection(DynamicMap<RestView<TopMenuResource>> views, ListTopMenus list) {
+    this.views = views;
+    this.list = list;
+  }
+
+  @Override
+  public RestView<ConfigResource> list() throws ResourceNotFoundException {
+    return list;
+  }
+
+  @Override
+  public TopMenuResource parse(ConfigResource parent, IdString id)
+      throws ResourceNotFoundException {
+    throw new ResourceNotFoundException(id);
+  }
+
+  @Override
+  public DynamicMap<RestView<TopMenuResource>> views() {
+    return views;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/group/AddMembers.java b/java/com/google/gerrit/server/restapi/group/AddMembers.java
new file mode 100644
index 0000000..bdf1c74
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/group/AddMembers.java
@@ -0,0 +1,259 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.group;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.common.errors.NoSuchGroupException;
+import com.google.gerrit.extensions.client.AuthType;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.DefaultInput;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestCollectionCreateView;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.UserInitiated;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountException;
+import com.google.gerrit.server.account.AccountLoader;
+import com.google.gerrit.server.account.AccountManager;
+import com.google.gerrit.server.account.AccountResolver;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.account.AuthRequest;
+import com.google.gerrit.server.account.GroupControl;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.config.AuthConfig;
+import com.google.gerrit.server.group.GroupResource;
+import com.google.gerrit.server.group.MemberResource;
+import com.google.gerrit.server.group.db.GroupsUpdate;
+import com.google.gerrit.server.group.db.InternalGroupUpdate;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.restapi.group.AddMembers.Input;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class AddMembers implements RestModifyView<GroupResource, Input> {
+  public static class Input {
+    @DefaultInput String _oneMember;
+
+    List<String> members;
+
+    public static Input fromMembers(List<String> members) {
+      Input in = new Input();
+      in.members = members;
+      return in;
+    }
+
+    static Input init(Input in) {
+      if (in == null) {
+        in = new Input();
+      }
+      if (in.members == null) {
+        in.members = Lists.newArrayListWithCapacity(1);
+      }
+      if (!Strings.isNullOrEmpty(in._oneMember)) {
+        in.members.add(in._oneMember);
+      }
+      return in;
+    }
+  }
+
+  private final AccountManager accountManager;
+  private final AuthType authType;
+  private final AccountResolver accountResolver;
+  private final AccountCache accountCache;
+  private final AccountLoader.Factory infoFactory;
+  private final Provider<GroupsUpdate> groupsUpdateProvider;
+
+  @Inject
+  AddMembers(
+      AccountManager accountManager,
+      AuthConfig authConfig,
+      AccountResolver accountResolver,
+      AccountCache accountCache,
+      AccountLoader.Factory infoFactory,
+      @UserInitiated Provider<GroupsUpdate> groupsUpdateProvider) {
+    this.accountManager = accountManager;
+    this.authType = authConfig.getAuthType();
+    this.accountResolver = accountResolver;
+    this.accountCache = accountCache;
+    this.infoFactory = infoFactory;
+    this.groupsUpdateProvider = groupsUpdateProvider;
+  }
+
+  @Override
+  public List<AccountInfo> apply(GroupResource resource, Input input)
+      throws AuthException, NotInternalGroupException, UnprocessableEntityException, OrmException,
+          IOException, ConfigInvalidException, ResourceNotFoundException,
+          PermissionBackendException {
+    GroupDescription.Internal internalGroup =
+        resource.asInternalGroup().orElseThrow(NotInternalGroupException::new);
+    input = Input.init(input);
+
+    GroupControl control = resource.getControl();
+    if (!control.canAddMember()) {
+      throw new AuthException("Cannot add members to group " + internalGroup.getName());
+    }
+
+    Set<Account.Id> newMemberIds = new LinkedHashSet<>();
+    for (String nameOrEmailOrId : input.members) {
+      Account a = findAccount(nameOrEmailOrId);
+      if (!a.isActive()) {
+        throw new UnprocessableEntityException(
+            String.format("Account Inactive: %s", nameOrEmailOrId));
+      }
+      newMemberIds.add(a.getId());
+    }
+
+    AccountGroup.UUID groupUuid = internalGroup.getGroupUUID();
+    try {
+      addMembers(groupUuid, newMemberIds);
+    } catch (NoSuchGroupException e) {
+      throw new ResourceNotFoundException(String.format("Group %s not found", groupUuid));
+    }
+    return toAccountInfoList(newMemberIds);
+  }
+
+  Account findAccount(String nameOrEmailOrId)
+      throws AuthException, UnprocessableEntityException, OrmException, IOException,
+          ConfigInvalidException {
+    try {
+      return accountResolver.parse(nameOrEmailOrId).getAccount();
+    } catch (UnprocessableEntityException e) {
+      // might be because the account does not exist or because the account is
+      // not visible
+      switch (authType) {
+        case HTTP_LDAP:
+        case CLIENT_SSL_CERT_LDAP:
+        case LDAP:
+          if (accountResolver.find(nameOrEmailOrId) == null) {
+            // account does not exist, try to create it
+            Optional<Account> a = createAccountByLdap(nameOrEmailOrId);
+            if (a.isPresent()) {
+              return a.get();
+            }
+          }
+          break;
+        case CUSTOM_EXTENSION:
+        case DEVELOPMENT_BECOME_ANY_ACCOUNT:
+        case HTTP:
+        case LDAP_BIND:
+        case OAUTH:
+        case OPENID:
+        case OPENID_SSO:
+        default:
+      }
+      throw e;
+    }
+  }
+
+  public void addMembers(AccountGroup.UUID groupUuid, Set<Account.Id> newMemberIds)
+      throws OrmException, IOException, NoSuchGroupException, ConfigInvalidException {
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder()
+            .setMemberModification(memberIds -> Sets.union(memberIds, newMemberIds))
+            .build();
+    groupsUpdateProvider.get().updateGroup(groupUuid, groupUpdate);
+  }
+
+  private Optional<Account> createAccountByLdap(String user) throws IOException {
+    if (!ExternalId.isValidUsername(user)) {
+      return Optional.empty();
+    }
+
+    try {
+      AuthRequest req = AuthRequest.forUser(user);
+      req.setSkipAuthentication(true);
+      return accountCache
+          .get(accountManager.authenticate(req).getAccountId())
+          .map(AccountState::getAccount);
+    } catch (AccountException e) {
+      return Optional.empty();
+    }
+  }
+
+  private List<AccountInfo> toAccountInfoList(Set<Account.Id> accountIds)
+      throws PermissionBackendException {
+    List<AccountInfo> result = new ArrayList<>();
+    AccountLoader loader = infoFactory.create(true);
+    for (Account.Id accId : accountIds) {
+      result.add(loader.get(accId));
+    }
+    loader.fill();
+    return result;
+  }
+
+  @Singleton
+  public static class CreateMember
+      implements RestCollectionCreateView<GroupResource, MemberResource, Input> {
+    private final AddMembers put;
+
+    @Inject
+    public CreateMember(AddMembers put) {
+      this.put = put;
+    }
+
+    @Override
+    public AccountInfo apply(GroupResource resource, IdString id, Input input)
+        throws AuthException, MethodNotAllowedException, ResourceNotFoundException, OrmException,
+            IOException, ConfigInvalidException, PermissionBackendException {
+      AddMembers.Input in = new AddMembers.Input();
+      in._oneMember = id.get();
+      try {
+        List<AccountInfo> list = put.apply(resource, in);
+        if (list.size() == 1) {
+          return list.get(0);
+        }
+        throw new IllegalStateException();
+      } catch (UnprocessableEntityException e) {
+        throw new ResourceNotFoundException(id);
+      }
+    }
+  }
+
+  @Singleton
+  public static class UpdateMember implements RestModifyView<MemberResource, Input> {
+    private final GetMember get;
+
+    @Inject
+    public UpdateMember(GetMember get) {
+      this.get = get;
+    }
+
+    @Override
+    public AccountInfo apply(MemberResource resource, Input input)
+        throws OrmException, PermissionBackendException {
+      // Do nothing, the user is already a member.
+      return get.apply(resource);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/group/AddSubgroups.java b/java/com/google/gerrit/server/restapi/group/AddSubgroups.java
new file mode 100644
index 0000000..9782ad3
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/group/AddSubgroups.java
@@ -0,0 +1,179 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.group;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.common.errors.NoSuchGroupException;
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.DefaultInput;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestCollectionCreateView;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.UserInitiated;
+import com.google.gerrit.server.account.GroupControl;
+import com.google.gerrit.server.group.GroupResolver;
+import com.google.gerrit.server.group.GroupResource;
+import com.google.gerrit.server.group.SubgroupResource;
+import com.google.gerrit.server.group.db.GroupsUpdate;
+import com.google.gerrit.server.group.db.InternalGroupUpdate;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.restapi.group.AddSubgroups.Input;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class AddSubgroups implements RestModifyView<GroupResource, Input> {
+  public static class Input {
+    @DefaultInput String _oneGroup;
+
+    public List<String> groups;
+
+    public static Input fromGroups(List<String> groups) {
+      Input in = new Input();
+      in.groups = groups;
+      return in;
+    }
+
+    static Input init(Input in) {
+      if (in == null) {
+        in = new Input();
+      }
+      if (in.groups == null) {
+        in.groups = Lists.newArrayListWithCapacity(1);
+      }
+      if (!Strings.isNullOrEmpty(in._oneGroup)) {
+        in.groups.add(in._oneGroup);
+      }
+      return in;
+    }
+  }
+
+  private final GroupResolver groupResolver;
+  private final Provider<GroupsUpdate> groupsUpdateProvider;
+  private final GroupJson json;
+
+  @Inject
+  public AddSubgroups(
+      GroupResolver groupResolver,
+      @UserInitiated Provider<GroupsUpdate> groupsUpdateProvider,
+      GroupJson json) {
+    this.groupResolver = groupResolver;
+    this.groupsUpdateProvider = groupsUpdateProvider;
+    this.json = json;
+  }
+
+  @Override
+  public List<GroupInfo> apply(GroupResource resource, Input input)
+      throws NotInternalGroupException, AuthException, UnprocessableEntityException, OrmException,
+          ResourceNotFoundException, IOException, ConfigInvalidException,
+          PermissionBackendException {
+    GroupDescription.Internal group =
+        resource.asInternalGroup().orElseThrow(NotInternalGroupException::new);
+    input = Input.init(input);
+
+    GroupControl control = resource.getControl();
+    if (!control.canAddGroup()) {
+      throw new AuthException(String.format("Cannot add groups to group %s", group.getName()));
+    }
+
+    List<GroupInfo> result = new ArrayList<>();
+    Set<AccountGroup.UUID> subgroupUuids = new LinkedHashSet<>();
+    for (String subgroupIdentifier : input.groups) {
+      GroupDescription.Basic subgroup = groupResolver.parse(subgroupIdentifier);
+      subgroupUuids.add(subgroup.getGroupUUID());
+      result.add(json.format(subgroup));
+    }
+
+    AccountGroup.UUID groupUuid = group.getGroupUUID();
+    try {
+      addSubgroups(groupUuid, subgroupUuids);
+    } catch (NoSuchGroupException e) {
+      throw new ResourceNotFoundException(String.format("Group %s not found", groupUuid));
+    }
+    return result;
+  }
+
+  private void addSubgroups(
+      AccountGroup.UUID parentGroupUuid, Set<AccountGroup.UUID> newSubgroupUuids)
+      throws OrmException, NoSuchGroupException, IOException, ConfigInvalidException {
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder()
+            .setSubgroupModification(subgroupUuids -> Sets.union(subgroupUuids, newSubgroupUuids))
+            .build();
+    groupsUpdateProvider.get().updateGroup(parentGroupUuid, groupUpdate);
+  }
+
+  @Singleton
+  public static class CreateSubgroup
+      implements RestCollectionCreateView<GroupResource, SubgroupResource, Input> {
+    private final AddSubgroups addSubgroups;
+
+    @Inject
+    public CreateSubgroup(AddSubgroups addSubgroups) {
+      this.addSubgroups = addSubgroups;
+    }
+
+    @Override
+    public GroupInfo apply(GroupResource resource, IdString id, Input input)
+        throws AuthException, MethodNotAllowedException, ResourceNotFoundException, OrmException,
+            IOException, ConfigInvalidException, PermissionBackendException {
+      AddSubgroups.Input in = new AddSubgroups.Input();
+      in.groups = ImmutableList.of(id.get());
+      try {
+        List<GroupInfo> list = addSubgroups.apply(resource, in);
+        if (list.size() == 1) {
+          return list.get(0);
+        }
+        throw new IllegalStateException();
+      } catch (UnprocessableEntityException e) {
+        throw new ResourceNotFoundException(id);
+      }
+    }
+  }
+
+  @Singleton
+  public static class UpdateSubgroup implements RestModifyView<SubgroupResource, Input> {
+    private final Provider<GetSubgroup> get;
+
+    @Inject
+    public UpdateSubgroup(Provider<GetSubgroup> get) {
+      this.get = get;
+    }
+
+    @Override
+    public GroupInfo apply(SubgroupResource resource, Input input)
+        throws OrmException, PermissionBackendException {
+      // Do nothing, the group is already included.
+      return get.get().apply(resource);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/group/CreateGroup.java b/java/com/google/gerrit/server/restapi/group/CreateGroup.java
new file mode 100644
index 0000000..0572114
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/group/CreateGroup.java
@@ -0,0 +1,226 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.group;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.extensions.api.groups.GroupInput;
+import com.google.gerrit.extensions.client.ListGroupsOption;
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestCollectionCreateView;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.extensions.restapi.Url;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.Sequences;
+import com.google.gerrit.server.UserInitiated;
+import com.google.gerrit.server.account.CreateGroupArgs;
+import com.google.gerrit.server.account.GroupCache;
+import com.google.gerrit.server.account.GroupUUID;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.group.GroupResolver;
+import com.google.gerrit.server.group.GroupResource;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.group.InternalGroupDescription;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gerrit.server.group.db.GroupsUpdate;
+import com.google.gerrit.server.group.db.InternalGroupCreation;
+import com.google.gerrit.server.group.db.InternalGroupUpdate;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gerrit.server.validators.GroupCreationValidationListener;
+import com.google.gerrit.server.validators.ValidationException;
+import com.google.gwtorm.server.OrmDuplicateKeyException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Locale;
+import java.util.Optional;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.PersonIdent;
+
+@RequiresCapability(GlobalCapability.CREATE_GROUP)
+@Singleton
+public class CreateGroup
+    implements RestCollectionCreateView<TopLevelResource, GroupResource, GroupInput> {
+  private final Provider<IdentifiedUser> self;
+  private final PersonIdent serverIdent;
+  private final Provider<GroupsUpdate> groupsUpdateProvider;
+  private final GroupCache groupCache;
+  private final GroupResolver groups;
+  private final GroupJson json;
+  private final PluginSetContext<GroupCreationValidationListener> groupCreationValidationListeners;
+  private final AddMembers addMembers;
+  private final SystemGroupBackend systemGroupBackend;
+  private final boolean defaultVisibleToAll;
+  private final Sequences sequences;
+
+  @Inject
+  CreateGroup(
+      Provider<IdentifiedUser> self,
+      @GerritPersonIdent PersonIdent serverIdent,
+      @UserInitiated Provider<GroupsUpdate> groupsUpdateProvider,
+      GroupCache groupCache,
+      GroupResolver groups,
+      GroupJson json,
+      PluginSetContext<GroupCreationValidationListener> groupCreationValidationListeners,
+      AddMembers addMembers,
+      SystemGroupBackend systemGroupBackend,
+      @GerritServerConfig Config cfg,
+      Sequences sequences) {
+    this.self = self;
+    this.serverIdent = serverIdent;
+    this.groupsUpdateProvider = groupsUpdateProvider;
+    this.groupCache = groupCache;
+    this.groups = groups;
+    this.json = json;
+    this.groupCreationValidationListeners = groupCreationValidationListeners;
+    this.addMembers = addMembers;
+    this.systemGroupBackend = systemGroupBackend;
+    this.defaultVisibleToAll = cfg.getBoolean("groups", "newGroupsVisibleToAll", false);
+    this.sequences = sequences;
+  }
+
+  public CreateGroup addOption(ListGroupsOption o) {
+    json.addOption(o);
+    return this;
+  }
+
+  public CreateGroup addOptions(Collection<ListGroupsOption> o) {
+    json.addOptions(o);
+    return this;
+  }
+
+  @Override
+  public GroupInfo apply(TopLevelResource resource, IdString id, GroupInput input)
+      throws AuthException, BadRequestException, UnprocessableEntityException,
+          ResourceConflictException, OrmException, IOException, ConfigInvalidException,
+          ResourceNotFoundException, PermissionBackendException {
+    String name = id.get();
+    if (input == null) {
+      input = new GroupInput();
+    }
+    if (input.name != null && !name.equals(input.name)) {
+      throw new BadRequestException("name must match URL");
+    }
+
+    AccountGroup.UUID ownerUuid = owner(input);
+    CreateGroupArgs args = new CreateGroupArgs();
+    args.setGroupName(name);
+    args.groupDescription = Strings.emptyToNull(input.description);
+    args.visibleToAll = MoreObjects.firstNonNull(input.visibleToAll, defaultVisibleToAll);
+    args.ownerGroupUuid = ownerUuid;
+    if (input.members != null && !input.members.isEmpty()) {
+      List<Account.Id> members = new ArrayList<>();
+      for (String nameOrEmailOrId : input.members) {
+        Account a = addMembers.findAccount(nameOrEmailOrId);
+        if (!a.isActive()) {
+          throw new UnprocessableEntityException(
+              String.format("Account Inactive: %s", nameOrEmailOrId));
+        }
+        members.add(a.getId());
+      }
+      args.initialMembers = members;
+    } else {
+      args.initialMembers =
+          ownerUuid == null
+              ? Collections.singleton(self.get().getAccountId())
+              : Collections.<Account.Id>emptySet();
+    }
+
+    try {
+      groupCreationValidationListeners.runEach(
+          l -> l.validateNewGroup(args), ValidationException.class);
+    } catch (ValidationException e) {
+      throw new ResourceConflictException(e.getMessage(), e);
+    }
+
+    return json.format(new InternalGroupDescription(createGroup(args)));
+  }
+
+  private AccountGroup.UUID owner(GroupInput input) throws UnprocessableEntityException {
+    if (input.ownerId != null) {
+      GroupDescription.Internal d = groups.parseInternal(Url.decode(input.ownerId));
+      return d.getGroupUUID();
+    }
+    return null;
+  }
+
+  private InternalGroup createGroup(CreateGroupArgs createGroupArgs)
+      throws OrmException, ResourceConflictException, IOException, ConfigInvalidException {
+
+    String nameLower = createGroupArgs.getGroupName().toLowerCase(Locale.US);
+
+    for (String name : systemGroupBackend.getNames()) {
+      if (name.toLowerCase(Locale.US).equals(nameLower)) {
+        throw new ResourceConflictException("group '" + name + "' already exists");
+      }
+    }
+
+    for (String name : systemGroupBackend.getReservedNames()) {
+      if (name.toLowerCase(Locale.US).equals(nameLower)) {
+        throw new ResourceConflictException("group name '" + name + "' is reserved");
+      }
+    }
+
+    AccountGroup.Id groupId = new AccountGroup.Id(sequences.nextGroupId());
+    AccountGroup.UUID uuid =
+        GroupUUID.make(
+            createGroupArgs.getGroupName(),
+            self.get().newCommitterIdent(serverIdent.getWhen(), serverIdent.getTimeZone()));
+    InternalGroupCreation groupCreation =
+        InternalGroupCreation.builder()
+            .setGroupUUID(uuid)
+            .setNameKey(createGroupArgs.getGroup())
+            .setId(groupId)
+            .build();
+    InternalGroupUpdate.Builder groupUpdateBuilder =
+        InternalGroupUpdate.builder().setVisibleToAll(createGroupArgs.visibleToAll);
+    if (createGroupArgs.ownerGroupUuid != null) {
+      Optional<InternalGroup> ownerGroup = groupCache.get(createGroupArgs.ownerGroupUuid);
+      ownerGroup.map(InternalGroup::getGroupUUID).ifPresent(groupUpdateBuilder::setOwnerGroupUUID);
+    }
+    if (createGroupArgs.groupDescription != null) {
+      groupUpdateBuilder.setDescription(createGroupArgs.groupDescription);
+    }
+    groupUpdateBuilder.setMemberModification(
+        members -> ImmutableSet.copyOf(createGroupArgs.initialMembers));
+    try {
+      return groupsUpdateProvider.get().createGroup(groupCreation, groupUpdateBuilder.build());
+    } catch (OrmDuplicateKeyException e) {
+      throw new ResourceConflictException(
+          "group '" + createGroupArgs.getGroupName() + "' already exists");
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/group/DeleteMembers.java b/java/com/google/gerrit/server/restapi/group/DeleteMembers.java
new file mode 100644
index 0000000..d197cb8
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/group/DeleteMembers.java
@@ -0,0 +1,113 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.group;
+
+import com.google.common.collect.Sets;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.common.errors.NoSuchGroupException;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.UserInitiated;
+import com.google.gerrit.server.account.AccountResolver;
+import com.google.gerrit.server.account.GroupControl;
+import com.google.gerrit.server.group.GroupResource;
+import com.google.gerrit.server.group.MemberResource;
+import com.google.gerrit.server.group.db.GroupsUpdate;
+import com.google.gerrit.server.group.db.InternalGroupUpdate;
+import com.google.gerrit.server.restapi.group.AddMembers.Input;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class DeleteMembers implements RestModifyView<GroupResource, Input> {
+  private final AccountResolver accountResolver;
+  private final Provider<GroupsUpdate> groupsUpdateProvider;
+
+  @Inject
+  DeleteMembers(
+      AccountResolver accountResolver, @UserInitiated Provider<GroupsUpdate> groupsUpdateProvider) {
+    this.accountResolver = accountResolver;
+    this.groupsUpdateProvider = groupsUpdateProvider;
+  }
+
+  @Override
+  public Response<?> apply(GroupResource resource, Input input)
+      throws AuthException, NotInternalGroupException, UnprocessableEntityException, OrmException,
+          IOException, ConfigInvalidException, ResourceNotFoundException {
+    GroupDescription.Internal internalGroup =
+        resource.asInternalGroup().orElseThrow(NotInternalGroupException::new);
+    input = Input.init(input);
+
+    final GroupControl control = resource.getControl();
+    if (!control.canRemoveMember()) {
+      throw new AuthException("Cannot delete members from group " + internalGroup.getName());
+    }
+
+    Set<Account.Id> membersToRemove = new HashSet<>();
+    for (String nameOrEmail : input.members) {
+      Account a = accountResolver.parse(nameOrEmail).getAccount();
+      membersToRemove.add(a.getId());
+    }
+    AccountGroup.UUID groupUuid = internalGroup.getGroupUUID();
+    try {
+      removeGroupMembers(groupUuid, membersToRemove);
+    } catch (NoSuchGroupException e) {
+      throw new ResourceNotFoundException(String.format("Group %s not found", groupUuid));
+    }
+
+    return Response.none();
+  }
+
+  private void removeGroupMembers(AccountGroup.UUID groupUuid, Set<Account.Id> accountIds)
+      throws OrmException, IOException, NoSuchGroupException, ConfigInvalidException {
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder()
+            .setMemberModification(memberIds -> Sets.difference(memberIds, accountIds))
+            .build();
+    groupsUpdateProvider.get().updateGroup(groupUuid, groupUpdate);
+  }
+
+  @Singleton
+  public static class DeleteMember implements RestModifyView<MemberResource, Input> {
+
+    private final Provider<DeleteMembers> delete;
+
+    @Inject
+    public DeleteMember(Provider<DeleteMembers> delete) {
+      this.delete = delete;
+    }
+
+    @Override
+    public Response<?> apply(MemberResource resource, Input input)
+        throws AuthException, MethodNotAllowedException, UnprocessableEntityException, OrmException,
+            IOException, ConfigInvalidException, ResourceNotFoundException {
+      AddMembers.Input in = new AddMembers.Input();
+      in._oneMember = resource.getMember().getAccountId().toString();
+      return delete.get().apply(resource, in);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/group/DeleteSubgroups.java b/java/com/google/gerrit/server/restapi/group/DeleteSubgroups.java
new file mode 100644
index 0000000..c486af4
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/group/DeleteSubgroups.java
@@ -0,0 +1,117 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.group;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Sets;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.common.errors.NoSuchGroupException;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.UserInitiated;
+import com.google.gerrit.server.account.GroupControl;
+import com.google.gerrit.server.group.GroupResolver;
+import com.google.gerrit.server.group.GroupResource;
+import com.google.gerrit.server.group.SubgroupResource;
+import com.google.gerrit.server.group.db.GroupsUpdate;
+import com.google.gerrit.server.group.db.InternalGroupUpdate;
+import com.google.gerrit.server.restapi.group.AddSubgroups.Input;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class DeleteSubgroups implements RestModifyView<GroupResource, Input> {
+  private final GroupResolver groupResolver;
+  private final Provider<GroupsUpdate> groupsUpdateProvider;
+
+  @Inject
+  DeleteSubgroups(
+      GroupResolver groupResolver, @UserInitiated Provider<GroupsUpdate> groupsUpdateProvider) {
+    this.groupResolver = groupResolver;
+    this.groupsUpdateProvider = groupsUpdateProvider;
+  }
+
+  @Override
+  public Response<?> apply(GroupResource resource, Input input)
+      throws AuthException, NotInternalGroupException, UnprocessableEntityException, OrmException,
+          ResourceNotFoundException, IOException, ConfigInvalidException {
+    GroupDescription.Internal internalGroup =
+        resource.asInternalGroup().orElseThrow(NotInternalGroupException::new);
+    input = Input.init(input);
+
+    final GroupControl control = resource.getControl();
+    if (!control.canRemoveGroup()) {
+      throw new AuthException(
+          String.format("Cannot delete groups from group %s", internalGroup.getName()));
+    }
+
+    Set<AccountGroup.UUID> subgroupsToRemove = new HashSet<>();
+    for (String subgroupIdentifier : input.groups) {
+      GroupDescription.Basic subgroup = groupResolver.parse(subgroupIdentifier);
+      subgroupsToRemove.add(subgroup.getGroupUUID());
+    }
+
+    AccountGroup.UUID groupUuid = internalGroup.getGroupUUID();
+    try {
+      removeSubgroups(groupUuid, subgroupsToRemove);
+    } catch (NoSuchGroupException e) {
+      throw new ResourceNotFoundException(String.format("Group %s not found", groupUuid));
+    }
+
+    return Response.none();
+  }
+
+  private void removeSubgroups(
+      AccountGroup.UUID parentGroupUuid, Set<AccountGroup.UUID> removedSubgroupUuids)
+      throws OrmException, NoSuchGroupException, IOException, ConfigInvalidException {
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder()
+            .setSubgroupModification(
+                subgroupUuids -> Sets.difference(subgroupUuids, removedSubgroupUuids))
+            .build();
+    groupsUpdateProvider.get().updateGroup(parentGroupUuid, groupUpdate);
+  }
+
+  @Singleton
+  public static class DeleteSubgroup implements RestModifyView<SubgroupResource, Input> {
+
+    private final Provider<DeleteSubgroups> delete;
+
+    @Inject
+    public DeleteSubgroup(Provider<DeleteSubgroups> delete) {
+      this.delete = delete;
+    }
+
+    @Override
+    public Response<?> apply(SubgroupResource resource, Input input)
+        throws AuthException, MethodNotAllowedException, UnprocessableEntityException, OrmException,
+            ResourceNotFoundException, IOException, ConfigInvalidException {
+      AddSubgroups.Input in = new AddSubgroups.Input();
+      in.groups = ImmutableList.of(resource.getMember().get());
+      return delete.get().apply(resource, in);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/group/GetAuditLog.java b/java/com/google/gerrit/server/restapi/group/GetAuditLog.java
new file mode 100644
index 0000000..dcdd8a8
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/group/GetAuditLog.java
@@ -0,0 +1,143 @@
+// Copyright (C) 2015 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.google.gerrit.server.restapi.group;
+
+import static java.util.Comparator.comparing;
+
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.GroupAuditEventInfo;
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.extensions.restapi.Url;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.AccountGroupByIdAud;
+import com.google.gerrit.reviewdb.client.AccountGroupMemberAudit;
+import com.google.gerrit.server.account.AccountLoader;
+import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.account.GroupCache;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.group.GroupResource;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.group.InternalGroupDescription;
+import com.google.gerrit.server.group.db.Groups;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Repository;
+
+@Singleton
+public class GetAuditLog implements RestReadView<GroupResource> {
+  private final AccountLoader.Factory accountLoaderFactory;
+  private final AllUsersName allUsers;
+  private final GroupCache groupCache;
+  private final GroupJson groupJson;
+  private final GroupBackend groupBackend;
+  private final Groups groups;
+  private final GitRepositoryManager repoManager;
+
+  @Inject
+  public GetAuditLog(
+      AccountLoader.Factory accountLoaderFactory,
+      AllUsersName allUsers,
+      GroupCache groupCache,
+      GroupJson groupJson,
+      GroupBackend groupBackend,
+      Groups groups,
+      GitRepositoryManager repoManager) {
+    this.accountLoaderFactory = accountLoaderFactory;
+    this.allUsers = allUsers;
+    this.groupCache = groupCache;
+    this.groupJson = groupJson;
+    this.groupBackend = groupBackend;
+    this.groups = groups;
+    this.repoManager = repoManager;
+  }
+
+  @Override
+  public List<? extends GroupAuditEventInfo> apply(GroupResource rsrc)
+      throws AuthException, NotInternalGroupException, OrmException, IOException,
+          ConfigInvalidException, PermissionBackendException {
+    GroupDescription.Internal group =
+        rsrc.asInternalGroup().orElseThrow(NotInternalGroupException::new);
+    if (!rsrc.getControl().isOwner()) {
+      throw new AuthException("Not group owner");
+    }
+
+    AccountLoader accountLoader = accountLoaderFactory.create(true);
+
+    List<GroupAuditEventInfo> auditEvents = new ArrayList<>();
+
+    try (Repository allUsersRepo = repoManager.openRepository(allUsers)) {
+      for (AccountGroupMemberAudit auditEvent :
+          groups.getMembersAudit(allUsersRepo, group.getGroupUUID())) {
+        AccountInfo member = accountLoader.get(auditEvent.getMemberId());
+
+        auditEvents.add(
+            GroupAuditEventInfo.createAddUserEvent(
+                accountLoader.get(auditEvent.getAddedBy()), auditEvent.getAddedOn(), member));
+
+        if (!auditEvent.isActive()) {
+          auditEvents.add(
+              GroupAuditEventInfo.createRemoveUserEvent(
+                  accountLoader.get(auditEvent.getRemovedBy()), auditEvent.getRemovedOn(), member));
+        }
+      }
+
+      for (AccountGroupByIdAud auditEvent :
+          groups.getSubgroupsAudit(allUsersRepo, group.getGroupUUID())) {
+        AccountGroup.UUID includedGroupUUID = auditEvent.getIncludeUUID();
+        Optional<InternalGroup> includedGroup = groupCache.get(includedGroupUUID);
+        GroupInfo member;
+        if (includedGroup.isPresent()) {
+          member = groupJson.format(new InternalGroupDescription(includedGroup.get()));
+        } else {
+          member = new GroupInfo();
+          member.id = Url.encode(includedGroupUUID.get());
+          GroupDescription.Basic groupDescription = groupBackend.get(includedGroupUUID);
+          if (groupDescription != null) {
+            member.name = groupDescription.getName();
+          }
+        }
+
+        auditEvents.add(
+            GroupAuditEventInfo.createAddGroupEvent(
+                accountLoader.get(auditEvent.getAddedBy()),
+                auditEvent.getKey().getAddedOn(),
+                member));
+
+        if (!auditEvent.isActive()) {
+          auditEvents.add(
+              GroupAuditEventInfo.createRemoveGroupEvent(
+                  accountLoader.get(auditEvent.getRemovedBy()), auditEvent.getRemovedOn(), member));
+        }
+      }
+    }
+
+    accountLoader.fill();
+
+    // sort by date and then reverse so that the newest audit event comes first
+    auditEvents.sort(comparing((GroupAuditEventInfo a) -> a.date).reversed());
+    return auditEvents;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/group/GetDescription.java b/java/com/google/gerrit/server/restapi/group/GetDescription.java
new file mode 100644
index 0000000..c34fda7
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/group/GetDescription.java
@@ -0,0 +1,31 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.group;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.group.GroupResource;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GetDescription implements RestReadView<GroupResource> {
+  @Override
+  public String apply(GroupResource resource) throws NotInternalGroupException {
+    GroupDescription.Internal group =
+        resource.asInternalGroup().orElseThrow(NotInternalGroupException::new);
+    return Strings.nullToEmpty(group.getDescription());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/group/GetDetail.java b/java/com/google/gerrit/server/restapi/group/GetDetail.java
new file mode 100644
index 0000000..75d1e34
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/group/GetDetail.java
@@ -0,0 +1,39 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.group;
+
+import com.google.gerrit.extensions.client.ListGroupsOption;
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.group.GroupResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GetDetail implements RestReadView<GroupResource> {
+  private final GroupJson json;
+
+  @Inject
+  GetDetail(GroupJson json) {
+    this.json = json.addOption(ListGroupsOption.MEMBERS).addOption(ListGroupsOption.INCLUDES);
+  }
+
+  @Override
+  public GroupInfo apply(GroupResource rsrc) throws OrmException, PermissionBackendException {
+    return json.format(rsrc);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/group/GetGroup.java b/java/com/google/gerrit/server/restapi/group/GetGroup.java
new file mode 100644
index 0000000..c6cddb6
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/group/GetGroup.java
@@ -0,0 +1,38 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.group;
+
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.group.GroupResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GetGroup implements RestReadView<GroupResource> {
+  private final GroupJson json;
+
+  @Inject
+  GetGroup(GroupJson json) {
+    this.json = json;
+  }
+
+  @Override
+  public GroupInfo apply(GroupResource resource) throws OrmException, PermissionBackendException {
+    return json.format(resource.getGroup());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/group/GetMember.java b/java/com/google/gerrit/server/restapi/group/GetMember.java
new file mode 100644
index 0000000..95063de
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/group/GetMember.java
@@ -0,0 +1,42 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.group;
+
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.account.AccountLoader;
+import com.google.gerrit.server.group.MemberResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GetMember implements RestReadView<MemberResource> {
+  private final AccountLoader.Factory infoFactory;
+
+  @Inject
+  GetMember(AccountLoader.Factory infoFactory) {
+    this.infoFactory = infoFactory;
+  }
+
+  @Override
+  public AccountInfo apply(MemberResource rsrc) throws OrmException, PermissionBackendException {
+    AccountLoader loader = infoFactory.create(true);
+    AccountInfo info = loader.get(rsrc.getMember().getAccountId());
+    loader.fill();
+    return info;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/group/GetName.java b/java/com/google/gerrit/server/restapi/group/GetName.java
new file mode 100644
index 0000000..8cc1fe0
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/group/GetName.java
@@ -0,0 +1,28 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.group;
+
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.group.GroupResource;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GetName implements RestReadView<GroupResource> {
+
+  @Override
+  public String apply(GroupResource resource) {
+    return resource.getName();
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/group/GetOptions.java b/java/com/google/gerrit/server/restapi/group/GetOptions.java
new file mode 100644
index 0000000..e5bfe30
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/group/GetOptions.java
@@ -0,0 +1,29 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.group;
+
+import com.google.gerrit.extensions.common.GroupOptionsInfo;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.group.GroupResource;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GetOptions implements RestReadView<GroupResource> {
+
+  @Override
+  public GroupOptionsInfo apply(GroupResource resource) {
+    return GroupJson.createOptions(resource.getGroup());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/group/GetOwner.java b/java/com/google/gerrit/server/restapi/group/GetOwner.java
new file mode 100644
index 0000000..0906ce6
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/group/GetOwner.java
@@ -0,0 +1,54 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.group;
+
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.common.errors.NoSuchGroupException;
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.account.GroupControl;
+import com.google.gerrit.server.group.GroupResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GetOwner implements RestReadView<GroupResource> {
+
+  private final GroupControl.Factory controlFactory;
+  private final GroupJson json;
+
+  @Inject
+  GetOwner(GroupControl.Factory controlFactory, GroupJson json) {
+    this.controlFactory = controlFactory;
+    this.json = json;
+  }
+
+  @Override
+  public GroupInfo apply(GroupResource resource)
+      throws NotInternalGroupException, ResourceNotFoundException, OrmException,
+          PermissionBackendException {
+    GroupDescription.Internal group =
+        resource.asInternalGroup().orElseThrow(NotInternalGroupException::new);
+    try {
+      GroupControl c = controlFactory.validateFor(group.getOwnerGroupUUID());
+      return json.format(c.getGroup());
+    } catch (NoSuchGroupException e) {
+      throw new ResourceNotFoundException();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/group/GetSubgroup.java b/java/com/google/gerrit/server/restapi/group/GetSubgroup.java
new file mode 100644
index 0000000..16e2739
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/group/GetSubgroup.java
@@ -0,0 +1,38 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.group;
+
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.group.SubgroupResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GetSubgroup implements RestReadView<SubgroupResource> {
+  private final GroupJson json;
+
+  @Inject
+  GetSubgroup(GroupJson json) {
+    this.json = json;
+  }
+
+  @Override
+  public GroupInfo apply(SubgroupResource rsrc) throws OrmException, PermissionBackendException {
+    return json.format(rsrc.getMemberDescription());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/group/GroupJson.java b/java/com/google/gerrit/server/restapi/group/GroupJson.java
new file mode 100644
index 0000000..a51fad2
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/group/GroupJson.java
@@ -0,0 +1,137 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.group;
+
+import static com.google.gerrit.extensions.client.ListGroupsOption.INCLUDES;
+import static com.google.gerrit.extensions.client.ListGroupsOption.MEMBERS;
+
+import com.google.common.base.Strings;
+import com.google.common.base.Suppliers;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.extensions.client.ListGroupsOption;
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.extensions.common.GroupOptionsInfo;
+import com.google.gerrit.extensions.restapi.Url;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.account.GroupControl;
+import com.google.gerrit.server.group.GroupResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.util.Collection;
+import java.util.EnumSet;
+import java.util.function.Supplier;
+
+public class GroupJson {
+  public static GroupOptionsInfo createOptions(GroupDescription.Basic group) {
+    GroupOptionsInfo options = new GroupOptionsInfo();
+    if (group instanceof GroupDescription.Internal
+        && ((GroupDescription.Internal) group).isVisibleToAll()) {
+      options.visibleToAll = true;
+    }
+    return options;
+  }
+
+  private final GroupBackend groupBackend;
+  private final GroupControl.Factory groupControlFactory;
+  private final Provider<ListMembers> listMembers;
+  private final Provider<ListSubgroups> listSubgroups;
+  private EnumSet<ListGroupsOption> options;
+
+  @Inject
+  GroupJson(
+      GroupBackend groupBackend,
+      GroupControl.Factory groupControlFactory,
+      Provider<ListMembers> listMembers,
+      Provider<ListSubgroups> listSubgroups) {
+    this.groupBackend = groupBackend;
+    this.groupControlFactory = groupControlFactory;
+    this.listMembers = listMembers;
+    this.listSubgroups = listSubgroups;
+
+    options = EnumSet.noneOf(ListGroupsOption.class);
+  }
+
+  public GroupJson addOption(ListGroupsOption o) {
+    options.add(o);
+    return this;
+  }
+
+  public GroupJson addOptions(Collection<ListGroupsOption> o) {
+    options.addAll(o);
+    return this;
+  }
+
+  public GroupInfo format(GroupResource rsrc) throws OrmException, PermissionBackendException {
+    return createGroupInfo(rsrc.getGroup(), rsrc::getControl);
+  }
+
+  public GroupInfo format(GroupDescription.Basic group)
+      throws OrmException, PermissionBackendException {
+    return createGroupInfo(group, Suppliers.memoize(() -> groupControlFactory.controlFor(group)));
+  }
+
+  private GroupInfo createGroupInfo(
+      GroupDescription.Basic group, Supplier<GroupControl> groupControlSupplier)
+      throws OrmException, PermissionBackendException {
+    GroupInfo info = createBasicGroupInfo(group);
+
+    if (group instanceof GroupDescription.Internal) {
+      addInternalDetails(info, (GroupDescription.Internal) group, groupControlSupplier);
+    }
+
+    return info;
+  }
+
+  private static GroupInfo createBasicGroupInfo(GroupDescription.Basic group) {
+    GroupInfo info = new GroupInfo();
+    info.id = Url.encode(group.getGroupUUID().get());
+    info.name = Strings.emptyToNull(group.getName());
+    info.url = Strings.emptyToNull(group.getUrl());
+    info.options = createOptions(group);
+    return info;
+  }
+
+  private void addInternalDetails(
+      GroupInfo info,
+      GroupDescription.Internal internalGroup,
+      Supplier<GroupControl> groupControlSupplier)
+      throws OrmException, PermissionBackendException {
+    info.description = Strings.emptyToNull(internalGroup.getDescription());
+    info.groupId = internalGroup.getId().get();
+
+    AccountGroup.UUID ownerGroupUUID = internalGroup.getOwnerGroupUUID();
+    if (ownerGroupUUID != null) {
+      info.ownerId = Url.encode(ownerGroupUUID.get());
+      GroupDescription.Basic o = groupBackend.get(ownerGroupUUID);
+      if (o != null) {
+        info.owner = o.getName();
+      }
+    }
+
+    info.createdOn = internalGroup.getCreatedOn();
+
+    if (options.contains(MEMBERS)) {
+      info.members = listMembers.get().getDirectMembers(internalGroup, groupControlSupplier.get());
+    }
+
+    if (options.contains(INCLUDES)) {
+      info.includes =
+          listSubgroups.get().getDirectSubgroups(internalGroup, groupControlSupplier.get());
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/group/GroupModule.java b/java/com/google/gerrit/server/restapi/group/GroupModule.java
new file mode 100644
index 0000000..2bf6bcc
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/group/GroupModule.java
@@ -0,0 +1,42 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.group;
+
+import static com.google.inject.Scopes.SINGLETON;
+
+import com.google.gerrit.extensions.config.FactoryModule;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.server.InternalUser;
+import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.account.IncludingGroupMembership;
+import com.google.gerrit.server.account.InternalGroupBackend;
+import com.google.gerrit.server.account.UniversalGroupBackend;
+import com.google.gerrit.server.group.SystemGroupBackend;
+
+public class GroupModule extends FactoryModule {
+
+  @Override
+  protected void configure() {
+    factory(InternalUser.Factory.class);
+    factory(IncludingGroupMembership.Factory.class);
+
+    bind(GroupBackend.class).to(UniversalGroupBackend.class).in(SINGLETON);
+    DynamicSet.setOf(binder(), GroupBackend.class);
+
+    bind(InternalGroupBackend.class).in(SINGLETON);
+    DynamicSet.bind(binder(), GroupBackend.class).to(SystemGroupBackend.class);
+    DynamicSet.bind(binder(), GroupBackend.class).to(InternalGroupBackend.class);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/group/GroupsCollection.java b/java/com/google/gerrit/server/restapi/group/GroupsCollection.java
new file mode 100644
index 0000000..52fe9d0
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/group/GroupsCollection.java
@@ -0,0 +1,114 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.group;
+
+import com.google.common.collect.ListMultimap;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.NeedsParams;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestCollection;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.server.AnonymousUser;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.GroupControl;
+import com.google.gerrit.server.group.GroupResolver;
+import com.google.gerrit.server.group.GroupResource;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+
+public class GroupsCollection
+    implements RestCollection<TopLevelResource, GroupResource>, NeedsParams {
+  private final DynamicMap<RestView<GroupResource>> views;
+  private final Provider<ListGroups> list;
+  private final Provider<QueryGroups> queryGroups;
+  private final GroupControl.Factory groupControlFactory;
+  private final GroupResolver groupResolver;
+  private final Provider<CurrentUser> self;
+
+  private boolean hasQuery2;
+
+  @Inject
+  public GroupsCollection(
+      DynamicMap<RestView<GroupResource>> views,
+      Provider<ListGroups> list,
+      Provider<QueryGroups> queryGroups,
+      GroupControl.Factory groupControlFactory,
+      GroupResolver groupResolver,
+      Provider<CurrentUser> self) {
+    this.views = views;
+    this.list = list;
+    this.queryGroups = queryGroups;
+    this.groupControlFactory = groupControlFactory;
+    this.groupResolver = groupResolver;
+    this.self = self;
+  }
+
+  @Override
+  public void setParams(ListMultimap<String, String> params) throws BadRequestException {
+    if (params.containsKey("query") && params.containsKey("query2")) {
+      throw new BadRequestException("\"query\" and \"query2\" options are mutually exclusive");
+    }
+
+    // The --query2 option is defined in QueryGroups
+    this.hasQuery2 = params.containsKey("query2");
+  }
+
+  @Override
+  public RestView<TopLevelResource> list() throws ResourceNotFoundException, AuthException {
+    final CurrentUser user = self.get();
+    if (user instanceof AnonymousUser) {
+      throw new AuthException("Authentication required");
+    } else if (!(user.isIdentifiedUser())) {
+      throw new ResourceNotFoundException();
+    }
+
+    if (hasQuery2) {
+      return queryGroups.get();
+    }
+
+    return list.get();
+  }
+
+  @Override
+  public GroupResource parse(TopLevelResource parent, IdString id)
+      throws AuthException, ResourceNotFoundException {
+    final CurrentUser user = self.get();
+    if (user instanceof AnonymousUser) {
+      throw new AuthException("Authentication required");
+    } else if (!(user.isIdentifiedUser())) {
+      throw new ResourceNotFoundException(id);
+    }
+
+    GroupDescription.Basic group = groupResolver.parseId(id.get());
+    if (group == null) {
+      throw new ResourceNotFoundException(id.get());
+    }
+    GroupControl ctl = groupControlFactory.controlFor(group);
+    if (!ctl.isVisible()) {
+      throw new ResourceNotFoundException(id);
+    }
+    return new GroupResource(ctl);
+  }
+
+  @Override
+  public DynamicMap<RestView<GroupResource>> views() {
+    return views;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/group/Index.java b/java/com/google/gerrit/server/restapi/group/Index.java
new file mode 100644
index 0000000..1267f7a
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/group/Index.java
@@ -0,0 +1,56 @@
+// Copyright (C) 2017 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.google.gerrit.server.restapi.group;
+
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.group.GroupResource;
+import com.google.gerrit.server.index.group.GroupIndexer;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+
+@Singleton
+public class Index implements RestModifyView<GroupResource, Input> {
+
+  private final Provider<GroupIndexer> indexer;
+
+  @Inject
+  Index(Provider<GroupIndexer> indexer) {
+    this.indexer = indexer;
+  }
+
+  @Override
+  public Response<?> apply(GroupResource rsrc, Input input)
+      throws IOException, AuthException, UnprocessableEntityException {
+    if (!rsrc.getControl().isOwner()) {
+      throw new AuthException("not allowed to index group");
+    }
+
+    AccountGroup.UUID groupUuid = rsrc.getGroup().getGroupUUID();
+    if (!rsrc.isInternalGroup()) {
+      throw new UnprocessableEntityException(
+          String.format("External Group Not Allowed: %s", groupUuid.get()));
+    }
+
+    indexer.get().index(groupUuid);
+    return Response.none();
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/group/ListGroups.java b/java/com/google/gerrit/server/restapi/group/ListGroups.java
new file mode 100644
index 0000000..8d8dc3d
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/group/ListGroups.java
@@ -0,0 +1,447 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.group;
+
+import static com.google.common.collect.ImmutableList.toImmutableList;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Streams;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.errors.NoSuchGroupException;
+import com.google.gerrit.extensions.client.ListGroupsOption;
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.extensions.restapi.Url;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.account.GroupCache;
+import com.google.gerrit.server.account.GroupControl;
+import com.google.gerrit.server.group.GroupResolver;
+import com.google.gerrit.server.group.InternalGroupDescription;
+import com.google.gerrit.server.group.db.Groups;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.restapi.account.GetGroups;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.EnumSet;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Optional;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.TreeMap;
+import java.util.function.Predicate;
+import java.util.regex.Pattern;
+import java.util.stream.Stream;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.kohsuke.args4j.Option;
+
+/** List groups visible to the calling user. */
+public class ListGroups implements RestReadView<TopLevelResource> {
+  private static final Comparator<GroupDescription.Internal> GROUP_COMPARATOR =
+      Comparator.comparing(GroupDescription.Basic::getName);
+
+  protected final GroupCache groupCache;
+
+  private final List<ProjectState> projects = new ArrayList<>();
+  private final Set<AccountGroup.UUID> groupsToInspect = new HashSet<>();
+  private final GroupControl.Factory groupControlFactory;
+  private final GroupControl.GenericFactory genericGroupControlFactory;
+  private final Provider<IdentifiedUser> identifiedUser;
+  private final IdentifiedUser.GenericFactory userFactory;
+  private final GetGroups accountGetGroups;
+  private final GroupJson json;
+  private final GroupBackend groupBackend;
+  private final Groups groups;
+  private final GroupResolver groupResolver;
+
+  private EnumSet<ListGroupsOption> options = EnumSet.noneOf(ListGroupsOption.class);
+  private boolean visibleToAll;
+  private Account.Id user;
+  private boolean owned;
+  private int limit;
+  private int start;
+  private String matchSubstring;
+  private String matchRegex;
+  private String suggest;
+  private String ownedBy;
+
+  @Option(
+      name = "--project",
+      aliases = {"-p"},
+      usage = "projects for which the groups should be listed")
+  public void addProject(ProjectState project) {
+    projects.add(project);
+  }
+
+  @Option(
+      name = "--visible-to-all",
+      usage = "to list only groups that are visible to all registered users")
+  public void setVisibleToAll(boolean visibleToAll) {
+    this.visibleToAll = visibleToAll;
+  }
+
+  @Option(
+      name = "--user",
+      aliases = {"-u"},
+      usage = "user for which the groups should be listed")
+  public void setUser(Account.Id user) {
+    this.user = user;
+  }
+
+  @Option(
+      name = "--owned",
+      usage =
+          "to list only groups that are owned by the"
+              + " specified user or by the calling user if no user was specifed")
+  public void setOwned(boolean owned) {
+    this.owned = owned;
+  }
+
+  /**
+   * Add a group to inspect.
+   *
+   * @param uuid UUID of the group
+   * @deprecated use {@link #addGroup(AccountGroup.UUID)}.
+   */
+  @Deprecated
+  @Option(
+      name = "--query",
+      aliases = {"-q"},
+      usage = "group to inspect (deprecated: use --group/-g instead)")
+  void addGroup_Deprecated(AccountGroup.UUID uuid) {
+    addGroup(uuid);
+  }
+
+  @Option(
+      name = "--group",
+      aliases = {"-g"},
+      usage = "group to inspect")
+  public void addGroup(AccountGroup.UUID uuid) {
+    groupsToInspect.add(uuid);
+  }
+
+  @Option(
+      name = "--limit",
+      aliases = {"-n"},
+      metaVar = "CNT",
+      usage = "maximum number of groups to list")
+  public void setLimit(int limit) {
+    this.limit = limit;
+  }
+
+  @Option(
+      name = "--start",
+      aliases = {"-S"},
+      metaVar = "CNT",
+      usage = "number of groups to skip")
+  public void setStart(int start) {
+    this.start = start;
+  }
+
+  @Option(
+      name = "--match",
+      aliases = {"-m"},
+      metaVar = "MATCH",
+      usage = "match group substring")
+  public void setMatchSubstring(String matchSubstring) {
+    this.matchSubstring = matchSubstring;
+  }
+
+  @Option(
+      name = "--regex",
+      aliases = {"-r"},
+      metaVar = "REGEX",
+      usage = "match group regex")
+  public void setMatchRegex(String matchRegex) {
+    this.matchRegex = matchRegex;
+  }
+
+  @Option(
+      name = "--suggest",
+      aliases = {"-s"},
+      usage = "to get a suggestion of groups")
+  public void setSuggest(String suggest) {
+    this.suggest = suggest;
+  }
+
+  @Option(name = "-o", usage = "Output options per group")
+  void addOption(ListGroupsOption o) {
+    options.add(o);
+  }
+
+  @Option(name = "-O", usage = "Output option flags, in hex")
+  void setOptionFlagsHex(String hex) {
+    options.addAll(ListGroupsOption.fromBits(Integer.parseInt(hex, 16)));
+  }
+
+  @Option(name = "--owned-by", usage = "list groups owned by the given group uuid")
+  public void setOwnedBy(String ownedBy) {
+    this.ownedBy = ownedBy;
+  }
+
+  @Inject
+  protected ListGroups(
+      final GroupCache groupCache,
+      final GroupControl.Factory groupControlFactory,
+      final GroupControl.GenericFactory genericGroupControlFactory,
+      final Provider<IdentifiedUser> identifiedUser,
+      final IdentifiedUser.GenericFactory userFactory,
+      final GetGroups accountGetGroups,
+      final GroupResolver groupResolver,
+      GroupJson json,
+      GroupBackend groupBackend,
+      Groups groups) {
+    this.groupCache = groupCache;
+    this.groupControlFactory = groupControlFactory;
+    this.genericGroupControlFactory = genericGroupControlFactory;
+    this.identifiedUser = identifiedUser;
+    this.userFactory = userFactory;
+    this.accountGetGroups = accountGetGroups;
+    this.json = json;
+    this.groupBackend = groupBackend;
+    this.groups = groups;
+    this.groupResolver = groupResolver;
+  }
+
+  public void setOptions(EnumSet<ListGroupsOption> options) {
+    this.options = options;
+  }
+
+  public Account.Id getUser() {
+    return user;
+  }
+
+  public List<ProjectState> getProjects() {
+    return projects;
+  }
+
+  @Override
+  public SortedMap<String, GroupInfo> apply(TopLevelResource resource)
+      throws OrmException, RestApiException, IOException, ConfigInvalidException,
+          PermissionBackendException {
+    SortedMap<String, GroupInfo> output = new TreeMap<>();
+    for (GroupInfo info : get()) {
+      output.put(MoreObjects.firstNonNull(info.name, "Group " + Url.decode(info.id)), info);
+      info.name = null;
+    }
+    return output;
+  }
+
+  public List<GroupInfo> get()
+      throws OrmException, RestApiException, IOException, ConfigInvalidException,
+          PermissionBackendException {
+    if (!Strings.isNullOrEmpty(suggest)) {
+      return suggestGroups();
+    }
+
+    if (!Strings.isNullOrEmpty(matchSubstring) && !Strings.isNullOrEmpty(matchRegex)) {
+      throw new BadRequestException("Specify one of m/r");
+    }
+
+    if (ownedBy != null) {
+      return getGroupsOwnedBy(ownedBy);
+    }
+
+    if (owned) {
+      return getGroupsOwnedBy(user != null ? userFactory.create(user) : identifiedUser.get());
+    }
+
+    if (user != null) {
+      return accountGetGroups.apply(new AccountResource(userFactory.create(user)));
+    }
+
+    return getAllGroups();
+  }
+
+  private List<GroupInfo> getAllGroups()
+      throws OrmException, IOException, ConfigInvalidException, PermissionBackendException {
+    Pattern pattern = getRegexPattern();
+    Stream<GroupDescription.Internal> existingGroups =
+        getAllExistingGroups()
+            .filter(group -> isRelevant(pattern, group))
+            .map(this::loadGroup)
+            .flatMap(Streams::stream)
+            .filter(this::isVisible)
+            .sorted(GROUP_COMPARATOR)
+            .skip(start);
+    if (limit > 0) {
+      existingGroups = existingGroups.limit(limit);
+    }
+    List<GroupDescription.Internal> relevantGroups = existingGroups.collect(toImmutableList());
+    List<GroupInfo> groupInfos = Lists.newArrayListWithCapacity(relevantGroups.size());
+    for (GroupDescription.Internal group : relevantGroups) {
+      groupInfos.add(json.addOptions(options).format(group));
+    }
+    return groupInfos;
+  }
+
+  private Stream<GroupReference> getAllExistingGroups() throws IOException, ConfigInvalidException {
+    if (!projects.isEmpty()) {
+      return projects.stream()
+          .map(ProjectState::getAllGroups)
+          .flatMap(Collection::stream)
+          .distinct();
+    }
+    return groups.getAllGroupReferences();
+  }
+
+  private List<GroupInfo> suggestGroups()
+      throws OrmException, BadRequestException, PermissionBackendException {
+    if (conflictingSuggestParameters()) {
+      throw new BadRequestException(
+          "You should only have no more than one --project and -n with --suggest");
+    }
+    List<GroupReference> groupRefs =
+        Lists.newArrayList(
+            Iterables.limit(
+                groupBackend.suggest(suggest, projects.stream().findFirst().orElse(null)),
+                limit <= 0 ? 10 : Math.min(limit, 10)));
+
+    List<GroupInfo> groupInfos = Lists.newArrayListWithCapacity(groupRefs.size());
+    for (GroupReference ref : groupRefs) {
+      GroupDescription.Basic desc = groupBackend.get(ref.getUUID());
+      if (desc != null) {
+        groupInfos.add(json.addOptions(options).format(desc));
+      }
+    }
+    return groupInfos;
+  }
+
+  private boolean conflictingSuggestParameters() {
+    if (Strings.isNullOrEmpty(suggest)) {
+      return false;
+    }
+    if (projects.size() > 1) {
+      return true;
+    }
+    if (visibleToAll) {
+      return true;
+    }
+    if (user != null) {
+      return true;
+    }
+    if (owned) {
+      return true;
+    }
+    if (ownedBy != null) {
+      return true;
+    }
+    if (start != 0) {
+      return true;
+    }
+    if (!groupsToInspect.isEmpty()) {
+      return true;
+    }
+    if (!Strings.isNullOrEmpty(matchSubstring)) {
+      return true;
+    }
+    if (!Strings.isNullOrEmpty(matchRegex)) {
+      return true;
+    }
+    return false;
+  }
+
+  private List<GroupInfo> filterGroupsOwnedBy(Predicate<GroupDescription.Internal> filter)
+      throws OrmException, IOException, ConfigInvalidException, PermissionBackendException {
+    Pattern pattern = getRegexPattern();
+    Stream<? extends GroupDescription.Internal> foundGroups =
+        groups
+            .getAllGroupReferences()
+            .filter(group -> isRelevant(pattern, group))
+            .map(this::loadGroup)
+            .flatMap(Streams::stream)
+            .filter(this::isVisible)
+            .filter(filter)
+            .sorted(GROUP_COMPARATOR)
+            .skip(start);
+    if (limit > 0) {
+      foundGroups = foundGroups.limit(limit);
+    }
+    List<GroupDescription.Internal> ownedGroups = foundGroups.collect(toImmutableList());
+    List<GroupInfo> groupInfos = new ArrayList<>(ownedGroups.size());
+    for (GroupDescription.Internal group : ownedGroups) {
+      groupInfos.add(json.addOptions(options).format(group));
+    }
+    return groupInfos;
+  }
+
+  private Optional<GroupDescription.Internal> loadGroup(GroupReference groupReference) {
+    return groupCache.get(groupReference.getUUID()).map(InternalGroupDescription::new);
+  }
+
+  private List<GroupInfo> getGroupsOwnedBy(String id)
+      throws OrmException, RestApiException, IOException, ConfigInvalidException,
+          PermissionBackendException {
+    String uuid = groupResolver.parse(id).getGroupUUID().get();
+    return filterGroupsOwnedBy(group -> group.getOwnerGroupUUID().get().equals(uuid));
+  }
+
+  private List<GroupInfo> getGroupsOwnedBy(IdentifiedUser user)
+      throws OrmException, IOException, ConfigInvalidException, PermissionBackendException {
+    return filterGroupsOwnedBy(group -> isOwner(user, group));
+  }
+
+  private boolean isOwner(CurrentUser user, GroupDescription.Internal group) {
+    try {
+      return genericGroupControlFactory.controlFor(user, group.getGroupUUID()).isOwner();
+    } catch (NoSuchGroupException e) {
+      return false;
+    }
+  }
+
+  private Pattern getRegexPattern() {
+    return Strings.isNullOrEmpty(matchRegex) ? null : Pattern.compile(matchRegex);
+  }
+
+  private boolean isRelevant(Pattern pattern, GroupReference group) {
+    if (!Strings.isNullOrEmpty(matchSubstring)) {
+      if (!group.getName().toLowerCase(Locale.US).contains(matchSubstring.toLowerCase(Locale.US))) {
+        return false;
+      }
+    } else if (pattern != null) {
+      if (!pattern.matcher(group.getName()).matches()) {
+        return false;
+      }
+    }
+    return groupsToInspect.isEmpty() || groupsToInspect.contains(group.getUUID());
+  }
+
+  private boolean isVisible(GroupDescription.Internal group) {
+    if (visibleToAll && !group.isVisibleToAll()) {
+      return false;
+    }
+    GroupControl c = groupControlFactory.controlFor(group);
+    return c.isVisible();
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/group/ListMembers.java b/java/com/google/gerrit/server/restapi/group/ListMembers.java
new file mode 100644
index 0000000..4742644
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/group/ListMembers.java
@@ -0,0 +1,170 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.group;
+
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.collect.ImmutableSet.toImmutableSet;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.account.AccountInfoComparator;
+import com.google.gerrit.server.account.AccountLoader;
+import com.google.gerrit.server.account.GroupCache;
+import com.google.gerrit.server.account.GroupControl;
+import com.google.gerrit.server.group.GroupResource;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.group.InternalGroupDescription;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import org.kohsuke.args4j.Option;
+
+public class ListMembers implements RestReadView<GroupResource> {
+  private final GroupCache groupCache;
+  private final GroupControl.Factory groupControlFactory;
+  private final AccountLoader accountLoader;
+
+  @Option(name = "--recursive", usage = "to resolve included groups recursively")
+  private boolean recursive;
+
+  @Inject
+  protected ListMembers(
+      GroupCache groupCache,
+      GroupControl.Factory groupControlFactory,
+      AccountLoader.Factory accountLoaderFactory) {
+    this.groupCache = groupCache;
+    this.groupControlFactory = groupControlFactory;
+    this.accountLoader = accountLoaderFactory.create(true);
+  }
+
+  public ListMembers setRecursive(boolean recursive) {
+    this.recursive = recursive;
+    return this;
+  }
+
+  @Override
+  public List<AccountInfo> apply(GroupResource resource)
+      throws NotInternalGroupException, OrmException, PermissionBackendException {
+    GroupDescription.Internal group =
+        resource.asInternalGroup().orElseThrow(NotInternalGroupException::new);
+    if (recursive) {
+      return getTransitiveMembers(group, resource.getControl());
+    }
+    return getDirectMembers(group, resource.getControl());
+  }
+
+  public List<AccountInfo> getTransitiveMembers(AccountGroup.UUID groupUuid)
+      throws PermissionBackendException {
+    Optional<InternalGroup> group = groupCache.get(groupUuid);
+    if (group.isPresent()) {
+      InternalGroupDescription internalGroup = new InternalGroupDescription(group.get());
+      GroupControl groupControl = groupControlFactory.controlFor(internalGroup);
+      return getTransitiveMembers(internalGroup, groupControl);
+    }
+    return ImmutableList.of();
+  }
+
+  private List<AccountInfo> getTransitiveMembers(
+      GroupDescription.Internal group, GroupControl groupControl)
+      throws PermissionBackendException {
+    checkSameGroup(group, groupControl);
+    Set<Account.Id> members =
+        getTransitiveMemberIds(
+            group, groupControl, new HashSet<>(ImmutableSet.of(group.getGroupUUID())));
+    return toAccountInfos(members);
+  }
+
+  public List<AccountInfo> getDirectMembers(InternalGroup group) throws PermissionBackendException {
+    InternalGroupDescription internalGroup = new InternalGroupDescription(group);
+    return getDirectMembers(internalGroup, groupControlFactory.controlFor(internalGroup));
+  }
+
+  public List<AccountInfo> getDirectMembers(
+      GroupDescription.Internal group, GroupControl groupControl)
+      throws PermissionBackendException {
+    checkSameGroup(group, groupControl);
+    Set<Account.Id> directMembers = getDirectMemberIds(group, groupControl);
+    return toAccountInfos(directMembers);
+  }
+
+  private List<AccountInfo> toAccountInfos(Set<Account.Id> members)
+      throws PermissionBackendException {
+    List<AccountInfo> memberInfos = new ArrayList<>(members.size());
+    for (Account.Id member : members) {
+      memberInfos.add(accountLoader.get(member));
+    }
+    accountLoader.fill();
+    memberInfos.sort(AccountInfoComparator.ORDER_NULLS_FIRST);
+    return memberInfos;
+  }
+
+  private Set<Account.Id> getTransitiveMemberIds(
+      GroupDescription.Internal group,
+      GroupControl groupControl,
+      HashSet<AccountGroup.UUID> seenGroups) {
+    Set<Account.Id> directMembers = getDirectMemberIds(group, groupControl);
+
+    if (!groupControl.canSeeGroup()) {
+      return directMembers;
+    }
+
+    Set<Account.Id> indirectMembers = getIndirectMemberIds(group, seenGroups);
+    return Sets.union(directMembers, indirectMembers);
+  }
+
+  private static Set<Account.Id> getDirectMemberIds(
+      GroupDescription.Internal group, GroupControl groupControl) {
+    return group.getMembers().stream().filter(groupControl::canSeeMember).collect(toImmutableSet());
+  }
+
+  private Set<Account.Id> getIndirectMemberIds(
+      GroupDescription.Internal group, HashSet<AccountGroup.UUID> seenGroups) {
+    Set<Account.Id> indirectMembers = new HashSet<>();
+    for (AccountGroup.UUID subgroupUuid : group.getSubgroups()) {
+      if (!seenGroups.contains(subgroupUuid)) {
+        seenGroups.add(subgroupUuid);
+
+        Set<Account.Id> subgroupMembers =
+            groupCache
+                .get(subgroupUuid)
+                .map(InternalGroupDescription::new)
+                .map(
+                    subgroup -> {
+                      GroupControl subgroupControl = groupControlFactory.controlFor(subgroup);
+                      return getTransitiveMemberIds(subgroup, subgroupControl, seenGroups);
+                    })
+                .orElseGet(ImmutableSet::of);
+        indirectMembers.addAll(subgroupMembers);
+      }
+    }
+    return indirectMembers;
+  }
+
+  private static void checkSameGroup(GroupDescription.Internal group, GroupControl groupControl) {
+    checkState(
+        group.equals(groupControl.getGroup()), "Specified group and groupControl do not match");
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/group/ListSubgroups.java b/java/com/google/gerrit/server/restapi/group/ListSubgroups.java
new file mode 100644
index 0000000..864b01b
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/group/ListSubgroups.java
@@ -0,0 +1,78 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.group;
+
+import static com.google.common.base.Strings.nullToEmpty;
+import static java.util.Comparator.comparing;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.common.errors.NoSuchGroupException;
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.account.GroupControl;
+import com.google.gerrit.server.group.GroupResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.ArrayList;
+import java.util.List;
+
+@Singleton
+public class ListSubgroups implements RestReadView<GroupResource> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final GroupControl.Factory controlFactory;
+  private final GroupJson json;
+
+  @Inject
+  ListSubgroups(GroupControl.Factory controlFactory, GroupJson json) {
+    this.controlFactory = controlFactory;
+    this.json = json;
+  }
+
+  @Override
+  public List<GroupInfo> apply(GroupResource rsrc)
+      throws NotInternalGroupException, OrmException, PermissionBackendException {
+    GroupDescription.Internal group =
+        rsrc.asInternalGroup().orElseThrow(NotInternalGroupException::new);
+
+    return getDirectSubgroups(group, rsrc.getControl());
+  }
+
+  public List<GroupInfo> getDirectSubgroups(
+      GroupDescription.Internal group, GroupControl groupControl)
+      throws OrmException, PermissionBackendException {
+    boolean ownerOfParent = groupControl.isOwner();
+    List<GroupInfo> included = new ArrayList<>();
+    for (AccountGroup.UUID subgroupUuid : group.getSubgroups()) {
+      try {
+        GroupControl i = controlFactory.controlFor(subgroupUuid);
+        if (ownerOfParent || i.isVisible()) {
+          included.add(json.format(i.getGroup()));
+        }
+      } catch (NoSuchGroupException notFound) {
+        logger.atWarning().log(
+            "Group %s no longer available, subgroup of %s", subgroupUuid, group.getName());
+        continue;
+      }
+    }
+    included.sort(
+        comparing((GroupInfo g) -> nullToEmpty(g.name)).thenComparing(g -> nullToEmpty(g.id)));
+    return included;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/group/MembersCollection.java b/java/com/google/gerrit/server/restapi/group/MembersCollection.java
new file mode 100644
index 0000000..fec1443
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/group/MembersCollection.java
@@ -0,0 +1,79 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.group;
+
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ChildCollection;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.group.GroupResource;
+import com.google.gerrit.server.group.MemberResource;
+import com.google.gerrit.server.restapi.account.AccountsCollection;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class MembersCollection implements ChildCollection<GroupResource, MemberResource> {
+  private final DynamicMap<RestView<MemberResource>> views;
+  private final Provider<ListMembers> list;
+  private final AccountsCollection accounts;
+
+  @Inject
+  MembersCollection(
+      DynamicMap<RestView<MemberResource>> views,
+      Provider<ListMembers> list,
+      AccountsCollection accounts) {
+    this.views = views;
+    this.list = list;
+    this.accounts = accounts;
+  }
+
+  @Override
+  public RestView<GroupResource> list() throws ResourceNotFoundException, AuthException {
+    return list.get();
+  }
+
+  @Override
+  public MemberResource parse(GroupResource parent, IdString id)
+      throws NotInternalGroupException, AuthException, ResourceNotFoundException, OrmException,
+          IOException, ConfigInvalidException {
+    GroupDescription.Internal group =
+        parent.asInternalGroup().orElseThrow(NotInternalGroupException::new);
+
+    IdentifiedUser user = accounts.parse(TopLevelResource.INSTANCE, id).getUser();
+    if (parent.getControl().canSeeMember(user.getAccountId()) && isMember(group, user)) {
+      return new MemberResource(parent, user);
+    }
+    throw new ResourceNotFoundException(id);
+  }
+
+  private static boolean isMember(GroupDescription.Internal group, IdentifiedUser user) {
+    return group.getMembers().contains(user.getAccountId());
+  }
+
+  @Override
+  public DynamicMap<RestView<MemberResource>> views() {
+    return views;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/group/Module.java b/java/com/google/gerrit/server/restapi/group/Module.java
new file mode 100644
index 0000000..741c3da
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/group/Module.java
@@ -0,0 +1,94 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.group;
+
+import static com.google.gerrit.server.group.GroupResource.GROUP_KIND;
+import static com.google.gerrit.server.group.MemberResource.MEMBER_KIND;
+import static com.google.gerrit.server.group.SubgroupResource.SUBGROUP_KIND;
+
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.RestApiModule;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.ServerInitiated;
+import com.google.gerrit.server.UserInitiated;
+import com.google.gerrit.server.group.db.GroupsUpdate;
+import com.google.gerrit.server.restapi.group.AddMembers.CreateMember;
+import com.google.gerrit.server.restapi.group.AddMembers.UpdateMember;
+import com.google.gerrit.server.restapi.group.AddSubgroups.CreateSubgroup;
+import com.google.gerrit.server.restapi.group.AddSubgroups.UpdateSubgroup;
+import com.google.gerrit.server.restapi.group.DeleteMembers.DeleteMember;
+import com.google.gerrit.server.restapi.group.DeleteSubgroups.DeleteSubgroup;
+import com.google.inject.Provides;
+
+public class Module extends RestApiModule {
+
+  @Override
+  protected void configure() {
+    bind(GroupsCollection.class);
+
+    DynamicMap.mapOf(binder(), GROUP_KIND);
+    DynamicMap.mapOf(binder(), MEMBER_KIND);
+    DynamicMap.mapOf(binder(), SUBGROUP_KIND);
+
+    create(GROUP_KIND).to(CreateGroup.class);
+    get(GROUP_KIND).to(GetGroup.class);
+    put(GROUP_KIND).to(PutGroup.class);
+    get(GROUP_KIND, "detail").to(GetDetail.class);
+    post(GROUP_KIND, "index").to(Index.class);
+    post(GROUP_KIND, "members").to(AddMembers.class);
+    post(GROUP_KIND, "members.add").to(AddMembers.class);
+    post(GROUP_KIND, "members.delete").to(DeleteMembers.class);
+    post(GROUP_KIND, "groups").to(AddSubgroups.class);
+    post(GROUP_KIND, "groups.add").to(AddSubgroups.class);
+    post(GROUP_KIND, "groups.delete").to(DeleteSubgroups.class);
+    get(GROUP_KIND, "description").to(GetDescription.class);
+    put(GROUP_KIND, "description").to(PutDescription.class);
+    delete(GROUP_KIND, "description").to(PutDescription.class);
+    get(GROUP_KIND, "name").to(GetName.class);
+    put(GROUP_KIND, "name").to(PutName.class);
+    get(GROUP_KIND, "owner").to(GetOwner.class);
+    put(GROUP_KIND, "owner").to(PutOwner.class);
+    get(GROUP_KIND, "options").to(GetOptions.class);
+    put(GROUP_KIND, "options").to(PutOptions.class);
+    get(GROUP_KIND, "log.audit").to(GetAuditLog.class);
+
+    child(GROUP_KIND, "members").to(MembersCollection.class);
+    create(MEMBER_KIND).to(CreateMember.class);
+    get(MEMBER_KIND).to(GetMember.class);
+    put(MEMBER_KIND).to(UpdateMember.class);
+    delete(MEMBER_KIND).to(DeleteMember.class);
+
+    child(GROUP_KIND, "groups").to(SubgroupsCollection.class);
+    create(SUBGROUP_KIND).to(CreateSubgroup.class);
+    get(SUBGROUP_KIND).to(GetSubgroup.class);
+    put(SUBGROUP_KIND).to(UpdateSubgroup.class);
+    delete(SUBGROUP_KIND).to(DeleteSubgroup.class);
+
+    factory(GroupsUpdate.Factory.class);
+  }
+
+  @Provides
+  @ServerInitiated
+  GroupsUpdate provideServerInitiatedGroupsUpdate(GroupsUpdate.Factory groupsUpdateFactory) {
+    return groupsUpdateFactory.create(null);
+  }
+
+  @Provides
+  @UserInitiated
+  GroupsUpdate provideUserInitiatedGroupsUpdate(
+      GroupsUpdate.Factory groupsUpdateFactory, IdentifiedUser currentUser) {
+    return groupsUpdateFactory.create(currentUser);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/group/NotInternalGroupException.java b/java/com/google/gerrit/server/restapi/group/NotInternalGroupException.java
new file mode 100644
index 0000000..1cdbd45
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/group/NotInternalGroupException.java
@@ -0,0 +1,25 @@
+// 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.
+
+package com.google.gerrit.server.restapi.group;
+
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+
+class NotInternalGroupException extends MethodNotAllowedException {
+  private static final long serialVersionUID = 1L;
+
+  NotInternalGroupException() {
+    super("not a Gerrit internal group");
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/group/PutDescription.java b/java/com/google/gerrit/server/restapi/group/PutDescription.java
new file mode 100644
index 0000000..d407f69
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/group/PutDescription.java
@@ -0,0 +1,78 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.group;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.common.errors.NoSuchGroupException;
+import com.google.gerrit.extensions.common.DescriptionInput;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.UserInitiated;
+import com.google.gerrit.server.group.GroupResource;
+import com.google.gerrit.server.group.db.GroupsUpdate;
+import com.google.gerrit.server.group.db.InternalGroupUpdate;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Objects;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class PutDescription implements RestModifyView<GroupResource, DescriptionInput> {
+  private final Provider<GroupsUpdate> groupsUpdateProvider;
+
+  @Inject
+  PutDescription(@UserInitiated Provider<GroupsUpdate> groupsUpdateProvider) {
+    this.groupsUpdateProvider = groupsUpdateProvider;
+  }
+
+  @Override
+  public Response<String> apply(GroupResource resource, DescriptionInput input)
+      throws AuthException, NotInternalGroupException, ResourceNotFoundException, OrmException,
+          IOException, ConfigInvalidException {
+    if (input == null) {
+      input = new DescriptionInput(); // Delete would set description to null.
+    }
+
+    GroupDescription.Internal internalGroup =
+        resource.asInternalGroup().orElseThrow(NotInternalGroupException::new);
+    if (!resource.getControl().isOwner()) {
+      throw new AuthException("Not group owner");
+    }
+
+    String currentDescription = Strings.nullToEmpty(internalGroup.getDescription());
+    String newDescription = Strings.nullToEmpty(input.description);
+    if (!Objects.equals(currentDescription, newDescription)) {
+      AccountGroup.UUID groupUuid = internalGroup.getGroupUUID();
+      InternalGroupUpdate groupUpdate =
+          InternalGroupUpdate.builder().setDescription(newDescription).build();
+      try {
+        groupsUpdateProvider.get().updateGroup(groupUuid, groupUpdate);
+      } catch (NoSuchGroupException e) {
+        throw new ResourceNotFoundException(String.format("Group %s not found", groupUuid));
+      }
+    }
+
+    return Strings.isNullOrEmpty(input.description)
+        ? Response.<String>none()
+        : Response.ok(input.description);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/group/PutGroup.java b/java/com/google/gerrit/server/restapi/group/PutGroup.java
new file mode 100644
index 0000000..33dcb8d
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/group/PutGroup.java
@@ -0,0 +1,31 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.group;
+
+import com.google.gerrit.extensions.api.groups.GroupInput;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.group.GroupResource;
+import com.google.inject.Singleton;
+
+@Singleton
+public class PutGroup implements RestModifyView<GroupResource, GroupInput> {
+  @Override
+  public Response<?> apply(GroupResource resource, GroupInput input)
+      throws ResourceConflictException {
+    throw new ResourceConflictException("Group already exists");
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/group/PutName.java b/java/com/google/gerrit/server/restapi/group/PutName.java
new file mode 100644
index 0000000..1f1968a
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/group/PutName.java
@@ -0,0 +1,86 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.group;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.common.errors.NoSuchGroupException;
+import com.google.gerrit.extensions.common.NameInput;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.UserInitiated;
+import com.google.gerrit.server.group.GroupResource;
+import com.google.gerrit.server.group.db.GroupsUpdate;
+import com.google.gerrit.server.group.db.InternalGroupUpdate;
+import com.google.gwtorm.server.OrmDuplicateKeyException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class PutName implements RestModifyView<GroupResource, NameInput> {
+  private final Provider<GroupsUpdate> groupsUpdateProvider;
+
+  @Inject
+  PutName(@UserInitiated Provider<GroupsUpdate> groupsUpdateProvider) {
+    this.groupsUpdateProvider = groupsUpdateProvider;
+  }
+
+  @Override
+  public String apply(GroupResource rsrc, NameInput input)
+      throws NotInternalGroupException, AuthException, BadRequestException,
+          ResourceConflictException, ResourceNotFoundException, IOException,
+          ConfigInvalidException {
+    GroupDescription.Internal internalGroup =
+        rsrc.asInternalGroup().orElseThrow(NotInternalGroupException::new);
+    if (!rsrc.getControl().isOwner()) {
+      throw new AuthException("Not group owner");
+    } else if (input == null || Strings.isNullOrEmpty(input.name)) {
+      throw new BadRequestException("name is required");
+    }
+    String newName = input.name.trim();
+    if (newName.isEmpty()) {
+      throw new BadRequestException("name is required");
+    }
+
+    if (internalGroup.getName().equals(newName)) {
+      return newName;
+    }
+
+    renameGroup(internalGroup, newName);
+    return newName;
+  }
+
+  private void renameGroup(GroupDescription.Internal group, String newName)
+      throws ResourceConflictException, ResourceNotFoundException, IOException,
+          ConfigInvalidException {
+    AccountGroup.UUID groupUuid = group.getGroupUUID();
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder().setName(new AccountGroup.NameKey(newName)).build();
+    try {
+      groupsUpdateProvider.get().updateGroup(groupUuid, groupUpdate);
+    } catch (NoSuchGroupException e) {
+      throw new ResourceNotFoundException(String.format("Group %s not found", groupUuid));
+    } catch (OrmDuplicateKeyException e) {
+      throw new ResourceConflictException("group with name " + newName + " already exists");
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/group/PutOptions.java b/java/com/google/gerrit/server/restapi/group/PutOptions.java
new file mode 100644
index 0000000..29b87d2
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/group/PutOptions.java
@@ -0,0 +1,79 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.group;
+
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.common.errors.NoSuchGroupException;
+import com.google.gerrit.extensions.common.GroupOptionsInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.UserInitiated;
+import com.google.gerrit.server.group.GroupResource;
+import com.google.gerrit.server.group.db.GroupsUpdate;
+import com.google.gerrit.server.group.db.InternalGroupUpdate;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class PutOptions implements RestModifyView<GroupResource, GroupOptionsInfo> {
+  private final Provider<GroupsUpdate> groupsUpdateProvider;
+
+  @Inject
+  PutOptions(@UserInitiated Provider<GroupsUpdate> groupsUpdateProvider) {
+    this.groupsUpdateProvider = groupsUpdateProvider;
+  }
+
+  @Override
+  public GroupOptionsInfo apply(GroupResource resource, GroupOptionsInfo input)
+      throws NotInternalGroupException, AuthException, BadRequestException,
+          ResourceNotFoundException, OrmException, IOException, ConfigInvalidException {
+    GroupDescription.Internal internalGroup =
+        resource.asInternalGroup().orElseThrow(NotInternalGroupException::new);
+    if (!resource.getControl().isOwner()) {
+      throw new AuthException("Not group owner");
+    }
+
+    if (input == null) {
+      throw new BadRequestException("options are required");
+    }
+    if (input.visibleToAll == null) {
+      input.visibleToAll = false;
+    }
+
+    if (internalGroup.isVisibleToAll() != input.visibleToAll) {
+      AccountGroup.UUID groupUuid = internalGroup.getGroupUUID();
+      InternalGroupUpdate groupUpdate =
+          InternalGroupUpdate.builder().setVisibleToAll(input.visibleToAll).build();
+      try {
+        groupsUpdateProvider.get().updateGroup(groupUuid, groupUpdate);
+      } catch (NoSuchGroupException e) {
+        throw new ResourceNotFoundException(String.format("Group %s not found", groupUuid));
+      }
+    }
+
+    GroupOptionsInfo options = new GroupOptionsInfo();
+    if (input.visibleToAll) {
+      options.visibleToAll = true;
+    }
+    return options;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/group/PutOwner.java b/java/com/google/gerrit/server/restapi/group/PutOwner.java
new file mode 100644
index 0000000..6ebec05
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/group/PutOwner.java
@@ -0,0 +1,85 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.group;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.common.errors.NoSuchGroupException;
+import com.google.gerrit.extensions.api.groups.OwnerInput;
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.UserInitiated;
+import com.google.gerrit.server.group.GroupResolver;
+import com.google.gerrit.server.group.GroupResource;
+import com.google.gerrit.server.group.db.GroupsUpdate;
+import com.google.gerrit.server.group.db.InternalGroupUpdate;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class PutOwner implements RestModifyView<GroupResource, OwnerInput> {
+  private final GroupResolver groupResolver;
+  private final Provider<GroupsUpdate> groupsUpdateProvider;
+  private final GroupJson json;
+
+  @Inject
+  PutOwner(
+      GroupResolver groupResolver,
+      @UserInitiated Provider<GroupsUpdate> groupsUpdateProvider,
+      GroupJson json) {
+    this.groupResolver = groupResolver;
+    this.groupsUpdateProvider = groupsUpdateProvider;
+    this.json = json;
+  }
+
+  @Override
+  public GroupInfo apply(GroupResource resource, OwnerInput input)
+      throws ResourceNotFoundException, NotInternalGroupException, AuthException,
+          BadRequestException, UnprocessableEntityException, OrmException, IOException,
+          ConfigInvalidException, PermissionBackendException {
+    GroupDescription.Internal internalGroup =
+        resource.asInternalGroup().orElseThrow(NotInternalGroupException::new);
+    if (!resource.getControl().isOwner()) {
+      throw new AuthException("Not group owner");
+    }
+
+    if (input == null || Strings.isNullOrEmpty(input.owner)) {
+      throw new BadRequestException("owner is required");
+    }
+
+    GroupDescription.Basic owner = groupResolver.parse(input.owner);
+    if (!internalGroup.getOwnerGroupUUID().equals(owner.getGroupUUID())) {
+      AccountGroup.UUID groupUuid = internalGroup.getGroupUUID();
+      InternalGroupUpdate groupUpdate =
+          InternalGroupUpdate.builder().setOwnerGroupUUID(owner.getGroupUUID()).build();
+      try {
+        groupsUpdateProvider.get().updateGroup(groupUuid, groupUpdate);
+      } catch (NoSuchGroupException e) {
+        throw new ResourceNotFoundException(String.format("Group %s not found", groupUuid));
+      }
+    }
+    return json.format(owner);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/group/QueryGroups.java b/java/com/google/gerrit/server/restapi/group/QueryGroups.java
new file mode 100644
index 0000000..fa9285d
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/group/QueryGroups.java
@@ -0,0 +1,133 @@
+// Copyright (C) 2017 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.google.gerrit.server.restapi.group;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+import com.google.gerrit.extensions.client.ListGroupsOption;
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.index.query.QueryResult;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.group.InternalGroupDescription;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.query.group.GroupQueryBuilder;
+import com.google.gerrit.server.query.group.GroupQueryProcessor;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.List;
+import org.kohsuke.args4j.Option;
+
+public class QueryGroups implements RestReadView<TopLevelResource> {
+  private final GroupQueryBuilder queryBuilder;
+  private final GroupQueryProcessor queryProcessor;
+  private final GroupJson json;
+
+  private String query;
+  private int limit;
+  private int start;
+  private EnumSet<ListGroupsOption> options = EnumSet.noneOf(ListGroupsOption.class);
+
+  // TODO(ekempin): --query in ListGroups is marked as deprecated, once it is
+  // removed we want to rename --query2 to --query here.
+  /** --query (-q) is already used by {@link ListGroups} */
+  @Option(
+      name = "--query2",
+      aliases = {"-q2"},
+      usage = "group query")
+  public void setQuery(String query) {
+    this.query = query;
+  }
+
+  @Option(
+      name = "--limit",
+      aliases = {"-n"},
+      metaVar = "CNT",
+      usage = "maximum number of groups to list")
+  public void setLimit(int limit) {
+    this.limit = limit;
+  }
+
+  @Option(
+      name = "--start",
+      aliases = {"-S"},
+      metaVar = "CNT",
+      usage = "number of groups to skip")
+  public void setStart(int start) {
+    this.start = start;
+  }
+
+  @Option(name = "-o", usage = "Output options per group")
+  public void addOption(ListGroupsOption o) {
+    options.add(o);
+  }
+
+  @Option(name = "-O", usage = "Output option flags, in hex")
+  public void setOptionFlagsHex(String hex) {
+    options.addAll(ListGroupsOption.fromBits(Integer.parseInt(hex, 16)));
+  }
+
+  @Inject
+  protected QueryGroups(
+      GroupQueryBuilder queryBuilder, GroupQueryProcessor queryProcessor, GroupJson json) {
+    this.queryBuilder = queryBuilder;
+    this.queryProcessor = queryProcessor;
+    this.json = json;
+  }
+
+  @Override
+  public List<GroupInfo> apply(TopLevelResource resource)
+      throws BadRequestException, MethodNotAllowedException, OrmException,
+          PermissionBackendException {
+    if (Strings.isNullOrEmpty(query)) {
+      throw new BadRequestException("missing query field");
+    }
+
+    if (queryProcessor.isDisabled()) {
+      throw new MethodNotAllowedException("query disabled");
+    }
+
+    if (start != 0) {
+      queryProcessor.setStart(start);
+    }
+
+    if (limit != 0) {
+      queryProcessor.setUserProvidedLimit(limit);
+    }
+
+    try {
+      QueryResult<InternalGroup> result = queryProcessor.query(queryBuilder.parse(query));
+      List<InternalGroup> groups = result.entities();
+
+      ArrayList<GroupInfo> groupInfos = Lists.newArrayListWithCapacity(groups.size());
+      json.addOptions(options);
+      for (InternalGroup group : groups) {
+        groupInfos.add(json.format(new InternalGroupDescription(group)));
+      }
+      if (!groupInfos.isEmpty() && result.more()) {
+        groupInfos.get(groupInfos.size() - 1)._moreGroups = true;
+      }
+      return groupInfos;
+    } catch (QueryParseException e) {
+      throw new BadRequestException(e.getMessage());
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/group/SubgroupsCollection.java b/java/com/google/gerrit/server/restapi/group/SubgroupsCollection.java
new file mode 100644
index 0000000..cebc27a
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/group/SubgroupsCollection.java
@@ -0,0 +1,74 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.group;
+
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ChildCollection;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.server.group.GroupResource;
+import com.google.gerrit.server.group.SubgroupResource;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class SubgroupsCollection implements ChildCollection<GroupResource, SubgroupResource> {
+  private final DynamicMap<RestView<SubgroupResource>> views;
+  private final ListSubgroups list;
+  private final GroupsCollection groupsCollection;
+
+  @Inject
+  SubgroupsCollection(
+      DynamicMap<RestView<SubgroupResource>> views,
+      ListSubgroups list,
+      GroupsCollection groupsCollection) {
+    this.views = views;
+    this.list = list;
+    this.groupsCollection = groupsCollection;
+  }
+
+  @Override
+  public RestView<GroupResource> list() {
+    return list;
+  }
+
+  @Override
+  public SubgroupResource parse(GroupResource resource, IdString id)
+      throws NotInternalGroupException, AuthException, ResourceNotFoundException {
+    GroupDescription.Internal parent =
+        resource.asInternalGroup().orElseThrow(NotInternalGroupException::new);
+
+    GroupDescription.Basic member =
+        groupsCollection.parse(TopLevelResource.INSTANCE, id).getGroup();
+    if (resource.getControl().canSeeGroup() && isSubgroup(parent, member)) {
+      return new SubgroupResource(resource, member);
+    }
+    throw new ResourceNotFoundException(id);
+  }
+
+  private static boolean isSubgroup(
+      GroupDescription.Internal parent, GroupDescription.Basic member) {
+    return parent.getSubgroups().contains(member.getGroupUUID());
+  }
+
+  @Override
+  public DynamicMap<RestView<SubgroupResource>> views() {
+    return views;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/BanCommit.java b/java/com/google/gerrit/server/restapi/project/BanCommit.java
new file mode 100644
index 0000000..3d101b2
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/BanCommit.java
@@ -0,0 +1,83 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.project;
+
+import com.google.common.collect.Lists;
+import com.google.gerrit.extensions.api.projects.BanCommitInput;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.server.git.BanCommitResult;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.restapi.project.BanCommit.BanResultInfo;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryingRestModifyView;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.jgit.lib.ObjectId;
+
+@Singleton
+public class BanCommit
+    extends RetryingRestModifyView<ProjectResource, BanCommitInput, BanResultInfo> {
+  private final com.google.gerrit.server.git.BanCommit banCommit;
+
+  @Inject
+  BanCommit(RetryHelper retryHelper, com.google.gerrit.server.git.BanCommit banCommit) {
+    super(retryHelper);
+    this.banCommit = banCommit;
+  }
+
+  @Override
+  protected BanResultInfo applyImpl(
+      BatchUpdate.Factory updateFactory, ProjectResource rsrc, BanCommitInput input)
+      throws RestApiException, UpdateException, IOException, PermissionBackendException {
+    BanResultInfo r = new BanResultInfo();
+    if (input != null && input.commits != null && !input.commits.isEmpty()) {
+      List<ObjectId> commitsToBan = new ArrayList<>(input.commits.size());
+      for (String c : input.commits) {
+        try {
+          commitsToBan.add(ObjectId.fromString(c));
+        } catch (IllegalArgumentException e) {
+          throw new UnprocessableEntityException(e.getMessage());
+        }
+      }
+
+      BanCommitResult result =
+          banCommit.ban(rsrc.getNameKey(), rsrc.getUser(), commitsToBan, input.reason);
+      r.newlyBanned = transformCommits(result.getNewlyBannedCommits());
+      r.alreadyBanned = transformCommits(result.getAlreadyBannedCommits());
+      r.ignored = transformCommits(result.getIgnoredObjectIds());
+    }
+    return r;
+  }
+
+  private static List<String> transformCommits(List<ObjectId> commits) {
+    if (commits == null || commits.isEmpty()) {
+      return null;
+    }
+    return Lists.transform(commits, ObjectId::getName);
+  }
+
+  public static class BanResultInfo {
+    public List<String> newlyBanned;
+    public List<String> alreadyBanned;
+    public List<String> ignored;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/BranchesCollection.java b/java/com/google/gerrit/server/restapi/project/BranchesCollection.java
new file mode 100644
index 0000000..2b7e089
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/BranchesCollection.java
@@ -0,0 +1,95 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.project;
+
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ChildCollection;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.gerrit.server.project.BranchResource;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+
+@Singleton
+public class BranchesCollection implements ChildCollection<ProjectResource, BranchResource> {
+  private final DynamicMap<RestView<BranchResource>> views;
+  private final Provider<ListBranches> list;
+  private final PermissionBackend permissionBackend;
+  private final GitRepositoryManager repoManager;
+
+  @Inject
+  BranchesCollection(
+      DynamicMap<RestView<BranchResource>> views,
+      Provider<ListBranches> list,
+      PermissionBackend permissionBackend,
+      GitRepositoryManager repoManager) {
+    this.views = views;
+    this.list = list;
+    this.permissionBackend = permissionBackend;
+    this.repoManager = repoManager;
+  }
+
+  @Override
+  public RestView<ProjectResource> list() {
+    return list.get();
+  }
+
+  @Override
+  public BranchResource parse(ProjectResource parent, IdString id)
+      throws RestApiException, IOException, PermissionBackendException {
+    parent.getProjectState().checkStatePermitsRead();
+    Project.NameKey project = parent.getNameKey();
+    try (Repository repo = repoManager.openRepository(project)) {
+      Ref ref = repo.exactRef(RefNames.fullName(id.get()));
+      if (ref == null) {
+        throw new ResourceNotFoundException(id);
+      }
+
+      // ListBranches checks the target of a symbolic reference to determine access
+      // rights on the symbolic reference itself. This check prevents seeing a hidden
+      // branch simply because the symbolic reference name was visible.
+      permissionBackend
+          .currentUser()
+          .project(project)
+          .ref(ref.isSymbolic() ? ref.getTarget().getName() : ref.getName())
+          .check(RefPermission.READ);
+      return new BranchResource(parent.getProjectState(), parent.getUser(), ref);
+    } catch (AuthException notAllowed) {
+      throw new ResourceNotFoundException(id);
+    } catch (RepositoryNotFoundException noRepo) {
+      throw new ResourceNotFoundException();
+    }
+  }
+
+  @Override
+  public DynamicMap<RestView<BranchResource>> views() {
+    return views;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/Check.java b/java/com/google/gerrit/server/restapi/project/Check.java
new file mode 100644
index 0000000..a6fd764
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/Check.java
@@ -0,0 +1,48 @@
+// 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.
+
+package com.google.gerrit.server.restapi.project;
+
+import com.google.gerrit.extensions.api.projects.CheckProjectInput;
+import com.google.gerrit.extensions.api.projects.CheckProjectResultInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.project.ProjectsConsistencyChecker;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class Check implements RestModifyView<ProjectResource, CheckProjectInput> {
+  private final PermissionBackend permissionBackend;
+  private final ProjectsConsistencyChecker projectsConsistencyChecker;
+
+  @Inject
+  Check(
+      PermissionBackend permissionBackend, ProjectsConsistencyChecker projectsConsistencyChecker) {
+    this.permissionBackend = permissionBackend;
+    this.projectsConsistencyChecker = projectsConsistencyChecker;
+  }
+
+  @Override
+  public CheckProjectResultInfo apply(ProjectResource rsrc, CheckProjectInput input)
+      throws AuthException, BadRequestException, ResourceConflictException, Exception {
+    permissionBackend.user(rsrc.getUser()).check(GlobalPermission.ADMINISTRATE_SERVER);
+    return projectsConsistencyChecker.check(rsrc.getNameKey(), input);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/CheckAccess.java b/java/com/google/gerrit/server/restapi/project/CheckAccess.java
new file mode 100644
index 0000000..1664635
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/CheckAccess.java
@@ -0,0 +1,138 @@
+// Copyright (C) 2017 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.google.gerrit.server.restapi.project;
+
+import static com.google.gerrit.reviewdb.client.RefNames.REFS_HEADS;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.api.config.AccessCheckInfo;
+import com.google.gerrit.extensions.api.config.AccessCheckInput;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.server.account.AccountResolver;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.permissions.DefaultPermissionMappings;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.gerrit.server.project.ProjectResource;
+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 javax.servlet.http.HttpServletResponse;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Repository;
+
+@Singleton
+public class CheckAccess implements RestModifyView<ProjectResource, AccessCheckInput> {
+  private final AccountResolver accountResolver;
+  private final PermissionBackend permissionBackend;
+  private final GitRepositoryManager gitRepositoryManager;
+
+  @Inject
+  CheckAccess(
+      AccountResolver resolver,
+      PermissionBackend permissionBackend,
+      GitRepositoryManager gitRepositoryManager) {
+    this.accountResolver = resolver;
+    this.permissionBackend = permissionBackend;
+    this.gitRepositoryManager = gitRepositoryManager;
+  }
+
+  @Override
+  public AccessCheckInfo apply(ProjectResource rsrc, AccessCheckInput input)
+      throws OrmException, PermissionBackendException, RestApiException, IOException,
+          ConfigInvalidException {
+    permissionBackend.user(rsrc.getUser()).check(GlobalPermission.VIEW_ACCESS);
+
+    rsrc.getProjectState().checkStatePermitsRead();
+
+    if (input == null) {
+      throw new BadRequestException("input is required");
+    }
+    if (Strings.isNullOrEmpty(input.account)) {
+      throw new BadRequestException("input requires 'account'");
+    }
+
+    Account match = accountResolver.find(input.account);
+    if (match == null) {
+      throw new UnprocessableEntityException(
+          String.format("cannot find account %s", input.account));
+    }
+
+    AccessCheckInfo info = new AccessCheckInfo();
+    try {
+      permissionBackend
+          .absentUser(match.getId())
+          .project(rsrc.getNameKey())
+          .check(ProjectPermission.ACCESS);
+    } catch (AuthException e) {
+      info.message = String.format("user %s cannot see project %s", match.getId(), rsrc.getName());
+      info.status = HttpServletResponse.SC_FORBIDDEN;
+      return info;
+    }
+
+    RefPermission refPerm;
+    if (!Strings.isNullOrEmpty(input.permission)) {
+      if (Strings.isNullOrEmpty(input.ref)) {
+        throw new BadRequestException("must set 'ref' when specifying 'permission'");
+      }
+      Optional<RefPermission> rp = DefaultPermissionMappings.refPermission(input.permission);
+      if (!rp.isPresent()) {
+        throw new BadRequestException(
+            String.format("'%s' is not recognized as ref permission", input.permission));
+      }
+
+      refPerm = rp.get();
+    } else {
+      refPerm = RefPermission.READ;
+    }
+
+    if (!Strings.isNullOrEmpty(input.ref)) {
+      try {
+        permissionBackend
+            .absentUser(match.getId())
+            .ref(new Branch.NameKey(rsrc.getNameKey(), input.ref))
+            .check(refPerm);
+      } catch (AuthException e) {
+        info.status = HttpServletResponse.SC_FORBIDDEN;
+        info.message =
+            String.format(
+                "user %s lacks permission %s for %s in project %s",
+                match.getId(), input.permission, input.ref, rsrc.getName());
+        return info;
+      }
+    } else {
+      // We say access is okay if there are no refs, but this warrants a warning,
+      // as access denied looks the same as no branches to the user.
+      try (Repository repo = gitRepositoryManager.openRepository(rsrc.getNameKey())) {
+        if (repo.getRefDatabase().getRefsByPrefix(REFS_HEADS).isEmpty()) {
+          info.message = "access is OK, but repository has no branches under refs/heads/";
+        }
+      }
+    }
+    info.status = HttpServletResponse.SC_OK;
+    return info;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/CheckAccessReadView.java b/java/com/google/gerrit/server/restapi/project/CheckAccessReadView.java
new file mode 100644
index 0000000..0aab0e1
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/CheckAccessReadView.java
@@ -0,0 +1,63 @@
+// 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.
+
+package com.google.gerrit.server.restapi.project;
+
+import com.google.gerrit.extensions.api.config.AccessCheckInfo;
+import com.google.gerrit.extensions.api.config.AccessCheckInput;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.kohsuke.args4j.Option;
+
+public class CheckAccessReadView implements RestReadView<ProjectResource> {
+  String refName;
+  String account;
+  String permission;
+
+  @Inject CheckAccess checkAccess;
+
+  @Option(name = "--ref", usage = "ref name to check permission for")
+  void addOption(String refName) {
+    this.refName = refName;
+  }
+
+  @Option(name = "--account", usage = "account to check acccess for")
+  void setAccount(String account) {
+    this.account = account;
+  }
+
+  @Option(name = "--perm", usage = "permission to check; default: read of any ref.")
+  void setPermission(String perm) {
+    this.permission = perm;
+  }
+
+  @Override
+  public AccessCheckInfo apply(ProjectResource rsrc)
+      throws OrmException, PermissionBackendException, RestApiException, IOException,
+          ConfigInvalidException {
+
+    AccessCheckInput input = new AccessCheckInput();
+    input.ref = refName;
+    input.account = account;
+    input.permission = permission;
+
+    return checkAccess.apply(rsrc, input);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/CheckMergeability.java b/java/com/google/gerrit/server/restapi/project/CheckMergeability.java
new file mode 100644
index 0000000..de2ac64
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/CheckMergeability.java
@@ -0,0 +1,127 @@
+// 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.
+
+package com.google.gerrit.server.restapi.project;
+
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.extensions.common.MergeableInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.InMemoryInserter;
+import com.google.gerrit.server.git.MergeUtil;
+import com.google.gerrit.server.project.BranchResource;
+import com.google.inject.Inject;
+import java.io.IOException;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.merge.Merger;
+import org.eclipse.jgit.merge.ResolveMerger;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.kohsuke.args4j.Option;
+
+/** Check the mergeability at current branch for a git object references expression. */
+public class CheckMergeability implements RestReadView<BranchResource> {
+  private String source;
+  private String strategy;
+  private SubmitType submitType;
+
+  @Option(
+      name = "--source",
+      metaVar = "COMMIT",
+      usage =
+          "the source reference to merge, which could be any git object "
+              + "references expression, refer to "
+              + "org.eclipse.jgit.lib.Repository#resolve(String)",
+      required = true)
+  public void setSource(String source) {
+    this.source = source;
+  }
+
+  @Option(
+      name = "--strategy",
+      metaVar = "STRATEGY",
+      usage = "name of the merge strategy, refer to org.eclipse.jgit.merge.MergeStrategy")
+  public void setStrategy(String strategy) {
+    this.strategy = strategy;
+  }
+
+  private final GitRepositoryManager gitManager;
+  private final CommitsCollection commits;
+
+  @Inject
+  CheckMergeability(
+      GitRepositoryManager gitManager, CommitsCollection commits, @GerritServerConfig Config cfg) {
+    this.gitManager = gitManager;
+    this.commits = commits;
+    this.strategy = MergeUtil.getMergeStrategy(cfg).getName();
+    this.submitType = cfg.getEnum("project", null, "submitType", SubmitType.MERGE_IF_NECESSARY);
+  }
+
+  @Override
+  public MergeableInfo apply(BranchResource resource)
+      throws IOException, BadRequestException, ResourceNotFoundException {
+    if (!(submitType.equals(SubmitType.MERGE_ALWAYS)
+        || submitType.equals(SubmitType.MERGE_IF_NECESSARY))) {
+      throw new BadRequestException("Submit type: " + submitType + " is not supported");
+    }
+
+    MergeableInfo result = new MergeableInfo();
+    result.submitType = submitType;
+    result.strategy = strategy;
+    try (Repository git = gitManager.openRepository(resource.getNameKey());
+        RevWalk rw = new RevWalk(git);
+        ObjectInserter inserter = new InMemoryInserter(git)) {
+      Merger m = MergeUtil.newMerger(inserter, git.getConfig(), strategy);
+
+      Ref destRef = git.getRefDatabase().exactRef(resource.getRef());
+      if (destRef == null) {
+        throw new ResourceNotFoundException(resource.getRef());
+      }
+
+      RevCommit targetCommit = rw.parseCommit(destRef.getObjectId());
+      RevCommit sourceCommit = MergeUtil.resolveCommit(git, rw, source);
+
+      if (!commits.canRead(resource.getProjectState(), git, sourceCommit)) {
+        throw new BadRequestException("do not have read permission for: " + source);
+      }
+
+      if (rw.isMergedInto(sourceCommit, targetCommit)) {
+        result.mergeable = true;
+        result.commitMerged = true;
+        result.contentMerged = true;
+        return result;
+      }
+
+      if (m.merge(false, targetCommit, sourceCommit)) {
+        result.mergeable = true;
+        result.commitMerged = false;
+        result.contentMerged = m.getResultTreeId().equals(targetCommit.getTree());
+      } else {
+        result.mergeable = false;
+        if (m instanceof ResolveMerger) {
+          result.conflicts = ((ResolveMerger) m).getUnmergedPaths();
+        }
+      }
+    } catch (IllegalArgumentException e) {
+      throw new BadRequestException(e.getMessage());
+    }
+    return result;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/ChildProjectsCollection.java b/java/com/google/gerrit/server/restapi/project/ChildProjectsCollection.java
new file mode 100644
index 0000000..9f6676d
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/ChildProjectsCollection.java
@@ -0,0 +1,73 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.project;
+
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ChildCollection;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ChildProjectResource;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+
+@Singleton
+public class ChildProjectsCollection
+    implements ChildCollection<ProjectResource, ChildProjectResource> {
+  private final Provider<ListChildProjects> list;
+  private final ProjectsCollection projectsCollection;
+  private final DynamicMap<RestView<ChildProjectResource>> views;
+
+  @Inject
+  ChildProjectsCollection(
+      Provider<ListChildProjects> list,
+      ProjectsCollection projectsCollection,
+      DynamicMap<RestView<ChildProjectResource>> views) {
+    this.list = list;
+    this.projectsCollection = projectsCollection;
+    this.views = views;
+  }
+
+  @Override
+  public ListChildProjects list() throws ResourceNotFoundException, AuthException {
+    return list.get();
+  }
+
+  @Override
+  public ChildProjectResource parse(ProjectResource parent, IdString id)
+      throws RestApiException, IOException, PermissionBackendException {
+    parent.getProjectState().checkStatePermitsRead();
+    ProjectResource p = projectsCollection.parse(TopLevelResource.INSTANCE, id);
+    for (ProjectState pp : p.getProjectState().parents()) {
+      if (parent.getNameKey().equals(pp.getProject().getNameKey())) {
+        return new ChildProjectResource(parent, p.getProjectState());
+      }
+    }
+    throw new ResourceNotFoundException(id);
+  }
+
+  @Override
+  public DynamicMap<RestView<ChildProjectResource>> views() {
+    return views;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/CommitIncludedIn.java b/java/com/google/gerrit/server/restapi/project/CommitIncludedIn.java
new file mode 100644
index 0000000..3855b78
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/CommitIncludedIn.java
@@ -0,0 +1,45 @@
+// 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.
+
+package com.google.gerrit.server.restapi.project;
+
+import com.google.gerrit.extensions.api.changes.IncludedInInfo;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.change.IncludedIn;
+import com.google.gerrit.server.project.CommitResource;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.revwalk.RevCommit;
+
+@Singleton
+public class CommitIncludedIn implements RestReadView<CommitResource> {
+  private IncludedIn includedIn;
+
+  @Inject
+  CommitIncludedIn(IncludedIn includedIn) {
+    this.includedIn = includedIn;
+  }
+
+  @Override
+  public IncludedInInfo apply(CommitResource rsrc)
+      throws RestApiException, OrmException, IOException {
+    RevCommit commit = rsrc.getCommit();
+    Project.NameKey project = rsrc.getProjectState().getNameKey();
+    return includedIn.apply(project, commit.getId().getName());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/CommitsCollection.java b/java/com/google/gerrit/server/restapi/project/CommitsCollection.java
new file mode 100644
index 0000000..15cd824
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/CommitsCollection.java
@@ -0,0 +1,127 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.project;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.ChildCollection;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.index.change.ChangeIndexCollection;
+import com.google.gerrit.server.project.CommitResource;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.project.Reachable;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.List;
+import org.eclipse.jgit.errors.IncorrectObjectTypeException;
+import org.eclipse.jgit.errors.MissingObjectException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+@Singleton
+public class CommitsCollection implements ChildCollection<ProjectResource, CommitResource> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final DynamicMap<RestView<CommitResource>> views;
+  private final GitRepositoryManager repoManager;
+  private final ChangeIndexCollection indexes;
+  private final Provider<InternalChangeQuery> queryProvider;
+  private final Reachable reachable;
+
+  @Inject
+  public CommitsCollection(
+      DynamicMap<RestView<CommitResource>> views,
+      GitRepositoryManager repoManager,
+      ChangeIndexCollection indexes,
+      Provider<InternalChangeQuery> queryProvider,
+      Reachable reachable) {
+    this.views = views;
+    this.repoManager = repoManager;
+    this.indexes = indexes;
+    this.queryProvider = queryProvider;
+    this.reachable = reachable;
+  }
+
+  @Override
+  public RestView<ProjectResource> list() throws ResourceNotFoundException {
+    throw new ResourceNotFoundException();
+  }
+
+  @Override
+  public CommitResource parse(ProjectResource parent, IdString id)
+      throws RestApiException, IOException {
+    parent.getProjectState().checkStatePermitsRead();
+    ObjectId objectId;
+    try {
+      objectId = ObjectId.fromString(id.get());
+    } catch (IllegalArgumentException e) {
+      throw new ResourceNotFoundException(id);
+    }
+
+    try (Repository repo = repoManager.openRepository(parent.getNameKey());
+        RevWalk rw = new RevWalk(repo)) {
+      RevCommit commit = rw.parseCommit(objectId);
+      rw.parseBody(commit);
+      if (!canRead(parent.getProjectState(), repo, commit)) {
+        throw new ResourceNotFoundException(id);
+      }
+      for (int i = 0; i < commit.getParentCount(); i++) {
+        rw.parseBody(rw.parseCommit(commit.getParent(i)));
+      }
+      return new CommitResource(parent, commit);
+    } catch (MissingObjectException | IncorrectObjectTypeException e) {
+      throw new ResourceNotFoundException(id);
+    }
+  }
+
+  @Override
+  public DynamicMap<RestView<CommitResource>> views() {
+    return views;
+  }
+
+  /** @return true if {@code commit} is visible to the caller. */
+  public boolean canRead(ProjectState state, Repository repo, RevCommit commit) {
+    Project.NameKey project = state.getNameKey();
+
+    // Look for changes associated with the commit.
+    if (indexes.getSearchIndex() != null) {
+      try {
+        List<ChangeData> changes =
+            queryProvider.get().enforceVisibility(true).byProjectCommit(project, commit);
+        if (!changes.isEmpty()) {
+          return true;
+        }
+      } catch (OrmException e) {
+        logger.atSevere().withCause(e).log(
+            "Cannot look up change for commit %s in %s", commit.name(), project);
+      }
+    }
+
+    return reachable.fromRefs(project, repo, commit, repo.getAllRefs());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/ConfigInfoImpl.java b/java/com/google/gerrit/server/restapi/project/ConfigInfoImpl.java
new file mode 100644
index 0000000..e179896
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/ConfigInfoImpl.java
@@ -0,0 +1,180 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.project;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
+import com.google.common.collect.Iterables;
+import com.google.gerrit.extensions.api.projects.CommentLinkInfo;
+import com.google.gerrit.extensions.api.projects.ConfigInfo;
+import com.google.gerrit.extensions.api.projects.ProjectConfigEntryType;
+import com.google.gerrit.extensions.common.ActionInfo;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.registration.Extension;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.extensions.webui.UiAction;
+import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.PluginConfig;
+import com.google.gerrit.server.config.PluginConfigFactory;
+import com.google.gerrit.server.config.ProjectConfigEntry;
+import com.google.gerrit.server.extensions.webui.UiActions;
+import com.google.gerrit.server.project.BooleanProjectConfigTransformations;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.project.ProjectState.EffectiveMaxObjectSizeLimit;
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.TreeMap;
+
+public class ConfigInfoImpl extends ConfigInfo {
+  @SuppressWarnings("deprecation")
+  public ConfigInfoImpl(
+      boolean serverEnableSignedPush,
+      ProjectState projectState,
+      CurrentUser user,
+      DynamicMap<ProjectConfigEntry> pluginConfigEntries,
+      PluginConfigFactory cfgFactory,
+      AllProjectsName allProjects,
+      UiActions uiActions,
+      DynamicMap<RestView<ProjectResource>> views) {
+    Project p = projectState.getProject();
+    this.description = Strings.emptyToNull(p.getDescription());
+
+    ProjectState parentState = Iterables.getFirst(projectState.parents(), null);
+    for (BooleanProjectConfig cfg : BooleanProjectConfig.values()) {
+      InheritedBooleanInfo info = new InheritedBooleanInfo();
+      info.configuredValue = p.getBooleanConfig(cfg);
+      if (parentState != null) {
+        info.inheritedValue = parentState.is(cfg);
+      }
+      BooleanProjectConfigTransformations.set(cfg, this, info);
+    }
+
+    if (!serverEnableSignedPush) {
+      this.enableSignedPush = null;
+      this.requireSignedPush = null;
+    }
+
+    this.maxObjectSizeLimit = getMaxObjectSizeLimit(projectState, p);
+
+    this.defaultSubmitType = new SubmitTypeInfo();
+    this.defaultSubmitType.value = projectState.getSubmitType();
+    this.defaultSubmitType.configuredValue =
+        MoreObjects.firstNonNull(
+            projectState.getConfig().getProject().getConfiguredSubmitType(),
+            Project.DEFAULT_SUBMIT_TYPE);
+    ProjectState parent =
+        projectState.isAllProjects() ? projectState : projectState.parents().get(0);
+    this.defaultSubmitType.inheritedValue = parent.getSubmitType();
+
+    this.submitType = this.defaultSubmitType.value;
+
+    this.state =
+        p.getState() != com.google.gerrit.extensions.client.ProjectState.ACTIVE
+            ? p.getState()
+            : null;
+
+    this.commentlinks = new LinkedHashMap<>();
+    for (CommentLinkInfo cl : projectState.getCommentLinks()) {
+      this.commentlinks.put(cl.name, cl);
+    }
+
+    pluginConfig = getPluginConfig(projectState, pluginConfigEntries, cfgFactory, allProjects);
+
+    actions = new TreeMap<>();
+    for (UiAction.Description d : uiActions.from(views, new ProjectResource(projectState, user))) {
+      actions.put(d.getId(), new ActionInfo(d));
+    }
+    this.theme = projectState.getTheme();
+
+    this.extensionPanelNames = projectState.getConfig().getExtensionPanelSections();
+  }
+
+  private MaxObjectSizeLimitInfo getMaxObjectSizeLimit(ProjectState projectState, Project p) {
+    MaxObjectSizeLimitInfo info = new MaxObjectSizeLimitInfo();
+    EffectiveMaxObjectSizeLimit limit = projectState.getEffectiveMaxObjectSizeLimit();
+    long value = limit.value;
+    info.value = value == 0 ? null : String.valueOf(value);
+    info.configuredValue = p.getMaxObjectSizeLimit();
+    info.summary = limit.summary;
+    return info;
+  }
+
+  private Map<String, Map<String, ConfigParameterInfo>> getPluginConfig(
+      ProjectState project,
+      DynamicMap<ProjectConfigEntry> pluginConfigEntries,
+      PluginConfigFactory cfgFactory,
+      AllProjectsName allProjects) {
+    TreeMap<String, Map<String, ConfigParameterInfo>> pluginConfig = new TreeMap<>();
+    for (Extension<ProjectConfigEntry> e : pluginConfigEntries) {
+      ProjectConfigEntry configEntry = e.getProvider().get();
+      PluginConfig cfg = cfgFactory.getFromProjectConfig(project, e.getPluginName());
+      String configuredValue = cfg.getString(e.getExportName());
+      ConfigParameterInfo p = new ConfigParameterInfo();
+      p.displayName = configEntry.getDisplayName();
+      p.description = configEntry.getDescription();
+      p.warning = configEntry.getWarning(project);
+      p.type = configEntry.getType();
+      p.permittedValues = configEntry.getPermittedValues();
+      p.editable = configEntry.isEditable(project) ? true : null;
+      if (configEntry.isInheritable() && !allProjects.equals(project.getNameKey())) {
+        PluginConfig cfgWithInheritance =
+            cfgFactory.getFromProjectConfigWithInheritance(project, e.getPluginName());
+        p.inheritable = true;
+        p.value =
+            configEntry.onRead(
+                project,
+                cfgWithInheritance.getString(e.getExportName(), configEntry.getDefaultValue()));
+        p.configuredValue = configuredValue;
+        p.inheritedValue = getInheritedValue(project, cfgFactory, e);
+      } else {
+        if (configEntry.getType() == ProjectConfigEntryType.ARRAY) {
+          p.values =
+              configEntry.onRead(project, Arrays.asList(cfg.getStringList(e.getExportName())));
+        } else {
+          p.value =
+              configEntry.onRead(
+                  project,
+                  configuredValue != null ? configuredValue : configEntry.getDefaultValue());
+        }
+      }
+      Map<String, ConfigParameterInfo> pc = pluginConfig.get(e.getPluginName());
+      if (pc == null) {
+        pc = new TreeMap<>();
+        pluginConfig.put(e.getPluginName(), pc);
+      }
+      pc.put(e.getExportName(), p);
+    }
+    return !pluginConfig.isEmpty() ? pluginConfig : null;
+  }
+
+  private String getInheritedValue(
+      ProjectState project, PluginConfigFactory cfgFactory, Extension<ProjectConfigEntry> e) {
+    ProjectConfigEntry configEntry = e.getProvider().get();
+    ProjectState parent = Iterables.getFirst(project.parents(), null);
+    String inheritedValue = configEntry.getDefaultValue();
+    if (parent != null) {
+      PluginConfig parentCfgWithInheritance =
+          cfgFactory.getFromProjectConfigWithInheritance(parent, e.getPluginName());
+      inheritedValue =
+          parentCfgWithInheritance.getString(e.getExportName(), configEntry.getDefaultValue());
+    }
+    return inheritedValue;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/CreateAccessChange.java b/java/com/google/gerrit/server/restapi/project/CreateAccessChange.java
new file mode 100644
index 0000000..feb37c0
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/CreateAccessChange.java
@@ -0,0 +1,186 @@
+// Copyright (C) 2017 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.google.gerrit.server.restapi.project;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.errors.InvalidNameException;
+import com.google.gerrit.extensions.api.access.ProjectAccessInput;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.Sequences;
+import com.google.gerrit.server.change.ChangeInserter;
+import com.google.gerrit.server.change.ChangeJson;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.List;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+@Singleton
+public class CreateAccessChange implements RestModifyView<ProjectResource, ProjectAccessInput> {
+  private final PermissionBackend permissionBackend;
+  private final Sequences seq;
+  private final ChangeInserter.Factory changeInserterFactory;
+  private final BatchUpdate.Factory updateFactory;
+  private final Provider<MetaDataUpdate.User> metaDataUpdateFactory;
+  private final Provider<ReviewDb> db;
+  private final SetAccessUtil setAccess;
+  private final ChangeJson.Factory jsonFactory;
+  private final ProjectCache projectCache;
+
+  @Inject
+  CreateAccessChange(
+      PermissionBackend permissionBackend,
+      ChangeInserter.Factory changeInserterFactory,
+      BatchUpdate.Factory updateFactory,
+      Sequences seq,
+      Provider<MetaDataUpdate.User> metaDataUpdateFactory,
+      Provider<ReviewDb> db,
+      SetAccessUtil accessUtil,
+      ChangeJson.Factory jsonFactory,
+      ProjectCache projectCache) {
+    this.permissionBackend = permissionBackend;
+    this.seq = seq;
+    this.changeInserterFactory = changeInserterFactory;
+    this.updateFactory = updateFactory;
+    this.metaDataUpdateFactory = metaDataUpdateFactory;
+    this.db = db;
+    this.setAccess = accessUtil;
+    this.jsonFactory = jsonFactory;
+    this.projectCache = projectCache;
+  }
+
+  @Override
+  public Response<ChangeInfo> apply(ProjectResource rsrc, ProjectAccessInput input)
+      throws PermissionBackendException, AuthException, IOException, ConfigInvalidException,
+          OrmException, InvalidNameException, UpdateException, RestApiException {
+    PermissionBackend.ForProject forProject =
+        permissionBackend.user(rsrc.getUser()).project(rsrc.getNameKey());
+    if (!check(forProject, ProjectPermission.READ_CONFIG)) {
+      throw new AuthException(RefNames.REFS_CONFIG + " not visible");
+    }
+    if (!check(forProject, ProjectPermission.WRITE_CONFIG)) {
+      try {
+        forProject.ref(RefNames.REFS_CONFIG).check(RefPermission.CREATE_CHANGE);
+      } catch (AuthException denied) {
+        throw new AuthException("cannot create change for " + RefNames.REFS_CONFIG);
+      }
+    }
+    projectCache.checkedGet(rsrc.getNameKey()).checkStatePermitsWrite();
+
+    MetaDataUpdate.User metaDataUpdateUser = metaDataUpdateFactory.get();
+    List<AccessSection> removals = setAccess.getAccessSections(input.remove);
+    List<AccessSection> additions = setAccess.getAccessSections(input.add);
+
+    Project.NameKey newParentProjectName =
+        input.parent == null ? null : new Project.NameKey(input.parent);
+
+    try (MetaDataUpdate md = metaDataUpdateUser.create(rsrc.getNameKey())) {
+      ProjectConfig config = ProjectConfig.read(md);
+      ObjectId oldCommit = config.getRevision();
+      String oldCommitSha1 = oldCommit == null ? null : oldCommit.getName();
+
+      setAccess.validateChanges(config, removals, additions);
+      setAccess.applyChanges(config, removals, additions);
+      try {
+        setAccess.setParentName(
+            rsrc.getUser().asIdentifiedUser(),
+            config,
+            rsrc.getNameKey(),
+            newParentProjectName,
+            false);
+      } catch (AuthException e) {
+        throw new IllegalStateException(e);
+      }
+
+      md.setMessage("Review access change");
+      md.setInsertChangeId(true);
+      Change.Id changeId = new Change.Id(seq.nextChangeId());
+
+      RevCommit commit =
+          config.commitToNewRef(
+              md, new PatchSet.Id(changeId, Change.INITIAL_PATCH_SET_ID).toRefName());
+
+      if (commit.name().equals(oldCommitSha1)) {
+        throw new BadRequestException("no change");
+      }
+
+      try (ObjectInserter objInserter = md.getRepository().newObjectInserter();
+          ObjectReader objReader = objInserter.newReader();
+          RevWalk rw = new RevWalk(objReader);
+          BatchUpdate bu =
+              updateFactory.create(db.get(), rsrc.getNameKey(), rsrc.getUser(), TimeUtil.nowTs())) {
+        bu.setRepository(md.getRepository(), rw, objInserter);
+        ChangeInserter ins = newInserter(changeId, commit);
+        bu.insertChange(ins);
+        bu.execute();
+        return Response.created(jsonFactory.noOptions().format(ins.getChange()));
+      }
+    } catch (InvalidNameException e) {
+      throw new BadRequestException(e.toString());
+    }
+  }
+
+  // ProjectConfig doesn't currently support fusing into a BatchUpdate.
+  @SuppressWarnings("deprecation")
+  private ChangeInserter newInserter(Change.Id changeId, RevCommit commit) {
+    return changeInserterFactory
+        .create(changeId, commit, RefNames.REFS_CONFIG)
+        .setMessage(
+            // Same message as in ReceiveCommits.CreateRequest.
+            ApprovalsUtil.renderMessageWithApprovals(1, ImmutableMap.of(), ImmutableMap.of()))
+        .setValidate(false)
+        .setUpdateRef(false);
+  }
+
+  private boolean check(PermissionBackend.ForProject perm, ProjectPermission p)
+      throws PermissionBackendException {
+    try {
+      perm.check(p);
+      return true;
+    } catch (AuthException denied) {
+      return false;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/CreateBranch.java b/java/com/google/gerrit/server/restapi/project/CreateBranch.java
new file mode 100644
index 0000000..62106e8
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/CreateBranch.java
@@ -0,0 +1,200 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.project;
+
+import static com.google.gerrit.reviewdb.client.RefNames.isConfigRef;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.projects.BranchInfo;
+import com.google.gerrit.extensions.api.projects.BranchInput;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestCollectionCreateView;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.gerrit.server.project.BranchResource;
+import com.google.gerrit.server.project.CreateRefControl;
+import com.google.gerrit.server.project.NoSuchProjectException;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.project.RefUtil;
+import com.google.gerrit.server.project.RefValidationHelper;
+import com.google.gerrit.server.util.MagicBranch;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.IncorrectObjectTypeException;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevObject;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.ReceiveCommand;
+
+@Singleton
+public class CreateBranch
+    implements RestCollectionCreateView<ProjectResource, BranchResource, BranchInput> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final Provider<IdentifiedUser> identifiedUser;
+  private final PermissionBackend permissionBackend;
+  private final GitRepositoryManager repoManager;
+  private final GitReferenceUpdated referenceUpdated;
+  private final RefValidationHelper refCreationValidator;
+  private final CreateRefControl createRefControl;
+
+  @Inject
+  CreateBranch(
+      Provider<IdentifiedUser> identifiedUser,
+      PermissionBackend permissionBackend,
+      GitRepositoryManager repoManager,
+      GitReferenceUpdated referenceUpdated,
+      RefValidationHelper.Factory refHelperFactory,
+      CreateRefControl createRefControl) {
+    this.identifiedUser = identifiedUser;
+    this.permissionBackend = permissionBackend;
+    this.repoManager = repoManager;
+    this.referenceUpdated = referenceUpdated;
+    this.refCreationValidator = refHelperFactory.create(ReceiveCommand.Type.CREATE);
+    this.createRefControl = createRefControl;
+  }
+
+  @Override
+  public BranchInfo apply(ProjectResource rsrc, IdString id, BranchInput input)
+      throws BadRequestException, AuthException, ResourceConflictException, IOException,
+          PermissionBackendException, NoSuchProjectException {
+    String ref = id.get();
+    if (input == null) {
+      input = new BranchInput();
+    }
+    if (input.ref != null && !ref.equals(input.ref)) {
+      throw new BadRequestException("ref must match URL");
+    }
+    if (input.revision == null) {
+      input.revision = Constants.HEAD;
+    }
+    while (ref.startsWith("/")) {
+      ref = ref.substring(1);
+    }
+    ref = RefNames.fullName(ref);
+    if (!Repository.isValidRefName(ref)) {
+      throw new BadRequestException("invalid branch name \"" + ref + "\"");
+    }
+    if (MagicBranch.isMagicBranch(ref)) {
+      throw new BadRequestException(
+          "not allowed to create branches under \""
+              + MagicBranch.getMagicRefNamePrefix(ref)
+              + "\"");
+    }
+
+    final Branch.NameKey name = new Branch.NameKey(rsrc.getNameKey(), ref);
+    try (Repository repo = repoManager.openRepository(rsrc.getNameKey())) {
+      ObjectId revid = RefUtil.parseBaseRevision(repo, rsrc.getNameKey(), input.revision);
+      RevWalk rw = RefUtil.verifyConnected(repo, revid);
+      RevObject object = rw.parseAny(revid);
+
+      if (ref.startsWith(Constants.R_HEADS)) {
+        // Ensure that what we start the branch from is a commit. If we
+        // were given a tag, deference to the commit instead.
+        //
+        try {
+          object = rw.parseCommit(object);
+        } catch (IncorrectObjectTypeException notCommit) {
+          throw new BadRequestException("\"" + input.revision + "\" not a commit");
+        }
+      }
+
+      createRefControl.checkCreateRef(identifiedUser, repo, name, object);
+
+      try {
+        final RefUpdate u = repo.updateRef(ref);
+        u.setExpectedOldObjectId(ObjectId.zeroId());
+        u.setNewObjectId(object.copy());
+        u.setRefLogIdent(identifiedUser.get().newRefLogIdent());
+        u.setRefLogMessage("created via REST from " + input.revision, false);
+        refCreationValidator.validateRefOperation(rsrc.getName(), identifiedUser.get(), u);
+        final RefUpdate.Result result = u.update(rw);
+        switch (result) {
+          case FAST_FORWARD:
+          case NEW:
+          case NO_CHANGE:
+            referenceUpdated.fire(
+                name.getParentKey(), u, ReceiveCommand.Type.CREATE, identifiedUser.get().state());
+            break;
+          case LOCK_FAILURE:
+            if (repo.getRefDatabase().exactRef(ref) != null) {
+              throw new ResourceConflictException("branch \"" + ref + "\" already exists");
+            }
+            String refPrefix = RefUtil.getRefPrefix(ref);
+            while (!Constants.R_HEADS.equals(refPrefix)) {
+              if (repo.getRefDatabase().exactRef(refPrefix) != null) {
+                throw new ResourceConflictException(
+                    "Cannot create branch \""
+                        + ref
+                        + "\" since it conflicts with branch \""
+                        + refPrefix
+                        + "\".");
+              }
+              refPrefix = RefUtil.getRefPrefix(refPrefix);
+            }
+            // fall through
+            // $FALL-THROUGH$
+          case FORCED:
+          case IO_FAILURE:
+          case NOT_ATTEMPTED:
+          case REJECTED:
+          case REJECTED_CURRENT_BRANCH:
+          case RENAMED:
+          case REJECTED_MISSING_OBJECT:
+          case REJECTED_OTHER_REASON:
+          default:
+            {
+              throw new IOException(result.name());
+            }
+        }
+
+        BranchInfo info = new BranchInfo();
+        info.ref = ref;
+        info.revision = revid.getName();
+
+        if (isConfigRef(name.get())) {
+          // Never allow to delete the meta config branch.
+          info.canDelete = null;
+        } else {
+          info.canDelete =
+              permissionBackend.currentUser().ref(name).testOrFalse(RefPermission.DELETE)
+                      && rsrc.getProjectState().statePermitsWrite()
+                  ? true
+                  : null;
+        }
+        return info;
+      } catch (IOException err) {
+        logger.atSevere().withCause(err).log("Cannot create branch \"%s\"", name);
+        throw err;
+      }
+    } catch (RefUtil.InvalidRevisionException e) {
+      throw new BadRequestException("invalid revision \"" + input.revision + "\"");
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/CreateDashboard.java b/java/com/google/gerrit/server/restapi/project/CreateDashboard.java
new file mode 100644
index 0000000..e8b6236
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/CreateDashboard.java
@@ -0,0 +1,58 @@
+// 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.
+
+package com.google.gerrit.server.restapi.project;
+
+import com.google.gerrit.extensions.api.projects.DashboardInfo;
+import com.google.gerrit.extensions.api.projects.SetDashboardInput;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestCollectionCreateView;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.DashboardResource;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.kohsuke.args4j.Option;
+
+@Singleton
+public class CreateDashboard
+    implements RestCollectionCreateView<ProjectResource, DashboardResource, SetDashboardInput> {
+  private final Provider<SetDefaultDashboard> setDefault;
+
+  @Option(name = "--inherited", usage = "set dashboard inherited by children")
+  private boolean inherited;
+
+  @Inject
+  CreateDashboard(Provider<SetDefaultDashboard> setDefault) {
+    this.setDefault = setDefault;
+  }
+
+  @Override
+  public Response<DashboardInfo> apply(ProjectResource parent, IdString id, SetDashboardInput input)
+      throws RestApiException, IOException, PermissionBackendException {
+    parent.getProjectState().checkStatePermitsWrite();
+    if (!DashboardsCollection.isDefaultDashboard(id)) {
+      throw new ResourceNotFoundException(id);
+    }
+    SetDefaultDashboard set = setDefault.get();
+    set.inherited = inherited;
+    return set.apply(
+        DashboardResource.projectDefault(parent.getProjectState(), parent.getUser()), input);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/CreateProject.java b/java/com/google/gerrit/server/restapi/project/CreateProject.java
new file mode 100644
index 0000000..b92fba8
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/CreateProject.java
@@ -0,0 +1,424 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.project;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.ProjectUtil;
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.common.data.PermissionRule;
+import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.extensions.api.projects.ConfigInput;
+import com.google.gerrit.extensions.api.projects.ProjectInput;
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.extensions.events.NewProjectCreatedListener;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestCollectionCreateView;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.ProjectOwnerGroupsProvider;
+import com.google.gerrit.server.config.RepositoryConfig;
+import com.google.gerrit.server.extensions.events.AbstractNoNotifyEvent;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.RepositoryCaseMismatchException;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.group.GroupResolver;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.plugincontext.PluginItemContext;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gerrit.server.project.CreateProjectArgs;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.server.project.ProjectJson;
+import com.google.gerrit.server.project.ProjectNameLockManager;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.validators.ProjectCreationValidationListener;
+import com.google.gerrit.server.validators.ValidationException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.locks.Lock;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.RefUpdate.Result;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.transport.ReceiveCommand;
+
+@RequiresCapability(GlobalCapability.CREATE_PROJECT)
+@Singleton
+public class CreateProject
+    implements RestCollectionCreateView<TopLevelResource, ProjectResource, ProjectInput> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final Provider<ProjectsCollection> projectsCollection;
+  private final Provider<GroupResolver> groupResolver;
+  private final PluginSetContext<ProjectCreationValidationListener>
+      projectCreationValidationListeners;
+  private final ProjectJson json;
+  private final GitRepositoryManager repoManager;
+  private final PluginSetContext<NewProjectCreatedListener> createdListeners;
+  private final ProjectCache projectCache;
+  private final GroupBackend groupBackend;
+  private final ProjectOwnerGroupsProvider.Factory projectOwnerGroups;
+  private final MetaDataUpdate.User metaDataUpdateFactory;
+  private final GitReferenceUpdated referenceUpdated;
+  private final RepositoryConfig repositoryCfg;
+  private final PersonIdent serverIdent;
+  private final Provider<IdentifiedUser> identifiedUser;
+  private final Provider<PutConfig> putConfig;
+  private final AllProjectsName allProjects;
+  private final AllUsersName allUsers;
+  private final PluginItemContext<ProjectNameLockManager> lockManager;
+
+  @Inject
+  CreateProject(
+      Provider<ProjectsCollection> projectsCollection,
+      Provider<GroupResolver> groupResolver,
+      ProjectJson json,
+      PluginSetContext<ProjectCreationValidationListener> projectCreationValidationListeners,
+      GitRepositoryManager repoManager,
+      PluginSetContext<NewProjectCreatedListener> createdListeners,
+      ProjectCache projectCache,
+      GroupBackend groupBackend,
+      ProjectOwnerGroupsProvider.Factory projectOwnerGroups,
+      MetaDataUpdate.User metaDataUpdateFactory,
+      GitReferenceUpdated referenceUpdated,
+      RepositoryConfig repositoryCfg,
+      @GerritPersonIdent PersonIdent serverIdent,
+      Provider<IdentifiedUser> identifiedUser,
+      Provider<PutConfig> putConfig,
+      AllProjectsName allProjects,
+      AllUsersName allUsers,
+      PluginItemContext<ProjectNameLockManager> lockManager) {
+    this.projectsCollection = projectsCollection;
+    this.groupResolver = groupResolver;
+    this.projectCreationValidationListeners = projectCreationValidationListeners;
+    this.json = json;
+    this.repoManager = repoManager;
+    this.createdListeners = createdListeners;
+    this.projectCache = projectCache;
+    this.groupBackend = groupBackend;
+    this.projectOwnerGroups = projectOwnerGroups;
+    this.metaDataUpdateFactory = metaDataUpdateFactory;
+    this.referenceUpdated = referenceUpdated;
+    this.repositoryCfg = repositoryCfg;
+    this.serverIdent = serverIdent;
+    this.identifiedUser = identifiedUser;
+    this.putConfig = putConfig;
+    this.allProjects = allProjects;
+    this.allUsers = allUsers;
+    this.lockManager = lockManager;
+  }
+
+  @Override
+  public Response<ProjectInfo> apply(TopLevelResource resource, IdString id, ProjectInput input)
+      throws RestApiException, IOException, ConfigInvalidException, PermissionBackendException {
+    String name = id.get();
+    if (input == null) {
+      input = new ProjectInput();
+    }
+    if (input.name != null && !name.equals(input.name)) {
+      throw new BadRequestException("name must match URL");
+    }
+
+    CreateProjectArgs args = new CreateProjectArgs();
+    args.setProjectName(ProjectUtil.sanitizeProjectName(name));
+
+    String parentName =
+        MoreObjects.firstNonNull(Strings.emptyToNull(input.parent), allProjects.get());
+    args.newParent = projectsCollection.get().parse(parentName, false).getNameKey();
+    if (args.newParent.equals(allUsers)) {
+      throw new ResourceConflictException(
+          String.format("Cannot inherit from '%s' project", allUsers.get()));
+    }
+    args.createEmptyCommit = input.createEmptyCommit;
+    args.permissionsOnly = input.permissionsOnly;
+    args.projectDescription = Strings.emptyToNull(input.description);
+    args.submitType = input.submitType;
+    args.branch = normalizeBranchNames(input.branches);
+    if (input.owners == null || input.owners.isEmpty()) {
+      args.ownerIds = new ArrayList<>(projectOwnerGroups.create(args.getProject()).get());
+    } else {
+      args.ownerIds = Lists.newArrayListWithCapacity(input.owners.size());
+      for (String owner : input.owners) {
+        args.ownerIds.add(groupResolver.get().parse(owner).getGroupUUID());
+      }
+    }
+    args.contributorAgreements =
+        MoreObjects.firstNonNull(input.useContributorAgreements, InheritableBoolean.INHERIT);
+    args.signedOffBy = MoreObjects.firstNonNull(input.useSignedOffBy, InheritableBoolean.INHERIT);
+    args.contentMerge =
+        input.submitType == SubmitType.FAST_FORWARD_ONLY
+            ? InheritableBoolean.FALSE
+            : MoreObjects.firstNonNull(input.useContentMerge, InheritableBoolean.INHERIT);
+    args.newChangeForAllNotInTarget =
+        MoreObjects.firstNonNull(
+            input.createNewChangeForAllNotInTarget, InheritableBoolean.INHERIT);
+    args.changeIdRequired =
+        MoreObjects.firstNonNull(input.requireChangeId, InheritableBoolean.INHERIT);
+    args.rejectEmptyCommit =
+        MoreObjects.firstNonNull(input.rejectEmptyCommit, InheritableBoolean.INHERIT);
+    args.enableSignedPush =
+        MoreObjects.firstNonNull(input.enableSignedPush, InheritableBoolean.INHERIT);
+    args.requireSignedPush =
+        MoreObjects.firstNonNull(input.requireSignedPush, InheritableBoolean.INHERIT);
+    try {
+      args.maxObjectSizeLimit = ProjectConfig.validMaxObjectSizeLimit(input.maxObjectSizeLimit);
+    } catch (ConfigInvalidException e) {
+      throw new BadRequestException(e.getMessage());
+    }
+
+    Lock nameLock = lockManager.call(lockManager -> lockManager.getLock(args.getProject()));
+    nameLock.lock();
+    try {
+      try {
+        projectCreationValidationListeners.runEach(
+            l -> l.validateNewProject(args), ValidationException.class);
+      } catch (ValidationException e) {
+        throw new ResourceConflictException(e.getMessage(), e);
+      }
+
+      ProjectState projectState = createProject(args);
+      requireNonNull(
+          projectState,
+          () -> String.format("failed to create project %s", args.getProject().get()));
+
+      if (input.pluginConfigValues != null) {
+        ConfigInput in = new ConfigInput();
+        in.pluginConfigValues = input.pluginConfigValues;
+        putConfig.get().apply(projectState, in);
+      }
+      return Response.created(json.format(projectState));
+    } finally {
+      nameLock.unlock();
+    }
+  }
+
+  private ProjectState createProject(CreateProjectArgs args)
+      throws BadRequestException, ResourceConflictException, IOException, ConfigInvalidException {
+    final Project.NameKey nameKey = args.getProject();
+    try {
+      final String head = args.permissionsOnly ? RefNames.REFS_CONFIG : args.branch.get(0);
+      try (Repository repo = repoManager.openRepository(nameKey)) {
+        if (repo.getObjectDatabase().exists()) {
+          throw new ResourceConflictException("project \"" + nameKey + "\" exists");
+        }
+      } catch (RepositoryNotFoundException e) {
+        // It does not exist, safe to ignore.
+      }
+      try (Repository repo = repoManager.createRepository(nameKey)) {
+        RefUpdate u = repo.updateRef(Constants.HEAD);
+        u.disableRefLog();
+        u.link(head);
+
+        createProjectConfig(args);
+
+        if (!args.permissionsOnly && args.createEmptyCommit) {
+          createEmptyCommits(repo, nameKey, args.branch);
+        }
+
+        fire(nameKey, head);
+
+        return projectCache.get(nameKey);
+      }
+    } catch (RepositoryCaseMismatchException e) {
+      throw new ResourceConflictException(
+          "Cannot create "
+              + nameKey.get()
+              + " because the name is already occupied by another project."
+              + " The other project has the same name, only spelled in a"
+              + " different case.");
+    } catch (RepositoryNotFoundException badName) {
+      throw new BadRequestException("invalid project name: " + nameKey);
+    } catch (ConfigInvalidException e) {
+      String msg = "Cannot create " + nameKey;
+      logger.atSevere().withCause(e).log(msg);
+      throw e;
+    }
+  }
+
+  private void createProjectConfig(CreateProjectArgs args)
+      throws IOException, ConfigInvalidException {
+    try (MetaDataUpdate md = metaDataUpdateFactory.create(args.getProject())) {
+      ProjectConfig config = ProjectConfig.read(md);
+
+      Project newProject = config.getProject();
+      newProject.setDescription(args.projectDescription);
+      newProject.setSubmitType(
+          MoreObjects.firstNonNull(
+              args.submitType, repositoryCfg.getDefaultSubmitType(args.getProject())));
+      newProject.setBooleanConfig(
+          BooleanProjectConfig.USE_CONTRIBUTOR_AGREEMENTS, args.contributorAgreements);
+      newProject.setBooleanConfig(BooleanProjectConfig.USE_SIGNED_OFF_BY, args.signedOffBy);
+      newProject.setBooleanConfig(BooleanProjectConfig.USE_CONTENT_MERGE, args.contentMerge);
+      newProject.setBooleanConfig(
+          BooleanProjectConfig.CREATE_NEW_CHANGE_FOR_ALL_NOT_IN_TARGET,
+          args.newChangeForAllNotInTarget);
+      newProject.setBooleanConfig(BooleanProjectConfig.REQUIRE_CHANGE_ID, args.changeIdRequired);
+      newProject.setBooleanConfig(BooleanProjectConfig.REJECT_EMPTY_COMMIT, args.rejectEmptyCommit);
+      newProject.setMaxObjectSizeLimit(args.maxObjectSizeLimit);
+      newProject.setBooleanConfig(BooleanProjectConfig.ENABLE_SIGNED_PUSH, args.enableSignedPush);
+      newProject.setBooleanConfig(BooleanProjectConfig.REQUIRE_SIGNED_PUSH, args.requireSignedPush);
+      if (args.newParent != null) {
+        newProject.setParentName(args.newParent);
+      }
+
+      if (!args.ownerIds.isEmpty()) {
+        AccessSection all = config.getAccessSection(AccessSection.ALL, true);
+        for (AccountGroup.UUID ownerId : args.ownerIds) {
+          GroupDescription.Basic g = groupBackend.get(ownerId);
+          if (g != null) {
+            GroupReference group = config.resolve(GroupReference.forGroup(g));
+            all.getPermission(Permission.OWNER, true).add(new PermissionRule(group));
+          }
+        }
+      }
+
+      md.setMessage("Created project\n");
+      config.commit(md);
+      md.getRepository().setGitwebDescription(args.projectDescription);
+    }
+    projectCache.onCreateProject(args.getProject());
+  }
+
+  private List<String> normalizeBranchNames(List<String> branches) throws BadRequestException {
+    if (branches == null || branches.isEmpty()) {
+      return Collections.singletonList(Constants.R_HEADS + Constants.MASTER);
+    }
+
+    List<String> normalizedBranches = new ArrayList<>();
+    for (String branch : branches) {
+      while (branch.startsWith("/")) {
+        branch = branch.substring(1);
+      }
+      branch = RefNames.fullName(branch);
+      if (!Repository.isValidRefName(branch)) {
+        throw new BadRequestException(String.format("Branch \"%s\" is not a valid name.", branch));
+      }
+      if (!normalizedBranches.contains(branch)) {
+        normalizedBranches.add(branch);
+      }
+    }
+    return normalizedBranches;
+  }
+
+  private void createEmptyCommits(Repository repo, Project.NameKey project, List<String> refs)
+      throws IOException {
+    try (ObjectInserter oi = repo.newObjectInserter()) {
+      CommitBuilder cb = new CommitBuilder();
+      cb.setTreeId(oi.insert(Constants.OBJ_TREE, new byte[] {}));
+      cb.setAuthor(metaDataUpdateFactory.getUserPersonIdent());
+      cb.setCommitter(serverIdent);
+      cb.setMessage("Initial empty repository\n");
+
+      ObjectId id = oi.insert(cb);
+      oi.flush();
+
+      for (String ref : refs) {
+        RefUpdate ru = repo.updateRef(ref);
+        ru.setNewObjectId(id);
+        Result result = ru.update();
+        switch (result) {
+          case NEW:
+            referenceUpdated.fire(
+                project, ru, ReceiveCommand.Type.CREATE, identifiedUser.get().state());
+            break;
+          case FAST_FORWARD:
+          case FORCED:
+          case IO_FAILURE:
+          case LOCK_FAILURE:
+          case NOT_ATTEMPTED:
+          case NO_CHANGE:
+          case REJECTED:
+          case REJECTED_CURRENT_BRANCH:
+          case RENAMED:
+          case REJECTED_MISSING_OBJECT:
+          case REJECTED_OTHER_REASON:
+          default:
+            {
+              throw new IOException(
+                  String.format("Failed to create ref \"%s\": %s", ref, result.name()));
+            }
+        }
+      }
+    } catch (IOException e) {
+      logger.atSevere().withCause(e).log("Cannot create empty commit for %s", project.get());
+      throw e;
+    }
+  }
+
+  private void fire(Project.NameKey name, String head) {
+    if (createdListeners.isEmpty()) {
+      return;
+    }
+
+    Event event = new Event(name, head);
+    createdListeners.runEach(l -> l.onNewProjectCreated(event));
+  }
+
+  static class Event extends AbstractNoNotifyEvent implements NewProjectCreatedListener.Event {
+    private final Project.NameKey name;
+    private final String head;
+
+    Event(Project.NameKey name, String head) {
+      this.name = name;
+      this.head = head;
+    }
+
+    @Override
+    public String getProjectName() {
+      return name.get();
+    }
+
+    @Override
+    public String getHeadName() {
+      return head;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/CreateTag.java b/java/com/google/gerrit/server/restapi/project/CreateTag.java
new file mode 100644
index 0000000..e72deaf
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/CreateTag.java
@@ -0,0 +1,163 @@
+// 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.
+
+package com.google.gerrit.server.restapi.project;
+
+import static org.eclipse.jgit.lib.Constants.R_TAGS;
+
+import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.projects.TagInfo;
+import com.google.gerrit.extensions.api.projects.TagInput;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestCollectionCreateView;
+import com.google.gerrit.server.WebLinks;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.TagCache;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.gerrit.server.project.NoSuchProjectException;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.project.RefUtil;
+import com.google.gerrit.server.project.RefUtil.InvalidRevisionException;
+import com.google.gerrit.server.project.TagResource;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.TimeZone;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.api.TagCommand;
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevObject;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+@Singleton
+public class CreateTag implements RestCollectionCreateView<ProjectResource, TagResource, TagInput> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+  private final PermissionBackend permissionBackend;
+  private final GitRepositoryManager repoManager;
+  private final TagCache tagCache;
+  private final GitReferenceUpdated referenceUpdated;
+  private final WebLinks links;
+
+  @Inject
+  CreateTag(
+      PermissionBackend permissionBackend,
+      GitRepositoryManager repoManager,
+      TagCache tagCache,
+      GitReferenceUpdated referenceUpdated,
+      WebLinks webLinks) {
+    this.permissionBackend = permissionBackend;
+    this.repoManager = repoManager;
+    this.tagCache = tagCache;
+    this.referenceUpdated = referenceUpdated;
+    this.links = webLinks;
+  }
+
+  @Override
+  public TagInfo apply(ProjectResource resource, IdString id, TagInput input)
+      throws RestApiException, IOException, PermissionBackendException, NoSuchProjectException {
+    String ref = id.get();
+    if (input == null) {
+      input = new TagInput();
+    }
+    if (input.ref != null && !ref.equals(input.ref)) {
+      throw new BadRequestException("ref must match URL");
+    }
+    if (input.revision == null) {
+      input.revision = Constants.HEAD;
+    }
+
+    ref = RefUtil.normalizeTagRef(ref);
+    PermissionBackend.ForRef perm =
+        permissionBackend.currentUser().project(resource.getNameKey()).ref(ref);
+
+    try (Repository repo = repoManager.openRepository(resource.getNameKey())) {
+      ObjectId revid = RefUtil.parseBaseRevision(repo, resource.getNameKey(), input.revision);
+      RevWalk rw = RefUtil.verifyConnected(repo, revid);
+      RevObject object = rw.parseAny(revid);
+      rw.reset();
+      boolean isAnnotated = Strings.emptyToNull(input.message) != null;
+      boolean isSigned = isAnnotated && input.message.contains("-----BEGIN PGP SIGNATURE-----\n");
+      if (isSigned) {
+        throw new MethodNotAllowedException("Cannot create signed tag \"" + ref + "\"");
+      } else if (isAnnotated && !check(perm, RefPermission.CREATE_TAG)) {
+        throw new AuthException("Cannot create annotated tag \"" + ref + "\"");
+      } else {
+        perm.check(RefPermission.CREATE);
+      }
+      if (repo.getRefDatabase().exactRef(ref) != null) {
+        throw new ResourceConflictException("tag \"" + ref + "\" already exists");
+      }
+
+      try (Git git = new Git(repo)) {
+        TagCommand tag =
+            git.tag()
+                .setObjectId(object)
+                .setName(ref.substring(R_TAGS.length()))
+                .setAnnotated(isAnnotated)
+                .setSigned(isSigned);
+
+        if (isAnnotated) {
+          tag.setMessage(input.message)
+              .setTagger(
+                  resource
+                      .getUser()
+                      .asIdentifiedUser()
+                      .newCommitterIdent(TimeUtil.nowTs(), TimeZone.getDefault()));
+        }
+
+        Ref result = tag.call();
+        tagCache.updateFastForward(
+            resource.getNameKey(), ref, ObjectId.zeroId(), result.getObjectId());
+        referenceUpdated.fire(
+            resource.getNameKey(),
+            ref,
+            ObjectId.zeroId(),
+            result.getObjectId(),
+            resource.getUser().asIdentifiedUser().state());
+        try (RevWalk w = new RevWalk(repo)) {
+          return ListTags.createTagInfo(perm, result, w, resource.getProjectState(), links);
+        }
+      }
+    } catch (InvalidRevisionException e) {
+      throw new BadRequestException("Invalid base revision");
+    } catch (GitAPIException e) {
+      logger.atSevere().withCause(e).log("Cannot create tag \"%s\"", ref);
+      throw new IOException(e);
+    }
+  }
+
+  private static boolean check(PermissionBackend.ForRef perm, RefPermission permission)
+      throws PermissionBackendException {
+    try {
+      perm.check(permission);
+      return true;
+    } catch (AuthException e) {
+      return false;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/DashboardsCollection.java b/java/com/google/gerrit/server/restapi/project/DashboardsCollection.java
new file mode 100644
index 0000000..07691e7
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/DashboardsCollection.java
@@ -0,0 +1,241 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.project;
+
+import static com.google.gerrit.reviewdb.client.RefNames.REFS_DASHBOARDS;
+
+import com.google.common.base.Joiner;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Splitter;
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.api.projects.DashboardInfo;
+import com.google.gerrit.extensions.api.projects.DashboardSectionInfo;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ChildCollection;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.extensions.restapi.Url;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.UrlEncoded;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.gerrit.server.project.DashboardResource;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.List;
+import org.eclipse.jgit.errors.AmbiguousObjectException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.IncorrectObjectTypeException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.BlobBasedConfig;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+
+@Singleton
+public class DashboardsCollection implements ChildCollection<ProjectResource, DashboardResource> {
+  public static final String DEFAULT_DASHBOARD_NAME = "default";
+
+  private final GitRepositoryManager gitManager;
+  private final DynamicMap<RestView<DashboardResource>> views;
+  private final Provider<ListDashboards> list;
+  private final PermissionBackend permissionBackend;
+
+  @Inject
+  DashboardsCollection(
+      GitRepositoryManager gitManager,
+      DynamicMap<RestView<DashboardResource>> views,
+      Provider<ListDashboards> list,
+      PermissionBackend permissionBackend) {
+    this.gitManager = gitManager;
+    this.views = views;
+    this.list = list;
+    this.permissionBackend = permissionBackend;
+  }
+
+  public static boolean isDefaultDashboard(@Nullable String id) {
+    return DEFAULT_DASHBOARD_NAME.equals(id);
+  }
+
+  public static boolean isDefaultDashboard(@Nullable IdString id) {
+    return id != null && isDefaultDashboard(id.toString());
+  }
+
+  @Override
+  public RestView<ProjectResource> list() throws ResourceNotFoundException {
+    return list.get();
+  }
+
+  @Override
+  public DashboardResource parse(ProjectResource parent, IdString id)
+      throws RestApiException, IOException, ConfigInvalidException, PermissionBackendException {
+    parent.getProjectState().checkStatePermitsRead();
+    if (isDefaultDashboard(id)) {
+      return DashboardResource.projectDefault(parent.getProjectState(), parent.getUser());
+    }
+
+    DashboardInfo info;
+    try {
+      info = newDashboardInfo(id.get());
+    } catch (InvalidDashboardId e) {
+      throw new ResourceNotFoundException(id);
+    }
+
+    for (ProjectState ps : parent.getProjectState().tree()) {
+      try {
+        return parse(ps, parent.getProjectState(), parent.getUser(), info);
+      } catch (AmbiguousObjectException | ConfigInvalidException | IncorrectObjectTypeException e) {
+        throw new ResourceNotFoundException(id);
+      } catch (ResourceNotFoundException e) {
+        continue;
+      }
+    }
+    throw new ResourceNotFoundException(id);
+  }
+
+  public static String normalizeDashboardRef(String ref) {
+    if (!ref.startsWith(REFS_DASHBOARDS)) {
+      return REFS_DASHBOARDS + ref;
+    }
+    return ref;
+  }
+
+  private DashboardResource parse(
+      ProjectState parent, ProjectState current, CurrentUser user, DashboardInfo info)
+      throws ResourceNotFoundException, IOException, AmbiguousObjectException,
+          IncorrectObjectTypeException, ConfigInvalidException, PermissionBackendException,
+          ResourceConflictException {
+    String ref = normalizeDashboardRef(info.ref);
+    try {
+      permissionBackend.user(user).project(parent.getNameKey()).ref(ref).check(RefPermission.READ);
+    } catch (AuthException e) {
+      // Don't leak the project's existence
+      throw new ResourceNotFoundException(info.id);
+    }
+    if (!Repository.isValidRefName(ref)) {
+      throw new ResourceNotFoundException(info.id);
+    }
+
+    current.checkStatePermitsRead();
+
+    try (Repository git = gitManager.openRepository(parent.getNameKey())) {
+      ObjectId objId = git.resolve(ref + ":" + info.path);
+      if (objId == null) {
+        throw new ResourceNotFoundException(info.id);
+      }
+      BlobBasedConfig cfg = new BlobBasedConfig(null, git, objId);
+      return new DashboardResource(current, user, ref, info.path, cfg, false);
+    } catch (RepositoryNotFoundException e) {
+      throw new ResourceNotFoundException(info.id);
+    }
+  }
+
+  @Override
+  public DynamicMap<RestView<DashboardResource>> views() {
+    return views;
+  }
+
+  public static DashboardInfo newDashboardInfo(String ref, String path) {
+    DashboardInfo info = new DashboardInfo();
+    info.ref = ref;
+    info.path = path;
+    info.id = Joiner.on(':').join(Url.encode(ref), Url.encode(path));
+    return info;
+  }
+
+  public static class InvalidDashboardId extends Exception {
+    private static final long serialVersionUID = 1L;
+
+    public InvalidDashboardId(String id) {
+      super(id);
+    }
+  }
+
+  static DashboardInfo newDashboardInfo(String id) throws InvalidDashboardId {
+    DashboardInfo info = new DashboardInfo();
+    List<String> parts = Lists.newArrayList(Splitter.on(':').limit(2).split(id));
+    if (parts.size() != 2) {
+      throw new InvalidDashboardId(id);
+    }
+    info.id = id;
+    info.ref = parts.get(0);
+    info.path = parts.get(1);
+    return info;
+  }
+
+  static DashboardInfo parse(
+      Project definingProject,
+      String refName,
+      String path,
+      Config config,
+      String project,
+      boolean setDefault) {
+    DashboardInfo info = newDashboardInfo(refName, path);
+    info.project = project;
+    info.definingProject = definingProject.getName();
+    String title = config.getString("dashboard", null, "title");
+    info.title = replace(project, title == null ? info.path : title);
+    info.description = replace(project, config.getString("dashboard", null, "description"));
+    info.foreach = config.getString("dashboard", null, "foreach");
+
+    if (setDefault) {
+      String id = refName + ":" + path;
+      info.isDefault = id.equals(defaultOf(definingProject)) ? true : null;
+    }
+
+    UrlEncoded u = new UrlEncoded("/dashboard/");
+    u.put("title", MoreObjects.firstNonNull(info.title, info.path));
+    if (info.foreach != null) {
+      u.put("foreach", replace(project, info.foreach));
+    }
+    for (String name : config.getSubsections("section")) {
+      DashboardSectionInfo s = new DashboardSectionInfo();
+      s.name = name;
+      s.query = config.getString("section", name, "query");
+      u.put(s.name, replace(project, s.query));
+      info.sections.add(s);
+    }
+    info.url = u.toString().replace("%3A", ":");
+
+    return info;
+  }
+
+  private static String replace(String project, String input) {
+    return input == null ? input : input.replace("${project}", project);
+  }
+
+  private static String defaultOf(Project proj) {
+    final String defaultId =
+        MoreObjects.firstNonNull(
+            proj.getLocalDefaultDashboard(), Strings.nullToEmpty(proj.getDefaultDashboard()));
+    if (defaultId.startsWith(REFS_DASHBOARDS)) {
+      return defaultId.substring(REFS_DASHBOARDS.length());
+    }
+    return defaultId;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/DeleteBranch.java b/java/com/google/gerrit/server/restapi/project/DeleteBranch.java
new file mode 100644
index 0000000..0134ce3
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/DeleteBranch.java
@@ -0,0 +1,63 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.project;
+
+import static com.google.gerrit.reviewdb.client.RefNames.isConfigRef;
+import static org.eclipse.jgit.lib.Constants.R_HEADS;
+
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.BranchResource;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+
+@Singleton
+public class DeleteBranch implements RestModifyView<BranchResource, Input> {
+
+  private final Provider<InternalChangeQuery> queryProvider;
+  private final DeleteRef deleteRef;
+
+  @Inject
+  DeleteBranch(Provider<InternalChangeQuery> queryProvider, DeleteRef deleteRef) {
+    this.queryProvider = queryProvider;
+    this.deleteRef = deleteRef;
+  }
+
+  @Override
+  public Response<?> apply(BranchResource rsrc, Input input)
+      throws RestApiException, OrmException, IOException, PermissionBackendException {
+    if (isConfigRef(rsrc.getBranchKey().get())) {
+      // Never allow to delete the meta config branch.
+      throw new MethodNotAllowedException(
+          "not allowed to delete branch " + rsrc.getBranchKey().get());
+    }
+
+    if (!queryProvider.get().setLimit(1).byBranchOpen(rsrc.getBranchKey()).isEmpty()) {
+      throw new ResourceConflictException("branch " + rsrc.getBranchKey() + " has open changes");
+    }
+
+    deleteRef.deleteSingleRef(rsrc.getProjectState(), rsrc.getRef(), R_HEADS);
+    return Response.none();
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/DeleteBranches.java b/java/com/google/gerrit/server/restapi/project/DeleteBranches.java
new file mode 100644
index 0000000..6e60193
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/DeleteBranches.java
@@ -0,0 +1,51 @@
+// Copyright (C) 2015 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.google.gerrit.server.restapi.project;
+
+import static org.eclipse.jgit.lib.Constants.R_HEADS;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.extensions.api.projects.DeleteBranchesInput;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+
+@Singleton
+public class DeleteBranches implements RestModifyView<ProjectResource, DeleteBranchesInput> {
+  private final DeleteRef deleteRef;
+
+  @Inject
+  DeleteBranches(DeleteRef deleteRef) {
+    this.deleteRef = deleteRef;
+  }
+
+  @Override
+  public Response<?> apply(ProjectResource project, DeleteBranchesInput input)
+      throws OrmException, IOException, RestApiException, PermissionBackendException {
+    if (input == null || input.branches == null || input.branches.isEmpty()) {
+      throw new BadRequestException("branches must be specified");
+    }
+    deleteRef.deleteMultipleRefs(
+        project.getProjectState(), ImmutableSet.copyOf(input.branches), R_HEADS);
+    return Response.none();
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/DeleteDashboard.java b/java/com/google/gerrit/server/restapi/project/DeleteDashboard.java
new file mode 100644
index 0000000..2702d58
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/DeleteDashboard.java
@@ -0,0 +1,51 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.project;
+
+import com.google.gerrit.extensions.api.projects.DashboardInfo;
+import com.google.gerrit.extensions.api.projects.SetDashboardInput;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.DashboardResource;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+
+@Singleton
+public class DeleteDashboard implements RestModifyView<DashboardResource, SetDashboardInput> {
+  private final Provider<SetDefaultDashboard> defaultSetter;
+
+  @Inject
+  DeleteDashboard(Provider<SetDefaultDashboard> defaultSetter) {
+    this.defaultSetter = defaultSetter;
+  }
+
+  @Override
+  public Response<DashboardInfo> apply(DashboardResource resource, SetDashboardInput input)
+      throws RestApiException, IOException, PermissionBackendException {
+    if (resource.isProjectDefault()) {
+      SetDashboardInput in = new SetDashboardInput();
+      in.commitMessage = input != null ? input.commitMessage : null;
+      return defaultSetter.get().apply(resource, in);
+    }
+
+    // TODO: Implement delete of dashboards by API.
+    throw new MethodNotAllowedException();
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/DeleteRef.java b/java/com/google/gerrit/server/restapi/project/DeleteRef.java
new file mode 100644
index 0000000..5df102c
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/DeleteRef.java
@@ -0,0 +1,308 @@
+// 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.
+
+package com.google.gerrit.server.restapi.project;
+
+import static com.google.common.collect.ImmutableSet.toImmutableSet;
+import static com.google.gerrit.reviewdb.client.RefNames.isConfigRef;
+import static java.lang.String.format;
+import static org.eclipse.jgit.lib.Constants.R_REFS;
+import static org.eclipse.jgit.lib.Constants.R_TAGS;
+import static org.eclipse.jgit.transport.ReceiveCommand.Type.DELETE;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.project.RefValidationHelper;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.LockFailedException;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.NullProgressMonitor;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.ReceiveCommand;
+import org.eclipse.jgit.transport.ReceiveCommand.Result;
+
+@Singleton
+public class DeleteRef {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final int MAX_LOCK_FAILURE_CALLS = 10;
+  private static final long SLEEP_ON_LOCK_FAILURE_MS = 15;
+
+  private final Provider<IdentifiedUser> identifiedUser;
+  private final PermissionBackend permissionBackend;
+  private final GitRepositoryManager repoManager;
+  private final GitReferenceUpdated referenceUpdated;
+  private final RefValidationHelper refDeletionValidator;
+  private final Provider<InternalChangeQuery> queryProvider;
+
+  @Inject
+  DeleteRef(
+      Provider<IdentifiedUser> identifiedUser,
+      PermissionBackend permissionBackend,
+      GitRepositoryManager repoManager,
+      GitReferenceUpdated referenceUpdated,
+      RefValidationHelper.Factory refDeletionValidatorFactory,
+      Provider<InternalChangeQuery> queryProvider) {
+    this.identifiedUser = identifiedUser;
+    this.permissionBackend = permissionBackend;
+    this.repoManager = repoManager;
+    this.referenceUpdated = referenceUpdated;
+    this.refDeletionValidator = refDeletionValidatorFactory.create(DELETE);
+    this.queryProvider = queryProvider;
+  }
+
+  /**
+   * Deletes a single ref from the repository.
+   *
+   * @param projectState the {@code ProjectState} of the project containing the target ref.
+   * @param ref the ref to be deleted.
+   * @throws IOException
+   * @throws ResourceConflictException
+   */
+  public void deleteSingleRef(ProjectState projectState, String ref)
+      throws IOException, ResourceConflictException, AuthException, PermissionBackendException {
+    deleteSingleRef(projectState, ref, null);
+  }
+
+  /**
+   * Deletes a single ref from the repository.
+   *
+   * @param projectState the {@code ProjectState} of the project containing the target ref.
+   * @param ref the ref to be deleted.
+   * @param prefix the prefix of the ref.
+   * @throws IOException
+   * @throws ResourceConflictException
+   */
+  public void deleteSingleRef(ProjectState projectState, String ref, @Nullable String prefix)
+      throws IOException, ResourceConflictException, AuthException, PermissionBackendException {
+    if (prefix != null && !ref.startsWith(R_REFS)) {
+      ref = prefix + ref;
+    }
+
+    projectState.checkStatePermitsWrite();
+    permissionBackend
+        .currentUser()
+        .project(projectState.getNameKey())
+        .ref(ref)
+        .check(RefPermission.DELETE);
+
+    try (Repository repository = repoManager.openRepository(projectState.getNameKey())) {
+      RefUpdate.Result result;
+      RefUpdate u = repository.updateRef(ref);
+      u.setExpectedOldObjectId(repository.exactRef(ref).getObjectId());
+      u.setNewObjectId(ObjectId.zeroId());
+      u.setForceUpdate(true);
+      refDeletionValidator.validateRefOperation(projectState.getName(), identifiedUser.get(), u);
+      int remainingLockFailureCalls = MAX_LOCK_FAILURE_CALLS;
+      for (; ; ) {
+        try {
+          result = u.delete();
+        } catch (LockFailedException e) {
+          result = RefUpdate.Result.LOCK_FAILURE;
+        }
+        if (result == RefUpdate.Result.LOCK_FAILURE && --remainingLockFailureCalls > 0) {
+          try {
+            Thread.sleep(SLEEP_ON_LOCK_FAILURE_MS);
+          } catch (InterruptedException ie) {
+            // ignore
+          }
+        } else {
+          break;
+        }
+      }
+
+      switch (result) {
+        case NEW:
+        case NO_CHANGE:
+        case FAST_FORWARD:
+        case FORCED:
+          referenceUpdated.fire(
+              projectState.getNameKey(),
+              u,
+              ReceiveCommand.Type.DELETE,
+              identifiedUser.get().state());
+          break;
+
+        case REJECTED_CURRENT_BRANCH:
+          logger.atSevere().log("Cannot delete %s: %s", ref, result.name());
+          throw new ResourceConflictException("cannot delete current branch");
+
+        case IO_FAILURE:
+        case LOCK_FAILURE:
+        case NOT_ATTEMPTED:
+        case REJECTED:
+        case RENAMED:
+        case REJECTED_MISSING_OBJECT:
+        case REJECTED_OTHER_REASON:
+        default:
+          logger.atSevere().log("Cannot delete %s: %s", ref, result.name());
+          throw new ResourceConflictException("cannot delete: " + result.name());
+      }
+    }
+  }
+
+  /**
+   * Deletes a set of refs from the repository.
+   *
+   * @param projectState the {@code ProjectState} of the project whose refs are to be deleted.
+   * @param refsToDelete the refs to be deleted.
+   * @param prefix the prefix of the refs.
+   * @throws OrmException
+   * @throws IOException
+   * @throws ResourceConflictException
+   * @throws PermissionBackendException
+   */
+  public void deleteMultipleRefs(
+      ProjectState projectState, ImmutableSet<String> refsToDelete, String prefix)
+      throws OrmException, IOException, ResourceConflictException, PermissionBackendException,
+          AuthException {
+    if (refsToDelete.isEmpty()) {
+      return;
+    }
+
+    if (refsToDelete.size() == 1) {
+      deleteSingleRef(projectState, Iterables.getOnlyElement(refsToDelete), prefix);
+      return;
+    }
+
+    try (Repository repository = repoManager.openRepository(projectState.getNameKey())) {
+      BatchRefUpdate batchUpdate = repository.getRefDatabase().newBatchUpdate();
+      batchUpdate.setAtomic(false);
+      ImmutableSet<String> refs =
+          prefix == null
+              ? refsToDelete
+              : refsToDelete.stream()
+                  .map(ref -> ref.startsWith(R_REFS) ? ref : prefix + ref)
+                  .collect(toImmutableSet());
+      for (String ref : refs) {
+        batchUpdate.addCommand(createDeleteCommand(projectState, repository, ref));
+      }
+      try (RevWalk rw = new RevWalk(repository)) {
+        batchUpdate.execute(rw, NullProgressMonitor.INSTANCE);
+      }
+      StringBuilder errorMessages = new StringBuilder();
+      for (ReceiveCommand command : batchUpdate.getCommands()) {
+        if (command.getResult() == Result.OK) {
+          postDeletion(projectState.getNameKey(), command);
+        } else {
+          appendAndLogErrorMessage(errorMessages, command);
+        }
+      }
+      if (errorMessages.length() > 0) {
+        throw new ResourceConflictException(errorMessages.toString());
+      }
+    }
+  }
+
+  private ReceiveCommand createDeleteCommand(
+      ProjectState projectState, Repository r, String refName)
+      throws OrmException, IOException, ResourceConflictException, PermissionBackendException {
+    Ref ref = r.getRefDatabase().getRef(refName);
+    ReceiveCommand command;
+    if (ref == null) {
+      command = new ReceiveCommand(ObjectId.zeroId(), ObjectId.zeroId(), refName);
+      command.setResult(
+          Result.REJECTED_OTHER_REASON,
+          "it doesn't exist or you do not have permission to delete it");
+      return command;
+    }
+    command = new ReceiveCommand(ref.getObjectId(), ObjectId.zeroId(), ref.getName());
+
+    if (isConfigRef(refName)) {
+      // Never allow to delete the meta config branch.
+      command.setResult(Result.REJECTED_OTHER_REASON, "not allowed to delete branch " + refName);
+    } else {
+      try {
+        permissionBackend
+            .currentUser()
+            .project(projectState.getNameKey())
+            .ref(refName)
+            .check(RefPermission.DELETE);
+      } catch (AuthException denied) {
+        command.setResult(
+            Result.REJECTED_OTHER_REASON,
+            "it doesn't exist or you do not have permission to delete it");
+      }
+    }
+
+    if (!projectState.statePermitsWrite()) {
+      command.setResult(Result.REJECTED_OTHER_REASON, "project state does not permit write");
+    }
+
+    if (!refName.startsWith(R_TAGS)) {
+      Branch.NameKey branchKey = new Branch.NameKey(projectState.getNameKey(), ref.getName());
+      if (!queryProvider.get().setLimit(1).byBranchOpen(branchKey).isEmpty()) {
+        command.setResult(Result.REJECTED_OTHER_REASON, "it has open changes");
+      }
+    }
+
+    RefUpdate u = r.updateRef(refName);
+    u.setForceUpdate(true);
+    u.setExpectedOldObjectId(r.exactRef(refName).getObjectId());
+    u.setNewObjectId(ObjectId.zeroId());
+    refDeletionValidator.validateRefOperation(projectState.getName(), identifiedUser.get(), u);
+    return command;
+  }
+
+  private void appendAndLogErrorMessage(StringBuilder errorMessages, ReceiveCommand cmd) {
+    String msg;
+    switch (cmd.getResult()) {
+      case REJECTED_CURRENT_BRANCH:
+        msg = format("Cannot delete %s: it is the current branch", cmd.getRefName());
+        break;
+      case REJECTED_OTHER_REASON:
+        msg = format("Cannot delete %s: %s", cmd.getRefName(), cmd.getMessage());
+        break;
+      case LOCK_FAILURE:
+      case NOT_ATTEMPTED:
+      case OK:
+      case REJECTED_MISSING_OBJECT:
+      case REJECTED_NOCREATE:
+      case REJECTED_NODELETE:
+      case REJECTED_NONFASTFORWARD:
+      default:
+        msg = format("Cannot delete %s: %s", cmd.getRefName(), cmd.getResult());
+        break;
+    }
+    logger.atSevere().log(msg);
+    errorMessages.append(msg);
+    errorMessages.append("\n");
+  }
+
+  private void postDeletion(Project.NameKey project, ReceiveCommand cmd) {
+    referenceUpdated.fire(project, cmd, identifiedUser.get().state());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/DeleteTag.java b/java/com/google/gerrit/server/restapi/project/DeleteTag.java
new file mode 100644
index 0000000..f7cce11
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/DeleteTag.java
@@ -0,0 +1,55 @@
+// 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.
+
+package com.google.gerrit.server.restapi.project;
+
+import static com.google.gerrit.reviewdb.client.RefNames.isConfigRef;
+
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.RefUtil;
+import com.google.gerrit.server.project.TagResource;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+
+@Singleton
+public class DeleteTag implements RestModifyView<TagResource, Input> {
+
+  private final DeleteRef deleteRef;
+
+  @Inject
+  DeleteTag(DeleteRef deleteRef) {
+    this.deleteRef = deleteRef;
+  }
+
+  @Override
+  public Response<?> apply(TagResource resource, Input input)
+      throws OrmException, RestApiException, IOException, PermissionBackendException {
+    String tag = RefUtil.normalizeTagRef(resource.getTagInfo().ref);
+
+    if (isConfigRef(tag)) {
+      // Never allow to delete the meta config branch.
+      throw new MethodNotAllowedException("not allowed to delete " + tag);
+    }
+
+    deleteRef.deleteSingleRef(resource.getProjectState(), tag);
+    return Response.none();
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/DeleteTags.java b/java/com/google/gerrit/server/restapi/project/DeleteTags.java
new file mode 100644
index 0000000..bf2c524
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/DeleteTags.java
@@ -0,0 +1,51 @@
+// 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.
+
+package com.google.gerrit.server.restapi.project;
+
+import static org.eclipse.jgit.lib.Constants.R_TAGS;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.extensions.api.projects.DeleteTagsInput;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+
+@Singleton
+public class DeleteTags implements RestModifyView<ProjectResource, DeleteTagsInput> {
+  private final DeleteRef deleteRef;
+
+  @Inject
+  DeleteTags(DeleteRef deleteRef) {
+    this.deleteRef = deleteRef;
+  }
+
+  @Override
+  public Response<?> apply(ProjectResource project, DeleteTagsInput input)
+      throws OrmException, RestApiException, IOException, PermissionBackendException {
+    if (input == null || input.tags == null || input.tags.isEmpty()) {
+      throw new BadRequestException("tags must be specified");
+    }
+    deleteRef.deleteMultipleRefs(
+        project.getProjectState(), ImmutableSet.copyOf(input.tags), R_TAGS);
+    return Response.none();
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/FilesCollection.java b/java/com/google/gerrit/server/restapi/project/FilesCollection.java
new file mode 100644
index 0000000..888ecf2
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/FilesCollection.java
@@ -0,0 +1,57 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.project;
+
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.ChildCollection;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.project.BranchResource;
+import com.google.gerrit.server.project.FileResource;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.lib.ObjectId;
+
+@Singleton
+public class FilesCollection implements ChildCollection<BranchResource, FileResource> {
+  private final DynamicMap<RestView<FileResource>> views;
+  private final GitRepositoryManager repoManager;
+
+  @Inject
+  FilesCollection(DynamicMap<RestView<FileResource>> views, GitRepositoryManager repoManager) {
+    this.views = views;
+    this.repoManager = repoManager;
+  }
+
+  @Override
+  public RestView<BranchResource> list() throws ResourceNotFoundException {
+    throw new ResourceNotFoundException();
+  }
+
+  @Override
+  public FileResource parse(BranchResource parent, IdString id)
+      throws ResourceNotFoundException, IOException {
+    return FileResource.create(
+        repoManager, parent.getProjectState(), ObjectId.fromString(parent.getRevision()), id.get());
+  }
+
+  @Override
+  public DynamicMap<RestView<FileResource>> views() {
+    return views;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/FilesInCommitCollection.java b/java/com/google/gerrit/server/restapi/project/FilesInCommitCollection.java
new file mode 100644
index 0000000..09f973b
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/FilesInCommitCollection.java
@@ -0,0 +1,100 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.project;
+
+import com.google.gerrit.extensions.client.DiffPreferencesInfo;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.ChildCollection;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.server.change.FileInfoJson;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.patch.PatchListKey;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+import com.google.gerrit.server.project.CommitResource;
+import com.google.gerrit.server.project.FileResource;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.kohsuke.args4j.Option;
+
+@Singleton
+public class FilesInCommitCollection implements ChildCollection<CommitResource, FileResource> {
+  private final DynamicMap<RestView<FileResource>> views;
+  private final Provider<ListFiles> list;
+  private final GitRepositoryManager repoManager;
+
+  @Inject
+  FilesInCommitCollection(
+      DynamicMap<RestView<FileResource>> views,
+      Provider<ListFiles> list,
+      GitRepositoryManager repoManager) {
+    this.views = views;
+    this.list = list;
+    this.repoManager = repoManager;
+  }
+
+  @Override
+  public RestView<CommitResource> list() throws ResourceNotFoundException {
+    return list.get();
+  }
+
+  @Override
+  public FileResource parse(CommitResource parent, IdString id)
+      throws ResourceNotFoundException, IOException {
+    if (Patch.isMagic(id.get())) {
+      return new FileResource(parent.getProjectState(), parent.getCommit(), id.get());
+    }
+    return FileResource.create(repoManager, parent.getProjectState(), parent.getCommit(), id.get());
+  }
+
+  @Override
+  public DynamicMap<RestView<FileResource>> views() {
+    return views;
+  }
+
+  public static final class ListFiles implements RestReadView<CommitResource> {
+    @Option(name = "--parent", metaVar = "parent-number")
+    int parentNum;
+
+    private final FileInfoJson fileInfoJson;
+
+    @Inject
+    public ListFiles(FileInfoJson fileInfoJson) {
+      this.fileInfoJson = fileInfoJson;
+    }
+
+    @Override
+    public Object apply(CommitResource resource) throws PatchListNotAvailableException {
+      RevCommit commit = resource.getCommit();
+      PatchListKey key;
+
+      if (parentNum > 0) {
+        key =
+            PatchListKey.againstParentNum(
+                parentNum, commit, DiffPreferencesInfo.Whitespace.IGNORE_NONE);
+      } else {
+        key = PatchListKey.againstCommit(null, commit, DiffPreferencesInfo.Whitespace.IGNORE_NONE);
+      }
+
+      return fileInfoJson.toFileInfoMap(resource.getProjectState().getNameKey(), key);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/GarbageCollect.java b/java/com/google/gerrit/server/restapi/project/GarbageCollect.java
new file mode 100644
index 0000000..23115de
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/GarbageCollect.java
@@ -0,0 +1,176 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.project;
+
+import static com.google.common.base.Preconditions.checkState;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.gerrit.common.data.GarbageCollectionResult;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.extensions.restapi.BinaryResult;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.webui.UiAction;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.config.UrlFormatter;
+import com.google.gerrit.server.git.GarbageCollection;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.LocalDiskRepositoryManager;
+import com.google.gerrit.server.git.WorkQueue;
+import com.google.gerrit.server.ioutil.HexFormat;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.restapi.project.GarbageCollect.Input;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.util.Collections;
+import java.util.Optional;
+
+@RequiresCapability(GlobalCapability.RUN_GC)
+@Singleton
+public class GarbageCollect
+    implements RestModifyView<ProjectResource, Input>, UiAction<ProjectResource> {
+  public static class Input {
+    public boolean showProgress;
+    public boolean aggressive;
+    public boolean async;
+  }
+
+  private final boolean canGC;
+  private final GarbageCollection.Factory garbageCollectionFactory;
+  private final WorkQueue workQueue;
+  private final DynamicItem<UrlFormatter> urlFormatter;
+
+  @Inject
+  GarbageCollect(
+      GitRepositoryManager repoManager,
+      GarbageCollection.Factory garbageCollectionFactory,
+      WorkQueue workQueue,
+      DynamicItem<UrlFormatter> urlFormatter) {
+    this.workQueue = workQueue;
+    this.urlFormatter = urlFormatter;
+    this.canGC = repoManager instanceof LocalDiskRepositoryManager;
+    this.garbageCollectionFactory = garbageCollectionFactory;
+  }
+
+  @Override
+  public Object apply(ProjectResource rsrc, Input input) {
+    Project.NameKey project = rsrc.getNameKey();
+    if (input.async) {
+      return applyAsync(project, input);
+    }
+    return applySync(project, input);
+  }
+
+  private Response.Accepted applyAsync(Project.NameKey project, Input input) {
+    Runnable job =
+        new Runnable() {
+          @Override
+          public void run() {
+            runGC(project, input, null);
+          }
+
+          @Override
+          public String toString() {
+            return "Run "
+                + (input.aggressive ? "aggressive " : "")
+                + "garbage collection on project "
+                + project.get();
+          }
+        };
+
+    @SuppressWarnings("unchecked")
+    WorkQueue.Task<Void> task = (WorkQueue.Task<Void>) workQueue.getDefaultQueue().submit(job);
+
+    Optional<String> url =
+        urlFormatter
+            .get()
+            .getRestUrl("a/config/server/tasks/" + HexFormat.fromInt(task.getTaskId()));
+    // We're in a HTTP handler, so must be present.
+    checkState(url.isPresent());
+    return Response.accepted(url.get());
+  }
+
+  @SuppressWarnings("resource")
+  private BinaryResult applySync(Project.NameKey project, Input input) {
+    return new BinaryResult() {
+      @Override
+      public void writeTo(OutputStream out) throws IOException {
+        PrintWriter writer =
+            new PrintWriter(new OutputStreamWriter(out, UTF_8)) {
+              @Override
+              public void println() {
+                write('\n');
+              }
+            };
+        try {
+          PrintWriter progressWriter = input.showProgress ? writer : null;
+          GarbageCollectionResult result = runGC(project, input, progressWriter);
+          String msg = "Garbage collection completed successfully.";
+          if (result.hasErrors()) {
+            for (GarbageCollectionResult.Error e : result.getErrors()) {
+              switch (e.getType()) {
+                case REPOSITORY_NOT_FOUND:
+                  msg = "Error: project \"" + e.getProjectName() + "\" not found.";
+                  break;
+                case GC_ALREADY_SCHEDULED:
+                  msg =
+                      "Error: garbage collection for project \""
+                          + e.getProjectName()
+                          + "\" was already scheduled.";
+                  break;
+                case GC_FAILED:
+                  msg =
+                      "Error: garbage collection for project \""
+                          + e.getProjectName()
+                          + "\" failed.";
+                  break;
+                default:
+                  msg =
+                      "Error: garbage collection for project \""
+                          + e.getProjectName()
+                          + "\" failed: "
+                          + e.getType()
+                          + ".";
+              }
+            }
+          }
+          writer.println(msg);
+        } finally {
+          writer.flush();
+        }
+      }
+    }.setContentType("text/plain").setCharacterEncoding(UTF_8).disableGzip();
+  }
+
+  GarbageCollectionResult runGC(Project.NameKey project, Input input, PrintWriter progressWriter) {
+    return garbageCollectionFactory
+        .create()
+        .run(Collections.singletonList(project), input.aggressive, progressWriter);
+  }
+
+  @Override
+  public UiAction.Description getDescription(ProjectResource rsrc) {
+    return new UiAction.Description()
+        .setLabel("Run GC")
+        .setTitle("Triggers the Git Garbage Collection for this project.")
+        .setVisible(canGC);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/GetAccess.java b/java/com/google/gerrit/server/restapi/project/GetAccess.java
new file mode 100644
index 0000000..3f7d406
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/GetAccess.java
@@ -0,0 +1,351 @@
+// 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.
+
+package com.google.gerrit.server.restapi.project;
+
+import static com.google.gerrit.server.permissions.GlobalPermission.ADMINISTRATE_SERVER;
+import static com.google.gerrit.server.permissions.ProjectPermission.CREATE_REF;
+import static com.google.gerrit.server.permissions.ProjectPermission.CREATE_TAG_REF;
+import static com.google.gerrit.server.permissions.RefPermission.CREATE_CHANGE;
+import static com.google.gerrit.server.permissions.RefPermission.READ;
+import static com.google.gerrit.server.permissions.RefPermission.WRITE_CONFIG;
+import static java.util.stream.Collectors.toMap;
+
+import com.google.common.collect.ImmutableBiMap;
+import com.google.common.collect.Iterables;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.common.data.PermissionRule;
+import com.google.gerrit.common.data.RefConfigSection;
+import com.google.gerrit.common.data.WebLinkInfoCommon;
+import com.google.gerrit.extensions.api.access.AccessSectionInfo;
+import com.google.gerrit.extensions.api.access.PermissionInfo;
+import com.google.gerrit.extensions.api.access.PermissionRuleInfo;
+import com.google.gerrit.extensions.api.access.ProjectAccessInfo;
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.extensions.common.WebLinkInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.WebLinks;
+import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.server.project.ProjectJson;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+
+@Singleton
+public class GetAccess implements RestReadView<ProjectResource> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static final ImmutableBiMap<PermissionRule.Action, PermissionRuleInfo.Action> ACTION_TYPE =
+      ImmutableBiMap.of(
+          PermissionRule.Action.ALLOW,
+          PermissionRuleInfo.Action.ALLOW,
+          PermissionRule.Action.BATCH,
+          PermissionRuleInfo.Action.BATCH,
+          PermissionRule.Action.BLOCK,
+          PermissionRuleInfo.Action.BLOCK,
+          PermissionRule.Action.DENY,
+          PermissionRuleInfo.Action.DENY,
+          PermissionRule.Action.INTERACTIVE,
+          PermissionRuleInfo.Action.INTERACTIVE);
+
+  private final Provider<CurrentUser> user;
+  private final PermissionBackend permissionBackend;
+  private final AllProjectsName allProjectsName;
+  private final ProjectJson projectJson;
+  private final ProjectCache projectCache;
+  private final MetaDataUpdate.Server metaDataUpdateFactory;
+  private final GroupBackend groupBackend;
+  private final WebLinks webLinks;
+
+  @Inject
+  public GetAccess(
+      Provider<CurrentUser> self,
+      PermissionBackend permissionBackend,
+      AllProjectsName allProjectsName,
+      ProjectCache projectCache,
+      MetaDataUpdate.Server metaDataUpdateFactory,
+      ProjectJson projectJson,
+      GroupBackend groupBackend,
+      WebLinks webLinks) {
+    this.user = self;
+    this.permissionBackend = permissionBackend;
+    this.allProjectsName = allProjectsName;
+    this.projectJson = projectJson;
+    this.projectCache = projectCache;
+    this.metaDataUpdateFactory = metaDataUpdateFactory;
+    this.groupBackend = groupBackend;
+    this.webLinks = webLinks;
+  }
+
+  public ProjectAccessInfo apply(Project.NameKey nameKey)
+      throws ResourceNotFoundException, ResourceConflictException, IOException,
+          PermissionBackendException {
+    ProjectState state = projectCache.checkedGet(nameKey);
+    if (state == null) {
+      throw new ResourceNotFoundException(nameKey.get());
+    }
+    return apply(new ProjectResource(state, user.get()));
+  }
+
+  @Override
+  public ProjectAccessInfo apply(ProjectResource rsrc)
+      throws ResourceNotFoundException, ResourceConflictException, IOException,
+          PermissionBackendException {
+    // Load the current configuration from the repository, ensuring it's the most
+    // recent version available. If it differs from what was in the project
+    // state, force a cache flush now.
+
+    Project.NameKey projectName = rsrc.getNameKey();
+    ProjectAccessInfo info = new ProjectAccessInfo();
+    ProjectState projectState = projectCache.checkedGet(projectName);
+    PermissionBackend.ForProject perm = permissionBackend.currentUser().project(projectName);
+
+    ProjectConfig config;
+    try (MetaDataUpdate md = metaDataUpdateFactory.create(projectName)) {
+      config = ProjectConfig.read(md);
+      info.configWebLinks = new ArrayList<>();
+
+      // config may have a null revision if the repo doesn't have its own refs/meta/config.
+      if (config.getRevision() != null) {
+        // WebLinks operates in terms of the data types used in the GWT UI. Once the GWT UI is
+        // gone, WebLinks should be fixed to use the extension data types.
+        for (WebLinkInfoCommon wl :
+            webLinks.getFileHistoryLinks(
+                projectName.get(), config.getRevision().getName(), ProjectConfig.PROJECT_CONFIG)) {
+          info.configWebLinks.add(new WebLinkInfo(wl.name, wl.imageUrl, wl.url, wl.target));
+        }
+      }
+
+      if (config.updateGroupNames(groupBackend)) {
+        md.setMessage("Update group names\n");
+        config.commit(md);
+        projectCache.evict(config.getProject());
+        projectState = projectCache.checkedGet(projectName);
+        perm = permissionBackend.currentUser().project(projectName);
+      } else if (config.getRevision() != null
+          && !config.getRevision().equals(projectState.getConfig().getRevision())) {
+        projectCache.evict(config.getProject());
+        projectState = projectCache.checkedGet(projectName);
+        perm = permissionBackend.currentUser().project(projectName);
+      }
+    } catch (ConfigInvalidException e) {
+      throw new ResourceConflictException(e.getMessage());
+    } catch (RepositoryNotFoundException e) {
+      throw new ResourceNotFoundException(rsrc.getName());
+    }
+
+    // The following implementation must match the ProjectAccessFactory JSON RPC endpoint.
+
+    info.local = new HashMap<>();
+    info.ownerOf = new HashSet<>();
+    Map<AccountGroup.UUID, GroupInfo> groups = new HashMap<>();
+    boolean canReadConfig = check(perm, RefNames.REFS_CONFIG, READ);
+    boolean canWriteConfig = check(perm, ProjectPermission.WRITE_CONFIG);
+
+    // Check if the project state permits read only when the user is not allowed to write the config
+    // (=owner). This is so that the owner can still read (and in the next step write) the project's
+    // config to set the project state to any state that is not HIDDEN.
+    if (!canWriteConfig) {
+      projectState.checkStatePermitsRead();
+    }
+
+    for (AccessSection section : config.getAccessSections()) {
+      String name = section.getName();
+      if (AccessSection.GLOBAL_CAPABILITIES.equals(name)) {
+        if (canWriteConfig) {
+          info.local.put(name, createAccessSection(groups, section));
+          info.ownerOf.add(name);
+
+        } else if (canReadConfig) {
+          info.local.put(section.getName(), createAccessSection(groups, section));
+        }
+
+      } else if (RefConfigSection.isValid(name)) {
+        if (check(perm, name, WRITE_CONFIG)) {
+          info.local.put(name, createAccessSection(groups, section));
+          info.ownerOf.add(name);
+
+        } else if (canReadConfig) {
+          info.local.put(name, createAccessSection(groups, section));
+
+        } else if (check(perm, name, READ)) {
+          // Filter the section to only add rules describing groups that
+          // are visible to the current-user. This includes any group the
+          // user is a member of, as well as groups they own or that
+          // are visible to all users.
+
+          AccessSection dst = null;
+          for (Permission srcPerm : section.getPermissions()) {
+            Permission dstPerm = null;
+
+            for (PermissionRule srcRule : srcPerm.getRules()) {
+              AccountGroup.UUID groupId = srcRule.getGroup().getUUID();
+              if (groupId == null) {
+                continue;
+              }
+
+              loadGroup(groups, groupId);
+              if (dstPerm == null) {
+                if (dst == null) {
+                  dst = new AccessSection(name);
+                  info.local.put(name, createAccessSection(groups, dst));
+                }
+                dstPerm = dst.getPermission(srcPerm.getName(), true);
+              }
+              dstPerm.add(srcRule);
+            }
+          }
+        }
+      }
+    }
+
+    if (info.ownerOf.isEmpty()) {
+      try {
+        permissionBackend.currentUser().check(GlobalPermission.ADMINISTRATE_SERVER);
+        // Special case: If the section list is empty, this project has no current
+        // access control information. Fall back to site administrators.
+        info.ownerOf.add(AccessSection.ALL);
+      } catch (AuthException e) {
+        // Do nothing.
+      }
+    }
+
+    if (config.getRevision() != null) {
+      info.revision = config.getRevision().name();
+    }
+
+    ProjectState parent = Iterables.getFirst(projectState.parents(), null);
+    if (parent != null) {
+      info.inheritsFrom = projectJson.format(parent.getProject());
+    }
+
+    if (projectName.equals(allProjectsName)
+        && permissionBackend.currentUser().testOrFalse(ADMINISTRATE_SERVER)) {
+      info.ownerOf.add(AccessSection.GLOBAL_CAPABILITIES);
+    }
+
+    info.isOwner = toBoolean(canWriteConfig);
+    info.canUpload =
+        toBoolean(
+            projectState.statePermitsWrite()
+                && (canWriteConfig
+                    || (canReadConfig
+                        && perm.ref(RefNames.REFS_CONFIG).testOrFalse(CREATE_CHANGE))));
+    info.canAdd = toBoolean(perm.testOrFalse(CREATE_REF));
+    info.canAddTags = toBoolean(perm.testOrFalse(CREATE_TAG_REF));
+    info.configVisible = canReadConfig || canWriteConfig;
+
+    info.groups =
+        groups.entrySet().stream()
+            .filter(e -> e.getValue() != null)
+            .collect(toMap(e -> e.getKey().get(), Map.Entry::getValue));
+
+    return info;
+  }
+
+  private void loadGroup(Map<AccountGroup.UUID, GroupInfo> groups, AccountGroup.UUID id) {
+    if (!groups.containsKey(id)) {
+      GroupDescription.Basic basic = groupBackend.get(id);
+      GroupInfo group;
+      if (basic != null) {
+        group = new GroupInfo();
+        // The UI only needs name + URL, so don't populate other fields to avoid leaking data
+        // about groups invisible to the user.
+        group.name = basic.getName();
+        group.url = basic.getUrl();
+      } else {
+        logger.atWarning().log("no such group: %s", id);
+        group = null;
+      }
+      groups.put(id, group);
+    }
+  }
+
+  private static boolean check(PermissionBackend.ForProject ctx, String ref, RefPermission perm)
+      throws PermissionBackendException {
+    try {
+      ctx.ref(ref).check(perm);
+      return true;
+    } catch (AuthException denied) {
+      return false;
+    }
+  }
+
+  private static boolean check(PermissionBackend.ForProject ctx, ProjectPermission perm)
+      throws PermissionBackendException {
+    try {
+      ctx.check(perm);
+      return true;
+    } catch (AuthException denied) {
+      return false;
+    }
+  }
+
+  private AccessSectionInfo createAccessSection(
+      Map<AccountGroup.UUID, GroupInfo> groups, AccessSection section) {
+    AccessSectionInfo accessSectionInfo = new AccessSectionInfo();
+    accessSectionInfo.permissions = new HashMap<>();
+    for (Permission p : section.getPermissions()) {
+      PermissionInfo pInfo = new PermissionInfo(p.getLabel(), p.getExclusiveGroup() ? true : null);
+      pInfo.rules = new HashMap<>();
+      for (PermissionRule r : p.getRules()) {
+        PermissionRuleInfo info =
+            new PermissionRuleInfo(ACTION_TYPE.get(r.getAction()), r.getForce());
+        if (r.hasRange()) {
+          info.max = r.getMax();
+          info.min = r.getMin();
+        }
+        AccountGroup.UUID group = r.getGroup().getUUID();
+        if (group != null) {
+          pInfo.rules.put(group.get(), info);
+          loadGroup(groups, group);
+        }
+      }
+      accessSectionInfo.permissions.put(p.getName(), pInfo);
+    }
+    return accessSectionInfo;
+  }
+
+  private static Boolean toBoolean(boolean value) {
+    return value ? true : null;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/GetBranch.java b/java/com/google/gerrit/server/restapi/project/GetBranch.java
new file mode 100644
index 0000000..7d32f3d
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/GetBranch.java
@@ -0,0 +1,41 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.project;
+
+import com.google.gerrit.extensions.api.projects.BranchInfo;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.BranchResource;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+
+@Singleton
+public class GetBranch implements RestReadView<BranchResource> {
+  private final Provider<ListBranches> list;
+
+  @Inject
+  GetBranch(Provider<ListBranches> list) {
+    this.list = list;
+  }
+
+  @Override
+  public BranchInfo apply(BranchResource rsrc)
+      throws ResourceNotFoundException, IOException, PermissionBackendException {
+    return list.get().toBranchInfo(rsrc);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/GetChildProject.java b/java/com/google/gerrit/server/restapi/project/GetChildProject.java
new file mode 100644
index 0000000..e69907e
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/GetChildProject.java
@@ -0,0 +1,46 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.project;
+
+import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.project.ChildProjectResource;
+import com.google.gerrit.server.project.ProjectJson;
+import com.google.inject.Inject;
+import org.kohsuke.args4j.Option;
+
+public class GetChildProject implements RestReadView<ChildProjectResource> {
+  @Option(name = "--recursive", usage = "to list child projects recursively")
+  public void setRecursive(boolean recursive) {
+    this.recursive = recursive;
+  }
+
+  private final ProjectJson json;
+  private boolean recursive;
+
+  @Inject
+  GetChildProject(ProjectJson json) {
+    this.json = json;
+  }
+
+  @Override
+  public ProjectInfo apply(ChildProjectResource rsrc) throws ResourceNotFoundException {
+    if (recursive || rsrc.isDirectChild()) {
+      return json.format(rsrc.getChild().getProject());
+    }
+    throw new ResourceNotFoundException(rsrc.getChild().getName());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/GetCommit.java b/java/com/google/gerrit/server/restapi/project/GetCommit.java
new file mode 100644
index 0000000..1c1ae90
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/GetCommit.java
@@ -0,0 +1,31 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.project;
+
+import com.google.gerrit.extensions.common.CommitInfo;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.git.CommitUtil;
+import com.google.gerrit.server.project.CommitResource;
+import com.google.inject.Singleton;
+import java.io.IOException;
+
+@Singleton
+public class GetCommit implements RestReadView<CommitResource> {
+
+  @Override
+  public CommitInfo apply(CommitResource rsrc) throws IOException {
+    return CommitUtil.toCommitInfo(rsrc.getCommit());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/GetConfig.java b/java/com/google/gerrit/server/restapi/project/GetConfig.java
new file mode 100644
index 0000000..b3ad962
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/GetConfig.java
@@ -0,0 +1,67 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.project;
+
+import com.google.gerrit.extensions.api.projects.ConfigInfo;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.server.EnableSignedPush;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.PluginConfigFactory;
+import com.google.gerrit.server.config.ProjectConfigEntry;
+import com.google.gerrit.server.extensions.webui.UiActions;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GetConfig implements RestReadView<ProjectResource> {
+  private final boolean serverEnableSignedPush;
+  private final DynamicMap<ProjectConfigEntry> pluginConfigEntries;
+  private final PluginConfigFactory cfgFactory;
+  private final AllProjectsName allProjects;
+  private final UiActions uiActions;
+  private final DynamicMap<RestView<ProjectResource>> views;
+
+  @Inject
+  public GetConfig(
+      @EnableSignedPush boolean serverEnableSignedPush,
+      DynamicMap<ProjectConfigEntry> pluginConfigEntries,
+      PluginConfigFactory cfgFactory,
+      AllProjectsName allProjects,
+      UiActions uiActions,
+      DynamicMap<RestView<ProjectResource>> views) {
+    this.serverEnableSignedPush = serverEnableSignedPush;
+    this.pluginConfigEntries = pluginConfigEntries;
+    this.allProjects = allProjects;
+    this.cfgFactory = cfgFactory;
+    this.uiActions = uiActions;
+    this.views = views;
+  }
+
+  @Override
+  public ConfigInfo apply(ProjectResource resource) {
+    return new ConfigInfoImpl(
+        serverEnableSignedPush,
+        resource.getProjectState(),
+        resource.getUser(),
+        pluginConfigEntries,
+        cfgFactory,
+        allProjects,
+        uiActions,
+        views);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/GetContent.java b/java/com/google/gerrit/server/restapi/project/GetContent.java
new file mode 100644
index 0000000..132b644
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/GetContent.java
@@ -0,0 +1,41 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.project;
+
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.BinaryResult;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.change.FileContentUtil;
+import com.google.gerrit.server.project.FileResource;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+
+@Singleton
+public class GetContent implements RestReadView<FileResource> {
+  private final FileContentUtil fileContentUtil;
+
+  @Inject
+  GetContent(FileContentUtil fileContentUtil) {
+    this.fileContentUtil = fileContentUtil;
+  }
+
+  @Override
+  public BinaryResult apply(FileResource rsrc)
+      throws ResourceNotFoundException, BadRequestException, IOException {
+    return fileContentUtil.getContent(rsrc.getProjectState(), rsrc.getRev(), rsrc.getPath(), null);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/GetDashboard.java b/java/com/google/gerrit/server/restapi/project/GetDashboard.java
new file mode 100644
index 0000000..2ec67e7
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/GetDashboard.java
@@ -0,0 +1,116 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.project;
+
+import static com.google.gerrit.reviewdb.client.RefNames.REFS_DASHBOARDS;
+import static com.google.gerrit.server.restapi.project.DashboardsCollection.isDefaultDashboard;
+
+import com.google.common.base.Splitter;
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+import com.google.gerrit.extensions.api.projects.DashboardInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.extensions.restapi.Url;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.DashboardResource;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.util.List;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.kohsuke.args4j.Option;
+
+public class GetDashboard implements RestReadView<DashboardResource> {
+  private final DashboardsCollection dashboards;
+
+  @Option(name = "--inherited", usage = "include inherited dashboards")
+  private boolean inherited;
+
+  @Inject
+  GetDashboard(DashboardsCollection dashboards) {
+    this.dashboards = dashboards;
+  }
+
+  public GetDashboard setInherited(boolean inherited) {
+    this.inherited = inherited;
+    return this;
+  }
+
+  @Override
+  public DashboardInfo apply(DashboardResource rsrc)
+      throws RestApiException, IOException, PermissionBackendException {
+    if (inherited && !rsrc.isProjectDefault()) {
+      throw new BadRequestException("inherited flag can only be used with default");
+    }
+
+    if (rsrc.isProjectDefault()) {
+      // The default is not resolved to a definition yet.
+      try {
+        rsrc = defaultOf(rsrc.getProjectState(), rsrc.getUser());
+      } catch (ConfigInvalidException e) {
+        throw new ResourceConflictException(e.getMessage());
+      }
+    }
+
+    return DashboardsCollection.parse(
+        rsrc.getProjectState().getProject(),
+        rsrc.getRefName().substring(REFS_DASHBOARDS.length()),
+        rsrc.getPathName(),
+        rsrc.getConfig(),
+        rsrc.getProjectState().getName(),
+        true);
+  }
+
+  private DashboardResource defaultOf(ProjectState projectState, CurrentUser user)
+      throws RestApiException, IOException, ConfigInvalidException, PermissionBackendException {
+    String id = projectState.getProject().getLocalDefaultDashboard();
+    if (Strings.isNullOrEmpty(id)) {
+      id = projectState.getProject().getDefaultDashboard();
+    }
+    if (isDefaultDashboard(id)) {
+      throw new ResourceNotFoundException();
+    } else if (!Strings.isNullOrEmpty(id)) {
+      return parse(projectState, user, id);
+    } else if (!inherited) {
+      throw new ResourceNotFoundException();
+    }
+
+    for (ProjectState ps : projectState.tree()) {
+      id = ps.getProject().getDefaultDashboard();
+      if (isDefaultDashboard(id)) {
+        throw new ResourceNotFoundException();
+      } else if (!Strings.isNullOrEmpty(id)) {
+        return parse(projectState, user, id);
+      }
+    }
+    throw new ResourceNotFoundException();
+  }
+
+  private DashboardResource parse(ProjectState projectState, CurrentUser user, String id)
+      throws RestApiException, IOException, ConfigInvalidException, PermissionBackendException {
+    List<String> p = Lists.newArrayList(Splitter.on(':').limit(2).split(id));
+    String ref = Url.encode(p.get(0));
+    String path = Url.encode(p.get(1));
+    return dashboards.parse(
+        new ProjectResource(projectState, user), IdString.fromUrl(ref + ':' + path));
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/GetDescription.java b/java/com/google/gerrit/server/restapi/project/GetDescription.java
new file mode 100644
index 0000000..d387ff1
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/GetDescription.java
@@ -0,0 +1,28 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.project;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GetDescription implements RestReadView<ProjectResource> {
+  @Override
+  public String apply(ProjectResource rsrc) {
+    return Strings.nullToEmpty(rsrc.getProjectState().getProject().getDescription());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/GetHead.java b/java/com/google/gerrit/server/restapi/project/GetHead.java
new file mode 100644
index 0000000..bc267c8
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/GetHead.java
@@ -0,0 +1,93 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.project;
+
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.IncorrectObjectTypeException;
+import org.eclipse.jgit.errors.MissingObjectException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+@Singleton
+public class GetHead implements RestReadView<ProjectResource> {
+  private final GitRepositoryManager repoManager;
+  private final CommitsCollection commits;
+  private final PermissionBackend permissionBackend;
+
+  @Inject
+  GetHead(
+      GitRepositoryManager repoManager,
+      CommitsCollection commits,
+      PermissionBackend permissionBackend) {
+    this.repoManager = repoManager;
+    this.commits = commits;
+    this.permissionBackend = permissionBackend;
+  }
+
+  @Override
+  public String apply(ProjectResource rsrc)
+      throws AuthException, ResourceNotFoundException, IOException, PermissionBackendException {
+    rsrc.getProjectState().statePermitsRead();
+    try (Repository repo = repoManager.openRepository(rsrc.getNameKey())) {
+      Ref head = repo.getRefDatabase().exactRef(Constants.HEAD);
+      if (head == null) {
+        throw new ResourceNotFoundException(Constants.HEAD);
+      } else if (head.isSymbolic()) {
+        String n = head.getTarget().getName();
+        permissionBackend
+            .user(rsrc.getUser())
+            .project(rsrc.getNameKey())
+            .ref(n)
+            .check(RefPermission.READ);
+        return n;
+      } else if (head.getObjectId() != null) {
+        try (RevWalk rw = new RevWalk(repo)) {
+          RevCommit commit = rw.parseCommit(head.getObjectId());
+          if (commits.canRead(rsrc.getProjectState(), repo, commit)) {
+            return head.getObjectId().name();
+          }
+          throw new AuthException("not allowed to see HEAD");
+        } catch (MissingObjectException | IncorrectObjectTypeException e) {
+          try {
+            permissionBackend
+                .user(rsrc.getUser())
+                .project(rsrc.getNameKey())
+                .check(ProjectPermission.WRITE_CONFIG);
+          } catch (AuthException ae) {
+            throw new AuthException("not allowed to see HEAD");
+          }
+        }
+      }
+      throw new ResourceNotFoundException(Constants.HEAD);
+    } catch (RepositoryNotFoundException e) {
+      throw new ResourceNotFoundException(rsrc.getName());
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/GetParent.java b/java/com/google/gerrit/server/restapi/project/GetParent.java
new file mode 100644
index 0000000..a4942e3
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/GetParent.java
@@ -0,0 +1,39 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.project;
+
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GetParent implements RestReadView<ProjectResource> {
+  private final AllProjectsName allProjectsName;
+
+  @Inject
+  GetParent(AllProjectsName allProjectsName) {
+    this.allProjectsName = allProjectsName;
+  }
+
+  @Override
+  public String apply(ProjectResource resource) {
+    Project project = resource.getProjectState().getProject();
+    Project.NameKey parentName = project.getParent(allProjectsName);
+    return parentName != null ? parentName.get() : "";
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/GetProject.java b/java/com/google/gerrit/server/restapi/project/GetProject.java
new file mode 100644
index 0000000..26159e4
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/GetProject.java
@@ -0,0 +1,38 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.project;
+
+import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.project.ProjectJson;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GetProject implements RestReadView<ProjectResource> {
+
+  private final ProjectJson json;
+
+  @Inject
+  GetProject(ProjectJson json) {
+    this.json = json;
+  }
+
+  @Override
+  public ProjectInfo apply(ProjectResource rsrc) {
+    return json.format(rsrc.getProjectState());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/GetReflog.java b/java/com/google/gerrit/server/restapi/project/GetReflog.java
new file mode 100644
index 0000000..4b9a489
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/GetReflog.java
@@ -0,0 +1,137 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.project;
+
+import com.google.common.collect.Lists;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.projects.ReflogEntryInfo;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.CommonConverters;
+import com.google.gerrit.server.args4j.TimestampHandler;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.project.BranchResource;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.jgit.lib.ReflogEntry;
+import org.eclipse.jgit.lib.ReflogReader;
+import org.eclipse.jgit.lib.Repository;
+import org.kohsuke.args4j.Option;
+
+public class GetReflog implements RestReadView<BranchResource> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final GitRepositoryManager repoManager;
+  private final PermissionBackend permissionBackend;
+
+  @Option(
+      name = "--limit",
+      aliases = {"-n"},
+      metaVar = "CNT",
+      usage = "maximum number of reflog entries to list")
+  public GetReflog setLimit(int limit) {
+    this.limit = limit;
+    return this;
+  }
+
+  @Option(
+      name = "--from",
+      metaVar = "TIMESTAMP",
+      usage =
+          "timestamp from which the reflog entries should be listed (UTC, format: "
+              + TimestampHandler.TIMESTAMP_FORMAT
+              + ")")
+  public GetReflog setFrom(Timestamp from) {
+    this.from = from;
+    return this;
+  }
+
+  @Option(
+      name = "--to",
+      metaVar = "TIMESTAMP",
+      usage =
+          "timestamp until which the reflog entries should be listed (UTC, format: "
+              + TimestampHandler.TIMESTAMP_FORMAT
+              + ")")
+  public GetReflog setTo(Timestamp to) {
+    this.to = to;
+    return this;
+  }
+
+  private int limit;
+  private Timestamp from;
+  private Timestamp to;
+
+  @Inject
+  public GetReflog(GitRepositoryManager repoManager, PermissionBackend permissionBackend) {
+    this.repoManager = repoManager;
+    this.permissionBackend = permissionBackend;
+  }
+
+  @Override
+  public List<ReflogEntryInfo> apply(BranchResource rsrc)
+      throws RestApiException, IOException, PermissionBackendException {
+    permissionBackend
+        .user(rsrc.getUser())
+        .project(rsrc.getNameKey())
+        .check(ProjectPermission.READ_REFLOG);
+
+    try (Repository repo = repoManager.openRepository(rsrc.getNameKey())) {
+      ReflogReader r;
+      try {
+        r = repo.getReflogReader(rsrc.getRef());
+      } catch (UnsupportedOperationException e) {
+        String msg = "reflog not supported on repo " + rsrc.getNameKey().get();
+        logger.atSevere().log(msg);
+        throw new MethodNotAllowedException(msg);
+      }
+      if (r == null) {
+        throw new ResourceNotFoundException(rsrc.getRef());
+      }
+      List<ReflogEntry> entries;
+      if (from == null && to == null) {
+        entries = limit > 0 ? r.getReverseEntries(limit) : r.getReverseEntries();
+      } else {
+        entries = limit > 0 ? new ArrayList<>(limit) : new ArrayList<>();
+        for (ReflogEntry e : r.getReverseEntries()) {
+          Timestamp timestamp = new Timestamp(e.getWho().getWhen().getTime());
+          if ((from == null || from.before(timestamp)) && (to == null || to.after(timestamp))) {
+            entries.add(e);
+          }
+          if (limit > 0 && entries.size() >= limit) {
+            break;
+          }
+        }
+      }
+      return Lists.transform(entries, this::newReflogEntryInfo);
+    }
+  }
+
+  private ReflogEntryInfo newReflogEntryInfo(ReflogEntry e) {
+    return new ReflogEntryInfo(
+        e.getOldId().getName(),
+        e.getNewId().getName(),
+        CommonConverters.toGitPerson(e.getWho()),
+        e.getComment());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/GetStatistics.java b/java/com/google/gerrit/server/restapi/project/GetStatistics.java
new file mode 100644
index 0000000..048c018
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/GetStatistics.java
@@ -0,0 +1,56 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.project;
+
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.api.GarbageCollectCommand;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.api.errors.JGitInternalException;
+import org.eclipse.jgit.lib.Repository;
+
+@RequiresCapability(GlobalCapability.RUN_GC)
+@Singleton
+public class GetStatistics implements RestReadView<ProjectResource> {
+
+  private final GitRepositoryManager repoManager;
+
+  @Inject
+  GetStatistics(GitRepositoryManager repoManager) {
+    this.repoManager = repoManager;
+  }
+
+  @Override
+  public RepositoryStatistics apply(ProjectResource rsrc)
+      throws ResourceNotFoundException, ResourceConflictException {
+    try (Repository repo = repoManager.openRepository(rsrc.getNameKey())) {
+      GarbageCollectCommand gc = Git.wrap(repo).gc();
+      return new RepositoryStatistics(gc.getStatistics());
+    } catch (GitAPIException | JGitInternalException e) {
+      throw new ResourceConflictException(e.getMessage());
+    } catch (IOException e) {
+      throw new ResourceNotFoundException(rsrc.getName());
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/GetTag.java b/java/com/google/gerrit/server/restapi/project/GetTag.java
new file mode 100644
index 0000000..6d5a510
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/GetTag.java
@@ -0,0 +1,29 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.project;
+
+import com.google.gerrit.extensions.api.projects.TagInfo;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.project.TagResource;
+import com.google.inject.Singleton;
+
+@Singleton
+public class GetTag implements RestReadView<TagResource> {
+
+  @Override
+  public TagInfo apply(TagResource resource) {
+    return resource.getTagInfo();
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/Index.java b/java/com/google/gerrit/server/restapi/project/Index.java
new file mode 100644
index 0000000..a346aed
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/Index.java
@@ -0,0 +1,91 @@
+// 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.
+
+package com.google.gerrit.server.restapi.project;
+
+import static com.google.gerrit.server.git.QueueProvider.QueueType.BATCH;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.extensions.api.projects.IndexProjectInput;
+import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.index.project.ProjectIndexer;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.index.IndexExecutor;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.concurrent.Future;
+
+@RequiresCapability(GlobalCapability.MAINTAIN_SERVER)
+@Singleton
+public class Index implements RestModifyView<ProjectResource, IndexProjectInput> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final ProjectIndexer indexer;
+  private final ListeningExecutorService executor;
+  private final Provider<ListChildProjects> listChildProjectsProvider;
+
+  @Inject
+  Index(
+      ProjectIndexer indexer,
+      @IndexExecutor(BATCH) ListeningExecutorService executor,
+      Provider<ListChildProjects> listChildProjectsProvider) {
+    this.indexer = indexer;
+    this.executor = executor;
+    this.listChildProjectsProvider = listChildProjectsProvider;
+  }
+
+  @Override
+  public Response.Accepted apply(ProjectResource rsrc, IndexProjectInput input)
+      throws IOException, OrmException, PermissionBackendException, RestApiException {
+    String response = "Project " + rsrc.getName() + " submitted for reindexing";
+
+    reindex(rsrc.getNameKey(), input.async);
+    if (Boolean.TRUE.equals(input.indexChildren)) {
+      for (ProjectInfo child : listChildProjectsProvider.get().withRecursive(true).apply(rsrc)) {
+        reindex(new Project.NameKey(child.name), input.async);
+      }
+
+      response += " (indexing children recursively)";
+    }
+    return Response.accepted(response);
+  }
+
+  private void reindex(Project.NameKey project, Boolean async) throws IOException {
+    if (Boolean.TRUE.equals(async)) {
+      @SuppressWarnings("unused")
+      Future<?> possiblyIgnoredError =
+          executor.submit(
+              () -> {
+                try {
+                  indexer.index(project);
+                } catch (IOException e) {
+                  logger.atWarning().withCause(e).log("reindexing project %s failed", project);
+                }
+              });
+    } else {
+      indexer.index(project);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/IndexChanges.java b/java/com/google/gerrit/server/restapi/project/IndexChanges.java
new file mode 100644
index 0000000..b84f86c
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/IndexChanges.java
@@ -0,0 +1,72 @@
+// Copyright (C) 2017 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.google.gerrit.server.restapi.project;
+
+import static com.google.gerrit.server.git.QueueProvider.QueueType.BATCH;
+
+import com.google.common.io.ByteStreams;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.extensions.api.projects.ProjectInput;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.git.MultiProgressMonitor;
+import com.google.gerrit.server.git.MultiProgressMonitor.Task;
+import com.google.gerrit.server.index.IndexExecutor;
+import com.google.gerrit.server.index.change.AllChangesIndexer;
+import com.google.gerrit.server.index.change.ChangeIndexer;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.concurrent.Future;
+import org.eclipse.jgit.util.io.NullOutputStream;
+
+@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
+@Singleton
+public class IndexChanges implements RestModifyView<ProjectResource, ProjectInput> {
+
+  private final Provider<AllChangesIndexer> allChangesIndexerProvider;
+  private final ChangeIndexer indexer;
+  private final ListeningExecutorService executor;
+
+  @Inject
+  IndexChanges(
+      Provider<AllChangesIndexer> allChangesIndexerProvider,
+      ChangeIndexer indexer,
+      @IndexExecutor(BATCH) ListeningExecutorService executor) {
+    this.allChangesIndexerProvider = allChangesIndexerProvider;
+    this.indexer = indexer;
+    this.executor = executor;
+  }
+
+  @Override
+  public Response.Accepted apply(ProjectResource resource, ProjectInput input) {
+    Project.NameKey project = resource.getNameKey();
+    Task mpt =
+        new MultiProgressMonitor(ByteStreams.nullOutputStream(), "Reindexing project")
+            .beginSubTask("", MultiProgressMonitor.UNKNOWN);
+    AllChangesIndexer allChangesIndexer = allChangesIndexerProvider.get();
+    allChangesIndexer.setVerboseOut(NullOutputStream.INSTANCE);
+    // The REST call is just a trigger for async reindexing, so it is safe to ignore the future's
+    // return value.
+    @SuppressWarnings("unused")
+    Future<?> possiblyIgnoredError =
+        executor.submit(allChangesIndexer.reindexProject(indexer, project, mpt, mpt));
+    return Response.accepted("Project " + project + " submitted for reindexing");
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/ListBranches.java b/java/com/google/gerrit/server/restapi/project/ListBranches.java
new file mode 100644
index 0000000..a0d2528
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/ListBranches.java
@@ -0,0 +1,285 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.project;
+
+import static com.google.gerrit.reviewdb.client.RefNames.isConfigRef;
+
+import com.google.common.collect.ComparisonChain;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Sets;
+import com.google.gerrit.extensions.api.projects.BranchInfo;
+import com.google.gerrit.extensions.api.projects.ProjectApi.ListRefsRequest;
+import com.google.gerrit.extensions.common.ActionInfo;
+import com.google.gerrit.extensions.common.WebLinkInfo;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.extensions.webui.UiAction;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.WebLinks;
+import com.google.gerrit.server.extensions.webui.UiActions;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.gerrit.server.project.BranchResource;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.project.RefFilter;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeMap;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.kohsuke.args4j.Option;
+
+public class ListBranches implements RestReadView<ProjectResource> {
+  private final GitRepositoryManager repoManager;
+  private final PermissionBackend permissionBackend;
+  private final DynamicMap<RestView<BranchResource>> branchViews;
+  private final UiActions uiActions;
+  private final WebLinks webLinks;
+
+  @Option(
+      name = "--limit",
+      aliases = {"-n"},
+      metaVar = "CNT",
+      usage = "maximum number of branches to list")
+  public void setLimit(int limit) {
+    this.limit = limit;
+  }
+
+  @Option(
+      name = "--start",
+      aliases = {"-S", "-s"},
+      metaVar = "CNT",
+      usage = "number of branches to skip")
+  public void setStart(int start) {
+    this.start = start;
+  }
+
+  @Option(
+      name = "--match",
+      aliases = {"-m"},
+      metaVar = "MATCH",
+      usage = "match branches substring")
+  public void setMatchSubstring(String matchSubstring) {
+    this.matchSubstring = matchSubstring;
+  }
+
+  @Option(
+      name = "--regex",
+      aliases = {"-r"},
+      metaVar = "REGEX",
+      usage = "match branches regex")
+  public void setMatchRegex(String matchRegex) {
+    this.matchRegex = matchRegex;
+  }
+
+  private int limit;
+  private int start;
+  private String matchSubstring;
+  private String matchRegex;
+
+  @Inject
+  public ListBranches(
+      GitRepositoryManager repoManager,
+      PermissionBackend permissionBackend,
+      DynamicMap<RestView<BranchResource>> branchViews,
+      UiActions uiActions,
+      WebLinks webLinks) {
+    this.repoManager = repoManager;
+    this.permissionBackend = permissionBackend;
+    this.branchViews = branchViews;
+    this.uiActions = uiActions;
+    this.webLinks = webLinks;
+  }
+
+  public ListBranches request(ListRefsRequest<BranchInfo> request) {
+    this.setLimit(request.getLimit());
+    this.setStart(request.getStart());
+    this.setMatchSubstring(request.getSubstring());
+    this.setMatchRegex(request.getRegex());
+    return this;
+  }
+
+  @Override
+  public List<BranchInfo> apply(ProjectResource rsrc)
+      throws RestApiException, IOException, PermissionBackendException {
+    rsrc.getProjectState().checkStatePermitsRead();
+    return new RefFilter<BranchInfo>(Constants.R_HEADS)
+        .subString(matchSubstring)
+        .regex(matchRegex)
+        .start(start)
+        .limit(limit)
+        .filter(allBranches(rsrc));
+  }
+
+  BranchInfo toBranchInfo(BranchResource rsrc)
+      throws IOException, ResourceNotFoundException, PermissionBackendException {
+    try (Repository db = repoManager.openRepository(rsrc.getNameKey())) {
+      Ref r = db.exactRef(rsrc.getRef());
+      if (r == null) {
+        throw new ResourceNotFoundException();
+      }
+      return toBranchInfo(rsrc, ImmutableList.of(r)).get(0);
+    } catch (RepositoryNotFoundException noRepo) {
+      throw new ResourceNotFoundException();
+    }
+  }
+
+  private List<BranchInfo> allBranches(ProjectResource rsrc)
+      throws IOException, ResourceNotFoundException, PermissionBackendException {
+    List<Ref> refs;
+    try (Repository db = repoManager.openRepository(rsrc.getNameKey())) {
+      Collection<Ref> heads = db.getRefDatabase().getRefsByPrefix(Constants.R_HEADS);
+      refs = new ArrayList<>(heads.size() + 3);
+      refs.addAll(heads);
+      refs.addAll(
+          db.getRefDatabase()
+              .exactRef(Constants.HEAD, RefNames.REFS_CONFIG, RefNames.REFS_USERS_DEFAULT)
+              .values());
+    } catch (RepositoryNotFoundException noGitRepository) {
+      throw new ResourceNotFoundException();
+    }
+    return toBranchInfo(rsrc, refs);
+  }
+
+  private List<BranchInfo> toBranchInfo(ProjectResource rsrc, List<Ref> refs)
+      throws PermissionBackendException {
+    Set<String> targets = Sets.newHashSetWithExpectedSize(1);
+    for (Ref ref : refs) {
+      if (ref.isSymbolic()) {
+        targets.add(ref.getTarget().getName());
+      }
+    }
+
+    PermissionBackend.ForProject perm = permissionBackend.currentUser().project(rsrc.getNameKey());
+    List<BranchInfo> branches = new ArrayList<>(refs.size());
+    for (Ref ref : refs) {
+      if (ref.isSymbolic()) {
+        // A symbolic reference to another branch, instead of
+        // showing the resolved value, show the name it references.
+        //
+        String target = ref.getTarget().getName();
+
+        try {
+          perm.ref(target).check(RefPermission.READ);
+        } catch (AuthException e) {
+          continue;
+        }
+
+        if (target.startsWith(Constants.R_HEADS)) {
+          target = target.substring(Constants.R_HEADS.length());
+        }
+
+        BranchInfo b = new BranchInfo();
+        b.ref = ref.getName();
+        b.revision = target;
+        branches.add(b);
+
+        if (!Constants.HEAD.equals(ref.getName())) {
+          if (isConfigRef(ref.getName())) {
+            // Never allow to delete the meta config branch.
+            b.canDelete = null;
+          } else {
+            b.canDelete =
+                perm.ref(ref.getName()).testOrFalse(RefPermission.DELETE)
+                        && rsrc.getProjectState().statePermitsWrite()
+                    ? true
+                    : null;
+          }
+        }
+        continue;
+      }
+
+      try {
+        perm.ref(ref.getName()).check(RefPermission.READ);
+        branches.add(
+            createBranchInfo(
+                perm.ref(ref.getName()), ref, rsrc.getProjectState(), rsrc.getUser(), targets));
+      } catch (AuthException e) {
+        // Do nothing.
+      }
+    }
+    branches.sort(new BranchComparator());
+    return branches;
+  }
+
+  private static class BranchComparator implements Comparator<BranchInfo> {
+    @Override
+    public int compare(BranchInfo a, BranchInfo b) {
+      return ComparisonChain.start()
+          .compareTrueFirst(isHead(a), isHead(b))
+          .compareTrueFirst(isConfig(a), isConfig(b))
+          .compare(a.ref, b.ref)
+          .result();
+    }
+
+    private static boolean isHead(BranchInfo i) {
+      return Constants.HEAD.equals(i.ref);
+    }
+
+    private static boolean isConfig(BranchInfo i) {
+      return RefNames.REFS_CONFIG.equals(i.ref);
+    }
+  }
+
+  private BranchInfo createBranchInfo(
+      PermissionBackend.ForRef perm,
+      Ref ref,
+      ProjectState projectState,
+      CurrentUser user,
+      Set<String> targets) {
+    BranchInfo info = new BranchInfo();
+    info.ref = ref.getName();
+    info.revision = ref.getObjectId() != null ? ref.getObjectId().name() : null;
+
+    if (isConfigRef(ref.getName())) {
+      // Never allow to delete the meta config branch.
+      info.canDelete = null;
+    } else {
+      info.canDelete =
+          !targets.contains(ref.getName())
+                  && perm.testOrFalse(RefPermission.DELETE)
+                  && projectState.statePermitsWrite()
+              ? true
+              : null;
+    }
+
+    BranchResource rsrc = new BranchResource(projectState, user, ref);
+    for (UiAction.Description d : uiActions.from(branchViews, rsrc)) {
+      if (info.actions == null) {
+        info.actions = new TreeMap<>();
+      }
+      info.actions.put(d.getId(), new ActionInfo(d));
+    }
+
+    List<WebLinkInfo> links = webLinks.getBranchLinks(projectState.getName(), ref.getName());
+    info.webLinks = links.isEmpty() ? null : links;
+    return info;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/ListChildProjects.java b/java/com/google/gerrit/server/restapi/project/ListChildProjects.java
new file mode 100644
index 0000000..ea54a4a
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/ListChildProjects.java
@@ -0,0 +1,96 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.project;
+
+import static java.util.stream.Collectors.toList;
+
+import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.project.ChildProjects;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.util.List;
+import org.kohsuke.args4j.Option;
+
+public class ListChildProjects implements RestReadView<ProjectResource> {
+
+  @Option(name = "--recursive", usage = "to list child projects recursively")
+  private boolean recursive;
+
+  @Option(name = "--limit", usage = "maximum number of parents projects to list")
+  private int limit;
+
+  private final PermissionBackend permissionBackend;
+  private final ChildProjects childProjects;
+  private final Provider<QueryProjects> queryProvider;
+
+  @Inject
+  ListChildProjects(
+      PermissionBackend permissionBackend,
+      ChildProjects childProjects,
+      Provider<QueryProjects> queryProvider) {
+    this.permissionBackend = permissionBackend;
+    this.childProjects = childProjects;
+    this.queryProvider = queryProvider;
+  }
+
+  public ListChildProjects withRecursive(boolean recursive) {
+    this.recursive = recursive;
+    return this;
+  }
+
+  public ListChildProjects withLimit(int limit) {
+    this.limit = limit;
+    return this;
+  }
+
+  @Override
+  public List<ProjectInfo> apply(ProjectResource rsrc)
+      throws PermissionBackendException, OrmException, RestApiException {
+    if (limit < 0) {
+      throw new BadRequestException("limit must be a positive number");
+    }
+    if (recursive && limit != 0) {
+      throw new ResourceConflictException("recursive and limit options are mutually exclusive");
+    }
+    rsrc.getProjectState().checkStatePermitsRead();
+    if (recursive) {
+      return childProjects.list(rsrc.getNameKey());
+    }
+
+    return directChildProjects(rsrc.getNameKey());
+  }
+
+  private List<ProjectInfo> directChildProjects(Project.NameKey parent)
+      throws OrmException, RestApiException {
+    PermissionBackend.WithUser currentUser = permissionBackend.currentUser();
+    return queryProvider.get().withQuery("parent:" + parent.get()).withLimit(limit).apply().stream()
+        .filter(
+            p ->
+                currentUser
+                    .project(new Project.NameKey(p.name))
+                    .testOrFalse(ProjectPermission.ACCESS))
+        .collect(toList());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/ListDashboards.java b/java/com/google/gerrit/server/restapi/project/ListDashboards.java
new file mode 100644
index 0000000..3808a2f
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/ListDashboards.java
@@ -0,0 +1,159 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.project;
+
+import static com.google.gerrit.reviewdb.client.RefNames.REFS_DASHBOARDS;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.projects.DashboardInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.BlobBasedConfig;
+import org.eclipse.jgit.lib.FileMode;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.treewalk.TreeWalk;
+import org.kohsuke.args4j.Option;
+
+public class ListDashboards implements RestReadView<ProjectResource> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final GitRepositoryManager gitManager;
+  private final PermissionBackend permissionBackend;
+
+  @Option(name = "--inherited", usage = "include inherited dashboards")
+  private boolean inherited;
+
+  @Inject
+  ListDashboards(GitRepositoryManager gitManager, PermissionBackend permissionBackend) {
+    this.gitManager = gitManager;
+    this.permissionBackend = permissionBackend;
+  }
+
+  @Override
+  public List<?> apply(ProjectResource rsrc)
+      throws ResourceNotFoundException, IOException, PermissionBackendException {
+    String project = rsrc.getName();
+    if (!inherited) {
+      return scan(rsrc.getProjectState(), project, true);
+    }
+
+    List<List<DashboardInfo>> all = new ArrayList<>();
+    boolean setDefault = true;
+    for (ProjectState ps : tree(rsrc)) {
+      List<DashboardInfo> list = scan(ps, project, setDefault);
+      for (DashboardInfo d : list) {
+        if (d.isDefault != null && Boolean.TRUE.equals(d.isDefault)) {
+          setDefault = false;
+        }
+      }
+      if (!list.isEmpty()) {
+        all.add(list);
+      }
+    }
+    return all;
+  }
+
+  private Collection<ProjectState> tree(ProjectResource rsrc) throws PermissionBackendException {
+    Map<Project.NameKey, ProjectState> tree = new LinkedHashMap<>();
+    for (ProjectState ps : rsrc.getProjectState().tree()) {
+      if (ps.statePermitsRead()) {
+        tree.put(ps.getNameKey(), ps);
+      }
+    }
+
+    tree.keySet()
+        .retainAll(permissionBackend.currentUser().filter(ProjectPermission.ACCESS, tree.keySet()));
+    return tree.values();
+  }
+
+  private List<DashboardInfo> scan(ProjectState state, String project, boolean setDefault)
+      throws ResourceNotFoundException, IOException, PermissionBackendException {
+    if (!state.statePermitsRead()) {
+      return ImmutableList.of();
+    }
+
+    PermissionBackend.ForProject perm = permissionBackend.currentUser().project(state.getNameKey());
+    try (Repository git = gitManager.openRepository(state.getNameKey());
+        RevWalk rw = new RevWalk(git)) {
+      List<DashboardInfo> all = new ArrayList<>();
+      for (Ref ref : git.getRefDatabase().getRefsByPrefix(REFS_DASHBOARDS)) {
+        try {
+          perm.ref(ref.getName()).check(RefPermission.READ);
+          all.addAll(scanDashboards(state.getProject(), git, rw, ref, project, setDefault));
+        } catch (AuthException e) {
+          // Do nothing.
+        }
+      }
+      return all;
+    } catch (RepositoryNotFoundException e) {
+      throw new ResourceNotFoundException();
+    }
+  }
+
+  private List<DashboardInfo> scanDashboards(
+      Project definingProject,
+      Repository git,
+      RevWalk rw,
+      Ref ref,
+      String project,
+      boolean setDefault)
+      throws IOException {
+    List<DashboardInfo> list = new ArrayList<>();
+    try (TreeWalk tw = new TreeWalk(rw.getObjectReader())) {
+      tw.addTree(rw.parseTree(ref.getObjectId()));
+      tw.setRecursive(true);
+      while (tw.next()) {
+        if (tw.getFileMode(0) == FileMode.REGULAR_FILE) {
+          try {
+            list.add(
+                DashboardsCollection.parse(
+                    definingProject,
+                    ref.getName().substring(REFS_DASHBOARDS.length()),
+                    tw.getPathString(),
+                    new BlobBasedConfig(null, git, tw.getObjectId(0)),
+                    project,
+                    setDefault));
+          } catch (ConfigInvalidException e) {
+            logger.atWarning().log(
+                "Cannot parse dashboard %s:%s:%s: %s",
+                definingProject.getName(), ref.getName(), tw.getPathString(), e.getMessage());
+          }
+        }
+      }
+    }
+    return list;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/ListProjects.java b/java/com/google/gerrit/server/restapi/project/ListProjects.java
new file mode 100644
index 0000000..eccf29e
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/ListProjects.java
@@ -0,0 +1,740 @@
+// Copyright (C) 2009 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.google.gerrit.server.restapi.project;
+
+import static com.google.common.base.Strings.emptyToNull;
+import static com.google.common.base.Strings.isNullOrEmpty;
+import static com.google.common.collect.Ordering.natural;
+import static com.google.gerrit.extensions.client.ProjectState.HIDDEN;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.base.Joiner;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSortedMap;
+import com.google.common.collect.Iterables;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.errors.NoSuchGroupException;
+import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.extensions.common.WebLinkInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.BinaryResult;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.extensions.restapi.Url;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.OutputFormat;
+import com.google.gerrit.server.WebLinks;
+import com.google.gerrit.server.account.GroupControl;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.group.GroupResolver;
+import com.google.gerrit.server.ioutil.RegexListSearcher;
+import com.google.gerrit.server.ioutil.StringUtil;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.util.TreeFormatter;
+import com.google.gson.reflect.TypeToken;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.BufferedWriter;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.SortedMap;
+import java.util.SortedSet;
+import java.util.TreeMap;
+import java.util.TreeSet;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.kohsuke.args4j.Option;
+
+/** List projects visible to the calling user. */
+public class ListProjects implements RestReadView<TopLevelResource> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public enum FilterType {
+    CODE {
+      @Override
+      boolean matches(Repository git) throws IOException {
+        return !PERMISSIONS.matches(git);
+      }
+
+      @Override
+      boolean useMatch() {
+        return true;
+      }
+    },
+    PARENT_CANDIDATES {
+      @Override
+      boolean matches(Repository git) {
+        return true;
+      }
+
+      @Override
+      boolean useMatch() {
+        return false;
+      }
+    },
+    PERMISSIONS {
+      @Override
+      boolean matches(Repository git) throws IOException {
+        Ref head = git.getRefDatabase().exactRef(Constants.HEAD);
+        return head != null
+            && head.isSymbolic()
+            && RefNames.REFS_CONFIG.equals(head.getLeaf().getName());
+      }
+
+      @Override
+      boolean useMatch() {
+        return true;
+      }
+    },
+    ALL {
+      @Override
+      boolean matches(Repository git) {
+        return true;
+      }
+
+      @Override
+      boolean useMatch() {
+        return false;
+      }
+    };
+
+    abstract boolean matches(Repository git) throws IOException;
+
+    abstract boolean useMatch();
+  }
+
+  private final CurrentUser currentUser;
+  private final ProjectCache projectCache;
+  private final GroupResolver groupResolver;
+  private final GroupControl.Factory groupControlFactory;
+  private final GitRepositoryManager repoManager;
+  private final PermissionBackend permissionBackend;
+  private final ProjectNode.Factory projectNodeFactory;
+  private final WebLinks webLinks;
+
+  @Deprecated
+  @Option(name = "--format", usage = "(deprecated) output format")
+  private OutputFormat format = OutputFormat.TEXT;
+
+  @Option(
+      name = "--show-branch",
+      aliases = {"-b"},
+      usage = "displays the sha of each project in the specified branch")
+  public void addShowBranch(String branch) {
+    showBranch.add(branch);
+  }
+
+  @Option(
+      name = "--tree",
+      aliases = {"-t"},
+      usage =
+          "displays project inheritance in a tree-like format\n"
+              + "this option does not work together with the show-branch option")
+  public void setShowTree(boolean showTree) {
+    this.showTree = showTree;
+  }
+
+  @Option(name = "--type", usage = "type of project")
+  public void setFilterType(FilterType type) {
+    this.type = type;
+  }
+
+  @Option(
+      name = "--description",
+      aliases = {"-d"},
+      usage = "include description of project in list")
+  public void setShowDescription(boolean showDescription) {
+    this.showDescription = showDescription;
+  }
+
+  @Option(name = "--all", usage = "display all projects that are accessible by the calling user")
+  public void setAll(boolean all) {
+    this.all = all;
+  }
+
+  @Option(
+      name = "--state",
+      aliases = {"-s"},
+      usage = "filter by project state")
+  public void setState(com.google.gerrit.extensions.client.ProjectState state) {
+    this.state = state;
+  }
+
+  @Option(
+      name = "--limit",
+      aliases = {"-n"},
+      metaVar = "CNT",
+      usage = "maximum number of projects to list")
+  public void setLimit(int limit) {
+    this.limit = limit;
+  }
+
+  @Option(
+      name = "--start",
+      aliases = {"-S"},
+      metaVar = "CNT",
+      usage = "number of projects to skip")
+  public void setStart(int start) {
+    this.start = start;
+  }
+
+  @Option(
+      name = "--prefix",
+      aliases = {"-p"},
+      metaVar = "PREFIX",
+      usage = "match project prefix")
+  public void setMatchPrefix(String matchPrefix) {
+    this.matchPrefix = matchPrefix;
+  }
+
+  @Option(
+      name = "--match",
+      aliases = {"-m"},
+      metaVar = "MATCH",
+      usage = "match project substring")
+  public void setMatchSubstring(String matchSubstring) {
+    this.matchSubstring = matchSubstring;
+  }
+
+  @Option(name = "-r", metaVar = "REGEX", usage = "match project regex")
+  public void setMatchRegex(String matchRegex) {
+    this.matchRegex = matchRegex;
+  }
+
+  @Option(
+      name = "--has-acl-for",
+      metaVar = "GROUP",
+      usage = "displays only projects on which access rights for this group are directly assigned")
+  public void setGroupUuid(AccountGroup.UUID groupUuid) {
+    this.groupUuid = groupUuid;
+  }
+
+  private final List<String> showBranch = new ArrayList<>();
+  private boolean showTree;
+  private FilterType type = FilterType.ALL;
+  private boolean showDescription;
+  private boolean all;
+  private com.google.gerrit.extensions.client.ProjectState state;
+  private int limit;
+  private int start;
+  private String matchPrefix;
+  private String matchSubstring;
+  private String matchRegex;
+  private AccountGroup.UUID groupUuid;
+  private final Provider<QueryProjects> queryProjectsProvider;
+  private final boolean listProjectsFromIndex;
+
+  @Inject
+  protected ListProjects(
+      CurrentUser currentUser,
+      ProjectCache projectCache,
+      GroupResolver groupResolver,
+      GroupControl.Factory groupControlFactory,
+      GitRepositoryManager repoManager,
+      PermissionBackend permissionBackend,
+      ProjectNode.Factory projectNodeFactory,
+      WebLinks webLinks,
+      Provider<QueryProjects> queryProjectsProvider,
+      @GerritServerConfig Config config) {
+    this.currentUser = currentUser;
+    this.projectCache = projectCache;
+    this.groupResolver = groupResolver;
+    this.groupControlFactory = groupControlFactory;
+    this.repoManager = repoManager;
+    this.permissionBackend = permissionBackend;
+    this.projectNodeFactory = projectNodeFactory;
+    this.webLinks = webLinks;
+    this.queryProjectsProvider = queryProjectsProvider;
+    this.listProjectsFromIndex = config.getBoolean("gerrit", "listProjectsFromIndex", false);
+  }
+
+  public List<String> getShowBranch() {
+    return showBranch;
+  }
+
+  public boolean isShowTree() {
+    return showTree;
+  }
+
+  public boolean isShowDescription() {
+    return showDescription;
+  }
+
+  public OutputFormat getFormat() {
+    return format;
+  }
+
+  public ListProjects setFormat(OutputFormat fmt) {
+    format = fmt;
+    return this;
+  }
+
+  @Override
+  public Object apply(TopLevelResource resource)
+      throws BadRequestException, PermissionBackendException {
+    if (format == OutputFormat.TEXT) {
+      ByteArrayOutputStream buf = new ByteArrayOutputStream();
+      displayToStream(buf);
+      return BinaryResult.create(buf.toByteArray())
+          .setContentType("text/plain")
+          .setCharacterEncoding(UTF_8);
+    }
+    return apply();
+  }
+
+  public SortedMap<String, ProjectInfo> apply()
+      throws BadRequestException, PermissionBackendException {
+    Optional<String> projectQuery = expressAsProjectsQuery();
+    if (projectQuery.isPresent()) {
+      return applyAsQuery(projectQuery.get());
+    }
+
+    format = OutputFormat.JSON;
+    return display(null);
+  }
+
+  private Optional<String> expressAsProjectsQuery() {
+    return listProjectsFromIndex
+            && !all
+            && state != HIDDEN
+            && isNullOrEmpty(matchPrefix)
+            && isNullOrEmpty(matchRegex)
+            && isNullOrEmpty(matchSubstring) // TODO: see Issue 10446
+            && type == FilterType.ALL
+            && showBranch.isEmpty()
+            && !showTree
+        ? Optional.of(stateToQuery())
+        : Optional.empty();
+  }
+
+  private String stateToQuery() {
+    List<String> queries = new ArrayList<>();
+    if (state == null) {
+      queries.add("(state:active OR state:read-only)");
+    } else {
+      queries.add(String.format("(state:%s)", state.name()));
+    }
+
+    return Joiner.on(" AND ").join(queries).toString();
+  }
+
+  private SortedMap<String, ProjectInfo> applyAsQuery(String query) throws BadRequestException {
+    try {
+      return queryProjectsProvider.get().withQuery(query).withStart(start).withLimit(limit).apply()
+          .stream()
+          .collect(
+              ImmutableSortedMap.toImmutableSortedMap(
+                  natural(), p -> p.name, p -> showDescription ? p : nullifyDescription(p)));
+    } catch (OrmException | MethodNotAllowedException e) {
+      logger.atWarning().withCause(e).log(
+          "Internal error while processing the query '%s' request", query);
+      throw new BadRequestException("Internal error while processing the query request");
+    }
+  }
+
+  private ProjectInfo nullifyDescription(ProjectInfo p) {
+    p.description = null;
+    return p;
+  }
+
+  private void printQueryResults(String query, PrintWriter out) throws BadRequestException {
+    try {
+      if (format.isJson()) {
+        format.newGson().toJson(applyAsQuery(query), out);
+      } else {
+        newProjectsNamesStream(query).forEach(out::println);
+      }
+      out.flush();
+    } catch (OrmException | MethodNotAllowedException e) {
+      logger.atWarning().withCause(e).log(
+          "Internal error while processing the query '%s' request", query);
+      throw new BadRequestException("Internal error while processing the query request");
+    }
+  }
+
+  private Stream<String> newProjectsNamesStream(String query)
+      throws OrmException, MethodNotAllowedException, BadRequestException {
+    Stream<String> projects =
+        queryProjectsProvider.get().withQuery(query).apply().stream().map(p -> p.name).skip(start);
+    if (limit > 0) {
+      projects = projects.limit(limit);
+    }
+
+    return projects;
+  }
+
+  public void displayToStream(OutputStream displayOutputStream)
+      throws BadRequestException, PermissionBackendException {
+    PrintWriter stdout =
+        new PrintWriter(new BufferedWriter(new OutputStreamWriter(displayOutputStream, UTF_8)));
+    Optional<String> projectsQuery = expressAsProjectsQuery();
+
+    if (projectsQuery.isPresent()) {
+      printQueryResults(projectsQuery.get(), stdout);
+    } else {
+      display(stdout);
+    }
+  }
+
+  @Nullable
+  public SortedMap<String, ProjectInfo> display(@Nullable PrintWriter stdout)
+      throws BadRequestException, PermissionBackendException {
+    if (all && state != null) {
+      throw new BadRequestException("'all' and 'state' may not be used together");
+    }
+    if (groupUuid != null) {
+      try {
+        if (!groupControlFactory.controlFor(groupUuid).isVisible()) {
+          return Collections.emptySortedMap();
+        }
+      } catch (NoSuchGroupException ex) {
+        return Collections.emptySortedMap();
+      }
+    }
+
+    if (type == FilterType.PARENT_CANDIDATES) {
+      // Historically, PARENT_CANDIDATES implied showDescription.
+      showDescription = true;
+    }
+
+    int foundIndex = 0;
+    int found = 0;
+    TreeMap<String, ProjectInfo> output = new TreeMap<>();
+    Map<String, String> hiddenNames = new HashMap<>();
+    Map<Project.NameKey, Boolean> accessibleParents = new HashMap<>();
+    PermissionBackend.WithUser perm = permissionBackend.user(currentUser);
+    final TreeMap<Project.NameKey, ProjectNode> treeMap = new TreeMap<>();
+    try {
+      Iterable<Project.NameKey> projectNames = filter(perm)::iterator;
+      for (Project.NameKey projectName : projectNames) {
+        final ProjectState e = projectCache.get(projectName);
+        if (e == null || (e.getProject().getState() == HIDDEN && !all && state != HIDDEN)) {
+          // If we can't get it from the cache, pretend it's not present.
+          // If all wasn't selected, and it's HIDDEN, pretend it's not present.
+          // If state HIDDEN wasn't selected, and it's HIDDEN, pretend it's not present.
+          continue;
+        }
+
+        if (state != null && e.getProject().getState() != state) {
+          continue;
+        }
+
+        if (groupUuid != null
+            && !e.getLocalGroups()
+                .contains(GroupReference.forGroup(groupResolver.parseId(groupUuid.get())))) {
+          continue;
+        }
+
+        ProjectInfo info = new ProjectInfo();
+        if (showTree && !format.isJson()) {
+          treeMap.put(projectName, projectNodeFactory.create(e.getProject(), true));
+          continue;
+        }
+
+        info.name = projectName.get();
+        if (showTree && format.isJson()) {
+          ProjectState parent = Iterables.getFirst(e.parents(), null);
+          if (parent != null) {
+            if (isParentAccessible(accessibleParents, perm, parent)) {
+              info.parent = parent.getName();
+            } else {
+              info.parent = hiddenNames.get(parent.getName());
+              if (info.parent == null) {
+                info.parent = "?-" + (hiddenNames.size() + 1);
+                hiddenNames.put(parent.getName(), info.parent);
+              }
+            }
+          }
+        }
+
+        if (showDescription) {
+          info.description = emptyToNull(e.getProject().getDescription());
+        }
+        info.state = e.getProject().getState();
+
+        try {
+          if (!showBranch.isEmpty()) {
+            try (Repository git = repoManager.openRepository(projectName)) {
+              if (!type.matches(git)) {
+                continue;
+              }
+
+              boolean canReadAllRefs = e.statePermitsRead();
+              if (canReadAllRefs) {
+                try {
+                  permissionBackend
+                      .user(currentUser)
+                      .project(e.getNameKey())
+                      .check(ProjectPermission.READ);
+                } catch (AuthException exp) {
+                  canReadAllRefs = false;
+                }
+              }
+
+              List<Ref> refs = getBranchRefs(projectName, canReadAllRefs);
+              if (!hasValidRef(refs)) {
+                continue;
+              }
+
+              for (int i = 0; i < showBranch.size(); i++) {
+                Ref ref = refs.get(i);
+                if (ref != null && ref.getObjectId() != null) {
+                  if (info.branches == null) {
+                    info.branches = new LinkedHashMap<>();
+                  }
+                  info.branches.put(showBranch.get(i), ref.getObjectId().name());
+                }
+              }
+            }
+          } else if (!showTree && type.useMatch()) {
+            try (Repository git = repoManager.openRepository(projectName)) {
+              if (!type.matches(git)) {
+                continue;
+              }
+            }
+          }
+        } catch (RepositoryNotFoundException err) {
+          // If the Git repository is gone, the project doesn't actually exist anymore.
+          continue;
+        } catch (IOException err) {
+          logger.atWarning().withCause(err).log("Unexpected error reading %s", projectName);
+          continue;
+        }
+
+        if (type != FilterType.PARENT_CANDIDATES) {
+          List<WebLinkInfo> links = webLinks.getProjectLinks(projectName.get());
+          info.webLinks = links.isEmpty() ? null : links;
+        }
+
+        if (foundIndex++ < start) {
+          continue;
+        }
+        if (limit > 0 && ++found > limit) {
+          break;
+        }
+
+        if (stdout == null || format.isJson()) {
+          output.put(info.name, info);
+          continue;
+        }
+
+        if (!showBranch.isEmpty()) {
+          for (String name : showBranch) {
+            String ref = info.branches != null ? info.branches.get(name) : null;
+            if (ref == null) {
+              // Print stub (forty '-' symbols)
+              ref = "----------------------------------------";
+            }
+            stdout.print(ref);
+            stdout.print(' ');
+          }
+        }
+        stdout.print(info.name);
+
+        if (info.description != null) {
+          // We still want to list every project as one-liners, hence escaping \n.
+          stdout.print(" - " + StringUtil.escapeString(info.description));
+        }
+        stdout.print('\n');
+      }
+
+      for (ProjectInfo info : output.values()) {
+        info.id = Url.encode(info.name);
+        info.name = null;
+      }
+      if (stdout == null) {
+        return output;
+      } else if (format.isJson()) {
+        format
+            .newGson()
+            .toJson(output, new TypeToken<Map<String, ProjectInfo>>() {}.getType(), stdout);
+        stdout.print('\n');
+      } else if (showTree && treeMap.size() > 0) {
+        printProjectTree(stdout, treeMap);
+      }
+      return null;
+    } finally {
+      if (stdout != null) {
+        stdout.flush();
+      }
+    }
+  }
+
+  private Stream<Project.NameKey> filter(PermissionBackend.WithUser perm)
+      throws BadRequestException {
+    Stream<Project.NameKey> matches = StreamSupport.stream(scan().spliterator(), false);
+    if (type == FilterType.PARENT_CANDIDATES) {
+      matches =
+          matches.map(projectCache::get).map(this::parentOf).filter(Objects::nonNull).sorted();
+    }
+    return matches.filter(p -> perm.project(p).testOrFalse(ProjectPermission.ACCESS));
+  }
+
+  private Project.NameKey parentOf(ProjectState ps) {
+    if (ps == null) {
+      return null;
+    }
+    Project.NameKey parent = ps.getProject().getParent();
+    if (parent != null) {
+      if (projectCache.get(parent) != null) {
+        return parent;
+      }
+      logger.atWarning().log("parent project %s of project %s not found", ps.getName());
+    }
+    return null;
+  }
+
+  private boolean isParentAccessible(
+      Map<Project.NameKey, Boolean> checked, PermissionBackend.WithUser perm, ProjectState state)
+      throws PermissionBackendException {
+    Project.NameKey name = state.getNameKey();
+    Boolean b = checked.get(name);
+    if (b == null) {
+      try {
+        // Hidden projects(permitsRead = false) should only be accessible by the project owners.
+        // READ_CONFIG is checked here because it's only allowed to project owners(ACCESS may also
+        // be allowed for other users). Allowing project owners to access here will help them to
+        // view
+        // and update the config of hidden projects easily.
+        ProjectPermission permissionToCheck =
+            state.statePermitsRead() ? ProjectPermission.ACCESS : ProjectPermission.READ_CONFIG;
+        perm.project(name).check(permissionToCheck);
+        b = true;
+      } catch (AuthException denied) {
+        b = false;
+      }
+      checked.put(name, b);
+    }
+    return b;
+  }
+
+  private Stream<Project.NameKey> scan() throws BadRequestException {
+    if (matchPrefix != null) {
+      checkMatchOptions(matchSubstring == null && matchRegex == null);
+      return projectCache.byName(matchPrefix).stream();
+    } else if (matchSubstring != null) {
+      checkMatchOptions(matchPrefix == null && matchRegex == null);
+      return projectCache.all().stream()
+          .filter(
+              p -> p.get().toLowerCase(Locale.US).contains(matchSubstring.toLowerCase(Locale.US)));
+    } else if (matchRegex != null) {
+      checkMatchOptions(matchPrefix == null && matchSubstring == null);
+      RegexListSearcher<Project.NameKey> searcher;
+      try {
+        searcher = new RegexListSearcher<>(matchRegex, Project.NameKey::get);
+      } catch (IllegalArgumentException e) {
+        throw new BadRequestException(e.getMessage());
+      }
+      return searcher.search(ImmutableList.copyOf(projectCache.all()));
+    } else {
+      return projectCache.all().stream();
+    }
+  }
+
+  private static void checkMatchOptions(boolean cond) throws BadRequestException {
+    if (!cond) {
+      throw new BadRequestException("specify exactly one of p/m/r");
+    }
+  }
+
+  private void printProjectTree(
+      final PrintWriter stdout, TreeMap<Project.NameKey, ProjectNode> treeMap) {
+    final SortedSet<ProjectNode> sortedNodes = new TreeSet<>();
+
+    // Builds the inheritance tree using a list.
+    //
+    for (ProjectNode key : treeMap.values()) {
+      if (key.isAllProjects()) {
+        sortedNodes.add(key);
+        continue;
+      }
+
+      ProjectNode node = treeMap.get(key.getParentName());
+      if (node != null) {
+        node.addChild(key);
+      } else {
+        sortedNodes.add(key);
+      }
+    }
+
+    final TreeFormatter treeFormatter = new TreeFormatter(stdout);
+    treeFormatter.printTree(sortedNodes);
+    stdout.flush();
+  }
+
+  private List<Ref> getBranchRefs(Project.NameKey projectName, boolean canReadAllRefs) {
+    Ref[] result = new Ref[showBranch.size()];
+    try (Repository git = repoManager.openRepository(projectName)) {
+      PermissionBackend.ForProject perm = permissionBackend.user(currentUser).project(projectName);
+      for (int i = 0; i < showBranch.size(); i++) {
+        Ref ref = git.findRef(showBranch.get(i));
+        if (all && canReadAllRefs) {
+          result[i] = ref;
+        } else if (ref != null && ref.getObjectId() != null) {
+          try {
+            perm.ref(ref.getLeaf().getName()).check(RefPermission.READ);
+            result[i] = ref;
+          } catch (AuthException e) {
+            continue;
+          }
+        }
+      }
+    } catch (IOException | PermissionBackendException e) {
+      // Fall through and return what is available.
+    }
+    return Arrays.asList(result);
+  }
+
+  private static boolean hasValidRef(List<Ref> refs) {
+    for (Ref ref : refs) {
+      if (ref != null) {
+        return true;
+      }
+    }
+    return false;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/ListTags.java b/java/com/google/gerrit/server/restapi/project/ListTags.java
new file mode 100644
index 0000000..f59e984
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/ListTags.java
@@ -0,0 +1,235 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.project;
+
+import static com.google.gerrit.reviewdb.client.RefNames.isConfigRef;
+import static java.util.Comparator.comparing;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.gerrit.extensions.api.projects.ProjectApi.ListRefsRequest;
+import com.google.gerrit.extensions.api.projects.TagInfo;
+import com.google.gerrit.extensions.common.WebLinkInfo;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.CommonConverters;
+import com.google.gerrit.server.WebLinks;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackend.RefFilterOptions;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.project.RefFilter;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevObject;
+import org.eclipse.jgit.revwalk.RevTag;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.kohsuke.args4j.Option;
+
+public class ListTags implements RestReadView<ProjectResource> {
+  private final GitRepositoryManager repoManager;
+  private final PermissionBackend permissionBackend;
+  private final WebLinks links;
+
+  @Option(
+      name = "--limit",
+      aliases = {"-n"},
+      metaVar = "CNT",
+      usage = "maximum number of tags to list")
+  public void setLimit(int limit) {
+    this.limit = limit;
+  }
+
+  @Option(
+      name = "--start",
+      aliases = {"-S", "-s"},
+      metaVar = "CNT",
+      usage = "number of tags to skip")
+  public void setStart(int start) {
+    this.start = start;
+  }
+
+  @Option(
+      name = "--match",
+      aliases = {"-m"},
+      metaVar = "MATCH",
+      usage = "match tags substring")
+  public void setMatchSubstring(String matchSubstring) {
+    this.matchSubstring = matchSubstring;
+  }
+
+  @Option(
+      name = "--regex",
+      aliases = {"-r"},
+      metaVar = "REGEX",
+      usage = "match tags regex")
+  public void setMatchRegex(String matchRegex) {
+    this.matchRegex = matchRegex;
+  }
+
+  private int limit;
+  private int start;
+  private String matchSubstring;
+  private String matchRegex;
+
+  @Inject
+  public ListTags(
+      GitRepositoryManager repoManager, PermissionBackend permissionBackend, WebLinks webLinks) {
+    this.repoManager = repoManager;
+    this.permissionBackend = permissionBackend;
+    this.links = webLinks;
+  }
+
+  public ListTags request(ListRefsRequest<TagInfo> request) {
+    this.setLimit(request.getLimit());
+    this.setStart(request.getStart());
+    this.setMatchSubstring(request.getSubstring());
+    this.setMatchRegex(request.getRegex());
+    return this;
+  }
+
+  @Override
+  public List<TagInfo> apply(ProjectResource resource)
+      throws IOException, ResourceNotFoundException, RestApiException, PermissionBackendException {
+    resource.getProjectState().checkStatePermitsRead();
+
+    List<TagInfo> tags = new ArrayList<>();
+
+    PermissionBackend.ForProject perm =
+        permissionBackend.currentUser().project(resource.getNameKey());
+    try (Repository repo = getRepository(resource.getNameKey());
+        RevWalk rw = new RevWalk(repo)) {
+      Map<String, Ref> all =
+          visibleTags(resource.getNameKey(), repo, repo.getRefDatabase().getRefs(Constants.R_TAGS));
+      for (Ref ref : all.values()) {
+        tags.add(
+            createTagInfo(perm.ref(ref.getName()), ref, rw, resource.getProjectState(), links));
+      }
+    }
+
+    tags.sort(comparing(t -> t.ref));
+
+    return new RefFilter<TagInfo>(Constants.R_TAGS)
+        .start(start)
+        .limit(limit)
+        .subString(matchSubstring)
+        .regex(matchRegex)
+        .filter(tags);
+  }
+
+  public TagInfo get(ProjectResource resource, IdString id)
+      throws ResourceNotFoundException, IOException, PermissionBackendException {
+    try (Repository repo = getRepository(resource.getNameKey());
+        RevWalk rw = new RevWalk(repo)) {
+      String tagName = id.get();
+      if (!tagName.startsWith(Constants.R_TAGS)) {
+        tagName = Constants.R_TAGS + tagName;
+      }
+      Ref ref = repo.getRefDatabase().exactRef(tagName);
+      if (ref != null
+          && !visibleTags(resource.getNameKey(), repo, ImmutableMap.of(ref.getName(), ref))
+              .isEmpty()) {
+        return createTagInfo(
+            permissionBackend
+                .user(resource.getUser())
+                .project(resource.getNameKey())
+                .ref(ref.getName()),
+            ref,
+            rw,
+            resource.getProjectState(),
+            links);
+      }
+    }
+    throw new ResourceNotFoundException(id);
+  }
+
+  public static TagInfo createTagInfo(
+      PermissionBackend.ForRef perm, Ref ref, RevWalk rw, ProjectState projectState, WebLinks links)
+      throws IOException {
+    RevObject object = rw.parseAny(ref.getObjectId());
+
+    Boolean canDelete = null;
+    if (!isConfigRef(ref.getName())) {
+      // Never allow to delete the meta config branch.
+      canDelete =
+          perm.testOrFalse(RefPermission.DELETE) && projectState.statePermitsWrite() ? true : null;
+    }
+
+    List<WebLinkInfo> webLinks = links.getTagLinks(projectState.getName(), ref.getName());
+    if (object instanceof RevTag) {
+      // Annotated or signed tag
+      RevTag tag = (RevTag) object;
+      PersonIdent tagger = tag.getTaggerIdent();
+      return new TagInfo(
+          ref.getName(),
+          tag.getName(),
+          tag.getObject().getName(),
+          tag.getFullMessage().trim(),
+          tagger != null ? CommonConverters.toGitPerson(tagger) : null,
+          canDelete,
+          webLinks.isEmpty() ? null : webLinks,
+          tagger != null ? new Timestamp(tagger.getWhen().getTime()) : null);
+    }
+
+    Timestamp timestamp =
+        object instanceof RevCommit
+            ? new Timestamp(((RevCommit) object).getCommitterIdent().getWhen().getTime())
+            : null;
+
+    // Lightweight tag
+    return new TagInfo(
+        ref.getName(),
+        ref.getObjectId().getName(),
+        canDelete,
+        webLinks.isEmpty() ? null : webLinks,
+        timestamp);
+  }
+
+  private Repository getRepository(Project.NameKey project)
+      throws ResourceNotFoundException, IOException {
+    try {
+      return repoManager.openRepository(project);
+    } catch (RepositoryNotFoundException noGitRepository) {
+      throw new ResourceNotFoundException();
+    }
+  }
+
+  private Map<String, Ref> visibleTags(
+      Project.NameKey project, Repository repo, Map<String, Ref> tags)
+      throws PermissionBackendException {
+    return permissionBackend
+        .currentUser()
+        .project(project)
+        .filter(
+            tags,
+            repo,
+            RefFilterOptions.builder().setFilterMeta(true).setFilterTagsSeparately(true).build());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/Module.java b/java/com/google/gerrit/server/restapi/project/Module.java
new file mode 100644
index 0000000..8c8ab49
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/Module.java
@@ -0,0 +1,115 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.project;
+
+import static com.google.gerrit.server.project.BranchResource.BRANCH_KIND;
+import static com.google.gerrit.server.project.ChildProjectResource.CHILD_PROJECT_KIND;
+import static com.google.gerrit.server.project.CommitResource.COMMIT_KIND;
+import static com.google.gerrit.server.project.DashboardResource.DASHBOARD_KIND;
+import static com.google.gerrit.server.project.FileResource.FILE_KIND;
+import static com.google.gerrit.server.project.ProjectResource.PROJECT_KIND;
+import static com.google.gerrit.server.project.TagResource.TAG_KIND;
+
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.restapi.RestApiModule;
+import com.google.gerrit.server.config.GerritConfigListener;
+import com.google.gerrit.server.project.RefValidationHelper;
+import com.google.gerrit.server.restapi.change.CherryPickCommit;
+
+public class Module extends RestApiModule {
+  @Override
+  protected void configure() {
+    bind(ProjectsCollection.class);
+    bind(DashboardsCollection.class);
+
+    DynamicMap.mapOf(binder(), PROJECT_KIND);
+    DynamicMap.mapOf(binder(), CHILD_PROJECT_KIND);
+    DynamicMap.mapOf(binder(), BRANCH_KIND);
+    DynamicMap.mapOf(binder(), DASHBOARD_KIND);
+    DynamicMap.mapOf(binder(), FILE_KIND);
+    DynamicMap.mapOf(binder(), COMMIT_KIND);
+    DynamicMap.mapOf(binder(), TAG_KIND);
+
+    DynamicSet.bind(binder(), GerritConfigListener.class).to(SetParent.class);
+
+    create(PROJECT_KIND).to(CreateProject.class);
+    put(PROJECT_KIND).to(PutProject.class);
+    get(PROJECT_KIND).to(GetProject.class);
+    get(PROJECT_KIND, "description").to(GetDescription.class);
+    put(PROJECT_KIND, "description").to(PutDescription.class);
+    delete(PROJECT_KIND, "description").to(PutDescription.class);
+
+    get(PROJECT_KIND, "access").to(GetAccess.class);
+    post(PROJECT_KIND, "access").to(SetAccess.class);
+    put(PROJECT_KIND, "access:review").to(CreateAccessChange.class);
+    post(PROJECT_KIND, "check.access").to(CheckAccess.class);
+    get(PROJECT_KIND, "check.access").to(CheckAccessReadView.class);
+
+    post(PROJECT_KIND, "check").to(Check.class);
+
+    get(PROJECT_KIND, "parent").to(GetParent.class);
+    put(PROJECT_KIND, "parent").to(SetParent.class);
+
+    child(PROJECT_KIND, "children").to(ChildProjectsCollection.class);
+    get(CHILD_PROJECT_KIND).to(GetChildProject.class);
+
+    get(PROJECT_KIND, "HEAD").to(GetHead.class);
+    put(PROJECT_KIND, "HEAD").to(SetHead.class);
+
+    put(PROJECT_KIND, "ban").to(BanCommit.class);
+
+    get(PROJECT_KIND, "statistics.git").to(GetStatistics.class);
+    post(PROJECT_KIND, "gc").to(GarbageCollect.class);
+    post(PROJECT_KIND, "index").to(Index.class);
+    post(PROJECT_KIND, "index.changes").to(IndexChanges.class);
+
+    child(PROJECT_KIND, "branches").to(BranchesCollection.class);
+    create(BRANCH_KIND).to(CreateBranch.class);
+    put(BRANCH_KIND).to(PutBranch.class);
+    get(BRANCH_KIND).to(GetBranch.class);
+    delete(BRANCH_KIND).to(DeleteBranch.class);
+    post(PROJECT_KIND, "branches:delete").to(DeleteBranches.class);
+    get(BRANCH_KIND, "mergeable").to(CheckMergeability.class);
+    factory(RefValidationHelper.Factory.class);
+    get(BRANCH_KIND, "reflog").to(GetReflog.class);
+    child(BRANCH_KIND, "files").to(FilesCollection.class);
+    get(FILE_KIND, "content").to(GetContent.class);
+
+    child(PROJECT_KIND, "commits").to(CommitsCollection.class);
+    get(COMMIT_KIND).to(GetCommit.class);
+    get(COMMIT_KIND, "in").to(CommitIncludedIn.class);
+    child(COMMIT_KIND, "files").to(FilesInCommitCollection.class);
+
+    child(PROJECT_KIND, "tags").to(TagsCollection.class);
+    create(TAG_KIND).to(CreateTag.class);
+    get(TAG_KIND).to(GetTag.class);
+    put(TAG_KIND).to(PutTag.class);
+    delete(TAG_KIND).to(DeleteTag.class);
+    post(PROJECT_KIND, "tags:delete").to(DeleteTags.class);
+
+    child(PROJECT_KIND, "dashboards").to(DashboardsCollection.class);
+    create(DASHBOARD_KIND).to(CreateDashboard.class);
+    get(DASHBOARD_KIND).to(GetDashboard.class);
+    put(DASHBOARD_KIND).to(SetDashboard.class);
+    delete(DASHBOARD_KIND).to(DeleteDashboard.class);
+
+    get(PROJECT_KIND, "config").to(GetConfig.class);
+    put(PROJECT_KIND, "config").to(PutConfig.class);
+    post(COMMIT_KIND, "cherrypick").to(CherryPickCommit.class);
+
+    factory(ProjectNode.Factory.class);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/ProjectNode.java b/java/com/google/gerrit/server/restapi/project/ProjectNode.java
new file mode 100644
index 0000000..c83e473
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/ProjectNode.java
@@ -0,0 +1,87 @@
+// Copyright (C) 2011 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.google.gerrit.server.restapi.project;
+
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.util.TreeFormatter.TreeNode;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+/** Node of a Project in a tree formatted by {@link ListProjects}. */
+public class ProjectNode implements TreeNode, Comparable<ProjectNode> {
+  public interface Factory {
+    ProjectNode create(Project project, boolean isVisible);
+  }
+
+  private final AllProjectsName allProjectsName;
+  private final Project project;
+  private final boolean isVisible;
+
+  private final SortedSet<ProjectNode> children = new TreeSet<>();
+
+  @Inject
+  protected ProjectNode(
+      final AllProjectsName allProjectsName,
+      @Assisted final Project project,
+      @Assisted final boolean isVisible) {
+    this.allProjectsName = allProjectsName;
+    this.project = project;
+    this.isVisible = isVisible;
+  }
+
+  /**
+   * Returns the project parent name.
+   *
+   * @return Project parent name, {@code null} for the 'All-Projects' root project
+   */
+  Project.NameKey getParentName() {
+    return project.getParent(allProjectsName);
+  }
+
+  boolean isAllProjects() {
+    return allProjectsName.equals(project.getNameKey());
+  }
+
+  Project getProject() {
+    return project;
+  }
+
+  @Override
+  public String getDisplayName() {
+    return project.getName();
+  }
+
+  @Override
+  public boolean isVisible() {
+    return isVisible;
+  }
+
+  @Override
+  public SortedSet<? extends ProjectNode> getChildren() {
+    return children;
+  }
+
+  void addChild(ProjectNode child) {
+    children.add(child);
+  }
+
+  @Override
+  public int compareTo(ProjectNode o) {
+    return project.getNameKey().compareTo(o.project.getNameKey());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/ProjectsCollection.java b/java/com/google/gerrit/server/restapi/project/ProjectsCollection.java
new file mode 100644
index 0000000..ed317aa
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/ProjectsCollection.java
@@ -0,0 +1,175 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.project;
+
+import com.google.common.collect.ListMultimap;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.ProjectUtil;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.NeedsParams;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestCollection;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.OutputFormat;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+
+@Singleton
+public class ProjectsCollection
+    implements RestCollection<TopLevelResource, ProjectResource>, NeedsParams {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final DynamicMap<RestView<ProjectResource>> views;
+  private final Provider<ListProjects> list;
+  private final Provider<QueryProjects> queryProjects;
+  private final ProjectCache projectCache;
+  private final PermissionBackend permissionBackend;
+  private final Provider<CurrentUser> user;
+
+  private boolean hasQuery;
+
+  @Inject
+  public ProjectsCollection(
+      DynamicMap<RestView<ProjectResource>> views,
+      Provider<ListProjects> list,
+      Provider<QueryProjects> queryProjects,
+      ProjectCache projectCache,
+      PermissionBackend permissionBackend,
+      Provider<CurrentUser> user) {
+    this.views = views;
+    this.list = list;
+    this.queryProjects = queryProjects;
+    this.projectCache = projectCache;
+    this.permissionBackend = permissionBackend;
+    this.user = user;
+  }
+
+  @Override
+  public void setParams(ListMultimap<String, String> params) throws BadRequestException {
+    // The --query option is defined in QueryProjects
+    this.hasQuery = params.containsKey("query");
+  }
+
+  @Override
+  public RestView<TopLevelResource> list() {
+    if (hasQuery) {
+      return queryProjects.get();
+    }
+    return list.get().setFormat(OutputFormat.JSON);
+  }
+
+  @Override
+  public ProjectResource parse(TopLevelResource parent, IdString id)
+      throws RestApiException, IOException, PermissionBackendException {
+    ProjectResource rsrc = _parse(id.get(), true);
+    if (rsrc == null) {
+      throw new ResourceNotFoundException(id);
+    }
+    return rsrc;
+  }
+
+  /**
+   * Parses a project ID from a request body and returns the project.
+   *
+   * @param id ID of the project, can be a project name
+   * @return the project
+   * @throws RestApiException thrown if the project ID cannot be resolved or if the project is not
+   *     visible to the calling user
+   * @throws IOException thrown when there is an error.
+   * @throws PermissionBackendException
+   */
+  public ProjectResource parse(String id)
+      throws RestApiException, IOException, PermissionBackendException {
+    return parse(id, true);
+  }
+
+  /**
+   * Parses a project ID from a request body and returns the project.
+   *
+   * @param id ID of the project, can be a project name
+   * @param checkAccess if true, check the project is accessible by the current user
+   * @return the project
+   * @throws RestApiException thrown if the project ID cannot be resolved or if the project is not
+   *     visible to the calling user and checkVisibility is true.
+   * @throws IOException thrown when there is an error.
+   * @throws PermissionBackendException
+   */
+  public ProjectResource parse(String id, boolean checkAccess)
+      throws RestApiException, IOException, PermissionBackendException {
+    ProjectResource rsrc = _parse(id, checkAccess);
+    if (rsrc == null) {
+      throw new UnprocessableEntityException(String.format("Project Not Found: %s", id));
+    }
+    return rsrc;
+  }
+
+  @Nullable
+  private ProjectResource _parse(String id, boolean checkAccess)
+      throws IOException, PermissionBackendException, ResourceConflictException {
+    id = ProjectUtil.sanitizeProjectName(id);
+
+    Project.NameKey nameKey = new Project.NameKey(id);
+    ProjectState state = projectCache.checkedGet(nameKey);
+    if (state == null) {
+      return null;
+    }
+
+    logger.atFine().log("Project %s has state %s", nameKey, state.getProject().getState());
+
+    if (checkAccess) {
+      // Hidden projects(permitsRead = false) should only be accessible by the project owners.
+      // WRITE_CONFIG is checked here because it's only allowed to project owners (ACCESS may also
+      // be allowed for other users). Allowing project owners to access here will help them to view
+      // and update the config of hidden projects easily.
+      if (state.statePermitsRead()) {
+        try {
+          permissionBackend.currentUser().project(nameKey).check(ProjectPermission.ACCESS);
+        } catch (AuthException e) {
+          return null;
+        }
+      } else {
+        try {
+          permissionBackend.currentUser().project(nameKey).check(ProjectPermission.WRITE_CONFIG);
+        } catch (AuthException e) {
+          state.checkStatePermitsRead();
+        }
+      }
+    }
+    return new ProjectResource(state, user.get());
+  }
+
+  @Override
+  public DynamicMap<RestView<ProjectResource>> views() {
+    return views;
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/PutBranch.java b/java/com/google/gerrit/server/restapi/project/PutBranch.java
new file mode 100644
index 0000000..fec8abf
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/PutBranch.java
@@ -0,0 +1,31 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.project;
+
+import com.google.gerrit.extensions.api.projects.BranchInfo;
+import com.google.gerrit.extensions.api.projects.BranchInput;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.project.BranchResource;
+import com.google.inject.Singleton;
+
+@Singleton
+public class PutBranch implements RestModifyView<BranchResource, BranchInput> {
+
+  @Override
+  public BranchInfo apply(BranchResource rsrc, BranchInput input) throws ResourceConflictException {
+    throw new ResourceConflictException("Branch \"" + rsrc.getRef() + "\" already exists");
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/PutConfig.java b/java/com/google/gerrit/server/restapi/project/PutConfig.java
new file mode 100644
index 0000000..76ea0c9
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/PutConfig.java
@@ -0,0 +1,290 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.project;
+
+import com.google.common.base.Joiner;
+import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.projects.ConfigInfo;
+import com.google.gerrit.extensions.api.projects.ConfigInput;
+import com.google.gerrit.extensions.api.projects.ConfigValue;
+import com.google.gerrit.extensions.api.projects.ProjectConfigEntryType;
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.EnableSignedPush;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.PluginConfig;
+import com.google.gerrit.server.config.PluginConfigFactory;
+import com.google.gerrit.server.config.ProjectConfigEntry;
+import com.google.gerrit.server.extensions.webui.UiActions;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.project.BooleanProjectConfigTransformations;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.regex.Pattern;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+
+@Singleton
+public class PutConfig implements RestModifyView<ProjectResource, ConfigInput> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final Pattern PARAMETER_NAME_PATTERN =
+      Pattern.compile("^[a-zA-Z0-9]+[a-zA-Z0-9-]*$");
+
+  private final boolean serverEnableSignedPush;
+  private final Provider<MetaDataUpdate.User> metaDataUpdateFactory;
+  private final ProjectCache projectCache;
+  private final ProjectState.Factory projectStateFactory;
+  private final DynamicMap<ProjectConfigEntry> pluginConfigEntries;
+  private final PluginConfigFactory cfgFactory;
+  private final AllProjectsName allProjects;
+  private final UiActions uiActions;
+  private final DynamicMap<RestView<ProjectResource>> views;
+  private final Provider<CurrentUser> user;
+  private final PermissionBackend permissionBackend;
+
+  @Inject
+  PutConfig(
+      @EnableSignedPush boolean serverEnableSignedPush,
+      Provider<MetaDataUpdate.User> metaDataUpdateFactory,
+      ProjectCache projectCache,
+      ProjectState.Factory projectStateFactory,
+      DynamicMap<ProjectConfigEntry> pluginConfigEntries,
+      PluginConfigFactory cfgFactory,
+      AllProjectsName allProjects,
+      UiActions uiActions,
+      DynamicMap<RestView<ProjectResource>> views,
+      Provider<CurrentUser> user,
+      PermissionBackend permissionBackend) {
+    this.serverEnableSignedPush = serverEnableSignedPush;
+    this.metaDataUpdateFactory = metaDataUpdateFactory;
+    this.projectCache = projectCache;
+    this.projectStateFactory = projectStateFactory;
+    this.pluginConfigEntries = pluginConfigEntries;
+    this.cfgFactory = cfgFactory;
+    this.allProjects = allProjects;
+    this.uiActions = uiActions;
+    this.views = views;
+    this.user = user;
+    this.permissionBackend = permissionBackend;
+  }
+
+  @Override
+  public ConfigInfo apply(ProjectResource rsrc, ConfigInput input)
+      throws RestApiException, PermissionBackendException {
+    permissionBackend
+        .currentUser()
+        .project(rsrc.getNameKey())
+        .check(ProjectPermission.WRITE_CONFIG);
+    return apply(rsrc.getProjectState(), input);
+  }
+
+  public ConfigInfo apply(ProjectState projectState, ConfigInput input)
+      throws ResourceNotFoundException, BadRequestException, ResourceConflictException {
+    Project.NameKey projectName = projectState.getNameKey();
+    if (input == null) {
+      throw new BadRequestException("config is required");
+    }
+
+    try (MetaDataUpdate md = metaDataUpdateFactory.get().create(projectName)) {
+      ProjectConfig projectConfig = ProjectConfig.read(md);
+      Project p = projectConfig.getProject();
+
+      p.setDescription(Strings.emptyToNull(input.description));
+
+      for (BooleanProjectConfig cfg : BooleanProjectConfig.values()) {
+        InheritableBoolean val = BooleanProjectConfigTransformations.get(cfg, input);
+        if (val != null) {
+          p.setBooleanConfig(cfg, val);
+        }
+      }
+
+      if (input.maxObjectSizeLimit != null) {
+        p.setMaxObjectSizeLimit(input.maxObjectSizeLimit);
+      }
+
+      if (input.submitType != null) {
+        p.setSubmitType(input.submitType);
+      }
+
+      if (input.state != null) {
+        p.setState(input.state);
+      }
+
+      if (input.pluginConfigValues != null) {
+        setPluginConfigValues(projectState, projectConfig, input.pluginConfigValues);
+      }
+
+      md.setMessage("Modified project settings\n");
+      try {
+        projectConfig.commit(md);
+        projectCache.evict(projectConfig.getProject());
+        md.getRepository().setGitwebDescription(p.getDescription());
+      } catch (IOException e) {
+        if (e.getCause() instanceof ConfigInvalidException) {
+          throw new ResourceConflictException(
+              "Cannot update " + projectName + ": " + e.getCause().getMessage());
+        }
+        logger.atWarning().withCause(e).log("Failed to update config of project %s.", projectName);
+        throw new ResourceConflictException("Cannot update " + projectName);
+      }
+
+      ProjectState state = projectStateFactory.create(ProjectConfig.read(md));
+      return new ConfigInfoImpl(
+          serverEnableSignedPush,
+          state,
+          user.get(),
+          pluginConfigEntries,
+          cfgFactory,
+          allProjects,
+          uiActions,
+          views);
+    } catch (RepositoryNotFoundException notFound) {
+      throw new ResourceNotFoundException(projectName.get());
+    } catch (ConfigInvalidException err) {
+      throw new ResourceConflictException("Cannot read project " + projectName, err);
+    } catch (IOException err) {
+      throw new ResourceConflictException("Cannot update project " + projectName, err);
+    }
+  }
+
+  private void setPluginConfigValues(
+      ProjectState projectState,
+      ProjectConfig projectConfig,
+      Map<String, Map<String, ConfigValue>> pluginConfigValues)
+      throws BadRequestException {
+    for (Entry<String, Map<String, ConfigValue>> e : pluginConfigValues.entrySet()) {
+      String pluginName = e.getKey();
+      PluginConfig cfg = projectConfig.getPluginConfig(pluginName);
+      for (Entry<String, ConfigValue> v : e.getValue().entrySet()) {
+        ProjectConfigEntry projectConfigEntry = pluginConfigEntries.get(pluginName, v.getKey());
+        if (projectConfigEntry != null) {
+          if (!PARAMETER_NAME_PATTERN.matcher(v.getKey()).matches()) {
+            // TODO check why we have this restriction
+            logger.atWarning().log(
+                "Parameter name '%s' must match '%s'",
+                v.getKey(), PARAMETER_NAME_PATTERN.pattern());
+            continue;
+          }
+          String oldValue = cfg.getString(v.getKey());
+          String value = v.getValue().value;
+          if (projectConfigEntry.getType() == ProjectConfigEntryType.ARRAY) {
+            List<String> l = Arrays.asList(cfg.getStringList(v.getKey()));
+            oldValue = Joiner.on("\n").join(l);
+            value = Joiner.on("\n").join(v.getValue().values);
+          }
+          if (Strings.emptyToNull(value) != null) {
+            if (!value.equals(oldValue)) {
+              validateProjectConfigEntryIsEditable(
+                  projectConfigEntry, projectState, v.getKey(), pluginName);
+              v.setValue(projectConfigEntry.preUpdate(v.getValue()));
+              value = v.getValue().value;
+              try {
+                switch (projectConfigEntry.getType()) {
+                  case BOOLEAN:
+                    boolean newBooleanValue = Boolean.parseBoolean(value);
+                    cfg.setBoolean(v.getKey(), newBooleanValue);
+                    break;
+                  case INT:
+                    int newIntValue = Integer.parseInt(value);
+                    cfg.setInt(v.getKey(), newIntValue);
+                    break;
+                  case LONG:
+                    long newLongValue = Long.parseLong(value);
+                    cfg.setLong(v.getKey(), newLongValue);
+                    break;
+                  case LIST:
+                    if (!projectConfigEntry.getPermittedValues().contains(value)) {
+                      throw new BadRequestException(
+                          String.format(
+                              "The value '%s' is not permitted for parameter '%s' of plugin '"
+                                  + pluginName
+                                  + "'",
+                              value,
+                              v.getKey()));
+                    }
+                    // $FALL-THROUGH$
+                  case STRING:
+                    cfg.setString(v.getKey(), value);
+                    break;
+                  case ARRAY:
+                    cfg.setStringList(v.getKey(), v.getValue().values);
+                    break;
+                  default:
+                    logger.atWarning().log(
+                        "The type '%s' of parameter '%s' is not supported.",
+                        projectConfigEntry.getType().name(), v.getKey());
+                }
+              } catch (NumberFormatException ex) {
+                throw new BadRequestException(
+                    String.format(
+                        "The value '%s' of config parameter '%s' of plugin '%s' is invalid: %s",
+                        v.getValue(), v.getKey(), pluginName, ex.getMessage()));
+              }
+            }
+          } else {
+            if (oldValue != null) {
+              validateProjectConfigEntryIsEditable(
+                  projectConfigEntry, projectState, v.getKey(), pluginName);
+              cfg.unset(v.getKey());
+            }
+          }
+        } else {
+          throw new BadRequestException(
+              String.format(
+                  "The config parameter '%s' of plugin '%s' does not exist.",
+                  v.getKey(), pluginName));
+        }
+      }
+    }
+  }
+
+  private static void validateProjectConfigEntryIsEditable(
+      ProjectConfigEntry projectConfigEntry,
+      ProjectState projectState,
+      String parameterName,
+      String pluginName)
+      throws BadRequestException {
+    if (!projectConfigEntry.isEditable(projectState)) {
+      throw new BadRequestException(
+          String.format(
+              "Not allowed to set parameter '%s' of plugin '%s' on project '%s'.",
+              parameterName, pluginName, projectState.getName()));
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/PutDescription.java b/java/com/google/gerrit/server/restapi/project/PutDescription.java
new file mode 100644
index 0000000..1c74021
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/PutDescription.java
@@ -0,0 +1,97 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.project;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.api.projects.DescriptionInput;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+
+@Singleton
+public class PutDescription implements RestModifyView<ProjectResource, DescriptionInput> {
+  private final ProjectCache cache;
+  private final MetaDataUpdate.Server updateFactory;
+  private final PermissionBackend permissionBackend;
+
+  @Inject
+  PutDescription(
+      ProjectCache cache,
+      MetaDataUpdate.Server updateFactory,
+      PermissionBackend permissionBackend) {
+    this.cache = cache;
+    this.updateFactory = updateFactory;
+    this.permissionBackend = permissionBackend;
+  }
+
+  @Override
+  public Response<String> apply(ProjectResource resource, DescriptionInput input)
+      throws AuthException, ResourceConflictException, ResourceNotFoundException, IOException,
+          PermissionBackendException {
+    if (input == null) {
+      input = new DescriptionInput(); // Delete would set description to null.
+    }
+
+    IdentifiedUser user = resource.getUser().asIdentifiedUser();
+    permissionBackend
+        .user(user)
+        .project(resource.getNameKey())
+        .check(ProjectPermission.WRITE_CONFIG);
+
+    try (MetaDataUpdate md = updateFactory.create(resource.getNameKey())) {
+      ProjectConfig config = ProjectConfig.read(md);
+      Project project = config.getProject();
+      project.setDescription(Strings.emptyToNull(input.description));
+
+      String msg =
+          MoreObjects.firstNonNull(
+              Strings.emptyToNull(input.commitMessage), "Updated description.\n");
+      if (!msg.endsWith("\n")) {
+        msg += "\n";
+      }
+      md.setAuthor(user);
+      md.setMessage(msg);
+      config.commit(md);
+      cache.evict(resource.getProjectState().getProject());
+      md.getRepository().setGitwebDescription(project.getDescription());
+
+      return Strings.isNullOrEmpty(project.getDescription())
+          ? Response.<String>none()
+          : Response.ok(project.getDescription());
+    } catch (RepositoryNotFoundException notFound) {
+      throw new ResourceNotFoundException(resource.getName());
+    } catch (ConfigInvalidException e) {
+      throw new ResourceConflictException(
+          String.format("invalid project.config: %s", e.getMessage()));
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/PutProject.java b/java/com/google/gerrit/server/restapi/project/PutProject.java
new file mode 100644
index 0000000..5b11143
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/PutProject.java
@@ -0,0 +1,31 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.project;
+
+import com.google.gerrit.extensions.api.projects.ProjectInput;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.inject.Singleton;
+
+@Singleton
+public class PutProject implements RestModifyView<ProjectResource, ProjectInput> {
+  @Override
+  public Response<?> apply(ProjectResource resource, ProjectInput input)
+      throws ResourceConflictException {
+    throw new ResourceConflictException("Project \"" + resource.getName() + "\" already exists");
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/PutTag.java b/java/com/google/gerrit/server/restapi/project/PutTag.java
new file mode 100644
index 0000000..06c5157
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/PutTag.java
@@ -0,0 +1,29 @@
+// 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.
+
+package com.google.gerrit.server.restapi.project;
+
+import com.google.gerrit.extensions.api.projects.TagInfo;
+import com.google.gerrit.extensions.api.projects.TagInput;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.project.TagResource;
+
+public class PutTag implements RestModifyView<TagResource, TagInput> {
+
+  @Override
+  public TagInfo apply(TagResource resource, TagInput input) throws ResourceConflictException {
+    throw new ResourceConflictException("Tag \"" + resource.getTagInfo().ref + "\" already exists");
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/QueryProjects.java b/java/com/google/gerrit/server/restapi/project/QueryProjects.java
new file mode 100644
index 0000000..44432aa
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/QueryProjects.java
@@ -0,0 +1,127 @@
+// Copyright (C) 2017 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.google.gerrit.server.restapi.project;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.index.project.ProjectData;
+import com.google.gerrit.index.project.ProjectIndex;
+import com.google.gerrit.index.project.ProjectIndexCollection;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.index.query.QueryResult;
+import com.google.gerrit.server.project.ProjectJson;
+import com.google.gerrit.server.query.project.ProjectQueryBuilder;
+import com.google.gerrit.server.query.project.ProjectQueryProcessor;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.util.ArrayList;
+import java.util.List;
+import org.kohsuke.args4j.Option;
+
+public class QueryProjects implements RestReadView<TopLevelResource> {
+  private final ProjectIndexCollection indexes;
+  private final ProjectQueryBuilder queryBuilder;
+  private final ProjectQueryProcessor queryProcessor;
+  private final ProjectJson json;
+
+  private String query;
+  private int limit;
+  private int start;
+
+  @Option(
+      name = "--query",
+      aliases = {"-q"},
+      usage = "project query")
+  public QueryProjects withQuery(String query) {
+    this.query = query;
+    return this;
+  }
+
+  @Option(
+      name = "--limit",
+      aliases = {"-n"},
+      metaVar = "CNT",
+      usage = "maximum number of projects to list")
+  public QueryProjects withLimit(int limit) {
+    this.limit = limit;
+    return this;
+  }
+
+  @Option(
+      name = "--start",
+      aliases = {"-S"},
+      metaVar = "CNT",
+      usage = "number of projects to skip")
+  public QueryProjects withStart(int start) {
+    this.start = start;
+    return this;
+  }
+
+  @Inject
+  protected QueryProjects(
+      ProjectIndexCollection indexes,
+      ProjectQueryBuilder queryBuilder,
+      ProjectQueryProcessor queryProcessor,
+      ProjectJson json) {
+    this.indexes = indexes;
+    this.queryBuilder = queryBuilder;
+    this.queryProcessor = queryProcessor;
+    this.json = json;
+  }
+
+  @Override
+  public List<ProjectInfo> apply(TopLevelResource resource)
+      throws BadRequestException, MethodNotAllowedException, OrmException {
+    return apply();
+  }
+
+  public List<ProjectInfo> apply()
+      throws BadRequestException, MethodNotAllowedException, OrmException {
+    if (Strings.isNullOrEmpty(query)) {
+      throw new BadRequestException("missing query field");
+    }
+
+    ProjectIndex searchIndex = indexes.getSearchIndex();
+    if (searchIndex == null) {
+      throw new MethodNotAllowedException("no project index");
+    }
+
+    if (start != 0) {
+      queryProcessor.setStart(start);
+    }
+
+    if (limit != 0) {
+      queryProcessor.setUserProvidedLimit(limit);
+    }
+
+    try {
+      QueryResult<ProjectData> result = queryProcessor.query(queryBuilder.parse(query));
+      List<ProjectData> pds = result.entities();
+
+      ArrayList<ProjectInfo> projectInfos = Lists.newArrayListWithCapacity(pds.size());
+      for (ProjectData pd : pds) {
+        projectInfos.add(json.format(pd.getProject()));
+      }
+      return projectInfos;
+    } catch (QueryParseException e) {
+      throw new BadRequestException(e.getMessage());
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/RepositoryStatistics.java b/java/com/google/gerrit/server/restapi/project/RepositoryStatistics.java
new file mode 100644
index 0000000..2a2fc866
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/RepositoryStatistics.java
@@ -0,0 +1,32 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.project;
+
+import com.google.common.base.CaseFormat;
+import java.util.Map.Entry;
+import java.util.Properties;
+import java.util.TreeMap;
+
+public class RepositoryStatistics extends TreeMap<String, Object> {
+  private static final long serialVersionUID = 1L;
+
+  RepositoryStatistics(Properties p) {
+    for (Entry<Object, Object> e : p.entrySet()) {
+      put(
+          CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, e.getKey().toString()),
+          e.getValue());
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/SetAccess.java b/java/com/google/gerrit/server/restapi/project/SetAccess.java
new file mode 100644
index 0000000..c9d69a5
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/SetAccess.java
@@ -0,0 +1,142 @@
+// 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.
+
+package com.google.gerrit.server.restapi.project;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Iterables;
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.errors.InvalidNameException;
+import com.google.gerrit.extensions.api.access.ProjectAccessInfo;
+import com.google.gerrit.extensions.api.access.ProjectAccessInput;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.CreateGroupPermissionSyncer;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.List;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+@Singleton
+public class SetAccess implements RestModifyView<ProjectResource, ProjectAccessInput> {
+  protected final GroupBackend groupBackend;
+  private final PermissionBackend permissionBackend;
+  private final Provider<MetaDataUpdate.User> metaDataUpdateFactory;
+  private final GetAccess getAccess;
+  private final ProjectCache projectCache;
+  private final Provider<IdentifiedUser> identifiedUser;
+  private final SetAccessUtil accessUtil;
+  private final CreateGroupPermissionSyncer createGroupPermissionSyncer;
+
+  @Inject
+  private SetAccess(
+      GroupBackend groupBackend,
+      PermissionBackend permissionBackend,
+      Provider<MetaDataUpdate.User> metaDataUpdateFactory,
+      ProjectCache projectCache,
+      GetAccess getAccess,
+      Provider<IdentifiedUser> identifiedUser,
+      SetAccessUtil accessUtil,
+      CreateGroupPermissionSyncer createGroupPermissionSyncer) {
+    this.groupBackend = groupBackend;
+    this.permissionBackend = permissionBackend;
+    this.metaDataUpdateFactory = metaDataUpdateFactory;
+    this.getAccess = getAccess;
+    this.projectCache = projectCache;
+    this.identifiedUser = identifiedUser;
+    this.accessUtil = accessUtil;
+    this.createGroupPermissionSyncer = createGroupPermissionSyncer;
+  }
+
+  @Override
+  public ProjectAccessInfo apply(ProjectResource rsrc, ProjectAccessInput input)
+      throws ResourceNotFoundException, ResourceConflictException, IOException, AuthException,
+          BadRequestException, UnprocessableEntityException, OrmException,
+          PermissionBackendException {
+    MetaDataUpdate.User metaDataUpdateUser = metaDataUpdateFactory.get();
+
+    ProjectConfig config;
+
+    List<AccessSection> removals = accessUtil.getAccessSections(input.remove);
+    List<AccessSection> additions = accessUtil.getAccessSections(input.add);
+    try (MetaDataUpdate md = metaDataUpdateUser.create(rsrc.getNameKey())) {
+      config = ProjectConfig.read(md);
+
+      // Check that the user has the right permissions.
+      boolean checkedAdmin = false;
+      for (AccessSection section : Iterables.concat(additions, removals)) {
+        boolean isGlobalCapabilities = AccessSection.GLOBAL_CAPABILITIES.equals(section.getName());
+        if (isGlobalCapabilities) {
+          if (!checkedAdmin) {
+            permissionBackend.currentUser().check(GlobalPermission.ADMINISTRATE_SERVER);
+            checkedAdmin = true;
+          }
+        } else {
+          permissionBackend
+              .currentUser()
+              .project(rsrc.getNameKey())
+              .ref(section.getName())
+              .check(RefPermission.WRITE_CONFIG);
+        }
+      }
+
+      accessUtil.validateChanges(config, removals, additions);
+      accessUtil.applyChanges(config, removals, additions);
+
+      accessUtil.setParentName(
+          identifiedUser.get(),
+          config,
+          rsrc.getNameKey(),
+          input.parent == null ? null : new Project.NameKey(input.parent),
+          !checkedAdmin);
+
+      if (!Strings.isNullOrEmpty(input.message)) {
+        if (!input.message.endsWith("\n")) {
+          input.message += "\n";
+        }
+        md.setMessage(input.message);
+      } else {
+        md.setMessage("Modify access rules\n");
+      }
+
+      config.commit(md);
+      projectCache.evict(config.getProject());
+      createGroupPermissionSyncer.syncIfNeeded();
+    } catch (InvalidNameException e) {
+      throw new BadRequestException(e.toString());
+    } catch (ConfigInvalidException e) {
+      throw new ResourceConflictException(rsrc.getName());
+    }
+
+    return getAccess.apply(rsrc.getNameKey());
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/SetAccessUtil.java b/java/com/google/gerrit/server/restapi/project/SetAccessUtil.java
new file mode 100644
index 0000000..c8857a2
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/SetAccessUtil.java
@@ -0,0 +1,250 @@
+// Copyright (C) 2017 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.google.gerrit.server.restapi.project;
+
+import com.google.common.collect.Iterables;
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.common.data.PermissionRule;
+import com.google.gerrit.common.errors.InvalidNameException;
+import com.google.gerrit.extensions.api.access.AccessSectionInfo;
+import com.google.gerrit.extensions.api.access.PermissionInfo;
+import com.google.gerrit.extensions.api.access.PermissionRuleInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.group.GroupResolver;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.server.project.RefPattern;
+import com.google.gerrit.server.restapi.config.ListCapabilities;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+@Singleton
+public class SetAccessUtil {
+  private final GroupResolver groupResolver;
+  private final AllProjectsName allProjects;
+  private final Provider<SetParent> setParent;
+  private final ListCapabilities listCapabilities;
+
+  @Inject
+  private SetAccessUtil(
+      GroupResolver groupResolver,
+      AllProjectsName allProjects,
+      Provider<SetParent> setParent,
+      ListCapabilities listCapabilities) {
+    this.groupResolver = groupResolver;
+    this.allProjects = allProjects;
+    this.setParent = setParent;
+    this.listCapabilities = listCapabilities;
+  }
+
+  List<AccessSection> getAccessSections(Map<String, AccessSectionInfo> sectionInfos)
+      throws UnprocessableEntityException {
+    if (sectionInfos == null) {
+      return Collections.emptyList();
+    }
+
+    List<AccessSection> sections = new ArrayList<>(sectionInfos.size());
+    for (Map.Entry<String, AccessSectionInfo> entry : sectionInfos.entrySet()) {
+      if (entry.getValue().permissions == null) {
+        continue;
+      }
+
+      AccessSection accessSection = new AccessSection(entry.getKey());
+      for (Map.Entry<String, PermissionInfo> permissionEntry :
+          entry.getValue().permissions.entrySet()) {
+        if (permissionEntry.getValue().rules == null) {
+          continue;
+        }
+
+        Permission p = new Permission(permissionEntry.getKey());
+        if (permissionEntry.getValue().exclusive != null) {
+          p.setExclusiveGroup(permissionEntry.getValue().exclusive);
+        }
+
+        for (Map.Entry<String, PermissionRuleInfo> permissionRuleInfoEntry :
+            permissionEntry.getValue().rules.entrySet()) {
+          GroupDescription.Basic group = groupResolver.parseId(permissionRuleInfoEntry.getKey());
+          if (group == null) {
+            throw new UnprocessableEntityException(
+                permissionRuleInfoEntry.getKey() + " is not a valid group ID");
+          }
+
+          PermissionRuleInfo pri = permissionRuleInfoEntry.getValue();
+          PermissionRule r = new PermissionRule(GroupReference.forGroup(group));
+          if (pri != null) {
+            if (pri.max != null) {
+              r.setMax(pri.max);
+            }
+            if (pri.min != null) {
+              r.setMin(pri.min);
+            }
+            if (pri.action != null) {
+              r.setAction(GetAccess.ACTION_TYPE.inverse().get(pri.action));
+            }
+            if (pri.force != null) {
+              r.setForce(pri.force);
+            }
+          }
+          p.add(r);
+        }
+        accessSection.addPermission(p);
+      }
+      sections.add(accessSection);
+    }
+    return sections;
+  }
+
+  /**
+   * Checks that the removals and additions are logically valid, but doesn't check current user's
+   * permission.
+   */
+  void validateChanges(
+      ProjectConfig config, List<AccessSection> removals, List<AccessSection> additions)
+      throws BadRequestException, InvalidNameException {
+    // Perform permission checks
+    for (AccessSection section : Iterables.concat(additions, removals)) {
+      boolean isGlobalCapabilities = AccessSection.GLOBAL_CAPABILITIES.equals(section.getName());
+      if (isGlobalCapabilities) {
+        if (!allProjects.equals(config.getName())) {
+          throw new BadRequestException(
+              "Cannot edit global capabilities for projects other than " + allProjects.get());
+        }
+      }
+    }
+
+    // Perform addition checks
+    for (AccessSection section : additions) {
+      String name = section.getName();
+      boolean isGlobalCapabilities = AccessSection.GLOBAL_CAPABILITIES.equals(name);
+
+      if (!isGlobalCapabilities) {
+        if (!AccessSection.isValid(name)) {
+          throw new BadRequestException("invalid section name");
+        }
+        RefPattern.validate(name);
+      } else {
+        // Check all permissions for soundness
+        for (Permission p : section.getPermissions()) {
+          if (!isCapability(p.getName())) {
+            throw new BadRequestException(
+                "Cannot add non-global capability " + p.getName() + " to global capabilities");
+          }
+        }
+      }
+    }
+  }
+
+  void applyChanges(
+      ProjectConfig config, List<AccessSection> removals, List<AccessSection> additions) {
+    // Apply removals
+    for (AccessSection section : removals) {
+      if (section.getPermissions().isEmpty()) {
+        // Remove entire section
+        config.remove(config.getAccessSection(section.getName()));
+        continue;
+      }
+
+      // Remove specific permissions
+      for (Permission p : section.getPermissions()) {
+        if (p.getRules().isEmpty()) {
+          config.remove(config.getAccessSection(section.getName()), p);
+        } else {
+          for (PermissionRule r : p.getRules()) {
+            config.remove(config.getAccessSection(section.getName()), p, r);
+          }
+        }
+      }
+    }
+
+    // Apply additions
+    for (AccessSection section : additions) {
+      AccessSection currentAccessSection = config.getAccessSection(section.getName());
+
+      if (currentAccessSection == null) {
+        // Add AccessSection
+        config.replace(section);
+      } else {
+        for (Permission p : section.getPermissions()) {
+          Permission currentPermission = currentAccessSection.getPermission(p.getName());
+          if (currentPermission == null) {
+            // Add Permission
+            currentAccessSection.addPermission(p);
+          } else {
+            for (PermissionRule r : p.getRules()) {
+              // AddPermissionRule
+              currentPermission.add(r);
+            }
+          }
+        }
+      }
+    }
+  }
+
+  /**
+   * Updates the parent project in the given config.
+   *
+   * @param identifiedUser the user
+   * @param config the config to modify
+   * @param projectName the project for which to change access.
+   * @param newParentProjectName the new parent to set; passing null will make this a nop
+   * @param checkAdmin if set, verify that user has administrateServer permission
+   */
+  public void setParentName(
+      IdentifiedUser identifiedUser,
+      ProjectConfig config,
+      Project.NameKey projectName,
+      Project.NameKey newParentProjectName,
+      boolean checkAdmin)
+      throws ResourceConflictException, AuthException, PermissionBackendException,
+          BadRequestException {
+    if (newParentProjectName != null
+        && !config.getProject().getNameKey().equals(allProjects)
+        && !config.getProject().getParent(allProjects).equals(newParentProjectName)) {
+      try {
+        setParent
+            .get()
+            .validateParentUpdate(
+                projectName, identifiedUser, newParentProjectName.get(), checkAdmin);
+      } catch (UnprocessableEntityException e) {
+        throw new ResourceConflictException(e.getMessage(), e);
+      }
+      config.getProject().setParentName(newParentProjectName);
+    }
+  }
+
+  private boolean isCapability(String name) {
+    if (GlobalCapability.isGlobalCapability(name)) {
+      return true;
+    }
+    Set<String> pluginCapabilities = listCapabilities.collectPluginCapabilities().keySet();
+    return pluginCapabilities.contains(name);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/SetDashboard.java b/java/com/google/gerrit/server/restapi/project/SetDashboard.java
new file mode 100644
index 0000000..2804b7c
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/SetDashboard.java
@@ -0,0 +1,49 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.project;
+
+import com.google.gerrit.extensions.api.projects.DashboardInfo;
+import com.google.gerrit.extensions.api.projects.SetDashboardInput;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.DashboardResource;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+
+@Singleton
+public class SetDashboard implements RestModifyView<DashboardResource, SetDashboardInput> {
+  private final Provider<SetDefaultDashboard> defaultSetter;
+
+  @Inject
+  SetDashboard(Provider<SetDefaultDashboard> defaultSetter) {
+    this.defaultSetter = defaultSetter;
+  }
+
+  @Override
+  public Response<DashboardInfo> apply(DashboardResource resource, SetDashboardInput input)
+      throws RestApiException, IOException, PermissionBackendException {
+    if (resource.isProjectDefault()) {
+      return defaultSetter.get().apply(resource, input);
+    }
+
+    // TODO: Implement creation/update of dashboards by API.
+    throw new MethodNotAllowedException();
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/SetDefaultDashboard.java b/java/com/google/gerrit/server/restapi/project/SetDefaultDashboard.java
new file mode 100644
index 0000000..ef292e5
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/SetDefaultDashboard.java
@@ -0,0 +1,131 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.project;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.api.projects.DashboardInfo;
+import com.google.gerrit.extensions.api.projects.SetDashboardInput;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.project.DashboardResource;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.kohsuke.args4j.Option;
+
+class SetDefaultDashboard implements RestModifyView<DashboardResource, SetDashboardInput> {
+  private final ProjectCache cache;
+  private final MetaDataUpdate.Server updateFactory;
+  private final DashboardsCollection dashboards;
+  private final Provider<GetDashboard> get;
+  private final PermissionBackend permissionBackend;
+
+  @Option(name = "--inherited", usage = "set dashboard inherited by children")
+  boolean inherited;
+
+  @Inject
+  SetDefaultDashboard(
+      ProjectCache cache,
+      MetaDataUpdate.Server updateFactory,
+      DashboardsCollection dashboards,
+      Provider<GetDashboard> get,
+      PermissionBackend permissionBackend) {
+    this.cache = cache;
+    this.updateFactory = updateFactory;
+    this.dashboards = dashboards;
+    this.get = get;
+    this.permissionBackend = permissionBackend;
+  }
+
+  @Override
+  public Response<DashboardInfo> apply(DashboardResource rsrc, SetDashboardInput input)
+      throws RestApiException, IOException, PermissionBackendException {
+    if (input == null) {
+      input = new SetDashboardInput(); // Delete would set input to null.
+    }
+    input.id = Strings.emptyToNull(input.id);
+
+    permissionBackend
+        .user(rsrc.getUser())
+        .project(rsrc.getProjectState().getNameKey())
+        .check(ProjectPermission.WRITE_CONFIG);
+
+    DashboardResource target = null;
+    if (input.id != null) {
+      try {
+        target =
+            dashboards.parse(
+                new ProjectResource(rsrc.getProjectState(), rsrc.getUser()),
+                IdString.fromUrl(input.id));
+      } catch (ResourceNotFoundException e) {
+        throw new BadRequestException("dashboard " + input.id + " not found");
+      } catch (ConfigInvalidException e) {
+        throw new ResourceConflictException(e.getMessage());
+      }
+    }
+
+    try (MetaDataUpdate md = updateFactory.create(rsrc.getProjectState().getNameKey())) {
+      ProjectConfig config = ProjectConfig.read(md);
+      Project project = config.getProject();
+      if (inherited) {
+        project.setDefaultDashboard(input.id);
+      } else {
+        project.setLocalDefaultDashboard(input.id);
+      }
+
+      String msg =
+          MoreObjects.firstNonNull(
+              Strings.emptyToNull(input.commitMessage),
+              input.id == null
+                  ? "Removed default dashboard.\n"
+                  : String.format("Changed default dashboard to %s.\n", input.id));
+      if (!msg.endsWith("\n")) {
+        msg += "\n";
+      }
+      md.setAuthor(rsrc.getUser().asIdentifiedUser());
+      md.setMessage(msg);
+      config.commit(md);
+      cache.evict(rsrc.getProjectState().getProject());
+
+      if (target != null) {
+        DashboardInfo info = get.get().apply(target);
+        info.isDefault = true;
+        return Response.ok(info);
+      }
+      return Response.none();
+    } catch (RepositoryNotFoundException notFound) {
+      throw new ResourceNotFoundException(rsrc.getProjectState().getProject().getName());
+    } catch (ConfigInvalidException e) {
+      throw new ResourceConflictException(
+          String.format("invalid project.config: %s", e.getMessage()));
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/SetHead.java b/java/com/google/gerrit/server/restapi/project/SetHead.java
new file mode 100644
index 0000000..b310f16
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/SetHead.java
@@ -0,0 +1,153 @@
+// Copyright (C) 2013 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.google.gerrit.server.restapi.project;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.api.projects.HeadInput;
+import com.google.gerrit.extensions.events.HeadUpdatedListener;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.extensions.events.AbstractNoNotifyEvent;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.Map;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.Repository;
+
+@Singleton
+public class SetHead implements RestModifyView<ProjectResource, HeadInput> {
+  private final GitRepositoryManager repoManager;
+  private final Provider<IdentifiedUser> identifiedUser;
+  private final PluginSetContext<HeadUpdatedListener> headUpdatedListeners;
+  private final PermissionBackend permissionBackend;
+
+  @Inject
+  SetHead(
+      GitRepositoryManager repoManager,
+      Provider<IdentifiedUser> identifiedUser,
+      PluginSetContext<HeadUpdatedListener> headUpdatedListeners,
+      PermissionBackend permissionBackend) {
+    this.repoManager = repoManager;
+    this.identifiedUser = identifiedUser;
+    this.headUpdatedListeners = headUpdatedListeners;
+    this.permissionBackend = permissionBackend;
+  }
+
+  @Override
+  public String apply(ProjectResource rsrc, HeadInput input)
+      throws AuthException, ResourceNotFoundException, BadRequestException,
+          UnprocessableEntityException, IOException, PermissionBackendException {
+    if (input == null || Strings.isNullOrEmpty(input.ref)) {
+      throw new BadRequestException("ref required");
+    }
+    String ref = RefNames.fullName(input.ref);
+
+    permissionBackend
+        .user(rsrc.getUser())
+        .project(rsrc.getNameKey())
+        .ref(ref)
+        .check(RefPermission.SET_HEAD);
+
+    try (Repository repo = repoManager.openRepository(rsrc.getNameKey())) {
+      Map<String, Ref> cur = repo.getRefDatabase().exactRef(Constants.HEAD, ref);
+      if (!cur.containsKey(ref)) {
+        throw new UnprocessableEntityException(String.format("Ref Not Found: %s", ref));
+      }
+
+      final String oldHead = cur.get(Constants.HEAD).getTarget().getName();
+      final String newHead = ref;
+      if (!oldHead.equals(newHead)) {
+        final RefUpdate u = repo.updateRef(Constants.HEAD, true);
+        u.setRefLogIdent(identifiedUser.get().newRefLogIdent());
+        RefUpdate.Result res = u.link(newHead);
+        switch (res) {
+          case NO_CHANGE:
+          case RENAMED:
+          case FORCED:
+          case NEW:
+            break;
+          case FAST_FORWARD:
+          case IO_FAILURE:
+          case LOCK_FAILURE:
+          case NOT_ATTEMPTED:
+          case REJECTED:
+          case REJECTED_CURRENT_BRANCH:
+          case REJECTED_MISSING_OBJECT:
+          case REJECTED_OTHER_REASON:
+          default:
+            throw new IOException("Setting HEAD failed with " + res);
+        }
+
+        fire(rsrc.getNameKey(), oldHead, newHead);
+      }
+      return ref;
+    } catch (RepositoryNotFoundException e) {
+      throw new ResourceNotFoundException(rsrc.getName());
+    }
+  }
+
+  private void fire(Project.NameKey nameKey, String oldHead, String newHead) {
+    if (headUpdatedListeners.isEmpty()) {
+      return;
+    }
+
+    Event event = new Event(nameKey, oldHead, newHead);
+    headUpdatedListeners.runEach(l -> l.onHeadUpdated(event));
+  }
+
+  static class Event extends AbstractNoNotifyEvent implements HeadUpdatedListener.Event {
+    private final Project.NameKey nameKey;
+    private final String oldHead;
+    private final String newHead;
+
+    Event(Project.NameKey nameKey, String oldHead, String newHead) {
+      this.nameKey = nameKey;
+      this.oldHead = oldHead;
+      this.newHead = newHead;
+    }
+
+    @Override
+    public String getProjectName() {
+      return nameKey.get();
+    }
+
+    @Override
+    public String getOldHeadName() {
+      return oldHead;
+    }
+
+    @Override
+    public String getNewHeadName() {
+      return newHead;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/SetParent.java b/java/com/google/gerrit/server/restapi/project/SetParent.java
new file mode 100644
index 0000000..d02d04a
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/SetParent.java
@@ -0,0 +1,190 @@
+// Copyright (C) 2012 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.google.gerrit.server.restapi.project;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Multimap;
+import com.google.gerrit.extensions.api.projects.ParentInput;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.ConfigKey;
+import com.google.gerrit.server.config.ConfigUpdatedEvent;
+import com.google.gerrit.server.config.ConfigUpdatedEvent.ConfigUpdateEntry;
+import com.google.gerrit.server.config.ConfigUpdatedEvent.UpdateResult;
+import com.google.gerrit.server.config.GerritConfigListener;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.Config;
+
+@Singleton
+public class SetParent
+    implements RestModifyView<ProjectResource, ParentInput>, GerritConfigListener {
+  private final ProjectCache cache;
+  private final PermissionBackend permissionBackend;
+  private final MetaDataUpdate.Server updateFactory;
+  private final AllProjectsName allProjects;
+  private final AllUsersName allUsers;
+  private volatile boolean allowProjectOwnersToChangeParent;
+
+  @Inject
+  SetParent(
+      ProjectCache cache,
+      PermissionBackend permissionBackend,
+      MetaDataUpdate.Server updateFactory,
+      AllProjectsName allProjects,
+      AllUsersName allUsers,
+      @GerritServerConfig Config config) {
+    this.cache = cache;
+    this.permissionBackend = permissionBackend;
+    this.updateFactory = updateFactory;
+    this.allProjects = allProjects;
+    this.allUsers = allUsers;
+    this.allowProjectOwnersToChangeParent =
+        config.getBoolean("receive", "allowProjectOwnersToChangeParent", false);
+  }
+
+  @Override
+  public String apply(ProjectResource rsrc, ParentInput input)
+      throws AuthException, ResourceConflictException, ResourceNotFoundException,
+          UnprocessableEntityException, IOException, PermissionBackendException,
+          BadRequestException {
+    return apply(rsrc, input, true);
+  }
+
+  public String apply(ProjectResource rsrc, ParentInput input, boolean checkIfAdmin)
+      throws AuthException, ResourceConflictException, ResourceNotFoundException,
+          UnprocessableEntityException, IOException, PermissionBackendException,
+          BadRequestException {
+    IdentifiedUser user = rsrc.getUser().asIdentifiedUser();
+    String parentName =
+        MoreObjects.firstNonNull(Strings.emptyToNull(input.parent), allProjects.get());
+    validateParentUpdate(rsrc.getProjectState().getNameKey(), user, parentName, checkIfAdmin);
+    try (MetaDataUpdate md = updateFactory.create(rsrc.getNameKey())) {
+      ProjectConfig config = ProjectConfig.read(md);
+      Project project = config.getProject();
+      project.setParentName(parentName);
+
+      String msg = Strings.emptyToNull(input.commitMessage);
+      if (msg == null) {
+        msg = String.format("Changed parent to %s.\n", parentName);
+      } else if (!msg.endsWith("\n")) {
+        msg += "\n";
+      }
+      md.setAuthor(user);
+      md.setMessage(msg);
+      config.commit(md);
+      cache.evict(rsrc.getProjectState().getProject());
+
+      Project.NameKey parent = project.getParent(allProjects);
+      requireNonNull(parent);
+      return parent.get();
+    } catch (RepositoryNotFoundException notFound) {
+      throw new ResourceNotFoundException(rsrc.getName());
+    } catch (ConfigInvalidException e) {
+      throw new ResourceConflictException(
+          String.format("invalid project.config: %s", e.getMessage()));
+    }
+  }
+
+  public void validateParentUpdate(
+      Project.NameKey project, IdentifiedUser user, String newParent, boolean checkIfAdmin)
+      throws AuthException, ResourceConflictException, UnprocessableEntityException,
+          PermissionBackendException, BadRequestException {
+    if (checkIfAdmin) {
+      if (allowProjectOwnersToChangeParent) {
+        permissionBackend.user(user).project(project).check(ProjectPermission.WRITE_CONFIG);
+      } else {
+        permissionBackend.user(user).check(GlobalPermission.ADMINISTRATE_SERVER);
+      }
+    }
+
+    if (project.equals(allUsers) && !allProjects.get().equals(newParent)) {
+      throw new BadRequestException(
+          String.format("%s must inherit from %s", allUsers.get(), allProjects.get()));
+    }
+
+    if (project.equals(allProjects)) {
+      throw new ResourceConflictException("cannot set parent of " + allProjects.get());
+    }
+
+    if (allUsers.get().equals(newParent)) {
+      throw new ResourceConflictException(
+          String.format("Cannot inherit from '%s' project", allUsers.get()));
+    }
+
+    newParent = Strings.emptyToNull(newParent);
+    if (newParent != null) {
+      ProjectState parent = cache.get(new Project.NameKey(newParent));
+      if (parent == null) {
+        throw new UnprocessableEntityException("parent project " + newParent + " not found");
+      }
+
+      if (parent.getName().equals(project.get())) {
+        throw new ResourceConflictException("cannot set parent to self");
+      }
+
+      if (Iterables.tryFind(
+              parent.tree(),
+              p -> {
+                return p.getNameKey().equals(project);
+              })
+          .isPresent()) {
+        throw new ResourceConflictException(
+            "cycle exists between " + project.get() + " and " + parent.getName());
+      }
+    }
+  }
+
+  @Override
+  public Multimap<UpdateResult, ConfigUpdateEntry> configUpdated(ConfigUpdatedEvent event) {
+    ConfigKey receiveSetParent = ConfigKey.create("receive", "allowProjectOwnersToChangeParent");
+    if (!event.isValueUpdated(receiveSetParent)) {
+      return ConfigUpdatedEvent.NO_UPDATES;
+    }
+    try {
+      boolean enabled =
+          event.getNewConfig().getBoolean("receive", "allowProjectOwnersToChangeParent", false);
+      this.allowProjectOwnersToChangeParent = enabled;
+    } catch (IllegalArgumentException iae) {
+      return event.reject(receiveSetParent);
+    }
+    return event.accept(receiveSetParent);
+  }
+}
diff --git a/java/com/google/gerrit/server/restapi/project/TagsCollection.java b/java/com/google/gerrit/server/restapi/project/TagsCollection.java
new file mode 100644
index 0000000..a129bda
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/TagsCollection.java
@@ -0,0 +1,58 @@
+// Copyright (C) 2014 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.google.gerrit.server.restapi.project;
+
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.ChildCollection;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.project.TagResource;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+
+@Singleton
+public class TagsCollection implements ChildCollection<ProjectResource, TagResource> {
+  private final DynamicMap<RestView<TagResource>> views;
+  private final Provider<ListTags> list;
+
+  @Inject
+  public TagsCollection(DynamicMap<RestView<TagResource>> views, Provider<ListTags> list) {
+    this.views = views;
+    this.list = list;
+  }
+
+  @Override
+  public RestView<ProjectResource> list() throws ResourceNotFoundException {
+    return list.get();
+  }
+
+  @Override
+  public TagResource parse(ProjectResource parent, IdString id)
+      throws RestApiException, IOException, PermissionBackendException {
+    parent.getProjectState().checkStatePermitsRead();
+    return new TagResource(parent.getProjectState(), parent.getUser(), list.get().get(parent, id));
+  }
+
+  @Override
+  public DynamicMap<RestView<TagResource>> views() {
+    return views;
+  }
+}
diff --git a/java/com/google/gerrit/server/rules/DefaultSubmitRule.java b/java/com/google/gerrit/server/rules/DefaultSubmitRule.java
new file mode 100644
index 0000000..b70858d
--- /dev/null
+++ b/java/com/google/gerrit/server/rules/DefaultSubmitRule.java
@@ -0,0 +1,131 @@
+// 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.
+
+package com.google.gerrit.server.rules;
+
+import static com.google.common.collect.ImmutableList.toImmutableList;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.LabelFunction;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.SubmitRecord;
+import com.google.gerrit.extensions.annotations.Exports;
+import com.google.gerrit.extensions.config.FactoryModule;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.project.SubmitRuleOptions;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Java implementation of Gerrit's default pre-submit rules behavior: check if the labels have the
+ * correct values, according to the {@link LabelFunction} they are attached to.
+ *
+ * <p>As this behavior is also implemented by the Prolog rules system, we skip it if at least one
+ * project in the hierarchy has a {@code rules.pl} file.
+ */
+@Singleton
+public final class DefaultSubmitRule implements SubmitRule {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static class Module extends FactoryModule {
+    @Override
+    public void configure() {
+      bind(SubmitRule.class)
+          .annotatedWith(Exports.named("DefaultRules"))
+          .to(DefaultSubmitRule.class);
+    }
+  }
+
+  private final ProjectCache projectCache;
+
+  @Inject
+  DefaultSubmitRule(ProjectCache projectCache) {
+    this.projectCache = projectCache;
+  }
+
+  @Override
+  public Collection<SubmitRecord> evaluate(ChangeData cd, SubmitRuleOptions options) {
+    ProjectState projectState = projectCache.get(cd.project());
+
+    // In case at least one project has a rules.pl file, we let Prolog handle it.
+    // The Prolog rules engine will also handle the labels for us.
+    if (projectState == null || projectState.hasPrologRules()) {
+      return Collections.emptyList();
+    }
+
+    SubmitRecord submitRecord = new SubmitRecord();
+    submitRecord.status = SubmitRecord.Status.OK;
+
+    List<LabelType> labelTypes;
+    List<PatchSetApproval> approvals;
+    try {
+      labelTypes = cd.getLabelTypes().getLabelTypes();
+      approvals = cd.currentApprovals();
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log(
+          "Unable to fetch labels and approvals for change %s", cd.getId());
+
+      submitRecord.errorMessage = "Unable to fetch labels and approvals for the change";
+      submitRecord.status = SubmitRecord.Status.RULE_ERROR;
+      return Collections.singletonList(submitRecord);
+    }
+
+    submitRecord.labels = new ArrayList<>(labelTypes.size());
+
+    for (LabelType t : labelTypes) {
+      LabelFunction labelFunction = t.getFunction();
+      if (labelFunction == null) {
+        logger.atSevere().log(
+            "Unable to find the LabelFunction for label %s, change %s", t.getName(), cd.getId());
+
+        submitRecord.errorMessage = "Unable to find the LabelFunction for label " + t.getName();
+        submitRecord.status = SubmitRecord.Status.RULE_ERROR;
+        return Collections.singletonList(submitRecord);
+      }
+
+      Collection<PatchSetApproval> approvalsForLabel = getApprovalsForLabel(approvals, t);
+      SubmitRecord.Label label = labelFunction.check(t, approvalsForLabel);
+      submitRecord.labels.add(label);
+
+      switch (label.status) {
+        case OK:
+        case MAY:
+          break;
+
+        case NEED:
+        case REJECT:
+        case IMPOSSIBLE:
+          submitRecord.status = SubmitRecord.Status.NOT_READY;
+          break;
+      }
+    }
+
+    return Collections.singletonList(submitRecord);
+  }
+
+  private static List<PatchSetApproval> getApprovalsForLabel(
+      List<PatchSetApproval> approvals, LabelType t) {
+    return approvals.stream()
+        .filter(input -> input.getLabel().equals(t.getLabelId().get()))
+        .collect(toImmutableList());
+  }
+}
diff --git a/java/com/google/gerrit/server/rules/IgnoreSelfApprovalRule.java b/java/com/google/gerrit/server/rules/IgnoreSelfApprovalRule.java
new file mode 100644
index 0000000..f7c25a4
--- /dev/null
+++ b/java/com/google/gerrit/server/rules/IgnoreSelfApprovalRule.java
@@ -0,0 +1,169 @@
+// 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.
+
+package com.google.gerrit.server.rules;
+
+import static com.google.common.collect.ImmutableList.toImmutableList;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableList;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.LabelFunction;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.SubmitRecord;
+import com.google.gerrit.common.data.SubmitRequirement;
+import com.google.gerrit.extensions.annotations.Exports;
+import com.google.gerrit.extensions.config.FactoryModule;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.server.project.SubmitRuleOptions;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Rule to require an approval from a user that did not upload the current patch set or block
+ * submission.
+ */
+@Singleton
+public class IgnoreSelfApprovalRule implements SubmitRule {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+  private static final String E_UNABLE_TO_FETCH_UPLOADER = "Unable to fetch uploader";
+  private static final String E_UNABLE_TO_FETCH_LABELS =
+      "Unable to fetch labels and approvals for the change";
+
+  public static class Module extends FactoryModule {
+    @Override
+    public void configure() {
+      bind(SubmitRule.class)
+          .annotatedWith(Exports.named("IgnoreSelfApprovalRule"))
+          .to(IgnoreSelfApprovalRule.class);
+    }
+  }
+
+  @Inject
+  IgnoreSelfApprovalRule() {}
+
+  @Override
+  public Collection<SubmitRecord> evaluate(ChangeData cd, SubmitRuleOptions options) {
+    List<LabelType> labelTypes;
+    List<PatchSetApproval> approvals;
+    try {
+      labelTypes = cd.getLabelTypes().getLabelTypes();
+      approvals = cd.currentApprovals();
+    } catch (OrmException e) {
+      logger.atWarning().withCause(e).log(E_UNABLE_TO_FETCH_LABELS);
+      return singletonRuleError(E_UNABLE_TO_FETCH_LABELS);
+    }
+
+    boolean shouldIgnoreSelfApproval = labelTypes.stream().anyMatch(l -> l.ignoreSelfApproval());
+    if (!shouldIgnoreSelfApproval) {
+      // Shortcut to avoid further processing if no label should ignore uploader approvals
+      return ImmutableList.of();
+    }
+
+    Account.Id uploader;
+    try {
+      uploader = cd.currentPatchSet().getUploader();
+    } catch (OrmException e) {
+      logger.atWarning().withCause(e).log(E_UNABLE_TO_FETCH_UPLOADER);
+      return singletonRuleError(E_UNABLE_TO_FETCH_UPLOADER);
+    }
+
+    SubmitRecord submitRecord = new SubmitRecord();
+    submitRecord.status = SubmitRecord.Status.OK;
+    submitRecord.labels = new ArrayList<>(labelTypes.size());
+    submitRecord.requirements = new ArrayList<>();
+
+    for (LabelType t : labelTypes) {
+      if (!t.ignoreSelfApproval()) {
+        // The default rules are enough in this case.
+        continue;
+      }
+
+      LabelFunction labelFunction = t.getFunction();
+      if (labelFunction == null) {
+        continue;
+      }
+
+      Collection<PatchSetApproval> allApprovalsForLabel = filterApprovalsByLabel(approvals, t);
+      SubmitRecord.Label allApprovalsCheckResult = labelFunction.check(t, allApprovalsForLabel);
+      SubmitRecord.Label ignoreSelfApprovalCheckResult =
+          labelFunction.check(t, filterOutPositiveApprovalsOfUser(allApprovalsForLabel, uploader));
+
+      if (labelCheckPassed(allApprovalsCheckResult)
+          && !labelCheckPassed(ignoreSelfApprovalCheckResult)) {
+        // The label has a valid approval from the uploader and no other valid approval. Set the
+        // label
+        // to NOT_READY and indicate the need for non-uploader approval as requirement.
+        submitRecord.labels.add(ignoreSelfApprovalCheckResult);
+        submitRecord.status = SubmitRecord.Status.NOT_READY;
+        // Add an additional requirement to be more descriptive on why the label counts as not
+        // approved.
+        submitRecord.requirements.add(
+            SubmitRequirement.builder()
+                .setFallbackText("Approval from non-uploader required")
+                .setType("non_uploader_approval")
+                .build());
+      }
+    }
+
+    if (submitRecord.labels.isEmpty()) {
+      return ImmutableList.of();
+    }
+
+    return ImmutableList.of(submitRecord);
+  }
+
+  private static boolean labelCheckPassed(SubmitRecord.Label label) {
+    switch (label.status) {
+      case OK:
+      case MAY:
+        return true;
+
+      case NEED:
+      case REJECT:
+      case IMPOSSIBLE:
+        return false;
+    }
+    return false;
+  }
+
+  private static Collection<SubmitRecord> singletonRuleError(String reason) {
+    SubmitRecord submitRecord = new SubmitRecord();
+    submitRecord.errorMessage = reason;
+    submitRecord.status = SubmitRecord.Status.RULE_ERROR;
+    return ImmutableList.of(submitRecord);
+  }
+
+  @VisibleForTesting
+  static Collection<PatchSetApproval> filterOutPositiveApprovalsOfUser(
+      Collection<PatchSetApproval> approvals, Account.Id user) {
+    return approvals.stream()
+        .filter(input -> input.getValue() < 0 || !input.getAccountId().equals(user))
+        .collect(toImmutableList());
+  }
+
+  @VisibleForTesting
+  static Collection<PatchSetApproval> filterApprovalsByLabel(
+      Collection<PatchSetApproval> approvals, LabelType t) {
+    return approvals.stream()
+        .filter(input -> input.getLabelId().get().equals(t.getLabelId().get()))
+        .collect(toImmutableList());
+  }
+}
diff --git a/java/com/google/gerrit/server/rules/PredicateClassLoader.java b/java/com/google/gerrit/server/rules/PredicateClassLoader.java
new file mode 100644
index 0000000..0a7a47f
--- /dev/null
+++ b/java/com/google/gerrit/server/rules/PredicateClassLoader.java
@@ -0,0 +1,61 @@
+// Copyright (C) 2012 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.google.gerrit.server.rules;
+
+import com.google.common.collect.LinkedHashMultimap;
+import com.google.common.collect.SetMultimap;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import java.util.Collection;
+
+/** Loads the classes for Prolog predicates. */
+public class PredicateClassLoader extends ClassLoader {
+
+  private final SetMultimap<String, ClassLoader> packageClassLoaderMap =
+      LinkedHashMultimap.create();
+
+  public PredicateClassLoader(
+      PluginSetContext<PredicateProvider> predicateProviders, ClassLoader parent) {
+    super(parent);
+
+    predicateProviders.runEach(
+        predicateProvider -> {
+          for (String pkg : predicateProvider.getPackages()) {
+            packageClassLoaderMap.put(pkg, predicateProvider.getClass().getClassLoader());
+          }
+        });
+  }
+
+  @Override
+  protected Class<?> findClass(String className) throws ClassNotFoundException {
+    final Collection<ClassLoader> classLoaders =
+        packageClassLoaderMap.get(getPackageName(className));
+    for (ClassLoader cl : classLoaders) {
+      try {
+        return Class.forName(className, true, cl);
+      } catch (ClassNotFoundException e) {
+        // ignore
+      }
+    }
+    throw new ClassNotFoundException(className);
+  }
+
+  private static String getPackageName(String className) {
+    final int pos = className.lastIndexOf('.');
+    if (pos < 0) {
+      return "";
+    }
+    return className.substring(0, pos);
+  }
+}
diff --git a/java/com/google/gerrit/server/rules/PredicateProvider.java b/java/com/google/gerrit/server/rules/PredicateProvider.java
new file mode 100644
index 0000000..57ca7cd
--- /dev/null
+++ b/java/com/google/gerrit/server/rules/PredicateProvider.java
@@ -0,0 +1,32 @@
+// Copyright (C) 2012 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.google.gerrit.server.rules;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.extensions.annotations.ExtensionPoint;
+import com.googlecode.prolog_cafe.lang.Predicate;
+
+/**
+ * Provides additional packages that contain Prolog predicates that should be made available in the
+ * Prolog environment. The predicates can e.g. be used in the project submit rules.
+ *
+ * <p>Each Java class defining a Prolog predicate must be in one of the provided packages and its
+ * name must apply to the 'PRED_[functor]_[arity]' format. In addition it must extend {@link
+ * Predicate}.
+ */
+@ExtensionPoint
+public interface PredicateProvider {
+  /** Return set of packages that contain Prolog predicates */
+  ImmutableSet<String> getPackages();
+}
diff --git a/java/com/google/gerrit/server/rules/PrologEnvironment.java b/java/com/google/gerrit/server/rules/PrologEnvironment.java
new file mode 100644
index 0000000..568fa4e
--- /dev/null
+++ b/java/com/google/gerrit/server/rules/PrologEnvironment.java
@@ -0,0 +1,263 @@
+// Copyright (C) 2011 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.google.gerrit.server.rules;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.server.AnonymousUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.account.Emails;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.patch.PatchListCache;
+import com.google.gerrit.server.patch.PatchSetInfoFactory;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import com.google.inject.assistedinject.Assisted;
+import com.googlecode.prolog_cafe.lang.BufferingPrologControl;
+import com.googlecode.prolog_cafe.lang.Predicate;
+import com.googlecode.prolog_cafe.lang.PredicateEncoder;
+import com.googlecode.prolog_cafe.lang.Prolog;
+import com.googlecode.prolog_cafe.lang.PrologMachineCopy;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.jgit.lib.Config;
+
+/**
+ * Per-thread Prolog interpreter.
+ *
+ * <p>This class is not thread safe.
+ *
+ * <p>A single copy of the Prolog interpreter, for the current thread.
+ */
+public class PrologEnvironment extends BufferingPrologControl {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public interface Factory {
+    /**
+     * Construct a new Prolog interpreter.
+     *
+     * @param src the machine to template the new environment from.
+     * @return the new interpreter.
+     */
+    PrologEnvironment create(PrologMachineCopy src);
+  }
+
+  private final Args args;
+  private final Map<StoredValue<Object>, Object> storedValues;
+  private List<Runnable> cleanup;
+
+  @Inject
+  PrologEnvironment(Args a, @Assisted PrologMachineCopy src) {
+    super(src);
+    setEnabled(EnumSet.allOf(Prolog.Feature.class), false);
+    args = a;
+    storedValues = new HashMap<>();
+    cleanup = new LinkedList<>();
+  }
+
+  public Args getArgs() {
+    return args;
+  }
+
+  @Override
+  public void setPredicate(Predicate goal) {
+    super.setPredicate(goal);
+    int reductionLimit = args.reductionLimit(goal);
+    logger.atFine().log("setting reductionLimit %d", reductionLimit);
+    setReductionLimit(reductionLimit);
+  }
+
+  /**
+   * Lookup a stored value in the interpreter's hash manager.
+   *
+   * @param <T> type of stored Java object.
+   * @param sv unique key.
+   * @return the value; null if not stored.
+   */
+  @SuppressWarnings("unchecked")
+  public <T> T get(StoredValue<T> sv) {
+    return (T) storedValues.get(sv);
+  }
+
+  /**
+   * Set a stored value on the interpreter's hash manager.
+   *
+   * @param <T> type of stored Java object.
+   * @param sv unique key.
+   * @param obj the value to store under {@code sv}.
+   */
+  @SuppressWarnings("unchecked")
+  public <T> void set(StoredValue<T> sv, T obj) {
+    storedValues.put((StoredValue<Object>) sv, obj);
+  }
+
+  /**
+   * Copy the stored values from another interpreter to this one. Also gets the cleanup from the
+   * child interpreter
+   */
+  public void copyStoredValues(PrologEnvironment child) {
+    storedValues.putAll(child.storedValues);
+    setCleanup(child.cleanup);
+  }
+
+  /**
+   * Assign the environment a cleanup list (in order to use a centralized list) If this
+   * enivronment's list is non-empty, append its cleanup tasks to the assigning list.
+   */
+  public void setCleanup(List<Runnable> newCleanupList) {
+    newCleanupList.addAll(cleanup);
+    cleanup = newCleanupList;
+  }
+
+  /**
+   * Adds cleanup task to run when close() is called
+   *
+   * @param task is run when close() is called
+   */
+  public void addToCleanup(Runnable task) {
+    cleanup.add(task);
+  }
+
+  /** Release resources stored in interpreter's hash manager. */
+  public void close() {
+    for (Iterator<Runnable> i = cleanup.iterator(); i.hasNext(); ) {
+      try {
+        i.next().run();
+      } catch (Throwable err) {
+        logger.atSevere().withCause(err).log("Failed to execute cleanup for PrologEnvironment");
+      }
+      i.remove();
+    }
+  }
+
+  @Singleton
+  public static class Args {
+    private static final Class<Predicate> CONSULT_STREAM_2;
+
+    static {
+      try {
+        @SuppressWarnings("unchecked")
+        Class<Predicate> c =
+            (Class<Predicate>)
+                Class.forName(
+                    PredicateEncoder.encode(Prolog.BUILTIN, "consult_stream", 2),
+                    false,
+                    RulesCache.class.getClassLoader());
+        CONSULT_STREAM_2 = c;
+      } catch (ClassNotFoundException e) {
+        throw new LinkageError("cannot find predicate consult_stream", e);
+      }
+    }
+
+    private final ProjectCache projectCache;
+    private final PermissionBackend permissionBackend;
+    private final GitRepositoryManager repositoryManager;
+    private final PatchListCache patchListCache;
+    private final PatchSetInfoFactory patchSetInfoFactory;
+    private final IdentifiedUser.GenericFactory userFactory;
+    private final Provider<AnonymousUser> anonymousUser;
+    private final int reductionLimit;
+    private final int compileLimit;
+    private final PatchSetUtil patchsetUtil;
+    private Emails emails;
+
+    @Inject
+    Args(
+        ProjectCache projectCache,
+        PermissionBackend permissionBackend,
+        GitRepositoryManager repositoryManager,
+        PatchListCache patchListCache,
+        PatchSetInfoFactory patchSetInfoFactory,
+        IdentifiedUser.GenericFactory userFactory,
+        Provider<AnonymousUser> anonymousUser,
+        @GerritServerConfig Config config,
+        PatchSetUtil patchsetUtil,
+        Emails emails) {
+      this.projectCache = projectCache;
+      this.permissionBackend = permissionBackend;
+      this.repositoryManager = repositoryManager;
+      this.patchListCache = patchListCache;
+      this.patchSetInfoFactory = patchSetInfoFactory;
+      this.userFactory = userFactory;
+      this.anonymousUser = anonymousUser;
+      this.patchsetUtil = patchsetUtil;
+      this.emails = emails;
+
+      int limit = config.getInt("rules", null, "reductionLimit", 100000);
+      reductionLimit = limit <= 0 ? Integer.MAX_VALUE : limit;
+
+      limit =
+          config.getInt(
+              "rules",
+              null,
+              "compileReductionLimit",
+              (int) Math.min(10L * limit, Integer.MAX_VALUE));
+      compileLimit = limit <= 0 ? Integer.MAX_VALUE : limit;
+
+      logger.atInfo().log("reductionLimit: %d, compileLimit: %d", reductionLimit, compileLimit);
+    }
+
+    private int reductionLimit(Predicate goal) {
+      if (goal.getClass() == CONSULT_STREAM_2) {
+        return compileLimit;
+      }
+      return reductionLimit;
+    }
+
+    public ProjectCache getProjectCache() {
+      return projectCache;
+    }
+
+    public PermissionBackend getPermissionBackend() {
+      return permissionBackend;
+    }
+
+    public GitRepositoryManager getGitRepositoryManager() {
+      return repositoryManager;
+    }
+
+    public PatchListCache getPatchListCache() {
+      return patchListCache;
+    }
+
+    public PatchSetInfoFactory getPatchSetInfoFactory() {
+      return patchSetInfoFactory;
+    }
+
+    public IdentifiedUser.GenericFactory getUserFactory() {
+      return userFactory;
+    }
+
+    public AnonymousUser getAnonymousUser() {
+      return anonymousUser.get();
+    }
+
+    public PatchSetUtil getPatchsetUtil() {
+      return patchsetUtil;
+    }
+
+    public Emails getEmails() {
+      return emails;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/rules/PrologModule.java b/java/com/google/gerrit/server/rules/PrologModule.java
new file mode 100644
index 0000000..37dbba6
--- /dev/null
+++ b/java/com/google/gerrit/server/rules/PrologModule.java
@@ -0,0 +1,39 @@
+// Copyright (C) 2011 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.google.gerrit.server.rules;
+
+import com.google.gerrit.extensions.annotations.Exports;
+import com.google.gerrit.extensions.config.FactoryModule;
+import com.google.gerrit.extensions.registration.DynamicSet;
+
+public class PrologModule extends FactoryModule {
+  @Override
+  protected void configure() {
+    install(new EnvironmentModule());
+    install(new RulesCache.Module());
+    bind(PrologEnvironment.Args.class);
+    factory(PrologRuleEvaluator.Factory.class);
+
+    bind(SubmitRule.class).annotatedWith(Exports.named("PrologRule")).to(PrologRule.class);
+  }
+
+  static class EnvironmentModule extends FactoryModule {
+    @Override
+    protected void configure() {
+      DynamicSet.setOf(binder(), PredicateProvider.class);
+      factory(PrologEnvironment.Factory.class);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/rules/PrologRule.java b/java/com/google/gerrit/server/rules/PrologRule.java
new file mode 100644
index 0000000..0c54f40
--- /dev/null
+++ b/java/com/google/gerrit/server/rules/PrologRule.java
@@ -0,0 +1,57 @@
+// 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.
+
+package com.google.gerrit.server.rules;
+
+import com.google.gerrit.common.data.SubmitRecord;
+import com.google.gerrit.common.data.SubmitTypeRecord;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.project.SubmitRuleOptions;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.Collection;
+import java.util.Collections;
+
+@Singleton
+public class PrologRule implements SubmitRule {
+  private final PrologRuleEvaluator.Factory factory;
+  private final ProjectCache projectCache;
+
+  @Inject
+  private PrologRule(PrologRuleEvaluator.Factory factory, ProjectCache projectCache) {
+    this.factory = factory;
+    this.projectCache = projectCache;
+  }
+
+  @Override
+  public Collection<SubmitRecord> evaluate(ChangeData cd, SubmitRuleOptions opts) {
+    ProjectState projectState = projectCache.get(cd.project());
+    // We only want to run the Prolog engine if we have at least one rules.pl file to use.
+    if ((projectState == null || !projectState.hasPrologRules()) && opts.rule() == null) {
+      return Collections.emptyList();
+    }
+
+    return getEvaluator(cd, opts).evaluate();
+  }
+
+  private PrologRuleEvaluator getEvaluator(ChangeData cd, SubmitRuleOptions opts) {
+    return factory.create(cd, opts);
+  }
+
+  public SubmitTypeRecord getSubmitType(ChangeData cd, SubmitRuleOptions opts) {
+    return getEvaluator(cd, opts).getSubmitType();
+  }
+}
diff --git a/java/com/google/gerrit/server/rules/PrologRuleEvaluator.java b/java/com/google/gerrit/server/rules/PrologRuleEvaluator.java
new file mode 100644
index 0000000..e61fc90
--- /dev/null
+++ b/java/com/google/gerrit/server/rules/PrologRuleEvaluator.java
@@ -0,0 +1,550 @@
+// Copyright (C) 2012 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.google.gerrit.server.rules;
+
+import static com.google.gerrit.server.project.SubmitRuleEvaluator.createRuleError;
+import static com.google.gerrit.server.project.SubmitRuleEvaluator.defaultRuleError;
+import static com.google.gerrit.server.project.SubmitRuleEvaluator.defaultTypeError;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.CharMatcher;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.SubmitRecord;
+import com.google.gerrit.common.data.SubmitTypeRecord;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.Accounts;
+import com.google.gerrit.server.account.Emails;
+import com.google.gerrit.server.project.NoSuchProjectException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.project.RuleEvalException;
+import com.google.gerrit.server.project.SubmitRuleOptions;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.assistedinject.Assisted;
+import com.google.inject.assistedinject.AssistedInject;
+import com.googlecode.prolog_cafe.exceptions.CompileException;
+import com.googlecode.prolog_cafe.exceptions.ReductionLimitException;
+import com.googlecode.prolog_cafe.lang.IntegerTerm;
+import com.googlecode.prolog_cafe.lang.ListTerm;
+import com.googlecode.prolog_cafe.lang.Prolog;
+import com.googlecode.prolog_cafe.lang.PrologMachineCopy;
+import com.googlecode.prolog_cafe.lang.StructureTerm;
+import com.googlecode.prolog_cafe.lang.SymbolTerm;
+import com.googlecode.prolog_cafe.lang.Term;
+import com.googlecode.prolog_cafe.lang.VariableTerm;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Evaluates a submit-like Prolog rule found in the rules.pl file of the current project and filters
+ * the results through rules found in the parent projects, all the way up to All-Projects.
+ */
+public class PrologRuleEvaluator {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+  /**
+   * List of characters to allow in the label name, when an invalid name is used. Dash is allowed as
+   * it can't be the first character: we use a prefix.
+   */
+  private static final CharMatcher VALID_LABEL_MATCHER =
+      CharMatcher.is('-')
+          .or(CharMatcher.inRange('a', 'z'))
+          .or(CharMatcher.inRange('A', 'Z'))
+          .or(CharMatcher.inRange('0', '9'));
+
+  public interface Factory {
+    /** Returns a new {@link PrologRuleEvaluator} with the specified options */
+    PrologRuleEvaluator create(ChangeData cd, SubmitRuleOptions options);
+  }
+
+  /**
+   * Exception thrown when the label term of a submit record unexpectedly didn't contain a user
+   * term.
+   */
+  private static class UserTermExpected extends Exception {
+    private static final long serialVersionUID = 1L;
+
+    UserTermExpected(SubmitRecord.Label label) {
+      super(String.format("A label with the status %s must contain a user.", label.toString()));
+    }
+  }
+
+  private final AccountCache accountCache;
+  private final Accounts accounts;
+  private final Emails emails;
+  private final RulesCache rulesCache;
+  private final PrologEnvironment.Factory envFactory;
+  private final ChangeData cd;
+  private final ProjectState projectState;
+  private final SubmitRuleOptions opts;
+  private Term submitRule;
+
+  @AssistedInject
+  private PrologRuleEvaluator(
+      AccountCache accountCache,
+      Accounts accounts,
+      Emails emails,
+      RulesCache rulesCache,
+      PrologEnvironment.Factory envFactory,
+      ProjectCache projectCache,
+      @Assisted ChangeData cd,
+      @Assisted SubmitRuleOptions options) {
+    this.accountCache = accountCache;
+    this.accounts = accounts;
+    this.emails = emails;
+    this.rulesCache = rulesCache;
+    this.envFactory = envFactory;
+    this.cd = cd;
+    this.opts = options;
+
+    this.projectState = projectCache.get(cd.project());
+  }
+
+  private static Term toListTerm(List<Term> terms) {
+    Term list = Prolog.Nil;
+    for (int i = terms.size() - 1; i >= 0; i--) {
+      list = new ListTerm(terms.get(i), list);
+    }
+    return list;
+  }
+
+  private static boolean isUser(Term who) {
+    return who instanceof StructureTerm
+        && who.arity() == 1
+        && who.name().equals("user")
+        && who.arg(0) instanceof IntegerTerm;
+  }
+
+  private Term getSubmitRule() {
+    return submitRule;
+  }
+
+  /**
+   * Evaluate the submit rules.
+   *
+   * @return List of {@link SubmitRecord} objects returned from the evaluated rules, including any
+   *     errors.
+   */
+  public Collection<SubmitRecord> evaluate() {
+    Change change;
+    try {
+      change = cd.change();
+      if (change == null) {
+        throw new OrmException("No change found");
+      }
+
+      if (projectState == null) {
+        throw new NoSuchProjectException(cd.project());
+      }
+    } catch (OrmException | NoSuchProjectException e) {
+      return ruleError("Error looking up change " + cd.getId(), e);
+    }
+
+    if (!opts.allowClosed() && change.getStatus().isClosed()) {
+      SubmitRecord rec = new SubmitRecord();
+      rec.status = SubmitRecord.Status.CLOSED;
+      return Collections.singletonList(rec);
+    }
+
+    List<Term> results;
+    try {
+      results =
+          evaluateImpl(
+              "locate_submit_rule", "can_submit", "locate_submit_filter", "filter_submit_results");
+    } catch (RuleEvalException e) {
+      return ruleError(e.getMessage(), e);
+    }
+
+    if (results.isEmpty()) {
+      // This should never occur. A well written submit rule will always produce
+      // at least one result informing the caller of the labels that are
+      // required for this change to be submittable. Each label will indicate
+      // whether or not that is actually possible given the permissions.
+      return ruleError(
+          String.format(
+              "Submit rule '%s' for change %s of %s has no solution.",
+              getSubmitRuleName(), cd.getId(), projectState.getName()));
+    }
+
+    return resultsToSubmitRecord(getSubmitRule(), results);
+  }
+
+  private String getSubmitRuleName() {
+    return submitRule == null ? "<unknown>" : submitRule.name();
+  }
+
+  /**
+   * Convert the results from Prolog Cafe's format to Gerrit's common format.
+   *
+   * <p>can_submit/1 terminates when an ok(P) record is found. Therefore walk the results backwards,
+   * using only that ok(P) record if it exists. This skips partial results that occur early in the
+   * output. Later after the loop the out collection is reversed to restore it to the original
+   * ordering.
+   */
+  public List<SubmitRecord> resultsToSubmitRecord(Term submitRule, List<Term> results) {
+    boolean foundOk = false;
+    List<SubmitRecord> out = new ArrayList<>(results.size());
+    for (int resultIdx = results.size() - 1; 0 <= resultIdx; resultIdx--) {
+      Term submitRecord = results.get(resultIdx);
+      SubmitRecord rec = new SubmitRecord();
+      out.add(rec);
+
+      if (!(submitRecord instanceof StructureTerm) || 1 != submitRecord.arity()) {
+        return invalidResult(submitRule, submitRecord);
+      }
+
+      if ("ok".equals(submitRecord.name())) {
+        rec.status = SubmitRecord.Status.OK;
+
+      } else if ("not_ready".equals(submitRecord.name())) {
+        rec.status = SubmitRecord.Status.NOT_READY;
+
+      } else {
+        return invalidResult(submitRule, submitRecord);
+      }
+
+      // Unpack the one argument. This should also be a structure with one
+      // argument per label that needs to be reported on to the caller.
+      //
+      submitRecord = submitRecord.arg(0);
+
+      if (!(submitRecord instanceof StructureTerm)) {
+        return invalidResult(submitRule, submitRecord);
+      }
+
+      rec.labels = new ArrayList<>(submitRecord.arity());
+
+      for (Term state : ((StructureTerm) submitRecord).args()) {
+        if (!(state instanceof StructureTerm)
+            || 2 != state.arity()
+            || !"label".equals(state.name())) {
+          return invalidResult(submitRule, submitRecord);
+        }
+
+        SubmitRecord.Label lbl = new SubmitRecord.Label();
+        rec.labels.add(lbl);
+
+        lbl.label = checkLabelName(state.arg(0).name());
+        Term status = state.arg(1);
+
+        try {
+          if ("ok".equals(status.name())) {
+            lbl.status = SubmitRecord.Label.Status.OK;
+            appliedBy(lbl, status);
+
+          } else if ("reject".equals(status.name())) {
+            lbl.status = SubmitRecord.Label.Status.REJECT;
+            appliedBy(lbl, status);
+
+          } else if ("need".equals(status.name())) {
+            lbl.status = SubmitRecord.Label.Status.NEED;
+
+          } else if ("may".equals(status.name())) {
+            lbl.status = SubmitRecord.Label.Status.MAY;
+
+          } else if ("impossible".equals(status.name())) {
+            lbl.status = SubmitRecord.Label.Status.IMPOSSIBLE;
+
+          } else {
+            return invalidResult(submitRule, submitRecord);
+          }
+        } catch (UserTermExpected e) {
+          return invalidResult(submitRule, submitRecord, e.getMessage());
+        }
+      }
+
+      if (rec.status == SubmitRecord.Status.OK) {
+        foundOk = true;
+        break;
+      }
+    }
+    Collections.reverse(out);
+
+    // This transformation is required to adapt Prolog's behavior to the way Gerrit handles
+    // SubmitRecords, as defined in the SubmitRecord#allRecordsOK method.
+    // When several rules are defined in Prolog, they are all matched to a SubmitRecord. We want
+    // the change to be submittable when at least one result is OK.
+    if (foundOk) {
+      for (SubmitRecord record : out) {
+        record.status = SubmitRecord.Status.OK;
+      }
+    }
+
+    return out;
+  }
+
+  @VisibleForTesting
+  static String checkLabelName(String name) {
+    try {
+      return LabelType.checkName(name);
+    } catch (IllegalArgumentException e) {
+      String newName = "Invalid-Prolog-Rules-Label-Name-" + sanitizeLabelName(name);
+      return LabelType.checkName(newName.replace("--", "-"));
+    }
+  }
+
+  private static String sanitizeLabelName(String name) {
+    return VALID_LABEL_MATCHER.retainFrom(name);
+  }
+
+  private List<SubmitRecord> invalidResult(Term rule, Term record, String reason) {
+    return ruleError(
+        String.format(
+            "Submit rule %s for change %s of %s output invalid result: %s%s",
+            rule,
+            cd.getId(),
+            cd.project().get(),
+            record,
+            (reason == null ? "" : ". Reason: " + reason)));
+  }
+
+  private List<SubmitRecord> invalidResult(Term rule, Term record) {
+    return invalidResult(rule, record, null);
+  }
+
+  private List<SubmitRecord> ruleError(String err) {
+    return ruleError(err, null);
+  }
+
+  private List<SubmitRecord> ruleError(String err, Exception e) {
+    if (opts.logErrors()) {
+      logger.atSevere().withCause(e).log(err);
+      return defaultRuleError();
+    }
+    return createRuleError(err);
+  }
+
+  /**
+   * Evaluate the submit type rules to get the submit type.
+   *
+   * @return record from the evaluated rules.
+   */
+  public SubmitTypeRecord getSubmitType() {
+    try {
+      if (projectState == null) {
+        throw new NoSuchProjectException(cd.project());
+      }
+    } catch (NoSuchProjectException e) {
+      return typeError("Error looking up change " + cd.getId(), e);
+    }
+
+    List<Term> results;
+    try {
+      results =
+          evaluateImpl(
+              "locate_submit_type",
+              "get_submit_type",
+              "locate_submit_type_filter",
+              "filter_submit_type_results");
+    } catch (RuleEvalException e) {
+      return typeError(e.getMessage(), e);
+    }
+
+    if (results.isEmpty()) {
+      // Should never occur for a well written rule
+      return typeError(
+          "Submit rule '"
+              + getSubmitRuleName()
+              + "' for change "
+              + cd.getId()
+              + " of "
+              + projectState.getName()
+              + " has no solution.");
+    }
+
+    Term typeTerm = results.get(0);
+    if (!(typeTerm instanceof SymbolTerm)) {
+      return typeError(
+          "Submit rule '"
+              + getSubmitRuleName()
+              + "' for change "
+              + cd.getId()
+              + " of "
+              + projectState.getName()
+              + " did not return a symbol.");
+    }
+
+    String typeName = typeTerm.name();
+    try {
+      return SubmitTypeRecord.OK(SubmitType.valueOf(typeName.toUpperCase()));
+    } catch (IllegalArgumentException e) {
+      return typeError(
+          "Submit type rule "
+              + getSubmitRule()
+              + " for change "
+              + cd.getId()
+              + " of "
+              + projectState.getName()
+              + " output invalid result: "
+              + typeName);
+    }
+  }
+
+  private SubmitTypeRecord typeError(String err) {
+    return typeError(err, null);
+  }
+
+  private SubmitTypeRecord typeError(String err, Exception e) {
+    if (opts.logErrors()) {
+      logger.atSevere().withCause(e).log(err);
+      return defaultTypeError();
+    }
+    return SubmitTypeRecord.error(err);
+  }
+
+  private List<Term> evaluateImpl(
+      String userRuleLocatorName,
+      String userRuleWrapperName,
+      String filterRuleLocatorName,
+      String filterRuleWrapperName)
+      throws RuleEvalException {
+    PrologEnvironment env = getPrologEnvironment();
+    try {
+      Term sr = env.once("gerrit", userRuleLocatorName, new VariableTerm());
+      List<Term> results = new ArrayList<>();
+      try {
+        for (Term[] template : env.all("gerrit", userRuleWrapperName, sr, new VariableTerm())) {
+          results.add(template[1]);
+        }
+      } catch (ReductionLimitException err) {
+        throw new RuleEvalException(
+            String.format(
+                "%s on change %d of %s",
+                err.getMessage(), cd.getId().get(), projectState.getName()));
+      } catch (RuntimeException err) {
+        throw new RuleEvalException(
+            String.format(
+                "Exception calling %s on change %d of %s",
+                sr, cd.getId().get(), projectState.getName()),
+            err);
+      }
+
+      Term resultsTerm = toListTerm(results);
+      if (!opts.skipFilters()) {
+        resultsTerm =
+            runSubmitFilters(resultsTerm, env, filterRuleLocatorName, filterRuleWrapperName);
+      }
+      List<Term> r;
+      if (resultsTerm instanceof ListTerm) {
+        r = new ArrayList<>();
+        for (Term t = resultsTerm; t instanceof ListTerm; ) {
+          ListTerm l = (ListTerm) t;
+          r.add(l.car().dereference());
+          t = l.cdr().dereference();
+        }
+      } else {
+        r = Collections.emptyList();
+      }
+      submitRule = sr;
+      return r;
+    } finally {
+      env.close();
+    }
+  }
+
+  private PrologEnvironment getPrologEnvironment() throws RuleEvalException {
+    PrologEnvironment env;
+    try {
+      PrologMachineCopy pmc;
+      if (opts.rule() == null) {
+        pmc =
+            rulesCache.loadMachine(
+                projectState.getNameKey(), projectState.getConfig().getRulesId());
+      } else {
+        pmc = rulesCache.loadMachine("stdin", new StringReader(opts.rule()));
+      }
+      env = envFactory.create(pmc);
+    } catch (CompileException err) {
+      String msg;
+      if (opts.rule() == null) {
+        msg =
+            String.format(
+                "Cannot load rules.pl for %s: %s", projectState.getName(), err.getMessage());
+      } else {
+        msg = err.getMessage();
+      }
+      throw new RuleEvalException(msg, err);
+    }
+    env.set(StoredValues.ACCOUNTS, accounts);
+    env.set(StoredValues.ACCOUNT_CACHE, accountCache);
+    env.set(StoredValues.EMAILS, emails);
+    env.set(StoredValues.REVIEW_DB, cd.db());
+    env.set(StoredValues.CHANGE_DATA, cd);
+    env.set(StoredValues.PROJECT_STATE, projectState);
+    return env;
+  }
+
+  private Term runSubmitFilters(
+      Term results,
+      PrologEnvironment env,
+      String filterRuleLocatorName,
+      String filterRuleWrapperName)
+      throws RuleEvalException {
+    PrologEnvironment childEnv = env;
+    ChangeData cd = env.get(StoredValues.CHANGE_DATA);
+    ProjectState projectState = env.get(StoredValues.PROJECT_STATE);
+    for (ProjectState parentState : projectState.parents()) {
+      PrologEnvironment parentEnv;
+      try {
+        parentEnv =
+            envFactory.create(
+                rulesCache.loadMachine(
+                    parentState.getNameKey(), parentState.getConfig().getRulesId()));
+      } catch (CompileException err) {
+        throw new RuleEvalException("Cannot consult rules.pl for " + parentState.getName(), err);
+      }
+
+      parentEnv.copyStoredValues(childEnv);
+      Term filterRule = parentEnv.once("gerrit", filterRuleLocatorName, new VariableTerm());
+      try {
+        Term[] template =
+            parentEnv.once(
+                "gerrit", filterRuleWrapperName, filterRule, results, new VariableTerm());
+        results = template[2];
+      } catch (ReductionLimitException err) {
+        throw new RuleEvalException(
+            String.format(
+                "%s on change %d of %s",
+                err.getMessage(), cd.getId().get(), parentState.getName()));
+      } catch (RuntimeException err) {
+        throw new RuleEvalException(
+            String.format(
+                "Exception calling %s on change %d of %s",
+                filterRule, cd.getId().get(), parentState.getName()),
+            err);
+      }
+      childEnv = parentEnv;
+    }
+    return results;
+  }
+
+  private void appliedBy(SubmitRecord.Label label, Term status) throws UserTermExpected {
+    if (status instanceof StructureTerm && status.arity() == 1) {
+      Term who = status.arg(0);
+      if (isUser(who)) {
+        label.appliedBy = new Account.Id(((IntegerTerm) who.arg(0)).intValue());
+      } else {
+        throw new UserTermExpected(label);
+      }
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/rules/RulesCache.java b/java/com/google/gerrit/server/rules/RulesCache.java
new file mode 100644
index 0000000..d4e90f9
--- /dev/null
+++ b/java/com/google/gerrit/server/rules/RulesCache.java
@@ -0,0 +1,276 @@
+// Copyright (C) 2011 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.google.gerrit.server.rules;
+
+import static com.googlecode.prolog_cafe.lang.PrologMachineCopy.save;
+
+import com.google.common.base.Joiner;
+import com.google.common.cache.Cache;
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.cache.CacheModule;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gerrit.server.project.ProjectCacheImpl;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.google.inject.name.Named;
+import com.googlecode.prolog_cafe.exceptions.CompileException;
+import com.googlecode.prolog_cafe.exceptions.SyntaxException;
+import com.googlecode.prolog_cafe.exceptions.TermException;
+import com.googlecode.prolog_cafe.lang.BufferingPrologControl;
+import com.googlecode.prolog_cafe.lang.JavaObjectTerm;
+import com.googlecode.prolog_cafe.lang.ListTerm;
+import com.googlecode.prolog_cafe.lang.Prolog;
+import com.googlecode.prolog_cafe.lang.PrologClassLoader;
+import com.googlecode.prolog_cafe.lang.PrologMachineCopy;
+import com.googlecode.prolog_cafe.lang.StructureTerm;
+import com.googlecode.prolog_cafe.lang.SymbolTerm;
+import com.googlecode.prolog_cafe.lang.Term;
+import java.io.IOException;
+import java.io.PushbackReader;
+import java.io.Reader;
+import java.io.StringReader;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import org.eclipse.jgit.errors.LargeObjectException;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectLoader;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.util.RawParseUtils;
+
+/**
+ * Manages a cache of compiled Prolog rules.
+ *
+ * <p>Rules are loaded from the {@code site_path/cache/rules/rules-SHA1.jar}, where {@code SHA1} is
+ * the SHA1 of the Prolog {@code rules.pl} in a project's {@link RefNames#REFS_CONFIG} branch.
+ */
+@Singleton
+public class RulesCache {
+  public static class Module extends CacheModule {
+    @Override
+    protected void configure() {
+      cache(RulesCache.CACHE_NAME, ObjectId.class, PrologMachineCopy.class)
+          // This cache is auxiliary to the project cache, so size it the same.
+          .configKey(ProjectCacheImpl.CACHE_NAME);
+    }
+  }
+
+  private static final ImmutableList<String> PACKAGE_LIST =
+      ImmutableList.of(Prolog.BUILTIN, "gerrit");
+
+  static final String CACHE_NAME = "prolog_rules";
+
+  private final boolean enableProjectRules;
+  private final int maxDbSize;
+  private final int maxSrcBytes;
+  private final Path cacheDir;
+  private final Path rulesDir;
+  private final GitRepositoryManager gitMgr;
+  private final PluginSetContext<PredicateProvider> predicateProviders;
+  private final ClassLoader systemLoader;
+  private final PrologMachineCopy defaultMachine;
+  private final Cache<ObjectId, PrologMachineCopy> machineCache;
+
+  @Inject
+  protected RulesCache(
+      @GerritServerConfig Config config,
+      SitePaths site,
+      GitRepositoryManager gm,
+      PluginSetContext<PredicateProvider> predicateProviders,
+      @Named(CACHE_NAME) Cache<ObjectId, PrologMachineCopy> machineCache) {
+    maxDbSize = config.getInt("rules", null, "maxPrologDatabaseSize", 256);
+    maxSrcBytes = config.getInt("rules", null, "maxSourceBytes", 128 << 10);
+    enableProjectRules = config.getBoolean("rules", null, "enable", true) && maxSrcBytes > 0;
+    cacheDir = site.resolve(config.getString("cache", null, "directory"));
+    rulesDir = cacheDir != null ? cacheDir.resolve("rules") : null;
+    gitMgr = gm;
+    this.predicateProviders = predicateProviders;
+    this.machineCache = machineCache;
+
+    systemLoader = getClass().getClassLoader();
+    defaultMachine = save(newEmptyMachine(systemLoader));
+  }
+
+  public boolean isProjectRulesEnabled() {
+    return enableProjectRules;
+  }
+
+  /**
+   * Locate a cached Prolog machine state, or create one if not available.
+   *
+   * @return a Prolog machine, after loading the specified rules.
+   * @throws CompileException the machine cannot be created.
+   */
+  public synchronized PrologMachineCopy loadMachine(Project.NameKey project, ObjectId rulesId)
+      throws CompileException {
+    if (!enableProjectRules || project == null || rulesId == null) {
+      return defaultMachine;
+    }
+
+    try {
+      return machineCache.get(rulesId, () -> createMachine(project, rulesId));
+    } catch (ExecutionException e) {
+      if (e.getCause() instanceof CompileException) {
+        throw new CompileException(e.getCause().getMessage(), e);
+      }
+      throw new CompileException("Error while consulting rules from " + project, e);
+    }
+  }
+
+  public PrologMachineCopy loadMachine(String name, Reader in) throws CompileException {
+    PrologMachineCopy pmc = consultRules(name, in);
+    if (pmc == null) {
+      throw new CompileException("Cannot consult rules from the stream " + name);
+    }
+    return pmc;
+  }
+
+  private PrologMachineCopy createMachine(Project.NameKey project, ObjectId rulesId)
+      throws CompileException {
+    // If the rules are available as a complied JAR on local disk, prefer
+    // that over dynamic consult as the bytecode will be faster.
+    //
+    if (rulesDir != null) {
+      Path jarPath = rulesDir.resolve("rules-" + rulesId.getName() + ".jar");
+      if (Files.isRegularFile(jarPath)) {
+        URL[] cp = new URL[] {toURL(jarPath)};
+        return save(newEmptyMachine(URLClassLoader.newInstance(cp, systemLoader)));
+      }
+    }
+
+    // Dynamically consult the rules into the machine's internal database.
+    //
+    String rules = read(project, rulesId);
+    PrologMachineCopy pmc = consultRules("rules.pl", new StringReader(rules));
+    if (pmc == null) {
+      throw new CompileException("Cannot consult rules of " + project);
+    }
+    return pmc;
+  }
+
+  private PrologMachineCopy consultRules(String name, Reader rules) throws CompileException {
+    BufferingPrologControl ctl = newEmptyMachine(systemLoader);
+    PushbackReader in = new PushbackReader(rules, Prolog.PUSHBACK_SIZE);
+    try {
+      if (!ctl.execute(
+          Prolog.BUILTIN, "consult_stream", SymbolTerm.intern(name), new JavaObjectTerm(in))) {
+        return null;
+      }
+    } catch (SyntaxException e) {
+      throw new CompileException(e.toString(), e);
+    } catch (TermException e) {
+      Term m = e.getMessageTerm();
+      if (m instanceof StructureTerm && "syntax_error".equals(m.name()) && m.arity() >= 1) {
+        StringBuilder msg = new StringBuilder();
+        if (m.arg(0) instanceof ListTerm) {
+          msg.append(Joiner.on(' ').join(((ListTerm) m.arg(0)).toJava()));
+        } else {
+          msg.append(m.arg(0).toString());
+        }
+        if (m.arity() == 2 && m.arg(1) instanceof StructureTerm && "at".equals(m.arg(1).name())) {
+          Term at = m.arg(1).arg(0).dereference();
+          if (at instanceof ListTerm) {
+            msg.append(" at: ");
+            msg.append(prettyProlog(at));
+          }
+        }
+        throw new CompileException(msg.toString(), e);
+      }
+      throw new CompileException("Error while consulting rules from " + name, e);
+    } catch (RuntimeException e) {
+      throw new CompileException("Error while consulting rules from " + name, e);
+    }
+    return save(ctl);
+  }
+
+  private static String prettyProlog(Term at) {
+    StringBuilder b = new StringBuilder();
+    for (Object o : ((ListTerm) at).toJava()) {
+      if (o instanceof Term) {
+        Term t = (Term) o;
+        if (!(t instanceof StructureTerm)) {
+          b.append(t.toString()).append(' ');
+          continue;
+        }
+        switch (t.name()) {
+          case "atom":
+            SymbolTerm atom = (SymbolTerm) t.arg(0);
+            b.append(atom.toString());
+            break;
+          case "var":
+            b.append(t.arg(0).toString());
+            break;
+        }
+      } else {
+        b.append(o);
+      }
+    }
+    return b.toString().trim();
+  }
+
+  private String read(Project.NameKey project, ObjectId rulesId) throws CompileException {
+    try (Repository git = gitMgr.openRepository(project)) {
+      try {
+        ObjectLoader ldr = git.open(rulesId, Constants.OBJ_BLOB);
+        byte[] raw = ldr.getCachedBytes(maxSrcBytes);
+        return RawParseUtils.decode(raw);
+      } catch (LargeObjectException e) {
+        throw new CompileException("rules of " + project + " are too large", e);
+      } catch (RuntimeException | IOException e) {
+        throw new CompileException("Cannot load rules of " + project, e);
+      }
+    } catch (IOException e) {
+      throw new CompileException("Cannot open repository " + project, e);
+    }
+  }
+
+  private BufferingPrologControl newEmptyMachine(ClassLoader cl) {
+    BufferingPrologControl ctl = new BufferingPrologControl();
+    ctl.setMaxDatabaseSize(maxDbSize);
+    ctl.setPrologClassLoader(
+        new PrologClassLoader(new PredicateClassLoader(predicateProviders, cl)));
+    ctl.setEnabled(EnumSet.allOf(Prolog.Feature.class), false);
+
+    List<String> packages = new ArrayList<>();
+    packages.addAll(PACKAGE_LIST);
+    predicateProviders.runEach(
+        predicateProvider -> packages.addAll(predicateProvider.getPackages()));
+
+    // Bootstrap the interpreter and ensure there is clean state.
+    ctl.initialize(packages.toArray(new String[packages.size()]));
+    return ctl;
+  }
+
+  private static URL toURL(Path jarPath) throws CompileException {
+    try {
+      return jarPath.toUri().toURL();
+    } catch (MalformedURLException e) {
+      throw new CompileException("Cannot create URL for " + jarPath, e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/rules/StoredValue.java b/java/com/google/gerrit/server/rules/StoredValue.java
new file mode 100644
index 0000000..593d474
--- /dev/null
+++ b/java/com/google/gerrit/server/rules/StoredValue.java
@@ -0,0 +1,94 @@
+// Copyright (C) 2011 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.google.gerrit.server.rules;
+
+import com.googlecode.prolog_cafe.exceptions.SystemException;
+import com.googlecode.prolog_cafe.lang.Prolog;
+
+/**
+ * Defines a value cached in a {@link PrologEnvironment}.
+ *
+ * @see StoredValues
+ */
+public class StoredValue<T> {
+  /** Construct a new unique key that does not match any other key. */
+  public static <T> StoredValue<T> create() {
+    return new StoredValue<>();
+  }
+
+  /** Construct a key based on a Java Class object, useful for singletons. */
+  public static <T> StoredValue<T> create(Class<T> clazz) {
+    return new StoredValue<>(clazz);
+  }
+
+  private final Object key;
+
+  /**
+   * Initialize a stored value key using any Java Object.
+   *
+   * @param key unique identity of the stored value. This will be the hash key in the Prolog
+   *     Environments's hash map.
+   */
+  public StoredValue(Object key) {
+    this.key = key;
+  }
+
+  /** Initializes a stored value key with a new unique key. */
+  public StoredValue() {
+    key = this;
+  }
+
+  /** Look up the value in the engine, or return null. */
+  public T getOrNull(Prolog engine) {
+    return get((PrologEnvironment) engine.control);
+  }
+  /** Get the value from the engine, or throw SystemException. */
+  public T get(Prolog engine) {
+    T obj = getOrNull(engine);
+    if (obj == null) {
+      // unless createValue() is overridden, will return null
+      obj = createValue(engine);
+      if (obj == null) {
+        throw new SystemException("No " + key + " available");
+      }
+      set(engine, obj);
+    }
+    return obj;
+  }
+
+  public void set(Prolog engine, T obj) {
+    set((PrologEnvironment) engine.control, obj);
+  }
+
+  /** Perform {@link #getOrNull(Prolog)} on the environment's interpreter. */
+  public T get(PrologEnvironment env) {
+    return env.get(this);
+  }
+
+  /** Set the value into the environment's interpreter. */
+  public void set(PrologEnvironment env, T obj) {
+    env.set(this, obj);
+  }
+
+  /**
+   * Creates a value to store, returns null by default.
+   *
+   * @param engine Prolog engine.
+   * @return new value.
+   */
+  protected T createValue(Prolog engine) {
+    return null;
+  }
+}
diff --git a/java/com/google/gerrit/server/rules/StoredValues.java b/java/com/google/gerrit/server/rules/StoredValues.java
new file mode 100644
index 0000000..8b9cfe3
--- /dev/null
+++ b/java/com/google/gerrit/server/rules/StoredValues.java
@@ -0,0 +1,159 @@
+// Copyright (C) 2011 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.google.gerrit.server.rules;
+
+import static com.google.gerrit.server.rules.StoredValue.create;
+
+import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.AnonymousUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.Accounts;
+import com.google.gerrit.server.account.Emails;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.patch.PatchList;
+import com.google.gerrit.server.patch.PatchListCache;
+import com.google.gerrit.server.patch.PatchListKey;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gwtorm.server.OrmException;
+import com.googlecode.prolog_cafe.exceptions.SystemException;
+import com.googlecode.prolog_cafe.lang.Prolog;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+
+public final class StoredValues {
+  public static final StoredValue<Accounts> ACCOUNTS = create(Accounts.class);
+  public static final StoredValue<AccountCache> ACCOUNT_CACHE = create(AccountCache.class);
+  public static final StoredValue<Emails> EMAILS = create(Emails.class);
+  public static final StoredValue<ReviewDb> REVIEW_DB = create(ReviewDb.class);
+  public static final StoredValue<ChangeData> CHANGE_DATA = create(ChangeData.class);
+  public static final StoredValue<ProjectState> PROJECT_STATE = create(ProjectState.class);
+
+  public static Change getChange(Prolog engine) throws SystemException {
+    ChangeData cd = CHANGE_DATA.get(engine);
+    try {
+      return cd.change();
+    } catch (OrmException e) {
+      throw new SystemException("Cannot load change " + cd.getId());
+    }
+  }
+
+  public static PatchSet getPatchSet(Prolog engine) throws SystemException {
+    ChangeData cd = CHANGE_DATA.get(engine);
+    try {
+      return cd.currentPatchSet();
+    } catch (OrmException e) {
+      throw new SystemException(e.getMessage());
+    }
+  }
+
+  public static final StoredValue<RevCommit> COMMIT =
+      new StoredValue<RevCommit>() {
+        @Override
+        public RevCommit createValue(Prolog engine) {
+          Change change = getChange(engine);
+          PatchSet ps = getPatchSet(engine);
+          PrologEnvironment env = (PrologEnvironment) engine.control;
+          PatchSetUtil patchSetUtil = env.getArgs().getPatchsetUtil();
+          try {
+            return patchSetUtil.getRevCommit(change.getProject(), ps);
+          } catch (IOException e) {
+            throw new SystemException(e.getMessage());
+          }
+        }
+      };
+
+  public static final StoredValue<PatchList> PATCH_LIST =
+      new StoredValue<PatchList>() {
+        @Override
+        public PatchList createValue(Prolog engine) {
+          PrologEnvironment env = (PrologEnvironment) engine.control;
+          PatchSet ps = getPatchSet(engine);
+          PatchListCache plCache = env.getArgs().getPatchListCache();
+          Change change = getChange(engine);
+          Project.NameKey project = change.getProject();
+          ObjectId b = ObjectId.fromString(ps.getRevision().get());
+          Whitespace ws = Whitespace.IGNORE_NONE;
+          PatchListKey plKey = PatchListKey.againstDefaultBase(b, ws);
+          PatchList patchList;
+          try {
+            patchList = plCache.get(plKey, project);
+          } catch (PatchListNotAvailableException e) {
+            throw new SystemException("Cannot create " + plKey);
+          }
+          return patchList;
+        }
+      };
+
+  public static final StoredValue<Repository> REPOSITORY =
+      new StoredValue<Repository>() {
+        @Override
+        public Repository createValue(Prolog engine) {
+          PrologEnvironment env = (PrologEnvironment) engine.control;
+          GitRepositoryManager gitMgr = env.getArgs().getGitRepositoryManager();
+          Change change = getChange(engine);
+          Project.NameKey projectKey = change.getProject();
+          Repository repo;
+          try {
+            repo = gitMgr.openRepository(projectKey);
+          } catch (IOException e) {
+            throw new SystemException(e.getMessage());
+          }
+          env.addToCleanup(repo::close);
+          return repo;
+        }
+      };
+
+  public static final StoredValue<PermissionBackend> PERMISSION_BACKEND =
+      new StoredValue<PermissionBackend>() {
+        @Override
+        protected PermissionBackend createValue(Prolog engine) {
+          PrologEnvironment env = (PrologEnvironment) engine.control;
+          return env.getArgs().getPermissionBackend();
+        }
+      };
+
+  public static final StoredValue<AnonymousUser> ANONYMOUS_USER =
+      new StoredValue<AnonymousUser>() {
+        @Override
+        protected AnonymousUser createValue(Prolog engine) {
+          PrologEnvironment env = (PrologEnvironment) engine.control;
+          return env.getArgs().getAnonymousUser();
+        }
+      };
+
+  public static final StoredValue<Map<Account.Id, IdentifiedUser>> USERS =
+      new StoredValue<Map<Account.Id, IdentifiedUser>>() {
+        @Override
+        protected Map<Account.Id, IdentifiedUser> createValue(Prolog engine) {
+          return new HashMap<>();
+        }
+      };
+
+  private StoredValues() {}
+}
diff --git a/java/com/google/gerrit/server/rules/SubmitRule.java b/java/com/google/gerrit/server/rules/SubmitRule.java
new file mode 100644
index 0000000..2a68683
--- /dev/null
+++ b/java/com/google/gerrit/server/rules/SubmitRule.java
@@ -0,0 +1,44 @@
+// 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.
+package com.google.gerrit.server.rules;
+
+import com.google.gerrit.common.data.SubmitRecord;
+import com.google.gerrit.extensions.annotations.ExtensionPoint;
+import com.google.gerrit.server.project.SubmitRuleOptions;
+import com.google.gerrit.server.query.change.ChangeData;
+import java.util.Collection;
+
+/**
+ * Allows plugins to decide whether a change is ready to be submitted or not.
+ *
+ * <p>For a given {@link ChangeData}, each plugin is called and returns a {@link Collection} of
+ * {@link SubmitRecord}. This collection can be empty, or contain one or several values.
+ *
+ * <p>A Change can only be submitted if all the plugins give their consent.
+ *
+ * <p>Each {@link SubmitRecord} represents a decision made by the plugin. If the plugin rejects a
+ * change, it should hold valuable informations to help the end user understand and correct the
+ * blocking points.
+ *
+ * <p>It should be noted that each plugin can handle rules inheritance.
+ *
+ * <p>This interface should be used to write pre-submit validation rules. This includes both simple
+ * checks, coded in Java, and more complex fully fledged expression evaluators (think: Prolog,
+ * JavaCC, or even JavaScript rules).
+ */
+@ExtensionPoint
+public interface SubmitRule {
+  /** Returns a {@link Collection} of {@link SubmitRecord} status for the change. */
+  Collection<SubmitRecord> evaluate(ChangeData changeData, SubmitRuleOptions options);
+}
diff --git a/java/com/google/gerrit/server/schema/AbstractDisabledAccess.java b/java/com/google/gerrit/server/schema/AbstractDisabledAccess.java
new file mode 100644
index 0000000..17eb56e
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/AbstractDisabledAccess.java
@@ -0,0 +1,141 @@
+// Copyright (C) 2017 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.google.gerrit.server.schema;
+
+import static com.google.common.base.Preconditions.checkState;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.util.concurrent.Futures;
+import com.google.gerrit.reviewdb.server.ReviewDbWrapper;
+import com.google.gwtorm.client.Key;
+import com.google.gwtorm.server.Access;
+import com.google.gwtorm.server.AtomicUpdate;
+import com.google.gwtorm.server.ListResultSet;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.ResultSet;
+import java.util.Map;
+import java.util.function.Function;
+
+abstract class AbstractDisabledAccess<T, K extends Key<?>> implements Access<T, K> {
+  private static <T> ResultSet<T> empty() {
+    return new ListResultSet<>(ImmutableList.of());
+  }
+
+  @SuppressWarnings("deprecation")
+  private static <T>
+      com.google.common.util.concurrent.CheckedFuture<T, OrmException> emptyFuture() {
+    return Futures.immediateCheckedFuture(null);
+  }
+
+  // Don't even hold a reference to delegate, so it's not possible to use it
+  // accidentally.
+  private final ReviewDbWrapper wrapper;
+  private final String relationName;
+  private final int relationId;
+  private final Function<T, K> primaryKey;
+  private final Function<Iterable<T>, Map<K, T>> toMap;
+
+  AbstractDisabledAccess(ReviewDbWrapper wrapper, Access<T, K> delegate) {
+    this.wrapper = wrapper;
+    this.relationName = delegate.getRelationName();
+    this.relationId = delegate.getRelationID();
+    this.primaryKey = delegate::primaryKey;
+    this.toMap = delegate::toMap;
+  }
+
+  @Override
+  public final int getRelationID() {
+    return relationId;
+  }
+
+  @Override
+  public final String getRelationName() {
+    return relationName;
+  }
+
+  @Override
+  public final K primaryKey(T entity) {
+    return primaryKey.apply(entity);
+  }
+
+  @Override
+  public final Map<K, T> toMap(Iterable<T> iterable) {
+    return toMap.apply(iterable);
+  }
+
+  @Override
+  public final ResultSet<T> iterateAllEntities() {
+    return empty();
+  }
+
+  @SuppressWarnings("deprecation")
+  @Override
+  public final com.google.common.util.concurrent.CheckedFuture<T, OrmException> getAsync(K key) {
+    return emptyFuture();
+  }
+
+  @Override
+  public final ResultSet<T> get(Iterable<K> keys) {
+    return empty();
+  }
+
+  @Override
+  public final void insert(Iterable<T> instances) {
+    // Do nothing.
+  }
+
+  @Override
+  public final void update(Iterable<T> instances) {
+    // Do nothing.
+  }
+
+  @Override
+  public final void upsert(Iterable<T> instances) {
+    // Do nothing.
+  }
+
+  @Override
+  public final void deleteKeys(Iterable<K> keys) {
+    // Do nothing.
+  }
+
+  @Override
+  public final void delete(Iterable<T> instances) {
+    // Do nothing.
+  }
+
+  @Override
+  public final void beginTransaction(K key) {
+    // Keep track of when we've started a transaction so that we can avoid calling commit/rollback
+    // on the underlying ReviewDb. This is just a simple arm's-length approach, and may produce
+    // slightly different results from a native ReviewDb in corner cases like:
+    // * beginning transactions on different tables simultaneously
+    // * doing work between commit and rollback
+    // These kinds of things are already misuses of ReviewDb, and shouldn't be happening in current
+    // code anyway.
+    checkState(!wrapper.inTransaction(), "already in transaction");
+    wrapper.beginTransaction();
+  }
+
+  @Override
+  public final T atomicUpdate(K key, AtomicUpdate<T> update) {
+    return null;
+  }
+
+  @Override
+  public final T get(K id) {
+    return null;
+  }
+}
diff --git a/java/com/google/gerrit/server/schema/AclUtil.java b/java/com/google/gerrit/server/schema/AclUtil.java
new file mode 100644
index 0000000..f0aafef
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/AclUtil.java
@@ -0,0 +1,108 @@
+// Copyright (C) 2015 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.google.gerrit.server.schema;
+
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.common.data.PermissionRule;
+import com.google.gerrit.server.project.ProjectConfig;
+
+/**
+ * Contains functions to modify permissions. For all these functions, any of the groups may be null
+ * in which case it is ignored.
+ */
+public class AclUtil {
+  public static void grant(
+      ProjectConfig config, AccessSection section, String permission, GroupReference... groupList) {
+    grant(config, section, permission, false, groupList);
+  }
+
+  public static void grant(
+      ProjectConfig config,
+      AccessSection section,
+      String permission,
+      boolean force,
+      GroupReference... groupList) {
+    grant(config, section, permission, force, null, groupList);
+  }
+
+  public static void grant(
+      ProjectConfig config,
+      AccessSection section,
+      String permission,
+      boolean force,
+      Boolean exclusive,
+      GroupReference... groupList) {
+    Permission p = section.getPermission(permission, true);
+    if (exclusive != null) {
+      p.setExclusiveGroup(exclusive);
+    }
+    for (GroupReference group : groupList) {
+      if (group != null) {
+        PermissionRule r = rule(config, group);
+        r.setForce(force);
+        p.add(r);
+      }
+    }
+  }
+
+  public static void block(
+      ProjectConfig config, AccessSection section, String permission, GroupReference... groupList) {
+    Permission p = section.getPermission(permission, true);
+    for (GroupReference group : groupList) {
+      if (group != null) {
+        PermissionRule r = rule(config, group);
+        r.setBlock();
+        p.add(r);
+      }
+    }
+  }
+
+  public static void grant(
+      ProjectConfig config,
+      AccessSection section,
+      LabelType type,
+      int min,
+      int max,
+      GroupReference... groupList) {
+    grant(config, section, type, min, max, false, groupList);
+  }
+
+  public static void grant(
+      ProjectConfig config,
+      AccessSection section,
+      LabelType type,
+      int min,
+      int max,
+      boolean exclusive,
+      GroupReference... groupList) {
+    String name = Permission.LABEL + type.getName();
+    Permission p = section.getPermission(name, true);
+    p.setExclusiveGroup(exclusive);
+    for (GroupReference group : groupList) {
+      if (group != null) {
+        PermissionRule r = rule(config, group);
+        r.setRange(min, max);
+        p.add(r);
+      }
+    }
+  }
+
+  public static PermissionRule rule(ProjectConfig config, GroupReference group) {
+    return new PermissionRule(config.resolve(group));
+  }
+}
diff --git a/java/com/google/gerrit/server/schema/AllProjectsCreator.java b/java/com/google/gerrit/server/schema/AllProjectsCreator.java
new file mode 100644
index 0000000..348f88c
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/AllProjectsCreator.java
@@ -0,0 +1,278 @@
+// Copyright (C) 2013 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.google.gerrit.server.schema;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.gerrit.reviewdb.client.RefNames.REFS_SEQUENCES;
+import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
+import static com.google.gerrit.server.group.SystemGroupBackend.PROJECT_OWNERS;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static com.google.gerrit.server.schema.AclUtil.grant;
+import static com.google.gerrit.server.schema.AclUtil.rule;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.Version;
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.LabelValue;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.common.data.PermissionRule;
+import com.google.gerrit.common.data.PermissionRule.Action;
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.Sequences;
+import com.google.gerrit.server.UsedAt;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gerrit.server.notedb.RepoSequence;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.NullProgressMonitor;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.ReceiveCommand;
+
+/** Creates the {@code All-Projects} repository and initial ACLs. */
+public class AllProjectsCreator {
+  private final GitRepositoryManager repositoryManager;
+  private final AllProjectsName allProjectsName;
+  private final PersonIdent serverUser;
+  private final NotesMigration notesMigration;
+  private final GroupReference anonymous;
+  private final GroupReference registered;
+  private final GroupReference owners;
+
+  @Nullable private GroupReference admin;
+  @Nullable private GroupReference batch;
+  private String message;
+  private int firstChangeId = ReviewDb.FIRST_CHANGE_ID;
+  private LabelType codeReviewLabel;
+  private List<LabelType> additionalLabelType;
+
+  @Inject
+  AllProjectsCreator(
+      GitRepositoryManager repositoryManager,
+      AllProjectsName allProjectsName,
+      @GerritPersonIdent PersonIdent serverUser,
+      NotesMigration notesMigration,
+      SystemGroupBackend systemGroupBackend) {
+    this.repositoryManager = repositoryManager;
+    this.allProjectsName = allProjectsName;
+    this.serverUser = serverUser;
+    this.notesMigration = notesMigration;
+
+    this.anonymous = systemGroupBackend.getGroup(ANONYMOUS_USERS);
+    this.registered = systemGroupBackend.getGroup(REGISTERED_USERS);
+    this.owners = systemGroupBackend.getGroup(PROJECT_OWNERS);
+    this.codeReviewLabel = getDefaultCodeReviewLabel();
+    this.additionalLabelType = new ArrayList<>();
+  }
+
+  /** If called, grant default permissions to this admin group */
+  public AllProjectsCreator setAdministrators(GroupReference admin) {
+    this.admin = admin;
+    return this;
+  }
+
+  /** If called, grant stream-events permission and set appropriate priority for this group */
+  public AllProjectsCreator setBatchUsers(GroupReference batch) {
+    this.batch = batch;
+    return this;
+  }
+
+  public AllProjectsCreator setCommitMessage(String message) {
+    this.message = message;
+    return this;
+  }
+
+  @UsedAt(UsedAt.Project.GOOGLE)
+  public AllProjectsCreator setFirstChangeIdForNoteDb(int id) {
+    checkArgument(id > 0, "id must be positive: %s", id);
+    firstChangeId = id;
+    return this;
+  }
+
+  /** If called, the provided "Code-Review" label will be used rather than the default. */
+  @UsedAt(UsedAt.Project.GOOGLE)
+  public AllProjectsCreator setCodeReviewLabel(LabelType labelType) {
+    checkArgument(
+        labelType.getName().equals("Code-Review"), "label should have 'Code-Review' as its name");
+    this.codeReviewLabel = labelType;
+    return this;
+  }
+
+  @UsedAt(UsedAt.Project.GOOGLE)
+  public AllProjectsCreator addAdditionalLabel(LabelType labelType) {
+    additionalLabelType.add(labelType);
+    return this;
+  }
+
+  public void create() throws IOException, ConfigInvalidException {
+    try (Repository git = repositoryManager.openRepository(allProjectsName)) {
+      initAllProjects(git);
+    } catch (RepositoryNotFoundException notFound) {
+      // A repository may be missing if this project existed only to store
+      // inheritable permissions. For example 'All-Projects'.
+      try (Repository git = repositoryManager.createRepository(allProjectsName)) {
+        initAllProjects(git);
+        RefUpdate u = git.updateRef(Constants.HEAD);
+        u.link(RefNames.REFS_CONFIG);
+      } catch (RepositoryNotFoundException err) {
+        String name = allProjectsName.get();
+        throw new IOException("Cannot create repository " + name, err);
+      }
+    }
+  }
+
+  private void initAllProjects(Repository git) throws IOException, ConfigInvalidException {
+    BatchRefUpdate bru = git.getRefDatabase().newBatchUpdate();
+    try (MetaDataUpdate md =
+        new MetaDataUpdate(GitReferenceUpdated.DISABLED, allProjectsName, git, bru)) {
+      md.getCommitBuilder().setAuthor(serverUser);
+      md.getCommitBuilder().setCommitter(serverUser);
+      md.setMessage(
+          MoreObjects.firstNonNull(
+              Strings.emptyToNull(message),
+              "Initialized Gerrit Code Review " + Version.getVersion()));
+
+      ProjectConfig config = ProjectConfig.read(md);
+      Project p = config.getProject();
+      p.setDescription("Access inherited by all other projects.");
+      p.setBooleanConfig(BooleanProjectConfig.REQUIRE_CHANGE_ID, InheritableBoolean.TRUE);
+      p.setBooleanConfig(BooleanProjectConfig.USE_CONTENT_MERGE, InheritableBoolean.TRUE);
+      p.setBooleanConfig(BooleanProjectConfig.USE_CONTRIBUTOR_AGREEMENTS, InheritableBoolean.FALSE);
+      p.setBooleanConfig(BooleanProjectConfig.USE_SIGNED_OFF_BY, InheritableBoolean.FALSE);
+      p.setBooleanConfig(BooleanProjectConfig.ENABLE_SIGNED_PUSH, InheritableBoolean.FALSE);
+
+      AccessSection cap = config.getAccessSection(AccessSection.GLOBAL_CAPABILITIES, true);
+      AccessSection all = config.getAccessSection(AccessSection.ALL, true);
+      AccessSection heads = config.getAccessSection(AccessSection.HEADS, true);
+      AccessSection tags = config.getAccessSection("refs/tags/*", true);
+      AccessSection meta = config.getAccessSection(RefNames.REFS_CONFIG, true);
+      AccessSection refsFor = config.getAccessSection("refs/for/*", true);
+      AccessSection magic = config.getAccessSection("refs/for/" + AccessSection.ALL, true);
+
+      grant(config, cap, GlobalCapability.ADMINISTRATE_SERVER, admin);
+      grant(config, all, Permission.READ, admin, anonymous);
+      grant(config, refsFor, Permission.ADD_PATCH_SET, registered);
+
+      if (batch != null) {
+        Permission priority = cap.getPermission(GlobalCapability.PRIORITY, true);
+        PermissionRule r = rule(config, batch);
+        r.setAction(Action.BATCH);
+        priority.add(r);
+
+        Permission stream = cap.getPermission(GlobalCapability.STREAM_EVENTS, true);
+        stream.add(rule(config, batch));
+      }
+
+      initLabels(config);
+      grant(config, heads, codeReviewLabel, -1, 1, registered);
+
+      grant(config, heads, codeReviewLabel, -2, 2, admin, owners);
+      grant(config, heads, Permission.CREATE, admin, owners);
+      grant(config, heads, Permission.PUSH, admin, owners);
+      grant(config, heads, Permission.SUBMIT, admin, owners);
+      grant(config, heads, Permission.FORGE_AUTHOR, registered);
+      grant(config, heads, Permission.FORGE_COMMITTER, admin, owners);
+      grant(config, heads, Permission.EDIT_TOPIC_NAME, true, admin, owners);
+
+      grant(config, tags, Permission.CREATE, admin, owners);
+      grant(config, tags, Permission.CREATE_TAG, admin, owners);
+      grant(config, tags, Permission.CREATE_SIGNED_TAG, admin, owners);
+
+      grant(config, magic, Permission.PUSH, registered);
+      grant(config, magic, Permission.PUSH_MERGE, registered);
+
+      meta.getPermission(Permission.READ, true).setExclusiveGroup(true);
+      grant(config, meta, Permission.READ, admin, owners);
+      grant(config, meta, codeReviewLabel, -2, 2, admin, owners);
+      grant(config, meta, Permission.CREATE, admin, owners);
+      grant(config, meta, Permission.PUSH, admin, owners);
+      grant(config, meta, Permission.SUBMIT, admin, owners);
+
+      config.commitToNewRef(md, RefNames.REFS_CONFIG);
+      initSequences(git, bru);
+      execute(git, bru);
+    }
+  }
+
+  @UsedAt(UsedAt.Project.GOOGLE)
+  public static LabelType getDefaultCodeReviewLabel() {
+    LabelType type =
+        new LabelType(
+            "Code-Review",
+            ImmutableList.of(
+                new LabelValue((short) 2, "Looks good to me, approved"),
+                new LabelValue((short) 1, "Looks good to me, but someone else must approve"),
+                new LabelValue((short) 0, "No score"),
+                new LabelValue((short) -1, "I would prefer this is not merged as is"),
+                new LabelValue((short) -2, "This shall not be merged")));
+    type.setCopyMinScore(true);
+    type.setCopyAllScoresOnTrivialRebase(true);
+    return type;
+  }
+
+  private void initLabels(ProjectConfig projectConfig) {
+    projectConfig.getLabelSections().put(codeReviewLabel.getName(), codeReviewLabel);
+    additionalLabelType.forEach(t -> projectConfig.getLabelSections().put(t.getName(), t));
+  }
+
+  private void initSequences(Repository git, BatchRefUpdate bru) throws IOException {
+    if (notesMigration.readChangeSequence()
+        && git.exactRef(REFS_SEQUENCES + Sequences.NAME_CHANGES) == null) {
+      // Can't easily reuse the inserter from MetaDataUpdate, but this shouldn't slow down site
+      // initialization unduly.
+      try (ObjectInserter ins = git.newObjectInserter()) {
+        bru.addCommand(RepoSequence.storeNew(ins, Sequences.NAME_CHANGES, firstChangeId));
+        ins.flush();
+      }
+    }
+  }
+
+  private void execute(Repository git, BatchRefUpdate bru) throws IOException {
+    try (RevWalk rw = new RevWalk(git)) {
+      bru.execute(rw, NullProgressMonitor.INSTANCE);
+    }
+    for (ReceiveCommand cmd : bru.getCommands()) {
+      if (cmd.getResult() != ReceiveCommand.Result.OK) {
+        throw new IOException("Failed to initialize " + allProjectsName + " refs:\n" + bru);
+      }
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/schema/AllUsersCreator.java b/java/com/google/gerrit/server/schema/AllUsersCreator.java
new file mode 100644
index 0000000..3779d0d
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/AllUsersCreator.java
@@ -0,0 +1,145 @@
+// Copyright (C) 2014 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.google.gerrit.server.schema;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static com.google.gerrit.server.schema.AclUtil.grant;
+import static com.google.gerrit.server.schema.AllProjectsCreator.getDefaultCodeReviewLabel;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.Version;
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.UsedAt;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.server.project.RefPattern;
+import com.google.inject.Inject;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.Repository;
+
+/** Creates the {@code All-Users} repository. */
+public class AllUsersCreator {
+  private final GitRepositoryManager mgr;
+  private final AllUsersName allUsersName;
+  private final PersonIdent serverUser;
+  private final GroupReference registered;
+
+  @Nullable private GroupReference admin;
+  private LabelType codeReviewLabel;
+
+  @Inject
+  AllUsersCreator(
+      GitRepositoryManager mgr,
+      AllUsersName allUsersName,
+      SystemGroupBackend systemGroupBackend,
+      @GerritPersonIdent PersonIdent serverUser) {
+    this.mgr = mgr;
+    this.allUsersName = allUsersName;
+    this.serverUser = serverUser;
+    this.registered = systemGroupBackend.getGroup(REGISTERED_USERS);
+    this.codeReviewLabel = getDefaultCodeReviewLabel();
+  }
+
+  /**
+   * If setAdministrators() is called, grant the given administrator group permissions on the
+   * default user.
+   */
+  public AllUsersCreator setAdministrators(GroupReference admin) {
+    this.admin = admin;
+    return this;
+  }
+
+  /** If called, the provided "Code-Review" label will be used rather than the default. */
+  @UsedAt(UsedAt.Project.GOOGLE)
+  public AllUsersCreator setCodeReviewLabel(LabelType labelType) {
+    checkArgument(
+        labelType.getName().equals("Code-Review"), "label should have 'Code-Review' as its name");
+    this.codeReviewLabel = labelType;
+    return this;
+  }
+
+  public void create() throws IOException, ConfigInvalidException {
+    try (Repository git = mgr.openRepository(allUsersName)) {
+      initAllUsers(git);
+    } catch (RepositoryNotFoundException notFound) {
+      try (Repository git = mgr.createRepository(allUsersName)) {
+        initAllUsers(git);
+        RefUpdate u = git.updateRef(Constants.HEAD);
+        u.link(RefNames.REFS_CONFIG);
+      } catch (RepositoryNotFoundException err) {
+        String name = allUsersName.get();
+        throw new IOException("Cannot create repository " + name, err);
+      }
+    }
+  }
+
+  private void initAllUsers(Repository git) throws IOException, ConfigInvalidException {
+    try (MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, git)) {
+      md.getCommitBuilder().setAuthor(serverUser);
+      md.getCommitBuilder().setCommitter(serverUser);
+      md.setMessage("Initialized Gerrit Code Review " + Version.getVersion());
+
+      ProjectConfig config = ProjectConfig.read(md);
+      Project project = config.getProject();
+      project.setDescription("Individual user settings and preferences.");
+
+      AccessSection users =
+          config.getAccessSection(
+              RefNames.REFS_USERS + "${" + RefPattern.USERID_SHARDED + "}", true);
+
+      // Initialize "Code-Review" label.
+      config.getLabelSections().put(codeReviewLabel.getName(), codeReviewLabel);
+
+      grant(config, users, Permission.READ, false, true, registered);
+      grant(config, users, Permission.PUSH, false, true, registered);
+      grant(config, users, Permission.SUBMIT, false, true, registered);
+      grant(config, users, codeReviewLabel, -2, 2, true, registered);
+
+      if (admin != null) {
+        AccessSection defaults = config.getAccessSection(RefNames.REFS_USERS_DEFAULT, true);
+        defaults.getPermission(Permission.READ, true).setExclusiveGroup(true);
+        grant(config, defaults, Permission.READ, admin);
+        defaults.getPermission(Permission.PUSH, true).setExclusiveGroup(true);
+        grant(config, defaults, Permission.PUSH, admin);
+        defaults.getPermission(Permission.CREATE, true).setExclusiveGroup(true);
+        grant(config, defaults, Permission.CREATE, admin);
+      }
+
+      // Grant read permissions on the group branches to all users.
+      // This allows group owners to see the group refs. VisibleRefFilter ensures that read
+      // permissions for non-group-owners are ignored.
+      AccessSection groups = config.getAccessSection(RefNames.REFS_GROUPS + "*", true);
+      grant(config, groups, Permission.READ, false, true, registered);
+
+      config.commit(md);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/schema/BUILD b/java/com/google/gerrit/server/schema/BUILD
new file mode 100644
index 0000000..a04def6
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/BUILD
@@ -0,0 +1,29 @@
+java_library(
+    name = "schema",
+    srcs = glob(
+        ["**/*.java"],
+    ),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/common:annotations",
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/lifecycle",
+        "//java/com/google/gerrit/metrics",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/server/util/time",
+        "//java/org/eclipse/jgit:server",
+        "//lib:guava",
+        "//lib:gwtorm",
+        "//lib/auto:auto-value",
+        "//lib/auto:auto-value-annotations",
+        "//lib/commons:dbcp",
+        "//lib/flogger:api",
+        "//lib/guice",
+        "//lib/jgit/org.eclipse.jgit.archive:jgit-archive",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/log:jsonevent-layout",
+        "//lib/log:log4j",
+    ],
+)
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/BaseDataSourceType.java b/java/com/google/gerrit/server/schema/BaseDataSourceType.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/BaseDataSourceType.java
rename to java/com/google/gerrit/server/schema/BaseDataSourceType.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/DB2.java b/java/com/google/gerrit/server/schema/DB2.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/DB2.java
rename to java/com/google/gerrit/server/schema/DB2.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceModule.java b/java/com/google/gerrit/server/schema/DataSourceModule.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceModule.java
rename to java/com/google/gerrit/server/schema/DataSourceModule.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceProvider.java b/java/com/google/gerrit/server/schema/DataSourceProvider.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceProvider.java
rename to java/com/google/gerrit/server/schema/DataSourceProvider.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceType.java b/java/com/google/gerrit/server/schema/DataSourceType.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceType.java
rename to java/com/google/gerrit/server/schema/DataSourceType.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/DatabaseModule.java b/java/com/google/gerrit/server/schema/DatabaseModule.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/DatabaseModule.java
rename to java/com/google/gerrit/server/schema/DatabaseModule.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Derby.java b/java/com/google/gerrit/server/schema/Derby.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Derby.java
rename to java/com/google/gerrit/server/schema/Derby.java
diff --git a/java/com/google/gerrit/server/schema/GroupBundle.java b/java/com/google/gerrit/server/schema/GroupBundle.java
new file mode 100644
index 0000000..4b8bdcc
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/GroupBundle.java
@@ -0,0 +1,768 @@
+// Copyright (C) 2017 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.google.gerrit.server.schema;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static com.google.common.collect.ImmutableSet.toImmutableSet;
+import static com.google.gerrit.reviewdb.server.ReviewDbUtil.checkColumns;
+import static java.util.Comparator.naturalOrder;
+import static java.util.Comparator.nullsLast;
+import static java.util.stream.Collectors.toList;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.collect.Multimaps;
+import com.google.common.collect.Streams;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.AccountGroupById;
+import com.google.gerrit.reviewdb.client.AccountGroupByIdAud;
+import com.google.gerrit.reviewdb.client.AccountGroupMember;
+import com.google.gerrit.reviewdb.client.AccountGroupMemberAudit;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.reviewdb.server.ReviewDbWrapper;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.group.db.AuditLogReader;
+import com.google.gerrit.server.group.db.GroupConfig;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.jdbc.JdbcSchema;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Stream;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Repository;
+
+/**
+ * A bundle of all entities rooted at a single {@link AccountGroup} entity.
+ *
+ * <p>Used primarily during the migration process. Most callers should prefer {@link InternalGroup}
+ * instead.
+ */
+@AutoValue
+abstract class GroupBundle {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  static {
+    // Initialization-time checks that the column set hasn't changed since the
+    // last time this file was updated.
+    checkColumns(AccountGroup.NameKey.class, 1);
+    checkColumns(AccountGroup.UUID.class, 1);
+    checkColumns(AccountGroup.Id.class, 1);
+    checkColumns(AccountGroup.class, 1, 2, 4, 7, 9, 10, 11);
+
+    checkColumns(AccountGroupById.Key.class, 1, 2);
+    checkColumns(AccountGroupById.class, 1);
+
+    checkColumns(AccountGroupByIdAud.Key.class, 1, 2, 3);
+    checkColumns(AccountGroupByIdAud.class, 1, 2, 3, 4);
+
+    checkColumns(AccountGroupMember.Key.class, 1, 2);
+    checkColumns(AccountGroupMember.class, 1);
+
+    checkColumns(AccountGroupMemberAudit.Key.class, 1, 2, 3);
+    checkColumns(AccountGroupMemberAudit.class, 1, 2, 3, 4);
+  }
+
+  public enum Source {
+    REVIEW_DB("ReviewDb"),
+    NOTE_DB("NoteDb");
+
+    private final String name;
+
+    private Source(String name) {
+      this.name = name;
+    }
+
+    @Override
+    public String toString() {
+      return name;
+    }
+  }
+
+  @Singleton
+  public static class Factory {
+    private final AuditLogReader auditLogReader;
+
+    @Inject
+    Factory(AuditLogReader auditLogReader) {
+      this.auditLogReader = auditLogReader;
+    }
+
+    public GroupBundle fromNoteDb(
+        Project.NameKey projectName, Repository repo, AccountGroup.UUID uuid)
+        throws ConfigInvalidException, IOException {
+      GroupConfig groupConfig = GroupConfig.loadForGroup(projectName, repo, uuid);
+      InternalGroup internalGroup = groupConfig.getLoadedGroup().get();
+      AccountGroup.Id groupId = internalGroup.getId();
+
+      AccountGroup accountGroup =
+          new AccountGroup(
+              internalGroup.getNameKey(),
+              internalGroup.getId(),
+              internalGroup.getGroupUUID(),
+              internalGroup.getCreatedOn());
+      accountGroup.setDescription(internalGroup.getDescription());
+      accountGroup.setOwnerGroupUUID(internalGroup.getOwnerGroupUUID());
+      accountGroup.setVisibleToAll(internalGroup.isVisibleToAll());
+
+      return create(
+          Source.NOTE_DB,
+          accountGroup,
+          internalGroup.getMembers().stream()
+              .map(
+                  accountId ->
+                      new AccountGroupMember(new AccountGroupMember.Key(accountId, groupId)))
+              .collect(toImmutableSet()),
+          auditLogReader.getMembersAudit(repo, uuid),
+          internalGroup.getSubgroups().stream()
+              .map(
+                  subgroupUuid ->
+                      new AccountGroupById(new AccountGroupById.Key(groupId, subgroupUuid)))
+              .collect(toImmutableSet()),
+          auditLogReader.getSubgroupsAudit(repo, uuid));
+    }
+
+    public static GroupBundle fromReviewDb(ReviewDb db, AccountGroup.UUID groupUuid)
+        throws OrmException {
+      JdbcSchema jdbcSchema = ReviewDbWrapper.unwrapJbdcSchema(db);
+      AccountGroup group = readAccountGroupFromReviewDb(jdbcSchema, groupUuid);
+      AccountGroup.Id groupId = group.getId();
+
+      return create(
+          Source.REVIEW_DB,
+          group,
+          readAccountGroupMembersFromReviewDb(jdbcSchema, groupId),
+          readAccountGroupMemberAuditsFromReviewDb(jdbcSchema, groupId),
+          readAccountGroupSubgroupsFromReviewDb(jdbcSchema, groupId),
+          readAccountGroupSubgroupAuditsFromReviewDb(jdbcSchema, groupId));
+    }
+
+    private static AccountGroup readAccountGroupFromReviewDb(
+        JdbcSchema jdbcSchema, AccountGroup.UUID groupUuid) throws OrmException {
+      try (Statement stmt = jdbcSchema.getConnection().createStatement();
+          ResultSet rs =
+              stmt.executeQuery(
+                  "SELECT group_id,"
+                      + " name,"
+                      + " created_on,"
+                      + " description,"
+                      + " owner_group_uuid,"
+                      + " visible_to_all"
+                      + " FROM account_groups"
+                      + " WHERE group_uuid = '"
+                      + groupUuid.get()
+                      + "'")) {
+        if (!rs.next()) {
+          throw new OrmException(String.format("Group %s not found", groupUuid));
+        }
+
+        AccountGroup.Id groupId = new AccountGroup.Id(rs.getInt(1));
+        AccountGroup.NameKey groupName = new AccountGroup.NameKey(rs.getString(2));
+        Timestamp createdOn = rs.getTimestamp(3);
+        String description = rs.getString(4);
+        AccountGroup.UUID ownerGroupUuid = new AccountGroup.UUID(rs.getString(5));
+        boolean visibleToAll = "Y".equals(rs.getString(6));
+
+        AccountGroup group = new AccountGroup(groupName, groupId, groupUuid, createdOn);
+        group.setDescription(description);
+        group.setOwnerGroupUUID(ownerGroupUuid);
+        group.setVisibleToAll(visibleToAll);
+
+        if (rs.next()) {
+          throw new OrmException(String.format("Group UUID %s is ambiguous", groupUuid));
+        }
+
+        return group;
+      } catch (SQLException e) {
+        throw new OrmException(
+            String.format("Failed to read account group %s from ReviewDb", groupUuid.get()), e);
+      }
+    }
+
+    private static List<AccountGroupMember> readAccountGroupMembersFromReviewDb(
+        JdbcSchema jdbcSchema, AccountGroup.Id groupId) throws OrmException {
+      try (Statement stmt = jdbcSchema.getConnection().createStatement();
+          ResultSet rs =
+              stmt.executeQuery(
+                  "SELECT account_id"
+                      + " FROM account_group_members"
+                      + " WHERE group_id = '"
+                      + groupId.get()
+                      + "'")) {
+        List<AccountGroupMember> members = new ArrayList<>();
+        while (rs.next()) {
+          Account.Id accountId = new Account.Id(rs.getInt(1));
+          members.add(new AccountGroupMember(new AccountGroupMember.Key(accountId, groupId)));
+        }
+        return members;
+      } catch (SQLException e) {
+        throw new OrmException(
+            String.format(
+                "Failed to read members of account group %s from ReviewDb", groupId.get()),
+            e);
+      }
+    }
+
+    private static List<AccountGroupMemberAudit> readAccountGroupMemberAuditsFromReviewDb(
+        JdbcSchema jdbcSchema, AccountGroup.Id groupId) throws OrmException {
+      try (Statement stmt = jdbcSchema.getConnection().createStatement();
+          ResultSet rs =
+              stmt.executeQuery(
+                  "SELECT account_id, added_by, added_on, removed_by, removed_on"
+                      + " FROM account_group_members_audit"
+                      + " WHERE group_id = '"
+                      + groupId.get()
+                      + "'")) {
+        List<AccountGroupMemberAudit> audits = new ArrayList<>();
+        while (rs.next()) {
+          Account.Id accountId = new Account.Id(rs.getInt(1));
+
+          Account.Id addedBy = new Account.Id(rs.getInt(2));
+          Timestamp addedOn = rs.getTimestamp(3);
+
+          Timestamp removedOn = rs.getTimestamp(5);
+          Account.Id removedBy = removedOn != null ? new Account.Id(rs.getInt(4)) : null;
+
+          AccountGroupMemberAudit.Key key =
+              new AccountGroupMemberAudit.Key(accountId, groupId, addedOn);
+          AccountGroupMemberAudit audit = new AccountGroupMemberAudit(key, addedBy);
+          audit.removed(removedBy, removedOn);
+          audits.add(audit);
+        }
+        return audits;
+      } catch (SQLException e) {
+        throw new OrmException(
+            String.format(
+                "Failed to read member audits of account group %s from ReviewDb", groupId.get()),
+            e);
+      }
+    }
+
+    private static List<AccountGroupById> readAccountGroupSubgroupsFromReviewDb(
+        JdbcSchema jdbcSchema, AccountGroup.Id groupId) throws OrmException {
+      try (Statement stmt = jdbcSchema.getConnection().createStatement();
+          ResultSet rs =
+              stmt.executeQuery(
+                  "SELECT include_uuid"
+                      + " FROM account_group_by_id"
+                      + " WHERE group_id = '"
+                      + groupId.get()
+                      + "'")) {
+        List<AccountGroupById> subgroups = new ArrayList<>();
+        while (rs.next()) {
+          AccountGroup.UUID includedGroupUuid = new AccountGroup.UUID(rs.getString(1));
+          subgroups.add(new AccountGroupById(new AccountGroupById.Key(groupId, includedGroupUuid)));
+        }
+        return subgroups;
+      } catch (SQLException e) {
+        throw new OrmException(
+            String.format(
+                "Failed to read subgroups of account group %s from ReviewDb", groupId.get()),
+            e);
+      }
+    }
+
+    private static List<AccountGroupByIdAud> readAccountGroupSubgroupAuditsFromReviewDb(
+        JdbcSchema jdbcSchema, AccountGroup.Id groupId) throws OrmException {
+      try (Statement stmt = jdbcSchema.getConnection().createStatement();
+          ResultSet rs =
+              stmt.executeQuery(
+                  "SELECT include_uuid, added_by, added_on, removed_by, removed_on"
+                      + " FROM account_group_by_id_aud"
+                      + " WHERE group_id = '"
+                      + groupId.get()
+                      + "'")) {
+        List<AccountGroupByIdAud> audits = new ArrayList<>();
+        while (rs.next()) {
+          AccountGroup.UUID includedGroupUuid = new AccountGroup.UUID(rs.getString(1));
+
+          Account.Id addedBy = new Account.Id(rs.getInt(2));
+          Timestamp addedOn = rs.getTimestamp(3);
+
+          Timestamp removedOn = rs.getTimestamp(5);
+          Account.Id removedBy = removedOn != null ? new Account.Id(rs.getInt(4)) : null;
+
+          AccountGroupByIdAud.Key key =
+              new AccountGroupByIdAud.Key(groupId, includedGroupUuid, addedOn);
+          AccountGroupByIdAud audit = new AccountGroupByIdAud(key, addedBy);
+          audit.removed(removedBy, removedOn);
+          audits.add(audit);
+        }
+        return audits;
+      } catch (SQLException e) {
+        throw new OrmException(
+            String.format(
+                "Failed to read subgroup audits of account group %s from ReviewDb", groupId.get()),
+            e);
+      }
+    }
+  }
+
+  private static final Comparator<AccountGroupMember> ACCOUNT_GROUP_MEMBER_COMPARATOR =
+      Comparator.comparingInt((AccountGroupMember m) -> m.getAccountGroupId().get())
+          .thenComparingInt(m -> m.getAccountId().get());
+
+  private static final Comparator<AccountGroupMemberAudit> ACCOUNT_GROUP_MEMBER_AUDIT_COMPARATOR =
+      Comparator.comparingInt((AccountGroupMemberAudit a) -> a.getGroupId().get())
+          .thenComparing(AccountGroupMemberAudit::getAddedOn)
+          .thenComparingInt(a -> a.getAddedBy().get())
+          .thenComparingInt(a -> a.getMemberId().get())
+          .thenComparing(
+              a -> a.getRemovedBy() != null ? a.getRemovedBy().get() : null,
+              nullsLast(naturalOrder()))
+          .thenComparing(AccountGroupMemberAudit::getRemovedOn, nullsLast(naturalOrder()));
+
+  private static final Comparator<AccountGroupById> ACCOUNT_GROUP_BY_ID_COMPARATOR =
+      Comparator.comparingInt((AccountGroupById m) -> m.getGroupId().get())
+          .thenComparing(AccountGroupById::getIncludeUUID);
+
+  private static final Comparator<AccountGroupByIdAud> ACCOUNT_GROUP_BY_ID_AUD_COMPARATOR =
+      Comparator.comparingInt((AccountGroupByIdAud a) -> a.getGroupId().get())
+          .thenComparing(AccountGroupByIdAud::getAddedOn)
+          .thenComparingInt(a -> a.getAddedBy().get())
+          .thenComparing(AccountGroupByIdAud::getIncludeUUID)
+          .thenComparing(
+              a -> a.getRemovedBy() != null ? a.getRemovedBy().get() : null,
+              nullsLast(naturalOrder()))
+          .thenComparing(AccountGroupByIdAud::getRemovedOn, nullsLast(naturalOrder()));
+
+  private static final Comparator<AuditEntry> AUDIT_ENTRY_COMPARATOR =
+      Comparator.comparing(AuditEntry::getTimestamp)
+          .thenComparing(AuditEntry::getAction, Comparator.comparingInt(Action::getOrder));
+
+  public static GroupBundle create(
+      Source source,
+      AccountGroup group,
+      Iterable<AccountGroupMember> members,
+      Iterable<AccountGroupMemberAudit> memberAudit,
+      Iterable<AccountGroupById> byId,
+      Iterable<AccountGroupByIdAud> byIdAudit) {
+    AccountGroup.UUID uuid = group.getGroupUUID();
+    return new AutoValue_GroupBundle.Builder()
+        .source(source)
+        .group(group)
+        .members(
+            logIfNotUnique(
+                source, uuid, members, ACCOUNT_GROUP_MEMBER_COMPARATOR, AccountGroupMember.class))
+        .memberAudit(
+            logIfNotUnique(
+                source,
+                uuid,
+                memberAudit,
+                ACCOUNT_GROUP_MEMBER_AUDIT_COMPARATOR,
+                AccountGroupMemberAudit.class))
+        .byId(
+            logIfNotUnique(
+                source, uuid, byId, ACCOUNT_GROUP_BY_ID_COMPARATOR, AccountGroupById.class))
+        .byIdAudit(
+            logIfNotUnique(
+                source,
+                uuid,
+                byIdAudit,
+                ACCOUNT_GROUP_BY_ID_AUD_COMPARATOR,
+                AccountGroupByIdAud.class))
+        .build();
+  }
+
+  private static <T> ImmutableSet<T> logIfNotUnique(
+      Source source,
+      AccountGroup.UUID uuid,
+      Iterable<T> iterable,
+      Comparator<T> comparator,
+      Class<T> clazz) {
+    List<T> list = Streams.stream(iterable).sorted(comparator).collect(toList());
+    ImmutableSet<T> set = ImmutableSet.copyOf(list);
+    if (set.size() != list.size()) {
+      // One way this can happen is that distinct audit entities can compare equal, because
+      // AccountGroup{MemberAudit,ByIdAud}.Key does not include the addedOn timestamp in its
+      // members() list. However, this particular issue only applies to pure adds, since removedOn
+      // *is* included in equality. As a result, if this happens, it means the audit log is already
+      // corrupt, and it's not clear if we can programmatically repair it. For migrating to NoteDb,
+      // we'll try our best to recreate it, but no guarantees it will match the real sequence of
+      // attempted operations, which is in any case lost in the mists of time.
+      logger.atWarning().log(
+          "group %s in %s has duplicate %s entities: %s",
+          uuid, source, clazz.getSimpleName(), iterable);
+    }
+    return set;
+  }
+
+  static Builder builder() {
+    return new AutoValue_GroupBundle.Builder().members().memberAudit().byId().byIdAudit();
+  }
+
+  public static ImmutableList<String> compareWithAudits(
+      GroupBundle reviewDbBundle, GroupBundle noteDbBundle) {
+    return compare(reviewDbBundle, noteDbBundle, true);
+  }
+
+  public static ImmutableList<String> compareWithoutAudits(
+      GroupBundle reviewDbBundle, GroupBundle noteDbBundle) {
+    return compare(reviewDbBundle, noteDbBundle, false);
+  }
+
+  private static ImmutableList<String> compare(
+      GroupBundle reviewDbBundle, GroupBundle noteDbBundle, boolean compareAudits) {
+    // Normalize the ReviewDb bundle to what we expect in NoteDb. This means that values in error
+    // messages will not reflect the actual data in ReviewDb, but it will make it easier for humans
+    // to see the difference.
+    reviewDbBundle = reviewDbBundle.truncateToSecond();
+    AccountGroup reviewDbGroup = new AccountGroup(reviewDbBundle.group());
+    reviewDbGroup.setDescription(Strings.emptyToNull(reviewDbGroup.getDescription()));
+    reviewDbBundle = reviewDbBundle.toBuilder().group(reviewDbGroup).build();
+
+    checkArgument(
+        reviewDbBundle.source() == Source.REVIEW_DB,
+        "first bundle's source must be %s: %s",
+        Source.REVIEW_DB,
+        reviewDbBundle);
+    checkArgument(
+        noteDbBundle.source() == Source.NOTE_DB,
+        "second bundle's source must be %s: %s",
+        Source.NOTE_DB,
+        noteDbBundle);
+
+    ImmutableList.Builder<String> result = ImmutableList.builder();
+    if (!reviewDbBundle.group().equals(noteDbBundle.group())) {
+      result.add(
+          "AccountGroups differ\n"
+              + ("ReviewDb: " + reviewDbBundle.group() + "\n")
+              + ("NoteDb  : " + noteDbBundle.group()));
+    }
+    if (!reviewDbBundle.members().equals(noteDbBundle.members())) {
+      result.add(
+          "AccountGroupMembers differ\n"
+              + ("ReviewDb: " + reviewDbBundle.members() + "\n")
+              + ("NoteDb  : " + noteDbBundle.members()));
+    }
+    if (compareAudits
+        && !areMemberAuditsConsideredEqual(
+            reviewDbBundle.memberAudit(), noteDbBundle.memberAudit())) {
+      result.add(
+          "AccountGroupMemberAudits differ\n"
+              + ("ReviewDb: " + reviewDbBundle.memberAudit() + "\n")
+              + ("NoteDb  : " + noteDbBundle.memberAudit()));
+    }
+    if (!reviewDbBundle.byId().equals(noteDbBundle.byId())) {
+      result.add(
+          "AccountGroupByIds differ\n"
+              + ("ReviewDb: " + reviewDbBundle.byId() + "\n")
+              + ("NoteDb  : " + noteDbBundle.byId()));
+    }
+    if (compareAudits
+        && !areByIdAuditsConsideredEqual(reviewDbBundle.byIdAudit(), noteDbBundle.byIdAudit())) {
+      result.add(
+          "AccountGroupByIdAudits differ\n"
+              + ("ReviewDb: " + reviewDbBundle.byIdAudit() + "\n")
+              + ("NoteDb  : " + noteDbBundle.byIdAudit()));
+    }
+    return result.build();
+  }
+
+  private static boolean areMemberAuditsConsideredEqual(
+      ImmutableSet<AccountGroupMemberAudit> reviewDbMemberAudits,
+      ImmutableSet<AccountGroupMemberAudit> noteDbMemberAudits) {
+    ListMultimap<String, AuditEntry> reviewDbMemberAuditsByMemberId =
+        toMemberAuditEntriesByMemberId(reviewDbMemberAudits);
+    ListMultimap<String, AuditEntry> noteDbMemberAuditsByMemberId =
+        toMemberAuditEntriesByMemberId(noteDbMemberAudits);
+
+    return areConsideredEqual(reviewDbMemberAuditsByMemberId, noteDbMemberAuditsByMemberId);
+  }
+
+  private static boolean areByIdAuditsConsideredEqual(
+      ImmutableSet<AccountGroupByIdAud> reviewDbByIdAudits,
+      ImmutableSet<AccountGroupByIdAud> noteDbByIdAudits) {
+    ListMultimap<String, AuditEntry> reviewDbByIdAuditsById =
+        toByIdAuditEntriesById(reviewDbByIdAudits);
+    ListMultimap<String, AuditEntry> noteDbByIdAuditsById =
+        toByIdAuditEntriesById(noteDbByIdAudits);
+
+    return areConsideredEqual(reviewDbByIdAuditsById, noteDbByIdAuditsById);
+  }
+
+  private static ListMultimap<String, AuditEntry> toMemberAuditEntriesByMemberId(
+      ImmutableSet<AccountGroupMemberAudit> memberAudits) {
+    return memberAudits.stream()
+        .flatMap(GroupBundle::toAuditEntries)
+        .collect(
+            Multimaps.toMultimap(
+                AuditEntry::getTarget,
+                Function.identity(),
+                MultimapBuilder.hashKeys().arrayListValues()::build));
+  }
+
+  private static Stream<AuditEntry> toAuditEntries(AccountGroupMemberAudit memberAudit) {
+    AuditEntry additionAuditEntry =
+        AuditEntry.create(
+            Action.ADD,
+            memberAudit.getAddedBy(),
+            memberAudit.getMemberId(),
+            memberAudit.getAddedOn());
+    if (memberAudit.isActive()) {
+      return Stream.of(additionAuditEntry);
+    }
+
+    AuditEntry removalAuditEntry =
+        AuditEntry.create(
+            Action.REMOVE,
+            memberAudit.getRemovedBy(),
+            memberAudit.getMemberId(),
+            memberAudit.getRemovedOn());
+    return Stream.of(additionAuditEntry, removalAuditEntry);
+  }
+
+  private static ListMultimap<String, AuditEntry> toByIdAuditEntriesById(
+      ImmutableSet<AccountGroupByIdAud> byIdAudits) {
+    return byIdAudits.stream()
+        .flatMap(GroupBundle::toAuditEntries)
+        .collect(
+            Multimaps.toMultimap(
+                AuditEntry::getTarget,
+                Function.identity(),
+                MultimapBuilder.hashKeys().arrayListValues()::build));
+  }
+
+  private static Stream<AuditEntry> toAuditEntries(AccountGroupByIdAud byIdAudit) {
+    AuditEntry additionAuditEntry =
+        AuditEntry.create(
+            Action.ADD, byIdAudit.getAddedBy(), byIdAudit.getIncludeUUID(), byIdAudit.getAddedOn());
+    if (byIdAudit.isActive()) {
+      return Stream.of(additionAuditEntry);
+    }
+
+    AuditEntry removalAuditEntry =
+        AuditEntry.create(
+            Action.REMOVE,
+            byIdAudit.getRemovedBy(),
+            byIdAudit.getIncludeUUID(),
+            byIdAudit.getRemovedOn());
+    return Stream.of(additionAuditEntry, removalAuditEntry);
+  }
+
+  /**
+   * Determines whether the audit log entries are equal except for redundant entries. Entries of the
+   * same type (addition/removal) which follow directly on each other according to their timestamp
+   * are considered redundant.
+   */
+  private static boolean areConsideredEqual(
+      ListMultimap<String, AuditEntry> reviewDbMemberAuditsByTarget,
+      ListMultimap<String, AuditEntry> noteDbMemberAuditsByTarget) {
+    for (String target : reviewDbMemberAuditsByTarget.keySet()) {
+      ImmutableList<AuditEntry> reviewDbAuditEntries =
+          reviewDbMemberAuditsByTarget.get(target).stream()
+              .sorted(AUDIT_ENTRY_COMPARATOR)
+              .collect(toImmutableList());
+      ImmutableSet<AuditEntry> noteDbAuditEntries =
+          noteDbMemberAuditsByTarget.get(target).stream()
+              .sorted(AUDIT_ENTRY_COMPARATOR)
+              .collect(toImmutableSet());
+
+      int reviewDbIndex = 0;
+      for (AuditEntry noteDbAuditEntry : noteDbAuditEntries) {
+        Set<AuditEntry> redundantReviewDbAuditEntries = new HashSet<>();
+        while (reviewDbIndex < reviewDbAuditEntries.size()) {
+          AuditEntry reviewDbAuditEntry = reviewDbAuditEntries.get(reviewDbIndex);
+          if (!reviewDbAuditEntry.getAction().equals(noteDbAuditEntry.getAction())) {
+            break;
+          }
+          redundantReviewDbAuditEntries.add(reviewDbAuditEntry);
+          reviewDbIndex++;
+        }
+
+        // The order of the entries is not perfect as ReviewDb included milliseconds for timestamps
+        // and we cut off everything below seconds due to NoteDb/git. Consequently, we don't have a
+        // way to know in this method in which exact order additions/removals within the same second
+        // happened. The best we can do is to group all additions within the same second as
+        // redundant entries and the removals afterward. To compensate that we possibly group
+        // non-redundant additions/removals, we also accept NoteDb audit entries which just occur
+        // anywhere as ReviewDb audit entries.
+        if (!redundantReviewDbAuditEntries.contains(noteDbAuditEntry)
+            && !reviewDbAuditEntries.contains(noteDbAuditEntry)) {
+          return false;
+        }
+      }
+
+      if (reviewDbIndex < reviewDbAuditEntries.size()) {
+        // Some of the ReviewDb audit log entries aren't matched by NoteDb audit log entries.
+        return false;
+      }
+    }
+    return true;
+  }
+
+  public AccountGroup.Id id() {
+    return group().getId();
+  }
+
+  public AccountGroup.UUID uuid() {
+    return group().getGroupUUID();
+  }
+
+  public abstract Source source();
+
+  public abstract AccountGroup group();
+
+  public abstract ImmutableSet<AccountGroupMember> members();
+
+  public abstract ImmutableSet<AccountGroupMemberAudit> memberAudit();
+
+  public abstract ImmutableSet<AccountGroupById> byId();
+
+  public abstract ImmutableSet<AccountGroupByIdAud> byIdAudit();
+
+  public abstract Builder toBuilder();
+
+  public GroupBundle truncateToSecond() {
+    AccountGroup newGroup = new AccountGroup(group());
+    if (newGroup.getCreatedOn() != null) {
+      newGroup.setCreatedOn(TimeUtil.truncateToSecond(newGroup.getCreatedOn()));
+    }
+    return toBuilder()
+        .group(newGroup)
+        .memberAudit(
+            memberAudit().stream().map(GroupBundle::truncateToSecond).collect(toImmutableSet()))
+        .byIdAudit(
+            byIdAudit().stream().map(GroupBundle::truncateToSecond).collect(toImmutableSet()))
+        .build();
+  }
+
+  private static AccountGroupMemberAudit truncateToSecond(AccountGroupMemberAudit a) {
+    AccountGroupMemberAudit result =
+        new AccountGroupMemberAudit(
+            new AccountGroupMemberAudit.Key(
+                a.getKey().getParentKey(),
+                a.getKey().getGroupId(),
+                TimeUtil.truncateToSecond(a.getKey().getAddedOn())),
+            a.getAddedBy());
+    if (a.getRemovedOn() != null) {
+      result.removed(a.getRemovedBy(), TimeUtil.truncateToSecond(a.getRemovedOn()));
+    }
+    return result;
+  }
+
+  private static AccountGroupByIdAud truncateToSecond(AccountGroupByIdAud a) {
+    AccountGroupByIdAud result =
+        new AccountGroupByIdAud(
+            new AccountGroupByIdAud.Key(
+                a.getKey().getParentKey(),
+                a.getKey().getIncludeUUID(),
+                TimeUtil.truncateToSecond(a.getKey().getAddedOn())),
+            a.getAddedBy());
+    if (a.getRemovedOn() != null) {
+      result.removed(a.getRemovedBy(), TimeUtil.truncateToSecond(a.getRemovedOn()));
+    }
+    return result;
+  }
+
+  public InternalGroup toInternalGroup() {
+    return InternalGroup.create(
+        group(),
+        members().stream().map(AccountGroupMember::getAccountId).collect(toImmutableSet()),
+        byId().stream().map(AccountGroupById::getIncludeUUID).collect(toImmutableSet()));
+  }
+
+  @Override
+  public int hashCode() {
+    throw new UnsupportedOperationException(
+        "hashCode is not supported because equals is not supported");
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    throw new UnsupportedOperationException("Use GroupBundle.compare(a, b) instead of equals");
+  }
+
+  @AutoValue
+  abstract static class AuditEntry {
+    private static AuditEntry create(
+        Action action, Account.Id userId, Account.Id memberId, Timestamp timestamp) {
+      return new AutoValue_GroupBundle_AuditEntry(
+          action, userId, String.valueOf(memberId.get()), timestamp);
+    }
+
+    private static AuditEntry create(
+        Action action, Account.Id userId, AccountGroup.UUID subgroupId, Timestamp timestamp) {
+      return new AutoValue_GroupBundle_AuditEntry(action, userId, subgroupId.get(), timestamp);
+    }
+
+    abstract Action getAction();
+
+    abstract Account.Id getUserId();
+
+    abstract String getTarget();
+
+    abstract Timestamp getTimestamp();
+  }
+
+  enum Action {
+    ADD(1),
+    REMOVE(2);
+
+    private final int order;
+
+    Action(int order) {
+      this.order = order;
+    }
+
+    public int getOrder() {
+      return order;
+    }
+  }
+
+  @AutoValue.Builder
+  abstract static class Builder {
+    abstract Builder source(Source source);
+
+    abstract Builder group(AccountGroup group);
+
+    abstract Builder members(AccountGroupMember... member);
+
+    abstract Builder members(Iterable<AccountGroupMember> member);
+
+    abstract Builder memberAudit(AccountGroupMemberAudit... audit);
+
+    abstract Builder memberAudit(Iterable<AccountGroupMemberAudit> audit);
+
+    abstract Builder byId(AccountGroupById... byId);
+
+    abstract Builder byId(Iterable<AccountGroupById> byId);
+
+    abstract Builder byIdAudit(AccountGroupByIdAud... audit);
+
+    abstract Builder byIdAudit(Iterable<AccountGroupByIdAud> audit);
+
+    abstract GroupBundle build();
+  }
+}
diff --git a/java/com/google/gerrit/server/schema/GroupRebuilder.java b/java/com/google/gerrit/server/schema/GroupRebuilder.java
new file mode 100644
index 0000000..0b4fd02
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/GroupRebuilder.java
@@ -0,0 +1,299 @@
+// Copyright (C) 2017 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.google.gerrit.server.schema;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.collect.ImmutableSet.toImmutableSet;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.collect.Sets;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.AccountGroupById;
+import com.google.gerrit.reviewdb.client.AccountGroupByIdAud;
+import com.google.gerrit.reviewdb.client.AccountGroupMember;
+import com.google.gerrit.reviewdb.client.AccountGroupMemberAudit;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.git.meta.VersionedMetaData.BatchMetaDataUpdate;
+import com.google.gerrit.server.group.db.AuditLogFormatter;
+import com.google.gerrit.server.group.db.GroupConfig;
+import com.google.gerrit.server.group.db.InternalGroupCreation;
+import com.google.gerrit.server.group.db.InternalGroupUpdate;
+import com.google.gerrit.server.group.db.InternalGroupUpdate.MemberModification;
+import com.google.gerrit.server.group.db.InternalGroupUpdate.SubgroupModification;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmDuplicateKeyException;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.Map;
+import java.util.NavigableSet;
+import java.util.Optional;
+import java.util.function.Consumer;
+import java.util.stream.Stream;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+
+/** Helper for rebuilding an entire group's NoteDb refs. */
+class GroupRebuilder {
+  private final PersonIdent serverIdent;
+  private final AllUsersName allUsers;
+  private final AuditLogFormatter auditLogFormatter;
+
+  public GroupRebuilder(
+      PersonIdent serverIdent, AllUsersName allUsers, AuditLogFormatter auditLogFormatter) {
+    this.serverIdent = serverIdent;
+    this.allUsers = allUsers;
+    this.auditLogFormatter = auditLogFormatter;
+  }
+
+  public void rebuild(Repository allUsersRepo, GroupBundle bundle, @Nullable BatchRefUpdate bru)
+      throws IOException, ConfigInvalidException, OrmDuplicateKeyException {
+    AccountGroup group = bundle.group();
+    InternalGroupCreation groupCreation =
+        InternalGroupCreation.builder()
+            .setId(bundle.id())
+            .setNameKey(group.getNameKey())
+            .setGroupUUID(group.getGroupUUID())
+            .build();
+    GroupConfig groupConfig = GroupConfig.createForNewGroup(allUsers, allUsersRepo, groupCreation);
+    groupConfig.setAllowSaveEmptyName();
+
+    InternalGroupUpdate.Builder updateBuilder =
+        InternalGroupUpdate.builder()
+            .setOwnerGroupUUID(group.getOwnerGroupUUID())
+            .setVisibleToAll(group.isVisibleToAll())
+            .setUpdatedOn(group.getCreatedOn());
+    if (bundle.group().getDescription() != null) {
+      updateBuilder.setDescription(group.getDescription());
+    }
+    groupConfig.setGroupUpdate(updateBuilder.build(), auditLogFormatter);
+
+    Map<Key, Collection<Event>> events = toEvents(bundle).asMap();
+    PersonIdent nowServerIdent = getServerIdent(events);
+
+    MetaDataUpdate md = createMetaDataUpdate(allUsers, allUsersRepo, bru);
+
+    // Creation is done by the server (unlike later audit events).
+    PersonIdent created = new PersonIdent(nowServerIdent, group.getCreatedOn());
+    md.getCommitBuilder().setAuthor(created);
+    md.getCommitBuilder().setCommitter(created);
+
+    // Rebuild group ref.
+    try (BatchMetaDataUpdate batch = groupConfig.openUpdate(md)) {
+      batch.write(groupConfig, md.getCommitBuilder());
+
+      for (Map.Entry<Key, Collection<Event>> e : events.entrySet()) {
+        InternalGroupUpdate.Builder ub = InternalGroupUpdate.builder();
+        e.getValue().forEach(event -> event.update().accept(ub));
+        ub.setUpdatedOn(e.getKey().when());
+        groupConfig.setGroupUpdate(ub.build(), auditLogFormatter);
+
+        PersonIdent currServerIdent = new PersonIdent(nowServerIdent, e.getKey().when());
+        CommitBuilder cb = new CommitBuilder();
+        cb.setAuthor(
+            e.getKey()
+                .accountId()
+                .map(id -> auditLogFormatter.getParsableAuthorIdent(id, currServerIdent))
+                .orElse(currServerIdent));
+        cb.setCommitter(currServerIdent);
+        batch.write(groupConfig, cb);
+      }
+
+      batch.createRef(groupConfig.getRefName());
+    }
+  }
+
+  private ListMultimap<Key, Event> toEvents(GroupBundle bundle) {
+    ListMultimap<Key, Event> result =
+        MultimapBuilder.treeKeys(Key.COMPARATOR).arrayListValues(1).build();
+    Event e;
+
+    for (AccountGroupMemberAudit a : bundle.memberAudit()) {
+      checkArgument(
+          a.getKey().getGroupId().equals(bundle.id()),
+          "key %s does not match group %s",
+          a.getKey(),
+          bundle.id());
+      Account.Id accountId = a.getKey().getParentKey();
+      e = event(Type.ADD_MEMBER, a.getAddedBy(), a.getKey().getAddedOn(), addMember(accountId));
+      result.put(e.key(), e);
+      if (!a.isActive()) {
+        e = event(Type.REMOVE_MEMBER, a.getRemovedBy(), a.getRemovedOn(), removeMember(accountId));
+        result.put(e.key(), e);
+      }
+    }
+
+    for (AccountGroupByIdAud a : bundle.byIdAudit()) {
+      checkArgument(
+          a.getKey().getParentKey().equals(bundle.id()),
+          "key %s does not match group %s",
+          a.getKey(),
+          bundle.id());
+      AccountGroup.UUID uuid = a.getKey().getIncludeUUID();
+      e = event(Type.ADD_GROUP, a.getAddedBy(), a.getKey().getAddedOn(), addGroup(uuid));
+      result.put(e.key(), e);
+      if (!a.isActive()) {
+        e = event(Type.REMOVE_GROUP, a.getRemovedBy(), a.getRemovedOn(), removeGroup(uuid));
+        result.put(e.key(), e);
+      }
+    }
+
+    // Due to clock skew, audit events may be in the future relative to this machine. Ensure the
+    // fixup event happens after any other events, both for the purposes of sorting Keys correctly
+    // and to avoid non-monotonic timestamps in the commit history.
+    Timestamp maxTs =
+        Stream.concat(result.keySet().stream().map(Key::when), Stream.of(TimeUtil.nowTs()))
+            .max(Comparator.naturalOrder())
+            .get();
+    Timestamp fixupTs = new Timestamp(maxTs.getTime() + 1);
+    e = serverEvent(Type.FIXUP, fixupTs, setCurrentMembership(bundle));
+    result.put(e.key(), e);
+
+    return result;
+  }
+
+  private PersonIdent getServerIdent(Map<Key, Collection<Event>> events) {
+    // Created with MultimapBuilder.treeKeys, so the keySet is navigable.
+    Key lastKey = ((NavigableSet<Key>) events.keySet()).last();
+    checkState(lastKey.type() == Type.FIXUP);
+    return new PersonIdent(
+        serverIdent.getName(),
+        serverIdent.getEmailAddress(),
+        Iterables.getOnlyElement(events.get(lastKey)).when(),
+        serverIdent.getTimeZone());
+  }
+
+  private static MetaDataUpdate createMetaDataUpdate(
+      Project.NameKey projectName, Repository repository, @Nullable BatchRefUpdate batchRefUpdate) {
+    return new MetaDataUpdate(
+        GitReferenceUpdated.DISABLED, projectName, repository, batchRefUpdate);
+  }
+
+  private static Consumer<InternalGroupUpdate.Builder> addMember(Account.Id toAdd) {
+    return b -> {
+      MemberModification prev = b.getMemberModification();
+      b.setMemberModification(in -> Sets.union(prev.apply(in), ImmutableSet.of(toAdd)));
+    };
+  }
+
+  private static Consumer<InternalGroupUpdate.Builder> removeMember(Account.Id toRemove) {
+    return b -> {
+      MemberModification prev = b.getMemberModification();
+      b.setMemberModification(in -> Sets.difference(prev.apply(in), ImmutableSet.of(toRemove)));
+    };
+  }
+
+  private static Consumer<InternalGroupUpdate.Builder> addGroup(AccountGroup.UUID toAdd) {
+    return b -> {
+      SubgroupModification prev = b.getSubgroupModification();
+      b.setSubgroupModification(in -> Sets.union(prev.apply(in), ImmutableSet.of(toAdd)));
+    };
+  }
+
+  private static Consumer<InternalGroupUpdate.Builder> removeGroup(AccountGroup.UUID toRemove) {
+    return b -> {
+      SubgroupModification prev = b.getSubgroupModification();
+      b.setSubgroupModification(in -> Sets.difference(prev.apply(in), ImmutableSet.of(toRemove)));
+    };
+  }
+
+  private static Consumer<InternalGroupUpdate.Builder> setCurrentMembership(GroupBundle bundle) {
+    // Overwrite members and subgroups with the current values. The storage layer will do the
+    // set differences to compute the appropriate delta, if any.
+    return b ->
+        b.setMemberModification(
+                in ->
+                    bundle.members().stream()
+                        .map(AccountGroupMember::getAccountId)
+                        .collect(toImmutableSet()))
+            .setSubgroupModification(
+                in ->
+                    bundle.byId().stream()
+                        .map(AccountGroupById::getIncludeUUID)
+                        .collect(toImmutableSet()));
+  }
+
+  private static Event event(
+      Type type,
+      Account.Id accountId,
+      Timestamp when,
+      Consumer<InternalGroupUpdate.Builder> update) {
+    return new AutoValue_GroupRebuilder_Event(type, Optional.of(accountId), when, update);
+  }
+
+  private static Event serverEvent(
+      Type type, Timestamp when, Consumer<InternalGroupUpdate.Builder> update) {
+    return new AutoValue_GroupRebuilder_Event(type, Optional.empty(), when, update);
+  }
+
+  @AutoValue
+  abstract static class Event {
+    abstract Type type();
+
+    abstract Optional<Account.Id> accountId();
+
+    abstract Timestamp when();
+
+    abstract Consumer<InternalGroupUpdate.Builder> update();
+
+    Key key() {
+      return new AutoValue_GroupRebuilder_Key(accountId(), when(), type());
+    }
+  }
+
+  /**
+   * Distinct event types.
+   *
+   * <p>Events at the same time by the same user are batched together by type. The types should
+   * correspond to the possible batch operations supported by AuditService.
+   */
+  enum Type {
+    ADD_MEMBER,
+    REMOVE_MEMBER,
+    ADD_GROUP,
+    REMOVE_GROUP,
+    FIXUP;
+  }
+
+  @AutoValue
+  abstract static class Key {
+    static final Comparator<Key> COMPARATOR =
+        Comparator.comparing(Key::when)
+            .thenComparing(
+                k -> k.accountId().map(Account.Id::get).orElse(null),
+                Comparator.nullsFirst(Comparator.naturalOrder()))
+            .thenComparing(Key::type);
+
+    abstract Optional<Account.Id> accountId();
+
+    abstract Timestamp when();
+
+    abstract Type type();
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/H2.java b/java/com/google/gerrit/server/schema/H2.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/H2.java
rename to java/com/google/gerrit/server/schema/H2.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/H2AccountPatchReviewStore.java b/java/com/google/gerrit/server/schema/H2AccountPatchReviewStore.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/H2AccountPatchReviewStore.java
rename to java/com/google/gerrit/server/schema/H2AccountPatchReviewStore.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/HANA.java b/java/com/google/gerrit/server/schema/HANA.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/HANA.java
rename to java/com/google/gerrit/server/schema/HANA.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/InMemoryAccountPatchReviewStore.java b/java/com/google/gerrit/server/schema/InMemoryAccountPatchReviewStore.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/InMemoryAccountPatchReviewStore.java
rename to java/com/google/gerrit/server/schema/InMemoryAccountPatchReviewStore.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/JDBC.java b/java/com/google/gerrit/server/schema/JDBC.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/JDBC.java
rename to java/com/google/gerrit/server/schema/JDBC.java
diff --git a/java/com/google/gerrit/server/schema/JdbcAccountPatchReviewStore.java b/java/com/google/gerrit/server/schema/JdbcAccountPatchReviewStore.java
new file mode 100644
index 0000000..83a0986
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/JdbcAccountPatchReviewStore.java
@@ -0,0 +1,355 @@
+// Copyright (C) 2017 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.google.gerrit.server.schema;
+
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.SECONDS;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.primitives.Ints;
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.lifecycle.LifecycleModule;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.change.AccountPatchReviewStore;
+import com.google.gerrit.server.config.ConfigUtil;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.config.ThreadSettingsConfig;
+import com.google.gwtorm.server.OrmDuplicateKeyException;
+import com.google.gwtorm.server.OrmException;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Collection;
+import java.util.Optional;
+import javax.sql.DataSource;
+import org.apache.commons.dbcp.BasicDataSource;
+import org.eclipse.jgit.lib.Config;
+
+public abstract class JdbcAccountPatchReviewStore
+    implements AccountPatchReviewStore, LifecycleListener {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final String ACCOUNT_PATCH_REVIEW_DB = "accountPatchReviewDb";
+  private static final String H2_DB = "h2";
+  private static final String MARIADB = "mariadb";
+  private static final String MYSQL = "mysql";
+  private static final String POSTGRESQL = "postgresql";
+  private static final String URL = "url";
+
+  public static class Module extends LifecycleModule {
+    private final Config cfg;
+
+    public Module(Config cfg) {
+      this.cfg = cfg;
+    }
+
+    @Override
+    protected void configure() {
+      Class<? extends JdbcAccountPatchReviewStore> impl;
+      String url = cfg.getString(ACCOUNT_PATCH_REVIEW_DB, null, URL);
+      if (url == null || url.contains(H2_DB)) {
+        impl = H2AccountPatchReviewStore.class;
+      } else if (url.contains(POSTGRESQL)) {
+        impl = PostgresqlAccountPatchReviewStore.class;
+      } else if (url.contains(MYSQL)) {
+        impl = MysqlAccountPatchReviewStore.class;
+      } else if (url.contains(MARIADB)) {
+        impl = MariaDBAccountPatchReviewStore.class;
+      } else {
+        throw new IllegalArgumentException(
+            "unsupported driver type for account patch reviews db: " + url);
+      }
+      DynamicItem.bind(binder(), AccountPatchReviewStore.class).to(impl);
+      listener().to(impl);
+    }
+  }
+
+  private DataSource ds;
+
+  public static JdbcAccountPatchReviewStore createAccountPatchReviewStore(
+      Config cfg, SitePaths sitePaths, ThreadSettingsConfig threadSettingsConfig) {
+    String url = cfg.getString(ACCOUNT_PATCH_REVIEW_DB, null, URL);
+    if (url == null || url.contains(H2_DB)) {
+      return new H2AccountPatchReviewStore(cfg, sitePaths, threadSettingsConfig);
+    }
+    if (url.contains(POSTGRESQL)) {
+      return new PostgresqlAccountPatchReviewStore(cfg, sitePaths, threadSettingsConfig);
+    }
+    if (url.contains(MYSQL)) {
+      return new MysqlAccountPatchReviewStore(cfg, sitePaths, threadSettingsConfig);
+    }
+    if (url.contains(MARIADB)) {
+      return new MariaDBAccountPatchReviewStore(cfg, sitePaths, threadSettingsConfig);
+    }
+    throw new IllegalArgumentException(
+        "unsupported driver type for account patch reviews db: " + url);
+  }
+
+  protected JdbcAccountPatchReviewStore(
+      Config cfg, SitePaths sitePaths, ThreadSettingsConfig threadSettingsConfig) {
+    this.ds = createDataSource(cfg, sitePaths, threadSettingsConfig);
+  }
+
+  protected JdbcAccountPatchReviewStore(DataSource ds) {
+    this.ds = ds;
+  }
+
+  private static String getUrl(@GerritServerConfig Config cfg, SitePaths sitePaths) {
+    String url = cfg.getString(ACCOUNT_PATCH_REVIEW_DB, null, URL);
+    if (url == null) {
+      return H2.createUrl(sitePaths.db_dir.resolve("account_patch_reviews"));
+    }
+    return url;
+  }
+
+  private static DataSource createDataSource(
+      Config cfg, SitePaths sitePaths, ThreadSettingsConfig threadSettingsConfig) {
+    BasicDataSource datasource = new BasicDataSource();
+    String url = getUrl(cfg, sitePaths);
+    int poolLimit = threadSettingsConfig.getDatabasePoolLimit();
+    datasource.setUrl(url);
+    datasource.setDriverClassName(getDriverFromUrl(url));
+    datasource.setMaxActive(cfg.getInt(ACCOUNT_PATCH_REVIEW_DB, "poolLimit", poolLimit));
+    datasource.setMinIdle(cfg.getInt(ACCOUNT_PATCH_REVIEW_DB, "poolminidle", 4));
+    datasource.setMaxIdle(
+        cfg.getInt(ACCOUNT_PATCH_REVIEW_DB, "poolmaxidle", Math.min(poolLimit, 16)));
+    datasource.setInitialSize(datasource.getMinIdle());
+    datasource.setMaxWait(
+        ConfigUtil.getTimeUnit(
+            cfg,
+            ACCOUNT_PATCH_REVIEW_DB,
+            null,
+            "poolmaxwait",
+            MILLISECONDS.convert(30, SECONDS),
+            MILLISECONDS));
+    long evictIdleTimeMs = 1000L * 60;
+    datasource.setMinEvictableIdleTimeMillis(evictIdleTimeMs);
+    datasource.setTimeBetweenEvictionRunsMillis(evictIdleTimeMs / 2);
+    return datasource;
+  }
+
+  private static String getDriverFromUrl(String url) {
+    if (url.contains(POSTGRESQL)) {
+      return "org.postgresql.Driver";
+    }
+    if (url.contains(MYSQL)) {
+      return "com.mysql.jdbc.Driver";
+    }
+    if (url.contains(MARIADB)) {
+      return "org.mariadb.jdbc.Driver";
+    }
+    return "org.h2.Driver";
+  }
+
+  @Override
+  public void start() {
+    try {
+      createTableIfNotExists();
+    } catch (OrmException e) {
+      logger.atSevere().withCause(e).log("Failed to create table to store account patch reviews");
+    }
+  }
+
+  public Connection getConnection() throws SQLException {
+    return ds.getConnection();
+  }
+
+  public void createTableIfNotExists() throws OrmException {
+    try (Connection con = ds.getConnection();
+        Statement stmt = con.createStatement()) {
+      doCreateTable(stmt);
+    } catch (SQLException e) {
+      throw convertError("create", e);
+    }
+  }
+
+  protected void doCreateTable(Statement stmt) throws SQLException {
+    stmt.executeUpdate(
+        "CREATE TABLE IF NOT EXISTS account_patch_reviews ("
+            + "account_id INTEGER DEFAULT 0 NOT NULL, "
+            + "change_id INTEGER DEFAULT 0 NOT NULL, "
+            + "patch_set_id INTEGER DEFAULT 0 NOT NULL, "
+            + "file_name VARCHAR(4096) DEFAULT '' NOT NULL, "
+            + "CONSTRAINT primary_key_account_patch_reviews "
+            + "PRIMARY KEY (change_id, patch_set_id, account_id, file_name)"
+            + ")");
+  }
+
+  public void dropTableIfExists() throws OrmException {
+    try (Connection con = ds.getConnection();
+        Statement stmt = con.createStatement()) {
+      stmt.executeUpdate("DROP TABLE IF EXISTS account_patch_reviews");
+    } catch (SQLException e) {
+      throw convertError("create", e);
+    }
+  }
+
+  @Override
+  public void stop() {}
+
+  @Override
+  public boolean markReviewed(PatchSet.Id psId, Account.Id accountId, String path)
+      throws OrmException {
+    try (Connection con = ds.getConnection();
+        PreparedStatement stmt =
+            con.prepareStatement(
+                "INSERT INTO account_patch_reviews "
+                    + "(account_id, change_id, patch_set_id, file_name) VALUES "
+                    + "(?, ?, ?, ?)")) {
+      stmt.setInt(1, accountId.get());
+      stmt.setInt(2, psId.getParentKey().get());
+      stmt.setInt(3, psId.get());
+      stmt.setString(4, path);
+      stmt.executeUpdate();
+      return true;
+    } catch (SQLException e) {
+      OrmException ormException = convertError("insert", e);
+      if (ormException instanceof OrmDuplicateKeyException) {
+        return false;
+      }
+      throw ormException;
+    }
+  }
+
+  @Override
+  public void markReviewed(PatchSet.Id psId, Account.Id accountId, Collection<String> paths)
+      throws OrmException {
+    if (paths == null || paths.isEmpty()) {
+      return;
+    }
+
+    try (Connection con = ds.getConnection();
+        PreparedStatement stmt =
+            con.prepareStatement(
+                "INSERT INTO account_patch_reviews "
+                    + "(account_id, change_id, patch_set_id, file_name) VALUES "
+                    + "(?, ?, ?, ?)")) {
+      for (String path : paths) {
+        stmt.setInt(1, accountId.get());
+        stmt.setInt(2, psId.getParentKey().get());
+        stmt.setInt(3, psId.get());
+        stmt.setString(4, path);
+        stmt.addBatch();
+      }
+      stmt.executeBatch();
+    } catch (SQLException e) {
+      OrmException ormException = convertError("insert", e);
+      if (ormException instanceof OrmDuplicateKeyException) {
+        return;
+      }
+      throw ormException;
+    }
+  }
+
+  @Override
+  public void clearReviewed(PatchSet.Id psId, Account.Id accountId, String path)
+      throws OrmException {
+    try (Connection con = ds.getConnection();
+        PreparedStatement stmt =
+            con.prepareStatement(
+                "DELETE FROM account_patch_reviews "
+                    + "WHERE account_id = ? AND change_id = ? AND "
+                    + "patch_set_id = ? AND file_name = ?")) {
+      stmt.setInt(1, accountId.get());
+      stmt.setInt(2, psId.getParentKey().get());
+      stmt.setInt(3, psId.get());
+      stmt.setString(4, path);
+      stmt.executeUpdate();
+    } catch (SQLException e) {
+      throw convertError("delete", e);
+    }
+  }
+
+  @Override
+  public void clearReviewed(PatchSet.Id psId) throws OrmException {
+    try (Connection con = ds.getConnection();
+        PreparedStatement stmt =
+            con.prepareStatement(
+                "DELETE FROM account_patch_reviews "
+                    + "WHERE change_id = ? AND patch_set_id = ?")) {
+      stmt.setInt(1, psId.getParentKey().get());
+      stmt.setInt(2, psId.get());
+      stmt.executeUpdate();
+    } catch (SQLException e) {
+      throw convertError("delete", e);
+    }
+  }
+
+  @Override
+  public Optional<PatchSetWithReviewedFiles> findReviewed(PatchSet.Id psId, Account.Id accountId)
+      throws OrmException {
+    try (Connection con = ds.getConnection();
+        PreparedStatement stmt =
+            con.prepareStatement(
+                "SELECT patch_set_id, file_name FROM account_patch_reviews APR1 "
+                    + "WHERE account_id = ? AND change_id = ? AND patch_set_id = "
+                    + "(SELECT MAX(patch_set_id) FROM account_patch_reviews APR2 WHERE "
+                    + "APR1.account_id = APR2.account_id "
+                    + "AND APR1.change_id = APR2.change_id "
+                    + "AND patch_set_id <= ?)")) {
+      stmt.setInt(1, accountId.get());
+      stmt.setInt(2, psId.getParentKey().get());
+      stmt.setInt(3, psId.get());
+      try (ResultSet rs = stmt.executeQuery()) {
+        if (rs.next()) {
+          PatchSet.Id id = new PatchSet.Id(psId.getParentKey(), rs.getInt("patch_set_id"));
+          ImmutableSet.Builder<String> builder = ImmutableSet.builder();
+          do {
+            builder.add(rs.getString("file_name"));
+          } while (rs.next());
+
+          return Optional.of(
+              AccountPatchReviewStore.PatchSetWithReviewedFiles.create(id, builder.build()));
+        }
+
+        return Optional.empty();
+      }
+    } catch (SQLException e) {
+      throw convertError("select", e);
+    }
+  }
+
+  public OrmException convertError(String op, SQLException err) {
+    if (err.getCause() == null && err.getNextException() != null) {
+      err.initCause(err.getNextException());
+    }
+    return new OrmException(op + " failure on account_patch_reviews", err);
+  }
+
+  private static String getSQLState(SQLException err) {
+    String ec;
+    SQLException next = err;
+    do {
+      ec = next.getSQLState();
+      next = next.getNextException();
+    } while (ec == null && next != null);
+    return ec;
+  }
+
+  protected static int getSQLStateInt(SQLException err) {
+    String s = getSQLState(err);
+    if (s != null) {
+      Integer i = Ints.tryParse(s);
+      return i != null ? i : -1;
+    }
+    return 0;
+  }
+}
diff --git a/java/com/google/gerrit/server/schema/JdbcUtil.java b/java/com/google/gerrit/server/schema/JdbcUtil.java
new file mode 100644
index 0000000..dddf23a
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/JdbcUtil.java
@@ -0,0 +1,38 @@
+// Copyright (C) 2012 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.google.gerrit.server.schema;
+
+import com.google.gerrit.server.UsedAt;
+
+public class JdbcUtil {
+
+  public static String hostname(String hostname) {
+    if (hostname == null || hostname.isEmpty()) {
+      hostname = "localhost";
+
+    } else if (hostname.contains(":") && !hostname.startsWith("[")) {
+      hostname = "[" + hostname + "]";
+    }
+    return hostname;
+  }
+
+  @UsedAt(UsedAt.Project.PLUGINS_ALL)
+  public static String port(String port) {
+    if (port != null && !port.isEmpty()) {
+      return ":" + port;
+    }
+    return "";
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/MariaDBAccountPatchReviewStore.java b/java/com/google/gerrit/server/schema/MariaDBAccountPatchReviewStore.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/MariaDBAccountPatchReviewStore.java
rename to java/com/google/gerrit/server/schema/MariaDBAccountPatchReviewStore.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/MariaDb.java b/java/com/google/gerrit/server/schema/MariaDb.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/MariaDb.java
rename to java/com/google/gerrit/server/schema/MariaDb.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/MaxDb.java b/java/com/google/gerrit/server/schema/MaxDb.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/MaxDb.java
rename to java/com/google/gerrit/server/schema/MaxDb.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/MySql.java b/java/com/google/gerrit/server/schema/MySql.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/MySql.java
rename to java/com/google/gerrit/server/schema/MySql.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/MysqlAccountPatchReviewStore.java b/java/com/google/gerrit/server/schema/MysqlAccountPatchReviewStore.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/MysqlAccountPatchReviewStore.java
rename to java/com/google/gerrit/server/schema/MysqlAccountPatchReviewStore.java
diff --git a/java/com/google/gerrit/server/schema/NoChangesReviewDbWrapper.java b/java/com/google/gerrit/server/schema/NoChangesReviewDbWrapper.java
new file mode 100644
index 0000000..7247490
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/NoChangesReviewDbWrapper.java
@@ -0,0 +1,214 @@
+// Copyright (C) 2017 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.google.gerrit.server.schema;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.PatchLineComment;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.server.ChangeAccess;
+import com.google.gerrit.reviewdb.server.ChangeMessageAccess;
+import com.google.gerrit.reviewdb.server.PatchLineCommentAccess;
+import com.google.gerrit.reviewdb.server.PatchSetAccess;
+import com.google.gerrit.reviewdb.server.PatchSetApprovalAccess;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.reviewdb.server.ReviewDbWrapper;
+import com.google.gwtorm.server.ListResultSet;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.ResultSet;
+
+/**
+ * Wrapper for ReviewDb that never calls the underlying change tables.
+ *
+ * <p>See {@link NotesMigrationSchemaFactory} for discussion.
+ */
+class NoChangesReviewDbWrapper extends ReviewDbWrapper {
+  private static <T> ResultSet<T> empty() {
+    return new ListResultSet<>(ImmutableList.of());
+  }
+
+  private final ChangeAccess changes;
+  private final PatchSetApprovalAccess patchSetApprovals;
+  private final ChangeMessageAccess changeMessages;
+  private final PatchSetAccess patchSets;
+  private final PatchLineCommentAccess patchComments;
+
+  NoChangesReviewDbWrapper(ReviewDb db) {
+    super(db);
+    changes = new Changes(this, delegate);
+    patchSetApprovals = new PatchSetApprovals(this, delegate);
+    changeMessages = new ChangeMessages(this, delegate);
+    patchSets = new PatchSets(this, delegate);
+    patchComments = new PatchLineComments(this, delegate);
+  }
+
+  @Override
+  public ChangeAccess changes() {
+    return changes;
+  }
+
+  @Override
+  public PatchSetApprovalAccess patchSetApprovals() {
+    return patchSetApprovals;
+  }
+
+  @Override
+  public ChangeMessageAccess changeMessages() {
+    return changeMessages;
+  }
+
+  @Override
+  public PatchSetAccess patchSets() {
+    return patchSets;
+  }
+
+  @Override
+  public PatchLineCommentAccess patchComments() {
+    return patchComments;
+  }
+
+  private static class Changes extends AbstractDisabledAccess<Change, Change.Id>
+      implements ChangeAccess {
+    private Changes(NoChangesReviewDbWrapper wrapper, ReviewDb db) {
+      super(wrapper, db.changes());
+    }
+
+    @Override
+    public ResultSet<Change> all() {
+      return empty();
+    }
+  }
+
+  private static class ChangeMessages
+      extends AbstractDisabledAccess<ChangeMessage, ChangeMessage.Key>
+      implements ChangeMessageAccess {
+    private ChangeMessages(NoChangesReviewDbWrapper wrapper, ReviewDb db) {
+      super(wrapper, db.changeMessages());
+    }
+
+    @Override
+    public ResultSet<ChangeMessage> byChange(Change.Id id) throws OrmException {
+      return empty();
+    }
+
+    @Override
+    public ResultSet<ChangeMessage> byPatchSet(PatchSet.Id id) throws OrmException {
+      return empty();
+    }
+
+    @Override
+    public ResultSet<ChangeMessage> all() throws OrmException {
+      return empty();
+    }
+  }
+
+  private static class PatchSets extends AbstractDisabledAccess<PatchSet, PatchSet.Id>
+      implements PatchSetAccess {
+    private PatchSets(NoChangesReviewDbWrapper wrapper, ReviewDb db) {
+      super(wrapper, db.patchSets());
+    }
+
+    @Override
+    public ResultSet<PatchSet> byChange(Change.Id id) {
+      return empty();
+    }
+
+    @Override
+    public ResultSet<PatchSet> all() {
+      return empty();
+    }
+  }
+
+  private static class PatchSetApprovals
+      extends AbstractDisabledAccess<PatchSetApproval, PatchSetApproval.Key>
+      implements PatchSetApprovalAccess {
+    private PatchSetApprovals(NoChangesReviewDbWrapper wrapper, ReviewDb db) {
+      super(wrapper, db.patchSetApprovals());
+    }
+
+    @Override
+    public ResultSet<PatchSetApproval> byChange(Change.Id id) {
+      return empty();
+    }
+
+    @Override
+    public ResultSet<PatchSetApproval> byPatchSet(PatchSet.Id id) {
+      return empty();
+    }
+
+    @Override
+    public ResultSet<PatchSetApproval> byPatchSetUser(PatchSet.Id patchSet, Account.Id account) {
+      return empty();
+    }
+
+    @Override
+    public ResultSet<PatchSetApproval> all() {
+      return empty();
+    }
+  }
+
+  private static class PatchLineComments
+      extends AbstractDisabledAccess<PatchLineComment, PatchLineComment.Key>
+      implements PatchLineCommentAccess {
+    private PatchLineComments(NoChangesReviewDbWrapper wrapper, ReviewDb db) {
+      super(wrapper, db.patchComments());
+    }
+
+    @Override
+    public ResultSet<PatchLineComment> byChange(Change.Id id) {
+      return empty();
+    }
+
+    @Override
+    public ResultSet<PatchLineComment> byPatchSet(PatchSet.Id id) {
+      return empty();
+    }
+
+    @Override
+    public ResultSet<PatchLineComment> publishedByChangeFile(Change.Id id, String file) {
+      return empty();
+    }
+
+    @Override
+    public ResultSet<PatchLineComment> publishedByPatchSet(PatchSet.Id patchset) {
+      return empty();
+    }
+
+    @Override
+    public ResultSet<PatchLineComment> draftByPatchSetAuthor(
+        PatchSet.Id patchset, Account.Id author) {
+      return empty();
+    }
+
+    @Override
+    public ResultSet<PatchLineComment> draftByChangeFileAuthor(
+        Change.Id id, String file, Account.Id author) {
+      return empty();
+    }
+
+    @Override
+    public ResultSet<PatchLineComment> draftByAuthor(Account.Id author) {
+      return empty();
+    }
+
+    @Override
+    public ResultSet<PatchLineComment> all() {
+      return empty();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/schema/NotesMigrationSchemaFactory.java b/java/com/google/gerrit/server/schema/NotesMigrationSchemaFactory.java
new file mode 100644
index 0000000..0d95610
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/NotesMigrationSchemaFactory.java
@@ -0,0 +1,78 @@
+// 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.
+
+package com.google.gerrit.server.schema;
+
+import com.google.gerrit.reviewdb.server.DisallowReadFromChangesReviewDbWrapper;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class NotesMigrationSchemaFactory implements SchemaFactory<ReviewDb> {
+  private final SchemaFactory<ReviewDb> delegate;
+  private final NotesMigration migration;
+
+  @Inject
+  NotesMigrationSchemaFactory(
+      @ReviewDbFactory SchemaFactory<ReviewDb> delegate, NotesMigration migration) {
+    this.delegate = delegate;
+    this.migration = migration;
+  }
+
+  @Override
+  public ReviewDb open() throws OrmException {
+    // There are two levels at which this class disables access to Changes and related tables,
+    // corresponding to two phases of the NoteDb migration:
+    //
+    // 1. When changes are read from NoteDb but some changes might still have their primary storage
+    //    in ReviewDb, it is generally programmer error to read changes from ReviewDb. However,
+    //    since ReviewDb is still the primary storage for most or all changes, we still need to
+    //    support writing to ReviewDb. This behavior is accomplished by wrapping in a
+    //    DisallowReadFromChangesReviewDbWrapper.
+    //
+    //    Some codepaths might need to be able to read from ReviewDb if they really need to,
+    //    because they need to operate on the underlying source of truth, for example when reading
+    //    a change to determine its primary storage. To support this, ReviewDbUtil#unwrapDb can
+    //    detect and unwrap databases of this type.
+    //
+    // 2. After all changes have their primary storage in NoteDb, we can completely shut off access
+    //    to the change tables. At this point in the migration, we are by definition not using the
+    //    ReviewDb tables at all; we could even delete the tables at this point, and Gerrit would
+    //    continue to function.
+    //
+    //    This is accomplished by setting the delegate ReviewDb *underneath*
+    //    DisallowReadFromChanges to be a complete no-op, with NoChangesReviewDbWrapper. With this
+    //    wrapper, all read operations return no results, and write operations silently do nothing.
+    //    This wrapper is not a public class and nobody should ever attempt to unwrap it.
+
+    // First create the wrappers which can not be removed by ReviewDbUtil#unwrapDb(ReviewDb).
+    ReviewDb db = delegate.open();
+    if (migration.readChanges() && migration.disableChangeReviewDb()) {
+      // Disable writes to change tables in ReviewDb (ReviewDb access for changes are No-Ops).
+      db = new NoChangesReviewDbWrapper(db);
+    }
+
+    // Second create the wrappers which can be removed by ReviewDbUtil#unwrapDb(ReviewDb).
+    if (migration.readChanges()) {
+      // If reading changes from NoteDb is configured, changes should not be read from ReviewDb.
+      // Make sure that any attempt to read a change from ReviewDb anyway fails with an exception.
+      db = new DisallowReadFromChangesReviewDbWrapper(db);
+    }
+    return db;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Oracle.java b/java/com/google/gerrit/server/schema/Oracle.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Oracle.java
rename to java/com/google/gerrit/server/schema/Oracle.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/PostgreSQL.java b/java/com/google/gerrit/server/schema/PostgreSQL.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/PostgreSQL.java
rename to java/com/google/gerrit/server/schema/PostgreSQL.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/PostgresqlAccountPatchReviewStore.java b/java/com/google/gerrit/server/schema/PostgresqlAccountPatchReviewStore.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/PostgresqlAccountPatchReviewStore.java
rename to java/com/google/gerrit/server/schema/PostgresqlAccountPatchReviewStore.java
diff --git a/java/com/google/gerrit/server/schema/ProjectConfigSchemaUpdate.java b/java/com/google/gerrit/server/schema/ProjectConfigSchemaUpdate.java
new file mode 100644
index 0000000..c25b846
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/ProjectConfigSchemaUpdate.java
@@ -0,0 +1,107 @@
+// 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.
+
+package com.google.gerrit.server.schema;
+
+import static com.google.gerrit.server.project.ProjectConfig.ACCESS;
+import static java.util.stream.Collectors.toList;
+
+import com.google.gerrit.common.data.PermissionRule;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.git.meta.VersionedMetaData;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gwtorm.server.OrmException;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.PersonIdent;
+
+public class ProjectConfigSchemaUpdate extends VersionedMetaData {
+
+  private final MetaDataUpdate update;
+  private Config config;
+  private boolean updated;
+
+  public static ProjectConfigSchemaUpdate read(MetaDataUpdate update)
+      throws IOException, ConfigInvalidException {
+    ProjectConfigSchemaUpdate r = new ProjectConfigSchemaUpdate(update);
+    r.load(update);
+    return r;
+  }
+
+  private ProjectConfigSchemaUpdate(MetaDataUpdate update) {
+    this.update = update;
+  }
+
+  @Override
+  protected String getRefName() {
+    return RefNames.REFS_CONFIG;
+  }
+
+  @Override
+  protected void onLoad() throws IOException, ConfigInvalidException {
+    config = readConfig(ProjectConfig.PROJECT_CONFIG);
+  }
+
+  public void removeForceFromPermission(String name) {
+    for (String subsection : config.getSubsections(ACCESS)) {
+      Set<String> names = config.getNames(ACCESS, subsection);
+      if (names.contains(name)) {
+        List<String> values =
+            Arrays.stream(config.getStringList(ACCESS, subsection, name))
+                .map(
+                    r -> {
+                      PermissionRule rule = PermissionRule.fromString(r, false);
+                      if (rule.getForce()) {
+                        rule.setForce(false);
+                        updated = true;
+                      }
+                      return rule.asString(false);
+                    })
+                .collect(toList());
+        config.setStringList(ACCESS, subsection, name, values);
+      }
+    }
+  }
+
+  @Override
+  protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException {
+    saveConfig(ProjectConfig.PROJECT_CONFIG, config);
+    return true;
+  }
+
+  public void save(PersonIdent personIdent, String commitMessage) throws OrmException {
+    if (!updated) {
+      return;
+    }
+
+    update.getCommitBuilder().setAuthor(personIdent);
+    update.getCommitBuilder().setCommitter(personIdent);
+    update.setMessage(commitMessage);
+    try {
+      commit(update);
+    } catch (IOException e) {
+      throw new OrmException(e);
+    }
+  }
+
+  public boolean isUpdated() {
+    return updated;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/ReviewDbDatabaseProvider.java b/java/com/google/gerrit/server/schema/ReviewDbDatabaseProvider.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/ReviewDbDatabaseProvider.java
rename to java/com/google/gerrit/server/schema/ReviewDbDatabaseProvider.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/ReviewDbFactory.java b/java/com/google/gerrit/server/schema/ReviewDbFactory.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/ReviewDbFactory.java
rename to java/com/google/gerrit/server/schema/ReviewDbFactory.java
diff --git a/java/com/google/gerrit/server/schema/SchemaCreator.java b/java/com/google/gerrit/server/schema/SchemaCreator.java
new file mode 100644
index 0000000..13734c3
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/SchemaCreator.java
@@ -0,0 +1,275 @@
+// Copyright (C) 2009 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.google.gerrit.server.schema;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.CurrentSchemaVersion;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.Sequences;
+import com.google.gerrit.server.account.GroupUUID;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.GerritServerId;
+import com.google.gerrit.server.config.SitePath;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.group.db.AuditLogFormatter;
+import com.google.gerrit.server.group.db.GroupConfig;
+import com.google.gerrit.server.group.db.GroupNameNotes;
+import com.google.gerrit.server.group.db.InternalGroupCreation;
+import com.google.gerrit.server.group.db.InternalGroupUpdate;
+import com.google.gerrit.server.index.group.GroupIndex;
+import com.google.gerrit.server.index.group.GroupIndexCollection;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gerrit.server.update.RefUpdateUtil;
+import com.google.gwtorm.jdbc.JdbcExecutor;
+import com.google.gwtorm.jdbc.JdbcSchema;
+import com.google.gwtorm.server.OrmDuplicateKeyException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.Collections;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+
+/** Creates the current database schema and populates initial code rows. */
+public class SchemaCreator {
+  @SitePath private final Path site_path;
+
+  private final GitRepositoryManager repoManager;
+  private final AllProjectsCreator allProjectsCreator;
+  private final AllUsersCreator allUsersCreator;
+  private final AllUsersName allUsersName;
+  private final PersonIdent serverUser;
+  private final DataSourceType dataSourceType;
+  private final GroupIndexCollection indexCollection;
+  private final String serverId;
+
+  private final Config config;
+  private final MetricMaker metricMaker;
+  private final NotesMigration migration;
+  private final AllProjectsName allProjectsName;
+
+  @Inject
+  public SchemaCreator(
+      SitePaths site,
+      GitRepositoryManager repoManager,
+      AllProjectsCreator ap,
+      AllUsersCreator auc,
+      AllUsersName allUsersName,
+      @GerritPersonIdent PersonIdent au,
+      DataSourceType dst,
+      GroupIndexCollection ic,
+      @GerritServerId String serverId,
+      @GerritServerConfig Config config,
+      MetricMaker metricMaker,
+      NotesMigration migration,
+      AllProjectsName apName) {
+    this(
+        site.site_path,
+        repoManager,
+        ap,
+        auc,
+        allUsersName,
+        au,
+        dst,
+        ic,
+        serverId,
+        config,
+        metricMaker,
+        migration,
+        apName);
+  }
+
+  public SchemaCreator(
+      @SitePath Path site,
+      GitRepositoryManager repoManager,
+      AllProjectsCreator ap,
+      AllUsersCreator auc,
+      AllUsersName allUsersName,
+      @GerritPersonIdent PersonIdent au,
+      DataSourceType dst,
+      GroupIndexCollection ic,
+      String serverId,
+      Config config,
+      MetricMaker metricMaker,
+      NotesMigration migration,
+      AllProjectsName apName) {
+    site_path = site;
+    this.repoManager = repoManager;
+    allProjectsCreator = ap;
+    allUsersCreator = auc;
+    this.allUsersName = allUsersName;
+    serverUser = au;
+    dataSourceType = dst;
+    indexCollection = ic;
+    this.serverId = serverId;
+
+    this.config = config;
+    this.allProjectsName = apName;
+    this.migration = migration;
+    this.metricMaker = metricMaker;
+  }
+
+  public void create(ReviewDb db) throws OrmException, IOException, ConfigInvalidException {
+    final JdbcSchema jdbc = (JdbcSchema) db;
+    try (JdbcExecutor e = new JdbcExecutor(jdbc)) {
+      jdbc.updateSchema(e);
+    }
+
+    final CurrentSchemaVersion sVer = CurrentSchemaVersion.create();
+    sVer.versionNbr = SchemaVersion.getBinaryVersion();
+    db.schemaVersion().insert(Collections.singleton(sVer));
+
+    GroupReference admins = createGroupReference("Administrators");
+    GroupReference batchUsers = createGroupReference("Non-Interactive Users");
+
+    allProjectsCreator.setAdministrators(admins).setBatchUsers(batchUsers).create();
+    // We have to create the All-Users repository before we can use it to store the groups in it.
+    allUsersCreator.setAdministrators(admins).create();
+
+    // Don't rely on injection to construct Sequences, as it requires ReviewDb.
+    Sequences seqs =
+        new Sequences(
+            config,
+            () -> db,
+            migration,
+            repoManager,
+            GitReferenceUpdated.DISABLED,
+            allProjectsName,
+            allUsersName,
+            metricMaker);
+    try (Repository allUsersRepo = repoManager.openRepository(allUsersName)) {
+      createAdminsGroup(seqs, allUsersRepo, admins);
+      createBatchUsersGroup(seqs, allUsersRepo, batchUsers, admins.getUUID());
+    }
+
+    dataSourceType.getIndexScript().run(db);
+  }
+
+  private void createAdminsGroup(
+      Sequences seqs, Repository allUsersRepo, GroupReference groupReference)
+      throws OrmException, IOException, ConfigInvalidException {
+    InternalGroupCreation groupCreation = getGroupCreation(seqs, groupReference);
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder().setDescription("Gerrit Site Administrators").build();
+
+    createGroup(allUsersRepo, groupCreation, groupUpdate);
+  }
+
+  private void createBatchUsersGroup(
+      Sequences seqs,
+      Repository allUsersRepo,
+      GroupReference groupReference,
+      AccountGroup.UUID adminsGroupUuid)
+      throws OrmException, IOException, ConfigInvalidException {
+    InternalGroupCreation groupCreation = getGroupCreation(seqs, groupReference);
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder()
+            .setDescription("Users who perform batch actions on Gerrit")
+            .setOwnerGroupUUID(adminsGroupUuid)
+            .build();
+
+    createGroup(allUsersRepo, groupCreation, groupUpdate);
+  }
+
+  private void createGroup(
+      Repository allUsersRepo, InternalGroupCreation groupCreation, InternalGroupUpdate groupUpdate)
+      throws OrmException, ConfigInvalidException, IOException {
+    InternalGroup createdGroup = createGroupInNoteDb(allUsersRepo, groupCreation, groupUpdate);
+    index(createdGroup);
+  }
+
+  private InternalGroup createGroupInNoteDb(
+      Repository allUsersRepo, InternalGroupCreation groupCreation, InternalGroupUpdate groupUpdate)
+      throws ConfigInvalidException, IOException, OrmDuplicateKeyException {
+    // This method is only executed on a new server which doesn't have any accounts or groups.
+    AuditLogFormatter auditLogFormatter =
+        AuditLogFormatter.createBackedBy(ImmutableSet.of(), ImmutableSet.of(), serverId);
+
+    GroupConfig groupConfig =
+        GroupConfig.createForNewGroup(allUsersName, allUsersRepo, groupCreation);
+    groupConfig.setGroupUpdate(groupUpdate, auditLogFormatter);
+
+    AccountGroup.NameKey groupName = groupUpdate.getName().orElseGet(groupCreation::getNameKey);
+    GroupNameNotes groupNameNotes =
+        GroupNameNotes.forNewGroup(
+            allUsersName, allUsersRepo, groupCreation.getGroupUUID(), groupName);
+
+    commit(allUsersRepo, groupConfig, groupNameNotes);
+
+    return groupConfig
+        .getLoadedGroup()
+        .orElseThrow(() -> new IllegalStateException("Created group wasn't automatically loaded"));
+  }
+
+  private void commit(
+      Repository allUsersRepo, GroupConfig groupConfig, GroupNameNotes groupNameNotes)
+      throws IOException {
+    BatchRefUpdate batchRefUpdate = allUsersRepo.getRefDatabase().newBatchUpdate();
+    try (MetaDataUpdate metaDataUpdate = createMetaDataUpdate(allUsersRepo, batchRefUpdate)) {
+      groupConfig.commit(metaDataUpdate);
+    }
+    // MetaDataUpdates unfortunately can't be reused. -> Create a new one.
+    try (MetaDataUpdate metaDataUpdate = createMetaDataUpdate(allUsersRepo, batchRefUpdate)) {
+      groupNameNotes.commit(metaDataUpdate);
+    }
+    RefUpdateUtil.executeChecked(batchRefUpdate, allUsersRepo);
+  }
+
+  private MetaDataUpdate createMetaDataUpdate(
+      Repository allUsersRepo, @Nullable BatchRefUpdate batchRefUpdate) {
+    MetaDataUpdate metaDataUpdate =
+        new MetaDataUpdate(
+            GitReferenceUpdated.DISABLED, allUsersName, allUsersRepo, batchRefUpdate);
+    metaDataUpdate.getCommitBuilder().setAuthor(serverUser);
+    metaDataUpdate.getCommitBuilder().setCommitter(serverUser);
+    return metaDataUpdate;
+  }
+
+  private void index(InternalGroup group) throws IOException {
+    for (GroupIndex groupIndex : indexCollection.getWriteIndexes()) {
+      groupIndex.replace(group);
+    }
+  }
+
+  private GroupReference createGroupReference(String name) {
+    AccountGroup.UUID groupUuid = GroupUUID.make(name, serverUser);
+    return new GroupReference(groupUuid, name);
+  }
+
+  private InternalGroupCreation getGroupCreation(Sequences seqs, GroupReference groupReference)
+      throws OrmException {
+    int next = seqs.nextGroupId();
+    return InternalGroupCreation.builder()
+        .setNameKey(new AccountGroup.NameKey(groupReference.getName()))
+        .setId(new AccountGroup.Id(next))
+        .setGroupUUID(groupReference.getUUID())
+        .build();
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaModule.java b/java/com/google/gerrit/server/schema/SchemaModule.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaModule.java
rename to java/com/google/gerrit/server/schema/SchemaModule.java
diff --git a/java/com/google/gerrit/server/schema/SchemaUpdater.java b/java/com/google/gerrit/server/schema/SchemaUpdater.java
new file mode 100644
index 0000000..5ead6aa
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/SchemaUpdater.java
@@ -0,0 +1,131 @@
+// Copyright (C) 2009 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.google.gerrit.server.schema;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.gerrit.reviewdb.client.CurrentSchemaVersion;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.reviewdb.server.ReviewDbUtil;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.AnonymousCowardName;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import com.google.inject.Provider;
+import com.google.inject.Stage;
+import java.io.IOException;
+import java.sql.SQLException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.PersonIdent;
+
+/** Creates or updates the current database schema. */
+public class SchemaUpdater {
+  private final SchemaFactory<ReviewDb> schema;
+  private final SchemaCreator creator;
+  private final Provider<SchemaVersion> updater;
+
+  @Inject
+  SchemaUpdater(
+      @ReviewDbFactory SchemaFactory<ReviewDb> schema, SchemaCreator creator, Injector parent) {
+    this.schema = schema;
+    this.creator = creator;
+    this.updater = buildInjector(parent).getProvider(SchemaVersion.class);
+  }
+
+  private static Injector buildInjector(Injector parent) {
+    // Use DEVELOPMENT mode to allow lazy initialization of the
+    // graph. This avoids touching ancient schema versions that
+    // are behind this installation's current version.
+    return Guice.createInjector(
+        Stage.DEVELOPMENT,
+        new AbstractModule() {
+          @Override
+          protected void configure() {
+            bind(SchemaVersion.class).to(SchemaVersion.C);
+
+            for (Key<?> k :
+                new Key<?>[] {
+                  Key.get(PersonIdent.class, GerritPersonIdent.class),
+                  Key.get(String.class, AnonymousCowardName.class),
+                  Key.get(Config.class, GerritServerConfig.class),
+                }) {
+              rebind(parent, k);
+            }
+
+            for (Class<?> c :
+                new Class<?>[] {
+                  AllProjectsName.class,
+                  AllUsersCreator.class,
+                  AllUsersName.class,
+                  GitRepositoryManager.class,
+                  SitePaths.class,
+                  SystemGroupBackend.class,
+                }) {
+              rebind(parent, Key.get(c));
+            }
+          }
+
+          private <T> void rebind(Injector parent, Key<T> c) {
+            bind(c).toProvider(parent.getProvider(c));
+          }
+        });
+  }
+
+  public void update(UpdateUI ui) throws OrmException {
+    try (ReviewDb db = ReviewDbUtil.unwrapDb(schema.open())) {
+
+      final SchemaVersion u = updater.get();
+      final CurrentSchemaVersion version = getSchemaVersion(db);
+      if (version == null) {
+        try {
+          creator.create(db);
+        } catch (IOException | ConfigInvalidException e) {
+          throw new OrmException("Cannot initialize schema", e);
+        }
+
+      } else {
+        try {
+          u.check(ui, version, db);
+        } catch (SQLException e) {
+          throw new OrmException("Cannot upgrade schema", e);
+        }
+      }
+    }
+  }
+
+  @VisibleForTesting
+  public SchemaVersion getLatestSchemaVersion() {
+    return updater.get();
+  }
+
+  private CurrentSchemaVersion getSchemaVersion(ReviewDb db) {
+    try {
+      return db.schemaVersion().get(new CurrentSchemaVersion.Key());
+    } catch (OrmException e) {
+      return null;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/schema/SchemaVersion.java b/java/com/google/gerrit/server/schema/SchemaVersion.java
new file mode 100644
index 0000000..44533c9
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/SchemaVersion.java
@@ -0,0 +1,216 @@
+// Copyright (C) 2009 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.google.gerrit.server.schema;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Stopwatch;
+import com.google.common.collect.Lists;
+import com.google.gerrit.reviewdb.client.CurrentSchemaVersion;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.UsedAt;
+import com.google.gwtorm.jdbc.JdbcExecutor;
+import com.google.gwtorm.jdbc.JdbcSchema;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.StatementExecutor;
+import com.google.inject.Provider;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+/** A version of the database schema. */
+public abstract class SchemaVersion {
+  /** The current schema version. */
+  public static final Class<Schema_170> C = Schema_170.class;
+
+  public static int getBinaryVersion() {
+    return guessVersion(C);
+  }
+
+  private final Provider<? extends SchemaVersion> prior;
+  private final int versionNbr;
+
+  protected SchemaVersion(Provider<? extends SchemaVersion> prior) {
+    this.prior = prior;
+    this.versionNbr = guessVersion(getClass());
+  }
+
+  @UsedAt(UsedAt.Project.PLUGIN_DELETE_PROJECT)
+  public static int guessVersion(Class<?> c) {
+    String n = c.getName();
+    n = n.substring(n.lastIndexOf('_') + 1);
+    while (n.startsWith("0")) {
+      n = n.substring(1);
+    }
+    return Integer.parseInt(n);
+  }
+
+  /** @return the {@link CurrentSchemaVersion#versionNbr} this step targets. */
+  public final int getVersionNbr() {
+    return versionNbr;
+  }
+
+  @VisibleForTesting
+  public final SchemaVersion getPrior() {
+    return prior.get();
+  }
+
+  public final void check(UpdateUI ui, CurrentSchemaVersion curr, ReviewDb db)
+      throws OrmException, SQLException {
+    if (curr.versionNbr == versionNbr) {
+      // Nothing to do, we are at the correct schema.
+    } else if (curr.versionNbr > versionNbr) {
+      throw new OrmException(
+          "Cannot downgrade database schema from version "
+              + curr.versionNbr
+              + " to "
+              + versionNbr
+              + ".");
+    } else {
+      upgradeFrom(ui, curr, db);
+    }
+  }
+
+  /** Runs check on the prior schema version, and then upgrades. */
+  private void upgradeFrom(UpdateUI ui, CurrentSchemaVersion curr, ReviewDb db)
+      throws OrmException, SQLException {
+    List<SchemaVersion> pending = pending(curr.versionNbr);
+    updateSchema(pending, ui, db);
+    migrateData(pending, ui, curr, db);
+
+    JdbcSchema s = (JdbcSchema) db;
+    final List<String> pruneList = new ArrayList<>();
+    s.pruneSchema(
+        new StatementExecutor() {
+          @Override
+          public void execute(String sql) {
+            pruneList.add(sql);
+          }
+
+          @Override
+          public void close() {
+            // Do nothing.
+          }
+        });
+
+    try (JdbcExecutor e = new JdbcExecutor(s)) {
+      if (!pruneList.isEmpty()) {
+        ui.pruneSchema(e, pruneList);
+      }
+    }
+  }
+
+  private List<SchemaVersion> pending(int curr) {
+    List<SchemaVersion> r = Lists.newArrayListWithCapacity(versionNbr - curr);
+    for (SchemaVersion v = this; curr < v.getVersionNbr(); v = v.prior.get()) {
+      r.add(v);
+    }
+    Collections.reverse(r);
+    return r;
+  }
+
+  private void updateSchema(List<SchemaVersion> pending, UpdateUI ui, ReviewDb db)
+      throws OrmException, SQLException {
+    for (SchemaVersion v : pending) {
+      ui.message(String.format("Upgrading schema to %d ...", v.getVersionNbr()));
+      v.preUpdateSchema(db);
+    }
+
+    JdbcSchema s = (JdbcSchema) db;
+    try (JdbcExecutor e = new JdbcExecutor(s)) {
+      s.updateSchema(e);
+    }
+  }
+
+  /**
+   * Invoked before updateSchema adds new columns/tables.
+   *
+   * @param db open database handle.
+   * @throws OrmException if a Gerrit-specific exception occurred.
+   * @throws SQLException if an underlying SQL exception occurred.
+   */
+  protected void preUpdateSchema(ReviewDb db) throws OrmException, SQLException {}
+
+  private void migrateData(
+      List<SchemaVersion> pending, UpdateUI ui, CurrentSchemaVersion curr, ReviewDb db)
+      throws OrmException, SQLException {
+    for (SchemaVersion v : pending) {
+      Stopwatch sw = Stopwatch.createStarted();
+      ui.message(String.format("Migrating data to schema %d ...", v.getVersionNbr()));
+      v.migrateData(db, ui);
+      v.finish(curr, db);
+      ui.message(String.format("\t> Done (%.3f s)", sw.elapsed(TimeUnit.MILLISECONDS) / 1000d));
+    }
+  }
+
+  /**
+   * Invoked between updateSchema (adds new columns/tables) and pruneSchema (removes deleted
+   * columns/tables).
+   *
+   * @param db open database handle.
+   * @param ui interface for interacting with the user.
+   * @throws OrmException if a Gerrit-specific exception occurred.
+   * @throws SQLException if an underlying SQL exception occurred.
+   */
+  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {}
+
+  /** Mark the current schema version. */
+  protected void finish(CurrentSchemaVersion curr, ReviewDb db) throws OrmException {
+    curr.versionNbr = versionNbr;
+    db.schemaVersion().update(Collections.singleton(curr));
+  }
+
+  /** Rename an existing table. */
+  protected static void renameTable(ReviewDb db, String from, String to) throws OrmException {
+    JdbcSchema s = (JdbcSchema) db;
+    try (JdbcExecutor e = new JdbcExecutor(s)) {
+      s.renameTable(e, from, to);
+    }
+  }
+
+  /** Rename an existing column. */
+  protected static void renameColumn(ReviewDb db, String table, String from, String to)
+      throws OrmException {
+    JdbcSchema s = (JdbcSchema) db;
+    try (JdbcExecutor e = new JdbcExecutor(s)) {
+      s.renameColumn(e, table, from, to);
+    }
+  }
+
+  /** Execute an SQL statement. */
+  protected static void execute(ReviewDb db, String sql) throws SQLException {
+    try (Statement s = newStatement(db)) {
+      s.execute(sql);
+    }
+  }
+
+  /** Open a new single statement. */
+  protected static Statement newStatement(ReviewDb db) throws SQLException {
+    return ((JdbcSchema) db).getConnection().createStatement();
+  }
+
+  /** Open a new prepared statement. */
+  protected static PreparedStatement prepareStatement(ReviewDb db, String sql) throws SQLException {
+    return ((JdbcSchema) db).getConnection().prepareStatement(sql);
+  }
+
+  /** Open a new statement executor. */
+  protected static JdbcExecutor newExecutor(ReviewDb db) throws OrmException {
+    return new JdbcExecutor(((JdbcSchema) db).getConnection());
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersionCheck.java b/java/com/google/gerrit/server/schema/SchemaVersionCheck.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersionCheck.java
rename to java/com/google/gerrit/server/schema/SchemaVersionCheck.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_100.java b/java/com/google/gerrit/server/schema/Schema_100.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_100.java
rename to java/com/google/gerrit/server/schema/Schema_100.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_101.java b/java/com/google/gerrit/server/schema/Schema_101.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_101.java
rename to java/com/google/gerrit/server/schema/Schema_101.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_102.java b/java/com/google/gerrit/server/schema/Schema_102.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_102.java
rename to java/com/google/gerrit/server/schema/Schema_102.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_103.java b/java/com/google/gerrit/server/schema/Schema_103.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_103.java
rename to java/com/google/gerrit/server/schema/Schema_103.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_104.java b/java/com/google/gerrit/server/schema/Schema_104.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_104.java
rename to java/com/google/gerrit/server/schema/Schema_104.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_105.java b/java/com/google/gerrit/server/schema/Schema_105.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_105.java
rename to java/com/google/gerrit/server/schema/Schema_105.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_106.java b/java/com/google/gerrit/server/schema/Schema_106.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_106.java
rename to java/com/google/gerrit/server/schema/Schema_106.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_107.java b/java/com/google/gerrit/server/schema/Schema_107.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_107.java
rename to java/com/google/gerrit/server/schema/Schema_107.java
diff --git a/java/com/google/gerrit/server/schema/Schema_108.java b/java/com/google/gerrit/server/schema/Schema_108.java
new file mode 100644
index 0000000..4e62460
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_108.java
@@ -0,0 +1,191 @@
+// Copyright (C) 2015 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.google.gerrit.server.schema;
+
+import com.google.common.base.Joiner;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.collect.SetMultimap;
+import com.google.common.collect.Sets;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Change.Status;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.Project.NameKey;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.GroupCollector;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedSet;
+import org.eclipse.jgit.errors.MissingObjectException;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefDatabase;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevObject;
+import org.eclipse.jgit.revwalk.RevSort;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+public class Schema_108 extends SchemaVersion {
+  private final GitRepositoryManager repoManager;
+
+  @Inject
+  Schema_108(Provider<Schema_107> prior, GitRepositoryManager repoManager) {
+    super(prior);
+    this.repoManager = repoManager;
+  }
+
+  @Override
+  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException {
+    ui.message("Listing all changes ...");
+    SetMultimap<Project.NameKey, Change.Id> openByProject = getOpenChangesByProject(db, ui);
+    ui.message("done");
+
+    ui.message("Updating groups for open changes ...");
+    int i = 0;
+    for (Map.Entry<Project.NameKey, Collection<Change.Id>> e : openByProject.asMap().entrySet()) {
+      try (Repository repo = repoManager.openRepository(e.getKey());
+          RevWalk rw = new RevWalk(repo)) {
+        updateProjectGroups(db, repo, rw, (Set<Change.Id>) e.getValue(), ui);
+      } catch (IOException | NoSuchChangeException err) {
+        throw new OrmException(err);
+      }
+      if (++i % 100 == 0) {
+        ui.message("  done " + i + " projects ...");
+      }
+    }
+    ui.message("done");
+  }
+
+  private void updateProjectGroups(
+      ReviewDb db, Repository repo, RevWalk rw, Set<Change.Id> changes, UpdateUI ui)
+      throws OrmException, IOException {
+    // Match sorting in ReceiveCommits.
+    rw.reset();
+    rw.sort(RevSort.TOPO);
+    rw.sort(RevSort.REVERSE, true);
+
+    RefDatabase refdb = repo.getRefDatabase();
+    for (Ref ref : refdb.getRefsByPrefix(Constants.R_HEADS)) {
+      RevCommit c = maybeParseCommit(rw, ref.getObjectId(), ui);
+      if (c != null) {
+        rw.markUninteresting(c);
+      }
+    }
+
+    ListMultimap<ObjectId, Ref> changeRefsBySha =
+        MultimapBuilder.hashKeys().arrayListValues().build();
+    ListMultimap<ObjectId, PatchSet.Id> patchSetsBySha =
+        MultimapBuilder.hashKeys().arrayListValues().build();
+    for (Ref ref : refdb.getRefsByPrefix(RefNames.REFS_CHANGES)) {
+      ObjectId id = ref.getObjectId();
+      if (ref.getObjectId() == null) {
+        continue;
+      }
+      id = id.copy();
+      changeRefsBySha.put(id, ref);
+      PatchSet.Id psId = PatchSet.Id.fromRef(ref.getName());
+      if (psId != null && changes.contains(psId.getParentKey())) {
+        patchSetsBySha.put(id, psId);
+        RevCommit c = maybeParseCommit(rw, id, ui);
+        if (c != null) {
+          rw.markStart(c);
+        }
+      }
+    }
+
+    GroupCollector collector = GroupCollector.createForSchemaUpgradeOnly(changeRefsBySha, db);
+    RevCommit c;
+    while ((c = rw.next()) != null) {
+      collector.visit(c);
+    }
+
+    updateGroups(db, collector, patchSetsBySha);
+  }
+
+  private static void updateGroups(
+      ReviewDb db, GroupCollector collector, ListMultimap<ObjectId, PatchSet.Id> patchSetsBySha)
+      throws OrmException {
+    Map<PatchSet.Id, PatchSet> patchSets =
+        db.patchSets().toMap(db.patchSets().get(patchSetsBySha.values()));
+    for (Map.Entry<ObjectId, Collection<String>> e : collector.getGroups().asMap().entrySet()) {
+      for (PatchSet.Id psId : patchSetsBySha.get(e.getKey())) {
+        PatchSet ps = patchSets.get(psId);
+        if (ps != null) {
+          ps.setGroups(ImmutableList.copyOf(e.getValue()));
+        }
+      }
+    }
+
+    db.patchSets().update(patchSets.values());
+  }
+
+  private SetMultimap<Project.NameKey, Change.Id> getOpenChangesByProject(ReviewDb db, UpdateUI ui)
+      throws OrmException {
+    SortedSet<NameKey> projects = repoManager.list();
+    SortedSet<NameKey> nonExistentProjects = Sets.newTreeSet();
+    SetMultimap<Project.NameKey, Change.Id> openByProject =
+        MultimapBuilder.hashKeys().hashSetValues().build();
+    for (Change c : db.changes().all()) {
+      Status status = c.getStatus();
+      if (status != null && status.isClosed()) {
+        continue;
+      }
+
+      NameKey projectKey = c.getProject();
+      if (!projects.contains(projectKey)) {
+        nonExistentProjects.add(projectKey);
+      } else {
+        // The old "submitted" state is not supported anymore
+        // (thus status is null) but it was an opened state and needs
+        // to be migrated as such
+        openByProject.put(projectKey, c.getId());
+      }
+    }
+
+    if (!nonExistentProjects.isEmpty()) {
+      ui.message("Detected open changes referring to the following non-existent projects:");
+      ui.message(Joiner.on(", ").join(nonExistentProjects));
+      ui.message(
+          "It is highly recommended to remove\n"
+              + "the obsolete open changes, comments and patch-sets from your DB.\n");
+    }
+    return openByProject;
+  }
+
+  private static RevCommit maybeParseCommit(RevWalk rw, ObjectId id, UpdateUI ui)
+      throws IOException {
+    if (id != null) {
+      try {
+        RevObject obj = rw.parseAny(id);
+        return (obj instanceof RevCommit) ? (RevCommit) obj : null;
+      } catch (MissingObjectException moe) {
+        ui.message("Missing object: " + id.getName() + "\n");
+      }
+    }
+    return null;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_109.java b/java/com/google/gerrit/server/schema/Schema_109.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_109.java
rename to java/com/google/gerrit/server/schema/Schema_109.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_110.java b/java/com/google/gerrit/server/schema/Schema_110.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_110.java
rename to java/com/google/gerrit/server/schema/Schema_110.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_111.java b/java/com/google/gerrit/server/schema/Schema_111.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_111.java
rename to java/com/google/gerrit/server/schema/Schema_111.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_112.java b/java/com/google/gerrit/server/schema/Schema_112.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_112.java
rename to java/com/google/gerrit/server/schema/Schema_112.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_113.java b/java/com/google/gerrit/server/schema/Schema_113.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_113.java
rename to java/com/google/gerrit/server/schema/Schema_113.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_114.java b/java/com/google/gerrit/server/schema/Schema_114.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_114.java
rename to java/com/google/gerrit/server/schema/Schema_114.java
diff --git a/java/com/google/gerrit/server/schema/Schema_115.java b/java/com/google/gerrit/server/schema/Schema_115.java
new file mode 100644
index 0000000..70bc921
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_115.java
@@ -0,0 +1,209 @@
+// Copyright (C) 2015 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.google.gerrit.server.schema;
+
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.gerrit.server.config.ConfigUtil.storeSection;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.client.DiffPreferencesInfo;
+import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
+import com.google.gerrit.extensions.client.Theme;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.UserConfigSections;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.patch.PatchListKey;
+import com.google.gwtorm.jdbc.JdbcSchema;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.NullProgressMonitor;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+public class Schema_115 extends SchemaVersion {
+  private final GitRepositoryManager mgr;
+  private final AllUsersName allUsersName;
+  private final PersonIdent serverUser;
+
+  @Inject
+  Schema_115(
+      Provider<Schema_114> prior,
+      GitRepositoryManager mgr,
+      AllUsersName allUsersName,
+      @GerritPersonIdent PersonIdent serverUser) {
+    super(prior);
+    this.mgr = mgr;
+    this.allUsersName = allUsersName;
+    this.serverUser = serverUser;
+  }
+
+  @Override
+  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {
+    Map<Account.Id, DiffPreferencesInfo> imports = new HashMap<>();
+    try (Statement stmt = ((JdbcSchema) db).getConnection().createStatement();
+        ResultSet rs = stmt.executeQuery("SELECT * FROM account_diff_preferences")) {
+      Set<String> availableColumns = getColumns(rs);
+      while (rs.next()) {
+        Account.Id accountId = new Account.Id(rs.getInt("id"));
+        DiffPreferencesInfo prefs = new DiffPreferencesInfo();
+        if (availableColumns.contains("context")) {
+          prefs.context = (int) rs.getShort("context");
+        }
+        if (availableColumns.contains("expand_all_comments")) {
+          prefs.expandAllComments = toBoolean(rs.getString("expand_all_comments"));
+        }
+        if (availableColumns.contains("hide_line_numbers")) {
+          prefs.hideLineNumbers = toBoolean(rs.getString("hide_line_numbers"));
+        }
+        if (availableColumns.contains("hide_top_menu")) {
+          prefs.hideTopMenu = toBoolean(rs.getString("hide_top_menu"));
+        }
+        if (availableColumns.contains("ignore_whitespace")) {
+          // Enum with char as value
+          prefs.ignoreWhitespace = toWhitespace(rs.getString("ignore_whitespace"));
+        }
+        if (availableColumns.contains("intraline_difference")) {
+          prefs.intralineDifference = toBoolean(rs.getString("intraline_difference"));
+        }
+        if (availableColumns.contains("line_length")) {
+          prefs.lineLength = rs.getInt("line_length");
+        }
+        if (availableColumns.contains("manual_review")) {
+          prefs.manualReview = toBoolean(rs.getString("manual_review"));
+        }
+        if (availableColumns.contains("render_entire_file")) {
+          prefs.renderEntireFile = toBoolean(rs.getString("render_entire_file"));
+        }
+        if (availableColumns.contains("retain_header")) {
+          prefs.retainHeader = toBoolean(rs.getString("retain_header"));
+        }
+        if (availableColumns.contains("show_line_endings")) {
+          prefs.showLineEndings = toBoolean(rs.getString("show_line_endings"));
+        }
+        if (availableColumns.contains("show_tabs")) {
+          prefs.showTabs = toBoolean(rs.getString("show_tabs"));
+        }
+        if (availableColumns.contains("show_whitespace_errors")) {
+          prefs.showWhitespaceErrors = toBoolean(rs.getString("show_whitespace_errors"));
+        }
+        if (availableColumns.contains("skip_deleted")) {
+          prefs.skipDeleted = toBoolean(rs.getString("skip_deleted"));
+        }
+        if (availableColumns.contains("skip_uncommented")) {
+          prefs.skipUncommented = toBoolean(rs.getString("skip_uncommented"));
+        }
+        if (availableColumns.contains("syntax_highlighting")) {
+          prefs.syntaxHighlighting = toBoolean(rs.getString("syntax_highlighting"));
+        }
+        if (availableColumns.contains("tab_size")) {
+          prefs.tabSize = rs.getInt("tab_size");
+        }
+        if (availableColumns.contains("theme")) {
+          // Enum with name as values; can be null
+          prefs.theme = toTheme(rs.getString("theme"));
+        }
+        if (availableColumns.contains("hide_empty_pane")) {
+          prefs.hideEmptyPane = toBoolean(rs.getString("hide_empty_pane"));
+        }
+        if (availableColumns.contains("auto_hide_diff_table_header")) {
+          prefs.autoHideDiffTableHeader = toBoolean(rs.getString("auto_hide_diff_table_header"));
+        }
+        imports.put(accountId, prefs);
+      }
+    }
+
+    if (imports.isEmpty()) {
+      return;
+    }
+
+    try (Repository git = mgr.openRepository(allUsersName);
+        RevWalk rw = new RevWalk(git)) {
+      BatchRefUpdate bru = git.getRefDatabase().newBatchUpdate();
+      for (Map.Entry<Account.Id, DiffPreferencesInfo> e : imports.entrySet()) {
+        try (MetaDataUpdate md =
+            new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, git, bru)) {
+          md.getCommitBuilder().setAuthor(serverUser);
+          md.getCommitBuilder().setCommitter(serverUser);
+          VersionedAccountPreferences p = VersionedAccountPreferences.forUser(e.getKey());
+          p.load(md);
+          storeSection(
+              p.getConfig(),
+              UserConfigSections.DIFF,
+              null,
+              e.getValue(),
+              DiffPreferencesInfo.defaults());
+          p.commit(md);
+        }
+      }
+
+      bru.execute(rw, NullProgressMonitor.INSTANCE);
+    } catch (ConfigInvalidException | IOException ex) {
+      throw new OrmException(ex);
+    }
+  }
+
+  private Set<String> getColumns(ResultSet rs) throws SQLException {
+    ResultSetMetaData metaData = rs.getMetaData();
+    int columnCount = metaData.getColumnCount();
+    Set<String> columns = new HashSet<>(columnCount);
+    for (int i = 1; i <= columnCount; i++) {
+      columns.add(metaData.getColumnLabel(i).toLowerCase());
+    }
+    return columns;
+  }
+
+  private static Theme toTheme(String v) {
+    if (v == null) {
+      return Theme.DEFAULT;
+    }
+    return Theme.valueOf(v);
+  }
+
+  private static Whitespace toWhitespace(String v) {
+    requireNonNull(v);
+    if (v.isEmpty()) {
+      return Whitespace.IGNORE_NONE;
+    }
+    Whitespace r = PatchListKey.WHITESPACE_TYPES.inverse().get(v.charAt(0));
+    if (r == null) {
+      throw new IllegalArgumentException("Cannot find Whitespace type for: " + v);
+    }
+    return r;
+  }
+
+  private static boolean toBoolean(String v) {
+    checkState(!Strings.isNullOrEmpty(v));
+    return v.equals("Y");
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_116.java b/java/com/google/gerrit/server/schema/Schema_116.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_116.java
rename to java/com/google/gerrit/server/schema/Schema_116.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_117.java b/java/com/google/gerrit/server/schema/Schema_117.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_117.java
rename to java/com/google/gerrit/server/schema/Schema_117.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_118.java b/java/com/google/gerrit/server/schema/Schema_118.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_118.java
rename to java/com/google/gerrit/server/schema/Schema_118.java
diff --git a/java/com/google/gerrit/server/schema/Schema_119.java b/java/com/google/gerrit/server/schema/Schema_119.java
new file mode 100644
index 0000000..e5a6405
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_119.java
@@ -0,0 +1,233 @@
+// Copyright (C) 2015 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.google.gerrit.server.schema;
+
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.gerrit.reviewdb.client.CoreDownloadSchemes.ANON_GIT;
+import static com.google.gerrit.reviewdb.client.CoreDownloadSchemes.ANON_HTTP;
+import static com.google.gerrit.reviewdb.client.CoreDownloadSchemes.HTTP;
+import static com.google.gerrit.reviewdb.client.CoreDownloadSchemes.REPO_DOWNLOAD;
+import static com.google.gerrit.reviewdb.client.CoreDownloadSchemes.SSH;
+import static com.google.gerrit.server.config.ConfigUtil.storeSection;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableMap;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo.DateFormat;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo.DiffView;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo.DownloadCommand;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo.EmailStrategy;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo.ReviewCategoryStrategy;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo.TimeFormat;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.UserConfigSections;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gwtorm.jdbc.JdbcSchema;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.NullProgressMonitor;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+public class Schema_119 extends SchemaVersion {
+  private static final ImmutableMap<String, String> LEGACY_DISPLAYNAME_MAP =
+      ImmutableMap.<String, String>of(
+          "ANON_GIT", ANON_GIT,
+          "ANON_HTTP", ANON_HTTP,
+          "HTTP", HTTP,
+          "SSH", SSH,
+          "REPO_DOWNLOAD", REPO_DOWNLOAD);
+
+  private final GitRepositoryManager mgr;
+  private final AllUsersName allUsersName;
+  private final PersonIdent serverUser;
+
+  @Inject
+  Schema_119(
+      Provider<Schema_118> prior,
+      GitRepositoryManager mgr,
+      AllUsersName allUsersName,
+      @GerritPersonIdent PersonIdent serverUser) {
+    super(prior);
+    this.mgr = mgr;
+    this.allUsersName = allUsersName;
+    this.serverUser = serverUser;
+  }
+
+  @Override
+  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {
+    JdbcSchema schema = (JdbcSchema) db;
+    Connection connection = schema.getConnection();
+    String tableName = "accounts";
+    String emailStrategy = "email_strategy";
+    Set<String> columns = schema.getDialect().listColumns(connection, tableName);
+    Map<Account.Id, GeneralPreferencesInfo> imports = new HashMap<>();
+    try (Statement stmt = ((JdbcSchema) db).getConnection().createStatement();
+        ResultSet rs =
+            stmt.executeQuery(
+                "select "
+                    + "account_id, "
+                    + "maximum_page_size, "
+                    + "show_site_header, "
+                    + "use_flash_clipboard, "
+                    + "download_url, "
+                    + "download_command, "
+                    + (columns.contains(emailStrategy)
+                        ? emailStrategy + ", "
+                        : "copy_self_on_email, ")
+                    + "date_format, "
+                    + "time_format, "
+                    + "relative_date_in_change_table, "
+                    + "diff_view, "
+                    + "size_bar_in_change_table, "
+                    + "legacycid_in_change_table, "
+                    + "review_category_strategy, "
+                    + "mute_common_path_prefixes "
+                    + "from "
+                    + tableName)) {
+      while (rs.next()) {
+        GeneralPreferencesInfo p = new GeneralPreferencesInfo();
+        Account.Id accountId = new Account.Id(rs.getInt(1));
+        p.changesPerPage = (int) rs.getShort(2);
+        p.showSiteHeader = toBoolean(rs.getString(3));
+        p.useFlashClipboard = toBoolean(rs.getString(4));
+        p.downloadScheme = convertToModernNames(rs.getString(5));
+        p.downloadCommand = toDownloadCommand(rs.getString(6));
+        p.emailStrategy = toEmailStrategy(rs.getString(7), columns.contains(emailStrategy));
+        p.dateFormat = toDateFormat(rs.getString(8));
+        p.timeFormat = toTimeFormat(rs.getString(9));
+        p.relativeDateInChangeTable = toBoolean(rs.getString(10));
+        p.diffView = toDiffView(rs.getString(11));
+        p.sizeBarInChangeTable = toBoolean(rs.getString(12));
+        p.legacycidInChangeTable = toBoolean(rs.getString(13));
+        p.reviewCategoryStrategy = toReviewCategoryStrategy(rs.getString(14));
+        p.muteCommonPathPrefixes = toBoolean(rs.getString(15));
+        p.defaultBaseForMerges = GeneralPreferencesInfo.defaults().defaultBaseForMerges;
+        imports.put(accountId, p);
+      }
+    }
+
+    if (imports.isEmpty()) {
+      return;
+    }
+
+    try (Repository git = mgr.openRepository(allUsersName);
+        RevWalk rw = new RevWalk(git)) {
+      BatchRefUpdate bru = git.getRefDatabase().newBatchUpdate();
+      for (Map.Entry<Account.Id, GeneralPreferencesInfo> e : imports.entrySet()) {
+        try (MetaDataUpdate md =
+            new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, git, bru)) {
+          md.getCommitBuilder().setAuthor(serverUser);
+          md.getCommitBuilder().setCommitter(serverUser);
+          VersionedAccountPreferences p = VersionedAccountPreferences.forUser(e.getKey());
+          p.load(md);
+          storeSection(
+              p.getConfig(),
+              UserConfigSections.GENERAL,
+              null,
+              e.getValue(),
+              GeneralPreferencesInfo.defaults());
+          p.commit(md);
+        }
+      }
+
+      bru.execute(rw, NullProgressMonitor.INSTANCE);
+    } catch (ConfigInvalidException | IOException ex) {
+      throw new OrmException(ex);
+    }
+  }
+
+  private String convertToModernNames(String s) {
+    return !Strings.isNullOrEmpty(s) && LEGACY_DISPLAYNAME_MAP.containsKey(s)
+        ? LEGACY_DISPLAYNAME_MAP.get(s)
+        : s;
+  }
+
+  private static DownloadCommand toDownloadCommand(String v) {
+    if (v == null) {
+      return DownloadCommand.CHECKOUT;
+    }
+    return DownloadCommand.valueOf(v);
+  }
+
+  private static DateFormat toDateFormat(String v) {
+    if (v == null) {
+      return DateFormat.STD;
+    }
+    return DateFormat.valueOf(v);
+  }
+
+  private static TimeFormat toTimeFormat(String v) {
+    if (v == null) {
+      return TimeFormat.HHMM_12;
+    }
+    return TimeFormat.valueOf(v);
+  }
+
+  private static DiffView toDiffView(String v) {
+    if (v == null) {
+      return DiffView.SIDE_BY_SIDE;
+    }
+    return DiffView.valueOf(v);
+  }
+
+  private static EmailStrategy toEmailStrategy(String v, boolean emailStrategyColumnExists)
+      throws OrmException {
+    if (v == null) {
+      return EmailStrategy.ENABLED;
+    }
+    if (emailStrategyColumnExists) {
+      return EmailStrategy.valueOf(v);
+    }
+    if (v.equals("N")) {
+      // EMAIL_STRATEGY='ENABLED' WHERE (COPY_SELF_ON_EMAIL='N')
+      return EmailStrategy.ENABLED;
+    } else if (v.equals("Y")) {
+      // EMAIL_STRATEGY='CC_ON_OWN_COMMENTS' WHERE (COPY_SELF_ON_EMAIL='Y')
+      return EmailStrategy.CC_ON_OWN_COMMENTS;
+    } else {
+      throw new OrmException("invalid value in accounts.copy_self_on_email: " + v);
+    }
+  }
+
+  private static ReviewCategoryStrategy toReviewCategoryStrategy(String v) {
+    if (v == null) {
+      return ReviewCategoryStrategy.NONE;
+    }
+    return ReviewCategoryStrategy.valueOf(v);
+  }
+
+  private static boolean toBoolean(String v) {
+    checkState(!Strings.isNullOrEmpty(v));
+    return v.equals("Y");
+  }
+}
diff --git a/java/com/google/gerrit/server/schema/Schema_120.java b/java/com/google/gerrit/server/schema/Schema_120.java
new file mode 100644
index 0000000..f2f3b99
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_120.java
@@ -0,0 +1,119 @@
+// 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.
+
+package com.google.gerrit.server.schema;
+
+import com.google.gerrit.common.data.SubscribeSection;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gwtorm.jdbc.JdbcSchema;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.NullProgressMonitor;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.RefSpec;
+
+public class Schema_120 extends SchemaVersion {
+
+  private final GitRepositoryManager mgr;
+  private final PersonIdent serverUser;
+
+  @Inject
+  Schema_120(
+      Provider<Schema_119> prior,
+      GitRepositoryManager mgr,
+      @GerritPersonIdent PersonIdent serverUser) {
+    super(prior);
+    this.mgr = mgr;
+    this.serverUser = serverUser;
+  }
+
+  private void allowSubmoduleSubscription(Branch.NameKey subbranch, Branch.NameKey superBranch)
+      throws OrmException {
+    try (Repository git = mgr.openRepository(subbranch.getParentKey());
+        RevWalk rw = new RevWalk(git)) {
+      BatchRefUpdate bru = git.getRefDatabase().newBatchUpdate();
+      try (MetaDataUpdate md =
+          new MetaDataUpdate(GitReferenceUpdated.DISABLED, subbranch.getParentKey(), git, bru)) {
+        md.getCommitBuilder().setAuthor(serverUser);
+        md.getCommitBuilder().setCommitter(serverUser);
+        md.setMessage("Added superproject subscription during upgrade");
+        ProjectConfig pc = ProjectConfig.read(md);
+
+        SubscribeSection s = null;
+        for (SubscribeSection s1 : pc.getSubscribeSections(subbranch)) {
+          if (s1.getProject().equals(superBranch.getParentKey())) {
+            s = s1;
+          }
+        }
+        if (s == null) {
+          s = new SubscribeSection(superBranch.getParentKey());
+          pc.addSubscribeSection(s);
+        }
+        RefSpec newRefSpec = new RefSpec(subbranch.get() + ":" + superBranch.get());
+
+        if (!s.getMatchingRefSpecs().contains(newRefSpec)) {
+          // For the migration we use only exact RefSpecs, we're not trying to
+          // generalize it.
+          s.addMatchingRefSpec(newRefSpec);
+        }
+
+        pc.commit(md);
+      }
+      bru.execute(rw, NullProgressMonitor.INSTANCE);
+    } catch (ConfigInvalidException | IOException e) {
+      throw new OrmException(e);
+    }
+  }
+
+  @Override
+  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {
+    ui.message("Generating Superproject subscriptions table to submodule ACLs");
+
+    try (Statement stmt = ((JdbcSchema) db).getConnection().createStatement();
+        ResultSet rs =
+            stmt.executeQuery(
+                "SELECT "
+                    + "super_project_project_name, "
+                    + "super_project_branch_name, "
+                    + "submodule_project_name, "
+                    + "submodule_branch_name "
+                    + "FROM submodule_subscriptions")) {
+      while (rs.next()) {
+        Project.NameKey superproject = new Project.NameKey(rs.getString(1));
+        Branch.NameKey superbranch = new Branch.NameKey(superproject, rs.getString(2));
+
+        Project.NameKey submodule = new Project.NameKey(rs.getString(3));
+        Branch.NameKey subbranch = new Branch.NameKey(submodule, rs.getString(4));
+
+        allowSubmoduleSubscription(subbranch, superbranch);
+      }
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_121.java b/java/com/google/gerrit/server/schema/Schema_121.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_121.java
rename to java/com/google/gerrit/server/schema/Schema_121.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_122.java b/java/com/google/gerrit/server/schema/Schema_122.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_122.java
rename to java/com/google/gerrit/server/schema/Schema_122.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_123.java b/java/com/google/gerrit/server/schema/Schema_123.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_123.java
rename to java/com/google/gerrit/server/schema/Schema_123.java
diff --git a/java/com/google/gerrit/server/schema/Schema_124.java b/java/com/google/gerrit/server/schema/Schema_124.java
new file mode 100644
index 0000000..6164fd1
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_124.java
@@ -0,0 +1,138 @@
+// 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.
+
+package com.google.gerrit.server.schema;
+
+import static java.util.Comparator.comparing;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.collect.Ordering;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.account.AccountSshKey;
+import com.google.gerrit.server.account.VersionedAuthorizedKeys;
+import com.google.gerrit.server.account.VersionedAuthorizedKeys.SimpleSshKeyCreator;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gwtorm.jdbc.JdbcSchema;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.NullProgressMonitor;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+public class Schema_124 extends SchemaVersion {
+  private final GitRepositoryManager repoManager;
+  private final AllUsersName allUsersName;
+  private final PersonIdent serverUser;
+
+  @Inject
+  Schema_124(
+      Provider<Schema_123> prior,
+      GitRepositoryManager repoManager,
+      AllUsersName allUsersName,
+      @GerritPersonIdent PersonIdent serverUser) {
+    super(prior);
+    this.repoManager = repoManager;
+    this.allUsersName = allUsersName;
+    this.serverUser = serverUser;
+  }
+
+  @Override
+  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {
+    ListMultimap<Account.Id, AccountSshKey> imports =
+        MultimapBuilder.hashKeys().arrayListValues().build();
+    try (Statement stmt = ((JdbcSchema) db).getConnection().createStatement();
+        ResultSet rs =
+            stmt.executeQuery(
+                "SELECT "
+                    + "account_id, "
+                    + "seq, "
+                    + "ssh_public_key, "
+                    + "valid "
+                    + "FROM account_ssh_keys")) {
+      while (rs.next()) {
+        Account.Id accountId = new Account.Id(rs.getInt(1));
+        int seq = rs.getInt(2);
+        String sshPublicKey = rs.getString(3);
+        boolean valid = toBoolean(rs.getString(4));
+        AccountSshKey key = AccountSshKey.create(accountId, seq, sshPublicKey, valid);
+        imports.put(accountId, key);
+      }
+    }
+
+    if (imports.isEmpty()) {
+      return;
+    }
+
+    try (Repository git = repoManager.openRepository(allUsersName);
+        RevWalk rw = new RevWalk(git)) {
+      BatchRefUpdate bru = git.getRefDatabase().newBatchUpdate();
+
+      for (Map.Entry<Account.Id, Collection<AccountSshKey>> e : imports.asMap().entrySet()) {
+        try (MetaDataUpdate md =
+            new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, git, bru)) {
+          md.getCommitBuilder().setAuthor(serverUser);
+          md.getCommitBuilder().setCommitter(serverUser);
+
+          VersionedAuthorizedKeys authorizedKeys =
+              new VersionedAuthorizedKeys(new SimpleSshKeyCreator(), e.getKey());
+          authorizedKeys.load(md);
+          authorizedKeys.setKeys(fixInvalidSequenceNumbers(e.getValue()));
+          authorizedKeys.commit(md);
+        }
+      }
+
+      bru.execute(rw, NullProgressMonitor.INSTANCE);
+    } catch (ConfigInvalidException | IOException ex) {
+      throw new OrmException(ex);
+    }
+  }
+
+  private Collection<AccountSshKey> fixInvalidSequenceNumbers(Collection<AccountSshKey> keys) {
+    Ordering<AccountSshKey> o = Ordering.from(comparing(AccountSshKey::seq));
+    List<AccountSshKey> fixedKeys = new ArrayList<>(keys);
+    AccountSshKey minKey = o.min(keys);
+    while (minKey.seq() <= 0) {
+      AccountSshKey fixedKey =
+          AccountSshKey.create(
+              minKey.accountId(), Math.max(o.max(keys).seq() + 1, 1), minKey.sshPublicKey());
+      Collections.replaceAll(fixedKeys, minKey, fixedKey);
+      minKey = o.min(fixedKeys);
+    }
+    return fixedKeys;
+  }
+
+  private static boolean toBoolean(String v) {
+    return !Strings.isNullOrEmpty(v) && v.equalsIgnoreCase("Y");
+  }
+}
diff --git a/java/com/google/gerrit/server/schema/Schema_125.java b/java/com/google/gerrit/server/schema/Schema_125.java
new file mode 100644
index 0000000..7aab7c7
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_125.java
@@ -0,0 +1,128 @@
+// 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.
+
+package com.google.gerrit.server.schema;
+
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static com.google.gerrit.server.schema.AclUtil.grant;
+
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.server.project.RefPattern;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+
+public class Schema_125 extends SchemaVersion {
+  private static final String COMMIT_MSG =
+      "Assign default permissions on user branches\n"
+          + "\n"
+          + "By default each user should be able to read and update the own user\n"
+          + "branch. Also the user should be able to approve and submit changes for\n"
+          + "the own user branch. Assign default permissions for this and remove the\n"
+          + "old exclusive read protection from the user branches.\n";
+
+  private final GitRepositoryManager repoManager;
+  private final AllUsersName allUsersName;
+  private final AllProjectsName allProjectsName;
+  private final SystemGroupBackend systemGroupBackend;
+  private final PersonIdent serverUser;
+
+  @Inject
+  Schema_125(
+      Provider<Schema_124> prior,
+      GitRepositoryManager repoManager,
+      AllUsersName allUsersName,
+      AllProjectsName allProjectsName,
+      SystemGroupBackend systemGroupBackend,
+      @GerritPersonIdent PersonIdent serverUser) {
+    super(prior);
+    this.repoManager = repoManager;
+    this.allUsersName = allUsersName;
+    this.allProjectsName = allProjectsName;
+    this.systemGroupBackend = systemGroupBackend;
+    this.serverUser = serverUser;
+  }
+
+  @Override
+  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException {
+    try (Repository git = repoManager.openRepository(allUsersName);
+        MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, git)) {
+      ProjectConfig config = ProjectConfig.read(md);
+
+      config
+          .getAccessSection(RefNames.REFS_USERS + "*", true)
+          .remove(new Permission(Permission.READ));
+      GroupReference registered = systemGroupBackend.getGroup(REGISTERED_USERS);
+      AccessSection users =
+          config.getAccessSection(
+              RefNames.REFS_USERS + "${" + RefPattern.USERID_SHARDED + "}", true);
+      grant(config, users, Permission.READ, true, registered);
+      grant(config, users, Permission.PUSH, true, registered);
+      grant(config, users, Permission.SUBMIT, true, registered);
+
+      for (LabelType lt : getLabelTypes(config)) {
+        if ("Code-Review".equals(lt.getName()) || "Verified".equals(lt.getName())) {
+          grant(config, users, lt, lt.getMin().getValue(), lt.getMax().getValue(), registered);
+        }
+      }
+
+      md.getCommitBuilder().setAuthor(serverUser);
+      md.getCommitBuilder().setCommitter(serverUser);
+      md.setMessage(COMMIT_MSG);
+      config.commit(md);
+    } catch (ConfigInvalidException | IOException ex) {
+      throw new OrmException(ex);
+    }
+  }
+
+  private Collection<LabelType> getLabelTypes(ProjectConfig config)
+      throws IOException, ConfigInvalidException {
+    Map<String, LabelType> labelTypes = new HashMap<>(config.getLabelSections());
+    Project.NameKey parent = config.getProject().getParent(allProjectsName);
+    while (parent != null) {
+      try (Repository git = repoManager.openRepository(parent);
+          MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, parent, git)) {
+        ProjectConfig parentConfig = ProjectConfig.read(md);
+        for (LabelType lt : parentConfig.getLabelSections().values()) {
+          if (!labelTypes.containsKey(lt.getName())) {
+            labelTypes.put(lt.getName(), lt);
+          }
+        }
+        parent = parentConfig.getProject().getParent(allProjectsName);
+      }
+    }
+    return labelTypes.values();
+  }
+}
diff --git a/java/com/google/gerrit/server/schema/Schema_126.java b/java/com/google/gerrit/server/schema/Schema_126.java
new file mode 100644
index 0000000..5dbda72
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_126.java
@@ -0,0 +1,86 @@
+// 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.
+
+package com.google.gerrit.server.schema;
+
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static com.google.gerrit.server.schema.AclUtil.grant;
+
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.server.project.RefPattern;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+
+public class Schema_126 extends SchemaVersion {
+  private static final String COMMIT_MSG = "Fix default permissions on user branches";
+
+  private final GitRepositoryManager repoManager;
+  private final AllUsersName allUsersName;
+  private final SystemGroupBackend systemGroupBackend;
+  private final PersonIdent serverUser;
+
+  @Inject
+  Schema_126(
+      Provider<Schema_125> prior,
+      GitRepositoryManager repoManager,
+      AllUsersName allUsersName,
+      SystemGroupBackend systemGroupBackend,
+      @GerritPersonIdent PersonIdent serverUser) {
+    super(prior);
+    this.repoManager = repoManager;
+    this.allUsersName = allUsersName;
+    this.systemGroupBackend = systemGroupBackend;
+    this.serverUser = serverUser;
+  }
+
+  @Override
+  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException {
+    try (Repository git = repoManager.openRepository(allUsersName);
+        MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, git)) {
+      ProjectConfig config = ProjectConfig.read(md);
+
+      String refsUsersShardedId = RefNames.REFS_USERS + "${" + RefPattern.USERID_SHARDED + "}";
+      config.remove(config.getAccessSection(refsUsersShardedId));
+
+      GroupReference registered = systemGroupBackend.getGroup(REGISTERED_USERS);
+      AccessSection users = config.getAccessSection(refsUsersShardedId, true);
+      grant(config, users, Permission.READ, false, true, registered);
+      grant(config, users, Permission.PUSH, false, true, registered);
+      grant(config, users, Permission.SUBMIT, false, true, registered);
+
+      md.getCommitBuilder().setAuthor(serverUser);
+      md.getCommitBuilder().setCommitter(serverUser);
+      md.setMessage(COMMIT_MSG);
+      config.commit(md);
+    } catch (ConfigInvalidException | IOException ex) {
+      throw new OrmException(ex);
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_127.java b/java/com/google/gerrit/server/schema/Schema_127.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_127.java
rename to java/com/google/gerrit/server/schema/Schema_127.java
diff --git a/java/com/google/gerrit/server/schema/Schema_128.java b/java/com/google/gerrit/server/schema/Schema_128.java
new file mode 100644
index 0000000..bd6b76a
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_128.java
@@ -0,0 +1,80 @@
+// 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.
+
+package com.google.gerrit.server.schema;
+
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static com.google.gerrit.server.schema.AclUtil.grant;
+
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+
+public class Schema_128 extends SchemaVersion {
+  private static final String COMMIT_MSG = "Add addPatchSet permission to all projects";
+
+  private final GitRepositoryManager repoManager;
+  private final AllProjectsName allProjectsName;
+  private final SystemGroupBackend systemGroupBackend;
+  private final PersonIdent serverUser;
+
+  @Inject
+  Schema_128(
+      Provider<Schema_127> prior,
+      GitRepositoryManager repoManager,
+      AllProjectsName allProjectsName,
+      SystemGroupBackend systemGroupBackend,
+      @GerritPersonIdent PersonIdent serverUser) {
+    super(prior);
+    this.repoManager = repoManager;
+    this.allProjectsName = allProjectsName;
+    this.systemGroupBackend = systemGroupBackend;
+    this.serverUser = serverUser;
+  }
+
+  @Override
+  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException {
+    try (Repository git = repoManager.openRepository(allProjectsName);
+        MetaDataUpdate md =
+            new MetaDataUpdate(GitReferenceUpdated.DISABLED, allProjectsName, git)) {
+      ProjectConfig config = ProjectConfig.read(md);
+
+      GroupReference registered = systemGroupBackend.getGroup(REGISTERED_USERS);
+      AccessSection refsFor = config.getAccessSection("refs/for/*", true);
+      grant(config, refsFor, Permission.ADD_PATCH_SET, false, false, registered);
+
+      md.getCommitBuilder().setAuthor(serverUser);
+      md.getCommitBuilder().setCommitter(serverUser);
+      md.setMessage(COMMIT_MSG);
+      config.commit(md);
+    } catch (ConfigInvalidException | IOException ex) {
+      throw new OrmException(ex);
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_129.java b/java/com/google/gerrit/server/schema/Schema_129.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_129.java
rename to java/com/google/gerrit/server/schema/Schema_129.java
diff --git a/java/com/google/gerrit/server/schema/Schema_130.java b/java/com/google/gerrit/server/schema/Schema_130.java
new file mode 100644
index 0000000..66f2177
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_130.java
@@ -0,0 +1,76 @@
+// 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.
+
+package com.google.gerrit.server.schema;
+
+import static java.util.stream.Collectors.joining;
+
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+
+public class Schema_130 extends SchemaVersion {
+  private static final String COMMIT_MSG =
+      "Remove force option from 'Push Annotated Tag' permission\n"
+          + "\n"
+          + "The force option on 'Push Annotated Tag' had no effect and is no longer\n"
+          + "supported.";
+
+  private final GitRepositoryManager repoManager;
+  private final PersonIdent serverUser;
+
+  @Inject
+  Schema_130(
+      Provider<Schema_129> prior,
+      GitRepositoryManager repoManager,
+      @GerritPersonIdent PersonIdent serverUser) {
+    super(prior);
+    this.repoManager = repoManager;
+    this.serverUser = serverUser;
+  }
+
+  @Override
+  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException {
+    SortedSet<Project.NameKey> repoList = repoManager.list();
+    SortedSet<Project.NameKey> repoUpgraded = new TreeSet<>();
+    ui.message("\tMigrating " + repoList.size() + " repositories ...");
+    for (Project.NameKey projectName : repoList) {
+      try (Repository git = repoManager.openRepository(projectName);
+          MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, projectName, git)) {
+        ProjectConfigSchemaUpdate cfg = ProjectConfigSchemaUpdate.read(md);
+        cfg.removeForceFromPermission("pushTag");
+        if (cfg.isUpdated()) {
+          repoUpgraded.add(projectName);
+        }
+        cfg.save(serverUser, COMMIT_MSG);
+      } catch (ConfigInvalidException | IOException ex) {
+        throw new OrmException("Cannot migrate project " + projectName, ex);
+      }
+    }
+    ui.message("\tMigration completed:  " + repoUpgraded.size() + " repositories updated:");
+    ui.message("\t" + repoUpgraded.stream().map(Project.NameKey::get).collect(joining(" ")));
+  }
+}
diff --git a/java/com/google/gerrit/server/schema/Schema_131.java b/java/com/google/gerrit/server/schema/Schema_131.java
new file mode 100644
index 0000000..3755211
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_131.java
@@ -0,0 +1,76 @@
+// 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.
+
+package com.google.gerrit.server.schema;
+
+import static java.util.stream.Collectors.joining;
+
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+
+public class Schema_131 extends SchemaVersion {
+  private static final String COMMIT_MSG =
+      "Rename 'Push Annotated/Signed Tag' permission to 'Create Annotated/Signed Tag'";
+
+  private final GitRepositoryManager repoManager;
+  private final PersonIdent serverUser;
+
+  @Inject
+  Schema_131(
+      Provider<Schema_130> prior,
+      GitRepositoryManager repoManager,
+      @GerritPersonIdent PersonIdent serverUser) {
+    super(prior);
+    this.repoManager = repoManager;
+    this.serverUser = serverUser;
+  }
+
+  @Override
+  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException {
+    SortedSet<Project.NameKey> repoList = repoManager.list();
+    SortedSet<Project.NameKey> repoUpgraded = new TreeSet<>();
+    ui.message("\tMigrating " + repoList.size() + " repositories ...");
+    for (Project.NameKey projectName : repoList) {
+      try (Repository git = repoManager.openRepository(projectName);
+          MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, projectName, git)) {
+        ProjectConfig config = ProjectConfig.read(md);
+        if (config.hasLegacyPermissions()) {
+          md.getCommitBuilder().setAuthor(serverUser);
+          md.getCommitBuilder().setCommitter(serverUser);
+          md.setMessage(COMMIT_MSG);
+          config.commit(md);
+          repoUpgraded.add(projectName);
+        }
+      } catch (ConfigInvalidException | IOException ex) {
+        throw new OrmException("Cannot migrate project " + projectName, ex);
+      }
+    }
+    ui.message("\tMigration completed:  " + repoUpgraded.size() + " repositories updated:");
+    ui.message("\t" + repoUpgraded.stream().map(Project.NameKey::get).collect(joining(" ")));
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_132.java b/java/com/google/gerrit/server/schema/Schema_132.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_132.java
rename to java/com/google/gerrit/server/schema/Schema_132.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_133.java b/java/com/google/gerrit/server/schema/Schema_133.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_133.java
rename to java/com/google/gerrit/server/schema/Schema_133.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_134.java b/java/com/google/gerrit/server/schema/Schema_134.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_134.java
rename to java/com/google/gerrit/server/schema/Schema_134.java
diff --git a/java/com/google/gerrit/server/schema/Schema_135.java b/java/com/google/gerrit/server/schema/Schema_135.java
new file mode 100644
index 0000000..df3dcaf
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_135.java
@@ -0,0 +1,98 @@
+// 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.
+
+package com.google.gerrit.server.schema;
+
+import static com.google.gerrit.server.group.SystemGroupBackend.PROJECT_OWNERS;
+import static java.util.stream.Collectors.toSet;
+
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.common.data.PermissionRule;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.Set;
+import java.util.stream.Stream;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+
+public class Schema_135 extends SchemaVersion {
+  private static final String COMMIT_MSG =
+      "Allow admins and project owners to create refs/meta/config";
+
+  private final GitRepositoryManager repoManager;
+  private final AllProjectsName allProjectsName;
+  private final SystemGroupBackend systemGroupBackend;
+  private final PersonIdent serverUser;
+
+  @Inject
+  Schema_135(
+      Provider<Schema_134> prior,
+      GitRepositoryManager repoManager,
+      AllProjectsName allProjectsName,
+      SystemGroupBackend systemGroupBackend,
+      @GerritPersonIdent PersonIdent serverUser) {
+    super(prior);
+    this.repoManager = repoManager;
+    this.allProjectsName = allProjectsName;
+    this.systemGroupBackend = systemGroupBackend;
+    this.serverUser = serverUser;
+  }
+
+  @Override
+  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException {
+    try (Repository git = repoManager.openRepository(allProjectsName);
+        MetaDataUpdate md =
+            new MetaDataUpdate(GitReferenceUpdated.DISABLED, allProjectsName, git)) {
+      ProjectConfig config = ProjectConfig.read(md);
+
+      AccessSection meta = config.getAccessSection(RefNames.REFS_CONFIG, true);
+      Permission createRefsMetaConfigPermission = meta.getPermission(Permission.CREATE, true);
+
+      Set<GroupReference> groups =
+          Stream.concat(
+                  config.getAccessSection(AccessSection.GLOBAL_CAPABILITIES, true)
+                      .getPermission(GlobalCapability.ADMINISTRATE_SERVER, true).getRules().stream()
+                      .map(PermissionRule::getGroup),
+                  Stream.of(systemGroupBackend.getGroup(PROJECT_OWNERS)))
+              .filter(g -> createRefsMetaConfigPermission.getRule(g) == null)
+              .collect(toSet());
+
+      for (GroupReference group : groups) {
+        createRefsMetaConfigPermission.add(new PermissionRule(config.resolve(group)));
+      }
+
+      md.getCommitBuilder().setAuthor(serverUser);
+      md.getCommitBuilder().setCommitter(serverUser);
+      md.setMessage(COMMIT_MSG);
+      config.commit(md);
+    } catch (ConfigInvalidException | IOException ex) {
+      throw new OrmException(ex);
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_136.java b/java/com/google/gerrit/server/schema/Schema_136.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_136.java
rename to java/com/google/gerrit/server/schema/Schema_136.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_137.java b/java/com/google/gerrit/server/schema/Schema_137.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_137.java
rename to java/com/google/gerrit/server/schema/Schema_137.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_138.java b/java/com/google/gerrit/server/schema/Schema_138.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_138.java
rename to java/com/google/gerrit/server/schema/Schema_138.java
diff --git a/java/com/google/gerrit/server/schema/Schema_139.java b/java/com/google/gerrit/server/schema/Schema_139.java
new file mode 100644
index 0000000..cdde7e4
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_139.java
@@ -0,0 +1,212 @@
+// 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.
+
+package com.google.gerrit.server.schema;
+
+import static com.google.common.base.Preconditions.checkState;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.base.Strings;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.MultimapBuilder;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.account.AccountConfig;
+import com.google.gerrit.server.account.InternalAccountUpdate;
+import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gerrit.server.account.ProjectWatches.ProjectWatchKey;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gwtorm.jdbc.JdbcSchema;
+import com.google.gwtorm.server.OrmDuplicateKeyException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Collection;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.NullProgressMonitor;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+public class Schema_139 extends SchemaVersion {
+  private static final String MSG = "Migrate project watches to git";
+
+  private final GitRepositoryManager repoManager;
+  private final AllUsersName allUsersName;
+  private final PersonIdent serverUser;
+
+  @Inject
+  Schema_139(
+      Provider<Schema_138> prior,
+      GitRepositoryManager repoManager,
+      AllUsersName allUsersName,
+      @GerritPersonIdent PersonIdent serverUser) {
+    super(prior);
+    this.repoManager = repoManager;
+    this.allUsersName = allUsersName;
+    this.serverUser = serverUser;
+  }
+
+  @Override
+  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {
+    ListMultimap<Account.Id, ProjectWatch> imports =
+        MultimapBuilder.hashKeys().arrayListValues().build();
+    try (Statement stmt = ((JdbcSchema) db).getConnection().createStatement();
+        ResultSet rs =
+            stmt.executeQuery(
+                "SELECT "
+                    + "account_id, "
+                    + "project_name, "
+                    + "filter, "
+                    + "notify_abandoned_changes, "
+                    + "notify_all_comments, "
+                    + "notify_new_changes, "
+                    + "notify_new_patch_sets, "
+                    + "notify_submitted_changes "
+                    + "FROM account_project_watches")) {
+      while (rs.next()) {
+        Account.Id accountId = new Account.Id(rs.getInt(1));
+        ProjectWatch.Builder b =
+            ProjectWatch.builder()
+                .project(new Project.NameKey(rs.getString(2)))
+                .filter(rs.getString(3))
+                .notifyAbandonedChanges(toBoolean(rs.getString(4)))
+                .notifyAllComments(toBoolean(rs.getString(5)))
+                .notifyNewChanges(toBoolean(rs.getString(6)))
+                .notifyNewPatchSets(toBoolean(rs.getString(7)))
+                .notifySubmittedChanges(toBoolean(rs.getString(8)));
+        imports.put(accountId, b.build());
+      }
+    }
+
+    if (imports.isEmpty()) {
+      return;
+    }
+
+    try (Repository git = repoManager.openRepository(allUsersName);
+        RevWalk rw = new RevWalk(git)) {
+      BatchRefUpdate bru = git.getRefDatabase().newBatchUpdate();
+      bru.setRefLogIdent(serverUser);
+      bru.setRefLogMessage(MSG, false);
+
+      for (Map.Entry<Account.Id, Collection<ProjectWatch>> e : imports.asMap().entrySet()) {
+        Map<ProjectWatchKey, Set<NotifyType>> projectWatches = new HashMap<>();
+        for (ProjectWatch projectWatch : e.getValue()) {
+          ProjectWatchKey key =
+              ProjectWatchKey.create(projectWatch.project(), projectWatch.filter());
+          if (projectWatches.containsKey(key)) {
+            throw new OrmDuplicateKeyException(
+                "Duplicate key for watched project: " + key.toString());
+          }
+          Set<NotifyType> notifyValues = EnumSet.noneOf(NotifyType.class);
+          if (projectWatch.notifyAbandonedChanges()) {
+            notifyValues.add(NotifyType.ABANDONED_CHANGES);
+          }
+          if (projectWatch.notifyAllComments()) {
+            notifyValues.add(NotifyType.ALL_COMMENTS);
+          }
+          if (projectWatch.notifyNewChanges()) {
+            notifyValues.add(NotifyType.NEW_CHANGES);
+          }
+          if (projectWatch.notifyNewPatchSets()) {
+            notifyValues.add(NotifyType.NEW_PATCHSETS);
+          }
+          if (projectWatch.notifySubmittedChanges()) {
+            notifyValues.add(NotifyType.SUBMITTED_CHANGES);
+          }
+          projectWatches.put(key, notifyValues);
+        }
+
+        try (MetaDataUpdate md =
+            new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, git, bru)) {
+          md.getCommitBuilder().setAuthor(serverUser);
+          md.getCommitBuilder().setCommitter(serverUser);
+          md.setMessage(MSG);
+
+          AccountConfig accountConfig = new AccountConfig(e.getKey(), allUsersName, git);
+          accountConfig.load(md);
+          accountConfig.setAccountUpdate(
+              InternalAccountUpdate.builder()
+                  .deleteProjectWatches(accountConfig.getProjectWatches().keySet())
+                  .updateProjectWatches(projectWatches)
+                  .build());
+          accountConfig.commit(md);
+        }
+      }
+      bru.execute(rw, NullProgressMonitor.INSTANCE);
+    } catch (IOException | ConfigInvalidException ex) {
+      throw new OrmException(ex);
+    }
+  }
+
+  @AutoValue
+  abstract static class ProjectWatch {
+    abstract Project.NameKey project();
+
+    abstract @Nullable String filter();
+
+    abstract boolean notifyAbandonedChanges();
+
+    abstract boolean notifyAllComments();
+
+    abstract boolean notifyNewChanges();
+
+    abstract boolean notifyNewPatchSets();
+
+    abstract boolean notifySubmittedChanges();
+
+    static Builder builder() {
+      return new AutoValue_Schema_139_ProjectWatch.Builder();
+    }
+
+    @AutoValue.Builder
+    abstract static class Builder {
+      abstract Builder project(Project.NameKey project);
+
+      abstract Builder filter(@Nullable String filter);
+
+      abstract Builder notifyAbandonedChanges(boolean notifyAbandonedChanges);
+
+      abstract Builder notifyAllComments(boolean notifyAllComments);
+
+      abstract Builder notifyNewChanges(boolean notifyNewChanges);
+
+      abstract Builder notifyNewPatchSets(boolean notifyNewPatchSets);
+
+      abstract Builder notifySubmittedChanges(boolean notifySubmittedChanges);
+
+      abstract ProjectWatch build();
+    }
+  }
+
+  private static boolean toBoolean(String v) {
+    checkState(!Strings.isNullOrEmpty(v));
+    return v.equals("Y");
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_140.java b/java/com/google/gerrit/server/schema/Schema_140.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_140.java
rename to java/com/google/gerrit/server/schema/Schema_140.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_141.java b/java/com/google/gerrit/server/schema/Schema_141.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_141.java
rename to java/com/google/gerrit/server/schema/Schema_141.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_142.java b/java/com/google/gerrit/server/schema/Schema_142.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_142.java
rename to java/com/google/gerrit/server/schema/Schema_142.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_143.java b/java/com/google/gerrit/server/schema/Schema_143.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_143.java
rename to java/com/google/gerrit/server/schema/Schema_143.java
diff --git a/java/com/google/gerrit/server/schema/Schema_144.java b/java/com/google/gerrit/server/schema/Schema_144.java
new file mode 100644
index 0000000..bb0cbca
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_144.java
@@ -0,0 +1,97 @@
+// 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.
+
+package com.google.gerrit.server.schema;
+
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.account.externalids.ExternalIdNotes;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gwtorm.jdbc.JdbcSchema;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+
+public class Schema_144 extends SchemaVersion {
+  private static final String COMMIT_MSG = "Import external IDs from ReviewDb";
+
+  private final GitRepositoryManager repoManager;
+  private final AllUsersName allUsersName;
+  private final PersonIdent serverIdent;
+
+  @Inject
+  Schema_144(
+      Provider<Schema_143> prior,
+      GitRepositoryManager repoManager,
+      AllUsersName allUsersName,
+      @GerritPersonIdent PersonIdent serverIdent) {
+    super(prior);
+    this.repoManager = repoManager;
+    this.allUsersName = allUsersName;
+    this.serverIdent = serverIdent;
+  }
+
+  @Override
+  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {
+    Set<ExternalId> toAdd = new HashSet<>();
+    try (Statement stmt = ((JdbcSchema) db).getConnection().createStatement();
+        ResultSet rs =
+            stmt.executeQuery(
+                "SELECT "
+                    + "account_id, "
+                    + "email_address, "
+                    + "password, "
+                    + "external_id "
+                    + "FROM account_external_ids")) {
+      while (rs.next()) {
+        Account.Id accountId = new Account.Id(rs.getInt(1));
+        String email = rs.getString(2);
+        String password = rs.getString(3);
+        String externalId = rs.getString(4);
+
+        toAdd.add(ExternalId.create(ExternalId.Key.parse(externalId), accountId, email, password));
+      }
+    }
+
+    try {
+      try (Repository repo = repoManager.openRepository(allUsersName)) {
+        ExternalIdNotes extIdNotes = ExternalIdNotes.loadNoCacheUpdate(allUsersName, repo);
+        extIdNotes.upsert(toAdd);
+        try (MetaDataUpdate metaDataUpdate =
+            new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, repo)) {
+          metaDataUpdate.getCommitBuilder().setAuthor(serverIdent);
+          metaDataUpdate.getCommitBuilder().setCommitter(serverIdent);
+          metaDataUpdate.getCommitBuilder().setMessage(COMMIT_MSG);
+          extIdNotes.commit(metaDataUpdate);
+        }
+      }
+    } catch (IOException | ConfigInvalidException e) {
+      throw new OrmException("Failed to migrate external IDs to NoteDb", e);
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_145.java b/java/com/google/gerrit/server/schema/Schema_145.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_145.java
rename to java/com/google/gerrit/server/schema/Schema_145.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_146.java b/java/com/google/gerrit/server/schema/Schema_146.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_146.java
rename to java/com/google/gerrit/server/schema/Schema_146.java
diff --git a/java/com/google/gerrit/server/schema/Schema_147.java b/java/com/google/gerrit/server/schema/Schema_147.java
new file mode 100644
index 0000000..d93daa1
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_147.java
@@ -0,0 +1,98 @@
+// Copyright (C) 2017 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.google.gerrit.server.schema;
+
+import static java.util.stream.Collectors.toSet;
+
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.HashSet;
+import java.util.Objects;
+import java.util.Set;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.RefUpdate.Result;
+import org.eclipse.jgit.lib.Repository;
+
+/** Delete user branches for which no account exists. */
+public class Schema_147 extends SchemaVersion {
+  private final GitRepositoryManager repoManager;
+  private final AllUsersName allUsersName;
+
+  @Inject
+  Schema_147(
+      Provider<Schema_146> prior, GitRepositoryManager repoManager, AllUsersName allUsersName) {
+    super(prior);
+    this.repoManager = repoManager;
+    this.allUsersName = allUsersName;
+  }
+
+  @Override
+  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {
+    try (Repository repo = repoManager.openRepository(allUsersName)) {
+      Set<Account.Id> accountIdsFromReviewDb = scanAccounts(db);
+      Set<Account.Id> accountIdsFromUserBranches =
+          repo.getRefDatabase().getRefsByPrefix(RefNames.REFS_USERS).stream()
+              .map(r -> Account.Id.fromRef(r.getName()))
+              .filter(Objects::nonNull)
+              .collect(toSet());
+      accountIdsFromUserBranches.removeAll(accountIdsFromReviewDb);
+      for (Account.Id accountId : accountIdsFromUserBranches) {
+        deleteUserBranch(repo, accountId);
+      }
+    } catch (IOException e) {
+      throw new OrmException("Failed to delete user branches for non-existing accounts.", e);
+    }
+  }
+
+  private Set<Account.Id> scanAccounts(ReviewDb db) throws SQLException {
+    try (Statement stmt = newStatement(db);
+        ResultSet rs = stmt.executeQuery("SELECT account_id FROM accounts")) {
+      Set<Account.Id> ids = new HashSet<>();
+      while (rs.next()) {
+        ids.add(new Account.Id(rs.getInt(1)));
+      }
+      return ids;
+    }
+  }
+
+  private void deleteUserBranch(Repository allUsersRepo, Account.Id accountId) throws IOException {
+    String refName = RefNames.refsUsers(accountId);
+    Ref ref = allUsersRepo.exactRef(refName);
+    if (ref == null) {
+      return;
+    }
+
+    RefUpdate ru = allUsersRepo.updateRef(refName);
+    ru.setExpectedOldObjectId(ref.getObjectId());
+    ru.setNewObjectId(ObjectId.zeroId());
+    ru.setForceUpdate(true);
+    Result result = ru.delete();
+    if (result != Result.FORCED) {
+      throw new IOException(String.format("Failed to delete ref %s: %s", refName, result.name()));
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/schema/Schema_148.java b/java/com/google/gerrit/server/schema/Schema_148.java
new file mode 100644
index 0000000..9433da8
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_148.java
@@ -0,0 +1,82 @@
+// Copyright (C) 2017 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.google.gerrit.server.schema;
+
+import com.google.common.primitives.Ints;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.account.externalids.ExternalIdNotes;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.sql.SQLException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+
+public class Schema_148 extends SchemaVersion {
+  private static final String COMMIT_MSG = "Make account IDs of external IDs human-readable";
+
+  private final GitRepositoryManager repoManager;
+  private final AllUsersName allUsersName;
+  private final PersonIdent serverUser;
+
+  @Inject
+  Schema_148(
+      Provider<Schema_147> prior,
+      GitRepositoryManager repoManager,
+      AllUsersName allUsersName,
+      @GerritPersonIdent PersonIdent serverUser) {
+    super(prior);
+    this.repoManager = repoManager;
+    this.allUsersName = allUsersName;
+    this.serverUser = serverUser;
+  }
+
+  @Override
+  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {
+    try (Repository repo = repoManager.openRepository(allUsersName)) {
+      ExternalIdNotes extIdNotes = ExternalIdNotes.loadNoCacheUpdate(allUsersName, repo);
+      for (ExternalId extId : extIdNotes.all()) {
+        if (needsUpdate(extId)) {
+          extIdNotes.upsert(extId);
+        }
+      }
+
+      try (MetaDataUpdate metaDataUpdate =
+          new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, repo)) {
+        metaDataUpdate.getCommitBuilder().setAuthor(serverUser);
+        metaDataUpdate.getCommitBuilder().setCommitter(serverUser);
+        metaDataUpdate.getCommitBuilder().setMessage(COMMIT_MSG);
+        extIdNotes.commit(metaDataUpdate);
+      }
+    } catch (IOException | ConfigInvalidException e) {
+      throw new OrmException("Failed to update external IDs", e);
+    }
+  }
+
+  private static boolean needsUpdate(ExternalId extId) {
+    Config cfg = new Config();
+    cfg.setInt("externalId", extId.key().get(), "accountId", extId.accountId().get());
+    return Ints.tryParse(cfg.getString("externalId", extId.key().get(), "accountId")) == null;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_149.java b/java/com/google/gerrit/server/schema/Schema_149.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_149.java
rename to java/com/google/gerrit/server/schema/Schema_149.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_150.java b/java/com/google/gerrit/server/schema/Schema_150.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_150.java
rename to java/com/google/gerrit/server/schema/Schema_150.java
diff --git a/java/com/google/gerrit/server/schema/Schema_151.java b/java/com/google/gerrit/server/schema/Schema_151.java
new file mode 100644
index 0000000..41d8a32
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_151.java
@@ -0,0 +1,80 @@
+// Copyright (C) 2017 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.google.gerrit.server.schema;
+
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+/** A schema which adds the 'created on' field to groups. */
+public class Schema_151 extends SchemaVersion {
+  @Inject
+  protected Schema_151(Provider<Schema_150> prior) {
+    super(prior);
+  }
+
+  @Override
+  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {
+    try (PreparedStatement groupUpdate =
+            prepareStatement(db, "UPDATE account_groups SET created_on = ? WHERE group_id = ?");
+        PreparedStatement addedOnRetrieval =
+            prepareStatement(
+                db,
+                "SELECT added_on FROM account_group_members_audit WHERE group_id = ?"
+                    + " ORDER BY added_on ASC")) {
+      List<AccountGroup.Id> accountGroups = getAllGroupIds(db);
+      for (AccountGroup.Id groupId : accountGroups) {
+        Optional<Timestamp> firstTimeMentioned = getFirstTimeMentioned(addedOnRetrieval, groupId);
+        Timestamp createdOn = firstTimeMentioned.orElseGet(AccountGroup::auditCreationInstantTs);
+
+        groupUpdate.setTimestamp(1, createdOn);
+        groupUpdate.setInt(2, groupId.get());
+        groupUpdate.executeUpdate();
+      }
+    }
+  }
+
+  private static Optional<Timestamp> getFirstTimeMentioned(
+      PreparedStatement addedOnRetrieval, AccountGroup.Id groupId) throws SQLException {
+    addedOnRetrieval.setInt(1, groupId.get());
+    try (ResultSet resultSet = addedOnRetrieval.executeQuery()) {
+      if (resultSet.next()) {
+        return Optional.of(resultSet.getTimestamp(1));
+      }
+    }
+    return Optional.empty();
+  }
+
+  private static List<AccountGroup.Id> getAllGroupIds(ReviewDb db) throws SQLException {
+    try (Statement stmt = newStatement(db);
+        ResultSet rs = stmt.executeQuery("SELECT group_id FROM account_groups")) {
+      List<AccountGroup.Id> groupIds = new ArrayList<>();
+      while (rs.next()) {
+        groupIds.add(new AccountGroup.Id(rs.getInt(1)));
+      }
+      return groupIds;
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_152.java b/java/com/google/gerrit/server/schema/Schema_152.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_152.java
rename to java/com/google/gerrit/server/schema/Schema_152.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_153.java b/java/com/google/gerrit/server/schema/Schema_153.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_153.java
rename to java/com/google/gerrit/server/schema/Schema_153.java
diff --git a/java/com/google/gerrit/server/schema/Schema_154.java b/java/com/google/gerrit/server/schema/Schema_154.java
new file mode 100644
index 0000000..11fa89e
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_154.java
@@ -0,0 +1,150 @@
+// Copyright (C) 2017 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.google.gerrit.server.schema;
+
+import static java.util.stream.Collectors.toMap;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.account.AccountConfig;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gwtorm.jdbc.JdbcSchema;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.ProgressMonitor;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.lib.TextProgressMonitor;
+
+/** Migrate accounts to NoteDb. */
+public class Schema_154 extends SchemaVersion {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final String TABLE = "accounts";
+  private static final ImmutableMap<String, AccountSetter> ACCOUNT_FIELDS_MAP =
+      ImmutableMap.<String, AccountSetter>builder()
+          .put("full_name", (a, rs, field) -> a.setFullName(rs.getString(field)))
+          .put("preferred_email", (a, rs, field) -> a.setPreferredEmail(rs.getString(field)))
+          .put("status", (a, rs, field) -> a.setStatus(rs.getString(field)))
+          .put("inactive", (a, rs, field) -> a.setActive(rs.getString(field).equals("N")))
+          .build();
+
+  private final GitRepositoryManager repoManager;
+  private final AllUsersName allUsersName;
+  private final Provider<PersonIdent> serverIdent;
+
+  @Inject
+  Schema_154(
+      Provider<Schema_153> prior,
+      GitRepositoryManager repoManager,
+      AllUsersName allUsersName,
+      @GerritPersonIdent Provider<PersonIdent> serverIdent) {
+    super(prior);
+    this.repoManager = repoManager;
+    this.allUsersName = allUsersName;
+    this.serverIdent = serverIdent;
+  }
+
+  @Override
+  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {
+    try {
+      try (Repository repo = repoManager.openRepository(allUsersName)) {
+        ProgressMonitor pm = new TextProgressMonitor();
+        pm.beginTask("Collecting accounts", ProgressMonitor.UNKNOWN);
+        Set<Account> accounts = scanAccounts(db, pm);
+        pm.endTask();
+        pm.beginTask("Migrating accounts to NoteDb", accounts.size());
+        for (Account account : accounts) {
+          updateAccountInNoteDb(repo, account);
+          pm.update(1);
+        }
+        pm.endTask();
+      }
+    } catch (IOException | ConfigInvalidException e) {
+      throw new OrmException("Migrating accounts to NoteDb failed", e);
+    }
+  }
+
+  private Set<Account> scanAccounts(ReviewDb db, ProgressMonitor pm) throws SQLException {
+    Map<String, AccountSetter> fields = getFields(db);
+    if (fields.isEmpty()) {
+      logger.atWarning().log("Only account_id and registered_on fields are migrated for accounts");
+    }
+
+    List<String> queryFields = new ArrayList<>();
+    queryFields.add("account_id");
+    queryFields.add("registered_on");
+    queryFields.addAll(fields.keySet());
+    String query = "SELECT " + String.join(", ", queryFields) + String.format(" FROM %s", TABLE);
+    try (Statement stmt = newStatement(db);
+        ResultSet rs = stmt.executeQuery(query)) {
+      Set<Account> s = new HashSet<>();
+      while (rs.next()) {
+        Account a = new Account(new Account.Id(rs.getInt(1)), rs.getTimestamp(2));
+        for (Map.Entry<String, AccountSetter> field : fields.entrySet()) {
+          field.getValue().set(a, rs, field.getKey());
+        }
+        s.add(a);
+        pm.update(1);
+      }
+      return s;
+    }
+  }
+
+  private Map<String, AccountSetter> getFields(ReviewDb db) throws SQLException {
+    JdbcSchema schema = (JdbcSchema) db;
+    Connection connection = schema.getConnection();
+    Set<String> columns = schema.getDialect().listColumns(connection, TABLE);
+    return ACCOUNT_FIELDS_MAP.entrySet().stream()
+        .filter(e -> columns.contains(e.getKey()))
+        .collect(toMap(Map.Entry::getKey, Map.Entry::getValue));
+  }
+
+  private void updateAccountInNoteDb(Repository allUsersRepo, Account account)
+      throws IOException, ConfigInvalidException {
+    MetaDataUpdate md =
+        new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, allUsersRepo);
+    PersonIdent ident = serverIdent.get();
+    md.getCommitBuilder().setAuthor(ident);
+    md.getCommitBuilder().setCommitter(ident);
+    new AccountConfig(account.getId(), allUsersName, allUsersRepo)
+        .load()
+        .setAccount(account)
+        .commit(md);
+  }
+
+  @FunctionalInterface
+  private interface AccountSetter {
+    void set(Account a, ResultSet rs, String field) throws SQLException;
+  }
+}
diff --git a/java/com/google/gerrit/server/schema/Schema_155.java b/java/com/google/gerrit/server/schema/Schema_155.java
new file mode 100644
index 0000000..ec16e06
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_155.java
@@ -0,0 +1,57 @@
+// Copyright (C) 2017 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.google.gerrit.server.schema;
+
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.Sequences;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.notedb.RepoSequence;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.sql.SQLException;
+
+/** Create account sequence in NoteDb */
+public class Schema_155 extends SchemaVersion {
+  private final GitRepositoryManager repoManager;
+  private final AllUsersName allUsersName;
+
+  @Inject
+  Schema_155(
+      Provider<Schema_154> prior, GitRepositoryManager repoManager, AllUsersName allUsersName) {
+    super(prior);
+    this.repoManager = repoManager;
+    this.allUsersName = allUsersName;
+  }
+
+  @Override
+  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {
+    @SuppressWarnings("deprecation")
+    RepoSequence.Seed accountSeed = db::nextAccountId;
+    RepoSequence accountSeq =
+        new RepoSequence(
+            repoManager,
+            GitReferenceUpdated.DISABLED,
+            allUsersName,
+            Sequences.NAME_ACCOUNTS,
+            accountSeed,
+            1);
+
+    // consume one account ID to ensure that the account sequence is initialized in NoteDb
+    accountSeq.next();
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_156.java b/java/com/google/gerrit/server/schema/Schema_156.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_156.java
rename to java/com/google/gerrit/server/schema/Schema_156.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_157.java b/java/com/google/gerrit/server/schema/Schema_157.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_157.java
rename to java/com/google/gerrit/server/schema/Schema_157.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_158.java b/java/com/google/gerrit/server/schema/Schema_158.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_158.java
rename to java/com/google/gerrit/server/schema/Schema_158.java
diff --git a/java/com/google/gerrit/server/schema/Schema_159.java b/java/com/google/gerrit/server/schema/Schema_159.java
new file mode 100644
index 0000000..d6e37d7
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_159.java
@@ -0,0 +1,67 @@
+// Copyright (C) 2017 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.google.gerrit.server.schema;
+
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.StatementExecutor;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+
+/** Migrate draft changes to private or wip changes. */
+public class Schema_159 extends SchemaVersion {
+
+  private enum DraftWorkflowMigrationStrategy {
+    PRIVATE,
+    WORK_IN_PROGRESS
+  }
+
+  @Inject
+  Schema_159(Provider<Schema_158> prior) {
+    super(prior);
+  }
+
+  @Override
+  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException {
+    DraftWorkflowMigrationStrategy strategy = DraftWorkflowMigrationStrategy.WORK_IN_PROGRESS;
+    if (ui.yesno(false, "Migrate draft changes to private changes (default is work-in-progress)")) {
+      strategy = DraftWorkflowMigrationStrategy.PRIVATE;
+    }
+    ui.message(
+        String.format("Replace draft changes with %s changes ...", strategy.name().toLowerCase()));
+    try (StatementExecutor e = newExecutor(db)) {
+      String column =
+          strategy == DraftWorkflowMigrationStrategy.PRIVATE ? "is_private" : "work_in_progress";
+      // Mark changes private/WIP and NEW if either:
+      // * they have status DRAFT
+      // * they have status NEW and have any draft patch sets
+      e.execute(
+          String.format(
+              "UPDATE changes "
+                  + "SET %s = 'Y', "
+                  + "    status = 'n', "
+                  + "    created_on = created_on "
+                  + "WHERE status = 'd' "
+                  + "  OR (status = 'n' "
+                  + "      AND EXISTS "
+                  + "        (SELECT * "
+                  + "         FROM patch_sets "
+                  + "         WHERE patch_sets.change_id = changes.change_id "
+                  + "           AND patch_sets.draft = 'Y')) ",
+              column));
+    }
+    ui.message("done");
+  }
+}
diff --git a/java/com/google/gerrit/server/schema/Schema_160.java b/java/com/google/gerrit/server/schema/Schema_160.java
new file mode 100644
index 0000000..eb8b70f
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_160.java
@@ -0,0 +1,152 @@
+// Copyright (C) 2017 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.google.gerrit.server.schema;
+
+import static com.google.gerrit.server.git.UserConfigSections.KEY_URL;
+import static com.google.gerrit.server.git.UserConfigSections.MY;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.account.Accounts;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.ProgressMonitor;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.lib.TextProgressMonitor;
+
+/**
+ * Remove "My Drafts" menu items for all users and server-wide default preferences.
+ *
+ * <p>Since draft changes no longer exist, these menu items are obsolete.
+ *
+ * <p>Only matches menu items (with any name) where the URL exactly matches one of the following,
+ * with or without leading {@code #}:
+ *
+ * <ul>
+ *   <li>/q/is:draft
+ *   <li>/q/owner:self+is:draft
+ * </ul>
+ *
+ * In particular, this includes the <a
+ * href="https://gerrit.googlesource.com/gerrit/+/v2.14.4/gerrit-server/src/main/java/com/google/gerrit/server/account/GeneralPreferencesLoader.java#144">default
+ * from version 2.14 and earlier</a>.
+ *
+ * <p>Other menus containing {@code is:draft} in other positions are not affected; this is still a
+ * valid predicate that matches no changes.
+ */
+public class Schema_160 extends SchemaVersion {
+  @VisibleForTesting static final ImmutableList<String> DEFAULT_DRAFT_ITEMS;
+
+  static {
+    String ownerSelfIsDraft = "/q/owner:self+is:draft";
+    String isDraft = "/q/is:draft";
+    DEFAULT_DRAFT_ITEMS =
+        ImmutableList.of(ownerSelfIsDraft, '#' + ownerSelfIsDraft, isDraft, '#' + isDraft);
+  }
+
+  private final GitRepositoryManager repoManager;
+  private final AllUsersName allUsersName;
+  private final Provider<PersonIdent> serverIdent;
+
+  @Inject
+  Schema_160(
+      Provider<Schema_159> prior,
+      GitRepositoryManager repoManager,
+      AllUsersName allUsersName,
+      @GerritPersonIdent Provider<PersonIdent> serverIdent) {
+    super(prior);
+    this.repoManager = repoManager;
+    this.allUsersName = allUsersName;
+    this.serverIdent = serverIdent;
+  }
+
+  @Override
+  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException {
+    try {
+      try (Repository repo = repoManager.openRepository(allUsersName)) {
+        ProgressMonitor pm = new TextProgressMonitor();
+        pm.beginTask("Removing \"My Drafts\" menu items", ProgressMonitor.UNKNOWN);
+        for (Account.Id id : (Iterable<Account.Id>) Accounts.readUserRefs(repo)::iterator) {
+          removeMyDrafts(repo, RefNames.refsUsers(id), pm);
+        }
+        removeMyDrafts(repo, RefNames.REFS_USERS_DEFAULT, pm);
+        pm.endTask();
+      }
+    } catch (IOException | ConfigInvalidException e) {
+      throw new OrmException("Removing \"My Drafts\" menu items failed", e);
+    }
+  }
+
+  private void removeMyDrafts(Repository repo, String ref, ProgressMonitor pm)
+      throws IOException, ConfigInvalidException {
+    MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, repo);
+    PersonIdent ident = serverIdent.get();
+    md.getCommitBuilder().setAuthor(ident);
+    md.getCommitBuilder().setCommitter(ident);
+    Prefs prefs = new Prefs(ref);
+    prefs.load(allUsersName, repo);
+    prefs.removeMyDrafts();
+    prefs.commit(md);
+    if (prefs.dirty()) {
+      pm.update(1);
+    }
+  }
+
+  private static class Prefs extends VersionedAccountPreferences {
+    private boolean dirty;
+
+    Prefs(String ref) {
+      super(ref);
+    }
+
+    @Override
+    protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException {
+      if (!dirty) {
+        return false;
+      }
+      commit.setMessage("Remove \"My Drafts\" menu items");
+      return super.onSave(commit);
+    }
+
+    void removeMyDrafts() {
+      Config cfg = getConfig();
+      for (String item : cfg.getSubsections(MY)) {
+        String value = cfg.getString(MY, item, KEY_URL);
+        if (DEFAULT_DRAFT_ITEMS.contains(value)) {
+          cfg.unsetSection(MY, item);
+          dirty = true;
+        }
+      }
+    }
+
+    boolean dirty() {
+      return dirty;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/schema/Schema_161.java b/java/com/google/gerrit/server/schema/Schema_161.java
new file mode 100644
index 0000000..70010f8
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_161.java
@@ -0,0 +1,112 @@
+// Copyright (C) 2017 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.google.gerrit.server.schema;
+
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.primitives.Ints;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.StarredChangesUtil;
+import com.google.gerrit.server.StarredChangesUtil.IllegalLabelException;
+import com.google.gerrit.server.StarredChangesUtil.StarRef;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.lib.TextProgressMonitor;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.ReceiveCommand;
+
+public class Schema_161 extends SchemaVersion {
+  private static final String MUTE_LABEL = "mute";
+
+  private final GitRepositoryManager repoManager;
+  private final AllUsersName allUsersName;
+
+  @Inject
+  Schema_161(
+      Provider<Schema_160> prior, GitRepositoryManager repoManager, AllUsersName allUsersName) {
+    super(prior);
+    this.repoManager = repoManager;
+    this.allUsersName = allUsersName;
+  }
+
+  @Override
+  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException {
+    try (Repository git = repoManager.openRepository(allUsersName);
+        RevWalk rw = new RevWalk(git)) {
+      BatchRefUpdate bru = git.getRefDatabase().newBatchUpdate();
+      bru.setAllowNonFastForwards(true);
+
+      for (Ref ref : git.getRefDatabase().getRefsByPrefix(RefNames.REFS_STARRED_CHANGES)) {
+        StarRef starRef = StarredChangesUtil.readLabels(git, ref.getName());
+
+        Set<Integer> mutedPatchSets =
+            StarredChangesUtil.getStarredPatchSets(starRef.labels(), MUTE_LABEL);
+        if (mutedPatchSets.isEmpty()) {
+          continue;
+        }
+
+        Set<Integer> reviewedPatchSets =
+            StarredChangesUtil.getStarredPatchSets(
+                starRef.labels(), StarredChangesUtil.REVIEWED_LABEL);
+        Set<Integer> unreviewedPatchSets =
+            StarredChangesUtil.getStarredPatchSets(
+                starRef.labels(), StarredChangesUtil.UNREVIEWED_LABEL);
+
+        List<String> newLabels =
+            starRef.labels().stream()
+                .map(
+                    l -> {
+                      if (l.startsWith(MUTE_LABEL)) {
+                        Integer mutedPatchSet = Ints.tryParse(l.substring(MUTE_LABEL.length() + 1));
+                        if (mutedPatchSet == null) {
+                          // unexpected format of mute label, must be a label that was manually
+                          // set, just leave it alone
+                          return l;
+                        }
+                        if (!reviewedPatchSets.contains(mutedPatchSet)
+                            && !unreviewedPatchSets.contains(mutedPatchSet)) {
+                          // convert mute label to reviewed label
+                          return StarredChangesUtil.REVIEWED_LABEL + "/" + mutedPatchSet;
+                        }
+                        // else patch set is muted but has either reviewed or unreviewed label
+                        // -> just drop the mute label
+                        return null;
+                      }
+                      return l;
+                    })
+                .filter(Objects::nonNull)
+                .collect(toList());
+
+        ObjectId id = StarredChangesUtil.writeLabels(git, newLabels);
+        bru.addCommand(new ReceiveCommand(ref.getTarget().getObjectId(), id, ref.getName()));
+      }
+      bru.execute(rw, new TextProgressMonitor());
+    } catch (IOException | IllegalLabelException ex) {
+      throw new OrmException(ex);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/schema/Schema_162.java b/java/com/google/gerrit/server/schema/Schema_162.java
new file mode 100644
index 0000000..7406bc6
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_162.java
@@ -0,0 +1,71 @@
+// Copyright (C) 2017 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.google.gerrit.server.schema;
+
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+
+public class Schema_162 extends SchemaVersion {
+  private final GitRepositoryManager repoManager;
+  private final AllProjectsName allProjectsName;
+  private final AllUsersName allUsersName;
+  private final PersonIdent serverUser;
+
+  @Inject
+  Schema_162(
+      Provider<Schema_161> prior,
+      GitRepositoryManager repoManager,
+      AllProjectsName allProjectsName,
+      AllUsersName allUsersName,
+      @GerritPersonIdent PersonIdent serverUser) {
+    super(prior);
+    this.repoManager = repoManager;
+    this.allProjectsName = allProjectsName;
+    this.allUsersName = allUsersName;
+    this.serverUser = serverUser;
+  }
+
+  @Override
+  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException {
+    try (Repository git = repoManager.openRepository(allUsersName);
+        MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, git)) {
+      ProjectConfig cfg = ProjectConfig.read(md);
+      if (allProjectsName.equals(cfg.getProject().getParent(allProjectsName))) {
+        return;
+      }
+      cfg.getProject().setParentName(allProjectsName);
+      md.getCommitBuilder().setAuthor(serverUser);
+      md.getCommitBuilder().setCommitter(serverUser);
+      md.setMessage(
+          String.format("Make %s inherit from %s", allUsersName.get(), allProjectsName.get()));
+      cfg.commit(md);
+    } catch (ConfigInvalidException | IOException ex) {
+      throw new OrmException(ex);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/schema/Schema_163.java b/java/com/google/gerrit/server/schema/Schema_163.java
new file mode 100644
index 0000000..ae05774
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_163.java
@@ -0,0 +1,57 @@
+// Copyright (C) 2017 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.google.gerrit.server.schema;
+
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.Sequences;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.notedb.RepoSequence;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.sql.SQLException;
+
+/** Create group sequence in NoteDb */
+public class Schema_163 extends SchemaVersion {
+  private final GitRepositoryManager repoManager;
+  private final AllUsersName allUsersName;
+
+  @Inject
+  Schema_163(
+      Provider<Schema_162> prior, GitRepositoryManager repoManager, AllUsersName allUsersName) {
+    super(prior);
+    this.repoManager = repoManager;
+    this.allUsersName = allUsersName;
+  }
+
+  @Override
+  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {
+    @SuppressWarnings("deprecation")
+    RepoSequence.Seed groupSeed = db::nextAccountGroupId;
+    RepoSequence groupSeq =
+        new RepoSequence(
+            repoManager,
+            GitReferenceUpdated.DISABLED,
+            allUsersName,
+            Sequences.NAME_GROUPS,
+            groupSeed,
+            1);
+
+    // consume one account ID to ensure that the group sequence is initialized in NoteDb
+    groupSeq.next();
+  }
+}
diff --git a/java/com/google/gerrit/server/schema/Schema_164.java b/java/com/google/gerrit/server/schema/Schema_164.java
new file mode 100644
index 0000000..8525478
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_164.java
@@ -0,0 +1,85 @@
+// Copyright (C) 2017 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.google.gerrit.server.schema;
+
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static com.google.gerrit.server.schema.AclUtil.grant;
+
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.sql.SQLException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+
+/** Grant read on group branches */
+public class Schema_164 extends SchemaVersion {
+  private static final String COMMIT_MSG = "Grant read permissions on group branches";
+
+  private final GitRepositoryManager repoManager;
+  private final AllUsersName allUsersName;
+  private final SystemGroupBackend systemGroupBackend;
+  private final PersonIdent serverUser;
+
+  @Inject
+  Schema_164(
+      Provider<Schema_163> prior,
+      GitRepositoryManager repoManager,
+      AllUsersName allUsersName,
+      SystemGroupBackend systemGroupBackend,
+      @GerritPersonIdent PersonIdent serverUser) {
+    super(prior);
+    this.repoManager = repoManager;
+    this.allUsersName = allUsersName;
+    this.systemGroupBackend = systemGroupBackend;
+    this.serverUser = serverUser;
+  }
+
+  @Override
+  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {
+    try (Repository git = repoManager.openRepository(allUsersName);
+        MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, git)) {
+      md.getCommitBuilder().setAuthor(serverUser);
+      md.getCommitBuilder().setCommitter(serverUser);
+      md.setMessage(COMMIT_MSG);
+
+      ProjectConfig config = ProjectConfig.read(md);
+      AccessSection groups = config.getAccessSection(RefNames.REFS_GROUPS + "*", true);
+      grant(
+          config,
+          groups,
+          Permission.READ,
+          false,
+          true,
+          systemGroupBackend.getGroup(REGISTERED_USERS));
+      config.commit(md);
+    } catch (IOException | ConfigInvalidException e) {
+      throw new OrmException("Failed to grant read permissions on group branches", e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/schema/Schema_165.java b/java/com/google/gerrit/server/schema/Schema_165.java
new file mode 100644
index 0000000..cd6da55
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_165.java
@@ -0,0 +1,142 @@
+// Copyright (C) 2017 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.google.gerrit.server.schema;
+
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.common.data.PermissionRule;
+import com.google.gerrit.common.data.PermissionRule.Action;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.server.project.RefPattern;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.sql.SQLException;
+import java.util.Optional;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+
+/** Make default Label-Code-Review permission on user branches exclusive. */
+public class Schema_165 extends SchemaVersion {
+  private static final String COMMIT_MSG =
+      "Make default Label-Code-Review permission on user branches exclusive";
+
+  private final GitRepositoryManager repoManager;
+  private final AllUsersName allUsersName;
+  private final SystemGroupBackend systemGroupBackend;
+  private final PersonIdent serverUser;
+
+  @Inject
+  Schema_165(
+      Provider<Schema_164> prior,
+      GitRepositoryManager repoManager,
+      AllUsersName allUsersName,
+      SystemGroupBackend systemGroupBackend,
+      @GerritPersonIdent PersonIdent serverUser) {
+    super(prior);
+    this.repoManager = repoManager;
+    this.allUsersName = allUsersName;
+    this.systemGroupBackend = systemGroupBackend;
+    this.serverUser = serverUser;
+  }
+
+  @Override
+  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {
+    try (Repository git = repoManager.openRepository(allUsersName);
+        MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, git)) {
+      ProjectConfig config = ProjectConfig.read(md);
+      Optional<Permission> permission = findDefaultPermission(config);
+      if (!permission.isPresent()) {
+        // the default permission was not found, hence it cannot be fixed
+        return;
+      }
+
+      permission.get().setExclusiveGroup(true);
+
+      md.getCommitBuilder().setAuthor(serverUser);
+      md.getCommitBuilder().setCommitter(serverUser);
+      md.setMessage(COMMIT_MSG);
+      config.commit(md);
+    } catch (IOException | ConfigInvalidException e) {
+      throw new OrmException(
+          "Failed to make default Label-Code-Review permission on user branches exclusive", e);
+    }
+  }
+
+  /**
+   * Searches for the default "Label-Code-Review" permission on the user branch and returns it if it
+   * was found. If it was not found (e.g. because it was removed or modified) {@link
+   * Optional#empty()} is returned.
+   */
+  private Optional<Permission> findDefaultPermission(ProjectConfig config) {
+    AccessSection users =
+        config.getAccessSection(
+            RefNames.REFS_USERS + "${" + RefPattern.USERID_SHARDED + "}", false);
+    if (users == null) {
+      // default permission was removed
+      return Optional.empty();
+    }
+
+    Permission permission = users.getPermission(Permission.LABEL + "Code-Review", false);
+    return isDefaultPermissionUntouched(permission) ? Optional.of(permission) : Optional.empty();
+  }
+
+  /**
+   * Checks whether the given permission matches the default "Label-Code-Review" permission on the
+   * user branch that was initially setup by {@link AllUsersCreator}.
+   */
+  private boolean isDefaultPermissionUntouched(Permission permission) {
+    if (permission == null) {
+      // default permission was removed
+      return false;
+    } else if (permission.getExclusiveGroup()) {
+      // default permission was modified
+      return false;
+    }
+
+    if (permission.getRules().size() != 1) {
+      // default permission was modified
+      return false;
+    }
+
+    PermissionRule rule = permission.getRule(systemGroupBackend.getGroup(REGISTERED_USERS));
+    if (rule == null) {
+      // default permission was removed
+      return false;
+    }
+
+    if (rule.getAction() != Action.ALLOW
+        || rule.getForce()
+        || rule.getMin() != -2
+        || rule.getMax() != 2) {
+      // default permission was modified
+      return false;
+    }
+
+    return true;
+  }
+}
diff --git a/java/com/google/gerrit/server/schema/Schema_166.java b/java/com/google/gerrit/server/schema/Schema_166.java
new file mode 100644
index 0000000..aa6f4e6
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_166.java
@@ -0,0 +1,52 @@
+// 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.
+
+package com.google.gerrit.server.schema;
+
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.sql.SQLException;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.Repository;
+
+/** Set HEAD for All-Users to refs/meta/config. */
+public class Schema_166 extends SchemaVersion {
+  private final GitRepositoryManager repoManager;
+  private final AllUsersName allUsersName;
+
+  @Inject
+  Schema_166(
+      Provider<Schema_165> prior, GitRepositoryManager repoManager, AllUsersName allUsersName) {
+    super(prior);
+    this.repoManager = repoManager;
+    this.allUsersName = allUsersName;
+  }
+
+  @Override
+  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {
+    try (Repository git = repoManager.openRepository(allUsersName)) {
+      RefUpdate u = git.updateRef(Constants.HEAD);
+      u.link(RefNames.REFS_CONFIG);
+    } catch (IOException e) {
+      throw new OrmException(String.format("Failed to update HEAD for %s", allUsersName.get()), e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/schema/Schema_167.java b/java/com/google/gerrit/server/schema/Schema_167.java
new file mode 100644
index 0000000..a5066cc
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_167.java
@@ -0,0 +1,288 @@
+// 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.
+
+package com.google.gerrit.server.schema;
+
+import static com.google.gerrit.server.notedb.NoteDbTable.GROUPS;
+import static com.google.gerrit.server.notedb.NotesMigration.DISABLE_REVIEW_DB;
+import static com.google.gerrit.server.notedb.NotesMigration.SECTION_NOTE_DB;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.reviewdb.server.ReviewDbWrapper;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.account.AccountConfig;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.GerritServerIdProvider;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gerrit.server.group.db.AuditLogFormatter;
+import com.google.gerrit.server.group.db.GroupNameNotes;
+import com.google.gerrit.server.update.RefUpdateUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+
+/** Migrate groups from ReviewDb to NoteDb. */
+public class Schema_167 extends SchemaVersion {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final GitRepositoryManager repoManager;
+  private final AllUsersName allUsersName;
+  private final Config gerritConfig;
+  private final SitePaths sitePaths;
+  private final PersonIdent serverIdent;
+  private final SystemGroupBackend systemGroupBackend;
+
+  @Inject
+  protected Schema_167(
+      Provider<Schema_166> prior,
+      GitRepositoryManager repoManager,
+      AllUsersName allUsersName,
+      @GerritServerConfig Config gerritConfig,
+      SitePaths sitePaths,
+      @GerritPersonIdent PersonIdent serverIdent,
+      SystemGroupBackend systemGroupBackend) {
+    super(prior);
+    this.repoManager = repoManager;
+    this.allUsersName = allUsersName;
+    this.gerritConfig = gerritConfig;
+    this.sitePaths = sitePaths;
+    this.serverIdent = serverIdent;
+    this.systemGroupBackend = systemGroupBackend;
+  }
+
+  @Override
+  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {
+    if (gerritConfig.getBoolean(SECTION_NOTE_DB, GROUPS.key(), DISABLE_REVIEW_DB, false)) {
+      // Groups in ReviewDb have already been disabled, nothing to do.
+      return;
+    }
+
+    try (Repository allUsersRepo = repoManager.openRepository(allUsersName)) {
+      List<GroupReference> allGroupReferences = readGroupReferencesFromReviewDb(db);
+
+      BatchRefUpdate batchRefUpdate = allUsersRepo.getRefDatabase().newBatchUpdate();
+      writeAllGroupNamesToNoteDb(allUsersRepo, allGroupReferences, batchRefUpdate);
+
+      GroupRebuilder groupRebuilder = createGroupRebuilder(db, allUsersRepo);
+      for (GroupReference groupReference : allGroupReferences) {
+        migrateOneGroupToNoteDb(
+            db, allUsersRepo, groupRebuilder, groupReference.getUUID(), batchRefUpdate);
+      }
+
+      RefUpdateUtil.executeChecked(batchRefUpdate, allUsersRepo);
+    } catch (IOException | ConfigInvalidException e) {
+      throw new OrmException(
+          String.format("Failed to migrate groups to NoteDb for %s", allUsersName.get()), e);
+    }
+  }
+
+  private List<GroupReference> readGroupReferencesFromReviewDb(ReviewDb db) throws SQLException {
+    try (Statement stmt = ReviewDbWrapper.unwrapJbdcSchema(db).getConnection().createStatement();
+        ResultSet rs = stmt.executeQuery("SELECT group_uuid, name FROM account_groups")) {
+      List<GroupReference> allGroupReferences = new ArrayList<>();
+      while (rs.next()) {
+        AccountGroup.UUID groupUuid = new AccountGroup.UUID(rs.getString(1));
+        String groupName = rs.getString(2);
+        allGroupReferences.add(new GroupReference(groupUuid, groupName));
+      }
+      return allGroupReferences;
+    }
+  }
+
+  private void writeAllGroupNamesToNoteDb(
+      Repository allUsersRepo,
+      List<GroupReference> allGroupReferences,
+      BatchRefUpdate batchRefUpdate)
+      throws IOException {
+    try (ObjectInserter inserter = allUsersRepo.newObjectInserter()) {
+      GroupNameNotes.updateAllGroups(
+          allUsersRepo, inserter, batchRefUpdate, allGroupReferences, serverIdent);
+      inserter.flush();
+    }
+  }
+
+  private GroupRebuilder createGroupRebuilder(ReviewDb db, Repository allUsersRepo)
+      throws IOException, ConfigInvalidException {
+    AuditLogFormatter auditLogFormatter =
+        createAuditLogFormatter(db, allUsersRepo, gerritConfig, sitePaths);
+    return new GroupRebuilder(serverIdent, allUsersName, auditLogFormatter);
+  }
+
+  private AuditLogFormatter createAuditLogFormatter(
+      ReviewDb db, Repository allUsersRepo, Config gerritConfig, SitePaths sitePaths)
+      throws IOException, ConfigInvalidException {
+    String serverId = new GerritServerIdProvider(gerritConfig, sitePaths).get();
+    SimpleInMemoryAccountCache accountCache =
+        new SimpleInMemoryAccountCache(allUsersName, allUsersRepo);
+    SimpleInMemoryGroupCache groupCache = new SimpleInMemoryGroupCache(db);
+    return AuditLogFormatter.create(
+        accountCache::get,
+        uuid -> {
+          if (systemGroupBackend.handles(uuid)) {
+            return Optional.ofNullable(systemGroupBackend.get(uuid));
+          }
+          return groupCache.get(uuid);
+        },
+        serverId);
+  }
+
+  private static void migrateOneGroupToNoteDb(
+      ReviewDb db,
+      Repository allUsersRepo,
+      GroupRebuilder rebuilder,
+      AccountGroup.UUID uuid,
+      BatchRefUpdate batchRefUpdate)
+      throws ConfigInvalidException, IOException, OrmException {
+    GroupBundle reviewDbBundle = GroupBundle.Factory.fromReviewDb(db, uuid);
+    RefUpdateUtil.deleteChecked(allUsersRepo, RefNames.refsGroups(uuid));
+    rebuilder.rebuild(allUsersRepo, reviewDbBundle, batchRefUpdate);
+  }
+
+  // The regular account cache isn't available during init. -> Use a simple replacement which tries
+  // to load every account only once from disk.
+  private static class SimpleInMemoryAccountCache {
+    private final AllUsersName allUsersName;
+    private final Repository allUsersRepo;
+    private Map<Account.Id, Optional<Account>> accounts = new HashMap<>();
+
+    public SimpleInMemoryAccountCache(AllUsersName allUsersName, Repository allUsersRepo) {
+      this.allUsersName = allUsersName;
+      this.allUsersRepo = allUsersRepo;
+    }
+
+    public Optional<Account> get(Account.Id accountId) {
+      accounts.computeIfAbsent(accountId, this::load);
+      return accounts.get(accountId);
+    }
+
+    private Optional<Account> load(Account.Id accountId) {
+      try {
+        AccountConfig accountConfig =
+            new AccountConfig(accountId, allUsersName, allUsersRepo).load();
+        return accountConfig.getLoadedAccount();
+      } catch (IOException | ConfigInvalidException ignored) {
+        logger.atWarning().withCause(ignored).log(
+            "Failed to load account %s."
+                + " Cannot get account name for group audit log commit messages.",
+            accountId.get());
+        return Optional.empty();
+      }
+    }
+  }
+
+  // The regular GroupBackends (especially external GroupBackends) and our internal group cache
+  // aren't available during init. -> Use a simple replacement which tries to look up only internal
+  // groups and which loads every internal group only once from disc. (There's no way we can look up
+  // external groups during init. As we need those groups only for cosmetic aspects in
+  // AuditLogFormatter, it's safe to exclude them.)
+  private static class SimpleInMemoryGroupCache {
+    private final ReviewDb db;
+    private Map<AccountGroup.UUID, Optional<GroupDescription.Basic>> groups = new HashMap<>();
+
+    public SimpleInMemoryGroupCache(ReviewDb db) {
+      this.db = db;
+    }
+
+    public Optional<GroupDescription.Basic> get(AccountGroup.UUID groupUuid) {
+      groups.computeIfAbsent(groupUuid, this::load);
+      return groups.get(groupUuid);
+    }
+
+    private Optional<GroupDescription.Basic> load(AccountGroup.UUID groupUuid) {
+      if (!AccountGroup.isInternalGroup(groupUuid)) {
+        return Optional.empty();
+      }
+
+      List<GroupDescription.Basic> groupDescriptions = getGroupDescriptions(groupUuid);
+      if (groupDescriptions.size() == 1) {
+        return Optional.of(Iterables.getOnlyElement(groupDescriptions));
+      }
+      return Optional.empty();
+    }
+
+    private List<GroupDescription.Basic> getGroupDescriptions(AccountGroup.UUID groupUuid) {
+      try (Statement stmt = ReviewDbWrapper.unwrapJbdcSchema(db).getConnection().createStatement();
+          ResultSet rs =
+              stmt.executeQuery(
+                  "SELECT name FROM account_groups where group_uuid = '" + groupUuid + "'")) {
+        List<GroupDescription.Basic> groupDescriptions = new ArrayList<>();
+        while (rs.next()) {
+          String groupName = rs.getString(1);
+          groupDescriptions.add(toGroupDescription(groupUuid, groupName));
+        }
+        return groupDescriptions;
+      } catch (SQLException ignored) {
+        logger.atWarning().withCause(ignored).log(
+            "Failed to load group %s."
+                + " Cannot get group name for group audit log commit messages.",
+            groupUuid.get());
+        return ImmutableList.of();
+      }
+    }
+
+    private static GroupDescription.Basic toGroupDescription(
+        AccountGroup.UUID groupUuid, String groupName) {
+      return new GroupDescription.Basic() {
+        @Override
+        public AccountGroup.UUID getGroupUUID() {
+          return groupUuid;
+        }
+
+        @Override
+        public String getName() {
+          return groupName;
+        }
+
+        @Nullable
+        @Override
+        public String getEmailAddress() {
+          return null;
+        }
+
+        @Nullable
+        @Override
+        public String getUrl() {
+          return null;
+        }
+      };
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/schema/Schema_168.java b/java/com/google/gerrit/server/schema/Schema_168.java
new file mode 100644
index 0000000..3ea8468
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_168.java
@@ -0,0 +1,26 @@
+// 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.
+
+package com.google.gerrit.server.schema;
+
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+
+/** Drop group tables. */
+public class Schema_168 extends SchemaVersion {
+  @Inject
+  Schema_168(Provider<Schema_167> prior) {
+    super(prior);
+  }
+}
diff --git a/java/com/google/gerrit/server/schema/Schema_169.java b/java/com/google/gerrit/server/schema/Schema_169.java
new file mode 100644
index 0000000..2779d47
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_169.java
@@ -0,0 +1,92 @@
+// Copyright (C) 2017 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.google.gerrit.server.schema;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.notedb.CommentJsonMigrator;
+import com.google.gerrit.server.notedb.CommentJsonMigrator.ProjectMigrationResult;
+import com.google.gerrit.server.notedb.MutableNotesMigration;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.SortedSet;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ProgressMonitor;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.lib.TextProgressMonitor;
+
+/** Migrate NoteDb inline comments to JSON format. */
+public class Schema_169 extends SchemaVersion {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+  private final CommentJsonMigrator migrator;
+  private final GitRepositoryManager repoManager;
+  private final NotesMigration notesMigration;
+
+  @Inject
+  Schema_169(
+      Provider<Schema_168> prior,
+      CommentJsonMigrator migrator,
+      GitRepositoryManager repoManager,
+      @GerritServerConfig Config config) {
+    super(prior);
+    this.migrator = migrator;
+    this.repoManager = repoManager;
+    this.notesMigration = MutableNotesMigration.fromConfig(config);
+  }
+
+  @Override
+  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException {
+    migrateData(ui);
+  }
+
+  @VisibleForTesting
+  protected void migrateData(UpdateUI ui) throws OrmException {
+    //  If the migration hasn't started, no need to look for non-JSON
+    if (!notesMigration.commitChangeWrites()) {
+      return;
+    }
+
+    boolean ok = true;
+    ProgressMonitor pm = new TextProgressMonitor();
+    SortedSet<Project.NameKey> projects = repoManager.list();
+    pm.beginTask("Migrating projects", projects.size());
+    int skipped = 0;
+    for (Project.NameKey project : projects) {
+      try (Repository repo = repoManager.openRepository(project)) {
+        ProjectMigrationResult progress = migrator.migrateProject(project, repo, false);
+        skipped += progress.skipped;
+      } catch (IOException e) {
+        ok = false;
+        logger.atWarning().log("Error migrating project " + project, e);
+      }
+      pm.update(1);
+    }
+
+    pm.endTask();
+    ui.message(
+        "Skipped " + skipped + " project" + (skipped == 1 ? "" : "s") + " with no legacy comments");
+
+    if (!ok) {
+      throw new OrmException("Migration failed");
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/schema/Schema_170.java b/java/com/google/gerrit/server/schema/Schema_170.java
new file mode 100644
index 0000000..c87fa3e
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_170.java
@@ -0,0 +1,25 @@
+// 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.
+
+package com.google.gerrit.server.schema;
+
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+
+public class Schema_170 extends SchemaVersion {
+  @Inject
+  Schema_170(Provider<Schema_169> prior) {
+    super(prior);
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_83.java b/java/com/google/gerrit/server/schema/Schema_83.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_83.java
rename to java/com/google/gerrit/server/schema/Schema_83.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_84.java b/java/com/google/gerrit/server/schema/Schema_84.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_84.java
rename to java/com/google/gerrit/server/schema/Schema_84.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_85.java b/java/com/google/gerrit/server/schema/Schema_85.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_85.java
rename to java/com/google/gerrit/server/schema/Schema_85.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_86.java b/java/com/google/gerrit/server/schema/Schema_86.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_86.java
rename to java/com/google/gerrit/server/schema/Schema_86.java
diff --git a/java/com/google/gerrit/server/schema/Schema_87.java b/java/com/google/gerrit/server/schema/Schema_87.java
new file mode 100644
index 0000000..5865af0
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_87.java
@@ -0,0 +1,80 @@
+// Copyright (C) 2013 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.google.gerrit.server.schema;
+
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.HashSet;
+import java.util.Optional;
+import java.util.Set;
+
+public class Schema_87 extends SchemaVersion {
+  @Inject
+  Schema_87(Provider<Schema_86> prior) {
+    super(prior);
+  }
+
+  @Override
+  protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {
+    try (PreparedStatement uuidRetrieval =
+            prepareStatement(db, "SELECT group_uuid FROM account_groups WHERE group_id = ?");
+        PreparedStatement groupDeletion =
+            prepareStatement(db, "DELETE FROM account_groups WHERE group_id = ?");
+        PreparedStatement groupNameDeletion =
+            prepareStatement(db, "DELETE FROM account_group_names WHERE group_id = ?")) {
+      for (AccountGroup.Id id : scanSystemGroups(db)) {
+        Optional<AccountGroup.UUID> groupUuid = getUuid(uuidRetrieval, id);
+        if (groupUuid.filter(SystemGroupBackend::isSystemGroup).isPresent()) {
+          groupDeletion.setInt(1, id.get());
+          groupDeletion.executeUpdate();
+
+          groupNameDeletion.setInt(1, id.get());
+          groupNameDeletion.executeUpdate();
+        }
+      }
+    }
+  }
+
+  private static Optional<AccountGroup.UUID> getUuid(
+      PreparedStatement uuidRetrieval, AccountGroup.Id id) throws SQLException {
+    uuidRetrieval.setInt(1, id.get());
+    try (ResultSet uuidResults = uuidRetrieval.executeQuery()) {
+      if (uuidResults.next()) {
+        Optional.of(new AccountGroup.UUID(uuidResults.getString(1)));
+      }
+    }
+    return Optional.empty();
+  }
+
+  private static Set<AccountGroup.Id> scanSystemGroups(ReviewDb db) throws SQLException {
+    try (Statement stmt = newStatement(db);
+        ResultSet rs =
+            stmt.executeQuery("SELECT group_id FROM account_groups WHERE group_type = 'SYSTEM'")) {
+      Set<AccountGroup.Id> ids = new HashSet<>();
+      while (rs.next()) {
+        ids.add(new AccountGroup.Id(rs.getInt(1)));
+      }
+      return ids;
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_88.java b/java/com/google/gerrit/server/schema/Schema_88.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_88.java
rename to java/com/google/gerrit/server/schema/Schema_88.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_89.java b/java/com/google/gerrit/server/schema/Schema_89.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_89.java
rename to java/com/google/gerrit/server/schema/Schema_89.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_90.java b/java/com/google/gerrit/server/schema/Schema_90.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_90.java
rename to java/com/google/gerrit/server/schema/Schema_90.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_91.java b/java/com/google/gerrit/server/schema/Schema_91.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_91.java
rename to java/com/google/gerrit/server/schema/Schema_91.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_92.java b/java/com/google/gerrit/server/schema/Schema_92.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_92.java
rename to java/com/google/gerrit/server/schema/Schema_92.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_93.java b/java/com/google/gerrit/server/schema/Schema_93.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_93.java
rename to java/com/google/gerrit/server/schema/Schema_93.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_94.java b/java/com/google/gerrit/server/schema/Schema_94.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_94.java
rename to java/com/google/gerrit/server/schema/Schema_94.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_95.java b/java/com/google/gerrit/server/schema/Schema_95.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_95.java
rename to java/com/google/gerrit/server/schema/Schema_95.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_96.java b/java/com/google/gerrit/server/schema/Schema_96.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_96.java
rename to java/com/google/gerrit/server/schema/Schema_96.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_97.java b/java/com/google/gerrit/server/schema/Schema_97.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_97.java
rename to java/com/google/gerrit/server/schema/Schema_97.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_98.java b/java/com/google/gerrit/server/schema/Schema_98.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_98.java
rename to java/com/google/gerrit/server/schema/Schema_98.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_99.java b/java/com/google/gerrit/server/schema/Schema_99.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_99.java
rename to java/com/google/gerrit/server/schema/Schema_99.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/ScriptRunner.java b/java/com/google/gerrit/server/schema/ScriptRunner.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/ScriptRunner.java
rename to java/com/google/gerrit/server/schema/ScriptRunner.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/UpdateUI.java b/java/com/google/gerrit/server/schema/UpdateUI.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/schema/UpdateUI.java
rename to java/com/google/gerrit/server/schema/UpdateUI.java
diff --git a/java/com/google/gerrit/server/schema/VersionedAccountPreferences.java b/java/com/google/gerrit/server/schema/VersionedAccountPreferences.java
new file mode 100644
index 0000000..297fdcd
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/VersionedAccountPreferences.java
@@ -0,0 +1,67 @@
+// Copyright (C) 2014 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.google.gerrit.server.schema;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.git.meta.VersionedMetaData;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Config;
+
+/** Preferences for user accounts during schema migrations. */
+class VersionedAccountPreferences extends VersionedMetaData {
+  static final String PREFERENCES = "preferences.config";
+
+  static VersionedAccountPreferences forUser(Account.Id id) {
+    return new VersionedAccountPreferences(RefNames.refsUsers(id));
+  }
+
+  static VersionedAccountPreferences forDefault() {
+    return new VersionedAccountPreferences(RefNames.REFS_USERS_DEFAULT);
+  }
+
+  private final String ref;
+  private Config cfg;
+
+  protected VersionedAccountPreferences(String ref) {
+    this.ref = ref;
+  }
+
+  @Override
+  protected String getRefName() {
+    return ref;
+  }
+
+  Config getConfig() {
+    return cfg;
+  }
+
+  @Override
+  protected void onLoad() throws IOException, ConfigInvalidException {
+    cfg = readConfig(PREFERENCES);
+  }
+
+  @Override
+  protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException {
+    if (Strings.isNullOrEmpty(commit.getMessage())) {
+      commit.setMessage("Updated preferences\n");
+    }
+    saveConfig(PREFERENCES, cfg);
+    return true;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/securestore/DefaultSecureStore.java b/java/com/google/gerrit/server/securestore/DefaultSecureStore.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/securestore/DefaultSecureStore.java
rename to java/com/google/gerrit/server/securestore/DefaultSecureStore.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStore.java b/java/com/google/gerrit/server/securestore/SecureStore.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStore.java
rename to java/com/google/gerrit/server/securestore/SecureStore.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStoreClassName.java b/java/com/google/gerrit/server/securestore/SecureStoreClassName.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStoreClassName.java
rename to java/com/google/gerrit/server/securestore/SecureStoreClassName.java
diff --git a/java/com/google/gerrit/server/securestore/SecureStoreProvider.java b/java/com/google/gerrit/server/securestore/SecureStoreProvider.java
new file mode 100644
index 0000000..4e43b2e
--- /dev/null
+++ b/java/com/google/gerrit/server/securestore/SecureStoreProvider.java
@@ -0,0 +1,64 @@
+// Copyright (C) 2013 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.google.gerrit.server.securestore;
+
+import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.SiteLibraryLoaderUtil;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.nio.file.Path;
+
+@Singleton
+public class SecureStoreProvider implements Provider<SecureStore> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final Path libdir;
+  private final Injector injector;
+  private final String className;
+
+  @Inject
+  protected SecureStoreProvider(
+      Injector injector, SitePaths sitePaths, @Nullable @SecureStoreClassName String className) {
+    this.injector = injector;
+    this.libdir = sitePaths.lib_dir;
+    this.className = className;
+  }
+
+  @Override
+  public synchronized SecureStore get() {
+    return injector.getInstance(getSecureStoreImpl());
+  }
+
+  @SuppressWarnings("unchecked")
+  private Class<? extends SecureStore> getSecureStoreImpl() {
+    if (Strings.isNullOrEmpty(className)) {
+      return DefaultSecureStore.class;
+    }
+
+    SiteLibraryLoaderUtil.loadSiteLib(libdir);
+    try {
+      return (Class<? extends SecureStore>) Class.forName(className);
+    } catch (ClassNotFoundException e) {
+      String msg = String.format("Cannot load secure store class: %s", className);
+      logger.atSevere().withCause(e).log(msg);
+      throw new RuntimeException(msg, e);
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ssh/NoSshInfo.java b/java/com/google/gerrit/server/ssh/NoSshInfo.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/ssh/NoSshInfo.java
rename to java/com/google/gerrit/server/ssh/NoSshInfo.java
diff --git a/java/com/google/gerrit/server/ssh/NoSshKeyCache.java b/java/com/google/gerrit/server/ssh/NoSshKeyCache.java
new file mode 100644
index 0000000..387242c
--- /dev/null
+++ b/java/com/google/gerrit/server/ssh/NoSshKeyCache.java
@@ -0,0 +1,45 @@
+// Copyright (C) 2010 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.google.gerrit.server.ssh;
+
+import com.google.gerrit.common.errors.InvalidSshKeyException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.account.AccountSshKey;
+import com.google.inject.AbstractModule;
+import com.google.inject.Module;
+import com.google.inject.Singleton;
+
+@Singleton
+public class NoSshKeyCache implements SshKeyCache, SshKeyCreator {
+
+  public static Module module() {
+    return new AbstractModule() {
+      @Override
+      protected void configure() {
+        bind(SshKeyCache.class).to(NoSshKeyCache.class);
+        bind(SshKeyCreator.class).to(NoSshKeyCache.class);
+      }
+    };
+  }
+
+  @Override
+  public void evict(String username) {}
+
+  @Override
+  public AccountSshKey create(Account.Id accountId, int seq, String encoded)
+      throws InvalidSshKeyException {
+    throw new InvalidSshKeyException();
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ssh/NoSshModule.java b/java/com/google/gerrit/server/ssh/NoSshModule.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/ssh/NoSshModule.java
rename to java/com/google/gerrit/server/ssh/NoSshModule.java
diff --git a/java/com/google/gerrit/server/ssh/SshAddressesModule.java b/java/com/google/gerrit/server/ssh/SshAddressesModule.java
new file mode 100644
index 0000000..0a6bcac
--- /dev/null
+++ b/java/com/google/gerrit/server/ssh/SshAddressesModule.java
@@ -0,0 +1,102 @@
+// Copyright (C) 2013 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.google.gerrit.server.ssh;
+
+import com.google.common.collect.Lists;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.util.SocketUtil;
+import com.google.inject.AbstractModule;
+import com.google.inject.Provides;
+import com.google.inject.Singleton;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.eclipse.jgit.lib.Config;
+
+public class SshAddressesModule extends AbstractModule {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static final int DEFAULT_PORT = 29418;
+  public static final int IANA_SSH_PORT = 22;
+
+  @Override
+  protected void configure() {}
+
+  @Provides
+  @Singleton
+  @SshListenAddresses
+  public List<SocketAddress> getListenAddresses(@GerritServerConfig Config cfg) {
+    List<SocketAddress> listen = Lists.newArrayListWithExpectedSize(2);
+    String[] want = cfg.getStringList("sshd", null, "listenaddress");
+    if (want == null || want.length == 0) {
+      listen.add(new InetSocketAddress(DEFAULT_PORT));
+      return listen;
+    }
+
+    if (want.length == 1 && isOff(want[0])) {
+      return listen;
+    }
+
+    for (String desc : want) {
+      try {
+        listen.add(SocketUtil.resolve(desc, DEFAULT_PORT));
+      } catch (IllegalArgumentException e) {
+        logger.atSevere().log("Bad sshd.listenaddress: %s: %s", desc, e.getMessage());
+      }
+    }
+    return listen;
+  }
+
+  private static boolean isOff(String listenHostname) {
+    return "off".equalsIgnoreCase(listenHostname)
+        || "none".equalsIgnoreCase(listenHostname)
+        || "no".equalsIgnoreCase(listenHostname);
+  }
+
+  @Provides
+  @Singleton
+  @SshAdvertisedAddresses
+  List<String> getAdvertisedAddresses(
+      @GerritServerConfig Config cfg, @SshListenAddresses List<SocketAddress> listen) {
+    String[] want = cfg.getStringList("sshd", null, "advertisedaddress");
+    if (want.length > 0) {
+      return Arrays.asList(want);
+    }
+    List<InetSocketAddress> pub = new ArrayList<>();
+    List<InetSocketAddress> local = new ArrayList<>();
+
+    for (SocketAddress addr : listen) {
+      if (addr instanceof InetSocketAddress) {
+        InetSocketAddress inetAddr = (InetSocketAddress) addr;
+        if (inetAddr.getAddress().isLoopbackAddress()) {
+          local.add(inetAddr);
+        } else {
+          pub.add(inetAddr);
+        }
+      }
+    }
+    if (pub.isEmpty()) {
+      pub = local;
+    }
+    List<String> adv = Lists.newArrayListWithCapacity(pub.size());
+    for (InetSocketAddress addr : pub) {
+      adv.add(SocketUtil.format(addr, IANA_SSH_PORT));
+    }
+    return adv;
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshAdvertisedAddresses.java b/java/com/google/gerrit/server/ssh/SshAdvertisedAddresses.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshAdvertisedAddresses.java
rename to java/com/google/gerrit/server/ssh/SshAdvertisedAddresses.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshInfo.java b/java/com/google/gerrit/server/ssh/SshInfo.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshInfo.java
rename to java/com/google/gerrit/server/ssh/SshInfo.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshKeyCache.java b/java/com/google/gerrit/server/ssh/SshKeyCache.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshKeyCache.java
rename to java/com/google/gerrit/server/ssh/SshKeyCache.java
diff --git a/java/com/google/gerrit/server/ssh/SshKeyCreator.java b/java/com/google/gerrit/server/ssh/SshKeyCreator.java
new file mode 100644
index 0000000..55ba5ed
--- /dev/null
+++ b/java/com/google/gerrit/server/ssh/SshKeyCreator.java
@@ -0,0 +1,23 @@
+// 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.
+
+package com.google.gerrit.server.ssh;
+
+import com.google.gerrit.common.errors.InvalidSshKeyException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.account.AccountSshKey;
+
+public interface SshKeyCreator {
+  AccountSshKey create(Account.Id accountId, int seq, String encoded) throws InvalidSshKeyException;
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshListenAddresses.java b/java/com/google/gerrit/server/ssh/SshListenAddresses.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshListenAddresses.java
rename to java/com/google/gerrit/server/ssh/SshListenAddresses.java
diff --git a/java/com/google/gerrit/server/submit/ChangeAlreadyMergedException.java b/java/com/google/gerrit/server/submit/ChangeAlreadyMergedException.java
new file mode 100644
index 0000000..b4d3a4d
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/ChangeAlreadyMergedException.java
@@ -0,0 +1,25 @@
+// 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.
+
+package com.google.gerrit.server.submit;
+
+/** Indicates that the change or commit is already in the source tree. */
+public class ChangeAlreadyMergedException extends MergeIdenticalTreeException {
+  private static final long serialVersionUID = 1L;
+
+  /** @param msg message to return to the client describing the error. */
+  public ChangeAlreadyMergedException(String msg) {
+    super(msg);
+  }
+}
diff --git a/java/com/google/gerrit/server/submit/ChangeSet.java b/java/com/google/gerrit/server/submit/ChangeSet.java
new file mode 100644
index 0000000..8c94a21
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/ChangeSet.java
@@ -0,0 +1,123 @@
+// Copyright (C) 2015 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.google.gerrit.server.submit;
+
+import com.google.common.collect.ImmutableCollection;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.MultimapBuilder;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gwtorm.server.OrmException;
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * A set of changes grouped together to be submitted atomically.
+ *
+ * <p>MergeSuperSet constructs ChangeSets to accumulate intermediate results toward the ChangeSet it
+ * returns when done.
+ *
+ * <p>This class is not thread safe.
+ */
+public class ChangeSet {
+  private final ImmutableMap<Change.Id, ChangeData> changeData;
+
+  /**
+   * Additional changes not included in changeData because their connection to the original change
+   * is not visible to the current user. That is, this map includes both - changes that are not
+   * visible to the current user, and - changes whose only relationship to the set is via a change
+   * that is not visible to the current user
+   */
+  private final ImmutableMap<Change.Id, ChangeData> nonVisibleChanges;
+
+  private static ImmutableMap<Change.Id, ChangeData> index(
+      Iterable<ChangeData> changes, Collection<Change.Id> exclude) {
+    Map<Change.Id, ChangeData> ret = new LinkedHashMap<>();
+    for (ChangeData cd : changes) {
+      Change.Id id = cd.getId();
+      if (!ret.containsKey(id) && !exclude.contains(id)) {
+        ret.put(id, cd);
+      }
+    }
+    return ImmutableMap.copyOf(ret);
+  }
+
+  public ChangeSet(Iterable<ChangeData> changes, Iterable<ChangeData> hiddenChanges) {
+    changeData = index(changes, ImmutableList.<Change.Id>of());
+    nonVisibleChanges = index(hiddenChanges, changeData.keySet());
+  }
+
+  public ChangeSet(ChangeData change, boolean visible) {
+    this(
+        visible ? ImmutableList.of(change) : ImmutableList.<ChangeData>of(),
+        ImmutableList.of(change));
+  }
+
+  public ImmutableSet<Change.Id> ids() {
+    return changeData.keySet();
+  }
+
+  public ImmutableMap<Change.Id, ChangeData> changesById() {
+    return changeData;
+  }
+
+  public ListMultimap<Branch.NameKey, ChangeData> changesByBranch() throws OrmException {
+    ListMultimap<Branch.NameKey, ChangeData> ret =
+        MultimapBuilder.hashKeys().arrayListValues().build();
+    for (ChangeData cd : changeData.values()) {
+      ret.put(cd.change().getDest(), cd);
+    }
+    return ret;
+  }
+
+  public ImmutableCollection<ChangeData> changes() {
+    return changeData.values();
+  }
+
+  public ImmutableSet<Project.NameKey> projects() {
+    ImmutableSet.Builder<Project.NameKey> ret = ImmutableSet.builder();
+    for (ChangeData cd : changeData.values()) {
+      ret.add(cd.project());
+    }
+    return ret.build();
+  }
+
+  public ImmutableSet<Change.Id> nonVisibleIds() {
+    return nonVisibleChanges.keySet();
+  }
+
+  public ImmutableList<ChangeData> nonVisibleChanges() {
+    return nonVisibleChanges.values().asList();
+  }
+
+  public boolean furtherHiddenChanges() {
+    return !nonVisibleChanges.isEmpty();
+  }
+
+  public int size() {
+    return changeData.size() + nonVisibleChanges.size();
+  }
+
+  @Override
+  public String toString() {
+    return getClass().getSimpleName() + ids() + nonVisibleIds();
+  }
+}
diff --git a/java/com/google/gerrit/server/submit/CherryPick.java b/java/com/google/gerrit/server/submit/CherryPick.java
new file mode 100644
index 0000000..182c22a
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/CherryPick.java
@@ -0,0 +1,227 @@
+// Copyright (C) 2012 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.google.gerrit.server.submit;
+
+import static com.google.gerrit.server.submit.CommitMergeStatus.EMPTY_COMMIT;
+import static com.google.gerrit.server.submit.CommitMergeStatus.SKIPPED_IDENTICAL_TREE;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.extensions.restapi.MergeConflictException;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetInfo;
+import com.google.gerrit.server.ChangeUtil;
+import com.google.gerrit.server.git.CodeReviewCommit;
+import com.google.gerrit.server.git.MergeTip;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.RepoContext;
+import com.google.gwtorm.server.OrmException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.revwalk.RevCommit;
+
+public class CherryPick extends SubmitStrategy {
+
+  CherryPick(SubmitStrategy.Arguments args) {
+    super(args);
+  }
+
+  @Override
+  public List<SubmitStrategyOp> buildOps(Collection<CodeReviewCommit> toMerge)
+      throws IntegrationException {
+    List<CodeReviewCommit> sorted = CodeReviewCommit.ORDER.sortedCopy(toMerge);
+    List<SubmitStrategyOp> ops = new ArrayList<>(sorted.size());
+    boolean first = true;
+    while (!sorted.isEmpty()) {
+      CodeReviewCommit n = sorted.remove(0);
+      if (first && args.mergeTip.getInitialTip() == null) {
+        ops.add(new FastForwardOp(args, n));
+      } else if (n.getParentCount() == 0) {
+        ops.add(new CherryPickRootOp(n));
+      } else if (n.getParentCount() == 1) {
+        ops.add(new CherryPickOneOp(n));
+      } else {
+        ops.add(new CherryPickMultipleParentsOp(n));
+      }
+      first = false;
+    }
+    return ops;
+  }
+
+  private class CherryPickRootOp extends SubmitStrategyOp {
+    private CherryPickRootOp(CodeReviewCommit toMerge) {
+      super(CherryPick.this.args, toMerge);
+    }
+
+    @Override
+    public void updateRepoImpl(RepoContext ctx) {
+      // Refuse to merge a root commit into an existing branch, we cannot obtain
+      // a delta for the cherry-pick to apply.
+      toMerge.setStatusCode(CommitMergeStatus.CANNOT_CHERRY_PICK_ROOT);
+    }
+  }
+
+  private class CherryPickOneOp extends SubmitStrategyOp {
+    private PatchSet.Id psId;
+    private CodeReviewCommit newCommit;
+    private PatchSetInfo patchSetInfo;
+
+    private CherryPickOneOp(CodeReviewCommit toMerge) {
+      super(CherryPick.this.args, toMerge);
+    }
+
+    @Override
+    protected void updateRepoImpl(RepoContext ctx)
+        throws IntegrationException, IOException, OrmException, MethodNotAllowedException {
+      // If there is only one parent, a cherry-pick can be done by taking the
+      // delta relative to that one parent and redoing that on the current merge
+      // tip.
+      args.rw.parseBody(toMerge);
+      psId =
+          ChangeUtil.nextPatchSetIdFromChangeRefsMap(
+              ctx.getRepoView().getRefs(getId().toRefPrefix()),
+              toMerge.change().currentPatchSetId());
+      RevCommit mergeTip = args.mergeTip.getCurrentTip();
+      args.rw.parseBody(mergeTip);
+      String cherryPickCmtMsg = args.mergeUtil.createCommitMessageOnSubmit(toMerge, mergeTip);
+
+      PersonIdent committer =
+          args.caller.newCommitterIdent(ctx.getWhen(), args.serverIdent.getTimeZone());
+      try {
+        newCommit =
+            args.mergeUtil.createCherryPickFromCommit(
+                ctx.getInserter(),
+                ctx.getRepoView().getConfig(),
+                args.mergeTip.getCurrentTip(),
+                toMerge,
+                committer,
+                cherryPickCmtMsg,
+                args.rw,
+                0,
+                false,
+                false);
+      } catch (MergeConflictException mce) {
+        // Keep going in the case of a single merge failure; the goal is to
+        // cherry-pick as many commits as possible.
+        toMerge.setStatusCode(CommitMergeStatus.PATH_CONFLICT);
+        return;
+      } catch (MergeIdenticalTreeException mie) {
+        if (args.project.is(BooleanProjectConfig.REJECT_EMPTY_COMMIT)) {
+          toMerge.setStatusCode(EMPTY_COMMIT);
+          return;
+        }
+        toMerge.setStatusCode(SKIPPED_IDENTICAL_TREE);
+        return;
+      }
+      // Initial copy doesn't have new patch set ID since change hasn't been
+      // updated yet.
+      newCommit = amendGitlink(newCommit);
+      newCommit.copyFrom(toMerge);
+      newCommit.setPatchsetId(psId);
+      newCommit.setStatusCode(CommitMergeStatus.CLEAN_PICK);
+      args.mergeTip.moveTipTo(newCommit, newCommit);
+      args.commitStatus.put(newCommit);
+
+      ctx.addRefUpdate(ObjectId.zeroId(), newCommit, psId.toRefName());
+      patchSetInfo = args.patchSetInfoFactory.get(ctx.getRevWalk(), newCommit, psId);
+    }
+
+    @Override
+    public PatchSet updateChangeImpl(ChangeContext ctx)
+        throws OrmException, NoSuchChangeException, IOException {
+      if (newCommit == null && toMerge.getStatusCode() == SKIPPED_IDENTICAL_TREE) {
+        return null;
+      }
+      requireNonNull(
+          newCommit,
+          () ->
+              String.format(
+                  "no new commit produced by CherryPick of %s, expected to fail fast",
+                  toMerge.change().getId()));
+      PatchSet prevPs = args.psUtil.current(ctx.getDb(), ctx.getNotes());
+      PatchSet newPs =
+          args.psUtil.insert(
+              ctx.getDb(),
+              ctx.getRevWalk(),
+              ctx.getUpdate(psId),
+              psId,
+              newCommit,
+              prevPs != null ? prevPs.getGroups() : ImmutableList.<String>of(),
+              null,
+              null);
+      ctx.getChange().setCurrentPatchSet(patchSetInfo);
+
+      // Don't copy approvals, as this is already taken care of by
+      // SubmitStrategyOp.
+
+      newCommit.setNotes(ctx.getNotes());
+      return newPs;
+    }
+  }
+
+  private class CherryPickMultipleParentsOp extends SubmitStrategyOp {
+    private CherryPickMultipleParentsOp(CodeReviewCommit toMerge) {
+      super(CherryPick.this.args, toMerge);
+    }
+
+    @Override
+    public void updateRepoImpl(RepoContext ctx) throws IntegrationException, IOException {
+      if (args.mergeUtil.hasMissingDependencies(args.mergeSorter, toMerge)) {
+        // One or more dependencies were not met. The status was already marked
+        // on the commit so we have nothing further to perform at this time.
+        return;
+      }
+      // There are multiple parents, so this is a merge commit. We don't want
+      // to cherry-pick the merge as clients can't easily rebase their history
+      // with that merge present and replaced by an equivalent merge with a
+      // different first parent. So instead behave as though MERGE_IF_NECESSARY
+      // was configured.
+      MergeTip mergeTip = args.mergeTip;
+      if (args.rw.isMergedInto(mergeTip.getCurrentTip(), toMerge)
+          && !args.submoduleOp.hasSubscription(args.destBranch)) {
+        mergeTip.moveTipTo(toMerge, toMerge);
+      } else {
+        PersonIdent myIdent = new PersonIdent(args.serverIdent, ctx.getWhen());
+        CodeReviewCommit result =
+            args.mergeUtil.mergeOneCommit(
+                myIdent,
+                myIdent,
+                args.rw,
+                ctx.getInserter(),
+                ctx.getRepoView().getConfig(),
+                args.destBranch,
+                mergeTip.getCurrentTip(),
+                toMerge);
+        result = amendGitlink(result);
+        mergeTip.moveTipTo(result, toMerge);
+        args.mergeUtil.markCleanMerges(
+            args.rw, args.canMergeFlag, mergeTip.getCurrentTip(), args.alreadyAccepted);
+      }
+    }
+  }
+
+  static boolean dryRun(
+      SubmitDryRun.Arguments args, CodeReviewCommit mergeTip, CodeReviewCommit toMerge)
+      throws IntegrationException {
+    return args.mergeUtil.canCherryPick(args.mergeSorter, args.repo, mergeTip, args.rw, toMerge);
+  }
+}
diff --git a/java/com/google/gerrit/server/submit/CommitMergeStatus.java b/java/com/google/gerrit/server/submit/CommitMergeStatus.java
new file mode 100644
index 0000000..3163bd2
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/CommitMergeStatus.java
@@ -0,0 +1,131 @@
+// Copyright (C) 2009 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.google.gerrit.server.submit;
+
+import static java.util.stream.Collectors.toSet;
+
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Provider;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * Status codes set on {@link com.google.gerrit.server.git.CodeReviewCommit}s by {@link
+ * SubmitStrategy} implementations.
+ */
+public enum CommitMergeStatus {
+  CLEAN_MERGE("Change has been successfully merged"),
+
+  CLEAN_PICK("Change has been successfully cherry-picked"),
+
+  CLEAN_REBASE("Change has been successfully rebased and submitted"),
+
+  ALREADY_MERGED(""),
+
+  PATH_CONFLICT(
+      "Change could not be merged due to a path conflict.\n"
+          + "\n"
+          + "Please rebase the change locally and upload the rebased commit for review."),
+
+  REBASE_MERGE_CONFLICT(
+      "Change could not be merged due to a conflict.\n"
+          + "\n"
+          + "Please rebase the change locally and upload the rebased commit for review."),
+
+  SKIPPED_IDENTICAL_TREE(
+      "Marking change merged without cherry-picking to branch, as the resulting commit would be empty."),
+
+  MISSING_DEPENDENCY("Depends on change that was not submitted."),
+
+  MANUAL_RECURSIVE_MERGE(
+      "The change requires a local merge to resolve.\n"
+          + "\n"
+          + "Please merge (or rebase) the change locally and upload the resolution for review."),
+
+  CANNOT_CHERRY_PICK_ROOT(
+      "Cannot cherry-pick an initial commit onto an existing branch.\n"
+          + "\n"
+          + "Please merge the change locally and upload the merge commit for review."),
+
+  CANNOT_REBASE_ROOT(
+      "Cannot rebase an initial commit onto an existing branch.\n"
+          + "\n"
+          + "Please merge the change locally and upload the merge commit for review."),
+
+  NOT_FAST_FORWARD(
+      "Project policy requires all submissions to be a fast-forward.\n"
+          + "\n"
+          + "Please rebase the change locally and upload again for review."),
+
+  EMPTY_COMMIT(
+      "Change could not be merged because the commit is empty.\n"
+          + "\n"
+          + "Project policy requires all commits to contain modifications to at least one file.");
+
+  private final String description;
+
+  CommitMergeStatus(String description) {
+    this.description = description;
+  }
+
+  public String getDescription() {
+    return description;
+  }
+
+  public static String createMissingDependencyMessage(
+      Provider<InternalChangeQuery> queryProvider, String commit, String otherCommit)
+      throws OrmException {
+    List<ChangeData> changes = queryProvider.get().enforceVisibility(true).byCommit(otherCommit);
+
+    if (changes.isEmpty()) {
+      return String.format(
+          "Commit %s depends on commit %s which cannot be merged."
+              + " Is the change of this commit not visible or was it deleted?",
+          commit, otherCommit);
+    } else if (changes.size() == 1) {
+      ChangeData cd = changes.get(0);
+      if (cd.currentPatchSet().getRevision().get().equals(otherCommit)) {
+        return String.format(
+            "Commit %s depends on commit %s of change %d which cannot be merged.",
+            commit, otherCommit, cd.getId().get());
+      }
+      Optional<PatchSet> patchSet =
+          cd.patchSets().stream()
+              .filter(ps -> ps.getRevision().get().equals(otherCommit))
+              .findAny();
+      if (patchSet.isPresent()) {
+        return String.format(
+            "Commit %s depends on commit %s, which is outdated patch set %d of change %d."
+                + " The latest patch set is %d.",
+            commit,
+            otherCommit,
+            patchSet.get().getId().get(),
+            cd.getId().get(),
+            cd.currentPatchSet().getId().get());
+      }
+      // should not happen, fall-back to default message
+      return String.format(
+          "Commit %s depends on commit %s of change %d which cannot be merged.",
+          commit, otherCommit, cd.getId().get());
+    } else {
+      return String.format(
+          "Commit %s depends on commit %s of changes %s which cannot be merged.",
+          commit, otherCommit, changes.stream().map(cd -> cd.getId().get()).collect(toSet()));
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/submit/EmailMerge.java b/java/com/google/gerrit/server/submit/EmailMerge.java
new file mode 100644
index 0000000..a6b73447
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/EmailMerge.java
@@ -0,0 +1,148 @@
+// Copyright (C) 2015 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.google.gerrit.server.submit;
+
+import com.google.common.collect.ListMultimap;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.api.changes.RecipientType;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.config.SendEmailExecutor;
+import com.google.gerrit.server.mail.send.MergedSender;
+import com.google.gerrit.server.util.RequestContext;
+import com.google.gerrit.server.util.ThreadLocalRequestContext;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.Inject;
+import com.google.inject.OutOfScopeException;
+import com.google.inject.Provider;
+import com.google.inject.ProvisionException;
+import com.google.inject.assistedinject.Assisted;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+
+class EmailMerge implements Runnable, RequestContext {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  interface Factory {
+    EmailMerge create(
+        Project.NameKey project,
+        Change.Id changeId,
+        Account.Id submitter,
+        NotifyHandling notifyHandling,
+        ListMultimap<RecipientType, Account.Id> accountsToNotify);
+  }
+
+  private final ExecutorService sendEmailsExecutor;
+  private final MergedSender.Factory mergedSenderFactory;
+  private final SchemaFactory<ReviewDb> schemaFactory;
+  private final ThreadLocalRequestContext requestContext;
+  private final IdentifiedUser.GenericFactory identifiedUserFactory;
+
+  private final Project.NameKey project;
+  private final Change.Id changeId;
+  private final Account.Id submitter;
+  private final NotifyHandling notifyHandling;
+  private final ListMultimap<RecipientType, Account.Id> accountsToNotify;
+
+  private ReviewDb db;
+
+  @Inject
+  EmailMerge(
+      @SendEmailExecutor ExecutorService executor,
+      MergedSender.Factory mergedSenderFactory,
+      SchemaFactory<ReviewDb> schemaFactory,
+      ThreadLocalRequestContext requestContext,
+      IdentifiedUser.GenericFactory identifiedUserFactory,
+      @Assisted Project.NameKey project,
+      @Assisted Change.Id changeId,
+      @Assisted @Nullable Account.Id submitter,
+      @Assisted NotifyHandling notifyHandling,
+      @Assisted ListMultimap<RecipientType, Account.Id> accountsToNotify) {
+    this.sendEmailsExecutor = executor;
+    this.mergedSenderFactory = mergedSenderFactory;
+    this.schemaFactory = schemaFactory;
+    this.requestContext = requestContext;
+    this.identifiedUserFactory = identifiedUserFactory;
+    this.project = project;
+    this.changeId = changeId;
+    this.submitter = submitter;
+    this.notifyHandling = notifyHandling;
+    this.accountsToNotify = accountsToNotify;
+  }
+
+  void sendAsync() {
+    @SuppressWarnings("unused")
+    Future<?> possiblyIgnoredError = sendEmailsExecutor.submit(this);
+  }
+
+  @Override
+  public void run() {
+    RequestContext old = requestContext.setContext(this);
+    try {
+      MergedSender cm = mergedSenderFactory.create(project, changeId);
+      if (submitter != null) {
+        cm.setFrom(submitter);
+      }
+      cm.setNotify(notifyHandling);
+      cm.setAccountsToNotify(accountsToNotify);
+      cm.send();
+    } catch (Exception e) {
+      logger.atSevere().withCause(e).log("Cannot email merged notification for %s", changeId);
+    } finally {
+      requestContext.setContext(old);
+      if (db != null) {
+        db.close();
+        db = null;
+      }
+    }
+  }
+
+  @Override
+  public String toString() {
+    return "send-email merged";
+  }
+
+  @Override
+  public CurrentUser getUser() {
+    if (submitter != null) {
+      return identifiedUserFactory.create(submitter).getRealUser();
+    }
+    throw new OutOfScopeException("No user on email thread");
+  }
+
+  @Override
+  public Provider<ReviewDb> getReviewDbProvider() {
+    return new Provider<ReviewDb>() {
+      @Override
+      public ReviewDb get() {
+        if (db == null) {
+          try {
+            db = schemaFactory.open();
+          } catch (OrmException e) {
+            throw new ProvisionException("Cannot open ReviewDb", e);
+          }
+        }
+        return db;
+      }
+    };
+  }
+}
diff --git a/java/com/google/gerrit/server/submit/FastForwardOnly.java b/java/com/google/gerrit/server/submit/FastForwardOnly.java
new file mode 100644
index 0000000..5a471ac
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/FastForwardOnly.java
@@ -0,0 +1,60 @@
+// Copyright (C) 2012 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.google.gerrit.server.submit;
+
+import com.google.gerrit.server.git.CodeReviewCommit;
+import com.google.gerrit.server.update.RepoContext;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+public class FastForwardOnly extends SubmitStrategy {
+  FastForwardOnly(SubmitStrategy.Arguments args) {
+    super(args);
+  }
+
+  @Override
+  public List<SubmitStrategyOp> buildOps(Collection<CodeReviewCommit> toMerge)
+      throws IntegrationException {
+    List<CodeReviewCommit> sorted = args.mergeUtil.reduceToMinimalMerge(args.mergeSorter, toMerge);
+    List<SubmitStrategyOp> ops = new ArrayList<>(sorted.size());
+    CodeReviewCommit newTipCommit =
+        args.mergeUtil.getFirstFastForward(args.mergeTip.getInitialTip(), args.rw, sorted);
+    if (!newTipCommit.equals(args.mergeTip.getInitialTip())) {
+      ops.add(new FastForwardOp(args, newTipCommit));
+    }
+    while (!sorted.isEmpty()) {
+      ops.add(new NotFastForwardOp(sorted.remove(0)));
+    }
+    return ops;
+  }
+
+  private class NotFastForwardOp extends SubmitStrategyOp {
+    private NotFastForwardOp(CodeReviewCommit toMerge) {
+      super(FastForwardOnly.this.args, toMerge);
+    }
+
+    @Override
+    public void updateRepoImpl(RepoContext ctx) {
+      toMerge.setStatusCode(CommitMergeStatus.NOT_FAST_FORWARD);
+    }
+  }
+
+  static boolean dryRun(
+      SubmitDryRun.Arguments args, CodeReviewCommit mergeTip, CodeReviewCommit toMerge)
+      throws IntegrationException {
+    return args.mergeUtil.canFastForward(args.mergeSorter, mergeTip, args.rw, toMerge);
+  }
+}
diff --git a/java/com/google/gerrit/server/submit/FastForwardOp.java b/java/com/google/gerrit/server/submit/FastForwardOp.java
new file mode 100644
index 0000000..08f5abb
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/FastForwardOp.java
@@ -0,0 +1,39 @@
+// 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.
+
+package com.google.gerrit.server.submit;
+
+import static com.google.gerrit.server.submit.CommitMergeStatus.EMPTY_COMMIT;
+
+import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
+import com.google.gerrit.server.git.CodeReviewCommit;
+import com.google.gerrit.server.update.RepoContext;
+
+class FastForwardOp extends SubmitStrategyOp {
+  FastForwardOp(SubmitStrategy.Arguments args, CodeReviewCommit toMerge) {
+    super(args, toMerge);
+  }
+
+  @Override
+  protected void updateRepoImpl(RepoContext ctx) throws IntegrationException {
+    if (args.project.is(BooleanProjectConfig.REJECT_EMPTY_COMMIT)
+        && toMerge.getParentCount() > 0
+        && toMerge.getTree().equals(toMerge.getParent(0).getTree())) {
+      toMerge.setStatusCode(EMPTY_COMMIT);
+      return;
+    }
+
+    args.mergeTip.moveTipTo(toMerge, toMerge);
+  }
+}
diff --git a/java/com/google/gerrit/server/submit/GitModules.java b/java/com/google/gerrit/server/submit/GitModules.java
new file mode 100644
index 0000000..d49f53f
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/GitModules.java
@@ -0,0 +1,101 @@
+// 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.
+
+package com.google.gerrit.server.submit;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.SubmoduleSubscription;
+import com.google.gerrit.server.config.CanonicalWebUrl;
+import com.google.gerrit.server.project.NoSuchProjectException;
+import com.google.gerrit.server.submit.MergeOpRepoManager.OpenRepo;
+import com.google.gerrit.server.util.git.SubmoduleSectionParser;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.BlobBasedConfig;
+import org.eclipse.jgit.lib.FileMode;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.treewalk.TreeWalk;
+
+/**
+ * Loads the .gitmodules file of the specified project/branch. It can be queried which submodules
+ * this branch is subscribed to.
+ */
+public class GitModules {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public interface Factory {
+    GitModules create(Branch.NameKey project, MergeOpRepoManager m);
+  }
+
+  private static final String GIT_MODULES = ".gitmodules";
+
+  private Set<SubmoduleSubscription> subscriptions;
+
+  @Inject
+  GitModules(
+      @CanonicalWebUrl @Nullable String canonicalWebUrl,
+      @Assisted Branch.NameKey branch,
+      @Assisted MergeOpRepoManager orm)
+      throws IOException {
+    Project.NameKey project = branch.getParentKey();
+    logger.atFine().log("Loading .gitmodules of %s for project %s", branch, project);
+    try {
+      OpenRepo or = orm.getRepo(project);
+      ObjectId id = or.repo.resolve(branch.get());
+      if (id == null) {
+        throw new IOException("Cannot open branch " + branch.get());
+      }
+      RevCommit commit = or.rw.parseCommit(id);
+
+      try (TreeWalk tw = TreeWalk.forPath(or.repo, GIT_MODULES, commit.getTree())) {
+        if (tw == null || (tw.getRawMode(0) & FileMode.TYPE_MASK) != FileMode.TYPE_FILE) {
+          subscriptions = Collections.emptySet();
+          logger.atFine().log("The .gitmodules file doesn't exist in %s", branch);
+          return;
+        }
+      }
+      BlobBasedConfig config;
+      try {
+        config = new BlobBasedConfig(null, or.repo, commit, GIT_MODULES);
+      } catch (ConfigInvalidException e) {
+        throw new IOException(
+            "Could not read .gitmodules of super project: " + branch.getParentKey(), e);
+      }
+      subscriptions =
+          new SubmoduleSectionParser(config, canonicalWebUrl, branch).parseAllSections();
+    } catch (NoSuchProjectException e) {
+      throw new IOException(e);
+    }
+  }
+
+  Collection<SubmoduleSubscription> subscribedTo(Branch.NameKey src) {
+    Collection<SubmoduleSubscription> ret = new ArrayList<>();
+    for (SubmoduleSubscription s : subscriptions) {
+      if (s.getSubmodule().equals(src)) {
+        ret.add(s);
+      }
+    }
+    return ret;
+  }
+}
diff --git a/java/com/google/gerrit/server/submit/ImplicitIntegrateOp.java b/java/com/google/gerrit/server/submit/ImplicitIntegrateOp.java
new file mode 100644
index 0000000..9c55463
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/ImplicitIntegrateOp.java
@@ -0,0 +1,29 @@
+// 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.
+
+package com.google.gerrit.server.submit;
+
+import com.google.gerrit.server.git.CodeReviewCommit;
+
+/**
+ * Operation for a change that is implicitly integrated by integrating another commit.
+ *
+ * <p>Updates the change status and message based on {@link CodeReviewCommit#getStatusCode()}, but
+ * does not touch the repository.
+ */
+class ImplicitIntegrateOp extends SubmitStrategyOp {
+  ImplicitIntegrateOp(SubmitStrategy.Arguments args, CodeReviewCommit toMerge) {
+    super(args, toMerge);
+  }
+}
diff --git a/java/com/google/gerrit/server/submit/IntegrationException.java b/java/com/google/gerrit/server/submit/IntegrationException.java
new file mode 100644
index 0000000..5028b76
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/IntegrationException.java
@@ -0,0 +1,32 @@
+// Copyright (C) 2008 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.google.gerrit.server.submit;
+
+/** Indicates an integration operation (see {@link MergeOp}) failed. */
+public class IntegrationException extends Exception {
+  private static final long serialVersionUID = 1L;
+
+  public IntegrationException(String msg) {
+    super(msg);
+  }
+
+  public IntegrationException(Throwable why) {
+    super(why);
+  }
+
+  public IntegrationException(String msg, Throwable why) {
+    super(msg, why);
+  }
+}
diff --git a/java/com/google/gerrit/server/submit/LocalMergeSuperSetComputation.java b/java/com/google/gerrit/server/submit/LocalMergeSuperSetComputation.java
new file mode 100644
index 0000000..9efb976
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/LocalMergeSuperSetComputation.java
@@ -0,0 +1,272 @@
+// Copyright (C) 2017 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.google.gerrit.server.submit;
+
+import static com.google.common.base.Preconditions.checkState;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.SubmitTypeRecord;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.NoSuchProjectException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gerrit.server.submit.MergeOpRepoManager.OpenRepo;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.AbstractModule;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevSort;
+
+/**
+ * Default implementation of MergeSuperSet that does the computation of the merge super set
+ * sequentially on the local Gerrit instance.
+ */
+public class LocalMergeSuperSetComputation implements MergeSuperSetComputation {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static class Module extends AbstractModule {
+    @Override
+    protected void configure() {
+      DynamicItem.bind(binder(), MergeSuperSetComputation.class)
+          .to(LocalMergeSuperSetComputation.class);
+    }
+  }
+
+  @AutoValue
+  abstract static class QueryKey {
+    private static QueryKey create(Branch.NameKey branch, Iterable<String> hashes) {
+      return new AutoValue_LocalMergeSuperSetComputation_QueryKey(
+          branch, ImmutableSet.copyOf(hashes));
+    }
+
+    abstract Branch.NameKey branch();
+
+    abstract ImmutableSet<String> hashes();
+  }
+
+  private final PermissionBackend permissionBackend;
+  private final Provider<InternalChangeQuery> queryProvider;
+  private final Map<QueryKey, List<ChangeData>> queryCache;
+  private final Map<Branch.NameKey, Optional<RevCommit>> heads;
+  private final ProjectCache projectCache;
+
+  @Inject
+  LocalMergeSuperSetComputation(
+      PermissionBackend permissionBackend,
+      Provider<InternalChangeQuery> queryProvider,
+      ProjectCache projectCache) {
+    this.projectCache = projectCache;
+    this.permissionBackend = permissionBackend;
+    this.queryProvider = queryProvider;
+    this.queryCache = new HashMap<>();
+    this.heads = new HashMap<>();
+  }
+
+  @Override
+  public ChangeSet completeWithoutTopic(
+      ReviewDb db, MergeOpRepoManager orm, ChangeSet changeSet, CurrentUser user)
+      throws OrmException, IOException, PermissionBackendException {
+    Collection<ChangeData> visibleChanges = new ArrayList<>();
+    Collection<ChangeData> nonVisibleChanges = new ArrayList<>();
+
+    // For each target branch we run a separate rev walk to find open changes
+    // reachable from changes already in the merge super set.
+    ImmutableListMultimap<Branch.NameKey, ChangeData> bc =
+        byBranch(Iterables.concat(changeSet.changes(), changeSet.nonVisibleChanges()));
+    for (Branch.NameKey b : bc.keySet()) {
+      OpenRepo or = getRepo(orm, b.getParentKey());
+      List<RevCommit> visibleCommits = new ArrayList<>();
+      List<RevCommit> nonVisibleCommits = new ArrayList<>();
+      for (ChangeData cd : bc.get(b)) {
+        boolean visible = isVisible(db, changeSet, cd, user);
+
+        if (submitType(cd) == SubmitType.CHERRY_PICK) {
+          if (visible) {
+            visibleChanges.add(cd);
+          } else {
+            nonVisibleChanges.add(cd);
+          }
+
+          continue;
+        }
+
+        // Get the underlying git commit object
+        String objIdStr = cd.currentPatchSet().getRevision().get();
+        RevCommit commit = or.rw.parseCommit(ObjectId.fromString(objIdStr));
+
+        // Always include the input, even if merged. This allows
+        // SubmitStrategyOp to correct the situation later, assuming it gets
+        // returned by byCommitsOnBranchNotMerged below.
+        if (visible) {
+          visibleCommits.add(commit);
+        } else {
+          nonVisibleCommits.add(commit);
+        }
+      }
+
+      Set<String> visibleHashes =
+          walkChangesByHashes(visibleCommits, Collections.emptySet(), or, b);
+      Iterables.addAll(visibleChanges, byCommitsOnBranchNotMerged(or, db, b, visibleHashes));
+
+      Set<String> nonVisibleHashes = walkChangesByHashes(nonVisibleCommits, visibleHashes, or, b);
+      Iterables.addAll(nonVisibleChanges, byCommitsOnBranchNotMerged(or, db, b, nonVisibleHashes));
+    }
+
+    return new ChangeSet(visibleChanges, nonVisibleChanges);
+  }
+
+  private static ImmutableListMultimap<Branch.NameKey, ChangeData> byBranch(
+      Iterable<ChangeData> changes) throws OrmException {
+    ImmutableListMultimap.Builder<Branch.NameKey, ChangeData> builder =
+        ImmutableListMultimap.builder();
+    for (ChangeData cd : changes) {
+      builder.put(cd.change().getDest(), cd);
+    }
+    return builder.build();
+  }
+
+  private OpenRepo getRepo(MergeOpRepoManager orm, Project.NameKey project) throws IOException {
+    try {
+      OpenRepo or = orm.getRepo(project);
+      checkState(or.rw.hasRevSort(RevSort.TOPO));
+      return or;
+    } catch (NoSuchProjectException e) {
+      throw new IOException(e);
+    }
+  }
+
+  private boolean isVisible(ReviewDb db, ChangeSet changeSet, ChangeData cd, CurrentUser user)
+      throws PermissionBackendException, IOException {
+    ProjectState projectState = projectCache.checkedGet(cd.project());
+    boolean visible =
+        changeSet.ids().contains(cd.getId())
+            && (projectState != null)
+            && projectState.statePermitsRead();
+    if (!visible) {
+      return false;
+    }
+
+    try {
+      permissionBackend.user(user).change(cd).database(db).check(ChangePermission.READ);
+      return true;
+    } catch (AuthException e) {
+      // We thought the change was visible, but it isn't.
+      // This can happen if the ACL changes during the
+      // completeChangeSet computation, for example.
+      return false;
+    }
+  }
+
+  private SubmitType submitType(ChangeData cd) throws OrmException {
+    SubmitTypeRecord str = cd.submitTypeRecord();
+    if (!str.isOk()) {
+      logErrorAndThrow("Failed to get submit type for " + cd.getId() + ": " + str.errorMessage);
+    }
+    return str.type;
+  }
+
+  private List<ChangeData> byCommitsOnBranchNotMerged(
+      OpenRepo or, ReviewDb db, Branch.NameKey branch, Set<String> hashes)
+      throws OrmException, IOException {
+    if (hashes.isEmpty()) {
+      return ImmutableList.of();
+    }
+    QueryKey k = QueryKey.create(branch, hashes);
+    List<ChangeData> cached = queryCache.get(k);
+    if (cached != null) {
+      return cached;
+    }
+
+    List<ChangeData> result = new ArrayList<>();
+    Iterable<ChangeData> destChanges =
+        queryProvider.get().byCommitsOnBranchNotMerged(or.repo, db, branch, hashes);
+    for (ChangeData chd : destChanges) {
+      result.add(chd);
+    }
+    queryCache.put(k, result);
+    return result;
+  }
+
+  private Set<String> walkChangesByHashes(
+      Collection<RevCommit> sourceCommits, Set<String> ignoreHashes, OpenRepo or, Branch.NameKey b)
+      throws IOException {
+    Set<String> destHashes = new HashSet<>();
+    or.rw.reset();
+    markHeadUninteresting(or, b);
+    for (RevCommit c : sourceCommits) {
+      String name = c.name();
+      if (ignoreHashes.contains(name)) {
+        continue;
+      }
+      destHashes.add(name);
+      or.rw.markStart(c);
+    }
+    for (RevCommit c : or.rw) {
+      String name = c.name();
+      if (ignoreHashes.contains(name)) {
+        continue;
+      }
+      destHashes.add(name);
+    }
+
+    return destHashes;
+  }
+
+  private void markHeadUninteresting(OpenRepo or, Branch.NameKey b) throws IOException {
+    Optional<RevCommit> head = heads.get(b);
+    if (head == null) {
+      Ref ref = or.repo.getRefDatabase().exactRef(b.get());
+      head = ref != null ? Optional.of(or.rw.parseCommit(ref.getObjectId())) : Optional.empty();
+      heads.put(b, head);
+    }
+    if (head.isPresent()) {
+      or.rw.markUninteresting(head.get());
+    }
+  }
+
+  private void logErrorAndThrow(String msg) throws OrmException {
+    logger.atSevere().log(msg);
+    throw new OrmException(msg);
+  }
+}
diff --git a/java/com/google/gerrit/server/submit/MergeAlways.java b/java/com/google/gerrit/server/submit/MergeAlways.java
new file mode 100644
index 0000000..9aab854
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/MergeAlways.java
@@ -0,0 +1,50 @@
+// Copyright (C) 2012 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.google.gerrit.server.submit;
+
+import com.google.gerrit.server.git.CodeReviewCommit;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+public class MergeAlways extends SubmitStrategy {
+  MergeAlways(SubmitStrategy.Arguments args) {
+    super(args);
+  }
+
+  @Override
+  public List<SubmitStrategyOp> buildOps(Collection<CodeReviewCommit> toMerge)
+      throws IntegrationException {
+    List<CodeReviewCommit> sorted = args.mergeUtil.reduceToMinimalMerge(args.mergeSorter, toMerge);
+    List<SubmitStrategyOp> ops = new ArrayList<>(sorted.size());
+    if (args.mergeTip.getInitialTip() == null && !sorted.isEmpty()) {
+      // The branch is unborn. Take a fast-forward resolution to
+      // create the branch.
+      CodeReviewCommit first = sorted.remove(0);
+      ops.add(new FastForwardOp(args, first));
+    }
+    while (!sorted.isEmpty()) {
+      CodeReviewCommit n = sorted.remove(0);
+      ops.add(new MergeOneOp(args, n));
+    }
+    return ops;
+  }
+
+  static boolean dryRun(
+      SubmitDryRun.Arguments args, CodeReviewCommit mergeTip, CodeReviewCommit toMerge)
+      throws IntegrationException {
+    return args.mergeUtil.canMerge(args.mergeSorter, args.repo, mergeTip, toMerge);
+  }
+}
diff --git a/java/com/google/gerrit/server/submit/MergeIdenticalTreeException.java b/java/com/google/gerrit/server/submit/MergeIdenticalTreeException.java
new file mode 100644
index 0000000..d063046
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/MergeIdenticalTreeException.java
@@ -0,0 +1,30 @@
+// Copyright (C) 2014 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.google.gerrit.server.submit;
+
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+
+/**
+ * Indicates that the commit is already contained in destination branch. Either the commit itself is
+ * in the source tree, or the content is merged
+ */
+public class MergeIdenticalTreeException extends ResourceConflictException {
+  private static final long serialVersionUID = 1L;
+
+  /** @param msg message to return to the client describing the error. */
+  public MergeIdenticalTreeException(String msg) {
+    super(msg);
+  }
+}
diff --git a/java/com/google/gerrit/server/submit/MergeIfNecessary.java b/java/com/google/gerrit/server/submit/MergeIfNecessary.java
new file mode 100644
index 0000000..d49e7fe
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/MergeIfNecessary.java
@@ -0,0 +1,56 @@
+// Copyright (C) 2012 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.google.gerrit.server.submit;
+
+import com.google.gerrit.server.git.CodeReviewCommit;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+public class MergeIfNecessary extends SubmitStrategy {
+  MergeIfNecessary(SubmitStrategy.Arguments args) {
+    super(args);
+  }
+
+  @Override
+  public List<SubmitStrategyOp> buildOps(Collection<CodeReviewCommit> toMerge)
+      throws IntegrationException {
+    List<CodeReviewCommit> sorted = args.mergeUtil.reduceToMinimalMerge(args.mergeSorter, toMerge);
+    List<SubmitStrategyOp> ops = new ArrayList<>(sorted.size());
+
+    if (args.mergeTip.getInitialTip() == null
+        || !args.submoduleOp.hasSubscription(args.destBranch)) {
+      CodeReviewCommit firstFastForward =
+          args.mergeUtil.getFirstFastForward(args.mergeTip.getInitialTip(), args.rw, sorted);
+      if (firstFastForward != null && !firstFastForward.equals(args.mergeTip.getInitialTip())) {
+        ops.add(new FastForwardOp(args, firstFastForward));
+      }
+    }
+
+    // For every other commit do a pair-wise merge.
+    while (!sorted.isEmpty()) {
+      CodeReviewCommit n = sorted.remove(0);
+      ops.add(new MergeOneOp(args, n));
+    }
+    return ops;
+  }
+
+  static boolean dryRun(
+      SubmitDryRun.Arguments args, CodeReviewCommit mergeTip, CodeReviewCommit toMerge)
+      throws IntegrationException {
+    return args.mergeUtil.canFastForward(args.mergeSorter, mergeTip, args.rw, toMerge)
+        || args.mergeUtil.canMerge(args.mergeSorter, args.repo, mergeTip, toMerge);
+  }
+}
diff --git a/java/com/google/gerrit/server/submit/MergeOneOp.java b/java/com/google/gerrit/server/submit/MergeOneOp.java
new file mode 100644
index 0000000..9806bdf
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/MergeOneOp.java
@@ -0,0 +1,59 @@
+// 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.
+
+package com.google.gerrit.server.submit;
+
+import static com.google.gerrit.server.submit.CommitMergeStatus.EMPTY_COMMIT;
+
+import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
+import com.google.gerrit.server.git.CodeReviewCommit;
+import com.google.gerrit.server.update.RepoContext;
+import java.io.IOException;
+import org.eclipse.jgit.lib.PersonIdent;
+
+class MergeOneOp extends SubmitStrategyOp {
+  MergeOneOp(SubmitStrategy.Arguments args, CodeReviewCommit toMerge) {
+    super(args, toMerge);
+  }
+
+  @Override
+  public void updateRepoImpl(RepoContext ctx) throws IntegrationException, IOException {
+    PersonIdent caller =
+        ctx.getIdentifiedUser()
+            .newCommitterIdent(args.serverIdent.getWhen(), args.serverIdent.getTimeZone());
+    if (args.mergeTip.getCurrentTip() == null) {
+      throw new IllegalStateException(
+          "cannot merge commit "
+              + toMerge.name()
+              + " onto a null tip; expected at least one fast-forward prior to"
+              + " this operation");
+    }
+    CodeReviewCommit merged =
+        args.mergeUtil.mergeOneCommit(
+            caller,
+            args.serverIdent,
+            args.rw,
+            ctx.getInserter(),
+            ctx.getRepoView().getConfig(),
+            args.destBranch,
+            args.mergeTip.getCurrentTip(),
+            toMerge);
+    if (args.project.is(BooleanProjectConfig.REJECT_EMPTY_COMMIT)
+        && merged.getTree().equals(merged.getParent(0).getTree())) {
+      toMerge.setStatusCode(EMPTY_COMMIT);
+      return;
+    }
+    args.mergeTip.moveTipTo(amendGitlink(merged), toMerge);
+  }
+}
diff --git a/java/com/google/gerrit/server/submit/MergeOp.java b/java/com/google/gerrit/server/submit/MergeOp.java
new file mode 100644
index 0000000..572da0b
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/MergeOp.java
@@ -0,0 +1,967 @@
+// Copyright (C) 2008 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.google.gerrit.server.submit;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkState;
+import static java.util.Comparator.comparing;
+import static java.util.Objects.requireNonNull;
+import static java.util.stream.Collectors.toSet;
+
+import com.github.rholder.retry.Attempt;
+import com.github.rholder.retry.RetryListener;
+import com.google.auto.value.AutoValue;
+import com.google.common.base.Joiner;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableSetMultimap;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.collect.SetMultimap;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.SubmitRecord;
+import com.google.gerrit.common.data.SubmitRequirement;
+import com.google.gerrit.common.data.SubmitTypeRecord;
+import com.google.gerrit.extensions.api.changes.RecipientType;
+import com.google.gerrit.extensions.api.changes.SubmitInput;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.metrics.Counter0;
+import com.google.gerrit.metrics.Description;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.InternalUser;
+import com.google.gerrit.server.change.NotifyUtil;
+import com.google.gerrit.server.git.CodeReviewCommit;
+import com.google.gerrit.server.git.LockFailureException;
+import com.google.gerrit.server.git.MergeTip;
+import com.google.gerrit.server.git.validators.MergeValidationException;
+import com.google.gerrit.server.git.validators.MergeValidators;
+import com.google.gerrit.server.logging.RequestId;
+import com.google.gerrit.server.logging.TraceContext;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.NoSuchProjectException;
+import com.google.gerrit.server.project.SubmitRuleOptions;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gerrit.server.submit.MergeOpRepoManager.OpenBranch;
+import com.google.gerrit.server.submit.MergeOpRepoManager.OpenRepo;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.update.RetryHelper.ActionType;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.IncorrectObjectTypeException;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.revwalk.RevCommit;
+
+/**
+ * Merges changes in submission order into a single branch.
+ *
+ * <p>Branches are reduced to the minimum number of heads needed to merge everything. This allows
+ * commits to be entered into the queue in any order (such as ancestors before descendants) and only
+ * the most recent commit on any line of development will be merged. All unmerged commits along a
+ * line of development must be in the submission queue in order to merge the tip of that line.
+ *
+ * <p>Conflicts are handled by discarding the entire line of development and marking it as
+ * conflicting, even if an earlier commit along that same line can be merged cleanly.
+ */
+public class MergeOp implements AutoCloseable {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final SubmitRuleOptions SUBMIT_RULE_OPTIONS = SubmitRuleOptions.builder().build();
+  private static final SubmitRuleOptions SUBMIT_RULE_OPTIONS_ALLOW_CLOSED =
+      SUBMIT_RULE_OPTIONS.toBuilder().allowClosed(true).build();
+
+  public static class CommitStatus {
+    private final ImmutableMap<Change.Id, ChangeData> changes;
+    private final ImmutableSetMultimap<Branch.NameKey, Change.Id> byBranch;
+    private final Map<Change.Id, CodeReviewCommit> commits;
+    private final ListMultimap<Change.Id, String> problems;
+    private final boolean allowClosed;
+
+    private CommitStatus(ChangeSet cs, boolean allowClosed) throws OrmException {
+      checkArgument(
+          !cs.furtherHiddenChanges(), "CommitStatus must not be called with hidden changes");
+      changes = cs.changesById();
+      ImmutableSetMultimap.Builder<Branch.NameKey, Change.Id> bb = ImmutableSetMultimap.builder();
+      for (ChangeData cd : cs.changes()) {
+        bb.put(cd.change().getDest(), cd.getId());
+      }
+      byBranch = bb.build();
+      commits = new HashMap<>();
+      problems = MultimapBuilder.treeKeys(comparing(Change.Id::get)).arrayListValues(1).build();
+      this.allowClosed = allowClosed;
+    }
+
+    public ImmutableSet<Change.Id> getChangeIds() {
+      return changes.keySet();
+    }
+
+    public ImmutableSet<Change.Id> getChangeIds(Branch.NameKey branch) {
+      return byBranch.get(branch);
+    }
+
+    public CodeReviewCommit get(Change.Id changeId) {
+      return commits.get(changeId);
+    }
+
+    public void put(CodeReviewCommit c) {
+      commits.put(c.change().getId(), c);
+    }
+
+    public void problem(Change.Id id, String problem) {
+      problems.put(id, problem);
+    }
+
+    public void logProblem(Change.Id id, Throwable t) {
+      String msg = "Error reading change";
+      logger.atSevere().withCause(t).log("%s %s", msg, id);
+      problems.put(id, msg);
+    }
+
+    public void logProblem(Change.Id id, String msg) {
+      logger.atSevere().log("%s %s", msg, id);
+      problems.put(id, msg);
+    }
+
+    public boolean isOk() {
+      return problems.isEmpty();
+    }
+
+    public List<SubmitRecord> getSubmitRecords(Change.Id id) {
+      // Use the cached submit records from the original ChangeData in the input
+      // ChangeSet, which were checked earlier in the integrate process. Even in
+      // the case of a race where the submit records may have changed, it makes
+      // more sense to store the original results of the submit rule evaluator
+      // than to fail at this point.
+      //
+      // However, do NOT expose that ChangeData directly, as it is way out of
+      // date by this point.
+      ChangeData cd = requireNonNull(changes.get(id), () -> String.format("ChangeData for %s", id));
+      return requireNonNull(
+          cd.getSubmitRecords(submitRuleOptions(allowClosed)),
+          "getSubmitRecord only valid after submit rules are evalutated");
+    }
+
+    public void maybeFailVerbose() throws ResourceConflictException {
+      if (isOk()) {
+        return;
+      }
+      String msg =
+          "Failed to submit "
+              + changes.size()
+              + " change"
+              + (changes.size() > 1 ? "s" : "")
+              + " due to the following problems:\n";
+      List<String> ps = new ArrayList<>(problems.keySet().size());
+      for (Change.Id id : problems.keySet()) {
+        ps.add("Change " + id + ": " + Joiner.on("; ").join(problems.get(id)));
+      }
+      throw new ResourceConflictException(msg + Joiner.on('\n').join(ps));
+    }
+
+    public void maybeFail(String msgPrefix) throws ResourceConflictException {
+      if (isOk()) {
+        return;
+      }
+      StringBuilder msg = new StringBuilder(msgPrefix).append(" of change");
+      Set<Change.Id> ids = problems.keySet();
+      if (ids.size() == 1) {
+        msg.append(" ").append(ids.iterator().next());
+      } else {
+        msg.append("s ").append(Joiner.on(", ").join(ids));
+      }
+      throw new ResourceConflictException(msg.toString());
+    }
+  }
+
+  private final ChangeMessagesUtil cmUtil;
+  private final BatchUpdate.Factory batchUpdateFactory;
+  private final InternalUser.Factory internalUserFactory;
+  private final MergeSuperSet mergeSuperSet;
+  private final MergeValidators.Factory mergeValidatorsFactory;
+  private final Provider<InternalChangeQuery> queryProvider;
+  private final SubmitStrategyFactory submitStrategyFactory;
+  private final SubmoduleOp.Factory subOpFactory;
+  private final Provider<MergeOpRepoManager> ormProvider;
+  private final NotifyUtil notifyUtil;
+  private final RetryHelper retryHelper;
+  private final ChangeData.Factory changeDataFactory;
+
+  private Timestamp ts;
+  private RequestId submissionId;
+  private IdentifiedUser caller;
+
+  private MergeOpRepoManager orm;
+  private CommitStatus commitStatus;
+  private ReviewDb db;
+  private SubmitInput submitInput;
+  private ListMultimap<RecipientType, Account.Id> accountsToNotify;
+  private Set<Project.NameKey> allProjects;
+  private boolean dryrun;
+  private TopicMetrics topicMetrics;
+
+  @Inject
+  MergeOp(
+      ChangeMessagesUtil cmUtil,
+      BatchUpdate.Factory batchUpdateFactory,
+      InternalUser.Factory internalUserFactory,
+      MergeSuperSet mergeSuperSet,
+      MergeValidators.Factory mergeValidatorsFactory,
+      Provider<InternalChangeQuery> queryProvider,
+      SubmitStrategyFactory submitStrategyFactory,
+      SubmoduleOp.Factory subOpFactory,
+      Provider<MergeOpRepoManager> ormProvider,
+      NotifyUtil notifyUtil,
+      TopicMetrics topicMetrics,
+      RetryHelper retryHelper,
+      ChangeData.Factory changeDataFactory) {
+    this.cmUtil = cmUtil;
+    this.batchUpdateFactory = batchUpdateFactory;
+    this.internalUserFactory = internalUserFactory;
+    this.mergeSuperSet = mergeSuperSet;
+    this.mergeValidatorsFactory = mergeValidatorsFactory;
+    this.queryProvider = queryProvider;
+    this.submitStrategyFactory = submitStrategyFactory;
+    this.subOpFactory = subOpFactory;
+    this.ormProvider = ormProvider;
+    this.notifyUtil = notifyUtil;
+    this.retryHelper = retryHelper;
+    this.topicMetrics = topicMetrics;
+    this.changeDataFactory = changeDataFactory;
+  }
+
+  @Override
+  public void close() {
+    if (orm != null) {
+      orm.close();
+    }
+  }
+
+  public static void checkSubmitRule(ChangeData cd, boolean allowClosed)
+      throws ResourceConflictException, OrmException {
+    PatchSet patchSet = cd.currentPatchSet();
+    if (patchSet == null) {
+      throw new ResourceConflictException("missing current patch set for change " + cd.getId());
+    }
+    List<SubmitRecord> results = getSubmitRecords(cd, allowClosed);
+    if (SubmitRecord.allRecordsOK(results)) {
+      // Rules supplied a valid solution.
+      return;
+    } else if (results.isEmpty()) {
+      throw new IllegalStateException(
+          String.format(
+              "SubmitRuleEvaluator.evaluate for change %s returned empty list for %s in %s",
+              cd.getId(), patchSet.getId(), cd.change().getProject().get()));
+    }
+
+    for (SubmitRecord record : results) {
+      switch (record.status) {
+        case OK:
+          break;
+
+        case CLOSED:
+          throw new ResourceConflictException("change is closed");
+
+        case RULE_ERROR:
+          throw new ResourceConflictException("submit rule error: " + record.errorMessage);
+
+        case NOT_READY:
+          throw new ResourceConflictException(describeNotReady(cd, record));
+
+        case FORCED:
+        default:
+          throw new IllegalStateException(
+              String.format(
+                  "Unexpected SubmitRecord status %s for %s in %s",
+                  record.status, patchSet.getId().getId(), cd.change().getProject().get()));
+      }
+    }
+    throw new IllegalStateException();
+  }
+
+  private static SubmitRuleOptions submitRuleOptions(boolean allowClosed) {
+    return allowClosed ? SUBMIT_RULE_OPTIONS_ALLOW_CLOSED : SUBMIT_RULE_OPTIONS;
+  }
+
+  private static List<SubmitRecord> getSubmitRecords(ChangeData cd, boolean allowClosed) {
+    return cd.submitRecords(submitRuleOptions(allowClosed));
+  }
+
+  private static String describeNotReady(ChangeData cd, SubmitRecord record) throws OrmException {
+    List<String> blockingConditions = new ArrayList<>();
+    if (record.labels != null) {
+      blockingConditions.add(describeLabels(cd, record.labels));
+    }
+    if (record.requirements != null) {
+      record.requirements.stream()
+          .map(SubmitRequirement::fallbackText)
+          .forEach(blockingConditions::add);
+    }
+    return Joiner.on("; ").join(blockingConditions);
+  }
+
+  private static String describeLabels(ChangeData cd, List<SubmitRecord.Label> labels)
+      throws OrmException {
+    List<String> labelResults = new ArrayList<>();
+    for (SubmitRecord.Label lbl : labels) {
+      switch (lbl.status) {
+        case OK:
+        case MAY:
+          break;
+
+        case REJECT:
+          labelResults.add("blocked by " + lbl.label);
+          break;
+
+        case NEED:
+          labelResults.add("needs " + lbl.label);
+          break;
+
+        case IMPOSSIBLE:
+          labelResults.add("needs " + lbl.label + " (check project access)");
+          break;
+
+        default:
+          throw new IllegalStateException(
+              String.format(
+                  "Unsupported SubmitRecord.Label %s for %s in %s",
+                  lbl, cd.change().currentPatchSetId(), cd.change().getProject()));
+      }
+    }
+    return Joiner.on("; ").join(labelResults);
+  }
+
+  private void checkSubmitRulesAndState(ChangeSet cs, boolean allowMerged)
+      throws ResourceConflictException {
+    checkArgument(
+        !cs.furtherHiddenChanges(), "checkSubmitRulesAndState called for topic with hidden change");
+    for (ChangeData cd : cs.changes()) {
+      try {
+        Change.Status status = cd.change().getStatus();
+        if (status != Change.Status.NEW) {
+          if (!(status == Change.Status.MERGED && allowMerged)) {
+            commitStatus.problem(
+                cd.getId(),
+                "Change " + cd.getId() + " is " + cd.change().getStatus().toString().toLowerCase());
+          }
+        } else if (cd.change().isWorkInProgress()) {
+          commitStatus.problem(cd.getId(), "Change " + cd.getId() + " is work in progress");
+        } else {
+          checkSubmitRule(cd, allowMerged);
+        }
+      } catch (ResourceConflictException e) {
+        commitStatus.problem(cd.getId(), e.getMessage());
+      } catch (OrmException e) {
+        String msg = "Error checking submit rules for change";
+        logger.atWarning().withCause(e).log("%s %s", msg, cd.getId());
+        commitStatus.problem(cd.getId(), msg);
+      }
+    }
+    commitStatus.maybeFailVerbose();
+  }
+
+  private void bypassSubmitRules(ChangeSet cs, boolean allowClosed) {
+    checkArgument(
+        !cs.furtherHiddenChanges(), "cannot bypass submit rules for topic with hidden change");
+    for (ChangeData cd : cs.changes()) {
+      List<SubmitRecord> records = new ArrayList<>(getSubmitRecords(cd, allowClosed));
+      SubmitRecord forced = new SubmitRecord();
+      forced.status = SubmitRecord.Status.FORCED;
+      records.add(forced);
+      cd.setSubmitRecords(submitRuleOptions(allowClosed), records);
+    }
+  }
+
+  /**
+   * Merges the given change.
+   *
+   * <p>Depending on the server configuration, more changes may be affected, e.g. by submission of a
+   * topic or via superproject subscriptions. All affected changes are integrated using the projects
+   * integration strategy.
+   *
+   * @param db the review database.
+   * @param change the change to be merged.
+   * @param caller the identity of the caller
+   * @param checkSubmitRules whether the prolog submit rules should be evaluated
+   * @param submitInput parameters regarding the merge
+   * @throws OrmException an error occurred reading or writing the database.
+   * @throws RestApiException if an error occurred.
+   * @throws PermissionBackendException if permissions can't be checked
+   * @throws IOException an error occurred reading from NoteDb.
+   */
+  public void merge(
+      ReviewDb db,
+      Change change,
+      IdentifiedUser caller,
+      boolean checkSubmitRules,
+      SubmitInput submitInput,
+      boolean dryrun)
+      throws OrmException, RestApiException, UpdateException, IOException, ConfigInvalidException,
+          PermissionBackendException {
+    this.submitInput = submitInput;
+    this.accountsToNotify = notifyUtil.resolveAccounts(submitInput.notifyDetails);
+    this.dryrun = dryrun;
+    this.caller = caller;
+    this.ts = TimeUtil.nowTs();
+    this.db = db;
+    this.submissionId = new RequestId(change.getId().toString());
+
+    try (TraceContext traceContext =
+        TraceContext.open().addTag(RequestId.Type.SUBMISSION_ID, submissionId)) {
+      openRepoManager();
+
+      logger.atFine().log("Beginning integration of %s", change);
+      try {
+        ChangeSet indexBackedChangeSet =
+            mergeSuperSet.setMergeOpRepoManager(orm).completeChangeSet(db, change, caller);
+        checkState(
+            indexBackedChangeSet.ids().contains(change.getId()),
+            "change %s missing from %s",
+            change.getId(),
+            indexBackedChangeSet);
+        if (indexBackedChangeSet.furtherHiddenChanges()) {
+          throw new AuthException(
+              "A change to be submitted with " + change.getId() + " is not visible");
+        }
+        logger.atFine().log("Calculated to merge %s", indexBackedChangeSet);
+
+        // Reload ChangeSet so that we don't rely on (potentially) stale index data for merging
+        ChangeSet cs = reloadChanges(indexBackedChangeSet);
+
+        // Count cross-project submissions outside of the retry loop. The chance of a single project
+        // failing increases with the number of projects, so the failure count would be inflated if
+        // this metric were incremented inside of integrateIntoHistory.
+        int projects = cs.projects().size();
+        if (projects > 1) {
+          topicMetrics.topicSubmissions.increment();
+        }
+
+        RetryTracker retryTracker = new RetryTracker();
+        retryHelper.execute(
+            updateFactory -> {
+              long attempt = retryTracker.lastAttemptNumber + 1;
+              boolean isRetry = attempt > 1;
+              if (isRetry) {
+                logger.atFine().log("Retrying, attempt #%d; skipping merged changes", attempt);
+                this.ts = TimeUtil.nowTs();
+                openRepoManager();
+              }
+              this.commitStatus = new CommitStatus(cs, isRetry);
+              if (checkSubmitRules) {
+                logger.atFine().log("Checking submit rules and state");
+                checkSubmitRulesAndState(cs, isRetry);
+              } else {
+                logger.atFine().log("Bypassing submit rules");
+                bypassSubmitRules(cs, isRetry);
+              }
+              try {
+                integrateIntoHistory(cs);
+              } catch (IntegrationException e) {
+                logger.atSevere().withCause(e).log("Error from integrateIntoHistory");
+                throw new ResourceConflictException(e.getMessage(), e);
+              }
+              return null;
+            },
+            RetryHelper.options()
+                .listener(retryTracker)
+                // Up to the entire submit operation is retried, including possibly many projects.
+                // Multiply the timeout by the number of projects we're actually attempting to
+                // submit.
+                .timeout(
+                    retryHelper
+                        .getDefaultTimeout(ActionType.CHANGE_UPDATE)
+                        .multipliedBy(cs.projects().size()))
+                .build());
+
+        if (projects > 1) {
+          topicMetrics.topicSubmissionsCompleted.increment();
+        }
+      } catch (IOException e) {
+        // Anything before the merge attempt is an error
+        throw new OrmException(e);
+      }
+    }
+  }
+
+  private void openRepoManager() {
+    if (orm != null) {
+      orm.close();
+    }
+    orm = ormProvider.get();
+    orm.setContext(db, ts, caller);
+  }
+
+  private ChangeSet reloadChanges(ChangeSet changeSet) {
+    List<ChangeData> visible = new ArrayList<>(changeSet.changes().size());
+    List<ChangeData> nonVisible = new ArrayList<>(changeSet.nonVisibleChanges().size());
+    changeSet
+        .changes()
+        .forEach(c -> visible.add(changeDataFactory.create(db, c.project(), c.getId())));
+    changeSet
+        .nonVisibleChanges()
+        .forEach(c -> nonVisible.add(changeDataFactory.create(db, c.project(), c.getId())));
+    return new ChangeSet(visible, nonVisible);
+  }
+
+  private class RetryTracker implements RetryListener {
+    long lastAttemptNumber;
+
+    @Override
+    public <V> void onRetry(Attempt<V> attempt) {
+      lastAttemptNumber = attempt.getAttemptNumber();
+    }
+  }
+
+  @Singleton
+  private static class TopicMetrics {
+    final Counter0 topicSubmissions;
+    final Counter0 topicSubmissionsCompleted;
+
+    @Inject
+    TopicMetrics(MetricMaker metrics) {
+      topicSubmissions =
+          metrics.newCounter(
+              "topic/cross_project_submit",
+              new Description("Attempts at cross project topic submission").setRate());
+      topicSubmissionsCompleted =
+          metrics.newCounter(
+              "topic/cross_project_submit_completed",
+              new Description("Cross project topic submissions that concluded successfully")
+                  .setRate());
+    }
+  }
+
+  private void integrateIntoHistory(ChangeSet cs)
+      throws IntegrationException, RestApiException, UpdateException {
+    checkArgument(!cs.furtherHiddenChanges(), "cannot integrate hidden changes into history");
+    logger.atFine().log("Beginning merge attempt on %s", cs);
+    Map<Branch.NameKey, BranchBatch> toSubmit = new HashMap<>();
+
+    ListMultimap<Branch.NameKey, ChangeData> cbb;
+    try {
+      cbb = cs.changesByBranch();
+    } catch (OrmException e) {
+      throw new IntegrationException("Error reading changes to submit", e);
+    }
+    Set<Branch.NameKey> branches = cbb.keySet();
+
+    for (Branch.NameKey branch : branches) {
+      OpenRepo or = openRepo(branch.getParentKey());
+      if (or != null) {
+        toSubmit.put(branch, validateChangeList(or, cbb.get(branch)));
+      }
+    }
+
+    // Done checks that don't involve running submit strategies.
+    commitStatus.maybeFailVerbose();
+
+    try {
+      SubmoduleOp submoduleOp = subOpFactory.create(branches, orm);
+      List<SubmitStrategy> strategies = getSubmitStrategies(toSubmit, submoduleOp, dryrun);
+      this.allProjects = submoduleOp.getProjectsInOrder();
+      batchUpdateFactory.execute(
+          orm.batchUpdates(allProjects),
+          new SubmitStrategyListener(submitInput, strategies, commitStatus),
+          dryrun);
+    } catch (NoSuchProjectException e) {
+      throw new ResourceNotFoundException(e.getMessage());
+    } catch (IOException | SubmoduleException e) {
+      throw new IntegrationException(e);
+    } catch (UpdateException e) {
+      if (e.getCause() instanceof LockFailureException) {
+        // Lock failures are a special case: RetryHelper depends on this specific causal chain in
+        // order to trigger a retry. The downside of throwing here is we will not get the nicer
+        // error message constructed below, in the case where this is the final attempt and the
+        // operation is not retried further. This is not a huge downside, and is hopefully so rare
+        // as to be unnoticeable, assuming RetryHelper is retrying sufficiently.
+        throw e;
+      }
+
+      // BatchUpdate may have inadvertently wrapped an IntegrationException
+      // thrown by some legacy SubmitStrategyOp code that intended the error
+      // message to be user-visible. Copy the message from the wrapped
+      // exception.
+      //
+      // If you happen across one of these, the correct fix is to convert the
+      // inner IntegrationException to a ResourceConflictException.
+      String msg;
+      if (e.getCause() instanceof IntegrationException) {
+        msg = e.getCause().getMessage();
+      } else {
+        msg = genericMergeError(cs);
+      }
+      throw new IntegrationException(msg, e);
+    }
+  }
+
+  public Set<Project.NameKey> getAllProjects() {
+    return allProjects;
+  }
+
+  public MergeOpRepoManager getMergeOpRepoManager() {
+    return orm;
+  }
+
+  private List<SubmitStrategy> getSubmitStrategies(
+      Map<Branch.NameKey, BranchBatch> toSubmit, SubmoduleOp submoduleOp, boolean dryrun)
+      throws IntegrationException, NoSuchProjectException, IOException {
+    List<SubmitStrategy> strategies = new ArrayList<>();
+    Set<Branch.NameKey> allBranches = submoduleOp.getBranchesInOrder();
+    Set<CodeReviewCommit> allCommits =
+        toSubmit.values().stream().map(BranchBatch::commits).flatMap(Set::stream).collect(toSet());
+    for (Branch.NameKey branch : allBranches) {
+      OpenRepo or = orm.getRepo(branch.getParentKey());
+      if (toSubmit.containsKey(branch)) {
+        BranchBatch submitting = toSubmit.get(branch);
+        logger.atFine().log("adding ops for branch batch %s", submitting);
+        OpenBranch ob = or.getBranch(branch);
+        requireNonNull(
+            submitting.submitType(),
+            String.format("null submit type for %s; expected to previously fail fast", submitting));
+        Set<CodeReviewCommit> commitsToSubmit = submitting.commits();
+        ob.mergeTip = new MergeTip(ob.oldTip, commitsToSubmit);
+        SubmitStrategy strategy =
+            submitStrategyFactory.create(
+                submitting.submitType(),
+                db,
+                or.rw,
+                or.canMergeFlag,
+                getAlreadyAccepted(or, ob.oldTip),
+                allCommits,
+                branch,
+                caller,
+                ob.mergeTip,
+                commitStatus,
+                submissionId,
+                submitInput,
+                accountsToNotify,
+                submoduleOp,
+                dryrun);
+        strategies.add(strategy);
+        strategy.addOps(or.getUpdate(), commitsToSubmit);
+        if (submitting.submitType().equals(SubmitType.FAST_FORWARD_ONLY)
+            && submoduleOp.hasSubscription(branch)) {
+          submoduleOp.addOp(or.getUpdate(), branch);
+        }
+      } else {
+        // no open change for this branch
+        // add submodule triggered op into BatchUpdate
+        submoduleOp.addOp(or.getUpdate(), branch);
+      }
+    }
+    return strategies;
+  }
+
+  private Set<RevCommit> getAlreadyAccepted(OpenRepo or, CodeReviewCommit branchTip)
+      throws IntegrationException {
+    Set<RevCommit> alreadyAccepted = new HashSet<>();
+
+    if (branchTip != null) {
+      alreadyAccepted.add(branchTip);
+    }
+
+    try {
+      for (Ref r : or.repo.getRefDatabase().getRefsByPrefix(Constants.R_HEADS)) {
+        try {
+          CodeReviewCommit aac = or.rw.parseCommit(r.getObjectId());
+          if (!commitStatus.commits.values().contains(aac)) {
+            alreadyAccepted.add(aac);
+          }
+        } catch (IncorrectObjectTypeException iote) {
+          // Not a commit? Skip over it.
+        }
+      }
+    } catch (IOException e) {
+      throw new IntegrationException("Failed to determine already accepted commits.", e);
+    }
+
+    logger.atFine().log("Found %d existing heads: %s", alreadyAccepted.size(), alreadyAccepted);
+    return alreadyAccepted;
+  }
+
+  @AutoValue
+  abstract static class BranchBatch {
+    @Nullable
+    abstract SubmitType submitType();
+
+    abstract Set<CodeReviewCommit> commits();
+  }
+
+  private BranchBatch validateChangeList(OpenRepo or, Collection<ChangeData> submitted)
+      throws IntegrationException {
+    logger.atFine().log("Validating %d changes", submitted.size());
+    Set<CodeReviewCommit> toSubmit = new LinkedHashSet<>(submitted.size());
+    SetMultimap<ObjectId, PatchSet.Id> revisions = getRevisions(or, submitted);
+
+    SubmitType submitType = null;
+    ChangeData choseSubmitTypeFrom = null;
+    for (ChangeData cd : submitted) {
+      Change.Id changeId = cd.getId();
+      ChangeNotes notes;
+      Change chg;
+      SubmitType st;
+      try {
+        notes = cd.notes();
+        chg = cd.change();
+        st = getSubmitType(cd);
+      } catch (OrmException e) {
+        commitStatus.logProblem(changeId, e);
+        continue;
+      }
+
+      if (st == null) {
+        commitStatus.logProblem(changeId, "No submit type for change");
+        continue;
+      }
+      if (submitType == null) {
+        submitType = st;
+        choseSubmitTypeFrom = cd;
+      } else if (st != submitType) {
+        commitStatus.problem(
+            changeId,
+            String.format(
+                "Change has submit type %s, but previously chose submit type %s "
+                    + "from change %s in the same batch",
+                st, submitType, choseSubmitTypeFrom.getId()));
+        continue;
+      }
+      if (chg.currentPatchSetId() == null) {
+        String msg = "Missing current patch set on change";
+        logger.atSevere().log("%s %s", msg, changeId);
+        commitStatus.problem(changeId, msg);
+        continue;
+      }
+
+      PatchSet ps;
+      Branch.NameKey destBranch = chg.getDest();
+      try {
+        ps = cd.currentPatchSet();
+      } catch (OrmException e) {
+        commitStatus.logProblem(changeId, e);
+        continue;
+      }
+      if (ps == null || ps.getRevision() == null || ps.getRevision().get() == null) {
+        commitStatus.logProblem(changeId, "Missing patch set or revision on change");
+        continue;
+      }
+
+      String idstr = ps.getRevision().get();
+      ObjectId id;
+      try {
+        id = ObjectId.fromString(idstr);
+      } catch (IllegalArgumentException e) {
+        commitStatus.logProblem(changeId, e);
+        continue;
+      }
+
+      if (!revisions.containsEntry(id, ps.getId())) {
+        if (revisions.containsValue(ps.getId())) {
+          // TODO This is actually an error, the patch set ref exists but points to a revision that
+          // is different from the revision that we have stored for the patch set in the change
+          // meta data.
+          commitStatus.logProblem(
+              changeId,
+              "Revision "
+                  + idstr
+                  + " of patch set "
+                  + ps.getPatchSetId()
+                  + " does not match the revision of the patch set ref "
+                  + ps.getId().toRefName());
+          continue;
+        }
+
+        // The patch set ref is not found but we want to merge the change. We can't safely do that
+        // if the patch set ref is missing. In a multi-master setup this can indicate a replication
+        // lag (e.g. the change meta data was already replicated, but the replication of the patch
+        // set ref is still pending).
+        commitStatus.logProblem(
+            changeId,
+            "Patch set ref "
+                + ps.getId().toRefName()
+                + " not found. Expected patch set ref of "
+                + ps.getPatchSetId()
+                + " to point to revision "
+                + idstr);
+        continue;
+      }
+
+      CodeReviewCommit commit;
+      try {
+        commit = or.rw.parseCommit(id);
+      } catch (IOException e) {
+        commitStatus.logProblem(changeId, e);
+        continue;
+      }
+
+      commit.setNotes(notes);
+      commit.setPatchsetId(ps.getId());
+      commitStatus.put(commit);
+
+      MergeValidators mergeValidators = mergeValidatorsFactory.create();
+      try {
+        mergeValidators.validatePreMerge(
+            or.repo, commit, or.project, destBranch, ps.getId(), caller);
+      } catch (MergeValidationException mve) {
+        commitStatus.problem(changeId, mve.getMessage());
+        continue;
+      }
+      commit.add(or.canMergeFlag);
+      toSubmit.add(commit);
+    }
+    logger.atFine().log("Submitting on this run: %s", toSubmit);
+    return new AutoValue_MergeOp_BranchBatch(submitType, toSubmit);
+  }
+
+  private SetMultimap<ObjectId, PatchSet.Id> getRevisions(OpenRepo or, Collection<ChangeData> cds)
+      throws IntegrationException {
+    try {
+      List<String> refNames = new ArrayList<>(cds.size());
+      for (ChangeData cd : cds) {
+        Change c = cd.change();
+        if (c != null) {
+          refNames.add(c.currentPatchSetId().toRefName());
+        }
+      }
+      SetMultimap<ObjectId, PatchSet.Id> revisions =
+          MultimapBuilder.hashKeys(cds.size()).hashSetValues(1).build();
+      for (Map.Entry<String, Ref> e :
+          or.repo
+              .getRefDatabase()
+              .exactRef(refNames.toArray(new String[refNames.size()]))
+              .entrySet()) {
+        revisions.put(e.getValue().getObjectId(), PatchSet.Id.fromRef(e.getKey()));
+      }
+      return revisions;
+    } catch (IOException | OrmException e) {
+      throw new IntegrationException("Failed to validate changes", e);
+    }
+  }
+
+  private SubmitType getSubmitType(ChangeData cd) {
+    SubmitTypeRecord str = cd.submitTypeRecord();
+    return str.isOk() ? str.type : null;
+  }
+
+  private OpenRepo openRepo(Project.NameKey project) throws IntegrationException {
+    try {
+      return orm.getRepo(project);
+    } catch (NoSuchProjectException e) {
+      logger.atWarning().log("Project %s no longer exists, abandoning open changes.", project);
+      abandonAllOpenChangeForDeletedProject(project);
+    } catch (IOException e) {
+      throw new IntegrationException("Error opening project " + project, e);
+    }
+    return null;
+  }
+
+  private void abandonAllOpenChangeForDeletedProject(Project.NameKey destProject) {
+    try {
+      for (ChangeData cd : queryProvider.get().byProjectOpen(destProject)) {
+        try (BatchUpdate bu =
+            batchUpdateFactory.create(db, destProject, internalUserFactory.create(), ts)) {
+          bu.addOp(
+              cd.getId(),
+              new BatchUpdateOp() {
+                @Override
+                public boolean updateChange(ChangeContext ctx) throws OrmException {
+                  Change change = ctx.getChange();
+                  if (!change.getStatus().isOpen()) {
+                    return false;
+                  }
+
+                  change.setStatus(Change.Status.ABANDONED);
+
+                  ChangeMessage msg =
+                      ChangeMessagesUtil.newMessage(
+                          change.currentPatchSetId(),
+                          internalUserFactory.create(),
+                          change.getLastUpdatedOn(),
+                          ChangeMessagesUtil.TAG_MERGED,
+                          "Project was deleted.");
+                  cmUtil.addChangeMessage(
+                      ctx.getDb(), ctx.getUpdate(change.currentPatchSetId()), msg);
+
+                  return true;
+                }
+              });
+          try {
+            bu.execute();
+          } catch (UpdateException | RestApiException e) {
+            logger.atWarning().withCause(e).log(
+                "Cannot abandon changes for deleted project %s", destProject);
+          }
+        }
+      }
+    } catch (OrmException e) {
+      logger.atWarning().withCause(e).log(
+          "Cannot abandon changes for deleted project %s", destProject);
+    }
+  }
+
+  private String genericMergeError(ChangeSet cs) {
+    int c = cs.size();
+    if (c == 1) {
+      return "Error submitting change";
+    }
+    int p = cs.projects().size();
+    if (p == 1) {
+      // Fused updates: it's correct to say that none of the n changes were submitted.
+      return "Error submitting " + c + " changes";
+    }
+    // Multiple projects involved, but we don't know at this point what failed. At least give the
+    // user a heads up that some changes may be unsubmitted, even if the change screen they land on
+    // after the error message says that this particular change was submitted.
+    return "Error submitting some of the "
+        + c
+        + " changes to one or more of the "
+        + p
+        + " projects involved; some projects may have submitted successfully, but others may have"
+        + " failed";
+  }
+}
diff --git a/java/com/google/gerrit/server/submit/MergeOpRepoManager.java b/java/com/google/gerrit/server/submit/MergeOpRepoManager.java
new file mode 100644
index 0000000..3f07ed7
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/MergeOpRepoManager.java
@@ -0,0 +1,218 @@
+// 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.
+
+package com.google.gerrit.server.submit;
+
+import static com.google.common.base.Preconditions.checkState;
+
+import com.google.common.collect.Maps;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.git.CodeReviewCommit;
+import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.MergeTip;
+import com.google.gerrit.server.git.validators.OnSubmitValidators;
+import com.google.gerrit.server.project.NoSuchProjectException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevFlag;
+import org.eclipse.jgit.revwalk.RevSort;
+
+/**
+ * This is a helper class for MergeOp and not intended for general use.
+ *
+ * <p>Some database backends require to open a repository just once within a transaction of a
+ * submission, this caches open repositories to satisfy that requirement.
+ */
+public class MergeOpRepoManager implements AutoCloseable {
+  public class OpenRepo {
+    final Repository repo;
+    final CodeReviewRevWalk rw;
+    final RevFlag canMergeFlag;
+    final ObjectInserter ins;
+
+    final ProjectState project;
+    BatchUpdate update;
+
+    private final ObjectReader reader;
+    private final Map<Branch.NameKey, OpenBranch> branches;
+
+    private OpenRepo(Repository repo, ProjectState project) {
+      this.repo = repo;
+      this.project = project;
+      ins = repo.newObjectInserter();
+      reader = ins.newReader();
+      rw = CodeReviewCommit.newRevWalk(reader);
+      rw.sort(RevSort.TOPO);
+      rw.sort(RevSort.COMMIT_TIME_DESC, true);
+      rw.setRetainBody(false);
+      canMergeFlag = rw.newFlag("CAN_MERGE");
+      rw.retainOnReset(canMergeFlag);
+
+      branches = Maps.newHashMapWithExpectedSize(1);
+    }
+
+    OpenBranch getBranch(Branch.NameKey branch) throws IntegrationException {
+      OpenBranch ob = branches.get(branch);
+      if (ob == null) {
+        ob = new OpenBranch(this, branch);
+        branches.put(branch, ob);
+      }
+      return ob;
+    }
+
+    public Repository getRepo() {
+      return repo;
+    }
+
+    Project.NameKey getProjectName() {
+      return project.getNameKey();
+    }
+
+    public CodeReviewRevWalk getCodeReviewRevWalk() {
+      return rw;
+    }
+
+    public BatchUpdate getUpdate() {
+      checkState(db != null, "call setContext before getUpdate");
+      if (update == null) {
+        update =
+            batchUpdateFactory
+                .create(db, getProjectName(), caller, ts)
+                .setRepository(repo, rw, ins)
+                .setOnSubmitValidators(onSubmitValidatorsFactory.create());
+      }
+      return update;
+    }
+
+    private void close() {
+      if (update != null) {
+        update.close();
+      }
+      rw.close();
+      reader.close();
+      ins.close();
+      repo.close();
+    }
+  }
+
+  public static class OpenBranch {
+    final RefUpdate update;
+    final CodeReviewCommit oldTip;
+    MergeTip mergeTip;
+
+    OpenBranch(OpenRepo or, Branch.NameKey name) throws IntegrationException {
+      try {
+        update = or.repo.updateRef(name.get());
+        if (update.getOldObjectId() != null) {
+          oldTip = or.rw.parseCommit(update.getOldObjectId());
+        } else if (Objects.equals(or.repo.getFullBranch(), name.get())
+            || Objects.equals(RefNames.REFS_CONFIG, name.get())) {
+          oldTip = null;
+          update.setExpectedOldObjectId(ObjectId.zeroId());
+        } else {
+          throw new IntegrationException(
+              "The destination branch " + name + " does not exist anymore.");
+        }
+      } catch (IOException e) {
+        throw new IntegrationException("Cannot open branch " + name, e);
+      }
+    }
+  }
+
+  private final Map<Project.NameKey, OpenRepo> openRepos;
+  private final BatchUpdate.Factory batchUpdateFactory;
+  private final OnSubmitValidators.Factory onSubmitValidatorsFactory;
+  private final GitRepositoryManager repoManager;
+  private final ProjectCache projectCache;
+
+  private ReviewDb db;
+  private Timestamp ts;
+  private IdentifiedUser caller;
+
+  @Inject
+  MergeOpRepoManager(
+      GitRepositoryManager repoManager,
+      ProjectCache projectCache,
+      BatchUpdate.Factory batchUpdateFactory,
+      OnSubmitValidators.Factory onSubmitValidatorsFactory) {
+    this.repoManager = repoManager;
+    this.projectCache = projectCache;
+    this.batchUpdateFactory = batchUpdateFactory;
+    this.onSubmitValidatorsFactory = onSubmitValidatorsFactory;
+
+    openRepos = new HashMap<>();
+  }
+
+  public void setContext(ReviewDb db, Timestamp ts, IdentifiedUser caller) {
+    this.db = db;
+    this.ts = ts;
+    this.caller = caller;
+  }
+
+  public OpenRepo getRepo(Project.NameKey project) throws NoSuchProjectException, IOException {
+    if (openRepos.containsKey(project)) {
+      return openRepos.get(project);
+    }
+
+    ProjectState projectState = projectCache.get(project);
+    if (projectState == null) {
+      throw new NoSuchProjectException(project);
+    }
+    try {
+      OpenRepo or = new OpenRepo(repoManager.openRepository(project), projectState);
+      openRepos.put(project, or);
+      return or;
+    } catch (RepositoryNotFoundException e) {
+      throw new NoSuchProjectException(project, e);
+    }
+  }
+
+  public List<BatchUpdate> batchUpdates(Collection<Project.NameKey> projects)
+      throws NoSuchProjectException, IOException {
+    List<BatchUpdate> updates = new ArrayList<>(projects.size());
+    for (Project.NameKey project : projects) {
+      updates.add(getRepo(project).getUpdate().setRefLogMessage("merged"));
+    }
+    return updates;
+  }
+
+  @Override
+  public void close() {
+    for (OpenRepo repo : openRepos.values()) {
+      repo.close();
+    }
+    openRepos.clear();
+  }
+}
diff --git a/java/com/google/gerrit/server/submit/MergeSorter.java b/java/com/google/gerrit/server/submit/MergeSorter.java
new file mode 100644
index 0000000..6dbec32
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/MergeSorter.java
@@ -0,0 +1,100 @@
+// Copyright (C) 2008 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.google.gerrit.server.submit;
+
+import com.google.gerrit.server.git.CodeReviewCommit;
+import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevCommitList;
+import org.eclipse.jgit.revwalk.RevFlag;
+
+public class MergeSorter {
+  private final CodeReviewRevWalk rw;
+  private final RevFlag canMergeFlag;
+  private final Set<RevCommit> accepted;
+  private final Provider<InternalChangeQuery> queryProvider;
+  private final Set<CodeReviewCommit> incoming;
+
+  public MergeSorter(
+      CodeReviewRevWalk rw,
+      Set<RevCommit> alreadyAccepted,
+      RevFlag canMergeFlag,
+      Provider<InternalChangeQuery> queryProvider,
+      Set<CodeReviewCommit> incoming) {
+    this.rw = rw;
+    this.canMergeFlag = canMergeFlag;
+    this.accepted = alreadyAccepted;
+    this.queryProvider = queryProvider;
+    this.incoming = incoming;
+  }
+
+  public Collection<CodeReviewCommit> sort(Collection<CodeReviewCommit> toMerge)
+      throws IOException, OrmException {
+    final Set<CodeReviewCommit> heads = new HashSet<>();
+    final Set<CodeReviewCommit> sort = new HashSet<>(toMerge);
+    while (!sort.isEmpty()) {
+      final CodeReviewCommit n = removeOne(sort);
+
+      rw.resetRetain(canMergeFlag);
+      rw.markStart(n);
+      for (RevCommit c : accepted) {
+        rw.markUninteresting(c);
+      }
+
+      CodeReviewCommit c;
+      RevCommitList<RevCommit> contents = new RevCommitList<>();
+      while ((c = rw.next()) != null) {
+        if (!c.has(canMergeFlag) || !incoming.contains(c)) {
+          // We cannot merge n as it would bring something we
+          // aren't permitted to merge at this time. Drop n.
+          //
+          n.setStatusCode(CommitMergeStatus.MISSING_DEPENDENCY);
+          n.setStatusMessage(
+              CommitMergeStatus.createMissingDependencyMessage(queryProvider, n.name(), c.name()));
+          break;
+        }
+        contents.add(c);
+      }
+
+      if (n.getStatusCode() == CommitMergeStatus.MISSING_DEPENDENCY) {
+        continue;
+      }
+
+      // Anything reachable through us is better merged by just
+      // merging us directly. So prune our ancestors out and let
+      // us merge instead.
+      //
+      sort.removeAll(contents);
+      heads.removeAll(contents);
+      heads.add(n);
+    }
+    return heads;
+  }
+
+  private static <T> T removeOne(Collection<T> c) {
+    final Iterator<T> i = c.iterator();
+    final T r = i.next();
+    i.remove();
+    return r;
+  }
+}
diff --git a/java/com/google/gerrit/server/submit/MergeSuperSet.java b/java/com/google/gerrit/server/submit/MergeSuperSet.java
new file mode 100644
index 0000000..7a600a1
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/MergeSuperSet.java
@@ -0,0 +1,229 @@
+// Copyright (C) 2015 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.google.gerrit.server.submit;
+
+import static com.google.common.base.Preconditions.checkState;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Iterables;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.logging.TraceContext;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.plugincontext.PluginContext;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.jgit.lib.Config;
+
+/**
+ * Calculates the minimal superset of changes required to be merged.
+ *
+ * <p>This includes all parents between a change and the tip of its target branch for the
+ * merging/rebasing submit strategies. For the cherry-pick strategy no additional changes are
+ * included.
+ *
+ * <p>If change.submitWholeTopic is enabled, also all changes of the topic and their parents are
+ * included.
+ */
+public class MergeSuperSet {
+
+  private final Provider<InternalChangeQuery> queryProvider;
+  private final Provider<MergeOpRepoManager> repoManagerProvider;
+  private final DynamicItem<MergeSuperSetComputation> mergeSuperSetComputation;
+  private final PermissionBackend permissionBackend;
+  private final Config cfg;
+  private final ProjectCache projectCache;
+
+  private MergeOpRepoManager orm;
+  private boolean closeOrm;
+
+  @Inject
+  MergeSuperSet(
+      @GerritServerConfig Config cfg,
+      Provider<InternalChangeQuery> queryProvider,
+      Provider<MergeOpRepoManager> repoManagerProvider,
+      DynamicItem<MergeSuperSetComputation> mergeSuperSetComputation,
+      PermissionBackend permissionBackend,
+      ProjectCache projectCache) {
+    this.cfg = cfg;
+    this.queryProvider = queryProvider;
+    this.repoManagerProvider = repoManagerProvider;
+    this.mergeSuperSetComputation = mergeSuperSetComputation;
+    this.permissionBackend = permissionBackend;
+    this.projectCache = projectCache;
+  }
+
+  public static boolean wholeTopicEnabled(Config config) {
+    return config.getBoolean("change", null, "submitWholeTopic", false);
+  }
+
+  public MergeSuperSet setMergeOpRepoManager(MergeOpRepoManager orm) {
+    checkState(this.orm == null);
+    this.orm = requireNonNull(orm);
+    closeOrm = false;
+    return this;
+  }
+
+  public ChangeSet completeChangeSet(ReviewDb db, Change change, CurrentUser user)
+      throws IOException, OrmException, PermissionBackendException {
+    try {
+      if (orm == null) {
+        orm = repoManagerProvider.get();
+        closeOrm = true;
+      }
+      List<ChangeData> cds = queryProvider.get().byLegacyChangeId(change.getId());
+      checkState(cds.size() == 1, "Expected exactly one ChangeData, got " + cds.size());
+      ChangeData cd = Iterables.getFirst(cds, null);
+
+      boolean visible = false;
+      if (cd != null) {
+        ProjectState projectState = projectCache.checkedGet(cd.project());
+
+        if (projectState.statePermitsRead()) {
+          try {
+            permissionBackend.user(user).change(cd).database(db).check(ChangePermission.READ);
+            visible = true;
+          } catch (AuthException e) {
+            // Do nothing.
+          }
+        }
+      }
+
+      ChangeSet changeSet = new ChangeSet(cd, visible);
+      if (wholeTopicEnabled(cfg)) {
+        return completeChangeSetIncludingTopics(db, changeSet, user);
+      }
+      try (TraceContext traceContext = PluginContext.newTrace(mergeSuperSetComputation)) {
+        return mergeSuperSetComputation.get().completeWithoutTopic(db, orm, changeSet, user);
+      }
+    } finally {
+      if (closeOrm && orm != null) {
+        orm.close();
+        orm = null;
+      }
+    }
+  }
+
+  /**
+   * Completes {@code changeSet} with any additional changes from its topics
+   *
+   * <p>{@link #completeChangeSetIncludingTopics} calls this repeatedly, alternating with {@link
+   * MergeSuperSetComputation#completeWithoutTopic(ReviewDb, MergeOpRepoManager, ChangeSet,
+   * CurrentUser)}, to discover what additional changes should be submitted with a change until the
+   * set stops growing.
+   *
+   * <p>{@code topicsSeen} and {@code visibleTopicsSeen} keep track of topics already explored to
+   * avoid wasted work.
+   *
+   * @return the resulting larger {@link ChangeSet}
+   */
+  private ChangeSet topicClosure(
+      ReviewDb db,
+      ChangeSet changeSet,
+      CurrentUser user,
+      Set<String> topicsSeen,
+      Set<String> visibleTopicsSeen)
+      throws OrmException, PermissionBackendException, IOException {
+    List<ChangeData> visibleChanges = new ArrayList<>();
+    List<ChangeData> nonVisibleChanges = new ArrayList<>();
+
+    for (ChangeData cd : changeSet.changes()) {
+      visibleChanges.add(cd);
+      String topic = cd.change().getTopic();
+      if (Strings.isNullOrEmpty(topic) || visibleTopicsSeen.contains(topic)) {
+        continue;
+      }
+      for (ChangeData topicCd : byTopicOpen(topic)) {
+        if (canRead(db, user, topicCd)) {
+          visibleChanges.add(topicCd);
+        } else {
+          nonVisibleChanges.add(topicCd);
+        }
+      }
+      topicsSeen.add(topic);
+      visibleTopicsSeen.add(topic);
+    }
+    for (ChangeData cd : changeSet.nonVisibleChanges()) {
+      nonVisibleChanges.add(cd);
+      String topic = cd.change().getTopic();
+      if (Strings.isNullOrEmpty(topic) || topicsSeen.contains(topic)) {
+        continue;
+      }
+      for (ChangeData topicCd : byTopicOpen(topic)) {
+        nonVisibleChanges.add(topicCd);
+      }
+      topicsSeen.add(topic);
+    }
+    return new ChangeSet(visibleChanges, nonVisibleChanges);
+  }
+
+  private ChangeSet completeChangeSetIncludingTopics(
+      ReviewDb db, ChangeSet changeSet, CurrentUser user)
+      throws IOException, OrmException, PermissionBackendException {
+    Set<String> topicsSeen = new HashSet<>();
+    Set<String> visibleTopicsSeen = new HashSet<>();
+    int oldSeen;
+    int seen;
+
+    changeSet = topicClosure(db, changeSet, user, topicsSeen, visibleTopicsSeen);
+    seen = topicsSeen.size() + visibleTopicsSeen.size();
+
+    do {
+      oldSeen = seen;
+      try (TraceContext traceContext = PluginContext.newTrace(mergeSuperSetComputation)) {
+        changeSet = mergeSuperSetComputation.get().completeWithoutTopic(db, orm, changeSet, user);
+      }
+      changeSet = topicClosure(db, changeSet, user, topicsSeen, visibleTopicsSeen);
+      seen = topicsSeen.size() + visibleTopicsSeen.size();
+    } while (seen != oldSeen);
+    return changeSet;
+  }
+
+  private List<ChangeData> byTopicOpen(String topic) throws OrmException {
+    return queryProvider.get().byTopicOpen(topic);
+  }
+
+  private boolean canRead(ReviewDb db, CurrentUser user, ChangeData cd)
+      throws PermissionBackendException, IOException {
+    ProjectState projectState = projectCache.checkedGet(cd.project());
+    if (projectState == null || !projectState.statePermitsRead()) {
+      return false;
+    }
+
+    try {
+      permissionBackend.user(user).change(cd).database(db).check(ChangePermission.READ);
+      return true;
+    } catch (AuthException e) {
+      return false;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/submit/MergeSuperSetComputation.java b/java/com/google/gerrit/server/submit/MergeSuperSetComputation.java
new file mode 100644
index 0000000..dd9ad9b
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/MergeSuperSetComputation.java
@@ -0,0 +1,53 @@
+// Copyright (C) 2017 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.google.gerrit.server.submit;
+
+import com.google.gerrit.extensions.annotations.ExtensionPoint;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gwtorm.server.OrmException;
+import java.io.IOException;
+
+/**
+ * Interface to compute the merge super set to detect changes that should be submitted together.
+ *
+ * <p>E.g. to speed up performance implementations could decide to do the computation in batches in
+ * parallel on different server nodes.
+ */
+@ExtensionPoint
+public interface MergeSuperSetComputation {
+
+  /**
+   * Compute the set of changes that should be submitted together. As input a set of changes is
+   * provided for which it is known that they should be submitted together. This method should
+   * complete the set by including open predecessor changes that need to be submitted as well. To
+   * decide whether open predecessor changes should be included the method must take the submit type
+   * into account (e.g. for changes with submit type "Cherry-Pick" open predecessor changes must not
+   * be included).
+   *
+   * <p>This method is invoked iteratively while new changes to be submitted together are discovered
+   * by expanding the topics of the changes. This method must not do any topic expansion on its own.
+   *
+   * @param db {@link ReviewDb} instance
+   * @param orm {@link MergeOpRepoManager} that should be used to access repositories
+   * @param changeSet A set of changes for which it is known that they should be submitted together
+   * @param user The user for which the visibility checks should be performed
+   * @return the completed set of changes that should be submitted together
+   */
+  ChangeSet completeWithoutTopic(
+      ReviewDb db, MergeOpRepoManager orm, ChangeSet changeSet, CurrentUser user)
+      throws OrmException, IOException, PermissionBackendException;
+}
diff --git a/java/com/google/gerrit/server/submit/RebaseAlways.java b/java/com/google/gerrit/server/submit/RebaseAlways.java
new file mode 100644
index 0000000..7acfeb4
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/RebaseAlways.java
@@ -0,0 +1,22 @@
+// 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.
+
+package com.google.gerrit.server.submit;
+
+public class RebaseAlways extends RebaseSubmitStrategy {
+
+  RebaseAlways(SubmitStrategy.Arguments args) {
+    super(args, true);
+  }
+}
diff --git a/java/com/google/gerrit/server/submit/RebaseIfNecessary.java b/java/com/google/gerrit/server/submit/RebaseIfNecessary.java
new file mode 100644
index 0000000..2f84de6
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/RebaseIfNecessary.java
@@ -0,0 +1,22 @@
+// Copyright (C) 2012 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.google.gerrit.server.submit;
+
+public class RebaseIfNecessary extends RebaseSubmitStrategy {
+
+  RebaseIfNecessary(SubmitStrategy.Arguments args) {
+    super(args, false);
+  }
+}
diff --git a/java/com/google/gerrit/server/submit/RebaseSorter.java b/java/com/google/gerrit/server/submit/RebaseSorter.java
new file mode 100644
index 0000000..32f3558
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/RebaseSorter.java
@@ -0,0 +1,144 @@
+// Copyright (C) 2012 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.google.gerrit.server.submit;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change.Status;
+import com.google.gerrit.server.git.CodeReviewCommit;
+import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevFlag;
+
+public class RebaseSorter {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final CodeReviewRevWalk rw;
+  private final RevFlag canMergeFlag;
+  private final RevCommit initialTip;
+  private final Set<RevCommit> alreadyAccepted;
+  private final Provider<InternalChangeQuery> queryProvider;
+  private final Set<CodeReviewCommit> incoming;
+
+  public RebaseSorter(
+      CodeReviewRevWalk rw,
+      RevCommit initialTip,
+      Set<RevCommit> alreadyAccepted,
+      RevFlag canMergeFlag,
+      Provider<InternalChangeQuery> queryProvider,
+      Set<CodeReviewCommit> incoming) {
+    this.rw = rw;
+    this.canMergeFlag = canMergeFlag;
+    this.initialTip = initialTip;
+    this.alreadyAccepted = alreadyAccepted;
+    this.queryProvider = queryProvider;
+    this.incoming = incoming;
+  }
+
+  public List<CodeReviewCommit> sort(Collection<CodeReviewCommit> toSort)
+      throws IOException, OrmException {
+    final List<CodeReviewCommit> sorted = new ArrayList<>();
+    final Set<CodeReviewCommit> sort = new HashSet<>(toSort);
+    while (!sort.isEmpty()) {
+      final CodeReviewCommit n = removeOne(sort);
+
+      rw.resetRetain(canMergeFlag);
+      rw.markStart(n);
+      if (initialTip != null) {
+        rw.markUninteresting(initialTip);
+      }
+
+      CodeReviewCommit c;
+      final List<CodeReviewCommit> contents = new ArrayList<>();
+      while ((c = rw.next()) != null) {
+        if (!c.has(canMergeFlag) || !incoming.contains(c)) {
+          if (isAlreadyMerged(c, n.change().getDest())) {
+            rw.markUninteresting(c);
+          } else {
+            // We cannot merge n as it would bring something we
+            // aren't permitted to merge at this time. Drop n.
+            //
+            n.setStatusCode(CommitMergeStatus.MISSING_DEPENDENCY);
+            n.setStatusMessage(
+                CommitMergeStatus.createMissingDependencyMessage(
+                    queryProvider, n.name(), c.name()));
+          }
+          // Stop RevWalk because c is either a merged commit or a missing
+          // dependency. Not need to walk further.
+          break;
+        }
+        contents.add(c);
+      }
+
+      if (n.getStatusCode() == CommitMergeStatus.MISSING_DEPENDENCY) {
+        continue;
+      }
+
+      sort.removeAll(contents);
+      Collections.reverse(contents);
+      sorted.removeAll(contents);
+      sorted.addAll(contents);
+    }
+    return sorted;
+  }
+
+  private boolean isAlreadyMerged(CodeReviewCommit commit, Branch.NameKey dest) throws IOException {
+    try (CodeReviewRevWalk mirw = CodeReviewCommit.newRevWalk(rw.getObjectReader())) {
+      mirw.reset();
+      mirw.markStart(commit);
+      // check if the commit is merged in other branches
+      for (RevCommit accepted : alreadyAccepted) {
+        if (mirw.isMergedInto(mirw.parseCommit(commit), mirw.parseCommit(accepted))) {
+          logger.atFine().log(
+              "Dependency %s merged into branch head %s.", commit.getName(), accepted.getName());
+          return true;
+        }
+      }
+
+      // check if the commit associated change is merged in the same branch
+      List<ChangeData> changes = queryProvider.get().byCommit(commit);
+      for (ChangeData change : changes) {
+        if (change.change().getStatus() == Status.MERGED
+            && change.change().getDest().equals(dest)) {
+          logger.atFine().log(
+              "Dependency %s associated with merged change %s.", commit.getName(), change.getId());
+          return true;
+        }
+      }
+      return false;
+    } catch (OrmException e) {
+      throw new IOException(e);
+    }
+  }
+
+  private static <T> T removeOne(Collection<T> c) {
+    final Iterator<T> i = c.iterator();
+    final T r = i.next();
+    i.remove();
+    return r;
+  }
+}
diff --git a/java/com/google/gerrit/server/submit/RebaseSubmitStrategy.java b/java/com/google/gerrit/server/submit/RebaseSubmitStrategy.java
new file mode 100644
index 0000000..cf3a44e
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/RebaseSubmitStrategy.java
@@ -0,0 +1,316 @@
+// Copyright (C) 2012 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.google.gerrit.server.submit;
+
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.gerrit.server.submit.CommitMergeStatus.EMPTY_COMMIT;
+import static com.google.gerrit.server.submit.CommitMergeStatus.SKIPPED_IDENTICAL_TREE;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.extensions.restapi.MergeConflictException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.ChangeUtil;
+import com.google.gerrit.server.change.RebaseChangeOp;
+import com.google.gerrit.server.git.CodeReviewCommit;
+import com.google.gerrit.server.git.MergeTip;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.InvalidChangeOperationException;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.Context;
+import com.google.gerrit.server.update.RepoContext;
+import com.google.gwtorm.server.OrmException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+
+/** This strategy covers RebaseAlways and RebaseIfNecessary ones. */
+public class RebaseSubmitStrategy extends SubmitStrategy {
+  private final boolean rebaseAlways;
+
+  RebaseSubmitStrategy(SubmitStrategy.Arguments args, boolean rebaseAlways) {
+    super(args);
+    this.rebaseAlways = rebaseAlways;
+  }
+
+  @Override
+  public List<SubmitStrategyOp> buildOps(Collection<CodeReviewCommit> toMerge)
+      throws IntegrationException {
+    List<CodeReviewCommit> sorted;
+    try {
+      sorted = args.rebaseSorter.sort(toMerge);
+    } catch (IOException | OrmException e) {
+      throw new IntegrationException("Commit sorting failed", e);
+    }
+    List<SubmitStrategyOp> ops = new ArrayList<>(sorted.size());
+    boolean first = true;
+
+    for (CodeReviewCommit c : sorted) {
+      if (c.getParentCount() > 1) {
+        // Since there is a merge commit, sort and prune again using
+        // MERGE_IF_NECESSARY semantics to avoid creating duplicate
+        // commits.
+        //
+        sorted = args.mergeUtil.reduceToMinimalMerge(args.mergeSorter, sorted);
+        break;
+      }
+    }
+
+    while (!sorted.isEmpty()) {
+      CodeReviewCommit n = sorted.remove(0);
+      if (first && args.mergeTip.getInitialTip() == null) {
+        // TODO(tandrii): Cherry-Pick strategy does this too, but it's wrong
+        // and can be fixed.
+        ops.add(new FastForwardOp(args, n));
+      } else if (n.getParentCount() == 0) {
+        ops.add(new RebaseRootOp(n));
+      } else if (n.getParentCount() == 1) {
+        ops.add(new RebaseOneOp(n));
+      } else {
+        ops.add(new RebaseMultipleParentsOp(n));
+      }
+      first = false;
+    }
+    return ops;
+  }
+
+  private class RebaseRootOp extends SubmitStrategyOp {
+    private RebaseRootOp(CodeReviewCommit toMerge) {
+      super(RebaseSubmitStrategy.this.args, toMerge);
+    }
+
+    @Override
+    public void updateRepoImpl(RepoContext ctx) {
+      // Refuse to merge a root commit into an existing branch, we cannot obtain
+      // a delta for the cherry-pick to apply.
+      toMerge.setStatusCode(CommitMergeStatus.CANNOT_REBASE_ROOT);
+    }
+  }
+
+  private class RebaseOneOp extends SubmitStrategyOp {
+    private RebaseChangeOp rebaseOp;
+    private CodeReviewCommit newCommit;
+    private PatchSet.Id newPatchSetId;
+
+    private RebaseOneOp(CodeReviewCommit toMerge) {
+      super(RebaseSubmitStrategy.this.args, toMerge);
+    }
+
+    @Override
+    public void updateRepoImpl(RepoContext ctx)
+        throws IntegrationException, InvalidChangeOperationException, RestApiException, IOException,
+            OrmException, PermissionBackendException {
+      if (args.mergeUtil.canFastForward(
+          args.mergeSorter, args.mergeTip.getCurrentTip(), args.rw, toMerge)) {
+        if (!rebaseAlways) {
+          if (args.project.is(BooleanProjectConfig.REJECT_EMPTY_COMMIT)
+              && toMerge.getTree().equals(toMerge.getParent(0).getTree())) {
+            toMerge.setStatusCode(EMPTY_COMMIT);
+            return;
+          }
+
+          args.mergeTip.moveTipTo(amendGitlink(toMerge), toMerge);
+          toMerge.setStatusCode(CommitMergeStatus.CLEAN_MERGE);
+          acceptMergeTip(args.mergeTip);
+          return;
+        }
+        // RebaseAlways means we modify commit message.
+        args.rw.parseBody(toMerge);
+        newPatchSetId =
+            ChangeUtil.nextPatchSetIdFromChangeRefsMap(
+                ctx.getRepoView().getRefs(getId().toRefPrefix()),
+                toMerge.change().currentPatchSetId());
+        RevCommit mergeTip = args.mergeTip.getCurrentTip();
+        args.rw.parseBody(mergeTip);
+        String cherryPickCmtMsg = args.mergeUtil.createCommitMessageOnSubmit(toMerge, mergeTip);
+        PersonIdent committer =
+            args.caller.newCommitterIdent(ctx.getWhen(), args.serverIdent.getTimeZone());
+        try {
+          newCommit =
+              args.mergeUtil.createCherryPickFromCommit(
+                  ctx.getInserter(),
+                  ctx.getRepoView().getConfig(),
+                  args.mergeTip.getCurrentTip(),
+                  toMerge,
+                  committer,
+                  cherryPickCmtMsg,
+                  args.rw,
+                  0,
+                  true,
+                  false);
+        } catch (MergeConflictException mce) {
+          // Unlike in Cherry-pick case, this should never happen.
+          toMerge.setStatusCode(CommitMergeStatus.REBASE_MERGE_CONFLICT);
+          throw new IllegalStateException("MergeConflictException on message edit must not happen");
+        } catch (MergeIdenticalTreeException mie) {
+          // this should not happen
+          toMerge.setStatusCode(SKIPPED_IDENTICAL_TREE);
+          return;
+        }
+        ctx.addRefUpdate(ObjectId.zeroId(), newCommit, newPatchSetId.toRefName());
+      } else {
+        // Stale read of patch set is ok; see comments in RebaseChangeOp.
+        PatchSet origPs = args.psUtil.get(ctx.getDb(), toMerge.getNotes(), toMerge.getPatchsetId());
+        rebaseOp =
+            args.rebaseFactory
+                .create(toMerge.notes(), origPs, args.mergeTip.getCurrentTip())
+                .setFireRevisionCreated(false)
+                // Bypass approval copier since SubmitStrategyOp copy all approvals
+                // later anyway.
+                .setCopyApprovals(false)
+                .setValidate(false)
+                .setCheckAddPatchSetPermission(false)
+                // RebaseAlways should set always modify commit message like
+                // Cherry-Pick strategy.
+                .setDetailedCommitMessage(rebaseAlways)
+                // Do not post message after inserting new patchset because there
+                // will be one about change being merged already.
+                .setPostMessage(false)
+                .setMatchAuthorToCommitterDate(
+                    args.project.is(BooleanProjectConfig.MATCH_AUTHOR_TO_COMMITTER_DATE));
+        try {
+          rebaseOp.updateRepo(ctx);
+        } catch (MergeConflictException | NoSuchChangeException e) {
+          toMerge.setStatusCode(CommitMergeStatus.REBASE_MERGE_CONFLICT);
+          throw new IntegrationException(
+              "Cannot rebase " + toMerge.name() + ": " + e.getMessage(), e);
+        }
+        newCommit = args.rw.parseCommit(rebaseOp.getRebasedCommit());
+        newPatchSetId = rebaseOp.getPatchSetId();
+      }
+      if (args.project.is(BooleanProjectConfig.REJECT_EMPTY_COMMIT)
+          && newCommit.getTree().equals(newCommit.getParent(0).getTree())) {
+        toMerge.setStatusCode(EMPTY_COMMIT);
+        return;
+      }
+      newCommit = amendGitlink(newCommit);
+      newCommit.copyFrom(toMerge);
+      newCommit.setPatchsetId(newPatchSetId);
+      newCommit.setStatusCode(CommitMergeStatus.CLEAN_REBASE);
+      args.mergeTip.moveTipTo(newCommit, newCommit);
+      args.commitStatus.put(args.mergeTip.getCurrentTip());
+      acceptMergeTip(args.mergeTip);
+    }
+
+    @Override
+    public PatchSet updateChangeImpl(ChangeContext ctx)
+        throws NoSuchChangeException, ResourceConflictException, OrmException, IOException {
+      if (newCommit == null) {
+        checkState(!rebaseAlways, "RebaseAlways must never fast forward");
+        // otherwise, took the fast-forward option, nothing to do.
+        return null;
+      }
+
+      PatchSet newPs;
+      if (rebaseOp != null) {
+        rebaseOp.updateChange(ctx);
+        newPs = rebaseOp.getPatchSet();
+      } else {
+        // CherryPick
+        PatchSet prevPs = args.psUtil.current(ctx.getDb(), ctx.getNotes());
+        newPs =
+            args.psUtil.insert(
+                ctx.getDb(),
+                ctx.getRevWalk(),
+                ctx.getUpdate(newPatchSetId),
+                newPatchSetId,
+                newCommit,
+                prevPs != null ? prevPs.getGroups() : ImmutableList.<String>of(),
+                null,
+                null);
+      }
+      ctx.getChange()
+          .setCurrentPatchSet(
+              args.patchSetInfoFactory.get(ctx.getRevWalk(), newCommit, newPatchSetId));
+      newCommit.setNotes(ctx.getNotes());
+      return newPs;
+    }
+
+    @Override
+    public void postUpdateImpl(Context ctx) throws OrmException {
+      if (rebaseOp != null) {
+        rebaseOp.postUpdate(ctx);
+      }
+    }
+  }
+
+  private class RebaseMultipleParentsOp extends SubmitStrategyOp {
+    private RebaseMultipleParentsOp(CodeReviewCommit toMerge) {
+      super(RebaseSubmitStrategy.this.args, toMerge);
+    }
+
+    @Override
+    public void updateRepoImpl(RepoContext ctx) throws IntegrationException, IOException {
+      // There are multiple parents, so this is a merge commit. We don't want
+      // to rebase the merge as clients can't easily rebase their history with
+      // that merge present and replaced by an equivalent merge with a different
+      // first parent. So instead behave as though MERGE_IF_NECESSARY was
+      // configured.
+      // TODO(tandrii): this is not in spirit of RebaseAlways strategy because
+      // the commit messages can not be modified in the process. It's also
+      // possible to implement rebasing of merge commits. E.g., the Cherry Pick
+      // REST endpoint already supports cherry-picking of merge commits.
+      // For now, users of RebaseAlways strategy for whom changed commit footers
+      // are important would be well advised to prohibit uploading patches with
+      // merge commits.
+      MergeTip mergeTip = args.mergeTip;
+      if (args.rw.isMergedInto(mergeTip.getCurrentTip(), toMerge)
+          && !args.submoduleOp.hasSubscription(args.destBranch)) {
+        mergeTip.moveTipTo(toMerge, toMerge);
+      } else {
+        PersonIdent caller =
+            ctx.getIdentifiedUser().newCommitterIdent(ctx.getWhen(), ctx.getTimeZone());
+        CodeReviewCommit newTip =
+            args.mergeUtil.mergeOneCommit(
+                caller,
+                caller,
+                args.rw,
+                ctx.getInserter(),
+                ctx.getRepoView().getConfig(),
+                args.destBranch,
+                mergeTip.getCurrentTip(),
+                toMerge);
+        mergeTip.moveTipTo(amendGitlink(newTip), toMerge);
+      }
+      args.mergeUtil.markCleanMerges(
+          args.rw, args.canMergeFlag, mergeTip.getCurrentTip(), args.alreadyAccepted);
+      acceptMergeTip(mergeTip);
+    }
+  }
+
+  private void acceptMergeTip(MergeTip mergeTip) {
+    args.alreadyAccepted.add(mergeTip.getCurrentTip());
+  }
+
+  static boolean dryRun(
+      SubmitDryRun.Arguments args,
+      Repository repo,
+      CodeReviewCommit mergeTip,
+      CodeReviewCommit toMerge)
+      throws IntegrationException {
+    // Test for merge instead of cherry pick to avoid false negatives
+    // on commit chains.
+    return !args.mergeUtil.hasMissingDependencies(args.mergeSorter, toMerge)
+        && args.mergeUtil.canMerge(args.mergeSorter, repo, mergeTip, toMerge);
+  }
+}
diff --git a/java/com/google/gerrit/server/submit/SubmitDryRun.java b/java/com/google/gerrit/server/submit/SubmitDryRun.java
new file mode 100644
index 0000000..e273652
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/SubmitDryRun.java
@@ -0,0 +1,157 @@
+// Copyright (C) 2015 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.google.gerrit.server.submit;
+
+import static java.util.stream.Collectors.toSet;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Streams;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.server.git.CodeReviewCommit;
+import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
+import com.google.gerrit.server.git.MergeUtil;
+import com.google.gerrit.server.project.NoSuchProjectException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Objects;
+import java.util.Set;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevFlag;
+import org.eclipse.jgit.revwalk.RevObject;
+import org.eclipse.jgit.revwalk.RevTag;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+/** Dry run of a submit strategy. */
+public class SubmitDryRun {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  static class Arguments {
+    final Repository repo;
+    final CodeReviewRevWalk rw;
+    final MergeUtil mergeUtil;
+    final MergeSorter mergeSorter;
+
+    Arguments(Repository repo, CodeReviewRevWalk rw, MergeUtil mergeUtil, MergeSorter mergeSorter) {
+      this.repo = repo;
+      this.rw = rw;
+      this.mergeUtil = mergeUtil;
+      this.mergeSorter = mergeSorter;
+    }
+  }
+
+  public static Set<ObjectId> getAlreadyAccepted(Repository repo) throws IOException {
+    return Streams.concat(
+            repo.getRefDatabase().getRefsByPrefix(Constants.R_HEADS).stream(),
+            repo.getRefDatabase().getRefsByPrefix(Constants.R_TAGS).stream())
+        .map(Ref::getObjectId)
+        .filter(Objects::nonNull)
+        .collect(toSet());
+  }
+
+  public static Set<RevCommit> getAlreadyAccepted(Repository repo, RevWalk rw) throws IOException {
+    Set<RevCommit> accepted = new HashSet<>();
+    addCommits(getAlreadyAccepted(repo), rw, accepted);
+    return accepted;
+  }
+
+  public static void addCommits(Iterable<ObjectId> ids, RevWalk rw, Collection<RevCommit> out)
+      throws IOException {
+    for (ObjectId id : ids) {
+      RevObject obj = rw.parseAny(id);
+      if (obj instanceof RevTag) {
+        obj = rw.peel(obj);
+      }
+      if (obj instanceof RevCommit) {
+        out.add((RevCommit) obj);
+      }
+    }
+  }
+
+  private final ProjectCache projectCache;
+  private final MergeUtil.Factory mergeUtilFactory;
+  private final Provider<InternalChangeQuery> queryProvider;
+
+  @Inject
+  SubmitDryRun(
+      ProjectCache projectCache,
+      MergeUtil.Factory mergeUtilFactory,
+      Provider<InternalChangeQuery> queryProvider) {
+    this.projectCache = projectCache;
+    this.mergeUtilFactory = mergeUtilFactory;
+    this.queryProvider = queryProvider;
+  }
+
+  public boolean run(
+      SubmitType submitType,
+      Repository repo,
+      CodeReviewRevWalk rw,
+      Branch.NameKey destBranch,
+      ObjectId tip,
+      ObjectId toMerge,
+      Set<RevCommit> alreadyAccepted)
+      throws IntegrationException, NoSuchProjectException, IOException {
+    CodeReviewCommit tipCommit = rw.parseCommit(tip);
+    CodeReviewCommit toMergeCommit = rw.parseCommit(toMerge);
+    RevFlag canMerge = rw.newFlag("CAN_MERGE");
+    toMergeCommit.add(canMerge);
+    Arguments args =
+        new Arguments(
+            repo,
+            rw,
+            mergeUtilFactory.create(getProject(destBranch)),
+            new MergeSorter(
+                rw, alreadyAccepted, canMerge, queryProvider, ImmutableSet.of(toMergeCommit)));
+
+    switch (submitType) {
+      case CHERRY_PICK:
+        return CherryPick.dryRun(args, tipCommit, toMergeCommit);
+      case FAST_FORWARD_ONLY:
+        return FastForwardOnly.dryRun(args, tipCommit, toMergeCommit);
+      case MERGE_ALWAYS:
+        return MergeAlways.dryRun(args, tipCommit, toMergeCommit);
+      case MERGE_IF_NECESSARY:
+        return MergeIfNecessary.dryRun(args, tipCommit, toMergeCommit);
+      case REBASE_IF_NECESSARY:
+        return RebaseIfNecessary.dryRun(args, repo, tipCommit, toMergeCommit);
+      case REBASE_ALWAYS:
+        return RebaseAlways.dryRun(args, repo, tipCommit, toMergeCommit);
+      case INHERIT:
+      default:
+        String errorMsg = "No submit strategy for: " + submitType;
+        logger.atSevere().log(errorMsg);
+        throw new IntegrationException(errorMsg);
+    }
+  }
+
+  private ProjectState getProject(Branch.NameKey branch) throws NoSuchProjectException {
+    ProjectState p = projectCache.get(branch.getParentKey());
+    if (p == null) {
+      throw new NoSuchProjectException(branch.getParentKey());
+    }
+    return p;
+  }
+}
diff --git a/java/com/google/gerrit/server/submit/SubmitStrategy.java b/java/com/google/gerrit/server/submit/SubmitStrategy.java
new file mode 100644
index 0000000..4cefd7d
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/SubmitStrategy.java
@@ -0,0 +1,268 @@
+// Copyright (C) 2012 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.google.gerrit.server.submit;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Sets;
+import com.google.gerrit.extensions.api.changes.RecipientType;
+import com.google.gerrit.extensions.api.changes.SubmitInput;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.extensions.config.FactoryModule;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.change.LabelNormalizer;
+import com.google.gerrit.server.change.RebaseChangeOp;
+import com.google.gerrit.server.change.TestSubmitInput;
+import com.google.gerrit.server.extensions.events.ChangeMerged;
+import com.google.gerrit.server.git.CodeReviewCommit;
+import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.MergeTip;
+import com.google.gerrit.server.git.MergeUtil;
+import com.google.gerrit.server.git.TagCache;
+import com.google.gerrit.server.git.validators.OnSubmitValidators;
+import com.google.gerrit.server.logging.RequestId;
+import com.google.gerrit.server.patch.PatchSetInfoFactory;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gerrit.server.submit.MergeOp.CommitStatus;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.inject.Inject;
+import com.google.inject.Module;
+import com.google.inject.Provider;
+import com.google.inject.assistedinject.Assisted;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevFlag;
+
+/**
+ * Base class that submit strategies must extend.
+ *
+ * <p>A submit strategy for a certain {@link SubmitType} defines how the submitted commits should be
+ * merged.
+ */
+public abstract class SubmitStrategy {
+  public static Module module() {
+    return new FactoryModule() {
+      @Override
+      protected void configure() {
+        factory(SubmitStrategy.Arguments.Factory.class);
+        factory(EmailMerge.Factory.class);
+      }
+    };
+  }
+
+  static class Arguments {
+    interface Factory {
+      Arguments create(
+          SubmitType submitType,
+          Branch.NameKey destBranch,
+          CommitStatus commitStatus,
+          CodeReviewRevWalk rw,
+          IdentifiedUser caller,
+          MergeTip mergeTip,
+          RevFlag canMergeFlag,
+          ReviewDb db,
+          Set<RevCommit> alreadyAccepted,
+          Set<CodeReviewCommit> incoming,
+          RequestId submissionId,
+          SubmitInput submitInput,
+          ListMultimap<RecipientType, Account.Id> accountsToNotify,
+          SubmoduleOp submoduleOp,
+          boolean dryrun);
+    }
+
+    final AccountCache accountCache;
+    final ApprovalsUtil approvalsUtil;
+    final ChangeMerged changeMerged;
+    final ChangeMessagesUtil cmUtil;
+    final EmailMerge.Factory mergedSenderFactory;
+    final GitRepositoryManager repoManager;
+    final LabelNormalizer labelNormalizer;
+    final PatchSetInfoFactory patchSetInfoFactory;
+    final PatchSetUtil psUtil;
+    final ProjectCache projectCache;
+    final PersonIdent serverIdent;
+    final RebaseChangeOp.Factory rebaseFactory;
+    final OnSubmitValidators.Factory onSubmitValidatorsFactory;
+    final TagCache tagCache;
+    final Provider<InternalChangeQuery> queryProvider;
+
+    final Branch.NameKey destBranch;
+    final CodeReviewRevWalk rw;
+    final CommitStatus commitStatus;
+    final IdentifiedUser caller;
+    final MergeTip mergeTip;
+    final RevFlag canMergeFlag;
+    final ReviewDb db;
+    final Set<RevCommit> alreadyAccepted;
+    final RequestId submissionId;
+    final SubmitType submitType;
+    final SubmitInput submitInput;
+    final ListMultimap<RecipientType, Account.Id> accountsToNotify;
+    final SubmoduleOp submoduleOp;
+
+    final ProjectState project;
+    final MergeSorter mergeSorter;
+    final RebaseSorter rebaseSorter;
+    final MergeUtil mergeUtil;
+    final boolean dryrun;
+
+    @Inject
+    Arguments(
+        AccountCache accountCache,
+        ApprovalsUtil approvalsUtil,
+        ChangeMerged changeMerged,
+        ChangeMessagesUtil cmUtil,
+        EmailMerge.Factory mergedSenderFactory,
+        GitRepositoryManager repoManager,
+        LabelNormalizer labelNormalizer,
+        MergeUtil.Factory mergeUtilFactory,
+        PatchSetInfoFactory patchSetInfoFactory,
+        PatchSetUtil psUtil,
+        @GerritPersonIdent PersonIdent serverIdent,
+        ProjectCache projectCache,
+        RebaseChangeOp.Factory rebaseFactory,
+        OnSubmitValidators.Factory onSubmitValidatorsFactory,
+        TagCache tagCache,
+        Provider<InternalChangeQuery> queryProvider,
+        @Assisted Branch.NameKey destBranch,
+        @Assisted CommitStatus commitStatus,
+        @Assisted CodeReviewRevWalk rw,
+        @Assisted IdentifiedUser caller,
+        @Assisted MergeTip mergeTip,
+        @Assisted RevFlag canMergeFlag,
+        @Assisted ReviewDb db,
+        @Assisted Set<RevCommit> alreadyAccepted,
+        @Assisted Set<CodeReviewCommit> incoming,
+        @Assisted RequestId submissionId,
+        @Assisted SubmitType submitType,
+        @Assisted SubmitInput submitInput,
+        @Assisted ListMultimap<RecipientType, Account.Id> accountsToNotify,
+        @Assisted SubmoduleOp submoduleOp,
+        @Assisted boolean dryrun) {
+      this.accountCache = accountCache;
+      this.approvalsUtil = approvalsUtil;
+      this.changeMerged = changeMerged;
+      this.mergedSenderFactory = mergedSenderFactory;
+      this.repoManager = repoManager;
+      this.cmUtil = cmUtil;
+      this.labelNormalizer = labelNormalizer;
+      this.patchSetInfoFactory = patchSetInfoFactory;
+      this.psUtil = psUtil;
+      this.projectCache = projectCache;
+      this.rebaseFactory = rebaseFactory;
+      this.tagCache = tagCache;
+      this.queryProvider = queryProvider;
+
+      this.serverIdent = serverIdent;
+      this.destBranch = destBranch;
+      this.commitStatus = commitStatus;
+      this.rw = rw;
+      this.caller = caller;
+      this.mergeTip = mergeTip;
+      this.canMergeFlag = canMergeFlag;
+      this.db = db;
+      this.alreadyAccepted = alreadyAccepted;
+      this.submissionId = submissionId;
+      this.submitType = submitType;
+      this.submitInput = submitInput;
+      this.accountsToNotify = accountsToNotify;
+      this.submoduleOp = submoduleOp;
+      this.dryrun = dryrun;
+
+      this.project =
+          requireNonNull(
+              projectCache.get(destBranch.getParentKey()),
+              () -> String.format("project not found: %s", destBranch.getParentKey()));
+      this.mergeSorter =
+          new MergeSorter(rw, alreadyAccepted, canMergeFlag, queryProvider, incoming);
+      this.rebaseSorter =
+          new RebaseSorter(
+              rw, mergeTip.getInitialTip(), alreadyAccepted, canMergeFlag, queryProvider, incoming);
+      this.mergeUtil = mergeUtilFactory.create(project);
+      this.onSubmitValidatorsFactory = onSubmitValidatorsFactory;
+    }
+  }
+
+  final Arguments args;
+
+  SubmitStrategy(Arguments args) {
+    this.args = requireNonNull(args);
+  }
+
+  /**
+   * Add operations to a batch update that execute this submit strategy.
+   *
+   * <p>Guarantees exactly one op is added to the update for each change in the input set.
+   *
+   * @param bu batch update to add operations to.
+   * @param toMerge the set of submitted commits that should be merged using this submit strategy.
+   *     Implementations are responsible for ordering of commits, and will not modify the input in
+   *     place.
+   * @throws IntegrationException if an error occurred initializing the operations (as opposed to an
+   *     error during execution, which will be reported only when the batch update executes the
+   *     operations).
+   */
+  public final void addOps(BatchUpdate bu, Set<CodeReviewCommit> toMerge)
+      throws IntegrationException {
+    List<SubmitStrategyOp> ops = buildOps(toMerge);
+    Set<CodeReviewCommit> added = Sets.newHashSetWithExpectedSize(ops.size());
+
+    for (SubmitStrategyOp op : ops) {
+      added.add(op.getCommit());
+    }
+
+    // First add ops for any implicitly merged changes.
+    List<CodeReviewCommit> difference = new ArrayList<>(Sets.difference(toMerge, added));
+    Collections.reverse(difference);
+    for (CodeReviewCommit c : difference) {
+      Change.Id id = c.change().getId();
+      bu.addOp(id, new ImplicitIntegrateOp(args, c));
+      maybeAddTestHelperOp(bu, id);
+    }
+
+    // Then ops for explicitly merged changes
+    for (SubmitStrategyOp op : ops) {
+      bu.addOp(op.getId(), op);
+      maybeAddTestHelperOp(bu, op.getId());
+    }
+  }
+
+  private void maybeAddTestHelperOp(BatchUpdate bu, Change.Id changeId) {
+    if (args.submitInput instanceof TestSubmitInput) {
+      bu.addOp(changeId, new TestHelperOp(changeId, args));
+    }
+  }
+
+  protected abstract List<SubmitStrategyOp> buildOps(Collection<CodeReviewCommit> toMerge)
+      throws IntegrationException;
+}
diff --git a/java/com/google/gerrit/server/submit/SubmitStrategyFactory.java b/java/com/google/gerrit/server/submit/SubmitStrategyFactory.java
new file mode 100644
index 0000000..7f70f37
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/SubmitStrategyFactory.java
@@ -0,0 +1,103 @@
+// Copyright (C) 2012 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.google.gerrit.server.submit;
+
+import com.google.common.collect.ListMultimap;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.changes.RecipientType;
+import com.google.gerrit.extensions.api.changes.SubmitInput;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.git.CodeReviewCommit;
+import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
+import com.google.gerrit.server.git.MergeTip;
+import com.google.gerrit.server.logging.RequestId;
+import com.google.gerrit.server.submit.MergeOp.CommitStatus;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.Set;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevFlag;
+
+/** Factory to create a {@link SubmitStrategy} for a {@link SubmitType}. */
+@Singleton
+public class SubmitStrategyFactory {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final SubmitStrategy.Arguments.Factory argsFactory;
+
+  @Inject
+  SubmitStrategyFactory(SubmitStrategy.Arguments.Factory argsFactory) {
+    this.argsFactory = argsFactory;
+  }
+
+  public SubmitStrategy create(
+      SubmitType submitType,
+      ReviewDb db,
+      CodeReviewRevWalk rw,
+      RevFlag canMergeFlag,
+      Set<RevCommit> alreadyAccepted,
+      Set<CodeReviewCommit> incoming,
+      Branch.NameKey destBranch,
+      IdentifiedUser caller,
+      MergeTip mergeTip,
+      CommitStatus commitStatus,
+      RequestId submissionId,
+      SubmitInput submitInput,
+      ListMultimap<RecipientType, Account.Id> accountsToNotify,
+      SubmoduleOp submoduleOp,
+      boolean dryrun)
+      throws IntegrationException {
+    SubmitStrategy.Arguments args =
+        argsFactory.create(
+            submitType,
+            destBranch,
+            commitStatus,
+            rw,
+            caller,
+            mergeTip,
+            canMergeFlag,
+            db,
+            alreadyAccepted,
+            incoming,
+            submissionId,
+            submitInput,
+            accountsToNotify,
+            submoduleOp,
+            dryrun);
+    switch (submitType) {
+      case CHERRY_PICK:
+        return new CherryPick(args);
+      case FAST_FORWARD_ONLY:
+        return new FastForwardOnly(args);
+      case MERGE_ALWAYS:
+        return new MergeAlways(args);
+      case MERGE_IF_NECESSARY:
+        return new MergeIfNecessary(args);
+      case REBASE_IF_NECESSARY:
+        return new RebaseIfNecessary(args);
+      case REBASE_ALWAYS:
+        return new RebaseAlways(args);
+      case INHERIT:
+      default:
+        String errorMsg = "No submit strategy for: " + submitType;
+        logger.atSevere().log(errorMsg);
+        throw new IntegrationException(errorMsg);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/submit/SubmitStrategyListener.java b/java/com/google/gerrit/server/submit/SubmitStrategyListener.java
new file mode 100644
index 0000000..d1f847b
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/SubmitStrategyListener.java
@@ -0,0 +1,165 @@
+// 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.
+
+package com.google.gerrit.server.submit;
+
+import com.google.common.base.CharMatcher;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.changes.SubmitInput;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.change.TestSubmitInput;
+import com.google.gerrit.server.git.CodeReviewCommit;
+import com.google.gerrit.server.submit.MergeOp.CommitStatus;
+import com.google.gerrit.server.update.BatchUpdateListener;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.jgit.revwalk.RevCommit;
+
+public class SubmitStrategyListener implements BatchUpdateListener {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final Collection<SubmitStrategy> strategies;
+  private final CommitStatus commitStatus;
+  private final boolean failAfterRefUpdates;
+
+  public SubmitStrategyListener(
+      SubmitInput input, Collection<SubmitStrategy> strategies, CommitStatus commitStatus) {
+    this.strategies = strategies;
+    this.commitStatus = commitStatus;
+    if (input instanceof TestSubmitInput) {
+      failAfterRefUpdates = ((TestSubmitInput) input).failAfterRefUpdates;
+    } else {
+      failAfterRefUpdates = false;
+    }
+  }
+
+  @Override
+  public void afterUpdateRepos() throws ResourceConflictException {
+    try {
+      markCleanMerges();
+      List<Change.Id> alreadyMerged = checkCommitStatus();
+      findUnmergedChanges(alreadyMerged);
+    } catch (IntegrationException e) {
+      throw new ResourceConflictException(e.getMessage(), e);
+    }
+  }
+
+  @Override
+  public void afterUpdateRefs() throws ResourceConflictException {
+    if (failAfterRefUpdates) {
+      throw new ResourceConflictException("Failing after ref updates");
+    }
+  }
+
+  private void findUnmergedChanges(List<Change.Id> alreadyMerged)
+      throws ResourceConflictException, IntegrationException {
+    for (SubmitStrategy strategy : strategies) {
+      if (strategy instanceof CherryPick) {
+        // Can't do this sanity check for CherryPick since:
+        // * CherryPick might have picked a subset of changes
+        // * CherryPick might have status SKIPPED_IDENTICAL_TREE
+        continue;
+      }
+      SubmitStrategy.Arguments args = strategy.args;
+      Set<Change.Id> unmerged =
+          args.mergeUtil.findUnmergedChanges(
+              args.commitStatus.getChangeIds(args.destBranch),
+              args.rw,
+              args.canMergeFlag,
+              args.mergeTip.getInitialTip(),
+              args.mergeTip.getCurrentTip(),
+              alreadyMerged);
+      for (Change.Id id : unmerged) {
+        commitStatus.problem(id, "internal error: change not reachable from new branch tip");
+      }
+    }
+    commitStatus.maybeFailVerbose();
+  }
+
+  private void markCleanMerges() throws IntegrationException {
+    for (SubmitStrategy strategy : strategies) {
+      SubmitStrategy.Arguments args = strategy.args;
+      RevCommit initialTip = args.mergeTip.getInitialTip();
+      args.mergeUtil.markCleanMerges(
+          args.rw,
+          args.canMergeFlag,
+          args.mergeTip.getCurrentTip(),
+          initialTip == null ? ImmutableSet.<RevCommit>of() : ImmutableSet.of(initialTip));
+    }
+  }
+
+  private List<Change.Id> checkCommitStatus() throws ResourceConflictException {
+    List<Change.Id> alreadyMerged = new ArrayList<>(commitStatus.getChangeIds().size());
+    for (Change.Id id : commitStatus.getChangeIds()) {
+      CodeReviewCommit commit = commitStatus.get(id);
+      CommitMergeStatus s = commit != null ? commit.getStatusCode() : null;
+      if (s == null) {
+        logger.atSevere().log("change %d: change not processed by merge strategy", id.get());
+        commitStatus.problem(id, "internal error: change not processed by merge strategy");
+        continue;
+      }
+      if (commit.getStatusMessage().isPresent()) {
+        logger.atFine().log(
+            "change %d: Status for commit %s is %s. %s",
+            id.get(), commit.name(), s, commit.getStatusMessage().get());
+      } else {
+        logger.atFine().log("change %d: Status for commit %s is %s.", id.get(), commit.name(), s);
+      }
+      switch (s) {
+        case CLEAN_MERGE:
+        case CLEAN_REBASE:
+        case CLEAN_PICK:
+        case SKIPPED_IDENTICAL_TREE:
+          break; // Merge strategy accepted this change.
+
+        case ALREADY_MERGED:
+          // Already an ancestor of tip.
+          alreadyMerged.add(commit.getPatchsetId().getParentKey());
+          break;
+
+        case PATH_CONFLICT:
+        case REBASE_MERGE_CONFLICT:
+        case MANUAL_RECURSIVE_MERGE:
+        case CANNOT_CHERRY_PICK_ROOT:
+        case CANNOT_REBASE_ROOT:
+        case NOT_FAST_FORWARD:
+        case EMPTY_COMMIT:
+        case MISSING_DEPENDENCY:
+          // TODO(dborowitz): Reformat these messages to be more appropriate for
+          // short problem descriptions.
+          String message = s.getDescription();
+          if (commit.getStatusMessage().isPresent()) {
+            message += " " + commit.getStatusMessage().get();
+          }
+          commitStatus.problem(id, CharMatcher.is('\n').collapseFrom(message, ' '));
+          break;
+
+        default:
+          commitStatus.problem(id, "unspecified merge failure: " + s);
+          break;
+      }
+    }
+    commitStatus.maybeFailVerbose();
+    return alreadyMerged;
+  }
+
+  @Override
+  public void afterUpdateChanges() throws ResourceConflictException {
+    commitStatus.maybeFail("Error updating status");
+  }
+}
diff --git a/java/com/google/gerrit/server/submit/SubmitStrategyOp.java b/java/com/google/gerrit/server/submit/SubmitStrategyOp.java
new file mode 100644
index 0000000..8a4fbfb
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/SubmitStrategyOp.java
@@ -0,0 +1,596 @@
+// 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.
+
+package com.google.gerrit.server.submit;
+
+import static com.google.common.base.MoreObjects.firstNonNull;
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.gerrit.server.notedb.ReviewerStateInternal.REVIEWER;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Iterables;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.SubmitRecord;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.LabelId;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.reviewdb.server.ReviewDbUtil;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.change.LabelNormalizer;
+import com.google.gerrit.server.git.CodeReviewCommit;
+import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
+import com.google.gerrit.server.git.GroupCollector;
+import com.google.gerrit.server.git.MergeUtil;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.Context;
+import com.google.gerrit.server.update.RepoContext;
+import com.google.gwtorm.server.OrmException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import org.eclipse.jgit.errors.IncorrectObjectTypeException;
+import org.eclipse.jgit.errors.MissingObjectException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.transport.ReceiveCommand;
+
+abstract class SubmitStrategyOp implements BatchUpdateOp {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  protected final SubmitStrategy.Arguments args;
+  protected final CodeReviewCommit toMerge;
+
+  private ReceiveCommand command;
+  private PatchSetApproval submitter;
+  private ObjectId mergeResultRev;
+  private PatchSet mergedPatchSet;
+  private Change updatedChange;
+  private CodeReviewCommit alreadyMergedCommit;
+  private boolean changeAlreadyMerged;
+
+  protected SubmitStrategyOp(SubmitStrategy.Arguments args, CodeReviewCommit toMerge) {
+    this.args = args;
+    this.toMerge = toMerge;
+  }
+
+  final Change.Id getId() {
+    return toMerge.change().getId();
+  }
+
+  final CodeReviewCommit getCommit() {
+    return toMerge;
+  }
+
+  protected final Branch.NameKey getDest() {
+    return toMerge.change().getDest();
+  }
+
+  protected final Project.NameKey getProject() {
+    return getDest().getParentKey();
+  }
+
+  @Override
+  public final void updateRepo(RepoContext ctx) throws Exception {
+    logger.atFine().log(
+        "%s#updateRepo for change %s", getClass().getSimpleName(), toMerge.change().getId());
+    checkState(
+        ctx.getRevWalk() == args.rw,
+        "SubmitStrategyOp requires callers to call BatchUpdate#setRepository with exactly the same"
+            + " CodeReviewRevWalk instance from the SubmitStrategy.Arguments: %s != %s",
+        ctx.getRevWalk(),
+        args.rw);
+    // Run the submit strategy implementation and record the merge tip state so
+    // we can create the ref update.
+    CodeReviewCommit tipBefore = args.mergeTip.getCurrentTip();
+    alreadyMergedCommit = getAlreadyMergedCommit(ctx);
+    if (alreadyMergedCommit == null) {
+      updateRepoImpl(ctx);
+    } else {
+      logger.atFine().log("Already merged as %s", alreadyMergedCommit.name());
+    }
+    CodeReviewCommit tipAfter = args.mergeTip.getCurrentTip();
+
+    if (Objects.equals(tipBefore, tipAfter)) {
+      logger.atFine().log("Did not move tip");
+      return;
+    } else if (tipAfter == null) {
+      logger.atFine().log("No merge tip, no update to perform");
+      return;
+    }
+    logger.atFine().log("Moved tip from %s to %s", tipBefore, tipAfter);
+
+    checkProjectConfig(ctx, tipAfter);
+
+    // Needed by postUpdate, at which point mergeTip will have advanced further,
+    // so it's easier to just snapshot the command.
+    command =
+        new ReceiveCommand(firstNonNull(tipBefore, ObjectId.zeroId()), tipAfter, getDest().get());
+    ctx.addRefUpdate(command);
+    args.submoduleOp.addBranchTip(getDest(), tipAfter);
+  }
+
+  private void checkProjectConfig(RepoContext ctx, CodeReviewCommit commit)
+      throws IntegrationException {
+    String refName = getDest().get();
+    if (RefNames.REFS_CONFIG.equals(refName)) {
+      logger.atFine().log("Loading new configuration from %s", RefNames.REFS_CONFIG);
+      try {
+        ProjectConfig cfg = new ProjectConfig(getProject());
+        cfg.load(ctx.getRevWalk(), commit);
+      } catch (Exception e) {
+        throw new IntegrationException(
+            "Submit would store invalid"
+                + " project configuration "
+                + commit.name()
+                + " for "
+                + getProject(),
+            e);
+      }
+    }
+  }
+
+  private CodeReviewCommit getAlreadyMergedCommit(RepoContext ctx) throws IOException {
+    CodeReviewCommit tip = args.mergeTip.getInitialTip();
+    if (tip == null) {
+      return null;
+    }
+    CodeReviewRevWalk rw = (CodeReviewRevWalk) ctx.getRevWalk();
+    Change.Id id = getId();
+    String refPrefix = id.toRefPrefix();
+
+    Map<String, ObjectId> refs = ctx.getRepoView().getRefs(refPrefix);
+    List<CodeReviewCommit> commits = new ArrayList<>(refs.size());
+    for (Map.Entry<String, ObjectId> e : refs.entrySet()) {
+      PatchSet.Id psId = PatchSet.Id.fromRef(refPrefix + e.getKey());
+      if (psId == null) {
+        continue;
+      }
+      try {
+        CodeReviewCommit c = rw.parseCommit(e.getValue());
+        c.setPatchsetId(psId);
+        commits.add(c);
+      } catch (MissingObjectException | IncorrectObjectTypeException ex) {
+        continue; // Bogus ref, can't be merged into tip so we don't care.
+      }
+    }
+    commits.sort(
+        ReviewDbUtil.intKeyOrdering().reverse().onResultOf(CodeReviewCommit::getPatchsetId));
+    CodeReviewCommit result = MergeUtil.findAnyMergedInto(rw, commits, tip);
+    if (result == null) {
+      return null;
+    }
+
+    // Some patch set of this change is actually merged into the target
+    // branch, most likely because a previous run of MergeOp failed after
+    // updateRepo, during updateChange.
+    //
+    // Do the best we can to clean this up: mark the change as merged and set
+    // the current patch set. Don't touch the dest branch at all. This can
+    // lead to some odd situations like another change in the set merging in
+    // a different patch set of this change, but that's unavoidable at this
+    // point.  At least the change will end up in the right state.
+    //
+    // TODO(dborowitz): Consider deleting later junk patch set refs. They
+    // presumably don't have PatchSets pointing to them.
+    rw.parseBody(result);
+    result.add(args.canMergeFlag);
+    PatchSet.Id psId = result.getPatchsetId();
+    result.copyFrom(toMerge);
+    result.setPatchsetId(psId); // Got overwriten by copyFrom.
+    result.setStatusCode(CommitMergeStatus.ALREADY_MERGED);
+    args.commitStatus.put(result);
+    return result;
+  }
+
+  @Override
+  public final boolean updateChange(ChangeContext ctx) throws Exception {
+    logger.atFine().log(
+        "%s#updateChange for change %s", getClass().getSimpleName(), toMerge.change().getId());
+    toMerge.setNotes(ctx.getNotes()); // Update change and notes from ctx.
+
+    if (ctx.getChange().getStatus() == Change.Status.MERGED) {
+      // Either another thread won a race, or we are retrying a whole topic submission after one
+      // repo failed with lock failure.
+      if (alreadyMergedCommit == null) {
+        logger.atFine().log(
+            "Change is already merged according to its status, but we were unable to find it"
+                + " merged into the current tip (%s)",
+            args.mergeTip.getCurrentTip().name());
+      } else {
+        logger.atFine().log("Change is already merged");
+      }
+      changeAlreadyMerged = true;
+      return false;
+    }
+
+    if (alreadyMergedCommit != null) {
+      alreadyMergedCommit.setNotes(ctx.getNotes());
+      mergedPatchSet = getOrCreateAlreadyMergedPatchSet(ctx);
+    } else {
+      PatchSet newPatchSet = updateChangeImpl(ctx);
+      PatchSet.Id oldPsId = requireNonNull(toMerge.getPatchsetId());
+      PatchSet.Id newPsId = requireNonNull(ctx.getChange().currentPatchSetId());
+      if (newPatchSet == null) {
+        checkState(
+            oldPsId.equals(newPsId),
+            "patch set advanced from %s to %s but updateChangeImpl did not"
+                + " return new patch set instance",
+            oldPsId,
+            newPsId);
+        // Ok to use stale notes to get the old patch set, which didn't change
+        // during the submit strategy.
+        mergedPatchSet =
+            requireNonNull(
+                args.psUtil.get(ctx.getDb(), ctx.getNotes(), oldPsId),
+                () -> String.format("missing old patch set %s", oldPsId));
+      } else {
+        PatchSet.Id n = newPatchSet.getId();
+        checkState(
+            !n.equals(oldPsId) && n.equals(newPsId),
+            "current patch was %s and is now %s, but updateChangeImpl returned"
+                + " new patch set instance at %s",
+            oldPsId,
+            newPsId,
+            n);
+        mergedPatchSet = newPatchSet;
+      }
+    }
+
+    Change c = ctx.getChange();
+    Change.Id id = c.getId();
+    CodeReviewCommit commit = args.commitStatus.get(id);
+    requireNonNull(commit, () -> String.format("missing commit for change %s", id));
+    CommitMergeStatus s = commit.getStatusCode();
+    requireNonNull(
+        s,
+        () -> String.format("status not set for change %s; expected to previously fail fast", id));
+    logger.atFine().log("Status of change %s (%s) on %s: %s", id, commit.name(), c.getDest(), s);
+    setApproval(ctx, args.caller);
+
+    mergeResultRev =
+        alreadyMergedCommit == null
+            ? args.mergeTip.getMergeResults().get(commit)
+            // Our fixup code is not smart enough to find a merge commit
+            // corresponding to the merge result. This results in a different
+            // ChangeMergedEvent in the fixup case, but we'll just live with that.
+            : alreadyMergedCommit;
+    try {
+      setMerged(ctx, message(ctx, commit, s));
+    } catch (OrmException err) {
+      String msg = "Error updating change status for " + id;
+      logger.atSevere().withCause(err).log(msg);
+      args.commitStatus.logProblem(id, msg);
+      // It's possible this happened before updating anything in the db, but
+      // it's hard to know for sure, so just return true below to be safe.
+    }
+    updatedChange = c;
+    return true;
+  }
+
+  private PatchSet getOrCreateAlreadyMergedPatchSet(ChangeContext ctx)
+      throws IOException, OrmException {
+    PatchSet.Id psId = alreadyMergedCommit.getPatchsetId();
+    logger.atFine().log("Fixing up already-merged patch set %s", psId);
+    PatchSet prevPs = args.psUtil.current(ctx.getDb(), ctx.getNotes());
+    ctx.getRevWalk().parseBody(alreadyMergedCommit);
+    ctx.getChange()
+        .setCurrentPatchSet(
+            psId, alreadyMergedCommit.getShortMessage(), ctx.getChange().getOriginalSubject());
+    PatchSet existing = args.psUtil.get(ctx.getDb(), ctx.getNotes(), psId);
+    if (existing != null) {
+      logger.atFine().log("Patch set row exists, only updating change");
+      return existing;
+    }
+    // No patch set for the already merged commit, although we know it came form
+    // a patch set ref. Fix up the database. Note that this uses the current
+    // user as the uploader, which is as good a guess as any.
+    List<String> groups =
+        prevPs != null ? prevPs.getGroups() : GroupCollector.getDefaultGroups(alreadyMergedCommit);
+    return args.psUtil.insert(
+        ctx.getDb(),
+        ctx.getRevWalk(),
+        ctx.getUpdate(psId),
+        psId,
+        alreadyMergedCommit,
+        groups,
+        null,
+        null);
+  }
+
+  private void setApproval(ChangeContext ctx, IdentifiedUser user)
+      throws OrmException, IOException {
+    Change.Id id = ctx.getChange().getId();
+    List<SubmitRecord> records = args.commitStatus.getSubmitRecords(id);
+    PatchSet.Id oldPsId = toMerge.getPatchsetId();
+    PatchSet.Id newPsId = ctx.getChange().currentPatchSetId();
+
+    logger.atFine().log("Add approval for %s", id);
+    ChangeUpdate origPsUpdate = ctx.getUpdate(oldPsId);
+    origPsUpdate.putReviewer(user.getAccountId(), REVIEWER);
+    LabelNormalizer.Result normalized = approve(ctx, origPsUpdate);
+
+    ChangeUpdate newPsUpdate = ctx.getUpdate(newPsId);
+    newPsUpdate.merge(args.submissionId, records);
+    // If the submit strategy created a new revision (rebase, cherry-pick), copy
+    // approvals as well.
+    if (!newPsId.equals(oldPsId)) {
+      saveApprovals(normalized, ctx, newPsUpdate, true);
+      submitter = convertPatchSet(newPsId).apply(submitter);
+    }
+  }
+
+  private LabelNormalizer.Result approve(ChangeContext ctx, ChangeUpdate update)
+      throws OrmException, IOException {
+    PatchSet.Id psId = update.getPatchSetId();
+    Map<PatchSetApproval.Key, PatchSetApproval> byKey = new HashMap<>();
+    for (PatchSetApproval psa :
+        args.approvalsUtil.byPatchSet(
+            ctx.getDb(), ctx.getNotes(), psId, ctx.getRevWalk(), ctx.getRepoView().getConfig())) {
+      byKey.put(psa.getKey(), psa);
+    }
+
+    submitter =
+        ApprovalsUtil.newApproval(psId, ctx.getUser(), LabelId.legacySubmit(), 1, ctx.getWhen());
+    byKey.put(submitter.getKey(), submitter);
+
+    // Flatten out existing approvals for this patch set based upon the current
+    // permissions. Once the change is closed the approvals are not updated at
+    // presentation view time, except for zero votes used to indicate a reviewer
+    // was added. So we need to make sure votes are accurate now. This way if
+    // permissions get modified in the future, historical records stay accurate.
+    LabelNormalizer.Result normalized =
+        args.labelNormalizer.normalize(ctx.getNotes(), byKey.values());
+    update.putApproval(submitter.getLabel(), submitter.getValue());
+    saveApprovals(normalized, ctx, update, false);
+    return normalized;
+  }
+
+  private void saveApprovals(
+      LabelNormalizer.Result normalized,
+      ChangeContext ctx,
+      ChangeUpdate update,
+      boolean includeUnchanged)
+      throws OrmException {
+    PatchSet.Id psId = update.getPatchSetId();
+    ctx.getDb().patchSetApprovals().upsert(convertPatchSet(normalized.getNormalized(), psId));
+    ctx.getDb().patchSetApprovals().upsert(zero(convertPatchSet(normalized.deleted(), psId)));
+    for (PatchSetApproval psa : normalized.updated()) {
+      update.putApprovalFor(psa.getAccountId(), psa.getLabel(), psa.getValue());
+    }
+    for (PatchSetApproval psa : normalized.deleted()) {
+      update.removeApprovalFor(psa.getAccountId(), psa.getLabel());
+    }
+
+    // TODO(dborowitz): Don't use a label in NoteDb; just check when status
+    // change happened.
+    for (PatchSetApproval psa : normalized.unchanged()) {
+      if (includeUnchanged || psa.isLegacySubmit()) {
+        logger.atFine().log("Adding submit label %s", psa);
+        update.putApprovalFor(psa.getAccountId(), psa.getLabel(), psa.getValue());
+      }
+    }
+  }
+
+  private static Function<PatchSetApproval, PatchSetApproval> convertPatchSet(
+      final PatchSet.Id psId) {
+    return psa -> {
+      if (psa.getPatchSetId().equals(psId)) {
+        return psa;
+      }
+      return new PatchSetApproval(psId, psa);
+    };
+  }
+
+  private static Iterable<PatchSetApproval> convertPatchSet(
+      Iterable<PatchSetApproval> approvals, PatchSet.Id psId) {
+    return Iterables.transform(approvals, convertPatchSet(psId));
+  }
+
+  private static Iterable<PatchSetApproval> zero(Iterable<PatchSetApproval> approvals) {
+    return Iterables.transform(
+        approvals,
+        a -> {
+          PatchSetApproval copy = new PatchSetApproval(a.getPatchSetId(), a);
+          copy.setValue((short) 0);
+          return copy;
+        });
+  }
+
+  private String getByAccountName() {
+    requireNonNull(submitter, "getByAccountName called before submitter populated");
+    Optional<Account> account =
+        args.accountCache.get(submitter.getAccountId()).map(AccountState::getAccount);
+    if (account.isPresent() && account.get().getFullName() != null) {
+      return " by " + account.get().getFullName();
+    }
+    return "";
+  }
+
+  private ChangeMessage message(ChangeContext ctx, CodeReviewCommit commit, CommitMergeStatus s)
+      throws OrmException {
+    requireNonNull(s, "CommitMergeStatus may not be null");
+    String txt = s.getDescription();
+    if (s == CommitMergeStatus.CLEAN_MERGE) {
+      return message(ctx, commit.getPatchsetId(), txt + getByAccountName());
+    } else if (s == CommitMergeStatus.CLEAN_REBASE || s == CommitMergeStatus.CLEAN_PICK) {
+      return message(
+          ctx, commit.getPatchsetId(), txt + " as " + commit.name() + getByAccountName());
+    } else if (s == CommitMergeStatus.SKIPPED_IDENTICAL_TREE) {
+      return message(ctx, commit.getPatchsetId(), txt);
+    } else if (s == CommitMergeStatus.ALREADY_MERGED) {
+      // Best effort to mimic the message that would have happened had this
+      // succeeded the first time around.
+      switch (args.submitType) {
+        case FAST_FORWARD_ONLY:
+        case MERGE_ALWAYS:
+        case MERGE_IF_NECESSARY:
+          return message(ctx, commit, CommitMergeStatus.CLEAN_MERGE);
+        case CHERRY_PICK:
+          return message(ctx, commit, CommitMergeStatus.CLEAN_PICK);
+        case REBASE_IF_NECESSARY:
+        case REBASE_ALWAYS:
+          return message(ctx, commit, CommitMergeStatus.CLEAN_REBASE);
+        case INHERIT:
+        default:
+          throw new IllegalStateException(
+              "unexpected submit type "
+                  + args.submitType.toString()
+                  + " for change "
+                  + commit.change().getId());
+      }
+    } else {
+      throw new IllegalStateException(
+          "unexpected status "
+              + s
+              + " for change "
+              + commit.change().getId()
+              + "; expected to previously fail fast");
+    }
+  }
+
+  private ChangeMessage message(ChangeContext ctx, PatchSet.Id psId, String body) {
+    return ChangeMessagesUtil.newMessage(
+        psId, ctx.getUser(), ctx.getWhen(), body, ChangeMessagesUtil.TAG_MERGED);
+  }
+
+  private void setMerged(ChangeContext ctx, ChangeMessage msg) throws OrmException {
+    Change c = ctx.getChange();
+    ReviewDb db = ctx.getDb();
+    logger.atFine().log("Setting change %s merged", c.getId());
+    c.setStatus(Change.Status.MERGED);
+    c.setSubmissionId(args.submissionId.toStringForStorage());
+
+    // TODO(dborowitz): We need to be able to change the author of the message,
+    // which is not the user from the update context. addMergedMessage was able
+    // to do this in the past.
+    if (msg != null) {
+      args.cmUtil.addChangeMessage(db, ctx.getUpdate(msg.getPatchSetId()), msg);
+    }
+  }
+
+  @Override
+  public final void postUpdate(Context ctx) throws Exception {
+    if (changeAlreadyMerged) {
+      // TODO(dborowitz): This is suboptimal behavior in the presence of retries: postUpdate steps
+      // will never get run for changes that submitted successfully on any but the final attempt.
+      // This is primarily a temporary workaround for the fact that the submitter field is not
+      // populated in the changeAlreadyMerged case.
+      //
+      // If we naively execute postUpdate even if the change is already merged when updateChange
+      // being, then we are subject to a race where postUpdate steps are run twice if two submit
+      // processes run at the same time.
+      logger.atFine().log("Skipping post-update steps for change %s", getId());
+      return;
+    }
+    postUpdateImpl(ctx);
+
+    if (command != null) {
+      args.tagCache.updateFastForward(
+          getProject(), command.getRefName(), command.getOldId(), command.getNewId());
+      // TODO(dborowitz): Move to BatchUpdate? Would also allow us to run once
+      // per project even if multiple changes to refs/meta/config are submitted.
+      if (RefNames.REFS_CONFIG.equals(getDest().get())) {
+        args.projectCache.evict(getProject());
+        ProjectState p = args.projectCache.get(getProject());
+        try (Repository git = args.repoManager.openRepository(getProject())) {
+          git.setGitwebDescription(p.getProject().getDescription());
+        } catch (IOException e) {
+          logger.atSevere().withCause(e).log("cannot update description of %s", p.getName());
+        }
+      }
+    }
+
+    // Assume the change must have been merged at this point, otherwise we would
+    // have failed fast in one of the other steps.
+    try {
+      args.mergedSenderFactory
+          .create(
+              ctx.getProject(),
+              getId(),
+              submitter.getAccountId(),
+              args.submitInput.notify,
+              args.accountsToNotify)
+          .sendAsync();
+    } catch (Exception e) {
+      logger.atSevere().withCause(e).log("Cannot email merged notification for %s", getId());
+    }
+    if (mergeResultRev != null && !args.dryrun) {
+      args.changeMerged.fire(
+          updatedChange,
+          mergedPatchSet,
+          args.accountCache.get(submitter.getAccountId()).orElse(null),
+          args.mergeTip.getCurrentTip().name(),
+          ctx.getWhen());
+    }
+  }
+
+  /**
+   * @see #updateRepo(RepoContext)
+   * @param ctx
+   */
+  protected void updateRepoImpl(RepoContext ctx) throws Exception {}
+
+  /**
+   * @see #updateChange(ChangeContext)
+   * @param ctx
+   * @return a new patch set if one was created by the submit strategy, or null if not.
+   */
+  protected PatchSet updateChangeImpl(ChangeContext ctx) throws Exception {
+    return null;
+  }
+
+  /**
+   * @see #postUpdate(Context)
+   * @param ctx
+   */
+  protected void postUpdateImpl(Context ctx) throws Exception {}
+
+  /**
+   * Amend the commit with gitlink update
+   *
+   * @param commit
+   */
+  protected CodeReviewCommit amendGitlink(CodeReviewCommit commit) throws IntegrationException {
+    if (!args.submoduleOp.hasSubscription(args.destBranch)) {
+      return commit;
+    }
+
+    // Modify the commit with gitlink update
+    try {
+      return args.submoduleOp.composeGitlinksCommit(args.destBranch, commit);
+    } catch (SubmoduleException | IOException e) {
+      throw new IntegrationException(
+          "cannot update gitlink for the commit at branch: " + args.destBranch);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/submit/SubmoduleException.java b/java/com/google/gerrit/server/submit/SubmoduleException.java
new file mode 100644
index 0000000..2367d0a
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/SubmoduleException.java
@@ -0,0 +1,32 @@
+// Copyright (C) 2011 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.google.gerrit.server.submit;
+
+/**
+ * Indicates the gitlink's update cannot be processed at this time.
+ *
+ * <p>Message should be considered user-visible.
+ */
+public class SubmoduleException extends Exception {
+  private static final long serialVersionUID = 1L;
+
+  SubmoduleException(String msg) {
+    super(msg, null);
+  }
+
+  SubmoduleException(String msg, Throwable why) {
+    super(msg, why);
+  }
+}
diff --git a/java/com/google/gerrit/server/submit/SubmoduleOp.java b/java/com/google/gerrit/server/submit/SubmoduleOp.java
new file mode 100644
index 0000000..d3a578f
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/SubmoduleOp.java
@@ -0,0 +1,747 @@
+// Copyright (C) 2011 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.google.gerrit.server.submit;
+
+import static java.util.Comparator.comparing;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.collect.SetMultimap;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.SubscribeSection;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.client.SubmoduleSubscription;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.UsedAt;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.VerboseSuperprojectUpdate;
+import com.google.gerrit.server.git.CodeReviewCommit;
+import com.google.gerrit.server.project.NoSuchProjectException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.submit.MergeOpRepoManager.OpenRepo;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.BatchUpdateListener;
+import com.google.gerrit.server.update.RepoContext;
+import com.google.gerrit.server.update.RepoOnlyOp;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Deque;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import org.apache.commons.lang.StringUtils;
+import org.eclipse.jgit.dircache.DirCache;
+import org.eclipse.jgit.dircache.DirCacheBuilder;
+import org.eclipse.jgit.dircache.DirCacheEditor;
+import org.eclipse.jgit.dircache.DirCacheEditor.DeletePath;
+import org.eclipse.jgit.dircache.DirCacheEditor.PathEdit;
+import org.eclipse.jgit.dircache.DirCacheEntry;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.FileMode;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.RefSpec;
+
+public class SubmoduleOp {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  /** Only used for branches without code review changes */
+  public class GitlinkOp implements RepoOnlyOp {
+    private final Branch.NameKey branch;
+
+    GitlinkOp(Branch.NameKey branch) {
+      this.branch = branch;
+    }
+
+    @Override
+    public void updateRepo(RepoContext ctx) throws Exception {
+      CodeReviewCommit c = composeGitlinksCommit(branch);
+      if (c != null) {
+        ctx.addRefUpdate(c.getParent(0), c, branch.get());
+        addBranchTip(branch, c);
+      }
+    }
+  }
+
+  @Singleton
+  public static class Factory {
+    private final GitModules.Factory gitmodulesFactory;
+    private final Provider<PersonIdent> serverIdent;
+    private final Config cfg;
+    private final ProjectCache projectCache;
+    private final BatchUpdate.Factory batchUpdateFactory;
+
+    @Inject
+    Factory(
+        GitModules.Factory gitmodulesFactory,
+        @GerritPersonIdent Provider<PersonIdent> serverIdent,
+        @GerritServerConfig Config cfg,
+        ProjectCache projectCache,
+        BatchUpdate.Factory batchUpdateFactory) {
+      this.gitmodulesFactory = gitmodulesFactory;
+      this.serverIdent = serverIdent;
+      this.cfg = cfg;
+      this.projectCache = projectCache;
+      this.batchUpdateFactory = batchUpdateFactory;
+    }
+
+    public SubmoduleOp create(Set<Branch.NameKey> updatedBranches, MergeOpRepoManager orm)
+        throws SubmoduleException {
+      return new SubmoduleOp(
+          gitmodulesFactory,
+          serverIdent.get(),
+          cfg,
+          projectCache,
+          batchUpdateFactory,
+          updatedBranches,
+          orm);
+    }
+  }
+
+  private final GitModules.Factory gitmodulesFactory;
+  private final PersonIdent myIdent;
+  private final ProjectCache projectCache;
+  private final BatchUpdate.Factory batchUpdateFactory;
+  private final VerboseSuperprojectUpdate verboseSuperProject;
+  private final boolean enableSuperProjectSubscriptions;
+  private final long maxCombinedCommitMessageSize;
+  private final long maxCommitMessages;
+  private final MergeOpRepoManager orm;
+  private final Map<Branch.NameKey, GitModules> branchGitModules;
+
+  /** Branches updated as part of the enclosing submit or push batch. */
+  private final ImmutableSet<Branch.NameKey> updatedBranches;
+
+  /**
+   * Current branch tips, taking into account commits created during the submit process as well as
+   * submodule updates produced by this class.
+   */
+  private final Map<Branch.NameKey, CodeReviewCommit> branchTips;
+
+  /**
+   * Branches in a superproject that contain submodule subscriptions, plus branches in submodules
+   * which are subscribed to by some superproject.
+   */
+  private final Set<Branch.NameKey> affectedBranches;
+
+  /** Copy of {@link #affectedBranches}, sorted by submodule traversal order. */
+  private final ImmutableSet<Branch.NameKey> sortedBranches;
+
+  /** Multimap of superproject branch to submodule subscriptions contained in that branch. */
+  private final SetMultimap<Branch.NameKey, SubmoduleSubscription> targets;
+
+  /**
+   * Multimap of superproject name to all branch names within that superproject which have submodule
+   * subscriptions.
+   */
+  private final SetMultimap<Project.NameKey, Branch.NameKey> branchesByProject;
+
+  private SubmoduleOp(
+      GitModules.Factory gitmodulesFactory,
+      PersonIdent myIdent,
+      Config cfg,
+      ProjectCache projectCache,
+      BatchUpdate.Factory batchUpdateFactory,
+      Set<Branch.NameKey> updatedBranches,
+      MergeOpRepoManager orm)
+      throws SubmoduleException {
+    this.gitmodulesFactory = gitmodulesFactory;
+    this.myIdent = myIdent;
+    this.projectCache = projectCache;
+    this.batchUpdateFactory = batchUpdateFactory;
+    this.verboseSuperProject =
+        cfg.getEnum("submodule", null, "verboseSuperprojectUpdate", VerboseSuperprojectUpdate.TRUE);
+    this.enableSuperProjectSubscriptions =
+        cfg.getBoolean("submodule", "enableSuperProjectSubscriptions", true);
+    this.maxCombinedCommitMessageSize =
+        cfg.getLong("submodule", "maxCombinedCommitMessageSize", 256 << 10);
+    this.maxCommitMessages = cfg.getLong("submodule", "maxCommitMessages", 1000);
+    this.orm = orm;
+    this.updatedBranches = ImmutableSet.copyOf(updatedBranches);
+    this.targets = MultimapBuilder.hashKeys().hashSetValues().build();
+    this.affectedBranches = new HashSet<>();
+    this.branchTips = new HashMap<>();
+    this.branchGitModules = new HashMap<>();
+    this.branchesByProject = MultimapBuilder.hashKeys().hashSetValues().build();
+    this.sortedBranches = calculateSubscriptionMaps();
+  }
+
+  /**
+   * Calculate the internal maps used by the operation.
+   *
+   * <p>In addition to the return value, the following fields are populated as a side effect:
+   *
+   * <ul>
+   *   <li>{@link #affectedBranches}
+   *   <li>{@link #targets}
+   *   <li>{@link #branchesByProject}
+   * </ul>
+   *
+   * @return the ordered set to be stored in {@link #sortedBranches}.
+   * @throws SubmoduleException if an error occurred walking projects.
+   */
+  // TODO(dborowitz): This setup process is hard to follow, in large part due to the accumulation of
+  // mutable maps, which makes this whole class difficult to understand.
+  //
+  // A cleaner architecture for this process might be:
+  //   1. Separate out the code to parse submodule subscriptions and build up an in-memory data
+  //      structure representing the subscription graph, using a separate class with a properly-
+  //      documented interface.
+  //   2. Walk the graph to produce a work plan. This would be a list of items indicating: create a
+  //      commit in project X reading branch tips for submodules S1..Sn and updating gitlinks in X.
+  //   3. Execute the work plan, i.e. convert the items into BatchUpdate.Ops and add them to the
+  //      relevant updates.
+  //
+  // In addition to improving readability, this approach has the advantage of making (1) and (2)
+  // testable using small tests.
+  private ImmutableSet<Branch.NameKey> calculateSubscriptionMaps() throws SubmoduleException {
+    if (!enableSuperProjectSubscriptions) {
+      logger.atFine().log("Updating superprojects disabled");
+      return null;
+    }
+
+    logger.atFine().log("Calculating superprojects - submodules map");
+    LinkedHashSet<Branch.NameKey> allVisited = new LinkedHashSet<>();
+    for (Branch.NameKey updatedBranch : updatedBranches) {
+      if (allVisited.contains(updatedBranch)) {
+        continue;
+      }
+
+      searchForSuperprojects(updatedBranch, new LinkedHashSet<>(), allVisited);
+    }
+
+    // Since the searchForSuperprojects will add all branches (related or
+    // unrelated) and ensure the superproject's branches get added first before
+    // a submodule branch. Need remove all unrelated branches and reverse
+    // the order.
+    allVisited.retainAll(affectedBranches);
+    reverse(allVisited);
+    return ImmutableSet.copyOf(allVisited);
+  }
+
+  private void searchForSuperprojects(
+      Branch.NameKey current,
+      LinkedHashSet<Branch.NameKey> currentVisited,
+      LinkedHashSet<Branch.NameKey> allVisited)
+      throws SubmoduleException {
+    logger.atFine().log("Now processing %s", current);
+
+    if (currentVisited.contains(current)) {
+      throw new SubmoduleException(
+          "Branch level circular subscriptions detected:  "
+              + printCircularPath(currentVisited, current));
+    }
+
+    if (allVisited.contains(current)) {
+      return;
+    }
+
+    currentVisited.add(current);
+    try {
+      Collection<SubmoduleSubscription> subscriptions =
+          superProjectSubscriptionsForSubmoduleBranch(current);
+      for (SubmoduleSubscription sub : subscriptions) {
+        Branch.NameKey superBranch = sub.getSuperProject();
+        searchForSuperprojects(superBranch, currentVisited, allVisited);
+        targets.put(superBranch, sub);
+        branchesByProject.put(superBranch.getParentKey(), superBranch);
+        affectedBranches.add(superBranch);
+        affectedBranches.add(sub.getSubmodule());
+      }
+    } catch (IOException e) {
+      throw new SubmoduleException("Cannot find superprojects for " + current, e);
+    }
+    currentVisited.remove(current);
+    allVisited.add(current);
+  }
+
+  private static <T> void reverse(LinkedHashSet<T> set) {
+    if (set == null) {
+      return;
+    }
+
+    Deque<T> q = new ArrayDeque<>(set);
+    set.clear();
+
+    while (!q.isEmpty()) {
+      set.add(q.removeLast());
+    }
+  }
+
+  private <T> String printCircularPath(LinkedHashSet<T> p, T target) {
+    StringBuilder sb = new StringBuilder();
+    sb.append(target);
+    ArrayList<T> reverseP = new ArrayList<>(p);
+    Collections.reverse(reverseP);
+    for (T t : reverseP) {
+      sb.append("->");
+      sb.append(t);
+      if (t.equals(target)) {
+        break;
+      }
+    }
+    return sb.toString();
+  }
+
+  private Collection<Branch.NameKey> getDestinationBranches(Branch.NameKey src, SubscribeSection s)
+      throws IOException {
+    Collection<Branch.NameKey> ret = new HashSet<>();
+    logger.atFine().log("Inspecting SubscribeSection %s", s);
+    for (RefSpec r : s.getMatchingRefSpecs()) {
+      logger.atFine().log("Inspecting [matching] ref %s", r);
+      if (!r.matchSource(src.get())) {
+        continue;
+      }
+      if (r.isWildcard()) {
+        // refs/heads/*[:refs/somewhere/*]
+        ret.add(new Branch.NameKey(s.getProject(), r.expandFromSource(src.get()).getDestination()));
+      } else {
+        // e.g. refs/heads/master[:refs/heads/stable]
+        String dest = r.getDestination();
+        if (dest == null) {
+          dest = r.getSource();
+        }
+        ret.add(new Branch.NameKey(s.getProject(), dest));
+      }
+    }
+
+    for (RefSpec r : s.getMultiMatchRefSpecs()) {
+      logger.atFine().log("Inspecting [all] ref %s", r);
+      if (!r.matchSource(src.get())) {
+        continue;
+      }
+      OpenRepo or;
+      try {
+        or = orm.getRepo(s.getProject());
+      } catch (NoSuchProjectException e) {
+        // A project listed a non existent project to be allowed
+        // to subscribe to it. Allow this for now, i.e. no exception is
+        // thrown.
+        continue;
+      }
+
+      for (Ref ref : or.repo.getRefDatabase().getRefsByPrefix(RefNames.REFS_HEADS)) {
+        if (r.getDestination() != null && !r.matchDestination(ref.getName())) {
+          continue;
+        }
+        Branch.NameKey b = new Branch.NameKey(s.getProject(), ref.getName());
+        if (!ret.contains(b)) {
+          ret.add(b);
+        }
+      }
+    }
+    logger.atFine().log("Returning possible branches: %s for project %s", ret, s.getProject());
+    return ret;
+  }
+
+  @UsedAt(UsedAt.Project.PLUGIN_DELETE_PROJECT)
+  public Collection<SubmoduleSubscription> superProjectSubscriptionsForSubmoduleBranch(
+      Branch.NameKey srcBranch) throws IOException {
+    logger.atFine().log("Calculating possible superprojects for %s", srcBranch);
+    Collection<SubmoduleSubscription> ret = new ArrayList<>();
+    Project.NameKey srcProject = srcBranch.getParentKey();
+    for (SubscribeSection s : projectCache.get(srcProject).getSubscribeSections(srcBranch)) {
+      logger.atFine().log("Checking subscribe section %s", s);
+      Collection<Branch.NameKey> branches = getDestinationBranches(srcBranch, s);
+      for (Branch.NameKey targetBranch : branches) {
+        Project.NameKey targetProject = targetBranch.getParentKey();
+        try {
+          OpenRepo or = orm.getRepo(targetProject);
+          ObjectId id = or.repo.resolve(targetBranch.get());
+          if (id == null) {
+            logger.atFine().log("The branch %s doesn't exist.", targetBranch);
+            continue;
+          }
+        } catch (NoSuchProjectException e) {
+          logger.atFine().log("The project %s doesn't exist", targetProject);
+          continue;
+        }
+
+        GitModules m = branchGitModules.get(targetBranch);
+        if (m == null) {
+          m = gitmodulesFactory.create(targetBranch, orm);
+          branchGitModules.put(targetBranch, m);
+        }
+        ret.addAll(m.subscribedTo(srcBranch));
+      }
+    }
+    logger.atFine().log("Calculated superprojects for %s are %s", srcBranch, ret);
+    return ret;
+  }
+
+  public void updateSuperProjects() throws SubmoduleException {
+    ImmutableSet<Project.NameKey> projects = getProjectsInOrder();
+    if (projects == null) {
+      return;
+    }
+
+    LinkedHashSet<Project.NameKey> superProjects = new LinkedHashSet<>();
+    try {
+      for (Project.NameKey project : projects) {
+        // only need superprojects
+        if (branchesByProject.containsKey(project)) {
+          superProjects.add(project);
+          // get a new BatchUpdate for the super project
+          OpenRepo or = orm.getRepo(project);
+          for (Branch.NameKey branch : branchesByProject.get(project)) {
+            addOp(or.getUpdate(), branch);
+          }
+        }
+      }
+      batchUpdateFactory.execute(orm.batchUpdates(superProjects), BatchUpdateListener.NONE, false);
+    } catch (RestApiException | UpdateException | IOException | NoSuchProjectException e) {
+      throw new SubmoduleException("Cannot update gitlinks", e);
+    }
+  }
+
+  /** Create a separate gitlink commit */
+  private CodeReviewCommit composeGitlinksCommit(Branch.NameKey subscriber)
+      throws IOException, SubmoduleException {
+    OpenRepo or;
+    try {
+      or = orm.getRepo(subscriber.getParentKey());
+    } catch (NoSuchProjectException | IOException e) {
+      throw new SubmoduleException("Cannot access superproject", e);
+    }
+
+    CodeReviewCommit currentCommit;
+    if (branchTips.containsKey(subscriber)) {
+      currentCommit = branchTips.get(subscriber);
+    } else {
+      Ref r = or.repo.exactRef(subscriber.get());
+      if (r == null) {
+        throw new SubmoduleException(
+            "The branch was probably deleted from the subscriber repository");
+      }
+      currentCommit = or.rw.parseCommit(r.getObjectId());
+      addBranchTip(subscriber, currentCommit);
+    }
+
+    StringBuilder msgbuf = new StringBuilder();
+    PersonIdent author = null;
+    DirCache dc = readTree(or.rw, currentCommit);
+    DirCacheEditor ed = dc.editor();
+    int count = 0;
+
+    List<SubmoduleSubscription> subscriptions =
+        targets.get(subscriber).stream()
+            .sorted(comparing(SubmoduleSubscription::getPath))
+            .collect(toList());
+    for (SubmoduleSubscription s : subscriptions) {
+      if (count > 0) {
+        msgbuf.append("\n\n");
+      }
+      RevCommit newCommit = updateSubmodule(dc, ed, msgbuf, s);
+      count++;
+      if (newCommit != null) {
+        PersonIdent newCommitAuthor = newCommit.getAuthorIdent();
+        if (author == null) {
+          author = new PersonIdent(newCommitAuthor, myIdent.getWhen());
+        } else if (!author.getName().equals(newCommitAuthor.getName())
+            || !author.getEmailAddress().equals(newCommitAuthor.getEmailAddress())) {
+          author = myIdent;
+        }
+      }
+    }
+    ed.finish();
+    ObjectId newTreeId = dc.writeTree(or.ins);
+
+    // Gitlinks are already in the branch, return null
+    if (newTreeId.equals(currentCommit.getTree())) {
+      return null;
+    }
+    CommitBuilder commit = new CommitBuilder();
+    commit.setTreeId(newTreeId);
+    commit.setParentId(currentCommit);
+    StringBuilder commitMsg = new StringBuilder("Update git submodules\n\n");
+    if (verboseSuperProject != VerboseSuperprojectUpdate.FALSE) {
+      commitMsg.append(msgbuf);
+    }
+    commit.setMessage(commitMsg.toString());
+    commit.setAuthor(author);
+    commit.setCommitter(myIdent);
+    ObjectId id = or.ins.insert(commit);
+    return or.rw.parseCommit(id);
+  }
+
+  /** Amend an existing commit with gitlink updates */
+  CodeReviewCommit composeGitlinksCommit(Branch.NameKey subscriber, CodeReviewCommit currentCommit)
+      throws IOException, SubmoduleException {
+    OpenRepo or;
+    try {
+      or = orm.getRepo(subscriber.getParentKey());
+    } catch (NoSuchProjectException | IOException e) {
+      throw new SubmoduleException("Cannot access superproject", e);
+    }
+
+    StringBuilder msgbuf = new StringBuilder();
+    DirCache dc = readTree(or.rw, currentCommit);
+    DirCacheEditor ed = dc.editor();
+    for (SubmoduleSubscription s : targets.get(subscriber)) {
+      updateSubmodule(dc, ed, msgbuf, s);
+    }
+    ed.finish();
+    ObjectId newTreeId = dc.writeTree(or.ins);
+
+    // Gitlinks are already updated, just return the commit
+    if (newTreeId.equals(currentCommit.getTree())) {
+      return currentCommit;
+    }
+    or.rw.parseBody(currentCommit);
+    CommitBuilder commit = new CommitBuilder();
+    commit.setTreeId(newTreeId);
+    commit.setParentIds(currentCommit.getParents());
+    if (verboseSuperProject != VerboseSuperprojectUpdate.FALSE) {
+      // TODO(czhen): handle cherrypick footer
+      commit.setMessage(currentCommit.getFullMessage() + "\n\n* submodules:\n" + msgbuf.toString());
+    } else {
+      commit.setMessage(currentCommit.getFullMessage());
+    }
+    commit.setAuthor(currentCommit.getAuthorIdent());
+    commit.setCommitter(myIdent);
+    ObjectId id = or.ins.insert(commit);
+    CodeReviewCommit newCommit = or.rw.parseCommit(id);
+    newCommit.copyFrom(currentCommit);
+    return newCommit;
+  }
+
+  private RevCommit updateSubmodule(
+      DirCache dc, DirCacheEditor ed, StringBuilder msgbuf, SubmoduleSubscription s)
+      throws SubmoduleException, IOException {
+    logger.atFine().log("Updating gitlink for %s", s);
+    OpenRepo subOr;
+    try {
+      subOr = orm.getRepo(s.getSubmodule().getParentKey());
+    } catch (NoSuchProjectException | IOException e) {
+      throw new SubmoduleException("Cannot access submodule", e);
+    }
+
+    DirCacheEntry dce = dc.getEntry(s.getPath());
+    RevCommit oldCommit = null;
+    if (dce != null) {
+      if (!dce.getFileMode().equals(FileMode.GITLINK)) {
+        String errMsg =
+            "Requested to update gitlink "
+                + s.getPath()
+                + " in "
+                + s.getSubmodule().getParentKey().get()
+                + " but entry "
+                + "doesn't have gitlink file mode.";
+        throw new SubmoduleException(errMsg);
+      }
+      // Parse the current gitlink entry commit in the subproject repo. This is used to add a
+      // shortlog for this submodule to the commit message in the superproject.
+      //
+      // Even if we don't strictly speaking need that commit message, parsing the commit is a sanity
+      // check that the old gitlink is a commit that actually exists. If not, then there is an
+      // inconsistency between the superproject and subproject state, and we don't want to risk
+      // making things worse by updating the gitlink to something else.
+      try {
+        oldCommit = subOr.rw.parseCommit(dce.getObjectId());
+      } catch (IOException e) {
+        // Broken gitlink; sanity check failed. Warn and continue so the submit operation can
+        // proceed, it will just skip this gitlink update.
+        logger.atSevere().withCause(e).log("Failed to read commit %s", dce.getObjectId().name());
+        return null;
+      }
+    }
+
+    final CodeReviewCommit newCommit;
+    if (branchTips.containsKey(s.getSubmodule())) {
+      // This submodule's branch was updated as part of this specific submit batch: update the
+      // gitlink to point to the new commit from the batch.
+      newCommit = branchTips.get(s.getSubmodule());
+    } else {
+      // For whatever reason, this submodule was not updated as part of this submit batch, but the
+      // superproject is still subscribed to this branch. Re-read the ref to see if anything has
+      // changed since the last time the gitlink was updated, and roll that update into the same
+      // commit as all other submodule updates.
+      Ref ref = subOr.repo.getRefDatabase().exactRef(s.getSubmodule().get());
+      if (ref == null) {
+        ed.add(new DeletePath(s.getPath()));
+        return null;
+      }
+      newCommit = subOr.rw.parseCommit(ref.getObjectId());
+      addBranchTip(s.getSubmodule(), newCommit);
+    }
+
+    if (Objects.equals(newCommit, oldCommit)) {
+      // gitlink have already been updated for this submodule
+      return null;
+    }
+    ed.add(
+        new PathEdit(s.getPath()) {
+          @Override
+          public void apply(DirCacheEntry ent) {
+            ent.setFileMode(FileMode.GITLINK);
+            ent.setObjectId(newCommit.getId());
+          }
+        });
+
+    if (verboseSuperProject != VerboseSuperprojectUpdate.FALSE) {
+      createSubmoduleCommitMsg(msgbuf, s, subOr, newCommit, oldCommit);
+    }
+    subOr.rw.parseBody(newCommit);
+    return newCommit;
+  }
+
+  private void createSubmoduleCommitMsg(
+      StringBuilder msgbuf,
+      SubmoduleSubscription s,
+      OpenRepo subOr,
+      RevCommit newCommit,
+      RevCommit oldCommit)
+      throws SubmoduleException {
+    msgbuf.append("* Update ");
+    msgbuf.append(s.getPath());
+    msgbuf.append(" from branch '");
+    msgbuf.append(s.getSubmodule().getShortName());
+    msgbuf.append("'");
+    msgbuf.append("\n  to ");
+    msgbuf.append(newCommit.getName());
+
+    // newly created submodule gitlink, do not append whole history
+    if (oldCommit == null) {
+      return;
+    }
+
+    try {
+      subOr.rw.resetRetain(subOr.canMergeFlag);
+      subOr.rw.markStart(newCommit);
+      subOr.rw.markUninteresting(oldCommit);
+      int numMessages = 0;
+      for (Iterator<RevCommit> iter = subOr.rw.iterator(); iter.hasNext(); ) {
+        RevCommit c = iter.next();
+        subOr.rw.parseBody(c);
+
+        String message =
+            verboseSuperProject == VerboseSuperprojectUpdate.SUBJECT_ONLY
+                ? c.getShortMessage()
+                : StringUtils.replace(c.getFullMessage(), "\n", "\n    ");
+
+        String bullet = "\n  - ";
+        String ellipsis = "\n\n[...]";
+        int newSize = msgbuf.length() + bullet.length() + message.length();
+        if (++numMessages > maxCommitMessages
+            || newSize > maxCombinedCommitMessageSize
+            || iter.hasNext() && (newSize + ellipsis.length()) > maxCombinedCommitMessageSize) {
+          msgbuf.append(ellipsis);
+          break;
+        }
+        msgbuf.append(bullet);
+        msgbuf.append(message);
+      }
+    } catch (IOException e) {
+      throw new SubmoduleException(
+          "Could not perform a revwalk to create superproject commit message", e);
+    }
+  }
+
+  private static DirCache readTree(RevWalk rw, ObjectId base) throws IOException {
+    final DirCache dc = DirCache.newInCore();
+    final DirCacheBuilder b = dc.builder();
+    b.addTree(
+        new byte[0], // no prefix path
+        DirCacheEntry.STAGE_0, // standard stage
+        rw.getObjectReader(),
+        rw.parseTree(base));
+    b.finish();
+    return dc;
+  }
+
+  ImmutableSet<Project.NameKey> getProjectsInOrder() throws SubmoduleException {
+    LinkedHashSet<Project.NameKey> projects = new LinkedHashSet<>();
+    for (Project.NameKey project : branchesByProject.keySet()) {
+      addAllSubmoduleProjects(project, new LinkedHashSet<>(), projects);
+    }
+
+    for (Branch.NameKey branch : updatedBranches) {
+      projects.add(branch.getParentKey());
+    }
+    return ImmutableSet.copyOf(projects);
+  }
+
+  private void addAllSubmoduleProjects(
+      Project.NameKey project,
+      LinkedHashSet<Project.NameKey> current,
+      LinkedHashSet<Project.NameKey> projects)
+      throws SubmoduleException {
+    if (current.contains(project)) {
+      throw new SubmoduleException(
+          "Project level circular subscriptions detected:  " + printCircularPath(current, project));
+    }
+
+    if (projects.contains(project)) {
+      return;
+    }
+
+    current.add(project);
+    Set<Project.NameKey> subprojects = new HashSet<>();
+    for (Branch.NameKey branch : branchesByProject.get(project)) {
+      Collection<SubmoduleSubscription> subscriptions = targets.get(branch);
+      for (SubmoduleSubscription s : subscriptions) {
+        subprojects.add(s.getSubmodule().getParentKey());
+      }
+    }
+
+    for (Project.NameKey p : subprojects) {
+      addAllSubmoduleProjects(p, current, projects);
+    }
+
+    current.remove(project);
+    projects.add(project);
+  }
+
+  ImmutableSet<Branch.NameKey> getBranchesInOrder() {
+    LinkedHashSet<Branch.NameKey> branches = new LinkedHashSet<>();
+    if (sortedBranches != null) {
+      branches.addAll(sortedBranches);
+    }
+    branches.addAll(updatedBranches);
+    return ImmutableSet.copyOf(branches);
+  }
+
+  boolean hasSubscription(Branch.NameKey branch) {
+    return targets.containsKey(branch);
+  }
+
+  void addBranchTip(Branch.NameKey branch, CodeReviewCommit tip) {
+    branchTips.put(branch, tip);
+  }
+
+  void addOp(BatchUpdate bu, Branch.NameKey branch) {
+    bu.addRepoOnlyOp(new GitlinkOp(branch));
+  }
+}
diff --git a/java/com/google/gerrit/server/submit/TestHelperOp.java b/java/com/google/gerrit/server/submit/TestHelperOp.java
new file mode 100644
index 0000000..bbb198a
--- /dev/null
+++ b/java/com/google/gerrit/server/submit/TestHelperOp.java
@@ -0,0 +1,49 @@
+// Copyright (C) 2017 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.google.gerrit.server.submit;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.change.TestSubmitInput;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.RepoContext;
+import java.io.IOException;
+import java.util.Queue;
+import org.eclipse.jgit.lib.ObjectId;
+
+class TestHelperOp implements BatchUpdateOp {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final Change.Id changeId;
+  private final TestSubmitInput input;
+
+  TestHelperOp(Change.Id changeId, SubmitStrategy.Arguments args) {
+    this.changeId = changeId;
+    this.input = (TestSubmitInput) args.submitInput;
+  }
+
+  @Override
+  public void updateRepo(RepoContext ctx) throws IOException {
+    Queue<Boolean> q = input.generateLockFailures;
+    if (q != null && !q.isEmpty() && q.remove()) {
+      logger.atFine().log(
+          "Adding bogus ref update to trigger lock failure, via change %s", changeId);
+      ctx.addRefUpdate(
+          ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"),
+          ObjectId.zeroId(),
+          "refs/test/" + getClass().getSimpleName());
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/tools/ToolsCatalog.java b/java/com/google/gerrit/server/tools/ToolsCatalog.java
new file mode 100644
index 0000000..aaa366c
--- /dev/null
+++ b/java/com/google/gerrit/server/tools/ToolsCatalog.java
@@ -0,0 +1,230 @@
+// Copyright (C) 2010 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.google.gerrit.server.tools;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.Version;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.SortedMap;
+import java.util.TreeMap;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.util.RawParseUtils;
+
+/**
+ * Listing of all client side tools stored on this server.
+ *
+ * <p>Clients may download these tools through our file server, as they are packaged with our own
+ * software releases.
+ */
+@Singleton
+public class ToolsCatalog {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final SortedMap<String, Entry> toc;
+
+  @Inject
+  ToolsCatalog() throws IOException {
+    this.toc = readToc();
+  }
+
+  /**
+   * Lookup an entry in the tools catalog.
+   *
+   * @param name path of the item, relative to the root of the catalog.
+   * @return the entry; null if the item is not part of the catalog.
+   */
+  @Nullable
+  public Entry get(@Nullable String name) {
+    if (Strings.isNullOrEmpty(name)) {
+      return null;
+    }
+    if (name.startsWith("/")) {
+      name = name.substring(1);
+    }
+    if (name.endsWith("/")) {
+      name = name.substring(0, name.length() - 1);
+    }
+    return toc.get(name);
+  }
+
+  private static SortedMap<String, Entry> readToc() throws IOException {
+    SortedMap<String, Entry> toc = new TreeMap<>();
+    final BufferedReader br =
+        new BufferedReader(new InputStreamReader(new ByteArrayInputStream(read("TOC")), UTF_8));
+    String line;
+    while ((line = br.readLine()) != null) {
+      if (line.length() > 0 && !line.startsWith("#")) {
+        final Entry e = new Entry(Entry.Type.FILE, line);
+        toc.put(e.getPath(), e);
+      }
+    }
+
+    final List<Entry> all = new ArrayList<>(toc.values());
+    for (Entry e : all) {
+      String path = dirOf(e.getPath());
+      while (path != null) {
+        Entry d = toc.get(path);
+        if (d == null) {
+          d = new Entry(Entry.Type.DIR, 0755, path);
+          toc.put(d.getPath(), d);
+        }
+        d.children.add(e);
+        path = dirOf(path);
+        e = d;
+      }
+    }
+
+    final Entry top = new Entry(Entry.Type.DIR, 0755, "");
+    for (Entry e : toc.values()) {
+      if (dirOf(e.getPath()) == null) {
+        top.children.add(e);
+      }
+    }
+    toc.put(top.getPath(), top);
+
+    return Collections.unmodifiableSortedMap(toc);
+  }
+
+  @Nullable
+  private static byte[] read(String path) {
+    String name = "root/" + path;
+    try (InputStream in = ToolsCatalog.class.getResourceAsStream(name)) {
+      if (in == null) {
+        return null;
+      }
+      final ByteArrayOutputStream out = new ByteArrayOutputStream();
+      final byte[] buf = new byte[8192];
+      int n;
+      while ((n = in.read(buf, 0, buf.length)) > 0) {
+        out.write(buf, 0, n);
+      }
+      return out.toByteArray();
+    } catch (Exception e) {
+      logger.atFine().withCause(e).log("Cannot read %s", path);
+      return null;
+    }
+  }
+
+  @Nullable
+  private static String dirOf(String path) {
+    final int s = path.lastIndexOf('/');
+    return s < 0 ? null : path.substring(0, s);
+  }
+
+  /** A file served out of the tools root directory. */
+  public static class Entry {
+    public enum Type {
+      DIR,
+      FILE
+    }
+
+    private final Type type;
+    private final int mode;
+    private final String path;
+    private final List<Entry> children;
+
+    Entry(Type type, String line) {
+      int s = line.indexOf(' ');
+      String mode = line.substring(0, s);
+      String path = line.substring(s + 1);
+
+      this.type = type;
+      this.mode = Integer.parseInt(mode, 8);
+      this.path = path;
+      if (type == Type.FILE) {
+        this.children = Collections.emptyList();
+      } else {
+        this.children = new ArrayList<>();
+      }
+    }
+
+    Entry(Type type, int mode, String path) {
+      this.type = type;
+      this.mode = mode;
+      this.path = path;
+      this.children = new ArrayList<>();
+    }
+
+    public Type getType() {
+      return type;
+    }
+
+    /** @return the preferred UNIX file mode, e.g. {@code 0755}. */
+    public int getMode() {
+      return mode;
+    }
+
+    /** @return path of the entry, relative to the catalog root. */
+    public String getPath() {
+      return path;
+    }
+
+    /** @return name of the entry, within its parent directory. */
+    public String getName() {
+      final int s = path.lastIndexOf('/');
+      return s < 0 ? path : path.substring(s + 1);
+    }
+
+    /** @return collection of entries below this one, if this is a directory. */
+    public List<Entry> getChildren() {
+      return Collections.unmodifiableList(children);
+    }
+
+    /** @return a copy of the file's contents. */
+    public byte[] getBytes() {
+      byte[] data = read(getPath());
+
+      if (isScript(data)) {
+        // Embed Gerrit's version number into the top of the script.
+        //
+        final String version = Version.getVersion();
+        final int lf = RawParseUtils.nextLF(data, 0);
+        if (version != null && lf < data.length) {
+          byte[] versionHeader = Constants.encode("# From Gerrit Code Review " + version + "\n");
+
+          ByteArrayOutputStream buf = new ByteArrayOutputStream();
+          buf.write(data, 0, lf);
+          buf.write(versionHeader, 0, versionHeader.length);
+          buf.write(data, lf, data.length - lf);
+          data = buf.toByteArray();
+        }
+      }
+
+      return data;
+    }
+
+    private boolean isScript(byte[] data) {
+      return data != null
+          && data.length > 3 //
+          && data[0] == '#' //
+          && data[1] == '!' //
+          && data[2] == '/';
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/update/BatchUpdate.java b/java/com/google/gerrit/server/update/BatchUpdate.java
new file mode 100644
index 0000000..b3472d2
--- /dev/null
+++ b/java/com/google/gerrit/server/update/BatchUpdate.java
@@ -0,0 +1,409 @@
+// Copyright (C) 2017 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.google.gerrit.server.update;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.collect.ImmutableMultiset.toImmutableMultiset;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.base.Throwables;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.collect.Multiset;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.config.FactoryModule;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.validators.OnSubmitValidators;
+import com.google.gerrit.server.logging.RequestId;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gerrit.server.project.InvalidChangeOperationException;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.project.NoSuchProjectException;
+import com.google.gerrit.server.project.NoSuchRefException;
+import com.google.inject.Inject;
+import com.google.inject.Module;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.TimeZone;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.PushCertificate;
+import org.eclipse.jgit.transport.ReceiveCommand;
+
+/**
+ * Helper for a set of updates that should be applied for a site.
+ *
+ * <p>An update operation can be divided into three phases:
+ *
+ * <ol>
+ *   <li>Git reference updates
+ *   <li>Database updates
+ *   <li>Post-update steps
+ *   <li>
+ * </ol>
+ *
+ * A single conceptual operation, such as a REST API call or a merge operation, may make multiple
+ * changes at each step, which all need to be serialized relative to each other. Moreover, for
+ * consistency, <em>all</em> git ref updates must be performed before <em>any</em> database updates,
+ * since database updates might refer to newly-created patch set refs. And all post-update steps,
+ * such as hooks, should run only after all storage mutations have completed.
+ *
+ * <p>Depending on the backend used, each step might support batching, for example in a {@code
+ * BatchRefUpdate} or one or more database transactions. All operations in one phase must complete
+ * successfully before proceeding to the next phase.
+ */
+public abstract class BatchUpdate implements AutoCloseable {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static Module module() {
+    return new FactoryModule() {
+      @Override
+      public void configure() {
+        factory(ReviewDbBatchUpdate.AssistedFactory.class);
+        factory(NoteDbBatchUpdate.AssistedFactory.class);
+      }
+    };
+  }
+
+  @Singleton
+  public static class Factory {
+    private final NotesMigration migration;
+    private final ReviewDbBatchUpdate.AssistedFactory reviewDbBatchUpdateFactory;
+    private final NoteDbBatchUpdate.AssistedFactory noteDbBatchUpdateFactory;
+
+    // TODO(dborowitz): Make this non-injectable to force all callers to use RetryHelper.
+    @Inject
+    Factory(
+        NotesMigration migration,
+        ReviewDbBatchUpdate.AssistedFactory reviewDbBatchUpdateFactory,
+        NoteDbBatchUpdate.AssistedFactory noteDbBatchUpdateFactory) {
+      this.migration = migration;
+      this.reviewDbBatchUpdateFactory = reviewDbBatchUpdateFactory;
+      this.noteDbBatchUpdateFactory = noteDbBatchUpdateFactory;
+    }
+
+    public BatchUpdate create(
+        ReviewDb db, Project.NameKey project, CurrentUser user, Timestamp when) {
+      if (migration.disableChangeReviewDb()) {
+        return noteDbBatchUpdateFactory.create(db, project, user, when);
+      }
+      return reviewDbBatchUpdateFactory.create(db, project, user, when);
+    }
+
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    public void execute(
+        Collection<BatchUpdate> updates, BatchUpdateListener listener, boolean dryRun)
+        throws UpdateException, RestApiException {
+      requireNonNull(listener);
+      checkDifferentProject(updates);
+      // It's safe to downcast all members of the input collection in this case, because the only
+      // way a caller could have gotten any BatchUpdates in the first place is to call the create
+      // method above, which always returns instances of the type we expect. Just to be safe,
+      // copy them into an ImmutableList so there is no chance the callee can pollute the input
+      // collection.
+      if (migration.disableChangeReviewDb()) {
+        ImmutableList<NoteDbBatchUpdate> noteDbUpdates =
+            (ImmutableList) ImmutableList.copyOf(updates);
+        NoteDbBatchUpdate.execute(noteDbUpdates, listener, dryRun);
+      } else {
+        ImmutableList<ReviewDbBatchUpdate> reviewDbUpdates =
+            (ImmutableList) ImmutableList.copyOf(updates);
+        ReviewDbBatchUpdate.execute(reviewDbUpdates, listener, dryRun);
+      }
+    }
+
+    private static void checkDifferentProject(Collection<BatchUpdate> updates) {
+      Multiset<Project.NameKey> projectCounts =
+          updates.stream().map(u -> u.project).collect(toImmutableMultiset());
+      checkArgument(
+          projectCounts.entrySet().size() == updates.size(),
+          "updates must all be for different projects, got: %s",
+          projectCounts);
+    }
+  }
+
+  static Order getOrder(Collection<? extends BatchUpdate> updates, BatchUpdateListener listener) {
+    Order o = null;
+    for (BatchUpdate u : updates) {
+      if (o == null) {
+        o = u.order;
+      } else if (u.order != o) {
+        throw new IllegalArgumentException("cannot mix execution orders");
+      }
+    }
+    if (o != Order.REPO_BEFORE_DB) {
+      checkArgument(
+          listener == BatchUpdateListener.NONE,
+          "BatchUpdateListener not supported for order %s",
+          o);
+    }
+    return o;
+  }
+
+  static boolean getUpdateChangesInParallel(Collection<? extends BatchUpdate> updates) {
+    checkArgument(!updates.isEmpty());
+    Boolean p = null;
+    for (BatchUpdate u : updates) {
+      if (p == null) {
+        p = u.updateChangesInParallel;
+      } else if (u.updateChangesInParallel != p) {
+        throw new IllegalArgumentException("cannot mix parallel and non-parallel operations");
+      }
+    }
+    // Properly implementing this would involve hoisting the parallel loop up
+    // even further. As of this writing, the only user is ReceiveCommits,
+    // which only executes a single BatchUpdate at a time. So bail for now.
+    checkArgument(
+        !p || updates.size() <= 1,
+        "cannot execute ChangeOps in parallel with more than 1 BatchUpdate");
+    return p;
+  }
+
+  static void wrapAndThrowException(Exception e) throws UpdateException, RestApiException {
+    Throwables.throwIfUnchecked(e);
+
+    // Propagate REST API exceptions thrown by operations; they commonly throw exceptions like
+    // ResourceConflictException to indicate an atomic update failure.
+    Throwables.throwIfInstanceOf(e, UpdateException.class);
+    Throwables.throwIfInstanceOf(e, RestApiException.class);
+
+    // Convert other common non-REST exception types with user-visible messages to corresponding
+    // REST exception types
+    if (e instanceof InvalidChangeOperationException) {
+      throw new ResourceConflictException(e.getMessage(), e);
+    } else if (e instanceof NoSuchChangeException
+        || e instanceof NoSuchRefException
+        || e instanceof NoSuchProjectException) {
+      throw new ResourceNotFoundException(e.getMessage(), e);
+    }
+
+    // Otherwise, wrap in a generic UpdateException, which does not include a user-visible message.
+    throw new UpdateException(e);
+  }
+
+  protected GitRepositoryManager repoManager;
+
+  protected final Project.NameKey project;
+  protected final CurrentUser user;
+  protected final Timestamp when;
+  protected final TimeZone tz;
+
+  protected final ListMultimap<Change.Id, BatchUpdateOp> ops =
+      MultimapBuilder.linkedHashKeys().arrayListValues().build();
+  protected final Map<Change.Id, Change> newChanges = new HashMap<>();
+  protected final List<RepoOnlyOp> repoOnlyOps = new ArrayList<>();
+
+  protected RepoView repoView;
+  protected BatchRefUpdate batchRefUpdate;
+  protected Order order;
+  protected OnSubmitValidators onSubmitValidators;
+  protected PushCertificate pushCert;
+  protected String refLogMessage;
+
+  private boolean updateChangesInParallel;
+
+  protected BatchUpdate(
+      GitRepositoryManager repoManager,
+      PersonIdent serverIdent,
+      Project.NameKey project,
+      CurrentUser user,
+      Timestamp when) {
+    this.repoManager = repoManager;
+    this.project = project;
+    this.user = user;
+    this.when = when;
+    tz = serverIdent.getTimeZone();
+    order = Order.REPO_BEFORE_DB;
+  }
+
+  @Override
+  public void close() {
+    if (repoView != null) {
+      repoView.close();
+    }
+  }
+
+  public abstract void execute(BatchUpdateListener listener)
+      throws UpdateException, RestApiException;
+
+  public void execute() throws UpdateException, RestApiException {
+    execute(BatchUpdateListener.NONE);
+  }
+
+  protected abstract Context newContext();
+
+  public BatchUpdate setRepository(Repository repo, RevWalk revWalk, ObjectInserter inserter) {
+    checkState(this.repoView == null, "repo already set");
+    repoView = new RepoView(repo, revWalk, inserter);
+    return this;
+  }
+
+  public BatchUpdate setPushCertificate(@Nullable PushCertificate pushCert) {
+    this.pushCert = pushCert;
+    return this;
+  }
+
+  public BatchUpdate setRefLogMessage(@Nullable String refLogMessage) {
+    this.refLogMessage = refLogMessage;
+    return this;
+  }
+
+  public BatchUpdate setOrder(Order order) {
+    this.order = order;
+    return this;
+  }
+
+  /**
+   * Add a validation step for intended ref operations, which will be performed at the end of {@link
+   * RepoOnlyOp#updateRepo(RepoContext)} step.
+   */
+  public BatchUpdate setOnSubmitValidators(OnSubmitValidators onSubmitValidators) {
+    this.onSubmitValidators = onSubmitValidators;
+    return this;
+  }
+
+  /**
+   * Execute {@link BatchUpdateOp#updateChange(ChangeContext)} in parallel for each change.
+   *
+   * <p>This improves performance of writing to multiple changes in separate ReviewDb transactions.
+   * When only NoteDb is used, updates to all changes are written in a single batch ref update, so
+   * parallelization is not used and this option is ignored.
+   */
+  public BatchUpdate updateChangesInParallel() {
+    this.updateChangesInParallel = true;
+    return this;
+  }
+
+  protected void initRepository() throws IOException {
+    if (repoView == null) {
+      repoView = new RepoView(repoManager, project);
+    }
+  }
+
+  protected RepoView getRepoView() throws IOException {
+    initRepository();
+    return repoView;
+  }
+
+  protected CurrentUser getUser() {
+    return user;
+  }
+
+  protected Optional<AccountState> getAccount() {
+    return user.isIdentifiedUser()
+        ? Optional.of(user.asIdentifiedUser().state())
+        : Optional.empty();
+  }
+
+  protected RevWalk getRevWalk() throws IOException {
+    initRepository();
+    return repoView.getRevWalk();
+  }
+
+  public Map<String, ReceiveCommand> getRefUpdates() {
+    return repoView != null ? repoView.getCommands().getCommands() : ImmutableMap.of();
+  }
+
+  public BatchUpdate addOp(Change.Id id, BatchUpdateOp op) {
+    checkArgument(!(op instanceof InsertChangeOp), "use insertChange");
+    requireNonNull(op);
+    ops.put(id, op);
+    return this;
+  }
+
+  public BatchUpdate addRepoOnlyOp(RepoOnlyOp op) {
+    checkArgument(!(op instanceof BatchUpdateOp), "use addOp()");
+    repoOnlyOps.add(op);
+    return this;
+  }
+
+  public BatchUpdate insertChange(InsertChangeOp op) throws IOException {
+    Context ctx = newContext();
+    Change c = op.createChange(ctx);
+    checkArgument(
+        !newChanges.containsKey(c.getId()), "only one op allowed to create change %s", c.getId());
+    newChanges.put(c.getId(), c);
+    ops.get(c.getId()).add(0, op);
+    return this;
+  }
+
+  protected static void logDebug(String msg, Throwable t) {
+    // Only log if there is a requestId assigned, since those are the
+    // expensive/complicated requests like MergeOp. Doing it every time would be
+    // noisy.
+    if (RequestId.isSet()) {
+      logger.atFine().withCause(t).log("%s", msg);
+    }
+  }
+
+  protected static void logDebug(String msg) {
+    // Only log if there is a requestId assigned, since those are the
+    // expensive/complicated requests like MergeOp. Doing it every time would be
+    // noisy.
+    if (RequestId.isSet()) {
+      logger.atFine().log(msg);
+    }
+  }
+
+  protected static void logDebug(String msg, @Nullable Object arg) {
+    // Only log if there is a requestId assigned, since those are the
+    // expensive/complicated requests like MergeOp. Doing it every time would be
+    // noisy.
+    if (RequestId.isSet()) {
+      logger.atFine().log(msg, arg);
+    }
+  }
+
+  protected static void logDebug(String msg, @Nullable Object arg1, @Nullable Object arg2) {
+    // Only log if there is a requestId assigned, since those are the
+    // expensive/complicated requests like MergeOp. Doing it every time would be
+    // noisy.
+    if (RequestId.isSet()) {
+      logger.atFine().log(msg, arg1, arg2);
+    }
+  }
+
+  protected static void logDebug(
+      String msg, @Nullable Object arg1, @Nullable Object arg2, @Nullable Object arg3) {
+    // Only log if there is a requestId assigned, since those are the
+    // expensive/complicated requests like MergeOp. Doing it every time would be
+    // noisy.
+    if (RequestId.isSet()) {
+      logger.atFine().log(msg, arg1, arg2, arg3);
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/update/BatchUpdateListener.java b/java/com/google/gerrit/server/update/BatchUpdateListener.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/update/BatchUpdateListener.java
rename to java/com/google/gerrit/server/update/BatchUpdateListener.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/update/BatchUpdateOp.java b/java/com/google/gerrit/server/update/BatchUpdateOp.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/update/BatchUpdateOp.java
rename to java/com/google/gerrit/server/update/BatchUpdateOp.java
diff --git a/java/com/google/gerrit/server/update/BatchUpdateReviewDb.java b/java/com/google/gerrit/server/update/BatchUpdateReviewDb.java
new file mode 100644
index 0000000..7d99b44
--- /dev/null
+++ b/java/com/google/gerrit/server/update/BatchUpdateReviewDb.java
@@ -0,0 +1,104 @@
+// 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.
+
+package com.google.gerrit.server.update;
+
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.server.ChangeAccess;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.reviewdb.server.ReviewDbUtil;
+import com.google.gerrit.reviewdb.server.ReviewDbWrapper;
+import com.google.gwtorm.server.AtomicUpdate;
+
+public class BatchUpdateReviewDb extends ReviewDbWrapper {
+  private final ChangeAccess changesWrapper;
+
+  BatchUpdateReviewDb(ReviewDb delegate) {
+    super(delegate);
+    changesWrapper = new BatchUpdateChanges(delegate.changes());
+  }
+
+  /** @return the underlying delegate. Supports BatchUpdateReviewDb too. */
+  public static ReviewDb unwrap(ReviewDb db) {
+    if (db instanceof BatchUpdateReviewDb) {
+      db = ((BatchUpdateReviewDb) db).unsafeGetDelegate();
+    }
+    return ReviewDbUtil.unwrapDb(db);
+  }
+
+  @Override
+  public ChangeAccess changes() {
+    return changesWrapper;
+  }
+
+  @Override
+  public void commit() {
+    throw new UnsupportedOperationException(
+        "do not call commit; BatchUpdate always manages transactions");
+  }
+
+  @Override
+  public void rollback() {
+    throw new UnsupportedOperationException(
+        "do not call rollback; BatchUpdate always manages transactions");
+  }
+
+  private static class BatchUpdateChanges extends ChangeAccessWrapper {
+    private BatchUpdateChanges(ChangeAccess delegate) {
+      super(delegate);
+    }
+
+    @Override
+    public void insert(Iterable<Change> instances) {
+      throw new UnsupportedOperationException(
+          "do not call insert; change is automatically inserted");
+    }
+
+    @Override
+    public void upsert(Iterable<Change> instances) {
+      throw new UnsupportedOperationException(
+          "do not call upsert; existing changes are updated automatically,"
+              + " or use InsertChangeOp for insertion");
+    }
+
+    @Override
+    public void update(Iterable<Change> instances) {
+      throw new UnsupportedOperationException(
+          "do not call update; change is updated automatically");
+    }
+
+    @Override
+    public void beginTransaction(Change.Id key) {
+      throw new UnsupportedOperationException("updateChange is always called within a transaction");
+    }
+
+    @Override
+    public void deleteKeys(Iterable<Change.Id> keys) {
+      throw new UnsupportedOperationException(
+          "do not call deleteKeys; use ChangeContext#deleteChange()");
+    }
+
+    @Override
+    public void delete(Iterable<Change> instances) {
+      throw new UnsupportedOperationException(
+          "do not call delete; use ChangeContext#deleteChange()");
+    }
+
+    @Override
+    public Change atomicUpdate(Change.Id key, AtomicUpdate<Change> update) {
+      throw new UnsupportedOperationException(
+          "do not call atomicUpdate; updateChange is always called within a transaction");
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/update/ChainedReceiveCommands.java b/java/com/google/gerrit/server/update/ChainedReceiveCommands.java
new file mode 100644
index 0000000..c223aec
--- /dev/null
+++ b/java/com/google/gerrit/server/update/ChainedReceiveCommands.java
@@ -0,0 +1,125 @@
+// 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.
+
+package com.google.gerrit.server.update;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.util.Objects.requireNonNull;
+
+import com.google.gerrit.server.git.RefCache;
+import com.google.gerrit.server.git.RepoRefCache;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Optional;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.transport.ReceiveCommand;
+
+/**
+ * Collection of {@link ReceiveCommand}s that supports multiple updates per ref.
+ *
+ * <p>The underlying behavior of {@link BatchRefUpdate} is undefined (an implementations vary) when
+ * more than one command per ref is added. This class works around that limitation by allowing
+ * multiple updates per ref, as long as the previous new SHA-1 matches the next old SHA-1.
+ */
+public class ChainedReceiveCommands implements RefCache {
+  private final Map<String, ReceiveCommand> commands = new LinkedHashMap<>();
+  private final RepoRefCache refCache;
+
+  public ChainedReceiveCommands(Repository repo) {
+    this(new RepoRefCache(repo));
+  }
+
+  public ChainedReceiveCommands(RepoRefCache refCache) {
+    this.refCache = requireNonNull(refCache);
+  }
+
+  public RepoRefCache getRepoRefCache() {
+    return refCache;
+  }
+
+  public boolean isEmpty() {
+    return commands.isEmpty();
+  }
+
+  /**
+   * Add a command.
+   *
+   * @param cmd command to add. If a command has been previously added for the same ref, the new
+   *     SHA-1 of the most recent previous command must match the old SHA-1 of this command.
+   */
+  public void add(ReceiveCommand cmd) {
+    checkArgument(!cmd.getOldId().equals(cmd.getNewId()), "ref update is a no-op: %s", cmd);
+    ReceiveCommand old = commands.get(cmd.getRefName());
+    if (old == null) {
+      commands.put(cmd.getRefName(), cmd);
+      return;
+    }
+    checkArgument(
+        old.getResult() == ReceiveCommand.Result.NOT_ATTEMPTED,
+        "cannot chain ref update %s after update %s with result %s",
+        cmd,
+        old,
+        old.getResult());
+    checkArgument(
+        cmd.getOldId().equals(old.getNewId()),
+        "cannot chain ref update %s after update %s with different new ID",
+        cmd,
+        old);
+    commands.put(
+        cmd.getRefName(), new ReceiveCommand(old.getOldId(), cmd.getNewId(), cmd.getRefName()));
+  }
+
+  /**
+   * Get the latest value of a ref according to this sequence of commands.
+   *
+   * <p>After the value for a ref is read from the repo once, it is cached as in {@link
+   * RepoRefCache}.
+   *
+   * @see RefCache#get(String)
+   */
+  @Override
+  public Optional<ObjectId> get(String refName) throws IOException {
+    ReceiveCommand cmd = commands.get(refName);
+    if (cmd != null) {
+      return !cmd.getNewId().equals(ObjectId.zeroId())
+          ? Optional.of(cmd.getNewId())
+          : Optional.empty();
+    }
+    return refCache.get(refName);
+  }
+
+  /**
+   * Add commands from this instance to a native JGit batch update.
+   *
+   * <p>Exactly one command per ref will be added to the update. The old SHA-1 will be the old SHA-1
+   * of the first command added to this instance for that ref; the new SHA-1 will be the new SHA-1
+   * of the last command.
+   *
+   * @param bru batch update
+   */
+  public void addTo(BatchRefUpdate bru) {
+    for (ReceiveCommand cmd : commands.values()) {
+      bru.addCommand(cmd);
+    }
+  }
+
+  /** @return an unmodifiable view of commands. */
+  public Map<String, ReceiveCommand> getCommands() {
+    return Collections.unmodifiableMap(commands);
+  }
+}
diff --git a/java/com/google/gerrit/server/update/ChangeContext.java b/java/com/google/gerrit/server/update/ChangeContext.java
new file mode 100644
index 0000000..7b5ef0e
--- /dev/null
+++ b/java/com/google/gerrit/server/update/ChangeContext.java
@@ -0,0 +1,76 @@
+// Copyright (C) 2017 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.google.gerrit.server.update;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+
+/**
+ * Context for performing the {@link BatchUpdateOp#updateChange} phase.
+ *
+ * <p>A single {@code ChangeContext} corresponds to updating a single change; if a {@link
+ * BatchUpdate} spans multiple changes, then multiple {@code ChangeContext} instances will be
+ * created.
+ */
+public interface ChangeContext extends Context {
+  /**
+   * Get an update for this change at a given patch set.
+   *
+   * <p>A single operation can modify changes at different patch sets. Commits in the NoteDb graph
+   * within this update are created in patch set order.
+   *
+   * <p>To get the current patch set ID, use {@link com.google.gerrit.server.PatchSetUtil#current}.
+   *
+   * @param psId patch set ID.
+   * @return handle for change updates.
+   */
+  ChangeUpdate getUpdate(PatchSet.Id psId);
+
+  /**
+   * Get the up-to-date notes for this change.
+   *
+   * <p>The change data is read within the same transaction that {@link
+   * BatchUpdateOp#updateChange(ChangeContext)} is executing.
+   *
+   * @return notes for this change.
+   */
+  ChangeNotes getNotes();
+
+  /**
+   * Don't bump the value of {@link Change#getLastUpdatedOn()}.
+   *
+   * <p>If called, don't bump the timestamp before storing to ReviewDb. Only has an effect in
+   * ReviewDb, and the only usage should be to match the behavior of NoteDb. Specifically, in NoteDb
+   * the timestamp is updated if and only if the change meta graph is updated, and is not updated
+   * when only drafts are modified.
+   */
+  void dontBumpLastUpdatedOn();
+
+  /**
+   * Instruct {@link BatchUpdate} to delete this change.
+   *
+   * <p>If called, all other updates are ignored.
+   */
+  void deleteChange();
+
+  /** @return change corresponding to {@link #getNotes()}. */
+  default Change getChange() {
+    return requireNonNull(getNotes().getChange());
+  }
+}
diff --git a/java/com/google/gerrit/server/update/Context.java b/java/com/google/gerrit/server/update/Context.java
new file mode 100644
index 0000000..ffb0392
--- /dev/null
+++ b/java/com/google/gerrit/server/update/Context.java
@@ -0,0 +1,141 @@
+// Copyright (C) 2017 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.google.gerrit.server.update;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountState;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.TimeZone;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+/**
+ * Context for performing a {@link BatchUpdate}.
+ *
+ * <p>A single update may span multiple changes, but they all belong to a single repo.
+ */
+public interface Context {
+  /**
+   * Get the project name this update operates on.
+   *
+   * @return project.
+   */
+  Project.NameKey getProject();
+
+  /**
+   * Get a read-only view of the open repository for this project.
+   *
+   * <p>Will be opened lazily if necessary.
+   *
+   * @return repository instance.
+   * @throws IOException if an error occurred opening the repo.
+   */
+  RepoView getRepoView() throws IOException;
+
+  /**
+   * Get a walk for this project.
+   *
+   * <p>The repository will be opened lazily if necessary; callers should not close the walk.
+   *
+   * @return walk.
+   * @throws IOException if an error occurred opening the repo.
+   */
+  RevWalk getRevWalk() throws IOException;
+
+  /**
+   * Get the timestamp at which this update takes place.
+   *
+   * @return timestamp.
+   */
+  Timestamp getWhen();
+
+  /**
+   * Get the time zone in which this update takes place.
+   *
+   * <p>In the current implementation, this is always the time zone of the server.
+   *
+   * @return time zone.
+   */
+  TimeZone getTimeZone();
+
+  /**
+   * Get the ReviewDb database.
+   *
+   * <p>Callers should not manage transactions or call mutating methods on the Changes table.
+   * Mutations on other tables (including other entities in the change entity group) are fine.
+   *
+   * @return open database instance.
+   */
+  ReviewDb getDb();
+
+  /**
+   * Get the user performing the update.
+   *
+   * <p>In the current implementation, this is always an {@link IdentifiedUser} or {@link
+   * com.google.gerrit.server.InternalUser}.
+   *
+   * @return user.
+   */
+  CurrentUser getUser();
+
+  /**
+   * Get the order in which operations are executed in this update.
+   *
+   * @return order of operations.
+   */
+  Order getOrder();
+
+  /**
+   * Get the identified user performing the update.
+   *
+   * <p>Convenience method for {@code getUser().asIdentifiedUser()}.
+   *
+   * @see CurrentUser#asIdentifiedUser()
+   * @return user.
+   */
+  default IdentifiedUser getIdentifiedUser() {
+    return requireNonNull(getUser()).asIdentifiedUser();
+  }
+
+  /**
+   * Get the account of the user performing the update.
+   *
+   * <p>Convenience method for {@code getIdentifiedUser().getAccount()}.
+   *
+   * @see CurrentUser#asIdentifiedUser()
+   * @return account.
+   */
+  default AccountState getAccount() {
+    return getIdentifiedUser().state();
+  }
+
+  /**
+   * Get the account ID of the user performing the update.
+   *
+   * <p>Convenience method for {@code getUser().getAccountId()}
+   *
+   * @see CurrentUser#getAccountId()
+   * @return account ID.
+   */
+  default Account.Id getAccountId() {
+    return getIdentifiedUser().getAccountId();
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/update/InsertChangeOp.java b/java/com/google/gerrit/server/update/InsertChangeOp.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/update/InsertChangeOp.java
rename to java/com/google/gerrit/server/update/InsertChangeOp.java
diff --git a/java/com/google/gerrit/server/update/NoteDbBatchUpdate.java b/java/com/google/gerrit/server/update/NoteDbBatchUpdate.java
new file mode 100644
index 0000000..a0c425f
--- /dev/null
+++ b/java/com/google/gerrit/server/update/NoteDbBatchUpdate.java
@@ -0,0 +1,456 @@
+// Copyright (C) 2017 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.google.gerrit.server.update;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.flogger.LazyArgs.lazy;
+import static java.util.Comparator.comparing;
+import static java.util.Objects.requireNonNull;
+import static java.util.stream.Collectors.toSet;
+
+import com.google.common.base.Throwables;
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.index.change.ChangeIndexer;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.server.notedb.NoteDbUpdateManager;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TimeZone;
+import java.util.TreeMap;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.ReceiveCommand;
+
+/**
+ * {@link BatchUpdate} implementation using only NoteDb that updates code refs and meta refs in a
+ * single {@link org.eclipse.jgit.lib.BatchRefUpdate}.
+ *
+ * <p>Used when {@code noteDb.changes.disableReviewDb=true}, at which point ReviewDb is not
+ * consulted during updates.
+ */
+public class NoteDbBatchUpdate extends BatchUpdate {
+  public interface AssistedFactory {
+    NoteDbBatchUpdate create(
+        ReviewDb db, Project.NameKey project, CurrentUser user, Timestamp when);
+  }
+
+  static void execute(
+      ImmutableList<NoteDbBatchUpdate> updates, BatchUpdateListener listener, boolean dryrun)
+      throws UpdateException, RestApiException {
+    if (updates.isEmpty()) {
+      return;
+    }
+
+    try {
+      @SuppressWarnings("deprecation")
+      List<com.google.common.util.concurrent.CheckedFuture<?, IOException>> indexFutures =
+          new ArrayList<>();
+      List<ChangesHandle> handles = new ArrayList<>(updates.size());
+      Order order = getOrder(updates, listener);
+      try {
+        switch (order) {
+          case REPO_BEFORE_DB:
+            for (NoteDbBatchUpdate u : updates) {
+              u.executeUpdateRepo();
+            }
+            listener.afterUpdateRepos();
+            for (NoteDbBatchUpdate u : updates) {
+              handles.add(u.executeChangeOps(dryrun));
+            }
+            for (ChangesHandle h : handles) {
+              h.execute();
+              indexFutures.addAll(h.startIndexFutures());
+            }
+            listener.afterUpdateRefs();
+            listener.afterUpdateChanges();
+            break;
+
+          case DB_BEFORE_REPO:
+            // Call updateChange for each op before updateRepo, but defer executing the
+            // NoteDbUpdateManager until after calling updateRepo. They share an inserter and
+            // BatchRefUpdate, so it will all execute as a single batch. But we have to let
+            // NoteDbUpdateManager actually execute the update, since it has to interleave it
+            // properly with All-Users updates.
+            //
+            // TODO(dborowitz): This may still result in multiple updates to All-Users, but that's
+            // currently not a big deal because multi-change batches generally aren't affecting
+            // drafts anyway.
+            for (NoteDbBatchUpdate u : updates) {
+              handles.add(u.executeChangeOps(dryrun));
+            }
+            for (NoteDbBatchUpdate u : updates) {
+              u.executeUpdateRepo();
+            }
+            for (ChangesHandle h : handles) {
+              // TODO(dborowitz): This isn't quite good enough: in theory updateRepo may want to
+              // see the results of change meta commands, but they aren't actually added to the
+              // BatchUpdate until the body of execute. To fix this, execute needs to be split up
+              // into a method that returns a BatchRefUpdate before execution. Not a big deal at the
+              // moment, because this order is only used for deleting changes, and those updateRepo
+              // implementations definitely don't need to observe the updated change meta refs.
+              h.execute();
+              indexFutures.addAll(h.startIndexFutures());
+            }
+            break;
+          default:
+            throw new IllegalStateException("invalid execution order: " + order);
+        }
+      } finally {
+        for (ChangesHandle h : handles) {
+          h.close();
+        }
+      }
+
+      ChangeIndexer.allAsList(indexFutures).get();
+
+      // Fire ref update events only after all mutations are finished, since callers may assume a
+      // patch set ref being created means the change was created, or a branch advancing meaning
+      // some changes were closed.
+      updates.stream()
+          .filter(u -> u.batchRefUpdate != null)
+          .forEach(
+              u -> u.gitRefUpdated.fire(u.project, u.batchRefUpdate, u.getAccount().orElse(null)));
+
+      if (!dryrun) {
+        for (NoteDbBatchUpdate u : updates) {
+          u.executePostOps();
+        }
+      }
+    } catch (Exception e) {
+      wrapAndThrowException(e);
+    }
+  }
+
+  class ContextImpl implements Context {
+    @Override
+    public RepoView getRepoView() throws IOException {
+      return NoteDbBatchUpdate.this.getRepoView();
+    }
+
+    @Override
+    public RevWalk getRevWalk() throws IOException {
+      return getRepoView().getRevWalk();
+    }
+
+    @Override
+    public Project.NameKey getProject() {
+      return project;
+    }
+
+    @Override
+    public Timestamp getWhen() {
+      return when;
+    }
+
+    @Override
+    public TimeZone getTimeZone() {
+      return tz;
+    }
+
+    @Override
+    public ReviewDb getDb() {
+      return db;
+    }
+
+    @Override
+    public CurrentUser getUser() {
+      return user;
+    }
+
+    @Override
+    public Order getOrder() {
+      return order;
+    }
+  }
+
+  private class RepoContextImpl extends ContextImpl implements RepoContext {
+    @Override
+    public ObjectInserter getInserter() throws IOException {
+      return getRepoView().getInserterWrapper();
+    }
+
+    @Override
+    public void addRefUpdate(ReceiveCommand cmd) throws IOException {
+      getRepoView().getCommands().add(cmd);
+    }
+  }
+
+  private class ChangeContextImpl extends ContextImpl implements ChangeContext {
+    private final ChangeNotes notes;
+    private final Map<PatchSet.Id, ChangeUpdate> updates;
+
+    private boolean deleted;
+
+    protected ChangeContextImpl(ChangeNotes notes) {
+      this.notes = requireNonNull(notes);
+      updates = new TreeMap<>(comparing(PatchSet.Id::get));
+    }
+
+    @Override
+    public ChangeUpdate getUpdate(PatchSet.Id psId) {
+      ChangeUpdate u = updates.get(psId);
+      if (u == null) {
+        u = changeUpdateFactory.create(notes, user, when);
+        if (newChanges.containsKey(notes.getChangeId())) {
+          u.setAllowWriteToNewRef(true);
+        }
+        u.setPatchSetId(psId);
+        updates.put(psId, u);
+      }
+      return u;
+    }
+
+    @Override
+    public ChangeNotes getNotes() {
+      return notes;
+    }
+
+    @Override
+    public void dontBumpLastUpdatedOn() {
+      // Do nothing; NoteDb effectively updates timestamp if and only if a commit was written to the
+      // change meta ref.
+    }
+
+    @Override
+    public void deleteChange() {
+      deleted = true;
+    }
+  }
+
+  /** Per-change result status from {@link #executeChangeOps}. */
+  private enum ChangeResult {
+    SKIPPED,
+    UPSERTED,
+    DELETED;
+  }
+
+  private final ChangeNotes.Factory changeNotesFactory;
+  private final ChangeUpdate.Factory changeUpdateFactory;
+  private final NoteDbUpdateManager.Factory updateManagerFactory;
+  private final ChangeIndexer indexer;
+  private final GitReferenceUpdated gitRefUpdated;
+  private final ReviewDb db;
+
+  @Inject
+  NoteDbBatchUpdate(
+      GitRepositoryManager repoManager,
+      @GerritPersonIdent PersonIdent serverIdent,
+      ChangeNotes.Factory changeNotesFactory,
+      ChangeUpdate.Factory changeUpdateFactory,
+      NoteDbUpdateManager.Factory updateManagerFactory,
+      ChangeIndexer indexer,
+      GitReferenceUpdated gitRefUpdated,
+      @Assisted ReviewDb db,
+      @Assisted Project.NameKey project,
+      @Assisted CurrentUser user,
+      @Assisted Timestamp when) {
+    super(repoManager, serverIdent, project, user, when);
+    this.changeNotesFactory = changeNotesFactory;
+    this.changeUpdateFactory = changeUpdateFactory;
+    this.updateManagerFactory = updateManagerFactory;
+    this.indexer = indexer;
+    this.gitRefUpdated = gitRefUpdated;
+    this.db = db;
+  }
+
+  @Override
+  public void execute(BatchUpdateListener listener) throws UpdateException, RestApiException {
+    execute(ImmutableList.of(this), listener, false);
+  }
+
+  @Override
+  protected Context newContext() {
+    return new ContextImpl();
+  }
+
+  private void executeUpdateRepo() throws UpdateException, RestApiException {
+    try {
+      logDebug("Executing updateRepo on %d ops", ops.size());
+      RepoContextImpl ctx = new RepoContextImpl();
+      for (BatchUpdateOp op : ops.values()) {
+        op.updateRepo(ctx);
+      }
+
+      logDebug("Executing updateRepo on %d RepoOnlyOps", repoOnlyOps.size());
+      for (RepoOnlyOp op : repoOnlyOps) {
+        op.updateRepo(ctx);
+      }
+
+      if (onSubmitValidators != null && !getRefUpdates().isEmpty()) {
+        // Validation of refs has to take place here and not at the beginning of executeRefUpdates.
+        // Otherwise, failing validation in a second BatchUpdate object will happen *after* the
+        // first update's executeRefUpdates has finished, hence after first repo's refs have been
+        // updated, which is too late.
+        onSubmitValidators.validate(
+            project, ctx.getRevWalk().getObjectReader(), repoView.getCommands());
+      }
+    } catch (Exception e) {
+      Throwables.throwIfInstanceOf(e, RestApiException.class);
+      throw new UpdateException(e);
+    }
+  }
+
+  private class ChangesHandle implements AutoCloseable {
+    private final NoteDbUpdateManager manager;
+    private final boolean dryrun;
+    private final Map<Change.Id, ChangeResult> results;
+
+    ChangesHandle(NoteDbUpdateManager manager, boolean dryrun) {
+      this.manager = manager;
+      this.dryrun = dryrun;
+      results = new HashMap<>();
+    }
+
+    @Override
+    public void close() {
+      manager.close();
+    }
+
+    void setResult(Change.Id id, ChangeResult result) {
+      ChangeResult old = results.putIfAbsent(id, result);
+      checkArgument(old == null, "result for change %s already set: %s", id, old);
+    }
+
+    void execute() throws OrmException, IOException {
+      NoteDbBatchUpdate.this.batchRefUpdate = manager.execute(dryrun);
+    }
+
+    @SuppressWarnings("deprecation")
+    List<com.google.common.util.concurrent.CheckedFuture<?, IOException>> startIndexFutures() {
+      if (dryrun) {
+        return ImmutableList.of();
+      }
+      logDebug("Reindexing %d changes", results.size());
+      List<com.google.common.util.concurrent.CheckedFuture<?, IOException>> indexFutures =
+          new ArrayList<>(results.size());
+      for (Map.Entry<Change.Id, ChangeResult> e : results.entrySet()) {
+        Change.Id id = e.getKey();
+        switch (e.getValue()) {
+          case UPSERTED:
+            indexFutures.add(indexer.indexAsync(project, id));
+            break;
+          case DELETED:
+            indexFutures.add(indexer.deleteAsync(id));
+            break;
+          case SKIPPED:
+            break;
+          default:
+            throw new IllegalStateException("unexpected result: " + e.getValue());
+        }
+      }
+      return indexFutures;
+    }
+  }
+
+  private ChangesHandle executeChangeOps(boolean dryrun) throws Exception {
+    logDebug("Executing change ops");
+    initRepository();
+    Repository repo = repoView.getRepository();
+    checkState(
+        repo.getRefDatabase().performsAtomicTransactions(),
+        "cannot use NoteDb with a repository that does not support atomic batch ref updates: %s",
+        repo);
+
+    ChangesHandle handle =
+        new ChangesHandle(
+            updateManagerFactory
+                .create(project)
+                .setChangeRepo(
+                    repo, repoView.getRevWalk(), repoView.getInserter(), repoView.getCommands()),
+            dryrun);
+    if (user.isIdentifiedUser()) {
+      handle.manager.setRefLogIdent(user.asIdentifiedUser().newRefLogIdent(when, tz));
+    }
+    handle.manager.setRefLogMessage(refLogMessage);
+    handle.manager.setPushCertificate(pushCert);
+    for (Map.Entry<Change.Id, Collection<BatchUpdateOp>> e : ops.asMap().entrySet()) {
+      Change.Id id = e.getKey();
+      ChangeContextImpl ctx = newChangeContext(id);
+      boolean dirty = false;
+      logDebug(
+          "Applying %d ops for change %s: %s",
+          e.getValue().size(),
+          id,
+          lazy(() -> e.getValue().stream().map(op -> op.getClass().getName()).collect(toSet())));
+      for (BatchUpdateOp op : e.getValue()) {
+        dirty |= op.updateChange(ctx);
+      }
+      if (!dirty) {
+        logDebug("No ops reported dirty, short-circuiting");
+        handle.setResult(id, ChangeResult.SKIPPED);
+        continue;
+      }
+      for (ChangeUpdate u : ctx.updates.values()) {
+        handle.manager.add(u);
+      }
+      if (ctx.deleted) {
+        logDebug("Change %s was deleted", id);
+        handle.manager.deleteChange(id);
+        handle.setResult(id, ChangeResult.DELETED);
+      } else {
+        handle.setResult(id, ChangeResult.UPSERTED);
+      }
+    }
+    return handle;
+  }
+
+  private ChangeContextImpl newChangeContext(Change.Id id) throws OrmException {
+    logDebug("Opening change %s for update", id);
+    Change c = newChanges.get(id);
+    boolean isNew = c != null;
+    if (!isNew) {
+      // Pass a synthetic change into ChangeNotes.Factory, which will take care of checking for
+      // existence and populating columns from the parsed notes state.
+      // TODO(dborowitz): This dance made more sense when using Reviewdb; consider a nicer way.
+      c = ChangeNotes.Factory.newNoteDbOnlyChange(project, id);
+    } else {
+      logDebug("Change %s is new", id);
+    }
+    ChangeNotes notes = changeNotesFactory.createForBatchUpdate(c, !isNew);
+    return new ChangeContextImpl(notes);
+  }
+
+  private void executePostOps() throws Exception {
+    ContextImpl ctx = new ContextImpl();
+    for (BatchUpdateOp op : ops.values()) {
+      op.postUpdate(ctx);
+    }
+
+    for (RepoOnlyOp op : repoOnlyOps) {
+      op.postUpdate(ctx);
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/update/Order.java b/java/com/google/gerrit/server/update/Order.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/update/Order.java
rename to java/com/google/gerrit/server/update/Order.java
diff --git a/java/com/google/gerrit/server/update/RefUpdateUtil.java b/java/com/google/gerrit/server/update/RefUpdateUtil.java
new file mode 100644
index 0000000..3e33677
--- /dev/null
+++ b/java/com/google/gerrit/server/update/RefUpdateUtil.java
@@ -0,0 +1,152 @@
+// Copyright (C) 2017 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.google.gerrit.server.update;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.gerrit.server.git.LockFailureException;
+import java.io.IOException;
+import org.eclipse.jgit.internal.JGitText;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.NullProgressMonitor;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.ReceiveCommand;
+
+/** Static utilities for working with JGit's ref update APIs. */
+public class RefUpdateUtil {
+  /**
+   * Execute a batch ref update, throwing a checked exception if not all updates succeeded.
+   *
+   * <p>Creates a new {@link RevWalk} used only for this operation.
+   *
+   * @param bru batch update; should already have been executed.
+   * @param repo repository that created {@code bru}.
+   * @throws LockFailureException if the transaction was aborted due to lock failure; see {@link
+   *     #checkResults(BatchRefUpdate)} for details.
+   * @throws IOException if any result was not {@code OK}.
+   */
+  public static void executeChecked(BatchRefUpdate bru, Repository repo) throws IOException {
+    try (RevWalk rw = new RevWalk(repo)) {
+      executeChecked(bru, rw);
+    }
+  }
+
+  /**
+   * Execute a batch ref update, throwing a checked exception if not all updates succeeded.
+   *
+   * @param bru batch update; should already have been executed.
+   * @param rw walk for executing the update.
+   * @throws LockFailureException if the transaction was aborted due to lock failure; see {@link
+   *     #checkResults(BatchRefUpdate)} for details.
+   * @throws IOException if any result was not {@code OK}.
+   */
+  public static void executeChecked(BatchRefUpdate bru, RevWalk rw) throws IOException {
+    bru.execute(rw, NullProgressMonitor.INSTANCE);
+    checkResults(bru);
+  }
+
+  /**
+   * Check results of all commands in the update batch, reducing to a single exception if there was
+   * a failure.
+   *
+   * <p>Throws {@link LockFailureException} if at least one command failed with {@code
+   * LOCK_FAILURE}, and the entire transaction was aborted, i.e. any non-{@code LOCK_FAILURE}
+   * results, if there were any, failed with "transaction aborted".
+   *
+   * <p>In particular, if the underlying ref database does not {@link
+   * org.eclipse.jgit.lib.RefDatabase#performsAtomicTransactions() perform atomic transactions},
+   * then a combination of {@code LOCK_FAILURE} on one ref and {@code OK} or another result on other
+   * refs will <em>not</em> throw {@code LockFailureException}.
+   *
+   * @param bru batch update; should already have been executed.
+   * @throws LockFailureException if the transaction was aborted due to lock failure.
+   * @throws IOException if any result was not {@code OK}.
+   */
+  @VisibleForTesting
+  static void checkResults(BatchRefUpdate bru) throws IOException {
+    if (bru.getCommands().isEmpty()) {
+      return;
+    }
+
+    int lockFailure = 0;
+    int aborted = 0;
+    int failure = 0;
+
+    for (ReceiveCommand cmd : bru.getCommands()) {
+      if (cmd.getResult() != ReceiveCommand.Result.OK) {
+        failure++;
+      }
+      if (cmd.getResult() == ReceiveCommand.Result.LOCK_FAILURE) {
+        lockFailure++;
+      } else if (cmd.getResult() == ReceiveCommand.Result.REJECTED_OTHER_REASON
+          && JGitText.get().transactionAborted.equals(cmd.getMessage())) {
+        aborted++;
+      }
+    }
+
+    if (lockFailure + aborted == bru.getCommands().size()) {
+      throw new LockFailureException("Update aborted with one or more lock failures: " + bru, bru);
+    } else if (failure > 0) {
+      throw new IOException("Update failed: " + bru);
+    }
+  }
+
+  /**
+   * Delete a single ref, throwing a checked exception on failure.
+   *
+   * <p>Does not require that the ref have any particular old value. Succeeds as a no-op if the ref
+   * did not exist.
+   *
+   * @param repo repository.
+   * @param refName ref name to delete.
+   * @throws LockFailureException if a low-level lock failure (e.g. compare-and-swap failure)
+   *     occurs.
+   * @throws IOException if an error occurred.
+   */
+  public static void deleteChecked(Repository repo, String refName) throws IOException {
+    RefUpdate ru = repo.updateRef(refName);
+    ru.setForceUpdate(true);
+    switch (ru.delete()) {
+      case FORCED:
+        // Ref was deleted.
+        return;
+
+      case NEW:
+        // Ref didn't exist (yes, really).
+        return;
+
+      case LOCK_FAILURE:
+        throw new LockFailureException("Failed to delete " + refName + ": " + ru.getResult(), ru);
+
+        // Not really failures, but should not be the result of a deletion, so the best option is to
+        // throw.
+      case NO_CHANGE:
+      case FAST_FORWARD:
+      case RENAMED:
+      case NOT_ATTEMPTED:
+
+      case IO_FAILURE:
+      case REJECTED:
+      case REJECTED_CURRENT_BRANCH:
+      case REJECTED_MISSING_OBJECT:
+      case REJECTED_OTHER_REASON:
+      default:
+        throw new IOException("Failed to delete " + refName + ": " + ru.getResult());
+    }
+  }
+
+  private RefUpdateUtil() {}
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/update/RepoContext.java b/java/com/google/gerrit/server/update/RepoContext.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/update/RepoContext.java
rename to java/com/google/gerrit/server/update/RepoContext.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/update/RepoOnlyOp.java b/java/com/google/gerrit/server/update/RepoOnlyOp.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/update/RepoOnlyOp.java
rename to java/com/google/gerrit/server/update/RepoOnlyOp.java
diff --git a/java/com/google/gerrit/server/update/RepoView.java b/java/com/google/gerrit/server/update/RepoView.java
new file mode 100644
index 0000000..9ce842f
--- /dev/null
+++ b/java/com/google/gerrit/server/update/RepoView.java
@@ -0,0 +1,232 @@
+// Copyright (C) 2017 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.google.gerrit.server.update;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.util.Objects.requireNonNull;
+import static java.util.stream.Collectors.toMap;
+
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import java.io.IOException;
+import java.util.Map;
+import java.util.Optional;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+/**
+ * Restricted view of a {@link Repository} for use by {@link BatchUpdateOp} implementations.
+ *
+ * <p>This class serves two purposes in the context of {@link BatchUpdate}. First, the subset of
+ * normal Repository functionality is purely read-only, which prevents implementors from modifying
+ * the repository outside of {@link BatchUpdateOp#updateRepo}. Write operations can only be
+ * performed by calling methods on {@link RepoContext}.
+ *
+ * <p>Second, the read methods take into account any pending operations on the repository that
+ * implementations have staged using the write methods on {@link RepoContext}. Callers do not have
+ * to worry about whether operations have been performed yet, and the implementation details may
+ * differ between ReviewDb and NoteDb, but callers just don't need to care.
+ */
+public class RepoView {
+  private final Repository repo;
+  private final RevWalk rw;
+  private final ObjectInserter inserter;
+  private final ObjectInserter inserterWrapper;
+  private final ChainedReceiveCommands commands;
+  private final boolean closeRepo;
+
+  RepoView(GitRepositoryManager repoManager, Project.NameKey project) throws IOException {
+    repo = repoManager.openRepository(project);
+    inserter = repo.newObjectInserter();
+    inserterWrapper = new NonFlushingInserter(inserter);
+    rw = new RevWalk(inserter.newReader());
+    commands = new ChainedReceiveCommands(repo);
+    closeRepo = true;
+  }
+
+  RepoView(Repository repo, RevWalk rw, ObjectInserter inserter) {
+    checkArgument(
+        rw.getObjectReader().getCreatedFromInserter() == inserter,
+        "expected RevWalk %s to be created by ObjectInserter %s",
+        rw,
+        inserter);
+    this.repo = requireNonNull(repo);
+    this.rw = requireNonNull(rw);
+    this.inserter = requireNonNull(inserter);
+    inserterWrapper = new NonFlushingInserter(inserter);
+    commands = new ChainedReceiveCommands(repo);
+    closeRepo = false;
+  }
+
+  /**
+   * Get this repo's configuration.
+   *
+   * <p>This is the storage-level config you would get with {@link Repository#getConfig()}, not, for
+   * example, the Gerrit-level project config.
+   *
+   * @return a defensive copy of the config; modifications have no effect on the underlying config.
+   */
+  public Config getConfig() {
+    return new Config(repo.getConfig());
+  }
+
+  /**
+   * Get an open revwalk on the repo.
+   *
+   * <p>Guaranteed to be able to read back any objects inserted in the repository via {@link
+   * RepoContext#getInserter()}, even if objects have not been flushed to the underlying repo. In
+   * particular this includes any object returned by {@link #getRef(String)}, even taking into
+   * account not-yet-executed commands.
+   *
+   * @return revwalk.
+   */
+  public RevWalk getRevWalk() {
+    return rw;
+  }
+
+  /**
+   * Read a single ref from the repo.
+   *
+   * <p>Takes into account any ref update commands added during the course of the update using
+   * {@link RepoContext#addRefUpdate}, even if they have not yet been executed on the underlying
+   * repo.
+   *
+   * <p>The results of individual ref lookups are cached: calling this method multiple times with
+   * the same ref name will return the same result (unless a command was added in the meantime). The
+   * repo is not reread.
+   *
+   * @param name exact ref name.
+   * @return the value of the ref, if present.
+   * @throws IOException if an error occurred.
+   */
+  public Optional<ObjectId> getRef(String name) throws IOException {
+    return getCommands().get(name);
+  }
+
+  /**
+   * Look up refs by prefix.
+   *
+   * <p>Takes into account any ref update commands added during the course of the update using
+   * {@link RepoContext#addRefUpdate}, even if they have not yet been executed on the underlying
+   * repo.
+   *
+   * <p>For any ref that has previously been accessed with {@link #getRef(String)}, the value in the
+   * result map will be that same cached value. Any refs that have <em>not</em> been previously
+   * accessed are re-scanned from the repo on each call.
+   *
+   * @param prefix ref prefix; must end in '/' or else be empty.
+   * @return a map of ref suffixes to SHA-1s. The refs are all under {@code prefix} and have the
+   *     prefix stripped.
+   * @throws IOException if an error occurred.
+   */
+  public Map<String, ObjectId> getRefs(String prefix) throws IOException {
+    Map<String, ObjectId> result =
+        repo.getRefDatabase().getRefsByPrefix(prefix).stream()
+            .collect(toMap(r -> r.getName().substring(prefix.length()), Ref::getObjectId));
+
+    // First, overwrite any cached reads from the underlying RepoRefCache. If any of these differ,
+    // it's because a ref was updated after the RepoRefCache read it. It feels a little odd to
+    // prefer the *old* value in this case, but it would be weirder to be inconsistent with getRef.
+    //
+    // Mostly this doesn't matter. If the caller was intending to write to the ref, they lost a
+    // race, and they will get a lock failure. If they just want to read, well, the JGit interface
+    // doesn't currently guarantee that any snapshot of multiple refs is consistent, so they were
+    // probably out of luck anyway.
+    commands
+        .getRepoRefCache()
+        .getCachedRefs()
+        .forEach((k, v) -> updateRefIfPrefixMatches(result, prefix, k, v));
+
+    // Second, overwrite with any pending commands.
+    commands
+        .getCommands()
+        .values()
+        .forEach(
+            c ->
+                updateRefIfPrefixMatches(result, prefix, c.getRefName(), toOptional(c.getNewId())));
+
+    return result;
+  }
+
+  private static Optional<ObjectId> toOptional(ObjectId id) {
+    return id.equals(ObjectId.zeroId()) ? Optional.empty() : Optional.of(id);
+  }
+
+  private static void updateRefIfPrefixMatches(
+      Map<String, ObjectId> map, String prefix, String fullRefName, Optional<ObjectId> maybeId) {
+    if (!fullRefName.startsWith(prefix)) {
+      return;
+    }
+    String suffix = fullRefName.substring(prefix.length());
+    if (maybeId.isPresent()) {
+      map.put(suffix, maybeId.get());
+    } else {
+      map.remove(suffix);
+    }
+  }
+
+  // Not AutoCloseable so callers can't improperly close it. Plus it's never managed with a try
+  // block anyway.
+  void close() {
+    if (closeRepo) {
+      inserter.close();
+      rw.close();
+      repo.close();
+    }
+  }
+
+  Repository getRepository() {
+    return repo;
+  }
+
+  ObjectInserter getInserter() {
+    return inserter;
+  }
+
+  ObjectInserter getInserterWrapper() {
+    return inserterWrapper;
+  }
+
+  ChainedReceiveCommands getCommands() {
+    return commands;
+  }
+
+  private static class NonFlushingInserter extends ObjectInserter.Filter {
+    private final ObjectInserter delegate;
+
+    private NonFlushingInserter(ObjectInserter delegate) {
+      this.delegate = delegate;
+    }
+
+    @Override
+    protected ObjectInserter delegate() {
+      return delegate;
+    }
+
+    @Override
+    public void flush() {
+      // Do nothing.
+    }
+
+    @Override
+    public void close() {
+      // Do nothing; the delegate is closed separately.
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/update/RetryHelper.java b/java/com/google/gerrit/server/update/RetryHelper.java
new file mode 100644
index 0000000..10e3455
--- /dev/null
+++ b/java/com/google/gerrit/server/update/RetryHelper.java
@@ -0,0 +1,352 @@
+// Copyright (C) 2017 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.google.gerrit.server.update;
+
+import static com.google.common.base.MoreObjects.firstNonNull;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.SECONDS;
+
+import com.github.rholder.retry.Attempt;
+import com.github.rholder.retry.RetryException;
+import com.github.rholder.retry.RetryListener;
+import com.github.rholder.retry.Retryer;
+import com.github.rholder.retry.RetryerBuilder;
+import com.github.rholder.retry.StopStrategies;
+import com.github.rholder.retry.WaitStrategies;
+import com.github.rholder.retry.WaitStrategy;
+import com.google.auto.value.AutoValue;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Predicate;
+import com.google.common.base.Throwables;
+import com.google.common.collect.Maps;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.metrics.Counter1;
+import com.google.gerrit.metrics.Description;
+import com.google.gerrit.metrics.Field;
+import com.google.gerrit.metrics.Histogram1;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.git.LockFailureException;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.time.Duration;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
+import java.util.function.Consumer;
+import org.eclipse.jgit.lib.Config;
+
+@Singleton
+public class RetryHelper {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  @FunctionalInterface
+  public interface ChangeAction<T> {
+    T call(BatchUpdate.Factory batchUpdateFactory) throws Exception;
+  }
+
+  @FunctionalInterface
+  public interface Action<T> {
+    T call() throws Exception;
+  }
+
+  public enum ActionType {
+    ACCOUNT_UPDATE,
+    CHANGE_UPDATE,
+    GROUP_UPDATE,
+    INDEX_QUERY
+  }
+
+  /**
+   * Options for retrying a single operation.
+   *
+   * <p>This class is similar in function to upstream's {@link RetryerBuilder}, but it exists as its
+   * own class in Gerrit for several reasons:
+   *
+   * <ul>
+   *   <li>Gerrit needs to support defaults for some of the options, such as a default timeout.
+   *       {@code RetryerBuilder} doesn't support calling the same setter multiple times, so doing
+   *       this with {@code RetryerBuilder} directly would not be easy.
+   *   <li>Gerrit explicitly does not want callers to have full control over all possible options,
+   *       so this class exposes a curated subset.
+   * </ul>
+   */
+  @AutoValue
+  public abstract static class Options {
+    @Nullable
+    abstract RetryListener listener();
+
+    @Nullable
+    abstract Duration timeout();
+
+    @AutoValue.Builder
+    public abstract static class Builder {
+      public abstract Builder listener(RetryListener listener);
+
+      public abstract Builder timeout(Duration timeout);
+
+      public abstract Options build();
+    }
+  }
+
+  @VisibleForTesting
+  @Singleton
+  public static class Metrics {
+    final Histogram1<ActionType> attemptCounts;
+    final Counter1<ActionType> timeoutCount;
+
+    @Inject
+    Metrics(MetricMaker metricMaker) {
+      Field<ActionType> view = Field.ofEnum(ActionType.class, "action_type");
+      attemptCounts =
+          metricMaker.newHistogram(
+              "action/retry_attempt_counts",
+              new Description(
+                      "Distribution of number of attempts made by RetryHelper to execute an action"
+                          + " (1 == single attempt, no retry)")
+                  .setCumulative()
+                  .setUnit("attempts"),
+              view);
+      timeoutCount =
+          metricMaker.newCounter(
+              "action/retry_timeout_count",
+              new Description(
+                      "Number of action executions of RetryHelper that ultimately timed out")
+                  .setCumulative()
+                  .setUnit("timeouts"),
+              view);
+    }
+  }
+
+  public static Options.Builder options() {
+    return new AutoValue_RetryHelper_Options.Builder();
+  }
+
+  private static Options defaults() {
+    return options().build();
+  }
+
+  private final NotesMigration migration;
+  private final Metrics metrics;
+  private final BatchUpdate.Factory updateFactory;
+  private final Map<ActionType, Duration> defaultTimeouts;
+  private final WaitStrategy waitStrategy;
+  @Nullable private final Consumer<RetryerBuilder<?>> overwriteDefaultRetryerStrategySetup;
+
+  @Inject
+  RetryHelper(
+      @GerritServerConfig Config cfg,
+      Metrics metrics,
+      NotesMigration migration,
+      ReviewDbBatchUpdate.AssistedFactory reviewDbBatchUpdateFactory,
+      NoteDbBatchUpdate.AssistedFactory noteDbBatchUpdateFactory) {
+    this(cfg, metrics, migration, reviewDbBatchUpdateFactory, noteDbBatchUpdateFactory, null);
+  }
+
+  @VisibleForTesting
+  public RetryHelper(
+      @GerritServerConfig Config cfg,
+      Metrics metrics,
+      NotesMigration migration,
+      ReviewDbBatchUpdate.AssistedFactory reviewDbBatchUpdateFactory,
+      NoteDbBatchUpdate.AssistedFactory noteDbBatchUpdateFactory,
+      @Nullable Consumer<RetryerBuilder<?>> overwriteDefaultRetryerStrategySetup) {
+    this.metrics = metrics;
+    this.migration = migration;
+    this.updateFactory =
+        new BatchUpdate.Factory(migration, reviewDbBatchUpdateFactory, noteDbBatchUpdateFactory);
+
+    Duration defaultTimeout =
+        Duration.ofMillis(
+            cfg.getTimeUnit("retry", null, "timeout", SECONDS.toMillis(20), MILLISECONDS));
+    this.defaultTimeouts = Maps.newEnumMap(ActionType.class);
+    Arrays.stream(ActionType.values())
+        .forEach(
+            at ->
+                defaultTimeouts.put(
+                    at,
+                    Duration.ofMillis(
+                        cfg.getTimeUnit(
+                            "retry",
+                            at.name(),
+                            "timeout",
+                            SECONDS.toMillis(defaultTimeout.getSeconds()),
+                            MILLISECONDS))));
+
+    this.waitStrategy =
+        WaitStrategies.join(
+            WaitStrategies.exponentialWait(
+                cfg.getTimeUnit("retry", null, "maxWait", SECONDS.toMillis(5), MILLISECONDS),
+                MILLISECONDS),
+            WaitStrategies.randomWait(50, MILLISECONDS));
+    this.overwriteDefaultRetryerStrategySetup = overwriteDefaultRetryerStrategySetup;
+  }
+
+  public Duration getDefaultTimeout(ActionType actionType) {
+    return defaultTimeouts.get(actionType);
+  }
+
+  public <T> T execute(
+      ActionType actionType, Action<T> action, Predicate<Throwable> exceptionPredicate)
+      throws Exception {
+    return execute(actionType, action, defaults(), exceptionPredicate);
+  }
+
+  public <T> T execute(
+      ActionType actionType,
+      Action<T> action,
+      Options opts,
+      Predicate<Throwable> exceptionPredicate)
+      throws Exception {
+    try {
+      return executeWithAttemptAndTimeoutCount(actionType, action, opts, exceptionPredicate);
+    } catch (Throwable t) {
+      Throwables.throwIfUnchecked(t);
+      Throwables.throwIfInstanceOf(t, Exception.class);
+      throw new IllegalStateException(t);
+    }
+  }
+
+  public <T> T execute(ChangeAction<T> changeAction) throws RestApiException, UpdateException {
+    return execute(changeAction, defaults());
+  }
+
+  public <T> T execute(ChangeAction<T> changeAction, Options opts)
+      throws RestApiException, UpdateException {
+    try {
+      if (!migration.disableChangeReviewDb()) {
+        // Either we aren't full-NoteDb, or the underlying ref storage doesn't support atomic
+        // transactions. Either way, retrying a partially-failed operation is not idempotent, so
+        // don't do it automatically. Let the end user decide whether they want to retry.
+        return executeWithTimeoutCount(
+            ActionType.CHANGE_UPDATE,
+            () -> changeAction.call(updateFactory),
+            RetryerBuilder.<T>newBuilder().build());
+      }
+
+      return execute(
+          ActionType.CHANGE_UPDATE,
+          () -> changeAction.call(updateFactory),
+          opts,
+          t -> {
+            if (t instanceof UpdateException) {
+              t = t.getCause();
+            }
+            return t instanceof LockFailureException;
+          });
+    } catch (Throwable t) {
+      Throwables.throwIfUnchecked(t);
+      Throwables.throwIfInstanceOf(t, UpdateException.class);
+      Throwables.throwIfInstanceOf(t, RestApiException.class);
+      throw new UpdateException(t);
+    }
+  }
+
+  /**
+   * Executes an action and records the number of attempts and the timeout as metrics.
+   *
+   * @param actionType the type of the action
+   * @param action the action which should be executed and retried on failure
+   * @param opts options for retrying the action on failure
+   * @param exceptionPredicate predicate to control on which exception the action should be retried
+   * @return the result of executing the action
+   * @throws Throwable any error or exception that made the action fail, callers are expected to
+   *     catch and inspect this Throwable to decide carefully whether it should be re-thrown
+   */
+  private <T> T executeWithAttemptAndTimeoutCount(
+      ActionType actionType,
+      Action<T> action,
+      Options opts,
+      Predicate<Throwable> exceptionPredicate)
+      throws Throwable {
+    MetricListener listener = new MetricListener();
+    try {
+      RetryerBuilder<T> retryerBuilder = createRetryerBuilder(actionType, opts, exceptionPredicate);
+      retryerBuilder.withRetryListener(listener);
+      return executeWithTimeoutCount(actionType, action, retryerBuilder.build());
+    } finally {
+      if (listener.getAttemptCount() > 1) {
+        logger.atFine().log("%s was attempted %d times", actionType, listener.getAttemptCount());
+      }
+      metrics.attemptCounts.record(actionType, listener.getAttemptCount());
+    }
+  }
+
+  /**
+   * Executes an action and records the timeout as metric.
+   *
+   * @param actionType the type of the action
+   * @param action the action which should be executed and retried on failure
+   * @param retryer the retryer
+   * @return the result of executing the action
+   * @throws Throwable any error or exception that made the action fail, callers are expected to
+   *     catch and inspect this Throwable to decide carefully whether it should be re-thrown
+   */
+  private <T> T executeWithTimeoutCount(ActionType actionType, Action<T> action, Retryer<T> retryer)
+      throws Throwable {
+    try {
+      return retryer.call(action::call);
+    } catch (ExecutionException | RetryException e) {
+      if (e instanceof RetryException) {
+        metrics.timeoutCount.increment(actionType);
+      }
+      if (e.getCause() != null) {
+        throw e.getCause();
+      }
+      throw e;
+    }
+  }
+
+  private <O> RetryerBuilder<O> createRetryerBuilder(
+      ActionType actionType, Options opts, Predicate<Throwable> exceptionPredicate) {
+    RetryerBuilder<O> retryerBuilder =
+        RetryerBuilder.<O>newBuilder().retryIfException(exceptionPredicate);
+    if (opts.listener() != null) {
+      retryerBuilder.withRetryListener(opts.listener());
+    }
+
+    if (overwriteDefaultRetryerStrategySetup != null) {
+      overwriteDefaultRetryerStrategySetup.accept(retryerBuilder);
+      return retryerBuilder;
+    }
+
+    return retryerBuilder
+        .withStopStrategy(
+            StopStrategies.stopAfterDelay(
+                firstNonNull(opts.timeout(), getDefaultTimeout(actionType)).toMillis(),
+                MILLISECONDS))
+        .withWaitStrategy(waitStrategy);
+  }
+
+  private static class MetricListener implements RetryListener {
+    private long attemptCount;
+
+    MetricListener() {
+      attemptCount = 1;
+    }
+
+    @Override
+    public <V> void onRetry(Attempt<V> attempt) {
+      attemptCount = attempt.getAttemptNumber();
+    }
+
+    long getAttemptCount() {
+      return attemptCount;
+    }
+  }
+}
diff --git a/java/com/google/gerrit/server/update/RetryingRestCollectionModifyView.java b/java/com/google/gerrit/server/update/RetryingRestCollectionModifyView.java
new file mode 100644
index 0000000..7620386
--- /dev/null
+++ b/java/com/google/gerrit/server/update/RetryingRestCollectionModifyView.java
@@ -0,0 +1,40 @@
+// 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.
+
+package com.google.gerrit.server.update;
+
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestCollectionModifyView;
+import com.google.gerrit.extensions.restapi.RestResource;
+
+public abstract class RetryingRestCollectionModifyView<
+        P extends RestResource, C extends RestResource, I, O>
+    implements RestCollectionModifyView<P, C, I> {
+  private final RetryHelper retryHelper;
+
+  protected RetryingRestCollectionModifyView(RetryHelper retryHelper) {
+    this.retryHelper = retryHelper;
+  }
+
+  @Override
+  public final O apply(P parentResource, I input)
+      throws AuthException, BadRequestException, ResourceConflictException, Exception {
+    return retryHelper.execute((updateFactory) -> applyImpl(updateFactory, parentResource, input));
+  }
+
+  protected abstract O applyImpl(BatchUpdate.Factory updateFactory, P parentResource, I input)
+      throws Exception;
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/update/RetryingRestModifyView.java b/java/com/google/gerrit/server/update/RetryingRestModifyView.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/update/RetryingRestModifyView.java
rename to java/com/google/gerrit/server/update/RetryingRestModifyView.java
diff --git a/java/com/google/gerrit/server/update/ReviewDbBatchUpdate.java b/java/com/google/gerrit/server/update/ReviewDbBatchUpdate.java
new file mode 100644
index 0000000..c67ee8a
--- /dev/null
+++ b/java/com/google/gerrit/server/update/ReviewDbBatchUpdate.java
@@ -0,0 +1,841 @@
+// Copyright (C) 2015 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.google.gerrit.server.update;
+
+import static com.google.common.base.Preconditions.checkState;
+import static java.util.Comparator.comparing;
+import static java.util.Objects.requireNonNull;
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.base.Stopwatch;
+import com.google.common.base.Throwables;
+import com.google.common.collect.ImmutableList;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.common.util.concurrent.MoreExecutors;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.metrics.Description;
+import com.google.gerrit.metrics.Description.Units;
+import com.google.gerrit.metrics.Field;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.metrics.Timer1;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.reviewdb.server.ReviewDbWrapper;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.ChangeUpdateExecutor;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.InsertedObject;
+import com.google.gerrit.server.git.LockFailureException;
+import com.google.gerrit.server.index.change.ChangeIndexer;
+import com.google.gerrit.server.logging.TraceContext;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.server.notedb.NoteDbChangeState;
+import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
+import com.google.gerrit.server.notedb.NoteDbUpdateManager;
+import com.google.gerrit.server.notedb.NoteDbUpdateManager.MismatchedStateException;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.TimeZone;
+import java.util.TreeMap;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.NullProgressMonitor;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.ReceiveCommand;
+
+/**
+ * {@link BatchUpdate} implementation that supports mixed ReviewDb/NoteDb operations, depending on
+ * the migration state specified in {@link NotesMigration}.
+ *
+ * <p>When performing change updates in a mixed ReviewDb/NoteDb environment with ReviewDb primary,
+ * the order of operations is very subtle:
+ *
+ * <ol>
+ *   <li>Stage NoteDb updates to get the new NoteDb state, but do not write to the repo.
+ *   <li>Write the new state in the Change entity, and commit this to ReviewDb.
+ *   <li>Update NoteDb, ignoring any write failures.
+ * </ol>
+ *
+ * The implementation in this class is well-tested, and it is strongly recommended that you not
+ * attempt to reimplement this logic. Use {@code BatchUpdate} if at all possible.
+ */
+public class ReviewDbBatchUpdate extends BatchUpdate {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public interface AssistedFactory {
+    ReviewDbBatchUpdate create(
+        ReviewDb db, Project.NameKey project, CurrentUser user, Timestamp when);
+  }
+
+  class ContextImpl implements Context {
+    @Override
+    public RepoView getRepoView() throws IOException {
+      return ReviewDbBatchUpdate.this.getRepoView();
+    }
+
+    @Override
+    public RevWalk getRevWalk() throws IOException {
+      return getRepoView().getRevWalk();
+    }
+
+    @Override
+    public Project.NameKey getProject() {
+      return project;
+    }
+
+    @Override
+    public Timestamp getWhen() {
+      return when;
+    }
+
+    @Override
+    public TimeZone getTimeZone() {
+      return tz;
+    }
+
+    @Override
+    public ReviewDb getDb() {
+      return db;
+    }
+
+    @Override
+    public CurrentUser getUser() {
+      return user;
+    }
+
+    @Override
+    public Order getOrder() {
+      return order;
+    }
+  }
+
+  private class RepoContextImpl extends ContextImpl implements RepoContext {
+    @Override
+    public ObjectInserter getInserter() throws IOException {
+      return getRepoView().getInserterWrapper();
+    }
+
+    @Override
+    public void addRefUpdate(ReceiveCommand cmd) throws IOException {
+      initRepository();
+      repoView.getCommands().add(cmd);
+    }
+  }
+
+  private class ChangeContextImpl extends ContextImpl implements ChangeContext {
+    private final ChangeNotes notes;
+    private final Map<PatchSet.Id, ChangeUpdate> updates;
+    private final ReviewDbWrapper dbWrapper;
+    private final Repository threadLocalRepo;
+    private final RevWalk threadLocalRevWalk;
+
+    private boolean deleted;
+    private boolean bumpLastUpdatedOn = true;
+
+    protected ChangeContextImpl(
+        ChangeNotes notes, ReviewDbWrapper dbWrapper, Repository repo, RevWalk rw) {
+      this.notes = requireNonNull(notes);
+      this.dbWrapper = dbWrapper;
+      this.threadLocalRepo = repo;
+      this.threadLocalRevWalk = rw;
+      updates = new TreeMap<>(comparing(PatchSet.Id::get));
+    }
+
+    @Override
+    public ReviewDb getDb() {
+      requireNonNull(dbWrapper);
+      return dbWrapper;
+    }
+
+    @Override
+    public RevWalk getRevWalk() {
+      return threadLocalRevWalk;
+    }
+
+    @Override
+    public ChangeUpdate getUpdate(PatchSet.Id psId) {
+      ChangeUpdate u = updates.get(psId);
+      if (u == null) {
+        u = changeUpdateFactory.create(notes, user, when);
+        if (newChanges.containsKey(notes.getChangeId())) {
+          u.setAllowWriteToNewRef(true);
+        }
+        u.setPatchSetId(psId);
+        updates.put(psId, u);
+      }
+      return u;
+    }
+
+    @Override
+    public ChangeNotes getNotes() {
+      return notes;
+    }
+
+    @Override
+    public void dontBumpLastUpdatedOn() {
+      bumpLastUpdatedOn = false;
+    }
+
+    @Override
+    public void deleteChange() {
+      deleted = true;
+    }
+  }
+
+  @Singleton
+  private static class Metrics {
+    final Timer1<Boolean> executeChangeOpsLatency;
+
+    @Inject
+    Metrics(MetricMaker metricMaker) {
+      executeChangeOpsLatency =
+          metricMaker.newTimer(
+              "batch_update/execute_change_ops",
+              new Description("BatchUpdate change update latency, excluding reindexing")
+                  .setCumulative()
+                  .setUnit(Units.MILLISECONDS),
+              Field.ofBoolean("success"));
+    }
+  }
+
+  static void execute(
+      ImmutableList<ReviewDbBatchUpdate> updates, BatchUpdateListener listener, boolean dryrun)
+      throws UpdateException, RestApiException {
+    if (updates.isEmpty()) {
+      return;
+    }
+    try {
+      Order order = getOrder(updates, listener);
+      boolean updateChangesInParallel = getUpdateChangesInParallel(updates);
+      switch (order) {
+        case REPO_BEFORE_DB:
+          for (ReviewDbBatchUpdate u : updates) {
+            u.executeUpdateRepo();
+          }
+          listener.afterUpdateRepos();
+          for (ReviewDbBatchUpdate u : updates) {
+            u.executeRefUpdates(dryrun);
+          }
+          listener.afterUpdateRefs();
+          for (ReviewDbBatchUpdate u : updates) {
+            u.reindexChanges(u.executeChangeOps(updateChangesInParallel, dryrun));
+          }
+          listener.afterUpdateChanges();
+          break;
+        case DB_BEFORE_REPO:
+          for (ReviewDbBatchUpdate u : updates) {
+            u.reindexChanges(u.executeChangeOps(updateChangesInParallel, dryrun));
+          }
+          for (ReviewDbBatchUpdate u : updates) {
+            u.executeUpdateRepo();
+          }
+          for (ReviewDbBatchUpdate u : updates) {
+            u.executeRefUpdates(dryrun);
+          }
+          break;
+        default:
+          throw new IllegalStateException("invalid execution order: " + order);
+      }
+
+      ChangeIndexer.allAsList(
+              updates.stream().flatMap(u -> u.indexFutures.stream()).collect(toList()))
+          .get();
+
+      // Fire ref update events only after all mutations are finished, since callers may assume a
+      // patch set ref being created means the change was created, or a branch advancing meaning
+      // some changes were closed.
+      updates.stream()
+          .filter(u -> u.batchRefUpdate != null)
+          .forEach(
+              u -> u.gitRefUpdated.fire(u.project, u.batchRefUpdate, u.getAccount().orElse(null)));
+
+      if (!dryrun) {
+        for (ReviewDbBatchUpdate u : updates) {
+          u.executePostOps();
+        }
+      }
+    } catch (Exception e) {
+      wrapAndThrowException(e);
+    }
+  }
+
+  private final AllUsersName allUsers;
+  private final ChangeIndexer indexer;
+  private final ChangeNotes.Factory changeNotesFactory;
+  private final ChangeUpdate.Factory changeUpdateFactory;
+  private final GitReferenceUpdated gitRefUpdated;
+  private final ListeningExecutorService changeUpdateExector;
+  private final Metrics metrics;
+  private final NoteDbUpdateManager.Factory updateManagerFactory;
+  private final NotesMigration notesMigration;
+  private final ReviewDb db;
+  private final SchemaFactory<ReviewDb> schemaFactory;
+  private final long skewMs;
+
+  @SuppressWarnings("deprecation")
+  private final List<com.google.common.util.concurrent.CheckedFuture<?, IOException>> indexFutures =
+      new ArrayList<>();
+
+  @Inject
+  ReviewDbBatchUpdate(
+      @GerritServerConfig Config cfg,
+      AllUsersName allUsers,
+      ChangeIndexer indexer,
+      ChangeNotes.Factory changeNotesFactory,
+      @ChangeUpdateExecutor ListeningExecutorService changeUpdateExector,
+      ChangeUpdate.Factory changeUpdateFactory,
+      @GerritPersonIdent PersonIdent serverIdent,
+      GitReferenceUpdated gitRefUpdated,
+      GitRepositoryManager repoManager,
+      Metrics metrics,
+      NoteDbUpdateManager.Factory updateManagerFactory,
+      NotesMigration notesMigration,
+      SchemaFactory<ReviewDb> schemaFactory,
+      @Assisted ReviewDb db,
+      @Assisted Project.NameKey project,
+      @Assisted CurrentUser user,
+      @Assisted Timestamp when) {
+    super(repoManager, serverIdent, project, user, when);
+    this.allUsers = allUsers;
+    this.changeNotesFactory = changeNotesFactory;
+    this.changeUpdateExector = changeUpdateExector;
+    this.changeUpdateFactory = changeUpdateFactory;
+    this.gitRefUpdated = gitRefUpdated;
+    this.indexer = indexer;
+    this.metrics = metrics;
+    this.notesMigration = notesMigration;
+    this.schemaFactory = schemaFactory;
+    this.updateManagerFactory = updateManagerFactory;
+    this.db = db;
+    skewMs = NoteDbChangeState.getReadOnlySkew(cfg);
+  }
+
+  @Override
+  public void execute(BatchUpdateListener listener) throws UpdateException, RestApiException {
+    execute(ImmutableList.of(this), listener, false);
+  }
+
+  @Override
+  protected Context newContext() {
+    return new ContextImpl();
+  }
+
+  private void executeUpdateRepo() throws UpdateException, RestApiException {
+    try {
+      logDebug("Executing updateRepo on %d ops", ops.size());
+      RepoContextImpl ctx = new RepoContextImpl();
+      for (BatchUpdateOp op : ops.values()) {
+        op.updateRepo(ctx);
+      }
+
+      logDebug("Executing updateRepo on %d RepoOnlyOps", repoOnlyOps.size());
+      for (RepoOnlyOp op : repoOnlyOps) {
+        op.updateRepo(ctx);
+      }
+
+      if (onSubmitValidators != null && !getRefUpdates().isEmpty()) {
+        // Validation of refs has to take place here and not at the beginning of executeRefUpdates.
+        // Otherwise, failing validation in a second BatchUpdate object will happen *after* the
+        // first update's executeRefUpdates has finished, hence after first repo's refs have been
+        // updated, which is too late.
+        onSubmitValidators.validate(
+            project, ctx.getRevWalk().getObjectReader(), repoView.getCommands());
+      }
+
+      if (repoView != null) {
+        logDebug("Flushing inserter");
+        repoView.getInserter().flush();
+      } else {
+        logDebug("No objects to flush");
+      }
+    } catch (Exception e) {
+      Throwables.throwIfInstanceOf(e, RestApiException.class);
+      throw new UpdateException(e);
+    }
+  }
+
+  private void executeRefUpdates(boolean dryrun) throws IOException, RestApiException {
+    if (getRefUpdates().isEmpty()) {
+      logDebug("No ref updates to execute");
+      return;
+    }
+    // May not be opened if the caller added ref updates but no new objects.
+    // TODO(dborowitz): Really?
+    initRepository();
+    batchRefUpdate = repoView.getRepository().getRefDatabase().newBatchUpdate();
+    batchRefUpdate.setPushCertificate(pushCert);
+    batchRefUpdate.setRefLogMessage(refLogMessage, true);
+    batchRefUpdate.setAllowNonFastForwards(true);
+    repoView.getCommands().addTo(batchRefUpdate);
+    if (user.isIdentifiedUser()) {
+      batchRefUpdate.setRefLogIdent(user.asIdentifiedUser().newRefLogIdent(when, tz));
+    }
+    logDebug("Executing batch of %d ref updates", batchRefUpdate.getCommands().size());
+    if (dryrun) {
+      return;
+    }
+
+    // Force BatchRefUpdate to read newly referenced objects using a new RevWalk, rather than one
+    // that might have access to unflushed objects.
+    try (RevWalk updateRw = new RevWalk(repoView.getRepository())) {
+      batchRefUpdate.execute(updateRw, NullProgressMonitor.INSTANCE);
+    }
+    boolean ok = true;
+    for (ReceiveCommand cmd : batchRefUpdate.getCommands()) {
+      if (cmd.getResult() != ReceiveCommand.Result.OK) {
+        ok = false;
+        break;
+      }
+    }
+    if (!ok) {
+      throw new RestApiException("BatchRefUpdate failed: " + batchRefUpdate);
+    }
+  }
+
+  private List<ChangeTask> executeChangeOps(boolean parallel, boolean dryrun)
+      throws UpdateException, RestApiException {
+    List<ChangeTask> tasks;
+    boolean success = false;
+    Stopwatch sw = Stopwatch.createStarted();
+    try {
+      logDebug("Executing change ops (parallel? %s)", parallel);
+      ListeningExecutorService executor =
+          parallel ? changeUpdateExector : MoreExecutors.newDirectExecutorService();
+
+      tasks = new ArrayList<>(ops.keySet().size());
+      try {
+        if (notesMigration.commitChangeWrites() && repoView != null) {
+          // A NoteDb change may have been rebuilt since the repo was originally
+          // opened, so make sure we see that.
+          logDebug("Preemptively scanning for repo changes");
+          repoView.getRepository().scanForRepoChanges();
+        }
+        if (!ops.isEmpty() && notesMigration.failChangeWrites()) {
+          // Fail fast before attempting any writes if changes are read-only, as
+          // this is a programmer error.
+          logDebug("Failing early due to read-only Changes table");
+          throw new OrmException(NoteDbUpdateManager.CHANGES_READ_ONLY);
+        }
+        List<ListenableFuture<?>> futures = new ArrayList<>(ops.keySet().size());
+        for (Map.Entry<Change.Id, Collection<BatchUpdateOp>> e : ops.asMap().entrySet()) {
+          ChangeTask task =
+              new ChangeTask(e.getKey(), e.getValue(), Thread.currentThread(), dryrun);
+          tasks.add(task);
+          if (!parallel) {
+            logDebug("Direct execution of task for ops: %s", ops);
+          }
+          futures.add(executor.submit(task));
+        }
+        if (parallel) {
+          logDebug(
+              "Waiting on futures for %d ops spanning %d changes", ops.size(), ops.keySet().size());
+        }
+        Futures.allAsList(futures).get();
+
+        if (notesMigration.commitChangeWrites()) {
+          if (!dryrun) {
+            executeNoteDbUpdates(tasks);
+          }
+        }
+        success = true;
+      } catch (ExecutionException | InterruptedException e) {
+        Throwables.throwIfInstanceOf(e.getCause(), UpdateException.class);
+        Throwables.throwIfInstanceOf(e.getCause(), RestApiException.class);
+        throw new UpdateException(e);
+      } catch (OrmException | IOException e) {
+        throw new UpdateException(e);
+      }
+    } finally {
+      metrics.executeChangeOpsLatency.record(success, sw.elapsed(NANOSECONDS), NANOSECONDS);
+    }
+    return tasks;
+  }
+
+  private void reindexChanges(List<ChangeTask> tasks) {
+    // Reindex changes.
+    for (ChangeTask task : tasks) {
+      if (task.deleted) {
+        indexFutures.add(indexer.deleteAsync(task.id));
+      } else if (task.dirty) {
+        indexFutures.add(indexer.indexAsync(project, task.id));
+      }
+    }
+  }
+
+  private void executeNoteDbUpdates(List<ChangeTask> tasks)
+      throws ResourceConflictException, IOException {
+    // Aggregate together all NoteDb ref updates from the ops we executed,
+    // possibly in parallel. Each task had its own NoteDbUpdateManager instance
+    // with its own thread-local copy of the repo(s), but each of those was just
+    // used for staging updates and was never executed.
+    //
+    // Use a new BatchRefUpdate as the original batchRefUpdate field is intended
+    // for use only by the updateRepo phase.
+    //
+    // See the comments in NoteDbUpdateManager#execute() for why we execute the
+    // updates on the change repo first.
+    logDebug("Executing NoteDb updates for %d changes", tasks.size());
+    try {
+      initRepository();
+      BatchRefUpdate changeRefUpdate = repoView.getRepository().getRefDatabase().newBatchUpdate();
+      boolean hasAllUsersCommands = false;
+      try (ObjectInserter ins = repoView.getRepository().newObjectInserter()) {
+        int objs = 0;
+        for (ChangeTask task : tasks) {
+          if (task.noteDbResult == null) {
+            logDebug("No-op update to %s", task.id);
+            continue;
+          }
+          for (ReceiveCommand cmd : task.noteDbResult.changeCommands()) {
+            changeRefUpdate.addCommand(cmd);
+          }
+          for (InsertedObject obj : task.noteDbResult.changeObjects()) {
+            objs++;
+            ins.insert(obj.type(), obj.data().toByteArray());
+          }
+          hasAllUsersCommands |= !task.noteDbResult.allUsersCommands().isEmpty();
+        }
+        logDebug(
+            "Collected %d objects and %d ref updates to change repo",
+            objs, changeRefUpdate.getCommands().size());
+        executeNoteDbUpdate(getRevWalk(), ins, changeRefUpdate);
+      }
+
+      if (hasAllUsersCommands) {
+        try (Repository allUsersRepo = repoManager.openRepository(allUsers);
+            RevWalk allUsersRw = new RevWalk(allUsersRepo);
+            ObjectInserter allUsersIns = allUsersRepo.newObjectInserter()) {
+          int objs = 0;
+          BatchRefUpdate allUsersRefUpdate = allUsersRepo.getRefDatabase().newBatchUpdate();
+          for (ChangeTask task : tasks) {
+            for (ReceiveCommand cmd : task.noteDbResult.allUsersCommands()) {
+              allUsersRefUpdate.addCommand(cmd);
+            }
+            for (InsertedObject obj : task.noteDbResult.allUsersObjects()) {
+              allUsersIns.insert(obj.type(), obj.data().toByteArray());
+            }
+          }
+          logDebug(
+              "Collected %d objects and %d ref updates to All-Users",
+              objs, allUsersRefUpdate.getCommands().size());
+          executeNoteDbUpdate(allUsersRw, allUsersIns, allUsersRefUpdate);
+        }
+      } else {
+        logDebug("No All-Users updates");
+      }
+    } catch (IOException e) {
+      if (tasks.stream().allMatch(t -> t.storage == PrimaryStorage.REVIEW_DB)) {
+        // Ignore all errors trying to update NoteDb at this point. We've already written the
+        // NoteDbChangeStates to ReviewDb, which means if any state is out of date it will be
+        // rebuilt the next time it is needed.
+        //
+        // Always log even without RequestId.
+        logger.atFine().withCause(e).log("Ignoring NoteDb update error after ReviewDb write");
+
+        // Otherwise, we can't prove it's safe to ignore the error, either because some change had
+        // NOTE_DB primary, or a task failed before determining the primary storage.
+      } else if (e instanceof LockFailureException) {
+        // LOCK_FAILURE is a special case indicating there was a conflicting write to a meta ref,
+        // although it happened too late for us to produce anything but a generic error message.
+        throw new ResourceConflictException("Updating change failed due to conflicting write", e);
+      }
+      throw e;
+    }
+  }
+
+  private void executeNoteDbUpdate(RevWalk rw, ObjectInserter ins, BatchRefUpdate bru)
+      throws IOException {
+    if (bru.getCommands().isEmpty()) {
+      logDebug("No commands, skipping flush and ref update");
+      return;
+    }
+    ins.flush();
+    bru.setAllowNonFastForwards(true);
+    bru.execute(rw, NullProgressMonitor.INSTANCE);
+    for (ReceiveCommand cmd : bru.getCommands()) {
+      // TODO(dborowitz): LOCK_FAILURE for NoteDb primary should be retried.
+      if (cmd.getResult() != ReceiveCommand.Result.OK) {
+        throw new IOException("Update failed: " + bru);
+      }
+    }
+  }
+
+  private class ChangeTask implements Callable<Void> {
+    final Change.Id id;
+    private final Collection<BatchUpdateOp> changeOps;
+    private final Thread mainThread;
+    private final boolean dryrun;
+
+    PrimaryStorage storage;
+    NoteDbUpdateManager.StagedResult noteDbResult;
+    boolean dirty;
+    boolean deleted;
+
+    private ChangeTask(
+        Change.Id id, Collection<BatchUpdateOp> changeOps, Thread mainThread, boolean dryrun) {
+      this.id = id;
+      this.changeOps = changeOps;
+      this.mainThread = mainThread;
+      this.dryrun = dryrun;
+    }
+
+    @Override
+    public Void call() throws Exception {
+      try (TraceContext traceContext =
+          TraceContext.open()
+              .addTag("TASK_ID", id.toString() + "-" + Thread.currentThread().getId())) {
+        if (Thread.currentThread() == mainThread) {
+          initRepository();
+          Repository repo = repoView.getRepository();
+          try (RevWalk rw = new RevWalk(repo)) {
+            call(ReviewDbBatchUpdate.this.db, repo, rw);
+          }
+        } else {
+          // Possible optimization: allow Ops to declare whether they need to
+          // access the repo from updateChange, and don't open in this thread
+          // unless we need it. However, as of this writing the only operations
+          // that are executed in parallel are during ReceiveCommits, and they
+          // all need the repo open anyway. (The non-parallel case above does not
+          // reopen the repo.)
+          try (ReviewDb threadLocalDb = schemaFactory.open();
+              Repository repo = repoManager.openRepository(project);
+              RevWalk rw = new RevWalk(repo)) {
+            call(threadLocalDb, repo, rw);
+          }
+        }
+        return null;
+      }
+    }
+
+    private void call(ReviewDb db, Repository repo, RevWalk rw) throws Exception {
+      @SuppressWarnings("resource") // Not always opened.
+      NoteDbUpdateManager updateManager = null;
+      try {
+        db.changes().beginTransaction(id);
+        try {
+          ChangeContextImpl ctx = newChangeContext(db, repo, rw, id);
+          NoteDbChangeState oldState = NoteDbChangeState.parse(ctx.getChange());
+          NoteDbChangeState.checkNotReadOnly(oldState, skewMs);
+
+          storage = PrimaryStorage.of(oldState);
+          if (storage == PrimaryStorage.NOTE_DB && !notesMigration.readChanges()) {
+            throw new OrmException("must have NoteDb enabled to update change " + id);
+          }
+
+          // Call updateChange on each op.
+          logDebug("Calling updateChange on %s ops", changeOps.size());
+          for (BatchUpdateOp op : changeOps) {
+            dirty |= op.updateChange(ctx);
+          }
+          if (!dirty) {
+            logDebug("No ops reported dirty, short-circuiting");
+            return;
+          }
+          deleted = ctx.deleted;
+          if (deleted) {
+            logDebug("Change was deleted");
+          }
+
+          // Stage the NoteDb update and store its state in the Change.
+          if (notesMigration.commitChangeWrites()) {
+            updateManager = stageNoteDbUpdate(ctx, deleted);
+          }
+
+          if (storage == PrimaryStorage.REVIEW_DB) {
+            // If primary storage of this change is in ReviewDb, bump
+            // lastUpdatedOn or rowVersion and commit. Otherwise, don't waste
+            // time updating ReviewDb at all.
+            Iterable<Change> cs = changesToUpdate(ctx);
+            if (isNewChange(id)) {
+              // Insert rather than upsert in case of a race on change IDs.
+              logDebug("Inserting change");
+              db.changes().insert(cs);
+            } else if (deleted) {
+              logDebug("Deleting change");
+              db.changes().delete(cs);
+            } else {
+              logDebug("Updating change");
+              db.changes().update(cs);
+            }
+            if (!dryrun) {
+              db.commit();
+            }
+          } else {
+            logDebug("Skipping ReviewDb write since primary storage is %s", storage);
+          }
+        } finally {
+          db.rollback();
+        }
+
+        // Do not execute the NoteDbUpdateManager, as we don't want too much
+        // contention on the underlying repo, and we would rather use a single
+        // ObjectInserter/BatchRefUpdate later.
+        //
+        // TODO(dborowitz): May or may not be worth trying to batch together
+        // flushed inserters as well.
+        if (storage == PrimaryStorage.NOTE_DB) {
+          // Should have failed above if NoteDb is disabled.
+          checkState(notesMigration.commitChangeWrites());
+          noteDbResult = updateManager.stage().get(id);
+        } else if (notesMigration.commitChangeWrites()) {
+          try {
+            noteDbResult = updateManager.stage().get(id);
+          } catch (IOException ex) {
+            // Ignore all errors trying to update NoteDb at this point. We've
+            // already written the NoteDbChangeState to ReviewDb, which means
+            // if the state is out of date it will be rebuilt the next time it
+            // is needed.
+            logger.atFine().withCause(ex).log("Ignoring NoteDb update error after ReviewDb write");
+          }
+        }
+      } catch (Exception e) {
+        logDebug("Error updating change (should be rethrown)", e);
+        Throwables.propagateIfPossible(e, RestApiException.class);
+        throw new UpdateException(e);
+      } finally {
+        if (updateManager != null) {
+          updateManager.close();
+        }
+      }
+    }
+
+    private ChangeContextImpl newChangeContext(
+        ReviewDb db, Repository repo, RevWalk rw, Change.Id id) throws OrmException {
+      Change c = newChanges.get(id);
+      boolean isNew = c != null;
+      if (isNew) {
+        // New change: populate noteDbState.
+        checkState(c.getNoteDbState() == null, "noteDbState should not be filled in by callers");
+        if (notesMigration.changePrimaryStorage() == PrimaryStorage.NOTE_DB) {
+          c.setNoteDbState(NoteDbChangeState.NOTE_DB_PRIMARY_STATE);
+        }
+      } else {
+        // Existing change.
+        c = ChangeNotes.readOneReviewDbChange(db, id);
+        if (c == null) {
+          // Not in ReviewDb, but new changes are created with default primary
+          // storage as NOTE_DB, so we can assume that a missing change is
+          // NoteDb primary. Pass a synthetic change into ChangeNotes.Factory,
+          // which lets ChangeNotes take care of the existence check.
+          //
+          // TODO(dborowitz): This assumption is potentially risky, because
+          // it means once we turn this option on and start creating changes
+          // without writing anything to ReviewDb, we can't turn this option
+          // back off without making those changes inaccessible. The problem
+          // is we have no way of distinguishing a change that only exists in
+          // NoteDb because it only ever existed in NoteDb, from a change that
+          // only exists in NoteDb because it used to exist in ReviewDb and
+          // deleting from ReviewDb succeeded but deleting from NoteDb failed.
+          //
+          // TODO(dborowitz): We actually still have that problem anyway. Maybe
+          // we need a cutoff timestamp? Or maybe we need to start leaving
+          // tombstones in ReviewDb?
+          c = ChangeNotes.Factory.newNoteDbOnlyChange(project, id);
+        }
+        NoteDbChangeState.checkNotReadOnly(c, skewMs);
+      }
+      ChangeNotes notes = changeNotesFactory.createForBatchUpdate(c, !isNew);
+      return new ChangeContextImpl(notes, new BatchUpdateReviewDb(db), repo, rw);
+    }
+
+    private NoteDbUpdateManager stageNoteDbUpdate(ChangeContextImpl ctx, boolean deleted)
+        throws OrmException, IOException {
+      logDebug("Staging NoteDb update");
+      NoteDbUpdateManager updateManager =
+          updateManagerFactory
+              .create(ctx.getProject())
+              .setChangeRepo(
+                  ctx.threadLocalRepo,
+                  ctx.threadLocalRevWalk,
+                  null,
+                  new ChainedReceiveCommands(ctx.threadLocalRepo));
+      if (ctx.getUser().isIdentifiedUser()) {
+        updateManager.setRefLogIdent(
+            ctx.getUser().asIdentifiedUser().newRefLogIdent(ctx.getWhen(), tz));
+      }
+      for (ChangeUpdate u : ctx.updates.values()) {
+        updateManager.add(u);
+      }
+
+      Change c = ctx.getChange();
+      if (deleted) {
+        updateManager.deleteChange(c.getId());
+      }
+      try {
+        updateManager.stageAndApplyDelta(c);
+      } catch (MismatchedStateException ex) {
+        // Refused to apply update because NoteDb was out of sync, which can
+        // only happen if ReviewDb is the primary storage for this change.
+        //
+        // Go ahead with this ReviewDb update; it's still out of sync, but this
+        // is no worse than before, and it will eventually get rebuilt.
+        logDebug("Ignoring MismatchedStateException while staging");
+      }
+
+      return updateManager;
+    }
+
+    private boolean isNewChange(Change.Id id) {
+      return newChanges.containsKey(id);
+    }
+  }
+
+  private static Iterable<Change> changesToUpdate(ChangeContextImpl ctx) {
+    Change c = ctx.getChange();
+    if (ctx.bumpLastUpdatedOn && c.getLastUpdatedOn().before(ctx.getWhen())) {
+      c.setLastUpdatedOn(ctx.getWhen());
+    }
+    return Collections.singleton(c);
+  }
+
+  private void executePostOps() throws Exception {
+    ContextImpl ctx = new ContextImpl();
+    for (BatchUpdateOp op : ops.values()) {
+      op.postUpdate(ctx);
+    }
+
+    for (RepoOnlyOp op : repoOnlyOps) {
+      op.postUpdate(ctx);
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/update/UpdateException.java b/java/com/google/gerrit/server/update/UpdateException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/update/UpdateException.java
rename to java/com/google/gerrit/server/update/UpdateException.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/CommitMessageUtil.java b/java/com/google/gerrit/server/util/CommitMessageUtil.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/util/CommitMessageUtil.java
rename to java/com/google/gerrit/server/util/CommitMessageUtil.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/FallbackRequestContext.java b/java/com/google/gerrit/server/util/FallbackRequestContext.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/util/FallbackRequestContext.java
rename to java/com/google/gerrit/server/util/FallbackRequestContext.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/GuiceRequestScopePropagator.java b/java/com/google/gerrit/server/util/GuiceRequestScopePropagator.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/util/GuiceRequestScopePropagator.java
rename to java/com/google/gerrit/server/util/GuiceRequestScopePropagator.java
diff --git a/java/com/google/gerrit/server/util/IdGenerator.java b/java/com/google/gerrit/server/util/IdGenerator.java
new file mode 100644
index 0000000..276df06
--- /dev/null
+++ b/java/com/google/gerrit/server/util/IdGenerator.java
@@ -0,0 +1,89 @@
+// Copyright (C) 2009 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.google.gerrit.server.util;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.Random;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/** Simple class to produce 4 billion keys randomly distributed. */
+@Singleton
+public class IdGenerator {
+
+  private final AtomicInteger gen;
+
+  @Inject
+  IdGenerator() {
+    gen = new AtomicInteger(new Random().nextInt());
+  }
+
+  /** Produce the next identifier. */
+  public int next() {
+    return mix(gen.getAndIncrement());
+  }
+
+  private static final int salt = 0x9e3779b9;
+
+  static int mix(int in) {
+    return mix(salt, in);
+  }
+
+  /** A very simple bit permutation to mask a simple incrementer. */
+  public static int mix(int salt, int in) {
+    short v0 = hi16(in);
+    short v1 = lo16(in);
+    v0 += ((v1 << 2) + 0 ^ v1) + (salt ^ (v1 >>> 3)) + 1;
+    v1 += ((v0 << 2) + 2 ^ v0) + (salt ^ (v0 >>> 3)) + 3;
+    return result(v0, v1);
+  }
+
+  /* For testing only. */
+  static int unmix(int in) {
+    short v0 = hi16(in);
+    short v1 = lo16(in);
+    v1 -= ((v0 << 2) + 2 ^ v0) + (salt ^ (v0 >>> 3)) + 3;
+    v0 -= ((v1 << 2) + 0 ^ v1) + (salt ^ (v1 >>> 3)) + 1;
+    return result(v0, v1);
+  }
+
+  private static short hi16(int in) {
+    return (short)
+        ( //
+        ((in >>> 24 & 0xff))
+            | //
+            ((in >>> 16 & 0xff) << 8) //
+        );
+  }
+
+  private static short lo16(int in) {
+    return (short)
+        ( //
+        ((in >>> 8 & 0xff))
+            | //
+            ((in & 0xff) << 8) //
+        );
+  }
+
+  private static int result(short v0, short v1) {
+    return ((v0 & 0xff) << 24)
+        | //
+        (((v0 >>> 8) & 0xff) << 16)
+        | //
+        ((v1 & 0xff) << 8)
+        | //
+        ((v1 >>> 8) & 0xff);
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/LabelVote.java b/java/com/google/gerrit/server/util/LabelVote.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/util/LabelVote.java
rename to java/com/google/gerrit/server/util/LabelVote.java
diff --git a/java/com/google/gerrit/server/util/MagicBranch.java b/java/com/google/gerrit/server/util/MagicBranch.java
new file mode 100644
index 0000000..a049169
--- /dev/null
+++ b/java/com/google/gerrit/server/util/MagicBranch.java
@@ -0,0 +1,112 @@
+// Copyright (C) 2011 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.google.gerrit.server.util;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.Capable;
+import com.google.gerrit.reviewdb.client.Project;
+import java.io.IOException;
+import java.util.List;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+
+public final class MagicBranch {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static final String NEW_CHANGE = "refs/for/";
+  // TODO(xchangcheng): remove after 'repo' supports private/wip changes.
+  public static final String NEW_DRAFT_CHANGE = "refs/drafts/";
+  // TODO(xchangcheng): remove after migrating tools which are using this magic branch.
+  public static final String NEW_PUBLISH_CHANGE = "refs/publish/";
+
+  /** Extracts the destination from a ref name */
+  public static String getDestBranchName(String refName) {
+    String magicBranch = NEW_CHANGE;
+    if (refName.startsWith(NEW_DRAFT_CHANGE)) {
+      magicBranch = NEW_DRAFT_CHANGE;
+    } else if (refName.startsWith(NEW_PUBLISH_CHANGE)) {
+      magicBranch = NEW_PUBLISH_CHANGE;
+    }
+    return refName.substring(magicBranch.length());
+  }
+
+  /** Checks if the supplied ref name is a magic branch */
+  public static boolean isMagicBranch(String refName) {
+    return refName.startsWith(NEW_DRAFT_CHANGE)
+        || refName.startsWith(NEW_PUBLISH_CHANGE)
+        || refName.startsWith(NEW_CHANGE);
+  }
+
+  /** Returns the ref name prefix for a magic branch, {@code null} if the branch is not magic */
+  public static String getMagicRefNamePrefix(String refName) {
+    if (refName.startsWith(NEW_DRAFT_CHANGE)) {
+      return NEW_DRAFT_CHANGE;
+    }
+    if (refName.startsWith(NEW_PUBLISH_CHANGE)) {
+      return NEW_PUBLISH_CHANGE;
+    }
+    if (refName.startsWith(NEW_CHANGE)) {
+      return NEW_CHANGE;
+    }
+    return null;
+  }
+
+  /**
+   * Checks if a (magic branch)/branch_name reference exists in the destination repository and only
+   * returns Capable.OK if it does not match any.
+   *
+   * <p>These block the client from being able to even send us a pack file, as it is very unlikely
+   * the user passed the --force flag and the new commit is probably not going to fast-forward the
+   * branch.
+   */
+  public static Capable checkMagicBranchRefs(Repository repo, Project project) {
+    Capable result = checkMagicBranchRef(NEW_CHANGE, repo, project);
+    if (result != Capable.OK) {
+      return result;
+    }
+    result = checkMagicBranchRef(NEW_DRAFT_CHANGE, repo, project);
+    if (result != Capable.OK) {
+      return result;
+    }
+    result = checkMagicBranchRef(NEW_PUBLISH_CHANGE, repo, project);
+    if (result != Capable.OK) {
+      return result;
+    }
+
+    return Capable.OK;
+  }
+
+  private static Capable checkMagicBranchRef(String branchName, Repository repo, Project project) {
+    List<Ref> blockingFors;
+    try {
+      blockingFors = repo.getRefDatabase().getRefsByPrefix(branchName);
+    } catch (IOException err) {
+      String projName = project.getName();
+      logger.atWarning().withCause(err).log("Cannot scan refs in '%s'", projName);
+      return new Capable("Server process cannot read '" + projName + "'");
+    }
+    if (!blockingFors.isEmpty()) {
+      String projName = project.getName();
+      logger.atSevere().log(
+          "Repository '%s' needs the following refs removed to receive changes: %s",
+          projName, blockingFors);
+      return new Capable("One or more " + branchName + " names blocks change upload");
+    }
+
+    return Capable.OK;
+  }
+
+  private MagicBranch() {}
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/ManualRequestContext.java b/java/com/google/gerrit/server/util/ManualRequestContext.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/util/ManualRequestContext.java
rename to java/com/google/gerrit/server/util/ManualRequestContext.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/MostSpecificComparator.java b/java/com/google/gerrit/server/util/MostSpecificComparator.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/util/MostSpecificComparator.java
rename to java/com/google/gerrit/server/util/MostSpecificComparator.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/OneOffRequestContext.java b/java/com/google/gerrit/server/util/OneOffRequestContext.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/util/OneOffRequestContext.java
rename to java/com/google/gerrit/server/util/OneOffRequestContext.java
diff --git a/java/com/google/gerrit/server/util/PluginLogFile.java b/java/com/google/gerrit/server/util/PluginLogFile.java
new file mode 100644
index 0000000..de8b3aa
--- /dev/null
+++ b/java/com/google/gerrit/server/util/PluginLogFile.java
@@ -0,0 +1,59 @@
+// Copyright (C) 2015 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.google.gerrit.server.util;
+
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.extensions.systemstatus.ServerInformation;
+import org.apache.log4j.AsyncAppender;
+import org.apache.log4j.Layout;
+import org.apache.log4j.LogManager;
+import org.apache.log4j.Logger;
+
+public abstract class PluginLogFile implements LifecycleListener {
+
+  private final SystemLog systemLog;
+  private final ServerInformation serverInfo;
+  private final String logName;
+  private final Layout layout;
+
+  public PluginLogFile(
+      SystemLog systemLog, ServerInformation serverInfo, String logName, Layout layout) {
+    this.systemLog = systemLog;
+    this.serverInfo = serverInfo;
+    this.logName = logName;
+    this.layout = layout;
+  }
+
+  @Override
+  public void start() {
+    AsyncAppender asyncAppender = systemLog.createAsyncAppender(logName, layout, true, true);
+    Logger logger = LogManager.getLogger(logName);
+    logger.removeAppender(logName);
+    logger.addAppender(asyncAppender);
+    logger.setAdditivity(false);
+  }
+
+  @Override
+  public void stop() {
+    // stop is called when plugin is unloaded or when the server shutdown.
+    // Only clean up when the server is shutting down to prevent issue when a
+    // plugin is reloaded. The issue is that gerrit load the new plugin and then
+    // unload the old one so because loggers are static, the unload of the old
+    // plugin would remove the appenders just created by the new plugin.
+    if (serverInfo.getState() == ServerInformation.State.SHUTDOWN) {
+      LogManager.getLogger(logName).removeAllAppenders();
+    }
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/PluginRequestContext.java b/java/com/google/gerrit/server/util/PluginRequestContext.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/util/PluginRequestContext.java
rename to java/com/google/gerrit/server/util/PluginRequestContext.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/RequestContext.java b/java/com/google/gerrit/server/util/RequestContext.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/util/RequestContext.java
rename to java/com/google/gerrit/server/util/RequestContext.java
diff --git a/java/com/google/gerrit/server/util/RequestScopePropagator.java b/java/com/google/gerrit/server/util/RequestScopePropagator.java
new file mode 100644
index 0000000..e5b0eaf
--- /dev/null
+++ b/java/com/google/gerrit/server/util/RequestScopePropagator.java
@@ -0,0 +1,218 @@
+// Copyright (C) 2012 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.google.gerrit.server.util;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.base.Throwables;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.RequestCleanup;
+import com.google.gerrit.server.config.RequestScopedReviewDbProvider;
+import com.google.gerrit.server.git.ProjectRunnable;
+import com.google.inject.Key;
+import com.google.inject.Provider;
+import com.google.inject.Scope;
+import com.google.inject.servlet.ServletScopes;
+import java.util.concurrent.Callable;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+
+/**
+ * Base class for propagating request-scoped data between threads.
+ *
+ * <p>Request scopes are typically linked to a {@link ThreadLocal}, which is only available to the
+ * current thread. In order to allow background work involving RequestScoped data, the ThreadLocal
+ * data must be copied from the request thread to the new background thread.
+ *
+ * <p>Every type of RequestScope must provide an implementation of RequestScopePropagator. See
+ * {@link #wrap(Callable)} for details on the implementation, usage, and restrictions.
+ *
+ * @see ThreadLocalRequestScopePropagator
+ */
+public abstract class RequestScopePropagator {
+
+  private final Scope scope;
+  private final ThreadLocalRequestContext local;
+  private final Provider<RequestScopedReviewDbProvider> dbProviderProvider;
+
+  protected RequestScopePropagator(
+      Scope scope,
+      ThreadLocalRequestContext local,
+      Provider<RequestScopedReviewDbProvider> dbProviderProvider) {
+    this.scope = scope;
+    this.local = local;
+    this.dbProviderProvider = dbProviderProvider;
+  }
+
+  /**
+   * Ensures that the current request state is available when the passed in Callable is invoked.
+   *
+   * <p>If needed wraps the passed in Callable in a new {@link Callable} that propagates the current
+   * request state when the returned Callable is invoked. The method must be called in a request
+   * scope and the returned Callable may only be invoked in a thread that is not already in a
+   * request scope or is in the same request scope. The returned Callable will inherit toString()
+   * from the passed in Callable. A {@link ScheduledThreadPoolExecutor} does not accept a Callable,
+   * so there is no ProjectCallable implementation. Implementations of this method must be
+   * consistent with Guice's {@link ServletScopes#continueRequest(Callable, java.util.Map)}.
+   *
+   * <p>There are some limitations:
+   *
+   * <ul>
+   *   <li>Derived objects (i.e. anything marked created in a request scope) will not be
+   *       transported.
+   *   <li>State changes to the request scoped context after this method is called will not be seen
+   *       in the continued thread.
+   * </ul>
+   *
+   * @param callable the Callable to wrap.
+   * @return a new Callable which will execute in the current request scope.
+   */
+  @SuppressWarnings("javadoc") // See GuiceRequestScopePropagator#wrapImpl
+  public final <T> Callable<T> wrap(Callable<T> callable) {
+    final RequestContext callerContext = requireNonNull(local.getContext());
+    final Callable<T> wrapped = wrapImpl(context(callerContext, cleanup(callable)));
+    return new Callable<T>() {
+      @Override
+      public T call() throws Exception {
+        if (callerContext == local.getContext()) {
+          return callable.call();
+        }
+        return wrapped.call();
+      }
+
+      @Override
+      public String toString() {
+        return callable.toString();
+      }
+    };
+  }
+
+  /**
+   * Wraps runnable in a new {@link Runnable} that propagates the current request state when the
+   * runnable is invoked. The method must be called in a request scope and the returned Runnable may
+   * only be invoked in a thread that is not already in a request scope. The returned Runnable will
+   * inherit toString() from the passed in Runnable. Furthermore, if the passed runnable is of type
+   * {@link ProjectRunnable}, the returned runnable will be of the same type with the methods
+   * delegated.
+   *
+   * <p>See {@link #wrap(Callable)} for details on implementation and usage.
+   *
+   * @param runnable the Runnable to wrap.
+   * @return a new Runnable which will execute in the current request scope.
+   */
+  public final Runnable wrap(Runnable runnable) {
+    final Callable<Object> wrapped = wrap(Executors.callable(runnable));
+
+    if (runnable instanceof ProjectRunnable) {
+      return new ProjectRunnable() {
+        @Override
+        public void run() {
+          try {
+            wrapped.call();
+          } catch (Exception e) {
+            Throwables.throwIfUnchecked(e);
+            throw new RuntimeException(e); // Not possible.
+          }
+        }
+
+        @Override
+        public Project.NameKey getProjectNameKey() {
+          return ((ProjectRunnable) runnable).getProjectNameKey();
+        }
+
+        @Override
+        public String getRemoteName() {
+          return ((ProjectRunnable) runnable).getRemoteName();
+        }
+
+        @Override
+        public boolean hasCustomizedPrint() {
+          return ((ProjectRunnable) runnable).hasCustomizedPrint();
+        }
+
+        @Override
+        public String toString() {
+          return runnable.toString();
+        }
+      };
+    }
+    return new Runnable() {
+      @Override
+      public void run() {
+        try {
+          wrapped.call();
+        } catch (RuntimeException e) {
+          throw e;
+        } catch (Exception e) {
+          throw new RuntimeException(e); // Not possible.
+        }
+      }
+
+      @Override
+      public String toString() {
+        return runnable.toString();
+      }
+    };
+  }
+
+  /** @see #wrap(Callable) */
+  protected abstract <T> Callable<T> wrapImpl(Callable<T> callable);
+
+  protected <T> Callable<T> context(RequestContext context, Callable<T> callable) {
+    return () -> {
+      RequestContext old =
+          local.setContext(
+              new RequestContext() {
+                @Override
+                public CurrentUser getUser() {
+                  return context.getUser();
+                }
+
+                @Override
+                public Provider<ReviewDb> getReviewDbProvider() {
+                  return dbProviderProvider.get();
+                }
+              });
+      try {
+        return callable.call();
+      } finally {
+        local.setContext(old);
+      }
+    };
+  }
+
+  protected <T> Callable<T> cleanup(Callable<T> callable) {
+    return () -> {
+      RequestCleanup cleanup =
+          scope
+              .scope(
+                  Key.get(RequestCleanup.class),
+                  new Provider<RequestCleanup>() {
+                    @Override
+                    public RequestCleanup get() {
+                      return new RequestCleanup();
+                    }
+                  })
+              .get();
+      try {
+        return callable.call();
+      } finally {
+        cleanup.run();
+      }
+    };
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/ServerRequestContext.java b/java/com/google/gerrit/server/util/ServerRequestContext.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/util/ServerRequestContext.java
rename to java/com/google/gerrit/server/util/ServerRequestContext.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/SocketUtil.java b/java/com/google/gerrit/server/util/SocketUtil.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/util/SocketUtil.java
rename to java/com/google/gerrit/server/util/SocketUtil.java
diff --git a/java/com/google/gerrit/server/util/SystemLog.java b/java/com/google/gerrit/server/util/SystemLog.java
new file mode 100644
index 0000000..ec2f386
--- /dev/null
+++ b/java/com/google/gerrit/server/util/SystemLog.java
@@ -0,0 +1,142 @@
+// Copyright (C) 2014 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.google.gerrit.server.util;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Die;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.nio.file.Path;
+import org.apache.log4j.Appender;
+import org.apache.log4j.AsyncAppender;
+import org.apache.log4j.DailyRollingFileAppender;
+import org.apache.log4j.FileAppender;
+import org.apache.log4j.Layout;
+import org.apache.log4j.LogManager;
+import org.apache.log4j.Logger;
+import org.apache.log4j.helpers.OnlyOnceErrorHandler;
+import org.apache.log4j.spi.ErrorHandler;
+import org.apache.log4j.spi.LoggingEvent;
+import org.eclipse.jgit.lib.Config;
+
+@Singleton
+public class SystemLog {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static final String LOG4J_CONFIGURATION = "log4j.configuration";
+
+  private final SitePaths site;
+  private final int asyncLoggingBufferSize;
+  private final boolean rotateLogs;
+
+  @Inject
+  public SystemLog(SitePaths site, @GerritServerConfig Config config) {
+    this.site = site;
+    this.asyncLoggingBufferSize = config.getInt("core", "asyncLoggingBufferSize", 64);
+    this.rotateLogs = config.getBoolean("log", "rotate", true);
+  }
+
+  public static boolean shouldConfigure() {
+    return Strings.isNullOrEmpty(System.getProperty(LOG4J_CONFIGURATION));
+  }
+
+  public static Appender createAppender(Path logdir, String name, Layout layout, boolean rotate) {
+    final FileAppender dst = rotate ? new DailyRollingFileAppender() : new FileAppender();
+    dst.setName(name);
+    dst.setLayout(layout);
+    dst.setEncoding(UTF_8.name());
+    dst.setFile(resolve(logdir).resolve(name).toString());
+    dst.setImmediateFlush(true);
+    dst.setAppend(true);
+    dst.setErrorHandler(new DieErrorHandler());
+    dst.activateOptions();
+    dst.setErrorHandler(new OnlyOnceErrorHandler());
+    return dst;
+  }
+
+  public AsyncAppender createAsyncAppender(String name, Layout layout) {
+    return createAsyncAppender(name, layout, rotateLogs);
+  }
+
+  private AsyncAppender createAsyncAppender(String name, Layout layout, boolean rotate) {
+    return createAsyncAppender(name, layout, rotate, false);
+  }
+
+  public AsyncAppender createAsyncAppender(
+      String name, Layout layout, boolean rotate, boolean forPlugin) {
+    AsyncAppender async = new AsyncAppender();
+    async.setName(name);
+    async.setBlocking(true);
+    async.setBufferSize(asyncLoggingBufferSize);
+    async.setLocationInfo(false);
+
+    if (forPlugin || shouldConfigure()) {
+      async.addAppender(createAppender(site.logs_dir, name, layout, rotate));
+    } else {
+      Appender appender = LogManager.getLogger(name).getAppender(name);
+      if (appender != null) {
+        async.addAppender(appender);
+      } else {
+        logger.atWarning().log(
+            "No appender with the name: %s was found. %s logging is disabled", name, name);
+      }
+    }
+    async.activateOptions();
+    return async;
+  }
+
+  private static Path resolve(Path p) {
+    try {
+      return p.toRealPath().normalize();
+    } catch (IOException e) {
+      return p.toAbsolutePath().normalize();
+    }
+  }
+
+  private static final class DieErrorHandler implements ErrorHandler {
+    @Override
+    public void error(String message, Exception e, int errorCode, LoggingEvent event) {
+      error(e != null ? e.getMessage() : message);
+    }
+
+    @Override
+    public void error(String message, Exception e, int errorCode) {
+      error(e != null ? e.getMessage() : message);
+    }
+
+    @Override
+    public void error(String message) {
+      throw new Die("Cannot open log file: " + message);
+    }
+
+    @Override
+    public void activateOptions() {}
+
+    @Override
+    public void setAppender(Appender appender) {}
+
+    @Override
+    public void setBackupAppender(Appender appender) {}
+
+    @Override
+    public void setLogger(Logger logger) {}
+  }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/ThreadLocalRequestContext.java b/java/com/google/gerrit/server/util/ThreadLocalRequestContext.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/util/ThreadLocalRequestContext.java
rename to java/com/google/gerrit/server/util/ThreadLocalRequestContext.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/ThreadLocalRequestScopePropagator.java b/java/com/google/gerrit/server/util/ThreadLocalRequestScopePropagator.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/util/ThreadLocalRequestScopePropagator.java
rename to java/com/google/gerrit/server/util/ThreadLocalRequestScopePropagator.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/TreeFormatter.java b/java/com/google/gerrit/server/util/TreeFormatter.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/util/TreeFormatter.java
rename to java/com/google/gerrit/server/util/TreeFormatter.java
diff --git a/java/com/google/gerrit/server/util/git/BUILD b/java/com/google/gerrit/server/util/git/BUILD
new file mode 100644
index 0000000..81ca9cd
--- /dev/null
+++ b/java/com/google/gerrit/server/util/git/BUILD
@@ -0,0 +1,9 @@
+java_library(
+    name = "git",
+    srcs = glob(["**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/reviewdb:server",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+    ],
+)
diff --git a/java/com/google/gerrit/server/util/git/SubmoduleSectionParser.java b/java/com/google/gerrit/server/util/git/SubmoduleSectionParser.java
new file mode 100644
index 0000000..f05d1d7
--- /dev/null
+++ b/java/com/google/gerrit/server/util/git/SubmoduleSectionParser.java
@@ -0,0 +1,145 @@
+// 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.
+
+package com.google.gerrit.server.util.git;
+
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.SubmoduleSubscription;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.Constants;
+
+/**
+ * It parses from a configuration file submodule sections.
+ *
+ * <p>Example of submodule sections:
+ *
+ * <pre>
+ * [submodule "project-a"]
+ *     url = http://localhost/a
+ *     path = a
+ *     branch = .
+ *
+ * [submodule "project-b"]
+ *     url = http://localhost/b
+ *     path = b
+ *     branch = refs/heads/test
+ * </pre>
+ */
+public class SubmoduleSectionParser {
+
+  private final Config config;
+  private final String canonicalWebUrl;
+  private final Branch.NameKey superProjectBranch;
+
+  public SubmoduleSectionParser(
+      Config config, String canonicalWebUrl, Branch.NameKey superProjectBranch) {
+    this.config = config;
+    this.canonicalWebUrl = canonicalWebUrl;
+    this.superProjectBranch = superProjectBranch;
+  }
+
+  public Set<SubmoduleSubscription> parseAllSections() {
+    Set<SubmoduleSubscription> parsedSubscriptions = new HashSet<>();
+    for (String id : config.getSubsections("submodule")) {
+      final SubmoduleSubscription subscription = parse(id);
+      if (subscription != null) {
+        parsedSubscriptions.add(subscription);
+      }
+    }
+    return parsedSubscriptions;
+  }
+
+  private SubmoduleSubscription parse(String id) {
+    final String url = config.getString("submodule", id, "url");
+    final String path = config.getString("submodule", id, "path");
+    String branch = config.getString("submodule", id, "branch");
+
+    try {
+      if (url != null
+          && url.length() > 0
+          && path != null
+          && path.length() > 0
+          && branch != null
+          && branch.length() > 0) {
+        // All required fields filled.
+        String project;
+
+        if (branch.equals(".")) {
+          branch = superProjectBranch.get();
+        }
+
+        // relative URL
+        if (url.startsWith("../")) {
+          // prefix with a slash for easier relative path walks
+          project = '/' + superProjectBranch.getParentKey().get();
+          String hostPart = url;
+          while (hostPart.startsWith("../")) {
+            int lastSlash = project.lastIndexOf('/');
+            if (lastSlash < 0) {
+              // too many levels up, ignore for now
+              return null;
+            }
+            project = project.substring(0, lastSlash);
+            hostPart = hostPart.substring(3);
+          }
+          project = project + "/" + hostPart;
+
+          // remove leading '/'
+          project = project.substring(1);
+        } else {
+          // It is actually an URI. It could be ssh://localhost/project-a.
+          URI targetServerURI = new URI(url);
+          URI thisServerURI = new URI(canonicalWebUrl);
+          String thisHost = thisServerURI.getHost();
+          String targetHost = targetServerURI.getHost();
+          if (thisHost == null || targetHost == null || !targetHost.equalsIgnoreCase(thisHost)) {
+            return null;
+          }
+          String p1 = targetServerURI.getPath();
+          String p2 = thisServerURI.getPath();
+          if (!p1.startsWith(p2)) {
+            // When we are running the server at
+            // http://server/my-gerrit/ but the subscription is for
+            // http://server/other-teams-gerrit/
+            return null;
+          }
+          // skip common part
+          project = p1.substring(p2.length());
+        }
+
+        while (project.startsWith("/")) {
+          project = project.substring(1);
+        }
+
+        if (project.endsWith(Constants.DOT_GIT_EXT)) {
+          project =
+              project.substring(
+                  0, //
+                  project.length() - Constants.DOT_GIT_EXT.length());
+        }
+        Project.NameKey projectKey = new Project.NameKey(project);
+        return new SubmoduleSubscription(
+            superProjectBranch, new Branch.NameKey(projectKey, branch), path);
+      }
+    } catch (URISyntaxException e) {
+      // Error in url syntax (in fact it is uri syntax)
+    }
+    return null;
+  }
+}
diff --git a/java/com/google/gerrit/server/util/time/BUILD b/java/com/google/gerrit/server/util/time/BUILD
new file mode 100644
index 0000000..1d1305d
--- /dev/null
+++ b/java/com/google/gerrit/server/util/time/BUILD
@@ -0,0 +1,9 @@
+java_library(
+    name = "time",
+    srcs = glob(["**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//lib:guava",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+    ],
+)
diff --git a/java/com/google/gerrit/server/util/time/TimeUtil.java b/java/com/google/gerrit/server/util/time/TimeUtil.java
new file mode 100644
index 0000000..645dbb9
--- /dev/null
+++ b/java/com/google/gerrit/server/util/time/TimeUtil.java
@@ -0,0 +1,110 @@
+// Copyright (C) 2013 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.google.gerrit.server.util.time;
+
+import com.google.common.annotations.VisibleForTesting;
+import java.sql.Timestamp;
+import java.time.Instant;
+import java.util.function.LongSupplier;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.storage.file.FileBasedConfig;
+import org.eclipse.jgit.util.FS;
+import org.eclipse.jgit.util.SystemReader;
+
+/** Static utility methods for dealing with dates and times. */
+public class TimeUtil {
+  private static final LongSupplier SYSTEM_CURRENT_MILLIS_SUPPLIER = System::currentTimeMillis;
+
+  private static volatile LongSupplier currentMillisSupplier = SYSTEM_CURRENT_MILLIS_SUPPLIER;
+
+  public static long nowMs() {
+    // We should rather use Instant.now(Clock).toEpochMilli() instead but this would require some
+    // changes in our testing code as we wouldn't have clock steps anymore.
+    return currentMillisSupplier.getAsLong();
+  }
+
+  public static Instant now() {
+    return Instant.ofEpochMilli(nowMs());
+  }
+
+  public static Timestamp nowTs() {
+    return new Timestamp(nowMs());
+  }
+
+  public static Timestamp truncateToSecond(Timestamp t) {
+    return new Timestamp((t.getTime() / 1000) * 1000);
+  }
+
+  @VisibleForTesting
+  public static void setCurrentMillisSupplier(LongSupplier customCurrentMillisSupplier) {
+    currentMillisSupplier = customCurrentMillisSupplier;
+
+    SystemReader oldSystemReader = SystemReader.getInstance();
+    if (!(oldSystemReader instanceof GerritSystemReader)) {
+      SystemReader.setInstance(new GerritSystemReader(oldSystemReader));
+    }
+  }
+
+  @VisibleForTesting
+  public static void resetCurrentMillisSupplier() {
+    currentMillisSupplier = SYSTEM_CURRENT_MILLIS_SUPPLIER;
+    SystemReader.setInstance(null);
+  }
+
+  private static class GerritSystemReader extends SystemReader {
+    SystemReader delegate;
+
+    GerritSystemReader(SystemReader delegate) {
+      this.delegate = delegate;
+    }
+
+    @Override
+    public String getHostname() {
+      return delegate.getHostname();
+    }
+
+    @Override
+    public String getenv(String variable) {
+      return delegate.getenv(variable);
+    }
+
+    @Override
+    public String getProperty(String key) {
+      return delegate.getProperty(key);
+    }
+
+    @Override
+    public FileBasedConfig openUserConfig(Config parent, FS fs) {
+      return delegate.openUserConfig(parent, fs);
+    }
+
+    @Override
+    public FileBasedConfig openSystemConfig(Config parent, FS fs) {
+      return delegate.openSystemConfig(parent, fs);
+    }
+
+    @Override
+    public long getCurrentTime() {
+      return currentMillisSupplier.getAsLong();
+    }
+
+    @Override
+    public int getTimezone(long when) {
+      return delegate.getTimezone(when);
+    }
+  }
+
+  private TimeUtil() {}
+}
diff --git a/java/com/google/gerrit/server/validators/AccountActivationValidationListener.java b/java/com/google/gerrit/server/validators/AccountActivationValidationListener.java
new file mode 100644
index 0000000..bc52308
--- /dev/null
+++ b/java/com/google/gerrit/server/validators/AccountActivationValidationListener.java
@@ -0,0 +1,41 @@
+// 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.
+
+package com.google.gerrit.server.validators;
+
+import com.google.gerrit.extensions.annotations.ExtensionPoint;
+import com.google.gerrit.server.account.AccountState;
+
+/**
+ * Validator that is invoked when an account activated or deactivated via the Gerrit REST API or the
+ * Java extension API.
+ */
+@ExtensionPoint
+public interface AccountActivationValidationListener {
+  /**
+   * Called when an account should be activated to allow validation of the account activation.
+   *
+   * @param account the account that should be activated
+   * @throws ValidationException if validation fails
+   */
+  void validateActivation(AccountState account) throws ValidationException;
+
+  /**
+   * Called when an account should be deactivated to allow validation of the account deactivation.
+   *
+   * @param account the account that should be deactivated
+   * @throws ValidationException if validation fails
+   */
+  void validateDeactivation(AccountState account) throws ValidationException;
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/validators/AssigneeValidationListener.java b/java/com/google/gerrit/server/validators/AssigneeValidationListener.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/validators/AssigneeValidationListener.java
rename to java/com/google/gerrit/server/validators/AssigneeValidationListener.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/validators/GroupCreationValidationListener.java b/java/com/google/gerrit/server/validators/GroupCreationValidationListener.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/validators/GroupCreationValidationListener.java
rename to java/com/google/gerrit/server/validators/GroupCreationValidationListener.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/validators/HashtagValidationListener.java b/java/com/google/gerrit/server/validators/HashtagValidationListener.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/validators/HashtagValidationListener.java
rename to java/com/google/gerrit/server/validators/HashtagValidationListener.java
diff --git a/java/com/google/gerrit/server/validators/OutgoingEmailValidationListener.java b/java/com/google/gerrit/server/validators/OutgoingEmailValidationListener.java
new file mode 100644
index 0000000..996ad87
--- /dev/null
+++ b/java/com/google/gerrit/server/validators/OutgoingEmailValidationListener.java
@@ -0,0 +1,53 @@
+// Copyright (C) 2014 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.google.gerrit.server.validators;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.annotations.ExtensionPoint;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.mail.EmailHeader;
+import java.util.Map;
+import java.util.Set;
+
+/** Listener to provide validation on outgoing email notification. */
+@ExtensionPoint
+public interface OutgoingEmailValidationListener {
+  /** Arguments supplied to validateOutgoingEmail. */
+  class Args {
+    // in arguments
+    public String messageClass;
+    @Nullable public String htmlBody;
+
+    // in/out arguments
+    public Address smtpFromAddress;
+    public Set<Address> smtpRcptTo;
+    public String body; // The text body of the email.
+    public Map<String, EmailHeader> headers;
+  }
+
+  /**
+   * Outgoing e-mail validation.
+   *
+   * <p>Invoked by Gerrit just before an e-mail is sent, after all e-mail templates have been
+   * applied.
+   *
+   * <p>Plugins may modify the following fields in args: - smtpFromAddress - smtpRcptTo - body -
+   * headers
+   *
+   * @param args E-mail properties. Some are mutable.
+   * @throws ValidationException if validation fails.
+   */
+  void validateOutgoingEmail(OutgoingEmailValidationListener.Args args) throws ValidationException;
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/validators/ProjectCreationValidationListener.java b/java/com/google/gerrit/server/validators/ProjectCreationValidationListener.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/validators/ProjectCreationValidationListener.java
rename to java/com/google/gerrit/server/validators/ProjectCreationValidationListener.java
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/validators/ValidationException.java b/java/com/google/gerrit/server/validators/ValidationException.java
similarity index 100%
rename from gerrit-server/src/main/java/com/google/gerrit/server/validators/ValidationException.java
rename to java/com/google/gerrit/server/validators/ValidationException.java
diff --git a/java/com/google/gerrit/sshd/AbstractGitCommand.java b/java/com/google/gerrit/sshd/AbstractGitCommand.java
new file mode 100644
index 0000000..c49ae82
--- /dev/null
+++ b/java/com/google/gerrit/sshd/AbstractGitCommand.java
@@ -0,0 +1,105 @@
+// Copyright (C) 2008 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.google.gerrit.sshd;
+
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.AccessPath;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.sshd.SshScope.Context;
+import com.google.inject.Inject;
+import java.io.IOException;
+import org.apache.sshd.server.Environment;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.Repository;
+import org.kohsuke.args4j.Argument;
+
+public abstract class AbstractGitCommand extends BaseCommand {
+  @Argument(index = 0, metaVar = "PROJECT.git", required = true, usage = "project name")
+  protected ProjectState projectState;
+
+  @Inject private SshScope sshScope;
+
+  @Inject private GitRepositoryManager repoManager;
+
+  @Inject private SshSession session;
+
+  @Inject private SshScope.Context context;
+
+  @Inject private IdentifiedUser.GenericFactory userFactory;
+
+  protected Repository repo;
+  protected Project.NameKey projectName;
+  protected Project project;
+
+  @Override
+  public void start(Environment env) {
+    Context ctx = context.subContext(newSession(), context.getCommandLine());
+    final Context old = sshScope.set(ctx);
+    try {
+      startThread(
+          new ProjectCommandRunnable() {
+            @Override
+            public void executeParseCommand() throws Exception {
+              parseCommandLine();
+            }
+
+            @Override
+            public void run() throws Exception {
+              AbstractGitCommand.this.service();
+            }
+
+            @Override
+            public Project.NameKey getProjectName() {
+              Project project = projectState.getProject();
+              return project.getNameKey();
+            }
+          },
+          AccessPath.GIT);
+    } finally {
+      sshScope.set(old);
+    }
+  }
+
+  private SshSession newSession() {
+    SshSession n =
+        new SshSession(
+            session,
+            session.getRemoteAddress(),
+            userFactory.create(session.getRemoteAddress(), user.getAccountId()));
+    return n;
+  }
+
+  private void service() throws IOException, PermissionBackendException, Failure {
+    project = projectState.getProject();
+    projectName = project.getNameKey();
+
+    try {
+      repo = repoManager.openRepository(projectName);
+    } catch (RepositoryNotFoundException e) {
+      throw new Failure(1, "fatal: '" + project.getName() + "': not a git archive", e);
+    }
+
+    try {
+      runImpl();
+    } finally {
+      repo.close();
+    }
+  }
+
+  protected abstract void runImpl() throws IOException, PermissionBackendException, Failure;
+}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AdminHighPriorityCommand.java b/java/com/google/gerrit/sshd/AdminHighPriorityCommand.java
similarity index 100%
rename from gerrit-sshd/src/main/java/com/google/gerrit/sshd/AdminHighPriorityCommand.java
rename to java/com/google/gerrit/sshd/AdminHighPriorityCommand.java
diff --git a/java/com/google/gerrit/sshd/AliasCommand.java b/java/com/google/gerrit/sshd/AliasCommand.java
new file mode 100644
index 0000000..567cf00
--- /dev/null
+++ b/java/com/google/gerrit/sshd/AliasCommand.java
@@ -0,0 +1,131 @@
+// Copyright (C) 2012 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.google.gerrit.sshd;
+
+import com.google.common.base.Throwables;
+import com.google.common.util.concurrent.Atomics;
+import com.google.gerrit.extensions.api.access.GlobalOrPluginPermission;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import java.io.IOException;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicReference;
+import org.apache.sshd.server.Environment;
+import org.apache.sshd.server.command.Command;
+
+/** Command that executes some other command. */
+public class AliasCommand extends BaseCommand {
+  private final DispatchCommandProvider root;
+  private final PermissionBackend permissionBackend;
+  private final CommandName command;
+  private final AtomicReference<Command> atomicCmd;
+
+  AliasCommand(
+      @CommandName(Commands.ROOT) DispatchCommandProvider root,
+      PermissionBackend permissionBackend,
+      CommandName command) {
+    this.root = root;
+    this.permissionBackend = permissionBackend;
+    this.command = command;
+    this.atomicCmd = Atomics.newReference();
+  }
+
+  @Override
+  public void start(Environment env) throws IOException {
+    try {
+      begin(env);
+    } catch (Failure e) {
+      String msg = e.getMessage();
+      if (!msg.endsWith("\n")) {
+        msg += "\n";
+      }
+      err.write(msg.getBytes(ENC));
+      err.flush();
+      onExit(e.exitCode);
+    }
+  }
+
+  private void begin(Environment env) throws IOException, Failure {
+    Map<String, CommandProvider> map = root.getMap();
+    for (String name : chain(command)) {
+      CommandProvider p = map.get(name);
+      if (p == null) {
+        throw die(getName() + ": not found");
+      }
+
+      Command cmd = p.getProvider().get();
+      if (!(cmd instanceof DispatchCommand)) {
+        throw die(getName() + ": not found");
+      }
+      map = ((DispatchCommand) cmd).getMap();
+    }
+
+    CommandProvider p = map.get(command.value());
+    if (p == null) {
+      throw die(getName() + ": not found");
+    }
+
+    Command cmd = p.getProvider().get();
+    checkRequiresCapability(cmd);
+    if (cmd instanceof BaseCommand) {
+      BaseCommand bc = (BaseCommand) cmd;
+      bc.setName(getName());
+      bc.setArguments(getArguments());
+    }
+    provideStateTo(cmd);
+    atomicCmd.set(cmd);
+    cmd.start(env);
+  }
+
+  @Override
+  public void destroy() {
+    Command cmd = atomicCmd.getAndSet(null);
+    if (cmd != null) {
+      try {
+        cmd.destroy();
+      } catch (Exception e) {
+        Throwables.throwIfUnchecked(e);
+        throw new RuntimeException(e);
+      }
+    }
+  }
+
+  private void checkRequiresCapability(Command cmd) throws Failure {
+    try {
+      Set<GlobalOrPluginPermission> check = GlobalPermission.fromAnnotation(cmd.getClass());
+      try {
+        permissionBackend.currentUser().checkAny(check);
+      } catch (AuthException err) {
+        throw new UnloggedFailure(BaseCommand.STATUS_NOT_ADMIN, "fatal: " + err.getMessage());
+      }
+    } catch (PermissionBackendException err) {
+      throw new Failure(1, "fatal: permissions unavailable", err);
+    }
+  }
+
+  private static LinkedList<String> chain(CommandName command) {
+    LinkedList<String> chain = new LinkedList<>();
+    while (command != null) {
+      chain.addFirst(command.value());
+      command = Commands.parentOf(command);
+    }
+    chain.removeLast();
+    return chain;
+  }
+}
diff --git a/java/com/google/gerrit/sshd/AliasCommandProvider.java b/java/com/google/gerrit/sshd/AliasCommandProvider.java
new file mode 100644
index 0000000..58e2559
--- /dev/null
+++ b/java/com/google/gerrit/sshd/AliasCommandProvider.java
@@ -0,0 +1,40 @@
+// Copyright (C) 2012 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.google.gerrit.sshd;
+
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import org.apache.sshd.server.command.Command;
+
+/** Resolves an alias to another command. */
+public class AliasCommandProvider implements Provider<Command> {
+  private final CommandName command;
+
+  @Inject
+  @CommandName(Commands.ROOT)
+  private DispatchCommandProvider root;
+
+  @Inject private PermissionBackend permissionBackend;
+
+  public AliasCommandProvider(CommandName command) {
+    this.command = command;
+  }
+
+  @Override
+  public Command get() {
+    return new AliasCommand(root, permissionBackend, command);
+  }
+}
diff --git a/java/com/google/gerrit/sshd/BUILD b/java/com/google/gerrit/sshd/BUILD
new file mode 100644
index 0000000..8e1f112
--- /dev/null
+++ b/java/com/google/gerrit/sshd/BUILD
@@ -0,0 +1,45 @@
+java_library(
+    name = "sshd",
+    srcs = glob(["**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/common:annotations",
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/lifecycle",
+        "//java/com/google/gerrit/lucene",
+        "//java/com/google/gerrit/metrics",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/server/audit",
+        "//java/com/google/gerrit/server/cache/h2",
+        "//java/com/google/gerrit/server/git/receive",
+        "//java/com/google/gerrit/server/ioutil",
+        "//java/com/google/gerrit/server/logging",
+        "//java/com/google/gerrit/server/restapi",
+        "//java/com/google/gerrit/server/schema",
+        "//java/com/google/gerrit/server/util/time",
+        "//java/com/google/gerrit/util/cli",
+        "//java/org/eclipse/jgit:server",
+        "//lib:args4j",
+        "//lib:gson",
+        "//lib:guava",
+        "//lib:gwtorm",
+        "//lib:jsch",
+        "//lib:servlet-api-3_1",
+        "//lib/auto:auto-value",
+        "//lib/auto:auto-value-annotations",
+        "//lib/bouncycastle:bcprov-neverlink",
+        "//lib/commons:codec",
+        "//lib/dropwizard:dropwizard-core",
+        "//lib/flogger:api",
+        "//lib/guice",
+        "//lib/guice:guice-assistedinject",
+        "//lib/guice:guice-servlet",  # SSH should not depend on servlet
+        "//lib/jgit/org.eclipse.jgit.archive:jgit-archive",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/log:log4j",
+        "//lib/mina:core",
+        "//lib/mina:sshd",
+    ],
+)
diff --git a/java/com/google/gerrit/sshd/BaseCommand.java b/java/com/google/gerrit/sshd/BaseCommand.java
new file mode 100644
index 0000000..2081967
--- /dev/null
+++ b/java/com/google/gerrit/sshd/BaseCommand.java
@@ -0,0 +1,600 @@
+// Copyright (C) 2009 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.google.gerrit.sshd;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.base.Joiner;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.util.concurrent.Atomics;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.annotations.PluginName;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.AccessPath;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.DynamicOptions;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.RequestCleanup;
+import com.google.gerrit.server.git.ProjectRunnable;
+import com.google.gerrit.server.git.WorkQueue.CancelableRunnable;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.project.NoSuchProjectException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.sshd.SshScope.Context;
+import com.google.gerrit.util.cli.CmdLineParser;
+import com.google.gerrit.util.cli.EndOfOptionsHandler;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InterruptedIOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.nio.charset.Charset;
+import java.util.concurrent.Future;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.atomic.AtomicReference;
+import org.apache.sshd.common.SshException;
+import org.apache.sshd.server.Environment;
+import org.apache.sshd.server.ExitCallback;
+import org.apache.sshd.server.command.Command;
+import org.kohsuke.args4j.Argument;
+import org.kohsuke.args4j.CmdLineException;
+import org.kohsuke.args4j.Option;
+
+public abstract class BaseCommand implements Command {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static final Charset ENC = UTF_8;
+
+  private static final int PRIVATE_STATUS = 1 << 30;
+  static final int STATUS_CANCEL = PRIVATE_STATUS | 1;
+  static final int STATUS_NOT_FOUND = PRIVATE_STATUS | 2;
+  public static final int STATUS_NOT_ADMIN = PRIVATE_STATUS | 3;
+
+  @Option(name = "--", usage = "end of options", handler = EndOfOptionsHandler.class)
+  private boolean endOfOptions;
+
+  protected InputStream in;
+  protected OutputStream out;
+  protected OutputStream err;
+
+  private ExitCallback exit;
+
+  @Inject protected CurrentUser user;
+
+  @Inject private SshScope sshScope;
+
+  @Inject private CmdLineParser.Factory cmdLineParserFactory;
+
+  @Inject private RequestCleanup cleanup;
+
+  @Inject @CommandExecutor private ScheduledThreadPoolExecutor executor;
+
+  @Inject private PermissionBackend permissionBackend;
+
+  @Inject private SshScope.Context context;
+
+  /** Commands declared by a plugin can be scoped by the plugin name. */
+  @Inject(optional = true)
+  @PluginName
+  private String pluginName;
+
+  @Inject private Injector injector;
+
+  @Inject private DynamicMap<DynamicOptions.DynamicBean> dynamicBeans = null;
+
+  /** The task, as scheduled on a worker thread. */
+  private final AtomicReference<Future<?>> task;
+
+  /** Text of the command line which lead up to invoking this instance. */
+  private String commandName = "";
+
+  /** Unparsed command line options. */
+  private String[] argv;
+
+  /** trimmed command line arguments. */
+  private String[] trimmedArgv;
+
+  public BaseCommand() {
+    task = Atomics.newReference();
+  }
+
+  @Override
+  public void setInputStream(InputStream in) {
+    this.in = in;
+  }
+
+  @Override
+  public void setOutputStream(OutputStream out) {
+    this.out = out;
+  }
+
+  @Override
+  public void setErrorStream(OutputStream err) {
+    this.err = err;
+  }
+
+  @Override
+  public void setExitCallback(ExitCallback callback) {
+    this.exit = callback;
+  }
+
+  @Nullable
+  protected String getPluginName() {
+    return pluginName;
+  }
+
+  protected String getName() {
+    return commandName;
+  }
+
+  void setName(String prefix) {
+    this.commandName = prefix;
+  }
+
+  public String[] getArguments() {
+    return argv;
+  }
+
+  public void setArguments(String[] argv) {
+    this.argv = argv;
+  }
+
+  /**
+   * Trim the argument if it is spanning multiple lines.
+   *
+   * @return the arguments where all the multiple-line fields are trimmed.
+   */
+  protected String[] getTrimmedArguments() {
+    if (trimmedArgv == null && argv != null) {
+      trimmedArgv = new String[argv.length];
+      for (int i = 0; i < argv.length; i++) {
+        String arg = argv[i];
+        int indexOfMultiLine = arg.indexOf("\n");
+        if (indexOfMultiLine > -1) {
+          arg = arg.substring(0, indexOfMultiLine) + " [trimmed]";
+        }
+        trimmedArgv[i] = arg;
+      }
+    }
+    return trimmedArgv;
+  }
+
+  @Override
+  public void destroy() {
+    Future<?> future = task.getAndSet(null);
+    if (future != null && !future.isDone()) {
+      future.cancel(true);
+    }
+  }
+
+  /**
+   * Pass all state into the command, then run its start method.
+   *
+   * <p>This method copies all critical state, like the input and output streams, into the supplied
+   * command. The caller must still invoke {@code cmd.start()} if wants to pass control to the
+   * command.
+   *
+   * @param cmd the command that will receive the current state.
+   */
+  protected void provideStateTo(Command cmd) {
+    cmd.setInputStream(in);
+    cmd.setOutputStream(out);
+    cmd.setErrorStream(err);
+    cmd.setExitCallback(exit);
+  }
+
+  /**
+   * Parses the command line argument, injecting parsed values into fields.
+   *
+   * <p>This method must be explicitly invoked to cause a parse.
+   *
+   * @throws UnloggedFailure if the command line arguments were invalid.
+   * @see Option
+   * @see Argument
+   */
+  protected void parseCommandLine() throws UnloggedFailure {
+    parseCommandLine(this);
+  }
+
+  /**
+   * Parses the command line argument, injecting parsed values into fields.
+   *
+   * <p>This method must be explicitly invoked to cause a parse.
+   *
+   * @param options object whose fields declare Option and Argument annotations to describe the
+   *     parameters of the command. Usually {@code this}.
+   * @throws UnloggedFailure if the command line arguments were invalid.
+   * @see Option
+   * @see Argument
+   */
+  protected void parseCommandLine(Object options) throws UnloggedFailure {
+    final CmdLineParser clp = newCmdLineParser(options);
+    DynamicOptions pluginOptions = new DynamicOptions(options, injector, dynamicBeans);
+    pluginOptions.parseDynamicBeans(clp);
+    pluginOptions.setDynamicBeans();
+    pluginOptions.onBeanParseStart();
+    try {
+      clp.parseArgument(argv);
+    } catch (IllegalArgumentException | CmdLineException err) {
+      if (!clp.wasHelpRequestedByOption()) {
+        throw new UnloggedFailure(1, "fatal: " + err.getMessage());
+      }
+    }
+
+    if (clp.wasHelpRequestedByOption()) {
+      StringWriter msg = new StringWriter();
+      clp.printDetailedUsage(commandName, msg);
+      msg.write(usage());
+      throw new UnloggedFailure(1, msg.toString());
+    }
+    pluginOptions.onBeanParseEnd();
+  }
+
+  protected String usage() {
+    return "";
+  }
+
+  /** Construct a new parser for this command's received command line. */
+  protected CmdLineParser newCmdLineParser(Object options) {
+    return cmdLineParserFactory.create(options);
+  }
+
+  /**
+   * Spawn a function into its own thread.
+   *
+   * <p>Typically this should be invoked within {@link Command#start(Environment)}, such as:
+   *
+   * <pre>
+   * startThread(new CommandRunnable() {
+   *   public void run() throws Exception {
+   *     runImp();
+   *   }
+   * },
+   * accessPath);
+   * </pre>
+   *
+   * <p>If the function throws an exception, it is translated to a simple message for the client, a
+   * non-zero exit code, and the stack trace is logged.
+   *
+   * @param thunk the runnable to execute on the thread, performing the command's logic.
+   * @param accessPath the path used by the end user for running the SSH command
+   */
+  protected void startThread(final CommandRunnable thunk, AccessPath accessPath) {
+    final TaskThunk tt = new TaskThunk(thunk, accessPath);
+
+    if (isAdminHighPriorityCommand()) {
+      // Admin commands should not block the main work threads (there
+      // might be an interactive shell there), nor should they wait
+      // for the main work threads.
+      //
+      new Thread(tt, tt.toString()).start();
+    } else {
+      task.set(executor.submit(tt));
+    }
+  }
+
+  private boolean isAdminHighPriorityCommand() {
+    if (getClass().getAnnotation(AdminHighPriorityCommand.class) != null) {
+      try {
+        permissionBackend.user(user).check(GlobalPermission.ADMINISTRATE_SERVER);
+        return true;
+      } catch (AuthException | PermissionBackendException e) {
+        return false;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Terminate this command and return a result code to the remote client.
+   *
+   * <p>Commands should invoke this at most once. Once invoked, the command may lose access to
+   * request based resources as any callbacks previously registered with {@link RequestCleanup} will
+   * fire.
+   *
+   * @param rc exit code for the remote client.
+   */
+  protected void onExit(int rc) {
+    exit.onExit(rc);
+    if (cleanup != null) {
+      cleanup.run();
+    }
+  }
+
+  /** Wrap the supplied output stream in a UTF-8 encoded PrintWriter. */
+  protected static PrintWriter toPrintWriter(OutputStream o) {
+    return new PrintWriter(new BufferedWriter(new OutputStreamWriter(o, ENC)));
+  }
+
+  private int handleError(Throwable e) {
+    if ((e.getClass() == IOException.class && "Pipe closed".equals(e.getMessage()))
+        || //
+        (e.getClass() == SshException.class && "Already closed".equals(e.getMessage()))
+        || //
+        e.getClass() == InterruptedIOException.class) {
+      // This is sshd telling us the client just dropped off while
+      // we were waiting for a read or a write to complete. Either
+      // way its not really a fatal error. Don't log it.
+      //
+      return 127;
+    }
+
+    if (!(e instanceof UnloggedFailure)) {
+      final StringBuilder m = new StringBuilder();
+      m.append("Internal server error");
+      if (user.isIdentifiedUser()) {
+        final IdentifiedUser u = user.asIdentifiedUser();
+        m.append(" (user ");
+        m.append(u.getUserName().orElse(null));
+        m.append(" account ");
+        m.append(u.getAccountId());
+        m.append(")");
+      }
+      m.append(" during ");
+      m.append(context.getCommandLine());
+      logger.atSevere().withCause(e).log(m.toString());
+    }
+
+    if (e instanceof Failure) {
+      final Failure f = (Failure) e;
+      try {
+        err.write((f.getMessage() + "\n").getBytes(ENC));
+        err.flush();
+      } catch (IOException e2) {
+        // Ignored
+      } catch (Throwable e2) {
+        logger.atWarning().withCause(e2).log("Cannot send failure message to client");
+      }
+      return f.exitCode;
+    }
+
+    try {
+      err.write("fatal: internal server error\n".getBytes(ENC));
+      err.flush();
+    } catch (IOException e2) {
+      // Ignored
+    } catch (Throwable e2) {
+      logger.atWarning().withCause(e2).log("Cannot send internal server error message to client");
+    }
+    return 128;
+  }
+
+  protected UnloggedFailure die(String msg) {
+    return new UnloggedFailure(1, "fatal: " + msg);
+  }
+
+  protected UnloggedFailure die(Throwable why) {
+    return new UnloggedFailure(1, "fatal: " + why.getMessage(), why);
+  }
+
+  protected void writeError(String type, String msg) {
+    try {
+      err.write((type + ": " + msg + "\n").getBytes(ENC));
+    } catch (IOException e) {
+      // Ignored
+    }
+  }
+
+  protected String getTaskDescription() {
+    String[] ta = getTrimmedArguments();
+    if (ta != null) {
+      return commandName + " " + Joiner.on(" ").join(ta);
+    }
+    return commandName;
+  }
+
+  private String getTaskName() {
+    StringBuilder m = new StringBuilder();
+    m.append(getTaskDescription());
+    if (user.isIdentifiedUser()) {
+      IdentifiedUser u = user.asIdentifiedUser();
+      if (u.getUserName().isPresent()) {
+        m.append(" (").append(u.getUserName().get()).append(")");
+      }
+    }
+    return m.toString();
+  }
+
+  private final class TaskThunk implements CancelableRunnable, ProjectRunnable {
+    private final CommandRunnable thunk;
+    private final String taskName;
+    private final AccessPath accessPath;
+
+    private Project.NameKey projectName;
+
+    private TaskThunk(final CommandRunnable thunk, AccessPath accessPath) {
+      this.thunk = thunk;
+      this.taskName = getTaskName();
+      this.accessPath = accessPath;
+    }
+
+    @Override
+    public void cancel() {
+      synchronized (this) {
+        final Context old = sshScope.set(context);
+        try {
+          onExit(STATUS_CANCEL);
+        } finally {
+          sshScope.set(old);
+        }
+      }
+    }
+
+    @Override
+    public void run() {
+      synchronized (this) {
+        final Thread thisThread = Thread.currentThread();
+        final String thisName = thisThread.getName();
+        int rc = 0;
+        context.getSession().setAccessPath(accessPath);
+        final Context old = sshScope.set(context);
+        try {
+          context.started = TimeUtil.nowMs();
+          thisThread.setName("SSH " + taskName);
+
+          if (thunk instanceof ProjectCommandRunnable) {
+            ((ProjectCommandRunnable) thunk).executeParseCommand();
+            projectName = ((ProjectCommandRunnable) thunk).getProjectName();
+          }
+
+          try {
+            thunk.run();
+          } catch (NoSuchProjectException e) {
+            throw new UnloggedFailure(1, e.getMessage());
+          } catch (NoSuchChangeException e) {
+            throw new UnloggedFailure(1, e.getMessage() + " no such change");
+          }
+
+          out.flush();
+          err.flush();
+        } catch (Throwable e) {
+          try {
+            out.flush();
+          } catch (Throwable e2) {
+            // Ignored
+          }
+          try {
+            err.flush();
+          } catch (Throwable e2) {
+            // Ignored
+          }
+          rc = handleError(e);
+        } finally {
+          try {
+            onExit(rc);
+          } finally {
+            sshScope.set(old);
+            thisThread.setName(thisName);
+          }
+        }
+      }
+    }
+
+    @Override
+    public String toString() {
+      return taskName;
+    }
+
+    @Override
+    public Project.NameKey getProjectNameKey() {
+      return projectName;
+    }
+
+    @Override
+    public String getRemoteName() {
+      return null;
+    }
+
+    @Override
+    public boolean hasCustomizedPrint() {
+      return false;
+    }
+  }
+
+  /** Runnable function which can throw an exception. */
+  @FunctionalInterface
+  public interface CommandRunnable {
+    void run() throws Exception;
+  }
+
+  /** Runnable function which can retrieve a project name related to the task */
+  public interface ProjectCommandRunnable extends CommandRunnable {
+    // execute parser command before running, in order to be able to retrieve
+    // project name
+    void executeParseCommand() throws Exception;
+
+    Project.NameKey getProjectName();
+  }
+
+  /** Thrown from {@link CommandRunnable#run()} with client message and code. */
+  public static class Failure extends Exception {
+    private static final long serialVersionUID = 1L;
+
+    final int exitCode;
+
+    /**
+     * Create a new failure.
+     *
+     * @param exitCode exit code to return the client, which indicates the failure status of this
+     *     command. Should be between 1 and 255, inclusive.
+     * @param msg message to also send to the client's stderr.
+     */
+    public Failure(int exitCode, String msg) {
+      this(exitCode, msg, null);
+    }
+
+    /**
+     * Create a new failure.
+     *
+     * @param exitCode exit code to return the client, which indicates the failure status of this
+     *     command. Should be between 1 and 255, inclusive.
+     * @param msg message to also send to the client's stderr.
+     * @param why stack trace to include in the server's log, but is not sent to the client's
+     *     stderr.
+     */
+    public Failure(int exitCode, String msg, Throwable why) {
+      super(msg, why);
+      this.exitCode = exitCode;
+    }
+  }
+
+  /** Thrown from {@link CommandRunnable#run()} with client message and code. */
+  public static class UnloggedFailure extends Failure {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * Create a new failure.
+     *
+     * @param msg message to also send to the client's stderr.
+     */
+    public UnloggedFailure(String msg) {
+      this(1, msg);
+    }
+
+    /**
+     * Create a new failure.
+     *
+     * @param exitCode exit code to return the client, which indicates the failure status of this
+     *     command. Should be between 1 and 255, inclusive.
+     * @param msg message to also send to the client's stderr.
+     */
+    public UnloggedFailure(int exitCode, String msg) {
+      this(exitCode, msg, null);
+    }
+
+    /**
+     * Create a new failure.
+     *
+     * @param exitCode exit code to return the client, which indicates the failure status of this
+     *     command. Should be between 1 and 255, inclusive.
+     * @param msg message to also send to the client's stderr.
+     * @param why stack trace to include in the server's log, but is not sent to the client's
+     *     stderr.
+     */
+    public UnloggedFailure(int exitCode, String msg, Throwable why) {
+      super(exitCode, msg, why);
+    }
+  }
+}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CachingPublicKeyAuthenticator.java b/java/com/google/gerrit/sshd/CachingPublicKeyAuthenticator.java
similarity index 100%
rename from gerrit-sshd/src/main/java/com/google/gerrit/sshd/CachingPublicKeyAuthenticator.java
rename to java/com/google/gerrit/sshd/CachingPublicKeyAuthenticator.java
diff --git a/java/com/google/gerrit/sshd/ChangeArgumentParser.java b/java/com/google/gerrit/sshd/ChangeArgumentParser.java
new file mode 100644
index 0000000..7a9f298
--- /dev/null
+++ b/java/com/google/gerrit/sshd/ChangeArgumentParser.java
@@ -0,0 +1,143 @@
+// 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.
+
+package com.google.gerrit.sshd;
+
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.change.ChangeFinder;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.restapi.change.ChangesCollection;
+import com.google.gerrit.sshd.BaseCommand.UnloggedFailure;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+public class ChangeArgumentParser {
+  private final ChangesCollection changesCollection;
+  private final ChangeFinder changeFinder;
+  private final ReviewDb db;
+  private final ChangeNotes.Factory changeNotesFactory;
+  private final PermissionBackend permissionBackend;
+
+  @Inject
+  ChangeArgumentParser(
+      ChangesCollection changesCollection,
+      ChangeFinder changeFinder,
+      ReviewDb db,
+      ChangeNotes.Factory changeNotesFactory,
+      PermissionBackend permissionBackend) {
+    this.changesCollection = changesCollection;
+    this.changeFinder = changeFinder;
+    this.db = db;
+    this.changeNotesFactory = changeNotesFactory;
+    this.permissionBackend = permissionBackend;
+  }
+
+  public void addChange(String id, Map<Change.Id, ChangeResource> changes)
+      throws UnloggedFailure, OrmException, PermissionBackendException, IOException {
+    addChange(id, changes, null);
+  }
+
+  public void addChange(
+      String id, Map<Change.Id, ChangeResource> changes, ProjectState projectState)
+      throws UnloggedFailure, OrmException, PermissionBackendException, IOException {
+    addChange(id, changes, projectState, true);
+  }
+
+  public void addChange(
+      String id,
+      Map<Change.Id, ChangeResource> changes,
+      ProjectState projectState,
+      boolean useIndex)
+      throws UnloggedFailure, OrmException, PermissionBackendException, IOException {
+    List<ChangeNotes> matched = useIndex ? changeFinder.find(id) : changeFromNotesFactory(id);
+    List<ChangeNotes> toAdd = new ArrayList<>(changes.size());
+    boolean canMaintainServer;
+    try {
+      permissionBackend.currentUser().check(GlobalPermission.MAINTAIN_SERVER);
+      canMaintainServer = true;
+    } catch (AuthException | PermissionBackendException e) {
+      canMaintainServer = false;
+    }
+    for (ChangeNotes notes : matched) {
+      if (!changes.containsKey(notes.getChangeId())
+          && inProject(projectState, notes.getProjectName())) {
+        if (canMaintainServer) {
+          toAdd.add(notes);
+          continue;
+        }
+
+        if (!projectState.statePermitsRead()) {
+          continue;
+        }
+
+        try {
+          permissionBackend.currentUser().change(notes).database(db).check(ChangePermission.READ);
+          toAdd.add(notes);
+        } catch (AuthException e) {
+          // Do nothing.
+        }
+      }
+    }
+
+    if (toAdd.isEmpty()) {
+      throw new UnloggedFailure(1, "\"" + id + "\" no such change");
+    } else if (toAdd.size() > 1) {
+      throw new UnloggedFailure(1, "\"" + id + "\" matches multiple changes");
+    }
+    Change.Id cId = toAdd.get(0).getChangeId();
+    ChangeResource changeResource;
+    try {
+      changeResource = changesCollection.parse(cId);
+    } catch (RestApiException e) {
+      throw new UnloggedFailure(1, "\"" + id + "\" no such change");
+    }
+    changes.put(cId, changeResource);
+  }
+
+  private List<ChangeNotes> changeFromNotesFactory(String id) throws OrmException, UnloggedFailure {
+    return changeNotesFactory.create(db, parseId(id));
+  }
+
+  private List<Change.Id> parseId(String id) throws UnloggedFailure {
+    try {
+      return Arrays.asList(new Change.Id(Integer.parseInt(id)));
+    } catch (NumberFormatException e) {
+      throw new UnloggedFailure(2, "Invalid change ID " + id, e);
+    }
+  }
+
+  private boolean inProject(ProjectState projectState, Project.NameKey project) {
+    if (projectState != null) {
+      return projectState.getNameKey().equals(project);
+    }
+
+    // No --project option, so they want every project.
+    return true;
+  }
+}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandExecutor.java b/java/com/google/gerrit/sshd/CommandExecutor.java
similarity index 100%
rename from gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandExecutor.java
rename to java/com/google/gerrit/sshd/CommandExecutor.java
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandExecutorProvider.java b/java/com/google/gerrit/sshd/CommandExecutorProvider.java
similarity index 100%
rename from gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandExecutorProvider.java
rename to java/com/google/gerrit/sshd/CommandExecutorProvider.java
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandExecutorQueueProvider.java b/java/com/google/gerrit/sshd/CommandExecutorQueueProvider.java
similarity index 100%
rename from gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandExecutorQueueProvider.java
rename to java/com/google/gerrit/sshd/CommandExecutorQueueProvider.java
diff --git a/java/com/google/gerrit/sshd/CommandFactoryProvider.java b/java/com/google/gerrit/sshd/CommandFactoryProvider.java
new file mode 100644
index 0000000..3fb2ed4
--- /dev/null
+++ b/java/com/google/gerrit/sshd/CommandFactoryProvider.java
@@ -0,0 +1,310 @@
+// Copyright (C) 2009 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.google.gerrit.sshd;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.common.util.concurrent.Atomics;
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.git.WorkQueue;
+import com.google.gerrit.server.logging.LoggingContextAwareExecutorService;
+import com.google.gerrit.sshd.SshScope.Context;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
+import org.apache.sshd.server.Environment;
+import org.apache.sshd.server.ExitCallback;
+import org.apache.sshd.server.SessionAware;
+import org.apache.sshd.server.command.Command;
+import org.apache.sshd.server.command.CommandFactory;
+import org.apache.sshd.server.session.ServerSession;
+import org.eclipse.jgit.lib.Config;
+
+/** Creates a CommandFactory using commands registered by {@link CommandModule}. */
+@Singleton
+class CommandFactoryProvider implements Provider<CommandFactory>, LifecycleListener {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final DispatchCommandProvider dispatcher;
+  private final SshLog log;
+  private final SshScope sshScope;
+  private final ScheduledExecutorService startExecutor;
+  private final ExecutorService destroyExecutor;
+  private final SchemaFactory<ReviewDb> schemaFactory;
+  private final DynamicItem<SshCreateCommandInterceptor> createCommandInterceptor;
+
+  @Inject
+  CommandFactoryProvider(
+      @CommandName(Commands.ROOT) DispatchCommandProvider d,
+      @GerritServerConfig Config cfg,
+      WorkQueue workQueue,
+      SshLog l,
+      SshScope s,
+      SchemaFactory<ReviewDb> sf,
+      DynamicItem<SshCreateCommandInterceptor> i) {
+    dispatcher = d;
+    log = l;
+    sshScope = s;
+    schemaFactory = sf;
+    createCommandInterceptor = i;
+
+    int threads = cfg.getInt("sshd", "commandStartThreads", 2);
+    startExecutor = workQueue.createQueue(threads, "SshCommandStart", true);
+    destroyExecutor =
+        new LoggingContextAwareExecutorService(
+            Executors.newSingleThreadExecutor(
+                new ThreadFactoryBuilder()
+                    .setNameFormat("SshCommandDestroy-%s")
+                    .setDaemon(true)
+                    .build()));
+  }
+
+  @Override
+  public void start() {}
+
+  @Override
+  public void stop() {
+    destroyExecutor.shutdownNow();
+  }
+
+  @Override
+  public CommandFactory get() {
+    return new CommandFactory() {
+      @Override
+      public Command createCommand(String requestCommand) {
+        String c = requestCommand;
+        SshCreateCommandInterceptor interceptor = createCommandInterceptor.get();
+        if (interceptor != null) {
+          c = interceptor.intercept(c);
+        }
+        return new Trampoline(c);
+      }
+    };
+  }
+
+  private class Trampoline implements Command, SessionAware {
+    private final String commandLine;
+    private final String[] argv;
+    private InputStream in;
+    private OutputStream out;
+    private OutputStream err;
+    private ExitCallback exit;
+    private Environment env;
+    private Context ctx;
+    private DispatchCommand cmd;
+    private final AtomicBoolean logged;
+    private final AtomicReference<Future<?>> task;
+
+    Trampoline(String cmdLine) {
+      commandLine = cmdLine;
+      argv = split(cmdLine);
+      logged = new AtomicBoolean();
+      task = Atomics.newReference();
+    }
+
+    @Override
+    public void setInputStream(InputStream in) {
+      this.in = in;
+    }
+
+    @Override
+    public void setOutputStream(OutputStream out) {
+      this.out = out;
+    }
+
+    @Override
+    public void setErrorStream(OutputStream err) {
+      this.err = err;
+    }
+
+    @Override
+    public void setExitCallback(ExitCallback callback) {
+      this.exit = callback;
+    }
+
+    @Override
+    public void setSession(ServerSession session) {
+      final SshSession s = session.getAttribute(SshSession.KEY);
+      this.ctx = sshScope.newContext(schemaFactory, s, commandLine);
+    }
+
+    @Override
+    public void start(Environment env) throws IOException {
+      this.env = env;
+      final Context ctx = this.ctx;
+      task.set(
+          startExecutor.submit(
+              new Runnable() {
+                @Override
+                public void run() {
+                  try {
+                    onStart();
+                  } catch (Exception e) {
+                    logger.atWarning().withCause(e).log(
+                        "Cannot start command \"%s\" for user %s",
+                        ctx.getCommandLine(), ctx.getSession().getUsername());
+                  }
+                }
+
+                @Override
+                public String toString() {
+                  return "start (user " + ctx.getSession().getUsername() + ")";
+                }
+              }));
+    }
+
+    private void onStart() throws IOException {
+      synchronized (this) {
+        final Context old = sshScope.set(ctx);
+        try {
+          cmd = dispatcher.get();
+          cmd.setArguments(argv);
+          cmd.setInputStream(in);
+          cmd.setOutputStream(out);
+          cmd.setErrorStream(err);
+          cmd.setExitCallback(
+              new ExitCallback() {
+                @Override
+                public void onExit(int rc, String exitMessage) {
+                  exit.onExit(translateExit(rc), exitMessage);
+                  log(rc);
+                }
+
+                @Override
+                public void onExit(int rc) {
+                  exit.onExit(translateExit(rc));
+                  log(rc);
+                }
+              });
+          cmd.start(env);
+        } finally {
+          sshScope.set(old);
+        }
+      }
+    }
+
+    private int translateExit(int rc) {
+      switch (rc) {
+        case BaseCommand.STATUS_NOT_ADMIN:
+          return 1;
+
+        case BaseCommand.STATUS_CANCEL:
+          return 15 /* SIGKILL */;
+
+        case BaseCommand.STATUS_NOT_FOUND:
+          return 127 /* POSIX not found */;
+
+        default:
+          return rc;
+      }
+    }
+
+    private void log(int rc) {
+      if (logged.compareAndSet(false, true)) {
+        log.onExecute(cmd, rc, ctx.getSession());
+      }
+    }
+
+    @Override
+    public void destroy() {
+      Future<?> future = task.getAndSet(null);
+      if (future != null) {
+        future.cancel(true);
+        destroyExecutor.execute(this::onDestroy);
+      }
+    }
+
+    private void onDestroy() {
+      synchronized (this) {
+        if (cmd != null) {
+          final Context old = sshScope.set(ctx);
+          try {
+            cmd.destroy();
+            log(BaseCommand.STATUS_CANCEL);
+          } finally {
+            ctx = null;
+            cmd = null;
+            sshScope.set(old);
+          }
+        }
+      }
+    }
+  }
+
+  /** Split a command line into a string array. */
+  public static String[] split(String commandLine) {
+    final List<String> list = new ArrayList<>();
+    boolean inquote = false;
+    boolean inDblQuote = false;
+    StringBuilder r = new StringBuilder();
+    for (int ip = 0; ip < commandLine.length(); ) {
+      final char b = commandLine.charAt(ip++);
+      switch (b) {
+        case '\t':
+        case ' ':
+          if (inquote || inDblQuote) {
+            r.append(b);
+          } else if (r.length() > 0) {
+            list.add(r.toString());
+            r = new StringBuilder();
+          }
+          continue;
+        case '\"':
+          if (inquote) {
+            r.append(b);
+          } else {
+            inDblQuote = !inDblQuote;
+          }
+          continue;
+        case '\'':
+          if (inDblQuote) {
+            r.append(b);
+          } else {
+            inquote = !inquote;
+          }
+          continue;
+        case '\\':
+          if (inquote || ip == commandLine.length()) {
+            r.append(b); // literal within a quote
+          } else {
+            r.append(commandLine.charAt(ip++));
+          }
+          continue;
+        default:
+          r.append(b);
+          continue;
+      }
+    }
+    if (r.length() > 0) {
+      list.add(r.toString());
+    }
+    return list.toArray(new String[list.size()]);
+  }
+}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandMetaData.java b/java/com/google/gerrit/sshd/CommandMetaData.java
similarity index 100%
rename from gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandMetaData.java
rename to java/com/google/gerrit/sshd/CommandMetaData.java
diff --git a/java/com/google/gerrit/sshd/CommandModule.java b/java/com/google/gerrit/sshd/CommandModule.java
new file mode 100644
index 0000000..ac07056
--- /dev/null
+++ b/java/com/google/gerrit/sshd/CommandModule.java
@@ -0,0 +1,100 @@
+// Copyright (C) 2009 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.google.gerrit.sshd;
+
+import com.google.gerrit.lifecycle.LifecycleModule;
+import com.google.inject.binder.LinkedBindingBuilder;
+import org.apache.sshd.server.command.Command;
+
+/** Module to register commands in the SSH daemon. */
+public abstract class CommandModule extends LifecycleModule {
+  protected boolean slaveMode;
+
+  /**
+   * Configure a command to be invoked by name.
+   *
+   * @param name the name of the command the client will provide in order to call the command.
+   * @return a binding that must be bound to a non-singleton provider for a {@link Command} object.
+   */
+  protected LinkedBindingBuilder<Command> command(String name) {
+    return bind(Commands.key(name));
+  }
+
+  /**
+   * Configure a command to be invoked by name.
+   *
+   * @param name the name of the command the client will provide in order to call the command.
+   * @return a binding that must be bound to a non-singleton provider for a {@link Command} object.
+   */
+  protected LinkedBindingBuilder<Command> command(CommandName name) {
+    return bind(Commands.key(name));
+  }
+
+  /**
+   * Configure a command to be invoked by name.
+   *
+   * @param parent context of the parent command, that this command is a subcommand of.
+   * @param name the name of the command the client will provide in order to call the command.
+   * @return a binding that must be bound to a non-singleton provider for a {@link Command} object.
+   */
+  protected LinkedBindingBuilder<Command> command(CommandName parent, String name) {
+    return bind(Commands.key(parent, name));
+  }
+
+  /**
+   * Configure a command to be invoked by name. The command is bound to the passed class.
+   *
+   * @param parent context of the parent command, that this command is a subcommand of.
+   * @param clazz class of the command with {@link CommandMetaData} annotation to retrieve the name
+   *     and the description from
+   */
+  protected void command(CommandName parent, Class<? extends BaseCommand> clazz) {
+    CommandMetaData meta = clazz.getAnnotation(CommandMetaData.class);
+    if (meta == null) {
+      throw new IllegalStateException("no CommandMetaData annotation found");
+    }
+    if (meta.runsAt().isSupported(slaveMode)) {
+      bind(Commands.key(parent, meta.name(), meta.description())).to(clazz);
+    }
+  }
+
+  /**
+   * Alias one command to another. The alias is bound to the passed class.
+   *
+   * @param parent context of the parent command, that this command is a subcommand of.
+   * @param name the name of the command the client will provide in order to call the command.
+   * @param clazz class of the command with {@link CommandMetaData} annotation to retrieve the
+   *     description from
+   */
+  protected void alias(final CommandName parent, String name, Class<? extends BaseCommand> clazz) {
+    CommandMetaData meta = clazz.getAnnotation(CommandMetaData.class);
+    if (meta == null) {
+      throw new IllegalStateException("no CommandMetaData annotation found");
+    }
+    bind(Commands.key(parent, name, meta.description())).to(clazz);
+  }
+
+  /**
+   * Alias one command to another.
+   *
+   * @param from the new command name that when called will actually delegate to {@code to}'s
+   *     implementation.
+   * @param to name of an already registered command that will perform the action when {@code from}
+   *     is invoked by a client.
+   */
+  protected void alias(String from, String to) {
+    bind(Commands.key(from)).to(Commands.key(to));
+  }
+}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandName.java b/java/com/google/gerrit/sshd/CommandName.java
similarity index 100%
rename from gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandName.java
rename to java/com/google/gerrit/sshd/CommandName.java
diff --git a/java/com/google/gerrit/sshd/CommandProvider.java b/java/com/google/gerrit/sshd/CommandProvider.java
new file mode 100644
index 0000000..cf2e84c
--- /dev/null
+++ b/java/com/google/gerrit/sshd/CommandProvider.java
@@ -0,0 +1,37 @@
+// Copyright (C) 2013 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.google.gerrit.sshd;
+
+import com.google.inject.Provider;
+import org.apache.sshd.server.command.Command;
+
+final class CommandProvider {
+
+  private final Provider<Command> provider;
+  private final String description;
+
+  CommandProvider(Provider<Command> p, String d) {
+    this.provider = p;
+    this.description = d;
+  }
+
+  public Provider<Command> getProvider() {
+    return provider;
+  }
+
+  public String getDescription() {
+    return description;
+  }
+}
diff --git a/java/com/google/gerrit/sshd/Commands.java b/java/com/google/gerrit/sshd/Commands.java
new file mode 100644
index 0000000..b6d3401
--- /dev/null
+++ b/java/com/google/gerrit/sshd/Commands.java
@@ -0,0 +1,138 @@
+// Copyright (C) 2009 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.google.gerrit.sshd;
+
+import com.google.auto.value.AutoAnnotation;
+import com.google.inject.Key;
+import java.lang.annotation.Annotation;
+import org.apache.sshd.server.command.Command;
+
+/** Utilities to support {@link CommandName} construction. */
+public class Commands {
+  /** Magic value signaling the top level. */
+  public static final String ROOT = "";
+
+  /** Magic value signaling the top level. */
+  public static final CommandName CMD_ROOT = named(ROOT);
+
+  public static Key<Command> key(String name) {
+    return key(named(name));
+  }
+
+  public static Key<Command> key(CommandName name) {
+    return Key.get(Command.class, name);
+  }
+
+  public static Key<Command> key(CommandName parent, String name) {
+    return Key.get(Command.class, named(parent, name));
+  }
+
+  public static Key<Command> key(CommandName parent, String name, String descr) {
+    return Key.get(Command.class, named(parent, name, descr));
+  }
+
+  /** Create a CommandName annotation for the supplied name. */
+  @AutoAnnotation
+  public static CommandName named(String value) {
+    return new AutoAnnotation_Commands_named(value);
+  }
+
+  /** Create a CommandName annotation for the supplied name. */
+  public static CommandName named(CommandName parent, String name) {
+    return new NestedCommandNameImpl(parent, name);
+  }
+
+  /** Create a CommandName annotation for the supplied name and description. */
+  public static CommandName named(CommandName parent, String name, String descr) {
+    return new NestedCommandNameImpl(parent, name, descr);
+  }
+
+  /** Return the name of this command, possibly including any parents. */
+  public static String nameOf(CommandName name) {
+    if (name instanceof NestedCommandNameImpl) {
+      return nameOf(((NestedCommandNameImpl) name).parent) + " " + name.value();
+    }
+    return name.value();
+  }
+
+  /** Is the second command a direct child of the first command? */
+  public static boolean isChild(CommandName parent, CommandName name) {
+    if (name instanceof NestedCommandNameImpl) {
+      return parent.equals(((NestedCommandNameImpl) name).parent);
+    }
+    if (parent == CMD_ROOT) {
+      return true;
+    }
+    return false;
+  }
+
+  static CommandName parentOf(CommandName name) {
+    if (name instanceof NestedCommandNameImpl) {
+      return ((NestedCommandNameImpl) name).parent;
+    }
+    return null;
+  }
+
+  static final class NestedCommandNameImpl implements CommandName {
+    private final CommandName parent;
+    private final String name;
+    private final String descr;
+
+    NestedCommandNameImpl(CommandName parent, String name) {
+      this.parent = parent;
+      this.name = name;
+      this.descr = "";
+    }
+
+    NestedCommandNameImpl(CommandName parent, String name, String descr) {
+      this.parent = parent;
+      this.name = name;
+      this.descr = descr;
+    }
+
+    @Override
+    public String value() {
+      return name;
+    }
+
+    public String descr() {
+      return descr;
+    }
+
+    @Override
+    public Class<? extends Annotation> annotationType() {
+      return CommandName.class;
+    }
+
+    @Override
+    public int hashCode() {
+      return parent.hashCode() * 31 + value().hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+      return obj instanceof NestedCommandNameImpl
+          && parent.equals(((NestedCommandNameImpl) obj).parent)
+          && value().equals(((NestedCommandNameImpl) obj).value());
+    }
+
+    @Override
+    public String toString() {
+      return "CommandName[" + nameOf(this) + "]";
+    }
+  }
+
+  private Commands() {}
+}
diff --git a/java/com/google/gerrit/sshd/DatabasePubKeyAuth.java b/java/com/google/gerrit/sshd/DatabasePubKeyAuth.java
new file mode 100644
index 0000000..1e32e1b
--- /dev/null
+++ b/java/com/google/gerrit/sshd/DatabasePubKeyAuth.java
@@ -0,0 +1,222 @@
+// Copyright (C) 2008 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.google.gerrit.sshd;
+
+import static com.google.common.base.Preconditions.checkState;
+import static java.nio.charset.StandardCharsets.ISO_8859_1;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.FileUtil;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.PeerDaemonUser;
+import com.google.gerrit.server.account.AccountSshKey;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.inject.Inject;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
+import java.nio.file.Path;
+import java.security.KeyPair;
+import java.security.PublicKey;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Locale;
+import java.util.Set;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.sshd.common.SshException;
+import org.apache.sshd.common.keyprovider.KeyPairProvider;
+import org.apache.sshd.common.util.buffer.ByteArrayBuffer;
+import org.apache.sshd.server.auth.pubkey.PublickeyAuthenticator;
+import org.apache.sshd.server.session.ServerSession;
+import org.eclipse.jgit.lib.Config;
+
+/** Authenticates by public key through {@link AccountSshKey} entities. */
+class DatabasePubKeyAuth implements PublickeyAuthenticator {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final SshKeyCacheImpl sshKeyCache;
+  private final SshLog sshLog;
+  private final IdentifiedUser.GenericFactory userFactory;
+  private final PeerDaemonUser.Factory peerFactory;
+  private final Config config;
+  private final SshScope sshScope;
+  private final Set<PublicKey> myHostKeys;
+  private volatile PeerKeyCache peerKeyCache;
+
+  @Inject
+  DatabasePubKeyAuth(
+      SshKeyCacheImpl skc,
+      SshLog l,
+      IdentifiedUser.GenericFactory uf,
+      PeerDaemonUser.Factory pf,
+      SitePaths site,
+      KeyPairProvider hostKeyProvider,
+      @GerritServerConfig Config cfg,
+      SshScope s) {
+    sshKeyCache = skc;
+    sshLog = l;
+    userFactory = uf;
+    peerFactory = pf;
+    config = cfg;
+    sshScope = s;
+    myHostKeys = myHostKeys(hostKeyProvider);
+    peerKeyCache = new PeerKeyCache(site.peer_keys);
+  }
+
+  private static Set<PublicKey> myHostKeys(KeyPairProvider p) {
+    final Set<PublicKey> keys = new HashSet<>(6);
+    addPublicKey(keys, p, KeyPairProvider.SSH_ED25519);
+    addPublicKey(keys, p, KeyPairProvider.ECDSA_SHA2_NISTP256);
+    addPublicKey(keys, p, KeyPairProvider.ECDSA_SHA2_NISTP384);
+    addPublicKey(keys, p, KeyPairProvider.ECDSA_SHA2_NISTP521);
+    addPublicKey(keys, p, KeyPairProvider.SSH_RSA);
+    addPublicKey(keys, p, KeyPairProvider.SSH_DSS);
+    return keys;
+  }
+
+  private static void addPublicKey(
+      final Collection<PublicKey> out, KeyPairProvider p, String type) {
+    final KeyPair pair = p.loadKey(type);
+    if (pair != null && pair.getPublic() != null) {
+      out.add(pair.getPublic());
+    }
+  }
+
+  @Override
+  public boolean authenticate(String username, PublicKey suppliedKey, ServerSession session) {
+    SshSession sd = session.getAttribute(SshSession.KEY);
+    checkState(sd.getUser() == null);
+    if (PeerDaemonUser.USER_NAME.equals(username)) {
+      if (myHostKeys.contains(suppliedKey) || getPeerKeys().contains(suppliedKey)) {
+        PeerDaemonUser user = peerFactory.create(sd.getRemoteAddress());
+        return SshUtil.success(username, session, sshScope, sshLog, sd, user);
+      }
+      sd.authenticationError(username, "no-matching-key");
+      return false;
+    }
+
+    if (config.getBoolean("auth", "userNameToLowerCase", false)) {
+      username = username.toLowerCase(Locale.US);
+    }
+
+    Iterable<SshKeyCacheEntry> keyList = sshKeyCache.get(username);
+    SshKeyCacheEntry key = find(keyList, suppliedKey);
+    if (key == null) {
+      String err;
+      if (keyList == SshKeyCacheImpl.NO_SUCH_USER) {
+        err = "user-not-found";
+      } else if (keyList == SshKeyCacheImpl.NO_KEYS) {
+        err = "key-list-empty";
+      } else {
+        err = "no-matching-key";
+      }
+      sd.authenticationError(username, err);
+      return false;
+    }
+
+    // Double check that all of the keys are for the same user account.
+    // This should have been true when the cache factory method loaded
+    // the list into memory, but we want to be extra paranoid about our
+    // security check to ensure there aren't two users sharing the same
+    // user name on the server.
+    //
+    for (SshKeyCacheEntry otherKey : keyList) {
+      if (!key.getAccount().equals(otherKey.getAccount())) {
+        sd.authenticationError(username, "keys-cross-accounts");
+        return false;
+      }
+    }
+
+    IdentifiedUser cu = SshUtil.createUser(sd, userFactory, key.getAccount());
+    if (!cu.getAccount().isActive()) {
+      sd.authenticationError(username, "inactive-account");
+      return false;
+    }
+
+    return SshUtil.success(username, session, sshScope, sshLog, sd, cu);
+  }
+
+  private Set<PublicKey> getPeerKeys() {
+    PeerKeyCache p = peerKeyCache;
+    if (!p.isCurrent()) {
+      p = p.reload();
+      peerKeyCache = p;
+    }
+    return p.keys;
+  }
+
+  private SshKeyCacheEntry find(Iterable<SshKeyCacheEntry> keyList, PublicKey suppliedKey) {
+    for (SshKeyCacheEntry k : keyList) {
+      if (k.match(suppliedKey)) {
+        return k;
+      }
+    }
+    return null;
+  }
+
+  private static class PeerKeyCache {
+    private final Path path;
+    private final long modified;
+    final Set<PublicKey> keys;
+
+    PeerKeyCache(Path path) {
+      this.path = path;
+      this.modified = FileUtil.lastModified(path);
+      this.keys = read(path);
+    }
+
+    private static Set<PublicKey> read(Path path) {
+      try (BufferedReader br = Files.newBufferedReader(path, UTF_8)) {
+        final Set<PublicKey> keys = new HashSet<>();
+        String line;
+        while ((line = br.readLine()) != null) {
+          line = line.trim();
+          if (line.startsWith("#") || line.isEmpty()) {
+            continue;
+          }
+
+          try {
+            byte[] bin = Base64.decodeBase64(line.getBytes(ISO_8859_1));
+            keys.add(new ByteArrayBuffer(bin).getRawPublicKey());
+          } catch (RuntimeException | SshException e) {
+            logBadKey(path, line, e);
+          }
+        }
+        return Collections.unmodifiableSet(keys);
+      } catch (NoSuchFileException noFile) {
+        return Collections.emptySet();
+      } catch (IOException err) {
+        logger.atSevere().withCause(err).log("Cannot read %s", path);
+        return Collections.emptySet();
+      }
+    }
+
+    private static void logBadKey(Path path, String line, Exception e) {
+      logger.atWarning().withCause(e).log("Invalid key in %s:\n  %s", path, line);
+    }
+
+    boolean isCurrent() {
+      return modified == FileUtil.lastModified(path);
+    }
+
+    PeerKeyCache reload() {
+      return new PeerKeyCache(path);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/sshd/DispatchCommand.java b/java/com/google/gerrit/sshd/DispatchCommand.java
new file mode 100644
index 0000000..4c9ca91
--- /dev/null
+++ b/java/com/google/gerrit/sshd/DispatchCommand.java
@@ -0,0 +1,181 @@
+// Copyright (C) 2009 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.google.gerrit.sshd;
+
+import com.google.common.base.Strings;
+import com.google.common.base.Throwables;
+import com.google.common.collect.Sets;
+import com.google.common.util.concurrent.Atomics;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.server.args4j.SubcommandHandler;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
+import org.apache.sshd.server.Environment;
+import org.apache.sshd.server.command.Command;
+import org.kohsuke.args4j.Argument;
+
+/** Command that dispatches to a subcommand from its command table. */
+final class DispatchCommand extends BaseCommand {
+  interface Factory {
+    DispatchCommand create(Map<String, CommandProvider> map);
+  }
+
+  private final PermissionBackend permissionBackend;
+  private final Map<String, CommandProvider> commands;
+  private final AtomicReference<Command> atomicCmd;
+
+  @Argument(index = 0, required = false, metaVar = "COMMAND", handler = SubcommandHandler.class)
+  private String commandName;
+
+  @Argument(index = 1, multiValued = true, metaVar = "ARG")
+  private List<String> args = new ArrayList<>();
+
+  @Inject
+  DispatchCommand(PermissionBackend permissionBackend, @Assisted Map<String, CommandProvider> all) {
+    this.permissionBackend = permissionBackend;
+    commands = all;
+    atomicCmd = Atomics.newReference();
+  }
+
+  Map<String, CommandProvider> getMap() {
+    return commands;
+  }
+
+  @Override
+  public void start(Environment env) throws IOException {
+    try {
+      parseCommandLine();
+      if (Strings.isNullOrEmpty(commandName)) {
+        StringWriter msg = new StringWriter();
+        msg.write(usage());
+        throw die(msg.toString());
+      }
+
+      final CommandProvider p = commands.get(commandName);
+      if (p == null) {
+        String msg =
+            (getName().isEmpty() ? "Gerrit Code Review" : getName())
+                + ": "
+                + commandName
+                + ": not found";
+        throw die(msg);
+      }
+
+      final Command cmd = p.getProvider().get();
+      checkRequiresCapability(cmd);
+      if (cmd instanceof BaseCommand) {
+        final BaseCommand bc = (BaseCommand) cmd;
+        if (getName().isEmpty()) {
+          bc.setName(commandName);
+        } else {
+          bc.setName(getName() + " " + commandName);
+        }
+        bc.setArguments(args.toArray(new String[args.size()]));
+
+      } else if (!args.isEmpty()) {
+        throw die(commandName + " does not take arguments");
+      }
+
+      provideStateTo(cmd);
+      atomicCmd.set(cmd);
+      cmd.start(env);
+
+    } catch (UnloggedFailure e) {
+      String msg = e.getMessage();
+      if (!msg.endsWith("\n")) {
+        msg += "\n";
+      }
+      err.write(msg.getBytes(ENC));
+      err.flush();
+      onExit(e.exitCode);
+    }
+  }
+
+  private void checkRequiresCapability(Command cmd) throws UnloggedFailure {
+    String pluginName = null;
+    if (cmd instanceof BaseCommand) {
+      pluginName = ((BaseCommand) cmd).getPluginName();
+    }
+    try {
+      permissionBackend
+          .currentUser()
+          .checkAny(GlobalPermission.fromAnnotation(pluginName, cmd.getClass()));
+    } catch (AuthException e) {
+      throw new UnloggedFailure(BaseCommand.STATUS_NOT_ADMIN, e.getMessage());
+    } catch (PermissionBackendException e) {
+      throw new UnloggedFailure(1, "fatal: permission check unavailable", e);
+    }
+  }
+
+  @Override
+  public void destroy() {
+    Command cmd = atomicCmd.getAndSet(null);
+    if (cmd != null) {
+      try {
+        cmd.destroy();
+      } catch (Exception e) {
+        Throwables.throwIfUnchecked(e);
+        throw new RuntimeException(e);
+      }
+    }
+  }
+
+  @Override
+  protected String usage() {
+    final StringBuilder usage = new StringBuilder();
+    usage.append("Available commands");
+    if (!getName().isEmpty()) {
+      usage.append(" of ");
+      usage.append(getName());
+    }
+    usage.append(" are:\n");
+    usage.append("\n");
+
+    int maxLength = -1;
+    for (String name : commands.keySet()) {
+      maxLength = Math.max(maxLength, name.length());
+    }
+    String format = "%-" + maxLength + "s   %s";
+    for (String name : Sets.newTreeSet(commands.keySet())) {
+      final CommandProvider p = commands.get(name);
+      usage.append("   ");
+      usage.append(String.format(format, name, Strings.nullToEmpty(p.getDescription())));
+      usage.append("\n");
+    }
+    usage.append("\n");
+
+    usage.append("See '");
+    if (getName().indexOf(' ') < 0) {
+      usage.append(getName());
+      usage.append(' ');
+    }
+    usage.append("COMMAND --help' for more information.\n");
+    usage.append("\n");
+    return usage.toString();
+  }
+
+  public String getCommandName() {
+    return commandName;
+  }
+}
diff --git a/java/com/google/gerrit/sshd/DispatchCommandProvider.java b/java/com/google/gerrit/sshd/DispatchCommandProvider.java
new file mode 100644
index 0000000..7ff7224
--- /dev/null
+++ b/java/com/google/gerrit/sshd/DispatchCommandProvider.java
@@ -0,0 +1,109 @@
+// Copyright (C) 2009 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.google.gerrit.sshd;
+
+import com.google.common.collect.Maps;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import com.google.inject.Binding;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Provider;
+import com.google.inject.TypeLiteral;
+import java.lang.annotation.Annotation;
+import java.util.List;
+import java.util.concurrent.ConcurrentMap;
+import org.apache.sshd.server.command.Command;
+
+/** Creates DispatchCommand using commands registered by {@link CommandModule}. */
+public class DispatchCommandProvider implements Provider<DispatchCommand> {
+  @Inject private Injector injector;
+
+  @Inject private DispatchCommand.Factory factory;
+
+  private final CommandName parent;
+  private volatile ConcurrentMap<String, CommandProvider> map;
+
+  public DispatchCommandProvider(CommandName cn) {
+    this.parent = cn;
+  }
+
+  @Override
+  public DispatchCommand get() {
+    return factory.create(getMap());
+  }
+
+  public RegistrationHandle register(CommandName name, Provider<Command> cmd) {
+    final ConcurrentMap<String, CommandProvider> m = getMap();
+    final CommandProvider commandProvider = new CommandProvider(cmd, null);
+    if (m.putIfAbsent(name.value(), commandProvider) != null) {
+      throw new IllegalArgumentException(name.value() + " exists");
+    }
+    return new RegistrationHandle() {
+      @Override
+      public void remove() {
+        m.remove(name.value(), commandProvider);
+      }
+    };
+  }
+
+  public RegistrationHandle replace(CommandName name, Provider<Command> cmd) {
+    final ConcurrentMap<String, CommandProvider> m = getMap();
+    final CommandProvider commandProvider = new CommandProvider(cmd, null);
+    m.put(name.value(), commandProvider);
+    return new RegistrationHandle() {
+      @Override
+      public void remove() {
+        m.remove(name.value(), commandProvider);
+      }
+    };
+  }
+
+  ConcurrentMap<String, CommandProvider> getMap() {
+    if (map == null) {
+      synchronized (this) {
+        if (map == null) {
+          map = createMap();
+        }
+      }
+    }
+    return map;
+  }
+
+  @SuppressWarnings("unchecked")
+  private ConcurrentMap<String, CommandProvider> createMap() {
+    ConcurrentMap<String, CommandProvider> m = Maps.newConcurrentMap();
+    for (Binding<?> b : allCommands()) {
+      final Annotation annotation = b.getKey().getAnnotation();
+      if (annotation instanceof CommandName) {
+        final CommandName n = (CommandName) annotation;
+        if (!Commands.CMD_ROOT.equals(n) && Commands.isChild(parent, n)) {
+          String descr = null;
+          if (annotation instanceof Commands.NestedCommandNameImpl) {
+            Commands.NestedCommandNameImpl impl = ((Commands.NestedCommandNameImpl) annotation);
+            descr = impl.descr();
+          }
+          m.put(n.value(), new CommandProvider((Provider<Command>) b.getProvider(), descr));
+        }
+      }
+    }
+    return m;
+  }
+
+  private static final TypeLiteral<Command> type = new TypeLiteral<Command>() {};
+
+  private List<Binding<Command>> allCommands() {
+    return injector.findBindingsByType(type);
+  }
+}
diff --git a/java/com/google/gerrit/sshd/GerritGSSAuthenticator.java b/java/com/google/gerrit/sshd/GerritGSSAuthenticator.java
new file mode 100644
index 0000000..adb5085
--- /dev/null
+++ b/java/com/google/gerrit/sshd/GerritGSSAuthenticator.java
@@ -0,0 +1,82 @@
+// 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.
+
+package com.google.gerrit.sshd;
+
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.IdentifiedUser.GenericFactory;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.Locale;
+import java.util.Optional;
+import org.apache.sshd.server.auth.gss.GSSAuthenticator;
+import org.apache.sshd.server.session.ServerSession;
+import org.eclipse.jgit.lib.Config;
+
+/** Authenticates users with kerberos (gssapi-with-mic). */
+@Singleton
+class GerritGSSAuthenticator extends GSSAuthenticator {
+  private final AccountCache accounts;
+  private final SshScope sshScope;
+  private final SshLog sshLog;
+  private final GenericFactory userFactory;
+  private final Config config;
+
+  @Inject
+  GerritGSSAuthenticator(
+      AccountCache accounts,
+      SshScope sshScope,
+      SshLog sshLog,
+      IdentifiedUser.GenericFactory userFactory,
+      @GerritServerConfig Config config) {
+    this.accounts = accounts;
+    this.sshScope = sshScope;
+    this.sshLog = sshLog;
+    this.userFactory = userFactory;
+    this.config = config;
+  }
+
+  @Override
+  public boolean validateIdentity(ServerSession session, String identity) {
+    SshSession sd = session.getAttribute(SshSession.KEY);
+    int at = identity.indexOf('@');
+    String username;
+    if (at == -1) {
+      username = identity;
+    } else {
+      username = identity.substring(0, at);
+    }
+    if (config.getBoolean("auth", "userNameToLowerCase", false)) {
+      username = username.toLowerCase(Locale.US);
+    }
+
+    Optional<Account> account =
+        accounts.getByUsername(username).map(AccountState::getAccount).filter(Account::isActive);
+    if (!account.isPresent()) {
+      return false;
+    }
+
+    return SshUtil.success(
+        username,
+        session,
+        sshScope,
+        sshLog,
+        sd,
+        SshUtil.createUser(sd, userFactory, account.get().getId()));
+  }
+}
diff --git a/java/com/google/gerrit/sshd/HostKeyProvider.java b/java/com/google/gerrit/sshd/HostKeyProvider.java
new file mode 100644
index 0000000..bffcfcd
--- /dev/null
+++ b/java/com/google/gerrit/sshd/HostKeyProvider.java
@@ -0,0 +1,83 @@
+// Copyright (C) 2009 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.google.gerrit.sshd;
+
+import com.google.gerrit.server.config.SitePaths;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.ProvisionException;
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.sshd.common.keyprovider.FileKeyPairProvider;
+import org.apache.sshd.common.keyprovider.KeyPairProvider;
+import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider;
+
+class HostKeyProvider implements Provider<KeyPairProvider> {
+  private final SitePaths site;
+
+  @Inject
+  HostKeyProvider(SitePaths site) {
+    this.site = site;
+  }
+
+  @Override
+  public KeyPairProvider get() {
+    Path objKey = site.ssh_key;
+    Path rsaKey = site.ssh_rsa;
+    Path ecdsaKey_256 = site.ssh_ecdsa_256;
+    Path ecdsaKey_384 = site.ssh_ecdsa_384;
+    Path ecdsaKey_521 = site.ssh_ecdsa_521;
+    Path ed25519Key = site.ssh_ed25519;
+
+    final List<File> stdKeys = new ArrayList<>(6);
+    if (Files.exists(rsaKey)) {
+      stdKeys.add(rsaKey.toAbsolutePath().toFile());
+    }
+    if (Files.exists(ecdsaKey_256)) {
+      stdKeys.add(ecdsaKey_256.toAbsolutePath().toFile());
+    }
+    if (Files.exists(ecdsaKey_384)) {
+      stdKeys.add(ecdsaKey_384.toAbsolutePath().toFile());
+    }
+    if (Files.exists(ecdsaKey_521)) {
+      stdKeys.add(ecdsaKey_521.toAbsolutePath().toFile());
+    }
+    if (Files.exists(ed25519Key)) {
+      stdKeys.add(ed25519Key.toAbsolutePath().toFile());
+    }
+
+    if (Files.exists(objKey)) {
+      if (stdKeys.isEmpty()) {
+        SimpleGeneratorHostKeyProvider p = new SimpleGeneratorHostKeyProvider();
+        p.setPath(objKey.toAbsolutePath());
+        return p;
+      }
+      // Both formats of host key exist, we don't know which format
+      // should be authoritative. Complain and abort.
+      //
+      stdKeys.add(objKey.toAbsolutePath().toFile());
+      throw new ProvisionException("Multiple host keys exist: " + stdKeys);
+    }
+    if (stdKeys.isEmpty()) {
+      throw new ProvisionException("No SSH keys under " + site.etc_dir);
+    }
+    FileKeyPairProvider kp = new FileKeyPairProvider();
+    kp.setFiles(stdKeys);
+    return kp;
+  }
+}
diff --git a/java/com/google/gerrit/sshd/NoShell.java b/java/com/google/gerrit/sshd/NoShell.java
new file mode 100644
index 0000000..0235554
--- /dev/null
+++ b/java/com/google/gerrit/sshd/NoShell.java
@@ -0,0 +1,200 @@
+// Copyright (C) 2008 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.google.gerrit.sshd;
+
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.config.AnonymousCowardName;
+import com.google.gerrit.server.config.CanonicalWebUrl;
+import com.google.gerrit.server.ssh.SshInfo;
+import com.google.gerrit.sshd.SshScope.Context;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import org.apache.sshd.common.Factory;
+import org.apache.sshd.server.Environment;
+import org.apache.sshd.server.ExitCallback;
+import org.apache.sshd.server.SessionAware;
+import org.apache.sshd.server.command.Command;
+import org.apache.sshd.server.session.ServerSession;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.util.SystemReader;
+
+/**
+ * Dummy shell which prints a message and terminates.
+ *
+ * <p>This implementation is used to ensure clients who try to SSH directly to this server without
+ * supplying a command will get a reasonable error message, but cannot continue further.
+ */
+class NoShell implements Factory<Command> {
+  private final Provider<SendMessage> shell;
+
+  @Inject
+  NoShell(Provider<SendMessage> shell) {
+    this.shell = shell;
+  }
+
+  @Override
+  public Command create() {
+    return shell.get();
+  }
+
+  static class SendMessage implements Command, SessionAware {
+    private final Provider<MessageFactory> messageFactory;
+    private final SchemaFactory<ReviewDb> schemaFactory;
+    private final SshScope sshScope;
+
+    private InputStream in;
+    private OutputStream out;
+    private OutputStream err;
+    private ExitCallback exit;
+    private Context context;
+
+    @Inject
+    SendMessage(
+        Provider<MessageFactory> messageFactory, SchemaFactory<ReviewDb> sf, SshScope sshScope) {
+      this.messageFactory = messageFactory;
+      this.schemaFactory = sf;
+      this.sshScope = sshScope;
+    }
+
+    @Override
+    public void setInputStream(InputStream in) {
+      this.in = in;
+    }
+
+    @Override
+    public void setOutputStream(OutputStream out) {
+      this.out = out;
+    }
+
+    @Override
+    public void setErrorStream(OutputStream err) {
+      this.err = err;
+    }
+
+    @Override
+    public void setExitCallback(ExitCallback callback) {
+      this.exit = callback;
+    }
+
+    @Override
+    public void setSession(ServerSession session) {
+      SshSession s = session.getAttribute(SshSession.KEY);
+      this.context = sshScope.newContext(schemaFactory, s, "");
+    }
+
+    @Override
+    public void start(Environment env) throws IOException {
+      Context old = sshScope.set(context);
+      String message;
+      try {
+        message = messageFactory.get().getMessage();
+      } finally {
+        sshScope.set(old);
+      }
+      err.write(Constants.encode(message));
+      err.flush();
+
+      in.close();
+      out.close();
+      err.close();
+      exit.onExit(127);
+    }
+
+    @Override
+    public void destroy() {}
+  }
+
+  static class MessageFactory {
+    private final IdentifiedUser user;
+    private final SshInfo sshInfo;
+    private final Provider<String> urlProvider;
+    private final String anonymousCowardName;
+
+    @Inject
+    MessageFactory(
+        IdentifiedUser user,
+        SshInfo sshInfo,
+        @CanonicalWebUrl Provider<String> urlProvider,
+        @AnonymousCowardName String anonymousCowardName) {
+      this.user = user;
+      this.sshInfo = sshInfo;
+      this.urlProvider = urlProvider;
+      this.anonymousCowardName = anonymousCowardName;
+    }
+
+    String getMessage() {
+      StringBuilder msg = new StringBuilder();
+
+      msg.append("\r\n");
+      msg.append("  ****    Welcome to Gerrit Code Review    ****\r\n");
+      msg.append("\r\n");
+
+      Account account = user.getAccount();
+      String name = account.getFullName();
+      if (name == null || name.isEmpty()) {
+        name = user.getUserName().orElse(anonymousCowardName);
+      }
+      msg.append("  Hi ");
+      msg.append(name);
+      msg.append(", you have successfully connected over SSH.");
+      msg.append("\r\n");
+      msg.append("\r\n");
+
+      msg.append("  Unfortunately, interactive shells are disabled.\r\n");
+      msg.append("  To clone a hosted Git repository, use:\r\n");
+      msg.append("\r\n");
+
+      if (!sshInfo.getHostKeys().isEmpty()) {
+        String host = sshInfo.getHostKeys().get(0).getHost();
+        if (host.startsWith("*:")) {
+          host = getGerritHost() + host.substring(1);
+        }
+
+        msg.append("  git clone ssh://");
+        if (user.getUserName().isPresent()) {
+          msg.append(user.getUserName().get());
+          msg.append("@");
+        }
+        msg.append(host);
+        msg.append("/");
+        msg.append("REPOSITORY_NAME.git");
+        msg.append("\r\n");
+      }
+
+      msg.append("\r\n");
+      return msg.toString();
+    }
+
+    private String getGerritHost() {
+      String url = urlProvider.get();
+      if (url != null) {
+        try {
+          return new URL(url).getHost();
+        } catch (MalformedURLException e) {
+          // Ignored
+        }
+      }
+      return SystemReader.getInstance().getHostname();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/sshd/PluginCommandModule.java b/java/com/google/gerrit/sshd/PluginCommandModule.java
new file mode 100644
index 0000000..f0dc17a
--- /dev/null
+++ b/java/com/google/gerrit/sshd/PluginCommandModule.java
@@ -0,0 +1,53 @@
+// Copyright (C) 2012 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.google.gerrit.sshd;
+
+import static com.google.common.base.Preconditions.checkState;
+
+import com.google.gerrit.extensions.annotations.PluginName;
+import com.google.inject.Inject;
+import com.google.inject.binder.LinkedBindingBuilder;
+import org.apache.sshd.server.command.Command;
+
+public abstract class PluginCommandModule extends CommandModule {
+  private CommandName command;
+
+  @Inject
+  void setPluginName(@PluginName String name) {
+    this.command = Commands.named(name);
+  }
+
+  @Override
+  protected final void configure() {
+    checkState(command != null, "@PluginName must be provided");
+    bind(Commands.key(command)).toProvider(new DispatchCommandProvider(command));
+    configureCommands();
+  }
+
+  protected abstract void configureCommands();
+
+  @Override
+  protected LinkedBindingBuilder<Command> command(String subCmd) {
+    return bind(Commands.key(command, subCmd));
+  }
+
+  protected void command(Class<? extends BaseCommand> clazz) {
+    command(command, clazz);
+  }
+
+  protected void alias(String name, Class<? extends BaseCommand> clazz) {
+    alias(command, name, clazz);
+  }
+}
diff --git a/java/com/google/gerrit/sshd/SingleCommandPluginModule.java b/java/com/google/gerrit/sshd/SingleCommandPluginModule.java
new file mode 100644
index 0000000..edc797c
--- /dev/null
+++ b/java/com/google/gerrit/sshd/SingleCommandPluginModule.java
@@ -0,0 +1,44 @@
+// Copyright (C) 2013 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.google.gerrit.sshd;
+
+import static com.google.common.base.Preconditions.checkState;
+
+import com.google.gerrit.extensions.annotations.PluginName;
+import com.google.inject.Inject;
+import com.google.inject.binder.LinkedBindingBuilder;
+import org.apache.sshd.server.command.Command;
+
+/**
+ * Binds one SSH command to the plugin name itself.
+ *
+ * <p>Cannot be combined with {@link PluginCommandModule}.
+ */
+public abstract class SingleCommandPluginModule extends CommandModule {
+  private CommandName command;
+
+  @Inject
+  void setPluginName(@PluginName String name) {
+    this.command = Commands.named(name);
+  }
+
+  @Override
+  protected final void configure() {
+    checkState(command != null, "@PluginName must be provided");
+    configure(bind(Commands.key(command)));
+  }
+
+  protected abstract void configure(LinkedBindingBuilder<Command> bind);
+}
diff --git a/java/com/google/gerrit/sshd/SshAutoRegisterModuleGenerator.java b/java/com/google/gerrit/sshd/SshAutoRegisterModuleGenerator.java
new file mode 100644
index 0000000..5b6d8f9
--- /dev/null
+++ b/java/com/google/gerrit/sshd/SshAutoRegisterModuleGenerator.java
@@ -0,0 +1,92 @@
+// Copyright (C) 2012 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.google.gerrit.sshd;
+
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.gerrit.server.plugins.AutoRegisterUtil.calculateBindAnnotation;
+
+import com.google.common.collect.LinkedListMultimap;
+import com.google.common.collect.ListMultimap;
+import com.google.gerrit.extensions.annotations.Export;
+import com.google.gerrit.server.plugins.InvalidPluginException;
+import com.google.gerrit.server.plugins.ModuleGenerator;
+import com.google.inject.AbstractModule;
+import com.google.inject.Module;
+import com.google.inject.TypeLiteral;
+import java.lang.annotation.Annotation;
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.sshd.server.command.Command;
+
+class SshAutoRegisterModuleGenerator extends AbstractModule implements ModuleGenerator {
+  private final Map<String, Class<Command>> commands = new HashMap<>();
+  private final ListMultimap<TypeLiteral<?>, Class<?>> listeners = LinkedListMultimap.create();
+  private CommandName command;
+
+  @Override
+  protected void configure() {
+    bind(Commands.key(command)).toProvider(new DispatchCommandProvider(command));
+    for (Map.Entry<String, Class<Command>> e : commands.entrySet()) {
+      bind(Commands.key(command, e.getKey())).to(e.getValue());
+    }
+    for (Map.Entry<TypeLiteral<?>, Class<?>> e : listeners.entries()) {
+      @SuppressWarnings("unchecked")
+      TypeLiteral<Object> type = (TypeLiteral<Object>) e.getKey();
+
+      @SuppressWarnings("unchecked")
+      Class<Object> impl = (Class<Object>) e.getValue();
+
+      Annotation n = calculateBindAnnotation(impl);
+      bind(type).annotatedWith(n).to(impl);
+    }
+  }
+
+  @Override
+  public void setPluginName(String name) {
+    command = Commands.named(name);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public void export(Export export, Class<?> type) throws InvalidPluginException {
+    checkState(command != null, "pluginName must be provided");
+    if (Command.class.isAssignableFrom(type)) {
+      Class<Command> old = commands.get(export.value());
+      if (old != null) {
+        throw new InvalidPluginException(
+            String.format(
+                "@Export(\"%s\") has duplicate bindings:\n  %s\n  %s",
+                export.value(), old.getName(), type.getName()));
+      }
+      commands.put(export.value(), (Class<Command>) type);
+    } else {
+      throw new InvalidPluginException(
+          String.format(
+              "Class %s with @Export(\"%s\") must extend %s or implement %s",
+              type.getName(), export.value(), SshCommand.class.getName(), Command.class.getName()));
+    }
+  }
+
+  @Override
+  public void listen(TypeLiteral<?> tl, Class<?> clazz) {
+    listeners.put(tl, clazz);
+  }
+
+  @Override
+  public Module create() throws InvalidPluginException {
+    checkState(command != null, "pluginName must be provided");
+    return !commands.isEmpty() ? this : null;
+  }
+}
diff --git a/java/com/google/gerrit/sshd/SshCommand.java b/java/com/google/gerrit/sshd/SshCommand.java
new file mode 100644
index 0000000..47c6098
--- /dev/null
+++ b/java/com/google/gerrit/sshd/SshCommand.java
@@ -0,0 +1,65 @@
+// Copyright (C) 2012 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.google.gerrit.sshd;
+
+import com.google.gerrit.server.AccessPath;
+import com.google.gerrit.server.logging.TraceContext;
+import java.io.IOException;
+import java.io.PrintWriter;
+import org.apache.sshd.server.Environment;
+import org.kohsuke.args4j.Option;
+
+public abstract class SshCommand extends BaseCommand {
+  @Option(name = "--trace", usage = "enable request tracing")
+  private boolean trace;
+
+  @Option(name = "--trace-id", usage = "trace ID (can only be set if --trace was set too)")
+  private String traceId;
+
+  protected PrintWriter stdout;
+  protected PrintWriter stderr;
+
+  @Override
+  public void start(Environment env) throws IOException {
+    startThread(
+        new CommandRunnable() {
+          @Override
+          public void run() throws Exception {
+            parseCommandLine();
+            stdout = toPrintWriter(out);
+            stderr = toPrintWriter(err);
+            try (TraceContext traceContext = enableTracing()) {
+              SshCommand.this.run();
+            } finally {
+              stdout.flush();
+              stderr.flush();
+            }
+          }
+        },
+        AccessPath.SSH_COMMAND);
+  }
+
+  protected abstract void run() throws UnloggedFailure, Failure, Exception;
+
+  private TraceContext enableTracing() throws UnloggedFailure {
+    if (!trace && traceId != null) {
+      throw die("A trace ID can only be set if --trace was specified.");
+    }
+    return TraceContext.newTrace(
+        trace,
+        traceId,
+        (tagName, traceId) -> stderr.println(String.format("%s: %s", tagName, traceId)));
+  }
+}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshCreateCommandInterceptor.java b/java/com/google/gerrit/sshd/SshCreateCommandInterceptor.java
similarity index 100%
rename from gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshCreateCommandInterceptor.java
rename to java/com/google/gerrit/sshd/SshCreateCommandInterceptor.java
diff --git a/java/com/google/gerrit/sshd/SshDaemon.java b/java/com/google/gerrit/sshd/SshDaemon.java
new file mode 100644
index 0000000..ef356f1
--- /dev/null
+++ b/java/com/google/gerrit/sshd/SshDaemon.java
@@ -0,0 +1,789 @@
+// Copyright (C) 2008 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.google.gerrit.sshd;
+
+import static com.google.gerrit.server.ssh.SshAddressesModule.IANA_SSH_PORT;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.apache.sshd.common.channel.ChannelOutputStream.WAIT_FOR_SPACE_TIMEOUT;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Iterables;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Version;
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.metrics.Counter0;
+import com.google.gerrit.metrics.Description;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.server.config.ConfigUtil;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.ssh.SshAdvertisedAddresses;
+import com.google.gerrit.server.ssh.SshInfo;
+import com.google.gerrit.server.ssh.SshListenAddresses;
+import com.google.gerrit.server.util.IdGenerator;
+import com.google.gerrit.server.util.SocketUtil;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.jcraft.jsch.HostKey;
+import com.jcraft.jsch.JSchException;
+import java.io.File;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.net.UnknownHostException;
+import java.nio.file.FileStore;
+import java.nio.file.FileSystem;
+import java.nio.file.Path;
+import java.nio.file.PathMatcher;
+import java.nio.file.WatchService;
+import java.nio.file.attribute.UserPrincipalLookupService;
+import java.nio.file.spi.FileSystemProvider;
+import java.security.InvalidKeyException;
+import java.security.KeyPair;
+import java.security.PublicKey;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.apache.mina.transport.socket.SocketSessionConfig;
+import org.apache.sshd.common.BaseBuilder;
+import org.apache.sshd.common.NamedFactory;
+import org.apache.sshd.common.channel.RequestHandler;
+import org.apache.sshd.common.cipher.Cipher;
+import org.apache.sshd.common.compression.BuiltinCompressions;
+import org.apache.sshd.common.compression.Compression;
+import org.apache.sshd.common.file.FileSystemFactory;
+import org.apache.sshd.common.forward.DefaultForwarderFactory;
+import org.apache.sshd.common.future.CloseFuture;
+import org.apache.sshd.common.future.SshFutureListener;
+import org.apache.sshd.common.io.AbstractIoServiceFactory;
+import org.apache.sshd.common.io.IoAcceptor;
+import org.apache.sshd.common.io.IoServiceFactory;
+import org.apache.sshd.common.io.IoServiceFactoryFactory;
+import org.apache.sshd.common.io.IoSession;
+import org.apache.sshd.common.io.mina.MinaServiceFactoryFactory;
+import org.apache.sshd.common.io.mina.MinaSession;
+import org.apache.sshd.common.io.nio2.Nio2ServiceFactoryFactory;
+import org.apache.sshd.common.kex.KeyExchange;
+import org.apache.sshd.common.keyprovider.KeyPairProvider;
+import org.apache.sshd.common.mac.Mac;
+import org.apache.sshd.common.random.Random;
+import org.apache.sshd.common.random.SingletonRandomFactory;
+import org.apache.sshd.common.session.ConnectionService;
+import org.apache.sshd.common.session.Session;
+import org.apache.sshd.common.util.buffer.Buffer;
+import org.apache.sshd.common.util.buffer.ByteArrayBuffer;
+import org.apache.sshd.common.util.net.SshdSocketAddress;
+import org.apache.sshd.common.util.security.SecurityUtils;
+import org.apache.sshd.server.ServerBuilder;
+import org.apache.sshd.server.SshServer;
+import org.apache.sshd.server.auth.UserAuth;
+import org.apache.sshd.server.auth.gss.GSSAuthenticator;
+import org.apache.sshd.server.auth.gss.UserAuthGSSFactory;
+import org.apache.sshd.server.auth.pubkey.PublickeyAuthenticator;
+import org.apache.sshd.server.auth.pubkey.UserAuthPublicKeyFactory;
+import org.apache.sshd.server.command.Command;
+import org.apache.sshd.server.command.CommandFactory;
+import org.apache.sshd.server.forward.ForwardingFilter;
+import org.apache.sshd.server.global.CancelTcpipForwardHandler;
+import org.apache.sshd.server.global.KeepAliveHandler;
+import org.apache.sshd.server.global.NoMoreSessionsHandler;
+import org.apache.sshd.server.global.TcpipForwardHandler;
+import org.apache.sshd.server.session.ServerSessionImpl;
+import org.apache.sshd.server.session.SessionFactory;
+import org.bouncycastle.crypto.prng.RandomGenerator;
+import org.bouncycastle.crypto.prng.VMPCRandomGenerator;
+import org.eclipse.jgit.lib.Config;
+
+/**
+ * SSH daemon to communicate with Gerrit.
+ *
+ * <p>Use a Git URL such as <code>ssh://${email}@${host}:${port}/${path}</code>, e.g. {@code
+ * ssh://sop@google.com@gerrit.com:8010/tools/gerrit.git} to access the SSH daemon itself.
+ *
+ * <p>Versions of Git before 1.5.3 may require setting the username and port properties in the
+ * user's {@code ~/.ssh/config} file, and using a host alias through a URL such as {@code
+ * gerrit-alias:/tools/gerrit.git}:
+ *
+ * <pre>{@code
+ * Host gerrit-alias
+ *  User sop@google.com
+ *  Hostname gerrit.com
+ *  Port 8010
+ * }</pre>
+ */
+@Singleton
+public class SshDaemon extends SshServer implements SshInfo, LifecycleListener {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public enum SshSessionBackend {
+    MINA,
+    NIO2
+  }
+
+  private final List<SocketAddress> listen;
+  private final List<String> advertised;
+  private final boolean keepAlive;
+  private final List<HostKey> hostKeys;
+  private volatile IoAcceptor daemonAcceptor;
+  private final Config cfg;
+
+  @Inject
+  SshDaemon(
+      CommandFactory commandFactory,
+      NoShell noShell,
+      PublickeyAuthenticator userAuth,
+      GerritGSSAuthenticator kerberosAuth,
+      KeyPairProvider hostKeyProvider,
+      IdGenerator idGenerator,
+      @GerritServerConfig Config cfg,
+      SshLog sshLog,
+      @SshListenAddresses List<SocketAddress> listen,
+      @SshAdvertisedAddresses List<String> advertised,
+      MetricMaker metricMaker) {
+    setPort(IANA_SSH_PORT /* never used */);
+
+    this.cfg = cfg;
+    this.listen = listen;
+    this.advertised = advertised;
+    keepAlive = cfg.getBoolean("sshd", "tcpkeepalive", true);
+
+    getProperties()
+        .put(
+            SERVER_IDENTIFICATION,
+            "GerritCodeReview_"
+                + Version.getVersion() //
+                + " ("
+                + super.getVersion()
+                + ")");
+
+    getProperties().put(MAX_AUTH_REQUESTS, String.valueOf(cfg.getInt("sshd", "maxAuthTries", 6)));
+
+    getProperties()
+        .put(
+            AUTH_TIMEOUT,
+            String.valueOf(
+                MILLISECONDS.convert(
+                    ConfigUtil.getTimeUnit(cfg, "sshd", null, "loginGraceTime", 120, SECONDS),
+                    SECONDS)));
+
+    long idleTimeoutSeconds = ConfigUtil.getTimeUnit(cfg, "sshd", null, "idleTimeout", 0, SECONDS);
+    getProperties().put(IDLE_TIMEOUT, String.valueOf(SECONDS.toMillis(idleTimeoutSeconds)));
+    getProperties().put(NIO2_READ_TIMEOUT, String.valueOf(SECONDS.toMillis(idleTimeoutSeconds)));
+
+    long rekeyTimeLimit =
+        ConfigUtil.getTimeUnit(cfg, "sshd", null, "rekeyTimeLimit", 3600, SECONDS);
+    getProperties().put(REKEY_TIME_LIMIT, String.valueOf(SECONDS.toMillis(rekeyTimeLimit)));
+
+    getProperties()
+        .put(
+            REKEY_BYTES_LIMIT,
+            String.valueOf(cfg.getLong("sshd", "rekeyBytesLimit", 1024 * 1024 * 1024 /* 1GB */)));
+
+    long waitTimeoutSeconds = ConfigUtil.getTimeUnit(cfg, "sshd", null, "waitTimeout", 30, SECONDS);
+    getProperties()
+        .put(WAIT_FOR_SPACE_TIMEOUT, String.valueOf(SECONDS.toMillis(waitTimeoutSeconds)));
+
+    final int maxConnectionsPerUser = cfg.getInt("sshd", "maxConnectionsPerUser", 64);
+    if (0 < maxConnectionsPerUser) {
+      getProperties().put(MAX_CONCURRENT_SESSIONS, String.valueOf(maxConnectionsPerUser));
+    }
+
+    final String kerberosKeytab = cfg.getString("sshd", null, "kerberosKeytab");
+    final String kerberosPrincipal = cfg.getString("sshd", null, "kerberosPrincipal");
+
+    final boolean enableCompression = cfg.getBoolean("sshd", "enableCompression", false);
+
+    SshSessionBackend backend = cfg.getEnum("sshd", null, "backend", SshSessionBackend.NIO2);
+
+    System.setProperty(
+        IoServiceFactoryFactory.class.getName(),
+        backend == SshSessionBackend.MINA
+            ? MinaServiceFactoryFactory.class.getName()
+            : Nio2ServiceFactoryFactory.class.getName());
+
+    initProviderBouncyCastle(cfg);
+    initCiphers(cfg);
+    initKeyExchanges(cfg);
+    initMacs(cfg);
+    initSignatures();
+    initChannels();
+    initForwarding();
+    initFileSystemFactory();
+    initSubsystems();
+    initCompression(enableCompression);
+    initUserAuth(userAuth, kerberosAuth, kerberosKeytab, kerberosPrincipal);
+    setKeyPairProvider(hostKeyProvider);
+    setCommandFactory(commandFactory);
+    setShellFactory(noShell);
+
+    final AtomicInteger connected = new AtomicInteger();
+    metricMaker.newCallbackMetric(
+        "sshd/sessions/connected",
+        Integer.class,
+        new Description("Currently connected SSH sessions").setGauge().setUnit("sessions"),
+        connected::get);
+
+    final Counter0 sessionsCreated =
+        metricMaker.newCounter(
+            "sshd/sessions/created",
+            new Description("Rate of new SSH sessions").setRate().setUnit("sessions"));
+
+    final Counter0 authFailures =
+        metricMaker.newCounter(
+            "sshd/sessions/authentication_failures",
+            new Description("Rate of SSH authentication failures").setRate().setUnit("failures"));
+
+    setSessionFactory(
+        new SessionFactory(this) {
+          @Override
+          protected ServerSessionImpl createSession(IoSession io) throws Exception {
+            connected.incrementAndGet();
+            sessionsCreated.increment();
+            if (io instanceof MinaSession) {
+              if (((MinaSession) io).getSession().getConfig() instanceof SocketSessionConfig) {
+                ((SocketSessionConfig) ((MinaSession) io).getSession().getConfig())
+                    .setKeepAlive(keepAlive);
+              }
+            }
+
+            ServerSessionImpl s = super.createSession(io);
+            int id = idGenerator.next();
+            SocketAddress peer = io.getRemoteAddress();
+            final SshSession sd = new SshSession(id, peer);
+            s.setAttribute(SshSession.KEY, sd);
+
+            // Log a session close without authentication as a failure.
+            //
+            s.addCloseFutureListener(
+                new SshFutureListener<CloseFuture>() {
+                  @Override
+                  public void operationComplete(CloseFuture future) {
+                    connected.decrementAndGet();
+                    if (sd.isAuthenticationError()) {
+                      authFailures.increment();
+                      sshLog.onAuthFail(sd);
+                    }
+                  }
+                });
+            return s;
+          }
+
+          @Override
+          protected ServerSessionImpl doCreateSession(IoSession ioSession) throws Exception {
+            return new ServerSessionImpl(getServer(), ioSession);
+          }
+        });
+    setGlobalRequestHandlers(
+        Arrays.<RequestHandler<ConnectionService>>asList(
+            new KeepAliveHandler(),
+            new NoMoreSessionsHandler(),
+            new TcpipForwardHandler(),
+            new CancelTcpipForwardHandler()));
+
+    hostKeys = computeHostKeys();
+  }
+
+  @Override
+  public List<HostKey> getHostKeys() {
+    return hostKeys;
+  }
+
+  public IoAcceptor getIoAcceptor() {
+    return daemonAcceptor;
+  }
+
+  @Override
+  public synchronized void start() {
+    if (daemonAcceptor == null && !listen.isEmpty()) {
+      checkConfig();
+      if (getSessionFactory() == null) {
+        setSessionFactory(createSessionFactory());
+      }
+      setupSessionTimeout(getSessionFactory());
+      daemonAcceptor = createAcceptor();
+
+      try {
+        String listenAddress = cfg.getString("sshd", null, "listenAddress");
+        boolean rewrite = !Strings.isNullOrEmpty(listenAddress) && listenAddress.endsWith(":0");
+        daemonAcceptor.bind(listen);
+        if (rewrite) {
+          SocketAddress bound = Iterables.getOnlyElement(daemonAcceptor.getBoundAddresses());
+          cfg.setString("sshd", null, "listenAddress", format((InetSocketAddress) bound));
+        }
+      } catch (IOException e) {
+        throw new IllegalStateException("Cannot bind to " + addressList(), e);
+      }
+
+      logger.atInfo().log("Started Gerrit %s on %s", getVersion(), addressList());
+    }
+  }
+
+  private static String format(InetSocketAddress s) {
+    return String.format("%s:%d", s.getAddress().getHostAddress(), s.getPort());
+  }
+
+  @Override
+  public synchronized void stop() {
+    if (daemonAcceptor != null) {
+      try {
+        daemonAcceptor.close(true).await();
+        shutdownExecutors();
+        logger.atInfo().log("Stopped Gerrit SSHD");
+      } catch (IOException e) {
+        logger.atWarning().withCause(e).log("Exception caught while closing");
+      } finally {
+        daemonAcceptor = null;
+      }
+    }
+  }
+
+  private void shutdownExecutors() {
+    if (executor != null) {
+      executor.shutdownNow();
+    }
+
+    IoServiceFactory serviceFactory = getIoServiceFactory();
+    if (serviceFactory instanceof AbstractIoServiceFactory) {
+      shutdownServiceFactoryExecutor((AbstractIoServiceFactory) serviceFactory);
+    }
+  }
+
+  private void shutdownServiceFactoryExecutor(AbstractIoServiceFactory ioServiceFactory) {
+    ioServiceFactory.close(true);
+    ExecutorService serviceFactoryExecutor = ioServiceFactory.getExecutorService();
+    if (serviceFactoryExecutor != null && serviceFactoryExecutor != executor) {
+      serviceFactoryExecutor.shutdownNow();
+    }
+  }
+
+  @Override
+  protected void checkConfig() {
+    super.checkConfig();
+    if (myHostKeys().isEmpty()) {
+      throw new IllegalStateException("No SSHD host key");
+    }
+  }
+
+  private List<HostKey> computeHostKeys() {
+    if (listen.isEmpty()) {
+      return Collections.emptyList();
+    }
+
+    final List<PublicKey> keys = myHostKeys();
+    final List<HostKey> r = new ArrayList<>();
+    for (PublicKey pub : keys) {
+      final Buffer buf = new ByteArrayBuffer();
+      buf.putRawPublicKey(pub);
+      final byte[] keyBin = buf.getCompactData();
+
+      for (String addr : advertised) {
+        try {
+          r.add(new HostKey(addr, keyBin));
+        } catch (JSchException e) {
+          logger.atWarning().log(
+              "Cannot format SSHD host key [%s]: %s", pub.getAlgorithm(), e.getMessage());
+        }
+      }
+    }
+    return Collections.unmodifiableList(r);
+  }
+
+  private List<PublicKey> myHostKeys() {
+    final KeyPairProvider p = getKeyPairProvider();
+    final List<PublicKey> keys = new ArrayList<>(6);
+    addPublicKey(keys, p, KeyPairProvider.SSH_ED25519);
+    addPublicKey(keys, p, KeyPairProvider.ECDSA_SHA2_NISTP256);
+    addPublicKey(keys, p, KeyPairProvider.ECDSA_SHA2_NISTP384);
+    addPublicKey(keys, p, KeyPairProvider.ECDSA_SHA2_NISTP521);
+    addPublicKey(keys, p, KeyPairProvider.SSH_RSA);
+    addPublicKey(keys, p, KeyPairProvider.SSH_DSS);
+    return keys;
+  }
+
+  private static void addPublicKey(
+      final Collection<PublicKey> out, KeyPairProvider p, String type) {
+    final KeyPair pair = p.loadKey(type);
+    if (pair != null && pair.getPublic() != null) {
+      out.add(pair.getPublic());
+    }
+  }
+
+  private String addressList() {
+    final StringBuilder r = new StringBuilder();
+    for (Iterator<SocketAddress> i = listen.iterator(); i.hasNext(); ) {
+      r.append(SocketUtil.format(i.next(), IANA_SSH_PORT));
+      if (i.hasNext()) {
+        r.append(", ");
+      }
+    }
+    return r.toString();
+  }
+
+  @SuppressWarnings("unchecked")
+  private void initKeyExchanges(Config cfg) {
+    List<NamedFactory<KeyExchange>> a = ServerBuilder.setUpDefaultKeyExchanges(true);
+    setKeyExchangeFactories(
+        filter(cfg, "kex", (NamedFactory<KeyExchange>[]) a.toArray(new NamedFactory<?>[a.size()])));
+  }
+
+  private void initProviderBouncyCastle(Config cfg) {
+    NamedFactory<Random> factory;
+    if (cfg.getBoolean("sshd", null, "testUseInsecureRandom", false)) {
+      factory = new InsecureBouncyCastleRandom.Factory();
+    } else {
+      factory = SecurityUtils.getRandomFactory();
+    }
+    setRandomFactory(new SingletonRandomFactory(factory));
+  }
+
+  private static class InsecureBouncyCastleRandom implements Random {
+    private static class Factory implements NamedFactory<Random> {
+      @Override
+      public String getName() {
+        return "INSECURE_bouncycastle";
+      }
+
+      @Override
+      public Random create() {
+        return new InsecureBouncyCastleRandom();
+      }
+    }
+
+    private final RandomGenerator random;
+
+    private InsecureBouncyCastleRandom() {
+      random = new VMPCRandomGenerator();
+      random.addSeedMaterial(1234);
+    }
+
+    @Override
+    public String getName() {
+      return "InsecureBouncyCastleRandom";
+    }
+
+    @Override
+    public void fill(byte[] bytes, int start, int len) {
+      random.nextBytes(bytes, start, len);
+    }
+
+    @Override
+    public void fill(byte[] bytes) {
+      random.nextBytes(bytes);
+    }
+
+    @Override
+    public int random(int n) {
+      if (n > 0) {
+        if ((n & -n) == n) {
+          return (int) ((n * (long) next(31)) >> 31);
+        }
+        int bits;
+        int val;
+        do {
+          bits = next(31);
+          val = bits % n;
+        } while (bits - val + (n - 1) < 0);
+        return val;
+      }
+      throw new IllegalArgumentException();
+    }
+
+    protected final int next(int numBits) {
+      int bytes = (numBits + 7) / 8;
+      byte[] next = new byte[bytes];
+      int ret = 0;
+      random.nextBytes(next);
+      for (int i = 0; i < bytes; i++) {
+        ret = (next[i] & 0xFF) | (ret << 8);
+      }
+      return ret >>> (bytes * 8 - numBits);
+    }
+  }
+
+  @SuppressWarnings("unchecked")
+  private void initCiphers(Config cfg) {
+    final List<NamedFactory<Cipher>> a = BaseBuilder.setUpDefaultCiphers(true);
+
+    for (Iterator<NamedFactory<Cipher>> i = a.iterator(); i.hasNext(); ) {
+      final NamedFactory<Cipher> f = i.next();
+      try {
+        final Cipher c = f.create();
+        final byte[] key = new byte[c.getBlockSize()];
+        final byte[] iv = new byte[c.getIVSize()];
+        c.init(Cipher.Mode.Encrypt, key, iv);
+      } catch (InvalidKeyException e) {
+        logger.atWarning().log(
+            "Disabling cipher %s: %s; try installing unlimited cryptography extension",
+            f.getName(), e.getMessage());
+        i.remove();
+      } catch (Exception e) {
+        logger.atWarning().log("Disabling cipher %s: %s", f.getName(), e.getMessage());
+        i.remove();
+      }
+    }
+
+    a.add(null);
+    setCipherFactories(
+        filter(cfg, "cipher", (NamedFactory<Cipher>[]) a.toArray(new NamedFactory<?>[a.size()])));
+  }
+
+  @SuppressWarnings("unchecked")
+  private void initMacs(Config cfg) {
+    List<NamedFactory<Mac>> m = BaseBuilder.setUpDefaultMacs(true);
+    setMacFactories(
+        filter(cfg, "mac", (NamedFactory<Mac>[]) m.toArray(new NamedFactory<?>[m.size()])));
+  }
+
+  @SafeVarargs
+  private static <T> List<NamedFactory<T>> filter(
+      final Config cfg, String key, NamedFactory<T>... avail) {
+    final ArrayList<NamedFactory<T>> def = new ArrayList<>();
+    for (NamedFactory<T> n : avail) {
+      if (n == null) {
+        break;
+      }
+      def.add(n);
+    }
+
+    final String[] want = cfg.getStringList("sshd", null, key);
+    if (want == null || want.length == 0) {
+      return def;
+    }
+
+    boolean didClear = false;
+    for (String setting : want) {
+      String name = setting.trim();
+      boolean add = true;
+      if (name.startsWith("-")) {
+        add = false;
+        name = name.substring(1).trim();
+      } else if (name.startsWith("+")) {
+        name = name.substring(1).trim();
+      } else if (!didClear) {
+        didClear = true;
+        def.clear();
+      }
+
+      final NamedFactory<T> n = find(name, avail);
+      if (n == null) {
+        final StringBuilder msg = new StringBuilder();
+        msg.append("sshd.").append(key).append(" = ").append(name).append(" unsupported; only ");
+        for (int i = 0; i < avail.length; i++) {
+          if (avail[i] == null) {
+            continue;
+          }
+          if (i > 0) {
+            msg.append(", ");
+          }
+          msg.append(avail[i].getName());
+        }
+        msg.append(" is supported");
+        logger.atSevere().log(msg.toString());
+      } else if (add) {
+        if (!def.contains(n)) {
+          def.add(n);
+        }
+      } else {
+        def.remove(n);
+      }
+    }
+
+    return def;
+  }
+
+  @SafeVarargs
+  private static <T> NamedFactory<T> find(String name, NamedFactory<T>... avail) {
+    for (NamedFactory<T> n : avail) {
+      if (n != null && name.equals(n.getName())) {
+        return n;
+      }
+    }
+    return null;
+  }
+
+  private void initSignatures() {
+    setSignatureFactories(BaseBuilder.setUpDefaultSignatures(true));
+  }
+
+  private void initCompression(boolean enableCompression) {
+    List<NamedFactory<Compression>> compressionFactories = new ArrayList<>();
+
+    // Always support no compression over SSHD.
+    compressionFactories.add(BuiltinCompressions.none);
+
+    // In the general case, we want to disable transparent compression, since
+    // the majority of our data transfer is highly compressed Git pack files
+    // and we cannot make them any smaller than they already are.
+    //
+    // However, if there are CPU in abundance and the server is reachable through
+    // slow networks, gits with huge amount of refs can benefit from SSH-compression
+    // since git does not compress the ref announcement during the handshake.
+    //
+    // Compression can be especially useful when Gerrit slaves are being used
+    // for the larger clones and fetches and the master server mostly takes small
+    // receive-packs.
+
+    if (enableCompression) {
+      compressionFactories.add(BuiltinCompressions.zlib);
+    }
+
+    setCompressionFactories(compressionFactories);
+  }
+
+  private void initChannels() {
+    setChannelFactories(ServerBuilder.DEFAULT_CHANNEL_FACTORIES);
+  }
+
+  private void initSubsystems() {
+    setSubsystemFactories(Collections.<NamedFactory<Command>>emptyList());
+  }
+
+  private void initUserAuth(
+      final PublickeyAuthenticator pubkey,
+      final GSSAuthenticator kerberosAuthenticator,
+      String kerberosKeytab,
+      String kerberosPrincipal) {
+    List<NamedFactory<UserAuth>> authFactories = new ArrayList<>();
+    if (kerberosKeytab != null) {
+      authFactories.add(UserAuthGSSFactory.INSTANCE);
+      logger.atInfo().log("Enabling kerberos with keytab %s", kerberosKeytab);
+      if (!new File(kerberosKeytab).canRead()) {
+        logger.atSevere().log(
+            "Keytab %s does not exist or is not readable; further errors are possible",
+            kerberosKeytab);
+      }
+      kerberosAuthenticator.setKeytabFile(kerberosKeytab);
+      if (kerberosPrincipal == null) {
+        try {
+          kerberosPrincipal = "host/" + InetAddress.getLocalHost().getCanonicalHostName();
+        } catch (UnknownHostException e) {
+          kerberosPrincipal = "host/localhost";
+        }
+      }
+      logger.atInfo().log("Using kerberos principal %s", kerberosPrincipal);
+      if (!kerberosPrincipal.startsWith("host/")) {
+        logger.atWarning().log(
+            "Host principal does not start with host/ "
+                + "which most SSH clients will supply automatically");
+      }
+      kerberosAuthenticator.setServicePrincipalName(kerberosPrincipal);
+      setGSSAuthenticator(kerberosAuthenticator);
+    }
+    authFactories.add(UserAuthPublicKeyFactory.INSTANCE);
+    setUserAuthFactories(authFactories);
+    setPublickeyAuthenticator(pubkey);
+  }
+
+  private void initForwarding() {
+    setForwardingFilter(
+        new ForwardingFilter() {
+          @Override
+          public boolean canForwardAgent(Session session, String requestType) {
+            return false;
+          }
+
+          @Override
+          public boolean canForwardX11(Session session, String requestType) {
+            return false;
+          }
+
+          @Override
+          public boolean canListen(SshdSocketAddress address, Session session) {
+            return false;
+          }
+
+          @Override
+          public boolean canConnect(Type type, SshdSocketAddress address, Session session) {
+            return false;
+          }
+        });
+    setForwarderFactory(new DefaultForwarderFactory());
+  }
+
+  private void initFileSystemFactory() {
+    setFileSystemFactory(
+        new FileSystemFactory() {
+          @Override
+          public FileSystem createFileSystem(Session session) throws IOException {
+            return new FileSystem() {
+              @Override
+              public void close() throws IOException {}
+
+              @Override
+              public Iterable<FileStore> getFileStores() {
+                return null;
+              }
+
+              @Override
+              public Path getPath(String arg0, String... arg1) {
+                return null;
+              }
+
+              @Override
+              public PathMatcher getPathMatcher(String arg0) {
+                return null;
+              }
+
+              @Override
+              public Iterable<Path> getRootDirectories() {
+                return null;
+              }
+
+              @Override
+              public String getSeparator() {
+                return null;
+              }
+
+              @Override
+              public UserPrincipalLookupService getUserPrincipalLookupService() {
+                return null;
+              }
+
+              @Override
+              public boolean isOpen() {
+                return false;
+              }
+
+              @Override
+              public boolean isReadOnly() {
+                return false;
+              }
+
+              @Override
+              public WatchService newWatchService() throws IOException {
+                return null;
+              }
+
+              @Override
+              public FileSystemProvider provider() {
+                return null;
+              }
+
+              @Override
+              public Set<String> supportedFileAttributeViews() {
+                return null;
+              }
+            };
+          }
+        });
+  }
+}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshHostKeyModule.java b/java/com/google/gerrit/sshd/SshHostKeyModule.java
similarity index 100%
rename from gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshHostKeyModule.java
rename to java/com/google/gerrit/sshd/SshHostKeyModule.java
diff --git a/java/com/google/gerrit/sshd/SshKeyCacheEntry.java b/java/com/google/gerrit/sshd/SshKeyCacheEntry.java
new file mode 100644
index 0000000..8e962e3
--- /dev/null
+++ b/java/com/google/gerrit/sshd/SshKeyCacheEntry.java
@@ -0,0 +1,36 @@
+// Copyright (C) 2009 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.google.gerrit.sshd;
+
+import com.google.gerrit.reviewdb.client.Account;
+import java.security.PublicKey;
+
+class SshKeyCacheEntry {
+  private final Account.Id accountId;
+  private final PublicKey publicKey;
+
+  SshKeyCacheEntry(Account.Id accountId, PublicKey publicKey) {
+    this.accountId = accountId;
+    this.publicKey = publicKey;
+  }
+
+  Account.Id getAccount() {
+    return accountId;
+  }
+
+  boolean match(PublicKey inkey) {
+    return publicKey.equals(inkey);
+  }
+}
diff --git a/java/com/google/gerrit/sshd/SshKeyCacheImpl.java b/java/com/google/gerrit/sshd/SshKeyCacheImpl.java
new file mode 100644
index 0000000..fb0b8f6
--- /dev/null
+++ b/java/com/google/gerrit/sshd/SshKeyCacheImpl.java
@@ -0,0 +1,153 @@
+// Copyright (C) 2009 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.google.gerrit.sshd;
+
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_USERNAME;
+
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.server.account.AccountSshKey;
+import com.google.gerrit.server.account.VersionedAuthorizedKeys;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.account.externalids.ExternalIds;
+import com.google.gerrit.server.cache.CacheModule;
+import com.google.gerrit.server.logging.TraceContext;
+import com.google.gerrit.server.logging.TraceContext.TraceTimer;
+import com.google.gerrit.server.ssh.SshKeyCache;
+import com.google.gerrit.server.ssh.SshKeyCreator;
+import com.google.inject.Inject;
+import com.google.inject.Module;
+import com.google.inject.Singleton;
+import com.google.inject.TypeLiteral;
+import com.google.inject.name.Named;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+/** Provides the {@link SshKeyCacheEntry}. */
+@Singleton
+public class SshKeyCacheImpl implements SshKeyCache {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final String CACHE_NAME = "sshkeys";
+
+  static final Iterable<SshKeyCacheEntry> NO_SUCH_USER = none();
+  static final Iterable<SshKeyCacheEntry> NO_KEYS = none();
+
+  public static Module module() {
+    return new CacheModule() {
+      @Override
+      protected void configure() {
+        cache(CACHE_NAME, String.class, new TypeLiteral<Iterable<SshKeyCacheEntry>>() {})
+            .loader(Loader.class);
+        bind(SshKeyCacheImpl.class);
+        bind(SshKeyCache.class).to(SshKeyCacheImpl.class);
+        bind(SshKeyCreator.class).to(SshKeyCreatorImpl.class);
+      }
+    };
+  }
+
+  private static Iterable<SshKeyCacheEntry> none() {
+    return Collections.unmodifiableCollection(Arrays.asList(new SshKeyCacheEntry[0]));
+  }
+
+  private final LoadingCache<String, Iterable<SshKeyCacheEntry>> cache;
+
+  @Inject
+  SshKeyCacheImpl(@Named(CACHE_NAME) LoadingCache<String, Iterable<SshKeyCacheEntry>> cache) {
+    this.cache = cache;
+  }
+
+  Iterable<SshKeyCacheEntry> get(String username) {
+    try {
+      return cache.get(username);
+    } catch (ExecutionException e) {
+      logger.atWarning().withCause(e).log("Cannot load SSH keys for %s", username);
+      return Collections.emptyList();
+    }
+  }
+
+  @Override
+  public void evict(String username) {
+    if (username != null) {
+      logger.atFine().log("Evict SSH key for username %s", username);
+      cache.invalidate(username);
+    }
+  }
+
+  static class Loader extends CacheLoader<String, Iterable<SshKeyCacheEntry>> {
+    private final ExternalIds externalIds;
+    private final VersionedAuthorizedKeys.Accessor authorizedKeys;
+
+    @Inject
+    Loader(ExternalIds externalIds, VersionedAuthorizedKeys.Accessor authorizedKeys) {
+      this.externalIds = externalIds;
+      this.authorizedKeys = authorizedKeys;
+    }
+
+    @Override
+    public Iterable<SshKeyCacheEntry> load(String username) throws Exception {
+      try (TraceTimer timer =
+          TraceContext.newTimer("Loading SSH keys for account with username %s", username)) {
+        Optional<ExternalId> user =
+            externalIds.get(ExternalId.Key.create(SCHEME_USERNAME, username));
+        if (!user.isPresent()) {
+          return NO_SUCH_USER;
+        }
+
+        List<SshKeyCacheEntry> kl = new ArrayList<>(4);
+        for (AccountSshKey k : authorizedKeys.getKeys(user.get().accountId())) {
+          if (k.valid()) {
+            add(kl, k);
+          }
+        }
+
+        if (kl.isEmpty()) {
+          return NO_KEYS;
+        }
+        return Collections.unmodifiableList(kl);
+      }
+    }
+
+    private void add(List<SshKeyCacheEntry> kl, AccountSshKey k) {
+      try {
+        kl.add(new SshKeyCacheEntry(k.accountId(), SshUtil.parse(k)));
+      } catch (OutOfMemoryError e) {
+        // This is the only case where we assume the problem has nothing
+        // to do with the key object, and instead we must abort this load.
+        //
+        throw e;
+      } catch (Throwable e) {
+        markInvalid(k);
+      }
+    }
+
+    private void markInvalid(AccountSshKey k) {
+      try {
+        logger.atInfo().log("Flagging SSH key %d of account %s invalid", k.seq(), k.accountId());
+        authorizedKeys.markKeyInvalid(k.accountId(), k.seq());
+      } catch (IOException | ConfigInvalidException e) {
+        logger.atSevere().withCause(e).log(
+            "Failed to mark SSH key %d of account %s invalid", k.seq(), k.accountId());
+      }
+    }
+  }
+}
diff --git a/java/com/google/gerrit/sshd/SshKeyCreatorImpl.java b/java/com/google/gerrit/sshd/SshKeyCreatorImpl.java
new file mode 100644
index 0000000..d89f9e0
--- /dev/null
+++ b/java/com/google/gerrit/sshd/SshKeyCreatorImpl.java
@@ -0,0 +1,44 @@
+// 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.
+
+package com.google.gerrit.sshd;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.errors.InvalidSshKeyException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.account.AccountSshKey;
+import com.google.gerrit.server.ssh.SshKeyCreator;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.spec.InvalidKeySpecException;
+
+public class SshKeyCreatorImpl implements SshKeyCreator {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  @Override
+  public AccountSshKey create(Account.Id accountId, int seq, String encoded)
+      throws InvalidSshKeyException {
+    try {
+      AccountSshKey key = AccountSshKey.create(accountId, seq, SshUtil.toOpenSshPublicKey(encoded));
+      SshUtil.parse(key);
+      return key;
+    } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
+      throw new InvalidSshKeyException();
+
+    } catch (NoSuchProviderException e) {
+      logger.atSevere().withCause(e).log("Cannot parse SSH key");
+      throw new InvalidSshKeyException();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/sshd/SshLog.java b/java/com/google/gerrit/sshd/SshLog.java
new file mode 100644
index 0000000..5fb75c8
--- /dev/null
+++ b/java/com/google/gerrit/sshd/SshLog.java
@@ -0,0 +1,340 @@
+// Copyright (C) 2009 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.google.gerrit.sshd;
+
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Multimap;
+import com.google.common.collect.MultimapBuilder;
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.PeerDaemonUser;
+import com.google.gerrit.server.audit.SshAuditEvent;
+import com.google.gerrit.server.config.ConfigKey;
+import com.google.gerrit.server.config.ConfigUpdatedEvent;
+import com.google.gerrit.server.config.ConfigUpdatedEvent.ConfigUpdateEntry;
+import com.google.gerrit.server.config.ConfigUpdatedEvent.UpdateResult;
+import com.google.gerrit.server.config.GerritConfigListener;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.group.GroupAuditService;
+import com.google.gerrit.server.ioutil.HexFormat;
+import com.google.gerrit.server.util.SystemLog;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.sshd.SshScope.Context;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import org.apache.log4j.AsyncAppender;
+import org.apache.log4j.Level;
+import org.apache.log4j.Logger;
+import org.apache.log4j.spi.LoggingEvent;
+import org.eclipse.jgit.lib.Config;
+
+@Singleton
+class SshLog implements LifecycleListener, GerritConfigListener {
+  private static final Logger log = Logger.getLogger(SshLog.class);
+  private static final String LOG_NAME = "sshd_log";
+  private static final String P_SESSION = "session";
+  private static final String P_USER_NAME = "userName";
+  private static final String P_ACCOUNT_ID = "accountId";
+  private static final String P_WAIT = "queueWaitTime";
+  private static final String P_EXEC = "executionTime";
+  private static final String P_STATUS = "status";
+  private static final String P_AGENT = "agent";
+
+  private final Provider<SshSession> session;
+  private final Provider<Context> context;
+  private volatile AsyncAppender async;
+  private final GroupAuditService auditService;
+  private final SystemLog systemLog;
+
+  private final Object lock = new Object();
+
+  @Inject
+  SshLog(
+      final Provider<SshSession> session,
+      final Provider<Context> context,
+      SystemLog systemLog,
+      @GerritServerConfig Config config,
+      GroupAuditService auditService) {
+    this.session = session;
+    this.context = context;
+    this.auditService = auditService;
+    this.systemLog = systemLog;
+
+    if (config.getBoolean("sshd", "requestLog", true)) {
+      enableLogging();
+    }
+  }
+
+  /** @return true if a change in state has occurred */
+  public boolean enableLogging() {
+    synchronized (lock) {
+      if (async == null) {
+        async = systemLog.createAsyncAppender(LOG_NAME, new SshLogLayout());
+        return true;
+      }
+      return false;
+    }
+  }
+
+  /** @return true if a change in state has occurred */
+  public boolean disableLogging() {
+    synchronized (lock) {
+      if (async != null) {
+        async.close();
+        async = null;
+        return true;
+      }
+      return false;
+    }
+  }
+
+  @Override
+  public void start() {}
+
+  @Override
+  public void stop() {
+    disableLogging();
+  }
+
+  void onLogin() {
+    LoggingEvent entry = log("LOGIN FROM " + session.get().getRemoteAddressAsString());
+    if (async != null) {
+      async.append(entry);
+    }
+    audit(context.get(), "0", "LOGIN");
+  }
+
+  void onAuthFail(SshSession sd) {
+    final LoggingEvent event =
+        new LoggingEvent( //
+            Logger.class.getName(), // fqnOfCategoryClass
+            log, // logger
+            TimeUtil.nowMs(), // when
+            Level.INFO, // level
+            "AUTH FAILURE FROM " + sd.getRemoteAddressAsString(), // message text
+            "SSHD", // thread name
+            null, // exception information
+            null, // current NDC string
+            null, // caller location
+            null // MDC properties
+            );
+
+    event.setProperty(P_SESSION, id(sd.getSessionId()));
+    event.setProperty(P_USER_NAME, sd.getUsername());
+
+    final String error = sd.getAuthenticationError();
+    if (error != null) {
+      event.setProperty(P_STATUS, error);
+    }
+    if (async != null) {
+      async.append(event);
+    }
+    audit(null, "FAIL", "AUTH");
+  }
+
+  void onExecute(DispatchCommand dcmd, int exitValue, SshSession sshSession) {
+    final Context ctx = context.get();
+    ctx.finished = TimeUtil.nowMs();
+
+    String cmd = extractWhat(dcmd);
+
+    final LoggingEvent event = log(cmd);
+    event.setProperty(P_WAIT, (ctx.started - ctx.created) + "ms");
+    event.setProperty(P_EXEC, (ctx.finished - ctx.started) + "ms");
+
+    final String status;
+    switch (exitValue) {
+      case BaseCommand.STATUS_CANCEL:
+        status = "killed";
+        break;
+
+      case BaseCommand.STATUS_NOT_FOUND:
+        status = "not-found";
+        break;
+
+      case BaseCommand.STATUS_NOT_ADMIN:
+        status = "not-admin";
+        break;
+
+      default:
+        status = String.valueOf(exitValue);
+        break;
+    }
+    event.setProperty(P_STATUS, status);
+    String peerAgent = sshSession.getPeerAgent();
+    if (peerAgent != null) {
+      event.setProperty(P_AGENT, peerAgent);
+    }
+
+    if (async != null) {
+      async.append(event);
+    }
+    audit(context.get(), status, dcmd);
+  }
+
+  private ListMultimap<String, ?> extractParameters(DispatchCommand dcmd) {
+    if (dcmd == null) {
+      return MultimapBuilder.hashKeys(0).arrayListValues(0).build();
+    }
+    String[] cmdArgs = dcmd.getArguments();
+    String paramName = null;
+    int argPos = 0;
+    ListMultimap<String, String> parms = MultimapBuilder.hashKeys().arrayListValues().build();
+    for (int i = 2; i < cmdArgs.length; i++) {
+      String arg = cmdArgs[i];
+      // -- stop parameters parsing
+      if (arg.equals("--")) {
+        for (i++; i < cmdArgs.length; i++) {
+          parms.put("$" + argPos++, cmdArgs[i]);
+        }
+        break;
+      }
+      // --param=value
+      int eqPos = arg.indexOf('=');
+      if (arg.startsWith("--") && eqPos > 0) {
+        parms.put(arg.substring(0, eqPos), arg.substring(eqPos + 1));
+        continue;
+      }
+      // -p value or --param value
+      if (arg.startsWith("-")) {
+        if (paramName != null) {
+          parms.put(paramName, null);
+        }
+        paramName = arg;
+        continue;
+      }
+      // value
+      if (paramName == null) {
+        parms.put("$" + argPos++, arg);
+      } else {
+        parms.put(paramName, arg);
+        paramName = null;
+      }
+    }
+    if (paramName != null) {
+      parms.put(paramName, null);
+    }
+    return parms;
+  }
+
+  void onLogout() {
+    LoggingEvent entry = log("LOGOUT");
+    if (async != null) {
+      async.append(entry);
+    }
+    audit(context.get(), "0", "LOGOUT");
+  }
+
+  private LoggingEvent log(String msg) {
+    final SshSession sd = session.get();
+    final CurrentUser user = sd.getUser();
+
+    final LoggingEvent event =
+        new LoggingEvent( //
+            Logger.class.getName(), // fqnOfCategoryClass
+            log, // logger
+            TimeUtil.nowMs(), // when
+            Level.INFO, // level
+            msg, // message text
+            "SSHD", // thread name
+            null, // exception information
+            null, // current NDC string
+            null, // caller location
+            null // MDC properties
+            );
+
+    event.setProperty(P_SESSION, id(sd.getSessionId()));
+
+    String userName = "-";
+    String accountId = "-";
+
+    if (user != null && user.isIdentifiedUser()) {
+      IdentifiedUser u = user.asIdentifiedUser();
+      userName = u.getUserName().orElse(null);
+      accountId = "a/" + u.getAccountId().toString();
+
+    } else if (user instanceof PeerDaemonUser) {
+      userName = PeerDaemonUser.USER_NAME;
+    }
+
+    event.setProperty(P_USER_NAME, userName);
+    event.setProperty(P_ACCOUNT_ID, accountId);
+
+    return event;
+  }
+
+  private static String id(int id) {
+    return HexFormat.fromInt(id);
+  }
+
+  void audit(Context ctx, Object result, String cmd) {
+    audit(ctx, result, cmd, null);
+  }
+
+  void audit(Context ctx, Object result, DispatchCommand cmd) {
+    audit(ctx, result, extractWhat(cmd), extractParameters(cmd));
+  }
+
+  private void audit(Context ctx, Object result, String cmd, ListMultimap<String, ?> params) {
+    String sessionId;
+    CurrentUser currentUser;
+    long created;
+    if (ctx == null) {
+      sessionId = null;
+      currentUser = null;
+      created = TimeUtil.nowMs();
+    } else {
+      SshSession session = ctx.getSession();
+      sessionId = HexFormat.fromInt(session.getSessionId());
+      currentUser = session.getUser();
+      created = ctx.created;
+    }
+    auditService.dispatch(new SshAuditEvent(sessionId, currentUser, cmd, created, params, result));
+  }
+
+  private String extractWhat(DispatchCommand dcmd) {
+    if (dcmd == null) {
+      return "Command was already destroyed";
+    }
+    StringBuilder commandName = new StringBuilder(dcmd.getCommandName());
+    String[] args = dcmd.getArguments();
+    for (int i = 1; i < args.length; i++) {
+      commandName.append(".").append(args[i]);
+    }
+    return commandName.toString();
+  }
+
+  @Override
+  public Multimap<UpdateResult, ConfigUpdateEntry> configUpdated(ConfigUpdatedEvent event) {
+    ConfigKey sshdRequestLog = ConfigKey.create("sshd", "requestLog");
+    if (!event.isValueUpdated(sshdRequestLog)) {
+      return ConfigUpdatedEvent.NO_UPDATES;
+    }
+    boolean stateUpdated;
+    try {
+      boolean enabled = event.getNewConfig().getBoolean("sshd", "requestLog", true);
+      if (enabled) {
+        stateUpdated = enableLogging();
+      } else {
+        stateUpdated = disableLogging();
+      }
+      return stateUpdated ? event.accept(sshdRequestLog) : ConfigUpdatedEvent.NO_UPDATES;
+    } catch (IllegalArgumentException iae) {
+      return event.reject(sshdRequestLog);
+    }
+  }
+}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshLogLayout.java b/java/com/google/gerrit/sshd/SshLogLayout.java
similarity index 100%
rename from gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshLogLayout.java
rename to java/com/google/gerrit/sshd/SshLogLayout.java
diff --git a/java/com/google/gerrit/sshd/SshModule.java b/java/com/google/gerrit/sshd/SshModule.java
new file mode 100644
index 0000000..acdc958
--- /dev/null
+++ b/java/com/google/gerrit/sshd/SshModule.java
@@ -0,0 +1,145 @@
+// Copyright (C) 2009 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.google.gerrit.sshd;
+
+import static com.google.gerrit.extensions.registration.PrivateInternals_DynamicTypes.registerInParentInjectors;
+import static com.google.inject.Scopes.SINGLETON;
+
+import com.google.common.base.CharMatcher;
+import com.google.common.base.Splitter;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.lifecycle.LifecycleModule;
+import com.google.gerrit.server.DynamicOptions;
+import com.google.gerrit.server.PeerDaemonUser;
+import com.google.gerrit.server.RemotePeer;
+import com.google.gerrit.server.config.GerritConfigListener;
+import com.google.gerrit.server.config.GerritRequestModule;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.git.QueueProvider;
+import com.google.gerrit.server.git.receive.AsyncReceiveCommits;
+import com.google.gerrit.server.plugins.ModuleGenerator;
+import com.google.gerrit.server.plugins.ReloadPluginListener;
+import com.google.gerrit.server.plugins.StartPluginListener;
+import com.google.gerrit.server.ssh.SshInfo;
+import com.google.gerrit.server.util.RequestScopePropagator;
+import com.google.gerrit.sshd.commands.QueryShell;
+import com.google.inject.Inject;
+import com.google.inject.internal.UniqueAnnotations;
+import com.google.inject.servlet.RequestScoped;
+import java.net.SocketAddress;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import org.apache.sshd.server.auth.gss.GSSAuthenticator;
+import org.apache.sshd.server.auth.pubkey.PublickeyAuthenticator;
+import org.apache.sshd.server.command.CommandFactory;
+import org.eclipse.jgit.lib.Config;
+
+/** Configures standard dependencies for {@link SshDaemon}. */
+public class SshModule extends LifecycleModule {
+  private final Map<String, String> aliases;
+
+  @Inject
+  SshModule(@GerritServerConfig Config cfg) {
+    aliases = new HashMap<>();
+    for (String name : cfg.getNames("ssh-alias", true)) {
+      aliases.put(name, cfg.getString("ssh-alias", null, name));
+    }
+  }
+
+  @Override
+  protected void configure() {
+    bindScope(RequestScoped.class, SshScope.REQUEST);
+    bind(RequestScopePropagator.class).to(SshScope.Propagator.class);
+    bind(SshScope.class).in(SINGLETON);
+
+    configureRequestScope();
+    install(new AsyncReceiveCommits.Module());
+    configureAliases();
+
+    bind(SshLog.class);
+    DynamicSet.bind(binder(), GerritConfigListener.class).to(SshLog.class);
+
+    bind(SshInfo.class).to(SshDaemon.class).in(SINGLETON);
+    factory(DispatchCommand.Factory.class);
+    factory(QueryShell.Factory.class);
+    factory(PeerDaemonUser.Factory.class);
+
+    bind(DispatchCommandProvider.class)
+        .annotatedWith(Commands.CMD_ROOT)
+        .toInstance(new DispatchCommandProvider(Commands.CMD_ROOT));
+    bind(CommandFactoryProvider.class);
+    bind(CommandFactory.class).toProvider(CommandFactoryProvider.class);
+    bind(ScheduledThreadPoolExecutor.class)
+        .annotatedWith(StreamCommandExecutor.class)
+        .toProvider(StreamCommandExecutorProvider.class)
+        .in(SINGLETON);
+    bind(QueueProvider.class).to(CommandExecutorQueueProvider.class);
+
+    bind(GSSAuthenticator.class).to(GerritGSSAuthenticator.class);
+    bind(PublickeyAuthenticator.class).to(CachingPublicKeyAuthenticator.class);
+
+    bind(ModuleGenerator.class).to(SshAutoRegisterModuleGenerator.class);
+    bind(SshPluginStarterCallback.class);
+    bind(StartPluginListener.class)
+        .annotatedWith(UniqueAnnotations.create())
+        .to(SshPluginStarterCallback.class);
+
+    bind(ReloadPluginListener.class)
+        .annotatedWith(UniqueAnnotations.create())
+        .to(SshPluginStarterCallback.class);
+
+    DynamicMap.mapOf(binder(), DynamicOptions.DynamicBean.class);
+    DynamicItem.itemOf(binder(), SshCreateCommandInterceptor.class);
+
+    listener().toInstance(registerInParentInjectors());
+    listener().to(SshLog.class);
+    listener().to(SshDaemon.class);
+    listener().to(CommandFactoryProvider.class);
+  }
+
+  private void configureAliases() {
+    CommandName gerrit = Commands.named("gerrit");
+    for (Map.Entry<String, String> e : aliases.entrySet()) {
+      String name = e.getKey();
+      List<String> dest = Splitter.on(CharMatcher.whitespace()).splitToList(e.getValue());
+      CommandName cmd = Commands.named(dest.get(0));
+      for (int i = 1; i < dest.size(); i++) {
+        cmd = Commands.named(cmd, dest.get(i));
+      }
+      bind(Commands.key(gerrit, name)).toProvider(new AliasCommandProvider(cmd));
+    }
+  }
+
+  private void configureRequestScope() {
+    bind(SshScope.Context.class).toProvider(SshScope.ContextProvider.class);
+
+    bind(SshSession.class).toProvider(SshScope.SshSessionProvider.class).in(SshScope.REQUEST);
+    bind(SocketAddress.class)
+        .annotatedWith(RemotePeer.class)
+        .toProvider(SshRemotePeerProvider.class)
+        .in(SshScope.REQUEST);
+
+    bind(ScheduledThreadPoolExecutor.class)
+        .annotatedWith(CommandExecutor.class)
+        .toProvider(CommandExecutorProvider.class)
+        .in(SshScope.REQUEST);
+
+    install(new GerritRequestModule());
+  }
+}
diff --git a/java/com/google/gerrit/sshd/SshPluginStarterCallback.java b/java/com/google/gerrit/sshd/SshPluginStarterCallback.java
new file mode 100644
index 0000000..6e8590c
--- /dev/null
+++ b/java/com/google/gerrit/sshd/SshPluginStarterCallback.java
@@ -0,0 +1,79 @@
+// Copyright (C) 2012 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.google.gerrit.sshd;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.server.DynamicOptions;
+import com.google.gerrit.server.plugins.Plugin;
+import com.google.gerrit.server.plugins.ReloadPluginListener;
+import com.google.gerrit.server.plugins.StartPluginListener;
+import com.google.inject.Inject;
+import com.google.inject.Key;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import org.apache.sshd.server.command.Command;
+
+@Singleton
+class SshPluginStarterCallback implements StartPluginListener, ReloadPluginListener {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final DispatchCommandProvider root;
+  private final DynamicMap<DynamicOptions.DynamicBean> dynamicBeans;
+
+  @Inject
+  SshPluginStarterCallback(
+      @CommandName(Commands.ROOT) DispatchCommandProvider root,
+      DynamicMap<DynamicOptions.DynamicBean> dynamicBeans) {
+    this.root = root;
+    this.dynamicBeans = dynamicBeans;
+  }
+
+  @Override
+  public void onStartPlugin(Plugin plugin) {
+    Provider<Command> cmd = load(plugin);
+    if (cmd != null) {
+      plugin.add(root.register(Commands.named(plugin.getName()), cmd));
+    }
+  }
+
+  @Override
+  public void onReloadPlugin(Plugin oldPlugin, Plugin newPlugin) {
+    Provider<Command> cmd = load(newPlugin);
+    if (cmd != null) {
+      newPlugin.add(root.replace(Commands.named(newPlugin.getName()), cmd));
+    }
+  }
+
+  private Provider<Command> load(Plugin plugin) {
+    if (plugin.getSshInjector() != null) {
+      Key<Command> key = Commands.key(plugin.getName());
+      try {
+        return plugin.getSshInjector().getProvider(key);
+      } catch (RuntimeException err) {
+        if (!providesDynamicOptions(plugin)) {
+          logger.atWarning().withCause(err).log(
+              "Plugin %s did not define its top-level command nor any DynamicOptions",
+              plugin.getName());
+        }
+      }
+    }
+    return null;
+  }
+
+  private boolean providesDynamicOptions(Plugin plugin) {
+    return dynamicBeans.plugins().contains(plugin.getName());
+  }
+}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshRemotePeerProvider.java b/java/com/google/gerrit/sshd/SshRemotePeerProvider.java
similarity index 100%
rename from gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshRemotePeerProvider.java
rename to java/com/google/gerrit/sshd/SshRemotePeerProvider.java
diff --git a/java/com/google/gerrit/sshd/SshScope.java b/java/com/google/gerrit/sshd/SshScope.java
new file mode 100644
index 0000000..99787d8
--- /dev/null
+++ b/java/com/google/gerrit/sshd/SshScope.java
@@ -0,0 +1,201 @@
+// Copyright (C) 2009 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.google.gerrit.sshd;
+
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.RequestCleanup;
+import com.google.gerrit.server.config.RequestScopedReviewDbProvider;
+import com.google.gerrit.server.util.RequestContext;
+import com.google.gerrit.server.util.ThreadLocalRequestContext;
+import com.google.gerrit.server.util.ThreadLocalRequestScopePropagator;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.Inject;
+import com.google.inject.Key;
+import com.google.inject.OutOfScopeException;
+import com.google.inject.Provider;
+import com.google.inject.Scope;
+import com.google.inject.util.Providers;
+import java.util.HashMap;
+import java.util.Map;
+
+/** Guice scopes for state during an SSH connection. */
+public class SshScope {
+  private static final Key<RequestCleanup> RC_KEY = Key.get(RequestCleanup.class);
+
+  private static final Key<RequestScopedReviewDbProvider> DB_KEY =
+      Key.get(RequestScopedReviewDbProvider.class);
+
+  class Context implements RequestContext {
+    private final RequestCleanup cleanup = new RequestCleanup();
+    private final Map<Key<?>, Object> map = new HashMap<>();
+    private final SchemaFactory<ReviewDb> schemaFactory;
+    private final SshSession session;
+    private final String commandLine;
+
+    final long created;
+    volatile long started;
+    volatile long finished;
+
+    private Context(SchemaFactory<ReviewDb> sf, SshSession s, String c, long at) {
+      schemaFactory = sf;
+      session = s;
+      commandLine = c;
+      created = started = finished = at;
+      map.put(RC_KEY, cleanup);
+      map.put(DB_KEY, new RequestScopedReviewDbProvider(schemaFactory, Providers.of(cleanup)));
+    }
+
+    private Context(Context p, SshSession s, String c) {
+      this(p.schemaFactory, s, c, p.created);
+      started = p.started;
+      finished = p.finished;
+    }
+
+    String getCommandLine() {
+      return commandLine;
+    }
+
+    SshSession getSession() {
+      return session;
+    }
+
+    @Override
+    public CurrentUser getUser() {
+      CurrentUser user = session.getUser();
+      if (user != null && user.isIdentifiedUser()) {
+        IdentifiedUser identifiedUser = userFactory.create(user.getAccountId());
+        identifiedUser.setAccessPath(user.getAccessPath());
+        return identifiedUser;
+      }
+      return user;
+    }
+
+    @Override
+    public Provider<ReviewDb> getReviewDbProvider() {
+      return (RequestScopedReviewDbProvider) map.get(DB_KEY);
+    }
+
+    synchronized <T> T get(Key<T> key, Provider<T> creator) {
+      @SuppressWarnings("unchecked")
+      T t = (T) map.get(key);
+      if (t == null) {
+        t = creator.get();
+        map.put(key, t);
+      }
+      return t;
+    }
+
+    synchronized Context subContext(SshSession newSession, String newCommandLine) {
+      Context ctx = new Context(this, newSession, newCommandLine);
+      ctx.cleanup.add(cleanup);
+      return ctx;
+    }
+  }
+
+  static class ContextProvider implements Provider<Context> {
+    @Override
+    public Context get() {
+      return requireContext();
+    }
+  }
+
+  public static class SshSessionProvider implements Provider<SshSession> {
+    @Override
+    public SshSession get() {
+      return requireContext().getSession();
+    }
+  }
+
+  static class Propagator extends ThreadLocalRequestScopePropagator<Context> {
+    private final SshScope sshScope;
+
+    @Inject
+    Propagator(
+        SshScope sshScope,
+        ThreadLocalRequestContext local,
+        Provider<RequestScopedReviewDbProvider> dbProviderProvider) {
+      super(REQUEST, current, local, dbProviderProvider);
+      this.sshScope = sshScope;
+    }
+
+    @Override
+    protected Context continuingContext(Context ctx) {
+      // The cleanup is not chained, since the RequestScopePropagator executors
+      // the Context's cleanup when finished executing.
+      return sshScope.newContinuingContext(ctx);
+    }
+  }
+
+  private static final ThreadLocal<Context> current = new ThreadLocal<>();
+
+  private static Context requireContext() {
+    final Context ctx = current.get();
+    if (ctx == null) {
+      throw new OutOfScopeException("Not in command/request");
+    }
+    return ctx;
+  }
+
+  private final ThreadLocalRequestContext local;
+  private final IdentifiedUser.RequestFactory userFactory;
+
+  @Inject
+  SshScope(ThreadLocalRequestContext local, IdentifiedUser.RequestFactory userFactory) {
+    this.local = local;
+    this.userFactory = userFactory;
+  }
+
+  Context newContext(SchemaFactory<ReviewDb> sf, SshSession s, String cmd) {
+    return new Context(sf, s, cmd, TimeUtil.nowMs());
+  }
+
+  private Context newContinuingContext(Context ctx) {
+    return new Context(ctx, ctx.getSession(), ctx.getCommandLine());
+  }
+
+  Context set(Context ctx) {
+    Context old = current.get();
+    current.set(ctx);
+    local.setContext(ctx);
+    return old;
+  }
+
+  /** Returns exactly one instance per command executed. */
+  public static final Scope REQUEST =
+      new Scope() {
+        @Override
+        public <T> Provider<T> scope(Key<T> key, Provider<T> creator) {
+          return new Provider<T>() {
+            @Override
+            public T get() {
+              return requireContext().get(key, creator);
+            }
+
+            @Override
+            public String toString() {
+              return String.format("%s[%s]", creator, REQUEST);
+            }
+          };
+        }
+
+        @Override
+        public String toString() {
+          return "SshScopes.REQUEST";
+        }
+      };
+}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshSession.java b/java/com/google/gerrit/sshd/SshSession.java
similarity index 100%
rename from gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshSession.java
rename to java/com/google/gerrit/sshd/SshSession.java
diff --git a/java/com/google/gerrit/sshd/SshUtil.java b/java/com/google/gerrit/sshd/SshUtil.java
new file mode 100644
index 0000000..ce35422
--- /dev/null
+++ b/java/com/google/gerrit/sshd/SshUtil.java
@@ -0,0 +1,162 @@
+// Copyright (C) 2008 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.google.gerrit.sshd;
+
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountSshKey;
+import com.google.gerrit.sshd.SshScope.Context;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.StringReader;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.PublicKey;
+import java.security.interfaces.DSAPublicKey;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.InvalidKeySpecException;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.sshd.common.SshException;
+import org.apache.sshd.common.future.CloseFuture;
+import org.apache.sshd.common.future.SshFutureListener;
+import org.apache.sshd.common.keyprovider.KeyPairProvider;
+import org.apache.sshd.common.util.buffer.ByteArrayBuffer;
+import org.apache.sshd.server.session.ServerSession;
+import org.eclipse.jgit.lib.Constants;
+
+/** Utilities to support SSH operations. */
+public class SshUtil {
+  /**
+   * Parse a public key into its Java type.
+   *
+   * @param key the account key to parse.
+   * @return the valid public key object.
+   * @throws InvalidKeySpecException the key supplied is not a valid SSH key.
+   * @throws NoSuchAlgorithmException the JVM is missing the key algorithm.
+   * @throws NoSuchProviderException the JVM is missing the provider.
+   */
+  public static PublicKey parse(AccountSshKey key)
+      throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchProviderException {
+    try {
+      final String s = key.encodedKey();
+      if (s == null) {
+        throw new InvalidKeySpecException("No key string");
+      }
+      final byte[] bin = Base64.decodeBase64(Constants.encodeASCII(s));
+      return new ByteArrayBuffer(bin).getRawPublicKey();
+    } catch (RuntimeException | SshException e) {
+      throw new InvalidKeySpecException("Cannot parse key", e);
+    }
+  }
+
+  /**
+   * Convert an RFC 4716 style key to an OpenSSH style key.
+   *
+   * @param keyStr the key string to convert.
+   * @return {@code keyStr} if conversion failed; otherwise the converted key, in OpenSSH key
+   *     format.
+   */
+  public static String toOpenSshPublicKey(String keyStr) {
+    try {
+      final StringBuilder strBuf = new StringBuilder();
+      final BufferedReader br = new BufferedReader(new StringReader(keyStr));
+      String line = br.readLine(); // BEGIN SSH2 line...
+      if (line == null || !line.equals("---- BEGIN SSH2 PUBLIC KEY ----")) {
+        return keyStr;
+      }
+
+      while ((line = br.readLine()) != null) {
+        if (line.indexOf(':') == -1) {
+          strBuf.append(line);
+          break;
+        }
+      }
+
+      while ((line = br.readLine()) != null) {
+        if (line.startsWith("---- ")) {
+          break;
+        }
+        strBuf.append(line);
+      }
+
+      final PublicKey key =
+          new ByteArrayBuffer(Base64.decodeBase64(Constants.encodeASCII(strBuf.toString())))
+              .getRawPublicKey();
+      if (key instanceof RSAPublicKey) {
+        strBuf.insert(0, KeyPairProvider.SSH_RSA + " ");
+
+      } else if (key instanceof DSAPublicKey) {
+        strBuf.insert(0, KeyPairProvider.SSH_DSS + " ");
+
+      } else {
+        return keyStr;
+      }
+
+      strBuf.append(' ');
+      strBuf.append("converted-key");
+      return strBuf.toString();
+    } catch (IOException | RuntimeException e) {
+      return keyStr;
+    }
+  }
+
+  public static boolean success(
+      final String username,
+      final ServerSession session,
+      final SshScope sshScope,
+      final SshLog sshLog,
+      final SshSession sd,
+      final CurrentUser user) {
+    if (sd.getUser() == null) {
+      sd.authenticationSuccess(username, user);
+
+      // If this is the first time we've authenticated this
+      // session, record a login event in the log and add
+      // a close listener to record a logout event.
+      //
+      Context ctx = sshScope.newContext(null, sd, null);
+      Context old = sshScope.set(ctx);
+      try {
+        sshLog.onLogin();
+      } finally {
+        sshScope.set(old);
+      }
+
+      session.addCloseFutureListener(
+          new SshFutureListener<CloseFuture>() {
+            @Override
+            public void operationComplete(CloseFuture future) {
+              final Context ctx = sshScope.newContext(null, sd, null);
+              final Context old = sshScope.set(ctx);
+              try {
+                sshLog.onLogout();
+              } finally {
+                sshScope.set(old);
+              }
+            }
+          });
+    }
+
+    return true;
+  }
+
+  public static IdentifiedUser createUser(
+      final SshSession sd,
+      final IdentifiedUser.GenericFactory userFactory,
+      final Account.Id account) {
+    return userFactory.create(sd.getRemoteAddress(), account);
+  }
+}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/StreamCommandExecutor.java b/java/com/google/gerrit/sshd/StreamCommandExecutor.java
similarity index 100%
rename from gerrit-sshd/src/main/java/com/google/gerrit/sshd/StreamCommandExecutor.java
rename to java/com/google/gerrit/sshd/StreamCommandExecutor.java
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/StreamCommandExecutorProvider.java b/java/com/google/gerrit/sshd/StreamCommandExecutorProvider.java
similarity index 100%
rename from gerrit-sshd/src/main/java/com/google/gerrit/sshd/StreamCommandExecutorProvider.java
rename to java/com/google/gerrit/sshd/StreamCommandExecutorProvider.java
diff --git a/java/com/google/gerrit/sshd/SuExec.java b/java/com/google/gerrit/sshd/SuExec.java
new file mode 100644
index 0000000..7053a0d
--- /dev/null
+++ b/java/com/google/gerrit/sshd/SuExec.java
@@ -0,0 +1,172 @@
+// Copyright (C) 2010 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.google.gerrit.sshd;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.base.Throwables;
+import com.google.common.util.concurrent.Atomics;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.PeerDaemonUser;
+import com.google.gerrit.server.config.AuthConfig;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.sshd.SshScope.Context;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.net.SocketAddress;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicReference;
+import org.apache.sshd.server.Environment;
+import org.apache.sshd.server.command.Command;
+import org.kohsuke.args4j.Argument;
+import org.kohsuke.args4j.Option;
+
+/**
+ * Executes any other command as a different user identity.
+ *
+ * <p>The calling user must be authenticated as a {@link PeerDaemonUser}, which usually requires
+ * public key authentication using this daemon's private host key, or a key on this daemon's peer
+ * host key ring.
+ */
+public final class SuExec extends BaseCommand {
+  private final SshScope sshScope;
+  private final DispatchCommandProvider dispatcher;
+  private final PermissionBackend permissionBackend;
+
+  private boolean enableRunAs;
+  private CurrentUser caller;
+  private SshSession session;
+  private IdentifiedUser.GenericFactory userFactory;
+  private SshScope.Context callingContext;
+
+  @Option(name = "--as", required = true)
+  private Account.Id accountId;
+
+  @Option(name = "--from")
+  private SocketAddress peerAddress;
+
+  @Argument(index = 0, multiValued = true, metaVar = "COMMAND")
+  private List<String> args = new ArrayList<>();
+
+  private final AtomicReference<Command> atomicCmd;
+
+  @Inject
+  SuExec(
+      final SshScope sshScope,
+      @CommandName(Commands.ROOT) final DispatchCommandProvider dispatcher,
+      PermissionBackend permissionBackend,
+      final CurrentUser caller,
+      final SshSession session,
+      final IdentifiedUser.GenericFactory userFactory,
+      final SshScope.Context callingContext,
+      AuthConfig config) {
+    this.sshScope = sshScope;
+    this.dispatcher = dispatcher;
+    this.permissionBackend = permissionBackend;
+    this.caller = caller;
+    this.session = session;
+    this.userFactory = userFactory;
+    this.callingContext = callingContext;
+    this.enableRunAs = config.isRunAsEnabled();
+    atomicCmd = Atomics.newReference();
+  }
+
+  @Override
+  public void start(Environment env) throws IOException {
+    try {
+      checkCanRunAs();
+      parseCommandLine();
+
+      final Context ctx = callingContext.subContext(newSession(), join(args));
+      final Context old = sshScope.set(ctx);
+      try {
+        final BaseCommand cmd = dispatcher.get();
+        cmd.setArguments(args.toArray(new String[args.size()]));
+        provideStateTo(cmd);
+        atomicCmd.set(cmd);
+        cmd.start(env);
+      } finally {
+        sshScope.set(old);
+      }
+    } catch (UnloggedFailure e) {
+      String msg = e.getMessage();
+      if (!msg.endsWith("\n")) {
+        msg += "\n";
+      }
+      err.write(msg.getBytes(UTF_8));
+      err.flush();
+      onExit(1);
+    }
+  }
+
+  private void checkCanRunAs() throws UnloggedFailure {
+    if (caller instanceof PeerDaemonUser) {
+      // OK.
+    } else if (!enableRunAs) {
+      throw die("suexec disabled by auth.enableRunAs = false");
+    } else {
+      try {
+        permissionBackend.user(caller).check(GlobalPermission.RUN_AS);
+      } catch (AuthException e) {
+        throw die("suexec not permitted");
+      } catch (PermissionBackendException e) {
+        throw die("suexec not available: " + e);
+      }
+    }
+  }
+
+  private SshSession newSession() {
+    final SocketAddress peer;
+    if (peerAddress == null) {
+      peer = session.getRemoteAddress();
+    } else {
+      peer = peerAddress;
+    }
+    if (caller instanceof PeerDaemonUser) {
+      caller = null;
+    }
+    return new SshSession(session, peer, userFactory.runAs(peer, accountId, caller));
+  }
+
+  private static String join(List<String> args) {
+    StringBuilder r = new StringBuilder();
+    for (String a : args) {
+      if (r.length() > 0) {
+        r.append(" ");
+      }
+      r.append(a);
+    }
+    return r.toString();
+  }
+
+  @Override
+  public void destroy() {
+    Command cmd = atomicCmd.getAndSet(null);
+    if (cmd != null) {
+      try {
+        cmd.destroy();
+      } catch (Exception e) {
+        Throwables.throwIfUnchecked(e);
+        throw new RuntimeException(e);
+      }
+    }
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/AdminQueryShell.java b/java/com/google/gerrit/sshd/commands/AdminQueryShell.java
new file mode 100644
index 0000000..c520e79
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/AdminQueryShell.java
@@ -0,0 +1,61 @@
+// Copyright (C) 2009 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.google.gerrit.sshd.commands;
+
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.sshd.AdminHighPriorityCommand;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.inject.Inject;
+import org.kohsuke.args4j.Option;
+
+/** Opens a query processor. */
+@AdminHighPriorityCommand
+@RequiresCapability(GlobalCapability.ACCESS_DATABASE)
+@CommandMetaData(name = "gsql", description = "Administrative interface to active database")
+final class AdminQueryShell extends SshCommand {
+  @Inject private PermissionBackend permissionBackend;
+  @Inject private QueryShell.Factory factory;
+
+  @Option(name = "--format", usage = "Set output format")
+  private QueryShell.OutputFormat format = QueryShell.OutputFormat.PRETTY;
+
+  @Option(name = "-c", metaVar = "SQL QUERY", usage = "Query to execute")
+  private String query;
+
+  @Override
+  protected void run() throws Failure {
+    try {
+      permissionBackend.currentUser().check(GlobalPermission.ACCESS_DATABASE);
+    } catch (AuthException err) {
+      throw die(err.getMessage());
+    } catch (PermissionBackendException e) {
+      throw new Failure(1, "unavailable", e);
+    }
+
+    QueryShell shell = factory.create(in, out);
+    shell.setOutputFormat(format);
+    if (query != null) {
+      shell.execute(query);
+    } else {
+      shell.run();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/ApproveOption.java b/java/com/google/gerrit/sshd/commands/ApproveOption.java
new file mode 100644
index 0000000..cda340d
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/ApproveOption.java
@@ -0,0 +1,170 @@
+// Copyright (C) 2009 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.google.gerrit.sshd.commands;
+
+import static com.google.gerrit.util.cli.Localizable.localizable;
+
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.LabelValue;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.AnnotatedElement;
+import org.kohsuke.args4j.CmdLineException;
+import org.kohsuke.args4j.CmdLineParser;
+import org.kohsuke.args4j.Option;
+import org.kohsuke.args4j.OptionDef;
+import org.kohsuke.args4j.spi.FieldSetter;
+import org.kohsuke.args4j.spi.OneArgumentOptionHandler;
+import org.kohsuke.args4j.spi.OptionHandler;
+import org.kohsuke.args4j.spi.Setter;
+
+final class ApproveOption implements Option, Setter<Short> {
+  private final String name;
+  private final String usage;
+  private final LabelType type;
+
+  private Short value;
+
+  ApproveOption(String name, String usage, LabelType type) {
+    this.name = name;
+    this.usage = usage;
+    this.type = type;
+  }
+
+  @Override
+  public String[] aliases() {
+    return new String[0];
+  }
+
+  @Override
+  public String[] depends() {
+    return new String[] {};
+  }
+
+  @Override
+  public boolean hidden() {
+    return false;
+  }
+
+  @Override
+  public Class<? extends OptionHandler<Short>> handler() {
+    return Handler.class;
+  }
+
+  @Override
+  public String metaVar() {
+    return "N";
+  }
+
+  @Override
+  public String name() {
+    return name;
+  }
+
+  @Override
+  public boolean required() {
+    return false;
+  }
+
+  @Override
+  public String usage() {
+    return usage;
+  }
+
+  public Short value() {
+    return value;
+  }
+
+  @Override
+  public Class<? extends Annotation> annotationType() {
+    return null;
+  }
+
+  @Override
+  public FieldSetter asFieldSetter() {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public AnnotatedElement asAnnotatedElement() {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public void addValue(Short val) {
+    this.value = val;
+  }
+
+  @Override
+  public Class<Short> getType() {
+    return Short.class;
+  }
+
+  @Override
+  public boolean isMultiValued() {
+    return false;
+  }
+
+  @Override
+  public String[] forbids() {
+    return null;
+  }
+
+  @Override
+  public boolean help() {
+    return false;
+  }
+
+  String getLabelName() {
+    return type.getName();
+  }
+
+  public static class Handler extends OneArgumentOptionHandler<Short> {
+    private final ApproveOption cmdOption;
+
+    // CS IGNORE RedundantModifier FOR NEXT 1 LINES. REASON: needed by org.kohsuke.args4j.Option
+    public Handler(CmdLineParser parser, OptionDef option, Setter<Short> setter) {
+      super(parser, option, setter);
+      this.cmdOption = (ApproveOption) setter;
+    }
+
+    @Override
+    protected Short parse(String token) throws NumberFormatException, CmdLineException {
+      String argument = token;
+      if (argument.startsWith("+")) {
+        argument = argument.substring(1);
+      }
+
+      final short value = Short.parseShort(argument);
+      final LabelValue min = cmdOption.type.getMin();
+      final LabelValue max = cmdOption.type.getMax();
+
+      if (value < min.getValue() || value > max.getValue()) {
+        final String name = cmdOption.name();
+        final String e =
+            "\""
+                + token
+                + "\" must be in range "
+                + min.formatValue()
+                + ".."
+                + max.formatValue()
+                + " for \""
+                + name
+                + "\"";
+        throw new CmdLineException(owner, localizable(e));
+      }
+      return value;
+    }
+  }
+}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/AproposCommand.java b/java/com/google/gerrit/sshd/commands/AproposCommand.java
similarity index 100%
rename from gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/AproposCommand.java
rename to java/com/google/gerrit/sshd/commands/AproposCommand.java
diff --git a/java/com/google/gerrit/sshd/commands/BanCommitCommand.java b/java/com/google/gerrit/sshd/commands/BanCommitCommand.java
new file mode 100644
index 0000000..415ac4c
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/BanCommitCommand.java
@@ -0,0 +1,87 @@
+// Copyright (C) 2012 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.google.gerrit.sshd.commands;
+
+import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER;
+
+import com.google.common.base.Joiner;
+import com.google.common.collect.Lists;
+import com.google.gerrit.extensions.api.projects.BanCommitInput;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.restapi.project.BanCommit;
+import com.google.gerrit.server.restapi.project.BanCommit.BanResultInfo;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.inject.Inject;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.jgit.lib.ObjectId;
+import org.kohsuke.args4j.Argument;
+import org.kohsuke.args4j.Option;
+
+@CommandMetaData(
+    name = "ban-commit",
+    description = "Ban a commit from a project's repository",
+    runsAt = MASTER)
+public class BanCommitCommand extends SshCommand {
+  @Option(
+      name = "--reason",
+      aliases = {"-r"},
+      metaVar = "REASON",
+      usage = "reason for banning the commit")
+  private String reason;
+
+  @Argument(
+      index = 0,
+      required = true,
+      metaVar = "PROJECT",
+      usage = "name of the project for which the commit should be banned")
+  private ProjectState projectState;
+
+  @Argument(
+      index = 1,
+      required = true,
+      multiValued = true,
+      metaVar = "COMMIT",
+      usage = "commit(s) that should be banned")
+  private List<ObjectId> commitsToBan = new ArrayList<>();
+
+  @Inject private BanCommit banCommit;
+
+  @Override
+  protected void run() throws Failure {
+    try {
+      BanCommitInput input =
+          BanCommitInput.fromCommits(Lists.transform(commitsToBan, ObjectId::getName));
+      input.reason = reason;
+
+      BanResultInfo r = banCommit.apply(new ProjectResource(projectState, user), input);
+      printCommits(r.newlyBanned, "The following commits were banned");
+      printCommits(r.alreadyBanned, "The following commits were already banned");
+      printCommits(r.ignored, "The following ids do not represent commits and were ignored");
+    } catch (Exception e) {
+      throw die(e);
+    }
+  }
+
+  private void printCommits(List<String> commits, String message) {
+    if (commits != null && !commits.isEmpty()) {
+      stdout.print(message + ":\n");
+      stdout.print(Joiner.on(",\n").join(commits));
+      stdout.print("\n\n");
+    }
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/BaseTestPrologCommand.java b/java/com/google/gerrit/sshd/commands/BaseTestPrologCommand.java
new file mode 100644
index 0000000..affb919
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/BaseTestPrologCommand.java
@@ -0,0 +1,78 @@
+// Copyright (C) 2012 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.google.gerrit.sshd.commands;
+
+import com.google.gerrit.extensions.common.TestSubmitRuleInput;
+import com.google.gerrit.extensions.common.TestSubmitRuleInput.Filters;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.server.OutputFormat;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.restapi.change.ChangesCollection;
+import com.google.gerrit.server.restapi.change.Revisions;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.inject.Inject;
+import java.nio.ByteBuffer;
+import org.eclipse.jgit.util.IO;
+import org.eclipse.jgit.util.RawParseUtils;
+import org.kohsuke.args4j.Argument;
+import org.kohsuke.args4j.Option;
+
+abstract class BaseTestPrologCommand extends SshCommand {
+  private TestSubmitRuleInput input = new TestSubmitRuleInput();
+
+  @Inject private ChangesCollection changes;
+
+  @Inject private Revisions revisions;
+
+  @Argument(index = 0, required = true, usage = "ChangeId to load in prolog environment")
+  protected String changeId;
+
+  @Option(
+      name = "-s",
+      usage =
+          "Read prolog script from stdin instead of reading rules.pl from the refs/meta/config branch")
+  protected boolean useStdin;
+
+  @Option(
+      name = "--no-filters",
+      aliases = {"-n"},
+      usage = "Don't run the submit_filter/2 from the parent projects")
+  void setNoFilters(boolean no) {
+    input.filters = no ? Filters.SKIP : Filters.RUN;
+  }
+
+  protected abstract RestModifyView<RevisionResource, TestSubmitRuleInput> createView();
+
+  @Override
+  protected final void run() throws UnloggedFailure {
+    try {
+      RevisionResource revision =
+          revisions.parse(
+              changes.parse(TopLevelResource.INSTANCE, IdString.fromUrl(changeId)),
+              IdString.fromUrl("current"));
+      if (useStdin) {
+        ByteBuffer buf = IO.readWholeStream(in, 4096);
+        input.rule = RawParseUtils.decode(buf.array(), buf.arrayOffset(), buf.limit());
+      }
+      Object result = createView().apply(revision, input);
+      OutputFormat.JSON.newGson().toJson(result, stdout);
+      stdout.print('\n');
+    } catch (Exception e) {
+      throw die("Processing of prolog script failed: " + e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/CloseConnection.java b/java/com/google/gerrit/sshd/commands/CloseConnection.java
new file mode 100644
index 0000000..60a878a
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/CloseConnection.java
@@ -0,0 +1,95 @@
+// Copyright (C) 2015 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.google.gerrit.sshd.commands;
+
+import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.sshd.AdminHighPriorityCommand;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.gerrit.sshd.SshDaemon;
+import com.google.gerrit.sshd.SshSession;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.sshd.common.future.CloseFuture;
+import org.apache.sshd.common.io.IoAcceptor;
+import org.apache.sshd.common.io.IoSession;
+import org.apache.sshd.common.session.helpers.AbstractSession;
+import org.kohsuke.args4j.Argument;
+import org.kohsuke.args4j.Option;
+
+/** Close specified SSH connections */
+@AdminHighPriorityCommand
+@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
+@CommandMetaData(
+    name = "close-connection",
+    description = "Close the specified SSH connection",
+    runsAt = MASTER_OR_SLAVE)
+final class CloseConnection extends SshCommand {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  @Inject private SshDaemon sshDaemon;
+
+  @Argument(
+      index = 0,
+      multiValued = true,
+      required = true,
+      metaVar = "SESSION_ID",
+      usage = "List of SSH session IDs to be closed")
+  private List<String> sessionIds = new ArrayList<>();
+
+  @Option(name = "--wait", usage = "wait for connection to close before exiting")
+  private boolean wait;
+
+  @Override
+  protected void run() throws Failure {
+    IoAcceptor acceptor = sshDaemon.getIoAcceptor();
+    if (acceptor == null) {
+      throw new Failure(1, "fatal: sshd no longer running");
+    }
+    for (String sessionId : sessionIds) {
+      boolean connectionFound = false;
+      int id = (int) Long.parseLong(sessionId, 16);
+      for (IoSession io : acceptor.getManagedSessions().values()) {
+        AbstractSession serverSession = AbstractSession.getSession(io, true);
+        SshSession sshSession =
+            serverSession != null ? serverSession.getAttribute(SshSession.KEY) : null;
+        if (sshSession != null && sshSession.getSessionId() == id) {
+          connectionFound = true;
+          stdout.println("closing connection " + sessionId + "...");
+          CloseFuture future = io.close(true);
+          if (wait) {
+            try {
+              future.await();
+              stdout.println("closed connection " + sessionId);
+            } catch (IOException e) {
+              logger.atWarning().log(
+                  "Wait for connection to close interrupted: %s", e.getMessage());
+            }
+          }
+          break;
+        }
+      }
+      if (!connectionFound) {
+        stderr.print("close connection " + sessionId + ": no such connection\n");
+      }
+    }
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/CreateAccountCommand.java b/java/com/google/gerrit/sshd/commands/CreateAccountCommand.java
new file mode 100644
index 0000000..8a37cce
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/CreateAccountCommand.java
@@ -0,0 +1,105 @@
+// Copyright (C) 2010 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.google.gerrit.sshd.commands;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.collect.Lists;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.extensions.api.accounts.AccountInput;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.restapi.account.CreateAccount;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.kohsuke.args4j.Argument;
+import org.kohsuke.args4j.Option;
+
+/** Create a new user account. * */
+@RequiresCapability(GlobalCapability.CREATE_ACCOUNT)
+@CommandMetaData(name = "create-account", description = "Create a new batch/role account")
+final class CreateAccountCommand extends SshCommand {
+  @Option(
+      name = "--group",
+      aliases = {"-g"},
+      metaVar = "GROUP",
+      usage = "groups to add account to")
+  private List<AccountGroup.Id> groups = new ArrayList<>();
+
+  @Option(name = "--full-name", metaVar = "NAME", usage = "display name of the account")
+  private String fullName;
+
+  @Option(name = "--email", metaVar = "EMAIL", usage = "email address of the account")
+  private String email;
+
+  @Option(name = "--ssh-key", metaVar = "-|KEY", usage = "public key for SSH authentication")
+  private String sshKey;
+
+  @Option(
+      name = "--http-password",
+      metaVar = "PASSWORD",
+      usage = "password for HTTP authentication")
+  private String httpPassword;
+
+  @Argument(index = 0, required = true, metaVar = "USERNAME", usage = "name of the user account")
+  private String username;
+
+  @Inject private CreateAccount createAccount;
+
+  @Override
+  protected void run()
+      throws OrmException, IOException, ConfigInvalidException, UnloggedFailure,
+          PermissionBackendException {
+    AccountInput input = new AccountInput();
+    input.username = username;
+    input.email = email;
+    input.name = fullName;
+    input.sshKey = readSshKey();
+    input.httpPassword = httpPassword;
+    input.groups = Lists.transform(groups, AccountGroup.Id::toString);
+    try {
+      createAccount.apply(TopLevelResource.INSTANCE, IdString.fromDecoded(username), input);
+    } catch (RestApiException e) {
+      throw die(e.getMessage());
+    }
+  }
+
+  private String readSshKey() throws IOException {
+    if (sshKey == null) {
+      return null;
+    }
+    if ("-".equals(sshKey)) {
+      sshKey = "";
+      BufferedReader br = new BufferedReader(new InputStreamReader(in, UTF_8));
+      String line;
+      while ((line = br.readLine()) != null) {
+        sshKey += line + "\n";
+      }
+    }
+    return sshKey;
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/CreateBranchCommand.java b/java/com/google/gerrit/sshd/commands/CreateBranchCommand.java
new file mode 100644
index 0000000..aad96a1
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/CreateBranchCommand.java
@@ -0,0 +1,55 @@
+// Copyright (C) 2013 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.google.gerrit.sshd.commands;
+
+import com.google.gerrit.extensions.api.GerritApi;
+import com.google.gerrit.extensions.api.projects.BranchInput;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.inject.Inject;
+import org.kohsuke.args4j.Argument;
+
+/** Create a new branch. * */
+@CommandMetaData(name = "create-branch", description = "Create a new branch")
+public final class CreateBranchCommand extends SshCommand {
+
+  @Argument(index = 0, required = true, metaVar = "PROJECT", usage = "name of the project")
+  private ProjectState project;
+
+  @Argument(index = 1, required = true, metaVar = "NAME", usage = "name of branch to be created")
+  private String name;
+
+  @Argument(
+      index = 2,
+      required = true,
+      metaVar = "REVISION",
+      usage = "base revision of the new branch")
+  private String revision;
+
+  @Inject GerritApi gApi;
+
+  @Override
+  protected void run() throws UnloggedFailure {
+    try {
+      BranchInput in = new BranchInput();
+      in.revision = revision;
+      gApi.projects().name(project.getName()).branch(name).create(in);
+    } catch (RestApiException e) {
+      throw die(e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/CreateGroupCommand.java b/java/com/google/gerrit/sshd/commands/CreateGroupCommand.java
new file mode 100644
index 0000000..917c138
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/CreateGroupCommand.java
@@ -0,0 +1,155 @@
+// Copyright (C) 2010 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.google.gerrit.sshd.commands;
+
+import static java.util.stream.Collectors.toList;
+
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.extensions.api.groups.GroupInput;
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.group.GroupResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.restapi.group.AddMembers;
+import com.google.gerrit.server.restapi.group.AddSubgroups;
+import com.google.gerrit.server.restapi.group.CreateGroup;
+import com.google.gerrit.server.restapi.group.GroupsCollection;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.kohsuke.args4j.Argument;
+import org.kohsuke.args4j.Option;
+
+/**
+ * Creates a new group.
+ *
+ * <p>Optionally, puts an initial set of user in the newly created group.
+ */
+@RequiresCapability(GlobalCapability.CREATE_GROUP)
+@CommandMetaData(name = "create-group", description = "Create a new account group")
+final class CreateGroupCommand extends SshCommand {
+  @Option(
+      name = "--owner",
+      aliases = {"-o"},
+      metaVar = "GROUP",
+      usage = "owning group, if not specified the group will be self-owning")
+  private AccountGroup.Id ownerGroupId;
+
+  @Option(
+      name = "--description",
+      aliases = {"-d"},
+      metaVar = "DESC",
+      usage = "description of group")
+  private String groupDescription = "";
+
+  @Argument(index = 0, required = true, metaVar = "GROUP", usage = "name of group to be created")
+  private String groupName;
+
+  private final Set<Account.Id> initialMembers = new HashSet<>();
+
+  @Option(
+      name = "--member",
+      aliases = {"-m"},
+      metaVar = "USERNAME",
+      usage = "initial set of users to become members of the group")
+  void addMember(Account.Id id) {
+    initialMembers.add(id);
+  }
+
+  @Option(name = "--visible-to-all", usage = "to make the group visible to all registered users")
+  private boolean visibleToAll;
+
+  private final Set<AccountGroup.UUID> initialGroups = new HashSet<>();
+
+  @Option(
+      name = "--group",
+      aliases = "-g",
+      metaVar = "GROUP",
+      usage = "initial set of groups to be included in the group")
+  void addGroup(AccountGroup.UUID id) {
+    initialGroups.add(id);
+  }
+
+  @Inject private CreateGroup createGroup;
+
+  @Inject private GroupsCollection groups;
+
+  @Inject private AddMembers addMembers;
+
+  @Inject private AddSubgroups addSubgroups;
+
+  @Override
+  protected void run()
+      throws Failure, OrmException, IOException, ConfigInvalidException,
+          PermissionBackendException {
+    try {
+      GroupResource rsrc = createGroup();
+
+      if (!initialMembers.isEmpty()) {
+        addMembers(rsrc);
+      }
+
+      if (!initialGroups.isEmpty()) {
+        addSubgroups(rsrc);
+      }
+    } catch (RestApiException e) {
+      throw die(e);
+    }
+  }
+
+  private GroupResource createGroup()
+      throws RestApiException, OrmException, IOException, ConfigInvalidException,
+          PermissionBackendException {
+    GroupInput input = new GroupInput();
+    input.description = groupDescription;
+    input.visibleToAll = visibleToAll;
+
+    if (ownerGroupId != null) {
+      input.ownerId = String.valueOf(ownerGroupId.get());
+    }
+
+    GroupInfo group =
+        createGroup.apply(TopLevelResource.INSTANCE, IdString.fromDecoded(groupName), input);
+    return groups.parse(TopLevelResource.INSTANCE, IdString.fromUrl(group.id));
+  }
+
+  private void addMembers(GroupResource rsrc)
+      throws RestApiException, OrmException, IOException, ConfigInvalidException,
+          PermissionBackendException {
+    AddMembers.Input input =
+        AddMembers.Input.fromMembers(
+            initialMembers.stream().map(Object::toString).collect(toList()));
+    addMembers.apply(rsrc, input);
+  }
+
+  private void addSubgroups(GroupResource rsrc)
+      throws RestApiException, OrmException, IOException, ConfigInvalidException,
+          PermissionBackendException {
+    AddSubgroups.Input input =
+        AddSubgroups.Input.fromGroups(
+            initialGroups.stream().map(AccountGroup.UUID::get).collect(toList()));
+    addSubgroups.apply(rsrc, input);
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/CreateProjectCommand.java b/java/com/google/gerrit/sshd/commands/CreateProjectCommand.java
new file mode 100644
index 0000000..df86d63
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/CreateProjectCommand.java
@@ -0,0 +1,244 @@
+// Copyright (C) 2009 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.google.gerrit.sshd.commands;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Splitter;
+import com.google.common.collect.Lists;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.extensions.api.GerritApi;
+import com.google.gerrit.extensions.api.projects.ConfigValue;
+import com.google.gerrit.extensions.api.projects.ProjectInput;
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.project.SuggestParentCandidates;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.inject.Inject;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.kohsuke.args4j.Argument;
+import org.kohsuke.args4j.Option;
+
+/** Create a new project. * */
+@RequiresCapability(GlobalCapability.CREATE_PROJECT)
+@CommandMetaData(
+    name = "create-project",
+    description = "Create a new project and associated Git repository")
+final class CreateProjectCommand extends SshCommand {
+  @Option(
+      name = "--suggest-parents",
+      aliases = {"-S"},
+      usage =
+          "suggest parent candidates, "
+              + "if this option is used all other options and arguments are ignored")
+  private boolean suggestParent;
+
+  @Option(
+      name = "--owner",
+      aliases = {"-o"},
+      usage = "owner(s) of project")
+  private List<AccountGroup.UUID> ownerIds;
+
+  @Option(
+      name = "--parent",
+      aliases = {"-p"},
+      metaVar = "NAME",
+      usage = "parent project")
+  private ProjectState newParent;
+
+  @Option(name = "--permissions-only", usage = "create project for use only as parent")
+  private boolean permissionsOnly;
+
+  @Option(
+      name = "--description",
+      aliases = {"-d"},
+      metaVar = "DESCRIPTION",
+      usage = "description of project")
+  private String projectDescription = "";
+
+  @Option(
+      name = "--submit-type",
+      aliases = {"-t"},
+      usage = "project submit type")
+  private SubmitType submitType;
+
+  @Option(name = "--contributor-agreements", usage = "if contributor agreement is required")
+  private InheritableBoolean contributorAgreements = InheritableBoolean.INHERIT;
+
+  @Option(name = "--signed-off-by", usage = "if signed-off-by is required")
+  private InheritableBoolean signedOffBy = InheritableBoolean.INHERIT;
+
+  @Option(name = "--content-merge", usage = "allow automatic conflict resolving within files")
+  private InheritableBoolean contentMerge = InheritableBoolean.INHERIT;
+
+  @Option(name = "--change-id", usage = "if change-id is required")
+  private InheritableBoolean requireChangeID = InheritableBoolean.INHERIT;
+
+  @Option(name = "--reject-empty-commit", usage = "if empty commits should be rejected on submit")
+  private InheritableBoolean rejectEmptyCommit = InheritableBoolean.INHERIT;
+
+  @Option(
+      name = "--new-change-for-all-not-in-target",
+      usage = "if a new change will be created for every commit not in target branch")
+  private InheritableBoolean createNewChangeForAllNotInTarget = InheritableBoolean.INHERIT;
+
+  @Option(
+      name = "--use-contributor-agreements",
+      aliases = {"--ca"},
+      usage = "if contributor agreement is required")
+  void setUseContributorArgreements(@SuppressWarnings("unused") boolean on) {
+    contributorAgreements = InheritableBoolean.TRUE;
+  }
+
+  @Option(
+      name = "--use-signed-off-by",
+      aliases = {"--so"},
+      usage = "if signed-off-by is required")
+  void setUseSignedOffBy(@SuppressWarnings("unused") boolean on) {
+    signedOffBy = InheritableBoolean.TRUE;
+  }
+
+  @Option(name = "--use-content-merge", usage = "allow automatic conflict resolving within files")
+  void setUseContentMerge(@SuppressWarnings("unused") boolean on) {
+    contentMerge = InheritableBoolean.TRUE;
+  }
+
+  @Option(
+      name = "--require-change-id",
+      aliases = {"--id"},
+      usage = "if change-id is required")
+  void setRequireChangeId(@SuppressWarnings("unused") boolean on) {
+    requireChangeID = InheritableBoolean.TRUE;
+  }
+
+  @Option(
+      name = "--create-new-change-for-all-not-in-target",
+      aliases = {"--ncfa"},
+      usage = "if a new change will be created for every commit not in target branch")
+  void setNewChangeForAllNotInTarget(@SuppressWarnings("unused") boolean on) {
+    createNewChangeForAllNotInTarget = InheritableBoolean.TRUE;
+  }
+
+  @Option(
+      name = "--branch",
+      aliases = {"-b"},
+      metaVar = "BRANCH",
+      usage = "initial branch name\n(default: master)")
+  private List<String> branch;
+
+  @Option(name = "--empty-commit", usage = "to create initial empty commit")
+  private boolean createEmptyCommit;
+
+  @Option(name = "--max-object-size-limit", usage = "max Git object size for this project")
+  private String maxObjectSizeLimit;
+
+  @Option(
+      name = "--plugin-config",
+      usage = "plugin configuration parameter with format '<plugin-name>.<parameter-name>=<value>'")
+  private List<String> pluginConfigValues;
+
+  @Argument(index = 0, metaVar = "NAME", usage = "name of project to be created")
+  private String projectName;
+
+  @Inject private GerritApi gApi;
+
+  @Inject private SuggestParentCandidates suggestParentCandidates;
+
+  @Override
+  protected void run() throws Failure {
+    try {
+      if (!suggestParent) {
+        if (projectName == null) {
+          throw die("Project name is required.");
+        }
+
+        ProjectInput input = new ProjectInput();
+        input.name = projectName;
+        if (ownerIds != null) {
+          input.owners = Lists.transform(ownerIds, AccountGroup.UUID::get);
+        }
+        if (newParent != null) {
+          input.parent = newParent.getName();
+        }
+        input.permissionsOnly = permissionsOnly;
+        input.description = projectDescription;
+        input.submitType = submitType;
+        input.useContributorAgreements = contributorAgreements;
+        input.useSignedOffBy = signedOffBy;
+        input.useContentMerge = contentMerge;
+        input.requireChangeId = requireChangeID;
+        input.createNewChangeForAllNotInTarget = createNewChangeForAllNotInTarget;
+        input.branches = branch;
+        input.createEmptyCommit = createEmptyCommit;
+        input.maxObjectSizeLimit = maxObjectSizeLimit;
+        input.rejectEmptyCommit = rejectEmptyCommit;
+        if (pluginConfigValues != null) {
+          input.pluginConfigValues = parsePluginConfigValues(pluginConfigValues);
+        }
+
+        gApi.projects().create(input);
+      } else {
+        for (Project.NameKey parent : suggestParentCandidates.getNameKeys()) {
+          stdout.print(parent.get() + '\n');
+        }
+      }
+    } catch (RestApiException err) {
+      throw die(err);
+    } catch (PermissionBackendException err) {
+      throw new Failure(1, "permissions unavailable", err);
+    }
+  }
+
+  @VisibleForTesting
+  Map<String, Map<String, ConfigValue>> parsePluginConfigValues(List<String> pluginConfigValues)
+      throws UnloggedFailure {
+    Map<String, Map<String, ConfigValue>> m = new HashMap<>();
+    for (String pluginConfigValue : pluginConfigValues) {
+      List<String> s = Splitter.on('=').splitToList(pluginConfigValue);
+      List<String> s2 = Splitter.on('.').splitToList(s.get(0));
+      if (s.size() != 2 || s2.size() != 2) {
+        throw die(
+            "Invalid plugin config value '"
+                + pluginConfigValue
+                + "', expected format '<plugin-name>.<parameter-name>=<value>'"
+                + " or '<plugin-name>.<parameter-name>=<value1,value2,...>'");
+      }
+      ConfigValue value = new ConfigValue();
+      String v = s.get(1);
+      if (v.contains(",")) {
+        value.values = Splitter.on(",").splitToList(v);
+      } else {
+        value.value = v;
+      }
+      String pluginName = s2.get(0);
+      String paramName = s2.get(1);
+      Map<String, ConfigValue> l = m.get(pluginName);
+      if (l == null) {
+        l = new HashMap<>();
+        m.put(pluginName, l);
+      }
+      l.put(paramName, value);
+    }
+    return m;
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/DefaultCommandModule.java b/java/com/google/gerrit/sshd/commands/DefaultCommandModule.java
new file mode 100644
index 0000000..1c857e4
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/DefaultCommandModule.java
@@ -0,0 +1,134 @@
+// Copyright (C) 2009 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.google.gerrit.sshd.commands;
+
+import com.google.gerrit.reviewdb.client.CoreDownloadSchemes;
+import com.google.gerrit.server.config.DownloadConfig;
+import com.google.gerrit.sshd.CommandModule;
+import com.google.gerrit.sshd.CommandName;
+import com.google.gerrit.sshd.Commands;
+import com.google.gerrit.sshd.DispatchCommandProvider;
+import com.google.gerrit.sshd.SuExec;
+import com.google.gerrit.sshd.plugin.LfsPluginAuthCommand;
+
+/** Register the commands a Gerrit server supports. */
+public class DefaultCommandModule extends CommandModule {
+  private final DownloadConfig downloadConfig;
+  private final LfsPluginAuthCommand.Module lfsPluginAuthModule;
+
+  public DefaultCommandModule(
+      boolean slave, DownloadConfig downloadCfg, LfsPluginAuthCommand.Module module) {
+    slaveMode = slave;
+    downloadConfig = downloadCfg;
+    lfsPluginAuthModule = module;
+  }
+
+  @Override
+  protected void configure() {
+    CommandName git = Commands.named("git");
+    CommandName gerrit = Commands.named("gerrit");
+    CommandName logging = Commands.named(gerrit, "logging");
+    CommandName plugin = Commands.named(gerrit, "plugin");
+    CommandName testSubmit = Commands.named(gerrit, "test-submit");
+
+    command(gerrit).toProvider(new DispatchCommandProvider(gerrit));
+    command(gerrit, AproposCommand.class);
+    command(gerrit, BanCommitCommand.class);
+    command(gerrit, CloseConnection.class);
+    command(gerrit, FlushCaches.class);
+    command(gerrit, ListProjectsCommand.class);
+    command(gerrit, ListMembersCommand.class);
+    command(gerrit, ListGroupsCommand.class);
+    command(gerrit, LsUserRefs.class);
+    command(gerrit, Query.class);
+    command(gerrit, ReloadConfig.class);
+    command(gerrit, ShowCaches.class);
+    command(gerrit, ShowConnections.class);
+    command(gerrit, ShowQueue.class);
+    command(gerrit, StreamEvents.class);
+    command(gerrit, VersionCommand.class);
+    command(gerrit, GarbageCollectionCommand.class);
+
+    command(gerrit, "plugin").toProvider(new DispatchCommandProvider(plugin));
+    command(plugin, PluginLsCommand.class);
+    command(plugin, PluginEnableCommand.class);
+    command(plugin, PluginInstallCommand.class);
+    command(plugin, PluginReloadCommand.class);
+    command(plugin, PluginRemoveCommand.class);
+    alias(plugin, "add", PluginInstallCommand.class);
+    alias(plugin, "rm", PluginRemoveCommand.class);
+
+    command(git).toProvider(new DispatchCommandProvider(git));
+
+    command("ps").to(ShowQueue.class);
+    command("kill").to(KillCommand.class);
+    command("scp").to(ScpCommand.class);
+
+    // Honor the legacy hyphenated forms as aliases for the non-hyphenated forms
+    if (sshEnabled()) {
+      command("git-upload-pack").to(Commands.key(git, "upload-pack"));
+      command(git, "upload-pack").to(Upload.class);
+      command("git-upload-archive").to(Commands.key(git, "upload-archive"));
+      command(git, "upload-archive").to(UploadArchive.class);
+    }
+    command("suexec").to(SuExec.class);
+    listener().to(ShowCaches.StartupListener.class);
+
+    command(gerrit, CreateAccountCommand.class);
+    command(gerrit, CreateGroupCommand.class);
+    command(gerrit, CreateProjectCommand.class);
+    command(gerrit, SetHeadCommand.class);
+    command(gerrit, AdminQueryShell.class);
+
+    if (slaveMode) {
+      command("git-receive-pack").to(ReceiveSlaveMode.class);
+      command("gerrit-receive-pack").to(ReceiveSlaveMode.class);
+      command(git, "receive-pack").to(ReceiveSlaveMode.class);
+    } else {
+      if (sshEnabled()) {
+        command("git-receive-pack").to(Commands.key(git, "receive-pack"));
+        command("gerrit-receive-pack").to(Commands.key(git, "receive-pack"));
+        command(git, "receive-pack").to(Commands.key(gerrit, "receive-pack"));
+      }
+      command(gerrit, "test-submit").toProvider(new DispatchCommandProvider(testSubmit));
+    }
+    command(gerrit, Receive.class);
+
+    command(gerrit, RenameGroupCommand.class);
+    command(gerrit, ReviewCommand.class);
+    command(gerrit, SetProjectCommand.class);
+    command(gerrit, SetReviewersCommand.class);
+
+    command(gerrit, SetMembersCommand.class);
+    command(gerrit, CreateBranchCommand.class);
+    command(gerrit, SetAccountCommand.class);
+    command(gerrit, SetParentCommand.class);
+
+    command(testSubmit, TestSubmitRuleCommand.class);
+    command(testSubmit, TestSubmitTypeCommand.class);
+
+    command(logging).toProvider(new DispatchCommandProvider(logging));
+    command(logging, SetLoggingLevelCommand.class);
+    command(logging, ListLoggingLevelCommand.class);
+    alias(logging, "ls", ListLoggingLevelCommand.class);
+    alias(logging, "set", SetLoggingLevelCommand.class);
+
+    install(lfsPluginAuthModule);
+  }
+
+  private boolean sshEnabled() {
+    return downloadConfig.getDownloadSchemes().contains(CoreDownloadSchemes.SSH);
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/FlushCaches.java b/java/com/google/gerrit/sshd/commands/FlushCaches.java
new file mode 100644
index 0000000..df56cf4
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/FlushCaches.java
@@ -0,0 +1,98 @@
+// Copyright (C) 2008 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.google.gerrit.sshd.commands;
+
+import static com.google.gerrit.common.data.GlobalCapability.FLUSH_CACHES;
+import static com.google.gerrit.common.data.GlobalCapability.MAINTAIN_SERVER;
+import static com.google.gerrit.server.restapi.config.PostCaches.Operation.FLUSH;
+import static com.google.gerrit.server.restapi.config.PostCaches.Operation.FLUSH_ALL;
+import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;
+
+import com.google.gerrit.extensions.annotations.RequiresAnyCapability;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.server.config.ConfigResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.restapi.config.ListCaches;
+import com.google.gerrit.server.restapi.config.ListCaches.OutputFormat;
+import com.google.gerrit.server.restapi.config.PostCaches;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.inject.Inject;
+import java.util.ArrayList;
+import java.util.List;
+import org.kohsuke.args4j.Option;
+
+/** Causes the caches to purge all entries and reload. */
+@RequiresAnyCapability({FLUSH_CACHES, MAINTAIN_SERVER})
+@CommandMetaData(
+    name = "flush-caches",
+    description = "Flush some/all server caches from memory",
+    runsAt = MASTER_OR_SLAVE)
+final class FlushCaches extends SshCommand {
+  @Option(name = "--cache", usage = "flush named cache", metaVar = "NAME")
+  private List<String> caches = new ArrayList<>();
+
+  @Option(name = "--all", usage = "flush all caches")
+  private boolean all;
+
+  @Option(name = "--list", usage = "list available caches")
+  private boolean list;
+
+  @Inject private ListCaches listCaches;
+
+  @Inject private PostCaches postCaches;
+
+  @Override
+  protected void run() throws Failure {
+    try {
+      if (list) {
+        if (all || caches.size() > 0) {
+          throw die("cannot use --list with --all or --cache");
+        }
+        doList();
+        return;
+      }
+
+      if (all && caches.size() > 0) {
+        throw die("cannot combine --all and --cache");
+      } else if (!all && caches.size() == 1 && caches.contains("all")) {
+        caches.clear();
+        all = true;
+      } else if (!all && caches.isEmpty()) {
+        all = true;
+      }
+
+      if (all) {
+        postCaches.apply(new ConfigResource(), new PostCaches.Input(FLUSH_ALL));
+      } else {
+        postCaches.apply(new ConfigResource(), new PostCaches.Input(FLUSH, caches));
+      }
+    } catch (RestApiException e) {
+      throw die(e.getMessage());
+    } catch (PermissionBackendException e) {
+      throw new Failure(1, "unavailable", e);
+    }
+  }
+
+  @SuppressWarnings("unchecked")
+  private void doList() {
+    for (String name :
+        (List<String>) listCaches.setFormat(OutputFormat.LIST).apply(new ConfigResource())) {
+      stderr.print(name);
+      stderr.print('\n');
+    }
+    stderr.flush();
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/GarbageCollectionCommand.java b/java/com/google/gerrit/sshd/commands/GarbageCollectionCommand.java
new file mode 100644
index 0000000..ecbb373
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/GarbageCollectionCommand.java
@@ -0,0 +1,117 @@
+// Copyright (C) 2012 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.google.gerrit.sshd.commands;
+
+import static com.google.gerrit.common.data.GlobalCapability.MAINTAIN_SERVER;
+import static com.google.gerrit.common.data.GlobalCapability.RUN_GC;
+import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.collect.Lists;
+import com.google.gerrit.common.data.GarbageCollectionResult;
+import com.google.gerrit.extensions.annotations.RequiresAnyCapability;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.git.GarbageCollection;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.inject.Inject;
+import java.util.ArrayList;
+import java.util.List;
+import org.kohsuke.args4j.Argument;
+import org.kohsuke.args4j.Option;
+
+/** Runs the Git garbage collection. */
+@RequiresAnyCapability({RUN_GC, MAINTAIN_SERVER})
+@CommandMetaData(name = "gc", description = "Run Git garbage collection", runsAt = MASTER_OR_SLAVE)
+public class GarbageCollectionCommand extends SshCommand {
+
+  @Option(name = "--all", usage = "runs the Git garbage collection for all projects")
+  private boolean all;
+
+  @Option(name = "--show-progress", usage = "progress information is shown")
+  private boolean showProgress;
+
+  @Option(name = "--aggressive", usage = "run aggressive garbage collection")
+  private boolean aggressive;
+
+  @Argument(
+      index = 0,
+      required = false,
+      multiValued = true,
+      metaVar = "NAME",
+      usage = "projects for which the Git garbage collection should be run")
+  private List<ProjectState> projects = new ArrayList<>();
+
+  @Inject private ProjectCache projectCache;
+
+  @Inject private GarbageCollection.Factory garbageCollectionFactory;
+
+  @Override
+  public void run() throws Exception {
+    verifyCommandLine();
+    runGC();
+  }
+
+  private void verifyCommandLine() throws UnloggedFailure {
+    if (!all && projects.isEmpty()) {
+      throw die("needs projects as command arguments or --all option");
+    }
+    if (all && !projects.isEmpty()) {
+      throw die("either specify projects as command arguments or use --all option");
+    }
+  }
+
+  private void runGC() {
+    List<Project.NameKey> projectNames;
+    if (all) {
+      projectNames = Lists.newArrayList(projectCache.all());
+    } else {
+      projectNames = projects.stream().map(ProjectState::getNameKey).collect(toList());
+    }
+
+    GarbageCollectionResult result =
+        garbageCollectionFactory
+            .create()
+            .run(projectNames, aggressive, showProgress ? stdout : null);
+    if (result.hasErrors()) {
+      for (GarbageCollectionResult.Error e : result.getErrors()) {
+        String msg;
+        switch (e.getType()) {
+          case REPOSITORY_NOT_FOUND:
+            msg = "error: project \"" + e.getProjectName() + "\" not found";
+            break;
+          case GC_ALREADY_SCHEDULED:
+            msg =
+                "error: garbage collection for project \""
+                    + e.getProjectName()
+                    + "\" was already scheduled";
+            break;
+          case GC_FAILED:
+            msg = "error: garbage collection for project \"" + e.getProjectName() + "\" failed";
+            break;
+          default:
+            msg =
+                "error: garbage collection for project \""
+                    + e.getProjectName()
+                    + "\" failed: "
+                    + e.getType();
+        }
+        stdout.print(msg + "\n");
+      }
+    }
+  }
+}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/IndexActivateCommand.java b/java/com/google/gerrit/sshd/commands/IndexActivateCommand.java
similarity index 100%
rename from gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/IndexActivateCommand.java
rename to java/com/google/gerrit/sshd/commands/IndexActivateCommand.java
diff --git a/java/com/google/gerrit/sshd/commands/IndexChangesCommand.java b/java/com/google/gerrit/sshd/commands/IndexChangesCommand.java
new file mode 100644
index 0000000..fad74f5
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/IndexChangesCommand.java
@@ -0,0 +1,70 @@
+// 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.
+
+package com.google.gerrit.sshd.commands;
+
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.restapi.change.Index;
+import com.google.gerrit.sshd.ChangeArgumentParser;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import org.kohsuke.args4j.Argument;
+
+@CommandMetaData(name = "changes", description = "Index changes")
+final class IndexChangesCommand extends SshCommand {
+  @Inject private Index index;
+
+  @Inject private ChangeArgumentParser changeArgumentParser;
+
+  @Argument(
+      index = 0,
+      required = true,
+      multiValued = true,
+      metaVar = "CHANGE",
+      usage = "changes to index")
+  void addChange(String token) {
+    try {
+      changeArgumentParser.addChange(token, changes, null, false);
+    } catch (UnloggedFailure | OrmException | PermissionBackendException | IOException e) {
+      writeError("warning", e.getMessage());
+    }
+  }
+
+  private Map<Change.Id, ChangeResource> changes = new LinkedHashMap<>();
+
+  @Override
+  protected void run() throws UnloggedFailure {
+    boolean ok = true;
+    for (ChangeResource rsrc : changes.values()) {
+      try {
+        index.apply(rsrc, new Input());
+      } catch (Exception e) {
+        ok = false;
+        writeError(
+            "error", String.format("failed to index change %s: %s", rsrc.getId(), e.getMessage()));
+      }
+    }
+    if (!ok) {
+      throw die("failed to index one or more changes");
+    }
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/IndexChangesInProjectCommand.java b/java/com/google/gerrit/sshd/commands/IndexChangesInProjectCommand.java
new file mode 100644
index 0000000..56b00a5
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/IndexChangesInProjectCommand.java
@@ -0,0 +1,60 @@
+// Copyright (C) 2017 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.google.gerrit.sshd.commands;
+
+import static com.google.gerrit.common.data.GlobalCapability.MAINTAIN_SERVER;
+
+import com.google.gerrit.extensions.annotations.RequiresAnyCapability;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.restapi.project.IndexChanges;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.inject.Inject;
+import java.util.ArrayList;
+import java.util.List;
+import org.kohsuke.args4j.Argument;
+
+@RequiresAnyCapability({MAINTAIN_SERVER})
+@CommandMetaData(name = "changes-in-project", description = "Index changes of a project")
+final class IndexChangesInProjectCommand extends SshCommand {
+
+  @Inject private IndexChanges index;
+
+  @Argument(
+      index = 0,
+      required = true,
+      multiValued = true,
+      metaVar = "PROJECT",
+      usage = "projects for which the changes should be indexed")
+  private List<ProjectState> projects = new ArrayList<>();
+
+  @Override
+  protected void run() throws UnloggedFailure, Failure, Exception {
+    if (projects.isEmpty()) {
+      throw die("needs at least one project as command arguments");
+    }
+    projects.stream().forEach(this::index);
+  }
+
+  private void index(ProjectState projectState) {
+    try {
+      index.apply(new ProjectResource(projectState, user), null);
+    } catch (Exception e) {
+      writeError(
+          "error", String.format("Unable to index %s: %s", projectState.getName(), e.getMessage()));
+    }
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/IndexCommandsModule.java b/java/com/google/gerrit/sshd/commands/IndexCommandsModule.java
new file mode 100644
index 0000000..332ed69
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/IndexCommandsModule.java
@@ -0,0 +1,45 @@
+// Copyright (C) 2015 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.google.gerrit.sshd.commands;
+
+import com.google.gerrit.server.index.VersionManager;
+import com.google.gerrit.sshd.CommandModule;
+import com.google.gerrit.sshd.CommandName;
+import com.google.gerrit.sshd.Commands;
+import com.google.gerrit.sshd.DispatchCommandProvider;
+import com.google.inject.Injector;
+import com.google.inject.Key;
+
+public class IndexCommandsModule extends CommandModule {
+
+  private final Injector injector;
+
+  public IndexCommandsModule(Injector injector) {
+    this.injector = injector;
+  }
+
+  @Override
+  protected void configure() {
+    CommandName gerrit = Commands.named("gerrit");
+    CommandName index = Commands.named(gerrit, "index");
+    command(index).toProvider(new DispatchCommandProvider(index));
+    if (injector.getExistingBinding(Key.get(VersionManager.class)) != null) {
+      command(index, IndexActivateCommand.class);
+      command(index, IndexStartCommand.class);
+    }
+    command(index, IndexChangesCommand.class);
+    command(index, IndexChangesInProjectCommand.class);
+  }
+}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/IndexStartCommand.java b/java/com/google/gerrit/sshd/commands/IndexStartCommand.java
similarity index 100%
rename from gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/IndexStartCommand.java
rename to java/com/google/gerrit/sshd/commands/IndexStartCommand.java
diff --git a/java/com/google/gerrit/sshd/commands/KillCommand.java b/java/com/google/gerrit/sshd/commands/KillCommand.java
new file mode 100644
index 0000000..df74f86
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/KillCommand.java
@@ -0,0 +1,63 @@
+// Copyright (C) 2009 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.google.gerrit.sshd.commands;
+
+import static com.google.gerrit.common.data.GlobalCapability.KILL_TASK;
+import static com.google.gerrit.common.data.GlobalCapability.MAINTAIN_SERVER;
+
+import com.google.gerrit.extensions.annotations.RequiresAnyCapability;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.server.config.ConfigResource;
+import com.google.gerrit.server.config.TaskResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.restapi.config.DeleteTask;
+import com.google.gerrit.server.restapi.config.TasksCollection;
+import com.google.gerrit.sshd.AdminHighPriorityCommand;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.inject.Inject;
+import java.util.ArrayList;
+import java.util.List;
+import org.kohsuke.args4j.Argument;
+
+/** Kill a task in the work queue. */
+@AdminHighPriorityCommand
+@RequiresAnyCapability({KILL_TASK, MAINTAIN_SERVER})
+final class KillCommand extends SshCommand {
+  @Inject private TasksCollection tasksCollection;
+
+  @Inject private DeleteTask deleteTask;
+
+  @Argument(index = 0, multiValued = true, required = true, metaVar = "ID")
+  private List<String> taskIds = new ArrayList<>();
+
+  @Override
+  protected void run() {
+    ConfigResource cfgRsrc = new ConfigResource();
+    for (String id : taskIds) {
+      try {
+        TaskResource taskRsrc = tasksCollection.parse(cfgRsrc, IdString.fromDecoded(id));
+        deleteTask.apply(taskRsrc, null);
+      } catch (AuthException
+          | ResourceNotFoundException
+          | ResourceConflictException
+          | PermissionBackendException e) {
+        stderr.print("kill: " + id + ": No such task\n");
+      }
+    }
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/ListGroupsCommand.java b/java/com/google/gerrit/sshd/commands/ListGroupsCommand.java
new file mode 100644
index 0000000..f3ba308
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/ListGroupsCommand.java
@@ -0,0 +1,79 @@
+// Copyright (C) 2011 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.google.gerrit.sshd.commands;
+
+import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.extensions.restapi.Url;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.account.GroupCache;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.ioutil.ColumnFormatter;
+import com.google.gerrit.server.restapi.group.ListGroups;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.gerrit.util.cli.Options;
+import com.google.inject.Inject;
+import java.util.Optional;
+import org.kohsuke.args4j.Option;
+
+@CommandMetaData(
+    name = "ls-groups",
+    description = "List groups visible to the caller",
+    runsAt = MASTER_OR_SLAVE)
+public class ListGroupsCommand extends SshCommand {
+  @Inject private GroupCache groupCache;
+
+  @Inject @Options public ListGroups listGroups;
+
+  @Option(
+      name = "--verbose",
+      aliases = {"-v"},
+      usage =
+          "verbose output format with tab-separated columns for the "
+              + "group name, UUID, description, owner group name, "
+              + "owner group UUID, and whether the group is visible to all")
+  private boolean verboseOutput;
+
+  @Override
+  public void run() throws Exception {
+    if (listGroups.getUser() != null && !listGroups.getProjects().isEmpty()) {
+      throw die("--user and --project options are not compatible.");
+    }
+
+    ColumnFormatter formatter = new ColumnFormatter(stdout, '\t');
+    for (GroupInfo info : listGroups.get()) {
+      formatter.addColumn(MoreObjects.firstNonNull(info.name, "n/a"));
+      if (verboseOutput) {
+        Optional<InternalGroup> group =
+            info.ownerId != null
+                ? groupCache.get(new AccountGroup.UUID(Url.decode(info.ownerId)))
+                : Optional.empty();
+
+        formatter.addColumn(Url.decode(info.id));
+        formatter.addColumn(Strings.nullToEmpty(info.description));
+        formatter.addColumn(group.map(InternalGroup::getName).orElse("n/a"));
+        formatter.addColumn(group.map(g -> g.getGroupUUID().get()).orElse(""));
+        formatter.addColumn(
+            Boolean.toString(MoreObjects.firstNonNull(info.options.visibleToAll, Boolean.FALSE)));
+      }
+      formatter.nextLine();
+    }
+    formatter.finish();
+  }
+}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListLoggingLevelCommand.java b/java/com/google/gerrit/sshd/commands/ListLoggingLevelCommand.java
similarity index 100%
rename from gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ListLoggingLevelCommand.java
rename to java/com/google/gerrit/sshd/commands/ListLoggingLevelCommand.java
diff --git a/java/com/google/gerrit/sshd/commands/ListMembersCommand.java b/java/com/google/gerrit/sshd/commands/ListMembersCommand.java
new file mode 100644
index 0000000..1565ecb
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/ListMembersCommand.java
@@ -0,0 +1,103 @@
+// Copyright (C) 2013 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.google.gerrit.sshd.commands;
+
+import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.account.AccountLoader;
+import com.google.gerrit.server.account.GroupCache;
+import com.google.gerrit.server.account.GroupControl;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.ioutil.ColumnFormatter;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.restapi.group.ListMembers;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.inject.Inject;
+import java.io.PrintWriter;
+import java.util.List;
+import java.util.Optional;
+import org.kohsuke.args4j.Argument;
+
+/** Implements a command that allows the user to see the members of a account. */
+@CommandMetaData(
+    name = "ls-members",
+    description = "List the members of a given group",
+    runsAt = MASTER_OR_SLAVE)
+public class ListMembersCommand extends SshCommand {
+  @Inject ListMembersCommandImpl impl;
+
+  @Override
+  public void run() throws Exception {
+    impl.display(stdout);
+  }
+
+  @Override
+  protected void parseCommandLine() throws UnloggedFailure {
+    parseCommandLine(impl);
+  }
+
+  private static class ListMembersCommandImpl extends ListMembers {
+    @Argument(required = true, usage = "the name of the group", metaVar = "GROUPNAME")
+    private String name;
+
+    private final GroupCache groupCache;
+
+    @Inject
+    protected ListMembersCommandImpl(
+        GroupCache groupCache,
+        GroupControl.Factory groupControlFactory,
+        AccountLoader.Factory accountLoaderFactory) {
+      super(groupCache, groupControlFactory, accountLoaderFactory);
+      this.groupCache = groupCache;
+    }
+
+    void display(PrintWriter writer) throws PermissionBackendException {
+      Optional<InternalGroup> group = groupCache.get(new AccountGroup.NameKey(name));
+      String errorText = "Group not found or not visible\n";
+
+      if (!group.isPresent()) {
+        writer.write(errorText);
+        writer.flush();
+        return;
+      }
+
+      List<AccountInfo> members = getDirectMembers(group.get());
+      ColumnFormatter formatter = new ColumnFormatter(writer, '\t');
+      formatter.addColumn("id");
+      formatter.addColumn("username");
+      formatter.addColumn("full name");
+      formatter.addColumn("email");
+      formatter.nextLine();
+      for (AccountInfo member : members) {
+        if (member == null) {
+          continue;
+        }
+
+        formatter.addColumn(Integer.toString(member._accountId));
+        formatter.addColumn(MoreObjects.firstNonNull(member.username, "n/a"));
+        formatter.addColumn(MoreObjects.firstNonNull(Strings.emptyToNull(member.name), "n/a"));
+        formatter.addColumn(MoreObjects.firstNonNull(member.email, "n/a"));
+        formatter.nextLine();
+      }
+
+      formatter.finish();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/ListProjectsCommand.java b/java/com/google/gerrit/sshd/commands/ListProjectsCommand.java
new file mode 100644
index 0000000..9f2ffa9
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/ListProjectsCommand.java
@@ -0,0 +1,46 @@
+// Copyright (C) 2009 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.google.gerrit.sshd.commands;
+
+import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;
+
+import com.google.gerrit.server.restapi.project.ListProjects;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.gerrit.util.cli.Options;
+import com.google.inject.Inject;
+import java.util.List;
+
+@CommandMetaData(
+    name = "ls-projects",
+    description = "List projects visible to the caller",
+    runsAt = MASTER_OR_SLAVE)
+public class ListProjectsCommand extends SshCommand {
+  @Inject @Options public ListProjects impl;
+
+  @Override
+  public void run() throws Exception {
+    if (!impl.getFormat().isJson()) {
+      List<String> showBranch = impl.getShowBranch();
+      if (impl.isShowTree() && (showBranch != null) && !showBranch.isEmpty()) {
+        throw die("--tree and --show-branch options are not compatible.");
+      }
+      if (impl.isShowTree() && impl.isShowDescription()) {
+        throw die("--tree and --description options are not compatible.");
+      }
+    }
+    impl.displayToStream(out);
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/LsUserRefs.java b/java/com/google/gerrit/sshd/commands/LsUserRefs.java
new file mode 100644
index 0000000..2c15e78
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/LsUserRefs.java
@@ -0,0 +1,113 @@
+// Copyright (C) 2012 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.google.gerrit.sshd.commands;
+
+import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;
+import static org.eclipse.jgit.lib.RefDatabase.ALL;
+
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.account.AccountResolver;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackend.RefFilterOptions;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.util.ManualRequestContext;
+import com.google.gerrit.server.util.OneOffRequestContext;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.util.Map;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.kohsuke.args4j.Option;
+
+@RequiresCapability(GlobalCapability.READ_AS)
+@CommandMetaData(
+    name = "ls-user-refs",
+    description = "List refs visible to a specific user",
+    runsAt = MASTER_OR_SLAVE)
+public class LsUserRefs extends SshCommand {
+  @Inject private AccountResolver accountResolver;
+  @Inject private OneOffRequestContext requestContext;
+  @Inject private PermissionBackend permissionBackend;
+  @Inject private GitRepositoryManager repoManager;
+
+  @Option(
+      name = "--project",
+      aliases = {"-p"},
+      metaVar = "PROJECT",
+      required = true,
+      usage = "project for which the refs should be listed")
+  private ProjectState projectState;
+
+  @Option(
+      name = "--user",
+      aliases = {"-u"},
+      metaVar = "USER",
+      required = true,
+      usage = "user for which the groups should be listed")
+  private String userName;
+
+  @Option(name = "--only-refs-heads", usage = "list only refs under refs/heads")
+  private boolean onlyRefsHeads;
+
+  @Override
+  protected void run() throws Failure {
+    Account userAccount;
+    try {
+      userAccount = accountResolver.find(userName);
+    } catch (OrmException | IOException | ConfigInvalidException e) {
+      throw die(e);
+    }
+    if (userAccount == null) {
+      stdout.print("No single user could be found when searching for: " + userName + '\n');
+      stdout.flush();
+      return;
+    }
+
+    Project.NameKey projectName = projectState.getNameKey();
+    try (Repository repo = repoManager.openRepository(projectName);
+        ManualRequestContext ctx = requestContext.openAs(userAccount.getId())) {
+      try {
+        Map<String, Ref> refsMap =
+            permissionBackend
+                .user(user)
+                .project(projectName)
+                .filter(repo.getRefDatabase().getRefs(ALL), repo, RefFilterOptions.defaults());
+
+        for (String ref : refsMap.keySet()) {
+          if (!onlyRefsHeads || ref.startsWith(RefNames.REFS_HEADS)) {
+            stdout.println(ref);
+          }
+        }
+      } catch (IOException | PermissionBackendException e) {
+        throw new Failure(1, "fatal: Error reading refs: '" + projectName, e);
+      }
+    } catch (RepositoryNotFoundException e) {
+      throw die("'" + projectName + "': not a git archive");
+    } catch (IOException | OrmException e) {
+      throw die("Error opening: '" + projectName);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/PatchSetParser.java b/java/com/google/gerrit/sshd/commands/PatchSetParser.java
new file mode 100644
index 0000000..8dee69ee
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/PatchSetParser.java
@@ -0,0 +1,161 @@
+// Copyright (C) 2014 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.google.gerrit.sshd.commands;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RevId;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.change.ChangeFinder;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.gerrit.sshd.BaseCommand.UnloggedFailure;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.ArrayList;
+import java.util.List;
+
+@Singleton
+public class PatchSetParser {
+  private final Provider<ReviewDb> db;
+  private final Provider<InternalChangeQuery> queryProvider;
+  private final ChangeNotes.Factory notesFactory;
+  private final PatchSetUtil psUtil;
+  private final ChangeFinder changeFinder;
+
+  @Inject
+  PatchSetParser(
+      Provider<ReviewDb> db,
+      Provider<InternalChangeQuery> queryProvider,
+      ChangeNotes.Factory notesFactory,
+      PatchSetUtil psUtil,
+      ChangeFinder changeFinder) {
+    this.db = db;
+    this.queryProvider = queryProvider;
+    this.notesFactory = notesFactory;
+    this.psUtil = psUtil;
+    this.changeFinder = changeFinder;
+  }
+
+  public PatchSet parsePatchSet(String token, ProjectState projectState, String branch)
+      throws UnloggedFailure, OrmException {
+    // By commit?
+    //
+    if (token.matches("^([0-9a-fA-F]{4," + RevId.LEN + "})$")) {
+      InternalChangeQuery query = queryProvider.get();
+      List<ChangeData> cds;
+      if (projectState != null) {
+        Project.NameKey p = projectState.getNameKey();
+        if (branch != null) {
+          cds = query.byBranchCommit(p.get(), branch, token);
+        } else {
+          cds = query.byProjectCommit(p, token);
+        }
+      } else {
+        cds = query.byCommit(token);
+      }
+      List<PatchSet> matches = new ArrayList<>(cds.size());
+      for (ChangeData cd : cds) {
+        Change c = cd.change();
+        if (!(inProject(c, projectState) && inBranch(c, branch))) {
+          continue;
+        }
+        for (PatchSet ps : cd.patchSets()) {
+          if (ps.getRevision().matches(token)) {
+            matches.add(ps);
+          }
+        }
+      }
+
+      switch (matches.size()) {
+        case 1:
+          return matches.iterator().next();
+        case 0:
+          throw error("\"" + token + "\" no such patch set");
+        default:
+          throw error("\"" + token + "\" matches multiple patch sets");
+      }
+    }
+
+    // By older style change,patchset?
+    //
+    if (token.matches("^[1-9][0-9]*,[1-9][0-9]*$")) {
+      PatchSet.Id patchSetId;
+      try {
+        patchSetId = PatchSet.Id.parse(token);
+      } catch (IllegalArgumentException e) {
+        throw error("\"" + token + "\" is not a valid patch set");
+      }
+      ChangeNotes notes = getNotes(projectState, patchSetId.getParentKey());
+      PatchSet patchSet = psUtil.get(db.get(), notes, patchSetId);
+      if (patchSet == null) {
+        throw error("\"" + token + "\" no such patch set");
+      }
+      if (projectState != null || branch != null) {
+        Change change = notes.getChange();
+        if (!inProject(change, projectState)) {
+          throw error("change " + change.getId() + " not in project " + projectState.getName());
+        }
+        if (!inBranch(change, branch)) {
+          throw error("change " + change.getId() + " not in branch " + branch);
+        }
+      }
+      return patchSet;
+    }
+
+    throw error("\"" + token + "\" is not a valid patch set");
+  }
+
+  private ChangeNotes getNotes(@Nullable ProjectState projectState, Change.Id changeId)
+      throws OrmException, UnloggedFailure {
+    if (projectState != null) {
+      return notesFactory.create(db.get(), projectState.getNameKey(), changeId);
+    }
+    try {
+      ChangeNotes notes = changeFinder.findOne(changeId);
+      return notesFactory.create(db.get(), notes.getProjectName(), changeId);
+    } catch (NoSuchChangeException e) {
+      throw error("\"" + changeId + "\" no such change");
+    }
+  }
+
+  private static boolean inProject(Change change, ProjectState projectState) {
+    if (projectState == null) {
+      // No --project option, so they want every project.
+      return true;
+    }
+    return projectState.getNameKey().equals(change.getProject());
+  }
+
+  private static boolean inBranch(Change change, String branch) {
+    if (branch == null) {
+      // No --branch option, so they want every branch.
+      return true;
+    }
+    return change.getDest().get().equals(branch);
+  }
+
+  public static UnloggedFailure error(String msg) {
+    return new UnloggedFailure(1, msg);
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/PluginAdminSshCommand.java b/java/com/google/gerrit/sshd/commands/PluginAdminSshCommand.java
new file mode 100644
index 0000000..7e32615
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/PluginAdminSshCommand.java
@@ -0,0 +1,36 @@
+// Copyright (C) 2017 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.google.gerrit.sshd.commands;
+
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.server.plugins.PluginLoader;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.inject.Inject;
+
+@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
+public abstract class PluginAdminSshCommand extends SshCommand {
+  @Inject protected PluginLoader loader;
+
+  abstract void doRun() throws UnloggedFailure;
+
+  @Override
+  protected final void run() throws UnloggedFailure {
+    if (!loader.isRemoteAdminEnabled()) {
+      throw die("remote plugin administration is disabled");
+    }
+    doRun();
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/PluginEnableCommand.java b/java/com/google/gerrit/sshd/commands/PluginEnableCommand.java
new file mode 100644
index 0000000..baaf715
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/PluginEnableCommand.java
@@ -0,0 +1,41 @@
+// Copyright (C) 2012 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.google.gerrit.sshd.commands;
+
+import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;
+
+import com.google.common.collect.Sets;
+import com.google.gerrit.server.plugins.PluginInstallException;
+import com.google.gerrit.sshd.CommandMetaData;
+import java.util.List;
+import org.kohsuke.args4j.Argument;
+
+@CommandMetaData(name = "enable", description = "Enable plugins", runsAt = MASTER_OR_SLAVE)
+final class PluginEnableCommand extends PluginAdminSshCommand {
+  @Argument(index = 0, metaVar = "NAME", required = true, usage = "plugin(s) to enable")
+  List<String> names;
+
+  @Override
+  protected void doRun() throws UnloggedFailure {
+    if (names != null && !names.isEmpty()) {
+      try {
+        loader.enablePlugins(Sets.newHashSet(names));
+      } catch (PluginInstallException e) {
+        e.printStackTrace(stderr);
+        throw die("plugin failed to enable");
+      }
+    }
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/PluginInstallCommand.java b/java/com/google/gerrit/sshd/commands/PluginInstallCommand.java
new file mode 100644
index 0000000..8b045ec
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/PluginInstallCommand.java
@@ -0,0 +1,100 @@
+// Copyright (C) 2012 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.google.gerrit.sshd.commands;
+
+import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.server.plugins.PluginInstallException;
+import com.google.gerrit.sshd.CommandMetaData;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.nio.file.Files;
+import org.kohsuke.args4j.Argument;
+import org.kohsuke.args4j.Option;
+
+@CommandMetaData(name = "install", description = "Install/Add a plugin", runsAt = MASTER_OR_SLAVE)
+final class PluginInstallCommand extends PluginAdminSshCommand {
+  @Option(
+      name = "--name",
+      aliases = {"-n"},
+      usage = "install under name")
+  private String name;
+
+  @Option(name = "-")
+  void useInput(@SuppressWarnings("unused") boolean on) {
+    source = "-";
+  }
+
+  @Argument(index = 0, metaVar = "-|URL", usage = "JAR to load")
+  private String source;
+
+  @SuppressWarnings("resource")
+  @Override
+  protected void doRun() throws UnloggedFailure {
+    if (Strings.isNullOrEmpty(source)) {
+      throw die("Argument \"-|URL\" is required");
+    }
+    if (Strings.isNullOrEmpty(name) && "-".equalsIgnoreCase(source)) {
+      throw die("--name required when source is stdin");
+    }
+
+    if (Strings.isNullOrEmpty(name)) {
+      int s = source.lastIndexOf('/');
+      if (0 <= s) {
+        name = source.substring(s + 1);
+      } else {
+        name = source;
+      }
+    }
+
+    InputStream data;
+    if ("-".equalsIgnoreCase(source)) {
+      data = in;
+    } else if (new File(source).isFile() && source.equals(new File(source).getAbsolutePath())) {
+      try {
+        data = Files.newInputStream(new File(source).toPath());
+      } catch (IOException e) {
+        throw die("cannot read " + source);
+      }
+    } else {
+      try {
+        data = new URL(source).openStream();
+      } catch (MalformedURLException e) {
+        throw die("invalid url " + source);
+      } catch (IOException e) {
+        throw die("cannot read " + source);
+      }
+    }
+    try {
+      loader.installPluginFromStream(name, data);
+    } catch (IOException e) {
+      throw die("cannot install plugin");
+    } catch (PluginInstallException e) {
+      e.printStackTrace(stderr);
+      String msg = String.format("Plugin failed to install. Cause: %s", e.getMessage());
+      throw die(msg);
+    } finally {
+      try {
+        data.close();
+      } catch (IOException err) {
+        // Ignored
+      }
+    }
+  }
+}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginLsCommand.java b/java/com/google/gerrit/sshd/commands/PluginLsCommand.java
similarity index 100%
rename from gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginLsCommand.java
rename to java/com/google/gerrit/sshd/commands/PluginLsCommand.java
diff --git a/java/com/google/gerrit/sshd/commands/PluginReloadCommand.java b/java/com/google/gerrit/sshd/commands/PluginReloadCommand.java
new file mode 100644
index 0000000..86a74d1
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/PluginReloadCommand.java
@@ -0,0 +1,42 @@
+// Copyright (C) 2012 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.google.gerrit.sshd.commands;
+
+import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;
+
+import com.google.gerrit.server.plugins.InvalidPluginException;
+import com.google.gerrit.server.plugins.PluginInstallException;
+import com.google.gerrit.sshd.CommandMetaData;
+import java.util.List;
+import org.kohsuke.args4j.Argument;
+
+@CommandMetaData(name = "reload", description = "Reload/Restart plugins", runsAt = MASTER_OR_SLAVE)
+final class PluginReloadCommand extends PluginAdminSshCommand {
+  @Argument(index = 0, metaVar = "NAME", usage = "plugins to reload/restart")
+  private List<String> names;
+
+  @Override
+  protected void doRun() throws UnloggedFailure {
+    if (names == null || names.isEmpty()) {
+      loader.rescan();
+    } else {
+      try {
+        loader.reload(names);
+      } catch (InvalidPluginException | PluginInstallException e) {
+        throw die(e.getMessage());
+      }
+    }
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/PluginRemoveCommand.java b/java/com/google/gerrit/sshd/commands/PluginRemoveCommand.java
new file mode 100644
index 0000000..0119349b
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/PluginRemoveCommand.java
@@ -0,0 +1,35 @@
+// Copyright (C) 2012 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.google.gerrit.sshd.commands;
+
+import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;
+
+import com.google.common.collect.Sets;
+import com.google.gerrit.sshd.CommandMetaData;
+import java.util.List;
+import org.kohsuke.args4j.Argument;
+
+@CommandMetaData(name = "remove", description = "Disable plugins", runsAt = MASTER_OR_SLAVE)
+final class PluginRemoveCommand extends PluginAdminSshCommand {
+  @Argument(index = 0, metaVar = "NAME", required = true, usage = "plugin to remove")
+  List<String> names;
+
+  @Override
+  protected void doRun() throws UnloggedFailure {
+    if (names != null && !names.isEmpty()) {
+      loader.disablePlugins(Sets.newHashSet(names));
+    }
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/Query.java b/java/com/google/gerrit/sshd/commands/Query.java
new file mode 100644
index 0000000..4d8351e
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/Query.java
@@ -0,0 +1,132 @@
+// Copyright (C) 2010 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.google.gerrit.sshd.commands;
+
+import com.google.gerrit.server.DynamicOptions;
+import com.google.gerrit.server.query.change.OutputStreamQuery;
+import com.google.gerrit.server.query.change.OutputStreamQuery.OutputFormat;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.inject.Inject;
+import java.util.List;
+import org.kohsuke.args4j.Argument;
+import org.kohsuke.args4j.Option;
+
+@CommandMetaData(name = "query", description = "Query the change database")
+public class Query extends SshCommand implements DynamicOptions.BeanReceiver {
+  @Inject private OutputStreamQuery processor;
+
+  @Option(name = "--format", metaVar = "FMT", usage = "Output display format")
+  void setFormat(OutputFormat format) {
+    processor.setOutput(out, format);
+  }
+
+  @Option(name = "--current-patch-set", usage = "Include information about current patch set")
+  void setCurrentPatchSet(boolean on) {
+    processor.setIncludeCurrentPatchSet(on);
+  }
+
+  @Option(name = "--patch-sets", usage = "Include information about all patch sets")
+  void setPatchSets(boolean on) {
+    processor.setIncludePatchSets(on);
+  }
+
+  @Option(
+      name = "--all-approvals",
+      usage = "Include information about all patch sets and approvals")
+  void setApprovals(boolean on) {
+    if (on) {
+      processor.setIncludePatchSets(on);
+    }
+    processor.setIncludeApprovals(on);
+  }
+
+  @Option(name = "--comments", usage = "Include patch set and inline comments")
+  void setComments(boolean on) {
+    processor.setIncludeComments(on);
+  }
+
+  @Option(name = "--files", usage = "Include file list on patch sets")
+  void setFiles(boolean on) {
+    processor.setIncludeFiles(on);
+  }
+
+  @Option(name = "--commit-message", usage = "Include the full commit message for a change")
+  void setCommitMessage(boolean on) {
+    processor.setIncludeCommitMessage(on);
+  }
+
+  @Option(name = "--dependencies", usage = "Include depends-on and needed-by information")
+  void setDependencies(boolean on) {
+    processor.setIncludeDependencies(on);
+  }
+
+  @Option(name = "--all-reviewers", usage = "Include all reviewers")
+  void setAllReviewers(boolean on) {
+    processor.setIncludeAllReviewers(on);
+  }
+
+  @Option(name = "--submit-records", usage = "Include submit and label status")
+  void setSubmitRecords(boolean on) {
+    processor.setIncludeSubmitRecords(on);
+  }
+
+  @Option(
+      name = "--start",
+      aliases = {"-S"},
+      usage = "Number of changes to skip")
+  void setStart(int start) {
+    processor.setStart(start);
+  }
+
+  @Argument(
+      index = 0,
+      required = true,
+      multiValued = true,
+      metaVar = "QUERY",
+      usage = "Query to execute")
+  private List<String> query;
+
+  @Override
+  protected void run() throws Exception {
+    processor.query(join(query, " "));
+  }
+
+  @Override
+  public void setDynamicBean(String plugin, DynamicOptions.DynamicBean dynamicBean) {
+    processor.setDynamicBean(plugin, dynamicBean);
+  }
+
+  @Override
+  protected void parseCommandLine() throws UnloggedFailure {
+    processor.setOutput(out, OutputFormat.TEXT);
+    super.parseCommandLine();
+    if (processor.getIncludeFiles()
+        && !(processor.getIncludePatchSets() || processor.getIncludeCurrentPatchSet())) {
+      throw die("--files option needs --patch-sets or --current-patch-set");
+    }
+  }
+
+  private static String join(List<String> list, String sep) {
+    StringBuilder r = new StringBuilder();
+    for (int i = 0; i < list.size(); i++) {
+      if (i > 0) {
+        r.append(sep);
+      }
+      r.append(list.get(i));
+    }
+    return r.toString();
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/QueryShell.java b/java/com/google/gerrit/sshd/commands/QueryShell.java
new file mode 100644
index 0000000..fe102ab
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/QueryShell.java
@@ -0,0 +1,781 @@
+// Copyright (C) 2009 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.google.gerrit.sshd.commands;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.gerrit.common.Version;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.reviewdb.server.ReviewDbUtil;
+import com.google.gerrit.server.schema.ReviewDbFactory;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.google.gwtorm.jdbc.JdbcSchema;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+/** Simple interactive SQL query tool. */
+public class QueryShell {
+  public interface Factory {
+    QueryShell create(@Assisted InputStream in, @Assisted OutputStream out);
+  }
+
+  public enum OutputFormat {
+    PRETTY,
+    JSON,
+    JSON_SINGLE
+  }
+
+  private final BufferedReader in;
+  private final PrintWriter out;
+  private final SchemaFactory<ReviewDb> dbFactory;
+  private OutputFormat outputFormat = OutputFormat.PRETTY;
+
+  private ReviewDb db;
+  private Connection connection;
+  private Statement statement;
+
+  @Inject
+  QueryShell(
+      @ReviewDbFactory final SchemaFactory<ReviewDb> dbFactory,
+      @Assisted final InputStream in,
+      @Assisted final OutputStream out) {
+    this.dbFactory = dbFactory;
+    this.in = new BufferedReader(new InputStreamReader(in, UTF_8));
+    this.out = new PrintWriter(new OutputStreamWriter(out, UTF_8));
+  }
+
+  public void setOutputFormat(OutputFormat fmt) {
+    outputFormat = fmt;
+  }
+
+  public void run() {
+    try {
+      db = ReviewDbUtil.unwrapDb(dbFactory.open());
+      try {
+        connection = ((JdbcSchema) db).getConnection();
+        connection.setAutoCommit(true);
+
+        statement = connection.createStatement();
+        try {
+          showBanner();
+          readEvalPrintLoop();
+        } finally {
+          statement.close();
+          statement = null;
+        }
+      } finally {
+        db.close();
+        db = null;
+      }
+    } catch (OrmException | SQLException err) {
+      out.println("fatal: Cannot open connection: " + err.getMessage());
+    } finally {
+      out.flush();
+    }
+  }
+
+  public void execute(String query) {
+    try {
+      db = dbFactory.open();
+      try {
+        connection = ((JdbcSchema) db).getConnection();
+        connection.setAutoCommit(true);
+
+        statement = connection.createStatement();
+        try {
+          executeStatement(query);
+        } finally {
+          statement.close();
+          statement = null;
+        }
+      } finally {
+        db.close();
+        db = null;
+      }
+    } catch (OrmException | SQLException err) {
+      out.println("fatal: Cannot open connection: " + err.getMessage());
+    } finally {
+      out.flush();
+    }
+  }
+
+  private void readEvalPrintLoop() {
+    final StringBuilder buffer = new StringBuilder();
+    boolean executed = false;
+    for (; ; ) {
+      if (outputFormat == OutputFormat.PRETTY) {
+        print(buffer.length() == 0 || executed ? "gerrit> " : "     -> ");
+      }
+      String line = readLine();
+      if (line == null) {
+        return;
+      }
+
+      if (line.startsWith("\\")) {
+        // Shell command, check the various cases we recognize
+        //
+        line = line.substring(1);
+        if (line.equals("h") || line.equals("?")) {
+          showHelp();
+
+        } else if (line.equals("q")) {
+          if (outputFormat == OutputFormat.PRETTY) {
+            println("Bye");
+          }
+          return;
+
+        } else if (line.equals("r")) {
+          buffer.setLength(0);
+          executed = false;
+
+        } else if (line.equals("p")) {
+          println(buffer.toString());
+
+        } else if (line.equals("g")) {
+          if (buffer.length() > 0) {
+            executeStatement(buffer.toString());
+            executed = true;
+          }
+
+        } else if (line.equals("d")) {
+          listTables();
+
+        } else if (line.startsWith("d ")) {
+          showTable(line.substring(2).trim());
+
+        } else {
+          final String msg = "'\\" + line + "' not supported";
+          switch (outputFormat) {
+            case JSON_SINGLE:
+            case JSON:
+              {
+                final JsonObject err = new JsonObject();
+                err.addProperty("type", "error");
+                err.addProperty("message", msg);
+                println(err.toString());
+                break;
+              }
+            case PRETTY:
+            default:
+              println("ERROR: " + msg);
+              println("");
+              showHelp();
+              break;
+          }
+        }
+        continue;
+      }
+
+      if (executed) {
+        buffer.setLength(0);
+        executed = false;
+      }
+      if (buffer.length() > 0) {
+        buffer.append('\n');
+      }
+      buffer.append(line);
+
+      if (buffer.length() > 0 && buffer.charAt(buffer.length() - 1) == ';') {
+        executeStatement(buffer.toString());
+        executed = true;
+      }
+    }
+  }
+
+  private void listTables() {
+    final DatabaseMetaData meta;
+    try {
+      meta = connection.getMetaData();
+    } catch (SQLException e) {
+      error(e);
+      return;
+    }
+
+    final String[] types = {"TABLE", "VIEW"};
+    try (ResultSet rs = meta.getTables(null, null, null, types)) {
+      if (outputFormat == OutputFormat.PRETTY) {
+        println("                     List of relations");
+      }
+      showResultSet(
+          rs,
+          false,
+          0,
+          Identity.create(rs, "TABLE_SCHEM"),
+          Identity.create(rs, "TABLE_NAME"),
+          Identity.create(rs, "TABLE_TYPE"));
+    } catch (SQLException e) {
+      error(e);
+    }
+
+    println("");
+  }
+
+  private void showTable(String tableName) {
+    final DatabaseMetaData meta;
+    try {
+      meta = connection.getMetaData();
+
+      if (meta.storesUpperCaseIdentifiers()) {
+        tableName = tableName.toUpperCase();
+      } else if (meta.storesLowerCaseIdentifiers()) {
+        tableName = tableName.toLowerCase();
+      }
+    } catch (SQLException e) {
+      error(e);
+      return;
+    }
+
+    try (ResultSet rs = meta.getColumns(null, null, tableName, null)) {
+      if (!rs.next()) {
+        throw new SQLException("Table " + tableName + " not found");
+      }
+
+      if (outputFormat == OutputFormat.PRETTY) {
+        println("                     Table " + tableName);
+      }
+      showResultSet(
+          rs,
+          true,
+          0,
+          Identity.create(rs, "COLUMN_NAME"),
+          new Function("TYPE") {
+            @Override
+            String apply(ResultSet rs) throws SQLException {
+              String type = rs.getString("TYPE_NAME");
+              switch (rs.getInt("DATA_TYPE")) {
+                case java.sql.Types.CHAR:
+                case java.sql.Types.VARCHAR:
+                  type += "(" + rs.getInt("COLUMN_SIZE") + ")";
+                  break;
+              }
+
+              String def = rs.getString("COLUMN_DEF");
+              if (def != null && !def.isEmpty()) {
+                type += " DEFAULT " + def;
+              }
+
+              int nullable = rs.getInt("NULLABLE");
+              if (nullable == DatabaseMetaData.columnNoNulls) {
+                type += " NOT NULL";
+              }
+              return type;
+            }
+          });
+    } catch (SQLException e) {
+      error(e);
+      return;
+    }
+
+    try (ResultSet rs = meta.getIndexInfo(null, null, tableName, false, true)) {
+      Map<String, IndexInfo> indexes = new TreeMap<>();
+      while (rs.next()) {
+        final String indexName = rs.getString("INDEX_NAME");
+        IndexInfo def = indexes.get(indexName);
+        if (def == null) {
+          def = new IndexInfo();
+          def.name = indexName;
+          indexes.put(indexName, def);
+        }
+
+        if (!rs.getBoolean("NON_UNIQUE")) {
+          def.unique = true;
+        }
+
+        final int pos = rs.getInt("ORDINAL_POSITION");
+        final String col = rs.getString("COLUMN_NAME");
+        String desc = rs.getString("ASC_OR_DESC");
+        if ("D".equals(desc)) {
+          desc = " DESC";
+        } else {
+          desc = "";
+        }
+        def.addColumn(pos, col + desc);
+
+        String filter = rs.getString("FILTER_CONDITION");
+        if (filter != null && !filter.isEmpty()) {
+          def.filter.append(filter);
+        }
+      }
+
+      if (outputFormat == OutputFormat.PRETTY) {
+        println("");
+        println("Indexes on " + tableName + ":");
+        for (IndexInfo def : indexes.values()) {
+          println("  " + def);
+        }
+      }
+    } catch (SQLException e) {
+      error(e);
+      return;
+    }
+
+    println("");
+  }
+
+  private void executeStatement(String sql) {
+    final long start = TimeUtil.nowMs();
+    final boolean hasResultSet;
+    try {
+      hasResultSet = statement.execute(sql);
+    } catch (SQLException e) {
+      error(e);
+      return;
+    }
+
+    try {
+      if (hasResultSet) {
+        try (ResultSet rs = statement.getResultSet()) {
+          showResultSet(rs, false, start);
+        }
+
+      } else {
+        final int updateCount = statement.getUpdateCount();
+        final long ms = TimeUtil.nowMs() - start;
+        switch (outputFormat) {
+          case JSON_SINGLE:
+          case JSON:
+            {
+              final JsonObject tail = new JsonObject();
+              tail.addProperty("type", "update-stats");
+              tail.addProperty("rowCount", updateCount);
+              tail.addProperty("runTimeMilliseconds", ms);
+              println(tail.toString());
+              break;
+            }
+
+          case PRETTY:
+          default:
+            println("UPDATE " + updateCount + "; " + ms + " ms");
+            break;
+        }
+      }
+    } catch (SQLException e) {
+      error(e);
+    }
+  }
+
+  /**
+   * Outputs a result set to stdout.
+   *
+   * @param rs ResultSet to show.
+   * @param alreadyOnRow true if rs is already on the first row. false otherwise.
+   * @param start Timestamp in milliseconds when executing the statement started. This timestamp is
+   *     used to compute statistics about the statement. If no statistics should be shown, set it to
+   *     0.
+   * @param show Functions to map columns
+   * @throws SQLException
+   */
+  private void showResultSet(ResultSet rs, boolean alreadyOnRow, long start, Function... show)
+      throws SQLException {
+    switch (outputFormat) {
+      case JSON_SINGLE:
+      case JSON:
+        showResultSetJson(rs, alreadyOnRow, start, show);
+        break;
+      case PRETTY:
+      default:
+        showResultSetPretty(rs, alreadyOnRow, start, show);
+        break;
+    }
+  }
+
+  /**
+   * Outputs a result set to stdout in Json format.
+   *
+   * @param rs ResultSet to show.
+   * @param alreadyOnRow true if rs is already on the first row. false otherwise.
+   * @param start Timestamp in milliseconds when executing the statement started. This timestamp is
+   *     used to compute statistics about the statement. If no statistics should be shown, set it to
+   *     0.
+   * @param show Functions to map columns
+   * @throws SQLException
+   */
+  private void showResultSetJson(
+      final ResultSet rs, boolean alreadyOnRow, long start, Function... show) throws SQLException {
+    JsonArray collector = new JsonArray();
+    final ResultSetMetaData meta = rs.getMetaData();
+    final Function[] columnMap;
+    if (show != null && 0 < show.length) {
+      columnMap = show;
+
+    } else {
+      final int colCnt = meta.getColumnCount();
+      columnMap = new Function[colCnt];
+      for (int colId = 0; colId < colCnt; colId++) {
+        final int p = colId + 1;
+        final String name = meta.getColumnLabel(p);
+        columnMap[colId] = new Identity(p, name);
+      }
+    }
+
+    int rowCnt = 0;
+    while (alreadyOnRow || rs.next()) {
+      final JsonObject row = new JsonObject();
+      final JsonObject cols = new JsonObject();
+      for (Function function : columnMap) {
+        String v = function.apply(rs);
+        if (v == null) {
+          continue;
+        }
+        cols.addProperty(function.name.toLowerCase(), v);
+      }
+      row.addProperty("type", "row");
+      row.add("columns", cols);
+      switch (outputFormat) {
+        case JSON:
+          println(row.toString());
+          break;
+        case JSON_SINGLE:
+          collector.add(row);
+          break;
+        case PRETTY:
+        default:
+          final JsonObject obj = new JsonObject();
+          obj.addProperty("type", "error");
+          obj.addProperty("message", "Unsupported Json variant");
+          println(obj.toString());
+          return;
+      }
+      alreadyOnRow = false;
+      rowCnt++;
+    }
+
+    JsonObject tail = null;
+    if (start != 0) {
+      tail = new JsonObject();
+      tail.addProperty("type", "query-stats");
+      tail.addProperty("rowCount", rowCnt);
+      final long ms = TimeUtil.nowMs() - start;
+      tail.addProperty("runTimeMilliseconds", ms);
+    }
+
+    switch (outputFormat) {
+      case JSON:
+        if (tail != null) {
+          println(tail.toString());
+        }
+        break;
+      case JSON_SINGLE:
+        if (tail != null) {
+          collector.add(tail);
+        }
+        println(collector.toString());
+        break;
+      case PRETTY:
+      default:
+        final JsonObject obj = new JsonObject();
+        obj.addProperty("type", "error");
+        obj.addProperty("message", "Unsupported Json variant");
+        println(obj.toString());
+    }
+  }
+
+  /**
+   * Outputs a result set to stdout in plain text format.
+   *
+   * @param rs ResultSet to show.
+   * @param alreadyOnRow true if rs is already on the first row. false otherwise.
+   * @param start Timestamp in milliseconds when executing the statement started. This timestamp is
+   *     used to compute statistics about the statement. If no statistics should be shown, set it to
+   *     0.
+   * @param show Functions to map columns
+   * @throws SQLException
+   */
+  private void showResultSetPretty(
+      final ResultSet rs, boolean alreadyOnRow, long start, Function... show) throws SQLException {
+    final ResultSetMetaData meta = rs.getMetaData();
+
+    final Function[] columnMap;
+    if (show != null && 0 < show.length) {
+      columnMap = show;
+
+    } else {
+      final int colCnt = meta.getColumnCount();
+      columnMap = new Function[colCnt];
+      for (int colId = 0; colId < colCnt; colId++) {
+        final int p = colId + 1;
+        final String name = meta.getColumnLabel(p);
+        columnMap[colId] = new Identity(p, name);
+      }
+    }
+
+    final int colCnt = columnMap.length;
+    final int[] widths = new int[colCnt];
+    for (int c = 0; c < colCnt; c++) {
+      widths[c] = columnMap[c].name.length();
+    }
+
+    final List<String[]> rows = new ArrayList<>();
+    while (alreadyOnRow || rs.next()) {
+      final String[] row = new String[columnMap.length];
+      for (int c = 0; c < colCnt; c++) {
+        row[c] = columnMap[c].apply(rs);
+        if (row[c] == null) {
+          row[c] = "NULL";
+        }
+        widths[c] = Math.max(widths[c], row[c].length());
+      }
+      rows.add(row);
+      alreadyOnRow = false;
+    }
+
+    final StringBuilder b = new StringBuilder();
+    for (int c = 0; c < colCnt; c++) {
+      if (0 < c) {
+        b.append(" | ");
+      }
+
+      String n = columnMap[c].name;
+      if (widths[c] < n.length()) {
+        n = n.substring(0, widths[c]);
+      }
+      b.append(n);
+
+      if (c < colCnt - 1) {
+        for (int pad = n.length(); pad < widths[c]; pad++) {
+          b.append(' ');
+        }
+      }
+    }
+    println(" " + b.toString());
+
+    b.setLength(0);
+    for (int c = 0; c < colCnt; c++) {
+      if (0 < c) {
+        b.append("-+-");
+      }
+      for (int pad = 0; pad < widths[c]; pad++) {
+        b.append('-');
+      }
+    }
+    println(" " + b.toString());
+
+    boolean dataTruncated = false;
+    for (String[] row : rows) {
+      b.setLength(0);
+      b.append(' ');
+
+      for (int c = 0; c < colCnt; c++) {
+        final int max = widths[c];
+        if (0 < c) {
+          b.append(" | ");
+        }
+
+        String s = row[c];
+        if (1 < colCnt && max < s.length()) {
+          s = s.substring(0, max);
+          dataTruncated = true;
+        }
+        b.append(s);
+
+        if (c < colCnt - 1) {
+          for (int pad = s.length(); pad < max; pad++) {
+            b.append(' ');
+          }
+        }
+      }
+      println(b.toString());
+    }
+
+    if (dataTruncated) {
+      warning("some column data was truncated");
+    }
+
+    if (start != 0) {
+      final int rowCount = rows.size();
+      final long ms = TimeUtil.nowMs() - start;
+      println("(" + rowCount + (rowCount == 1 ? " row" : " rows") + "; " + ms + " ms)");
+    }
+  }
+
+  private void warning(String msg) {
+    switch (outputFormat) {
+      case JSON_SINGLE:
+      case JSON:
+        {
+          final JsonObject obj = new JsonObject();
+          obj.addProperty("type", "warning");
+          obj.addProperty("message", msg);
+          println(obj.toString());
+          break;
+        }
+
+      case PRETTY:
+      default:
+        println("WARNING: " + msg);
+        break;
+    }
+  }
+
+  private void error(SQLException err) {
+    switch (outputFormat) {
+      case JSON_SINGLE:
+      case JSON:
+        {
+          final JsonObject obj = new JsonObject();
+          obj.addProperty("type", "error");
+          obj.addProperty("message", err.getMessage());
+          println(obj.toString());
+          break;
+        }
+
+      case PRETTY:
+      default:
+        println("ERROR: " + err.getMessage());
+        break;
+    }
+  }
+
+  private void print(String s) {
+    out.print(s);
+    out.flush();
+  }
+
+  private void println(String s) {
+    out.print(s);
+    out.print('\n');
+    out.flush();
+  }
+
+  private String readLine() {
+    try {
+      return in.readLine();
+    } catch (IOException e) {
+      return null;
+    }
+  }
+
+  private void showBanner() {
+    if (outputFormat == OutputFormat.PRETTY) {
+      println("Welcome to Gerrit Code Review " + Version.getVersion());
+      try {
+        print("(");
+        print(connection.getMetaData().getDatabaseProductName());
+        print(" ");
+        print(connection.getMetaData().getDatabaseProductVersion());
+        println(")");
+      } catch (SQLException err) {
+        error(err);
+      }
+      println("");
+      println("Type '\\h' for help.  Type '\\r' to clear the buffer.");
+      println("");
+    }
+  }
+
+  private void showHelp() {
+    final StringBuilder help = new StringBuilder();
+    help.append("General\n");
+    help.append("  \\q        quit\n");
+
+    help.append("\n");
+    help.append("Query Buffer\n");
+    help.append("  \\g        execute the query buffer\n");
+    help.append("  \\p        display the current buffer\n");
+    help.append("  \\r        clear the query buffer\n");
+
+    help.append("\n");
+    help.append("Informational\n");
+    help.append("  \\d        list all tables\n");
+    help.append("  \\d NAME   describe table\n");
+
+    help.append("\n");
+    print(help.toString());
+  }
+
+  private abstract static class Function {
+    final String name;
+
+    Function(String name) {
+      this.name = name;
+    }
+
+    abstract String apply(ResultSet rs) throws SQLException;
+  }
+
+  private static class Identity extends Function {
+    static Identity create(ResultSet rs, String name) throws SQLException {
+      return new Identity(rs.findColumn(name), name);
+    }
+
+    final int colId;
+
+    Identity(int colId, String name) {
+      super(name);
+      this.colId = colId;
+    }
+
+    @Override
+    String apply(ResultSet rs) throws SQLException {
+      return rs.getString(colId);
+    }
+  }
+
+  private static class IndexInfo {
+    String name;
+    boolean unique;
+    final Map<Integer, String> columns = new TreeMap<>();
+    final StringBuilder filter = new StringBuilder();
+
+    void addColumn(int pos, String column) {
+      columns.put(Integer.valueOf(pos), column);
+    }
+
+    @Override
+    public String toString() {
+      final StringBuilder r = new StringBuilder();
+      r.append(name);
+      if (unique) {
+        r.append(" UNIQUE");
+      }
+      r.append(" (");
+      boolean first = true;
+      for (String c : columns.values()) {
+        if (!first) {
+          r.append(", ");
+        }
+        r.append(c);
+        first = false;
+      }
+      r.append(")");
+      if (filter.length() > 0) {
+        r.append(" WHERE ");
+        r.append(filter);
+      }
+      return r.toString();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/Receive.java b/java/com/google/gerrit/sshd/commands/Receive.java
new file mode 100644
index 0000000..fa0e37b
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/Receive.java
@@ -0,0 +1,172 @@
+// Copyright (C) 2008 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.google.gerrit.sshd.commands;
+
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.collect.SetMultimap;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.Capable;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.git.DefaultAdvertiseRefsHook;
+import com.google.gerrit.server.git.receive.AsyncReceiveCommits;
+import com.google.gerrit.server.notedb.ReviewerStateInternal;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.sshd.AbstractGitCommand;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.gerrit.sshd.SshSession;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.jgit.errors.TooLargeObjectInPackException;
+import org.eclipse.jgit.errors.UnpackException;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.transport.AdvertiseRefsHook;
+import org.eclipse.jgit.transport.ReceivePack;
+import org.kohsuke.args4j.Option;
+
+/** Receives change upload over SSH using the Git receive-pack protocol. */
+@CommandMetaData(
+    name = "receive-pack",
+    description = "Standard Git server side command for client side git push")
+final class Receive extends AbstractGitCommand {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  @Inject private AsyncReceiveCommits.Factory factory;
+  @Inject private IdentifiedUser currentUser;
+  @Inject private SshSession session;
+  @Inject private PermissionBackend permissionBackend;
+
+  private final SetMultimap<ReviewerStateInternal, Account.Id> reviewers =
+      MultimapBuilder.hashKeys(2).hashSetValues().build();
+
+  @Option(
+      name = "--reviewer",
+      aliases = {"--re"},
+      metaVar = "EMAIL",
+      usage = "request reviewer for change(s)")
+  void addReviewer(Account.Id id) {
+    reviewers.put(ReviewerStateInternal.REVIEWER, id);
+  }
+
+  @Option(
+      name = "--cc",
+      aliases = {},
+      metaVar = "EMAIL",
+      usage = "CC user on change(s)")
+  void addCC(Account.Id id) {
+    reviewers.put(ReviewerStateInternal.CC, id);
+  }
+
+  @Override
+  protected void runImpl() throws IOException, Failure {
+    try {
+      permissionBackend
+          .user(currentUser)
+          .project(project.getNameKey())
+          .check(ProjectPermission.RUN_RECEIVE_PACK);
+    } catch (AuthException e) {
+      throw new Failure(1, "fatal: receive-pack not permitted on this server");
+    } catch (PermissionBackendException e) {
+      throw new Failure(1, "fatal: unable to check permissions " + e);
+    }
+
+    AsyncReceiveCommits arc = factory.create(projectState, currentUser, repo, null);
+
+    try {
+      Capable r = arc.canUpload();
+      if (r != Capable.OK) {
+        throw die(r.getMessage());
+      }
+    } catch (PermissionBackendException e) {
+      throw die(e.getMessage());
+    }
+
+    ReceivePack rp = arc.getReceivePack();
+    try {
+      rp.receive(in, out, err);
+      session.setPeerAgent(rp.getPeerUserAgent());
+    } catch (UnpackException badStream) {
+      // In case this was caused by the user pushing an object whose size
+      // is larger than the receive.maxObjectSizeLimit gerrit.config parameter
+      // we want to present this error to the user
+      if (badStream.getCause() instanceof TooLargeObjectInPackException) {
+        StringBuilder msg = new StringBuilder();
+        msg.append("Receive error on project \"").append(projectState.getName()).append("\"");
+        msg.append(" (user ");
+        msg.append(currentUser.getUserName().orElse(null));
+        msg.append(" account ");
+        msg.append(currentUser.getAccountId());
+        msg.append("): ");
+        msg.append(badStream.getCause().getMessage());
+        logger.atInfo().log(msg.toString());
+        throw new UnloggedFailure(128, "error: " + badStream.getCause().getMessage());
+      }
+
+      // This may have been triggered by branch level access controls.
+      // Log what the heck is going on, as detailed as we can.
+      //
+      StringBuilder msg = new StringBuilder();
+      msg.append("Unpack error on project \"").append(projectState.getName()).append("\":\n");
+
+      msg.append("  AdvertiseRefsHook: ").append(rp.getAdvertiseRefsHook());
+      if (rp.getAdvertiseRefsHook() == AdvertiseRefsHook.DEFAULT) {
+        msg.append("DEFAULT");
+      } else if (rp.getAdvertiseRefsHook() instanceof DefaultAdvertiseRefsHook) {
+        msg.append("DefaultAdvertiseRefsHook");
+      } else {
+        msg.append(rp.getAdvertiseRefsHook().getClass());
+      }
+      msg.append("\n");
+
+      if (rp.getAdvertiseRefsHook() instanceof DefaultAdvertiseRefsHook) {
+        Map<String, Ref> adv = rp.getAdvertisedRefs();
+        msg.append("  Visible references (").append(adv.size()).append("):\n");
+        for (Ref ref : adv.values()) {
+          msg.append("  - ")
+              .append(ref.getObjectId().abbreviate(8).name())
+              .append(" ")
+              .append(ref.getName())
+              .append("\n");
+        }
+
+        List<Ref> allRefs = rp.getRepository().getRefDatabase().getRefs();
+        List<Ref> hidden = new ArrayList<>();
+        for (Ref ref : allRefs) {
+          if (!adv.containsKey(ref.getName())) {
+            hidden.add(ref);
+          }
+        }
+
+        msg.append("  Hidden references (").append(hidden.size()).append("):\n");
+        for (Ref ref : hidden) {
+          msg.append("  - ")
+              .append(ref.getObjectId().abbreviate(8).name())
+              .append(" ")
+              .append(ref.getName())
+              .append("\n");
+        }
+      }
+
+      IOException detail = new IOException(msg.toString(), badStream);
+      throw new Failure(128, "fatal: Unpack error, check server log", detail);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/ReceiveSlaveMode.java b/java/com/google/gerrit/sshd/commands/ReceiveSlaveMode.java
new file mode 100644
index 0000000..de91b17
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/ReceiveSlaveMode.java
@@ -0,0 +1,35 @@
+// 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.
+
+package com.google.gerrit.sshd.commands;
+
+import com.google.gerrit.sshd.AbstractGitCommand;
+import java.io.IOException;
+import org.eclipse.jgit.transport.PacketLineOut;
+import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
+
+/* Receive command when running in slave mode. */
+public class ReceiveSlaveMode extends AbstractGitCommand {
+  @Override
+  protected void runImpl() throws UnloggedFailure, IOException {
+    ServiceNotEnabledException ex = new ServiceNotEnabledException();
+
+    PacketLineOut packetOut = new PacketLineOut(out);
+    packetOut.setFlushOnEnd(true);
+    packetOut.writeString("ERR " + ex.getMessage());
+    packetOut.end();
+
+    throw die(ex);
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/ReloadConfig.java b/java/com/google/gerrit/sshd/commands/ReloadConfig.java
new file mode 100644
index 0000000..cbe3c57
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/ReloadConfig.java
@@ -0,0 +1,53 @@
+// 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.
+
+package com.google.gerrit.sshd.commands;
+
+import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;
+
+import com.google.common.collect.Multimap;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.server.config.ConfigUpdatedEvent.ConfigUpdateEntry;
+import com.google.gerrit.server.config.ConfigUpdatedEvent.UpdateResult;
+import com.google.gerrit.server.config.GerritServerConfigReloader;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.inject.Inject;
+
+/** Issues a reload of gerrit.config. */
+@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
+@CommandMetaData(
+    name = "reload-config",
+    description = "Reloads the Gerrit configuration",
+    runsAt = MASTER_OR_SLAVE)
+public class ReloadConfig extends SshCommand {
+
+  @Inject private GerritServerConfigReloader gerritServerConfigReloader;
+
+  @Override
+  protected void run() throws Failure {
+    Multimap<UpdateResult, ConfigUpdateEntry> updates = gerritServerConfigReloader.reloadConfig();
+    if (updates.isEmpty()) {
+      stdout.println("No config entries updated!");
+      return;
+    }
+
+    // Print out UpdateResult.{ACCEPTED|REJECTED} entries grouped by their type
+    for (UpdateResult result : updates.keySet()) {
+      stdout.println(result.toString() + " configuration changes:");
+      updates.get(result).forEach(cfgEntry -> stdout.println(cfgEntry.toString()));
+    }
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/RenameGroupCommand.java b/java/com/google/gerrit/sshd/commands/RenameGroupCommand.java
new file mode 100644
index 0000000..166ad68
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/RenameGroupCommand.java
@@ -0,0 +1,58 @@
+// Copyright (C) 2011 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.google.gerrit.sshd.commands;
+
+import com.google.gerrit.extensions.common.NameInput;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.server.group.GroupResource;
+import com.google.gerrit.server.restapi.group.GroupsCollection;
+import com.google.gerrit.server.restapi.group.PutName;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.inject.Inject;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.kohsuke.args4j.Argument;
+
+@CommandMetaData(name = "rename-group", description = "Rename an account group")
+public class RenameGroupCommand extends SshCommand {
+  @Argument(
+      index = 0,
+      required = true,
+      metaVar = "GROUP",
+      usage = "name of the group to be renamed")
+  private String groupName;
+
+  @Argument(index = 1, required = true, metaVar = "NEWNAME", usage = "new name of the group")
+  private String newGroupName;
+
+  @Inject private GroupsCollection groups;
+
+  @Inject private PutName putName;
+
+  @Override
+  protected void run() throws Failure {
+    try {
+      GroupResource rsrc = groups.parse(TopLevelResource.INSTANCE, IdString.fromDecoded(groupName));
+      NameInput input = new NameInput();
+      input.name = newGroupName;
+      putName.apply(rsrc, input);
+    } catch (RestApiException | IOException | ConfigInvalidException e) {
+      throw die(e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/ReviewCommand.java b/java/com/google/gerrit/sshd/commands/ReviewCommand.java
new file mode 100644
index 0000000..bc8ef2a
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/ReviewCommand.java
@@ -0,0 +1,341 @@
+// Copyright (C) 2009 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.google.gerrit.sshd.commands;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.io.CharStreams;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.LabelValue;
+import com.google.gerrit.extensions.api.GerritApi;
+import com.google.gerrit.extensions.api.changes.AbandonInput;
+import com.google.gerrit.extensions.api.changes.ChangeApi;
+import com.google.gerrit.extensions.api.changes.MoveInput;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.api.changes.RestoreInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.changes.RevisionApi;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.OutputFormat;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.util.LabelVote;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.gerrit.util.cli.CmdLineParser;
+import com.google.gson.JsonSyntaxException;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+import org.kohsuke.args4j.Argument;
+import org.kohsuke.args4j.Option;
+
+@CommandMetaData(name = "review", description = "Apply reviews to one or more patch sets")
+public class ReviewCommand extends SshCommand {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  @Override
+  protected final CmdLineParser newCmdLineParser(Object options) {
+    final CmdLineParser parser = super.newCmdLineParser(options);
+    for (ApproveOption c : optionList) {
+      parser.addOption(c, c);
+    }
+    return parser;
+  }
+
+  private final Set<PatchSet> patchSets = new HashSet<>();
+
+  @Argument(
+      index = 0,
+      required = true,
+      multiValued = true,
+      metaVar = "{COMMIT | CHANGE,PATCHSET}",
+      usage = "list of commits or patch sets to review")
+  void addPatchSetId(String token) {
+    try {
+      PatchSet ps = psParser.parsePatchSet(token, projectState, branch);
+      patchSets.add(ps);
+    } catch (UnloggedFailure e) {
+      throw new IllegalArgumentException(e.getMessage(), e);
+    } catch (OrmException e) {
+      throw new IllegalArgumentException("database error", e);
+    }
+  }
+
+  @Option(
+      name = "--project",
+      aliases = "-p",
+      usage = "project containing the specified patch set(s)")
+  private ProjectState projectState;
+
+  @Option(name = "--branch", aliases = "-b", usage = "branch containing the specified patch set(s)")
+  private String branch;
+
+  @Option(
+      name = "--message",
+      aliases = "-m",
+      usage = "cover message to publish on change(s)",
+      metaVar = "MESSAGE")
+  private String changeComment;
+
+  @Option(
+      name = "--notify",
+      aliases = "-n",
+      usage = "Who to send email notifications to after the review is stored.",
+      metaVar = "NOTIFYHANDLING")
+  private NotifyHandling notify;
+
+  @Option(name = "--abandon", usage = "abandon the specified change(s)")
+  private boolean abandonChange;
+
+  @Option(name = "--restore", usage = "restore the specified abandoned change(s)")
+  private boolean restoreChange;
+
+  @Option(name = "--rebase", usage = "rebase the specified change(s)")
+  private boolean rebaseChange;
+
+  @Option(name = "--move", usage = "move the specified change(s)", metaVar = "BRANCH")
+  private String moveToBranch;
+
+  @Option(name = "--submit", aliases = "-s", usage = "submit the specified patch set(s)")
+  private boolean submitChange;
+
+  @Option(name = "--json", aliases = "-j", usage = "read review input json from stdin")
+  private boolean json;
+
+  @Option(
+      name = "--tag",
+      aliases = "-t",
+      usage = "applies a tag to the given review",
+      metaVar = "TAG")
+  private String changeTag;
+
+  @Option(
+      name = "--label",
+      aliases = "-l",
+      usage = "custom label(s) to assign",
+      metaVar = "LABEL=VALUE")
+  void addLabel(String token) {
+    LabelVote v = LabelVote.parseWithEquals(token);
+    LabelType.checkName(v.label()); // Disallow SUBM.
+    customLabels.put(v.label(), v.value());
+  }
+
+  @Inject private ProjectCache projectCache;
+
+  @Inject private AllProjectsName allProjects;
+
+  @Inject private GerritApi gApi;
+
+  @Inject private PatchSetParser psParser;
+
+  private List<ApproveOption> optionList;
+  private Map<String, Short> customLabels;
+
+  @Override
+  protected void run() throws UnloggedFailure {
+    if (abandonChange) {
+      if (restoreChange) {
+        throw die("abandon and restore actions are mutually exclusive");
+      }
+      if (submitChange) {
+        throw die("abandon and submit actions are mutually exclusive");
+      }
+      if (rebaseChange) {
+        throw die("abandon and rebase actions are mutually exclusive");
+      }
+      if (moveToBranch != null) {
+        throw die("abandon and move actions are mutually exclusive");
+      }
+    }
+    if (json) {
+      if (restoreChange) {
+        throw die("json and restore actions are mutually exclusive");
+      }
+      if (submitChange) {
+        throw die("json and submit actions are mutually exclusive");
+      }
+      if (abandonChange) {
+        throw die("json and abandon actions are mutually exclusive");
+      }
+      if (changeComment != null) {
+        throw die("json and message are mutually exclusive");
+      }
+      if (rebaseChange) {
+        throw die("json and rebase actions are mutually exclusive");
+      }
+      if (moveToBranch != null) {
+        throw die("json and move actions are mutually exclusive");
+      }
+      if (changeTag != null) {
+        throw die("json and tag actions are mutually exclusive");
+      }
+    }
+    if (rebaseChange) {
+      if (submitChange) {
+        throw die("rebase and submit actions are mutually exclusive");
+      }
+    }
+
+    boolean ok = true;
+    ReviewInput input = null;
+    if (json) {
+      input = reviewFromJson();
+    }
+
+    for (PatchSet patchSet : patchSets) {
+      try {
+        if (input != null) {
+          applyReview(patchSet, input);
+        } else {
+          reviewPatchSet(patchSet);
+        }
+      } catch (RestApiException | UnloggedFailure e) {
+        ok = false;
+        writeError("error", e.getMessage() + "\n");
+      } catch (NoSuchChangeException e) {
+        ok = false;
+        writeError("error", "no such change " + patchSet.getId().getParentKey().get());
+      } catch (Exception e) {
+        ok = false;
+        writeError("fatal", "internal server error while reviewing " + patchSet.getId() + "\n");
+        logger.atSevere().withCause(e).log("internal error while reviewing %s", patchSet.getId());
+      }
+    }
+
+    if (!ok) {
+      throw die("one or more reviews failed; review output above");
+    }
+  }
+
+  private void applyReview(PatchSet patchSet, ReviewInput review) throws RestApiException {
+    gApi.changes()
+        .id(patchSet.getId().getParentKey().get())
+        .revision(patchSet.getRevision().get())
+        .review(review);
+  }
+
+  private ReviewInput reviewFromJson() throws UnloggedFailure {
+    try (InputStreamReader r = new InputStreamReader(in, UTF_8)) {
+      return OutputFormat.JSON.newGson().fromJson(CharStreams.toString(r), ReviewInput.class);
+    } catch (IOException | JsonSyntaxException e) {
+      writeError("error", e.getMessage() + '\n');
+      throw die("internal error while reading review input");
+    }
+  }
+
+  private void reviewPatchSet(PatchSet patchSet) throws Exception {
+
+    ReviewInput review = new ReviewInput();
+    review.message = Strings.emptyToNull(changeComment);
+    review.tag = Strings.emptyToNull(changeTag);
+    review.notify = notify;
+    review.labels = new TreeMap<>();
+    review.drafts = ReviewInput.DraftHandling.PUBLISH;
+    for (ApproveOption ao : optionList) {
+      Short v = ao.value();
+      if (v != null) {
+        review.labels.put(ao.getLabelName(), v);
+      }
+    }
+    review.labels.putAll(customLabels);
+
+    // We don't need to add the review comment when abandoning/restoring.
+    if (abandonChange || restoreChange || moveToBranch != null) {
+      review.message = null;
+    }
+
+    try {
+      if (abandonChange) {
+        AbandonInput input = new AbandonInput();
+        input.message = Strings.emptyToNull(changeComment);
+        applyReview(patchSet, review);
+        changeApi(patchSet).abandon(input);
+      } else if (restoreChange) {
+        RestoreInput input = new RestoreInput();
+        input.message = Strings.emptyToNull(changeComment);
+        changeApi(patchSet).restore(input);
+        applyReview(patchSet, review);
+      } else {
+        applyReview(patchSet, review);
+      }
+
+      if (moveToBranch != null) {
+        MoveInput moveInput = new MoveInput();
+        moveInput.destinationBranch = moveToBranch;
+        moveInput.message = Strings.emptyToNull(changeComment);
+        changeApi(patchSet).move(moveInput);
+      }
+
+      if (rebaseChange) {
+        revisionApi(patchSet).rebase();
+      }
+
+      if (submitChange) {
+        revisionApi(patchSet).submit();
+      }
+
+    } catch (IllegalStateException | RestApiException e) {
+      throw die(e);
+    }
+  }
+
+  private ChangeApi changeApi(PatchSet patchSet) throws RestApiException {
+    return gApi.changes().id(patchSet.getId().getParentKey().get());
+  }
+
+  private RevisionApi revisionApi(PatchSet patchSet) throws RestApiException {
+    return changeApi(patchSet).revision(patchSet.getRevision().get());
+  }
+
+  @Override
+  protected void parseCommandLine() throws UnloggedFailure {
+    optionList = new ArrayList<>();
+    customLabels = new HashMap<>();
+
+    ProjectState allProjectsState;
+    try {
+      allProjectsState = projectCache.checkedGet(allProjects);
+    } catch (IOException e) {
+      throw die("missing " + allProjects.get());
+    }
+
+    for (LabelType type : allProjectsState.getLabelTypes().getLabelTypes()) {
+      StringBuilder usage = new StringBuilder("score for ").append(type.getName()).append("\n");
+
+      for (LabelValue v : type.getValues()) {
+        usage.append(v.format()).append("\n");
+      }
+
+      final String name = "--" + type.getName().toLowerCase();
+      optionList.add(new ApproveOption(name, usage.toString(), type));
+    }
+
+    super.parseCommandLine();
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/ScpCommand.java b/java/com/google/gerrit/sshd/commands/ScpCommand.java
new file mode 100644
index 0000000..b3a9a16
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/ScpCommand.java
@@ -0,0 +1,226 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you 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.
+ */
+
+/*
+ * NB: This code was primarly ripped out of MINA SSHD.
+ *
+ * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
+ */
+package com.google.gerrit.sshd.commands;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.server.AccessPath;
+import com.google.gerrit.server.tools.ToolsCatalog;
+import com.google.gerrit.server.tools.ToolsCatalog.Entry;
+import com.google.gerrit.sshd.BaseCommand;
+import com.google.inject.Inject;
+import java.io.ByteArrayOutputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import org.apache.sshd.server.Environment;
+
+final class ScpCommand extends BaseCommand {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final String TYPE_DIR = "D";
+  private static final String TYPE_FILE = "C";
+
+  private boolean opt_r;
+  private boolean opt_t;
+  private boolean opt_f;
+  private String root;
+
+  @Inject private ToolsCatalog toc;
+  private IOException error;
+
+  @Override
+  public void setArguments(String[] args) {
+    root = "";
+    for (int i = 0; i < args.length; i++) {
+      if (args[i].charAt(0) == '-') {
+        for (int j = 1; j < args[i].length(); j++) {
+          switch (args[i].charAt(j)) {
+            case 'f':
+              opt_f = true;
+              break;
+            case 'p':
+              break;
+            case 'r':
+              opt_r = true;
+              break;
+            case 't':
+              opt_t = true;
+              break;
+            case 'v':
+              break;
+          }
+        }
+      } else if (i == args.length - 1) {
+        root = args[args.length - 1];
+      }
+    }
+    if (!opt_f && !opt_t) {
+      error = new IOException("Either -f or -t option should be set");
+    }
+  }
+
+  @Override
+  public void start(Environment env) {
+    startThread(this::runImp, AccessPath.SSH_COMMAND);
+  }
+
+  private void runImp() {
+    try {
+      readAck();
+      if (error != null) {
+        throw error;
+      }
+
+      if (opt_f) {
+        if (root.startsWith("/")) {
+          root = root.substring(1);
+        }
+        if (root.endsWith("/")) {
+          root = root.substring(0, root.length() - 1);
+        }
+        if (root.equals(".")) {
+          root = "";
+        }
+
+        final Entry ent = toc.get(root);
+        if (ent == null) {
+          throw new IOException(root + " not found");
+
+        } else if (Entry.Type.FILE == ent.getType()) {
+          readFile(ent);
+
+        } else if (Entry.Type.DIR == ent.getType()) {
+          if (!opt_r) {
+            throw new IOException(root + " not a regular file");
+          }
+          readDir(ent);
+        } else {
+          throw new IOException(root + " not supported");
+        }
+      } else {
+        throw new IOException("Unsupported mode");
+      }
+    } catch (IOException e) {
+      if (e.getClass() == IOException.class && "Pipe closed".equals(e.getMessage())) {
+        // Ignore a pipe closed error, its the user disconnecting from us
+        // while we are waiting for them to stalk.
+        //
+        return;
+      }
+
+      try {
+        out.write(2);
+        out.write(e.getMessage().getBytes(UTF_8));
+        out.write('\n');
+        out.flush();
+      } catch (IOException e2) {
+        // Ignore
+      }
+      logger.atFine().withCause(e).log("Error in scp command");
+    }
+  }
+
+  private String readLine() throws IOException {
+    ByteArrayOutputStream baos = new ByteArrayOutputStream();
+    for (; ; ) {
+      int c = in.read();
+      if (c == '\n') {
+        return baos.toString();
+      } else if (c == -1) {
+        throw new IOException("End of stream");
+      } else {
+        baos.write(c);
+      }
+    }
+  }
+
+  private void readFile(Entry ent) throws IOException {
+    byte[] data = ent.getBytes();
+    if (data == null) {
+      throw new FileNotFoundException(ent.getPath());
+    }
+
+    header(ent, data.length);
+    readAck();
+
+    out.write(data);
+    ack();
+    readAck();
+  }
+
+  private void readDir(Entry dir) throws IOException {
+    header(dir, 0);
+    readAck();
+
+    for (Entry e : dir.getChildren()) {
+      if (Entry.Type.DIR == e.getType()) {
+        readDir(e);
+      } else {
+        readFile(e);
+      }
+    }
+
+    out.write("E\n".getBytes(UTF_8));
+    out.flush();
+    readAck();
+  }
+
+  private void header(Entry dir, int len) throws IOException, UnsupportedEncodingException {
+    final StringBuilder buf = new StringBuilder();
+    switch (dir.getType()) {
+      case DIR:
+        buf.append(TYPE_DIR);
+        break;
+      case FILE:
+        buf.append(TYPE_FILE);
+        break;
+    }
+    buf.append("0").append(Integer.toOctalString(dir.getMode())); // perms
+    buf.append(" ");
+    buf.append(len); // length
+    buf.append(" ");
+    buf.append(dir.getName());
+    buf.append("\n");
+    out.write(buf.toString().getBytes(UTF_8));
+    out.flush();
+  }
+
+  private void ack() throws IOException {
+    out.write(0);
+    out.flush();
+  }
+
+  private void readAck() throws IOException {
+    switch (in.read()) {
+      case 0:
+        break;
+      case 1:
+        logger.atFine().log("Received warning: %s", readLine());
+        break;
+      case 2:
+        throw new IOException("Received nack: " + readLine());
+    }
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/SetAccountCommand.java b/java/com/google/gerrit/sshd/commands/SetAccountCommand.java
new file mode 100644
index 0000000..9bcb103
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/SetAccountCommand.java
@@ -0,0 +1,365 @@
+// Copyright (C) 2012 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.google.gerrit.sshd.commands;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.common.RawInputUtil;
+import com.google.gerrit.common.errors.EmailException;
+import com.google.gerrit.extensions.api.accounts.EmailInput;
+import com.google.gerrit.extensions.api.accounts.SshKeyInput;
+import com.google.gerrit.extensions.common.EmailInfo;
+import com.google.gerrit.extensions.common.HttpPasswordInput;
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.common.NameInput;
+import com.google.gerrit.extensions.common.SshKeyInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.AccountSshKey;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.restapi.account.AddSshKey;
+import com.google.gerrit.server.restapi.account.CreateEmail;
+import com.google.gerrit.server.restapi.account.DeleteActive;
+import com.google.gerrit.server.restapi.account.DeleteEmail;
+import com.google.gerrit.server.restapi.account.DeleteSshKey;
+import com.google.gerrit.server.restapi.account.GetEmails;
+import com.google.gerrit.server.restapi.account.GetSshKeys;
+import com.google.gerrit.server.restapi.account.PutActive;
+import com.google.gerrit.server.restapi.account.PutHttpPassword;
+import com.google.gerrit.server.restapi.account.PutName;
+import com.google.gerrit.server.restapi.account.PutPreferred;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.kohsuke.args4j.Argument;
+import org.kohsuke.args4j.Option;
+
+/** Set a user's account settings. * */
+@CommandMetaData(name = "set-account", description = "Change an account's settings")
+final class SetAccountCommand extends SshCommand {
+
+  @Argument(
+      index = 0,
+      required = true,
+      metaVar = "USER",
+      usage = "full name, email-address, ssh username or account id")
+  private Account.Id id;
+
+  @Option(name = "--full-name", metaVar = "NAME", usage = "display name of the account")
+  private String fullName;
+
+  @Option(name = "--active", usage = "set account's state to active")
+  private boolean active;
+
+  @Option(name = "--inactive", usage = "set account's state to inactive")
+  private boolean inactive;
+
+  @Option(name = "--add-email", metaVar = "EMAIL", usage = "email addresses to add to the account")
+  private List<String> addEmails = new ArrayList<>();
+
+  @Option(
+      name = "--delete-email",
+      metaVar = "EMAIL",
+      usage = "email addresses to delete from the account")
+  private List<String> deleteEmails = new ArrayList<>();
+
+  @Option(
+      name = "--preferred-email",
+      metaVar = "EMAIL",
+      usage = "a registered email address from the account")
+  private String preferredEmail;
+
+  @Option(name = "--add-ssh-key", metaVar = "-|KEY", usage = "public keys to add to the account")
+  private List<String> addSshKeys = new ArrayList<>();
+
+  @Option(
+      name = "--delete-ssh-key",
+      metaVar = "-|KEY",
+      usage = "public keys to delete from the account")
+  private List<String> deleteSshKeys = new ArrayList<>();
+
+  @Option(
+      name = "--http-password",
+      metaVar = "PASSWORD",
+      usage = "password for HTTP authentication for the account")
+  private String httpPassword;
+
+  @Option(name = "--clear-http-password", usage = "clear HTTP password for the account")
+  private boolean clearHttpPassword;
+
+  @Option(name = "--generate-http-password", usage = "generate a new HTTP password for the account")
+  private boolean generateHttpPassword;
+
+  @Inject private IdentifiedUser.GenericFactory genericUserFactory;
+
+  @Inject private CreateEmail createEmail;
+
+  @Inject private GetEmails getEmails;
+
+  @Inject private DeleteEmail deleteEmail;
+
+  @Inject private PutPreferred putPreferred;
+
+  @Inject private PutName putName;
+
+  @Inject private PutHttpPassword putHttpPassword;
+
+  @Inject private PutActive putActive;
+
+  @Inject private DeleteActive deleteActive;
+
+  @Inject private AddSshKey addSshKey;
+
+  @Inject private GetSshKeys getSshKeys;
+
+  @Inject private DeleteSshKey deleteSshKey;
+
+  @Inject private PermissionBackend permissionBackend;
+
+  @Inject private Provider<CurrentUser> userProvider;
+
+  private AccountResource rsrc;
+
+  @Override
+  public void run() throws Exception {
+    user = genericUserFactory.create(id);
+
+    validate();
+    setAccount();
+  }
+
+  private void validate() throws UnloggedFailure {
+    PermissionBackend.WithUser userPermission = permissionBackend.user(userProvider.get());
+
+    boolean isAdmin = userPermission.testOrFalse(GlobalPermission.ADMINISTRATE_SERVER);
+    boolean canModifyAccount =
+        isAdmin || userPermission.testOrFalse(GlobalPermission.MODIFY_ACCOUNT);
+
+    if (!user.hasSameAccountId(userProvider.get()) && !canModifyAccount) {
+      throw die(
+          "Setting another user's account information requries 'modify account' or 'administrate server' capabilities.");
+    }
+    if (active || inactive) {
+      if (!canModifyAccount) {
+        throw die(
+            "--active and --inactive require 'modify account' or 'administrate server' capabilities.");
+      }
+      if (active && inactive) {
+        throw die("--active and --inactive options are mutually exclusive.");
+      }
+    }
+
+    if (generateHttpPassword && clearHttpPassword) {
+      throw die("--generate-http-password and --clear-http-password are mutually exclusive.");
+    }
+    if (!Strings.isNullOrEmpty(httpPassword)) { // gave --http-password
+      if (!isAdmin) {
+        throw die("--http-password requires 'administrate server' capabilities.");
+      }
+      if (generateHttpPassword) {
+        throw die("--http-password and --generate-http-password options are mutually exclusive.");
+      }
+      if (clearHttpPassword) {
+        throw die("--http-password and --clear-http-password options are mutually exclusive.");
+      }
+    }
+    if (addSshKeys.contains("-") && deleteSshKeys.contains("-")) {
+      throw die("Only one option may use the stdin");
+    }
+    if (deleteSshKeys.contains("ALL")) {
+      deleteSshKeys = Collections.singletonList("ALL");
+    }
+    if (deleteEmails.contains("ALL")) {
+      deleteEmails = Collections.singletonList("ALL");
+    }
+    if (deleteEmails.contains(preferredEmail)) {
+      throw die(
+          "--preferred-email and --delete-email options are mutually "
+              + "exclusive for the same email address.");
+    }
+  }
+
+  private void setAccount()
+      throws OrmException, IOException, UnloggedFailure, ConfigInvalidException,
+          PermissionBackendException {
+    user = genericUserFactory.create(id);
+    rsrc = new AccountResource(user.asIdentifiedUser());
+    try {
+      for (String email : addEmails) {
+        addEmail(email);
+      }
+
+      for (String email : deleteEmails) {
+        deleteEmail(email);
+      }
+
+      if (preferredEmail != null) {
+        putPreferred(preferredEmail);
+      }
+
+      if (fullName != null) {
+        NameInput in = new NameInput();
+        in.name = fullName;
+        putName.apply(rsrc, in);
+      }
+
+      if (httpPassword != null || clearHttpPassword || generateHttpPassword) {
+        HttpPasswordInput in = new HttpPasswordInput();
+        in.httpPassword = httpPassword;
+        if (generateHttpPassword) {
+          in.generate = true;
+        }
+        Response<String> resp = putHttpPassword.apply(rsrc, in);
+        if (generateHttpPassword) {
+          stdout.print("New password: " + resp.value() + "\n");
+        }
+      }
+
+      if (active) {
+        putActive.apply(rsrc, null);
+      } else if (inactive) {
+        try {
+          deleteActive.apply(rsrc, null);
+        } catch (ResourceNotFoundException e) {
+          // user is already inactive
+        }
+      }
+
+      addSshKeys = readSshKey(addSshKeys);
+      if (!addSshKeys.isEmpty()) {
+        addSshKeys(addSshKeys);
+      }
+
+      deleteSshKeys = readSshKey(deleteSshKeys);
+      if (!deleteSshKeys.isEmpty()) {
+        deleteSshKeys(deleteSshKeys);
+      }
+    } catch (RestApiException e) {
+      throw die(e.getMessage());
+    }
+  }
+
+  private void addSshKeys(List<String> sshKeys)
+      throws RestApiException, OrmException, IOException, ConfigInvalidException,
+          PermissionBackendException {
+    for (String sshKey : sshKeys) {
+      SshKeyInput in = new SshKeyInput();
+      in.raw = RawInputUtil.create(sshKey.getBytes(UTF_8), "plain/text");
+      addSshKey.apply(rsrc, in);
+    }
+  }
+
+  private void deleteSshKeys(List<String> sshKeys)
+      throws RestApiException, OrmException, RepositoryNotFoundException, IOException,
+          ConfigInvalidException, PermissionBackendException {
+    List<SshKeyInfo> infos = getSshKeys.apply(rsrc);
+    if (sshKeys.contains("ALL")) {
+      for (SshKeyInfo i : infos) {
+        deleteSshKey(i);
+      }
+    } else {
+      for (String sshKey : sshKeys) {
+        for (SshKeyInfo i : infos) {
+          if (sshKey.trim().equals(i.sshPublicKey) || sshKey.trim().equals(i.comment)) {
+            deleteSshKey(i);
+          }
+        }
+      }
+    }
+  }
+
+  private void deleteSshKey(SshKeyInfo i)
+      throws AuthException, OrmException, RepositoryNotFoundException, IOException,
+          ConfigInvalidException, PermissionBackendException {
+    AccountSshKey sshKey = AccountSshKey.create(user.getAccountId(), i.seq, i.sshPublicKey);
+    deleteSshKey.apply(new AccountResource.SshKey(user.asIdentifiedUser(), sshKey), null);
+  }
+
+  private void addEmail(String email)
+      throws UnloggedFailure, RestApiException, OrmException, IOException, ConfigInvalidException,
+          PermissionBackendException {
+    EmailInput in = new EmailInput();
+    in.email = email;
+    in.noConfirmation = true;
+    try {
+      createEmail.apply(rsrc, IdString.fromDecoded(email), in);
+    } catch (EmailException e) {
+      throw die(e.getMessage());
+    }
+  }
+
+  private void deleteEmail(String email)
+      throws RestApiException, OrmException, IOException, ConfigInvalidException,
+          PermissionBackendException {
+    if (email.equals("ALL")) {
+      List<EmailInfo> emails = getEmails.apply(rsrc);
+      for (EmailInfo e : emails) {
+        deleteEmail.apply(new AccountResource.Email(user.asIdentifiedUser(), e.email), new Input());
+      }
+    } else {
+      deleteEmail.apply(new AccountResource.Email(user.asIdentifiedUser(), email), new Input());
+    }
+  }
+
+  private void putPreferred(String email)
+      throws RestApiException, OrmException, IOException, PermissionBackendException,
+          ConfigInvalidException {
+    for (EmailInfo e : getEmails.apply(rsrc)) {
+      if (e.email.equals(email)) {
+        putPreferred.apply(new AccountResource.Email(user.asIdentifiedUser(), email), null);
+        return;
+      }
+    }
+    stderr.println("preferred email not found: " + email);
+  }
+
+  private List<String> readSshKey(List<String> sshKeys)
+      throws UnsupportedEncodingException, IOException {
+    if (!sshKeys.isEmpty()) {
+      int idx = sshKeys.indexOf("-");
+      if (idx >= 0) {
+        StringBuilder sshKey = new StringBuilder();
+        BufferedReader br = new BufferedReader(new InputStreamReader(in, UTF_8));
+        String line;
+        while ((line = br.readLine()) != null) {
+          sshKey.append(line).append("\n");
+        }
+        sshKeys.set(idx, sshKey.toString());
+      }
+    }
+    return sshKeys;
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/SetHeadCommand.java b/java/com/google/gerrit/sshd/commands/SetHeadCommand.java
new file mode 100644
index 0000000..fd7ef75
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/SetHeadCommand.java
@@ -0,0 +1,54 @@
+// Copyright (C) 2015 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.google.gerrit.sshd.commands;
+
+import com.google.gerrit.extensions.api.projects.HeadInput;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.restapi.project.SetHead;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.inject.Inject;
+import org.kohsuke.args4j.Argument;
+import org.kohsuke.args4j.Option;
+
+@CommandMetaData(name = "set-head", description = "Change HEAD reference for a project")
+public class SetHeadCommand extends SshCommand {
+
+  @Argument(index = 0, required = true, metaVar = "NAME", usage = "name of the project")
+  private ProjectState project;
+
+  @Option(name = "--new-head", required = true, metaVar = "REF", usage = "new HEAD reference")
+  private String newHead;
+
+  private final SetHead setHead;
+
+  @Inject
+  SetHeadCommand(SetHead setHead) {
+    this.setHead = setHead;
+  }
+
+  @Override
+  protected void run() throws Exception {
+    HeadInput input = new HeadInput();
+    input.ref = newHead;
+    try {
+      setHead.apply(new ProjectResource(project, user), input);
+    } catch (UnprocessableEntityException e) {
+      throw die(e);
+    }
+  }
+}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetLoggingLevelCommand.java b/java/com/google/gerrit/sshd/commands/SetLoggingLevelCommand.java
similarity index 100%
rename from gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetLoggingLevelCommand.java
rename to java/com/google/gerrit/sshd/commands/SetLoggingLevelCommand.java
diff --git a/java/com/google/gerrit/sshd/commands/SetMembersCommand.java b/java/com/google/gerrit/sshd/commands/SetMembersCommand.java
new file mode 100644
index 0000000..324257b
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/SetMembersCommand.java
@@ -0,0 +1,169 @@
+// Copyright (C) 2013 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.google.gerrit.sshd.commands;
+
+import static java.util.stream.Collectors.joining;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.Streams;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.account.GroupCache;
+import com.google.gerrit.server.group.GroupResource;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.restapi.group.AddMembers;
+import com.google.gerrit.server.restapi.group.AddSubgroups;
+import com.google.gerrit.server.restapi.group.DeleteMembers;
+import com.google.gerrit.server.restapi.group.DeleteSubgroups;
+import com.google.gerrit.server.restapi.group.GroupsCollection;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import org.kohsuke.args4j.Argument;
+import org.kohsuke.args4j.Option;
+
+@CommandMetaData(
+    name = "set-members",
+    description = "Modify members of specific group or number of groups")
+public class SetMembersCommand extends SshCommand {
+
+  @Option(
+      name = "--add",
+      aliases = {"-a"},
+      metaVar = "USER",
+      usage = "users that should be added as group member")
+  private List<Account.Id> accountsToAdd = new ArrayList<>();
+
+  @Option(
+      name = "--remove",
+      aliases = {"-r"},
+      metaVar = "USER",
+      usage = "users that should be removed from the group")
+  private List<Account.Id> accountsToRemove = new ArrayList<>();
+
+  @Option(
+      name = "--include",
+      aliases = {"-i"},
+      metaVar = "GROUP",
+      usage = "group that should be included as group member")
+  private List<AccountGroup.UUID> groupsToInclude = new ArrayList<>();
+
+  @Option(
+      name = "--exclude",
+      aliases = {"-e"},
+      metaVar = "GROUP",
+      usage = "group that should be excluded from the group")
+  private List<AccountGroup.UUID> groupsToRemove = new ArrayList<>();
+
+  @Argument(
+      index = 0,
+      required = true,
+      multiValued = true,
+      metaVar = "GROUP",
+      usage = "groups to modify")
+  private List<AccountGroup.UUID> groups = new ArrayList<>();
+
+  @Inject private AddMembers addMembers;
+
+  @Inject private DeleteMembers deleteMembers;
+
+  @Inject private AddSubgroups addSubgroups;
+
+  @Inject private DeleteSubgroups deleteSubgroups;
+
+  @Inject private GroupsCollection groupsCollection;
+
+  @Inject private GroupCache groupCache;
+
+  @Inject private AccountCache accountCache;
+
+  @Override
+  protected void run() throws UnloggedFailure, Failure, Exception {
+    try {
+      for (AccountGroup.UUID groupUuid : groups) {
+        GroupResource resource =
+            groupsCollection.parse(TopLevelResource.INSTANCE, IdString.fromUrl(groupUuid.get()));
+        if (!accountsToRemove.isEmpty()) {
+          deleteMembers.apply(resource, fromMembers(accountsToRemove));
+          reportMembersAction("removed from", resource, accountsToRemove);
+        }
+        if (!groupsToRemove.isEmpty()) {
+          deleteSubgroups.apply(resource, fromGroups(groupsToRemove));
+          reportGroupsAction("excluded from", resource, groupsToRemove);
+        }
+        if (!accountsToAdd.isEmpty()) {
+          addMembers.apply(resource, fromMembers(accountsToAdd));
+          reportMembersAction("added to", resource, accountsToAdd);
+        }
+        if (!groupsToInclude.isEmpty()) {
+          addSubgroups.apply(resource, fromGroups(groupsToInclude));
+          reportGroupsAction("included to", resource, groupsToInclude);
+        }
+      }
+    } catch (RestApiException e) {
+      throw die(e.getMessage());
+    }
+  }
+
+  private void reportMembersAction(
+      String action, GroupResource group, List<Account.Id> accountIdList)
+      throws UnsupportedEncodingException, IOException {
+    String names =
+        accountIdList.stream()
+            .map(
+                accountId -> {
+                  Optional<AccountState> accountState = accountCache.get(accountId);
+                  if (!accountState.isPresent()) {
+                    return "n/a";
+                  }
+                  return MoreObjects.firstNonNull(
+                      accountState.get().getAccount().getPreferredEmail(), "n/a");
+                })
+            .collect(joining(", "));
+    out.write(
+        String.format("Members %s group %s: %s\n", action, group.getName(), names).getBytes(ENC));
+  }
+
+  private void reportGroupsAction(
+      String action, GroupResource group, List<AccountGroup.UUID> groupUuidList)
+      throws UnsupportedEncodingException, IOException {
+    String names =
+        groupUuidList.stream()
+            .map(uuid -> groupCache.get(uuid).map(InternalGroup::getName))
+            .flatMap(Streams::stream)
+            .collect(joining(", "));
+    out.write(
+        String.format("Groups %s group %s: %s\n", action, group.getName(), names).getBytes(ENC));
+  }
+
+  private AddSubgroups.Input fromGroups(List<AccountGroup.UUID> accounts) {
+    return AddSubgroups.Input.fromGroups(accounts.stream().map(Object::toString).collect(toList()));
+  }
+
+  private AddMembers.Input fromMembers(List<Account.Id> accounts) {
+    return AddMembers.Input.fromMembers(accounts.stream().map(Object::toString).collect(toList()));
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/SetParentCommand.java b/java/com/google/gerrit/sshd/commands/SetParentCommand.java
new file mode 100644
index 0000000..f2d8c4c
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/SetParentCommand.java
@@ -0,0 +1,189 @@
+// Copyright (C) 2010 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.google.gerrit.sshd.commands;
+
+import static java.util.stream.Collectors.toList;
+
+import com.google.gerrit.extensions.api.projects.ParentInput;
+import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.restapi.project.ListChildProjects;
+import com.google.gerrit.server.restapi.project.SetParent;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import org.kohsuke.args4j.Argument;
+import org.kohsuke.args4j.Option;
+
+@CommandMetaData(
+    name = "set-project-parent",
+    description = "Change the project permissions are inherited from")
+final class SetParentCommand extends SshCommand {
+  @Option(
+      name = "--parent",
+      aliases = {"-p"},
+      metaVar = "NAME",
+      usage = "new parent project")
+  private ProjectState newParent;
+
+  @Option(
+      name = "--children-of",
+      metaVar = "NAME",
+      usage = "parent project for which the child projects should be reparented")
+  private ProjectState oldParent;
+
+  @Option(
+      name = "--exclude",
+      metaVar = "NAME",
+      usage = "child project of old parent project which should not be reparented")
+  private List<ProjectState> excludedChildren = new ArrayList<>();
+
+  @Argument(
+      index = 0,
+      required = false,
+      multiValued = true,
+      metaVar = "NAME",
+      usage = "projects to modify")
+  private List<ProjectState> children = new ArrayList<>();
+
+  @Inject private ProjectCache projectCache;
+
+  @Inject private ListChildProjects listChildProjects;
+
+  @Inject private SetParent setParent;
+
+  private Project.NameKey newParentKey;
+
+  private static ParentInput parentInput(String parent) {
+    ParentInput input = new ParentInput();
+    input.parent = parent;
+    return input;
+  }
+
+  @Override
+  protected void run() throws Failure {
+    if (oldParent == null && children.isEmpty()) {
+      throw die(
+          "child projects have to be specified as "
+              + "arguments or the --children-of option has to be set");
+    }
+    if (oldParent == null && !excludedChildren.isEmpty()) {
+      throw die("--exclude can only be used together with --children-of");
+    }
+
+    final StringBuilder err = new StringBuilder();
+
+    if (newParent != null) {
+      newParentKey = newParent.getProject().getNameKey();
+    }
+
+    final List<Project.NameKey> childProjects =
+        children.stream().map(ProjectState::getNameKey).collect(toList());
+    if (oldParent != null) {
+      try {
+        childProjects.addAll(getChildrenForReparenting(oldParent));
+      } catch (PermissionBackendException e) {
+        throw new Failure(1, "permissions unavailable", e);
+      } catch (OrmException | RestApiException e) {
+        throw new Failure(1, "failure in request", e);
+      }
+    }
+
+    for (Project.NameKey nameKey : childProjects) {
+      final String name = nameKey.get();
+      ProjectState project = projectCache.get(nameKey);
+      try {
+        setParent.apply(new ProjectResource(project, user), parentInput(newParentKey.get()));
+      } catch (AuthException e) {
+        err.append("error: insuffient access rights to change parent of '")
+            .append(name)
+            .append("'\n");
+      } catch (ResourceConflictException | ResourceNotFoundException | BadRequestException e) {
+        err.append("error: ").append(e.getMessage()).append("'\n");
+      } catch (UnprocessableEntityException | IOException e) {
+        throw new Failure(1, "failure in request", e);
+      } catch (PermissionBackendException e) {
+        throw new Failure(1, "permissions unavailable", e);
+      }
+    }
+
+    if (err.length() > 0) {
+      while (err.charAt(err.length() - 1) == '\n') {
+        err.setLength(err.length() - 1);
+      }
+      throw die(err.toString());
+    }
+  }
+
+  /**
+   * Returns the children of the specified parent project that should be reparented. The returned
+   * list of child projects does not contain projects that were specified to be excluded from
+   * reparenting.
+   */
+  private List<Project.NameKey> getChildrenForReparenting(ProjectState parent)
+      throws PermissionBackendException, OrmException, RestApiException {
+    final List<Project.NameKey> childProjects = new ArrayList<>();
+    final List<Project.NameKey> excluded = new ArrayList<>(excludedChildren.size());
+    for (ProjectState excludedChild : excludedChildren) {
+      excluded.add(excludedChild.getProject().getNameKey());
+    }
+    final List<Project.NameKey> automaticallyExcluded = new ArrayList<>(excludedChildren.size());
+    if (newParentKey != null) {
+      automaticallyExcluded.addAll(getAllParents(newParentKey));
+    }
+    for (ProjectInfo child : listChildProjects.apply(new ProjectResource(parent, user))) {
+      final Project.NameKey childName = new Project.NameKey(child.name);
+      if (!excluded.contains(childName)) {
+        if (!automaticallyExcluded.contains(childName)) {
+          childProjects.add(childName);
+        } else {
+          stdout.println(
+              "Automatically excluded '"
+                  + childName
+                  + "' "
+                  + "from reparenting because it is in the parent "
+                  + "line of the new parent '"
+                  + newParentKey
+                  + "'.");
+        }
+      }
+    }
+    return childProjects;
+  }
+
+  private Set<Project.NameKey> getAllParents(Project.NameKey projectName) {
+    ProjectState ps = projectCache.get(projectName);
+    if (ps == null) {
+      return Collections.emptySet();
+    }
+    return ps.parents().transform(ProjectState::getNameKey).toSet();
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/SetProjectCommand.java b/java/com/google/gerrit/sshd/commands/SetProjectCommand.java
new file mode 100644
index 0000000..8c9fc9f
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/SetProjectCommand.java
@@ -0,0 +1,157 @@
+// Copyright (C) 2012 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.google.gerrit.sshd.commands;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.extensions.api.projects.ConfigInput;
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.restapi.project.PutConfig;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.inject.Inject;
+import org.kohsuke.args4j.Argument;
+import org.kohsuke.args4j.Option;
+
+@CommandMetaData(name = "set-project", description = "Change a project's settings")
+final class SetProjectCommand extends SshCommand {
+  @Argument(index = 0, required = true, metaVar = "NAME", usage = "name of the project")
+  private ProjectState projectState;
+
+  @Option(
+      name = "--description",
+      aliases = {"-d"},
+      metaVar = "DESCRIPTION",
+      usage = "description of project")
+  private String projectDescription;
+
+  @Option(
+      name = "--submit-type",
+      aliases = {"-t"},
+      usage = "project submit type\n(default: MERGE_IF_NECESSARY)")
+  private SubmitType submitType;
+
+  @Option(name = "--contributor-agreements", usage = "if contributor agreement is required")
+  private InheritableBoolean contributorAgreements;
+
+  @Option(name = "--signed-off-by", usage = "if signed-off-by is required")
+  private InheritableBoolean signedOffBy;
+
+  @Option(name = "--content-merge", usage = "allow automatic conflict resolving within files")
+  private InheritableBoolean contentMerge;
+
+  @Option(name = "--change-id", usage = "if change-id is required")
+  private InheritableBoolean requireChangeID;
+
+  @Option(
+      name = "--use-contributor-agreements",
+      aliases = {"--ca"},
+      usage = "if contributor agreement is required")
+  void setUseContributorArgreements(@SuppressWarnings("unused") boolean on) {
+    contributorAgreements = InheritableBoolean.TRUE;
+  }
+
+  @Option(
+      name = "--no-contributor-agreements",
+      aliases = {"--nca"},
+      usage = "if contributor agreement is not required")
+  void setNoContributorArgreements(@SuppressWarnings("unused") boolean on) {
+    contributorAgreements = InheritableBoolean.FALSE;
+  }
+
+  @Option(
+      name = "--use-signed-off-by",
+      aliases = {"--so"},
+      usage = "if signed-off-by is required")
+  void setUseSignedOffBy(@SuppressWarnings("unused") boolean on) {
+    signedOffBy = InheritableBoolean.TRUE;
+  }
+
+  @Option(
+      name = "--no-signed-off-by",
+      aliases = {"--nso"},
+      usage = "if signed-off-by is not required")
+  void setNoSignedOffBy(@SuppressWarnings("unused") boolean on) {
+    signedOffBy = InheritableBoolean.FALSE;
+  }
+
+  @Option(name = "--use-content-merge", usage = "allow automatic conflict resolving within files")
+  void setUseContentMerge(@SuppressWarnings("unused") boolean on) {
+    contentMerge = InheritableBoolean.TRUE;
+  }
+
+  @Option(
+      name = "--no-content-merge",
+      usage = "don't allow automatic conflict resolving within files")
+  void setNoContentMerge(@SuppressWarnings("unused") boolean on) {
+    contentMerge = InheritableBoolean.FALSE;
+  }
+
+  @Option(
+      name = "--require-change-id",
+      aliases = {"--id"},
+      usage = "if change-id is required")
+  void setRequireChangeId(@SuppressWarnings("unused") boolean on) {
+    requireChangeID = InheritableBoolean.TRUE;
+  }
+
+  @Option(
+      name = "--no-change-id",
+      aliases = {"--nid"},
+      usage = "if change-id is not required")
+  void setNoChangeId(@SuppressWarnings("unused") boolean on) {
+    requireChangeID = InheritableBoolean.FALSE;
+  }
+
+  @Option(
+      name = "--project-state",
+      aliases = {"--ps"},
+      usage = "project's visibility state")
+  private com.google.gerrit.extensions.client.ProjectState state;
+
+  @Option(name = "--max-object-size-limit", usage = "max Git object size for this project")
+  private String maxObjectSizeLimit;
+
+  @Inject private PutConfig putConfig;
+
+  @Override
+  protected void run() throws Failure {
+    ConfigInput configInput = new ConfigInput();
+    configInput.requireChangeId = requireChangeID;
+    configInput.submitType = submitType;
+    configInput.useContentMerge = contentMerge;
+    configInput.useContributorAgreements = contributorAgreements;
+    configInput.useSignedOffBy = signedOffBy;
+    configInput.state = state;
+    configInput.maxObjectSizeLimit = maxObjectSizeLimit;
+    // Description is different to other parameters, null won't result in
+    // keeping the existing description, it would delete it.
+    if (Strings.emptyToNull(projectDescription) != null) {
+      configInput.description = projectDescription;
+    } else {
+      configInput.description = projectState.getProject().getDescription();
+    }
+
+    try {
+      putConfig.apply(new ProjectResource(projectState, user), configInput);
+    } catch (RestApiException | PermissionBackendException e) {
+      throw die(e);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/SetReviewersCommand.java b/java/com/google/gerrit/sshd/commands/SetReviewersCommand.java
new file mode 100644
index 0000000..a4a8ea8
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/SetReviewersCommand.java
@@ -0,0 +1,156 @@
+// Copyright (C) 2011 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.google.gerrit.sshd.commands;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.api.changes.AddReviewerInput;
+import com.google.gerrit.extensions.api.changes.DeleteReviewerInput;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.ReviewerResource;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.restapi.change.DeleteReviewer;
+import com.google.gerrit.server.restapi.change.PostReviewers;
+import com.google.gerrit.sshd.ChangeArgumentParser;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.kohsuke.args4j.Argument;
+import org.kohsuke.args4j.Option;
+
+@CommandMetaData(name = "set-reviewers", description = "Add or remove reviewers on a change")
+public class SetReviewersCommand extends SshCommand {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  @Option(name = "--project", aliases = "-p", usage = "project containing the change")
+  private ProjectState projectState;
+
+  @Option(
+      name = "--add",
+      aliases = {"-a"},
+      metaVar = "REVIEWER",
+      usage = "user or group that should be added as reviewer")
+  private List<String> toAdd = new ArrayList<>();
+
+  @Option(
+      name = "--remove",
+      aliases = {"-r"},
+      metaVar = "REVIEWER",
+      usage = "user that should be removed from the reviewer list")
+  void optionRemove(Account.Id who) {
+    toRemove.add(who);
+  }
+
+  @Argument(
+      index = 0,
+      required = true,
+      multiValued = true,
+      metaVar = "CHANGE",
+      usage = "changes to modify")
+  void addChange(String token) {
+    try {
+      changeArgumentParser.addChange(token, changes, projectState);
+    } catch (IOException | UnloggedFailure e) {
+      throw new IllegalArgumentException(e.getMessage(), e);
+    } catch (OrmException e) {
+      throw new IllegalArgumentException("database is down", e);
+    } catch (PermissionBackendException e) {
+      throw new IllegalArgumentException("can't check permissions", e);
+    }
+  }
+
+  @Inject private ReviewerResource.Factory reviewerFactory;
+
+  @Inject private PostReviewers postReviewers;
+
+  @Inject private DeleteReviewer deleteReviewer;
+
+  @Inject private ChangeArgumentParser changeArgumentParser;
+
+  private Set<Account.Id> toRemove = new HashSet<>();
+
+  private Map<Change.Id, ChangeResource> changes = new LinkedHashMap<>();
+
+  @Override
+  protected void run() throws UnloggedFailure {
+    boolean ok = true;
+    for (ChangeResource rsrc : changes.values()) {
+      try {
+        ok &= modifyOne(rsrc);
+      } catch (Exception err) {
+        ok = false;
+        logger.atSevere().withCause(err).log("Error updating reviewers on change %s", rsrc.getId());
+        writeError("fatal", "internal error while updating " + rsrc.getId());
+      }
+    }
+
+    if (!ok) {
+      throw die("one or more updates failed; review output above");
+    }
+  }
+
+  private boolean modifyOne(ChangeResource changeRsrc) throws Exception {
+    boolean ok = true;
+
+    // Remove reviewers
+    //
+    for (Account.Id reviewer : toRemove) {
+      ReviewerResource rsrc = reviewerFactory.create(changeRsrc, reviewer);
+      String error = null;
+      try {
+        deleteReviewer.apply(rsrc, new DeleteReviewerInput());
+      } catch (ResourceNotFoundException e) {
+        error = String.format("could not remove %s: not found", reviewer);
+      } catch (Exception e) {
+        error = String.format("could not remove %s: %s", reviewer, e.getMessage());
+      }
+      if (error != null) {
+        ok = false;
+        writeError("error", error);
+      }
+    }
+
+    // Add reviewers
+    //
+    for (String reviewer : toAdd) {
+      AddReviewerInput input = new AddReviewerInput();
+      input.reviewer = reviewer;
+      input.confirmed = true;
+      String error;
+      try {
+        error = postReviewers.apply(changeRsrc, input).error;
+      } catch (Exception e) {
+        error = String.format("could not add %s: %s", reviewer, e.getMessage());
+      }
+      if (error != null) {
+        ok = false;
+        writeError("error", error);
+      }
+    }
+
+    return ok;
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/ShowCaches.java b/java/com/google/gerrit/sshd/commands/ShowCaches.java
new file mode 100644
index 0000000..e4c14d8
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/ShowCaches.java
@@ -0,0 +1,345 @@
+// Copyright (C) 2009 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.google.gerrit.sshd.commands;
+
+import static com.google.gerrit.common.data.GlobalCapability.MAINTAIN_SERVER;
+import static com.google.gerrit.common.data.GlobalCapability.VIEW_CACHES;
+import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.common.Version;
+import com.google.gerrit.extensions.annotations.RequiresAnyCapability;
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.config.ConfigResource;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.restapi.config.GetSummary;
+import com.google.gerrit.server.restapi.config.GetSummary.JvmSummaryInfo;
+import com.google.gerrit.server.restapi.config.GetSummary.MemSummaryInfo;
+import com.google.gerrit.server.restapi.config.GetSummary.SummaryInfo;
+import com.google.gerrit.server.restapi.config.GetSummary.TaskSummaryInfo;
+import com.google.gerrit.server.restapi.config.GetSummary.ThreadSummaryInfo;
+import com.google.gerrit.server.restapi.config.ListCaches;
+import com.google.gerrit.server.restapi.config.ListCaches.CacheInfo;
+import com.google.gerrit.server.restapi.config.ListCaches.CacheType;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.gerrit.sshd.SshDaemon;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Collection;
+import java.util.Date;
+import java.util.Map;
+import java.util.Map.Entry;
+import org.apache.sshd.common.io.IoAcceptor;
+import org.apache.sshd.common.io.IoSession;
+import org.apache.sshd.common.io.mina.MinaSession;
+import org.apache.sshd.server.Environment;
+import org.kohsuke.args4j.Option;
+
+/** Show the current cache states. */
+@RequiresAnyCapability({VIEW_CACHES, MAINTAIN_SERVER})
+@CommandMetaData(
+    name = "show-caches",
+    description = "Display current cache statistics",
+    runsAt = MASTER_OR_SLAVE)
+final class ShowCaches extends SshCommand {
+  private static volatile long serverStarted;
+
+  static class StartupListener implements LifecycleListener {
+    @Override
+    public void start() {
+      serverStarted = TimeUtil.nowMs();
+    }
+
+    @Override
+    public void stop() {}
+  }
+
+  @Option(name = "--gc", usage = "perform Java GC before printing memory stats")
+  private boolean gc;
+
+  @Option(name = "--show-jvm", usage = "show details about the JVM")
+  private boolean showJVM;
+
+  @Option(name = "--show-threads", usage = "show detailed thread counts")
+  private boolean showThreads;
+
+  @Inject private SshDaemon daemon;
+  @Inject private ListCaches listCaches;
+  @Inject private GetSummary getSummary;
+  @Inject private CurrentUser self;
+  @Inject private PermissionBackend permissionBackend;
+
+  @Option(
+      name = "--width",
+      aliases = {"-w"},
+      metaVar = "COLS",
+      usage = "width of output table")
+  private int columns = 80;
+
+  private int nw;
+
+  @Override
+  public void start(Environment env) throws IOException {
+    String s = env.getEnv().get(Environment.ENV_COLUMNS);
+    if (s != null && !s.isEmpty()) {
+      try {
+        columns = Integer.parseInt(s);
+      } catch (NumberFormatException err) {
+        columns = 80;
+      }
+    }
+    super.start(env);
+  }
+
+  @Override
+  protected void run() throws UnloggedFailure {
+    nw = columns - 50;
+    Date now = new Date();
+    stdout.format(
+        "%-25s %-20s      now  %16s\n",
+        "Gerrit Code Review",
+        Version.getVersion() != null ? Version.getVersion() : "",
+        new SimpleDateFormat("HH:mm:ss   zzz").format(now));
+    stdout.format("%-25s %-20s   uptime %16s\n", "", "", uptime(now.getTime() - serverStarted));
+    stdout.print('\n');
+
+    stdout.print(
+        String.format( //
+            "%1s %-" + nw + "s|%-21s|  %-5s |%-9s|\n" //
+            ,
+            "" //
+            ,
+            "Name" //
+            ,
+            "Entries" //
+            ,
+            "AvgGet" //
+            ,
+            "Hit Ratio" //
+            ));
+    stdout.print(
+        String.format( //
+            "%1s %-" + nw + "s|%6s %6s %7s|  %-5s  |%-4s %-4s|\n" //
+            ,
+            "" //
+            ,
+            "" //
+            ,
+            "Mem" //
+            ,
+            "Disk" //
+            ,
+            "Space" //
+            ,
+            "" //
+            ,
+            "Mem" //
+            ,
+            "Disk" //
+            ));
+    stdout.print("--");
+    for (int i = 0; i < nw; i++) {
+      stdout.print('-');
+    }
+    stdout.print("+---------------------+---------+---------+\n");
+
+    Collection<CacheInfo> caches = getCaches();
+    printMemoryCoreCaches(caches);
+    printMemoryPluginCaches(caches);
+    printDiskCaches(caches);
+    stdout.print('\n');
+
+    boolean showJvm;
+    try {
+      permissionBackend.user(self).check(GlobalPermission.MAINTAIN_SERVER);
+      showJvm = true;
+    } catch (AuthException | PermissionBackendException e) {
+      // Silently ignore and do not display detailed JVM information.
+      showJvm = false;
+    }
+    if (showJvm) {
+      sshSummary();
+
+      SummaryInfo summary = getSummary.setGc(gc).setJvm(showJVM).apply(new ConfigResource());
+      taskSummary(summary.taskSummary);
+      memSummary(summary.memSummary);
+      threadSummary(summary.threadSummary);
+
+      if (showJVM && summary.jvmSummary != null) {
+        jvmSummary(summary.jvmSummary);
+      }
+    }
+
+    stdout.flush();
+  }
+
+  private Collection<CacheInfo> getCaches() {
+    @SuppressWarnings("unchecked")
+    Map<String, CacheInfo> caches = (Map<String, CacheInfo>) listCaches.apply(new ConfigResource());
+    for (Map.Entry<String, CacheInfo> entry : caches.entrySet()) {
+      CacheInfo cache = entry.getValue();
+      cache.name = entry.getKey();
+    }
+    return caches.values();
+  }
+
+  private void printMemoryCoreCaches(Collection<CacheInfo> caches) {
+    for (CacheInfo cache : caches) {
+      if (!cache.name.contains("-") && CacheType.MEM.equals(cache.type)) {
+        printCache(cache);
+      }
+    }
+  }
+
+  private void printMemoryPluginCaches(Collection<CacheInfo> caches) {
+    for (CacheInfo cache : caches) {
+      if (cache.name.contains("-") && CacheType.MEM.equals(cache.type)) {
+        printCache(cache);
+      }
+    }
+  }
+
+  private void printDiskCaches(Collection<CacheInfo> caches) {
+    for (CacheInfo cache : caches) {
+      if (CacheType.DISK.equals(cache.type)) {
+        printCache(cache);
+      }
+    }
+  }
+
+  private void printCache(CacheInfo cache) {
+    stdout.print(
+        String.format(
+            "%1s %-" + nw + "s|%6s %6s %7s| %7s |%4s %4s|\n",
+            CacheType.DISK.equals(cache.type) ? "D" : "",
+            cache.name,
+            nullToEmpty(cache.entries.mem),
+            nullToEmpty(cache.entries.disk),
+            Strings.nullToEmpty(cache.entries.space),
+            Strings.nullToEmpty(cache.averageGet),
+            formatAsPercent(cache.hitRatio.mem),
+            formatAsPercent(cache.hitRatio.disk)));
+  }
+
+  private static String nullToEmpty(Long l) {
+    return l != null ? String.valueOf(l) : "";
+  }
+
+  private static String formatAsPercent(Integer i) {
+    return i != null ? String.valueOf(i) + "%" : "";
+  }
+
+  private void memSummary(MemSummaryInfo memSummary) {
+    stdout.format(
+        "Mem: %s total = %s used + %s free + %s buffers\n",
+        memSummary.total, memSummary.used, memSummary.free, memSummary.buffers);
+    stdout.format("     %s max\n", memSummary.max);
+    stdout.format("    %8d open files\n", nullToZero(memSummary.openFiles));
+    stdout.print('\n');
+  }
+
+  private void threadSummary(ThreadSummaryInfo threadSummary) {
+    stdout.format(
+        "Threads: %d CPUs available, %d threads\n", threadSummary.cpus, threadSummary.threads);
+
+    if (showThreads) {
+      stdout.print(String.format("  %22s", ""));
+      for (Thread.State s : Thread.State.values()) {
+        stdout.print(String.format(" %14s", s.name()));
+      }
+      stdout.print('\n');
+      for (Entry<String, Map<Thread.State, Integer>> e : threadSummary.counts.entrySet()) {
+        stdout.print(String.format("  %-22s", e.getKey()));
+        for (Thread.State s : Thread.State.values()) {
+          stdout.print(String.format(" %14d", nullToZero(e.getValue().get(s))));
+        }
+        stdout.print('\n');
+      }
+    }
+    stdout.print('\n');
+  }
+
+  private void taskSummary(TaskSummaryInfo taskSummary) {
+    stdout.format(
+        "Tasks: %4d  total = %4d running +   %4d ready + %4d sleeping\n",
+        nullToZero(taskSummary.total),
+        nullToZero(taskSummary.running),
+        nullToZero(taskSummary.ready),
+        nullToZero(taskSummary.sleeping));
+  }
+
+  private static int nullToZero(Integer i) {
+    return i != null ? i : 0;
+  }
+
+  private void sshSummary() {
+    IoAcceptor acceptor = daemon.getIoAcceptor();
+    if (acceptor == null) {
+      return;
+    }
+
+    long now = TimeUtil.nowMs();
+    Collection<IoSession> list = acceptor.getManagedSessions().values();
+    long oldest = now;
+
+    for (IoSession s : list) {
+      if (s instanceof MinaSession) {
+        MinaSession minaSession = (MinaSession) s;
+        oldest = Math.min(oldest, minaSession.getSession().getCreationTime());
+      }
+    }
+
+    stdout.format(
+        "SSH:   %4d  users, oldest session started %s ago\n", list.size(), uptime(now - oldest));
+  }
+
+  private void jvmSummary(JvmSummaryInfo jvmSummary) {
+    stdout.format("JVM: %s %s %s\n", jvmSummary.vmVendor, jvmSummary.vmName, jvmSummary.vmVersion);
+    stdout.format("  on %s %s %s\n", jvmSummary.osName, jvmSummary.osVersion, jvmSummary.osArch);
+    stdout.format("  running as %s on %s\n", jvmSummary.user, Strings.nullToEmpty(jvmSummary.host));
+    stdout.format("  cwd  %s\n", jvmSummary.currentWorkingDirectory);
+    stdout.format("  site %s\n", jvmSummary.site);
+  }
+
+  private String uptime(long uptimeMillis) {
+    if (uptimeMillis < 1000) {
+      return String.format("%3d ms", uptimeMillis);
+    }
+
+    long uptime = uptimeMillis / 1000L;
+
+    long min = uptime / 60;
+    if (min < 60) {
+      return String.format("%2d min %2d sec", min, uptime - min * 60);
+    }
+
+    long hr = uptime / 3600;
+    if (hr < 24) {
+      min = (uptime - hr * 3600) / 60;
+      return String.format("%2d hrs %2d min", hr, min);
+    }
+
+    long days = uptime / (24 * 3600);
+    hr = (uptime - (days * 24 * 3600)) / 3600;
+    return String.format("%4d days %2d hrs", days, hr);
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/ShowConnections.java b/java/com/google/gerrit/sshd/commands/ShowConnections.java
new file mode 100644
index 0000000..d579ef6
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/ShowConnections.java
@@ -0,0 +1,239 @@
+// Copyright (C) 2009 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.google.gerrit.sshd.commands;
+
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.ioutil.HexFormat;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.gerrit.sshd.SshDaemon;
+import com.google.gerrit.sshd.SshSession;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Optional;
+import org.apache.sshd.common.io.IoAcceptor;
+import org.apache.sshd.common.io.IoSession;
+import org.apache.sshd.common.io.mina.MinaAcceptor;
+import org.apache.sshd.common.io.mina.MinaSession;
+import org.apache.sshd.common.io.nio2.Nio2Acceptor;
+import org.apache.sshd.common.session.helpers.AbstractSession;
+import org.apache.sshd.server.Environment;
+import org.kohsuke.args4j.Option;
+
+/** Show the current SSH connections. */
+@RequiresCapability(GlobalCapability.VIEW_CONNECTIONS)
+@CommandMetaData(
+    name = "show-connections",
+    description = "Display active client SSH connections",
+    runsAt = MASTER_OR_SLAVE)
+final class ShowConnections extends SshCommand {
+  @Option(
+      name = "--numeric",
+      aliases = {"-n"},
+      usage = "don't resolve names")
+  private boolean numeric;
+
+  @Option(
+      name = "--wide",
+      aliases = {"-w"},
+      usage = "display without line width truncation")
+  private boolean wide;
+
+  @Inject private SshDaemon daemon;
+
+  private int hostNameWidth;
+  private int columns = 80;
+
+  @Override
+  public void start(Environment env) throws IOException {
+    String s = env.getEnv().get(Environment.ENV_COLUMNS);
+    if (s != null && !s.isEmpty()) {
+      try {
+        columns = Integer.parseInt(s);
+      } catch (NumberFormatException err) {
+        columns = 80;
+      }
+    }
+    super.start(env);
+  }
+
+  @Override
+  protected void run() throws Failure {
+    final IoAcceptor acceptor = daemon.getIoAcceptor();
+    if (acceptor == null) {
+      throw new Failure(1, "fatal: sshd no longer running");
+    }
+
+    final ImmutableList<IoSession> list =
+        acceptor.getManagedSessions().values().stream()
+            .sorted(
+                (arg0, arg1) -> {
+                  if (arg0 instanceof MinaSession) {
+                    MinaSession mArg0 = (MinaSession) arg0;
+                    MinaSession mArg1 = (MinaSession) arg1;
+                    if (mArg0.getSession().getCreationTime()
+                        < mArg1.getSession().getCreationTime()) {
+                      return -1;
+                    } else if (mArg0.getSession().getCreationTime()
+                        > mArg1.getSession().getCreationTime()) {
+                      return 1;
+                    }
+                  }
+                  return (int) (arg0.getId() - arg1.getId());
+                })
+            .collect(toImmutableList());
+
+    hostNameWidth = wide ? Integer.MAX_VALUE : columns - 9 - 9 - 10 - 32;
+
+    if (getBackend().equals("mina")) {
+      long now = TimeUtil.nowMs();
+      stdout.print(
+          String.format(
+              "%-8s %8s %8s   %-15s %s\n", "Session", "Start", "Idle", "User", "Remote Host"));
+      stdout.print("--------------------------------------------------------------\n");
+      for (IoSession io : list) {
+        checkState(io instanceof MinaSession, "expected MinaSession");
+        MinaSession minaSession = (MinaSession) io;
+        long start = minaSession.getSession().getCreationTime();
+        long idle = now - minaSession.getSession().getLastIoTime();
+        AbstractSession s = AbstractSession.getSession(io, true);
+        SshSession sd = s != null ? s.getAttribute(SshSession.KEY) : null;
+
+        stdout.print(
+            String.format(
+                "%8s %8s %8s   %-15.15s %s\n",
+                id(sd),
+                time(now, start),
+                age(idle),
+                username(sd),
+                hostname(io.getRemoteAddress())));
+      }
+    } else {
+      stdout.print(String.format("%-8s   %-15s %s\n", "Session", "User", "Remote Host"));
+      stdout.print("--------------------------------------------------------------\n");
+      for (IoSession io : list) {
+        AbstractSession s = AbstractSession.getSession(io, true);
+        SshSession sd = s != null ? s.getAttribute(SshSession.KEY) : null;
+
+        stdout.print(
+            String.format(
+                "%8s   %-15.15s %s\n", id(sd), username(sd), hostname(io.getRemoteAddress())));
+      }
+    }
+
+    stdout.print("--\n");
+    stdout.print("SSHD Backend: " + getBackend() + "\n");
+  }
+
+  private String getBackend() {
+    IoAcceptor acceptor = daemon.getIoAcceptor();
+    if (acceptor == null) {
+      return "";
+    } else if (acceptor instanceof MinaAcceptor) {
+      return "mina";
+    } else if (acceptor instanceof Nio2Acceptor) {
+      return "nio2";
+    } else {
+      return "unknown";
+    }
+  }
+
+  private static String id(SshSession sd) {
+    return sd != null ? HexFormat.fromInt(sd.getSessionId()) : "";
+  }
+
+  private static String time(long now, long time) {
+    if (now - time < 24 * 60 * 60 * 1000L) {
+      return new SimpleDateFormat("HH:mm:ss").format(new Date(time));
+    }
+    return new SimpleDateFormat("MMM-dd").format(new Date(time));
+  }
+
+  private static String age(long age) {
+    age /= 1000;
+
+    final int sec = (int) (age % 60);
+    age /= 60;
+
+    final int min = (int) (age % 60);
+    age /= 60;
+
+    final int hr = (int) (age % 60);
+    return String.format("%02d:%02d:%02d", hr, min, sec);
+  }
+
+  private String username(SshSession sd) {
+    if (sd == null) {
+      return "";
+    }
+
+    final CurrentUser user = sd.getUser();
+    if (user != null && user.isIdentifiedUser()) {
+      IdentifiedUser u = user.asIdentifiedUser();
+
+      if (!numeric) {
+        Optional<String> name = u.getUserName();
+        if (name.isPresent()) {
+          return name.get();
+        }
+      }
+
+      return "a/" + u.getAccountId().toString();
+    }
+    return "";
+  }
+
+  private String hostname(SocketAddress remoteAddress) {
+    if (remoteAddress == null) {
+      return "?";
+    }
+    String host = null;
+    if (remoteAddress instanceof InetSocketAddress) {
+      final InetSocketAddress sa = (InetSocketAddress) remoteAddress;
+      final InetAddress in = sa.getAddress();
+      if (numeric) {
+        return in.getHostAddress();
+      }
+      if (in != null) {
+        host = in.getCanonicalHostName();
+      } else {
+        host = sa.getHostName();
+      }
+    }
+    if (host == null) {
+      host = remoteAddress.toString();
+    }
+
+    if (host.length() > hostNameWidth) {
+      return host.substring(0, hostNameWidth);
+    }
+
+    return host;
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/ShowQueue.java b/java/com/google/gerrit/sshd/commands/ShowQueue.java
new file mode 100644
index 0000000..2a7bd6e
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/ShowQueue.java
@@ -0,0 +1,209 @@
+// Copyright (C) 2009 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.google.gerrit.sshd.commands;
+
+import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.LinkedListMultimap;
+import com.google.common.collect.ListMultimap;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.config.ConfigResource;
+import com.google.gerrit.server.git.WorkQueue;
+import com.google.gerrit.server.git.WorkQueue.Task;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.restapi.config.ListTasks;
+import com.google.gerrit.server.restapi.config.ListTasks.TaskInfo;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.sshd.AdminHighPriorityCommand;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import org.apache.sshd.server.Environment;
+import org.kohsuke.args4j.Option;
+
+/** Display the current work queue. */
+@AdminHighPriorityCommand
+@CommandMetaData(
+    name = "show-queue",
+    description = "Display the background work queues",
+    runsAt = MASTER_OR_SLAVE)
+final class ShowQueue extends SshCommand {
+  @Option(
+      name = "--wide",
+      aliases = {"-w"},
+      usage = "display without line width truncation")
+  private boolean wide;
+
+  @Option(
+      name = "--by-queue",
+      aliases = {"-q"},
+      usage = "group tasks by queue and print queue info")
+  private boolean groupByQueue;
+
+  @Inject private PermissionBackend permissionBackend;
+  @Inject private ListTasks listTasks;
+  @Inject private IdentifiedUser currentUser;
+  @Inject private WorkQueue workQueue;
+
+  private int columns = 80;
+  private int maxCommandWidth;
+
+  @Override
+  public void start(Environment env) throws IOException {
+    String s = env.getEnv().get(Environment.ENV_COLUMNS);
+    if (s != null && !s.isEmpty()) {
+      try {
+        columns = Integer.parseInt(s);
+      } catch (NumberFormatException err) {
+        columns = 80;
+      }
+    }
+    super.start(env);
+  }
+
+  @Override
+  protected void run() throws Failure {
+    maxCommandWidth = wide ? Integer.MAX_VALUE : columns - 8 - 12 - 12 - 4 - 4;
+    stdout.print(
+        String.format(
+            "%-8s %-12s %-12s %-4s %s\n", //
+            "Task", "State", "StartTime", "", "Command"));
+    stdout.print(
+        "------------------------------------------------------------------------------\n");
+
+    List<TaskInfo> tasks;
+    try {
+      tasks = listTasks.apply(new ConfigResource());
+    } catch (AuthException e) {
+      throw die(e);
+    } catch (PermissionBackendException e) {
+      throw new Failure(1, "permission backend unavailable", e);
+    }
+
+    boolean viewAll = permissionBackend.user(currentUser).testOrFalse(GlobalPermission.VIEW_QUEUE);
+    long now = TimeUtil.nowMs();
+    if (groupByQueue) {
+      ListMultimap<String, TaskInfo> byQueue = byQueue(tasks);
+      for (String queueName : byQueue.keySet()) {
+        ScheduledThreadPoolExecutor e = workQueue.getExecutor(queueName);
+        stdout.print(String.format("Queue: %s\n", queueName));
+        print(byQueue.get(queueName), now, viewAll, e.getCorePoolSize());
+      }
+    } else {
+      print(tasks, now, viewAll, 0);
+    }
+  }
+
+  private ListMultimap<String, TaskInfo> byQueue(List<TaskInfo> tasks) {
+    ListMultimap<String, TaskInfo> byQueue = LinkedListMultimap.create();
+    for (TaskInfo task : tasks) {
+      byQueue.put(task.queueName, task);
+    }
+    return byQueue;
+  }
+
+  private void print(List<TaskInfo> tasks, long now, boolean viewAll, int threadPoolSize) {
+    for (TaskInfo task : tasks) {
+      String start;
+      switch (task.state) {
+        case DONE:
+        case CANCELLED:
+        case RUNNING:
+        case READY:
+          start = format(task.state);
+          break;
+        case OTHER:
+        case SLEEPING:
+        default:
+          start = time(now, task.delay);
+          break;
+      }
+
+      // Shows information about tasks depending on the user rights
+      if (viewAll || task.projectName == null) {
+        String command =
+            task.command.length() < maxCommandWidth
+                ? task.command
+                : task.command.substring(0, maxCommandWidth);
+
+        stdout.print(
+            String.format(
+                "%8s %-12s %-12s %-4s %s\n",
+                task.id, start, startTime(task.startTime), "", command));
+      } else {
+        String remoteName =
+            task.remoteName != null ? task.remoteName + "/" + task.projectName : task.projectName;
+
+        stdout.print(
+            String.format(
+                "%8s %-12s %-4s %s\n",
+                task.id,
+                start,
+                startTime(task.startTime),
+                MoreObjects.firstNonNull(remoteName, "n/a")));
+      }
+    }
+    stdout.print(
+        "------------------------------------------------------------------------------\n");
+    stdout.print("  " + tasks.size() + " tasks");
+    if (threadPoolSize > 0) {
+      stdout.print(", " + threadPoolSize + " worker threads");
+    }
+    stdout.print("\n\n");
+  }
+
+  private static String time(long now, long delay) {
+    Date when = new Date(now + delay);
+    return format(when, delay);
+  }
+
+  private static String startTime(Date when) {
+    return format(when, TimeUtil.nowMs() - when.getTime());
+  }
+
+  private static String format(Date when, long timeFromNow) {
+    if (timeFromNow < 24 * 60 * 60 * 1000L) {
+      return new SimpleDateFormat("HH:mm:ss.SSS").format(when);
+    }
+    return new SimpleDateFormat("MMM-dd HH:mm").format(when);
+  }
+
+  private static String format(Task.State state) {
+    switch (state) {
+      case DONE:
+        return "....... done";
+      case CANCELLED:
+        return "..... killed";
+      case RUNNING:
+        return "";
+      case READY:
+        return "waiting ....";
+      case SLEEPING:
+        return "sleeping";
+      case OTHER:
+      default:
+        return state.toString();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/StreamEvents.java b/java/com/google/gerrit/sshd/commands/StreamEvents.java
new file mode 100644
index 0000000..ffd98d5
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/StreamEvents.java
@@ -0,0 +1,295 @@
+// Copyright (C) 2010 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.google.gerrit.sshd.commands;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.base.Supplier;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.events.Event;
+import com.google.gerrit.server.events.EventTypes;
+import com.google.gerrit.server.events.ProjectNameKeySerializer;
+import com.google.gerrit.server.events.SupplierSerializer;
+import com.google.gerrit.server.events.UserScopedEventListener;
+import com.google.gerrit.server.git.WorkQueue.CancelableRunnable;
+import com.google.gerrit.sshd.BaseCommand;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.gerrit.sshd.StreamCommandExecutor;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Future;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import org.apache.sshd.server.Environment;
+import org.kohsuke.args4j.Option;
+
+@RequiresCapability(GlobalCapability.STREAM_EVENTS)
+@CommandMetaData(name = "stream-events", description = "Monitor events occurring in real time")
+final class StreamEvents extends BaseCommand {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  /** Maximum number of events that may be queued up for each connection. */
+  private static final int MAX_EVENTS = 128;
+
+  /** Number of events to write before yielding off the thread. */
+  private static final int BATCH_SIZE = 32;
+
+  @Option(
+      name = "--subscribe",
+      aliases = {"-s"},
+      metaVar = "SUBSCRIBE",
+      usage = "subscribe to specific stream-events")
+  private List<String> subscribedToEvents = new ArrayList<>();
+
+  @Inject private IdentifiedUser currentUser;
+
+  @Inject private DynamicSet<UserScopedEventListener> eventListeners;
+
+  @Inject @StreamCommandExecutor private ScheduledThreadPoolExecutor pool;
+
+  /** Queue of events to stream to the connected user. */
+  private final LinkedBlockingQueue<Event> queue = new LinkedBlockingQueue<>(MAX_EVENTS);
+
+  private Gson gson;
+
+  private RegistrationHandle eventListenerRegistration;
+
+  /** Special event to notify clients they missed other events. */
+  private static final class DroppedOutputEvent extends Event {
+    private static final String TYPE = "dropped-output";
+
+    DroppedOutputEvent() {
+      super(TYPE);
+    }
+  }
+
+  static {
+    EventTypes.register(DroppedOutputEvent.TYPE, DroppedOutputEvent.class);
+  }
+
+  private final CancelableRunnable writer =
+      new CancelableRunnable() {
+        @Override
+        public void run() {
+          writeEvents();
+        }
+
+        @Override
+        public void cancel() {
+          onExit(0);
+        }
+
+        @Override
+        public String toString() {
+          StringBuilder b = new StringBuilder();
+          b.append("Stream Events");
+          if (currentUser.getUserName().isPresent()) {
+            b.append(" (").append(currentUser.getUserName().get()).append(")");
+          }
+          return b.toString();
+        }
+      };
+
+  /** True if {@link DroppedOutputEvent} needs to be sent. */
+  private volatile boolean dropped;
+
+  /** Lock to protect {@link #queue}, {@link #task}, {@link #done}. */
+  private final Object taskLock = new Object();
+
+  /** True if no more messages should be sent to the output. */
+  private boolean done;
+
+  /**
+   * Currently scheduled task to spin out {@link #queue}.
+   *
+   * <p>This field is usually {@code null}, unless there is at least one object present inside of
+   * {@link #queue} ready for delivery. Tasks are only started when there are events to be sent.
+   */
+  private Future<?> task;
+
+  private PrintWriter stdout;
+
+  @Override
+  public void start(Environment env) throws IOException {
+    try {
+      parseCommandLine();
+    } catch (UnloggedFailure e) {
+      String msg = e.getMessage();
+      if (!msg.endsWith("\n")) {
+        msg += "\n";
+      }
+      err.write(msg.getBytes(UTF_8));
+      err.flush();
+      onExit(1);
+      return;
+    }
+
+    stdout = toPrintWriter(out);
+    eventListenerRegistration =
+        eventListeners.add(
+            "gerrit",
+            new UserScopedEventListener() {
+              @Override
+              public void onEvent(Event event) {
+                if (subscribedToEvents.isEmpty() || subscribedToEvents.contains(event.getType())) {
+                  offer(event);
+                }
+              }
+
+              @Override
+              public CurrentUser getUser() {
+                return currentUser;
+              }
+            });
+
+    gson =
+        new GsonBuilder()
+            .registerTypeAdapter(Supplier.class, new SupplierSerializer())
+            .registerTypeAdapter(Project.NameKey.class, new ProjectNameKeySerializer())
+            .create();
+  }
+
+  private void removeEventListenerRegistration() {
+    if (eventListenerRegistration != null) {
+      eventListenerRegistration.remove();
+    }
+  }
+
+  @Override
+  protected void onExit(int rc) {
+    removeEventListenerRegistration();
+
+    synchronized (taskLock) {
+      done = true;
+    }
+
+    super.onExit(rc);
+  }
+
+  @Override
+  public void destroy() {
+    removeEventListenerRegistration();
+
+    final boolean exit;
+    synchronized (taskLock) {
+      if (task != null) {
+        task.cancel(true);
+        exit = false; // onExit will be invoked by the task cancellation.
+      } else {
+        exit = !done;
+      }
+      done = true;
+    }
+    if (exit) {
+      onExit(0);
+    }
+  }
+
+  private void offer(Event event) {
+    synchronized (taskLock) {
+      if (!queue.offer(event)) {
+        dropped = true;
+      }
+
+      if (task == null && !done) {
+        task = pool.submit(writer);
+      }
+    }
+  }
+
+  private Event poll() {
+    synchronized (taskLock) {
+      Event event = queue.poll();
+      if (event == null) {
+        task = null;
+      }
+      return event;
+    }
+  }
+
+  private void writeEvents() {
+    int processed = 0;
+
+    while (processed < BATCH_SIZE) {
+      if (Thread.interrupted() || stdout.checkError()) {
+        // The other side either requested a shutdown by calling our
+        // destroy() above, or it closed the stream and is no longer
+        // accepting output. Either way terminate this instance.
+        //
+        removeEventListenerRegistration();
+        flush();
+        onExit(0);
+        return;
+      }
+
+      if (dropped) {
+        write(new DroppedOutputEvent());
+        dropped = false;
+      }
+
+      final Event event = poll();
+      if (event == null) {
+        break;
+      }
+
+      write(event);
+      processed++;
+    }
+
+    flush();
+
+    if (BATCH_SIZE <= processed) {
+      // We processed the limit, but more might remain in the queue.
+      // Schedule the write task again so we will come back here and
+      // can process more events.
+      //
+      synchronized (taskLock) {
+        task = pool.submit(writer);
+      }
+    }
+  }
+
+  private void write(Object message) {
+    String msg = null;
+    try {
+      msg = gson.toJson(message) + "\n";
+    } catch (Exception e) {
+      logger.atWarning().withCause(e).log("Could not deserialize the msg");
+    }
+    if (msg != null) {
+      synchronized (stdout) {
+        stdout.print(msg);
+      }
+    }
+  }
+
+  private void flush() {
+    synchronized (stdout) {
+      stdout.flush();
+    }
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/TestSubmitRuleCommand.java b/java/com/google/gerrit/sshd/commands/TestSubmitRuleCommand.java
new file mode 100644
index 0000000..ce43c3d
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/TestSubmitRuleCommand.java
@@ -0,0 +1,33 @@
+// Copyright (C) 2012 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.google.gerrit.sshd.commands;
+
+import com.google.gerrit.extensions.common.TestSubmitRuleInput;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.restapi.change.TestSubmitRule;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.inject.Inject;
+
+/** Command that allows testing of prolog submit-rules in a live instance. */
+@CommandMetaData(name = "rule", description = "Test prolog submit rules")
+final class TestSubmitRuleCommand extends BaseTestPrologCommand {
+  @Inject private TestSubmitRule view;
+
+  @Override
+  protected RestModifyView<RevisionResource, TestSubmitRuleInput> createView() {
+    return view;
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/TestSubmitTypeCommand.java b/java/com/google/gerrit/sshd/commands/TestSubmitTypeCommand.java
new file mode 100644
index 0000000..90d54d5
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/TestSubmitTypeCommand.java
@@ -0,0 +1,33 @@
+// Copyright (C) 2012 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.google.gerrit.sshd.commands;
+
+import com.google.gerrit.extensions.common.TestSubmitRuleInput;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.restapi.change.TestSubmitType;
+import com.google.gerrit.sshd.CommandMetaData;
+import com.google.inject.Inject;
+
+@CommandMetaData(name = "type", description = "Test prolog submit type")
+final class TestSubmitTypeCommand extends BaseTestPrologCommand {
+  @Inject private TestSubmitType view;
+
+  @Override
+  protected RestModifyView<RevisionResource, TestSubmitRuleInput> createView() {
+    return view;
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/Upload.java b/java/com/google/gerrit/sshd/commands/Upload.java
new file mode 100644
index 0000000..24a6975
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/Upload.java
@@ -0,0 +1,89 @@
+// Copyright (C) 2008 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.google.gerrit.sshd.commands;
+
+import com.google.common.collect.Lists;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.server.git.DefaultAdvertiseRefsHook;
+import com.google.gerrit.server.git.TransferConfig;
+import com.google.gerrit.server.git.UploadPackInitializer;
+import com.google.gerrit.server.git.validators.UploadValidationException;
+import com.google.gerrit.server.git.validators.UploadValidators;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackend.RefFilterOptions;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.sshd.AbstractGitCommand;
+import com.google.gerrit.sshd.SshSession;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.util.List;
+import org.eclipse.jgit.transport.PostUploadHook;
+import org.eclipse.jgit.transport.PostUploadHookChain;
+import org.eclipse.jgit.transport.PreUploadHook;
+import org.eclipse.jgit.transport.PreUploadHookChain;
+import org.eclipse.jgit.transport.UploadPack;
+
+/** Publishes Git repositories over SSH using the Git upload-pack protocol. */
+final class Upload extends AbstractGitCommand {
+  @Inject private TransferConfig config;
+  @Inject private DynamicSet<PreUploadHook> preUploadHooks;
+  @Inject private DynamicSet<PostUploadHook> postUploadHooks;
+  @Inject private DynamicSet<UploadPackInitializer> uploadPackInitializers;
+  @Inject private UploadValidators.Factory uploadValidatorsFactory;
+  @Inject private SshSession session;
+  @Inject private PermissionBackend permissionBackend;
+
+  @Override
+  protected void runImpl() throws IOException, Failure {
+    PermissionBackend.ForProject perm =
+        permissionBackend.user(user).project(projectState.getNameKey());
+    try {
+
+      perm.check(ProjectPermission.RUN_UPLOAD_PACK);
+    } catch (AuthException e) {
+      throw new Failure(1, "fatal: upload-pack not permitted on this server");
+    } catch (PermissionBackendException e) {
+      throw new Failure(1, "fatal: unable to check permissions " + e);
+    }
+
+    final UploadPack up = new UploadPack(repo);
+    up.setAdvertiseRefsHook(new DefaultAdvertiseRefsHook(perm, RefFilterOptions.defaults()));
+    up.setPackConfig(config.getPackConfig());
+    up.setTimeout(config.getTimeout());
+    up.setPostUploadHook(PostUploadHookChain.newChain(Lists.newArrayList(postUploadHooks)));
+
+    List<PreUploadHook> allPreUploadHooks = Lists.newArrayList(preUploadHooks);
+    allPreUploadHooks.add(
+        uploadValidatorsFactory.create(project, repo, session.getRemoteAddressAsString()));
+    up.setPreUploadHook(PreUploadHookChain.newChain(allPreUploadHooks));
+    for (UploadPackInitializer initializer : uploadPackInitializers) {
+      initializer.init(projectState.getNameKey(), up);
+    }
+    try {
+      up.upload(in, out, err);
+      session.setPeerAgent(up.getPeerUserAgent());
+    } catch (UploadValidationException e) {
+      // UploadValidationException is used by the UploadValidators to
+      // stop the uploadPack. We do not want this exception to go beyond this
+      // point otherwise it would print a stacktrace in the logs and return an
+      // internal server error to the client.
+      if (!e.isOutput()) {
+        up.sendMessage(e.getMessage());
+      }
+    }
+  }
+}
diff --git a/java/com/google/gerrit/sshd/commands/UploadArchive.java b/java/com/google/gerrit/sshd/commands/UploadArchive.java
new file mode 100644
index 0000000..ac914a5
--- /dev/null
+++ b/java/com/google/gerrit/sshd/commands/UploadArchive.java
@@ -0,0 +1,266 @@
+// Copyright (C) 2014 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.google.gerrit.sshd.commands;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.base.Splitter;
+import com.google.common.collect.ImmutableMap;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.server.change.ArchiveFormat;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.restapi.change.AllowedFormats;
+import com.google.gerrit.server.restapi.project.CommitsCollection;
+import com.google.gerrit.sshd.AbstractGitCommand;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.jgit.api.ArchiveCommand;
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.PacketLineIn;
+import org.eclipse.jgit.transport.PacketLineOut;
+import org.eclipse.jgit.transport.SideBandOutputStream;
+import org.kohsuke.args4j.Argument;
+import org.kohsuke.args4j.CmdLineException;
+import org.kohsuke.args4j.CmdLineParser;
+import org.kohsuke.args4j.Option;
+import org.kohsuke.args4j.ParserProperties;
+
+/** Allows getting archives for Git repositories over SSH using the Git upload-archive protocol. */
+public class UploadArchive extends AbstractGitCommand {
+  /**
+   * Options for parsing Git commands.
+   *
+   * <p>These options are not passed on command line, but received through input stream in pkt-line
+   * format.
+   */
+  static class Options {
+    @Option(
+        name = "-f",
+        aliases = {"--format"},
+        usage =
+            "Format of the"
+                + " resulting archive: tar or zip... If this option is not given, and"
+                + " the output file is specified, the format is inferred from the"
+                + " filename if possible (e.g. writing to \"foo.zip\" makes the output"
+                + " to be in the zip format). Otherwise the output format is tar.")
+    private String format = "tar";
+
+    @Option(name = "--prefix", usage = "Prepend <prefix>/ to each filename in the archive.")
+    private String prefix;
+
+    @Option(name = "-0", usage = "Store the files instead of deflating them.")
+    private boolean level0;
+
+    @Option(name = "-1")
+    private boolean level1;
+
+    @Option(name = "-2")
+    private boolean level2;
+
+    @Option(name = "-3")
+    private boolean level3;
+
+    @Option(name = "-4")
+    private boolean level4;
+
+    @Option(name = "-5")
+    private boolean level5;
+
+    @Option(name = "-6")
+    private boolean level6;
+
+    @Option(name = "-7")
+    private boolean level7;
+
+    @Option(name = "-8")
+    private boolean level8;
+
+    @Option(
+        name = "-9",
+        usage =
+            "Highest and slowest compression level. You "
+                + "can specify any number from 1 to 9 to adjust compression speed and "
+                + "ratio.")
+    private boolean level9;
+
+    @Argument(index = 0, required = true, usage = "The tree or commit to produce an archive for.")
+    private String treeIsh = "master";
+
+    @Argument(
+        index = 1,
+        multiValued = true,
+        usage =
+            "Without an optional path parameter, all files and subdirectories of "
+                + "the current working directory are included in the archive. If one "
+                + "or more paths are specified, only these are included.")
+    private List<String> path;
+  }
+
+  @Inject private PermissionBackend permissionBackend;
+  @Inject private CommitsCollection commits;
+  @Inject private AllowedFormats allowedFormats;
+  @Inject private ProjectCache projectCache;
+  private Options options = new Options();
+
+  /**
+   * Read and parse arguments from input stream. This method gets the arguments from input stream,
+   * in Pkt-line format, then parses them to fill the options object.
+   */
+  protected void readArguments() throws IOException, Failure {
+    String argCmd = "argument ";
+    List<String> args = new ArrayList<>();
+
+    // Read arguments in Pkt-Line format
+    PacketLineIn packetIn = new PacketLineIn(in);
+    for (; ; ) {
+      String s = packetIn.readString();
+      if (s == PacketLineIn.END) {
+        break;
+      }
+      if (!s.startsWith(argCmd)) {
+        throw new Failure(1, "fatal: 'argument' token or flush expected, got " + s);
+      }
+      for (String p : Splitter.on('=').limit(2).split(s.substring(argCmd.length()))) {
+        args.add(p);
+      }
+    }
+
+    try {
+      // Parse them into the 'options' field
+      CmdLineParser parser =
+          new CmdLineParser(options, ParserProperties.defaults().withAtSyntax(false));
+      parser.parseArgument(args);
+      if (options.path == null || Arrays.asList(".").equals(options.path)) {
+        options.path = Collections.emptyList();
+      }
+    } catch (CmdLineException e) {
+      throw new Failure(2, "fatal: unable to parse arguments, " + e);
+    }
+  }
+
+  @Override
+  protected void runImpl() throws IOException, PermissionBackendException, Failure {
+    PacketLineOut packetOut = new PacketLineOut(out);
+    packetOut.setFlushOnEnd(true);
+    packetOut.writeString("ACK");
+    packetOut.end();
+
+    try {
+      // Parse Git arguments
+      readArguments();
+
+      ArchiveFormat f = allowedFormats.getExtensions().get("." + options.format);
+      if (f == null) {
+        throw new Failure(3, "fatal: upload-archive not permitted for format " + options.format);
+      }
+
+      // Find out the object to get from the specified reference and paths
+      ObjectId treeId = repo.resolve(options.treeIsh);
+      if (treeId == null) {
+        throw new Failure(4, "fatal: reference not found: " + options.treeIsh);
+      }
+
+      // Verify the user has permissions to read the specified tree.
+      if (!canRead(treeId)) {
+        throw new Failure(5, "fatal: no permission to read tree" + options.treeIsh);
+      }
+
+      // The archive is sent in DATA sideband channel
+      try (SideBandOutputStream sidebandOut =
+          new SideBandOutputStream(
+              SideBandOutputStream.CH_DATA, SideBandOutputStream.MAX_BUF, out)) {
+        new ArchiveCommand(repo)
+            .setFormat(f.name())
+            .setFormatOptions(getFormatOptions(f))
+            .setTree(treeId)
+            .setPaths(options.path.toArray(new String[0]))
+            .setPrefix(options.prefix)
+            .setOutputStream(sidebandOut)
+            .call();
+        sidebandOut.flush();
+      } catch (GitAPIException e) {
+        throw new Failure(7, "fatal: git api exception, " + e);
+      }
+    } catch (Throwable t) {
+      // Report the error in ERROR sideband channel. Catch Throwable too so we can also catch
+      // NoClassDefFound.
+      try (SideBandOutputStream sidebandError =
+          new SideBandOutputStream(
+              SideBandOutputStream.CH_ERROR, SideBandOutputStream.MAX_BUF, out)) {
+        sidebandError.write(t.getMessage().getBytes(UTF_8));
+        sidebandError.flush();
+      }
+      throw t;
+    } finally {
+      // In any case, cleanly close the packetOut channel
+      packetOut.end();
+    }
+  }
+
+  private Map<String, Object> getFormatOptions(ArchiveFormat f) {
+    if (f == ArchiveFormat.ZIP) {
+      int value =
+          Arrays.asList(
+                  options.level0,
+                  options.level1,
+                  options.level2,
+                  options.level3,
+                  options.level4,
+                  options.level5,
+                  options.level6,
+                  options.level7,
+                  options.level8,
+                  options.level9)
+              .indexOf(true);
+      if (value >= 0) {
+        return ImmutableMap.<String, Object>of("level", Integer.valueOf(value));
+      }
+    }
+    return Collections.emptyMap();
+  }
+
+  private boolean canRead(ObjectId revId) throws IOException, PermissionBackendException {
+    ProjectState projectState = projectCache.get(projectName);
+    requireNonNull(projectState, () -> String.format("Failed to load project %s", projectName));
+
+    if (!projectState.statePermitsRead()) {
+      return false;
+    }
+
+    try {
+      permissionBackend.user(user).project(projectName).check(ProjectPermission.READ);
+      return true;
+    } catch (AuthException e) {
+      // Check reachability of the specific revision.
+      try (RevWalk rw = new RevWalk(repo)) {
+        RevCommit commit = rw.parseCommit(revId);
+        return commits.canRead(projectState, repo, commit);
+      }
+    }
+  }
+}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/VersionCommand.java b/java/com/google/gerrit/sshd/commands/VersionCommand.java
similarity index 100%
rename from gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/VersionCommand.java
rename to java/com/google/gerrit/sshd/commands/VersionCommand.java
diff --git a/java/com/google/gerrit/sshd/plugin/LfsPluginAuthCommand.java b/java/com/google/gerrit/sshd/plugin/LfsPluginAuthCommand.java
new file mode 100644
index 0000000..8fb2461
--- /dev/null
+++ b/java/com/google/gerrit/sshd/plugin/LfsPluginAuthCommand.java
@@ -0,0 +1,76 @@
+// Copyright (C) 2017 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.google.gerrit.sshd.plugin;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.sshd.CommandModule;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.inject.Inject;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.jgit.lib.Config;
+import org.kohsuke.args4j.Argument;
+
+public class LfsPluginAuthCommand extends SshCommand {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final String CONFIGURATION_ERROR =
+      "Server configuration error: LFS auth over SSH is not properly configured.";
+
+  public interface LfsSshPluginAuth {
+    String authenticate(CurrentUser user, List<String> args) throws UnloggedFailure, Failure;
+  }
+
+  public static class Module extends CommandModule {
+    private final boolean pluginProvided;
+
+    @Inject
+    Module(@GerritServerConfig Config cfg) {
+      pluginProvided = cfg.getString("lfs", null, "plugin") != null;
+    }
+
+    @Override
+    protected void configure() {
+      if (pluginProvided) {
+        command("git-lfs-authenticate").to(LfsPluginAuthCommand.class);
+        DynamicItem.itemOf(binder(), LfsSshPluginAuth.class);
+      }
+    }
+  }
+
+  private final DynamicItem<LfsSshPluginAuth> auth;
+
+  @Argument(index = 0, multiValued = true, metaVar = "PARAMS")
+  private List<String> args = new ArrayList<>();
+
+  @Inject
+  LfsPluginAuthCommand(DynamicItem<LfsSshPluginAuth> auth) {
+    this.auth = auth;
+  }
+
+  @Override
+  protected void run() throws UnloggedFailure, Exception {
+    LfsSshPluginAuth pluginAuth = auth.get();
+    if (pluginAuth == null) {
+      logger.atWarning().log(CONFIGURATION_ERROR);
+      throw new UnloggedFailure(1, CONFIGURATION_ERROR);
+    }
+
+    stdout.print(pluginAuth.authenticate(user, args));
+  }
+}
diff --git a/java/com/google/gerrit/testing/BUILD b/java/com/google/gerrit/testing/BUILD
new file mode 100644
index 0000000..71efda6
--- /dev/null
+++ b/java/com/google/gerrit/testing/BUILD
@@ -0,0 +1,49 @@
+java_library(
+    name = "gerrit-test-util",
+    testonly = True,
+    srcs = glob(["**/*.java"]),
+    visibility = ["//visibility:public"],
+    exports = [
+        "//lib/easymock",
+        "//lib/powermock:powermock-api-easymock",
+        "//lib/powermock:powermock-api-support",
+        "//lib/powermock:powermock-core",
+        "//lib/powermock:powermock-module-junit4",
+        "//lib/powermock:powermock-module-junit4-common",
+    ],
+    deps = [
+        "//java/com/google/gerrit/common:annotations",
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/gpg",
+        "//java/com/google/gerrit/index",
+        "//java/com/google/gerrit/index/project",
+        "//java/com/google/gerrit/lifecycle",
+        "//java/com/google/gerrit/mail",
+        "//java/com/google/gerrit/metrics",
+        "//java/com/google/gerrit/pgm/init",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/server:module",
+        "//java/com/google/gerrit/server/api",
+        "//java/com/google/gerrit/server/audit",
+        "//java/com/google/gerrit/server/cache/h2",
+        "//java/com/google/gerrit/server/cache/mem",
+        "//java/com/google/gerrit/server/logging",
+        "//java/com/google/gerrit/server/restapi",
+        "//java/com/google/gerrit/server/schema",
+        "//java/com/google/gerrit/server/util/time",
+        "//lib:guava",
+        "//lib:gwtorm",
+        "//lib:h2",
+        "//lib:junit",
+        "//lib/auto:auto-value",
+        "//lib/auto:auto-value-annotations",
+        "//lib/flogger:api",
+        "//lib/guice",
+        "//lib/guice:guice-servlet",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/jgit/org.eclipse.jgit.junit:junit",
+        "//lib/truth",
+    ],
+)
diff --git a/java/com/google/gerrit/testing/ConfigSuite.java b/java/com/google/gerrit/testing/ConfigSuite.java
new file mode 100644
index 0000000..9e45b7c
--- /dev/null
+++ b/java/com/google/gerrit/testing/ConfigSuite.java
@@ -0,0 +1,320 @@
+// Copyright (C) 2014 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.google.gerrit.testing;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static java.util.stream.Collectors.toSet;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.gerrit.server.logging.LoggingContext;
+import java.lang.annotation.Annotation;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.List;
+import java.util.Map;
+import org.junit.runner.Runner;
+import org.junit.runners.BlockJUnit4ClassRunner;
+import org.junit.runners.Suite;
+import org.junit.runners.model.FrameworkMethod;
+import org.junit.runners.model.InitializationError;
+
+/**
+ * Suite to run tests with different {@code gerrit.config} values.
+ *
+ * <p>For each {@link Config} method in the class and base classes, a new group of tests is created
+ * with the {@link Parameter} field set to the config.
+ *
+ * <pre>
+ * {@literal @}RunWith(ConfigSuite.class)
+ * public abstract class MyAbstractTest {
+ *   {@literal @}ConfigSuite.Parameter
+ *   protected Config cfg;
+ *
+ *   {@literal @}ConfigSuite.Config
+ *   public static Config firstConfig() {
+ *     Config cfg = new Config();
+ *     cfg.setString("gerrit", null, "testValue", "a");
+ *   }
+ * }
+ *
+ * public class MyTest extends MyAbstractTest {
+ *   {@literal @}ConfigSuite.Config
+ *   public static Config secondConfig() {
+ *     Config cfg = new Config();
+ *     cfg.setString("gerrit", null, "testValue", "b");
+ *   }
+ *
+ *   {@literal @}Test
+ *   public void myTest() {
+ *     // Test using cfg.
+ *   }
+ * }
+ * </pre>
+ *
+ * This creates a suite of tests with three groups:
+ *
+ * <ul>
+ *   <li><strong>default</strong>: {@code MyTest.myTest}
+ *   <li><strong>firstConfig</strong>: {@code MyTest.myTest[firstConfig]}
+ *   <li><strong>secondConfig</strong>: {@code MyTest.myTest[secondConfig]}
+ * </ul>
+ *
+ * Additionally, config values used by <strong>default</strong> can be set in a method annotated
+ * with {@code @ConfigSuite.Default}.
+ *
+ * <p>In addition groups of tests for different configurations can be defined by annotating a method
+ * that returns a Map&lt;String, Config&gt; with {@link Configs}. The map keys define the test suite
+ * names, while the values define the configurations for the test suites.
+ *
+ * <pre>
+ * {@literal @}ConfigSuite.Configs
+ * public static Map&lt;String, Config&gt; configs() {
+ *   Config cfgA = new Config();
+ *   cfgA.setString("gerrit", null, "testValue", "a");
+ *   Config cfgB = new Config();
+ *   cfgB.setString("gerrit", null, "testValue", "b");
+ *   return ImmutableMap.of("testWithValueA", cfgA, "testWithValueB", cfgB);
+ * }
+ * </pre>
+ *
+ * <p>The name of the config method corresponding to the currently-running test can be stored in a
+ * field annotated with {@code @ConfigSuite.Name}.
+ */
+public class ConfigSuite extends Suite {
+  private static final String FLOGGER_BACKEND_PROPERTY = "flogger.backend_factory";
+  private static final String FLOGGER_LOGGING_CONTEXT = "flogger.logging_context";
+
+  static {
+    System.setProperty(
+        FLOGGER_BACKEND_PROPERTY,
+        "com.google.common.flogger.backend.log4j.Log4jBackendFactory#getInstance");
+    System.setProperty(FLOGGER_LOGGING_CONTEXT, LoggingContext.class.getName() + "#getInstance");
+  }
+
+  public static final String DEFAULT = "default";
+
+  @Target({METHOD})
+  @Retention(RUNTIME)
+  public static @interface Default {}
+
+  @Target({METHOD})
+  @Retention(RUNTIME)
+  public static @interface Config {}
+
+  @Target({METHOD})
+  @Retention(RUNTIME)
+  public static @interface Configs {}
+
+  @Target({FIELD})
+  @Retention(RUNTIME)
+  public static @interface Parameter {}
+
+  @Target({FIELD})
+  @Retention(RUNTIME)
+  public static @interface Name {}
+
+  private static class ConfigRunner extends BlockJUnit4ClassRunner {
+    private final org.eclipse.jgit.lib.Config cfg;
+    private final Field parameterField;
+    private final Field nameField;
+    private final String name;
+
+    private ConfigRunner(
+        Class<?> clazz,
+        Field parameterField,
+        Field nameField,
+        String name,
+        org.eclipse.jgit.lib.Config cfg)
+        throws InitializationError {
+      super(clazz);
+      this.parameterField = parameterField;
+      this.nameField = nameField;
+      this.name = name;
+      this.cfg = cfg;
+    }
+
+    @Override
+    public Object createTest() throws Exception {
+      Object test = getTestClass().getJavaClass().getDeclaredConstructor().newInstance();
+      parameterField.set(test, new org.eclipse.jgit.lib.Config(cfg));
+      if (nameField != null) {
+        nameField.set(test, name);
+      }
+      return test;
+    }
+
+    @Override
+    protected String getName() {
+      return MoreObjects.firstNonNull(name, DEFAULT);
+    }
+
+    @Override
+    protected String testName(FrameworkMethod method) {
+      String n = method.getName();
+      return name == null ? n : n + "[" + name + "]";
+    }
+  }
+
+  private static List<Runner> runnersFor(Class<?> clazz) {
+    Method defaultConfig = getDefaultConfig(clazz);
+    List<Method> configs = getConfigs(clazz);
+    Map<String, org.eclipse.jgit.lib.Config> configMap =
+        callConfigMapMethod(getConfigMap(clazz), configs);
+
+    Field parameterField = getOnlyField(clazz, Parameter.class);
+    checkArgument(parameterField != null, "No @ConfigSuite.Parameter found");
+    Field nameField = getOnlyField(clazz, Name.class);
+    List<Runner> result = Lists.newArrayListWithCapacity(configs.size() + 1);
+    try {
+      result.add(
+          new ConfigRunner(
+              clazz, parameterField, nameField, null, callConfigMethod(defaultConfig)));
+      for (Method m : configs) {
+        result.add(
+            new ConfigRunner(clazz, parameterField, nameField, m.getName(), callConfigMethod(m)));
+      }
+      for (Map.Entry<String, org.eclipse.jgit.lib.Config> e : configMap.entrySet()) {
+        result.add(new ConfigRunner(clazz, parameterField, nameField, e.getKey(), e.getValue()));
+      }
+      return result;
+    } catch (InitializationError e) {
+      System.err.println("Errors initializing runners:");
+      for (Throwable t : e.getCauses()) {
+        t.printStackTrace();
+      }
+      throw new RuntimeException(e);
+    }
+  }
+
+  private static Method getDefaultConfig(Class<?> clazz) {
+    return getAnnotatedMethod(clazz, Default.class);
+  }
+
+  private static Method getConfigMap(Class<?> clazz) {
+    return getAnnotatedMethod(clazz, Configs.class);
+  }
+
+  private static <T extends Annotation> Method getAnnotatedMethod(
+      Class<?> clazz, Class<T> annotationClass) {
+    Method result = null;
+    for (Method m : clazz.getMethods()) {
+      T ann = m.getAnnotation(annotationClass);
+      if (ann != null) {
+        checkArgument(result == null, "Multiple methods annotated with %s: %s, %s", ann, result, m);
+        result = m;
+      }
+    }
+    return result;
+  }
+
+  private static List<Method> getConfigs(Class<?> clazz) {
+    List<Method> result = Lists.newArrayListWithExpectedSize(3);
+    for (Method m : clazz.getMethods()) {
+      Config ann = m.getAnnotation(Config.class);
+      if (ann != null) {
+        checkArgument(!m.getName().equals(DEFAULT), "%s cannot be named %s", ann, DEFAULT);
+        result.add(m);
+      }
+    }
+    return result;
+  }
+
+  private static org.eclipse.jgit.lib.Config callConfigMethod(Method m) {
+    if (m == null) {
+      return new org.eclipse.jgit.lib.Config();
+    }
+    checkArgument(
+        org.eclipse.jgit.lib.Config.class.isAssignableFrom(m.getReturnType()),
+        "%s must return Config",
+        m);
+    checkArgument((m.getModifiers() & Modifier.STATIC) != 0, "%s must be static", m);
+    checkArgument(m.getParameterTypes().length == 0, "%s must take no parameters", m);
+    try {
+      return (org.eclipse.jgit.lib.Config) m.invoke(null);
+    } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+      throw new IllegalArgumentException(e);
+    }
+  }
+
+  private static Map<String, org.eclipse.jgit.lib.Config> callConfigMapMethod(
+      Method m, List<Method> configs) {
+    if (m == null) {
+      return ImmutableMap.of();
+    }
+    checkArgument(Map.class.isAssignableFrom(m.getReturnType()), "%s must return Map", m);
+    Type[] types = ((ParameterizedType) m.getGenericReturnType()).getActualTypeArguments();
+    checkArgument(
+        String.class.isAssignableFrom((Class<?>) types[0]),
+        "The map returned by %s must have String as key",
+        m);
+    checkArgument(
+        org.eclipse.jgit.lib.Config.class.isAssignableFrom((Class<?>) types[1]),
+        "The map returned by %s must have Config as value",
+        m);
+    checkArgument((m.getModifiers() & Modifier.STATIC) != 0, "%s must be static", m);
+    checkArgument(m.getParameterTypes().length == 0, "%s must take no parameters", m);
+    try {
+      @SuppressWarnings("unchecked")
+      Map<String, org.eclipse.jgit.lib.Config> configMap =
+          (Map<String, org.eclipse.jgit.lib.Config>) m.invoke(null);
+      checkArgument(
+          !configMap.containsKey(DEFAULT),
+          "The map returned by %s cannot contain key %s (duplicate test suite name)",
+          m,
+          DEFAULT);
+      for (String name : configs.stream().map(Method::getName).collect(toSet())) {
+        checkArgument(
+            !configMap.containsKey(name),
+            "The map returned by %s cannot contain key %s (duplicate test suite name)",
+            m,
+            name);
+      }
+      return configMap;
+    } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+      throw new IllegalArgumentException(e);
+    }
+  }
+
+  private static Field getOnlyField(Class<?> clazz, Class<? extends Annotation> ann) {
+    List<Field> fields = Lists.newArrayListWithExpectedSize(1);
+    for (Field f : clazz.getFields()) {
+      if (f.getAnnotation(ann) != null) {
+        fields.add(f);
+      }
+    }
+    checkArgument(
+        fields.size() <= 1,
+        "expected 1 @ConfigSuite.%s field, found: %s",
+        ann.getSimpleName(),
+        fields);
+    return Iterables.getFirst(fields, null);
+  }
+
+  public ConfigSuite(Class<?> clazz) throws InitializationError {
+    super(clazz, runnersFor(clazz));
+  }
+}
diff --git a/java/com/google/gerrit/testing/DisabledReviewDb.java b/java/com/google/gerrit/testing/DisabledReviewDb.java
new file mode 100644
index 0000000..2bf95b0
--- /dev/null
+++ b/java/com/google/gerrit/testing/DisabledReviewDb.java
@@ -0,0 +1,111 @@
+// Copyright (C) 2015 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.google.gerrit.testing;
+
+import com.google.gerrit.reviewdb.server.ChangeAccess;
+import com.google.gerrit.reviewdb.server.ChangeMessageAccess;
+import com.google.gerrit.reviewdb.server.PatchLineCommentAccess;
+import com.google.gerrit.reviewdb.server.PatchSetAccess;
+import com.google.gerrit.reviewdb.server.PatchSetApprovalAccess;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.reviewdb.server.SchemaVersionAccess;
+import com.google.gwtorm.server.Access;
+import com.google.gwtorm.server.StatementExecutor;
+
+/** ReviewDb that is disabled for testing. */
+public class DisabledReviewDb implements ReviewDb {
+  public static class Disabled extends RuntimeException {
+    private static final long serialVersionUID = 1L;
+
+    private Disabled() {
+      super("ReviewDb is disabled for this test");
+    }
+  }
+
+  @Override
+  public void close() {
+    // Do nothing.
+  }
+
+  @Override
+  public void commit() {
+    throw new Disabled();
+  }
+
+  @Override
+  public void rollback() {
+    throw new Disabled();
+  }
+
+  @Override
+  public void updateSchema(StatementExecutor e) {
+    throw new Disabled();
+  }
+
+  @Override
+  public void pruneSchema(StatementExecutor e) {
+    throw new Disabled();
+  }
+
+  @Override
+  public Access<?, ?>[] allRelations() {
+    throw new Disabled();
+  }
+
+  @Override
+  public SchemaVersionAccess schemaVersion() {
+    throw new Disabled();
+  }
+
+  @Override
+  public ChangeAccess changes() {
+    throw new Disabled();
+  }
+
+  @Override
+  public PatchSetApprovalAccess patchSetApprovals() {
+    throw new Disabled();
+  }
+
+  @Override
+  public ChangeMessageAccess changeMessages() {
+    throw new Disabled();
+  }
+
+  @Override
+  public PatchSetAccess patchSets() {
+    throw new Disabled();
+  }
+
+  @Override
+  public PatchLineCommentAccess patchComments() {
+    throw new Disabled();
+  }
+
+  @Override
+  public int nextAccountId() {
+    throw new Disabled();
+  }
+
+  @Override
+  public int nextAccountGroupId() {
+    throw new Disabled();
+  }
+
+  @Override
+  public int nextChangeId() {
+    throw new Disabled();
+  }
+}
diff --git a/java/com/google/gerrit/testing/FakeAccountCache.java b/java/com/google/gerrit/testing/FakeAccountCache.java
new file mode 100644
index 0000000..b99a32d
--- /dev/null
+++ b/java/com/google/gerrit/testing/FakeAccountCache.java
@@ -0,0 +1,83 @@
+// Copyright (C) 2013 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.google.gerrit.testing;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Maps;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.AllUsersNameProvider;
+import com.google.gerrit.server.util.time.TimeUtil;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+
+/** Fake implementation of {@link AccountCache} for testing. */
+public class FakeAccountCache implements AccountCache {
+  private final Map<Account.Id, AccountState> byId;
+
+  public FakeAccountCache() {
+    byId = new HashMap<>();
+  }
+
+  @Override
+  public synchronized AccountState getEvenIfMissing(Account.Id accountId) {
+    AccountState state = byId.get(accountId);
+    if (state != null) {
+      return state;
+    }
+    return newState(new Account(accountId, TimeUtil.nowTs()));
+  }
+
+  @Override
+  public synchronized Optional<AccountState> get(Account.Id accountId) {
+    return Optional.ofNullable(byId.get(accountId));
+  }
+
+  @Override
+  public synchronized Map<Account.Id, AccountState> get(Set<Account.Id> accountIds) {
+    return ImmutableMap.copyOf(Maps.filterKeys(byId, accountIds::contains));
+  }
+
+  @Override
+  public synchronized Optional<AccountState> getByUsername(String username) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public synchronized void evict(@Nullable Account.Id accountId) {
+    if (byId != null) {
+      byId.remove(accountId);
+    }
+  }
+
+  @Override
+  public synchronized void evictAll() {
+    byId.clear();
+  }
+
+  public synchronized void put(Account account) {
+    AccountState state = newState(account);
+    byId.put(account.getId(), state);
+  }
+
+  private static AccountState newState(Account account) {
+    return AccountState.forAccount(new AllUsersName(AllUsersNameProvider.DEFAULT), account);
+  }
+}
diff --git a/java/com/google/gerrit/testing/FakeEmailSender.java b/java/com/google/gerrit/testing/FakeEmailSender.java
new file mode 100644
index 0000000..dbb83c0
--- /dev/null
+++ b/java/com/google/gerrit/testing/FakeEmailSender.java
@@ -0,0 +1,172 @@
+// Copyright (C) 2015 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.google.gerrit.testing;
+
+import static java.util.stream.Collectors.toList;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.errors.EmailException;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.mail.EmailHeader;
+import com.google.gerrit.mail.MailHeader;
+import com.google.gerrit.server.git.WorkQueue;
+import com.google.gerrit.server.mail.send.EmailSender;
+import com.google.inject.AbstractModule;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
+
+/**
+ * Email sender implementation that records messages in memory.
+ *
+ * <p>This class is mostly threadsafe. The only exception is that not all {@link EmailHeader}
+ * subclasses are immutable. In particular, if a caller holds a reference to an {@code AddressList}
+ * and mutates it after sending, the message returned by {@link #getMessages()} may or may not
+ * reflect mutations.
+ */
+@Singleton
+public class FakeEmailSender implements EmailSender {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public static class Module extends AbstractModule {
+    @Override
+    public void configure() {
+      bind(EmailSender.class).to(FakeEmailSender.class);
+    }
+  }
+
+  @AutoValue
+  public abstract static class Message {
+    private static Message create(
+        Address from,
+        Collection<Address> rcpt,
+        Map<String, EmailHeader> headers,
+        String body,
+        String htmlBody) {
+      return new AutoValue_FakeEmailSender_Message(
+          from, ImmutableList.copyOf(rcpt), ImmutableMap.copyOf(headers), body, htmlBody);
+    }
+
+    public abstract Address from();
+
+    public abstract ImmutableList<Address> rcpt();
+
+    public abstract ImmutableMap<String, EmailHeader> headers();
+
+    public abstract String body();
+
+    @Nullable
+    public abstract String htmlBody();
+  }
+
+  private final WorkQueue workQueue;
+  private final List<Message> messages;
+  private int messagesRead;
+
+  @Inject
+  FakeEmailSender(WorkQueue workQueue) {
+    this.workQueue = workQueue;
+    messages = Collections.synchronizedList(new ArrayList<Message>());
+    messagesRead = 0;
+  }
+
+  @Override
+  public boolean isEnabled() {
+    return true;
+  }
+
+  @Override
+  public boolean canEmail(String address) {
+    return true;
+  }
+
+  @Override
+  public void send(
+      Address from, Collection<Address> rcpt, Map<String, EmailHeader> headers, String body)
+      throws EmailException {
+    send(from, rcpt, headers, body, null);
+  }
+
+  @Override
+  public void send(
+      Address from,
+      Collection<Address> rcpt,
+      Map<String, EmailHeader> headers,
+      String body,
+      String htmlBody)
+      throws EmailException {
+    messages.add(Message.create(from, rcpt, headers, body, htmlBody));
+  }
+
+  public void clear() {
+    waitForEmails();
+    synchronized (messages) {
+      messages.clear();
+      messagesRead = 0;
+    }
+  }
+
+  public synchronized @Nullable Message peekMessage() {
+    if (messagesRead >= messages.size()) {
+      return null;
+    }
+    return messages.get(messagesRead);
+  }
+
+  public synchronized @Nullable Message nextMessage() {
+    Message msg = peekMessage();
+    messagesRead++;
+    return msg;
+  }
+
+  public ImmutableList<Message> getMessages() {
+    waitForEmails();
+    synchronized (messages) {
+      return ImmutableList.copyOf(messages);
+    }
+  }
+
+  public List<Message> getMessages(String changeId, String type) {
+    final String idFooter = "\n" + MailHeader.CHANGE_ID.withDelimiter() + changeId + "\n";
+    final String typeFooter = "\n" + MailHeader.MESSAGE_TYPE.withDelimiter() + type + "\n";
+    return getMessages().stream()
+        .filter(in -> in.body().contains(idFooter) && in.body().contains(typeFooter))
+        .collect(toList());
+  }
+
+  private void waitForEmails() {
+    // TODO(dborowitz): This is brittle; consider forcing emails to use
+    // a single thread in tests (tricky because most callers just use the
+    // default executor).
+    for (WorkQueue.Task<?> task : workQueue.getTasks()) {
+      if (task.toString().contains("send-email")) {
+        try {
+          task.get();
+        } catch (ExecutionException | InterruptedException e) {
+          logger.atWarning().withCause(e).log("error finishing email task");
+        }
+      }
+    }
+  }
+}
diff --git a/java/com/google/gerrit/testing/FakeGroupAuditService.java b/java/com/google/gerrit/testing/FakeGroupAuditService.java
new file mode 100644
index 0000000..f2e85cd
--- /dev/null
+++ b/java/com/google/gerrit/testing/FakeGroupAuditService.java
@@ -0,0 +1,112 @@
+// 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.
+
+package com.google.gerrit.testing;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.AuditEvent;
+import com.google.gerrit.server.audit.AuditListener;
+import com.google.gerrit.server.audit.group.GroupAuditListener;
+import com.google.gerrit.server.audit.group.GroupMemberAuditEvent;
+import com.google.gerrit.server.audit.group.GroupSubgroupAuditEvent;
+import com.google.gerrit.server.group.GroupAuditService;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.inject.AbstractModule;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.List;
+
+@Singleton
+public class FakeGroupAuditService implements GroupAuditService {
+
+  protected final PluginSetContext<GroupAuditListener> groupAuditListeners;
+  protected final PluginSetContext<AuditListener> auditListeners;
+
+  public static class Module extends AbstractModule {
+    @Override
+    public void configure() {
+      DynamicSet.setOf(binder(), GroupAuditListener.class);
+      DynamicSet.setOf(binder(), AuditListener.class);
+      bind(GroupAuditService.class).to(FakeGroupAuditService.class);
+    }
+  }
+
+  @Inject
+  public FakeGroupAuditService(
+      PluginSetContext<GroupAuditListener> groupAuditListeners,
+      PluginSetContext<AuditListener> auditListeners) {
+    this.groupAuditListeners = groupAuditListeners;
+    this.auditListeners = auditListeners;
+  }
+
+  public List<AuditEvent> auditEvents = new ArrayList<>();
+
+  public void clearEvents() {
+    auditEvents.clear();
+  }
+
+  @Override
+  public void dispatch(AuditEvent action) {
+    auditEvents.add(action);
+  }
+
+  @Override
+  public void dispatchAddMembers(
+      Account.Id actor,
+      AccountGroup.UUID updatedGroup,
+      ImmutableSet<Account.Id> addedMembers,
+      Timestamp addedOn) {
+    GroupMemberAuditEvent event =
+        GroupMemberAuditEvent.create(actor, updatedGroup, addedMembers, addedOn);
+    groupAuditListeners.runEach(l -> l.onAddMembers(event));
+  }
+
+  @Override
+  public void dispatchDeleteMembers(
+      Account.Id actor,
+      AccountGroup.UUID updatedGroup,
+      ImmutableSet<Account.Id> deletedMembers,
+      Timestamp deletedOn) {
+    GroupMemberAuditEvent event =
+        GroupMemberAuditEvent.create(actor, updatedGroup, deletedMembers, deletedOn);
+    groupAuditListeners.runEach(l -> l.onDeleteMembers(event));
+  }
+
+  @Override
+  public void dispatchAddSubgroups(
+      Account.Id actor,
+      AccountGroup.UUID updatedGroup,
+      ImmutableSet<AccountGroup.UUID> addedSubgroups,
+      Timestamp addedOn) {
+    GroupSubgroupAuditEvent event =
+        GroupSubgroupAuditEvent.create(actor, updatedGroup, addedSubgroups, addedOn);
+    groupAuditListeners.runEach(l -> l.onAddSubgroups(event));
+  }
+
+  @Override
+  public void dispatchDeleteSubgroups(
+      Account.Id actor,
+      AccountGroup.UUID updatedGroup,
+      ImmutableSet<AccountGroup.UUID> deletedSubgroups,
+      Timestamp deletedOn) {
+    GroupSubgroupAuditEvent event =
+        GroupSubgroupAuditEvent.create(actor, updatedGroup, deletedSubgroups, deletedOn);
+    groupAuditListeners.runEach(l -> l.onDeleteSubgroups(event));
+  }
+}
diff --git a/java/com/google/gerrit/testing/GerritBaseTests.java b/java/com/google/gerrit/testing/GerritBaseTests.java
new file mode 100644
index 0000000..01fb85d
--- /dev/null
+++ b/java/com/google/gerrit/testing/GerritBaseTests.java
@@ -0,0 +1,45 @@
+// Copyright (C) 2015 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.google.gerrit.testing;
+
+import com.google.common.base.CharMatcher;
+import com.google.gwtorm.client.KeyUtil;
+import com.google.gwtorm.server.StandardKeyEncoder;
+import org.junit.Ignore;
+import org.junit.Rule;
+import org.junit.rules.ExpectedException;
+import org.junit.rules.TestName;
+
+@Ignore
+public abstract class GerritBaseTests {
+  static {
+    KeyUtil.setEncoderImpl(new StandardKeyEncoder());
+  }
+
+  @Rule public ExpectedException exception = ExpectedException.none();
+  @Rule public final TestName testName = new TestName();
+
+  protected String getSanitizedMethodName() {
+    String name = testName.getMethodName().toLowerCase();
+    name =
+        CharMatcher.inRange('a', 'z')
+            .or(CharMatcher.inRange('A', 'Z'))
+            .or(CharMatcher.inRange('0', '9'))
+            .negate()
+            .replaceFrom(name, '_');
+    name = CharMatcher.is('_').trimTrailingFrom(name);
+    return name;
+  }
+}
diff --git a/java/com/google/gerrit/testing/GerritServerTests.java b/java/com/google/gerrit/testing/GerritServerTests.java
new file mode 100644
index 0000000..69806e1
--- /dev/null
+++ b/java/com/google/gerrit/testing/GerritServerTests.java
@@ -0,0 +1,59 @@
+// Copyright (C) 2013 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.google.gerrit.testing;
+
+import com.google.gerrit.server.notedb.MutableNotesMigration;
+import org.eclipse.jgit.lib.Config;
+import org.junit.Rule;
+import org.junit.rules.TestRule;
+import org.junit.runner.Description;
+import org.junit.runner.RunWith;
+import org.junit.runners.model.Statement;
+
+@RunWith(ConfigSuite.class)
+public class GerritServerTests extends GerritBaseTests {
+  @ConfigSuite.Parameter public Config config;
+
+  @ConfigSuite.Name private String configName;
+
+  protected MutableNotesMigration notesMigration;
+
+  @Rule
+  public TestRule testRunner =
+      new TestRule() {
+        @Override
+        public Statement apply(Statement base, Description description) {
+          return new Statement() {
+            @Override
+            public void evaluate() throws Throwable {
+              beforeTest();
+              try {
+                base.evaluate();
+              } finally {
+                afterTest();
+              }
+            }
+          };
+        }
+      };
+
+  public void beforeTest() throws Exception {
+    notesMigration = NoteDbMode.newNotesMigrationFromEnv();
+  }
+
+  public void afterTest() {
+    NoteDbMode.resetFromEnv(notesMigration);
+  }
+}
diff --git a/java/com/google/gerrit/testing/GitTestUtil.java b/java/com/google/gerrit/testing/GitTestUtil.java
new file mode 100644
index 0000000..71dd725
--- /dev/null
+++ b/java/com/google/gerrit/testing/GitTestUtil.java
@@ -0,0 +1,51 @@
+// 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.
+
+package com.google.gerrit.testing;
+
+import static com.google.common.collect.ImmutableList.toImmutableList;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Streams;
+import com.google.gerrit.extensions.common.CommitInfo;
+import com.google.gerrit.server.git.CommitUtil;
+import java.io.IOException;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevSort;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+public class GitTestUtil {
+  public static ImmutableList<CommitInfo> log(Repository repo, String refName) throws Exception {
+    try (RevWalk rw = new RevWalk(repo)) {
+      Ref ref = repo.exactRef(refName);
+      if (ref != null) {
+        rw.sort(RevSort.REVERSE);
+        rw.markStart(rw.parseCommit(ref.getObjectId()));
+        return Streams.stream(rw)
+            .map(
+                c -> {
+                  try {
+                    return CommitUtil.toCommitInfo(c);
+                  } catch (IOException e) {
+                    throw new IllegalStateException(
+                        "unexpected state when converting commit " + c.getName(), e);
+                  }
+                })
+            .collect(toImmutableList());
+      }
+    }
+    return ImmutableList.of();
+  }
+}
diff --git a/java/com/google/gerrit/testing/InMemoryDatabase.java b/java/com/google/gerrit/testing/InMemoryDatabase.java
new file mode 100644
index 0000000..66a5290
--- /dev/null
+++ b/java/com/google/gerrit/testing/InMemoryDatabase.java
@@ -0,0 +1,194 @@
+// Copyright (C) 2009 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.google.gerrit.testing;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.lifecycle.LifecycleManager;
+import com.google.gerrit.pgm.init.index.elasticsearch.ElasticIndexModuleOnInit;
+import com.google.gerrit.pgm.init.index.lucene.LuceneIndexModuleOnInit;
+import com.google.gerrit.reviewdb.client.CurrentSchemaVersion;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.index.IndexModule;
+import com.google.gerrit.server.schema.SchemaCreator;
+import com.google.gerrit.server.schema.SchemaVersion;
+import com.google.gwtorm.jdbc.Database;
+import com.google.gwtorm.jdbc.SimpleDataSource;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Properties;
+import javax.sql.DataSource;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+/**
+ * An in-memory test instance of {@link ReviewDb} database.
+ *
+ * <p>Test classes should create one instance of this class for each unique test database they want
+ * to use. When the tests needing this instance are complete, ensure that {@link
+ * #drop(InMemoryDatabase)} is called to free the resources so the JVM running the unit tests
+ * doesn't run out of heap space.
+ */
+public class InMemoryDatabase implements SchemaFactory<ReviewDb> {
+  public static InMemoryDatabase newDatabase(LifecycleManager lifecycle) {
+    Injector injector = Guice.createInjector(new InMemoryModule());
+    lifecycle.add(injector);
+    return injector.getInstance(InMemoryDatabase.class);
+  }
+
+  /** Drop the database from memory; does nothing if the instance was null. */
+  public static void drop(InMemoryDatabase db) {
+    if (db != null) {
+      db.dbInstance.drop();
+    }
+  }
+
+  private final SchemaCreator schemaCreator;
+  private final Instance dbInstance;
+
+  private boolean created;
+
+  @Inject
+  InMemoryDatabase(Injector injector) throws OrmException {
+    Injector childInjector =
+        injector.createChildInjector(
+            new AbstractModule() {
+              @Override
+              protected void configure() {
+                switch (IndexModule.getIndexType(injector)) {
+                  case LUCENE:
+                    install(new LuceneIndexModuleOnInit());
+                    break;
+                  case ELASTICSEARCH:
+                    install(new ElasticIndexModuleOnInit());
+                    break;
+                  default:
+                    throw new IllegalStateException("unsupported index.type");
+                }
+              }
+            });
+    this.schemaCreator = childInjector.getInstance(SchemaCreator.class);
+    Instance dbInstanceFromInjector = childInjector.getInstance(Instance.class);
+    if (dbInstanceFromInjector != null) {
+      this.dbInstance = dbInstanceFromInjector;
+      this.created = true;
+    } else {
+      this.dbInstance = new Instance();
+    }
+  }
+
+  InMemoryDatabase(SchemaCreator schemaCreator) throws OrmException {
+    this.schemaCreator = schemaCreator;
+    this.dbInstance = new Instance();
+  }
+
+  public Instance getDbInstance() {
+    return dbInstance;
+  }
+
+  public Database<ReviewDb> getDatabase() {
+    return dbInstance.database;
+  }
+
+  @Override
+  public ReviewDb open() throws OrmException {
+    return getDatabase().open();
+  }
+
+  /** Ensure the database schema has been created and initialized. */
+  public InMemoryDatabase create() throws OrmException {
+    if (!created) {
+      created = true;
+      try (ReviewDb c = open()) {
+        schemaCreator.create(c);
+      } catch (IOException | ConfigInvalidException e) {
+        throw new OrmException("Cannot create in-memory database", e);
+      }
+    }
+    return this;
+  }
+
+  public CurrentSchemaVersion getSchemaVersion() throws OrmException {
+    try (ReviewDb c = open()) {
+      return c.schemaVersion().get(new CurrentSchemaVersion.Key());
+    }
+  }
+
+  public void assertSchemaVersion() throws OrmException {
+    assertThat(getSchemaVersion().versionNbr).isEqualTo(SchemaVersion.getBinaryVersion());
+  }
+
+  public static class Instance {
+    private static int dbCnt;
+
+    private Connection openHandle;
+    private Database<ReviewDb> database;
+    private boolean keepOpen;
+
+    private static synchronized DataSource newDataSource() throws SQLException {
+      final Properties p = new Properties();
+      p.setProperty("driver", org.h2.Driver.class.getName());
+      p.setProperty("url", "jdbc:h2:mem:Test_" + (++dbCnt));
+      return new SimpleDataSource(p);
+    }
+
+    private Instance() throws OrmException {
+      try {
+        DataSource dataSource = newDataSource();
+
+        // Open one connection. This will peg the database into memory
+        // until someone calls drop on us, allowing subsequent connections
+        // opened against the same URL to go to the same set of tables.
+        //
+        openHandle = dataSource.getConnection();
+
+        // Build the access layer around the connection factory.
+        //
+        database = new Database<>(dataSource, ReviewDb.class);
+
+      } catch (SQLException e) {
+        throw new OrmException(e);
+      }
+    }
+
+    public void setKeepOpen(boolean keepOpen) {
+      this.keepOpen = keepOpen;
+    }
+
+    /** Drop this database from memory so it no longer exists. */
+    public void drop() {
+      if (keepOpen) {
+        return;
+      }
+
+      if (openHandle != null) {
+        try {
+          openHandle.close();
+        } catch (SQLException e) {
+          System.err.println("WARNING: Cannot close database connection");
+          e.printStackTrace(System.err);
+        }
+        openHandle = null;
+        database = null;
+      }
+    }
+  }
+}
diff --git a/java/com/google/gerrit/testing/InMemoryH2Type.java b/java/com/google/gerrit/testing/InMemoryH2Type.java
new file mode 100644
index 0000000..ae3bf36
--- /dev/null
+++ b/java/com/google/gerrit/testing/InMemoryH2Type.java
@@ -0,0 +1,30 @@
+// Copyright (C) 2012 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.google.gerrit.testing;
+
+import com.google.gerrit.server.schema.BaseDataSourceType;
+
+public class InMemoryH2Type extends BaseDataSourceType {
+
+  protected InMemoryH2Type() {
+    super(null);
+  }
+
+  @Override
+  public String getUrl() {
+    // not used
+    throw new UnsupportedOperationException();
+  }
+}
diff --git a/java/com/google/gerrit/testing/InMemoryModule.java b/java/com/google/gerrit/testing/InMemoryModule.java
new file mode 100644
index 0000000..18dfea0
--- /dev/null
+++ b/java/com/google/gerrit/testing/InMemoryModule.java
@@ -0,0 +1,357 @@
+// Copyright (C) 2013 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.google.gerrit.testing;
+
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.inject.Scopes.SINGLETON;
+
+import com.google.common.base.Strings;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.common.util.concurrent.MoreExecutors;
+import com.google.gerrit.extensions.client.AuthType;
+import com.google.gerrit.extensions.config.FactoryModule;
+import com.google.gerrit.extensions.systemstatus.ServerInformation;
+import com.google.gerrit.gpg.GpgModule;
+import com.google.gerrit.index.SchemaDefinitions;
+import com.google.gerrit.index.project.ProjectSchemaDefinitions;
+import com.google.gerrit.metrics.DisabledMetricMaker;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.FanOutExecutor;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.GerritPersonIdentProvider;
+import com.google.gerrit.server.PluginUser;
+import com.google.gerrit.server.api.GerritApiModule;
+import com.google.gerrit.server.api.PluginApiModule;
+import com.google.gerrit.server.audit.AuditModule;
+import com.google.gerrit.server.cache.h2.H2CacheModule;
+import com.google.gerrit.server.cache.mem.DefaultMemoryCacheModule;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.AllProjectsNameProvider;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.AllUsersNameProvider;
+import com.google.gerrit.server.config.AnonymousCowardName;
+import com.google.gerrit.server.config.AnonymousCowardNameProvider;
+import com.google.gerrit.server.config.CanonicalWebUrlModule;
+import com.google.gerrit.server.config.CanonicalWebUrlProvider;
+import com.google.gerrit.server.config.ChangeUpdateExecutor;
+import com.google.gerrit.server.config.DefaultUrlFormatter;
+import com.google.gerrit.server.config.GerritGlobalModule;
+import com.google.gerrit.server.config.GerritInstanceNameModule;
+import com.google.gerrit.server.config.GerritOptions;
+import com.google.gerrit.server.config.GerritRuntime;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.GerritServerId;
+import com.google.gerrit.server.config.GerritServerIdProvider;
+import com.google.gerrit.server.config.SendEmailExecutor;
+import com.google.gerrit.server.config.SitePath;
+import com.google.gerrit.server.config.TrackingFooters;
+import com.google.gerrit.server.config.TrackingFootersProvider;
+import com.google.gerrit.server.git.GarbageCollection;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.PerThreadRequestScope;
+import com.google.gerrit.server.git.SearchingChangeCacheImpl;
+import com.google.gerrit.server.git.WorkQueue;
+import com.google.gerrit.server.index.IndexModule.IndexType;
+import com.google.gerrit.server.index.account.AccountSchemaDefinitions;
+import com.google.gerrit.server.index.account.AllAccountsIndexer;
+import com.google.gerrit.server.index.change.AllChangesIndexer;
+import com.google.gerrit.server.index.change.ChangeSchemaDefinitions;
+import com.google.gerrit.server.index.group.AllGroupsIndexer;
+import com.google.gerrit.server.index.group.GroupSchemaDefinitions;
+import com.google.gerrit.server.mail.SignedTokenEmailTokenVerifier;
+import com.google.gerrit.server.notedb.ChangeBundleReader;
+import com.google.gerrit.server.notedb.GwtormChangeBundleReader;
+import com.google.gerrit.server.notedb.MutableNotesMigration;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gerrit.server.patch.DiffExecutor;
+import com.google.gerrit.server.permissions.DefaultPermissionBackendModule;
+import com.google.gerrit.server.plugins.ServerInformationImpl;
+import com.google.gerrit.server.project.DefaultProjectNameLockManager;
+import com.google.gerrit.server.restapi.RestApiModule;
+import com.google.gerrit.server.schema.DataSourceType;
+import com.google.gerrit.server.schema.InMemoryAccountPatchReviewStore;
+import com.google.gerrit.server.schema.NotesMigrationSchemaFactory;
+import com.google.gerrit.server.schema.ReviewDbFactory;
+import com.google.gerrit.server.schema.SchemaCreator;
+import com.google.gerrit.server.securestore.DefaultSecureStore;
+import com.google.gerrit.server.securestore.SecureStore;
+import com.google.gerrit.server.ssh.NoSshKeyCache;
+import com.google.gerrit.server.submit.LocalMergeSuperSetComputation;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import com.google.inject.Module;
+import com.google.inject.Provider;
+import com.google.inject.Provides;
+import com.google.inject.ProvisionException;
+import com.google.inject.Singleton;
+import com.google.inject.TypeLiteral;
+import com.google.inject.servlet.RequestScoped;
+import com.google.inject.util.Providers;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.PersonIdent;
+
+public class InMemoryModule extends FactoryModule {
+  public static Config newDefaultConfig() {
+    Config cfg = new Config();
+    setDefaults(cfg);
+    return cfg;
+  }
+
+  public static void setDefaults(Config cfg) {
+    cfg.setEnum("auth", null, "type", AuthType.DEVELOPMENT_BECOME_ANY_ACCOUNT);
+    cfg.setString("gerrit", null, "allProjects", "Test-Projects");
+    cfg.setString("gerrit", null, "basePath", "git");
+    cfg.setString("gerrit", null, "canonicalWebUrl", "http://test/");
+    cfg.setString("user", null, "name", "Gerrit Code Review");
+    cfg.setString("user", null, "email", "gerrit@localhost");
+    cfg.unset("cache", null, "directory");
+    cfg.setString("index", null, "type", "lucene");
+    cfg.setBoolean("index", "lucene", "testInmemory", true);
+    cfg.setInt("sendemail", null, "threadPoolSize", 0);
+    cfg.setBoolean("receive", null, "enableSignedPush", false);
+    cfg.setString("receive", null, "certNonceSeed", "sekret");
+  }
+
+  private final Config cfg;
+  private final MutableNotesMigration notesMigration;
+
+  public InMemoryModule() {
+    this(newDefaultConfig(), NoteDbMode.newNotesMigrationFromEnv());
+  }
+
+  public InMemoryModule(Config cfg, MutableNotesMigration notesMigration) {
+    this.cfg = cfg;
+    this.notesMigration = notesMigration;
+  }
+
+  public void inject(Object instance) {
+    Guice.createInjector(this).injectMembers(instance);
+  }
+
+  @Override
+  protected void configure() {
+    // Do NOT bind @RemotePeer, as it is bound in a child injector of
+    // ChangeMergeQueue (bound via GerritGlobalModule below), so there cannot be
+    // a binding in the parent injector. If you need @RemotePeer, you must bind
+    // it in a child injector of the one containing InMemoryModule. But unless
+    // you really need to test something request-scoped, you likely don't
+    // actually need it.
+
+    // For simplicity, don't create child injectors, just use this one to get a
+    // few required modules.
+    Injector cfgInjector =
+        Guice.createInjector(
+            new AbstractModule() {
+              @Override
+              protected void configure() {
+                bind(Config.class).annotatedWith(GerritServerConfig.class).toInstance(cfg);
+              }
+            });
+    bind(GerritRuntime.class).toInstance(GerritRuntime.DAEMON);
+    bind(MetricMaker.class).to(DisabledMetricMaker.class);
+    install(cfgInjector.getInstance(GerritGlobalModule.class));
+    install(new GerritApiModule());
+    factory(PluginUser.Factory.class);
+    install(new PluginApiModule());
+    install(new DefaultPermissionBackendModule());
+    install(new SearchingChangeCacheImpl.Module());
+    factory(GarbageCollection.Factory.class);
+    install(new AuditModule());
+
+    bindScope(RequestScoped.class, PerThreadRequestScope.REQUEST);
+
+    // TODO(dborowitz): Use Jimfs. The biggest blocker is that JGit does not support Path-based
+    // Configs, only FileBasedConfig.
+    bind(Path.class).annotatedWith(SitePath.class).toInstance(Paths.get("."));
+    bind(Config.class).annotatedWith(GerritServerConfig.class).toInstance(cfg);
+    bind(GerritOptions.class).toInstance(new GerritOptions(cfg, false, false, false));
+    bind(PersonIdent.class)
+        .annotatedWith(GerritPersonIdent.class)
+        .toProvider(GerritPersonIdentProvider.class);
+    bind(String.class)
+        .annotatedWith(AnonymousCowardName.class)
+        .toProvider(AnonymousCowardNameProvider.class);
+
+    bind(AllProjectsName.class).toProvider(AllProjectsNameProvider.class);
+    bind(AllUsersName.class).toProvider(AllUsersNameProvider.class);
+    bind(GitRepositoryManager.class).to(InMemoryRepositoryManager.class);
+    bind(InMemoryRepositoryManager.class).in(SINGLETON);
+    bind(TrackingFooters.class).toProvider(TrackingFootersProvider.class).in(SINGLETON);
+    bind(MutableNotesMigration.class).toInstance(notesMigration);
+    bind(NotesMigration.class).to(MutableNotesMigration.class);
+    bind(ListeningExecutorService.class)
+        .annotatedWith(ChangeUpdateExecutor.class)
+        .toInstance(MoreExecutors.newDirectExecutorService());
+    bind(DataSourceType.class).to(InMemoryH2Type.class);
+    bind(ChangeBundleReader.class).to(GwtormChangeBundleReader.class);
+    bind(SecureStore.class).to(DefaultSecureStore.class);
+
+    TypeLiteral<SchemaFactory<ReviewDb>> schemaFactory =
+        new TypeLiteral<SchemaFactory<ReviewDb>>() {};
+    bind(schemaFactory).to(NotesMigrationSchemaFactory.class);
+    bind(Key.get(schemaFactory, ReviewDbFactory.class)).to(InMemoryDatabase.class);
+
+    install(NoSshKeyCache.module());
+    install(new GerritInstanceNameModule());
+    install(
+        new CanonicalWebUrlModule() {
+          @Override
+          protected Class<? extends Provider<String>> provider() {
+            return CanonicalWebUrlProvider.class;
+          }
+        });
+    install(new DefaultUrlFormatter.Module());
+    // Replacement of DiffExecutorModule to not use thread pool in the tests
+    install(
+        new AbstractModule() {
+          @Override
+          protected void configure() {}
+
+          @Provides
+          @Singleton
+          @DiffExecutor
+          public ExecutorService createDiffExecutor() {
+            return MoreExecutors.newDirectExecutorService();
+          }
+        });
+    install(new DefaultMemoryCacheModule());
+    install(new H2CacheModule());
+    install(new FakeEmailSender.Module());
+    install(new SignedTokenEmailTokenVerifier.Module());
+    install(new GpgModule(cfg));
+    install(new InMemoryAccountPatchReviewStore.Module());
+    install(new LocalMergeSuperSetComputation.Module());
+
+    bind(AllAccountsIndexer.class).toProvider(Providers.of(null));
+    bind(AllChangesIndexer.class).toProvider(Providers.of(null));
+    bind(AllGroupsIndexer.class).toProvider(Providers.of(null));
+
+    IndexType indexType = null;
+    try {
+      indexType = cfg.getEnum("index", null, "type", IndexType.LUCENE);
+    } catch (IllegalArgumentException e) {
+      // Custom index type, caller must provide their own module.
+    }
+    if (indexType != null) {
+      switch (indexType) {
+        case LUCENE:
+          install(luceneIndexModule());
+          break;
+        case ELASTICSEARCH:
+          install(elasticIndexModule());
+          break;
+        default:
+          throw new ProvisionException("index type unsupported in tests: " + indexType);
+      }
+    }
+    bind(ServerInformationImpl.class);
+    bind(ServerInformation.class).to(ServerInformationImpl.class);
+    install(new RestApiModule());
+    install(new DefaultProjectNameLockManager.Module());
+  }
+
+  @Provides
+  @Singleton
+  @SendEmailExecutor
+  public ExecutorService createSendEmailExecutor() {
+    return MoreExecutors.newDirectExecutorService();
+  }
+
+  @Provides
+  @Singleton
+  @FanOutExecutor
+  public ExecutorService createFanOutExecutor(WorkQueue queues) {
+    return queues.createQueue(2, "FanOut");
+  }
+
+  @Provides
+  @Singleton
+  @GerritServerId
+  public String createServerId() {
+    String serverId =
+        cfg.getString(GerritServerIdProvider.SECTION, null, GerritServerIdProvider.KEY);
+    if (!Strings.isNullOrEmpty(serverId)) {
+      return serverId;
+    }
+
+    return "gerrit";
+  }
+
+  @Provides
+  @Singleton
+  InMemoryDatabase getInMemoryDatabase(SchemaCreator schemaCreator) throws OrmException {
+    return new InMemoryDatabase(schemaCreator);
+  }
+
+  private Module luceneIndexModule() {
+    return indexModule("com.google.gerrit.lucene.LuceneIndexModule");
+  }
+
+  private Module elasticIndexModule() {
+    return indexModule("com.google.gerrit.elasticsearch.ElasticIndexModule");
+  }
+
+  private Module indexModule(String moduleClassName) {
+    try {
+      boolean slave = cfg.getBoolean("container", "slave", false);
+      Class<?> clazz = Class.forName(moduleClassName);
+      Method m =
+          clazz.getMethod("singleVersionWithExplicitVersions", Map.class, int.class, boolean.class);
+      return (Module) m.invoke(null, getSingleSchemaVersions(), 0, slave);
+    } catch (ClassNotFoundException
+        | SecurityException
+        | NoSuchMethodException
+        | IllegalArgumentException
+        | IllegalAccessException
+        | InvocationTargetException e) {
+      e.printStackTrace();
+      throw new ProvisionException(e.getMessage(), e);
+    }
+  }
+
+  private Map<String, Integer> getSingleSchemaVersions() {
+    Map<String, Integer> singleVersions = new HashMap<>();
+    putSchemaVersion(singleVersions, AccountSchemaDefinitions.INSTANCE);
+    putSchemaVersion(singleVersions, ChangeSchemaDefinitions.INSTANCE);
+    putSchemaVersion(singleVersions, GroupSchemaDefinitions.INSTANCE);
+    putSchemaVersion(singleVersions, ProjectSchemaDefinitions.INSTANCE);
+    return singleVersions;
+  }
+
+  private void putSchemaVersion(
+      Map<String, Integer> singleVersions, SchemaDefinitions<?> schemaDef) {
+    String schemaName = schemaDef.getName();
+    int version = cfg.getInt("index", "lucene", schemaName + "TestVersion", -1);
+    if (version > 0) {
+      checkState(
+          !singleVersions.containsKey(schemaName),
+          "version for schema %s was alreay set",
+          schemaName);
+      singleVersions.put(schemaName, version);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/testing/InMemoryRepositoryManager.java b/java/com/google/gerrit/testing/InMemoryRepositoryManager.java
new file mode 100644
index 0000000..e44d8d38
--- /dev/null
+++ b/java/com/google/gerrit/testing/InMemoryRepositoryManager.java
@@ -0,0 +1,127 @@
+// Copyright (C) 2013 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.google.gerrit.testing;
+
+import com.google.common.collect.ImmutableSortedSet;
+import com.google.common.collect.Sets;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.RepositoryCaseMismatchException;
+import com.google.inject.Inject;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.SortedSet;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.internal.storage.dfs.DfsRepository;
+import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+
+/** Repository manager that uses in-memory repositories. */
+public class InMemoryRepositoryManager implements GitRepositoryManager {
+  public static InMemoryRepository newRepository(Project.NameKey name) {
+    return new Repo(name);
+  }
+
+  public static class Description extends DfsRepositoryDescription {
+    private final Project.NameKey name;
+
+    private Description(Project.NameKey name) {
+      super(name.get());
+      this.name = name;
+    }
+
+    public Project.NameKey getProject() {
+      return name;
+    }
+  }
+
+  public static class Repo extends InMemoryRepository {
+    private String description;
+
+    private Repo(Project.NameKey name) {
+      super(new Description(name));
+      setPerformsAtomicTransactions(true);
+    }
+
+    @Override
+    public Description getDescription() {
+      return (Description) super.getDescription();
+    }
+
+    @Override
+    public String getGitwebDescription() {
+      return description;
+    }
+
+    @Override
+    public void setGitwebDescription(String d) {
+      description = d;
+    }
+  }
+
+  private final Map<String, Repo> repos;
+
+  @Inject
+  public InMemoryRepositoryManager() {
+    this.repos = new HashMap<>();
+  }
+
+  @Override
+  public synchronized Repo openRepository(Project.NameKey name) throws RepositoryNotFoundException {
+    return get(name);
+  }
+
+  @Override
+  public synchronized Repo createRepository(Project.NameKey name)
+      throws RepositoryCaseMismatchException, RepositoryNotFoundException {
+    Repo repo;
+    try {
+      repo = get(name);
+      if (!repo.getDescription().getRepositoryName().equals(name.get())) {
+        throw new RepositoryCaseMismatchException(name);
+      }
+    } catch (RepositoryNotFoundException e) {
+      repo = new Repo(name);
+      repos.put(normalize(name), repo);
+    }
+    return repo;
+  }
+
+  @Override
+  public synchronized SortedSet<Project.NameKey> list() {
+    SortedSet<Project.NameKey> names = Sets.newTreeSet();
+    for (DfsRepository repo : repos.values()) {
+      names.add(new Project.NameKey(repo.getDescription().getRepositoryName()));
+    }
+    return ImmutableSortedSet.copyOf(names);
+  }
+
+  public synchronized void deleteRepository(Project.NameKey name) {
+    repos.remove(normalize(name));
+  }
+
+  private synchronized Repo get(Project.NameKey name) throws RepositoryNotFoundException {
+    Repo repo = repos.get(normalize(name));
+    if (repo != null) {
+      repo.incrementOpen();
+      return repo;
+    }
+    throw new RepositoryNotFoundException(name.get());
+  }
+
+  private static String normalize(Project.NameKey name) {
+    return name.get().toLowerCase();
+  }
+}
diff --git a/java/com/google/gerrit/testing/InMemoryTestEnvironment.java b/java/com/google/gerrit/testing/InMemoryTestEnvironment.java
new file mode 100644
index 0000000..cebd139
--- /dev/null
+++ b/java/com/google/gerrit/testing/InMemoryTestEnvironment.java
@@ -0,0 +1,144 @@
+// Copyright (C) 2017 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.google.gerrit.testing;
+
+import com.google.gerrit.lifecycle.LifecycleManager;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountManager;
+import com.google.gerrit.server.account.AuthRequest;
+import com.google.gerrit.server.schema.SchemaCreator;
+import com.google.gerrit.server.util.RequestContext;
+import com.google.gerrit.server.util.ThreadLocalRequestContext;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.Guice;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Provider;
+import com.google.inject.util.Providers;
+import org.eclipse.jgit.lib.Config;
+import org.junit.rules.MethodRule;
+import org.junit.runners.model.FrameworkMethod;
+import org.junit.runners.model.Statement;
+
+/**
+ * An in-memory test environment for integration tests.
+ *
+ * <p>This test environment emulates the internals of a Gerrit server without starting a Gerrit
+ * site. ReviewDb as well as NoteDb are represented by in-memory representations.
+ *
+ * <p>Each test is executed with a fresh and clean test environment. Hence, modifications applied in
+ * one test don't carry over to subsequent ones.
+ */
+public final class InMemoryTestEnvironment implements MethodRule {
+  private final Provider<Config> configProvider;
+
+  @Inject private AccountManager accountManager;
+  @Inject private IdentifiedUser.GenericFactory userFactory;
+  @Inject private SchemaFactory<ReviewDb> schemaFactory;
+  @Inject private SchemaCreator schemaCreator;
+  @Inject private ThreadLocalRequestContext requestContext;
+  // Only for use in setting up/tearing down injector.
+  @Inject private InMemoryDatabase inMemoryDatabase;
+
+  private ReviewDb db;
+  private LifecycleManager lifecycle;
+
+  /** Create a test environment using an empty base config. */
+  public InMemoryTestEnvironment() {
+    this(Config::new);
+  }
+
+  /**
+   * Create a test environment using the specified base config.
+   *
+   * <p>The config is passed as a provider so it can be lazily initialized after this rule is
+   * instantiated, for example using {@link ConfigSuite}.
+   *
+   * @param configProvider possibly-lazy provider for the base config.
+   */
+  public InMemoryTestEnvironment(Provider<Config> configProvider) {
+    this.configProvider = configProvider;
+  }
+
+  @Override
+  public Statement apply(Statement base, FrameworkMethod method, Object target) {
+    return new Statement() {
+      @Override
+      public void evaluate() throws Throwable {
+        try {
+          setUp(target);
+          base.evaluate();
+        } finally {
+          tearDown();
+        }
+      }
+    };
+  }
+
+  public void setApiUser(Account.Id id) {
+    IdentifiedUser user = userFactory.create(id);
+    requestContext.setContext(
+        new RequestContext() {
+          @Override
+          public CurrentUser getUser() {
+            return user;
+          }
+
+          @Override
+          public Provider<ReviewDb> getReviewDbProvider() {
+            return Providers.of(db);
+          }
+        });
+  }
+
+  private void setUp(Object target) throws Exception {
+    Config cfg = configProvider.get();
+    InMemoryModule.setDefaults(cfg);
+
+    Injector injector =
+        Guice.createInjector(new InMemoryModule(cfg, NoteDbMode.newNotesMigrationFromEnv()));
+    injector.injectMembers(this);
+    lifecycle = new LifecycleManager();
+    lifecycle.add(injector);
+    lifecycle.start();
+
+    try (ReviewDb underlyingDb = inMemoryDatabase.getDatabase().open()) {
+      schemaCreator.create(underlyingDb);
+    }
+    db = schemaFactory.open();
+
+    // The first user is added to the "Administrators" group. See AccountManager#create().
+    setApiUser(accountManager.authenticate(AuthRequest.forUser("admin")).getAccountId());
+
+    // Inject target members after setting API user, so it can @Inject a ReviewDb if it wants.
+    injector.injectMembers(target);
+  }
+
+  private void tearDown() {
+    if (lifecycle != null) {
+      lifecycle.stop();
+    }
+    if (requestContext != null) {
+      requestContext.setContext(null);
+    }
+    if (db != null) {
+      db.close();
+    }
+    InMemoryDatabase.drop(inMemoryDatabase);
+  }
+}
diff --git a/java/com/google/gerrit/testing/IndexConfig.java b/java/com/google/gerrit/testing/IndexConfig.java
new file mode 100644
index 0000000..9cace88
--- /dev/null
+++ b/java/com/google/gerrit/testing/IndexConfig.java
@@ -0,0 +1,48 @@
+// 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.
+
+package com.google.gerrit.testing;
+
+import org.eclipse.jgit.lib.Config;
+
+public class IndexConfig {
+  public static Config create() {
+    return createFromExistingConfig(new Config());
+  }
+
+  public static Config createFromExistingConfig(Config cfg) {
+    cfg.setInt("index", null, "maxPages", 10);
+    cfg.setString("trackingid", "query-bug", "footer", "Bug:");
+    cfg.setString("trackingid", "query-bug", "match", "QUERY\\d{2,8}");
+    cfg.setString("trackingid", "query-bug", "system", "querytests");
+    cfg.setString("trackingid", "query-feature", "footer", "Feature");
+    cfg.setString("trackingid", "query-feature", "match", "QUERY\\d{2,8}");
+    cfg.setString("trackingid", "query-feature", "system", "querytests");
+    return cfg;
+  }
+
+  public static Config createForLucene() {
+    return create();
+  }
+
+  public static Config createForElasticsearch() {
+    Config cfg = create();
+
+    // For some reason enabling the staleness checker increases the flakiness of the Elasticsearch
+    // tests. Hence disable the staleness checker.
+    cfg.setBoolean("index", null, "autoReindexIfStale", false);
+
+    return cfg;
+  }
+}
diff --git a/java/com/google/gerrit/testing/IndexVersions.java b/java/com/google/gerrit/testing/IndexVersions.java
new file mode 100644
index 0000000..3281ffc
--- /dev/null
+++ b/java/com/google/gerrit/testing/IndexVersions.java
@@ -0,0 +1,145 @@
+// Copyright (C) 2017 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.google.gerrit.testing;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.util.stream.Collectors.toMap;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Splitter;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
+import com.google.common.primitives.Ints;
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.index.SchemaDefinitions;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedMap;
+import org.eclipse.jgit.lib.Config;
+
+public class IndexVersions {
+  static final String ALL = "all";
+  static final String CURRENT = "current";
+  static final String PREVIOUS = "previous";
+
+  /**
+   * Returns the index versions from {@link IndexVersions#get(SchemaDefinitions)} without the latest
+   * schema version.
+   *
+   * @param schemaDef the schema definition
+   * @return the index versions from {@link IndexVersions#get(SchemaDefinitions)} without the latest
+   *     schema version
+   */
+  public static <V> ImmutableList<Integer> getWithoutLatest(SchemaDefinitions<V> schemaDef) {
+    List<Integer> schemaVersions = new ArrayList<>(get(schemaDef));
+    schemaVersions.remove(Integer.valueOf(schemaDef.getLatest().getVersion()));
+    return ImmutableList.copyOf(schemaVersions);
+  }
+
+  /**
+   * Returns the schema versions against which the query tests should be executed.
+   *
+   * <p>The schema versions are read from the '<schema-name>_INDEX_VERSIONS' env var if it is set,
+   * e.g. 'ACCOUNTS_INDEX_VERSIONS', 'CHANGES_INDEX_VERSIONS', 'GROUPS_INDEX_VERSIONS'.
+   *
+   * <p>If schema versions were not specified by an env var, they are read from the
+   * 'gerrit.index.<schema-name>.versions' system property, e.g. 'gerrit.index.accounts.version',
+   * 'gerrit.index.changes.version', 'gerrit.index.groups.version'.
+   *
+   * <p>As value a comma-separated list of schema versions is expected. {@code current} can be used
+   * for the latest schema version and {@code previous} is resolved to the second last schema
+   * version. Alternatively the value can also be {@code all} for all schema versions.
+   *
+   * <p>If schema versions were neither specified by an env var nor by a system property, the
+   * current and the second last schema versions are returned. If there is no other schema version
+   * than the current schema version, only the current schema version is returned.
+   *
+   * @param schemaDef the schema definition
+   * @return the schema versions against which the query tests should be executed
+   * @throws IllegalArgumentException if the value of the env var or system property is invalid or
+   *     if any of the specified schema versions doesn't exist
+   */
+  public static <V> ImmutableList<Integer> get(SchemaDefinitions<V> schemaDef) {
+    String envVar = schemaDef.getName().toUpperCase() + "_INDEX_VERSIONS";
+    String value = System.getenv(envVar);
+    if (!Strings.isNullOrEmpty(value)) {
+      return get(schemaDef, "env variable " + envVar, value);
+    }
+
+    String systemProperty = "gerrit.index." + schemaDef.getName().toLowerCase() + ".versions";
+    value = System.getProperty(systemProperty);
+    return get(schemaDef, "system property " + systemProperty, value);
+  }
+
+  @VisibleForTesting
+  static <V> ImmutableList<Integer> get(SchemaDefinitions<V> schemaDef, String name, String value) {
+    if (value != null) {
+      value = value.trim();
+    }
+
+    SortedMap<Integer, Schema<V>> schemas = schemaDef.getSchemas();
+    if (!Strings.isNullOrEmpty(value)) {
+      if (ALL.equals(value)) {
+        return ImmutableList.copyOf(schemas.keySet());
+      }
+
+      List<Integer> versions = new ArrayList<>();
+      for (String s : Splitter.on(',').trimResults().split(value)) {
+        if (CURRENT.equals(s)) {
+          versions.add(schemaDef.getLatest().getVersion());
+        } else if (PREVIOUS.equals(s)) {
+          checkArgument(schemaDef.getPrevious() != null, "previous version does not exist");
+          versions.add(schemaDef.getPrevious().getVersion());
+        } else {
+          Integer version = Ints.tryParse(s);
+          checkArgument(version != null, "Invalid value for %s: %s", name, s);
+          checkArgument(
+              schemas.containsKey(version),
+              "Index version %s that was specified by %s not found." + " Possible versions are: %s",
+              version,
+              name,
+              schemas.keySet());
+          versions.add(version);
+        }
+      }
+      return ImmutableList.copyOf(versions);
+    }
+
+    List<Integer> schemaVersions = new ArrayList<>(2);
+    if (schemaDef.getPrevious() != null) {
+      schemaVersions.add(schemaDef.getPrevious().getVersion());
+    }
+    schemaVersions.add(schemaDef.getLatest().getVersion());
+    return ImmutableList.copyOf(schemaVersions);
+  }
+
+  public static <V> Map<String, Config> asConfigMap(
+      SchemaDefinitions<V> schemaDef,
+      List<Integer> schemaVersions,
+      String testSuiteNamePrefix,
+      Config baseConfig) {
+    return schemaVersions.stream()
+        .collect(
+            toMap(
+                i -> testSuiteNamePrefix + i,
+                i -> {
+                  Config cfg = baseConfig;
+                  cfg.setInt(
+                      "index", "lucene", schemaDef.getName().toLowerCase() + "TestVersion", i);
+                  return cfg;
+                }));
+  }
+}
diff --git a/java/com/google/gerrit/testing/NoteDbChecker.java b/java/com/google/gerrit/testing/NoteDbChecker.java
new file mode 100644
index 0000000..1dc8ee2
--- /dev/null
+++ b/java/com/google/gerrit/testing/NoteDbChecker.java
@@ -0,0 +1,225 @@
+// 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.
+
+package com.google.gerrit.testing;
+
+import static com.google.common.truth.Truth.assertThat;
+import static java.util.Comparator.comparing;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.base.Joiner;
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.ListMultimap;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.reviewdb.server.ReviewDbUtil;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.notedb.ChangeBundle;
+import com.google.gerrit.server.notedb.ChangeBundleReader;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.MutableNotesMigration;
+import com.google.gerrit.server.notedb.rebuild.ChangeRebuilder;
+import com.google.gwtorm.client.IntKey;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.OrmRuntimeException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Stream;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.Repository;
+import org.junit.runner.Description;
+
+@Singleton
+public class NoteDbChecker {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final Provider<ReviewDb> dbProvider;
+  private final GitRepositoryManager repoManager;
+  private final MutableNotesMigration notesMigration;
+  private final ChangeBundleReader bundleReader;
+  private final ChangeNotes.Factory notesFactory;
+  private final ChangeRebuilder changeRebuilder;
+  private final CommentsUtil commentsUtil;
+
+  @Inject
+  NoteDbChecker(
+      Provider<ReviewDb> dbProvider,
+      GitRepositoryManager repoManager,
+      MutableNotesMigration notesMigration,
+      ChangeBundleReader bundleReader,
+      ChangeNotes.Factory notesFactory,
+      ChangeRebuilder changeRebuilder,
+      CommentsUtil commentsUtil) {
+    this.dbProvider = dbProvider;
+    this.repoManager = repoManager;
+    this.bundleReader = bundleReader;
+    this.notesMigration = notesMigration;
+    this.notesFactory = notesFactory;
+    this.changeRebuilder = changeRebuilder;
+    this.commentsUtil = commentsUtil;
+  }
+
+  public void rebuildAndCheckAllChanges() throws Exception {
+    rebuildAndCheckChanges(
+        getUnwrappedDb().changes().all().toList().stream().map(Change::getId),
+        ImmutableListMultimap.of());
+  }
+
+  public void rebuildAndCheckChanges(Change.Id... changeIds) throws Exception {
+    rebuildAndCheckChanges(Arrays.stream(changeIds), ImmutableListMultimap.of());
+  }
+
+  private void rebuildAndCheckChanges(
+      Stream<Change.Id> changeIds, ListMultimap<Change.Id, String> expectedDiffs) throws Exception {
+    ReviewDb db = getUnwrappedDb();
+
+    List<ChangeBundle> allExpected = readExpected(changeIds);
+
+    boolean oldWrite = notesMigration.rawWriteChangesSetting();
+    boolean oldRead = notesMigration.readChanges();
+    try {
+      notesMigration.setWriteChanges(true);
+      notesMigration.setReadChanges(true);
+      List<String> msgs = new ArrayList<>();
+      for (ChangeBundle expected : allExpected) {
+        Change c = expected.getChange();
+        try {
+          changeRebuilder.rebuild(db, c.getId());
+        } catch (RepositoryNotFoundException e) {
+          msgs.add("Repository not found for change, cannot convert: " + c);
+        }
+      }
+
+      checkActual(allExpected, expectedDiffs, msgs);
+    } finally {
+      notesMigration.setReadChanges(oldRead);
+      notesMigration.setWriteChanges(oldWrite);
+    }
+  }
+
+  public void checkChanges(Change.Id... changeIds) throws Exception {
+    checkActual(
+        readExpected(Arrays.stream(changeIds)), ImmutableListMultimap.of(), new ArrayList<>());
+  }
+
+  public void rebuildAndCheckChange(Change.Id changeId, String... expectedDiff) throws Exception {
+    ImmutableListMultimap.Builder<Change.Id, String> b = ImmutableListMultimap.builder();
+    b.putAll(changeId, Arrays.asList(expectedDiff));
+    rebuildAndCheckChanges(Stream.of(changeId), b.build());
+  }
+
+  public void assertNoChangeRef(Project.NameKey project, Change.Id changeId) throws Exception {
+    try (Repository repo = repoManager.openRepository(project)) {
+      assertThat(repo.exactRef(RefNames.changeMetaRef(changeId))).isNull();
+    }
+  }
+
+  public void assertNoReviewDbChanges(Description desc) throws Exception {
+    ReviewDb db = getUnwrappedDb();
+    assertThat(db.changes().all().toList()).named("Changes in " + desc.getTestClass()).isEmpty();
+    assertThat(db.changeMessages().all().toList())
+        .named("ChangeMessages in " + desc.getTestClass())
+        .isEmpty();
+    assertThat(db.patchSets().all().toList())
+        .named("PatchSets in " + desc.getTestClass())
+        .isEmpty();
+    assertThat(db.patchSetApprovals().all().toList())
+        .named("PatchSetApprovals in " + desc.getTestClass())
+        .isEmpty();
+    assertThat(db.patchComments().all().toList())
+        .named("PatchLineComments in " + desc.getTestClass())
+        .isEmpty();
+  }
+
+  private List<ChangeBundle> readExpected(Stream<Change.Id> changeIds) throws Exception {
+    boolean old = notesMigration.readChanges();
+    try {
+      notesMigration.setReadChanges(false);
+      return changeIds
+          .sorted(comparing(IntKey::get))
+          .map(this::readBundleUnchecked)
+          .collect(toList());
+    } finally {
+      notesMigration.setReadChanges(old);
+    }
+  }
+
+  private ChangeBundle readBundleUnchecked(Change.Id id) {
+    try {
+      return bundleReader.fromReviewDb(getUnwrappedDb(), id);
+    } catch (OrmException e) {
+      throw new OrmRuntimeException(e);
+    }
+  }
+
+  private void checkActual(
+      List<ChangeBundle> allExpected,
+      ListMultimap<Change.Id, String> expectedDiffs,
+      List<String> msgs)
+      throws Exception {
+    ReviewDb db = getUnwrappedDb();
+    boolean oldRead = notesMigration.readChanges();
+    boolean oldWrite = notesMigration.rawWriteChangesSetting();
+    try {
+      notesMigration.setWriteChanges(true);
+      notesMigration.setReadChanges(true);
+      for (ChangeBundle expected : allExpected) {
+        Change c = expected.getChange();
+        ChangeBundle actual;
+        try {
+          actual =
+              ChangeBundle.fromNotes(
+                  commentsUtil, notesFactory.create(db, c.getProject(), c.getId()));
+        } catch (Throwable t) {
+          String msg = "Error converting change: " + c;
+          msgs.add(msg);
+          logger.atSevere().withCause(t).log(msg);
+          continue;
+        }
+        List<String> diff = expected.differencesFrom(actual);
+        List<String> expectedDiff = expectedDiffs.get(c.getId());
+        if (!diff.equals(expectedDiff)) {
+          msgs.add("Differences between ReviewDb and NoteDb for " + c + ":");
+          msgs.addAll(diff);
+          if (!expectedDiff.isEmpty()) {
+            msgs.add("Expected differences:");
+            msgs.addAll(expectedDiff);
+          }
+          msgs.add("");
+        } else {
+          System.err.println("NoteDb conversion of change " + c.getId() + " successful");
+        }
+      }
+    } finally {
+      notesMigration.setReadChanges(oldRead);
+      notesMigration.setWriteChanges(oldWrite);
+    }
+    if (!msgs.isEmpty()) {
+      throw new AssertionError(Joiner.on('\n').join(msgs));
+    }
+  }
+
+  private ReviewDb getUnwrappedDb() {
+    ReviewDb db = dbProvider.get();
+    return ReviewDbUtil.unwrapDb(db);
+  }
+}
diff --git a/java/com/google/gerrit/testing/NoteDbMode.java b/java/com/google/gerrit/testing/NoteDbMode.java
new file mode 100644
index 0000000..d4a7c7e
--- /dev/null
+++ b/java/com/google/gerrit/testing/NoteDbMode.java
@@ -0,0 +1,87 @@
+// 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.
+
+package com.google.gerrit.testing;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+import com.google.common.base.Enums;
+import com.google.common.base.Strings;
+import com.google.gerrit.server.notedb.MutableNotesMigration;
+import com.google.gerrit.server.notedb.NotesMigrationState;
+
+public enum NoteDbMode {
+  /** NoteDb is disabled. */
+  OFF(NotesMigrationState.REVIEW_DB),
+
+  /** Writing data to NoteDb is enabled. */
+  WRITE(NotesMigrationState.WRITE),
+
+  /** Reading and writing all data to NoteDb is enabled. */
+  READ_WRITE(NotesMigrationState.READ_WRITE_WITH_SEQUENCE_REVIEW_DB_PRIMARY),
+
+  /** Changes are created with their primary storage as NoteDb. */
+  PRIMARY(NotesMigrationState.READ_WRITE_WITH_SEQUENCE_NOTE_DB_PRIMARY),
+
+  /** All change tables are entirely disabled, and code/meta ref updates are fused. */
+  ON(NotesMigrationState.NOTE_DB),
+
+  /**
+   * Run tests with NoteDb disabled, then convert ReviewDb to NoteDb and check that the results
+   * match.
+   */
+  CHECK(NotesMigrationState.REVIEW_DB);
+
+  private static final String ENV_VAR = "GERRIT_NOTEDB";
+  private static final String SYS_PROP = "gerrit.notedb";
+
+  public static NoteDbMode get() {
+    String value = System.getenv(ENV_VAR);
+    if (Strings.isNullOrEmpty(value)) {
+      value = System.getProperty(SYS_PROP);
+    }
+    if (Strings.isNullOrEmpty(value)) {
+      return OFF;
+    }
+    value = value.toUpperCase().replace("-", "_");
+    NoteDbMode mode = Enums.getIfPresent(NoteDbMode.class, value).orNull();
+    if (!Strings.isNullOrEmpty(System.getenv(ENV_VAR))) {
+      checkArgument(
+          mode != null, "Invalid value for env variable %s: %s", ENV_VAR, System.getenv(ENV_VAR));
+    } else {
+      checkArgument(
+          mode != null,
+          "Invalid value for system property %s: %s",
+          SYS_PROP,
+          System.getProperty(SYS_PROP));
+    }
+    return mode;
+  }
+
+  public static MutableNotesMigration newNotesMigrationFromEnv() {
+    MutableNotesMigration m = MutableNotesMigration.newDisabled();
+    resetFromEnv(m);
+    return m;
+  }
+
+  public static void resetFromEnv(MutableNotesMigration migration) {
+    migration.setFrom(get().state);
+  }
+
+  private final NotesMigrationState state;
+
+  private NoteDbMode(NotesMigrationState state) {
+    this.state = state;
+  }
+}
diff --git a/java/com/google/gerrit/testing/SshMode.java b/java/com/google/gerrit/testing/SshMode.java
new file mode 100644
index 0000000..41633bd
--- /dev/null
+++ b/java/com/google/gerrit/testing/SshMode.java
@@ -0,0 +1,64 @@
+// 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.
+
+package com.google.gerrit.testing;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+import com.google.common.base.Enums;
+import com.google.common.base.Strings;
+
+/**
+ * Whether to enable/disable tests using SSH by inspecting the global environment.
+ *
+ * <p>Acceptance tests should generally not inspect this directly, since SSH may also be disabled on
+ * a per-class or per-method basis. Inject {@code @SshEnabled boolean} instead.
+ */
+public enum SshMode {
+  /** Tests annotated with UseSsh will be disabled. */
+  NO,
+
+  /** Tests annotated with UseSsh will be enabled. */
+  YES;
+
+  private static final String ENV_VAR = "GERRIT_USE_SSH";
+  private static final String SYS_PROP = "gerrit.use.ssh";
+
+  public static SshMode get() {
+    String value = System.getenv(ENV_VAR);
+    if (Strings.isNullOrEmpty(value)) {
+      value = System.getProperty(SYS_PROP);
+    }
+    if (Strings.isNullOrEmpty(value)) {
+      return YES;
+    }
+    value = value.toUpperCase();
+    SshMode mode = Enums.getIfPresent(SshMode.class, value).orNull();
+    if (!Strings.isNullOrEmpty(System.getenv(ENV_VAR))) {
+      checkArgument(
+          mode != null, "Invalid value for env variable %s: %s", ENV_VAR, System.getenv(ENV_VAR));
+    } else {
+      checkArgument(
+          mode != null,
+          "Invalid value for system property %s: %s",
+          SYS_PROP,
+          System.getProperty(SYS_PROP));
+    }
+    return mode;
+  }
+
+  public static boolean useSsh() {
+    return get() == YES;
+  }
+}
diff --git a/java/com/google/gerrit/testing/TempFileUtil.java b/java/com/google/gerrit/testing/TempFileUtil.java
new file mode 100644
index 0000000..c42bd74
--- /dev/null
+++ b/java/com/google/gerrit/testing/TempFileUtil.java
@@ -0,0 +1,66 @@
+// Copyright (C) 2011 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.google.gerrit.testing;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+public class TempFileUtil {
+  private static List<File> allDirsCreated = new ArrayList<>();
+
+  public static synchronized File createTempDirectory() throws IOException {
+    File tmp = File.createTempFile("gerrit_test_", "").getCanonicalFile();
+    if (!tmp.delete() || !tmp.mkdir()) {
+      throw new IOException("Cannot create " + tmp.getPath());
+    }
+    allDirsCreated.add(tmp);
+    return tmp;
+  }
+
+  public static synchronized void cleanup() throws IOException {
+    for (File dir : allDirsCreated) {
+      recursivelyDelete(dir);
+    }
+    allDirsCreated.clear();
+  }
+
+  public static void recursivelyDelete(File dir) throws IOException {
+    if (!dir.getPath().equals(dir.getCanonicalPath())) {
+      // Directory symlink reaching outside of temporary space.
+      return;
+    }
+    File[] contents = dir.listFiles();
+    if (contents != null) {
+      for (File d : contents) {
+        if (d.isDirectory()) {
+          recursivelyDelete(d);
+        } else {
+          deleteNowOrOnExit(d);
+        }
+      }
+    }
+    deleteNowOrOnExit(dir);
+  }
+
+  private static void deleteNowOrOnExit(File dir) {
+    if (!dir.delete()) {
+      dir.deleteOnExit();
+    }
+  }
+
+  private TempFileUtil() {}
+}
diff --git a/java/com/google/gerrit/testing/TestChanges.java b/java/com/google/gerrit/testing/TestChanges.java
new file mode 100644
index 0000000..8e752fa
--- /dev/null
+++ b/java/com/google/gerrit/testing/TestChanges.java
@@ -0,0 +1,136 @@
+// Copyright (C) 2014 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.google.gerrit.testing;
+
+import static com.google.common.base.MoreObjects.firstNonNull;
+
+import com.google.common.collect.Ordering;
+import com.google.gerrit.extensions.config.FactoryModule;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetInfo;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RevId;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.notedb.AbstractChangeNotes;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.inject.Injector;
+import java.util.TimeZone;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+
+/**
+ * Utility functions to create and manipulate Change, ChangeUpdate, and ChangeControl objects for
+ * testing.
+ */
+public class TestChanges {
+  private static final AtomicInteger nextChangeId = new AtomicInteger(1);
+
+  public static Change newChange(Project.NameKey project, Account.Id userId) {
+    return newChange(project, userId, nextChangeId.getAndIncrement());
+  }
+
+  public static Change newChange(Project.NameKey project, Account.Id userId, int id) {
+    Change.Id changeId = new Change.Id(id);
+    Change c =
+        new Change(
+            new Change.Key("Iabcd1234abcd1234abcd1234abcd1234abcd1234"),
+            changeId,
+            userId,
+            new Branch.NameKey(project, "master"),
+            TimeUtil.nowTs());
+    incrementPatchSet(c);
+    return c;
+  }
+
+  public static PatchSet newPatchSet(PatchSet.Id id, ObjectId revision, Account.Id userId) {
+    return newPatchSet(id, revision.name(), userId);
+  }
+
+  public static PatchSet newPatchSet(PatchSet.Id id, String revision, Account.Id userId) {
+    PatchSet ps = new PatchSet(id);
+    ps.setRevision(new RevId(revision));
+    ps.setUploader(userId);
+    ps.setCreatedOn(TimeUtil.nowTs());
+    return ps;
+  }
+
+  public static ChangeUpdate newUpdate(Injector injector, Change c, CurrentUser user)
+      throws Exception {
+    injector =
+        injector.createChildInjector(
+            new FactoryModule() {
+              @Override
+              public void configure() {
+                bind(CurrentUser.class).toInstance(user);
+              }
+            });
+    ChangeUpdate update =
+        injector
+            .getInstance(ChangeUpdate.Factory.class)
+            .create(
+                new ChangeNotes(injector.getInstance(AbstractChangeNotes.Args.class), c).load(),
+                user,
+                TimeUtil.nowTs(),
+                Ordering.<String>natural());
+
+    ChangeNotes notes = update.getNotes();
+    boolean hasPatchSets = notes.getPatchSets() != null && !notes.getPatchSets().isEmpty();
+    NotesMigration migration = injector.getInstance(NotesMigration.class);
+    if (hasPatchSets || !migration.readChanges()) {
+      return update;
+    }
+
+    // Change doesn't exist yet. NoteDb requires that there be a commit for the
+    // first patch set, so create one.
+    GitRepositoryManager repoManager = injector.getInstance(GitRepositoryManager.class);
+    try (Repository repo = repoManager.openRepository(c.getProject())) {
+      TestRepository<Repository> tr = new TestRepository<>(repo);
+      PersonIdent ident =
+          user.asIdentifiedUser().newCommitterIdent(update.getWhen(), TimeZone.getDefault());
+      TestRepository<Repository>.CommitBuilder cb =
+          tr.commit()
+              .author(ident)
+              .committer(ident)
+              .message(firstNonNull(c.getSubject(), "Test change"));
+      Ref parent = repo.exactRef(c.getDest().get());
+      if (parent != null) {
+        cb.parent(tr.getRevWalk().parseCommit(parent.getObjectId()));
+      }
+      update.setBranch(c.getDest().get());
+      update.setChangeId(c.getKey().get());
+      update.setCommit(tr.getRevWalk(), cb.create());
+      return update;
+    }
+  }
+
+  public static void incrementPatchSet(Change change) {
+    PatchSet.Id curr = change.currentPatchSetId();
+    PatchSetInfo ps =
+        new PatchSetInfo(new PatchSet.Id(change.getId(), curr != null ? curr.get() + 1 : 1));
+    ps.setSubject("Change subject");
+    change.setCurrentPatchSet(ps);
+  }
+}
diff --git a/java/com/google/gerrit/testing/TestTimeUtil.java b/java/com/google/gerrit/testing/TestTimeUtil.java
new file mode 100644
index 0000000..9228123
--- /dev/null
+++ b/java/com/google/gerrit/testing/TestTimeUtil.java
@@ -0,0 +1,128 @@
+// Copyright (C) 2015 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.google.gerrit.testing;
+
+import static com.google.common.base.Preconditions.checkState;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+
+import com.google.gerrit.server.util.time.TimeUtil;
+import java.sql.Timestamp;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.Month;
+import java.time.ZoneOffset;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
+
+/** Static utility methods for dealing with dates and times in tests. */
+public class TestTimeUtil {
+  public static final Instant START =
+      LocalDateTime.of(2009, Month.SEPTEMBER, 30, 17, 0, 0)
+          .atOffset(ZoneOffset.ofHours(-4))
+          .toInstant();
+
+  private static Long clockStepMs;
+  private static AtomicLong clockMs;
+
+  /**
+   * Reset the clock to a known start point, then set the clock step.
+   *
+   * <p>The clock is initially set to 2009/09/30 17:00:00 -0400.
+   *
+   * @param clockStep amount to increment clock by on each lookup.
+   * @param clockStepUnit time unit for {@code clockStep}.
+   */
+  public static synchronized void resetWithClockStep(long clockStep, TimeUnit clockStepUnit) {
+    // Set an arbitrary start point so tests are more repeatable.
+    clockMs = new AtomicLong(START.toEpochMilli());
+    setClockStep(clockStep, clockStepUnit);
+  }
+
+  /**
+   * Set the clock step used by {@link com.google.gerrit.server.util.time.TimeUtil}.
+   *
+   * @param clockStep amount to increment clock by on each lookup.
+   * @param clockStepUnit time unit for {@code clockStep}.
+   */
+  public static synchronized void setClockStep(long clockStep, TimeUnit clockStepUnit) {
+    checkState(clockMs != null, "call resetWithClockStep first");
+    clockStepMs = MILLISECONDS.convert(clockStep, clockStepUnit);
+    TimeUtil.setCurrentMillisSupplier(() -> clockMs.getAndAdd(clockStepMs));
+  }
+
+  /** {@link AutoCloseable} handle returned by {@link #withClockStep(long, TimeUnit)}. */
+  public static class TempClockStep implements AutoCloseable {
+    private final long oldClockStepMs;
+
+    private TempClockStep(long clockStep, TimeUnit clockStepUnit) {
+      oldClockStepMs = clockStepMs;
+      setClockStep(clockStep, clockStepUnit);
+    }
+
+    @Override
+    public void close() {
+      setClockStep(oldClockStepMs, TimeUnit.MILLISECONDS);
+    }
+  }
+
+  /**
+   * Set a clock step only for the scope of a single try-with-resources block.
+   *
+   * @param clockStep amount to increment clock by on each lookup.
+   * @param clockStepUnit time unit for {@code clockStep}.
+   * @return {@link AutoCloseable} handle which resets the clock step to its old value on close.
+   */
+  public static TempClockStep withClockStep(long clockStep, TimeUnit clockStepUnit) {
+    return new TempClockStep(clockStep, clockStepUnit);
+  }
+
+  /**
+   * Freeze the clock to stop moving only for the scope of a single try-with-resources block.
+   *
+   * @return {@link AutoCloseable} handle which resets the clock step to its old value on close.
+   */
+  public static TempClockStep freezeClock() {
+    return withClockStep(0, TimeUnit.SECONDS);
+  }
+
+  /**
+   * Set the clock to a specific timestamp.
+   *
+   * @param ts time to set
+   */
+  public static synchronized void setClock(Timestamp ts) {
+    checkState(clockMs != null, "call resetWithClockStep first");
+    clockMs.set(ts.getTime());
+  }
+
+  /**
+   * Increment the clock once by a given amount.
+   *
+   * @param clockStep amount to increment clock by.
+   * @param clockStepUnit time unit for {@code clockStep}.
+   */
+  public static synchronized void incrementClock(long clockStep, TimeUnit clockStepUnit) {
+    checkState(clockMs != null, "call resetWithClockStep first");
+    clockMs.addAndGet(clockStepUnit.toMillis(clockStep));
+  }
+
+  /** Reset the clock to use the actual system clock. */
+  public static synchronized void useSystemTime() {
+    clockMs = null;
+    TimeUtil.resetCurrentMillisSupplier();
+  }
+
+  private TestTimeUtil() {}
+}
diff --git a/java/com/google/gerrit/testing/TestUpdateUI.java b/java/com/google/gerrit/testing/TestUpdateUI.java
new file mode 100644
index 0000000..f36fc7e
--- /dev/null
+++ b/java/com/google/gerrit/testing/TestUpdateUI.java
@@ -0,0 +1,51 @@
+// Copyright (C) 2017 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.google.gerrit.testing;
+
+import com.google.gerrit.server.schema.UpdateUI;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.StatementExecutor;
+import java.util.List;
+import java.util.Set;
+
+public class TestUpdateUI implements UpdateUI {
+  @Override
+  public void message(String message) {}
+
+  @Override
+  public boolean yesno(boolean defaultValue, String message) {
+    return defaultValue;
+  }
+
+  @Override
+  public void waitForUser() {}
+
+  @Override
+  public String readString(String defaultValue, Set<String> allowedValues, String message) {
+    return defaultValue;
+  }
+
+  @Override
+  public boolean isBatch() {
+    return true;
+  }
+
+  @Override
+  public void pruneSchema(StatementExecutor e, List<String> pruneList) throws OrmException {
+    for (String sql : pruneList) {
+      e.execute(sql);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/truth/BUILD b/java/com/google/gerrit/truth/BUILD
new file mode 100644
index 0000000..786ae0d
--- /dev/null
+++ b/java/com/google/gerrit/truth/BUILD
@@ -0,0 +1,10 @@
+java_library(
+    name = "truth",
+    testonly = True,
+    srcs = glob(["**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//lib:guava",
+        "//lib/truth",
+    ],
+)
diff --git a/java/com/google/gerrit/truth/ListSubject.java b/java/com/google/gerrit/truth/ListSubject.java
new file mode 100644
index 0000000..bd9df30
--- /dev/null
+++ b/java/com/google/gerrit/truth/ListSubject.java
@@ -0,0 +1,97 @@
+// 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.
+
+package com.google.gerrit.truth;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.truth.Fact.fact;
+import static com.google.common.truth.Truth.assertAbout;
+
+import com.google.common.truth.FailureMetadata;
+import com.google.common.truth.IterableSubject;
+import com.google.common.truth.Subject;
+import java.util.List;
+import java.util.function.Function;
+
+public class ListSubject<S extends Subject<S, E>, E> extends IterableSubject {
+
+  private final Function<E, S> elementAssertThatFunction;
+
+  @SuppressWarnings("unchecked")
+  public static <S extends Subject<S, E>, E> ListSubject<S, E> assertThat(
+      List<E> list, Function<E, S> elementAssertThatFunction) {
+    // The ListSubjectFactory always returns ListSubjects. -> Casting is appropriate.
+    return (ListSubject<S, E>)
+        assertAbout(new ListSubjectFactory<>(elementAssertThatFunction)).that(list);
+  }
+
+  private ListSubject(
+      FailureMetadata failureMetadata, List<E> list, Function<E, S> elementAssertThatFunction) {
+    super(failureMetadata, list);
+    this.elementAssertThatFunction = elementAssertThatFunction;
+  }
+
+  public S element(int index) {
+    checkArgument(index >= 0, "index(%s) must be >= 0", index);
+    isNotNull();
+    List<E> list = getActualList();
+    if (index >= list.size()) {
+      failWithoutActual(fact("expected to have element at index", index));
+    }
+    return elementAssertThatFunction.apply(list.get(index));
+  }
+
+  public S onlyElement() {
+    isNotNull();
+    hasSize(1);
+    return element(0);
+  }
+
+  public S lastElement() {
+    isNotNull();
+    isNotEmpty();
+    List<E> list = getActualList();
+    return element(list.size() - 1);
+  }
+
+  @SuppressWarnings("unchecked")
+  private List<E> getActualList() {
+    // The constructor only accepts lists. -> Casting is appropriate.
+    return (List<E>) actual();
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public ListSubject<S, E> named(String s, Object... objects) {
+    // This object is returned which is of type ListSubject. -> Casting is appropriate.
+    return (ListSubject<S, E>) super.named(s, objects);
+  }
+
+  private static class ListSubjectFactory<S extends Subject<S, T>, T>
+      implements Subject.Factory<IterableSubject, Iterable<?>> {
+
+    private Function<T, S> elementAssertThatFunction;
+
+    ListSubjectFactory(Function<T, S> elementAssertThatFunction) {
+      this.elementAssertThatFunction = elementAssertThatFunction;
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public ListSubject<S, T> createSubject(FailureMetadata failureMetadata, Iterable<?> objects) {
+      // The constructor of ListSubject only accepts lists. -> Casting is appropriate.
+      return new ListSubject<>(failureMetadata, (List<T>) objects, elementAssertThatFunction);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/truth/OptionalSubject.java b/java/com/google/gerrit/truth/OptionalSubject.java
new file mode 100644
index 0000000..d91f07b
--- /dev/null
+++ b/java/com/google/gerrit/truth/OptionalSubject.java
@@ -0,0 +1,99 @@
+// Copyright (C) 2017 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.google.gerrit.truth;
+
+import static com.google.common.truth.Fact.fact;
+import static com.google.common.truth.Truth.assertAbout;
+
+import com.google.common.truth.DefaultSubject;
+import com.google.common.truth.FailureMetadata;
+import com.google.common.truth.Subject;
+import com.google.common.truth.Truth;
+import java.util.Optional;
+import java.util.function.Function;
+
+public class OptionalSubject<S extends Subject<S, ? super T>, T>
+    extends Subject<OptionalSubject<S, T>, Optional<T>> {
+
+  private final Function<? super T, ? extends S> valueAssertThatFunction;
+
+  public static <S extends Subject<S, ? super T>, T> OptionalSubject<S, T> assertThat(
+      Optional<T> optional, Function<? super T, ? extends S> elementAssertThatFunction) {
+    OptionalSubjectFactory<S, T> optionalSubjectFactory =
+        new OptionalSubjectFactory<>(elementAssertThatFunction);
+    return assertAbout(optionalSubjectFactory).that(optional);
+  }
+
+  public static OptionalSubject<DefaultSubject, ?> assertThat(Optional<?> optional) {
+    // Unfortunately, we need to cast to DefaultSubject as Truth.assertThat()
+    // only returns Subject<DefaultSubject, Object>. There shouldn't be a way
+    // for that method not to return a DefaultSubject because the generic type
+    // definitions of a Subject are quite strict.
+    Function<Object, DefaultSubject> valueAssertThatFunction =
+        value -> (DefaultSubject) Truth.assertThat(value);
+    return assertThat(optional, valueAssertThatFunction);
+  }
+
+  private OptionalSubject(
+      FailureMetadata failureMetadata,
+      Optional<T> optional,
+      Function<? super T, ? extends S> valueAssertThatFunction) {
+    super(failureMetadata, optional);
+    this.valueAssertThatFunction = valueAssertThatFunction;
+  }
+
+  public void isPresent() {
+    isNotNull();
+    Optional<T> optional = actual();
+    if (!optional.isPresent()) {
+      failWithoutActual(fact("expected to have", "value"));
+    }
+  }
+
+  public void isAbsent() {
+    isNotNull();
+    Optional<T> optional = actual();
+    if (optional.isPresent()) {
+      failWithoutActual(fact("expected not to have", "value"));
+    }
+  }
+
+  public void isEmpty() {
+    isAbsent();
+  }
+
+  public S value() {
+    isNotNull();
+    isPresent();
+    Optional<T> optional = actual();
+    return valueAssertThatFunction.apply(optional.get());
+  }
+
+  private static class OptionalSubjectFactory<S extends Subject<S, ? super T>, T>
+      implements Subject.Factory<OptionalSubject<S, T>, Optional<T>> {
+
+    private Function<? super T, ? extends S> valueAssertThatFunction;
+
+    OptionalSubjectFactory(Function<? super T, ? extends S> valueAssertThatFunction) {
+      this.valueAssertThatFunction = valueAssertThatFunction;
+    }
+
+    @Override
+    public OptionalSubject<S, T> createSubject(
+        FailureMetadata failureMetadata, Optional<T> optional) {
+      return new OptionalSubject<>(failureMetadata, optional, valueAssertThatFunction);
+    }
+  }
+}
diff --git a/java/com/google/gerrit/util/cli/BUILD b/java/com/google/gerrit/util/cli/BUILD
new file mode 100644
index 0000000..c94fc1d
--- /dev/null
+++ b/java/com/google/gerrit/util/cli/BUILD
@@ -0,0 +1,14 @@
+java_library(
+    name = "cli",
+    srcs = glob(["**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/common:annotations",
+        "//java/com/google/gerrit/common:server",
+        "//lib:args4j",
+        "//lib:guava",
+        "//lib/flogger:api",
+        "//lib/guice",
+        "//lib/guice:guice-assistedinject",
+    ],
+)
diff --git a/java/com/google/gerrit/util/cli/CmdLineParser.java b/java/com/google/gerrit/util/cli/CmdLineParser.java
new file mode 100644
index 0000000..5b7ea3f
--- /dev/null
+++ b/java/com/google/gerrit/util/cli/CmdLineParser.java
@@ -0,0 +1,598 @@
+/*
+ * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
+ *
+ * (Taken from JGit org.eclipse.jgit.pgm.opt.CmdLineParser.)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * - Neither the name of the Git Development Community nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.google.gerrit.util.cli;
+
+import static com.google.gerrit.util.cli.Localizable.localizable;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.MultimapBuilder;
+import com.google.common.flogger.FluentLogger;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.AnnotatedElement;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.ResourceBundle;
+import java.util.Set;
+import org.kohsuke.args4j.Argument;
+import org.kohsuke.args4j.CmdLineException;
+import org.kohsuke.args4j.IllegalAnnotationError;
+import org.kohsuke.args4j.NamedOptionDef;
+import org.kohsuke.args4j.Option;
+import org.kohsuke.args4j.OptionDef;
+import org.kohsuke.args4j.ParserProperties;
+import org.kohsuke.args4j.spi.BooleanOptionHandler;
+import org.kohsuke.args4j.spi.EnumOptionHandler;
+import org.kohsuke.args4j.spi.FieldSetter;
+import org.kohsuke.args4j.spi.MethodSetter;
+import org.kohsuke.args4j.spi.OptionHandler;
+import org.kohsuke.args4j.spi.Setter;
+import org.kohsuke.args4j.spi.Setters;
+
+/**
+ * Extended command line parser which handles --foo=value arguments.
+ *
+ * <p>The args4j package does not natively handle --foo=value and instead prefers to see --foo value
+ * on the command line. Many users are used to the GNU style --foo=value long option, so we convert
+ * from the GNU style format to the args4j style format prior to invoking args4j for parsing.
+ */
+public class CmdLineParser {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  public interface Factory {
+    CmdLineParser create(Object bean);
+  }
+
+  private final OptionHandlers handlers;
+  private final MyParser parser;
+
+  @SuppressWarnings("rawtypes")
+  private Map<String, OptionHandler> options;
+
+  /**
+   * Creates a new command line owner that parses arguments/options and set them into the given
+   * object.
+   *
+   * @param bean instance of a class annotated by {@link org.kohsuke.args4j.Option} and {@link
+   *     org.kohsuke.args4j.Argument}. this object will receive values.
+   * @throws IllegalAnnotationError if the option bean class is using args4j annotations
+   *     incorrectly.
+   */
+  @Inject
+  public CmdLineParser(OptionHandlers handlers, @Assisted final Object bean)
+      throws IllegalAnnotationError {
+    this.handlers = handlers;
+    this.parser = new MyParser(bean);
+  }
+
+  public void addArgument(Setter<?> setter, Argument a) {
+    parser.addArgument(setter, a);
+  }
+
+  public void addOption(Setter<?> setter, Option o) {
+    parser.addOption(setter, o);
+  }
+
+  public void printSingleLineUsage(Writer w, ResourceBundle rb) {
+    parser.printSingleLineUsage(w, rb);
+  }
+
+  public void printUsage(Writer out, ResourceBundle rb) {
+    parser.printUsage(out, rb);
+  }
+
+  public void printDetailedUsage(String name, StringWriter out) {
+    out.write(name);
+    printSingleLineUsage(out, null);
+    out.write('\n');
+    out.write('\n');
+    printUsage(out, null);
+    out.write('\n');
+  }
+
+  public void printQueryStringUsage(String name, StringWriter out) {
+    out.write(name);
+
+    char next = '?';
+    List<NamedOptionDef> booleans = new ArrayList<>();
+    for (@SuppressWarnings("rawtypes") OptionHandler handler : parser.optionsList) {
+      if (handler.option instanceof NamedOptionDef) {
+        NamedOptionDef n = (NamedOptionDef) handler.option;
+
+        if (handler instanceof BooleanOptionHandler) {
+          booleans.add(n);
+          continue;
+        }
+
+        if (!n.required()) {
+          out.write('[');
+        }
+        out.write(next);
+        next = '&';
+        if (n.name().startsWith("--")) {
+          out.write(n.name().substring(2));
+        } else if (n.name().startsWith("-")) {
+          out.write(n.name().substring(1));
+        } else {
+          out.write(n.name());
+        }
+        out.write('=');
+
+        out.write(metaVar(handler, n));
+        if (!n.required()) {
+          out.write(']');
+        }
+        if (n.isMultiValued()) {
+          out.write('*');
+        }
+      }
+    }
+    for (NamedOptionDef n : booleans) {
+      if (!n.required()) {
+        out.write('[');
+      }
+      out.write(next);
+      next = '&';
+      if (n.name().startsWith("--")) {
+        out.write(n.name().substring(2));
+      } else if (n.name().startsWith("-")) {
+        out.write(n.name().substring(1));
+      } else {
+        out.write(n.name());
+      }
+      if (!n.required()) {
+        out.write(']');
+      }
+    }
+  }
+
+  private static String metaVar(OptionHandler<?> handler, NamedOptionDef n) {
+    String var = n.metaVar();
+    if (Strings.isNullOrEmpty(var)) {
+      var = handler.getDefaultMetaVariable();
+      if (handler instanceof EnumOptionHandler) {
+        var = var.substring(1, var.length() - 1).replace(" ", "");
+      }
+    }
+    return var;
+  }
+
+  public boolean wasHelpRequestedByOption() {
+    return parser.help.value;
+  }
+
+  public void parseArgument(String... args) throws CmdLineException {
+    List<String> tmp = Lists.newArrayListWithCapacity(args.length);
+    for (int argi = 0; argi < args.length; argi++) {
+      final String str = args[argi];
+      if (str.equals("--")) {
+        while (argi < args.length) {
+          tmp.add(args[argi++]);
+        }
+        break;
+      }
+
+      if (str.startsWith("--")) {
+        final int eq = str.indexOf('=');
+        if (eq > 0) {
+          tmp.add(str.substring(0, eq));
+          tmp.add(str.substring(eq + 1));
+          continue;
+        }
+      }
+
+      tmp.add(str);
+    }
+    parser.parseArgument(tmp.toArray(new String[tmp.size()]));
+  }
+
+  public void parseOptionMap(Map<String, String[]> parameters) throws CmdLineException {
+    ListMultimap<String, String> map = MultimapBuilder.hashKeys().arrayListValues().build();
+    for (Map.Entry<String, String[]> ent : parameters.entrySet()) {
+      for (String val : ent.getValue()) {
+        map.put(ent.getKey(), val);
+      }
+    }
+    parseOptionMap(map);
+  }
+
+  public void parseOptionMap(ListMultimap<String, String> params) throws CmdLineException {
+    logger.atFinest().log("Command-line parameters: %s", params.keySet());
+    List<String> tmp = Lists.newArrayListWithCapacity(2 * params.size());
+    for (String key : params.keySet()) {
+      String name = makeOption(key);
+
+      if (isBoolean(name)) {
+        boolean on = false;
+        for (String value : params.get(key)) {
+          on = toBoolean(key, value);
+        }
+        if (on) {
+          tmp.add(name);
+        }
+      } else {
+        for (String value : params.get(key)) {
+          tmp.add(name);
+          tmp.add(value);
+        }
+      }
+    }
+    parser.parseArgument(tmp.toArray(new String[tmp.size()]));
+  }
+
+  public boolean isBoolean(String name) {
+    return findHandler(makeOption(name)) instanceof BooleanOptionHandler;
+  }
+
+  public void parseWithPrefix(String prefix, Object bean) {
+    parser.parseWithPrefix(prefix, bean);
+  }
+
+  private String makeOption(String name) {
+    if (!name.startsWith("-")) {
+      if (name.length() == 1) {
+        name = "-" + name;
+      } else {
+        name = "--" + name;
+      }
+    }
+    return name;
+  }
+
+  @SuppressWarnings("rawtypes")
+  private OptionHandler findHandler(String name) {
+    if (options == null) {
+      options = index(parser.optionsList);
+    }
+    return options.get(name);
+  }
+
+  @SuppressWarnings("rawtypes")
+  private static Map<String, OptionHandler> index(List<OptionHandler> in) {
+    Map<String, OptionHandler> m = new HashMap<>();
+    for (OptionHandler handler : in) {
+      if (handler.option instanceof NamedOptionDef) {
+        NamedOptionDef def = (NamedOptionDef) handler.option;
+        if (!def.isArgument()) {
+          m.put(def.name(), handler);
+          for (String alias : def.aliases()) {
+            m.put(alias, handler);
+          }
+        }
+      }
+    }
+    return m;
+  }
+
+  private boolean toBoolean(String name, String value) throws CmdLineException {
+    if ("true".equals(value)
+        || "t".equals(value)
+        || "yes".equals(value)
+        || "y".equals(value)
+        || "on".equals(value)
+        || "1".equals(value)
+        || value == null
+        || "".equals(value)) {
+      return true;
+    }
+
+    if ("false".equals(value)
+        || "f".equals(value)
+        || "no".equals(value)
+        || "n".equals(value)
+        || "off".equals(value)
+        || "0".equals(value)) {
+      return false;
+    }
+
+    throw new CmdLineException(parser, localizable("invalid boolean \"%s=%s\""), name, value);
+  }
+
+  private static class PrefixedOption implements Option {
+    private final String prefix;
+    private final Option o;
+
+    PrefixedOption(String prefix, Option o) {
+      this.prefix = prefix;
+      this.o = o;
+    }
+
+    @Override
+    public String name() {
+      return getPrefixedName(prefix, o.name());
+    }
+
+    @Override
+    public String[] aliases() {
+      String[] prefixedAliases = new String[o.aliases().length];
+      for (int i = 0; i < prefixedAliases.length; i++) {
+        prefixedAliases[i] = getPrefixedName(prefix, o.aliases()[i]);
+      }
+      return prefixedAliases;
+    }
+
+    @Override
+    public String usage() {
+      return o.usage();
+    }
+
+    @Override
+    public String metaVar() {
+      return o.metaVar();
+    }
+
+    @Override
+    public boolean required() {
+      return o.required();
+    }
+
+    @Override
+    public boolean hidden() {
+      return o.hidden();
+    }
+
+    @SuppressWarnings("rawtypes")
+    @Override
+    public Class<? extends OptionHandler> handler() {
+      return o.handler();
+    }
+
+    @Override
+    public String[] depends() {
+      return o.depends();
+    }
+
+    @Override
+    public String[] forbids() {
+      return null;
+    }
+
+    @Override
+    public boolean help() {
+      return false;
+    }
+
+    @Override
+    public Class<? extends Annotation> annotationType() {
+      return o.annotationType();
+    }
+
+    private static String getPrefixedName(String prefix, String name) {
+      return prefix + name;
+    }
+  }
+
+  private class MyParser extends org.kohsuke.args4j.CmdLineParser {
+    @SuppressWarnings("rawtypes")
+    private List<OptionHandler> optionsList;
+
+    private HelpOption help;
+
+    MyParser(Object bean) {
+      super(bean, ParserProperties.defaults().withAtSyntax(false));
+      parseAdditionalOptions(bean, new HashSet<>());
+      ensureOptionsInitialized();
+    }
+
+    // NOTE: Argument annotations on bean are ignored.
+    public void parseWithPrefix(String prefix, Object bean) {
+      parseWithPrefix(prefix, bean, new HashSet<>());
+    }
+
+    private void parseWithPrefix(String prefix, Object bean, Set<Object> parsedBeans) {
+      if (!parsedBeans.add(bean)) {
+        return;
+      }
+      // recursively process all the methods/fields.
+      for (Class<?> c = bean.getClass(); c != null; c = c.getSuperclass()) {
+        for (Method m : c.getDeclaredMethods()) {
+          Option o = m.getAnnotation(Option.class);
+          if (o != null) {
+            addOption(new MethodSetter(this, bean, m), new PrefixedOption(prefix, o));
+          }
+        }
+        for (Field f : c.getDeclaredFields()) {
+          Option o = f.getAnnotation(Option.class);
+          if (o != null) {
+            addOption(Setters.create(f, bean), new PrefixedOption(prefix, o));
+          }
+          if (f.isAnnotationPresent(Options.class)) {
+            try {
+              parseWithPrefix(
+                  prefix + f.getAnnotation(Options.class).prefix(), f.get(bean), parsedBeans);
+            } catch (IllegalAccessException e) {
+              throw new IllegalAnnotationError(e);
+            }
+          }
+        }
+      }
+    }
+
+    private void parseAdditionalOptions(Object bean, Set<Object> parsedBeans) {
+      for (Class<?> c = bean.getClass(); c != null; c = c.getSuperclass()) {
+        for (Field f : c.getDeclaredFields()) {
+          if (f.isAnnotationPresent(Options.class)) {
+            Object additionalBean;
+            try {
+              additionalBean = f.get(bean);
+            } catch (IllegalAccessException e) {
+              throw new IllegalAnnotationError(e);
+            }
+            parseWithPrefix(f.getAnnotation(Options.class).prefix(), additionalBean, parsedBeans);
+          }
+        }
+      }
+    }
+
+    @SuppressWarnings({"unchecked", "rawtypes"})
+    @Override
+    protected OptionHandler createOptionHandler(OptionDef option, Setter setter) {
+      if (isHandlerSpecified(option) || isEnum(setter) || isPrimitive(setter)) {
+        return add(super.createOptionHandler(option, setter));
+      }
+
+      OptionHandlerFactory<?> factory = handlers.get(setter.getType());
+      if (factory != null) {
+        return factory.create(this, option, setter);
+      }
+      return add(super.createOptionHandler(option, setter));
+    }
+
+    @SuppressWarnings("rawtypes")
+    private OptionHandler add(OptionHandler handler) {
+      ensureOptionsInitialized();
+      optionsList.add(handler);
+      return handler;
+    }
+
+    private void ensureOptionsInitialized() {
+      if (optionsList == null) {
+        help = new HelpOption();
+        optionsList = new ArrayList<>();
+        addOption(help, help);
+      }
+    }
+
+    private boolean isHandlerSpecified(OptionDef option) {
+      return option.handler() != OptionHandler.class;
+    }
+
+    private <T> boolean isEnum(Setter<T> setter) {
+      return Enum.class.isAssignableFrom(setter.getType());
+    }
+
+    private <T> boolean isPrimitive(Setter<T> setter) {
+      return setter.getType().isPrimitive();
+    }
+  }
+
+  private static class HelpOption implements Option, Setter<Boolean> {
+    private boolean value;
+
+    @Override
+    public String name() {
+      return "--help";
+    }
+
+    @Override
+    public String[] aliases() {
+      return new String[] {"-h"};
+    }
+
+    @Override
+    public String[] depends() {
+      return new String[] {};
+    }
+
+    @Override
+    public boolean hidden() {
+      return false;
+    }
+
+    @Override
+    public String usage() {
+      return "display this help text";
+    }
+
+    @Override
+    public void addValue(Boolean val) {
+      value = val;
+    }
+
+    @Override
+    public Class<? extends OptionHandler<Boolean>> handler() {
+      return BooleanOptionHandler.class;
+    }
+
+    @Override
+    public String metaVar() {
+      return "";
+    }
+
+    @Override
+    public boolean required() {
+      return false;
+    }
+
+    @Override
+    public Class<? extends Annotation> annotationType() {
+      return Option.class;
+    }
+
+    @Override
+    public FieldSetter asFieldSetter() {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public AnnotatedElement asAnnotatedElement() {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public Class<Boolean> getType() {
+      return Boolean.class;
+    }
+
+    @Override
+    public boolean isMultiValued() {
+      return false;
+    }
+
+    @Override
+    public String[] forbids() {
+      return null;
+    }
+
+    @Override
+    public boolean help() {
+      return false;
+    }
+  }
+
+  public CmdLineException reject(String message) {
+    return new CmdLineException(parser, localizable(message));
+  }
+}
diff --git a/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/EndOfOptionsHandler.java b/java/com/google/gerrit/util/cli/EndOfOptionsHandler.java
similarity index 100%
rename from gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/EndOfOptionsHandler.java
rename to java/com/google/gerrit/util/cli/EndOfOptionsHandler.java
diff --git a/java/com/google/gerrit/util/cli/Localizable.java b/java/com/google/gerrit/util/cli/Localizable.java
new file mode 100644
index 0000000..33989d3
--- /dev/null
+++ b/java/com/google/gerrit/util/cli/Localizable.java
@@ -0,0 +1,39 @@
+// 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.
+
+package com.google.gerrit.util.cli;
+
+import java.util.Locale;
+
+public class Localizable implements org.kohsuke.args4j.Localizable {
+  private final String format;
+
+  @Override
+  public String formatWithLocale(Locale locale, Object... args) {
+    return String.format(locale, format, args);
+  }
+
+  @Override
+  public String format(Object... args) {
+    return String.format(format, args);
+  }
+
+  private Localizable(String format) {
+    this.format = format;
+  }
+
+  public static Localizable localizable(String format) {
+    return new Localizable(format);
+  }
+}
diff --git a/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/OptionHandlerFactory.java b/java/com/google/gerrit/util/cli/OptionHandlerFactory.java
similarity index 100%
rename from gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/OptionHandlerFactory.java
rename to java/com/google/gerrit/util/cli/OptionHandlerFactory.java
diff --git a/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/OptionHandlerUtil.java b/java/com/google/gerrit/util/cli/OptionHandlerUtil.java
similarity index 100%
rename from gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/OptionHandlerUtil.java
rename to java/com/google/gerrit/util/cli/OptionHandlerUtil.java
diff --git a/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/OptionHandlers.java b/java/com/google/gerrit/util/cli/OptionHandlers.java
similarity index 100%
rename from gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/OptionHandlers.java
rename to java/com/google/gerrit/util/cli/OptionHandlers.java
diff --git a/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/Options.java b/java/com/google/gerrit/util/cli/Options.java
similarity index 100%
rename from gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/Options.java
rename to java/com/google/gerrit/util/cli/Options.java
diff --git a/java/com/google/gerrit/util/http/BUILD b/java/com/google/gerrit/util/http/BUILD
new file mode 100644
index 0000000..30d3adc
--- /dev/null
+++ b/java/com/google/gerrit/util/http/BUILD
@@ -0,0 +1,6 @@
+java_library(
+    name = "http",
+    srcs = glob(["**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = ["//lib:servlet-api-3_1"],
+)
diff --git a/java/com/google/gerrit/util/http/CacheHeaders.java b/java/com/google/gerrit/util/http/CacheHeaders.java
new file mode 100644
index 0000000..454587c
--- /dev/null
+++ b/java/com/google/gerrit/util/http/CacheHeaders.java
@@ -0,0 +1,148 @@
+// Copyright (C) 2013 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.google.gerrit.util.http;
+
+import static java.util.concurrent.TimeUnit.DAYS;
+import static java.util.concurrent.TimeUnit.SECONDS;
+
+import java.util.concurrent.TimeUnit;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/** Utilities to manage HTTP caching directives in responses. */
+public class CacheHeaders {
+  private static final long MAX_CACHE_DURATION = DAYS.toSeconds(365);
+
+  /**
+   * Do not cache the response, anywhere.
+   *
+   * @param res response being returned.
+   */
+  public static void setNotCacheable(HttpServletResponse res) {
+    String cc = "no-cache, no-store, max-age=0, must-revalidate";
+    res.setHeader("Cache-Control", cc);
+    res.setHeader("Pragma", "no-cache");
+    res.setHeader("Expires", "Mon, 01 Jan 1990 00:00:00 GMT");
+    res.setDateHeader("Date", System.currentTimeMillis());
+  }
+
+  /**
+   * Permit caching the response for up to the age specified.
+   *
+   * <p>If the request is on a secure connection (e.g. SSL) private caching is used. This allows the
+   * user-agent to cache the response, but requests intermediate proxies to not cache. This may
+   * offer better protection for Set-Cookie headers.
+   *
+   * <p>If the request is on plaintext (insecure), public caching is used. This may allow an
+   * intermediate proxy to cache the response, including any Set-Cookie header that may have also
+   * been included.
+   *
+   * @param req current request.
+   * @param res response being returned.
+   * @param age how long the response can be cached.
+   * @param unit time unit for age, usually {@link TimeUnit#SECONDS}.
+   */
+  public static void setCacheable(
+      HttpServletRequest req, HttpServletResponse res, long age, TimeUnit unit) {
+    setCacheable(req, res, age, unit, false);
+  }
+
+  /**
+   * Permit caching the response for up to the age specified.
+   *
+   * <p>If the request is on a secure connection (e.g. SSL) private caching is used. This allows the
+   * user-agent to cache the response, but requests intermediate proxies to not cache. This may
+   * offer better protection for Set-Cookie headers.
+   *
+   * <p>If the request is on plaintext (insecure), public caching is used. This may allow an
+   * intermediate proxy to cache the response, including any Set-Cookie header that may have also
+   * been included.
+   *
+   * @param req current request.
+   * @param res response being returned.
+   * @param age how long the response can be cached.
+   * @param unit time unit for age, usually {@link TimeUnit#SECONDS}.
+   * @param mustRevalidate true if the client must validate the cached entity.
+   */
+  public static void setCacheable(
+      HttpServletRequest req,
+      HttpServletResponse res,
+      long age,
+      TimeUnit unit,
+      boolean mustRevalidate) {
+    if (req.isSecure()) {
+      setCacheablePrivate(res, age, unit, mustRevalidate);
+    } else {
+      setCacheablePublic(res, age, unit, mustRevalidate);
+    }
+  }
+
+  /**
+   * Allow the response to be cached by proxies and user-agents.
+   *
+   * <p>If the response includes a Set-Cookie header the cookie may be cached by a proxy and
+   * returned to multiple browsers behind the same proxy. This is insecure for authenticated
+   * connections.
+   *
+   * @param res response being returned.
+   * @param age how long the response can be cached.
+   * @param unit time unit for age, usually {@link TimeUnit#SECONDS}.
+   * @param mustRevalidate true if the client must validate the cached entity.
+   */
+  public static void setCacheablePublic(
+      HttpServletResponse res, long age, TimeUnit unit, boolean mustRevalidate) {
+    long now = System.currentTimeMillis();
+    long sec = maxAgeSeconds(age, unit);
+
+    res.setDateHeader("Expires", now + SECONDS.toMillis(sec));
+    res.setDateHeader("Date", now);
+    cache(res, "public", age, unit, mustRevalidate);
+  }
+
+  /**
+   * Allow the response to be cached only by the user-agent.
+   *
+   * @param res response being returned.
+   * @param age how long the response can be cached.
+   * @param unit time unit for age, usually {@link TimeUnit#SECONDS}.
+   * @param mustRevalidate true if the client must validate the cached entity.
+   */
+  public static void setCacheablePrivate(
+      HttpServletResponse res, long age, TimeUnit unit, boolean mustRevalidate) {
+    long now = System.currentTimeMillis();
+    res.setDateHeader("Expires", now);
+    res.setDateHeader("Date", now);
+    cache(res, "private", age, unit, mustRevalidate);
+  }
+
+  public static boolean hasCacheHeader(HttpServletResponse res) {
+    return res.containsHeader("Cache-Control") || res.containsHeader("Expires");
+  }
+
+  private static void cache(
+      HttpServletResponse res, String type, long age, TimeUnit unit, boolean revalidate) {
+    res.setHeader(
+        "Cache-Control",
+        String.format(
+            "%s, max-age=%d%s",
+            type, maxAgeSeconds(age, unit), revalidate ? ", must-revalidate" : ""));
+  }
+
+  private static long maxAgeSeconds(long age, TimeUnit unit) {
+    return Math.min(unit.toSeconds(age), MAX_CACHE_DURATION);
+  }
+
+  private CacheHeaders() {}
+}
diff --git a/gerrit-util-http/src/main/java/com/google/gerrit/util/http/RequestUtil.java b/java/com/google/gerrit/util/http/RequestUtil.java
similarity index 100%
rename from gerrit-util-http/src/main/java/com/google/gerrit/util/http/RequestUtil.java
rename to java/com/google/gerrit/util/http/RequestUtil.java
diff --git a/java/com/google/gerrit/util/ssl/BUILD b/java/com/google/gerrit/util/ssl/BUILD
new file mode 100644
index 0000000..4f65b61
--- /dev/null
+++ b/java/com/google/gerrit/util/ssl/BUILD
@@ -0,0 +1,5 @@
+java_library(
+    name = "ssl",
+    srcs = glob(["**/*.java"]),
+    visibility = ["//visibility:public"],
+)
diff --git a/java/com/google/gerrit/util/ssl/BlindHostnameVerifier.java b/java/com/google/gerrit/util/ssl/BlindHostnameVerifier.java
new file mode 100644
index 0000000..ac758690
--- /dev/null
+++ b/java/com/google/gerrit/util/ssl/BlindHostnameVerifier.java
@@ -0,0 +1,33 @@
+// 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.
+
+package com.google.gerrit.util.ssl;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLSession;
+
+/** HostnameVerifier that ignores host name. */
+public class BlindHostnameVerifier implements HostnameVerifier {
+
+  private static final HostnameVerifier INSTANCE = new BlindHostnameVerifier();
+
+  public static HostnameVerifier getInstance() {
+    return INSTANCE;
+  }
+
+  @Override
+  public boolean verify(String hostname, SSLSession session) {
+    return true;
+  }
+}
diff --git a/gerrit-util-ssl/src/main/java/com/google/gerrit/util/ssl/BlindSSLSocketFactory.java b/java/com/google/gerrit/util/ssl/BlindSSLSocketFactory.java
similarity index 100%
rename from gerrit-util-ssl/src/main/java/com/google/gerrit/util/ssl/BlindSSLSocketFactory.java
rename to java/com/google/gerrit/util/ssl/BlindSSLSocketFactory.java
diff --git a/java/com/google/gwtexpui/clippy/BUILD b/java/com/google/gwtexpui/clippy/BUILD
new file mode 100644
index 0000000..80b6767
--- /dev/null
+++ b/java/com/google/gwtexpui/clippy/BUILD
@@ -0,0 +1,23 @@
+load("//tools/bzl:gwt.bzl", "gwt_module")
+
+gwt_module(
+    name = "clippy",
+    srcs = glob(["client/*.java"]),
+    data = [
+        "//lib:LICENSE-clippy",
+        "//lib:LICENSE-silk_icons",
+    ],
+    gwt_xml = "Clippy.gwt.xml",
+    resources = [
+        "client/CopyableLabelText.properties",
+        "client/clippy.css",
+        "client/clippy.swf",
+        "client/page_white_copy.png",
+    ],
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gwtexpui/safehtml",
+        "//java/com/google/gwtexpui/user:agent",
+        "//lib/gwt:user-neverlink",
+    ],
+)
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/Clippy.gwt.xml b/java/com/google/gwtexpui/clippy/Clippy.gwt.xml
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/Clippy.gwt.xml
rename to java/com/google/gwtexpui/clippy/Clippy.gwt.xml
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/client/ClippyCss.java b/java/com/google/gwtexpui/clippy/client/ClippyCss.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/client/ClippyCss.java
rename to java/com/google/gwtexpui/clippy/client/ClippyCss.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/client/ClippyResources.java b/java/com/google/gwtexpui/clippy/client/ClippyResources.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/client/ClippyResources.java
rename to java/com/google/gwtexpui/clippy/client/ClippyResources.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/client/CopyableLabel.java b/java/com/google/gwtexpui/clippy/client/CopyableLabel.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/client/CopyableLabel.java
rename to java/com/google/gwtexpui/clippy/client/CopyableLabel.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/client/CopyableLabelText.java b/java/com/google/gwtexpui/clippy/client/CopyableLabelText.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/client/CopyableLabelText.java
rename to java/com/google/gwtexpui/clippy/client/CopyableLabelText.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/client/CopyableLabelText.properties b/java/com/google/gwtexpui/clippy/client/CopyableLabelText.properties
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/client/CopyableLabelText.properties
rename to java/com/google/gwtexpui/clippy/client/CopyableLabelText.properties
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/client/clippy.css b/java/com/google/gwtexpui/clippy/client/clippy.css
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/client/clippy.css
rename to java/com/google/gwtexpui/clippy/client/clippy.css
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/client/clippy.swf b/java/com/google/gwtexpui/clippy/client/clippy.swf
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/client/clippy.swf
rename to java/com/google/gwtexpui/clippy/client/clippy.swf
Binary files differ
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/client/page_white_copy.png b/java/com/google/gwtexpui/clippy/client/page_white_copy.png
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/client/page_white_copy.png
rename to java/com/google/gwtexpui/clippy/client/page_white_copy.png
Binary files differ
diff --git a/java/com/google/gwtexpui/css/BUILD b/java/com/google/gwtexpui/css/BUILD
new file mode 100644
index 0000000..6fbfc30
--- /dev/null
+++ b/java/com/google/gwtexpui/css/BUILD
@@ -0,0 +1,7 @@
+java_library(
+    name = "css",
+    srcs = glob(["rebind/*.java"]),
+    resources = ["CSS.gwt.xml"],
+    visibility = ["//visibility:public"],
+    deps = ["//lib/gwt:dev"],
+)
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/css/CSS.gwt.xml b/java/com/google/gwtexpui/css/CSS.gwt.xml
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/css/CSS.gwt.xml
rename to java/com/google/gwtexpui/css/CSS.gwt.xml
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/css/rebind/CssLinker.java b/java/com/google/gwtexpui/css/rebind/CssLinker.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/css/rebind/CssLinker.java
rename to java/com/google/gwtexpui/css/rebind/CssLinker.java
diff --git a/java/com/google/gwtexpui/globalkey/BUILD b/java/com/google/gwtexpui/globalkey/BUILD
new file mode 100644
index 0000000..c637194
--- /dev/null
+++ b/java/com/google/gwtexpui/globalkey/BUILD
@@ -0,0 +1,17 @@
+load("//tools/bzl:gwt.bzl", "gwt_module")
+
+gwt_module(
+    name = "globalkey",
+    srcs = glob(["client/*.java"]),
+    gwt_xml = "GlobalKey.gwt.xml",
+    resources = [
+        "client/KeyConstants.properties",
+        "client/key.css",
+    ],
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gwtexpui/safehtml",
+        "//java/com/google/gwtexpui/user:agent",
+        "//lib/gwt:user",
+    ],
+)
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/GlobalKey.gwt.xml b/java/com/google/gwtexpui/globalkey/GlobalKey.gwt.xml
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/GlobalKey.gwt.xml
rename to java/com/google/gwtexpui/globalkey/GlobalKey.gwt.xml
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/CompoundKeyCommand.java b/java/com/google/gwtexpui/globalkey/client/CompoundKeyCommand.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/CompoundKeyCommand.java
rename to java/com/google/gwtexpui/globalkey/client/CompoundKeyCommand.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/DocWidget.java b/java/com/google/gwtexpui/globalkey/client/DocWidget.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/DocWidget.java
rename to java/com/google/gwtexpui/globalkey/client/DocWidget.java
diff --git a/java/com/google/gwtexpui/globalkey/client/GlobalKey.java b/java/com/google/gwtexpui/globalkey/client/GlobalKey.java
new file mode 100644
index 0000000..cbaca61
--- /dev/null
+++ b/java/com/google/gwtexpui/globalkey/client/GlobalKey.java
@@ -0,0 +1,191 @@
+// Copyright (C) 2009 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.google.gwtexpui.globalkey.client;
+
+import com.google.gwt.event.dom.client.DomEvent;
+import com.google.gwt.event.dom.client.KeyCodes;
+import com.google.gwt.event.dom.client.KeyDownEvent;
+import com.google.gwt.event.dom.client.KeyDownHandler;
+import com.google.gwt.event.dom.client.KeyPressEvent;
+import com.google.gwt.event.dom.client.KeyPressHandler;
+import com.google.gwt.event.logical.shared.CloseEvent;
+import com.google.gwt.event.logical.shared.CloseHandler;
+import com.google.gwt.event.shared.HandlerRegistration;
+import com.google.gwt.user.client.Timer;
+import com.google.gwt.user.client.ui.PopupPanel;
+import com.google.gwt.user.client.ui.Widget;
+
+public class GlobalKey {
+  public static final KeyPressHandler STOP_PROPAGATION = DomEvent::stopPropagation;
+
+  private static State global;
+  static State active;
+  private static CloseHandler<PopupPanel> restoreGlobal;
+  private static Timer restoreTimer;
+
+  static {
+    KeyResources.I.css().ensureInjected();
+  }
+
+  private static void initEvents() {
+    if (active == null) {
+      DocWidget.get()
+          .addKeyPressHandler(
+              new KeyPressHandler() {
+                @Override
+                public void onKeyPress(KeyPressEvent event) {
+                  final KeyCommandSet s = active.live;
+                  if (s != active.all) {
+                    active.live = active.all;
+                    restoreTimer.cancel();
+                  }
+                  s.onKeyPress(event);
+                }
+              });
+
+      restoreTimer =
+          new Timer() {
+            @Override
+            public void run() {
+              active.live = active.all;
+            }
+          };
+
+      global = new State(null);
+      active = global;
+    }
+  }
+
+  private static void initDialog() {
+    if (restoreGlobal == null) {
+      restoreGlobal =
+          new CloseHandler<PopupPanel>() {
+            @Override
+            public void onClose(CloseEvent<PopupPanel> event) {
+              active = global;
+            }
+          };
+    }
+  }
+
+  static void temporaryWithTimeout(KeyCommandSet s) {
+    active.live = s;
+    restoreTimer.schedule(250);
+  }
+
+  public static void dialog(PopupPanel panel) {
+    initEvents();
+    initDialog();
+    assert panel.isShowing();
+    assert active == global;
+    active = new State(panel);
+    active.add(new HidePopupPanelCommand(0, KeyCodes.KEY_ESCAPE, panel));
+    panel.addCloseHandler(restoreGlobal);
+    panel.addDomHandler(
+        new KeyDownHandler() {
+          @Override
+          public void onKeyDown(KeyDownEvent event) {
+            if (event.getNativeKeyCode() == KeyCodes.KEY_ESCAPE) {
+              panel.hide();
+            }
+          }
+        },
+        KeyDownEvent.getType());
+  }
+
+  public static HandlerRegistration addApplication(Widget widget, KeyCommand appKey) {
+    initEvents();
+    final State state = stateFor(widget);
+    state.add(appKey);
+    return new HandlerRegistration() {
+      @Override
+      public void removeHandler() {
+        state.remove(appKey);
+      }
+    };
+  }
+
+  public static HandlerRegistration add(Widget widget, KeyCommandSet cmdSet) {
+    initEvents();
+    final State state = stateFor(widget);
+    state.add(cmdSet);
+    return new HandlerRegistration() {
+      @Override
+      public void removeHandler() {
+        state.remove(cmdSet);
+      }
+    };
+  }
+
+  private static State stateFor(Widget w) {
+    while (w != null) {
+      if (w == active.root) {
+        return active;
+      }
+      w = w.getParent();
+    }
+    return global;
+  }
+
+  public static void filter(KeyCommandFilter filter) {
+    active.filter(filter);
+    if (active != global) {
+      global.filter(filter);
+    }
+  }
+
+  private GlobalKey() {}
+
+  static class State {
+    final Widget root;
+    final KeyCommandSet app;
+    final KeyCommandSet all;
+    KeyCommandSet live;
+
+    State(Widget r) {
+      root = r;
+
+      app = new KeyCommandSet(KeyConstants.I.applicationSection());
+      app.add(ShowHelpCommand.INSTANCE);
+
+      all = new KeyCommandSet();
+      all.add(app);
+
+      live = all;
+    }
+
+    void add(KeyCommand k) {
+      app.add(k);
+      all.add(k);
+    }
+
+    void remove(KeyCommand k) {
+      app.remove(k);
+      all.remove(k);
+    }
+
+    void add(KeyCommandSet s) {
+      all.add(s);
+    }
+
+    void remove(KeyCommandSet s) {
+      all.remove(s);
+    }
+
+    void filter(KeyCommandFilter f) {
+      all.filter(f);
+    }
+  }
+}
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/HidePopupPanelCommand.java b/java/com/google/gwtexpui/globalkey/client/HidePopupPanelCommand.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/HidePopupPanelCommand.java
rename to java/com/google/gwtexpui/globalkey/client/HidePopupPanelCommand.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyCommand.java b/java/com/google/gwtexpui/globalkey/client/KeyCommand.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyCommand.java
rename to java/com/google/gwtexpui/globalkey/client/KeyCommand.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyCommandFilter.java b/java/com/google/gwtexpui/globalkey/client/KeyCommandFilter.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyCommandFilter.java
rename to java/com/google/gwtexpui/globalkey/client/KeyCommandFilter.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyCommandSet.java b/java/com/google/gwtexpui/globalkey/client/KeyCommandSet.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyCommandSet.java
rename to java/com/google/gwtexpui/globalkey/client/KeyCommandSet.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyConstants.java b/java/com/google/gwtexpui/globalkey/client/KeyConstants.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyConstants.java
rename to java/com/google/gwtexpui/globalkey/client/KeyConstants.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyConstants.properties b/java/com/google/gwtexpui/globalkey/client/KeyConstants.properties
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyConstants.properties
rename to java/com/google/gwtexpui/globalkey/client/KeyConstants.properties
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyCss.java b/java/com/google/gwtexpui/globalkey/client/KeyCss.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyCss.java
rename to java/com/google/gwtexpui/globalkey/client/KeyCss.java
diff --git a/java/com/google/gwtexpui/globalkey/client/KeyHelpPopup.java b/java/com/google/gwtexpui/globalkey/client/KeyHelpPopup.java
new file mode 100644
index 0000000..20d093e
--- /dev/null
+++ b/java/com/google/gwtexpui/globalkey/client/KeyHelpPopup.java
@@ -0,0 +1,233 @@
+// Copyright (C) 2009 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.google.gwtexpui.globalkey.client;
+
+import static java.util.Comparator.comparing;
+import static java.util.stream.Collectors.toList;
+
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.event.dom.client.KeyCodes;
+import com.google.gwt.event.dom.client.KeyDownEvent;
+import com.google.gwt.event.dom.client.KeyDownHandler;
+import com.google.gwt.event.dom.client.KeyPressEvent;
+import com.google.gwt.event.dom.client.KeyPressHandler;
+import com.google.gwt.user.client.DOM;
+import com.google.gwt.user.client.ui.Anchor;
+import com.google.gwt.user.client.ui.FlowPanel;
+import com.google.gwt.user.client.ui.FocusPanel;
+import com.google.gwt.user.client.ui.Grid;
+import com.google.gwt.user.client.ui.HTMLTable.CellFormatter;
+import com.google.gwt.user.client.ui.HasHorizontalAlignment;
+import com.google.gwt.user.client.ui.PopupPanel;
+import com.google.gwtexpui.safehtml.client.SafeHtml;
+import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+public class KeyHelpPopup extends PopupPanel implements KeyPressHandler, KeyDownHandler {
+  private final FocusPanel focus;
+
+  public KeyHelpPopup() {
+    super(true /* autohide */, true /* modal */);
+    setStyleName(KeyResources.I.css().helpPopup());
+
+    final Anchor closer = new Anchor(KeyConstants.I.closeButton());
+    closer.addClickHandler(
+        new ClickHandler() {
+          @Override
+          public void onClick(ClickEvent event) {
+            hide();
+          }
+        });
+
+    final Grid header = new Grid(1, 3);
+    header.setStyleName(KeyResources.I.css().helpHeader());
+    header.setText(0, 0, KeyConstants.I.keyboardShortcuts());
+    header.setWidget(0, 2, closer);
+
+    final CellFormatter fmt = header.getCellFormatter();
+    fmt.addStyleName(0, 1, KeyResources.I.css().helpHeaderGlue());
+    fmt.setHorizontalAlignment(0, 2, HasHorizontalAlignment.ALIGN_RIGHT);
+
+    final Grid lists = new Grid(0, 7);
+    lists.setStyleName(KeyResources.I.css().helpTable());
+    populate(lists);
+    lists.getCellFormatter().addStyleName(0, 3, KeyResources.I.css().helpTableGlue());
+
+    final FlowPanel body = new FlowPanel();
+    body.add(header);
+    body.getElement().appendChild(DOM.createElement("hr"));
+    body.add(lists);
+
+    focus = new FocusPanel(body);
+    focus.getElement().getStyle().setProperty("outline", "0px");
+    focus.getElement().setAttribute("hideFocus", "true");
+    focus.addKeyPressHandler(this);
+    focus.addKeyDownHandler(this);
+    add(focus);
+  }
+
+  @Override
+  public void setVisible(boolean show) {
+    super.setVisible(show);
+    if (show) {
+      focus.setFocus(true);
+    }
+  }
+
+  @Override
+  public void onKeyPress(KeyPressEvent event) {
+    if (KeyCommandSet.toMask(event) == ShowHelpCommand.INSTANCE.keyMask) {
+      // Block the '?' key from triggering us to show right after
+      // we just hide ourselves.
+      //
+      event.stopPropagation();
+      event.preventDefault();
+    }
+    hide();
+  }
+
+  @Override
+  public void onKeyDown(KeyDownEvent event) {
+    if (event.getNativeKeyCode() == KeyCodes.KEY_ESCAPE) {
+      hide();
+    }
+  }
+
+  private void populate(Grid lists) {
+    int[] end = new int[5];
+    int column = 0;
+    for (KeyCommandSet set : combinedSetsByName()) {
+      int row = end[column];
+      row = formatGroup(lists, row, column, set);
+      end[column] = row;
+      if (column == 0) {
+        column = 4;
+      } else {
+        column = 0;
+      }
+    }
+  }
+
+  /**
+   * @return an ordered collection of KeyCommandSet, combining sets which share the same name, so
+   *     that each set name appears at most once.
+   */
+  private static Collection<KeyCommandSet> combinedSetsByName() {
+    LinkedHashMap<String, KeyCommandSet> byName = new LinkedHashMap<>();
+    for (KeyCommandSet set : GlobalKey.active.all.getSets()) {
+      KeyCommandSet v = byName.get(set.getName());
+      if (v == null) {
+        v = new KeyCommandSet(set.getName());
+        byName.put(v.getName(), v);
+      }
+      v.add(set);
+    }
+    return byName.values();
+  }
+
+  private int formatGroup(Grid lists, int row, int col, KeyCommandSet set) {
+    if (set.isEmpty()) {
+      return row;
+    }
+
+    if (lists.getRowCount() < row + 1) {
+      lists.resizeRows(row + 1);
+    }
+    lists.setText(row, col + 2, set.getName());
+    lists.getCellFormatter().addStyleName(row, col + 2, KeyResources.I.css().helpGroup());
+    row++;
+
+    return formatKeys(lists, row, col, set, null);
+  }
+
+  private int formatKeys(final Grid lists, int row, int col, KeyCommandSet set, SafeHtml prefix) {
+    final CellFormatter fmt = lists.getCellFormatter();
+    final List<KeyCommand> keys = sort(set);
+    if (lists.getRowCount() < row + keys.size()) {
+      lists.resizeRows(row + keys.size());
+    }
+
+    Map<KeyCommand, Integer> rows = new HashMap<>();
+    FORMAT_KEYS:
+    for (int i = 0; i < keys.size(); i++) {
+      final KeyCommand k = keys.get(i);
+      if (rows.containsKey(k)) {
+        continue;
+      }
+
+      if (k instanceof CompoundKeyCommand) {
+        final SafeHtmlBuilder b = new SafeHtmlBuilder();
+        b.append(k.describeKeyStroke());
+        row = formatKeys(lists, row, col, ((CompoundKeyCommand) k).getSet(), b);
+        continue;
+      }
+
+      for (int prior = 0; prior < i; prior++) {
+        if (KeyCommand.same(keys.get(prior), k)) {
+          final int r = rows.get(keys.get(prior));
+          final SafeHtmlBuilder b = new SafeHtmlBuilder();
+          b.append(SafeHtml.get(lists, r, col + 0));
+          b.append(" ");
+          b.append(KeyConstants.I.orOtherKey());
+          b.append(" ");
+          if (prefix != null) {
+            b.append(prefix);
+            b.append(" ");
+            b.append(KeyConstants.I.thenOtherKey());
+            b.append(" ");
+          }
+          b.append(k.describeKeyStroke());
+          SafeHtml.set(lists, r, col + 0, b);
+          rows.put(k, r);
+          continue FORMAT_KEYS;
+        }
+      }
+
+      SafeHtmlBuilder b = new SafeHtmlBuilder();
+      String t = k.getHelpText();
+      if (prefix != null) {
+        b.append(prefix);
+        b.append(" ");
+        b.append(KeyConstants.I.thenOtherKey());
+        b.append(" ");
+      }
+      b.append(k.describeKeyStroke());
+      if (k.sibling != null) {
+        b.append(" / ").append(k.sibling.describeKeyStroke());
+        t += " / " + k.sibling.getHelpText();
+        rows.put(k.sibling, row);
+      }
+      SafeHtml.set(lists, row, col + 0, b);
+      lists.setText(row, col + 1, ":");
+      lists.setText(row, col + 2, t);
+      rows.put(k, row);
+
+      fmt.addStyleName(row, col + 0, KeyResources.I.css().helpKeyStroke());
+      fmt.addStyleName(row, col + 1, KeyResources.I.css().helpSeparator());
+      row++;
+    }
+
+    return row;
+  }
+
+  private List<KeyCommand> sort(KeyCommandSet set) {
+    return set.getKeys().stream().sorted(comparing(KeyCommand::getHelpText)).collect(toList());
+  }
+}
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyResources.java b/java/com/google/gwtexpui/globalkey/client/KeyResources.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyResources.java
rename to java/com/google/gwtexpui/globalkey/client/KeyResources.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/NpTextArea.java b/java/com/google/gwtexpui/globalkey/client/NpTextArea.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/NpTextArea.java
rename to java/com/google/gwtexpui/globalkey/client/NpTextArea.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/NpTextBox.java b/java/com/google/gwtexpui/globalkey/client/NpTextBox.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/NpTextBox.java
rename to java/com/google/gwtexpui/globalkey/client/NpTextBox.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/ShowHelpCommand.java b/java/com/google/gwtexpui/globalkey/client/ShowHelpCommand.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/ShowHelpCommand.java
rename to java/com/google/gwtexpui/globalkey/client/ShowHelpCommand.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/key.css b/java/com/google/gwtexpui/globalkey/client/key.css
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/key.css
rename to java/com/google/gwtexpui/globalkey/client/key.css
diff --git a/java/com/google/gwtexpui/progress/BUILD b/java/com/google/gwtexpui/progress/BUILD
new file mode 100644
index 0000000..74caa57
--- /dev/null
+++ b/java/com/google/gwtexpui/progress/BUILD
@@ -0,0 +1,10 @@
+load("//tools/bzl:gwt.bzl", "gwt_module")
+
+gwt_module(
+    name = "progress",
+    srcs = glob(["client/*.java"]),
+    gwt_xml = "Progress.gwt.xml",
+    resources = ["client/progress.css"],
+    visibility = ["//visibility:public"],
+    deps = ["//lib/gwt:user"],
+)
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/progress/Progress.gwt.xml b/java/com/google/gwtexpui/progress/Progress.gwt.xml
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/progress/Progress.gwt.xml
rename to java/com/google/gwtexpui/progress/Progress.gwt.xml
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/progress/client/ProgressBar.java b/java/com/google/gwtexpui/progress/client/ProgressBar.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/progress/client/ProgressBar.java
rename to java/com/google/gwtexpui/progress/client/ProgressBar.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/progress/client/ProgressCss.java b/java/com/google/gwtexpui/progress/client/ProgressCss.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/progress/client/ProgressCss.java
rename to java/com/google/gwtexpui/progress/client/ProgressCss.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/progress/client/ProgressResources.java b/java/com/google/gwtexpui/progress/client/ProgressResources.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/progress/client/ProgressResources.java
rename to java/com/google/gwtexpui/progress/client/ProgressResources.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/progress/client/progress.css b/java/com/google/gwtexpui/progress/client/progress.css
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/progress/client/progress.css
rename to java/com/google/gwtexpui/progress/client/progress.css
diff --git a/java/com/google/gwtexpui/safehtml/BUILD b/java/com/google/gwtexpui/safehtml/BUILD
new file mode 100644
index 0000000..af85c33
--- /dev/null
+++ b/java/com/google/gwtexpui/safehtml/BUILD
@@ -0,0 +1,10 @@
+load("//tools/bzl:gwt.bzl", "gwt_module")
+
+gwt_module(
+    name = "safehtml",
+    srcs = glob(["client/*.java"]),
+    gwt_xml = "SafeHtml.gwt.xml",
+    resources = ["client/safehtml.css"],
+    visibility = ["//visibility:public"],
+    deps = ["//lib/gwt:user"],
+)
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/SafeHtml.gwt.xml b/java/com/google/gwtexpui/safehtml/SafeHtml.gwt.xml
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/SafeHtml.gwt.xml
rename to java/com/google/gwtexpui/safehtml/SafeHtml.gwt.xml
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/AttMap.java b/java/com/google/gwtexpui/safehtml/client/AttMap.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/AttMap.java
rename to java/com/google/gwtexpui/safehtml/client/AttMap.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/Buffer.java b/java/com/google/gwtexpui/safehtml/client/Buffer.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/Buffer.java
rename to java/com/google/gwtexpui/safehtml/client/Buffer.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/BufferDirect.java b/java/com/google/gwtexpui/safehtml/client/BufferDirect.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/BufferDirect.java
rename to java/com/google/gwtexpui/safehtml/client/BufferDirect.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/BufferSealElement.java b/java/com/google/gwtexpui/safehtml/client/BufferSealElement.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/BufferSealElement.java
rename to java/com/google/gwtexpui/safehtml/client/BufferSealElement.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/FindReplace.java b/java/com/google/gwtexpui/safehtml/client/FindReplace.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/FindReplace.java
rename to java/com/google/gwtexpui/safehtml/client/FindReplace.java
diff --git a/java/com/google/gwtexpui/safehtml/client/HighlightSuggestOracle.java b/java/com/google/gwtexpui/safehtml/client/HighlightSuggestOracle.java
new file mode 100644
index 0000000..758521f
--- /dev/null
+++ b/java/com/google/gwtexpui/safehtml/client/HighlightSuggestOracle.java
@@ -0,0 +1,151 @@
+// Copyright (C) 2009 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.google.gwtexpui.safehtml.client;
+
+import static java.util.Comparator.comparing;
+import static java.util.stream.Collectors.toList;
+
+import com.google.gwt.user.client.ui.SuggestOracle;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * A suggestion oracle that tries to highlight the matched text.
+ *
+ * <p>Suggestions supplied by the implementation of {@link #onRequestSuggestions(Request, Callback)}
+ * are modified to wrap all occurrences of the {@link
+ * com.google.gwt.user.client.ui.SuggestOracle.Request#getQuery()} substring in HTML {@code
+ * &lt;strong&gt;} tags, so they can be emphasized to the user.
+ */
+public abstract class HighlightSuggestOracle extends SuggestOracle {
+  private static String escape(String ds) {
+    return new SafeHtmlBuilder().append(ds).asString();
+  }
+
+  @Override
+  public final boolean isDisplayStringHTML() {
+    return true;
+  }
+
+  @Override
+  public final void requestSuggestions(Request request, Callback cb) {
+    onRequestSuggestions(
+        request,
+        new Callback() {
+          @Override
+          public void onSuggestionsReady(Request request, Response response) {
+            final String qpat = getQueryPattern(request.getQuery());
+            final boolean html = isHTML();
+            final ArrayList<Suggestion> r = new ArrayList<>();
+            for (Suggestion s : response.getSuggestions()) {
+              r.add(new BoldSuggestion(qpat, s, html));
+            }
+            cb.onSuggestionsReady(request, new Response(r));
+          }
+        });
+  }
+
+  protected String getQueryPattern(String query) {
+    return query;
+  }
+
+  /**
+   * @return true if {@link
+   *     com.google.gwt.user.client.ui.SuggestOracle.Suggestion#getDisplayString()} returns HTML;
+   *     false if the text must be escaped before evaluating in an HTML like context.
+   */
+  protected boolean isHTML() {
+    return false;
+  }
+
+  /** Compute the suggestions and return them for display. */
+  protected abstract void onRequestSuggestions(Request request, Callback done);
+
+  private static class BoldSuggestion implements Suggestion {
+    private final Suggestion suggestion;
+    private final String displayString;
+
+    BoldSuggestion(String qstr, Suggestion s, boolean html) {
+      suggestion = s;
+
+      String ds = s.getDisplayString();
+      if (!html) {
+        ds = escape(ds);
+      }
+
+      if (qstr != null && !qstr.isEmpty()) {
+        StringBuilder pattern = new StringBuilder();
+        for (String qterm : splitQuery(qstr)) {
+          qterm = escape(qterm);
+          // We now surround qstr by <strong>. But the chosen approach is not too
+          // smooth, if qstr is small (e.g.: "t") and this small qstr may occur in
+          // escapes (e.g.: "Tim &lt;email@example.org&gt;"). Those escapes will
+          // get <strong>-ed as well (e.g.: "&lt;" -> "&<strong>l</strong>t;"). But
+          // as repairing those mangled escapes is easier than not mangling them in
+          // the first place, we repair them afterwards.
+          if (pattern.length() > 0) {
+            pattern.append("|");
+          }
+          pattern.append(qterm);
+        }
+
+        ds = sgi(ds, "(" + pattern.toString() + ")", "<strong>$1</strong>");
+
+        // Repairing <strong>-ed escapes.
+        ds = sgi(ds, "(&[a-z]*)<strong>([a-z]*)</strong>([a-z]*;)", "$1$2$3");
+      }
+
+      displayString = ds;
+    }
+
+    /**
+     * Split the query by whitespace and filter out query terms which are substrings of other query
+     * terms.
+     */
+    private static List<String> splitQuery(String query) {
+      List<String> queryTerms =
+          Arrays.stream(query.split("\\s+")).sorted(comparing(String::length)).collect(toList());
+
+      List<String> result = new ArrayList<>();
+      for (String s : queryTerms) {
+        boolean add = true;
+        for (String queryTerm : result) {
+          if (queryTerm.toLowerCase().contains(s.toLowerCase())) {
+            add = false;
+            break;
+          }
+        }
+        if (add) {
+          result.add(s);
+        }
+      }
+      return result;
+    }
+
+    private static native String sgi(String inString, String pat, String newHtml)
+        /*-{ return inString.replace(RegExp(pat, 'gi'), newHtml); }-*/ ;
+
+    @Override
+    public String getDisplayString() {
+      return displayString;
+    }
+
+    @Override
+    public String getReplacementString() {
+      return suggestion.getReplacementString();
+    }
+  }
+}
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/LinkFindReplace.java b/java/com/google/gwtexpui/safehtml/client/LinkFindReplace.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/LinkFindReplace.java
rename to java/com/google/gwtexpui/safehtml/client/LinkFindReplace.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/RawFindReplace.java b/java/com/google/gwtexpui/safehtml/client/RawFindReplace.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/RawFindReplace.java
rename to java/com/google/gwtexpui/safehtml/client/RawFindReplace.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/SafeHtml.java b/java/com/google/gwtexpui/safehtml/client/SafeHtml.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/SafeHtml.java
rename to java/com/google/gwtexpui/safehtml/client/SafeHtml.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/SafeHtmlBuilder.java b/java/com/google/gwtexpui/safehtml/client/SafeHtmlBuilder.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/SafeHtmlBuilder.java
rename to java/com/google/gwtexpui/safehtml/client/SafeHtmlBuilder.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/SafeHtmlCss.java b/java/com/google/gwtexpui/safehtml/client/SafeHtmlCss.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/SafeHtmlCss.java
rename to java/com/google/gwtexpui/safehtml/client/SafeHtmlCss.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/SafeHtmlResources.java b/java/com/google/gwtexpui/safehtml/client/SafeHtmlResources.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/SafeHtmlResources.java
rename to java/com/google/gwtexpui/safehtml/client/SafeHtmlResources.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/SafeHtmlString.java b/java/com/google/gwtexpui/safehtml/client/SafeHtmlString.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/SafeHtmlString.java
rename to java/com/google/gwtexpui/safehtml/client/SafeHtmlString.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/safehtml.css b/java/com/google/gwtexpui/safehtml/client/safehtml.css
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/safehtml.css
rename to java/com/google/gwtexpui/safehtml/client/safehtml.css
diff --git a/java/com/google/gwtexpui/user/BUILD b/java/com/google/gwtexpui/user/BUILD
new file mode 100644
index 0000000..813f433
--- /dev/null
+++ b/java/com/google/gwtexpui/user/BUILD
@@ -0,0 +1,10 @@
+load("//tools/bzl:gwt.bzl", "gwt_module")
+
+gwt_module(
+    name = "agent",
+    srcs = glob(["client/*.java"]),
+    gwt_xml = "User.gwt.xml",
+    resources = ["client/tooltip.css"],
+    visibility = ["//visibility:public"],
+    deps = ["//lib/gwt:user"],
+)
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/User.gwt.xml b/java/com/google/gwtexpui/user/User.gwt.xml
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/User.gwt.xml
rename to java/com/google/gwtexpui/user/User.gwt.xml
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/AutoCenterDialogBox.java b/java/com/google/gwtexpui/user/client/AutoCenterDialogBox.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/AutoCenterDialogBox.java
rename to java/com/google/gwtexpui/user/client/AutoCenterDialogBox.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/Tooltip.java b/java/com/google/gwtexpui/user/client/Tooltip.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/Tooltip.java
rename to java/com/google/gwtexpui/user/client/Tooltip.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/UserAgent.java b/java/com/google/gwtexpui/user/client/UserAgent.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/UserAgent.java
rename to java/com/google/gwtexpui/user/client/UserAgent.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/View.java b/java/com/google/gwtexpui/user/client/View.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/View.java
rename to java/com/google/gwtexpui/user/client/View.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/ViewSite.java b/java/com/google/gwtexpui/user/client/ViewSite.java
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/ViewSite.java
rename to java/com/google/gwtexpui/user/client/ViewSite.java
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/tooltip.css b/java/com/google/gwtexpui/user/client/tooltip.css
similarity index 100%
rename from gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/tooltip.css
rename to java/com/google/gwtexpui/user/client/tooltip.css
diff --git a/java/gerrit/AbstractCommitUserIdentityPredicate.java b/java/gerrit/AbstractCommitUserIdentityPredicate.java
new file mode 100644
index 0000000..1bfc95c
--- /dev/null
+++ b/java/gerrit/AbstractCommitUserIdentityPredicate.java
@@ -0,0 +1,93 @@
+// Copyright (C) 2011 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 gerrit;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.account.Emails;
+import com.google.gerrit.server.rules.PrologEnvironment;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
+import com.googlecode.prolog_cafe.exceptions.SystemException;
+import com.googlecode.prolog_cafe.lang.IntegerTerm;
+import com.googlecode.prolog_cafe.lang.Operation;
+import com.googlecode.prolog_cafe.lang.Predicate;
+import com.googlecode.prolog_cafe.lang.Prolog;
+import com.googlecode.prolog_cafe.lang.StructureTerm;
+import com.googlecode.prolog_cafe.lang.SymbolTerm;
+import com.googlecode.prolog_cafe.lang.Term;
+import java.io.IOException;
+import org.eclipse.jgit.lib.PersonIdent;
+
+abstract class AbstractCommitUserIdentityPredicate extends Predicate.P3 {
+  private static final SymbolTerm user = SymbolTerm.intern("user", 1);
+  private static final SymbolTerm anonymous = SymbolTerm.intern("anonymous");
+
+  AbstractCommitUserIdentityPredicate(Term a1, Term a2, Term a3, Operation n) {
+    arg1 = a1;
+    arg2 = a2;
+    arg3 = a3;
+    cont = n;
+  }
+
+  protected Operation exec(Prolog engine, PersonIdent userId) throws PrologException {
+    engine.setB0();
+    Term a1 = arg1.dereference();
+    Term a2 = arg2.dereference();
+    Term a3 = arg3.dereference();
+
+    Term idTerm;
+    Term nameTerm = Prolog.Nil;
+    Term emailTerm = Prolog.Nil;
+
+    PrologEnvironment env = (PrologEnvironment) engine.control;
+    Emails emails = env.getArgs().getEmails();
+    Account.Id id = null;
+    try {
+      ImmutableSet<Account.Id> ids = emails.getAccountForExternal(userId.getEmailAddress());
+      if (ids.size() == 1) {
+        id = ids.iterator().next();
+      }
+    } catch (IOException e) {
+      throw new SystemException(e.getMessage());
+    }
+
+    if (id == null) {
+      idTerm = anonymous;
+    } else {
+      idTerm = new IntegerTerm(id.get());
+    }
+
+    String name = userId.getName();
+    if (name != null && !name.equals("")) {
+      nameTerm = SymbolTerm.create(name);
+    }
+
+    String email = userId.getEmailAddress();
+    if (email != null && !email.equals("")) {
+      emailTerm = SymbolTerm.create(email);
+    }
+
+    if (!a1.unify(new StructureTerm(user, idTerm), engine.trail)) {
+      return engine.fail();
+    }
+    if (!a2.unify(nameTerm, engine.trail)) {
+      return engine.fail();
+    }
+    if (!a3.unify(emailTerm, engine.trail)) {
+      return engine.fail();
+    }
+    return cont;
+  }
+}
diff --git a/java/gerrit/BUILD b/java/gerrit/BUILD
new file mode 100644
index 0000000..8281d8e
--- /dev/null
+++ b/java/gerrit/BUILD
@@ -0,0 +1,16 @@
+java_library(
+    name = "prolog-predicates",
+    srcs = glob(["**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//lib:gwtorm",
+        "//lib/flogger:api",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/prolog:runtime",
+        "@guava//jar",
+    ],
+)
diff --git a/java/gerrit/PRED__load_commit_labels_1.java b/java/gerrit/PRED__load_commit_labels_1.java
new file mode 100644
index 0000000..1d0ba8a
--- /dev/null
+++ b/java/gerrit/PRED__load_commit_labels_1.java
@@ -0,0 +1,67 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+
+package gerrit;
+
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.LabelTypes;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.rules.StoredValues;
+import com.google.gwtorm.server.OrmException;
+import com.googlecode.prolog_cafe.exceptions.JavaException;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
+import com.googlecode.prolog_cafe.lang.IntegerTerm;
+import com.googlecode.prolog_cafe.lang.ListTerm;
+import com.googlecode.prolog_cafe.lang.Operation;
+import com.googlecode.prolog_cafe.lang.Predicate;
+import com.googlecode.prolog_cafe.lang.Prolog;
+import com.googlecode.prolog_cafe.lang.StructureTerm;
+import com.googlecode.prolog_cafe.lang.SymbolTerm;
+import com.googlecode.prolog_cafe.lang.Term;
+
+/** Exports list of {@code commit_label( label('Code-Review', 2), user(12345789) )}. */
+class PRED__load_commit_labels_1 extends Predicate.P1 {
+  private static final SymbolTerm sym_commit_label = SymbolTerm.intern("commit_label", 2);
+  private static final SymbolTerm sym_label = SymbolTerm.intern("label", 2);
+  private static final SymbolTerm sym_user = SymbolTerm.intern("user", 1);
+
+  PRED__load_commit_labels_1(Term a1, Operation n) {
+    arg1 = a1;
+    cont = n;
+  }
+
+  @Override
+  public Operation exec(Prolog engine) throws PrologException {
+    engine.setB0();
+    Term a1 = arg1.dereference();
+
+    Term listHead = Prolog.Nil;
+    try {
+      ChangeData cd = StoredValues.CHANGE_DATA.get(engine);
+      LabelTypes types = cd.getLabelTypes();
+
+      for (PatchSetApproval a : cd.currentApprovals()) {
+        LabelType t = types.byLabel(a.getLabelId());
+        if (t == null) {
+          continue;
+        }
+
+        StructureTerm labelTerm =
+            new StructureTerm(
+                sym_label, SymbolTerm.intern(t.getName()), new IntegerTerm(a.getValue()));
+
+        StructureTerm userTerm =
+            new StructureTerm(sym_user, new IntegerTerm(a.getAccountId().get()));
+
+        listHead = new ListTerm(new StructureTerm(sym_commit_label, labelTerm, userTerm), listHead);
+      }
+    } catch (OrmException err) {
+      throw new JavaException(this, 1, err);
+    }
+
+    if (!a1.unify(listHead, engine.trail)) {
+      return engine.fail();
+    }
+    return cont;
+  }
+}
diff --git a/java/gerrit/PRED_change_branch_1.java b/java/gerrit/PRED_change_branch_1.java
new file mode 100644
index 0000000..0a7bb74
--- /dev/null
+++ b/java/gerrit/PRED_change_branch_1.java
@@ -0,0 +1,44 @@
+// Copyright (C) 2011 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 gerrit;
+
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.server.rules.StoredValues;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
+import com.googlecode.prolog_cafe.lang.Operation;
+import com.googlecode.prolog_cafe.lang.Predicate;
+import com.googlecode.prolog_cafe.lang.Prolog;
+import com.googlecode.prolog_cafe.lang.SymbolTerm;
+import com.googlecode.prolog_cafe.lang.Term;
+
+public class PRED_change_branch_1 extends Predicate.P1 {
+  public PRED_change_branch_1(Term a1, Operation n) {
+    arg1 = a1;
+    cont = n;
+  }
+
+  @Override
+  public Operation exec(Prolog engine) throws PrologException {
+    engine.setB0();
+    Term a1 = arg1.dereference();
+
+    Branch.NameKey name = StoredValues.getChange(engine).getDest();
+
+    if (!a1.unify(SymbolTerm.create(name.get()), engine.trail)) {
+      return engine.fail();
+    }
+    return cont;
+  }
+}
diff --git a/java/gerrit/PRED_change_owner_1.java b/java/gerrit/PRED_change_owner_1.java
new file mode 100644
index 0000000..937b761
--- /dev/null
+++ b/java/gerrit/PRED_change_owner_1.java
@@ -0,0 +1,48 @@
+// Copyright (C) 2011 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 gerrit;
+
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.rules.StoredValues;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
+import com.googlecode.prolog_cafe.lang.IntegerTerm;
+import com.googlecode.prolog_cafe.lang.Operation;
+import com.googlecode.prolog_cafe.lang.Predicate;
+import com.googlecode.prolog_cafe.lang.Prolog;
+import com.googlecode.prolog_cafe.lang.StructureTerm;
+import com.googlecode.prolog_cafe.lang.SymbolTerm;
+import com.googlecode.prolog_cafe.lang.Term;
+
+public class PRED_change_owner_1 extends Predicate.P1 {
+  private static final SymbolTerm user = SymbolTerm.intern("user", 1);
+
+  public PRED_change_owner_1(Term a1, Operation n) {
+    arg1 = a1;
+    cont = n;
+  }
+
+  @Override
+  public Operation exec(Prolog engine) throws PrologException {
+    engine.setB0();
+    Term a1 = arg1.dereference();
+
+    Account.Id ownerId = StoredValues.getChange(engine).getOwner();
+
+    if (!a1.unify(new StructureTerm(user, new IntegerTerm(ownerId.get())), engine.trail)) {
+      return engine.fail();
+    }
+    return cont;
+  }
+}
diff --git a/java/gerrit/PRED_change_project_1.java b/java/gerrit/PRED_change_project_1.java
new file mode 100644
index 0000000..28e637a
--- /dev/null
+++ b/java/gerrit/PRED_change_project_1.java
@@ -0,0 +1,44 @@
+// Copyright (C) 2011 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 gerrit;
+
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.rules.StoredValues;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
+import com.googlecode.prolog_cafe.lang.Operation;
+import com.googlecode.prolog_cafe.lang.Predicate;
+import com.googlecode.prolog_cafe.lang.Prolog;
+import com.googlecode.prolog_cafe.lang.SymbolTerm;
+import com.googlecode.prolog_cafe.lang.Term;
+
+public class PRED_change_project_1 extends Predicate.P1 {
+  public PRED_change_project_1(Term a1, Operation n) {
+    arg1 = a1;
+    cont = n;
+  }
+
+  @Override
+  public Operation exec(Prolog engine) throws PrologException {
+    engine.setB0();
+    Term a1 = arg1.dereference();
+
+    Project.NameKey name = StoredValues.getChange(engine).getProject();
+
+    if (!a1.unify(SymbolTerm.create(name.get()), engine.trail)) {
+      return engine.fail();
+    }
+    return cont;
+  }
+}
diff --git a/java/gerrit/PRED_change_topic_1.java b/java/gerrit/PRED_change_topic_1.java
new file mode 100644
index 0000000..564878f
--- /dev/null
+++ b/java/gerrit/PRED_change_topic_1.java
@@ -0,0 +1,49 @@
+// Copyright (C) 2011 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 gerrit;
+
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.rules.StoredValues;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
+import com.googlecode.prolog_cafe.lang.Operation;
+import com.googlecode.prolog_cafe.lang.Predicate;
+import com.googlecode.prolog_cafe.lang.Prolog;
+import com.googlecode.prolog_cafe.lang.SymbolTerm;
+import com.googlecode.prolog_cafe.lang.Term;
+
+public class PRED_change_topic_1 extends Predicate.P1 {
+  public PRED_change_topic_1(Term a1, Operation n) {
+    arg1 = a1;
+    cont = n;
+  }
+
+  @Override
+  public Operation exec(Prolog engine) throws PrologException {
+    engine.setB0();
+    Term a1 = arg1.dereference();
+
+    Term topicTerm = Prolog.Nil;
+    Change change = StoredValues.getChange(engine);
+    String topic = change.getTopic();
+    if (topic != null) {
+      topicTerm = SymbolTerm.create(topic);
+    }
+
+    if (!a1.unify(topicTerm, engine.trail)) {
+      return engine.fail();
+    }
+    return cont;
+  }
+}
diff --git a/java/gerrit/PRED_commit_author_3.java b/java/gerrit/PRED_commit_author_3.java
new file mode 100644
index 0000000..998b30e
--- /dev/null
+++ b/java/gerrit/PRED_commit_author_3.java
@@ -0,0 +1,34 @@
+// Copyright (C) 2011 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 gerrit;
+
+import com.google.gerrit.server.rules.StoredValues;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
+import com.googlecode.prolog_cafe.lang.Operation;
+import com.googlecode.prolog_cafe.lang.Prolog;
+import com.googlecode.prolog_cafe.lang.Term;
+import org.eclipse.jgit.revwalk.RevCommit;
+
+public class PRED_commit_author_3 extends AbstractCommitUserIdentityPredicate {
+  public PRED_commit_author_3(Term a1, Term a2, Term a3, Operation n) {
+    super(a1, a2, a3, n);
+  }
+
+  @Override
+  public Operation exec(Prolog engine) throws PrologException {
+    RevCommit revCommit = StoredValues.COMMIT.get(engine);
+    return exec(engine, revCommit.getAuthorIdent());
+  }
+}
diff --git a/java/gerrit/PRED_commit_committer_3.java b/java/gerrit/PRED_commit_committer_3.java
new file mode 100644
index 0000000..293d8ce
--- /dev/null
+++ b/java/gerrit/PRED_commit_committer_3.java
@@ -0,0 +1,34 @@
+// Copyright (C) 2011 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 gerrit;
+
+import com.google.gerrit.server.rules.StoredValues;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
+import com.googlecode.prolog_cafe.lang.Operation;
+import com.googlecode.prolog_cafe.lang.Prolog;
+import com.googlecode.prolog_cafe.lang.Term;
+import org.eclipse.jgit.revwalk.RevCommit;
+
+public class PRED_commit_committer_3 extends AbstractCommitUserIdentityPredicate {
+  public PRED_commit_committer_3(Term a1, Term a2, Term a3, Operation n) {
+    super(a1, a2, a3, n);
+  }
+
+  @Override
+  public Operation exec(Prolog engine) throws PrologException {
+    RevCommit revCommit = StoredValues.COMMIT.get(engine);
+    return exec(engine, revCommit.getCommitterIdent());
+  }
+}
diff --git a/java/gerrit/PRED_commit_delta_4.java b/java/gerrit/PRED_commit_delta_4.java
new file mode 100644
index 0000000..d2634ea
--- /dev/null
+++ b/java/gerrit/PRED_commit_delta_4.java
@@ -0,0 +1,172 @@
+// Copyright (C) 2011 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 gerrit;
+
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.server.patch.PatchList;
+import com.google.gerrit.server.patch.PatchListEntry;
+import com.google.gerrit.server.rules.StoredValues;
+import com.googlecode.prolog_cafe.exceptions.IllegalTypeException;
+import com.googlecode.prolog_cafe.exceptions.PInstantiationException;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
+import com.googlecode.prolog_cafe.lang.JavaObjectTerm;
+import com.googlecode.prolog_cafe.lang.Operation;
+import com.googlecode.prolog_cafe.lang.Predicate;
+import com.googlecode.prolog_cafe.lang.Prolog;
+import com.googlecode.prolog_cafe.lang.SymbolTerm;
+import com.googlecode.prolog_cafe.lang.Term;
+import com.googlecode.prolog_cafe.lang.VariableTerm;
+import java.util.Iterator;
+import java.util.regex.Pattern;
+
+/**
+ * Given a regular expression, checks it against the file list in the most recent patchset of a
+ * change. For all files that match the regex, returns the (new) path of the file, the change type,
+ * and the old path of the file if applicable (if the file was copied or renamed).
+ *
+ * <pre>
+ *   'commit_delta'(+Regex, -ChangeType, -NewPath, -OldPath)
+ * </pre>
+ */
+public class PRED_commit_delta_4 extends Predicate.P4 {
+  private static final SymbolTerm add = SymbolTerm.intern("add");
+  private static final SymbolTerm modify = SymbolTerm.intern("modify");
+  private static final SymbolTerm delete = SymbolTerm.intern("delete");
+  private static final SymbolTerm rename = SymbolTerm.intern("rename");
+  private static final SymbolTerm copy = SymbolTerm.intern("copy");
+  static final Operation commit_delta_check = new PRED_commit_delta_check();
+  static final Operation commit_delta_next = new PRED_commit_delta_next();
+  static final Operation commit_delta_empty = new PRED_commit_delta_empty();
+
+  public PRED_commit_delta_4(Term a1, Term a2, Term a3, Term a4, Operation n) {
+    arg1 = a1;
+    arg2 = a2;
+    arg3 = a3;
+    arg4 = a4;
+    cont = n;
+  }
+
+  @Override
+  public Operation exec(Prolog engine) throws PrologException {
+    engine.cont = cont;
+    engine.setB0();
+
+    Term a1 = arg1.dereference();
+    if (a1 instanceof VariableTerm) {
+      throw new PInstantiationException(this, 1);
+    }
+    if (!(a1 instanceof SymbolTerm)) {
+      throw new IllegalTypeException(this, 1, "symbol", a1);
+    }
+    Pattern regex = Pattern.compile(a1.name());
+    engine.r1 = new JavaObjectTerm(regex);
+    engine.r2 = arg2;
+    engine.r3 = arg3;
+    engine.r4 = arg4;
+
+    PatchList pl = StoredValues.PATCH_LIST.get(engine);
+    Iterator<PatchListEntry> iter = pl.getPatches().iterator();
+
+    engine.r5 = new JavaObjectTerm(iter);
+
+    return engine.jtry5(commit_delta_check, commit_delta_next);
+  }
+
+  private static final class PRED_commit_delta_check extends Operation {
+    @Override
+    public Operation exec(Prolog engine) {
+      Term a1 = engine.r1;
+      Term a2 = engine.r2;
+      Term a3 = engine.r3;
+      Term a4 = engine.r4;
+      Term a5 = engine.r5;
+
+      Pattern regex = (Pattern) ((JavaObjectTerm) a1).object();
+      @SuppressWarnings("unchecked")
+      Iterator<PatchListEntry> iter = (Iterator<PatchListEntry>) ((JavaObjectTerm) a5).object();
+      while (iter.hasNext()) {
+        PatchListEntry patch = iter.next();
+        String newName = patch.getNewName();
+        String oldName = patch.getOldName();
+        Patch.ChangeType changeType = patch.getChangeType();
+
+        if (Patch.isMagic(newName)) {
+          continue;
+        }
+
+        if (regex.matcher(newName).find() || (oldName != null && regex.matcher(oldName).find())) {
+          SymbolTerm changeSym = getTypeSymbol(changeType);
+          SymbolTerm newSym = SymbolTerm.create(newName);
+          SymbolTerm oldSym = Prolog.Nil;
+          if (oldName != null) {
+            oldSym = SymbolTerm.create(oldName);
+          }
+
+          if (!a2.unify(changeSym, engine.trail)) {
+            continue;
+          }
+          if (!a3.unify(newSym, engine.trail)) {
+            continue;
+          }
+          if (!a4.unify(oldSym, engine.trail)) {
+            continue;
+          }
+          return engine.cont;
+        }
+      }
+      return engine.fail();
+    }
+  }
+
+  private static final class PRED_commit_delta_next extends Operation {
+    @Override
+    public Operation exec(Prolog engine) {
+      return engine.trust(commit_delta_empty);
+    }
+  }
+
+  private static final class PRED_commit_delta_empty extends Operation {
+    @Override
+    public Operation exec(Prolog engine) {
+      Term a5 = engine.r5;
+
+      @SuppressWarnings("unchecked")
+      Iterator<PatchListEntry> iter = (Iterator<PatchListEntry>) ((JavaObjectTerm) a5).object();
+      if (!iter.hasNext()) {
+        return engine.fail();
+      }
+
+      return engine.jtry5(commit_delta_check, commit_delta_next);
+    }
+  }
+
+  private static SymbolTerm getTypeSymbol(Patch.ChangeType type) {
+    switch (type) {
+      case ADDED:
+        return add;
+      case MODIFIED:
+        return modify;
+      case DELETED:
+        return delete;
+      case RENAMED:
+        return rename;
+      case COPIED:
+        return copy;
+      case REWRITE:
+        break;
+    }
+    throw new IllegalArgumentException("ChangeType not recognized");
+  }
+}
diff --git a/java/gerrit/PRED_commit_edits_2.java b/java/gerrit/PRED_commit_edits_2.java
new file mode 100644
index 0000000..f46a6487
--- /dev/null
+++ b/java/gerrit/PRED_commit_edits_2.java
@@ -0,0 +1,163 @@
+// Copyright (C) 2011 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 gerrit;
+
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.server.patch.PatchList;
+import com.google.gerrit.server.patch.PatchListEntry;
+import com.google.gerrit.server.patch.Text;
+import com.google.gerrit.server.rules.StoredValues;
+import com.googlecode.prolog_cafe.exceptions.IllegalTypeException;
+import com.googlecode.prolog_cafe.exceptions.JavaException;
+import com.googlecode.prolog_cafe.exceptions.PInstantiationException;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
+import com.googlecode.prolog_cafe.lang.Operation;
+import com.googlecode.prolog_cafe.lang.Predicate;
+import com.googlecode.prolog_cafe.lang.Prolog;
+import com.googlecode.prolog_cafe.lang.SymbolTerm;
+import com.googlecode.prolog_cafe.lang.Term;
+import com.googlecode.prolog_cafe.lang.VariableTerm;
+import java.io.IOException;
+import java.util.List;
+import java.util.regex.Pattern;
+import org.eclipse.jgit.diff.Edit;
+import org.eclipse.jgit.errors.CorruptObjectException;
+import org.eclipse.jgit.errors.IncorrectObjectTypeException;
+import org.eclipse.jgit.errors.MissingObjectException;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevTree;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.treewalk.TreeWalk;
+
+/**
+ * Returns true if any of the files that match FileNameRegex have edited lines that match EditRegex
+ *
+ * <pre>
+ *   'commit_edits'(+FileNameRegex, +EditRegex)
+ * </pre>
+ */
+public class PRED_commit_edits_2 extends Predicate.P2 {
+  public PRED_commit_edits_2(Term a1, Term a2, Operation n) {
+    arg1 = a1;
+    arg2 = a2;
+    cont = n;
+  }
+
+  @Override
+  public Operation exec(Prolog engine) throws PrologException {
+    engine.setB0();
+
+    Term a1 = arg1.dereference();
+    Term a2 = arg2.dereference();
+
+    Pattern fileRegex = getRegexParameter(a1);
+    Pattern editRegex = getRegexParameter(a2);
+
+    PatchList pl = StoredValues.PATCH_LIST.get(engine);
+    Repository repo = StoredValues.REPOSITORY.get(engine);
+
+    try (ObjectReader reader = repo.newObjectReader();
+        RevWalk rw = new RevWalk(reader)) {
+      final RevTree aTree;
+      final RevTree bTree;
+      final RevCommit bCommit = rw.parseCommit(pl.getNewId());
+
+      if (pl.getOldId() != null) {
+        aTree = rw.parseTree(pl.getOldId());
+      } else {
+        // Octopus merge with unknown automatic merge result, since the
+        // web UI returns no files to match against, just fail.
+        return engine.fail();
+      }
+      bTree = bCommit.getTree();
+
+      for (PatchListEntry entry : pl.getPatches()) {
+        String newName = entry.getNewName();
+        String oldName = entry.getOldName();
+
+        if (Patch.isMagic(newName)) {
+          continue;
+        }
+
+        if (fileRegex.matcher(newName).find()
+            || (oldName != null && fileRegex.matcher(oldName).find())) {
+          // This cast still seems to be needed on JDK 8 as workaround for:
+          // https://bugs.openjdk.java.net/browse/JDK-8039214
+          @SuppressWarnings("cast")
+          List<Edit> edits = (List<Edit>) entry.getEdits();
+
+          if (edits.isEmpty()) {
+            continue;
+          }
+          Text tA;
+          if (oldName != null) {
+            tA = load(aTree, oldName, reader);
+          } else {
+            tA = load(aTree, newName, reader);
+          }
+          Text tB = load(bTree, newName, reader);
+          for (Edit edit : edits) {
+            if (tA != Text.EMPTY) {
+              String aDiff = tA.getString(edit.getBeginA(), edit.getEndA(), true);
+              if (editRegex.matcher(aDiff).find()) {
+                return cont;
+              }
+            }
+            if (tB != Text.EMPTY) {
+              String bDiff = tB.getString(edit.getBeginB(), edit.getEndB(), true);
+              if (editRegex.matcher(bDiff).find()) {
+                return cont;
+              }
+            }
+          }
+        }
+      }
+    } catch (IOException err) {
+      throw new JavaException(this, 1, err);
+    }
+
+    return engine.fail();
+  }
+
+  private Pattern getRegexParameter(Term term) {
+    if (term instanceof VariableTerm) {
+      throw new PInstantiationException(this, 1);
+    }
+    if (!(term instanceof SymbolTerm)) {
+      throw new IllegalTypeException(this, 1, "symbol", term);
+    }
+    return Pattern.compile(term.name(), Pattern.MULTILINE);
+  }
+
+  private Text load(ObjectId tree, String path, ObjectReader reader)
+      throws MissingObjectException, IncorrectObjectTypeException, CorruptObjectException,
+          IOException {
+    if (path == null) {
+      return Text.EMPTY;
+    }
+    final TreeWalk tw = TreeWalk.forPath(reader, path, tree);
+    if (tw == null) {
+      return Text.EMPTY;
+    }
+    if (tw.getFileMode(0).getObjectType() != Constants.OBJ_BLOB) {
+      return Text.EMPTY;
+    }
+    return new Text(reader.open(tw.getObjectId(0), Constants.OBJ_BLOB));
+  }
+}
diff --git a/java/gerrit/PRED_commit_message_1.java b/java/gerrit/PRED_commit_message_1.java
new file mode 100644
index 0000000..eb996d6
--- /dev/null
+++ b/java/gerrit/PRED_commit_message_1.java
@@ -0,0 +1,53 @@
+// Copyright (C) 2011 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 gerrit;
+
+import com.google.gerrit.server.rules.StoredValues;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
+import com.googlecode.prolog_cafe.lang.Operation;
+import com.googlecode.prolog_cafe.lang.Predicate;
+import com.googlecode.prolog_cafe.lang.Prolog;
+import com.googlecode.prolog_cafe.lang.SymbolTerm;
+import com.googlecode.prolog_cafe.lang.Term;
+import org.eclipse.jgit.revwalk.RevCommit;
+
+/**
+ * Returns the commit message as a symbol
+ *
+ * <pre>
+ *   'commit_message'(-Msg)
+ * </pre>
+ */
+public class PRED_commit_message_1 extends Predicate.P1 {
+  public PRED_commit_message_1(Term a1, Operation n) {
+    arg1 = a1;
+    cont = n;
+  }
+
+  @Override
+  public Operation exec(Prolog engine) throws PrologException {
+    engine.setB0();
+    Term a1 = arg1.dereference();
+
+    RevCommit revCommit = StoredValues.COMMIT.get(engine);
+    String commitMessage = revCommit.getFullMessage();
+
+    SymbolTerm msg = SymbolTerm.create(commitMessage);
+    if (!a1.unify(msg, engine.trail)) {
+      return engine.fail();
+    }
+    return cont;
+  }
+}
diff --git a/java/gerrit/PRED_commit_stats_3.java b/java/gerrit/PRED_commit_stats_3.java
new file mode 100644
index 0000000..c1666d8
--- /dev/null
+++ b/java/gerrit/PRED_commit_stats_3.java
@@ -0,0 +1,76 @@
+// Copyright (C) 2012 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 gerrit;
+
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.server.patch.PatchList;
+import com.google.gerrit.server.patch.PatchListEntry;
+import com.google.gerrit.server.rules.StoredValues;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
+import com.googlecode.prolog_cafe.lang.IntegerTerm;
+import com.googlecode.prolog_cafe.lang.Operation;
+import com.googlecode.prolog_cafe.lang.Predicate;
+import com.googlecode.prolog_cafe.lang.Prolog;
+import com.googlecode.prolog_cafe.lang.Term;
+import java.util.List;
+
+/**
+ * Exports basic commit statistics.
+ *
+ * <pre>
+ *   'commit_stats'(-Files, -Insertions, -Deletions)
+ * </pre>
+ */
+public class PRED_commit_stats_3 extends Predicate.P3 {
+  public PRED_commit_stats_3(Term a1, Term a2, Term a3, Operation n) {
+    arg1 = a1;
+    arg2 = a2;
+    arg3 = a3;
+    cont = n;
+  }
+
+  @Override
+  public Operation exec(Prolog engine) throws PrologException {
+    engine.setB0();
+
+    Term a1 = arg1.dereference();
+    Term a2 = arg2.dereference();
+    Term a3 = arg3.dereference();
+
+    PatchList pl = StoredValues.PATCH_LIST.get(engine);
+    // Account for magic files
+    if (!a1.unify(
+        new IntegerTerm(pl.getPatches().size() - countMagicFiles(pl.getPatches())), engine.trail)) {
+      return engine.fail();
+    }
+    if (!a2.unify(new IntegerTerm(pl.getInsertions()), engine.trail)) {
+      return engine.fail();
+    }
+    if (!a3.unify(new IntegerTerm(pl.getDeletions()), engine.trail)) {
+      return engine.fail();
+    }
+    return cont;
+  }
+
+  private int countMagicFiles(List<PatchListEntry> entries) {
+    int count = 0;
+    for (PatchListEntry e : entries) {
+      if (Patch.isMagic(e.getNewName())) {
+        count++;
+      }
+    }
+    return count;
+  }
+}
diff --git a/java/gerrit/PRED_get_legacy_label_types_1.java b/java/gerrit/PRED_get_legacy_label_types_1.java
new file mode 100644
index 0000000..ef79e05
--- /dev/null
+++ b/java/gerrit/PRED_get_legacy_label_types_1.java
@@ -0,0 +1,85 @@
+// Copyright (C) 2011 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 gerrit;
+
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.LabelValue;
+import com.google.gerrit.server.rules.StoredValues;
+import com.google.gwtorm.server.OrmException;
+import com.googlecode.prolog_cafe.exceptions.JavaException;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
+import com.googlecode.prolog_cafe.lang.IntegerTerm;
+import com.googlecode.prolog_cafe.lang.ListTerm;
+import com.googlecode.prolog_cafe.lang.Operation;
+import com.googlecode.prolog_cafe.lang.Predicate;
+import com.googlecode.prolog_cafe.lang.Prolog;
+import com.googlecode.prolog_cafe.lang.StructureTerm;
+import com.googlecode.prolog_cafe.lang.SymbolTerm;
+import com.googlecode.prolog_cafe.lang.Term;
+import java.util.List;
+
+/**
+ * Obtain a list of label types from the server configuration.
+ *
+ * <p>Unifies to a Prolog list of: {@code label_type(Label, Fun, Min, Max)} where:
+ *
+ * <ul>
+ *   <li>{@code Label} - the newer style label name
+ *   <li>{@code Fun} - legacy function name
+ *   <li>{@code Min, Max} - the smallest and largest configured values.
+ * </ul>
+ */
+class PRED_get_legacy_label_types_1 extends Predicate.P1 {
+  private static final SymbolTerm NONE = SymbolTerm.intern("none");
+
+  PRED_get_legacy_label_types_1(Term a1, Operation n) {
+    arg1 = a1;
+    cont = n;
+  }
+
+  @Override
+  public Operation exec(Prolog engine) throws PrologException {
+    engine.setB0();
+    Term a1 = arg1.dereference();
+    List<LabelType> list;
+    try {
+      list = StoredValues.CHANGE_DATA.get(engine).getLabelTypes().getLabelTypes();
+    } catch (OrmException err) {
+      throw new JavaException(this, 1, err);
+    }
+    Term head = Prolog.Nil;
+    for (int idx = list.size() - 1; 0 <= idx; idx--) {
+      head = new ListTerm(export(list.get(idx)), head);
+    }
+
+    if (!a1.unify(head, engine.trail)) {
+      return engine.fail();
+    }
+    return cont;
+  }
+
+  static final SymbolTerm symLabelType = SymbolTerm.intern("label_type", 4);
+
+  static Term export(LabelType type) {
+    LabelValue min = type.getMin();
+    LabelValue max = type.getMax();
+    return new StructureTerm(
+        symLabelType,
+        SymbolTerm.intern(type.getName()),
+        SymbolTerm.intern(type.getFunction().getFunctionName()),
+        min != null ? new IntegerTerm(min.getValue()) : NONE,
+        max != null ? new IntegerTerm(max.getValue()) : NONE);
+  }
+}
diff --git a/java/gerrit/PRED_project_default_submit_type_1.java b/java/gerrit/PRED_project_default_submit_type_1.java
new file mode 100644
index 0000000..d70a9e4
--- /dev/null
+++ b/java/gerrit/PRED_project_default_submit_type_1.java
@@ -0,0 +1,56 @@
+// Copyright (C) 2012 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 gerrit;
+
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.rules.StoredValues;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
+import com.googlecode.prolog_cafe.lang.Operation;
+import com.googlecode.prolog_cafe.lang.Predicate;
+import com.googlecode.prolog_cafe.lang.Prolog;
+import com.googlecode.prolog_cafe.lang.SymbolTerm;
+import com.googlecode.prolog_cafe.lang.Term;
+
+public class PRED_project_default_submit_type_1 extends Predicate.P1 {
+
+  private static final SymbolTerm[] term;
+
+  static {
+    SubmitType[] val = SubmitType.values();
+    term = new SymbolTerm[val.length];
+    for (int i = 0; i < val.length; i++) {
+      term[i] = SymbolTerm.create(val[i].name());
+    }
+  }
+
+  public PRED_project_default_submit_type_1(Term a1, Operation n) {
+    arg1 = a1;
+    cont = n;
+  }
+
+  @Override
+  public Operation exec(Prolog engine) throws PrologException {
+    engine.setB0();
+    Term a1 = arg1.dereference();
+
+    ProjectState projectState = StoredValues.PROJECT_STATE.get(engine);
+    SubmitType submitType = projectState.getSubmitType();
+    if (!a1.unify(term[submitType.ordinal()], engine.trail)) {
+      return engine.fail();
+    }
+    return cont;
+  }
+}
diff --git a/java/gerrit/PRED_pure_revert_1.java b/java/gerrit/PRED_pure_revert_1.java
new file mode 100644
index 0000000..95a0729
--- /dev/null
+++ b/java/gerrit/PRED_pure_revert_1.java
@@ -0,0 +1,50 @@
+// Copyright (C) 2017 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 gerrit;
+
+import com.google.gerrit.server.rules.StoredValues;
+import com.google.gwtorm.server.OrmException;
+import com.googlecode.prolog_cafe.exceptions.JavaException;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
+import com.googlecode.prolog_cafe.lang.IntegerTerm;
+import com.googlecode.prolog_cafe.lang.Operation;
+import com.googlecode.prolog_cafe.lang.Predicate;
+import com.googlecode.prolog_cafe.lang.Prolog;
+import com.googlecode.prolog_cafe.lang.Term;
+
+/** Checks if change is a pure revert of the change it references in 'revertOf'. */
+public class PRED_pure_revert_1 extends Predicate.P1 {
+  public PRED_pure_revert_1(Term a1, Operation n) {
+    arg1 = a1;
+    cont = n;
+  }
+
+  @Override
+  public Operation exec(Prolog engine) throws PrologException {
+    engine.setB0();
+    Term a1 = arg1.dereference();
+
+    Boolean isPureRevert;
+    try {
+      isPureRevert = StoredValues.CHANGE_DATA.get(engine).isPureRevert();
+    } catch (OrmException e) {
+      throw new JavaException(this, 1, e);
+    }
+    if (!a1.unify(new IntegerTerm(Boolean.TRUE.equals(isPureRevert) ? 1 : 0), engine.trail)) {
+      return engine.fail();
+    }
+    return cont;
+  }
+}
diff --git a/java/gerrit/PRED_unresolved_comments_count_1.java b/java/gerrit/PRED_unresolved_comments_count_1.java
new file mode 100644
index 0000000..5ed1525
--- /dev/null
+++ b/java/gerrit/PRED_unresolved_comments_count_1.java
@@ -0,0 +1,48 @@
+// Copyright (C) 2017 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 gerrit;
+
+import com.google.gerrit.server.rules.StoredValues;
+import com.google.gwtorm.server.OrmException;
+import com.googlecode.prolog_cafe.exceptions.JavaException;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
+import com.googlecode.prolog_cafe.lang.IntegerTerm;
+import com.googlecode.prolog_cafe.lang.Operation;
+import com.googlecode.prolog_cafe.lang.Predicate;
+import com.googlecode.prolog_cafe.lang.Prolog;
+import com.googlecode.prolog_cafe.lang.Term;
+
+public class PRED_unresolved_comments_count_1 extends Predicate.P1 {
+  public PRED_unresolved_comments_count_1(Term a1, Operation n) {
+    arg1 = a1;
+    cont = n;
+  }
+
+  @Override
+  public Operation exec(Prolog engine) throws PrologException {
+    engine.setB0();
+    Term a1 = arg1.dereference();
+
+    try {
+      Integer count = StoredValues.CHANGE_DATA.get(engine).unresolvedCommentCount();
+      if (!a1.unify(new IntegerTerm(count != null ? count : 0), engine.trail)) {
+        return engine.fail();
+      }
+    } catch (OrmException err) {
+      throw new JavaException(this, 1, err);
+    }
+    return cont;
+  }
+}
diff --git a/java/gerrit/PRED_uploader_1.java b/java/gerrit/PRED_uploader_1.java
new file mode 100644
index 0000000..029b84a
--- /dev/null
+++ b/java/gerrit/PRED_uploader_1.java
@@ -0,0 +1,60 @@
+// 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.
+
+package gerrit;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.rules.StoredValues;
+import com.googlecode.prolog_cafe.exceptions.PrologException;
+import com.googlecode.prolog_cafe.lang.IntegerTerm;
+import com.googlecode.prolog_cafe.lang.Operation;
+import com.googlecode.prolog_cafe.lang.Predicate;
+import com.googlecode.prolog_cafe.lang.Prolog;
+import com.googlecode.prolog_cafe.lang.StructureTerm;
+import com.googlecode.prolog_cafe.lang.SymbolTerm;
+import com.googlecode.prolog_cafe.lang.Term;
+
+public class PRED_uploader_1 extends Predicate.P1 {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private static final SymbolTerm user = SymbolTerm.intern("user", 1);
+
+  public PRED_uploader_1(Term a1, Operation n) {
+    arg1 = a1;
+    cont = n;
+  }
+
+  @Override
+  public Operation exec(Prolog engine) throws PrologException {
+    engine.setB0();
+    Term a1 = arg1.dereference();
+
+    PatchSet patchSet = StoredValues.getPatchSet(engine);
+    if (patchSet == null) {
+      logger.atSevere().log(
+          "Failed to load current patch set of change %s",
+          StoredValues.getChange(engine).getChangeId());
+      return engine.fail();
+    }
+
+    Account.Id uploaderId = patchSet.getUploader();
+
+    if (!a1.unify(new StructureTerm(user, new IntegerTerm(uploaderId.get())), engine.trail)) {
+      return engine.fail();
+    }
+    return cont;
+  }
+}
diff --git a/java/org/apache/commons/net/BUILD b/java/org/apache/commons/net/BUILD
new file mode 100644
index 0000000..4951933
--- /dev/null
+++ b/java/org/apache/commons/net/BUILD
@@ -0,0 +1,10 @@
+java_library(
+    name = "net",
+    srcs = glob(["**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/util/ssl",
+        "//lib/commons:codec",
+        "//lib/commons:net",
+    ],
+)
diff --git a/gerrit-patch-commonsnet/src/main/java/org/apache/commons/net/smtp/AuthSMTPClient.java b/java/org/apache/commons/net/smtp/AuthSMTPClient.java
similarity index 100%
rename from gerrit-patch-commonsnet/src/main/java/org/apache/commons/net/smtp/AuthSMTPClient.java
rename to java/org/apache/commons/net/smtp/AuthSMTPClient.java
diff --git a/java/org/eclipse/jgit/BUILD b/java/org/eclipse/jgit/BUILD
new file mode 100644
index 0000000..95fef28
--- /dev/null
+++ b/java/org/eclipse/jgit/BUILD
@@ -0,0 +1,48 @@
+load("//tools/bzl:genrule2.bzl", "genrule2")
+load("//tools/bzl:gwt.bzl", "gwt_module")
+
+gwt_module(
+    name = "client",
+    srcs = [
+        "diff/Edit_JsonSerializer.java",
+        "diff/ReplaceEdit.java",
+    ],
+    gwt_xml = "JGit.gwt.xml",
+    visibility = ["//visibility:public"],
+    deps = [
+        ":Edit",
+        "//lib:gwtjsonrpc",
+        "//lib/gwt:user",
+    ],
+)
+
+gwt_module(
+    name = "Edit",
+    srcs = [":jgit_edit_src"],
+    visibility = ["//visibility:public"],
+)
+
+genrule2(
+    name = "jgit_edit_src",
+    outs = ["edit.srcjar"],
+    cmd = " && ".join([
+        "unzip -qd $$TMP $(location //lib/jgit/org.eclipse.jgit:jgit-source) " +
+        "org/eclipse/jgit/diff/Edit.java",
+        "cd $$TMP",
+        "zip -Dq $$ROOT/$@ org/eclipse/jgit/diff/Edit.java",
+    ]),
+    tools = ["//lib/jgit/org.eclipse.jgit:jgit-source"],
+)
+
+java_library(
+    name = "server",
+    srcs = [
+        "diff/EditDeserializer.java",
+        "diff/ReplaceEdit.java",
+    ],
+    visibility = ["//visibility:public"],
+    deps = [
+        "//lib:gson",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+    ],
+)
diff --git a/gerrit-patch-jgit/src/main/java/org/eclipse/jgit/JGit.gwt.xml b/java/org/eclipse/jgit/JGit.gwt.xml
similarity index 100%
rename from gerrit-patch-jgit/src/main/java/org/eclipse/jgit/JGit.gwt.xml
rename to java/org/eclipse/jgit/JGit.gwt.xml
diff --git a/gerrit-patch-jgit/src/main/java/org/eclipse/jgit/diff/EditDeserializer.java b/java/org/eclipse/jgit/diff/EditDeserializer.java
similarity index 100%
rename from gerrit-patch-jgit/src/main/java/org/eclipse/jgit/diff/EditDeserializer.java
rename to java/org/eclipse/jgit/diff/EditDeserializer.java
diff --git a/gerrit-patch-jgit/src/main/java/org/eclipse/jgit/diff/Edit_JsonSerializer.java b/java/org/eclipse/jgit/diff/Edit_JsonSerializer.java
similarity index 100%
rename from gerrit-patch-jgit/src/main/java/org/eclipse/jgit/diff/Edit_JsonSerializer.java
rename to java/org/eclipse/jgit/diff/Edit_JsonSerializer.java
diff --git a/gerrit-patch-jgit/src/main/java/org/eclipse/jgit/diff/ReplaceEdit.java b/java/org/eclipse/jgit/diff/ReplaceEdit.java
similarity index 100%
rename from gerrit-patch-jgit/src/main/java/org/eclipse/jgit/diff/ReplaceEdit.java
rename to java/org/eclipse/jgit/diff/ReplaceEdit.java
diff --git a/javatests/com/google/gerrit/acceptance/BUILD b/javatests/com/google/gerrit/acceptance/BUILD
new file mode 100644
index 0000000..32804ef
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/BUILD
@@ -0,0 +1,13 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+junit_tests(
+    name = "acceptance_framework_tests",
+    srcs = glob(["**/*.java"]),
+    deps = [
+        "//java/com/google/gerrit/acceptance:lib",
+        "//java/com/google/gerrit/server/util/time",
+        "//lib:guava",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/truth",
+    ],
+)
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/MergeableFileBasedConfigTest.java b/javatests/com/google/gerrit/acceptance/MergeableFileBasedConfigTest.java
similarity index 100%
rename from gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/MergeableFileBasedConfigTest.java
rename to javatests/com/google/gerrit/acceptance/MergeableFileBasedConfigTest.java
diff --git a/javatests/com/google/gerrit/acceptance/ProjectResetterTest.java b/javatests/com/google/gerrit/acceptance/ProjectResetterTest.java
new file mode 100644
index 0000000..53d8ef8
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/ProjectResetterTest.java
@@ -0,0 +1,536 @@
+// Copyright (C) 2017 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.google.gerrit.acceptance;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.GroupCache;
+import com.google.gerrit.server.account.GroupIncludeCache;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.AllUsersNameProvider;
+import com.google.gerrit.server.index.account.AccountIndexer;
+import com.google.gerrit.server.index.group.GroupIndexer;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.testing.GerritBaseTests;
+import com.google.gerrit.testing.InMemoryRepositoryManager;
+import com.google.gerrit.testing.TestTimeUtil;
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+import org.easymock.EasyMock;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ProjectResetterTest extends GerritBaseTests {
+  private InMemoryRepositoryManager repoManager;
+  private Project.NameKey project;
+  private Repository repo;
+
+  @Before
+  public void setUp() throws Exception {
+    repoManager = new InMemoryRepositoryManager();
+    project = new Project.NameKey("foo");
+    repo = repoManager.createRepository(project);
+  }
+
+  @Before
+  public void setTimeForTesting() {
+    TestTimeUtil.resetWithClockStep(1, TimeUnit.SECONDS);
+  }
+
+  @After
+  public void resetTime() {
+    TestTimeUtil.useSystemTime();
+  }
+
+  @Test
+  public void resetAllRefs() throws Exception {
+    Ref matchingRef = createRef("refs/any/test");
+
+    try (ProjectResetter resetProject =
+        builder().build(new ProjectResetter.Config().reset(project))) {
+      updateRef(matchingRef);
+    }
+
+    // The matching refs are reset to the old state.
+    assertRef(matchingRef);
+  }
+
+  @Test
+  public void onlyResetMatchingRefs() throws Exception {
+    Ref matchingRef = createRef("refs/match/test");
+    Ref anotherMatchingRef = createRef("refs/another-match/test");
+    Ref nonMatchingRef = createRef("refs/no-match/test");
+
+    Ref updatedNonMatchingRef;
+    try (ProjectResetter resetProject =
+        builder()
+            .build(
+                new ProjectResetter.Config()
+                    .reset(project, "refs/match/*", "refs/another-match/*"))) {
+      updateRef(matchingRef);
+      updateRef(anotherMatchingRef);
+      updatedNonMatchingRef = updateRef(nonMatchingRef);
+    }
+
+    // The matching refs are reset to the old state.
+    assertRef(matchingRef);
+    assertRef(anotherMatchingRef);
+
+    // The non-matching ref is not reset, hence it still has the updated state.
+    assertRef(updatedNonMatchingRef);
+  }
+
+  @Test
+  public void onlyDeleteNewlyCreatedMatchingRefs() throws Exception {
+    Ref matchingRef;
+    Ref anotherMatchingRef;
+    Ref nonMatchingRef;
+    try (ProjectResetter resetProject =
+        builder()
+            .build(
+                new ProjectResetter.Config()
+                    .reset(project, "refs/match/*", "refs/another-match/*"))) {
+      matchingRef = createRef("refs/match/test");
+      anotherMatchingRef = createRef("refs/another-match/test");
+      nonMatchingRef = createRef("refs/no-match/test");
+    }
+
+    // The matching refs are deleted since they didn't exist before.
+    assertDeletedRef(matchingRef);
+    assertDeletedRef(anotherMatchingRef);
+
+    // The non-matching ref is not deleted.
+    assertRef(nonMatchingRef);
+  }
+
+  @Test
+  public void onlyResetMatchingRefsMultipleProjects() throws Exception {
+    Project.NameKey project2 = new Project.NameKey("bar");
+    Repository repo2 = repoManager.createRepository(project2);
+
+    Ref matchingRefProject1 = createRef("refs/foo/test");
+    Ref nonMatchingRefProject1 = createRef("refs/bar/test");
+
+    Ref matchingRefProject2 = createRef(repo2, "refs/bar/test");
+    Ref nonMatchingRefProject2 = createRef(repo2, "refs/foo/test");
+
+    Ref updatedNonMatchingRefProject1;
+    Ref updatedNonMatchingRefProject2;
+    try (ProjectResetter resetProject =
+        builder()
+            .build(
+                new ProjectResetter.Config()
+                    .reset(project, "refs/foo/*")
+                    .reset(project2, "refs/bar/*"))) {
+      updateRef(matchingRefProject1);
+      updatedNonMatchingRefProject1 = updateRef(nonMatchingRefProject1);
+
+      updateRef(repo2, matchingRefProject2);
+      updatedNonMatchingRefProject2 = updateRef(repo2, nonMatchingRefProject2);
+    }
+
+    // The matching refs are reset to the old state.
+    assertRef(matchingRefProject1);
+    assertRef(repo2, matchingRefProject2);
+
+    // The non-matching refs are not reset, hence they still has the updated states.
+    assertRef(updatedNonMatchingRefProject1);
+    assertRef(repo2, updatedNonMatchingRefProject2);
+  }
+
+  @Test
+  public void onlyDeleteNewlyCreatedMatchingRefsMultipleProjects() throws Exception {
+    Project.NameKey project2 = new Project.NameKey("bar");
+    Repository repo2 = repoManager.createRepository(project2);
+
+    Ref matchingRefProject1;
+    Ref nonMatchingRefProject1;
+    Ref matchingRefProject2;
+    Ref nonMatchingRefProject2;
+    try (ProjectResetter resetProject =
+        builder()
+            .build(
+                new ProjectResetter.Config()
+                    .reset(project, "refs/foo/*")
+                    .reset(project2, "refs/bar/*"))) {
+      matchingRefProject1 = createRef("refs/foo/test");
+      nonMatchingRefProject1 = createRef("refs/bar/test");
+
+      matchingRefProject2 = createRef(repo2, "refs/bar/test");
+      nonMatchingRefProject2 = createRef(repo2, "refs/foo/test");
+    }
+
+    // The matching refs are deleted since they didn't exist before.
+    assertDeletedRef(matchingRefProject1);
+    assertDeletedRef(repo2, matchingRefProject2);
+
+    // The non-matching ref is not deleted.
+    assertRef(nonMatchingRefProject1);
+    assertRef(repo2, nonMatchingRefProject2);
+  }
+
+  @Test
+  public void onlyDeleteNewlyCreatedWithOverlappingRefPatterns() throws Exception {
+    Ref matchingRef;
+    try (ProjectResetter resetProject =
+        builder()
+            .build(
+                new ProjectResetter.Config().reset(project, "refs/match/*", "refs/match/test"))) {
+      // This ref matches 2 ref pattern, ProjectResetter should try to delete it only once.
+      matchingRef = createRef("refs/match/test");
+    }
+
+    // The matching ref is deleted since it didn't exist before.
+    assertDeletedRef(matchingRef);
+  }
+
+  @Test
+  public void projectEvictionIfRefsMetaConfigIsReset() throws Exception {
+    Project.NameKey project2 = new Project.NameKey("bar");
+    Repository repo2 = repoManager.createRepository(project2);
+    Ref metaConfig = createRef(repo2, RefNames.REFS_CONFIG);
+
+    ProjectCache projectCache = EasyMock.createNiceMock(ProjectCache.class);
+    projectCache.evict(project2);
+    EasyMock.expectLastCall();
+    EasyMock.replay(projectCache);
+
+    Ref nonMetaConfig = createRef("refs/heads/master");
+
+    try (ProjectResetter resetProject =
+        builder(null, null, null, null, null, null, projectCache)
+            .build(new ProjectResetter.Config().reset(project).reset(project2))) {
+      updateRef(nonMetaConfig);
+      updateRef(repo2, metaConfig);
+    }
+
+    EasyMock.verify(projectCache);
+  }
+
+  @Test
+  public void projectEvictionIfRefsMetaConfigIsDeleted() throws Exception {
+    Project.NameKey project2 = new Project.NameKey("bar");
+    Repository repo2 = repoManager.createRepository(project2);
+
+    ProjectCache projectCache = EasyMock.createNiceMock(ProjectCache.class);
+    projectCache.evict(project2);
+    EasyMock.expectLastCall();
+    EasyMock.replay(projectCache);
+
+    try (ProjectResetter resetProject =
+        builder(null, null, null, null, null, null, projectCache)
+            .build(new ProjectResetter.Config().reset(project).reset(project2))) {
+      createRef("refs/heads/master");
+      createRef(repo2, RefNames.REFS_CONFIG);
+    }
+
+    EasyMock.verify(projectCache);
+  }
+
+  @Test
+  public void accountEvictionIfUserBranchIsReset() throws Exception {
+    Account.Id accountId = new Account.Id(1);
+    Project.NameKey allUsers = new Project.NameKey(AllUsersNameProvider.DEFAULT);
+    Repository allUsersRepo = repoManager.createRepository(allUsers);
+    Ref userBranch = createRef(allUsersRepo, RefNames.refsUsers(accountId));
+
+    AccountCache accountCache = EasyMock.createNiceMock(AccountCache.class);
+    accountCache.evict(accountId);
+    EasyMock.expectLastCall();
+    EasyMock.replay(accountCache);
+
+    AccountIndexer accountIndexer = EasyMock.createNiceMock(AccountIndexer.class);
+    accountIndexer.index(accountId);
+    EasyMock.expectLastCall();
+    EasyMock.replay(accountIndexer);
+
+    // Non-user branch because it's not in All-Users.
+    Ref nonUserBranch = createRef(RefNames.refsUsers(new Account.Id(2)));
+
+    try (ProjectResetter resetProject =
+        builder(null, accountCache, accountIndexer, null, null, null, null)
+            .build(new ProjectResetter.Config().reset(project).reset(allUsers))) {
+      updateRef(nonUserBranch);
+      updateRef(allUsersRepo, userBranch);
+    }
+
+    EasyMock.verify(accountCache, accountIndexer);
+  }
+
+  @Test
+  public void accountEvictionIfUserBranchIsDeleted() throws Exception {
+    Account.Id accountId = new Account.Id(1);
+    Project.NameKey allUsers = new Project.NameKey(AllUsersNameProvider.DEFAULT);
+    Repository allUsersRepo = repoManager.createRepository(allUsers);
+
+    AccountCache accountCache = EasyMock.createNiceMock(AccountCache.class);
+    accountCache.evict(accountId);
+    EasyMock.expectLastCall();
+    EasyMock.replay(accountCache);
+
+    AccountIndexer accountIndexer = EasyMock.createNiceMock(AccountIndexer.class);
+    accountIndexer.index(accountId);
+    EasyMock.expectLastCall();
+    EasyMock.replay(accountIndexer);
+
+    try (ProjectResetter resetProject =
+        builder(null, accountCache, accountIndexer, null, null, null, null)
+            .build(new ProjectResetter.Config().reset(project).reset(allUsers))) {
+      // Non-user branch because it's not in All-Users.
+      createRef(RefNames.refsUsers(new Account.Id(2)));
+
+      createRef(allUsersRepo, RefNames.refsUsers(accountId));
+    }
+
+    EasyMock.verify(accountCache, accountIndexer);
+  }
+
+  @Test
+  public void accountEvictionIfExternalIdsBranchIsReset() throws Exception {
+    Account.Id accountId = new Account.Id(1);
+    Project.NameKey allUsers = new Project.NameKey(AllUsersNameProvider.DEFAULT);
+    Repository allUsersRepo = repoManager.createRepository(allUsers);
+    Ref externalIds = createRef(allUsersRepo, RefNames.REFS_EXTERNAL_IDS);
+    createRef(allUsersRepo, RefNames.refsUsers(accountId));
+
+    Account.Id accountId2 = new Account.Id(2);
+
+    AccountCache accountCache = EasyMock.createNiceMock(AccountCache.class);
+    accountCache.evict(accountId);
+    EasyMock.expectLastCall();
+    accountCache.evict(accountId2);
+    EasyMock.expectLastCall();
+    EasyMock.replay(accountCache);
+
+    AccountIndexer accountIndexer = EasyMock.createNiceMock(AccountIndexer.class);
+    accountIndexer.index(accountId);
+    EasyMock.expectLastCall();
+    accountIndexer.index(accountId2);
+    EasyMock.expectLastCall();
+    EasyMock.replay(accountIndexer);
+
+    // Non-user branch because it's not in All-Users.
+    Ref nonUserBranch = createRef(RefNames.refsUsers(new Account.Id(3)));
+
+    try (ProjectResetter resetProject =
+        builder(null, accountCache, accountIndexer, null, null, null, null)
+            .build(new ProjectResetter.Config().reset(project).reset(allUsers))) {
+      updateRef(nonUserBranch);
+      updateRef(allUsersRepo, externalIds);
+      createRef(allUsersRepo, RefNames.refsUsers(accountId2));
+    }
+
+    EasyMock.verify(accountCache, accountIndexer);
+  }
+
+  @Test
+  public void accountEvictionIfExternalIdsBranchIsDeleted() throws Exception {
+    Account.Id accountId = new Account.Id(1);
+    Project.NameKey allUsers = new Project.NameKey(AllUsersNameProvider.DEFAULT);
+    Repository allUsersRepo = repoManager.createRepository(allUsers);
+    createRef(allUsersRepo, RefNames.refsUsers(accountId));
+
+    Account.Id accountId2 = new Account.Id(2);
+
+    AccountCache accountCache = EasyMock.createNiceMock(AccountCache.class);
+    accountCache.evict(accountId);
+    EasyMock.expectLastCall();
+    accountCache.evict(accountId2);
+    EasyMock.expectLastCall();
+    EasyMock.replay(accountCache);
+
+    AccountIndexer accountIndexer = EasyMock.createNiceMock(AccountIndexer.class);
+    accountIndexer.index(accountId);
+    EasyMock.expectLastCall();
+    accountIndexer.index(accountId2);
+    EasyMock.expectLastCall();
+    EasyMock.replay(accountIndexer);
+
+    // Non-user branch because it's not in All-Users.
+    Ref nonUserBranch = createRef(RefNames.refsUsers(new Account.Id(3)));
+
+    try (ProjectResetter resetProject =
+        builder(null, accountCache, accountIndexer, null, null, null, null)
+            .build(new ProjectResetter.Config().reset(project).reset(allUsers))) {
+      updateRef(nonUserBranch);
+      createRef(allUsersRepo, RefNames.REFS_EXTERNAL_IDS);
+      createRef(allUsersRepo, RefNames.refsUsers(accountId2));
+    }
+
+    EasyMock.verify(accountCache, accountIndexer);
+  }
+
+  @Test
+  public void accountEvictionFromAccountCreatorIfUserBranchIsDeleted() throws Exception {
+    Account.Id accountId = new Account.Id(1);
+    Project.NameKey allUsers = new Project.NameKey(AllUsersNameProvider.DEFAULT);
+    Repository allUsersRepo = repoManager.createRepository(allUsers);
+
+    AccountCreator accountCreator = EasyMock.createNiceMock(AccountCreator.class);
+    accountCreator.evict(ImmutableSet.of(accountId));
+    EasyMock.expectLastCall();
+    EasyMock.replay(accountCreator);
+
+    try (ProjectResetter resetProject =
+        builder(accountCreator, null, null, null, null, null, null)
+            .build(new ProjectResetter.Config().reset(project).reset(allUsers))) {
+      createRef(allUsersRepo, RefNames.refsUsers(accountId));
+    }
+
+    EasyMock.verify(accountCreator);
+  }
+
+  @Test
+  public void groupEviction() throws Exception {
+    AccountGroup.UUID uuid1 = new AccountGroup.UUID("abcd1");
+    AccountGroup.UUID uuid2 = new AccountGroup.UUID("abcd2");
+    AccountGroup.UUID uuid3 = new AccountGroup.UUID("abcd3");
+    Project.NameKey allUsers = new Project.NameKey(AllUsersNameProvider.DEFAULT);
+    Repository allUsersRepo = repoManager.createRepository(allUsers);
+
+    GroupCache cache = EasyMock.createNiceMock(GroupCache.class);
+    GroupIndexer indexer = EasyMock.createNiceMock(GroupIndexer.class);
+    GroupIncludeCache includeCache = EasyMock.createNiceMock(GroupIncludeCache.class);
+    cache.evict(uuid2);
+    indexer.index(uuid2);
+    includeCache.evictParentGroupsOf(uuid2);
+    cache.evict(uuid3);
+    indexer.index(uuid3);
+    includeCache.evictParentGroupsOf(uuid3);
+    EasyMock.expectLastCall();
+
+    EasyMock.replay(cache, indexer);
+
+    createRef(allUsersRepo, RefNames.refsGroups(uuid1));
+    Ref ref2 = createRef(allUsersRepo, RefNames.refsGroups(uuid2));
+    try (ProjectResetter resetProject =
+        builder(null, null, null, cache, includeCache, indexer, null)
+            .build(new ProjectResetter.Config().reset(project).reset(allUsers))) {
+      updateRef(allUsersRepo, ref2);
+      createRef(allUsersRepo, RefNames.refsGroups(uuid3));
+    }
+
+    EasyMock.verify(cache, indexer);
+  }
+
+  private Ref createRef(String ref) throws IOException {
+    return createRef(repo, ref);
+  }
+
+  private Ref createRef(Repository repo, String ref) throws IOException {
+    try (ObjectInserter oi = repo.newObjectInserter();
+        RevWalk rw = new RevWalk(repo)) {
+      ObjectId emptyCommit = createCommit(repo);
+      RefUpdate updateRef = repo.updateRef(ref);
+      updateRef.setExpectedOldObjectId(ObjectId.zeroId());
+      updateRef.setNewObjectId(emptyCommit);
+      assertThat(updateRef.update(rw)).isEqualTo(RefUpdate.Result.NEW);
+      return repo.exactRef(ref);
+    }
+  }
+
+  private Ref updateRef(Ref ref) throws IOException {
+    return updateRef(repo, ref);
+  }
+
+  private Ref updateRef(Repository repo, Ref ref) throws IOException {
+    try (ObjectInserter oi = repo.newObjectInserter();
+        RevWalk rw = new RevWalk(repo)) {
+      ObjectId emptyCommit = createCommit(repo);
+      RefUpdate updateRef = repo.updateRef(ref.getName());
+      updateRef.setExpectedOldObjectId(ref.getObjectId());
+      updateRef.setNewObjectId(emptyCommit);
+      updateRef.setForceUpdate(true);
+      assertThat(updateRef.update(rw)).isEqualTo(RefUpdate.Result.FORCED);
+      Ref updatedRef = repo.exactRef(ref.getName());
+      assertThat(updatedRef.getObjectId()).isNotEqualTo(ref.getObjectId());
+      return updatedRef;
+    }
+  }
+
+  private void assertRef(Ref ref) throws IOException {
+    assertRef(repo, ref);
+  }
+
+  private void assertRef(Repository repo, Ref ref) throws IOException {
+    assertThat(repo.exactRef(ref.getName()).getObjectId()).isEqualTo(ref.getObjectId());
+  }
+
+  private void assertDeletedRef(Ref ref) throws IOException {
+    assertDeletedRef(repo, ref);
+  }
+
+  private void assertDeletedRef(Repository repo, Ref ref) throws IOException {
+    assertThat(repo.exactRef(ref.getName())).isNull();
+  }
+
+  private ObjectId createCommit(Repository repo) throws IOException {
+    try (ObjectInserter oi = repo.newObjectInserter()) {
+      PersonIdent ident =
+          new PersonIdent(new PersonIdent("Foo Bar", "foo.bar@baz.com"), TimeUtil.nowTs());
+      CommitBuilder cb = new CommitBuilder();
+      cb.setTreeId(oi.insert(Constants.OBJ_TREE, new byte[] {}));
+      cb.setCommitter(ident);
+      cb.setAuthor(ident);
+      cb.setMessage("Test commit");
+
+      ObjectId commit = oi.insert(cb);
+      oi.flush();
+      return commit;
+    }
+  }
+
+  private ProjectResetter.Builder builder() {
+    return builder(null, null, null, null, null, null, null);
+  }
+
+  private ProjectResetter.Builder builder(
+      @Nullable AccountCreator accountCreator,
+      @Nullable AccountCache accountCache,
+      @Nullable AccountIndexer accountIndexer,
+      @Nullable GroupCache groupCache,
+      @Nullable GroupIncludeCache groupIncludeCache,
+      @Nullable GroupIndexer groupIndexer,
+      @Nullable ProjectCache projectCache) {
+    return new ProjectResetter.Builder(
+        repoManager,
+        new AllUsersName(AllUsersNameProvider.DEFAULT),
+        accountCreator,
+        accountCache,
+        accountIndexer,
+        groupCache,
+        groupIncludeCache,
+        groupIndexer,
+        projectCache);
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/TestGroupBackendTest.java b/javatests/com/google/gerrit/acceptance/TestGroupBackendTest.java
new file mode 100644
index 0000000..bf387fd
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/TestGroupBackendTest.java
@@ -0,0 +1,75 @@
+// 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.
+
+package com.google.gerrit.acceptance;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.account.UniversalGroupBackend;
+import com.google.gerrit.server.group.testing.TestGroupBackend;
+import com.google.inject.Inject;
+import org.junit.Test;
+
+public class TestGroupBackendTest extends AbstractDaemonTest {
+  @Inject private DynamicSet<GroupBackend> groupBackends;
+  @Inject private UniversalGroupBackend universalGroupBackend;
+
+  private final TestGroupBackend testGroupBackend = new TestGroupBackend();
+  private final AccountGroup.UUID testUUID = new AccountGroup.UUID("testbackend:test");
+
+  @Test
+  public void handlesTestGroup() throws Exception {
+    assertThat(testGroupBackend.handles(testUUID)).isTrue();
+  }
+
+  @Test
+  public void universalGroupBackendHandlesTestGroup() throws Exception {
+    RegistrationHandle registrationHandle = groupBackends.add("gerrit", testGroupBackend);
+    try {
+      assertThat(universalGroupBackend.handles(testUUID)).isTrue();
+    } finally {
+      registrationHandle.remove();
+    }
+  }
+
+  @Test
+  public void doesNotHandleLDAP() throws Exception {
+    assertThat(testGroupBackend.handles(new AccountGroup.UUID("ldap:1234"))).isFalse();
+  }
+
+  @Test
+  public void doesNotHandleNull() throws Exception {
+    assertThat(testGroupBackend.handles(null)).isFalse();
+  }
+
+  @Test
+  public void returnsNullWhenGroupDoesNotExist() throws Exception {
+    assertThat(testGroupBackend.get(testUUID)).isNull();
+  }
+
+  @Test
+  public void returnsNullForNullGroup() throws Exception {
+    assertThat(testGroupBackend.get(null)).isNull();
+  }
+
+  @Test
+  public void returnsKnownGroup() throws Exception {
+    testGroupBackend.create(testUUID);
+    assertThat(testGroupBackend.get(testUUID)).isNotNull();
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/annotation/BUILD b/javatests/com/google/gerrit/acceptance/annotation/BUILD
new file mode 100644
index 0000000..5476bb6
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/annotation/BUILD
@@ -0,0 +1,7 @@
+load("//javatests/com/google/gerrit/acceptance:tests.bzl", "acceptance_tests")
+
+acceptance_tests(
+    srcs = glob(["*.java"]),
+    group = "annotation",
+    labels = ["annotation"],
+)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/annotation/SandboxTest.java b/javatests/com/google/gerrit/acceptance/annotation/SandboxTest.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/annotation/SandboxTest.java
rename to javatests/com/google/gerrit/acceptance/annotation/SandboxTest.java
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/annotation/UseGerritConfigAnnotationTest.java b/javatests/com/google/gerrit/acceptance/annotation/UseGerritConfigAnnotationTest.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/annotation/UseGerritConfigAnnotationTest.java
rename to javatests/com/google/gerrit/acceptance/annotation/UseGerritConfigAnnotationTest.java
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/annotation/UseGlobalPluginConfigAnnotationTest.java b/javatests/com/google/gerrit/acceptance/annotation/UseGlobalPluginConfigAnnotationTest.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/annotation/UseGlobalPluginConfigAnnotationTest.java
rename to javatests/com/google/gerrit/acceptance/annotation/UseGlobalPluginConfigAnnotationTest.java
diff --git a/javatests/com/google/gerrit/acceptance/api/accounts/AccountIT.java b/javatests/com/google/gerrit/acceptance/api/accounts/AccountIT.java
new file mode 100644
index 0000000..775bfcf0
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/accounts/AccountIT.java
@@ -0,0 +1,3012 @@
+// Copyright (C) 2014 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.google.gerrit.acceptance.api.accounts;
+
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+import static com.google.common.truth.Truth.assert_;
+import static com.google.common.truth.Truth8.assertThat;
+import static com.google.gerrit.acceptance.GitUtil.deleteRef;
+import static com.google.gerrit.acceptance.GitUtil.fetch;
+import static com.google.gerrit.gpg.PublicKeyStore.REFS_GPG_KEYS;
+import static com.google.gerrit.gpg.PublicKeyStore.keyToString;
+import static com.google.gerrit.gpg.testing.TestKeys.allValidKeys;
+import static com.google.gerrit.gpg.testing.TestKeys.validKeyWithExpiration;
+import static com.google.gerrit.gpg.testing.TestKeys.validKeyWithSecondUserId;
+import static com.google.gerrit.gpg.testing.TestKeys.validKeyWithoutExpiration;
+import static com.google.gerrit.server.StarredChangesUtil.DEFAULT_LABEL;
+import static com.google.gerrit.server.StarredChangesUtil.IGNORE_LABEL;
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_GPGKEY;
+import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Objects.requireNonNull;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static java.util.stream.Collectors.toSet;
+import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
+
+import com.github.rholder.retry.StopStrategies;
+import com.google.common.cache.LoadingCache;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableSetMultimap;
+import com.google.common.collect.Iterables;
+import com.google.common.io.BaseEncoding;
+import com.google.common.truth.Correspondence;
+import com.google.common.util.concurrent.AtomicLongMap;
+import com.google.common.util.concurrent.Runnables;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.GerritConfig;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.Sandboxed;
+import com.google.gerrit.acceptance.TestAccount;
+import com.google.gerrit.acceptance.UseSsh;
+import com.google.gerrit.acceptance.testsuite.account.AccountOperations;
+import com.google.gerrit.acceptance.testsuite.account.TestSshKeys;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.common.data.PermissionRule.Action;
+import com.google.gerrit.extensions.api.accounts.AccountInput;
+import com.google.gerrit.extensions.api.accounts.DeleteDraftCommentsInput;
+import com.google.gerrit.extensions.api.accounts.DeletedDraftCommentInfo;
+import com.google.gerrit.extensions.api.accounts.EmailInput;
+import com.google.gerrit.extensions.api.changes.AddReviewerInput;
+import com.google.gerrit.extensions.api.changes.DraftInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.changes.StarsInput;
+import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo;
+import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo.ConsistencyProblemInfo;
+import com.google.gerrit.extensions.api.config.ConsistencyCheckInput;
+import com.google.gerrit.extensions.api.config.ConsistencyCheckInput.CheckAccountsInput;
+import com.google.gerrit.extensions.common.AccountDetailInfo;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.common.EmailInfo;
+import com.google.gerrit.extensions.common.GpgKeyInfo;
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.extensions.common.SshKeyInfo;
+import com.google.gerrit.extensions.events.AccountIndexedListener;
+import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.gpg.Fingerprint;
+import com.google.gerrit.gpg.PublicKeyStore;
+import com.google.gerrit.gpg.testing.TestKey;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.Sequences;
+import com.google.gerrit.server.ServerInitiated;
+import com.google.gerrit.server.account.AccountProperties;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.account.AccountsUpdate;
+import com.google.gerrit.server.account.Emails;
+import com.google.gerrit.server.account.ProjectWatches;
+import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gerrit.server.account.VersionedAuthorizedKeys;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.account.externalids.ExternalIdNotes;
+import com.google.gerrit.server.account.externalids.ExternalIds;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.LockFailureException;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.index.account.AccountIndexer;
+import com.google.gerrit.server.index.account.StalenessChecker;
+import com.google.gerrit.server.notedb.rebuild.ChangeRebuilderImpl;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.server.project.RefPattern;
+import com.google.gerrit.server.query.account.InternalAccountQuery;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.util.MagicBranch;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.server.validators.AccountActivationValidationListener;
+import com.google.gerrit.server.validators.ValidationException;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.gerrit.testing.FakeEmailSender.Message;
+import com.google.gerrit.testing.TestTimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.name.Named;
+import com.jcraft.jsch.KeyPair;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.bouncycastle.bcpg.ArmoredOutputStream;
+import org.bouncycastle.openpgp.PGPPublicKey;
+import org.bouncycastle.openpgp.PGPPublicKeyRing;
+import org.eclipse.jgit.api.errors.TransportException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.PushCertificateIdent;
+import org.eclipse.jgit.transport.PushResult;
+import org.eclipse.jgit.transport.RemoteRefUpdate;
+import org.eclipse.jgit.treewalk.TreeWalk;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AccountIT extends AbstractDaemonTest {
+  @ConfigSuite.Default
+  public static Config enableSignedPushConfig() {
+    Config cfg = new Config();
+    cfg.setBoolean("receive", null, "enableSignedPush", true);
+
+    // Disable the staleness checker so that tests that verify the number of expected index events
+    // are stable.
+    cfg.setBoolean("index", null, "autoReindexIfStale", false);
+
+    return cfg;
+  }
+
+  @Inject private Provider<PublicKeyStore> publicKeyStoreProvider;
+
+  @Inject private @ServerInitiated Provider<AccountsUpdate> accountsUpdateProvider;
+
+  @Inject private ExternalIds externalIds;
+
+  @Inject private DynamicSet<AccountIndexedListener> accountIndexedListeners;
+
+  @Inject private DynamicSet<GitReferenceUpdatedListener> refUpdateListeners;
+
+  @Inject private Sequences seq;
+
+  @Inject private Provider<InternalAccountQuery> accountQueryProvider;
+
+  @Inject protected Emails emails;
+
+  @Inject private StalenessChecker stalenessChecker;
+
+  @Inject private AccountIndexer accountIndexer;
+
+  @Inject private GitReferenceUpdated gitReferenceUpdated;
+
+  @Inject private RetryHelper.Metrics retryMetrics;
+
+  @Inject private Provider<MetaDataUpdate.InternalFactory> metaDataUpdateInternalFactory;
+
+  @Inject private ExternalIdNotes.Factory extIdNotesFactory;
+
+  @Inject private VersionedAuthorizedKeys.Accessor authorizedKeys;
+
+  @Inject
+  @Named("accounts")
+  private LoadingCache<Account.Id, Optional<AccountState>> accountsCache;
+
+  @Inject private AccountOperations accountOperations;
+
+  @Inject
+  private DynamicSet<AccountActivationValidationListener> accountActivationValidationListeners;
+
+  private AccountIndexedCounter accountIndexedCounter;
+  private RegistrationHandle accountIndexEventCounterHandle;
+  private RefUpdateCounter refUpdateCounter;
+  private RegistrationHandle refUpdateCounterHandle;
+
+  @Before
+  public void addAccountIndexEventCounter() {
+    accountIndexedCounter = new AccountIndexedCounter();
+    accountIndexEventCounterHandle = accountIndexedListeners.add("gerrit", accountIndexedCounter);
+  }
+
+  @After
+  public void removeAccountIndexEventCounter() {
+    if (accountIndexEventCounterHandle != null) {
+      accountIndexEventCounterHandle.remove();
+    }
+  }
+
+  @Before
+  public void addRefUpdateCounter() {
+    refUpdateCounter = new RefUpdateCounter();
+    refUpdateCounterHandle = refUpdateListeners.add("gerrit", refUpdateCounter);
+  }
+
+  @After
+  public void removeRefUpdateCounter() {
+    if (refUpdateCounterHandle != null) {
+      refUpdateCounterHandle.remove();
+    }
+  }
+
+  @After
+  public void clearPublicKeyStore() throws Exception {
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      Ref ref = repo.exactRef(REFS_GPG_KEYS);
+      if (ref != null) {
+        RefUpdate ru = repo.updateRef(REFS_GPG_KEYS);
+        ru.setForceUpdate(true);
+        assertThat(ru.delete()).isEqualTo(RefUpdate.Result.FORCED);
+      }
+    }
+  }
+
+  @After
+  public void deleteGpgKeys() throws Exception {
+    String ref = REFS_GPG_KEYS;
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      if (repo.getRefDatabase().exactRef(ref) != null) {
+        RefUpdate ru = repo.updateRef(ref);
+        ru.setForceUpdate(true);
+        assertWithMessage("Failed to delete " + ref)
+            .that(ru.delete())
+            .isEqualTo(RefUpdate.Result.FORCED);
+      }
+    }
+  }
+
+  protected void assertLabelPermission(
+      Project.NameKey project,
+      GroupReference groupReference,
+      String ref,
+      boolean exclusive,
+      String labelName,
+      int min,
+      int max)
+      throws IOException {
+    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
+    AccessSection accessSection = cfg.getAccessSection(ref);
+    assertThat(accessSection).isNotNull();
+
+    String permissionName = Permission.LABEL + labelName;
+    Permission permission = accessSection.getPermission(permissionName);
+    assertPermission(permission, permissionName, exclusive, labelName);
+    assertPermissionRule(
+        permission.getRule(groupReference), groupReference, Action.ALLOW, false, min, max);
+  }
+
+  @Test
+  public void createByAccountCreator() throws Exception {
+    Account.Id accountId = createByAccountCreator(1);
+    refUpdateCounter.assertRefUpdateFor(
+        RefUpdateCounter.projectRef(allUsers, RefNames.refsUsers(accountId)),
+        RefUpdateCounter.projectRef(allUsers, RefNames.REFS_EXTERNAL_IDS),
+        RefUpdateCounter.projectRef(allUsers, RefNames.REFS_SEQUENCES + Sequences.NAME_ACCOUNTS));
+  }
+
+  private Account.Id createByAccountCreator(int expectedAccountReindexCalls) throws Exception {
+    String name = "foo";
+    TestAccount foo = accountCreator.create(name);
+    AccountInfo info = gApi.accounts().id(foo.id.get()).get();
+    assertThat(info.username).isEqualTo(name);
+    assertThat(info.name).isEqualTo(name);
+    accountIndexedCounter.assertReindexOf(foo, expectedAccountReindexCalls);
+    assertUserBranch(foo.getId(), name, null);
+    return foo.getId();
+  }
+
+  @Test
+  public void createAnonymousCowardByAccountCreator() throws Exception {
+    TestAccount anonymousCoward = accountCreator.create();
+    accountIndexedCounter.assertReindexOf(anonymousCoward);
+    assertUserBranchWithoutAccountConfig(anonymousCoward.getId());
+  }
+
+  @Test
+  public void create() throws Exception {
+    AccountInput input = new AccountInput();
+    input.username = "foo";
+    input.name = "Foo";
+    input.email = "foo@example.com";
+    AccountInfo accountInfo = gApi.accounts().create(input).get();
+    assertThat(accountInfo._accountId).isNotNull();
+    assertThat(accountInfo.username).isEqualTo(input.username);
+    assertThat(accountInfo.name).isEqualTo(input.name);
+    assertThat(accountInfo.email).isEqualTo(input.email);
+    assertThat(accountInfo.status).isNull();
+
+    Account.Id accountId = new Account.Id(accountInfo._accountId);
+    accountIndexedCounter.assertReindexOf(accountId, 1);
+    assertThat(externalIds.byAccount(accountId))
+        .containsExactly(
+            ExternalId.createUsername(input.username, accountId, null),
+            ExternalId.createEmail(accountId, input.email));
+  }
+
+  @Test
+  public void createAccountUsernameAlreadyTaken() throws Exception {
+    AccountInput input = new AccountInput();
+    input.username = admin.username;
+
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("username '" + admin.username + "' already exists");
+    gApi.accounts().create(input);
+  }
+
+  @Test
+  public void createAccountEmailAlreadyTaken() throws Exception {
+    AccountInput input = new AccountInput();
+    input.username = "foo";
+    input.email = admin.email;
+
+    exception.expect(UnprocessableEntityException.class);
+    exception.expectMessage("email '" + admin.email + "' already exists");
+    gApi.accounts().create(input);
+  }
+
+  @Test
+  public void commitMessageOnAccountUpdates() throws Exception {
+    AccountsUpdate au = accountsUpdateProvider.get();
+    Account.Id accountId = new Account.Id(seq.nextAccountId());
+    au.insert("Create Test Account", accountId, u -> {});
+    assertLastCommitMessageOfUserBranch(accountId, "Create Test Account");
+
+    au.update("Set Status", accountId, u -> u.setStatus("Foo"));
+    assertLastCommitMessageOfUserBranch(accountId, "Set Status");
+  }
+
+  private void assertLastCommitMessageOfUserBranch(Account.Id accountId, String expectedMessage)
+      throws Exception {
+    try (Repository repo = repoManager.openRepository(allUsers);
+        RevWalk rw = new RevWalk(repo)) {
+      Ref exactRef = repo.exactRef(RefNames.refsUsers(accountId));
+      assertThat(rw.parseCommit(exactRef.getObjectId()).getShortMessage())
+          .isEqualTo(expectedMessage);
+    }
+  }
+
+  @Test
+  public void createAtomically() throws Exception {
+    TestTimeUtil.resetWithClockStep(1, SECONDS);
+    try {
+      Account.Id accountId = new Account.Id(seq.nextAccountId());
+      String fullName = "Foo";
+      ExternalId extId = ExternalId.createEmail(accountId, "foo@example.com");
+      AccountState accountState =
+          accountsUpdateProvider
+              .get()
+              .insert(
+                  "Create Account Atomically",
+                  accountId,
+                  u -> u.setFullName(fullName).addExternalId(extId));
+      assertThat(accountState.getAccount().getFullName()).isEqualTo(fullName);
+
+      AccountInfo info = gApi.accounts().id(accountId.get()).get();
+      assertThat(info.name).isEqualTo(fullName);
+
+      List<EmailInfo> emails = gApi.accounts().id(accountId.get()).getEmails();
+      assertThat(emails.stream().map(e -> e.email).collect(toSet())).containsExactly(extId.email());
+
+      RevCommit commitUserBranch = getRemoteHead(allUsers, RefNames.refsUsers(accountId));
+      RevCommit commitRefsMetaExternalIds = getRemoteHead(allUsers, RefNames.REFS_EXTERNAL_IDS);
+      assertThat(commitUserBranch.getCommitTime())
+          .isEqualTo(commitRefsMetaExternalIds.getCommitTime());
+    } finally {
+      TestTimeUtil.useSystemTime();
+    }
+  }
+
+  @Test
+  public void updateNonExistingAccount() throws Exception {
+    Account.Id nonExistingAccountId = new Account.Id(999999);
+    AtomicBoolean consumerCalled = new AtomicBoolean();
+    Optional<AccountState> accountState =
+        accountsUpdateProvider
+            .get()
+            .update(
+                "Update Non-Existing Account", nonExistingAccountId, a -> consumerCalled.set(true));
+    assertThat(accountState).isEmpty();
+    assertThat(consumerCalled.get()).isFalse();
+  }
+
+  @Test
+  public void updateAccountWithoutAccountConfigNoteDb() throws Exception {
+    TestAccount anonymousCoward = accountCreator.create();
+    assertUserBranchWithoutAccountConfig(anonymousCoward.getId());
+
+    String status = "OOO";
+    Optional<AccountState> accountState =
+        accountsUpdateProvider
+            .get()
+            .update("Set status", anonymousCoward.getId(), u -> u.setStatus(status));
+    assertThat(accountState).isPresent();
+    Account account = accountState.get().getAccount();
+    assertThat(account.getFullName()).isNull();
+    assertThat(account.getStatus()).isEqualTo(status);
+    assertUserBranch(anonymousCoward.getId(), null, status);
+  }
+
+  private void assertUserBranchWithoutAccountConfig(Account.Id accountId) throws Exception {
+    assertUserBranch(accountId, null, null);
+  }
+
+  private void assertUserBranch(
+      Account.Id accountId, @Nullable String name, @Nullable String status) throws Exception {
+    try (Repository repo = repoManager.openRepository(allUsers);
+        RevWalk rw = new RevWalk(repo);
+        ObjectReader or = repo.newObjectReader()) {
+      Ref ref = repo.exactRef(RefNames.refsUsers(accountId));
+      assertThat(ref).isNotNull();
+      RevCommit c = rw.parseCommit(ref.getObjectId());
+      long timestampDiffMs =
+          Math.abs(c.getCommitTime() * 1000L - getAccount(accountId).getRegisteredOn().getTime());
+      assertThat(timestampDiffMs).isAtMost(ChangeRebuilderImpl.MAX_WINDOW_MS);
+
+      // Check the 'account.config' file.
+      try (TreeWalk tw = TreeWalk.forPath(or, AccountProperties.ACCOUNT_CONFIG, c.getTree())) {
+        if (name != null || status != null) {
+          assertThat(tw).isNotNull();
+          Config cfg = new Config();
+          cfg.fromText(new String(or.open(tw.getObjectId(0), OBJ_BLOB).getBytes(), UTF_8));
+          assertThat(
+                  cfg.getString(AccountProperties.ACCOUNT, null, AccountProperties.KEY_FULL_NAME))
+              .isEqualTo(name);
+          assertThat(cfg.getString(AccountProperties.ACCOUNT, null, AccountProperties.KEY_STATUS))
+              .isEqualTo(status);
+        } else {
+          // No account properties were set, hence an 'account.config' file was not created.
+          assertThat(tw).isNull();
+        }
+      }
+    }
+  }
+
+  @Test
+  public void get() throws Exception {
+    AccountInfo info = gApi.accounts().id("admin").get();
+    assertThat(info.name).isEqualTo("Administrator");
+    assertThat(info.email).isEqualTo("admin@example.com");
+    assertThat(info.username).isEqualTo("admin");
+    accountIndexedCounter.assertNoReindex();
+  }
+
+  @Test
+  public void getByIntId() throws Exception {
+    AccountInfo info = gApi.accounts().id("admin").get();
+    AccountInfo infoByIntId = gApi.accounts().id(info._accountId).get();
+    assertThat(info.name).isEqualTo(infoByIntId.name);
+    accountIndexedCounter.assertNoReindex();
+  }
+
+  @Test
+  public void self() throws Exception {
+    AccountInfo info = gApi.accounts().self().get();
+    assertUser(info, admin);
+
+    info = gApi.accounts().id("self").get();
+    assertUser(info, admin);
+    accountIndexedCounter.assertNoReindex();
+  }
+
+  @Test
+  public void active() throws Exception {
+    assertThat(gApi.accounts().id("user").getActive()).isTrue();
+    gApi.accounts().id("user").setActive(false);
+    assertThat(gApi.accounts().id("user").getActive()).isFalse();
+    accountIndexedCounter.assertReindexOf(user);
+
+    gApi.accounts().id("user").setActive(true);
+    assertThat(gApi.accounts().id("user").getActive()).isTrue();
+    accountIndexedCounter.assertReindexOf(user);
+  }
+
+  @Test
+  public void validateAccountActivation() throws Exception {
+    Account.Id activatableAccountId =
+        accountOperations.newAccount().inactive().preferredEmail("foo@activatable.com").create();
+    Account.Id deactivatableAccountId =
+        accountOperations.newAccount().preferredEmail("foo@deactivatable.com").create();
+    RegistrationHandle registrationHandle =
+        accountActivationValidationListeners.add(
+            "gerrit",
+            new AccountActivationValidationListener() {
+              @Override
+              public void validateActivation(AccountState account) throws ValidationException {
+                String preferredEmail = account.getAccount().getPreferredEmail();
+                if (preferredEmail == null || !preferredEmail.endsWith("@activatable.com")) {
+                  throw new ValidationException("not allowed to active account");
+                }
+              }
+
+              @Override
+              public void validateDeactivation(AccountState account) throws ValidationException {
+                String preferredEmail = account.getAccount().getPreferredEmail();
+                if (preferredEmail == null || !preferredEmail.endsWith("@deactivatable.com")) {
+                  throw new ValidationException("not allowed to deactive account");
+                }
+              }
+            });
+    try {
+      /* Test account that can be activated, but not deactivated */
+      // Deactivate account that is already inactive
+      try {
+        gApi.accounts().id(activatableAccountId.get()).setActive(false);
+        fail("Expected exception");
+      } catch (ResourceConflictException e) {
+        assertThat(e.getMessage()).isEqualTo("account not active");
+      }
+      assertThat(accountOperations.account(activatableAccountId).get().active()).isFalse();
+
+      // Activate account that can be activated
+      gApi.accounts().id(activatableAccountId.get()).setActive(true);
+      assertThat(accountOperations.account(activatableAccountId).get().active()).isTrue();
+
+      // Activate account that is already active
+      gApi.accounts().id(activatableAccountId.get()).setActive(true);
+      assertThat(accountOperations.account(activatableAccountId).get().active()).isTrue();
+
+      // Try deactivating account that cannot be deactivated
+      try {
+        gApi.accounts().id(activatableAccountId.get()).setActive(false);
+        fail("Expected exception");
+      } catch (ResourceConflictException e) {
+        assertThat(e.getMessage()).isEqualTo("not allowed to deactive account");
+      }
+      assertThat(accountOperations.account(activatableAccountId).get().active()).isTrue();
+
+      /* Test account that can be deactivated, but not activated */
+      // Activate account that is already inactive
+      gApi.accounts().id(deactivatableAccountId.get()).setActive(true);
+      assertThat(accountOperations.account(deactivatableAccountId).get().active()).isTrue();
+
+      // Deactivate account that can be deactivated
+      gApi.accounts().id(deactivatableAccountId.get()).setActive(false);
+      assertThat(accountOperations.account(deactivatableAccountId).get().active()).isFalse();
+
+      // Deactivate account that is already inactive
+      try {
+        gApi.accounts().id(deactivatableAccountId.get()).setActive(false);
+        fail("Expected exception");
+      } catch (ResourceConflictException e) {
+        assertThat(e.getMessage()).isEqualTo("account not active");
+      }
+      assertThat(accountOperations.account(deactivatableAccountId).get().active()).isFalse();
+
+      // Try activating account that cannot be activated
+      try {
+        gApi.accounts().id(deactivatableAccountId.get()).setActive(true);
+        fail("Expected exception");
+      } catch (ResourceConflictException e) {
+        assertThat(e.getMessage()).isEqualTo("not allowed to active account");
+      }
+      assertThat(accountOperations.account(deactivatableAccountId).get().active()).isFalse();
+    } finally {
+      registrationHandle.remove();
+    }
+  }
+
+  @Test
+  public void deactivateSelf() throws Exception {
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("cannot deactivate own account");
+    gApi.accounts().self().setActive(false);
+  }
+
+  @Test
+  public void deactivateNotActive() throws Exception {
+    assertThat(gApi.accounts().id("user").getActive()).isTrue();
+    gApi.accounts().id("user").setActive(false);
+    assertThat(gApi.accounts().id("user").getActive()).isFalse();
+    try {
+      gApi.accounts().id("user").setActive(false);
+      fail("Expected exception");
+    } catch (ResourceConflictException e) {
+      assertThat(e.getMessage()).isEqualTo("account not active");
+    }
+    gApi.accounts().id("user").setActive(true);
+  }
+
+  @Test
+  public void starUnstarChange() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String triplet = project.get() + "~master~" + r.getChangeId();
+    refUpdateCounter.clear();
+
+    gApi.accounts().self().starChange(triplet);
+    ChangeInfo change = info(triplet);
+    assertThat(change.starred).isTrue();
+    assertThat(change.stars).contains(DEFAULT_LABEL);
+    refUpdateCounter.assertRefUpdateFor(
+        RefUpdateCounter.projectRef(
+            allUsers, RefNames.refsStarredChanges(new Change.Id(change._number), admin.id)));
+
+    gApi.accounts().self().unstarChange(triplet);
+    change = info(triplet);
+    assertThat(change.starred).isNull();
+    assertThat(change.stars).isNull();
+    refUpdateCounter.assertRefUpdateFor(
+        RefUpdateCounter.projectRef(
+            allUsers, RefNames.refsStarredChanges(new Change.Id(change._number), admin.id)));
+
+    accountIndexedCounter.assertNoReindex();
+  }
+
+  @Test
+  public void starUnstarChangeWithLabels() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String triplet = project.get() + "~master~" + r.getChangeId();
+    refUpdateCounter.clear();
+
+    assertThat(gApi.accounts().self().getStars(triplet)).isEmpty();
+    assertThat(gApi.accounts().self().getStarredChanges()).isEmpty();
+
+    gApi.accounts()
+        .self()
+        .setStars(triplet, new StarsInput(ImmutableSet.of(DEFAULT_LABEL, "red", "blue")));
+    ChangeInfo change = info(triplet);
+    assertThat(change.starred).isTrue();
+    assertThat(change.stars).containsExactly("blue", "red", DEFAULT_LABEL).inOrder();
+    assertThat(gApi.accounts().self().getStars(triplet))
+        .containsExactly("blue", "red", DEFAULT_LABEL)
+        .inOrder();
+    List<ChangeInfo> starredChanges = gApi.accounts().self().getStarredChanges();
+    assertThat(starredChanges).hasSize(1);
+    ChangeInfo starredChange = starredChanges.get(0);
+    assertThat(starredChange._number).isEqualTo(r.getChange().getId().get());
+    assertThat(starredChange.starred).isTrue();
+    assertThat(starredChange.stars).containsExactly("blue", "red", DEFAULT_LABEL).inOrder();
+    refUpdateCounter.assertRefUpdateFor(
+        RefUpdateCounter.projectRef(
+            allUsers, RefNames.refsStarredChanges(new Change.Id(change._number), admin.id)));
+
+    gApi.accounts()
+        .self()
+        .setStars(
+            triplet,
+            new StarsInput(ImmutableSet.of("yellow"), ImmutableSet.of(DEFAULT_LABEL, "blue")));
+    change = info(triplet);
+    assertThat(change.starred).isNull();
+    assertThat(change.stars).containsExactly("red", "yellow").inOrder();
+    assertThat(gApi.accounts().self().getStars(triplet)).containsExactly("red", "yellow").inOrder();
+    starredChanges = gApi.accounts().self().getStarredChanges();
+    assertThat(starredChanges).hasSize(1);
+    starredChange = starredChanges.get(0);
+    assertThat(starredChange._number).isEqualTo(r.getChange().getId().get());
+    assertThat(starredChange.starred).isNull();
+    assertThat(starredChange.stars).containsExactly("red", "yellow").inOrder();
+    refUpdateCounter.assertRefUpdateFor(
+        RefUpdateCounter.projectRef(
+            allUsers, RefNames.refsStarredChanges(new Change.Id(change._number), admin.id)));
+
+    accountIndexedCounter.assertNoReindex();
+
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    exception.expectMessage("not allowed to get stars of another account");
+    gApi.accounts().id(Integer.toString((admin.id.get()))).getStars(triplet);
+  }
+
+  @Test
+  public void starWithInvalidLabels() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String triplet = project.get() + "~master~" + r.getChangeId();
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("invalid labels: another invalid label, invalid label");
+    gApi.accounts()
+        .self()
+        .setStars(
+            triplet,
+            new StarsInput(
+                ImmutableSet.of(DEFAULT_LABEL, "invalid label", "blue", "another invalid label")));
+  }
+
+  @Test
+  public void deleteStarLabelsFromChangeWithoutStarLabels() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String triplet = project.get() + "~master~" + r.getChangeId();
+    assertThat(gApi.accounts().self().getStars(triplet)).isEmpty();
+
+    gApi.accounts().self().setStars(triplet, new StarsInput());
+
+    assertThat(gApi.accounts().self().getStars(triplet)).isEmpty();
+  }
+
+  @Test
+  public void starWithDefaultAndIgnoreLabel() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String triplet = project.get() + "~master~" + r.getChangeId();
+    exception.expect(BadRequestException.class);
+    exception.expectMessage(
+        "The labels "
+            + DEFAULT_LABEL
+            + " and "
+            + IGNORE_LABEL
+            + " are mutually exclusive."
+            + " Only one of them can be set.");
+    gApi.accounts()
+        .self()
+        .setStars(triplet, new StarsInput(ImmutableSet.of(DEFAULT_LABEL, "blue", IGNORE_LABEL)));
+  }
+
+  @Test
+  public void ignoreChangeBySetStars() throws Exception {
+    TestAccount user2 = accountCreator.user2();
+    accountIndexedCounter.clear();
+
+    PushOneCommit.Result r = createChange();
+
+    AddReviewerInput in = new AddReviewerInput();
+    in.reviewer = user.email;
+    gApi.changes().id(r.getChangeId()).addReviewer(in);
+
+    in = new AddReviewerInput();
+    in.reviewer = user2.email;
+    gApi.changes().id(r.getChangeId()).addReviewer(in);
+
+    setApiUser(user);
+    gApi.accounts().self().setStars(r.getChangeId(), new StarsInput(ImmutableSet.of(IGNORE_LABEL)));
+
+    sender.clear();
+    setApiUser(admin);
+    gApi.changes().id(r.getChangeId()).abandon();
+    List<Message> messages = sender.getMessages();
+    assertThat(messages).hasSize(1);
+    assertThat(messages.get(0).rcpt()).containsExactly(user2.emailAddress);
+    accountIndexedCounter.assertNoReindex();
+  }
+
+  @Test
+  public void addReviewerToIgnoredChange() throws Exception {
+    PushOneCommit.Result r = createChange();
+
+    setApiUser(user);
+    gApi.accounts().self().setStars(r.getChangeId(), new StarsInput(ImmutableSet.of(IGNORE_LABEL)));
+
+    sender.clear();
+    setApiUser(admin);
+
+    AddReviewerInput in = new AddReviewerInput();
+    in.reviewer = user.email;
+    gApi.changes().id(r.getChangeId()).addReviewer(in);
+    List<Message> messages = sender.getMessages();
+    assertThat(messages).hasSize(1);
+    Message message = messages.get(0);
+    assertThat(message.rcpt()).containsExactly(user.emailAddress);
+    assertMailReplyTo(message, admin.email);
+    accountIndexedCounter.assertNoReindex();
+  }
+
+  @Test
+  public void suggestAccounts() throws Exception {
+    String adminUsername = "admin";
+    List<AccountInfo> result = gApi.accounts().suggestAccounts().withQuery(adminUsername).get();
+    assertThat(result).hasSize(1);
+    assertThat(result.get(0).username).isEqualTo(adminUsername);
+
+    List<AccountInfo> resultShortcutApi = gApi.accounts().suggestAccounts(adminUsername).get();
+    assertThat(resultShortcutApi).hasSize(result.size());
+
+    List<AccountInfo> emptyResult = gApi.accounts().suggestAccounts("unknown").get();
+    assertThat(emptyResult).isEmpty();
+    accountIndexedCounter.assertNoReindex();
+  }
+
+  @Test
+  public void getOwnDetail() throws Exception {
+    String email = "preferred@example.com";
+    String name = "Foo";
+    String username = name("foo");
+    TestAccount foo = accountCreator.create(username, email, name);
+    String secondaryEmail = "secondary@example.com";
+    EmailInput input = newEmailInput(secondaryEmail);
+    gApi.accounts().id(foo.id.get()).addEmail(input);
+
+    String status = "OOO";
+    gApi.accounts().id(foo.id.get()).setStatus(status);
+
+    setApiUser(foo);
+    AccountDetailInfo detail = gApi.accounts().id(foo.id.get()).detail();
+    assertThat(detail._accountId).isEqualTo(foo.id.get());
+    assertThat(detail.name).isEqualTo(name);
+    assertThat(detail.username).isEqualTo(username);
+    assertThat(detail.email).isEqualTo(email);
+    assertThat(detail.secondaryEmails).containsExactly(secondaryEmail);
+    assertThat(detail.status).isEqualTo(status);
+    assertThat(detail.registeredOn).isEqualTo(getAccount(foo.getId()).getRegisteredOn());
+    assertThat(detail.inactive).isNull();
+    assertThat(detail._moreAccounts).isNull();
+  }
+
+  @Test
+  public void detailOfOtherAccountDoesntIncludeSecondaryEmailsWithoutModifyAccount()
+      throws Exception {
+    String email = "preferred@example.com";
+    TestAccount foo = accountCreator.create(name("foo"), email, "Foo");
+    String secondaryEmail = "secondary@example.com";
+    EmailInput input = newEmailInput(secondaryEmail);
+    gApi.accounts().id(foo.id.get()).addEmail(input);
+
+    setApiUser(user);
+    AccountDetailInfo detail = gApi.accounts().id(foo.id.get()).detail();
+    assertThat(detail.secondaryEmails).isNull();
+  }
+
+  @Test
+  public void detailOfOtherAccountIncludeSecondaryEmailsWithModifyAccount() throws Exception {
+    String email = "preferred@example.com";
+    TestAccount foo = accountCreator.create(name("foo"), email, "Foo");
+    String secondaryEmail = "secondary@example.com";
+    EmailInput input = newEmailInput(secondaryEmail);
+    gApi.accounts().id(foo.id.get()).addEmail(input);
+
+    AccountDetailInfo detail = gApi.accounts().id(foo.id.get()).detail();
+    assertThat(detail.secondaryEmails).containsExactly(secondaryEmail);
+  }
+
+  @Test
+  public void getOwnEmails() throws Exception {
+    String email = "preferred@example.com";
+    TestAccount foo = accountCreator.create(name("foo"), email, "Foo");
+
+    setApiUser(foo);
+    assertThat(getEmails()).containsExactly(email);
+
+    setApiUser(admin);
+    String secondaryEmail = "secondary@example.com";
+    EmailInput input = newEmailInput(secondaryEmail);
+    gApi.accounts().id(foo.id.hashCode()).addEmail(input);
+
+    setApiUser(foo);
+    assertThat(getEmails()).containsExactly(email, secondaryEmail);
+  }
+
+  @Test
+  public void cannotGetEmailsOfOtherAccountWithoutModifyAccount() throws Exception {
+    String email = "preferred2@example.com";
+    TestAccount foo = accountCreator.create(name("foo"), email, "Foo");
+
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    exception.expectMessage("modify account not permitted");
+    gApi.accounts().id(foo.id.get()).getEmails();
+  }
+
+  @Test
+  public void getEmailsOfOtherAccount() throws Exception {
+    String email = "preferred3@example.com";
+    String secondaryEmail = "secondary3@example.com";
+    TestAccount foo = accountCreator.create(name("foo"), email, "Foo");
+    EmailInput input = newEmailInput(secondaryEmail);
+    gApi.accounts().id(foo.id.hashCode()).addEmail(input);
+
+    assertThat(
+            gApi.accounts().id(foo.id.get()).getEmails().stream()
+                .map(e -> e.email)
+                .collect(toSet()))
+        .containsExactly(email, secondaryEmail);
+  }
+
+  @Test
+  public void addEmail() throws Exception {
+    List<String> emails = ImmutableList.of("new.email@example.com", "new.email@example.systems");
+    Set<String> currentEmails = getEmails();
+    for (String email : emails) {
+      assertThat(currentEmails).doesNotContain(email);
+      EmailInput input = newEmailInput(email);
+      gApi.accounts().self().addEmail(input);
+      accountIndexedCounter.assertReindexOf(admin);
+    }
+
+    resetCurrentApiUser();
+    assertThat(getEmails()).containsAllIn(emails);
+  }
+
+  @Test
+  public void addInvalidEmail() throws Exception {
+    List<String> emails =
+        ImmutableList.of(
+            // Missing domain part
+            "new.email",
+
+            // Missing domain part
+            "new.email@",
+
+            // Missing user part
+            "@example.com",
+
+            // Non-supported TLD  (see tlds-alpha-by-domain.txt)
+            "new.email@example.africa");
+    for (String email : emails) {
+      EmailInput input = newEmailInput(email);
+      try {
+        gApi.accounts().self().addEmail(input);
+        fail("Expected BadRequestException for invalid email address: " + email);
+      } catch (BadRequestException e) {
+        assertThat(e).hasMessageThat().isEqualTo("invalid email address");
+      }
+    }
+    accountIndexedCounter.assertNoReindex();
+  }
+
+  @Test
+  public void cannotAddNonConfirmedEmailWithoutModifyAccountPermission() throws Exception {
+    TestAccount account = accountCreator.create(name("user"));
+    EmailInput input = newEmailInput("test@test.com");
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    gApi.accounts().id(account.username).addEmail(input);
+  }
+
+  @Test
+  public void cannotAddEmailAddressUsedByAnotherAccount() throws Exception {
+    String email = "new.email@example.com";
+    EmailInput input = newEmailInput(email);
+    gApi.accounts().self().addEmail(input);
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("Identity 'mailto:" + email + "' in use by another account");
+    gApi.accounts().id(user.username).addEmail(input);
+  }
+
+  @Test
+  @GerritConfig(
+      name = "auth.registerEmailPrivateKey",
+      value = "HsOc6l+2lhS9G7sE/RsnS7Z6GJjdRDX14co=")
+  public void addEmailSendsConfirmationEmail() throws Exception {
+    String email = "new.email@example.com";
+    EmailInput input = newEmailInput(email, false);
+    gApi.accounts().self().addEmail(input);
+
+    assertThat(sender.getMessages()).hasSize(1);
+    Message m = sender.getMessages().get(0);
+    assertThat(m.rcpt()).containsExactly(new Address(email));
+  }
+
+  @Test
+  @GerritConfig(
+      name = "auth.registerEmailPrivateKey",
+      value = "HsOc6l+2lhS9G7sE/RsnS7Z6GJjdRDX14co=")
+  public void addEmailToBeConfirmedToOwnAccount() throws Exception {
+    TestAccount user = accountCreator.create();
+    setApiUser(user);
+
+    String email = "self@example.com";
+    EmailInput input = newEmailInput(email, false);
+    gApi.accounts().self().addEmail(input);
+  }
+
+  @Test
+  public void cannotAddEmailToBeConfirmedToOtherAccountWithoutModifyAccountPermission()
+      throws Exception {
+    TestAccount user = accountCreator.create();
+    setApiUser(user);
+
+    exception.expect(AuthException.class);
+    exception.expectMessage("modify account not permitted");
+    gApi.accounts().id(admin.id.get()).addEmail(newEmailInput("foo@example.com", false));
+  }
+
+  @Test
+  @GerritConfig(
+      name = "auth.registerEmailPrivateKey",
+      value = "HsOc6l+2lhS9G7sE/RsnS7Z6GJjdRDX14co=")
+  public void addEmailToBeConfirmedToOtherAccount() throws Exception {
+    TestAccount user = accountCreator.create();
+    String email = "me@example.com";
+    gApi.accounts().id(user.id.get()).addEmail(newEmailInput(email, false));
+  }
+
+  @Test
+  public void deleteEmail() throws Exception {
+    String email = "foo.bar@example.com";
+    EmailInput input = newEmailInput(email);
+    gApi.accounts().self().addEmail(input);
+
+    resetCurrentApiUser();
+    assertThat(getEmails()).contains(email);
+
+    accountIndexedCounter.clear();
+    gApi.accounts().self().deleteEmail(input.email);
+    accountIndexedCounter.assertReindexOf(admin);
+
+    resetCurrentApiUser();
+    assertThat(getEmails()).doesNotContain(email);
+  }
+
+  @Test
+  public void deleteEmailFromCustomExternalIdSchemes() throws Exception {
+    String email = "foo.bar@example.com";
+    String extId1 = "foo:bar";
+    String extId2 = "foo:baz";
+    accountsUpdateProvider
+        .get()
+        .update(
+            "Add External IDs",
+            admin.id,
+            u ->
+                u.addExternalId(
+                        ExternalId.createWithEmail(ExternalId.Key.parse(extId1), admin.id, email))
+                    .addExternalId(
+                        ExternalId.createWithEmail(ExternalId.Key.parse(extId2), admin.id, email)));
+    accountIndexedCounter.assertReindexOf(admin);
+    assertThat(
+            gApi.accounts().self().getExternalIds().stream().map(e -> e.identity).collect(toSet()))
+        .containsAllOf(extId1, extId2);
+
+    resetCurrentApiUser();
+    assertThat(getEmails()).contains(email);
+
+    gApi.accounts().self().deleteEmail(email);
+    accountIndexedCounter.assertReindexOf(admin);
+
+    resetCurrentApiUser();
+    assertThat(getEmails()).doesNotContain(email);
+    assertThat(
+            gApi.accounts().self().getExternalIds().stream().map(e -> e.identity).collect(toSet()))
+        .containsNoneOf(extId1, extId2);
+  }
+
+  @Test
+  public void deleteEmailOfOtherUser() throws Exception {
+    String email = "foo.bar@example.com";
+    EmailInput input = new EmailInput();
+    input.email = email;
+    input.noConfirmation = true;
+    gApi.accounts().id(user.id.get()).addEmail(input);
+    accountIndexedCounter.assertReindexOf(user);
+
+    setApiUser(user);
+    assertThat(getEmails()).contains(email);
+
+    // admin can delete email of user
+    setApiUser(admin);
+    gApi.accounts().id(user.id.get()).deleteEmail(email);
+    accountIndexedCounter.assertReindexOf(user);
+
+    setApiUser(user);
+    assertThat(getEmails()).doesNotContain(email);
+
+    // user cannot delete email of admin
+    exception.expect(AuthException.class);
+    exception.expectMessage("modify account not permitted");
+    gApi.accounts().id(admin.id.get()).deleteEmail(admin.email);
+  }
+
+  @Test
+  public void lookUpByEmail() throws Exception {
+    // exact match with scheme "mailto:"
+    assertEmail(emails.getAccountFor(admin.email), admin);
+
+    // exact match with other scheme
+    String email = "foo.bar@example.com";
+    accountsUpdateProvider
+        .get()
+        .update(
+            "Add Email",
+            admin.id,
+            u ->
+                u.addExternalId(
+                    ExternalId.createWithEmail(ExternalId.Key.parse("foo:bar"), admin.id, email)));
+    assertEmail(emails.getAccountFor(email), admin);
+
+    // wrong case doesn't match
+    assertThat(emails.getAccountFor(admin.email.toUpperCase(Locale.US))).isEmpty();
+
+    // prefix doesn't match
+    assertThat(emails.getAccountFor(admin.email.substring(0, admin.email.indexOf('@')))).isEmpty();
+
+    // non-existing doesn't match
+    assertThat(emails.getAccountFor("non-existing@example.com")).isEmpty();
+
+    // lookup several accounts by email at once
+    ImmutableSetMultimap<String, Account.Id> byEmails =
+        emails.getAccountsFor(admin.email, user.email);
+    assertEmail(byEmails.get(admin.email), admin);
+    assertEmail(byEmails.get(user.email), user);
+  }
+
+  @Test
+  public void lookUpByPreferredEmail() throws Exception {
+    // create an inconsistent account that has a preferred email without external ID
+    String prefix = "foo.preferred";
+    String prefEmail = prefix + "@example.com";
+    TestAccount foo = accountCreator.create(name("foo"));
+    accountsUpdateProvider
+        .get()
+        .update("Set Preferred Email", foo.id, u -> u.setPreferredEmail(prefEmail));
+
+    // verify that the account is still found when using the preferred email to lookup the account
+    ImmutableSet<Account.Id> accountsByPrefEmail = emails.getAccountFor(prefEmail);
+    assertThat(accountsByPrefEmail).hasSize(1);
+    assertThat(Iterables.getOnlyElement(accountsByPrefEmail)).isEqualTo(foo.id);
+
+    // look up by email prefix doesn't find the account
+    accountsByPrefEmail = emails.getAccountFor(prefix);
+    assertThat(accountsByPrefEmail).isEmpty();
+
+    // look up by other case doesn't find the account
+    accountsByPrefEmail = emails.getAccountFor(prefEmail.toUpperCase(Locale.US));
+    assertThat(accountsByPrefEmail).isEmpty();
+  }
+
+  @Test
+  public void putStatus() throws Exception {
+    List<String> statuses = ImmutableList.of("OOO", "Busy");
+    AccountInfo info;
+    for (String status : statuses) {
+      gApi.accounts().self().setStatus(status);
+      info = gApi.accounts().self().get();
+      assertUser(info, admin, status);
+      accountIndexedCounter.assertReindexOf(admin);
+    }
+
+    gApi.accounts().self().setStatus(null);
+    info = gApi.accounts().self().get();
+    assertUser(info, admin);
+    accountIndexedCounter.assertReindexOf(admin);
+  }
+
+  @Test
+  public void setName() throws Exception {
+    gApi.accounts().self().setName("Admin McAdminface");
+    assertThat(gApi.accounts().self().get().name).isEqualTo("Admin McAdminface");
+  }
+
+  @Test
+  public void adminCanSetNameOfOtherUser() throws Exception {
+    gApi.accounts().id(user.username).setName("User McUserface");
+    assertThat(gApi.accounts().id(user.username).get().name).isEqualTo("User McUserface");
+  }
+
+  @Test
+  public void userCannotSetNameOfOtherUser() throws Exception {
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    gApi.accounts().id(admin.username).setName("Admin McAdminface");
+  }
+
+  @Test
+  @Sandboxed
+  public void userCanSetNameOfOtherUserWithModifyAccountPermission() throws Exception {
+    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.MODIFY_ACCOUNT);
+    gApi.accounts().id(admin.username).setName("Admin McAdminface");
+    assertThat(gApi.accounts().id(admin.username).get().name).isEqualTo("Admin McAdminface");
+  }
+
+  @Test
+  public void fetchUserBranch() throws Exception {
+    setApiUser(user);
+
+    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers, user);
+    String userRefName = RefNames.refsUsers(user.id);
+
+    // remove default READ permissions
+    try (ProjectConfigUpdate u = updateProject(allUsers)) {
+      u.getConfig()
+          .getAccessSection(RefNames.REFS_USERS + "${" + RefPattern.USERID_SHARDED + "}", true)
+          .remove(new Permission(Permission.READ));
+      u.save();
+    }
+
+    // deny READ permission that is inherited from All-Projects
+    deny(allUsers, RefNames.REFS + "*", Permission.READ, ANONYMOUS_USERS);
+
+    // fetching user branch without READ permission fails
+    try {
+      fetch(allUsersRepo, userRefName + ":userRef");
+      fail("user branch is visible although no READ permission is granted");
+    } catch (TransportException e) {
+      // expected because no READ granted on user branch
+    }
+
+    // allow each user to read its own user branch
+    grant(
+        allUsers,
+        RefNames.REFS_USERS + "${" + RefPattern.USERID_SHARDED + "}",
+        Permission.READ,
+        false,
+        REGISTERED_USERS);
+
+    // fetch user branch using refs/users/YY/XXXXXXX
+    fetch(allUsersRepo, userRefName + ":userRef");
+    Ref userRef = allUsersRepo.getRepository().exactRef("userRef");
+    assertThat(userRef).isNotNull();
+
+    // fetch user branch using refs/users/self
+    fetch(allUsersRepo, RefNames.REFS_USERS_SELF + ":userSelfRef");
+    Ref userSelfRef = allUsersRepo.getRepository().getRefDatabase().exactRef("userSelfRef");
+    assertThat(userSelfRef).isNotNull();
+    assertThat(userSelfRef.getObjectId()).isEqualTo(userRef.getObjectId());
+
+    accountIndexedCounter.assertNoReindex();
+
+    // fetching user branch of another user fails
+    String otherUserRefName = RefNames.refsUsers(admin.id);
+    exception.expect(TransportException.class);
+    exception.expectMessage("Remote does not have " + otherUserRefName + " available for fetch.");
+    fetch(allUsersRepo, otherUserRefName + ":otherUserRef");
+  }
+
+  @Test
+  public void pushToUserBranch() throws Exception {
+    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
+    fetch(allUsersRepo, RefNames.refsUsers(admin.id) + ":userRef");
+    allUsersRepo.reset("userRef");
+    PushOneCommit push = pushFactory.create(db, admin.getIdent(), allUsersRepo);
+    push.to(RefNames.refsUsers(admin.id)).assertOkStatus();
+    accountIndexedCounter.assertReindexOf(admin);
+
+    push = pushFactory.create(db, admin.getIdent(), allUsersRepo);
+    push.to(RefNames.REFS_USERS_SELF).assertOkStatus();
+    accountIndexedCounter.assertReindexOf(admin);
+  }
+
+  @Test
+  public void pushToUserBranchForReview() throws Exception {
+    String userRefName = RefNames.refsUsers(admin.id);
+    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
+    fetch(allUsersRepo, userRefName + ":userRef");
+    allUsersRepo.reset("userRef");
+    PushOneCommit push = pushFactory.create(db, admin.getIdent(), allUsersRepo);
+    PushOneCommit.Result r = push.to(MagicBranch.NEW_CHANGE + userRefName);
+    r.assertOkStatus();
+    accountIndexedCounter.assertNoReindex();
+    assertThat(r.getChange().change().getDest().get()).isEqualTo(userRefName);
+    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve());
+    gApi.changes().id(r.getChangeId()).current().submit();
+    accountIndexedCounter.assertReindexOf(admin);
+
+    push = pushFactory.create(db, admin.getIdent(), allUsersRepo);
+    r = push.to(MagicBranch.NEW_CHANGE + RefNames.REFS_USERS_SELF);
+    r.assertOkStatus();
+    accountIndexedCounter.assertNoReindex();
+    assertThat(r.getChange().change().getDest().get()).isEqualTo(userRefName);
+    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve());
+    gApi.changes().id(r.getChangeId()).current().submit();
+    accountIndexedCounter.assertReindexOf(admin);
+  }
+
+  @Test
+  public void pushAccountConfigToUserBranchForReviewAndSubmit() throws Exception {
+    String userRef = RefNames.refsUsers(admin.id);
+    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
+    fetch(allUsersRepo, userRef + ":userRef");
+    allUsersRepo.reset("userRef");
+
+    Config ac = getAccountConfig(allUsersRepo);
+    ac.setString(AccountProperties.ACCOUNT, null, AccountProperties.KEY_STATUS, "out-of-office");
+
+    PushOneCommit.Result r =
+        pushFactory
+            .create(
+                db,
+                admin.getIdent(),
+                allUsersRepo,
+                "Update account config",
+                AccountProperties.ACCOUNT_CONFIG,
+                ac.toText())
+            .to(MagicBranch.NEW_CHANGE + userRef);
+    r.assertOkStatus();
+    accountIndexedCounter.assertNoReindex();
+    assertThat(r.getChange().change().getDest().get()).isEqualTo(userRef);
+
+    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve());
+    gApi.changes().id(r.getChangeId()).current().submit();
+    accountIndexedCounter.assertReindexOf(admin);
+
+    AccountInfo info = gApi.accounts().self().get();
+    assertThat(info.email).isEqualTo(admin.email);
+    assertThat(info.name).isEqualTo(admin.fullName);
+    assertThat(info.status).isEqualTo("out-of-office");
+  }
+
+  @Test
+  public void pushAccountConfigWithPrefEmailThatDoesNotExistAsExtIdToUserBranchForReviewAndSubmit()
+      throws Exception {
+    TestAccount foo = accountCreator.create(name("foo"), name("foo") + "@example.com", "Foo");
+    String userRef = RefNames.refsUsers(foo.id);
+    accountIndexedCounter.clear();
+
+    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers, foo);
+    fetch(allUsersRepo, userRef + ":userRef");
+    allUsersRepo.reset("userRef");
+
+    String email = "some.email@example.com";
+    Config ac = getAccountConfig(allUsersRepo);
+    ac.setString(AccountProperties.ACCOUNT, null, AccountProperties.KEY_PREFERRED_EMAIL, email);
+
+    PushOneCommit.Result r =
+        pushFactory
+            .create(
+                db,
+                foo.getIdent(),
+                allUsersRepo,
+                "Update account config",
+                AccountProperties.ACCOUNT_CONFIG,
+                ac.toText())
+            .to(MagicBranch.NEW_CHANGE + userRef);
+    r.assertOkStatus();
+    accountIndexedCounter.assertNoReindex();
+    assertThat(r.getChange().change().getDest().get()).isEqualTo(userRef);
+
+    setApiUser(foo);
+    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve());
+    gApi.changes().id(r.getChangeId()).current().submit();
+
+    accountIndexedCounter.assertReindexOf(foo);
+
+    AccountInfo info = gApi.accounts().self().get();
+    assertThat(info.email).isEqualTo(email);
+    assertThat(info.name).isEqualTo(foo.fullName);
+  }
+
+  @Test
+  public void pushAccountConfigToUserBranchForReviewIsRejectedOnSubmitIfConfigIsInvalid()
+      throws Exception {
+    String userRef = RefNames.refsUsers(admin.id);
+    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
+    fetch(allUsersRepo, userRef + ":userRef");
+    allUsersRepo.reset("userRef");
+
+    PushOneCommit.Result r =
+        pushFactory
+            .create(
+                db,
+                admin.getIdent(),
+                allUsersRepo,
+                "Update account config",
+                AccountProperties.ACCOUNT_CONFIG,
+                "invalid config")
+            .to(MagicBranch.NEW_CHANGE + userRef);
+    r.assertOkStatus();
+    accountIndexedCounter.assertNoReindex();
+    assertThat(r.getChange().change().getDest().get()).isEqualTo(userRef);
+
+    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve());
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage(
+        String.format(
+            "invalid account configuration: commit '%s' has an invalid '%s' file for account '%s':"
+                + " Invalid config file %s in commit %s",
+            r.getCommit().name(),
+            AccountProperties.ACCOUNT_CONFIG,
+            admin.id,
+            AccountProperties.ACCOUNT_CONFIG,
+            r.getCommit().name()));
+    gApi.changes().id(r.getChangeId()).current().submit();
+  }
+
+  @Test
+  public void pushAccountConfigToUserBranchForReviewIsRejectedOnSubmitIfPreferredEmailIsInvalid()
+      throws Exception {
+    String userRef = RefNames.refsUsers(admin.id);
+    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
+    fetch(allUsersRepo, userRef + ":userRef");
+    allUsersRepo.reset("userRef");
+
+    String noEmail = "no.email";
+    Config ac = getAccountConfig(allUsersRepo);
+    ac.setString(AccountProperties.ACCOUNT, null, AccountProperties.KEY_PREFERRED_EMAIL, noEmail);
+
+    PushOneCommit.Result r =
+        pushFactory
+            .create(
+                db,
+                admin.getIdent(),
+                allUsersRepo,
+                "Update account config",
+                AccountProperties.ACCOUNT_CONFIG,
+                ac.toText())
+            .to(MagicBranch.NEW_CHANGE + userRef);
+    r.assertOkStatus();
+    accountIndexedCounter.assertNoReindex();
+    assertThat(r.getChange().change().getDest().get()).isEqualTo(userRef);
+
+    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve());
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage(
+        String.format(
+            "invalid account configuration: invalid preferred email '%s' for account '%s'",
+            noEmail, admin.id));
+    gApi.changes().id(r.getChangeId()).current().submit();
+  }
+
+  @Test
+  public void pushAccountConfigToUserBranchForReviewIsRejectedOnSubmitIfOwnAccountIsDeactivated()
+      throws Exception {
+    String userRef = RefNames.refsUsers(admin.id);
+    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
+    fetch(allUsersRepo, userRef + ":userRef");
+    allUsersRepo.reset("userRef");
+
+    Config ac = getAccountConfig(allUsersRepo);
+    ac.setBoolean(AccountProperties.ACCOUNT, null, AccountProperties.KEY_ACTIVE, false);
+
+    PushOneCommit.Result r =
+        pushFactory
+            .create(
+                db,
+                admin.getIdent(),
+                allUsersRepo,
+                "Update account config",
+                AccountProperties.ACCOUNT_CONFIG,
+                ac.toText())
+            .to(MagicBranch.NEW_CHANGE + userRef);
+    r.assertOkStatus();
+    accountIndexedCounter.assertNoReindex();
+    assertThat(r.getChange().change().getDest().get()).isEqualTo(userRef);
+
+    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve());
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("invalid account configuration: cannot deactivate own account");
+    gApi.changes().id(r.getChangeId()).current().submit();
+  }
+
+  @Test
+  public void pushAccountConfigToUserBranchForReviewDeactivateOtherAccount() throws Exception {
+    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
+
+    TestAccount foo = accountCreator.create(name("foo"));
+    assertThat(gApi.accounts().id(foo.id.get()).getActive()).isTrue();
+    String userRef = RefNames.refsUsers(foo.id);
+    accountIndexedCounter.clear();
+
+    grant(allUsers, userRef, Permission.PUSH, false, adminGroupUuid());
+    grantLabel("Code-Review", -2, 2, allUsers, userRef, false, adminGroupUuid(), false);
+    grant(allUsers, userRef, Permission.SUBMIT, false, adminGroupUuid());
+
+    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
+    fetch(allUsersRepo, userRef + ":userRef");
+    allUsersRepo.reset("userRef");
+
+    Config ac = getAccountConfig(allUsersRepo);
+    ac.setBoolean(AccountProperties.ACCOUNT, null, AccountProperties.KEY_ACTIVE, false);
+
+    PushOneCommit.Result r =
+        pushFactory
+            .create(
+                db,
+                admin.getIdent(),
+                allUsersRepo,
+                "Update account config",
+                AccountProperties.ACCOUNT_CONFIG,
+                ac.toText())
+            .to(MagicBranch.NEW_CHANGE + userRef);
+    r.assertOkStatus();
+    accountIndexedCounter.assertNoReindex();
+    assertThat(r.getChange().change().getDest().get()).isEqualTo(userRef);
+
+    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve());
+    gApi.changes().id(r.getChangeId()).current().submit();
+    accountIndexedCounter.assertReindexOf(foo);
+
+    assertThat(gApi.accounts().id(foo.id.get()).getActive()).isFalse();
+  }
+
+  @Test
+  public void pushWatchConfigToUserBranch() throws Exception {
+    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
+    fetch(allUsersRepo, RefNames.refsUsers(admin.id) + ":userRef");
+    allUsersRepo.reset("userRef");
+
+    Config wc = new Config();
+    wc.setString(
+        ProjectWatches.PROJECT,
+        project.get(),
+        ProjectWatches.KEY_NOTIFY,
+        ProjectWatches.NotifyValue.create(null, EnumSet.of(NotifyType.ALL_COMMENTS)).toString());
+    PushOneCommit push =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            allUsersRepo,
+            "Add project watch",
+            ProjectWatches.WATCH_CONFIG,
+            wc.toText());
+    push.to(RefNames.REFS_USERS_SELF).assertOkStatus();
+    accountIndexedCounter.assertReindexOf(admin);
+
+    String invalidNotifyValue = "]invalid[";
+    wc.setString(
+        ProjectWatches.PROJECT, project.get(), ProjectWatches.KEY_NOTIFY, invalidNotifyValue);
+    push =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            allUsersRepo,
+            "Add invalid project watch",
+            ProjectWatches.WATCH_CONFIG,
+            wc.toText());
+    PushOneCommit.Result r = push.to(RefNames.REFS_USERS_SELF);
+    r.assertErrorStatus("invalid account configuration");
+    r.assertMessage(
+        String.format(
+            "%s: Invalid project watch of account %d for project %s: %s",
+            ProjectWatches.WATCH_CONFIG, admin.getId().get(), project.get(), invalidNotifyValue));
+  }
+
+  @Test
+  public void pushAccountConfigToUserBranch() throws Exception {
+    TestAccount oooUser = accountCreator.create("away", "away@mail.invalid", "Ambrose Way");
+    setApiUser(oooUser);
+
+    // Must clone as oooUser to ensure the push is allowed.
+    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers, oooUser);
+    fetch(allUsersRepo, RefNames.refsUsers(oooUser.id) + ":userRef");
+    allUsersRepo.reset("userRef");
+
+    Config ac = getAccountConfig(allUsersRepo);
+    ac.setString(AccountProperties.ACCOUNT, null, AccountProperties.KEY_STATUS, "out-of-office");
+
+    accountIndexedCounter.clear();
+    pushFactory
+        .create(
+            db,
+            oooUser.getIdent(),
+            allUsersRepo,
+            "Update account config",
+            AccountProperties.ACCOUNT_CONFIG,
+            ac.toText())
+        .to(RefNames.refsUsers(oooUser.id))
+        .assertOkStatus();
+
+    accountIndexedCounter.assertReindexOf(oooUser);
+
+    AccountInfo info = gApi.accounts().self().get();
+    assertThat(info.email).isEqualTo(oooUser.email);
+    assertThat(info.name).isEqualTo(oooUser.fullName);
+    assertThat(info.status).isEqualTo("out-of-office");
+  }
+
+  @Test
+  public void pushAccountConfigToUserBranchIsRejectedIfConfigIsInvalid() throws Exception {
+    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
+    fetch(allUsersRepo, RefNames.refsUsers(admin.id) + ":userRef");
+    allUsersRepo.reset("userRef");
+
+    PushOneCommit.Result r =
+        pushFactory
+            .create(
+                db,
+                admin.getIdent(),
+                allUsersRepo,
+                "Update account config",
+                AccountProperties.ACCOUNT_CONFIG,
+                "invalid config")
+            .to(RefNames.REFS_USERS_SELF);
+    r.assertErrorStatus("invalid account configuration");
+    r.assertMessage(
+        String.format(
+            "commit '%s' has an invalid '%s' file for account '%s':"
+                + " Invalid config file %s in commit %s",
+            r.getCommit().name(),
+            AccountProperties.ACCOUNT_CONFIG,
+            admin.id,
+            AccountProperties.ACCOUNT_CONFIG,
+            r.getCommit().name()));
+    accountIndexedCounter.assertNoReindex();
+  }
+
+  @Test
+  public void pushAccountConfigToUserBranchIsRejectedIfPreferredEmailIsInvalid() throws Exception {
+    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
+    fetch(allUsersRepo, RefNames.refsUsers(admin.id) + ":userRef");
+    allUsersRepo.reset("userRef");
+
+    String noEmail = "no.email";
+    Config ac = getAccountConfig(allUsersRepo);
+    ac.setString(AccountProperties.ACCOUNT, null, AccountProperties.KEY_PREFERRED_EMAIL, noEmail);
+
+    PushOneCommit.Result r =
+        pushFactory
+            .create(
+                db,
+                admin.getIdent(),
+                allUsersRepo,
+                "Update account config",
+                AccountProperties.ACCOUNT_CONFIG,
+                ac.toText())
+            .to(RefNames.REFS_USERS_SELF);
+    r.assertErrorStatus("invalid account configuration");
+    r.assertMessage(
+        String.format("invalid preferred email '%s' for account '%s'", noEmail, admin.id));
+    accountIndexedCounter.assertNoReindex();
+  }
+
+  @Test
+  public void pushAccountConfigToUserBranchInvalidPreferredEmailButNotChanged() throws Exception {
+    TestAccount foo = accountCreator.create(name("foo"), name("foo") + "@example.com", "Foo");
+    String userRef = RefNames.refsUsers(foo.id);
+
+    String noEmail = "no.email";
+    accountsUpdateProvider
+        .get()
+        .update("Set Preferred Email", foo.id, u -> u.setPreferredEmail(noEmail));
+    accountIndexedCounter.clear();
+
+    grant(allUsers, userRef, Permission.PUSH, false, REGISTERED_USERS);
+    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers, foo);
+    fetch(allUsersRepo, userRef + ":userRef");
+    allUsersRepo.reset("userRef");
+
+    String status = "in vacation";
+    Config ac = getAccountConfig(allUsersRepo);
+    ac.setString(AccountProperties.ACCOUNT, null, AccountProperties.KEY_STATUS, status);
+
+    pushFactory
+        .create(
+            db,
+            foo.getIdent(),
+            allUsersRepo,
+            "Update account config",
+            AccountProperties.ACCOUNT_CONFIG,
+            ac.toText())
+        .to(userRef)
+        .assertOkStatus();
+    accountIndexedCounter.assertReindexOf(foo);
+
+    AccountInfo info = gApi.accounts().id(foo.id.get()).get();
+    assertThat(info.email).isEqualTo(noEmail);
+    assertThat(info.name).isEqualTo(foo.fullName);
+    assertThat(info.status).isEqualTo(status);
+  }
+
+  @Test
+  public void pushAccountConfigToUserBranchIfPreferredEmailDoesNotExistAsExtId() throws Exception {
+    TestAccount foo = accountCreator.create(name("foo"), name("foo") + "@example.com", "Foo");
+    String userRef = RefNames.refsUsers(foo.id);
+    accountIndexedCounter.clear();
+
+    grant(allUsers, userRef, Permission.PUSH, false, adminGroupUuid());
+
+    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers, foo);
+    fetch(allUsersRepo, userRef + ":userRef");
+    allUsersRepo.reset("userRef");
+
+    String email = "some.email@example.com";
+    Config ac = getAccountConfig(allUsersRepo);
+    ac.setString(AccountProperties.ACCOUNT, null, AccountProperties.KEY_PREFERRED_EMAIL, email);
+
+    pushFactory
+        .create(
+            db,
+            foo.getIdent(),
+            allUsersRepo,
+            "Update account config",
+            AccountProperties.ACCOUNT_CONFIG,
+            ac.toText())
+        .to(userRef)
+        .assertOkStatus();
+    accountIndexedCounter.assertReindexOf(foo);
+
+    AccountInfo info = gApi.accounts().id(foo.id.get()).get();
+    assertThat(info.email).isEqualTo(email);
+    assertThat(info.name).isEqualTo(foo.fullName);
+  }
+
+  @Test
+  public void pushAccountConfigToUserBranchIsRejectedIfOwnAccountIsDeactivated() throws Exception {
+    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
+    fetch(allUsersRepo, RefNames.refsUsers(admin.id) + ":userRef");
+    allUsersRepo.reset("userRef");
+
+    Config ac = getAccountConfig(allUsersRepo);
+    ac.setBoolean(AccountProperties.ACCOUNT, null, AccountProperties.KEY_ACTIVE, false);
+
+    PushOneCommit.Result r =
+        pushFactory
+            .create(
+                db,
+                admin.getIdent(),
+                allUsersRepo,
+                "Update account config",
+                AccountProperties.ACCOUNT_CONFIG,
+                ac.toText())
+            .to(RefNames.REFS_USERS_SELF);
+    r.assertErrorStatus("invalid account configuration");
+    r.assertMessage("cannot deactivate own account");
+    accountIndexedCounter.assertNoReindex();
+  }
+
+  @Test
+  public void pushAccountConfigToUserBranchDeactivateOtherAccount() throws Exception {
+    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
+
+    TestAccount foo = accountCreator.create(name("foo"));
+    assertThat(gApi.accounts().id(foo.id.get()).getActive()).isTrue();
+    String userRef = RefNames.refsUsers(foo.id);
+    accountIndexedCounter.clear();
+
+    grant(allUsers, userRef, Permission.PUSH, false, adminGroupUuid());
+
+    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
+    fetch(allUsersRepo, userRef + ":userRef");
+    allUsersRepo.reset("userRef");
+
+    Config ac = getAccountConfig(allUsersRepo);
+    ac.setBoolean(AccountProperties.ACCOUNT, null, AccountProperties.KEY_ACTIVE, false);
+
+    pushFactory
+        .create(
+            db,
+            admin.getIdent(),
+            allUsersRepo,
+            "Update account config",
+            AccountProperties.ACCOUNT_CONFIG,
+            ac.toText())
+        .to(userRef)
+        .assertOkStatus();
+    accountIndexedCounter.assertReindexOf(foo);
+
+    assertThat(gApi.accounts().id(foo.id.get()).getActive()).isFalse();
+  }
+
+  @Test
+  public void cannotCreateUserBranch() throws Exception {
+    grant(allUsers, RefNames.REFS_USERS + "*", Permission.CREATE);
+    grant(allUsers, RefNames.REFS_USERS + "*", Permission.PUSH);
+
+    String userRef = RefNames.refsUsers(new Account.Id(seq.nextAccountId()));
+    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
+    PushOneCommit.Result r = pushFactory.create(db, admin.getIdent(), allUsersRepo).to(userRef);
+    r.assertErrorStatus();
+    assertThat(r.getMessage()).contains("Not allowed to create user branch.");
+
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      assertThat(repo.exactRef(userRef)).isNull();
+    }
+  }
+
+  @Test
+  public void createUserBranchWithAccessDatabaseCapability() throws Exception {
+    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
+    grant(allUsers, RefNames.REFS_USERS + "*", Permission.CREATE);
+    grant(allUsers, RefNames.REFS_USERS + "*", Permission.PUSH);
+
+    String userRef = RefNames.refsUsers(new Account.Id(seq.nextAccountId()));
+    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
+    pushFactory.create(db, admin.getIdent(), allUsersRepo).to(userRef).assertOkStatus();
+
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      assertThat(repo.exactRef(userRef)).isNotNull();
+    }
+  }
+
+  @Test
+  public void cannotCreateNonUserBranchUnderRefsUsersWithAccessDatabaseCapability()
+      throws Exception {
+    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
+    grant(allUsers, RefNames.REFS_USERS + "*", Permission.CREATE);
+    grant(allUsers, RefNames.REFS_USERS + "*", Permission.PUSH);
+
+    String userRef = RefNames.REFS_USERS + "foo";
+    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
+    PushOneCommit.Result r = pushFactory.create(db, admin.getIdent(), allUsersRepo).to(userRef);
+    r.assertErrorStatus();
+    assertThat(r.getMessage()).contains("Not allowed to create non-user branch under refs/users/.");
+
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      assertThat(repo.exactRef(userRef)).isNull();
+    }
+  }
+
+  @Test
+  public void createDefaultUserBranch() throws Exception {
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      assertThat(repo.exactRef(RefNames.REFS_USERS_DEFAULT)).isNull();
+    }
+
+    grant(allUsers, RefNames.REFS_USERS_DEFAULT, Permission.CREATE);
+    grant(allUsers, RefNames.REFS_USERS_DEFAULT, Permission.PUSH);
+
+    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
+    pushFactory
+        .create(db, admin.getIdent(), allUsersRepo)
+        .to(RefNames.REFS_USERS_DEFAULT)
+        .assertOkStatus();
+
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      assertThat(repo.exactRef(RefNames.REFS_USERS_DEFAULT)).isNotNull();
+    }
+  }
+
+  @Test
+  public void cannotDeleteUserBranch() throws Exception {
+    grant(
+        allUsers,
+        RefNames.REFS_USERS + "${" + RefPattern.USERID_SHARDED + "}",
+        Permission.DELETE,
+        true,
+        REGISTERED_USERS);
+
+    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
+    String userRef = RefNames.refsUsers(admin.id);
+    PushResult r = deleteRef(allUsersRepo, userRef);
+    RemoteRefUpdate refUpdate = r.getRemoteUpdate(userRef);
+    assertThat(refUpdate.getStatus()).isEqualTo(RemoteRefUpdate.Status.REJECTED_OTHER_REASON);
+    assertThat(refUpdate.getMessage()).contains("Not allowed to delete user branch.");
+
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      assertThat(repo.exactRef(userRef)).isNotNull();
+    }
+  }
+
+  @Test
+  public void deleteUserBranchWithAccessDatabaseCapability() throws Exception {
+    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
+    grant(
+        allUsers,
+        RefNames.REFS_USERS + "${" + RefPattern.USERID_SHARDED + "}",
+        Permission.DELETE,
+        true,
+        REGISTERED_USERS);
+
+    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
+    String userRef = RefNames.refsUsers(admin.id);
+    PushResult r = deleteRef(allUsersRepo, userRef);
+    RemoteRefUpdate refUpdate = r.getRemoteUpdate(userRef);
+    assertThat(refUpdate.getStatus()).isEqualTo(RemoteRefUpdate.Status.OK);
+
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      assertThat(repo.exactRef(userRef)).isNull();
+    }
+
+    assertThat(accountCache.get(admin.id)).isEmpty();
+    assertThat(accountQueryProvider.get().byDefault(admin.id.toString())).isEmpty();
+  }
+
+  @Test
+  public void addGpgKey() throws Exception {
+    TestKey key = validKeyWithoutExpiration();
+    String id = key.getKeyIdString();
+    addExternalIdEmail(admin, "test1@example.com");
+
+    assertKeyMapContains(key, addGpgKey(key.getPublicKeyArmored()));
+    assertKeys(key);
+
+    setApiUser(user);
+    exception.expect(ResourceNotFoundException.class);
+    exception.expectMessage(id);
+    gApi.accounts().self().gpgKey(id).get();
+  }
+
+  @Test
+  public void reAddExistingGpgKey() throws Exception {
+    addExternalIdEmail(admin, "test5@example.com");
+    TestKey key = validKeyWithSecondUserId();
+    String id = key.getKeyIdString();
+    PGPPublicKey pk = key.getPublicKey();
+
+    GpgKeyInfo info = addGpgKey(armor(pk)).get(id);
+    assertThat(info.userIds).hasSize(2);
+    assertIteratorSize(2, getOnlyKeyFromStore(key).getUserIDs());
+
+    pk = PGPPublicKey.removeCertification(pk, "foo:myId");
+    info = addGpgKeyNoReindex(armor(pk)).get(id);
+    assertThat(info.userIds).hasSize(1);
+    assertIteratorSize(1, getOnlyKeyFromStore(key).getUserIDs());
+  }
+
+  @Test
+  public void addOtherUsersGpgKey_Conflict() throws Exception {
+    // Both users have a matching external ID for this key.
+    addExternalIdEmail(admin, "test5@example.com");
+    accountsUpdateProvider
+        .get()
+        .update(
+            "Add External ID",
+            user.getId(),
+            u -> u.addExternalId(ExternalId.create("foo", "myId", user.getId())));
+    accountIndexedCounter.assertReindexOf(user);
+
+    TestKey key = validKeyWithSecondUserId();
+    addGpgKey(key.getPublicKeyArmored());
+    setApiUser(user);
+
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("GPG key already associated with another account");
+    addGpgKey(key.getPublicKeyArmored());
+  }
+
+  @Test
+  public void listGpgKeys() throws Exception {
+    List<TestKey> keys = allValidKeys();
+    List<String> toAdd = new ArrayList<>(keys.size());
+    for (TestKey key : keys) {
+      addExternalIdEmail(admin, PushCertificateIdent.parse(key.getFirstUserId()).getEmailAddress());
+      toAdd.add(key.getPublicKeyArmored());
+    }
+    gApi.accounts().self().putGpgKeys(toAdd, ImmutableList.<String>of());
+    assertKeys(keys);
+    accountIndexedCounter.assertReindexOf(admin);
+  }
+
+  @Test
+  public void deleteGpgKey() throws Exception {
+    TestKey key = validKeyWithoutExpiration();
+    String id = key.getKeyIdString();
+    addExternalIdEmail(admin, "test1@example.com");
+    addGpgKey(key.getPublicKeyArmored());
+    assertKeys(key);
+
+    gApi.accounts().self().gpgKey(id).delete();
+    accountIndexedCounter.assertReindexOf(admin);
+    assertKeys();
+
+    exception.expect(ResourceNotFoundException.class);
+    exception.expectMessage(id);
+    gApi.accounts().self().gpgKey(id).get();
+  }
+
+  @Test
+  public void addAndRemoveGpgKeys() throws Exception {
+    for (TestKey key : allValidKeys()) {
+      addExternalIdEmail(admin, PushCertificateIdent.parse(key.getFirstUserId()).getEmailAddress());
+    }
+    TestKey key1 = validKeyWithoutExpiration();
+    TestKey key2 = validKeyWithExpiration();
+    TestKey key5 = validKeyWithSecondUserId();
+
+    Map<String, GpgKeyInfo> infos =
+        gApi.accounts()
+            .self()
+            .putGpgKeys(
+                ImmutableList.of(key1.getPublicKeyArmored(), key2.getPublicKeyArmored()),
+                ImmutableList.of(key5.getKeyIdString()));
+    assertThat(infos.keySet()).containsExactly(key1.getKeyIdString(), key2.getKeyIdString());
+    assertKeys(key1, key2);
+    accountIndexedCounter.assertReindexOf(admin);
+
+    infos =
+        gApi.accounts()
+            .self()
+            .putGpgKeys(
+                ImmutableList.of(key5.getPublicKeyArmored()),
+                ImmutableList.of(key1.getKeyIdString()));
+    assertThat(infos.keySet()).containsExactly(key1.getKeyIdString(), key5.getKeyIdString());
+    assertKeyMapContains(key5, infos);
+    assertThat(infos.get(key1.getKeyIdString()).key).isNull();
+    assertKeys(key2, key5);
+    accountIndexedCounter.assertReindexOf(admin);
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("Cannot both add and delete key: " + keyToString(key2.getPublicKey()));
+    gApi.accounts()
+        .self()
+        .putGpgKeys(
+            ImmutableList.of(key2.getPublicKeyArmored()), ImmutableList.of(key2.getKeyIdString()));
+  }
+
+  @Test
+  public void addMalformedGpgKey() throws Exception {
+    String key = "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\ntest\n-----END PGP PUBLIC KEY BLOCK-----";
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("Failed to parse GPG keys");
+    addGpgKey(key);
+  }
+
+  @Test
+  @UseSsh
+  public void sshKeys() throws Exception {
+    // The test account should initially have exactly one ssh key
+    List<SshKeyInfo> info = gApi.accounts().self().listSshKeys();
+    assertThat(info).hasSize(1);
+    assertSequenceNumbers(info);
+    SshKeyInfo key = info.get(0);
+    KeyPair keyPair = sshKeys.getKeyPair(admin);
+    String inital = TestSshKeys.publicKey(keyPair, admin.email);
+    assertThat(key.sshPublicKey).isEqualTo(inital);
+    accountIndexedCounter.assertNoReindex();
+
+    // Add a new key
+    String newKey = TestSshKeys.publicKey(TestSshKeys.genSshKey(), admin.email);
+    gApi.accounts().self().addSshKey(newKey);
+    info = gApi.accounts().self().listSshKeys();
+    assertThat(info).hasSize(2);
+    assertSequenceNumbers(info);
+    accountIndexedCounter.assertReindexOf(admin);
+
+    // Add an existing key (the request succeeds, but the key isn't added again)
+    gApi.accounts().self().addSshKey(inital);
+    info = gApi.accounts().self().listSshKeys();
+    assertThat(info).hasSize(2);
+    assertSequenceNumbers(info);
+    accountIndexedCounter.assertNoReindex();
+
+    // Add another new key
+    String newKey2 = TestSshKeys.publicKey(TestSshKeys.genSshKey(), admin.email);
+    gApi.accounts().self().addSshKey(newKey2);
+    info = gApi.accounts().self().listSshKeys();
+    assertThat(info).hasSize(3);
+    assertSequenceNumbers(info);
+    accountIndexedCounter.assertReindexOf(admin);
+
+    // Delete second key
+    gApi.accounts().self().deleteSshKey(2);
+    info = gApi.accounts().self().listSshKeys();
+    assertThat(info).hasSize(2);
+    assertThat(info.get(0).seq).isEqualTo(1);
+    assertThat(info.get(1).seq).isEqualTo(3);
+    accountIndexedCounter.assertReindexOf(admin);
+
+    // Mark first key as invalid
+    assertThat(info.get(0).valid).isTrue();
+    authorizedKeys.markKeyInvalid(admin.id, 1);
+    info = gApi.accounts().self().listSshKeys();
+    assertThat(info).hasSize(2);
+    assertThat(info.get(0).seq).isEqualTo(1);
+    assertThat(info.get(0).valid).isFalse();
+    assertThat(info.get(1).seq).isEqualTo(3);
+    accountIndexedCounter.assertReindexOf(admin);
+  }
+
+  // reindex is tested by {@link AbstractQueryAccountsTest#reindex}
+  @Test
+  public void reindexPermissions() throws Exception {
+    // admin can reindex any account
+    setApiUser(admin);
+    gApi.accounts().id(user.username).index();
+    accountIndexedCounter.assertReindexOf(user);
+
+    // user can reindex own account
+    setApiUser(user);
+    gApi.accounts().self().index();
+    accountIndexedCounter.assertReindexOf(user);
+
+    // user cannot reindex any account
+    exception.expect(AuthException.class);
+    exception.expectMessage("modify account not permitted");
+    gApi.accounts().id(admin.username).index();
+  }
+
+  @Test
+  public void checkConsistency() throws Exception {
+    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
+    resetCurrentApiUser();
+
+    // Create an account with a preferred email.
+    String username = name("foo");
+    String email = username + "@example.com";
+    TestAccount account = accountCreator.create(username, email, "Foo Bar");
+
+    ConsistencyCheckInput input = new ConsistencyCheckInput();
+    input.checkAccounts = new CheckAccountsInput();
+    ConsistencyCheckInfo checkInfo = gApi.config().server().checkConsistency(input);
+    assertThat(checkInfo.checkAccountsResult.problems).isEmpty();
+
+    Set<ConsistencyProblemInfo> expectedProblems = new HashSet<>();
+
+    // Delete the external ID for the preferred email. This makes the account inconsistent since it
+    // now doesn't have an external ID for its preferred email.
+    accountsUpdateProvider
+        .get()
+        .update(
+            "Delete External ID",
+            account.getId(),
+            u -> u.deleteExternalId(ExternalId.createEmail(account.getId(), email)));
+    expectedProblems.add(
+        new ConsistencyProblemInfo(
+            ConsistencyProblemInfo.Status.ERROR,
+            "Account '"
+                + account.getId().get()
+                + "' has no external ID for its preferred email '"
+                + email
+                + "'"));
+
+    checkInfo = gApi.config().server().checkConsistency(input);
+    assertThat(checkInfo.checkAccountsResult.problems).hasSize(expectedProblems.size());
+    assertThat(checkInfo.checkAccountsResult.problems).containsExactlyElementsIn(expectedProblems);
+  }
+
+  @Test
+  public void internalQueryFindActiveAndInactiveAccounts() throws Exception {
+    String name = name("foo");
+    assertThat(accountQueryProvider.get().byDefault(name)).isEmpty();
+
+    TestAccount foo1 = accountCreator.create(name + "-1");
+    assertThat(gApi.accounts().id(foo1.username).getActive()).isTrue();
+
+    TestAccount foo2 = accountCreator.create(name + "-2");
+    gApi.accounts().id(foo2.username).setActive(false);
+    assertThat(gApi.accounts().id(foo2.username).getActive()).isFalse();
+
+    assertThat(accountQueryProvider.get().byDefault(name)).hasSize(2);
+  }
+
+  @Test
+  public void checkMetaId() throws Exception {
+    // metaId is set when account is loaded
+    assertThat(accounts.get(admin.getId()).get().getAccount().getMetaId())
+        .isEqualTo(getMetaId(admin.getId()));
+
+    // metaId is set when account is created
+    AccountsUpdate au = accountsUpdateProvider.get();
+    Account.Id accountId = new Account.Id(seq.nextAccountId());
+    AccountState accountState = au.insert("Create Test Account", accountId, u -> {});
+    assertThat(accountState.getAccount().getMetaId()).isEqualTo(getMetaId(accountId));
+
+    // metaId is set when account is updated
+    Optional<AccountState> updatedAccountState =
+        au.update("Set Full Name", accountId, u -> u.setFullName("foo"));
+    assertThat(updatedAccountState).isPresent();
+    Account updatedAccount = updatedAccountState.get().getAccount();
+    assertThat(accountState.getAccount().getMetaId()).isNotEqualTo(updatedAccount.getMetaId());
+    assertThat(updatedAccount.getMetaId()).isEqualTo(getMetaId(accountId));
+  }
+
+  private EmailInput newEmailInput(String email, boolean noConfirmation) {
+    EmailInput input = new EmailInput();
+    input.email = email;
+    input.noConfirmation = noConfirmation;
+    return input;
+  }
+
+  private EmailInput newEmailInput(String email) {
+    return newEmailInput(email, true);
+  }
+
+  private String getMetaId(Account.Id accountId) throws IOException {
+    try (Repository repo = repoManager.openRepository(allUsers);
+        RevWalk rw = new RevWalk(repo);
+        ObjectReader or = repo.newObjectReader()) {
+      Ref ref = repo.exactRef(RefNames.refsUsers(accountId));
+      return ref != null ? ref.getObjectId().name() : null;
+    }
+  }
+
+  @Test
+  public void allGroupsForAnAdminAccountCanBeRetrieved() throws Exception {
+    List<GroupInfo> groups = gApi.accounts().id(admin.username).getGroups();
+    assertThat(groups)
+        .comparingElementsUsing(getGroupToNameCorrespondence())
+        .containsExactly("Anonymous Users", "Registered Users", "Administrators");
+  }
+
+  @Test
+  public void createUserWithValidUsername() throws Exception {
+    ImmutableList<String> names =
+        ImmutableList.of(
+            "user@domain",
+            "user-name",
+            "user_name",
+            "1234",
+            "user1234",
+            "1234@domain",
+            "user!+alias{*}#$%&’^=~|@domain");
+    for (String name : names) {
+      gApi.accounts().create(name);
+    }
+  }
+
+  @Test
+  public void createUserWithInvalidUsername() throws Exception {
+    ImmutableList<String> invalidNames =
+        ImmutableList.of(
+            "@", "@foo", "-", "-foo", "_", "_foo", "!", "+", "{", "}", "*", "%", "#", "$", "&", "’",
+            "^", "=", "~");
+    for (String name : invalidNames) {
+      try {
+        gApi.accounts().create(name);
+        fail(String.format("Expected BadRequestException for username [%s]", name));
+      } catch (BadRequestException e) {
+        assertThat(e).hasMessageThat().isEqualTo(String.format("Invalid username '%s'", name));
+      }
+    }
+  }
+
+  @Test
+  public void allGroupsForAUserAccountCanBeRetrieved() throws Exception {
+    String username = name("user1");
+    accountOperations.newAccount().username(username).create();
+    String group = createGroup("group");
+    gApi.groups().id(group).addMembers(username);
+
+    List<GroupInfo> allGroups = gApi.accounts().id(username).getGroups();
+    assertThat(allGroups)
+        .comparingElementsUsing(getGroupToNameCorrespondence())
+        .containsExactly("Anonymous Users", "Registered Users", group);
+  }
+
+  @Test
+  public void defaultPermissionsOnUserBranches() throws Exception {
+    String userRef = RefNames.REFS_USERS + "${" + RefPattern.USERID_SHARDED + "}";
+    assertPermissions(
+        allUsers,
+        groupRef(REGISTERED_USERS),
+        userRef,
+        true,
+        Permission.READ,
+        Permission.PUSH,
+        Permission.SUBMIT);
+
+    assertLabelPermission(
+        allUsers, groupRef(REGISTERED_USERS), userRef, true, "Code-Review", -2, 2);
+
+    assertPermissions(
+        allUsers,
+        adminGroupRef(),
+        RefNames.REFS_USERS_DEFAULT,
+        true,
+        Permission.READ,
+        Permission.PUSH,
+        Permission.CREATE);
+  }
+
+  @Test
+  public void retryOnLockFailure() throws Exception {
+    String status = "happy";
+    String fullName = "Foo";
+    AtomicBoolean doneBgUpdate = new AtomicBoolean(false);
+    PersonIdent ident = serverIdent.get();
+    AccountsUpdate update =
+        new AccountsUpdate(
+            repoManager,
+            gitReferenceUpdated,
+            null,
+            allUsers,
+            externalIds,
+            metaDataUpdateInternalFactory,
+            new RetryHelper(
+                cfg,
+                retryMetrics,
+                null,
+                null,
+                null,
+                r -> r.withBlockStrategy(noSleepBlockStrategy)),
+            extIdNotesFactory,
+            ident,
+            ident,
+            () -> {
+              if (!doneBgUpdate.getAndSet(true)) {
+                try {
+                  accountsUpdateProvider
+                      .get()
+                      .update("Set Status", admin.id, u -> u.setStatus(status));
+                } catch (IOException | ConfigInvalidException | OrmException e) {
+                  // Ignore, the successful update of the account is asserted later
+                }
+              }
+            },
+            Runnables.doNothing());
+    assertThat(doneBgUpdate.get()).isFalse();
+    AccountInfo accountInfo = gApi.accounts().id(admin.id.get()).get();
+    assertThat(accountInfo.status).isNull();
+    assertThat(accountInfo.name).isNotEqualTo(fullName);
+
+    Optional<AccountState> updatedAccountState =
+        update.update("Set Full Name", admin.id, u -> u.setFullName(fullName));
+    assertThat(doneBgUpdate.get()).isTrue();
+
+    assertThat(updatedAccountState).isPresent();
+    Account updatedAccount = updatedAccountState.get().getAccount();
+    assertThat(updatedAccount.getStatus()).isEqualTo(status);
+    assertThat(updatedAccount.getFullName()).isEqualTo(fullName);
+
+    accountInfo = gApi.accounts().id(admin.id.get()).get();
+    assertThat(accountInfo.status).isEqualTo(status);
+    assertThat(accountInfo.name).isEqualTo(fullName);
+  }
+
+  @Test
+  public void failAfterRetryerGivesUp() throws Exception {
+    List<String> status = ImmutableList.of("foo", "bar", "baz");
+    String fullName = "Foo";
+    AtomicInteger bgCounter = new AtomicInteger(0);
+    PersonIdent ident = serverIdent.get();
+    AccountsUpdate update =
+        new AccountsUpdate(
+            repoManager,
+            gitReferenceUpdated,
+            null,
+            allUsers,
+            externalIds,
+            metaDataUpdateInternalFactory,
+            new RetryHelper(
+                cfg,
+                retryMetrics,
+                null,
+                null,
+                null,
+                r ->
+                    r.withStopStrategy(StopStrategies.stopAfterAttempt(status.size()))
+                        .withBlockStrategy(noSleepBlockStrategy)),
+            extIdNotesFactory,
+            ident,
+            ident,
+            () -> {
+              try {
+                accountsUpdateProvider
+                    .get()
+                    .update(
+                        "Set Status",
+                        admin.id,
+                        u -> u.setStatus(status.get(bgCounter.getAndAdd(1))));
+              } catch (IOException | ConfigInvalidException | OrmException e) {
+                // Ignore, the expected exception is asserted later
+              }
+            },
+            Runnables.doNothing());
+    assertThat(bgCounter.get()).isEqualTo(0);
+    AccountInfo accountInfo = gApi.accounts().id(admin.id.get()).get();
+    assertThat(accountInfo.status).isNull();
+    assertThat(accountInfo.name).isNotEqualTo(fullName);
+
+    try {
+      update.update("Set Full Name", admin.id, u -> u.setFullName(fullName));
+      fail("expected LockFailureException");
+    } catch (LockFailureException e) {
+      // Ignore, expected
+    }
+    assertThat(bgCounter.get()).isEqualTo(status.size());
+
+    Account updatedAccount = accounts.get(admin.id).get().getAccount();
+    assertThat(updatedAccount.getStatus()).isEqualTo(Iterables.getLast(status));
+    assertThat(updatedAccount.getFullName()).isEqualTo(admin.fullName);
+
+    accountInfo = gApi.accounts().id(admin.id.get()).get();
+    assertThat(accountInfo.status).isEqualTo(Iterables.getLast(status));
+    assertThat(accountInfo.name).isEqualTo(admin.fullName);
+  }
+
+  @Test
+  public void atomicReadMofifyWrite() throws Exception {
+    gApi.accounts().id(admin.id.get()).setStatus("A-1");
+
+    AtomicInteger bgCounterA1 = new AtomicInteger(0);
+    AtomicInteger bgCounterA2 = new AtomicInteger(0);
+    PersonIdent ident = serverIdent.get();
+    AccountsUpdate update =
+        new AccountsUpdate(
+            repoManager,
+            gitReferenceUpdated,
+            null,
+            allUsers,
+            externalIds,
+            metaDataUpdateInternalFactory,
+            new RetryHelper(
+                cfg,
+                retryMetrics,
+                null,
+                null,
+                null,
+                r -> r.withBlockStrategy(noSleepBlockStrategy)),
+            extIdNotesFactory,
+            ident,
+            ident,
+            Runnables.doNothing(),
+            () -> {
+              try {
+                accountsUpdateProvider
+                    .get()
+                    .update("Set Status", admin.id, u -> u.setStatus("A-2"));
+              } catch (IOException | ConfigInvalidException | OrmException e) {
+                // Ignore, the expected exception is asserted later
+              }
+            });
+    assertThat(bgCounterA1.get()).isEqualTo(0);
+    assertThat(bgCounterA2.get()).isEqualTo(0);
+    assertThat(gApi.accounts().id(admin.id.get()).get().status).isEqualTo("A-1");
+
+    Optional<AccountState> updatedAccountState =
+        update.update(
+            "Set Status",
+            admin.id,
+            (a, u) -> {
+              if ("A-1".equals(a.getAccount().getStatus())) {
+                bgCounterA1.getAndIncrement();
+                u.setStatus("B-1");
+              }
+
+              if ("A-2".equals(a.getAccount().getStatus())) {
+                bgCounterA2.getAndIncrement();
+                u.setStatus("B-2");
+              }
+            });
+
+    assertThat(bgCounterA1.get()).isEqualTo(1);
+    assertThat(bgCounterA2.get()).isEqualTo(1);
+
+    assertThat(updatedAccountState).isPresent();
+    assertThat(updatedAccountState.get().getAccount().getStatus()).isEqualTo("B-2");
+    assertThat(accounts.get(admin.id).get().getAccount().getStatus()).isEqualTo("B-2");
+    assertThat(gApi.accounts().id(admin.id.get()).get().status).isEqualTo("B-2");
+  }
+
+  @Test
+  public void atomicReadMofifyWriteExternalIds() throws Exception {
+    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
+
+    Account.Id accountId = new Account.Id(seq.nextAccountId());
+    ExternalId extIdA1 = ExternalId.create("foo", "A-1", accountId);
+    accountsUpdateProvider
+        .get()
+        .insert("Create Test Account", accountId, u -> u.addExternalId(extIdA1));
+
+    AtomicInteger bgCounterA1 = new AtomicInteger(0);
+    AtomicInteger bgCounterA2 = new AtomicInteger(0);
+    PersonIdent ident = serverIdent.get();
+    ExternalId extIdA2 = ExternalId.create("foo", "A-2", accountId);
+    AccountsUpdate update =
+        new AccountsUpdate(
+            repoManager,
+            gitReferenceUpdated,
+            null,
+            allUsers,
+            externalIds,
+            metaDataUpdateInternalFactory,
+            new RetryHelper(
+                cfg,
+                retryMetrics,
+                null,
+                null,
+                null,
+                r -> r.withBlockStrategy(noSleepBlockStrategy)),
+            extIdNotesFactory,
+            ident,
+            ident,
+            Runnables.doNothing(),
+            () -> {
+              try {
+                accountsUpdateProvider
+                    .get()
+                    .update(
+                        "Update External ID",
+                        accountId,
+                        u -> u.replaceExternalId(extIdA1, extIdA2));
+              } catch (IOException | ConfigInvalidException | OrmException e) {
+                // Ignore, the expected exception is asserted later
+              }
+            });
+    assertThat(bgCounterA1.get()).isEqualTo(0);
+    assertThat(bgCounterA2.get()).isEqualTo(0);
+    assertThat(
+            gApi.accounts().id(accountId.get()).getExternalIds().stream()
+                .map(i -> i.identity)
+                .collect(toSet()))
+        .containsExactly(extIdA1.key().get());
+
+    ExternalId extIdB1 = ExternalId.create("foo", "B-1", accountId);
+    ExternalId extIdB2 = ExternalId.create("foo", "B-2", accountId);
+    Optional<AccountState> updatedAccount =
+        update.update(
+            "Update External ID",
+            accountId,
+            (a, u) -> {
+              if (a.getExternalIds().contains(extIdA1)) {
+                bgCounterA1.getAndIncrement();
+                u.replaceExternalId(extIdA1, extIdB1);
+              }
+
+              if (a.getExternalIds().contains(extIdA2)) {
+                bgCounterA2.getAndIncrement();
+                u.replaceExternalId(extIdA2, extIdB2);
+              }
+            });
+
+    assertThat(bgCounterA1.get()).isEqualTo(1);
+    assertThat(bgCounterA2.get()).isEqualTo(1);
+
+    assertThat(updatedAccount).isPresent();
+    assertThat(updatedAccount.get().getExternalIds()).containsExactly(extIdB2);
+    assertThat(accounts.get(accountId).get().getExternalIds()).containsExactly(extIdB2);
+    assertThat(
+            gApi.accounts().id(accountId.get()).getExternalIds().stream()
+                .map(i -> i.identity)
+                .collect(toSet()))
+        .containsExactly(extIdB2.key().get());
+  }
+
+  @Test
+  public void stalenessChecker() throws Exception {
+    // Newly created account is not stale.
+    AccountInfo accountInfo = gApi.accounts().create(name("foo")).get();
+    Account.Id accountId = new Account.Id(accountInfo._accountId);
+    assertThat(stalenessChecker.isStale(accountId)).isFalse();
+
+    // Manually updating the user ref makes the index document stale.
+    String userRef = RefNames.refsUsers(accountId);
+    try (Repository repo = repoManager.openRepository(allUsers);
+        ObjectInserter oi = repo.newObjectInserter();
+        RevWalk rw = new RevWalk(repo)) {
+      RevCommit commit = rw.parseCommit(repo.exactRef(userRef).getObjectId());
+
+      PersonIdent ident = new PersonIdent(serverIdent.get(), TimeUtil.nowTs());
+      CommitBuilder cb = new CommitBuilder();
+      cb.setTreeId(commit.getTree());
+      cb.setCommitter(ident);
+      cb.setAuthor(ident);
+      cb.setMessage(commit.getFullMessage());
+      ObjectId emptyCommit = oi.insert(cb);
+      oi.flush();
+
+      RefUpdate updateRef = repo.updateRef(userRef);
+      updateRef.setExpectedOldObjectId(commit.toObjectId());
+      updateRef.setNewObjectId(emptyCommit);
+      assertThat(updateRef.forceUpdate()).isEqualTo(RefUpdate.Result.FORCED);
+    }
+    assertStaleAccountAndReindex(accountId);
+
+    // Manually inserting/updating/deleting an external ID of the user makes the index document
+    // stale.
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      ExternalIdNotes extIdNotes = ExternalIdNotes.loadNoCacheUpdate(allUsers, repo);
+
+      ExternalId.Key key = ExternalId.Key.create("foo", "foo");
+      extIdNotes.insert(ExternalId.create(key, accountId));
+      try (MetaDataUpdate update = metaDataUpdateFactory.create(allUsers)) {
+        extIdNotes.commit(update);
+      }
+      assertStaleAccountAndReindex(accountId);
+
+      extIdNotes.upsert(ExternalId.createWithEmail(key, accountId, "foo@example.com"));
+      try (MetaDataUpdate update = metaDataUpdateFactory.create(allUsers)) {
+        extIdNotes.commit(update);
+      }
+      assertStaleAccountAndReindex(accountId);
+
+      extIdNotes.delete(accountId, key);
+      try (MetaDataUpdate update = metaDataUpdateFactory.create(allUsers)) {
+        extIdNotes.commit(update);
+      }
+      assertStaleAccountAndReindex(accountId);
+    }
+
+    // Manually delete account
+    try (Repository repo = repoManager.openRepository(allUsers);
+        RevWalk rw = new RevWalk(repo)) {
+      RevCommit commit = rw.parseCommit(repo.exactRef(userRef).getObjectId());
+      RefUpdate updateRef = repo.updateRef(userRef);
+      updateRef.setExpectedOldObjectId(commit.toObjectId());
+      updateRef.setNewObjectId(ObjectId.zeroId());
+      updateRef.setForceUpdate(true);
+      assertThat(updateRef.delete()).isEqualTo(RefUpdate.Result.FORCED);
+    }
+    assertStaleAccountAndReindex(accountId);
+  }
+
+  private void assertStaleAccountAndReindex(Account.Id accountId) throws IOException {
+    // Evict account from cache to be sure that we use the index state for staleness checks. This
+    // has to happen directly on the accounts cache because AccountCacheImpl triggers a reindex for
+    // the account.
+    accountsCache.invalidate(accountId);
+    assertThat(stalenessChecker.isStale(accountId)).isTrue();
+
+    // Reindex fixes staleness
+    accountIndexer.index(accountId);
+    assertThat(stalenessChecker.isStale(accountId)).isFalse();
+  }
+
+  @Test
+  public void deleteAllDraftComments() throws Exception {
+    try {
+      TestTimeUtil.resetWithClockStep(1, SECONDS);
+      Project.NameKey project2 = createProject("project2");
+      PushOneCommit.Result r1 = createChange();
+
+      TestRepository<?> tr2 = cloneProject(project2);
+      PushOneCommit.Result r2 =
+          createChange(
+              tr2,
+              "refs/heads/master",
+              "Change in project2",
+              PushOneCommit.FILE_NAME,
+              "content2",
+              null);
+
+      // Create 2 drafts each on both changes for user.
+      setApiUser(user);
+      createDraft(r1, PushOneCommit.FILE_NAME, "draft 1a");
+      createDraft(r1, PushOneCommit.FILE_NAME, "draft 1b");
+      createDraft(r2, PushOneCommit.FILE_NAME, "draft 2a");
+      createDraft(r2, PushOneCommit.FILE_NAME, "draft 2b");
+      assertThat(gApi.changes().id(r1.getChangeId()).current().draftsAsList()).hasSize(2);
+      assertThat(gApi.changes().id(r2.getChangeId()).current().draftsAsList()).hasSize(2);
+
+      // Create 1 draft on first change for admin.
+      setApiUser(admin);
+      createDraft(r1, PushOneCommit.FILE_NAME, "admin draft");
+      assertThat(gApi.changes().id(r1.getChangeId()).current().draftsAsList()).hasSize(1);
+
+      // Delete user's draft comments; leave admin's alone.
+      setApiUser(user);
+      List<DeletedDraftCommentInfo> result =
+          gApi.accounts().self().deleteDraftComments(new DeleteDraftCommentsInput());
+
+      // Results are ordered according to the change search, most recently updated first.
+      assertThat(result).hasSize(2);
+      DeletedDraftCommentInfo del2 = result.get(0);
+      assertThat(del2.change.changeId).isEqualTo(r2.getChangeId());
+      assertThat(del2.deleted.stream().map(c -> c.message)).containsExactly("draft 2a", "draft 2b");
+      DeletedDraftCommentInfo del1 = result.get(1);
+      assertThat(del1.change.changeId).isEqualTo(r1.getChangeId());
+      assertThat(del1.deleted.stream().map(c -> c.message)).containsExactly("draft 1a", "draft 1b");
+
+      assertThat(gApi.changes().id(r1.getChangeId()).current().draftsAsList()).isEmpty();
+      assertThat(gApi.changes().id(r2.getChangeId()).current().draftsAsList()).isEmpty();
+
+      setApiUser(admin);
+      assertThat(gApi.changes().id(r1.getChangeId()).current().draftsAsList()).hasSize(1);
+    } finally {
+      cleanUpDrafts();
+    }
+  }
+
+  @Test
+  public void deleteDraftCommentsByQuery() throws Exception {
+    try {
+      PushOneCommit.Result r1 = createChange();
+      PushOneCommit.Result r2 = createChange();
+
+      createDraft(r1, PushOneCommit.FILE_NAME, "draft a");
+      createDraft(r2, PushOneCommit.FILE_NAME, "draft b");
+      assertThat(gApi.changes().id(r1.getChangeId()).current().draftsAsList()).hasSize(1);
+      assertThat(gApi.changes().id(r2.getChangeId()).current().draftsAsList()).hasSize(1);
+
+      List<DeletedDraftCommentInfo> result =
+          gApi.accounts()
+              .self()
+              .deleteDraftComments(new DeleteDraftCommentsInput("change:" + r1.getChangeId()));
+      assertThat(result).hasSize(1);
+      assertThat(result.get(0).change.changeId).isEqualTo(r1.getChangeId());
+      assertThat(result.get(0).deleted.stream().map(c -> c.message)).containsExactly("draft a");
+
+      assertThat(gApi.changes().id(r1.getChangeId()).current().draftsAsList()).isEmpty();
+      assertThat(gApi.changes().id(r2.getChangeId()).current().draftsAsList()).hasSize(1);
+    } finally {
+      cleanUpDrafts();
+    }
+  }
+
+  @Test
+  public void deleteOtherUsersDraftCommentsDisallowed() throws Exception {
+    try {
+      PushOneCommit.Result r = createChange();
+      setApiUser(user);
+      createDraft(r, PushOneCommit.FILE_NAME, "draft");
+      setApiUser(admin);
+      try {
+        gApi.accounts().id(user.id.get()).deleteDraftComments(new DeleteDraftCommentsInput());
+        assert_().fail("expected AuthException");
+      } catch (AuthException e) {
+        assertThat(e).hasMessageThat().isEqualTo("Cannot delete drafts of other user");
+      }
+    } finally {
+      cleanUpDrafts();
+    }
+  }
+
+  @Test
+  public void deleteDraftCommentsSkipsInvisibleChanges() throws Exception {
+    try {
+      createBranch(new Branch.NameKey(project, "secret"));
+      PushOneCommit.Result r1 = createChange();
+      PushOneCommit.Result r2 = createChange("refs/for/secret");
+
+      setApiUser(user);
+      createDraft(r1, PushOneCommit.FILE_NAME, "draft a");
+      createDraft(r2, PushOneCommit.FILE_NAME, "draft b");
+      assertThat(gApi.changes().id(r1.getChangeId()).current().draftsAsList()).hasSize(1);
+      assertThat(gApi.changes().id(r2.getChangeId()).current().draftsAsList()).hasSize(1);
+
+      block(project, "refs/heads/secret", Permission.READ, REGISTERED_USERS);
+      List<DeletedDraftCommentInfo> result =
+          gApi.accounts().self().deleteDraftComments(new DeleteDraftCommentsInput());
+      assertThat(result).hasSize(1);
+      assertThat(result.get(0).change.changeId).isEqualTo(r1.getChangeId());
+      assertThat(result.get(0).deleted.stream().map(c -> c.message)).containsExactly("draft a");
+
+      removePermission(project, "refs/heads/secret", Permission.READ);
+      assertThat(gApi.changes().id(r1.getChangeId()).current().draftsAsList()).isEmpty();
+      // Draft still exists since change wasn't visible when drafts where deleted.
+      assertThat(gApi.changes().id(r2.getChangeId()).current().draftsAsList()).hasSize(1);
+    } finally {
+      cleanUpDrafts();
+    }
+  }
+
+  private void createDraft(PushOneCommit.Result r, String path, String message) throws Exception {
+    DraftInput in = new DraftInput();
+    in.path = path;
+    in.line = 1;
+    in.message = message;
+    gApi.changes().id(r.getChangeId()).current().createDraft(in);
+  }
+
+  private void cleanUpDrafts() throws Exception {
+    for (TestAccount testAccount : accountCreator.getAll()) {
+      setApiUser(testAccount);
+      for (ChangeInfo changeInfo : gApi.changes().query("has:draft").get()) {
+        for (CommentInfo c :
+            gApi.changes().id(changeInfo.id).drafts().values().stream()
+                .flatMap(List::stream)
+                .collect(toImmutableList())) {
+          gApi.changes().id(changeInfo.id).revision(c.patchSet).draft(c.id).delete();
+        }
+      }
+    }
+  }
+
+  private static Correspondence<GroupInfo, String> getGroupToNameCorrespondence() {
+    return new Correspondence<GroupInfo, String>() {
+      @Override
+      public boolean compare(GroupInfo actualGroup, String expectedName) {
+        String groupName = actualGroup == null ? null : actualGroup.name;
+        return Objects.equals(groupName, expectedName);
+      }
+
+      @Override
+      public String toString() {
+        return "has name";
+      }
+    };
+  }
+
+  private void assertSequenceNumbers(List<SshKeyInfo> sshKeys) {
+    int seq = 1;
+    for (SshKeyInfo key : sshKeys) {
+      assertThat(key.seq).isEqualTo(seq++);
+    }
+  }
+
+  private PGPPublicKey getOnlyKeyFromStore(TestKey key) throws Exception {
+    try (PublicKeyStore store = publicKeyStoreProvider.get()) {
+      Iterable<PGPPublicKeyRing> keys = store.get(key.getKeyId());
+      assertThat(keys).hasSize(1);
+      return keys.iterator().next().getPublicKey();
+    }
+  }
+
+  private static String armor(PGPPublicKey key) throws Exception {
+    ByteArrayOutputStream out = new ByteArrayOutputStream(4096);
+    try (ArmoredOutputStream aout = new ArmoredOutputStream(out)) {
+      key.encode(aout);
+    }
+    return new String(out.toByteArray(), UTF_8);
+  }
+
+  private static void assertIteratorSize(int size, Iterator<?> it) {
+    List<?> lst = ImmutableList.copyOf(it);
+    assertThat(lst).hasSize(size);
+  }
+
+  private static void assertKeyMapContains(TestKey expected, Map<String, GpgKeyInfo> actualMap) {
+    GpgKeyInfo actual = actualMap.get(expected.getKeyIdString());
+    assertThat(actual).isNotNull();
+    assertThat(actual.id).isNull();
+    actual.id = expected.getKeyIdString();
+    assertKeyEquals(expected, actual);
+  }
+
+  private void assertKeys(TestKey... expectedKeys) throws Exception {
+    assertKeys(Arrays.asList(expectedKeys));
+  }
+
+  private void assertKeys(Iterable<TestKey> expectedKeys) throws Exception {
+    // Check via API.
+    FluentIterable<TestKey> expected = FluentIterable.from(expectedKeys);
+    Map<String, GpgKeyInfo> keyMap = gApi.accounts().self().listGpgKeys();
+    assertThat(keyMap.keySet())
+        .named("keys returned by listGpgKeys()")
+        .containsExactlyElementsIn(expected.transform(TestKey::getKeyIdString));
+
+    for (TestKey key : expected) {
+      assertKeyEquals(key, gApi.accounts().self().gpgKey(key.getKeyIdString()).get());
+      assertKeyEquals(
+          key,
+          gApi.accounts()
+              .self()
+              .gpgKey(Fingerprint.toString(key.getPublicKey().getFingerprint()))
+              .get());
+      assertKeyMapContains(key, keyMap);
+    }
+
+    // Check raw external IDs.
+    Account.Id currAccountId = atrScope.get().getUser().getAccountId();
+    Iterable<String> expectedFps =
+        expected.transform(k -> BaseEncoding.base16().encode(k.getPublicKey().getFingerprint()));
+    Iterable<String> actualFps =
+        externalIds.byAccount(currAccountId, SCHEME_GPGKEY).stream()
+            .map(e -> e.key().id())
+            .collect(toSet());
+    assertThat(actualFps).named("external IDs in database").containsExactlyElementsIn(expectedFps);
+
+    // Check raw stored keys.
+    for (TestKey key : expected) {
+      getOnlyKeyFromStore(key);
+    }
+  }
+
+  private static void assertKeyEquals(TestKey expected, GpgKeyInfo actual) {
+    String id = expected.getKeyIdString();
+    assertThat(actual.id).named(id).isEqualTo(id);
+    assertThat(actual.fingerprint)
+        .named(id)
+        .isEqualTo(Fingerprint.toString(expected.getPublicKey().getFingerprint()));
+    List<String> userIds = ImmutableList.copyOf(expected.getPublicKey().getUserIDs());
+    assertThat(actual.userIds).named(id).containsExactlyElementsIn(userIds);
+    String key = actual.key;
+    assertThat(key).named(id).startsWith("-----BEGIN PGP PUBLIC KEY BLOCK-----\n");
+    assertThat(key).named(id).endsWith("-----END PGP PUBLIC KEY BLOCK-----\n");
+    assertThat(actual.status).isEqualTo(GpgKeyInfo.Status.TRUSTED);
+    assertThat(actual.problems).isEmpty();
+  }
+
+  private void addExternalIdEmail(TestAccount account, String email) throws Exception {
+    requireNonNull(email);
+    accountsUpdateProvider
+        .get()
+        .update(
+            "Add Email",
+            account.getId(),
+            u ->
+                u.addExternalId(
+                    ExternalId.createWithEmail(name("test"), email, account.getId(), email)));
+    accountIndexedCounter.assertReindexOf(account);
+    setApiUser(account);
+  }
+
+  private Map<String, GpgKeyInfo> addGpgKey(String armored) throws Exception {
+    Map<String, GpgKeyInfo> gpgKeys =
+        gApi.accounts().self().putGpgKeys(ImmutableList.of(armored), ImmutableList.<String>of());
+    accountIndexedCounter.assertReindexOf(gApi.accounts().self().get());
+    return gpgKeys;
+  }
+
+  private Map<String, GpgKeyInfo> addGpgKeyNoReindex(String armored) throws Exception {
+    return gApi.accounts().self().putGpgKeys(ImmutableList.of(armored), ImmutableList.<String>of());
+  }
+
+  private void assertUser(AccountInfo info, TestAccount account) throws Exception {
+    assertUser(info, account, null);
+  }
+
+  private void assertUser(AccountInfo info, TestAccount account, @Nullable String expectedStatus)
+      throws Exception {
+    assertThat(info.name).isEqualTo(account.fullName);
+    assertThat(info.email).isEqualTo(account.email);
+    assertThat(info.username).isEqualTo(account.username);
+    assertThat(info.status).isEqualTo(expectedStatus);
+  }
+
+  private Set<String> getEmails() throws RestApiException {
+    return gApi.accounts().self().getEmails().stream().map(e -> e.email).collect(toSet());
+  }
+
+  private void assertEmail(Set<Account.Id> accounts, TestAccount expectedAccount) {
+    assertThat(accounts).hasSize(1);
+    assertThat(Iterables.getOnlyElement(accounts)).isEqualTo(expectedAccount.getId());
+  }
+
+  private Config getAccountConfig(TestRepository<?> allUsersRepo) throws Exception {
+    Config ac = new Config();
+    try (TreeWalk tw =
+        TreeWalk.forPath(
+            allUsersRepo.getRepository(),
+            AccountProperties.ACCOUNT_CONFIG,
+            getHead(allUsersRepo.getRepository()).getTree())) {
+      assertThat(tw).isNotNull();
+      ac.fromText(
+          new String(
+              allUsersRepo
+                  .getRevWalk()
+                  .getObjectReader()
+                  .open(tw.getObjectId(0), OBJ_BLOB)
+                  .getBytes(),
+              UTF_8));
+    }
+    return ac;
+  }
+
+  /** Checks if an account is indexed the correct number of times. */
+  private static class AccountIndexedCounter implements AccountIndexedListener {
+    private final AtomicLongMap<Integer> countsByAccount = AtomicLongMap.create();
+
+    @Override
+    public void onAccountIndexed(int id) {
+      countsByAccount.incrementAndGet(id);
+    }
+
+    void clear() {
+      countsByAccount.clear();
+    }
+
+    long getCount(Account.Id accountId) {
+      return countsByAccount.get(accountId.get());
+    }
+
+    void assertReindexOf(TestAccount testAccount) {
+      assertReindexOf(testAccount, 1);
+    }
+
+    void assertReindexOf(AccountInfo accountInfo) {
+      assertReindexOf(new Account.Id(accountInfo._accountId), 1);
+    }
+
+    void assertReindexOf(TestAccount testAccount, int expectedCount) {
+      assertThat(getCount(testAccount.id)).isEqualTo(expectedCount);
+      assertThat(countsByAccount).hasSize(1);
+      clear();
+    }
+
+    void assertReindexOf(Account.Id accountId, int expectedCount) {
+      assertThat(getCount(accountId)).isEqualTo(expectedCount);
+      countsByAccount.remove(accountId.get());
+    }
+
+    void assertNoReindex() {
+      assertThat(countsByAccount).isEmpty();
+    }
+  }
+
+  private static class RefUpdateCounter implements GitReferenceUpdatedListener {
+    private final AtomicLongMap<String> countsByProjectRefs = AtomicLongMap.create();
+
+    static String projectRef(Project.NameKey project, String ref) {
+      return projectRef(project.get(), ref);
+    }
+
+    static String projectRef(String project, String ref) {
+      return project + ":" + ref;
+    }
+
+    @Override
+    public void onGitReferenceUpdated(Event event) {
+      countsByProjectRefs.incrementAndGet(projectRef(event.getProjectName(), event.getRefName()));
+    }
+
+    void clear() {
+      countsByProjectRefs.clear();
+    }
+
+    long getCount(String projectRef) {
+      return countsByProjectRefs.get(projectRef);
+    }
+
+    void assertRefUpdateFor(String... projectRefs) {
+      Map<String, Integer> expectedRefUpdateCounts = new HashMap<>();
+      for (String projectRef : projectRefs) {
+        expectedRefUpdateCounts.put(projectRef, 1);
+      }
+      assertRefUpdateFor(expectedRefUpdateCounts);
+    }
+
+    void assertRefUpdateFor(Map<String, Integer> expectedProjectRefUpdateCounts) {
+      for (Map.Entry<String, Integer> e : expectedProjectRefUpdateCounts.entrySet()) {
+        assertThat(getCount(e.getKey())).isEqualTo(e.getValue());
+      }
+      assertThat(countsByProjectRefs).hasSize(expectedProjectRefUpdateCounts.size());
+      clear();
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/api/accounts/AccountIndexerIT.java b/javatests/com/google/gerrit/acceptance/api/accounts/AccountIndexerIT.java
new file mode 100644
index 0000000..60a61d1
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/accounts/AccountIndexerIT.java
@@ -0,0 +1,170 @@
+// 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.
+
+package com.google.gerrit.acceptance.api.accounts;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import com.google.gerrit.extensions.api.GerritApi;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountConfig;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.account.InternalAccountUpdate;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.index.account.AccountIndexer;
+import com.google.gerrit.server.query.account.InternalAccountQuery;
+import com.google.gerrit.testing.InMemoryTestEnvironment;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.List;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class AccountIndexerIT {
+  @Rule public InMemoryTestEnvironment testEnvironment = new InMemoryTestEnvironment();
+
+  @Inject private AccountIndexer accountIndexer;
+  @Inject private GerritApi gApi;
+  @Inject private AccountCache accountCache;
+  @Inject private Provider<InternalAccountQuery> accountQueryProvider;
+  @Inject private GitRepositoryManager repoManager;
+  @Inject private AllUsersName allUsersName;
+  @Inject @GerritPersonIdent protected Provider<PersonIdent> serverIdent;
+
+  @Test
+  public void indexingUpdatesTheIndex() throws Exception {
+    Account.Id accountId = createAccount("foo");
+    String preferredEmail = "foo@example.com";
+    updateAccountWithoutCacheOrIndex(
+        accountId, newAccountUpdate().setPreferredEmail(preferredEmail).build());
+    assertThat(accountQueryProvider.get().byPreferredEmail(preferredEmail)).isEmpty();
+
+    accountIndexer.index(accountId);
+    List<AccountState> matchedAccountStates =
+        accountQueryProvider.get().byPreferredEmail(preferredEmail);
+    assertThat(matchedAccountStates).hasSize(1);
+    assertThat(matchedAccountStates.get(0).getAccount().getId()).isEqualTo(accountId);
+  }
+
+  @Test
+  public void indexCannotBeCorruptedByStaleCache() throws Exception {
+    Account.Id accountId = createAccount("foo");
+    loadAccountToCache(accountId);
+    String preferredEmail = "foo@example.com";
+    updateAccountWithoutCacheOrIndex(
+        accountId, newAccountUpdate().setPreferredEmail(preferredEmail).build());
+    assertThat(accountQueryProvider.get().byPreferredEmail(preferredEmail)).isEmpty();
+
+    accountIndexer.index(accountId);
+    List<AccountState> matchedAccountStates =
+        accountQueryProvider.get().byPreferredEmail(preferredEmail);
+    assertThat(matchedAccountStates).hasSize(1);
+    assertThat(matchedAccountStates.get(0).getAccount().getId()).isEqualTo(accountId);
+  }
+
+  @Test
+  public void indexingUpdatesStaleCache() throws Exception {
+    Account.Id accountId = createAccount("foo");
+    loadAccountToCache(accountId);
+    String status = "ooo";
+    updateAccountWithoutCacheOrIndex(accountId, newAccountUpdate().setStatus(status).build());
+    assertThat(accountCache.get(accountId).get().getAccount().getStatus()).isNull();
+
+    accountIndexer.index(accountId);
+    assertThat(accountCache.get(accountId).get().getAccount().getStatus()).isEqualTo(status);
+  }
+
+  @Test
+  public void reindexingStaleAccountUpdatesTheIndex() throws Exception {
+    Account.Id accountId = createAccount("foo");
+    String preferredEmail = "foo@example.com";
+    updateAccountWithoutCacheOrIndex(
+        accountId, newAccountUpdate().setPreferredEmail(preferredEmail).build());
+    assertThat(accountQueryProvider.get().byPreferredEmail(preferredEmail)).isEmpty();
+
+    accountIndexer.reindexIfStale(accountId);
+    List<AccountState> matchedAccountStates =
+        accountQueryProvider.get().byPreferredEmail(preferredEmail);
+    assertThat(matchedAccountStates).hasSize(1);
+    assertThat(matchedAccountStates.get(0).getAccount().getId()).isEqualTo(accountId);
+  }
+
+  @Test
+  public void notStaleAccountIsNotReindexed() throws Exception {
+    Account.Id accountId = createAccount("foo");
+    updateAccountWithoutCacheOrIndex(
+        accountId, newAccountUpdate().setPreferredEmail("foo@example.com").build());
+    accountIndexer.index(accountId);
+
+    boolean reindexed = accountIndexer.reindexIfStale(accountId);
+    assertWithMessage("Account should not have been reindexed").that(reindexed).isFalse();
+  }
+
+  @Test
+  public void indexStalenessIsNotDerivedFromCacheStaleness() throws Exception {
+    Account.Id accountId = createAccount("foo");
+    updateAccountWithoutCacheOrIndex(
+        accountId, newAccountUpdate().setPreferredEmail("foo@example.com").build());
+    reloadAccountToCache(accountId);
+
+    boolean reindexed = accountIndexer.reindexIfStale(accountId);
+    assertWithMessage("Account should have been reindexed").that(reindexed).isTrue();
+  }
+
+  private Account.Id createAccount(String name) throws RestApiException {
+    AccountInfo account = gApi.accounts().create(name).get();
+    return new Account.Id(account._accountId);
+  }
+
+  private void reloadAccountToCache(Account.Id accountId) {
+    accountCache.evict(accountId);
+    loadAccountToCache(accountId);
+  }
+
+  private void loadAccountToCache(Account.Id accountId) {
+    accountCache.get(accountId);
+  }
+
+  private static InternalAccountUpdate.Builder newAccountUpdate() {
+    return InternalAccountUpdate.builder();
+  }
+
+  private void updateAccountWithoutCacheOrIndex(
+      Account.Id accountId, InternalAccountUpdate accountUpdate)
+      throws IOException, ConfigInvalidException {
+    try (Repository allUsersRepo = repoManager.openRepository(allUsersName);
+        MetaDataUpdate md =
+            new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, allUsersRepo)) {
+      PersonIdent ident = serverIdent.get();
+      md.getCommitBuilder().setAuthor(ident);
+      md.getCommitBuilder().setCommitter(ident);
+
+      AccountConfig accountConfig = new AccountConfig(accountId, allUsersName, allUsersRepo).load();
+      accountConfig.setAccountUpdate(accountUpdate);
+      accountConfig.commit(md);
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/api/accounts/AccountManagerIT.java b/javatests/com/google/gerrit/acceptance/api/accounts/AccountManagerIT.java
new file mode 100644
index 0000000..7199f26
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/accounts/AccountManagerIT.java
@@ -0,0 +1,586 @@
+// 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.
+
+package com.google.gerrit.acceptance.api.accounts;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth8.assertThat;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.GerritConfig;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.Sequences;
+import com.google.gerrit.server.ServerInitiated;
+import com.google.gerrit.server.account.AccountException;
+import com.google.gerrit.server.account.AccountManager;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.account.AccountsUpdate;
+import com.google.gerrit.server.account.AuthRequest;
+import com.google.gerrit.server.account.AuthResult;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.account.externalids.ExternalIdNotes;
+import com.google.gerrit.server.account.externalids.ExternalIds;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.inject.Inject;
+import java.util.Optional;
+import org.eclipse.jgit.lib.Repository;
+import org.junit.Test;
+
+public class AccountManagerIT extends AbstractDaemonTest {
+  @Inject private AccountManager accountManager;
+  @Inject private ExternalIds externalIds;
+  @Inject private Sequences seq;
+  @Inject @ServerInitiated private AccountsUpdate accountsUpdate;
+  @Inject private ExternalIdNotes.Factory extIdNotesFactory;
+
+  @Test
+  public void authenticateNewAccountWithEmail() throws Exception {
+    String email = "foo@example.com";
+    ExternalId.Key mailtoExtIdKey = ExternalId.Key.create(ExternalId.SCHEME_MAILTO, email);
+    assertNoSuchExternalIds(mailtoExtIdKey);
+
+    AuthRequest who = AuthRequest.forEmail(email);
+    AuthResult authResult = accountManager.authenticate(who);
+    assertAuthResultForNewAccount(authResult, mailtoExtIdKey);
+    assertExternalId(mailtoExtIdKey, email);
+  }
+
+  @Test
+  public void authenticateNewAccountWithUsername() throws Exception {
+    String username = "foo";
+    ExternalId.Key gerritExtIdKey = ExternalId.Key.create(ExternalId.SCHEME_GERRIT, username);
+    ExternalId.Key usernameExtIdKey = ExternalId.Key.create(ExternalId.SCHEME_USERNAME, username);
+    assertNoSuchExternalIds(gerritExtIdKey, usernameExtIdKey);
+
+    AuthRequest who = AuthRequest.forUser(username);
+    AuthResult authResult = accountManager.authenticate(who);
+    assertAuthResultForNewAccount(authResult, gerritExtIdKey);
+    assertExternalIdsWithoutEmail(gerritExtIdKey, usernameExtIdKey);
+  }
+
+  @Test
+  public void authenticateNewAccountWithUsernameAndEmail() throws Exception {
+    String username = "foo";
+    ExternalId.Key gerritExtIdKey = ExternalId.Key.create(ExternalId.SCHEME_GERRIT, username);
+    ExternalId.Key usernameExtIdKey = ExternalId.Key.create(ExternalId.SCHEME_USERNAME, username);
+    assertNoSuchExternalIds(gerritExtIdKey, usernameExtIdKey);
+
+    AuthRequest who = AuthRequest.forUser(username);
+    String email = "foo@example.com";
+    who.setEmailAddress(email);
+    AuthResult authResult = accountManager.authenticate(who);
+    assertAuthResultForNewAccount(authResult, gerritExtIdKey);
+    assertExternalId(gerritExtIdKey, email);
+    assertExternalIdsWithoutEmail(usernameExtIdKey);
+  }
+
+  @Test
+  public void authenticateNewAccountWithExternalUser() throws Exception {
+    String username = "foo";
+    ExternalId.Key externalExtIdKey = ExternalId.Key.create(ExternalId.SCHEME_EXTERNAL, username);
+    ExternalId.Key usernameExtIdKey = ExternalId.Key.create(ExternalId.SCHEME_USERNAME, username);
+    ExternalId.Key gerritExtIdKey = ExternalId.Key.create(ExternalId.SCHEME_GERRIT, username);
+    assertNoSuchExternalIds(externalExtIdKey, usernameExtIdKey, gerritExtIdKey);
+
+    AuthRequest who = AuthRequest.forExternalUser(username);
+    AuthResult authResult = accountManager.authenticate(who);
+    assertAuthResultForNewAccount(authResult, externalExtIdKey);
+    assertExternalIdsWithoutEmail(externalExtIdKey, usernameExtIdKey);
+    assertNoSuchExternalIds(gerritExtIdKey);
+  }
+
+  @Test
+  public void authenticateNewAccountWithExternalUserAndEmail() throws Exception {
+    String username = "foo";
+    ExternalId.Key externalExtIdKey = ExternalId.Key.create(ExternalId.SCHEME_EXTERNAL, username);
+    ExternalId.Key usernameExtIdKey = ExternalId.Key.create(ExternalId.SCHEME_USERNAME, username);
+    ExternalId.Key gerritExtIdKey = ExternalId.Key.create(ExternalId.SCHEME_GERRIT, username);
+    assertNoSuchExternalIds(externalExtIdKey, usernameExtIdKey, gerritExtIdKey);
+
+    AuthRequest who = AuthRequest.forExternalUser(username);
+    String email = "foo@example.com";
+    who.setEmailAddress(email);
+    AuthResult authResult = accountManager.authenticate(who);
+    assertAuthResultForNewAccount(authResult, externalExtIdKey);
+    assertExternalId(externalExtIdKey, email);
+    assertExternalIdsWithoutEmail(usernameExtIdKey);
+    assertNoSuchExternalIds(gerritExtIdKey);
+  }
+
+  @Test
+  public void authenticateWithEmail() throws Exception {
+    String email = "foo@example.com";
+    Account.Id accountId = new Account.Id(seq.nextAccountId());
+    ExternalId.Key mailtoExtIdKey = ExternalId.Key.create(ExternalId.SCHEME_MAILTO, email);
+    accountsUpdate.insert(
+        "Create Test Account",
+        accountId,
+        u -> u.addExternalId(ExternalId.create(mailtoExtIdKey, accountId)));
+
+    AuthRequest who = AuthRequest.forEmail(email);
+    AuthResult authResult = accountManager.authenticate(who);
+    assertAuthResultForExistingAccount(authResult, accountId, mailtoExtIdKey);
+  }
+
+  @Test
+  public void authenticateWithUsername() throws Exception {
+    String username = "foo";
+    Account.Id accountId = new Account.Id(seq.nextAccountId());
+    ExternalId.Key gerritExtIdKey = ExternalId.Key.create(ExternalId.SCHEME_GERRIT, username);
+    accountsUpdate.insert(
+        "Create Test Account",
+        accountId,
+        u -> u.addExternalId(ExternalId.create(gerritExtIdKey, accountId)));
+
+    AuthRequest who = AuthRequest.forUser(username);
+    AuthResult authResult = accountManager.authenticate(who);
+    assertAuthResultForExistingAccount(authResult, accountId, gerritExtIdKey);
+  }
+
+  @Test
+  public void authenticateWithExternalUser() throws Exception {
+    String username = "foo";
+    Account.Id accountId = new Account.Id(seq.nextAccountId());
+    ExternalId.Key externalExtIdKey = ExternalId.Key.create(ExternalId.SCHEME_EXTERNAL, username);
+    accountsUpdate.insert(
+        "Create Test Account",
+        accountId,
+        u -> u.addExternalId(ExternalId.create(externalExtIdKey, accountId)));
+
+    AuthRequest who = AuthRequest.forExternalUser(username);
+    AuthResult authResult = accountManager.authenticate(who);
+    assertAuthResultForExistingAccount(authResult, accountId, externalExtIdKey);
+  }
+
+  @Test
+  public void authenticateWithUsernameAndUpdateEmail() throws Exception {
+    String username = "foo";
+    String email = "foo@example.com";
+    Account.Id accountId = new Account.Id(seq.nextAccountId());
+    ExternalId.Key gerritExtIdKey = ExternalId.Key.create(ExternalId.SCHEME_GERRIT, username);
+    accountsUpdate.insert(
+        "Create Test Account",
+        accountId,
+        u ->
+            u.setPreferredEmail(email)
+                .addExternalId(ExternalId.createWithEmail(gerritExtIdKey, accountId, email)));
+
+    AuthRequest who = AuthRequest.forUser(username);
+    String newEmail = "bar@example.com";
+    who.setEmailAddress(newEmail);
+    AuthResult authResult = accountManager.authenticate(who);
+    assertAuthResultForExistingAccount(authResult, accountId, gerritExtIdKey);
+
+    Optional<ExternalId> gerritExtId = externalIds.get(gerritExtIdKey);
+    assertThat(gerritExtId).isPresent();
+    assertThat(gerritExtId.get().email()).isEqualTo(newEmail);
+
+    Optional<AccountState> accountState = accounts.get(accountId);
+    assertThat(accountState).isPresent();
+    assertThat(accountState.get().getAccount().getPreferredEmail()).isEqualTo(newEmail);
+  }
+
+  @Test
+  public void authenticateWithUsernameAndUpdateDisplayName() throws Exception {
+    String username = "foo";
+    String email = "foo@example.com";
+    Account.Id accountId = new Account.Id(seq.nextAccountId());
+    ExternalId.Key gerritExtIdKey = ExternalId.Key.create(ExternalId.SCHEME_GERRIT, username);
+    accountsUpdate.insert(
+        "Create Test Account",
+        accountId,
+        u ->
+            u.setFullName("Initial Name")
+                .setPreferredEmail(email)
+                .addExternalId(ExternalId.createWithEmail(gerritExtIdKey, accountId, email)));
+
+    AuthRequest who = AuthRequest.forUser(username);
+    String newName = "Updated Name";
+    who.setDisplayName(newName);
+    AuthResult authResult = accountManager.authenticate(who);
+    assertAuthResultForExistingAccount(authResult, accountId, gerritExtIdKey);
+
+    Optional<AccountState> accountState = accounts.get(accountId);
+    assertThat(accountState).isPresent();
+    assertThat(accountState.get().getAccount().getFullName()).isEqualTo(newName);
+  }
+
+  @Test
+  public void cannotAuthenticateWithOrphanedExtId() throws Exception {
+    String username = "foo";
+    ExternalId.Key gerritExtIdKey = ExternalId.Key.create(ExternalId.SCHEME_GERRIT, username);
+    assertNoSuchExternalIds(gerritExtIdKey);
+
+    // Create orphaned SCHEME_GERRIT external ID.
+    Account.Id accountId = new Account.Id(seq.nextAccountId());
+    ExternalId gerritExtId = ExternalId.create(gerritExtIdKey, accountId);
+    try (Repository allUsersRepo = repoManager.openRepository(allUsers);
+        MetaDataUpdate md = metaDataUpdateFactory.create(allUsers)) {
+      ExternalIdNotes extIdNotes = extIdNotesFactory.load(allUsersRepo);
+      extIdNotes.insert(gerritExtId);
+      extIdNotes.commit(md);
+    }
+
+    AuthRequest who = AuthRequest.forUser(username);
+    exception.expect(AccountException.class);
+    exception.expectMessage("Authentication error, account not found");
+    accountManager.authenticate(who);
+  }
+
+  @Test
+  public void cannotAuthenticateWithInactiveAccount() throws Exception {
+    String username = "foo";
+    Account.Id accountId = new Account.Id(seq.nextAccountId());
+    ExternalId.Key gerritExtIdKey = ExternalId.Key.create(ExternalId.SCHEME_GERRIT, username);
+    accountsUpdate.insert(
+        "Create Test Account",
+        accountId,
+        u -> u.setActive(false).addExternalId(ExternalId.create(gerritExtIdKey, accountId)));
+
+    AuthRequest who = AuthRequest.forUser(username);
+    exception.expect(AccountException.class);
+    exception.expectMessage("Authentication error, account inactive");
+    accountManager.authenticate(who);
+  }
+
+  @Test
+  public void cannotActivateAccountOnAuthenticationWhenAutoUpdateAccountActiveStatusIsDisabled()
+      throws Exception {
+    String username = "foo";
+    Account.Id accountId = new Account.Id(seq.nextAccountId());
+    ExternalId.Key gerritExtIdKey = ExternalId.Key.create(ExternalId.SCHEME_GERRIT, username);
+    accountsUpdate.insert(
+        "Create Test Account",
+        accountId,
+        u -> u.setActive(false).addExternalId(ExternalId.create(gerritExtIdKey, accountId)));
+
+    AuthRequest who = AuthRequest.forUser(username);
+    who.setActive(true);
+    who.setAuthProvidesAccountActiveStatus(true);
+    exception.expect(AccountException.class);
+    exception.expectMessage("Authentication error, account inactive");
+    accountManager.authenticate(who);
+  }
+
+  @Test
+  @GerritConfig(name = "auth.autoUpdateAccountActiveStatus", value = "true")
+  public void activateAccountOnAuthenticationWhenAutoUpdateAccountActiveStatusIsEnabled()
+      throws Exception {
+    String username = "foo";
+    Account.Id accountId = new Account.Id(seq.nextAccountId());
+    ExternalId.Key gerritExtIdKey = ExternalId.Key.create(ExternalId.SCHEME_GERRIT, username);
+    accountsUpdate.insert(
+        "Create Test Account",
+        accountId,
+        u -> u.setActive(false).addExternalId(ExternalId.create(gerritExtIdKey, accountId)));
+
+    AuthRequest who = AuthRequest.forUser(username);
+    who.setActive(true);
+    who.setAuthProvidesAccountActiveStatus(true);
+    AuthResult authResult = accountManager.authenticate(who);
+    assertAuthResultForExistingAccount(authResult, accountId, gerritExtIdKey);
+    Optional<AccountState> accountState = accounts.get(accountId);
+    assertThat(accountState).isPresent();
+    assertThat(accountState.get().getAccount().isActive()).isTrue();
+  }
+
+  @Test
+  public void cannotDeactivateAccountOnAuthenticationWhenAutoUpdateAccountActiveStatusIsDisabled()
+      throws Exception {
+    String username = "foo";
+    Account.Id accountId = new Account.Id(seq.nextAccountId());
+    ExternalId.Key gerritExtIdKey = ExternalId.Key.create(ExternalId.SCHEME_GERRIT, username);
+    accountsUpdate.insert(
+        "Create Test Account",
+        accountId,
+        u -> u.addExternalId(ExternalId.create(gerritExtIdKey, accountId)));
+
+    AuthRequest who = AuthRequest.forUser(username);
+    who.setActive(false);
+    who.setAuthProvidesAccountActiveStatus(true);
+    AuthResult authResult = accountManager.authenticate(who);
+    assertAuthResultForExistingAccount(authResult, accountId, gerritExtIdKey);
+    Optional<AccountState> accountState = accounts.get(accountId);
+    assertThat(accountState).isPresent();
+    assertThat(accountState.get().getAccount().isActive()).isTrue();
+  }
+
+  @Test
+  @GerritConfig(name = "auth.autoUpdateAccountActiveStatus", value = "true")
+  public void deactivateAccountOnAuthenticationWhenAutoUpdateAccountActiveStatusIsEnabled()
+      throws Exception {
+    String username = "foo";
+    Account.Id accountId = new Account.Id(seq.nextAccountId());
+    ExternalId.Key gerritExtIdKey = ExternalId.Key.create(ExternalId.SCHEME_GERRIT, username);
+    accountsUpdate.insert(
+        "Create Test Account",
+        accountId,
+        u -> u.addExternalId(ExternalId.create(gerritExtIdKey, accountId)));
+
+    AuthRequest who = AuthRequest.forUser(username);
+    who.setActive(false);
+    who.setAuthProvidesAccountActiveStatus(true);
+    try {
+      accountManager.authenticate(who);
+      fail("Expected AccountException");
+    } catch (AccountException e) {
+      assertThat(e).hasMessageThat().isEqualTo("Authentication error, account inactive");
+    }
+
+    Optional<AccountState> accountState = accounts.get(accountId);
+    assertThat(accountState).isPresent();
+    assertThat(accountState.get().getAccount().isActive()).isFalse();
+  }
+
+  @Test
+  public void cannotAuthenticateNewAccountWithEmailThatIsAlreadyUsed() throws Exception {
+    String email = "foo@example.com";
+
+    // Create an account with an SCHEME_EXTERNAL external ID that occupies the email.
+    String username = "foo";
+    Account.Id accountId = new Account.Id(seq.nextAccountId());
+    ExternalId.Key externalExtIdKey = ExternalId.Key.create(ExternalId.SCHEME_EXTERNAL, username);
+    accountsUpdate.insert(
+        "Create Test Account",
+        accountId,
+        u -> u.addExternalId(ExternalId.createWithEmail(externalExtIdKey, accountId, email)));
+
+    // Try to authenticate with this email to create a new account with a SCHEME_MAILTO external ID.
+    // Expect that this fails because the email is already assigned to the other account.
+    AuthRequest who = AuthRequest.forEmail(email);
+    exception.expect(AccountException.class);
+    exception.expectMessage("Email 'foo@example.com' in use by another account");
+    accountManager.authenticate(who);
+  }
+
+  @Test
+  public void cannotAuthenticateNewAccountWithUsernameAndEmailThatIsAlreadyUsed() throws Exception {
+    String email = "foo@example.com";
+
+    // Create an account with an SCHEME_EXTERNAL external ID that occupies the email.
+    String username = "foo";
+    Account.Id accountId = new Account.Id(seq.nextAccountId());
+    ExternalId.Key externalExtIdKey = ExternalId.Key.create(ExternalId.SCHEME_EXTERNAL, username);
+    accountsUpdate.insert(
+        "Create Test Account",
+        accountId,
+        u -> u.addExternalId(ExternalId.createWithEmail(externalExtIdKey, accountId, email)));
+
+    // Try to authenticate with a new username and claim the same email.
+    // Expect that this fails because the email is already assigned to the other account.
+    AuthRequest who = AuthRequest.forUser("bar");
+    who.setEmailAddress(email);
+    exception.expect(AccountException.class);
+    exception.expectMessage("Email 'foo@example.com' in use by another account");
+    accountManager.authenticate(who);
+  }
+
+  @Test
+  public void cannotUpdateToEmailThatIsAlreadyUsed() throws Exception {
+    String email = "foo@example.com";
+    String newEmail = "bar@example.com";
+
+    // Create an account with a SCHEME_GERRIT external ID and an email.
+    String username = "foo";
+    Account.Id accountId = new Account.Id(seq.nextAccountId());
+    ExternalId.Key gerritExtIdKey = ExternalId.Key.create(ExternalId.SCHEME_GERRIT, username);
+    accountsUpdate.insert(
+        "Create Test Account",
+        accountId,
+        u ->
+            u.setPreferredEmail(email)
+                .addExternalId(ExternalId.createWithEmail(gerritExtIdKey, accountId, email)));
+
+    // Create another account with an SCHEME_EXTERNAL external ID that occupies the new email.
+    Account.Id accountId2 = new Account.Id(seq.nextAccountId());
+    ExternalId.Key externalExtIdKey = ExternalId.Key.create(ExternalId.SCHEME_EXTERNAL, "bar");
+    accountsUpdate.insert(
+        "Create Test Account",
+        accountId2,
+        u -> u.addExternalId(ExternalId.createWithEmail(externalExtIdKey, accountId2, newEmail)));
+
+    // Try to authenticate and update the email for the first account.
+    // Expect that this fails because the new email is already assigned to the other account.
+    AuthRequest who = AuthRequest.forUser(username);
+    who.setEmailAddress(newEmail);
+    try {
+      accountManager.authenticate(who);
+      fail("Expected AccountException");
+    } catch (AccountException e) {
+      assertThat(e).hasMessageThat().isEqualTo("Email 'bar@example.com' in use by another account");
+    }
+
+    // Verify that the email in the external ID was not updated.
+    Optional<ExternalId> gerritExtId = externalIds.get(gerritExtIdKey);
+    assertThat(gerritExtId).isPresent();
+    assertThat(gerritExtId.get().email()).isEqualTo(email);
+
+    // Verify that the preferred email was not updated.
+    Optional<AccountState> accountState = accounts.get(accountId);
+    assertThat(accountState).isPresent();
+    assertThat(accountState.get().getAccount().getPreferredEmail()).isEqualTo(email);
+  }
+
+  @Test
+  public void linkNewExternalId() throws Exception {
+    // Create an account with a SCHEME_GERRIT external ID and no email
+    String username = "foo";
+    Account.Id accountId = new Account.Id(seq.nextAccountId());
+    ExternalId.Key gerritExtIdKey = ExternalId.Key.create(ExternalId.SCHEME_GERRIT, username);
+    accountsUpdate.insert(
+        "Create Test Account",
+        accountId,
+        u -> u.addExternalId(ExternalId.create(gerritExtIdKey, accountId)));
+
+    // Check that email is not used yet.
+    String email = "foo@example.com";
+    ExternalId.Key mailtoExtIdKey = ExternalId.Key.create(ExternalId.SCHEME_MAILTO, email);
+    assertNoSuchExternalIds(mailtoExtIdKey);
+
+    // Link the email to the account.
+    // Expect that a MAILTO external ID is created.
+    AuthRequest who = AuthRequest.forEmail(email);
+    AuthResult authResult = accountManager.link(accountId, who);
+    assertAuthResultForExistingAccount(authResult, accountId, mailtoExtIdKey);
+    assertExternalId(mailtoExtIdKey, accountId, email);
+  }
+
+  @Test
+  public void updateExternalIdOnLink() throws Exception {
+    // Create an account with a SCHEME_GERRIT external ID and no email
+    String username = "foo";
+    Account.Id accountId = new Account.Id(seq.nextAccountId());
+    ExternalId.Key externalExtIdKey = ExternalId.Key.create(ExternalId.SCHEME_EXTERNAL, username);
+    accountsUpdate.insert(
+        "Create Test Account",
+        accountId,
+        u ->
+            u.addExternalId(
+                ExternalId.createWithEmail(externalExtIdKey, accountId, "old@example.com")));
+
+    // Link the email to the existing SCHEME_EXTERNAL external ID, but with a new email.
+    // Expect that the email of the existing external ID is updated.
+    AuthRequest who = AuthRequest.forExternalUser(username);
+    String newEmail = "new@example.com";
+    who.setEmailAddress(newEmail);
+    AuthResult authResult = accountManager.link(accountId, who);
+    assertAuthResultForExistingAccount(authResult, accountId, externalExtIdKey);
+    assertExternalId(externalExtIdKey, accountId, newEmail);
+  }
+
+  @Test
+  public void cannotLinkExternalIdThatIsAlreadyUsed() throws Exception {
+    // Create an account with a SCHEME_EXTERNAL external ID
+    String username1 = "foo";
+    Account.Id accountId1 = new Account.Id(seq.nextAccountId());
+    ExternalId.Key externalExtIdKey1 = ExternalId.Key.create(ExternalId.SCHEME_EXTERNAL, username1);
+    accountsUpdate.insert(
+        "Create Test Account",
+        accountId1,
+        u -> u.addExternalId(ExternalId.create(externalExtIdKey1, accountId1)));
+
+    // Create another account with a SCHEME_EXTERNAL external ID
+    String username2 = "bar";
+    Account.Id accountId2 = new Account.Id(seq.nextAccountId());
+    ExternalId.Key externalExtIdKey2 = ExternalId.Key.create(ExternalId.SCHEME_EXTERNAL, username2);
+    accountsUpdate.insert(
+        "Create Test Account",
+        accountId2,
+        u -> u.addExternalId(ExternalId.create(externalExtIdKey2, accountId2)));
+
+    // Try to link external ID of the first account to the second account.
+    // Expect that this fails because the external ID is already assigned to the first account.
+    AuthRequest who = AuthRequest.forExternalUser(username1);
+    exception.expect(AccountException.class);
+    exception.expectMessage("Identity 'external:foo' in use by another account");
+    accountManager.link(accountId2, who);
+  }
+
+  @Test
+  public void cannotLinkEmailThatIsAlreadyUsed() throws Exception {
+    String email = "foo@example.com";
+
+    // Create an account with an SCHEME_EXTERNAL external ID that occupies the email.
+    String username = "foo";
+    Account.Id accountId = new Account.Id(seq.nextAccountId());
+    ExternalId.Key externalExtIdKey = ExternalId.Key.create(ExternalId.SCHEME_EXTERNAL, username);
+    accountsUpdate.insert(
+        "Create Test Account",
+        accountId,
+        u -> u.addExternalId(ExternalId.createWithEmail(externalExtIdKey, accountId, email)));
+
+    // Create another account with a SCHEME_GERRIT external ID and no email
+    String username2 = "foo";
+    Account.Id accountId2 = new Account.Id(seq.nextAccountId());
+    ExternalId.Key gerritExtIdKey = ExternalId.Key.create(ExternalId.SCHEME_GERRIT, username2);
+    accountsUpdate.insert(
+        "Create Test Account",
+        accountId2,
+        u -> u.addExternalId(ExternalId.create(gerritExtIdKey, accountId2)));
+
+    // Try to link the email to the second account (via a new MAILTO external ID) and expect that
+    // this fails because the email is already assigned to the first account.
+    AuthRequest who = AuthRequest.forEmail(email);
+    exception.expect(AccountException.class);
+    exception.expectMessage("Email 'foo@example.com' in use by another account");
+    accountManager.link(accountId, who);
+  }
+
+  private void assertNoSuchExternalIds(ExternalId.Key... extIdKeys) throws Exception {
+    for (ExternalId.Key extIdKey : extIdKeys) {
+      assertThat(externalIds.get(extIdKey)).named(extIdKey.get()).isEmpty();
+    }
+  }
+
+  private void assertExternalIdsWithoutEmail(ExternalId.Key... extIdKeys) throws Exception {
+    for (ExternalId.Key extIdKey : extIdKeys) {
+      assertExternalId(extIdKey, null);
+    }
+  }
+
+  private void assertExternalId(ExternalId.Key extIdKey, @Nullable String expectedEmail)
+      throws Exception {
+    assertExternalId(extIdKey, null, expectedEmail);
+  }
+
+  private void assertExternalId(
+      ExternalId.Key extIdKey,
+      @Nullable Account.Id expectedAccountId,
+      @Nullable String expectedEmail)
+      throws Exception {
+    Optional<ExternalId> extId = externalIds.get(extIdKey);
+    assertThat(extId).named(extIdKey.get()).isPresent();
+    if (expectedAccountId != null) {
+      assertThat(extId.get().accountId())
+          .named("account ID of " + extIdKey.get())
+          .isEqualTo(expectedAccountId);
+    }
+    assertThat(extId.get().email()).named("email of " + extIdKey.get()).isEqualTo(expectedEmail);
+  }
+
+  private void assertAuthResultForNewAccount(
+      AuthResult authResult, ExternalId.Key expectedExtIdKey) {
+    assertThat(authResult.getAccountId()).isNotNull();
+    assertThat(authResult.getExternalId()).isEqualTo(expectedExtIdKey);
+    assertThat(authResult.isNew()).isTrue();
+  }
+
+  private void assertAuthResultForExistingAccount(
+      AuthResult authResult, Account.Id expectedAccountId, ExternalId.Key expectedExtIdKey) {
+    assertThat(authResult.getAccountId()).isEqualTo(expectedAccountId);
+    assertThat(authResult.getExternalId()).isEqualTo(expectedExtIdKey);
+    assertThat(authResult.isNew()).isFalse();
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/api/accounts/AgreementsIT.java b/javatests/com/google/gerrit/acceptance/api/accounts/AgreementsIT.java
new file mode 100644
index 0000000..7a4a901
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/accounts/AgreementsIT.java
@@ -0,0 +1,261 @@
+// 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.
+
+package com.google.gerrit.acceptance.api.accounts;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static java.util.concurrent.TimeUnit.SECONDS;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.common.data.ContributorAgreement;
+import com.google.gerrit.extensions.api.changes.CherryPickInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.changes.SubmitInput;
+import com.google.gerrit.extensions.api.projects.BranchInfo;
+import com.google.gerrit.extensions.api.projects.BranchInput;
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.extensions.common.AgreementInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.ChangeInput;
+import com.google.gerrit.extensions.common.ServerInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.gerrit.testing.TestTimeUtil;
+import java.util.List;
+import org.eclipse.jgit.lib.Config;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class AgreementsIT extends AbstractDaemonTest {
+  private ContributorAgreement caAutoVerify;
+  private ContributorAgreement caNoAutoVerify;
+
+  @ConfigSuite.Config
+  public static Config enableAgreementsConfig() {
+    Config cfg = new Config();
+    cfg.setBoolean("auth", null, "contributorAgreements", true);
+    return cfg;
+  }
+
+  @BeforeClass
+  public static void setTimeForTesting() {
+    TestTimeUtil.resetWithClockStep(1, SECONDS);
+  }
+
+  @AfterClass
+  public static void restoreTime() {
+    TestTimeUtil.useSystemTime();
+  }
+
+  @Before
+  public void setUp() throws Exception {
+    caAutoVerify = configureContributorAgreement(true);
+    caNoAutoVerify = configureContributorAgreement(false);
+    setApiUser(user);
+  }
+
+  @Test
+  public void getAvailableAgreements() throws Exception {
+    ServerInfo info = gApi.config().server().getInfo();
+    if (isContributorAgreementsEnabled()) {
+      assertThat(info.auth.useContributorAgreements).isTrue();
+      assertThat(info.auth.contributorAgreements).hasSize(2);
+      assertAgreement(info.auth.contributorAgreements.get(0), caAutoVerify);
+      assertAgreement(info.auth.contributorAgreements.get(1), caNoAutoVerify);
+    } else {
+      assertThat(info.auth.useContributorAgreements).isNull();
+      assertThat(info.auth.contributorAgreements).isNull();
+    }
+  }
+
+  @Test
+  public void signNonExistingAgreement() throws Exception {
+    assume().that(isContributorAgreementsEnabled()).isTrue();
+    exception.expect(UnprocessableEntityException.class);
+    exception.expectMessage("contributor agreement not found");
+    gApi.accounts().self().signAgreement("does-not-exist");
+  }
+
+  @Test
+  public void signAgreementNoAutoVerify() throws Exception {
+    assume().that(isContributorAgreementsEnabled()).isTrue();
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("cannot enter a non-autoVerify agreement");
+    gApi.accounts().self().signAgreement(caNoAutoVerify.getName());
+  }
+
+  @Test
+  public void signAgreement() throws Exception {
+    assume().that(isContributorAgreementsEnabled()).isTrue();
+
+    // List of agreements is initially empty
+    List<AgreementInfo> result = gApi.accounts().self().listAgreements();
+    assertThat(result).isEmpty();
+
+    // Sign the agreement
+    gApi.accounts().self().signAgreement(caAutoVerify.getName());
+
+    // Explicitly reset the user to force a new request context
+    setApiUser(user);
+
+    // Verify that the agreement was signed
+    result = gApi.accounts().self().listAgreements();
+    assertThat(result).hasSize(1);
+    AgreementInfo info = result.get(0);
+    assertAgreement(info, caAutoVerify);
+
+    // Signing the same agreement again has no effect
+    gApi.accounts().self().signAgreement(caAutoVerify.getName());
+    result = gApi.accounts().self().listAgreements();
+    assertThat(result).hasSize(1);
+  }
+
+  @Test
+  public void signAgreementAsOtherUser() throws Exception {
+    assume().that(isContributorAgreementsEnabled()).isTrue();
+    assertThat(gApi.accounts().self().get().name).isNotEqualTo("admin");
+    exception.expect(AuthException.class);
+    exception.expectMessage("not allowed to enter contributor agreement");
+    gApi.accounts().id("admin").signAgreement(caAutoVerify.getName());
+  }
+
+  @Test
+  public void signAgreementAnonymous() throws Exception {
+    setApiUserAnonymous();
+    exception.expect(AuthException.class);
+    exception.expectMessage("Authentication required");
+    gApi.accounts().self().signAgreement(caAutoVerify.getName());
+  }
+
+  @Test
+  public void agreementsDisabledSign() throws Exception {
+    assume().that(isContributorAgreementsEnabled()).isFalse();
+    exception.expect(MethodNotAllowedException.class);
+    exception.expectMessage("contributor agreements disabled");
+    gApi.accounts().self().signAgreement(caAutoVerify.getName());
+  }
+
+  @Test
+  public void agreementsDisabledList() throws Exception {
+    assume().that(isContributorAgreementsEnabled()).isFalse();
+    exception.expect(MethodNotAllowedException.class);
+    exception.expectMessage("contributor agreements disabled");
+    gApi.accounts().self().listAgreements();
+  }
+
+  @Test
+  public void revertChangeWithoutCLA() throws Exception {
+    assume().that(isContributorAgreementsEnabled()).isTrue();
+
+    // Create a change succeeds when agreement is not required
+    setUseContributorAgreements(InheritableBoolean.FALSE);
+    ChangeInfo change = gApi.changes().create(newChangeInput()).get();
+
+    // Approve and submit it
+    setApiUser(admin);
+    gApi.changes().id(change.changeId).current().review(ReviewInput.approve());
+    gApi.changes().id(change.changeId).current().submit(new SubmitInput());
+
+    // Revert is not allowed when CLA is required but not signed
+    setApiUser(user);
+    setUseContributorAgreements(InheritableBoolean.TRUE);
+    exception.expect(AuthException.class);
+    exception.expectMessage("Contributor Agreement");
+    gApi.changes().id(change.changeId).revert();
+  }
+
+  @Test
+  public void cherrypickChangeWithoutCLA() throws Exception {
+    assume().that(isContributorAgreementsEnabled()).isTrue();
+
+    // Create a new branch
+    setApiUser(admin);
+    BranchInfo dest =
+        gApi.projects()
+            .name(project.get())
+            .branch("cherry-pick-to")
+            .create(new BranchInput())
+            .get();
+
+    // Create a change succeeds when agreement is not required
+    setUseContributorAgreements(InheritableBoolean.FALSE);
+    ChangeInfo change = gApi.changes().create(newChangeInput()).get();
+
+    // Approve and submit it
+    gApi.changes().id(change.changeId).current().review(ReviewInput.approve());
+    gApi.changes().id(change.changeId).current().submit(new SubmitInput());
+
+    // Cherry-pick is not allowed when CLA is required but not signed
+    setApiUser(user);
+    setUseContributorAgreements(InheritableBoolean.TRUE);
+    CherryPickInput in = new CherryPickInput();
+    in.destination = dest.ref;
+    in.message = change.subject;
+    exception.expect(AuthException.class);
+    exception.expectMessage("Contributor Agreement");
+    gApi.changes().id(change.changeId).current().cherryPick(in);
+  }
+
+  @Test
+  public void createChangeRespectsCLA() throws Exception {
+    assume().that(isContributorAgreementsEnabled()).isTrue();
+
+    // Create a change succeeds when agreement is not required
+    setUseContributorAgreements(InheritableBoolean.FALSE);
+    gApi.changes().create(newChangeInput());
+
+    // Create a change is not allowed when CLA is required but not signed
+    setUseContributorAgreements(InheritableBoolean.TRUE);
+    try {
+      gApi.changes().create(newChangeInput());
+      fail("Expected AuthException");
+    } catch (AuthException e) {
+      assertThat(e.getMessage()).contains("Contributor Agreement");
+    }
+
+    // Sign the agreement
+    gApi.accounts().self().signAgreement(caAutoVerify.getName());
+
+    // Explicitly reset the user to force a new request context
+    setApiUser(user);
+
+    // Create a change succeeds after signing the agreement
+    gApi.changes().create(newChangeInput());
+  }
+
+  private void assertAgreement(AgreementInfo info, ContributorAgreement ca) {
+    assertThat(info.name).isEqualTo(ca.getName());
+    assertThat(info.description).isEqualTo(ca.getDescription());
+    assertThat(info.url).isEqualTo(ca.getAgreementUrl());
+    if (ca.getAutoVerify() != null) {
+      assertThat(info.autoVerifyGroup.name).isEqualTo(ca.getAutoVerify().getName());
+    } else {
+      assertThat(info.autoVerifyGroup).isNull();
+    }
+  }
+
+  private ChangeInput newChangeInput() {
+    ChangeInput in = new ChangeInput();
+    in.branch = "master";
+    in.subject = "test";
+    in.project = project.get();
+    return in;
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/api/accounts/BUILD b/javatests/com/google/gerrit/acceptance/api/accounts/BUILD
new file mode 100644
index 0000000..31f3f91
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/accounts/BUILD
@@ -0,0 +1,15 @@
+load("//javatests/com/google/gerrit/acceptance:tests.bzl", "acceptance_tests")
+
+acceptance_tests(
+    srcs = glob(["*IT.java"]),
+    group = "api_account",
+    labels = [
+        "api",
+        "noci",
+        "no_windows",
+    ],
+    deps = [
+        "//java/com/google/gerrit/mail",
+        "//java/com/google/gerrit/server/util/time",
+    ],
+)
diff --git a/javatests/com/google/gerrit/acceptance/api/accounts/DiffPreferencesIT.java b/javatests/com/google/gerrit/acceptance/api/accounts/DiffPreferencesIT.java
new file mode 100644
index 0000000..ba340eb
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/accounts/DiffPreferencesIT.java
@@ -0,0 +1,135 @@
+// Copyright (C) 2015 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.google.gerrit.acceptance.api.accounts;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.acceptance.AssertUtil.assertPrefs;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.extensions.client.DiffPreferencesInfo;
+import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
+import com.google.gerrit.extensions.client.Theme;
+import org.junit.Test;
+
+@NoHttpd
+public class DiffPreferencesIT extends AbstractDaemonTest {
+  @Test
+  public void getDiffPreferences() throws Exception {
+    DiffPreferencesInfo d = DiffPreferencesInfo.defaults();
+    DiffPreferencesInfo o = gApi.accounts().id(admin.getId().toString()).getDiffPreferences();
+    assertPrefs(o, d);
+  }
+
+  @Test
+  public void setDiffPreferences() throws Exception {
+    DiffPreferencesInfo i = DiffPreferencesInfo.defaults();
+
+    // change all default values
+    i.context *= -1;
+    i.tabSize *= -1;
+    i.fontSize *= -1;
+    i.lineLength *= -1;
+    i.cursorBlinkRate = 500;
+    i.theme = Theme.MIDNIGHT;
+    i.ignoreWhitespace = Whitespace.IGNORE_ALL;
+    i.expandAllComments ^= true;
+    i.intralineDifference ^= true;
+    i.manualReview ^= true;
+    i.retainHeader ^= true;
+    i.showLineEndings ^= true;
+    i.showTabs ^= true;
+    i.showWhitespaceErrors ^= true;
+    i.skipDeleted ^= true;
+    i.skipUnchanged ^= true;
+    i.skipUncommented ^= true;
+    i.syntaxHighlighting ^= true;
+    i.hideTopMenu ^= true;
+    i.autoHideDiffTableHeader ^= true;
+    i.hideLineNumbers ^= true;
+    i.renderEntireFile ^= true;
+    i.hideEmptyPane ^= true;
+    i.matchBrackets ^= true;
+    i.lineWrapping ^= true;
+
+    DiffPreferencesInfo o = gApi.accounts().id(admin.getId().toString()).setDiffPreferences(i);
+    assertPrefs(o, i);
+
+    // Partially fill input record
+    i = new DiffPreferencesInfo();
+    i.tabSize = 42;
+    DiffPreferencesInfo a = gApi.accounts().id(admin.getId().toString()).setDiffPreferences(i);
+    assertPrefs(a, o, "tabSize");
+    assertThat(a.tabSize).isEqualTo(42);
+  }
+
+  @Test
+  public void getDiffPreferencesWithConfiguredDefaults() throws Exception {
+    DiffPreferencesInfo d = DiffPreferencesInfo.defaults();
+    int newLineLength = d.lineLength + 10;
+    int newTabSize = d.tabSize * 2;
+    int newFontSize = d.fontSize - 2;
+    DiffPreferencesInfo update = new DiffPreferencesInfo();
+    update.lineLength = newLineLength;
+    update.tabSize = newTabSize;
+    update.fontSize = newFontSize;
+    gApi.config().server().setDefaultDiffPreferences(update);
+
+    DiffPreferencesInfo o = gApi.accounts().id(admin.getId().toString()).getDiffPreferences();
+
+    // assert configured defaults
+    assertThat(o.lineLength).isEqualTo(newLineLength);
+    assertThat(o.tabSize).isEqualTo(newTabSize);
+    assertThat(o.fontSize).isEqualTo(newFontSize);
+
+    // assert hard-coded defaults
+    assertPrefs(o, d, "lineLength", "tabSize", "fontSize");
+  }
+
+  @Test
+  public void overwriteConfiguredDefaults() throws Exception {
+    DiffPreferencesInfo d = DiffPreferencesInfo.defaults();
+    int configuredDefaultLineLength = d.lineLength + 10;
+    DiffPreferencesInfo update = new DiffPreferencesInfo();
+    update.lineLength = configuredDefaultLineLength;
+    gApi.config().server().setDefaultDiffPreferences(update);
+
+    DiffPreferencesInfo o = gApi.accounts().id(admin.getId().toString()).getDiffPreferences();
+    assertThat(o.lineLength).isEqualTo(configuredDefaultLineLength);
+    assertPrefs(o, d, "lineLength");
+
+    int newLineLength = configuredDefaultLineLength + 10;
+    DiffPreferencesInfo i = new DiffPreferencesInfo();
+    i.lineLength = newLineLength;
+    DiffPreferencesInfo a = gApi.accounts().id(admin.getId().toString()).setDiffPreferences(i);
+    assertThat(a.lineLength).isEqualTo(newLineLength);
+    assertPrefs(a, d, "lineLength");
+
+    a = gApi.accounts().id(admin.getId().toString()).getDiffPreferences();
+    assertThat(a.lineLength).isEqualTo(newLineLength);
+    assertPrefs(a, d, "lineLength");
+
+    // overwrite the configured default with original hard-coded default
+    i = new DiffPreferencesInfo();
+    i.lineLength = d.lineLength;
+    a = gApi.accounts().id(admin.getId().toString()).setDiffPreferences(i);
+    assertThat(a.lineLength).isEqualTo(d.lineLength);
+    assertPrefs(a, d, "lineLength");
+
+    a = gApi.accounts().id(admin.getId().toString()).getDiffPreferences();
+    assertThat(a.lineLength).isEqualTo(d.lineLength);
+    assertPrefs(a, d, "lineLength");
+  }
+}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/EditPreferencesIT.java b/javatests/com/google/gerrit/acceptance/api/accounts/EditPreferencesIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/EditPreferencesIT.java
rename to javatests/com/google/gerrit/acceptance/api/accounts/EditPreferencesIT.java
diff --git a/javatests/com/google/gerrit/acceptance/api/accounts/GeneralPreferencesIT.java b/javatests/com/google/gerrit/acceptance/api/accounts/GeneralPreferencesIT.java
new file mode 100644
index 0000000..24040a4
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/accounts/GeneralPreferencesIT.java
@@ -0,0 +1,250 @@
+// Copyright (C) 2015 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.google.gerrit.acceptance.api.accounts;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.acceptance.AssertUtil.assertPrefs;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.TestAccount;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo.DateFormat;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo.DefaultBase;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo.DiffView;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo.DownloadCommand;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo.EmailFormat;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo.EmailStrategy;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo.ReviewCategoryStrategy;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo.TimeFormat;
+import com.google.gerrit.extensions.client.MenuItem;
+import com.google.gerrit.extensions.config.DownloadScheme;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.registration.PrivateInternals_DynamicMapImpl;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.inject.Inject;
+import com.google.inject.util.Providers;
+import java.util.ArrayList;
+import java.util.HashMap;
+import org.junit.Before;
+import org.junit.Test;
+
+@NoHttpd
+public class GeneralPreferencesIT extends AbstractDaemonTest {
+  @Inject private DynamicMap<DownloadScheme> downloadSchemes;
+
+  private TestAccount user42;
+
+  @Before
+  public void setUp() throws Exception {
+    String name = name("user42");
+    user42 = accountCreator.create(name, name + "@example.com", "User 42");
+  }
+
+  @Test
+  public void getAndSetPreferences() throws Exception {
+    GeneralPreferencesInfo o = gApi.accounts().id(user42.id.toString()).getPreferences();
+    assertPrefs(o, GeneralPreferencesInfo.defaults(), "my", "changeTable");
+    assertThat(o.my)
+        .containsExactly(
+            new MenuItem("Changes", "#/dashboard/self", null),
+            new MenuItem("Draft Comments", "#/q/has:draft", null),
+            new MenuItem("Edits", "#/q/has:edit", null),
+            new MenuItem("Watched Changes", "#/q/is:watched+is:open", null),
+            new MenuItem("Starred Changes", "#/q/is:starred", null),
+            new MenuItem("Groups", "#/groups/self", null));
+    assertThat(o.changeTable).isEmpty();
+
+    GeneralPreferencesInfo i = GeneralPreferencesInfo.defaults();
+
+    // change all default values
+    i.changesPerPage *= -1;
+    i.showSiteHeader ^= true;
+    i.useFlashClipboard ^= true;
+    i.downloadCommand = DownloadCommand.REPO_DOWNLOAD;
+    i.dateFormat = DateFormat.US;
+    i.timeFormat = TimeFormat.HHMM_24;
+    i.emailStrategy = EmailStrategy.DISABLED;
+    i.emailFormat = EmailFormat.PLAINTEXT;
+    i.defaultBaseForMerges = DefaultBase.AUTO_MERGE;
+    i.expandInlineDiffs ^= true;
+    i.highlightAssigneeInChangeTable ^= true;
+    i.relativeDateInChangeTable ^= true;
+    i.sizeBarInChangeTable ^= true;
+    i.legacycidInChangeTable ^= true;
+    i.muteCommonPathPrefixes ^= true;
+    i.signedOffBy ^= true;
+    i.reviewCategoryStrategy = ReviewCategoryStrategy.ABBREV;
+    i.diffView = DiffView.UNIFIED_DIFF;
+    i.my = new ArrayList<>();
+    i.my.add(new MenuItem("name", "url"));
+    i.changeTable = new ArrayList<>();
+    i.changeTable.add("Status");
+    i.urlAliases = new HashMap<>();
+    i.urlAliases.put("foo", "bar");
+
+    o = gApi.accounts().id(user42.getId().toString()).setPreferences(i);
+    assertPrefs(o, i, "my");
+    assertThat(o.my).containsExactlyElementsIn(i.my);
+    assertThat(o.changeTable).containsExactlyElementsIn(i.changeTable);
+  }
+
+  @Test
+  public void getPreferencesWithConfiguredDefaults() throws Exception {
+    GeneralPreferencesInfo d = GeneralPreferencesInfo.defaults();
+    int newChangesPerPage = d.changesPerPage * 2;
+    GeneralPreferencesInfo update = new GeneralPreferencesInfo();
+    update.changesPerPage = newChangesPerPage;
+    gApi.config().server().setDefaultPreferences(update);
+
+    GeneralPreferencesInfo o = gApi.accounts().id(user42.getId().toString()).getPreferences();
+
+    // assert configured defaults
+    assertThat(o.changesPerPage).isEqualTo(newChangesPerPage);
+
+    // assert hard-coded defaults
+    assertPrefs(o, d, "my", "changeTable", "changesPerPage");
+  }
+
+  @Test
+  public void overwriteConfiguredDefaults() throws Exception {
+    GeneralPreferencesInfo d = GeneralPreferencesInfo.defaults();
+    int configuredChangesPerPage = d.changesPerPage * 2;
+    GeneralPreferencesInfo update = new GeneralPreferencesInfo();
+    update.changesPerPage = configuredChangesPerPage;
+    gApi.config().server().setDefaultPreferences(update);
+
+    GeneralPreferencesInfo o = gApi.accounts().id(admin.getId().toString()).getPreferences();
+    assertThat(o.changesPerPage).isEqualTo(configuredChangesPerPage);
+    assertPrefs(o, d, "my", "changeTable", "changesPerPage");
+
+    int newChangesPerPage = configuredChangesPerPage * 2;
+    GeneralPreferencesInfo i = new GeneralPreferencesInfo();
+    i.changesPerPage = newChangesPerPage;
+    GeneralPreferencesInfo a = gApi.accounts().id(admin.getId().toString()).setPreferences(i);
+    assertThat(a.changesPerPage).isEqualTo(newChangesPerPage);
+    assertPrefs(a, d, "my", "changeTable", "changesPerPage");
+
+    a = gApi.accounts().id(admin.getId().toString()).getPreferences();
+    assertThat(a.changesPerPage).isEqualTo(newChangesPerPage);
+    assertPrefs(a, d, "my", "changeTable", "changesPerPage");
+
+    // overwrite the configured default with original hard-coded default
+    i = new GeneralPreferencesInfo();
+    i.changesPerPage = d.changesPerPage;
+    a = gApi.accounts().id(admin.getId().toString()).setPreferences(i);
+    assertThat(a.changesPerPage).isEqualTo(d.changesPerPage);
+    assertPrefs(a, d, "my", "changeTable", "changesPerPage");
+
+    a = gApi.accounts().id(admin.getId().toString()).getPreferences();
+    assertThat(a.changesPerPage).isEqualTo(d.changesPerPage);
+    assertPrefs(a, d, "my", "changeTable", "changesPerPage");
+  }
+
+  @Test
+  public void rejectMyMenuWithoutName() throws Exception {
+    GeneralPreferencesInfo i = GeneralPreferencesInfo.defaults();
+    i.my = new ArrayList<>();
+    i.my.add(new MenuItem(null, "url"));
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("name for menu item is required");
+    gApi.accounts().id(user42.getId().toString()).setPreferences(i);
+  }
+
+  @Test
+  public void rejectMyMenuWithoutUrl() throws Exception {
+    GeneralPreferencesInfo i = GeneralPreferencesInfo.defaults();
+    i.my = new ArrayList<>();
+    i.my.add(new MenuItem("name", null));
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("URL for menu item is required");
+    gApi.accounts().id(user42.getId().toString()).setPreferences(i);
+  }
+
+  @Test
+  public void trimMyMenuInput() throws Exception {
+    GeneralPreferencesInfo i = GeneralPreferencesInfo.defaults();
+    i.my = new ArrayList<>();
+    i.my.add(new MenuItem(" name\t", " url\t", " _blank\t", " id\t"));
+
+    GeneralPreferencesInfo o = gApi.accounts().id(user42.getId().toString()).setPreferences(i);
+    assertThat(o.my).containsExactly(new MenuItem("name", "url", "_blank", "id"));
+  }
+
+  @Test
+  public void rejectUnsupportedDownloadScheme() throws Exception {
+    GeneralPreferencesInfo i = GeneralPreferencesInfo.defaults();
+    i.downloadScheme = "foo";
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("Unsupported download scheme: " + i.downloadScheme);
+    gApi.accounts().id(user42.getId().toString()).setPreferences(i);
+  }
+
+  @Test
+  public void setDownloadScheme() throws Exception {
+    String schemeName = "foo";
+    RegistrationHandle registrationHandle =
+        ((PrivateInternals_DynamicMapImpl<DownloadScheme>) downloadSchemes)
+            .put("myPlugin", schemeName, Providers.of(new TestDownloadScheme()));
+    try {
+      GeneralPreferencesInfo i = GeneralPreferencesInfo.defaults();
+      i.downloadScheme = schemeName;
+
+      GeneralPreferencesInfo o = gApi.accounts().id(user42.getId().toString()).setPreferences(i);
+      assertThat(o.downloadScheme).isEqualTo(schemeName);
+
+      o = gApi.accounts().id(user42.getId().toString()).getPreferences();
+      assertThat(o.downloadScheme).isEqualTo(schemeName);
+    } finally {
+      registrationHandle.remove();
+    }
+  }
+
+  @Test
+  public void unsupportedDownloadSchemeIsNotReturned() throws Exception {
+    // Set a download scheme and unregister the plugin that provides this download scheme so that it
+    // becomes unsupported.
+    setDownloadScheme();
+
+    GeneralPreferencesInfo o = gApi.accounts().id(user42.getId().toString()).getPreferences();
+    assertThat(o.downloadScheme).isNull();
+  }
+
+  private static class TestDownloadScheme extends DownloadScheme {
+    @Override
+    public String getUrl(String project) {
+      return "http://foo/" + project;
+    }
+
+    @Override
+    public boolean isAuthRequired() {
+      return false;
+    }
+
+    @Override
+    public boolean isAuthSupported() {
+      return false;
+    }
+
+    @Override
+    public boolean isEnabled() {
+      return true;
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/api/change/AbandonIT.java b/javatests/com/google/gerrit/acceptance/api/change/AbandonIT.java
new file mode 100644
index 0000000..b626ab3
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/change/AbandonIT.java
@@ -0,0 +1,210 @@
+// Copyright (C) 2017 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.google.gerrit.acceptance.api.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.extensions.client.ListChangesOption.MESSAGES;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static java.util.concurrent.TimeUnit.HOURS;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.GerritConfig;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.client.ChangeStatus;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.change.AbandonUtil;
+import com.google.gerrit.server.config.ChangeCleanupConfig;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.testing.TestTimeUtil;
+import com.google.inject.Inject;
+import java.util.List;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.junit.TestRepository;
+import org.junit.Test;
+
+public class AbandonIT extends AbstractDaemonTest {
+  @Inject private AbandonUtil abandonUtil;
+  @Inject private ChangeCleanupConfig cleanupConfig;
+
+  @Test
+  public void abandon() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String changeId = r.getChangeId();
+    assertThat(info(changeId).status).isEqualTo(ChangeStatus.NEW);
+    gApi.changes().id(changeId).abandon();
+    ChangeInfo info = get(changeId, MESSAGES);
+    assertThat(info.status).isEqualTo(ChangeStatus.ABANDONED);
+    assertThat(Iterables.getLast(info.messages).message.toLowerCase()).contains("abandoned");
+
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("change is abandoned");
+    gApi.changes().id(changeId).abandon();
+  }
+
+  @Test
+  public void batchAbandon() throws Exception {
+    CurrentUser user = atrScope.get().getUser();
+    PushOneCommit.Result a = createChange();
+    PushOneCommit.Result b = createChange();
+    List<ChangeData> list = ImmutableList.of(a.getChange(), b.getChange());
+    batchAbandon.batchAbandon(batchUpdateFactory, a.getChange().project(), user, list, "deadbeef");
+
+    ChangeInfo info = get(a.getChangeId(), MESSAGES);
+    assertThat(info.status).isEqualTo(ChangeStatus.ABANDONED);
+    assertThat(Iterables.getLast(info.messages).message.toLowerCase()).contains("abandoned");
+    assertThat(Iterables.getLast(info.messages).message.toLowerCase()).contains("deadbeef");
+
+    info = get(b.getChangeId(), MESSAGES);
+    assertThat(info.status).isEqualTo(ChangeStatus.ABANDONED);
+    assertThat(Iterables.getLast(info.messages).message.toLowerCase()).contains("abandoned");
+    assertThat(Iterables.getLast(info.messages).message.toLowerCase()).contains("deadbeef");
+  }
+
+  @Test
+  public void batchAbandonChangeProject() throws Exception {
+    String project1Name = name("Project1");
+    String project2Name = name("Project2");
+    gApi.projects().create(project1Name);
+    gApi.projects().create(project2Name);
+    TestRepository<InMemoryRepository> project1 = cloneProject(new Project.NameKey(project1Name));
+    TestRepository<InMemoryRepository> project2 = cloneProject(new Project.NameKey(project2Name));
+
+    CurrentUser user = atrScope.get().getUser();
+    PushOneCommit.Result a = createChange(project1, "master", "x", "x", "x", "");
+    PushOneCommit.Result b = createChange(project2, "master", "x", "x", "x", "");
+    List<ChangeData> list = ImmutableList.of(a.getChange(), b.getChange());
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage(
+        String.format("Project name \"%s\" doesn't match \"%s\"", project2Name, project1Name));
+    batchAbandon.batchAbandon(batchUpdateFactory, new Project.NameKey(project1Name), user, list);
+  }
+
+  @Test
+  @GerritConfig(name = "changeCleanup.abandonAfter", value = "1w")
+  public void abandonInactiveOpenChanges() throws Exception {
+    TestTimeUtil.resetWithClockStep(1, SECONDS);
+
+    // create 2 changes which will be abandoned ...
+    int id1 = createChange().getChange().getId().get();
+    int id2 = createChange().getChange().getId().get();
+
+    // ... because they are older than 1 week
+    TestTimeUtil.incrementClock(7 * 24, HOURS);
+
+    // create 1 new change that will not be abandoned
+    ChangeData cd = createChange().getChange();
+    int id3 = cd.getId().get();
+
+    assertThat(toChangeNumbers(query("is:open"))).containsExactly(id1, id2, id3);
+    assertThat(query("is:abandoned")).isEmpty();
+
+    abandonUtil.abandonInactiveOpenChanges(batchUpdateFactory);
+    assertThat(toChangeNumbers(query("is:open"))).containsExactly(id3);
+    assertThat(toChangeNumbers(query("is:abandoned"))).containsExactly(id1, id2);
+  }
+
+  @Test
+  public void changeCleanupConfigDefaultAbandonMessage() throws Exception {
+    assertThat(cleanupConfig.getAbandonMessage())
+        .startsWith(
+            "Auto-Abandoned due to inactivity, see "
+                + canonicalWebUrl.get()
+                + "Documentation/user-change-cleanup.html#auto-abandon");
+  }
+
+  @Test
+  @GerritConfig(name = "changeCleanup.abandonMessage", value = "XX ${URL} XX")
+  public void changeCleanupConfigCustomAbandonMessageWithUrlReplacement() throws Exception {
+    assertThat(cleanupConfig.getAbandonMessage())
+        .isEqualTo(
+            "XX "
+                + canonicalWebUrl.get()
+                + "Documentation/user-change-cleanup.html#auto-abandon XX");
+  }
+
+  @Test
+  @GerritConfig(name = "changeCleanup.abandonMessage", value = "XX YYY XX")
+  public void changeCleanupConfigCustomAbandonMessageWithoutUrlReplacement() throws Exception {
+    assertThat(cleanupConfig.getAbandonMessage()).isEqualTo("XX YYY XX");
+  }
+
+  @Test
+  public void abandonNotAllowedWithoutPermission() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String changeId = r.getChangeId();
+    assertThat(info(changeId).status).isEqualTo(ChangeStatus.NEW);
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    exception.expectMessage("abandon not permitted");
+    gApi.changes().id(changeId).abandon();
+  }
+
+  @Test
+  public void abandonAndRestoreAllowedWithPermission() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String changeId = r.getChangeId();
+    assertThat(info(changeId).status).isEqualTo(ChangeStatus.NEW);
+    grant(project, "refs/heads/master", Permission.ABANDON, false, REGISTERED_USERS);
+    setApiUser(user);
+    gApi.changes().id(changeId).abandon();
+    assertThat(info(changeId).status).isEqualTo(ChangeStatus.ABANDONED);
+    gApi.changes().id(changeId).restore();
+    assertThat(info(changeId).status).isEqualTo(ChangeStatus.NEW);
+  }
+
+  @Test
+  public void restore() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String changeId = r.getChangeId();
+    assertThat(info(changeId).status).isEqualTo(ChangeStatus.NEW);
+    gApi.changes().id(changeId).abandon();
+    assertThat(info(changeId).status).isEqualTo(ChangeStatus.ABANDONED);
+
+    gApi.changes().id(changeId).restore();
+    ChangeInfo info = get(changeId, MESSAGES);
+    assertThat(info.status).isEqualTo(ChangeStatus.NEW);
+    assertThat(Iterables.getLast(info.messages).message.toLowerCase()).contains("restored");
+
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("change is new");
+    gApi.changes().id(changeId).restore();
+  }
+
+  @Test
+  public void restoreNotAllowedWithoutPermission() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String changeId = r.getChangeId();
+    assertThat(info(changeId).status).isEqualTo(ChangeStatus.NEW);
+    gApi.changes().id(changeId).abandon();
+    setApiUser(user);
+    assertThat(info(changeId).status).isEqualTo(ChangeStatus.ABANDONED);
+    exception.expect(AuthException.class);
+    exception.expectMessage("restore not permitted");
+    gApi.changes().id(changeId).restore();
+  }
+
+  private List<Integer> toChangeNumbers(List<ChangeInfo> changes) {
+    return changes.stream().map(i -> i._number).collect(toList());
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/api/change/BUILD b/javatests/com/google/gerrit/acceptance/api/change/BUILD
new file mode 100644
index 0000000..9279488
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/change/BUILD
@@ -0,0 +1,11 @@
+load("//javatests/com/google/gerrit/acceptance:tests.bzl", "acceptance_tests")
+
+acceptance_tests(
+    srcs = glob(["*IT.java"]),
+    group = "api_change",
+    labels = [
+        "api",
+        "noci",
+    ],
+    deps = ["//java/com/google/gerrit/server/util/time"],
+)
diff --git a/javatests/com/google/gerrit/acceptance/api/change/ChangeIT.java b/javatests/com/google/gerrit/acceptance/api/change/ChangeIT.java
new file mode 100644
index 0000000..be4b2e1
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/change/ChangeIT.java
@@ -0,0 +1,4210 @@
+// Copyright (C) 2013 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.google.gerrit.acceptance.api.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth8.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static com.google.gerrit.acceptance.GitUtil.assertPushOk;
+import static com.google.gerrit.acceptance.GitUtil.pushHead;
+import static com.google.gerrit.acceptance.PushOneCommit.FILE_CONTENT;
+import static com.google.gerrit.acceptance.PushOneCommit.FILE_NAME;
+import static com.google.gerrit.acceptance.PushOneCommit.SUBJECT;
+import static com.google.gerrit.extensions.client.ListChangesOption.ALL_REVISIONS;
+import static com.google.gerrit.extensions.client.ListChangesOption.CHANGE_ACTIONS;
+import static com.google.gerrit.extensions.client.ListChangesOption.CHECK;
+import static com.google.gerrit.extensions.client.ListChangesOption.COMMIT_FOOTERS;
+import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_ACTIONS;
+import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_COMMIT;
+import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_REVISION;
+import static com.google.gerrit.extensions.client.ListChangesOption.DETAILED_ACCOUNTS;
+import static com.google.gerrit.extensions.client.ListChangesOption.DETAILED_LABELS;
+import static com.google.gerrit.extensions.client.ListChangesOption.LABELS;
+import static com.google.gerrit.extensions.client.ListChangesOption.MESSAGES;
+import static com.google.gerrit.extensions.client.ListChangesOption.PUSH_CERTIFICATES;
+import static com.google.gerrit.extensions.client.ListChangesOption.REVIEWED;
+import static com.google.gerrit.extensions.client.ListChangesOption.TRACKING_IDS;
+import static com.google.gerrit.extensions.client.ReviewerState.CC;
+import static com.google.gerrit.extensions.client.ReviewerState.REMOVED;
+import static com.google.gerrit.extensions.client.ReviewerState.REVIEWER;
+import static com.google.gerrit.reviewdb.client.RefNames.changeMetaRef;
+import static com.google.gerrit.reviewdb.server.ReviewDbUtil.unwrapDb;
+import static com.google.gerrit.server.StarredChangesUtil.DEFAULT_LABEL;
+import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
+import static com.google.gerrit.server.group.SystemGroupBackend.CHANGE_OWNER;
+import static com.google.gerrit.server.group.SystemGroupBackend.PROJECT_OWNERS;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static com.google.gerrit.server.project.testing.Util.category;
+import static com.google.gerrit.server.project.testing.Util.value;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static java.util.stream.Collectors.joining;
+import static java.util.stream.Collectors.toList;
+import static java.util.stream.Collectors.toSet;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.AcceptanceTestRequestScope;
+import com.google.gerrit.acceptance.ChangeIndexedCounter;
+import com.google.gerrit.acceptance.GerritConfig;
+import com.google.gerrit.acceptance.GitUtil;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.TestProjectInput;
+import com.google.gerrit.acceptance.testsuite.account.AccountOperations;
+import com.google.gerrit.common.FooterConstants;
+import com.google.gerrit.common.data.LabelFunction;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.changes.AddReviewerInput;
+import com.google.gerrit.extensions.api.changes.AddReviewerResult;
+import com.google.gerrit.extensions.api.changes.DeleteReviewerInput;
+import com.google.gerrit.extensions.api.changes.DeleteVoteInput;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.api.changes.NotifyInfo;
+import com.google.gerrit.extensions.api.changes.RebaseInput;
+import com.google.gerrit.extensions.api.changes.RecipientType;
+import com.google.gerrit.extensions.api.changes.RevertInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput.DraftHandling;
+import com.google.gerrit.extensions.api.changes.ReviewResult;
+import com.google.gerrit.extensions.api.changes.RevisionApi;
+import com.google.gerrit.extensions.api.changes.StarsInput;
+import com.google.gerrit.extensions.api.groups.GroupApi;
+import com.google.gerrit.extensions.api.projects.BranchApi;
+import com.google.gerrit.extensions.api.projects.BranchInput;
+import com.google.gerrit.extensions.api.projects.ConfigInput;
+import com.google.gerrit.extensions.api.projects.ProjectApi;
+import com.google.gerrit.extensions.api.projects.ProjectInput;
+import com.google.gerrit.extensions.client.ChangeKind;
+import com.google.gerrit.extensions.client.ChangeStatus;
+import com.google.gerrit.extensions.client.Comment.Range;
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.extensions.client.ListChangesOption;
+import com.google.gerrit.extensions.client.ReviewerState;
+import com.google.gerrit.extensions.client.Side;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.ApprovalInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.ChangeInput;
+import com.google.gerrit.extensions.common.ChangeMessageInfo;
+import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.common.CommitInfo;
+import com.google.gerrit.extensions.common.GitPerson;
+import com.google.gerrit.extensions.common.LabelInfo;
+import com.google.gerrit.extensions.common.MergeInput;
+import com.google.gerrit.extensions.common.MergePatchSetInput;
+import com.google.gerrit.extensions.common.PureRevertInfo;
+import com.google.gerrit.extensions.common.RevisionInfo;
+import com.google.gerrit.extensions.common.TrackingIdInfo;
+import com.google.gerrit.extensions.events.ChangeIndexedListener;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.LabelId;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.StarredChangesUtil;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.git.ChangeMessageModifier;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
+import com.google.gerrit.server.project.testing.Util;
+import com.google.gerrit.server.restapi.change.PostReview;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.testing.FakeEmailSender.Message;
+import com.google.gerrit.testing.TestTimeUtil;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Stream;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.PushResult;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+@NoHttpd
+public class ChangeIT extends AbstractDaemonTest {
+  private String systemTimeZone;
+
+  @Inject private DynamicSet<ChangeMessageModifier> changeMessageModifiers;
+
+  @Inject private DynamicSet<ChangeIndexedListener> changeIndexedListeners;
+
+  @Inject private AccountOperations accountOperations;
+
+  private ChangeIndexedCounter changeIndexedCounter;
+  private RegistrationHandle changeIndexedCounterHandle;
+
+  @Before
+  public void setTimeForTesting() {
+    systemTimeZone = System.setProperty("user.timezone", "US/Eastern");
+  }
+
+  @After
+  public void resetTime() {
+    TestTimeUtil.useSystemTime();
+    System.setProperty("user.timezone", systemTimeZone);
+  }
+
+  @Before
+  public void addChangeIndexedCounter() {
+    changeIndexedCounter = new ChangeIndexedCounter();
+    changeIndexedCounterHandle = changeIndexedListeners.add("gerrit", changeIndexedCounter);
+  }
+
+  @After
+  public void removeChangeIndexedCounter() {
+    if (changeIndexedCounterHandle != null) {
+      changeIndexedCounterHandle.remove();
+    }
+  }
+
+  @Test
+  public void get() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String triplet = project.get() + "~master~" + r.getChangeId();
+    ChangeInfo c = info(triplet);
+    assertThat(c.id).isEqualTo(triplet);
+    assertThat(c.project).isEqualTo(project.get());
+    assertThat(c.branch).isEqualTo("master");
+    assertThat(c.status).isEqualTo(ChangeStatus.NEW);
+    assertThat(c.subject).isEqualTo("test commit");
+    assertThat(c.submitType).isEqualTo(SubmitType.MERGE_IF_NECESSARY);
+    assertThat(c.mergeable).isTrue();
+    assertThat(c.changeId).isEqualTo(r.getChangeId());
+    assertThat(c.created).isEqualTo(c.updated);
+    assertThat(c._number).isEqualTo(r.getChange().getId().get());
+
+    assertThat(c.owner._accountId).isEqualTo(admin.getId().get());
+    assertThat(c.owner.name).isNull();
+    assertThat(c.owner.email).isNull();
+    assertThat(c.owner.username).isNull();
+    assertThat(c.owner.avatars).isNull();
+  }
+
+  @Test
+  public void skipMergeable() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String triplet = project.get() + "~master~" + r.getChangeId();
+    ChangeInfo c =
+        gApi.changes().id(triplet).get(ImmutableList.of(ListChangesOption.SKIP_MERGEABLE));
+    assertThat(c.mergeable).isNull();
+
+    c = gApi.changes().id(triplet).get();
+    assertThat(c.mergeable).isTrue();
+  }
+
+  @Test
+  public void setPrivateByOwner() throws Exception {
+    TestRepository<InMemoryRepository> userRepo = cloneProject(project, user);
+    PushOneCommit.Result result =
+        pushFactory.create(db, user.getIdent(), userRepo).to("refs/for/master");
+
+    setApiUser(user);
+    String changeId = result.getChangeId();
+    assertThat(gApi.changes().id(changeId).get().isPrivate).isNull();
+
+    gApi.changes().id(changeId).setPrivate(true, null);
+    ChangeInfo info = gApi.changes().id(changeId).get();
+    assertThat(info.isPrivate).isTrue();
+    assertThat(Iterables.getLast(info.messages).message).isEqualTo("Set private");
+    assertThat(Iterables.getLast(info.messages).tag).contains(ChangeMessagesUtil.TAG_SET_PRIVATE);
+
+    gApi.changes().id(changeId).setPrivate(false, null);
+    info = gApi.changes().id(changeId).get();
+    assertThat(info.isPrivate).isNull();
+    assertThat(Iterables.getLast(info.messages).message).isEqualTo("Unset private");
+    assertThat(Iterables.getLast(info.messages).tag).contains(ChangeMessagesUtil.TAG_UNSET_PRIVATE);
+
+    String msg = "This is a security fix that must not be public.";
+    gApi.changes().id(changeId).setPrivate(true, msg);
+    info = gApi.changes().id(changeId).get();
+    assertThat(info.isPrivate).isTrue();
+    assertThat(Iterables.getLast(info.messages).message).isEqualTo("Set private\n\n" + msg);
+    assertThat(Iterables.getLast(info.messages).tag).contains(ChangeMessagesUtil.TAG_SET_PRIVATE);
+
+    msg = "After this security fix has been released we can make it public now.";
+    gApi.changes().id(changeId).setPrivate(false, msg);
+    info = gApi.changes().id(changeId).get();
+    assertThat(info.isPrivate).isNull();
+    assertThat(Iterables.getLast(info.messages).message).isEqualTo("Unset private\n\n" + msg);
+    assertThat(Iterables.getLast(info.messages).tag).contains(ChangeMessagesUtil.TAG_UNSET_PRIVATE);
+  }
+
+  @Test
+  public void administratorCanSetUserChangePrivate() throws Exception {
+    TestRepository<InMemoryRepository> userRepo = cloneProject(project, user);
+    PushOneCommit.Result result =
+        pushFactory.create(db, user.getIdent(), userRepo).to("refs/for/master");
+
+    String changeId = result.getChangeId();
+    assertThat(gApi.changes().id(changeId).get().isPrivate).isNull();
+
+    gApi.changes().id(changeId).setPrivate(true, null);
+    setApiUser(user);
+    ChangeInfo info = gApi.changes().id(changeId).get();
+    assertThat(info.isPrivate).isTrue();
+  }
+
+  @Test
+  public void cannotSetOtherUsersChangePrivate() throws Exception {
+    PushOneCommit.Result result = createChange();
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    exception.expectMessage("not allowed to mark private");
+    gApi.changes().id(result.getChangeId()).setPrivate(true, null);
+  }
+
+  @Test
+  public void accessPrivate() throws Exception {
+    TestRepository<InMemoryRepository> userRepo = cloneProject(project, user);
+    PushOneCommit.Result result =
+        pushFactory.create(db, user.getIdent(), userRepo).to("refs/for/master");
+
+    setApiUser(user);
+    gApi.changes().id(result.getChangeId()).setPrivate(true, null);
+    // Owner can always access its private changes.
+    assertThat(gApi.changes().id(result.getChangeId()).get().isPrivate).isTrue();
+
+    // Add admin as a reviewer.
+    gApi.changes().id(result.getChangeId()).addReviewer(admin.getId().toString());
+
+    // This change should be visible for admin as a reviewer.
+    setApiUser(admin);
+    assertThat(gApi.changes().id(result.getChangeId()).get().isPrivate).isTrue();
+
+    // Remove admin from reviewers.
+    gApi.changes().id(result.getChangeId()).reviewer(admin.getId().toString()).remove();
+
+    // This change should not be visible for admin anymore.
+    exception.expect(ResourceNotFoundException.class);
+    exception.expectMessage("Not found: " + result.getChangeId());
+    gApi.changes().id(result.getChangeId());
+  }
+
+  @Test
+  public void privateChangeOfOtherUserCanBeAccessedWithPermission() throws Exception {
+    PushOneCommit.Result result = createChange();
+    gApi.changes().id(result.getChangeId()).setPrivate(true, null);
+
+    allow("refs/*", Permission.VIEW_PRIVATE_CHANGES, REGISTERED_USERS);
+    setApiUser(user);
+    assertThat(gApi.changes().id(result.getChangeId()).get().isPrivate).isTrue();
+  }
+
+  @Test
+  public void administratorCanUnmarkPrivateAfterMerging() throws Exception {
+    PushOneCommit.Result result = createChange();
+    String changeId = result.getChangeId();
+    gApi.changes().id(changeId).setPrivate(true, null);
+    assertThat(gApi.changes().id(changeId).get().isPrivate).isTrue();
+    merge(result);
+    gApi.changes().id(changeId).setPrivate(false, null);
+    assertThat(gApi.changes().id(changeId).get().isPrivate).isNull();
+  }
+
+  @Test
+  public void administratorCanMarkPrivateAfterMerging() throws Exception {
+    PushOneCommit.Result result = createChange();
+    String changeId = result.getChangeId();
+    assertThat(gApi.changes().id(changeId).get().isPrivate).isNull();
+    merge(result);
+    gApi.changes().id(changeId).setPrivate(true, null);
+    assertThat(gApi.changes().id(changeId).get().isPrivate).isTrue();
+  }
+
+  @Test
+  public void ownerCannotMarkPrivateAfterMerging() throws Exception {
+    TestRepository<InMemoryRepository> userRepo = cloneProject(project, user);
+    PushOneCommit.Result result =
+        pushFactory.create(db, user.getIdent(), userRepo).to("refs/for/master");
+
+    String changeId = result.getChangeId();
+    assertThat(gApi.changes().id(changeId).get().isPrivate).isNull();
+
+    merge(result);
+
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    exception.expectMessage("not allowed to mark private");
+    gApi.changes().id(changeId).setPrivate(true, null);
+  }
+
+  @Test
+  public void ownerCanUnmarkPrivateAfterMerging() throws Exception {
+    TestRepository<InMemoryRepository> userRepo = cloneProject(project, user);
+    PushOneCommit.Result result =
+        pushFactory.create(db, user.getIdent(), userRepo).to("refs/for/master");
+
+    String changeId = result.getChangeId();
+    assertThat(gApi.changes().id(changeId).get().isPrivate).isNull();
+    gApi.changes().id(changeId).addReviewer(admin.getId().toString());
+    gApi.changes().id(changeId).setPrivate(true, null);
+    assertThat(gApi.changes().id(changeId).get().isPrivate).isTrue();
+
+    merge(result);
+
+    setApiUser(user);
+    gApi.changes().id(changeId).setPrivate(false, null);
+    assertThat(gApi.changes().id(changeId).get().isPrivate).isNull();
+  }
+
+  @Test
+  public void setWorkInProgressNotAllowedWithoutPermission() throws Exception {
+    PushOneCommit.Result rwip = createChange();
+    String changeId = rwip.getChangeId();
+
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    exception.expectMessage("not allowed to toggle work in progress");
+    gApi.changes().id(changeId).setWorkInProgress();
+  }
+
+  @Test
+  public void setWorkInProgressAllowedAsAdmin() throws Exception {
+    setApiUser(user);
+    String changeId =
+        gApi.changes().create(new ChangeInput(project.get(), "master", "Test Change")).get().id;
+
+    setApiUser(admin);
+    gApi.changes().id(changeId).setWorkInProgress();
+    assertThat(gApi.changes().id(changeId).get().workInProgress).isTrue();
+  }
+
+  @Test
+  public void setWorkInProgressAllowedAsProjectOwner() throws Exception {
+    setApiUser(user);
+    String changeId =
+        gApi.changes().create(new ChangeInput(project.get(), "master", "Test Change")).get().id;
+
+    com.google.gerrit.acceptance.TestAccount user2 = accountCreator.user2();
+    grant(project, "refs/*", Permission.OWNER, false, REGISTERED_USERS);
+    setApiUser(user2);
+    gApi.changes().id(changeId).setWorkInProgress();
+    assertThat(gApi.changes().id(changeId).get().workInProgress).isTrue();
+  }
+
+  @Test
+  public void createWipChangeWithWorkInProgressByDefaultForProject() throws Exception {
+    ConfigInput input = new ConfigInput();
+    input.workInProgressByDefault = InheritableBoolean.TRUE;
+    gApi.projects().name(project.get()).config(input);
+    String changeId =
+        gApi.changes().create(new ChangeInput(project.get(), "master", "Test Change")).get().id;
+    assertThat(gApi.changes().id(changeId).get().workInProgress).isTrue();
+  }
+
+  @Test
+  public void setReadyForReviewNotAllowedWithoutPermission() throws Exception {
+    PushOneCommit.Result rready = createChange();
+    String changeId = rready.getChangeId();
+    gApi.changes().id(changeId).setWorkInProgress();
+
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    exception.expectMessage("not allowed to toggle work in progress");
+    gApi.changes().id(changeId).setReadyForReview();
+  }
+
+  @Test
+  public void setReadyForReviewAllowedAsAdmin() throws Exception {
+    setApiUser(user);
+    String changeId =
+        gApi.changes().create(new ChangeInput(project.get(), "master", "Test Change")).get().id;
+    gApi.changes().id(changeId).setWorkInProgress();
+
+    setApiUser(admin);
+    gApi.changes().id(changeId).setReadyForReview();
+    assertThat(gApi.changes().id(changeId).get().workInProgress).isNull();
+  }
+
+  @Test
+  public void setReadyForReviewAllowedAsProjectOwner() throws Exception {
+    setApiUser(user);
+    String changeId =
+        gApi.changes().create(new ChangeInput(project.get(), "master", "Test Change")).get().id;
+    gApi.changes().id(changeId).setWorkInProgress();
+
+    com.google.gerrit.acceptance.TestAccount user2 = accountCreator.user2();
+    grant(project, "refs/*", Permission.OWNER, false, REGISTERED_USERS);
+    setApiUser(user2);
+    gApi.changes().id(changeId).setReadyForReview();
+    assertThat(gApi.changes().id(changeId).get().workInProgress).isNull();
+  }
+
+  @Test
+  public void hasReviewStarted() throws Exception {
+    PushOneCommit.Result r = createWorkInProgressChange();
+    String changeId = r.getChangeId();
+    ChangeInfo info = gApi.changes().id(changeId).get();
+    assertThat(info.hasReviewStarted).isFalse();
+
+    gApi.changes().id(changeId).setReadyForReview();
+    info = gApi.changes().id(changeId).get();
+    assertThat(info.hasReviewStarted).isTrue();
+  }
+
+  @Test
+  public void pendingReviewersInNoteDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    ConfigInput conf = new ConfigInput();
+    conf.enableReviewerByEmail = InheritableBoolean.TRUE;
+    gApi.projects().name(project.get()).config(conf);
+
+    PushOneCommit.Result r = createWorkInProgressChange();
+    String changeId = r.getChangeId();
+    assertThat(gApi.changes().id(changeId).get().pendingReviewers).isEmpty();
+
+    // Add some pending reviewers.
+    String email1 = name("user1") + "@example.com";
+    String email2 = name("user2") + "@example.com";
+    String email3 = name("user3") + "@example.com";
+    String email4 = name("user4") + "@example.com";
+    accountOperations
+        .newAccount()
+        .username(name("user1"))
+        .preferredEmail(email1)
+        .fullname("User 1")
+        .create();
+    accountOperations
+        .newAccount()
+        .username(name("user2"))
+        .preferredEmail(email2)
+        .fullname("User 2")
+        .create();
+    accountOperations
+        .newAccount()
+        .username(name("user3"))
+        .preferredEmail(email3)
+        .fullname("User 3")
+        .create();
+    accountOperations
+        .newAccount()
+        .username(name("user4"))
+        .preferredEmail(email4)
+        .fullname("User 4")
+        .create();
+    ReviewInput in =
+        ReviewInput.noScore()
+            .reviewer(email1)
+            .reviewer(email2)
+            .reviewer(email3, CC, false)
+            .reviewer(email4, CC, false)
+            .reviewer("byemail1@example.com")
+            .reviewer("byemail2@example.com")
+            .reviewer("byemail3@example.com", CC, false)
+            .reviewer("byemail4@example.com", CC, false);
+    ReviewResult result = gApi.changes().id(changeId).revision("current").review(in);
+    assertThat(result.reviewers).isNotEmpty();
+    ChangeInfo info = gApi.changes().id(changeId).get();
+    Function<Collection<AccountInfo>, Collection<String>> toEmails =
+        ais -> ais.stream().map(ai -> ai.email).collect(toSet());
+    assertThat(toEmails.apply(info.pendingReviewers.get(REVIEWER)))
+        .containsExactly(
+            admin.email, email1, email2, "byemail1@example.com", "byemail2@example.com");
+    assertThat(toEmails.apply(info.pendingReviewers.get(CC)))
+        .containsExactly(email3, email4, "byemail3@example.com", "byemail4@example.com");
+    assertThat(info.pendingReviewers.get(REMOVED)).isNull();
+
+    // Stage some pending reviewer removals.
+    gApi.changes().id(changeId).reviewer(email1).remove();
+    gApi.changes().id(changeId).reviewer(email3).remove();
+    gApi.changes().id(changeId).reviewer("byemail1@example.com").remove();
+    gApi.changes().id(changeId).reviewer("byemail3@example.com").remove();
+    info = gApi.changes().id(changeId).get();
+    assertThat(toEmails.apply(info.pendingReviewers.get(REVIEWER)))
+        .containsExactly(admin.email, email2, "byemail2@example.com");
+    assertThat(toEmails.apply(info.pendingReviewers.get(CC)))
+        .containsExactly(email4, "byemail4@example.com");
+    assertThat(toEmails.apply(info.pendingReviewers.get(REMOVED)))
+        .containsExactly(email1, email3, "byemail1@example.com", "byemail3@example.com");
+
+    // "Undo" a removal.
+    in = ReviewInput.noScore().reviewer(email1);
+    gApi.changes().id(changeId).revision("current").review(in);
+    info = gApi.changes().id(changeId).get();
+    assertThat(toEmails.apply(info.pendingReviewers.get(REVIEWER)))
+        .containsExactly(admin.email, email1, email2, "byemail2@example.com");
+    assertThat(toEmails.apply(info.pendingReviewers.get(CC)))
+        .containsExactly(email4, "byemail4@example.com");
+    assertThat(toEmails.apply(info.pendingReviewers.get(REMOVED)))
+        .containsExactly(email3, "byemail1@example.com", "byemail3@example.com");
+
+    // "Commit" by moving out of WIP.
+    gApi.changes().id(changeId).setReadyForReview();
+    info = gApi.changes().id(changeId).get();
+    assertThat(info.pendingReviewers).isEmpty();
+    assertThat(toEmails.apply(info.reviewers.get(REVIEWER)))
+        .containsExactly(admin.email, email1, email2, "byemail2@example.com");
+    assertThat(toEmails.apply(info.reviewers.get(CC)))
+        .containsExactly(email4, "byemail4@example.com");
+    assertThat(info.reviewers.get(REMOVED)).isNull();
+  }
+
+  @Test
+  public void toggleWorkInProgressState() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String changeId = r.getChangeId();
+
+    // With message
+    gApi.changes().id(changeId).setWorkInProgress("Needs some refactoring");
+
+    ChangeInfo info = gApi.changes().id(changeId).get();
+
+    assertThat(info.workInProgress).isTrue();
+    assertThat(Iterables.getLast(info.messages).message).contains("Needs some refactoring");
+    assertThat(Iterables.getLast(info.messages).tag).contains(ChangeMessagesUtil.TAG_SET_WIP);
+
+    gApi.changes().id(changeId).setReadyForReview("PTAL");
+
+    info = gApi.changes().id(changeId).get();
+    assertThat(info.workInProgress).isNull();
+    assertThat(Iterables.getLast(info.messages).message).contains("PTAL");
+    assertThat(Iterables.getLast(info.messages).tag).contains(ChangeMessagesUtil.TAG_SET_READY);
+
+    // No message
+    gApi.changes().id(changeId).setWorkInProgress();
+
+    info = gApi.changes().id(changeId).get();
+
+    assertThat(info.workInProgress).isTrue();
+    assertThat(Iterables.getLast(info.messages).message).isEqualTo("Set Work In Progress");
+    assertThat(Iterables.getLast(info.messages).tag).contains(ChangeMessagesUtil.TAG_SET_WIP);
+
+    gApi.changes().id(changeId).setReadyForReview();
+
+    info = gApi.changes().id(changeId).get();
+    assertThat(info.workInProgress).isNull();
+    assertThat(Iterables.getLast(info.messages).message).isEqualTo("Set Ready For Review");
+    assertThat(Iterables.getLast(info.messages).tag).contains(ChangeMessagesUtil.TAG_SET_READY);
+  }
+
+  @Test
+  public void reviewAndStartReview() throws Exception {
+    PushOneCommit.Result r = createWorkInProgressChange();
+    r.assertOkStatus();
+    assertThat(r.getChange().change().isWorkInProgress()).isTrue();
+
+    ReviewInput in = ReviewInput.noScore().setWorkInProgress(false);
+    ReviewResult result = gApi.changes().id(r.getChangeId()).revision("current").review(in);
+    assertThat(result.ready).isTrue();
+
+    ChangeInfo info = gApi.changes().id(r.getChangeId()).get();
+    assertThat(info.workInProgress).isNull();
+  }
+
+  @Test
+  public void reviewAndMoveToWorkInProgress() throws Exception {
+    PushOneCommit.Result r = createChange();
+    assertThat(r.getChange().change().isWorkInProgress()).isFalse();
+
+    ReviewInput in = ReviewInput.noScore().setWorkInProgress(true);
+    ReviewResult result = gApi.changes().id(r.getChangeId()).revision("current").review(in);
+    assertThat(result.ready).isNull();
+
+    ChangeInfo info = gApi.changes().id(r.getChangeId()).get();
+    assertThat(info.workInProgress).isTrue();
+  }
+
+  @Test
+  public void reviewAndSetWorkInProgressAndAddReviewerAndVote() throws Exception {
+    PushOneCommit.Result r = createChange();
+    assertThat(r.getChange().change().isWorkInProgress()).isFalse();
+
+    ReviewInput in =
+        ReviewInput.approve().reviewer(user.email).label("Code-Review", 1).setWorkInProgress(true);
+    gApi.changes().id(r.getChangeId()).revision("current").review(in);
+
+    ChangeInfo info = gApi.changes().id(r.getChangeId()).get();
+    assertThat(info.workInProgress).isTrue();
+    assertThat(info.reviewers.get(REVIEWER).stream().map(ai -> ai._accountId).collect(toList()))
+        .containsExactly(admin.id.get(), user.id.get());
+    assertThat(info.labels.get("Code-Review").recommended._accountId).isEqualTo(admin.id.get());
+  }
+
+  @Test
+  public void reviewWithWorkInProgressAndReadyReturnsError() throws Exception {
+    PushOneCommit.Result r = createChange();
+    ReviewInput in = ReviewInput.noScore();
+    in.ready = true;
+    in.workInProgress = true;
+    ReviewResult result = gApi.changes().id(r.getChangeId()).revision("current").review(in);
+    assertThat(result.error).isEqualTo(PostReview.ERROR_WIP_READY_MUTUALLY_EXCLUSIVE);
+  }
+
+  @Test
+  @TestProjectInput(cloneAs = "user")
+  public void reviewWithWorkInProgressChangeOwner() throws Exception {
+    PushOneCommit push = pushFactory.create(db, user.getIdent(), testRepo);
+    PushOneCommit.Result r = push.to("refs/for/master");
+    r.assertOkStatus();
+    assertThat(r.getChange().change().getOwner()).isEqualTo(user.id);
+
+    setApiUser(user);
+    ReviewInput in = ReviewInput.noScore().setWorkInProgress(true);
+    gApi.changes().id(r.getChangeId()).current().review(in);
+    ChangeInfo info = gApi.changes().id(r.getChangeId()).get();
+    assertThat(info.workInProgress).isTrue();
+  }
+
+  @Test
+  @TestProjectInput(cloneAs = "user")
+  public void reviewWithWithWorkInProgressAdmin() throws Exception {
+    PushOneCommit push = pushFactory.create(db, user.getIdent(), testRepo);
+    PushOneCommit.Result r = push.to("refs/for/master");
+    r.assertOkStatus();
+    assertThat(r.getChange().change().getOwner()).isEqualTo(user.id);
+
+    setApiUser(admin);
+    ReviewInput in = ReviewInput.noScore().setWorkInProgress(true);
+    gApi.changes().id(r.getChangeId()).current().review(in);
+    ChangeInfo info = gApi.changes().id(r.getChangeId()).get();
+    assertThat(info.workInProgress).isTrue();
+  }
+
+  @Test
+  public void reviewWithWorkInProgressByNonOwnerReturnsError() throws Exception {
+    PushOneCommit.Result r = createChange();
+    ReviewInput in = ReviewInput.noScore().setWorkInProgress(true);
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    exception.expectMessage("not allowed to toggle work in progress");
+    gApi.changes().id(r.getChangeId()).current().review(in);
+  }
+
+  @Test
+  public void reviewWithReadyByNonOwnerReturnsError() throws Exception {
+    PushOneCommit.Result r = createChange();
+    ReviewInput in = ReviewInput.noScore().setReady(true);
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    exception.expectMessage("not allowed to toggle work in progress");
+    gApi.changes().id(r.getChangeId()).current().review(in);
+  }
+
+  @Test
+  public void getAmbiguous() throws Exception {
+    PushOneCommit.Result r1 = createChange();
+    String changeId = r1.getChangeId();
+    gApi.changes().id(changeId).get();
+
+    BranchInput b = new BranchInput();
+    b.revision = repo().exactRef("HEAD").getObjectId().name();
+    gApi.projects().name(project.get()).branch("other").create(b);
+
+    PushOneCommit push2 =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            testRepo,
+            PushOneCommit.SUBJECT,
+            PushOneCommit.FILE_NAME,
+            PushOneCommit.FILE_CONTENT,
+            changeId);
+    PushOneCommit.Result r2 = push2.to("refs/for/other");
+    assertThat(r2.getChangeId()).isEqualTo(changeId);
+
+    exception.expect(ResourceNotFoundException.class);
+    exception.expectMessage("Multiple changes found for " + changeId);
+    gApi.changes().id(changeId).get();
+  }
+
+  @Test
+  public void revert() throws Exception {
+    PushOneCommit.Result r = createChange();
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).submit();
+    ChangeInfo revertChange = gApi.changes().id(r.getChangeId()).revert().get();
+
+    // expected messages on source change:
+    // 1. Uploaded patch set 1.
+    // 2. Patch Set 1: Code-Review+2
+    // 3. Change has been successfully merged by Administrator
+    // 4. Patch Set 1: Reverted
+    List<ChangeMessageInfo> sourceMessages =
+        new ArrayList<>(gApi.changes().id(r.getChangeId()).get().messages);
+    assertThat(sourceMessages).hasSize(4);
+    String expectedMessage =
+        String.format("Created a revert of this change as %s", revertChange.changeId);
+    assertThat(sourceMessages.get(3).message).isEqualTo(expectedMessage);
+
+    assertThat(revertChange.messages).hasSize(1);
+    assertThat(revertChange.messages.iterator().next().message).isEqualTo("Uploaded patch set 1.");
+    assertThat(revertChange.revertOf).isEqualTo(gApi.changes().id(r.getChangeId()).get()._number);
+  }
+
+  @Test
+  public void revertNotifications() throws Exception {
+    PushOneCommit.Result r = createChange();
+    gApi.changes().id(r.getChangeId()).addReviewer(user.email);
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).submit();
+
+    sender.clear();
+    ChangeInfo revertChange = gApi.changes().id(r.getChangeId()).revert().get();
+
+    List<Message> messages = sender.getMessages();
+    assertThat(messages).hasSize(2);
+    assertThat(sender.getMessages(revertChange.changeId, "newchange")).hasSize(1);
+    assertThat(sender.getMessages(r.getChangeId(), "revert")).hasSize(1);
+  }
+
+  @Test
+  public void suppressRevertNotifications() throws Exception {
+    PushOneCommit.Result r = createChange();
+    gApi.changes().id(r.getChangeId()).addReviewer(user.email);
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).submit();
+
+    RevertInput revertInput = new RevertInput();
+    revertInput.notify = NotifyHandling.NONE;
+
+    sender.clear();
+    gApi.changes().id(r.getChangeId()).revert(revertInput).get();
+    assertThat(sender.getMessages()).isEmpty();
+  }
+
+  @Test
+  public void revertPreservesReviewersAndCcs() throws Exception {
+    PushOneCommit.Result r = createChange();
+
+    ReviewInput in = ReviewInput.approve();
+    in.reviewer(user.email);
+    in.reviewer(accountCreator.user2().email, ReviewerState.CC, true);
+    // Add user as reviewer that will create the revert
+    in.reviewer(accountCreator.admin2().email);
+
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(in);
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).submit();
+
+    // expect both the original reviewers and CCs to be preserved
+    // original owner should be added as reviewer, user requesting the revert (new owner) removed
+    setApiUser(accountCreator.admin2());
+    Map<ReviewerState, Collection<AccountInfo>> result =
+        gApi.changes().id(r.getChangeId()).revert().get().reviewers;
+    assertThat(result).containsKey(ReviewerState.REVIEWER);
+
+    List<Integer> reviewers =
+        result.get(ReviewerState.REVIEWER).stream().map(a -> a._accountId).collect(toList());
+    if (notesMigration.readChanges()) {
+      assertThat(result).containsKey(ReviewerState.CC);
+      List<Integer> ccs =
+          result.get(ReviewerState.CC).stream().map(a -> a._accountId).collect(toList());
+      assertThat(ccs).containsExactly(accountCreator.user2().id.get());
+      assertThat(reviewers).containsExactly(user.id.get(), admin.id.get());
+    } else {
+      assertThat(reviewers)
+          .containsExactly(user.id.get(), admin.id.get(), accountCreator.user2().id.get());
+    }
+  }
+
+  @Test
+  @TestProjectInput(createEmptyCommit = false)
+  public void revertInitialCommit() throws Exception {
+    PushOneCommit.Result r = createChange();
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).submit();
+
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("Cannot revert initial commit");
+    gApi.changes().id(r.getChangeId()).revert();
+  }
+
+  @FunctionalInterface
+  private interface Rebase {
+    void call(String id) throws RestApiException;
+  }
+
+  @Test
+  public void rebaseViaRevisionApi() throws Exception {
+    testRebase(id -> gApi.changes().id(id).current().rebase());
+  }
+
+  @Test
+  public void rebaseViaChangeApi() throws Exception {
+    testRebase(id -> gApi.changes().id(id).rebase());
+  }
+
+  private void testRebase(Rebase rebase) throws Exception {
+    // Create two changes both with the same parent
+    PushOneCommit.Result r = createChange();
+    testRepo.reset("HEAD~1");
+    PushOneCommit.Result r2 = createChange();
+
+    // Approve and submit the first change
+    RevisionApi revision = gApi.changes().id(r.getChangeId()).current();
+    revision.review(ReviewInput.approve());
+    revision.submit();
+
+    // Add an approval whose score should be copied on trivial rebase
+    gApi.changes().id(r2.getChangeId()).current().review(ReviewInput.recommend());
+
+    String changeId = r2.getChangeId();
+    // Rebase the second change
+    rebase.call(changeId);
+
+    // Second change should have 2 patch sets and an approval
+    ChangeInfo c2 = gApi.changes().id(changeId).get(CURRENT_REVISION, DETAILED_LABELS);
+    assertThat(c2.revisions.get(c2.currentRevision)._number).isEqualTo(2);
+
+    // ...and the committer and description should be correct
+    ChangeInfo info = gApi.changes().id(changeId).get(CURRENT_REVISION, CURRENT_COMMIT);
+    GitPerson committer = info.revisions.get(info.currentRevision).commit.committer;
+    assertThat(committer.name).isEqualTo(admin.fullName);
+    assertThat(committer.email).isEqualTo(admin.email);
+    String description = info.revisions.get(info.currentRevision).description;
+    assertThat(description).isEqualTo("Rebase");
+
+    // ...and the approval was copied
+    LabelInfo cr = c2.labels.get("Code-Review");
+    assertThat(cr).isNotNull();
+    assertThat(cr.all).hasSize(1);
+    assertThat(cr.all.get(0).value).isEqualTo(1);
+
+    if (notesMigration.changePrimaryStorage() == PrimaryStorage.REVIEW_DB) {
+      // Ensure record was actually copied under ReviewDb
+      List<PatchSetApproval> psas =
+          unwrapDb(db)
+              .patchSetApprovals()
+              .byPatchSet(new PatchSet.Id(new Change.Id(c2._number), 2))
+              .toList();
+      assertThat(psas).hasSize(1);
+      assertThat(psas.get(0).getValue()).isEqualTo((short) 1);
+    }
+
+    // Rebasing the second change again should fail
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("Change is already up to date");
+    gApi.changes().id(changeId).current().rebase();
+  }
+
+  @Test
+  public void rebaseOnChangeNumber() throws Exception {
+    String branchTip = testRepo.getRepository().exactRef("HEAD").getObjectId().name();
+    PushOneCommit.Result r1 = createChange();
+    testRepo.reset("HEAD~1");
+    PushOneCommit.Result r2 = createChange();
+
+    ChangeInfo ci2 = get(r2.getChangeId(), CURRENT_REVISION, CURRENT_COMMIT);
+    RevisionInfo ri2 = ci2.revisions.get(ci2.currentRevision);
+    assertThat(ri2.commit.parents.get(0).commit).isEqualTo(branchTip);
+
+    RebaseInput in = new RebaseInput();
+    in.base = Integer.toString(r1.getChange().getId().get());
+    gApi.changes().id(r2.getChangeId()).rebase(in);
+
+    ci2 = get(r2.getChangeId(), CURRENT_REVISION, CURRENT_COMMIT);
+    ri2 = ci2.revisions.get(ci2.currentRevision);
+    assertThat(ri2.commit.parents.get(0).commit).isEqualTo(r1.getCommit().name());
+  }
+
+  @Test
+  public void rebaseNotAllowedWithoutPermission() throws Exception {
+    // Create two changes both with the same parent
+    PushOneCommit.Result r = createChange();
+    testRepo.reset("HEAD~1");
+    PushOneCommit.Result r2 = createChange();
+
+    // Approve and submit the first change
+    RevisionApi revision = gApi.changes().id(r.getChangeId()).current();
+    revision.review(ReviewInput.approve());
+    revision.submit();
+
+    // Rebase the second
+    String changeId = r2.getChangeId();
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    exception.expectMessage("rebase not permitted");
+    gApi.changes().id(changeId).rebase();
+  }
+
+  @Test
+  public void rebaseAllowedWithPermission() throws Exception {
+    // Create two changes both with the same parent
+    PushOneCommit.Result r = createChange();
+    testRepo.reset("HEAD~1");
+    PushOneCommit.Result r2 = createChange();
+
+    // Approve and submit the first change
+    RevisionApi revision = gApi.changes().id(r.getChangeId()).current();
+    revision.review(ReviewInput.approve());
+    revision.submit();
+
+    grant(project, "refs/heads/master", Permission.REBASE, false, REGISTERED_USERS);
+
+    // Rebase the second
+    String changeId = r2.getChangeId();
+    setApiUser(user);
+    gApi.changes().id(changeId).rebase();
+  }
+
+  @Test
+  public void rebaseNotAllowedWithoutPushPermission() throws Exception {
+    // Create two changes both with the same parent
+    PushOneCommit.Result r = createChange();
+    testRepo.reset("HEAD~1");
+    PushOneCommit.Result r2 = createChange();
+
+    // Approve and submit the first change
+    RevisionApi revision = gApi.changes().id(r.getChangeId()).current();
+    revision.review(ReviewInput.approve());
+    revision.submit();
+
+    grant(project, "refs/heads/master", Permission.REBASE, false, REGISTERED_USERS);
+    block("refs/for/*", Permission.PUSH, REGISTERED_USERS);
+
+    // Rebase the second
+    String changeId = r2.getChangeId();
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    exception.expectMessage("rebase not permitted");
+    gApi.changes().id(changeId).rebase();
+  }
+
+  @Test
+  public void rebaseNotAllowedForOwnerWithoutPushPermission() throws Exception {
+    // Create two changes both with the same parent
+    PushOneCommit.Result r = createChange();
+    testRepo.reset("HEAD~1");
+    PushOneCommit.Result r2 = createChange();
+
+    // Approve and submit the first change
+    RevisionApi revision = gApi.changes().id(r.getChangeId()).current();
+    revision.review(ReviewInput.approve());
+    revision.submit();
+
+    block("refs/for/*", Permission.PUSH, REGISTERED_USERS);
+
+    // Rebase the second
+    String changeId = r2.getChangeId();
+    exception.expect(AuthException.class);
+    exception.expectMessage("rebase not permitted");
+    gApi.changes().id(changeId).rebase();
+  }
+
+  @Test
+  public void deleteNewChangeAsAdmin() throws Exception {
+    deleteChangeAsUser(admin, admin);
+  }
+
+  @Test
+  @TestProjectInput(cloneAs = "user")
+  public void deleteNewChangeAsNormalUser() throws Exception {
+    PushOneCommit.Result changeResult =
+        pushFactory.create(db, user.getIdent(), testRepo).to("refs/for/master");
+    String changeId = changeResult.getChangeId();
+
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    exception.expectMessage("delete not permitted");
+    gApi.changes().id(changeId).delete();
+  }
+
+  @Test
+  public void deleteNewChangeAsUserWithDeleteChangesPermissionForGroup() throws Exception {
+    allow("refs/*", Permission.DELETE_CHANGES, REGISTERED_USERS);
+    deleteChangeAsUser(admin, user);
+  }
+
+  @Test
+  public void deleteNewChangeAsUserWithDeleteChangesPermissionForProjectOwners() throws Exception {
+    GroupApi groupApi = gApi.groups().create(name("delete-change"));
+    groupApi.addMembers("user");
+
+    ProjectInput in = new ProjectInput();
+    in.name = name("delete-change");
+    in.owners = Lists.newArrayListWithCapacity(1);
+    in.owners.add(groupApi.name());
+    in.createEmptyCommit = true;
+    ProjectApi api = gApi.projects().create(in);
+
+    Project.NameKey nameKey = new Project.NameKey(api.get().name);
+
+    try (ProjectConfigUpdate u = updateProject(nameKey)) {
+      Util.allow(u.getConfig(), Permission.DELETE_CHANGES, PROJECT_OWNERS, "refs/*");
+      u.save();
+    }
+
+    deleteChangeAsUser(nameKey, admin, user);
+  }
+
+  @Test
+  public void deleteChangeAsUserWithDeleteOwnChangesPermissionForGroup() throws Exception {
+    allow("refs/*", Permission.DELETE_OWN_CHANGES, REGISTERED_USERS);
+    deleteChangeAsUser(user, user);
+  }
+
+  @Test
+  public void deleteChangeAsUserWithDeleteOwnChangesPermissionForOwners() throws Exception {
+    allow("refs/*", Permission.DELETE_OWN_CHANGES, CHANGE_OWNER);
+    deleteChangeAsUser(user, user);
+  }
+
+  private void deleteChangeAsUser(
+      com.google.gerrit.acceptance.TestAccount owner,
+      com.google.gerrit.acceptance.TestAccount deleteAs)
+      throws Exception {
+    deleteChangeAsUser(project, owner, deleteAs);
+  }
+
+  private void deleteChangeAsUser(
+      Project.NameKey projectName,
+      com.google.gerrit.acceptance.TestAccount owner,
+      com.google.gerrit.acceptance.TestAccount deleteAs)
+      throws Exception {
+    try {
+      setApiUser(owner);
+      ChangeInput in = new ChangeInput();
+      in.project = projectName.get();
+      in.branch = "refs/heads/master";
+      in.subject = "test";
+      ChangeInfo changeInfo = gApi.changes().create(in).get();
+      String changeId = changeInfo.changeId;
+      int id = changeInfo._number;
+      String commit = changeInfo.currentRevision;
+
+      assertThat(gApi.changes().id(changeId).info().owner._accountId).isEqualTo(owner.id.get());
+
+      setApiUser(deleteAs);
+      gApi.changes().id(changeId).delete();
+
+      assertThat(query(changeId)).isEmpty();
+
+      String ref = new Change.Id(id).toRefPrefix() + "1";
+      eventRecorder.assertRefUpdatedEvents(projectName.get(), ref, null, commit, commit, null);
+      eventRecorder.assertChangeDeletedEvents(changeId, deleteAs.email);
+    } finally {
+      removePermission(project, "refs/*", Permission.DELETE_OWN_CHANGES);
+      removePermission(project, "refs/*", Permission.DELETE_CHANGES);
+    }
+  }
+
+  @Test
+  public void deleteNewChangeOfAnotherUserAsAdmin() throws Exception {
+    deleteChangeAsUser(user, admin);
+  }
+
+  @Test
+  public void deleteNewChangeOfAnotherUserWithDeleteOwnChangesPermission() throws Exception {
+    allow("refs/*", Permission.DELETE_OWN_CHANGES, REGISTERED_USERS);
+
+    try {
+      PushOneCommit.Result changeResult = createChange();
+      String changeId = changeResult.getChangeId();
+
+      setApiUser(user);
+      exception.expect(AuthException.class);
+      exception.expectMessage("delete not permitted");
+      gApi.changes().id(changeId).delete();
+    } finally {
+      removePermission(project, "refs/*", Permission.DELETE_OWN_CHANGES);
+    }
+  }
+
+  @Test
+  @TestProjectInput(createEmptyCommit = false)
+  public void deleteNewChangeForBranchWithoutCommits() throws Exception {
+    PushOneCommit.Result changeResult = createChange();
+    String changeId = changeResult.getChangeId();
+
+    gApi.changes().id(changeId).delete();
+
+    assertThat(query(changeId)).isEmpty();
+  }
+
+  @Test
+  @TestProjectInput(cloneAs = "user")
+  public void deleteAbandonedChangeAsNormalUser() throws Exception {
+    PushOneCommit.Result changeResult =
+        pushFactory.create(db, user.getIdent(), testRepo).to("refs/for/master");
+    String changeId = changeResult.getChangeId();
+
+    setApiUser(user);
+    gApi.changes().id(changeId).abandon();
+
+    exception.expect(AuthException.class);
+    exception.expectMessage("delete not permitted");
+    gApi.changes().id(changeId).delete();
+  }
+
+  @Test
+  @TestProjectInput(cloneAs = "user")
+  public void deleteAbandonedChangeOfAnotherUserAsAdmin() throws Exception {
+    PushOneCommit.Result changeResult =
+        pushFactory.create(db, user.getIdent(), testRepo).to("refs/for/master");
+    String changeId = changeResult.getChangeId();
+
+    gApi.changes().id(changeId).abandon();
+
+    gApi.changes().id(changeId).delete();
+
+    assertThat(query(changeId)).isEmpty();
+  }
+
+  @Test
+  public void deleteMergedChange() throws Exception {
+    PushOneCommit.Result changeResult = createChange();
+    String changeId = changeResult.getChangeId();
+
+    merge(changeResult);
+
+    exception.expect(MethodNotAllowedException.class);
+    exception.expectMessage("delete not permitted");
+    gApi.changes().id(changeId).delete();
+  }
+
+  @Test
+  @TestProjectInput(cloneAs = "user")
+  public void deleteMergedChangeWithDeleteOwnChangesPermission() throws Exception {
+    allow("refs/*", Permission.DELETE_OWN_CHANGES, REGISTERED_USERS);
+
+    try {
+      PushOneCommit.Result changeResult =
+          pushFactory.create(db, user.getIdent(), testRepo).to("refs/for/master");
+      String changeId = changeResult.getChangeId();
+
+      merge(changeResult);
+
+      setApiUser(user);
+      exception.expect(MethodNotAllowedException.class);
+      exception.expectMessage("delete not permitted");
+      gApi.changes().id(changeId).delete();
+    } finally {
+      removePermission(project, "refs/*", Permission.DELETE_OWN_CHANGES);
+    }
+  }
+
+  @Test
+  public void deleteNewChangeWithMergedPatchSet() throws Exception {
+    PushOneCommit.Result changeResult = createChange();
+    String changeId = changeResult.getChangeId();
+    Change.Id id = changeResult.getChange().getId();
+
+    merge(changeResult);
+    setChangeStatus(id, Change.Status.NEW);
+
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage(
+        String.format("Cannot delete change %s: patch set 1 is already merged", id));
+    gApi.changes().id(changeId).delete();
+  }
+
+  @Test
+  public void rebaseUpToDateChange() throws Exception {
+    PushOneCommit.Result r = createChange();
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("Change is already up to date");
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).rebase();
+  }
+
+  @Test
+  public void rebaseConflict() throws Exception {
+    PushOneCommit.Result r = createChange();
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).submit();
+
+    PushOneCommit push =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            testRepo,
+            PushOneCommit.SUBJECT,
+            PushOneCommit.FILE_NAME,
+            "other content",
+            "If09d8782c1e59dd0b33de2b1ec3595d69cc10ad5");
+    r = push.to("refs/for/master");
+    r.assertOkStatus();
+
+    exception.expect(ResourceConflictException.class);
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).rebase();
+  }
+
+  @Test
+  public void rebaseChangeBase() throws Exception {
+    PushOneCommit.Result r1 = createChange();
+    PushOneCommit.Result r2 = createChange();
+    PushOneCommit.Result r3 = createChange();
+    RebaseInput ri = new RebaseInput();
+
+    // rebase r3 directly onto master (break dep. towards r2)
+    ri.base = "";
+    gApi.changes().id(r3.getChangeId()).revision(r3.getCommit().name()).rebase(ri);
+    PatchSet ps3 = r3.getPatchSet();
+    assertThat(ps3.getId().get()).isEqualTo(2);
+
+    // rebase r2 onto r3 (referenced by ref)
+    ri.base = ps3.getId().toRefName();
+    gApi.changes().id(r2.getChangeId()).revision(r2.getCommit().name()).rebase(ri);
+    PatchSet ps2 = r2.getPatchSet();
+    assertThat(ps2.getId().get()).isEqualTo(2);
+
+    // rebase r1 onto r2 (referenced by commit)
+    ri.base = ps2.getRevision().get();
+    gApi.changes().id(r1.getChangeId()).revision(r1.getCommit().name()).rebase(ri);
+    PatchSet ps1 = r1.getPatchSet();
+    assertThat(ps1.getId().get()).isEqualTo(2);
+
+    // rebase r1 onto r3 (referenced by change number)
+    ri.base = String.valueOf(r3.getChange().getId().get());
+    gApi.changes().id(r1.getChangeId()).revision(ps1.getRevision().get()).rebase(ri);
+    assertThat(r1.getPatchSetId().get()).isEqualTo(3);
+  }
+
+  @Test
+  public void rebaseChangeBaseRecursion() throws Exception {
+    PushOneCommit.Result r1 = createChange();
+    PushOneCommit.Result r2 = createChange();
+
+    RebaseInput ri = new RebaseInput();
+    ri.base = r2.getCommit().name();
+    String expectedMessage =
+        "base change "
+            + r2.getChangeId()
+            + " is a descendant of the current change - recursion not allowed";
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage(expectedMessage);
+    gApi.changes().id(r1.getChangeId()).revision(r1.getCommit().name()).rebase(ri);
+  }
+
+  @Test
+  public void rebaseAbandonedChange() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String changeId = r.getChangeId();
+    assertThat(info(changeId).status).isEqualTo(ChangeStatus.NEW);
+    gApi.changes().id(changeId).abandon();
+    ChangeInfo info = info(changeId);
+    assertThat(info.status).isEqualTo(ChangeStatus.ABANDONED);
+
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("change is abandoned");
+    gApi.changes().id(changeId).revision(r.getCommit().name()).rebase();
+  }
+
+  @Test
+  public void rebaseOntoAbandonedChange() throws Exception {
+    // Create two changes both with the same parent
+    PushOneCommit.Result r = createChange();
+    testRepo.reset("HEAD~1");
+    PushOneCommit.Result r2 = createChange();
+
+    // Abandon the first change
+    String changeId = r.getChangeId();
+    assertThat(info(changeId).status).isEqualTo(ChangeStatus.NEW);
+    gApi.changes().id(changeId).abandon();
+    ChangeInfo info = info(changeId);
+    assertThat(info.status).isEqualTo(ChangeStatus.ABANDONED);
+
+    RebaseInput ri = new RebaseInput();
+    ri.base = r.getCommit().name();
+
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("base change is abandoned: " + changeId);
+    gApi.changes().id(r2.getChangeId()).revision(r2.getCommit().name()).rebase(ri);
+  }
+
+  @Test
+  public void rebaseOntoSelf() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String changeId = r.getChangeId();
+    String commit = r.getCommit().name();
+    RebaseInput ri = new RebaseInput();
+    ri.base = commit;
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("cannot rebase change onto itself");
+    gApi.changes().id(changeId).revision(commit).rebase(ri);
+  }
+
+  @Test
+  @TestProjectInput(createEmptyCommit = false)
+  public void changeNoParentToOneParent() throws Exception {
+    // create initial commit with no parent and push it as change, so that patch
+    // set 1 has no parent
+    RevCommit c = testRepo.commit().message("Initial commit").insertChangeId().create();
+    String id = GitUtil.getChangeId(testRepo, c).get();
+    testRepo.reset(c);
+
+    PushResult pr = pushHead(testRepo, "refs/for/master", false);
+    assertPushOk(pr, "refs/for/master");
+
+    ChangeInfo change = gApi.changes().id(id).get();
+    assertThat(change.revisions.get(change.currentRevision).commit.parents).isEmpty();
+
+    // create another initial commit with no parent and push it directly into
+    // the remote repository
+    c = testRepo.amend(c.getId()).message("Initial Empty Commit").create();
+    testRepo.reset(c);
+    pr = pushHead(testRepo, "refs/heads/master", false);
+    assertPushOk(pr, "refs/heads/master");
+
+    // create a successor commit and push it as second patch set to the change,
+    // so that patch set 2 has 1 parent
+    RevCommit c2 =
+        testRepo
+            .commit()
+            .message("Initial commit")
+            .parent(c)
+            .insertChangeId(id.substring(1))
+            .create();
+    testRepo.reset(c2);
+
+    pr = pushHead(testRepo, "refs/for/master", false);
+    assertPushOk(pr, "refs/for/master");
+
+    change = gApi.changes().id(id).get();
+    RevisionInfo rev = change.revisions.get(change.currentRevision);
+    assertThat(rev.commit.parents).hasSize(1);
+    assertThat(rev.commit.parents.get(0).commit).isEqualTo(c.name());
+
+    // check that change kind is correctly detected as REWORK
+    assertThat(rev.kind).isEqualTo(ChangeKind.REWORK);
+  }
+
+  @Test
+  public void pushCommitOfOtherUser() throws Exception {
+    // admin pushes commit of user
+    PushOneCommit push = pushFactory.create(db, user.getIdent(), testRepo);
+    PushOneCommit.Result result = push.to("refs/for/master");
+    result.assertOkStatus();
+
+    ChangeInfo change = gApi.changes().id(result.getChangeId()).get();
+    assertThat(change.owner._accountId).isEqualTo(admin.id.get());
+    CommitInfo commit = change.revisions.get(change.currentRevision).commit;
+    assertThat(commit.author.email).isEqualTo(user.email);
+    assertThat(commit.committer.email).isEqualTo(user.email);
+
+    // check that the author/committer was added as reviewer
+    Collection<AccountInfo> reviewers = change.reviewers.get(REVIEWER);
+    assertThat(reviewers).isNotNull();
+    assertThat(reviewers).hasSize(1);
+    assertThat(reviewers.iterator().next()._accountId).isEqualTo(user.getId().get());
+    assertThat(change.reviewers.get(CC)).isNull();
+
+    List<Message> messages = sender.getMessages();
+    assertThat(messages).hasSize(1);
+    Message m = messages.get(0);
+    assertThat(m.from().getName()).isEqualTo("Administrator (Code Review)");
+    assertThat(m.rcpt()).containsExactly(user.emailAddress);
+    assertThat(m.body()).contains("I'd like you to do a code review");
+    assertThat(m.body()).contains("Change subject: " + PushOneCommit.SUBJECT + "\n");
+    assertMailReplyTo(m, admin.email);
+  }
+
+  @Test
+  public void pushCommitOfOtherUserThatCannotSeeChange() throws Exception {
+    // create hidden project that is only visible to administrators
+    Project.NameKey p = createProject("p");
+    try (ProjectConfigUpdate u = updateProject(p)) {
+      Util.allow(u.getConfig(), Permission.READ, adminGroupUuid(), "refs/*");
+      Util.block(u.getConfig(), Permission.READ, REGISTERED_USERS, "refs/*");
+      u.save();
+    }
+
+    // admin pushes commit of user
+    TestRepository<InMemoryRepository> repo = cloneProject(p, admin);
+    PushOneCommit push = pushFactory.create(db, user.getIdent(), repo);
+    PushOneCommit.Result result = push.to("refs/for/master");
+    result.assertOkStatus();
+
+    ChangeInfo change = gApi.changes().id(result.getChangeId()).get();
+    assertThat(change.owner._accountId).isEqualTo(admin.id.get());
+    CommitInfo commit = change.revisions.get(change.currentRevision).commit;
+    assertThat(commit.author.email).isEqualTo(user.email);
+    assertThat(commit.committer.email).isEqualTo(user.email);
+
+    // check the user cannot see the change
+    setApiUser(user);
+    try {
+      gApi.changes().id(result.getChangeId()).get();
+      fail("Expected ResourceNotFoundException");
+    } catch (ResourceNotFoundException e) {
+      // Expected.
+    }
+
+    // check that the author/committer was NOT added as reviewer (he can't see
+    // the change)
+    assertThat(change.reviewers.get(REVIEWER)).isNull();
+    assertThat(change.reviewers.get(CC)).isNull();
+    assertThat(sender.getMessages()).isEmpty();
+  }
+
+  @Test
+  public void pushCommitWithFooterOfOtherUser() throws Exception {
+    // admin pushes commit that references 'user' in a footer
+    PushOneCommit push =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            testRepo,
+            PushOneCommit.SUBJECT
+                + "\n\n"
+                + FooterConstants.REVIEWED_BY.getName()
+                + ": "
+                + user.getIdent().toExternalString(),
+            PushOneCommit.FILE_NAME,
+            PushOneCommit.FILE_CONTENT);
+    PushOneCommit.Result result = push.to("refs/for/master");
+    result.assertOkStatus();
+
+    // check that 'user' was added as reviewer
+    ChangeInfo change = gApi.changes().id(result.getChangeId()).get();
+    Collection<AccountInfo> reviewers = change.reviewers.get(REVIEWER);
+    assertThat(reviewers).isNotNull();
+    assertThat(reviewers).hasSize(1);
+    assertThat(reviewers.iterator().next()._accountId).isEqualTo(user.getId().get());
+    assertThat(change.reviewers.get(CC)).isNull();
+
+    List<Message> messages = sender.getMessages();
+    assertThat(messages).hasSize(1);
+    Message m = messages.get(0);
+    assertThat(m.rcpt()).containsExactly(user.emailAddress);
+    assertThat(m.body()).contains("Hello " + user.fullName + ",\n");
+    assertThat(m.body()).contains("I'd like you to do a code review.");
+    assertThat(m.body()).contains("Change subject: " + PushOneCommit.SUBJECT + "\n");
+    assertMailReplyTo(m, admin.email);
+  }
+
+  @Test
+  public void pushCommitWithFooterOfOtherUserThatCannotSeeChange() throws Exception {
+    // create hidden project that is only visible to administrators
+    Project.NameKey p = createProject("p");
+    try (ProjectConfigUpdate u = updateProject(p)) {
+      Util.allow(u.getConfig(), Permission.READ, adminGroupUuid(), "refs/*");
+      Util.block(u.getConfig(), Permission.READ, REGISTERED_USERS, "refs/*");
+      u.save();
+    }
+
+    // admin pushes commit that references 'user' in a footer
+    TestRepository<InMemoryRepository> repo = cloneProject(p, admin);
+    PushOneCommit push =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            repo,
+            PushOneCommit.SUBJECT
+                + "\n\n"
+                + FooterConstants.REVIEWED_BY.getName()
+                + ": "
+                + user.getIdent().toExternalString(),
+            PushOneCommit.FILE_NAME,
+            PushOneCommit.FILE_CONTENT);
+    PushOneCommit.Result result = push.to("refs/for/master");
+    result.assertOkStatus();
+
+    // check that 'user' cannot see the change
+    setApiUser(user);
+    try {
+      gApi.changes().id(result.getChangeId()).get();
+      fail("Expected ResourceNotFoundException");
+    } catch (ResourceNotFoundException e) {
+      // Expected.
+    }
+
+    // check that 'user' was NOT added as cc ('user' can't see the change)
+    setApiUser(admin);
+    ChangeInfo change = gApi.changes().id(result.getChangeId()).get();
+    assertThat(change.reviewers.get(REVIEWER)).isNull();
+    assertThat(change.reviewers.get(CC)).isNull();
+    assertThat(sender.getMessages()).isEmpty();
+  }
+
+  @Test
+  public void addReviewerThatCannotSeeChange() throws Exception {
+    // create hidden project that is only visible to administrators
+    Project.NameKey p = createProject("p");
+    try (ProjectConfigUpdate u = updateProject(p)) {
+      Util.allow(u.getConfig(), Permission.READ, adminGroupUuid(), "refs/*");
+      Util.block(u.getConfig(), Permission.READ, REGISTERED_USERS, "refs/*");
+      u.save();
+    }
+
+    // create change
+    TestRepository<InMemoryRepository> repo = cloneProject(p, admin);
+    PushOneCommit push = pushFactory.create(db, admin.getIdent(), repo);
+    PushOneCommit.Result result = push.to("refs/for/master");
+    result.assertOkStatus();
+
+    // check the user cannot see the change
+    setApiUser(user);
+    try {
+      gApi.changes().id(result.getChangeId()).get();
+      fail("Expected ResourceNotFoundException");
+    } catch (ResourceNotFoundException e) {
+      // Expected.
+    }
+
+    // try to add user as reviewer
+    setApiUser(admin);
+    AddReviewerInput in = new AddReviewerInput();
+    in.reviewer = user.email;
+    AddReviewerResult r = gApi.changes().id(result.getChangeId()).addReviewer(in);
+
+    assertThat(r.input).isEqualTo(user.email);
+    assertThat(r.error).contains("does not have permission to see this change");
+    assertThat(r.reviewers).isNull();
+  }
+
+  @Test
+  public void addReviewerThatIsInactive() throws Exception {
+    PushOneCommit.Result result = createChange();
+
+    String username = name("new-user");
+    gApi.accounts().create(username).setActive(false);
+
+    AddReviewerInput in = new AddReviewerInput();
+    in.reviewer = username;
+    AddReviewerResult r = gApi.changes().id(result.getChangeId()).addReviewer(in);
+
+    assertThat(r.input).isEqualTo(username);
+    assertThat(r.error).contains("identifies an inactive account");
+    assertThat(r.reviewers).isNull();
+  }
+
+  @Test
+  public void addReviewerThatIsInactiveEmailFallback() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    ConfigInput conf = new ConfigInput();
+    conf.enableReviewerByEmail = InheritableBoolean.TRUE;
+    gApi.projects().name(project.get()).config(conf);
+
+    PushOneCommit.Result result = createChange();
+
+    String username = "user@domain.com";
+    gApi.accounts().create(username).setActive(false);
+
+    AddReviewerInput in = new AddReviewerInput();
+    in.reviewer = username;
+    in.state = ReviewerState.CC;
+    AddReviewerResult r = gApi.changes().id(result.getChangeId()).addReviewer(in);
+
+    assertThat(r.input).isEqualTo(username);
+    assertThat(r.error).isNull();
+    // When adding by email, the reviewers field is also empty because we can't
+    // render a ReviewerInfo object for a non-account.
+    assertThat(r.reviewers).isNull();
+  }
+
+  @Test
+  public void addReviewer() throws Exception {
+    TestTimeUtil.resetWithClockStep(1, SECONDS);
+    PushOneCommit.Result r = createChange();
+    ChangeResource rsrc = parseResource(r);
+    String oldETag = rsrc.getETag();
+    Timestamp oldTs = rsrc.getChange().getLastUpdatedOn();
+
+    AddReviewerInput in = new AddReviewerInput();
+    in.reviewer = user.email;
+    gApi.changes().id(r.getChangeId()).addReviewer(in);
+
+    List<Message> messages = sender.getMessages();
+    assertThat(messages).hasSize(1);
+    Message m = messages.get(0);
+    assertThat(m.rcpt()).containsExactly(user.emailAddress);
+    assertThat(m.body()).contains("Hello " + user.fullName + ",\n");
+    assertThat(m.body()).contains("I'd like you to do a code review.");
+    assertThat(m.body()).contains("Change subject: " + PushOneCommit.SUBJECT + "\n");
+    assertMailReplyTo(m, admin.email);
+    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
+
+    // When NoteDb is enabled adding a reviewer records that user as reviewer
+    // in NoteDb. When NoteDb is disabled adding a reviewer results in a dummy 0
+    // approval on the change which is treated as CC when the ChangeInfo is
+    // created.
+    Collection<AccountInfo> reviewers = c.reviewers.get(REVIEWER);
+    assertThat(reviewers).isNotNull();
+    assertThat(reviewers).hasSize(1);
+    assertThat(reviewers.iterator().next()._accountId).isEqualTo(user.getId().get());
+
+    // Ensure ETag and lastUpdatedOn are updated.
+    rsrc = parseResource(r);
+    assertThat(rsrc.getETag()).isNotEqualTo(oldETag);
+    assertThat(rsrc.getChange().getLastUpdatedOn()).isNotEqualTo(oldTs);
+
+    // Change status of reviewer and ensure ETag is updated.
+    oldETag = rsrc.getETag();
+    accountOperations.account(user.id).forUpdate().status("new status").update();
+    rsrc = parseResource(r);
+    assertThat(rsrc.getETag()).isNotEqualTo(oldETag);
+  }
+
+  @Test
+  public void listReviewers() throws Exception {
+    PushOneCommit.Result r = createChange();
+    AddReviewerInput in = new AddReviewerInput();
+    in.reviewer = user.email;
+    gApi.changes().id(r.getChangeId()).addReviewer(in);
+    assertThat(gApi.changes().id(r.getChangeId()).reviewers()).hasSize(1);
+
+    String username1 = name("user1");
+    String email1 = username1 + "@example.com";
+    accountOperations
+        .newAccount()
+        .username(username1)
+        .preferredEmail(email1)
+        .fullname("User 1")
+        .create();
+    in.reviewer = email1;
+    in.state = ReviewerState.CC;
+    gApi.changes().id(r.getChangeId()).addReviewer(in);
+    assertThat(gApi.changes().id(r.getChangeId()).reviewers().stream().map(a -> a.username))
+        .containsExactly(user.username, username1);
+  }
+
+  @Test
+  public void notificationsForAddedWorkInProgressReviewers() throws Exception {
+    AddReviewerInput in = new AddReviewerInput();
+    in.reviewer = user.email;
+    ReviewInput batchIn = new ReviewInput();
+    batchIn.reviewers = ImmutableList.of(in);
+
+    // Added reviewers not notified by default.
+    PushOneCommit.Result r = createWorkInProgressChange();
+    gApi.changes().id(r.getChangeId()).addReviewer(in);
+    assertThat(sender.getMessages()).hasSize(0);
+
+    // Default notification handling can be overridden.
+    r = createWorkInProgressChange();
+    in.notify = NotifyHandling.OWNER_REVIEWERS;
+    gApi.changes().id(r.getChangeId()).addReviewer(in);
+    assertThat(sender.getMessages()).hasSize(1);
+    sender.clear();
+
+    // Reviewers added via PostReview also not notified by default.
+    // In this case, the child ReviewerInput has a notify=OWNER_REVIEWERS
+    // that should be ignored.
+    r = createWorkInProgressChange();
+    gApi.changes().id(r.getChangeId()).revision("current").review(batchIn);
+    assertThat(sender.getMessages()).hasSize(0);
+
+    // Top-level notify property can force notifications when adding reviewer
+    // via PostReview.
+    r = createWorkInProgressChange();
+    batchIn.notify = NotifyHandling.OWNER_REVIEWERS;
+    gApi.changes().id(r.getChangeId()).revision("current").review(batchIn);
+    assertThat(sender.getMessages()).hasSize(1);
+  }
+
+  @Test
+  public void addReviewerThatIsNotPerfectMatch() throws Exception {
+    TestTimeUtil.resetWithClockStep(1, SECONDS);
+    PushOneCommit.Result r = createChange();
+    ChangeResource rsrc = parseResource(r);
+    String oldETag = rsrc.getETag();
+    Timestamp oldTs = rsrc.getChange().getLastUpdatedOn();
+
+    // create a group named "ab" with one user: testUser
+    String email = "abcd@test.com";
+    String fullname = "abcd";
+    Account.Id accountIdOfTestUser =
+        accountOperations
+            .newAccount()
+            .username("abcd")
+            .preferredEmail(email)
+            .fullname(fullname)
+            .create();
+    String testGroup = createGroupWithRealName("ab");
+    GroupApi groupApi = gApi.groups().id(testGroup);
+    groupApi.description("test group");
+    groupApi.addMembers(user.fullName);
+
+    AddReviewerInput in = new AddReviewerInput();
+    in.reviewer = "abc";
+    gApi.changes().id(r.getChangeId()).addReviewer(in.reviewer);
+
+    List<Message> messages = sender.getMessages();
+    assertThat(messages).hasSize(1);
+    Message m = messages.get(0);
+    assertThat(m.rcpt()).containsExactly(new Address(fullname, email));
+    assertThat(m.body()).contains("Hello " + fullname + ",\n");
+    assertThat(m.body()).contains("I'd like you to do a code review.");
+    assertThat(m.body()).contains("Change subject: " + PushOneCommit.SUBJECT + "\n");
+    assertMailReplyTo(m, email);
+    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
+
+    // When NoteDb is enabled adding a reviewer records that user as reviewer
+    // in NoteDb. When NoteDb is disabled adding a reviewer results in a dummy 0
+    // approval on the change which is treated as CC when the ChangeInfo is
+    // created.
+    Collection<AccountInfo> reviewers = c.reviewers.get(REVIEWER);
+    assertThat(reviewers).isNotNull();
+    assertThat(reviewers).hasSize(1);
+    assertThat(reviewers.iterator().next()._accountId).isEqualTo(accountIdOfTestUser.get());
+
+    // Ensure ETag and lastUpdatedOn are updated.
+    rsrc = parseResource(r);
+    assertThat(rsrc.getETag()).isNotEqualTo(oldETag);
+    assertThat(rsrc.getChange().getLastUpdatedOn()).isNotEqualTo(oldTs);
+  }
+
+  @Test
+  public void addGroupAsReviewersWhenANotPerfectMatchedUserExists() throws Exception {
+    TestTimeUtil.resetWithClockStep(1, SECONDS);
+    PushOneCommit.Result r = createChange();
+    ChangeResource rsrc = parseResource(r);
+    String oldETag = rsrc.getETag();
+    Timestamp oldTs = rsrc.getChange().getLastUpdatedOn();
+
+    // create a group named "kobe" with one user: lee
+    String testUserFullname = "kobebryant";
+    accountOperations
+        .newAccount()
+        .username("kobebryant")
+        .preferredEmail("kobebryant@test.com")
+        .fullname(testUserFullname)
+        .create();
+
+    String myGroupUserEmail = "lee@test.com";
+    String myGroupUserFullname = "lee";
+    Account.Id accountIdOfGroupUser =
+        accountOperations
+            .newAccount()
+            .username("lee")
+            .preferredEmail(myGroupUserEmail)
+            .fullname(myGroupUserFullname)
+            .create();
+
+    String testGroup = createGroupWithRealName("kobe");
+    GroupApi groupApi = gApi.groups().id(testGroup);
+    groupApi.description("test group");
+    groupApi.addMembers(myGroupUserFullname);
+
+    // ensure that user "user" is not in the group
+    groupApi.removeMembers(testUserFullname);
+
+    AddReviewerInput in = new AddReviewerInput();
+    in.reviewer = testGroup;
+    gApi.changes().id(r.getChangeId()).addReviewer(in.reviewer);
+
+    List<Message> messages = sender.getMessages();
+    assertThat(messages).hasSize(1);
+    Message m = messages.get(0);
+    assertThat(m.rcpt()).containsExactly(new Address(myGroupUserFullname, myGroupUserEmail));
+    assertThat(m.body()).contains("Hello " + myGroupUserFullname + ",\n");
+    assertThat(m.body()).contains("I'd like you to do a code review.");
+    assertThat(m.body()).contains("Change subject: " + PushOneCommit.SUBJECT + "\n");
+    assertMailReplyTo(m, myGroupUserEmail);
+    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
+
+    // When NoteDb is enabled adding a reviewer records that user as reviewer
+    // in NoteDb. When NoteDb is disabled adding a reviewer results in a dummy 0
+    // approval on the change which is treated as CC when the ChangeInfo is
+    // created.
+    Collection<AccountInfo> reviewers = c.reviewers.get(REVIEWER);
+    assertThat(reviewers).isNotNull();
+    assertThat(reviewers).hasSize(1);
+    assertThat(reviewers.iterator().next()._accountId).isEqualTo(accountIdOfGroupUser.get());
+
+    // Ensure ETag and lastUpdatedOn are updated.
+    rsrc = parseResource(r);
+    assertThat(rsrc.getETag()).isNotEqualTo(oldETag);
+    assertThat(rsrc.getChange().getLastUpdatedOn()).isNotEqualTo(oldTs);
+  }
+
+  @Test
+  public void addReviewerWithNoteDbWhenDummyApprovalInReviewDbExists() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    assume().that(notesMigration.changePrimaryStorage()).isEqualTo(PrimaryStorage.REVIEW_DB);
+
+    PushOneCommit.Result r = createChange();
+
+    // insert dummy approval in ReviewDb
+    PatchSetApproval psa =
+        new PatchSetApproval(
+            new PatchSetApproval.Key(r.getPatchSetId(), user.id, new LabelId("Code-Review")),
+            (short) 0,
+            TimeUtil.nowTs());
+    db.patchSetApprovals().insert(Collections.singleton(psa));
+
+    AddReviewerInput in = new AddReviewerInput();
+    in.reviewer = user.email;
+    gApi.changes().id(r.getChangeId()).addReviewer(in);
+  }
+
+  @Test
+  public void addSelfAsReviewer() throws Exception {
+    TestTimeUtil.resetWithClockStep(1, SECONDS);
+    PushOneCommit.Result r = createChange();
+    ChangeResource rsrc = parseResource(r);
+    String oldETag = rsrc.getETag();
+    Timestamp oldTs = rsrc.getChange().getLastUpdatedOn();
+
+    AddReviewerInput in = new AddReviewerInput();
+    in.reviewer = user.email;
+    setApiUser(user);
+    gApi.changes().id(r.getChangeId()).addReviewer(in);
+
+    // There should be no email notification when adding self
+    assertThat(sender.getMessages()).isEmpty();
+
+    // When NoteDb is enabled adding a reviewer records that user as reviewer
+    // in NoteDb. When NoteDb is disabled adding a reviewer results in a dummy 0
+    // approval on the change which is treated as CC when the ChangeInfo is
+    // created.
+    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
+    Collection<AccountInfo> reviewers = c.reviewers.get(REVIEWER);
+    assertThat(reviewers).isNotNull();
+    assertThat(reviewers).hasSize(1);
+    assertThat(reviewers.iterator().next()._accountId).isEqualTo(user.getId().get());
+
+    // Ensure ETag and lastUpdatedOn are updated.
+    rsrc = parseResource(r);
+    assertThat(rsrc.getETag()).isNotEqualTo(oldETag);
+    assertThat(rsrc.getChange().getLastUpdatedOn()).isNotEqualTo(oldTs);
+  }
+
+  @Test
+  public void implicitlyCcOnNonVotingReviewPgStyle() throws Exception {
+    testImplicitlyCcOnNonVotingReviewPgStyle(user);
+  }
+
+  @Test
+  public void implicitlyCcOnNonVotingReviewForUserWithoutUserNamePgStyle() throws Exception {
+    com.google.gerrit.acceptance.TestAccount accountWithoutUsername = accountCreator.create();
+    assertThat(accountWithoutUsername.username).isNull();
+    testImplicitlyCcOnNonVotingReviewPgStyle(accountWithoutUsername);
+  }
+
+  private void testImplicitlyCcOnNonVotingReviewPgStyle(
+      com.google.gerrit.acceptance.TestAccount testAccount) throws Exception {
+    PushOneCommit.Result r = createChange();
+    setApiUser(testAccount);
+    assertThat(getReviewerState(r.getChangeId(), testAccount.id)).isEmpty();
+
+    // Exact request format made by PG UI at ddc6b7160fe416fed9e7e3180489d44c82fd64f8.
+    ReviewInput in = new ReviewInput();
+    in.drafts = DraftHandling.PUBLISH_ALL_REVISIONS;
+    in.labels = ImmutableMap.of();
+    in.message = "comment";
+    in.reviewers = ImmutableList.of();
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(in);
+
+    // If we're not reading from NoteDb, then the CCed user will be returned in the REVIEWER state.
+    assertThat(getReviewerState(r.getChangeId(), testAccount.id))
+        .hasValue(notesMigration.readChanges() ? CC : REVIEWER);
+  }
+
+  @Test
+  public void implicitlyCcOnNonVotingReviewGwtStyle() throws Exception {
+    testImplicitlyCcOnNonVotingReviewGwtStyle(user);
+  }
+
+  @Test
+  public void implicitlyCcOnNonVotingReviewForUserWithoutUserNameGwtStyle() throws Exception {
+    com.google.gerrit.acceptance.TestAccount accountWithoutUsername = accountCreator.create();
+    assertThat(accountWithoutUsername.username).isNull();
+    testImplicitlyCcOnNonVotingReviewGwtStyle(accountWithoutUsername);
+  }
+
+  private void testImplicitlyCcOnNonVotingReviewGwtStyle(
+      com.google.gerrit.acceptance.TestAccount testAccount) throws Exception {
+    PushOneCommit.Result r = createChange();
+    setApiUser(testAccount);
+    assertThat(getReviewerState(r.getChangeId(), testAccount.id)).isEmpty();
+
+    // Exact request format made by GWT UI at ddc6b7160fe416fed9e7e3180489d44c82fd64f8.
+    ReviewInput in = new ReviewInput();
+    in.labels = ImmutableMap.of("Code-Review", (short) 0);
+    in.drafts = DraftHandling.PUBLISH_ALL_REVISIONS;
+    in.message = "comment";
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(in);
+
+    // If we're not reading from NoteDb, then the CCed user will be returned in the REVIEWER state.
+    assertThat(getReviewerState(r.getChangeId(), testAccount.id))
+        .hasValue(notesMigration.readChanges() ? CC : REVIEWER);
+  }
+
+  @Test
+  public void implicitlyAddReviewerOnVotingReview() throws Exception {
+    PushOneCommit.Result r = createChange();
+    setApiUser(user);
+    gApi.changes()
+        .id(r.getChangeId())
+        .revision(r.getCommit().name())
+        .review(ReviewInput.recommend().message("LGTM"));
+
+    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
+    assertThat(c.reviewers.get(REVIEWER).stream().map(ai -> ai._accountId).collect(toList()))
+        .containsExactly(user.id.get());
+
+    // Further test: remove the vote, then comment again. The user should be
+    // implicitly re-added to the ReviewerSet, as a CC if we're using NoteDb.
+    setApiUser(admin);
+    gApi.changes().id(r.getChangeId()).reviewer(user.getId().toString()).remove();
+    c = gApi.changes().id(r.getChangeId()).get();
+    assertThat(c.reviewers.values()).isEmpty();
+
+    setApiUser(user);
+    gApi.changes()
+        .id(r.getChangeId())
+        .revision(r.getCommit().name())
+        .review(new ReviewInput().message("hi"));
+    c = gApi.changes().id(r.getChangeId()).get();
+    ReviewerState state = notesMigration.readChanges() ? CC : REVIEWER;
+    assertThat(c.reviewers.get(state).stream().map(ai -> ai._accountId).collect(toList()))
+        .containsExactly(user.id.get());
+  }
+
+  @Test
+  public void addReviewerToClosedChange() throws Exception {
+    PushOneCommit.Result r = createChange();
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).submit();
+
+    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
+    Collection<AccountInfo> reviewers = c.reviewers.get(REVIEWER);
+    assertThat(reviewers).hasSize(1);
+    assertThat(reviewers.iterator().next()._accountId).isEqualTo(admin.getId().get());
+    assertThat(c.reviewers).doesNotContainKey(CC);
+
+    AddReviewerInput in = new AddReviewerInput();
+    in.reviewer = user.email;
+    gApi.changes().id(r.getChangeId()).addReviewer(in);
+
+    c = gApi.changes().id(r.getChangeId()).get();
+    reviewers = c.reviewers.get(REVIEWER);
+    assertThat(reviewers).hasSize(2);
+    Iterator<AccountInfo> reviewerIt = reviewers.iterator();
+    assertThat(reviewerIt.next()._accountId).isEqualTo(admin.getId().get());
+    assertThat(reviewerIt.next()._accountId).isEqualTo(user.getId().get());
+    assertThat(c.reviewers).doesNotContainKey(CC);
+  }
+
+  @Test
+  public void eTagChangesWhenOwnerUpdatesAccountStatus() throws Exception {
+    PushOneCommit.Result r = createChange();
+    ChangeResource rsrc = parseResource(r);
+    String oldETag = rsrc.getETag();
+
+    gApi.accounts().id(admin.id.get()).setStatus("new status");
+    rsrc = parseResource(r);
+    assertThat(rsrc.getETag()).isNotEqualTo(oldETag);
+  }
+
+  @Test
+  public void emailNotificationForFileLevelComment() throws Exception {
+    String changeId = createChange().getChangeId();
+
+    AddReviewerInput in = new AddReviewerInput();
+    in.reviewer = user.email;
+    gApi.changes().id(changeId).addReviewer(in);
+    sender.clear();
+
+    ReviewInput review = new ReviewInput();
+    ReviewInput.CommentInput comment = new ReviewInput.CommentInput();
+    comment.path = PushOneCommit.FILE_NAME;
+    comment.side = Side.REVISION;
+    comment.message = "comment 1";
+    review.comments = new HashMap<>();
+    review.comments.put(comment.path, Lists.newArrayList(comment));
+    gApi.changes().id(changeId).current().review(review);
+
+    assertThat(sender.getMessages()).hasSize(1);
+    Message m = sender.getMessages().get(0);
+    assertThat(m.rcpt()).containsExactly(user.emailAddress);
+  }
+
+  @Test
+  public void invalidRange() throws Exception {
+    String changeId = createChange().getChangeId();
+
+    ReviewInput review = new ReviewInput();
+    ReviewInput.CommentInput comment = new ReviewInput.CommentInput();
+
+    comment.range = new Range();
+    comment.range.startLine = 1;
+    comment.range.endLine = 1;
+    comment.range.startCharacter = -1;
+    comment.range.endCharacter = 0;
+
+    comment.path = PushOneCommit.FILE_NAME;
+    comment.side = Side.REVISION;
+    comment.message = "comment 1";
+    review.comments = ImmutableMap.of(comment.path, Lists.newArrayList(comment));
+
+    exception.expect(BadRequestException.class);
+    gApi.changes().id(changeId).current().review(review);
+  }
+
+  @Test
+  public void listVotes() throws Exception {
+    PushOneCommit.Result r = createChange();
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
+
+    Map<String, Short> m =
+        gApi.changes().id(r.getChangeId()).reviewer(admin.getId().toString()).votes();
+
+    assertThat(m).hasSize(1);
+    assertThat(m).containsEntry("Code-Review", Short.valueOf((short) 2));
+
+    setApiUser(user);
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.dislike());
+
+    m = gApi.changes().id(r.getChangeId()).reviewer(user.getId().toString()).votes();
+
+    assertThat(m).hasSize(1);
+    assertThat(m).containsEntry("Code-Review", Short.valueOf((short) -1));
+  }
+
+  @Test
+  public void removeReviewerNoVotes() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      LabelType verified =
+          category("Verified", value(1, "Passes"), value(0, "No score"), value(-1, "Failed"));
+      u.getConfig().getLabelSections().put(verified.getName(), verified);
+      AccountGroup.UUID registeredUsers = systemGroupBackend.getGroup(REGISTERED_USERS).getUUID();
+      String heads = RefNames.REFS_HEADS + "*";
+      Util.allow(
+          u.getConfig(),
+          Permission.forLabel(Util.verified().getName()),
+          -1,
+          1,
+          registeredUsers,
+          heads);
+      u.save();
+    }
+
+    PushOneCommit.Result r = createChange();
+    String changeId = r.getChangeId();
+    gApi.changes().id(changeId).addReviewer(user.getId().toString());
+
+    // ReviewerState will vary between ReviewDb and NoteDb; we just care that it
+    // shows up somewhere.
+    Iterable<AccountInfo> reviewers =
+        Iterables.concat(gApi.changes().id(changeId).get().reviewers.values());
+    assertThat(reviewers).hasSize(1);
+    assertThat(reviewers.iterator().next()._accountId).isEqualTo(user.getId().get());
+
+    sender.clear();
+    gApi.changes().id(changeId).reviewer(user.getId().toString()).remove();
+    assertThat(gApi.changes().id(changeId).get().reviewers).isEmpty();
+
+    assertThat(sender.getMessages()).hasSize(1);
+    Message message = sender.getMessages().get(0);
+    assertThat(message.body()).contains("Removed reviewer " + user.fullName + ".");
+    assertThat(message.body()).doesNotContain("with the following votes");
+
+    // Make sure the reviewer can still be added again.
+    gApi.changes().id(changeId).addReviewer(user.getId().toString());
+    reviewers = Iterables.concat(gApi.changes().id(changeId).get().reviewers.values());
+    assertThat(reviewers).hasSize(1);
+    assertThat(reviewers.iterator().next()._accountId).isEqualTo(user.getId().get());
+
+    // Remove again, and then try to remove once more to verify 404 is
+    // returned.
+    gApi.changes().id(changeId).reviewer(user.getId().toString()).remove();
+    exception.expect(ResourceNotFoundException.class);
+    gApi.changes().id(changeId).reviewer(user.getId().toString()).remove();
+  }
+
+  @Test
+  public void removeReviewer() throws Exception {
+    testRemoveReviewer(true);
+  }
+
+  @Test
+  public void removeNoNotify() throws Exception {
+    testRemoveReviewer(false);
+  }
+
+  private void testRemoveReviewer(boolean notify) throws Exception {
+    PushOneCommit.Result r = createChange();
+    String changeId = r.getChangeId();
+    gApi.changes().id(changeId).revision(r.getCommit().name()).review(ReviewInput.approve());
+
+    setApiUser(user);
+    gApi.changes().id(changeId).revision(r.getCommit().name()).review(ReviewInput.recommend());
+
+    Collection<AccountInfo> reviewers = gApi.changes().id(changeId).get().reviewers.get(REVIEWER);
+
+    assertThat(reviewers).hasSize(2);
+    Iterator<AccountInfo> reviewerIt = reviewers.iterator();
+    assertThat(reviewerIt.next()._accountId).isEqualTo(admin.getId().get());
+    assertThat(reviewerIt.next()._accountId).isEqualTo(user.getId().get());
+
+    sender.clear();
+    setApiUser(admin);
+    DeleteReviewerInput input = new DeleteReviewerInput();
+    if (!notify) {
+      input.notify = NotifyHandling.NONE;
+    }
+    gApi.changes().id(changeId).reviewer(user.getId().toString()).remove(input);
+
+    if (notify) {
+      assertThat(sender.getMessages()).hasSize(1);
+      Message message = sender.getMessages().get(0);
+      assertThat(message.body())
+          .contains("Removed reviewer " + user.fullName + " with the following votes");
+      assertThat(message.body()).contains("* Code-Review+1 by " + user.fullName);
+    } else {
+      assertThat(sender.getMessages()).isEmpty();
+    }
+
+    reviewers = gApi.changes().id(changeId).get().reviewers.get(REVIEWER);
+    assertThat(reviewers).hasSize(1);
+    reviewerIt = reviewers.iterator();
+    assertThat(reviewerIt.next()._accountId).isEqualTo(admin.getId().get());
+
+    eventRecorder.assertReviewerDeletedEvents(changeId, user.email);
+  }
+
+  @Test
+  public void removeReviewerNotPermitted() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String changeId = r.getChangeId();
+    gApi.changes().id(changeId).revision(r.getCommit().name()).review(ReviewInput.approve());
+
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    exception.expectMessage("remove reviewer not permitted");
+    gApi.changes().id(r.getChangeId()).reviewer(admin.getId().toString()).remove();
+  }
+
+  @Test
+  public void removeReviewerSelfFromMergedChangeNotPermitted() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String changeId = r.getChangeId();
+
+    setApiUser(user);
+    recommend(changeId);
+
+    setApiUser(admin);
+    approve(changeId);
+    gApi.changes().id(changeId).revision(r.getCommit().name()).submit();
+
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    exception.expectMessage("remove reviewer not permitted");
+    gApi.changes().id(r.getChangeId()).reviewer("self").remove();
+  }
+
+  @Test
+  public void removeReviewerSelfFromAbandonedChangePermitted() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String changeId = r.getChangeId();
+
+    setApiUser(user);
+    recommend(changeId);
+
+    setApiUser(admin);
+    gApi.changes().id(changeId).abandon();
+
+    setApiUser(user);
+    gApi.changes().id(r.getChangeId()).reviewer("self").remove();
+    eventRecorder.assertReviewerDeletedEvents(changeId, user.email);
+  }
+
+  @Test
+  public void removeOtherReviewerFromAbandonedChangeNotPermitted() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String changeId = r.getChangeId();
+
+    setApiUser(user);
+    recommend(changeId);
+
+    setApiUser(admin);
+    approve(changeId);
+    gApi.changes().id(changeId).abandon();
+
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    exception.expectMessage("remove reviewer not permitted");
+    gApi.changes().id(r.getChangeId()).reviewer(admin.getId().toString()).remove();
+  }
+
+  @Test
+  public void deleteVote() throws Exception {
+    PushOneCommit.Result r = createChange();
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
+
+    setApiUser(user);
+    recommend(r.getChangeId());
+
+    setApiUser(admin);
+    sender.clear();
+    gApi.changes().id(r.getChangeId()).reviewer(user.getId().toString()).deleteVote("Code-Review");
+
+    List<Message> messages = sender.getMessages();
+    assertThat(messages).hasSize(1);
+    Message msg = messages.get(0);
+    assertThat(msg.rcpt()).containsExactly(user.emailAddress);
+    assertThat(msg.body()).contains(admin.fullName + " has removed a vote on this change.\n");
+    assertThat(msg.body())
+        .contains("Removed Code-Review+1 by " + user.fullName + " <" + user.email + ">\n");
+
+    Map<String, Short> m =
+        gApi.changes().id(r.getChangeId()).reviewer(user.getId().toString()).votes();
+
+    // Dummy 0 approval on the change to block vote copying to this patch set.
+    assertThat(m).containsExactly("Code-Review", Short.valueOf((short) 0));
+
+    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
+
+    ChangeMessageInfo message = Iterables.getLast(c.messages);
+    assertThat(message.author._accountId).isEqualTo(admin.getId().get());
+    assertThat(message.message).isEqualTo("Removed Code-Review+1 by User <user@example.com>\n");
+    assertThat(getReviewers(c.reviewers.get(REVIEWER)))
+        .containsExactlyElementsIn(ImmutableSet.of(admin.getId(), user.getId()));
+  }
+
+  @Test
+  public void deleteVoteNotifyNone() throws Exception {
+    PushOneCommit.Result r = createChange();
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
+
+    setApiUser(user);
+    recommend(r.getChangeId());
+
+    setApiUser(admin);
+    sender.clear();
+    DeleteVoteInput in = new DeleteVoteInput();
+    in.label = "Code-Review";
+    in.notify = NotifyHandling.NONE;
+    gApi.changes().id(r.getChangeId()).reviewer(user.getId().toString()).deleteVote(in);
+    assertThat(sender.getMessages()).isEmpty();
+  }
+
+  @Test
+  public void deleteVoteNotifyAccount() throws Exception {
+    PushOneCommit.Result r = createChange();
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
+
+    DeleteVoteInput in = new DeleteVoteInput();
+    in.label = "Code-Review";
+    in.notify = NotifyHandling.NONE;
+
+    // notify unrelated account as TO
+    String email = "user2@example.com";
+    accountOperations
+        .newAccount()
+        .username("user2")
+        .preferredEmail(email)
+        .fullname("User2")
+        .create();
+    setApiUser(user);
+    recommend(r.getChangeId());
+    setApiUser(admin);
+    sender.clear();
+    in.notifyDetails = new HashMap<>();
+    in.notifyDetails.put(RecipientType.TO, new NotifyInfo(ImmutableList.of(email)));
+    gApi.changes().id(r.getChangeId()).reviewer(user.getId().toString()).deleteVote(in);
+    assertNotifyTo(email, "User2");
+
+    // notify unrelated account as CC
+    setApiUser(user);
+    recommend(r.getChangeId());
+    setApiUser(admin);
+    sender.clear();
+    in.notifyDetails = new HashMap<>();
+    in.notifyDetails.put(RecipientType.CC, new NotifyInfo(ImmutableList.of(email)));
+    gApi.changes().id(r.getChangeId()).reviewer(user.getId().toString()).deleteVote(in);
+    assertNotifyCc(email, "User2");
+
+    // notify unrelated account as BCC
+    setApiUser(user);
+    recommend(r.getChangeId());
+    setApiUser(admin);
+    sender.clear();
+    in.notifyDetails = new HashMap<>();
+    in.notifyDetails.put(RecipientType.BCC, new NotifyInfo(ImmutableList.of(email)));
+    gApi.changes().id(r.getChangeId()).reviewer(user.getId().toString()).deleteVote(in);
+    assertNotifyBcc(email, "User2");
+  }
+
+  @Test
+  public void deleteVoteNotPermitted() throws Exception {
+    PushOneCommit.Result r = createChange();
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
+
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    exception.expectMessage("delete vote not permitted");
+    gApi.changes().id(r.getChangeId()).reviewer(admin.getId().toString()).deleteVote("Code-Review");
+  }
+
+  @Test
+  public void nonVotingReviewerStaysAfterSubmit() throws Exception {
+    LabelType verified =
+        category("Verified", value(1, "Passes"), value(0, "No score"), value(-1, "Failed"));
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      u.getConfig().getLabelSections().put(verified.getName(), verified);
+      String heads = "refs/heads/*";
+      AccountGroup.UUID owners = systemGroupBackend.getGroup(CHANGE_OWNER).getUUID();
+      AccountGroup.UUID registered = systemGroupBackend.getGroup(REGISTERED_USERS).getUUID();
+      Util.allow(u.getConfig(), Permission.forLabel(verified.getName()), -1, 1, owners, heads);
+      Util.allow(u.getConfig(), Permission.forLabel("Code-Review"), -2, +2, registered, heads);
+      u.save();
+    }
+
+    // Set Code-Review+2 and Verified+1 as admin (change owner)
+    PushOneCommit.Result r = createChange();
+    String changeId = r.getChangeId();
+    String commit = r.getCommit().name();
+    ReviewInput input = ReviewInput.approve();
+    input.label(verified.getName(), 1);
+    gApi.changes().id(changeId).revision(commit).review(input);
+
+    // Reviewers should only be "admin"
+    ChangeInfo c = gApi.changes().id(changeId).get();
+    assertThat(getReviewers(c.reviewers.get(REVIEWER)))
+        .containsExactlyElementsIn(ImmutableSet.of(admin.getId()));
+    assertThat(c.reviewers.get(CC)).isNull();
+
+    // Add the user as reviewer
+    AddReviewerInput in = new AddReviewerInput();
+    in.reviewer = user.email;
+    gApi.changes().id(changeId).addReviewer(in);
+    c = gApi.changes().id(changeId).get();
+    assertThat(getReviewers(c.reviewers.get(REVIEWER)))
+        .containsExactlyElementsIn(ImmutableSet.of(admin.getId(), user.getId()));
+
+    // Approve the change as user, then remove the approval
+    // (only to confirm that the user does have Code-Review+2 permission)
+    setApiUser(user);
+    gApi.changes().id(changeId).revision(commit).review(ReviewInput.approve());
+    gApi.changes().id(changeId).revision(commit).review(ReviewInput.noScore());
+
+    // Submit the change
+    setApiUser(admin);
+    gApi.changes().id(changeId).revision(commit).submit();
+
+    // User should still be on the change
+    c = gApi.changes().id(changeId).get();
+    assertThat(getReviewers(c.reviewers.get(REVIEWER)))
+        .containsExactlyElementsIn(ImmutableSet.of(admin.getId(), user.getId()));
+  }
+
+  @Test
+  public void createEmptyChange() throws Exception {
+    ChangeInput in = new ChangeInput();
+    in.branch = Constants.MASTER;
+    in.subject = "Create a change from the API";
+    in.project = project.get();
+    ChangeInfo info = gApi.changes().create(in).get();
+    assertThat(info.project).isEqualTo(in.project);
+    assertThat(info.branch).isEqualTo(in.branch);
+    assertThat(info.subject).isEqualTo(in.subject);
+    assertThat(Iterables.getOnlyElement(info.messages).message).isEqualTo("Uploaded patch set 1.");
+  }
+
+  @Test
+  public void queryChangesNoQuery() throws Exception {
+    PushOneCommit.Result r = createChange();
+    List<ChangeInfo> results = gApi.changes().query().get();
+    assertThat(results.size()).isAtLeast(1);
+    List<Integer> ids = new ArrayList<>(results.size());
+    for (int i = 0; i < results.size(); i++) {
+      ChangeInfo info = results.get(i);
+      if (i == 0) {
+        assertThat(info._number).isEqualTo(r.getChange().getId().get());
+      }
+      assertThat(Change.Status.forChangeStatus(info.status).isOpen()).isTrue();
+      ids.add(info._number);
+    }
+    assertThat(ids).contains(r.getChange().getId().get());
+  }
+
+  @Test
+  public void queryChangesNoResults() throws Exception {
+    createChange();
+    assertThat(query("message:test")).isNotEmpty();
+    assertThat(query("message:{" + getClass().getName() + "fhqwhgads}")).isEmpty();
+  }
+
+  @Test
+  public void queryChanges() throws Exception {
+    PushOneCommit.Result r1 = createChange();
+    createChange();
+    List<ChangeInfo> results = query("project:{" + project.get() + "} " + r1.getChangeId());
+    assertThat(Iterables.getOnlyElement(results).changeId).isEqualTo(r1.getChangeId());
+  }
+
+  @Test
+  public void queryChangesLimit() throws Exception {
+    createChange();
+    PushOneCommit.Result r2 = createChange();
+    List<ChangeInfo> results = gApi.changes().query().withLimit(1).get();
+    assertThat(results).hasSize(1);
+    assertThat(Iterables.getOnlyElement(results).changeId).isEqualTo(r2.getChangeId());
+  }
+
+  @Test
+  public void queryChangesStart() throws Exception {
+    PushOneCommit.Result r1 = createChange();
+    createChange();
+    List<ChangeInfo> results =
+        gApi.changes().query("project:{" + project.get() + "}").withStart(1).get();
+    assertThat(Iterables.getOnlyElement(results).changeId).isEqualTo(r1.getChangeId());
+  }
+
+  @Test
+  public void queryChangesNoOptions() throws Exception {
+    PushOneCommit.Result r = createChange();
+    ChangeInfo result = Iterables.getOnlyElement(query(r.getChangeId()));
+    assertThat(result.labels).isNull();
+    assertThat(result.messages).isNull();
+    assertThat(result.revisions).isNull();
+    assertThat(result.actions).isNull();
+  }
+
+  @Test
+  public void queryChangesOptions() throws Exception {
+    PushOneCommit.Result r = createChange();
+
+    ChangeInfo result = Iterables.getOnlyElement(gApi.changes().query(r.getChangeId()).get());
+    assertThat(result.labels).isNull();
+    assertThat(result.messages).isNull();
+    assertThat(result.actions).isNull();
+    assertThat(result.revisions).isNull();
+
+    result =
+        Iterables.getOnlyElement(
+            gApi.changes()
+                .query(r.getChangeId())
+                .withOptions(
+                    ALL_REVISIONS, CHANGE_ACTIONS, CURRENT_ACTIONS, DETAILED_LABELS, MESSAGES)
+                .get());
+    assertThat(Iterables.getOnlyElement(result.labels.keySet())).isEqualTo("Code-Review");
+    assertThat(result.messages).hasSize(1);
+    assertThat(result.actions).isNotEmpty();
+
+    RevisionInfo rev = Iterables.getOnlyElement(result.revisions.values());
+    assertThat(rev._number).isEqualTo(r.getPatchSetId().get());
+    assertThat(rev.created).isNotNull();
+    assertThat(rev.uploader._accountId).isEqualTo(admin.getId().get());
+    assertThat(rev.ref).isEqualTo(r.getPatchSetId().toRefName());
+    assertThat(rev.actions).isNotEmpty();
+  }
+
+  @Test
+  public void queryChangesOwnerWithDifferentUsers() throws Exception {
+    PushOneCommit.Result r = createChange();
+    assertThat(
+            Iterables.getOnlyElement(query("project:{" + project.get() + "} owner:self")).changeId)
+        .isEqualTo(r.getChangeId());
+    setApiUser(user);
+    assertThat(query("owner:self project:{" + project.get() + "}")).isEmpty();
+  }
+
+  @Test
+  public void checkReviewedFlagBeforeAndAfterReview() throws Exception {
+    PushOneCommit.Result r = createChange();
+    AddReviewerInput in = new AddReviewerInput();
+    in.reviewer = user.email;
+    gApi.changes().id(r.getChangeId()).addReviewer(in);
+
+    setApiUser(user);
+    assertThat(get(r.getChangeId(), REVIEWED).reviewed).isNull();
+
+    revision(r).review(ReviewInput.recommend());
+    assertThat(get(r.getChangeId(), REVIEWED).reviewed).isTrue();
+  }
+
+  @Test
+  public void topic() throws Exception {
+    PushOneCommit.Result r = createChange();
+    assertThat(gApi.changes().id(r.getChangeId()).topic()).isEqualTo("");
+    gApi.changes().id(r.getChangeId()).topic("mytopic");
+    assertThat(gApi.changes().id(r.getChangeId()).topic()).isEqualTo("mytopic");
+    gApi.changes().id(r.getChangeId()).topic("");
+    assertThat(gApi.changes().id(r.getChangeId()).topic()).isEqualTo("");
+  }
+
+  @Test
+  public void editTopicWithoutPermissionNotAllowed() throws Exception {
+    PushOneCommit.Result r = createChange();
+    assertThat(gApi.changes().id(r.getChangeId()).topic()).isEqualTo("");
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    exception.expectMessage("edit topic name not permitted");
+    gApi.changes().id(r.getChangeId()).topic("mytopic");
+  }
+
+  @Test
+  public void editTopicWithPermissionAllowed() throws Exception {
+    PushOneCommit.Result r = createChange();
+    assertThat(gApi.changes().id(r.getChangeId()).topic()).isEqualTo("");
+    grant(project, "refs/heads/master", Permission.EDIT_TOPIC_NAME, false, REGISTERED_USERS);
+    setApiUser(user);
+    gApi.changes().id(r.getChangeId()).topic("mytopic");
+    assertThat(gApi.changes().id(r.getChangeId()).topic()).isEqualTo("mytopic");
+  }
+
+  @Test
+  public void submitted() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String id = r.getChangeId();
+
+    ChangeInfo c = gApi.changes().id(r.getChangeId()).info();
+    assertThat(c.submitted).isNull();
+    assertThat(c.submitter).isNull();
+
+    gApi.changes().id(id).current().review(ReviewInput.approve());
+    gApi.changes().id(id).current().submit();
+
+    c = gApi.changes().id(r.getChangeId()).info();
+    assertThat(c.submitted).isNotNull();
+    assertThat(c.submitter).isNotNull();
+    assertThat(c.submitter._accountId).isEqualTo(atrScope.get().getUser().getAccountId().get());
+  }
+
+  @Test
+  public void submitStaleChange() throws Exception {
+    PushOneCommit.Result r = createChange();
+
+    disableChangeIndexWrites();
+    try {
+      r = amendChange(r.getChangeId());
+    } finally {
+      enableChangeIndexWrites();
+    }
+
+    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve());
+
+    gApi.changes().id(r.getChangeId()).current().submit();
+    assertThat(gApi.changes().id(r.getChangeId()).info().status).isEqualTo(ChangeStatus.MERGED);
+  }
+
+  @Test
+  public void submitNotAllowedWithoutPermission() throws Exception {
+    PushOneCommit.Result r = createChange();
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    exception.expectMessage("submit not permitted");
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).submit();
+  }
+
+  @Test
+  public void submitAllowedWithPermission() throws Exception {
+    PushOneCommit.Result r = createChange();
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
+    grant(project, "refs/heads/master", Permission.SUBMIT, false, REGISTERED_USERS);
+    setApiUser(user);
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).submit();
+    assertThat(gApi.changes().id(r.getChangeId()).info().status).isEqualTo(ChangeStatus.MERGED);
+  }
+
+  @Test
+  public void check() throws Exception {
+    PushOneCommit.Result r = createChange();
+    assertThat(gApi.changes().id(r.getChangeId()).get().problems).isNull();
+    assertThat(gApi.changes().id(r.getChangeId()).get(CHECK).problems).isEmpty();
+  }
+
+  @Test
+  public void commitFooters() throws Exception {
+    LabelType verified =
+        category("Verified", value(1, "Passes"), value(0, "No score"), value(-1, "Failed"));
+    LabelType custom1 =
+        category("Custom1", value(1, "Positive"), value(0, "No score"), value(-1, "Negative"));
+    LabelType custom2 =
+        category("Custom2", value(1, "Positive"), value(0, "No score"), value(-1, "Negative"));
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      u.getConfig().getLabelSections().put(verified.getName(), verified);
+      u.getConfig().getLabelSections().put(custom1.getName(), custom1);
+      u.getConfig().getLabelSections().put(custom2.getName(), custom2);
+      String heads = "refs/heads/*";
+      AccountGroup.UUID anon = systemGroupBackend.getGroup(ANONYMOUS_USERS).getUUID();
+      Util.allow(u.getConfig(), Permission.forLabel("Verified"), -1, 1, anon, heads);
+      Util.allow(u.getConfig(), Permission.forLabel("Custom1"), -1, 1, anon, heads);
+      Util.allow(u.getConfig(), Permission.forLabel("Custom2"), -1, 1, anon, heads);
+      u.save();
+    }
+
+    PushOneCommit.Result r1 = createChange();
+    r1.assertOkStatus();
+    PushOneCommit.Result r2 =
+        pushFactory
+            .create(
+                db, admin.getIdent(), testRepo, SUBJECT, FILE_NAME, "new content", r1.getChangeId())
+            .to("refs/for/master");
+    r2.assertOkStatus();
+
+    ReviewInput in = new ReviewInput();
+    in.label("Code-Review", 1);
+    in.label("Verified", 1);
+    in.label("Custom1", -1);
+    in.label("Custom2", 1);
+    gApi.changes().id(r2.getChangeId()).current().review(in);
+
+    ChangeInfo actual = gApi.changes().id(r2.getChangeId()).get(ALL_REVISIONS, COMMIT_FOOTERS);
+    assertThat(actual.revisions).hasSize(2);
+
+    // No footers except on latest patch set.
+    assertThat(actual.revisions.get(r1.getCommit().getName()).commitWithFooters).isNull();
+
+    List<String> footers =
+        new ArrayList<>(
+            Arrays.asList(
+                actual.revisions.get(r2.getCommit().getName()).commitWithFooters.split("\\n")));
+    // remove subject + blank line
+    footers.remove(0);
+    footers.remove(0);
+
+    List<String> expectedFooters =
+        Arrays.asList(
+            "Change-Id: " + r2.getChangeId(),
+            "Reviewed-on: "
+                + canonicalWebUrl.get()
+                + "c/"
+                + project.get()
+                + "/+/"
+                + r2.getChange().getId(),
+            "Reviewed-by: Administrator <admin@example.com>",
+            "Custom2: Administrator <admin@example.com>",
+            "Tested-by: Administrator <admin@example.com>");
+
+    assertThat(footers).containsExactlyElementsIn(expectedFooters);
+  }
+
+  @Test
+  public void customCommitFooters() throws Exception {
+    PushOneCommit.Result change = createChange();
+    RegistrationHandle handle =
+        changeMessageModifiers.add(
+            "gerrit",
+            new ChangeMessageModifier() {
+              @Override
+              public String onSubmit(
+                  String newCommitMessage,
+                  RevCommit original,
+                  RevCommit mergeTip,
+                  Branch.NameKey destination) {
+                assertThat(original.getName()).isNotEqualTo(mergeTip.getName());
+                return newCommitMessage + "Custom: " + destination.get();
+              }
+            });
+    ChangeInfo actual;
+    try {
+      actual = gApi.changes().id(change.getChangeId()).get(ALL_REVISIONS, COMMIT_FOOTERS);
+    } finally {
+      handle.remove();
+    }
+    List<String> footers =
+        new ArrayList<>(
+            Arrays.asList(
+                actual.revisions.get(change.getCommit().getName()).commitWithFooters.split("\\n")));
+    // remove subject + blank line
+    footers.remove(0);
+    footers.remove(0);
+
+    List<String> expectedFooters =
+        Arrays.asList(
+            "Change-Id: " + change.getChangeId(),
+            "Reviewed-on: "
+                + canonicalWebUrl.get()
+                + "c/"
+                + project.get()
+                + "/+/"
+                + change.getChange().getId(),
+            "Custom: refs/heads/master");
+    assertThat(footers).containsExactlyElementsIn(expectedFooters);
+  }
+
+  @Test
+  public void defaultSearchDoesNotTouchDatabase() throws Exception {
+    setApiUser(admin);
+    PushOneCommit.Result r1 = createChange();
+    gApi.changes()
+        .id(r1.getChangeId())
+        .revision(r1.getCommit().name())
+        .review(ReviewInput.approve());
+    gApi.changes().id(r1.getChangeId()).revision(r1.getCommit().name()).submit();
+
+    createChange();
+
+    setApiUser(user);
+    AcceptanceTestRequestScope.Context ctx = disableDb();
+    try {
+      assertThat(
+              gApi.changes()
+                  .query()
+                  .withQuery("project:{" + project.get() + "} (status:open OR status:closed)")
+                  // Options should match defaults in AccountDashboardScreen.
+                  .withOption(LABELS)
+                  .withOption(DETAILED_ACCOUNTS)
+                  .withOption(REVIEWED)
+                  .get())
+          .hasSize(2);
+    } finally {
+      enableDb(ctx);
+    }
+  }
+
+  @Test
+  public void votable() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String triplet = project.get() + "~master~" + r.getChangeId();
+    gApi.changes().id(triplet).addReviewer(user.username);
+    ChangeInfo c = gApi.changes().id(triplet).get(DETAILED_LABELS);
+    LabelInfo codeReview = c.labels.get("Code-Review");
+    assertThat(codeReview.all).hasSize(1);
+    ApprovalInfo approval = codeReview.all.get(0);
+    assertThat(approval._accountId).isEqualTo(user.id.get());
+    assertThat(approval.value).isEqualTo(0);
+
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      Util.blockLabel(u.getConfig(), "Code-Review", REGISTERED_USERS, "refs/heads/*");
+      u.save();
+    }
+
+    c = gApi.changes().id(triplet).get(DETAILED_LABELS);
+    codeReview = c.labels.get("Code-Review");
+    assertThat(codeReview.all).hasSize(1);
+    approval = codeReview.all.get(0);
+    assertThat(approval._accountId).isEqualTo(user.id.get());
+    assertThat(approval.value).isNull();
+  }
+
+  @Test
+  @GerritConfig(name = "gerrit.editGpgKeys", value = "true")
+  @GerritConfig(name = "receive.enableSignedPush", value = "true")
+  public void pushCertificates() throws Exception {
+    PushOneCommit.Result r1 = createChange();
+    PushOneCommit.Result r2 = amendChange(r1.getChangeId());
+
+    ChangeInfo info = gApi.changes().id(r1.getChangeId()).get(ALL_REVISIONS, PUSH_CERTIFICATES);
+
+    RevisionInfo rev1 = info.revisions.get(r1.getCommit().name());
+    assertThat(rev1).isNotNull();
+    assertThat(rev1.pushCertificate).isNotNull();
+    assertThat(rev1.pushCertificate.certificate).isNull();
+    assertThat(rev1.pushCertificate.key).isNull();
+
+    RevisionInfo rev2 = info.revisions.get(r2.getCommit().name());
+    assertThat(rev2).isNotNull();
+    assertThat(rev2.pushCertificate).isNotNull();
+    assertThat(rev2.pushCertificate.certificate).isNull();
+    assertThat(rev2.pushCertificate.key).isNull();
+  }
+
+  @Test
+  public void anonymousRestApi() throws Exception {
+    setApiUserAnonymous();
+    PushOneCommit.Result r = createChange();
+
+    ChangeInfo info = gApi.changes().id(r.getChangeId()).get();
+    assertThat(info.changeId).isEqualTo(r.getChangeId());
+
+    String triplet = project.get() + "~master~" + r.getChangeId();
+    info = gApi.changes().id(triplet).get();
+    assertThat(info.changeId).isEqualTo(r.getChangeId());
+
+    info = gApi.changes().id(info._number).get();
+    assertThat(info.changeId).isEqualTo(r.getChangeId());
+
+    exception.expect(AuthException.class);
+    gApi.changes().id(triplet).current().review(ReviewInput.approve());
+  }
+
+  @Test
+  public void noteDbCommitsOnPatchSetCreation() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    PushOneCommit.Result r = createChange();
+    pushFactory
+        .create(
+            db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "b.txt", "4711", r.getChangeId())
+        .to("refs/for/master")
+        .assertOkStatus();
+    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
+    try (Repository repo = repoManager.openRepository(project);
+        RevWalk rw = new RevWalk(repo)) {
+      RevCommit commitPatchSetCreation =
+          rw.parseCommit(repo.exactRef(changeMetaRef(new Change.Id(c._number))).getObjectId());
+
+      assertThat(commitPatchSetCreation.getShortMessage()).isEqualTo("Create patch set 2");
+      PersonIdent expectedAuthor =
+          changeNoteUtil.newIdent(getAccount(admin.id), c.updated, serverIdent.get());
+      assertThat(commitPatchSetCreation.getAuthorIdent()).isEqualTo(expectedAuthor);
+      assertThat(commitPatchSetCreation.getCommitterIdent())
+          .isEqualTo(new PersonIdent(serverIdent.get(), c.updated));
+      assertThat(commitPatchSetCreation.getParentCount()).isEqualTo(1);
+
+      RevCommit commitChangeCreation = rw.parseCommit(commitPatchSetCreation.getParent(0));
+      assertThat(commitChangeCreation.getShortMessage()).isEqualTo("Create change");
+      expectedAuthor = changeNoteUtil.newIdent(getAccount(admin.id), c.created, serverIdent.get());
+      assertThat(commitChangeCreation.getAuthorIdent()).isEqualTo(expectedAuthor);
+      assertThat(commitChangeCreation.getCommitterIdent())
+          .isEqualTo(new PersonIdent(serverIdent.get(), c.created));
+      assertThat(commitChangeCreation.getParentCount()).isEqualTo(0);
+    }
+  }
+
+  @Test
+  public void createEmptyChangeOnNonExistingBranch() throws Exception {
+    ChangeInput in = new ChangeInput();
+    in.branch = "foo";
+    in.subject = "Create a change on new branch from the API";
+    in.project = project.get();
+    in.newBranch = true;
+    ChangeInfo info = gApi.changes().create(in).get();
+    assertThat(info.project).isEqualTo(in.project);
+    assertThat(info.branch).isEqualTo(in.branch);
+    assertThat(info.subject).isEqualTo(in.subject);
+    assertThat(Iterables.getOnlyElement(info.messages).message).isEqualTo("Uploaded patch set 1.");
+  }
+
+  @Test
+  public void createEmptyChangeOnExistingBranchWithNewBranch() throws Exception {
+    ChangeInput in = new ChangeInput();
+    in.branch = Constants.MASTER;
+    in.subject = "Create a change on new branch from the API";
+    in.project = project.get();
+    in.newBranch = true;
+
+    exception.expect(ResourceConflictException.class);
+    gApi.changes().create(in).get();
+  }
+
+  @Test
+  public void createNewPatchSetWithoutPermission() throws Exception {
+    // Create new project with clean permissions
+    Project.NameKey p = createProject("addPatchSet1");
+
+    // Clone separate repositories of the same project as admin and as user
+    TestRepository<InMemoryRepository> adminTestRepo = cloneProject(p, admin);
+    TestRepository<InMemoryRepository> userTestRepo = cloneProject(p, user);
+
+    // Block default permission
+    block(p, "refs/for/*", Permission.ADD_PATCH_SET, REGISTERED_USERS);
+
+    // Create change as admin
+    PushOneCommit push = pushFactory.create(db, admin.getIdent(), adminTestRepo);
+    PushOneCommit.Result r1 = push.to("refs/for/master");
+    r1.assertOkStatus();
+
+    // Fetch change
+    GitUtil.fetch(userTestRepo, r1.getPatchSet().getRefName() + ":ps");
+    userTestRepo.reset("ps");
+
+    // Amend change as user
+    PushOneCommit.Result r2 = amendChange(r1.getChangeId(), "refs/for/master", user, userTestRepo);
+    r2.assertErrorStatus("cannot add patch set to " + r1.getChange().getId().id + ".");
+  }
+
+  @Test
+  public void createNewSetPatchWithPermission() throws Exception {
+    // Clone separate repositories of the same project as admin and as user
+    TestRepository<?> adminTestRepo = cloneProject(project, admin);
+    TestRepository<?> userTestRepo = cloneProject(project, user);
+
+    // Create change as admin
+    PushOneCommit push = pushFactory.create(db, admin.getIdent(), adminTestRepo);
+    PushOneCommit.Result r1 = push.to("refs/for/master");
+    r1.assertOkStatus();
+
+    // Fetch change
+    GitUtil.fetch(userTestRepo, r1.getPatchSet().getRefName() + ":ps");
+    userTestRepo.reset("ps");
+
+    // Amend change as user
+    PushOneCommit.Result r2 = amendChange(r1.getChangeId(), "refs/for/master", user, userTestRepo);
+    r2.assertOkStatus();
+  }
+
+  @Test
+  public void createNewPatchSetAsOwnerWithoutPermission() throws Exception {
+    // Create new project with clean permissions
+    Project.NameKey p = createProject("addPatchSet2");
+    // Clone separate repositories of the same project as admin and as user
+    TestRepository<?> adminTestRepo = cloneProject(project, admin);
+
+    // Block default permission
+    block(p, "refs/for/*", Permission.ADD_PATCH_SET, REGISTERED_USERS);
+
+    // Create change as admin
+    PushOneCommit push = pushFactory.create(db, admin.getIdent(), adminTestRepo);
+    PushOneCommit.Result r1 = push.to("refs/for/master");
+    r1.assertOkStatus();
+
+    // Fetch change
+    GitUtil.fetch(adminTestRepo, r1.getPatchSet().getRefName() + ":ps");
+    adminTestRepo.reset("ps");
+
+    // Amend change as admin
+    PushOneCommit.Result r2 =
+        amendChange(r1.getChangeId(), "refs/for/master", admin, adminTestRepo);
+    r2.assertOkStatus();
+  }
+
+  @Test
+  public void createMergePatchSet() throws Exception {
+    PushOneCommit.Result start = pushTo("refs/heads/master");
+    start.assertOkStatus();
+    // create a change for master
+    PushOneCommit.Result r = createChange();
+    r.assertOkStatus();
+    String changeId = r.getChangeId();
+
+    testRepo.reset(start.getCommit());
+    PushOneCommit.Result currentMaster = pushTo("refs/heads/master");
+    currentMaster.assertOkStatus();
+    String parent = currentMaster.getCommit().getName();
+
+    // push a commit into dev branch
+    createBranch("dev");
+    PushOneCommit.Result changeA =
+        pushFactory
+            .create(db, user.getIdent(), testRepo, "change A", "A.txt", "A content")
+            .to("refs/heads/dev");
+    changeA.assertOkStatus();
+    MergeInput mergeInput = new MergeInput();
+    mergeInput.source = "dev";
+    MergePatchSetInput in = new MergePatchSetInput();
+    in.merge = mergeInput;
+    in.subject = "update change by merge ps2";
+    gApi.changes().id(changeId).createMergePatchSet(in);
+    ChangeInfo changeInfo =
+        gApi.changes().id(changeId).get(ALL_REVISIONS, CURRENT_COMMIT, CURRENT_REVISION);
+    assertThat(changeInfo.revisions).hasSize(2);
+    assertThat(changeInfo.subject).isEqualTo(in.subject);
+    assertThat(changeInfo.revisions.get(changeInfo.currentRevision).commit.parents.get(0).commit)
+        .isEqualTo(parent);
+  }
+
+  @Test
+  public void createMergePatchSetInheritParent() throws Exception {
+    PushOneCommit.Result start = pushTo("refs/heads/master");
+    start.assertOkStatus();
+    // create a change for master
+    PushOneCommit.Result r = createChange();
+    r.assertOkStatus();
+    String changeId = r.getChangeId();
+    String parent = r.getCommit().getParent(0).getName();
+
+    // advance master branch
+    testRepo.reset(start.getCommit());
+    PushOneCommit.Result currentMaster = pushTo("refs/heads/master");
+    currentMaster.assertOkStatus();
+
+    // push a commit into dev branch
+    createBranch("dev");
+    PushOneCommit.Result changeA =
+        pushFactory
+            .create(db, user.getIdent(), testRepo, "change A", "A.txt", "A content")
+            .to("refs/heads/dev");
+    changeA.assertOkStatus();
+    MergeInput mergeInput = new MergeInput();
+    mergeInput.source = "dev";
+    MergePatchSetInput in = new MergePatchSetInput();
+    in.merge = mergeInput;
+    in.subject = "update change by merge ps2 inherit parent of ps1";
+    in.inheritParent = true;
+    gApi.changes().id(changeId).createMergePatchSet(in);
+    ChangeInfo changeInfo =
+        gApi.changes().id(changeId).get(ALL_REVISIONS, CURRENT_COMMIT, CURRENT_REVISION);
+
+    assertThat(changeInfo.revisions).hasSize(2);
+    assertThat(changeInfo.subject).isEqualTo(in.subject);
+    assertThat(changeInfo.revisions.get(changeInfo.currentRevision).commit.parents.get(0).commit)
+        .isEqualTo(parent);
+    assertThat(changeInfo.revisions.get(changeInfo.currentRevision).commit.parents.get(0).commit)
+        .isNotEqualTo(currentMaster.getCommit().getName());
+  }
+
+  @Test
+  public void createMergePatchSetCannotBaseOnInvisibleChange() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+    createBranch("foo");
+    createBranch("bar");
+
+    // Create a merged commit on 'foo' branch.
+    merge(createChange("refs/for/foo"));
+
+    // Create the base change on 'bar' branch.
+    testRepo.reset(initialHead);
+    String baseChange = createChange("refs/for/bar").getChangeId();
+    gApi.changes().id(baseChange).setPrivate(true, "set private");
+
+    // Create the destination change on 'master' branch.
+    setApiUser(user);
+    testRepo.reset(initialHead);
+    String changeId = createChange().getChangeId();
+
+    exception.expect(UnprocessableEntityException.class);
+    exception.expectMessage("Read not permitted for " + baseChange);
+    gApi.changes().id(changeId).createMergePatchSet(createMergePatchSetInput(baseChange));
+  }
+
+  @Test
+  public void createMergePatchSetBaseOnChange() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+    createBranch("foo");
+    createBranch("bar");
+
+    // Create a merged commit on 'foo' branch.
+    merge(createChange("refs/for/foo"));
+
+    // Create the base change on 'bar' branch.
+    testRepo.reset(initialHead);
+    PushOneCommit.Result result = createChange("refs/for/bar");
+    String baseChange = result.getChangeId();
+    String expectedParent = result.getCommit().getName();
+
+    // Create the destination change on 'master' branch.
+    testRepo.reset(initialHead);
+    String changeId = createChange().getChangeId();
+
+    gApi.changes().id(changeId).createMergePatchSet(createMergePatchSetInput(baseChange));
+
+    ChangeInfo changeInfo =
+        gApi.changes().id(changeId).get(ALL_REVISIONS, CURRENT_COMMIT, CURRENT_REVISION);
+    assertThat(changeInfo.revisions).hasSize(2);
+    assertThat(changeInfo.subject).isEqualTo("create ps2");
+    assertThat(changeInfo.revisions.get(changeInfo.currentRevision).commit.parents.get(0).commit)
+        .isEqualTo(expectedParent);
+  }
+
+  private MergePatchSetInput createMergePatchSetInput(String baseChange) {
+    MergeInput mergeInput = new MergeInput();
+    mergeInput.source = "foo";
+    MergePatchSetInput in = new MergePatchSetInput();
+    in.merge = mergeInput;
+    in.subject = "create ps2";
+    in.inheritParent = false;
+    in.baseChange = baseChange;
+    return in;
+  }
+
+  @Test
+  public void checkLabelsForUnsubmittedChange() throws Exception {
+    PushOneCommit.Result r = createChange();
+    ChangeInfo change = gApi.changes().id(r.getChangeId()).get();
+    assertThat(change.status).isEqualTo(ChangeStatus.NEW);
+    assertThat(change.labels.keySet()).containsExactly("Code-Review");
+    assertThat(change.permittedLabels.keySet()).containsExactly("Code-Review");
+
+    // add new label and assert that it's returned for existing changes
+    AccountGroup.UUID registeredUsers = systemGroupBackend.getGroup(REGISTERED_USERS).getUUID();
+    LabelType verified = Util.verified();
+    String heads = RefNames.REFS_HEADS + "*";
+
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      u.getConfig().getLabelSections().put(verified.getName(), verified);
+      Util.allow(
+          u.getConfig(), Permission.forLabel(verified.getName()), -1, 1, registeredUsers, heads);
+      u.save();
+    }
+
+    change = gApi.changes().id(r.getChangeId()).get();
+    assertThat(change.labels.keySet()).containsExactly("Code-Review", "Verified");
+    assertThat(change.permittedLabels.keySet()).containsExactly("Code-Review", "Verified");
+    assertPermitted(change, "Code-Review", -2, -1, 0, 1, 2);
+    assertPermitted(change, "Verified", -1, 0, 1);
+
+    // add an approval on the new label
+    gApi.changes()
+        .id(r.getChangeId())
+        .revision(r.getCommit().name())
+        .review(new ReviewInput().label(verified.getName(), verified.getMax().getValue()));
+
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      // remove label and assert that it's no longer returned for existing
+      // changes, even if there is an approval for it
+      u.getConfig().getLabelSections().remove(verified.getName());
+      Util.remove(u.getConfig(), Permission.forLabel(verified.getName()), registeredUsers, heads);
+      u.save();
+    }
+
+    change = gApi.changes().id(r.getChangeId()).get();
+    assertThat(change.labels.keySet()).containsExactly("Code-Review");
+    assertThat(change.permittedLabels.keySet()).containsExactly("Code-Review");
+
+    // abandon the change and see that the returned labels stay the same
+    // while all permitted labels disappear.
+    gApi.changes().id(r.getChangeId()).abandon();
+    change = gApi.changes().id(r.getChangeId()).get();
+    assertThat(change.status).isEqualTo(ChangeStatus.ABANDONED);
+    assertThat(change.labels.keySet()).containsExactly("Code-Review");
+    assertThat(change.permittedLabels).isEmpty();
+  }
+
+  @Test
+  public void checkLabelsForMergedChange() throws Exception {
+    PushOneCommit.Result r = createChange();
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).submit();
+
+    ChangeInfo change = gApi.changes().id(r.getChangeId()).get();
+    assertThat(change.status).isEqualTo(ChangeStatus.MERGED);
+    assertThat(change.labels.keySet()).containsExactly("Code-Review");
+    assertThat(change.permittedLabels.keySet()).containsExactly("Code-Review");
+    assertPermitted(change, "Code-Review", 2);
+
+    LabelType verified = Util.verified();
+    AccountGroup.UUID registeredUsers = systemGroupBackend.getGroup(REGISTERED_USERS).getUUID();
+    String heads = RefNames.REFS_HEADS + "*";
+
+    // add new label and assert that it's returned for existing changes
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      u.getConfig().getLabelSections().put(verified.getName(), verified);
+      Util.allow(
+          u.getConfig(), Permission.forLabel(verified.getName()), -1, 1, registeredUsers, heads);
+      u.save();
+    }
+
+    change = gApi.changes().id(r.getChangeId()).get();
+    assertThat(change.labels.keySet()).containsExactly("Code-Review", "Verified");
+    assertThat(change.permittedLabels.keySet()).containsExactly("Code-Review", "Verified");
+    assertPermitted(change, "Code-Review", 2);
+    assertPermitted(change, "Verified", 0, 1);
+
+    // ignore the new label by Prolog submit rule and assert that the label is
+    // no longer returned
+    GitUtil.fetch(testRepo, RefNames.REFS_CONFIG + ":config");
+    testRepo.reset("config");
+    PushOneCommit push2 =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            testRepo,
+            "Ignore Verified",
+            "rules.pl",
+            "submit_rule(submit(CR)) :-\n  gerrit:max_with_block(-2, 2, 'Code-Review', CR).");
+    push2.to(RefNames.REFS_CONFIG);
+
+    change = gApi.changes().id(r.getChangeId()).get();
+    assertPermitted(change, "Code-Review", 2);
+    assertPermitted(change, "Verified");
+
+    // add an approval on the new label and assert that the label is now
+    // returned although it is ignored by the Prolog submit rule and hence not
+    // included in the submit records
+    gApi.changes()
+        .id(r.getChangeId())
+        .revision(r.getCommit().name())
+        .review(new ReviewInput().label(verified.getName(), verified.getMax().getValue()));
+
+    change = gApi.changes().id(r.getChangeId()).get();
+    assertThat(change.labels.keySet()).containsExactly("Code-Review", "Verified");
+    assertPermitted(change, "Code-Review", 2);
+    assertPermitted(change, "Verified");
+
+    // remove label and assert that it's no longer returned for existing
+    // changes, even if there is an approval for it
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      u.getConfig().getLabelSections().remove(verified.getName());
+      Util.remove(u.getConfig(), Permission.forLabel(verified.getName()), registeredUsers, heads);
+      u.save();
+    }
+
+    change = gApi.changes().id(r.getChangeId()).get();
+    assertThat(change.labels.keySet()).containsExactly("Code-Review");
+    assertThat(change.permittedLabels.keySet()).containsExactly("Code-Review");
+    assertPermitted(change, "Code-Review", 2);
+  }
+
+  @Test
+  public void checkLabelsForMergedChangeWithNonAuthorCodeReview() throws Exception {
+    // Configure Non-Author-Code-Review
+    RevCommit oldHead = getRemoteHead();
+    GitUtil.fetch(testRepo, RefNames.REFS_CONFIG + ":config");
+    testRepo.reset("config");
+    PushOneCommit push2 =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            testRepo,
+            "Configure Non-Author-Code-Review",
+            "rules.pl",
+            "submit_rule(S) :-\n"
+                + "  gerrit:default_submit(X),\n"
+                + "  X =.. [submit | Ls],\n"
+                + "  add_non_author_approval(Ls, R),\n"
+                + "  S =.. [submit | R].\n"
+                + "\n"
+                + "add_non_author_approval(S1, S2) :-\n"
+                + "  gerrit:commit_author(A),\n"
+                + "  gerrit:commit_label(label('Code-Review', 2), R),\n"
+                + "  R \\= A, !,\n"
+                + "  S2 = [label('Non-Author-Code-Review', ok(R)) | S1].\n"
+                + "add_non_author_approval(S1,"
+                + " [label('Non-Author-Code-Review', need(_)) | S1]).");
+    push2.to(RefNames.REFS_CONFIG);
+    testRepo.reset(oldHead);
+
+    AccountGroup.UUID registeredUsers = systemGroupBackend.getGroup(REGISTERED_USERS).getUUID();
+    String heads = RefNames.REFS_HEADS + "*";
+
+    // Allow user to approve
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      Util.allow(
+          u.getConfig(),
+          Permission.forLabel(Util.codeReview().getName()),
+          -2,
+          2,
+          registeredUsers,
+          heads);
+      u.save();
+    }
+
+    PushOneCommit.Result r = createChange();
+
+    setApiUser(user);
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
+
+    setApiUser(admin);
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).submit();
+
+    ChangeInfo change = gApi.changes().id(r.getChangeId()).get();
+    assertThat(change.status).isEqualTo(ChangeStatus.MERGED);
+    assertThat(change.labels.keySet()).containsExactly("Code-Review", "Non-Author-Code-Review");
+    assertThat(change.permittedLabels.keySet()).containsExactly("Code-Review");
+    assertPermitted(change, "Code-Review", 0, 1, 2);
+  }
+
+  @Test
+  public void checkLabelsForAutoClosedChange() throws Exception {
+    PushOneCommit.Result r = createChange();
+
+    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
+    PushOneCommit.Result result = push.to("refs/heads/master");
+    result.assertOkStatus();
+
+    ChangeInfo change = gApi.changes().id(r.getChangeId()).get();
+    assertThat(change.status).isEqualTo(ChangeStatus.MERGED);
+    assertThat(change.labels.keySet()).containsExactly("Code-Review");
+    assertPermitted(change, "Code-Review", 0, 1, 2);
+  }
+
+  @Test
+  public void maxPermittedValueAllowed() throws Exception {
+    final int minPermittedValue = -2;
+    final int maxPermittedValue = +2;
+    String heads = "refs/heads/*";
+
+    PushOneCommit.Result r = createChange();
+    String triplet = project.get() + "~master~" + r.getChangeId();
+
+    gApi.changes().id(triplet).addReviewer(user.username);
+
+    ChangeInfo c = gApi.changes().id(triplet).get(DETAILED_LABELS);
+    LabelInfo codeReview = c.labels.get("Code-Review");
+    assertThat(codeReview.all).hasSize(1);
+    ApprovalInfo approval = codeReview.all.get(0);
+    assertThat(approval._accountId).isEqualTo(user.id.get());
+    assertThat(approval.permittedVotingRange).isNotNull();
+    // default values
+    assertThat(approval.permittedVotingRange.min).isEqualTo(-1);
+    assertThat(approval.permittedVotingRange.max).isEqualTo(1);
+
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      Util.allow(
+          u.getConfig(),
+          Permission.forLabel("Code-Review"),
+          minPermittedValue,
+          maxPermittedValue,
+          REGISTERED_USERS,
+          heads);
+      u.save();
+    }
+
+    c = gApi.changes().id(triplet).get(DETAILED_LABELS);
+    codeReview = c.labels.get("Code-Review");
+    assertThat(codeReview.all).hasSize(1);
+    approval = codeReview.all.get(0);
+    assertThat(approval._accountId).isEqualTo(user.id.get());
+    assertThat(approval.permittedVotingRange).isNotNull();
+    assertThat(approval.permittedVotingRange.min).isEqualTo(minPermittedValue);
+    assertThat(approval.permittedVotingRange.max).isEqualTo(maxPermittedValue);
+  }
+
+  @Test
+  public void maxPermittedValueBlocked() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      Util.blockLabel(u.getConfig(), "Code-Review", REGISTERED_USERS, "refs/heads/*");
+      u.save();
+    }
+
+    PushOneCommit.Result r = createChange();
+    String triplet = project.get() + "~master~" + r.getChangeId();
+
+    gApi.changes().id(triplet).addReviewer(user.username);
+
+    ChangeInfo c = gApi.changes().id(triplet).get(DETAILED_LABELS);
+    LabelInfo codeReview = c.labels.get("Code-Review");
+    assertThat(codeReview.all).hasSize(1);
+    ApprovalInfo approval = codeReview.all.get(0);
+    assertThat(approval._accountId).isEqualTo(user.id.get());
+    assertThat(approval.permittedVotingRange).isNull();
+  }
+
+  @Test
+  public void nonStrictLabelWithInvalidLabelPerDefault() throws Exception {
+    String changeId = createChange().getChangeId();
+
+    // Add a review with invalid labels.
+    ReviewInput input = ReviewInput.approve().label("Code-Style", 1);
+    gApi.changes().id(changeId).current().review(input);
+
+    Map<String, Short> votes = gApi.changes().id(changeId).current().reviewer(admin.email).votes();
+    assertThat(votes.keySet()).containsExactly("Code-Review");
+    assertThat(votes.values()).containsExactly((short) 2);
+  }
+
+  @Test
+  public void nonStrictLabelWithInvalidValuePerDefault() throws Exception {
+    String changeId = createChange().getChangeId();
+
+    // Add a review with invalid label values.
+    ReviewInput input = new ReviewInput().label("Code-Review", 3);
+    gApi.changes().id(changeId).current().review(input);
+
+    Map<String, Short> votes = gApi.changes().id(changeId).current().reviewer(admin.email).votes();
+    if (!notesMigration.readChanges()) {
+      assertThat(votes.keySet()).containsExactly("Code-Review");
+      assertThat(votes.values()).containsExactly((short) 0);
+    } else {
+      assertThat(votes).isEmpty();
+    }
+  }
+
+  @Test
+  @GerritConfig(name = "change.strictLabels", value = "true")
+  public void strictLabelWithInvalidLabel() throws Exception {
+    String changeId = createChange().getChangeId();
+    ReviewInput in = new ReviewInput().label("Code-Style", 1);
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("label \"Code-Style\" is not a configured label");
+    gApi.changes().id(changeId).current().review(in);
+  }
+
+  @Test
+  @GerritConfig(name = "change.strictLabels", value = "true")
+  public void strictLabelWithInvalidValue() throws Exception {
+    String changeId = createChange().getChangeId();
+    ReviewInput in = new ReviewInput().label("Code-Review", 3);
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("label \"Code-Review\": 3 is not a valid value");
+    gApi.changes().id(changeId).current().review(in);
+  }
+
+  @Test
+  public void unresolvedCommentsBlocked() throws Exception {
+    modifySubmitRules(
+        "submit_rule(submit(R)) :- \n"
+            + "gerrit:unresolved_comments_count(0), \n"
+            + "!,"
+            + "gerrit:uploader(U), \n"
+            + "R = label('All-Comments-Resolved', ok(U)).\n"
+            + "submit_rule(submit(R)) :- \n"
+            + "gerrit:unresolved_comments_count(U), \n"
+            + "U > 0,"
+            + "R = label('All-Comments-Resolved', need(_)). \n\n");
+
+    String oldHead = getRemoteHead().name();
+    PushOneCommit.Result result1 =
+        pushFactory.create(db, user.getIdent(), testRepo).to("refs/for/master");
+    testRepo.reset(oldHead);
+    PushOneCommit.Result result2 =
+        pushFactory.create(db, user.getIdent(), testRepo).to("refs/for/master");
+
+    addComment(result1, "comment 1", true, false, null);
+    addComment(result2, "comment 2", true, true, null);
+
+    gApi.changes().id(result1.getChangeId()).current().submit();
+
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("Failed to submit 1 change due to the following problems");
+    exception.expectMessage("needs All-Comments-Resolved");
+    gApi.changes().id(result2.getChangeId()).current().submit();
+  }
+
+  @Test
+  public void pureRevertFactBlocksSubmissionOfNonReverts() throws Exception {
+    addPureRevertSubmitRule();
+
+    // Create a change that is not a revert of another change
+    PushOneCommit.Result r1 =
+        pushFactory.create(db, user.getIdent(), testRepo).to("refs/for/master");
+    approve(r1.getChangeId());
+
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("Failed to submit 1 change due to the following problems");
+    exception.expectMessage("needs Is-Pure-Revert");
+    gApi.changes().id(r1.getChangeId()).current().submit();
+  }
+
+  @Test
+  public void pureRevertFactBlocksSubmissionOfNonPureReverts() throws Exception {
+    PushOneCommit.Result r1 =
+        pushFactory.create(db, user.getIdent(), testRepo).to("refs/for/master");
+    merge(r1);
+
+    addPureRevertSubmitRule();
+
+    // Create a revert and push a content change
+    String revertId = gApi.changes().id(r1.getChangeId()).revert().get().changeId;
+    amendChange(revertId);
+    approve(revertId);
+
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("Failed to submit 1 change due to the following problems");
+    exception.expectMessage("needs Is-Pure-Revert");
+    gApi.changes().id(revertId).current().submit();
+  }
+
+  @Test
+  public void pureRevertFactAllowsSubmissionOfPureReverts() throws Exception {
+    // Create a change that we can later revert
+    PushOneCommit.Result r1 =
+        pushFactory.create(db, user.getIdent(), testRepo).to("refs/for/master");
+    merge(r1);
+
+    addPureRevertSubmitRule();
+
+    // Create a revert and submit it
+    String revertId = gApi.changes().id(r1.getChangeId()).revert().get().changeId;
+    approve(revertId);
+    gApi.changes().id(revertId).current().submit();
+  }
+
+  @Test
+  public void changeCommitMessage() throws Exception {
+    // Tests mutating the commit message as both the owner of the change and a regular user with
+    // addPatchSet permission. Asserts that both cases succeed.
+    PushOneCommit.Result r = createChange();
+    r.assertOkStatus();
+    assertThat(getCommitMessage(r.getChangeId()))
+        .isEqualTo("test commit\n\nChange-Id: " + r.getChangeId() + "\n");
+
+    for (com.google.gerrit.acceptance.TestAccount acc : ImmutableList.of(admin, user)) {
+      setApiUser(acc);
+      String newMessage =
+          "modified commit by " + acc.username + "\n\nChange-Id: " + r.getChangeId() + "\n";
+      gApi.changes().id(r.getChangeId()).setMessage(newMessage);
+      RevisionApi rApi = gApi.changes().id(r.getChangeId()).current();
+      assertThat(rApi.files().keySet()).containsExactly("/COMMIT_MSG", "a.txt");
+      assertThat(getCommitMessage(r.getChangeId())).isEqualTo(newMessage);
+      assertThat(rApi.description()).isEqualTo("Edit commit message");
+    }
+
+    // Verify tags, which should differ according to whether the change was WIP
+    // at the time the commit message was edited. First, look at the last edit
+    // we created above, when the change was not WIP.
+    ChangeInfo info = gApi.changes().id(r.getChangeId()).get();
+    assertThat(Iterables.getLast(info.messages).tag)
+        .isEqualTo(ChangeMessagesUtil.TAG_UPLOADED_PATCH_SET);
+
+    // Move the change to WIP and edit the commit message again, to observe a
+    // different tag. Must switch to change owner to move into WIP.
+    setApiUser(admin);
+    gApi.changes().id(r.getChangeId()).setWorkInProgress();
+    String newMessage = "modified commit in WIP change\n\nChange-Id: " + r.getChangeId() + "\n";
+    gApi.changes().id(r.getChangeId()).setMessage(newMessage);
+    info = gApi.changes().id(r.getChangeId()).get();
+    assertThat(Iterables.getLast(info.messages).tag)
+        .isEqualTo(ChangeMessagesUtil.TAG_UPLOADED_WIP_PATCH_SET);
+  }
+
+  @Test
+  public void changeCommitMessageWithNoChangeIdSucceedsIfChangeIdNotRequired() throws Exception {
+    ConfigInput configInput = new ConfigInput();
+    configInput.requireChangeId = InheritableBoolean.FALSE;
+    gApi.projects().name(project.get()).config(configInput);
+
+    PushOneCommit.Result r = createChange();
+    r.assertOkStatus();
+    assertThat(getCommitMessage(r.getChangeId()))
+        .isEqualTo("test commit\n\nChange-Id: " + r.getChangeId() + "\n");
+
+    String newMessage = "modified commit\n";
+    gApi.changes().id(r.getChangeId()).setMessage(newMessage);
+    RevisionApi rApi = gApi.changes().id(r.getChangeId()).current();
+    assertThat(rApi.files().keySet()).containsExactly("/COMMIT_MSG", "a.txt");
+    assertThat(getCommitMessage(r.getChangeId())).isEqualTo(newMessage);
+  }
+
+  @Test
+  public void changeCommitMessageWithNoChangeIdFails() throws Exception {
+    PushOneCommit.Result r = createChange();
+    assertThat(getCommitMessage(r.getChangeId()))
+        .isEqualTo("test commit\n\nChange-Id: " + r.getChangeId() + "\n");
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("missing Change-Id footer");
+    gApi.changes().id(r.getChangeId()).setMessage("modified commit\n");
+  }
+
+  @Test
+  public void changeCommitMessageWithWrongChangeIdFails() throws Exception {
+    PushOneCommit.Result otherChange = createChange();
+    PushOneCommit.Result r = createChange();
+    assertThat(getCommitMessage(r.getChangeId()))
+        .isEqualTo("test commit\n\nChange-Id: " + r.getChangeId() + "\n");
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("wrong Change-Id footer");
+    gApi.changes()
+        .id(r.getChangeId())
+        .setMessage("modified commit\n\nChange-Id: " + otherChange.getChangeId() + "\n");
+  }
+
+  @Test
+  public void changeCommitMessageWithoutPermissionFails() throws Exception {
+    // Create new project with clean permissions
+    Project.NameKey p = createProject("addPatchSetEdit");
+    TestRepository<InMemoryRepository> userTestRepo = cloneProject(p, user);
+    // Block default permission
+    block(p, "refs/for/*", Permission.ADD_PATCH_SET, REGISTERED_USERS);
+    // Create change as user
+    PushOneCommit push = pushFactory.create(db, user.getIdent(), userTestRepo);
+    PushOneCommit.Result r = push.to("refs/for/master");
+    r.assertOkStatus();
+    // Try to change the commit message
+    exception.expect(AuthException.class);
+    exception.expectMessage("modifying commit message not permitted");
+    gApi.changes().id(r.getChangeId()).setMessage("foo");
+  }
+
+  @Test
+  public void changeCommitMessageWithSameMessageFails() throws Exception {
+    PushOneCommit.Result r = createChange();
+    assertThat(getCommitMessage(r.getChangeId()))
+        .isEqualTo("test commit\n\nChange-Id: " + r.getChangeId() + "\n");
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("new and existing commit message are the same");
+    gApi.changes().id(r.getChangeId()).setMessage(getCommitMessage(r.getChangeId()));
+  }
+
+  @Test
+  public void fourByteEmoji() throws Exception {
+    // U+1F601 GRINNING FACE WITH SMILING EYES
+    String smile = new String(Character.toChars(0x1f601));
+    assertThat(smile).isEqualTo("😁");
+    assertThat(smile).hasLength(2); // Thanks, Java.
+    assertThat(smile.getBytes(UTF_8)).hasLength(4);
+
+    String subject = "A happy change " + smile;
+    PushOneCommit.Result r =
+        pushFactory
+            .create(db, admin.getIdent(), testRepo, subject, FILE_NAME, FILE_CONTENT)
+            .to("refs/for/master");
+    r.assertOkStatus();
+    String id = r.getChangeId();
+
+    ReviewInput ri = ReviewInput.approve();
+    ri.message = "I like it " + smile;
+    ReviewInput.CommentInput ci = new ReviewInput.CommentInput();
+    ci.path = FILE_NAME;
+    ci.side = Side.REVISION;
+    ci.message = "Good " + smile;
+    ri.comments = ImmutableMap.of(FILE_NAME, ImmutableList.of(ci));
+    gApi.changes().id(id).current().review(ri);
+
+    ChangeInfo info = gApi.changes().id(id).get(MESSAGES, CURRENT_COMMIT, CURRENT_REVISION);
+    assertThat(info.subject).isEqualTo(subject);
+    assertThat(Iterables.getLast(info.messages).message).endsWith(ri.message);
+    assertThat(Iterables.getOnlyElement(info.revisions.values()).commit.message)
+        .startsWith(subject);
+
+    List<CommentInfo> comments =
+        Iterables.getOnlyElement(gApi.changes().id(id).comments().values());
+    assertThat(Iterables.getOnlyElement(comments).message).isEqualTo(ci.message);
+  }
+
+  @Test
+  public void pureRevertReturnsTrueForPureRevert() throws Exception {
+    PushOneCommit.Result r = createChange();
+    merge(r);
+    String revertId = gApi.changes().id(r.getChangeId()).revert().get().id;
+    // Without query parameter
+    assertThat(gApi.changes().id(revertId).pureRevert().isPureRevert).isTrue();
+    // With query parameter
+    assertThat(
+            gApi.changes()
+                .id(revertId)
+                .pureRevert(getRemoteHead().toObjectId().name())
+                .isPureRevert)
+        .isTrue();
+  }
+
+  @Test
+  public void pureRevertReturnsFalseOnContentChange() throws Exception {
+    PushOneCommit.Result r1 = createChange();
+    merge(r1);
+    // Create a revert and expect pureRevert to be true
+    String revertId = gApi.changes().id(r1.getChangeId()).revert().get().changeId;
+    assertThat(gApi.changes().id(revertId).pureRevert().isPureRevert).isTrue();
+
+    // Create a new PS and expect pureRevert to be false
+    PushOneCommit.Result result = amendChange(revertId);
+    result.assertOkStatus();
+    assertThat(gApi.changes().id(revertId).pureRevert().isPureRevert).isFalse();
+  }
+
+  @Test
+  public void pureRevertParameterTakesPrecedence() throws Exception {
+    PushOneCommit.Result r1 = createChange("commit message", "a.txt", "content1");
+    merge(r1);
+    String oldHead = getRemoteHead().toObjectId().name();
+
+    PushOneCommit.Result r2 = createChange("commit message", "a.txt", "content2");
+    merge(r2);
+
+    String revertId = gApi.changes().id(r2.getChangeId()).revert().get().changeId;
+    assertThat(gApi.changes().id(revertId).pureRevert().isPureRevert).isTrue();
+    assertThat(gApi.changes().id(revertId).pureRevert(oldHead).isPureRevert).isFalse();
+  }
+
+  @Test
+  public void pureRevertReturnsFalseOnInvalidInput() throws Exception {
+    PushOneCommit.Result r1 = createChange();
+    merge(r1);
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("invalid object ID");
+    gApi.changes().id(createChange().getChangeId()).pureRevert("invalid id");
+  }
+
+  @Test
+  public void pureRevertReturnsTrueWithCleanRebase() throws Exception {
+    PushOneCommit.Result r1 = createChange("commit message", "a.txt", "content1");
+    merge(r1);
+
+    PushOneCommit.Result r2 = createChange("commit message", "b.txt", "content2");
+    merge(r2);
+
+    String revertId = gApi.changes().id(r1.getChangeId()).revert().get().changeId;
+    // Rebase revert onto HEAD
+    gApi.changes().id(revertId).rebase();
+    // Check that pureRevert is true which implies that the commit can be rebased onto the original
+    // commit.
+    assertThat(gApi.changes().id(revertId).pureRevert().isPureRevert).isTrue();
+  }
+
+  @Test
+  public void pureRevertReturnsFalseWithRebaseConflict() throws Exception {
+    // Create an initial commit to serve as claimed original
+    PushOneCommit.Result r1 = createChange("commit message", "a.txt", "content1");
+    merge(r1);
+    String claimedOriginal = getRemoteHead().toObjectId().name();
+
+    // Change contents of the file to provoke a conflict
+    merge(createChange("commit message", "a.txt", "content2"));
+
+    // Create a commit that we can revert
+    PushOneCommit.Result r2 = createChange("commit message", "a.txt", "content3");
+    merge(r2);
+
+    // Create a revert of r2
+    String revertR3Id = gApi.changes().id(r2.getChangeId()).revert().id();
+    // Assert that the change is a pure revert of it's 'revertOf'
+    assertThat(gApi.changes().id(revertR3Id).pureRevert().isPureRevert).isTrue();
+    // Assert that the change is not a pure revert of claimedOriginal because pureRevert is trying
+    // to rebase this on claimed original, which fails.
+    PureRevertInfo pureRevert = gApi.changes().id(revertR3Id).pureRevert(claimedOriginal);
+    assertThat(pureRevert.isPureRevert).isFalse();
+  }
+
+  @Test
+  public void pureRevertThrowsExceptionWhenChangeIsNotARevertAndNoIdProvided() throws Exception {
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("no ID was provided and change isn't a revert");
+    gApi.changes().id(createChange().getChangeId()).pureRevert();
+  }
+
+  @Test
+  public void putTopicExceedLimitFails() throws Exception {
+    String changeId = createChange().getChangeId();
+    String topic = Stream.generate(() -> "t").limit(2049).collect(joining());
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("topic length exceeds the limit");
+    gApi.changes().id(changeId).topic(topic);
+  }
+
+  @Test
+  public void submittableAfterLosingPermissions_MaxWithBlock() throws Exception {
+    configLabel("Label", LabelFunction.MAX_WITH_BLOCK);
+    submittableAfterLosingPermissions("Label");
+  }
+
+  @Test
+  public void submittableAfterLosingPermissions_AnyWithBlock() throws Exception {
+    configLabel("Label", LabelFunction.ANY_WITH_BLOCK);
+    submittableAfterLosingPermissions("Label");
+  }
+
+  public void submittableAfterLosingPermissions(String label) throws Exception {
+    String codeReviewLabel = "Code-Review";
+    AccountGroup.UUID registered = SystemGroupBackend.REGISTERED_USERS;
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      Util.allow(u.getConfig(), Permission.forLabel(label), -1, +1, registered, "refs/heads/*");
+      Util.allow(
+          u.getConfig(), Permission.forLabel(codeReviewLabel), -2, +2, registered, "refs/heads/*");
+      u.save();
+    }
+
+    setApiUser(user);
+    PushOneCommit.Result r = createChange();
+    String changeId = r.getChangeId();
+
+    // Verify user's permitted range.
+    ChangeInfo change = gApi.changes().id(changeId).get();
+    assertPermitted(change, label, -1, 0, 1);
+    assertPermitted(change, codeReviewLabel, -2, -1, 0, 1, 2);
+
+    ReviewInput input = new ReviewInput();
+    input.label(codeReviewLabel, 2);
+    input.label(label, 1);
+    gApi.changes().id(changeId).current().review(input);
+
+    assertThat(gApi.changes().id(changeId).current().reviewer(user.email).votes().keySet())
+        .containsExactly(codeReviewLabel, label);
+    assertThat(gApi.changes().id(changeId).current().reviewer(user.email).votes().values())
+        .containsExactly((short) 2, (short) 1);
+    assertThat(gApi.changes().id(changeId).get().submittable).isTrue();
+
+    setApiUser(admin);
+    // Remove user's permission for 'Label'.
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      Util.remove(u.getConfig(), Permission.forLabel(label), registered, "refs/heads/*");
+      // Update user's permitted range for 'Code-Review' to be -1...+1.
+      Util.remove(u.getConfig(), Permission.forLabel(codeReviewLabel), registered, "refs/heads/*");
+      Util.allow(
+          u.getConfig(), Permission.forLabel(codeReviewLabel), -1, +1, registered, "refs/heads/*");
+      u.save();
+    }
+
+    // Verify user's new permitted range.
+    setApiUser(user);
+    change = gApi.changes().id(changeId).get();
+    assertPermitted(change, label);
+    assertPermitted(change, codeReviewLabel, -1, 0, 1);
+
+    assertThat(gApi.changes().id(changeId).current().reviewer(user.email).votes().values())
+        .containsExactly((short) 2, (short) 1);
+    assertThat(gApi.changes().id(changeId).get().submittable).isTrue();
+
+    setApiUser(admin);
+    gApi.changes().id(changeId).current().submit();
+  }
+
+  private String getCommitMessage(String changeId) throws RestApiException, IOException {
+    return gApi.changes().id(changeId).current().file("/COMMIT_MSG").content().asString();
+  }
+
+  private void addComment(
+      PushOneCommit.Result r,
+      String message,
+      boolean omitDuplicateComments,
+      Boolean unresolved,
+      String inReplyTo)
+      throws Exception {
+    ReviewInput.CommentInput c = new ReviewInput.CommentInput();
+    c.line = 1;
+    c.message = message;
+    c.path = FILE_NAME;
+    c.unresolved = unresolved;
+    c.inReplyTo = inReplyTo;
+    ReviewInput in = new ReviewInput();
+    in.comments = new HashMap<>();
+    in.comments.put(c.path, Lists.newArrayList(c));
+    in.omitDuplicateComments = omitDuplicateComments;
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(in);
+  }
+
+  private static Iterable<Account.Id> getReviewers(Collection<AccountInfo> r) {
+    return Iterables.transform(r, a -> new Account.Id(a._accountId));
+  }
+
+  private ChangeResource parseResource(PushOneCommit.Result r) throws Exception {
+    return parseChangeResource(r.getChangeId());
+  }
+
+  private Optional<ReviewerState> getReviewerState(String changeId, Account.Id accountId)
+      throws Exception {
+    ChangeInfo c = gApi.changes().id(changeId).get(DETAILED_LABELS);
+    Set<ReviewerState> states =
+        c.reviewers.entrySet().stream()
+            .filter(e -> e.getValue().stream().anyMatch(a -> a._accountId == accountId.get()))
+            .map(Map.Entry::getKey)
+            .collect(toSet());
+    assertThat(states.size()).named(states.toString()).isAtMost(1);
+    return states.stream().findFirst();
+  }
+
+  private void setChangeStatus(Change.Id id, Change.Status newStatus) throws Exception {
+    try (BatchUpdate batchUpdate =
+        batchUpdateFactory.create(db, project, atrScope.get().getUser(), TimeUtil.nowTs())) {
+      batchUpdate.addOp(id, new ChangeStatusUpdateOp(newStatus));
+      batchUpdate.execute();
+    }
+
+    ChangeStatus changeStatus = gApi.changes().id(id.get()).get().status;
+    assertThat(changeStatus).isEqualTo(newStatus.asChangeStatus());
+  }
+
+  private static class ChangeStatusUpdateOp implements BatchUpdateOp {
+    private final Change.Status newStatus;
+
+    ChangeStatusUpdateOp(Change.Status newStatus) {
+      this.newStatus = newStatus;
+    }
+
+    @Override
+    public boolean updateChange(ChangeContext ctx) throws Exception {
+      Change change = ctx.getChange();
+
+      // Change status in database.
+      change.setStatus(newStatus);
+
+      // Change status in NoteDb.
+      PatchSet.Id currentPatchSetId = change.currentPatchSetId();
+      ctx.getUpdate(currentPatchSetId).setStatus(newStatus);
+
+      return true;
+    }
+  }
+
+  private void addPureRevertSubmitRule() throws Exception {
+    modifySubmitRules(
+        "submit_rule(submit(R)) :- \n"
+            + "gerrit:pure_revert(1), \n"
+            + "!,"
+            + "gerrit:uploader(U), \n"
+            + "R = label('Is-Pure-Revert', ok(U)).\n"
+            + "submit_rule(submit(R)) :- \n"
+            + "gerrit:pure_revert(U), \n"
+            + "U \\= 1,"
+            + "R = label('Is-Pure-Revert', need(_)). \n\n");
+  }
+
+  private void modifySubmitRules(String newContent) throws Exception {
+    try (Repository repo = repoManager.openRepository(project)) {
+      TestRepository<?> testRepo = new TestRepository<>((InMemoryRepository) repo);
+      testRepo
+          .branch(RefNames.REFS_CONFIG)
+          .commit()
+          .author(admin.getIdent())
+          .committer(admin.getIdent())
+          .add("rules.pl", newContent)
+          .message("Modify rules.pl")
+          .create();
+    }
+  }
+
+  @Test
+  @GerritConfig(name = "trackingid.jira-bug.footer", value = "Bug:")
+  @GerritConfig(name = "trackingid.jira-bug.match", value = "JRA\\d{2,8}")
+  @GerritConfig(name = "trackingid.jira-bug.system", value = "JIRA")
+  public void trackingIds() throws Exception {
+    PushOneCommit push =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            testRepo,
+            PushOneCommit.SUBJECT + "\n\n" + "Bug:JRA001",
+            PushOneCommit.FILE_NAME,
+            PushOneCommit.FILE_CONTENT);
+    PushOneCommit.Result result = push.to("refs/for/master");
+    result.assertOkStatus();
+
+    ChangeInfo change = gApi.changes().id(result.getChangeId()).get(TRACKING_IDS);
+    Collection<TrackingIdInfo> trackingIds = change.trackingIds;
+    assertThat(trackingIds).isNotNull();
+    assertThat(trackingIds).hasSize(1);
+    assertThat(trackingIds.iterator().next().system).isEqualTo("JIRA");
+    assertThat(trackingIds.iterator().next().id).isEqualTo("JRA001");
+  }
+
+  @Test
+  public void starUnstar() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String triplet = project.get() + "~master~" + r.getChangeId();
+    changeIndexedCounter.clear();
+
+    gApi.accounts().self().starChange(triplet);
+    ChangeInfo change = info(triplet);
+    assertThat(change.starred).isTrue();
+    assertThat(change.stars).contains(DEFAULT_LABEL);
+    changeIndexedCounter.assertReindexOf(change);
+
+    gApi.accounts().self().unstarChange(triplet);
+    change = info(triplet);
+    assertThat(change.starred).isNull();
+    assertThat(change.stars).isNull();
+    changeIndexedCounter.assertReindexOf(change);
+  }
+
+  @Test
+  public void ignore() throws Exception {
+    String email = "user2@example.com";
+    String fullname = "User2";
+    accountOperations
+        .newAccount()
+        .username("user2")
+        .preferredEmail(email)
+        .fullname(fullname)
+        .create();
+
+    PushOneCommit.Result r = createChange();
+
+    AddReviewerInput in = new AddReviewerInput();
+    in.reviewer = user.email;
+    gApi.changes().id(r.getChangeId()).addReviewer(in);
+
+    in = new AddReviewerInput();
+    in.reviewer = email;
+    gApi.changes().id(r.getChangeId()).addReviewer(in);
+
+    setApiUser(user);
+    gApi.changes().id(r.getChangeId()).ignore(true);
+    assertThat(gApi.changes().id(r.getChangeId()).ignored()).isTrue();
+
+    // New patch set notification is not sent to users ignoring the change
+    sender.clear();
+    setApiUser(admin);
+    amendChange(r.getChangeId());
+    List<Message> messages = sender.getMessages();
+    assertThat(messages).hasSize(1);
+    Address address = new Address(fullname, email);
+    assertThat(messages.get(0).rcpt()).containsExactly(address);
+
+    // Review notification is not sent to users ignoring the change
+    sender.clear();
+    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve());
+    messages = sender.getMessages();
+    assertThat(messages).hasSize(1);
+    assertThat(messages.get(0).rcpt()).containsExactly(address);
+
+    // Abandoned notification is not sent to users ignoring the change
+    sender.clear();
+    gApi.changes().id(r.getChangeId()).abandon();
+    messages = sender.getMessages();
+    assertThat(messages).hasSize(1);
+    assertThat(messages.get(0).rcpt()).containsExactly(address);
+
+    setApiUser(user);
+    gApi.changes().id(r.getChangeId()).ignore(false);
+    assertThat(gApi.changes().id(r.getChangeId()).ignored()).isFalse();
+  }
+
+  @Test
+  public void cannotIgnoreOwnChange() throws Exception {
+    String changeId = createChange().getChangeId();
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("cannot ignore own change");
+    gApi.changes().id(changeId).ignore(true);
+  }
+
+  @Test
+  public void cannotIgnoreStarredChange() throws Exception {
+    String changeId = createChange().getChangeId();
+
+    setApiUser(user);
+    gApi.accounts().self().starChange(changeId);
+    assertThat(gApi.changes().id(changeId).get().starred).isTrue();
+
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage(
+        "The labels "
+            + StarredChangesUtil.DEFAULT_LABEL
+            + " and "
+            + StarredChangesUtil.IGNORE_LABEL
+            + " are mutually exclusive. Only one of them can be set.");
+    gApi.changes().id(changeId).ignore(true);
+  }
+
+  @Test
+  public void cannotStarIgnoredChange() throws Exception {
+    String changeId = createChange().getChangeId();
+
+    setApiUser(user);
+    gApi.changes().id(changeId).ignore(true);
+    assertThat(gApi.changes().id(changeId).ignored()).isTrue();
+
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage(
+        "The labels "
+            + StarredChangesUtil.DEFAULT_LABEL
+            + " and "
+            + StarredChangesUtil.IGNORE_LABEL
+            + " are mutually exclusive. Only one of them can be set.");
+    gApi.accounts().self().starChange(changeId);
+  }
+
+  @Test
+  public void markAsReviewed() throws Exception {
+    com.google.gerrit.acceptance.TestAccount user2 = accountCreator.user2();
+
+    PushOneCommit.Result r = createChange();
+
+    AddReviewerInput in = new AddReviewerInput();
+    in.reviewer = user.email;
+    gApi.changes().id(r.getChangeId()).addReviewer(in);
+
+    setApiUser(user);
+    assertThat(gApi.changes().id(r.getChangeId()).get().reviewed).isNull();
+    gApi.changes().id(r.getChangeId()).markAsReviewed(true);
+    assertThat(gApi.changes().id(r.getChangeId()).get().reviewed).isTrue();
+
+    setApiUser(user2);
+    sender.clear();
+    amendChange(r.getChangeId());
+
+    setApiUser(user);
+    assertThat(gApi.changes().id(r.getChangeId()).get().reviewed).isNull();
+
+    List<Message> messages = sender.getMessages();
+    assertThat(messages).hasSize(1);
+    assertThat(messages.get(0).rcpt()).containsExactly(user.emailAddress);
+  }
+
+  @Test
+  public void cannotSetUnreviewedLabelForPatchSetThatAlreadyHasReviewedLabel() throws Exception {
+    String changeId = createChange().getChangeId();
+
+    setApiUser(user);
+    gApi.changes().id(changeId).markAsReviewed(true);
+    assertThat(gApi.changes().id(changeId).get().reviewed).isTrue();
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage(
+        "The labels "
+            + StarredChangesUtil.REVIEWED_LABEL
+            + "/"
+            + 1
+            + " and "
+            + StarredChangesUtil.UNREVIEWED_LABEL
+            + "/"
+            + 1
+            + " are mutually exclusive. Only one of them can be set.");
+    gApi.accounts()
+        .self()
+        .setStars(
+            changeId, new StarsInput(ImmutableSet.of(StarredChangesUtil.UNREVIEWED_LABEL + "/1")));
+  }
+
+  @Test
+  public void cannotSetReviewedLabelForPatchSetThatAlreadyHasUnreviewedLabel() throws Exception {
+    String changeId = createChange().getChangeId();
+
+    setApiUser(user);
+    gApi.changes().id(changeId).markAsReviewed(false);
+    assertThat(gApi.changes().id(changeId).get().reviewed).isNull();
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage(
+        "The labels "
+            + StarredChangesUtil.REVIEWED_LABEL
+            + "/"
+            + 1
+            + " and "
+            + StarredChangesUtil.UNREVIEWED_LABEL
+            + "/"
+            + 1
+            + " are mutually exclusive. Only one of them can be set.");
+    gApi.accounts()
+        .self()
+        .setStars(
+            changeId, new StarsInput(ImmutableSet.of(StarredChangesUtil.REVIEWED_LABEL + "/1")));
+  }
+
+  @Test
+  public void setReviewedAndUnreviewedLabelsForDifferentPatchSets() throws Exception {
+    String changeId = createChange().getChangeId();
+
+    setApiUser(user);
+    gApi.changes().id(changeId).markAsReviewed(true);
+    assertThat(gApi.changes().id(changeId).get().reviewed).isTrue();
+
+    amendChange(changeId);
+    assertThat(gApi.changes().id(changeId).get().reviewed).isNull();
+
+    gApi.changes().id(changeId).markAsReviewed(false);
+    assertThat(gApi.changes().id(changeId).get().reviewed).isNull();
+
+    assertThat(gApi.accounts().self().getStars(changeId))
+        .containsExactly(
+            StarredChangesUtil.REVIEWED_LABEL + "/" + 1,
+            StarredChangesUtil.UNREVIEWED_LABEL + "/" + 2);
+  }
+
+  @Test
+  public void cannotSetInvalidLabel() throws Exception {
+    String changeId = createChange().getChangeId();
+
+    // label cannot contain whitespace
+    String invalidLabel = "invalid label";
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("invalid labels: " + invalidLabel);
+    gApi.accounts().self().setStars(changeId, new StarsInput(ImmutableSet.of(invalidLabel)));
+  }
+
+  @Test
+  public void changeDetailsDoesNotRequireIndex() throws Exception {
+    PushOneCommit.Result change = createChange();
+    int number = gApi.changes().id(change.getChangeId()).get()._number;
+
+    try (AutoCloseable ctx = disableChangeIndex()) {
+      assertThat(gApi.changes().id(project.get(), number).get(ImmutableSet.of()).changeId)
+          .isEqualTo(change.getChangeId());
+    }
+  }
+
+  private PushOneCommit.Result createWorkInProgressChange() throws Exception {
+    return pushTo("refs/for/master%wip");
+  }
+
+  private BranchApi createBranch(String branch) throws Exception {
+    return createBranch(new Branch.NameKey(project, branch));
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/api/change/ChangeIdIT.java b/javatests/com/google/gerrit/acceptance/api/change/ChangeIdIT.java
new file mode 100644
index 0000000..fe7da66
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/change/ChangeIdIT.java
@@ -0,0 +1,146 @@
+// Copyright (C) 2017 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.google.gerrit.acceptance.api.change;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.GerritConfig;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.extensions.api.changes.ChangeApi;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.ChangeInput;
+import com.google.gerrit.extensions.restapi.DeprecatedIdentifierException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.reviewdb.client.Project;
+import org.junit.Before;
+import org.junit.Test;
+
+@NoHttpd
+public class ChangeIdIT extends AbstractDaemonTest {
+  private ChangeInfo changeInfo;
+
+  @Before
+  public void setup() throws Exception {
+    changeInfo = gApi.changes().create(new ChangeInput(project.get(), "master", "msg")).get();
+  }
+
+  @Test
+  public void projectChangeNumberReturnsChange() throws Exception {
+    ChangeApi cApi = gApi.changes().id(project.get(), changeInfo._number);
+    assertThat(cApi.get().changeId).isEqualTo(changeInfo.changeId);
+  }
+
+  @Test
+  public void projectChangeNumberReturnsChangeWhenProjectContainsSlashes() throws Exception {
+    Project.NameKey p = createProject("foo/bar");
+    ChangeInfo ci = gApi.changes().create(new ChangeInput(p.get(), "master", "msg")).get();
+    ChangeApi cApi = gApi.changes().id(p.get(), ci._number);
+    assertThat(cApi.get().changeId).isEqualTo(ci.changeId);
+  }
+
+  @Test
+  public void wrongProjectInProjectChangeNumberReturnsNotFound() throws Exception {
+    exception.expect(ResourceNotFoundException.class);
+    exception.expectMessage("Not found: unknown~" + changeInfo._number);
+    gApi.changes().id("unknown", changeInfo._number);
+  }
+
+  @Test
+  public void wrongIdInProjectChangeNumberReturnsNotFound() throws Exception {
+    exception.expect(ResourceNotFoundException.class);
+    exception.expectMessage("Not found: " + project.get() + "~" + Integer.MAX_VALUE);
+    gApi.changes().id(project.get(), Integer.MAX_VALUE);
+  }
+
+  @Test
+  public void changeNumberReturnsChange() throws Exception {
+    ChangeApi cApi = gApi.changes().id(changeInfo._number);
+    assertThat(cApi.get().changeId).isEqualTo(changeInfo.changeId);
+  }
+
+  @Test
+  public void wrongChangeNumberReturnsNotFound() throws Exception {
+    exception.expect(ResourceNotFoundException.class);
+    gApi.changes().id(Integer.MAX_VALUE);
+  }
+
+  @Test
+  public void tripletChangeIdReturnsChange() throws Exception {
+    ChangeApi cApi = gApi.changes().id(project.get(), changeInfo.branch, changeInfo.changeId);
+    assertThat(cApi.get().changeId).isEqualTo(changeInfo.changeId);
+  }
+
+  @Test
+  public void wrongProjectInTripletChangeIdReturnsNotFound() throws Exception {
+    exception.expect(ResourceNotFoundException.class);
+    exception.expectMessage("Not found: unknown~" + changeInfo.branch + "~" + changeInfo.changeId);
+    gApi.changes().id("unknown", changeInfo.branch, changeInfo.changeId);
+  }
+
+  @Test
+  public void wrongBranchInTripletChangeIdReturnsNotFound() throws Exception {
+    exception.expect(ResourceNotFoundException.class);
+    exception.expectMessage("Not found: " + project.get() + "~unknown~" + changeInfo.changeId);
+    gApi.changes().id(project.get(), "unknown", changeInfo.changeId);
+  }
+
+  @Test
+  public void wrongIdInTripletChangeIdReturnsNotFound() throws Exception {
+    String unknownId = "I1234567890";
+    exception.expect(ResourceNotFoundException.class);
+    exception.expectMessage(
+        "Not found: " + project.get() + "~" + changeInfo.branch + "~" + unknownId);
+    gApi.changes().id(project.get(), changeInfo.branch, unknownId);
+  }
+
+  @Test
+  public void changeIdReturnsChange() throws Exception {
+    // ChangeId is not unique and this method needs a unique changeId to work.
+    // Hence we generate a new change with a different content.
+    ChangeInfo ci =
+        gApi.changes().create(new ChangeInput(project.get(), "master", "different message")).get();
+    ChangeApi cApi = gApi.changes().id(ci.changeId);
+    assertThat(cApi.get()._number).isEqualTo(ci._number);
+  }
+
+  @Test
+  public void wrongChangeIdReturnsNotFound() throws Exception {
+    exception.expect(ResourceNotFoundException.class);
+    gApi.changes().id("I1234567890");
+  }
+
+  @Test
+  @GerritConfig(
+      name = "change.api.allowedIdentifier",
+      values = {"PROJECT_NUMERIC_ID", "NUMERIC_ID"})
+  public void deprecatedChangeIdReturnsBadRequest() throws Exception {
+    // project~changeNumber still works
+    ChangeApi cApi1 = gApi.changes().id(project.get(), changeInfo._number);
+    assertThat(cApi1.get().changeId).isEqualTo(changeInfo.changeId);
+    // Change number still works
+    ChangeApi cApi2 = gApi.changes().id(changeInfo._number);
+    assertThat(cApi2.get().changeId).isEqualTo(changeInfo.changeId);
+    // IHash throws
+    ChangeInfo ci =
+        gApi.changes().create(new ChangeInput(project.get(), "master", "different message")).get();
+    exception.expect(DeprecatedIdentifierException.class);
+    exception.expectMessage(
+        "The provided change identifier "
+            + ci.changeId
+            + " is deprecated. Use 'project~changeNumber' instead.");
+    gApi.changes().id(ci.changeId);
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/api/change/ChangeSubmitRequirementIT.java b/javatests/com/google/gerrit/acceptance/api/change/ChangeSubmitRequirementIT.java
new file mode 100644
index 0000000..f087b78
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/change/ChangeSubmitRequirementIT.java
@@ -0,0 +1,78 @@
+// 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.
+
+package com.google.gerrit.acceptance.api.change;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.common.data.SubmitRecord;
+import com.google.gerrit.common.data.SubmitRequirement;
+import com.google.gerrit.extensions.annotations.Exports;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.SubmitRequirementInfo;
+import com.google.gerrit.extensions.config.FactoryModule;
+import com.google.gerrit.server.project.SubmitRuleOptions;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.rules.SubmitRule;
+import com.google.inject.Module;
+import java.util.ArrayList;
+import java.util.Collection;
+import org.junit.Test;
+
+public class ChangeSubmitRequirementIT extends AbstractDaemonTest {
+  private static final SubmitRequirement req =
+      SubmitRequirement.builder()
+          .setType("custom_rule")
+          .setFallbackText("Fallback text")
+          .addCustomValue("key", "value")
+          .build();
+  private static final SubmitRequirementInfo reqInfo =
+      new SubmitRequirementInfo(
+          "NOT_READY", "Fallback text", "custom_rule", ImmutableMap.of("key", "value"));
+
+  @Override
+  public Module createModule() {
+    return new FactoryModule() {
+      @Override
+      public void configure() {
+        bind(SubmitRule.class)
+            .annotatedWith(Exports.named("CustomSubmitRule"))
+            .to(CustomSubmitRule.class);
+      }
+    };
+  }
+
+  @Test
+  public void checkSubmitRequirementIsPropagated() throws Exception {
+    PushOneCommit.Result r = createChange();
+
+    ChangeInfo result = gApi.changes().id(r.getChangeId()).get();
+    assertThat(result.requirements).containsExactly(reqInfo);
+  }
+
+  private static class CustomSubmitRule implements SubmitRule {
+    @Override
+    public Collection<SubmitRecord> evaluate(ChangeData changeData, SubmitRuleOptions options) {
+      SubmitRecord record = new SubmitRecord();
+      record.labels = new ArrayList<>();
+      record.status = SubmitRecord.Status.NOT_READY;
+      record.requirements = ImmutableList.of(req);
+      return ImmutableList.of(record);
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/api/change/DisablePrivateChangesIT.java b/javatests/com/google/gerrit/acceptance/api/change/DisablePrivateChangesIT.java
new file mode 100644
index 0000000..ffb8b34
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/change/DisablePrivateChangesIT.java
@@ -0,0 +1,121 @@
+// Copyright (C) 2017 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.google.gerrit.acceptance.api.change;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.GerritConfig;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.extensions.common.ChangeInput;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.junit.Test;
+
+public class DisablePrivateChangesIT extends AbstractDaemonTest {
+
+  @Test
+  @GerritConfig(name = "change.disablePrivateChanges", value = "true")
+  public void createPrivateChangeWithDisablePrivateChangesTrue() throws Exception {
+    ChangeInput input = new ChangeInput(project.get(), "master", "empty change");
+    input.isPrivate = true;
+    exception.expect(MethodNotAllowedException.class);
+    exception.expectMessage("private changes are disabled");
+    gApi.changes().create(input);
+  }
+
+  @Test
+  @GerritConfig(name = "change.disablePrivateChanges", value = "true")
+  public void createNonPrivateChangeWithDisablePrivateChangesTrue() throws Exception {
+    ChangeInput input = new ChangeInput(project.get(), "master", "empty change");
+    assertThat(gApi.changes().create(input).get().isPrivate).isNull();
+  }
+
+  @Test
+  public void createPrivateChangeWithDisablePrivateChangesFalse() throws Exception {
+    ChangeInput input = new ChangeInput(project.get(), "master", "empty change");
+    input.isPrivate = true;
+    assertThat(gApi.changes().create(input).get().isPrivate).isTrue();
+  }
+
+  @Test
+  @GerritConfig(name = "change.disablePrivateChanges", value = "true")
+  public void pushPrivatesWithDisablePrivateChangesTrue() throws Exception {
+    PushOneCommit.Result result =
+        pushFactory.create(db, admin.getIdent(), testRepo).to("refs/for/master%private");
+    result.assertErrorStatus();
+  }
+
+  @Test
+  @GerritConfig(name = "change.allowDrafts", value = "true")
+  @GerritConfig(name = "change.disablePrivateChanges", value = "true")
+  public void pushDraftsWithDisablePrivateChangesTrue() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+    PushOneCommit.Result result =
+        pushFactory.create(db, admin.getIdent(), testRepo).to("refs/for/master%draft");
+    result.assertErrorStatus();
+
+    testRepo.reset(initialHead);
+    result = pushFactory.create(db, admin.getIdent(), testRepo).to("refs/drafts/master");
+    result.assertErrorStatus();
+  }
+
+  @Test
+  @GerritConfig(name = "change.disablePrivateChanges", value = "true")
+  public void pushWithDisablePrivateChangesTrue() throws Exception {
+    PushOneCommit.Result result =
+        pushFactory.create(db, admin.getIdent(), testRepo).to("refs/for/master");
+    result.assertOkStatus();
+    assertThat(result.getChange().change().isPrivate()).isFalse();
+  }
+
+  @Test
+  @GerritConfig(name = "change.allowDrafts", value = "true")
+  public void pushPrivatesWithDisablePrivateChangesFalse() throws Exception {
+    PushOneCommit.Result result =
+        pushFactory.create(db, admin.getIdent(), testRepo).to("refs/for/master%private");
+    assertThat(result.getChange().change().isPrivate()).isTrue();
+  }
+
+  @Test
+  @GerritConfig(name = "change.allowDrafts", value = "true")
+  public void pushDraftsWithDisablePrivateChangesFalse() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+    PushOneCommit.Result result =
+        pushFactory.create(db, admin.getIdent(), testRepo).to("refs/for/master%draft");
+    assertThat(result.getChange().change().isPrivate()).isTrue();
+
+    testRepo.reset(initialHead);
+    result = pushFactory.create(db, admin.getIdent(), testRepo).to("refs/drafts/master");
+    assertThat(result.getChange().change().isPrivate()).isTrue();
+  }
+
+  @Test
+  @GerritConfig(name = "change.disablePrivateChanges", value = "true")
+  public void setPrivateWithDisablePrivateChangesTrue() throws Exception {
+    PushOneCommit.Result result = createChange();
+
+    exception.expect(MethodNotAllowedException.class);
+    exception.expectMessage("private changes are disabled");
+    gApi.changes().id(result.getChangeId()).setPrivate(true, "set private");
+  }
+
+  @Test
+  public void setPrivateWithDisablePrivateChangesFalse() throws Exception {
+    PushOneCommit.Result result = createChange();
+    gApi.changes().id(result.getChangeId()).setPrivate(true, "set private");
+    assertThat(gApi.changes().id(result.getChangeId()).get().isPrivate).isTrue();
+  }
+}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/MergeListIT.java b/javatests/com/google/gerrit/acceptance/api/change/MergeListIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/MergeListIT.java
rename to javatests/com/google/gerrit/acceptance/api/change/MergeListIT.java
diff --git a/javatests/com/google/gerrit/acceptance/api/change/StickyApprovalsIT.java b/javatests/com/google/gerrit/acceptance/api/change/StickyApprovalsIT.java
new file mode 100644
index 0000000..b23b2bf
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/change/StickyApprovalsIT.java
@@ -0,0 +1,604 @@
+// 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.
+
+package com.google.gerrit.acceptance.api.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.extensions.client.ChangeKind.MERGE_FIRST_PARENT_UPDATE;
+import static com.google.gerrit.extensions.client.ChangeKind.NO_CHANGE;
+import static com.google.gerrit.extensions.client.ChangeKind.NO_CODE_CHANGE;
+import static com.google.gerrit.extensions.client.ChangeKind.REWORK;
+import static com.google.gerrit.extensions.client.ChangeKind.TRIVIAL_REBASE;
+import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_COMMIT;
+import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_REVISION;
+import static com.google.gerrit.extensions.client.ListChangesOption.DETAILED_LABELS;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static com.google.gerrit.server.project.testing.Util.category;
+import static com.google.gerrit.server.project.testing.Util.value;
+import static org.eclipse.jgit.lib.Constants.HEAD;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.GitUtil;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.TestAccount;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.changes.CherryPickInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.changes.RevisionApi;
+import com.google.gerrit.extensions.client.ChangeKind;
+import com.google.gerrit.extensions.common.ApprovalInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.CommitInfo;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.project.testing.Util;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.junit.Before;
+import org.junit.Test;
+
+@NoHttpd
+public class StickyApprovalsIT extends AbstractDaemonTest {
+
+  @Before
+  public void setup() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      // Overwrite "Code-Review" label that is inherited from All-Projects.
+      // This way changes to the "Code Review" label don't affect other tests.
+      LabelType codeReview =
+          category(
+              "Code-Review",
+              value(2, "Looks good to me, approved"),
+              value(1, "Looks good to me, but someone else must approve"),
+              value(0, "No score"),
+              value(-1, "I would prefer that you didn't submit this"),
+              value(-2, "Do not submit"));
+      codeReview.setCopyAllScoresIfNoChange(false);
+      u.getConfig().getLabelSections().put(codeReview.getName(), codeReview);
+
+      LabelType verified =
+          category("Verified", value(1, "Passes"), value(0, "No score"), value(-1, "Failed"));
+      verified.setCopyAllScoresIfNoChange(false);
+      u.getConfig().getLabelSections().put(verified.getName(), verified);
+
+      AccountGroup.UUID registeredUsers = systemGroupBackend.getGroup(REGISTERED_USERS).getUUID();
+      String heads = RefNames.REFS_HEADS + "*";
+      Util.allow(
+          u.getConfig(),
+          Permission.forLabel(Util.codeReview().getName()),
+          -2,
+          2,
+          registeredUsers,
+          heads);
+      Util.allow(
+          u.getConfig(),
+          Permission.forLabel(Util.verified().getName()),
+          -1,
+          1,
+          registeredUsers,
+          heads);
+      u.save();
+    }
+  }
+
+  @Test
+  public void notSticky() throws Exception {
+    assertNotSticky(
+        EnumSet.of(REWORK, TRIVIAL_REBASE, NO_CODE_CHANGE, MERGE_FIRST_PARENT_UPDATE, NO_CHANGE));
+  }
+
+  @Test
+  public void stickyOnMinScore() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      u.getConfig().getLabelSections().get("Code-Review").setCopyMinScore(true);
+      u.save();
+    }
+
+    for (ChangeKind changeKind :
+        EnumSet.of(REWORK, TRIVIAL_REBASE, NO_CODE_CHANGE, MERGE_FIRST_PARENT_UPDATE, NO_CHANGE)) {
+      testRepo.reset(getRemoteHead());
+
+      String changeId = createChange(changeKind);
+      vote(admin, changeId, -1, 1);
+      vote(user, changeId, -2, -1);
+
+      updateChange(changeId, changeKind);
+      ChangeInfo c = detailedChange(changeId);
+      assertVotes(c, admin, 0, 0, changeKind);
+      assertVotes(c, user, -2, 0, changeKind);
+    }
+  }
+
+  @Test
+  public void stickyOnMaxScore() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      u.getConfig().getLabelSections().get("Code-Review").setCopyMaxScore(true);
+      u.save();
+    }
+
+    for (ChangeKind changeKind :
+        EnumSet.of(REWORK, TRIVIAL_REBASE, NO_CODE_CHANGE, MERGE_FIRST_PARENT_UPDATE, NO_CHANGE)) {
+      testRepo.reset(getRemoteHead());
+
+      String changeId = createChange(changeKind);
+      vote(admin, changeId, 2, 1);
+      vote(user, changeId, 1, -1);
+
+      updateChange(changeId, changeKind);
+      ChangeInfo c = detailedChange(changeId);
+      assertVotes(c, admin, 2, 0, changeKind);
+      assertVotes(c, user, 0, 0, changeKind);
+    }
+  }
+
+  @Test
+  public void stickyOnTrivialRebase() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      u.getConfig().getLabelSections().get("Code-Review").setCopyAllScoresOnTrivialRebase(true);
+      u.save();
+    }
+
+    String changeId = createChange(TRIVIAL_REBASE);
+    vote(admin, changeId, 2, 1);
+    vote(user, changeId, -2, -1);
+
+    updateChange(changeId, NO_CHANGE);
+    ChangeInfo c = detailedChange(changeId);
+    assertVotes(c, admin, 2, 0, NO_CHANGE);
+    assertVotes(c, user, -2, 0, NO_CHANGE);
+
+    updateChange(changeId, TRIVIAL_REBASE);
+    c = detailedChange(changeId);
+    assertVotes(c, admin, 2, 0, TRIVIAL_REBASE);
+    assertVotes(c, user, -2, 0, TRIVIAL_REBASE);
+
+    assertNotSticky(EnumSet.of(REWORK, NO_CODE_CHANGE, MERGE_FIRST_PARENT_UPDATE));
+
+    // check that votes are sticky when trivial rebase is done by cherry-pick
+    testRepo.reset(getRemoteHead());
+    changeId = createChange().getChangeId();
+    vote(admin, changeId, 2, 1);
+    vote(user, changeId, -2, -1);
+
+    String cherryPickChangeId = cherryPick(changeId, TRIVIAL_REBASE);
+    c = detailedChange(cherryPickChangeId);
+    assertVotes(c, admin, 2, 0);
+    assertVotes(c, user, -2, 0);
+
+    // check that votes are not sticky when rework is done by cherry-pick
+    testRepo.reset(getRemoteHead());
+    changeId = createChange().getChangeId();
+    vote(admin, changeId, 2, 1);
+    vote(user, changeId, -2, -1);
+
+    cherryPickChangeId = cherryPick(changeId, REWORK);
+    c = detailedChange(cherryPickChangeId);
+    assertVotes(c, admin, 0, 0);
+    assertVotes(c, user, 0, 0);
+  }
+
+  @Test
+  public void stickyOnNoCodeChange() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      u.getConfig().getLabelSections().get("Verified").setCopyAllScoresIfNoCodeChange(true);
+      u.save();
+    }
+
+    String changeId = createChange(NO_CODE_CHANGE);
+    vote(admin, changeId, 2, 1);
+    vote(user, changeId, -2, -1);
+
+    updateChange(changeId, NO_CHANGE);
+    ChangeInfo c = detailedChange(changeId);
+    assertVotes(c, admin, 0, 1, NO_CHANGE);
+    assertVotes(c, user, 0, -1, NO_CHANGE);
+
+    updateChange(changeId, NO_CODE_CHANGE);
+    c = detailedChange(changeId);
+    assertVotes(c, admin, 0, 1, NO_CODE_CHANGE);
+    assertVotes(c, user, 0, -1, NO_CODE_CHANGE);
+
+    assertNotSticky(EnumSet.of(REWORK, TRIVIAL_REBASE, MERGE_FIRST_PARENT_UPDATE));
+  }
+
+  @Test
+  public void stickyOnMergeFirstParentUpdate() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      u.getConfig()
+          .getLabelSections()
+          .get("Code-Review")
+          .setCopyAllScoresOnMergeFirstParentUpdate(true);
+      u.save();
+    }
+
+    String changeId = createChange(MERGE_FIRST_PARENT_UPDATE);
+    vote(admin, changeId, 2, 1);
+    vote(user, changeId, -2, -1);
+
+    updateChange(changeId, NO_CHANGE);
+    ChangeInfo c = detailedChange(changeId);
+    assertVotes(c, admin, 2, 0, NO_CHANGE);
+    assertVotes(c, user, -2, 0, NO_CHANGE);
+
+    updateChange(changeId, MERGE_FIRST_PARENT_UPDATE);
+    c = detailedChange(changeId);
+    assertVotes(c, admin, 2, 0, MERGE_FIRST_PARENT_UPDATE);
+    assertVotes(c, user, -2, 0, MERGE_FIRST_PARENT_UPDATE);
+
+    assertNotSticky(EnumSet.of(REWORK, NO_CODE_CHANGE, TRIVIAL_REBASE));
+  }
+
+  @Test
+  public void removedVotesNotSticky() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      u.getConfig().getLabelSections().get("Code-Review").setCopyAllScoresOnTrivialRebase(true);
+      u.getConfig().getLabelSections().get("Verified").setCopyAllScoresIfNoCodeChange(true);
+      u.save();
+    }
+
+    for (ChangeKind changeKind :
+        EnumSet.of(REWORK, TRIVIAL_REBASE, NO_CODE_CHANGE, MERGE_FIRST_PARENT_UPDATE, NO_CHANGE)) {
+      testRepo.reset(getRemoteHead());
+
+      String changeId = createChange(changeKind);
+      vote(admin, changeId, 2, 1);
+      vote(user, changeId, -2, -1);
+
+      // Remove votes by re-voting with 0
+      vote(admin, changeId, 0, 0);
+      vote(user, changeId, 0, 0);
+      ChangeInfo c = detailedChange(changeId);
+      assertVotes(c, admin, 0, 0, null);
+      assertVotes(c, user, 0, 0, null);
+
+      updateChange(changeId, changeKind);
+      c = detailedChange(changeId);
+      assertVotes(c, admin, 0, 0, changeKind);
+      assertVotes(c, user, 0, 0, changeKind);
+    }
+  }
+
+  @Test
+  public void stickyAcrossMultiplePatchSets() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      u.getConfig().getLabelSections().get("Code-Review").setCopyMaxScore(true);
+      u.getConfig().getLabelSections().get("Verified").setCopyAllScoresIfNoCodeChange(true);
+      u.save();
+    }
+
+    String changeId = createChange(REWORK);
+    vote(admin, changeId, 2, 1);
+
+    for (int i = 0; i < 5; i++) {
+      updateChange(changeId, NO_CODE_CHANGE);
+      ChangeInfo c = detailedChange(changeId);
+      assertVotes(c, admin, 2, 1, NO_CODE_CHANGE);
+    }
+
+    updateChange(changeId, REWORK);
+    ChangeInfo c = detailedChange(changeId);
+    assertVotes(c, admin, 2, 0, REWORK);
+  }
+
+  @Test
+  public void copyMinMaxAcrossMultiplePatchSets() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      u.getConfig().getLabelSections().get("Code-Review").setCopyMaxScore(true);
+      u.getConfig().getLabelSections().get("Code-Review").setCopyMinScore(true);
+      u.save();
+    }
+
+    // Vote max score on PS1
+    String changeId = createChange(REWORK);
+    vote(admin, changeId, 2, 1);
+
+    // Have someone else vote min score on PS2
+    updateChange(changeId, REWORK);
+    vote(user, changeId, -2, 0);
+    ChangeInfo c = detailedChange(changeId);
+    assertVotes(c, admin, 2, 0, REWORK);
+    assertVotes(c, user, -2, 0, REWORK);
+
+    // No vote changes on PS3
+    updateChange(changeId, REWORK);
+    c = detailedChange(changeId);
+    assertVotes(c, admin, 2, 0, REWORK);
+    assertVotes(c, user, -2, 0, REWORK);
+
+    // Both users revote on PS4
+    updateChange(changeId, REWORK);
+    vote(admin, changeId, 1, 1);
+    vote(user, changeId, 1, 1);
+    c = detailedChange(changeId);
+    assertVotes(c, admin, 1, 1, REWORK);
+    assertVotes(c, user, 1, 1, REWORK);
+
+    // New approvals shouldn't carry through to PS5
+    updateChange(changeId, REWORK);
+    c = detailedChange(changeId);
+    assertVotes(c, admin, 0, 0, REWORK);
+    assertVotes(c, user, 0, 0, REWORK);
+  }
+
+  @Test
+  public void deleteStickyVote() throws Exception {
+    String label = "Code-Review";
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      u.getConfig().getLabelSections().get(label).setCopyMaxScore(true);
+      u.save();
+    }
+
+    // Vote max score on PS1
+    String changeId = createChange(REWORK);
+    vote(admin, changeId, label, 2);
+    assertVotes(detailedChange(changeId), admin, label, 2, null);
+    updateChange(changeId, REWORK);
+    assertVotes(detailedChange(changeId), admin, label, 2, REWORK);
+
+    // Delete vote that was copied via sticky approval
+    deleteVote(admin, changeId, "Code-Review");
+    assertVotes(detailedChange(changeId), admin, label, 0, REWORK);
+  }
+
+  private ChangeInfo detailedChange(String changeId) throws Exception {
+    return gApi.changes().id(changeId).get(DETAILED_LABELS, CURRENT_REVISION, CURRENT_COMMIT);
+  }
+
+  private void assertNotSticky(Set<ChangeKind> changeKinds) throws Exception {
+    for (ChangeKind changeKind : changeKinds) {
+      testRepo.reset(getRemoteHead());
+
+      String changeId = createChange(changeKind);
+      vote(admin, changeId, +2, 1);
+      vote(user, changeId, -2, -1);
+
+      updateChange(changeId, changeKind);
+      ChangeInfo c = detailedChange(changeId);
+      assertVotes(c, admin, 0, 0, changeKind);
+      assertVotes(c, user, 0, 0, changeKind);
+    }
+  }
+
+  private String createChange(ChangeKind kind) throws Exception {
+    switch (kind) {
+      case NO_CODE_CHANGE:
+      case REWORK:
+      case TRIVIAL_REBASE:
+      case NO_CHANGE:
+        return createChange().getChangeId();
+      case MERGE_FIRST_PARENT_UPDATE:
+        return createChangeForMergeCommit();
+      default:
+        throw new IllegalStateException("unexpected change kind: " + kind);
+    }
+  }
+
+  private void updateChange(String changeId, ChangeKind changeKind) throws Exception {
+    switch (changeKind) {
+      case NO_CODE_CHANGE:
+        noCodeChange(changeId);
+        return;
+      case REWORK:
+        rework(changeId);
+        return;
+      case TRIVIAL_REBASE:
+        trivialRebase(changeId);
+        return;
+      case MERGE_FIRST_PARENT_UPDATE:
+        updateFirstParent(changeId);
+        return;
+      case NO_CHANGE:
+        noChange(changeId);
+        return;
+      default:
+        fail("unexpected change kind: " + changeKind);
+    }
+  }
+
+  private void noCodeChange(String changeId) throws Exception {
+    TestRepository<?>.CommitBuilder commitBuilder =
+        testRepo.amendRef("HEAD").insertChangeId(changeId.substring(1));
+    commitBuilder
+        .message("New subject " + System.nanoTime())
+        .author(admin.getIdent())
+        .committer(new PersonIdent(admin.getIdent(), testRepo.getDate()));
+    commitBuilder.create();
+    GitUtil.pushHead(testRepo, "refs/for/master", false);
+    assertThat(getChangeKind(changeId)).isEqualTo(NO_CODE_CHANGE);
+  }
+
+  private void noChange(String changeId) throws Exception {
+    ChangeInfo change = gApi.changes().id(changeId).get();
+    String commitMessage = change.revisions.get(change.currentRevision).commit.message;
+
+    TestRepository<?>.CommitBuilder commitBuilder =
+        testRepo.amendRef("HEAD").insertChangeId(changeId.substring(1));
+    commitBuilder
+        .message(commitMessage)
+        .author(admin.getIdent())
+        .committer(new PersonIdent(admin.getIdent(), testRepo.getDate()));
+    commitBuilder.create();
+    GitUtil.pushHead(testRepo, "refs/for/master", false);
+    assertThat(getChangeKind(changeId)).isEqualTo(NO_CHANGE);
+  }
+
+  private void rework(String changeId) throws Exception {
+    PushOneCommit push =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            testRepo,
+            PushOneCommit.SUBJECT,
+            PushOneCommit.FILE_NAME,
+            "new content " + System.nanoTime(),
+            changeId);
+    push.to("refs/for/master").assertOkStatus();
+    assertThat(getChangeKind(changeId)).isEqualTo(REWORK);
+  }
+
+  private void trivialRebase(String changeId) throws Exception {
+    setApiUser(admin);
+    testRepo.reset(getRemoteHead());
+    PushOneCommit push =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            testRepo,
+            "Other Change",
+            "a" + System.nanoTime() + ".txt",
+            PushOneCommit.FILE_CONTENT);
+    PushOneCommit.Result r = push.to("refs/for/master");
+    r.assertOkStatus();
+    RevisionApi revision = gApi.changes().id(r.getChangeId()).current();
+    ReviewInput in = new ReviewInput().label("Code-Review", 2).label("Verified", 1);
+    revision.review(in);
+    revision.submit();
+
+    gApi.changes().id(changeId).current().rebase();
+    assertThat(getChangeKind(changeId)).isEqualTo(TRIVIAL_REBASE);
+  }
+
+  private String createChangeForMergeCommit() throws Exception {
+    ObjectId initial = repo().exactRef(HEAD).getLeaf().getObjectId();
+
+    PushOneCommit.Result parent1 = createChange("parent 1", "p1.txt", "content 1");
+
+    testRepo.reset(initial);
+    PushOneCommit.Result parent2 = createChange("parent 2", "p2.txt", "content 2");
+
+    testRepo.reset(parent1.getCommit());
+
+    PushOneCommit merge = pushFactory.create(db, admin.getIdent(), testRepo);
+    merge.setParents(ImmutableList.of(parent1.getCommit(), parent2.getCommit()));
+    PushOneCommit.Result result = merge.to("refs/for/master");
+    result.assertOkStatus();
+    return result.getChangeId();
+  }
+
+  private void updateFirstParent(String changeId) throws Exception {
+    ChangeInfo c = detailedChange(changeId);
+    List<CommitInfo> parents = c.revisions.get(c.currentRevision).commit.parents;
+    String parent1 = parents.get(0).commit;
+    String parent2 = parents.get(1).commit;
+    RevCommit commitParent2 = testRepo.getRevWalk().parseCommit(ObjectId.fromString(parent2));
+
+    testRepo.reset(parent1);
+    PushOneCommit.Result newParent1 = createChange("new parent 1", "p1-1.txt", "content 1-1");
+
+    PushOneCommit merge = pushFactory.create(db, admin.getIdent(), testRepo, changeId);
+    merge.setParents(ImmutableList.of(newParent1.getCommit(), commitParent2));
+    PushOneCommit.Result result = merge.to("refs/for/master");
+    result.assertOkStatus();
+
+    assertThat(getChangeKind(changeId)).isEqualTo(MERGE_FIRST_PARENT_UPDATE);
+  }
+
+  private String cherryPick(String changeId, ChangeKind changeKind) throws Exception {
+    switch (changeKind) {
+      case REWORK:
+      case TRIVIAL_REBASE:
+        break;
+      case NO_CODE_CHANGE:
+      case NO_CHANGE:
+      case MERGE_FIRST_PARENT_UPDATE:
+      default:
+        fail("unexpected change kind: " + changeKind);
+    }
+
+    testRepo.reset(getRemoteHead());
+    PushOneCommit.Result r =
+        pushFactory
+            .create(
+                db,
+                admin.getIdent(),
+                testRepo,
+                PushOneCommit.SUBJECT,
+                "other.txt",
+                "new content " + System.nanoTime())
+            .to("refs/for/master");
+    r.assertOkStatus();
+    vote(admin, r.getChangeId(), 2, 1);
+    merge(r);
+
+    String subject =
+        TRIVIAL_REBASE.equals(changeKind)
+            ? PushOneCommit.SUBJECT
+            : "Reworked change " + System.nanoTime();
+    CherryPickInput in = new CherryPickInput();
+    in.destination = "master";
+    in.message = String.format("%s\n\nChange-Id: %s", subject, changeId);
+    ChangeInfo c = gApi.changes().id(changeId).revision("current").cherryPick(in).get();
+    return c.changeId;
+  }
+
+  private ChangeKind getChangeKind(String changeId) throws Exception {
+    ChangeInfo c = gApi.changes().id(changeId).get(CURRENT_REVISION);
+    return c.revisions.get(c.currentRevision).kind;
+  }
+
+  private void vote(TestAccount user, String changeId, String label, int vote) throws Exception {
+    setApiUser(user);
+    gApi.changes().id(changeId).current().review(new ReviewInput().label(label, vote));
+  }
+
+  private void vote(TestAccount user, String changeId, int codeReviewVote, int verifiedVote)
+      throws Exception {
+    setApiUser(user);
+    ReviewInput in =
+        new ReviewInput().label("Code-Review", codeReviewVote).label("Verified", verifiedVote);
+    gApi.changes().id(changeId).current().review(in);
+  }
+
+  private void deleteVote(TestAccount user, String changeId, String label) throws Exception {
+    setApiUser(user);
+    gApi.changes().id(changeId).reviewer(user.getId().toString()).deleteVote(label);
+  }
+
+  private void assertVotes(ChangeInfo c, TestAccount user, int codeReviewVote, int verifiedVote) {
+    assertVotes(c, user, codeReviewVote, verifiedVote, null);
+  }
+
+  private void assertVotes(
+      ChangeInfo c, TestAccount user, int codeReviewVote, int verifiedVote, ChangeKind changeKind) {
+    assertVotes(c, user, "Code-Review", codeReviewVote, changeKind);
+    assertVotes(c, user, "Verified", verifiedVote, changeKind);
+  }
+
+  private void assertVotes(
+      ChangeInfo c, TestAccount user, String label, int expectedVote, ChangeKind changeKind) {
+    Integer vote = 0;
+    if (c.labels.get(label) != null && c.labels.get(label).all != null) {
+      for (ApprovalInfo approval : c.labels.get(label).all) {
+        if (approval._accountId == user.id.get()) {
+          vote = approval.value;
+          break;
+        }
+      }
+    }
+
+    String name = "label = " + label;
+    if (changeKind != null) {
+      name += "; changeKind = " + changeKind.name();
+    }
+    assertThat(vote).named(name).isEqualTo(expectedVote);
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/api/change/SubmitTypeRuleIT.java b/javatests/com/google/gerrit/acceptance/api/change/SubmitTypeRuleIT.java
new file mode 100644
index 0000000..507205d
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/change/SubmitTypeRuleIT.java
@@ -0,0 +1,301 @@
+// Copyright (C) 2015 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.google.gerrit.acceptance.api.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.extensions.client.SubmitType.CHERRY_PICK;
+import static com.google.gerrit.extensions.client.SubmitType.FAST_FORWARD_ONLY;
+import static com.google.gerrit.extensions.client.SubmitType.MERGE_ALWAYS;
+import static com.google.gerrit.extensions.client.SubmitType.MERGE_IF_NECESSARY;
+import static com.google.gerrit.extensions.client.SubmitType.REBASE_ALWAYS;
+import static com.google.gerrit.extensions.client.SubmitType.REBASE_IF_NECESSARY;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.projects.BranchInput;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.extensions.common.TestSubmitRuleInfo;
+import com.google.gerrit.extensions.common.TestSubmitRuleInput;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.git.meta.VersionedMetaData;
+import com.google.gerrit.testing.ConfigSuite;
+import java.io.IOException;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.junit.Before;
+import org.junit.Test;
+
+@NoHttpd
+public class SubmitTypeRuleIT extends AbstractDaemonTest {
+  @ConfigSuite.Default
+  public static Config submitWholeTopicEnabled() {
+    return submitWholeTopicEnabledConfig();
+  }
+
+  private class RulesPl extends VersionedMetaData {
+    private static final String FILENAME = "rules.pl";
+
+    private String rule;
+
+    @Override
+    protected String getRefName() {
+      return RefNames.REFS_CONFIG;
+    }
+
+    @Override
+    protected void onLoad() throws IOException, ConfigInvalidException {
+      rule = readUTF8(FILENAME);
+    }
+
+    @Override
+    protected boolean onSave(CommitBuilder commit) throws IOException, ConfigInvalidException {
+      TestSubmitRuleInput in = new TestSubmitRuleInput();
+      in.rule = rule;
+      try {
+        gApi.changes().id(testChangeId.get()).current().testSubmitType(in);
+      } catch (RestApiException e) {
+        throw new ConfigInvalidException("Invalid submit type rule", e);
+      }
+
+      saveUTF8(FILENAME, rule);
+      return true;
+    }
+  }
+
+  private AtomicInteger fileCounter;
+  private Change.Id testChangeId;
+
+  @Before
+  public void setUp() throws Exception {
+    fileCounter = new AtomicInteger();
+    gApi.projects().name(project.get()).branch("test").create(new BranchInput());
+    testChangeId = createChange("test", "test change").getChange().getId();
+  }
+
+  private void setRulesPl(String rule) throws Exception {
+    try (MetaDataUpdate md = metaDataUpdateFactory.create(project)) {
+      RulesPl r = new RulesPl();
+      r.load(md);
+      r.rule = rule;
+      r.commit(md);
+    }
+  }
+
+  private static final String SUBMIT_TYPE_FROM_SUBJECT =
+      "submit_type(fast_forward_only) :-"
+          + "gerrit:commit_message(M),"
+          + "regex_matches('.*FAST_FORWARD_ONLY.*', M),"
+          + "!.\n"
+          + "submit_type(merge_if_necessary) :-"
+          + "gerrit:commit_message(M),"
+          + "regex_matches('.*MERGE_IF_NECESSARY.*', M),"
+          + "!.\n"
+          + "submit_type(rebase_if_necessary) :-"
+          + "gerrit:commit_message(M),"
+          + "regex_matches('.*REBASE_IF_NECESSARY.*', M),"
+          + "!.\n"
+          + "submit_type(rebase_always) :-"
+          + "gerrit:commit_message(M),"
+          + "regex_matches('.*REBASE_ALWAYS.*', M),"
+          + "!.\n"
+          + "submit_type(merge_always) :-"
+          + "gerrit:commit_message(M),"
+          + "regex_matches('.*MERGE_ALWAYS.*', M),"
+          + "!.\n"
+          + "submit_type(cherry_pick) :-"
+          + "gerrit:commit_message(M),"
+          + "regex_matches('.*CHERRY_PICK.*', M),"
+          + "!.\n"
+          + "submit_type(T) :- gerrit:project_default_submit_type(T).";
+
+  private PushOneCommit.Result createChange(String dest, String subject) throws Exception {
+    PushOneCommit push =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            testRepo,
+            subject,
+            "file" + fileCounter.incrementAndGet(),
+            PushOneCommit.FILE_CONTENT);
+    PushOneCommit.Result r = push.to("refs/for/" + dest);
+    r.assertOkStatus();
+    return r;
+  }
+
+  @Test
+  public void unconditionalCherryPick() throws Exception {
+    PushOneCommit.Result r = createChange();
+    assertSubmitType(MERGE_IF_NECESSARY, r.getChangeId());
+    setRulesPl("submit_type(cherry_pick).");
+    assertSubmitType(CHERRY_PICK, r.getChangeId());
+  }
+
+  @Test
+  public void submitTypeFromSubject() throws Exception {
+    PushOneCommit.Result r1 = createChange("master", "Default 1");
+    PushOneCommit.Result r2 = createChange("master", "FAST_FORWARD_ONLY 2");
+    PushOneCommit.Result r3 = createChange("master", "MERGE_IF_NECESSARY 3");
+    PushOneCommit.Result r4 = createChange("master", "REBASE_IF_NECESSARY 4");
+    PushOneCommit.Result r5 = createChange("master", "REBASE_ALWAYS 5");
+    PushOneCommit.Result r6 = createChange("master", "MERGE_ALWAYS 6");
+    PushOneCommit.Result r7 = createChange("master", "CHERRY_PICK 7");
+
+    assertSubmitType(MERGE_IF_NECESSARY, r1.getChangeId());
+    assertSubmitType(MERGE_IF_NECESSARY, r2.getChangeId());
+    assertSubmitType(MERGE_IF_NECESSARY, r3.getChangeId());
+    assertSubmitType(MERGE_IF_NECESSARY, r4.getChangeId());
+    assertSubmitType(MERGE_IF_NECESSARY, r5.getChangeId());
+    assertSubmitType(MERGE_IF_NECESSARY, r6.getChangeId());
+    assertSubmitType(MERGE_IF_NECESSARY, r7.getChangeId());
+
+    setRulesPl(SUBMIT_TYPE_FROM_SUBJECT);
+
+    assertSubmitType(MERGE_IF_NECESSARY, r1.getChangeId());
+    assertSubmitType(FAST_FORWARD_ONLY, r2.getChangeId());
+    assertSubmitType(MERGE_IF_NECESSARY, r3.getChangeId());
+    assertSubmitType(REBASE_IF_NECESSARY, r4.getChangeId());
+    assertSubmitType(REBASE_ALWAYS, r5.getChangeId());
+    assertSubmitType(MERGE_ALWAYS, r6.getChangeId());
+    assertSubmitType(CHERRY_PICK, r7.getChangeId());
+  }
+
+  @Test
+  public void submitTypeIsUsedForSubmit() throws Exception {
+    setRulesPl(SUBMIT_TYPE_FROM_SUBJECT);
+
+    PushOneCommit.Result r = createChange("master", "CHERRY_PICK 1");
+
+    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve());
+    gApi.changes().id(r.getChangeId()).current().submit();
+
+    List<RevCommit> log = log("master", 1);
+    assertThat(log.get(0).getShortMessage()).isEqualTo("CHERRY_PICK 1");
+    assertThat(log.get(0).name()).isNotEqualTo(r.getCommit().name());
+    assertThat(log.get(0).getFullMessage()).contains("Change-Id: " + r.getChangeId());
+    assertThat(log.get(0).getFullMessage()).contains("Reviewed-on: ");
+  }
+
+  @Test
+  public void mixingSubmitTypesAcrossBranchesSucceeds() throws Exception {
+    setRulesPl(SUBMIT_TYPE_FROM_SUBJECT);
+
+    PushOneCommit.Result r1 = createChange("master", "MERGE_IF_NECESSARY 1");
+
+    RevCommit initialCommit = r1.getCommit().getParent(0);
+    BranchInput bin = new BranchInput();
+    bin.revision = initialCommit.name();
+    gApi.projects().name(project.get()).branch("branch").create(bin);
+
+    testRepo.reset(initialCommit);
+    PushOneCommit.Result r2 = createChange("branch", "MERGE_ALWAYS 1");
+
+    gApi.changes().id(r1.getChangeId()).topic(name("topic"));
+    gApi.changes().id(r1.getChangeId()).current().review(ReviewInput.approve());
+    gApi.changes().id(r2.getChangeId()).topic(name("topic"));
+    gApi.changes().id(r2.getChangeId()).current().review(ReviewInput.approve());
+    gApi.changes().id(r2.getChangeId()).current().submit();
+
+    assertThat(log("master", 1).get(0).name()).isEqualTo(r1.getCommit().name());
+
+    List<RevCommit> branchLog = log("branch", 1);
+    assertThat(branchLog.get(0).getParents()).hasLength(2);
+    assertThat(branchLog.get(0).getParent(1).name()).isEqualTo(r2.getCommit().name());
+  }
+
+  @Test
+  public void mixingSubmitTypesOnOneBranchFails() throws Exception {
+    setRulesPl(SUBMIT_TYPE_FROM_SUBJECT);
+
+    PushOneCommit.Result r1 = createChange("master", "CHERRY_PICK 1");
+    PushOneCommit.Result r2 = createChange("master", "MERGE_IF_NECESSARY 2");
+
+    gApi.changes().id(r1.getChangeId()).current().review(ReviewInput.approve());
+    gApi.changes().id(r2.getChangeId()).current().review(ReviewInput.approve());
+
+    try {
+      gApi.changes().id(r2.getChangeId()).current().submit();
+      fail("Expected ResourceConflictException");
+    } catch (ResourceConflictException e) {
+      assertThat(e)
+          .hasMessageThat()
+          .isEqualTo(
+              "Failed to submit 2 changes due to the following problems:\n"
+                  + "Change "
+                  + r1.getChange().getId()
+                  + ": Change has submit type "
+                  + "CHERRY_PICK, but previously chose submit type MERGE_IF_NECESSARY "
+                  + "from change "
+                  + r2.getChange().getId()
+                  + " in the same batch");
+    }
+  }
+
+  @Test
+  public void invalidSubmitRuleWithNoRulesInProject() throws Exception {
+    String changeId = createChange("master", "change 1").getChangeId();
+
+    TestSubmitRuleInput in = new TestSubmitRuleInput();
+    in.rule = "invalid prolog rule";
+    // We have no rules.pl by default. The fact that the default rules are showing up here is a bug.
+    List<TestSubmitRuleInfo> response = gApi.changes().id(changeId).current().testSubmitRule(in);
+    assertThat(response).containsExactly(invalidPrologRuleInfo());
+  }
+
+  @Test
+  public void invalidSubmitRuleWithRulesInProject() throws Exception {
+    setRulesPl(SUBMIT_TYPE_FROM_SUBJECT);
+
+    String changeId = createChange("master", "change 1").getChangeId();
+
+    TestSubmitRuleInput in = new TestSubmitRuleInput();
+    in.rule = "invalid prolog rule";
+    List<TestSubmitRuleInfo> response = gApi.changes().id(changeId).current().testSubmitRule(in);
+    assertThat(response).containsExactly(invalidPrologRuleInfo());
+  }
+
+  private static TestSubmitRuleInfo invalidPrologRuleInfo() {
+    TestSubmitRuleInfo info = new TestSubmitRuleInfo();
+    info.status = "RULE_ERROR";
+    info.errorMessage = "operator expected after expression at: invalid prolog rule end_of_file.";
+    return info;
+  }
+
+  private List<RevCommit> log(String commitish, int n) throws Exception {
+    try (Repository repo = repoManager.openRepository(project);
+        Git git = new Git(repo)) {
+      ObjectId id = repo.resolve(commitish);
+      assertThat(id).isNotNull();
+      return ImmutableList.copyOf(git.log().add(id).setMaxCount(n).call());
+    }
+  }
+
+  private void assertSubmitType(SubmitType expected, String id) throws Exception {
+    assertThat(gApi.changes().id(id).current().submitType()).isEqualTo(expected);
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/api/config/BUILD b/javatests/com/google/gerrit/acceptance/api/config/BUILD
new file mode 100644
index 0000000..4d6217a
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/config/BUILD
@@ -0,0 +1,7 @@
+load("//javatests/com/google/gerrit/acceptance:tests.bzl", "acceptance_tests")
+
+acceptance_tests(
+    srcs = glob(["*IT.java"]),
+    group = "api_config",
+    labels = ["api"],
+)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/config/DiffPreferencesIT.java b/javatests/com/google/gerrit/acceptance/api/config/DiffPreferencesIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/config/DiffPreferencesIT.java
rename to javatests/com/google/gerrit/acceptance/api/config/DiffPreferencesIT.java
diff --git a/javatests/com/google/gerrit/acceptance/api/config/EditPreferencesIT.java b/javatests/com/google/gerrit/acceptance/api/config/EditPreferencesIT.java
new file mode 100644
index 0000000..e89aa3d
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/config/EditPreferencesIT.java
@@ -0,0 +1,47 @@
+// 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.
+
+package com.google.gerrit.acceptance.api.config;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.acceptance.AssertUtil.assertPrefs;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.extensions.client.EditPreferencesInfo;
+import org.junit.Test;
+
+@NoHttpd
+public class EditPreferencesIT extends AbstractDaemonTest {
+
+  @Test
+  public void getEditPreferences() throws Exception {
+    EditPreferencesInfo result = gApi.config().server().getDefaultEditPreferences();
+    assertPrefs(result, EditPreferencesInfo.defaults());
+  }
+
+  @Test
+  public void setEditPreferences() throws Exception {
+    int newLineLength = EditPreferencesInfo.defaults().lineLength + 10;
+    EditPreferencesInfo update = new EditPreferencesInfo();
+    update.lineLength = newLineLength;
+    EditPreferencesInfo result = gApi.config().server().setDefaultEditPreferences(update);
+    assertThat(result.lineLength).named("lineLength").isEqualTo(newLineLength);
+
+    result = gApi.config().server().getDefaultEditPreferences();
+    EditPreferencesInfo expected = EditPreferencesInfo.defaults();
+    expected.lineLength = newLineLength;
+    assertPrefs(result, expected);
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/api/config/GeneralPreferencesIT.java b/javatests/com/google/gerrit/acceptance/api/config/GeneralPreferencesIT.java
new file mode 100644
index 0000000..c606982
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/config/GeneralPreferencesIT.java
@@ -0,0 +1,46 @@
+// 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.
+
+package com.google.gerrit.acceptance.api.config;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.acceptance.AssertUtil.assertPrefs;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
+import org.junit.Test;
+
+@NoHttpd
+public class GeneralPreferencesIT extends AbstractDaemonTest {
+  @Test
+  public void getGeneralPreferences() throws Exception {
+    GeneralPreferencesInfo result = gApi.config().server().getDefaultPreferences();
+    assertPrefs(result, GeneralPreferencesInfo.defaults(), "changeTable", "my");
+  }
+
+  @Test
+  public void setGeneralPreferences() throws Exception {
+    boolean newSignedOffBy = !GeneralPreferencesInfo.defaults().signedOffBy;
+    GeneralPreferencesInfo update = new GeneralPreferencesInfo();
+    update.signedOffBy = newSignedOffBy;
+    GeneralPreferencesInfo result = gApi.config().server().setDefaultPreferences(update);
+    assertThat(result.signedOffBy).named("signedOffBy").isEqualTo(newSignedOffBy);
+
+    result = gApi.config().server().getDefaultPreferences();
+    GeneralPreferencesInfo expected = GeneralPreferencesInfo.defaults();
+    expected.signedOffBy = newSignedOffBy;
+    assertPrefs(result, expected, "changeTable", "my");
+  }
+}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/config/ServerIT.java b/javatests/com/google/gerrit/acceptance/api/config/ServerIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/config/ServerIT.java
rename to javatests/com/google/gerrit/acceptance/api/config/ServerIT.java
diff --git a/javatests/com/google/gerrit/acceptance/api/group/BUILD b/javatests/com/google/gerrit/acceptance/api/group/BUILD
new file mode 100644
index 0000000..da36a02
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/group/BUILD
@@ -0,0 +1,27 @@
+load("//javatests/com/google/gerrit/acceptance:tests.bzl", "acceptance_tests")
+
+acceptance_tests(
+    srcs = glob(["*IT.java"]),
+    group = "api_group",
+    labels = ["api"],
+    deps = [
+        ":util",
+        "//java/com/google/gerrit/server/group/db/testing",
+        "//java/com/google/gerrit/server/group/testing",
+        "//java/com/google/gerrit/server/util/time",
+        "//java/com/google/gerrit/truth",
+        "//javatests/com/google/gerrit/acceptance/rest/account:util",
+    ],
+)
+
+java_library(
+    name = "util",
+    srcs = ["GroupAssert.java"],
+    deps = [
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//lib:gwtorm",
+        "//lib/truth",
+    ],
+)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/group/GroupAssert.java b/javatests/com/google/gerrit/acceptance/api/group/GroupAssert.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/group/GroupAssert.java
rename to javatests/com/google/gerrit/acceptance/api/group/GroupAssert.java
diff --git a/javatests/com/google/gerrit/acceptance/api/group/GroupIndexerIT.java b/javatests/com/google/gerrit/acceptance/api/group/GroupIndexerIT.java
new file mode 100644
index 0000000..a664869
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/group/GroupIndexerIT.java
@@ -0,0 +1,173 @@
+// 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.
+
+package com.google.gerrit.acceptance.api.group;
+
+import static com.google.common.truth.Truth.assertWithMessage;
+import static com.google.gerrit.truth.ListSubject.assertThat;
+import static com.google.gerrit.truth.OptionalSubject.assertThat;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.common.errors.NoSuchGroupException;
+import com.google.gerrit.extensions.api.GerritApi;
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.ServerInitiated;
+import com.google.gerrit.server.account.GroupCache;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.group.db.GroupsUpdate;
+import com.google.gerrit.server.group.db.InternalGroupUpdate;
+import com.google.gerrit.server.group.testing.InternalGroupSubject;
+import com.google.gerrit.server.index.group.GroupIndexer;
+import com.google.gerrit.server.query.group.InternalGroupQuery;
+import com.google.gerrit.testing.InMemoryTestEnvironment;
+import com.google.gerrit.truth.ListSubject;
+import com.google.gerrit.truth.OptionalSubject;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.List;
+import java.util.Optional;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class GroupIndexerIT {
+  @Rule public InMemoryTestEnvironment testEnvironment = new InMemoryTestEnvironment();
+
+  @Inject private GroupIndexer groupIndexer;
+  @Inject private GerritApi gApi;
+  @Inject private GroupCache groupCache;
+  @Inject @ServerInitiated private GroupsUpdate groupsUpdate;
+  @Inject private Provider<InternalGroupQuery> groupQueryProvider;
+
+  @Test
+  public void indexingUpdatesTheIndex() throws Exception {
+    AccountGroup.UUID groupUuid = createGroup("users");
+    AccountGroup.UUID subgroupUuid = new AccountGroup.UUID("contributors");
+    updateGroupWithoutCacheOrIndex(
+        groupUuid,
+        newGroupUpdate()
+            .setSubgroupModification(subgroups -> ImmutableSet.of(subgroupUuid))
+            .build());
+
+    groupIndexer.index(groupUuid);
+
+    List<InternalGroup> parentGroups = groupQueryProvider.get().bySubgroup(subgroupUuid);
+    assertThatGroups(parentGroups).onlyElement().groupUuid().isEqualTo(groupUuid);
+  }
+
+  @Test
+  public void indexCannotBeCorruptedByStaleCache() throws Exception {
+    AccountGroup.UUID groupUuid = createGroup("verifiers");
+    loadGroupToCache(groupUuid);
+    AccountGroup.UUID subgroupUuid = new AccountGroup.UUID("contributors");
+    updateGroupWithoutCacheOrIndex(
+        groupUuid,
+        newGroupUpdate()
+            .setSubgroupModification(subgroups -> ImmutableSet.of(subgroupUuid))
+            .build());
+
+    groupIndexer.index(groupUuid);
+
+    List<InternalGroup> parentGroups = groupQueryProvider.get().bySubgroup(subgroupUuid);
+    assertThatGroups(parentGroups).onlyElement().groupUuid().isEqualTo(groupUuid);
+  }
+
+  @Test
+  public void indexingUpdatesStaleUuidCache() throws Exception {
+    AccountGroup.UUID groupUuid = createGroup("verifiers");
+    loadGroupToCache(groupUuid);
+    updateGroupWithoutCacheOrIndex(groupUuid, newGroupUpdate().setDescription("Modified").build());
+
+    groupIndexer.index(groupUuid);
+
+    Optional<InternalGroup> updatedGroup = groupCache.get(groupUuid);
+    assertThatGroup(updatedGroup).value().description().isEqualTo("Modified");
+  }
+
+  @Test
+  public void reindexingStaleGroupUpdatesTheIndex() throws Exception {
+    AccountGroup.UUID groupUuid = createGroup("users");
+    AccountGroup.UUID subgroupUuid = new AccountGroup.UUID("contributors");
+    updateGroupWithoutCacheOrIndex(
+        groupUuid,
+        newGroupUpdate()
+            .setSubgroupModification(subgroups -> ImmutableSet.of(subgroupUuid))
+            .build());
+
+    groupIndexer.reindexIfStale(groupUuid);
+
+    List<InternalGroup> parentGroups = groupQueryProvider.get().bySubgroup(subgroupUuid);
+    assertThatGroups(parentGroups).onlyElement().groupUuid().isEqualTo(groupUuid);
+  }
+
+  @Test
+  public void notStaleGroupIsNotReindexed() throws Exception {
+    AccountGroup.UUID groupUuid = createGroup("verifiers");
+    updateGroupWithoutCacheOrIndex(groupUuid, newGroupUpdate().setDescription("Modified").build());
+    groupIndexer.index(groupUuid);
+
+    boolean reindexed = groupIndexer.reindexIfStale(groupUuid);
+
+    assertWithMessage("Group should not have been reindexed").that(reindexed).isFalse();
+  }
+
+  @Test
+  public void indexStalenessIsNotDerivedFromCacheStaleness() throws Exception {
+    AccountGroup.UUID groupUuid = createGroup("verifiers");
+    updateGroupWithoutCacheOrIndex(groupUuid, newGroupUpdate().setDescription("Modified").build());
+    reloadGroupToCache(groupUuid);
+
+    boolean reindexed = groupIndexer.reindexIfStale(groupUuid);
+
+    assertWithMessage("Group should have been reindexed").that(reindexed).isTrue();
+  }
+
+  private AccountGroup.UUID createGroup(String name) throws RestApiException {
+    GroupInfo group = gApi.groups().create(name).get();
+    return new AccountGroup.UUID(group.id);
+  }
+
+  private void reloadGroupToCache(AccountGroup.UUID groupUuid) {
+    groupCache.evict(groupUuid);
+    loadGroupToCache(groupUuid);
+  }
+
+  private void loadGroupToCache(AccountGroup.UUID groupUuid) {
+    groupCache.get(groupUuid);
+  }
+
+  private static InternalGroupUpdate.Builder newGroupUpdate() {
+    return InternalGroupUpdate.builder();
+  }
+
+  private void updateGroupWithoutCacheOrIndex(
+      AccountGroup.UUID groupUuid, InternalGroupUpdate groupUpdate)
+      throws OrmException, NoSuchGroupException, IOException, ConfigInvalidException {
+    groupsUpdate.updateGroupInNoteDb(groupUuid, groupUpdate);
+  }
+
+  private static OptionalSubject<InternalGroupSubject, InternalGroup> assertThatGroup(
+      Optional<InternalGroup> updatedGroup) {
+    return assertThat(updatedGroup, InternalGroupSubject::assertThat);
+  }
+
+  private static ListSubject<InternalGroupSubject, InternalGroup> assertThatGroups(
+      List<InternalGroup> parentGroups) {
+    return assertThat(parentGroups, InternalGroupSubject::assertThat);
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/api/group/GroupsConsistencyIT.java b/javatests/com/google/gerrit/acceptance/api/group/GroupsConsistencyIT.java
new file mode 100644
index 0000000..87a566e
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/group/GroupsConsistencyIT.java
@@ -0,0 +1,258 @@
+// Copyright (C) 2017 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.google.gerrit.acceptance.api.group;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.Sandboxed;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo;
+import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo.ConsistencyProblemInfo;
+import com.google.gerrit.extensions.api.config.ConsistencyCheckInput;
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.group.db.GroupConfig;
+import com.google.gerrit.server.group.db.GroupNameNotes;
+import com.google.gerrit.server.group.db.testing.GroupTestUtil;
+import java.util.List;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.RefRename;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.RefUpdate.Result;
+import org.eclipse.jgit.lib.Repository;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Checks that invalid group configurations are flagged. Since the inconsistencies are global to the
+ * test server configuration, and leak from one test method into the next one, there is no way for
+ * this test to not be sandboxed.
+ */
+@Sandboxed
+@NoHttpd
+public class GroupsConsistencyIT extends AbstractDaemonTest {
+  private GroupInfo gAdmin;
+  private GroupInfo g1;
+  private GroupInfo g2;
+
+  private static final String BOGUS_UUID = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef";
+
+  @Before
+  public void basicSetup() throws Exception {
+    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
+
+    String name1 = createGroup("g1");
+    String name2 = createGroup("g2");
+
+    gApi.groups().id(name1).addMembers(user.fullName);
+    gApi.groups().id(name2).addMembers(admin.fullName);
+    gApi.groups().id(name1).addGroups(name2);
+
+    this.g1 = gApi.groups().id(name1).detail();
+    this.g2 = gApi.groups().id(name2).detail();
+    this.gAdmin = gApi.groups().id("Administrators").detail();
+  }
+
+  @Test
+  public void allGood() throws Exception {
+    assertThat(check()).isEmpty();
+  }
+
+  @Test
+  public void missingGroupNameRef() throws Exception {
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      RefUpdate ru = repo.updateRef(RefNames.REFS_GROUPNAMES);
+      ru.setForceUpdate(true);
+      RefUpdate.Result result = ru.delete();
+      assertThat(result).isEqualTo(Result.FORCED);
+    }
+
+    assertError("refs/meta/group-names does not exist");
+  }
+
+  @Test
+  public void missingGroupRef() throws Exception {
+
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      RefUpdate ru = repo.updateRef(RefNames.refsGroups(new AccountGroup.UUID(g1.id)));
+      ru.setForceUpdate(true);
+      RefUpdate.Result result = ru.delete();
+      assertThat(result).isEqualTo(Result.FORCED);
+    }
+
+    assertError("missing as group ref");
+  }
+
+  @Test
+  public void parseGroupRef() throws Exception {
+
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      RefRename ru =
+          repo.renameRef(
+              RefNames.refsGroups(new AccountGroup.UUID(g1.id)), RefNames.REFS_GROUPS + BOGUS_UUID);
+      RefUpdate.Result result = ru.rename();
+      assertThat(result).isEqualTo(Result.RENAMED);
+    }
+
+    assertError("null UUID from");
+  }
+
+  @Test
+  public void missingNameEntry() throws Exception {
+
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      RefRename ru =
+          repo.renameRef(
+              RefNames.refsGroups(new AccountGroup.UUID(g1.id)),
+              RefNames.refsGroups(new AccountGroup.UUID(BOGUS_UUID)));
+      RefUpdate.Result result = ru.rename();
+      assertThat(result).isEqualTo(Result.RENAMED);
+    }
+
+    assertError("group " + BOGUS_UUID + " has no entry in name map");
+  }
+
+  @Test
+  public void groupRefDoesNotParse() throws Exception {
+    updateGroupFile(
+        RefNames.refsGroups(new AccountGroup.UUID(g1.id)),
+        GroupConfig.GROUP_CONFIG_FILE,
+        "[this is not valid\n");
+    assertError("does not parse");
+  }
+
+  @Test
+  public void nameRefDoesNotParse() throws Exception {
+    updateGroupFile(
+        RefNames.REFS_GROUPNAMES,
+        GroupNameNotes.getNoteKey(new AccountGroup.NameKey(g1.name)).getName(),
+        "[this is not valid\n");
+    assertError("does not parse");
+  }
+
+  @Test
+  public void inconsistentName() throws Exception {
+    Config cfg = new Config();
+    cfg.setString("group", null, "name", "not really");
+    cfg.setString("group", null, "id", "42");
+    cfg.setString("group", null, "ownerGroupUuid", gAdmin.id);
+
+    updateGroupFile(
+        RefNames.refsGroups(new AccountGroup.UUID(g1.id)),
+        GroupConfig.GROUP_CONFIG_FILE,
+        cfg.toText());
+    assertError("inconsistent name");
+  }
+
+  @Test
+  public void sharedGroupID() throws Exception {
+    Config cfg = new Config();
+    cfg.setString("group", null, "name", g1.name);
+    cfg.setInt("group", null, "id", g2.groupId);
+    cfg.setString("group", null, "ownerGroupUuid", gAdmin.id);
+
+    updateGroupFile(
+        RefNames.refsGroups(new AccountGroup.UUID(g1.id)),
+        GroupConfig.GROUP_CONFIG_FILE,
+        cfg.toText());
+    assertError("shared group id");
+  }
+
+  @Test
+  public void unknownOwnerGroup() throws Exception {
+    Config cfg = new Config();
+    cfg.setString("group", null, "name", g1.name);
+    cfg.setInt("group", null, "id", g1.groupId);
+    cfg.setString("group", null, "ownerGroupUuid", BOGUS_UUID);
+
+    updateGroupFile(
+        RefNames.refsGroups(new AccountGroup.UUID(g1.id)),
+        GroupConfig.GROUP_CONFIG_FILE,
+        cfg.toText());
+    assertError("nonexistent owner group");
+  }
+
+  @Test
+  public void nameWithoutGroupRef() throws Exception {
+    String bogusName = "bogus name";
+    Config config = new Config();
+    config.setString("group", null, "uuid", BOGUS_UUID);
+    config.setString("group", null, "name", bogusName);
+
+    updateGroupFile(
+        RefNames.REFS_GROUPNAMES,
+        GroupNameNotes.getNoteKey(new AccountGroup.NameKey(bogusName)).getName(),
+        config.toText());
+    assertError("entry missing as group ref");
+  }
+
+  @Test
+  public void nonexistentMember() throws Exception {
+    updateGroupFile(RefNames.refsGroups(new AccountGroup.UUID(g1.id)), "members", "314159265\n");
+    assertError("nonexistent member 314159265");
+  }
+
+  @Test
+  public void nonexistentSubgroup() throws Exception {
+    updateGroupFile(
+        RefNames.refsGroups(new AccountGroup.UUID(g1.id)), "subgroups", BOGUS_UUID + "\n");
+    assertError("has nonexistent subgroup");
+  }
+
+  @Test
+  public void cyclicSubgroup() throws Exception {
+    updateGroupFile(RefNames.refsGroups(new AccountGroup.UUID(g1.id)), "subgroups", g1.id + "\n");
+    assertWarning("cyclic");
+  }
+
+  private void assertError(String msg) throws Exception {
+    assertConsistency(msg, ConsistencyProblemInfo.Status.ERROR);
+  }
+
+  private void assertWarning(String msg) throws Exception {
+    assertConsistency(msg, ConsistencyProblemInfo.Status.WARNING);
+  }
+
+  private List<ConsistencyProblemInfo> check() throws Exception {
+    ConsistencyCheckInput in = new ConsistencyCheckInput();
+    in.checkGroups = new ConsistencyCheckInput.CheckGroupsInput();
+    ConsistencyCheckInfo info = gApi.config().server().checkConsistency(in);
+    return info.checkGroupsResult.problems;
+  }
+
+  private void assertConsistency(String msg, ConsistencyProblemInfo.Status want) throws Exception {
+    List<ConsistencyProblemInfo> problems = check();
+
+    for (ConsistencyProblemInfo i : problems) {
+      if (!i.status.equals(want)) {
+        continue;
+      }
+      if (i.message.contains(msg)) {
+        return;
+      }
+    }
+
+    fail(String.format("could not find %s substring '%s' in %s", want, msg, problems));
+  }
+
+  private void updateGroupFile(String refName, String fileName, String content) throws Exception {
+    GroupTestUtil.updateGroupFile(
+        repoManager, allUsers, serverIdent.get(), refName, fileName, content);
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/api/group/GroupsIT.java b/javatests/com/google/gerrit/acceptance/api/group/GroupsIT.java
new file mode 100644
index 0000000..e2d390e
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/group/GroupsIT.java
@@ -0,0 +1,1561 @@
+// Copyright (C) 2015 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.google.gerrit.acceptance.api.group;
+
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth8.assertThat;
+import static com.google.gerrit.acceptance.GitUtil.deleteRef;
+import static com.google.gerrit.acceptance.GitUtil.fetch;
+import static com.google.gerrit.acceptance.api.group.GroupAssert.assertGroupInfo;
+import static com.google.gerrit.acceptance.rest.account.AccountAssert.assertAccountInfos;
+import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.common.truth.Correspondence;
+import com.google.common.util.concurrent.AtomicLongMap;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.GerritConfig;
+import com.google.gerrit.acceptance.GitUtil;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.ProjectResetter;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.Sandboxed;
+import com.google.gerrit.acceptance.TestAccount;
+import com.google.gerrit.acceptance.testsuite.account.AccountOperations;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.groups.GroupApi;
+import com.google.gerrit.extensions.api.groups.GroupInput;
+import com.google.gerrit.extensions.api.groups.Groups.ListRequest;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.GroupAuditEventInfo;
+import com.google.gerrit.extensions.common.GroupAuditEventInfo.GroupMemberAuditEventInfo;
+import com.google.gerrit.extensions.common.GroupAuditEventInfo.Type;
+import com.google.gerrit.extensions.common.GroupAuditEventInfo.UserMemberAuditEventInfo;
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.extensions.common.GroupOptionsInfo;
+import com.google.gerrit.extensions.events.GroupIndexedListener;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.extensions.restapi.Url;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.Sequences;
+import com.google.gerrit.server.ServerInitiated;
+import com.google.gerrit.server.account.GroupIncludeCache;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.group.PeriodicGroupIndexer;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gerrit.server.group.db.Groups;
+import com.google.gerrit.server.group.db.GroupsConsistencyChecker;
+import com.google.gerrit.server.group.db.GroupsUpdate;
+import com.google.gerrit.server.group.db.InternalGroupCreation;
+import com.google.gerrit.server.group.db.InternalGroupUpdate;
+import com.google.gerrit.server.index.group.GroupIndexer;
+import com.google.gerrit.server.index.group.StalenessChecker;
+import com.google.gerrit.server.util.MagicBranch;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.testing.TestTimeUtil;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.PushResult;
+import org.eclipse.jgit.transport.RemoteRefUpdate;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+@NoHttpd
+public class GroupsIT extends AbstractDaemonTest {
+  @Inject private Groups groups;
+  @Inject @ServerInitiated private GroupsUpdate groupsUpdate;
+  @Inject private GroupIncludeCache groupIncludeCache;
+  @Inject private StalenessChecker stalenessChecker;
+  @Inject private GroupIndexer groupIndexer;
+  @Inject private GroupsConsistencyChecker consistencyChecker;
+  @Inject private PeriodicGroupIndexer slaveGroupIndexer;
+  @Inject private DynamicSet<GroupIndexedListener> groupIndexedListeners;
+  @Inject private Sequences seq;
+  @Inject private AccountOperations accountOperations;
+
+  @Before
+  public void setTimeForTesting() {
+    TestTimeUtil.resetWithClockStep(1, TimeUnit.SECONDS);
+  }
+
+  @After
+  public void resetTime() {
+    TestTimeUtil.useSystemTime();
+  }
+
+  @After
+  public void consistencyCheck() throws Exception {
+    if (description.getAnnotation(IgnoreGroupInconsistencies.class) == null) {
+      assertThat(consistencyChecker.check()).isEmpty();
+    }
+  }
+
+  @Override
+  protected ProjectResetter.Config resetProjects() {
+    // Don't reset All-Users since deleting users makes groups inconsistent (e.g. groups would
+    // contain members that no longer exist) and as result of this the group consistency checker
+    // that is executed after each test would fail.
+    return new ProjectResetter.Config().reset(allProjects, RefNames.REFS_CONFIG);
+  }
+
+  @Test
+  public void systemGroupCanBeRetrievedFromIndex() throws Exception {
+    List<GroupInfo> groupInfos = gApi.groups().query("name:Administrators").get();
+    assertThat(groupInfos).isNotEmpty();
+  }
+
+  @Test
+  public void addToNonExistingGroup_NotFound() throws Exception {
+    exception.expect(ResourceNotFoundException.class);
+    gApi.groups().id("non-existing").addMembers("admin");
+  }
+
+  @Test
+  public void removeFromNonExistingGroup_NotFound() throws Exception {
+    exception.expect(ResourceNotFoundException.class);
+    gApi.groups().id("non-existing").removeMembers("admin");
+  }
+
+  @Test
+  public void addRemoveMember() throws Exception {
+    String g = createGroup("users");
+    gApi.groups().id(g).addMembers("user");
+    assertMembers(g, user);
+
+    gApi.groups().id(g).removeMembers("user");
+    assertNoMembers(g);
+  }
+
+  @Test
+  public void cachedGroupsForMemberAreUpdatedOnMemberAdditionAndRemoval() throws Exception {
+    String username = name("user");
+    Account.Id accountId = accountOperations.newAccount().username(username).create();
+
+    // Fill the cache for the observed account.
+    groupIncludeCache.getGroupsWithMember(accountId);
+    String groupName = createGroup("users");
+    AccountGroup.UUID groupUuid = new AccountGroup.UUID(gApi.groups().id(groupName).get().id);
+
+    gApi.groups().id(groupName).addMembers(username);
+
+    Collection<AccountGroup.UUID> groupsWithMemberAfterAddition =
+        groupIncludeCache.getGroupsWithMember(accountId);
+    assertThat(groupsWithMemberAfterAddition).contains(groupUuid);
+
+    gApi.groups().id(groupName).removeMembers(username);
+
+    Collection<AccountGroup.UUID> groupsWithMemberAfterRemoval =
+        groupIncludeCache.getGroupsWithMember(accountId);
+    assertThat(groupsWithMemberAfterRemoval).doesNotContain(groupUuid);
+  }
+
+  @Test
+  public void cachedGroupByNameIsUpdatedOnCreation() throws Exception {
+    String newGroupName = name("newGroup");
+    AccountGroup.NameKey nameKey = new AccountGroup.NameKey(newGroupName);
+    assertThat(groupCache.get(nameKey)).isEmpty();
+    gApi.groups().create(newGroupName);
+    assertThat(groupCache.get(nameKey)).isPresent();
+  }
+
+  @Test
+  public void addExistingMember_OK() throws Exception {
+    String g = "Administrators";
+    assertMembers(g, admin);
+    gApi.groups().id("Administrators").addMembers("admin");
+    assertMembers(g, admin);
+  }
+
+  @Test
+  public void addNonExistingMember_UnprocessableEntity() throws Exception {
+    exception.expect(UnprocessableEntityException.class);
+    gApi.groups().id("Administrators").addMembers("non-existing");
+  }
+
+  @Test
+  public void addMultipleMembers() throws Exception {
+    String g = createGroup("users");
+
+    String u1 = name("u1");
+    accountOperations.newAccount().username(u1).create();
+    String u2 = name("u2");
+    accountOperations.newAccount().username(u2).create();
+
+    gApi.groups().id(g).addMembers(u1, u2);
+
+    List<AccountInfo> members = gApi.groups().id(g).members();
+    assertThat(members)
+        .comparingElementsUsing(getAccountToUsernameCorrespondence())
+        .containsExactly(u1, u2);
+  }
+
+  @Test
+  public void membersWithAtSignInUsernameCanBeAdded() throws Exception {
+    String g = createGroup("users");
+    String usernameWithAt = name("u1@something");
+    accountOperations.newAccount().username(usernameWithAt).create();
+
+    gApi.groups().id(g).addMembers(usernameWithAt);
+
+    List<AccountInfo> members = gApi.groups().id(g).members();
+    assertThat(members)
+        .comparingElementsUsing(getAccountToUsernameCorrespondence())
+        .containsExactly(usernameWithAt);
+  }
+
+  @Test
+  public void membersWithAtSignInUsernameAreNotConfusedWithSimilarUsernames() throws Exception {
+    String g = createGroup("users");
+    String usernameWithAt = name("u1@something");
+    accountOperations.newAccount().username(usernameWithAt).create();
+    String usernameWithoutAt = name("u1something");
+    accountOperations.newAccount().username(usernameWithoutAt).create();
+    String usernameOnlyPrefix = name("u1");
+    accountOperations.newAccount().username(usernameOnlyPrefix).create();
+    String usernameOnlySuffix = name("something");
+    accountOperations.newAccount().username(usernameOnlySuffix).create();
+
+    gApi.groups()
+        .id(g)
+        .addMembers(usernameWithAt, usernameWithoutAt, usernameOnlyPrefix, usernameOnlySuffix);
+
+    List<AccountInfo> members = gApi.groups().id(g).members();
+    assertThat(members)
+        .comparingElementsUsing(getAccountToUsernameCorrespondence())
+        .containsExactly(usernameWithAt, usernameWithoutAt, usernameOnlyPrefix, usernameOnlySuffix);
+  }
+
+  @Test
+  public void includeRemoveGroup() throws Exception {
+    String p = createGroup("parent");
+    String g = createGroup("newGroup");
+    gApi.groups().id(p).addGroups(g);
+    assertIncludes(p, g);
+
+    gApi.groups().id(p).removeGroups(g);
+    assertNoIncludes(p);
+  }
+
+  @Test
+  public void includeExternalGroup() throws Exception {
+    String g = createGroup("group");
+    String subgroupUuid = SystemGroupBackend.REGISTERED_USERS.get();
+    gApi.groups().id(g).addGroups(subgroupUuid);
+
+    List<GroupInfo> subgroups = gApi.groups().id(g).includedGroups();
+    assertThat(subgroups).hasSize(1);
+    assertThat(subgroups.get(0).id).isEqualTo(subgroupUuid.replace(":", "%3A"));
+    assertThat(subgroups.get(0).name).isEqualTo("Registered Users");
+    assertThat(subgroups.get(0).groupId).isNull();
+
+    List<? extends GroupAuditEventInfo> auditEvents = gApi.groups().id(g).auditLog();
+    assertThat(auditEvents).hasSize(1);
+    assertSubgroupAuditEvent(auditEvents.get(0), Type.ADD_GROUP, admin.id, "Registered Users");
+  }
+
+  @Test
+  public void includeExistingGroup_OK() throws Exception {
+    String p = createGroup("parent");
+    String g = createGroup("newGroup");
+    gApi.groups().id(p).addGroups(g);
+    assertIncludes(p, g);
+    gApi.groups().id(p).addGroups(g);
+    assertIncludes(p, g);
+  }
+
+  @Test
+  public void addMultipleIncludes() throws Exception {
+    String p = createGroup("parent");
+    String g1 = createGroup("newGroup1");
+    String g2 = createGroup("newGroup2");
+    List<String> groups = new ArrayList<>();
+    groups.add(g1);
+    groups.add(g2);
+    gApi.groups().id(p).addGroups(g1, g2);
+    assertIncludes(p, g1, g2);
+  }
+
+  @Test
+  public void createGroup() throws Exception {
+    String newGroupName = name("newGroup");
+    GroupInfo g = gApi.groups().create(newGroupName).get();
+    assertGroupInfo(group(newGroupName), g);
+  }
+
+  @Test
+  public void createDuplicateInternalGroupCaseSensitiveName_Conflict() throws Exception {
+    String dupGroupName = name("dupGroup");
+    gApi.groups().create(dupGroupName);
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("group '" + dupGroupName + "' already exists");
+    gApi.groups().create(dupGroupName);
+  }
+
+  @Test
+  public void createDuplicateInternalGroupCaseInsensitiveName() throws Exception {
+    String dupGroupName = name("dupGroupA");
+    String dupGroupNameLowerCase = name("dupGroupA").toLowerCase();
+    gApi.groups().create(dupGroupName);
+    gApi.groups().create(dupGroupNameLowerCase);
+    assertThat(gApi.groups().list().getAsMap().keySet()).contains(dupGroupName);
+    assertThat(gApi.groups().list().getAsMap().keySet()).contains(dupGroupNameLowerCase);
+  }
+
+  @Test
+  public void createDuplicateSystemGroupCaseSensitiveName_Conflict() throws Exception {
+    String newGroupName = "Registered Users";
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("group 'Registered Users' already exists");
+    gApi.groups().create(newGroupName);
+  }
+
+  @Test
+  public void createDuplicateSystemGroupCaseInsensitiveName_Conflict() throws Exception {
+    String newGroupName = "registered users";
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("group 'Registered Users' already exists");
+    gApi.groups().create(newGroupName);
+  }
+
+  @Test
+  @GerritConfig(name = "groups.global:Anonymous-Users.name", value = "All Users")
+  public void createGroupWithConfiguredNameOfSystemGroup_Conflict() throws Exception {
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("group 'All Users' already exists");
+    gApi.groups().create("all users");
+  }
+
+  @Test
+  @GerritConfig(name = "groups.global:Anonymous-Users.name", value = "All Users")
+  public void createGroupWithDefaultNameOfSystemGroup_Conflict() throws Exception {
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("group name 'Anonymous Users' is reserved");
+    gApi.groups().create("anonymous users");
+  }
+
+  @Test
+  public void createGroupWithProperties() throws Exception {
+    GroupInput in = new GroupInput();
+    in.name = name("newGroup");
+    in.description = "Test description";
+    in.visibleToAll = true;
+    in.ownerId = adminGroupUuid().get();
+    GroupInfo g = gApi.groups().create(in).detail();
+    assertThat(g.description).isEqualTo(in.description);
+    assertThat(g.options.visibleToAll).isEqualTo(in.visibleToAll);
+    assertThat(g.ownerId).isEqualTo(in.ownerId);
+  }
+
+  @Test
+  public void createGroupWithoutCapability_Forbidden() throws Exception {
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    gApi.groups().create(name("newGroup"));
+  }
+
+  @Test
+  public void createdOnFieldIsPopulatedForNewGroup() throws Exception {
+    // NoteDb allows only second precision.
+    Timestamp testStartTime = TimeUtil.truncateToSecond(TimeUtil.nowTs());
+    String newGroupName = name("newGroup");
+    GroupInfo group = gApi.groups().create(newGroupName).get();
+
+    assertThat(group.createdOn).isAtLeast(testStartTime);
+  }
+
+  @Test
+  public void cachedGroupsForMemberAreUpdatedOnGroupCreation() throws Exception {
+    Account.Id accountId = accountOperations.newAccount().create();
+
+    // Fill the cache for the observed account.
+    groupIncludeCache.getGroupsWithMember(accountId);
+
+    GroupInput groupInput = new GroupInput();
+    groupInput.name = name("Users");
+    groupInput.members = ImmutableList.of(String.valueOf(accountId.get()));
+    GroupInfo group = gApi.groups().create(groupInput).get();
+
+    Collection<AccountGroup.UUID> groups = groupIncludeCache.getGroupsWithMember(accountId);
+    assertThat(groups).containsExactly(new AccountGroup.UUID(group.id));
+  }
+
+  @Test
+  public void getGroup() throws Exception {
+    InternalGroup adminGroup = adminGroup();
+    testGetGroup(adminGroup.getGroupUUID().get(), adminGroup);
+    testGetGroup(adminGroup.getName(), adminGroup);
+    testGetGroup(adminGroup.getId().get(), adminGroup);
+  }
+
+  private void testGetGroup(Object id, InternalGroup expectedGroup) throws Exception {
+    GroupInfo group = gApi.groups().id(id.toString()).get();
+    assertGroupInfo(expectedGroup, group);
+  }
+
+  @Test
+  @GerritConfig(name = "groups.global:Anonymous-Users.name", value = "All Users")
+  public void getSystemGroupByConfiguredName() throws Exception {
+    GroupReference anonymousUsersGroup = systemGroupBackend.getGroup(ANONYMOUS_USERS);
+    assertThat(anonymousUsersGroup.getName()).isEqualTo("All Users");
+
+    GroupInfo group = gApi.groups().id(anonymousUsersGroup.getUUID().get()).get();
+    assertThat(group.name).isEqualTo(anonymousUsersGroup.getName());
+
+    group = gApi.groups().id(anonymousUsersGroup.getName()).get();
+    assertThat(group.id).isEqualTo(Url.encode((anonymousUsersGroup.getUUID().get())));
+  }
+
+  @Test
+  public void getSystemGroupByDefaultName() throws Exception {
+    GroupReference anonymousUsersGroup = systemGroupBackend.getGroup(ANONYMOUS_USERS);
+    GroupInfo group = gApi.groups().id("Anonymous Users").get();
+    assertThat(group.name).isEqualTo(anonymousUsersGroup.getName());
+    assertThat(group.id).isEqualTo(Url.encode((anonymousUsersGroup.getUUID().get())));
+  }
+
+  @Test
+  @GerritConfig(name = "groups.global:Anonymous-Users.name", value = "All Users")
+  public void getSystemGroupByDefaultName_NotFound() throws Exception {
+    exception.expect(ResourceNotFoundException.class);
+    gApi.groups().id("Anonymous-Users").get();
+  }
+
+  @Test
+  public void groupIsCreatedForSpecifiedName() throws Exception {
+    String name = name("Users");
+    gApi.groups().create(name);
+
+    assertThat(gApi.groups().id(name).name()).isEqualTo(name);
+  }
+
+  @Test
+  public void groupCannotBeCreatedWithNameOfAnotherGroup() throws Exception {
+    String name = name("Users");
+    gApi.groups().create(name).get();
+
+    exception.expect(ResourceConflictException.class);
+    gApi.groups().create(name);
+  }
+
+  @Test
+  public void groupCanBeRenamed() throws Exception {
+    String name = name("Name1");
+    GroupInfo group = gApi.groups().create(name).get();
+
+    String newName = name("Name2");
+    gApi.groups().id(name).name(newName);
+    assertThat(gApi.groups().id(group.id).name()).isEqualTo(newName);
+  }
+
+  @Test
+  public void groupCanBeRenamedToItsCurrentName() throws Exception {
+    String name = name("Users");
+    GroupInfo group = gApi.groups().create(name).get();
+
+    gApi.groups().id(group.id).name(name);
+    assertThat(gApi.groups().id(group.id).name()).isEqualTo(name);
+  }
+
+  @Test
+  public void groupCannotBeRenamedToNameOfAnotherGroup() throws Exception {
+    String name1 = name("Name1");
+    GroupInfo group1 = gApi.groups().create(name1).get();
+
+    String name2 = name("Name2");
+    gApi.groups().create(name2);
+
+    exception.expect(ResourceConflictException.class);
+    gApi.groups().id(group1.id).name(name2);
+  }
+
+  @Test
+  public void renamedGroupCanBeLookedUpByNewName() throws Exception {
+    String name = name("Name1");
+    GroupInfo group = gApi.groups().create(name).get();
+
+    String newName = name("Name2");
+    gApi.groups().id(group.id).name(newName);
+
+    GroupInfo foundGroup = gApi.groups().id(newName).get();
+    assertThat(foundGroup.id).isEqualTo(group.id);
+  }
+
+  @Test
+  public void oldNameOfRenamedGroupIsNotAccessibleAnymore() throws Exception {
+    String name = name("Name1");
+    GroupInfo group = gApi.groups().create(name).get();
+
+    String newName = name("Name2");
+    gApi.groups().id(group.id).name(newName);
+
+    assertGroupDoesNotExist(name);
+    exception.expect(ResourceNotFoundException.class);
+    gApi.groups().id(name).get();
+  }
+
+  @Test
+  public void oldNameOfRenamedGroupIsFreeForUseAgain() throws Exception {
+    String name = name("Name1");
+    GroupInfo group1 = gApi.groups().create(name).get();
+
+    String newName = name("Name2");
+    gApi.groups().id(group1.id).name(newName);
+
+    GroupInfo group2 = gApi.groups().create(name).get();
+    assertThat(group2.id).isNotEqualTo(group1.id);
+  }
+
+  @Test
+  public void groupDescription() throws Exception {
+    String name = name("group");
+    gApi.groups().create(name);
+
+    // get description
+    assertThat(gApi.groups().id(name).description()).isEmpty();
+
+    // set description
+    String desc = "New description for the group.";
+    gApi.groups().id(name).description(desc);
+    assertThat(gApi.groups().id(name).description()).isEqualTo(desc);
+
+    // set description to null
+    gApi.groups().id(name).description(null);
+    assertThat(gApi.groups().id(name).description()).isEmpty();
+
+    // set description to empty string
+    gApi.groups().id(name).description("");
+    assertThat(gApi.groups().id(name).description()).isEmpty();
+  }
+
+  @Test
+  public void groupOptions() throws Exception {
+    String name = name("group");
+    gApi.groups().create(name);
+
+    // get options
+    assertThat(gApi.groups().id(name).options().visibleToAll).isNull();
+
+    // set options
+    GroupOptionsInfo options = new GroupOptionsInfo();
+    options.visibleToAll = true;
+    gApi.groups().id(name).options(options);
+    assertThat(gApi.groups().id(name).options().visibleToAll).isTrue();
+  }
+
+  @Test
+  public void groupOwner() throws Exception {
+    String name = name("group");
+    GroupInfo info = gApi.groups().create(name).get();
+    String adminUUID = adminGroupUuid().get();
+    String registeredUUID = SystemGroupBackend.REGISTERED_USERS.get();
+
+    // get owner
+    assertThat(Url.decode(gApi.groups().id(name).owner().id)).isEqualTo(info.id);
+
+    // set owner by name
+    gApi.groups().id(name).owner("Registered Users");
+    assertThat(Url.decode(gApi.groups().id(name).owner().id)).isEqualTo(registeredUUID);
+
+    // set owner by UUID
+    gApi.groups().id(name).owner(adminUUID);
+    assertThat(Url.decode(gApi.groups().id(name).owner().id)).isEqualTo(adminUUID);
+
+    // set non existing owner
+    exception.expect(UnprocessableEntityException.class);
+    gApi.groups().id(name).owner("Non-Existing Group");
+  }
+
+  @Test
+  public void listNonExistingGroupIncludes_NotFound() throws Exception {
+    exception.expect(ResourceNotFoundException.class);
+    gApi.groups().id("non-existing").includedGroups();
+  }
+
+  @Test
+  public void listEmptyGroupIncludes() throws Exception {
+    String gx = createGroup("gx");
+    assertThat(gApi.groups().id(gx).includedGroups()).isEmpty();
+  }
+
+  @Test
+  public void includeNonExistingGroup() throws Exception {
+    String gx = createGroup("gx");
+    exception.expect(UnprocessableEntityException.class);
+    gApi.groups().id(gx).addGroups("non-existing");
+  }
+
+  @Test
+  public void listNonEmptyGroupIncludes() throws Exception {
+    String gx = createGroup("gx");
+    String gy = createGroup("gy");
+    String gz = createGroup("gz");
+    gApi.groups().id(gx).addGroups(gy);
+    gApi.groups().id(gx).addGroups(gz);
+    assertIncludes(gApi.groups().id(gx).includedGroups(), gy, gz);
+  }
+
+  @Test
+  public void listOneIncludeMember() throws Exception {
+    String gx = createGroup("gx");
+    String gy = createGroup("gy");
+    gApi.groups().id(gx).addGroups(gy);
+    assertIncludes(gApi.groups().id(gx).includedGroups(), gy);
+  }
+
+  @Test
+  public void listNonExistingGroupMembers_NotFound() throws Exception {
+    exception.expect(ResourceNotFoundException.class);
+    gApi.groups().id("non-existing").members();
+  }
+
+  @Test
+  public void listEmptyGroupMembers() throws Exception {
+    String group = createGroup("empty");
+    assertThat(gApi.groups().id(group).members()).isEmpty();
+  }
+
+  @Test
+  public void listNonEmptyGroupMembers() throws Exception {
+    String group = createGroup("group");
+    String user1 = name("user1");
+    accountOperations.newAccount().username(user1).create();
+    String user2 = name("user2");
+    accountOperations.newAccount().username(user2).create();
+    gApi.groups().id(group).addMembers(user1, user2);
+
+    assertMembers(gApi.groups().id(group).members(), user1, user2);
+  }
+
+  @Test
+  public void listOneGroupMember() throws Exception {
+    String group = createGroup("group");
+    String user = name("user1");
+    accountOperations.newAccount().username(user).create();
+    gApi.groups().id(group).addMembers(user);
+
+    assertMembers(gApi.groups().id(group).members(), user);
+  }
+
+  @Test
+  public void listGroupMembersRecursively() throws Exception {
+    String gx = createGroup("gx");
+    String ux = name("ux");
+    accountOperations.newAccount().username(ux).create();
+    gApi.groups().id(gx).addMembers(ux);
+
+    String gy = createGroup("gy");
+    String uy = name("uy");
+    accountOperations.newAccount().username(uy).create();
+    gApi.groups().id(gy).addMembers(uy);
+
+    String gz = createGroup("gz");
+    String uz = name("uz");
+    accountOperations.newAccount().username(uz).create();
+    gApi.groups().id(gz).addMembers(uz);
+
+    gApi.groups().id(gx).addGroups(gy);
+    gApi.groups().id(gy).addGroups(gz);
+    assertMembers(gApi.groups().id(gx).members(), ux);
+    assertMembers(gApi.groups().id(gx).members(true), ux, uy, uz);
+  }
+
+  @Test
+  public void usersSeeTheirDirectMembershipWhenListingMembersRecursively() throws Exception {
+    String group = createGroup("group");
+    gApi.groups().id(group).addMembers(user.username);
+
+    setApiUser(user);
+    assertMembers(gApi.groups().id(group).members(true), user.fullName);
+  }
+
+  @Test
+  public void usersDoNotSeeTheirIndirectMembershipWhenListingMembersRecursively() throws Exception {
+    String group1 = createGroup("group1");
+    String group2 = createGroup("group2");
+    gApi.groups().id(group1).addGroups(group2);
+    gApi.groups().id(group2).addMembers(user.username);
+
+    setApiUser(user);
+    List<AccountInfo> listedMembers = gApi.groups().id(group1).members(true);
+
+    assertMembers(listedMembers);
+  }
+
+  @Test
+  public void adminsSeeTheirIndirectMembershipWhenListingMembersRecursively() throws Exception {
+    String ownerGroup = createGroup("ownerGroup", null);
+    String group1 = createGroup("group1", ownerGroup);
+    String group2 = createGroup("group2", ownerGroup);
+    gApi.groups().id(group1).addGroups(group2);
+    gApi.groups().id(group2).addMembers(admin.username);
+
+    List<AccountInfo> listedMembers = gApi.groups().id(group1).members(true);
+
+    assertMembers(listedMembers, admin.fullName);
+  }
+
+  @Test
+  public void ownersSeeTheirIndirectMembershipWhenListingMembersRecursively() throws Exception {
+    String ownerGroup = createGroup("ownerGroup", null);
+    String group1 = createGroup("group1", ownerGroup);
+    String group2 = createGroup("group2", ownerGroup);
+    gApi.groups().id(group1).addGroups(group2);
+    gApi.groups().id(ownerGroup).addMembers(user.username);
+    gApi.groups().id(group2).addMembers(user.username);
+
+    setApiUser(user);
+    List<AccountInfo> listedMembers = gApi.groups().id(group1).members(true);
+
+    assertMembers(listedMembers, user.fullName);
+  }
+
+  @Test
+  public void defaultGroupsCreated() throws Exception {
+    Iterable<String> names = gApi.groups().list().getAsMap().keySet();
+    assertThat(names).containsAllOf("Administrators", "Non-Interactive Users").inOrder();
+  }
+
+  @Test
+  public void listAllGroups() throws Exception {
+    List<String> expectedGroups =
+        groups.getAllGroupReferences().map(GroupReference::getName).sorted().collect(toList());
+    assertThat(expectedGroups.size()).isAtLeast(2);
+    assertThat(gApi.groups().list().getAsMap().keySet())
+        .containsExactlyElementsIn(expectedGroups)
+        .inOrder();
+  }
+
+  @Test
+  public void getGroupsByOwner() throws Exception {
+    String parent = createGroup("test-parent");
+    List<String> children =
+        Arrays.asList(createGroup("test-child1", parent), createGroup("test-child2", parent));
+
+    // By UUID
+    List<GroupInfo> owned = gApi.groups().list().withOwnedBy(groupUuid(parent).get()).get();
+    assertThat(owned.stream().map(g -> g.name).collect(toList()))
+        .containsExactlyElementsIn(children);
+
+    // By name
+    owned = gApi.groups().list().withOwnedBy(parent).get();
+    assertThat(owned.stream().map(g -> g.name).collect(toList()))
+        .containsExactlyElementsIn(children);
+
+    // By group that does not own any others
+    owned = gApi.groups().list().withOwnedBy(owned.get(0).id).get();
+    assertThat(owned).isEmpty();
+
+    // By non-existing group
+    exception.expect(UnprocessableEntityException.class);
+    exception.expectMessage("Group Not Found: does-not-exist");
+    gApi.groups().list().withOwnedBy("does-not-exist").get();
+  }
+
+  @Test
+  public void onlyVisibleGroupsReturned() throws Exception {
+    String newGroupName = name("newGroup");
+    GroupInput in = new GroupInput();
+    in.name = newGroupName;
+    in.description = "a hidden group";
+    in.visibleToAll = false;
+    in.ownerId = adminGroupUuid().get();
+    gApi.groups().create(in);
+
+    setApiUser(user);
+    assertThat(gApi.groups().list().getAsMap()).doesNotContainKey(newGroupName);
+
+    setApiUser(admin);
+    gApi.groups().id(newGroupName).addMembers(user.username);
+
+    setApiUser(user);
+    assertThat(gApi.groups().list().getAsMap()).containsKey(newGroupName);
+  }
+
+  @Test
+  public void suggestGroup() throws Exception {
+    Map<String, GroupInfo> groups = gApi.groups().list().withSuggest("adm").getAsMap();
+    assertThat(groups).containsKey("Administrators");
+    assertThat(groups).hasSize(1);
+    assertBadRequest(gApi.groups().list().withSuggest("adm").withSubstring("foo"));
+    assertBadRequest(gApi.groups().list().withSuggest("adm").withRegex("foo.*"));
+    assertBadRequest(gApi.groups().list().withSuggest("adm").withUser("user"));
+    assertBadRequest(gApi.groups().list().withSuggest("adm").withOwned(true));
+    assertBadRequest(gApi.groups().list().withSuggest("adm").withVisibleToAll(true));
+    assertBadRequest(gApi.groups().list().withSuggest("adm").withStart(1));
+  }
+
+  @Test
+  public void withSubstring() throws Exception {
+    String group = name("Abcdefghijklmnop");
+    gApi.groups().create(group);
+
+    // Choose a substring which isn't part of any group or test method within this class.
+    String substring = "efghijk";
+    Map<String, GroupInfo> groups = gApi.groups().list().withSubstring(substring).getAsMap();
+    assertThat(groups).containsKey(group);
+    assertThat(groups).hasSize(1);
+
+    groups = gApi.groups().list().withSubstring("abcdefghi").getAsMap();
+    assertThat(groups).containsKey(group);
+    assertThat(groups).hasSize(1);
+
+    String otherGroup = name("Abcdefghijklmnop2");
+    gApi.groups().create(otherGroup);
+    groups = gApi.groups().list().withSubstring(substring).getAsMap();
+    assertThat(groups).hasSize(2);
+    assertThat(groups).containsKey(group);
+    assertThat(groups).containsKey(otherGroup);
+
+    groups = gApi.groups().list().withSubstring("non-existing-substring").getAsMap();
+    assertThat(groups).isEmpty();
+  }
+
+  @Test
+  public void withRegex() throws Exception {
+    Map<String, GroupInfo> groups = gApi.groups().list().withRegex("Admin.*").getAsMap();
+    assertThat(groups).containsKey("Administrators");
+    assertThat(groups).hasSize(1);
+
+    groups = gApi.groups().list().withRegex("admin.*").getAsMap();
+    assertThat(groups).isEmpty();
+
+    groups = gApi.groups().list().withRegex(".*istrators").getAsMap();
+    assertThat(groups).containsKey("Administrators");
+    assertThat(groups).hasSize(1);
+
+    assertBadRequest(gApi.groups().list().withRegex(".*istrators").withSubstring("s"));
+  }
+
+  @Test
+  public void allGroupInfoFieldsSetCorrectly() throws Exception {
+    InternalGroup adminGroup = adminGroup();
+    Map<String, GroupInfo> groups = gApi.groups().list().addGroup(adminGroup.getName()).getAsMap();
+    assertThat(groups).hasSize(1);
+    assertThat(groups).containsKey("Administrators");
+    assertGroupInfo(adminGroup, Iterables.getOnlyElement(groups.values()));
+  }
+
+  @Test
+  public void getAuditLog() throws Exception {
+    GroupApi g = gApi.groups().create(name("group"));
+    List<? extends GroupAuditEventInfo> auditEvents = g.auditLog();
+    assertThat(auditEvents).hasSize(1);
+    assertMemberAuditEvent(auditEvents.get(0), Type.ADD_USER, admin.id, admin.id);
+
+    g.addMembers(user.username);
+    auditEvents = g.auditLog();
+    assertThat(auditEvents).hasSize(2);
+    assertMemberAuditEvent(auditEvents.get(0), Type.ADD_USER, admin.id, user.id);
+
+    g.removeMembers(user.username);
+    auditEvents = g.auditLog();
+    assertThat(auditEvents).hasSize(3);
+    assertMemberAuditEvent(auditEvents.get(0), Type.REMOVE_USER, admin.id, user.id);
+
+    String otherGroup = name("otherGroup");
+    gApi.groups().create(otherGroup);
+    g.addGroups(otherGroup);
+    auditEvents = g.auditLog();
+    assertThat(auditEvents).hasSize(4);
+    assertSubgroupAuditEvent(auditEvents.get(0), Type.ADD_GROUP, admin.id, otherGroup);
+
+    g.removeGroups(otherGroup);
+    auditEvents = g.auditLog();
+    assertThat(auditEvents).hasSize(5);
+    assertSubgroupAuditEvent(auditEvents.get(0), Type.REMOVE_GROUP, admin.id, otherGroup);
+
+    // Add a removed member back again.
+    g.addMembers(user.username);
+    auditEvents = g.auditLog();
+    assertThat(auditEvents).hasSize(6);
+    assertMemberAuditEvent(auditEvents.get(0), Type.ADD_USER, admin.id, user.id);
+
+    // Add a removed group back again.
+    g.addGroups(otherGroup);
+    auditEvents = g.auditLog();
+    assertThat(auditEvents).hasSize(7);
+    assertSubgroupAuditEvent(auditEvents.get(0), Type.ADD_GROUP, admin.id, otherGroup);
+
+    Timestamp lastDate = null;
+    for (GroupAuditEventInfo auditEvent : auditEvents) {
+      if (lastDate != null) {
+        assertThat(lastDate).isAtLeast(auditEvent.date);
+      }
+      lastDate = auditEvent.date;
+    }
+  }
+
+  /**
+   * @Sandboxed is used by this test because it deletes a group reference which introduces an
+   * inconsistency for the group storage. Once group deletion is supported, this test should be
+   * updated to use the API instead.
+   */
+  @Test
+  @Sandboxed
+  @IgnoreGroupInconsistencies
+  public void getAuditLogAfterDeletingASubgroup() throws Exception {
+    GroupInfo parentGroup = gApi.groups().create(name("parent-group")).get();
+
+    // Creates a subgroup and adds it to "parent-group" as a subgroup.
+    GroupInfo subgroup = gApi.groups().create(name("sub-group")).get();
+    gApi.groups().id(parentGroup.id).addGroups(subgroup.id);
+
+    // Deletes the subgroup.
+    deleteGroupRef(subgroup.id);
+
+    List<? extends GroupAuditEventInfo> auditEvents = gApi.groups().id(parentGroup.id).auditLog();
+    assertThat(auditEvents).hasSize(2);
+    // Verify the unavailable subgroup's name is null.
+    assertSubgroupAuditEvent(auditEvents.get(0), Type.ADD_GROUP, admin.id, null);
+  }
+
+  private void deleteGroupRef(String groupId) throws Exception {
+    AccountGroup.UUID uuid = new AccountGroup.UUID(groupId);
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      RefUpdate ru = repo.updateRef(RefNames.refsGroups(uuid));
+      ru.setForceUpdate(true);
+      ru.setNewObjectId(ObjectId.zeroId());
+      assertThat(ru.delete()).isEqualTo(RefUpdate.Result.FORCED);
+    }
+
+    // Reindex the group.
+    gApi.groups().id(uuid.get()).index();
+
+    // Verify "sub-group" has been deleted.
+    try {
+      gApi.groups().id(uuid.get()).get();
+      fail("expected ResourceNotFoundException");
+    } catch (ResourceNotFoundException e) {
+    }
+  }
+
+  // reindex is tested by {@link AbstractQueryGroupsTest#reindex}
+  @Test
+  public void reindexPermissions() throws Exception {
+    TestAccount groupOwner = accountCreator.user2();
+    GroupInput in = new GroupInput();
+    in.name = name("group");
+    in.members =
+        Collections.singleton(groupOwner).stream().map(u -> u.id.toString()).collect(toList());
+    in.visibleToAll = true;
+    GroupInfo group = gApi.groups().create(in).get();
+
+    // admin can reindex any group
+    setApiUser(admin);
+    gApi.groups().id(group.id).index();
+
+    // group owner can reindex own group (group is owned by itself)
+    setApiUser(groupOwner);
+    gApi.groups().id(group.id).index();
+
+    // user cannot reindex any group
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    exception.expectMessage("not allowed to index group");
+    gApi.groups().id(group.id).index();
+  }
+
+  @Test
+  public void pushToGroupBranchIsRejectedForAllUsersRepo() throws Exception {
+    assertPushToGroupBranch(
+        allUsers, RefNames.refsGroups(adminGroupUuid()), "group update not allowed");
+  }
+
+  @Test
+  public void pushToDeletedGroupBranchIsRejectedForAllUsersRepo() throws Exception {
+    String groupRef =
+        RefNames.refsDeletedGroups(
+            new AccountGroup.UUID(gApi.groups().create(name("foo")).get().id));
+    createBranch(allUsers, groupRef);
+    assertPushToGroupBranch(allUsers, groupRef, "group update not allowed");
+  }
+
+  @Test
+  public void pushToGroupNamesBranchIsRejectedForAllUsersRepo() throws Exception {
+    // refs/meta/group-names isn't usually available for fetch, so grant ACCESS_DATABASE
+    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
+    assertPushToGroupBranch(allUsers, RefNames.REFS_GROUPNAMES, "group update not allowed");
+  }
+
+  @Test
+  public void pushToGroupsBranchForNonAllUsersRepo() throws Exception {
+    assertCreateGroupBranch(project, null);
+    String groupRef =
+        RefNames.refsGroups(new AccountGroup.UUID(gApi.groups().create(name("foo")).get().id));
+    createBranch(project, groupRef);
+    assertPushToGroupBranch(project, groupRef, null);
+  }
+
+  @Test
+  public void pushToDeletedGroupsBranchForNonAllUsersRepo() throws Exception {
+    assertCreateGroupBranch(project, null);
+    String groupRef =
+        RefNames.refsDeletedGroups(
+            new AccountGroup.UUID(gApi.groups().create(name("foo")).get().id));
+    createBranch(project, groupRef);
+    assertPushToGroupBranch(project, groupRef, null);
+  }
+
+  @Test
+  public void pushToGroupNamesBranchForNonAllUsersRepo() throws Exception {
+    createBranch(project, RefNames.REFS_GROUPNAMES);
+    assertPushToGroupBranch(project, RefNames.REFS_GROUPNAMES, null);
+  }
+
+  private void assertPushToGroupBranch(
+      Project.NameKey project, String groupRefName, String expectedErrorOnUpdate) throws Exception {
+    grant(project, RefNames.REFS_GROUPS + "*", Permission.CREATE, false, REGISTERED_USERS);
+    grant(project, RefNames.REFS_GROUPS + "*", Permission.PUSH, false, REGISTERED_USERS);
+    grant(project, RefNames.REFS_DELETED_GROUPS + "*", Permission.CREATE, false, REGISTERED_USERS);
+    grant(project, RefNames.REFS_DELETED_GROUPS + "*", Permission.PUSH, false, REGISTERED_USERS);
+    grant(project, RefNames.REFS_GROUPNAMES, Permission.PUSH, false, REGISTERED_USERS);
+
+    TestRepository<InMemoryRepository> repo = cloneProject(project);
+
+    // update existing branch
+    fetch(repo, groupRefName + ":groupRef");
+    repo.reset("groupRef");
+    PushOneCommit.Result r =
+        pushFactory
+            .create(db, admin.getIdent(), repo, "Update group", "arbitraryFile.txt", "some content")
+            .to(groupRefName);
+    if (expectedErrorOnUpdate != null) {
+      r.assertErrorStatus(expectedErrorOnUpdate);
+    } else {
+      r.assertOkStatus();
+    }
+  }
+
+  private void assertCreateGroupBranch(Project.NameKey project, String expectedErrorOnCreate)
+      throws Exception {
+    grant(project, RefNames.REFS_GROUPS + "*", Permission.CREATE, false, REGISTERED_USERS);
+    grant(project, RefNames.REFS_GROUPS + "*", Permission.PUSH, false, REGISTERED_USERS);
+    TestRepository<InMemoryRepository> repo = cloneProject(project);
+    PushOneCommit.Result r =
+        pushFactory
+            .create(db, admin.getIdent(), repo, "Update group", "arbitraryFile.txt", "some content")
+            .setParents(ImmutableList.of())
+            .to(RefNames.REFS_GROUPS + name("bar"));
+    if (expectedErrorOnCreate != null) {
+      r.assertErrorStatus(expectedErrorOnCreate);
+    } else {
+      r.assertOkStatus();
+    }
+  }
+
+  @Test
+  public void pushToGroupBranchForReviewForAllUsersRepoIsRejectedOnSubmit() throws Exception {
+    pushToGroupBranchForReviewAndSubmit(
+        allUsers, RefNames.refsGroups(adminGroupUuid()), "group update not allowed");
+  }
+
+  @Test
+  public void pushToGroupBranchForReviewForNonAllUsersRepoAndSubmit() throws Exception {
+    String groupRef = RefNames.refsGroups(adminGroupUuid());
+    createBranch(project, groupRef);
+    pushToGroupBranchForReviewAndSubmit(project, groupRef, null);
+  }
+
+  @Test
+  public void pushCustomInheritanceForAllUsersFails() throws Exception {
+    TestRepository<InMemoryRepository> repo = cloneProject(allUsers);
+    GitUtil.fetch(repo, RefNames.REFS_CONFIG + ":" + RefNames.REFS_CONFIG);
+    repo.reset(RefNames.REFS_CONFIG);
+    String config =
+        gApi.projects()
+            .name(allUsers.get())
+            .branch(RefNames.REFS_CONFIG)
+            .file("project.config")
+            .asString();
+
+    Config cfg = new Config();
+    cfg.fromText(config);
+    cfg.setString("access", null, "inheritFrom", project.get());
+    config = cfg.toText();
+
+    PushOneCommit.Result r =
+        pushFactory
+            .create(db, admin.getIdent(), repo, "Subject", "project.config", config)
+            .to(RefNames.REFS_CONFIG);
+    r.assertErrorStatus("invalid project configuration");
+    r.assertMessage("All-Users must inherit from All-Projects");
+  }
+
+  @Test
+  public void cannotCreateGroupBranch() throws Exception {
+    testCannotCreateGroupBranch(
+        RefNames.REFS_GROUPS + "*", RefNames.refsGroups(new AccountGroup.UUID(name("foo"))));
+  }
+
+  @Test
+  public void cannotCreateDeletedGroupBranch() throws Exception {
+    testCannotCreateGroupBranch(
+        RefNames.REFS_DELETED_GROUPS + "*",
+        RefNames.refsDeletedGroups(new AccountGroup.UUID(name("foo"))));
+  }
+
+  @Test
+  @IgnoreGroupInconsistencies
+  public void cannotCreateGroupNamesBranch() throws Exception {
+    // Use ProjectResetter to restore the group names ref
+    try (ProjectResetter resetter =
+        projectResetter
+            .builder()
+            .build(new ProjectResetter.Config().reset(allUsers, RefNames.REFS_GROUPNAMES))) {
+      // Manually delete group names ref
+      try (Repository repo = repoManager.openRepository(allUsers);
+          RevWalk rw = new RevWalk(repo)) {
+        RevCommit commit = rw.parseCommit(repo.exactRef(RefNames.REFS_GROUPNAMES).getObjectId());
+        RefUpdate updateRef = repo.updateRef(RefNames.REFS_GROUPNAMES);
+        updateRef.setExpectedOldObjectId(commit.toObjectId());
+        updateRef.setNewObjectId(ObjectId.zeroId());
+        updateRef.setForceUpdate(true);
+        assertThat(updateRef.delete()).isEqualTo(RefUpdate.Result.FORCED);
+      }
+
+      // refs/meta/group-names is only visible with ACCESS_DATABASE
+      allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
+
+      testCannotCreateGroupBranch(RefNames.REFS_GROUPNAMES, RefNames.REFS_GROUPNAMES);
+    }
+  }
+
+  private void testCannotCreateGroupBranch(String refPattern, String groupRef) throws Exception {
+    grant(allUsers, refPattern, Permission.CREATE);
+    grant(allUsers, refPattern, Permission.PUSH);
+
+    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
+    PushOneCommit.Result r = pushFactory.create(db, admin.getIdent(), allUsersRepo).to(groupRef);
+    r.assertErrorStatus();
+    assertThat(r.getMessage()).contains("Not allowed to create group branch.");
+
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      assertThat(repo.exactRef(groupRef)).isNull();
+    }
+  }
+
+  @Test
+  public void cannotDeleteGroupBranch() throws Exception {
+    testCannotDeleteGroupBranch(RefNames.REFS_GROUPS + "*", RefNames.refsGroups(adminGroupUuid()));
+  }
+
+  @Test
+  public void cannotDeleteDeletedGroupBranch() throws Exception {
+    String groupRef = RefNames.refsDeletedGroups(new AccountGroup.UUID(name("foo")));
+    createBranch(allUsers, groupRef);
+    testCannotDeleteGroupBranch(RefNames.REFS_DELETED_GROUPS + "*", groupRef);
+  }
+
+  @Test
+  public void cannotDeleteGroupNamesBranch() throws Exception {
+    // refs/meta/group-names is only visible with ACCESS_DATABASE
+    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
+
+    testCannotDeleteGroupBranch(RefNames.REFS_GROUPNAMES, RefNames.REFS_GROUPNAMES);
+  }
+
+  private void testCannotDeleteGroupBranch(String refPattern, String groupRef) throws Exception {
+    grant(allUsers, refPattern, Permission.DELETE, true, REGISTERED_USERS);
+
+    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
+    PushResult r = deleteRef(allUsersRepo, groupRef);
+    RemoteRefUpdate refUpdate = r.getRemoteUpdate(groupRef);
+    assertThat(refUpdate.getStatus()).isEqualTo(RemoteRefUpdate.Status.REJECTED_OTHER_REASON);
+    assertThat(refUpdate.getMessage()).contains("Not allowed to delete group branch.");
+
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      assertThat(repo.exactRef(groupRef)).isNotNull();
+    }
+  }
+
+  @Test
+  public void defaultPermissionsOnGroupBranches() throws Exception {
+    assertPermissions(
+        allUsers, groupRef(REGISTERED_USERS), RefNames.REFS_GROUPS + "*", true, Permission.READ);
+  }
+
+  @Test
+  @IgnoreGroupInconsistencies
+  public void stalenessChecker() throws Exception {
+    // Newly created group is not stale
+    GroupInfo groupInfo = gApi.groups().create(name("foo")).get();
+    AccountGroup.UUID groupUuid = new AccountGroup.UUID(groupInfo.id);
+    assertThat(stalenessChecker.isStale(groupUuid)).isFalse();
+
+    // Manual update makes index document stale
+    String groupRef = RefNames.refsGroups(groupUuid);
+    try (Repository repo = repoManager.openRepository(allUsers);
+        RevWalk rw = new RevWalk(repo)) {
+      RevCommit commit = rw.parseCommit(repo.exactRef(groupRef).getObjectId());
+      ObjectId emptyCommit = createCommit(repo, commit.getFullMessage(), commit.getTree());
+      RefUpdate updateRef = repo.updateRef(groupRef);
+      updateRef.setExpectedOldObjectId(commit.toObjectId());
+      updateRef.setNewObjectId(emptyCommit);
+      assertThat(updateRef.forceUpdate()).isEqualTo(RefUpdate.Result.FORCED);
+    }
+    assertStaleGroupAndReindex(groupUuid);
+
+    // Manually delete group
+    try (Repository repo = repoManager.openRepository(allUsers);
+        RevWalk rw = new RevWalk(repo)) {
+      RevCommit commit = rw.parseCommit(repo.exactRef(groupRef).getObjectId());
+      RefUpdate updateRef = repo.updateRef(groupRef);
+      updateRef.setExpectedOldObjectId(commit.toObjectId());
+      updateRef.setNewObjectId(ObjectId.zeroId());
+      updateRef.setForceUpdate(true);
+      assertThat(updateRef.delete()).isEqualTo(RefUpdate.Result.FORCED);
+    }
+    assertStaleGroupAndReindex(groupUuid);
+  }
+
+  @Test
+  public void groupNamesWithLeadingAndTrailingWhitespace() throws Exception {
+    for (String leading : ImmutableList.of("", " ", "  ")) {
+      for (String trailing : ImmutableList.of("", " ", "  ")) {
+        String name = leading + name("group") + trailing;
+        GroupInfo g = gApi.groups().create(name).get();
+        assertThat(g.name).isEqualTo(name);
+      }
+    }
+  }
+
+  @Test
+  @Sandboxed
+  public void groupsOfUserCanBeListedInSlaveMode() throws Exception {
+    GroupInput groupInput = new GroupInput();
+    groupInput.name = name("contributors");
+    groupInput.members = ImmutableList.of(user.username);
+    gApi.groups().create(groupInput).get();
+    restartAsSlave();
+
+    setApiUser(user);
+    List<GroupInfo> groups = gApi.groups().list().withUser(user.username).get();
+    ImmutableList<String> groupNames =
+        groups.stream().map(group -> group.name).collect(toImmutableList());
+    assertThat(groupNames).contains(groupInput.name);
+  }
+
+  @Test
+  @Sandboxed
+  @GerritConfig(name = "index.scheduledIndexer.enabled", value = "false")
+  @GerritConfig(name = "index.autoReindexIfStale", value = "false")
+  @IgnoreGroupInconsistencies
+  public void reindexGroupsInSlaveMode() throws Exception {
+    List<AccountGroup.UUID> expectedGroups =
+        groups.getAllGroupReferences().map(GroupReference::getUUID).collect(toList());
+    assertThat(expectedGroups.size()).isAtLeast(2);
+
+    // Restart the server as slave, on startup of the slave all groups are indexed.
+    restartAsSlave();
+
+    GroupIndexedCounter groupIndexedCounter = new GroupIndexedCounter();
+    RegistrationHandle groupIndexEventCounterHandle =
+        groupIndexedListeners.add("gerrit", groupIndexedCounter);
+    try {
+      // Running the reindexer right after startup should not need to reindex any group since
+      // reindexing was already done on startup.
+      slaveGroupIndexer.run();
+      groupIndexedCounter.assertNoReindex();
+
+      // Create a group without updating the cache or index,
+      // then run the reindexer -> only the new group is reindexed.
+      String groupName = "foo";
+      AccountGroup.UUID groupUuid = new AccountGroup.UUID(groupName + "-UUID");
+      groupsUpdate.createGroupInNoteDb(
+          InternalGroupCreation.builder()
+              .setGroupUUID(groupUuid)
+              .setNameKey(new AccountGroup.NameKey(groupName))
+              .setId(new AccountGroup.Id(seq.nextGroupId()))
+              .build(),
+          InternalGroupUpdate.builder().build());
+      slaveGroupIndexer.run();
+      groupIndexedCounter.assertReindexOf(groupUuid);
+
+      // Update a group without updating the cache or index,
+      // then run the reindexer -> only the updated group is reindexed.
+      groupsUpdate.updateGroupInNoteDb(
+          groupUuid, InternalGroupUpdate.builder().setDescription("bar").build());
+      slaveGroupIndexer.run();
+      groupIndexedCounter.assertReindexOf(groupUuid);
+
+      // Delete a group  without updating the cache or index,
+      // then run the reindexer -> only the deleted group is reindexed.
+      try (Repository repo = repoManager.openRepository(allUsers)) {
+        RefUpdate u = repo.updateRef(RefNames.refsGroups(groupUuid));
+        u.setForceUpdate(true);
+        assertThat(u.delete()).isEqualTo(RefUpdate.Result.FORCED);
+      }
+      slaveGroupIndexer.run();
+      groupIndexedCounter.assertReindexOf(groupUuid);
+    } finally {
+      groupIndexEventCounterHandle.remove();
+    }
+  }
+
+  @Test
+  @Sandboxed
+  @GerritConfig(name = "index.scheduledIndexer.runOnStartup", value = "false")
+  @GerritConfig(name = "index.scheduledIndexer.enabled", value = "false")
+  @GerritConfig(name = "index.autoReindexIfStale", value = "false")
+  @IgnoreGroupInconsistencies
+  public void disabledReindexGroupsOnStartupSlaveMode() throws Exception {
+    List<AccountGroup.UUID> expectedGroups =
+        groups.getAllGroupReferences().map(GroupReference::getUUID).collect(toList());
+    assertThat(expectedGroups.size()).isAtLeast(2);
+
+    restartAsSlave();
+
+    GroupIndexedCounter groupIndexedCounter = new GroupIndexedCounter();
+    RegistrationHandle groupIndexEventCounterHandle =
+        groupIndexedListeners.add("gerrit", groupIndexedCounter);
+    try {
+      // No group indexing happened on startup. All groups should be reindexed now.
+      slaveGroupIndexer.run();
+      groupIndexedCounter.assertReindexOf(expectedGroups);
+    } finally {
+      groupIndexEventCounterHandle.remove();
+    }
+  }
+
+  private static Correspondence<AccountInfo, String> getAccountToUsernameCorrespondence() {
+    return new Correspondence<AccountInfo, String>() {
+      @Override
+      public boolean compare(AccountInfo actualAccount, String expectedName) {
+        String username = actualAccount == null ? null : actualAccount.username;
+        return Objects.equals(username, expectedName);
+      }
+
+      @Override
+      public String toString() {
+        return "has username";
+      }
+    };
+  }
+
+  private void assertStaleGroupAndReindex(AccountGroup.UUID groupUuid) throws IOException {
+    // Evict group from cache to be sure that we use the index state for staleness checks.
+    groupCache.evict(groupUuid);
+    assertThat(stalenessChecker.isStale(groupUuid)).isTrue();
+
+    // Reindex fixes staleness
+    groupIndexer.index(groupUuid);
+    assertThat(stalenessChecker.isStale(groupUuid)).isFalse();
+  }
+
+  private void pushToGroupBranchForReviewAndSubmit(
+      Project.NameKey project, String groupRef, String expectedError) throws Exception {
+    grantLabel(
+        "Code-Review", -2, 2, project, RefNames.REFS_GROUPS + "*", false, REGISTERED_USERS, false);
+    grant(project, RefNames.REFS_GROUPS + "*", Permission.SUBMIT, false, REGISTERED_USERS);
+
+    TestRepository<InMemoryRepository> repo = cloneProject(project);
+    fetch(repo, groupRef + ":groupRef");
+    repo.reset("groupRef");
+
+    PushOneCommit.Result r =
+        pushFactory
+            .create(
+                db, admin.getIdent(), repo, "Update group config", "group.config", "some content")
+            .to(MagicBranch.NEW_CHANGE + groupRef);
+    r.assertOkStatus();
+    assertThat(r.getChange().change().getDest().get()).isEqualTo(groupRef);
+    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve());
+
+    if (expectedError != null) {
+      exception.expect(ResourceConflictException.class);
+      exception.expectMessage("group update not allowed");
+    }
+    gApi.changes().id(r.getChangeId()).current().submit();
+  }
+
+  private void createBranch(Project.NameKey project, String ref) throws IOException {
+    try (Repository r = repoManager.openRepository(project);
+        ObjectInserter oi = r.newObjectInserter();
+        RevWalk rw = new RevWalk(r)) {
+      ObjectId emptyCommit = createCommit(r, "Test change");
+      RefUpdate updateRef = r.updateRef(ref);
+      updateRef.setExpectedOldObjectId(ObjectId.zeroId());
+      updateRef.setNewObjectId(emptyCommit);
+      assertThat(updateRef.update(rw)).isEqualTo(RefUpdate.Result.NEW);
+    }
+  }
+
+  private ObjectId createCommit(Repository repo, String commitMessage) throws IOException {
+    return createCommit(repo, commitMessage, null);
+  }
+
+  private ObjectId createCommit(Repository repo, String commitMessage, @Nullable ObjectId treeId)
+      throws IOException {
+    try (ObjectInserter oi = repo.newObjectInserter()) {
+      if (treeId == null) {
+        treeId = oi.insert(Constants.OBJ_TREE, new byte[] {});
+      }
+
+      PersonIdent ident = new PersonIdent(serverIdent.get(), TimeUtil.nowTs());
+      CommitBuilder cb = new CommitBuilder();
+      cb.setTreeId(treeId);
+      cb.setCommitter(ident);
+      cb.setAuthor(ident);
+      cb.setMessage(commitMessage);
+
+      ObjectId commit = oi.insert(cb);
+      oi.flush();
+      return commit;
+    }
+  }
+
+  private void assertMemberAuditEvent(
+      GroupAuditEventInfo info,
+      Type expectedType,
+      Account.Id expectedUser,
+      Account.Id expectedMember) {
+    assertThat(info.user._accountId).isEqualTo(expectedUser.get());
+    assertThat(info.type).isEqualTo(expectedType);
+    assertThat(info).isInstanceOf(UserMemberAuditEventInfo.class);
+    assertThat(((UserMemberAuditEventInfo) info).member._accountId).isEqualTo(expectedMember.get());
+  }
+
+  private void assertSubgroupAuditEvent(
+      GroupAuditEventInfo info,
+      Type expectedType,
+      Account.Id expectedUser,
+      String expectedMemberGroupName) {
+    assertThat(info.user._accountId).isEqualTo(expectedUser.get());
+    assertThat(info.type).isEqualTo(expectedType);
+    assertThat(info).isInstanceOf(GroupMemberAuditEventInfo.class);
+    assertThat(((GroupMemberAuditEventInfo) info).member.name).isEqualTo(expectedMemberGroupName);
+  }
+
+  private void assertMembers(String group, TestAccount... expectedMembers) throws Exception {
+    assertMembers(
+        gApi.groups().id(group).members(),
+        TestAccount.names(expectedMembers).stream().toArray(String[]::new));
+    assertAccountInfos(Arrays.asList(expectedMembers), gApi.groups().id(group).members());
+  }
+
+  private void assertMembers(Iterable<AccountInfo> members, String... expectedNames) {
+    assertThat(Iterables.transform(members, i -> i.name))
+        .containsExactlyElementsIn(Arrays.asList(expectedNames))
+        .inOrder();
+  }
+
+  private void assertNoMembers(String group) throws Exception {
+    assertThat(gApi.groups().id(group).members()).isEmpty();
+  }
+
+  private void assertIncludes(String group, String... expectedNames) throws Exception {
+    assertIncludes(gApi.groups().id(group).includedGroups(), expectedNames);
+  }
+
+  private static void assertIncludes(Iterable<GroupInfo> includes, String... expectedNames) {
+    assertThat(Iterables.transform(includes, i -> i.name))
+        .containsExactlyElementsIn(Arrays.asList(expectedNames))
+        .inOrder();
+  }
+
+  private void assertNoIncludes(String group) throws Exception {
+    assertThat(gApi.groups().id(group).includedGroups()).isEmpty();
+  }
+
+  private void assertBadRequest(ListRequest req) throws Exception {
+    try {
+      req.get();
+      fail("Expected BadRequestException");
+    } catch (BadRequestException e) {
+      // Expected
+    }
+  }
+
+  @Target({METHOD})
+  @Retention(RUNTIME)
+  private @interface IgnoreGroupInconsistencies {}
+
+  /** Checks if a group is indexed the correct number of times. */
+  private static class GroupIndexedCounter implements GroupIndexedListener {
+    private final AtomicLongMap<String> countsByGroup = AtomicLongMap.create();
+
+    @Override
+    public void onGroupIndexed(String uuid) {
+      countsByGroup.incrementAndGet(uuid);
+    }
+
+    void clear() {
+      countsByGroup.clear();
+    }
+
+    long getCount(AccountGroup.UUID groupUuid) {
+      return countsByGroup.get(groupUuid.get());
+    }
+
+    void assertReindexOf(AccountGroup.UUID groupUuid) {
+      assertReindexOf(ImmutableList.of(groupUuid));
+    }
+
+    void assertReindexOf(List<AccountGroup.UUID> groupUuids) {
+      for (AccountGroup.UUID groupUuid : groupUuids) {
+        assertThat(getCount(groupUuid)).named(groupUuid.get()).isEqualTo(1);
+      }
+      assertThat(countsByGroup).hasSize(groupUuids.size());
+      clear();
+    }
+
+    void assertNoReindex() {
+      assertThat(countsByGroup).isEmpty();
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/api/group/GroupsUpdateIT.java b/javatests/com/google/gerrit/acceptance/api/group/GroupsUpdateIT.java
new file mode 100644
index 0000000..7056312
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/group/GroupsUpdateIT.java
@@ -0,0 +1,146 @@
+// 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.
+
+package com.google.gerrit.acceptance.api.group;
+
+import static com.google.common.truth.Truth8.assertThat;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.errors.NoSuchGroupException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.ServerInitiated;
+import com.google.gerrit.server.group.db.Groups;
+import com.google.gerrit.server.group.db.GroupsUpdate;
+import com.google.gerrit.server.group.db.InternalGroupCreation;
+import com.google.gerrit.server.group.db.InternalGroupUpdate;
+import com.google.gerrit.testing.InMemoryTestEnvironment;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.Set;
+import java.util.stream.Stream;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+public class GroupsUpdateIT {
+  @Rule public InMemoryTestEnvironment testEnvironment = new InMemoryTestEnvironment();
+  @Rule public ExpectedException expectedException = ExpectedException.none();
+
+  @Inject @ServerInitiated private Provider<GroupsUpdate> groupsUpdateProvider;
+  @Inject private Groups groups;
+
+  @Test
+  public void groupCreationIsRetriedWhenFailedDueToConcurrentNameModification() throws Exception {
+    InternalGroupCreation groupCreation = getGroupCreation("users", "users-UUID");
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder()
+            .setMemberModification(
+                new CreateAnotherGroupOnceAsSideEffectOfMemberModification("verifiers"))
+            .build();
+    createGroup(groupCreation, groupUpdate);
+
+    Stream<String> allGroupNames = getAllGroupNames();
+    assertThat(allGroupNames).containsAllOf("users", "verifiers");
+  }
+
+  @Test
+  public void groupRenameIsRetriedWhenFailedDueToConcurrentNameModification() throws Exception {
+    createGroup("users", "users-UUID");
+
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder()
+            .setName(new AccountGroup.NameKey("contributors"))
+            .setMemberModification(
+                new CreateAnotherGroupOnceAsSideEffectOfMemberModification("verifiers"))
+            .build();
+    updateGroup(new AccountGroup.UUID("users-UUID"), groupUpdate);
+
+    Stream<String> allGroupNames = getAllGroupNames();
+    assertThat(allGroupNames).containsAllOf("contributors", "verifiers");
+  }
+
+  @Test
+  public void groupUpdateFailsWithExceptionForNotExistingGroup() throws Exception {
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder().setDescription("A description for the group").build();
+
+    expectedException.expect(NoSuchGroupException.class);
+    updateGroup(new AccountGroup.UUID("nonexistent-group-UUID"), groupUpdate);
+  }
+
+  private void createGroup(String groupName, String groupUuid) throws Exception {
+    InternalGroupCreation groupCreation = getGroupCreation(groupName, groupUuid);
+    InternalGroupUpdate groupUpdate = InternalGroupUpdate.builder().build();
+
+    createGroup(groupCreation, groupUpdate);
+  }
+
+  private void createGroup(InternalGroupCreation groupCreation, InternalGroupUpdate groupUpdate)
+      throws OrmException, IOException, ConfigInvalidException {
+    groupsUpdateProvider.get().createGroup(groupCreation, groupUpdate);
+  }
+
+  private void updateGroup(AccountGroup.UUID groupUuid, InternalGroupUpdate groupUpdate)
+      throws Exception {
+    groupsUpdateProvider.get().updateGroup(groupUuid, groupUpdate);
+  }
+
+  private Stream<String> getAllGroupNames() throws IOException, ConfigInvalidException {
+    return groups.getAllGroupReferences().map(GroupReference::getName);
+  }
+
+  private static InternalGroupCreation getGroupCreation(String groupName, String groupUuid) {
+    return InternalGroupCreation.builder()
+        .setGroupUUID(new AccountGroup.UUID(groupUuid))
+        .setNameKey(new AccountGroup.NameKey(groupName))
+        .setId(new AccountGroup.Id(Math.abs(groupName.hashCode())))
+        .build();
+  }
+
+  private class CreateAnotherGroupOnceAsSideEffectOfMemberModification
+      implements InternalGroupUpdate.MemberModification {
+
+    private boolean groupCreated = false;
+    private String groupName;
+
+    public CreateAnotherGroupOnceAsSideEffectOfMemberModification(String groupName) {
+      this.groupName = groupName;
+    }
+
+    @Override
+    public Set<Account.Id> apply(ImmutableSet<Account.Id> members) {
+      if (!groupCreated) {
+        createGroup();
+        groupCreated = true;
+      }
+
+      return members;
+    }
+
+    private void createGroup() {
+      InternalGroupCreation groupCreation = getGroupCreation(groupName, groupName + "-UUID");
+      InternalGroupUpdate groupUpdate = InternalGroupUpdate.builder().build();
+      try {
+        groupsUpdateProvider.get().createGroup(groupCreation, groupUpdate);
+      } catch (OrmException | IOException | ConfigInvalidException e) {
+        throw new IllegalStateException(e);
+      }
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/api/plugin/BUILD b/javatests/com/google/gerrit/acceptance/api/plugin/BUILD
new file mode 100644
index 0000000..3239f23
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/plugin/BUILD
@@ -0,0 +1,7 @@
+load("//javatests/com/google/gerrit/acceptance:tests.bzl", "acceptance_tests")
+
+acceptance_tests(
+    srcs = glob(["*IT.java"]),
+    group = "api_plugin",
+    labels = ["api"],
+)
diff --git a/javatests/com/google/gerrit/acceptance/api/plugin/PluginIT.java b/javatests/com/google/gerrit/acceptance/api/plugin/PluginIT.java
new file mode 100644
index 0000000..27f737f
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/plugin/PluginIT.java
@@ -0,0 +1,176 @@
+// Copyright (C) 2017 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.google.gerrit.acceptance.api.plugin;
+
+import static com.google.common.truth.Truth.assertThat;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.GerritConfig;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.common.RawInputUtil;
+import com.google.gerrit.extensions.api.plugins.InstallPluginInput;
+import com.google.gerrit.extensions.api.plugins.PluginApi;
+import com.google.gerrit.extensions.api.plugins.Plugins.ListRequest;
+import com.google.gerrit.extensions.common.PluginInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.RawInput;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import java.util.List;
+import org.junit.Test;
+
+@NoHttpd
+public class PluginIT extends AbstractDaemonTest {
+  private static final String JS_PLUGIN = "Gerrit.install(function(self){});\n";
+  private static final String HTML_PLUGIN =
+      String.format("<dom-module id=\"test\"><script>%s</script></dom-module>", JS_PLUGIN);
+  private static final RawInput JS_PLUGIN_CONTENT = RawInputUtil.create(JS_PLUGIN.getBytes(UTF_8));
+  private static final RawInput HTML_PLUGIN_CONTENT =
+      RawInputUtil.create(HTML_PLUGIN.getBytes(UTF_8));
+
+  private static final ImmutableList<String> PLUGINS =
+      ImmutableList.of(
+          "plugin-a.js", "plugin-b.html", "plugin-c.js", "plugin-d.html", "plugin_e.js");
+
+  @Test
+  @GerritConfig(name = "plugins.allowRemoteAdmin", value = "true")
+  public void pluginManagement() throws Exception {
+    // No plugins are loaded
+    assertThat(list().get()).isEmpty();
+    assertThat(list().all().get()).isEmpty();
+
+    PluginApi api;
+    // Install all the plugins
+    InstallPluginInput input = new InstallPluginInput();
+    for (String plugin : PLUGINS) {
+      input.raw = plugin.endsWith(".js") ? JS_PLUGIN_CONTENT : HTML_PLUGIN_CONTENT;
+      api = gApi.plugins().install(plugin, input);
+      assertThat(api).isNotNull();
+      PluginInfo info = api.get();
+      String name = pluginName(plugin);
+      assertThat(info.id).isEqualTo(name);
+      assertThat(info.version).isEqualTo(pluginVersion(plugin));
+      assertThat(info.indexUrl).isEqualTo(String.format("plugins/%s/", name));
+      assertThat(info.filename).isEqualTo(plugin);
+      assertThat(info.disabled).isNull();
+    }
+    assertPlugins(list().get(), PLUGINS);
+
+    // With pagination
+    assertPlugins(list().start(1).limit(2).get(), PLUGINS.subList(1, 3));
+
+    // With prefix
+    assertPlugins(list().prefix("plugin-b").get(), ImmutableList.of("plugin-b.html"));
+    assertPlugins(list().prefix("PLUGIN-").get(), ImmutableList.of());
+
+    // With substring
+    assertPlugins(list().substring("lugin-").get(), PLUGINS.subList(0, PLUGINS.size() - 1));
+    assertPlugins(list().substring("lugin-").start(1).limit(2).get(), PLUGINS.subList(1, 3));
+
+    // With regex
+    assertPlugins(list().regex(".*in-b").get(), ImmutableList.of("plugin-b.html"));
+    assertPlugins(list().regex("plugin-.*").get(), PLUGINS.subList(0, PLUGINS.size() - 1));
+    assertPlugins(list().regex("plugin-.*").start(1).limit(2).get(), PLUGINS.subList(1, 3));
+
+    // Invalid match combinations
+    assertBadRequest(list().regex(".*in-b").substring("a"));
+    assertBadRequest(list().regex(".*in-b").prefix("a"));
+    assertBadRequest(list().substring(".*in-b").prefix("a"));
+
+    // Disable
+    api = gApi.plugins().name("plugin-a");
+    api.disable();
+    api = gApi.plugins().name("plugin-a");
+    assertThat(api.get().disabled).isTrue();
+    assertPlugins(list().get(), PLUGINS.subList(1, PLUGINS.size()));
+    assertPlugins(list().all().get(), PLUGINS);
+
+    // Enable
+    api.enable();
+    api = gApi.plugins().name("plugin-a");
+    assertThat(api.get().disabled).isNull();
+    assertPlugins(list().get(), PLUGINS);
+
+    // Using deprecated input
+    deprecatedInput();
+
+    // Non-admin cannot disable
+    setApiUser(user);
+    try {
+      gApi.plugins().name("plugin-a").disable();
+      fail("Expected AuthException");
+    } catch (AuthException expected) {
+      // Expected
+    }
+  }
+
+  @SuppressWarnings("deprecation")
+  private void deprecatedInput() throws Exception {
+    com.google.gerrit.extensions.common.InstallPluginInput input =
+        new com.google.gerrit.extensions.common.InstallPluginInput();
+    input.raw = JS_PLUGIN_CONTENT;
+    gApi.plugins().install("legacy.html", input);
+    gApi.plugins().name("legacy").get();
+  }
+
+  @Test
+  public void installNotAllowed() throws Exception {
+    exception.expect(MethodNotAllowedException.class);
+    exception.expectMessage("remote plugin administration is disabled");
+    gApi.plugins().install("test.js", new InstallPluginInput());
+  }
+
+  @Test
+  public void getNonExistingThrowsNotFound() throws Exception {
+    exception.expect(ResourceNotFoundException.class);
+    gApi.plugins().name("does-not-exist");
+  }
+
+  private ListRequest list() throws RestApiException {
+    return gApi.plugins().list();
+  }
+
+  private void assertPlugins(List<PluginInfo> actual, List<String> expected) {
+    List<String> _actual = actual.stream().map(p -> p.id).collect(toList());
+    List<String> _expected = expected.stream().map(this::pluginName).collect(toList());
+    assertThat(_actual).containsExactlyElementsIn(_expected);
+  }
+
+  private String pluginName(String plugin) {
+    int dot = plugin.indexOf(".");
+    assertThat(dot).isGreaterThan(0);
+    return plugin.substring(0, dot);
+  }
+
+  private String pluginVersion(String plugin) {
+    String name = pluginName(plugin);
+    int dash = name.lastIndexOf("-");
+    return dash > 0 ? name.substring(dash + 1) : "";
+  }
+
+  private void assertBadRequest(ListRequest req) throws Exception {
+    try {
+      req.get();
+      fail("Expected BadRequestException");
+    } catch (BadRequestException e) {
+      // Expected
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/api/project/BUILD b/javatests/com/google/gerrit/acceptance/api/project/BUILD
new file mode 100644
index 0000000..97c6f33
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/project/BUILD
@@ -0,0 +1,8 @@
+load("//javatests/com/google/gerrit/acceptance:tests.bzl", "acceptance_tests")
+
+acceptance_tests(
+    srcs = glob(["*IT.java"]),
+    group = "api_project",
+    labels = ["api"],
+    deps = ["//java/com/google/gerrit/index/project"],
+)
diff --git a/javatests/com/google/gerrit/acceptance/api/project/CheckAccessIT.java b/javatests/com/google/gerrit/acceptance/api/project/CheckAccessIT.java
new file mode 100644
index 0000000..e4194a3
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/project/CheckAccessIT.java
@@ -0,0 +1,269 @@
+// Copyright (C) 2017 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.google.gerrit.acceptance.api.project;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.acceptance.TestAccount;
+import com.google.gerrit.acceptance.testsuite.group.GroupOperations;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.config.AccessCheckInfo;
+import com.google.gerrit.extensions.api.config.AccessCheckInput;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.inject.Inject;
+import java.util.List;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.RefUpdate.Result;
+import org.eclipse.jgit.lib.Repository;
+import org.junit.Before;
+import org.junit.Test;
+
+public class CheckAccessIT extends AbstractDaemonTest {
+
+  @Inject private GroupOperations groupOperations;
+
+  private Project.NameKey normalProject;
+  private Project.NameKey secretProject;
+  private Project.NameKey secretRefProject;
+  private TestAccount privilegedUser;
+
+  @Before
+  public void setUp() throws Exception {
+    normalProject = createProject("normal");
+    secretProject = createProject("secret");
+    secretRefProject = createProject("secretRef");
+    AccountGroup.UUID privilegedGroupUuid =
+        groupOperations.newGroup().name(name("privilegedGroup")).create();
+
+    privilegedUser = accountCreator.create("privilegedUser", "snowden@nsa.gov", "Ed Snowden");
+    groupOperations.group(privilegedGroupUuid).forUpdate().addMember(privilegedUser.id).update();
+
+    grant(secretProject, "refs/*", Permission.READ, false, privilegedGroupUuid);
+    block(secretProject, "refs/*", Permission.READ, SystemGroupBackend.REGISTERED_USERS);
+
+    deny(secretRefProject, "refs/*", Permission.READ, SystemGroupBackend.ANONYMOUS_USERS);
+    grant(secretRefProject, "refs/heads/secret/*", Permission.READ, false, privilegedGroupUuid);
+    block(
+        secretRefProject,
+        "refs/heads/secret/*",
+        Permission.READ,
+        SystemGroupBackend.REGISTERED_USERS);
+    grant(
+        secretRefProject,
+        "refs/heads/*",
+        Permission.READ,
+        false,
+        SystemGroupBackend.REGISTERED_USERS);
+
+    // Ref permission
+    grant(normalProject, "refs/*", Permission.VIEW_PRIVATE_CHANGES, false, privilegedGroupUuid);
+    grant(normalProject, "refs/*", Permission.FORGE_SERVER, false, privilegedGroupUuid);
+  }
+
+  @Test
+  public void emptyInput() throws Exception {
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("input requires 'account'");
+    gApi.projects().name(normalProject.get()).checkAccess(new AccessCheckInput());
+  }
+
+  @Test
+  public void nonexistentPermission() throws Exception {
+    AccessCheckInput in = new AccessCheckInput();
+    in.account = user.email;
+    in.permission = "notapermission";
+    in.ref = "refs/heads/master";
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("not recognized");
+    gApi.projects().name(normalProject.get()).checkAccess(in);
+  }
+
+  @Test
+  public void permissionLacksRef() throws Exception {
+    AccessCheckInput in = new AccessCheckInput();
+    in.account = user.email;
+    in.permission = "forge_author";
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("must set 'ref'");
+    gApi.projects().name(normalProject.get()).checkAccess(in);
+  }
+
+  @Test
+  public void changePermission() throws Exception {
+    AccessCheckInput in = new AccessCheckInput();
+    in.account = user.email;
+    in.permission = "rebase";
+    in.ref = "refs/heads/master";
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("recognized as ref permission");
+    gApi.projects().name(normalProject.get()).checkAccess(in);
+  }
+
+  @Test
+  public void nonexistentEmail() throws Exception {
+    AccessCheckInput in = new AccessCheckInput();
+    in.account = "doesnotexist@invalid.com";
+    in.permission = "rebase";
+    in.ref = "refs/heads/master";
+
+    exception.expect(UnprocessableEntityException.class);
+    exception.expectMessage("cannot find account doesnotexist@invalid.com");
+    gApi.projects().name(normalProject.get()).checkAccess(in);
+  }
+
+  private static class TestCase {
+    AccessCheckInput input;
+    String project;
+    String permission;
+    int want;
+
+    static TestCase project(String mail, String project, int want) {
+      TestCase t = new TestCase();
+      t.input = new AccessCheckInput();
+      t.input.account = mail;
+      t.project = project;
+      t.want = want;
+      return t;
+    }
+
+    static TestCase projectRef(String mail, String project, String ref, int want) {
+      TestCase t = new TestCase();
+      t.input = new AccessCheckInput();
+      t.input.account = mail;
+      t.input.ref = ref;
+      t.project = project;
+      t.want = want;
+      return t;
+    }
+
+    static TestCase projectRefPerm(
+        String mail, String project, String ref, String permission, int want) {
+      TestCase t = new TestCase();
+      t.input = new AccessCheckInput();
+      t.input.account = mail;
+      t.input.ref = ref;
+      t.input.permission = permission;
+      t.project = project;
+      t.want = want;
+      return t;
+    }
+  }
+
+  @Test
+  public void httpGet() throws Exception {
+    RestResponse rep =
+        adminRestSession.get(
+            "/projects/"
+                + normalProject.get()
+                + "/check.access"
+                + "?ref=refs/heads/master&perm=viewPrivateChanges&account="
+                + user.email);
+    rep.assertOK();
+    assertThat(rep.getEntityContent()).contains("403");
+  }
+
+  @Test
+  public void accessible() throws Exception {
+    List<TestCase> inputs =
+        ImmutableList.of(
+            TestCase.projectRefPerm(
+                user.email,
+                normalProject.get(),
+                "refs/heads/master",
+                Permission.VIEW_PRIVATE_CHANGES,
+                403),
+            TestCase.project(user.email, normalProject.get(), 200),
+            TestCase.project(user.email, secretProject.get(), 403),
+            TestCase.projectRef(
+                user.email, secretRefProject.get(), "refs/heads/secret/master", 403),
+            TestCase.projectRef(
+                privilegedUser.email, secretRefProject.get(), "refs/heads/secret/master", 200),
+            TestCase.projectRef(privilegedUser.email, normalProject.get(), null, 200),
+            TestCase.projectRef(privilegedUser.email, secretProject.get(), null, 200),
+            TestCase.projectRef(privilegedUser.email, secretProject.get(), null, 200),
+            TestCase.projectRefPerm(
+                privilegedUser.email,
+                normalProject.get(),
+                "refs/heads/master",
+                Permission.VIEW_PRIVATE_CHANGES,
+                200),
+            TestCase.projectRefPerm(
+                privilegedUser.email,
+                normalProject.get(),
+                "refs/heads/master",
+                Permission.FORGE_SERVER,
+                200));
+
+    for (TestCase tc : inputs) {
+      String in = newGson().toJson(tc.input);
+      AccessCheckInfo info = null;
+
+      try {
+        info = gApi.projects().name(tc.project).checkAccess(tc.input);
+      } catch (RestApiException e) {
+        fail(String.format("check.access(%s, %s): exception %s", tc.project, in, e));
+      }
+
+      int want = tc.want;
+      if (want != info.status) {
+        fail(
+            String.format("check.access(%s, %s) = %d, want %d", tc.project, in, info.status, want));
+      }
+
+      switch (want) {
+        case 403:
+          if (tc.permission != null) {
+            assertThat(info.message).contains("lacks permission " + tc.permission);
+          }
+          break;
+        case 404:
+          assertThat(info.message).contains("does not exist");
+          break;
+        case 200:
+          assertThat(info.message).isNull();
+          break;
+        default:
+          fail(String.format("unknown code %d", want));
+      }
+    }
+  }
+
+  @Test
+  public void noBranches() throws Exception {
+    try (Repository repo = repoManager.openRepository(normalProject)) {
+      RefUpdate u = repo.updateRef(RefNames.REFS_HEADS + "master");
+      u.setForceUpdate(true);
+      assertThat(u.delete()).isEqualTo(Result.FORCED);
+    }
+    AccessCheckInput input = new AccessCheckInput();
+    input.account = privilegedUser.email;
+
+    AccessCheckInfo info = gApi.projects().name(normalProject.get()).checkAccess(input);
+    assertThat(info.status).isEqualTo(200);
+    assertThat(info.message).contains("no branches");
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/api/project/CheckProjectIT.java b/javatests/com/google/gerrit/acceptance/api/project/CheckProjectIT.java
new file mode 100644
index 0000000..3b2df79
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/project/CheckProjectIT.java
@@ -0,0 +1,296 @@
+// 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.
+
+package com.google.gerrit.acceptance.api.project;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.acceptance.GitUtil.pushHead;
+import static java.util.stream.Collectors.toList;
+import static java.util.stream.Collectors.toSet;
+
+import com.google.common.collect.Iterables;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.extensions.api.projects.CheckProjectInput;
+import com.google.gerrit.extensions.api.projects.CheckProjectInput.AutoCloseableChangesCheckInput;
+import com.google.gerrit.extensions.api.projects.CheckProjectResultInfo;
+import com.google.gerrit.extensions.client.ChangeStatus;
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.server.project.ProjectsConsistencyChecker;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.junit.Before;
+import org.junit.Test;
+
+public class CheckProjectIT extends AbstractDaemonTest {
+  private TestRepository<InMemoryRepository> serverSideTestRepo;
+
+  @Before
+  public void setUp() throws Exception {
+    serverSideTestRepo =
+        new TestRepository<>((InMemoryRepository) repoManager.openRepository(project));
+  }
+
+  @Test
+  public void noProblem() throws Exception {
+    PushOneCommit.Result r = createChange("refs/for/master");
+    String branch = r.getChange().change().getDest().get();
+
+    ChangeInfo info = gApi.changes().id(r.getChange().getId().get()).info();
+    assertThat(info.status).isEqualTo(ChangeStatus.NEW);
+
+    CheckProjectResultInfo checkResult =
+        gApi.projects().name(project.get()).check(checkProjectInputForAutoCloseableCheck(branch));
+    assertThat(checkResult.autoCloseableChangesCheckResult.autoCloseableChanges).isEmpty();
+
+    info = gApi.changes().id(r.getChange().getId().get()).info();
+    assertThat(info.status).isEqualTo(ChangeStatus.NEW);
+  }
+
+  @Test
+  public void detectAutoCloseableChangeByCommit() throws Exception {
+    RevCommit commit = pushCommitWithoutChangeIdForReview();
+    ChangeInfo change =
+        Iterables.getOnlyElement(gApi.changes().query("commit:" + commit.name()).get());
+
+    String branch = "refs/heads/master";
+    serverSideTestRepo.branch(branch).update(testRepo.getRevWalk().parseCommit(commit));
+
+    ChangeInfo info = gApi.changes().id(change._number).info();
+    assertThat(info.status).isEqualTo(ChangeStatus.NEW);
+
+    CheckProjectResultInfo checkResult =
+        gApi.projects().name(project.get()).check(checkProjectInputForAutoCloseableCheck(branch));
+    assertThat(
+            checkResult.autoCloseableChangesCheckResult.autoCloseableChanges.stream()
+                .map(i -> i._number)
+                .collect(toList()))
+        .containsExactly(change._number);
+
+    info = gApi.changes().id(change._number).info();
+    assertThat(info.status).isEqualTo(ChangeStatus.NEW);
+  }
+
+  @Test
+  public void fixAutoCloseableChangeByCommit() throws Exception {
+    RevCommit commit = pushCommitWithoutChangeIdForReview();
+    ChangeInfo change =
+        Iterables.getOnlyElement(gApi.changes().query("commit:" + commit.name()).get());
+
+    String branch = "refs/heads/master";
+    serverSideTestRepo.branch(branch).update(commit);
+
+    ChangeInfo info = gApi.changes().id(change._number).info();
+    assertThat(info.status).isEqualTo(ChangeStatus.NEW);
+
+    CheckProjectInput input = checkProjectInputForAutoCloseableCheck(branch);
+    input.autoCloseableChangesCheck.fix = true;
+    CheckProjectResultInfo checkResult = gApi.projects().name(project.get()).check(input);
+    assertThat(
+            checkResult.autoCloseableChangesCheckResult.autoCloseableChanges.stream()
+                .map(i -> i._number)
+                .collect(toSet()))
+        .containsExactly(change._number);
+
+    info = gApi.changes().id(change._number).info();
+    assertThat(info.status).isEqualTo(ChangeStatus.MERGED);
+  }
+
+  @Test
+  public void detectAutoCloseableChangeByChangeId() throws Exception {
+    PushOneCommit.Result r = createChange("refs/for/master");
+    String branch = r.getChange().change().getDest().get();
+
+    RevCommit amendedCommit = serverSideTestRepo.amend(r.getCommit()).create();
+    serverSideTestRepo.branch(branch).update(amendedCommit);
+
+    ChangeInfo info = gApi.changes().id(r.getChange().getId().get()).info();
+    assertThat(info.status).isEqualTo(ChangeStatus.NEW);
+
+    CheckProjectResultInfo checkResult =
+        gApi.projects().name(project.get()).check(checkProjectInputForAutoCloseableCheck(branch));
+    assertThat(
+            checkResult.autoCloseableChangesCheckResult.autoCloseableChanges.stream()
+                .map(i -> i._number)
+                .collect(toSet()))
+        .containsExactly(r.getChange().getId().get());
+
+    info = gApi.changes().id(r.getChange().getId().get()).info();
+    assertThat(info.status).isEqualTo(ChangeStatus.NEW);
+  }
+
+  @Test
+  public void fixAutoCloseableChangeByChangeId() throws Exception {
+    PushOneCommit.Result r = createChange("refs/for/master");
+    String branch = r.getChange().change().getDest().get();
+
+    RevCommit amendedCommit = serverSideTestRepo.amend(r.getCommit()).create();
+    serverSideTestRepo.branch(branch).update(amendedCommit);
+
+    ChangeInfo info = gApi.changes().id(r.getChange().getId().get()).info();
+    assertThat(info.status).isEqualTo(ChangeStatus.NEW);
+
+    CheckProjectInput input = checkProjectInputForAutoCloseableCheck(branch);
+    input.autoCloseableChangesCheck.fix = true;
+    CheckProjectResultInfo checkResult = gApi.projects().name(project.get()).check(input);
+    assertThat(
+            checkResult.autoCloseableChangesCheckResult.autoCloseableChanges.stream()
+                .map(i -> i._number)
+                .collect(toSet()))
+        .containsExactly(r.getChange().getId().get());
+
+    info = gApi.changes().id(r.getChange().getId().get()).info();
+    assertThat(info.status).isEqualTo(ChangeStatus.MERGED);
+  }
+
+  @Test
+  public void maxCommits() throws Exception {
+    PushOneCommit.Result r = createChange("refs/for/master");
+    String branch = r.getChange().change().getDest().get();
+
+    RevCommit amendedCommit = serverSideTestRepo.amend(r.getCommit()).create();
+    serverSideTestRepo.branch(branch).update(amendedCommit);
+
+    serverSideTestRepo.commit(amendedCommit);
+
+    ChangeInfo info = gApi.changes().id(r.getChange().getId().get()).info();
+    assertThat(info.status).isEqualTo(ChangeStatus.NEW);
+
+    CheckProjectInput input = checkProjectInputForAutoCloseableCheck(branch);
+    input.autoCloseableChangesCheck.fix = true;
+    input.autoCloseableChangesCheck.maxCommits = 1;
+    CheckProjectResultInfo checkResult = gApi.projects().name(project.get()).check(input);
+    assertThat(checkResult.autoCloseableChangesCheckResult.autoCloseableChanges).isEmpty();
+
+    info = gApi.changes().id(r.getChange().getId().get()).info();
+    assertThat(info.status).isEqualTo(ChangeStatus.NEW);
+
+    input.autoCloseableChangesCheck.maxCommits = 2;
+    checkResult = gApi.projects().name(project.get()).check(input);
+    assertThat(
+            checkResult.autoCloseableChangesCheckResult.autoCloseableChanges.stream()
+                .map(i -> i._number)
+                .collect(toSet()))
+        .containsExactly(r.getChange().getId().get());
+
+    info = gApi.changes().id(r.getChange().getId().get()).info();
+    assertThat(info.status).isEqualTo(ChangeStatus.MERGED);
+  }
+
+  @Test
+  public void skipCommits() throws Exception {
+    PushOneCommit.Result r = createChange("refs/for/master");
+    String branch = r.getChange().change().getDest().get();
+
+    RevCommit amendedCommit = serverSideTestRepo.amend(r.getCommit()).create();
+    serverSideTestRepo.branch(branch).update(amendedCommit);
+
+    serverSideTestRepo.commit(amendedCommit);
+
+    ChangeInfo info = gApi.changes().id(r.getChange().getId().get()).info();
+    assertThat(info.status).isEqualTo(ChangeStatus.NEW);
+
+    CheckProjectInput input = checkProjectInputForAutoCloseableCheck(branch);
+    input.autoCloseableChangesCheck.fix = true;
+    input.autoCloseableChangesCheck.maxCommits = 1;
+    CheckProjectResultInfo checkResult = gApi.projects().name(project.get()).check(input);
+    assertThat(checkResult.autoCloseableChangesCheckResult.autoCloseableChanges).isEmpty();
+
+    info = gApi.changes().id(r.getChange().getId().get()).info();
+    assertThat(info.status).isEqualTo(ChangeStatus.NEW);
+
+    input.autoCloseableChangesCheck.skipCommits = 1;
+    checkResult = gApi.projects().name(project.get()).check(input);
+    assertThat(
+            checkResult.autoCloseableChangesCheckResult.autoCloseableChanges.stream()
+                .map(i -> i._number)
+                .collect(toSet()))
+        .containsExactly(r.getChange().getId().get());
+
+    info = gApi.changes().id(r.getChange().getId().get()).info();
+    assertThat(info.status).isEqualTo(ChangeStatus.MERGED);
+  }
+
+  @Test
+  public void noBranch() throws Exception {
+    CheckProjectInput input = new CheckProjectInput();
+    input.autoCloseableChangesCheck = new AutoCloseableChangesCheckInput();
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("branch is required");
+    gApi.projects().name(project.get()).check(input);
+  }
+
+  @Test
+  public void nonExistingBranch() throws Exception {
+    CheckProjectInput input = checkProjectInputForAutoCloseableCheck("non-existing");
+
+    exception.expect(UnprocessableEntityException.class);
+    exception.expectMessage("branch 'non-existing' not found");
+    gApi.projects().name(project.get()).check(input);
+  }
+
+  @Test
+  public void branchPrefixCanBeOmitted() throws Exception {
+    CheckProjectInput input = checkProjectInputForAutoCloseableCheck("master");
+    gApi.projects().name(project.get()).check(input);
+  }
+
+  @Test
+  public void setLimitForMaxCommits() throws Exception {
+    CheckProjectInput input = checkProjectInputForAutoCloseableCheck("refs/heads/master");
+    input.autoCloseableChangesCheck.maxCommits =
+        ProjectsConsistencyChecker.AUTO_CLOSE_MAX_COMMITS_LIMIT;
+    gApi.projects().name(project.get()).check(input);
+  }
+
+  @Test
+  public void tooLargeMaxCommits() throws Exception {
+    CheckProjectInput input = checkProjectInputForAutoCloseableCheck("refs/heads/master");
+    input.autoCloseableChangesCheck.maxCommits =
+        ProjectsConsistencyChecker.AUTO_CLOSE_MAX_COMMITS_LIMIT + 1;
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage(
+        "max commits can at most be set to "
+            + ProjectsConsistencyChecker.AUTO_CLOSE_MAX_COMMITS_LIMIT);
+    gApi.projects().name(project.get()).check(input);
+  }
+
+  private RevCommit pushCommitWithoutChangeIdForReview() throws Exception {
+    setRequireChangeId(InheritableBoolean.FALSE);
+    RevCommit commit =
+        testRepo
+            .branch("HEAD")
+            .commit()
+            .message("A change")
+            .author(admin.getIdent())
+            .committer(new PersonIdent(admin.getIdent(), testRepo.getDate()))
+            .create();
+    pushHead(testRepo, "refs/for/master");
+    return commit;
+  }
+
+  private static CheckProjectInput checkProjectInputForAutoCloseableCheck(String branch) {
+    CheckProjectInput input = new CheckProjectInput();
+    input.autoCloseableChangesCheck = new AutoCloseableChangesCheckInput();
+    input.autoCloseableChangesCheck.branch = branch;
+    return input;
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/api/project/CommitIncludedInIT.java b/javatests/com/google/gerrit/acceptance/api/project/CommitIncludedInIT.java
new file mode 100644
index 0000000..4b5fe1e
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/project/CommitIncludedInIT.java
@@ -0,0 +1,66 @@
+// Copyright (C) 2017 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.google.gerrit.acceptance.api.project;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.eclipse.jgit.lib.Constants.R_TAGS;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.PushOneCommit.Result;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.changes.IncludedInInfo;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.projects.TagInput;
+import com.google.gerrit.reviewdb.client.Branch;
+import org.eclipse.jgit.lib.ObjectId;
+import org.junit.Test;
+
+@NoHttpd
+public class CommitIncludedInIT extends AbstractDaemonTest {
+  @Test
+  public void includedInOpenChange() throws Exception {
+    Result result = createChange();
+    assertThat(getIncludedIn(result.getCommit().getId()).branches).isEmpty();
+    assertThat(getIncludedIn(result.getCommit().getId()).tags).isEmpty();
+  }
+
+  @Test
+  public void includedInMergedChange() throws Exception {
+    Result result = createChange();
+    gApi.changes()
+        .id(result.getChangeId())
+        .revision(result.getCommit().name())
+        .review(ReviewInput.approve());
+    gApi.changes().id(result.getChangeId()).revision(result.getCommit().name()).submit();
+
+    assertThat(getIncludedIn(result.getCommit().getId()).branches).containsExactly("master");
+    assertThat(getIncludedIn(result.getCommit().getId()).tags).isEmpty();
+
+    grant(project, R_TAGS + "*", Permission.CREATE_TAG);
+    gApi.projects().name(result.getChange().project().get()).tag("test-tag").create(new TagInput());
+
+    assertThat(getIncludedIn(result.getCommit().getId()).tags).containsExactly("test-tag");
+
+    createBranch(new Branch.NameKey(project.get(), "test-branch"));
+
+    assertThat(getIncludedIn(result.getCommit().getId()).branches)
+        .containsExactly("master", "test-branch");
+  }
+
+  private IncludedInInfo getIncludedIn(ObjectId id) throws Exception {
+    return gApi.projects().name(project.get()).commit(id.name()).includedIn();
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/api/project/DashboardIT.java b/javatests/com/google/gerrit/acceptance/api/project/DashboardIT.java
new file mode 100644
index 0000000..e51a069
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/project/DashboardIT.java
@@ -0,0 +1,220 @@
+// Copyright (C) 2017 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.google.gerrit.acceptance.api.project;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.projects.BranchInput;
+import com.google.gerrit.extensions.api.projects.DashboardInfo;
+import com.google.gerrit.extensions.api.projects.DashboardSectionInfo;
+import com.google.gerrit.extensions.api.projects.ProjectApi;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.server.restapi.project.DashboardsCollection;
+import java.util.List;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.junit.Before;
+import org.junit.Test;
+
+@NoHttpd
+public class DashboardIT extends AbstractDaemonTest {
+  @Before
+  public void setup() throws Exception {
+    allow("refs/meta/dashboards/*", Permission.CREATE, REGISTERED_USERS);
+  }
+
+  @Test
+  public void defaultDashboardDoesNotExist() throws Exception {
+    exception.expect(ResourceNotFoundException.class);
+    project().defaultDashboard().get();
+  }
+
+  @Test
+  public void dashboardDoesNotExist() throws Exception {
+    exception.expect(ResourceNotFoundException.class);
+    project().dashboard("my:dashboard").get();
+  }
+
+  @Test
+  public void getDashboard() throws Exception {
+    DashboardInfo info = createTestDashboard();
+    DashboardInfo result = project().dashboard(info.id).get();
+    assertDashboardInfo(result, info);
+  }
+
+  @Test
+  public void getDashboardWithNoDescription() throws Exception {
+    DashboardInfo info = newDashboardInfo(DashboardsCollection.DEFAULT_DASHBOARD_NAME, "test");
+    info.description = null;
+    DashboardInfo created = createDashboard(info);
+    assertThat(created.description).isNull();
+    DashboardInfo result = project().dashboard(created.id).get();
+    assertThat(result.description).isNull();
+  }
+
+  @Test
+  public void getDashboardNonDefault() throws Exception {
+    DashboardInfo info = createTestDashboard("my", "test");
+    DashboardInfo result = project().dashboard(info.id).get();
+    assertDashboardInfo(result, info);
+  }
+
+  @Test
+  public void listDashboards() throws Exception {
+    assertThat(dashboards()).isEmpty();
+    DashboardInfo info1 = createTestDashboard(DashboardsCollection.DEFAULT_DASHBOARD_NAME, "test1");
+    DashboardInfo info2 = createTestDashboard(DashboardsCollection.DEFAULT_DASHBOARD_NAME, "test2");
+    assertThat(dashboards().stream().map(d -> d.id).collect(toList()))
+        .containsExactly(info1.id, info2.id);
+  }
+
+  @Test
+  public void setDefaultDashboard() throws Exception {
+    DashboardInfo info = createTestDashboard();
+    assertThat(info.isDefault).isNull();
+    project().dashboard(info.id).setDefault();
+    assertThat(project().dashboard(info.id).get().isDefault).isTrue();
+    assertThat(project().defaultDashboard().get().id).isEqualTo(info.id);
+  }
+
+  @Test
+  public void setDefaultDashboardByProject() throws Exception {
+    DashboardInfo info = createTestDashboard();
+    assertThat(info.isDefault).isNull();
+    project().defaultDashboard(info.id);
+    assertThat(project().dashboard(info.id).get().isDefault).isTrue();
+    assertThat(project().defaultDashboard().get().id).isEqualTo(info.id);
+
+    project().removeDefaultDashboard();
+    assertThat(project().dashboard(info.id).get().isDefault).isNull();
+
+    exception.expect(ResourceNotFoundException.class);
+    project().defaultDashboard().get();
+  }
+
+  @Test
+  public void replaceDefaultDashboard() throws Exception {
+    DashboardInfo d1 = createTestDashboard(DashboardsCollection.DEFAULT_DASHBOARD_NAME, "test1");
+    DashboardInfo d2 = createTestDashboard(DashboardsCollection.DEFAULT_DASHBOARD_NAME, "test2");
+    assertThat(d1.isDefault).isNull();
+    assertThat(d2.isDefault).isNull();
+    project().dashboard(d1.id).setDefault();
+    assertThat(project().dashboard(d1.id).get().isDefault).isTrue();
+    assertThat(project().dashboard(d2.id).get().isDefault).isNull();
+    assertThat(project().defaultDashboard().get().id).isEqualTo(d1.id);
+    project().dashboard(d2.id).setDefault();
+    assertThat(project().defaultDashboard().get().id).isEqualTo(d2.id);
+    assertThat(project().dashboard(d1.id).get().isDefault).isNull();
+    assertThat(project().dashboard(d2.id).get().isDefault).isTrue();
+  }
+
+  @Test
+  public void cannotGetDashboardWithInheritedForNonDefault() throws Exception {
+    DashboardInfo info = createTestDashboard();
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("inherited flag can only be used with default");
+    project().dashboard(info.id).get(true);
+  }
+
+  private void assertDashboardInfo(DashboardInfo actual, DashboardInfo expected) throws Exception {
+    assertThat(actual.id).isEqualTo(expected.id);
+    assertThat(actual.path).isEqualTo(expected.path);
+    assertThat(actual.ref).isEqualTo(expected.ref);
+    assertThat(actual.project).isEqualTo(project.get());
+    assertThat(actual.definingProject).isEqualTo(project.get());
+    assertThat(actual.description).isEqualTo(expected.description);
+    assertThat(actual.title).isEqualTo(expected.title);
+    assertThat(actual.foreach).isEqualTo(expected.foreach);
+    if (expected.sections == null) {
+      assertThat(actual.sections).isNull();
+    } else {
+      assertThat(actual.sections).hasSize(expected.sections.size());
+    }
+  }
+
+  private List<DashboardInfo> dashboards() throws Exception {
+    return project().dashboards().get();
+  }
+
+  private ProjectApi project() throws RestApiException {
+    return gApi.projects().name(project.get());
+  }
+
+  private DashboardInfo newDashboardInfo(String ref, String path) {
+    DashboardInfo info = DashboardsCollection.newDashboardInfo(ref, path);
+    info.title = "Reviewer";
+    info.description = "Own review requests";
+    info.foreach = "owner:self";
+    DashboardSectionInfo section = new DashboardSectionInfo();
+    section.name = "Open";
+    section.query = "is:open";
+    info.sections = ImmutableList.of(section);
+    return info;
+  }
+
+  private DashboardInfo createTestDashboard() throws Exception {
+    return createTestDashboard(DashboardsCollection.DEFAULT_DASHBOARD_NAME, "test");
+  }
+
+  private DashboardInfo createTestDashboard(String ref, String path) throws Exception {
+    return createDashboard(newDashboardInfo(ref, path));
+  }
+
+  private DashboardInfo createDashboard(DashboardInfo info) throws Exception {
+    String canonicalRef = DashboardsCollection.normalizeDashboardRef(info.ref);
+    try {
+      project().branch(canonicalRef).create(new BranchInput());
+    } catch (ResourceConflictException e) {
+      // The branch already exists if this method has already been called once.
+      if (!e.getMessage().contains("already exists")) {
+        throw e;
+      }
+    }
+    try (Repository r = repoManager.openRepository(project)) {
+      TestRepository<Repository>.CommitBuilder cb =
+          new TestRepository<>(r).branch(canonicalRef).commit();
+      StringBuilder content = new StringBuilder("[dashboard]\n");
+      if (info.title != null) {
+        content.append("title = ").append(info.title).append("\n");
+      }
+      if (info.description != null) {
+        content.append("description = ").append(info.description).append("\n");
+      }
+      if (info.foreach != null) {
+        content.append("foreach = ").append(info.foreach).append("\n");
+      }
+      if (info.sections != null) {
+        for (DashboardSectionInfo section : info.sections) {
+          content.append("[section \"").append(section.name).append("\"]\n");
+          content.append("query = ").append(section.query).append("\n");
+        }
+      }
+      cb.add(info.path, content.toString());
+      RevCommit c = cb.create();
+      project().commit(c.name());
+    }
+    return info;
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/api/project/ProjectIT.java b/javatests/com/google/gerrit/acceptance/api/project/ProjectIT.java
new file mode 100644
index 0000000..9fcbaa7
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/project/ProjectIT.java
@@ -0,0 +1,680 @@
+// Copyright (C) 2013 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.google.gerrit.acceptance.api.project;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.server.git.QueueProvider.QueueType.BATCH;
+import static com.google.gerrit.server.project.ProjectState.INHERITED_FROM_GLOBAL;
+import static com.google.gerrit.server.project.ProjectState.INHERITED_FROM_PARENT;
+import static com.google.gerrit.server.project.ProjectState.OVERRIDDEN_BY_GLOBAL;
+import static com.google.gerrit.server.project.ProjectState.OVERRIDDEN_BY_PARENT;
+import static java.util.stream.Collectors.toSet;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.util.concurrent.AtomicLongMap;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.GerritConfig;
+import com.google.gerrit.acceptance.GitUtil;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.projects.BranchInput;
+import com.google.gerrit.extensions.api.projects.ConfigInfo;
+import com.google.gerrit.extensions.api.projects.ConfigInput;
+import com.google.gerrit.extensions.api.projects.DescriptionInput;
+import com.google.gerrit.extensions.api.projects.ProjectInput;
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.extensions.client.ProjectState;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.extensions.events.ProjectIndexedListener;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gerrit.server.index.IndexExecutor;
+import com.google.inject.Inject;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.transport.PushResult;
+import org.eclipse.jgit.transport.RemoteRefUpdate.Status;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+@NoHttpd
+public class ProjectIT extends AbstractDaemonTest {
+  @Inject private DynamicSet<ProjectIndexedListener> projectIndexedListeners;
+
+  @Inject
+  @IndexExecutor(BATCH)
+  private ListeningExecutorService executor;
+
+  private ProjectIndexedCounter projectIndexedCounter;
+  private RegistrationHandle projectIndexedCounterHandle;
+
+  @Before
+  public void addProjectIndexedCounter() {
+    projectIndexedCounter = new ProjectIndexedCounter();
+    projectIndexedCounterHandle = projectIndexedListeners.add("gerrit", projectIndexedCounter);
+  }
+
+  @After
+  public void removeProjectIndexedCounter() {
+    if (projectIndexedCounterHandle != null) {
+      projectIndexedCounterHandle.remove();
+    }
+  }
+
+  @Test
+  public void createProject() throws Exception {
+    String name = name("foo");
+    assertThat(gApi.projects().create(name).get().name).isEqualTo(name);
+
+    RevCommit head = getRemoteHead(name, RefNames.REFS_CONFIG);
+    eventRecorder.assertRefUpdatedEvents(name, RefNames.REFS_CONFIG, null, head);
+
+    eventRecorder.assertRefUpdatedEvents(name, "refs/heads/master", new String[] {});
+    projectIndexedCounter.assertReindexOf(name);
+  }
+
+  @Test
+  public void createProjectWithInitialBranches() throws Exception {
+    String name = name("foo");
+    ProjectInput input = new ProjectInput();
+    input.name = name;
+    input.createEmptyCommit = true;
+    input.branches = ImmutableList.of("master", "foo");
+    assertThat(gApi.projects().create(input).get().name).isEqualTo(name);
+    assertThat(
+            gApi.projects().name(name).branches().get().stream().map(b -> b.ref).collect(toSet()))
+        .containsExactly("refs/heads/foo", "refs/heads/master", "HEAD", RefNames.REFS_CONFIG);
+
+    RevCommit head = getRemoteHead(name, RefNames.REFS_CONFIG);
+    eventRecorder.assertRefUpdatedEvents(name, RefNames.REFS_CONFIG, null, head);
+
+    head = getRemoteHead(name, "refs/heads/foo");
+    eventRecorder.assertRefUpdatedEvents(name, "refs/heads/foo", null, head);
+
+    head = getRemoteHead(name, "refs/heads/master");
+    eventRecorder.assertRefUpdatedEvents(name, "refs/heads/master", null, head);
+
+    projectIndexedCounter.assertReindexOf(name);
+  }
+
+  @Test
+  public void createProjectWithGitSuffix() throws Exception {
+    String name = name("foo");
+    assertThat(gApi.projects().create(name + ".git").get().name).isEqualTo(name);
+
+    RevCommit head = getRemoteHead(name, RefNames.REFS_CONFIG);
+    eventRecorder.assertRefUpdatedEvents(name, RefNames.REFS_CONFIG, null, head);
+
+    eventRecorder.assertRefUpdatedEvents(name, "refs/heads/master", new String[] {});
+  }
+
+  @Test
+  public void createProjectWithInitialCommit() throws Exception {
+    String name = name("foo");
+    ProjectInput input = new ProjectInput();
+    input.name = name;
+    input.createEmptyCommit = true;
+    assertThat(gApi.projects().create(input).get().name).isEqualTo(name);
+
+    RevCommit head = getRemoteHead(name, RefNames.REFS_CONFIG);
+    eventRecorder.assertRefUpdatedEvents(name, RefNames.REFS_CONFIG, null, head);
+
+    head = getRemoteHead(name, "refs/heads/master");
+    eventRecorder.assertRefUpdatedEvents(name, "refs/heads/master", null, head);
+  }
+
+  @Test
+  public void createProjectWithMismatchedInput() throws Exception {
+    ProjectInput in = new ProjectInput();
+    in.name = name("foo");
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("name must match input.name");
+    gApi.projects().name("bar").create(in);
+  }
+
+  @Test
+  public void createProjectNoNameInInput() throws Exception {
+    ProjectInput in = new ProjectInput();
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("input.name is required");
+    gApi.projects().create(in);
+  }
+
+  @Test
+  public void createProjectDuplicate() throws Exception {
+    ProjectInput in = new ProjectInput();
+    in.name = name("baz");
+    gApi.projects().create(in);
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("Project already exists");
+    gApi.projects().create(in);
+  }
+
+  @Test
+  public void createProjectWithNonExistingParent() throws Exception {
+    ProjectInput in = new ProjectInput();
+    in.name = name("baz");
+    in.parent = "non-existing";
+
+    exception.expect(UnprocessableEntityException.class);
+    exception.expectMessage("Project Not Found: " + in.parent);
+    gApi.projects().create(in);
+  }
+
+  @Test
+  public void createProjectWithSelfAsParentNotPossible() throws Exception {
+    ProjectInput in = new ProjectInput();
+    in.name = name("baz");
+    in.parent = in.name;
+
+    exception.expect(UnprocessableEntityException.class);
+    exception.expectMessage("Project Not Found: " + in.parent);
+    gApi.projects().create(in);
+  }
+
+  @Test
+  public void createProjectUnderAllUsersNotAllowed() throws Exception {
+    ProjectInput in = new ProjectInput();
+    in.name = name("foo");
+    in.parent = allUsers.get();
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage(String.format("Cannot inherit from '%s' project", allUsers.get()));
+    gApi.projects().create(in);
+  }
+
+  @Test
+  public void createAndDeleteBranch() throws Exception {
+    assertThat(getRemoteHead(project.get(), "foo")).isNull();
+
+    gApi.projects().name(project.get()).branch("foo").create(new BranchInput());
+    assertThat(getRemoteHead(project.get(), "foo")).isNotNull();
+    projectIndexedCounter.assertNoReindex();
+
+    gApi.projects().name(project.get()).branch("foo").delete();
+    assertThat(getRemoteHead(project.get(), "foo")).isNull();
+    projectIndexedCounter.assertNoReindex();
+  }
+
+  @Test
+  public void createAndDeleteBranchByPush() throws Exception {
+    grant(project, "refs/*", Permission.PUSH, true);
+    projectIndexedCounter.clear();
+
+    assertThat(getRemoteHead(project.get(), "foo")).isNull();
+
+    PushOneCommit.Result r = pushTo("refs/heads/foo");
+    r.assertOkStatus();
+    assertThat(getRemoteHead(project.get(), "foo")).isEqualTo(r.getCommit());
+    projectIndexedCounter.assertNoReindex();
+
+    PushResult r2 = GitUtil.pushOne(testRepo, null, "refs/heads/foo", false, true, null);
+    assertThat(r2.getRemoteUpdate("refs/heads/foo").getStatus()).isEqualTo(Status.OK);
+    assertThat(getRemoteHead(project.get(), "foo")).isNull();
+    projectIndexedCounter.assertNoReindex();
+  }
+
+  @Test
+  public void descriptionChangeCausesRefUpdate() throws Exception {
+    RevCommit initialHead = getRemoteHead(project, RefNames.REFS_CONFIG);
+    assertThat(gApi.projects().name(project.get()).description()).isEmpty();
+    DescriptionInput in = new DescriptionInput();
+    in.description = "new project description";
+    gApi.projects().name(project.get()).description(in);
+    assertThat(gApi.projects().name(project.get()).description()).isEqualTo(in.description);
+
+    RevCommit updatedHead = getRemoteHead(project, RefNames.REFS_CONFIG);
+    eventRecorder.assertRefUpdatedEvents(
+        project.get(), RefNames.REFS_CONFIG, initialHead, updatedHead);
+  }
+
+  @Test
+  public void descriptionIsDeletedWhenNotSpecified() throws Exception {
+    assertThat(gApi.projects().name(project.get()).description()).isEmpty();
+    DescriptionInput in = new DescriptionInput();
+    in.description = "new project description";
+    gApi.projects().name(project.get()).description(in);
+    assertThat(gApi.projects().name(project.get()).description()).isEqualTo(in.description);
+    in.description = null;
+    gApi.projects().name(project.get()).description(in);
+    assertThat(gApi.projects().name(project.get()).description()).isEmpty();
+  }
+
+  @Test
+  public void configChangeCausesRefUpdate() throws Exception {
+    RevCommit initialHead = getRemoteHead(project, RefNames.REFS_CONFIG);
+
+    ConfigInfo info = gApi.projects().name(project.get()).config();
+    assertThat(info.defaultSubmitType.value).isEqualTo(SubmitType.MERGE_IF_NECESSARY);
+    ConfigInput input = new ConfigInput();
+    input.submitType = SubmitType.CHERRY_PICK;
+    info = gApi.projects().name(project.get()).config(input);
+    assertThat(info.defaultSubmitType.value).isEqualTo(SubmitType.CHERRY_PICK);
+    info = gApi.projects().name(project.get()).config();
+    assertThat(info.defaultSubmitType.value).isEqualTo(SubmitType.CHERRY_PICK);
+
+    RevCommit updatedHead = getRemoteHead(project, RefNames.REFS_CONFIG);
+    eventRecorder.assertRefUpdatedEvents(
+        project.get(), RefNames.REFS_CONFIG, initialHead, updatedHead);
+  }
+
+  @Test
+  @SuppressWarnings("deprecation")
+  public void setConfig() throws Exception {
+    ConfigInput input = createTestConfigInput();
+    ConfigInfo info = gApi.projects().name(project.get()).config(input);
+    assertThat(info.description).isEqualTo(input.description);
+    assertThat(info.useContributorAgreements.configuredValue)
+        .isEqualTo(input.useContributorAgreements);
+    assertThat(info.useContentMerge.configuredValue).isEqualTo(input.useContentMerge);
+    assertThat(info.useSignedOffBy.configuredValue).isEqualTo(input.useSignedOffBy);
+    assertThat(info.createNewChangeForAllNotInTarget.configuredValue)
+        .isEqualTo(input.createNewChangeForAllNotInTarget);
+    assertThat(info.requireChangeId.configuredValue).isEqualTo(input.requireChangeId);
+    assertThat(info.rejectImplicitMerges.configuredValue).isEqualTo(input.rejectImplicitMerges);
+    assertThat(info.enableReviewerByEmail.configuredValue).isEqualTo(input.enableReviewerByEmail);
+    assertThat(info.createNewChangeForAllNotInTarget.configuredValue)
+        .isEqualTo(input.createNewChangeForAllNotInTarget);
+    assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo(input.maxObjectSizeLimit);
+    assertThat(info.submitType).isEqualTo(input.submitType);
+    assertThat(info.defaultSubmitType.value).isEqualTo(input.submitType);
+    assertThat(info.defaultSubmitType.inheritedValue).isEqualTo(SubmitType.MERGE_IF_NECESSARY);
+    assertThat(info.defaultSubmitType.configuredValue).isEqualTo(input.submitType);
+    assertThat(info.state).isEqualTo(input.state);
+  }
+
+  @SuppressWarnings("deprecation")
+  @Test
+  public void setPartialConfig() throws Exception {
+    ConfigInput input = createTestConfigInput();
+    gApi.projects().name(project.get()).config(input);
+
+    ConfigInput partialInput = new ConfigInput();
+    partialInput.useContributorAgreements = InheritableBoolean.FALSE;
+    ConfigInfo info = gApi.projects().name(project.get()).config(partialInput);
+
+    assertThat(info.description).isNull();
+    assertThat(info.useContributorAgreements.configuredValue)
+        .isEqualTo(partialInput.useContributorAgreements);
+    assertThat(info.useContentMerge.configuredValue).isEqualTo(input.useContentMerge);
+    assertThat(info.useSignedOffBy.configuredValue).isEqualTo(input.useSignedOffBy);
+    assertThat(info.createNewChangeForAllNotInTarget.configuredValue)
+        .isEqualTo(input.createNewChangeForAllNotInTarget);
+    assertThat(info.requireChangeId.configuredValue).isEqualTo(input.requireChangeId);
+    assertThat(info.rejectImplicitMerges.configuredValue).isEqualTo(input.rejectImplicitMerges);
+    assertThat(info.enableReviewerByEmail.configuredValue).isEqualTo(input.enableReviewerByEmail);
+    assertThat(info.createNewChangeForAllNotInTarget.configuredValue)
+        .isEqualTo(input.createNewChangeForAllNotInTarget);
+    assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo(input.maxObjectSizeLimit);
+    assertThat(info.submitType).isEqualTo(input.submitType);
+    assertThat(info.defaultSubmitType.value).isEqualTo(input.submitType);
+    assertThat(info.defaultSubmitType.inheritedValue).isEqualTo(SubmitType.MERGE_IF_NECESSARY);
+    assertThat(info.defaultSubmitType.configuredValue).isEqualTo(input.submitType);
+    assertThat(info.state).isEqualTo(input.state);
+  }
+
+  @Test
+  public void nonOwnerCannotSetConfig() throws Exception {
+    ConfigInput input = createTestConfigInput();
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    exception.expectMessage("write refs/meta/config not permitted");
+    gApi.projects().name(project.get()).config(input);
+  }
+
+  @Test
+  public void setHead() throws Exception {
+    assertThat(gApi.projects().name(project.get()).head()).isEqualTo("refs/heads/master");
+    gApi.projects().name(project.get()).branch("test1").create(new BranchInput());
+    gApi.projects().name(project.get()).branch("test2").create(new BranchInput());
+    for (String head : new String[] {"test1", "refs/heads/test2"}) {
+      gApi.projects().name(project.get()).head(head);
+      assertThat(gApi.projects().name(project.get()).head()).isEqualTo(RefNames.fullName(head));
+    }
+  }
+
+  @Test
+  public void setHeadToNonexistentBranch() throws Exception {
+    exception.expect(UnprocessableEntityException.class);
+    gApi.projects().name(project.get()).head("does-not-exist");
+  }
+
+  @Test
+  public void setHeadToSameBranch() throws Exception {
+    gApi.projects().name(project.get()).branch("test").create(new BranchInput());
+    for (String head : new String[] {"test", "refs/heads/test"}) {
+      gApi.projects().name(project.get()).head(head);
+      assertThat(gApi.projects().name(project.get()).head()).isEqualTo(RefNames.fullName(head));
+    }
+  }
+
+  @Test
+  public void setHeadNotAllowed() throws Exception {
+    gApi.projects().name(project.get()).branch("test").create(new BranchInput());
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    exception.expectMessage("not permitted: set HEAD on refs/heads/test");
+    gApi.projects().name(project.get()).head("test");
+  }
+
+  @Test
+  public void nonActiveProjectCanBeMadeActive() throws Exception {
+    for (ProjectState nonActiveState :
+        ImmutableList.of(ProjectState.READ_ONLY, ProjectState.HIDDEN)) {
+      // ACTIVE => NON_ACTIVE
+      ConfigInput ci1 = new ConfigInput();
+      ci1.state = nonActiveState;
+      gApi.projects().name(project.get()).config(ci1);
+      assertThat(gApi.projects().name(project.get()).config().state).isEqualTo(nonActiveState);
+      // NON_ACTIVE => ACTIVE
+      ConfigInput ci2 = new ConfigInput();
+      ci2.state = ProjectState.ACTIVE;
+      gApi.projects().name(project.get()).config(ci2);
+      // ACTIVE is represented as null in the API
+      assertThat(gApi.projects().name(project.get()).config().state).isNull();
+    }
+  }
+
+  @Test
+  public void nonActiveProjectCanBeMadeActiveByHostAdmin() throws Exception {
+    // ACTIVE => HIDDEN
+    ConfigInput ci1 = new ConfigInput();
+    ci1.state = ProjectState.HIDDEN;
+    gApi.projects().name(project.get()).config(ci1);
+    assertThat(gApi.projects().name(project.get()).config().state).isEqualTo(ProjectState.HIDDEN);
+
+    // Revoke OWNER permission for admin and block them from reading the project's refs
+    block(project, RefNames.REFS + "*", Permission.OWNER, SystemGroupBackend.REGISTERED_USERS);
+    block(project, RefNames.REFS + "*", Permission.READ, SystemGroupBackend.REGISTERED_USERS);
+
+    // HIDDEN => ACTIVE
+    ConfigInput ci2 = new ConfigInput();
+    ci2.state = ProjectState.ACTIVE;
+    gApi.projects().name(project.get()).config(ci2);
+    // ACTIVE is represented as null in the API
+    assertThat(gApi.projects().name(project.get()).config().state).isNull();
+  }
+
+  @Test
+  public void reindexProject() throws Exception {
+    createProject("child", project);
+    projectIndexedCounter.clear();
+
+    gApi.projects().name(allProjects.get()).index(false);
+    projectIndexedCounter.assertReindexOf(allProjects.get());
+  }
+
+  @Test
+  public void reindexProjectWithChildren() throws Exception {
+    Project.NameKey middle = createProject("middle", project);
+    Project.NameKey leave = createProject("leave", middle);
+    projectIndexedCounter.clear();
+
+    gApi.projects().name(project.get()).index(true);
+    projectIndexedCounter.assertReindexExactly(
+        ImmutableMap.of(project.get(), 1L, middle.get(), 1L, leave.get(), 1L));
+  }
+
+  @Test
+  public void maxObjectSizeIsNotSetByDefault() throws Exception {
+    ConfigInfo info = getConfig();
+    assertThat(info.maxObjectSizeLimit.value).isNull();
+    assertThat(info.maxObjectSizeLimit.configuredValue).isNull();
+    assertThat(info.maxObjectSizeLimit.summary).isNull();
+  }
+
+  @Test
+  public void maxObjectSizeCanBeSetAndCleared() throws Exception {
+    // Set a value
+    ConfigInfo info = setMaxObjectSize("100k");
+    assertThat(info.maxObjectSizeLimit.value).isEqualTo("102400");
+    assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo("100k");
+    assertThat(info.maxObjectSizeLimit.summary).isNull();
+
+    // Clear the value
+    info = setMaxObjectSize("0");
+    assertThat(info.maxObjectSizeLimit.value).isNull();
+    assertThat(info.maxObjectSizeLimit.configuredValue).isNull();
+    assertThat(info.maxObjectSizeLimit.summary).isNull();
+  }
+
+  @Test
+  @GerritConfig(name = "receive.inheritProjectMaxObjectSizeLimit", value = "true")
+  public void maxObjectSizeIsInheritedFromParentProject() throws Exception {
+    Project.NameKey child = createProject(name("child"), project);
+
+    ConfigInfo info = setMaxObjectSize("100k");
+    assertThat(info.maxObjectSizeLimit.value).isEqualTo("102400");
+    assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo("100k");
+    assertThat(info.maxObjectSizeLimit.summary).isNull();
+
+    info = getConfig(child);
+    assertThat(info.maxObjectSizeLimit.value).isEqualTo("102400");
+    assertThat(info.maxObjectSizeLimit.configuredValue).isNull();
+    assertThat(info.maxObjectSizeLimit.summary)
+        .isEqualTo(String.format(INHERITED_FROM_PARENT, project));
+  }
+
+  @Test
+  public void maxObjectSizeIsNotInheritedFromParentProject() throws Exception {
+    Project.NameKey child = createProject(name("child"), project);
+
+    ConfigInfo info = setMaxObjectSize("100k");
+    assertThat(info.maxObjectSizeLimit.value).isEqualTo("102400");
+    assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo("100k");
+    assertThat(info.maxObjectSizeLimit.summary).isNull();
+
+    info = getConfig(child);
+    assertThat(info.maxObjectSizeLimit.value).isNull();
+    assertThat(info.maxObjectSizeLimit.configuredValue).isNull();
+    assertThat(info.maxObjectSizeLimit.summary).isNull();
+  }
+
+  @Test
+  public void maxObjectSizeOverridesParentProjectWhenNotSetOnParent() throws Exception {
+    Project.NameKey child = createProject(name("child"), project);
+
+    ConfigInfo info = setMaxObjectSize("0");
+    assertThat(info.maxObjectSizeLimit.value).isNull();
+    assertThat(info.maxObjectSizeLimit.configuredValue).isNull();
+    assertThat(info.maxObjectSizeLimit.summary).isNull();
+
+    info = setMaxObjectSize(child, "100k");
+    assertThat(info.maxObjectSizeLimit.value).isEqualTo("102400");
+    assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo("100k");
+    assertThat(info.maxObjectSizeLimit.summary).isNull();
+  }
+
+  @Test
+  public void maxObjectSizeOverridesParentProjectWhenLower() throws Exception {
+    Project.NameKey child = createProject(name("child"), project);
+
+    ConfigInfo info = setMaxObjectSize("200k");
+    assertThat(info.maxObjectSizeLimit.value).isEqualTo("204800");
+    assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo("200k");
+    assertThat(info.maxObjectSizeLimit.summary).isNull();
+
+    info = setMaxObjectSize(child, "100k");
+    assertThat(info.maxObjectSizeLimit.value).isEqualTo("102400");
+    assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo("100k");
+    assertThat(info.maxObjectSizeLimit.summary).isNull();
+  }
+
+  @Test
+  @GerritConfig(name = "receive.inheritProjectMaxObjectSizeLimit", value = "true")
+  public void maxObjectSizeDoesNotOverrideParentProjectWhenHigher() throws Exception {
+    Project.NameKey child = createProject(name("child"), project);
+
+    ConfigInfo info = setMaxObjectSize("100k");
+    assertThat(info.maxObjectSizeLimit.value).isEqualTo("102400");
+    assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo("100k");
+    assertThat(info.maxObjectSizeLimit.summary).isNull();
+
+    info = setMaxObjectSize(child, "200k");
+    assertThat(info.maxObjectSizeLimit.value).isEqualTo("102400");
+    assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo("200k");
+    assertThat(info.maxObjectSizeLimit.summary)
+        .isEqualTo(String.format(OVERRIDDEN_BY_PARENT, project));
+  }
+
+  @Test
+  @GerritConfig(name = "receive.maxObjectSizeLimit", value = "200k")
+  public void maxObjectSizeIsInheritedFromGlobalConfig() throws Exception {
+    Project.NameKey child = createProject(name("child"), project);
+
+    ConfigInfo info = getConfig();
+    assertThat(info.maxObjectSizeLimit.value).isEqualTo("204800");
+    assertThat(info.maxObjectSizeLimit.configuredValue).isNull();
+    assertThat(info.maxObjectSizeLimit.summary).isEqualTo(INHERITED_FROM_GLOBAL);
+
+    info = getConfig(child);
+    assertThat(info.maxObjectSizeLimit.value).isEqualTo("204800");
+    assertThat(info.maxObjectSizeLimit.configuredValue).isNull();
+    assertThat(info.maxObjectSizeLimit.summary).isEqualTo(INHERITED_FROM_GLOBAL);
+  }
+
+  @Test
+  @GerritConfig(name = "receive.maxObjectSizeLimit", value = "200k")
+  public void maxObjectSizeOverridesGlobalConfigWhenLower() throws Exception {
+    ConfigInfo info = setMaxObjectSize("100k");
+    assertThat(info.maxObjectSizeLimit.value).isEqualTo("102400");
+    assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo("100k");
+    assertThat(info.maxObjectSizeLimit.summary).isNull();
+  }
+
+  @Test
+  @GerritConfig(name = "receive.maxObjectSizeLimit", value = "300k")
+  public void inheritedMaxObjectSizeOverridesGlobalConfigWhenLower() throws Exception {
+    Project.NameKey child = createProject(name("child"), project);
+
+    ConfigInfo info = setMaxObjectSize("200k");
+    assertThat(info.maxObjectSizeLimit.value).isEqualTo("204800");
+    assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo("200k");
+    assertThat(info.maxObjectSizeLimit.summary).isNull();
+
+    info = setMaxObjectSize(child, "100k");
+    assertThat(info.maxObjectSizeLimit.value).isEqualTo("102400");
+    assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo("100k");
+    assertThat(info.maxObjectSizeLimit.summary).isNull();
+  }
+
+  @Test
+  @GerritConfig(name = "receive.maxObjectSizeLimit", value = "200k")
+  @GerritConfig(name = "receive.inheritProjectMaxObjectSizeLimit", value = "true")
+  public void maxObjectSizeDoesNotOverrideGlobalConfigWhenHigher() throws Exception {
+    Project.NameKey child = createProject(name("child"), project);
+
+    ConfigInfo info = setMaxObjectSize("300k");
+    assertThat(info.maxObjectSizeLimit.value).isEqualTo("204800");
+    assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo("300k");
+    assertThat(info.maxObjectSizeLimit.summary).isEqualTo(OVERRIDDEN_BY_GLOBAL);
+
+    info = getConfig(child);
+    assertThat(info.maxObjectSizeLimit.value).isEqualTo("204800");
+    assertThat(info.maxObjectSizeLimit.configuredValue).isNull();
+    assertThat(info.maxObjectSizeLimit.summary).isEqualTo(OVERRIDDEN_BY_GLOBAL);
+  }
+
+  @Test
+  public void invalidMaxObjectSizeIsRejected() throws Exception {
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("100 foo");
+    setMaxObjectSize("100 foo");
+  }
+
+  private ConfigInfo setConfig(Project.NameKey name, ConfigInput input) throws Exception {
+    return gApi.projects().name(name.get()).config(input);
+  }
+
+  private ConfigInfo getConfig(Project.NameKey name) throws Exception {
+    return gApi.projects().name(name.get()).config();
+  }
+
+  private ConfigInfo getConfig() throws Exception {
+    return getConfig(project);
+  }
+
+  private ConfigInput createTestConfigInput() {
+    ConfigInput input = new ConfigInput();
+    input.description = "some description";
+    input.useContributorAgreements = InheritableBoolean.TRUE;
+    input.useContentMerge = InheritableBoolean.TRUE;
+    input.useSignedOffBy = InheritableBoolean.TRUE;
+    input.createNewChangeForAllNotInTarget = InheritableBoolean.TRUE;
+    input.requireChangeId = InheritableBoolean.TRUE;
+    input.rejectImplicitMerges = InheritableBoolean.TRUE;
+    input.enableReviewerByEmail = InheritableBoolean.TRUE;
+    input.createNewChangeForAllNotInTarget = InheritableBoolean.TRUE;
+    input.maxObjectSizeLimit = "5m";
+    input.submitType = SubmitType.CHERRY_PICK;
+    input.state = ProjectState.HIDDEN;
+    return input;
+  }
+
+  private ConfigInfo setMaxObjectSize(String value) throws Exception {
+    return setMaxObjectSize(project, value);
+  }
+
+  private ConfigInfo setMaxObjectSize(Project.NameKey name, String value) throws Exception {
+    ConfigInput input = new ConfigInput();
+    input.maxObjectSizeLimit = value;
+    return setConfig(name, input);
+  }
+
+  private static class ProjectIndexedCounter implements ProjectIndexedListener {
+    private final AtomicLongMap<String> countsByProject = AtomicLongMap.create();
+
+    @Override
+    public void onProjectIndexed(String project) {
+      countsByProject.incrementAndGet(project);
+    }
+
+    void clear() {
+      countsByProject.clear();
+    }
+
+    long getCount(String projectName) {
+      return countsByProject.get(projectName);
+    }
+
+    void assertReindexOf(String projectName) {
+      assertReindexOf(projectName, 1);
+    }
+
+    void assertReindexOf(String projectName, int expectedCount) {
+      assertThat(getCount(projectName)).isEqualTo(expectedCount);
+      assertThat(countsByProject).hasSize(1);
+      clear();
+    }
+
+    void assertNoReindex() {
+      assertThat(countsByProject).isEmpty();
+    }
+
+    void assertReindexExactly(ImmutableMap<String, Long> expected) {
+      assertThat(countsByProject.asMap()).containsExactlyEntriesIn(expected);
+      clear();
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/api/project/ProjectIndexerIT.java b/javatests/com/google/gerrit/acceptance/api/project/ProjectIndexerIT.java
new file mode 100644
index 0000000..6fde012
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/project/ProjectIndexerIT.java
@@ -0,0 +1,129 @@
+// 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.
+
+package com.google.gerrit.acceptance.api.project;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.acceptance.GitUtil.fetch;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.index.IndexConfig;
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.RefState;
+import com.google.gerrit.index.project.ProjectField;
+import com.google.gerrit.index.project.ProjectIndex;
+import com.google.gerrit.index.project.ProjectIndexCollection;
+import com.google.gerrit.index.project.ProjectIndexer;
+import com.google.gerrit.index.query.FieldBundle;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.index.project.StalenessChecker;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.inject.Inject;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Optional;
+import java.util.function.Consumer;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.Ref;
+import org.junit.Test;
+
+public class ProjectIndexerIT extends AbstractDaemonTest {
+  @Inject private ProjectIndexer projectIndexer;
+  @Inject private ProjectIndexCollection indexes;
+  @Inject private IndexConfig indexConfig;
+  @Inject private StalenessChecker stalenessChecker;
+
+  private static final ImmutableSet<String> FIELDS =
+      ImmutableSet.of(ProjectField.NAME.getName(), ProjectField.REF_STATE.getName());
+
+  @Test
+  public void indexProject_indexesRefStateOfProjectAndParents() throws Exception {
+    projectIndexer.index(project);
+    ProjectIndex i = indexes.getSearchIndex();
+    assertThat(i.getSchema().hasField(ProjectField.REF_STATE)).isTrue();
+
+    Optional<FieldBundle> result =
+        i.getRaw(project, QueryOptions.create(indexConfig, 0, 1, FIELDS));
+
+    assertThat(result.isPresent()).isTrue();
+    Iterable<byte[]> refState = result.get().getValue(ProjectField.REF_STATE);
+    assertThat(refState).isNotEmpty();
+
+    Map<Project.NameKey, Collection<RefState>> states = RefState.parseStates(refState).asMap();
+
+    fetch(testRepo, "refs/meta/config:refs/meta/config");
+    Ref projectConfigRef = testRepo.getRepository().exactRef("refs/meta/config");
+    TestRepository<InMemoryRepository> allProjectsRepo = cloneProject(allProjects, admin);
+    fetch(allProjectsRepo, "refs/meta/config:refs/meta/config");
+    Ref allProjectConfigRef = allProjectsRepo.getRepository().exactRef("refs/meta/config");
+    assertThat(states)
+        .containsExactly(
+            project,
+            ImmutableSet.of(RefState.of(projectConfigRef)),
+            allProjects,
+            ImmutableSet.of(RefState.of(allProjectConfigRef)));
+  }
+
+  @Test
+  public void stalenessChecker_currentProject_notStale() throws Exception {
+    assertThat(stalenessChecker.isStale(project)).isFalse();
+  }
+
+  @Test
+  public void stalenessChecker_currentProjectUpdates_isStale() throws Exception {
+    updateProjectConfigWithoutIndexUpdate(project);
+    assertThat(stalenessChecker.isStale(project)).isTrue();
+  }
+
+  @Test
+  public void stalenessChecker_parentProjectUpdates_isStale() throws Exception {
+    updateProjectConfigWithoutIndexUpdate(allProjects);
+    assertThat(stalenessChecker.isStale(project)).isTrue();
+  }
+
+  @Test
+  public void stalenessChecker_hierarchyChange_isStale() throws Exception {
+    Project.NameKey p1 = createProject("p1", allProjects);
+    Project.NameKey p2 = createProject("p2", allProjects);
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      u.getConfig().getProject().setParentName(p1);
+      u.save();
+    }
+    assertThat(stalenessChecker.isStale(project)).isFalse();
+
+    updateProjectConfigWithoutIndexUpdate(p1, c -> c.getProject().setParentName(p2));
+    assertThat(stalenessChecker.isStale(project)).isTrue();
+  }
+
+  private void updateProjectConfigWithoutIndexUpdate(Project.NameKey project) throws Exception {
+    updateProjectConfigWithoutIndexUpdate(
+        project, c -> c.getProject().setDescription("making it stale"));
+  }
+
+  private void updateProjectConfigWithoutIndexUpdate(
+      Project.NameKey project, Consumer<ProjectConfig> update) throws Exception {
+    try (AutoCloseable ignored = disableProjectIndex()) {
+      try (ProjectConfigUpdate u = updateProject(project)) {
+        update.accept(u.getConfig());
+        u.save();
+      }
+    } catch (UnsupportedOperationException e) {
+      // Drop, as we just wanted to drop the index update
+      return;
+    }
+    fail("should have a UnsupportedOperationException");
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/api/project/SetParentIT.java b/javatests/com/google/gerrit/acceptance/api/project/SetParentIT.java
new file mode 100644
index 0000000..3295f1a
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/project/SetParentIT.java
@@ -0,0 +1,146 @@
+// Copyright (C) 2013 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.google.gerrit.acceptance.api.project;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.GerritConfig;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.config.AllProjectsNameProvider;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import org.junit.Test;
+
+@NoHttpd
+public class SetParentIT extends AbstractDaemonTest {
+
+  @Test
+  public void setParentNotAllowed() throws Exception {
+    String parent = createProject("parent", null, true).get();
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    gApi.projects().name(project.get()).parent(parent);
+  }
+
+  @Test
+  @GerritConfig(name = "receive.allowProjectOwnersToChangeParent", value = "true")
+  public void setParentNotAllowedForNonOwners() throws Exception {
+    String parent = createProject("parent", null, true).get();
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    gApi.projects().name(project.get()).parent(parent);
+  }
+
+  @Test
+  @GerritConfig(name = "receive.allowProjectOwnersToChangeParent", value = "true")
+  public void setParentAllowedByAdminWhenAllowProjectOwnersEnabled() throws Exception {
+    String parent = createProject("parent", null, true).get();
+
+    gApi.projects().name(project.get()).parent(parent);
+    assertThat(gApi.projects().name(project.get()).parent()).isEqualTo(parent);
+
+    // When the parent name is not explicitly set, it should be
+    // set to "All-Projects".
+    gApi.projects().name(project.get()).parent(null);
+    assertThat(gApi.projects().name(project.get()).parent())
+        .isEqualTo(AllProjectsNameProvider.DEFAULT);
+  }
+
+  @Test
+  @GerritConfig(name = "receive.allowProjectOwnersToChangeParent", value = "true")
+  public void setParentAllowedForOwners() throws Exception {
+    String parent = createProject("parent", null, true).get();
+    setApiUser(user);
+    grant(project, "refs/*", Permission.OWNER, false, SystemGroupBackend.REGISTERED_USERS);
+    gApi.projects().name(project.get()).parent(parent);
+    assertThat(gApi.projects().name(project.get()).parent()).isEqualTo(parent);
+  }
+
+  @Test
+  public void setParent() throws Exception {
+    String parent = createProject("parent", null, true).get();
+
+    gApi.projects().name(project.get()).parent(parent);
+    assertThat(gApi.projects().name(project.get()).parent()).isEqualTo(parent);
+
+    // When the parent name is not explicitly set, it should be
+    // set to "All-Projects".
+    gApi.projects().name(project.get()).parent(null);
+    assertThat(gApi.projects().name(project.get()).parent())
+        .isEqualTo(AllProjectsNameProvider.DEFAULT);
+  }
+
+  @Test
+  public void setParentForAllProjectsNotAllowed() throws Exception {
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("cannot set parent of " + AllProjectsNameProvider.DEFAULT);
+    gApi.projects().name(allProjects.get()).parent(project.get());
+  }
+
+  @Test
+  public void setParentToSelfNotAllowed() throws Exception {
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("cannot set parent to self");
+    gApi.projects().name(project.get()).parent(project.get());
+  }
+
+  @Test
+  public void setParentToOwnChildNotAllowed() throws Exception {
+    String child = createProject("child", project, true).get();
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("cycle exists between");
+    gApi.projects().name(project.get()).parent(child);
+  }
+
+  @Test
+  public void setParentToGrandchildNotAllowed() throws Exception {
+    Project.NameKey child = createProject("child", project, true);
+    String grandchild = createProject("grandchild", child, true).get();
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("cycle exists between");
+    gApi.projects().name(project.get()).parent(grandchild);
+  }
+
+  @Test
+  public void setParentToNonexistentProject() throws Exception {
+    exception.expect(UnprocessableEntityException.class);
+    exception.expectMessage("not found");
+    gApi.projects().name(project.get()).parent("non-existing");
+  }
+
+  @Test
+  public void setParentToAllUsersNotAllowed() throws Exception {
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage(String.format("Cannot inherit from '%s' project", allUsers.get()));
+    gApi.projects().name(project.get()).parent(allUsers.get());
+  }
+
+  @Test
+  public void setParentForAllUsersMustBeAllProjects() throws Exception {
+    gApi.projects().name(allUsers.get()).parent(allProjects.get());
+
+    String parent = createProject("parent", null, true).get();
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("All-Users must inherit from All-Projects");
+    gApi.projects().name(allUsers.get()).parent(parent);
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/api/revision/BUILD b/javatests/com/google/gerrit/acceptance/api/revision/BUILD
new file mode 100644
index 0000000..06e45c5
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/revision/BUILD
@@ -0,0 +1,7 @@
+load("//javatests/com/google/gerrit/acceptance:tests.bzl", "acceptance_tests")
+
+acceptance_tests(
+    srcs = glob(["*IT.java"]),
+    group = "api_revision",
+    labels = ["api"],
+)
diff --git a/javatests/com/google/gerrit/acceptance/api/revision/RevisionDiffIT.java b/javatests/com/google/gerrit/acceptance/api/revision/RevisionDiffIT.java
new file mode 100644
index 0000000..057f837
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/revision/RevisionDiffIT.java
@@ -0,0 +1,2604 @@
+// Copyright (C) 2017 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.google.gerrit.acceptance.api.revision;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static com.google.gerrit.extensions.common.testing.DiffInfoSubject.assertThat;
+import static com.google.gerrit.extensions.common.testing.FileInfoSubject.assertThat;
+import static com.google.gerrit.reviewdb.client.Patch.COMMIT_MSG;
+import static java.util.stream.Collectors.joining;
+import static java.util.stream.Collectors.toMap;
+
+import com.google.common.base.Joiner;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.GitUtil;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.PushOneCommit.Result;
+import com.google.gerrit.common.RawInputUtil;
+import com.google.gerrit.extensions.api.changes.FileApi;
+import com.google.gerrit.extensions.api.changes.RebaseInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput.CommentInput;
+import com.google.gerrit.extensions.client.Comment;
+import com.google.gerrit.extensions.client.DiffPreferencesInfo;
+import com.google.gerrit.extensions.common.ChangeType;
+import com.google.gerrit.extensions.common.DiffInfo;
+import com.google.gerrit.extensions.common.FileInfo;
+import com.google.gerrit.extensions.restapi.BinaryResult;
+import com.google.gerrit.testing.ConfigSuite;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.IntStream;
+import javax.imageio.ImageIO;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.junit.Before;
+import org.junit.Test;
+
+public class RevisionDiffIT extends AbstractDaemonTest {
+  // @RunWith(Parameterized.class) can't be used as AbstractDaemonTest is annotated with another
+  // runner. Using different configs is a workaround to achieve the same.
+  private static final String TEST_PARAMETER_MARKER = "test_only_parameter";
+  private static final String CURRENT = "current";
+  private static final String FILE_NAME = "some_file.txt";
+  private static final String FILE_NAME2 = "another_file.txt";
+  private static final String FILE_CONTENT =
+      IntStream.rangeClosed(1, 100)
+          .mapToObj(number -> String.format("Line %d\n", number))
+          .collect(joining());
+  private static final String FILE_CONTENT2 = "1st line\n2nd line\n3rd line\n";
+
+  private boolean intraline;
+  private ObjectId commit1;
+  private String changeId;
+  private String initialPatchSetId;
+
+  @ConfigSuite.Config
+  public static Config intralineConfig() {
+    Config config = new Config();
+    config.setBoolean(TEST_PARAMETER_MARKER, null, "intraline", true);
+    return config;
+  }
+
+  @Before
+  public void setUp() throws Exception {
+    // Reduce flakiness of tests. (If tests aren't fast enough, we would use a fall-back
+    // computation, which might yield different results.)
+    baseConfig.setString("cache", "diff", "timeout", "1 minute");
+    baseConfig.setString("cache", "diff_intraline", "timeout", "1 minute");
+
+    intraline = baseConfig.getBoolean(TEST_PARAMETER_MARKER, "intraline", false);
+
+    ObjectId headCommit = testRepo.getRepository().resolve("HEAD");
+    commit1 =
+        addCommit(headCommit, ImmutableMap.of(FILE_NAME, FILE_CONTENT, FILE_NAME2, FILE_CONTENT2));
+
+    Result result = createEmptyChange();
+    changeId = result.getChangeId();
+    initialPatchSetId = result.getPatchSetId().getId();
+  }
+
+  @Test
+  public void diff() throws Exception {
+    // The assertions assume that intraline is false.
+    assume().that(intraline).isFalse();
+
+    String fileName = "a_new_file.txt";
+    String fileContent = "First line\nSecond line\n";
+    PushOneCommit.Result result = createChange("Add a file", fileName, fileContent);
+    assertDiffForNewFile(result, fileName, fileContent);
+    assertDiffForNewFile(result, COMMIT_MSG, result.getCommit().getFullMessage());
+  }
+
+  @Test
+  public void deletedFileIsIncludedInDiff() throws Exception {
+    gApi.changes().id(changeId).edit().deleteFile(FILE_NAME);
+    gApi.changes().id(changeId).edit().publish();
+
+    Map<String, FileInfo> changedFiles = gApi.changes().id(changeId).current().files();
+    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG, FILE_NAME);
+  }
+
+  @Test
+  public void numberOfLinesInDiffOfDeletedFileWithoutNewlineAtEndIsCorrect() throws Exception {
+    String filePath = "a_new_file.txt";
+    String fileContent = "Line 1\nLine 2\nLine 3";
+    gApi.changes().id(changeId).edit().modifyFile(filePath, RawInputUtil.create(fileContent));
+    gApi.changes().id(changeId).edit().publish();
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    gApi.changes().id(changeId).edit().deleteFile(filePath);
+    gApi.changes().id(changeId).edit().publish();
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, filePath).withBase(previousPatchSetId).get();
+    assertThat(diffInfo).metaA().totalLineCount().isEqualTo(3);
+    assertThat(diffInfo).metaB().isNull();
+  }
+
+  @Test
+  public void numberOfLinesInFileInfoOfDeletedFileWithoutNewlineAtEndIsCorrect() throws Exception {
+    String filePath = "a_new_file.txt";
+    String fileContent = "Line 1\nLine 2\nLine 3";
+    gApi.changes().id(changeId).edit().modifyFile(filePath, RawInputUtil.create(fileContent));
+    gApi.changes().id(changeId).edit().publish();
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    gApi.changes().id(changeId).edit().deleteFile(filePath);
+    gApi.changes().id(changeId).edit().publish();
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(previousPatchSetId);
+    assertThat(changedFiles.get(filePath)).linesInserted().isNull();
+    assertThat(changedFiles.get(filePath)).linesDeleted().isEqualTo(3);
+  }
+
+  @Test
+  public void numberOfLinesInDiffOfDeletedFileWithNewlineAtEndIsCorrect() throws Exception {
+    String filePath = "a_new_file.txt";
+    String fileContent = "Line 1\nLine 2\nLine 3\n";
+    gApi.changes().id(changeId).edit().modifyFile(filePath, RawInputUtil.create(fileContent));
+    gApi.changes().id(changeId).edit().publish();
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    gApi.changes().id(changeId).edit().deleteFile(filePath);
+    gApi.changes().id(changeId).edit().publish();
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, filePath).withBase(previousPatchSetId).get();
+    assertThat(diffInfo).metaA().totalLineCount().isEqualTo(4);
+    assertThat(diffInfo).metaB().isNull();
+  }
+
+  @Test
+  public void numberOfLinesInFileInfoOfDeletedFileWithNewlineAtEndIsCorrect() throws Exception {
+    String filePath = "a_new_file.txt";
+    String fileContent = "Line 1\nLine 2\nLine 3\n";
+    gApi.changes().id(changeId).edit().modifyFile(filePath, RawInputUtil.create(fileContent));
+    gApi.changes().id(changeId).edit().publish();
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    gApi.changes().id(changeId).edit().deleteFile(filePath);
+    gApi.changes().id(changeId).edit().publish();
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(previousPatchSetId);
+    assertThat(changedFiles.get(filePath)).linesInserted().isNull();
+    // Inherited from Git: An empty last line is ignored in the count.
+    assertThat(changedFiles.get(filePath)).linesDeleted().isEqualTo(3);
+  }
+
+  @Test
+  public void deletedFileWithoutNewlineAtEndResultsInOneDiffEntry() throws Exception {
+    String filePath = "a_new_file.txt";
+    String fileContent = "Line 1\nLine 2\nLine 3";
+    gApi.changes().id(changeId).edit().modifyFile(filePath, RawInputUtil.create(fileContent));
+    gApi.changes().id(changeId).edit().publish();
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    gApi.changes().id(changeId).edit().deleteFile(filePath);
+    gApi.changes().id(changeId).edit().publish();
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, filePath).withBase(previousPatchSetId).get();
+    assertThat(diffInfo)
+        .content()
+        .onlyElement()
+        .linesOfA()
+        .containsExactly("Line 1", "Line 2", "Line 3");
+  }
+
+  @Test
+  public void deletedFileWithNewlineAtEndResultsInOneDiffEntry() throws Exception {
+    String filePath = "a_new_file.txt";
+    String fileContent = "Line 1\nLine 2\nLine 3\n";
+    gApi.changes().id(changeId).edit().modifyFile(filePath, RawInputUtil.create(fileContent));
+    gApi.changes().id(changeId).edit().publish();
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    gApi.changes().id(changeId).edit().deleteFile(filePath);
+    gApi.changes().id(changeId).edit().publish();
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, filePath).withBase(previousPatchSetId).get();
+    assertThat(diffInfo)
+        .content()
+        .onlyElement()
+        .linesOfA()
+        .containsExactly("Line 1", "Line 2", "Line 3", "");
+  }
+
+  @Test
+  public void addedFileIsIncludedInDiff() throws Exception {
+    String newFilePath = "a_new_file.txt";
+    String newFileContent = "arbitrary content";
+    gApi.changes().id(changeId).edit().modifyFile(newFilePath, RawInputUtil.create(newFileContent));
+    gApi.changes().id(changeId).edit().publish();
+
+    Map<String, FileInfo> changedFiles = gApi.changes().id(changeId).current().files();
+    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG, newFilePath);
+  }
+
+  @Test
+  public void numberOfLinesInDiffOfAddedFileWithoutNewlineAtEndIsCorrect() throws Exception {
+    String filePath = "a_new_file.txt";
+    String fileContent = "Line 1\nLine2\nLine 3";
+    gApi.changes().id(changeId).edit().modifyFile(filePath, RawInputUtil.create(fileContent));
+    gApi.changes().id(changeId).edit().publish();
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, filePath).withBase(initialPatchSetId).get();
+    assertThat(diffInfo).metaA().isNull();
+    assertThat(diffInfo).metaB().totalLineCount().isEqualTo(3);
+  }
+
+  @Test
+  public void numberOfLinesInFileInfoOfAddedFileWithoutNewlineAtEndIsCorrect() throws Exception {
+    String filePath = "a_new_file.txt";
+    String fileContent = "Line 1\nLine2\nLine 3";
+    gApi.changes().id(changeId).edit().modifyFile(filePath, RawInputUtil.create(fileContent));
+    gApi.changes().id(changeId).edit().publish();
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(initialPatchSetId);
+    assertThat(changedFiles.get(filePath)).linesInserted().isEqualTo(3);
+    assertThat(changedFiles.get(filePath)).linesDeleted().isNull();
+  }
+
+  @Test
+  public void numberOfLinesInDiffOfAddedFileWithNewlineAtEndIsCorrect() throws Exception {
+    String filePath = "a_new_file.txt";
+    String fileContent = "Line 1\nLine2\nLine 3\n";
+    gApi.changes().id(changeId).edit().modifyFile(filePath, RawInputUtil.create(fileContent));
+    gApi.changes().id(changeId).edit().publish();
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, filePath).withBase(initialPatchSetId).get();
+    assertThat(diffInfo).metaA().isNull();
+    assertThat(diffInfo).metaB().totalLineCount().isEqualTo(4);
+  }
+
+  @Test
+  public void numberOfLinesInFileInfoOfAddedFileWithNewlineAtEndIsCorrect() throws Exception {
+    String filePath = "a_new_file.txt";
+    String fileContent = "Line 1\nLine2\nLine 3\n";
+    gApi.changes().id(changeId).edit().modifyFile(filePath, RawInputUtil.create(fileContent));
+    gApi.changes().id(changeId).edit().publish();
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(initialPatchSetId);
+    // Inherited from Git: An empty last line is ignored in the count.
+    assertThat(changedFiles.get(filePath)).linesInserted().isEqualTo(3);
+    assertThat(changedFiles.get(filePath)).linesDeleted().isNull();
+  }
+
+  @Test
+  public void addedFileWithoutNewlineAtEndResultsInOneDiffEntry() throws Exception {
+    String filePath = "a_new_file.txt";
+    String fileContent = "Line 1\nLine 2\nLine 3";
+    gApi.changes().id(changeId).edit().modifyFile(filePath, RawInputUtil.create(fileContent));
+    gApi.changes().id(changeId).edit().publish();
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, filePath).withBase(initialPatchSetId).get();
+    assertThat(diffInfo)
+        .content()
+        .onlyElement()
+        .linesOfB()
+        .containsExactly("Line 1", "Line 2", "Line 3");
+  }
+
+  @Test
+  public void addedFileWithNewlineAtEndResultsInOneDiffEntry() throws Exception {
+    String filePath = "a_new_file.txt";
+    String fileContent = "Line 1\nLine 2\nLine 3\n";
+    gApi.changes().id(changeId).edit().modifyFile(filePath, RawInputUtil.create(fileContent));
+    gApi.changes().id(changeId).edit().publish();
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, filePath).withBase(initialPatchSetId).get();
+    assertThat(diffInfo)
+        .content()
+        .onlyElement()
+        .linesOfB()
+        .containsExactly("Line 1", "Line 2", "Line 3", "");
+  }
+
+  @Test
+  public void renamedFileIsIncludedInDiff() throws Exception {
+    String newFilePath = "a_new_file.txt";
+    gApi.changes().id(changeId).edit().renameFile(FILE_NAME, newFilePath);
+    gApi.changes().id(changeId).edit().publish();
+
+    Map<String, FileInfo> changedFiles = gApi.changes().id(changeId).current().files();
+    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG, newFilePath);
+  }
+
+  @Test
+  public void copiedFileTreatedAsAddedFileInDiff() throws Exception {
+    String copyFilePath = "copy_of_some_file.txt";
+    gApi.changes().id(changeId).edit().modifyFile(copyFilePath, RawInputUtil.create(FILE_CONTENT));
+    gApi.changes().id(changeId).edit().publish();
+
+    Map<String, FileInfo> changedFiles = gApi.changes().id(changeId).current().files();
+    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG, copyFilePath);
+    // If this ever changes, please add tests which cover copied files.
+    assertThat(changedFiles.get(copyFilePath)).status().isEqualTo('A');
+    assertThat(changedFiles.get(copyFilePath)).linesInserted().isEqualTo(100);
+    assertThat(changedFiles.get(copyFilePath)).linesDeleted().isNull();
+  }
+
+  @Test
+  public void addedBinaryFileIsIncludedInDiff() throws Exception {
+    String imageFileName = "an_image.png";
+    byte[] imageBytes = createRgbImage(255, 0, 0);
+    gApi.changes().id(changeId).edit().modifyFile(imageFileName, RawInputUtil.create(imageBytes));
+    gApi.changes().id(changeId).edit().publish();
+
+    Map<String, FileInfo> changedFiles = gApi.changes().id(changeId).current().files();
+    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG, imageFileName);
+  }
+
+  @Test
+  public void modifiedBinaryFileIsIncludedInDiff() throws Exception {
+    String imageFileName = "an_image.png";
+    byte[] imageBytes1 = createRgbImage(255, 100, 0);
+    ObjectId commit2 = addCommit(commit1, imageFileName, imageBytes1);
+
+    rebaseChangeOn(changeId, commit2);
+    byte[] imageBytes2 = createRgbImage(0, 100, 255);
+    gApi.changes().id(changeId).edit().modifyFile(imageFileName, RawInputUtil.create(imageBytes2));
+    gApi.changes().id(changeId).edit().publish();
+
+    Map<String, FileInfo> changedFiles = gApi.changes().id(changeId).current().files();
+    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG, imageFileName);
+  }
+
+  @Test
+  public void diffOnMergeCommitChange() throws Exception {
+    PushOneCommit.Result r = createMergeCommitChange("refs/for/master");
+
+    DiffInfo diff;
+
+    // automerge
+    diff = getDiffRequest(r.getChangeId(), r.getCommit().name(), "foo").get();
+    assertThat(diff.metaA.lines).isEqualTo(6);
+    assertThat(diff.metaB.lines).isEqualTo(1);
+
+    diff = getDiffRequest(r.getChangeId(), r.getCommit().name(), "bar").get();
+    assertThat(diff.metaA.lines).isEqualTo(6);
+    assertThat(diff.metaB.lines).isEqualTo(1);
+
+    // parent 1
+    diff = getDiffRequest(r.getChangeId(), r.getCommit().name(), "bar").withParent(1).get();
+    assertThat(diff.metaA.lines).isEqualTo(1);
+    assertThat(diff.metaB.lines).isEqualTo(1);
+
+    // parent 2
+    diff = getDiffRequest(r.getChangeId(), r.getCommit().name(), "foo").withParent(2).get();
+    assertThat(diff.metaA.lines).isEqualTo(1);
+    assertThat(diff.metaB.lines).isEqualTo(1);
+  }
+
+  @Test
+  public void diffOfUnmodifiedFileMarksAllLinesAsCommon() throws Exception {
+    String filePath = "a_new_file.txt";
+    String fileContent = "Line 1\nLine 2\nLine 3\n";
+    gApi.changes().id(changeId).edit().modifyFile(filePath, RawInputUtil.create(fileContent));
+    gApi.changes().id(changeId).edit().publish();
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    gApi.changes().id(changeId).edit().modifyCommitMessage("An unchanged patchset");
+    gApi.changes().id(changeId).edit().publish();
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, filePath).withBase(previousPatchSetId).get();
+    assertThat(diffInfo)
+        .content()
+        .onlyElement()
+        .commonLines()
+        .containsAllOf("Line 1", "Line 2", "Line 3")
+        .inOrder();
+    assertThat(diffInfo).content().onlyElement().linesOfA().isNull();
+    assertThat(diffInfo).content().onlyElement().linesOfB().isNull();
+  }
+
+  @Test
+  public void diffOfUnmodifiedFileWithNewlineAtEndHasEmptyLineAtEnd() throws Exception {
+    String filePath = "a_new_file.txt";
+    String fileContent = "Line 1\nLine 2\nLine 3\n";
+    gApi.changes().id(changeId).edit().modifyFile(filePath, RawInputUtil.create(fileContent));
+    gApi.changes().id(changeId).edit().publish();
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    gApi.changes().id(changeId).edit().modifyCommitMessage("An unchanged patchset");
+    gApi.changes().id(changeId).edit().publish();
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, filePath).withBase(previousPatchSetId).get();
+    assertThat(diffInfo).content().onlyElement().commonLines().lastElement().isEqualTo("");
+
+    assertThat(diffInfo).metaA().totalLineCount().isEqualTo(4);
+    assertThat(diffInfo).metaB().totalLineCount().isEqualTo(4);
+  }
+
+  @Test
+  public void diffOfUnmodifiedFileWithoutNewlineAtEndEndsWithLastLineContent() throws Exception {
+    String filePath = "a_new_file.txt";
+    String fileContent = "Line 1\nLine 2\nLine 3";
+    gApi.changes().id(changeId).edit().modifyFile(filePath, RawInputUtil.create(fileContent));
+    gApi.changes().id(changeId).edit().publish();
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    gApi.changes().id(changeId).edit().modifyCommitMessage("An unchanged patchset");
+    gApi.changes().id(changeId).edit().publish();
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, filePath).withBase(previousPatchSetId).get();
+    assertThat(diffInfo).content().onlyElement().commonLines().lastElement().isEqualTo("Line 3");
+
+    assertThat(diffInfo).metaA().totalLineCount().isEqualTo(3);
+    assertThat(diffInfo).metaB().totalLineCount().isEqualTo(3);
+  }
+
+  @Test
+  public void diffOfModifiedFileWithNewlineAtEndHasEmptyLineAtEnd() throws Exception {
+    String filePath = "a_new_file.txt";
+    String fileContent = "Line 1\nLine 2\nLine 3\n";
+    gApi.changes().id(changeId).edit().modifyFile(filePath, RawInputUtil.create(fileContent));
+    gApi.changes().id(changeId).edit().publish();
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    addModifiedPatchSet(changeId, filePath, content -> content.replace("Line 1\n", "Line one\n"));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, filePath).withBase(previousPatchSetId).get();
+    assertThat(diffInfo).content().lastElement().commonLines().lastElement().isEqualTo("");
+
+    assertThat(diffInfo).metaA().totalLineCount().isEqualTo(4);
+    assertThat(diffInfo).metaB().totalLineCount().isEqualTo(4);
+  }
+
+  @Test
+  public void diffOfModifiedFileWithoutNewlineAtEndEndsWithLastLineContent() throws Exception {
+    String filePath = "a_new_file.txt";
+    String fileContent = "Line 1\nLine 2\nLine 3";
+    gApi.changes().id(changeId).edit().modifyFile(filePath, RawInputUtil.create(fileContent));
+    gApi.changes().id(changeId).edit().publish();
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    addModifiedPatchSet(changeId, filePath, content -> content.replace("Line 1\n", "Line one\n"));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, filePath).withBase(previousPatchSetId).get();
+    assertThat(diffInfo).content().lastElement().commonLines().lastElement().isEqualTo("Line 3");
+
+    assertThat(diffInfo).metaA().totalLineCount().isEqualTo(3);
+    assertThat(diffInfo).metaB().totalLineCount().isEqualTo(3);
+  }
+
+  @Test
+  public void diffOfModifiedLastLineWithNewlineAtEndHasEmptyLineAtEnd() throws Exception {
+    String filePath = "a_new_file.txt";
+    String fileContent = "Line 1\nLine 2\nLine 3\n";
+    gApi.changes().id(changeId).edit().modifyFile(filePath, RawInputUtil.create(fileContent));
+    gApi.changes().id(changeId).edit().publish();
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    addModifiedPatchSet(changeId, filePath, content -> content.replace("Line 3\n", "Line three\n"));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, filePath).withBase(previousPatchSetId).get();
+    assertThat(diffInfo).content().lastElement().commonLines().lastElement().isEqualTo("");
+
+    assertThat(diffInfo).metaA().totalLineCount().isEqualTo(4);
+    assertThat(diffInfo).metaB().totalLineCount().isEqualTo(4);
+  }
+
+  @Test
+  public void diffOfModifiedLastLineWithoutNewlineAtEndEndsWithLastLineContent() throws Exception {
+    String filePath = "a_new_file.txt";
+    String fileContent = "Line 1\nLine 2\nLine 3";
+    gApi.changes().id(changeId).edit().modifyFile(filePath, RawInputUtil.create(fileContent));
+    gApi.changes().id(changeId).edit().publish();
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    addModifiedPatchSet(changeId, filePath, content -> content.replace("Line 3", "Line three"));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, filePath).withBase(previousPatchSetId).get();
+    assertThat(diffInfo).content().lastElement().linesOfA().containsExactly("Line 3");
+    assertThat(diffInfo).content().lastElement().linesOfB().containsExactly("Line three");
+
+    assertThat(diffInfo).metaA().totalLineCount().isEqualTo(3);
+    assertThat(diffInfo).metaB().totalLineCount().isEqualTo(3);
+  }
+
+  @Test
+  public void addedNewlineAtEndOfFileIsMarkedInDiffWhenWhitespaceIsConsidered() throws Exception {
+    addModifiedPatchSet(changeId, FILE_NAME, fileContent -> fileContent.concat("Line 101"));
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    addModifiedPatchSet(changeId, FILE_NAME, fileContent -> fileContent.concat("\n"));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME)
+            .withWhitespace(DiffPreferencesInfo.Whitespace.IGNORE_NONE)
+            .withBase(previousPatchSetId)
+            .get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 101");
+    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line 101", "");
+
+    assertThat(diffInfo).metaA().totalLineCount().isEqualTo(101);
+    assertThat(diffInfo).metaB().totalLineCount().isEqualTo(102);
+  }
+
+  @Test
+  public void addedNewlineAtEndOfFileIsMarkedInDiffWhenWhitespaceIsIgnored() throws Exception {
+    addModifiedPatchSet(changeId, FILE_NAME, fileContent -> fileContent.concat("Line 101"));
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    addModifiedPatchSet(changeId, FILE_NAME, fileContent -> fileContent.concat("\n"));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME)
+            .withWhitespace(DiffPreferencesInfo.Whitespace.IGNORE_ALL)
+            .withBase(previousPatchSetId)
+            .get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().isNull();
+    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("");
+
+    assertThat(diffInfo).metaA().totalLineCount().isEqualTo(101);
+    assertThat(diffInfo).metaB().totalLineCount().isEqualTo(102);
+  }
+
+  @Test
+  public void addedNewlineAtEndOfFileMeansOneModifiedLine() throws Exception {
+    addModifiedPatchSet(changeId, FILE_NAME, fileContent -> fileContent.concat("Line 101"));
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    addModifiedPatchSet(changeId, FILE_NAME, fileContent -> fileContent.concat("\n"));
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(previousPatchSetId);
+    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(1);
+    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(1);
+  }
+
+  @Test
+  public void addedLastLineWithoutNewlineBeforeAndAfterwardsIsMarkedInDiff() throws Exception {
+    addModifiedPatchSet(changeId, FILE_NAME, fileContent -> fileContent.concat("Line 101"));
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    addModifiedPatchSet(changeId, FILE_NAME, fileContent -> fileContent.concat("\nLine 102"));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME)
+            .withWhitespace(DiffPreferencesInfo.Whitespace.IGNORE_NONE)
+            .withBase(previousPatchSetId)
+            .get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 101");
+    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line 101", "Line 102");
+
+    assertThat(diffInfo).metaA().totalLineCount().isEqualTo(101);
+    assertThat(diffInfo).metaB().totalLineCount().isEqualTo(102);
+  }
+
+  @Test
+  public void addedLastLineWithoutNewlineBeforeAndAfterwardsMeansTwoModifiedLines()
+      throws Exception {
+    addModifiedPatchSet(changeId, FILE_NAME, fileContent -> fileContent.concat("Line 101"));
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    addModifiedPatchSet(changeId, FILE_NAME, fileContent -> fileContent.concat("\nLine 102"));
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(previousPatchSetId);
+    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(2);
+    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(1);
+  }
+
+  @Test
+  public void addedLastLineWithoutNewlineBeforeButWithOneAfterwardsIsMarkedInDiff()
+      throws Exception {
+    addModifiedPatchSet(changeId, FILE_NAME, fileContent -> fileContent.concat("Line 101"));
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    addModifiedPatchSet(changeId, FILE_NAME, fileContent -> fileContent.concat("\nLine 102\n"));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME)
+            .withWhitespace(DiffPreferencesInfo.Whitespace.IGNORE_NONE)
+            .withBase(previousPatchSetId)
+            .get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 101");
+    assertThat(diffInfo)
+        .content()
+        .element(1)
+        .linesOfB()
+        .containsExactly("Line 101", "Line 102", "");
+
+    assertThat(diffInfo).metaA().totalLineCount().isEqualTo(101);
+    assertThat(diffInfo).metaB().totalLineCount().isEqualTo(103);
+  }
+
+  @Test
+  public void addedLastLineWithoutNewlineBeforeButWithOneAfterwardsMeansTwoModifiedLines()
+      throws Exception {
+    addModifiedPatchSet(changeId, FILE_NAME, fileContent -> fileContent.concat("Line 101"));
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    addModifiedPatchSet(changeId, FILE_NAME, fileContent -> fileContent.concat("\nLine 102\n"));
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(previousPatchSetId);
+    // Inherited from Git: An empty last line is ignored in the count.
+    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(2);
+    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(1);
+  }
+
+  @Test
+  public void addedLastLineWithNewlineBeforeAndAfterwardsIsMarkedInDiff() throws Exception {
+    addModifiedPatchSet(changeId, FILE_NAME, fileContent -> fileContent.concat("Line 101\n"));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(initialPatchSetId).get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().isNull();
+    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line 101");
+    assertThat(diffInfo).content().element(2).commonLines().containsExactly("");
+
+    assertThat(diffInfo).metaA().totalLineCount().isEqualTo(101);
+    assertThat(diffInfo).metaB().totalLineCount().isEqualTo(102);
+  }
+
+  @Test
+  public void addedLastLineWithNewlineBeforeAndAfterwardsMeansOneInsertedLine() throws Exception {
+    addModifiedPatchSet(changeId, FILE_NAME, fileContent -> fileContent.concat("Line 101\n"));
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(initialPatchSetId);
+    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(1);
+    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isNull();
+  }
+
+  @Test
+  public void addedLastLineWithNewlineBeforeButWithoutOneAfterwardsIsMarkedInDiff()
+      throws Exception {
+    addModifiedPatchSet(changeId, FILE_NAME, fileContent -> fileContent.concat("Line 101"));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(initialPatchSetId).get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("");
+    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line 101");
+
+    assertThat(diffInfo).metaA().totalLineCount().isEqualTo(101);
+    assertThat(diffInfo).metaB().totalLineCount().isEqualTo(101);
+  }
+
+  @Test
+  public void addedLastLineWithNewlineBeforeButWithoutOneAfterwardsMeansOneInsertedLine()
+      throws Exception {
+    addModifiedPatchSet(changeId, FILE_NAME, fileContent -> fileContent.concat("Line 101"));
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(initialPatchSetId);
+    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(1);
+    // Inherited from Git: An empty last line is ignored in the count.
+    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isNull();
+  }
+
+  @Test
+  public void hunkForModifiedLastLineIsCombinedWithHunkForAddedNewlineAtEnd() throws Exception {
+    addModifiedPatchSet(changeId, FILE_NAME, fileContent -> fileContent.concat("Line 101"));
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    addModifiedPatchSet(
+        changeId, FILE_NAME, fileContent -> fileContent.replace("Line 101", "Line one oh one\n"));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(previousPatchSetId).get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 101");
+    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line one oh one", "");
+  }
+
+  @Test
+  public void intralineEditsForModifiedLastLineArePreservedWhenNewlineIsAlsoAddedAtEnd()
+      throws Exception {
+    assume().that(intraline).isTrue();
+
+    addModifiedPatchSet(changeId, FILE_NAME, fileContent -> fileContent.concat("Line 101"));
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    addModifiedPatchSet(
+        changeId, FILE_NAME, fileContent -> fileContent.replace("Line 101", "Line one oh one\n"));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(previousPatchSetId).get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo)
+        .content()
+        .element(1)
+        .intralineEditsOfA()
+        .containsExactly(ImmutableList.of(5, 3));
+    assertThat(diffInfo)
+        .content()
+        .element(1)
+        .intralineEditsOfB()
+        .containsExactly(ImmutableList.of(5, 11));
+  }
+
+  @Test
+  public void hunkForModifiedSecondToLastLineIsNotCombinedWithHunkForAddedNewlineAtEnd()
+      throws Exception {
+    addModifiedPatchSet(changeId, FILE_NAME, fileContent -> fileContent.concat("Line 101"));
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    addModifiedPatchSet(
+        changeId,
+        FILE_NAME,
+        fileContent -> fileContent.replace("Line 100\n", "Line one hundred\n").concat("\n"));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(previousPatchSetId).get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 100");
+    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line one hundred");
+    assertThat(diffInfo).content().element(2).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(3).linesOfA().isNull();
+    assertThat(diffInfo).content().element(3).linesOfB().containsExactly("");
+  }
+
+  @Test
+  public void deletedNewlineAtEndOfFileIsMarkedInDiffWhenWhitespaceIsConsidered() throws Exception {
+    addModifiedPatchSet(
+        changeId, FILE_NAME, fileContent -> fileContent.replace("Line 100\n", "Line 100"));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME)
+            .withBase(initialPatchSetId)
+            .withWhitespace(DiffPreferencesInfo.Whitespace.IGNORE_NONE)
+            .get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 100", "");
+    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line 100");
+
+    assertThat(diffInfo).metaA().totalLineCount().isEqualTo(101);
+    assertThat(diffInfo).metaB().totalLineCount().isEqualTo(100);
+  }
+
+  @Test
+  public void deletedNewlineAtEndOfFileIsMarkedInDiffWhenWhitespaceIsIgnored() throws Exception {
+    addModifiedPatchSet(
+        changeId, FILE_NAME, fileContent -> fileContent.replace("Line 100\n", "Line 100"));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME)
+            .withBase(initialPatchSetId)
+            .withWhitespace(DiffPreferencesInfo.Whitespace.IGNORE_ALL)
+            .get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("");
+    assertThat(diffInfo).content().element(1).linesOfB().isNull();
+
+    assertThat(diffInfo).metaA().totalLineCount().isEqualTo(101);
+    assertThat(diffInfo).metaB().totalLineCount().isEqualTo(100);
+  }
+
+  @Test
+  public void deletedNewlineAtEndOfFileMeansOneModifiedLine() throws Exception {
+    addModifiedPatchSet(
+        changeId, FILE_NAME, fileContent -> fileContent.replace("Line 100\n", "Line 100"));
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(initialPatchSetId);
+    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(1);
+    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(1);
+  }
+
+  @Test
+  public void deletedLastLineWithoutNewlineBeforeAndAfterwardsIsMarkedInDiff() throws Exception {
+    addModifiedPatchSet(
+        changeId, FILE_NAME, fileContent -> fileContent.replace("Line 100\n", "Line 100"));
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    addModifiedPatchSet(changeId, FILE_NAME, fileContent -> fileContent.replace("\nLine 100", ""));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME)
+            .withBase(previousPatchSetId)
+            .withWhitespace(DiffPreferencesInfo.Whitespace.IGNORE_NONE)
+            .get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 99", "Line 100");
+    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line 99");
+
+    assertThat(diffInfo).metaA().totalLineCount().isEqualTo(100);
+    assertThat(diffInfo).metaB().totalLineCount().isEqualTo(99);
+  }
+
+  @Test
+  public void deletedLastLineWithoutNewlineBeforeAndAfterwardsMeansTwoModifiedLines()
+      throws Exception {
+    addModifiedPatchSet(
+        changeId, FILE_NAME, fileContent -> fileContent.replace("Line 100\n", "Line 100"));
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    addModifiedPatchSet(changeId, FILE_NAME, fileContent -> fileContent.replace("\nLine 100", ""));
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(previousPatchSetId);
+    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(1);
+    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(2);
+  }
+
+  @Test
+  public void deletedLastLineWithoutNewlineBeforeButWithOneAfterwardsIsMarkedInDiff()
+      throws Exception {
+    addModifiedPatchSet(
+        changeId, FILE_NAME, fileContent -> fileContent.replace("Line 100\n", "Line 100"));
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    addModifiedPatchSet(changeId, FILE_NAME, fileContent -> fileContent.replace("Line 100", ""));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME)
+            .withBase(previousPatchSetId)
+            .withWhitespace(DiffPreferencesInfo.Whitespace.IGNORE_NONE)
+            .get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 100");
+    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("");
+
+    assertThat(diffInfo).metaA().totalLineCount().isEqualTo(100);
+    assertThat(diffInfo).metaB().totalLineCount().isEqualTo(100);
+  }
+
+  @Test
+  public void deletedLastLineWithoutNewlineBeforeButWithOneAfterwardsMeansOneDeletedLine()
+      throws Exception {
+    addModifiedPatchSet(
+        changeId, FILE_NAME, fileContent -> fileContent.replace("Line 100\n", "Line 100"));
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    addModifiedPatchSet(changeId, FILE_NAME, fileContent -> fileContent.replace("Line 100", ""));
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(previousPatchSetId);
+    // Inherited from Git: An empty last line is ignored in the count.
+    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isNull();
+    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(1);
+  }
+
+  @Test
+  public void deletedLastLineWithNewlineBeforeAndAfterwardsIsMarkedInDiff() throws Exception {
+    addModifiedPatchSet(changeId, FILE_NAME, fileContent -> fileContent.replace("Line 100\n", ""));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME)
+            .withBase(initialPatchSetId)
+            .withWhitespace(DiffPreferencesInfo.Whitespace.IGNORE_NONE)
+            .get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 100");
+    assertThat(diffInfo).content().element(1).linesOfB().isNull();
+    assertThat(diffInfo).content().element(2).commonLines().containsExactly("");
+
+    assertThat(diffInfo).metaA().totalLineCount().isEqualTo(101);
+    assertThat(diffInfo).metaB().totalLineCount().isEqualTo(100);
+  }
+
+  @Test
+  public void deletedLastLineWithNewlineBeforeAndAfterwardsMeansOneDeletedLine() throws Exception {
+    addModifiedPatchSet(changeId, FILE_NAME, fileContent -> fileContent.replace("Line 100\n", ""));
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(initialPatchSetId);
+    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isNull();
+    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(1);
+  }
+
+  @Test
+  public void deletedLastLineWithNewlineBeforeButWithoutOneAfterwardsIsMarkedInDiff()
+      throws Exception {
+    addModifiedPatchSet(
+        changeId, FILE_NAME, fileContent -> fileContent.replace("\nLine 100\n", ""));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME)
+            .withBase(initialPatchSetId)
+            .withWhitespace(DiffPreferencesInfo.Whitespace.IGNORE_NONE)
+            .get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 99", "Line 100", "");
+    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line 99");
+
+    assertThat(diffInfo).metaA().totalLineCount().isEqualTo(101);
+    assertThat(diffInfo).metaB().totalLineCount().isEqualTo(99);
+  }
+
+  @Test
+  public void deletedLastLineWithNewlineBeforeButWithoutOneAfterwardsMeansTwoModifiedLines()
+      throws Exception {
+    addModifiedPatchSet(
+        changeId, FILE_NAME, fileContent -> fileContent.replace("\nLine 100\n", ""));
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(initialPatchSetId);
+    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(1);
+    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(2);
+  }
+
+  @Test
+  public void hunkForModifiedLastLineIsCombinedWithHunkForDeletedNewlineAtEnd() throws Exception {
+    addModifiedPatchSet(
+        changeId, FILE_NAME, fileContent -> fileContent.replace("Line 100\n", "Line one hundred"));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(initialPatchSetId).get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 100", "");
+    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line one hundred");
+  }
+
+  @Test
+  public void intralineEditsForModifiedLastLineArePreservedWhenNewlineIsAlsoDeletedAtEnd()
+      throws Exception {
+    assume().that(intraline).isTrue();
+
+    addModifiedPatchSet(
+        changeId, FILE_NAME, fileContent -> fileContent.replace("Line 100\n", "Line one hundred"));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(initialPatchSetId).get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo)
+        .content()
+        .element(1)
+        .intralineEditsOfA()
+        .containsExactly(ImmutableList.of(5, 4));
+    assertThat(diffInfo)
+        .content()
+        .element(1)
+        .intralineEditsOfB()
+        .containsExactly(ImmutableList.of(5, 11));
+  }
+
+  @Test
+  public void hunkForModifiedSecondToLastLineIsNotCombinedWithHunkForDeletedNewlineAtEnd()
+      throws Exception {
+    addModifiedPatchSet(
+        changeId,
+        FILE_NAME,
+        fileContent ->
+            fileContent
+                .replace("Line 99\n", "Line ninety-nine\n")
+                .replace("Line 100\n", "Line 100"));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(initialPatchSetId).get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 99");
+    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line ninety-nine");
+    assertThat(diffInfo).content().element(2).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(3).linesOfA().containsExactly("");
+    assertThat(diffInfo).content().element(3).linesOfB().isNull();
+  }
+
+  @Test
+  public void addedUnrelatedFileIsIgnored_ForPatchSetDiffWithRebase() throws Exception {
+    ObjectId commit2 = addCommit(commit1, "file_added_in_another_commit.txt", "Some file content");
+
+    rebaseChangeOn(changeId, commit2);
+    addModifiedPatchSet(changeId, FILE_NAME, "Another line\n"::concat);
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(initialPatchSetId);
+    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG, FILE_NAME);
+  }
+
+  @Test
+  public void removedUnrelatedFileIsIgnored_ForPatchSetDiffWithRebase() throws Exception {
+    ObjectId commit2 = addCommitRemovingFiles(commit1, FILE_NAME2);
+
+    rebaseChangeOn(changeId, commit2);
+    addModifiedPatchSet(changeId, FILE_NAME, "Another line\n"::concat);
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(initialPatchSetId);
+    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG, FILE_NAME);
+  }
+
+  @Test
+  public void renamedUnrelatedFileIsIgnored_ForPatchSetDiffWithRebase() throws Exception {
+    ObjectId commit2 = addCommitRenamingFile(commit1, FILE_NAME2, "a_new_file_name.txt");
+
+    rebaseChangeOn(changeId, commit2);
+    addModifiedPatchSet(changeId, FILE_NAME, "Another line\n"::concat);
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(initialPatchSetId);
+    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG, FILE_NAME);
+  }
+
+  @Test
+  public void renamedUnrelatedFileIsIgnored_ForPatchSetDiffWithRebase_WhenEquallyModifiedInBoth()
+      throws Exception {
+    Function<String, String> contentModification =
+        fileContent -> fileContent.replace("1st line\n", "First line\n");
+    addModifiedPatchSet(changeId, FILE_NAME2, contentModification);
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+
+    // Revert the modification to be able to rebase.
+    addModifiedPatchSet(
+        changeId, FILE_NAME2, fileContent -> fileContent.replace("First line\n", "1st line\n"));
+
+    String renamedFileName = "renamed_file.txt";
+    ObjectId commit2 = addCommitRenamingFile(commit1, FILE_NAME2, renamedFileName);
+    rebaseChangeOn(changeId, commit2);
+    addModifiedPatchSet(changeId, renamedFileName, contentModification);
+    addModifiedPatchSet(changeId, FILE_NAME, "Another line\n"::concat);
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(previousPatchSetId);
+    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG, FILE_NAME);
+  }
+
+  @Test
+  public void renamedUnrelatedFileIsIgnored_ForPatchSetDiffWithRebase_WhenModifiedDuringRebase()
+      throws Exception {
+    String renamedFilePath = "renamed_some_file.txt";
+    ObjectId commit2 =
+        addCommit(commit1, FILE_NAME, FILE_CONTENT.replace("Line 5\n", "Line five\n"));
+    ObjectId commit3 = addCommitRenamingFile(commit2, FILE_NAME, renamedFilePath);
+
+    rebaseChangeOn(changeId, commit3);
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(initialPatchSetId);
+    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG);
+  }
+
+  @Test
+  public void fileRenamedDuringRebaseSameAsInPatchSetIsIgnored() throws Exception {
+    String renamedFileName = "renamed_file.txt";
+    gApi.changes().id(changeId).edit().renameFile(FILE_NAME, renamedFileName);
+    gApi.changes().id(changeId).edit().publish();
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+
+    // Revert the renaming to be able to rebase.
+    gApi.changes().id(changeId).edit().renameFile(renamedFileName, FILE_NAME);
+    gApi.changes().id(changeId).edit().publish();
+
+    ObjectId commit2 = addCommitRenamingFile(commit1, FILE_NAME, renamedFileName);
+    rebaseChangeOn(changeId, commit2);
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(previousPatchSetId);
+    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG);
+  }
+
+  @Test
+  public void fileWithRebaseHunksRenamedDuringRebaseSameAsInPatchSetIsIgnored() throws Exception {
+    String renamedFileName = "renamed_file.txt";
+    gApi.changes().id(changeId).edit().renameFile(FILE_NAME, renamedFileName);
+    gApi.changes().id(changeId).edit().publish();
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+
+    // Revert the renaming to be able to rebase.
+    gApi.changes().id(changeId).edit().renameFile(renamedFileName, FILE_NAME);
+    gApi.changes().id(changeId).edit().publish();
+
+    ObjectId commit2 =
+        addCommit(commit1, FILE_NAME, FILE_CONTENT.replace("Line 10\n", "Line ten\n"));
+    ObjectId commit3 = addCommitRenamingFile(commit2, FILE_NAME, renamedFileName);
+    rebaseChangeOn(changeId, commit3);
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(previousPatchSetId);
+    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG);
+  }
+
+  @Test
+  public void filesNotTouchedByPatchSetsAndContainingOnlyRebaseHunksAreIgnored() throws Exception {
+    String newFileContent = FILE_CONTENT.replace("Line 10\n", "Line ten\n");
+    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
+    ObjectId commit3 = addCommitRenamingFile(commit2, FILE_NAME2, "a_new_file_name.txt");
+
+    rebaseChangeOn(changeId, commit3);
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(initialPatchSetId);
+    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG);
+  }
+
+  @Test
+  public void filesTouchedByPatchSetsAndContainingOnlyRebaseHunksAreIgnored() throws Exception {
+    addModifiedPatchSet(
+        changeId, FILE_NAME, fileContent -> fileContent.replace("Line 50\n", "Line fifty\n"));
+    addModifiedPatchSet(
+        changeId, FILE_NAME2, fileContent -> fileContent.replace("1st line\n", "First line\n"));
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    // Revert the modification to allow rebasing.
+    addModifiedPatchSet(
+        changeId, FILE_NAME2, fileContent -> fileContent.replace("First line\n", "1st line\n"));
+
+    String newFileContent = FILE_CONTENT.replace("Line 10\n", "Line ten\n");
+    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
+    String newFilePath = "a_new_file_name.txt";
+    ObjectId commit3 = addCommitRenamingFile(commit2, FILE_NAME2, newFilePath);
+
+    rebaseChangeOn(changeId, commit3);
+    // Apply the modification again to bring the file into the same state as for the previous
+    // patch set.
+    addModifiedPatchSet(
+        changeId, newFilePath, fileContent -> fileContent.replace("1st line\n", "First line\n"));
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(previousPatchSetId);
+    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG);
+  }
+
+  @Test
+  public void singleHunkAtBeginningIsFollowedByCorrectCommonLines() throws Exception {
+    String filePath = "a_new_file.txt";
+    String fileContent = "Line 1\nLine 2\nLine 3\nLine 4\nLine 5\n";
+    gApi.changes().id(changeId).edit().modifyFile(filePath, RawInputUtil.create(fileContent));
+    gApi.changes().id(changeId).edit().publish();
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    addModifiedPatchSet(changeId, filePath, content -> content.replace("Line 1\n", "Line one\n"));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, filePath).withBase(previousPatchSetId).get();
+    assertThat(diffInfo).content().element(0).linesOfA().isNotEmpty();
+    assertThat(diffInfo).content().element(0).linesOfB().isNotEmpty();
+    assertThat(diffInfo)
+        .content()
+        .element(1)
+        .commonLines()
+        .containsExactly("Line 2", "Line 3", "Line 4", "Line 5", "")
+        .inOrder();
+  }
+
+  @Test
+  public void singleHunkAtEndIsPrecededByCorrectCommonLines() throws Exception {
+    String filePath = "a_new_file.txt";
+    String fileContent = "Line 1\nLine 2\nLine 3\nLine 4\nLine 5\n";
+    gApi.changes().id(changeId).edit().modifyFile(filePath, RawInputUtil.create(fileContent));
+    gApi.changes().id(changeId).edit().publish();
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    addModifiedPatchSet(changeId, filePath, content -> content.replace("Line 5\n", "Line five\n"));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, filePath).withBase(previousPatchSetId).get();
+    assertThat(diffInfo)
+        .content()
+        .element(0)
+        .commonLines()
+        .containsExactly("Line 1", "Line 2", "Line 3", "Line 4")
+        .inOrder();
+    assertThat(diffInfo).content().element(1).linesOfA().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfB().isNotEmpty();
+  }
+
+  @Test
+  public void singleHunkInTheMiddleIsSurroundedByCorrectCommonLines() throws Exception {
+    String filePath = "a_new_file.txt";
+    String fileContent = "Line 1\nLine 2\nLine 3\nLine 4\nLine 5\nLine 6\n";
+    gApi.changes().id(changeId).edit().modifyFile(filePath, RawInputUtil.create(fileContent));
+    gApi.changes().id(changeId).edit().publish();
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    addModifiedPatchSet(changeId, filePath, content -> content.replace("Line 3\n", "Line three\n"));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, filePath).withBase(previousPatchSetId).get();
+    assertThat(diffInfo)
+        .content()
+        .element(0)
+        .commonLines()
+        .containsExactly("Line 1", "Line 2")
+        .inOrder();
+    assertThat(diffInfo).content().element(1).linesOfA().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfB().isNotEmpty();
+    assertThat(diffInfo)
+        .content()
+        .element(2)
+        .commonLines()
+        .containsExactly("Line 4", "Line 5", "Line 6", "")
+        .inOrder();
+  }
+
+  @Test
+  public void twoHunksAreSeparatedByCorrectCommonLines() throws Exception {
+    String filePath = "a_new_file.txt";
+    String fileContent = "Line 1\nLine 2\nLine 3\nLine 4\nLine 5\n";
+    gApi.changes().id(changeId).edit().modifyFile(filePath, RawInputUtil.create(fileContent));
+    gApi.changes().id(changeId).edit().publish();
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    addModifiedPatchSet(
+        changeId,
+        filePath,
+        content -> content.replace("Line 2\n", "Line two\n").replace("Line 5\n", "Line five\n"));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, filePath).withBase(previousPatchSetId).get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfB().isNotEmpty();
+    assertThat(diffInfo)
+        .content()
+        .element(2)
+        .commonLines()
+        .containsExactly("Line 3", "Line 4")
+        .inOrder();
+    assertThat(diffInfo).content().element(3).linesOfA().isNotEmpty();
+    assertThat(diffInfo).content().element(3).linesOfB().isNotEmpty();
+  }
+
+  @Test
+  public void rebaseHunksAtStartOfFileAreIdentified() throws Exception {
+    String newFileContent =
+        FILE_CONTENT.replace("Line 1\n", "Line one\n").replace("Line 5\n", "Line five\n");
+    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
+
+    rebaseChangeOn(changeId, commit2);
+    Function<String, String> contentModification =
+        fileContent -> fileContent.replace("Line 50\n", "Line fifty\n");
+    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(initialPatchSetId).get();
+    assertThat(diffInfo).content().element(0).linesOfA().containsExactly("Line 1");
+    assertThat(diffInfo).content().element(0).linesOfB().containsExactly("Line one");
+    assertThat(diffInfo).content().element(0).isDueToRebase();
+    assertThat(diffInfo).content().element(1).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(2).linesOfA().containsExactly("Line 5");
+    assertThat(diffInfo).content().element(2).linesOfB().containsExactly("Line five");
+    assertThat(diffInfo).content().element(2).isDueToRebase();
+    assertThat(diffInfo).content().element(3).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(4).linesOfA().containsExactly("Line 50");
+    assertThat(diffInfo).content().element(4).linesOfB().containsExactly("Line fifty");
+    assertThat(diffInfo).content().element(4).isNotDueToRebase();
+    assertThat(diffInfo).content().element(5).commonLines().isNotEmpty();
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(initialPatchSetId);
+    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(1);
+    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(1);
+  }
+
+  @Test
+  public void rebaseHunksAtEndOfFileAreIdentified() throws Exception {
+    String newFileContent =
+        FILE_CONTENT
+            .replace("Line 60\n", "Line sixty\n")
+            .replace("Line 100\n", "Line one hundred\n");
+    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
+
+    rebaseChangeOn(changeId, commit2);
+    Function<String, String> contentModification =
+        fileContent -> fileContent.replace("Line 50\n", "Line fifty\n");
+    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(initialPatchSetId).get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 50");
+    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line fifty");
+    assertThat(diffInfo).content().element(1).isNotDueToRebase();
+    assertThat(diffInfo).content().element(2).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(3).linesOfA().containsExactly("Line 60");
+    assertThat(diffInfo).content().element(3).linesOfB().containsExactly("Line sixty");
+    assertThat(diffInfo).content().element(3).isDueToRebase();
+    assertThat(diffInfo).content().element(4).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(5).linesOfA().containsExactly("Line 100");
+    assertThat(diffInfo).content().element(5).linesOfB().containsExactly("Line one hundred");
+    assertThat(diffInfo).content().element(5).isDueToRebase();
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(initialPatchSetId);
+    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(1);
+    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(1);
+  }
+
+  @Test
+  public void rebaseHunksInBetweenRegularHunksAreIdentified() throws Exception {
+    String newFileContent =
+        FILE_CONTENT.replace("Line 40\n", "Line forty\n").replace("Line 45\n", "Line forty five\n");
+    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
+
+    rebaseChangeOn(changeId, commit2);
+    Function<String, String> contentModification =
+        fileContent ->
+            fileContent
+                .replace("Line 1\n", "Line one\n")
+                .replace("Line 100\n", "Line one hundred\n");
+    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(initialPatchSetId).get();
+    assertThat(diffInfo).content().element(0).linesOfA().containsExactly("Line 1");
+    assertThat(diffInfo).content().element(0).linesOfB().containsExactly("Line one");
+    assertThat(diffInfo).content().element(0).isNotDueToRebase();
+    assertThat(diffInfo).content().element(1).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(2).linesOfA().containsExactly("Line 40");
+    assertThat(diffInfo).content().element(2).linesOfB().containsExactly("Line forty");
+    assertThat(diffInfo).content().element(2).isDueToRebase();
+    assertThat(diffInfo).content().element(3).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(4).linesOfA().containsExactly("Line 45");
+    assertThat(diffInfo).content().element(4).linesOfB().containsExactly("Line forty five");
+    assertThat(diffInfo).content().element(4).isDueToRebase();
+    assertThat(diffInfo).content().element(5).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(6).linesOfA().containsExactly("Line 100");
+    assertThat(diffInfo).content().element(6).linesOfB().containsExactly("Line one hundred");
+    assertThat(diffInfo).content().element(6).isNotDueToRebase();
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(initialPatchSetId);
+    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(2);
+    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(2);
+  }
+
+  @Test
+  public void rebaseHunkIsIdentifiedWhenMovedDownInPreviousPatchSet() throws Exception {
+    // Move the code down by introducing additional lines (pure insert + enlarging replacement) in
+    // the previous patch set.
+    Function<String, String> contentModification1 =
+        fileContent ->
+            "Line zero\n" + fileContent.replace("Line 10\n", "Line ten\nLine ten and a half\n");
+    addModifiedPatchSet(changeId, FILE_NAME, contentModification1);
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+
+    String newFileContent = FILE_CONTENT.replace("Line 40\n", "Line forty\n");
+    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
+
+    rebaseChangeOn(changeId, commit2);
+    Function<String, String> contentModification2 =
+        fileContent -> fileContent.replace("Line 100\n", "Line one hundred\n");
+    addModifiedPatchSet(changeId, FILE_NAME, contentModification2);
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(previousPatchSetId).get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 40");
+    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line forty");
+    assertThat(diffInfo).content().element(1).isDueToRebase();
+    assertThat(diffInfo).content().element(2).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(3).linesOfA().containsExactly("Line 100");
+    assertThat(diffInfo).content().element(3).linesOfB().containsExactly("Line one hundred");
+    assertThat(diffInfo).content().element(3).isNotDueToRebase();
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(previousPatchSetId);
+    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(1);
+    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(1);
+  }
+
+  @Test
+  public void rebaseHunkIsIdentifiedWhenMovedDownInLatestPatchSet() throws Exception {
+    String newFileContent = FILE_CONTENT.replace("Line 40\n", "Line forty\n");
+    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
+
+    rebaseChangeOn(changeId, commit2);
+    // Move the code down by introducing additional lines (pure insert + enlarging replacement) in
+    // the latest patch set.
+    Function<String, String> contentModification =
+        fileContent ->
+            "Line zero\n" + fileContent.replace("Line 10\n", "Line ten\nLine ten and a half\n");
+    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(initialPatchSetId).get();
+    assertThat(diffInfo).content().element(0).linesOfA().isNull();
+    assertThat(diffInfo).content().element(0).linesOfB().containsExactly("Line zero");
+    assertThat(diffInfo).content().element(0).isNotDueToRebase();
+    assertThat(diffInfo).content().element(1).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(2).linesOfA().containsExactly("Line 10");
+    assertThat(diffInfo)
+        .content()
+        .element(2)
+        .linesOfB()
+        .containsExactly("Line ten", "Line ten and a half");
+    assertThat(diffInfo).content().element(2).isNotDueToRebase();
+    assertThat(diffInfo).content().element(3).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(4).linesOfA().containsExactly("Line 40");
+    assertThat(diffInfo).content().element(4).linesOfB().containsExactly("Line forty");
+    assertThat(diffInfo).content().element(4).isDueToRebase();
+    assertThat(diffInfo).content().element(5).commonLines().isNotEmpty();
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(initialPatchSetId);
+    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(3);
+    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(1);
+  }
+
+  @Test
+  public void rebaseHunkIsIdentifiedWhenMovedUpInPreviousPatchSet() throws Exception {
+    // Move the code up by removing lines (pure deletion + shrinking replacement) in the previous
+    // patch set.
+    Function<String, String> contentModification1 =
+        fileContent ->
+            fileContent.replace("Line 1\n", "").replace("Line 10\nLine 11\n", "Line ten\n");
+    addModifiedPatchSet(changeId, FILE_NAME, contentModification1);
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+
+    String newFileContent = FILE_CONTENT.replace("Line 40\n", "Line forty\n");
+    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
+
+    rebaseChangeOn(changeId, commit2);
+    Function<String, String> contentModification2 =
+        fileContent -> fileContent.replace("Line 100\n", "Line one hundred\n");
+    addModifiedPatchSet(changeId, FILE_NAME, contentModification2);
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(previousPatchSetId).get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 40");
+    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line forty");
+    assertThat(diffInfo).content().element(1).isDueToRebase();
+    assertThat(diffInfo).content().element(2).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(3).linesOfA().containsExactly("Line 100");
+    assertThat(diffInfo).content().element(3).linesOfB().containsExactly("Line one hundred");
+    assertThat(diffInfo).content().element(3).isNotDueToRebase();
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(previousPatchSetId);
+    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(1);
+    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(1);
+  }
+
+  @Test
+  public void rebaseHunkIsIdentifiedWhenMovedUpInLatestPatchSet() throws Exception {
+    String newFileContent = FILE_CONTENT.replace("Line 40\n", "Line forty\n");
+    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
+
+    rebaseChangeOn(changeId, commit2);
+    // Move the code up by removing lines (pure deletion + shrinking replacement) in the latest
+    // patch set.
+    Function<String, String> contentModification =
+        fileContent ->
+            fileContent.replace("Line 1\n", "").replace("Line 10\nLine 11\n", "Line ten\n");
+    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(initialPatchSetId).get();
+    assertThat(diffInfo).content().element(0).linesOfA().containsExactly("Line 1");
+    assertThat(diffInfo).content().element(0).linesOfB().isNull();
+    assertThat(diffInfo).content().element(0).isNotDueToRebase();
+    assertThat(diffInfo).content().element(1).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(2).linesOfA().containsExactly("Line 10", "Line 11");
+    assertThat(diffInfo).content().element(2).linesOfB().containsExactly("Line ten");
+    assertThat(diffInfo).content().element(2).isNotDueToRebase();
+    assertThat(diffInfo).content().element(3).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(4).linesOfA().containsExactly("Line 40");
+    assertThat(diffInfo).content().element(4).linesOfB().containsExactly("Line forty");
+    assertThat(diffInfo).content().element(4).isDueToRebase();
+    assertThat(diffInfo).content().element(5).commonLines().isNotEmpty();
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(initialPatchSetId);
+    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(1);
+    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(3);
+  }
+
+  @Test
+  public void modifiedRebaseHunkWithSameRegionConsideredAsRegularHunk() throws Exception {
+    String newFileContent = FILE_CONTENT.replace("Line 40\n", "Line forty\n");
+    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
+
+    rebaseChangeOn(changeId, commit2);
+    Function<String, String> contentModification =
+        fileContent -> fileContent.replace("Line forty\n", "Line modified after rebase\n");
+    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(initialPatchSetId).get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 40");
+    assertThat(diffInfo)
+        .content()
+        .element(1)
+        .linesOfB()
+        .containsExactly("Line modified after rebase");
+    assertThat(diffInfo).content().element(1).isNotDueToRebase();
+    assertThat(diffInfo).content().element(2).commonLines().isNotEmpty();
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(initialPatchSetId);
+    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(1);
+    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(1);
+  }
+
+  @Test
+  public void rebaseHunkOverlappingAtBeginningConsideredAsRegularHunk() throws Exception {
+    String newFileContent =
+        FILE_CONTENT.replace("Line 40\nLine 41\n", "Line forty\nLine forty one\n");
+    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
+
+    rebaseChangeOn(changeId, commit2);
+    Function<String, String> contentModification =
+        fileContent ->
+            fileContent
+                .replace("Line 39\n", "Line thirty nine\n")
+                .replace("Line forty one\n", "Line 41\n");
+    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(initialPatchSetId).get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 39", "Line 40");
+    assertThat(diffInfo)
+        .content()
+        .element(1)
+        .linesOfB()
+        .containsExactly("Line thirty nine", "Line forty");
+    assertThat(diffInfo).content().element(1).isNotDueToRebase();
+    assertThat(diffInfo).content().element(2).commonLines().isNotEmpty();
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(initialPatchSetId);
+    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(2);
+    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(2);
+  }
+
+  @Test
+  public void rebaseHunkOverlappingAtEndConsideredAsRegularHunk() throws Exception {
+    String newFileContent =
+        FILE_CONTENT.replace("Line 40\nLine 41\n", "Line forty\nLine forty one\n");
+    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
+
+    rebaseChangeOn(changeId, commit2);
+    Function<String, String> contentModification =
+        fileContent ->
+            fileContent
+                .replace("Line forty\n", "Line 40\n")
+                .replace("Line 42\n", "Line forty two\n");
+    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(initialPatchSetId).get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 41", "Line 42");
+    assertThat(diffInfo)
+        .content()
+        .element(1)
+        .linesOfB()
+        .containsExactly("Line forty one", "Line forty two");
+    assertThat(diffInfo).content().element(1).isNotDueToRebase();
+    assertThat(diffInfo).content().element(2).commonLines().isNotEmpty();
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(initialPatchSetId);
+    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(2);
+    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(2);
+  }
+
+  @Test
+  public void rebaseHunkModifiedInsideConsideredAsRegularHunk() throws Exception {
+    String newFileContent =
+        FILE_CONTENT.replace(
+            "Line 39\nLine 40\nLine 41\n", "Line thirty nine\nLine forty\nLine forty one\n");
+    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
+
+    rebaseChangeOn(changeId, commit2);
+    Function<String, String> contentModification =
+        fileContent -> fileContent.replace("Line forty\n", "A different line forty\n");
+    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(initialPatchSetId).get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo)
+        .content()
+        .element(1)
+        .linesOfA()
+        .containsExactly("Line 39", "Line 40", "Line 41");
+    assertThat(diffInfo)
+        .content()
+        .element(1)
+        .linesOfB()
+        .containsExactly("Line thirty nine", "A different line forty", "Line forty one");
+    assertThat(diffInfo).content().element(1).isNotDueToRebase();
+    assertThat(diffInfo).content().element(2).commonLines().isNotEmpty();
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(initialPatchSetId);
+    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(3);
+    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(3);
+  }
+
+  @Test
+  public void rebaseHunkAfterLineNumberChangingOverlappingHunksIsIdentified() throws Exception {
+    String newFileContent =
+        FILE_CONTENT
+            .replace("Line 40\nLine 41\n", "Line forty\nLine forty one\n")
+            .replace("Line 60\n", "Line sixty\n");
+    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
+
+    rebaseChangeOn(changeId, commit2);
+    Function<String, String> contentModification =
+        fileContent ->
+            fileContent
+                .replace("Line forty\n", "Line 40\n")
+                .replace("Line 42\n", "Line forty two\nLine forty two and a half\n");
+    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(initialPatchSetId).get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 41", "Line 42");
+    assertThat(diffInfo)
+        .content()
+        .element(1)
+        .linesOfB()
+        .containsExactly("Line forty one", "Line forty two", "Line forty two and a half");
+    assertThat(diffInfo).content().element(1).isNotDueToRebase();
+    assertThat(diffInfo).content().element(2).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(3).linesOfA().containsExactly("Line 60");
+    assertThat(diffInfo).content().element(3).linesOfB().containsExactly("Line sixty");
+    assertThat(diffInfo).content().element(3).isDueToRebase();
+    assertThat(diffInfo).content().element(4).commonLines().isNotEmpty();
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(initialPatchSetId);
+    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(3);
+    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(2);
+  }
+
+  @Test
+  public void rebaseHunksOneLineApartFromRegularHunkAreIdentified() throws Exception {
+    String newFileContent =
+        FILE_CONTENT.replace("Line 1\n", "Line one\n").replace("Line 5\n", "Line five\n");
+    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
+
+    rebaseChangeOn(changeId, commit2);
+    Function<String, String> contentModification =
+        fileContent -> fileContent.replace("Line 3\n", "Line three\n");
+    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(initialPatchSetId).get();
+    assertThat(diffInfo).content().element(0).linesOfA().containsExactly("Line 1");
+    assertThat(diffInfo).content().element(0).linesOfB().containsExactly("Line one");
+    assertThat(diffInfo).content().element(0).isDueToRebase();
+    assertThat(diffInfo).content().element(1).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(2).linesOfA().containsExactly("Line 3");
+    assertThat(diffInfo).content().element(2).linesOfB().containsExactly("Line three");
+    assertThat(diffInfo).content().element(2).isNotDueToRebase();
+    assertThat(diffInfo).content().element(3).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(4).linesOfA().containsExactly("Line 5");
+    assertThat(diffInfo).content().element(4).linesOfB().containsExactly("Line five");
+    assertThat(diffInfo).content().element(4).isDueToRebase();
+    assertThat(diffInfo).content().element(5).commonLines().isNotEmpty();
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(initialPatchSetId);
+    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(1);
+    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(1);
+  }
+
+  @Test
+  public void rebaseHunksDirectlyTouchingHunksOfPatchSetsNotModifiedBetweenThemAreIdentified()
+      throws Exception {
+    // Add to hunks in a patch set and remove them in a further patch set to allow rebasing.
+    Function<String, String> contentModification =
+        fileContent ->
+            fileContent.replace("Line 1\n", "Line one\n").replace("Line 3\n", "Line three\n");
+    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    Function<String, String> reverseContentModification =
+        fileContent ->
+            fileContent.replace("Line one\n", "Line 1\n").replace("Line three\n", "Line 3\n");
+    addModifiedPatchSet(changeId, FILE_NAME, reverseContentModification);
+
+    String newFileContent = FILE_CONTENT.replace("Line 2\n", "Line two\n");
+    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
+    rebaseChangeOn(changeId, commit2);
+
+    // Add the hunks again and modify another line so that we get a diff for the file.
+    // (Files with only edits due to rebase are filtered out.)
+    addModifiedPatchSet(
+        changeId,
+        FILE_NAME,
+        contentModification.andThen(fileContent -> fileContent.replace("Line 10\n", "Line ten\n")));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(previousPatchSetId).get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 2");
+    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line two");
+    assertThat(diffInfo).content().element(1).isDueToRebase();
+    assertThat(diffInfo).content().element(2).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(3).linesOfA().containsExactly("Line 10");
+    assertThat(diffInfo).content().element(3).linesOfB().containsExactly("Line ten");
+    assertThat(diffInfo).content().element(3).isNotDueToRebase();
+    assertThat(diffInfo).content().element(4).commonLines().isNotEmpty();
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(previousPatchSetId);
+    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(1);
+    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(1);
+  }
+
+  @Test
+  public void multipleRebaseEditsMixedWithRegularEditsCanBeIdentified() throws Exception {
+    addModifiedPatchSet(
+        changeId,
+        FILE_NAME,
+        fileContent -> fileContent.replace("Line 7\n", "Line seven\n").replace("Line 24\n", ""));
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+
+    ObjectId commit2 =
+        addCommit(
+            commit1,
+            FILE_NAME,
+            FILE_CONTENT
+                .replace("Line 2\n", "Line two\n")
+                .replace("Line 18\nLine 19\n", "Line eighteen\nLine nineteen\n")
+                .replace("Line 50\n", "Line fifty\n"));
+
+    rebaseChangeOn(changeId, commit2);
+    addModifiedPatchSet(
+        changeId,
+        FILE_NAME,
+        fileContent ->
+            fileContent
+                .replace("Line seven\n", "Line 7\n")
+                .replace("Line 9\n", "Line nine\n")
+                .replace("Line 60\n", "Line sixty\n"));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(previousPatchSetId).get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 2");
+    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line two");
+    assertThat(diffInfo).content().element(1).isDueToRebase();
+    assertThat(diffInfo).content().element(2).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(3).linesOfA().containsExactly("Line seven");
+    assertThat(diffInfo).content().element(3).linesOfB().containsExactly("Line 7");
+    assertThat(diffInfo).content().element(3).isNotDueToRebase();
+    assertThat(diffInfo).content().element(4).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(5).linesOfA().containsExactly("Line 9");
+    assertThat(diffInfo).content().element(5).linesOfB().containsExactly("Line nine");
+    assertThat(diffInfo).content().element(5).isNotDueToRebase();
+    assertThat(diffInfo).content().element(6).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(7).linesOfA().containsExactly("Line 18", "Line 19");
+    assertThat(diffInfo)
+        .content()
+        .element(7)
+        .linesOfB()
+        .containsExactly("Line eighteen", "Line nineteen");
+    assertThat(diffInfo).content().element(7).isDueToRebase();
+    assertThat(diffInfo).content().element(8).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(9).linesOfA().containsExactly("Line 50");
+    assertThat(diffInfo).content().element(9).linesOfB().containsExactly("Line fifty");
+    assertThat(diffInfo).content().element(9).isDueToRebase();
+    assertThat(diffInfo).content().element(10).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(11).linesOfA().containsExactly("Line 60");
+    assertThat(diffInfo).content().element(11).linesOfB().containsExactly("Line sixty");
+    assertThat(diffInfo).content().element(11).isNotDueToRebase();
+    assertThat(diffInfo).content().element(12).commonLines().isNotEmpty();
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(previousPatchSetId);
+    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(3);
+    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(3);
+  }
+
+  @Test
+  public void deletedFileDuringRebaseConsideredAsRegularHunkWhenModifiedInDiff() throws Exception {
+    // Modify the file and revert the modifications to allow rebasing.
+    addModifiedPatchSet(
+        changeId, FILE_NAME, fileContent -> fileContent.replace("Line 50\n", "Line fifty\n"));
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    addModifiedPatchSet(
+        changeId, FILE_NAME, fileContent -> fileContent.replace("Line fifty\n", "Line 50\n"));
+
+    ObjectId commit2 = addCommitRemovingFiles(commit1, FILE_NAME);
+
+    rebaseChangeOn(changeId, commit2);
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(previousPatchSetId).get();
+    assertThat(diffInfo).changeType().isEqualTo(ChangeType.DELETED);
+    assertThat(diffInfo).content().element(0).linesOfA().hasSize(101);
+    assertThat(diffInfo).content().element(0).linesOfB().isNull();
+    assertThat(diffInfo).content().element(0).isNotDueToRebase();
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(previousPatchSetId);
+    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isNull();
+    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(100);
+  }
+
+  @Test
+  public void addedFileDuringRebaseConsideredAsRegularHunkWhenModifiedInDiff() throws Exception {
+    String newFilePath = "a_new_file.txt";
+    ObjectId commit2 = addCommit(commit1, newFilePath, "1st line\n2nd line\n3rd line\n");
+
+    rebaseChangeOn(changeId, commit2);
+    addModifiedPatchSet(
+        changeId, newFilePath, fileContent -> fileContent.replace("1st line\n", "First line\n"));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, newFilePath).withBase(initialPatchSetId).get();
+    assertThat(diffInfo).changeType().isEqualTo(ChangeType.ADDED);
+    assertThat(diffInfo).content().element(0).linesOfA().isNull();
+    assertThat(diffInfo).content().element(0).linesOfB().hasSize(4);
+    assertThat(diffInfo).content().element(0).isNotDueToRebase();
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(initialPatchSetId);
+    assertThat(changedFiles.get(newFilePath)).linesInserted().isEqualTo(3);
+    assertThat(changedFiles.get(newFilePath)).linesDeleted().isNull();
+  }
+
+  @Test
+  public void rebaseHunkInRenamedFileIsIdentified_WhenFileIsRenamedDuringRebase() throws Exception {
+    String renamedFilePath = "renamed_some_file.txt";
+    ObjectId commit2 =
+        addCommit(commit1, FILE_NAME, FILE_CONTENT.replace("Line 1\n", "Line one\n"));
+    ObjectId commit3 = addCommitRenamingFile(commit2, FILE_NAME, renamedFilePath);
+
+    rebaseChangeOn(changeId, commit3);
+    Function<String, String> contentModification =
+        fileContent -> fileContent.replace("Line 50\n", "Line fifty\n");
+    addModifiedPatchSet(changeId, renamedFilePath, contentModification);
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, renamedFilePath).withBase(initialPatchSetId).get();
+    assertThat(diffInfo).content().element(0).linesOfA().containsExactly("Line 1");
+    assertThat(diffInfo).content().element(0).linesOfB().containsExactly("Line one");
+    assertThat(diffInfo).content().element(0).isDueToRebase();
+    assertThat(diffInfo).content().element(1).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(2).linesOfA().containsExactly("Line 50");
+    assertThat(diffInfo).content().element(2).linesOfB().containsExactly("Line fifty");
+    assertThat(diffInfo).content().element(2).isNotDueToRebase();
+    assertThat(diffInfo).content().element(3).commonLines().isNotEmpty();
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(initialPatchSetId);
+    assertThat(changedFiles.get(renamedFilePath)).linesInserted().isEqualTo(1);
+    assertThat(changedFiles.get(renamedFilePath)).linesDeleted().isEqualTo(1);
+  }
+
+  @Test
+  public void rebaseHunkInRenamedFileIsIdentified_WhenFileIsRenamedInPatchSets() throws Exception {
+    String renamedFilePath = "renamed_some_file.txt";
+    gApi.changes().id(changeId).edit().renameFile(FILE_NAME, renamedFilePath);
+    gApi.changes().id(changeId).edit().publish();
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+
+    // Revert the renaming to be able to rebase.
+    gApi.changes().id(changeId).edit().renameFile(renamedFilePath, FILE_NAME);
+    gApi.changes().id(changeId).edit().publish();
+
+    ObjectId commit2 =
+        addCommit(commit1, FILE_NAME, FILE_CONTENT.replace("Line 5\n", "Line five\n"));
+
+    rebaseChangeOn(changeId, commit2);
+    gApi.changes().id(changeId).edit().renameFile(FILE_NAME, renamedFilePath);
+    gApi.changes().id(changeId).edit().publish();
+    Function<String, String> contentModification =
+        fileContent -> fileContent.replace("Line 50\n", "Line fifty\n");
+    addModifiedPatchSet(changeId, renamedFilePath, contentModification);
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, renamedFilePath).withBase(previousPatchSetId).get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 5");
+    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line five");
+    assertThat(diffInfo).content().element(1).isDueToRebase();
+    assertThat(diffInfo).content().element(2).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(3).linesOfA().containsExactly("Line 50");
+    assertThat(diffInfo).content().element(3).linesOfB().containsExactly("Line fifty");
+    assertThat(diffInfo).content().element(3).isNotDueToRebase();
+    assertThat(diffInfo).content().element(4).commonLines().isNotEmpty();
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(previousPatchSetId);
+    assertThat(changedFiles.get(renamedFilePath)).linesInserted().isEqualTo(1);
+    assertThat(changedFiles.get(renamedFilePath)).linesDeleted().isEqualTo(1);
+  }
+
+  @Test
+  public void renamedFileWithOnlyRebaseHunksIsIdentified_WhenRenamedBetweenPatchSets()
+      throws Exception {
+    String newFilePath1 = "renamed_some_file.txt";
+    gApi.changes().id(changeId).edit().renameFile(FILE_NAME, newFilePath1);
+    gApi.changes().id(changeId).edit().publish();
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+
+    // Revert the renaming to be able to rebase.
+    gApi.changes().id(changeId).edit().renameFile(newFilePath1, FILE_NAME);
+    gApi.changes().id(changeId).edit().publish();
+
+    ObjectId commit2 =
+        addCommit(commit1, FILE_NAME, FILE_CONTENT.replace("Line 5\n", "Line five\n"));
+
+    rebaseChangeOn(changeId, commit2);
+    String newFilePath2 = "renamed_some_file_to_something_else.txt";
+    gApi.changes().id(changeId).edit().renameFile(FILE_NAME, newFilePath2);
+    gApi.changes().id(changeId).edit().publish();
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(previousPatchSetId);
+    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG, newFilePath2);
+    assertThat(changedFiles.get(newFilePath2)).linesInserted().isNull();
+    assertThat(changedFiles.get(newFilePath2)).linesDeleted().isNull();
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, newFilePath2).withBase(previousPatchSetId).get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 5");
+    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line five");
+    assertThat(diffInfo).content().element(1).isDueToRebase();
+    assertThat(diffInfo).content().element(2).commonLines().isNotEmpty();
+  }
+
+  @Test
+  public void renamedFileWithOnlyRebaseHunksIsIdentified_WhenRenamedForRebaseAndForPatchSets()
+      throws Exception {
+    String newFilePath1 = "renamed_some_file.txt";
+    gApi.changes().id(changeId).edit().renameFile(FILE_NAME, newFilePath1);
+    gApi.changes().id(changeId).edit().publish();
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+
+    // Revert the renaming to be able to rebase.
+    gApi.changes().id(changeId).edit().renameFile(newFilePath1, FILE_NAME);
+    gApi.changes().id(changeId).edit().publish();
+
+    ObjectId commit2 =
+        addCommit(commit1, FILE_NAME, FILE_CONTENT.replace("Line 5\n", "Line five\n"));
+    String newFilePath2 = "renamed_some_file_during_rebase.txt";
+    ObjectId commit3 = addCommitRenamingFile(commit2, FILE_NAME, newFilePath2);
+
+    rebaseChangeOn(changeId, commit3);
+    String newFilePath3 = "renamed_some_file_to_something_else.txt";
+    gApi.changes().id(changeId).edit().renameFile(newFilePath2, newFilePath3);
+    gApi.changes().id(changeId).edit().publish();
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(previousPatchSetId);
+    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG, newFilePath3);
+    assertThat(changedFiles.get(newFilePath3)).linesInserted().isNull();
+    assertThat(changedFiles.get(newFilePath3)).linesDeleted().isNull();
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, newFilePath3).withBase(previousPatchSetId).get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 5");
+    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line five");
+    assertThat(diffInfo).content().element(1).isDueToRebase();
+    assertThat(diffInfo).content().element(2).commonLines().isNotEmpty();
+  }
+
+  @Test
+  public void copiedAndRenamedFilesWithOnlyRebaseHunksAreIdentified() throws Exception {
+    String newFileContent = FILE_CONTENT.replace("Line 5\n", "Line five\n");
+    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
+
+    rebaseChangeOn(changeId, commit2);
+    // Copies are only identified by JGit when paired with renaming.
+    String copyFileName = "copy_of_some_file.txt";
+    String renamedFileName = "renamed_some_file.txt";
+    gApi.changes()
+        .id(changeId)
+        .edit()
+        .modifyFile(copyFileName, RawInputUtil.create(newFileContent));
+    gApi.changes().id(changeId).edit().renameFile(FILE_NAME, renamedFileName);
+    gApi.changes().id(changeId).edit().publish();
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(initialPatchSetId);
+    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG, copyFileName, renamedFileName);
+
+    DiffInfo renamedFileDiffInfo =
+        getDiffRequest(changeId, CURRENT, renamedFileName).withBase(initialPatchSetId).get();
+    assertThat(renamedFileDiffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(renamedFileDiffInfo).content().element(1).linesOfA().containsExactly("Line 5");
+    assertThat(renamedFileDiffInfo).content().element(1).linesOfB().containsExactly("Line five");
+    assertThat(renamedFileDiffInfo).content().element(1).isDueToRebase();
+    assertThat(renamedFileDiffInfo).content().element(2).commonLines().isNotEmpty();
+
+    DiffInfo copiedFileDiffInfo =
+        getDiffRequest(changeId, CURRENT, copyFileName).withBase(initialPatchSetId).get();
+    assertThat(copiedFileDiffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(copiedFileDiffInfo).content().element(1).linesOfA().containsExactly("Line 5");
+    assertThat(copiedFileDiffInfo).content().element(1).linesOfB().containsExactly("Line five");
+    assertThat(copiedFileDiffInfo).content().element(1).isDueToRebase();
+    assertThat(copiedFileDiffInfo).content().element(2).commonLines().isNotEmpty();
+  }
+
+  /*
+   *                change PS B
+   *                   |
+   * change PS A    commit4
+   *    |              |
+   * commit2        commit3
+   *    |             /
+   * commit1 --------
+   */
+  @Test
+  public void rebaseHunksWhenRebasingOnAnotherChangeOrPatchSetAreIdentified() throws Exception {
+    ObjectId commit2 =
+        addCommit(commit1, FILE_NAME, FILE_CONTENT.replace("Line 5\n", "Line five\n"));
+    rebaseChangeOn(changeId, commit2);
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+
+    String commit3FileContent = FILE_CONTENT.replace("Line 35\n", "Line thirty five\n");
+    ObjectId commit3 = addCommit(commit1, FILE_NAME, commit3FileContent);
+    ObjectId commit4 =
+        addCommit(commit3, FILE_NAME, commit3FileContent.replace("Line 60\n", "Line sixty\n"));
+
+    rebaseChangeOn(changeId, commit4);
+    Function<String, String> contentModification =
+        fileContent -> fileContent.replace("Line 20\n", "Line twenty\n");
+    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(previousPatchSetId).get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line five");
+    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line 5");
+    assertThat(diffInfo).content().element(1).isDueToRebase();
+    assertThat(diffInfo).content().element(2).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(3).linesOfA().containsExactly("Line 20");
+    assertThat(diffInfo).content().element(3).linesOfB().containsExactly("Line twenty");
+    assertThat(diffInfo).content().element(3).isNotDueToRebase();
+    assertThat(diffInfo).content().element(4).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(5).linesOfA().containsExactly("Line 35");
+    assertThat(diffInfo).content().element(5).linesOfB().containsExactly("Line thirty five");
+    assertThat(diffInfo).content().element(5).isDueToRebase();
+    assertThat(diffInfo).content().element(6).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(7).linesOfA().containsExactly("Line 60");
+    assertThat(diffInfo).content().element(7).linesOfB().containsExactly("Line sixty");
+    assertThat(diffInfo).content().element(7).isDueToRebase();
+    assertThat(diffInfo).content().element(8).commonLines().isNotEmpty();
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(previousPatchSetId);
+    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(1);
+    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(1);
+  }
+
+  /*
+   *                change PS B
+   *                   |
+   * change PS A    commit4
+   *    |              |
+   * commit2        commit3
+   *    |             /
+   * commit1 --------
+   */
+  @Test
+  public void unrelatedFileWhenRebasingOnAnotherChangeOrPatchSetIsIgnored() throws Exception {
+    ObjectId commit2 =
+        addCommit(commit1, FILE_NAME, FILE_CONTENT.replace("Line 5\n", "Line five\n"));
+    rebaseChangeOn(changeId, commit2);
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+
+    ObjectId commit3 =
+        addCommit(commit1, FILE_NAME2, FILE_CONTENT2.replace("2nd line\n", "Second line\n"));
+    ObjectId commit4 =
+        addCommit(commit3, FILE_NAME, FILE_CONTENT.replace("Line 60\n", "Line sixty\n"));
+
+    rebaseChangeOn(changeId, commit4);
+    Function<String, String> contentModification =
+        fileContent -> fileContent.replace("Line 20\n", "Line twenty\n");
+    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(previousPatchSetId);
+    assertThat(changedFiles.keySet()).containsExactly(COMMIT_MSG, FILE_NAME);
+  }
+
+  @Test
+  public void rebaseHunksWhenReversingPatchSetOrderAreIdentified() throws Exception {
+    ObjectId commit2 =
+        addCommit(
+            commit1,
+            FILE_NAME,
+            FILE_CONTENT.replace("Line 5\n", "Line five\n").replace("Line 35\n", ""));
+
+    rebaseChangeOn(changeId, commit2);
+    Function<String, String> contentModification =
+        fileContent -> fileContent.replace("Line 20\n", "Line twenty\n");
+    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
+
+    String currentPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, initialPatchSetId, FILE_NAME).withBase(currentPatchSetId).get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line five");
+    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line 5");
+    assertThat(diffInfo).content().element(1).isDueToRebase();
+    assertThat(diffInfo).content().element(2).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(3).linesOfA().containsExactly("Line twenty");
+    assertThat(diffInfo).content().element(3).linesOfB().containsExactly("Line 20");
+    assertThat(diffInfo).content().element(3).isNotDueToRebase();
+    assertThat(diffInfo).content().element(4).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(5).linesOfA().isNull();
+    assertThat(diffInfo).content().element(5).linesOfB().containsExactly("Line 35");
+    assertThat(diffInfo).content().element(5).isDueToRebase();
+    assertThat(diffInfo).content().element(6).commonLines().isNotEmpty();
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).revision(initialPatchSetId).files(currentPatchSetId);
+    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(1);
+    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(1);
+  }
+
+  @Test
+  public void intralineEditsInNonRebaseHunksAreIdentified() throws Exception {
+    assume().that(intraline).isTrue();
+
+    Function<String, String> contentModification =
+        fileContent -> fileContent.replace("Line 1\n", "Line one\n");
+    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(initialPatchSetId).get();
+    assertThat(diffInfo).content().element(0).linesOfA().containsExactly("Line 1");
+    assertThat(diffInfo).content().element(0).linesOfB().containsExactly("Line one");
+    assertThat(diffInfo)
+        .content()
+        .element(0)
+        .intralineEditsOfA()
+        .containsExactly(ImmutableList.of(5, 1));
+    assertThat(diffInfo)
+        .content()
+        .element(0)
+        .intralineEditsOfB()
+        .containsExactly(ImmutableList.of(5, 3));
+    assertThat(diffInfo).content().element(0).isNotDueToRebase();
+    assertThat(diffInfo).content().element(1).commonLines().isNotEmpty();
+  }
+
+  @Test
+  public void intralineEditsInRebaseHunksAreIdentified() throws Exception {
+    assume().that(intraline).isTrue();
+
+    String newFileContent = FILE_CONTENT.replace("Line 1\n", "Line one\n");
+    ObjectId commit2 = addCommit(commit1, FILE_NAME, newFileContent);
+
+    rebaseChangeOn(changeId, commit2);
+    Function<String, String> contentModification =
+        fileContent -> fileContent.replace("Line 50\n", "Line fifty\n");
+    addModifiedPatchSet(changeId, FILE_NAME, contentModification);
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(initialPatchSetId).get();
+    assertThat(diffInfo).content().element(0).linesOfA().containsExactly("Line 1");
+    assertThat(diffInfo).content().element(0).linesOfB().containsExactly("Line one");
+    assertThat(diffInfo)
+        .content()
+        .element(0)
+        .intralineEditsOfA()
+        .containsExactly(ImmutableList.of(5, 1));
+    assertThat(diffInfo)
+        .content()
+        .element(0)
+        .intralineEditsOfB()
+        .containsExactly(ImmutableList.of(5, 3));
+    assertThat(diffInfo).content().element(0).isDueToRebase();
+    assertThat(diffInfo).content().element(1).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(2).linesOfA().containsExactly("Line 50");
+    assertThat(diffInfo).content().element(2).linesOfB().containsExactly("Line fifty");
+    assertThat(diffInfo).content().element(2).isNotDueToRebase();
+    assertThat(diffInfo).content().element(3).commonLines().isNotEmpty();
+  }
+
+  @Test
+  public void closeNonRebaseHunksAreCombinedForIntralineOptimizations() throws Exception {
+    assume().that(intraline).isTrue();
+
+    String fileContent = FILE_CONTENT.replace("Line 5\n", "{\n");
+    ObjectId commit2 = addCommit(commit1, FILE_NAME, fileContent);
+    rebaseChangeOn(changeId, commit2);
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+
+    addModifiedPatchSet(
+        changeId,
+        FILE_NAME,
+        content -> content.replace("Line 4\n", "Line four\n").replace("Line 6\n", "Line six\n"));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(previousPatchSetId).get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 4", "{", "Line 6");
+    assertThat(diffInfo)
+        .content()
+        .element(1)
+        .linesOfB()
+        .containsExactly("Line four", "{", "Line six");
+    assertThat(diffInfo).content().element(1).isNotDueToRebase();
+    assertThat(diffInfo).content().element(2).commonLines().isNotEmpty();
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(previousPatchSetId);
+    // Lines which weren't modified but are included in a hunk due to optimization don't count for
+    // the number of inserted/deleted lines.
+    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(2);
+    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(2);
+  }
+
+  @Test
+  public void closeRebaseHunksAreNotCombinedForIntralineOptimizations() throws Exception {
+    assume().that(intraline).isTrue();
+
+    String fileContent = FILE_CONTENT.replace("Line 5\n", "{\n");
+    ObjectId commit2 = addCommit(commit1, FILE_NAME, fileContent);
+    rebaseChangeOn(changeId, commit2);
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+
+    String newFileContent =
+        fileContent.replace("Line 4\n", "Line four\n").replace("Line 6\n", "Line six\n");
+    ObjectId commit3 = addCommit(commit1, FILE_NAME, newFileContent);
+    rebaseChangeOn(changeId, commit3);
+
+    addModifiedPatchSet(
+        changeId, FILE_NAME, content -> content.replace("Line 20\n", "Line twenty\n"));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(previousPatchSetId).get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 4");
+    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line four");
+    assertThat(diffInfo).content().element(1).isDueToRebase();
+    assertThat(diffInfo).content().element(2).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(3).linesOfA().containsExactly("Line 6");
+    assertThat(diffInfo).content().element(3).linesOfB().containsExactly("Line six");
+    assertThat(diffInfo).content().element(3).isDueToRebase();
+    assertThat(diffInfo).content().element(4).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(5).linesOfA().containsExactly("Line 20");
+    assertThat(diffInfo).content().element(5).linesOfB().containsExactly("Line twenty");
+    assertThat(diffInfo).content().element(5).isNotDueToRebase();
+    assertThat(diffInfo).content().element(6).commonLines().isNotEmpty();
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(previousPatchSetId);
+    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(1);
+    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(1);
+  }
+
+  @Test
+  public void closeRebaseAndNonRebaseHunksAreNotCombinedForIntralineOptimizations()
+      throws Exception {
+    assume().that(intraline).isTrue();
+
+    String fileContent = FILE_CONTENT.replace("Line 5\n", "{\n").replace("Line 7\n", "{\n");
+    ObjectId commit2 = addCommit(commit1, FILE_NAME, fileContent);
+    rebaseChangeOn(changeId, commit2);
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+
+    String newFileContent =
+        fileContent.replace("Line 4\n", "Line four\n").replace("Line 8\n", "Line eight\n");
+    ObjectId commit3 = addCommit(commit1, FILE_NAME, newFileContent);
+    rebaseChangeOn(changeId, commit3);
+
+    addModifiedPatchSet(changeId, FILE_NAME, content -> content.replace("Line 6\n", "Line six\n"));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(previousPatchSetId).get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 4");
+    assertThat(diffInfo).content().element(1).linesOfB().containsExactly("Line four");
+    assertThat(diffInfo).content().element(1).isDueToRebase();
+    assertThat(diffInfo).content().element(2).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(3).linesOfA().containsExactly("Line 6");
+    assertThat(diffInfo).content().element(3).linesOfB().containsExactly("Line six");
+    assertThat(diffInfo).content().element(3).isNotDueToRebase();
+    assertThat(diffInfo).content().element(4).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(5).linesOfA().containsExactly("Line 8");
+    assertThat(diffInfo).content().element(5).linesOfB().containsExactly("Line eight");
+    assertThat(diffInfo).content().element(5).isDueToRebase();
+    assertThat(diffInfo).content().element(6).commonLines().isNotEmpty();
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(previousPatchSetId);
+    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(1);
+    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(1);
+  }
+
+  @Test
+  public void closeNonRebaseHunksNextToRebaseHunksAreCombinedForIntralineOptimizations()
+      throws Exception {
+    assume().that(intraline).isTrue();
+
+    String fileContent = FILE_CONTENT.replace("Line 5\n", "{\n").replace("Line 7\n", "{\n");
+    ObjectId commit2 = addCommit(commit1, FILE_NAME, fileContent);
+    rebaseChangeOn(changeId, commit2);
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+
+    String newFileContent = fileContent.replace("Line 8\n", "Line eight!\n");
+    ObjectId commit3 = addCommit(commit1, FILE_NAME, newFileContent);
+    rebaseChangeOn(changeId, commit3);
+
+    addModifiedPatchSet(
+        changeId,
+        FILE_NAME,
+        content -> content.replace("Line 4\n", "Line four\n").replace("Line 6\n", "Line six\n"));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME).withBase(previousPatchSetId).get();
+    assertThat(diffInfo).content().element(0).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(1).linesOfA().containsExactly("Line 4", "{", "Line 6");
+    assertThat(diffInfo)
+        .content()
+        .element(1)
+        .linesOfB()
+        .containsExactly("Line four", "{", "Line six");
+    assertThat(diffInfo).content().element(1).isNotDueToRebase();
+    assertThat(diffInfo).content().element(2).commonLines().isNotEmpty();
+    assertThat(diffInfo).content().element(3).linesOfA().containsExactly("Line 8");
+    assertThat(diffInfo).content().element(3).linesOfB().containsExactly("Line eight!");
+    assertThat(diffInfo).content().element(3).isDueToRebase();
+    assertThat(diffInfo).content().element(4).commonLines().isNotEmpty();
+
+    Map<String, FileInfo> changedFiles =
+        gApi.changes().id(changeId).current().files(previousPatchSetId);
+    assertThat(changedFiles.get(FILE_NAME)).linesInserted().isEqualTo(2);
+    assertThat(changedFiles.get(FILE_NAME)).linesDeleted().isEqualTo(2);
+  }
+
+  @Test
+  public void diffOfUnmodifiedFileWithWholeFileContextReturnsFileContents() throws Exception {
+    addModifiedPatchSet(changeId, FILE_NAME, content -> content.replace("Line 2\n", "Line two\n"));
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    addModifiedPatchSet(
+        changeId, FILE_NAME2, content -> content.replace("2nd line\n", "Second line\n"));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME)
+            .withBase(previousPatchSetId)
+            .withContext(DiffPreferencesInfo.WHOLE_FILE_CONTEXT)
+            .get();
+    // We don't list the full file contents here as that is not the focus of this test.
+    assertThat(diffInfo)
+        .content()
+        .element(0)
+        .commonLines()
+        .containsAllOf("Line 1", "Line two", "Line 3", "Line 4", "Line 5")
+        .inOrder();
+  }
+
+  @Test
+  public void diffOfUnmodifiedFileWithCommentAndWholeFileContextReturnsFileContents()
+      throws Exception {
+    addModifiedPatchSet(changeId, FILE_NAME, content -> content.replace("Line 2\n", "Line two\n"));
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    CommentInput comment = createCommentInput(2, 0, 3, 0, "Should be 'Line 2'.");
+    ReviewInput reviewInput = new ReviewInput();
+    reviewInput.comments = ImmutableMap.of(FILE_NAME, ImmutableList.of(comment));
+    gApi.changes().id(changeId).revision(previousPatchSetId).review(reviewInput);
+    addModifiedPatchSet(
+        changeId, FILE_NAME2, content -> content.replace("2nd line\n", "Second line\n"));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME)
+            .withBase(previousPatchSetId)
+            .withContext(DiffPreferencesInfo.WHOLE_FILE_CONTEXT)
+            .get();
+    // We don't list the full file contents here as that is not the focus of this test.
+    assertThat(diffInfo)
+        .content()
+        .element(0)
+        .commonLines()
+        .containsAllOf("Line 1", "Line two", "Line 3", "Line 4", "Line 5")
+        .inOrder();
+  }
+
+  @Test
+  public void diffOfNonExistentFileIsAnEmptyDiffResult() throws Exception {
+    addModifiedPatchSet(changeId, FILE_NAME, content -> content.replace("Line 2\n", "Line two\n"));
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, "a_non-existent_file.txt")
+            .withBase(initialPatchSetId)
+            .withContext(DiffPreferencesInfo.WHOLE_FILE_CONTEXT)
+            .get();
+    assertThat(diffInfo).content().isEmpty();
+  }
+
+  @Test
+  public void requestingDiffForOldFileNameOfRenamedFileYieldsReasonableResult() throws Exception {
+    addModifiedPatchSet(changeId, FILE_NAME, content -> content.replace("Line 2\n", "Line two\n"));
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    String newFilePath = "a_new_file.txt";
+    gApi.changes().id(changeId).edit().renameFile(FILE_NAME, newFilePath);
+    gApi.changes().id(changeId).edit().publish();
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME)
+            .withBase(previousPatchSetId)
+            .withContext(DiffPreferencesInfo.WHOLE_FILE_CONTEXT)
+            .get();
+    // This behavior has been present in Gerrit for quite some time. It differs from the results
+    // returned for other cases (e.g. requesting the diff with whole file context for an unmodified
+    // file; requesting the diff with whole file context for a non-existent file). However, it's not
+    // completely clear what should be returned. The closest would be the result of a file deletion
+    // but that might also be misleading for users as actually a file rename occurred. In fact,
+    // requesting the diff result for the old file name of a renamed file is not a reasonable use
+    // case at all. We at least guarantee that we don't run into an internal error.
+    assertThat(diffInfo).content().element(0).commonLines().isNull();
+    assertThat(diffInfo).content().element(0).numberOfSkippedLines().isGreaterThan(0);
+  }
+
+  @Test
+  public void requestingDiffForOldFileNameOfRenamedFileWithCommentOnOldFileYieldsReasonableResult()
+      throws Exception {
+    addModifiedPatchSet(changeId, FILE_NAME, content -> content.replace("Line 2\n", "Line two\n"));
+    String previousPatchSetId = gApi.changes().id(changeId).get().currentRevision;
+    CommentInput comment = createCommentInput(2, 0, 3, 0, "Should be 'Line 2'.");
+    ReviewInput reviewInput = new ReviewInput();
+    reviewInput.comments = ImmutableMap.of(FILE_NAME, ImmutableList.of(comment));
+    gApi.changes().id(changeId).revision(previousPatchSetId).review(reviewInput);
+    String newFilePath = "a_new_file.txt";
+    gApi.changes().id(changeId).edit().renameFile(FILE_NAME, newFilePath);
+    gApi.changes().id(changeId).edit().publish();
+
+    DiffInfo diffInfo =
+        getDiffRequest(changeId, CURRENT, FILE_NAME)
+            .withBase(previousPatchSetId)
+            .withContext(DiffPreferencesInfo.WHOLE_FILE_CONTEXT)
+            .get();
+    // See comment for requestingDiffForOldFileNameOfRenamedFileYieldsReasonableResult().
+    // This test should additionally ensure that we also don't run into an internal error when
+    // a comment is present.
+    assertThat(diffInfo).content().element(0).commonLines().isNull();
+    assertThat(diffInfo).content().element(0).numberOfSkippedLines().isGreaterThan(0);
+  }
+
+  private static CommentInput createCommentInput(
+      int startLine, int startCharacter, int endLine, int endCharacter, String message) {
+    CommentInput comment = new CommentInput();
+    comment.range = new Comment.Range();
+    comment.range.startLine = startLine;
+    comment.range.startCharacter = startCharacter;
+    comment.range.endLine = endLine;
+    comment.range.endCharacter = endCharacter;
+    comment.message = message;
+    return comment;
+  }
+
+  private void assertDiffForNewFile(
+      PushOneCommit.Result pushResult, String path, String expectedContentSideB) throws Exception {
+    DiffInfo diff =
+        gApi.changes()
+            .id(pushResult.getChangeId())
+            .revision(pushResult.getCommit().name())
+            .file(path)
+            .diff();
+
+    List<String> headers = new ArrayList<>();
+    if (path.equals(COMMIT_MSG)) {
+      RevCommit c = pushResult.getCommit();
+
+      RevCommit parentCommit = c.getParents()[0];
+      String parentCommitId =
+          testRepo.getRevWalk().getObjectReader().abbreviate(parentCommit.getId(), 8).name();
+      headers.add("Parent:     " + parentCommitId + " (" + parentCommit.getShortMessage() + ")");
+
+      SimpleDateFormat dtfmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z", Locale.US);
+      PersonIdent author = c.getAuthorIdent();
+      dtfmt.setTimeZone(author.getTimeZone());
+      headers.add("Author:     " + author.getName() + " <" + author.getEmailAddress() + ">");
+      headers.add("AuthorDate: " + dtfmt.format(author.getWhen().getTime()));
+
+      PersonIdent committer = c.getCommitterIdent();
+      dtfmt.setTimeZone(committer.getTimeZone());
+      headers.add("Commit:     " + committer.getName() + " <" + committer.getEmailAddress() + ">");
+      headers.add("CommitDate: " + dtfmt.format(committer.getWhen().getTime()));
+      headers.add("");
+    }
+
+    if (!headers.isEmpty()) {
+      String header = Joiner.on("\n").join(headers);
+      expectedContentSideB = header + "\n" + expectedContentSideB;
+    }
+
+    assertDiffForNewFile(diff, pushResult.getCommit(), path, expectedContentSideB);
+  }
+
+  private void rebaseChangeOn(String changeId, ObjectId newParent) throws Exception {
+    RebaseInput rebaseInput = new RebaseInput();
+    rebaseInput.base = newParent.getName();
+    gApi.changes().id(changeId).current().rebase(rebaseInput);
+  }
+
+  private ObjectId addCommit(ObjectId parentCommit, String filePath, String fileContent)
+      throws Exception {
+    ImmutableMap<String, String> files = ImmutableMap.of(filePath, fileContent);
+    return addCommit(parentCommit, files);
+  }
+
+  private ObjectId addCommit(ObjectId parentCommit, ImmutableMap<String, String> files)
+      throws Exception {
+    testRepo.reset(parentCommit);
+    PushOneCommit push =
+        pushFactory.create(db, admin.getIdent(), testRepo, "Adjust files of repo", files);
+    PushOneCommit.Result result = push.to("refs/for/master");
+    return result.getCommit();
+  }
+
+  private ObjectId addCommit(ObjectId parentCommit, String filePath, byte[] fileContent)
+      throws Exception {
+    testRepo.reset(parentCommit);
+    PushOneCommit.Result result = createEmptyChange();
+    String changeId = result.getChangeId();
+    gApi.changes().id(changeId).edit().modifyFile(filePath, RawInputUtil.create(fileContent));
+    gApi.changes().id(changeId).edit().publish();
+    String currentRevision = gApi.changes().id(changeId).get().currentRevision;
+    GitUtil.fetch(testRepo, "refs/*:refs/*");
+    return ObjectId.fromString(currentRevision);
+  }
+
+  private ObjectId addCommitRemovingFiles(ObjectId parentCommit, String... removedFilePaths)
+      throws Exception {
+    testRepo.reset(parentCommit);
+    Map<String, String> files =
+        Arrays.stream(removedFilePaths)
+            .collect(toMap(Function.identity(), path -> "Irrelevant content"));
+    PushOneCommit push =
+        pushFactory.create(db, admin.getIdent(), testRepo, "Remove files from repo", files);
+    PushOneCommit.Result result = push.rm("refs/for/master");
+    return result.getCommit();
+  }
+
+  private ObjectId addCommitRenamingFile(
+      ObjectId parentCommit, String oldFilePath, String newFilePath) throws Exception {
+    testRepo.reset(parentCommit);
+    PushOneCommit.Result result = createEmptyChange();
+    String changeId = result.getChangeId();
+    gApi.changes().id(changeId).edit().renameFile(oldFilePath, newFilePath);
+    gApi.changes().id(changeId).edit().publish();
+    String currentRevision = gApi.changes().id(changeId).get().currentRevision;
+    GitUtil.fetch(testRepo, "refs/*:refs/*");
+    return ObjectId.fromString(currentRevision);
+  }
+
+  private Result createEmptyChange() throws Exception {
+    PushOneCommit push =
+        pushFactory.create(db, admin.getIdent(), testRepo, "Test change", ImmutableMap.of());
+    return push.to("refs/for/master");
+  }
+
+  private void addModifiedPatchSet(
+      String changeId, String filePath, Function<String, String> contentModification)
+      throws Exception {
+    try (BinaryResult content = gApi.changes().id(changeId).current().file(filePath).content()) {
+      String newContent = contentModification.apply(content.asString());
+      gApi.changes().id(changeId).edit().modifyFile(filePath, RawInputUtil.create(newContent));
+    }
+    gApi.changes().id(changeId).edit().publish();
+  }
+
+  private static byte[] createRgbImage(int red, int green, int blue) throws IOException {
+    BufferedImage bufferedImage = new BufferedImage(10, 20, BufferedImage.TYPE_INT_RGB);
+    for (int x = 0; x < bufferedImage.getWidth(); x++) {
+      for (int y = 0; y < bufferedImage.getHeight(); y++) {
+        int rgb = (red << 16) + (green << 8) + blue;
+        bufferedImage.setRGB(x, y, rgb);
+      }
+    }
+
+    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+    ImageIO.write(bufferedImage, "png", byteArrayOutputStream);
+    return byteArrayOutputStream.toByteArray();
+  }
+
+  private FileApi.DiffRequest getDiffRequest(String changeId, String revisionId, String fileName)
+      throws Exception {
+    return gApi.changes()
+        .id(changeId)
+        .revision(revisionId)
+        .file(fileName)
+        .diffRequest()
+        .withIntraline(intraline);
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/api/revision/RevisionIT.java b/javatests/com/google/gerrit/acceptance/api/revision/RevisionIT.java
new file mode 100644
index 0000000..b058d5e
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/revision/RevisionIT.java
@@ -0,0 +1,1584 @@
+// Copyright (C) 2013 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.google.gerrit.acceptance.api.revision;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth8.assertThat;
+import static com.google.gerrit.acceptance.PushOneCommit.FILE_CONTENT;
+import static com.google.gerrit.acceptance.PushOneCommit.FILE_NAME;
+import static com.google.gerrit.acceptance.PushOneCommit.PATCH;
+import static com.google.gerrit.acceptance.PushOneCommit.PATCH_FILE_ONLY;
+import static com.google.gerrit.acceptance.PushOneCommit.SUBJECT;
+import static com.google.gerrit.extensions.client.ListChangesOption.ALL_REVISIONS;
+import static com.google.gerrit.extensions.client.ListChangesOption.DETAILED_LABELS;
+import static com.google.gerrit.reviewdb.client.Patch.COMMIT_MSG;
+import static com.google.gerrit.reviewdb.client.Patch.MERGE_LIST;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.stream.Collectors.toList;
+import static org.eclipse.jgit.lib.Constants.HEAD;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Iterators;
+import com.google.common.collect.ListMultimap;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.acceptance.TestAccount;
+import com.google.gerrit.acceptance.TestProjectInput;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.changes.ChangeApi;
+import com.google.gerrit.extensions.api.changes.CherryPickInput;
+import com.google.gerrit.extensions.api.changes.DraftApi;
+import com.google.gerrit.extensions.api.changes.DraftInput;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.api.changes.NotifyInfo;
+import com.google.gerrit.extensions.api.changes.RecipientType;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput.CommentInput;
+import com.google.gerrit.extensions.api.changes.RevisionApi;
+import com.google.gerrit.extensions.api.projects.BranchInput;
+import com.google.gerrit.extensions.client.ChangeStatus;
+import com.google.gerrit.extensions.client.ReviewerState;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.ApprovalInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.ChangeMessageInfo;
+import com.google.gerrit.extensions.common.CherryPickChangeInfo;
+import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.common.CommitInfo;
+import com.google.gerrit.extensions.common.FileInfo;
+import com.google.gerrit.extensions.common.GitPerson;
+import com.google.gerrit.extensions.common.LabelInfo;
+import com.google.gerrit.extensions.common.MergeableInfo;
+import com.google.gerrit.extensions.common.RevisionInfo;
+import com.google.gerrit.extensions.common.WebLinkInfo;
+import com.google.gerrit.extensions.events.ChangeIndexedListener;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.BinaryResult;
+import com.google.gerrit.extensions.restapi.ETagView;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.extensions.webui.PatchSetWebLink;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.restapi.change.GetRevisionActions;
+import com.google.inject.Inject;
+import java.io.ByteArrayOutputStream;
+import java.sql.Timestamp;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CountDownLatch;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.transport.RefSpec;
+import org.junit.Test;
+
+public class RevisionIT extends AbstractDaemonTest {
+
+  @Inject private GetRevisionActions getRevisionActions;
+  @Inject private DynamicSet<PatchSetWebLink> patchSetLinks;
+  @Inject private DynamicSet<ChangeIndexedListener> changeIndexedListeners;
+
+  @Test
+  public void reviewTriplet() throws Exception {
+    PushOneCommit.Result r = createChange();
+    gApi.changes()
+        .id(project.get() + "~master~" + r.getChangeId())
+        .revision(r.getCommit().name())
+        .review(ReviewInput.approve());
+  }
+
+  @Test
+  public void reviewCurrent() throws Exception {
+    PushOneCommit.Result r = createChange();
+    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve());
+  }
+
+  @Test
+  public void reviewNumber() throws Exception {
+    PushOneCommit.Result r = createChange();
+    gApi.changes().id(r.getChangeId()).revision(1).review(ReviewInput.approve());
+
+    r = updateChange(r, "new content");
+    gApi.changes().id(r.getChangeId()).revision(2).review(ReviewInput.approve());
+  }
+
+  @Test
+  public void submit() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String changeId = project.get() + "~master~" + r.getChangeId();
+    gApi.changes().id(changeId).current().review(ReviewInput.approve());
+    gApi.changes().id(changeId).current().submit();
+    assertThat(gApi.changes().id(changeId).get().status).isEqualTo(ChangeStatus.MERGED);
+  }
+
+  @Test
+  public void postSubmitApproval() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String changeId = project.get() + "~master~" + r.getChangeId();
+    gApi.changes().id(changeId).current().review(ReviewInput.recommend());
+
+    String label = "Code-Review";
+    ApprovalInfo approval = getApproval(changeId, label);
+    assertThat(approval.value).isEqualTo(1);
+    assertThat(approval.postSubmit).isNull();
+
+    // Submit by direct push.
+    git().push().setRefSpecs(new RefSpec(r.getCommit().name() + ":refs/heads/master")).call();
+    assertThat(gApi.changes().id(changeId).get().status).isEqualTo(ChangeStatus.MERGED);
+
+    approval = getApproval(changeId, label);
+    assertThat(approval.value).isEqualTo(1);
+    assertThat(approval.postSubmit).isNull();
+    assertPermitted(gApi.changes().id(changeId).get(DETAILED_LABELS), "Code-Review", 1, 2);
+
+    // Repeating the current label is allowed. Does not flip the postSubmit bit
+    // due to deduplication codepath.
+    gApi.changes().id(changeId).current().review(ReviewInput.recommend());
+    approval = getApproval(changeId, label);
+    assertThat(approval.value).isEqualTo(1);
+    assertThat(approval.postSubmit).isNull();
+
+    // Reducing vote is not allowed.
+    try {
+      gApi.changes().id(changeId).current().review(ReviewInput.dislike());
+      fail("expected ResourceConflictException");
+    } catch (ResourceConflictException e) {
+      assertThat(e)
+          .hasMessageThat()
+          .isEqualTo("Cannot reduce vote on labels for closed change: Code-Review");
+    }
+    approval = getApproval(changeId, label);
+    assertThat(approval.value).isEqualTo(1);
+    assertThat(approval.postSubmit).isNull();
+
+    // Increasing vote is allowed.
+    gApi.changes().id(changeId).current().review(ReviewInput.approve());
+    approval = getApproval(changeId, label);
+    assertThat(approval.value).isEqualTo(2);
+    assertThat(approval.postSubmit).isTrue();
+    assertPermitted(gApi.changes().id(changeId).get(DETAILED_LABELS), "Code-Review", 2);
+
+    // Decreasing to previous post-submit vote is still not allowed.
+    try {
+      gApi.changes().id(changeId).current().review(ReviewInput.dislike());
+      fail("expected ResourceConflictException");
+    } catch (ResourceConflictException e) {
+      assertThat(e)
+          .hasMessageThat()
+          .isEqualTo("Cannot reduce vote on labels for closed change: Code-Review");
+    }
+    approval = getApproval(changeId, label);
+    assertThat(approval.value).isEqualTo(2);
+    assertThat(approval.postSubmit).isTrue();
+  }
+
+  @Test
+  public void postSubmitApprovalAfterVoteRemoved() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String changeId = project.get() + "~master~" + r.getChangeId();
+
+    setApiUser(admin);
+    revision(r).review(ReviewInput.approve());
+
+    setApiUser(user);
+    revision(r).review(ReviewInput.recommend());
+
+    setApiUser(admin);
+    gApi.changes().id(changeId).reviewer(user.username).deleteVote("Code-Review");
+    Optional<ApprovalInfo> crUser =
+        get(changeId, DETAILED_LABELS).labels.get("Code-Review").all.stream()
+            .filter(a -> a._accountId == user.id.get())
+            .findFirst();
+    assertThat(crUser).isPresent();
+    assertThat(crUser.get().value).isEqualTo(0);
+
+    revision(r).submit();
+
+    setApiUser(user);
+    ReviewInput in = new ReviewInput();
+    in.label("Code-Review", 1);
+    in.message = "Still LGTM";
+    revision(r).review(in);
+
+    ApprovalInfo cr =
+        gApi.changes().id(changeId).get(DETAILED_LABELS).labels.get("Code-Review").all.stream()
+            .filter(a -> a._accountId == user.getId().get())
+            .findFirst()
+            .get();
+    assertThat(cr.postSubmit).isTrue();
+  }
+
+  @Test
+  public void postSubmitDeleteApprovalNotAllowed() throws Exception {
+    PushOneCommit.Result r = createChange();
+
+    revision(r).review(ReviewInput.approve());
+    revision(r).submit();
+
+    ReviewInput in = new ReviewInput();
+    in.label("Code-Review", 0);
+
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("Cannot reduce vote on labels for closed change: Code-Review");
+    revision(r).review(in);
+  }
+
+  @TestProjectInput(submitType = SubmitType.CHERRY_PICK)
+  @Test
+  public void approvalCopiedDuringSubmitIsNotPostSubmit() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getChange().getId();
+    gApi.changes().id(id.get()).current().review(ReviewInput.approve());
+    gApi.changes().id(id.get()).current().submit();
+
+    ChangeData cd = r.getChange();
+    assertThat(cd.patchSets()).hasSize(2);
+    PatchSetApproval psa =
+        Iterators.getOnlyElement(
+            cd.currentApprovals().stream().filter(a -> !a.isLegacySubmit()).iterator());
+    assertThat(psa.getPatchSetId().get()).isEqualTo(2);
+    assertThat(psa.getLabel()).isEqualTo("Code-Review");
+    assertThat(psa.getValue()).isEqualTo(2);
+    assertThat(psa.isPostSubmit()).isFalse();
+  }
+
+  @Test
+  public void voteOnAbandonedChange() throws Exception {
+    PushOneCommit.Result r = createChange();
+    gApi.changes().id(r.getChangeId()).abandon();
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("change is closed");
+    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.reject());
+  }
+
+  @Test
+  public void voteNotAllowedWithoutPermission() throws Exception {
+    PushOneCommit.Result r = createChange();
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    exception.expectMessage("is restricted");
+    gApi.changes().id(r.getChange().getId().get()).current().review(ReviewInput.approve());
+  }
+
+  @Test
+  public void cherryPick() throws Exception {
+    PushOneCommit.Result r = pushTo("refs/for/master%topic=someTopic");
+    CherryPickInput in = new CherryPickInput();
+    in.destination = "foo";
+    in.message = "it goes to stable branch";
+    gApi.projects().name(project.get()).branch(in.destination).create(new BranchInput());
+    ChangeApi orig = gApi.changes().id(project.get() + "~master~" + r.getChangeId());
+
+    assertThat(orig.get().messages).hasSize(1);
+    CherryPickChangeInfo changeInfo = orig.revision(r.getCommit().name()).cherryPickAsInfo(in);
+    assertThat(changeInfo.containsGitConflicts).isNull();
+    assertThat(changeInfo.workInProgress).isNull();
+    ChangeApi cherry = gApi.changes().id(changeInfo._number);
+
+    ChangeInfo cherryPickChangeInfoWithDetails = cherry.get();
+    assertThat(cherryPickChangeInfoWithDetails.workInProgress).isNull();
+    assertThat(cherryPickChangeInfoWithDetails.messages).hasSize(1);
+    Iterator<ChangeMessageInfo> cherryIt = cherryPickChangeInfoWithDetails.messages.iterator();
+    assertThat(cherryIt.next().message).isEqualTo("Patch Set 1: Cherry Picked from branch master.");
+
+    assertThat(cherry.get().subject).contains(in.message);
+    assertThat(cherry.get().topic).isEqualTo("someTopic-foo");
+    cherry.current().review(ReviewInput.approve());
+    cherry.current().submit();
+  }
+
+  @Test
+  public void cherryPickSetChangeId() throws Exception {
+    PushOneCommit.Result r = pushTo("refs/for/master");
+    CherryPickInput in = new CherryPickInput();
+    in.destination = "foo";
+    String id = "Ideadbeefdeadbeefdeadbeefdeadbeefdeadbe3f";
+    in.message = "it goes to foo branch\n\nChange-Id: " + id;
+
+    gApi.projects().name(project.get()).branch(in.destination).create(new BranchInput());
+    ChangeApi orig = gApi.changes().id(project.get() + "~master~" + r.getChangeId());
+
+    assertThat(orig.get().messages).hasSize(1);
+    ChangeApi cherry = orig.revision(r.getCommit().name()).cherryPick(in);
+
+    ChangeInfo changeInfo = cherry.get();
+
+    // The cherry-pick honors the ChangeId specified in the input message:
+    RevisionInfo revInfo = changeInfo.revisions.get(changeInfo.currentRevision);
+    assertThat(revInfo).isNotNull();
+    assertThat(revInfo.commit.message).endsWith(id + "\n");
+  }
+
+  @Test
+  public void cherryPickWithNoTopic() throws Exception {
+    PushOneCommit.Result r = pushTo("refs/for/master");
+    CherryPickInput in = new CherryPickInput();
+    in.destination = "foo";
+    in.message = "it goes to stable branch";
+    gApi.projects().name(project.get()).branch(in.destination).create(new BranchInput());
+    ChangeApi orig = gApi.changes().id(project.get() + "~master~" + r.getChangeId());
+
+    ChangeApi cherry = orig.revision(r.getCommit().name()).cherryPick(in);
+    assertThat(cherry.get().topic).isNull();
+    cherry.current().review(ReviewInput.approve());
+    cherry.current().submit();
+  }
+
+  @Test
+  public void cherryPickWorkInProgressChange() throws Exception {
+    PushOneCommit.Result r = pushTo("refs/for/master%wip");
+    CherryPickInput in = new CherryPickInput();
+    in.destination = "foo";
+    in.message = "cherry pick message";
+    gApi.projects().name(project.get()).branch(in.destination).create(new BranchInput());
+    ChangeApi orig = gApi.changes().id(project.get() + "~master~" + r.getChangeId());
+
+    ChangeApi cherry = orig.revision(r.getCommit().name()).cherryPick(in);
+    assertThat(cherry.get().workInProgress).isTrue();
+  }
+
+  @Test
+  public void cherryPickToSameBranch() throws Exception {
+    PushOneCommit.Result r = createChange();
+    CherryPickInput in = new CherryPickInput();
+    in.destination = "master";
+    in.message = "it generates a new patch set\n\nChange-Id: " + r.getChangeId();
+    ChangeInfo cherryInfo =
+        gApi.changes()
+            .id(project.get() + "~master~" + r.getChangeId())
+            .revision(r.getCommit().name())
+            .cherryPick(in)
+            .get();
+    assertThat(cherryInfo.messages).hasSize(2);
+    Iterator<ChangeMessageInfo> cherryIt = cherryInfo.messages.iterator();
+    assertThat(cherryIt.next().message).isEqualTo("Uploaded patch set 1.");
+    assertThat(cherryIt.next().message).isEqualTo("Uploaded patch set 2.");
+  }
+
+  @Test
+  public void cherryPickToSameBranchWithRebase() throws Exception {
+    // Push a new change, then merge it
+    PushOneCommit.Result baseChange = createChange();
+    String triplet = project.get() + "~master~" + baseChange.getChangeId();
+    RevisionApi baseRevision = gApi.changes().id(triplet).current();
+    baseRevision.review(ReviewInput.approve());
+    baseRevision.submit();
+
+    // Push a new change (change 1)
+    PushOneCommit.Result r1 = createChange();
+
+    // Push another new change (change 2)
+    String subject = "Test change\n\nChange-Id: Ideadbeefdeadbeefdeadbeefdeadbeefdeadbeef";
+    PushOneCommit push =
+        pushFactory.create(
+            db, admin.getIdent(), testRepo, subject, "another_file.txt", "another content");
+    PushOneCommit.Result r2 = push.to("refs/for/master");
+
+    // Change 2's parent should be change 1
+    assertThat(r2.getCommit().getParents()[0].name()).isEqualTo(r1.getCommit().name());
+
+    // Cherry pick change 2 onto the same branch
+    triplet = project.get() + "~master~" + r2.getChangeId();
+    ChangeApi orig = gApi.changes().id(triplet);
+    CherryPickInput in = new CherryPickInput();
+    in.destination = "master";
+    in.message = subject;
+    ChangeApi cherry = orig.revision(r2.getCommit().name()).cherryPick(in);
+    ChangeInfo cherryInfo = cherry.get();
+    assertThat(cherryInfo.messages).hasSize(2);
+    Iterator<ChangeMessageInfo> cherryIt = cherryInfo.messages.iterator();
+    assertThat(cherryIt.next().message).isEqualTo("Uploaded patch set 1.");
+    assertThat(cherryIt.next().message).isEqualTo("Uploaded patch set 2.");
+
+    // Parent of change 2 should now be the change that was merged, i.e.
+    // change 2 is rebased onto the head of the master branch.
+    String newParent =
+        cherryInfo.revisions.get(cherryInfo.currentRevision).commit.parents.get(0).commit;
+    assertThat(newParent).isEqualTo(baseChange.getCommit().name());
+  }
+
+  @Test
+  public void cherryPickIdenticalTree() throws Exception {
+    PushOneCommit.Result r = createChange();
+    CherryPickInput in = new CherryPickInput();
+    in.destination = "foo";
+    in.message = "it goes to stable branch";
+    gApi.projects().name(project.get()).branch(in.destination).create(new BranchInput());
+    ChangeApi orig = gApi.changes().id(project.get() + "~master~" + r.getChangeId());
+
+    assertThat(orig.get().messages).hasSize(1);
+    ChangeApi cherry = orig.revision(r.getCommit().name()).cherryPick(in);
+
+    assertThat(cherry.get().subject).contains(in.message);
+    cherry.current().review(ReviewInput.approve());
+    cherry.current().submit();
+
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("Cherry pick failed: identical tree");
+    orig.revision(r.getCommit().name()).cherryPick(in);
+  }
+
+  @Test
+  public void cherryPickConflict() throws Exception {
+    PushOneCommit.Result r = createChange();
+    CherryPickInput in = new CherryPickInput();
+    in.destination = "foo";
+    in.message = "it goes to stable branch";
+    gApi.projects().name(project.get()).branch(in.destination).create(new BranchInput());
+
+    PushOneCommit push =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            testRepo,
+            PushOneCommit.SUBJECT,
+            PushOneCommit.FILE_NAME,
+            "another content");
+    push.to("refs/heads/foo");
+
+    String triplet = project.get() + "~master~" + r.getChangeId();
+    ChangeApi orig = gApi.changes().id(triplet);
+    assertThat(orig.get().messages).hasSize(1);
+
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("Cherry pick failed: merge conflict");
+    orig.revision(r.getCommit().name()).cherryPick(in);
+  }
+
+  @Test
+  public void cherryPickConflictWithAllowConflicts() throws Exception {
+    ObjectId initial = repo().exactRef(HEAD).getLeaf().getObjectId();
+
+    // Create a branch and push a commit to it (by-passing review)
+    String destBranch = "foo";
+    gApi.projects().name(project.get()).branch(destBranch).create(new BranchInput());
+    String destContent = "some content";
+    PushOneCommit push =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            testRepo,
+            PushOneCommit.SUBJECT,
+            ImmutableMap.of(PushOneCommit.FILE_NAME, destContent, "foo.txt", "foo"));
+    push.to("refs/heads/" + destBranch);
+
+    // Create a change on master with a commit that conflicts with the commit on the other branch.
+    testRepo.reset(initial);
+    String changeContent = "another content";
+    push =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            testRepo,
+            PushOneCommit.SUBJECT,
+            ImmutableMap.of(PushOneCommit.FILE_NAME, changeContent, "bar.txt", "bar"));
+    PushOneCommit.Result r = push.to("refs/for/master%topic=someTopic");
+
+    // Verify before the cherry-pick that the change has exactly 1 message.
+    ChangeApi changeApi = gApi.changes().id(r.getChange().getId().get());
+    assertThat(changeApi.get().messages).hasSize(1);
+
+    // Cherry-pick the change to the other branch, that should fail with a conflict.
+    CherryPickInput in = new CherryPickInput();
+    in.destination = destBranch;
+    in.message = "Cherry-Pick";
+    try {
+      changeApi.revision(r.getCommit().name()).cherryPickAsInfo(in);
+      fail("expected ResourceConflictException");
+    } catch (ResourceConflictException e) {
+      assertThat(e.getMessage()).isEqualTo("Cherry pick failed: merge conflict");
+    }
+
+    // Cherry-pick with auto merge should succeed.
+    in.allowConflicts = true;
+    CherryPickChangeInfo cherryPickChange =
+        changeApi.revision(r.getCommit().name()).cherryPickAsInfo(in);
+    assertThat(cherryPickChange.containsGitConflicts).isTrue();
+    assertThat(cherryPickChange.workInProgress).isTrue();
+
+    // Verify that subject and topic on the cherry-pick change have been correctly populated.
+    assertThat(cherryPickChange.subject).contains(in.message);
+    assertThat(cherryPickChange.topic).isEqualTo("someTopic-" + destBranch);
+
+    // Verify that the file content in the cherry-pick change is correct.
+    // We expect that it has conflict markers to indicate the conflict.
+    BinaryResult bin =
+        gApi.changes()
+            .id(cherryPickChange._number)
+            .current()
+            .file(PushOneCommit.FILE_NAME)
+            .content();
+    ByteArrayOutputStream os = new ByteArrayOutputStream();
+    bin.writeTo(os);
+    String fileContent = new String(os.toByteArray(), UTF_8);
+    String destSha1 = getRemoteHead(project, destBranch).abbreviate(6).name();
+    String changeSha1 = r.getCommit().abbreviate(6).name();
+    assertThat(fileContent)
+        .isEqualTo(
+            "<<<<<<< HEAD   ("
+                + destSha1
+                + " test commit)\n"
+                + destContent
+                + "\n"
+                + "=======\n"
+                + changeContent
+                + "\n"
+                + ">>>>>>> CHANGE ("
+                + changeSha1
+                + " test commit)\n");
+
+    // Get details of cherry-pick change.
+    ChangeInfo cherryPickChangeWithDetails = gApi.changes().id(cherryPickChange._number).get();
+    assertThat(cherryPickChangeWithDetails.workInProgress).isTrue();
+
+    // Verify that a message has been posted on the cherry-pick change.
+    assertThat(cherryPickChangeWithDetails.messages).hasSize(1);
+    Iterator<ChangeMessageInfo> cherryIt = cherryPickChangeWithDetails.messages.iterator();
+    assertThat(cherryIt.next().message)
+        .isEqualTo(
+            "Patch Set 1: Cherry Picked from branch master.\n\n"
+                + "The following files contain Git conflicts:\n"
+                + "* "
+                + PushOneCommit.FILE_NAME
+                + "\n");
+  }
+
+  @Test
+  public void cherryPickToExistingChange() throws Exception {
+    PushOneCommit.Result r1 =
+        pushFactory
+            .create(db, admin.getIdent(), testRepo, SUBJECT, FILE_NAME, "a")
+            .to("refs/for/master");
+    String t1 = project.get() + "~master~" + r1.getChangeId();
+
+    BranchInput bin = new BranchInput();
+    bin.revision = r1.getCommit().getParent(0).name();
+    gApi.projects().name(project.get()).branch("foo").create(bin);
+
+    PushOneCommit.Result r2 =
+        pushFactory
+            .create(db, admin.getIdent(), testRepo, SUBJECT, FILE_NAME, "b", r1.getChangeId())
+            .to("refs/for/foo");
+    String t2 = project.get() + "~foo~" + r2.getChangeId();
+    gApi.changes().id(t2).abandon();
+
+    CherryPickInput in = new CherryPickInput();
+    in.destination = "foo";
+    in.message = r1.getCommit().getFullMessage();
+    try {
+      gApi.changes().id(t1).current().cherryPick(in);
+      fail("expected ResourceConflictException");
+    } catch (ResourceConflictException e) {
+      assertThat(e.getMessage())
+          .isEqualTo(
+              "Cannot create new patch set of change "
+                  + info(t2)._number
+                  + " because it is abandoned");
+    }
+
+    gApi.changes().id(t2).restore();
+    gApi.changes().id(t1).current().cherryPick(in);
+    assertThat(get(t2, ALL_REVISIONS).revisions).hasSize(2);
+    assertThat(gApi.changes().id(t2).current().file(FILE_NAME).content().asString()).isEqualTo("a");
+  }
+
+  @Test
+  public void cherryPickMergeRelativeToDefaultParent() throws Exception {
+    String parent1FileName = "a.txt";
+    String parent2FileName = "b.txt";
+    PushOneCommit.Result mergeChangeResult =
+        createCherryPickableMerge(parent1FileName, parent2FileName);
+
+    String cherryPickBranchName = "branch_for_cherry_pick";
+    createBranch(new Branch.NameKey(project, cherryPickBranchName));
+
+    CherryPickInput cherryPickInput = new CherryPickInput();
+    cherryPickInput.destination = cherryPickBranchName;
+    cherryPickInput.message = "Cherry-pick a merge commit to another branch";
+
+    ChangeInfo cherryPickedChangeInfo =
+        gApi.changes()
+            .id(mergeChangeResult.getChangeId())
+            .current()
+            .cherryPick(cherryPickInput)
+            .get();
+
+    Map<String, FileInfo> cherryPickedFilesByName =
+        cherryPickedChangeInfo.revisions.get(cherryPickedChangeInfo.currentRevision).files;
+    assertThat(cherryPickedFilesByName).containsKey(parent2FileName);
+    assertThat(cherryPickedFilesByName).doesNotContainKey(parent1FileName);
+  }
+
+  @Test
+  public void cherryPickMergeRelativeToSpecificParent() throws Exception {
+    String parent1FileName = "a.txt";
+    String parent2FileName = "b.txt";
+    PushOneCommit.Result mergeChangeResult =
+        createCherryPickableMerge(parent1FileName, parent2FileName);
+
+    String cherryPickBranchName = "branch_for_cherry_pick";
+    createBranch(new Branch.NameKey(project, cherryPickBranchName));
+
+    CherryPickInput cherryPickInput = new CherryPickInput();
+    cherryPickInput.destination = cherryPickBranchName;
+    cherryPickInput.message = "Cherry-pick a merge commit to another branch";
+    cherryPickInput.parent = 2;
+
+    ChangeInfo cherryPickedChangeInfo =
+        gApi.changes()
+            .id(mergeChangeResult.getChangeId())
+            .current()
+            .cherryPick(cherryPickInput)
+            .get();
+
+    Map<String, FileInfo> cherryPickedFilesByName =
+        cherryPickedChangeInfo.revisions.get(cherryPickedChangeInfo.currentRevision).files;
+    assertThat(cherryPickedFilesByName).containsKey(parent1FileName);
+    assertThat(cherryPickedFilesByName).doesNotContainKey(parent2FileName);
+  }
+
+  @Test
+  public void cherryPickMergeUsingInvalidParent() throws Exception {
+    String parent1FileName = "a.txt";
+    String parent2FileName = "b.txt";
+    PushOneCommit.Result mergeChangeResult =
+        createCherryPickableMerge(parent1FileName, parent2FileName);
+
+    String cherryPickBranchName = "branch_for_cherry_pick";
+    createBranch(new Branch.NameKey(project, cherryPickBranchName));
+
+    CherryPickInput cherryPickInput = new CherryPickInput();
+    cherryPickInput.destination = cherryPickBranchName;
+    cherryPickInput.message = "Cherry-pick a merge commit to another branch";
+    cherryPickInput.parent = 0;
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage(
+        "Cherry Pick: Parent 0 does not exist. Please specify a parent in range [1, 2].");
+    gApi.changes().id(mergeChangeResult.getChangeId()).current().cherryPick(cherryPickInput);
+  }
+
+  @Test
+  public void cherryPickMergeUsingNonExistentParent() throws Exception {
+    String parent1FileName = "a.txt";
+    String parent2FileName = "b.txt";
+    PushOneCommit.Result mergeChangeResult =
+        createCherryPickableMerge(parent1FileName, parent2FileName);
+
+    String cherryPickBranchName = "branch_for_cherry_pick";
+    createBranch(new Branch.NameKey(project, cherryPickBranchName));
+
+    CherryPickInput cherryPickInput = new CherryPickInput();
+    cherryPickInput.destination = cherryPickBranchName;
+    cherryPickInput.message = "Cherry-pick a merge commit to another branch";
+    cherryPickInput.parent = 3;
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage(
+        "Cherry Pick: Parent 3 does not exist. Please specify a parent in range [1, 2].");
+    gApi.changes().id(mergeChangeResult.getChangeId()).current().cherryPick(cherryPickInput);
+  }
+
+  @Test
+  public void cherryPickNotify() throws Exception {
+    createBranch(new Branch.NameKey(project, "branch-1"));
+    createBranch(new Branch.NameKey(project, "branch-2"));
+    createBranch(new Branch.NameKey(project, "branch-3"));
+
+    // Creates a change for 'admin'.
+    PushOneCommit.Result result = createChange();
+    String changeId = project.get() + "~master~" + result.getChangeId();
+
+    // 'user' cherry-picks the change to a new branch, the source change's author/committer('admin')
+    // will be added as a reviewer of the newly created change.
+    setApiUser(user);
+    CherryPickInput input = new CherryPickInput();
+    input.message = "it goes to a new branch";
+
+    // Enable the notification. 'admin' as a reviewer should be notified.
+    input.destination = "branch-1";
+    input.notify = NotifyHandling.ALL;
+    sender.clear();
+    gApi.changes().id(changeId).current().cherryPick(input);
+    assertNotifyTo(admin);
+
+    // Disable the notification. 'admin' as a reviewer should not be notified any more.
+    input.destination = "branch-2";
+    input.notify = NotifyHandling.NONE;
+    sender.clear();
+    gApi.changes().id(changeId).current().cherryPick(input);
+    assertThat(sender.getMessages()).hasSize(0);
+
+    // Disable the notification. The user provided in the 'notifyDetails' should still be notified.
+    TestAccount userToNotify = accountCreator.user2();
+    input.destination = "branch-3";
+    input.notify = NotifyHandling.NONE;
+    input.notifyDetails =
+        ImmutableMap.of(RecipientType.TO, new NotifyInfo(ImmutableList.of(userToNotify.email)));
+    sender.clear();
+    gApi.changes().id(changeId).current().cherryPick(input);
+    assertNotifyTo(userToNotify);
+  }
+
+  @Test
+  public void cherryPickKeepReviewers() throws Exception {
+    createBranch(new Branch.NameKey(project, "stable"));
+
+    // Change is created by 'admin'.
+    PushOneCommit.Result r = createChange();
+    // Change is approved by 'admin2'. Change is CC'd to 'user'.
+    setApiUser(accountCreator.admin2());
+    ReviewInput in = ReviewInput.approve();
+    in.reviewer(user.email, ReviewerState.CC, true);
+    gApi.changes().id(r.getChangeId()).current().review(in);
+
+    // Change is cherrypicked by 'user2'.
+    setApiUser(accountCreator.user2());
+    CherryPickInput cin = new CherryPickInput();
+    cin.message = "this need to go to stable";
+    cin.destination = "stable";
+    cin.keepReviewers = true;
+    Map<ReviewerState, Collection<AccountInfo>> result =
+        gApi.changes().id(r.getChangeId()).current().cherryPick(cin).get().reviewers;
+
+    // 'admin' should be a reviewer as the old owner.
+    // 'admin2' should be a reviewer as the old reviewer.
+    // 'user' should be on CC.
+    assertThat(result).containsKey(ReviewerState.REVIEWER);
+    List<Integer> reviewers =
+        result.get(ReviewerState.REVIEWER).stream().map(a -> a._accountId).collect(toList());
+    if (notesMigration.readChanges()) {
+      assertThat(result).containsKey(ReviewerState.CC);
+      List<Integer> ccs =
+          result.get(ReviewerState.CC).stream().map(a -> a._accountId).collect(toList());
+      assertThat(ccs).containsExactly(user.id.get());
+      assertThat(reviewers).containsExactly(admin.id.get(), accountCreator.admin2().id.get());
+    } else {
+      assertThat(reviewers)
+          .containsExactly(user.id.get(), admin.id.get(), accountCreator.admin2().id.get());
+    }
+  }
+
+  @Test
+  public void cherryPickToMergedChangeRevision() throws Exception {
+    createBranch(new Branch.NameKey(project, "foo"));
+
+    PushOneCommit.Result dstChange = createChange(testRepo, "foo", SUBJECT, "b.txt", "b", "t");
+    dstChange.assertOkStatus();
+
+    merge(dstChange);
+
+    PushOneCommit.Result result = createChange(testRepo, "foo", SUBJECT, "b.txt", "c", "t");
+    result.assertOkStatus();
+    merge(result);
+
+    PushOneCommit.Result srcChange = createChange();
+
+    CherryPickInput input = new CherryPickInput();
+    input.destination = "foo";
+    input.base = dstChange.getCommit().name();
+    input.message = srcChange.getCommit().getFullMessage();
+    ChangeInfo changeInfo =
+        gApi.changes().id(srcChange.getChangeId()).current().cherryPick(input).get();
+    assertCherryPickResult(changeInfo, input, srcChange.getChangeId());
+  }
+
+  @Test
+  public void cherryPickToOpenChangeRevision() throws Exception {
+    createBranch(new Branch.NameKey(project, "foo"));
+
+    PushOneCommit.Result dstChange = createChange(testRepo, "foo", SUBJECT, "b.txt", "b", "t");
+    dstChange.assertOkStatus();
+
+    PushOneCommit.Result srcChange = createChange();
+
+    CherryPickInput input = new CherryPickInput();
+    input.destination = "foo";
+    input.base = dstChange.getCommit().name();
+    input.message = srcChange.getCommit().getFullMessage();
+    ChangeInfo changeInfo =
+        gApi.changes().id(srcChange.getChangeId()).current().cherryPick(input).get();
+    assertCherryPickResult(changeInfo, input, srcChange.getChangeId());
+  }
+
+  @Test
+  public void cherryPickToNonVisibleChangeFails() throws Exception {
+    createBranch(new Branch.NameKey(project, "foo"));
+
+    PushOneCommit.Result dstChange = createChange(testRepo, "foo", SUBJECT, "b.txt", "b", "t");
+    dstChange.assertOkStatus();
+
+    gApi.changes().id(dstChange.getChangeId()).setPrivate(true, null);
+
+    PushOneCommit.Result srcChange = createChange();
+
+    CherryPickInput input = new CherryPickInput();
+    input.destination = "foo";
+    input.base = dstChange.getCommit().name();
+    input.message = srcChange.getCommit().getFullMessage();
+
+    setApiUser(user);
+    exception.expect(UnprocessableEntityException.class);
+    exception.expectMessage(
+        String.format("Commit %s does not exist on branch refs/heads/foo", input.base));
+    gApi.changes().id(srcChange.getChangeId()).current().cherryPick(input).get();
+  }
+
+  @Test
+  public void cherryPickToAbandonedChangeFails() throws Exception {
+    PushOneCommit.Result change1 = createChange();
+    PushOneCommit.Result change2 = createChange();
+    gApi.changes().id(change2.getChangeId()).abandon();
+
+    CherryPickInput input = new CherryPickInput();
+    input.destination = "master";
+    input.base = change2.getCommit().name();
+    input.message = change1.getCommit().getFullMessage();
+
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage(
+        String.format(
+            "Change %s with commit %s is %s",
+            change2.getChange().getId().get(), input.base, ChangeStatus.ABANDONED));
+    gApi.changes().id(change1.getChangeId()).current().cherryPick(input);
+  }
+
+  @Test
+  public void cherryPickWithInvalidBaseFails() throws Exception {
+    PushOneCommit.Result change1 = createChange();
+
+    CherryPickInput input = new CherryPickInput();
+    input.destination = "master";
+    input.base = "invalid-sha1";
+    input.message = change1.getCommit().getFullMessage();
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage(String.format("Base %s doesn't represent a valid SHA-1", input.base));
+    gApi.changes().id(change1.getChangeId()).current().cherryPick(input);
+  }
+
+  @Test
+  public void cherryPickToCommitWithoutChangeId() throws Exception {
+    RevCommit commit1 = createNewCommitWithoutChangeId("refs/heads/foo", "a.txt", "content 1");
+
+    createNewCommitWithoutChangeId("refs/heads/foo", "a.txt", "content 2");
+
+    PushOneCommit.Result srcChange = createChange("subject", "b.txt", "b");
+    srcChange.assertOkStatus();
+
+    CherryPickInput input = new CherryPickInput();
+    input.destination = "foo";
+    input.base = commit1.name();
+    input.message = srcChange.getCommit().getFullMessage();
+    ChangeInfo changeInfo =
+        gApi.changes().id(srcChange.getChangeId()).current().cherryPick(input).get();
+    assertCherryPickResult(changeInfo, input, srcChange.getChangeId());
+  }
+
+  @Test
+  public void canRebase() throws Exception {
+    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
+    PushOneCommit.Result r1 = push.to("refs/for/master");
+    merge(r1);
+
+    push = pushFactory.create(db, admin.getIdent(), testRepo);
+    PushOneCommit.Result r2 = push.to("refs/for/master");
+    boolean canRebase =
+        gApi.changes().id(r2.getChangeId()).revision(r2.getCommit().name()).canRebase();
+    assertThat(canRebase).isFalse();
+    merge(r2);
+
+    testRepo.reset(r1.getCommit());
+    push = pushFactory.create(db, admin.getIdent(), testRepo);
+    PushOneCommit.Result r3 = push.to("refs/for/master");
+
+    canRebase = gApi.changes().id(r3.getChangeId()).revision(r3.getCommit().name()).canRebase();
+    assertThat(canRebase).isTrue();
+  }
+
+  @Test
+  public void setUnsetReviewedFlag() throws Exception {
+    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
+    PushOneCommit.Result r = push.to("refs/for/master");
+
+    gApi.changes().id(r.getChangeId()).current().setReviewed(PushOneCommit.FILE_NAME, true);
+
+    assertThat(Iterables.getOnlyElement(gApi.changes().id(r.getChangeId()).current().reviewed()))
+        .isEqualTo(PushOneCommit.FILE_NAME);
+
+    gApi.changes().id(r.getChangeId()).current().setReviewed(PushOneCommit.FILE_NAME, false);
+
+    assertThat(gApi.changes().id(r.getChangeId()).current().reviewed()).isEmpty();
+  }
+
+  @Test
+  public void setUnsetReviewedFlagByFileApi() throws Exception {
+    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
+    PushOneCommit.Result r = push.to("refs/for/master");
+
+    gApi.changes().id(r.getChangeId()).current().file(PushOneCommit.FILE_NAME).setReviewed(true);
+
+    assertThat(Iterables.getOnlyElement(gApi.changes().id(r.getChangeId()).current().reviewed()))
+        .isEqualTo(PushOneCommit.FILE_NAME);
+
+    gApi.changes().id(r.getChangeId()).current().file(PushOneCommit.FILE_NAME).setReviewed(false);
+
+    assertThat(gApi.changes().id(r.getChangeId()).current().reviewed()).isEmpty();
+  }
+
+  @Test
+  public void mergeable() throws Exception {
+    ObjectId initial = repo().exactRef(HEAD).getLeaf().getObjectId();
+
+    PushOneCommit push1 =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            testRepo,
+            PushOneCommit.SUBJECT,
+            PushOneCommit.FILE_NAME,
+            "push 1 content");
+
+    PushOneCommit.Result r1 = push1.to("refs/for/master");
+    assertMergeable(r1.getChangeId(), true);
+    merge(r1);
+
+    // Reset client HEAD to initial so the new change is a merge conflict.
+    testRepo.reset(initial);
+
+    PushOneCommit push2 =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            testRepo,
+            PushOneCommit.SUBJECT,
+            PushOneCommit.FILE_NAME,
+            "new contents");
+    PushOneCommit.Result r2 = push2.to("refs/for/master");
+    Change.Id id2 = r2.getChange().getId();
+    assertMergeable(r2.getChangeId(), false);
+
+    // Search shows change is not mergeable.
+    Callable<List<ChangeInfo>> search =
+        () -> gApi.changes().query("is:mergeable change:" + r2.getChangeId()).get();
+    assertThat(search.call()).isEmpty();
+
+    // Make the same change in a separate commit and update server HEAD behind Gerrit's back, which
+    // will not reindex any open changes.
+    try (Repository repo = repoManager.openRepository(project)) {
+      TestRepository<?> tr = new TestRepository<>(repo);
+      String ref = "refs/heads/master";
+      assertThat(repo.exactRef(ref).getObjectId()).isEqualTo(r1.getCommit());
+      tr.update(ref, tr.getRevWalk().parseCommit(initial));
+      tr.branch(ref)
+          .commit()
+          .message("Side update")
+          .add(PushOneCommit.FILE_NAME, "new contents")
+          .create();
+    }
+
+    // Search shows change is still not mergeable.
+    assertThat(search.call()).isEmpty();
+
+    // Using the API returns the correct value, and reindexes as well.
+    CountDownLatch reindexed = new CountDownLatch(1);
+    RegistrationHandle handle =
+        changeIndexedListeners.add(
+            "gerrit",
+            new ChangeIndexedListener() {
+              @Override
+              public void onChangeIndexed(String projectName, int id) {
+                if (id == id2.get()) {
+                  reindexed.countDown();
+                }
+              }
+
+              @Override
+              public void onChangeDeleted(int id) {}
+            });
+    try {
+      assertMergeable(r2.getChangeId(), true);
+      reindexed.await();
+    } finally {
+      handle.remove();
+    }
+
+    List<ChangeInfo> changes = search.call();
+    assertThat(changes).hasSize(1);
+    assertThat(changes.get(0).changeId).isEqualTo(r2.getChangeId());
+    assertThat(changes.get(0).mergeable).isEqualTo(Boolean.TRUE);
+
+    // TODO(dborowitz): Test for other-branches.
+  }
+
+  @Test
+  public void files() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Map<String, FileInfo> files =
+        gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).files();
+    assertThat(files).hasSize(2);
+    assertThat(Iterables.all(files.keySet(), f -> f.matches(FILE_NAME + '|' + COMMIT_MSG)))
+        .isTrue();
+  }
+
+  @Test
+  public void filesOnMergeCommitChange() throws Exception {
+    PushOneCommit.Result r = createMergeCommitChange("refs/for/master");
+
+    // list files against auto-merge
+    assertThat(gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).files().keySet())
+        .containsExactly(COMMIT_MSG, MERGE_LIST, "foo", "bar");
+
+    // list files against parent 1
+    assertThat(gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).files(1).keySet())
+        .containsExactly(COMMIT_MSG, MERGE_LIST, "bar");
+
+    // list files against parent 2
+    assertThat(gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).files(2).keySet())
+        .containsExactly(COMMIT_MSG, MERGE_LIST, "foo");
+  }
+
+  @Test
+  public void listFilesOnDifferentBases() throws Exception {
+    PushOneCommit.Result result1 = createChange();
+    String changeId = result1.getChangeId();
+    PushOneCommit.Result result2 = amendChange(changeId, SUBJECT, "b.txt", "b");
+    PushOneCommit.Result result3 = amendChange(changeId, SUBJECT, "c.txt", "c");
+
+    String revId1 = result1.getCommit().name();
+    String revId2 = result2.getCommit().name();
+    String revId3 = result3.getCommit().name();
+
+    assertThat(gApi.changes().id(changeId).revision(revId1).files(null).keySet())
+        .containsExactly(COMMIT_MSG, "a.txt");
+    assertThat(gApi.changes().id(changeId).revision(revId2).files(null).keySet())
+        .containsExactly(COMMIT_MSG, "a.txt", "b.txt");
+    assertThat(gApi.changes().id(changeId).revision(revId3).files(null).keySet())
+        .containsExactly(COMMIT_MSG, "a.txt", "b.txt", "c.txt");
+
+    assertThat(gApi.changes().id(changeId).revision(revId2).files(revId1).keySet())
+        .containsExactly(COMMIT_MSG, "b.txt");
+    assertThat(gApi.changes().id(changeId).revision(revId3).files(revId1).keySet())
+        .containsExactly(COMMIT_MSG, "b.txt", "c.txt");
+    assertThat(gApi.changes().id(changeId).revision(revId3).files(revId2).keySet())
+        .containsExactly(COMMIT_MSG, "c.txt");
+  }
+
+  @Test
+  public void queryRevisionFiles() throws Exception {
+    Map<String, String> files = ImmutableMap.of("file1.txt", "content 1", "file2.txt", "content 2");
+    PushOneCommit.Result result =
+        pushFactory.create(db, admin.getIdent(), testRepo, SUBJECT, files).to("refs/for/master");
+    result.assertOkStatus();
+    String changeId = result.getChangeId();
+
+    assertThat(gApi.changes().id(changeId).current().queryFiles("file1.txt"))
+        .containsExactly("file1.txt");
+    assertThat(gApi.changes().id(changeId).current().queryFiles("file2.txt"))
+        .containsExactly("file2.txt");
+    assertThat(gApi.changes().id(changeId).current().queryFiles("file1"))
+        .containsExactly("file1.txt");
+    assertThat(gApi.changes().id(changeId).current().queryFiles("file2"))
+        .containsExactly("file2.txt");
+    assertThat(gApi.changes().id(changeId).current().queryFiles("file"))
+        .containsExactly("file1.txt", "file2.txt");
+    assertThat(gApi.changes().id(changeId).current().queryFiles(""))
+        .containsExactly("file1.txt", "file2.txt");
+  }
+
+  @Test
+  public void description() throws Exception {
+    PushOneCommit.Result r = createChange();
+    assertDescription(r, "");
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).description("test");
+    assertDescription(r, "test");
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).description("");
+    assertDescription(r, "");
+  }
+
+  @Test
+  public void setDescriptionNotAllowedWithoutPermission() throws Exception {
+    PushOneCommit.Result r = createChange();
+    assertDescription(r, "");
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    exception.expectMessage("edit description not permitted");
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).description("test");
+  }
+
+  @Test
+  public void setDescriptionAllowedWithPermission() throws Exception {
+    PushOneCommit.Result r = createChange();
+    assertDescription(r, "");
+    grant(project, "refs/heads/master", Permission.OWNER, false, REGISTERED_USERS);
+    setApiUser(user);
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).description("test");
+    assertDescription(r, "test");
+  }
+
+  private void assertDescription(PushOneCommit.Result r, String expected) throws Exception {
+    assertThat(gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).description())
+        .isEqualTo(expected);
+  }
+
+  @Test
+  public void content() throws Exception {
+    PushOneCommit.Result r = createChange();
+    assertContent(r, FILE_NAME, FILE_CONTENT);
+    assertContent(r, COMMIT_MSG, r.getCommit().getFullMessage());
+  }
+
+  @Test
+  public void contentType() throws Exception {
+    PushOneCommit.Result r = createChange();
+
+    String endPoint =
+        "/changes/"
+            + r.getChangeId()
+            + "/revisions/"
+            + r.getCommit().name()
+            + "/files/"
+            + FILE_NAME
+            + "/content";
+    RestResponse response = adminRestSession.head(endPoint);
+    response.assertOK();
+    assertThat(response.getContentType()).startsWith("text/plain");
+    assertThat(response.hasContent()).isFalse();
+  }
+
+  @Test
+  public void commit() throws Exception {
+    WebLinkInfo expectedWebLinkInfo = new WebLinkInfo("foo", "imageUrl", "url");
+    RegistrationHandle handle =
+        patchSetLinks.add(
+            "gerrit",
+            new PatchSetWebLink() {
+              @Override
+              public WebLinkInfo getPatchSetWebLink(String projectName, String commit) {
+                return expectedWebLinkInfo;
+              }
+            });
+
+    try {
+      PushOneCommit.Result r = createChange();
+      RevCommit c = r.getCommit();
+
+      CommitInfo commitInfo = gApi.changes().id(r.getChangeId()).current().commit(false);
+      assertThat(commitInfo.commit).isEqualTo(c.name());
+      assertPersonIdent(commitInfo.author, c.getAuthorIdent());
+      assertPersonIdent(commitInfo.committer, c.getCommitterIdent());
+      assertThat(commitInfo.message).isEqualTo(c.getFullMessage());
+      assertThat(commitInfo.subject).isEqualTo(c.getShortMessage());
+      assertThat(commitInfo.parents).hasSize(1);
+      assertThat(Iterables.getOnlyElement(commitInfo.parents).commit)
+          .isEqualTo(c.getParent(0).name());
+      assertThat(commitInfo.webLinks).isNull();
+
+      commitInfo = gApi.changes().id(r.getChangeId()).current().commit(true);
+      assertThat(commitInfo.webLinks).hasSize(1);
+      WebLinkInfo webLinkInfo = Iterables.getOnlyElement(commitInfo.webLinks);
+      assertThat(webLinkInfo.name).isEqualTo(expectedWebLinkInfo.name);
+      assertThat(webLinkInfo.imageUrl).isEqualTo(expectedWebLinkInfo.imageUrl);
+      assertThat(webLinkInfo.url).isEqualTo(expectedWebLinkInfo.url);
+      assertThat(webLinkInfo.target).isEqualTo(expectedWebLinkInfo.target);
+    } finally {
+      handle.remove();
+    }
+  }
+
+  private void assertPersonIdent(GitPerson gitPerson, PersonIdent expectedIdent) {
+    assertThat(gitPerson.name).isEqualTo(expectedIdent.getName());
+    assertThat(gitPerson.email).isEqualTo(expectedIdent.getEmailAddress());
+    assertThat(gitPerson.date).isEqualTo(new Timestamp(expectedIdent.getWhen().getTime()));
+    assertThat(gitPerson.tz).isEqualTo(expectedIdent.getTimeZoneOffset());
+  }
+
+  private void assertMergeable(String id, boolean expected) throws Exception {
+    MergeableInfo m = gApi.changes().id(id).current().mergeable();
+    assertThat(m.mergeable).isEqualTo(expected);
+    assertThat(m.submitType).isEqualTo(SubmitType.MERGE_IF_NECESSARY);
+    assertThat(m.mergeableInto).isNull();
+    ChangeInfo c = gApi.changes().id(id).info();
+    assertThat(c.mergeable).isEqualTo(expected);
+  }
+
+  @Test
+  public void drafts() throws Exception {
+    PushOneCommit.Result r = createChange();
+    DraftInput in = new DraftInput();
+    in.line = 1;
+    in.message = "nit: trailing whitespace";
+    in.path = FILE_NAME;
+
+    DraftApi draftApi =
+        gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).createDraft(in);
+    assertThat(draftApi.get().message).isEqualTo(in.message);
+    assertThat(
+            gApi.changes()
+                .id(r.getChangeId())
+                .revision(r.getCommit().name())
+                .draft(draftApi.get().id)
+                .get()
+                .message)
+        .isEqualTo(in.message);
+    assertThat(gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).drafts())
+        .hasSize(1);
+
+    in.message = "good catch!";
+    assertThat(
+            gApi.changes()
+                .id(r.getChangeId())
+                .revision(r.getCommit().name())
+                .draft(draftApi.get().id)
+                .update(in)
+                .message)
+        .isEqualTo(in.message);
+
+    assertThat(
+            gApi.changes()
+                .id(r.getChangeId())
+                .revision(r.getCommit().name())
+                .draft(draftApi.get().id)
+                .get()
+                .author
+                .email)
+        .isEqualTo(admin.email);
+
+    draftApi.delete();
+    assertThat(gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).drafts())
+        .isEmpty();
+  }
+
+  @Test
+  public void comments() throws Exception {
+    PushOneCommit.Result r = createChange();
+    CommentInput in = new CommentInput();
+    in.line = 1;
+    in.message = "nit: trailing whitespace";
+    in.path = FILE_NAME;
+    ReviewInput reviewInput = new ReviewInput();
+    Map<String, List<CommentInput>> comments = new HashMap<>();
+    comments.put(FILE_NAME, Collections.singletonList(in));
+    reviewInput.comments = comments;
+    reviewInput.message = "comment test";
+    gApi.changes().id(r.getChangeId()).current().review(reviewInput);
+
+    Map<String, List<CommentInfo>> out =
+        gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).comments();
+    assertThat(out).hasSize(1);
+    CommentInfo comment = Iterables.getOnlyElement(out.get(FILE_NAME));
+    assertThat(comment.message).isEqualTo(in.message);
+    assertThat(comment.author.email).isEqualTo(admin.email);
+    assertThat(comment.path).isNull();
+
+    List<CommentInfo> list =
+        gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).commentsAsList();
+    assertThat(list).hasSize(1);
+
+    CommentInfo comment2 = list.get(0);
+    assertThat(comment2.path).isEqualTo(FILE_NAME);
+    assertThat(comment2.line).isEqualTo(comment.line);
+    assertThat(comment2.message).isEqualTo(comment.message);
+    assertThat(comment2.author.email).isEqualTo(comment.author.email);
+
+    assertThat(
+            gApi.changes()
+                .id(r.getChangeId())
+                .revision(r.getCommit().name())
+                .comment(comment.id)
+                .get()
+                .message)
+        .isEqualTo(in.message);
+  }
+
+  @Test
+  public void commentOnNonExistingFile() throws Exception {
+    PushOneCommit.Result r = createChange();
+    r = updateChange(r, "new content");
+    CommentInput in = new CommentInput();
+    in.line = 1;
+    in.message = "nit: trailing whitespace";
+    in.path = "non-existing.txt";
+    ReviewInput reviewInput = new ReviewInput();
+    Map<String, List<CommentInput>> comments = new HashMap<>();
+    comments.put("non-existing.txt", Collections.singletonList(in));
+    reviewInput.comments = comments;
+    reviewInput.message = "comment test";
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage(
+        String.format("not found in revision %d,1", r.getChange().change().getId().id));
+    gApi.changes().id(r.getChangeId()).revision(1).review(reviewInput);
+  }
+
+  @Test
+  public void patch() throws Exception {
+    PushOneCommit.Result r = createChange();
+    ChangeApi changeApi = gApi.changes().id(r.getChangeId());
+    BinaryResult bin = changeApi.revision(r.getCommit().name()).patch();
+    ByteArrayOutputStream os = new ByteArrayOutputStream();
+    bin.writeTo(os);
+    String res = new String(os.toByteArray(), UTF_8);
+    ChangeInfo change = changeApi.get();
+    RevisionInfo rev = change.revisions.get(change.currentRevision);
+    DateFormat df = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US);
+    String date = df.format(rev.commit.author.date);
+    assertThat(res).isEqualTo(String.format(PATCH, r.getCommit().name(), date, r.getChangeId()));
+  }
+
+  @Test
+  public void patchWithPath() throws Exception {
+    PushOneCommit.Result r = createChange();
+    ChangeApi changeApi = gApi.changes().id(r.getChangeId());
+    BinaryResult bin = changeApi.revision(r.getCommit().name()).patch(FILE_NAME);
+    ByteArrayOutputStream os = new ByteArrayOutputStream();
+    bin.writeTo(os);
+    String res = new String(os.toByteArray(), UTF_8);
+    assertThat(res).isEqualTo(PATCH_FILE_ONLY);
+
+    exception.expect(ResourceNotFoundException.class);
+    exception.expectMessage("File not found: nonexistent-file.");
+    changeApi.revision(r.getCommit().name()).patch("nonexistent-file");
+  }
+
+  @Test
+  public void actions() throws Exception {
+    PushOneCommit.Result r = createChange();
+    assertThat(current(r).actions().keySet())
+        .containsExactly("cherrypick", "description", "rebase");
+
+    current(r).review(ReviewInput.approve());
+    assertThat(current(r).actions().keySet())
+        .containsExactly("submit", "cherrypick", "description", "rebase");
+
+    current(r).submit();
+    assertThat(current(r).actions().keySet()).containsExactly("cherrypick");
+  }
+
+  @Test
+  public void actionsETag() throws Exception {
+    PushOneCommit.Result r1 = createChange();
+    PushOneCommit.Result r2 = createChange();
+
+    String oldETag = checkETag(getRevisionActions, r2, null);
+    current(r2).review(ReviewInput.approve());
+    oldETag = checkETag(getRevisionActions, r2, oldETag);
+
+    // Dependent change is included in ETag.
+    current(r1).review(ReviewInput.approve());
+    oldETag = checkETag(getRevisionActions, r2, oldETag);
+
+    current(r2).submit();
+    checkETag(getRevisionActions, r2, oldETag);
+  }
+
+  @Test
+  public void deleteVoteOnNonCurrentPatchSet() throws Exception {
+    PushOneCommit.Result r = createChange(); // patch set 1
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
+
+    // patch set 2
+    amendChange(r.getChangeId());
+
+    // code-review
+    setApiUser(user);
+    recommend(r.getChangeId());
+
+    // check if it's blocked to delete a vote on a non-current patch set.
+    setApiUser(admin);
+    exception.expect(MethodNotAllowedException.class);
+    exception.expectMessage("Cannot access on non-current patch set");
+    gApi.changes()
+        .id(r.getChangeId())
+        .revision(r.getCommit().getName())
+        .reviewer(user.getId().toString())
+        .deleteVote("Code-Review");
+  }
+
+  @Test
+  public void deleteVoteOnCurrentPatchSet() throws Exception {
+    PushOneCommit.Result r = createChange(); // patch set 1
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
+
+    // patch set 2
+    amendChange(r.getChangeId());
+
+    // code-review
+    setApiUser(user);
+    recommend(r.getChangeId());
+
+    setApiUser(admin);
+    gApi.changes()
+        .id(r.getChangeId())
+        .current()
+        .reviewer(user.getId().toString())
+        .deleteVote("Code-Review");
+
+    Map<String, Short> m =
+        gApi.changes().id(r.getChangeId()).current().reviewer(user.getId().toString()).votes();
+
+    assertThat(m).containsExactly("Code-Review", Short.valueOf((short) 0));
+
+    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
+    ChangeMessageInfo message = Iterables.getLast(c.messages);
+    assertThat(message.author._accountId).isEqualTo(admin.getId().get());
+    assertThat(message.message).isEqualTo("Removed Code-Review+1 by User <user@example.com>\n");
+    assertThat(getReviewers(c.reviewers.get(ReviewerState.REVIEWER)))
+        .containsExactlyElementsIn(ImmutableSet.of(admin.getId(), user.getId()));
+  }
+
+  @Test
+  public void listVotesByRevision() throws Exception {
+    // Create patch set 1 and vote on it
+    String changeId = createChange().getChangeId();
+    ListMultimap<String, ApprovalInfo> votes = gApi.changes().id(changeId).current().votes();
+    assertThat(votes).isEmpty();
+    recommend(changeId);
+    votes = gApi.changes().id(changeId).current().votes();
+    assertThat(votes.keySet()).containsExactly("Code-Review");
+    List<ApprovalInfo> approvals = votes.get("Code-Review");
+    assertThat(approvals).hasSize(1);
+    ApprovalInfo approval = approvals.get(0);
+    assertThat(approval._accountId).isEqualTo(admin.id.get());
+    assertThat(approval.email).isEqualTo(admin.email);
+    assertThat(approval.username).isEqualTo(admin.username);
+
+    // Also vote on it with another user
+    setApiUser(user);
+    gApi.changes().id(changeId).current().review(ReviewInput.dislike());
+
+    // Patch set 1 has 2 votes on Code-Review
+    setApiUser(admin);
+    votes = gApi.changes().id(changeId).current().votes();
+    assertThat(votes.keySet()).containsExactly("Code-Review");
+    approvals = votes.get("Code-Review");
+    assertThat(approvals).hasSize(2);
+    assertThat(approvals.stream().map(a -> a._accountId))
+        .containsExactlyElementsIn(ImmutableList.of(admin.id.get(), user.id.get()));
+
+    // Create a new patch set which does not have any votes
+    amendChange(changeId);
+    votes = gApi.changes().id(changeId).current().votes();
+    assertThat(votes).isEmpty();
+
+    // Votes are still returned for ps 1
+    votes = gApi.changes().id(changeId).revision(1).votes();
+    assertThat(votes.keySet()).containsExactly("Code-Review");
+    approvals = votes.get("Code-Review");
+    assertThat(approvals).hasSize(2);
+  }
+
+  private static void assertCherryPickResult(
+      ChangeInfo changeInfo, CherryPickInput input, String srcChangeId) throws Exception {
+    assertThat(changeInfo.changeId).isEqualTo(srcChangeId);
+    assertThat(changeInfo.revisions.keySet()).containsExactly(changeInfo.currentRevision);
+    RevisionInfo revisionInfo = changeInfo.revisions.get(changeInfo.currentRevision);
+    assertThat(revisionInfo.commit.message).isEqualTo(input.message);
+    assertThat(revisionInfo.commit.parents).hasSize(1);
+    assertThat(revisionInfo.commit.parents.get(0).commit).isEqualTo(input.base);
+  }
+
+  private PushOneCommit.Result updateChange(PushOneCommit.Result r, String content)
+      throws Exception {
+    PushOneCommit push =
+        pushFactory.create(
+            db, admin.getIdent(), testRepo, "test commit", "a.txt", content, r.getChangeId());
+    return push.to("refs/for/master");
+  }
+
+  private RevisionApi current(PushOneCommit.Result r) throws Exception {
+    return gApi.changes().id(r.getChangeId()).current();
+  }
+
+  private String checkETag(ETagView<RevisionResource> view, PushOneCommit.Result r, String oldETag)
+      throws Exception {
+    String eTag = view.getETag(parseRevisionResource(r));
+    assertThat(eTag).isNotEqualTo(oldETag);
+    return eTag;
+  }
+
+  private PushOneCommit.Result createCherryPickableMerge(
+      String parent1FileName, String parent2FileName) throws Exception {
+    RevCommit initialCommit = getHead(repo());
+
+    String branchAName = "branchA";
+    createBranch(new Branch.NameKey(project, branchAName));
+    String branchBName = "branchB";
+    createBranch(new Branch.NameKey(project, branchBName));
+
+    PushOneCommit.Result changeAResult =
+        pushFactory
+            .create(db, admin.getIdent(), testRepo, "change a", parent1FileName, "Content of a")
+            .to("refs/for/" + branchAName);
+
+    testRepo.reset(initialCommit);
+    PushOneCommit.Result changeBResult =
+        pushFactory
+            .create(db, admin.getIdent(), testRepo, "change b", parent2FileName, "Content of b")
+            .to("refs/for/" + branchBName);
+
+    PushOneCommit pushableMergeCommit =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            testRepo,
+            "merge",
+            ImmutableMap.of(parent1FileName, "Content of a", parent2FileName, "Content of b"));
+    pushableMergeCommit.setParents(
+        ImmutableList.of(changeAResult.getCommit(), changeBResult.getCommit()));
+    PushOneCommit.Result mergeChangeResult = pushableMergeCommit.to("refs/for/" + branchAName);
+    mergeChangeResult.assertOkStatus();
+    return mergeChangeResult;
+  }
+
+  private ApprovalInfo getApproval(String changeId, String label) throws Exception {
+    ChangeInfo info = gApi.changes().id(changeId).get(DETAILED_LABELS);
+    LabelInfo li = info.labels.get(label);
+    assertThat(li).isNotNull();
+    int accountId = atrScope.get().getUser().getAccountId().get();
+    return li.all.stream().filter(a -> a._accountId == accountId).findFirst().get();
+  }
+
+  private static Iterable<Account.Id> getReviewers(Collection<AccountInfo> r) {
+    return Iterables.transform(r, a -> new Account.Id(a._accountId));
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/api/revision/RobotCommentsIT.java b/javatests/com/google/gerrit/acceptance/api/revision/RobotCommentsIT.java
new file mode 100644
index 0000000..dfd25e2
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/revision/RobotCommentsIT.java
@@ -0,0 +1,1150 @@
+// 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.
+
+package com.google.gerrit.acceptance.api.revision;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static com.google.gerrit.acceptance.PushOneCommit.SUBJECT;
+import static com.google.gerrit.extensions.common.testing.EditInfoSubject.assertThat;
+import static com.google.gerrit.extensions.common.testing.RobotCommentInfoSubject.assertThatList;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.AcceptanceTestRequestScope;
+import com.google.gerrit.acceptance.GerritConfig;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput.RobotCommentInput;
+import com.google.gerrit.extensions.client.Comment;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.EditInfo;
+import com.google.gerrit.extensions.common.FixReplacementInfo;
+import com.google.gerrit.extensions.common.FixSuggestionInfo;
+import com.google.gerrit.extensions.common.RobotCommentInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.BinaryResult;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.testing.BinaryResultSubject;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import org.junit.Before;
+import org.junit.Test;
+
+public class RobotCommentsIT extends AbstractDaemonTest {
+  private static final String FILE_NAME = "file_to_fix.txt";
+  private static final String FILE_NAME2 = "another_file_to_fix.txt";
+  private static final String FILE_CONTENT =
+      "First line\nSecond line\nThird line\nFourth line\nFifth line\nSixth line"
+          + "\nSeventh line\nEighth line\nNinth line\nTenth line\n";
+  private static final String FILE_CONTENT2 = "1st line\n2nd line\n3rd line\n";
+
+  private String changeId;
+  private FixReplacementInfo fixReplacementInfo;
+  private FixSuggestionInfo fixSuggestionInfo;
+  private RobotCommentInput withFixRobotCommentInput;
+
+  @Before
+  public void setUp() throws Exception {
+    PushOneCommit push =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            testRepo,
+            "Provide files which can be used for fixes",
+            ImmutableMap.of(FILE_NAME, FILE_CONTENT, FILE_NAME2, FILE_CONTENT2));
+    PushOneCommit.Result changeResult = push.to("refs/for/master");
+    changeId = changeResult.getChangeId();
+
+    fixReplacementInfo = createFixReplacementInfo();
+    fixSuggestionInfo = createFixSuggestionInfo(fixReplacementInfo);
+    withFixRobotCommentInput = createRobotCommentInput(fixSuggestionInfo);
+  }
+
+  @Test
+  public void retrievingRobotCommentsBeforeAddingAnyDoesNotRaiseAnException() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    Map<String, List<RobotCommentInfo>> robotComments =
+        gApi.changes().id(changeId).current().robotComments();
+
+    assertThat(robotComments).isNotNull();
+    assertThat(robotComments).isEmpty();
+  }
+
+  @Test
+  public void addedRobotCommentsCanBeRetrieved() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    RobotCommentInput in = createRobotCommentInput();
+    addRobotComment(changeId, in);
+
+    Map<String, List<RobotCommentInfo>> out = gApi.changes().id(changeId).current().robotComments();
+
+    assertThat(out).hasSize(1);
+    RobotCommentInfo comment = Iterables.getOnlyElement(out.get(in.path));
+    assertRobotComment(comment, in, false);
+  }
+
+  @Test
+  public void addedRobotCommentsCanBeRetrievedByChange() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    RobotCommentInput in = createRobotCommentInput();
+    addRobotComment(changeId, in);
+
+    pushFactory.create(db, admin.getIdent(), testRepo, changeId).to("refs/for/master");
+
+    RobotCommentInput in2 = createRobotCommentInput();
+    addRobotComment(changeId, in2);
+
+    Map<String, List<RobotCommentInfo>> out = gApi.changes().id(changeId).robotComments();
+
+    assertThat(out).hasSize(1);
+    assertThat(out.get(in.path)).hasSize(2);
+
+    RobotCommentInfo comment1 = out.get(in.path).get(0);
+    assertRobotComment(comment1, in, false);
+    RobotCommentInfo comment2 = out.get(in.path).get(1);
+    assertRobotComment(comment2, in2, false);
+  }
+
+  @Test
+  public void robotCommentsCanBeRetrievedAsList() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    RobotCommentInput robotCommentInput = createRobotCommentInput();
+    addRobotComment(changeId, robotCommentInput);
+
+    List<RobotCommentInfo> robotCommentInfos =
+        gApi.changes().id(changeId).current().robotCommentsAsList();
+
+    assertThat(robotCommentInfos).hasSize(1);
+    RobotCommentInfo robotCommentInfo = Iterables.getOnlyElement(robotCommentInfos);
+    assertRobotComment(robotCommentInfo, robotCommentInput);
+  }
+
+  @Test
+  public void specificRobotCommentCanBeRetrieved() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    RobotCommentInput robotCommentInput = createRobotCommentInput();
+    addRobotComment(changeId, robotCommentInput);
+
+    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
+    RobotCommentInfo robotCommentInfo = Iterables.getOnlyElement(robotCommentInfos);
+
+    RobotCommentInfo specificRobotCommentInfo =
+        gApi.changes().id(changeId).current().robotComment(robotCommentInfo.id).get();
+    assertRobotComment(specificRobotCommentInfo, robotCommentInput);
+  }
+
+  @Test
+  public void robotCommentWithoutOptionalFieldsCanBeAdded() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    RobotCommentInput in = createRobotCommentInputWithMandatoryFields();
+    addRobotComment(changeId, in);
+
+    Map<String, List<RobotCommentInfo>> out = gApi.changes().id(changeId).current().robotComments();
+    assertThat(out).hasSize(1);
+    RobotCommentInfo comment = Iterables.getOnlyElement(out.get(in.path));
+    assertRobotComment(comment, in, false);
+  }
+
+  @Test
+  public void hugeRobotCommentIsRejected() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    int defaultSizeLimit = 1024 * 1024;
+    int sizeOfRest = 451;
+    fixReplacementInfo.replacement = getStringFor(defaultSizeLimit - sizeOfRest + 1);
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("limit");
+    addRobotComment(changeId, withFixRobotCommentInput);
+  }
+
+  @Test
+  public void reasonablyLargeRobotCommentIsAccepted() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    int defaultSizeLimit = 1024 * 1024;
+    int sizeOfRest = 451;
+    fixReplacementInfo.replacement = getStringFor(defaultSizeLimit - sizeOfRest);
+
+    addRobotComment(changeId, withFixRobotCommentInput);
+
+    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
+    assertThat(robotCommentInfos).hasSize(1);
+  }
+
+  @Test
+  @GerritConfig(name = "change.robotCommentSizeLimit", value = "10k")
+  public void maximumAllowedSizeOfRobotCommentCanBeAdjusted() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    int sizeLimit = 10 * 1024;
+    fixReplacementInfo.replacement = getStringFor(sizeLimit);
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("limit");
+    addRobotComment(changeId, withFixRobotCommentInput);
+  }
+
+  @Test
+  @GerritConfig(name = "change.robotCommentSizeLimit", value = "0")
+  public void zeroForMaximumAllowedSizeOfRobotCommentRemovesRestriction() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    int defaultSizeLimit = 1024 * 1024;
+    fixReplacementInfo.replacement = getStringFor(defaultSizeLimit);
+
+    addRobotComment(changeId, withFixRobotCommentInput);
+
+    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
+    assertThat(robotCommentInfos).hasSize(1);
+  }
+
+  @Test
+  @GerritConfig(name = "change.robotCommentSizeLimit", value = "-1")
+  public void negativeValueForMaximumAllowedSizeOfRobotCommentRemovesRestriction()
+      throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    int defaultSizeLimit = 1024 * 1024;
+    fixReplacementInfo.replacement = getStringFor(defaultSizeLimit);
+
+    addRobotComment(changeId, withFixRobotCommentInput);
+
+    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
+    assertThat(robotCommentInfos).hasSize(1);
+  }
+
+  @Test
+  public void addedFixSuggestionCanBeRetrieved() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    addRobotComment(changeId, withFixRobotCommentInput);
+    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
+
+    assertThatList(robotCommentInfos).onlyElement().onlyFixSuggestion().isNotNull();
+  }
+
+  @Test
+  public void fixIdIsGeneratedForFixSuggestion() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    addRobotComment(changeId, withFixRobotCommentInput);
+    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
+
+    assertThatList(robotCommentInfos).onlyElement().onlyFixSuggestion().fixId().isNotEmpty();
+    assertThatList(robotCommentInfos)
+        .onlyElement()
+        .onlyFixSuggestion()
+        .fixId()
+        .isNotEqualTo(fixSuggestionInfo.fixId);
+  }
+
+  @Test
+  public void descriptionOfFixSuggestionIsAcceptedAsIs() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    addRobotComment(changeId, withFixRobotCommentInput);
+    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
+
+    assertThatList(robotCommentInfos)
+        .onlyElement()
+        .onlyFixSuggestion()
+        .description()
+        .isEqualTo(fixSuggestionInfo.description);
+  }
+
+  @Test
+  public void descriptionOfFixSuggestionIsMandatory() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    fixSuggestionInfo.description = null;
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage(
+        String.format(
+            "A description is required for the suggested fix of the robot comment on %s",
+            withFixRobotCommentInput.path));
+    addRobotComment(changeId, withFixRobotCommentInput);
+  }
+
+  @Test
+  public void addedFixReplacementCanBeRetrieved() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    addRobotComment(changeId, withFixRobotCommentInput);
+    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
+
+    assertThatList(robotCommentInfos)
+        .onlyElement()
+        .onlyFixSuggestion()
+        .onlyReplacement()
+        .isNotNull();
+  }
+
+  @Test
+  public void fixReplacementsAreMandatory() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    fixSuggestionInfo.replacements = Collections.emptyList();
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage(
+        String.format(
+            "At least one replacement is required"
+                + " for the suggested fix of the robot comment on %s",
+            withFixRobotCommentInput.path));
+    addRobotComment(changeId, withFixRobotCommentInput);
+  }
+
+  @Test
+  public void pathOfFixReplacementIsAcceptedAsIs() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    addRobotComment(changeId, withFixRobotCommentInput);
+
+    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
+
+    assertThatList(robotCommentInfos)
+        .onlyElement()
+        .onlyFixSuggestion()
+        .onlyReplacement()
+        .path()
+        .isEqualTo(fixReplacementInfo.path);
+  }
+
+  @Test
+  public void pathOfFixReplacementIsMandatory() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    fixReplacementInfo.path = null;
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage(
+        String.format(
+            "A file path must be given for the replacement of the robot comment on %s",
+            withFixRobotCommentInput.path));
+    addRobotComment(changeId, withFixRobotCommentInput);
+  }
+
+  @Test
+  public void rangeOfFixReplacementIsAcceptedAsIs() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    addRobotComment(changeId, withFixRobotCommentInput);
+
+    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
+
+    assertThatList(robotCommentInfos)
+        .onlyElement()
+        .onlyFixSuggestion()
+        .onlyReplacement()
+        .range()
+        .isEqualTo(fixReplacementInfo.range);
+  }
+
+  @Test
+  public void rangeOfFixReplacementIsMandatory() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    fixReplacementInfo.range = null;
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage(
+        String.format(
+            "A range must be given for the replacement of the robot comment on %s",
+            withFixRobotCommentInput.path));
+    addRobotComment(changeId, withFixRobotCommentInput);
+  }
+
+  @Test
+  public void rangeOfFixReplacementNeedsToBeValid() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    fixReplacementInfo.range = createRange(13, 9, 5, 10);
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("Range (13:9 - 5:10)");
+    addRobotComment(changeId, withFixRobotCommentInput);
+  }
+
+  @Test
+  public void rangesOfFixReplacementsOfSameFixSuggestionForSameFileMayNotOverlap()
+      throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    FixReplacementInfo fixReplacementInfo1 = new FixReplacementInfo();
+    fixReplacementInfo1.path = FILE_NAME;
+    fixReplacementInfo1.range = createRange(2, 0, 3, 1);
+    fixReplacementInfo1.replacement = "First modification\n";
+
+    FixReplacementInfo fixReplacementInfo2 = new FixReplacementInfo();
+    fixReplacementInfo2.path = FILE_NAME;
+    fixReplacementInfo2.range = createRange(3, 0, 4, 0);
+    fixReplacementInfo2.replacement = "Second modification\n";
+
+    FixSuggestionInfo fixSuggestionInfo =
+        createFixSuggestionInfo(fixReplacementInfo1, fixReplacementInfo2);
+    withFixRobotCommentInput.fixSuggestions = ImmutableList.of(fixSuggestionInfo);
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("overlap");
+    addRobotComment(changeId, withFixRobotCommentInput);
+  }
+
+  @Test
+  public void rangesOfFixReplacementsOfSameFixSuggestionForDifferentFileMayOverlap()
+      throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    FixReplacementInfo fixReplacementInfo1 = new FixReplacementInfo();
+    fixReplacementInfo1.path = FILE_NAME;
+    fixReplacementInfo1.range = createRange(2, 0, 3, 1);
+    fixReplacementInfo1.replacement = "First modification\n";
+
+    FixReplacementInfo fixReplacementInfo2 = new FixReplacementInfo();
+    fixReplacementInfo2.path = FILE_NAME2;
+    fixReplacementInfo2.range = createRange(3, 0, 4, 0);
+    fixReplacementInfo2.replacement = "Second modification\n";
+
+    FixSuggestionInfo fixSuggestionInfo =
+        createFixSuggestionInfo(fixReplacementInfo1, fixReplacementInfo2);
+    withFixRobotCommentInput.fixSuggestions = ImmutableList.of(fixSuggestionInfo);
+
+    addRobotComment(changeId, withFixRobotCommentInput);
+
+    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
+    assertThatList(robotCommentInfos).onlyElement().fixSuggestions().hasSize(1);
+  }
+
+  @Test
+  public void rangesOfFixReplacementsOfDifferentFixSuggestionsForSameFileMayOverlap()
+      throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    FixReplacementInfo fixReplacementInfo1 = new FixReplacementInfo();
+    fixReplacementInfo1.path = FILE_NAME;
+    fixReplacementInfo1.range = createRange(2, 0, 3, 1);
+    fixReplacementInfo1.replacement = "First modification\n";
+    FixSuggestionInfo fixSuggestionInfo1 = createFixSuggestionInfo(fixReplacementInfo1);
+
+    FixReplacementInfo fixReplacementInfo2 = new FixReplacementInfo();
+    fixReplacementInfo2.path = FILE_NAME;
+    fixReplacementInfo2.range = createRange(3, 0, 4, 0);
+    fixReplacementInfo2.replacement = "Second modification\n";
+    FixSuggestionInfo fixSuggestionInfo2 = createFixSuggestionInfo(fixReplacementInfo2);
+
+    withFixRobotCommentInput.fixSuggestions =
+        ImmutableList.of(fixSuggestionInfo1, fixSuggestionInfo2);
+
+    addRobotComment(changeId, withFixRobotCommentInput);
+
+    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
+    assertThatList(robotCommentInfos).onlyElement().fixSuggestions().hasSize(2);
+  }
+
+  @Test
+  public void fixReplacementsDoNotNeedToBeOrderedAccordingToRange() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    FixReplacementInfo fixReplacementInfo1 = new FixReplacementInfo();
+    fixReplacementInfo1.path = FILE_NAME;
+    fixReplacementInfo1.range = createRange(2, 0, 3, 0);
+    fixReplacementInfo1.replacement = "First modification\n";
+
+    FixReplacementInfo fixReplacementInfo2 = new FixReplacementInfo();
+    fixReplacementInfo2.path = FILE_NAME;
+    fixReplacementInfo2.range = createRange(3, 0, 4, 0);
+    fixReplacementInfo2.replacement = "Second modification\n";
+
+    FixReplacementInfo fixReplacementInfo3 = new FixReplacementInfo();
+    fixReplacementInfo3.path = FILE_NAME;
+    fixReplacementInfo3.range = createRange(4, 0, 5, 0);
+    fixReplacementInfo3.replacement = "Third modification\n";
+
+    FixSuggestionInfo fixSuggestionInfo =
+        createFixSuggestionInfo(fixReplacementInfo2, fixReplacementInfo1, fixReplacementInfo3);
+    withFixRobotCommentInput.fixSuggestions = ImmutableList.of(fixSuggestionInfo);
+
+    addRobotComment(changeId, withFixRobotCommentInput);
+
+    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
+    assertThatList(robotCommentInfos).onlyElement().onlyFixSuggestion().replacements().hasSize(3);
+  }
+
+  @Test
+  public void replacementStringOfFixReplacementIsAcceptedAsIs() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    addRobotComment(changeId, withFixRobotCommentInput);
+
+    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
+
+    assertThatList(robotCommentInfos)
+        .onlyElement()
+        .onlyFixSuggestion()
+        .onlyReplacement()
+        .replacement()
+        .isEqualTo(fixReplacementInfo.replacement);
+  }
+
+  @Test
+  public void replacementStringOfFixReplacementIsMandatory() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    fixReplacementInfo.replacement = null;
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage(
+        String.format(
+            "A content for replacement must be "
+                + "indicated for the replacement of the robot comment on %s",
+            withFixRobotCommentInput.path));
+    addRobotComment(changeId, withFixRobotCommentInput);
+  }
+
+  @Test
+  public void fixWithinALineCanBeApplied() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    fixReplacementInfo.path = FILE_NAME;
+    fixReplacementInfo.replacement = "Modified content";
+    fixReplacementInfo.range = createRange(3, 1, 3, 3);
+
+    addRobotComment(changeId, withFixRobotCommentInput);
+    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
+
+    List<String> fixIds = getFixIds(robotCommentInfos);
+    String fixId = Iterables.getOnlyElement(fixIds);
+
+    gApi.changes().id(changeId).current().applyFix(fixId);
+
+    Optional<BinaryResult> file = gApi.changes().id(changeId).edit().getFile(FILE_NAME);
+    BinaryResultSubject.assertThat(file)
+        .value()
+        .asString()
+        .isEqualTo(
+            "First line\nSecond line\nTModified contentrd line\nFourth line\nFifth line\n"
+                + "Sixth line\nSeventh line\nEighth line\nNinth line\nTenth line\n");
+  }
+
+  @Test
+  public void fixSpanningMultipleLinesCanBeApplied() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    fixReplacementInfo.path = FILE_NAME;
+    fixReplacementInfo.replacement = "Modified content\n5";
+    fixReplacementInfo.range = createRange(3, 2, 5, 3);
+
+    addRobotComment(changeId, withFixRobotCommentInput);
+    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
+    List<String> fixIds = getFixIds(robotCommentInfos);
+    String fixId = Iterables.getOnlyElement(fixIds);
+
+    gApi.changes().id(changeId).current().applyFix(fixId);
+
+    Optional<BinaryResult> file = gApi.changes().id(changeId).edit().getFile(FILE_NAME);
+    BinaryResultSubject.assertThat(file)
+        .value()
+        .asString()
+        .isEqualTo(
+            "First line\nSecond line\nThModified content\n5th line\nSixth line\nSeventh line\n"
+                + "Eighth line\nNinth line\nTenth line\n");
+  }
+
+  @Test
+  public void fixWithTwoCloseReplacementsOnSameFileCanBeApplied() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    FixReplacementInfo fixReplacementInfo1 = new FixReplacementInfo();
+    fixReplacementInfo1.path = FILE_NAME;
+    fixReplacementInfo1.range = createRange(2, 0, 3, 0);
+    fixReplacementInfo1.replacement = "First modification\n";
+
+    FixReplacementInfo fixReplacementInfo2 = new FixReplacementInfo();
+    fixReplacementInfo2.path = FILE_NAME;
+    fixReplacementInfo2.range = createRange(3, 0, 4, 0);
+    fixReplacementInfo2.replacement = "Some other modified content\n";
+
+    FixSuggestionInfo fixSuggestionInfo =
+        createFixSuggestionInfo(fixReplacementInfo1, fixReplacementInfo2);
+    withFixRobotCommentInput.fixSuggestions = ImmutableList.of(fixSuggestionInfo);
+
+    addRobotComment(changeId, withFixRobotCommentInput);
+    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
+    List<String> fixIds = getFixIds(robotCommentInfos);
+    String fixId = Iterables.getOnlyElement(fixIds);
+
+    gApi.changes().id(changeId).current().applyFix(fixId);
+
+    Optional<BinaryResult> file = gApi.changes().id(changeId).edit().getFile(FILE_NAME);
+    BinaryResultSubject.assertThat(file)
+        .value()
+        .asString()
+        .isEqualTo(
+            "First line\nFirst modification\nSome other modified content\nFourth line\nFifth line\n"
+                + "Sixth line\nSeventh line\nEighth line\nNinth line\nTenth line\n");
+  }
+
+  @Test
+  public void twoFixesOnSameFileCanBeApplied() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    FixReplacementInfo fixReplacementInfo1 = new FixReplacementInfo();
+    fixReplacementInfo1.path = FILE_NAME;
+    fixReplacementInfo1.range = createRange(2, 0, 3, 0);
+    fixReplacementInfo1.replacement = "First modification\n";
+    FixSuggestionInfo fixSuggestionInfo1 = createFixSuggestionInfo(fixReplacementInfo1);
+
+    FixReplacementInfo fixReplacementInfo2 = new FixReplacementInfo();
+    fixReplacementInfo2.path = FILE_NAME;
+    fixReplacementInfo2.range = createRange(8, 0, 9, 0);
+    fixReplacementInfo2.replacement = "Some other modified content\n";
+    FixSuggestionInfo fixSuggestionInfo2 = createFixSuggestionInfo(fixReplacementInfo2);
+
+    RobotCommentInput robotCommentInput1 = createRobotCommentInput(fixSuggestionInfo1);
+    RobotCommentInput robotCommentInput2 = createRobotCommentInput(fixSuggestionInfo2);
+    addRobotComment(changeId, robotCommentInput1);
+    addRobotComment(changeId, robotCommentInput2);
+    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
+
+    List<String> fixIds = getFixIds(robotCommentInfos);
+    gApi.changes().id(changeId).current().applyFix(fixIds.get(0));
+    gApi.changes().id(changeId).current().applyFix(fixIds.get(1));
+
+    Optional<BinaryResult> file = gApi.changes().id(changeId).edit().getFile(FILE_NAME);
+    BinaryResultSubject.assertThat(file)
+        .value()
+        .asString()
+        .isEqualTo(
+            "First line\nFirst modification\nThird line\nFourth line\nFifth line\nSixth line\n"
+                + "Seventh line\nSome other modified content\nNinth line\nTenth line\n");
+  }
+
+  @Test
+  public void twoConflictingFixesOnSameFileCannotBeApplied() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    FixReplacementInfo fixReplacementInfo1 = new FixReplacementInfo();
+    fixReplacementInfo1.path = FILE_NAME;
+    fixReplacementInfo1.range = createRange(2, 0, 3, 1);
+    fixReplacementInfo1.replacement = "First modification\n";
+    FixSuggestionInfo fixSuggestionInfo1 = createFixSuggestionInfo(fixReplacementInfo1);
+
+    FixReplacementInfo fixReplacementInfo2 = new FixReplacementInfo();
+    fixReplacementInfo2.path = FILE_NAME;
+    fixReplacementInfo2.range = createRange(3, 0, 4, 0);
+    fixReplacementInfo2.replacement = "Some other modified content\n";
+    FixSuggestionInfo fixSuggestionInfo2 = createFixSuggestionInfo(fixReplacementInfo2);
+
+    RobotCommentInput robotCommentInput1 = createRobotCommentInput(fixSuggestionInfo1);
+    RobotCommentInput robotCommentInput2 = createRobotCommentInput(fixSuggestionInfo2);
+    addRobotComment(changeId, robotCommentInput1);
+    addRobotComment(changeId, robotCommentInput2);
+    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
+
+    List<String> fixIds = getFixIds(robotCommentInfos);
+    gApi.changes().id(changeId).current().applyFix(fixIds.get(0));
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("merge");
+    gApi.changes().id(changeId).current().applyFix(fixIds.get(1));
+  }
+
+  @Test
+  public void twoFixesOfSameRobotCommentCanBeApplied() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    FixReplacementInfo fixReplacementInfo1 = new FixReplacementInfo();
+    fixReplacementInfo1.path = FILE_NAME;
+    fixReplacementInfo1.range = createRange(2, 0, 3, 0);
+    fixReplacementInfo1.replacement = "First modification\n";
+    FixSuggestionInfo fixSuggestionInfo1 = createFixSuggestionInfo(fixReplacementInfo1);
+
+    FixReplacementInfo fixReplacementInfo2 = new FixReplacementInfo();
+    fixReplacementInfo2.path = FILE_NAME;
+    fixReplacementInfo2.range = createRange(8, 0, 9, 0);
+    fixReplacementInfo2.replacement = "Some other modified content\n";
+    FixSuggestionInfo fixSuggestionInfo2 = createFixSuggestionInfo(fixReplacementInfo2);
+
+    withFixRobotCommentInput.fixSuggestions =
+        ImmutableList.of(fixSuggestionInfo1, fixSuggestionInfo2);
+
+    addRobotComment(changeId, withFixRobotCommentInput);
+    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
+
+    List<String> fixIds = getFixIds(robotCommentInfos);
+    gApi.changes().id(changeId).current().applyFix(fixIds.get(0));
+    gApi.changes().id(changeId).current().applyFix(fixIds.get(1));
+
+    Optional<BinaryResult> file = gApi.changes().id(changeId).edit().getFile(FILE_NAME);
+    BinaryResultSubject.assertThat(file)
+        .value()
+        .asString()
+        .isEqualTo(
+            "First line\nFirst modification\nThird line\nFourth line\nFifth line\nSixth line\n"
+                + "Seventh line\nSome other modified content\nNinth line\nTenth line\n");
+  }
+
+  @Test
+  public void fixReferringToDifferentFileThanRobotCommentCanBeApplied() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    fixReplacementInfo.path = FILE_NAME2;
+    fixReplacementInfo.range = createRange(2, 0, 3, 0);
+    fixReplacementInfo.replacement = "Modified content\n";
+
+    addRobotComment(changeId, withFixRobotCommentInput);
+    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
+    List<String> fixIds = getFixIds(robotCommentInfos);
+    String fixId = Iterables.getOnlyElement(fixIds);
+
+    gApi.changes().id(changeId).current().applyFix(fixId);
+
+    Optional<BinaryResult> file = gApi.changes().id(changeId).edit().getFile(FILE_NAME2);
+    BinaryResultSubject.assertThat(file)
+        .value()
+        .asString()
+        .isEqualTo("1st line\nModified content\n3rd line\n");
+  }
+
+  @Test
+  public void fixInvolvingTwoFilesCanBeApplied() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    FixReplacementInfo fixReplacementInfo1 = new FixReplacementInfo();
+    fixReplacementInfo1.path = FILE_NAME;
+    fixReplacementInfo1.range = createRange(2, 0, 3, 0);
+    fixReplacementInfo1.replacement = "First modification\n";
+
+    FixReplacementInfo fixReplacementInfo2 = new FixReplacementInfo();
+    fixReplacementInfo2.path = FILE_NAME2;
+    fixReplacementInfo2.range = createRange(1, 0, 2, 0);
+    fixReplacementInfo2.replacement = "Different file modification\n";
+
+    FixSuggestionInfo fixSuggestionInfo =
+        createFixSuggestionInfo(fixReplacementInfo1, fixReplacementInfo2);
+    withFixRobotCommentInput.fixSuggestions = ImmutableList.of(fixSuggestionInfo);
+
+    addRobotComment(changeId, withFixRobotCommentInput);
+    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
+    List<String> fixIds = getFixIds(robotCommentInfos);
+    String fixId = Iterables.getOnlyElement(fixIds);
+
+    gApi.changes().id(changeId).current().applyFix(fixId);
+
+    Optional<BinaryResult> file = gApi.changes().id(changeId).edit().getFile(FILE_NAME);
+    BinaryResultSubject.assertThat(file)
+        .value()
+        .asString()
+        .isEqualTo(
+            "First line\nFirst modification\nThird line\nFourth line\nFifth line\nSixth line\n"
+                + "Seventh line\nEighth line\nNinth line\nTenth line\n");
+    Optional<BinaryResult> file2 = gApi.changes().id(changeId).edit().getFile(FILE_NAME2);
+    BinaryResultSubject.assertThat(file2)
+        .value()
+        .asString()
+        .isEqualTo("Different file modification\n2nd line\n3rd line\n");
+  }
+
+  @Test
+  public void fixReferringToNonExistentFileCannotBeApplied() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    fixReplacementInfo.path = "a_non_existent_file.txt";
+    fixReplacementInfo.range = createRange(1, 0, 2, 0);
+    fixReplacementInfo.replacement = "Modified content\n";
+
+    addRobotComment(changeId, withFixRobotCommentInput);
+    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
+    List<String> fixIds = getFixIds(robotCommentInfos);
+    String fixId = Iterables.getOnlyElement(fixIds);
+
+    exception.expect(ResourceNotFoundException.class);
+    gApi.changes().id(changeId).current().applyFix(fixId);
+  }
+
+  @Test
+  public void fixOnPreviousPatchSetWithoutChangeEditCannotBeApplied() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    fixReplacementInfo.path = FILE_NAME;
+    fixReplacementInfo.replacement = "Modified content";
+    fixReplacementInfo.range = createRange(3, 1, 3, 3);
+
+    addRobotComment(changeId, withFixRobotCommentInput);
+    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
+
+    // Remember patch set and add another one.
+    String previousRevision = gApi.changes().id(changeId).get().currentRevision;
+    amendChange(changeId);
+
+    List<String> fixIds = getFixIds(robotCommentInfos);
+    String fixId = Iterables.getOnlyElement(fixIds);
+
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("current");
+    gApi.changes().id(changeId).revision(previousRevision).applyFix(fixId);
+  }
+
+  @Test
+  public void fixOnPreviousPatchSetWithExistingChangeEditCanBeApplied() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    // Create an empty change edit.
+    gApi.changes().id(changeId).edit().create();
+
+    fixReplacementInfo.path = FILE_NAME;
+    fixReplacementInfo.replacement = "Modified content";
+    fixReplacementInfo.range = createRange(3, 1, 3, 3);
+
+    addRobotComment(changeId, withFixRobotCommentInput);
+    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
+
+    // Remember patch set and add another one.
+    String previousRevision = gApi.changes().id(changeId).get().currentRevision;
+    amendChange(changeId);
+
+    List<String> fixIds = getFixIds(robotCommentInfos);
+    String fixId = Iterables.getOnlyElement(fixIds);
+
+    EditInfo editInfo = gApi.changes().id(changeId).revision(previousRevision).applyFix(fixId);
+
+    Optional<BinaryResult> file = gApi.changes().id(changeId).edit().getFile(FILE_NAME);
+    BinaryResultSubject.assertThat(file)
+        .value()
+        .asString()
+        .isEqualTo(
+            "First line\nSecond line\nTModified contentrd line\nFourth line\nFifth line\n"
+                + "Sixth line\nSeventh line\nEighth line\nNinth line\nTenth line\n");
+    assertThat(editInfo).baseRevision().isEqualTo(previousRevision);
+  }
+
+  @Test
+  public void fixOnCurrentPatchSetWithChangeEditOnPreviousPatchSetCannotBeApplied()
+      throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    // Create an empty change edit.
+    gApi.changes().id(changeId).edit().create();
+
+    // Add another patch set.
+    amendChange(changeId);
+
+    fixReplacementInfo.path = FILE_NAME;
+    fixReplacementInfo.replacement = "Modified content";
+    fixReplacementInfo.range = createRange(3, 1, 3, 3);
+
+    addRobotComment(changeId, withFixRobotCommentInput);
+    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
+
+    List<String> fixIds = getFixIds(robotCommentInfos);
+    String fixId = Iterables.getOnlyElement(fixIds);
+
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("based");
+    gApi.changes().id(changeId).current().applyFix(fixId);
+  }
+
+  @Test
+  public void fixDoesNotModifyCommitMessageOfChangeEdit() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    String changeEditCommitMessage = "This is the commit message of the change edit.\n";
+    gApi.changes().id(changeId).edit().modifyCommitMessage(changeEditCommitMessage);
+
+    fixReplacementInfo.path = FILE_NAME;
+    fixReplacementInfo.replacement = "Modified content";
+    fixReplacementInfo.range = createRange(3, 1, 3, 3);
+
+    addRobotComment(changeId, withFixRobotCommentInput);
+    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
+
+    List<String> fixIds = getFixIds(robotCommentInfos);
+    String fixId = Iterables.getOnlyElement(fixIds);
+
+    gApi.changes().id(changeId).current().applyFix(fixId);
+
+    String commitMessage = gApi.changes().id(changeId).edit().getCommitMessage();
+    assertThat(commitMessage).isEqualTo(changeEditCommitMessage);
+  }
+
+  @Test
+  public void applyingFixTwiceIsIdempotent() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    fixReplacementInfo.path = FILE_NAME;
+    fixReplacementInfo.replacement = "Modified content";
+    fixReplacementInfo.range = createRange(3, 1, 3, 3);
+
+    addRobotComment(changeId, withFixRobotCommentInput);
+    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
+
+    List<String> fixIds = getFixIds(robotCommentInfos);
+    String fixId = Iterables.getOnlyElement(fixIds);
+
+    gApi.changes().id(changeId).current().applyFix(fixId);
+    String expectedEditCommit =
+        gApi.changes().id(changeId).edit().get().map(edit -> edit.commit.commit).orElse("");
+
+    // Apply the fix again.
+    gApi.changes().id(changeId).current().applyFix(fixId);
+
+    Optional<EditInfo> editInfo = gApi.changes().id(changeId).edit().get();
+    assertThat(editInfo).value().commit().commit().isEqualTo(expectedEditCommit);
+  }
+
+  @Test
+  public void nonExistentFixCannotBeApplied() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    fixReplacementInfo.path = FILE_NAME;
+    fixReplacementInfo.replacement = "Modified content";
+    fixReplacementInfo.range = createRange(3, 1, 3, 3);
+
+    addRobotComment(changeId, withFixRobotCommentInput);
+    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
+
+    List<String> fixIds = getFixIds(robotCommentInfos);
+    String fixId = Iterables.getOnlyElement(fixIds);
+    String nonExistentFixId = fixId + "_non-existent";
+
+    exception.expect(ResourceNotFoundException.class);
+    gApi.changes().id(changeId).current().applyFix(nonExistentFixId);
+  }
+
+  @Test
+  public void applyingFixReturnsEditInfoForCreatedChangeEdit() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    fixReplacementInfo.path = FILE_NAME;
+    fixReplacementInfo.replacement = "Modified content";
+    fixReplacementInfo.range = createRange(3, 1, 3, 3);
+
+    addRobotComment(changeId, withFixRobotCommentInput);
+    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
+
+    List<String> fixIds = getFixIds(robotCommentInfos);
+    String fixId = Iterables.getOnlyElement(fixIds);
+
+    EditInfo editInfo = gApi.changes().id(changeId).current().applyFix(fixId);
+
+    Optional<EditInfo> expectedEditInfo = gApi.changes().id(changeId).edit().get();
+    String expectedEditCommit = expectedEditInfo.map(edit -> edit.commit.commit).orElse("");
+    assertThat(editInfo).commit().commit().isEqualTo(expectedEditCommit);
+    String expectedBaseRevision = expectedEditInfo.map(edit -> edit.baseRevision).orElse("");
+    assertThat(editInfo).baseRevision().isEqualTo(expectedBaseRevision);
+  }
+
+  @Test
+  public void applyingFixOnTopOfChangeEditReturnsEditInfoForUpdatedChangeEdit() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    gApi.changes().id(changeId).edit().create();
+
+    fixReplacementInfo.path = FILE_NAME;
+    fixReplacementInfo.replacement = "Modified content";
+    fixReplacementInfo.range = createRange(3, 1, 3, 3);
+
+    addRobotComment(changeId, withFixRobotCommentInput);
+    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
+
+    List<String> fixIds = getFixIds(robotCommentInfos);
+    String fixId = Iterables.getOnlyElement(fixIds);
+
+    EditInfo editInfo = gApi.changes().id(changeId).current().applyFix(fixId);
+
+    Optional<EditInfo> expectedEditInfo = gApi.changes().id(changeId).edit().get();
+    String expectedEditCommit = expectedEditInfo.map(edit -> edit.commit.commit).orElse("");
+    assertThat(editInfo).commit().commit().isEqualTo(expectedEditCommit);
+    String expectedBaseRevision = expectedEditInfo.map(edit -> edit.baseRevision).orElse("");
+    assertThat(editInfo).baseRevision().isEqualTo(expectedBaseRevision);
+  }
+
+  @Test
+  public void createdChangeEditIsBasedOnCurrentPatchSet() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    String currentRevision = gApi.changes().id(changeId).get().currentRevision;
+
+    fixReplacementInfo.path = FILE_NAME;
+    fixReplacementInfo.replacement = "Modified content";
+    fixReplacementInfo.range = createRange(3, 1, 3, 3);
+
+    addRobotComment(changeId, withFixRobotCommentInput);
+    List<RobotCommentInfo> robotCommentInfos = getRobotComments();
+
+    List<String> fixIds = getFixIds(robotCommentInfos);
+    String fixId = Iterables.getOnlyElement(fixIds);
+
+    EditInfo editInfo = gApi.changes().id(changeId).current().applyFix(fixId);
+
+    assertThat(editInfo).baseRevision().isEqualTo(currentRevision);
+  }
+
+  @Test
+  public void robotCommentsNotSupportedWithoutNoteDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isFalse();
+
+    RobotCommentInput in = createRobotCommentInput();
+    ReviewInput reviewInput = new ReviewInput();
+    Map<String, List<RobotCommentInput>> robotComments = new HashMap<>();
+    robotComments.put(in.path, ImmutableList.of(in));
+    reviewInput.robotComments = robotComments;
+    reviewInput.message = "comment test";
+
+    exception.expect(MethodNotAllowedException.class);
+    exception.expectMessage("robot comments not supported");
+    gApi.changes().id(changeId).current().review(reviewInput);
+  }
+
+  @Test
+  public void queryChangesWithUnresolvedCommentCount() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    PushOneCommit.Result r1 = createChange();
+    PushOneCommit.Result r2 =
+        pushFactory
+            .create(
+                db, admin.getIdent(), testRepo, SUBJECT, FILE_NAME, "new content", r1.getChangeId())
+            .to("refs/for/master");
+
+    addRobotComment(r2.getChangeId(), createRobotCommentInputWithMandatoryFields());
+
+    AcceptanceTestRequestScope.Context ctx = disableDb();
+    try {
+      ChangeInfo result = Iterables.getOnlyElement(query(r2.getChangeId()));
+      // currently, we create all robot comments as 'resolved' by default.
+      // if we allow users to resolve a robot comment, then this test should
+      // be modified.
+      assertThat(result.unresolvedCommentCount).isEqualTo(0);
+    } finally {
+      enableDb(ctx);
+    }
+  }
+
+  private static RobotCommentInput createRobotCommentInputWithMandatoryFields() {
+    RobotCommentInput in = new RobotCommentInput();
+    in.robotId = "happyRobot";
+    in.robotRunId = "1";
+    in.line = 1;
+    in.message = "nit: trailing whitespace";
+    in.path = FILE_NAME;
+    return in;
+  }
+
+  private static RobotCommentInput createRobotCommentInput(
+      FixSuggestionInfo... fixSuggestionInfos) {
+    RobotCommentInput in = createRobotCommentInputWithMandatoryFields();
+    in.url = "http://www.happy-robot.com";
+    in.properties = new HashMap<>();
+    in.properties.put("key1", "value1");
+    in.properties.put("key2", "value2");
+    in.fixSuggestions = Arrays.asList(fixSuggestionInfos);
+    return in;
+  }
+
+  private static FixSuggestionInfo createFixSuggestionInfo(
+      FixReplacementInfo... fixReplacementInfos) {
+    FixSuggestionInfo newFixSuggestionInfo = new FixSuggestionInfo();
+    newFixSuggestionInfo.fixId = "An ID which must be overwritten.";
+    newFixSuggestionInfo.description = "A description for a suggested fix.";
+    newFixSuggestionInfo.replacements = Arrays.asList(fixReplacementInfos);
+    return newFixSuggestionInfo;
+  }
+
+  private static FixReplacementInfo createFixReplacementInfo() {
+    FixReplacementInfo newFixReplacementInfo = new FixReplacementInfo();
+    newFixReplacementInfo.path = FILE_NAME;
+    newFixReplacementInfo.replacement = "some replacement code";
+    newFixReplacementInfo.range = createRange(3, 9, 8, 4);
+    return newFixReplacementInfo;
+  }
+
+  private static Comment.Range createRange(
+      int startLine, int startCharacter, int endLine, int endCharacter) {
+    Comment.Range range = new Comment.Range();
+    range.startLine = startLine;
+    range.startCharacter = startCharacter;
+    range.endLine = endLine;
+    range.endCharacter = endCharacter;
+    return range;
+  }
+
+  private void addRobotComment(String targetChangeId, RobotCommentInput robotCommentInput)
+      throws Exception {
+    ReviewInput reviewInput = new ReviewInput();
+    reviewInput.robotComments =
+        Collections.singletonMap(robotCommentInput.path, ImmutableList.of(robotCommentInput));
+    reviewInput.message = "robot comment test";
+    gApi.changes().id(targetChangeId).current().review(reviewInput);
+  }
+
+  private List<RobotCommentInfo> getRobotComments() throws RestApiException {
+    return gApi.changes().id(changeId).current().robotCommentsAsList();
+  }
+
+  private void assertRobotComment(RobotCommentInfo c, RobotCommentInput expected) {
+    assertRobotComment(c, expected, true);
+  }
+
+  private void assertRobotComment(
+      RobotCommentInfo c, RobotCommentInput expected, boolean expectPath) {
+    assertThat(c.robotId).isEqualTo(expected.robotId);
+    assertThat(c.robotRunId).isEqualTo(expected.robotRunId);
+    assertThat(c.url).isEqualTo(expected.url);
+    assertThat(c.properties).isEqualTo(expected.properties);
+    assertThat(c.line).isEqualTo(expected.line);
+    assertThat(c.message).isEqualTo(expected.message);
+
+    assertThat(c.author.email).isEqualTo(admin.email);
+
+    if (expectPath) {
+      assertThat(c.path).isEqualTo(expected.path);
+    } else {
+      assertThat(c.path).isNull();
+    }
+  }
+
+  private static String getStringFor(int numberOfBytes) {
+    char[] chars = new char[numberOfBytes];
+    // 'a' will require one byte even when mapped to a JSON string
+    Arrays.fill(chars, 'a');
+    return new String(chars);
+  }
+
+  private static List<String> getFixIds(List<RobotCommentInfo> robotComments) {
+    assertThatList(robotComments).isNotNull();
+    return robotComments.stream()
+        .map(robotCommentInfo -> robotCommentInfo.fixSuggestions)
+        .filter(Objects::nonNull)
+        .flatMap(List::stream)
+        .map(fixSuggestionInfo -> fixSuggestionInfo.fixId)
+        .collect(toList());
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/edit/BUILD b/javatests/com/google/gerrit/acceptance/edit/BUILD
new file mode 100644
index 0000000..25fc4f6
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/edit/BUILD
@@ -0,0 +1,7 @@
+load("//javatests/com/google/gerrit/acceptance:tests.bzl", "acceptance_tests")
+
+acceptance_tests(
+    srcs = ["ChangeEditIT.java"],
+    group = "edit",
+    labels = ["edit"],
+)
diff --git a/javatests/com/google/gerrit/acceptance/edit/ChangeEditIT.java b/javatests/com/google/gerrit/acceptance/edit/ChangeEditIT.java
new file mode 100644
index 0000000..7573a09
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/edit/ChangeEditIT.java
@@ -0,0 +1,881 @@
+// Copyright (C) 2014 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.google.gerrit.acceptance.edit;
+
+import static com.google.common.collect.Iterables.getOnlyElement;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_COMMIT;
+import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_REVISION;
+import static com.google.gerrit.extensions.client.ListChangesOption.DETAILED_LABELS;
+import static com.google.gerrit.extensions.client.ListChangesOption.MESSAGES;
+import static com.google.gerrit.extensions.common.testing.EditInfoSubject.assertThat;
+import static com.google.gerrit.extensions.restapi.testing.BinaryResultSubject.assertThat;
+import static com.google.gerrit.reviewdb.client.Patch.COMMIT_MSG;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.acceptance.TestProjectInput;
+import com.google.gerrit.common.RawInputUtil;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.changes.AddReviewerInput;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.api.changes.PublishChangeEditInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.client.ChangeEditDetailOption;
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.extensions.client.ListChangesOption;
+import com.google.gerrit.extensions.common.ApprovalInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.DiffInfo;
+import com.google.gerrit.extensions.common.EditInfo;
+import com.google.gerrit.extensions.common.FileInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BinaryResult;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.project.testing.Util;
+import com.google.gerrit.server.restapi.change.ChangeEdits.EditMessage;
+import com.google.gerrit.server.restapi.change.ChangeEdits.Post;
+import com.google.gerrit.server.restapi.change.ChangeEdits.Put;
+import com.google.gerrit.testing.TestTimeUtil;
+import com.google.gson.reflect.TypeToken;
+import com.google.gson.stream.JsonReader;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class ChangeEditIT extends AbstractDaemonTest {
+
+  private static final String FILE_NAME = "foo";
+  private static final String FILE_NAME2 = "foo2";
+  private static final String FILE_NAME3 = "foo3";
+  private static final byte[] CONTENT_OLD = "bar".getBytes(UTF_8);
+  private static final byte[] CONTENT_NEW = "baz".getBytes(UTF_8);
+  private static final String CONTENT_NEW2_STR = "quxÄÜÖßµ";
+  private static final byte[] CONTENT_NEW2 = CONTENT_NEW2_STR.getBytes(UTF_8);
+
+  @Inject private SchemaFactory<ReviewDb> reviewDbProvider;
+
+  private String changeId;
+  private String changeId2;
+  private PatchSet ps;
+
+  @BeforeClass
+  public static void setTimeForTesting() {
+    TestTimeUtil.resetWithClockStep(1, SECONDS);
+  }
+
+  @AfterClass
+  public static void restoreTime() {
+    TestTimeUtil.useSystemTime();
+  }
+
+  @Before
+  public void setUp() throws Exception {
+    db = reviewDbProvider.open();
+    changeId = newChange(admin.getIdent());
+    ps = getCurrentPatchSet(changeId);
+    assertThat(ps).isNotNull();
+    amendChange(admin.getIdent(), changeId);
+    changeId2 = newChange2(admin.getIdent());
+  }
+
+  @After
+  public void cleanup() {
+    db.close();
+  }
+
+  @Test
+  public void parseEditRevision() throws Exception {
+    createArbitraryEditFor(changeId);
+
+    // check that '0' is parsed as edit revision
+    gApi.changes().id(changeId).revision(0).comments();
+
+    // check that 'edit' is parsed as edit revision
+    gApi.changes().id(changeId).revision("edit").comments();
+  }
+
+  @Test
+  public void deleteEditOfCurrentPatchSet() throws Exception {
+    createArbitraryEditFor(changeId);
+    gApi.changes().id(changeId).edit().delete();
+    assertThat(getEdit(changeId)).isAbsent();
+  }
+
+  @Test
+  public void deleteEditOfOlderPatchSet() throws Exception {
+    createArbitraryEditFor(changeId2);
+    amendChange(admin.getIdent(), changeId2);
+
+    gApi.changes().id(changeId2).edit().delete();
+    assertThat(getEdit(changeId2)).isAbsent();
+  }
+
+  @Test
+  public void publishEdit() throws Exception {
+    createArbitraryEditFor(changeId);
+
+    PublishChangeEditInput publishInput = new PublishChangeEditInput();
+    publishInput.notify = NotifyHandling.NONE;
+    gApi.changes().id(changeId).edit().publish(publishInput);
+
+    assertThat(getEdit(changeId)).isAbsent();
+    assertChangeMessages(
+        changeId,
+        ImmutableList.of(
+            "Uploaded patch set 1.",
+            "Uploaded patch set 2.",
+            "Patch Set 3: Published edit on patch set 2."));
+
+    // The tag for the publish edit change message should vary according
+    // to whether the change was WIP at the time of publishing.
+    ChangeInfo info = get(changeId, MESSAGES);
+    assertThat(info.messages).isNotEmpty();
+    assertThat(Iterables.getLast(info.messages).tag)
+        .isEqualTo(ChangeMessagesUtil.TAG_UPLOADED_PATCH_SET);
+
+    // Move the change to WIP, repeat, and verify.
+    gApi.changes().id(changeId).setWorkInProgress();
+    createEmptyEditFor(changeId);
+    gApi.changes().id(changeId).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW2));
+    gApi.changes().id(changeId).edit().publish();
+    info = get(changeId, MESSAGES);
+    assertThat(info.messages).isNotEmpty();
+    assertThat(Iterables.getLast(info.messages).tag)
+        .isEqualTo(ChangeMessagesUtil.TAG_UPLOADED_WIP_PATCH_SET);
+  }
+
+  @Test
+  public void publishEditRest() throws Exception {
+    PatchSet oldCurrentPatchSet = getCurrentPatchSet(changeId);
+    createArbitraryEditFor(changeId);
+
+    adminRestSession.post(urlPublish(changeId)).assertNoContent();
+    assertThat(getEdit(changeId)).isAbsent();
+    PatchSet newCurrentPatchSet = getCurrentPatchSet(changeId);
+    assertThat(newCurrentPatchSet.getId()).isNotEqualTo(oldCurrentPatchSet.getId());
+    assertChangeMessages(
+        changeId,
+        ImmutableList.of(
+            "Uploaded patch set 1.",
+            "Uploaded patch set 2.",
+            "Patch Set 3: Published edit on patch set 2."));
+  }
+
+  @Test
+  public void publishEditNotifyRest() throws Exception {
+    AddReviewerInput in = new AddReviewerInput();
+    in.reviewer = user.email;
+    gApi.changes().id(changeId).addReviewer(in);
+
+    createArbitraryEditFor(changeId);
+
+    sender.clear();
+    PublishChangeEditInput input = new PublishChangeEditInput();
+    input.notify = NotifyHandling.NONE;
+    adminRestSession.post(urlPublish(changeId), input).assertNoContent();
+    assertThat(sender.getMessages()).isEmpty();
+  }
+
+  @Test
+  public void publishEditWithDefaultNotify() throws Exception {
+    AddReviewerInput in = new AddReviewerInput();
+    in.reviewer = user.email;
+    gApi.changes().id(changeId).addReviewer(in);
+
+    createArbitraryEditFor(changeId);
+
+    sender.clear();
+    gApi.changes().id(changeId).edit().publish();
+    assertThat(sender.getMessages()).isNotEmpty();
+  }
+
+  @Test
+  public void deleteEditRest() throws Exception {
+    createArbitraryEditFor(changeId);
+    adminRestSession.delete(urlEdit(changeId)).assertNoContent();
+    assertThat(getEdit(changeId)).isAbsent();
+  }
+
+  @Test
+  public void publishEditRestWithoutCLA() throws Exception {
+    createArbitraryEditFor(changeId);
+    setUseContributorAgreements(InheritableBoolean.TRUE);
+    adminRestSession.post(urlPublish(changeId)).assertForbidden();
+    setUseContributorAgreements(InheritableBoolean.FALSE);
+    adminRestSession.post(urlPublish(changeId)).assertNoContent();
+  }
+
+  @Test
+  public void rebaseEdit() throws Exception {
+    PatchSet previousPatchSet = getCurrentPatchSet(changeId2);
+    createEmptyEditFor(changeId2);
+    gApi.changes().id(changeId2).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW));
+    amendChange(admin.getIdent(), changeId2);
+    PatchSet currentPatchSet = getCurrentPatchSet(changeId2);
+
+    Optional<EditInfo> originalEdit = getEdit(changeId2);
+    assertThat(originalEdit).value().baseRevision().isEqualTo(previousPatchSet.getRevision().get());
+    Timestamp beforeRebase = originalEdit.get().commit.committer.date;
+    gApi.changes().id(changeId2).edit().rebase();
+    ensureSameBytes(getFileContentOfEdit(changeId2, FILE_NAME), CONTENT_NEW);
+    ensureSameBytes(getFileContentOfEdit(changeId2, FILE_NAME2), CONTENT_NEW2);
+    Optional<EditInfo> rebasedEdit = getEdit(changeId2);
+    assertThat(rebasedEdit).value().baseRevision().isEqualTo(currentPatchSet.getRevision().get());
+    assertThat(rebasedEdit).value().commit().committer().date().isNotEqualTo(beforeRebase);
+  }
+
+  @Test
+  public void rebaseEditRest() throws Exception {
+    PatchSet previousPatchSet = getCurrentPatchSet(changeId2);
+    createEmptyEditFor(changeId2);
+    gApi.changes().id(changeId2).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW));
+    amendChange(admin.getIdent(), changeId2);
+    PatchSet currentPatchSet = getCurrentPatchSet(changeId2);
+
+    Optional<EditInfo> originalEdit = getEdit(changeId2);
+    assertThat(originalEdit).value().baseRevision().isEqualTo(previousPatchSet.getRevision().get());
+    Timestamp beforeRebase = originalEdit.get().commit.committer.date;
+    adminRestSession.post(urlRebase(changeId2)).assertNoContent();
+    ensureSameBytes(getFileContentOfEdit(changeId2, FILE_NAME), CONTENT_NEW);
+    ensureSameBytes(getFileContentOfEdit(changeId2, FILE_NAME2), CONTENT_NEW2);
+    Optional<EditInfo> rebasedEdit = getEdit(changeId2);
+    assertThat(rebasedEdit).value().baseRevision().isEqualTo(currentPatchSet.getRevision().get());
+    assertThat(rebasedEdit).value().commit().committer().date().isNotEqualTo(beforeRebase);
+  }
+
+  @Test
+  public void rebaseEditWithConflictsRest_Conflict() throws Exception {
+    PatchSet currentPatchSet = getCurrentPatchSet(changeId2);
+    createEmptyEditFor(changeId2);
+    gApi.changes().id(changeId2).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW));
+    Optional<EditInfo> edit = getEdit(changeId2);
+    assertThat(edit).value().baseRevision().isEqualTo(currentPatchSet.getRevision().get());
+    PushOneCommit push =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            testRepo,
+            PushOneCommit.SUBJECT,
+            FILE_NAME,
+            new String(CONTENT_NEW2, UTF_8),
+            changeId2);
+    push.to("refs/for/master").assertOkStatus();
+    adminRestSession.post(urlRebase(changeId2)).assertConflict();
+  }
+
+  @Test
+  public void updateExistingFile() throws Exception {
+    createEmptyEditFor(changeId);
+    gApi.changes().id(changeId).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW));
+    assertThat(getEdit(changeId)).isPresent();
+    ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME), CONTENT_NEW);
+    ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME), CONTENT_NEW);
+  }
+
+  @Test
+  @TestProjectInput(createEmptyCommit = false)
+  public void updateRootCommitMessage() throws Exception {
+    // Re-clone empty repo; TestRepository doesn't let us reset to unborn head.
+    testRepo = cloneProject(project);
+    changeId = newChange(admin.getIdent());
+
+    createEmptyEditFor(changeId);
+    Optional<EditInfo> edit = getEdit(changeId);
+    assertThat(edit).value().commit().parents().isEmpty();
+
+    String msg = String.format("New commit message\n\nChange-Id: %s\n", changeId);
+    gApi.changes().id(changeId).edit().modifyCommitMessage(msg);
+    String commitMessage = gApi.changes().id(changeId).edit().getCommitMessage();
+    assertThat(commitMessage).isEqualTo(msg);
+  }
+
+  @Test
+  public void updateMessageNoChange() throws Exception {
+    createEmptyEditFor(changeId);
+    String commitMessage = gApi.changes().id(changeId).edit().getCommitMessage();
+
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("New commit message cannot be same as existing commit message");
+    gApi.changes().id(changeId).edit().modifyCommitMessage(commitMessage);
+  }
+
+  @Test
+  public void updateMessageOnlyAddTrailingNewLines() throws Exception {
+    createEmptyEditFor(changeId);
+    String commitMessage = gApi.changes().id(changeId).edit().getCommitMessage();
+
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("New commit message cannot be same as existing commit message");
+    gApi.changes().id(changeId).edit().modifyCommitMessage(commitMessage + "\n\n");
+  }
+
+  @Test
+  public void updateMessage() throws Exception {
+    createEmptyEditFor(changeId);
+    String msg = String.format("New commit message\n\nChange-Id: %s\n", changeId);
+    gApi.changes().id(changeId).edit().modifyCommitMessage(msg);
+    String commitMessage = gApi.changes().id(changeId).edit().getCommitMessage();
+    assertThat(commitMessage).isEqualTo(msg);
+
+    PublishChangeEditInput publishInput = new PublishChangeEditInput();
+    publishInput.notify = NotifyHandling.NONE;
+    gApi.changes().id(changeId).edit().publish(publishInput);
+    assertThat(getEdit(changeId)).isAbsent();
+
+    ChangeInfo info =
+        get(changeId, ListChangesOption.CURRENT_COMMIT, ListChangesOption.CURRENT_REVISION);
+    assertThat(info.revisions.get(info.currentRevision).commit.message).isEqualTo(msg);
+    assertThat(info.revisions.get(info.currentRevision).description)
+        .isEqualTo("Edit commit message");
+
+    assertChangeMessages(
+        changeId,
+        ImmutableList.of(
+            "Uploaded patch set 1.",
+            "Uploaded patch set 2.",
+            "Patch Set 3: Commit message was updated."));
+  }
+
+  @Test
+  public void updateMessageRest() throws Exception {
+    adminRestSession.get(urlEditMessage(changeId, false)).assertNotFound();
+    EditMessage.Input in = new EditMessage.Input();
+    in.message =
+        String.format(
+            "New commit message\n\n" + CONTENT_NEW2_STR + "\n\nChange-Id: %s\n", changeId);
+    adminRestSession.put(urlEditMessage(changeId, false), in).assertNoContent();
+    RestResponse r = adminRestSession.getJsonAccept(urlEditMessage(changeId, false));
+    r.assertOK();
+    assertThat(readContentFromJson(r)).isEqualTo(in.message);
+    String commitMessage = gApi.changes().id(changeId).edit().getCommitMessage();
+    assertThat(commitMessage).isEqualTo(in.message);
+    in.message = String.format("New commit message2\n\nChange-Id: %s\n", changeId);
+    adminRestSession.put(urlEditMessage(changeId, false), in).assertNoContent();
+    String updatedCommitMessage = gApi.changes().id(changeId).edit().getCommitMessage();
+    assertThat(updatedCommitMessage).isEqualTo(in.message);
+
+    r = adminRestSession.getJsonAccept(urlEditMessage(changeId, true));
+    try (Repository repo = repoManager.openRepository(project);
+        RevWalk rw = new RevWalk(repo)) {
+      RevCommit commit = rw.parseCommit(ObjectId.fromString(ps.getRevision().get()));
+      assertThat(readContentFromJson(r)).isEqualTo(commit.getFullMessage());
+    }
+
+    PublishChangeEditInput publishInput = new PublishChangeEditInput();
+    publishInput.notify = NotifyHandling.NONE;
+    gApi.changes().id(changeId).edit().publish(publishInput);
+    assertChangeMessages(
+        changeId,
+        ImmutableList.of(
+            "Uploaded patch set 1.",
+            "Uploaded patch set 2.",
+            "Patch Set 3: Commit message was updated."));
+  }
+
+  @Test
+  public void retrieveEdit() throws Exception {
+    adminRestSession.get(urlEdit(changeId)).assertNoContent();
+    createArbitraryEditFor(changeId);
+    Optional<EditInfo> maybeEditInfo = gApi.changes().id(changeId).edit().get();
+    assertThat(maybeEditInfo).isPresent();
+    EditInfo editInfo = maybeEditInfo.get();
+    ChangeInfo changeInfo = get(changeId, CURRENT_REVISION, CURRENT_COMMIT);
+    assertThat(editInfo.commit.commit).isNotEqualTo(changeInfo.currentRevision);
+    assertThat(editInfo).commit().parents().hasSize(1);
+    assertThat(editInfo).baseRevision().isEqualTo(changeInfo.currentRevision);
+
+    gApi.changes().id(changeId).edit().delete();
+
+    adminRestSession.get(urlEdit(changeId)).assertNoContent();
+  }
+
+  @Test
+  public void retrieveFilesInEdit() throws Exception {
+    createEmptyEditFor(changeId);
+    assertFiles(changeId, ImmutableList.of(COMMIT_MSG, FILE_NAME, FILE_NAME2));
+  }
+
+  @Test
+  public void deleteExistingFile() throws Exception {
+    createEmptyEditFor(changeId);
+    gApi.changes().id(changeId).edit().deleteFile(FILE_NAME);
+    assertThat(getFileContentOfEdit(changeId, FILE_NAME)).isAbsent();
+  }
+
+  @Test
+  public void renameExistingFile() throws Exception {
+    createEmptyEditFor(changeId);
+    gApi.changes().id(changeId).edit().renameFile(FILE_NAME, FILE_NAME3);
+    ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME3), CONTENT_OLD);
+    assertThat(getFileContentOfEdit(changeId, FILE_NAME)).isAbsent();
+  }
+
+  @Test
+  public void createEditByDeletingExistingFileRest() throws Exception {
+    adminRestSession.delete(urlEditFile(changeId, FILE_NAME)).assertNoContent();
+    assertThat(getFileContentOfEdit(changeId, FILE_NAME)).isAbsent();
+  }
+
+  @Test
+  public void deletingNonExistingEditRest() throws Exception {
+    adminRestSession.delete(urlEdit(changeId)).assertNotFound();
+  }
+
+  @Test
+  public void deleteExistingFileRest() throws Exception {
+    createEmptyEditFor(changeId);
+    adminRestSession.delete(urlEditFile(changeId, FILE_NAME)).assertNoContent();
+    assertThat(getFileContentOfEdit(changeId, FILE_NAME)).isAbsent();
+  }
+
+  @Test
+  public void restoreDeletedFileInPatchSet() throws Exception {
+    createEmptyEditFor(changeId2);
+    gApi.changes().id(changeId2).edit().restoreFile(FILE_NAME);
+    ensureSameBytes(getFileContentOfEdit(changeId2, FILE_NAME), CONTENT_OLD);
+  }
+
+  @Test
+  public void revertChanges() throws Exception {
+    createEmptyEditFor(changeId2);
+    gApi.changes().id(changeId2).edit().restoreFile(FILE_NAME);
+    ensureSameBytes(getFileContentOfEdit(changeId2, FILE_NAME), CONTENT_OLD);
+    gApi.changes().id(changeId2).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW));
+    ensureSameBytes(getFileContentOfEdit(changeId2, FILE_NAME), CONTENT_NEW);
+    gApi.changes().id(changeId2).edit().restoreFile(FILE_NAME);
+    ensureSameBytes(getFileContentOfEdit(changeId2, FILE_NAME), CONTENT_OLD);
+  }
+
+  @Test
+  public void renameFileRest() throws Exception {
+    createEmptyEditFor(changeId);
+    Post.Input in = new Post.Input();
+    in.oldPath = FILE_NAME;
+    in.newPath = FILE_NAME3;
+    adminRestSession.post(urlEdit(changeId), in).assertNoContent();
+    ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME3), CONTENT_OLD);
+    assertThat(getFileContentOfEdit(changeId, FILE_NAME)).isAbsent();
+  }
+
+  @Test
+  public void restoreDeletedFileInPatchSetRest() throws Exception {
+    Post.Input in = new Post.Input();
+    in.restorePath = FILE_NAME;
+    adminRestSession.post(urlEdit(changeId2), in).assertNoContent();
+    ensureSameBytes(getFileContentOfEdit(changeId2, FILE_NAME), CONTENT_OLD);
+  }
+
+  @Test
+  public void amendExistingFile() throws Exception {
+    createEmptyEditFor(changeId);
+    gApi.changes().id(changeId).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW));
+    ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME), CONTENT_NEW);
+    gApi.changes().id(changeId).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW2));
+    ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME), CONTENT_NEW2);
+  }
+
+  @Test
+  public void createAndChangeEditInOneRequestRest() throws Exception {
+    Put.Input in = new Put.Input();
+    in.content = RawInputUtil.create(CONTENT_NEW);
+    adminRestSession.putRaw(urlEditFile(changeId, FILE_NAME), in.content).assertNoContent();
+    ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME), CONTENT_NEW);
+    in.content = RawInputUtil.create(CONTENT_NEW2);
+    adminRestSession.putRaw(urlEditFile(changeId, FILE_NAME), in.content).assertNoContent();
+    ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME), CONTENT_NEW2);
+  }
+
+  @Test
+  public void changeEditRest() throws Exception {
+    createEmptyEditFor(changeId);
+    Put.Input in = new Put.Input();
+    in.content = RawInputUtil.create(CONTENT_NEW);
+    adminRestSession.putRaw(urlEditFile(changeId, FILE_NAME), in.content).assertNoContent();
+    ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME), CONTENT_NEW);
+  }
+
+  @Test
+  public void emptyPutRequest() throws Exception {
+    createEmptyEditFor(changeId);
+    adminRestSession.put(urlEditFile(changeId, FILE_NAME)).assertNoContent();
+    ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME), "".getBytes(UTF_8));
+  }
+
+  @Test
+  public void createEmptyEditRest() throws Exception {
+    adminRestSession.post(urlEdit(changeId)).assertNoContent();
+    ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME), CONTENT_OLD);
+  }
+
+  @Test
+  public void getFileContentRest() throws Exception {
+    Put.Input in = new Put.Input();
+    in.content = RawInputUtil.create(CONTENT_NEW);
+    adminRestSession.putRaw(urlEditFile(changeId, FILE_NAME), in.content).assertNoContent();
+    gApi.changes().id(changeId).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW2));
+    RestResponse r = adminRestSession.getJsonAccept(urlEditFile(changeId, FILE_NAME));
+    r.assertOK();
+    assertThat(readContentFromJson(r)).isEqualTo(new String(CONTENT_NEW2, UTF_8));
+
+    r = adminRestSession.getJsonAccept(urlEditFile(changeId, FILE_NAME, true));
+    r.assertOK();
+    assertThat(readContentFromJson(r)).isEqualTo(new String(CONTENT_OLD, UTF_8));
+  }
+
+  @Test
+  public void getFileNotFoundRest() throws Exception {
+    createEmptyEditFor(changeId);
+    adminRestSession.delete(urlEditFile(changeId, FILE_NAME)).assertNoContent();
+    adminRestSession.get(urlEditFile(changeId, FILE_NAME)).assertNoContent();
+    assertThat(getFileContentOfEdit(changeId, FILE_NAME)).isAbsent();
+  }
+
+  @Test
+  public void addNewFile() throws Exception {
+    createEmptyEditFor(changeId);
+    assertFiles(changeId, ImmutableList.of(COMMIT_MSG, FILE_NAME, FILE_NAME2));
+    gApi.changes().id(changeId).edit().modifyFile(FILE_NAME3, RawInputUtil.create(CONTENT_NEW));
+    ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME3), CONTENT_NEW);
+    assertFiles(changeId, ImmutableList.of(COMMIT_MSG, FILE_NAME, FILE_NAME2, FILE_NAME3));
+  }
+
+  @Test
+  public void addNewFileAndAmend() throws Exception {
+    createEmptyEditFor(changeId);
+    gApi.changes().id(changeId).edit().modifyFile(FILE_NAME3, RawInputUtil.create(CONTENT_NEW));
+    ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME3), CONTENT_NEW);
+    gApi.changes().id(changeId).edit().modifyFile(FILE_NAME3, RawInputUtil.create(CONTENT_NEW2));
+    ensureSameBytes(getFileContentOfEdit(changeId, FILE_NAME3), CONTENT_NEW2);
+  }
+
+  @Test
+  public void writeNoChanges() throws Exception {
+    createEmptyEditFor(changeId);
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("no changes were made");
+    gApi.changes().id(changeId).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_OLD));
+  }
+
+  @Test
+  public void editCommitMessageCopiesLabelScores() throws Exception {
+    String cr = "Code-Review";
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      LabelType codeReview = Util.codeReview();
+      codeReview.setCopyAllScoresIfNoCodeChange(true);
+      u.getConfig().getLabelSections().put(cr, codeReview);
+      u.save();
+    }
+
+    ReviewInput r = new ReviewInput();
+    r.labels = ImmutableMap.of(cr, (short) 1);
+    gApi.changes().id(changeId).current().review(r);
+
+    createEmptyEditFor(changeId);
+    String newSubj = "New commit message";
+    String newMsg = newSubj + "\n\nChange-Id: " + changeId + "\n";
+    gApi.changes().id(changeId).edit().modifyCommitMessage(newMsg);
+    PublishChangeEditInput publishInput = new PublishChangeEditInput();
+    publishInput.notify = NotifyHandling.NONE;
+    gApi.changes().id(changeId).edit().publish(publishInput);
+
+    ChangeInfo info = get(changeId, DETAILED_LABELS);
+    assertThat(info.subject).isEqualTo(newSubj);
+    List<ApprovalInfo> approvals = info.labels.get(cr).all;
+    assertThat(approvals).hasSize(1);
+    assertThat(approvals.get(0).value).isEqualTo(1);
+  }
+
+  @Test
+  public void hasEditPredicate() throws Exception {
+    createEmptyEditFor(changeId);
+    assertThat(queryEdits()).hasSize(1);
+
+    createEmptyEditFor(changeId2);
+    gApi.changes().id(changeId2).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW));
+    assertThat(queryEdits()).hasSize(2);
+
+    gApi.changes().id(changeId).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW));
+    gApi.changes().id(changeId).edit().delete();
+    assertThat(queryEdits()).hasSize(1);
+
+    PublishChangeEditInput publishInput = new PublishChangeEditInput();
+    publishInput.notify = NotifyHandling.NONE;
+    gApi.changes().id(changeId2).edit().publish(publishInput);
+    assertThat(queryEdits()).isEmpty();
+
+    setApiUser(user);
+    createEmptyEditFor(changeId);
+    assertThat(queryEdits()).hasSize(1);
+
+    setApiUser(admin);
+    assertThat(queryEdits()).isEmpty();
+  }
+
+  @Test
+  public void files() throws Exception {
+    createEmptyEditFor(changeId);
+    gApi.changes().id(changeId).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW));
+    Optional<EditInfo> edit = getEdit(changeId);
+    assertThat(edit).isPresent();
+    String editCommitId = edit.get().commit.commit;
+
+    RestResponse r = adminRestSession.getJsonAccept(urlRevisionFiles(changeId, editCommitId));
+    Map<String, FileInfo> files = readContentFromJson(r, new TypeToken<Map<String, FileInfo>>() {});
+    assertThat(files).containsKey(FILE_NAME);
+
+    r = adminRestSession.getJsonAccept(urlRevisionFiles(changeId));
+    files = readContentFromJson(r, new TypeToken<Map<String, FileInfo>>() {});
+    assertThat(files).containsKey(FILE_NAME);
+  }
+
+  @Test
+  public void diff() throws Exception {
+    createEmptyEditFor(changeId);
+    gApi.changes().id(changeId).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW));
+    Optional<EditInfo> edit = getEdit(changeId);
+    assertThat(edit).isPresent();
+    String editCommitId = edit.get().commit.commit;
+
+    RestResponse r = adminRestSession.getJsonAccept(urlDiff(changeId, editCommitId, FILE_NAME));
+    DiffInfo diff = readContentFromJson(r, DiffInfo.class);
+    assertThat(diff.diffHeader.get(0)).contains(FILE_NAME);
+
+    r = adminRestSession.getJsonAccept(urlDiff(changeId, FILE_NAME));
+    diff = readContentFromJson(r, DiffInfo.class);
+    assertThat(diff.diffHeader.get(0)).contains(FILE_NAME);
+  }
+
+  @Test
+  public void createEditWithoutPushPatchSetPermission() throws Exception {
+    // Create new project with clean permissions
+    Project.NameKey p = createProject("addPatchSetEdit");
+    // Clone repository as user
+    TestRepository<InMemoryRepository> userTestRepo = cloneProject(p, user);
+
+    // Block default permission
+    block(p, "refs/for/*", Permission.ADD_PATCH_SET, REGISTERED_USERS);
+
+    // Create change as user
+    PushOneCommit push = pushFactory.create(db, user.getIdent(), userTestRepo);
+    PushOneCommit.Result r1 = push.to("refs/for/master");
+    r1.assertOkStatus();
+
+    // Try to create edit as admin
+    exception.expect(AuthException.class);
+    createEmptyEditFor(r1.getChangeId());
+  }
+
+  @Test
+  public void editCannotBeCreatedOnMergedChange() throws Exception {
+    ChangeInfo change = gApi.changes().id(changeId).get();
+    gApi.changes().id(changeId).current().review(ReviewInput.approve());
+    gApi.changes().id(changeId).current().submit();
+
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage(String.format("change %s is merged", change._number));
+    createArbitraryEditFor(changeId);
+  }
+
+  @Test
+  public void editCannotBeCreatedOnAbandonedChange() throws Exception {
+    ChangeInfo change = gApi.changes().id(changeId).get();
+    gApi.changes().id(changeId).abandon();
+
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage(String.format("change %s is abandoned", change._number));
+    createArbitraryEditFor(changeId);
+  }
+
+  private void createArbitraryEditFor(String changeId) throws Exception {
+    createEmptyEditFor(changeId);
+    arbitrarilyModifyEditOf(changeId);
+  }
+
+  private void createEmptyEditFor(String changeId) throws Exception {
+    gApi.changes().id(changeId).edit().create();
+  }
+
+  private void arbitrarilyModifyEditOf(String changeId) throws Exception {
+    gApi.changes().id(changeId).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW));
+  }
+
+  private Optional<BinaryResult> getFileContentOfEdit(String changeId, String filePath)
+      throws Exception {
+    return gApi.changes().id(changeId).edit().getFile(filePath);
+  }
+
+  private List<ChangeInfo> queryEdits() throws Exception {
+    return query("project:{" + project.get() + "} has:edit");
+  }
+
+  private String newChange(PersonIdent ident) throws Exception {
+    PushOneCommit push =
+        pushFactory.create(
+            db, ident, testRepo, PushOneCommit.SUBJECT, FILE_NAME, new String(CONTENT_OLD, UTF_8));
+    return push.to("refs/for/master").getChangeId();
+  }
+
+  private String amendChange(PersonIdent ident, String changeId) throws Exception {
+    PushOneCommit push =
+        pushFactory.create(
+            db,
+            ident,
+            testRepo,
+            PushOneCommit.SUBJECT,
+            FILE_NAME2,
+            new String(CONTENT_NEW2, UTF_8),
+            changeId);
+    return push.to("refs/for/master").getChangeId();
+  }
+
+  private String newChange2(PersonIdent ident) throws Exception {
+    PushOneCommit push =
+        pushFactory.create(
+            db, ident, testRepo, PushOneCommit.SUBJECT, FILE_NAME, new String(CONTENT_OLD, UTF_8));
+    return push.rm("refs/for/master").getChangeId();
+  }
+
+  private PatchSet getCurrentPatchSet(String changeId) throws Exception {
+    return getOnlyElement(queryProvider.get().byKeyPrefix(changeId)).currentPatchSet();
+  }
+
+  private void ensureSameBytes(Optional<BinaryResult> fileContent, byte[] expectedFileBytes)
+      throws IOException {
+    assertThat(fileContent).value().bytes().isEqualTo(expectedFileBytes);
+  }
+
+  private void assertFiles(String changeId, List<String> expected) throws Exception {
+    Optional<EditInfo> info =
+        gApi.changes()
+            .id(changeId)
+            .edit()
+            .detail()
+            .withOption(ChangeEditDetailOption.LIST_FILES)
+            .get();
+    assertThat(info).isPresent();
+    assertThat(info.get().files).isNotNull();
+    assertThat(info.get().files.keySet()).containsExactlyElementsIn(expected);
+  }
+
+  private String urlEdit(String changeId) {
+    return "/changes/" + changeId + "/edit";
+  }
+
+  private String urlEditMessage(String changeId, boolean base) {
+    return "/changes/" + changeId + "/edit:message" + (base ? "?base" : "");
+  }
+
+  private String urlEditFile(String changeId, String fileName) {
+    return urlEditFile(changeId, fileName, false);
+  }
+
+  private String urlEditFile(String changeId, String fileName, boolean base) {
+    return urlEdit(changeId) + "/" + fileName + (base ? "?base" : "");
+  }
+
+  private String urlRevisionFiles(String changeId, String revisionId) {
+    return "/changes/" + changeId + "/revisions/" + revisionId + "/files";
+  }
+
+  private String urlRevisionFiles(String changeId) {
+    return "/changes/" + changeId + "/revisions/0/files";
+  }
+
+  private String urlPublish(String changeId) {
+    return "/changes/" + changeId + "/edit:publish";
+  }
+
+  private String urlRebase(String changeId) {
+    return "/changes/" + changeId + "/edit:rebase";
+  }
+
+  private String urlDiff(String changeId, String fileName) {
+    return "/changes/"
+        + changeId
+        + "/revisions/0/files/"
+        + fileName
+        + "/diff?context=ALL&intraline";
+  }
+
+  private String urlDiff(String changeId, String revisionId, String fileName) {
+    return "/changes/"
+        + changeId
+        + "/revisions/"
+        + revisionId
+        + "/files/"
+        + fileName
+        + "/diff?context=ALL&intraline";
+  }
+
+  private <T> T readContentFromJson(RestResponse r, Class<T> clazz) throws Exception {
+    r.assertOK();
+    try (JsonReader jsonReader = new JsonReader(r.getReader())) {
+      jsonReader.setLenient(true);
+      return newGson().fromJson(jsonReader, clazz);
+    }
+  }
+
+  private <T> T readContentFromJson(RestResponse r, TypeToken<T> typeToken) throws Exception {
+    r.assertOK();
+    try (JsonReader jsonReader = new JsonReader(r.getReader())) {
+      jsonReader.setLenient(true);
+      return newGson().fromJson(jsonReader, typeToken.getType());
+    }
+  }
+
+  private String readContentFromJson(RestResponse r) throws Exception {
+    return readContentFromJson(r, String.class);
+  }
+
+  private void assertChangeMessages(String changeId, List<String> expectedMessages)
+      throws Exception {
+    ChangeInfo ci = get(changeId, MESSAGES);
+    assertThat(ci.messages).isNotNull();
+    assertThat(ci.messages).hasSize(expectedMessages.size());
+    List<String> actualMessages =
+        ci.messages.stream().map(message -> message.message).collect(toList());
+    assertThat(actualMessages).containsExactlyElementsIn(expectedMessages).inOrder();
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/git/AbstractPushForReview.java b/javatests/com/google/gerrit/acceptance/git/AbstractPushForReview.java
new file mode 100644
index 0000000..1226661
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/git/AbstractPushForReview.java
@@ -0,0 +1,2507 @@
+// Copyright (C) 2013 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.google.gerrit.acceptance.git;
+
+import static com.google.common.base.MoreObjects.firstNonNull;
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth8.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static com.google.gerrit.acceptance.GitUtil.assertPushOk;
+import static com.google.gerrit.acceptance.GitUtil.assertPushRejected;
+import static com.google.gerrit.acceptance.GitUtil.pushHead;
+import static com.google.gerrit.acceptance.GitUtil.pushOne;
+import static com.google.gerrit.acceptance.PushOneCommit.FILE_NAME;
+import static com.google.gerrit.common.FooterConstants.CHANGE_ID;
+import static com.google.gerrit.extensions.client.ListChangesOption.ALL_REVISIONS;
+import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_REVISION;
+import static com.google.gerrit.extensions.client.ListChangesOption.DETAILED_ACCOUNTS;
+import static com.google.gerrit.extensions.client.ListChangesOption.DETAILED_LABELS;
+import static com.google.gerrit.extensions.client.ListChangesOption.MESSAGES;
+import static com.google.gerrit.extensions.common.testing.EditInfoSubject.assertThat;
+import static com.google.gerrit.server.git.receive.ReceiveConstants.PUSH_OPTION_SKIP_VALIDATION;
+import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static com.google.gerrit.server.project.testing.Util.category;
+import static com.google.gerrit.server.project.testing.Util.value;
+import static java.util.Comparator.comparing;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static java.util.stream.Collectors.joining;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Streams;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.GerritConfig;
+import com.google.gerrit.acceptance.GitUtil;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.Sandboxed;
+import com.google.gerrit.acceptance.TestAccount;
+import com.google.gerrit.acceptance.TestProjectInput;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.changes.DraftInput;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.groups.GroupInput;
+import com.google.gerrit.extensions.api.projects.BranchInput;
+import com.google.gerrit.extensions.api.projects.ConfigInput;
+import com.google.gerrit.extensions.client.ChangeStatus;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.extensions.client.ListChangesOption;
+import com.google.gerrit.extensions.client.ProjectWatchInfo;
+import com.google.gerrit.extensions.client.ReviewerState;
+import com.google.gerrit.extensions.client.Side;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.ChangeMessageInfo;
+import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.common.EditInfo;
+import com.google.gerrit.extensions.common.LabelInfo;
+import com.google.gerrit.extensions.common.RevisionInfo;
+import com.google.gerrit.extensions.common.testing.EditInfoSubject;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.client.RevId;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.git.receive.NoteDbPushOption;
+import com.google.gerrit.server.git.receive.ReceiveConstants;
+import com.google.gerrit.server.git.validators.CommitValidators.ChangeIdValidator;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gerrit.server.project.testing.Util;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.testing.FakeEmailSender.Message;
+import com.google.gerrit.testing.TestTimeUtil;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.regex.Pattern;
+import java.util.stream.Stream;
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.RefUpdate.Result;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.PushResult;
+import org.eclipse.jgit.transport.RefSpec;
+import org.eclipse.jgit.transport.RemoteRefUpdate;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public abstract class AbstractPushForReview extends AbstractDaemonTest {
+  protected enum Protocol {
+    // TODO(dborowitz): TEST.
+    SSH,
+    HTTP
+  }
+
+  private LabelType patchSetLock;
+
+  @BeforeClass
+  public static void setTimeForTesting() {
+    TestTimeUtil.resetWithClockStep(1, SECONDS);
+  }
+
+  @AfterClass
+  public static void restoreTime() {
+    TestTimeUtil.useSystemTime();
+  }
+
+  @Before
+  public void setUpPatchSetLock() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      patchSetLock = Util.patchSetLock();
+      u.getConfig().getLabelSections().put(patchSetLock.getName(), patchSetLock);
+      AccountGroup.UUID anonymousUsers = systemGroupBackend.getGroup(ANONYMOUS_USERS).getUUID();
+      Util.allow(
+          u.getConfig(),
+          Permission.forLabel(patchSetLock.getName()),
+          0,
+          1,
+          anonymousUsers,
+          "refs/heads/*");
+      u.save();
+    }
+    grant(project, "refs/heads/*", Permission.LABEL + "Patch-Set-Lock");
+  }
+
+  @After
+  public void resetPublishCommentOnPushOption() throws Exception {
+    setApiUser(admin);
+    GeneralPreferencesInfo prefs = gApi.accounts().id(admin.id.get()).getPreferences();
+    prefs.publishCommentsOnPush = false;
+    gApi.accounts().id(admin.id.get()).setPreferences(prefs);
+  }
+
+  protected void selectProtocol(Protocol p) throws Exception {
+    String url;
+    switch (p) {
+      case SSH:
+        url = adminSshSession.getUrl();
+        break;
+      case HTTP:
+        url = admin.getHttpUrl(server);
+        break;
+      default:
+        throw new IllegalArgumentException("unexpected protocol: " + p);
+    }
+    testRepo = GitUtil.cloneProject(project, url + "/" + project.get());
+  }
+
+  @Test
+  public void pushForMaster() throws Exception {
+    PushOneCommit.Result r = pushTo("refs/for/master");
+    r.assertOkStatus();
+    r.assertChange(Change.Status.NEW, null);
+  }
+
+  @Test
+  @TestProjectInput(createEmptyCommit = false)
+  public void pushInitialCommitForMasterBranch() throws Exception {
+    RevCommit c = testRepo.commit().message("Initial commit").insertChangeId().create();
+    String id = GitUtil.getChangeId(testRepo, c).get();
+    testRepo.reset(c);
+
+    String r = "refs/for/master";
+    PushResult pr = pushHead(testRepo, r, false);
+    assertPushOk(pr, r);
+
+    ChangeInfo change = gApi.changes().id(id).info();
+    assertThat(change.branch).isEqualTo("master");
+    assertThat(change.status).isEqualTo(ChangeStatus.NEW);
+
+    try (Repository repo = repoManager.openRepository(project)) {
+      assertThat(repo.resolve("master")).isNull();
+    }
+
+    gApi.changes().id(change.id).current().review(ReviewInput.approve());
+    gApi.changes().id(change.id).current().submit();
+
+    try (Repository repo = repoManager.openRepository(project)) {
+      assertThat(repo.resolve("master")).isEqualTo(c);
+    }
+  }
+
+  @Test
+  @TestProjectInput(createEmptyCommit = false)
+  public void validateConnected() throws Exception {
+    RevCommit c = testRepo.commit().message("Initial commit").insertChangeId().create();
+    testRepo.reset(c);
+
+    String r = "refs/heads/master";
+    PushResult pr = pushHead(testRepo, r, false);
+    assertPushOk(pr, r);
+
+    RevCommit amended =
+        testRepo.amend(c).message("different initial commit").insertChangeId().create();
+    testRepo.reset(amended);
+    r = "refs/for/master";
+    pr = pushHead(testRepo, r, false);
+    assertPushRejected(pr, r, "no common ancestry");
+  }
+
+  @Test
+  @GerritConfig(name = "receive.enableSignedPush", value = "true")
+  @TestProjectInput(
+      enableSignedPush = InheritableBoolean.TRUE,
+      requireSignedPush = InheritableBoolean.TRUE)
+  public void nonSignedPushRejectedWhenSignPushRequired() throws Exception {
+    pushTo("refs/for/master").assertErrorStatus("push cert error");
+  }
+
+  @Test
+  public void pushInitialCommitForRefsMetaConfigBranch() throws Exception {
+    // delete refs/meta/config
+    try (Repository repo = repoManager.openRepository(project);
+        RevWalk rw = new RevWalk(repo)) {
+      RefUpdate u = repo.updateRef(RefNames.REFS_CONFIG);
+      u.setForceUpdate(true);
+      u.setExpectedOldObjectId(repo.resolve(RefNames.REFS_CONFIG));
+      assertThat(u.delete(rw)).isEqualTo(Result.FORCED);
+    }
+
+    RevCommit c =
+        testRepo
+            .commit()
+            .message("Initial commit")
+            .author(admin.getIdent())
+            .committer(admin.getIdent())
+            .insertChangeId()
+            .create();
+    String id = GitUtil.getChangeId(testRepo, c).get();
+    testRepo.reset(c);
+
+    String r = "refs/for/" + RefNames.REFS_CONFIG;
+    PushResult pr = pushHead(testRepo, r, false);
+    assertPushOk(pr, r);
+
+    ChangeInfo change = gApi.changes().id(id).info();
+    assertThat(change.branch).isEqualTo(RefNames.REFS_CONFIG);
+    assertThat(change.status).isEqualTo(ChangeStatus.NEW);
+
+    try (Repository repo = repoManager.openRepository(project)) {
+      assertThat(repo.resolve(RefNames.REFS_CONFIG)).isNull();
+    }
+
+    gApi.changes().id(change.id).current().review(ReviewInput.approve());
+    gApi.changes().id(change.id).current().submit();
+
+    try (Repository repo = repoManager.openRepository(project)) {
+      assertThat(repo.resolve(RefNames.REFS_CONFIG)).isEqualTo(c);
+    }
+  }
+
+  @Test
+  public void pushInitialCommitForNormalNonExistingBranchFails() throws Exception {
+    RevCommit c =
+        testRepo
+            .commit()
+            .message("Initial commit")
+            .author(admin.getIdent())
+            .committer(admin.getIdent())
+            .insertChangeId()
+            .create();
+    testRepo.reset(c);
+
+    String r = "refs/for/foo";
+    PushResult pr = pushHead(testRepo, r, false);
+    assertPushRejected(pr, r, "branch foo not found");
+
+    try (Repository repo = repoManager.openRepository(project)) {
+      assertThat(repo.resolve("foo")).isNull();
+    }
+  }
+
+  @Test
+  public void output() throws Exception {
+    String url = canonicalWebUrl.get() + "c/" + project.get() + "/+/";
+    ObjectId initialHead = testRepo.getRepository().resolve("HEAD");
+    PushOneCommit.Result r1 = pushTo("refs/for/master");
+    Change.Id id1 = r1.getChange().getId();
+    r1.assertOkStatus();
+    r1.assertChange(Change.Status.NEW, null);
+    r1.assertMessage(
+        "New changes:\n  " + url + id1 + " " + r1.getCommit().getShortMessage() + "\n");
+
+    testRepo.reset(initialHead);
+    String newMsg = r1.getCommit().getShortMessage() + " v2";
+    testRepo
+        .branch("HEAD")
+        .commit()
+        .message(newMsg)
+        .insertChangeId(r1.getChangeId().substring(1))
+        .create();
+    PushOneCommit.Result r2 =
+        pushFactory
+            .create(db, admin.getIdent(), testRepo, "another commit", "b.txt", "bbb")
+            .to("refs/for/master");
+    Change.Id id2 = r2.getChange().getId();
+    r2.assertOkStatus();
+    r2.assertChange(Change.Status.NEW, null);
+    r2.assertMessage(
+        "success\n"
+            + "\n"
+            + "New changes:\n"
+            + "  "
+            + url
+            + id2
+            + " another commit\n"
+            + "\n"
+            + "Updated changes:\n"
+            + "  "
+            + url
+            + id1
+            + " "
+            + newMsg
+            + "\n");
+  }
+
+  @Test
+  public void autocloseByCommit() throws Exception {
+    // Create a change
+    PushOneCommit.Result r = pushTo("refs/for/master");
+    r.assertOkStatus();
+
+    // Force push it, closing it
+    String master = "refs/heads/master";
+    assertPushOk(pushHead(testRepo, master, false), master);
+
+    // Attempt to push amended commit to same change
+    String url = canonicalWebUrl.get() + "c/" + project.get() + "/+/" + r.getChange().getId();
+    r = amendChange(r.getChangeId(), "refs/for/master");
+    r.assertErrorStatus("change " + url + " closed");
+
+    // Check change message that was added on auto-close
+    ChangeInfo change = gApi.changes().id(r.getChange().getId().get()).get();
+    assertThat(Iterables.getLast(change.messages).message)
+        .isEqualTo("Change has been successfully pushed.");
+  }
+
+  @Test
+  public void pushWithoutChangeIdDeprecated() throws Exception {
+    setRequireChangeId(InheritableBoolean.FALSE);
+    testRepo
+        .branch("HEAD")
+        .commit()
+        .message("A change")
+        .author(admin.getIdent())
+        .committer(new PersonIdent(admin.getIdent(), testRepo.getDate()))
+        .create();
+    PushResult result = pushHead(testRepo, "refs/for/master");
+    assertThat(result.getMessages()).contains("warning: pushing without Change-Id is deprecated");
+  }
+
+  @Test
+  public void autocloseByChangeId() throws Exception {
+    // Create a change
+    PushOneCommit.Result r = pushTo("refs/for/master");
+    r.assertOkStatus();
+
+    // Amend the commit locally
+    RevCommit c = testRepo.amend(r.getCommit()).create();
+    assertThat(c).isNotEqualTo(r.getCommit());
+    testRepo.reset(c);
+
+    // Force push it, closing it
+    String master = "refs/heads/master";
+    assertPushOk(pushHead(testRepo, master, false), master);
+
+    // Attempt to push amended commit to same change
+    String url = canonicalWebUrl.get() + "c/" + project.get() + "/+/" + r.getChange().getId();
+    r = amendChange(r.getChangeId(), "refs/for/master");
+    r.assertErrorStatus("change " + url + " closed");
+
+    // Check that new commit was added as patch set
+    ChangeInfo change = gApi.changes().id(r.getChange().getId().get()).get();
+    assertThat(change.revisions).hasSize(2);
+    assertThat(change.currentRevision).isEqualTo(c.name());
+  }
+
+  @Test
+  public void pushForMasterWithTopic() throws Exception {
+    // specify topic in ref
+    String topic = "my/topic";
+    PushOneCommit.Result r = pushTo("refs/for/master/" + topic);
+    r.assertOkStatus();
+    r.assertChange(Change.Status.NEW, topic);
+    r.assertMessage("deprecated topic syntax");
+
+    // specify topic as option
+    r = pushTo("refs/for/master%topic=" + topic);
+    r.assertOkStatus();
+    r.assertChange(Change.Status.NEW, topic);
+  }
+
+  @Test
+  public void pushForMasterWithTopicOption() throws Exception {
+    String topicOption = "topic=myTopic";
+    List<String> pushOptions = new ArrayList<>();
+    pushOptions.add(topicOption);
+
+    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
+    push.setPushOptions(pushOptions);
+    PushOneCommit.Result r = push.to("refs/for/master");
+
+    r.assertOkStatus();
+    r.assertChange(Change.Status.NEW, "myTopic");
+    r.assertPushOptions(pushOptions);
+  }
+
+  @Test
+  public void pushForMasterWithTopicInRefExceedLimitFails() throws Exception {
+    String topic = Stream.generate(() -> "t").limit(2049).collect(joining());
+    PushOneCommit.Result r = pushTo("refs/for/master/" + topic);
+    r.assertErrorStatus("topic length exceeds the limit (2048)");
+  }
+
+  @Test
+  public void pushForMasterWithTopicAsOptionExceedLimitFails() throws Exception {
+    String topic = Stream.generate(() -> "t").limit(2049).collect(joining());
+    PushOneCommit.Result r = pushTo("refs/for/master%topic=" + topic);
+    r.assertErrorStatus("topic length exceeds the limit (2048)");
+  }
+
+  @Test
+  public void pushForMasterWithNotify() throws Exception {
+    // create a user that watches the project
+    TestAccount user3 = accountCreator.create("user3", "user3@example.com", "User3");
+    List<ProjectWatchInfo> projectsToWatch = new ArrayList<>();
+    ProjectWatchInfo pwi = new ProjectWatchInfo();
+    pwi.project = project.get();
+    pwi.filter = "*";
+    pwi.notifyNewChanges = true;
+    projectsToWatch.add(pwi);
+    setApiUser(user3);
+    gApi.accounts().self().setWatchedProjects(projectsToWatch);
+
+    TestAccount user2 = accountCreator.user2();
+    String pushSpec = "refs/for/master%reviewer=" + user.email + ",cc=" + user2.email;
+
+    sender.clear();
+    PushOneCommit.Result r = pushTo(pushSpec + ",notify=" + NotifyHandling.NONE);
+    r.assertOkStatus();
+    assertThat(sender.getMessages()).isEmpty();
+
+    sender.clear();
+    r = pushTo(pushSpec + ",notify=" + NotifyHandling.OWNER);
+    r.assertOkStatus();
+    // no email notification about own changes
+    assertThat(sender.getMessages()).isEmpty();
+
+    sender.clear();
+    r = pushTo(pushSpec + ",notify=" + NotifyHandling.OWNER_REVIEWERS);
+    r.assertOkStatus();
+    assertThat(sender.getMessages()).hasSize(1);
+    Message m = sender.getMessages().get(0);
+    if (notesMigration.readChanges()) {
+      assertThat(m.rcpt()).containsExactly(user.emailAddress);
+    } else {
+      // CCs are considered reviewers in the storage layer and so get notified.
+      assertThat(m.rcpt()).containsExactly(user.emailAddress, user2.emailAddress);
+    }
+
+    sender.clear();
+    r = pushTo(pushSpec + ",notify=" + NotifyHandling.ALL);
+    r.assertOkStatus();
+    assertThat(sender.getMessages()).hasSize(1);
+    m = sender.getMessages().get(0);
+    assertThat(m.rcpt()).containsExactly(user.emailAddress, user2.emailAddress, user3.emailAddress);
+
+    sender.clear();
+    r = pushTo(pushSpec + ",notify=" + NotifyHandling.NONE + ",notify-to=" + user3.email);
+    r.assertOkStatus();
+    assertNotifyTo(user3);
+
+    sender.clear();
+    r = pushTo(pushSpec + ",notify=" + NotifyHandling.NONE + ",notify-cc=" + user3.email);
+    r.assertOkStatus();
+    assertNotifyCc(user3);
+
+    sender.clear();
+    r = pushTo(pushSpec + ",notify=" + NotifyHandling.NONE + ",notify-bcc=" + user3.email);
+    r.assertOkStatus();
+    assertNotifyBcc(user3);
+
+    // request that sender gets notified as TO, CC and BCC, email should be sent
+    // even if the sender is the only recipient
+    sender.clear();
+    pushTo(pushSpec + ",notify=" + NotifyHandling.NONE + ",notify-to=" + admin.email);
+    assertNotifyTo(admin);
+
+    sender.clear();
+    r = pushTo(pushSpec + ",notify=" + NotifyHandling.NONE + ",notify-cc=" + admin.email);
+    r.assertOkStatus();
+    assertNotifyCc(admin);
+
+    sender.clear();
+    r = pushTo(pushSpec + ",notify=" + NotifyHandling.NONE + ",notify-bcc=" + admin.email);
+    r.assertOkStatus();
+    assertNotifyBcc(admin);
+  }
+
+  @Test
+  public void pushForMasterWithCc() throws Exception {
+    // cc one user
+    String topic = "my/topic";
+    PushOneCommit.Result r = pushTo("refs/for/master/" + topic + "%cc=" + user.email);
+    r.assertOkStatus();
+    r.assertChange(Change.Status.NEW, topic, ImmutableList.of(), ImmutableList.of(user));
+
+    // cc several users
+    r =
+        pushTo(
+            "refs/for/master/"
+                + topic
+                + "%cc="
+                + admin.email
+                + ",cc="
+                + user.email
+                + ",cc="
+                + accountCreator.user2().email);
+    r.assertOkStatus();
+    // Check that admin isn't CC'd as they own the change
+    r.assertChange(
+        Change.Status.NEW,
+        topic,
+        ImmutableList.of(),
+        ImmutableList.of(user, accountCreator.user2()));
+
+    // cc non-existing user
+    String nonExistingEmail = "non.existing@example.com";
+    r =
+        pushTo(
+            "refs/for/master/"
+                + topic
+                + "%cc="
+                + admin.email
+                + ",cc="
+                + nonExistingEmail
+                + ",cc="
+                + user.email);
+    r.assertErrorStatus(nonExistingEmail + " does not identify a registered user or group");
+  }
+
+  @Test
+  public void pushForMasterWithCcByEmail() throws Exception {
+    ConfigInput conf = new ConfigInput();
+    conf.enableReviewerByEmail = InheritableBoolean.TRUE;
+    gApi.projects().name(project.get()).config(conf);
+
+    PushOneCommit.Result r =
+        pushTo("refs/for/master%cc=non.existing.1@example.com,cc=non.existing.2@example.com");
+    if (notesMigration.readChanges()) {
+      r.assertOkStatus();
+
+      ChangeInfo ci = get(r.getChangeId(), DETAILED_LABELS);
+      ImmutableList<AccountInfo> ccs =
+          firstNonNull(ci.reviewers.get(ReviewerState.CC), ImmutableList.<AccountInfo>of()).stream()
+              .sorted(comparing((AccountInfo a) -> a.email))
+              .collect(toImmutableList());
+      assertThat(ccs).hasSize(2);
+      assertThat(ccs.get(0).email).isEqualTo("non.existing.1@example.com");
+      assertThat(ccs.get(0)._accountId).isNull();
+      assertThat(ccs.get(1).email).isEqualTo("non.existing.2@example.com");
+      assertThat(ccs.get(1)._accountId).isNull();
+    } else {
+      r.assertErrorStatus("non.existing.1@example.com does not identify a registered user");
+    }
+  }
+
+  @Test
+  public void pushForMasterWithCcGroup() throws Exception {
+    TestAccount user2 = accountCreator.user2();
+    String group = name("group");
+    GroupInput gin = new GroupInput();
+    gin.name = group;
+    gin.members = ImmutableList.of(user.username, user2.username);
+    gin.visibleToAll = true; // TODO(dborowitz): Shouldn't be necessary; see ReviewerAdder.
+    gApi.groups().create(gin);
+
+    PushOneCommit.Result r = pushTo("refs/for/master%cc=" + group);
+    r.assertOkStatus();
+    r.assertChange(Change.Status.NEW, null, ImmutableList.of(), ImmutableList.of(user, user2));
+  }
+
+  @Test
+  public void pushForMasterWithReviewer() throws Exception {
+    // add one reviewer
+    String topic = "my/topic";
+    PushOneCommit.Result r = pushTo("refs/for/master/" + topic + "%r=" + user.email);
+    r.assertOkStatus();
+    r.assertChange(Change.Status.NEW, topic, user);
+
+    // add several reviewers
+    TestAccount user2 =
+        accountCreator.create("another-user", "another.user@example.com", "Another User");
+    r =
+        pushTo(
+            "refs/for/master/"
+                + topic
+                + "%r="
+                + admin.email
+                + ",r="
+                + user.email
+                + ",r="
+                + user2.email);
+    r.assertOkStatus();
+    // admin is the owner of the change and should not appear as reviewer
+    r.assertChange(Change.Status.NEW, topic, user, user2);
+
+    // add non-existing user as reviewer
+    String nonExistingEmail = "non.existing@example.com";
+    r =
+        pushTo(
+            "refs/for/master/"
+                + topic
+                + "%r="
+                + admin.email
+                + ",r="
+                + nonExistingEmail
+                + ",r="
+                + user.email);
+    r.assertErrorStatus(nonExistingEmail + " does not identify a registered user or group");
+  }
+
+  @Test
+  public void pushForMasterWithReviewerByEmail() throws Exception {
+    ConfigInput conf = new ConfigInput();
+    conf.enableReviewerByEmail = InheritableBoolean.TRUE;
+    gApi.projects().name(project.get()).config(conf);
+
+    PushOneCommit.Result r =
+        pushTo("refs/for/master%r=non.existing.1@example.com,r=non.existing.2@example.com");
+    if (notesMigration.readChanges()) {
+      r.assertOkStatus();
+
+      ChangeInfo ci = get(r.getChangeId(), DETAILED_LABELS);
+      ImmutableList<AccountInfo> reviewers =
+          firstNonNull(ci.reviewers.get(ReviewerState.REVIEWER), ImmutableList.<AccountInfo>of())
+              .stream()
+              .sorted(comparing((AccountInfo a) -> a.email))
+              .collect(toImmutableList());
+      assertThat(reviewers).hasSize(2);
+      assertThat(reviewers.get(0).email).isEqualTo("non.existing.1@example.com");
+      assertThat(reviewers.get(0)._accountId).isNull();
+      assertThat(reviewers.get(1).email).isEqualTo("non.existing.2@example.com");
+      assertThat(reviewers.get(1)._accountId).isNull();
+    } else {
+      r.assertErrorStatus("non.existing.1@example.com does not identify a registered user");
+    }
+  }
+
+  @Test
+  public void pushForMasterWithReviewerGroup() throws Exception {
+    TestAccount user2 = accountCreator.user2();
+    String group = name("group");
+    GroupInput gin = new GroupInput();
+    gin.name = group;
+    gin.members = ImmutableList.of(user.username, user2.username);
+    gin.visibleToAll = true; // TODO(dborowitz): Shouldn't be necessary; see ReviewerAdder.
+    gApi.groups().create(gin);
+
+    PushOneCommit.Result r = pushTo("refs/for/master%r=" + group);
+    r.assertOkStatus();
+    r.assertChange(Change.Status.NEW, null, ImmutableList.of(user, user2), ImmutableList.of());
+  }
+
+  @Test
+  public void pushPrivateChange() throws Exception {
+    // Push a private change.
+    PushOneCommit.Result r = pushTo("refs/for/master%private");
+    r.assertOkStatus();
+    r.assertMessage(" [PRIVATE]");
+    assertThat(r.getChange().change().isPrivate()).isTrue();
+
+    // Pushing a new patch set without --private doesn't remove the privacy flag from the change.
+    r = amendChange(r.getChangeId(), "refs/for/master");
+    r.assertOkStatus();
+    r.assertMessage(" [PRIVATE]");
+    assertThat(r.getChange().change().isPrivate()).isTrue();
+
+    // Remove the privacy flag from the change.
+    r = amendChange(r.getChangeId(), "refs/for/master%remove-private");
+    r.assertOkStatus();
+    r.assertNotMessage(" [PRIVATE]");
+    assertThat(r.getChange().change().isPrivate()).isFalse();
+
+    // Normal push: privacy flag is not added back.
+    r = amendChange(r.getChangeId(), "refs/for/master");
+    r.assertOkStatus();
+    r.assertNotMessage(" [PRIVATE]");
+    assertThat(r.getChange().change().isPrivate()).isFalse();
+
+    // Make the change private again.
+    r = pushTo("refs/for/master%private");
+    r.assertOkStatus();
+    r.assertMessage(" [PRIVATE]");
+    assertThat(r.getChange().change().isPrivate()).isTrue();
+
+    // Can't use --private and --remove-private together.
+    r = pushTo("refs/for/master%private,remove-private");
+    r.assertErrorStatus();
+  }
+
+  @Test
+  public void pushWorkInProgressChange() throws Exception {
+    // Push a work-in-progress change.
+    PushOneCommit.Result r = pushTo("refs/for/master%wip");
+    r.assertOkStatus();
+    r.assertMessage(" [WIP]");
+    assertThat(r.getChange().change().isWorkInProgress()).isTrue();
+    assertUploadTag(r.getChange(), ChangeMessagesUtil.TAG_UPLOADED_WIP_PATCH_SET);
+
+    // Pushing a new patch set without --wip doesn't remove the wip flag from the change.
+    r = amendChange(r.getChangeId(), "refs/for/master");
+    r.assertOkStatus();
+    r.assertMessage(" [WIP]");
+    assertThat(r.getChange().change().isWorkInProgress()).isTrue();
+    assertUploadTag(r.getChange(), ChangeMessagesUtil.TAG_UPLOADED_WIP_PATCH_SET);
+
+    // Remove the wip flag from the change.
+    r = amendChange(r.getChangeId(), "refs/for/master%ready");
+    r.assertOkStatus();
+    r.assertNotMessage(" [WIP]");
+    assertThat(r.getChange().change().isWorkInProgress()).isFalse();
+    assertUploadTag(r.getChange(), ChangeMessagesUtil.TAG_UPLOADED_PATCH_SET);
+
+    // Normal push: wip flag is not added back.
+    r = amendChange(r.getChangeId(), "refs/for/master");
+    r.assertOkStatus();
+    r.assertNotMessage(" [WIP]");
+    assertThat(r.getChange().change().isWorkInProgress()).isFalse();
+    assertUploadTag(r.getChange(), ChangeMessagesUtil.TAG_UPLOADED_PATCH_SET);
+
+    // Make the change work-in-progress again.
+    r = amendChange(r.getChangeId(), "refs/for/master%wip");
+    r.assertOkStatus();
+    r.assertMessage(" [WIP]");
+    assertThat(r.getChange().change().isWorkInProgress()).isTrue();
+    assertUploadTag(r.getChange(), ChangeMessagesUtil.TAG_UPLOADED_WIP_PATCH_SET);
+
+    // Can't use --wip and --ready together.
+    r = amendChange(r.getChangeId(), "refs/for/master%wip,ready");
+    r.assertErrorStatus();
+  }
+
+  private void assertUploadTag(ChangeData cd, String expectedTag) throws Exception {
+    List<ChangeMessage> msgs = cd.messages();
+    assertThat(msgs).isNotEmpty();
+    assertThat(Iterables.getLast(msgs).getTag()).isEqualTo(expectedTag);
+  }
+
+  @Test
+  public void pushWorkInProgressChangeWhenNotOwner() throws Exception {
+    TestRepository<?> userRepo = cloneProject(project, user);
+    PushOneCommit.Result r =
+        pushFactory.create(db, user.getIdent(), userRepo).to("refs/for/master%wip");
+    r.assertOkStatus();
+    assertThat(r.getChange().change().getOwner()).isEqualTo(user.id);
+    assertThat(r.getChange().change().isWorkInProgress()).isTrue();
+
+    // Admin user trying to move from WIP to ready should succeed.
+    GitUtil.fetch(testRepo, r.getPatchSet().getRefName() + ":ps");
+    testRepo.reset("ps");
+    r = amendChange(r.getChangeId(), "refs/for/master%ready", user, testRepo);
+    r.assertOkStatus();
+
+    // Other user trying to move from WIP to WIP should succeed.
+    r = amendChange(r.getChangeId(), "refs/for/master%wip", admin, testRepo);
+    r.assertOkStatus();
+    assertThat(r.getChange().change().isWorkInProgress()).isTrue();
+
+    // Push as change owner to move change from WIP to ready.
+    r = pushFactory.create(db, user.getIdent(), userRepo).to("refs/for/master%ready");
+    r.assertOkStatus();
+    assertThat(r.getChange().change().isWorkInProgress()).isFalse();
+
+    // Admin user trying to move from ready to WIP should succeed.
+    GitUtil.fetch(testRepo, r.getPatchSet().getRefName() + ":ps");
+    testRepo.reset("ps");
+    r = amendChange(r.getChangeId(), "refs/for/master%wip", admin, testRepo);
+    r.assertOkStatus();
+
+    // Other user trying to move from wip to wip should succeed.
+    r = amendChange(r.getChangeId(), "refs/for/master%wip", admin, testRepo);
+    r.assertOkStatus();
+
+    // Non owner, non admin and non project owner cannot flip wip bit:
+    TestAccount user2 = accountCreator.user2();
+    grant(
+        project, "refs/*", Permission.FORGE_COMMITTER, false, SystemGroupBackend.REGISTERED_USERS);
+    TestRepository<?> user2Repo = cloneProject(project, user2);
+    GitUtil.fetch(user2Repo, r.getPatchSet().getRefName() + ":ps");
+    user2Repo.reset("ps");
+    r = amendChange(r.getChangeId(), "refs/for/master%ready", user2, user2Repo);
+    r.assertErrorStatus(ReceiveConstants.ONLY_CHANGE_OWNER_OR_PROJECT_OWNER_CAN_MODIFY_WIP);
+
+    // Project owner trying to move from WIP to ready should succeed.
+    allow("refs/*", Permission.OWNER, SystemGroupBackend.REGISTERED_USERS);
+    r = amendChange(r.getChangeId(), "refs/for/master%ready", user2, user2Repo);
+    r.assertOkStatus();
+  }
+
+  @Test
+  public void pushForMasterAsEdit() throws Exception {
+    PushOneCommit.Result r = pushTo("refs/for/master");
+    r.assertOkStatus();
+    Optional<EditInfo> edit = getEdit(r.getChangeId());
+    assertThat(edit).isAbsent();
+    assertThat(query("has:edit")).isEmpty();
+
+    // specify edit as option
+    r = amendChange(r.getChangeId(), "refs/for/master%edit");
+    r.assertOkStatus();
+    edit = getEdit(r.getChangeId());
+    assertThat(edit).isPresent();
+    EditInfo editInfo = edit.get();
+    r.assertMessage(
+        "Updated Changes:\n  "
+            + canonicalWebUrl.get()
+            + "c/"
+            + project.get()
+            + "/+/"
+            + r.getChange().getId()
+            + " "
+            + editInfo.commit.subject
+            + " [EDIT]\n");
+
+    // verify that the re-indexing was triggered for the change
+    assertThat(query("has:edit")).hasSize(1);
+  }
+
+  @Test
+  public void pushForMasterWithMessage() throws Exception {
+    PushOneCommit.Result r = pushTo("refs/for/master/%m=my_test_message");
+    r.assertOkStatus();
+    r.assertChange(Change.Status.NEW, null);
+    ChangeInfo ci = get(r.getChangeId(), MESSAGES, ALL_REVISIONS);
+    Collection<ChangeMessageInfo> changeMessages = ci.messages;
+    assertThat(changeMessages).hasSize(1);
+    for (ChangeMessageInfo cm : changeMessages) {
+      assertThat(cm.message).isEqualTo("Uploaded patch set 1.\nmy test message");
+    }
+    Collection<RevisionInfo> revisions = ci.revisions.values();
+    assertThat(revisions).hasSize(1);
+    for (RevisionInfo ri : revisions) {
+      assertThat(ri.description).isEqualTo("my test message");
+    }
+  }
+
+  @Test
+  public void pushForMasterWithMessageTwiceWithDifferentMessages() throws Exception {
+    enableCreateNewChangeForAllNotInTarget();
+
+    PushOneCommit push =
+        pushFactory.create(
+            db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "a.txt", "content");
+    // %2C is comma; the value below tests that percent decoding happens after splitting.
+    // All three ways of representing space ("%20", "+", and "_" are also exercised.
+    PushOneCommit.Result r = push.to("refs/for/master/%m=my_test%20+_message%2Cm=");
+    r.assertOkStatus();
+
+    push =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            testRepo,
+            PushOneCommit.SUBJECT,
+            "b.txt",
+            "anotherContent",
+            r.getChangeId());
+    r = push.to("refs/for/master/%m=new_test_message");
+    r.assertOkStatus();
+
+    ChangeInfo ci = get(r.getChangeId(), ALL_REVISIONS);
+    Collection<RevisionInfo> revisions = ci.revisions.values();
+    assertThat(revisions).hasSize(2);
+    for (RevisionInfo ri : revisions) {
+      if (ri.isCurrent) {
+        assertThat(ri.description).isEqualTo("new test message");
+      } else {
+        assertThat(ri.description).isEqualTo("my test   message,m=");
+      }
+    }
+  }
+
+  @Test
+  public void pushForMasterWithPercentEncodedMessage() throws Exception {
+    // Exercise percent-encoding of UTF-8, underscores, and patterns reserved by git-rev-parse.
+    PushOneCommit.Result r =
+        pushTo(
+            "refs/for/master/%m="
+                + "Punctu%2E%2e%2Eation%7E%2D%40%7Bu%7D%20%7C%20%28%E2%95%AF%C2%B0%E2%96%A1%C2%B0"
+                + "%EF%BC%89%E2%95%AF%EF%B8%B5%20%E2%94%BB%E2%94%81%E2%94%BB%20%5E%5F%5E");
+    r.assertOkStatus();
+    r.assertChange(Change.Status.NEW, null);
+    ChangeInfo ci = get(r.getChangeId(), MESSAGES, ALL_REVISIONS);
+    Collection<ChangeMessageInfo> changeMessages = ci.messages;
+    assertThat(changeMessages).hasSize(1);
+    for (ChangeMessageInfo cm : changeMessages) {
+      assertThat(cm.message)
+          .isEqualTo("Uploaded patch set 1.\nPunctu...ation~-@{u} | (╯°□°）╯︵ ┻━┻ ^_^");
+    }
+    Collection<RevisionInfo> revisions = ci.revisions.values();
+    assertThat(revisions).hasSize(1);
+    for (RevisionInfo ri : revisions) {
+      assertThat(ri.description).isEqualTo("Punctu...ation~-@{u} | (╯°□°）╯︵ ┻━┻ ^_^");
+    }
+  }
+
+  @Test
+  public void pushForMasterWithInvalidPercentEncodedMessage() throws Exception {
+    PushOneCommit.Result r = pushTo("refs/for/master/%m=not_percent_decodable_%%oops%20");
+    r.assertOkStatus();
+    r.assertChange(Change.Status.NEW, null);
+    ChangeInfo ci = get(r.getChangeId(), MESSAGES, ALL_REVISIONS);
+    Collection<ChangeMessageInfo> changeMessages = ci.messages;
+    assertThat(changeMessages).hasSize(1);
+    for (ChangeMessageInfo cm : changeMessages) {
+      assertThat(cm.message).isEqualTo("Uploaded patch set 1.\nnot percent decodable %%oops%20");
+    }
+    Collection<RevisionInfo> revisions = ci.revisions.values();
+    assertThat(revisions).hasSize(1);
+    for (RevisionInfo ri : revisions) {
+      assertThat(ri.description).isEqualTo("not percent decodable %%oops%20");
+    }
+  }
+
+  @Test
+  public void pushForMasterWithApprovals() throws Exception {
+    PushOneCommit.Result r = pushTo("refs/for/master/%l=Code-Review");
+    r.assertOkStatus();
+    ChangeInfo ci = get(r.getChangeId(), DETAILED_LABELS, MESSAGES, DETAILED_ACCOUNTS);
+    LabelInfo cr = ci.labels.get("Code-Review");
+    assertThat(cr.all).hasSize(1);
+    assertThat(cr.all.get(0).name).isEqualTo("Administrator");
+    assertThat(cr.all.get(0).value).isEqualTo(1);
+    assertThat(Iterables.getLast(ci.messages).message)
+        .isEqualTo("Uploaded patch set 1: Code-Review+1.");
+
+    PushOneCommit push =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            testRepo,
+            PushOneCommit.SUBJECT,
+            "b.txt",
+            "anotherContent",
+            r.getChangeId());
+    r = push.to("refs/for/master/%l=Code-Review+2");
+
+    ci = get(r.getChangeId(), DETAILED_LABELS, MESSAGES, DETAILED_ACCOUNTS);
+    cr = ci.labels.get("Code-Review");
+    assertThat(Iterables.getLast(ci.messages).message)
+        .isEqualTo("Uploaded patch set 2: Code-Review+2.");
+    // Check that the user who pushed the change was added as a reviewer since they added a vote
+    assertThatUserIsOnlyReviewer(ci, admin);
+
+    assertThat(cr.all).hasSize(1);
+    assertThat(cr.all.get(0).name).isEqualTo("Administrator");
+    assertThat(cr.all.get(0).value).isEqualTo(2);
+
+    push =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            testRepo,
+            PushOneCommit.SUBJECT,
+            "c.txt",
+            "moreContent",
+            r.getChangeId());
+    r = push.to("refs/for/master/%l=Code-Review+2");
+    ci = get(r.getChangeId(), MESSAGES);
+    assertThat(Iterables.getLast(ci.messages).message).isEqualTo("Uploaded patch set 3.");
+  }
+
+  @Test
+  public void pushNewPatchSetForMasterWithApprovals() throws Exception {
+    PushOneCommit.Result r = pushTo("refs/for/master");
+    r.assertOkStatus();
+
+    PushOneCommit push =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            testRepo,
+            PushOneCommit.SUBJECT,
+            "b.txt",
+            "anotherContent",
+            r.getChangeId());
+    r = push.to("refs/for/master/%l=Code-Review+2");
+
+    ChangeInfo ci = get(r.getChangeId(), DETAILED_LABELS, MESSAGES, DETAILED_ACCOUNTS);
+    LabelInfo cr = ci.labels.get("Code-Review");
+    assertThat(Iterables.getLast(ci.messages).message)
+        .isEqualTo("Uploaded patch set 2: Code-Review+2.");
+
+    // Check that the user who pushed the new patch set was added as a reviewer since they added
+    // a vote
+    assertThatUserIsOnlyReviewer(ci, admin);
+
+    assertThat(cr.all).hasSize(1);
+    assertThat(cr.all.get(0).name).isEqualTo("Administrator");
+    assertThat(cr.all.get(0).value).isEqualTo(2);
+  }
+
+  @Test
+  public void pushForMasterWithForgedAuthorAndCommitter() throws Exception {
+    TestAccount user2 = accountCreator.user2();
+    // Create a commit with different forged author and committer.
+    RevCommit c =
+        commitBuilder()
+            .author(user.getIdent())
+            .committer(user2.getIdent())
+            .add(PushOneCommit.FILE_NAME, PushOneCommit.FILE_CONTENT)
+            .message(PushOneCommit.SUBJECT)
+            .create();
+    // Push commit as "Admnistrator".
+    pushHead(testRepo, "refs/for/master");
+
+    String changeId = GitUtil.getChangeId(testRepo, c).get();
+    assertThat(getOwnerEmail(changeId)).isEqualTo(admin.email);
+    assertThat(getReviewerEmails(changeId, ReviewerState.REVIEWER))
+        .containsExactly(user.email, user2.email);
+
+    assertThat(sender.getMessages()).hasSize(1);
+    assertThat(sender.getMessages().get(0).rcpt())
+        .containsExactly(user.emailAddress, user2.emailAddress);
+  }
+
+  @Test
+  public void pushNewPatchSetForMasterWithForgedAuthorAndCommitter() throws Exception {
+    TestAccount user2 = accountCreator.user2();
+    // First patch set has author and committer matching change owner.
+    PushOneCommit.Result r = pushTo("refs/for/master");
+
+    assertThat(getOwnerEmail(r.getChangeId())).isEqualTo(admin.email);
+    assertThat(getReviewerEmails(r.getChangeId(), ReviewerState.REVIEWER)).isEmpty();
+
+    amendBuilder()
+        .author(user.getIdent())
+        .committer(user2.getIdent())
+        .add(PushOneCommit.FILE_NAME, PushOneCommit.FILE_CONTENT + "2")
+        .create();
+    pushHead(testRepo, "refs/for/master");
+
+    assertThat(getOwnerEmail(r.getChangeId())).isEqualTo(admin.email);
+    assertThat(getReviewerEmails(r.getChangeId(), ReviewerState.REVIEWER))
+        .containsExactly(user.email, user2.email);
+
+    assertThat(sender.getMessages()).hasSize(1);
+    assertThat(sender.getMessages().get(0).rcpt())
+        .containsExactly(user.emailAddress, user2.emailAddress);
+  }
+
+  /**
+   * There was a bug that allowed a user with Forge Committer Identity access right to upload a
+   * commit and put *votes on behalf of another user* on it. This test checks that this is not
+   * possible, but that the votes that are specified on push are applied only on behalf of the
+   * uploader.
+   *
+   * <p>This particular bug only occurred when there was more than one label defined. However to
+   * test that the votes that are specified on push are applied on behalf of the uploader a single
+   * label is sufficient.
+   */
+  @Test
+  public void pushForMasterWithApprovalsForgeCommitterButNoForgeVote() throws Exception {
+    // Create a commit with "User" as author and committer
+    RevCommit c =
+        commitBuilder()
+            .author(user.getIdent())
+            .committer(user.getIdent())
+            .add(PushOneCommit.FILE_NAME, PushOneCommit.FILE_CONTENT)
+            .message(PushOneCommit.SUBJECT)
+            .create();
+
+    // Push this commit as "Administrator" (requires Forge Committer Identity)
+    pushHead(testRepo, "refs/for/master/%l=Code-Review+1", false);
+
+    // Expected Code-Review votes:
+    // 1. 0 from User (committer):
+    //    When the committer is forged, the committer is automatically added as
+    //    reviewer, hence we expect a dummy 0 vote for the committer.
+    // 2. +1 from Administrator (uploader):
+    //    On push Code-Review+1 was specified, hence we expect a +1 vote from
+    //    the uploader.
+    ChangeInfo ci =
+        get(GitUtil.getChangeId(testRepo, c).get(), DETAILED_LABELS, MESSAGES, DETAILED_ACCOUNTS);
+    LabelInfo cr = ci.labels.get("Code-Review");
+    assertThat(cr.all).hasSize(2);
+    int indexAdmin = admin.fullName.equals(cr.all.get(0).name) ? 0 : 1;
+    int indexUser = indexAdmin == 0 ? 1 : 0;
+    assertThat(cr.all.get(indexAdmin).name).isEqualTo(admin.fullName);
+    assertThat(cr.all.get(indexAdmin).value.intValue()).isEqualTo(1);
+    assertThat(cr.all.get(indexUser).name).isEqualTo(user.fullName);
+    assertThat(cr.all.get(indexUser).value.intValue()).isEqualTo(0);
+    assertThat(Iterables.getLast(ci.messages).message)
+        .isEqualTo("Uploaded patch set 1: Code-Review+1.");
+    // Check that the user who pushed the change was added as a reviewer since they added a vote
+    assertThatUserIsOnlyReviewer(ci, admin);
+  }
+
+  @Test
+  public void pushWithMultipleApprovals() throws Exception {
+    LabelType Q =
+        category("Custom-Label", value(1, "Positive"), value(0, "No score"), value(-1, "Negative"));
+    AccountGroup.UUID anon = systemGroupBackend.getGroup(ANONYMOUS_USERS).getUUID();
+    String heads = "refs/heads/*";
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      Util.allow(u.getConfig(), Permission.forLabel("Custom-Label"), -1, 1, anon, heads);
+      u.getConfig().getLabelSections().put(Q.getName(), Q);
+      u.save();
+    }
+
+    RevCommit c =
+        commitBuilder()
+            .author(admin.getIdent())
+            .committer(admin.getIdent())
+            .add(PushOneCommit.FILE_NAME, PushOneCommit.FILE_CONTENT)
+            .message(PushOneCommit.SUBJECT)
+            .create();
+
+    pushHead(testRepo, "refs/for/master/%l=Code-Review+1,l=Custom-Label-1", false);
+
+    ChangeInfo ci = get(GitUtil.getChangeId(testRepo, c).get(), DETAILED_LABELS, DETAILED_ACCOUNTS);
+    LabelInfo cr = ci.labels.get("Code-Review");
+    assertThat(cr.all).hasSize(1);
+    cr = ci.labels.get("Custom-Label");
+    assertThat(cr.all).hasSize(1);
+    // Check that the user who pushed the change was added as a reviewer since they added a vote
+    assertThatUserIsOnlyReviewer(ci, admin);
+  }
+
+  @Test
+  @GerritConfig(name = "receive.allowPushToRefsChanges", value = "true")
+  public void pushToRefsChangesAllowed() throws Exception {
+    PushOneCommit.Result r = pushOneCommitToRefsChanges();
+    r.assertOkStatus();
+  }
+
+  @Test
+  public void pushNewPatchsetToRefsChanges() throws Exception {
+    PushOneCommit.Result r = pushOneCommitToRefsChanges();
+    r.assertErrorStatus("upload to refs/changes not allowed");
+  }
+
+  @Test
+  @GerritConfig(name = "receive.allowPushToRefsChanges", value = "false")
+  public void pushToRefsChangesNotAllowed() throws Exception {
+    PushOneCommit.Result r = pushOneCommitToRefsChanges();
+    r.assertErrorStatus("upload to refs/changes not allowed");
+  }
+
+  private PushOneCommit.Result pushOneCommitToRefsChanges() throws Exception {
+    PushOneCommit.Result r = pushTo("refs/for/master");
+    r.assertOkStatus();
+    PushOneCommit push =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            testRepo,
+            PushOneCommit.SUBJECT,
+            "b.txt",
+            "anotherContent",
+            r.getChangeId());
+    return push.to("refs/changes/" + r.getChange().change().getId().get());
+  }
+
+  @Test
+  public void pushNewPatchsetToPatchSetLockedChange() throws Exception {
+    PushOneCommit.Result r = pushTo("refs/for/master");
+    r.assertOkStatus();
+    PushOneCommit push =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            testRepo,
+            PushOneCommit.SUBJECT,
+            "b.txt",
+            "anotherContent",
+            r.getChangeId());
+    revision(r).review(new ReviewInput().label("Patch-Set-Lock", 1));
+    r = push.to("refs/for/master");
+    r.assertErrorStatus("cannot add patch set to " + r.getChange().change().getChangeId() + ".");
+  }
+
+  @Test
+  public void pushForMasterWithApprovals_MissingLabel() throws Exception {
+    PushOneCommit.Result r = pushTo("refs/for/master/%l=Verify");
+    r.assertErrorStatus("label \"Verify\" is not a configured label");
+  }
+
+  @Test
+  public void pushForMasterWithApprovals_ValueOutOfRange() throws Exception {
+    PushOneCommit.Result r = pushTo("refs/for/master/%l=Code-Review-3");
+    r.assertErrorStatus("label \"Code-Review\": -3 is not a valid value");
+  }
+
+  @Test
+  public void pushForNonExistingBranch() throws Exception {
+    String branchName = "non-existing";
+    PushOneCommit.Result r = pushTo("refs/for/" + branchName);
+    r.assertErrorStatus("branch " + branchName + " not found");
+  }
+
+  @Test
+  public void pushForMasterWithHashtags() throws Exception {
+    // Hashtags only work when reading from NoteDB is enabled
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    // specify a single hashtag as option
+    String hashtag1 = "tag1";
+    Set<String> expected = ImmutableSet.of(hashtag1);
+    PushOneCommit.Result r = pushTo("refs/for/master%hashtag=#" + hashtag1);
+    r.assertOkStatus();
+    r.assertChange(Change.Status.NEW, null);
+
+    Set<String> hashtags = gApi.changes().id(r.getChangeId()).getHashtags();
+    assertThat(hashtags).containsExactlyElementsIn(expected);
+
+    // specify a single hashtag as option in new patch set
+    String hashtag2 = "tag2";
+    PushOneCommit push =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            testRepo,
+            PushOneCommit.SUBJECT,
+            "b.txt",
+            "anotherContent",
+            r.getChangeId());
+    r = push.to("refs/for/master/%hashtag=" + hashtag2);
+    r.assertOkStatus();
+    expected = ImmutableSet.of(hashtag1, hashtag2);
+    hashtags = gApi.changes().id(r.getChangeId()).getHashtags();
+    assertThat(hashtags).containsExactlyElementsIn(expected);
+  }
+
+  @Test
+  public void pushForMasterWithMultipleHashtags() throws Exception {
+    // Hashtags only work when reading from NoteDB is enabled
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    // specify multiple hashtags as options
+    String hashtag1 = "tag1";
+    String hashtag2 = "tag2";
+    Set<String> expected = ImmutableSet.of(hashtag1, hashtag2);
+    PushOneCommit.Result r =
+        pushTo("refs/for/master%hashtag=#" + hashtag1 + ",hashtag=##" + hashtag2);
+    r.assertOkStatus();
+    r.assertChange(Change.Status.NEW, null);
+
+    Set<String> hashtags = gApi.changes().id(r.getChangeId()).getHashtags();
+    assertThat(hashtags).containsExactlyElementsIn(expected);
+
+    // specify multiple hashtags as options in new patch set
+    String hashtag3 = "tag3";
+    String hashtag4 = "tag4";
+    PushOneCommit push =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            testRepo,
+            PushOneCommit.SUBJECT,
+            "b.txt",
+            "anotherContent",
+            r.getChangeId());
+    r = push.to("refs/for/master%hashtag=" + hashtag3 + ",hashtag=" + hashtag4);
+    r.assertOkStatus();
+    expected = ImmutableSet.of(hashtag1, hashtag2, hashtag3, hashtag4);
+    hashtags = gApi.changes().id(r.getChangeId()).getHashtags();
+    assertThat(hashtags).containsExactlyElementsIn(expected);
+  }
+
+  @Test
+  public void pushForMasterWithHashtagsNoteDbDisabled() throws Exception {
+    // Push with hashtags should fail when reading from NoteDb is disabled.
+    assume().that(notesMigration.readChanges()).isFalse();
+    PushOneCommit.Result r = pushTo("refs/for/master%hashtag=tag1");
+    r.assertErrorStatus("cannot add hashtags; noteDb is disabled");
+  }
+
+  @Test
+  public void pushCommitUsingSignedOffBy() throws Exception {
+    PushOneCommit push =
+        pushFactory.create(
+            db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "b.txt", "anotherContent");
+    PushOneCommit.Result r = push.to("refs/for/master");
+    r.assertOkStatus();
+
+    setUseSignedOffBy(InheritableBoolean.TRUE);
+    block(project, "refs/heads/master", Permission.FORGE_COMMITTER, REGISTERED_USERS);
+
+    push =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            testRepo,
+            PushOneCommit.SUBJECT
+                + String.format("\n\nSigned-off-by: %s <%s>", admin.fullName, admin.email),
+            "b.txt",
+            "anotherContent");
+    r = push.to("refs/for/master");
+    r.assertOkStatus();
+
+    push =
+        pushFactory.create(
+            db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "b.txt", "anotherContent");
+    r = push.to("refs/for/master");
+    r.assertErrorStatus("not Signed-off-by author/committer/uploader in message footer");
+  }
+
+  @Test
+  public void createNewChangeForAllNotInTarget() throws Exception {
+    enableCreateNewChangeForAllNotInTarget();
+
+    PushOneCommit push =
+        pushFactory.create(
+            db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "a.txt", "content");
+    PushOneCommit.Result r = push.to("refs/for/master");
+    r.assertOkStatus();
+
+    push =
+        pushFactory.create(
+            db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "b.txt", "anotherContent");
+    r = push.to("refs/for/master");
+    r.assertOkStatus();
+
+    gApi.projects().name(project.get()).branch("otherBranch").create(new BranchInput());
+
+    PushOneCommit.Result r2 = push.to("refs/for/otherBranch");
+    r2.assertOkStatus();
+    assertTwoChangesWithSameRevision(r);
+  }
+
+  @Test
+  public void pushChangeBasedOnChangeOfOtherUserWithCreateNewChangeForAllNotInTarget()
+      throws Exception {
+    enableCreateNewChangeForAllNotInTarget();
+
+    // create a change as admin
+    PushOneCommit push =
+        pushFactory.create(
+            db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "a.txt", "content");
+    PushOneCommit.Result r = push.to("refs/for/master");
+    r.assertOkStatus();
+    RevCommit commitChange1 = r.getCommit();
+
+    // create a second change as user (depends on the change from admin)
+    TestRepository<?> userRepo = cloneProject(project, user);
+    GitUtil.fetch(userRepo, r.getPatchSet().getRefName() + ":change");
+    userRepo.reset("change");
+    push =
+        pushFactory.create(
+            db, user.getIdent(), userRepo, PushOneCommit.SUBJECT, "b.txt", "anotherContent");
+    r = push.to("refs/for/master");
+    r.assertOkStatus();
+
+    // assert that no new change was created for the commit of the predecessor change
+    assertThat(query(commitChange1.name())).hasSize(1);
+  }
+
+  @Test
+  public void pushSameCommitTwiceUsingMagicBranchBaseOption() throws Exception {
+    grant(project, "refs/heads/master", Permission.PUSH);
+    PushOneCommit.Result rBase = pushTo("refs/heads/master");
+    rBase.assertOkStatus();
+
+    gApi.projects().name(project.get()).branch("foo").create(new BranchInput());
+
+    PushOneCommit push =
+        pushFactory.create(
+            db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "b.txt", "anotherContent");
+
+    PushOneCommit.Result r = push.to("refs/for/master");
+    r.assertOkStatus();
+
+    PushResult pr =
+        GitUtil.pushHead(testRepo, "refs/for/foo%base=" + rBase.getCommit().name(), false, false);
+    assertThat(pr.getMessages()).containsMatch("changes: .*new: 1.*done");
+
+    // BatchUpdate implementations differ in how they hook into progress monitors. We mostly just
+    // care that there is a new change.
+    assertThat(pr.getMessages()).containsMatch("changes: .*new: 1.*done");
+    assertTwoChangesWithSameRevision(r);
+  }
+
+  @Test
+  public void pushSameCommitTwice() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      u.getConfig()
+          .getProject()
+          .setBooleanConfig(
+              BooleanProjectConfig.CREATE_NEW_CHANGE_FOR_ALL_NOT_IN_TARGET,
+              InheritableBoolean.TRUE);
+      u.save();
+    }
+
+    PushOneCommit push =
+        pushFactory.create(
+            db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "a.txt", "content");
+    PushOneCommit.Result r = push.to("refs/for/master");
+    r.assertOkStatus();
+
+    push =
+        pushFactory.create(
+            db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "b.txt", "anotherContent");
+    r = push.to("refs/for/master");
+    r.assertOkStatus();
+
+    assertPushRejected(
+        pushHead(testRepo, "refs/for/master", false),
+        "refs/for/master",
+        "commit(s) already exists (as current patchset)");
+  }
+
+  @Test
+  public void pushSameCommitTwiceWhenIndexFailed() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      u.getConfig()
+          .getProject()
+          .setBooleanConfig(
+              BooleanProjectConfig.CREATE_NEW_CHANGE_FOR_ALL_NOT_IN_TARGET,
+              InheritableBoolean.TRUE);
+      u.save();
+    }
+
+    PushOneCommit push =
+        pushFactory.create(
+            db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "a.txt", "content");
+    PushOneCommit.Result r = push.to("refs/for/master");
+    r.assertOkStatus();
+
+    push =
+        pushFactory.create(
+            db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "b.txt", "anotherContent");
+    r = push.to("refs/for/master");
+    r.assertOkStatus();
+
+    indexer.delete(r.getChange().getId());
+
+    assertPushRejected(
+        pushHead(testRepo, "refs/for/master", false),
+        "refs/for/master",
+        "commit(s) already exists (as current patchset)");
+  }
+
+  private void assertTwoChangesWithSameRevision(PushOneCommit.Result result) throws Exception {
+    List<ChangeInfo> changes = query(result.getCommit().name());
+    assertThat(changes).hasSize(2);
+    ChangeInfo c1 = get(changes.get(0).id, CURRENT_REVISION);
+    ChangeInfo c2 = get(changes.get(1).id, CURRENT_REVISION);
+    assertThat(c1.project).isEqualTo(c2.project);
+    assertThat(c1.branch).isNotEqualTo(c2.branch);
+    assertThat(c1.changeId).isEqualTo(c2.changeId);
+    assertThat(c1.currentRevision).isEqualTo(c2.currentRevision);
+  }
+
+  @Test
+  public void pushAFewChanges() throws Exception {
+    testPushAFewChanges();
+  }
+
+  @Test
+  public void pushAFewChangesWithCreateNewChangeForAllNotInTarget() throws Exception {
+    enableCreateNewChangeForAllNotInTarget();
+    testPushAFewChanges();
+  }
+
+  private void testPushAFewChanges() throws Exception {
+    int n = 10;
+    String r = "refs/for/master";
+    ObjectId initialHead = testRepo.getRepository().resolve("HEAD");
+    List<RevCommit> commits = createChanges(n, r);
+
+    // Check that a change was created for each.
+    for (RevCommit c : commits) {
+      assertThat(byCommit(c).change().getSubject())
+          .named("change for " + c.name())
+          .isEqualTo(c.getShortMessage());
+    }
+
+    List<RevCommit> commits2 = amendChanges(initialHead, commits, r);
+
+    // Check that there are correct patch sets.
+    for (int i = 0; i < n; i++) {
+      RevCommit c = commits.get(i);
+      RevCommit c2 = commits2.get(i);
+      String name = "change for " + c2.name();
+      ChangeData cd = byCommit(c);
+      assertThat(cd.change().getSubject()).named(name).isEqualTo(c2.getShortMessage());
+      assertThat(getPatchSetRevisions(cd))
+          .named(name)
+          .containsExactlyEntriesIn(ImmutableMap.of(1, c.name(), 2, c2.name()));
+    }
+
+    // Pushing again results in "no new changes".
+    assertPushRejected(pushHead(testRepo, r, false), r, "no new changes");
+  }
+
+  @Test
+  public void pushWithoutChangeId() throws Exception {
+    testPushWithoutChangeId();
+  }
+
+  @Test
+  public void pushWithoutChangeIdWithCreateNewChangeForAllNotInTarget() throws Exception {
+    enableCreateNewChangeForAllNotInTarget();
+    testPushWithoutChangeId();
+  }
+
+  private void testPushWithoutChangeId() throws Exception {
+    RevCommit c = createCommit(testRepo, "Message without Change-Id");
+    assertThat(GitUtil.getChangeId(testRepo, c)).isEmpty();
+    pushForReviewRejected(testRepo, "missing Change-Id in message footer");
+
+    setRequireChangeId(InheritableBoolean.FALSE);
+    pushForReviewOk(testRepo);
+  }
+
+  @Test
+  public void errorMessageFormat() throws Exception {
+    RevCommit c = createCommit(testRepo, "Message without Change-Id");
+    assertThat(GitUtil.getChangeId(testRepo, c)).isEmpty();
+    String ref = "refs/for/master";
+    PushResult r = pushHead(testRepo, ref);
+    RemoteRefUpdate refUpdate = r.getRemoteUpdate(ref);
+    assertThat(refUpdate.getStatus()).isEqualTo(RemoteRefUpdate.Status.REJECTED_OTHER_REASON);
+    String reason =
+        String.format(
+            "commit %s: missing Change-Id in message footer", c.toObjectId().abbreviate(7).name());
+    assertThat(refUpdate.getMessage()).isEqualTo(reason);
+
+    assertThat(r.getMessages()).contains("\nERROR: " + reason);
+  }
+
+  @Test
+  @GerritConfig(name = "receive.allowPushToRefsChanges", value = "true")
+  public void testPushWithChangedChangeId() throws Exception {
+    PushOneCommit.Result r = pushTo("refs/for/master");
+    r.assertOkStatus();
+    PushOneCommit push =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            testRepo,
+            PushOneCommit.SUBJECT
+                + "\n\n"
+                + "Change-Id: I55eab7c7a76e95005fa9cc469aa8f9fc16da9eba\n",
+            "b.txt",
+            "anotherContent",
+            r.getChangeId());
+    r = push.to("refs/changes/" + r.getChange().change().getId().get());
+    r.assertErrorStatus(
+        String.format(
+            "commit %s: %s",
+            r.getCommit().abbreviate(RevId.ABBREV_LEN).name(),
+            ChangeIdValidator.CHANGE_ID_MISMATCH_MSG));
+  }
+
+  @Test
+  public void pushWithMultipleChangeIds() throws Exception {
+    testPushWithMultipleChangeIds();
+  }
+
+  @Test
+  public void pushWithMultipleChangeIdsWithCreateNewChangeForAllNotInTarget() throws Exception {
+    enableCreateNewChangeForAllNotInTarget();
+    testPushWithMultipleChangeIds();
+  }
+
+  private void testPushWithMultipleChangeIds() throws Exception {
+    createCommit(
+        testRepo,
+        "Message with multiple Change-Id\n"
+            + "\n"
+            + "Change-Id: I10f98c2ef76e52e23aa23be5afeb71e40b350e86\n"
+            + "Change-Id: Ie9a132e107def33bdd513b7854b50de911edba0a\n");
+    pushForReviewRejected(testRepo, "multiple Change-Id lines in message footer");
+
+    setRequireChangeId(InheritableBoolean.FALSE);
+    pushForReviewRejected(testRepo, "multiple Change-Id lines in message footer");
+  }
+
+  @Test
+  public void pushWithInvalidChangeId() throws Exception {
+    testpushWithInvalidChangeId();
+  }
+
+  @Test
+  public void pushWithInvalidChangeIdWithCreateNewChangeForAllNotInTarget() throws Exception {
+    enableCreateNewChangeForAllNotInTarget();
+    testpushWithInvalidChangeId();
+  }
+
+  private void testpushWithInvalidChangeId() throws Exception {
+    createCommit(testRepo, "Message with invalid Change-Id\n\nChange-Id: X\n");
+    pushForReviewRejected(testRepo, "invalid Change-Id line format in message footer");
+
+    setRequireChangeId(InheritableBoolean.FALSE);
+    pushForReviewRejected(testRepo, "invalid Change-Id line format in message footer");
+  }
+
+  @Test
+  public void pushWithInvalidChangeIdFromEgit() throws Exception {
+    testPushWithInvalidChangeIdFromEgit();
+  }
+
+  @Test
+  public void pushWithInvalidChangeIdFromEgitWithCreateNewChangeForAllNotInTarget()
+      throws Exception {
+    enableCreateNewChangeForAllNotInTarget();
+    testPushWithInvalidChangeIdFromEgit();
+  }
+
+  private void testPushWithInvalidChangeIdFromEgit() throws Exception {
+    createCommit(
+        testRepo,
+        "Message with invalid Change-Id\n"
+            + "\n"
+            + "Change-Id: I0000000000000000000000000000000000000000\n");
+    pushForReviewRejected(testRepo, "invalid Change-Id line format in message footer");
+
+    setRequireChangeId(InheritableBoolean.FALSE);
+    pushForReviewRejected(testRepo, "invalid Change-Id line format in message footer");
+  }
+
+  @Test
+  public void pushWithChangeIdInSubjectLine() throws Exception {
+    createCommit(testRepo, "Change-Id: I1234000000000000000000000000000000000000");
+    pushForReviewRejected(testRepo, "missing subject; Change-Id must be in message footer");
+
+    setRequireChangeId(InheritableBoolean.FALSE);
+    pushForReviewRejected(testRepo, "missing subject; Change-Id must be in message footer");
+  }
+
+  @Test
+  public void pushCommitWithSameChangeIdAsPredecessorChange() throws Exception {
+    PushOneCommit push =
+        pushFactory.create(
+            db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "a.txt", "content");
+    PushOneCommit.Result r = push.to("refs/for/master");
+    r.assertOkStatus();
+    RevCommit commitChange1 = r.getCommit();
+
+    createCommit(testRepo, commitChange1.getFullMessage());
+
+    pushForReviewRejected(
+        testRepo,
+        "same Change-Id in multiple changes.\n"
+            + "Squash the commits with the same Change-Id or ensure Change-Ids are unique for each"
+            + " commit");
+
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      u.getConfig()
+          .getProject()
+          .setBooleanConfig(BooleanProjectConfig.REQUIRE_CHANGE_ID, InheritableBoolean.FALSE);
+      u.save();
+    }
+
+    pushForReviewRejected(
+        testRepo,
+        "same Change-Id in multiple changes.\n"
+            + "Squash the commits with the same Change-Id or ensure Change-Ids are unique for each"
+            + " commit");
+  }
+
+  @Test
+  public void pushTwoCommitWithSameChangeId() throws Exception {
+    RevCommit commitChange1 = createCommitWithChangeId(testRepo, "some change");
+
+    createCommit(testRepo, commitChange1.getFullMessage());
+
+    pushForReviewRejected(
+        testRepo,
+        "same Change-Id in multiple changes.\n"
+            + "Squash the commits with the same Change-Id or ensure Change-Ids are unique for each"
+            + " commit");
+
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      u.getConfig()
+          .getProject()
+          .setBooleanConfig(BooleanProjectConfig.REQUIRE_CHANGE_ID, InheritableBoolean.FALSE);
+      u.save();
+    }
+
+    pushForReviewRejected(
+        testRepo,
+        "same Change-Id in multiple changes.\n"
+            + "Squash the commits with the same Change-Id or ensure Change-Ids are unique for each"
+            + " commit");
+  }
+
+  private static RevCommit createCommit(TestRepository<?> testRepo, String message)
+      throws Exception {
+    return testRepo.branch("HEAD").commit().message(message).add("a.txt", "content").create();
+  }
+
+  private static RevCommit createCommitWithChangeId(TestRepository<?> testRepo, String message)
+      throws Exception {
+    RevCommit c =
+        testRepo
+            .branch("HEAD")
+            .commit()
+            .message(message)
+            .insertChangeId()
+            .add("a.txt", "content")
+            .create();
+    return testRepo.getRevWalk().parseCommit(c);
+  }
+
+  @Test
+  public void cantAutoCloseChangeAlreadyMergedToBranch() throws Exception {
+    PushOneCommit.Result r1 = createChange();
+    Change.Id id1 = r1.getChange().getId();
+    PushOneCommit.Result r2 = createChange();
+    Change.Id id2 = r2.getChange().getId();
+
+    // Merge change 1 behind Gerrit's back.
+    try (Repository repo = repoManager.openRepository(project)) {
+      TestRepository<?> tr = new TestRepository<>(repo);
+      tr.branch("refs/heads/master").update(r1.getCommit());
+    }
+
+    assertThat(gApi.changes().id(id1.get()).info().status).isEqualTo(ChangeStatus.NEW);
+    assertThat(gApi.changes().id(id2.get()).info().status).isEqualTo(ChangeStatus.NEW);
+    r2 = amendChange(r2.getChangeId());
+    r2.assertOkStatus();
+
+    // Change 1 is still new despite being merged into the branch, because
+    // ReceiveCommits only considers commits between the branch tip (which is
+    // now the merged change 1) and the push tip (new patch set of change 2).
+    assertThat(gApi.changes().id(id1.get()).info().status).isEqualTo(ChangeStatus.NEW);
+    assertThat(gApi.changes().id(id2.get()).info().status).isEqualTo(ChangeStatus.NEW);
+  }
+
+  @Test
+  @GerritConfig(name = "receive.allowPushToRefsChanges", value = "true")
+  public void accidentallyPushNewPatchSetDirectlyToBranchAndRecoverByPushingToRefsChanges()
+      throws Exception {
+    Change.Id id = accidentallyPushNewPatchSetDirectlyToBranch();
+    ChangeData cd = byChangeId(id);
+    String ps1Rev = Iterables.getOnlyElement(cd.patchSets()).getRevision().get();
+
+    String r = "refs/changes/" + id;
+    assertPushOk(pushHead(testRepo, r, false), r);
+
+    // Added a new patch set and auto-closed the change.
+    cd = byChangeId(id);
+    assertThat(cd.change().getStatus()).isEqualTo(Change.Status.MERGED);
+    assertThat(getPatchSetRevisions(cd))
+        .containsExactlyEntriesIn(
+            ImmutableMap.of(1, ps1Rev, 2, testRepo.getRepository().resolve("HEAD").name()));
+  }
+
+  @Test
+  public void accidentallyPushNewPatchSetDirectlyToBranchAndCantRecoverByPushingToRefsFor()
+      throws Exception {
+    Change.Id id = accidentallyPushNewPatchSetDirectlyToBranch();
+    ChangeData cd = byChangeId(id);
+    String ps1Rev = Iterables.getOnlyElement(cd.patchSets()).getRevision().get();
+
+    String r = "refs/for/master";
+    assertPushRejected(pushHead(testRepo, r, false), r, "no new changes");
+
+    // Change not updated.
+    cd = byChangeId(id);
+    assertThat(cd.change().getStatus()).isEqualTo(Change.Status.NEW);
+    assertThat(getPatchSetRevisions(cd)).containsExactlyEntriesIn(ImmutableMap.of(1, ps1Rev));
+  }
+
+  @Test
+  public void forcePushAbandonedChange() throws Exception {
+    grant(project, "refs/*", Permission.PUSH, true);
+    PushOneCommit push1 =
+        pushFactory.create(db, admin.getIdent(), testRepo, "change1", "a.txt", "content");
+    PushOneCommit.Result r = push1.to("refs/for/master");
+    r.assertOkStatus();
+
+    // abandon the change
+    String changeId = r.getChangeId();
+    assertThat(info(changeId).status).isEqualTo(ChangeStatus.NEW);
+    gApi.changes().id(changeId).abandon();
+    ChangeInfo info = get(changeId);
+    assertThat(info.status).isEqualTo(ChangeStatus.ABANDONED);
+
+    push1.setForce(true);
+    PushOneCommit.Result r1 = push1.to("refs/heads/master");
+    r1.assertOkStatus();
+    ChangeInfo result = Iterables.getOnlyElement(gApi.changes().query(r.getChangeId()).get());
+    assertThat(result.status).isEqualTo(ChangeStatus.MERGED);
+  }
+
+  private Change.Id accidentallyPushNewPatchSetDirectlyToBranch() throws Exception {
+    PushOneCommit.Result r = createChange();
+    RevCommit ps1Commit = r.getCommit();
+    Change c = r.getChange().change();
+
+    RevCommit ps2Commit;
+    try (Repository repo = repoManager.openRepository(project)) {
+      // Create a new patch set of the change directly in Gerrit's repository,
+      // without pushing it. In reality it's more likely that the client would
+      // create and push this behind Gerrit's back (e.g. an admin accidentally
+      // using direct ssh access to the repo), but that's harder to do in tests.
+      TestRepository<?> tr = new TestRepository<>(repo);
+      ps2Commit =
+          tr.branch("refs/heads/master")
+              .commit()
+              .message(ps1Commit.getShortMessage() + " v2")
+              .insertChangeId(r.getChangeId().substring(1))
+              .create();
+    }
+
+    testRepo.git().fetch().setRefSpecs(new RefSpec("refs/heads/master")).call();
+    testRepo.reset(ps2Commit);
+
+    ChangeData cd = byCommit(ps1Commit);
+    assertThat(cd.change().getStatus()).isEqualTo(Change.Status.NEW);
+    assertThat(getPatchSetRevisions(cd))
+        .containsExactlyEntriesIn(ImmutableMap.of(1, ps1Commit.name()));
+    return c.getId();
+  }
+
+  @Test
+  public void pushWithEmailInFooter() throws Exception {
+    pushWithReviewerInFooter(user.emailAddress.toString(), user);
+  }
+
+  @Test
+  public void pushWithNameInFooter() throws Exception {
+    pushWithReviewerInFooter(user.fullName, user);
+  }
+
+  @Test
+  public void pushWithEmailInFooterNotFound() throws Exception {
+    pushWithReviewerInFooter(new Address("No Body", "notarealuser@example.com").toString(), null);
+  }
+
+  @Test
+  public void pushWithNameInFooterNotFound() throws Exception {
+    pushWithReviewerInFooter("Notauser", null);
+  }
+
+  @Test
+  public void pushNewPatchsetOverridingStickyLabel() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      LabelType codeReview = Util.codeReview();
+      codeReview.setCopyMaxScore(true);
+      u.getConfig().getLabelSections().put(codeReview.getName(), codeReview);
+      u.save();
+    }
+
+    PushOneCommit.Result r = pushTo("refs/for/master%l=Code-Review+2");
+    r.assertOkStatus();
+    PushOneCommit push =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            testRepo,
+            PushOneCommit.SUBJECT,
+            "b.txt",
+            "anotherContent",
+            r.getChangeId());
+    r = push.to("refs/for/master%l=Code-Review+1");
+    r.assertOkStatus();
+  }
+
+  @Test
+  public void createChangeForMergedCommit() throws Exception {
+    String master = "refs/heads/master";
+    grant(project, master, Permission.PUSH, true);
+
+    // Update master with a direct push.
+    RevCommit c1 = testRepo.commit().message("Non-change 1").create();
+    RevCommit c2 =
+        testRepo.parseBody(
+            testRepo.commit().parent(c1).message("Non-change 2").insertChangeId().create());
+    String changeId = Iterables.getOnlyElement(c2.getFooterLines(CHANGE_ID));
+
+    testRepo.reset(c2);
+    assertPushOk(pushHead(testRepo, master, false, true), master);
+
+    String q = "commit:" + c1.name() + " OR commit:" + c2.name() + " OR change:" + changeId;
+    assertThat(gApi.changes().query(q).get()).isEmpty();
+
+    // Push c2 as a merged change.
+    String r = "refs/for/master%merged";
+    assertPushOk(pushHead(testRepo, r, false), r);
+
+    EnumSet<ListChangesOption> opts = EnumSet.of(ListChangesOption.CURRENT_REVISION);
+    ChangeInfo info = gApi.changes().id(changeId).get(opts);
+    assertThat(info.currentRevision).isEqualTo(c2.name());
+    assertThat(info.status).isEqualTo(ChangeStatus.MERGED);
+
+    // Only c2 was created as a change.
+    String q1 = "commit: " + c1.name();
+    assertThat(gApi.changes().query(q1).get()).isEmpty();
+
+    // Push c1 as a merged change.
+    testRepo.reset(c1);
+    assertPushOk(pushHead(testRepo, r, false), r);
+    List<ChangeInfo> infos = gApi.changes().query(q1).withOptions(opts).get();
+    assertThat(infos).hasSize(1);
+    info = infos.get(0);
+    assertThat(info.currentRevision).isEqualTo(c1.name());
+    assertThat(info.status).isEqualTo(ChangeStatus.MERGED);
+  }
+
+  @Test
+  public void mergedOptionFailsWhenCommitIsNotMerged() throws Exception {
+    PushOneCommit.Result r = pushTo("refs/for/master%merged");
+    r.assertErrorStatus("not merged into branch");
+  }
+
+  @Test
+  public void mergedOptionFailsWhenCommitIsMergedOnOtherBranch() throws Exception {
+    PushOneCommit.Result r = pushTo("refs/for/master");
+    r.assertOkStatus();
+    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve());
+    gApi.changes().id(r.getChangeId()).current().submit();
+
+    try (Repository repo = repoManager.openRepository(project)) {
+      TestRepository<?> tr = new TestRepository<>(repo);
+      tr.branch("refs/heads/branch").commit().message("Initial commit on branch").create();
+    }
+
+    pushTo("refs/for/master%merged").assertErrorStatus("not merged into branch");
+  }
+
+  @Test
+  public void mergedOptionFailsWhenChangeExists() throws Exception {
+    PushOneCommit.Result r = pushTo("refs/for/master");
+    r.assertOkStatus();
+    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve());
+    gApi.changes().id(r.getChangeId()).current().submit();
+
+    testRepo.reset(r.getCommit());
+    String ref = "refs/for/master%merged";
+    PushResult pr = pushHead(testRepo, ref, false);
+    RemoteRefUpdate rru = pr.getRemoteUpdate(ref);
+    assertThat(rru.getStatus()).isEqualTo(RemoteRefUpdate.Status.REJECTED_OTHER_REASON);
+    assertThat(rru.getMessage()).contains("no new changes");
+  }
+
+  @Test
+  public void mergedOptionWithNewCommitWithSameChangeIdFails() throws Exception {
+    PushOneCommit.Result r = pushTo("refs/for/master");
+    r.assertOkStatus();
+    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.approve());
+    gApi.changes().id(r.getChangeId()).current().submit();
+
+    RevCommit c2 =
+        testRepo
+            .amend(r.getCommit())
+            .message("New subject")
+            .insertChangeId(r.getChangeId().substring(1))
+            .create();
+    testRepo.reset(c2);
+
+    String ref = "refs/for/master%merged";
+    PushResult pr = pushHead(testRepo, ref, false);
+    RemoteRefUpdate rru = pr.getRemoteUpdate(ref);
+    assertThat(rru.getStatus()).isEqualTo(RemoteRefUpdate.Status.REJECTED_OTHER_REASON);
+    assertThat(rru.getMessage()).contains("not merged into branch");
+  }
+
+  @Test
+  public void mergedOptionWithExistingChangeInsertsPatchSet() throws Exception {
+    String master = "refs/heads/master";
+    grant(project, master, Permission.PUSH, true);
+
+    PushOneCommit.Result r = pushTo("refs/for/master");
+    r.assertOkStatus();
+    ObjectId c1 = r.getCommit().copy();
+
+    // Create a PS2 commit directly on master in the server's repo. This
+    // simulates the client amending locally and pushing directly to the branch,
+    // expecting the change to be auto-closed, but the change metadata update
+    // fails.
+    ObjectId c2;
+    try (Repository repo = repoManager.openRepository(project)) {
+      TestRepository<?> tr = new TestRepository<>(repo);
+      RevCommit commit2 =
+          tr.amend(c1).message("New subject").insertChangeId(r.getChangeId().substring(1)).create();
+      c2 = commit2.copy();
+      tr.update(master, c2);
+    }
+
+    testRepo.git().fetch().setRefSpecs(new RefSpec("refs/heads/master")).call();
+    testRepo.reset(c2);
+
+    String ref = "refs/for/master%merged";
+    assertPushOk(pushHead(testRepo, ref, false), ref);
+
+    ChangeInfo info = gApi.changes().id(r.getChangeId()).get(ALL_REVISIONS);
+    assertThat(info.currentRevision).isEqualTo(c2.name());
+    assertThat(info.revisions.keySet()).containsExactly(c1.name(), c2.name());
+    // TODO(dborowitz): Fix ReceiveCommits to also auto-close the change.
+    assertThat(info.status).isEqualTo(ChangeStatus.NEW);
+  }
+
+  @Test
+  public void publishCommentsOnPushPublishesDraftsOnAllRevisions() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String rev1 = r.getCommit().name();
+    CommentInfo c1 = addDraft(r.getChangeId(), rev1, newDraft(FILE_NAME, 1, "comment1"));
+    CommentInfo c2 = addDraft(r.getChangeId(), rev1, newDraft(FILE_NAME, 1, "comment2"));
+
+    r = amendChange(r.getChangeId());
+    String rev2 = r.getCommit().name();
+    CommentInfo c3 = addDraft(r.getChangeId(), rev2, newDraft(FILE_NAME, 1, "comment3"));
+
+    assertThat(getPublishedComments(r.getChangeId())).isEmpty();
+
+    gApi.changes().id(r.getChangeId()).addReviewer(user.email);
+    sender.clear();
+    amendChange(r.getChangeId(), "refs/for/master%publish-comments");
+
+    Collection<CommentInfo> comments = getPublishedComments(r.getChangeId());
+    assertThat(comments.stream().map(c -> c.id)).containsExactly(c1.id, c2.id, c3.id);
+    assertThat(comments.stream().map(c -> c.message))
+        .containsExactly("comment1", "comment2", "comment3");
+    assertThat(getLastMessage(r.getChangeId())).isEqualTo("Uploaded patch set 3.\n\n(3 comments)");
+
+    List<String> messages =
+        sender.getMessages().stream()
+            .map(Message::body)
+            .sorted(Comparator.comparingInt(m -> m.contains("reexamine") ? 0 : 1))
+            .collect(toList());
+    assertThat(messages).hasSize(2);
+
+    assertThat(messages.get(0)).contains("Gerrit-MessageType: newpatchset");
+    assertThat(messages.get(0)).contains("I'd like you to reexamine a change");
+    assertThat(messages.get(0)).doesNotContain("Uploaded patch set 3");
+
+    assertThat(messages.get(1)).contains("Gerrit-MessageType: comment");
+    assertThat(messages.get(1))
+        .containsMatch(
+            Pattern.compile(
+                // A little weird that the comment email contains this text, but it's actually
+                // what's in the ChangeMessage. Really we should fuse the emails into one, but until
+                // then, this test documents the current behavior.
+                "Uploaded patch set 3\\.\n"
+                    + "\n"
+                    + "\\(3 comments\\)\\n.*"
+                    + "PS1, Line 1:.*"
+                    + "comment1\\n.*"
+                    + "PS1, Line 1:.*"
+                    + "comment2\\n.*"
+                    + "PS2, Line 1:.*"
+                    + "comment3\\n",
+                Pattern.DOTALL));
+  }
+
+  @Test
+  public void publishCommentsOnPushWithMessage() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String rev = r.getCommit().name();
+    addDraft(r.getChangeId(), rev, newDraft(FILE_NAME, 1, "comment1"));
+
+    r = amendChange(r.getChangeId(), "refs/for/master%publish-comments,m=The_message");
+
+    Collection<CommentInfo> comments = getPublishedComments(r.getChangeId());
+    assertThat(comments.stream().map(c -> c.message)).containsExactly("comment1");
+    assertThat(getLastMessage(r.getChangeId()))
+        .isEqualTo("Uploaded patch set 2.\n\n(1 comment)\n\nThe message");
+  }
+
+  @Test
+  public void publishCommentsOnPushPublishesDraftsOnMultipleChanges() throws Exception {
+    ObjectId initialHead = testRepo.getRepository().resolve("HEAD");
+    List<RevCommit> commits = createChanges(2, "refs/for/master");
+    String id1 = byCommit(commits.get(0)).change().getKey().get();
+    String id2 = byCommit(commits.get(1)).change().getKey().get();
+    CommentInfo c1 = addDraft(id1, commits.get(0).name(), newDraft(FILE_NAME, 1, "comment1"));
+    CommentInfo c2 = addDraft(id2, commits.get(1).name(), newDraft(FILE_NAME, 1, "comment2"));
+
+    assertThat(getPublishedComments(id1)).isEmpty();
+    assertThat(getPublishedComments(id2)).isEmpty();
+
+    amendChanges(initialHead, commits, "refs/for/master%publish-comments");
+
+    Collection<CommentInfo> cs1 = getPublishedComments(id1);
+    assertThat(cs1.stream().map(c -> c.message)).containsExactly("comment1");
+    assertThat(cs1.stream().map(c -> c.id)).containsExactly(c1.id);
+    assertThat(getLastMessage(id1))
+        .isEqualTo("Uploaded patch set 2: Commit message was updated.\n\n(1 comment)");
+
+    Collection<CommentInfo> cs2 = getPublishedComments(id2);
+    assertThat(cs2.stream().map(c -> c.message)).containsExactly("comment2");
+    assertThat(cs2.stream().map(c -> c.id)).containsExactly(c2.id);
+    assertThat(getLastMessage(id2))
+        .isEqualTo("Uploaded patch set 2: Commit message was updated.\n\n(1 comment)");
+  }
+
+  @Test
+  public void publishCommentsOnPushOnlyPublishesDraftsOnUpdatedChanges() throws Exception {
+    PushOneCommit.Result r1 = createChange();
+    PushOneCommit.Result r2 = createChange();
+    String id1 = r1.getChangeId();
+    String id2 = r2.getChangeId();
+    addDraft(id1, r1.getCommit().name(), newDraft(FILE_NAME, 1, "comment1"));
+    CommentInfo c2 = addDraft(id2, r2.getCommit().name(), newDraft(FILE_NAME, 1, "comment2"));
+
+    assertThat(getPublishedComments(id1)).isEmpty();
+    assertThat(getPublishedComments(id2)).isEmpty();
+
+    amendChange(id2, "refs/for/master%publish-comments");
+
+    assertThat(getPublishedComments(id1)).isEmpty();
+    assertThat(gApi.changes().id(id1).drafts()).hasSize(1);
+
+    Collection<CommentInfo> cs2 = getPublishedComments(id2);
+    assertThat(cs2.stream().map(c -> c.message)).containsExactly("comment2");
+    assertThat(cs2.stream().map(c -> c.id)).containsExactly(c2.id);
+
+    assertThat(getLastMessage(id1)).doesNotMatch("[Cc]omment");
+    assertThat(getLastMessage(id2)).isEqualTo("Uploaded patch set 2.\n\n(1 comment)");
+  }
+
+  @Test
+  public void publishCommentsOnPushWithPreference() throws Exception {
+    PushOneCommit.Result r = createChange();
+    addDraft(r.getChangeId(), r.getCommit().name(), newDraft(FILE_NAME, 1, "comment1"));
+    r = amendChange(r.getChangeId());
+
+    assertThat(getPublishedComments(r.getChangeId())).isEmpty();
+
+    GeneralPreferencesInfo prefs = gApi.accounts().id(admin.id.get()).getPreferences();
+    prefs.publishCommentsOnPush = true;
+    gApi.accounts().id(admin.id.get()).setPreferences(prefs);
+
+    r = amendChange(r.getChangeId());
+    assertThat(getPublishedComments(r.getChangeId()).stream().map(c -> c.message))
+        .containsExactly("comment1");
+  }
+
+  @Test
+  public void publishCommentsOnPushOverridingPreference() throws Exception {
+    PushOneCommit.Result r = createChange();
+    addDraft(r.getChangeId(), r.getCommit().name(), newDraft(FILE_NAME, 1, "comment1"));
+
+    GeneralPreferencesInfo prefs = gApi.accounts().id(admin.id.get()).getPreferences();
+    prefs.publishCommentsOnPush = true;
+    gApi.accounts().id(admin.id.get()).setPreferences(prefs);
+
+    r = amendChange(r.getChangeId(), "refs/for/master%no-publish-comments");
+
+    assertThat(getPublishedComments(r.getChangeId())).isEmpty();
+  }
+
+  @Test
+  public void pushWithDraftOptionIsDisabledPerDefault() throws Exception {
+    for (String ref : ImmutableSet.of("refs/drafts/master", "refs/for/master%draft")) {
+      PushOneCommit.Result r = pushTo(ref);
+      r.assertErrorStatus();
+      r.assertMessage("draft workflow is disabled");
+    }
+  }
+
+  @GerritConfig(name = "change.allowDrafts", value = "true")
+  @Test
+  public void pushDraftGetsPrivateChange() throws Exception {
+    String changeId1 = createChange("refs/drafts/master").getChangeId();
+    String changeId2 = createChange("refs/for/master%draft").getChangeId();
+
+    ChangeInfo info1 = gApi.changes().id(changeId1).get();
+    ChangeInfo info2 = gApi.changes().id(changeId2).get();
+
+    assertThat(info1.status).isEqualTo(ChangeStatus.NEW);
+    assertThat(info2.status).isEqualTo(ChangeStatus.NEW);
+    assertThat(info1.isPrivate).isTrue();
+    assertThat(info2.isPrivate).isTrue();
+    assertThat(info1.revisions).hasSize(1);
+    assertThat(info2.revisions).hasSize(1);
+  }
+
+  @GerritConfig(name = "change.allowDrafts", value = "true")
+  @Sandboxed
+  @Test
+  public void pushWithDraftOptionToExistingNewChangeGetsChangeEdit() throws Exception {
+    String changeId = createChange().getChangeId();
+    EditInfoSubject.assertThat(getEdit(changeId)).isAbsent();
+
+    ChangeInfo changeInfo = gApi.changes().id(changeId).get();
+    ChangeStatus originalChangeStatus = changeInfo.status;
+
+    PushOneCommit.Result result = amendChange(changeId, "refs/drafts/master");
+    result.assertOkStatus();
+
+    changeInfo = gApi.changes().id(changeId).get();
+    assertThat(changeInfo.status).isEqualTo(originalChangeStatus);
+    assertThat(changeInfo.isPrivate).isNull();
+    assertThat(changeInfo.revisions).hasSize(1);
+
+    EditInfoSubject.assertThat(getEdit(changeId)).isPresent();
+  }
+
+  @GerritConfig(name = "receive.maxBatchCommits", value = "2")
+  @Test
+  public void maxBatchCommits() throws Exception {
+    List<RevCommit> commits = new ArrayList<>();
+    commits.addAll(initChanges(2));
+    String master = "refs/heads/master";
+    assertPushOk(pushHead(testRepo, master), master);
+
+    commits.addAll(initChanges(3));
+    assertPushRejected(
+        pushHead(testRepo, master), master, "more than 2 commits, and skip-validation not set");
+
+    grantSkipValidation(project, master, SystemGroupBackend.REGISTERED_USERS);
+    PushResult r =
+        pushHead(testRepo, master, false, false, ImmutableList.of(PUSH_OPTION_SKIP_VALIDATION));
+    assertPushOk(r, master);
+
+    // No open changes; branch was advanced.
+    String q = commits.stream().map(ObjectId::name).collect(joining(" OR commit:", "commit:", ""));
+    assertThat(gApi.changes().query(q).get()).isEmpty();
+    assertThat(gApi.projects().name(project.get()).branch(master).get().revision)
+        .isEqualTo(Iterables.getLast(commits).name());
+  }
+
+  @Test
+  public void pushToPublishMagicBranchIsAllowed() throws Exception {
+    // Push to "refs/publish/*" will be a synonym of "refs/for/*".
+    createChange("refs/publish/master");
+    PushOneCommit.Result result = pushTo("refs/publish/master");
+    result.assertOkStatus();
+    assertThat(result.getMessage())
+        .endsWith("Pushing to refs/publish/* is deprecated, use refs/for/* instead.\n");
+  }
+
+  @Test
+  public void pushNoteDbRef() throws Exception {
+    String ref = "refs/changes/34/1234/meta";
+    RevCommit c = testRepo.commit().message("Junk NoteDb commit").create();
+    PushResult pr = pushOne(testRepo, c.name(), ref, false, false, null);
+    assertThat(pr.getMessages()).doesNotContain(NoteDbPushOption.OPTION_NAME);
+    assertPushRejected(pr, ref, "NoteDb update requires -o notedb=allow");
+
+    pr = pushOne(testRepo, c.name(), ref, false, false, ImmutableList.of("notedb=foobar"));
+    assertThat(pr.getMessages()).contains("Invalid value in -o notedb=foobar");
+    assertPushRejected(pr, ref, "NoteDb update requires -o notedb=allow");
+
+    List<String> opts = ImmutableList.of("notedb=allow");
+    pr = pushOne(testRepo, c.name(), ref, false, false, opts);
+    assertPushRejected(pr, ref, "NoteDb update requires access database permission");
+
+    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
+    pr = pushOne(testRepo, c.name(), ref, false, false, opts);
+    assertPushRejected(pr, ref, "prohibited by Gerrit: not permitted: create");
+
+    grant(project, "refs/changes/*", Permission.CREATE);
+    grant(project, "refs/changes/*", Permission.PUSH);
+    grantSkipValidation(project, "refs/changes/*", REGISTERED_USERS);
+    pr = pushOne(testRepo, c.name(), ref, false, false, opts);
+    assertPushOk(pr, ref);
+  }
+
+  @Test
+  public void pushNoteDbRefWithoutOptionOnlyFailsThatCommand() throws Exception {
+    String ref = "refs/changes/34/1234/meta";
+    RevCommit noteDbCommit = testRepo.commit().message("Junk NoteDb commit").create();
+    RevCommit changeCommit =
+        testRepo.branch("HEAD").commit().message("A change").insertChangeId().create();
+    PushResult pr =
+        Iterables.getOnlyElement(
+            testRepo
+                .git()
+                .push()
+                .setRefSpecs(
+                    new RefSpec(noteDbCommit.name() + ":" + ref),
+                    new RefSpec(changeCommit.name() + ":refs/heads/permitted"))
+                .call());
+
+    assertPushRejected(pr, ref, "NoteDb update requires -o notedb=allow");
+    assertPushOk(pr, "refs/heads/permitted");
+  }
+
+  private DraftInput newDraft(String path, int line, String message) {
+    DraftInput d = new DraftInput();
+    d.path = path;
+    d.side = Side.REVISION;
+    d.line = line;
+    d.message = message;
+    d.unresolved = true;
+    return d;
+  }
+
+  private CommentInfo addDraft(String changeId, String revId, DraftInput in) throws Exception {
+    return gApi.changes().id(changeId).revision(revId).createDraft(in).get();
+  }
+
+  private Collection<CommentInfo> getPublishedComments(String changeId) throws Exception {
+    return gApi.changes().id(changeId).comments().values().stream()
+        .flatMap(Collection::stream)
+        .collect(toList());
+  }
+
+  private String getLastMessage(String changeId) throws Exception {
+    return Streams.findLast(
+            gApi.changes().id(changeId).get(MESSAGES).messages.stream().map(m -> m.message))
+        .get();
+  }
+
+  private void assertThatUserIsOnlyReviewer(ChangeInfo ci, TestAccount reviewer) {
+    assertThat(ci.reviewers).isNotNull();
+    assertThat(ci.reviewers.keySet()).containsExactly(ReviewerState.REVIEWER);
+    assertThat(ci.reviewers.get(ReviewerState.REVIEWER).iterator().next().email)
+        .isEqualTo(reviewer.email);
+  }
+
+  private void pushWithReviewerInFooter(String nameEmail, TestAccount expectedReviewer)
+      throws Exception {
+    int n = 5;
+    String r = "refs/for/master";
+    ObjectId initialHead = testRepo.getRepository().resolve("HEAD");
+    List<RevCommit> commits = createChanges(n, r, ImmutableList.of("Acked-By: " + nameEmail));
+    for (int i = 0; i < n; i++) {
+      RevCommit c = commits.get(i);
+      ChangeData cd = byCommit(c);
+      String name = "reviewers for " + (i + 1);
+      if (expectedReviewer != null) {
+        assertThat(cd.reviewers().all()).named(name).containsExactly(expectedReviewer.getId());
+        // Remove reviewer from PS1 so we can test adding this same reviewer on PS2 below.
+        gApi.changes().id(cd.getId().get()).reviewer(expectedReviewer.getId().toString()).remove();
+      }
+      assertThat(byCommit(c).reviewers().all()).named(name).isEmpty();
+    }
+
+    List<RevCommit> commits2 = amendChanges(initialHead, commits, r);
+    for (int i = 0; i < n; i++) {
+      RevCommit c = commits2.get(i);
+      ChangeData cd = byCommit(c);
+      String name = "reviewers for " + (i + 1);
+      if (expectedReviewer != null) {
+        assertThat(cd.reviewers().all()).named(name).containsExactly(expectedReviewer.getId());
+      } else {
+        assertThat(byCommit(c).reviewers().all()).named(name).isEmpty();
+      }
+    }
+  }
+
+  private List<RevCommit> createChanges(int n, String refsFor) throws Exception {
+    return createChanges(n, refsFor, ImmutableList.of());
+  }
+
+  private List<RevCommit> createChanges(int n, String refsFor, List<String> footerLines)
+      throws Exception {
+    List<RevCommit> commits = initChanges(n, footerLines);
+    assertPushOk(pushHead(testRepo, refsFor, false), refsFor);
+    return commits;
+  }
+
+  private List<RevCommit> initChanges(int n) throws Exception {
+    return initChanges(n, ImmutableList.of());
+  }
+
+  private List<RevCommit> initChanges(int n, List<String> footerLines) throws Exception {
+    List<RevCommit> commits = new ArrayList<>(n);
+    for (int i = 1; i <= n; i++) {
+      String msg = "Change " + i;
+      if (!footerLines.isEmpty()) {
+        StringBuilder sb = new StringBuilder(msg).append("\n\n");
+        for (String line : footerLines) {
+          sb.append(line).append('\n');
+        }
+        msg = sb.toString();
+      }
+      TestRepository<?>.CommitBuilder cb =
+          testRepo.branch("HEAD").commit().message(msg).insertChangeId();
+      if (!commits.isEmpty()) {
+        cb.parent(commits.get(commits.size() - 1));
+      }
+      RevCommit c = cb.create();
+      testRepo.getRevWalk().parseBody(c);
+      commits.add(c);
+    }
+    return commits;
+  }
+
+  private List<RevCommit> amendChanges(
+      ObjectId initialHead, List<RevCommit> origCommits, String refsFor) throws Exception {
+    testRepo.reset(initialHead);
+    List<RevCommit> newCommits = new ArrayList<>(origCommits.size());
+    for (RevCommit c : origCommits) {
+      String msg = c.getShortMessage() + "v2";
+      if (!c.getShortMessage().equals(c.getFullMessage())) {
+        msg = msg + c.getFullMessage().substring(c.getShortMessage().length());
+      }
+      TestRepository<?>.CommitBuilder cb = testRepo.branch("HEAD").commit().message(msg);
+      if (!newCommits.isEmpty()) {
+        cb.parent(origCommits.get(newCommits.size() - 1));
+      }
+      RevCommit c2 = cb.create();
+      testRepo.getRevWalk().parseBody(c2);
+      newCommits.add(c2);
+    }
+    assertPushOk(pushHead(testRepo, refsFor, false), refsFor);
+    return newCommits;
+  }
+
+  private static Map<Integer, String> getPatchSetRevisions(ChangeData cd) throws Exception {
+    Map<Integer, String> revisions = new HashMap<>();
+    for (PatchSet ps : cd.patchSets()) {
+      revisions.put(ps.getPatchSetId(), ps.getRevision().get());
+    }
+    return revisions;
+  }
+
+  private ChangeData byCommit(ObjectId id) throws Exception {
+    List<ChangeData> cds = queryProvider.get().byCommit(id);
+    assertThat(cds).named("change for " + id.name()).hasSize(1);
+    return cds.get(0);
+  }
+
+  private ChangeData byChangeId(Change.Id id) throws Exception {
+    List<ChangeData> cds = queryProvider.get().byLegacyChangeId(id);
+    assertThat(cds).named("change " + id).hasSize(1);
+    return cds.get(0);
+  }
+
+  private static void pushForReviewOk(TestRepository<?> testRepo) throws GitAPIException {
+    pushForReview(testRepo, RemoteRefUpdate.Status.OK, null);
+  }
+
+  private static void pushForReviewRejected(TestRepository<?> testRepo, String expectedMessage)
+      throws GitAPIException {
+    pushForReview(testRepo, RemoteRefUpdate.Status.REJECTED_OTHER_REASON, expectedMessage);
+  }
+
+  private static void pushForReview(
+      TestRepository<?> testRepo, RemoteRefUpdate.Status expectedStatus, String expectedMessage)
+      throws GitAPIException {
+    String ref = "refs/for/master";
+    PushResult r = pushHead(testRepo, ref);
+    RemoteRefUpdate refUpdate = r.getRemoteUpdate(ref);
+    assertThat(refUpdate.getStatus()).isEqualTo(expectedStatus);
+    if (expectedMessage != null) {
+      assertThat(refUpdate.getMessage()).contains(expectedMessage);
+    }
+  }
+
+  private void grantSkipValidation(Project.NameKey project, String ref, AccountGroup.UUID groupUuid)
+      throws Exception {
+    // See SKIP_VALIDATION implementation in default permission backend.
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      Util.allow(u.getConfig(), Permission.FORGE_AUTHOR, groupUuid, ref);
+      Util.allow(u.getConfig(), Permission.FORGE_COMMITTER, groupUuid, ref);
+      Util.allow(u.getConfig(), Permission.FORGE_SERVER, groupUuid, ref);
+      Util.allow(u.getConfig(), Permission.PUSH_MERGE, groupUuid, "refs/for/" + ref);
+      u.save();
+    }
+  }
+
+  private PushOneCommit.Result amendChange(String changeId, String ref) throws Exception {
+    return amendChange(changeId, ref, admin, testRepo);
+  }
+
+  private String getOwnerEmail(String changeId) throws Exception {
+    return get(changeId, DETAILED_ACCOUNTS).owner.email;
+  }
+
+  private ImmutableList<String> getReviewerEmails(String changeId, ReviewerState state)
+      throws Exception {
+    Collection<AccountInfo> infos =
+        get(changeId, DETAILED_LABELS, DETAILED_ACCOUNTS).reviewers.get(state);
+    return infos != null
+        ? infos.stream().map(a -> a.email).collect(toImmutableList())
+        : ImmutableList.of();
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/git/AbstractSubmoduleSubscription.java b/javatests/com/google/gerrit/acceptance/git/AbstractSubmoduleSubscription.java
new file mode 100644
index 0000000..943b052
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/git/AbstractSubmoduleSubscription.java
@@ -0,0 +1,508 @@
+// Copyright (C) 2015 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.google.gerrit.acceptance.git;
+
+import static com.google.common.truth.Truth.assertThat;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.collect.Iterables;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.common.data.SubscribeSection;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.project.ProjectConfig;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.StreamSupport;
+import org.eclipse.jgit.dircache.DirCache;
+import org.eclipse.jgit.dircache.DirCacheBuilder;
+import org.eclipse.jgit.dircache.DirCacheEditor;
+import org.eclipse.jgit.dircache.DirCacheEditor.PathEdit;
+import org.eclipse.jgit.dircache.DirCacheEntry;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.AnyObjectId;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.FileMode;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevObject;
+import org.eclipse.jgit.revwalk.RevTree;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.PushResult;
+import org.eclipse.jgit.transport.RefSpec;
+import org.eclipse.jgit.transport.RemoteRefUpdate;
+import org.eclipse.jgit.transport.RemoteRefUpdate.Status;
+
+public abstract class AbstractSubmoduleSubscription extends AbstractDaemonTest {
+
+  protected SubmitType getSubmitType() {
+    return cfg.getEnum("project", null, "submitType", SubmitType.MERGE_IF_NECESSARY);
+  }
+
+  protected static Config submitByMergeAlways() {
+    Config cfg = new Config();
+    cfg.setBoolean("change", null, "submitWholeTopic", true);
+    cfg.setEnum("project", null, "submitType", SubmitType.MERGE_ALWAYS);
+    return cfg;
+  }
+
+  protected static Config submitByMergeIfNecessary() {
+    Config cfg = new Config();
+    cfg.setBoolean("change", null, "submitWholeTopic", true);
+    cfg.setEnum("project", null, "submitType", SubmitType.MERGE_IF_NECESSARY);
+    return cfg;
+  }
+
+  protected static Config submitByCherryPickConfig() {
+    Config cfg = new Config();
+    cfg.setBoolean("change", null, "submitWholeTopic", true);
+    cfg.setEnum("project", null, "submitType", SubmitType.CHERRY_PICK);
+    return cfg;
+  }
+
+  protected static Config submitByRebaseAlwaysConfig() {
+    Config cfg = new Config();
+    cfg.setBoolean("change", null, "submitWholeTopic", true);
+    cfg.setEnum("project", null, "submitType", SubmitType.REBASE_ALWAYS);
+    return cfg;
+  }
+
+  protected static Config submitByRebaseIfNecessaryConfig() {
+    Config cfg = new Config();
+    cfg.setBoolean("change", null, "submitWholeTopic", true);
+    cfg.setEnum("project", null, "submitType", SubmitType.REBASE_IF_NECESSARY);
+    return cfg;
+  }
+
+  protected TestRepository<?> createProjectWithPush(
+      String name,
+      @Nullable Project.NameKey parent,
+      boolean createEmptyCommit,
+      SubmitType submitType)
+      throws Exception {
+    Project.NameKey project = createProject(name, parent, createEmptyCommit, submitType);
+    grant(project, "refs/heads/*", Permission.PUSH);
+    grant(project, "refs/for/refs/heads/*", Permission.SUBMIT);
+    return cloneProject(project);
+  }
+
+  protected TestRepository<?> createProjectWithPush(String name, @Nullable Project.NameKey parent)
+      throws Exception {
+    return createProjectWithPush(name, parent, true, getSubmitType());
+  }
+
+  protected TestRepository<?> createProjectWithPush(String name, boolean createEmptyCommit)
+      throws Exception {
+    return createProjectWithPush(name, null, createEmptyCommit, getSubmitType());
+  }
+
+  protected TestRepository<?> createProjectWithPush(String name) throws Exception {
+    return createProjectWithPush(name, null, true, getSubmitType());
+  }
+
+  private static AtomicInteger contentCounter = new AtomicInteger(0);
+
+  protected ObjectId pushChangeTo(
+      TestRepository<?> repo, String ref, String file, String content, String message, String topic)
+      throws Exception {
+    ObjectId ret =
+        repo.branch("HEAD").commit().insertChangeId().message(message).add(file, content).create();
+
+    String pushedRef = ref;
+    if (!topic.isEmpty()) {
+      pushedRef += "/" + name(topic);
+    }
+    String refspec = "HEAD:" + pushedRef;
+
+    Iterable<PushResult> res =
+        repo.git().push().setRemote("origin").setRefSpecs(new RefSpec(refspec)).call();
+
+    RemoteRefUpdate u = Iterables.getOnlyElement(res).getRemoteUpdate(pushedRef);
+    assertThat(u).isNotNull();
+    assertThat(u.getStatus()).isEqualTo(Status.OK);
+    assertThat(u.getNewObjectId()).isEqualTo(ret);
+
+    return ret;
+  }
+
+  protected ObjectId pushChangeTo(TestRepository<?> repo, String ref, String message, String topic)
+      throws Exception {
+    return pushChangeTo(
+        repo, ref, "a.txt", "a contents: " + contentCounter.incrementAndGet(), message, topic);
+  }
+
+  protected ObjectId pushChangeTo(TestRepository<?> repo, String branch) throws Exception {
+    return pushChangeTo(repo, "refs/heads/" + branch, "some change", "");
+  }
+
+  protected ObjectId pushChangesTo(TestRepository<?> repo, String branch, int numChanges)
+      throws Exception {
+    for (int i = 0; i < numChanges; i++) {
+      repo.branch("HEAD")
+          .commit()
+          .insertChangeId()
+          .message("Message " + i)
+          .add(name("file"), "content" + i)
+          .create();
+    }
+    String remoteBranch = "refs/heads/" + branch;
+    Iterable<PushResult> res =
+        repo.git()
+            .push()
+            .setRemote("origin")
+            .setRefSpecs(new RefSpec("HEAD:" + remoteBranch))
+            .call();
+    List<Status> status =
+        StreamSupport.stream(res.spliterator(), false)
+            .map(r -> r.getRemoteUpdate(remoteBranch).getStatus())
+            .collect(toList());
+    assertThat(status).containsExactly(Status.OK);
+    return Iterables.getLast(res).getRemoteUpdate(remoteBranch).getNewObjectId();
+  }
+
+  protected void allowSubmoduleSubscription(
+      String submodule, String subBranch, String superproject, String superBranch, boolean match)
+      throws Exception {
+    Project.NameKey sub = new Project.NameKey(name(submodule));
+    Project.NameKey superName = new Project.NameKey(name(superproject));
+    try (MetaDataUpdate md = metaDataUpdateFactory.create(sub)) {
+      md.setMessage("Added superproject subscription");
+      SubscribeSection s;
+      ProjectConfig pc = ProjectConfig.read(md);
+      if (pc.getSubscribeSections().containsKey(superName)) {
+        s = pc.getSubscribeSections().get(superName);
+      } else {
+        s = new SubscribeSection(superName);
+      }
+      String refspec;
+      if (superBranch == null) {
+        refspec = subBranch;
+      } else {
+        refspec = subBranch + ":" + superBranch;
+      }
+      if (match) {
+        s.addMatchingRefSpec(refspec);
+      } else {
+        s.addMultiMatchRefSpec(refspec);
+      }
+      pc.addSubscribeSection(s);
+      ObjectId oldId = pc.getRevision();
+      ObjectId newId = pc.commit(md);
+      assertThat(newId).isNotEqualTo(oldId);
+      projectCache.evict(pc.getProject());
+    }
+  }
+
+  protected void allowMatchingSubmoduleSubscription(
+      String submodule, String subBranch, String superproject, String superBranch)
+      throws Exception {
+    allowSubmoduleSubscription(submodule, subBranch, superproject, superBranch, true);
+  }
+
+  protected void createSubmoduleSubscription(
+      TestRepository<?> repo, String branch, String subscribeToRepo, String subscribeToBranch)
+      throws Exception {
+    Config config = new Config();
+    prepareSubmoduleConfigEntry(config, subscribeToRepo, subscribeToBranch);
+    pushSubmoduleConfig(repo, branch, config);
+  }
+
+  protected void createRelativeSubmoduleSubscription(
+      TestRepository<?> repo,
+      String branch,
+      String subscribeToRepoPrefix,
+      String subscribeToRepo,
+      String subscribeToBranch)
+      throws Exception {
+    Config config = new Config();
+    prepareRelativeSubmoduleConfigEntry(
+        config, subscribeToRepoPrefix, subscribeToRepo, subscribeToBranch);
+    pushSubmoduleConfig(repo, branch, config);
+  }
+
+  protected void prepareRelativeSubmoduleConfigEntry(
+      Config config,
+      String subscribeToRepoPrefix,
+      String subscribeToRepo,
+      String subscribeToBranch) {
+    subscribeToRepo = name(subscribeToRepo);
+    String url = subscribeToRepoPrefix + subscribeToRepo;
+    config.setString("submodule", subscribeToRepo, "path", subscribeToRepo);
+    config.setString("submodule", subscribeToRepo, "url", url);
+    if (subscribeToBranch != null) {
+      config.setString("submodule", subscribeToRepo, "branch", subscribeToBranch);
+    }
+  }
+
+  protected void prepareSubmoduleConfigEntry(
+      Config config, String subscribeToRepo, String subscribeToBranch) {
+    // The submodule subscription module checks for gerrit.canonicalWebUrl to
+    // detect if it's configured for automatic updates. It doesn't matter if
+    // it serves from that URL.
+    prepareSubmoduleConfigEntry(config, subscribeToRepo, subscribeToRepo, subscribeToBranch);
+  }
+
+  protected void prepareSubmoduleConfigEntry(
+      Config config, String subscribeToRepo, String subscribeToRepoPath, String subscribeToBranch) {
+    subscribeToRepo = name(subscribeToRepo);
+    subscribeToRepoPath = name(subscribeToRepoPath);
+    // The submodule subscription module checks for gerrit.canonicalWebUrl to
+    // detect if it's configured for automatic updates. It doesn't matter if
+    // it serves from that URL.
+    String url = cfg.getString("gerrit", null, "canonicalWebUrl") + "/" + subscribeToRepo;
+    config.setString("submodule", subscribeToRepoPath, "path", subscribeToRepoPath);
+    config.setString("submodule", subscribeToRepoPath, "url", url);
+    if (subscribeToBranch != null) {
+      config.setString("submodule", subscribeToRepoPath, "branch", subscribeToBranch);
+    }
+  }
+
+  protected void pushSubmoduleConfig(TestRepository<?> repo, String branch, Config config)
+      throws Exception {
+
+    repo.branch("HEAD")
+        .commit()
+        .insertChangeId()
+        .message("subject: adding new subscription")
+        .add(".gitmodules", config.toText())
+        .create();
+
+    repo.git()
+        .push()
+        .setRemote("origin")
+        .setRefSpecs(new RefSpec("HEAD:refs/heads/" + branch))
+        .call();
+  }
+
+  protected void expectToHaveSubmoduleState(
+      TestRepository<?> repo,
+      String branch,
+      String submodule,
+      TestRepository<?> subRepo,
+      String subBranch)
+      throws Exception {
+
+    submodule = name(submodule);
+    ObjectId commitId =
+        repo.git()
+            .fetch()
+            .setRemote("origin")
+            .call()
+            .getAdvertisedRef("refs/heads/" + branch)
+            .getObjectId();
+
+    ObjectId subHead =
+        subRepo
+            .git()
+            .fetch()
+            .setRemote("origin")
+            .call()
+            .getAdvertisedRef("refs/heads/" + subBranch)
+            .getObjectId();
+
+    RevWalk rw = repo.getRevWalk();
+    RevCommit c = rw.parseCommit(commitId);
+    rw.parseBody(c.getTree());
+
+    RevTree tree = c.getTree();
+    RevObject actualId = repo.get(tree, submodule);
+
+    assertThat(actualId).isEqualTo(subHead);
+  }
+
+  protected void expectToHaveSubmoduleState(
+      TestRepository<?> repo, String branch, String submodule, ObjectId expectedId)
+      throws Exception {
+
+    submodule = name(submodule);
+    ObjectId commitId =
+        repo.git()
+            .fetch()
+            .setRemote("origin")
+            .call()
+            .getAdvertisedRef("refs/heads/" + branch)
+            .getObjectId();
+
+    RevWalk rw = repo.getRevWalk();
+    RevCommit c = rw.parseCommit(commitId);
+    rw.parseBody(c.getTree());
+
+    RevTree tree = c.getTree();
+    RevObject actualId = repo.get(tree, submodule);
+
+    assertThat(actualId).isEqualTo(expectedId);
+  }
+
+  protected void deleteAllSubscriptions(TestRepository<?> repo, String branch) throws Exception {
+    repo.git().fetch().setRemote("origin").call();
+    repo.reset("refs/remotes/origin/" + branch);
+
+    ObjectId expectedId =
+        repo.branch("HEAD")
+            .commit()
+            .insertChangeId()
+            .message("delete contents in .gitmodules")
+            .add(".gitmodules", "") // Just remove the contents of the file!
+            .create();
+    repo.git()
+        .push()
+        .setRemote("origin")
+        .setRefSpecs(new RefSpec("HEAD:refs/heads/" + branch))
+        .call();
+
+    ObjectId actualId =
+        repo.git()
+            .fetch()
+            .setRemote("origin")
+            .call()
+            .getAdvertisedRef("refs/heads/master")
+            .getObjectId();
+    assertThat(actualId).isEqualTo(expectedId);
+  }
+
+  protected void deleteGitModulesFile(TestRepository<?> repo, String branch) throws Exception {
+    repo.git().fetch().setRemote("origin").call();
+    repo.reset("refs/remotes/origin/" + branch);
+
+    ObjectId expectedId =
+        repo.branch("HEAD")
+            .commit()
+            .insertChangeId()
+            .message("delete .gitmodules")
+            .rm(".gitmodules")
+            .create();
+    repo.git()
+        .push()
+        .setRemote("origin")
+        .setRefSpecs(new RefSpec("HEAD:refs/heads/" + branch))
+        .call();
+
+    ObjectId actualId =
+        repo.git()
+            .fetch()
+            .setRemote("origin")
+            .call()
+            .getAdvertisedRef("refs/heads/master")
+            .getObjectId();
+    assertThat(actualId).isEqualTo(expectedId);
+  }
+
+  protected boolean hasSubmodule(TestRepository<?> repo, String branch, String submodule)
+      throws Exception {
+
+    submodule = name(submodule);
+    Ref branchTip =
+        repo.git().fetch().setRemote("origin").call().getAdvertisedRef("refs/heads/" + branch);
+    if (branchTip == null) {
+      return false;
+    }
+
+    ObjectId commitId = branchTip.getObjectId();
+
+    RevWalk rw = repo.getRevWalk();
+    RevCommit c = rw.parseCommit(commitId);
+    rw.parseBody(c.getTree());
+
+    RevTree tree = c.getTree();
+    try {
+      repo.get(tree, submodule);
+      return true;
+    } catch (AssertionError e) {
+      return false;
+    }
+  }
+
+  protected void expectToHaveCommitMessage(
+      TestRepository<?> repo, String branch, String expectedMessage) throws Exception {
+
+    ObjectId commitId =
+        repo.git()
+            .fetch()
+            .setRemote("origin")
+            .call()
+            .getAdvertisedRef("refs/heads/" + branch)
+            .getObjectId();
+
+    RevWalk rw = repo.getRevWalk();
+    RevCommit c = rw.parseCommit(commitId);
+    assertThat(c.getFullMessage()).isEqualTo(expectedMessage);
+  }
+
+  protected PersonIdent getAuthor(TestRepository<?> repo, String branch) throws Exception {
+    ObjectId commitId =
+        repo.git()
+            .fetch()
+            .setRemote("origin")
+            .call()
+            .getAdvertisedRef("refs/heads/" + branch)
+            .getObjectId();
+
+    RevWalk rw = repo.getRevWalk();
+    RevCommit c = rw.parseCommit(commitId);
+    return c.getAuthorIdent();
+  }
+
+  protected void directUpdateSubmodule(String project, String refName, String path, AnyObjectId id)
+      throws Exception {
+    path = name(path);
+    try (Repository serverRepo = repoManager.openRepository(new Project.NameKey(name(project)));
+        ObjectInserter ins = serverRepo.newObjectInserter();
+        RevWalk rw = new RevWalk(serverRepo)) {
+      Ref ref = serverRepo.exactRef(refName);
+      assertThat(ref).named(refName).isNotNull();
+      ObjectId oldCommitId = ref.getObjectId();
+
+      DirCache dc = DirCache.newInCore();
+      DirCacheBuilder b = dc.builder();
+      b.addTree(
+          new byte[0], DirCacheEntry.STAGE_0, rw.getObjectReader(), rw.parseTree(oldCommitId));
+      b.finish();
+      DirCacheEditor e = dc.editor();
+      e.add(
+          new PathEdit(path) {
+            @Override
+            public void apply(DirCacheEntry ent) {
+              ent.setFileMode(FileMode.GITLINK);
+              ent.setObjectId(id);
+            }
+          });
+      e.finish();
+
+      CommitBuilder cb = new CommitBuilder();
+      cb.addParentId(oldCommitId);
+      cb.setTreeId(dc.writeTree(ins));
+      PersonIdent ident = serverIdent.get();
+      cb.setAuthor(ident);
+      cb.setCommitter(ident);
+      cb.setMessage("Direct update submodule " + path);
+      ObjectId newCommitId = ins.insert(cb);
+      ins.flush();
+
+      RefUpdate ru = serverRepo.updateRef(refName);
+      ru.setExpectedOldObjectId(oldCommitId);
+      ru.setNewObjectId(newCommitId);
+      assertThat(ru.update()).isEqualTo(RefUpdate.Result.FAST_FORWARD);
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/git/BUILD b/javatests/com/google/gerrit/acceptance/git/BUILD
new file mode 100644
index 0000000..e222a4f
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/git/BUILD
@@ -0,0 +1,28 @@
+load("//javatests/com/google/gerrit/acceptance:tests.bzl", "acceptance_tests")
+
+acceptance_tests(
+    srcs = glob(["*IT.java"]),
+    group = "git",
+    labels = ["git"],
+    deps = [
+        ":push_for_review",
+        ":submodule_util",
+    ],
+)
+
+java_library(
+    name = "push_for_review",
+    testonly = True,
+    srcs = ["AbstractPushForReview.java"],
+    deps = [
+        "//java/com/google/gerrit/acceptance:lib",
+        "//java/com/google/gerrit/mail",
+    ],
+)
+
+java_library(
+    name = "submodule_util",
+    testonly = True,
+    srcs = ["AbstractSubmoduleSubscription.java"],
+    deps = ["//java/com/google/gerrit/acceptance:lib"],
+)
diff --git a/javatests/com/google/gerrit/acceptance/git/ForcePushIT.java b/javatests/com/google/gerrit/acceptance/git/ForcePushIT.java
new file mode 100644
index 0000000..d80faa8
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/git/ForcePushIT.java
@@ -0,0 +1,109 @@
+// Copyright (C) 2015 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.google.gerrit.acceptance.git;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.acceptance.GitUtil.deleteRef;
+import static org.eclipse.jgit.lib.Constants.HEAD;
+import static org.eclipse.jgit.transport.RemoteRefUpdate.Status.OK;
+import static org.eclipse.jgit.transport.RemoteRefUpdate.Status.REJECTED_OTHER_REASON;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.projects.BranchInput;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.transport.PushResult;
+import org.eclipse.jgit.transport.RemoteRefUpdate;
+import org.junit.Test;
+
+@NoHttpd
+public class ForcePushIT extends AbstractDaemonTest {
+
+  @Test
+  public void forcePushNotAllowed() throws Exception {
+    ObjectId initial = repo().exactRef(HEAD).getLeaf().getObjectId();
+    PushOneCommit push1 =
+        pushFactory.create(db, admin.getIdent(), testRepo, "change1", "a.txt", "content");
+    PushOneCommit.Result r1 = push1.to("refs/heads/master");
+    r1.assertOkStatus();
+
+    // Reset HEAD to initial so the new change is a non-fast forward
+    RefUpdate ru = repo().updateRef(HEAD);
+    ru.setNewObjectId(initial);
+    assertThat(ru.forceUpdate()).isEqualTo(RefUpdate.Result.FORCED);
+
+    PushOneCommit push2 =
+        pushFactory.create(db, admin.getIdent(), testRepo, "change2", "b.txt", "content");
+    push2.setForce(true);
+    PushOneCommit.Result r2 = push2.to("refs/heads/master");
+    r2.assertErrorStatus("not permitted: force update");
+  }
+
+  @Test
+  public void forcePushAllowed() throws Exception {
+    ObjectId initial = repo().exactRef(HEAD).getLeaf().getObjectId();
+    grant(project, "refs/*", Permission.PUSH, true);
+    PushOneCommit push1 =
+        pushFactory.create(db, admin.getIdent(), testRepo, "change1", "a.txt", "content");
+    PushOneCommit.Result r1 = push1.to("refs/heads/master");
+    r1.assertOkStatus();
+
+    // Reset HEAD to initial so the new change is a non-fast forward
+    RefUpdate ru = repo().updateRef(HEAD);
+    ru.setNewObjectId(initial);
+    assertThat(ru.forceUpdate()).isEqualTo(RefUpdate.Result.FORCED);
+
+    PushOneCommit push2 =
+        pushFactory.create(db, admin.getIdent(), testRepo, "change2", "b.txt", "content");
+    push2.setForce(true);
+    PushOneCommit.Result r2 = push2.to("refs/heads/master");
+    r2.assertOkStatus();
+  }
+
+  @Test
+  public void deleteNotAllowed() throws Exception {
+    assertDeleteRef(REJECTED_OTHER_REASON);
+  }
+
+  @Test
+  public void deleteNotAllowedWithOnlyPushPermission() throws Exception {
+    grant(project, "refs/*", Permission.PUSH, false);
+    assertDeleteRef(REJECTED_OTHER_REASON);
+  }
+
+  @Test
+  public void deleteAllowedWithForcePushPermission() throws Exception {
+    grant(project, "refs/*", Permission.PUSH, true);
+    assertDeleteRef(OK);
+  }
+
+  @Test
+  public void deleteAllowedWithDeletePermission() throws Exception {
+    grant(project, "refs/*", Permission.DELETE, true);
+    assertDeleteRef(OK);
+  }
+
+  private void assertDeleteRef(RemoteRefUpdate.Status expectedStatus) throws Exception {
+    BranchInput in = new BranchInput();
+    in.ref = "refs/heads/test";
+    gApi.projects().name(project.get()).branch(in.ref).create(in);
+    PushResult result = deleteRef(testRepo, in.ref);
+    RemoteRefUpdate refUpdate = result.getRemoteUpdate(in.ref);
+    assertThat(refUpdate.getStatus()).isEqualTo(expectedStatus);
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/git/GitOverHttpServletIT.java b/javatests/com/google/gerrit/acceptance/git/GitOverHttpServletIT.java
new file mode 100644
index 0000000..42e046a
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/git/GitOverHttpServletIT.java
@@ -0,0 +1,68 @@
+// 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.
+
+package com.google.gerrit.acceptance.git;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.server.AuditEvent;
+import java.util.Collections;
+import org.eclipse.jgit.transport.CredentialsProvider;
+import org.eclipse.jgit.transport.RefSpec;
+import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
+import org.junit.Before;
+import org.junit.Test;
+
+public class GitOverHttpServletIT extends AbstractPushForReview {
+
+  @Before
+  public void beforeEach() throws Exception {
+    CredentialsProvider.setDefault(
+        new UsernamePasswordCredentialsProvider(admin.username, admin.httpPassword));
+    selectProtocol(AbstractPushForReview.Protocol.HTTP);
+    auditService.clearEvents();
+  }
+
+  @Test
+  public void receivePackAuditEventLog() throws Exception {
+    testRepo
+        .git()
+        .push()
+        .setRemote("origin")
+        .setRefSpecs(new RefSpec("HEAD:refs/for/master"))
+        .call();
+
+    // Git smart protocol makes two requests:
+    // https://github.com/git/git/blob/master/Documentation/technical/http-protocol.txt
+    assertThat(auditService.auditEvents.size()).isEqualTo(2);
+
+    AuditEvent e = auditService.auditEvents.get(1);
+    assertThat(e.who.getAccountId()).isEqualTo(admin.id);
+    assertThat(e.what).endsWith("/git-receive-pack");
+    assertThat(e.params).isEmpty();
+  }
+
+  @Test
+  public void uploadPackAuditEventLog() throws Exception {
+    testRepo.git().fetch().call();
+
+    assertThat(auditService.auditEvents.size()).isEqualTo(1);
+
+    AuditEvent e = auditService.auditEvents.get(0);
+    assertThat(e.who.toString()).isEqualTo("ANONYMOUS");
+    assertThat(e.params.get("service"))
+        .containsExactlyElementsIn(Collections.singletonList("git-upload-pack"));
+    assertThat(e.what).endsWith("service=git-upload-pack");
+  }
+}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/GitmodulesIT.java b/javatests/com/google/gerrit/acceptance/git/GitmodulesIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/GitmodulesIT.java
rename to javatests/com/google/gerrit/acceptance/git/GitmodulesIT.java
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/HttpPushForReviewIT.java b/javatests/com/google/gerrit/acceptance/git/HttpPushForReviewIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/HttpPushForReviewIT.java
rename to javatests/com/google/gerrit/acceptance/git/HttpPushForReviewIT.java
diff --git a/javatests/com/google/gerrit/acceptance/git/ImplicitMergeCheckIT.java b/javatests/com/google/gerrit/acceptance/git/ImplicitMergeCheckIT.java
new file mode 100644
index 0000000..954ca8b
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/git/ImplicitMergeCheckIT.java
@@ -0,0 +1,98 @@
+// Copyright (C) 2015 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.google.gerrit.acceptance.git;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.acceptance.GitUtil.pushHead;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
+import org.eclipse.jgit.lib.ObjectId;
+import org.junit.Test;
+
+public class ImplicitMergeCheckIT extends AbstractDaemonTest {
+
+  @Test
+  public void implicitMergeViaFastForward() throws Exception {
+    setRejectImplicitMerges();
+
+    pushHead(testRepo, "refs/heads/stable", false);
+    PushOneCommit.Result m = push("refs/heads/master", "0", "file", "0");
+    PushOneCommit.Result c = push("refs/for/stable", "1", "file", "1");
+
+    c.assertMessage(implicitMergeOf(m.getCommit()));
+    c.assertErrorStatus();
+  }
+
+  @Test
+  public void implicitMergeViaRealMerge() throws Exception {
+    setRejectImplicitMerges();
+
+    ObjectId base = repo().exactRef("HEAD").getObjectId();
+    push("refs/heads/stable", "0", "f", "0");
+    testRepo.reset(base);
+    PushOneCommit.Result m = push("refs/heads/master", "1", "f", "1");
+    PushOneCommit.Result c = push("refs/for/stable", "2", "f", "2");
+
+    c.assertMessage(implicitMergeOf(m.getCommit()));
+    c.assertErrorStatus();
+  }
+
+  @Test
+  public void implicitMergeCheckOff() throws Exception {
+    ObjectId base = repo().exactRef("HEAD").getObjectId();
+    push("refs/heads/stable", "0", "f", "0");
+    testRepo.reset(base);
+    PushOneCommit.Result m = push("refs/heads/master", "1", "f", "1");
+    PushOneCommit.Result c = push("refs/for/stable", "2", "f", "2");
+
+    assertThat(c.getMessage().toLowerCase()).doesNotContain(implicitMergeOf(m.getCommit()));
+  }
+
+  @Test
+  public void notImplicitMerge_noWarning() throws Exception {
+    setRejectImplicitMerges();
+
+    ObjectId base = repo().exactRef("HEAD").getObjectId();
+    push("refs/heads/stable", "0", "f", "0");
+    testRepo.reset(base);
+    PushOneCommit.Result m = push("refs/heads/master", "1", "f", "1");
+    PushOneCommit.Result c = push("refs/for/master", "2", "f", "2");
+
+    assertThat(c.getMessage().toLowerCase()).doesNotContain(implicitMergeOf(m.getCommit()));
+  }
+
+  private static String implicitMergeOf(ObjectId commit) {
+    return "implicit merge of " + commit.abbreviate(7).name();
+  }
+
+  private void setRejectImplicitMerges() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      u.getConfig()
+          .getProject()
+          .setBooleanConfig(BooleanProjectConfig.REJECT_IMPLICIT_MERGES, InheritableBoolean.TRUE);
+      u.save();
+    }
+  }
+
+  private PushOneCommit.Result push(String ref, String subject, String fileName, String content)
+      throws Exception {
+    PushOneCommit push =
+        pushFactory.create(db, admin.getIdent(), testRepo, subject, fileName, content);
+    return push.to(ref);
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/git/PushPermissionsIT.java b/javatests/com/google/gerrit/acceptance/git/PushPermissionsIT.java
new file mode 100644
index 0000000..30e179d
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/git/PushPermissionsIT.java
@@ -0,0 +1,402 @@
+// 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.
+
+package com.google.gerrit.acceptance.git;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+import static com.google.common.truth.Truth.assert_;
+import static com.google.gerrit.git.testing.PushResultSubject.assertThat;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.extensions.client.ProjectState;
+import com.google.gerrit.extensions.common.ChangeInput;
+import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.server.project.testing.Util;
+import java.util.Arrays;
+import java.util.function.Consumer;
+import org.eclipse.jgit.api.PushCommand;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.BlobBasedConfig;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.transport.PushResult;
+import org.eclipse.jgit.transport.RefSpec;
+import org.eclipse.jgit.transport.RemoteRefUpdate.Status;
+import org.eclipse.jgit.transport.TrackingRefUpdate;
+import org.junit.Before;
+import org.junit.Test;
+
+public class PushPermissionsIT extends AbstractDaemonTest {
+  @Before
+  public void setUp() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(allProjects)) {
+      ProjectConfig cfg = u.getConfig();
+      cfg.getProject()
+          .setBooleanConfig(BooleanProjectConfig.REQUIRE_CHANGE_ID, InheritableBoolean.FALSE);
+
+      // Remove push-related permissions, so they can be added back individually by test methods.
+      removeAllBranchPermissions(
+          cfg,
+          Permission.ADD_PATCH_SET,
+          Permission.CREATE,
+          Permission.DELETE,
+          Permission.PUSH,
+          Permission.PUSH_MERGE,
+          Permission.SUBMIT);
+      removeAllGlobalCapabilities(cfg, GlobalCapability.ADMINISTRATE_SERVER);
+
+      // Include some auxiliary permissions.
+      Util.allow(cfg, Permission.FORGE_AUTHOR, REGISTERED_USERS, "refs/*");
+      Util.allow(cfg, Permission.FORGE_COMMITTER, REGISTERED_USERS, "refs/*");
+
+      u.save();
+    }
+  }
+
+  @Test
+  public void mixingMagicAndRegularPush() throws Exception {
+    testRepo.branch("HEAD").commit().create();
+    PushResult r = push("HEAD:refs/heads/master", "HEAD:refs/for/master");
+
+    String msg = "cannot combine normal pushes and magic pushes";
+    assertThat(r.getRemoteUpdate("refs/heads/master")).isNotEqualTo(Status.OK);
+    assertThat(r.getRemoteUpdate("refs/for/master")).isNotEqualTo(Status.OK);
+    assertThat(r.getRemoteUpdate("refs/for/master").getMessage()).isEqualTo(msg);
+  }
+
+  @Test
+  public void mixingDirectChangesAndRegularPush() throws Exception {
+    testRepo.branch("HEAD").commit().create();
+    PushResult r = push("HEAD:refs/heads/master", "HEAD:refs/changes/01/101");
+
+    String msg = "cannot combine normal pushes and magic pushes";
+    assertThat(r.getRemoteUpdate("refs/heads/master")).isNotEqualTo(Status.OK);
+    assertThat(r.getRemoteUpdate("refs/changes/01/101")).isNotEqualTo(Status.OK);
+    assertThat(r.getRemoteUpdate("refs/heads/master").getMessage()).isEqualTo(msg);
+  }
+
+  @Test
+  public void fastForwardUpdateDenied() throws Exception {
+    testRepo.branch("HEAD").commit().create();
+    PushResult r = push("HEAD:refs/heads/master");
+    assertThat(r)
+        .onlyRef("refs/heads/master")
+        .isRejected("prohibited by Gerrit: not permitted: update");
+    assertThat(r)
+        .hasMessages(
+            "error: branch refs/heads/master:",
+            "To push into this reference you need 'Push' rights.",
+            "User: admin",
+            "Contact an administrator to fix the permissions");
+    assertThat(r).hasProcessed(ImmutableMap.of("refs", 1));
+  }
+
+  @Test
+  public void nonFastForwardUpdateDenied() throws Exception {
+    ObjectId commit = testRepo.commit().create();
+    PushResult r = push("+" + commit.name() + ":refs/heads/master");
+    assertThat(r)
+        .onlyRef("refs/heads/master")
+        .isRejected("prohibited by Gerrit: not permitted: force update");
+    assertThat(r).hasProcessed(ImmutableMap.of("refs", 1));
+  }
+
+  @Test
+  public void deleteDenied() throws Exception {
+    PushResult r = push(":refs/heads/master");
+    assertThat(r)
+        .onlyRef("refs/heads/master")
+        .isRejected("prohibited by Gerrit: not permitted: delete");
+    assertThat(r)
+        .hasMessages(
+            "error: branch refs/heads/master:",
+            "You need 'Delete Reference' rights or 'Push' rights with the ",
+            "'Force Push' flag set to delete references.",
+            "User: admin",
+            "Contact an administrator to fix the permissions");
+    assertThat(r).hasProcessed(ImmutableMap.of("refs", 1));
+  }
+
+  @Test
+  public void createDenied() throws Exception {
+    testRepo.branch("HEAD").commit().create();
+    PushResult r = push("HEAD:refs/heads/newbranch");
+    assertThat(r)
+        .onlyRef("refs/heads/newbranch")
+        .isRejected("prohibited by Gerrit: not permitted: create");
+    assertThat(r).containsMessages("You need 'Create' rights to create new references.");
+    assertThat(r).hasProcessed(ImmutableMap.of("refs", 1));
+  }
+
+  @Test
+  public void groupRefsByMessage() throws Exception {
+    try (Repository repo = repoManager.openRepository(project)) {
+      TestRepository<?> tr = new TestRepository<>(repo);
+      tr.branch("foo").commit().create();
+      tr.branch("bar").commit().create();
+    }
+
+    testRepo.branch("HEAD").commit().create();
+    PushResult r = push(":refs/heads/foo", ":refs/heads/bar", "HEAD:refs/heads/master");
+    assertThat(r).ref("refs/heads/foo").isRejected("prohibited by Gerrit: not permitted: delete");
+    assertThat(r).ref("refs/heads/bar").isRejected("prohibited by Gerrit: not permitted: delete");
+    assertThat(r)
+        .ref("refs/heads/master")
+        .isRejected("prohibited by Gerrit: not permitted: update");
+    assertThat(r)
+        .hasMessages(
+            "error: branches refs/heads/foo, refs/heads/bar:",
+            "You need 'Delete Reference' rights or 'Push' rights with the ",
+            "'Force Push' flag set to delete references.",
+            "error: branch refs/heads/master:",
+            "To push into this reference you need 'Push' rights.",
+            "User: admin",
+            "Contact an administrator to fix the permissions");
+  }
+
+  @Test
+  public void readOnlyProjectRejectedBeforeTestingPermissions() throws Exception {
+    try (Repository repo = repoManager.openRepository(project)) {
+      try (ProjectConfigUpdate u = updateProject(project)) {
+        u.getConfig().getProject().setState(ProjectState.READ_ONLY);
+        u.save();
+      }
+    }
+
+    PushResult r = push(":refs/heads/master");
+    assertThat(r)
+        .onlyRef("refs/heads/master")
+        .isRejected("prohibited by Gerrit: project state does not permit write");
+    assertThat(r).hasNoMessages();
+    assertThat(r).hasProcessed(ImmutableMap.of("refs", 1));
+  }
+
+  @Test
+  public void refsMetaConfigUpdateRequiresProjectOwner() throws Exception {
+    grant(project, "refs/meta/config", Permission.PUSH, false, REGISTERED_USERS);
+
+    forceFetch("refs/meta/config");
+    ObjectId commit = testRepo.branch("refs/meta/config").commit().create();
+    PushResult r = push(commit.name() + ":refs/meta/config");
+    assertThat(r)
+        .onlyRef("refs/meta/config")
+        // ReceiveCommits theoretically has a different message when a WRITE_CONFIG check fails, but
+        // it never gets there, since DefaultPermissionBackend special-cases refs/meta/config and
+        // denies UPDATE if the user is not a project owner.
+        .isRejected("prohibited by Gerrit: not permitted: update");
+    assertThat(r)
+        .hasMessages(
+            "error: branch refs/meta/config:",
+            "Configuration changes can only be pushed by project owners",
+            "who also have 'Push' rights on refs/meta/config",
+            "User: admin",
+            "Contact an administrator to fix the permissions");
+    assertThat(r).hasProcessed(ImmutableMap.of("refs", 1));
+
+    grant(project, "refs/*", Permission.OWNER, false, REGISTERED_USERS);
+
+    // Re-fetch refs/meta/config from the server because the grant changed it, and we want a
+    // fast-forward.
+    forceFetch("refs/meta/config");
+    commit = testRepo.branch("refs/meta/config").commit().create();
+
+    assertThat(push(commit.name() + ":refs/meta/config")).onlyRef("refs/meta/config").isOk();
+  }
+
+  @Test
+  public void createChangeDenied() throws Exception {
+    testRepo.branch("HEAD").commit().create();
+    PushResult r = push("HEAD:refs/for/master");
+    assertThat(r)
+        .onlyRef("refs/for/master")
+        .isRejected("prohibited by Gerrit: not permitted: create change on refs/heads/master");
+    assertThat(r)
+        .containsMessages(
+            "error: branch refs/for/master:",
+            "You need 'Create Change' rights to upload code review requests.",
+            "Verify that you are pushing to the right branch.");
+    assertThat(r).hasProcessed(ImmutableMap.of("refs", 1));
+  }
+
+  @Test
+  public void updateBySubmitDenied() throws Exception {
+    grant(project, "refs/for/refs/heads/*", Permission.PUSH, false, REGISTERED_USERS);
+
+    ObjectId commit = testRepo.branch("HEAD").commit().create();
+    assertThat(push("HEAD:refs/for/master")).onlyRef("refs/for/master").isOk();
+    gApi.changes().id(commit.name()).current().review(ReviewInput.approve());
+
+    PushResult r = push("HEAD:refs/for/master%submit");
+    assertThat(r)
+        .onlyRef("refs/for/master%submit")
+        .isRejected("prohibited by Gerrit: not permitted: update by submit on refs/heads/master");
+    assertThat(r)
+        .containsMessages(
+            "You need 'Submit' rights on refs/for/ to submit changes during change upload.");
+    assertThat(r).hasProcessed(ImmutableMap.of("refs", 1));
+  }
+
+  @Test
+  public void addPatchSetDenied() throws Exception {
+    grant(project, "refs/for/refs/heads/*", Permission.PUSH, false, REGISTERED_USERS);
+    setApiUser(user);
+    ChangeInput ci = new ChangeInput();
+    ci.project = project.get();
+    ci.branch = "master";
+    ci.subject = "A change";
+    Change.Id id = new Change.Id(gApi.changes().create(ci).get()._number);
+
+    setApiUser(admin);
+    ObjectId ps1Id = forceFetch(new PatchSet.Id(id, 1).toRefName());
+    ObjectId ps2Id = testRepo.amend(ps1Id).add("file", "content").create();
+    PushResult r = push(ps2Id.name() + ":refs/for/master");
+    assertThat(r)
+        .onlyRef("refs/for/master")
+        .isRejected("cannot add patch set to " + id.get() + ".");
+    assertThat(r).hasNoMessages();
+    assertThat(r).hasProcessed(ImmutableMap.of("refs", 1));
+  }
+
+  @Test
+  public void skipValidationDenied() throws Exception {
+    grant(project, "refs/heads/*", Permission.PUSH, false, REGISTERED_USERS);
+
+    testRepo.branch("HEAD").commit().create();
+    PushResult r =
+        push(c -> c.setPushOptions(ImmutableList.of("skip-validation")), "HEAD:refs/heads/master");
+    assertThat(r)
+        .onlyRef("refs/heads/master")
+        .isRejected("prohibited by Gerrit: not permitted: skip validation");
+    assertThat(r)
+        .containsMessages(
+            "You need 'Forge Author', 'Forge Server', 'Forge Committer'",
+            "and 'Push Merge' rights to skip validation.");
+    assertThat(r).hasProcessed(ImmutableMap.of("refs", 1));
+  }
+
+  @Test
+  public void accessDatabaseForNoteDbDenied() throws Exception {
+    grant(project, "refs/heads/*", Permission.PUSH, false, REGISTERED_USERS);
+
+    testRepo.branch("HEAD").commit().create();
+    PushResult r =
+        push(
+            c -> c.setPushOptions(ImmutableList.of("notedb=allow")),
+            "HEAD:refs/changes/34/1234/meta");
+    // Same rejection message regardless of whether NoteDb is actually enabled.
+    assertThat(r)
+        .onlyRef("refs/changes/34/1234/meta")
+        .isRejected("NoteDb update requires access database permission");
+    assertThat(r).hasNoMessages();
+    assertThat(r).hasProcessed(ImmutableMap.of("refs", 1));
+  }
+
+  @Test
+  public void administrateServerForUpdateParentDenied() throws Exception {
+    grant(project, "refs/meta/config", Permission.PUSH, false, REGISTERED_USERS);
+    grant(project, "refs/*", Permission.OWNER, false, REGISTERED_USERS);
+
+    String project2 = name("project2");
+    gApi.projects().create(project2);
+
+    ObjectId oldId = forceFetch("refs/meta/config");
+
+    Config cfg = new BlobBasedConfig(null, testRepo.getRepository(), oldId, "project.config");
+    cfg.setString("access", null, "inheritFrom", project2);
+    ObjectId newId =
+        testRepo.branch("refs/meta/config").commit().add("project.config", cfg.toText()).create();
+
+    PushResult r = push(newId.name() + ":refs/meta/config");
+    assertThat(r)
+        .onlyRef("refs/meta/config")
+        .isRejected("invalid project configuration: only Gerrit admin can set parent");
+    assertThat(r).hasNoMessages();
+    assertThat(r).hasProcessed(ImmutableMap.of("refs", 1));
+  }
+
+  private static void removeAllBranchPermissions(ProjectConfig cfg, String... permissions) {
+    cfg.getAccessSections().stream()
+        .filter(
+            s ->
+                s.getName().startsWith("refs/heads/")
+                    || s.getName().startsWith("refs/for/")
+                    || s.getName().equals("refs/*"))
+        .forEach(s -> Arrays.stream(permissions).forEach(s::removePermission));
+  }
+
+  private static void removeAllGlobalCapabilities(ProjectConfig cfg, String... capabilities) {
+    Arrays.stream(capabilities)
+        .forEach(
+            c ->
+                cfg.getAccessSection(AccessSection.GLOBAL_CAPABILITIES, true)
+                    .getPermission(c, true)
+                    .clearRules());
+  }
+
+  private PushResult push(String... refSpecs) throws Exception {
+    return push(c -> {}, refSpecs);
+  }
+
+  private PushResult push(Consumer<PushCommand> setUp, String... refSpecs) throws Exception {
+    PushCommand cmd =
+        testRepo
+            .git()
+            .push()
+            .setRemote("origin")
+            .setRefSpecs(Arrays.stream(refSpecs).map(RefSpec::new).collect(toList()));
+    setUp.accept(cmd);
+    Iterable<PushResult> results = cmd.call();
+    assertWithMessage("expected 1 PushResult").that(results).hasSize(1);
+    return results.iterator().next();
+  }
+
+  private ObjectId forceFetch(String ref) throws Exception {
+    TrackingRefUpdate u =
+        testRepo.git().fetch().setRefSpecs("+" + ref + ":" + ref).call().getTrackingRefUpdate(ref);
+    assertThat(u).isNotNull();
+    switch (u.getResult()) {
+      case NEW:
+      case FAST_FORWARD:
+      case FORCED:
+        break;
+      case IO_FAILURE:
+      case LOCK_FAILURE:
+      case NOT_ATTEMPTED:
+      case NO_CHANGE:
+      case REJECTED:
+      case REJECTED_CURRENT_BRANCH:
+      case REJECTED_MISSING_OBJECT:
+      case REJECTED_OTHER_REASON:
+      case RENAMED:
+      default:
+        assert_().fail("fetch failed to update local %s: %s", ref, u.getResult());
+        break;
+    }
+    return u.getNewObjectId();
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/git/RefAdvertisementIT.java b/javatests/com/google/gerrit/acceptance/git/RefAdvertisementIT.java
new file mode 100644
index 0000000..3f06dfb
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/git/RefAdvertisementIT.java
@@ -0,0 +1,822 @@
+// Copyright (C) 2014 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.google.gerrit.acceptance.git;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+import static com.google.common.truth.TruthJUnit.assume;
+import static com.google.gerrit.acceptance.GitUtil.fetch;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.base.Predicates;
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.AcceptanceTestRequestScope;
+import com.google.gerrit.acceptance.GerritConfig;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.ProjectResetter;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.TestAccount;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.changes.DraftInput;
+import com.google.gerrit.extensions.api.groups.GroupInput;
+import com.google.gerrit.extensions.api.projects.BranchInput;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.Sequences;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.AnonymousCowardName;
+import com.google.gerrit.server.git.receive.ReceiveCommitsAdvertiseRefsHook;
+import com.google.gerrit.server.notedb.ChangeNoteUtil;
+import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackend.RefFilterOptions;
+import com.google.gerrit.server.project.testing.Util;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.testing.NoteDbMode;
+import com.google.gerrit.testing.TestChanges;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Predicate;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.Repository;
+import org.junit.Before;
+import org.junit.Test;
+
+@NoHttpd
+public class RefAdvertisementIT extends AbstractDaemonTest {
+  @Inject private PermissionBackend permissionBackend;
+  @Inject private ChangeNoteUtil noteUtil;
+  @Inject @AnonymousCowardName private String anonymousCowardName;
+  @Inject private AllUsersName allUsersName;
+
+  private AccountGroup.UUID admins;
+  private AccountGroup.UUID nonInteractiveUsers;
+
+  private ChangeData c1;
+  private ChangeData c2;
+  private ChangeData c3;
+  private ChangeData c4;
+  private String r1;
+  private String r2;
+  private String r3;
+  private String r4;
+
+  @Before
+  public void setUp() throws Exception {
+    admins = adminGroupUuid();
+    nonInteractiveUsers = groupUuid("Non-Interactive Users");
+    setUpPermissions();
+    setUpChanges();
+  }
+
+  private void setUpPermissions() throws Exception {
+    // Remove read permissions for all users besides admin. This method is idempotent, so is safe
+    // to call on every test setup.
+    try (ProjectConfigUpdate u = updateProject(allProjects)) {
+      for (AccessSection sec : u.getConfig().getAccessSections()) {
+        sec.removePermission(Permission.READ);
+      }
+      Util.allow(u.getConfig(), Permission.READ, admins, "refs/*");
+      u.save();
+    }
+
+    // Remove all read permissions on All-Users. This method is idempotent, so is safe to call on
+    // every test setup.
+    try (ProjectConfigUpdate u = updateProject(allUsers)) {
+      for (AccessSection sec : u.getConfig().getAccessSections()) {
+        sec.removePermission(Permission.READ);
+      }
+      u.save();
+    }
+  }
+
+  private static String changeRefPrefix(Change.Id id) {
+    String ps = new PatchSet.Id(id, 1).toRefName();
+    return ps.substring(0, ps.length() - 1);
+  }
+
+  private void setUpChanges() throws Exception {
+    gApi.projects().name(project.get()).branch("branch").create(new BranchInput());
+
+    // First 2 changes are merged, which means the tags pointing to them are
+    // visible.
+    allow("refs/for/refs/heads/*", Permission.SUBMIT, admins);
+    PushOneCommit.Result mr =
+        pushFactory.create(db, admin.getIdent(), testRepo).to("refs/for/master%submit");
+    mr.assertOkStatus();
+    c1 = mr.getChange();
+    r1 = changeRefPrefix(c1.getId());
+    PushOneCommit.Result br =
+        pushFactory.create(db, admin.getIdent(), testRepo).to("refs/for/branch%submit");
+    br.assertOkStatus();
+    c2 = br.getChange();
+    r2 = changeRefPrefix(c2.getId());
+
+    // Second 2 changes are unmerged.
+    mr = pushFactory.create(db, admin.getIdent(), testRepo).to("refs/for/master");
+    mr.assertOkStatus();
+    c3 = mr.getChange();
+    r3 = changeRefPrefix(c3.getId());
+    br = pushFactory.create(db, admin.getIdent(), testRepo).to("refs/for/branch");
+    br.assertOkStatus();
+    c4 = br.getChange();
+    r4 = changeRefPrefix(c4.getId());
+
+    try (Repository repo = repoManager.openRepository(project)) {
+      // master-tag -> master
+      RefUpdate mtu = repo.updateRef("refs/tags/master-tag");
+      mtu.setExpectedOldObjectId(ObjectId.zeroId());
+      mtu.setNewObjectId(repo.exactRef("refs/heads/master").getObjectId());
+      assertThat(mtu.update()).isEqualTo(RefUpdate.Result.NEW);
+
+      // branch-tag -> branch
+      RefUpdate btu = repo.updateRef("refs/tags/branch-tag");
+      btu.setExpectedOldObjectId(ObjectId.zeroId());
+      btu.setNewObjectId(repo.exactRef("refs/heads/branch").getObjectId());
+      assertThat(btu.update()).isEqualTo(RefUpdate.Result.NEW);
+    }
+  }
+
+  @Test
+  public void uploadPackAllRefsVisibleNoRefsMetaConfig() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      Util.allow(u.getConfig(), Permission.READ, REGISTERED_USERS, "refs/*");
+      Util.allow(u.getConfig(), Permission.READ, admins, RefNames.REFS_CONFIG);
+      Util.doNotInherit(u.getConfig(), Permission.READ, RefNames.REFS_CONFIG);
+      u.save();
+    }
+
+    setApiUser(user);
+    assertUploadPackRefs(
+        "HEAD",
+        r1 + "1",
+        r1 + "meta",
+        r2 + "1",
+        r2 + "meta",
+        r3 + "1",
+        r3 + "meta",
+        r4 + "1",
+        r4 + "meta",
+        "refs/heads/branch",
+        "refs/heads/master",
+        "refs/tags/branch-tag",
+        "refs/tags/master-tag");
+  }
+
+  @Test
+  public void uploadPackAllRefsVisibleWithRefsMetaConfig() throws Exception {
+    allow("refs/*", Permission.READ, REGISTERED_USERS);
+    allow(RefNames.REFS_CONFIG, Permission.READ, REGISTERED_USERS);
+
+    assertUploadPackRefs(
+        "HEAD",
+        r1 + "1",
+        r1 + "meta",
+        r2 + "1",
+        r2 + "meta",
+        r3 + "1",
+        r3 + "meta",
+        r4 + "1",
+        r4 + "meta",
+        "refs/heads/branch",
+        "refs/heads/master",
+        RefNames.REFS_CONFIG,
+        "refs/tags/branch-tag",
+        "refs/tags/master-tag");
+  }
+
+  @Test
+  public void uploadPackSubsetOfBranchesVisibleIncludingHead() throws Exception {
+    allow("refs/heads/master", Permission.READ, REGISTERED_USERS);
+    deny("refs/heads/branch", Permission.READ, REGISTERED_USERS);
+
+    setApiUser(user);
+    assertUploadPackRefs(
+        "HEAD",
+        r1 + "1",
+        r1 + "meta",
+        r3 + "1",
+        r3 + "meta",
+        "refs/heads/master",
+        "refs/tags/master-tag");
+  }
+
+  @Test
+  public void uploadPackSubsetOfBranchesVisibleNotIncludingHead() throws Exception {
+    deny("refs/heads/master", Permission.READ, REGISTERED_USERS);
+    allow("refs/heads/branch", Permission.READ, REGISTERED_USERS);
+
+    setApiUser(user);
+    assertUploadPackRefs(
+        r2 + "1",
+        r2 + "meta",
+        r4 + "1",
+        r4 + "meta",
+        "refs/heads/branch",
+        "refs/tags/branch-tag",
+        // master branch is not visible but master-tag is reachable from branch
+        // (since PushOneCommit always bases changes on each other).
+        "refs/tags/master-tag");
+  }
+
+  @Test
+  public void uploadPackSubsetOfBranchesVisibleWithEdit() throws Exception {
+    allow("refs/heads/master", Permission.READ, REGISTERED_USERS);
+
+    Change c = notesFactory.createChecked(db, project, c3.getId()).getChange();
+    String changeId = c.getKey().get();
+
+    // Admin's edit is not visible.
+    setApiUser(admin);
+    gApi.changes().id(changeId).edit().create();
+
+    // User's edit is visible.
+    setApiUser(user);
+    gApi.changes().id(changeId).edit().create();
+
+    assertUploadPackRefs(
+        "HEAD",
+        r1 + "1",
+        r1 + "meta",
+        r3 + "1",
+        r3 + "meta",
+        "refs/heads/master",
+        "refs/tags/master-tag",
+        "refs/tags/branch-tag",
+        "refs/users/01/1000001/edit-" + c3.getId() + "/1");
+  }
+
+  @Test
+  public void uploadPackSubsetOfBranchesAndEditsVisibleWithViewPrivateChanges() throws Exception {
+    allow("refs/heads/master", Permission.READ, REGISTERED_USERS);
+    allow("refs/*", Permission.VIEW_PRIVATE_CHANGES, REGISTERED_USERS);
+
+    Change change3 = notesFactory.createChecked(db, project, c3.getId()).getChange();
+    String changeId3 = change3.getKey().get();
+    Change change4 = notesFactory.createChecked(db, project, c4.getId()).getChange();
+    String changeId4 = change4.getKey().get();
+
+    // Admin's edit on change3 is visible.
+    setApiUser(admin);
+    gApi.changes().id(changeId3).edit().create();
+
+    // Admin's edit on change4 is not visible since user cannot see the change.
+    gApi.changes().id(changeId4).edit().create();
+
+    // User's edit is visible.
+    setApiUser(user);
+    gApi.changes().id(changeId3).edit().create();
+
+    assertUploadPackRefs(
+        "HEAD",
+        r1 + "1",
+        r1 + "meta",
+        r3 + "1",
+        r3 + "meta",
+        "refs/heads/master",
+        "refs/tags/master-tag",
+        "refs/tags/branch-tag",
+        "refs/users/00/1000000/edit-" + c3.getId() + "/1",
+        "refs/users/01/1000001/edit-" + c3.getId() + "/1");
+  }
+
+  @Test
+  public void uploadPackSubsetOfRefsVisibleWithAccessDatabase() throws Exception {
+    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
+    deny("refs/heads/master", Permission.READ, REGISTERED_USERS);
+    allow("refs/heads/branch", Permission.READ, REGISTERED_USERS);
+
+    String changeId = c3.change().getKey().get();
+    setApiUser(admin);
+    gApi.changes().id(changeId).edit().create();
+    setApiUser(user);
+
+    assertUploadPackRefs(
+        // Change 1 is visible due to accessDatabase capability, even though
+        // refs/heads/master is not.
+        r1 + "1",
+        r1 + "meta",
+        r2 + "1",
+        r2 + "meta",
+        r3 + "1",
+        r3 + "meta",
+        r4 + "1",
+        r4 + "meta",
+        "refs/heads/branch",
+        "refs/tags/branch-tag",
+        // See comment in subsetOfBranchesVisibleNotIncludingHead.
+        "refs/tags/master-tag",
+        // All edits are visible due to accessDatabase capability.
+        "refs/users/00/1000000/edit-" + c3.getId() + "/1");
+  }
+
+  @Test
+  public void uploadPackNoSearchingChangeCacheImplMaster() throws Exception {
+    uploadPackNoSearchingChangeCacheImpl();
+  }
+
+  @Test
+  @GerritConfig(name = "container.slave", value = "true")
+  public void uploadPackNoSearchingChangeCacheImplSlave() throws Exception {
+    uploadPackNoSearchingChangeCacheImpl();
+  }
+
+  private void uploadPackNoSearchingChangeCacheImpl() throws Exception {
+    allow("refs/heads/*", Permission.READ, REGISTERED_USERS);
+
+    setApiUser(user);
+    try (Repository repo = repoManager.openRepository(project)) {
+      assertRefs(
+          repo,
+          permissionBackend.user(user(user)).project(project),
+          // Can't use stored values from the index so DB must be enabled.
+          false,
+          "HEAD",
+          r1 + "1",
+          r1 + "meta",
+          r2 + "1",
+          r2 + "meta",
+          r3 + "1",
+          r3 + "meta",
+          r4 + "1",
+          r4 + "meta",
+          "refs/heads/branch",
+          "refs/heads/master",
+          "refs/tags/branch-tag",
+          "refs/tags/master-tag");
+    }
+  }
+
+  @Test
+  public void uploadPackSequencesWithAccessDatabase() throws Exception {
+    assume().that(notesMigration.readChangeSequence()).isTrue();
+    try (Repository repo = repoManager.openRepository(allProjects)) {
+      assertRefs(repo, newFilter(allProjects, user), true);
+
+      allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
+      assertRefs(repo, newFilter(allProjects, user), true, "refs/sequences/changes");
+    }
+  }
+
+  @Test
+  public void receivePackListsOpenChangesAsAdditionalHaves() throws Exception {
+    ReceiveCommitsAdvertiseRefsHook.Result r = getReceivePackRefs();
+    assertThat(r.allRefs().keySet())
+        .containsExactly(
+            // meta refs are excluded even when NoteDb is enabled.
+            "HEAD",
+            "refs/heads/branch",
+            "refs/heads/master",
+            "refs/meta/config",
+            "refs/tags/branch-tag",
+            "refs/tags/master-tag");
+    assertThat(r.additionalHaves()).containsExactly(obj(c3, 1), obj(c4, 1));
+  }
+
+  @Test
+  public void receivePackRespectsVisibilityOfOpenChanges() throws Exception {
+    allow("refs/heads/master", Permission.READ, REGISTERED_USERS);
+    deny("refs/heads/branch", Permission.READ, REGISTERED_USERS);
+    setApiUser(user);
+
+    assertThat(getReceivePackRefs().additionalHaves()).containsExactly(obj(c3, 1));
+  }
+
+  @Test
+  public void receivePackListsOnlyLatestPatchSet() throws Exception {
+    testRepo.reset(obj(c3, 1));
+    PushOneCommit.Result r = amendChange(c3.change().getKey().get());
+    r.assertOkStatus();
+    c3 = r.getChange();
+    assertThat(getReceivePackRefs().additionalHaves()).containsExactly(obj(c3, 2), obj(c4, 1));
+  }
+
+  @Test
+  public void receivePackOmitsMissingObject() throws Exception {
+    String rev = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef";
+    try (Repository repo = repoManager.openRepository(project)) {
+      TestRepository<?> tr = new TestRepository<>(repo);
+      String subject = "Subject for missing commit";
+      Change c = new Change(c3.change());
+      PatchSet.Id psId = new PatchSet.Id(c3.getId(), 2);
+      c.setCurrentPatchSet(psId, subject, c.getOriginalSubject());
+
+      if (notesMigration.changePrimaryStorage() == PrimaryStorage.REVIEW_DB) {
+        PatchSet ps = TestChanges.newPatchSet(psId, rev, admin.getId());
+        db.patchSets().insert(Collections.singleton(ps));
+        db.changes().update(Collections.singleton(c));
+      }
+
+      if (notesMigration.commitChangeWrites()) {
+        PersonIdent committer = serverIdent.get();
+        PersonIdent author =
+            noteUtil.newIdent(getAccount(admin.getId()), committer.getWhen(), committer);
+        tr.branch(RefNames.changeMetaRef(c3.getId()))
+            .commit()
+            .author(author)
+            .committer(committer)
+            .message(
+                "Update patch set "
+                    + psId.get()
+                    + "\n"
+                    + "\n"
+                    + "Patch-set: "
+                    + psId.get()
+                    + "\n"
+                    + "Commit: "
+                    + rev
+                    + "\n"
+                    + "Subject: "
+                    + subject
+                    + "\n")
+            .create();
+      }
+      indexer.index(db, c.getProject(), c.getId());
+    }
+
+    assertThat(getReceivePackRefs().additionalHaves()).containsExactly(obj(c4, 1));
+  }
+
+  @Test
+  public void advertisedReferencesDontShowUserBranchWithoutRead() throws Exception {
+    TestRepository<?> userTestRepository = cloneProject(allUsers, user);
+    try (Git git = userTestRepository.git()) {
+      assertThat(getUserRefs(git)).isEmpty();
+    }
+  }
+
+  @Test
+  public void advertisedReferencesOmitUserBranchesOfOtherUsers() throws Exception {
+    allow(allUsersName, RefNames.REFS_USERS + "*", Permission.READ, REGISTERED_USERS);
+    TestRepository<?> userTestRepository = cloneProject(allUsers, user);
+    try (Git git = userTestRepository.git()) {
+      assertThat(getUserRefs(git))
+          .containsExactly(RefNames.REFS_USERS_SELF, RefNames.refsUsers(user.id));
+    }
+  }
+
+  @Test
+  public void advertisedReferencesIncludeAllUserBranchesWithAccessDatabase() throws Exception {
+    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
+    TestRepository<?> userTestRepository = cloneProject(allUsers, user);
+    try (Git git = userTestRepository.git()) {
+      assertThat(getUserRefs(git))
+          .containsExactly(
+              RefNames.REFS_USERS_SELF, RefNames.refsUsers(user.id), RefNames.refsUsers(admin.id));
+    }
+  }
+
+  @Test
+  @GerritConfig(name = "noteDb.groups.write", value = "true")
+  public void advertisedReferencesDontShowGroupBranchToOwnerWithoutRead() throws Exception {
+    try (ProjectResetter resetter = resetGroups()) {
+      createSelfOwnedGroup("Foos", user);
+      TestRepository<?> userTestRepository = cloneProject(allUsers, user);
+      try (Git git = userTestRepository.git()) {
+        assertThat(getGroupRefs(git)).isEmpty();
+      }
+    }
+  }
+
+  @Test
+  @GerritConfig(name = "noteDb.groups.write", value = "true")
+  public void advertisedReferencesOmitGroupBranchesOfNonOwnedGroups() throws Exception {
+    try (ProjectResetter resetter = resetGroups()) {
+      allow(allUsersName, RefNames.REFS_GROUPS + "*", Permission.READ, REGISTERED_USERS);
+      AccountGroup.UUID users = createGroup("Users", admins, user);
+      AccountGroup.UUID foos = createGroup("Foos", users);
+      AccountGroup.UUID bars = createSelfOwnedGroup("Bars", user);
+      TestRepository<?> userTestRepository = cloneProject(allUsers, user);
+      try (Git git = userTestRepository.git()) {
+        assertThat(getGroupRefs(git))
+            .containsExactly(RefNames.refsGroups(foos), RefNames.refsGroups(bars));
+      }
+    }
+  }
+
+  @Test
+  @GerritConfig(name = "noteDb.groups.write", value = "true")
+  public void advertisedReferencesIncludeAllGroupBranchesWithAccessDatabase() throws Exception {
+    try (ProjectResetter resetter = resetGroups()) {
+      allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
+      AccountGroup.UUID users = createGroup("Users", admins);
+      TestRepository<?> userTestRepository = cloneProject(allUsers, user);
+      try (Git git = userTestRepository.git()) {
+        assertThat(getGroupRefs(git))
+            .containsExactly(
+                RefNames.refsGroups(admins),
+                RefNames.refsGroups(nonInteractiveUsers),
+                RefNames.refsGroups(users));
+      }
+    }
+  }
+
+  @Test
+  @GerritConfig(name = "noteDb.groups.write", value = "true")
+  public void advertisedReferencesIncludeAllGroupBranchesForAdmins() throws Exception {
+    allow(allUsersName, RefNames.REFS_GROUPS + "*", Permission.READ, REGISTERED_USERS);
+    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ADMINISTRATE_SERVER);
+    AccountGroup.UUID users = createGroup("Users", admins);
+    TestRepository<?> userTestRepository = cloneProject(allUsers, user);
+    try (Git git = userTestRepository.git()) {
+      assertThat(getGroupRefs(git))
+          .containsExactly(
+              RefNames.refsGroups(admins),
+              RefNames.refsGroups(nonInteractiveUsers),
+              RefNames.refsGroups(users));
+    }
+  }
+
+  @Test
+  @GerritConfig(name = "noteDb.groups.write", value = "true")
+  public void advertisedReferencesOmitNoteDbNotesBranches() throws Exception {
+    allow(allUsersName, RefNames.REFS + "*", Permission.READ, REGISTERED_USERS);
+    TestRepository<?> userTestRepository = cloneProject(allUsers, user);
+    try (Git git = userTestRepository.git()) {
+      assertThat(getRefs(git)).containsNoneOf(RefNames.REFS_EXTERNAL_IDS, RefNames.REFS_GROUPNAMES);
+    }
+  }
+
+  @Test
+  public void advertisedReferencesOmitPrivateChangesOfOtherUsers() throws Exception {
+    allow("refs/heads/master", Permission.READ, REGISTERED_USERS);
+
+    TestRepository<?> userTestRepository = cloneProject(project, user);
+    try (Git git = userTestRepository.git()) {
+      String change3RefName = c3.currentPatchSet().getRefName();
+      assertWithMessage("Precondition violated").that(getRefs(git)).contains(change3RefName);
+
+      gApi.changes().id(c3.getId().get()).setPrivate(true, null);
+      assertThat(getRefs(git)).doesNotContain(change3RefName);
+    }
+  }
+
+  @Test
+  public void advertisedReferencesIncludePrivateChangesWhenAllRefsMayBeRead() throws Exception {
+    allow("refs/*", Permission.READ, REGISTERED_USERS);
+
+    TestRepository<?> userTestRepository = cloneProject(project, user);
+    try (Git git = userTestRepository.git()) {
+      String change3RefName = c3.currentPatchSet().getRefName();
+      assertWithMessage("Precondition violated").that(getRefs(git)).contains(change3RefName);
+
+      gApi.changes().id(c3.getId().get()).setPrivate(true, null);
+      assertThat(getRefs(git)).contains(change3RefName);
+    }
+  }
+
+  @Test
+  @GerritConfig(name = "auth.skipFullRefEvaluationIfAllRefsAreVisible", value = "false")
+  public void advertisedReferencesOmitPrivateChangesOfOtherUsersWhenShortcutDisabled()
+      throws Exception {
+    allow("refs/*", Permission.READ, REGISTERED_USERS);
+
+    TestRepository<?> userTestRepository = cloneProject(project, user);
+    try (Git git = userTestRepository.git()) {
+      String change3RefName = c3.currentPatchSet().getRefName();
+      assertWithMessage("Precondition violated").that(getRefs(git)).contains(change3RefName);
+
+      gApi.changes().id(c3.getId().get()).setPrivate(true, null);
+      assertThat(getRefs(git)).doesNotContain(change3RefName);
+    }
+  }
+
+  @Test
+  public void advertisedReferencesOmitDraftCommentRefsOfOtherUsers() throws Exception {
+    assume().that(notesMigration.commitChangeWrites()).isTrue();
+
+    allow(project, "refs/*", Permission.READ, REGISTERED_USERS);
+    allow(allUsersName, "refs/*", Permission.READ, REGISTERED_USERS);
+
+    setApiUser(user);
+    DraftInput draftInput = new DraftInput();
+    draftInput.line = 1;
+    draftInput.message = "nit: trailing whitespace";
+    draftInput.path = Patch.COMMIT_MSG;
+    gApi.changes().id(c3.getId().get()).current().createDraft(draftInput);
+    String draftCommentRef = RefNames.refsDraftComments(c3.getId(), user.id);
+
+    // user can see the draft comment ref of the own draft comment
+    assertThat(lsRemote(allUsersName, user)).contains(draftCommentRef);
+
+    // user2 can't see the draft comment ref of user's draft comment
+    assertThat(lsRemote(allUsersName, accountCreator.user2())).doesNotContain(draftCommentRef);
+  }
+
+  @Test
+  public void advertisedReferencesOmitStarredChangesRefsOfOtherUsers() throws Exception {
+    assume().that(notesMigration.commitChangeWrites()).isTrue();
+
+    allow(project, "refs/*", Permission.READ, REGISTERED_USERS);
+    allow(allUsersName, "refs/*", Permission.READ, REGISTERED_USERS);
+
+    setApiUser(user);
+    gApi.accounts().self().starChange(c3.getId().toString());
+    String starredChangesRef = RefNames.refsStarredChanges(c3.getId(), user.id);
+
+    // user can see the starred changes ref of the own star
+    assertThat(lsRemote(allUsersName, user)).contains(starredChangesRef);
+
+    // user2 can't see the starred changes ref of admin's star
+    assertThat(lsRemote(allUsersName, accountCreator.user2())).doesNotContain(starredChangesRef);
+  }
+
+  @Test
+  @GerritConfig(name = "noteDb.groups.write", value = "true")
+  public void hideMetadata() throws Exception {
+    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
+    // create change
+    TestRepository<?> allUsersRepo = cloneProject(allUsers);
+    fetch(allUsersRepo, RefNames.REFS_USERS_SELF + ":userRef");
+    allUsersRepo.reset("userRef");
+    PushOneCommit.Result mr =
+        pushFactory
+            .create(db, admin.getIdent(), allUsersRepo)
+            .to("refs/for/" + RefNames.REFS_USERS_SELF);
+    mr.assertOkStatus();
+
+    List<String> expectedNonMetaRefs =
+        ImmutableList.of(
+            RefNames.REFS_USERS_SELF,
+            RefNames.refsUsers(admin.id),
+            RefNames.refsUsers(user.id),
+            RefNames.REFS_EXTERNAL_IDS,
+            RefNames.REFS_GROUPNAMES,
+            RefNames.refsGroups(admins),
+            RefNames.refsGroups(nonInteractiveUsers),
+            RefNames.REFS_SEQUENCES + Sequences.NAME_ACCOUNTS,
+            RefNames.REFS_SEQUENCES + Sequences.NAME_GROUPS,
+            RefNames.REFS_CONFIG,
+            Constants.HEAD);
+
+    List<String> expectedMetaRefs =
+        new ArrayList<>(ImmutableList.of(mr.getPatchSetId().toRefName()));
+    if (NoteDbMode.get() != NoteDbMode.OFF) {
+      expectedMetaRefs.add(changeRefPrefix(mr.getChange().getId()) + "meta");
+    }
+
+    List<String> expectedAllRefs = new ArrayList<>(expectedNonMetaRefs);
+    expectedAllRefs.addAll(expectedMetaRefs);
+
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      Map<String, Ref> all = repo.getAllRefs();
+
+      PermissionBackend.ForProject forProject = newFilter(allUsers, admin);
+      assertThat(forProject.filter(all, repo, RefFilterOptions.defaults()).keySet())
+          .containsExactlyElementsIn(expectedAllRefs);
+      assertThat(
+              forProject
+                  .filter(all, repo, RefFilterOptions.builder().setFilterMeta(true).build())
+                  .keySet())
+          .containsExactlyElementsIn(expectedNonMetaRefs);
+    }
+  }
+
+  private List<String> lsRemote(Project.NameKey p, TestAccount a) throws Exception {
+    TestRepository<?> testRepository = cloneProject(p, a);
+    try (Git git = testRepository.git()) {
+      return git.lsRemote().call().stream().map(Ref::getName).collect(toList());
+    }
+  }
+
+  private List<String> getRefs(Git git) throws Exception {
+    return getRefs(git, Predicates.alwaysTrue());
+  }
+
+  private List<String> getUserRefs(Git git) throws Exception {
+    return getRefs(git, RefNames::isRefsUsers);
+  }
+
+  private List<String> getGroupRefs(Git git) throws Exception {
+    return getRefs(git, RefNames::isRefsGroups);
+  }
+
+  private List<String> getRefs(Git git, Predicate<String> predicate) throws Exception {
+    return git.lsRemote().call().stream().map(Ref::getName).filter(predicate).collect(toList());
+  }
+
+  /**
+   * Assert that refs seen by a non-admin user match expected.
+   *
+   * @param expectedWithMeta expected refs, in order. If NoteDb is disabled by the configuration,
+   *     any NoteDb refs (i.e. ending in "/meta") are removed from the expected list before
+   *     comparing to the actual results.
+   * @throws Exception
+   */
+  private void assertUploadPackRefs(String... expectedWithMeta) throws Exception {
+    try (Repository repo = repoManager.openRepository(project)) {
+      assertRefs(repo, permissionBackend.user(user(user)).project(project), true, expectedWithMeta);
+    }
+  }
+
+  private void assertRefs(
+      Repository repo,
+      PermissionBackend.ForProject forProject,
+      boolean disableDb,
+      String... expectedWithMeta)
+      throws Exception {
+    List<String> expected = new ArrayList<>(expectedWithMeta.length);
+    for (String r : expectedWithMeta) {
+      if (notesMigration.commitChangeWrites() || !r.endsWith(RefNames.META_SUFFIX)) {
+        expected.add(r);
+      }
+    }
+
+    AcceptanceTestRequestScope.Context ctx = null;
+    if (disableDb) {
+      ctx = disableDb();
+    }
+    try {
+      Map<String, Ref> all = repo.getAllRefs();
+      assertThat(forProject.filter(all, repo, RefFilterOptions.defaults()).keySet())
+          .containsExactlyElementsIn(expected);
+    } finally {
+      if (disableDb) {
+        enableDb(ctx);
+      }
+    }
+  }
+
+  private ReceiveCommitsAdvertiseRefsHook.Result getReceivePackRefs() throws Exception {
+    ReceiveCommitsAdvertiseRefsHook hook =
+        new ReceiveCommitsAdvertiseRefsHook(queryProvider, project);
+    try (Repository repo = repoManager.openRepository(project)) {
+      return hook.advertiseRefs(repo.getAllRefs());
+    }
+  }
+
+  private PermissionBackend.ForProject newFilter(Project.NameKey project, TestAccount u) {
+    return permissionBackend.user(user(u)).project(project);
+  }
+
+  private static ObjectId obj(ChangeData cd, int psNum) throws Exception {
+    PatchSet.Id psId = new PatchSet.Id(cd.getId(), psNum);
+    PatchSet ps = cd.patchSet(psId);
+    assertWithMessage("%s not found in %s", psId, cd.patchSets()).that(ps).isNotNull();
+    return ObjectId.fromString(ps.getRevision().get());
+  }
+
+  private AccountGroup.UUID createSelfOwnedGroup(String name, TestAccount... members)
+      throws RestApiException {
+    return createGroup(name, null, members);
+  }
+
+  private AccountGroup.UUID createGroup(
+      String name, @Nullable AccountGroup.UUID ownerGroup, TestAccount... members)
+      throws RestApiException {
+    GroupInput groupInput = new GroupInput();
+    groupInput.name = name(name);
+    groupInput.ownerId = ownerGroup != null ? ownerGroup.get() : null;
+    groupInput.members =
+        Arrays.stream(members).map(m -> String.valueOf(m.id.get())).collect(toList());
+    return new AccountGroup.UUID(gApi.groups().create(groupInput).get().id);
+  }
+
+  /**
+   * Create a resetter to reset the group branches in All-Users. This makes the group data between
+   * ReviewDb and NoteDb inconsistent, but in the context of this test class we only care about refs
+   * and hence this is not an issue. Once groups are no longer in ReviewDb and {@link
+   * AbstractDaemonTest#resetProjects} takes care to reset group branches we no longer need this
+   * method.
+   */
+  private ProjectResetter resetGroups() throws IOException {
+    return projectResetter
+        .builder()
+        .build(
+            new ProjectResetter.Config()
+                .reset(allUsers, RefNames.REFS_GROUPS + "*", RefNames.REFS_GROUPNAMES));
+  }
+}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SshPushForReviewIT.java b/javatests/com/google/gerrit/acceptance/git/SshPushForReviewIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SshPushForReviewIT.java
rename to javatests/com/google/gerrit/acceptance/git/SshPushForReviewIT.java
diff --git a/javatests/com/google/gerrit/acceptance/git/SubmitOnPushIT.java b/javatests/com/google/gerrit/acceptance/git/SubmitOnPushIT.java
new file mode 100644
index 0000000..700b18b
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/git/SubmitOnPushIT.java
@@ -0,0 +1,367 @@
+// Copyright (C) 2013 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.google.gerrit.acceptance.git;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.acceptance.GitUtil.assertPushOk;
+import static com.google.gerrit.acceptance.GitUtil.pushHead;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.collect.Iterables;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.inject.Inject;
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.api.errors.InvalidRemoteException;
+import org.eclipse.jgit.api.errors.TransportException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.RefSpec;
+import org.eclipse.jgit.transport.RemoteRefUpdate;
+import org.junit.Test;
+
+@NoHttpd
+public class SubmitOnPushIT extends AbstractDaemonTest {
+  @Inject private ApprovalsUtil approvalsUtil;
+
+  @Test
+  public void submitOnPush() throws Exception {
+    grant(project, "refs/for/refs/heads/master", Permission.SUBMIT);
+    PushOneCommit.Result r = pushTo("refs/for/master%submit");
+    r.assertOkStatus();
+    r.assertChange(Change.Status.MERGED, null, admin);
+    assertSubmitApproval(r.getPatchSetId());
+    assertCommit(project, "refs/heads/master");
+  }
+
+  @Test
+  public void submitOnPushToRefsMetaConfig() throws Exception {
+    grant(project, "refs/for/refs/meta/config", Permission.SUBMIT);
+
+    git().fetch().setRefSpecs(new RefSpec("refs/meta/config:refs/meta/config")).call();
+    testRepo.reset(RefNames.REFS_CONFIG);
+
+    PushOneCommit.Result r = pushTo("refs/for/refs/meta/config%submit");
+    r.assertOkStatus();
+    r.assertChange(Change.Status.MERGED, null, admin);
+    assertSubmitApproval(r.getPatchSetId());
+    assertCommit(project, RefNames.REFS_CONFIG);
+  }
+
+  @Test
+  public void submitOnPushMergeConflict() throws Exception {
+    ObjectId objectId = repo().exactRef("HEAD").getObjectId();
+    push("refs/heads/master", "one change", "a.txt", "some content");
+    testRepo.reset(objectId);
+
+    grant(project, "refs/for/refs/heads/master", Permission.SUBMIT);
+    PushOneCommit.Result r =
+        push("refs/for/master%submit", "other change", "a.txt", "other content");
+    r.assertErrorStatus();
+    r.assertChange(Change.Status.NEW, null);
+    r.assertMessage(
+        "Change " + r.getChange().getId() + ": change could not be merged due to a path conflict.");
+  }
+
+  @Test
+  public void submitOnPushSuccessfulMerge() throws Exception {
+    String master = "refs/heads/master";
+    ObjectId objectId = repo().exactRef("HEAD").getObjectId();
+    push(master, "one change", "a.txt", "some content");
+    testRepo.reset(objectId);
+
+    grant(project, "refs/for/refs/heads/master", Permission.SUBMIT);
+    PushOneCommit.Result r =
+        push("refs/for/master%submit", "other change", "b.txt", "other content");
+    r.assertOkStatus();
+    r.assertChange(Change.Status.MERGED, null, admin);
+    assertMergeCommit(master, "other change");
+  }
+
+  @Test
+  public void submitOnPushNewPatchSet() throws Exception {
+    PushOneCommit.Result r =
+        push("refs/for/master", PushOneCommit.SUBJECT, "a.txt", "some content");
+
+    grant(project, "refs/for/refs/heads/master", Permission.SUBMIT);
+    r =
+        push(
+            "refs/for/master%submit",
+            PushOneCommit.SUBJECT, "a.txt", "other content", r.getChangeId());
+    r.assertOkStatus();
+    r.assertChange(Change.Status.MERGED, null, admin);
+    ChangeData cd = Iterables.getOnlyElement(queryProvider.get().byKeyPrefix(r.getChangeId()));
+    assertThat(cd.patchSets()).hasSize(2);
+    assertSubmitApproval(r.getPatchSetId());
+    assertCommit(project, "refs/heads/master");
+  }
+
+  @Test
+  public void submitOnPushNotAllowed_Error() throws Exception {
+    PushOneCommit.Result r = pushTo("refs/for/master%submit");
+    r.assertErrorStatus("not permitted: update by submit");
+  }
+
+  @Test
+  public void submitOnPushNewPatchSetNotAllowed_Error() throws Exception {
+    PushOneCommit.Result r =
+        push("refs/for/master", PushOneCommit.SUBJECT, "a.txt", "some content");
+
+    r =
+        push(
+            "refs/for/master%submit",
+            PushOneCommit.SUBJECT, "a.txt", "other content", r.getChangeId());
+    r.assertErrorStatus("not permitted: update by submit ");
+  }
+
+  @Test
+  public void submitOnPushToNonExistingBranch_Error() throws Exception {
+    String branchName = "non-existing";
+    PushOneCommit.Result r = pushTo("refs/for/" + branchName + "%submit");
+    r.assertErrorStatus("branch " + branchName + " not found");
+  }
+
+  @Test
+  public void mergeOnPushToBranch() throws Exception {
+    grant(project, "refs/heads/master", Permission.PUSH);
+    PushOneCommit.Result r =
+        push("refs/for/master", PushOneCommit.SUBJECT, "a.txt", "some content");
+    r.assertOkStatus();
+
+    git().push().setRefSpecs(new RefSpec(r.getCommit().name() + ":refs/heads/master")).call();
+    assertCommit(project, "refs/heads/master");
+
+    ChangeData cd =
+        Iterables.getOnlyElement(queryProvider.get().byKey(new Change.Key(r.getChangeId())));
+    RevCommit c = r.getCommit();
+    PatchSet.Id psId = cd.currentPatchSet().getId();
+    assertThat(psId.get()).isEqualTo(1);
+    assertThat(cd.change().getStatus()).isEqualTo(Change.Status.MERGED);
+    assertSubmitApproval(psId);
+
+    assertThat(cd.patchSets()).hasSize(1);
+    assertThat(cd.patchSet(psId).getRevision().get()).isEqualTo(c.name());
+  }
+
+  @Test
+  public void mergeOnPushToBranchWithChangeMergedInOther() throws Exception {
+    enableCreateNewChangeForAllNotInTarget();
+    String master = "refs/heads/master";
+    String other = "refs/heads/other";
+    grant(project, master, Permission.PUSH);
+    grant(project, other, Permission.CREATE);
+    grant(project, other, Permission.PUSH);
+    RevCommit masterRev = getRemoteHead();
+    pushCommitTo(masterRev, other);
+    PushOneCommit.Result r = createChange();
+    r.assertOkStatus();
+    RevCommit commit = r.getCommit();
+    pushCommitTo(commit, master);
+    assertCommit(project, master);
+    ChangeData cd =
+        Iterables.getOnlyElement(queryProvider.get().byKey(new Change.Key(r.getChangeId())));
+    assertThat(cd.change().getStatus()).isEqualTo(Change.Status.MERGED);
+
+    RemoteRefUpdate.Status status = pushCommitTo(commit, "refs/for/other");
+    assertThat(status).isEqualTo(RemoteRefUpdate.Status.OK);
+
+    pushCommitTo(commit, other);
+    assertCommit(project, other);
+
+    for (ChangeData c : queryProvider.get().byKey(new Change.Key(r.getChangeId()))) {
+      if (c.change().getDest().get().equals(other)) {
+        assertThat(c.change().getStatus()).isEqualTo(Change.Status.MERGED);
+      }
+    }
+  }
+
+  private RemoteRefUpdate.Status pushCommitTo(RevCommit commit, String ref)
+      throws GitAPIException, InvalidRemoteException, TransportException {
+    return Iterables.getOnlyElement(
+            git().push().setRefSpecs(new RefSpec(commit.name() + ":" + ref)).call())
+        .getRemoteUpdate(ref)
+        .getStatus();
+  }
+
+  @Test
+  public void mergeOnPushToBranchWithNewPatchset() throws Exception {
+    grant(project, "refs/heads/master", Permission.PUSH);
+    PushOneCommit.Result r = pushTo("refs/for/master");
+    r.assertOkStatus();
+    RevCommit c1 = r.getCommit();
+    PatchSet.Id psId1 = r.getPatchSetId();
+    assertThat(psId1.get()).isEqualTo(1);
+
+    PushOneCommit push =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            testRepo,
+            PushOneCommit.SUBJECT,
+            "b.txt",
+            "anotherContent",
+            r.getChangeId());
+
+    r = push.to("refs/heads/master");
+    r.assertOkStatus();
+
+    ChangeData cd = r.getChange();
+    RevCommit c2 = r.getCommit();
+    assertThat(cd.change().getStatus()).isEqualTo(Change.Status.MERGED);
+    PatchSet.Id psId2 = cd.change().currentPatchSetId();
+    assertThat(psId2.get()).isEqualTo(2);
+    assertCommit(project, "refs/heads/master");
+    assertSubmitApproval(psId2);
+
+    assertThat(cd.patchSets()).hasSize(2);
+    assertThat(cd.patchSet(psId1).getRevision().get()).isEqualTo(c1.name());
+    assertThat(cd.patchSet(psId2).getRevision().get()).isEqualTo(c2.name());
+  }
+
+  @Test
+  public void mergeOnPushToBranchWithOldPatchset() throws Exception {
+    grant(project, "refs/heads/master", Permission.PUSH);
+    PushOneCommit.Result r = pushTo("refs/for/master");
+    r.assertOkStatus();
+    RevCommit c1 = r.getCommit();
+    PatchSet.Id psId1 = r.getPatchSetId();
+    String changeId = r.getChangeId();
+    assertThat(psId1.get()).isEqualTo(1);
+
+    r = amendChange(changeId);
+    ChangeData cd = r.getChange();
+    PatchSet.Id psId2 = cd.change().currentPatchSetId();
+    assertThat(psId2.getParentKey()).isEqualTo(psId1.getParentKey());
+    assertThat(psId2.get()).isEqualTo(2);
+
+    testRepo.reset(c1);
+    assertPushOk(pushHead(testRepo, "refs/heads/master", false), "refs/heads/master");
+
+    cd = changeDataFactory.create(db, project, psId1.getParentKey());
+    Change c = cd.change();
+    assertThat(c.getStatus()).isEqualTo(Change.Status.MERGED);
+    assertThat(c.currentPatchSetId()).isEqualTo(psId1);
+    assertThat(cd.patchSets().stream().map(PatchSet::getId).collect(toList()))
+        .containsExactly(psId1, psId2);
+  }
+
+  @Test
+  public void mergeMultipleOnPushToBranchWithNewPatchset() throws Exception {
+    grant(project, "refs/heads/master", Permission.PUSH);
+
+    // Create 2 changes.
+    ObjectId initialHead = getRemoteHead();
+    PushOneCommit.Result r1 = createChange("Change 1", "a", "a");
+    r1.assertOkStatus();
+    PushOneCommit.Result r2 = createChange("Change 2", "b", "b");
+    r2.assertOkStatus();
+
+    RevCommit c1_1 = r1.getCommit();
+    RevCommit c2_1 = r2.getCommit();
+    PatchSet.Id psId1_1 = r1.getPatchSetId();
+    PatchSet.Id psId2_1 = r2.getPatchSetId();
+    assertThat(c1_1.getParent(0)).isEqualTo(initialHead);
+    assertThat(c2_1.getParent(0)).isEqualTo(c1_1);
+
+    // Amend both changes.
+    testRepo.reset(initialHead);
+    RevCommit c1_2 =
+        testRepo
+            .branch("HEAD")
+            .commit()
+            .message(c1_1.getShortMessage() + "v2")
+            .insertChangeId(r1.getChangeId().substring(1))
+            .create();
+    RevCommit c2_2 = testRepo.cherryPick(c2_1);
+
+    // Push directly to branch.
+    assertPushOk(pushHead(testRepo, "refs/heads/master", false), "refs/heads/master");
+
+    ChangeData cd2 = r2.getChange();
+    assertThat(cd2.change().getStatus()).isEqualTo(Change.Status.MERGED);
+    PatchSet.Id psId2_2 = cd2.change().currentPatchSetId();
+    assertThat(psId2_2.get()).isEqualTo(2);
+    assertThat(cd2.patchSet(psId2_1).getRevision().get()).isEqualTo(c2_1.name());
+    assertThat(cd2.patchSet(psId2_2).getRevision().get()).isEqualTo(c2_2.name());
+
+    ChangeData cd1 = r1.getChange();
+    assertThat(cd1.change().getStatus()).isEqualTo(Change.Status.MERGED);
+    PatchSet.Id psId1_2 = cd1.change().currentPatchSetId();
+    assertThat(psId1_2.get()).isEqualTo(2);
+    assertThat(cd1.patchSet(psId1_1).getRevision().get()).isEqualTo(c1_1.name());
+    assertThat(cd1.patchSet(psId1_2).getRevision().get()).isEqualTo(c1_2.name());
+  }
+
+  private PatchSetApproval getSubmitter(PatchSet.Id patchSetId) throws Exception {
+    ChangeNotes notes = notesFactory.createChecked(db, project, patchSetId.getParentKey()).load();
+    return approvalsUtil.getSubmitter(db, notes, patchSetId);
+  }
+
+  private void assertSubmitApproval(PatchSet.Id patchSetId) throws Exception {
+    PatchSetApproval a = getSubmitter(patchSetId);
+    assertThat(a.isLegacySubmit()).isTrue();
+    assertThat(a.getValue()).isEqualTo((short) 1);
+    assertThat(a.getAccountId()).isEqualTo(admin.id);
+  }
+
+  private void assertCommit(Project.NameKey project, String branch) throws Exception {
+    try (Repository r = repoManager.openRepository(project);
+        RevWalk rw = new RevWalk(r)) {
+      RevCommit c = rw.parseCommit(r.exactRef(branch).getObjectId());
+      assertThat(c.getShortMessage()).isEqualTo(PushOneCommit.SUBJECT);
+      assertThat(c.getAuthorIdent().getEmailAddress()).isEqualTo(admin.email);
+      assertThat(c.getCommitterIdent().getEmailAddress()).isEqualTo(admin.email);
+    }
+  }
+
+  private void assertMergeCommit(String branch, String subject) throws Exception {
+    try (Repository r = repoManager.openRepository(project);
+        RevWalk rw = new RevWalk(r)) {
+      RevCommit c = rw.parseCommit(r.exactRef(branch).getObjectId());
+      assertThat(c.getParentCount()).isEqualTo(2);
+      assertThat(c.getShortMessage()).isEqualTo("Merge \"" + subject + "\"");
+      assertThat(c.getAuthorIdent().getEmailAddress()).isEqualTo(admin.email);
+      assertThat(c.getCommitterIdent().getEmailAddress())
+          .isEqualTo(serverIdent.get().getEmailAddress());
+    }
+  }
+
+  private PushOneCommit.Result push(String ref, String subject, String fileName, String content)
+      throws Exception {
+    PushOneCommit push =
+        pushFactory.create(db, admin.getIdent(), testRepo, subject, fileName, content);
+    return push.to(ref);
+  }
+
+  private PushOneCommit.Result push(
+      String ref, String subject, String fileName, String content, String changeId)
+      throws Exception {
+    PushOneCommit push =
+        pushFactory.create(db, admin.getIdent(), testRepo, subject, fileName, content, changeId);
+    return push.to(ref);
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsIT.java b/javatests/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsIT.java
new file mode 100644
index 0000000..03b1165
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsIT.java
@@ -0,0 +1,741 @@
+// Copyright (C) 2015 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.google.gerrit.acceptance.git;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static java.util.concurrent.TimeUnit.SECONDS;
+
+import com.google.common.collect.Iterables;
+import com.google.gerrit.acceptance.GerritConfig;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.gerrit.testing.TestTimeUtil;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.PushResult;
+import org.eclipse.jgit.transport.RefSpec;
+import org.eclipse.jgit.transport.RemoteRefUpdate;
+import org.junit.Test;
+
+@NoHttpd
+public class SubmoduleSubscriptionsIT extends AbstractSubmoduleSubscription {
+  @ConfigSuite.Config
+  public static Config submitWholeTopicEnabled() {
+    return submitWholeTopicEnabledConfig();
+  }
+
+  @Test
+  @GerritConfig(name = "submodule.enableSuperProjectSubscriptions", value = "false")
+  public void testSubscriptionWithoutGlobalServerSetting() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
+    allowMatchingSubmoduleSubscription(
+        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
+
+    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
+    pushChangeTo(subRepo, "master");
+    assertThat(hasSubmodule(superRepo, "master", "subscribed-to-project")).isFalse();
+  }
+
+  @Test
+  public void subscriptionWithoutSpecificSubscription() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
+
+    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
+    pushChangeTo(subRepo, "master");
+    assertThat(hasSubmodule(superRepo, "master", "subscribed-to-project")).isFalse();
+  }
+
+  @Test
+  public void subscriptionToEmptyRepo() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
+    allowMatchingSubmoduleSubscription(
+        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
+
+    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
+    pushChangeTo(subRepo, "master");
+    ObjectId subHEAD = pushChangeTo(subRepo, "master");
+    assertThat(hasSubmodule(superRepo, "master", "subscribed-to-project")).isTrue();
+    expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subHEAD);
+  }
+
+  @Test
+  public void subscriptionToExistingRepo() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
+    allowMatchingSubmoduleSubscription(
+        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
+
+    pushChangeTo(subRepo, "master");
+    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
+    ObjectId subHEAD = pushChangeTo(subRepo, "master");
+    assertThat(hasSubmodule(superRepo, "master", "subscribed-to-project")).isTrue();
+    expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subHEAD);
+  }
+
+  @Test
+  public void subscriptionWildcardACLForSingleBranch() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
+    // master is allowed to be subscribed to master branch only:
+    allowMatchingSubmoduleSubscription(
+        "subscribed-to-project", "refs/heads/master", "super-project", null);
+    // create 'branch':
+    pushChangeTo(superRepo, "branch");
+
+    pushChangeTo(subRepo, "master");
+    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
+    createSubmoduleSubscription(superRepo, "branch", "subscribed-to-project", "master");
+
+    ObjectId subHEAD = pushChangeTo(subRepo, "master");
+
+    expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subHEAD);
+    assertThat(hasSubmodule(superRepo, "branch", "subscribed-to-project")).isFalse();
+  }
+
+  @Test
+  public void subscriptionWildcardACLForMissingProject() throws Exception {
+    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
+    allowMatchingSubmoduleSubscription(
+        "subscribed-to-project", "refs/heads/*", "not-existing-super-project", "refs/heads/*");
+    pushChangeTo(subRepo, "master");
+  }
+
+  @Test
+  public void subscriptionWildcardACLForMissingBranch() throws Exception {
+    createProjectWithPush("super-project");
+    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
+    allowMatchingSubmoduleSubscription(
+        "subscribed-to-project", "refs/heads/*", "super-project", "refs/heads/*");
+    pushChangeTo(subRepo, "foo");
+  }
+
+  @Test
+  public void subscriptionWildcardACLForMissingGitmodules() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
+    allowMatchingSubmoduleSubscription(
+        "subscribed-to-project", "refs/heads/*", "super-project", "refs/heads/*");
+    pushChangeTo(superRepo, "master");
+    pushChangeTo(subRepo, "master");
+  }
+
+  @Test
+  public void subscriptionWildcardACLOneOnOneMapping() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
+    // any branch is allowed to be subscribed to the same superprojects branch:
+    allowMatchingSubmoduleSubscription(
+        "subscribed-to-project", "refs/heads/*", "super-project", "refs/heads/*");
+
+    // create 'branch' in both repos:
+    pushChangeTo(superRepo, "branch");
+    pushChangeTo(subRepo, "branch");
+
+    pushChangeTo(subRepo, "master");
+    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
+    createSubmoduleSubscription(superRepo, "branch", "subscribed-to-project", "branch");
+
+    ObjectId subHEAD1 = pushChangeTo(subRepo, "master");
+    ObjectId subHEAD2 = pushChangeTo(subRepo, "branch");
+
+    expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subHEAD1);
+    expectToHaveSubmoduleState(superRepo, "branch", "subscribed-to-project", subHEAD2);
+
+    // Now test that cross subscriptions do not work:
+    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "branch");
+    ObjectId subHEAD3 = pushChangeTo(subRepo, "branch");
+
+    expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subHEAD1);
+    expectToHaveSubmoduleState(superRepo, "branch", "subscribed-to-project", subHEAD3);
+  }
+
+  @Test
+  public void subscriptionWildcardACLForManyBranches() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
+
+    // Any branch is allowed to be subscribed to any superproject branch:
+    allowSubmoduleSubscription(
+        "subscribed-to-project", "refs/heads/*", "super-project", null, false);
+    pushChangeTo(superRepo, "branch");
+    pushChangeTo(subRepo, "another-branch");
+    createSubmoduleSubscription(superRepo, "branch", "subscribed-to-project", "another-branch");
+    ObjectId subHEAD = pushChangeTo(subRepo, "another-branch");
+    expectToHaveSubmoduleState(superRepo, "branch", "subscribed-to-project", subHEAD);
+  }
+
+  @Test
+  public void subscriptionWildcardACLOneToManyBranches() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
+
+    // Any branch is allowed to be subscribed to any superproject branch:
+    allowSubmoduleSubscription(
+        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/*", false);
+    pushChangeTo(superRepo, "branch");
+    createSubmoduleSubscription(superRepo, "branch", "subscribed-to-project", "master");
+    ObjectId subHEAD = pushChangeTo(subRepo, "master");
+    expectToHaveSubmoduleState(superRepo, "branch", "subscribed-to-project", subHEAD);
+
+    createSubmoduleSubscription(superRepo, "branch", "subscribed-to-project", "branch");
+    pushChangeTo(subRepo, "branch");
+
+    // no change expected, as only master is subscribed:
+    expectToHaveSubmoduleState(superRepo, "branch", "subscribed-to-project", subHEAD);
+  }
+
+  @Test
+  @GerritConfig(name = "submodule.verboseSuperprojectUpdate", value = "false")
+  public void testSubmoduleShortCommitMessage() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
+    allowMatchingSubmoduleSubscription(
+        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
+
+    pushChangeTo(subRepo, "master");
+    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
+
+    // The first update doesn't include any commit messages
+    ObjectId subRepoId = pushChangeTo(subRepo, "master");
+    expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subRepoId);
+    expectToHaveCommitMessage(superRepo, "master", "Update git submodules\n\n");
+
+    // Any following update also has a short message
+    subRepoId = pushChangeTo(subRepo, "master");
+    expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subRepoId);
+    expectToHaveCommitMessage(superRepo, "master", "Update git submodules\n\n");
+  }
+
+  @Test
+  @GerritConfig(name = "submodule.verboseSuperprojectUpdate", value = "SUBJECT_ONLY")
+  public void testSubmoduleSubjectCommitMessage() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
+    allowMatchingSubmoduleSubscription(
+        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
+
+    pushChangeTo(subRepo, "master");
+    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
+    ObjectId subHEAD = pushChangeTo(subRepo, "master");
+
+    // The first update doesn't include the rev log
+    RevWalk rw = subRepo.getRevWalk();
+    expectToHaveCommitMessage(
+        superRepo,
+        "master",
+        "Update git submodules\n\n"
+            + "* Update "
+            + name("subscribed-to-project")
+            + " from branch 'master'\n  to "
+            + subHEAD.getName());
+
+    // The next commit should generate only its commit message,
+    // omitting previous commit logs
+    subHEAD = pushChangeTo(subRepo, "master");
+    RevCommit subCommitMsg = rw.parseCommit(subHEAD);
+    expectToHaveCommitMessage(
+        superRepo,
+        "master",
+        "Update git submodules\n\n"
+            + "* Update "
+            + name("subscribed-to-project")
+            + " from branch 'master'\n  to "
+            + subHEAD.getName()
+            + "\n  - "
+            + subCommitMsg.getShortMessage());
+  }
+
+  @Test
+  public void submoduleCommitMessage() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
+    allowMatchingSubmoduleSubscription(
+        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
+
+    pushChangeTo(subRepo, "master");
+    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
+    ObjectId subHEAD = pushChangeTo(subRepo, "master");
+
+    // The first update doesn't include the rev log
+    RevWalk rw = subRepo.getRevWalk();
+    expectToHaveCommitMessage(
+        superRepo,
+        "master",
+        "Update git submodules\n\n"
+            + "* Update "
+            + name("subscribed-to-project")
+            + " from branch 'master'\n  to "
+            + subHEAD.getName());
+
+    // The next commit should generate only its commit message,
+    // omitting previous commit logs
+    subHEAD = pushChangeTo(subRepo, "master");
+    RevCommit subCommitMsg = rw.parseCommit(subHEAD);
+    expectToHaveCommitMessage(
+        superRepo,
+        "master",
+        "Update git submodules\n\n"
+            + "* Update "
+            + name("subscribed-to-project")
+            + " from branch 'master'\n  to "
+            + subHEAD.getName()
+            + "\n  - "
+            + subCommitMsg.getFullMessage().replace("\n", "\n    "));
+  }
+
+  @Test
+  public void subscriptionUnsubscribe() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
+    allowMatchingSubmoduleSubscription(
+        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
+
+    pushChangeTo(subRepo, "master");
+    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
+
+    pushChangeTo(subRepo, "master");
+    ObjectId subHEADbeforeUnsubscribing = pushChangeTo(subRepo, "master");
+
+    deleteAllSubscriptions(superRepo, "master");
+    expectToHaveSubmoduleState(
+        superRepo, "master", "subscribed-to-project", subHEADbeforeUnsubscribing);
+
+    pushChangeTo(superRepo, "refs/heads/master", "commit after unsubscribe", "");
+    pushChangeTo(subRepo, "refs/heads/master", "commit after unsubscribe", "");
+    expectToHaveSubmoduleState(
+        superRepo, "master", "subscribed-to-project", subHEADbeforeUnsubscribing);
+  }
+
+  @Test
+  public void subscriptionUnsubscribeByDeletingGitModules() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
+    allowMatchingSubmoduleSubscription(
+        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
+
+    pushChangeTo(subRepo, "master");
+    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
+
+    pushChangeTo(subRepo, "master");
+    ObjectId subHEADbeforeUnsubscribing = pushChangeTo(subRepo, "master");
+
+    deleteGitModulesFile(superRepo, "master");
+    expectToHaveSubmoduleState(
+        superRepo, "master", "subscribed-to-project", subHEADbeforeUnsubscribing);
+
+    pushChangeTo(superRepo, "refs/heads/master", "commit after unsubscribe", "");
+    pushChangeTo(subRepo, "refs/heads/master", "commit after unsubscribe", "");
+    expectToHaveSubmoduleState(
+        superRepo, "master", "subscribed-to-project", subHEADbeforeUnsubscribing);
+  }
+
+  @Test
+  public void subscriptionToDifferentBranches() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
+    allowMatchingSubmoduleSubscription(
+        "subscribed-to-project", "refs/heads/foo", "super-project", "refs/heads/master");
+
+    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "foo");
+    ObjectId subFoo = pushChangeTo(subRepo, "foo");
+    pushChangeTo(subRepo, "master");
+
+    expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subFoo);
+  }
+
+  @Test
+  public void branchCircularSubscription() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
+    allowMatchingSubmoduleSubscription(
+        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
+    allowMatchingSubmoduleSubscription(
+        "super-project", "refs/heads/master", "subscribed-to-project", "refs/heads/master");
+
+    pushChangeTo(subRepo, "master");
+    pushChangeTo(superRepo, "master");
+    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
+    createSubmoduleSubscription(subRepo, "master", "super-project", "master");
+
+    pushChangeTo(subRepo, "master");
+    pushChangeTo(superRepo, "master");
+
+    assertThat(hasSubmodule(subRepo, "master", "super-project")).isFalse();
+    assertThat(hasSubmodule(superRepo, "master", "subscribed-to-project")).isFalse();
+  }
+
+  @Test
+  public void projectCircularSubscription() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
+
+    allowMatchingSubmoduleSubscription(
+        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
+    allowMatchingSubmoduleSubscription(
+        "super-project", "refs/heads/dev", "subscribed-to-project", "refs/heads/dev");
+
+    pushChangeTo(subRepo, "master");
+    pushChangeTo(superRepo, "master");
+    pushChangeTo(subRepo, "dev");
+    pushChangeTo(superRepo, "dev");
+
+    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
+    createSubmoduleSubscription(subRepo, "dev", "super-project", "dev");
+
+    ObjectId subMasterHead = pushChangeTo(subRepo, "master");
+    ObjectId superDevHead = pushChangeTo(superRepo, "dev");
+
+    assertThat(hasSubmodule(superRepo, "master", "subscribed-to-project")).isTrue();
+    assertThat(hasSubmodule(subRepo, "dev", "super-project")).isTrue();
+    expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subMasterHead);
+    expectToHaveSubmoduleState(subRepo, "dev", "super-project", superDevHead);
+  }
+
+  @Test
+  public void subscriptionFailOnMissingACL() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
+
+    pushChangeTo(subRepo, "master");
+    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
+    pushChangeTo(subRepo, "master");
+    assertThat(hasSubmodule(superRepo, "master", "subscribed-to-project")).isFalse();
+  }
+
+  @Test
+  public void subscriptionFailOnWrongProjectACL() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
+    allowMatchingSubmoduleSubscription(
+        "subscribed-to-project", "refs/heads/master", "wrong-super-project", "refs/heads/master");
+
+    pushChangeTo(subRepo, "master");
+    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
+    pushChangeTo(subRepo, "master");
+    assertThat(hasSubmodule(superRepo, "master", "subscribed-to-project")).isFalse();
+  }
+
+  @Test
+  public void subscriptionFailOnWrongBranchACL() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
+    allowMatchingSubmoduleSubscription(
+        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/wrong-branch");
+
+    pushChangeTo(subRepo, "master");
+    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
+    pushChangeTo(subRepo, "master");
+    assertThat(hasSubmodule(superRepo, "master", "subscribed-to-project")).isFalse();
+  }
+
+  @Test
+  public void subscriptionInheritACL() throws Exception {
+    createProjectWithPush("config-repo");
+    createProjectWithPush("config-repo2", new Project.NameKey(name("config-repo")));
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> subRepo =
+        createProjectWithPush("subscribed-to-project", new Project.NameKey(name("config-repo2")));
+    allowMatchingSubmoduleSubscription(
+        "config-repo", "refs/heads/*", "super-project", "refs/heads/*");
+
+    pushChangeTo(subRepo, "master");
+    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
+    ObjectId subHEAD = pushChangeTo(subRepo, "master");
+    expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subHEAD);
+  }
+
+  @Test
+  public void allowedButNotSubscribed() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
+    allowMatchingSubmoduleSubscription(
+        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
+
+    pushChangeTo(subRepo, "master");
+    subRepo
+        .branch("HEAD")
+        .commit()
+        .insertChangeId()
+        .message("some change")
+        .add("b.txt", "b contents for testing")
+        .create();
+    String refspec = "HEAD:refs/heads/master";
+    PushResult r =
+        Iterables.getOnlyElement(
+            subRepo.git().push().setRemote("origin").setRefSpecs(new RefSpec(refspec)).call());
+    assertThat(r.getMessages()).doesNotContain("error");
+    assertThat(r.getRemoteUpdate("refs/heads/master").getStatus())
+        .isEqualTo(RemoteRefUpdate.Status.OK);
+
+    assertThat(hasSubmodule(superRepo, "master", "subscribed-to-project")).isFalse();
+  }
+
+  @Test
+  public void subscriptionDeepRelative() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> subRepo = createProjectWithPush("nested/subscribed-to-project");
+    // master is allowed to be subscribed to any superprojects branch:
+    allowMatchingSubmoduleSubscription(
+        "nested/subscribed-to-project", "refs/heads/master", "super-project", null);
+
+    pushChangeTo(subRepo, "master");
+    createRelativeSubmoduleSubscription(
+        superRepo, "master", "../", "nested/subscribed-to-project", "master");
+
+    ObjectId subHEAD = pushChangeTo(subRepo, "master");
+
+    expectToHaveSubmoduleState(superRepo, "master", "nested/subscribed-to-project", subHEAD);
+  }
+
+  @Test
+  @GerritConfig(name = "submodule.verboseSuperprojectUpdate", value = "SUBJECT_ONLY")
+  @GerritConfig(name = "submodule.maxCommitMessages", value = "1")
+  public void submoduleSubjectCommitMessageCountLimit() throws Exception {
+    testSubmoduleSubjectCommitMessageAndExpectTruncation();
+  }
+
+  @Test
+  @GerritConfig(name = "submodule.verboseSuperprojectUpdate", value = "SUBJECT_ONLY")
+  @GerritConfig(name = "submodule.maxCombinedCommitMessageSize", value = "220")
+  public void submoduleSubjectCommitMessageSizeLimit() throws Exception {
+    assume().that(isSubmitWholeTopicEnabled()).isFalse();
+    testSubmoduleSubjectCommitMessageAndExpectTruncation();
+  }
+
+  @Test
+  public void superRepoCommitHasSameAuthorAsSubmoduleCommit() throws Exception {
+    // Make sure that the commit is created at an earlier timestamp than the submit timestamp.
+    TestTimeUtil.resetWithClockStep(1, SECONDS);
+    try {
+      TestRepository<?> superRepo = createProjectWithPush("super-project");
+      TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
+      allowMatchingSubmoduleSubscription(
+          "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
+      createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
+
+      PushOneCommit.Result pushResult =
+          createChange(subRepo, "refs/heads/master", "Change", "a.txt", "some content", null);
+      approve(pushResult.getChangeId());
+      gApi.changes().id(pushResult.getChangeId()).current().submit();
+
+      // Expect that the author name/email is preserved for the superRepo commit, but a new author
+      // timestamp is used.
+      PersonIdent authorIdent = getAuthor(superRepo, "master");
+      assertThat(authorIdent.getName()).isEqualTo(admin.fullName);
+      assertThat(authorIdent.getEmailAddress()).isEqualTo(admin.email);
+      assertThat(authorIdent.getWhen())
+          .isGreaterThan(pushResult.getCommit().getAuthorIdent().getWhen());
+    } finally {
+      TestTimeUtil.useSystemTime();
+    }
+  }
+
+  @Test
+  public void superRepoCommitHasSameAuthorAsSubmoduleCommits() throws Exception {
+    assume().that(isSubmitWholeTopicEnabled()).isTrue();
+
+    // Make sure that the commits are created at different timestamps and that the submit timestamp
+    // is afterwards.
+    TestTimeUtil.resetWithClockStep(1, SECONDS);
+    try {
+      TestRepository<?> superRepo = createProjectWithPush("super-project");
+      TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
+      TestRepository<?> subRepo2 = createProjectWithPush("subscribed-to-project-2");
+
+      allowMatchingSubmoduleSubscription(
+          "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
+      allowMatchingSubmoduleSubscription(
+          "subscribed-to-project-2", "refs/heads/master", "super-project", "refs/heads/master");
+
+      Config config = new Config();
+      prepareSubmoduleConfigEntry(config, "subscribed-to-project", "master");
+      prepareSubmoduleConfigEntry(config, "subscribed-to-project-2", "master");
+      pushSubmoduleConfig(superRepo, "master", config);
+
+      String topic = "foo";
+
+      PushOneCommit.Result pushResult1 =
+          createChange(subRepo, "refs/heads/master", "Change 1", "a.txt", "some content", topic);
+      approve(pushResult1.getChangeId());
+
+      PushOneCommit.Result pushResult2 =
+          createChange(subRepo2, "refs/heads/master", "Change 2", "b.txt", "other content", topic);
+      approve(pushResult2.getChangeId());
+
+      // Submit the topic, 2 changes with the same author.
+      gApi.changes().id(pushResult1.getChangeId()).current().submit();
+
+      // Expect that the author name/email is preserved for the superRepo commit, but a new author
+      // timestamp is used.
+      PersonIdent authorIdent = getAuthor(superRepo, "master");
+      assertThat(authorIdent.getName()).isEqualTo(admin.fullName);
+      assertThat(authorIdent.getEmailAddress()).isEqualTo(admin.email);
+      assertThat(authorIdent.getWhen())
+          .isGreaterThan(pushResult1.getCommit().getAuthorIdent().getWhen());
+      assertThat(authorIdent.getWhen())
+          .isGreaterThan(pushResult2.getCommit().getAuthorIdent().getWhen());
+    } finally {
+      TestTimeUtil.useSystemTime();
+    }
+  }
+
+  @Test
+  public void superRepoCommitHasGerritAsAuthorIfAuthorsOfSubmoduleCommitsDiffer() throws Exception {
+    assume().that(isSubmitWholeTopicEnabled()).isTrue();
+
+    // Make sure that the commits are created at different timestamps and that the submit timestamp
+    // is afterwards.
+    TestTimeUtil.resetWithClockStep(1, SECONDS);
+    try {
+      TestRepository<?> superRepo = createProjectWithPush("super-project");
+      TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
+
+      createProjectWithPush("subscribed-to-project-2");
+      TestRepository<?> subRepo2 =
+          cloneProject(new Project.NameKey(name("subscribed-to-project-2")), user);
+
+      allowMatchingSubmoduleSubscription(
+          "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
+      allowMatchingSubmoduleSubscription(
+          "subscribed-to-project-2", "refs/heads/master", "super-project", "refs/heads/master");
+
+      Config config = new Config();
+      prepareSubmoduleConfigEntry(config, "subscribed-to-project", "master");
+      prepareSubmoduleConfigEntry(config, "subscribed-to-project-2", "master");
+      pushSubmoduleConfig(superRepo, "master", config);
+
+      String topic = "foo";
+
+      // Create change as admin.
+      PushOneCommit.Result pushResult1 =
+          createChange(subRepo, "refs/heads/master", "Change 1", "a.txt", "some content", topic);
+      approve(pushResult1.getChangeId());
+
+      // Create change as user.
+      PushOneCommit push =
+          pushFactory.create(db, user.getIdent(), subRepo2, "Change 2", "b.txt", "other content");
+      PushOneCommit.Result pushResult2 = push.to("refs/for/master/" + name(topic));
+      approve(pushResult2.getChangeId());
+
+      // Submit the topic, 2 changes with the different author.
+      gApi.changes().id(pushResult1.getChangeId()).current().submit();
+
+      // Expect that the Gerrit server identity is chosen as author for the superRepo commit and a
+      // new author timestamp is used.
+      PersonIdent authorIdent = getAuthor(superRepo, "master");
+      assertThat(authorIdent.getName()).isEqualTo(serverIdent.get().getName());
+      assertThat(authorIdent.getEmailAddress()).isEqualTo(serverIdent.get().getEmailAddress());
+      assertThat(authorIdent.getWhen())
+          .isGreaterThan(pushResult1.getCommit().getAuthorIdent().getWhen());
+      assertThat(authorIdent.getWhen())
+          .isGreaterThan(pushResult2.getCommit().getAuthorIdent().getWhen());
+    } finally {
+      TestTimeUtil.useSystemTime();
+    }
+  }
+
+  @Test
+  public void updateOnlyRelevantSubmodules() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> subRepo1 = createProjectWithPush("subscribed-to-project-1");
+    TestRepository<?> subRepo2 = createProjectWithPush("subscribed-to-project-2");
+
+    allowMatchingSubmoduleSubscription(
+        "subscribed-to-project-1", "refs/heads/master", "super-project", "refs/heads/master");
+    allowMatchingSubmoduleSubscription(
+        "subscribed-to-project-2", "refs/heads/master", "super-project", "refs/heads/master");
+
+    Config config = new Config();
+    prepareSubmoduleConfigEntry(config, "subscribed-to-project-1", "master");
+    prepareSubmoduleConfigEntry(config, "subscribed-to-project-2", "master");
+    pushSubmoduleConfig(superRepo, "master", config);
+
+    // Push once to initialize submodules.
+    ObjectId subTip2 = pushChangeTo(subRepo2, "master");
+    ObjectId subTip1 = pushChangeTo(subRepo1, "master");
+
+    expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project-1", subTip1);
+    expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project-2", subTip2);
+
+    directUpdateRef("subscribed-to-project-2", "refs/heads/master");
+    subTip1 = pushChangeTo(subRepo1, "master");
+
+    expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project-1", subTip1);
+    expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project-2", subTip2);
+  }
+
+  @Test
+  public void skipUpdatingBrokenGitlinkPointer() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
+
+    allowMatchingSubmoduleSubscription(
+        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
+    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
+
+    // Push once to initialize submodule.
+    ObjectId subTip = pushChangeTo(subRepo, "master");
+    expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subTip);
+
+    // Write an invalid SHA-1 directly to the gitlink.
+    ObjectId badId = ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef");
+    directUpdateSubmodule("super-project", "refs/heads/master", "subscribed-to-project", badId);
+    expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", badId);
+
+    // Push succeeds, but gitlink update is skipped.
+    pushChangeTo(subRepo, "master");
+    expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", badId);
+  }
+
+  private ObjectId directUpdateRef(String project, String ref) throws Exception {
+    try (Repository serverRepo = repoManager.openRepository(new Project.NameKey(name(project)))) {
+      return new TestRepository<>(serverRepo).branch(ref).commit().create().copy();
+    }
+  }
+
+  private void testSubmoduleSubjectCommitMessageAndExpectTruncation() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
+    allowMatchingSubmoduleSubscription(
+        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
+
+    pushChangeTo(subRepo, "master");
+    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
+    // The first update doesn't include the rev log, so we ignore it
+    pushChangeTo(subRepo, "master");
+
+    // Next, we push two commits at once. Since maxCommitMessages=1, we expect to see only the first
+    // message plus ellipsis to mark truncation.
+    ObjectId subHEAD = pushChangesTo(subRepo, "master", 2);
+    RevCommit subCommitMsg = subRepo.getRevWalk().parseCommit(subHEAD);
+    expectToHaveCommitMessage(
+        superRepo,
+        "master",
+        String.format(
+            "Update git submodules\n\n* Update %s from branch 'master'\n  to %s\n  - %s\n\n[...]",
+            name("subscribed-to-project"), subHEAD.getName(), subCommitMsg.getShortMessage()));
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsWholeTopicMergeIT.java b/javatests/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsWholeTopicMergeIT.java
new file mode 100644
index 0000000..eef3295
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsWholeTopicMergeIT.java
@@ -0,0 +1,899 @@
+// Copyright (C) 2015 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.google.gerrit.acceptance.git;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+import static com.google.common.truth.TruthJUnit.assume;
+import static com.google.gerrit.acceptance.GitUtil.getChangeId;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.client.ChangeStatus;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.change.TestSubmitInput;
+import com.google.gerrit.testing.ConfigSuite;
+import java.util.ArrayDeque;
+import java.util.Map;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.RefSpec;
+import org.junit.Test;
+
+@NoHttpd
+public class SubmoduleSubscriptionsWholeTopicMergeIT extends AbstractSubmoduleSubscription {
+
+  @ConfigSuite.Default
+  public static Config mergeIfNecessary() {
+    return submitByMergeIfNecessary();
+  }
+
+  @ConfigSuite.Config
+  public static Config mergeAlways() {
+    return submitByMergeAlways();
+  }
+
+  @ConfigSuite.Config
+  public static Config cherryPick() {
+    return submitByCherryPickConfig();
+  }
+
+  @ConfigSuite.Config
+  public static Config rebaseAlways() {
+    return submitByRebaseAlwaysConfig();
+  }
+
+  @ConfigSuite.Config
+  public static Config rebaseIfNecessary() {
+    return submitByRebaseIfNecessaryConfig();
+  }
+
+  @Test
+  public void subscriptionUpdateOfManyChanges() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
+    allowMatchingSubmoduleSubscription(
+        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
+
+    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
+
+    ObjectId subHEAD =
+        subRepo
+            .branch("HEAD")
+            .commit()
+            .insertChangeId()
+            .message("some change")
+            .add("a.txt", "a contents ")
+            .create();
+    subRepo
+        .git()
+        .push()
+        .setRemote("origin")
+        .setRefSpecs(new RefSpec("HEAD:refs/heads/master"))
+        .call();
+
+    RevCommit c = subRepo.getRevWalk().parseCommit(subHEAD);
+
+    RevCommit c1 =
+        subRepo
+            .branch("HEAD")
+            .commit()
+            .insertChangeId()
+            .message("first change")
+            .add("asdf", "asdf\n")
+            .create();
+    subRepo
+        .git()
+        .push()
+        .setRemote("origin")
+        .setRefSpecs(new RefSpec("HEAD:refs/for/master/" + name("topic-foo")))
+        .call();
+
+    subRepo.reset(c.getId());
+    RevCommit c2 =
+        subRepo
+            .branch("HEAD")
+            .commit()
+            .insertChangeId()
+            .message("qwerty")
+            .add("qwerty", "qwerty")
+            .create();
+
+    RevCommit c3 =
+        subRepo
+            .branch("HEAD")
+            .commit()
+            .insertChangeId()
+            .message("qwerty followup")
+            .add("qwerty", "qwerty\nqwerty\n")
+            .create();
+    subRepo
+        .git()
+        .push()
+        .setRemote("origin")
+        .setRefSpecs(new RefSpec("HEAD:refs/for/master/" + name("topic-foo")))
+        .call();
+
+    String id1 = getChangeId(subRepo, c1).get();
+    String id2 = getChangeId(subRepo, c2).get();
+    String id3 = getChangeId(subRepo, c3).get();
+    gApi.changes().id(id1).current().review(ReviewInput.approve());
+    gApi.changes().id(id2).current().review(ReviewInput.approve());
+    gApi.changes().id(id3).current().review(ReviewInput.approve());
+
+    Map<Branch.NameKey, ObjectId> preview = fetchFromSubmitPreview(id1);
+    gApi.changes().id(id1).current().submit();
+    ObjectId subRepoId =
+        subRepo
+            .git()
+            .fetch()
+            .setRemote("origin")
+            .call()
+            .getAdvertisedRef("refs/heads/master")
+            .getObjectId();
+
+    expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subRepoId);
+
+    // As the submodules have changed commits, the superproject tree will be
+    // different, so we cannot directly compare the trees here, so make
+    // assumptions only about the changed branches:
+    Project.NameKey p1 = new Project.NameKey(name("super-project"));
+    Project.NameKey p2 = new Project.NameKey(name("subscribed-to-project"));
+    assertThat(preview).containsKey(new Branch.NameKey(p1, "refs/heads/master"));
+    assertThat(preview).containsKey(new Branch.NameKey(p2, "refs/heads/master"));
+
+    if ((getSubmitType() == SubmitType.CHERRY_PICK)
+        || (getSubmitType() == SubmitType.REBASE_ALWAYS)) {
+      // each change is updated and the respective target branch is updated:
+      assertThat(preview).hasSize(5);
+    } else if ((getSubmitType() == SubmitType.REBASE_IF_NECESSARY)) {
+      // Either the first is used first as is, then the second and third need
+      // rebasing, or those two stay as is and the first is rebased.
+      // add in 2 master branches, expect 3 or 4:
+      assertThat(preview.size()).isAnyOf(3, 4);
+    } else {
+      assertThat(preview).hasSize(2);
+    }
+  }
+
+  @Test
+  public void subscriptionUpdateIncludingChangeInSuperproject() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
+    allowMatchingSubmoduleSubscription(
+        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
+
+    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
+
+    ObjectId subHEAD =
+        subRepo
+            .branch("HEAD")
+            .commit()
+            .insertChangeId()
+            .message("some change")
+            .add("a.txt", "a contents ")
+            .create();
+    subRepo
+        .git()
+        .push()
+        .setRemote("origin")
+        .setRefSpecs(new RefSpec("HEAD:refs/heads/master"))
+        .call();
+
+    RevCommit c = subRepo.getRevWalk().parseCommit(subHEAD);
+
+    RevCommit c1 =
+        subRepo
+            .branch("HEAD")
+            .commit()
+            .insertChangeId()
+            .message("first change")
+            .add("asdf", "asdf\n")
+            .create();
+    subRepo
+        .git()
+        .push()
+        .setRemote("origin")
+        .setRefSpecs(new RefSpec("HEAD:refs/for/master/" + name("topic-foo")))
+        .call();
+
+    subRepo.reset(c.getId());
+    RevCommit c2 =
+        subRepo
+            .branch("HEAD")
+            .commit()
+            .insertChangeId()
+            .message("qwerty")
+            .add("qwerty", "qwerty")
+            .create();
+
+    RevCommit c3 =
+        subRepo
+            .branch("HEAD")
+            .commit()
+            .insertChangeId()
+            .message("qwerty followup")
+            .add("qwerty", "qwerty\nqwerty\n")
+            .create();
+    subRepo
+        .git()
+        .push()
+        .setRemote("origin")
+        .setRefSpecs(new RefSpec("HEAD:refs/for/master/" + name("topic-foo")))
+        .call();
+
+    RevCommit c4 =
+        superRepo
+            .branch("HEAD")
+            .commit()
+            .insertChangeId()
+            .message("new change on superproject")
+            .add("foo", "bar")
+            .create();
+    superRepo
+        .git()
+        .push()
+        .setRemote("origin")
+        .setRefSpecs(new RefSpec("HEAD:refs/for/master/" + name("topic-foo")))
+        .call();
+
+    String id1 = getChangeId(subRepo, c1).get();
+    String id2 = getChangeId(subRepo, c2).get();
+    String id3 = getChangeId(subRepo, c3).get();
+    String id4 = getChangeId(superRepo, c4).get();
+    gApi.changes().id(id1).current().review(ReviewInput.approve());
+    gApi.changes().id(id2).current().review(ReviewInput.approve());
+    gApi.changes().id(id3).current().review(ReviewInput.approve());
+    gApi.changes().id(id4).current().review(ReviewInput.approve());
+
+    gApi.changes().id(id1).current().submit();
+    ObjectId subRepoId =
+        subRepo
+            .git()
+            .fetch()
+            .setRemote("origin")
+            .call()
+            .getAdvertisedRef("refs/heads/master")
+            .getObjectId();
+
+    expectToHaveSubmoduleState(superRepo, "master", "subscribed-to-project", subRepoId);
+  }
+
+  @Test
+  public void updateManySubmodules() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> sub1 = createProjectWithPush("sub1");
+    TestRepository<?> sub2 = createProjectWithPush("sub2");
+    TestRepository<?> sub3 = createProjectWithPush("sub3");
+
+    allowMatchingSubmoduleSubscription(
+        "sub1", "refs/heads/master", "super-project", "refs/heads/master");
+    allowMatchingSubmoduleSubscription(
+        "sub2", "refs/heads/master", "super-project", "refs/heads/master");
+    allowMatchingSubmoduleSubscription(
+        "sub3", "refs/heads/master", "super-project", "refs/heads/master");
+
+    Config config = new Config();
+    prepareSubmoduleConfigEntry(config, "sub1", "master");
+    prepareSubmoduleConfigEntry(config, "sub2", "master");
+    prepareSubmoduleConfigEntry(config, "sub3", "master");
+    pushSubmoduleConfig(superRepo, "master", config);
+
+    ObjectId superPreviousId = pushChangeTo(superRepo, "master");
+
+    ObjectId sub1Id = pushChangeTo(sub1, "refs/for/master", "some message", "same-topic");
+    ObjectId sub2Id = pushChangeTo(sub2, "refs/for/master", "some message", "same-topic");
+    ObjectId sub3Id = pushChangeTo(sub3, "refs/for/master", "some message", "same-topic");
+
+    approve(getChangeId(sub1, sub1Id).get());
+    approve(getChangeId(sub2, sub2Id).get());
+    approve(getChangeId(sub3, sub3Id).get());
+
+    gApi.changes().id(getChangeId(sub1, sub1Id).get()).current().submit();
+
+    expectToHaveSubmoduleState(superRepo, "master", "sub1", sub1, "master");
+    expectToHaveSubmoduleState(superRepo, "master", "sub2", sub2, "master");
+    expectToHaveSubmoduleState(superRepo, "master", "sub3", sub3, "master");
+
+    String sub1HEAD =
+        sub1.git()
+            .fetch()
+            .setRemote("origin")
+            .call()
+            .getAdvertisedRef("refs/heads/master")
+            .getObjectId()
+            .name();
+
+    String sub2HEAD =
+        sub2.git()
+            .fetch()
+            .setRemote("origin")
+            .call()
+            .getAdvertisedRef("refs/heads/master")
+            .getObjectId()
+            .name();
+
+    String sub3HEAD =
+        sub3.git()
+            .fetch()
+            .setRemote("origin")
+            .call()
+            .getAdvertisedRef("refs/heads/master")
+            .getObjectId()
+            .name();
+
+    if (getSubmitType() == SubmitType.MERGE_IF_NECESSARY) {
+      expectToHaveCommitMessage(
+          superRepo,
+          "master",
+          "Update git submodules\n\n"
+              + "* Update "
+              + name("sub1")
+              + " from branch 'master'\n  to "
+              + sub1HEAD
+              + "\n\n* Update "
+              + name("sub2")
+              + " from branch 'master'\n  to "
+              + sub2HEAD
+              + "\n\n* Update "
+              + name("sub3")
+              + " from branch 'master'\n  to "
+              + sub3HEAD);
+    }
+
+    superRepo
+        .git()
+        .fetch()
+        .setRemote("origin")
+        .call()
+        .getAdvertisedRef("refs/heads/master")
+        .getObjectId();
+
+    assertWithMessage("submodule subscription update should have made one commit")
+        .that(superRepo.getRepository().resolve("origin/master^"))
+        .isEqualTo(superPreviousId);
+  }
+
+  @Test
+  public void doNotUseFastForward() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project", false);
+    TestRepository<?> sub = createProjectWithPush("sub", false);
+
+    allowMatchingSubmoduleSubscription(
+        "sub", "refs/heads/master", "super-project", "refs/heads/master");
+
+    createSubmoduleSubscription(superRepo, "master", "sub", "master");
+
+    ObjectId subId = pushChangeTo(sub, "refs/for/master", "some message", "same-topic");
+
+    ObjectId superId = pushChangeTo(superRepo, "refs/for/master", "some message", "same-topic");
+
+    String subChangeId = getChangeId(sub, subId).get();
+    approve(subChangeId);
+    approve(getChangeId(superRepo, superId).get());
+
+    gApi.changes().id(subChangeId).current().submit();
+
+    expectToHaveSubmoduleState(superRepo, "master", "sub", sub, "master");
+    RevCommit superHead = getRemoteHead(name("super-project"), "master");
+    assertThat(superHead.getShortMessage()).contains("some message");
+    assertThat(superHead.getId()).isNotEqualTo(superId);
+  }
+
+  @Test
+  public void useFastForwardWhenNoSubmodule() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project", false);
+    TestRepository<?> sub = createProjectWithPush("sub", false);
+
+    ObjectId subId = pushChangeTo(sub, "refs/for/master", "some message", "same-topic");
+
+    ObjectId superId = pushChangeTo(superRepo, "refs/for/master", "some message", "same-topic");
+
+    String subChangeId = getChangeId(sub, subId).get();
+    approve(subChangeId);
+    approve(getChangeId(superRepo, superId).get());
+
+    gApi.changes().id(subChangeId).current().submit();
+
+    RevCommit superHead = getRemoteHead(name("super-project"), "master");
+    assertThat(superHead.getShortMessage()).isEqualTo("some message");
+    assertThat(superHead.getId()).isEqualTo(superId);
+  }
+
+  @Test
+  public void sameProjectSameBranchDifferentPaths() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> sub = createProjectWithPush("sub");
+
+    allowMatchingSubmoduleSubscription(
+        "sub", "refs/heads/master", "super-project", "refs/heads/master");
+
+    Config config = new Config();
+    prepareSubmoduleConfigEntry(config, "sub", "master");
+    prepareSubmoduleConfigEntry(config, "sub", "sub-copy", "master");
+    pushSubmoduleConfig(superRepo, "master", config);
+
+    ObjectId superPreviousId = pushChangeTo(superRepo, "master");
+
+    ObjectId subId = pushChangeTo(sub, "refs/for/master", "some message", "");
+
+    approve(getChangeId(sub, subId).get());
+
+    gApi.changes().id(getChangeId(sub, subId).get()).current().submit();
+
+    expectToHaveSubmoduleState(superRepo, "master", "sub", sub, "master");
+    expectToHaveSubmoduleState(superRepo, "master", "sub-copy", sub, "master");
+
+    superRepo
+        .git()
+        .fetch()
+        .setRemote("origin")
+        .call()
+        .getAdvertisedRef("refs/heads/master")
+        .getObjectId();
+
+    assertWithMessage("submodule subscription update should have made one commit")
+        .that(superRepo.getRepository().resolve("origin/master^"))
+        .isEqualTo(superPreviousId);
+  }
+
+  @Test
+  public void sameProjectDifferentBranchDifferentPaths() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> sub = createProjectWithPush("sub");
+
+    allowMatchingSubmoduleSubscription(
+        "sub", "refs/heads/master", "super-project", "refs/heads/master");
+    allowMatchingSubmoduleSubscription(
+        "sub", "refs/heads/dev", "super-project", "refs/heads/master");
+
+    ObjectId devHead = pushChangeTo(sub, "dev");
+    Config config = new Config();
+    prepareSubmoduleConfigEntry(config, "sub", "sub-master", "master");
+    prepareSubmoduleConfigEntry(config, "sub", "sub-dev", "dev");
+    pushSubmoduleConfig(superRepo, "master", config);
+
+    ObjectId subMasterId =
+        pushChangeTo(sub, "refs/for/master", "some message", "b.txt", "content b", "same-topic");
+
+    sub.reset(devHead);
+    ObjectId subDevId =
+        pushChangeTo(
+            sub, "refs/for/dev", "some message in dev", "b.txt", "content b", "same-topic");
+
+    approve(getChangeId(sub, subMasterId).get());
+    approve(getChangeId(sub, subDevId).get());
+
+    ObjectId superPreviousId = pushChangeTo(superRepo, "master");
+
+    gApi.changes().id(getChangeId(sub, subMasterId).get()).current().submit();
+
+    expectToHaveSubmoduleState(superRepo, "master", "sub-master", sub, "master");
+    expectToHaveSubmoduleState(superRepo, "master", "sub-dev", sub, "dev");
+
+    superRepo
+        .git()
+        .fetch()
+        .setRemote("origin")
+        .call()
+        .getAdvertisedRef("refs/heads/master")
+        .getObjectId();
+
+    assertWithMessage("submodule subscription update should have made one commit")
+        .that(superRepo.getRepository().resolve("origin/master^"))
+        .isEqualTo(superPreviousId);
+  }
+
+  @Test
+  public void nonSubmoduleInSameTopic() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> sub = createProjectWithPush("sub");
+    TestRepository<?> standAlone = createProjectWithPush("standalone");
+
+    allowMatchingSubmoduleSubscription(
+        "sub", "refs/heads/master", "super-project", "refs/heads/master");
+
+    createSubmoduleSubscription(superRepo, "master", "sub", "master");
+
+    ObjectId superPreviousId = pushChangeTo(superRepo, "master");
+
+    ObjectId subId = pushChangeTo(sub, "refs/for/master", "some message", "same-topic");
+    ObjectId standAloneId =
+        pushChangeTo(standAlone, "refs/for/master", "some message", "same-topic");
+
+    String subChangeId = getChangeId(sub, subId).get();
+    String standAloneChangeId = getChangeId(standAlone, standAloneId).get();
+    approve(subChangeId);
+    approve(standAloneChangeId);
+
+    gApi.changes().id(subChangeId).current().submit();
+
+    expectToHaveSubmoduleState(superRepo, "master", "sub", sub, "master");
+
+    ChangeStatus status = gApi.changes().id(standAloneChangeId).info().status;
+    assertThat(status).isEqualTo(ChangeStatus.MERGED);
+
+    superRepo
+        .git()
+        .fetch()
+        .setRemote("origin")
+        .call()
+        .getAdvertisedRef("refs/heads/master")
+        .getObjectId();
+
+    assertWithMessage("submodule subscription update should have made one commit")
+        .that(superRepo.getRepository().resolve("origin/master^"))
+        .isEqualTo(superPreviousId);
+  }
+
+  @Test
+  public void recursiveSubmodules() throws Exception {
+    TestRepository<?> topRepo = createProjectWithPush("top-project");
+    TestRepository<?> midRepo = createProjectWithPush("mid-project");
+    TestRepository<?> bottomRepo = createProjectWithPush("bottom-project");
+
+    allowMatchingSubmoduleSubscription(
+        "mid-project", "refs/heads/master", "top-project", "refs/heads/master");
+    allowMatchingSubmoduleSubscription(
+        "bottom-project", "refs/heads/master", "mid-project", "refs/heads/master");
+
+    createSubmoduleSubscription(topRepo, "master", "mid-project", "master");
+    createSubmoduleSubscription(midRepo, "master", "bottom-project", "master");
+
+    ObjectId bottomHead = pushChangeTo(bottomRepo, "refs/for/master", "some message", "same-topic");
+    ObjectId topHead = pushChangeTo(topRepo, "refs/for/master", "some message", "same-topic");
+
+    String id1 = getChangeId(bottomRepo, bottomHead).get();
+    String id2 = getChangeId(topRepo, topHead).get();
+
+    gApi.changes().id(id1).current().review(ReviewInput.approve());
+    gApi.changes().id(id2).current().review(ReviewInput.approve());
+
+    gApi.changes().id(id1).current().submit();
+
+    expectToHaveSubmoduleState(midRepo, "master", "bottom-project", bottomRepo, "master");
+    expectToHaveSubmoduleState(topRepo, "master", "mid-project", midRepo, "master");
+  }
+
+  @Test
+  public void triangleSubmodules() throws Exception {
+    TestRepository<?> topRepo = createProjectWithPush("top-project");
+    TestRepository<?> midRepo = createProjectWithPush("mid-project");
+    TestRepository<?> bottomRepo = createProjectWithPush("bottom-project");
+
+    allowMatchingSubmoduleSubscription(
+        "mid-project", "refs/heads/master", "top-project", "refs/heads/master");
+    allowMatchingSubmoduleSubscription(
+        "bottom-project", "refs/heads/master", "mid-project", "refs/heads/master");
+    allowMatchingSubmoduleSubscription(
+        "bottom-project", "refs/heads/master", "top-project", "refs/heads/master");
+
+    createSubmoduleSubscription(midRepo, "master", "bottom-project", "master");
+    Config config = new Config();
+    prepareSubmoduleConfigEntry(config, "bottom-project", "master");
+    prepareSubmoduleConfigEntry(config, "mid-project", "master");
+    pushSubmoduleConfig(topRepo, "master", config);
+
+    ObjectId bottomHead = pushChangeTo(bottomRepo, "refs/for/master", "some message", "same-topic");
+    ObjectId topHead = pushChangeTo(topRepo, "refs/for/master", "some message", "same-topic");
+
+    String id1 = getChangeId(bottomRepo, bottomHead).get();
+    String id2 = getChangeId(topRepo, topHead).get();
+
+    gApi.changes().id(id1).current().review(ReviewInput.approve());
+    gApi.changes().id(id2).current().review(ReviewInput.approve());
+
+    gApi.changes().id(id1).current().submit();
+
+    expectToHaveSubmoduleState(midRepo, "master", "bottom-project", bottomRepo, "master");
+    expectToHaveSubmoduleState(topRepo, "master", "mid-project", midRepo, "master");
+    expectToHaveSubmoduleState(topRepo, "master", "bottom-project", bottomRepo, "master");
+  }
+
+  private String prepareBranchCircularSubscription() throws Exception {
+    TestRepository<?> topRepo = createProjectWithPush("top-project");
+    TestRepository<?> midRepo = createProjectWithPush("mid-project");
+    TestRepository<?> bottomRepo = createProjectWithPush("bottom-project");
+
+    createSubmoduleSubscription(midRepo, "master", "bottom-project", "master");
+    createSubmoduleSubscription(topRepo, "master", "mid-project", "master");
+    createSubmoduleSubscription(bottomRepo, "master", "top-project", "master");
+
+    allowMatchingSubmoduleSubscription(
+        "bottom-project", "refs/heads/master", "mid-project", "refs/heads/master");
+    allowMatchingSubmoduleSubscription(
+        "mid-project", "refs/heads/master", "top-project", "refs/heads/master");
+    allowMatchingSubmoduleSubscription(
+        "top-project", "refs/heads/master", "bottom-project", "refs/heads/master");
+
+    ObjectId bottomMasterHead = pushChangeTo(bottomRepo, "refs/for/master", "some message", "");
+    String changeId = getChangeId(bottomRepo, bottomMasterHead).get();
+
+    approve(changeId);
+    exception.expectMessage("Branch level circular subscriptions detected");
+    exception.expectMessage("top-project,refs/heads/master");
+    exception.expectMessage("mid-project,refs/heads/master");
+    exception.expectMessage("bottom-project,refs/heads/master");
+    return changeId;
+  }
+
+  @Test
+  public void branchCircularSubscription() throws Exception {
+    String changeId = prepareBranchCircularSubscription();
+    gApi.changes().id(changeId).current().submit();
+  }
+
+  @Test
+  public void branchCircularSubscriptionPreview() throws Exception {
+    String changeId = prepareBranchCircularSubscription();
+    gApi.changes().id(changeId).current().submitPreview();
+  }
+
+  @Test
+  public void projectCircularSubscriptionWholeTopic() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> subRepo = createProjectWithPush("subscribed-to-project");
+
+    allowMatchingSubmoduleSubscription(
+        "subscribed-to-project", "refs/heads/master", "super-project", "refs/heads/master");
+    allowMatchingSubmoduleSubscription(
+        "super-project", "refs/heads/dev", "subscribed-to-project", "refs/heads/dev");
+
+    pushChangeTo(subRepo, "dev");
+    pushChangeTo(superRepo, "dev");
+
+    createSubmoduleSubscription(superRepo, "master", "subscribed-to-project", "master");
+    createSubmoduleSubscription(subRepo, "dev", "super-project", "dev");
+
+    ObjectId subMasterHead =
+        pushChangeTo(
+            subRepo, "refs/for/master", "b.txt", "content b", "some message", "same-topic");
+    ObjectId superDevHead = pushChangeTo(superRepo, "refs/for/dev", "some message", "same-topic");
+
+    approve(getChangeId(subRepo, subMasterHead).get());
+    approve(getChangeId(superRepo, superDevHead).get());
+
+    exception.expectMessage("Project level circular subscriptions detected");
+    exception.expectMessage("subscribed-to-project");
+    exception.expectMessage("super-project");
+    gApi.changes().id(getChangeId(subRepo, subMasterHead).get()).current().submit();
+  }
+
+  @Test
+  public void projectNoSubscriptionWholeTopic() throws Exception {
+    TestRepository<?> repoA = createProjectWithPush("project-a");
+    TestRepository<?> repoB = createProjectWithPush("project-b");
+    // bootstrap the dev branch
+    ObjectId a0 = pushChangeTo(repoA, "dev");
+
+    // bootstrap the dev branch
+    ObjectId b0 = pushChangeTo(repoB, "dev");
+
+    // create a change for master branch in repo a
+    ObjectId aHead =
+        pushChangeTo(
+            repoA,
+            "refs/for/master",
+            "master.txt",
+            "content master A",
+            "some message in a master.txt",
+            "same-topic");
+
+    // create a change for master branch in repo b
+    ObjectId bHead =
+        pushChangeTo(
+            repoB,
+            "refs/for/master",
+            "master.txt",
+            "content master B",
+            "some message in b master.txt",
+            "same-topic");
+
+    // create a change for dev branch in repo a
+    repoA.reset(a0);
+    ObjectId aDevHead =
+        pushChangeTo(
+            repoA,
+            "refs/for/dev",
+            "dev.txt",
+            "content dev A",
+            "some message in a dev.txt",
+            "same-topic");
+
+    // create a change for dev branch in repo b
+    repoB.reset(b0);
+    ObjectId bDevHead =
+        pushChangeTo(
+            repoB,
+            "refs/for/dev",
+            "dev.txt",
+            "content dev B",
+            "some message in b dev.txt",
+            "same-topic");
+
+    approve(getChangeId(repoA, aHead).get());
+    approve(getChangeId(repoB, bHead).get());
+    approve(getChangeId(repoA, aDevHead).get());
+    approve(getChangeId(repoB, bDevHead).get());
+
+    gApi.changes().id(getChangeId(repoA, aDevHead).get()).current().submit();
+    assertThat(getRemoteHead(name("project-a"), "refs/heads/master").getShortMessage())
+        .contains("some message in a master.txt");
+    assertThat(getRemoteHead(name("project-a"), "refs/heads/dev").getShortMessage())
+        .contains("some message in a dev.txt");
+    assertThat(getRemoteHead(name("project-b"), "refs/heads/master").getShortMessage())
+        .contains("some message in b master.txt");
+    assertThat(getRemoteHead(name("project-b"), "refs/heads/dev").getShortMessage())
+        .contains("some message in b dev.txt");
+  }
+
+  @Test
+  public void twoProjectsMultipleBranchesWholeTopic() throws Exception {
+    TestRepository<?> repoA = createProjectWithPush("project-a");
+    TestRepository<?> repoB = createProjectWithPush("project-b");
+    // bootstrap the dev branch
+    pushChangeTo(repoA, "dev");
+
+    // bootstrap the dev branch
+    ObjectId b0 = pushChangeTo(repoB, "dev");
+
+    allowMatchingSubmoduleSubscription(
+        "project-b", "refs/heads/master", "project-a", "refs/heads/master");
+    allowMatchingSubmoduleSubscription(
+        "project-b", "refs/heads/dev", "project-a", "refs/heads/dev");
+
+    createSubmoduleSubscription(repoA, "master", "project-b", "master");
+    createSubmoduleSubscription(repoA, "dev", "project-b", "dev");
+
+    // create a change for master branch in repo b
+    ObjectId bHead =
+        pushChangeTo(
+            repoB,
+            "refs/for/master",
+            "master.txt",
+            "content master B",
+            "some message in b master.txt",
+            "same-topic");
+
+    // create a change for dev branch in repo b
+    repoB.reset(b0);
+    ObjectId bDevHead =
+        pushChangeTo(
+            repoB,
+            "refs/for/dev",
+            "dev.txt",
+            "content dev B",
+            "some message in b dev.txt",
+            "same-topic");
+
+    approve(getChangeId(repoB, bHead).get());
+    approve(getChangeId(repoB, bDevHead).get());
+    gApi.changes().id(getChangeId(repoB, bHead).get()).current().submit();
+
+    expectToHaveSubmoduleState(repoA, "master", "project-b", repoB, "master");
+    expectToHaveSubmoduleState(repoA, "dev", "project-b", repoB, "dev");
+  }
+
+  @Test
+  public void retrySubmitAfterTornTopicOnLockFailure() throws Exception {
+    assume().that(notesMigration.disableChangeReviewDb()).isTrue();
+
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> sub1 = createProjectWithPush("sub1");
+    TestRepository<?> sub2 = createProjectWithPush("sub2");
+
+    allowMatchingSubmoduleSubscription(
+        "sub1", "refs/heads/master", "super-project", "refs/heads/master");
+    allowMatchingSubmoduleSubscription(
+        "sub2", "refs/heads/master", "super-project", "refs/heads/master");
+
+    Config config = new Config();
+    prepareSubmoduleConfigEntry(config, "sub1", "master");
+    prepareSubmoduleConfigEntry(config, "sub2", "master");
+    pushSubmoduleConfig(superRepo, "master", config);
+
+    ObjectId superPreviousId = pushChangeTo(superRepo, "master");
+
+    String topic = "same-topic";
+    ObjectId sub1Id = pushChangeTo(sub1, "refs/for/master", "some message", topic);
+    ObjectId sub2Id = pushChangeTo(sub2, "refs/for/master", "some message", topic);
+
+    String changeId1 = getChangeId(sub1, sub1Id).get();
+    String changeId2 = getChangeId(sub2, sub2Id).get();
+    approve(changeId1);
+    approve(changeId2);
+
+    TestSubmitInput input = new TestSubmitInput();
+    input.generateLockFailures =
+        new ArrayDeque<>(
+            ImmutableList.of(
+                false, // Change 1, attempt 1: success
+                true, // Change 2, attempt 1: lock failure
+                false, // Change 1, attempt 2: success
+                false, // Change 2, attempt 2: success
+                false)); // Leftover value to check total number of calls.
+    gApi.changes().id(changeId1).current().submit(input);
+
+    assertThat(info(changeId1).status).isEqualTo(ChangeStatus.MERGED);
+    assertThat(info(changeId2).status).isEqualTo(ChangeStatus.MERGED);
+
+    sub1.git().fetch().call();
+    RevWalk rw1 = sub1.getRevWalk();
+    RevCommit master1 = rw1.parseCommit(getRemoteHead(name("sub1"), "master"));
+    RevCommit change1Ps = parseCurrentRevision(rw1, changeId1);
+    assertThat(rw1.isMergedInto(change1Ps, master1)).isTrue();
+
+    sub2.git().fetch().call();
+    RevWalk rw2 = sub2.getRevWalk();
+    RevCommit master2 = rw2.parseCommit(getRemoteHead(name("sub2"), "master"));
+    RevCommit change2Ps = parseCurrentRevision(rw2, changeId2);
+    assertThat(rw2.isMergedInto(change2Ps, master2)).isTrue();
+
+    assertThat(input.generateLockFailures).containsExactly(false);
+
+    expectToHaveSubmoduleState(superRepo, "master", "sub1", sub1, "master");
+    expectToHaveSubmoduleState(superRepo, "master", "sub2", sub2, "master");
+
+    assertWithMessage("submodule subscription update should have made one commit")
+        .that(superRepo.getRepository().resolve("origin/master^"))
+        .isEqualTo(superPreviousId);
+  }
+
+  @Test
+  public void skipUpdatingBrokenGitlinkPointer() throws Exception {
+    TestRepository<?> superRepo = createProjectWithPush("super-project");
+    TestRepository<?> sub1 = createProjectWithPush("sub1");
+    TestRepository<?> sub2 = createProjectWithPush("sub2");
+
+    allowMatchingSubmoduleSubscription(
+        "sub1", "refs/heads/master", "super-project", "refs/heads/master");
+    allowMatchingSubmoduleSubscription(
+        "sub2", "refs/heads/master", "super-project", "refs/heads/master");
+
+    Config config = new Config();
+    prepareSubmoduleConfigEntry(config, "sub1", "master");
+    prepareSubmoduleConfigEntry(config, "sub2", "master");
+    pushSubmoduleConfig(superRepo, "master", config);
+
+    // Write an invalid SHA-1 directly to one of the gitlinks.
+    ObjectId badId = ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef");
+    directUpdateSubmodule("super-project", "refs/heads/master", "sub1", badId);
+    expectToHaveSubmoduleState(superRepo, "master", "sub1", badId);
+
+    String topic = "same-topic";
+    ObjectId sub1Id = pushChangeTo(sub1, "refs/for/master", "some message", topic);
+    ObjectId sub2Id = pushChangeTo(sub2, "refs/for/master", "some message", topic);
+
+    String changeId1 = getChangeId(sub1, sub1Id).get();
+    String changeId2 = getChangeId(sub2, sub2Id).get();
+    approve(changeId1);
+    approve(changeId2);
+
+    gApi.changes().id(changeId1).current().submit();
+
+    assertThat(info(changeId1).status).isEqualTo(ChangeStatus.MERGED);
+    assertThat(info(changeId2).status).isEqualTo(ChangeStatus.MERGED);
+
+    // sub1 was skipped but sub2 succeeded.
+    expectToHaveSubmoduleState(superRepo, "master", "sub1", badId);
+    expectToHaveSubmoduleState(superRepo, "master", "sub2", sub2, "master");
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/pgm/AbstractReindexTests.java b/javatests/com/google/gerrit/acceptance/pgm/AbstractReindexTests.java
new file mode 100644
index 0000000..c07d512
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/pgm/AbstractReindexTests.java
@@ -0,0 +1,284 @@
+// Copyright (C) 2014 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.google.gerrit.acceptance.pgm;
+
+import static com.google.common.collect.ImmutableMap.toImmutableMap;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+import static com.google.common.truth.Truth8.assertThat;
+import static com.google.gerrit.extensions.client.ListGroupsOption.MEMBERS;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.io.MoreFiles;
+import com.google.common.io.RecursiveDeleteOption;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.StandaloneSiteTest;
+import com.google.gerrit.acceptance.pgm.IndexUpgradeController.UpgradeAttempt;
+import com.google.gerrit.extensions.api.GerritApi;
+import com.google.gerrit.extensions.common.ChangeInput;
+import com.google.gerrit.launcher.GerritLauncher;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.index.GerritIndexStatus;
+import com.google.gerrit.server.index.change.ChangeIndexCollection;
+import com.google.gerrit.server.index.change.ChangeSchemaDefinitions;
+import com.google.gerrit.server.query.change.InternalChangeQuery;
+import com.google.inject.Injector;
+import com.google.inject.Provider;
+import java.nio.file.Files;
+import java.util.Set;
+import java.util.function.Consumer;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.storage.file.FileBasedConfig;
+import org.eclipse.jgit.util.FS;
+import org.junit.Test;
+
+@NoHttpd
+public abstract class AbstractReindexTests extends StandaloneSiteTest {
+  /** @param injector injector */
+  public abstract void configureIndex(Injector injector) throws Exception;
+
+  private static final String CHANGES = ChangeSchemaDefinitions.NAME;
+
+  private Project.NameKey project;
+  private String changeId;
+
+  @Test
+  public void reindexFromScratch() throws Exception {
+    setUpChange();
+
+    MoreFiles.deleteRecursively(sitePaths.index_dir, RecursiveDeleteOption.ALLOW_INSECURE);
+    Files.createDirectory(sitePaths.index_dir);
+    assertServerStartupFails();
+
+    runGerrit("reindex", "-d", sitePaths.site_path.toString(), "--show-stack-trace");
+    assertReady(ChangeSchemaDefinitions.INSTANCE.getLatest().getVersion());
+
+    try (ServerContext ctx = startServer()) {
+      GerritApi gApi = ctx.getInjector().getInstance(GerritApi.class);
+      // Query change index
+      assertThat(gApi.changes().query("message:Test").get().stream().map(c -> c.changeId))
+          .containsExactly(changeId);
+      // Query account index
+      assertThat(gApi.accounts().query("admin").get().stream().map(a -> a._accountId))
+          .containsExactly(adminId.get());
+      // Query group index
+      assertThat(
+              gApi.groups().query("Group").withOption(MEMBERS).get().stream()
+                  .flatMap(g -> g.members.stream())
+                  .map(a -> a._accountId))
+          .containsExactly(adminId.get());
+      // Query project index
+      assertThat(gApi.projects().query(project.get()).get().stream().map(p -> p.name))
+          .containsExactly(project.get());
+    }
+  }
+
+  @Test
+  public void offlineReindexForChangesIsNotPossibleInSlaveMode() throws Exception {
+    enableSlaveMode();
+
+    int exitCode =
+        runGerritAndReturnExitCode(
+            "reindex",
+            "--index",
+            "changes",
+            "-d",
+            sitePaths.site_path.toString(),
+            "--show-stack-trace");
+
+    assertWithMessage("Slave hosts shouldn't allow to offline reindex changes")
+        .that(exitCode)
+        .isGreaterThan(0);
+  }
+
+  @Test
+  public void offlineReindexForAccountsIsNotPossibleInSlaveMode() throws Exception {
+    enableSlaveMode();
+
+    int exitCode =
+        runGerritAndReturnExitCode(
+            "reindex",
+            "--index",
+            "accounts",
+            "-d",
+            sitePaths.site_path.toString(),
+            "--show-stack-trace");
+
+    assertWithMessage("Slave hosts shouldn't allow to offline reindex accounts")
+        .that(exitCode)
+        .isGreaterThan(0);
+  }
+
+  @Test
+  public void offlineReindexForProjectsIsNotPossibleInSlaveMode() throws Exception {
+    enableSlaveMode();
+
+    int exitCode =
+        runGerritAndReturnExitCode(
+            "reindex",
+            "--index",
+            "projects",
+            "-d",
+            sitePaths.site_path.toString(),
+            "--show-stack-trace");
+
+    assertWithMessage("Slave hosts shouldn't allow to offline reindex projects")
+        .that(exitCode)
+        .isGreaterThan(0);
+  }
+
+  @Test
+  public void offlineReindexForGroupsIsPossibleInSlaveMode() throws Exception {
+    enableSlaveMode();
+
+    int exitCode =
+        runGerritAndReturnExitCode(
+            "reindex",
+            "--index",
+            "groups",
+            "-d",
+            sitePaths.site_path.toString(),
+            "--show-stack-trace");
+
+    assertWithMessage("Slave hosts should allow to offline reindex groups")
+        .that(exitCode)
+        .isEqualTo(0);
+  }
+
+  @Test
+  public void offlineReindexForAllAvailableIndicesIsPossibleInSlaveMode() throws Exception {
+    enableSlaveMode();
+
+    int exitCode =
+        runGerritAndReturnExitCode(
+            "reindex", "-d", sitePaths.site_path.toString(), "--show-stack-trace");
+
+    assertWithMessage("Slave hosts should allow to perform a general offline reindex")
+        .that(exitCode)
+        .isEqualTo(0);
+  }
+
+  @Test
+  public void onlineUpgradeChanges() throws Exception {
+    int prevVersion = ChangeSchemaDefinitions.INSTANCE.getPrevious().getVersion();
+    int currVersion = ChangeSchemaDefinitions.INSTANCE.getLatest().getVersion();
+
+    // Before storing any changes, switch back to the previous version.
+    GerritIndexStatus status = new GerritIndexStatus(sitePaths);
+    status.setReady(CHANGES, currVersion, false);
+    status.setReady(CHANGES, prevVersion, true);
+    status.save();
+    assertReady(prevVersion);
+
+    setOnlineUpgradeConfig(false);
+    setUpChange();
+    setOnlineUpgradeConfig(true);
+
+    IndexUpgradeController u = new IndexUpgradeController(1);
+    try (ServerContext ctx = startServer(u.module())) {
+      assertSearchVersion(ctx, prevVersion);
+      assertWriteVersions(ctx, prevVersion, currVersion);
+
+      // Updating and searching old schema version works.
+      Provider<InternalChangeQuery> queryProvider =
+          ctx.getInjector().getProvider(InternalChangeQuery.class);
+      assertThat(queryProvider.get().byKey(new Change.Key(changeId))).hasSize(1);
+      assertThat(queryProvider.get().byTopicOpen("topic1")).isEmpty();
+
+      GerritApi gApi = ctx.getInjector().getInstance(GerritApi.class);
+      gApi.changes().id(changeId).topic("topic1");
+      assertThat(queryProvider.get().byTopicOpen("topic1")).hasSize(1);
+
+      u.runUpgrades();
+      assertThat(u.getStartedAttempts())
+          .containsExactly(UpgradeAttempt.create(CHANGES, prevVersion, currVersion));
+      assertThat(u.getSucceededAttempts())
+          .containsExactly(UpgradeAttempt.create(CHANGES, prevVersion, currVersion));
+      assertThat(u.getFailedAttempts()).isEmpty();
+
+      assertReady(currVersion);
+      assertSearchVersion(ctx, currVersion);
+      assertWriteVersions(ctx, currVersion);
+
+      // Updating and searching new schema version works.
+      assertThat(queryProvider.get().byTopicOpen("topic1")).hasSize(1);
+      assertThat(queryProvider.get().byTopicOpen("topic2")).isEmpty();
+      gApi.changes().id(changeId).topic("topic2");
+      assertThat(queryProvider.get().byTopicOpen("topic1")).isEmpty();
+      assertThat(queryProvider.get().byTopicOpen("topic2")).hasSize(1);
+    }
+  }
+
+  private void setUpChange() throws Exception {
+    project = new Project.NameKey("reindex-project-test");
+    try (ServerContext ctx = startServer()) {
+      configureIndex(ctx.getInjector());
+      GerritApi gApi = ctx.getInjector().getInstance(GerritApi.class);
+      gApi.projects().create(project.get());
+
+      ChangeInput in = new ChangeInput(project.get(), "master", "Test change");
+      in.newBranch = true;
+      changeId = gApi.changes().create(in).info().changeId;
+    }
+  }
+
+  private void setOnlineUpgradeConfig(boolean enable) throws Exception {
+    updateConfig(cfg -> cfg.setBoolean("index", null, "onlineUpgrade", enable));
+  }
+
+  private void enableSlaveMode() throws Exception {
+    updateConfig(config -> config.setBoolean("container", null, "slave", true));
+  }
+
+  private void updateConfig(Consumer<Config> configConsumer) throws Exception {
+    FileBasedConfig cfg = new FileBasedConfig(sitePaths.gerrit_config.toFile(), FS.detect());
+    cfg.load();
+    configConsumer.accept(cfg);
+    cfg.save();
+  }
+
+  private static int runGerritAndReturnExitCode(String... args) throws Exception {
+    return GerritLauncher.mainImpl(args);
+  }
+
+  private void assertSearchVersion(ServerContext ctx, int expected) {
+    assertThat(
+            ctx.getInjector()
+                .getInstance(ChangeIndexCollection.class)
+                .getSearchIndex()
+                .getSchema()
+                .getVersion())
+        .named("search version")
+        .isEqualTo(expected);
+  }
+
+  private void assertWriteVersions(ServerContext ctx, Integer... expected) {
+    assertThat(
+            ctx.getInjector().getInstance(ChangeIndexCollection.class).getWriteIndexes().stream()
+                .map(i -> i.getSchema().getVersion()))
+        .named("write versions")
+        .containsExactlyElementsIn(ImmutableSet.copyOf(expected));
+  }
+
+  private void assertReady(int expectedReady) throws Exception {
+    Set<Integer> allVersions = ChangeSchemaDefinitions.INSTANCE.getSchemas().keySet();
+    GerritIndexStatus status = new GerritIndexStatus(sitePaths);
+    assertThat(
+            allVersions.stream().collect(toImmutableMap(v -> v, v -> status.getReady(CHANGES, v))))
+        .named("ready state for index versions")
+        .isEqualTo(allVersions.stream().collect(toImmutableMap(v -> v, v -> v == expectedReady)));
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/pgm/BUILD b/javatests/com/google/gerrit/acceptance/pgm/BUILD
new file mode 100644
index 0000000..e0ed78a
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/pgm/BUILD
@@ -0,0 +1,49 @@
+load("//javatests/com/google/gerrit/acceptance:tests.bzl", "acceptance_tests")
+
+acceptance_tests(
+    srcs = glob(
+        ["*IT.java"],
+        exclude = ["ElasticReindexIT.java"],
+    ),
+    group = "pgm",
+    labels = [
+        "pgm",
+        "no_windows",
+    ],
+    vm_args = ["-Xmx512m"],
+    deps = [
+        ":util",
+        "//java/com/google/gerrit/index",
+        "//java/com/google/gerrit/index/project",
+        "//java/com/google/gerrit/server/schema",
+    ],
+)
+
+acceptance_tests(
+    srcs = ["ElasticReindexIT.java"],
+    group = "elastic",
+    labels = [
+        "docker",
+        "elastic",
+        "exclusive",
+        "pgm",
+        "no_windows",
+    ],
+    vm_args = ["-Xmx512m"],
+    deps = [
+        ":util",
+        "//java/com/google/gerrit/elasticsearch",
+        "//java/com/google/gerrit/server/schema",
+        "//javatests/com/google/gerrit/elasticsearch:elasticsearch_test_utils",
+    ],
+)
+
+java_library(
+    name = "util",
+    testonly = True,
+    srcs = [
+        "AbstractReindexTests.java",
+        "IndexUpgradeController.java",
+    ],
+    deps = ["//java/com/google/gerrit/acceptance:lib"],
+)
diff --git a/javatests/com/google/gerrit/acceptance/pgm/ElasticReindexIT.java b/javatests/com/google/gerrit/acceptance/pgm/ElasticReindexIT.java
new file mode 100644
index 0000000..af71ebd
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/pgm/ElasticReindexIT.java
@@ -0,0 +1,53 @@
+// 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.
+
+package com.google.gerrit.acceptance.pgm;
+
+import static com.google.gerrit.elasticsearch.ElasticTestUtils.createAllIndexes;
+import static com.google.gerrit.elasticsearch.ElasticTestUtils.getConfig;
+
+import com.google.gerrit.elasticsearch.ElasticVersion;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.inject.Injector;
+import org.eclipse.jgit.lib.Config;
+import org.junit.Before;
+
+public class ElasticReindexIT extends AbstractReindexTests {
+
+  @ConfigSuite.Default
+  public static Config elasticsearchV5() {
+    return getConfig(ElasticVersion.V5_6);
+  }
+
+  @ConfigSuite.Config
+  public static Config elasticsearchV6() {
+    return getConfig(ElasticVersion.V6_6);
+  }
+
+  @ConfigSuite.Config
+  public static Config elasticsearchV7() {
+    return getConfig(ElasticVersion.V7_0);
+  }
+
+  @Override
+  public void configureIndex(Injector injector) throws Exception {
+    createAllIndexes(injector);
+  }
+
+  @Before
+  public void reindexFirstSinceElastic() throws Exception {
+    assertServerStartupFails();
+    runGerrit("reindex", "-d", sitePaths.site_path.toString(), "--show-stack-trace");
+  }
+}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/IndexUpgradeController.java b/javatests/com/google/gerrit/acceptance/pgm/IndexUpgradeController.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/IndexUpgradeController.java
rename to javatests/com/google/gerrit/acceptance/pgm/IndexUpgradeController.java
diff --git a/javatests/com/google/gerrit/acceptance/pgm/InitIT.java b/javatests/com/google/gerrit/acceptance/pgm/InitIT.java
new file mode 100644
index 0000000..a573e35
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/pgm/InitIT.java
@@ -0,0 +1,51 @@
+// 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.
+
+package com.google.gerrit.acceptance.pgm;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.StandaloneSiteTest;
+import com.google.gerrit.index.IndexConfig;
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.project.ProjectData;
+import com.google.gerrit.index.project.ProjectIndexCollection;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.AllUsersName;
+import java.util.Optional;
+import org.junit.Test;
+
+@NoHttpd
+public class InitIT extends StandaloneSiteTest {
+
+  @Test
+  public void indexesAllProjectsAndAllUsers() throws Exception {
+    runGerrit("init", "-d", sitePaths.site_path.toString(), "--show-stack-trace");
+    try (ServerContext ctx = startServer()) {
+      ProjectIndexCollection projectIndex =
+          ctx.getInjector().getInstance(ProjectIndexCollection.class);
+      Project.NameKey allProjects = ctx.getInjector().getInstance(AllProjectsName.class);
+      Project.NameKey allUsers = ctx.getInjector().getInstance(AllUsersName.class);
+      QueryOptions opts =
+          QueryOptions.create(IndexConfig.createDefault(), 0, 1, ImmutableSet.of("name"));
+      Optional<ProjectData> allProjectsData = projectIndex.getSearchIndex().get(allProjects, opts);
+      assertThat(allProjectsData.isPresent()).isTrue();
+      Optional<ProjectData> allUsersData = projectIndex.getSearchIndex().get(allUsers, opts);
+      assertThat(allUsersData.isPresent()).isTrue();
+    }
+  }
+}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/ReindexIT.java b/javatests/com/google/gerrit/acceptance/pgm/ReindexIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/ReindexIT.java
rename to javatests/com/google/gerrit/acceptance/pgm/ReindexIT.java
diff --git a/javatests/com/google/gerrit/acceptance/pgm/StandaloneNoteDbMigrationIT.java b/javatests/com/google/gerrit/acceptance/pgm/StandaloneNoteDbMigrationIT.java
new file mode 100644
index 0000000..1bb23fb
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/pgm/StandaloneNoteDbMigrationIT.java
@@ -0,0 +1,363 @@
+// Copyright (C) 2014 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.google.gerrit.acceptance.pgm;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+import static com.google.common.truth.Truth8.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.StandaloneSiteTest;
+import com.google.gerrit.extensions.api.GerritApi;
+import com.google.gerrit.extensions.common.ChangeInput;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.LocalDiskRepositoryManager;
+import com.google.gerrit.server.index.GerritIndexStatus;
+import com.google.gerrit.server.index.change.ChangeIndexCollection;
+import com.google.gerrit.server.index.change.ChangeSchemaDefinitions;
+import com.google.gerrit.server.notedb.NoteDbChangeState;
+import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
+import com.google.gerrit.server.notedb.NoteDbChangeState.RefState;
+import com.google.gerrit.server.notedb.NotesMigrationState;
+import com.google.gerrit.server.schema.ReviewDbFactory;
+import com.google.gerrit.testing.NoteDbMode;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.Key;
+import com.google.inject.TypeLiteral;
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.stream.Stream;
+import org.eclipse.jgit.internal.storage.file.FileRepository;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.lib.StoredConfig;
+import org.eclipse.jgit.storage.file.FileBasedConfig;
+import org.eclipse.jgit.util.FS;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Tests for NoteDb migrations where the entry point is through a program, {@code
+ * migrate-to-note-db} or {@code daemon}.
+ *
+ * <p><strong>Note:</strong> These tests are very slow due to the repeated daemon startup. Prefer
+ * adding tests to {@link com.google.gerrit.acceptance.server.notedb.OnlineNoteDbMigrationIT} if
+ * possible.
+ */
+@NoHttpd
+public class StandaloneNoteDbMigrationIT extends StandaloneSiteTest {
+  private StoredConfig gerritConfig;
+  private StoredConfig noteDbConfig;
+
+  private Project.NameKey project;
+  private Change.Id changeId;
+
+  @Before
+  public void setUp() throws Exception {
+    assume().that(NoteDbMode.get()).isEqualTo(NoteDbMode.OFF);
+    gerritConfig = new FileBasedConfig(sitePaths.gerrit_config.toFile(), FS.detect());
+    // Unlike in the running server, for tests, we don't stack notedb.config on gerrit.config.
+    noteDbConfig = new FileBasedConfig(sitePaths.notedb_config.toFile(), FS.detect());
+
+    // Set gc.pruneExpire=now so GC prunes all unreachable objects from All-Users, which allows us
+    // to reliably test that it behaves as expected.
+    Path cfgPath = sitePaths.site_path.resolve("git").resolve("All-Users.git").resolve("config");
+    assertWithMessage("Expected All-Users config at %s", cfgPath)
+        .that(Files.isRegularFile(cfgPath))
+        .isTrue();
+    FileBasedConfig cfg = new FileBasedConfig(cfgPath.toFile(), FS.detect());
+    cfg.setString("gc", null, "pruneExpire", "now");
+    cfg.save();
+  }
+
+  @Test
+  public void rebuildOneChangeTrialMode() throws Exception {
+    assertNoAutoMigrateConfig(gerritConfig);
+    assertNoAutoMigrateConfig(noteDbConfig);
+    assertNotesMigrationState(NotesMigrationState.REVIEW_DB);
+    setUpOneChange();
+
+    migrate("--trial");
+    assertNotesMigrationState(NotesMigrationState.READ_WRITE_NO_SEQUENCE);
+
+    try (ServerContext ctx = startServer()) {
+      GitRepositoryManager repoManager = ctx.getInjector().getInstance(GitRepositoryManager.class);
+      ObjectId metaId;
+      try (Repository repo = repoManager.openRepository(project)) {
+        Ref ref = repo.exactRef(RefNames.changeMetaRef(changeId));
+        assertThat(ref).isNotNull();
+        metaId = ref.getObjectId();
+      }
+
+      try (ReviewDb db = openUnderlyingReviewDb(ctx)) {
+        Change c = db.changes().get(changeId);
+        assertThat(c).isNotNull();
+        NoteDbChangeState state = NoteDbChangeState.parse(c);
+        assertThat(state).isNotNull();
+        assertThat(state.getPrimaryStorage()).isEqualTo(PrimaryStorage.REVIEW_DB);
+        assertThat(state.getRefState()).hasValue(RefState.create(metaId, ImmutableMap.of()));
+      }
+    }
+  }
+
+  @Test
+  public void migrateOneChange() throws Exception {
+    assertNoAutoMigrateConfig(gerritConfig);
+    assertNoAutoMigrateConfig(noteDbConfig);
+    assertNotesMigrationState(NotesMigrationState.REVIEW_DB);
+    setUpOneChange();
+
+    migrate();
+    assertNotesMigrationState(NotesMigrationState.NOTE_DB);
+
+    File allUsersDir;
+    try (ServerContext ctx = startServer()) {
+      GitRepositoryManager repoManager = ctx.getInjector().getInstance(GitRepositoryManager.class);
+      try (Repository repo = repoManager.openRepository(project)) {
+        assertThat(repo.exactRef(RefNames.changeMetaRef(changeId))).isNotNull();
+      }
+      assertThat(repoManager).isInstanceOf(LocalDiskRepositoryManager.class);
+      try (Repository repo =
+          repoManager.openRepository(ctx.getInjector().getInstance(AllUsersName.class))) {
+        allUsersDir = repo.getDirectory();
+      }
+
+      try (ReviewDb db = openUnderlyingReviewDb(ctx)) {
+        Change c = db.changes().get(changeId);
+        assertThat(c).isNotNull();
+        NoteDbChangeState state = NoteDbChangeState.parse(c);
+        assertThat(state).isNotNull();
+        assertThat(state.getPrimaryStorage()).isEqualTo(PrimaryStorage.NOTE_DB);
+        assertThat(state.getRefState()).isEmpty();
+
+        ChangeInput in = new ChangeInput(project.get(), "master", "NoteDb-only change");
+        in.newBranch = true;
+        GerritApi gApi = ctx.getInjector().getInstance(GerritApi.class);
+        Change.Id id2 = new Change.Id(gApi.changes().create(in).info()._number);
+        assertThat(db.changes().get(id2)).isNull();
+      }
+    }
+    assertNoAutoMigrateConfig(gerritConfig);
+    assertAutoMigrateConfig(noteDbConfig, false);
+
+    try (FileRepository repo = new FileRepository(allUsersDir)) {
+      try (Stream<Path> paths = Files.walk(repo.getObjectsDirectory().toPath())) {
+        assertThat(paths.filter(p -> !p.toString().contains("pack") && Files.isRegularFile(p)))
+            .named("loose object files in All-Users")
+            .isEmpty();
+      }
+      assertThat(repo.getObjectDatabase().getPacks()).named("packfiles in All-Users").hasSize(1);
+    }
+  }
+
+  @Test
+  public void migrationWithReindex() throws Exception {
+    assertNotesMigrationState(NotesMigrationState.REVIEW_DB);
+    setUpOneChange();
+
+    int version = ChangeSchemaDefinitions.INSTANCE.getLatest().getVersion();
+    GerritIndexStatus status = new GerritIndexStatus(sitePaths);
+    assertThat(status.getReady(ChangeSchemaDefinitions.NAME, version)).isTrue();
+    status.setReady(ChangeSchemaDefinitions.NAME, version, false);
+    status.save();
+    assertServerStartupFails();
+
+    migrate();
+    assertNotesMigrationState(NotesMigrationState.NOTE_DB);
+
+    status = new GerritIndexStatus(sitePaths);
+    assertThat(status.getReady(ChangeSchemaDefinitions.NAME, version)).isTrue();
+  }
+
+  @Test
+  public void onlineMigrationViaDaemon() throws Exception {
+    assertNoAutoMigrateConfig(gerritConfig);
+    assertNoAutoMigrateConfig(noteDbConfig);
+
+    testOnlineMigration(u -> startServer(u.module(), "--migrate-to-note-db", "true"));
+
+    assertNoAutoMigrateConfig(gerritConfig);
+    assertAutoMigrateConfig(noteDbConfig, false);
+  }
+
+  @Test
+  public void onlineMigrationViaConfig() throws Exception {
+    assertNoAutoMigrateConfig(gerritConfig);
+    assertNoAutoMigrateConfig(noteDbConfig);
+
+    testOnlineMigration(
+        u -> {
+          gerritConfig.setBoolean("noteDb", "changes", "autoMigrate", true);
+          gerritConfig.save();
+          return startServer(u.module());
+        });
+
+    // Auto-migration is turned off in notedb.config, which takes precedence, but is still on in
+    // gerrit.config. This means Puppet can continue overwriting gerrit.config without turning
+    // auto-migration back on.
+    assertAutoMigrateConfig(gerritConfig, true);
+    assertAutoMigrateConfig(noteDbConfig, false);
+  }
+
+  @Test
+  public void onlineMigrationTrialModeViaFlag() throws Exception {
+    assertNoAutoMigrateConfig(gerritConfig);
+    assertNoTrialConfig(gerritConfig);
+
+    assertNoAutoMigrateConfig(noteDbConfig);
+    assertNoTrialConfig(noteDbConfig);
+
+    testOnlineMigration(
+        u -> startServer(u.module(), "--migrate-to-note-db", "--trial"),
+        NotesMigrationState.READ_WRITE_NO_SEQUENCE);
+
+    assertNoAutoMigrateConfig(gerritConfig);
+    assertNoTrialConfig(gerritConfig);
+
+    assertAutoMigrateConfig(noteDbConfig, true);
+    assertTrialConfig(noteDbConfig, true);
+  }
+
+  @Test
+  public void onlineMigrationTrialModeViaConfig() throws Exception {
+    assertNoAutoMigrateConfig(gerritConfig);
+    assertNoTrialConfig(gerritConfig);
+
+    assertNoAutoMigrateConfig(noteDbConfig);
+    assertNoTrialConfig(noteDbConfig);
+
+    testOnlineMigration(
+        u -> {
+          gerritConfig.setBoolean("noteDb", "changes", "autoMigrate", true);
+          gerritConfig.setBoolean("noteDb", "changes", "trial", true);
+          gerritConfig.save();
+          return startServer(u.module());
+        },
+        NotesMigrationState.READ_WRITE_NO_SEQUENCE);
+
+    assertAutoMigrateConfig(gerritConfig, true);
+    assertTrialConfig(gerritConfig, true);
+
+    assertAutoMigrateConfig(noteDbConfig, true);
+    assertTrialConfig(noteDbConfig, true);
+  }
+
+  @FunctionalInterface
+  private interface StartServerWithMigration {
+    ServerContext start(IndexUpgradeController u) throws Exception;
+  }
+
+  private void testOnlineMigration(StartServerWithMigration start) throws Exception {
+    testOnlineMigration(start, NotesMigrationState.NOTE_DB);
+  }
+
+  private void testOnlineMigration(
+      StartServerWithMigration start, NotesMigrationState expectedEndState) throws Exception {
+    assertNotesMigrationState(NotesMigrationState.REVIEW_DB);
+    int prevVersion = ChangeSchemaDefinitions.INSTANCE.getPrevious().getVersion();
+    int currVersion = ChangeSchemaDefinitions.INSTANCE.getLatest().getVersion();
+
+    // Before storing any changes, switch back to the previous version.
+    GerritIndexStatus status = new GerritIndexStatus(sitePaths);
+    status.setReady(ChangeSchemaDefinitions.NAME, currVersion, false);
+    status.setReady(ChangeSchemaDefinitions.NAME, prevVersion, true);
+    status.save();
+
+    setOnlineUpgradeConfig(false);
+    setUpOneChange();
+    setOnlineUpgradeConfig(true);
+
+    IndexUpgradeController u = new IndexUpgradeController(1);
+    try (ServerContext ctx = start.start(u)) {
+      ChangeIndexCollection indexes = ctx.getInjector().getInstance(ChangeIndexCollection.class);
+      assertThat(indexes.getSearchIndex().getSchema().getVersion()).isEqualTo(prevVersion);
+
+      // Index schema upgrades happen after NoteDb migration, so waiting for those to complete
+      // should be sufficient.
+      u.runUpgrades();
+
+      assertThat(indexes.getSearchIndex().getSchema().getVersion()).isEqualTo(currVersion);
+      assertNotesMigrationState(expectedEndState);
+    }
+  }
+
+  private void setUpOneChange() throws Exception {
+    project = new Project.NameKey("project");
+    try (ServerContext ctx = startServer()) {
+      GerritApi gApi = ctx.getInjector().getInstance(GerritApi.class);
+      gApi.projects().create("project");
+
+      ChangeInput in = new ChangeInput(project.get(), "master", "Test change");
+      in.newBranch = true;
+      changeId = new Change.Id(gApi.changes().create(in).info()._number);
+    }
+  }
+
+  private void migrate(String... additionalArgs) throws Exception {
+    runGerrit(
+        ImmutableList.of(
+            "migrate-to-note-db", "-d", sitePaths.site_path.toString(), "--show-stack-trace"),
+        ImmutableList.copyOf(additionalArgs));
+  }
+
+  private void assertNotesMigrationState(NotesMigrationState expected) throws Exception {
+    noteDbConfig.load();
+    assertThat(NotesMigrationState.forConfig(noteDbConfig)).hasValue(expected);
+  }
+
+  private ReviewDb openUnderlyingReviewDb(ServerContext ctx) throws Exception {
+    return ctx.getInjector()
+        .getInstance(Key.get(new TypeLiteral<SchemaFactory<ReviewDb>>() {}, ReviewDbFactory.class))
+        .open();
+  }
+
+  private static void assertNoAutoMigrateConfig(StoredConfig cfg) throws Exception {
+    cfg.load();
+    assertThat(cfg.getString("noteDb", "changes", "autoMigrate")).isNull();
+  }
+
+  private static void assertAutoMigrateConfig(StoredConfig cfg, boolean expected) throws Exception {
+    cfg.load();
+    assertThat(cfg.getString("noteDb", "changes", "autoMigrate")).isNotNull();
+    assertThat(cfg.getBoolean("noteDb", "changes", "autoMigrate", false)).isEqualTo(expected);
+  }
+
+  private static void assertNoTrialConfig(StoredConfig cfg) throws Exception {
+    cfg.load();
+    assertThat(cfg.getString("noteDb", "changes", "trial")).isNull();
+  }
+
+  private static void assertTrialConfig(StoredConfig cfg, boolean expected) throws Exception {
+    cfg.load();
+    assertThat(cfg.getString("noteDb", "changes", "trial")).isNotNull();
+    assertThat(cfg.getBoolean("noteDb", "changes", "trial", false)).isEqualTo(expected);
+  }
+
+  private void setOnlineUpgradeConfig(boolean enable) throws Exception {
+    gerritConfig.load();
+    gerritConfig.setBoolean("index", null, "onlineUpgrade", enable);
+    gerritConfig.save();
+  }
+}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/StartStopDaemonIT.java b/javatests/com/google/gerrit/acceptance/pgm/StartStopDaemonIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/StartStopDaemonIT.java
rename to javatests/com/google/gerrit/acceptance/pgm/StartStopDaemonIT.java
diff --git a/javatests/com/google/gerrit/acceptance/rest/AbstractRestApiBindingsTest.java b/javatests/com/google/gerrit/acceptance/rest/AbstractRestApiBindingsTest.java
new file mode 100644
index 0000000..2bb3dca
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/AbstractRestApiBindingsTest.java
@@ -0,0 +1,165 @@
+// 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.
+
+package com.google.gerrit.acceptance.rest;
+
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.truth.Truth.assertWithMessage;
+import static org.apache.http.HttpStatus.SC_FORBIDDEN;
+import static org.apache.http.HttpStatus.SC_INTERNAL_SERVER_ERROR;
+import static org.apache.http.HttpStatus.SC_METHOD_NOT_ALLOWED;
+import static org.apache.http.HttpStatus.SC_NOT_FOUND;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.RestResponse;
+import java.util.List;
+import java.util.Optional;
+import org.apache.commons.lang.StringUtils;
+import org.junit.Ignore;
+
+/**
+ * Base class for testing the REST API bindings.
+ *
+ * <p>This test sends a request to each REST endpoint and verifies that an implementation is found
+ * (no '404 Not Found' response) and that the request doesn't fail (no '500 Internal Server Error'
+ * response). It doesn't verify that the REST endpoint works correctly. This is okay since the
+ * purpose of the test is only to verify that the REST endpoint implementations are correctly bound.
+ */
+@Ignore
+public abstract class AbstractRestApiBindingsTest extends AbstractDaemonTest {
+  protected void execute(List<RestCall> restCalls, String... args) throws Exception {
+    execute(restCalls, () -> {}, args);
+  }
+
+  protected void execute(List<RestCall> restCalls, BeforeRestCall beforeRestCall, String... args)
+      throws Exception {
+    for (RestCall restCall : restCalls) {
+      beforeRestCall.run();
+      execute(restCall, args);
+    }
+  }
+
+  protected void execute(RestCall restCall, String... args) throws Exception {
+    String method = restCall.httpMethod().name();
+    String uri = restCall.uri(args);
+
+    RestResponse response;
+    switch (restCall.httpMethod()) {
+      case GET:
+        response = adminRestSession.get(uri);
+        break;
+      case PUT:
+        response = adminRestSession.put(uri);
+        break;
+      case POST:
+        response = adminRestSession.post(uri);
+        break;
+      case DELETE:
+        response = adminRestSession.delete(uri);
+        break;
+      default:
+        fail("unsupported method: %s", restCall.httpMethod().name());
+        throw new IllegalStateException();
+    }
+
+    int status = response.getStatusCode();
+    String body = response.hasContent() ? response.getEntityContent() : "";
+
+    String msg = String.format("%s %s returned %d: %s", method, uri, status, body);
+    if (restCall.expectedResponseCode().isPresent()) {
+      assertWithMessage(msg).that(status).isEqualTo(restCall.expectedResponseCode().get());
+      if (restCall.expectedMessage().isPresent()) {
+        assertWithMessage(msg).that(body).contains(restCall.expectedMessage().get());
+      }
+    } else {
+      assertWithMessage(msg)
+          .that(status)
+          .isNotIn(ImmutableList.of(SC_FORBIDDEN, SC_NOT_FOUND, SC_METHOD_NOT_ALLOWED));
+      assertWithMessage(msg).that(status).isLessThan(SC_INTERNAL_SERVER_ERROR);
+    }
+  }
+
+  enum Method {
+    GET,
+    PUT,
+    POST,
+    DELETE
+  }
+
+  @AutoValue
+  abstract static class RestCall {
+    static RestCall get(String uriFormat) {
+      return builder(Method.GET, uriFormat).build();
+    }
+
+    static RestCall put(String uriFormat) {
+      return builder(Method.PUT, uriFormat).build();
+    }
+
+    static RestCall post(String uriFormat) {
+      return builder(Method.POST, uriFormat).build();
+    }
+
+    static RestCall delete(String uriFormat) {
+      return builder(Method.DELETE, uriFormat).build();
+    }
+
+    static Builder builder(Method httpMethod, String uriFormat) {
+      return new AutoValue_AbstractRestApiBindingsTest_RestCall.Builder()
+          .httpMethod(httpMethod)
+          .uriFormat(uriFormat);
+    }
+
+    abstract Method httpMethod();
+
+    abstract String uriFormat();
+
+    abstract Optional<Integer> expectedResponseCode();
+
+    abstract Optional<String> expectedMessage();
+
+    String uri(String... args) {
+      String uriFormat = uriFormat();
+      int expectedArgNum = StringUtils.countMatches(uriFormat, "%s");
+      checkState(
+          args.length == expectedArgNum,
+          "uriFormat %s needs %s arguments, got only %s: %s",
+          uriFormat,
+          expectedArgNum,
+          args.length,
+          args);
+      return String.format(uriFormat, (Object[]) args);
+    }
+
+    @AutoValue.Builder
+    abstract static class Builder {
+      abstract Builder httpMethod(Method httpMethod);
+
+      abstract Builder uriFormat(String uriFormat);
+
+      abstract Builder expectedResponseCode(int expectedResponseCode);
+
+      abstract Builder expectedMessage(String expectedMessage);
+
+      abstract RestCall build();
+    }
+  }
+
+  @FunctionalInterface
+  public interface BeforeRestCall {
+    void run() throws Exception;
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/AccountsRestApiBindingsIT.java b/javatests/com/google/gerrit/acceptance/rest/AccountsRestApiBindingsIT.java
new file mode 100644
index 0000000..b0adba7
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/AccountsRestApiBindingsIT.java
@@ -0,0 +1,191 @@
+// 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.
+
+package com.google.gerrit.acceptance.rest;
+
+import static com.google.gerrit.acceptance.rest.AbstractRestApiBindingsTest.Method.PUT;
+import static com.google.gerrit.gpg.testing.TestKeys.validKeyWithoutExpiration;
+import static org.apache.http.HttpStatus.SC_METHOD_NOT_ALLOWED;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.acceptance.GerritConfig;
+import com.google.gerrit.acceptance.UseSsh;
+import com.google.gerrit.extensions.common.ChangeInput;
+import com.google.gerrit.gpg.testing.TestKey;
+import com.google.gerrit.server.ServerInitiated;
+import com.google.gerrit.server.account.AccountsUpdate;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import org.junit.Test;
+
+/**
+ * Tests for checking the bindings of the accounts REST API.
+ *
+ * <p>These tests only verify that the account REST endpoints are correctly bound, they do no test
+ * the functionality of the account REST endpoints (for details see JavaDoc on {@link
+ * AbstractRestApiBindingsTest}).
+ */
+public class AccountsRestApiBindingsIT extends AbstractRestApiBindingsTest {
+  @Inject private @ServerInitiated Provider<AccountsUpdate> accountsUpdateProvider;
+
+  /**
+   * Account REST endpoints to be tested, each URL contains a placeholder for the account
+   * identifier.
+   */
+  private static final ImmutableList<RestCall> ACCOUNT_ENDPOINTS =
+      ImmutableList.of(
+          RestCall.get("/accounts/%s"),
+          RestCall.put("/accounts/%s"),
+          RestCall.get("/accounts/%s/detail"),
+          RestCall.get("/accounts/%s/name"),
+          RestCall.put("/accounts/%s/name"),
+          RestCall.delete("/accounts/%s/name"),
+          RestCall.get("/accounts/%s/username"),
+          RestCall.builder(PUT, "/accounts/%s/username")
+              // Changing the username is not allowed.
+              .expectedResponseCode(SC_METHOD_NOT_ALLOWED)
+              .expectedMessage("Username cannot be changed.")
+              .build(),
+          RestCall.get("/accounts/%s/active"),
+          RestCall.put("/accounts/%s/active"),
+          RestCall.delete("/accounts/%s/active"),
+          RestCall.put("/accounts/%s/password.http"),
+          RestCall.delete("/accounts/%s/password.http"),
+          RestCall.get("/accounts/%s/status"),
+          RestCall.put("/accounts/%s/status"),
+          RestCall.get("/accounts/%s/avatar"),
+          RestCall.get("/accounts/%s/avatar.change.url"),
+          RestCall.get("/accounts/%s/emails/"),
+          RestCall.put("/accounts/%s/emails/new-email@foo.com"),
+          RestCall.get("/accounts/%s/sshkeys/"),
+          RestCall.post("/accounts/%s/sshkeys/"),
+          RestCall.get("/accounts/%s/watched.projects"),
+          RestCall.post("/accounts/%s/watched.projects"),
+          RestCall.post("/accounts/%s/watched.projects:delete"),
+          RestCall.get("/accounts/%s/groups"),
+          RestCall.get("/accounts/%s/preferences"),
+          RestCall.put("/accounts/%s/preferences"),
+          RestCall.get("/accounts/%s/preferences.diff"),
+          RestCall.put("/accounts/%s/preferences.diff"),
+          RestCall.get("/accounts/%s/preferences.edit"),
+          RestCall.put("/accounts/%s/preferences.edit"),
+          RestCall.get("/accounts/%s/starred.changes"),
+          RestCall.get("/accounts/%s/stars.changes"),
+          RestCall.post("/accounts/%s/index"),
+          RestCall.get("/accounts/%s/agreements"),
+          RestCall.put("/accounts/%s/agreements"),
+          RestCall.get("/accounts/%s/external.ids"),
+          RestCall.post("/accounts/%s/external.ids:delete"),
+          RestCall.post("/accounts/%s/drafts:delete"),
+          RestCall.get("/accounts/%s/oauthtoken"),
+          RestCall.get("/accounts/%s/capabilities"),
+          RestCall.get("/accounts/%s/capabilities/viewPlugins"),
+          RestCall.get("/accounts/%s/gpgkeys"),
+          RestCall.post("/accounts/%s/gpgkeys"));
+
+  /**
+   * Email REST endpoints to be tested, each URL contains a placeholders for the account and email
+   * identifier.
+   */
+  private static final ImmutableList<RestCall> EMAIL_ENDPOINTS =
+      ImmutableList.of(
+          RestCall.get("/accounts/%s/emails/%s"),
+          RestCall.put("/accounts/%s/emails/%s"),
+          RestCall.put("/accounts/%s/emails/%s/preferred"),
+
+          // email deletion must be tested last
+          RestCall.delete("/accounts/%s/emails/%s"));
+
+  /**
+   * GPG key REST endpoints to be tested, each URL contains a placeholders for the account
+   * identifier and the GPG key identifier.
+   */
+  private static final ImmutableList<RestCall> GPG_KEY_ENDPOINTS =
+      ImmutableList.of(
+          RestCall.get("/accounts/%s/gpgkeys/%s"),
+
+          // GPG key deletion must be tested last
+          RestCall.delete("/accounts/%s/gpgkeys/%s"));
+
+  /**
+   * SSH key REST endpoints to be tested, each URL contains a placeholders for the account and SSH
+   * key identifier.
+   */
+  private static final ImmutableList<RestCall> SSH_KEY_ENDPOINTS =
+      ImmutableList.of(
+          RestCall.get("/accounts/%s/sshkeys/%s"),
+
+          // SSH key deletion must be tested last
+          RestCall.delete("/accounts/%s/sshkeys/%s"));
+
+  /**
+   * Star REST endpoints to be tested, each URL contains a placeholders for the account and change
+   * identifier.
+   */
+  private static final ImmutableList<RestCall> STAR_ENDPOINTS =
+      ImmutableList.of(
+          RestCall.put("/accounts/%s/starred.changes/%s"),
+          RestCall.delete("/accounts/%s/starred.changes/%s"),
+          RestCall.get("/accounts/%s/stars.changes/%s"),
+          RestCall.post("/accounts/%s/stars.changes/%s"));
+
+  @Test
+  public void accountEndpoints() throws Exception {
+    execute(ACCOUNT_ENDPOINTS, "self");
+  }
+
+  @Test
+  public void emailEndpoints() throws Exception {
+    execute(EMAIL_ENDPOINTS, "self", admin.email);
+  }
+
+  @Test
+  @GerritConfig(name = "receive.enableSignedPush", value = "true")
+  public void gpgKeyEndpoints() throws Exception {
+    TestKey key = validKeyWithoutExpiration();
+    String id = key.getKeyIdString();
+
+    String email = "test1@example.com"; // email that is hard-coded in the test GPG key
+    accountsUpdateProvider
+        .get()
+        .update(
+            "Add Email",
+            admin.getId(),
+            u ->
+                u.addExternalId(
+                    ExternalId.createWithEmail(name("test"), email, admin.getId(), email)));
+
+    setApiUser(admin);
+    gApi.accounts()
+        .self()
+        .putGpgKeys(ImmutableList.of(key.getPublicKeyArmored()), ImmutableList.of());
+
+    execute(GPG_KEY_ENDPOINTS, "self", id);
+  }
+
+  @Test
+  @UseSsh
+  public void sshKeyEndpoints() throws Exception {
+    String sshKeySeq = Integer.toString(gApi.accounts().self().listSshKeys().size());
+    execute(SSH_KEY_ENDPOINTS, "self", sshKeySeq);
+  }
+
+  @Test
+  public void starEndpoints() throws Exception {
+    ChangeInput ci = new ChangeInput(project.get(), "master", "Test change");
+    String changeId = gApi.changes().create(ci).get().id;
+    execute(STAR_ENDPOINTS, "self", changeId);
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/BUILD b/javatests/com/google/gerrit/acceptance/rest/BUILD
new file mode 100644
index 0000000..40abd6b
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/BUILD
@@ -0,0 +1,24 @@
+load("//javatests/com/google/gerrit/acceptance:tests.bzl", "acceptance_tests")
+
+acceptance_tests(
+    srcs = glob(["*IT.java"]),
+    group = "rest_bindings",
+    labels = ["rest"],
+    deps = [
+        ":util",
+        "//java/com/google/gerrit/server/logging",
+    ],
+)
+
+java_library(
+    name = "util",
+    testonly = True,
+    srcs = [
+        "AbstractRestApiBindingsTest.java",
+    ],
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/acceptance:lib",
+        "//lib/commons:lang",
+    ],
+)
diff --git a/javatests/com/google/gerrit/acceptance/rest/ChangesRestApiBindingsIT.java b/javatests/com/google/gerrit/acceptance/rest/ChangesRestApiBindingsIT.java
new file mode 100644
index 0000000..c00c2aa
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/ChangesRestApiBindingsIT.java
@@ -0,0 +1,509 @@
+// 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.
+
+package com.google.gerrit.acceptance.rest;
+
+import static com.google.common.truth.TruthJUnit.assume;
+import static com.google.gerrit.acceptance.rest.AbstractRestApiBindingsTest.Method.GET;
+import static com.google.gerrit.extensions.common.testing.RobotCommentInfoSubject.assertThatList;
+import static java.util.stream.Collectors.toList;
+import static org.apache.http.HttpStatus.SC_NOT_FOUND;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.gerrit.extensions.api.changes.AddReviewerInput;
+import com.google.gerrit.extensions.api.changes.DraftInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput.DraftHandling;
+import com.google.gerrit.extensions.api.changes.ReviewInput.RobotCommentInput;
+import com.google.gerrit.extensions.client.Comment;
+import com.google.gerrit.extensions.client.Side;
+import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.common.FixReplacementInfo;
+import com.google.gerrit.extensions.common.FixSuggestionInfo;
+import com.google.gerrit.extensions.common.RobotCommentInfo;
+import com.google.gerrit.reviewdb.client.Patch;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+import org.junit.Test;
+
+/**
+ * Tests for checking the bindings of the changes REST API.
+ *
+ * <p>These tests only verify that the change REST endpoints are correctly bound, they do no test
+ * the functionality of the change REST endpoints (for details see JavaDoc on {@link
+ * AbstractRestApiBindingsTest}).
+ */
+public class ChangesRestApiBindingsIT extends AbstractRestApiBindingsTest {
+  /**
+   * Change REST endpoints to be tested, each URL contains a placeholder for the change identifier.
+   */
+  private static final ImmutableList<RestCall> CHANGE_ENDPOINTS =
+      ImmutableList.of(
+          RestCall.get("/changes/%s"),
+          RestCall.get("/changes/%s/detail"),
+          RestCall.get("/changes/%s/topic"),
+          RestCall.put("/changes/%s/topic"),
+          RestCall.delete("/changes/%s/topic"),
+          RestCall.get("/changes/%s/in"),
+          RestCall.get("/changes/%s/hashtags"),
+          RestCall.get("/changes/%s/comments"),
+          RestCall.get("/changes/%s/robotcomments"),
+          RestCall.get("/changes/%s/drafts"),
+          RestCall.get("/changes/%s/assignee"),
+          RestCall.get("/changes/%s/past_assignees"),
+          RestCall.put("/changes/%s/assignee"),
+          RestCall.delete("/changes/%s/assignee"),
+          RestCall.post("/changes/%s/private"),
+          RestCall.post("/changes/%s/private.delete"),
+          RestCall.delete("/changes/%s/private"),
+          RestCall.post("/changes/%s/wip"),
+          RestCall.post("/changes/%s/ready"),
+          RestCall.put("/changes/%s/ignore"),
+          RestCall.put("/changes/%s/unignore"),
+          RestCall.put("/changes/%s/reviewed"),
+          RestCall.put("/changes/%s/unreviewed"),
+          RestCall.get("/changes/%s/messages"),
+          RestCall.put("/changes/%s/message"),
+          RestCall.post("/changes/%s/merge"),
+          RestCall.post("/changes/%s/abandon"),
+          RestCall.post("/changes/%s/move"),
+          RestCall.post("/changes/%s/rebase"),
+          RestCall.post("/changes/%s/restore"),
+          RestCall.post("/changes/%s/revert"),
+          RestCall.get("/changes/%s/pure_revert"),
+          RestCall.post("/changes/%s/submit"),
+          RestCall.get("/changes/%s/submitted_together"),
+          RestCall.post("/changes/%s/index"),
+          RestCall.get("/changes/%s/check"),
+          RestCall.post("/changes/%s/check"),
+          RestCall.get("/changes/%s/reviewers"),
+          RestCall.post("/changes/%s/reviewers"),
+          RestCall.get("/changes/%s/suggest_reviewers"),
+          RestCall.builder(GET, "/changes/%s/revisions")
+              // GET /changes/<change-id>/revisions is not implemented
+              .expectedResponseCode(SC_NOT_FOUND)
+              .build(),
+          RestCall.get("/changes/%s/edit"),
+          RestCall.post("/changes/%s/edit"),
+          RestCall.post("/changes/%s/edit:rebase"),
+          RestCall.get("/changes/%s/edit:message"),
+          RestCall.put("/changes/%s/edit:message"),
+
+          // Publish edit and create a new edit
+          RestCall.post("/changes/%s/edit:publish"),
+          RestCall.put("/changes/%s/edit/a.txt"),
+
+          // Deletion of change edit and change must be tested last
+          RestCall.delete("/changes/%s/edit"),
+          RestCall.delete("/changes/%s"));
+
+  /**
+   * Change REST endpoints to be tested with NoteDb, each URL contains a placeholder for the change
+   * identifier.
+   */
+  private static final ImmutableList<RestCall> CHANGE_ENDPOINTS_NOTEDB =
+      ImmutableList.of(
+          RestCall.post("/changes/%s/hashtags"), RestCall.post("/changes/%s/rebuild.notedb"));
+
+  /**
+   * Reviewer REST endpoints to be tested, each URL contains placeholders for the change identifier
+   * and the reviewer identifier.
+   */
+  private static final ImmutableList<RestCall> REVIEWER_ENDPOINTS =
+      ImmutableList.of(
+          RestCall.get("/changes/%s/reviewers/%s"),
+          RestCall.get("/changes/%s/reviewers/%s/votes"),
+          RestCall.post("/changes/%s/reviewers/%s/delete"),
+          RestCall.delete("/changes/%s/reviewers/%s"));
+
+  /**
+   * Vote REST endpoints to be tested, each URL contains placeholders for the change identifier, the
+   * reviewer identifier and the label identifier.
+   */
+  private static final ImmutableList<RestCall> VOTE_ENDPOINTS =
+      ImmutableList.of(
+          RestCall.post("/changes/%s/reviewers/%s/votes/%s/delete"),
+          RestCall.delete("/changes/%s/reviewers/%s/votes/%s"));
+
+  /**
+   * Revision REST endpoints to be tested, each URL contains placeholders for the change identifier
+   * and the revision identifier.
+   */
+  private static final ImmutableList<RestCall> REVISION_ENDPOINTS =
+      ImmutableList.of(
+          RestCall.get("/changes/%s/revisions/%s/actions"),
+          RestCall.post("/changes/%s/revisions/%s/cherrypick"),
+          RestCall.get("/changes/%s/revisions/%s/commit"),
+          RestCall.get("/changes/%s/revisions/%s/mergeable"),
+          RestCall.get("/changes/%s/revisions/%s/related"),
+          RestCall.get("/changes/%s/revisions/%s/review"),
+          RestCall.post("/changes/%s/revisions/%s/review"),
+          RestCall.get("/changes/%s/revisions/%s/preview_submit"),
+          RestCall.post("/changes/%s/revisions/%s/submit"),
+          RestCall.get("/changes/%s/revisions/%s/submit_type"),
+          RestCall.post("/changes/%s/revisions/%s/test.submit_rule"),
+          RestCall.post("/changes/%s/revisions/%s/test.submit_type"),
+          RestCall.post("/changes/%s/revisions/%s/rebase"),
+          RestCall.get("/changes/%s/revisions/%s/description"),
+          RestCall.put("/changes/%s/revisions/%s/description"),
+          RestCall.get("/changes/%s/revisions/%s/patch"),
+          RestCall.get("/changes/%s/revisions/%s/archive"),
+          RestCall.get("/changes/%s/revisions/%s/mergelist"),
+          RestCall.get("/changes/%s/revisions/%s/reviewers"),
+          RestCall.get("/changes/%s/revisions/%s/drafts"),
+          RestCall.put("/changes/%s/revisions/%s/drafts"),
+          RestCall.get("/changes/%s/revisions/%s/comments"),
+          RestCall.get("/changes/%s/revisions/%s/robotcomments"),
+          RestCall.builder(GET, "/changes/%s/revisions/%s/fixes")
+              // GET /changes/<change>/revisions/<revision>/fixes is not implemented
+              .expectedResponseCode(SC_NOT_FOUND)
+              .build(),
+          RestCall.get("/changes/%s/revisions/%s/files"));
+
+  /**
+   * Revision reviewer REST endpoints to be tested, each URL contains placeholders for the change
+   * identifier, the revision identifier and the reviewer identifier.
+   */
+  private static final ImmutableList<RestCall> REVISION_REVIEWER_ENDPOINTS =
+      ImmutableList.of(
+          RestCall.get("/changes/%s/revisions/%s/reviewers/%s"),
+          RestCall.get("/changes/%s/revisions/%s/reviewers/%s/votes"),
+          RestCall.post("/changes/%s/revisions/%s/reviewers/%s/delete"),
+          RestCall.delete("/changes/%s/revisions/%s/reviewers/%s"));
+
+  /**
+   * Revision vote REST endpoints to be tested, each URL contains placeholders for the change
+   * identifier, the revision identifier, the reviewer identifier and the label identifier.
+   */
+  private static final ImmutableList<RestCall> REVISION_VOTE_ENDPOINTS =
+      ImmutableList.of(
+          RestCall.post("/changes/%s/revisions/%s/reviewers/%s/votes/%s/delete"),
+          RestCall.delete("/changes/%s/revisions/%s/reviewers/%s/votes/%s"));
+
+  /**
+   * Draft comment REST endpoints to be tested, each URL contains placeholders for the change
+   * identifier, the revision identifier and the draft comment identifier.
+   */
+  private static final ImmutableList<RestCall> DRAFT_COMMENT_ENDPOINTS =
+      ImmutableList.of(
+          RestCall.get("/changes/%s/revisions/%s/drafts/%s"),
+          RestCall.put("/changes/%s/revisions/%s/drafts/%s"),
+          RestCall.delete("/changes/%s/revisions/%s/drafts/%s"));
+
+  /**
+   * Comment REST endpoints to be tested, each URL contains placeholders for the change identifier,
+   * the revision identifier and the comment identifier.
+   */
+  private static final ImmutableList<RestCall> COMMENT_ENDPOINTS =
+      ImmutableList.of(
+          RestCall.get("/changes/%s/revisions/%s/comments/%s"),
+          RestCall.delete("/changes/%s/revisions/%s/comments/%s"),
+          RestCall.post("/changes/%s/revisions/%s/comments/%s/delete"));
+
+  /**
+   * Robot comment REST endpoints to be tested, each URL contains placeholders for the change
+   * identifier, the revision identifier and the robot comment identifier.
+   */
+  private static final ImmutableList<RestCall> ROBOT_COMMENT_ENDPOINTS =
+      ImmutableList.of(RestCall.get("/changes/%s/revisions/%s/robotcomments/%s"));
+
+  /**
+   * Fix REST endpoints to be tested, each URL contains placeholders for the change identifier, the
+   * revision identifier and the fix identifier.
+   */
+  private static final ImmutableList<RestCall> FIX_ENDPOINTS =
+      ImmutableList.of(RestCall.post("/changes/%s/revisions/%s/fixes/%s/apply"));
+
+  /**
+   * Revision file REST endpoints to be tested, each URL contains placeholders for the change
+   * identifier, the revision identifier and the file identifier.
+   */
+  private static final ImmutableList<RestCall> REVISION_FILE_ENDPOINTS =
+      ImmutableList.of(
+          RestCall.put("/changes/%s/revisions/%s/files/%s/reviewed"),
+          RestCall.delete("/changes/%s/revisions/%s/files/%s/reviewed"),
+          RestCall.get("/changes/%s/revisions/%s/files/%s/content"),
+          RestCall.get("/changes/%s/revisions/%s/files/%s/download"),
+          RestCall.get("/changes/%s/revisions/%s/files/%s/diff"),
+          RestCall.get("/changes/%s/revisions/%s/files/%s/blame"));
+
+  /**
+   * Change message REST endpoints to be tested, each URL contains placeholders for the change
+   * identifier and the change message identifier.
+   */
+  private static final ImmutableList<RestCall> CHANGE_MESSAGE_ENDPOINTS =
+      ImmutableList.of(RestCall.get("/changes/%s/messages/%s"));
+
+  /**
+   * Change edit REST endpoints that create an edit to be tested, each URL contains placeholders for
+   * the change identifier and the change edit identifier.
+   */
+  private static final ImmutableList<RestCall> CHANGE_EDIT_CREATE_ENDPOINTS =
+      ImmutableList.of(
+          // Create change edit by editing an existing file.
+          RestCall.put("/changes/%s/edit/%s"),
+
+          // Create change edit by deleting an existing file.
+          RestCall.delete("/changes/%s/edit/%s"));
+
+  /**
+   * Change edit REST endpoints to be tested, each URL contains placeholders for the change
+   * identifier and the change edit identifier.
+   */
+  private static final ImmutableList<RestCall> CHANGE_EDIT_ENDPOINTS =
+      ImmutableList.of(
+          // Calls on existing change edit.
+          RestCall.get("/changes/%s/edit/%s"),
+          RestCall.put("/changes/%s/edit/%s"),
+          RestCall.get("/changes/%s/edit/%s/meta"),
+
+          // Delete content of a file in an existing change edit.
+          RestCall.delete("/changes/%s/edit/%s"));
+
+  private static final String FILENAME = "test.txt";
+
+  @Test
+  public void changeEndpoints() throws Exception {
+    String changeId = createChange().getChangeId();
+    gApi.changes().id(changeId).edit().create();
+    execute(CHANGE_ENDPOINTS, changeId);
+  }
+
+  @Test
+  public void changeEndpointsNoteDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    String changeId = createChange().getChangeId();
+    execute(CHANGE_ENDPOINTS_NOTEDB, changeId);
+  }
+
+  @Test
+  public void reviewerEndpoints() throws Exception {
+    String changeId = createChange().getChangeId();
+
+    AddReviewerInput addReviewerInput = new AddReviewerInput();
+    addReviewerInput.reviewer = user.email;
+
+    execute(
+        REVIEWER_ENDPOINTS,
+        () -> gApi.changes().id(changeId).addReviewer(addReviewerInput),
+        changeId,
+        addReviewerInput.reviewer);
+  }
+
+  @Test
+  public void voteEndpoints() throws Exception {
+    String changeId = createChange().getChangeId();
+
+    execute(
+        VOTE_ENDPOINTS,
+        () -> gApi.changes().id(changeId).current().review(ReviewInput.approve()),
+        changeId,
+        admin.email,
+        "Code-Review");
+  }
+
+  @Test
+  public void revisionEndpoints() throws Exception {
+    String changeId = createChange().getChangeId();
+    execute(REVISION_ENDPOINTS, changeId, "current");
+  }
+
+  @Test
+  public void revisionReviewerEndpoints() throws Exception {
+    String changeId = createChange().getChangeId();
+
+    AddReviewerInput addReviewerInput = new AddReviewerInput();
+    addReviewerInput.reviewer = user.email;
+
+    execute(
+        REVISION_REVIEWER_ENDPOINTS,
+        () -> gApi.changes().id(changeId).addReviewer(addReviewerInput),
+        changeId,
+        "current",
+        addReviewerInput.reviewer);
+  }
+
+  @Test
+  public void revisionVoteEndpoints() throws Exception {
+    String changeId = createChange().getChangeId();
+
+    execute(
+        REVISION_VOTE_ENDPOINTS,
+        () -> gApi.changes().id(changeId).current().review(ReviewInput.approve()),
+        changeId,
+        "current",
+        admin.email,
+        "Code-Review");
+  }
+
+  @Test
+  public void draftCommentEndpoints() throws Exception {
+    String changeId = createChange().getChangeId();
+
+    for (RestCall restCall : DRAFT_COMMENT_ENDPOINTS) {
+      DraftInput draftInput = new DraftInput();
+      draftInput.path = Patch.COMMIT_MSG;
+      draftInput.side = Side.REVISION;
+      draftInput.line = 1;
+      draftInput.message = "draft comment";
+      CommentInfo draftInfo = gApi.changes().id(changeId).current().createDraft(draftInput).get();
+
+      execute(restCall, changeId, "current", draftInfo.id);
+    }
+  }
+
+  @Test
+  public void commentEndpoints() throws Exception {
+    String changeId = createChange().getChangeId();
+
+    for (RestCall restCall : COMMENT_ENDPOINTS) {
+      DraftInput draftInput = new DraftInput();
+      draftInput.path = Patch.COMMIT_MSG;
+      draftInput.side = Side.REVISION;
+      draftInput.line = 1;
+      draftInput.message = "draft comment";
+      CommentInfo commentInfo = gApi.changes().id(changeId).current().createDraft(draftInput).get();
+
+      ReviewInput reviewInput = new ReviewInput();
+      reviewInput.drafts = DraftHandling.PUBLISH;
+      gApi.changes().id(changeId).current().review(reviewInput);
+
+      execute(restCall, changeId, "current", commentInfo.id);
+    }
+  }
+
+  @Test
+  public void robotCommentEndpoints() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    String changeId = createChange().getChangeId();
+
+    RobotCommentInput robotCommentInput = new RobotCommentInput();
+    robotCommentInput.robotId = "happyRobot";
+    robotCommentInput.robotRunId = "1";
+    robotCommentInput.line = 1;
+    robotCommentInput.message = "nit: trailing whitespace";
+    robotCommentInput.path = Patch.COMMIT_MSG;
+
+    ReviewInput reviewInput = new ReviewInput();
+    reviewInput.robotComments =
+        Collections.singletonMap(robotCommentInput.path, ImmutableList.of(robotCommentInput));
+    reviewInput.message = "robot comment test";
+    gApi.changes().id(changeId).current().review(reviewInput);
+
+    List<RobotCommentInfo> robotCommentInfos =
+        gApi.changes().id(changeId).current().robotCommentsAsList();
+    RobotCommentInfo robotCommentInfo = Iterables.getOnlyElement(robotCommentInfos);
+
+    execute(ROBOT_COMMENT_ENDPOINTS, changeId, "current", robotCommentInfo.id);
+  }
+
+  @Test
+  public void fixEndpoints() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    String changeId = createChange("Subject", FILENAME, "content").getChangeId();
+
+    RobotCommentInput robotCommentInput = new RobotCommentInput();
+    robotCommentInput.robotId = "happyRobot";
+    robotCommentInput.robotRunId = "1";
+    robotCommentInput.line = 1;
+    robotCommentInput.message = "nit: trailing whitespace";
+    robotCommentInput.path = FILENAME;
+
+    FixReplacementInfo fixReplacementInfo = new FixReplacementInfo();
+    fixReplacementInfo.path = FILENAME;
+    fixReplacementInfo.replacement = "some replacement code";
+    fixReplacementInfo.range = createRange(1, 1, 1, 2);
+
+    FixSuggestionInfo fixSuggestionInfo = new FixSuggestionInfo();
+    fixSuggestionInfo.fixId = "An ID which must be overwritten.";
+    fixSuggestionInfo.description = "A description for a suggested fix.";
+    fixSuggestionInfo.replacements = ImmutableList.of(fixReplacementInfo);
+
+    robotCommentInput.fixSuggestions = ImmutableList.of(fixSuggestionInfo);
+
+    ReviewInput reviewInput = new ReviewInput();
+    reviewInput.robotComments =
+        Collections.singletonMap(robotCommentInput.path, ImmutableList.of(robotCommentInput));
+    reviewInput.message = "robot comment test";
+    gApi.changes().id(changeId).current().review(reviewInput);
+
+    List<RobotCommentInfo> robotCommentInfos =
+        gApi.changes().id(changeId).current().robotCommentsAsList();
+
+    List<String> fixIds = getFixIds(robotCommentInfos);
+    String fixId = Iterables.getOnlyElement(fixIds);
+
+    execute(FIX_ENDPOINTS, changeId, "current", fixId);
+  }
+
+  @Test
+  public void revisionFileEndpoints() throws Exception {
+    String changeId = createChange("Subject", FILENAME, "content").getChangeId();
+    execute(REVISION_FILE_ENDPOINTS, changeId, "current", FILENAME);
+  }
+
+  @Test
+  public void changeMessageEndpoints() throws Exception {
+    String changeId = createChange().getChangeId();
+
+    // A change message is created on change creation.
+    String changeMessageId = Iterables.getOnlyElement(gApi.changes().id(changeId).messages()).id;
+
+    execute(CHANGE_MESSAGE_ENDPOINTS, changeId, changeMessageId);
+  }
+
+  @Test
+  public void changeEditCreateEndpoints() throws Exception {
+    String changeId = createChange("Subject", FILENAME, "content").getChangeId();
+
+    // Each of the REST calls creates the change edit newly.
+    execute(
+        CHANGE_EDIT_CREATE_ENDPOINTS,
+        () -> adminRestSession.delete("/changes/" + changeId + "/edit"),
+        changeId,
+        FILENAME);
+  }
+
+  @Test
+  public void changeEditEndpoints() throws Exception {
+    String changeId = createChange("Subject", FILENAME, "content").getChangeId();
+    gApi.changes().id(changeId).edit().create();
+    execute(CHANGE_EDIT_ENDPOINTS, changeId, FILENAME);
+  }
+
+  private static Comment.Range createRange(
+      int startLine, int startCharacter, int endLine, int endCharacter) {
+    Comment.Range range = new Comment.Range();
+    range.startLine = startLine;
+    range.startCharacter = startCharacter;
+    range.endLine = endLine;
+    range.endCharacter = endCharacter;
+    return range;
+  }
+
+  private static List<String> getFixIds(List<RobotCommentInfo> robotComments) {
+    assertThatList(robotComments).isNotNull();
+    return robotComments.stream()
+        .map(robotCommentInfo -> robotCommentInfo.fixSuggestions)
+        .filter(Objects::nonNull)
+        .flatMap(List::stream)
+        .map(fixSuggestionInfo -> fixSuggestionInfo.fixId)
+        .collect(toList());
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/ConfigRestApiBindingsIT.java b/javatests/com/google/gerrit/acceptance/rest/ConfigRestApiBindingsIT.java
new file mode 100644
index 0000000..4a2c81b
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/ConfigRestApiBindingsIT.java
@@ -0,0 +1,110 @@
+// 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.
+
+package com.google.gerrit.acceptance.rest;
+
+import static com.google.common.truth.Truth8.assertThat;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.server.project.ProjectCacheImpl;
+import com.google.gerrit.server.restapi.config.ListTasks.TaskInfo;
+import com.google.gson.reflect.TypeToken;
+import java.util.List;
+import java.util.Optional;
+import org.junit.Test;
+
+/**
+ * Tests for checking the bindings of the config REST API.
+ *
+ * <p>These tests only verify that the config REST endpoints are correctly bound, they do no test
+ * the functionality of the config REST endpoints (for details see JavaDoc on {@link
+ * AbstractRestApiBindingsTest}).
+ */
+public class ConfigRestApiBindingsIT extends AbstractRestApiBindingsTest {
+  /**
+   * Config REST endpoints to be tested, the URLs contain no placeholders since the only supported
+   * config identifier ('server') can be hard-coded.
+   */
+  private static final ImmutableList<RestCall> CONFIG_ENDPOINTS =
+      ImmutableList.of(
+          RestCall.get("/config/server/version"),
+          RestCall.get("/config/server/info"),
+          RestCall.get("/config/server/preferences"),
+          RestCall.put("/config/server/preferences"),
+          RestCall.get("/config/server/preferences.diff"),
+          RestCall.put("/config/server/preferences.diff"),
+          RestCall.get("/config/server/preferences.edit"),
+          RestCall.put("/config/server/preferences.edit"),
+          RestCall.get("/config/server/top-menus"),
+          RestCall.put("/config/server/email.confirm"),
+          RestCall.post("/config/server/check.consistency"),
+          RestCall.post("/config/server/reload"),
+          RestCall.get("/config/server/summary"),
+          RestCall.get("/config/server/capabilities"),
+          RestCall.get("/config/server/caches"),
+          RestCall.post("/config/server/caches"),
+          RestCall.get("/config/server/tasks"));
+
+  /**
+   * Cache REST endpoints to be tested, the URLs contain a placeholder for the cache identifier.
+   * Since there is only supported a single supported config identifier ('server') it can be
+   * hard-coded.
+   */
+  private static final ImmutableList<RestCall> CACHE_ENDPOINTS =
+      ImmutableList.of(RestCall.get("/config/server/caches/%s"));
+
+  /**
+   * Task REST endpoints to be tested, the URLs contain a placeholder for the task identifier. Since
+   * there is only supported a single supported config identifier ('server') it can be hard-coded.
+   */
+  private static final ImmutableList<RestCall> TASK_ENDPOINTS =
+      ImmutableList.of(
+          RestCall.get("/config/server/tasks/%s"),
+
+          // Task deletion must be tested last
+          RestCall.delete("/config/server/tasks/%s"));
+
+  @Test
+  public void configEndpoints() throws Exception {
+    // 'Access Database' is needed for the '/config/server/check.consistency' REST endpoint
+    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
+
+    execute(CONFIG_ENDPOINTS);
+  }
+
+  @Test
+  public void cacheEndpoints() throws Exception {
+    execute(CACHE_ENDPOINTS, ProjectCacheImpl.CACHE_NAME);
+  }
+
+  @Test
+  public void taskEndpoints() throws Exception {
+    RestResponse r = adminRestSession.get("/config/server/tasks/");
+    List<TaskInfo> result =
+        newGson().fromJson(r.getReader(), new TypeToken<List<TaskInfo>>() {}.getType());
+    r.consume();
+
+    Optional<String> id =
+        result.stream()
+            .filter(t -> "Log File Compressor".equals(t.command))
+            .map(t -> t.id)
+            .findFirst();
+    assertThat(id).isPresent();
+
+    execute(TASK_ENDPOINTS, id.get());
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/DeleteOnCollectionIT.java b/javatests/com/google/gerrit/acceptance/rest/DeleteOnCollectionIT.java
new file mode 100644
index 0000000..4de436a
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/DeleteOnCollectionIT.java
@@ -0,0 +1,55 @@
+// 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.
+
+package com.google.gerrit.acceptance.rest;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.server.project.BranchResource.BRANCH_KIND;
+import static org.apache.http.HttpStatus.SC_NO_CONTENT;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiModule;
+import com.google.gerrit.extensions.restapi.RestCollectionModifyView;
+import com.google.gerrit.server.project.BranchResource;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.inject.Module;
+import org.junit.Test;
+
+public class DeleteOnCollectionIT extends AbstractDaemonTest {
+  @Override
+  public Module createModule() {
+    return new RestApiModule() {
+      @Override
+      public void configure() {
+        deleteOnCollection(BRANCH_KIND)
+            .toInstance(
+                new RestCollectionModifyView<ProjectResource, BranchResource, Object>() {
+                  @Override
+                  public Object apply(ProjectResource parentResource, Object input)
+                      throws Exception {
+                    return Response.none();
+                  }
+                });
+      }
+    };
+  }
+
+  @Test
+  public void deleteOnChildCollection() throws Exception {
+    RestResponse response = adminRestSession.delete("/projects/" + project.get() + "/branches");
+    assertThat(response.getStatusCode()).isEqualTo(SC_NO_CONTENT);
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/GroupsRestApiBindingsIT.java b/javatests/com/google/gerrit/acceptance/rest/GroupsRestApiBindingsIT.java
new file mode 100644
index 0000000..4538f75
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/GroupsRestApiBindingsIT.java
@@ -0,0 +1,100 @@
+// 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.
+
+package com.google.gerrit.acceptance.rest;
+
+import com.google.common.collect.ImmutableList;
+import org.junit.Test;
+
+/**
+ * Tests for checking the bindings of the groups REST API.
+ *
+ * <p>These tests only verify that the group REST endpoints are correctly bound, they do no test the
+ * functionality of the group REST endpoints (for details see JavaDoc on {@link
+ * AbstractRestApiBindingsTest}).
+ */
+public class GroupsRestApiBindingsIT extends AbstractRestApiBindingsTest {
+  /**
+   * Group REST endpoints to be tested, each URL contains a placeholder for the group identifier.
+   */
+  private static final ImmutableList<RestCall> GROUP_ENDPOINTS =
+      ImmutableList.of(
+          RestCall.get("/groups/%s"),
+          RestCall.put("/groups/%s"),
+          RestCall.get("/groups/%s/detail"),
+          RestCall.get("/groups/%s/name"),
+          RestCall.put("/groups/%s/name"),
+          RestCall.get("/groups/%s/description"),
+          RestCall.put("/groups/%s/description"),
+          RestCall.delete("/groups/%s/description"),
+          RestCall.get("/groups/%s/owner"),
+          RestCall.put("/groups/%s/owner"),
+          RestCall.get("/groups/%s/options"),
+          RestCall.put("/groups/%s/options"),
+          RestCall.post("/groups/%s/members"),
+          RestCall.post("/groups/%s/members.add"),
+          RestCall.post("/groups/%s/members.delete"),
+          RestCall.post("/groups/%s/groups"),
+          RestCall.post("/groups/%s/groups.add"),
+          RestCall.post("/groups/%s/groups.delete"),
+          RestCall.get("/groups/%s/log.audit"),
+          RestCall.post("/groups/%s/index"),
+          RestCall.get("/groups/%s/members"),
+          RestCall.get("/groups/%s/groups"));
+
+  /**
+   * Member REST endpoints to be tested, each URL contains placeholders for the group identifier and
+   * the member identifier.
+   */
+  private static final ImmutableList<RestCall> MEMBER_ENDPOINTS =
+      ImmutableList.of(
+          RestCall.get("/groups/%s/members/%s"),
+          RestCall.put("/groups/%s/members/%s"),
+
+          // Member deletion must be tested last
+          RestCall.delete("/groups/%s/members/%s"));
+
+  /**
+   * Subgroup REST endpoints to be tested, each URL contains placeholders for the group identifier
+   * and the subgroup identifier.
+   */
+  private static final ImmutableList<RestCall> SUBGROUP_ENDPOINTS =
+      ImmutableList.of(
+          RestCall.get("/groups/%s/groups/%s"),
+          RestCall.put("/groups/%s/groups/%s"),
+
+          // Subgroup deletion must be tested last
+          RestCall.delete("/groups/%s/groups/%s"));
+
+  @Test
+  public void groupEndpoints() throws Exception {
+    String group = gApi.groups().create("test-group").get().name;
+    execute(GROUP_ENDPOINTS, group);
+  }
+
+  @Test
+  public void memberEndpoints() throws Exception {
+    String group = gApi.groups().create("test-group").get().name;
+    gApi.groups().id(group).addMembers(admin.email);
+    execute(MEMBER_ENDPOINTS, group, admin.email);
+  }
+
+  @Test
+  public void subgroupEndpoints() throws Exception {
+    String group = gApi.groups().create("test-group").get().name;
+    String subgroup = gApi.groups().create("test-subgroup").get().name;
+    gApi.groups().id(group).addGroups(subgroup);
+    execute(SUBGROUP_ENDPOINTS, group, subgroup);
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/MethodNotAllowedIT.java b/javatests/com/google/gerrit/acceptance/rest/MethodNotAllowedIT.java
new file mode 100644
index 0000000..06202b1
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/MethodNotAllowedIT.java
@@ -0,0 +1,72 @@
+// 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.
+
+package com.google.gerrit.acceptance.rest;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.apache.http.HttpStatus.SC_METHOD_NOT_ALLOWED;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.RestResponse;
+import org.apache.http.client.fluent.Request;
+import org.junit.Test;
+
+public class MethodNotAllowedIT extends AbstractDaemonTest {
+  @Test
+  public void unsupportedPostOnRootCollection() throws Exception {
+    RestResponse response = adminRestSession.post("/accounts/");
+    assertThat(response.getStatusCode()).isEqualTo(SC_METHOD_NOT_ALLOWED);
+    assertThat(response.getEntityContent()).isEqualTo("Not implemented: POST /accounts/");
+  }
+
+  @Test
+  public void unsupportedPostOnChildCollection() throws Exception {
+    RestResponse response = adminRestSession.post("/accounts/self/emails");
+    assertThat(response.getStatusCode()).isEqualTo(SC_METHOD_NOT_ALLOWED);
+    assertThat(response.getEntityContent())
+        .isEqualTo("Not implemented: POST /accounts/self/emails");
+  }
+
+  @Test
+  public void unsupportedDeleteOnRootCollection() throws Exception {
+    RestResponse response = adminRestSession.delete("/accounts/");
+    assertThat(response.getStatusCode()).isEqualTo(SC_METHOD_NOT_ALLOWED);
+    assertThat(response.getEntityContent()).isEqualTo("Not implemented: DELETE /accounts/");
+  }
+
+  @Test
+  public void unsupportedDeleteOnChildCollection() throws Exception {
+    RestResponse response = adminRestSession.delete("/accounts/self/emails");
+    assertThat(response.getStatusCode()).isEqualTo(SC_METHOD_NOT_ALLOWED);
+    assertThat(response.getEntityContent())
+        .isEqualTo("Not implemented: DELETE /accounts/self/emails");
+  }
+
+  @Test
+  public void unsupportedHttpMethodOnRootCollection() throws Exception {
+    Request patch = Request.Patch(adminRestSession.url() + "/a/accounts/");
+    RestResponse response = adminRestSession.execute(patch);
+    assertThat(response.getStatusCode()).isEqualTo(SC_METHOD_NOT_ALLOWED);
+    assertThat(response.getEntityContent()).isEqualTo("Not implemented: PATCH /accounts/");
+  }
+
+  @Test
+  public void unsupportedHttpMethodOnChildCollection() throws Exception {
+    Request patch = Request.Patch(adminRestSession.url() + "/a/accounts/self/emails");
+    RestResponse response = adminRestSession.execute(patch);
+    assertThat(response.getStatusCode()).isEqualTo(SC_METHOD_NOT_ALLOWED);
+    assertThat(response.getEntityContent())
+        .isEqualTo("Not implemented: PATCH /accounts/self/emails");
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/NotFoundIT.java b/javatests/com/google/gerrit/acceptance/rest/NotFoundIT.java
new file mode 100644
index 0000000..e01a461
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/NotFoundIT.java
@@ -0,0 +1,46 @@
+// 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.
+
+package com.google.gerrit.acceptance.rest;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.apache.http.HttpStatus.SC_NOT_FOUND;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.RestResponse;
+import org.junit.Test;
+
+public class NotFoundIT extends AbstractDaemonTest {
+  @Test
+  public void nonExistingRootCollection() throws Exception {
+    RestResponse response = adminRestSession.get("/non-existing/");
+    assertThat(response.getStatusCode()).isEqualTo(SC_NOT_FOUND);
+    assertThat(response.getEntityContent()).isEqualTo("Not Found");
+
+    response = adminRestSession.post("/non-existing/");
+    assertThat(response.getStatusCode()).isEqualTo(SC_NOT_FOUND);
+    assertThat(response.getEntityContent()).isEqualTo("Not Found");
+  }
+
+  @Test
+  public void nonExistingView() throws Exception {
+    RestResponse response = adminRestSession.get("/accounts/self/non-existing");
+    assertThat(response.getStatusCode()).isEqualTo(SC_NOT_FOUND);
+    assertThat(response.getEntityContent()).isEqualTo("Not found: non-existing");
+
+    response = adminRestSession.post("/accounts/self/non-existing");
+    assertThat(response.getStatusCode()).isEqualTo(SC_NOT_FOUND);
+    assertThat(response.getEntityContent()).isEqualTo("Not found: non-existing");
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/PluginsRestApiBindingsIT.java b/javatests/com/google/gerrit/acceptance/rest/PluginsRestApiBindingsIT.java
new file mode 100644
index 0000000..07ea3d0
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/PluginsRestApiBindingsIT.java
@@ -0,0 +1,68 @@
+// 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.
+
+package com.google.gerrit.acceptance.rest;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.acceptance.GerritConfig;
+import com.google.gerrit.common.RawInputUtil;
+import com.google.gerrit.extensions.api.plugins.InstallPluginInput;
+import com.google.gerrit.extensions.restapi.RawInput;
+import org.junit.Test;
+
+/**
+ * Tests for checking the bindings of the plugins REST API.
+ *
+ * <p>These tests only verify that the plugin REST endpoints are correctly bound, they do no test
+ * the functionality of the plugin REST endpoints (for details see JavaDoc on {@link
+ * AbstractRestApiBindingsTest}).
+ */
+public class PluginsRestApiBindingsIT extends AbstractRestApiBindingsTest {
+  /**
+   * Plugin REST endpoints to be tested, each URL contains a placeholder for the plugin identifier.
+   */
+  private static final ImmutableList<RestCall> PLUGIN_ENDPOINTS =
+      ImmutableList.of(
+          RestCall.put("/plugins/%s"),
+
+          // For GET requests prefixing the view name with 'gerrit~' is required.
+          RestCall.get("/plugins/%s/gerrit~status"),
+
+          // POST (and PUT) requests don't require the 'gerrit~' prefix in front of the view name.
+          RestCall.post("/plugins/%s/gerrit~enable"),
+          RestCall.post("/plugins/%s/gerrit~disable"),
+          RestCall.post("/plugins/%s/gerrit~reload"),
+
+          // Plugin deletion must be tested last
+          RestCall.delete("/plugins/%s"));
+
+  private static final String JS_PLUGIN = "Gerrit.install(function(self){});\n";
+  private static final RawInput JS_PLUGIN_CONTENT = RawInputUtil.create(JS_PLUGIN.getBytes(UTF_8));
+
+  @Test
+  @GerritConfig(name = "plugins.allowRemoteAdmin", value = "true")
+  public void pluginEndpoints() throws Exception {
+    String pluginName = "my-plugin";
+    installPlugin(pluginName);
+    execute(PLUGIN_ENDPOINTS, pluginName);
+  }
+
+  private void installPlugin(String pluginName) throws Exception {
+    InstallPluginInput input = new InstallPluginInput();
+    input.raw = JS_PLUGIN_CONTENT;
+    gApi.plugins().install(pluginName + ".js", input);
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/ProjectsRestApiBindingsIT.java b/javatests/com/google/gerrit/acceptance/rest/ProjectsRestApiBindingsIT.java
new file mode 100644
index 0000000..6563de3
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/ProjectsRestApiBindingsIT.java
@@ -0,0 +1,248 @@
+// 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.
+
+package com.google.gerrit.acceptance.rest;
+
+import static com.google.gerrit.acceptance.GitUtil.assertPushOk;
+import static com.google.gerrit.acceptance.GitUtil.pushHead;
+import static com.google.gerrit.acceptance.rest.AbstractRestApiBindingsTest.Method.GET;
+import static com.google.gerrit.reviewdb.client.RefNames.REFS_DASHBOARDS;
+import static com.google.gerrit.server.restapi.project.DashboardsCollection.DEFAULT_DASHBOARD_NAME;
+import static org.apache.http.HttpStatus.SC_METHOD_NOT_ALLOWED;
+import static org.apache.http.HttpStatus.SC_NOT_FOUND;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.acceptance.GitUtil;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.projects.BranchInput;
+import com.google.gerrit.extensions.api.projects.TagInput;
+import com.google.gerrit.reviewdb.client.Project;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.transport.PushResult;
+import org.junit.Test;
+
+/**
+ * Tests for checking the bindings of the projects REST API.
+ *
+ * <p>These tests only verify that the project REST endpoints are correctly bound, they do no test
+ * the functionality of the project REST endpoints (for details see JavaDoc on {@link
+ * AbstractRestApiBindingsTest}).
+ */
+public class ProjectsRestApiBindingsIT extends AbstractRestApiBindingsTest {
+  private static final ImmutableList<RestCall> PROJECT_ENDPOINTS =
+      ImmutableList.of(
+          RestCall.get("/projects/%s"),
+          RestCall.put("/projects/%s"),
+          RestCall.get("/projects/%s/description"),
+          RestCall.put("/projects/%s/description"),
+          RestCall.delete("/projects/%s/description"),
+          RestCall.get("/projects/%s/parent"),
+          RestCall.put("/projects/%s/parent"),
+          RestCall.get("/projects/%s/config"),
+          RestCall.put("/projects/%s/config"),
+          RestCall.get("/projects/%s/HEAD"),
+          RestCall.put("/projects/%s/HEAD"),
+          RestCall.get("/projects/%s/access"),
+          RestCall.post("/projects/%s/access"),
+          RestCall.put("/projects/%s/access:review"),
+          RestCall.get("/projects/%s/check.access"),
+          RestCall.post("/projects/%s/check.access"),
+          RestCall.put("/projects/%s/ban"),
+          RestCall.get("/projects/%s/statistics.git"),
+          RestCall.post("/projects/%s/index"),
+          RestCall.post("/projects/%s/gc"),
+          RestCall.get("/projects/%s/children"),
+          RestCall.get("/projects/%s/branches"),
+          RestCall.post("/projects/%s/branches:delete"),
+          RestCall.put("/projects/%s/branches/new-branch"),
+          RestCall.get("/projects/%s/tags"),
+          RestCall.post("/projects/%s/tags:delete"),
+          RestCall.put("/projects/%s/tags/new-tag"),
+          RestCall.builder(GET, "/projects/%s/commits")
+              // GET /projects/<project>/branches/<branch>/commits is not implemented
+              .expectedResponseCode(SC_NOT_FOUND)
+              .build(),
+          RestCall.get("/projects/%s/dashboards"));
+
+  /**
+   * Child project REST endpoints to be tested, each URL contains placeholders for the parent
+   * project identifier and the child project identifier.
+   */
+  private static final ImmutableList<RestCall> CHILD_PROJECT_ENDPOINTS =
+      ImmutableList.of(RestCall.get("/projects/%s/children/%s"));
+
+  /**
+   * Branch REST endpoints to be tested, each URL contains placeholders for the project identifier
+   * and the branch identifier.
+   */
+  private static final ImmutableList<RestCall> BRANCH_ENDPOINTS =
+      ImmutableList.of(
+          RestCall.get("/projects/%s/branches/%s"),
+          RestCall.put("/projects/%s/branches/%s"),
+          RestCall.get("/projects/%s/branches/%s/mergeable"),
+          RestCall.builder(GET, "/projects/%s/branches/%s/reflog")
+              // The tests use DfsRepository which does not support getting the reflog.
+              .expectedResponseCode(SC_METHOD_NOT_ALLOWED)
+              .expectedMessage("reflog not supported on")
+              .build(),
+          RestCall.builder(GET, "/projects/%s/branches/%s/files")
+              // GET /projects/<project>/branches/<branch>/files is not implemented
+              .expectedResponseCode(SC_NOT_FOUND)
+              .build(),
+
+          // Branch deletion must be tested last
+          RestCall.delete("/projects/%s/branches/%s"));
+
+  /**
+   * Branch file REST endpoints to be tested, each URL contains placeholders for the project
+   * identifier, the branch identifier and the file identifier.
+   */
+  private static final ImmutableList<RestCall> BRANCH_FILE_ENDPOINTS =
+      ImmutableList.of(RestCall.get("/projects/%s/branches/%s/files/%s/content"));
+
+  /**
+   * Dashboard REST endpoints to be tested, each URL contains placeholders for the project
+   * identifier and the dashboard identifier.
+   */
+  private static final ImmutableList<RestCall> DASHBOARD_ENDPOINTS =
+      ImmutableList.of(
+          RestCall.get("/projects/%s/dashboards/%s"),
+          RestCall.put("/projects/%s/dashboards/%s"),
+
+          // Dashboard deletion must be tested last
+          RestCall.delete("/projects/%s/dashboards/%s"));
+
+  /**
+   * Tag REST endpoints to be tested, each URL contains placeholders for the project identifier and
+   * the tag identifier.
+   */
+  private static final ImmutableList<RestCall> TAG_ENDPOINTS =
+      ImmutableList.of(
+          RestCall.get("/projects/%s/tags/%s"),
+          RestCall.put("/projects/%s/tags/%s"),
+          RestCall.delete("/projects/%s/tags/%s"));
+
+  /**
+   * Commit REST endpoints to be tested, each URL contains placeholders for the project identifier
+   * and the commit identifier.
+   */
+  private static final ImmutableList<RestCall> COMMIT_ENDPOINTS =
+      ImmutableList.of(
+          RestCall.get("/projects/%s/commits/%s"),
+          RestCall.get("/projects/%s/commits/%s/in"),
+          RestCall.get("/projects/%s/commits/%s/files"),
+          RestCall.post("/projects/%s/commits/%s/cherrypick"));
+
+  /**
+   * Commit file REST endpoints to be tested, each URL contains placeholders for the project
+   * identifier, the commit identifier and the file identifier.
+   */
+  private static final ImmutableList<RestCall> COMMIT_FILE_ENDPOINTS =
+      ImmutableList.of(RestCall.get("/projects/%s/commits/%s/files/%s/content"));
+
+  private static final String FILENAME = "test.txt";
+
+  @Test
+  public void projectEndpoints() throws Exception {
+    execute(PROJECT_ENDPOINTS, project.get());
+  }
+
+  @Test
+  public void childProjectEndpoints() throws Exception {
+    Project.NameKey childProject = createProject("test-child-repo", project);
+    execute(CHILD_PROJECT_ENDPOINTS, project.get(), childProject.get());
+  }
+
+  @Test
+  public void branchEndpoints() throws Exception {
+    execute(BRANCH_ENDPOINTS, project.get(), "master");
+  }
+
+  @Test
+  public void branchFileEndpoints() throws Exception {
+    createAndSubmitChange(FILENAME);
+    execute(BRANCH_FILE_ENDPOINTS, project.get(), "master", FILENAME);
+  }
+
+  @Test
+  public void dashboardEndpoints() throws Exception {
+    createDefaultDashboard();
+    execute(DASHBOARD_ENDPOINTS, project.get(), DEFAULT_DASHBOARD_NAME);
+  }
+
+  @Test
+  public void tagEndpoints() throws Exception {
+    String tag = "test-tag";
+    gApi.projects().name(project.get()).tag(tag).create(new TagInput());
+    execute(TAG_ENDPOINTS, project.get(), tag);
+  }
+
+  @Test
+  public void commitEndpoints() throws Exception {
+    String commit = createAndSubmitChange(FILENAME);
+    execute(COMMIT_ENDPOINTS, project.get(), commit);
+  }
+
+  @Test
+  public void commitFileEndpoints() throws Exception {
+    String commit = createAndSubmitChange(FILENAME);
+    execute(COMMIT_FILE_ENDPOINTS, project.get(), commit, FILENAME);
+  }
+
+  private String createAndSubmitChange(String filename) throws Exception {
+    RevCommit c =
+        testRepo
+            .commit()
+            .message("A change")
+            .parent(getRemoteHead())
+            .add(filename, "content")
+            .insertChangeId()
+            .create();
+    String id = GitUtil.getChangeId(testRepo, c).get();
+    testRepo.reset(c);
+
+    String r = "refs/for/master";
+    PushResult pr = pushHead(testRepo, r, false);
+    assertPushOk(pr, r);
+
+    gApi.changes().id(id).current().review(ReviewInput.approve());
+    gApi.changes().id(id).current().submit();
+    return c.name();
+  }
+
+  private void createDefaultDashboard() throws Exception {
+    String dashboardRef = REFS_DASHBOARDS + "team";
+    grant(project, "refs/meta/*", Permission.CREATE);
+    gApi.projects().name(project.get()).branch(dashboardRef).create(new BranchInput());
+
+    try (Repository r = repoManager.openRepository(project)) {
+      TestRepository<Repository>.CommitBuilder cb =
+          new TestRepository<>(r).branch(dashboardRef).commit();
+      StringBuilder content = new StringBuilder("[dashboard]\n");
+      content.append("title = ").append("Open Changes").append("\n");
+      content.append("[section \"").append("open").append("\"]\n");
+      content.append("query = ").append("is:open").append("\n");
+      cb.add("overview", content.toString());
+      cb.create();
+    }
+
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      u.getConfig().getProject().setLocalDefaultDashboard(dashboardRef + ":overview");
+      u.save();
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/RootCollectionsRestApiBindingsIT.java b/javatests/com/google/gerrit/acceptance/rest/RootCollectionsRestApiBindingsIT.java
new file mode 100644
index 0000000..a2c4ea6
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/RootCollectionsRestApiBindingsIT.java
@@ -0,0 +1,56 @@
+// 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.
+
+package com.google.gerrit.acceptance.rest;
+
+import static com.google.gerrit.acceptance.rest.AbstractRestApiBindingsTest.Method.GET;
+import static org.apache.http.HttpStatus.SC_NOT_FOUND;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.acceptance.GerritConfig;
+import org.junit.Test;
+
+/**
+ * Tests for checking the bindings of the root REST API.
+ *
+ * <p>These tests only verify that the root REST endpoints are correctly bound, they do no test the
+ * functionality of the root REST endpoints (for details see JavaDoc on {@link
+ * AbstractRestApiBindingsTest}).
+ */
+public class RootCollectionsRestApiBindingsIT extends AbstractRestApiBindingsTest {
+  /** Root REST endpoints to be tested, the URLs contain no placeholders. */
+  private static final ImmutableList<RestCall> ROOT_ENDPOINTS =
+      ImmutableList.of(
+          RestCall.get("/access/"),
+          RestCall.get("/accounts/"),
+          RestCall.put("/accounts/new-account"),
+          RestCall.builder(GET, "/config/")
+              // GET /config/ is not implemented
+              .expectedResponseCode(SC_NOT_FOUND)
+              .build(),
+          RestCall.get("/changes/"),
+          RestCall.post("/changes/"),
+          RestCall.get("/groups/"),
+          RestCall.put("/groups/new-group"),
+          RestCall.get("/plugins/"),
+          RestCall.put("/plugins/new-plugin"),
+          RestCall.get("/projects/"),
+          RestCall.put("/projects/new-project"));
+
+  @Test
+  @GerritConfig(name = "plugins.allowRemoteAdmin", value = "true")
+  public void rootEndpoints() throws Exception {
+    execute(ROOT_ENDPOINTS);
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/TraceIT.java b/javatests/com/google/gerrit/acceptance/rest/TraceIT.java
new file mode 100644
index 0000000..137dc21
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/TraceIT.java
@@ -0,0 +1,299 @@
+// 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.
+
+package com.google.gerrit.acceptance.rest;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.apache.http.HttpStatus.SC_CREATED;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.truth.Expect;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import com.google.gerrit.httpd.restapi.ParameterParser;
+import com.google.gerrit.httpd.restapi.RestApiServlet;
+import com.google.gerrit.server.events.CommitReceivedEvent;
+import com.google.gerrit.server.git.WorkQueue;
+import com.google.gerrit.server.git.validators.CommitValidationException;
+import com.google.gerrit.server.git.validators.CommitValidationListener;
+import com.google.gerrit.server.git.validators.CommitValidationMessage;
+import com.google.gerrit.server.logging.LoggingContext;
+import com.google.gerrit.server.logging.TraceContext;
+import com.google.gerrit.server.project.CreateProjectArgs;
+import com.google.gerrit.server.validators.ProjectCreationValidationListener;
+import com.google.gerrit.server.validators.ValidationException;
+import com.google.inject.Inject;
+import java.util.List;
+import java.util.SortedMap;
+import java.util.SortedSet;
+import org.apache.http.message.BasicHeader;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class TraceIT extends AbstractDaemonTest {
+  @Rule public final Expect expect = Expect.create();
+
+  @Inject private DynamicSet<ProjectCreationValidationListener> projectCreationValidationListeners;
+  @Inject private DynamicSet<CommitValidationListener> commitValidationListeners;
+  @Inject private WorkQueue workQueue;
+
+  private TraceValidatingProjectCreationValidationListener projectCreationListener;
+  private RegistrationHandle projectCreationListenerRegistrationHandle;
+  private TraceValidatingCommitValidationListener commitValidationListener;
+  private RegistrationHandle commitValidationRegistrationHandle;
+
+  @Before
+  public void setup() {
+    projectCreationListener = new TraceValidatingProjectCreationValidationListener();
+    projectCreationListenerRegistrationHandle =
+        projectCreationValidationListeners.add("gerrit", projectCreationListener);
+    commitValidationListener = new TraceValidatingCommitValidationListener();
+    commitValidationRegistrationHandle =
+        commitValidationListeners.add("gerrit", commitValidationListener);
+  }
+
+  @After
+  public void cleanup() {
+    projectCreationListenerRegistrationHandle.remove();
+    commitValidationRegistrationHandle.remove();
+  }
+
+  @Test
+  public void restCallWithoutTrace() throws Exception {
+    RestResponse response = adminRestSession.put("/projects/new1");
+    assertThat(response.getStatusCode()).isEqualTo(SC_CREATED);
+    assertThat(response.getHeader(RestApiServlet.X_GERRIT_TRACE)).isNull();
+    assertThat(projectCreationListener.traceId).isNull();
+    assertThat(projectCreationListener.isLoggingForced).isFalse();
+  }
+
+  @Test
+  public void restCallWithTraceRequestParam() throws Exception {
+    RestResponse response =
+        adminRestSession.put("/projects/new2?" + ParameterParser.TRACE_PARAMETER);
+    assertThat(response.getStatusCode()).isEqualTo(SC_CREATED);
+    assertThat(response.getHeader(RestApiServlet.X_GERRIT_TRACE)).isNotNull();
+    assertThat(projectCreationListener.traceId).isNotNull();
+    assertThat(projectCreationListener.isLoggingForced).isTrue();
+  }
+
+  @Test
+  public void restCallWithTraceRequestParamAndProvidedTraceId() throws Exception {
+    RestResponse response =
+        adminRestSession.put("/projects/new3?" + ParameterParser.TRACE_PARAMETER + "=issue/123");
+    assertThat(response.getStatusCode()).isEqualTo(SC_CREATED);
+    assertThat(response.getHeader(RestApiServlet.X_GERRIT_TRACE)).isEqualTo("issue/123");
+    assertThat(projectCreationListener.traceId).isEqualTo("issue/123");
+    assertThat(projectCreationListener.isLoggingForced).isTrue();
+  }
+
+  @Test
+  public void restCallWithTraceHeader() throws Exception {
+    RestResponse response =
+        adminRestSession.putWithHeader(
+            "/projects/new4", new BasicHeader(RestApiServlet.X_GERRIT_TRACE, null));
+    assertThat(response.getStatusCode()).isEqualTo(SC_CREATED);
+    assertThat(response.getHeader(RestApiServlet.X_GERRIT_TRACE)).isNotNull();
+    assertThat(projectCreationListener.traceId).isNotNull();
+    assertThat(projectCreationListener.isLoggingForced).isTrue();
+  }
+
+  @Test
+  public void restCallWithTraceHeaderAndProvidedTraceId() throws Exception {
+    RestResponse response =
+        adminRestSession.putWithHeader(
+            "/projects/new5", new BasicHeader(RestApiServlet.X_GERRIT_TRACE, "issue/123"));
+    assertThat(response.getStatusCode()).isEqualTo(SC_CREATED);
+    assertThat(response.getHeader(RestApiServlet.X_GERRIT_TRACE)).isEqualTo("issue/123");
+    assertThat(projectCreationListener.traceId).isEqualTo("issue/123");
+    assertThat(projectCreationListener.isLoggingForced).isTrue();
+  }
+
+  @Test
+  public void restCallWithTraceRequestParamAndTraceHeader() throws Exception {
+    // trace ID only specified by trace header
+    RestResponse response =
+        adminRestSession.putWithHeader(
+            "/projects/new6?trace", new BasicHeader(RestApiServlet.X_GERRIT_TRACE, "issue/123"));
+    assertThat(response.getStatusCode()).isEqualTo(SC_CREATED);
+    assertThat(response.getHeader(RestApiServlet.X_GERRIT_TRACE)).isEqualTo("issue/123");
+    assertThat(projectCreationListener.traceId).isEqualTo("issue/123");
+    assertThat(projectCreationListener.isLoggingForced).isTrue();
+
+    // trace ID only specified by trace request parameter
+    response =
+        adminRestSession.putWithHeader(
+            "/projects/new7?trace=issue/123", new BasicHeader(RestApiServlet.X_GERRIT_TRACE, null));
+    assertThat(response.getStatusCode()).isEqualTo(SC_CREATED);
+    assertThat(response.getHeader(RestApiServlet.X_GERRIT_TRACE)).isEqualTo("issue/123");
+    assertThat(projectCreationListener.traceId).isEqualTo("issue/123");
+    assertThat(projectCreationListener.isLoggingForced).isTrue();
+
+    // same trace ID specified by trace header and trace request parameter
+    response =
+        adminRestSession.putWithHeader(
+            "/projects/new8?trace=issue/123",
+            new BasicHeader(RestApiServlet.X_GERRIT_TRACE, "issue/123"));
+    assertThat(response.getStatusCode()).isEqualTo(SC_CREATED);
+    assertThat(response.getHeader(RestApiServlet.X_GERRIT_TRACE)).isEqualTo("issue/123");
+    assertThat(projectCreationListener.traceId).isEqualTo("issue/123");
+    assertThat(projectCreationListener.isLoggingForced).isTrue();
+
+    // different trace IDs specified by trace header and trace request parameter
+    response =
+        adminRestSession.putWithHeader(
+            "/projects/new9?trace=issue/123",
+            new BasicHeader(RestApiServlet.X_GERRIT_TRACE, "issue/456"));
+    assertThat(response.getStatusCode()).isEqualTo(SC_CREATED);
+    assertThat(response.getHeaders(RestApiServlet.X_GERRIT_TRACE))
+        .containsExactly("issue/123", "issue/456");
+    assertThat(projectCreationListener.traceIds).containsExactly("issue/123", "issue/456");
+    assertThat(projectCreationListener.isLoggingForced).isTrue();
+  }
+
+  @Test
+  public void pushWithoutTrace() throws Exception {
+    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
+    PushOneCommit.Result r = push.to("refs/heads/master");
+    r.assertOkStatus();
+    assertThat(commitValidationListener.traceId).isNull();
+    assertThat(commitValidationListener.isLoggingForced).isFalse();
+  }
+
+  @Test
+  public void pushWithTrace() throws Exception {
+    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
+    push.setPushOptions(ImmutableList.of("trace"));
+    PushOneCommit.Result r = push.to("refs/heads/master");
+    r.assertOkStatus();
+    assertThat(commitValidationListener.traceId).isNotNull();
+    assertThat(commitValidationListener.isLoggingForced).isTrue();
+  }
+
+  @Test
+  public void pushWithTraceAndProvidedTraceId() throws Exception {
+    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
+    push.setPushOptions(ImmutableList.of("trace=issue/123"));
+    PushOneCommit.Result r = push.to("refs/heads/master");
+    r.assertOkStatus();
+    assertThat(commitValidationListener.traceId).isEqualTo("issue/123");
+    assertThat(commitValidationListener.isLoggingForced).isTrue();
+  }
+
+  @Test
+  public void pushForReviewWithoutTrace() throws Exception {
+    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
+    PushOneCommit.Result r = push.to("refs/for/master");
+    r.assertOkStatus();
+    assertThat(commitValidationListener.traceId).isNull();
+    assertThat(commitValidationListener.isLoggingForced).isFalse();
+  }
+
+  @Test
+  public void pushForReviewWithTrace() throws Exception {
+    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
+    push.setPushOptions(ImmutableList.of("trace"));
+    PushOneCommit.Result r = push.to("refs/for/master");
+    r.assertOkStatus();
+    assertThat(commitValidationListener.traceId).isNotNull();
+    assertThat(commitValidationListener.isLoggingForced).isTrue();
+  }
+
+  @Test
+  public void pushForReviewWithTraceAndProvidedTraceId() throws Exception {
+    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
+    push.setPushOptions(ImmutableList.of("trace=issue/123"));
+    PushOneCommit.Result r = push.to("refs/for/master");
+    r.assertOkStatus();
+    assertThat(commitValidationListener.traceId).isEqualTo("issue/123");
+    assertThat(commitValidationListener.isLoggingForced).isTrue();
+  }
+
+  @Test
+  public void workQueueCopyLoggingContext() throws Exception {
+    assertThat(LoggingContext.getInstance().getTags().isEmpty()).isTrue();
+    assertForceLogging(false);
+    try (TraceContext traceContext = TraceContext.open().forceLogging().addTag("foo", "bar")) {
+      SortedMap<String, SortedSet<Object>> tagMap = LoggingContext.getInstance().getTags().asMap();
+      assertThat(tagMap.keySet()).containsExactly("foo");
+      assertThat(tagMap.get("foo")).containsExactly("bar");
+      assertForceLogging(true);
+
+      workQueue
+          .createQueue(1, "test-queue")
+          .submit(
+              () -> {
+                // Verify that the tags and force logging flag have been propagated to the new
+                // thread.
+                SortedMap<String, SortedSet<Object>> threadTagMap =
+                    LoggingContext.getInstance().getTags().asMap();
+                expect.that(threadTagMap.keySet()).containsExactly("foo");
+                expect.that(threadTagMap.get("foo")).containsExactly("bar");
+                expect
+                    .that(LoggingContext.getInstance().shouldForceLogging(null, null, false))
+                    .isTrue();
+              })
+          .get();
+
+      // Verify that tags and force logging flag in the outer thread are still set.
+      tagMap = LoggingContext.getInstance().getTags().asMap();
+      assertThat(tagMap.keySet()).containsExactly("foo");
+      assertThat(tagMap.get("foo")).containsExactly("bar");
+      assertForceLogging(true);
+    }
+    assertThat(LoggingContext.getInstance().getTags().isEmpty()).isTrue();
+    assertForceLogging(false);
+  }
+
+  private void assertForceLogging(boolean expected) {
+    assertThat(LoggingContext.getInstance().shouldForceLogging(null, null, false))
+        .isEqualTo(expected);
+  }
+
+  private static class TraceValidatingProjectCreationValidationListener
+      implements ProjectCreationValidationListener {
+    String traceId;
+    ImmutableSet<String> traceIds;
+    Boolean isLoggingForced;
+
+    @Override
+    public void validateNewProject(CreateProjectArgs args) throws ValidationException {
+      this.traceId =
+          Iterables.getFirst(LoggingContext.getInstance().getTagsAsMap().get("TRACE_ID"), null);
+      this.traceIds = LoggingContext.getInstance().getTagsAsMap().get("TRACE_ID");
+      this.isLoggingForced = LoggingContext.getInstance().shouldForceLogging(null, null, false);
+    }
+  }
+
+  private static class TraceValidatingCommitValidationListener implements CommitValidationListener {
+    String traceId;
+    Boolean isLoggingForced;
+
+    @Override
+    public List<CommitValidationMessage> onCommitReceived(CommitReceivedEvent receiveEvent)
+        throws CommitValidationException {
+      this.traceId =
+          Iterables.getFirst(LoggingContext.getInstance().getTagsAsMap().get("TRACE_ID"), null);
+      this.isLoggingForced = LoggingContext.getInstance().shouldForceLogging(null, null, false);
+      return ImmutableList.of();
+    }
+  }
+}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/AccountAssert.java b/javatests/com/google/gerrit/acceptance/rest/account/AccountAssert.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/AccountAssert.java
rename to javatests/com/google/gerrit/acceptance/rest/account/AccountAssert.java
diff --git a/javatests/com/google/gerrit/acceptance/rest/account/BUILD b/javatests/com/google/gerrit/acceptance/rest/account/BUILD
new file mode 100644
index 0000000..433b854
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/account/BUILD
@@ -0,0 +1,24 @@
+load("//javatests/com/google/gerrit/acceptance:tests.bzl", "acceptance_tests")
+
+acceptance_tests(
+    srcs = glob(["*IT.java"]),
+    group = "rest_account",
+    labels = ["rest"],
+    deps = [":util"],
+)
+
+java_library(
+    name = "util",
+    testonly = True,
+    srcs = [
+        "AccountAssert.java",
+        "CapabilityInfo.java",
+    ],
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/acceptance:lib",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//lib:gwtorm",
+        "//lib:junit",
+    ],
+)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/CapabilitiesIT.java b/javatests/com/google/gerrit/acceptance/rest/account/CapabilitiesIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/CapabilitiesIT.java
rename to javatests/com/google/gerrit/acceptance/rest/account/CapabilitiesIT.java
diff --git a/javatests/com/google/gerrit/acceptance/rest/account/CapabilityInfo.java b/javatests/com/google/gerrit/acceptance/rest/account/CapabilityInfo.java
new file mode 100644
index 0000000..1ca019e
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/account/CapabilityInfo.java
@@ -0,0 +1,51 @@
+// Copyright (C) 2013 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.google.gerrit.acceptance.rest.account;
+
+class CapabilityInfo {
+  public boolean accessDatabase;
+  public boolean administrateServer;
+  public BatchChangesLimit batchChangesLimit;
+  public boolean createAccount;
+  public boolean createGroup;
+  public boolean createProject;
+  public boolean emailReviewers;
+  public boolean flushCaches;
+  public boolean killTask;
+  public boolean maintainServer;
+  public boolean modifyAccount;
+  public boolean priority;
+  public QueryLimit queryLimit;
+  public boolean readAs;
+  public boolean runAs;
+  public boolean runGC;
+  public boolean streamEvents;
+  public boolean viewAllAccounts;
+  public boolean viewCaches;
+  public boolean viewConnections;
+  public boolean viewPlugins;
+  public boolean viewQueue;
+  public boolean viewAccess;
+
+  static class QueryLimit {
+    short min;
+    short max;
+  }
+
+  static class BatchChangesLimit {
+    short min;
+    short max;
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/account/CreateAccountIT.java b/javatests/com/google/gerrit/acceptance/rest/account/CreateAccountIT.java
new file mode 100644
index 0000000..aca6c4c
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/account/CreateAccountIT.java
@@ -0,0 +1,34 @@
+// 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.
+
+package com.google.gerrit.acceptance.rest.account;
+
+import static com.google.common.truth.Truth8.assertThat;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.extensions.api.accounts.AccountInput;
+import org.junit.Test;
+
+public class CreateAccountIT extends AbstractDaemonTest {
+  @Test
+  public void createAccountRestApi() throws Exception {
+    AccountInput input = new AccountInput();
+    input.username = "foo";
+    assertThat(accountCache.getByUsername(input.username)).isEmpty();
+    RestResponse r = adminRestSession.put("/accounts/" + input.username, input);
+    r.assertCreated();
+    assertThat(accountCache.getByUsername(input.username)).isPresent();
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/account/EmailIT.java b/javatests/com/google/gerrit/acceptance/rest/account/EmailIT.java
new file mode 100644
index 0000000..f3fe68a
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/account/EmailIT.java
@@ -0,0 +1,305 @@
+// Copyright (C) 2017 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.google.gerrit.acceptance.rest.account;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth8.assertThat;
+import static java.util.stream.Collectors.toSet;
+
+import com.google.common.collect.ImmutableMultimap;
+import com.google.common.collect.Multimap;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.AcceptanceTestRequestScope.Context;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.extensions.api.accounts.EmailApi;
+import com.google.gerrit.extensions.api.accounts.EmailInput;
+import com.google.gerrit.extensions.common.EmailInfo;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.ServerInitiated;
+import com.google.gerrit.server.account.AccountsUpdate;
+import com.google.gerrit.server.account.DefaultRealm;
+import com.google.gerrit.server.account.EmailExpander;
+import com.google.gerrit.server.account.Emails;
+import com.google.gerrit.server.account.Realm;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.account.externalids.ExternalIds;
+import com.google.gerrit.server.config.AnonymousCowardName;
+import com.google.gerrit.server.config.AuthConfig;
+import com.google.gerrit.server.config.CanonicalWebUrl;
+import com.google.gerrit.server.config.DisableReverseDnsLookup;
+import com.google.gson.reflect.TypeToken;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import org.junit.Test;
+
+public class EmailIT extends AbstractDaemonTest {
+  @Inject private @ServerInitiated Provider<AccountsUpdate> accountsUpdateProvider;
+  @Inject private ExternalIds externalIds;
+  @Inject private SchemaFactory<ReviewDb> reviewDbProvider;
+  @Inject private AuthConfig authConfig;
+  @Inject private @AnonymousCowardName String anonymousCowardName;
+  @Inject private @CanonicalWebUrl Provider<String> canonicalUrl;
+  @Inject private @DisableReverseDnsLookup Boolean disableReverseDnsLookup;
+  @Inject private EmailExpander emailExpander;
+  @Inject private Provider<Emails> emails;
+
+  @Test
+  public void addEmail() throws Exception {
+    String email = "foo.bar@example.com";
+    assertThat(getEmails()).doesNotContain(email);
+
+    createEmail(email);
+    assertThat(getEmails()).contains(email);
+  }
+
+  @Test
+  public void addUrlEncodedEmail() throws Exception {
+    String email = "foo.bar2@example.com";
+    assertThat(getEmails()).doesNotContain(email);
+
+    createEmail(email.replace("@", "%40"));
+    assertThat(getEmails()).contains(email);
+  }
+
+  @Test
+  public void addEmailWithLeadingAndTrailingWhitespace() throws Exception {
+    String email = "foo.bar3@example.com";
+    assertThat(getEmails()).doesNotContain(email);
+
+    createEmail(IdString.fromDecoded(" " + email + " ").encoded());
+    assertThat(getEmails()).contains(email);
+  }
+
+  @Test
+  public void deleteEmail() throws Exception {
+    String email = "foo.baz@example.com";
+    assertThat(getEmails()).doesNotContain(email);
+
+    createEmail(email);
+    assertThat(getEmails()).contains(email);
+
+    RestResponse r = adminRestSession.delete("/accounts/self/emails/" + email);
+    r.assertNoContent();
+    assertThat(getEmails()).doesNotContain(email);
+  }
+
+  @Test
+  public void deleteUrlEncodedEmail() throws Exception {
+    String email = "foo.baz2@example.com";
+    assertThat(getEmails()).doesNotContain(email);
+
+    createEmail(email);
+    assertThat(getEmails()).contains(email);
+
+    RestResponse r = adminRestSession.delete("/accounts/self/emails/" + email.replace("@", "%40"));
+    r.assertNoContent();
+    assertThat(getEmails()).doesNotContain(email);
+  }
+
+  @Test
+  public void setPreferredEmailToEmailOfMailToExternalId() throws Exception {
+    String email = "foo@example.com";
+    createEmail(email);
+    assertThat(gApi.accounts().self().get().email).isNotEqualTo(email);
+
+    resetCurrentApiUser();
+    gApi.accounts().self().email(email).setPreferred();
+    assertThat(gApi.accounts().self().get().email).isEqualTo(email);
+  }
+
+  @Test
+  public void setPreferredEmailToEmailOfExternalExternalId() throws Exception {
+    String email = "foo@example.com";
+    accountsUpdateProvider
+        .get()
+        .update(
+            "Add External ID",
+            admin.id,
+            u ->
+                u.addExternalId(
+                    ExternalId.createWithEmail(
+                        ExternalId.SCHEME_EXTERNAL, "foo", admin.id, email)));
+    assertThat(gApi.accounts().self().get().email).isNotEqualTo(email);
+
+    resetCurrentApiUser();
+    gApi.accounts().self().email(email).setPreferred();
+    assertThat(gApi.accounts().self().get().email).isEqualTo(email);
+  }
+
+  @Test
+  public void setPreferredEmailToNonExistingEmail() throws Exception {
+    String email = "non-existing@example.com";
+    exception.expect(ResourceNotFoundException.class);
+    exception.expectMessage("Not found: " + email);
+    gApi.accounts().self().email(email).setPreferred();
+  }
+
+  @Test
+  public void setPreferredEmailToEmailOfOtherAccount() throws Exception {
+    exception.expect(ResourceNotFoundException.class);
+    exception.expectMessage("Not found: " + user.email);
+    gApi.accounts().self().email(user.email).setPreferred();
+  }
+
+  @Test
+  public void setPreferredEmailWithOtherCase() throws Exception {
+    String email = "foo@example.com";
+    createEmail(email);
+    assertThat(gApi.accounts().self().get().email).isNotEqualTo(email);
+
+    resetCurrentApiUser();
+    String emailOtherCase = email.toUpperCase();
+    gApi.accounts().self().email(emailOtherCase).setPreferred();
+    assertThat(gApi.accounts().self().get().email).isEqualTo(email);
+  }
+
+  @Test
+  public void setPreferredEmailToEmailFromCustomRealmThatDoesntExistAsExternalId()
+      throws Exception {
+    String email = "foo@example.com";
+    ExternalId.Key mailtoExtIdKey = ExternalId.Key.create(ExternalId.SCHEME_MAILTO, email);
+    assertThat(externalIds.get(mailtoExtIdKey)).isEmpty();
+    assertThat(gApi.accounts().self().get().email).isNotEqualTo(email);
+
+    Context oldCtx = createContextWithCustomRealm(new RealmWithAdditionalEmails(admin.id, email));
+    try {
+      gApi.accounts().self().email(email).setPreferred();
+      Optional<ExternalId> mailtoExtId = externalIds.get(mailtoExtIdKey);
+      assertThat(mailtoExtId).isPresent();
+      assertThat(mailtoExtId.get().accountId()).isEqualTo(admin.id);
+      assertThat(gApi.accounts().self().get().email).isEqualTo(email);
+    } finally {
+      atrScope.set(oldCtx);
+    }
+  }
+
+  @Test
+  public void setPreferredEmailToEmailFromCustomRealmThatBelongsToOtherAccount() throws Exception {
+    ExternalId mailToExtId = ExternalId.createEmail(user.id, user.email);
+    assertThat(externalIds.get(mailToExtId.key())).isPresent();
+
+    Context oldCtx =
+        createContextWithCustomRealm(new RealmWithAdditionalEmails(admin.id, user.email));
+    try {
+      exception.expect(ResourceConflictException.class);
+      exception.expectMessage("email in use by another account");
+      gApi.accounts().self().email(user.email).setPreferred();
+    } finally {
+      atrScope.set(oldCtx);
+    }
+  }
+
+  @Test
+  public void emailApi() throws Exception {
+    String email = "foo@example.com";
+    assertThat(getEmails()).doesNotContain(email);
+
+    // Create email
+    EmailInput emailInput = new EmailInput();
+    emailInput.email = email;
+    emailInput.noConfirmation = true;
+    gApi.accounts().self().createEmail(emailInput);
+    assertThat(getEmails()).contains(email);
+    assertThat(gApi.accounts().self().get().email).isNotEqualTo(email);
+
+    // Get email
+    resetCurrentApiUser();
+    EmailApi emailApi = gApi.accounts().self().email(email);
+    EmailInfo emailInfo = emailApi.get();
+    assertThat(emailInfo.email).isEqualTo(email);
+    assertThat(emailInfo.preferred).isNull();
+    assertThat(emailInfo.pendingConfirmation).isNull();
+
+    // Set as preferred email
+    emailApi.setPreferred();
+    assertThat(gApi.accounts().self().get().email).isEqualTo(email);
+
+    // Get email again (now it's the preferred email)
+    resetCurrentApiUser();
+    emailApi = gApi.accounts().self().email(email);
+    emailInfo = emailApi.get();
+    assertThat(emailInfo.email).isEqualTo(email);
+    assertThat(emailInfo.preferred).isTrue();
+    assertThat(emailInfo.pendingConfirmation).isNull();
+
+    // Delete email
+    emailApi.delete();
+    assertThat(getEmails()).doesNotContain(email);
+
+    // Now the email is no longer found
+    resetCurrentApiUser();
+    emailApi = gApi.accounts().self().email(email);
+    exception.expect(ResourceNotFoundException.class);
+    emailApi.get();
+  }
+
+  private Set<String> getEmails() throws Exception {
+    RestResponse r = adminRestSession.get("/accounts/self/emails");
+    r.assertOK();
+    List<EmailInfo> emails =
+        newGson().fromJson(r.getReader(), new TypeToken<List<EmailInfo>>() {}.getType());
+    return emails.stream().map(e -> e.email).collect(toSet());
+  }
+
+  private void createEmail(String email) throws Exception {
+    EmailInput input = new EmailInput();
+    input.noConfirmation = true;
+    RestResponse r = adminRestSession.put("/accounts/self/emails/" + email, input);
+    r.assertCreated();
+  }
+
+  private Context createContextWithCustomRealm(Realm realm) {
+    IdentifiedUser.GenericFactory userFactory =
+        new IdentifiedUser.GenericFactory(
+            authConfig,
+            realm,
+            anonymousCowardName,
+            canonicalUrl,
+            disableReverseDnsLookup,
+            accountCache,
+            groupBackend);
+    return atrScope.set(atrScope.newContext(reviewDbProvider, null, userFactory.create(admin.id)));
+  }
+
+  private class RealmWithAdditionalEmails extends DefaultRealm {
+    private final Multimap<Account.Id, String> additionalEmails;
+
+    public RealmWithAdditionalEmails(Account.Id accountId, String email) {
+      this(ImmutableMultimap.of(accountId, email));
+    }
+
+    public RealmWithAdditionalEmails(Multimap<Account.Id, String> additionalEmails) {
+      super(emailExpander, emails, authConfig);
+      this.additionalEmails = additionalEmails;
+    }
+
+    @Override
+    public boolean hasEmailAddress(IdentifiedUser user, String email) {
+      if (additionalEmails.containsEntry(user.getAccountId(), email)) {
+        return true;
+      }
+      return super.hasEmailAddress(user, email);
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/account/ExternalIdIT.java b/javatests/com/google/gerrit/acceptance/rest/account/ExternalIdIT.java
new file mode 100644
index 0000000..b74a0d7
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/account/ExternalIdIT.java
@@ -0,0 +1,995 @@
+// Copyright (C) 2017 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.google.gerrit.acceptance.rest.account;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth8.assertThat;
+import static com.google.gerrit.acceptance.GitUtil.fetch;
+import static com.google.gerrit.acceptance.GitUtil.pushHead;
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_MAILTO;
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_USERNAME;
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_UUID;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.stream.Collectors.toList;
+import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
+import static org.eclipse.jgit.lib.Constants.OBJ_TREE;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.acceptance.TestAccount;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo;
+import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo.ConsistencyProblemInfo;
+import com.google.gerrit.extensions.api.config.ConsistencyCheckInput;
+import com.google.gerrit.extensions.api.config.ConsistencyCheckInput.CheckAccountExternalIdsInput;
+import com.google.gerrit.extensions.common.AccountExternalIdInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.ServerInitiated;
+import com.google.gerrit.server.account.AccountsUpdate;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.account.externalids.ExternalIdNotes;
+import com.google.gerrit.server.account.externalids.ExternalIdReader;
+import com.google.gerrit.server.account.externalids.ExternalIds;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gson.reflect.TypeToken;
+import com.google.gwtorm.server.OrmDuplicateKeyException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Optional;
+import java.util.Set;
+import org.eclipse.jgit.api.errors.TransportException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.notes.NoteMap;
+import org.eclipse.jgit.revwalk.FooterLine;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.PushResult;
+import org.eclipse.jgit.transport.RemoteRefUpdate;
+import org.eclipse.jgit.transport.RemoteRefUpdate.Status;
+import org.eclipse.jgit.util.MutableInteger;
+import org.junit.Test;
+
+public class ExternalIdIT extends AbstractDaemonTest {
+  @Inject @ServerInitiated private Provider<AccountsUpdate> accountsUpdateProvider;
+  @Inject private ExternalIds externalIds;
+  @Inject private ExternalIdReader externalIdReader;
+  @Inject private ExternalIdNotes.Factory externalIdNotesFactory;
+
+  @Test
+  public void getExternalIds() throws Exception {
+    Collection<ExternalId> expectedIds = getAccountState(user.getId()).getExternalIds();
+    List<AccountExternalIdInfo> expectedIdInfos = toExternalIdInfos(expectedIds);
+
+    RestResponse response = userRestSession.get("/accounts/self/external.ids");
+    response.assertOK();
+
+    List<AccountExternalIdInfo> results =
+        newGson()
+            .fromJson(
+                response.getReader(), new TypeToken<List<AccountExternalIdInfo>>() {}.getType());
+
+    assertThat(results).containsExactlyElementsIn(expectedIdInfos);
+  }
+
+  @Test
+  public void getExternalIdsOfOtherUserNotAllowed() throws Exception {
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    exception.expectMessage("access database not permitted");
+    gApi.accounts().id(admin.id.get()).getExternalIds();
+  }
+
+  @Test
+  public void getExternalIdsOfOtherUserWithAccessDatabase() throws Exception {
+    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
+
+    Collection<ExternalId> expectedIds = getAccountState(admin.getId()).getExternalIds();
+    List<AccountExternalIdInfo> expectedIdInfos = toExternalIdInfos(expectedIds);
+
+    RestResponse response = userRestSession.get("/accounts/" + admin.id + "/external.ids");
+    response.assertOK();
+
+    List<AccountExternalIdInfo> results =
+        newGson()
+            .fromJson(
+                response.getReader(), new TypeToken<List<AccountExternalIdInfo>>() {}.getType());
+
+    assertThat(results).containsExactlyElementsIn(expectedIdInfos);
+  }
+
+  @Test
+  public void deleteExternalIds() throws Exception {
+    setApiUser(user);
+    List<AccountExternalIdInfo> externalIds = gApi.accounts().self().getExternalIds();
+
+    List<String> toDelete = new ArrayList<>();
+    List<AccountExternalIdInfo> expectedIds = new ArrayList<>();
+    for (AccountExternalIdInfo id : externalIds) {
+      if (id.canDelete != null && id.canDelete) {
+        toDelete.add(id.identity);
+        continue;
+      }
+      expectedIds.add(id);
+    }
+
+    assertThat(toDelete).hasSize(1);
+
+    RestResponse response = userRestSession.post("/accounts/self/external.ids:delete", toDelete);
+    response.assertNoContent();
+    List<AccountExternalIdInfo> results = gApi.accounts().self().getExternalIds();
+    // The external ID in WebSession will not be set for tests, resulting that
+    // "mailto:user@example.com" can be deleted while "username:user" can't.
+    assertThat(results).hasSize(1);
+    assertThat(results).containsExactlyElementsIn(expectedIds);
+  }
+
+  @Test
+  public void deleteExternalIdsOfOtherUserNotAllowed() throws Exception {
+    List<AccountExternalIdInfo> extIds = gApi.accounts().self().getExternalIds();
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    exception.expectMessage("access database not permitted");
+    gApi.accounts()
+        .id(admin.id.get())
+        .deleteExternalIds(extIds.stream().map(e -> e.identity).collect(toList()));
+  }
+
+  @Test
+  public void deleteExternalIdOfOtherUserUnderOwnAccount_UnprocessableEntity() throws Exception {
+    List<AccountExternalIdInfo> extIds = gApi.accounts().self().getExternalIds();
+    setApiUser(user);
+    exception.expect(UnprocessableEntityException.class);
+    exception.expectMessage(String.format("External id %s does not exist", extIds.get(0).identity));
+    gApi.accounts()
+        .self()
+        .deleteExternalIds(extIds.stream().map(e -> e.identity).collect(toList()));
+  }
+
+  @Test
+  public void deleteExternalIdsOfOtherUserWithAccessDatabase() throws Exception {
+    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
+
+    List<AccountExternalIdInfo> externalIds = gApi.accounts().self().getExternalIds();
+
+    List<String> toDelete = new ArrayList<>();
+    List<AccountExternalIdInfo> expectedIds = new ArrayList<>();
+    for (AccountExternalIdInfo id : externalIds) {
+      if (id.canDelete != null && id.canDelete) {
+        toDelete.add(id.identity);
+        continue;
+      }
+      expectedIds.add(id);
+    }
+
+    assertThat(toDelete).hasSize(1);
+
+    setApiUser(user);
+    RestResponse response =
+        userRestSession.post("/accounts/" + admin.id + "/external.ids:delete", toDelete);
+    response.assertNoContent();
+    List<AccountExternalIdInfo> results = gApi.accounts().id(admin.id.get()).getExternalIds();
+    // The external ID in WebSession will not be set for tests, resulting that
+    // "mailto:user@example.com" can be deleted while "username:user" can't.
+    assertThat(results).hasSize(1);
+    assertThat(results).containsExactlyElementsIn(expectedIds);
+  }
+
+  @Test
+  public void deleteExternalIdOfPreferredEmail() throws Exception {
+    String preferredEmail = gApi.accounts().self().get().email;
+    assertThat(preferredEmail).isNotNull();
+
+    gApi.accounts()
+        .self()
+        .deleteExternalIds(
+            ImmutableList.of(ExternalId.Key.create(SCHEME_MAILTO, preferredEmail).get()));
+    assertThat(gApi.accounts().self().get().email).isNull();
+  }
+
+  @Test
+  public void deleteExternalIds_Conflict() throws Exception {
+    List<String> toDelete = new ArrayList<>();
+    String externalIdStr = "username:" + user.username;
+    toDelete.add(externalIdStr);
+    RestResponse response = userRestSession.post("/accounts/self/external.ids:delete", toDelete);
+    response.assertConflict();
+    assertThat(response.getEntityContent())
+        .isEqualTo(String.format("External id %s cannot be deleted", externalIdStr));
+  }
+
+  @Test
+  public void deleteExternalIds_UnprocessableEntity() throws Exception {
+    List<String> toDelete = new ArrayList<>();
+    String externalIdStr = "mailto:user@domain.com";
+    toDelete.add(externalIdStr);
+    RestResponse response = userRestSession.post("/accounts/self/external.ids:delete", toDelete);
+    response.assertUnprocessableEntity();
+    assertThat(response.getEntityContent())
+        .isEqualTo(String.format("External id %s does not exist", externalIdStr));
+  }
+
+  @Test
+  public void fetchExternalIdsBranch() throws Exception {
+    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers, user);
+
+    // refs/meta/external-ids is only visible to users with the 'Access Database' capability
+    try {
+      fetch(allUsersRepo, RefNames.REFS_EXTERNAL_IDS);
+      fail("expected TransportException");
+    } catch (TransportException e) {
+      assertThat(e.getMessage())
+          .isEqualTo(
+              "Remote does not have " + RefNames.REFS_EXTERNAL_IDS + " available for fetch.");
+    }
+
+    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
+
+    // re-clone to get new request context, otherwise the old global capabilities are still cached
+    // in the IdentifiedUser object
+    allUsersRepo = cloneProject(allUsers, user);
+    fetch(allUsersRepo, RefNames.REFS_EXTERNAL_IDS);
+  }
+
+  @Test
+  public void pushToExternalIdsBranch() throws Exception {
+    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
+
+    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
+    fetch(allUsersRepo, RefNames.REFS_EXTERNAL_IDS + ":" + RefNames.REFS_EXTERNAL_IDS);
+    allUsersRepo.reset(RefNames.REFS_EXTERNAL_IDS);
+
+    // different case email is allowed
+    ExternalId newExtId = createExternalIdWithOtherCaseEmail("foo:bar");
+    addExtId(allUsersRepo, newExtId);
+    allUsersRepo.reset(RefNames.REFS_EXTERNAL_IDS);
+
+    List<AccountExternalIdInfo> extIdsBefore = gApi.accounts().self().getExternalIds();
+
+    allowPushOfExternalIds();
+    PushResult r = pushHead(allUsersRepo, RefNames.REFS_EXTERNAL_IDS);
+    assertThat(r.getRemoteUpdate(RefNames.REFS_EXTERNAL_IDS).getStatus()).isEqualTo(Status.OK);
+
+    List<AccountExternalIdInfo> extIdsAfter = gApi.accounts().self().getExternalIds();
+    assertThat(extIdsAfter)
+        .containsExactlyElementsIn(
+            Iterables.concat(extIdsBefore, ImmutableSet.of(toExternalIdInfo(newExtId))));
+  }
+
+  @Test
+  public void pushToExternalIdsBranchRejectsExternalIdWithoutAccountId() throws Exception {
+    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
+
+    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
+    fetch(allUsersRepo, RefNames.REFS_EXTERNAL_IDS + ":" + RefNames.REFS_EXTERNAL_IDS);
+    allUsersRepo.reset(RefNames.REFS_EXTERNAL_IDS);
+
+    insertExternalIdWithoutAccountId(
+        allUsersRepo.getRepository(), allUsersRepo.getRevWalk(), "foo:bar");
+    allUsersRepo.reset(RefNames.REFS_EXTERNAL_IDS);
+
+    allowPushOfExternalIds();
+    PushResult r = pushHead(allUsersRepo, RefNames.REFS_EXTERNAL_IDS);
+    assertRefUpdateFailure(r.getRemoteUpdate(RefNames.REFS_EXTERNAL_IDS), "invalid external IDs");
+  }
+
+  @Test
+  public void pushToExternalIdsBranchRejectsExternalIdWithKeyThatDoesntMatchTheNoteId()
+      throws Exception {
+    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
+
+    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
+    fetch(allUsersRepo, RefNames.REFS_EXTERNAL_IDS + ":" + RefNames.REFS_EXTERNAL_IDS);
+    allUsersRepo.reset(RefNames.REFS_EXTERNAL_IDS);
+
+    insertExternalIdWithKeyThatDoesntMatchNoteId(
+        allUsersRepo.getRepository(), allUsersRepo.getRevWalk(), "foo:bar");
+    allUsersRepo.reset(RefNames.REFS_EXTERNAL_IDS);
+
+    allowPushOfExternalIds();
+    PushResult r = pushHead(allUsersRepo, RefNames.REFS_EXTERNAL_IDS);
+    assertRefUpdateFailure(r.getRemoteUpdate(RefNames.REFS_EXTERNAL_IDS), "invalid external IDs");
+  }
+
+  @Test
+  public void pushToExternalIdsBranchRejectsExternalIdWithInvalidConfig() throws Exception {
+    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
+
+    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
+    fetch(allUsersRepo, RefNames.REFS_EXTERNAL_IDS + ":" + RefNames.REFS_EXTERNAL_IDS);
+    allUsersRepo.reset(RefNames.REFS_EXTERNAL_IDS);
+
+    insertExternalIdWithInvalidConfig(
+        allUsersRepo.getRepository(), allUsersRepo.getRevWalk(), "foo:bar");
+    allUsersRepo.reset(RefNames.REFS_EXTERNAL_IDS);
+
+    allowPushOfExternalIds();
+    PushResult r = pushHead(allUsersRepo, RefNames.REFS_EXTERNAL_IDS);
+    assertRefUpdateFailure(r.getRemoteUpdate(RefNames.REFS_EXTERNAL_IDS), "invalid external IDs");
+  }
+
+  @Test
+  public void pushToExternalIdsBranchRejectsExternalIdWithEmptyNote() throws Exception {
+    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
+
+    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
+    fetch(allUsersRepo, RefNames.REFS_EXTERNAL_IDS + ":" + RefNames.REFS_EXTERNAL_IDS);
+    allUsersRepo.reset(RefNames.REFS_EXTERNAL_IDS);
+
+    insertExternalIdWithEmptyNote(
+        allUsersRepo.getRepository(), allUsersRepo.getRevWalk(), "foo:bar");
+    allUsersRepo.reset(RefNames.REFS_EXTERNAL_IDS);
+
+    allowPushOfExternalIds();
+    PushResult r = pushHead(allUsersRepo, RefNames.REFS_EXTERNAL_IDS);
+    assertRefUpdateFailure(r.getRemoteUpdate(RefNames.REFS_EXTERNAL_IDS), "invalid external IDs");
+  }
+
+  @Test
+  public void pushToExternalIdsBranchRejectsExternalIdForNonExistingAccount() throws Exception {
+    testPushToExternalIdsBranchRejectsInvalidExternalId(
+        createExternalIdForNonExistingAccount("foo:bar"));
+  }
+
+  @Test
+  public void pushToExternalIdsBranchRejectsExternalIdWithInvalidEmail() throws Exception {
+    testPushToExternalIdsBranchRejectsInvalidExternalId(
+        createExternalIdWithInvalidEmail("foo:bar"));
+  }
+
+  @Test
+  public void pushToExternalIdsBranchRejectsDuplicateEmails() throws Exception {
+    testPushToExternalIdsBranchRejectsInvalidExternalId(
+        createExternalIdWithDuplicateEmail("foo:bar"));
+  }
+
+  @Test
+  public void pushToExternalIdsBranchRejectsBadPassword() throws Exception {
+    testPushToExternalIdsBranchRejectsInvalidExternalId(createExternalIdWithBadPassword("foo"));
+  }
+
+  private void testPushToExternalIdsBranchRejectsInvalidExternalId(ExternalId invalidExtId)
+      throws Exception {
+    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
+
+    TestRepository<InMemoryRepository> allUsersRepo = cloneProject(allUsers);
+    fetch(allUsersRepo, RefNames.REFS_EXTERNAL_IDS + ":" + RefNames.REFS_EXTERNAL_IDS);
+    allUsersRepo.reset(RefNames.REFS_EXTERNAL_IDS);
+
+    addExtId(allUsersRepo, invalidExtId);
+    allUsersRepo.reset(RefNames.REFS_EXTERNAL_IDS);
+
+    allowPushOfExternalIds();
+    PushResult r = pushHead(allUsersRepo, RefNames.REFS_EXTERNAL_IDS);
+    assertRefUpdateFailure(r.getRemoteUpdate(RefNames.REFS_EXTERNAL_IDS), "invalid external IDs");
+  }
+
+  @Test
+  public void readExternalIdsWhenInvalidExternalIdsExist() throws Exception {
+    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
+    resetCurrentApiUser();
+
+    insertValidExternalIds();
+    insertInvalidButParsableExternalIds();
+
+    Set<ExternalId> parseableExtIds = externalIds.all();
+
+    insertNonParsableExternalIds();
+
+    Set<ExternalId> extIds = externalIds.all();
+    assertThat(extIds).containsExactlyElementsIn(parseableExtIds);
+
+    for (ExternalId parseableExtId : parseableExtIds) {
+      Optional<ExternalId> extId = externalIds.get(parseableExtId.key());
+      assertThat(extId).hasValue(parseableExtId);
+    }
+  }
+
+  @Test
+  public void checkConsistency() throws Exception {
+    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
+    resetCurrentApiUser();
+
+    insertValidExternalIds();
+
+    ConsistencyCheckInput input = new ConsistencyCheckInput();
+    input.checkAccountExternalIds = new CheckAccountExternalIdsInput();
+    ConsistencyCheckInfo checkInfo = gApi.config().server().checkConsistency(input);
+    assertThat(checkInfo.checkAccountExternalIdsResult.problems).isEmpty();
+
+    Set<ConsistencyProblemInfo> expectedProblems = new HashSet<>();
+    expectedProblems.addAll(insertInvalidButParsableExternalIds());
+    expectedProblems.addAll(insertNonParsableExternalIds());
+
+    checkInfo = gApi.config().server().checkConsistency(input);
+    assertThat(checkInfo.checkAccountExternalIdsResult.problems).hasSize(expectedProblems.size());
+    assertThat(checkInfo.checkAccountExternalIdsResult.problems)
+        .containsExactlyElementsIn(expectedProblems);
+  }
+
+  @Test
+  public void checkConsistencyNotAllowed() throws Exception {
+    exception.expect(AuthException.class);
+    exception.expectMessage("access database not permitted");
+    gApi.config().server().checkConsistency(new ConsistencyCheckInput());
+  }
+
+  private ConsistencyProblemInfo consistencyError(String message) {
+    return new ConsistencyProblemInfo(ConsistencyProblemInfo.Status.ERROR, message);
+  }
+
+  private void insertValidExternalIds() throws Exception {
+    MutableInteger i = new MutableInteger();
+    String scheme = "valid";
+
+    // create valid external IDs
+    insertExtId(
+        ExternalId.createWithPassword(
+            ExternalId.Key.parse(nextId(scheme, i)),
+            admin.id,
+            "admin.other@example.com",
+            "secret-password"));
+    insertExtId(createExternalIdWithOtherCaseEmail(nextId(scheme, i)));
+  }
+
+  private Set<ConsistencyProblemInfo> insertInvalidButParsableExternalIds() throws Exception {
+    MutableInteger i = new MutableInteger();
+    String scheme = "invalid";
+
+    Set<ConsistencyProblemInfo> expectedProblems = new HashSet<>();
+    ExternalId extIdForNonExistingAccount =
+        createExternalIdForNonExistingAccount(nextId(scheme, i));
+    insertExtIdForNonExistingAccount(extIdForNonExistingAccount);
+    expectedProblems.add(
+        consistencyError(
+            "External ID '"
+                + extIdForNonExistingAccount.key().get()
+                + "' belongs to account that doesn't exist: "
+                + extIdForNonExistingAccount.accountId().get()));
+
+    ExternalId extIdWithInvalidEmail = createExternalIdWithInvalidEmail(nextId(scheme, i));
+    insertExtId(extIdWithInvalidEmail);
+    expectedProblems.add(
+        consistencyError(
+            "External ID '"
+                + extIdWithInvalidEmail.key().get()
+                + "' has an invalid email: "
+                + extIdWithInvalidEmail.email()));
+
+    ExternalId extIdWithDuplicateEmail = createExternalIdWithDuplicateEmail(nextId(scheme, i));
+    insertExtId(extIdWithDuplicateEmail);
+    expectedProblems.add(
+        consistencyError(
+            "Email '"
+                + extIdWithDuplicateEmail.email()
+                + "' is not unique, it's used by the following external IDs: '"
+                + extIdWithDuplicateEmail.key().get()
+                + "', 'mailto:"
+                + extIdWithDuplicateEmail.email()
+                + "'"));
+
+    ExternalId extIdWithBadPassword = createExternalIdWithBadPassword("admin-username");
+    insertExtId(extIdWithBadPassword);
+    expectedProblems.add(
+        consistencyError(
+            "External ID '"
+                + extIdWithBadPassword.key().get()
+                + "' has an invalid password: unrecognized algorithm"));
+
+    return expectedProblems;
+  }
+
+  private Set<ConsistencyProblemInfo> insertNonParsableExternalIds() throws IOException {
+    MutableInteger i = new MutableInteger();
+    String scheme = "corrupt";
+
+    Set<ConsistencyProblemInfo> expectedProblems = new HashSet<>();
+    try (Repository repo = repoManager.openRepository(allUsers);
+        RevWalk rw = new RevWalk(repo)) {
+      String externalId = nextId(scheme, i);
+      String noteId = insertExternalIdWithoutAccountId(repo, rw, externalId);
+      expectedProblems.add(
+          consistencyError(
+              "Invalid external ID config for note '"
+                  + noteId
+                  + "': Value for 'externalId."
+                  + externalId
+                  + ".accountId' is missing, expected account ID"));
+
+      externalId = nextId(scheme, i);
+      noteId = insertExternalIdWithKeyThatDoesntMatchNoteId(repo, rw, externalId);
+      expectedProblems.add(
+          consistencyError(
+              "Invalid external ID config for note '"
+                  + noteId
+                  + "': SHA1 of external ID '"
+                  + externalId
+                  + "' does not match note ID '"
+                  + noteId
+                  + "'"));
+
+      noteId = insertExternalIdWithInvalidConfig(repo, rw, nextId(scheme, i));
+      expectedProblems.add(
+          consistencyError(
+              "Invalid external ID config for note '" + noteId + "': Invalid line in config file"));
+
+      noteId = insertExternalIdWithEmptyNote(repo, rw, nextId(scheme, i));
+      expectedProblems.add(
+          consistencyError(
+              "Invalid external ID config for note '"
+                  + noteId
+                  + "': Expected exactly 1 'externalId' section, found 0"));
+    }
+
+    return expectedProblems;
+  }
+
+  private ExternalId createExternalIdWithOtherCaseEmail(String externalId) {
+    return ExternalId.createWithPassword(
+        ExternalId.Key.parse(externalId), admin.id, admin.email.toUpperCase(Locale.US), "password");
+  }
+
+  private String insertExternalIdWithoutAccountId(Repository repo, RevWalk rw, String externalId)
+      throws IOException {
+    return insertExternalId(
+        repo,
+        rw,
+        (ins, noteMap) -> {
+          ExternalId extId = ExternalId.create(ExternalId.Key.parse(externalId), admin.id);
+          ObjectId noteId = extId.key().sha1();
+          Config c = new Config();
+          extId.writeToConfig(c);
+          c.unset("externalId", extId.key().get(), "accountId");
+          byte[] raw = c.toText().getBytes(UTF_8);
+          ObjectId dataBlob = ins.insert(OBJ_BLOB, raw);
+          noteMap.set(noteId, dataBlob);
+          return noteId;
+        });
+  }
+
+  private String insertExternalIdWithKeyThatDoesntMatchNoteId(
+      Repository repo, RevWalk rw, String externalId) throws IOException {
+    return insertExternalId(
+        repo,
+        rw,
+        (ins, noteMap) -> {
+          ExternalId extId = ExternalId.create(ExternalId.Key.parse(externalId), admin.id);
+          ObjectId noteId = ExternalId.Key.parse(externalId + "x").sha1();
+          Config c = new Config();
+          extId.writeToConfig(c);
+          byte[] raw = c.toText().getBytes(UTF_8);
+          ObjectId dataBlob = ins.insert(OBJ_BLOB, raw);
+          noteMap.set(noteId, dataBlob);
+          return noteId;
+        });
+  }
+
+  private String insertExternalIdWithInvalidConfig(Repository repo, RevWalk rw, String externalId)
+      throws IOException {
+    return insertExternalId(
+        repo,
+        rw,
+        (ins, noteMap) -> {
+          ObjectId noteId = ExternalId.Key.parse(externalId).sha1();
+          byte[] raw = "bad-config".getBytes(UTF_8);
+          ObjectId dataBlob = ins.insert(OBJ_BLOB, raw);
+          noteMap.set(noteId, dataBlob);
+          return noteId;
+        });
+  }
+
+  private String insertExternalIdWithEmptyNote(Repository repo, RevWalk rw, String externalId)
+      throws IOException {
+    return insertExternalId(
+        repo,
+        rw,
+        (ins, noteMap) -> {
+          ObjectId noteId = ExternalId.Key.parse(externalId).sha1();
+          byte[] raw = "".getBytes(UTF_8);
+          ObjectId dataBlob = ins.insert(OBJ_BLOB, raw);
+          noteMap.set(noteId, dataBlob);
+          return noteId;
+        });
+  }
+
+  private String insertExternalId(Repository repo, RevWalk rw, ExternalIdInserter extIdInserter)
+      throws IOException {
+    ObjectId rev = ExternalIdReader.readRevision(repo);
+    NoteMap noteMap = ExternalIdReader.readNoteMap(rw, rev);
+
+    try (ObjectInserter ins = repo.newObjectInserter()) {
+      ObjectId noteId = extIdInserter.addNote(ins, noteMap);
+
+      CommitBuilder cb = new CommitBuilder();
+      cb.setMessage("Update external IDs");
+      cb.setTreeId(noteMap.writeTree(ins));
+      cb.setAuthor(admin.getIdent());
+      cb.setCommitter(admin.getIdent());
+      if (!rev.equals(ObjectId.zeroId())) {
+        cb.setParentId(rev);
+      } else {
+        cb.setParentIds(); // Ref is currently nonexistent, commit has no parents.
+      }
+      if (cb.getTreeId() == null) {
+        if (rev.equals(ObjectId.zeroId())) {
+          cb.setTreeId(ins.insert(OBJ_TREE, new byte[] {})); // No parent, assume empty tree.
+        } else {
+          RevCommit p = rw.parseCommit(rev);
+          cb.setTreeId(p.getTree()); // Copy tree from parent.
+        }
+      }
+      ObjectId commitId = ins.insert(cb);
+      ins.flush();
+
+      RefUpdate u = repo.updateRef(RefNames.REFS_EXTERNAL_IDS);
+      u.setExpectedOldObjectId(rev);
+      u.setNewObjectId(commitId);
+      RefUpdate.Result res = u.update();
+      switch (res) {
+        case NEW:
+        case FAST_FORWARD:
+        case NO_CHANGE:
+        case RENAMED:
+        case FORCED:
+          break;
+        case LOCK_FAILURE:
+        case IO_FAILURE:
+        case NOT_ATTEMPTED:
+        case REJECTED:
+        case REJECTED_CURRENT_BRANCH:
+        case REJECTED_MISSING_OBJECT:
+        case REJECTED_OTHER_REASON:
+        default:
+          throw new IOException("Updating external IDs failed with " + res);
+      }
+      return noteId.getName();
+    }
+  }
+
+  private ExternalId createExternalIdForNonExistingAccount(String externalId) {
+    return ExternalId.create(ExternalId.Key.parse(externalId), new Account.Id(1));
+  }
+
+  private ExternalId createExternalIdWithInvalidEmail(String externalId) {
+    return ExternalId.createWithEmail(ExternalId.Key.parse(externalId), admin.id, "invalid-email");
+  }
+
+  private ExternalId createExternalIdWithDuplicateEmail(String externalId) {
+    return ExternalId.createWithEmail(ExternalId.Key.parse(externalId), admin.id, admin.email);
+  }
+
+  private ExternalId createExternalIdWithBadPassword(String username) {
+    return ExternalId.create(
+        ExternalId.Key.create(SCHEME_USERNAME, username),
+        admin.id,
+        null,
+        "non-hashed-password-is-not-allowed");
+  }
+
+  private static String nextId(String scheme, MutableInteger i) {
+    return scheme + ":foo" + ++i.value;
+  }
+
+  @Test
+  public void readExternalIdWithAccountIdThatCanBeExpressedInKiB() throws Exception {
+    ExternalId.Key extIdKey = ExternalId.Key.parse("foo:bar");
+    Account.Id accountId = new Account.Id(1024 * 100);
+    accountsUpdateProvider
+        .get()
+        .insert(
+            "Create Account with Bad External ID",
+            accountId,
+            u -> u.addExternalId(ExternalId.create(extIdKey, accountId)));
+    Optional<ExternalId> extId = externalIds.get(extIdKey);
+    assertThat(extId.map(ExternalId::accountId)).hasValue(accountId);
+  }
+
+  @Test
+  public void checkNoReloadAfterUpdate() throws Exception {
+    Set<ExternalId> expectedExtIds = new HashSet<>(externalIds.byAccount(admin.id));
+    try (AutoCloseable ctx = createFailOnLoadContext()) {
+      // insert external ID
+      ExternalId extId = ExternalId.create("foo", "bar", admin.id);
+      insertExtId(extId);
+      expectedExtIds.add(extId);
+      assertThat(externalIds.byAccount(admin.id)).containsExactlyElementsIn(expectedExtIds);
+
+      // update external ID
+      expectedExtIds.remove(extId);
+      ExternalId extId2 = ExternalId.createWithEmail("foo", "bar", admin.id, "foo.bar@example.com");
+      accountsUpdateProvider
+          .get()
+          .update("Update External ID", admin.id, u -> u.updateExternalId(extId2));
+      expectedExtIds.add(extId2);
+      assertThat(externalIds.byAccount(admin.id)).containsExactlyElementsIn(expectedExtIds);
+
+      // delete external ID
+      accountsUpdateProvider
+          .get()
+          .update("Delete External ID", admin.id, u -> u.deleteExternalId(extId));
+      expectedExtIds.remove(extId2);
+      assertThat(externalIds.byAccount(admin.id)).containsExactlyElementsIn(expectedExtIds);
+    }
+  }
+
+  @Test
+  public void byAccountFailIfReadingExternalIdsFails() throws Exception {
+    try (AutoCloseable ctx = createFailOnLoadContext()) {
+      // update external ID branch so that external IDs need to be reloaded
+      insertExtIdBehindGerritsBack(ExternalId.create("foo", "bar", admin.id));
+
+      exception.expect(IOException.class);
+      externalIds.byAccount(admin.id);
+    }
+  }
+
+  @Test
+  public void byEmailFailIfReadingExternalIdsFails() throws Exception {
+    try (AutoCloseable ctx = createFailOnLoadContext()) {
+      // update external ID branch so that external IDs need to be reloaded
+      insertExtIdBehindGerritsBack(ExternalId.create("foo", "bar", admin.id));
+
+      exception.expect(IOException.class);
+      externalIds.byEmail(admin.email);
+    }
+  }
+
+  @Test
+  public void byAccountUpdateExternalIdsBehindGerritsBack() throws Exception {
+    Set<ExternalId> expectedExternalIds = new HashSet<>(externalIds.byAccount(admin.id));
+    ExternalId newExtId = ExternalId.create("foo", "bar", admin.id);
+    insertExtIdBehindGerritsBack(newExtId);
+    expectedExternalIds.add(newExtId);
+    assertThat(externalIds.byAccount(admin.id)).containsExactlyElementsIn(expectedExternalIds);
+  }
+
+  @Test
+  public void unsetEmail() throws Exception {
+    ExternalId extId = ExternalId.createWithEmail("x", "1", user.id, "x@example.com");
+    insertExtId(extId);
+
+    ExternalId extIdWithoutEmail = ExternalId.create("x", "1", user.id);
+    try (Repository allUsersRepo = repoManager.openRepository(allUsers);
+        MetaDataUpdate md = metaDataUpdateFactory.create(allUsers)) {
+      ExternalIdNotes extIdNotes = externalIdNotesFactory.load(allUsersRepo);
+      extIdNotes.upsert(extIdWithoutEmail);
+      extIdNotes.commit(md);
+
+      assertThat(extIdNotes.get(extId.key())).hasValue(extIdWithoutEmail);
+    }
+  }
+
+  @Test
+  public void unsetHttpPassword() throws Exception {
+    ExternalId extId =
+        ExternalId.createWithPassword(ExternalId.Key.create("y", "1"), user.id, null, "secret");
+    insertExtId(extId);
+
+    ExternalId extIdWithoutPassword = ExternalId.create("y", "1", user.id);
+    try (Repository allUsersRepo = repoManager.openRepository(allUsers);
+        MetaDataUpdate md = metaDataUpdateFactory.create(allUsers)) {
+      ExternalIdNotes extIdNotes = externalIdNotesFactory.load(allUsersRepo);
+      extIdNotes.upsert(extIdWithoutPassword);
+      extIdNotes.commit(md);
+
+      assertThat(extIdNotes.get(extId.key())).hasValue(extIdWithoutPassword);
+    }
+  }
+
+  @Test
+  public void footers() throws Exception {
+    // Insert external ID for different accounts
+    TestAccount user1 = accountCreator.create("user1");
+    TestAccount user2 = accountCreator.create("user2");
+    ExternalId extId1 = ExternalId.create("foo", "1", user1.id);
+    ExternalId extId2 = ExternalId.create("foo", "2", user1.id);
+    ExternalId extId3 = ExternalId.create("foo", "3", user2.id);
+    try (Repository allUsersRepo = repoManager.openRepository(allUsers);
+        MetaDataUpdate md = metaDataUpdateFactory.create(allUsers)) {
+      ExternalIdNotes extIdNotes = externalIdNotesFactory.load(allUsersRepo);
+      extIdNotes.insert(ImmutableSet.of(extId1, extId2, extId3));
+      RevCommit c = extIdNotes.commit(md);
+      assertThat(getFooters(c))
+          .containsExactly("Account: " + user1.getId(), "Account: " + user2.getId())
+          .inOrder();
+    }
+
+    // Insert external ID with different emails
+    ExternalId extId4 = ExternalId.createWithEmail("foo", "4", user1.id, "foo4@example.com");
+    ExternalId extId5 = ExternalId.createWithEmail("foo", "5", user2.id, "foo5@example.com");
+    try (Repository allUsersRepo = repoManager.openRepository(allUsers);
+        MetaDataUpdate md = metaDataUpdateFactory.create(allUsers)) {
+      ExternalIdNotes extIdNotes = externalIdNotesFactory.load(allUsersRepo);
+      extIdNotes.insert(ImmutableSet.of(extId4, extId5));
+      RevCommit c = extIdNotes.commit(md);
+      assertThat(getFooters(c))
+          .containsExactly(
+              "Account: " + user1.getId(),
+              "Account: " + user2.getId(),
+              "Email: foo4@example.com",
+              "Email: foo5@example.com")
+          .inOrder();
+    }
+
+    // Update external ID - Add Email
+    ExternalId extId1a = ExternalId.createWithEmail("foo", "1", user1.id, "foo1@example.com");
+    try (Repository allUsersRepo = repoManager.openRepository(allUsers);
+        MetaDataUpdate md = metaDataUpdateFactory.create(allUsers)) {
+      ExternalIdNotes extIdNotes = externalIdNotesFactory.load(allUsersRepo);
+      extIdNotes.upsert(extId1a);
+      RevCommit c = extIdNotes.commit(md);
+      assertThat(getFooters(c))
+          .containsExactly("Account: " + user1.getId(), "Email: foo1@example.com")
+          .inOrder();
+    }
+
+    // Update external ID - Remove Email
+    try (Repository allUsersRepo = repoManager.openRepository(allUsers);
+        MetaDataUpdate md = metaDataUpdateFactory.create(allUsers)) {
+      ExternalIdNotes extIdNotes = externalIdNotesFactory.load(allUsersRepo);
+      extIdNotes.upsert(extId1);
+      RevCommit c = extIdNotes.commit(md);
+      assertThat(getFooters(c))
+          .containsExactly("Account: " + user1.getId(), "Email: foo1@example.com")
+          .inOrder();
+    }
+
+    // Delete external IDs
+    try (Repository allUsersRepo = repoManager.openRepository(allUsers);
+        MetaDataUpdate md = metaDataUpdateFactory.create(allUsers)) {
+      ExternalIdNotes extIdNotes = externalIdNotesFactory.load(allUsersRepo);
+      extIdNotes.delete(ImmutableSet.of(extId1, extId5));
+      RevCommit c = extIdNotes.commit(md);
+      assertThat(getFooters(c))
+          .containsExactly(
+              "Account: " + user1.getId(), "Account: " + user2.getId(), "Email: foo5@example.com")
+          .inOrder();
+    }
+
+    // Delete external ID by key without email
+    try (Repository allUsersRepo = repoManager.openRepository(allUsers);
+        MetaDataUpdate md = metaDataUpdateFactory.create(allUsers)) {
+      ExternalIdNotes extIdNotes = externalIdNotesFactory.load(allUsersRepo);
+      extIdNotes.delete(extId2.accountId(), extId2.key());
+      RevCommit c = extIdNotes.commit(md);
+      assertThat(getFooters(c)).containsExactly("Account: " + user1.getId()).inOrder();
+    }
+
+    // Delete external ID by key with email
+    try (Repository allUsersRepo = repoManager.openRepository(allUsers);
+        MetaDataUpdate md = metaDataUpdateFactory.create(allUsers)) {
+      ExternalIdNotes extIdNotes = externalIdNotesFactory.load(allUsersRepo);
+      extIdNotes.delete(extId4.accountId(), extId4.key());
+      RevCommit c = extIdNotes.commit(md);
+      assertThat(getFooters(c))
+          .containsExactly("Account: " + user1.getId(), "Email: foo4@example.com")
+          .inOrder();
+    }
+  }
+
+  private void insertExtId(ExternalId extId) throws Exception {
+    accountsUpdateProvider
+        .get()
+        .update("Add External ID", extId.accountId(), u -> u.addExternalId(extId));
+  }
+
+  private void insertExtIdForNonExistingAccount(ExternalId extId) throws Exception {
+    // Cannot use AccountsUpdate to insert an external ID for a non-existing account.
+    try (Repository repo = repoManager.openRepository(allUsers);
+        MetaDataUpdate update = metaDataUpdateFactory.create(allUsers)) {
+      ExternalIdNotes extIdNotes = externalIdNotesFactory.load(repo);
+      extIdNotes.insert(extId);
+      extIdNotes.commit(update);
+      extIdNotes.updateCaches();
+    }
+  }
+
+  private void insertExtIdBehindGerritsBack(ExternalId extId) throws Exception {
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      // Inserting an external ID "behind Gerrit's back" means that the caches are not updated.
+      ExternalIdNotes extIdNotes = ExternalIdNotes.loadNoCacheUpdate(allUsers, repo);
+      extIdNotes.insert(extId);
+      try (MetaDataUpdate metaDataUpdate =
+          new MetaDataUpdate(GitReferenceUpdated.DISABLED, null, repo)) {
+        metaDataUpdate.getCommitBuilder().setAuthor(admin.getIdent());
+        metaDataUpdate.getCommitBuilder().setCommitter(admin.getIdent());
+        extIdNotes.commit(metaDataUpdate);
+      }
+    }
+  }
+
+  private void addExtId(TestRepository<?> testRepo, ExternalId... extIds)
+      throws IOException, OrmDuplicateKeyException, ConfigInvalidException {
+    ExternalIdNotes extIdNotes = externalIdNotesFactory.load(testRepo.getRepository());
+    extIdNotes.insert(Arrays.asList(extIds));
+    try (MetaDataUpdate metaDataUpdate =
+        new MetaDataUpdate(GitReferenceUpdated.DISABLED, null, testRepo.getRepository())) {
+      metaDataUpdate.getCommitBuilder().setAuthor(admin.getIdent());
+      metaDataUpdate.getCommitBuilder().setCommitter(admin.getIdent());
+      extIdNotes.commit(metaDataUpdate);
+      extIdNotes.updateCaches();
+    }
+  }
+
+  private List<String> getFooters(RevCommit c) {
+    return c.getFooterLines().stream().map(FooterLine::toString).collect(toList());
+  }
+
+  private List<AccountExternalIdInfo> toExternalIdInfos(Collection<ExternalId> extIds) {
+    return extIds.stream().map(this::toExternalIdInfo).collect(toList());
+  }
+
+  private AccountExternalIdInfo toExternalIdInfo(ExternalId extId) {
+    AccountExternalIdInfo info = new AccountExternalIdInfo();
+    info.identity = extId.key().get();
+    info.emailAddress = extId.email();
+    info.canDelete = !extId.isScheme(SCHEME_USERNAME) ? true : null;
+    info.trusted =
+        extId.isScheme(SCHEME_MAILTO)
+                || extId.isScheme(SCHEME_UUID)
+                || extId.isScheme(SCHEME_USERNAME)
+            ? true
+            : null;
+    return info;
+  }
+
+  private void allowPushOfExternalIds() throws IOException, ConfigInvalidException {
+    grant(allUsers, RefNames.REFS_EXTERNAL_IDS, Permission.READ);
+    grant(allUsers, RefNames.REFS_EXTERNAL_IDS, Permission.PUSH);
+  }
+
+  private void assertRefUpdateFailure(RemoteRefUpdate update, String msg) {
+    assertThat(update.getStatus()).isEqualTo(Status.REJECTED_OTHER_REASON);
+    assertThat(update.getMessage()).contains(msg);
+  }
+
+  private AutoCloseable createFailOnLoadContext() {
+    externalIdReader.setFailOnLoad(true);
+    return new AutoCloseable() {
+      @Override
+      public void close() {
+        externalIdReader.setFailOnLoad(false);
+      }
+    };
+  }
+
+  @FunctionalInterface
+  private interface ExternalIdInserter {
+    public ObjectId addNote(ObjectInserter ins, NoteMap noteMap) throws IOException;
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/account/GetAccountDetailIT.java b/javatests/com/google/gerrit/acceptance/rest/account/GetAccountDetailIT.java
new file mode 100644
index 0000000..07bc394
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/account/GetAccountDetailIT.java
@@ -0,0 +1,35 @@
+// Copyright (C) 2015 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.google.gerrit.acceptance.rest.account;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.acceptance.rest.account.AccountAssert.assertAccountInfo;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.extensions.common.AccountDetailInfo;
+import com.google.gerrit.reviewdb.client.Account;
+import org.junit.Test;
+
+public class GetAccountDetailIT extends AbstractDaemonTest {
+  @Test
+  public void getDetail() throws Exception {
+    RestResponse r = adminRestSession.get("/accounts/" + admin.username + "/detail/");
+    AccountDetailInfo info = newGson().fromJson(r.getReader(), AccountDetailInfo.class);
+    assertAccountInfo(admin, info);
+    Account account = getAccount(admin.getId());
+    assertThat(info.registeredOn).isEqualTo(account.getRegisteredOn());
+  }
+}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/GetAccountIT.java b/javatests/com/google/gerrit/acceptance/rest/account/GetAccountIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/GetAccountIT.java
rename to javatests/com/google/gerrit/acceptance/rest/account/GetAccountIT.java
diff --git a/javatests/com/google/gerrit/acceptance/rest/account/ImpersonationIT.java b/javatests/com/google/gerrit/acceptance/rest/account/ImpersonationIT.java
new file mode 100644
index 0000000..65c95f8
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/account/ImpersonationIT.java
@@ -0,0 +1,604 @@
+// 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.
+
+package com.google.gerrit.acceptance.rest.account;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static com.google.gerrit.extensions.client.ListChangesOption.MESSAGES;
+import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.GerritConfig;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.acceptance.RestSession;
+import com.google.gerrit.acceptance.TestAccount;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.changes.DraftInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput.CommentInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput.DraftHandling;
+import com.google.gerrit.extensions.api.changes.ReviewInput.RobotCommentInput;
+import com.google.gerrit.extensions.api.changes.RevisionApi;
+import com.google.gerrit.extensions.api.changes.SubmitInput;
+import com.google.gerrit.extensions.api.groups.GroupInput;
+import com.google.gerrit.extensions.client.Side;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.ChangeMessageInfo;
+import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.client.RobotComment;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.account.AccountControl;
+import com.google.gerrit.server.project.testing.Util;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.inject.Inject;
+import org.apache.http.Header;
+import org.apache.http.message.BasicHeader;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ImpersonationIT extends AbstractDaemonTest {
+  @Inject private AccountControl.Factory accountControlFactory;
+
+  @Inject private ApprovalsUtil approvalsUtil;
+
+  @Inject private ChangeMessagesUtil cmUtil;
+
+  @Inject private CommentsUtil commentsUtil;
+
+  private RestSession anonRestSession;
+  private TestAccount admin2;
+  private GroupInfo newGroup;
+
+  @Before
+  public void setUp() throws Exception {
+    anonRestSession = new RestSession(server, null);
+    admin2 = accountCreator.admin2();
+    GroupInput gi = new GroupInput();
+    gi.name = name("New-Group");
+    gi.members = ImmutableList.of(user.id.toString());
+    newGroup = gApi.groups().create(gi).get();
+  }
+
+  @After
+  public void tearDown() throws Exception {
+    removeRunAs();
+  }
+
+  @Test
+  public void voteOnBehalfOf() throws Exception {
+    allowCodeReviewOnBehalfOf();
+    PushOneCommit.Result r = createChange();
+    RevisionApi revision = gApi.changes().id(r.getChangeId()).current();
+
+    ReviewInput in = ReviewInput.recommend();
+    in.onBehalfOf = user.id.toString();
+    in.message = "Message on behalf of";
+    revision.review(in);
+
+    PatchSetApproval psa = Iterables.getOnlyElement(r.getChange().approvals().values());
+    assertThat(psa.getPatchSetId().get()).isEqualTo(1);
+    assertThat(psa.getLabel()).isEqualTo("Code-Review");
+    assertThat(psa.getAccountId()).isEqualTo(user.id);
+    assertThat(psa.getValue()).isEqualTo(1);
+    assertThat(psa.getRealAccountId()).isEqualTo(admin.id);
+
+    ChangeData cd = r.getChange();
+    ChangeMessage m = Iterables.getLast(cmUtil.byChange(db, cd.notes()));
+    assertThat(m.getMessage()).endsWith(in.message);
+    assertThat(m.getAuthor()).isEqualTo(user.id);
+    assertThat(m.getRealAuthor()).isEqualTo(admin.id);
+  }
+
+  @Test
+  public void voteOnBehalfOfRequiresLabel() throws Exception {
+    allowCodeReviewOnBehalfOf();
+    PushOneCommit.Result r = createChange();
+    RevisionApi revision = gApi.changes().id(r.getChangeId()).current();
+
+    ReviewInput in = new ReviewInput();
+    in.onBehalfOf = user.id.toString();
+    in.message = "Message on behalf of";
+
+    exception.expect(AuthException.class);
+    exception.expectMessage("label required to post review on behalf of \"" + in.onBehalfOf + '"');
+    revision.review(in);
+  }
+
+  @Test
+  @GerritConfig(name = "change.strictLabels", value = "true")
+  public void voteOnBehalfOfInvalidLabel() throws Exception {
+    allowCodeReviewOnBehalfOf();
+
+    String changeId = createChange().getChangeId();
+    ReviewInput in = new ReviewInput().label("Not-A-Label", 5);
+    in.onBehalfOf = user.id.toString();
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("label \"Not-A-Label\" is not a configured label");
+    gApi.changes().id(changeId).current().review(in);
+  }
+
+  @Test
+  public void voteOnBehalfOfInvalidLabelIgnoredWithoutStrictLabels() throws Exception {
+    allowCodeReviewOnBehalfOf();
+
+    String changeId = createChange().getChangeId();
+    ReviewInput in = new ReviewInput().label("Code-Review", 1).label("Not-A-Label", 5);
+    in.onBehalfOf = user.id.toString();
+    gApi.changes().id(changeId).current().review(in);
+
+    assertThat(gApi.changes().id(changeId).get().labels).doesNotContainKey("Not-A-Label");
+  }
+
+  @Test
+  public void voteOnBehalfOfLabelNotPermitted() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      LabelType verified = Util.verified();
+      u.getConfig().getLabelSections().put(verified.getName(), verified);
+      u.save();
+    }
+
+    PushOneCommit.Result r = createChange();
+    RevisionApi revision = gApi.changes().id(r.getChangeId()).current();
+
+    ReviewInput in = new ReviewInput();
+    in.onBehalfOf = user.id.toString();
+    in.label("Verified", 1);
+
+    exception.expect(AuthException.class);
+    exception.expectMessage(
+        "not permitted to modify label \"Verified\" on behalf of \"" + in.onBehalfOf + '"');
+    revision.review(in);
+  }
+
+  @Test
+  public void voteOnBehalfOfWithComment() throws Exception {
+    testVoteOnBehalfOfWithComment();
+  }
+
+  @Test
+  public void voteOnBehalfOfWithCommentWritingJson() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    testVoteOnBehalfOfWithComment();
+  }
+
+  private void testVoteOnBehalfOfWithComment() throws Exception {
+    allowCodeReviewOnBehalfOf();
+    PushOneCommit.Result r = createChange();
+
+    ReviewInput in = new ReviewInput();
+    in.onBehalfOf = user.id.toString();
+    in.label("Code-Review", 1);
+    CommentInput ci = new CommentInput();
+    ci.path = Patch.COMMIT_MSG;
+    ci.side = Side.REVISION;
+    ci.line = 1;
+    ci.message = "message";
+    in.comments = ImmutableMap.of(ci.path, ImmutableList.of(ci));
+    gApi.changes().id(r.getChangeId()).current().review(in);
+
+    PatchSetApproval psa = Iterables.getOnlyElement(r.getChange().approvals().values());
+    assertThat(psa.getPatchSetId().get()).isEqualTo(1);
+    assertThat(psa.getLabel()).isEqualTo("Code-Review");
+    assertThat(psa.getAccountId()).isEqualTo(user.id);
+    assertThat(psa.getValue()).isEqualTo(1);
+    assertThat(psa.getRealAccountId()).isEqualTo(admin.id);
+
+    ChangeData cd = r.getChange();
+    Comment c = Iterables.getOnlyElement(commentsUtil.publishedByChange(db, cd.notes()));
+    assertThat(c.message).isEqualTo(ci.message);
+    assertThat(c.author.getId()).isEqualTo(user.id);
+    assertThat(c.getRealAuthor().getId()).isEqualTo(admin.id);
+  }
+
+  @Test
+  public void voteOnBehalfOfWithRobotComment() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    allowCodeReviewOnBehalfOf();
+    PushOneCommit.Result r = createChange();
+
+    ReviewInput in = new ReviewInput();
+    in.onBehalfOf = user.id.toString();
+    in.label("Code-Review", 1);
+    RobotCommentInput ci = new RobotCommentInput();
+    ci.robotId = "my-robot";
+    ci.robotRunId = "abcd1234";
+    ci.path = Patch.COMMIT_MSG;
+    ci.side = Side.REVISION;
+    ci.line = 1;
+    ci.message = "message";
+    in.robotComments = ImmutableMap.of(ci.path, ImmutableList.of(ci));
+    gApi.changes().id(r.getChangeId()).current().review(in);
+
+    ChangeData cd = r.getChange();
+    RobotComment c = Iterables.getOnlyElement(commentsUtil.robotCommentsByChange(cd.notes()));
+    assertThat(c.message).isEqualTo(ci.message);
+    assertThat(c.robotId).isEqualTo(ci.robotId);
+    assertThat(c.robotRunId).isEqualTo(ci.robotRunId);
+    assertThat(c.author.getId()).isEqualTo(user.id);
+    assertThat(c.getRealAuthor().getId()).isEqualTo(admin.id);
+  }
+
+  @Test
+  public void voteOnBehalfOfCannotModifyDrafts() throws Exception {
+    allowCodeReviewOnBehalfOf();
+    PushOneCommit.Result r = createChange();
+
+    setApiUser(user);
+    DraftInput di = new DraftInput();
+    di.path = Patch.COMMIT_MSG;
+    di.side = Side.REVISION;
+    di.line = 1;
+    di.message = "message";
+    gApi.changes().id(r.getChangeId()).current().createDraft(di);
+
+    setApiUser(admin);
+    ReviewInput in = new ReviewInput();
+    in.onBehalfOf = user.id.toString();
+    in.label("Code-Review", 1);
+    in.drafts = DraftHandling.PUBLISH;
+
+    exception.expect(AuthException.class);
+    exception.expectMessage("not allowed to modify other user's drafts");
+    gApi.changes().id(r.getChangeId()).current().review(in);
+  }
+
+  @Test
+  public void voteOnBehalfOfMissingUser() throws Exception {
+    allowCodeReviewOnBehalfOf();
+    PushOneCommit.Result r = createChange();
+    RevisionApi revision = gApi.changes().id(r.getChangeId()).current();
+
+    ReviewInput in = new ReviewInput();
+    in.onBehalfOf = "doesnotexist";
+    in.label("Code-Review", 1);
+
+    exception.expect(UnprocessableEntityException.class);
+    exception.expectMessage("not found");
+    exception.expectMessage("doesnotexist");
+    revision.review(in);
+  }
+
+  @Test
+  public void voteOnBehalfOfFailsWhenUserCannotSeeDestinationRef() throws Exception {
+    blockRead(newGroup);
+
+    allowCodeReviewOnBehalfOf();
+    PushOneCommit.Result r = createChange();
+    RevisionApi revision = gApi.changes().id(r.getChangeId()).current();
+
+    ReviewInput in = new ReviewInput();
+    in.onBehalfOf = user.id.toString();
+    in.label("Code-Review", 1);
+
+    exception.expect(UnprocessableEntityException.class);
+    exception.expectMessage("on_behalf_of account " + user.id + " cannot see change");
+    revision.review(in);
+  }
+
+  @GerritConfig(name = "accounts.visibility", value = "SAME_GROUP")
+  @Test
+  public void voteOnBehalfOfInvisibleUserNotAllowed() throws Exception {
+    allowCodeReviewOnBehalfOf();
+    setApiUser(accountCreator.user2());
+    assertThat(accountControlFactory.get().canSee(user.id)).isFalse();
+
+    PushOneCommit.Result r = createChange();
+    RevisionApi revision = gApi.changes().id(r.getChangeId()).current();
+
+    ReviewInput in = new ReviewInput();
+    in.onBehalfOf = user.id.toString();
+    in.label("Code-Review", 1);
+
+    exception.expect(UnprocessableEntityException.class);
+    exception.expectMessage("not found");
+    exception.expectMessage(in.onBehalfOf);
+    revision.review(in);
+  }
+
+  @Test
+  public void submitOnBehalfOf() throws Exception {
+    allowSubmitOnBehalfOf();
+    PushOneCommit.Result r = createChange();
+    String changeId = project.get() + "~master~" + r.getChangeId();
+    gApi.changes().id(changeId).current().review(ReviewInput.approve());
+    SubmitInput in = new SubmitInput();
+    in.onBehalfOf = admin2.email;
+    gApi.changes().id(changeId).current().submit(in);
+
+    ChangeData cd = r.getChange();
+    assertThat(cd.change().getStatus()).isEqualTo(Change.Status.MERGED);
+    PatchSetApproval submitter =
+        approvalsUtil.getSubmitter(db, cd.notes(), cd.change().currentPatchSetId());
+    assertThat(submitter.getAccountId()).isEqualTo(admin2.id);
+    assertThat(submitter.getRealAccountId()).isEqualTo(admin.id);
+  }
+
+  @Test
+  public void submitOnBehalfOfInvalidUser() throws Exception {
+    allowSubmitOnBehalfOf();
+    PushOneCommit.Result r = createChange();
+    String changeId = project.get() + "~master~" + r.getChangeId();
+    gApi.changes().id(changeId).current().review(ReviewInput.approve());
+    SubmitInput in = new SubmitInput();
+    in.onBehalfOf = "doesnotexist";
+    exception.expect(UnprocessableEntityException.class);
+    exception.expectMessage("not found");
+    exception.expectMessage("doesnotexist");
+    gApi.changes().id(changeId).current().submit(in);
+  }
+
+  @Test
+  public void submitOnBehalfOfNotPermitted() throws Exception {
+    PushOneCommit.Result r = createChange();
+    gApi.changes()
+        .id(project.get() + "~master~" + r.getChangeId())
+        .current()
+        .review(ReviewInput.approve());
+    SubmitInput in = new SubmitInput();
+    in.onBehalfOf = admin2.email;
+    exception.expect(AuthException.class);
+    exception.expectMessage("submit on behalf of other users not permitted");
+    gApi.changes().id(project.get() + "~master~" + r.getChangeId()).current().submit(in);
+  }
+
+  @Test
+  public void submitOnBehalfOfFailsWhenUserCannotSeeDestinationRef() throws Exception {
+    blockRead(newGroup);
+
+    allowSubmitOnBehalfOf();
+    PushOneCommit.Result r = createChange();
+    String changeId = project.get() + "~master~" + r.getChangeId();
+    gApi.changes().id(changeId).current().review(ReviewInput.approve());
+    SubmitInput in = new SubmitInput();
+    in.onBehalfOf = user.email;
+    exception.expect(UnprocessableEntityException.class);
+    exception.expectMessage("on_behalf_of account " + user.id + " cannot see change");
+    gApi.changes().id(changeId).current().submit(in);
+  }
+
+  @GerritConfig(name = "accounts.visibility", value = "SAME_GROUP")
+  @Test
+  public void submitOnBehalfOfInvisibleUserNotAllowed() throws Exception {
+    allowSubmitOnBehalfOf();
+    setApiUser(accountCreator.user2());
+    assertThat(accountControlFactory.get().canSee(user.id)).isFalse();
+
+    PushOneCommit.Result r = createChange();
+    String changeId = project.get() + "~master~" + r.getChangeId();
+    gApi.changes().id(changeId).current().review(ReviewInput.approve());
+    SubmitInput in = new SubmitInput();
+    in.onBehalfOf = user.email;
+    exception.expect(UnprocessableEntityException.class);
+    exception.expectMessage("not found");
+    exception.expectMessage(in.onBehalfOf);
+    gApi.changes().id(changeId).current().submit(in);
+  }
+
+  @Test
+  public void runAsValidUser() throws Exception {
+    allowRunAs();
+    RestResponse res = adminRestSession.getWithHeader("/accounts/self", runAsHeader(user.id));
+    res.assertOK();
+    AccountInfo account = newGson().fromJson(res.getEntityContent(), AccountInfo.class);
+    assertThat(account._accountId).isEqualTo(user.id.get());
+  }
+
+  @GerritConfig(name = "auth.enableRunAs", value = "false")
+  @Test
+  public void runAsDisabledByConfig() throws Exception {
+    allowRunAs();
+    RestResponse res = adminRestSession.getWithHeader("/changes/", runAsHeader(user.id));
+    res.assertForbidden();
+    assertThat(res.getEntityContent())
+        .isEqualTo("X-Gerrit-RunAs disabled by auth.enableRunAs = false");
+  }
+
+  @Test
+  public void runAsNotPermitted() throws Exception {
+    RestResponse res = adminRestSession.getWithHeader("/changes/", runAsHeader(user.id));
+    res.assertForbidden();
+    assertThat(res.getEntityContent()).isEqualTo("not permitted to use X-Gerrit-RunAs");
+  }
+
+  @Test
+  public void runAsNeverPermittedForAnonymousUsers() throws Exception {
+    allowRunAs();
+    RestResponse res = anonRestSession.getWithHeader("/changes/", runAsHeader(user.id));
+    res.assertForbidden();
+    assertThat(res.getEntityContent()).isEqualTo("not permitted to use X-Gerrit-RunAs");
+  }
+
+  @Test
+  public void runAsInvalidUser() throws Exception {
+    allowRunAs();
+    RestResponse res = adminRestSession.getWithHeader("/changes/", runAsHeader("doesnotexist"));
+    res.assertForbidden();
+    assertThat(res.getEntityContent()).isEqualTo("no account matches X-Gerrit-RunAs");
+  }
+
+  @Test
+  public void voteUsingRunAsAvoidsRestrictionsOfOnBehalfOf() throws Exception {
+    allowRunAs();
+    PushOneCommit.Result r = createChange();
+
+    setApiUser(user);
+    DraftInput di = new DraftInput();
+    di.path = Patch.COMMIT_MSG;
+    di.side = Side.REVISION;
+    di.line = 1;
+    di.message = "inline comment";
+    gApi.changes().id(r.getChangeId()).current().createDraft(di);
+    setApiUser(admin);
+
+    // Things that aren't allowed with on_behalf_of:
+    //  - no labels.
+    //  - publish other user's drafts.
+    ReviewInput in = new ReviewInput();
+    in.message = "message";
+    in.drafts = DraftHandling.PUBLISH;
+    RestResponse res =
+        adminRestSession.postWithHeader(
+            "/changes/" + r.getChangeId() + "/revisions/current/review", runAsHeader(user.id), in);
+    res.assertOK();
+
+    ChangeMessageInfo m = Iterables.getLast(gApi.changes().id(r.getChangeId()).get().messages);
+    assertThat(m.message).endsWith(in.message);
+    assertThat(m.author._accountId).isEqualTo(user.id.get());
+
+    CommentInfo c =
+        Iterables.getOnlyElement(gApi.changes().id(r.getChangeId()).comments().get(di.path));
+    assertThat(c.author._accountId).isEqualTo(user.id.get());
+    assertThat(c.message).isEqualTo(di.message);
+
+    setApiUser(user);
+    assertThat(gApi.changes().id(r.getChangeId()).drafts()).isEmpty();
+  }
+
+  @Test
+  public void runAsWithOnBehalfOf() throws Exception {
+    // - Has the same restrictions as on_behalf_of (e.g. requires labels).
+    // - Takes the effective user from on_behalf_of (user).
+    // - Takes the real user from the real caller, not the intermediate
+    //   X-Gerrit-RunAs user (user2).
+    allowRunAs();
+    allowCodeReviewOnBehalfOf();
+    TestAccount user2 = accountCreator.user2();
+
+    PushOneCommit.Result r = createChange();
+    ReviewInput in = new ReviewInput();
+    in.onBehalfOf = user.id.toString();
+    in.message = "Message on behalf of";
+
+    String endpoint = "/changes/" + r.getChangeId() + "/revisions/current/review";
+    RestResponse res = adminRestSession.postWithHeader(endpoint, runAsHeader(user2.id), in);
+    res.assertForbidden();
+    assertThat(res.getEntityContent())
+        .isEqualTo("label required to post review on behalf of \"" + in.onBehalfOf + '"');
+
+    in.label("Code-Review", 1);
+    adminRestSession.postWithHeader(endpoint, runAsHeader(user2.id), in).assertOK();
+
+    PatchSetApproval psa = Iterables.getOnlyElement(r.getChange().approvals().values());
+    assertThat(psa.getPatchSetId().get()).isEqualTo(1);
+    assertThat(psa.getLabel()).isEqualTo("Code-Review");
+    assertThat(psa.getAccountId()).isEqualTo(user.id);
+    assertThat(psa.getValue()).isEqualTo(1);
+    assertThat(psa.getRealAccountId()).isEqualTo(admin.id); // not user2
+
+    ChangeData cd = r.getChange();
+    ChangeMessage m = Iterables.getLast(cmUtil.byChange(db, cd.notes()));
+    assertThat(m.getMessage()).endsWith(in.message);
+    assertThat(m.getAuthor()).isEqualTo(user.id);
+    assertThat(m.getRealAuthor()).isEqualTo(admin.id); // not user2
+  }
+
+  @Test
+  public void changeMessageCreatedOnBehalfOfHasRealUser() throws Exception {
+    allowCodeReviewOnBehalfOf();
+
+    PushOneCommit.Result r = createChange();
+    ReviewInput in = new ReviewInput();
+    in.onBehalfOf = user.id.toString();
+    in.message = "Message on behalf of";
+    in.label("Code-Review", 1);
+
+    setApiUser(accountCreator.user2());
+    gApi.changes().id(r.getChangeId()).revision(r.getPatchSetId().getId()).review(in);
+
+    ChangeInfo info = gApi.changes().id(r.getChangeId()).get(MESSAGES);
+    assertThat(info.messages).hasSize(2);
+
+    ChangeMessageInfo changeMessageInfo = Iterables.getLast(info.messages);
+    assertThat(changeMessageInfo.realAuthor).isNotNull();
+    assertThat(changeMessageInfo.realAuthor._accountId).isEqualTo(accountCreator.user2().id.get());
+  }
+
+  private void allowCodeReviewOnBehalfOf() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      LabelType codeReviewType = Util.codeReview();
+      String forCodeReviewAs = Permission.forLabelAs(codeReviewType.getName());
+      String heads = "refs/heads/*";
+      AccountGroup.UUID uuid = systemGroupBackend.getGroup(REGISTERED_USERS).getUUID();
+      Util.allow(u.getConfig(), forCodeReviewAs, -1, 1, uuid, heads);
+      u.save();
+    }
+  }
+
+  private void allowSubmitOnBehalfOf() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      String heads = "refs/heads/*";
+      AccountGroup.UUID uuid = systemGroupBackend.getGroup(REGISTERED_USERS).getUUID();
+      Util.allow(u.getConfig(), Permission.SUBMIT_AS, uuid, heads);
+      Util.allow(u.getConfig(), Permission.SUBMIT, uuid, heads);
+      LabelType codeReviewType = Util.codeReview();
+      Util.allow(u.getConfig(), Permission.forLabel(codeReviewType.getName()), -2, 2, uuid, heads);
+      u.save();
+    }
+  }
+
+  private void blockRead(GroupInfo group) throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      Util.block(
+          u.getConfig(), Permission.READ, new AccountGroup.UUID(group.id), "refs/heads/master");
+      u.save();
+    }
+  }
+
+  private void allowRunAs() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(allProjects)) {
+      Util.allow(
+          u.getConfig(),
+          GlobalCapability.RUN_AS,
+          systemGroupBackend.getGroup(ANONYMOUS_USERS).getUUID());
+      u.save();
+    }
+  }
+
+  private void removeRunAs() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(allProjects)) {
+      Util.remove(
+          u.getConfig(),
+          GlobalCapability.RUN_AS,
+          systemGroupBackend.getGroup(ANONYMOUS_USERS).getUUID());
+      u.save();
+    }
+  }
+
+  private static Header runAsHeader(Object user) {
+    return new BasicHeader("X-Gerrit-RunAs", user.toString());
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/account/PutUsernameIT.java b/javatests/com/google/gerrit/acceptance/rest/account/PutUsernameIT.java
new file mode 100644
index 0000000..ea71281
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/account/PutUsernameIT.java
@@ -0,0 +1,55 @@
+// Copyright (C) 2015 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.google.gerrit.acceptance.rest.account;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.extensions.api.accounts.UsernameInput;
+import org.junit.Test;
+
+public class PutUsernameIT extends AbstractDaemonTest {
+  @Test
+  public void set() throws Exception {
+    UsernameInput in = new UsernameInput();
+    in.username = "myUsername";
+    RestResponse r =
+        adminRestSession.put("/accounts/" + accountCreator.create().id.get() + "/username", in);
+    r.assertOK();
+    assertThat(newGson().fromJson(r.getReader(), String.class)).isEqualTo(in.username);
+  }
+
+  @Test
+  public void setExisting_Conflict() throws Exception {
+    UsernameInput in = new UsernameInput();
+    in.username = admin.username;
+    adminRestSession
+        .put("/accounts/" + accountCreator.create().id.get() + "/username", in)
+        .assertConflict();
+  }
+
+  @Test
+  public void setNew_MethodNotAllowed() throws Exception {
+    UsernameInput in = new UsernameInput();
+    in.username = "newUsername";
+    adminRestSession.put("/accounts/" + admin.username + "/username", in).assertMethodNotAllowed();
+  }
+
+  @Test
+  public void delete_MethodNotAllowed() throws Exception {
+    adminRestSession.put("/accounts/" + admin.username + "/username").assertMethodNotAllowed();
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/account/WatchedProjectsIT.java b/javatests/com/google/gerrit/acceptance/rest/account/WatchedProjectsIT.java
new file mode 100644
index 0000000..bc84593
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/account/WatchedProjectsIT.java
@@ -0,0 +1,243 @@
+// 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.
+
+package com.google.gerrit.acceptance.rest.account;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.Lists;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.extensions.client.ProjectWatchInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Test;
+
+public class WatchedProjectsIT extends AbstractDaemonTest {
+
+  private static final String NEW_PROJECT_NAME = "newProjectAccess";
+
+  @Test
+  public void setAndGetWatchedProjects() throws Exception {
+    String projectName1 = createProject(NEW_PROJECT_NAME).get();
+    String projectName2 = createProject(NEW_PROJECT_NAME + "2").get();
+
+    List<ProjectWatchInfo> projectsToWatch = new ArrayList<>(2);
+
+    ProjectWatchInfo pwi = new ProjectWatchInfo();
+    pwi.project = projectName1;
+    pwi.notifyAbandonedChanges = true;
+    pwi.notifyNewChanges = true;
+    pwi.notifyAllComments = true;
+    projectsToWatch.add(pwi);
+
+    pwi = new ProjectWatchInfo();
+    pwi.project = projectName2;
+    pwi.filter = "branch:master";
+    pwi.notifySubmittedChanges = true;
+    pwi.notifyNewPatchSets = true;
+    projectsToWatch.add(pwi);
+
+    List<ProjectWatchInfo> persistedWatchedProjects =
+        gApi.accounts().self().setWatchedProjects(projectsToWatch);
+    assertThat(persistedWatchedProjects).containsAllIn(projectsToWatch).inOrder();
+  }
+
+  @Test
+  public void setAndDeleteWatchedProjects() throws Exception {
+    String projectName1 = createProject(NEW_PROJECT_NAME).get();
+    String projectName2 = createProject(NEW_PROJECT_NAME + "2").get();
+
+    List<ProjectWatchInfo> projectsToWatch = new ArrayList<>();
+
+    ProjectWatchInfo pwi = new ProjectWatchInfo();
+    pwi.project = projectName1;
+    pwi.notifyAbandonedChanges = true;
+    pwi.notifyNewChanges = true;
+    pwi.notifyAllComments = true;
+    projectsToWatch.add(pwi);
+
+    pwi = new ProjectWatchInfo();
+    pwi.project = projectName2;
+    pwi.filter = "branch:master";
+    pwi.notifySubmittedChanges = true;
+    pwi.notifyNewPatchSets = true;
+    projectsToWatch.add(pwi);
+
+    // Persist watched projects
+    gApi.accounts().self().setWatchedProjects(projectsToWatch);
+
+    List<ProjectWatchInfo> d = Lists.newArrayList(pwi);
+    gApi.accounts().self().deleteWatchedProjects(d);
+    projectsToWatch.remove(pwi);
+
+    List<ProjectWatchInfo> persistedWatchedProjects = gApi.accounts().self().getWatchedProjects();
+
+    assertThat(persistedWatchedProjects).doesNotContain(pwi);
+    assertThat(persistedWatchedProjects).containsAllIn(projectsToWatch);
+  }
+
+  @Test
+  public void setConflictingWatches() throws Exception {
+    String projectName = createProject(NEW_PROJECT_NAME).get();
+
+    List<ProjectWatchInfo> projectsToWatch = new ArrayList<>();
+
+    ProjectWatchInfo pwi = new ProjectWatchInfo();
+    pwi.project = projectName;
+    pwi.notifyAbandonedChanges = true;
+    pwi.notifyNewChanges = true;
+    pwi.notifyAllComments = true;
+    projectsToWatch.add(pwi);
+
+    pwi = new ProjectWatchInfo();
+    pwi.project = projectName;
+    pwi.notifySubmittedChanges = true;
+    pwi.notifyNewPatchSets = true;
+    projectsToWatch.add(pwi);
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("duplicate entry for project " + projectName);
+    gApi.accounts().self().setWatchedProjects(projectsToWatch);
+  }
+
+  @Test
+  public void setAndGetEmptyWatch() throws Exception {
+    String projectName = createProject(NEW_PROJECT_NAME).get();
+
+    List<ProjectWatchInfo> projectsToWatch = new ArrayList<>();
+
+    ProjectWatchInfo pwi = new ProjectWatchInfo();
+    pwi.project = projectName;
+    projectsToWatch.add(pwi);
+
+    gApi.accounts().self().setWatchedProjects(projectsToWatch);
+    List<ProjectWatchInfo> persistedWatchedProjects = gApi.accounts().self().getWatchedProjects();
+    assertThat(persistedWatchedProjects).containsAllIn(projectsToWatch);
+  }
+
+  @Test
+  public void watchNonExistingProject() throws Exception {
+    String projectName = NEW_PROJECT_NAME + "3";
+
+    List<ProjectWatchInfo> projectsToWatch = new ArrayList<>(2);
+
+    ProjectWatchInfo pwi = new ProjectWatchInfo();
+    pwi.project = projectName;
+    pwi.notifyAbandonedChanges = true;
+    pwi.notifyNewChanges = true;
+    pwi.notifyAllComments = true;
+    projectsToWatch.add(pwi);
+
+    exception.expect(UnprocessableEntityException.class);
+    gApi.accounts().self().setWatchedProjects(projectsToWatch);
+  }
+
+  @Test
+  public void deleteNonExistingProjectWatch() throws Exception {
+    String projectName = project.get();
+
+    // Let another user watch a project
+    setApiUser(admin);
+    List<ProjectWatchInfo> projectsToWatch = new ArrayList<>();
+
+    ProjectWatchInfo pwi = new ProjectWatchInfo();
+    pwi.project = projectName;
+    pwi.notifyAbandonedChanges = true;
+    pwi.notifyNewChanges = true;
+    pwi.notifyAllComments = true;
+    projectsToWatch.add(pwi);
+
+    gApi.accounts().self().setWatchedProjects(projectsToWatch);
+
+    // Try to delete a watched project using a different user
+    List<ProjectWatchInfo> d = Lists.newArrayList(pwi);
+    gApi.accounts().self().deleteWatchedProjects(d);
+
+    // Check that trying to delete a non-existing watch doesn't fail
+    setApiUser(user);
+    gApi.accounts().self().deleteWatchedProjects(d);
+  }
+
+  @Test
+  public void modifyProjectWatchUsingOmittedValues() throws Exception {
+    String projectName = project.get();
+
+    // Let another user watch a project
+    setApiUser(admin);
+    List<ProjectWatchInfo> projectsToWatch = new ArrayList<>();
+
+    ProjectWatchInfo pwi = new ProjectWatchInfo();
+    pwi.project = projectName;
+    pwi.notifyAbandonedChanges = true;
+    pwi.notifyNewChanges = true;
+    pwi.notifyAllComments = true;
+    projectsToWatch.add(pwi);
+
+    // Persist a defined state
+    gApi.accounts().self().setWatchedProjects(projectsToWatch);
+
+    // Omit previously set value - will set it to false on the server
+    // The response will not carry this field then as we omit sending
+    // false values in JSON
+    pwi.notifyNewChanges = null;
+
+    // Perform update
+    gApi.accounts().self().setWatchedProjects(projectsToWatch);
+
+    List<ProjectWatchInfo> watchedProjects = gApi.accounts().self().getWatchedProjects();
+
+    assertThat(watchedProjects).containsAllIn(projectsToWatch);
+  }
+
+  @Test
+  public void setAndDeleteWatchedProjectsWithDifferentFilter() throws Exception {
+    String projectName = project.get();
+
+    List<ProjectWatchInfo> projectsToWatch = new ArrayList<>();
+
+    ProjectWatchInfo pwi = new ProjectWatchInfo();
+    pwi.project = projectName;
+    pwi.filter = "branch:stable";
+    pwi.notifyAbandonedChanges = true;
+    pwi.notifyNewChanges = true;
+    pwi.notifyAllComments = true;
+    projectsToWatch.add(pwi);
+
+    pwi = new ProjectWatchInfo();
+    pwi.project = projectName;
+    pwi.filter = "branch:master";
+    pwi.notifySubmittedChanges = true;
+    pwi.notifyNewPatchSets = true;
+    projectsToWatch.add(pwi);
+
+    // Persist watched projects
+    gApi.accounts().self().setWatchedProjects(projectsToWatch);
+
+    List<ProjectWatchInfo> d = Lists.newArrayList(pwi);
+    gApi.accounts().self().deleteWatchedProjects(d);
+    projectsToWatch.remove(pwi);
+
+    List<ProjectWatchInfo> persistedWatchedProjects = gApi.accounts().self().getWatchedProjects();
+
+    assertThat(persistedWatchedProjects).doesNotContain(pwi);
+    assertThat(persistedWatchedProjects).containsAllIn(projectsToWatch);
+  }
+
+  @Test
+  public void postWithoutBody() throws Exception {
+    adminRestSession.post("/accounts/" + admin.username + "/watched.projects").assertOK();
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java b/javatests/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java
new file mode 100644
index 0000000..08a76e4
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java
@@ -0,0 +1,1370 @@
+// Copyright (C) 2013 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.google.gerrit.acceptance.rest.change;
+
+import static com.google.common.collect.Iterables.getOnlyElement;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth8.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_REVISION;
+import static com.google.gerrit.extensions.client.ListChangesOption.DETAILED_LABELS;
+import static com.google.gerrit.extensions.client.ListChangesOption.SUBMITTABLE;
+import static com.google.gerrit.server.group.SystemGroupBackend.CHANGE_OWNER;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.GitUtil;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.TestAccount;
+import com.google.gerrit.acceptance.TestProjectInput;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.changes.ChangeApi;
+import com.google.gerrit.extensions.api.changes.SubmitInput;
+import com.google.gerrit.extensions.api.projects.BranchInput;
+import com.google.gerrit.extensions.api.projects.ConfigInput;
+import com.google.gerrit.extensions.api.projects.ProjectInput;
+import com.google.gerrit.extensions.client.ChangeStatus;
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.extensions.client.ListChangesOption;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.ChangeInput;
+import com.google.gerrit.extensions.common.LabelInfo;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BinaryResult;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.webui.UiAction;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.ApprovalsUtil;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.change.TestSubmitInput;
+import com.google.gerrit.server.git.validators.OnSubmitValidationListener;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.project.testing.Util;
+import com.google.gerrit.server.restapi.change.Submit;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.server.validators.ValidationException;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.gerrit.testing.TestTimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
+import org.eclipse.jgit.diff.DiffFormatter;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.ReceiveCommand;
+import org.eclipse.jgit.transport.RefSpec;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+@NoHttpd
+public abstract class AbstractSubmit extends AbstractDaemonTest {
+  @ConfigSuite.Config
+  public static Config submitWholeTopicEnabled() {
+    return submitWholeTopicEnabledConfig();
+  }
+
+  @Inject private ApprovalsUtil approvalsUtil;
+
+  @Inject private Submit submitHandler;
+
+  @Inject private IdentifiedUser.GenericFactory userFactory;
+
+  @Inject private DynamicSet<OnSubmitValidationListener> onSubmitValidationListeners;
+  private RegistrationHandle onSubmitValidatorHandle;
+
+  private String systemTimeZone;
+
+  @Before
+  public void setTimeForTesting() {
+    systemTimeZone = System.setProperty("user.timezone", "US/Eastern");
+    TestTimeUtil.resetWithClockStep(1, SECONDS);
+  }
+
+  @After
+  public void resetTime() {
+    TestTimeUtil.useSystemTime();
+    System.setProperty("user.timezone", systemTimeZone);
+  }
+
+  @After
+  public void cleanup() {
+    db.close();
+  }
+
+  @After
+  public void removeOnSubmitValidator() {
+    if (onSubmitValidatorHandle != null) {
+      onSubmitValidatorHandle.remove();
+    }
+  }
+
+  protected abstract SubmitType getSubmitType();
+
+  @Test
+  @TestProjectInput(createEmptyCommit = false)
+  public void submitToEmptyRepo() throws Exception {
+    assertThat(getRemoteHead()).isNull();
+    PushOneCommit.Result change = createChange();
+    assertThat(change.getCommit().getParents()).isEmpty();
+    Map<Branch.NameKey, ObjectId> actual = fetchFromSubmitPreview(change.getChangeId());
+    RevCommit headAfterSubmitPreview = getRemoteHead();
+    assertThat(headAfterSubmitPreview).isNull();
+    assertThat(actual).hasSize(1);
+
+    submit(change.getChangeId());
+    assertThat(getRemoteHead().getId()).isEqualTo(change.getCommit());
+    assertTrees(project, actual);
+  }
+
+  @Test
+  public void submitSingleChange() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+    PushOneCommit.Result change = createChange();
+    Map<Branch.NameKey, ObjectId> actual = fetchFromSubmitPreview(change.getChangeId());
+    RevCommit headAfterSubmit = getRemoteHead();
+    assertThat(headAfterSubmit).isEqualTo(initialHead);
+    assertRefUpdatedEvents();
+    assertChangeMergedEvents();
+
+    if ((getSubmitType() == SubmitType.CHERRY_PICK)
+        || (getSubmitType() == SubmitType.REBASE_ALWAYS)) {
+      // The change is updated as well:
+      assertThat(actual).hasSize(2);
+    } else {
+      assertThat(actual).hasSize(1);
+    }
+
+    submit(change.getChangeId());
+    assertTrees(project, actual);
+  }
+
+  @Test
+  public void submitMultipleChangesOtherMergeConflictPreview() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+
+    PushOneCommit.Result change = createChange("Change 1", "a.txt", "content");
+    submit(change.getChangeId());
+
+    RevCommit headAfterFirstSubmit = getRemoteHead();
+    testRepo.reset(initialHead);
+    PushOneCommit.Result change2 = createChange("Change 2", "a.txt", "other content");
+    PushOneCommit.Result change3 = createChange("Change 3", "d", "d");
+    PushOneCommit.Result change4 = createChange("Change 4", "e", "e");
+    // change 2 is not approved, but we ignore labels
+    approve(change3.getChangeId());
+
+    try (BinaryResult request =
+        gApi.changes().id(change4.getChangeId()).current().submitPreview()) {
+      assertThat(getSubmitType()).isEqualTo(SubmitType.CHERRY_PICK);
+      submit(change4.getChangeId());
+    } catch (RestApiException e) {
+      switch (getSubmitType()) {
+        case FAST_FORWARD_ONLY:
+          assertThat(e.getMessage())
+              .isEqualTo(
+                  "Failed to submit 3 changes due to the following problems:\n"
+                      + "Change "
+                      + change2.getChange().getId()
+                      + ": internal error: "
+                      + "change not processed by merge strategy\n"
+                      + "Change "
+                      + change3.getChange().getId()
+                      + ": internal error: "
+                      + "change not processed by merge strategy\n"
+                      + "Change "
+                      + change4.getChange().getId()
+                      + ": Project policy "
+                      + "requires all submissions to be a fast-forward. Please "
+                      + "rebase the change locally and upload again for review.");
+          break;
+        case REBASE_IF_NECESSARY:
+        case REBASE_ALWAYS:
+          String change2hash = change2.getChange().currentPatchSet().getRevision().get();
+          assertThat(e.getMessage())
+              .isEqualTo(
+                  "Cannot rebase "
+                      + change2hash
+                      + ": The change could "
+                      + "not be rebased due to a conflict during merge.");
+          break;
+        case MERGE_ALWAYS:
+        case MERGE_IF_NECESSARY:
+        case INHERIT:
+          assertThat(e.getMessage())
+              .isEqualTo(
+                  "Failed to submit 3 changes due to the following problems:\n"
+                      + "Change "
+                      + change2.getChange().getId()
+                      + ": Change could not be "
+                      + "merged due to a path conflict. Please rebase the change "
+                      + "locally and upload the rebased commit for review.\n"
+                      + "Change "
+                      + change3.getChange().getId()
+                      + ": Change could not be "
+                      + "merged due to a path conflict. Please rebase the change "
+                      + "locally and upload the rebased commit for review.\n"
+                      + "Change "
+                      + change4.getChange().getId()
+                      + ": Change could not be "
+                      + "merged due to a path conflict. Please rebase the change "
+                      + "locally and upload the rebased commit for review.");
+          break;
+        case CHERRY_PICK:
+        default:
+          fail("Should not reach here.");
+          break;
+      }
+
+      RevCommit headAfterSubmit = getRemoteHead();
+      assertThat(headAfterSubmit).isEqualTo(headAfterFirstSubmit);
+      assertRefUpdatedEvents(initialHead, headAfterFirstSubmit);
+      assertChangeMergedEvents(change.getChangeId(), headAfterFirstSubmit.name());
+    }
+  }
+
+  @Test
+  public void submitMultipleChangesPreview() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+    PushOneCommit.Result change2 = createChange("Change 2", "a.txt", "other content");
+    PushOneCommit.Result change3 = createChange("Change 3", "d", "d");
+    PushOneCommit.Result change4 = createChange("Change 4", "e", "e");
+    // change 2 is not approved, but we ignore labels
+    approve(change3.getChangeId());
+    Map<Branch.NameKey, ObjectId> actual = fetchFromSubmitPreview(change4.getChangeId());
+    Map<String, Map<String, Integer>> expected = new HashMap<>();
+    expected.put(project.get(), new HashMap<>());
+    expected.get(project.get()).put("refs/heads/master", 3);
+
+    assertThat(actual).containsKey(new Branch.NameKey(project, "refs/heads/master"));
+    if (getSubmitType() == SubmitType.CHERRY_PICK) {
+      // CherryPick ignores dependencies, thus only change and destination
+      // branch refs are modified.
+      assertThat(actual).hasSize(2);
+    } else if (getSubmitType() == SubmitType.REBASE_ALWAYS) {
+      // RebaseAlways takes care of dependencies, therefore Change{2,3,4} and
+      // destination branch will be modified.
+      assertThat(actual).hasSize(4);
+    } else {
+      assertThat(actual).hasSize(1);
+    }
+
+    // check that the submit preview did not actually submit
+    RevCommit headAfterSubmit = getRemoteHead();
+    assertThat(headAfterSubmit).isEqualTo(initialHead);
+    assertRefUpdatedEvents();
+    assertChangeMergedEvents();
+
+    // now check we actually have the same content:
+    approve(change2.getChangeId());
+    submit(change4.getChangeId());
+    assertTrees(project, actual);
+  }
+
+  @Test
+  public void submitNoPermission() throws Exception {
+    // create project where submit is blocked
+    Project.NameKey p = createProject("p");
+    block(p, "refs/*", Permission.SUBMIT, REGISTERED_USERS);
+
+    TestRepository<InMemoryRepository> repo = cloneProject(p, admin);
+    PushOneCommit push = pushFactory.create(db, admin.getIdent(), repo);
+    PushOneCommit.Result result = push.to("refs/for/master");
+    result.assertOkStatus();
+
+    submit(result.getChangeId(), new SubmitInput(), AuthException.class, "submit not permitted");
+  }
+
+  @Test
+  public void noSelfSubmit() throws Exception {
+    // create project where submit is blocked for the change owner
+    Project.NameKey p = createProject("p");
+    try (ProjectConfigUpdate u = updateProject(p)) {
+      Util.block(u.getConfig(), Permission.SUBMIT, CHANGE_OWNER, "refs/*");
+      Util.allow(u.getConfig(), Permission.SUBMIT, REGISTERED_USERS, "refs/heads/*");
+      Util.allow(
+          u.getConfig(), Permission.forLabel("Code-Review"), -2, +2, REGISTERED_USERS, "refs/*");
+      u.save();
+    }
+
+    TestRepository<InMemoryRepository> repo = cloneProject(p, admin);
+    PushOneCommit push = pushFactory.create(db, admin.getIdent(), repo);
+    PushOneCommit.Result result = push.to("refs/for/master");
+    result.assertOkStatus();
+
+    ChangeInfo change = gApi.changes().id(result.getChangeId()).get();
+    assertThat(change.owner._accountId).isEqualTo(admin.id.get());
+
+    submit(result.getChangeId(), new SubmitInput(), AuthException.class, "submit not permitted");
+
+    setApiUser(user);
+    submit(result.getChangeId());
+  }
+
+  @Test
+  public void onlySelfSubmit() throws Exception {
+    // create project where only the change owner can submit
+    Project.NameKey p = createProject("p");
+    try (ProjectConfigUpdate u = updateProject(p)) {
+      Util.block(u.getConfig(), Permission.SUBMIT, REGISTERED_USERS, "refs/*");
+      Util.allow(u.getConfig(), Permission.SUBMIT, CHANGE_OWNER, "refs/*");
+      Util.allow(
+          u.getConfig(), Permission.forLabel("Code-Review"), -2, +2, REGISTERED_USERS, "refs/*");
+      u.save();
+    }
+
+    TestRepository<InMemoryRepository> repo = cloneProject(p, admin);
+    PushOneCommit push = pushFactory.create(db, admin.getIdent(), repo);
+    PushOneCommit.Result result = push.to("refs/for/master");
+    result.assertOkStatus();
+
+    ChangeInfo change = gApi.changes().id(result.getChangeId()).get();
+    assertThat(change.owner._accountId).isEqualTo(admin.id.get());
+
+    setApiUser(user);
+    submit(result.getChangeId(), new SubmitInput(), AuthException.class, "submit not permitted");
+
+    setApiUser(admin);
+    submit(result.getChangeId());
+  }
+
+  @Test
+  public void submitWholeTopicMultipleProjects() throws Exception {
+    assume().that(isSubmitWholeTopicEnabled()).isTrue();
+    String topic = "test-topic";
+
+    // Create test projects
+    TestRepository<?> repoA = createProjectWithPush("project-a", null, getSubmitType());
+    TestRepository<?> repoB = createProjectWithPush("project-b", null, getSubmitType());
+
+    // Create changes on project-a
+    PushOneCommit.Result change1 =
+        createChange(repoA, "master", "Change 1", "a.txt", "content", topic);
+    PushOneCommit.Result change2 =
+        createChange(repoA, "master", "Change 2", "b.txt", "content", topic);
+
+    // Create changes on project-b
+    PushOneCommit.Result change3 =
+        createChange(repoB, "master", "Change 3", "a.txt", "content", topic);
+    PushOneCommit.Result change4 =
+        createChange(repoB, "master", "Change 4", "b.txt", "content", topic);
+
+    approve(change1.getChangeId());
+    approve(change2.getChangeId());
+    approve(change3.getChangeId());
+    approve(change4.getChangeId());
+    submit(change4.getChangeId());
+
+    String expectedTopic = name(topic);
+    change1.assertChange(Change.Status.MERGED, expectedTopic, admin);
+    change2.assertChange(Change.Status.MERGED, expectedTopic, admin);
+    change3.assertChange(Change.Status.MERGED, expectedTopic, admin);
+    change4.assertChange(Change.Status.MERGED, expectedTopic, admin);
+  }
+
+  @Test
+  public void submitWholeTopicMultipleBranchesOnSameProject() throws Exception {
+    assume().that(isSubmitWholeTopicEnabled()).isTrue();
+    String topic = "test-topic";
+
+    // Create test project
+    String projectName = "project-a";
+    TestRepository<?> repoA = createProjectWithPush(projectName, null, getSubmitType());
+
+    RevCommit initialHead = getRemoteHead(new Project.NameKey(name(projectName)), "master");
+
+    // Create the dev branch on the test project
+    BranchInput in = new BranchInput();
+    in.revision = initialHead.name();
+    gApi.projects().name(name(projectName)).branch("dev").create(in);
+
+    // Create changes on master
+    PushOneCommit.Result change1 =
+        createChange(repoA, "master", "Change 1", "a.txt", "content", topic);
+    PushOneCommit.Result change2 =
+        createChange(repoA, "master", "Change 2", "b.txt", "content", topic);
+
+    // Create  changes on dev
+    repoA.reset(initialHead);
+    PushOneCommit.Result change3 =
+        createChange(repoA, "dev", "Change 3", "a.txt", "content", topic);
+    PushOneCommit.Result change4 =
+        createChange(repoA, "dev", "Change 4", "b.txt", "content", topic);
+
+    approve(change1.getChangeId());
+    approve(change2.getChangeId());
+    approve(change3.getChangeId());
+    approve(change4.getChangeId());
+    submit(change4.getChangeId());
+
+    String expectedTopic = name(topic);
+    change1.assertChange(Change.Status.MERGED, expectedTopic, admin);
+    change2.assertChange(Change.Status.MERGED, expectedTopic, admin);
+    change3.assertChange(Change.Status.MERGED, expectedTopic, admin);
+    change4.assertChange(Change.Status.MERGED, expectedTopic, admin);
+  }
+
+  @Test
+  public void submitWholeTopic() throws Exception {
+    assume().that(isSubmitWholeTopicEnabled()).isTrue();
+    String topic = "test-topic";
+    PushOneCommit.Result change1 = createChange("Change 1", "a.txt", "content", topic);
+    PushOneCommit.Result change2 = createChange("Change 2", "b.txt", "content", topic);
+    PushOneCommit.Result change3 = createChange("Change 3", "c.txt", "content", topic);
+    approve(change1.getChangeId());
+    approve(change2.getChangeId());
+    approve(change3.getChangeId());
+    submit(change3.getChangeId());
+    String expectedTopic = name(topic);
+    change1.assertChange(Change.Status.MERGED, expectedTopic, admin);
+    change2.assertChange(Change.Status.MERGED, expectedTopic, admin);
+    change3.assertChange(Change.Status.MERGED, expectedTopic, admin);
+
+    // Check for the exact change to have the correct submitter.
+    assertSubmitter(change3);
+    // Also check submitters for changes submitted via the topic relationship.
+    assertSubmitter(change1);
+    assertSubmitter(change2);
+
+    // Check that the repo has the expected commits
+    List<RevCommit> log = getRemoteLog();
+    List<String> commitsInRepo = log.stream().map(RevCommit::getShortMessage).collect(toList());
+    int expectedCommitCount =
+        getSubmitType() == SubmitType.MERGE_ALWAYS
+            ? 5 // initial commit + 3 commits + merge commit
+            : 4; // initial commit + 3 commits
+    assertThat(log).hasSize(expectedCommitCount);
+
+    assertThat(commitsInRepo)
+        .containsAllOf("Initial empty repository", "Change 1", "Change 2", "Change 3");
+    if (getSubmitType() == SubmitType.MERGE_ALWAYS) {
+      assertThat(commitsInRepo).contains("Merge changes from topic \"" + expectedTopic + "\"");
+    }
+  }
+
+  @Test
+  public void submitReusingOldTopic() throws Exception {
+    assume().that(isSubmitWholeTopicEnabled()).isTrue();
+
+    String topic = "test-topic";
+    PushOneCommit.Result change1 = createChange("Change 1", "a.txt", "content", topic);
+    PushOneCommit.Result change2 = createChange("Change 2", "a.txt", "content", topic);
+    String id1 = change1.getChangeId();
+    String id2 = change2.getChangeId();
+    approve(id1);
+    approve(id2);
+    assertSubmittedTogether(id1, ImmutableList.of(id1, id2));
+    assertSubmittedTogether(id2, ImmutableList.of(id1, id2));
+    submit(id2);
+
+    String expectedTopic = name(topic);
+    change1.assertChange(Change.Status.MERGED, expectedTopic, admin);
+    change2.assertChange(Change.Status.MERGED, expectedTopic, admin);
+    assertSubmittedTogether(id1, ImmutableList.of(id1, id2));
+    assertSubmittedTogether(id2, ImmutableList.of(id1, id2));
+
+    PushOneCommit.Result change3 = createChange("Change 3", "c.txt", "content", topic);
+    String id3 = change3.getChangeId();
+    approve(id3);
+    assertSubmittedTogether(id3, ImmutableList.of());
+    submit(id3);
+
+    change3.assertChange(Change.Status.MERGED, expectedTopic, admin);
+    assertSubmittedTogether(id3, ImmutableList.of());
+  }
+
+  private void assertSubmittedTogether(String changeId, Iterable<String> expected)
+      throws Exception {
+    assertThat(gApi.changes().id(changeId).submittedTogether().stream().map(i -> i.changeId))
+        .containsExactlyElementsIn(expected);
+  }
+
+  @Test
+  public void submitWorkInProgressChange() throws Exception {
+    PushOneCommit.Result change = pushTo("refs/for/master%wip");
+    Change.Id num = change.getChange().getId();
+    submitWithConflict(
+        change.getChangeId(),
+        "Failed to submit 1 change due to the following problems:\n"
+            + "Change "
+            + num
+            + ": Change "
+            + num
+            + " is work in progress");
+  }
+
+  @Test
+  public void submitWithHiddenBranchInSameTopic() throws Exception {
+    assume().that(isSubmitWholeTopicEnabled()).isTrue();
+    PushOneCommit.Result visible = createChange("refs/for/master/" + name("topic"));
+    Change.Id num = visible.getChange().getId();
+
+    createBranch(new Branch.NameKey(project, "hidden"));
+    PushOneCommit.Result hidden = createChange("refs/for/hidden/" + name("topic"));
+    approve(hidden.getChangeId());
+    blockRead("refs/heads/hidden");
+
+    submit(
+        visible.getChangeId(),
+        new SubmitInput(),
+        AuthException.class,
+        "A change to be submitted with " + num + " is not visible");
+  }
+
+  @Test
+  public void submitChangeWhenParentOfOtherBranchTip() throws Exception {
+    // Chain of two commits
+    // Push both to topic-branch
+    // Push the first commit for review and submit
+    //
+    // C2 -- tip of topic branch
+    //  |
+    // C1 -- pushed for review
+    //  |
+    // C0 -- Master
+    //
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      u.getConfig()
+          .getProject()
+          .setBooleanConfig(
+              BooleanProjectConfig.CREATE_NEW_CHANGE_FOR_ALL_NOT_IN_TARGET,
+              InheritableBoolean.TRUE);
+      u.save();
+    }
+
+    PushOneCommit push1 =
+        pushFactory.create(
+            db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "a.txt", "content");
+    PushOneCommit.Result c1 = push1.to("refs/heads/topic");
+    c1.assertOkStatus();
+    PushOneCommit push2 =
+        pushFactory.create(
+            db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT, "b.txt", "anotherContent");
+    PushOneCommit.Result c2 = push2.to("refs/heads/topic");
+    c2.assertOkStatus();
+
+    PushOneCommit.Result change1 = push1.to("refs/for/master");
+    change1.assertOkStatus();
+
+    approve(change1.getChangeId());
+    submit(change1.getChangeId());
+  }
+
+  @Test
+  public void submitMergeOfNonChangeBranchTip() throws Exception {
+    // Merge a branch with commits that have not been submitted as
+    // changes.
+    //
+    // M  -- mergeCommit (pushed for review and submitted)
+    // | \
+    // |  S -- stable (pushed directly to refs/heads/stable)
+    // | /
+    // I   -- master
+    //
+    RevCommit master = getRemoteHead(project, "master");
+    PushOneCommit stableTip =
+        pushFactory.create(
+            db, admin.getIdent(), testRepo, "Tip of branch stable", "stable.txt", "");
+    PushOneCommit.Result stable = stableTip.to("refs/heads/stable");
+    PushOneCommit mergeCommit =
+        pushFactory.create(db, admin.getIdent(), testRepo, "The merge commit", "merge.txt", "");
+    mergeCommit.setParents(ImmutableList.of(master, stable.getCommit()));
+    PushOneCommit.Result mergeReview = mergeCommit.to("refs/for/master");
+    approve(mergeReview.getChangeId());
+    submit(mergeReview.getChangeId());
+
+    List<RevCommit> log = getRemoteLog();
+    assertThat(log).contains(stable.getCommit());
+    assertThat(log).contains(mergeReview.getCommit());
+  }
+
+  @Test
+  public void submitMergeOfNonChangeBranchNonTip() throws Exception {
+    // Merge a branch with commits that have not been submitted as
+    // changes.
+    //
+    // MC  -- merge commit (pushed for review and submitted)
+    // |\   S2 -- new stable tip (pushed directly to refs/heads/stable)
+    // M \ /
+    // |  S1 -- stable (pushed directly to refs/heads/stable)
+    // | /
+    // I -- master
+    //
+    RevCommit initial = getRemoteHead(project, "master");
+    // push directly to stable to S1
+    PushOneCommit.Result s1 =
+        pushFactory
+            .create(db, admin.getIdent(), testRepo, "new commit into stable", "stable1.txt", "")
+            .to("refs/heads/stable");
+    // move the stable tip ahead to S2
+    pushFactory
+        .create(db, admin.getIdent(), testRepo, "Tip of branch stable", "stable2.txt", "")
+        .to("refs/heads/stable");
+
+    testRepo.reset(initial);
+
+    // move the master ahead
+    PushOneCommit.Result m =
+        pushFactory
+            .create(db, admin.getIdent(), testRepo, "Move master ahead", "master.txt", "")
+            .to("refs/heads/master");
+
+    // create merge change
+    PushOneCommit mc =
+        pushFactory.create(db, admin.getIdent(), testRepo, "The merge commit", "merge.txt", "");
+    mc.setParents(ImmutableList.of(m.getCommit(), s1.getCommit()));
+    PushOneCommit.Result mergeReview = mc.to("refs/for/master");
+    approve(mergeReview.getChangeId());
+    submit(mergeReview.getChangeId());
+
+    List<RevCommit> log = getRemoteLog();
+    assertThat(log).contains(s1.getCommit());
+    assertThat(log).contains(mergeReview.getCommit());
+  }
+
+  @Test
+  public void submitChangeWithCommitThatWasAlreadyMerged() throws Exception {
+    // create and submit a change
+    PushOneCommit.Result change = createChange();
+    submit(change.getChangeId());
+    RevCommit headAfterSubmit = getRemoteHead();
+
+    // set the status of the change back to NEW to simulate a failed submit that
+    // merged the commit but failed to update the change status
+    setChangeStatusToNew(change);
+
+    // submitting the change again should detect that the commit was already
+    // merged and just fix the change status to be MERGED
+    submit(change.getChangeId());
+    assertThat(getRemoteHead()).isEqualTo(headAfterSubmit);
+  }
+
+  @Test
+  public void submitChangesWithCommitsThatWereAlreadyMerged() throws Exception {
+    // create and submit 2 changes
+    PushOneCommit.Result change1 = createChange();
+    PushOneCommit.Result change2 = createChange();
+    approve(change1.getChangeId());
+    if (getSubmitType() == SubmitType.CHERRY_PICK) {
+      submit(change1.getChangeId());
+    }
+    submit(change2.getChangeId());
+    assertMerged(change1.getChangeId());
+    RevCommit headAfterSubmit = getRemoteHead();
+
+    // set the status of the changes back to NEW to simulate a failed submit that
+    // merged the commits but failed to update the change status
+    setChangeStatusToNew(change1, change2);
+
+    // submitting the changes again should detect that the commits were already
+    // merged and just fix the change status to be MERGED
+    submit(change1.getChangeId());
+    submit(change2.getChangeId());
+    assertThat(getRemoteHead()).isEqualTo(headAfterSubmit);
+  }
+
+  @Test
+  public void submitTopicWithCommitsThatWereAlreadyMerged() throws Exception {
+    assume().that(isSubmitWholeTopicEnabled()).isTrue();
+
+    // create and submit 2 changes with the same topic
+    String topic = name("topic");
+    PushOneCommit.Result change1 = createChange("refs/for/master/" + topic);
+    PushOneCommit.Result change2 = createChange("refs/for/master/" + topic);
+    approve(change1.getChangeId());
+    submit(change2.getChangeId());
+    assertMerged(change1.getChangeId());
+    RevCommit headAfterSubmit = getRemoteHead();
+
+    // set the status of the second change back to NEW to simulate a failed
+    // submit that merged the commits but failed to update the change status of
+    // some changes in the topic
+    setChangeStatusToNew(change2);
+
+    // submitting the topic again should detect that the commits were already
+    // merged and just fix the change status to be MERGED
+    submit(change2.getChangeId());
+    assertThat(getRemoteHead()).isEqualTo(headAfterSubmit);
+  }
+
+  @Test
+  public void submitWithValidation() throws Exception {
+    AtomicBoolean called = new AtomicBoolean(false);
+    this.addOnSubmitValidationListener(
+        new OnSubmitValidationListener() {
+          @Override
+          public void preBranchUpdate(Arguments args) throws ValidationException {
+            called.set(true);
+            HashSet<String> refs = Sets.newHashSet(args.getCommands().keySet());
+            assertThat(refs).contains("refs/heads/master");
+            refs.remove("refs/heads/master");
+            if (!refs.isEmpty()) {
+              // Some submit strategies need to insert new patchset.
+              assertThat(refs).hasSize(1);
+              assertThat(refs.iterator().next()).startsWith(RefNames.REFS_CHANGES);
+            }
+          }
+        });
+
+    PushOneCommit.Result change = createChange();
+    approve(change.getChangeId());
+    submit(change.getChangeId());
+    assertThat(called.get()).isTrue();
+  }
+
+  @Test
+  public void submitWithValidationMultiRepo() throws Exception {
+    assume().that(isSubmitWholeTopicEnabled()).isTrue();
+    String topic = "test-topic";
+
+    // Create test projects
+    TestRepository<?> repoA = createProjectWithPush("project-a", null, getSubmitType());
+    TestRepository<?> repoB = createProjectWithPush("project-b", null, getSubmitType());
+
+    // Create changes on project-a
+    PushOneCommit.Result change1 =
+        createChange(repoA, "master", "Change 1", "a.txt", "content", topic);
+    PushOneCommit.Result change2 =
+        createChange(repoA, "master", "Change 2", "b.txt", "content", topic);
+
+    // Create changes on project-b
+    PushOneCommit.Result change3 =
+        createChange(repoB, "master", "Change 3", "a.txt", "content", topic);
+    PushOneCommit.Result change4 =
+        createChange(repoB, "master", "Change 4", "b.txt", "content", topic);
+
+    List<PushOneCommit.Result> changes = Lists.newArrayList(change1, change2, change3, change4);
+    for (PushOneCommit.Result change : changes) {
+      approve(change.getChangeId());
+    }
+
+    // Construct validator which will throw on a second call.
+    // Since there are 2 repos, first submit attempt will fail, the second will
+    // succeed.
+    List<String> projectsCalled = new ArrayList<>(4);
+    this.addOnSubmitValidationListener(
+        new OnSubmitValidationListener() {
+          @Override
+          public void preBranchUpdate(Arguments args) throws ValidationException {
+            String master = "refs/heads/master";
+            assertThat(args.getCommands()).containsKey(master);
+            ReceiveCommand cmd = args.getCommands().get(master);
+            ObjectId newMasterId = cmd.getNewId();
+            try (Repository repo = repoManager.openRepository(args.getProject())) {
+              assertThat(repo.exactRef(master).getObjectId()).isEqualTo(cmd.getOldId());
+              assertThat(args.getRef(master)).hasValue(newMasterId);
+              args.getRevWalk().parseBody(args.getRevWalk().parseCommit(newMasterId));
+            } catch (IOException e) {
+              throw new AssertionError("failed checking new ref value", e);
+            }
+            projectsCalled.add(args.getProject().get());
+            if (projectsCalled.size() == 2) {
+              throw new ValidationException("time to fail");
+            }
+          }
+        });
+    submitWithConflict(change4.getChangeId(), "time to fail");
+    assertThat(projectsCalled).containsExactly(name("project-a"), name("project-b"));
+    for (PushOneCommit.Result change : changes) {
+      change.assertChange(Change.Status.NEW, name(topic), admin);
+    }
+
+    submit(change4.getChangeId());
+    assertThat(projectsCalled)
+        .containsExactly(
+            name("project-a"), name("project-b"), name("project-a"), name("project-b"));
+    for (PushOneCommit.Result change : changes) {
+      change.assertChange(Change.Status.MERGED, name(topic), admin);
+    }
+  }
+
+  @Test
+  public void submitWithCommitAndItsMergeCommitTogether() throws Exception {
+    assume().that(isSubmitWholeTopicEnabled()).isTrue();
+
+    RevCommit initialHead = getRemoteHead();
+
+    // Create a stable branch and bootstrap it.
+    gApi.projects().name(project.get()).branch("stable").create(new BranchInput());
+    PushOneCommit push =
+        pushFactory.create(db, user.getIdent(), testRepo, "initial commit", "a.txt", "a");
+    PushOneCommit.Result change = push.to("refs/heads/stable");
+
+    RevCommit stable = getRemoteHead(project, "stable");
+    RevCommit master = getRemoteHead(project, "master");
+
+    assertThat(master).isEqualTo(initialHead);
+    assertThat(stable).isEqualTo(change.getCommit());
+
+    testRepo.git().fetch().call();
+    testRepo.git().branchCreate().setName("stable").setStartPoint(stable).call();
+    testRepo.git().branchCreate().setName("master").setStartPoint(master).call();
+
+    // Create a fix in stable branch.
+    testRepo.reset(stable);
+    RevCommit fix =
+        testRepo
+            .commit()
+            .parent(stable)
+            .message("small fix")
+            .add("b.txt", "b")
+            .insertChangeId()
+            .create();
+    testRepo.branch("refs/heads/stable").update(fix);
+    testRepo
+        .git()
+        .push()
+        .setRefSpecs(new RefSpec("refs/heads/stable:refs/for/stable/" + name("topic")))
+        .call();
+
+    // Merge the fix into master.
+    testRepo.reset(master);
+    RevCommit merge =
+        testRepo
+            .commit()
+            .parent(master)
+            .parent(fix)
+            .message("Merge stable into master")
+            .insertChangeId()
+            .create();
+    testRepo.branch("refs/heads/master").update(merge);
+    testRepo
+        .git()
+        .push()
+        .setRefSpecs(new RefSpec("refs/heads/master:refs/for/master/" + name("topic")))
+        .call();
+
+    // Submit together.
+    String fixId = GitUtil.getChangeId(testRepo, fix).get();
+    String mergeId = GitUtil.getChangeId(testRepo, merge).get();
+    approve(fixId);
+    approve(mergeId);
+    submit(mergeId);
+    assertMerged(fixId);
+    assertMerged(mergeId);
+    testRepo.git().fetch().call();
+    RevWalk rw = testRepo.getRevWalk();
+    master = rw.parseCommit(getRemoteHead(project, "master"));
+    assertThat(rw.isMergedInto(merge, master)).isTrue();
+    assertThat(rw.isMergedInto(fix, master)).isTrue();
+  }
+
+  @Test
+  public void retrySubmitSingleChangeOnLockFailure() throws Exception {
+    assume().that(notesMigration.disableChangeReviewDb()).isTrue();
+
+    PushOneCommit.Result change = createChange();
+    String id = change.getChangeId();
+    approve(id);
+
+    TestSubmitInput input = new TestSubmitInput();
+    input.generateLockFailures =
+        new ArrayDeque<>(
+            ImmutableList.of(
+                true, // Attempt 1: lock failure
+                false, // Attempt 2: success
+                false)); // Leftover value to check total number of calls.
+    submit(id, input);
+    assertMerged(id);
+
+    testRepo.git().fetch().call();
+    RevWalk rw = testRepo.getRevWalk();
+    RevCommit master = rw.parseCommit(getRemoteHead(project, "master"));
+    RevCommit patchSet = parseCurrentRevision(rw, change.getChangeId());
+    assertThat(rw.isMergedInto(patchSet, master)).isTrue();
+
+    assertThat(input.generateLockFailures).containsExactly(false);
+  }
+
+  @Test
+  public void retrySubmitAfterTornTopicOnLockFailure() throws Exception {
+    assume().that(notesMigration.disableChangeReviewDb()).isTrue();
+    assume().that(isSubmitWholeTopicEnabled()).isTrue();
+
+    String topic = "test-topic";
+
+    TestRepository<?> repoA = createProjectWithPush("project-a", null, getSubmitType());
+    TestRepository<?> repoB = createProjectWithPush("project-b", null, getSubmitType());
+
+    PushOneCommit.Result change1 =
+        createChange(repoA, "master", "Change 1", "a.txt", "content", topic);
+    PushOneCommit.Result change2 =
+        createChange(repoB, "master", "Change 2", "b.txt", "content", topic);
+
+    approve(change1.getChangeId());
+    approve(change2.getChangeId());
+
+    TestSubmitInput input = new TestSubmitInput();
+    input.generateLockFailures =
+        new ArrayDeque<>(
+            ImmutableList.of(
+                false, // Change 1, attempt 1: success
+                true, // Change 2, attempt 1: lock failure
+                false, // Change 1, attempt 2: success
+                false, // Change 2, attempt 2: success
+                false)); // Leftover value to check total number of calls.
+    submit(change2.getChangeId(), input);
+
+    String expectedTopic = name(topic);
+    change1.assertChange(Change.Status.MERGED, expectedTopic, admin);
+    change2.assertChange(Change.Status.MERGED, expectedTopic, admin);
+
+    repoA.git().fetch().call();
+    RevWalk rwA = repoA.getRevWalk();
+    RevCommit masterA = rwA.parseCommit(getRemoteHead(name("project-a"), "master"));
+    RevCommit change1Ps = parseCurrentRevision(rwA, change1.getChangeId());
+    assertThat(rwA.isMergedInto(change1Ps, masterA)).isTrue();
+
+    repoB.git().fetch().call();
+    RevWalk rwB = repoB.getRevWalk();
+    RevCommit masterB = rwB.parseCommit(getRemoteHead(name("project-b"), "master"));
+    RevCommit change2Ps = parseCurrentRevision(rwB, change2.getChangeId());
+    assertThat(rwB.isMergedInto(change2Ps, masterB)).isTrue();
+
+    assertThat(input.generateLockFailures).containsExactly(false);
+  }
+
+  @Test
+  public void authorAndCommitDateAreEqual() throws Exception {
+    assume().that(getSubmitType()).isNotEqualTo(SubmitType.FAST_FORWARD_ONLY);
+
+    ConfigInput ci = new ConfigInput();
+    ci.matchAuthorToCommitterDate = InheritableBoolean.TRUE;
+    gApi.projects().name(project.get()).config(ci);
+
+    RevCommit initialHead = getRemoteHead();
+    testRepo.reset(initialHead);
+    PushOneCommit.Result change = createChange("Change 1", "b", "b");
+
+    testRepo.reset(initialHead);
+    PushOneCommit.Result change2 = createChange("Change 2", "c", "c");
+
+    if (getSubmitType() == SubmitType.MERGE_IF_NECESSARY
+        || getSubmitType() == SubmitType.REBASE_IF_NECESSARY) {
+      // Merge another change so that change2 is not a fast-forward
+      submit(change.getChangeId());
+    }
+
+    submit(change2.getChangeId());
+    assertAuthorAndCommitDateEquals(getRemoteHead());
+  }
+
+  @Test
+  @TestProjectInput(rejectEmptyCommit = InheritableBoolean.FALSE)
+  public void submitEmptyCommitPatchSetCanNotFastForward_emptyCommitAllowed() throws Exception {
+    assume().that(getSubmitType()).isNotEqualTo(SubmitType.FAST_FORWARD_ONLY);
+
+    PushOneCommit.Result change = createChange("Change 1", "a.txt", "content");
+    submit(change.getChangeId());
+
+    ChangeApi revert1 = gApi.changes().id(change.getChangeId()).revert();
+    approve(revert1.id());
+    revert1.current().submit();
+
+    ChangeApi revert2 = gApi.changes().id(change.getChangeId()).revert();
+    approve(revert2.id());
+    revert2.current().submit();
+  }
+
+  @Test
+  @TestProjectInput(rejectEmptyCommit = InheritableBoolean.TRUE)
+  public void submitEmptyCommitPatchSetCanNotFastForward_emptyCommitNotAllowed() throws Exception {
+    assume().that(getSubmitType()).isNotEqualTo(SubmitType.FAST_FORWARD_ONLY);
+
+    PushOneCommit.Result change = createChange("Change 1", "a.txt", "content");
+    submit(change.getChangeId());
+
+    ChangeApi revert1 = gApi.changes().id(change.getChangeId()).revert();
+    approve(revert1.id());
+    revert1.current().submit();
+
+    ChangeApi revert2 = gApi.changes().id(change.getChangeId()).revert();
+    approve(revert2.id());
+
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage(
+        "Change "
+            + revert2.get()._number
+            + ": Change could not be merged because the commit is empty. "
+            + "Project policy requires all commits to contain modifications to at least one file.");
+    revert2.current().submit();
+  }
+
+  @Test
+  @TestProjectInput(rejectEmptyCommit = InheritableBoolean.FALSE)
+  public void submitEmptyCommitPatchSetCanFastForward_emptyCommitAllowed() throws Exception {
+    ChangeInput ci = new ChangeInput();
+    ci.subject = "Empty change";
+    ci.project = project.get();
+    ci.branch = "master";
+    ChangeApi change = gApi.changes().create(ci);
+    approve(change.id());
+    change.current().submit();
+  }
+
+  @Test
+  @TestProjectInput(rejectEmptyCommit = InheritableBoolean.TRUE)
+  public void submitEmptyCommitPatchSetCanFastForward_emptyCommitNotAllowed() throws Exception {
+    ChangeInput ci = new ChangeInput();
+    ci.subject = "Empty change";
+    ci.project = project.get();
+    ci.branch = "master";
+    ChangeApi change = gApi.changes().create(ci);
+    approve(change.id());
+
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage(
+        "Change "
+            + change.get()._number
+            + ": Change could not be merged because the commit is empty. "
+            + "Project policy requires all commits to contain modifications to at least one file.");
+    change.current().submit();
+  }
+
+  @Test
+  @TestProjectInput(createEmptyCommit = false, rejectEmptyCommit = InheritableBoolean.TRUE)
+  public void submitNonemptyCommitToEmptyRepoWithRejectEmptyCommit_allowed() throws Exception {
+    assertThat(getRemoteHead()).isNull();
+    PushOneCommit.Result change = createChange();
+    assertThat(change.getCommit().getParents()).isEmpty();
+    Map<Branch.NameKey, ObjectId> actual = fetchFromSubmitPreview(change.getChangeId());
+    RevCommit headAfterSubmitPreview = getRemoteHead();
+    assertThat(headAfterSubmitPreview).isNull();
+    assertThat(actual).hasSize(1);
+
+    submit(change.getChangeId());
+    assertThat(getRemoteHead().getId()).isEqualTo(change.getCommit());
+    assertTrees(project, actual);
+  }
+
+  @Test
+  @TestProjectInput(createEmptyCommit = false, rejectEmptyCommit = InheritableBoolean.TRUE)
+  public void submitEmptyCommitToEmptyRepoWithRejectEmptyCommit_allowed() throws Exception {
+    assertThat(getRemoteHead()).isNull();
+    PushOneCommit.Result change =
+        pushFactory
+            .create(db, admin.getIdent(), testRepo, "Change 1", ImmutableMap.of())
+            .to("refs/for/master");
+    change.assertOkStatus();
+    // TODO(dborowitz): Use EMPTY_TREE_ID after upgrading to https://git.eclipse.org/r/127473
+    assertThat(change.getCommit().getTree())
+        .isEqualTo(ObjectId.fromString("4b825dc642cb6eb9a060e54bf8d69288fbee4904"));
+
+    Map<Branch.NameKey, ObjectId> actual = fetchFromSubmitPreview(change.getChangeId());
+    RevCommit headAfterSubmitPreview = getRemoteHead();
+    assertThat(headAfterSubmitPreview).isNull();
+    assertThat(actual).hasSize(1);
+
+    submit(change.getChangeId());
+    assertThat(getRemoteHead().getId()).isEqualTo(change.getCommit());
+    assertTrees(project, actual);
+  }
+
+  private void setChangeStatusToNew(PushOneCommit.Result... changes) throws Exception {
+    for (PushOneCommit.Result change : changes) {
+      try (BatchUpdate bu =
+          batchUpdateFactory.create(db, project, userFactory.create(admin.id), TimeUtil.nowTs())) {
+        bu.addOp(
+            change.getChange().getId(),
+            new BatchUpdateOp() {
+              @Override
+              public boolean updateChange(ChangeContext ctx) throws OrmException {
+                ctx.getChange().setStatus(Change.Status.NEW);
+                ctx.getUpdate(ctx.getChange().currentPatchSetId()).setStatus(Change.Status.NEW);
+                return true;
+              }
+            });
+        bu.execute();
+      }
+    }
+  }
+
+  private void assertSubmitter(PushOneCommit.Result change) throws Exception {
+    ChangeInfo info = get(change.getChangeId(), ListChangesOption.MESSAGES);
+    assertThat(info.messages).isNotNull();
+    Iterable<String> messages = Iterables.transform(info.messages, i -> i.message);
+    assertThat(messages).hasSize(3);
+    String last = Iterables.getLast(messages);
+    if (getSubmitType() == SubmitType.CHERRY_PICK) {
+      assertThat(last).startsWith("Change has been successfully cherry-picked as ");
+    } else if (getSubmitType() == SubmitType.REBASE_ALWAYS) {
+      assertThat(last).startsWith("Change has been successfully rebased and submitted as");
+    } else {
+      assertThat(last).isEqualTo("Change has been successfully merged by Administrator");
+    }
+  }
+
+  @Override
+  protected void updateProjectInput(ProjectInput in) {
+    in.submitType = getSubmitType();
+    if (in.useContentMerge == InheritableBoolean.INHERIT) {
+      in.useContentMerge = InheritableBoolean.FALSE;
+    }
+  }
+
+  protected void submit(String changeId) throws Exception {
+    submit(changeId, new SubmitInput(), null, null);
+  }
+
+  protected void submit(String changeId, SubmitInput input) throws Exception {
+    submit(changeId, input, null, null);
+  }
+
+  protected void submitWithConflict(String changeId, String expectedError) throws Exception {
+    submit(changeId, new SubmitInput(), ResourceConflictException.class, expectedError);
+  }
+
+  protected void submit(
+      String changeId,
+      SubmitInput input,
+      Class<? extends RestApiException> expectedExceptionType,
+      String expectedExceptionMsg)
+      throws Exception {
+    approve(changeId);
+    if (expectedExceptionType == null) {
+      assertSubmittable(changeId);
+    }
+    try {
+      gApi.changes().id(changeId).current().submit(input);
+      if (expectedExceptionType != null) {
+        fail("Expected exception of type " + expectedExceptionType.getSimpleName());
+      }
+    } catch (RestApiException e) {
+      if (expectedExceptionType == null) {
+        throw e;
+      }
+      // More verbose than using assertThat and/or ExpectedException, but gives
+      // us the stack trace.
+      if (!expectedExceptionType.isAssignableFrom(e.getClass())
+          || !e.getMessage().equals(expectedExceptionMsg)) {
+        throw new AssertionError(
+            "Expected exception of type "
+                + expectedExceptionType.getSimpleName()
+                + " with message: \""
+                + expectedExceptionMsg
+                + "\" but got exception of type "
+                + e.getClass().getSimpleName()
+                + " with message \""
+                + e.getMessage()
+                + "\"",
+            e);
+      }
+      return;
+    }
+    ChangeInfo change = gApi.changes().id(changeId).info();
+    assertMerged(change.changeId);
+  }
+
+  protected void assertSubmittable(String changeId) throws Exception {
+    assertThat(get(changeId, SUBMITTABLE).submittable).named("submit bit on ChangeInfo").isTrue();
+    RevisionResource rsrc = parseCurrentRevisionResource(changeId);
+    UiAction.Description desc = submitHandler.getDescription(rsrc);
+    assertThat(desc.isVisible()).named("visible bit on submit action").isTrue();
+    assertThat(desc.isEnabled()).named("enabled bit on submit action").isTrue();
+  }
+
+  protected void assertChangeMergedEvents(String... expected) throws Exception {
+    eventRecorder.assertChangeMergedEvents(project.get(), "refs/heads/master", expected);
+  }
+
+  protected void assertRefUpdatedEvents(RevCommit... expected) throws Exception {
+    eventRecorder.assertRefUpdatedEvents(project.get(), "refs/heads/master", expected);
+  }
+
+  protected void assertCurrentRevision(String changeId, int expectedNum, ObjectId expectedId)
+      throws Exception {
+    ChangeInfo c = get(changeId, CURRENT_REVISION);
+    assertThat(c.currentRevision).isEqualTo(expectedId.name());
+    assertThat(c.revisions.get(expectedId.name())._number).isEqualTo(expectedNum);
+    try (Repository repo = repoManager.openRepository(new Project.NameKey(c.project))) {
+      String refName = new PatchSet.Id(new Change.Id(c._number), expectedNum).toRefName();
+      Ref ref = repo.exactRef(refName);
+      assertThat(ref).named(refName).isNotNull();
+      assertThat(ref.getObjectId()).isEqualTo(expectedId);
+    }
+  }
+
+  protected void assertNew(String changeId) throws Exception {
+    assertThat(info(changeId).status).isEqualTo(ChangeStatus.NEW);
+  }
+
+  protected void assertApproved(String changeId) throws Exception {
+    assertApproved(changeId, admin);
+  }
+
+  protected void assertApproved(String changeId, TestAccount user) throws Exception {
+    ChangeInfo c = get(changeId, DETAILED_LABELS);
+    LabelInfo cr = c.labels.get("Code-Review");
+    assertThat(cr.all).hasSize(1);
+    assertThat(cr.all.get(0).value).isEqualTo(2);
+    assertThat(new Account.Id(cr.all.get(0)._accountId)).isEqualTo(user.getId());
+  }
+
+  protected void assertMerged(String changeId) throws RestApiException {
+    ChangeStatus status = gApi.changes().id(changeId).info().status;
+    assertThat(status).isEqualTo(ChangeStatus.MERGED);
+  }
+
+  protected void assertPersonEquals(PersonIdent expected, PersonIdent actual) {
+    assertThat(actual.getEmailAddress()).isEqualTo(expected.getEmailAddress());
+    assertThat(actual.getName()).isEqualTo(expected.getName());
+    assertThat(actual.getTimeZone()).isEqualTo(expected.getTimeZone());
+  }
+
+  protected void assertAuthorAndCommitDateEquals(RevCommit commit) {
+    assertThat(commit.getAuthorIdent().getWhen()).isEqualTo(commit.getCommitterIdent().getWhen());
+    assertThat(commit.getAuthorIdent().getTimeZone())
+        .isEqualTo(commit.getCommitterIdent().getTimeZone());
+  }
+
+  protected void assertSubmitter(String changeId, int psId) throws Exception {
+    assertSubmitter(changeId, psId, admin);
+  }
+
+  protected void assertSubmitter(String changeId, int psId, TestAccount user) throws Exception {
+    Change c = getOnlyElement(queryProvider.get().byKeyPrefix(changeId)).change();
+    ChangeNotes cn = notesFactory.createChecked(db, c);
+    PatchSetApproval submitter =
+        approvalsUtil.getSubmitter(db, cn, new PatchSet.Id(cn.getChangeId(), psId));
+    assertThat(submitter).isNotNull();
+    assertThat(submitter.isLegacySubmit()).isTrue();
+    assertThat(submitter.getAccountId()).isEqualTo(user.getId());
+  }
+
+  protected void assertNoSubmitter(String changeId, int psId) throws Exception {
+    Change c = getOnlyElement(queryProvider.get().byKeyPrefix(changeId)).change();
+    ChangeNotes cn = notesFactory.createChecked(db, c);
+    PatchSetApproval submitter =
+        approvalsUtil.getSubmitter(db, cn, new PatchSet.Id(cn.getChangeId(), psId));
+    assertThat(submitter).isNull();
+  }
+
+  protected void assertCherryPick(TestRepository<?> testRepo, boolean contentMerge)
+      throws Exception {
+    assertRebase(testRepo, contentMerge);
+    RevCommit remoteHead = getRemoteHead();
+    assertThat(remoteHead.getFooterLines("Reviewed-On")).isNotEmpty();
+    assertThat(remoteHead.getFooterLines("Reviewed-By")).isNotEmpty();
+  }
+
+  protected void assertRebase(TestRepository<?> testRepo, boolean contentMerge) throws Exception {
+    Repository repo = testRepo.getRepository();
+    RevCommit localHead = getHead(repo);
+    RevCommit remoteHead = getRemoteHead();
+    assertThat(localHead.getId()).isNotEqualTo(remoteHead.getId());
+    assertThat(remoteHead.getParentCount()).isEqualTo(1);
+    if (!contentMerge) {
+      assertThat(getLatestRemoteDiff()).isEqualTo(getLatestDiff(repo));
+    }
+    assertThat(remoteHead.getShortMessage()).isEqualTo(localHead.getShortMessage());
+  }
+
+  protected List<RevCommit> getRemoteLog(Project.NameKey project, String branch) throws Exception {
+    try (Repository repo = repoManager.openRepository(project);
+        RevWalk rw = new RevWalk(repo)) {
+      rw.markStart(rw.parseCommit(repo.exactRef("refs/heads/" + branch).getObjectId()));
+      return Lists.newArrayList(rw);
+    }
+  }
+
+  protected List<RevCommit> getRemoteLog() throws Exception {
+    return getRemoteLog(project, "master");
+  }
+
+  protected void addOnSubmitValidationListener(OnSubmitValidationListener listener) {
+    assertThat(onSubmitValidatorHandle).isNull();
+    onSubmitValidatorHandle = onSubmitValidationListeners.add("gerrit", listener);
+  }
+
+  private String getLatestDiff(Repository repo) throws Exception {
+    ObjectId oldTreeId = repo.resolve("HEAD~1^{tree}");
+    ObjectId newTreeId = repo.resolve("HEAD^{tree}");
+    return getLatestDiff(repo, oldTreeId, newTreeId);
+  }
+
+  private String getLatestRemoteDiff() throws Exception {
+    try (Repository repo = repoManager.openRepository(project);
+        RevWalk rw = new RevWalk(repo)) {
+      ObjectId oldTreeId = repo.resolve("refs/heads/master~1^{tree}");
+      ObjectId newTreeId = repo.resolve("refs/heads/master^{tree}");
+      return getLatestDiff(repo, oldTreeId, newTreeId);
+    }
+  }
+
+  private String getLatestDiff(Repository repo, ObjectId oldTreeId, ObjectId newTreeId)
+      throws Exception {
+    ByteArrayOutputStream out = new ByteArrayOutputStream();
+    try (DiffFormatter fmt = new DiffFormatter(out)) {
+      fmt.setRepository(repo);
+      fmt.format(oldTreeId, newTreeId);
+      fmt.flush();
+      return out.toString();
+    }
+  }
+
+  private TestRepository<?> createProjectWithPush(
+      String name, @Nullable Project.NameKey parent, SubmitType submitType) throws Exception {
+    Project.NameKey project = createProject(name, parent, true, submitType);
+    grant(project, "refs/heads/*", Permission.PUSH);
+    grant(project, "refs/for/refs/heads/*", Permission.SUBMIT);
+    return cloneProject(project);
+  }
+
+  protected PushOneCommit.Result createChange(
+      String subject, String fileName, String content, String topic) throws Exception {
+    PushOneCommit push =
+        pushFactory.create(db, admin.getIdent(), testRepo, subject, fileName, content);
+    return push.to("refs/for/master/" + name(topic));
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/AbstractSubmitByMerge.java b/javatests/com/google/gerrit/acceptance/rest/change/AbstractSubmitByMerge.java
new file mode 100644
index 0000000..29a81ca
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/change/AbstractSubmitByMerge.java
@@ -0,0 +1,181 @@
+// Copyright (C) 2013 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.google.gerrit.acceptance.rest.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+
+import com.google.common.collect.Iterables;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.TestProjectInput;
+import com.google.gerrit.extensions.api.changes.SubmitInput;
+import com.google.gerrit.extensions.client.ChangeStatus;
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.change.TestSubmitInput;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.junit.Test;
+
+public abstract class AbstractSubmitByMerge extends AbstractSubmit {
+
+  @Test
+  public void submitWithMerge() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+    PushOneCommit.Result change = createChange("Change 1", "a.txt", "content");
+    submit(change.getChangeId());
+
+    RevCommit oldHead = getRemoteHead();
+    testRepo.reset(initialHead);
+    PushOneCommit.Result change2 = createChange("Change 2", "b.txt", "other content");
+    submit(change2.getChangeId());
+    RevCommit head = getRemoteHead();
+    assertThat(head.getParentCount()).isEqualTo(2);
+    assertThat(head.getParent(0)).isEqualTo(oldHead);
+    assertThat(head.getParent(1)).isEqualTo(change2.getCommit());
+  }
+
+  @Test
+  @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
+  public void submitWithContentMerge() throws Exception {
+    PushOneCommit.Result change = createChange("Change 1", "a.txt", "aaa\nbbb\nccc\n");
+    submit(change.getChangeId());
+    PushOneCommit.Result change2 = createChange("Change 2", "a.txt", "aaa\nbbb\nccc\nddd\n");
+    submit(change2.getChangeId());
+
+    RevCommit oldHead = getRemoteHead();
+    testRepo.reset(change.getCommit());
+    PushOneCommit.Result change3 = createChange("Change 3", "a.txt", "bbb\nccc\n");
+    submit(change3.getChangeId());
+    RevCommit head = getRemoteHead();
+    assertThat(head.getParentCount()).isEqualTo(2);
+    assertThat(head.getParent(0)).isEqualTo(oldHead);
+    assertThat(head.getParent(1)).isEqualTo(change3.getCommit());
+  }
+
+  @Test
+  @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
+  public void submitWithContentMerge_Conflict() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+    PushOneCommit.Result change = createChange("Change 1", "a.txt", "content");
+    submit(change.getChangeId());
+
+    RevCommit oldHead = getRemoteHead();
+    testRepo.reset(initialHead);
+    PushOneCommit.Result change2 = createChange("Change 2", "a.txt", "other content");
+    submitWithConflict(
+        change2.getChangeId(),
+        "Failed to submit 1 change due to the following problems:\n"
+            + "Change "
+            + change2.getChange().getId()
+            + ": "
+            + "Change could not be merged due to a path conflict. "
+            + "Please rebase the change locally "
+            + "and upload the rebased commit for review.");
+    assertThat(getRemoteHead()).isEqualTo(oldHead);
+  }
+
+  @Test
+  @TestProjectInput(createEmptyCommit = false)
+  public void submitMultipleCommitsToEmptyRepoAsFastForward() throws Exception {
+    PushOneCommit.Result change1 = createChange();
+    PushOneCommit.Result change2 = createChange();
+    approve(change1.getChangeId());
+    submit(change2.getChangeId());
+    assertThat(getRemoteHead().getId()).isEqualTo(change2.getCommit());
+  }
+
+  @Test
+  @TestProjectInput(createEmptyCommit = false)
+  public void submitMultipleCommitsToEmptyRepoWithOneMerge() throws Exception {
+    assume().that(isSubmitWholeTopicEnabled()).isTrue();
+    PushOneCommit.Result change1 =
+        pushFactory
+            .create(db, admin.getIdent(), testRepo, "Change 1", "a", "a")
+            .to("refs/for/master/" + name("topic"));
+
+    PushOneCommit push2 = pushFactory.create(db, admin.getIdent(), testRepo, "Change 2", "b", "b");
+    push2.noParents();
+    PushOneCommit.Result change2 = push2.to("refs/for/master/" + name("topic"));
+    change2.assertOkStatus();
+
+    approve(change1.getChangeId());
+    submit(change2.getChangeId());
+
+    RevCommit head = getRemoteHead();
+    assertThat(head.getParents()).hasLength(2);
+    assertThat(head.getParent(0)).isEqualTo(change1.getCommit());
+    assertThat(head.getParent(1)).isEqualTo(change2.getCommit());
+  }
+
+  @Test
+  public void repairChangeStateAfterFailure() throws Exception {
+    // In NoteDb-only mode, repo and meta updates are atomic (at least in InMemoryRepository).
+    assume().that(notesMigration.disableChangeReviewDb()).isFalse();
+
+    RevCommit initialHead = getRemoteHead();
+    PushOneCommit.Result change = createChange("Change 1", "a.txt", "content");
+    submit(change.getChangeId());
+    RevCommit afterChange1Head = getRemoteHead();
+
+    testRepo.reset(initialHead);
+    PushOneCommit.Result change2 = createChange("Change 2", "b.txt", "other content");
+    Change.Id id2 = change2.getChange().getId();
+    TestSubmitInput failInput = new TestSubmitInput();
+    failInput.failAfterRefUpdates = true;
+    submit(
+        change2.getChangeId(),
+        failInput,
+        ResourceConflictException.class,
+        "Failing after ref updates");
+
+    // Bad: ref advanced but change wasn't updated.
+    PatchSet.Id psId1 = new PatchSet.Id(id2, 1);
+    ChangeInfo info = gApi.changes().id(id2.get()).get();
+    assertThat(info.status).isEqualTo(ChangeStatus.NEW);
+    assertThat(info.revisions.get(info.currentRevision)._number).isEqualTo(1);
+
+    RevCommit tip;
+    try (Repository repo = repoManager.openRepository(project);
+        RevWalk rw = new RevWalk(repo)) {
+      ObjectId rev1 = repo.exactRef(psId1.toRefName()).getObjectId();
+      assertThat(rev1).isNotNull();
+
+      tip = rw.parseCommit(repo.exactRef("refs/heads/master").getObjectId());
+      assertThat(tip.getParentCount()).isEqualTo(2);
+      assertThat(tip.getParent(0)).isEqualTo(afterChange1Head);
+      assertThat(tip.getParent(1)).isEqualTo(change2.getCommit());
+    }
+
+    submit(change2.getChangeId(), new SubmitInput(), null, null);
+
+    // Change status and patch set entities were updated, and branch tip stayed
+    // the same.
+    info = gApi.changes().id(id2.get()).get();
+    assertThat(info.status).isEqualTo(ChangeStatus.MERGED);
+    assertThat(info.revisions.get(info.currentRevision)._number).isEqualTo(1);
+    assertThat(Iterables.getLast(info.messages).message)
+        .isEqualTo("Change has been successfully merged by Administrator");
+
+    try (Repository repo = repoManager.openRepository(project)) {
+      assertThat(repo.exactRef("refs/heads/master").getObjectId()).isEqualTo(tip);
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/AbstractSubmitByRebase.java b/javatests/com/google/gerrit/acceptance/rest/change/AbstractSubmitByRebase.java
new file mode 100644
index 0000000..0a92cfb
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/change/AbstractSubmitByRebase.java
@@ -0,0 +1,458 @@
+// Copyright (C) 2013 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.google.gerrit.acceptance.rest.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static com.google.gerrit.acceptance.GitUtil.getChangeId;
+import static com.google.gerrit.acceptance.GitUtil.pushHead;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.TestAccount;
+import com.google.gerrit.acceptance.TestProjectInput;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.client.ChangeStatus;
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.change.TestSubmitInput;
+import com.google.gerrit.server.project.testing.Util;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.junit.Test;
+
+public abstract class AbstractSubmitByRebase extends AbstractSubmit {
+
+  @Override
+  protected abstract SubmitType getSubmitType();
+
+  @Test
+  @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
+  public void submitWithRebase() throws Exception {
+    submitWithRebase(admin);
+  }
+
+  @Test
+  @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
+  public void submitWithRebaseWithoutAddPatchSetPermission() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      Util.block(u.getConfig(), Permission.ADD_PATCH_SET, REGISTERED_USERS, "refs/*");
+      Util.allow(u.getConfig(), Permission.SUBMIT, REGISTERED_USERS, "refs/heads/*");
+      Util.allow(
+          u.getConfig(),
+          Permission.forLabel(Util.codeReview().getName()),
+          -2,
+          2,
+          REGISTERED_USERS,
+          "refs/heads/*");
+      u.save();
+    }
+
+    submitWithRebase(user);
+  }
+
+  private void submitWithRebase(TestAccount submitter) throws Exception {
+    setApiUser(submitter);
+    RevCommit initialHead = getRemoteHead();
+    PushOneCommit.Result change = createChange("Change 1", "a.txt", "content");
+    submit(change.getChangeId());
+
+    RevCommit headAfterFirstSubmit = getRemoteHead();
+    testRepo.reset(initialHead);
+    PushOneCommit.Result change2 = createChange("Change 2", "b.txt", "other content");
+    submit(change2.getChangeId());
+    assertRebase(testRepo, false);
+    RevCommit headAfterSecondSubmit = getRemoteHead();
+    assertThat(headAfterSecondSubmit.getParent(0)).isEqualTo(headAfterFirstSubmit);
+    assertApproved(change2.getChangeId(), submitter);
+    assertCurrentRevision(change2.getChangeId(), 2, headAfterSecondSubmit);
+    assertSubmitter(change2.getChangeId(), 1, submitter);
+    assertSubmitter(change2.getChangeId(), 2, submitter);
+    assertPersonEquals(admin.getIdent(), headAfterSecondSubmit.getAuthorIdent());
+    assertPersonEquals(submitter.getIdent(), headAfterSecondSubmit.getCommitterIdent());
+
+    assertRefUpdatedEvents(
+        initialHead, headAfterFirstSubmit, headAfterFirstSubmit, headAfterSecondSubmit);
+    assertChangeMergedEvents(
+        change.getChangeId(),
+        headAfterFirstSubmit.name(),
+        change2.getChangeId(),
+        headAfterSecondSubmit.name());
+  }
+
+  @Test
+  public void submitWithRebaseMultipleChanges() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+    PushOneCommit.Result change1 = createChange("Change 1", "a.txt", "content");
+    submit(change1.getChangeId());
+    RevCommit headAfterFirstSubmit = getRemoteHead();
+    if (getSubmitType() == SubmitType.REBASE_ALWAYS) {
+      assertCurrentRevision(change1.getChangeId(), 2, headAfterFirstSubmit);
+    } else {
+      assertThat(headAfterFirstSubmit.name()).isEqualTo(change1.getCommit().name());
+    }
+
+    testRepo.reset(initialHead);
+    PushOneCommit.Result change2 = createChange("Change 2", "b.txt", "other content");
+    assertThat(change2.getCommit().getParent(0)).isNotEqualTo(change1.getCommit());
+    PushOneCommit.Result change3 = createChange("Change 3", "c.txt", "third content");
+    PushOneCommit.Result change4 = createChange("Change 4", "d.txt", "fourth content");
+    approve(change2.getChangeId());
+    approve(change3.getChangeId());
+    submit(change4.getChangeId());
+
+    assertRebase(testRepo, false);
+    assertApproved(change2.getChangeId());
+    assertApproved(change3.getChangeId());
+    assertApproved(change4.getChangeId());
+
+    RevCommit headAfterSecondSubmit = parse(getRemoteHead());
+    assertThat(headAfterSecondSubmit.getShortMessage()).isEqualTo("Change 4");
+    assertThat(headAfterSecondSubmit).isNotEqualTo(change4.getCommit());
+    assertCurrentRevision(change4.getChangeId(), 2, headAfterSecondSubmit);
+
+    RevCommit parent = parse(headAfterSecondSubmit.getParent(0));
+    assertThat(parent.getShortMessage()).isEqualTo("Change 3");
+    assertThat(parent).isNotEqualTo(change3.getCommit());
+    assertCurrentRevision(change3.getChangeId(), 2, parent);
+
+    RevCommit grandparent = parse(parent.getParent(0));
+    assertThat(grandparent).isNotEqualTo(change2.getCommit());
+    assertCurrentRevision(change2.getChangeId(), 2, grandparent);
+
+    RevCommit greatgrandparent = parse(grandparent.getParent(0));
+    assertThat(greatgrandparent).isEqualTo(headAfterFirstSubmit);
+    if (getSubmitType() == SubmitType.REBASE_ALWAYS) {
+      assertCurrentRevision(change1.getChangeId(), 2, greatgrandparent);
+    } else {
+      assertCurrentRevision(change1.getChangeId(), 1, greatgrandparent);
+    }
+
+    assertRefUpdatedEvents(
+        initialHead, headAfterFirstSubmit, headAfterFirstSubmit, headAfterSecondSubmit);
+    assertChangeMergedEvents(
+        change1.getChangeId(),
+        headAfterFirstSubmit.name(),
+        change2.getChangeId(),
+        headAfterSecondSubmit.name(),
+        change3.getChangeId(),
+        headAfterSecondSubmit.name(),
+        change4.getChangeId(),
+        headAfterSecondSubmit.name());
+  }
+
+  @Test
+  public void submitWithRebaseMergeCommit() throws Exception {
+    /*
+       *  (HEAD, origin/master, origin/HEAD) Merge changes X,Y
+       |\
+       | *   Merge branch 'master' into origin/master
+       | |\
+       | | * SHA Added a
+       | |/
+       * | Before
+       |/
+       * Initial empty repository
+    */
+    RevCommit initialHead = getRemoteHead();
+    PushOneCommit.Result change1 = createChange("Added a", "a.txt", "");
+
+    PushOneCommit change2Push =
+        pushFactory.create(db, admin.getIdent(), testRepo, "Merge to master", "m.txt", "");
+    change2Push.setParents(ImmutableList.of(initialHead, change1.getCommit()));
+    PushOneCommit.Result change2 = change2Push.to("refs/for/master");
+
+    testRepo.reset(initialHead);
+    PushOneCommit.Result change3 = createChange("Before", "b.txt", "");
+
+    approve(change3.getChangeId());
+    submit(change3.getChangeId());
+
+    approve(change1.getChangeId());
+    approve(change2.getChangeId());
+    submit(change2.getChangeId());
+
+    RevCommit newHead = getRemoteHead();
+    assertThat(newHead.getParentCount()).isEqualTo(2);
+
+    RevCommit headParent1 = parse(newHead.getParent(0).getId());
+    RevCommit headParent2 = parse(newHead.getParent(1).getId());
+
+    if (getSubmitType() == SubmitType.REBASE_ALWAYS) {
+      assertCurrentRevision(change3.getChangeId(), 2, headParent1.getId());
+    } else {
+      assertThat(change3.getCommit().getId()).isEqualTo(headParent1.getId());
+    }
+    assertThat(headParent1.getParentCount()).isEqualTo(1);
+    assertThat(headParent1.getParent(0)).isEqualTo(initialHead);
+
+    assertThat(headParent2.getId()).isEqualTo(change2.getCommit().getId());
+    assertThat(headParent2.getParentCount()).isEqualTo(2);
+
+    RevCommit headGrandparent1 = parse(headParent2.getParent(0).getId());
+    RevCommit headGrandparent2 = parse(headParent2.getParent(1).getId());
+
+    assertThat(headGrandparent1.getId()).isEqualTo(initialHead.getId());
+    assertThat(headGrandparent2.getId()).isEqualTo(change1.getCommit().getId());
+  }
+
+  @Test
+  @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
+  public void submitWithContentMerge_Conflict() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+    PushOneCommit.Result change = createChange("Change 1", "a.txt", "content");
+    submit(change.getChangeId());
+
+    RevCommit headAfterFirstSubmit = getRemoteHead();
+    testRepo.reset(initialHead);
+    PushOneCommit.Result change2 = createChange("Change 2", "a.txt", "other content");
+    submitWithConflict(
+        change2.getChangeId(),
+        "Cannot rebase "
+            + change2.getCommit().name()
+            + ": The change could not be rebased due to a conflict during merge.");
+    RevCommit head = getRemoteHead();
+    assertThat(head).isEqualTo(headAfterFirstSubmit);
+    assertCurrentRevision(change2.getChangeId(), 1, change2.getCommit());
+    assertNoSubmitter(change2.getChangeId(), 1);
+
+    assertRefUpdatedEvents(initialHead, headAfterFirstSubmit);
+    assertChangeMergedEvents(change.getChangeId(), headAfterFirstSubmit.name());
+  }
+
+  @Test
+  public void repairChangeStateAfterFailure() throws Exception {
+    // In NoteDb-only mode, repo and meta updates are atomic (at least in InMemoryRepository).
+    assume().that(notesMigration.disableChangeReviewDb()).isFalse();
+
+    RevCommit initialHead = getRemoteHead();
+    PushOneCommit.Result change = createChange("Change 1", "a.txt", "content");
+    submit(change.getChangeId());
+
+    RevCommit headAfterFirstSubmit = getRemoteHead();
+    testRepo.reset(initialHead);
+    PushOneCommit.Result change2 = createChange("Change 2", "b.txt", "other content");
+    Change.Id id2 = change2.getChange().getId();
+    TestSubmitInput failInput = new TestSubmitInput();
+    failInput.failAfterRefUpdates = true;
+    submit(
+        change2.getChangeId(),
+        failInput,
+        ResourceConflictException.class,
+        "Failing after ref updates");
+    RevCommit headAfterFailedSubmit = getRemoteHead();
+
+    // Bad: ref advanced but change wasn't updated.
+    PatchSet.Id psId1 = new PatchSet.Id(id2, 1);
+    PatchSet.Id psId2 = new PatchSet.Id(id2, 2);
+    ChangeInfo info = gApi.changes().id(id2.get()).get();
+    assertThat(info.status).isEqualTo(ChangeStatus.NEW);
+    assertThat(info.revisions.get(info.currentRevision)._number).isEqualTo(1);
+    assertThat(getPatchSet(psId2)).isNull();
+
+    ObjectId rev2;
+    try (Repository repo = repoManager.openRepository(project);
+        RevWalk rw = new RevWalk(repo)) {
+      ObjectId rev1 = repo.exactRef(psId1.toRefName()).getObjectId();
+      assertThat(rev1).isNotNull();
+
+      rev2 = repo.exactRef(psId2.toRefName()).getObjectId();
+      assertThat(rev2).isNotNull();
+      assertThat(rev2).isNotEqualTo(rev1);
+      assertThat(rw.parseCommit(rev2).getParent(0)).isEqualTo(headAfterFirstSubmit);
+
+      assertThat(repo.exactRef("refs/heads/master").getObjectId()).isEqualTo(rev2);
+    }
+
+    submit(change2.getChangeId());
+    RevCommit headAfterSecondSubmit = getRemoteHead();
+    assertThat(headAfterSecondSubmit).isEqualTo(headAfterFailedSubmit);
+
+    // Change status and patch set entities were updated, and branch tip stayed
+    // the same.
+    info = gApi.changes().id(id2.get()).get();
+    assertThat(info.status).isEqualTo(ChangeStatus.MERGED);
+    assertThat(info.revisions.get(info.currentRevision)._number).isEqualTo(2);
+    PatchSet ps2 = getPatchSet(psId2);
+    assertThat(ps2).isNotNull();
+    assertThat(ps2.getRevision().get()).isEqualTo(rev2.name());
+    assertThat(Iterables.getLast(info.messages).message)
+        .isEqualTo(
+            "Change has been successfully rebased and submitted as "
+                + rev2.name()
+                + " by Administrator");
+
+    try (Repository repo = repoManager.openRepository(project)) {
+      assertThat(repo.exactRef("refs/heads/master").getObjectId()).isEqualTo(rev2);
+    }
+
+    assertRefUpdatedEvents(initialHead, headAfterFirstSubmit);
+    assertChangeMergedEvents(
+        change.getChangeId(),
+        headAfterFirstSubmit.name(),
+        change2.getChangeId(),
+        headAfterSecondSubmit.name());
+  }
+
+  protected RevCommit parse(ObjectId id) throws Exception {
+    try (Repository repo = repoManager.openRepository(project);
+        RevWalk rw = new RevWalk(repo)) {
+      RevCommit c = rw.parseCommit(id);
+      rw.parseBody(c);
+      return c;
+    }
+  }
+
+  @Test
+  public void submitAfterReorderOfCommits() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+
+    // Create two commits and push.
+    RevCommit c1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
+    RevCommit c2 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
+    pushHead(testRepo, "refs/for/master", false);
+
+    String id1 = getChangeId(testRepo, c1).get();
+    String id2 = getChangeId(testRepo, c2).get();
+
+    // Swap the order of commits and push again.
+    testRepo.reset("HEAD~2");
+    testRepo.cherryPick(c2);
+    testRepo.cherryPick(c1);
+    pushHead(testRepo, "refs/for/master", false);
+
+    approve(id1);
+    approve(id2);
+    submit(id1);
+    RevCommit headAfterSubmit = getRemoteHead();
+
+    assertRefUpdatedEvents(initialHead, headAfterSubmit);
+    assertChangeMergedEvents(id2, headAfterSubmit.name(), id1, headAfterSubmit.name());
+  }
+
+  @Test
+  public void submitChangesAfterBranchOnSecond() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+
+    PushOneCommit.Result change = createChange();
+    approve(change.getChangeId());
+
+    PushOneCommit.Result change2 = createChange();
+    approve(change2.getChangeId());
+    Project.NameKey project = change2.getChange().change().getProject();
+    Branch.NameKey branch = new Branch.NameKey(project, "branch");
+    createBranchWithRevision(branch, change2.getCommit().getName());
+    gApi.changes().id(change2.getChangeId()).current().submit();
+    assertMerged(change2.getChangeId());
+    assertMerged(change.getChangeId());
+
+    RevCommit newHead = getRemoteHead();
+    assertRefUpdatedEvents(initialHead, newHead);
+    assertChangeMergedEvents(
+        change.getChangeId(), newHead.name(), change2.getChangeId(), newHead.name());
+  }
+
+  @Test
+  @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
+  public void submitFastForwardIdenticalTree() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+    PushOneCommit.Result change1 = createChange("Change 1", "a.txt", "a");
+    PushOneCommit.Result change2 = createChange("Change 2", "a.txt", "a");
+
+    assertThat(change1.getCommit().getTree()).isEqualTo(change2.getCommit().getTree());
+
+    // for rebase if necessary, otherwise, the manual rebase of change2 will
+    // fail since change1 would be merged as fast forward
+    testRepo.reset(initialHead);
+    PushOneCommit.Result change0 = createChange("Change 0", "b.txt", "b");
+    submit(change0.getChangeId());
+    RevCommit headAfterChange0 = getRemoteHead();
+    assertThat(headAfterChange0.getShortMessage()).isEqualTo("Change 0");
+
+    submit(change1.getChangeId());
+    RevCommit headAfterChange1 = getRemoteHead();
+    assertThat(headAfterChange1.getShortMessage()).isEqualTo("Change 1");
+    assertThat(headAfterChange0).isEqualTo(headAfterChange1.getParent(0));
+
+    // Do manual rebase first.
+    gApi.changes().id(change2.getChangeId()).current().rebase();
+    submit(change2.getChangeId());
+    RevCommit headAfterChange2 = getRemoteHead();
+    assertThat(headAfterChange2.getShortMessage()).isEqualTo("Change 2");
+    assertThat(headAfterChange1).isEqualTo(headAfterChange2.getParent(0));
+
+    ChangeInfo info2 = info(change2.getChangeId());
+    assertThat(info2.status).isEqualTo(ChangeStatus.MERGED);
+  }
+
+  @Test
+  @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
+  public void submitChainOneByOne() throws Exception {
+    PushOneCommit.Result change1 = createChange("subject 1", "fileName 1", "content 1");
+    PushOneCommit.Result change2 = createChange("subject 2", "fileName 2", "content 2");
+    submit(change1.getChangeId());
+    submit(change2.getChangeId());
+  }
+
+  @Test
+  @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
+  public void submitChainFailsOnRework() throws Exception {
+    PushOneCommit.Result change1 = createChange("subject 1", "fileName 1", "content 1");
+    RevCommit headAfterChange1 = change1.getCommit();
+    PushOneCommit.Result change2 = createChange("subject 2", "fileName 2", "content 2");
+    testRepo.reset(headAfterChange1);
+    change1 =
+        amendChange(change1.getChangeId(), "subject 1 amend", "fileName 2", "rework content 2");
+    submit(change1.getChangeId());
+    headAfterChange1 = getRemoteHead();
+
+    submitWithConflict(
+        change2.getChangeId(),
+        "Cannot rebase "
+            + change2.getCommit().getName()
+            + ": "
+            + "The change could not be rebased due to a conflict during merge.");
+    assertThat(getRemoteHead()).isEqualTo(headAfterChange1);
+  }
+
+  @Test
+  @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
+  public void submitChainOneByOneManualRebase() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+    PushOneCommit.Result change1 = createChange("subject 1", "fileName 1", "content 1");
+    PushOneCommit.Result change2 = createChange("subject 2", "fileName 2", "content 2");
+
+    // for rebase if necessary, otherwise, the manual rebase of change2 will
+    // fail since change1 would be merged as fast forward
+    testRepo.reset(initialHead);
+    PushOneCommit.Result change = createChange();
+    submit(change.getChangeId());
+
+    submit(change1.getChangeId());
+    // Do manual rebase first.
+    gApi.changes().id(change2.getChangeId()).current().rebase();
+    submit(change2.getChangeId());
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/ActionsIT.java b/javatests/com/google/gerrit/acceptance/rest/change/ActionsIT.java
new file mode 100644
index 0000000..0f394aa7
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/change/ActionsIT.java
@@ -0,0 +1,467 @@
+// Copyright (C) 2015 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.google.gerrit.acceptance.rest.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.extensions.client.ListChangesOption.CHANGE_ACTIONS;
+import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_ACTIONS;
+import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_REVISION;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.TestProjectInput;
+import com.google.gerrit.extensions.api.changes.ActionVisitor;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.client.ListChangesOption;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.extensions.common.ActionInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.RevisionInfo;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.change.RevisionJson;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.inject.Inject;
+import java.util.EnumSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import org.eclipse.jgit.lib.Config;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ActionsIT extends AbstractDaemonTest {
+  @ConfigSuite.Config
+  public static Config submitWholeTopicEnabled() {
+    return submitWholeTopicEnabledConfig();
+  }
+
+  @Inject private RevisionJson.Factory revisionJsonFactory;
+
+  @Inject private DynamicSet<ActionVisitor> actionVisitors;
+
+  private RegistrationHandle visitorHandle;
+
+  @Before
+  public void setUp() {
+    visitorHandle = null;
+  }
+
+  @After
+  public void tearDown() {
+    if (visitorHandle != null) {
+      visitorHandle.remove();
+    }
+  }
+
+  protected Map<String, ActionInfo> getActions(String id) throws Exception {
+    return gApi.changes().id(id).revision(1).actions();
+  }
+
+  protected String getETag(String id) throws Exception {
+    return gApi.changes().id(id).current().etag();
+  }
+
+  @Test
+  public void revisionActionsOneChangePerTopicUnapproved() throws Exception {
+    String changeId = createChangeWithTopic().getChangeId();
+    Map<String, ActionInfo> actions = getActions(changeId);
+    assertThat(actions).hasSize(3);
+    assertThat(actions).containsKey("cherrypick");
+    assertThat(actions).containsKey("rebase");
+    assertThat(actions).containsKey("description");
+  }
+
+  @Test
+  public void revisionActionsOneChangePerTopic() throws Exception {
+    String changeId = createChangeWithTopic().getChangeId();
+    approve(changeId);
+    Map<String, ActionInfo> actions = getActions(changeId);
+    commonActionsAssertions(actions);
+    // We want to treat a single change in a topic not as a whole topic,
+    // so regardless of how submitWholeTopic is configured:
+    noSubmitWholeTopicAssertions(actions, 1);
+  }
+
+  @Test
+  public void revisionActionsTwoChangesInTopic() throws Exception {
+    String changeId = createChangeWithTopic().getChangeId();
+    approve(changeId);
+    PushOneCommit.Result change2 = createChangeWithTopic();
+    int legacyId2 = change2.getChange().getId().get();
+    String changeId2 = change2.getChangeId();
+    Map<String, ActionInfo> actions = getActions(changeId);
+    commonActionsAssertions(actions);
+    if (isSubmitWholeTopicEnabled()) {
+      ActionInfo info = actions.get("submit");
+      assertThat(info.enabled).isNull();
+      assertThat(info.label).isEqualTo("Submit whole topic");
+      assertThat(info.method).isEqualTo("POST");
+      assertThat(info.title).matches("Change " + legacyId2 + " is not ready: needs Code-Review");
+    } else {
+      noSubmitWholeTopicAssertions(actions, 1);
+
+      assertThat(getActions(changeId2).get("submit")).isNull();
+      approve(changeId2);
+      noSubmitWholeTopicAssertions(getActions(changeId2), 2);
+    }
+  }
+
+  @Test
+  public void revisionActionsETag() throws Exception {
+    String parent = createChange().getChangeId();
+    String change = createChangeWithTopic().getChangeId();
+    approve(change);
+    String etag1 = getETag(change);
+
+    approve(parent);
+    String etag2 = getETag(change);
+
+    String changeWithSameTopic = createChangeWithTopic().getChangeId();
+    String etag3 = getETag(change);
+
+    approve(changeWithSameTopic);
+    String etag4 = getETag(change);
+
+    if (isSubmitWholeTopicEnabled()) {
+      assertThat(ImmutableList.of(etag1, etag2, etag3, etag4)).containsNoDuplicates();
+    } else {
+      assertThat(etag2).isNotEqualTo(etag1);
+      assertThat(etag3).isEqualTo(etag2);
+      assertThat(etag4).isEqualTo(etag2);
+    }
+  }
+
+  @Test
+  public void revisionActionsAnonymousETag() throws Exception {
+    String parent = createChange().getChangeId();
+    String change = createChangeWithTopic().getChangeId();
+    approve(change);
+
+    setApiUserAnonymous();
+    String etag1 = getETag(change);
+
+    setApiUser(admin);
+    approve(parent);
+
+    setApiUserAnonymous();
+    String etag2 = getETag(change);
+
+    setApiUser(admin);
+    String changeWithSameTopic = createChangeWithTopic().getChangeId();
+
+    setApiUserAnonymous();
+    String etag3 = getETag(change);
+
+    setApiUser(admin);
+    approve(changeWithSameTopic);
+
+    setApiUserAnonymous();
+    String etag4 = getETag(change);
+
+    if (isSubmitWholeTopicEnabled()) {
+      assertThat(ImmutableList.of(etag1, etag2, etag3, etag4)).containsNoDuplicates();
+    } else {
+      assertThat(etag2).isNotEqualTo(etag1);
+      assertThat(etag3).isEqualTo(etag2);
+      assertThat(etag4).isEqualTo(etag2);
+    }
+  }
+
+  @Test
+  @TestProjectInput(submitType = SubmitType.CHERRY_PICK)
+  public void revisionActionsAnonymousETagCherryPickStrategy() throws Exception {
+    String parent = createChange().getChangeId();
+    String change = createChange().getChangeId();
+    approve(change);
+
+    setApiUserAnonymous();
+    String etag1 = getETag(change);
+
+    setApiUser(admin);
+    approve(parent);
+
+    setApiUserAnonymous();
+    String etag2 = getETag(change);
+    assertThat(etag2).isEqualTo(etag1);
+  }
+
+  @Test
+  public void revisionActionsTwoChangesInTopic_conflicting() throws Exception {
+    String changeId = createChangeWithTopic().getChangeId();
+    approve(changeId);
+
+    // create another change with the same topic
+    String changeId2 =
+        createChangeWithTopic(testRepo, "topic", "touching b", "b.txt", "real content")
+            .getChangeId();
+    int changeNum2 = gApi.changes().id(changeId2).info()._number;
+    approve(changeId2);
+
+    // collide with the other change in the same topic
+    testRepo.reset("HEAD~2");
+    String collidingChange =
+        createChangeWithTopic(
+                testRepo, "off_topic", "rewriting file b", "b.txt", "garbage\ngarbage\ngarbage")
+            .getChangeId();
+    gApi.changes().id(collidingChange).current().review(ReviewInput.approve());
+    gApi.changes().id(collidingChange).current().submit();
+
+    Map<String, ActionInfo> actions = getActions(changeId);
+    commonActionsAssertions(actions);
+    if (isSubmitWholeTopicEnabled()) {
+      ActionInfo info = actions.get("submit");
+      assertThat(info.enabled).isNull();
+      assertThat(info.label).isEqualTo("Submit whole topic");
+      assertThat(info.method).isEqualTo("POST");
+      assertThat(info.title).isEqualTo("Problems with change(s): " + changeNum2);
+    } else {
+      noSubmitWholeTopicAssertions(actions, 1);
+    }
+  }
+
+  @Test
+  public void revisionActionsTwoChangesInTopicWithAncestorReady() throws Exception {
+    String changeId = createChange().getChangeId();
+    approve(changeId);
+    approve(changeId);
+    String changeId1 = createChangeWithTopic().getChangeId();
+    approve(changeId1);
+    // create another change with the same topic
+    String changeId2 = createChangeWithTopic().getChangeId();
+    approve(changeId2);
+    Map<String, ActionInfo> actions = getActions(changeId1);
+    commonActionsAssertions(actions);
+    if (isSubmitWholeTopicEnabled()) {
+      ActionInfo info = actions.get("submit");
+      assertThat(info.enabled).isTrue();
+      assertThat(info.label).isEqualTo("Submit whole topic");
+      assertThat(info.method).isEqualTo("POST");
+      assertThat(info.title)
+          .isEqualTo(
+              "Submit all 2 changes of the same "
+                  + "topic (3 changes including ancestors "
+                  + "and other changes related by topic)");
+    } else {
+      noSubmitWholeTopicAssertions(actions, 2);
+    }
+  }
+
+  @Test
+  public void revisionActionsReadyWithAncestors() throws Exception {
+    String changeId = createChange().getChangeId();
+    approve(changeId);
+    approve(changeId);
+    String changeId1 = createChange().getChangeId();
+    approve(changeId1);
+    String changeId2 = createChangeWithTopic().getChangeId();
+    approve(changeId2);
+    Map<String, ActionInfo> actions = getActions(changeId2);
+    commonActionsAssertions(actions);
+    // The topic contains only one change, so standard text applies
+    noSubmitWholeTopicAssertions(actions, 3);
+  }
+
+  private void noSubmitWholeTopicAssertions(Map<String, ActionInfo> actions, int nrChanges) {
+    ActionInfo info = actions.get("submit");
+    assertThat(info.enabled).isTrue();
+    if (nrChanges == 1) {
+      assertThat(info.label).isEqualTo("Submit");
+    } else {
+      assertThat(info.label).isEqualTo("Submit including parents");
+    }
+    assertThat(info.method).isEqualTo("POST");
+    if (nrChanges == 1) {
+      assertThat(info.title).isEqualTo("Submit patch set 1 into master");
+    } else {
+      assertThat(info.title)
+          .isEqualTo(
+              String.format(
+                  "Submit patch set 1 and ancestors (%d changes altogether) into master",
+                  nrChanges));
+    }
+  }
+
+  @Test
+  public void changeActionVisitor() throws Exception {
+    String id = createChange().getChangeId();
+    ChangeInfo origChange = gApi.changes().id(id).get(CHANGE_ACTIONS);
+
+    class Visitor implements ActionVisitor {
+      @Override
+      public boolean visit(String name, ActionInfo actionInfo, ChangeInfo changeInfo) {
+        assertThat(changeInfo).isNotNull();
+        assertThat(changeInfo._number).isEqualTo(origChange._number);
+        if (name.equals("followup")) {
+          return false;
+        }
+        if (name.equals("abandon")) {
+          actionInfo.label = "Abandon All Hope";
+        }
+        return true;
+      }
+
+      @Override
+      public boolean visit(
+          String name, ActionInfo actionInfo, ChangeInfo changeInfo, RevisionInfo revisionInfo) {
+        throw new UnsupportedOperationException();
+      }
+    }
+
+    Map<String, ActionInfo> origActions = origChange.actions;
+    assertThat(origActions.keySet()).containsAllOf("followup", "abandon");
+    assertThat(origActions.get("abandon").label).isEqualTo("Abandon");
+
+    Visitor v = new Visitor();
+    visitorHandle = actionVisitors.add("gerrit", v);
+
+    Map<String, ActionInfo> newActions =
+        gApi.changes().id(id).get(EnumSet.of(ListChangesOption.CHANGE_ACTIONS)).actions;
+
+    Set<String> expectedNames = new TreeSet<>(origActions.keySet());
+    expectedNames.remove("followup");
+    assertThat(newActions.keySet()).isEqualTo(expectedNames);
+
+    ActionInfo abandon = newActions.get("abandon");
+    assertThat(abandon).isNotNull();
+    assertThat(abandon.label).isEqualTo("Abandon All Hope");
+  }
+
+  @Test
+  public void currentRevisionActionVisitor() throws Exception {
+    String id = createChange().getChangeId();
+    amendChange(id);
+    ChangeInfo origChange = gApi.changes().id(id).get(CHANGE_ACTIONS);
+    Change.Id changeId = new Change.Id(origChange._number);
+
+    class Visitor implements ActionVisitor {
+      @Override
+      public boolean visit(String name, ActionInfo actionInfo, ChangeInfo changeInfo) {
+        return true; // Do nothing; implicitly called for CURRENT_ACTIONS.
+      }
+
+      @Override
+      public boolean visit(
+          String name, ActionInfo actionInfo, ChangeInfo changeInfo, RevisionInfo revisionInfo) {
+        assertThat(changeInfo).isNotNull();
+        assertThat(changeInfo._number).isEqualTo(origChange._number);
+        assertThat(revisionInfo).isNotNull();
+        assertThat(revisionInfo._number).isEqualTo(2);
+        if (name.equals("cherrypick")) {
+          return false;
+        }
+        if (name.equals("rebase")) {
+          actionInfo.label = "All Your Base";
+        }
+        return true;
+      }
+    }
+
+    Map<String, ActionInfo> origActions = gApi.changes().id(id).current().actions();
+    assertThat(origActions.keySet()).containsAllOf("cherrypick", "rebase");
+    assertThat(origActions.get("rebase").label).isEqualTo("Rebase");
+
+    Visitor v = new Visitor();
+    visitorHandle = actionVisitors.add("gerrit", v);
+
+    // Test different codepaths within ActionJson...
+    // ...via revision API.
+    visitedCurrentRevisionActionsAssertions(origActions, gApi.changes().id(id).current().actions());
+
+    // ...via change API with option.
+    EnumSet<ListChangesOption> opts = EnumSet.of(CURRENT_ACTIONS, CURRENT_REVISION);
+    ChangeInfo changeInfo = gApi.changes().id(id).get(opts);
+    RevisionInfo revisionInfo = Iterables.getOnlyElement(changeInfo.revisions.values());
+    visitedCurrentRevisionActionsAssertions(origActions, revisionInfo.actions);
+
+    // ...via ChangeJson directly.
+    ChangeData cd = changeDataFactory.create(db, project, changeId);
+    revisionJsonFactory.create(opts).getRevisionInfo(cd, cd.patchSet(new PatchSet.Id(changeId, 1)));
+  }
+
+  private void visitedCurrentRevisionActionsAssertions(
+      Map<String, ActionInfo> origActions, Map<String, ActionInfo> newActions) {
+    assertThat(newActions).isNotNull();
+    Set<String> expectedNames = new TreeSet<>(origActions.keySet());
+    expectedNames.remove("cherrypick");
+    assertThat(newActions.keySet()).isEqualTo(expectedNames);
+
+    ActionInfo rebase = newActions.get("rebase");
+    assertThat(rebase).isNotNull();
+    assertThat(rebase.label).isEqualTo("All Your Base");
+  }
+
+  @Test
+  public void oldRevisionActionVisitor() throws Exception {
+    String id = createChange().getChangeId();
+    amendChange(id);
+    ChangeInfo origChange = gApi.changes().id(id).get(CHANGE_ACTIONS);
+
+    class Visitor implements ActionVisitor {
+      @Override
+      public boolean visit(String name, ActionInfo actionInfo, ChangeInfo changeInfo) {
+        return true; // Do nothing; implicitly called for CURRENT_ACTIONS.
+      }
+
+      @Override
+      public boolean visit(
+          String name, ActionInfo actionInfo, ChangeInfo changeInfo, RevisionInfo revisionInfo) {
+        assertThat(changeInfo).isNotNull();
+        assertThat(changeInfo._number).isEqualTo(origChange._number);
+        assertThat(revisionInfo).isNotNull();
+        assertThat(revisionInfo._number).isEqualTo(1);
+        if (name.equals("description")) {
+          actionInfo.label = "Describify";
+        }
+        return true;
+      }
+    }
+
+    Map<String, ActionInfo> origActions = gApi.changes().id(id).revision(1).actions();
+    assertThat(origActions.keySet()).containsExactly("description");
+    assertThat(origActions.get("description").label).isEqualTo("Edit Description");
+
+    Visitor v = new Visitor();
+    visitorHandle = actionVisitors.add("gerrit", v);
+
+    // Unlike for the current revision, actions for old revisions are only available via the
+    // revision API.
+    Map<String, ActionInfo> newActions = gApi.changes().id(id).revision(1).actions();
+    assertThat(newActions).isNotNull();
+    assertThat(newActions.keySet()).isEqualTo(origActions.keySet());
+
+    ActionInfo description = newActions.get("description");
+    assertThat(description).isNotNull();
+    assertThat(description.label).isEqualTo("Describify");
+  }
+
+  private void commonActionsAssertions(Map<String, ActionInfo> actions) {
+    assertThat(actions).hasSize(4);
+    assertThat(actions).containsKey("cherrypick");
+    assertThat(actions).containsKey("submit");
+    assertThat(actions).containsKey("description");
+    assertThat(actions).containsKey("rebase");
+  }
+
+  private PushOneCommit.Result createChangeWithTopic() throws Exception {
+    return createChangeWithTopic(testRepo, "topic", "message", "a.txt", "content\n");
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/AssigneeIT.java b/javatests/com/google/gerrit/acceptance/rest/change/AssigneeIT.java
new file mode 100644
index 0000000..69035f2
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/change/AssigneeIT.java
@@ -0,0 +1,192 @@
+// 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.
+
+package com.google.gerrit.acceptance.rest.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static com.google.gerrit.extensions.client.ListChangesOption.DETAILED_LABELS;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static java.util.concurrent.TimeUnit.SECONDS;
+
+import com.google.common.collect.Iterables;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.changes.AssigneeInput;
+import com.google.gerrit.extensions.client.ReviewerState;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.testing.FakeEmailSender.Message;
+import com.google.gerrit.testing.TestTimeUtil;
+import java.util.Iterator;
+import java.util.List;
+import org.eclipse.jgit.transport.RefSpec;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+@NoHttpd
+public class AssigneeIT extends AbstractDaemonTest {
+
+  @BeforeClass
+  public static void setTimeForTesting() {
+    TestTimeUtil.resetWithClockStep(1, SECONDS);
+  }
+
+  @AfterClass
+  public static void restoreTime() {
+    TestTimeUtil.useSystemTime();
+  }
+
+  @Test
+  public void getNoAssignee() throws Exception {
+    PushOneCommit.Result r = createChange();
+    assertThat(getAssignee(r)).isNull();
+  }
+
+  @Test
+  public void addGetAssignee() throws Exception {
+    PushOneCommit.Result r = createChange();
+    assertThat(setAssignee(r, user.email)._accountId).isEqualTo(user.getId().get());
+    assertThat(getAssignee(r)._accountId).isEqualTo(user.getId().get());
+
+    assertThat(sender.getMessages()).hasSize(1);
+    Message m = sender.getMessages().get(0);
+    assertThat(m.rcpt()).containsExactly(user.emailAddress);
+  }
+
+  @Test
+  public void setNewAssigneeWhenExists() throws Exception {
+    PushOneCommit.Result r = createChange();
+    setAssignee(r, user.email);
+    assertThat(setAssignee(r, user.email)._accountId).isEqualTo(user.getId().get());
+  }
+
+  @Test
+  public void getPastAssignees() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    PushOneCommit.Result r = createChange();
+    setAssignee(r, user.email);
+    setAssignee(r, admin.email);
+    List<AccountInfo> assignees = getPastAssignees(r);
+    assertThat(assignees).hasSize(2);
+    Iterator<AccountInfo> itr = assignees.iterator();
+    assertThat(itr.next()._accountId).isEqualTo(user.getId().get());
+    assertThat(itr.next()._accountId).isEqualTo(admin.getId().get());
+  }
+
+  @Test
+  public void assigneeAddedAsReviewer() throws Exception {
+    ReviewerState state;
+    // Assignee is added as CC, if back-end is reviewDb (that does not support
+    // CC) CC is stored as REVIEWER
+    if (notesMigration.readChanges()) {
+      state = ReviewerState.CC;
+    } else {
+      state = ReviewerState.REVIEWER;
+    }
+    PushOneCommit.Result r = createChange();
+    Iterable<AccountInfo> reviewers = getReviewers(r, state);
+    assertThat(reviewers).isNull();
+    assertThat(setAssignee(r, user.email)._accountId).isEqualTo(user.getId().get());
+    reviewers = getReviewers(r, state);
+    assertThat(reviewers).hasSize(1);
+    AccountInfo reviewer = Iterables.getFirst(reviewers, null);
+    assertThat(reviewer._accountId).isEqualTo(user.getId().get());
+  }
+
+  @Test
+  public void setAlreadyExistingAssignee() throws Exception {
+    PushOneCommit.Result r = createChange();
+    setAssignee(r, user.email);
+    assertThat(setAssignee(r, user.email)._accountId).isEqualTo(user.getId().get());
+  }
+
+  @Test
+  public void deleteAssignee() throws Exception {
+    PushOneCommit.Result r = createChange();
+    assertThat(setAssignee(r, user.email)._accountId).isEqualTo(user.getId().get());
+    assertThat(deleteAssignee(r)._accountId).isEqualTo(user.getId().get());
+    assertThat(getAssignee(r)).isNull();
+  }
+
+  @Test
+  public void deleteAssigneeWhenNoAssignee() throws Exception {
+    PushOneCommit.Result r = createChange();
+    assertThat(deleteAssignee(r)).isNull();
+  }
+
+  @Test
+  public void setAssigneeToInactiveUser() throws Exception {
+    PushOneCommit.Result r = createChange();
+    gApi.accounts().id(user.getId().get()).setActive(false);
+    exception.expect(UnprocessableEntityException.class);
+    exception.expectMessage("is not active");
+    setAssignee(r, user.email);
+  }
+
+  @Test
+  public void setAssigneeForNonVisibleChange() throws Exception {
+    git().fetch().setRefSpecs(new RefSpec("refs/meta/config:refs/meta/config")).call();
+    testRepo.reset(RefNames.REFS_CONFIG);
+    PushOneCommit.Result r = createChange("refs/for/refs/meta/config");
+    exception.expect(AuthException.class);
+    exception.expectMessage("read not permitted");
+    setAssignee(r, user.email);
+  }
+
+  @Test
+  public void setAssigneeNotAllowedWithoutPermission() throws Exception {
+    PushOneCommit.Result r = createChange();
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    exception.expectMessage("not permitted");
+    setAssignee(r, user.email);
+  }
+
+  @Test
+  public void setAssigneeAllowedWithPermission() throws Exception {
+    PushOneCommit.Result r = createChange();
+    grant(project, "refs/heads/master", Permission.EDIT_ASSIGNEE, false, REGISTERED_USERS);
+    setApiUser(user);
+    assertThat(setAssignee(r, user.email)._accountId).isEqualTo(user.getId().get());
+  }
+
+  private AccountInfo getAssignee(PushOneCommit.Result r) throws Exception {
+    return gApi.changes().id(r.getChange().getId().get()).getAssignee();
+  }
+
+  private List<AccountInfo> getPastAssignees(PushOneCommit.Result r) throws Exception {
+    return gApi.changes().id(r.getChange().getId().get()).getPastAssignees();
+  }
+
+  private Iterable<AccountInfo> getReviewers(PushOneCommit.Result r, ReviewerState state)
+      throws Exception {
+    return get(r.getChangeId(), DETAILED_LABELS).reviewers.get(state);
+  }
+
+  private AccountInfo setAssignee(PushOneCommit.Result r, String identifieer) throws Exception {
+    AssigneeInput input = new AssigneeInput();
+    input.assignee = identifieer;
+    return gApi.changes().id(r.getChange().getId().get()).setAssignee(input);
+  }
+
+  private AccountInfo deleteAssignee(PushOneCommit.Result r) throws Exception {
+    return gApi.changes().id(r.getChange().getId().get()).deleteAssignee();
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/BUILD b/javatests/com/google/gerrit/acceptance/rest/change/BUILD
new file mode 100644
index 0000000..9a65378
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/change/BUILD
@@ -0,0 +1,40 @@
+load("//javatests/com/google/gerrit/acceptance:tests.bzl", "acceptance_tests")
+
+SUBMIT_UTIL_SRCS = glob(["AbstractSubmit*.java"])
+
+SUBMIT_TESTS = glob(["Submit*IT.java"])
+
+OTHER_TESTS = glob(
+    ["*IT.java"],
+    exclude = SUBMIT_TESTS,
+)
+
+acceptance_tests(
+    srcs = OTHER_TESTS,
+    group = "rest_change_other",
+    labels = ["rest"],
+    deps = [
+        ":submit_util",
+        "//java/com/google/gerrit/mail",
+    ],
+)
+
+acceptance_tests(
+    srcs = SUBMIT_TESTS,
+    group = "rest_change_submit",
+    labels = ["rest"],
+    deps = [
+        ":submit_util",
+    ],
+)
+
+java_library(
+    name = "submit_util",
+    testonly = True,
+    srcs = SUBMIT_UTIL_SRCS,
+    deps = [
+        "//java/com/google/gerrit/acceptance:lib",
+        "//java/com/google/gerrit/server/restapi",
+        "//java/com/google/gerrit/server/util/time",
+    ],
+)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeIdIT.java b/javatests/com/google/gerrit/acceptance/rest/change/ChangeIdIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeIdIT.java
rename to javatests/com/google/gerrit/acceptance/rest/change/ChangeIdIT.java
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/ChangeIncludedInIT.java b/javatests/com/google/gerrit/acceptance/rest/change/ChangeIncludedInIT.java
new file mode 100644
index 0000000..59b6e29
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/change/ChangeIncludedInIT.java
@@ -0,0 +1,63 @@
+// Copyright (C) 2017 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.google.gerrit.acceptance.rest.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.eclipse.jgit.lib.Constants.R_TAGS;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.PushOneCommit.Result;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.projects.TagInput;
+import com.google.gerrit.reviewdb.client.Branch;
+import org.junit.Test;
+
+@NoHttpd
+public class ChangeIncludedInIT extends AbstractDaemonTest {
+
+  @Test
+  public void includedInOpenChange() throws Exception {
+    Result result = createChange();
+    assertThat(gApi.changes().id(result.getChangeId()).includedIn().branches).isEmpty();
+    assertThat(gApi.changes().id(result.getChangeId()).includedIn().tags).isEmpty();
+  }
+
+  @Test
+  public void includedInMergedChange() throws Exception {
+    Result result = createChange();
+    gApi.changes()
+        .id(result.getChangeId())
+        .revision(result.getCommit().name())
+        .review(ReviewInput.approve());
+    gApi.changes().id(result.getChangeId()).revision(result.getCommit().name()).submit();
+
+    assertThat(gApi.changes().id(result.getChangeId()).includedIn().branches)
+        .containsExactly("master");
+    assertThat(gApi.changes().id(result.getChangeId()).includedIn().tags).isEmpty();
+
+    grant(project, R_TAGS + "*", Permission.CREATE_TAG);
+    gApi.projects().name(project.get()).tag("test-tag").create(new TagInput());
+
+    assertThat(gApi.changes().id(result.getChangeId()).includedIn().tags)
+        .containsExactly("test-tag");
+
+    createBranch(new Branch.NameKey(project.get(), "test-branch"));
+
+    assertThat(gApi.changes().id(result.getChangeId()).includedIn().branches)
+        .containsExactly("master", "test-branch");
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/ChangeMessagesIT.java b/javatests/com/google/gerrit/acceptance/rest/change/ChangeMessagesIT.java
new file mode 100644
index 0000000..790b884
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/change/ChangeMessagesIT.java
@@ -0,0 +1,406 @@
+// Copyright (C) 2013 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.google.gerrit.acceptance.rest.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.acceptance.PushOneCommit.FILE_NAME;
+import static com.google.gerrit.extensions.client.ListChangesOption.MESSAGES;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.parseCommitMessageRange;
+import static com.google.gerrit.server.restapi.change.DeleteChangeMessage.createNewChangeMessage;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static java.util.stream.Collectors.toSet;
+import static org.eclipse.jgit.util.RawParseUtils.decode;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.TestAccount;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.api.changes.DeleteChangeMessageInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.ChangeMessageInfo;
+import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.notedb.ChangeNoteUtil;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.gerrit.testing.TestTimeUtil;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Optional;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.util.RawParseUtils;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(ConfigSuite.class)
+public class ChangeMessagesIT extends AbstractDaemonTest {
+  private String systemTimeZone;
+
+  @Before
+  public void setTimeForTesting() {
+    systemTimeZone = System.setProperty("user.timezone", "US/Eastern");
+    TestTimeUtil.resetWithClockStep(1, SECONDS);
+  }
+
+  @After
+  public void resetTime() {
+    TestTimeUtil.useSystemTime();
+    System.setProperty("user.timezone", systemTimeZone);
+  }
+
+  @Test
+  public void messagesNotReturnedByDefault() throws Exception {
+    String changeId = createChange().getChangeId();
+    postMessage(changeId, "Some nits need to be fixed.");
+    ChangeInfo c = info(changeId);
+    assertThat(c.messages).isNull();
+  }
+
+  @Test
+  public void defaultMessage() throws Exception {
+    String changeId = createChange().getChangeId();
+    ChangeInfo c = get(changeId, MESSAGES);
+    assertThat(c.messages).isNotNull();
+    assertThat(c.messages).hasSize(1);
+    assertThat(c.messages.iterator().next().message).isEqualTo("Uploaded patch set 1.");
+  }
+
+  @Test
+  public void messagesReturnedInChronologicalOrder() throws Exception {
+    String changeId = createChange().getChangeId();
+    String firstMessage = "Some nits need to be fixed.";
+    postMessage(changeId, firstMessage);
+    String secondMessage = "I like this feature.";
+    postMessage(changeId, secondMessage);
+    ChangeInfo c = get(changeId, MESSAGES);
+    assertThat(c.messages).isNotNull();
+    assertThat(c.messages).hasSize(3);
+    Iterator<ChangeMessageInfo> it = c.messages.iterator();
+    assertThat(it.next().message).isEqualTo("Uploaded patch set 1.");
+    assertMessage(firstMessage, it.next().message);
+    assertMessage(secondMessage, it.next().message);
+  }
+
+  @Test
+  public void postMessageWithTag() throws Exception {
+    String changeId = createChange().getChangeId();
+    String tag = "jenkins";
+    String msg = "Message with tag.";
+    postMessage(changeId, msg, tag);
+    ChangeInfo c = get(changeId, MESSAGES);
+    assertThat(c.messages).isNotNull();
+    assertThat(c.messages).hasSize(2);
+    Iterator<ChangeMessageInfo> it = c.messages.iterator();
+    assertThat(it.next().message).isEqualTo("Uploaded patch set 1.");
+    ChangeMessageInfo actual = it.next();
+    assertMessage(msg, actual.message);
+    assertThat(actual.tag).isEqualTo(tag);
+  }
+
+  @Test
+  public void listChangeMessages() throws Exception {
+    int changeNum = createOneChangeWithMultipleChangeMessagesInHistory();
+    List<ChangeMessageInfo> messages1 = gApi.changes().id(changeNum).messages();
+    List<ChangeMessageInfo> messages2 =
+        new ArrayList<>(gApi.changes().id(changeNum).get().messages);
+    assertThat(messages1).containsExactlyElementsIn(messages2).inOrder();
+  }
+
+  @Test
+  public void getOneChangeMessage() throws Exception {
+    int changeNum = createOneChangeWithMultipleChangeMessagesInHistory();
+    List<ChangeMessageInfo> messages = new ArrayList<>(gApi.changes().id(changeNum).get().messages);
+    for (ChangeMessageInfo messageInfo : messages) {
+      String id = messageInfo.id;
+      assertThat(gApi.changes().id(changeNum).message(id).get()).isEqualTo(messageInfo);
+    }
+  }
+
+  @Test
+  public void deleteCannotBeAppliedWithoutAdministrateServerCapability() throws Exception {
+    int changeNum = createOneChangeWithMultipleChangeMessagesInHistory();
+    setApiUser(user);
+
+    try {
+      deleteOneChangeMessage(changeNum, 0, user, "spam");
+      fail("expected AuthException");
+    } catch (AuthException e) {
+      assertThat(e.getMessage()).isEqualTo("administrate server not permitted");
+    }
+  }
+
+  @Test
+  public void deleteCanBeAppliedWithAdministrateServerCapability() throws Exception {
+    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ADMINISTRATE_SERVER);
+    int changeNum = createOneChangeWithMultipleChangeMessagesInHistory();
+    setApiUser(user);
+    deleteOneChangeMessage(changeNum, 0, user, "spam");
+  }
+
+  @Test
+  public void deleteCannotBeAppliedWithEmptyChangeMessageUuid() throws Exception {
+    String changeId = createChange().getChangeId();
+
+    try {
+      gApi.changes().id(changeId).message("").delete(new DeleteChangeMessageInput("spam"));
+      fail("expected ResourceNotFoundException");
+    } catch (ResourceNotFoundException e) {
+      assertThat(e.getMessage()).isEqualTo("change message  not found");
+    }
+  }
+
+  @Test
+  public void deleteCannotBeAppliedWithNonExistingChangeMessageUuid() throws Exception {
+    String changeId = createChange().getChangeId();
+    DeleteChangeMessageInput input = new DeleteChangeMessageInput();
+    String id = "8473b95934b5732ac55d26311a706c9c2bde9941";
+    input.reason = "spam";
+
+    try {
+      gApi.changes().id(changeId).message(id).delete(input);
+      fail("expected ResourceNotFoundException");
+    } catch (ResourceNotFoundException e) {
+      assertThat(e.getMessage()).isEqualTo(String.format("change message %s not found", id));
+    }
+  }
+
+  @Test
+  public void deleteCanBeAppliedWithoutProvidingReason() throws Exception {
+    int changeNum = createOneChangeWithMultipleChangeMessagesInHistory();
+    deleteOneChangeMessage(changeNum, 2, admin, "");
+  }
+
+  @Test
+  public void deleteOneChangeMessageTwice() throws Exception {
+    int changeNum = createOneChangeWithMultipleChangeMessagesInHistory();
+    // Deletes the second change message twice.
+    deleteOneChangeMessage(changeNum, 1, admin, "reason 1");
+    deleteOneChangeMessage(changeNum, 1, admin, "reason 2");
+  }
+
+  @Test
+  public void deleteMultipleChangeMessages() throws Exception {
+    int changeNum = createOneChangeWithMultipleChangeMessagesInHistory();
+    for (int i = 0; i < 7; ++i) {
+      deleteOneChangeMessage(changeNum, i, admin, "reason " + i);
+    }
+  }
+
+  private int createOneChangeWithMultipleChangeMessagesInHistory() throws Exception {
+    // Creates the following commit history on the meta branch of the test change.
+
+    setApiUser(user);
+    // Commit 1: create a change.
+    PushOneCommit.Result result = createChange();
+    String changeId = result.getChangeId();
+    // Commit 2: post a review with message "message 1".
+    setApiUser(admin);
+    addOneReview(changeId, "message 1");
+    // Commit 3: amend a new patch set.
+    setApiUser(user);
+    amendChange(changeId);
+    // Commit 4: post a review with message "message 2".
+    addOneReview(changeId, "message 2");
+    // Commit 5: amend a new patch set.
+    amendChange(changeId);
+    // Commit 6: approve the change.
+    setApiUser(admin);
+    gApi.changes().id(changeId).current().review(ReviewInput.approve());
+    // commit 7: submit the change.
+    gApi.changes().id(changeId).current().submit();
+
+    return result.getChange().getId().get();
+  }
+
+  private void addOneReview(String changeId, String changeMessage) throws Exception {
+    ReviewInput.CommentInput c = new ReviewInput.CommentInput();
+    c.line = 1;
+    c.message = "comment 1";
+    c.path = FILE_NAME;
+
+    ReviewInput reviewInput = new ReviewInput().label("Code-Review", 1);
+    reviewInput.comments = ImmutableMap.of(c.path, Lists.newArrayList(c));
+    reviewInput.message = changeMessage;
+
+    gApi.changes().id(changeId).current().review(reviewInput);
+  }
+
+  private void deleteOneChangeMessage(
+      int changeNum, int deletedMessageIndex, TestAccount deletedBy, String reason)
+      throws Exception {
+    List<ChangeMessageInfo> messagesBeforeDeletion = gApi.changes().id(changeNum).messages();
+
+    List<CommentInfo> commentsBefore = getChangeSortedComments(changeNum);
+    List<RevCommit> commitsBefore = new ArrayList<>();
+    if (notesMigration.readChanges()) {
+      commitsBefore = getChangeMetaCommitsInReverseOrder(new Change.Id(changeNum));
+    }
+
+    String id = messagesBeforeDeletion.get(deletedMessageIndex).id;
+    DeleteChangeMessageInput input = new DeleteChangeMessageInput(reason);
+    ChangeMessageInfo info = gApi.changes().id(changeNum).message(id).delete(input);
+
+    // Verify the return change message info is as expect.
+    assertThat(info.message).isEqualTo(createNewChangeMessage(deletedBy.fullName, reason));
+    List<ChangeMessageInfo> messagesAfterDeletion = gApi.changes().id(changeNum).messages();
+    assertMessagesAfterDeletion(
+        messagesBeforeDeletion, messagesAfterDeletion, deletedMessageIndex, deletedBy, reason);
+    assertCommentsAfterDeletion(changeNum, commentsBefore);
+
+    // Verify change index is updated after deletion.
+    List<ChangeInfo> changes = gApi.changes().query("message removed").get();
+    assertThat(changes.stream().map(c -> c._number).collect(toSet())).contains(changeNum);
+
+    // Verifies states of commits if NoteDb is on.
+    if (notesMigration.readChanges()) {
+      assertMetaCommitsAfterDeletion(
+          commitsBefore, changeNum, deletedMessageIndex, deletedBy, reason);
+    }
+  }
+
+  private void assertMessagesAfterDeletion(
+      List<ChangeMessageInfo> messagesBeforeDeletion,
+      List<ChangeMessageInfo> messagesAfterDeletion,
+      int deletedMessageIndex,
+      TestAccount deletedBy,
+      String deleteReason) {
+    assertThat(messagesAfterDeletion)
+        .named("after: %s; before: %s", messagesAfterDeletion, messagesBeforeDeletion)
+        .hasSize(messagesBeforeDeletion.size());
+
+    for (int i = 0; i < messagesAfterDeletion.size(); ++i) {
+      ChangeMessageInfo before = messagesBeforeDeletion.get(i);
+      ChangeMessageInfo after = messagesAfterDeletion.get(i);
+
+      if (i < deletedMessageIndex) {
+        // The uuid of a commit message will be updated after rewriting.
+        assertThat(after.id).isEqualTo(before.id);
+      }
+
+      assertThat(after.tag).isEqualTo(before.tag);
+      assertThat(after.author).isEqualTo(before.author);
+      assertThat(after.realAuthor).isEqualTo(before.realAuthor);
+      assertThat(after._revisionNumber).isEqualTo(before._revisionNumber);
+
+      if (i == deletedMessageIndex) {
+        assertThat(after.message)
+            .isEqualTo(createNewChangeMessage(deletedBy.fullName, deleteReason));
+      } else {
+        assertThat(after.message).isEqualTo(before.message);
+      }
+    }
+  }
+
+  private void assertMetaCommitsAfterDeletion(
+      List<RevCommit> commitsBeforeDeletion,
+      int changeNum,
+      int deletedMessageIndex,
+      TestAccount deletedBy,
+      String deleteReason)
+      throws Exception {
+    List<RevCommit> commitsAfterDeletion =
+        getChangeMetaCommitsInReverseOrder(new Change.Id(changeNum));
+    assertThat(commitsAfterDeletion).hasSize(commitsBeforeDeletion.size());
+
+    for (int i = 0; i < commitsBeforeDeletion.size(); i++) {
+      RevCommit commitBefore = commitsBeforeDeletion.get(i);
+      RevCommit commitAfter = commitsAfterDeletion.get(i);
+      if (i == deletedMessageIndex) {
+        byte[] rawBefore = commitBefore.getRawBuffer();
+        byte[] rawAfter = commitAfter.getRawBuffer();
+        Charset encodingBefore = RawParseUtils.parseEncoding(rawBefore);
+        Charset encodingAfter = RawParseUtils.parseEncoding(rawAfter);
+        Optional<ChangeNoteUtil.CommitMessageRange> rangeBefore =
+            parseCommitMessageRange(commitBefore);
+        Optional<ChangeNoteUtil.CommitMessageRange> rangeAfter =
+            parseCommitMessageRange(commitAfter);
+        assertThat(rangeBefore.isPresent()).isTrue();
+        assertThat(rangeAfter.isPresent()).isTrue();
+
+        String subjectBefore =
+            decode(
+                encodingBefore,
+                rawBefore,
+                rangeBefore.get().subjectStart(),
+                rangeBefore.get().subjectEnd());
+        String subjectAfter =
+            decode(
+                encodingAfter,
+                rawAfter,
+                rangeAfter.get().subjectStart(),
+                rangeAfter.get().subjectEnd());
+        assertThat(subjectBefore).isEqualTo(subjectAfter);
+
+        String footersBefore =
+            decode(
+                encodingBefore,
+                rawBefore,
+                rangeBefore.get().changeMessageEnd() + 1,
+                rawBefore.length);
+        String footersAfter =
+            decode(
+                encodingAfter, rawAfter, rangeAfter.get().changeMessageEnd() + 1, rawAfter.length);
+        assertThat(footersBefore).isEqualTo(footersAfter);
+
+        String message =
+            decode(
+                encodingAfter,
+                rawAfter,
+                rangeAfter.get().changeMessageStart(),
+                rangeAfter.get().changeMessageEnd() + 1);
+        assertThat(message).isEqualTo(createNewChangeMessage(deletedBy.fullName, deleteReason));
+      } else {
+        assertThat(commitAfter.getFullMessage()).isEqualTo(commitBefore.getFullMessage());
+      }
+
+      assertThat(commitAfter.getCommitterIdent().getName())
+          .isEqualTo(commitBefore.getCommitterIdent().getName());
+      assertThat(commitAfter.getAuthorIdent().getName())
+          .isEqualTo(commitBefore.getAuthorIdent().getName());
+      assertThat(commitAfter.getEncoding()).isEqualTo(commitBefore.getEncoding());
+      assertThat(commitAfter.getEncodingName()).isEqualTo(commitBefore.getEncodingName());
+    }
+  }
+
+  /** Verifies comments are not changed after deleting change message(s). */
+  private void assertCommentsAfterDeletion(int changeNum, List<CommentInfo> commentsBeforeDeletion)
+      throws Exception {
+    List<CommentInfo> commentsAfterDeletion = getChangeSortedComments(changeNum);
+    assertThat(commentsAfterDeletion).containsExactlyElementsIn(commentsBeforeDeletion).inOrder();
+  }
+
+  private static void assertMessage(String expected, String actual) {
+    assertThat(actual).isEqualTo("Patch Set 1:\n\n" + expected);
+  }
+
+  private void postMessage(String changeId, String msg) throws Exception {
+    postMessage(changeId, msg, null);
+  }
+
+  private void postMessage(String changeId, String msg, String tag) throws Exception {
+    ReviewInput in = new ReviewInput();
+    in.message = msg;
+    in.tag = tag;
+    gApi.changes().id(changeId).current().review(in);
+  }
+}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeOwnerIT.java b/javatests/com/google/gerrit/acceptance/rest/change/ChangeOwnerIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ChangeOwnerIT.java
rename to javatests/com/google/gerrit/acceptance/rest/change/ChangeOwnerIT.java
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/ChangeReviewersByEmailIT.java b/javatests/com/google/gerrit/acceptance/rest/change/ChangeReviewersByEmailIT.java
new file mode 100644
index 0000000..dc71c1f
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/change/ChangeReviewersByEmailIT.java
@@ -0,0 +1,391 @@
+// Copyright (C) 2017 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.google.gerrit.acceptance.rest.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static com.google.gerrit.extensions.client.ListChangesOption.DETAILED_LABELS;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.extensions.api.changes.AddReviewerInput;
+import com.google.gerrit.extensions.api.changes.AddReviewerResult;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.changes.ReviewerInfo;
+import com.google.gerrit.extensions.api.projects.ConfigInput;
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.extensions.client.ReviewerState;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.testing.FakeEmailSender.Message;
+import com.google.gson.reflect.TypeToken;
+import java.lang.reflect.Type;
+import java.util.List;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ChangeReviewersByEmailIT extends AbstractDaemonTest {
+
+  @Before
+  public void setUp() throws Exception {
+    ConfigInput conf = new ConfigInput();
+    conf.enableReviewerByEmail = InheritableBoolean.TRUE;
+    gApi.projects().name(project.get()).config(conf);
+  }
+
+  @Test
+  public void addByEmail() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    AccountInfo acc = new AccountInfo("Foo Bar", "foo.bar@gerritcodereview.com");
+
+    for (ReviewerState state : ImmutableList.of(ReviewerState.CC, ReviewerState.REVIEWER)) {
+      PushOneCommit.Result r = createChange();
+
+      AddReviewerInput input = new AddReviewerInput();
+      input.reviewer = toRfcAddressString(acc);
+      input.state = state;
+      gApi.changes().id(r.getChangeId()).addReviewer(input);
+
+      ChangeInfo info = gApi.changes().id(r.getChangeId()).get(DETAILED_LABELS);
+      assertThat(info.reviewers).isEqualTo(ImmutableMap.of(state, ImmutableList.of(acc)));
+      // All reviewers added by email should be removable
+      assertThat(info.removableReviewers).isEqualTo(ImmutableList.of(acc));
+    }
+  }
+
+  @Test
+  public void addByEmailAndById() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    AccountInfo byEmail = new AccountInfo("Foo Bar", "foo.bar@gerritcodereview.com");
+    AccountInfo byId = new AccountInfo(user.id.get());
+
+    for (ReviewerState state : ImmutableList.of(ReviewerState.CC, ReviewerState.REVIEWER)) {
+      PushOneCommit.Result r = createChange();
+
+      AddReviewerInput inputByEmail = new AddReviewerInput();
+      inputByEmail.reviewer = toRfcAddressString(byEmail);
+      inputByEmail.state = state;
+      gApi.changes().id(r.getChangeId()).addReviewer(inputByEmail);
+
+      AddReviewerInput inputById = new AddReviewerInput();
+      inputById.reviewer = user.email;
+      inputById.state = state;
+      gApi.changes().id(r.getChangeId()).addReviewer(inputById);
+
+      ChangeInfo info = gApi.changes().id(r.getChangeId()).get(DETAILED_LABELS);
+      assertThat(info.reviewers).isEqualTo(ImmutableMap.of(state, ImmutableList.of(byId, byEmail)));
+      // All reviewers (both by id and by email) should be removable
+      assertThat(info.removableReviewers).isEqualTo(ImmutableList.of(byId, byEmail));
+    }
+  }
+
+  @Test
+  public void listReviewersByEmail() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    AccountInfo acc = new AccountInfo("Foo Bar", "foo.bar@gerritcodereview.com");
+
+    for (ReviewerState state : ImmutableList.of(ReviewerState.CC, ReviewerState.REVIEWER)) {
+      PushOneCommit.Result r = createChange();
+
+      AddReviewerInput input = new AddReviewerInput();
+      input.reviewer = toRfcAddressString(acc);
+      input.state = state;
+      gApi.changes().id(r.getChangeId()).addReviewer(input);
+
+      RestResponse restResponse =
+          adminRestSession.get("/changes/" + r.getChangeId() + "/reviewers/");
+      restResponse.assertOK();
+      Type type = new TypeToken<List<ReviewerInfo>>() {}.getType();
+      List<ReviewerInfo> reviewers = newGson().fromJson(restResponse.getReader(), type);
+      restResponse.consume();
+
+      assertThat(reviewers).hasSize(1);
+      ReviewerInfo reviewerInfo = Iterables.getOnlyElement(reviewers);
+      assertThat(reviewerInfo._accountId).isNull();
+      assertThat(reviewerInfo.name).isEqualTo(acc.name);
+      assertThat(reviewerInfo.email).isEqualTo(acc.email);
+    }
+  }
+
+  @Test
+  public void removeByEmail() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    AccountInfo acc = new AccountInfo("Foo Bar", "foo.bar@gerritcodereview.com");
+
+    for (ReviewerState state : ImmutableList.of(ReviewerState.CC, ReviewerState.REVIEWER)) {
+      PushOneCommit.Result r = createChange();
+
+      AddReviewerInput addInput = new AddReviewerInput();
+      addInput.reviewer = toRfcAddressString(acc);
+      addInput.state = state;
+      gApi.changes().id(r.getChangeId()).addReviewer(addInput);
+
+      gApi.changes().id(r.getChangeId()).reviewer(acc.email).remove();
+
+      ChangeInfo info = gApi.changes().id(r.getChangeId()).get(DETAILED_LABELS);
+      assertThat(info.reviewers).isEmpty();
+    }
+  }
+
+  @Test
+  public void convertFromCCToReviewer() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    AccountInfo acc = new AccountInfo("Foo Bar", "foo.bar@gerritcodereview.com");
+
+    PushOneCommit.Result r = createChange();
+
+    AddReviewerInput addInput = new AddReviewerInput();
+    addInput.reviewer = toRfcAddressString(acc);
+    addInput.state = ReviewerState.CC;
+    gApi.changes().id(r.getChangeId()).addReviewer(addInput);
+
+    AddReviewerInput modifyInput = new AddReviewerInput();
+    modifyInput.reviewer = addInput.reviewer;
+    modifyInput.state = ReviewerState.REVIEWER;
+    gApi.changes().id(r.getChangeId()).addReviewer(modifyInput);
+
+    ChangeInfo info = gApi.changes().id(r.getChangeId()).get(DETAILED_LABELS);
+    assertThat(info.reviewers)
+        .isEqualTo(ImmutableMap.of(ReviewerState.REVIEWER, ImmutableList.of(acc)));
+  }
+
+  @Test
+  public void addedReviewersGetNotified() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    AccountInfo acc = new AccountInfo("Foo Bar", "foo.bar@gerritcodereview.com");
+
+    for (ReviewerState state : ImmutableList.of(ReviewerState.CC, ReviewerState.REVIEWER)) {
+      PushOneCommit.Result r = createChange();
+
+      AddReviewerInput input = new AddReviewerInput();
+      input.reviewer = toRfcAddressString(acc);
+      input.state = state;
+      gApi.changes().id(r.getChangeId()).addReviewer(input);
+
+      List<Message> messages = sender.getMessages();
+      assertThat(messages).hasSize(1);
+      assertThat(messages.get(0).rcpt()).containsExactly(Address.parse(input.reviewer));
+      sender.clear();
+    }
+  }
+
+  @Test
+  public void removingReviewerTriggersNotification() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    AccountInfo acc = new AccountInfo("Foo Bar", "foo.bar@gerritcodereview.com");
+
+    for (ReviewerState state : ImmutableList.of(ReviewerState.CC, ReviewerState.REVIEWER)) {
+      PushOneCommit.Result r = createChange();
+
+      AddReviewerInput addInput = new AddReviewerInput();
+      addInput.reviewer = toRfcAddressString(acc);
+      addInput.state = state;
+      gApi.changes().id(r.getChangeId()).addReviewer(addInput);
+
+      // Review change as user
+      ReviewInput reviewInput = new ReviewInput();
+      reviewInput.message = "I have a comment";
+      setApiUser(user);
+      revision(r).review(reviewInput);
+      setApiUser(admin);
+
+      sender.clear();
+
+      // Delete as admin
+      gApi.changes().id(r.getChangeId()).reviewer(addInput.reviewer).remove();
+
+      List<Message> messages = sender.getMessages();
+      assertThat(messages).hasSize(1);
+      assertThat(messages.get(0).rcpt())
+          .containsExactly(Address.parse(addInput.reviewer), user.emailAddress);
+      sender.clear();
+    }
+  }
+
+  @Test
+  public void reviewerAndCCReceiveRegularNotification() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    AccountInfo acc = new AccountInfo("Foo Bar", "foo.bar@gerritcodereview.com");
+
+    for (ReviewerState state : ImmutableList.of(ReviewerState.CC, ReviewerState.REVIEWER)) {
+      PushOneCommit.Result r = createChange();
+
+      AddReviewerInput input = new AddReviewerInput();
+      input.reviewer = toRfcAddressString(acc);
+      input.state = state;
+      gApi.changes().id(r.getChangeId()).addReviewer(input);
+      sender.clear();
+
+      gApi.changes()
+          .id(r.getChangeId())
+          .revision(r.getCommit().name())
+          .review(ReviewInput.approve());
+
+      assertNotifyCc(Address.parse(input.reviewer));
+    }
+  }
+
+  @Test
+  public void reviewerAndCCReceiveSameEmail() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    PushOneCommit.Result r = createChange();
+    for (ReviewerState state : ImmutableList.of(ReviewerState.CC, ReviewerState.REVIEWER)) {
+      for (int i = 0; i < 10; i++) {
+        AddReviewerInput input = new AddReviewerInput();
+        input.reviewer = String.format("%s-%s@gerritcodereview.com", state, i);
+        input.state = state;
+        gApi.changes().id(r.getChangeId()).addReviewer(input);
+      }
+    }
+
+    // Also add user as a regular reviewer
+    AddReviewerInput input = new AddReviewerInput();
+    input.reviewer = user.email;
+    input.state = ReviewerState.REVIEWER;
+    gApi.changes().id(r.getChangeId()).addReviewer(input);
+
+    sender.clear();
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
+    // Assert that only one email was sent out to everyone
+    assertThat(sender.getMessages()).hasSize(1);
+  }
+
+  @Test
+  public void addingMultipleReviewersAndCCsAtOnceSendsOnlyOneEmail() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    PushOneCommit.Result r = createChange();
+    ReviewInput reviewInput = new ReviewInput();
+    for (ReviewerState state : ImmutableList.of(ReviewerState.CC, ReviewerState.REVIEWER)) {
+      for (int i = 0; i < 10; i++) {
+        reviewInput.reviewer(String.format("%s-%s@gerritcodereview.com", state, i), state, true);
+      }
+    }
+    assertThat(reviewInput.reviewers).hasSize(20);
+
+    sender.clear();
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(reviewInput);
+    assertThat(sender.getMessages()).hasSize(1);
+  }
+
+  @Test
+  public void rejectMissingEmail() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    PushOneCommit.Result r = createChange();
+
+    AddReviewerResult result = gApi.changes().id(r.getChangeId()).addReviewer("");
+    assertThat(result.error).isEqualTo(" is not a valid user identifier");
+    assertThat(result.reviewers).isNull();
+  }
+
+  @Test
+  public void rejectMalformedEmail() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    PushOneCommit.Result r = createChange();
+
+    AddReviewerResult result = gApi.changes().id(r.getChangeId()).addReviewer("Foo Bar <foo.bar@");
+    assertThat(result.error).isEqualTo("Foo Bar <foo.bar@ is not a valid user identifier");
+    assertThat(result.reviewers).isNull();
+  }
+
+  @Test
+  public void rejectWhenFeatureIsDisabled() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    ConfigInput conf = new ConfigInput();
+    conf.enableReviewerByEmail = InheritableBoolean.FALSE;
+    gApi.projects().name(project.get()).config(conf);
+
+    PushOneCommit.Result r = createChange();
+
+    AddReviewerResult result =
+        gApi.changes().id(r.getChangeId()).addReviewer("Foo Bar <foo.bar@gerritcodereview.com>");
+    assertThat(result.error)
+        .isEqualTo(
+            "Foo Bar <foo.bar@gerritcodereview.com> does not identify a registered user or group");
+    assertThat(result.reviewers).isNull();
+  }
+
+  @Test
+  public void reviewersByEmailAreServedFromIndex() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    AccountInfo acc = new AccountInfo("Foo Bar", "foo.bar@gerritcodereview.com");
+
+    for (ReviewerState state : ImmutableList.of(ReviewerState.CC, ReviewerState.REVIEWER)) {
+      PushOneCommit.Result r = createChange();
+
+      AddReviewerInput input = new AddReviewerInput();
+      input.reviewer = toRfcAddressString(acc);
+      input.state = state;
+      gApi.changes().id(r.getChangeId()).addReviewer(input);
+
+      notesMigration.setFailOnLoadForTest(true);
+      try {
+        ChangeInfo info =
+            Iterables.getOnlyElement(
+                gApi.changes().query(r.getChangeId()).withOption(DETAILED_LABELS).get());
+        assertThat(info.reviewers).isEqualTo(ImmutableMap.of(state, ImmutableList.of(acc)));
+      } finally {
+        notesMigration.setFailOnLoadForTest(false);
+      }
+    }
+  }
+
+  @Test
+  public void addExistingReviewerByEmailShortCircuits() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    PushOneCommit.Result r = createChange();
+
+    AddReviewerInput input = new AddReviewerInput();
+    input.reviewer = "nonexisting@example.com";
+    input.state = ReviewerState.REVIEWER;
+
+    AddReviewerResult result = gApi.changes().id(r.getChangeId()).addReviewer(input);
+    assertThat(result.reviewers).hasSize(1);
+    ReviewerInfo info = result.reviewers.get(0);
+    assertThat(info._accountId).isNull();
+    assertThat(info.email).isEqualTo(input.reviewer);
+
+    assertThat(gApi.changes().id(r.getChangeId()).addReviewer(input).reviewers).isEmpty();
+  }
+
+  @Test
+  public void addExistingCcByEmailShortCircuits() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    PushOneCommit.Result r = createChange();
+
+    AddReviewerInput input = new AddReviewerInput();
+    input.reviewer = "nonexisting@example.com";
+    input.state = ReviewerState.CC;
+    AddReviewerResult result = gApi.changes().id(r.getChangeId()).addReviewer(input);
+
+    assertThat(result.ccs).hasSize(1);
+    AccountInfo info = result.ccs.get(0);
+    assertThat(info._accountId).isNull();
+    assertThat(info.email).isEqualTo(input.reviewer);
+
+    assertThat(gApi.changes().id(r.getChangeId()).addReviewer(input).ccs).isEmpty();
+  }
+
+  private static String toRfcAddressString(AccountInfo info) {
+    return (new Address(info.name, info.email)).toString();
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/ChangeReviewersIT.java b/javatests/com/google/gerrit/acceptance/rest/change/ChangeReviewersIT.java
new file mode 100644
index 0000000..d1f4d84
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/change/ChangeReviewersIT.java
@@ -0,0 +1,914 @@
+// 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.
+
+package com.google.gerrit.acceptance.rest.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static com.google.gerrit.extensions.client.ListChangesOption.DETAILED_LABELS;
+import static com.google.gerrit.extensions.client.ReviewerState.CC;
+import static com.google.gerrit.extensions.client.ReviewerState.REMOVED;
+import static com.google.gerrit.extensions.client.ReviewerState.REVIEWER;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
+import static javax.servlet.http.HttpServletResponse.SC_OK;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.acceptance.Sandboxed;
+import com.google.gerrit.acceptance.TestAccount;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.changes.AddReviewerInput;
+import com.google.gerrit.extensions.api.changes.AddReviewerResult;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.api.changes.NotifyInfo;
+import com.google.gerrit.extensions.api.changes.RecipientType;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.changes.ReviewResult;
+import com.google.gerrit.extensions.api.changes.ReviewerInfo;
+import com.google.gerrit.extensions.client.ReviewerState;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.ApprovalInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.LabelInfo;
+import com.google.gerrit.extensions.common.ReviewerUpdateInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.change.ReviewerAdder;
+import com.google.gerrit.testing.FakeEmailSender.Message;
+import com.google.gson.stream.JsonReader;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import org.junit.Test;
+
+public class ChangeReviewersIT extends AbstractDaemonTest {
+  @Test
+  public void addGroupAsReviewer() throws Exception {
+    // Set up two groups, one that is too large too add as reviewer, and one
+    // that is too large to add without confirmation.
+    String largeGroup = createGroup("largeGroup");
+    String mediumGroup = createGroup("mediumGroup");
+
+    int largeGroupSize = ReviewerAdder.DEFAULT_MAX_REVIEWERS + 1;
+    int mediumGroupSize = ReviewerAdder.DEFAULT_MAX_REVIEWERS_WITHOUT_CHECK + 1;
+    List<TestAccount> users = createAccounts(largeGroupSize, "addGroupAsReviewer");
+    List<String> largeGroupUsernames = new ArrayList<>(mediumGroupSize);
+    for (TestAccount u : users) {
+      largeGroupUsernames.add(u.username);
+    }
+    List<String> mediumGroupUsernames = largeGroupUsernames.subList(0, mediumGroupSize);
+    gApi.groups()
+        .id(largeGroup)
+        .addMembers(largeGroupUsernames.toArray(new String[largeGroupSize]));
+    gApi.groups()
+        .id(mediumGroup)
+        .addMembers(mediumGroupUsernames.toArray(new String[mediumGroupSize]));
+
+    // Attempt to add overly large group as reviewers.
+    PushOneCommit.Result r = createChange();
+    String changeId = r.getChangeId();
+    AddReviewerResult result = addReviewer(changeId, largeGroup);
+    assertThat(result.input).isEqualTo(largeGroup);
+    assertThat(result.confirm).isNull();
+    assertThat(result.error).contains("has too many members to add them all as reviewers");
+    assertThat(result.reviewers).isNull();
+
+    // Attempt to add medium group without confirmation.
+    result = addReviewer(changeId, mediumGroup);
+    assertThat(result.input).isEqualTo(mediumGroup);
+    assertThat(result.confirm).isTrue();
+    assertThat(result.error)
+        .contains("has " + mediumGroupSize + " members. Do you want to add them all as reviewers?");
+    assertThat(result.reviewers).isNull();
+
+    // Add medium group with confirmation.
+    AddReviewerInput in = new AddReviewerInput();
+    in.reviewer = mediumGroup;
+    in.confirmed = true;
+    result = addReviewer(changeId, in);
+    assertThat(result.input).isEqualTo(mediumGroup);
+    assertThat(result.confirm).isNull();
+    assertThat(result.error).isNull();
+    assertThat(result.reviewers).hasSize(mediumGroupSize);
+
+    // Verify that group members were added as reviewers.
+    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
+    assertReviewers(c, REVIEWER, users.subList(0, mediumGroupSize));
+  }
+
+  @Test
+  public void addCcAccount() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String changeId = r.getChangeId();
+    AddReviewerInput in = new AddReviewerInput();
+    in.reviewer = user.email;
+    in.state = CC;
+    AddReviewerResult result = addReviewer(changeId, in);
+
+    assertThat(result.input).isEqualTo(user.email);
+    assertThat(result.confirm).isNull();
+    assertThat(result.error).isNull();
+    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
+    if (notesMigration.readChanges()) {
+      assertThat(result.reviewers).isNull();
+      assertThat(result.ccs).hasSize(1);
+      AccountInfo ai = result.ccs.get(0);
+      assertThat(ai._accountId).isEqualTo(user.id.get());
+      assertReviewers(c, CC, user);
+    } else {
+      assertThat(result.ccs).isNull();
+      assertThat(result.reviewers).hasSize(1);
+      AccountInfo ai = result.reviewers.get(0);
+      assertThat(ai._accountId).isEqualTo(user.id.get());
+      assertReviewers(c, REVIEWER, user);
+    }
+
+    // Verify email was sent to CCed account.
+    List<Message> messages = sender.getMessages();
+    assertThat(messages).hasSize(1);
+    Message m = messages.get(0);
+    assertThat(m.rcpt()).containsExactly(user.emailAddress);
+    if (notesMigration.readChanges()) {
+      assertThat(m.body()).contains(admin.fullName + " has uploaded this change for review.");
+    } else {
+      assertThat(m.body()).contains("Hello " + user.fullName + ",\n");
+      assertThat(m.body()).contains("I'd like you to do a code review.");
+    }
+  }
+
+  @Test
+  public void addCcGroup() throws Exception {
+    List<TestAccount> users = createAccounts(6, "addCcGroup");
+    List<String> usernames = new ArrayList<>(6);
+    for (TestAccount u : users) {
+      usernames.add(u.username);
+    }
+
+    List<TestAccount> firstUsers = users.subList(0, 3);
+    List<String> firstUsernames = usernames.subList(0, 3);
+
+    PushOneCommit.Result r = createChange();
+    String changeId = r.getChangeId();
+    AddReviewerInput in = new AddReviewerInput();
+    in.reviewer = createGroup("cc1");
+    in.state = CC;
+    gApi.groups()
+        .id(in.reviewer)
+        .addMembers(firstUsernames.toArray(new String[firstUsernames.size()]));
+    AddReviewerResult result = addReviewer(changeId, in);
+
+    assertThat(result.input).isEqualTo(in.reviewer);
+    assertThat(result.confirm).isNull();
+    assertThat(result.error).isNull();
+    if (notesMigration.readChanges()) {
+      assertThat(result.reviewers).isNull();
+    } else {
+      assertThat(result.ccs).isNull();
+    }
+    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
+    if (notesMigration.readChanges()) {
+      assertReviewers(c, CC, firstUsers);
+    } else {
+      assertReviewers(c, REVIEWER, firstUsers);
+      assertReviewers(c, CC);
+    }
+
+    // Verify emails were sent to each of the group's accounts.
+    List<Message> messages = sender.getMessages();
+    assertThat(messages).hasSize(1);
+    Message m = messages.get(0);
+    List<Address> expectedAddresses = new ArrayList<>(firstUsers.size());
+    for (TestAccount u : firstUsers) {
+      expectedAddresses.add(u.emailAddress);
+    }
+    assertThat(m.rcpt()).containsExactlyElementsIn(expectedAddresses);
+
+    // CC a group that overlaps with some existing reviewers and CCed accounts.
+    TestAccount reviewer =
+        accountCreator.create(name("reviewer"), "addCcGroup-reviewer@example.com", "Reviewer");
+    result = addReviewer(changeId, reviewer.username);
+    assertThat(result.error).isNull();
+    sender.clear();
+    in.reviewer = createGroup("cc2");
+    gApi.groups().id(in.reviewer).addMembers(usernames.toArray(new String[usernames.size()]));
+    gApi.groups().id(in.reviewer).addMembers(reviewer.username);
+    result = addReviewer(changeId, in);
+    assertThat(result.input).isEqualTo(in.reviewer);
+    assertThat(result.confirm).isNull();
+    assertThat(result.error).isNull();
+    c = gApi.changes().id(r.getChangeId()).get();
+    if (notesMigration.readChanges()) {
+      assertThat(result.ccs).hasSize(3);
+      assertThat(result.reviewers).isNull();
+      assertReviewers(c, REVIEWER, reviewer);
+      assertReviewers(c, CC, users);
+    } else {
+      assertThat(result.ccs).isNull();
+      assertThat(result.reviewers).hasSize(3);
+      List<TestAccount> expectedUsers = new ArrayList<>(users.size() + 2);
+      expectedUsers.addAll(users);
+      expectedUsers.add(reviewer);
+      assertReviewers(c, REVIEWER, expectedUsers);
+    }
+
+    messages = sender.getMessages();
+    assertThat(messages).hasSize(1);
+    m = messages.get(0);
+    expectedAddresses = new ArrayList<>(4);
+    for (int i = 0; i < 3; i++) {
+      expectedAddresses.add(users.get(users.size() - i - 1).emailAddress);
+    }
+    if (!notesMigration.readChanges()) {
+      for (int i = 0; i < 3; i++) {
+        expectedAddresses.add(users.get(i).emailAddress);
+      }
+    }
+    expectedAddresses.add(reviewer.emailAddress);
+    assertThat(m.rcpt()).containsExactlyElementsIn(expectedAddresses);
+  }
+
+  @Test
+  public void transitionCcToReviewer() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String changeId = r.getChangeId();
+    AddReviewerInput in = new AddReviewerInput();
+    in.reviewer = user.email;
+    in.state = CC;
+    addReviewer(changeId, in);
+    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
+    if (notesMigration.readChanges()) {
+      assertReviewers(c, REVIEWER);
+      assertReviewers(c, CC, user);
+    } else {
+      assertReviewers(c, REVIEWER, user);
+      assertReviewers(c, CC);
+    }
+
+    in.state = REVIEWER;
+    addReviewer(changeId, in);
+    c = gApi.changes().id(r.getChangeId()).get();
+    assertReviewers(c, REVIEWER, user);
+    assertReviewers(c, CC);
+  }
+
+  @Test
+  public void driveByComment() throws Exception {
+    // Create change owned by admin.
+    PushOneCommit.Result r = createChange();
+
+    // Post drive-by message as user.
+    ReviewInput input = new ReviewInput().message("hello");
+    RestResponse resp =
+        userRestSession.post(
+            "/changes/" + r.getChangeId() + "/revisions/" + r.getCommit().getName() + "/review",
+            input);
+    ReviewResult result = readContentFromJson(resp, 200, ReviewResult.class);
+    assertThat(result.labels).isNull();
+    assertThat(result.reviewers).isNull();
+
+    // Verify user is added to CC list.
+    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
+    if (notesMigration.readChanges()) {
+      assertReviewers(c, REVIEWER);
+      assertReviewers(c, CC, user);
+    } else {
+      // If we aren't reading from NoteDb, the user will appear as a
+      // reviewer.
+      assertReviewers(c, REVIEWER, user);
+      assertReviewers(c, CC);
+    }
+  }
+
+  @Test
+  public void addSelfAsReviewer() throws Exception {
+    // Create change owned by admin.
+    PushOneCommit.Result r = createChange();
+
+    // user adds self as REVIEWER.
+    ReviewInput input = new ReviewInput().reviewer(user.username);
+    RestResponse resp =
+        userRestSession.post(
+            "/changes/" + r.getChangeId() + "/revisions/" + r.getCommit().getName() + "/review",
+            input);
+    ReviewResult result = readContentFromJson(resp, 200, ReviewResult.class);
+    assertThat(result.labels).isNull();
+    assertThat(result.reviewers).isNotNull();
+    assertThat(result.reviewers).hasSize(1);
+
+    // Verify reviewer state.
+    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
+    assertReviewers(c, REVIEWER, user);
+    assertReviewers(c, CC);
+    LabelInfo label = c.labels.get("Code-Review");
+    assertThat(label).isNotNull();
+    assertThat(label.all).isNotNull();
+    assertThat(label.all).hasSize(1);
+    ApprovalInfo approval = label.all.get(0);
+    assertThat(approval._accountId).isEqualTo(user.getId().get());
+  }
+
+  @Test
+  public void addSelfAsCc() throws Exception {
+    // Create change owned by admin.
+    PushOneCommit.Result r = createChange();
+
+    // user adds self as CC.
+    ReviewInput input = new ReviewInput().reviewer(user.username, CC, false);
+    RestResponse resp =
+        userRestSession.post(
+            "/changes/" + r.getChangeId() + "/revisions/" + r.getCommit().getName() + "/review",
+            input);
+    ReviewResult result = readContentFromJson(resp, 200, ReviewResult.class);
+    assertThat(result.labels).isNull();
+    assertThat(result.reviewers).isNotNull();
+    assertThat(result.reviewers).hasSize(1);
+
+    // Verify reviewer state.
+    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
+    if (notesMigration.readChanges()) {
+      assertReviewers(c, REVIEWER);
+      assertReviewers(c, CC, user);
+      // Verify no approvals were added.
+      assertThat(c.labels).isNotNull();
+      LabelInfo label = c.labels.get("Code-Review");
+      assertThat(label).isNotNull();
+      assertThat(label.all).isNull();
+    } else {
+      // When approvals are stored in ReviewDb, we still create a label for
+      // the reviewing user, and force them into the REVIEWER state.
+      assertReviewers(c, REVIEWER, user);
+      assertReviewers(c, CC);
+      LabelInfo label = c.labels.get("Code-Review");
+      assertThat(label).isNotNull();
+      assertThat(label.all).isNotNull();
+      assertThat(label.all).hasSize(1);
+      ApprovalInfo approval = label.all.get(0);
+      assertThat(approval._accountId).isEqualTo(user.getId().get());
+    }
+  }
+
+  @Test
+  public void reviewerReplyWithoutVote() throws Exception {
+    // Create change owned by admin.
+    PushOneCommit.Result r = createChange();
+
+    // Verify reviewer state.
+    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
+    assertReviewers(c, REVIEWER);
+    assertReviewers(c, CC);
+    LabelInfo label = c.labels.get("Code-Review");
+    assertThat(label).isNotNull();
+    assertThat(label.all).isNull();
+
+    // Add user as REVIEWER.
+    ReviewInput input = new ReviewInput().reviewer(user.username);
+    ReviewResult result = review(r.getChangeId(), r.getCommit().name(), input);
+    assertThat(result.labels).isNull();
+    assertThat(result.reviewers).isNotNull();
+    assertThat(result.reviewers).hasSize(1);
+
+    // Verify reviewer state. Both admin and user should be REVIEWERs now,
+    // because admin gets forced into REVIEWER state by virtue of being owner.
+    c = gApi.changes().id(r.getChangeId()).get();
+    assertReviewers(c, REVIEWER, admin, user);
+    assertReviewers(c, CC);
+    label = c.labels.get("Code-Review");
+    assertThat(label).isNotNull();
+    assertThat(label.all).isNotNull();
+    assertThat(label.all).hasSize(2);
+    Map<Integer, Integer> approvals = new HashMap<>();
+    for (ApprovalInfo approval : label.all) {
+      approvals.put(approval._accountId, approval.value);
+    }
+    assertThat(approvals).containsEntry(admin.getId().get(), 0);
+    assertThat(approvals).containsEntry(user.getId().get(), 0);
+
+    // Comment as user without voting. This should delete the approval and
+    // then replace it with the default value.
+    input = new ReviewInput().message("hello");
+    RestResponse resp =
+        userRestSession.post(
+            "/changes/" + r.getChangeId() + "/revisions/" + r.getCommit().getName() + "/review",
+            input);
+    result = readContentFromJson(resp, 200, ReviewResult.class);
+    assertThat(result.labels).isNull();
+
+    // Verify reviewer state.
+    c = gApi.changes().id(r.getChangeId()).get();
+    assertReviewers(c, REVIEWER, admin, user);
+    assertReviewers(c, CC);
+    label = c.labels.get("Code-Review");
+    assertThat(label).isNotNull();
+    assertThat(label.all).isNotNull();
+    assertThat(label.all).hasSize(2);
+    approvals.clear();
+    for (ApprovalInfo approval : label.all) {
+      approvals.put(approval._accountId, approval.value);
+    }
+    assertThat(approvals).containsEntry(admin.getId().get(), 0);
+    assertThat(approvals).containsEntry(user.getId().get(), 0);
+  }
+
+  @Test
+  public void reviewAndAddReviewers() throws Exception {
+    TestAccount observer = accountCreator.user2();
+    PushOneCommit.Result r = createChange();
+    ReviewInput input =
+        ReviewInput.approve().reviewer(user.email).reviewer(observer.email, CC, false);
+
+    ReviewResult result = review(r.getChangeId(), r.getCommit().name(), input);
+    assertThat(result.labels).isNotNull();
+    assertThat(result.reviewers).isNotNull();
+    assertThat(result.reviewers).hasSize(2);
+
+    // Verify reviewer and CC were added. If not in NoteDb read mode, both
+    // parties will be returned as CCed.
+    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
+    if (notesMigration.readChanges()) {
+      assertReviewers(c, REVIEWER, admin, user);
+      assertReviewers(c, CC, observer);
+    } else {
+      // In legacy mode, everyone should be a reviewer.
+      assertReviewers(c, REVIEWER, admin, user, observer);
+      assertReviewers(c, CC);
+    }
+
+    // Verify emails were sent to added reviewers.
+    List<Message> messages = sender.getMessages();
+    assertThat(messages).hasSize(2);
+
+    Message m = messages.get(0);
+    assertThat(m.rcpt()).containsExactly(user.emailAddress, observer.emailAddress);
+    assertThat(m.body()).contains(admin.fullName + " has posted comments on this change.");
+    assertThat(m.body()).contains("Change subject: " + PushOneCommit.SUBJECT + "\n");
+    assertThat(m.body()).contains("Patch Set 1: Code-Review+2");
+
+    m = messages.get(1);
+    assertThat(m.rcpt()).containsExactly(user.emailAddress, observer.emailAddress);
+    assertThat(m.body()).contains("Hello " + user.fullName + ",\n");
+    assertThat(m.body()).contains("I'd like you to do a code review.");
+  }
+
+  @Test
+  public void reviewAndAddGroupReviewers() throws Exception {
+    int largeGroupSize = ReviewerAdder.DEFAULT_MAX_REVIEWERS + 1;
+    int mediumGroupSize = ReviewerAdder.DEFAULT_MAX_REVIEWERS_WITHOUT_CHECK + 1;
+    List<TestAccount> users = createAccounts(largeGroupSize, "reviewAndAddGroupReviewers");
+    List<String> usernames = new ArrayList<>(largeGroupSize);
+    for (TestAccount u : users) {
+      usernames.add(u.username);
+    }
+
+    String largeGroup = createGroup("largeGroup");
+    String mediumGroup = createGroup("mediumGroup");
+    gApi.groups().id(largeGroup).addMembers(usernames.toArray(new String[largeGroupSize]));
+    gApi.groups()
+        .id(mediumGroup)
+        .addMembers(usernames.subList(0, mediumGroupSize).toArray(new String[mediumGroupSize]));
+
+    TestAccount observer = accountCreator.user2();
+    PushOneCommit.Result r = createChange();
+
+    // Attempt to add overly large group as reviewers.
+    ReviewInput input =
+        ReviewInput.approve()
+            .reviewer(user.email)
+            .reviewer(observer.email, CC, false)
+            .reviewer(largeGroup);
+    ReviewResult result = review(r.getChangeId(), r.getCommit().name(), input, SC_BAD_REQUEST);
+    assertThat(result.labels).isNull();
+    assertThat(result.reviewers).isNotNull();
+    assertThat(result.reviewers).hasSize(3);
+    AddReviewerResult reviewerResult = result.reviewers.get(largeGroup);
+    assertThat(reviewerResult).isNotNull();
+    assertThat(reviewerResult.confirm).isNull();
+    assertThat(reviewerResult.error).isNotNull();
+    assertThat(reviewerResult.error).contains("has too many members to add them all as reviewers");
+
+    // No labels should have changed, and no reviewers/CCs should have been added.
+    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
+    assertThat(c.messages).hasSize(1);
+    assertThat(c.reviewers.get(REVIEWER)).isNull();
+    assertThat(c.reviewers.get(CC)).isNull();
+
+    // Attempt to add group large enough to require confirmation, without
+    // confirmation, as reviewers.
+    input =
+        ReviewInput.approve()
+            .reviewer(user.email)
+            .reviewer(observer.email, CC, false)
+            .reviewer(mediumGroup);
+    result = review(r.getChangeId(), r.getCommit().name(), input, SC_BAD_REQUEST);
+    assertThat(result.labels).isNull();
+    assertThat(result.reviewers).isNotNull();
+    assertThat(result.reviewers).hasSize(3);
+    reviewerResult = result.reviewers.get(mediumGroup);
+    assertThat(reviewerResult).isNotNull();
+    assertThat(reviewerResult.confirm).isTrue();
+    assertThat(reviewerResult.error)
+        .contains("has " + mediumGroupSize + " members. Do you want to add them all as reviewers?");
+
+    // No labels should have changed, and no reviewers/CCs should have been added.
+    c = gApi.changes().id(r.getChangeId()).get();
+    assertThat(c.messages).hasSize(1);
+    assertThat(c.reviewers.get(REVIEWER)).isNull();
+    assertThat(c.reviewers.get(CC)).isNull();
+
+    // Retrying with confirmation should successfully approve and add reviewers/CCs.
+    input = ReviewInput.approve().reviewer(user.email).reviewer(mediumGroup, CC, true);
+    result = review(r.getChangeId(), r.getCommit().name(), input);
+    assertThat(result.labels).isNotNull();
+    assertThat(result.reviewers).isNotNull();
+    assertThat(result.reviewers).hasSize(2);
+
+    c = gApi.changes().id(r.getChangeId()).get();
+    assertThat(c.messages).hasSize(2);
+
+    if (notesMigration.readChanges()) {
+      assertReviewers(c, REVIEWER, admin, user);
+      assertReviewers(c, CC, users.subList(0, mediumGroupSize));
+    } else {
+      // If not in NoteDb mode, then everyone is a REVIEWER.
+      List<TestAccount> expected = users.subList(0, mediumGroupSize);
+      expected.add(admin);
+      expected.add(user);
+      assertReviewers(c, REVIEWER, expected);
+      assertReviewers(c, CC);
+    }
+  }
+
+  @Test
+  public void noteDbAddReviewerToReviewerChangeInfo() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    PushOneCommit.Result r = createChange();
+    String changeId = r.getChangeId();
+    AddReviewerInput in = new AddReviewerInput();
+    in.reviewer = user.email;
+    in.state = CC;
+    addReviewer(changeId, in);
+
+    in.state = REVIEWER;
+    addReviewer(changeId, in);
+
+    gApi.changes().id(changeId).current().review(ReviewInput.dislike());
+
+    setApiUser(user);
+    // NoteDb adds reviewer to a change on every review.
+    gApi.changes().id(changeId).current().review(ReviewInput.dislike());
+
+    deleteReviewer(changeId, user).assertNoContent();
+
+    ChangeInfo c = gApi.changes().id(changeId).get();
+    assertThat(c.reviewerUpdates).isNotNull();
+    assertThat(c.reviewerUpdates).hasSize(3);
+
+    Iterator<ReviewerUpdateInfo> it = c.reviewerUpdates.iterator();
+    ReviewerUpdateInfo reviewerChange = it.next();
+    assertThat(reviewerChange.state).isEqualTo(CC);
+    assertThat(reviewerChange.reviewer._accountId).isEqualTo(user.getId().get());
+    assertThat(reviewerChange.updatedBy._accountId).isEqualTo(admin.getId().get());
+
+    reviewerChange = it.next();
+    assertThat(reviewerChange.state).isEqualTo(REVIEWER);
+    assertThat(reviewerChange.reviewer._accountId).isEqualTo(user.getId().get());
+    assertThat(reviewerChange.updatedBy._accountId).isEqualTo(admin.getId().get());
+
+    reviewerChange = it.next();
+    assertThat(reviewerChange.state).isEqualTo(REMOVED);
+    assertThat(reviewerChange.reviewer._accountId).isEqualTo(user.getId().get());
+    assertThat(reviewerChange.updatedBy._accountId).isEqualTo(admin.getId().get());
+  }
+
+  @Test
+  public void addDuplicateReviewers() throws Exception {
+    PushOneCommit.Result r = createChange();
+    ReviewInput input = ReviewInput.approve().reviewer(user.email).reviewer(user.email);
+    ReviewResult result = review(r.getChangeId(), r.getCommit().name(), input);
+    assertThat(result.reviewers).isNotNull();
+    assertThat(result.reviewers).hasSize(1);
+    AddReviewerResult reviewerResult = result.reviewers.get(user.email);
+    assertThat(reviewerResult).isNotNull();
+    assertThat(reviewerResult.confirm).isNull();
+    assertThat(reviewerResult.error).isNull();
+  }
+
+  @Test
+  public void addOverlappingGroups() throws Exception {
+    String emailPrefix = "addOverlappingGroups-";
+    TestAccount user1 =
+        accountCreator.create(name("user1"), emailPrefix + "user1@example.com", "User1");
+    TestAccount user2 =
+        accountCreator.create(name("user2"), emailPrefix + "user2@example.com", "User2");
+    TestAccount user3 =
+        accountCreator.create(name("user3"), emailPrefix + "user3@example.com", "User3");
+    String group1 = createGroup("group1");
+    String group2 = createGroup("group2");
+    gApi.groups().id(group1).addMembers(user1.username, user2.username);
+    gApi.groups().id(group2).addMembers(user2.username, user3.username);
+
+    PushOneCommit.Result r = createChange();
+    ReviewInput input = ReviewInput.approve().reviewer(group1).reviewer(group2);
+    ReviewResult result = review(r.getChangeId(), r.getCommit().name(), input);
+    assertThat(result.reviewers).isNotNull();
+    assertThat(result.reviewers).hasSize(2);
+    AddReviewerResult reviewerResult = result.reviewers.get(group1);
+    assertThat(reviewerResult.error).isNull();
+    assertThat(reviewerResult.reviewers).hasSize(2);
+    reviewerResult = result.reviewers.get(group2);
+    assertThat(reviewerResult.error).isNull();
+    assertThat(reviewerResult.reviewers).hasSize(1);
+
+    // Repeat the above for CCs
+    if (!notesMigration.readChanges()) {
+      return;
+    }
+    r = createChange();
+    input = ReviewInput.approve().reviewer(group1, CC, false).reviewer(group2, CC, false);
+    result = review(r.getChangeId(), r.getCommit().name(), input);
+    assertThat(result.reviewers).isNotNull();
+    assertThat(result.reviewers).hasSize(2);
+    reviewerResult = result.reviewers.get(group1);
+    assertThat(reviewerResult.error).isNull();
+    assertThat(reviewerResult.ccs).hasSize(2);
+    reviewerResult = result.reviewers.get(group2);
+    assertThat(reviewerResult.error).isNull();
+    assertThat(reviewerResult.ccs).hasSize(1);
+
+    // Repeat again with one group REVIEWER, the other CC. The overlapping
+    // member should end up as a REVIEWER.
+    r = createChange();
+    input = ReviewInput.approve().reviewer(group1, REVIEWER, false).reviewer(group2, CC, false);
+    result = review(r.getChangeId(), r.getCommit().name(), input);
+    assertThat(result.reviewers).isNotNull();
+    assertThat(result.reviewers).hasSize(2);
+    reviewerResult = result.reviewers.get(group1);
+    assertThat(reviewerResult.error).isNull();
+    assertThat(reviewerResult.reviewers).hasSize(2);
+    reviewerResult = result.reviewers.get(group2);
+    assertThat(reviewerResult.error).isNull();
+    assertThat(reviewerResult.reviewers).isNull();
+    assertThat(reviewerResult.ccs).hasSize(1);
+  }
+
+  @Test
+  public void removingReviewerRemovesTheirVote() throws Exception {
+    String crLabel = "Code-Review";
+    PushOneCommit.Result r = createChange();
+    ReviewInput input = ReviewInput.approve().reviewer(admin.email);
+    ReviewResult addResult = review(r.getChangeId(), r.getCommit().name(), input);
+    assertThat(addResult.reviewers).isNotNull();
+    assertThat(addResult.reviewers).hasSize(1);
+
+    Map<String, LabelInfo> changeLabels = getChangeLabels(r.getChangeId());
+    assertThat(changeLabels.get(crLabel).all).hasSize(1);
+
+    RestResponse deleteResult = deleteReviewer(r.getChangeId(), admin);
+    deleteResult.assertNoContent();
+
+    changeLabels = getChangeLabels(r.getChangeId());
+    assertThat(changeLabels.get(crLabel).all).isNull();
+
+    // Check that the vote is gone even after the reviewer is added back
+    addReviewer(r.getChangeId(), admin.email);
+    changeLabels = getChangeLabels(r.getChangeId());
+    assertThat(changeLabels.get(crLabel).all).isNull();
+  }
+
+  @Test
+  public void notifyDetailsWorkOnPostReview() throws Exception {
+    PushOneCommit.Result r = createChange();
+    TestAccount userToNotify = createAccounts(1, "notify-details-post-review").get(0);
+
+    ReviewInput reviewInput = new ReviewInput();
+    reviewInput.reviewer(user.email, ReviewerState.REVIEWER, true);
+    reviewInput.notify = NotifyHandling.NONE;
+    reviewInput.notifyDetails =
+        ImmutableMap.of(RecipientType.TO, new NotifyInfo(ImmutableList.of(userToNotify.email)));
+
+    sender.clear();
+    gApi.changes().id(r.getChangeId()).current().review(reviewInput);
+    assertThat(sender.getMessages()).hasSize(1);
+    assertThat(sender.getMessages().get(0).rcpt()).containsExactly(userToNotify.emailAddress);
+  }
+
+  @Test
+  public void notifyDetailsWorkOnPostReviewers() throws Exception {
+    PushOneCommit.Result r = createChange();
+    TestAccount userToNotify = createAccounts(1, "notify-details-post-reviewers").get(0);
+
+    AddReviewerInput addReviewer = new AddReviewerInput();
+    addReviewer.reviewer = user.email;
+    addReviewer.notify = NotifyHandling.NONE;
+    addReviewer.notifyDetails =
+        ImmutableMap.of(RecipientType.TO, new NotifyInfo(ImmutableList.of(userToNotify.email)));
+
+    sender.clear();
+    gApi.changes().id(r.getChangeId()).addReviewer(addReviewer);
+    assertThat(sender.getMessages()).hasSize(1);
+    assertThat(sender.getMessages().get(0).rcpt()).containsExactly(userToNotify.emailAddress);
+  }
+
+  @Test
+  public void removeReviewerWithVoteWithoutPermissionFails() throws Exception {
+    PushOneCommit.Result r = createChange();
+    TestAccount newUser = createAccounts(1, name("foo")).get(0);
+
+    setApiUser(user);
+    gApi.changes().id(r.getChangeId()).current().review(new ReviewInput().label("Code-Review", 1));
+    setApiUser(newUser);
+    exception.expect(AuthException.class);
+    exception.expectMessage("remove reviewer not permitted");
+    gApi.changes().id(r.getChangeId()).reviewer(user.email).remove();
+  }
+
+  @Test
+  @Sandboxed
+  public void removeReviewerWithoutVoteWithPermissionSucceeds() throws Exception {
+    PushOneCommit.Result r = createChange();
+    // This test creates a new user so that it can explicitly check the REMOVE_REVIEWER permission
+    // rather than bypassing the check because of project or ref ownership.
+    TestAccount newUser = createAccounts(1, name("foo")).get(0);
+    grant(project, RefNames.REFS + "*", Permission.REMOVE_REVIEWER, false, REGISTERED_USERS);
+
+    gApi.changes().id(r.getChangeId()).addReviewer(user.email);
+    assertThatUserIsOnlyReviewer(r.getChangeId());
+    setApiUser(newUser);
+    gApi.changes().id(r.getChangeId()).reviewer(user.email).remove();
+    assertThat(gApi.changes().id(r.getChangeId()).get().reviewers).isEmpty();
+  }
+
+  @Test
+  public void removeReviewerWithoutVoteWithoutPermissionFails() throws Exception {
+    PushOneCommit.Result r = createChange();
+    TestAccount newUser = createAccounts(1, name("foo")).get(0);
+
+    gApi.changes().id(r.getChangeId()).addReviewer(user.email);
+    setApiUser(newUser);
+    exception.expect(AuthException.class);
+    exception.expectMessage("remove reviewer not permitted");
+    gApi.changes().id(r.getChangeId()).reviewer(user.email).remove();
+  }
+
+  @Test
+  public void removeCCWithoutPermissionFails() throws Exception {
+    PushOneCommit.Result r = createChange();
+    TestAccount newUser = createAccounts(1, name("foo")).get(0);
+
+    AddReviewerInput input = new AddReviewerInput();
+    input.reviewer = user.email;
+    input.state = ReviewerState.CC;
+    gApi.changes().id(r.getChangeId()).addReviewer(input);
+    setApiUser(newUser);
+    exception.expect(AuthException.class);
+    exception.expectMessage("remove reviewer not permitted");
+    gApi.changes().id(r.getChangeId()).reviewer(user.email).remove();
+  }
+
+  @Test
+  public void addExistingReviewerShortCircuits() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    PushOneCommit.Result r = createChange();
+
+    AddReviewerInput input = new AddReviewerInput();
+    input.reviewer = user.email;
+    input.state = ReviewerState.REVIEWER;
+
+    AddReviewerResult result = gApi.changes().id(r.getChangeId()).addReviewer(input);
+    assertThat(result.reviewers).hasSize(1);
+    ReviewerInfo info = result.reviewers.get(0);
+    assertThat(info._accountId).isEqualTo(user.id.get());
+
+    assertThat(gApi.changes().id(r.getChangeId()).addReviewer(input).reviewers).isEmpty();
+  }
+
+  @Test
+  public void addExistingCcShortCircuits() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    PushOneCommit.Result r = createChange();
+
+    AddReviewerInput input = new AddReviewerInput();
+    input.reviewer = user.email;
+    input.state = ReviewerState.CC;
+
+    AddReviewerResult result = gApi.changes().id(r.getChangeId()).addReviewer(input);
+    assertThat(result.ccs).hasSize(1);
+    AccountInfo info = result.ccs.get(0);
+    assertThat(info._accountId).isEqualTo(user.id.get());
+
+    assertThat(gApi.changes().id(r.getChangeId()).addReviewer(input).ccs).isEmpty();
+  }
+
+  private void assertThatUserIsOnlyReviewer(String changeId) throws Exception {
+    AccountInfo userInfo = new AccountInfo(user.fullName, user.emailAddress.getEmail());
+    userInfo._accountId = user.id.get();
+    userInfo.username = user.username;
+    assertThat(gApi.changes().id(changeId).get().reviewers)
+        .containsExactly(ReviewerState.REVIEWER, ImmutableList.of(userInfo));
+  }
+
+  private AddReviewerResult addReviewer(String changeId, String reviewer) throws Exception {
+    return addReviewer(changeId, reviewer, SC_OK);
+  }
+
+  private AddReviewerResult addReviewer(String changeId, String reviewer, int expectedStatus)
+      throws Exception {
+    AddReviewerInput in = new AddReviewerInput();
+    in.reviewer = reviewer;
+    return addReviewer(changeId, in, expectedStatus);
+  }
+
+  private AddReviewerResult addReviewer(String changeId, AddReviewerInput in) throws Exception {
+    return addReviewer(changeId, in, SC_OK);
+  }
+
+  private AddReviewerResult addReviewer(String changeId, AddReviewerInput in, int expectedStatus)
+      throws Exception {
+    RestResponse resp = adminRestSession.post("/changes/" + changeId + "/reviewers", in);
+    return readContentFromJson(resp, expectedStatus, AddReviewerResult.class);
+  }
+
+  private RestResponse deleteReviewer(String changeId, TestAccount account) throws Exception {
+    return adminRestSession.delete("/changes/" + changeId + "/reviewers/" + account.getId().get());
+  }
+
+  private ReviewResult review(String changeId, String revisionId, ReviewInput in) throws Exception {
+    return review(changeId, revisionId, in, SC_OK);
+  }
+
+  private ReviewResult review(
+      String changeId, String revisionId, ReviewInput in, int expectedStatus) throws Exception {
+    RestResponse resp =
+        adminRestSession.post("/changes/" + changeId + "/revisions/" + revisionId + "/review", in);
+    return readContentFromJson(resp, expectedStatus, ReviewResult.class);
+  }
+
+  private static <T> T readContentFromJson(RestResponse r, int expectedStatus, Class<T> clazz)
+      throws Exception {
+    r.assertStatus(expectedStatus);
+    try (JsonReader jsonReader = new JsonReader(r.getReader())) {
+      jsonReader.setLenient(true);
+      return newGson().fromJson(jsonReader, clazz);
+    }
+  }
+
+  private static void assertReviewers(
+      ChangeInfo c, ReviewerState reviewerState, TestAccount... accounts) throws Exception {
+    List<TestAccount> accountList = new ArrayList<>(accounts.length);
+    Collections.addAll(accountList, accounts);
+    assertReviewers(c, reviewerState, accountList);
+  }
+
+  private static void assertReviewers(
+      ChangeInfo c, ReviewerState reviewerState, Iterable<TestAccount> accounts) throws Exception {
+    Collection<AccountInfo> actualAccounts = c.reviewers.get(reviewerState);
+    if (actualAccounts == null) {
+      assertThat(accounts.iterator().hasNext()).isFalse();
+      return;
+    }
+    assertThat(actualAccounts).isNotNull();
+    List<Integer> actualAccountIds = new ArrayList<>(actualAccounts.size());
+    for (AccountInfo account : actualAccounts) {
+      actualAccountIds.add(account._accountId);
+    }
+    List<Integer> expectedAccountIds = new ArrayList<>();
+    for (TestAccount account : accounts) {
+      expectedAccountIds.add(account.getId().get());
+    }
+    assertThat(actualAccountIds).containsExactlyElementsIn(expectedAccountIds);
+  }
+
+  private List<TestAccount> createAccounts(int n, String emailPrefix) throws Exception {
+    List<TestAccount> result = new ArrayList<>(n);
+    for (int i = 0; i < n; i++) {
+      result.add(
+          accountCreator.create(
+              name("u" + i), emailPrefix + "-" + i + "@example.com", "Full Name " + i));
+    }
+    return result;
+  }
+
+  private Map<String, LabelInfo> getChangeLabels(String changeId) throws Exception {
+    return gApi.changes().id(changeId).get(DETAILED_LABELS).labels;
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/ConfigChangeIT.java b/javatests/com/google/gerrit/acceptance/rest/change/ConfigChangeIT.java
new file mode 100644
index 0000000..baf56de
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/change/ConfigChangeIT.java
@@ -0,0 +1,203 @@
+// 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.
+
+package com.google.gerrit.acceptance.rest.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.GitUtil;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.TestProjectInput;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.projects.ProjectInput;
+import com.google.gerrit.extensions.client.ChangeStatus;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.project.testing.Util;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectLoader;
+import org.eclipse.jgit.revwalk.RevObject;
+import org.eclipse.jgit.revwalk.RevTree;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.RefSpec;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ConfigChangeIT extends AbstractDaemonTest {
+  @Before
+  public void setUp() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      Util.allow(u.getConfig(), Permission.OWNER, REGISTERED_USERS, "refs/*");
+      Util.allow(u.getConfig(), Permission.PUSH, REGISTERED_USERS, "refs/for/refs/meta/config");
+      Util.allow(u.getConfig(), Permission.SUBMIT, REGISTERED_USERS, RefNames.REFS_CONFIG);
+      u.save();
+    }
+
+    setApiUser(user);
+    fetchRefsMetaConfig();
+  }
+
+  @Test
+  @TestProjectInput(cloneAs = "user")
+  public void updateProjectConfig() throws Exception {
+    String id = testUpdateProjectConfig();
+    assertThat(gApi.changes().id(id).get().revisions).hasSize(1);
+  }
+
+  @Test
+  @TestProjectInput(cloneAs = "user", submitType = SubmitType.CHERRY_PICK)
+  public void updateProjectConfigWithCherryPick() throws Exception {
+    String id = testUpdateProjectConfig();
+    assertThat(gApi.changes().id(id).get().revisions).hasSize(2);
+  }
+
+  private String testUpdateProjectConfig() throws Exception {
+    Config cfg = readProjectConfig();
+    assertThat(cfg.getString("project", null, "description")).isNull();
+    String desc = "new project description";
+    cfg.setString("project", null, "description", desc);
+
+    PushOneCommit.Result r = createConfigChange(cfg);
+    String id = r.getChangeId();
+
+    gApi.changes().id(id).current().review(ReviewInput.approve());
+    gApi.changes().id(id).current().submit();
+
+    assertThat(gApi.changes().id(id).info().status).isEqualTo(ChangeStatus.MERGED);
+    assertThat(gApi.projects().name(project.get()).get().description).isEqualTo(desc);
+    fetchRefsMetaConfig();
+    assertThat(readProjectConfig().getString("project", null, "description")).isEqualTo(desc);
+    String changeRev = gApi.changes().id(id).get().currentRevision;
+    String branchRev =
+        gApi.projects().name(project.get()).branch(RefNames.REFS_CONFIG).get().revision;
+    assertThat(changeRev).isEqualTo(branchRev);
+    return id;
+  }
+
+  @Test
+  @TestProjectInput(cloneAs = "user")
+  public void onlyAdminMayUpdateProjectParent() throws Exception {
+    setApiUser(admin);
+    ProjectInput parent = new ProjectInput();
+    parent.name = name("parent");
+    parent.permissionsOnly = true;
+    gApi.projects().create(parent);
+
+    setApiUser(user);
+    Config cfg = readProjectConfig();
+    assertThat(cfg.getString("access", null, "inheritFrom")).isAnyOf(null, allProjects.get());
+    cfg.setString("access", null, "inheritFrom", parent.name);
+
+    PushOneCommit.Result r = createConfigChange(cfg);
+    String id = r.getChangeId();
+
+    gApi.changes().id(id).current().review(ReviewInput.approve());
+    try {
+      gApi.changes().id(id).current().submit();
+      fail("expected submit to fail");
+    } catch (ResourceConflictException e) {
+      int n = gApi.changes().id(id).info()._number;
+      assertThat(e)
+          .hasMessageThat()
+          .isEqualTo(
+              "Failed to submit 1 change due to the following problems:\n"
+                  + "Change "
+                  + n
+                  + ": Change contains a project configuration that"
+                  + " changes the parent project.\n"
+                  + "The change must be submitted by a Gerrit administrator.");
+    }
+
+    assertThat(gApi.projects().name(project.get()).get().parent).isEqualTo(allProjects.get());
+    fetchRefsMetaConfig();
+    assertThat(readProjectConfig().getString("access", null, "inheritFrom"))
+        .isAnyOf(null, allProjects.get());
+
+    setApiUser(admin);
+    gApi.changes().id(id).current().submit();
+    assertThat(gApi.changes().id(id).info().status).isEqualTo(ChangeStatus.MERGED);
+    assertThat(gApi.projects().name(project.get()).get().parent).isEqualTo(parent.name);
+    fetchRefsMetaConfig();
+    assertThat(readProjectConfig().getString("access", null, "inheritFrom")).isEqualTo(parent.name);
+  }
+
+  @Test
+  public void rejectDoubleInheritance() throws Exception {
+    setApiUser(admin);
+    // Create separate projects to test the config
+    Project.NameKey parent = createProject("projectToInheritFrom");
+    Project.NameKey child = createProject("projectWithMalformedConfig");
+
+    String config =
+        gApi.projects()
+            .name(child.get())
+            .branch(RefNames.REFS_CONFIG)
+            .file("project.config")
+            .asString();
+
+    // Append and push malformed project config
+    String pattern = "[access]\n\tinheritFrom = " + allProjects.get() + "\n";
+    String doubleInherit = pattern + "\tinheritFrom = " + parent.get() + "\n";
+    config = config.replace(pattern, doubleInherit);
+
+    TestRepository<InMemoryRepository> childRepo = cloneProject(child, admin);
+    // Fetch meta ref
+    GitUtil.fetch(childRepo, RefNames.REFS_CONFIG + ":cfg");
+    childRepo.reset("cfg");
+    PushOneCommit push =
+        pushFactory.create(db, admin.getIdent(), childRepo, "Subject", "project.config", config);
+    PushOneCommit.Result res = push.to(RefNames.REFS_CONFIG);
+    res.assertErrorStatus();
+    res.assertMessage("cannot inherit from multiple projects");
+  }
+
+  private void fetchRefsMetaConfig() throws Exception {
+    git().fetch().setRefSpecs(new RefSpec("refs/meta/config:refs/meta/config")).call();
+    testRepo.reset(RefNames.REFS_CONFIG);
+  }
+
+  private Config readProjectConfig() throws Exception {
+    RevWalk rw = testRepo.getRevWalk();
+    RevTree tree = rw.parseTree(testRepo.getRepository().resolve("HEAD"));
+    RevObject obj = rw.parseAny(testRepo.get(tree, "project.config"));
+    ObjectLoader loader = rw.getObjectReader().open(obj);
+    String text = new String(loader.getCachedBytes(), UTF_8);
+    Config cfg = new Config();
+    cfg.fromText(text);
+    return cfg;
+  }
+
+  private PushOneCommit.Result createConfigChange(Config cfg) throws Exception {
+    PushOneCommit.Result r =
+        pushFactory
+            .create(
+                db,
+                user.getIdent(),
+                testRepo,
+                "Update project config",
+                "project.config",
+                cfg.toText())
+            .to("refs/for/refs/meta/config");
+    r.assertOkStatus();
+    return r;
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/CorsIT.java b/javatests/com/google/gerrit/acceptance/rest/change/CorsIT.java
new file mode 100644
index 0000000..0af9708
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/change/CorsIT.java
@@ -0,0 +1,291 @@
+// 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.
+
+package com.google.gerrit.acceptance.rest.change;
+
+import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS;
+import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS;
+import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS;
+import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN;
+import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_MAX_AGE;
+import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_REQUEST_HEADERS;
+import static com.google.common.net.HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD;
+import static com.google.common.net.HttpHeaders.AUTHORIZATION;
+import static com.google.common.net.HttpHeaders.CONTENT_TYPE;
+import static com.google.common.net.HttpHeaders.ORIGIN;
+import static com.google.common.net.HttpHeaders.VARY;
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.base.Splitter;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.truth.StringSubject;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.PushOneCommit.Result;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.server.UrlEncoded;
+import com.google.gerrit.testing.ConfigSuite;
+import java.nio.charset.StandardCharsets;
+import java.util.Locale;
+import java.util.stream.Stream;
+import org.apache.http.Header;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.fluent.Executor;
+import org.apache.http.client.fluent.Request;
+import org.apache.http.cookie.Cookie;
+import org.apache.http.impl.client.BasicCookieStore;
+import org.apache.http.message.BasicHeader;
+import org.eclipse.jgit.lib.Config;
+import org.junit.Test;
+
+public class CorsIT extends AbstractDaemonTest {
+  @ConfigSuite.Default
+  public static Config allowExampleDotCom() {
+    Config cfg = new Config();
+    cfg.setString("auth", null, "type", "DEVELOPMENT_BECOME_ANY_ACCOUNT");
+    cfg.setStringList(
+        "site",
+        null,
+        "allowOriginRegex",
+        ImmutableList.of("https?://(.+[.])?example[.]com", "http://friend[.]ly"));
+    return cfg;
+  }
+
+  @Test
+  public void missingOriginIsAllowedWithNoCorsResponseHeaders() throws Exception {
+    Result change = createChange();
+    String url = "/changes/" + change.getChangeId() + "/detail";
+    RestResponse r = adminRestSession.get(url);
+    r.assertOK();
+
+    String allowOrigin = r.getHeader(ACCESS_CONTROL_ALLOW_ORIGIN);
+    String allowCred = r.getHeader(ACCESS_CONTROL_ALLOW_CREDENTIALS);
+    String maxAge = r.getHeader(ACCESS_CONTROL_MAX_AGE);
+    String allowMethods = r.getHeader(ACCESS_CONTROL_ALLOW_METHODS);
+    String allowHeaders = r.getHeader(ACCESS_CONTROL_ALLOW_HEADERS);
+
+    assertThat(allowOrigin).named(ACCESS_CONTROL_ALLOW_ORIGIN).isNull();
+    assertThat(allowCred).named(ACCESS_CONTROL_ALLOW_CREDENTIALS).isNull();
+    assertThat(maxAge).named(ACCESS_CONTROL_MAX_AGE).isNull();
+    assertThat(allowMethods).named(ACCESS_CONTROL_ALLOW_METHODS).isNull();
+    assertThat(allowHeaders).named(ACCESS_CONTROL_ALLOW_HEADERS).isNull();
+  }
+
+  @Test
+  public void origins() throws Exception {
+    Result change = createChange();
+    String url = "/changes/" + change.getChangeId() + "/detail";
+
+    check(url, true, "http://example.com");
+    check(url, true, "https://sub.example.com");
+    check(url, true, "http://friend.ly");
+
+    check(url, false, "http://evil.attacker");
+    check(url, false, "http://friendsly");
+  }
+
+  @Test
+  public void putWithServerOriginAcceptedWithNoCorsResponseHeaders() throws Exception {
+    Result change = createChange();
+    String origin = adminRestSession.url();
+    RestResponse r =
+        adminRestSession.putWithHeader(
+            "/changes/" + change.getChangeId() + "/topic", new BasicHeader(ORIGIN, origin), "A");
+    r.assertOK();
+    checkCors(r, false, origin);
+    checkTopic(change, "A");
+  }
+
+  @Test
+  public void putWithOtherOriginAccepted() throws Exception {
+    Result change = createChange();
+    String origin = "http://example.com";
+    RestResponse r =
+        adminRestSession.putWithHeader(
+            "/changes/" + change.getChangeId() + "/topic", new BasicHeader(ORIGIN, origin), "A");
+    r.assertOK();
+    checkCors(r, true, origin);
+  }
+
+  @Test
+  public void preflightOk() throws Exception {
+    Result change = createChange();
+
+    String origin = "http://example.com";
+    Request req =
+        Request.Options(adminRestSession.url() + "/a/changes/" + change.getChangeId() + "/detail");
+    req.addHeader(ORIGIN, origin);
+    req.addHeader(ACCESS_CONTROL_REQUEST_METHOD, "GET");
+    req.addHeader(ACCESS_CONTROL_REQUEST_HEADERS, "X-Requested-With");
+
+    RestResponse res = adminRestSession.execute(req);
+    res.assertOK();
+
+    String vary = res.getHeader(VARY);
+    assertThat(vary).named(VARY).isNotNull();
+    assertThat(Splitter.on(", ").splitToList(vary))
+        .containsExactly(ORIGIN, ACCESS_CONTROL_REQUEST_METHOD, ACCESS_CONTROL_REQUEST_HEADERS);
+    checkCors(res, true, origin);
+  }
+
+  @Test
+  public void preflightBadOrigin() throws Exception {
+    Result change = createChange();
+    Request req =
+        Request.Options(adminRestSession.url() + "/a/changes/" + change.getChangeId() + "/detail");
+    req.addHeader(ORIGIN, "http://evil.attacker");
+    req.addHeader(ACCESS_CONTROL_REQUEST_METHOD, "GET");
+    adminRestSession.execute(req).assertBadRequest();
+  }
+
+  @Test
+  public void preflightBadMethod() throws Exception {
+    Result change = createChange();
+    Request req =
+        Request.Options(adminRestSession.url() + "/a/changes/" + change.getChangeId() + "/detail");
+    req.addHeader(ORIGIN, "http://example.com");
+    req.addHeader(ACCESS_CONTROL_REQUEST_METHOD, "CALL");
+    adminRestSession.execute(req).assertBadRequest();
+  }
+
+  @Test
+  public void preflightBadHeader() throws Exception {
+    Result change = createChange();
+    Request req =
+        Request.Options(adminRestSession.url() + "/a/changes/" + change.getChangeId() + "/detail");
+    req.addHeader(ORIGIN, "http://example.com");
+    req.addHeader(ACCESS_CONTROL_REQUEST_METHOD, "GET");
+    req.addHeader(ACCESS_CONTROL_REQUEST_HEADERS, "X-Secret-Auth-Token");
+    adminRestSession.execute(req).assertBadRequest();
+  }
+
+  @Test
+  public void crossDomainPutTopic() throws Exception {
+    Result change = createChange();
+    BasicCookieStore cookies = new BasicCookieStore();
+    Executor http = Executor.newInstance().cookieStore(cookies);
+
+    Request req = Request.Get(canonicalWebUrl.get() + "/login/?account_id=" + admin.id.get());
+    http.execute(req);
+    String auth = null;
+    for (Cookie c : cookies.getCookies()) {
+      if ("GerritAccount".equals(c.getName())) {
+        auth = c.getValue();
+      }
+    }
+    assertThat(auth).named("GerritAccount cookie").isNotNull();
+    cookies.clear();
+
+    UrlEncoded url =
+        new UrlEncoded(canonicalWebUrl.get() + "/changes/" + change.getChangeId() + "/topic");
+    url.put("$m", "PUT");
+    url.put("$ct", "application/json; charset=US-ASCII");
+    url.put("access_token", auth);
+
+    String origin = "http://example.com";
+    req = Request.Post(url.toString());
+    req.setHeader(CONTENT_TYPE, "text/plain");
+    req.setHeader(ORIGIN, origin);
+    req.bodyByteArray("{\"topic\":\"test-xd\"}".getBytes(StandardCharsets.US_ASCII));
+
+    HttpResponse r = http.execute(req).returnResponse();
+    assertThat(r.getStatusLine().getStatusCode()).isEqualTo(200);
+
+    Header vary = r.getFirstHeader(VARY);
+    assertThat(vary).named(VARY).isNotNull();
+    assertThat(Splitter.on(", ").splitToList(vary.getValue())).named(VARY).contains(ORIGIN);
+
+    Header allowOrigin = r.getFirstHeader(ACCESS_CONTROL_ALLOW_ORIGIN);
+    assertThat(allowOrigin).named(ACCESS_CONTROL_ALLOW_ORIGIN).isNotNull();
+    assertThat(allowOrigin.getValue()).named(ACCESS_CONTROL_ALLOW_ORIGIN).isEqualTo(origin);
+
+    Header allowAuth = r.getFirstHeader(ACCESS_CONTROL_ALLOW_CREDENTIALS);
+    assertThat(allowAuth).named(ACCESS_CONTROL_ALLOW_CREDENTIALS).isNotNull();
+    assertThat(allowAuth.getValue()).named(ACCESS_CONTROL_ALLOW_CREDENTIALS).isEqualTo("true");
+
+    checkTopic(change, "test-xd");
+  }
+
+  @Test
+  public void crossDomainRejectsBadOrigin() throws Exception {
+    Result change = createChange();
+    UrlEncoded url =
+        new UrlEncoded(canonicalWebUrl.get() + "/changes/" + change.getChangeId() + "/topic");
+    url.put("$m", "PUT");
+    url.put("$ct", "application/json; charset=US-ASCII");
+
+    Request req = Request.Post(url.toString());
+    req.setHeader(CONTENT_TYPE, "text/plain");
+    req.setHeader(ORIGIN, "http://evil.attacker");
+    req.bodyByteArray("{\"topic\":\"test-xd\"}".getBytes(StandardCharsets.US_ASCII));
+    adminRestSession.execute(req).assertBadRequest();
+    checkTopic(change, null);
+  }
+
+  private void checkTopic(Result change, @Nullable String topic) throws RestApiException {
+    ChangeInfo info = gApi.changes().id(change.getChangeId()).get();
+    StringSubject t = assertThat(info.topic).named("topic");
+    if (topic != null) {
+      t.isEqualTo(topic);
+    } else {
+      t.isNull();
+    }
+  }
+
+  private void check(String url, boolean accept, String origin) throws Exception {
+    Header hdr = new BasicHeader(ORIGIN, origin);
+    RestResponse r = adminRestSession.getWithHeader(url, hdr);
+    r.assertOK();
+    checkCors(r, accept, origin);
+  }
+
+  private void checkCors(RestResponse r, boolean accept, String origin) {
+    String vary = r.getHeader(VARY);
+    assertThat(vary).named(VARY).isNotNull();
+    assertThat(Splitter.on(", ").splitToList(vary)).named(VARY).contains(ORIGIN);
+
+    String allowOrigin = r.getHeader(ACCESS_CONTROL_ALLOW_ORIGIN);
+    String allowCred = r.getHeader(ACCESS_CONTROL_ALLOW_CREDENTIALS);
+    String maxAge = r.getHeader(ACCESS_CONTROL_MAX_AGE);
+    String allowMethods = r.getHeader(ACCESS_CONTROL_ALLOW_METHODS);
+    String allowHeaders = r.getHeader(ACCESS_CONTROL_ALLOW_HEADERS);
+    if (accept) {
+      assertThat(allowOrigin).named(ACCESS_CONTROL_ALLOW_ORIGIN).isEqualTo(origin);
+      assertThat(allowCred).named(ACCESS_CONTROL_ALLOW_CREDENTIALS).isEqualTo("true");
+      assertThat(maxAge).named(ACCESS_CONTROL_MAX_AGE).isEqualTo("600");
+
+      assertThat(allowMethods).named(ACCESS_CONTROL_ALLOW_METHODS).isNotNull();
+      assertThat(Splitter.on(", ").splitToList(allowMethods))
+          .named(ACCESS_CONTROL_ALLOW_METHODS)
+          .containsExactly("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS");
+
+      assertThat(allowHeaders).named(ACCESS_CONTROL_ALLOW_HEADERS).isNotNull();
+      assertThat(Splitter.on(", ").splitToList(allowHeaders))
+          .named(ACCESS_CONTROL_ALLOW_HEADERS)
+          .containsExactlyElementsIn(
+              Stream.of(AUTHORIZATION, CONTENT_TYPE, "X-Gerrit-Auth", "X-Requested-With")
+                  .map(s -> s.toLowerCase(Locale.US))
+                  .collect(ImmutableSet.toImmutableSet()));
+    } else {
+      assertThat(allowOrigin).named(ACCESS_CONTROL_ALLOW_ORIGIN).isNull();
+      assertThat(allowCred).named(ACCESS_CONTROL_ALLOW_CREDENTIALS).isNull();
+      assertThat(maxAge).named(ACCESS_CONTROL_MAX_AGE).isNull();
+      assertThat(allowMethods).named(ACCESS_CONTROL_ALLOW_METHODS).isNull();
+      assertThat(allowHeaders).named(ACCESS_CONTROL_ALLOW_HEADERS).isNull();
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/CreateChangeIT.java b/javatests/com/google/gerrit/acceptance/rest/change/CreateChangeIT.java
new file mode 100644
index 0000000..9218336
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/change/CreateChangeIT.java
@@ -0,0 +1,566 @@
+// Copyright (C) 2014 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.google.gerrit.acceptance.rest.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static com.google.gerrit.common.data.Permission.READ;
+import static com.google.gerrit.reviewdb.client.RefNames.changeMetaRef;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.eclipse.jgit.lib.Constants.SIGNED_OFF_BY_TAG;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableMap;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.PushOneCommit.Result;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.extensions.api.changes.ChangeApi;
+import com.google.gerrit.extensions.api.changes.CherryPickInput;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.projects.BranchInput;
+import com.google.gerrit.extensions.client.ChangeStatus;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.ChangeInput;
+import com.google.gerrit.extensions.common.ChangeMessageInfo;
+import com.google.gerrit.extensions.common.CommitInfo;
+import com.google.gerrit.extensions.common.MergeInput;
+import com.google.gerrit.extensions.common.RevisionInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.submit.ChangeAlreadyMergedException;
+import com.google.gerrit.testing.FakeEmailSender.Message;
+import com.google.gerrit.testing.TestTimeUtil;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.RefSpec;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class CreateChangeIT extends AbstractDaemonTest {
+  @BeforeClass
+  public static void setTimeForTesting() {
+    TestTimeUtil.resetWithClockStep(1, SECONDS);
+  }
+
+  @AfterClass
+  public static void restoreTime() {
+    TestTimeUtil.useSystemTime();
+  }
+
+  @Test
+  public void createEmptyChange_MissingBranch() throws Exception {
+    ChangeInput ci = new ChangeInput();
+    ci.project = project.get();
+    assertCreateFails(ci, BadRequestException.class, "branch must be non-empty");
+  }
+
+  @Test
+  public void createEmptyChange_MissingMessage() throws Exception {
+    ChangeInput ci = new ChangeInput();
+    ci.project = project.get();
+    ci.branch = "master";
+    assertCreateFails(ci, BadRequestException.class, "commit message must be non-empty");
+  }
+
+  @Test
+  public void createEmptyChange_InvalidStatus() throws Exception {
+    ChangeInput ci = newChangeInput(ChangeStatus.MERGED);
+    assertCreateFails(ci, BadRequestException.class, "unsupported change status");
+  }
+
+  @Test
+  public void createEmptyChange_InvalidChangeId() throws Exception {
+    ChangeInput ci = newChangeInput(ChangeStatus.NEW);
+    ci.subject = "Subject\n\nChange-Id: I0000000000000000000000000000000000000000";
+    assertCreateFails(
+        ci, ResourceConflictException.class, "invalid Change-Id line format in message footer");
+  }
+
+  @Test
+  public void createEmptyChange_InvalidSubject() throws Exception {
+    ChangeInput ci = newChangeInput(ChangeStatus.NEW);
+    ci.subject = "Change-Id: I1234000000000000000000000000000000000000";
+    assertCreateFails(
+        ci,
+        ResourceConflictException.class,
+        "missing subject; Change-Id must be in message footer");
+  }
+
+  @Test
+  public void createNewChange_InvalidCommentInCommitMessage() throws Exception {
+    ChangeInput ci = newChangeInput(ChangeStatus.NEW);
+    ci.subject = "#12345 Test";
+    assertCreateFails(ci, BadRequestException.class, "commit message must be non-empty");
+  }
+
+  @Test
+  public void createNewChange() throws Exception {
+    ChangeInfo info = assertCreateSucceeds(newChangeInput(ChangeStatus.NEW));
+    assertThat(info.revisions.get(info.currentRevision).commit.message)
+        .contains("Change-Id: " + info.changeId);
+  }
+
+  @Test
+  public void createNewChangeWithCommentsInCommitMessage() throws Exception {
+    ChangeInput ci = newChangeInput(ChangeStatus.NEW);
+    ci.subject += "\n# Comment line";
+    ChangeInfo info = gApi.changes().create(ci).get();
+    assertThat(info.revisions.get(info.currentRevision).commit.message)
+        .doesNotContain("# Comment line");
+  }
+
+  @Test
+  public void createNewChangeWithChangeId() throws Exception {
+    ChangeInput ci = newChangeInput(ChangeStatus.NEW);
+    String changeId = "I1234000000000000000000000000000000000000";
+    String changeIdLine = "Change-Id: " + changeId;
+    ci.subject = "Subject\n\n" + changeIdLine;
+    ChangeInfo info = assertCreateSucceeds(ci);
+    assertThat(info.changeId).isEqualTo(changeId);
+    assertThat(info.revisions.get(info.currentRevision).commit.message).contains(changeIdLine);
+  }
+
+  @Test
+  public void notificationsOnChangeCreation() throws Exception {
+    setApiUser(user);
+    watch(project.get());
+
+    // check that watcher is notified
+    setApiUser(admin);
+    assertCreateSucceeds(newChangeInput(ChangeStatus.NEW));
+
+    List<Message> messages = sender.getMessages();
+    assertThat(messages).hasSize(1);
+    Message m = messages.get(0);
+    assertThat(m.rcpt()).containsExactly(user.emailAddress);
+    assertThat(m.body()).contains(admin.fullName + " has uploaded this change for review.");
+
+    // check that watcher is not notified if notify=NONE
+    sender.clear();
+    ChangeInput input = newChangeInput(ChangeStatus.NEW);
+    input.notify = NotifyHandling.NONE;
+    assertCreateSucceeds(input);
+    assertThat(sender.getMessages()).isEmpty();
+  }
+
+  @Test
+  public void createNewChangeSignedOffByFooter() throws Exception {
+    setSignedOffByFooter(true);
+    try {
+      ChangeInfo info = assertCreateSucceeds(newChangeInput(ChangeStatus.NEW));
+      String message = info.revisions.get(info.currentRevision).commit.message;
+      assertThat(message)
+          .contains(
+              String.format(
+                  "%sAdministrator <%s>", SIGNED_OFF_BY_TAG, admin.getIdent().getEmailAddress()));
+    } finally {
+      setSignedOffByFooter(false);
+    }
+  }
+
+  @Test
+  public void createNewChangeSignedOffByFooterWithChangeId() throws Exception {
+    setSignedOffByFooter(true);
+    try {
+      ChangeInput ci = newChangeInput(ChangeStatus.NEW);
+      String changeId = "I1234000000000000000000000000000000000000";
+      String changeIdLine = "Change-Id: " + changeId;
+      ci.subject = "Subject\n\n" + changeIdLine;
+      ChangeInfo info = assertCreateSucceeds(ci);
+      assertThat(info.changeId).isEqualTo(changeId);
+      String message = info.revisions.get(info.currentRevision).commit.message;
+      assertThat(message).contains(changeIdLine);
+      assertThat(message)
+          .contains(
+              String.format(
+                  "%sAdministrator <%s>", SIGNED_OFF_BY_TAG, admin.getIdent().getEmailAddress()));
+    } finally {
+      setSignedOffByFooter(false);
+    }
+  }
+
+  @Test
+  public void createNewPrivateChange() throws Exception {
+    ChangeInput input = newChangeInput(ChangeStatus.NEW);
+    input.isPrivate = true;
+    assertCreateSucceeds(input);
+  }
+
+  @Test
+  public void createNewWorkInProgressChange() throws Exception {
+    ChangeInput input = newChangeInput(ChangeStatus.NEW);
+    input.workInProgress = true;
+    assertCreateSucceeds(input);
+  }
+
+  @Test
+  public void createChangeWithParentCommit() throws Exception {
+    Map<String, PushOneCommit.Result> setup =
+        changeInTwoBranches("foo", "foo.txt", "bar", "bar.txt");
+    ChangeInput input = newChangeInput(ChangeStatus.NEW);
+    input.baseCommit = setup.get("master").getCommit().getId().name();
+    assertCreateSucceeds(input);
+  }
+
+  @Test
+  public void createChangeWithBadParentCommitFails() throws Exception {
+    ChangeInput input = newChangeInput(ChangeStatus.NEW);
+    input.baseCommit = "notasha1";
+    assertCreateFails(
+        input, UnprocessableEntityException.class, "Base notasha1 doesn't represent a valid SHA-1");
+  }
+
+  @Test
+  public void createChangeWithParentCommitOnWrongBranchFails() throws Exception {
+    Map<String, PushOneCommit.Result> setup =
+        changeInTwoBranches("foo", "foo.txt", "bar", "bar.txt");
+    ChangeInput input = newChangeInput(ChangeStatus.NEW);
+    input.branch = "foo";
+    input.baseCommit = setup.get("bar").getCommit().getId().name();
+    assertCreateFails(
+        input,
+        BadRequestException.class,
+        String.format("Commit %s doesn't exist on ref refs/heads/foo", input.baseCommit));
+  }
+
+  @Test
+  public void createChangeWithoutAccessToParentCommitFails() throws Exception {
+    Map<String, PushOneCommit.Result> results =
+        changeInTwoBranches("invisible-branch", "a.txt", "visible-branch", "b.txt");
+    block(project, "refs/heads/invisible-branch", READ, REGISTERED_USERS);
+
+    ChangeInput in = newChangeInput(ChangeStatus.NEW);
+    in.branch = "visible-branch";
+    in.baseChange = results.get("invisible-branch").getChangeId();
+    assertCreateFails(
+        in, UnprocessableEntityException.class, "Base change not found: " + in.baseChange);
+  }
+
+  @Test
+  public void createChangeOnInvisibleBranchFails() throws Exception {
+    changeInTwoBranches("invisible-branch", "a.txt", "branchB", "b.txt");
+    block(project, "refs/heads/invisible-branch", READ, REGISTERED_USERS);
+
+    ChangeInput in = newChangeInput(ChangeStatus.NEW);
+    in.branch = "invisible-branch";
+    assertCreateFails(in, ResourceNotFoundException.class, "");
+  }
+
+  @Test
+  public void noteDbCommit() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    ChangeInfo c = assertCreateSucceeds(newChangeInput(ChangeStatus.NEW));
+    try (Repository repo = repoManager.openRepository(project);
+        RevWalk rw = new RevWalk(repo)) {
+      RevCommit commit =
+          rw.parseCommit(repo.exactRef(changeMetaRef(new Change.Id(c._number))).getObjectId());
+
+      assertThat(commit.getShortMessage()).isEqualTo("Create change");
+
+      PersonIdent expectedAuthor =
+          changeNoteUtil.newIdent(getAccount(admin.id), c.created, serverIdent.get());
+      assertThat(commit.getAuthorIdent()).isEqualTo(expectedAuthor);
+
+      assertThat(commit.getCommitterIdent())
+          .isEqualTo(new PersonIdent(serverIdent.get(), c.created));
+      assertThat(commit.getParentCount()).isEqualTo(0);
+    }
+  }
+
+  @Test
+  public void createMergeChange() throws Exception {
+    changeInTwoBranches("branchA", "a.txt", "branchB", "b.txt");
+    ChangeInput in = newMergeChangeInput("branchA", "branchB", "");
+    assertCreateSucceeds(in);
+  }
+
+  @Test
+  public void createMergeChange_Conflicts() throws Exception {
+    changeInTwoBranches("branchA", "shared.txt", "branchB", "shared.txt");
+    ChangeInput in = newMergeChangeInput("branchA", "branchB", "");
+    assertCreateFails(in, RestApiException.class, "merge conflict");
+  }
+
+  @Test
+  public void createMergeChange_Conflicts_Ours() throws Exception {
+    changeInTwoBranches("branchA", "shared.txt", "branchB", "shared.txt");
+    ChangeInput in = newMergeChangeInput("branchA", "branchB", "ours");
+    assertCreateSucceeds(in);
+  }
+
+  @Test
+  public void invalidSource() throws Exception {
+    changeInTwoBranches("branchA", "a.txt", "branchB", "b.txt");
+    ChangeInput in = newMergeChangeInput("branchA", "invalid", "");
+    assertCreateFails(in, BadRequestException.class, "Cannot resolve 'invalid' to a commit");
+  }
+
+  @Test
+  public void invalidStrategy() throws Exception {
+    changeInTwoBranches("branchA", "a.txt", "branchB", "b.txt");
+    ChangeInput in = newMergeChangeInput("branchA", "branchB", "octopus");
+    assertCreateFails(in, BadRequestException.class, "invalid merge strategy: octopus");
+  }
+
+  @Test
+  public void alreadyMerged() throws Exception {
+    ObjectId c0 =
+        testRepo
+            .branch("HEAD")
+            .commit()
+            .insertChangeId()
+            .message("first commit")
+            .add("a.txt", "a contents ")
+            .create();
+    testRepo
+        .git()
+        .push()
+        .setRemote("origin")
+        .setRefSpecs(new RefSpec("HEAD:refs/heads/master"))
+        .call();
+
+    testRepo
+        .branch("HEAD")
+        .commit()
+        .insertChangeId()
+        .message("second commit")
+        .add("b.txt", "b contents ")
+        .create();
+    testRepo
+        .git()
+        .push()
+        .setRemote("origin")
+        .setRefSpecs(new RefSpec("HEAD:refs/heads/master"))
+        .call();
+
+    ChangeInput in = newMergeChangeInput("master", c0.getName(), "");
+    assertCreateFails(
+        in, ChangeAlreadyMergedException.class, "'" + c0.getName() + "' has already been merged");
+  }
+
+  @Test
+  public void onlyContentMerged() throws Exception {
+    testRepo
+        .branch("HEAD")
+        .commit()
+        .insertChangeId()
+        .message("first commit")
+        .add("a.txt", "a contents ")
+        .create();
+    testRepo
+        .git()
+        .push()
+        .setRemote("origin")
+        .setRefSpecs(new RefSpec("HEAD:refs/heads/master"))
+        .call();
+
+    // create a change, and cherrypick into master
+    PushOneCommit.Result cId = createChange();
+    RevCommit commitId = cId.getCommit();
+    CherryPickInput cpi = new CherryPickInput();
+    cpi.destination = "master";
+    cpi.message = "cherry pick the commit";
+    ChangeApi orig = gApi.changes().id(cId.getChangeId());
+    ChangeApi cherry = orig.current().cherryPick(cpi);
+    cherry.current().review(ReviewInput.approve());
+    cherry.current().submit();
+
+    ObjectId remoteId = getRemoteHead();
+    assertThat(remoteId).isNotEqualTo(commitId);
+
+    ChangeInput in = newMergeChangeInput("master", commitId.getName(), "");
+    assertCreateSucceeds(in);
+  }
+
+  @Test
+  public void cherryPickCommitWithoutChangeId() throws Exception {
+    // This test is a little superfluous, since the current cherry-pick code ignores
+    // the commit message of the to-be-cherry-picked change, using the one in
+    // CherryPickInput instead.
+    CherryPickInput input = new CherryPickInput();
+    input.destination = "foo";
+    input.message = "it goes to foo branch";
+    gApi.projects().name(project.get()).branch(input.destination).create(new BranchInput());
+
+    RevCommit revCommit = createNewCommitWithoutChangeId("refs/heads/master", "a.txt", "content");
+    ChangeInfo changeInfo =
+        gApi.projects().name(project.get()).commit(revCommit.getName()).cherryPick(input).get();
+
+    assertThat(changeInfo.messages).hasSize(1);
+    Iterator<ChangeMessageInfo> messageIterator = changeInfo.messages.iterator();
+    String expectedMessage =
+        String.format("Patch Set 1: Cherry Picked from commit %s.", revCommit.getName());
+    assertThat(messageIterator.next().message).isEqualTo(expectedMessage);
+
+    RevisionInfo revInfo = changeInfo.revisions.get(changeInfo.currentRevision);
+    assertThat(revInfo).isNotNull();
+    CommitInfo commitInfo = revInfo.commit;
+    assertThat(commitInfo.message)
+        .isEqualTo(input.message + "\n\nChange-Id: " + changeInfo.changeId + "\n");
+  }
+
+  @Test
+  public void cherryPickCommitWithChangeId() throws Exception {
+    CherryPickInput input = new CherryPickInput();
+    input.destination = "foo";
+
+    RevCommit revCommit = createChange().getCommit();
+    List<String> footers = revCommit.getFooterLines("Change-Id");
+    assertThat(footers).hasSize(1);
+    String changeId = footers.get(0);
+
+    input.message = "it goes to foo branch\n\nChange-Id: " + changeId;
+    gApi.projects().name(project.get()).branch(input.destination).create(new BranchInput());
+
+    ChangeInfo changeInfo =
+        gApi.projects().name(project.get()).commit(revCommit.getName()).cherryPick(input).get();
+
+    assertThat(changeInfo.messages).hasSize(1);
+    Iterator<ChangeMessageInfo> messageIterator = changeInfo.messages.iterator();
+    String expectedMessage =
+        String.format("Patch Set 1: Cherry Picked from commit %s.", revCommit.getName());
+    assertThat(messageIterator.next().message).isEqualTo(expectedMessage);
+
+    RevisionInfo revInfo = changeInfo.revisions.get(changeInfo.currentRevision);
+    assertThat(revInfo).isNotNull();
+    assertThat(revInfo.commit.message).isEqualTo(input.message + "\n");
+  }
+
+  private ChangeInput newChangeInput(ChangeStatus status) {
+    ChangeInput in = new ChangeInput();
+    in.project = project.get();
+    in.branch = "master";
+    in.subject = "Empty change";
+    in.topic = "support-gerrit-workflow-in-browser";
+    in.status = status;
+    return in;
+  }
+
+  private ChangeInfo assertCreateSucceeds(ChangeInput in) throws Exception {
+    ChangeInfo out = gApi.changes().create(in).get();
+    assertThat(out.project).isEqualTo(in.project);
+    assertThat(out.branch).isEqualTo(in.branch);
+    assertThat(out.subject).isEqualTo(in.subject.split("\n")[0]);
+    assertThat(out.topic).isEqualTo(in.topic);
+    assertThat(out.status).isEqualTo(in.status);
+    assertThat(out.isPrivate).isEqualTo(in.isPrivate);
+    assertThat(out.workInProgress).isEqualTo(in.workInProgress);
+    assertThat(out.revisions).hasSize(1);
+    assertThat(out.submitted).isNull();
+    assertThat(in.status).isEqualTo(ChangeStatus.NEW);
+    return out;
+  }
+
+  private void assertCreateFails(
+      ChangeInput in, Class<? extends RestApiException> errType, String errSubstring)
+      throws Exception {
+    exception.expect(errType);
+    exception.expectMessage(errSubstring);
+    gApi.changes().create(in);
+  }
+
+  // TODO(davido): Expose setting of account preferences in the API
+  private void setSignedOffByFooter(boolean value) throws Exception {
+    RestResponse r = adminRestSession.get("/accounts/" + admin.email + "/preferences");
+    r.assertOK();
+    GeneralPreferencesInfo i = newGson().fromJson(r.getReader(), GeneralPreferencesInfo.class);
+    i.signedOffBy = value;
+
+    r = adminRestSession.put("/accounts/" + admin.email + "/preferences", i);
+    r.assertOK();
+    GeneralPreferencesInfo o = newGson().fromJson(r.getReader(), GeneralPreferencesInfo.class);
+
+    if (value) {
+      assertThat(o.signedOffBy).isTrue();
+    } else {
+      assertThat(o.signedOffBy).isNull();
+    }
+
+    resetCurrentApiUser();
+  }
+
+  private ChangeInput newMergeChangeInput(String targetBranch, String sourceRef, String strategy) {
+    // create a merge change from branchA to master in gerrit
+    ChangeInput in = new ChangeInput();
+    in.project = project.get();
+    in.branch = targetBranch;
+    in.subject = "merge " + sourceRef + " to " + targetBranch;
+    in.status = ChangeStatus.NEW;
+    MergeInput mergeInput = new MergeInput();
+    mergeInput.source = sourceRef;
+    in.merge = mergeInput;
+    if (!Strings.isNullOrEmpty(strategy)) {
+      in.merge.strategy = strategy;
+    }
+    return in;
+  }
+
+  /**
+   * Create an empty commit in master, two new branches with one commit each.
+   *
+   * @param branchA name of first branch to create
+   * @param fileA name of file to commit to branchA
+   * @param branchB name of second branch to create
+   * @param fileB name of file to commit to branchB
+   * @return A {@code Map} of branchName => commit result.
+   * @throws Exception
+   */
+  private Map<String, Result> changeInTwoBranches(
+      String branchA, String fileA, String branchB, String fileB) throws Exception {
+    // create a initial commit in master
+    Result initialCommit =
+        pushFactory
+            .create(db, user.getIdent(), testRepo, "initial commit", "readme.txt", "initial commit")
+            .to("refs/heads/master");
+    initialCommit.assertOkStatus();
+
+    // create two new branches
+    createBranch(new Branch.NameKey(project, branchA));
+    createBranch(new Branch.NameKey(project, branchB));
+
+    // create a commit in branchA
+    Result changeA =
+        pushFactory
+            .create(db, user.getIdent(), testRepo, "change A", fileA, "A content")
+            .to("refs/heads/" + branchA);
+    changeA.assertOkStatus();
+
+    // create a commit in branchB
+    PushOneCommit commitB =
+        pushFactory.create(db, user.getIdent(), testRepo, "change B", fileB, "B content");
+    commitB.setParent(initialCommit.getCommit());
+    Result changeB = commitB.to("refs/heads/" + branchB);
+    changeB.assertOkStatus();
+
+    return ImmutableMap.of("master", initialCommit, branchA, changeA, branchB, changeB);
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/DeleteVoteIT.java b/javatests/com/google/gerrit/acceptance/rest/change/DeleteVoteIT.java
new file mode 100644
index 0000000..7e5ebdb
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/change/DeleteVoteIT.java
@@ -0,0 +1,105 @@
+// Copyright (C) 2017 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.google.gerrit.acceptance.rest.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.extensions.client.ReviewerState.REVIEWER;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.ChangeMessageInfo;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.testing.FakeEmailSender;
+import com.google.gson.reflect.TypeToken;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import org.junit.Test;
+
+public class DeleteVoteIT extends AbstractDaemonTest {
+  @Test
+  public void deleteVoteOnChange() throws Exception {
+    deleteVote(false);
+  }
+
+  @Test
+  public void deleteVoteOnRevision() throws Exception {
+    deleteVote(true);
+  }
+
+  private void deleteVote(boolean onRevisionLevel) throws Exception {
+    PushOneCommit.Result r = createChange();
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(ReviewInput.approve());
+
+    PushOneCommit.Result r2 = amendChange(r.getChangeId());
+
+    setApiUser(user);
+    recommend(r.getChangeId());
+
+    sender.clear();
+    String endPoint =
+        "/changes/"
+            + r.getChangeId()
+            + (onRevisionLevel ? ("/revisions/" + r2.getCommit().getName()) : "")
+            + "/reviewers/"
+            + user.getId().toString()
+            + "/votes/Code-Review";
+
+    RestResponse response = adminRestSession.delete(endPoint);
+    response.assertNoContent();
+
+    List<FakeEmailSender.Message> messages = sender.getMessages();
+    assertThat(messages).hasSize(1);
+    FakeEmailSender.Message msg = messages.get(0);
+    assertThat(msg.rcpt()).containsExactly(user.emailAddress);
+    assertThat(msg.body()).contains(admin.fullName + " has removed a vote on this change.\n");
+    assertThat(msg.body())
+        .contains("Removed Code-Review+1 by " + user.fullName + " <" + user.email + ">\n");
+
+    endPoint =
+        "/changes/"
+            + r.getChangeId()
+            + (onRevisionLevel ? ("/revisions/" + r2.getCommit().getName()) : "")
+            + "/reviewers/"
+            + user.getId().toString()
+            + "/votes";
+
+    response = adminRestSession.get(endPoint);
+    response.assertOK();
+
+    Map<String, Short> m =
+        newGson().fromJson(response.getReader(), new TypeToken<Map<String, Short>>() {}.getType());
+
+    assertThat(m).containsExactly("Code-Review", Short.valueOf((short) 0));
+
+    ChangeInfo c = gApi.changes().id(r.getChangeId()).get();
+
+    ChangeMessageInfo message = Iterables.getLast(c.messages);
+    assertThat(message.author._accountId).isEqualTo(admin.getId().get());
+    assertThat(message.message).isEqualTo("Removed Code-Review+1 by User <user@example.com>\n");
+    assertThat(getReviewers(c.reviewers.get(REVIEWER)))
+        .containsExactlyElementsIn(ImmutableSet.of(admin.getId(), user.getId()));
+  }
+
+  private Iterable<Account.Id> getReviewers(Collection<AccountInfo> r) {
+    return Iterables.transform(r, a -> new Account.Id(a._accountId));
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/HashtagsIT.java b/javatests/com/google/gerrit/acceptance/rest/change/HashtagsIT.java
new file mode 100644
index 0000000..864f08d
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/change/HashtagsIT.java
@@ -0,0 +1,313 @@
+// Copyright (C) 2014 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.google.gerrit.acceptance.rest.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static java.util.Objects.requireNonNull;
+import static java.util.concurrent.TimeUnit.SECONDS;
+
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Sets;
+import com.google.common.truth.IterableSubject;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.changes.HashtagsInput;
+import com.google.gerrit.extensions.common.ChangeMessageInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.testing.TestTimeUtil;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+@NoHttpd
+public class HashtagsIT extends AbstractDaemonTest {
+  @Before
+  public void before() {
+    assume().that(notesMigration.readChanges()).isTrue();
+  }
+
+  @BeforeClass
+  public static void setTimeForTesting() {
+    TestTimeUtil.resetWithClockStep(1, SECONDS);
+  }
+
+  @AfterClass
+  public static void restoreTime() {
+    TestTimeUtil.useSystemTime();
+  }
+
+  @Test
+  public void getNoHashtags() throws Exception {
+    // Get on a change with no hashtags returns an empty list.
+    PushOneCommit.Result r = createChange();
+    assertThatGet(r).isEmpty();
+  }
+
+  @Test
+  public void addSingleHashtag() throws Exception {
+    PushOneCommit.Result r = createChange();
+
+    // Adding a single hashtag returns a single hashtag.
+    addHashtags(r, "tag2");
+    assertThatGet(r).containsExactly("tag2");
+    assertMessage(r, "Hashtag added: tag2");
+
+    // Adding another single hashtag to change that already has one hashtag
+    // returns a sorted list of hashtags with existing and new.
+    addHashtags(r, "tag1");
+    assertThatGet(r).containsExactly("tag1", "tag2").inOrder();
+    assertMessage(r, "Hashtag added: tag1");
+  }
+
+  @Test
+  public void addInvalidHashtag() throws Exception {
+    PushOneCommit.Result r = createChange();
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("hashtags may not contain commas");
+    addHashtags(r, "invalid,hashtag");
+  }
+
+  @Test
+  public void addMultipleHashtags() throws Exception {
+    PushOneCommit.Result r = createChange();
+
+    // Adding multiple hashtags returns a sorted list of hashtags.
+    addHashtags(r, "tag3", "tag1");
+    assertThatGet(r).containsExactly("tag1", "tag3").inOrder();
+    assertMessage(r, "Hashtags added: tag1, tag3");
+
+    // Adding multiple hashtags to change that already has hashtags returns a
+    // sorted list of hashtags with existing and new.
+    addHashtags(r, "tag2", "tag4");
+    assertThatGet(r).containsExactly("tag1", "tag2", "tag3", "tag4").inOrder();
+    assertMessage(r, "Hashtags added: tag2, tag4");
+  }
+
+  @Test
+  public void addAlreadyExistingHashtag() throws Exception {
+    // Adding a hashtag that already exists on the change returns a sorted list
+    // of hashtags without duplicates.
+    PushOneCommit.Result r = createChange();
+    addHashtags(r, "tag2");
+    assertThatGet(r).containsExactly("tag2");
+    assertMessage(r, "Hashtag added: tag2");
+    ChangeMessageInfo last = getLastMessage(r);
+
+    addHashtags(r, "tag2");
+    assertThatGet(r).containsExactly("tag2");
+    assertNoNewMessageSince(r, last);
+
+    addHashtags(r, "tag1", "tag2");
+    assertThatGet(r).containsExactly("tag1", "tag2").inOrder();
+    assertMessage(r, "Hashtag added: tag1");
+  }
+
+  @Test
+  public void hashtagsWithPrefix() throws Exception {
+    PushOneCommit.Result r = createChange();
+
+    // Leading # is stripped from added tag.
+    addHashtags(r, "#tag1");
+    assertThatGet(r).containsExactly("tag1");
+    assertMessage(r, "Hashtag added: tag1");
+
+    // Leading # is stripped from multiple added tags.
+    addHashtags(r, "#tag2", "#tag3");
+    assertThatGet(r).containsExactly("tag1", "tag2", "tag3").inOrder();
+    assertMessage(r, "Hashtags added: tag2, tag3");
+
+    // Leading # is stripped from removed tag.
+    removeHashtags(r, "#tag2");
+    assertThatGet(r).containsExactly("tag1", "tag3").inOrder();
+    assertMessage(r, "Hashtag removed: tag2");
+
+    // Leading # is stripped from multiple removed tags.
+    removeHashtags(r, "#tag1", "#tag3");
+    assertThatGet(r).isEmpty();
+    assertMessage(r, "Hashtags removed: tag1, tag3");
+
+    // Leading # and space are stripped from added tag.
+    addHashtags(r, "# tag1");
+    assertThatGet(r).containsExactly("tag1");
+    assertMessage(r, "Hashtag added: tag1");
+
+    // Multiple leading # are stripped from added tag.
+    addHashtags(r, "##tag2");
+    assertThatGet(r).containsExactly("tag1", "tag2").inOrder();
+    assertMessage(r, "Hashtag added: tag2");
+
+    // Multiple leading spaces and # are stripped from added tag.
+    addHashtags(r, "# # tag3");
+    assertThatGet(r).containsExactly("tag1", "tag2", "tag3").inOrder();
+    assertMessage(r, "Hashtag added: tag3");
+  }
+
+  @Test
+  public void removeSingleHashtag() throws Exception {
+    // Removing a single tag from a change that only has that tag returns an
+    // empty list.
+    PushOneCommit.Result r = createChange();
+    addHashtags(r, "tag1");
+    assertThatGet(r).containsExactly("tag1");
+    removeHashtags(r, "tag1");
+    assertThatGet(r).isEmpty();
+    assertMessage(r, "Hashtag removed: tag1");
+
+    // Removing a single tag from a change that has multiple tags returns a
+    // sorted list of remaining tags.
+    addHashtags(r, "tag1", "tag2", "tag3");
+    removeHashtags(r, "tag2");
+    assertThatGet(r).containsExactly("tag1", "tag3").inOrder();
+    assertMessage(r, "Hashtag removed: tag2");
+  }
+
+  @Test
+  public void removeMultipleHashtags() throws Exception {
+    // Removing multiple tags from a change that only has those tags returns an
+    // empty list.
+    PushOneCommit.Result r = createChange();
+    addHashtags(r, "tag1", "tag2");
+    assertThatGet(r).containsExactly("tag1", "tag2").inOrder();
+    removeHashtags(r, "tag1", "tag2");
+    assertThatGet(r).isEmpty();
+    assertMessage(r, "Hashtags removed: tag1, tag2");
+
+    // Removing multiple tags from a change that has multiple tags returns a
+    // sorted list of remaining tags.
+    addHashtags(r, "tag1", "tag2", "tag3", "tag4");
+    assertThatGet(r).containsExactly("tag1", "tag2", "tag3", "tag4").inOrder();
+    removeHashtags(r, "tag2", "tag4");
+    assertThatGet(r).containsExactly("tag1", "tag3").inOrder();
+    assertMessage(r, "Hashtags removed: tag2, tag4");
+  }
+
+  @Test
+  public void removeNotExistingHashtag() throws Exception {
+    // Removing a single hashtag from change that has no hashtags returns an
+    // empty list.
+    PushOneCommit.Result r = createChange();
+    ChangeMessageInfo last = getLastMessage(r);
+    removeHashtags(r, "tag1");
+    assertThatGet(r).isEmpty();
+    assertNoNewMessageSince(r, last);
+
+    // Removing a single non-existing tag from a change that only has one other
+    // tag returns a list of only one tag.
+    addHashtags(r, "tag1");
+    last = getLastMessage(r);
+    removeHashtags(r, "tag4");
+    assertThatGet(r).containsExactly("tag1");
+    assertNoNewMessageSince(r, last);
+
+    // Removing a single non-existing tag from a change that has multiple tags
+    // returns a sorted list of tags without any deleted.
+    addHashtags(r, "tag1", "tag2", "tag3");
+    last = getLastMessage(r);
+    removeHashtags(r, "tag4");
+    assertThatGet(r).containsExactly("tag1", "tag2", "tag3").inOrder();
+    assertNoNewMessageSince(r, last);
+  }
+
+  @Test
+  public void addAndRemove() throws Exception {
+    // Adding and remove hashtags in a single request performs correctly.
+    PushOneCommit.Result r = createChange();
+    addHashtags(r, "tag1", "tag2");
+    HashtagsInput input = new HashtagsInput();
+    input.add = Sets.newHashSet("tag3", "tag4");
+    input.remove = Sets.newHashSet("tag1");
+    gApi.changes().id(r.getChange().getId().get()).setHashtags(input);
+    assertThatGet(r).containsExactly("tag2", "tag3", "tag4");
+    assertMessage(r, "Hashtags added: tag3, tag4\nHashtag removed: tag1");
+
+    // Adding and removing the same hashtag actually removes it.
+    addHashtags(r, "tag1", "tag2");
+    input = new HashtagsInput();
+    input.add = Sets.newHashSet("tag3", "tag4");
+    input.remove = Sets.newHashSet("tag3");
+    gApi.changes().id(r.getChange().getId().get()).setHashtags(input);
+    assertThatGet(r).containsExactly("tag1", "tag2", "tag4");
+    assertMessage(r, "Hashtag removed: tag3");
+  }
+
+  @Test
+  public void hashtagWithMixedCase() throws Exception {
+    PushOneCommit.Result r = createChange();
+    addHashtags(r, "MyHashtag");
+    assertThatGet(r).containsExactly("MyHashtag");
+    assertMessage(r, "Hashtag added: MyHashtag");
+  }
+
+  @Test
+  public void addHashtagWithoutPermissionNotAllowed() throws Exception {
+    PushOneCommit.Result r = createChange();
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    exception.expectMessage("edit hashtags not permitted");
+    addHashtags(r, "MyHashtag");
+  }
+
+  @Test
+  public void addHashtagWithPermissionAllowed() throws Exception {
+    PushOneCommit.Result r = createChange();
+    grant(project, "refs/heads/master", Permission.EDIT_HASHTAGS, false, REGISTERED_USERS);
+    setApiUser(user);
+    addHashtags(r, "MyHashtag");
+    assertThatGet(r).containsExactly("MyHashtag");
+    assertMessage(r, "Hashtag added: MyHashtag");
+  }
+
+  private IterableSubject assertThatGet(PushOneCommit.Result r) throws Exception {
+    return assertThat(gApi.changes().id(r.getChange().getId().get()).getHashtags());
+  }
+
+  private void addHashtags(PushOneCommit.Result r, String... toAdd) throws Exception {
+    HashtagsInput input = new HashtagsInput();
+    input.add = Sets.newHashSet(toAdd);
+    gApi.changes().id(r.getChange().getId().get()).setHashtags(input);
+  }
+
+  private void removeHashtags(PushOneCommit.Result r, String... toRemove) throws Exception {
+    HashtagsInput input = new HashtagsInput();
+    input.remove = Sets.newHashSet(toRemove);
+    gApi.changes().id(r.getChange().getId().get()).setHashtags(input);
+  }
+
+  private void assertMessage(PushOneCommit.Result r, String expectedMessage) throws Exception {
+    assertThat(getLastMessage(r).message).isEqualTo(expectedMessage);
+  }
+
+  private void assertNoNewMessageSince(PushOneCommit.Result r, ChangeMessageInfo expected)
+      throws Exception {
+    requireNonNull(expected);
+    ChangeMessageInfo last = getLastMessage(r);
+    assertThat(last.message).isEqualTo(expected.message);
+    assertThat(last.id).isEqualTo(expected.id);
+  }
+
+  private ChangeMessageInfo getLastMessage(PushOneCommit.Result r) throws Exception {
+    ChangeMessageInfo lastMessage =
+        Iterables.getLast(gApi.changes().id(r.getChange().getId().get()).get().messages, null);
+    assertThat(lastMessage).named(lastMessage.message).isNotNull();
+    return lastMessage;
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/IndexChangeIT.java b/javatests/com/google/gerrit/acceptance/rest/change/IndexChangeIT.java
new file mode 100644
index 0000000..6555fe8
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/change/IndexChangeIT.java
@@ -0,0 +1,105 @@
+// Copyright (C) 2014 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.google.gerrit.acceptance.rest.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.TestAccount;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.project.testing.Util;
+import java.util.List;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.junit.TestRepository;
+import org.junit.Test;
+
+public class IndexChangeIT extends AbstractDaemonTest {
+  @Test
+  public void indexChange() throws Exception {
+    String changeId = createChange().getChangeId();
+    adminRestSession.post("/changes/" + changeId + "/index/").assertNoContent();
+  }
+
+  @Test
+  public void indexChangeOnNonVisibleBranch() throws Exception {
+    String changeId = createChange().getChangeId();
+    blockRead("refs/heads/master");
+    userRestSession.post("/changes/" + changeId + "/index/").assertNotFound();
+  }
+
+  @Test
+  public void indexChangeAfterOwnerLosesVisibility() throws Exception {
+    // Create a test group with 2 users as members
+    TestAccount user2 = accountCreator.user2();
+    String group = createGroup("test");
+    gApi.groups().id(group).addMembers("admin", "user", user2.username);
+
+    // Create a project and restrict its visibility to the group
+    Project.NameKey p = createProject("p");
+    try (ProjectConfigUpdate u = updateProject(p)) {
+      Util.allow(
+          u.getConfig(),
+          Permission.READ,
+          groupCache.get(new AccountGroup.NameKey(group)).get().getGroupUUID(),
+          "refs/*");
+      Util.block(u.getConfig(), Permission.READ, REGISTERED_USERS, "refs/*");
+      u.save();
+    }
+
+    // Clone it and push a change as a regular user
+    TestRepository<InMemoryRepository> repo = cloneProject(p, user);
+    PushOneCommit push = pushFactory.create(db, user.getIdent(), repo);
+    PushOneCommit.Result result = push.to("refs/for/master");
+    result.assertOkStatus();
+    assertThat(result.getChange().change().getOwner()).isEqualTo(user.id);
+    String changeId = result.getChangeId();
+
+    // User can see the change and it is mergeable
+    setApiUser(user);
+    List<ChangeInfo> changes = gApi.changes().query(changeId).get();
+    assertThat(changes).hasSize(1);
+    assertThat(changes.get(0).mergeable).isNotNull();
+
+    // Other user can see the change and it is mergeable
+    setApiUser(user2);
+    changes = gApi.changes().query(changeId).get();
+    assertThat(changes).hasSize(1);
+    assertThat(changes.get(0).mergeable).isTrue();
+
+    // Remove the user from the group so they can no longer see the project
+    setApiUser(admin);
+    gApi.groups().id(group).removeMembers("user");
+
+    // User can no longer see the change
+    setApiUser(user);
+    changes = gApi.changes().query(changeId).get();
+    assertThat(changes).isEmpty();
+
+    // Reindex the change
+    setApiUser(admin);
+    gApi.changes().id(changeId).index();
+
+    // Other user can still see the change and it is still mergeable
+    setApiUser(user2);
+    changes = gApi.changes().query(changeId).get();
+    assertThat(changes).hasSize(1);
+    assertThat(changes.get(0).mergeable).isTrue();
+  }
+}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ListChangesOptionsIT.java b/javatests/com/google/gerrit/acceptance/rest/change/ListChangesOptionsIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ListChangesOptionsIT.java
rename to javatests/com/google/gerrit/acceptance/rest/change/ListChangesOptionsIT.java
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/MoveChangeIT.java b/javatests/com/google/gerrit/acceptance/rest/change/MoveChangeIT.java
new file mode 100644
index 0000000..206cc68
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/change/MoveChangeIT.java
@@ -0,0 +1,356 @@
+// Copyright (C) 2015 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.google.gerrit.acceptance.rest.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.acceptance.GitUtil.pushHead;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.GitUtil;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.common.data.LabelFunction;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.changes.MoveInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.projects.BranchInput;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gerrit.server.project.testing.Util;
+import java.util.Arrays;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.junit.Test;
+
+@NoHttpd
+public class MoveChangeIT extends AbstractDaemonTest {
+  @Test
+  public void moveChangeWithShortRef() throws Exception {
+    // Move change to a different branch using short ref name
+    PushOneCommit.Result r = createChange();
+    Branch.NameKey newBranch = new Branch.NameKey(r.getChange().change().getProject(), "moveTest");
+    createBranch(newBranch);
+    move(r.getChangeId(), newBranch.getShortName());
+    assertThat(r.getChange().change().getDest()).isEqualTo(newBranch);
+  }
+
+  @Test
+  public void moveChangeWithFullRef() throws Exception {
+    // Move change to a different branch using full ref name
+    PushOneCommit.Result r = createChange();
+    Branch.NameKey newBranch = new Branch.NameKey(r.getChange().change().getProject(), "moveTest");
+    createBranch(newBranch);
+    move(r.getChangeId(), newBranch.get());
+    assertThat(r.getChange().change().getDest()).isEqualTo(newBranch);
+  }
+
+  @Test
+  public void moveChangeWithMessage() throws Exception {
+    // Provide a message using --message flag
+    PushOneCommit.Result r = createChange();
+    Branch.NameKey newBranch = new Branch.NameKey(r.getChange().change().getProject(), "moveTest");
+    createBranch(newBranch);
+    String moveMessage = "Moving for the move test";
+    move(r.getChangeId(), newBranch.get(), moveMessage);
+    assertThat(r.getChange().change().getDest()).isEqualTo(newBranch);
+    StringBuilder expectedMessage = new StringBuilder();
+    expectedMessage.append("Change destination moved from master to moveTest");
+    expectedMessage.append("\n\n");
+    expectedMessage.append(moveMessage);
+    assertThat(r.getChange().messages().get(1).getMessage()).isEqualTo(expectedMessage.toString());
+  }
+
+  @Test
+  public void moveChangeToSameRefAsCurrent() throws Exception {
+    // Move change to the branch same as change's destination
+    PushOneCommit.Result r = createChange();
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("Change is already destined for the specified branch");
+    move(r.getChangeId(), r.getChange().change().getDest().get());
+  }
+
+  @Test
+  public void moveChangeToSameChangeId() throws Exception {
+    // Move change to a branch with existing change with same change ID
+    PushOneCommit.Result r = createChange();
+    Branch.NameKey newBranch = new Branch.NameKey(r.getChange().change().getProject(), "moveTest");
+    createBranch(newBranch);
+    int changeNum = r.getChange().change().getChangeId();
+    createChange(newBranch.get(), r.getChangeId());
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage(
+        "Destination "
+            + newBranch.getShortName()
+            + " has a different change with same change key "
+            + r.getChangeId());
+    move(changeNum, newBranch.get());
+  }
+
+  @Test
+  public void moveChangeToNonExistentRef() throws Exception {
+    // Move change to a non-existing branch
+    PushOneCommit.Result r = createChange();
+    Branch.NameKey newBranch =
+        new Branch.NameKey(r.getChange().change().getProject(), "does_not_exist");
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("Destination " + newBranch.get() + " not found in the project");
+    move(r.getChangeId(), newBranch.get());
+  }
+
+  @Test
+  public void moveClosedChange() throws Exception {
+    // Move a change which is not open
+    PushOneCommit.Result r = createChange();
+    Branch.NameKey newBranch = new Branch.NameKey(r.getChange().change().getProject(), "moveTest");
+    createBranch(newBranch);
+    merge(r);
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("Change is merged");
+    move(r.getChangeId(), newBranch.get());
+  }
+
+  @Test
+  public void moveMergeCommitChange() throws Exception {
+    // Move a change which has a merge commit as the current PS
+    // Create a merge commit and push for review
+    PushOneCommit.Result r1 = createChange();
+    PushOneCommit.Result r2 = createChange();
+    TestRepository<?>.CommitBuilder commitBuilder =
+        testRepo.branch("HEAD").commit().insertChangeId();
+    commitBuilder
+        .parent(r1.getCommit())
+        .parent(r2.getCommit())
+        .message("Move change Merge Commit")
+        .author(admin.getIdent())
+        .committer(new PersonIdent(admin.getIdent(), testRepo.getDate()));
+    RevCommit c = commitBuilder.create();
+    pushHead(testRepo, "refs/for/master", false, false);
+
+    // Try to move the merge commit to another branch
+    Branch.NameKey newBranch = new Branch.NameKey(r1.getChange().change().getProject(), "moveTest");
+    createBranch(newBranch);
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("Merge commit cannot be moved");
+    move(GitUtil.getChangeId(testRepo, c).get(), newBranch.get());
+  }
+
+  @Test
+  public void moveChangeToBranchWithoutUploadPerms() throws Exception {
+    // Move change to a destination where user doesn't have upload permissions
+    PushOneCommit.Result r = createChange();
+    Branch.NameKey newBranch =
+        new Branch.NameKey(r.getChange().change().getProject(), "blocked_branch");
+    createBranch(newBranch);
+    block(
+        "refs/for/" + newBranch.get(),
+        Permission.PUSH,
+        systemGroupBackend.getGroup(REGISTERED_USERS).getUUID());
+    exception.expect(AuthException.class);
+    exception.expectMessage("move not permitted");
+    move(r.getChangeId(), newBranch.get());
+  }
+
+  @Test
+  public void moveChangeFromBranchWithoutAbandonPerms() throws Exception {
+    // Move change for which user does not have abandon permissions
+    PushOneCommit.Result r = createChange();
+    Branch.NameKey newBranch = new Branch.NameKey(r.getChange().change().getProject(), "moveTest");
+    createBranch(newBranch);
+    block(
+        r.getChange().change().getDest().get(),
+        Permission.ABANDON,
+        systemGroupBackend.getGroup(REGISTERED_USERS).getUUID());
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    exception.expectMessage("move not permitted");
+    move(r.getChangeId(), newBranch.get());
+  }
+
+  @Test
+  public void moveChangeToBranchThatContainsCurrentCommit() throws Exception {
+    // Move change to a branch for which current PS revision is reachable from
+    // tip
+
+    // Create a change
+    PushOneCommit.Result r = createChange();
+    int changeNum = r.getChange().change().getChangeId();
+
+    // Create a branch with that same commit
+    Branch.NameKey newBranch = new Branch.NameKey(r.getChange().change().getProject(), "moveTest");
+    BranchInput bi = new BranchInput();
+    bi.revision = r.getCommit().name();
+    gApi.projects().name(newBranch.getParentKey().get()).branch(newBranch.get()).create(bi);
+
+    // Try to move the change to the branch with the same commit
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage(
+        "Current patchset revision is reachable from tip of " + newBranch.get());
+    move(changeNum, newBranch.get());
+  }
+
+  @Test
+  public void moveChangeWithCurrentPatchSetLocked() throws Exception {
+    // Move change that is locked
+    PushOneCommit.Result r = createChange();
+    Branch.NameKey newBranch = new Branch.NameKey(r.getChange().change().getProject(), "moveTest");
+    createBranch(newBranch);
+
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      LabelType patchSetLock = Util.patchSetLock();
+      u.getConfig().getLabelSections().put(patchSetLock.getName(), patchSetLock);
+      AccountGroup.UUID registeredUsers = systemGroupBackend.getGroup(REGISTERED_USERS).getUUID();
+      Util.allow(
+          u.getConfig(),
+          Permission.forLabel(patchSetLock.getName()),
+          0,
+          1,
+          registeredUsers,
+          "refs/heads/*");
+      u.save();
+    }
+    grant(project, "refs/heads/*", Permission.LABEL + "Patch-Set-Lock");
+    revision(r).review(new ReviewInput().label("Patch-Set-Lock", 1));
+
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage(
+        String.format("The current patch set of change %s is locked", r.getChange().getId()));
+    move(r.getChangeId(), newBranch.get());
+  }
+
+  @Test
+  public void moveChangeOnlyKeepVetoVotes() throws Exception {
+    // A vote for a label will be kept after moving if the label's function is *WithBlock and the
+    // vote holds the minimum value.
+    createBranch(new Branch.NameKey(project, "foo"));
+
+    String codeReviewLabel = "Code-Review"; // 'Code-Review' uses 'MaxWithBlock' function.
+    String testLabelA = "Label-A";
+    String testLabelB = "Label-B";
+    String testLabelC = "Label-C";
+    configLabel(testLabelA, LabelFunction.ANY_WITH_BLOCK);
+    configLabel(testLabelB, LabelFunction.MAX_NO_BLOCK);
+    configLabel(testLabelC, LabelFunction.NO_BLOCK);
+
+    AccountGroup.UUID registered = SystemGroupBackend.REGISTERED_USERS;
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      Util.allow(
+          u.getConfig(), Permission.forLabel(testLabelA), -1, +1, registered, "refs/heads/*");
+      Util.allow(
+          u.getConfig(), Permission.forLabel(testLabelB), -1, +1, registered, "refs/heads/*");
+      Util.allow(
+          u.getConfig(), Permission.forLabel(testLabelC), -1, +1, registered, "refs/heads/*");
+      u.save();
+    }
+
+    String changeId = createChange().getChangeId();
+    gApi.changes().id(changeId).current().review(ReviewInput.reject());
+
+    amendChange(changeId);
+
+    ReviewInput input = new ReviewInput();
+    input.label(testLabelA, -1);
+    input.label(testLabelB, -1);
+    input.label(testLabelC, -1);
+    gApi.changes().id(changeId).current().review(input);
+
+    assertThat(gApi.changes().id(changeId).current().reviewer(admin.email).votes().keySet())
+        .containsExactly(codeReviewLabel, testLabelA, testLabelB, testLabelC);
+    assertThat(gApi.changes().id(changeId).current().reviewer(admin.email).votes().values())
+        .containsExactly((short) -2, (short) -1, (short) -1, (short) -1);
+
+    // Move the change to the 'foo' branch.
+    assertThat(gApi.changes().id(changeId).get().branch).isEqualTo("master");
+    move(changeId, "foo");
+    assertThat(gApi.changes().id(changeId).get().branch).isEqualTo("foo");
+
+    // 'Code-Review -2' and 'Label-A -1' will be kept.
+    assertThat(gApi.changes().id(changeId).current().reviewer(admin.email).votes().values())
+        .containsExactly((short) -2, (short) -1, (short) 0, (short) 0);
+
+    // Move the change back to 'master'.
+    move(changeId, "master");
+    assertThat(gApi.changes().id(changeId).get().branch).isEqualTo("master");
+    assertThat(gApi.changes().id(changeId).current().reviewer(admin.email).votes().values())
+        .containsExactly((short) -2, (short) -1, (short) 0, (short) 0);
+  }
+
+  @Test
+  public void moveToBranchWithoutLabel() throws Exception {
+    createBranch(new Branch.NameKey(project, "foo"));
+    String testLabelA = "Label-A";
+    configLabel(testLabelA, LabelFunction.MAX_WITH_BLOCK, Arrays.asList("refs/heads/master"));
+
+    AccountGroup.UUID registered = SystemGroupBackend.REGISTERED_USERS;
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      Util.allow(
+          u.getConfig(), Permission.forLabel(testLabelA), -1, +1, registered, "refs/heads/master");
+      u.save();
+    }
+
+    String changeId = createChange().getChangeId();
+
+    ReviewInput input = new ReviewInput();
+    input.label(testLabelA, -1);
+    gApi.changes().id(changeId).current().review(input);
+
+    assertThat(gApi.changes().id(changeId).current().reviewer(admin.email).votes().keySet())
+        .containsExactly(testLabelA);
+    assertThat(gApi.changes().id(changeId).current().reviewer(admin.email).votes().values())
+        .containsExactly((short) -1);
+
+    move(changeId, "foo");
+
+    // TODO(dpursehouse): Assert about state of labels after move
+  }
+
+  @Test
+  public void moveNoDestinationBranchSpecified() throws Exception {
+    PushOneCommit.Result r = createChange();
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("destination branch is required");
+    move(r.getChangeId(), null);
+  }
+
+  private void move(int changeNum, String destination) throws RestApiException {
+    gApi.changes().id(changeNum).move(destination);
+  }
+
+  private void move(String changeId, String destination) throws RestApiException {
+    gApi.changes().id(changeId).move(destination);
+  }
+
+  private void move(String changeId, String destination, String message) throws RestApiException {
+    MoveInput in = new MoveInput();
+    in.destinationBranch = destination;
+    in.message = message;
+    gApi.changes().id(changeId).move(in);
+  }
+
+  private PushOneCommit.Result createChange(String branch, String changeId) throws Exception {
+    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo, changeId);
+    PushOneCommit.Result result = push.to("refs/for/" + branch);
+    result.assertOkStatus();
+    return result;
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/PrivateByDefaultIT.java b/javatests/com/google/gerrit/acceptance/rest/change/PrivateByDefaultIT.java
new file mode 100644
index 0000000..0ece00a
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/change/PrivateByDefaultIT.java
@@ -0,0 +1,159 @@
+// Copyright (C) 2017 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.google.gerrit.acceptance.rest.change;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.GerritConfig;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.extensions.api.projects.ConfigInput;
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.ChangeInput;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.reviewdb.client.Project;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.junit.Before;
+import org.junit.Test;
+
+public class PrivateByDefaultIT extends AbstractDaemonTest {
+  private Project.NameKey project1;
+  private Project.NameKey project2;
+
+  @Before
+  public void setUp() throws Exception {
+    project1 = createProject("project-1");
+    project2 = createProject("project-2", project1);
+    setPrivateByDefault(project1, InheritableBoolean.FALSE);
+  }
+
+  @Test
+  public void createChangeWithPrivateByDefaultEnabled() throws Exception {
+    setPrivateByDefault(project2, InheritableBoolean.TRUE);
+    ChangeInput input = new ChangeInput(project2.get(), "master", "empty change");
+    assertThat(gApi.changes().create(input).get().isPrivate).isTrue();
+  }
+
+  @Test
+  public void createChangeBypassPrivateByDefaultEnabled() throws Exception {
+    setPrivateByDefault(project2, InheritableBoolean.TRUE);
+    ChangeInput input = new ChangeInput(project2.get(), "master", "empty change");
+    input.isPrivate = false;
+    assertThat(gApi.changes().create(input).get().isPrivate).isNull();
+  }
+
+  @Test
+  public void createChangeWithPrivateByDefaultDisabled() throws Exception {
+    ChangeInfo info =
+        gApi.changes().create(new ChangeInput(project2.get(), "master", "empty change")).get();
+    assertThat(info.isPrivate).isNull();
+  }
+
+  @Test
+  public void createChangeWithPrivateByDefaultInherited() throws Exception {
+    setPrivateByDefault(project1, InheritableBoolean.TRUE);
+    ChangeInfo info =
+        gApi.changes().create(new ChangeInput(project2.get(), "master", "empty change")).get();
+    assertThat(info.isPrivate).isTrue();
+  }
+
+  @Test
+  @GerritConfig(name = "change.disablePrivateChanges", value = "true")
+  public void createChangeWithPrivateByDefaultAndDisablePrivateChangesTrue() throws Exception {
+    setPrivateByDefault(project2, InheritableBoolean.TRUE);
+
+    ChangeInput input = new ChangeInput(project2.get(), "master", "empty change");
+    exception.expect(MethodNotAllowedException.class);
+    exception.expectMessage("private changes are disabled");
+    gApi.changes().create(input);
+  }
+
+  @Test
+  public void pushWithPrivateByDefaultEnabled() throws Exception {
+    setPrivateByDefault(project2, InheritableBoolean.TRUE);
+    assertThat(createChange(project2).getChange().change().isPrivate()).isTrue();
+  }
+
+  @Test
+  public void pushBypassPrivateByDefaultEnabled() throws Exception {
+    setPrivateByDefault(project2, InheritableBoolean.TRUE);
+    assertThat(
+            createChange(project2, "refs/for/master%remove-private")
+                .getChange()
+                .change()
+                .isPrivate())
+        .isFalse();
+  }
+
+  @Test
+  public void pushWithPrivateByDefaultDisabled() throws Exception {
+    assertThat(createChange(project2).getChange().change().isPrivate()).isFalse();
+  }
+
+  @Test
+  public void pushBypassPrivateByDefaultInherited() throws Exception {
+    setPrivateByDefault(project1, InheritableBoolean.TRUE);
+    assertThat(createChange(project2).getChange().change().isPrivate()).isTrue();
+  }
+
+  @Test
+  @GerritConfig(name = "change.disablePrivateChanges", value = "true")
+  public void pushPrivatesWithPrivateByDefaultAndDisablePrivateChangesTrue() throws Exception {
+    setPrivateByDefault(project2, InheritableBoolean.TRUE);
+
+    TestRepository<InMemoryRepository> testRepo = cloneProject(project2);
+    PushOneCommit.Result result =
+        pushFactory.create(db, admin.getIdent(), testRepo).to("refs/for/master%private");
+    result.assertErrorStatus();
+  }
+
+  @Test
+  @GerritConfig(name = "change.disablePrivateChanges", value = "true")
+  public void pushDraftsWithPrivateByDefaultAndDisablePrivateChangesTrue() throws Exception {
+    setPrivateByDefault(project2, InheritableBoolean.TRUE);
+
+    RevCommit initialHead = getRemoteHead();
+    TestRepository<InMemoryRepository> testRepo = cloneProject(project2);
+    PushOneCommit.Result result =
+        pushFactory.create(db, admin.getIdent(), testRepo).to("refs/for/master%draft");
+    result.assertErrorStatus();
+
+    testRepo.reset(initialHead);
+    result = pushFactory.create(db, admin.getIdent(), testRepo).to("refs/drafts/master");
+    result.assertErrorStatus();
+  }
+
+  private void setPrivateByDefault(Project.NameKey proj, InheritableBoolean value)
+      throws Exception {
+    ConfigInput input = new ConfigInput();
+    input.privateByDefault = value;
+    gApi.projects().name(proj.get()).config(input);
+  }
+
+  private PushOneCommit.Result createChange(Project.NameKey proj) throws Exception {
+    return createChange(proj, "refs/for/master");
+  }
+
+  private PushOneCommit.Result createChange(Project.NameKey proj, String ref) throws Exception {
+    TestRepository<InMemoryRepository> testRepo = cloneProject(proj);
+    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
+    PushOneCommit.Result result = push.to(ref);
+    result.assertOkStatus();
+    return result;
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/SubmitByCherryPickIT.java b/javatests/com/google/gerrit/acceptance/rest/change/SubmitByCherryPickIT.java
new file mode 100644
index 0000000..8160d9a
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/change/SubmitByCherryPickIT.java
@@ -0,0 +1,464 @@
+// Copyright (C) 2013 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.google.gerrit.acceptance.rest.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_REVISION;
+import static com.google.gerrit.extensions.client.ListChangesOption.MESSAGES;
+
+import com.google.common.collect.Iterables;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.TestProjectInput;
+import com.google.gerrit.common.FooterConstants;
+import com.google.gerrit.extensions.api.changes.SubmitInput;
+import com.google.gerrit.extensions.client.ChangeStatus;
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.extensions.client.ListChangesOption;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.change.TestSubmitInput;
+import com.google.gerrit.server.git.ChangeMessageModifier;
+import com.google.gerrit.server.submit.CommitMergeStatus;
+import com.google.inject.Inject;
+import java.util.List;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.junit.Test;
+
+public class SubmitByCherryPickIT extends AbstractSubmit {
+  @Inject private DynamicSet<ChangeMessageModifier> changeMessageModifiers;
+
+  @Override
+  protected SubmitType getSubmitType() {
+    return SubmitType.CHERRY_PICK;
+  }
+
+  @Test
+  public void submitWithCherryPickIfFastForwardPossible() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+    PushOneCommit.Result change = createChange();
+    submit(change.getChangeId());
+    assertCherryPick(testRepo, false);
+    RevCommit newHead = getRemoteHead();
+    assertThat(newHead.getParent(0)).isEqualTo(change.getCommit().getParent(0));
+
+    assertRefUpdatedEvents(initialHead, newHead);
+    assertChangeMergedEvents(change.getChangeId(), newHead.name());
+  }
+
+  @Test
+  public void submitWithCherryPick() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+    PushOneCommit.Result change = createChange("Change 1", "a.txt", "content");
+    submit(change.getChangeId());
+
+    RevCommit headAfterFirstSubmit = getRemoteHead();
+    testRepo.reset(initialHead);
+    PushOneCommit.Result change2 = createChange("Change 2", "b.txt", "other content");
+    submit(change2.getChangeId());
+    assertCherryPick(testRepo, false);
+    RevCommit newHead = getRemoteHead();
+    assertThat(newHead.getParentCount()).isEqualTo(1);
+    assertThat(newHead.getParent(0)).isEqualTo(headAfterFirstSubmit);
+    assertCurrentRevision(change2.getChangeId(), 2, newHead);
+    assertSubmitter(change2.getChangeId(), 1);
+    assertSubmitter(change2.getChangeId(), 2);
+    assertPersonEquals(admin.getIdent(), newHead.getAuthorIdent());
+    assertPersonEquals(admin.getIdent(), newHead.getCommitterIdent());
+
+    assertRefUpdatedEvents(initialHead, headAfterFirstSubmit, headAfterFirstSubmit, newHead);
+    assertChangeMergedEvents(
+        change.getChangeId(), headAfterFirstSubmit.name(), change2.getChangeId(), newHead.name());
+  }
+
+  @Test
+  public void changeMessageOnSubmit() throws Exception {
+    PushOneCommit.Result change = createChange();
+    RegistrationHandle handle =
+        changeMessageModifiers.add(
+            "gerrit",
+            new ChangeMessageModifier() {
+              @Override
+              public String onSubmit(
+                  String newCommitMessage,
+                  RevCommit original,
+                  RevCommit mergeTip,
+                  Branch.NameKey destination) {
+                return newCommitMessage + "Custom: " + destination.get();
+              }
+            });
+    try {
+      submit(change.getChangeId());
+    } finally {
+      handle.remove();
+    }
+    testRepo.git().fetch().setRemote("origin").call();
+    ChangeInfo info = get(change.getChangeId(), CURRENT_REVISION);
+    RevCommit c = testRepo.getRevWalk().parseCommit(ObjectId.fromString(info.currentRevision));
+    testRepo.getRevWalk().parseBody(c);
+    assertThat(c.getFooterLines("Custom")).containsExactly("refs/heads/master");
+    assertThat(c.getFooterLines(FooterConstants.REVIEWED_ON)).hasSize(1);
+  }
+
+  @Test
+  @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
+  public void submitWithContentMerge() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+    PushOneCommit.Result change = createChange("Change 1", "a.txt", "aaa\nbbb\nccc\n");
+    submit(change.getChangeId());
+    RevCommit headAfterFirstSubmit = getRemoteHead();
+    PushOneCommit.Result change2 = createChange("Change 2", "a.txt", "aaa\nbbb\nccc\nddd\n");
+    submit(change2.getChangeId());
+    RevCommit headAfterSecondSubmit = getRemoteHead();
+
+    testRepo.reset(change.getCommit());
+    PushOneCommit.Result change3 = createChange("Change 3", "a.txt", "bbb\nccc\n");
+    submit(change3.getChangeId());
+    assertCherryPick(testRepo, true);
+    RevCommit headAfterThirdSubmit = getRemoteHead();
+    assertThat(headAfterThirdSubmit.getParent(0)).isEqualTo(headAfterSecondSubmit);
+    assertApproved(change3.getChangeId());
+    assertCurrentRevision(change3.getChangeId(), 2, headAfterThirdSubmit);
+    assertSubmitter(change2.getChangeId(), 1);
+    assertSubmitter(change2.getChangeId(), 2);
+
+    assertRefUpdatedEvents(
+        initialHead,
+        headAfterFirstSubmit,
+        headAfterFirstSubmit,
+        headAfterSecondSubmit,
+        headAfterSecondSubmit,
+        headAfterThirdSubmit);
+    assertChangeMergedEvents(
+        change.getChangeId(),
+        headAfterFirstSubmit.name(),
+        change2.getChangeId(),
+        headAfterSecondSubmit.name(),
+        change3.getChangeId(),
+        headAfterThirdSubmit.name());
+  }
+
+  @Test
+  @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
+  public void submitWithContentMerge_Conflict() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+    PushOneCommit.Result change = createChange("Change 1", "a.txt", "content");
+    submit(change.getChangeId());
+
+    RevCommit newHead = getRemoteHead();
+    testRepo.reset(initialHead);
+    PushOneCommit.Result change2 = createChange("Change 2", "a.txt", "other content");
+    submitWithConflict(
+        change2.getChangeId(),
+        "Failed to submit 1 change due to the following problems:\n"
+            + "Change "
+            + change2.getChange().getId()
+            + ": Change could not be "
+            + "merged due to a path conflict. Please rebase the change locally and "
+            + "upload the rebased commit for review.");
+
+    assertThat(getRemoteHead()).isEqualTo(newHead);
+    assertCurrentRevision(change2.getChangeId(), 1, change2.getCommit());
+    assertNoSubmitter(change2.getChangeId(), 1);
+
+    assertRefUpdatedEvents(initialHead, newHead);
+    assertChangeMergedEvents(change.getChangeId(), newHead.name());
+  }
+
+  @Test
+  public void submitOutOfOrder() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+    PushOneCommit.Result change = createChange("Change 1", "a.txt", "content");
+    submit(change.getChangeId());
+
+    RevCommit headAfterFirstSubmit = getRemoteHead();
+    testRepo.reset(initialHead);
+    createChange("Change 2", "b.txt", "other content");
+    PushOneCommit.Result change3 = createChange("Change 3", "c.txt", "different content");
+    submit(change3.getChangeId());
+    assertCherryPick(testRepo, false);
+    RevCommit headAfterSecondSubmit = getRemoteHead();
+    assertThat(headAfterSecondSubmit.getParent(0)).isEqualTo(headAfterFirstSubmit);
+    assertApproved(change3.getChangeId());
+    assertCurrentRevision(change3.getChangeId(), 2, headAfterSecondSubmit);
+    assertSubmitter(change3.getChangeId(), 1);
+    assertSubmitter(change3.getChangeId(), 2);
+
+    assertRefUpdatedEvents(
+        initialHead, headAfterFirstSubmit, headAfterFirstSubmit, headAfterSecondSubmit);
+    assertChangeMergedEvents(
+        change.getChangeId(),
+        headAfterFirstSubmit.name(),
+        change3.getChangeId(),
+        headAfterSecondSubmit.name());
+  }
+
+  @Test
+  public void submitOutOfOrder_Conflict() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+    PushOneCommit.Result change = createChange("Change 1", "a.txt", "content");
+    submit(change.getChangeId());
+
+    RevCommit newHead = getRemoteHead();
+    testRepo.reset(initialHead);
+    createChange("Change 2", "b.txt", "other content");
+    PushOneCommit.Result change3 = createChange("Change 3", "b.txt", "different content");
+    submitWithConflict(
+        change3.getChangeId(),
+        "Failed to submit 1 change due to the following problems:\n"
+            + "Change "
+            + change3.getChange().getId()
+            + ": Change could not be "
+            + "merged due to a path conflict. Please rebase the change locally and "
+            + "upload the rebased commit for review.");
+
+    assertThat(getRemoteHead()).isEqualTo(newHead);
+    assertCurrentRevision(change3.getChangeId(), 1, change3.getCommit());
+    assertNoSubmitter(change3.getChangeId(), 1);
+
+    assertRefUpdatedEvents(initialHead, newHead);
+    assertChangeMergedEvents(change.getChangeId(), newHead.name());
+  }
+
+  @Test
+  public void submitMultipleChanges() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+
+    testRepo.reset(initialHead);
+    PushOneCommit.Result change = createChange("Change 1", "b", "b");
+
+    testRepo.reset(initialHead);
+    PushOneCommit.Result change2 = createChange("Change 2", "c", "c");
+
+    testRepo.reset(initialHead);
+    PushOneCommit.Result change3 = createChange("Change 3", "d", "d");
+
+    approve(change.getChangeId());
+    approve(change2.getChangeId());
+    submit(change3.getChangeId());
+
+    List<RevCommit> log = getRemoteLog();
+    assertThat(log.get(0).getShortMessage()).isEqualTo(change3.getCommit().getShortMessage());
+    assertThat(log.get(1).getId()).isEqualTo(initialHead.getId());
+
+    assertNew(change.getChangeId());
+    assertNew(change2.getChangeId());
+
+    assertRefUpdatedEvents(initialHead, log.get(0));
+    assertChangeMergedEvents(change3.getChangeId(), log.get(0).name());
+  }
+
+  @Test
+  public void submitDependentNonConflictingChangesOutOfOrder() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+
+    testRepo.reset(initialHead);
+    PushOneCommit.Result change = createChange("Change 1", "b", "b");
+    PushOneCommit.Result change2 = createChange("Change 2", "c", "c");
+    assertThat(change2.getCommit().getParent(0)).isEqualTo(change.getCommit());
+
+    // Submit succeeds; change2 is successfully cherry-picked onto head.
+    submit(change2.getChangeId());
+    RevCommit headAfterFirstSubmit = getRemoteHead();
+    // Submit succeeds; change is successfully cherry-picked onto head
+    // (which was change2's cherry-pick).
+    submit(change.getChangeId());
+    RevCommit headAfterSecondSubmit = getRemoteHead();
+
+    // change is the new tip.
+    List<RevCommit> log = getRemoteLog();
+    assertThat(log.get(0).getShortMessage()).isEqualTo(change.getCommit().getShortMessage());
+    assertThat(log.get(0).getParent(0)).isEqualTo(log.get(1));
+
+    assertThat(log.get(1).getShortMessage()).isEqualTo(change2.getCommit().getShortMessage());
+    assertThat(log.get(1).getParent(0)).isEqualTo(log.get(2));
+
+    assertThat(log.get(2).getId()).isEqualTo(initialHead.getId());
+
+    assertRefUpdatedEvents(
+        initialHead, headAfterFirstSubmit, headAfterFirstSubmit, headAfterSecondSubmit);
+    assertChangeMergedEvents(
+        change2.getChangeId(),
+        headAfterFirstSubmit.name(),
+        change.getChangeId(),
+        headAfterSecondSubmit.name());
+  }
+
+  @Test
+  public void submitDependentConflictingChangesOutOfOrder() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+
+    testRepo.reset(initialHead);
+    PushOneCommit.Result change = createChange("Change 1", "b", "b1");
+    PushOneCommit.Result change2 = createChange("Change 2", "b", "b2");
+    assertThat(change2.getCommit().getParent(0)).isEqualTo(change.getCommit());
+
+    // Submit fails; change2 contains the delta "b1" -> "b2", which cannot be
+    // applied against tip.
+    submitWithConflict(
+        change2.getChangeId(),
+        "Failed to submit 1 change due to the following problems:\n"
+            + "Change "
+            + change2.getChange().getId()
+            + ": Change could not be "
+            + "merged due to a path conflict. Please rebase the change locally and "
+            + "upload the rebased commit for review.");
+
+    ChangeInfo info3 = get(change2.getChangeId(), ListChangesOption.MESSAGES);
+    assertThat(info3.status).isEqualTo(ChangeStatus.NEW);
+
+    // Tip has not changed.
+    List<RevCommit> log = getRemoteLog();
+    assertThat(log.get(0)).isEqualTo(initialHead.getId());
+    assertNoSubmitter(change2.getChangeId(), 1);
+
+    assertRefUpdatedEvents();
+    assertChangeMergedEvents();
+  }
+
+  @Test
+  public void submitSubsetOfDependentChanges() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+
+    testRepo.reset(initialHead);
+    PushOneCommit.Result change = createChange("Change 1", "b", "b");
+    PushOneCommit.Result change2 = createChange("Change 2", "c", "c");
+    PushOneCommit.Result change3 = createChange("Change 3", "e", "e");
+
+    // Out of the above, only submit change 3. Changes 1 and 2 are not
+    // related to change 3 by topic or ancestor (due to cherrypicking!)
+    approve(change2.getChangeId());
+    submit(change3.getChangeId());
+    RevCommit newHead = getRemoteHead();
+
+    assertNew(change.getChangeId());
+    assertNew(change2.getChangeId());
+
+    assertRefUpdatedEvents(initialHead, newHead);
+    assertChangeMergedEvents(change3.getChangeId(), newHead.name());
+  }
+
+  @Test
+  @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
+  public void submitIdenticalTree() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+
+    PushOneCommit.Result change1 = createChange("Change 1", "a.txt", "a");
+
+    testRepo.reset(initialHead);
+    PushOneCommit.Result change2 = createChange("Change 2", "a.txt", "a");
+
+    submit(change1.getChangeId());
+    RevCommit headAfterFirstSubmit = getRemoteHead();
+    assertThat(headAfterFirstSubmit.getShortMessage()).isEqualTo("Change 1");
+
+    submit(change2.getChangeId(), new SubmitInput(), null, null);
+
+    assertThat(getRemoteHead()).isEqualTo(headAfterFirstSubmit);
+
+    ChangeInfo info2 = get(change2.getChangeId(), MESSAGES);
+    assertThat(info2.status).isEqualTo(ChangeStatus.MERGED);
+    assertThat(Iterables.getLast(info2.messages).message)
+        .isEqualTo(CommitMergeStatus.SKIPPED_IDENTICAL_TREE.getDescription());
+
+    assertRefUpdatedEvents(initialHead, headAfterFirstSubmit);
+    assertChangeMergedEvents(
+        change1.getChangeId(),
+        headAfterFirstSubmit.name(),
+        change2.getChangeId(),
+        headAfterFirstSubmit.name());
+  }
+
+  @Test
+  public void repairChangeStateAfterFailure() throws Exception {
+    // In NoteDb-only mode, repo and meta updates are atomic (at least in InMemoryRepository).
+    assume().that(notesMigration.disableChangeReviewDb()).isFalse();
+
+    RevCommit initialHead = getRemoteHead();
+    PushOneCommit.Result change = createChange("Change 1", "a.txt", "content");
+    submit(change.getChangeId());
+
+    RevCommit headAfterFirstSubmit = getRemoteHead();
+    testRepo.reset(initialHead);
+    PushOneCommit.Result change2 = createChange("Change 2", "b.txt", "other content");
+    Change.Id id2 = change2.getChange().getId();
+    TestSubmitInput failInput = new TestSubmitInput();
+    failInput.failAfterRefUpdates = true;
+    submit(
+        change2.getChangeId(),
+        failInput,
+        ResourceConflictException.class,
+        "Failing after ref updates");
+    RevCommit headAfterFailedSubmit = getRemoteHead();
+
+    // Bad: ref advanced but change wasn't updated.
+    PatchSet.Id psId1 = new PatchSet.Id(id2, 1);
+    PatchSet.Id psId2 = new PatchSet.Id(id2, 2);
+    ChangeInfo info = gApi.changes().id(id2.get()).get();
+    assertThat(info.status).isEqualTo(ChangeStatus.NEW);
+    assertThat(info.revisions.get(info.currentRevision)._number).isEqualTo(1);
+    assertThat(getPatchSet(psId2)).isNull();
+
+    ObjectId rev2;
+    try (Repository repo = repoManager.openRepository(project);
+        RevWalk rw = new RevWalk(repo)) {
+      ObjectId rev1 = repo.exactRef(psId1.toRefName()).getObjectId();
+      assertThat(rev1).isNotNull();
+
+      rev2 = repo.exactRef(psId2.toRefName()).getObjectId();
+      assertThat(rev2).isNotNull();
+      assertThat(rev2).isNotEqualTo(rev1);
+      assertThat(rw.parseCommit(rev2).getParent(0)).isEqualTo(headAfterFirstSubmit);
+
+      assertThat(repo.exactRef("refs/heads/master").getObjectId()).isEqualTo(rev2);
+    }
+
+    submit(change2.getChangeId());
+
+    // Change status and patch set entities were updated, and branch tip stayed
+    // the same.
+    RevCommit headAfterSecondSubmit = getRemoteHead();
+    assertThat(headAfterSecondSubmit).isEqualTo(headAfterFailedSubmit);
+    info = gApi.changes().id(id2.get()).get();
+    assertThat(info.status).isEqualTo(ChangeStatus.MERGED);
+    assertThat(info.revisions.get(info.currentRevision)._number).isEqualTo(2);
+    PatchSet ps2 = getPatchSet(psId2);
+    assertThat(ps2).isNotNull();
+    assertThat(ps2.getRevision().get()).isEqualTo(rev2.name());
+    assertThat(Iterables.getLast(info.messages).message)
+        .isEqualTo(
+            "Change has been successfully cherry-picked as " + rev2.name() + " by Administrator");
+
+    try (Repository repo = repoManager.openRepository(project)) {
+      assertThat(repo.exactRef("refs/heads/master").getObjectId()).isEqualTo(rev2);
+    }
+
+    assertRefUpdatedEvents(initialHead, headAfterFirstSubmit);
+    assertChangeMergedEvents(
+        change.getChangeId(),
+        headAfterFirstSubmit.name(),
+        change2.getChangeId(),
+        headAfterSecondSubmit.name());
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/SubmitByFastForwardIT.java b/javatests/com/google/gerrit/acceptance/rest/change/SubmitByFastForwardIT.java
new file mode 100644
index 0000000..ea8b98a
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/change/SubmitByFastForwardIT.java
@@ -0,0 +1,220 @@
+// Copyright (C) 2013 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.google.gerrit.acceptance.rest.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static com.google.gerrit.acceptance.GitUtil.pushHead;
+
+import com.google.common.collect.Iterables;
+import com.google.gerrit.acceptance.GitUtil;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.client.ChangeStatus;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.extensions.common.ActionInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.change.TestSubmitInput;
+import java.util.Map;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.PushResult;
+import org.junit.Test;
+
+public class SubmitByFastForwardIT extends AbstractSubmit {
+
+  @Override
+  protected SubmitType getSubmitType() {
+    return SubmitType.FAST_FORWARD_ONLY;
+  }
+
+  @Test
+  public void submitWithFastForward() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+    PushOneCommit.Result change = createChange();
+    submit(change.getChangeId());
+    RevCommit updatedHead = getRemoteHead();
+    assertThat(updatedHead.getId()).isEqualTo(change.getCommit());
+    assertThat(updatedHead.getParent(0)).isEqualTo(initialHead);
+    assertSubmitter(change.getChangeId(), 1);
+
+    assertRefUpdatedEvents(initialHead, updatedHead);
+    assertChangeMergedEvents(change.getChangeId(), updatedHead.name());
+  }
+
+  @Test
+  public void submitMultipleChangesWithFastForward() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+
+    PushOneCommit.Result change = createChange();
+    PushOneCommit.Result change2 = createChange();
+    PushOneCommit.Result change3 = createChange();
+
+    String id1 = change.getChangeId();
+    String id2 = change2.getChangeId();
+    String id3 = change3.getChangeId();
+    approve(id1);
+    approve(id2);
+    submit(id3);
+
+    RevCommit updatedHead = getRemoteHead();
+    assertThat(updatedHead.getId()).isEqualTo(change3.getCommit());
+    assertThat(updatedHead.getParent(0).getId()).isEqualTo(change2.getCommit());
+    assertSubmitter(change.getChangeId(), 1);
+    assertSubmitter(change2.getChangeId(), 1);
+    assertSubmitter(change3.getChangeId(), 1);
+    assertPersonEquals(admin.getIdent(), updatedHead.getAuthorIdent());
+    assertPersonEquals(admin.getIdent(), updatedHead.getCommitterIdent());
+    assertSubmittedTogether(id1, id3, id2, id1);
+    assertSubmittedTogether(id2, id3, id2, id1);
+    assertSubmittedTogether(id3, id3, id2, id1);
+
+    assertRefUpdatedEvents(initialHead, updatedHead);
+    assertChangeMergedEvents(
+        id1, updatedHead.name(), id2, updatedHead.name(), id3, updatedHead.name());
+  }
+
+  @Test
+  public void submitTwoChangesWithFastForward_missingDependency() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+    PushOneCommit.Result change1 = createChange();
+    PushOneCommit.Result change2 = createChange();
+
+    Change.Id id1 = change1.getPatchSetId().getParentKey();
+    submitWithConflict(
+        change2.getChangeId(),
+        "Failed to submit 2 changes due to the following problems:\n"
+            + "Change "
+            + id1
+            + ": needs Code-Review");
+
+    RevCommit updatedHead = getRemoteHead();
+    assertThat(updatedHead.getId()).isEqualTo(initialHead.getId());
+    assertRefUpdatedEvents();
+    assertChangeMergedEvents();
+  }
+
+  @Test
+  public void submitFastForwardNotPossible_Conflict() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+    PushOneCommit.Result change = createChange("Change 1", "a.txt", "content");
+    submit(change.getChangeId());
+
+    RevCommit headAfterFirstSubmit = getRemoteHead();
+    testRepo.reset(initialHead);
+    PushOneCommit.Result change2 = createChange("Change 2", "b.txt", "other content");
+
+    approve(change2.getChangeId());
+
+    Map<String, ActionInfo> actions =
+        gApi.changes().id(change2.getChangeId()).revision(1).actions();
+
+    assertThat(actions).containsKey("submit");
+    ActionInfo info = actions.get("submit");
+    assertThat(info.enabled).isNull();
+
+    submitWithConflict(
+        change2.getChangeId(),
+        "Failed to submit 1 change due to the following problems:\n"
+            + "Change "
+            + change2.getChange().getId()
+            + ": Project policy requires "
+            + "all submissions to be a fast-forward. Please rebase the change "
+            + "locally and upload again for review.");
+    assertThat(getRemoteHead()).isEqualTo(headAfterFirstSubmit);
+    assertSubmitter(change.getChangeId(), 1);
+
+    assertRefUpdatedEvents(initialHead, headAfterFirstSubmit);
+    assertChangeMergedEvents(change.getChangeId(), headAfterFirstSubmit.name());
+  }
+
+  @Test
+  public void repairChangeStateAfterFailure() throws Exception {
+    // In NoteDb-only mode, repo and meta updates are atomic (at least in InMemoryRepository).
+    assume().that(notesMigration.disableChangeReviewDb()).isFalse();
+
+    PushOneCommit.Result change = createChange("Change 1", "a.txt", "content");
+    Change.Id id = change.getChange().getId();
+    TestSubmitInput failInput = new TestSubmitInput();
+    failInput.failAfterRefUpdates = true;
+    submit(
+        change.getChangeId(),
+        failInput,
+        ResourceConflictException.class,
+        "Failing after ref updates");
+
+    // Bad: ref advanced but change wasn't updated.
+    PatchSet.Id psId = new PatchSet.Id(id, 1);
+    ChangeInfo info = gApi.changes().id(id.get()).get();
+    assertThat(info.status).isEqualTo(ChangeStatus.NEW);
+    assertThat(info.revisions.get(info.currentRevision)._number).isEqualTo(1);
+
+    ObjectId rev;
+    try (Repository repo = repoManager.openRepository(project);
+        RevWalk rw = new RevWalk(repo)) {
+      rev = repo.exactRef(psId.toRefName()).getObjectId();
+      assertThat(rev).isNotNull();
+      assertThat(repo.exactRef("refs/heads/master").getObjectId()).isEqualTo(rev);
+    }
+
+    submit(change.getChangeId());
+
+    // Change status was updated, and branch tip stayed the same.
+    info = gApi.changes().id(id.get()).get();
+    assertThat(info.status).isEqualTo(ChangeStatus.MERGED);
+    assertThat(info.revisions.get(info.currentRevision)._number).isEqualTo(1);
+    assertThat(Iterables.getLast(info.messages).message)
+        .isEqualTo("Change has been successfully merged by Administrator");
+
+    try (Repository repo = repoManager.openRepository(project)) {
+      assertThat(repo.exactRef("refs/heads/master").getObjectId()).isEqualTo(rev);
+    }
+
+    assertRefUpdatedEvents();
+    assertChangeMergedEvents(change.getChangeId(), getRemoteHead().name());
+  }
+
+  @Test
+  public void submitSameCommitsAsInExperimentalBranch() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+
+    grant(project, "refs/heads/*", Permission.CREATE);
+    grant(project, "refs/heads/experimental", Permission.PUSH);
+
+    RevCommit c1 = commitBuilder().add("b.txt", "1").message("commit at tip").create();
+    String id1 = GitUtil.getChangeId(testRepo, c1).get();
+
+    PushResult r1 = pushHead(testRepo, "refs/for/master", false);
+    assertThat(r1.getRemoteUpdate("refs/for/master").getNewObjectId()).isEqualTo(c1.getId());
+
+    PushResult r2 = pushHead(testRepo, "refs/heads/experimental", false);
+    assertThat(r2.getRemoteUpdate("refs/heads/experimental").getNewObjectId())
+        .isEqualTo(c1.getId());
+
+    submit(id1);
+    RevCommit headAfterSubmit = getRemoteHead();
+
+    assertThat(getRemoteHead().getId()).isEqualTo(c1.getId());
+    assertSubmitter(id1, 1);
+
+    assertRefUpdatedEvents(initialHead, headAfterSubmit);
+    assertChangeMergedEvents(id1, headAfterSubmit.name());
+  }
+}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeAlwaysIT.java b/javatests/com/google/gerrit/acceptance/rest/change/SubmitByMergeAlwaysIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeAlwaysIT.java
rename to javatests/com/google/gerrit/acceptance/rest/change/SubmitByMergeAlwaysIT.java
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/SubmitByMergeIfNecessaryIT.java b/javatests/com/google/gerrit/acceptance/rest/change/SubmitByMergeIfNecessaryIT.java
new file mode 100644
index 0000000..c1dda00
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/change/SubmitByMergeIfNecessaryIT.java
@@ -0,0 +1,732 @@
+// Copyright (C) 2013 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.google.gerrit.acceptance.rest.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+
+import com.google.gerrit.acceptance.GitUtil;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.changes.ChangeApi;
+import com.google.gerrit.extensions.api.changes.CherryPickInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.changes.SubmitInput;
+import com.google.gerrit.extensions.api.projects.BranchInput;
+import com.google.gerrit.extensions.client.ChangeStatus;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.extensions.restapi.BinaryResult;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import java.io.File;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.zip.GZIPInputStream;
+import org.apache.commons.compress.archivers.ArchiveStreamFactory;
+import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
+import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.transport.RefSpec;
+import org.junit.Test;
+
+public class SubmitByMergeIfNecessaryIT extends AbstractSubmitByMerge {
+
+  @Override
+  protected SubmitType getSubmitType() {
+    return SubmitType.MERGE_IF_NECESSARY;
+  }
+
+  @Test
+  public void submitWithFastForward() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+    PushOneCommit.Result change = createChange();
+    submit(change.getChangeId());
+    RevCommit updatedHead = getRemoteHead();
+    assertThat(updatedHead.getId()).isEqualTo(change.getCommit());
+    assertThat(updatedHead.getParent(0)).isEqualTo(initialHead);
+    assertSubmitter(change.getChangeId(), 1);
+    assertPersonEquals(admin.getIdent(), updatedHead.getAuthorIdent());
+    assertPersonEquals(admin.getIdent(), updatedHead.getCommitterIdent());
+
+    assertRefUpdatedEvents(initialHead, updatedHead);
+    assertChangeMergedEvents(change.getChangeId(), updatedHead.name());
+  }
+
+  @Test
+  public void submitMultipleChanges() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+
+    testRepo.reset(initialHead);
+    PushOneCommit.Result change = createChange("Change 1", "b", "b");
+
+    testRepo.reset(initialHead);
+    PushOneCommit.Result change2 = createChange("Change 2", "c", "c");
+
+    testRepo.reset(initialHead);
+    PushOneCommit.Result change3 = createChange("Change 3", "d", "d");
+    PushOneCommit.Result change4 = createChange("Change 4", "e", "e");
+    PushOneCommit.Result change5 = createChange("Change 5", "f", "f");
+
+    // Change 2 is a fast-forward, no need to merge.
+    submit(change2.getChangeId());
+
+    RevCommit headAfterFirstSubmit = getRemoteLog().get(0);
+    assertThat(headAfterFirstSubmit.getShortMessage())
+        .isEqualTo(change2.getCommit().getShortMessage());
+    assertThat(headAfterFirstSubmit.getParent(0).getId()).isEqualTo(initialHead.getId());
+    assertPersonEquals(admin.getIdent(), headAfterFirstSubmit.getAuthorIdent());
+    assertPersonEquals(admin.getIdent(), headAfterFirstSubmit.getCommitterIdent());
+
+    // We need to merge changes 3, 4 and 5.
+    approve(change3.getChangeId());
+    approve(change4.getChangeId());
+    submit(change5.getChangeId());
+
+    RevCommit headAfterSecondSubmit = getRemoteLog().get(0);
+    assertThat(headAfterSecondSubmit.getParent(1).getShortMessage())
+        .isEqualTo(change5.getCommit().getShortMessage());
+    assertThat(headAfterSecondSubmit.getParent(0).getShortMessage())
+        .isEqualTo(change2.getCommit().getShortMessage());
+
+    assertPersonEquals(admin.getIdent(), headAfterSecondSubmit.getAuthorIdent());
+    assertPersonEquals(serverIdent.get(), headAfterSecondSubmit.getCommitterIdent());
+
+    // First change stays untouched.
+    assertNew(change.getChangeId());
+
+    // The two submit operations should have resulted in two ref-update events
+    // and three change-merged events.
+    assertRefUpdatedEvents(
+        initialHead, headAfterFirstSubmit, headAfterFirstSubmit, headAfterSecondSubmit);
+    assertChangeMergedEvents(
+        change2.getChangeId(),
+        headAfterFirstSubmit.name(),
+        change3.getChangeId(),
+        headAfterSecondSubmit.name(),
+        change4.getChangeId(),
+        headAfterSecondSubmit.name(),
+        change5.getChangeId(),
+        headAfterSecondSubmit.name());
+  }
+
+  @Test
+  public void submitChangesAcrossRepos() throws Exception {
+    Project.NameKey p1 = createProject("project-where-we-submit");
+    Project.NameKey p2 = createProject("project-impacted-via-topic");
+    Project.NameKey p3 = createProject("project-impacted-indirectly-via-topic");
+
+    RevCommit initialHead2 = getRemoteHead(p2, "master");
+    RevCommit initialHead3 = getRemoteHead(p3, "master");
+
+    TestRepository<?> repo1 = cloneProject(p1);
+    TestRepository<?> repo2 = cloneProject(p2);
+    TestRepository<?> repo3 = cloneProject(p3);
+
+    PushOneCommit.Result change1a =
+        createChange(
+            repo1,
+            "master",
+            "An ancestor of the change we want to submit",
+            "a.txt",
+            "1",
+            "dependent-topic");
+    PushOneCommit.Result change1b =
+        createChange(
+            repo1,
+            "master",
+            "We're interested in submitting this change",
+            "a.txt",
+            "2",
+            "topic-to-submit");
+
+    PushOneCommit.Result change2a =
+        createChange(repo2, "master", "indirection level 1", "a.txt", "1", "topic-indirect");
+    PushOneCommit.Result change2b =
+        createChange(
+            repo2, "master", "should go in with first change", "a.txt", "2", "dependent-topic");
+
+    PushOneCommit.Result change3 =
+        createChange(repo3, "master", "indirection level 2", "a.txt", "1", "topic-indirect");
+
+    approve(change1a.getChangeId());
+    approve(change2a.getChangeId());
+    approve(change2b.getChangeId());
+    approve(change3.getChangeId());
+
+    // get a preview before submitting:
+    Map<Branch.NameKey, ObjectId> preview = fetchFromSubmitPreview(change1b.getChangeId());
+    submit(change1b.getChangeId());
+
+    RevCommit tip1 = getRemoteLog(p1, "master").get(0);
+    RevCommit tip2 = getRemoteLog(p2, "master").get(0);
+    RevCommit tip3 = getRemoteLog(p3, "master").get(0);
+
+    assertThat(tip1.getShortMessage()).isEqualTo(change1b.getCommit().getShortMessage());
+
+    if (isSubmitWholeTopicEnabled()) {
+      assertThat(tip2.getShortMessage()).isEqualTo(change2b.getCommit().getShortMessage());
+      assertThat(tip3.getShortMessage()).isEqualTo(change3.getCommit().getShortMessage());
+
+      // check that the preview matched what happened:
+      assertThat(preview).hasSize(3);
+
+      assertThat(preview).containsKey(new Branch.NameKey(p1, "refs/heads/master"));
+      assertTrees(p1, preview);
+
+      assertThat(preview).containsKey(new Branch.NameKey(p2, "refs/heads/master"));
+      assertTrees(p2, preview);
+
+      assertThat(preview).containsKey(new Branch.NameKey(p3, "refs/heads/master"));
+      assertTrees(p3, preview);
+    } else {
+      assertThat(tip2.getShortMessage()).isEqualTo(initialHead2.getShortMessage());
+      assertThat(tip3.getShortMessage()).isEqualTo(initialHead3.getShortMessage());
+      assertThat(preview).hasSize(1);
+      assertThat(preview.get(new Branch.NameKey(p1, "refs/heads/master"))).isNotNull();
+    }
+  }
+
+  @Test
+  public void submitChangesAcrossReposBlocked() throws Exception {
+    Project.NameKey p1 = createProject("project-where-we-submit");
+    Project.NameKey p2 = createProject("project-impacted-via-topic");
+    Project.NameKey p3 = createProject("project-impacted-indirectly-via-topic");
+
+    TestRepository<?> repo1 = cloneProject(p1);
+    TestRepository<?> repo2 = cloneProject(p2);
+    TestRepository<?> repo3 = cloneProject(p3);
+
+    RevCommit initialHead1 = getRemoteHead(p1, "master");
+    RevCommit initialHead2 = getRemoteHead(p2, "master");
+    RevCommit initialHead3 = getRemoteHead(p3, "master");
+
+    PushOneCommit.Result change1a =
+        createChange(
+            repo1,
+            "master",
+            "An ancestor of the change we want to submit",
+            "a.txt",
+            "1",
+            "dependent-topic");
+    PushOneCommit.Result change1b =
+        createChange(
+            repo1,
+            "master",
+            "we're interested to submit this change",
+            "a.txt",
+            "2",
+            "topic-to-submit");
+
+    PushOneCommit.Result change2a =
+        createChange(repo2, "master", "indirection level 2a", "a.txt", "1", "topic-indirect");
+    PushOneCommit.Result change2b =
+        createChange(
+            repo2, "master", "should go in with first change", "a.txt", "2", "dependent-topic");
+
+    PushOneCommit.Result change3 =
+        createChange(repo3, "master", "indirection level 2b", "a.txt", "1", "topic-indirect");
+
+    // Create a merge conflict for change3 which is only indirectly related
+    // via topics.
+    repo3.reset(initialHead3);
+    PushOneCommit.Result change3Conflict =
+        createChange(repo3, "master", "conflicting change", "a.txt", "2\n2", "conflicting-topic");
+    submit(change3Conflict.getChangeId());
+    RevCommit tipConflict = getRemoteLog(p3, "master").get(0);
+    assertThat(tipConflict.getShortMessage())
+        .isEqualTo(change3Conflict.getCommit().getShortMessage());
+
+    approve(change1a.getChangeId());
+    approve(change2a.getChangeId());
+    approve(change2b.getChangeId());
+    approve(change3.getChangeId());
+
+    if (isSubmitWholeTopicEnabled()) {
+      String msg =
+          "Failed to submit 5 changes due to the following problems:\n"
+              + "Change "
+              + change3.getChange().getId()
+              + ": Change could not be "
+              + "merged due to a path conflict. Please rebase the change locally "
+              + "and upload the rebased commit for review.";
+
+      // Get a preview before submitting:
+      try (BinaryResult r = gApi.changes().id(change1b.getChangeId()).current().submitPreview()) {
+        // We cannot just use the ExpectedException infrastructure as provided
+        // by AbstractDaemonTest, as then we'd stop early and not test the
+        // actual submit.
+
+        fail("expected failure");
+      } catch (RestApiException e) {
+        assertThat(e.getMessage()).isEqualTo(msg);
+      }
+      submitWithConflict(change1b.getChangeId(), msg);
+    } else {
+      submit(change1b.getChangeId());
+    }
+
+    RevCommit tip1 = getRemoteLog(p1, "master").get(0);
+    RevCommit tip2 = getRemoteLog(p2, "master").get(0);
+    RevCommit tip3 = getRemoteLog(p3, "master").get(0);
+    if (isSubmitWholeTopicEnabled()) {
+      assertThat(tip1.getShortMessage()).isEqualTo(initialHead1.getShortMessage());
+      assertThat(tip2.getShortMessage()).isEqualTo(initialHead2.getShortMessage());
+      assertThat(tip3.getShortMessage()).isEqualTo(change3Conflict.getCommit().getShortMessage());
+      assertNoSubmitter(change1a.getChangeId(), 1);
+      assertNoSubmitter(change2a.getChangeId(), 1);
+      assertNoSubmitter(change2b.getChangeId(), 1);
+      assertNoSubmitter(change3.getChangeId(), 1);
+    } else {
+      assertThat(tip1.getShortMessage()).isEqualTo(change1b.getCommit().getShortMessage());
+      assertThat(tip2.getShortMessage()).isEqualTo(initialHead2.getShortMessage());
+      assertThat(tip3.getShortMessage()).isEqualTo(change3Conflict.getCommit().getShortMessage());
+      assertNoSubmitter(change2a.getChangeId(), 1);
+      assertNoSubmitter(change2b.getChangeId(), 1);
+      assertNoSubmitter(change3.getChangeId(), 1);
+    }
+  }
+
+  @Test
+  public void submitWithMergedAncestorsOnOtherBranch() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+
+    PushOneCommit.Result change1 =
+        createChange(testRepo, "master", "base commit", "a.txt", "1", "");
+    submit(change1.getChangeId());
+    RevCommit headAfterFirstSubmit = getRemoteHead();
+
+    gApi.projects().name(project.get()).branch("branch").create(new BranchInput());
+
+    PushOneCommit.Result change2 =
+        createChange(
+            testRepo, "master", "We want to commit this to master first", "a.txt", "2", "");
+
+    submit(change2.getChangeId());
+
+    RevCommit headAfterSecondSubmit = getRemoteLog(project, "master").get(0);
+    assertThat(headAfterSecondSubmit.getShortMessage())
+        .isEqualTo(change2.getCommit().getShortMessage());
+
+    RevCommit tip2 = getRemoteLog(project, "branch").get(0);
+    assertThat(tip2.getShortMessage()).isEqualTo(change1.getCommit().getShortMessage());
+
+    PushOneCommit.Result change3 =
+        createChange(
+            testRepo,
+            "branch",
+            "This commit is based on master, which includes change2, "
+                + "but is targeted at branch, which doesn't include it.",
+            "a.txt",
+            "3",
+            "");
+
+    submit(change3.getChangeId());
+
+    List<RevCommit> log3 = getRemoteLog(project, "branch");
+    assertThat(log3.get(0).getShortMessage()).isEqualTo(change3.getCommit().getShortMessage());
+    assertThat(log3.get(1).getShortMessage()).isEqualTo(change2.getCommit().getShortMessage());
+
+    assertRefUpdatedEvents(
+        initialHead, headAfterFirstSubmit, headAfterFirstSubmit, headAfterSecondSubmit);
+    assertChangeMergedEvents(
+        change1.getChangeId(),
+        headAfterFirstSubmit.name(),
+        change2.getChangeId(),
+        headAfterSecondSubmit.name());
+  }
+
+  @Test
+  public void submitWithOpenAncestorsOnOtherBranch() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+    PushOneCommit.Result change1 =
+        createChange(testRepo, "master", "base commit", "a.txt", "1", "");
+    submit(change1.getChangeId());
+    RevCommit headAfterFirstSubmit = getRemoteHead();
+
+    gApi.projects().name(project.get()).branch("branch").create(new BranchInput());
+
+    PushOneCommit.Result change2 =
+        createChange(
+            testRepo, "master", "We want to commit this to master first", "a.txt", "2", "");
+
+    approve(change2.getChangeId());
+
+    RevCommit tip1 = getRemoteLog(project, "master").get(0);
+    assertThat(tip1.getShortMessage()).isEqualTo(change1.getCommit().getShortMessage());
+
+    RevCommit tip2 = getRemoteLog(project, "branch").get(0);
+    assertThat(tip2.getShortMessage()).isEqualTo(change1.getCommit().getShortMessage());
+
+    PushOneCommit.Result change3a =
+        createChange(
+            testRepo,
+            "branch",
+            "This commit is based on change2 pending for master, "
+                + "but is targeted itself at branch, which doesn't include it.",
+            "a.txt",
+            "3",
+            "a-topic-here");
+
+    Project.NameKey p3 = createProject("project-related-to-change3");
+    TestRepository<?> repo3 = cloneProject(p3);
+    RevCommit repo3Head = getRemoteHead(p3, "master");
+    PushOneCommit.Result change3b =
+        createChange(
+            repo3,
+            "master",
+            "some accompanying changes for change3a in another repo tied together via topic",
+            "a.txt",
+            "1",
+            "a-topic-here");
+    approve(change3b.getChangeId());
+
+    String cnt = isSubmitWholeTopicEnabled() ? "2 changes" : "1 change";
+    submitWithConflict(
+        change3a.getChangeId(),
+        "Failed to submit "
+            + cnt
+            + " due to the following problems:\n"
+            + "Change "
+            + change3a.getChange().getId()
+            + ": Depends on change that"
+            + " was not submitted."
+            + " Commit "
+            + change3a.getCommit().name()
+            + " depends on commit "
+            + change2.getCommit().name()
+            + " of change "
+            + change2.getChange().getId()
+            + " which cannot be merged.");
+
+    RevCommit tipbranch = getRemoteLog(project, "branch").get(0);
+    assertThat(tipbranch.getShortMessage()).isEqualTo(change1.getCommit().getShortMessage());
+
+    RevCommit tipmaster = getRemoteLog(p3, "master").get(0);
+    assertThat(tipmaster.getShortMessage()).isEqualTo(repo3Head.getShortMessage());
+
+    assertRefUpdatedEvents(initialHead, headAfterFirstSubmit);
+    assertChangeMergedEvents(change1.getChangeId(), headAfterFirstSubmit.name());
+  }
+
+  @Test
+  public void gerritWorkflow() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+
+    // We'll setup a master and a stable branch.
+    // Then we create a change to be applied to master, which is
+    // then cherry picked back to stable. The stable branch will
+    // be merged up into master again.
+    gApi.projects().name(project.get()).branch("stable").create(new BranchInput());
+
+    // Push a change to master
+    PushOneCommit push =
+        pushFactory.create(db, user.getIdent(), testRepo, "small fix", "a.txt", "2");
+    PushOneCommit.Result change = push.to("refs/for/master");
+    submit(change.getChangeId());
+    RevCommit headAfterFirstSubmit = getRemoteLog(project, "master").get(0);
+    assertThat(headAfterFirstSubmit.getShortMessage())
+        .isEqualTo(change.getCommit().getShortMessage());
+
+    // Now cherry pick to stable
+    CherryPickInput in = new CherryPickInput();
+    in.destination = "stable";
+    in.message = "This goes to stable as well\n" + headAfterFirstSubmit.getFullMessage();
+    ChangeApi orig = gApi.changes().id(change.getChangeId());
+    String cherryId = orig.current().cherryPick(in).id();
+    gApi.changes().id(cherryId).current().review(ReviewInput.approve());
+    gApi.changes().id(cherryId).current().submit();
+
+    // Create the merge locally
+    RevCommit stable = getRemoteHead(project, "stable");
+    RevCommit master = getRemoteHead(project, "master");
+    testRepo.git().fetch().call();
+    testRepo.git().branchCreate().setName("stable").setStartPoint(stable).call();
+    testRepo.git().branchCreate().setName("master").setStartPoint(master).call();
+
+    RevCommit merge =
+        testRepo
+            .commit()
+            .parent(master)
+            .parent(stable)
+            .message("Merge stable into master")
+            .insertChangeId()
+            .create();
+
+    testRepo.branch("refs/heads/master").update(merge);
+    testRepo.git().push().setRefSpecs(new RefSpec("refs/heads/master:refs/for/master")).call();
+
+    String changeId = GitUtil.getChangeId(testRepo, merge).get();
+    approve(changeId);
+    submit(changeId);
+    RevCommit headAfterSecondSubmit = getRemoteLog(project, "master").get(0);
+    assertThat(headAfterSecondSubmit.getShortMessage()).isEqualTo(merge.getShortMessage());
+
+    assertRefUpdatedEvents(
+        initialHead, headAfterFirstSubmit, headAfterFirstSubmit, headAfterSecondSubmit);
+    assertChangeMergedEvents(
+        change.getChangeId(), headAfterFirstSubmit.name(), changeId, headAfterSecondSubmit.name());
+  }
+
+  @Test
+  public void openChangeForTargetBranchPreventsMerge() throws Exception {
+    gApi.projects().name(project.get()).branch("stable").create(new BranchInput());
+
+    // Propose a change for master, but leave it open for master!
+    PushOneCommit change =
+        pushFactory.create(db, user.getIdent(), testRepo, "small fix", "a.txt", "2");
+    PushOneCommit.Result change2result = change.to("refs/for/master");
+
+    // Now cherry pick to stable
+    CherryPickInput in = new CherryPickInput();
+    in.destination = "stable";
+    in.message = "it goes to stable branch";
+    ChangeApi orig = gApi.changes().id(change2result.getChangeId());
+    ChangeApi cherry = orig.current().cherryPick(in);
+    cherry.current().review(ReviewInput.approve());
+    cherry.current().submit();
+
+    // Create a commit locally
+    testRepo.git().fetch().setRefSpecs(new RefSpec("refs/heads/stable")).call();
+
+    PushOneCommit.Result change3 = createChange(testRepo, "stable", "test", "a.txt", "3", "");
+    submitWithConflict(
+        change3.getChangeId(),
+        "Failed to submit 1 change due to the following problems:\n"
+            + "Change "
+            + change3.getPatchSetId().getParentKey().get()
+            + ": Depends on change that was not submitted."
+            + " Commit "
+            + change3.getCommit().name()
+            + " depends on commit "
+            + change2result.getCommit().name()
+            + " of change "
+            + change2result.getChange().getId()
+            + " which cannot be merged.");
+
+    assertRefUpdatedEvents();
+    assertChangeMergedEvents();
+  }
+
+  @Test
+  public void dependencyOnOutdatedPatchSetPreventsMerge() throws Exception {
+    // Create a change
+    PushOneCommit change = pushFactory.create(db, user.getIdent(), testRepo, "fix", "a.txt", "foo");
+    PushOneCommit.Result changeResult = change.to("refs/for/master");
+    PatchSet.Id patchSetId = changeResult.getPatchSetId();
+
+    // Create a successor change.
+    PushOneCommit change2 =
+        pushFactory.create(db, user.getIdent(), testRepo, "feature", "b.txt", "bar");
+    PushOneCommit.Result change2Result = change2.to("refs/for/master");
+
+    // Create new patch set for first change.
+    testRepo.reset(changeResult.getCommit().name());
+    amendChange(changeResult.getChangeId());
+
+    // Approve both changes
+    approve(changeResult.getChangeId());
+    approve(change2Result.getChangeId());
+
+    submitWithConflict(
+        change2Result.getChangeId(),
+        "Failed to submit 2 changes due to the following problems:\n"
+            + "Change "
+            + change2Result.getChange().getId()
+            + ": Depends on change that was not submitted."
+            + " Commit "
+            + change2Result.getCommit().name()
+            + " depends on commit "
+            + changeResult.getCommit().name()
+            + ", which is outdated patch set "
+            + patchSetId.get()
+            + " of change "
+            + changeResult.getChange().getId()
+            + ". The latest patch set is "
+            + changeResult.getPatchSetId().get()
+            + ".");
+
+    assertRefUpdatedEvents();
+    assertChangeMergedEvents();
+  }
+
+  @Test
+  public void dependencyOnDeletedChangePreventsMerge() throws Exception {
+    // Create a change
+    PushOneCommit change = pushFactory.create(db, user.getIdent(), testRepo, "fix", "a.txt", "foo");
+    PushOneCommit.Result changeResult = change.to("refs/for/master");
+
+    // Create a successor change.
+    PushOneCommit change2 =
+        pushFactory.create(db, user.getIdent(), testRepo, "feature", "b.txt", "bar");
+    PushOneCommit.Result change2Result = change2.to("refs/for/master");
+
+    // Delete first change.
+    gApi.changes().id(changeResult.getChangeId()).delete();
+
+    // Submit is expected to fail.
+    submitWithConflict(
+        change2Result.getChangeId(),
+        "Failed to submit 1 change due to the following problems:\n"
+            + "Change "
+            + change2Result.getChange().getId()
+            + ": Depends on change that was not submitted."
+            + " Commit "
+            + change2Result.getCommit().name()
+            + " depends on commit "
+            + changeResult.getCommit().name()
+            + " which cannot be merged."
+            + " Is the change of this commit not visible or was it deleted?");
+
+    assertRefUpdatedEvents();
+    assertChangeMergedEvents();
+  }
+
+  @Test
+  public void dependencyOnChangeForNonVisibleBranchPreventsMerge() throws Exception {
+    grantLabel("Code-Review", -2, 2, project, "refs/heads/*", false, REGISTERED_USERS, false);
+    grant(project, "refs/*", Permission.SUBMIT, false, REGISTERED_USERS);
+
+    // Create a change
+    PushOneCommit change =
+        pushFactory.create(db, admin.getIdent(), testRepo, "fix", "a.txt", "foo");
+    PushOneCommit.Result changeResult = change.to("refs/for/master");
+    approve(changeResult.getChangeId());
+
+    // Create a successor change.
+    PushOneCommit change2 =
+        pushFactory.create(db, admin.getIdent(), testRepo, "feature", "b.txt", "bar");
+    PushOneCommit.Result change2Result = change2.to("refs/for/master");
+
+    // Move the first change to a destination branch that is non-visible to user so that user cannot
+    // this change anymore.
+    Branch.NameKey secretBranch = new Branch.NameKey(project, "secretBranch");
+    gApi.projects()
+        .name(secretBranch.getParentKey().get())
+        .branch(secretBranch.get())
+        .create(new BranchInput());
+    gApi.changes().id(changeResult.getChangeId()).move(secretBranch.get());
+    block(secretBranch.get(), "read", ANONYMOUS_USERS);
+
+    setApiUser(user);
+
+    // Verify that user cannot see the first change.
+    try {
+      gApi.changes().id(changeResult.getChangeId()).get();
+      fail("expected failure");
+    } catch (ResourceNotFoundException e) {
+      assertThat(e.getMessage()).isEqualTo("Not found: " + changeResult.getChangeId());
+    }
+
+    // Submit is expected to fail.
+    submitWithConflict(
+        change2Result.getChangeId(),
+        "Failed to submit 1 change due to the following problems:\n"
+            + "Change "
+            + change2Result.getChange().getId()
+            + ": Depends on change that was not submitted."
+            + " Commit "
+            + change2Result.getCommit().name()
+            + " depends on commit "
+            + changeResult.getCommit().name()
+            + " which cannot be merged."
+            + " Is the change of this commit not visible or was it deleted?");
+
+    assertRefUpdatedEvents();
+    assertChangeMergedEvents();
+  }
+
+  @Test
+  public void dependencyOnHiddenChangeShouldPreventMergeButDoesnt() throws Exception {
+    grantLabel("Code-Review", -2, 2, project, "refs/heads/*", false, REGISTERED_USERS, false);
+    grant(project, "refs/*", Permission.SUBMIT, false, REGISTERED_USERS);
+
+    // Create a change
+    PushOneCommit change =
+        pushFactory.create(db, admin.getIdent(), testRepo, "fix", "a.txt", "foo");
+    PushOneCommit.Result changeResult = change.to("refs/for/master");
+    approve(changeResult.getChangeId());
+
+    // Create a successor change.
+    PushOneCommit change2 =
+        pushFactory.create(db, admin.getIdent(), testRepo, "feature", "b.txt", "bar");
+    PushOneCommit.Result change2Result = change2.to("refs/for/master");
+    approve(change2Result.getChangeId());
+
+    // Mark the first change private so that it's not visible to user.
+    gApi.changes().id(changeResult.getChangeId()).setPrivate(true, "nobody should see this");
+
+    setApiUser(user);
+
+    // Verify that user cannot see the first change.
+    try {
+      gApi.changes().id(changeResult.getChangeId()).get();
+      fail("expected failure");
+    } catch (ResourceNotFoundException e) {
+      assertThat(e.getMessage()).isEqualTo("Not found: " + changeResult.getChangeId());
+    }
+
+    // Submit the second change which has a dependency on the first change which is not visible to
+    // the user. We would expect the submit to fail, but instead the submit succeeds and the hidden
+    // change gets submitted too.
+    // TODO(ekempin): Make this submit fail.
+    gApi.changes().id(change2Result.getChangeId()).current().submit(new SubmitInput());
+
+    // Verify that both changes have been submitted.
+    setApiUser(admin);
+    assertThat(gApi.changes().id(changeResult.getChangeId()).get().status)
+        .isEqualTo(ChangeStatus.MERGED);
+    assertThat(gApi.changes().id(change2Result.getChangeId()).get().status)
+        .isEqualTo(ChangeStatus.MERGED);
+  }
+
+  @Test
+  public void testPreviewSubmitTgz() throws Exception {
+    Project.NameKey p1 = createProject("project-name");
+
+    TestRepository<?> repo1 = cloneProject(p1);
+    PushOneCommit.Result change1 = createChange(repo1, "master", "test", "a.txt", "1", "topic");
+    approve(change1.getChangeId());
+
+    // get a preview before submitting:
+    File tempfile;
+    try (BinaryResult request =
+        gApi.changes().id(change1.getChangeId()).current().submitPreview("tgz")) {
+      assertThat(request.getContentType()).isEqualTo("application/x-gzip");
+      tempfile = File.createTempFile("test", null);
+      request.writeTo(Files.newOutputStream(tempfile.toPath()));
+    }
+
+    InputStream is = new GZIPInputStream(Files.newInputStream(tempfile.toPath()));
+
+    List<String> untarredFiles = new ArrayList<>();
+    try (TarArchiveInputStream tarInputStream =
+        (TarArchiveInputStream) new ArchiveStreamFactory().createArchiveInputStream("tar", is)) {
+      TarArchiveEntry entry;
+      while ((entry = (TarArchiveEntry) tarInputStream.getNextEntry()) != null) {
+        untarredFiles.add(entry.getName());
+      }
+    }
+    assertThat(untarredFiles).containsExactly(name("project-name") + ".git");
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/SubmitByRebaseAlwaysIT.java b/javatests/com/google/gerrit/acceptance/rest/change/SubmitByRebaseAlwaysIT.java
new file mode 100644
index 0000000..3d8d06e
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/change/SubmitByRebaseAlwaysIT.java
@@ -0,0 +1,136 @@
+// 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.
+
+package com.google.gerrit.acceptance.rest.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_REVISION;
+
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.TestProjectInput;
+import com.google.gerrit.common.FooterConstants;
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.server.git.ChangeMessageModifier;
+import com.google.inject.Inject;
+import java.util.List;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.junit.Test;
+
+public class SubmitByRebaseAlwaysIT extends AbstractSubmitByRebase {
+  @Inject private DynamicSet<ChangeMessageModifier> changeMessageModifiers;
+
+  @Override
+  protected SubmitType getSubmitType() {
+    return SubmitType.REBASE_ALWAYS;
+  }
+
+  @Test
+  @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
+  public void submitWithPossibleFastForward() throws Exception {
+    RevCommit oldHead = getRemoteHead();
+    PushOneCommit.Result change = createChange();
+    submit(change.getChangeId());
+
+    RevCommit head = getRemoteHead();
+    assertThat(head.getId()).isNotEqualTo(change.getCommit());
+    assertThat(head.getParent(0)).isEqualTo(oldHead);
+    assertApproved(change.getChangeId());
+    assertCurrentRevision(change.getChangeId(), 2, head);
+    assertSubmitter(change.getChangeId(), 1);
+    assertSubmitter(change.getChangeId(), 2);
+    assertPersonEquals(admin.getIdent(), head.getAuthorIdent());
+    assertPersonEquals(admin.getIdent(), head.getCommitterIdent());
+    assertRefUpdatedEvents(oldHead, head);
+    assertChangeMergedEvents(change.getChangeId(), head.name());
+  }
+
+  @Test
+  @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
+  public void alwaysAddFooters() throws Exception {
+    PushOneCommit.Result change1 = createChange();
+    PushOneCommit.Result change2 = createChange();
+
+    assertThat(getCurrentCommit(change1).getFooterLines(FooterConstants.REVIEWED_BY)).isEmpty();
+    assertThat(getCurrentCommit(change2).getFooterLines(FooterConstants.REVIEWED_BY)).isEmpty();
+
+    // change1 is a fast-forward, but should be rebased in cherry pick style
+    // anyway, making change2 not a fast-forward, requiring a rebase.
+    approve(change1.getChangeId());
+    submit(change2.getChangeId());
+    // ... but both changes should get reviewed-by footers.
+    assertLatestRevisionHasFooters(change1);
+    assertLatestRevisionHasFooters(change2);
+  }
+
+  @Test
+  @TestProjectInput(useContentMerge = InheritableBoolean.TRUE)
+  public void changeMessageOnSubmit() throws Exception {
+    PushOneCommit.Result change1 = createChange();
+    PushOneCommit.Result change2 = createChange();
+
+    RegistrationHandle handle =
+        changeMessageModifiers.add(
+            "gerrit",
+            new ChangeMessageModifier() {
+              @Override
+              public String onSubmit(
+                  String newCommitMessage,
+                  RevCommit original,
+                  RevCommit mergeTip,
+                  Branch.NameKey destination) {
+                List<String> custom = mergeTip.getFooterLines("Custom");
+                if (!custom.isEmpty()) {
+                  newCommitMessage += "Custom-Parent: " + custom.get(0) + "\n";
+                }
+                return newCommitMessage + "Custom: " + destination.get();
+              }
+            });
+    try {
+      // change1 is a fast-forward, but should be rebased in cherry pick style
+      // anyway, making change2 not a fast-forward, requiring a rebase.
+      approve(change1.getChangeId());
+      submit(change2.getChangeId());
+    } finally {
+      handle.remove();
+    }
+    // ... but both changes should get custom footers.
+    assertThat(getCurrentCommit(change1).getFooterLines("Custom"))
+        .containsExactly("refs/heads/master");
+    assertThat(getCurrentCommit(change2).getFooterLines("Custom"))
+        .containsExactly("refs/heads/master");
+    assertThat(getCurrentCommit(change2).getFooterLines("Custom-Parent"))
+        .containsExactly("refs/heads/master");
+  }
+
+  private void assertLatestRevisionHasFooters(PushOneCommit.Result change) throws Exception {
+    RevCommit c = getCurrentCommit(change);
+    assertThat(c.getFooterLines(FooterConstants.CHANGE_ID)).isNotEmpty();
+    assertThat(c.getFooterLines(FooterConstants.REVIEWED_BY)).isNotEmpty();
+    assertThat(c.getFooterLines(FooterConstants.REVIEWED_ON)).isNotEmpty();
+  }
+
+  private RevCommit getCurrentCommit(PushOneCommit.Result change) throws Exception {
+    testRepo.git().fetch().setRemote("origin").call();
+    ChangeInfo info = get(change.getChangeId(), CURRENT_REVISION);
+    RevCommit c = testRepo.getRevWalk().parseCommit(ObjectId.fromString(info.currentRevision));
+    testRepo.getRevWalk().parseBody(c);
+    return c;
+  }
+}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByRebaseIfNecessaryIT.java b/javatests/com/google/gerrit/acceptance/rest/change/SubmitByRebaseIfNecessaryIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByRebaseIfNecessaryIT.java
rename to javatests/com/google/gerrit/acceptance/rest/change/SubmitByRebaseIfNecessaryIT.java
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/SubmitResolvingMergeCommitIT.java b/javatests/com/google/gerrit/acceptance/rest/change/SubmitResolvingMergeCommitIT.java
new file mode 100644
index 0000000..e9ac07a
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/change/SubmitResolvingMergeCommitIT.java
@@ -0,0 +1,382 @@
+// 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.
+
+package com.google.gerrit.acceptance.rest.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.extensions.client.ChangeStatus;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.restapi.change.Submit;
+import com.google.gerrit.server.submit.ChangeSet;
+import com.google.gerrit.server.submit.MergeSuperSet;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import org.eclipse.jgit.errors.IncorrectObjectTypeException;
+import org.eclipse.jgit.errors.MissingObjectException;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.junit.Test;
+
+@NoHttpd
+public class SubmitResolvingMergeCommitIT extends AbstractDaemonTest {
+  @Inject private Provider<MergeSuperSet> mergeSuperSet;
+
+  @Inject private Submit submit;
+
+  @ConfigSuite.Default
+  public static Config submitWholeTopicEnabled() {
+    return submitWholeTopicEnabledConfig();
+  }
+
+  @Test
+  public void resolvingMergeCommitAtEndOfChain() throws Exception {
+    /*
+      A <- B <- C <------- D
+      ^                    ^
+      |                    |
+      E <- F <- G <- H <-- M*
+
+      G has a conflict with C and is resolved in M which is a merge
+      commit of H and D.
+    */
+
+    PushOneCommit.Result a = createChange("A");
+    PushOneCommit.Result b =
+        createChange("B", "new.txt", "No conflict line", ImmutableList.of(a.getCommit()));
+    PushOneCommit.Result c = createChange("C", ImmutableList.of(b.getCommit()));
+    PushOneCommit.Result d = createChange("D", ImmutableList.of(c.getCommit()));
+
+    PushOneCommit.Result e = createChange("E", ImmutableList.of(a.getCommit()));
+    PushOneCommit.Result f = createChange("F", ImmutableList.of(e.getCommit()));
+    PushOneCommit.Result g =
+        createChange("G", "new.txt", "Conflicting line", ImmutableList.of(f.getCommit()));
+    PushOneCommit.Result h = createChange("H", ImmutableList.of(g.getCommit()));
+
+    approve(a.getChangeId());
+    approve(b.getChangeId());
+    approve(c.getChangeId());
+    approve(d.getChangeId());
+    submit(d.getChangeId());
+
+    approve(e.getChangeId());
+    approve(f.getChangeId());
+    approve(g.getChangeId());
+    approve(h.getChangeId());
+
+    assertMergeable(e.getChange());
+    assertMergeable(f.getChange());
+    assertNotMergeable(g.getChange());
+    assertNotMergeable(h.getChange());
+
+    PushOneCommit.Result m =
+        createChange(
+            "M", "new.txt", "Resolved conflict", ImmutableList.of(d.getCommit(), h.getCommit()));
+    approve(m.getChangeId());
+
+    assertChangeSetMergeable(m.getChange(), true);
+
+    assertMergeable(m.getChange());
+    submit(m.getChangeId());
+
+    assertMerged(e.getChangeId());
+    assertMerged(f.getChangeId());
+    assertMerged(g.getChangeId());
+    assertMerged(h.getChangeId());
+    assertMerged(m.getChangeId());
+  }
+
+  @Test
+  public void resolvingMergeCommitComingBeforeConflict() throws Exception {
+    /*
+      A <- B <- C <- D
+      ^    ^
+      |    |
+      E <- F* <- G
+
+      F is a merge commit of E and B and resolves any conflict.
+      However G is conflicting with C.
+    */
+
+    PushOneCommit.Result a = createChange("A");
+    PushOneCommit.Result b =
+        createChange("B", "new.txt", "No conflict line", ImmutableList.of(a.getCommit()));
+    PushOneCommit.Result c =
+        createChange("C", "new.txt", "No conflict line #2", ImmutableList.of(b.getCommit()));
+    PushOneCommit.Result d = createChange("D", ImmutableList.of(c.getCommit()));
+    PushOneCommit.Result e =
+        createChange("E", "new.txt", "Conflicting line", ImmutableList.of(a.getCommit()));
+    PushOneCommit.Result f =
+        createChange(
+            "F", "new.txt", "Resolved conflict", ImmutableList.of(b.getCommit(), e.getCommit()));
+    PushOneCommit.Result g =
+        createChange("G", "new.txt", "Conflicting line #2", ImmutableList.of(f.getCommit()));
+
+    assertMergeable(e.getChange());
+
+    approve(a.getChangeId());
+    approve(b.getChangeId());
+    submit(b.getChangeId());
+
+    assertNotMergeable(e.getChange());
+    assertMergeable(f.getChange());
+    assertMergeable(g.getChange());
+
+    approve(c.getChangeId());
+    approve(d.getChangeId());
+    submit(d.getChangeId());
+
+    approve(e.getChangeId());
+    approve(f.getChangeId());
+    approve(g.getChangeId());
+
+    assertNotMergeable(g.getChange());
+    assertChangeSetMergeable(g.getChange(), false);
+  }
+
+  @Test
+  public void resolvingMergeCommitWithTopics() throws Exception {
+    /*
+      Project1:
+        A <- B <-- C <---
+        ^    ^          |
+        |    |          |
+        E <- F* <- G <- L*
+
+      G clashes with C, and F resolves the clashes between E and B.
+      Later, L resolves the clashes between C and G.
+
+      Project2:
+        H <- I
+        ^    ^
+        |    |
+        J <- K*
+
+      J clashes with I, and K resolves all problems.
+      G, K and L are in the same topic.
+    */
+    assume().that(isSubmitWholeTopicEnabled()).isTrue();
+
+    String project1Name = name("Project1");
+    String project2Name = name("Project2");
+    gApi.projects().create(project1Name);
+    gApi.projects().create(project2Name);
+    TestRepository<InMemoryRepository> project1 = cloneProject(new Project.NameKey(project1Name));
+    TestRepository<InMemoryRepository> project2 = cloneProject(new Project.NameKey(project2Name));
+
+    PushOneCommit.Result a = createChange(project1, "A");
+    PushOneCommit.Result b =
+        createChange(project1, "B", "new.txt", "No conflict line", ImmutableList.of(a.getCommit()));
+    PushOneCommit.Result c =
+        createChange(
+            project1, "C", "new.txt", "No conflict line #2", ImmutableList.of(b.getCommit()));
+
+    approve(a.getChangeId());
+    approve(b.getChangeId());
+    approve(c.getChangeId());
+    submit(c.getChangeId());
+
+    PushOneCommit.Result e =
+        createChange(project1, "E", "new.txt", "Conflicting line", ImmutableList.of(a.getCommit()));
+    PushOneCommit.Result f =
+        createChange(
+            project1,
+            "F",
+            "new.txt",
+            "Resolved conflict",
+            ImmutableList.of(b.getCommit(), e.getCommit()));
+    PushOneCommit.Result g =
+        createChange(
+            project1,
+            "G",
+            "new.txt",
+            "Conflicting line #2",
+            ImmutableList.of(f.getCommit()),
+            "refs/for/master/" + name("topic1"));
+
+    PushOneCommit.Result h = createChange(project2, "H");
+    PushOneCommit.Result i =
+        createChange(project2, "I", "new.txt", "No conflict line", ImmutableList.of(h.getCommit()));
+    PushOneCommit.Result j =
+        createChange(project2, "J", "new.txt", "Conflicting line", ImmutableList.of(h.getCommit()));
+    PushOneCommit.Result k =
+        createChange(
+            project2,
+            "K",
+            "new.txt",
+            "Sadly conflicting topic-wise",
+            ImmutableList.of(i.getCommit(), j.getCommit()),
+            "refs/for/master/" + name("topic1"));
+
+    approve(h.getChangeId());
+    approve(i.getChangeId());
+    submit(i.getChangeId());
+
+    approve(e.getChangeId());
+    approve(f.getChangeId());
+    approve(g.getChangeId());
+    approve(j.getChangeId());
+    approve(k.getChangeId());
+
+    assertChangeSetMergeable(g.getChange(), false);
+    assertChangeSetMergeable(k.getChange(), false);
+
+    PushOneCommit.Result l =
+        createChange(
+            project1,
+            "L",
+            "new.txt",
+            "Resolving conflicts again",
+            ImmutableList.of(c.getCommit(), g.getCommit()),
+            "refs/for/master/" + name("topic1"));
+
+    approve(l.getChangeId());
+    assertChangeSetMergeable(l.getChange(), true);
+
+    submit(l.getChangeId());
+    assertMerged(c.getChangeId());
+    assertMerged(g.getChangeId());
+    assertMerged(k.getChangeId());
+  }
+
+  @Test
+  public void resolvingMergeCommitAtEndOfChainAndNotUpToDate() throws Exception {
+    /*
+        A <-- B
+         \
+          C  <- D
+           \   /
+             E
+
+        B is the target branch, and D should be merged with B, but one
+        of C conflicts with B
+    */
+
+    PushOneCommit.Result a = createChange("A");
+    PushOneCommit.Result b =
+        createChange("B", "new.txt", "No conflict line", ImmutableList.of(a.getCommit()));
+
+    approve(a.getChangeId());
+    approve(b.getChangeId());
+    submit(b.getChangeId());
+
+    PushOneCommit.Result c =
+        createChange("C", "new.txt", "Create conflicts", ImmutableList.of(a.getCommit()));
+    PushOneCommit.Result e = createChange("E", ImmutableList.of(c.getCommit()));
+    PushOneCommit.Result d =
+        createChange(
+            "D", "new.txt", "Resolves conflicts", ImmutableList.of(c.getCommit(), e.getCommit()));
+
+    approve(c.getChangeId());
+    approve(e.getChangeId());
+    approve(d.getChangeId());
+    assertNotMergeable(d.getChange());
+    assertChangeSetMergeable(d.getChange(), false);
+  }
+
+  private void submit(String changeId) throws Exception {
+    gApi.changes().id(changeId).current().submit();
+  }
+
+  private void assertChangeSetMergeable(ChangeData change, boolean expected)
+      throws MissingObjectException, IncorrectObjectTypeException, IOException, OrmException,
+          PermissionBackendException {
+    ChangeSet cs = mergeSuperSet.get().completeChangeSet(db, change.change(), user(admin));
+    assertThat(submit.unmergeableChanges(cs).isEmpty()).isEqualTo(expected);
+  }
+
+  private void assertMergeable(ChangeData change) throws Exception {
+    change.setMergeable(null);
+    assertThat(change.isMergeable()).isTrue();
+  }
+
+  private void assertNotMergeable(ChangeData change) throws Exception {
+    change.setMergeable(null);
+    assertThat(change.isMergeable()).isFalse();
+  }
+
+  private void assertMerged(String changeId) throws Exception {
+    assertThat(gApi.changes().id(changeId).get().status).isEqualTo(ChangeStatus.MERGED);
+  }
+
+  private PushOneCommit.Result createChange(
+      TestRepository<?> repo,
+      String subject,
+      String fileName,
+      String content,
+      List<RevCommit> parents,
+      String ref)
+      throws Exception {
+    PushOneCommit push = pushFactory.create(db, admin.getIdent(), repo, subject, fileName, content);
+
+    if (!parents.isEmpty()) {
+      push.setParents(parents);
+    }
+
+    PushOneCommit.Result result;
+    if (fileName.isEmpty()) {
+      result = push.execute(ref);
+    } else {
+      result = push.to(ref);
+    }
+    result.assertOkStatus();
+    return result;
+  }
+
+  private PushOneCommit.Result createChange(TestRepository<?> repo, String subject)
+      throws Exception {
+    return createChange(repo, subject, "x", "x", new ArrayList<RevCommit>(), "refs/for/master");
+  }
+
+  private PushOneCommit.Result createChange(
+      TestRepository<?> repo,
+      String subject,
+      String fileName,
+      String content,
+      List<RevCommit> parents)
+      throws Exception {
+    return createChange(repo, subject, fileName, content, parents, "refs/for/master");
+  }
+
+  @Override
+  protected PushOneCommit.Result createChange(String subject) throws Exception {
+    return createChange(
+        testRepo, subject, "", "", Collections.<RevCommit>emptyList(), "refs/for/master");
+  }
+
+  private PushOneCommit.Result createChange(String subject, List<RevCommit> parents)
+      throws Exception {
+    return createChange(testRepo, subject, "", "", parents, "refs/for/master");
+  }
+
+  private PushOneCommit.Result createChange(
+      String subject, String fileName, String content, List<RevCommit> parents) throws Exception {
+    return createChange(testRepo, subject, fileName, content, parents, "refs/for/master");
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/SuggestReviewersIT.java b/javatests/com/google/gerrit/acceptance/rest/change/SuggestReviewersIT.java
new file mode 100644
index 0000000..b0a89c3
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/change/SuggestReviewersIT.java
@@ -0,0 +1,547 @@
+// Copyright (C) 2013 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.google.gerrit.acceptance.rest.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.GerritConfig;
+import com.google.gerrit.acceptance.TestAccount;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.api.accounts.EmailInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.common.ChangeInput;
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.extensions.common.SuggestedReviewerInfo;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.restapi.group.CreateGroup;
+import com.google.inject.Inject;
+import java.util.Arrays;
+import java.util.List;
+import org.junit.Before;
+import org.junit.Test;
+
+public class SuggestReviewersIT extends AbstractDaemonTest {
+  @Inject private CreateGroup createGroup;
+
+  private InternalGroup group1;
+  private InternalGroup group2;
+  private InternalGroup group3;
+
+  private TestAccount user1;
+  private TestAccount user2;
+  private TestAccount user3;
+  private TestAccount user4;
+
+  @Before
+  public void setUp() throws Exception {
+    group1 = newGroup("users1");
+    group2 = newGroup("users2");
+    group3 = newGroup("users3");
+
+    user1 = user("user1", "First1 Last1", group1);
+    user2 = user("user2", "First2 Last2", group2);
+    user3 = user("user3", "First3 Last3", group1, group2);
+    user4 = user("jdoe", "John Doe", "JDOE");
+  }
+
+  @Test
+  @GerritConfig(name = "accounts.visibility", value = "NONE")
+  public void suggestReviewersNoResult1() throws Exception {
+    String changeId = createChange().getChangeId();
+    List<SuggestedReviewerInfo> reviewers = suggestReviewers(changeId, name("u"), 6);
+    assertThat(reviewers).isEmpty();
+  }
+
+  @Test
+  @GerritConfig(name = "suggest.from", value = "1")
+  @GerritConfig(name = "accounts.visibility", value = "NONE")
+  public void suggestReviewersNoResult2() throws Exception {
+    String changeId = createChange().getChangeId();
+    List<SuggestedReviewerInfo> reviewers = suggestReviewers(changeId, name("u"), 6);
+    assertThat(reviewers).isEmpty();
+  }
+
+  @Test
+  public void suggestReviewersChange() throws Exception {
+    String changeId = createChange().getChangeId();
+    testSuggestReviewersChange(changeId);
+  }
+
+  @Test
+  public void suggestReviewersPrivateChange() throws Exception {
+    String changeId = createChange().getChangeId();
+    gApi.changes().id(changeId).setPrivate(true, null);
+    testSuggestReviewersChange(changeId);
+  }
+
+  public void testSuggestReviewersChange(String changeId) throws Exception {
+    List<SuggestedReviewerInfo> reviewers = suggestReviewers(changeId, name("u"), 6);
+    assertReviewers(
+        reviewers, ImmutableList.of(user1, user2, user3), ImmutableList.of(group1, group2, group3));
+
+    reviewers = suggestReviewers(changeId, name("u"), 5);
+    assertReviewers(
+        reviewers, ImmutableList.of(user1, user2, user3), ImmutableList.of(group1, group2));
+
+    reviewers = suggestReviewers(changeId, group3.getName(), 10);
+    assertReviewers(reviewers, ImmutableList.of(), ImmutableList.of(group3));
+
+    // Suggested accounts are ordered by activity. All users have no activity,
+    // hence we don't know which of the matching accounts we get when the query
+    // is limited to 1.
+    reviewers = suggestReviewers(changeId, name("u"), 1);
+    assertThat(reviewers).hasSize(1);
+    assertThat(reviewers.get(0).account).isNotNull();
+    assertThat(ImmutableList.of(reviewers.get(0).account._accountId))
+        .containsAnyIn(
+            ImmutableList.of(user1, user2, user3).stream().map(u -> u.id.get()).collect(toList()));
+  }
+
+  @Test
+  @GerritConfig(name = "accounts.visibility", value = "SAME_GROUP")
+  public void suggestReviewersSameGroupVisibility() throws Exception {
+    String changeId = createChange().getChangeId();
+    List<SuggestedReviewerInfo> reviewers;
+
+    reviewers = suggestReviewers(changeId, user2.username, 2);
+    assertThat(reviewers).hasSize(1);
+    assertThat(Iterables.getOnlyElement(reviewers).account.name).isEqualTo(user2.fullName);
+
+    setApiUser(user1);
+    reviewers = suggestReviewers(changeId, user2.fullName, 2);
+    assertThat(reviewers).isEmpty();
+
+    setApiUser(user2);
+    reviewers = suggestReviewers(changeId, user2.username, 2);
+    assertThat(reviewers).hasSize(1);
+    assertThat(Iterables.getOnlyElement(reviewers).account.name).isEqualTo(user2.fullName);
+
+    setApiUser(user3);
+    reviewers = suggestReviewers(changeId, user2.username, 2);
+    assertThat(reviewers).hasSize(1);
+    assertThat(Iterables.getOnlyElement(reviewers).account.name).isEqualTo(user2.fullName);
+  }
+
+  @Test
+  public void suggestReviewersPrivateProjectVisibility() throws Exception {
+    String changeId = createChange().getChangeId();
+    List<SuggestedReviewerInfo> reviewers;
+
+    setApiUser(user3);
+    block("refs/*", "read", ANONYMOUS_USERS);
+    allow("refs/*", "read", group1.getGroupUUID());
+    reviewers = suggestReviewers(changeId, user2.username, 2);
+    assertThat(reviewers).isEmpty();
+  }
+
+  @Test
+  @GerritConfig(name = "accounts.visibility", value = "SAME_GROUP")
+  public void suggestReviewersViewAllAccounts() throws Exception {
+    String changeId = createChange().getChangeId();
+    List<SuggestedReviewerInfo> reviewers;
+
+    setApiUser(user1);
+    reviewers = suggestReviewers(changeId, user2.username, 2);
+    assertThat(reviewers).isEmpty();
+
+    setApiUser(user1); // Clear cached group info.
+    allowGlobalCapabilities(group1.getGroupUUID(), GlobalCapability.VIEW_ALL_ACCOUNTS);
+    reviewers = suggestReviewers(changeId, user2.username, 2);
+    assertThat(reviewers).hasSize(1);
+    assertThat(Iterables.getOnlyElement(reviewers).account.name).isEqualTo(user2.fullName);
+  }
+
+  @Test
+  @GerritConfig(name = "suggest.maxSuggestedReviewers", value = "2")
+  public void suggestReviewersMaxNbrSuggestions() throws Exception {
+    String changeId = createChange().getChangeId();
+    List<SuggestedReviewerInfo> reviewers = suggestReviewers(changeId, name("user"), 5);
+    assertThat(reviewers).hasSize(2);
+  }
+
+  @Test
+  public void suggestReviewersFullTextSearch() throws Exception {
+    String changeId = createChange().getChangeId();
+    List<SuggestedReviewerInfo> reviewers;
+
+    reviewers = suggestReviewers(changeId, "first");
+    assertThat(reviewers).hasSize(3);
+
+    reviewers = suggestReviewers(changeId, "first1");
+    assertThat(reviewers).hasSize(1);
+
+    reviewers = suggestReviewers(changeId, "last");
+    assertThat(reviewers).hasSize(3);
+
+    reviewers = suggestReviewers(changeId, "last1");
+    assertThat(reviewers).hasSize(1);
+
+    reviewers = suggestReviewers(changeId, "fi la");
+    assertThat(reviewers).hasSize(3);
+
+    reviewers = suggestReviewers(changeId, "la fi");
+    assertThat(reviewers).hasSize(3);
+
+    reviewers = suggestReviewers(changeId, "first1 la");
+    assertThat(reviewers).hasSize(1);
+
+    reviewers = suggestReviewers(changeId, "fi last1");
+    assertThat(reviewers).hasSize(1);
+
+    reviewers = suggestReviewers(changeId, "first1 last2");
+    assertThat(reviewers).isEmpty();
+
+    reviewers = suggestReviewers(changeId, name("user"));
+    assertThat(reviewers).hasSize(6);
+
+    reviewers = suggestReviewers(changeId, user1.username);
+    assertThat(reviewers).hasSize(1);
+
+    reviewers = suggestReviewers(changeId, "example.com");
+    assertThat(reviewers).hasSize(5);
+
+    reviewers = suggestReviewers(changeId, user1.email);
+    assertThat(reviewers).hasSize(1);
+
+    reviewers = suggestReviewers(changeId, user1.username + " example");
+    assertThat(reviewers).hasSize(1);
+
+    reviewers = suggestReviewers(changeId, user4.email.toLowerCase());
+    assertThat(reviewers).hasSize(1);
+    assertThat(reviewers.get(0).account.email).isEqualTo(user4.email);
+  }
+
+  @Test
+  public void suggestReviewersWithoutLimitOptionSpecified() throws Exception {
+    String changeId = createChange().getChangeId();
+    String query = user3.username;
+    List<SuggestedReviewerInfo> suggestedReviewerInfos =
+        gApi.changes().id(changeId).suggestReviewers(query).get();
+    assertThat(suggestedReviewerInfos).hasSize(1);
+  }
+
+  @Test
+  @GerritConfig(name = "addreviewer.maxAllowed", value = "2")
+  @GerritConfig(name = "addreviewer.maxWithoutConfirmation", value = "1")
+  public void suggestReviewersGroupSizeConsiderations() throws Exception {
+    InternalGroup largeGroup = newGroup("large");
+    InternalGroup mediumGroup = newGroup("medium");
+
+    // Both groups have Administrator as a member. Add two users to large
+    // group to push it past maxAllowed, and one to medium group to push it
+    // past maxWithoutConfirmation.
+    user("individual 0", "Test0 Last0", largeGroup, mediumGroup);
+    user("individual 1", "Test1 Last1", largeGroup);
+
+    String changeId = createChange().getChangeId();
+    List<SuggestedReviewerInfo> reviewers;
+    SuggestedReviewerInfo reviewer;
+
+    // Individual account suggestions have count of 1 and no confirm.
+    reviewers = suggestReviewers(changeId, "test", 10);
+    assertThat(reviewers).hasSize(2);
+    reviewer = reviewers.get(0);
+    assertThat(reviewer.count).isEqualTo(1);
+    assertThat(reviewer.confirm).isNull();
+
+    // Large group should never be suggested.
+    reviewers = suggestReviewers(changeId, largeGroup.getName(), 10);
+    assertThat(reviewers).isEmpty();
+
+    // Medium group should be suggested with appropriate count and confirm.
+    reviewers = suggestReviewers(changeId, mediumGroup.getName(), 10);
+    assertThat(reviewers).hasSize(1);
+    reviewer = reviewers.get(0);
+    assertThat(reviewer.group.name).isEqualTo(mediumGroup.getName());
+    assertThat(reviewer.count).isEqualTo(2);
+    assertThat(reviewer.confirm).isTrue();
+  }
+
+  @Test
+  public void defaultReviewerSuggestion() throws Exception {
+    TestAccount user1 = user("customuser1", "User1");
+    TestAccount reviewer1 = user("customuser2", "User2");
+    TestAccount reviewer2 = user("customuser3", "User3");
+
+    setApiUser(user1);
+    String changeId1 = createChangeFromApi();
+
+    setApiUser(reviewer1);
+    reviewChange(changeId1);
+
+    setApiUser(user1);
+    String changeId2 = createChangeFromApi();
+
+    setApiUser(reviewer1);
+    reviewChange(changeId2);
+
+    setApiUser(reviewer2);
+    reviewChange(changeId2);
+
+    setApiUser(user1);
+    String changeId3 = createChangeFromApi();
+    List<SuggestedReviewerInfo> reviewers = suggestReviewers(changeId3, null, 4);
+    assertThat(reviewers.stream().map(r -> r.account._accountId).collect(toList()))
+        .containsExactly(reviewer1.id.get(), reviewer2.id.get())
+        .inOrder();
+
+    // check that existing reviewers are filtered out
+    gApi.changes().id(changeId3).addReviewer(reviewer1.email);
+    reviewers = suggestReviewers(changeId3, null, 4);
+    assertThat(reviewers.stream().map(r -> r.account._accountId).collect(toList()))
+        .containsExactly(reviewer2.id.get())
+        .inOrder();
+  }
+
+  @Test
+  public void defaultReviewerSuggestionOnFirstChange() throws Exception {
+    TestAccount user1 = user("customuser1", "User1");
+    setApiUser(user1);
+    List<SuggestedReviewerInfo> reviewers = suggestReviewers(createChange().getChangeId(), "", 4);
+    assertThat(reviewers).isEmpty();
+  }
+
+  @Test
+  @GerritConfig(name = "suggest.maxSuggestedReviewers", value = "10")
+  public void reviewerRanking() throws Exception {
+    // Assert that user are ranked by the number of times they have applied a
+    // a label to a change (highest), added comments (medium) or owned a
+    // change (low).
+    String fullName = "Primum Finalis";
+    TestAccount userWhoOwns = user("customuser1", fullName);
+    TestAccount reviewer1 = user("customuser2", fullName);
+    TestAccount reviewer2 = user("customuser3", fullName);
+    TestAccount userWhoComments = user("customuser4", fullName);
+    TestAccount userWhoLooksForSuggestions = user("customuser5", fullName);
+
+    // Create a change as userWhoOwns and add some reviews
+    setApiUser(userWhoOwns);
+    String changeId1 = createChangeFromApi();
+
+    setApiUser(reviewer1);
+    reviewChange(changeId1);
+
+    setApiUser(user1);
+    String changeId2 = createChangeFromApi();
+
+    setApiUser(reviewer1);
+    reviewChange(changeId2);
+
+    setApiUser(reviewer2);
+    reviewChange(changeId2);
+
+    // Create a comment as a different user
+    setApiUser(userWhoComments);
+    ReviewInput ri = new ReviewInput();
+    ri.message = "Test";
+    gApi.changes().id(changeId1).revision(1).review(ri);
+
+    // Create a change as a new user to assert that we receive the correct
+    // ranking
+
+    setApiUser(userWhoLooksForSuggestions);
+    List<SuggestedReviewerInfo> reviewers = suggestReviewers(createChangeFromApi(), "Pri", 4);
+    assertThat(reviewers.stream().map(r -> r.account._accountId).collect(toList()))
+        .containsExactly(
+            reviewer1.id.get(), reviewer2.id.get(), userWhoOwns.id.get(), userWhoComments.id.get())
+        .inOrder();
+  }
+
+  @Test
+  public void reviewerRankingProjectIsolation() throws Exception {
+    // Create new project
+    Project.NameKey newProject = createProject("test");
+
+    // Create users who review changes in both the default and the new project
+    String fullName = "Primum Finalis";
+    TestAccount userWhoOwns = user("customuser1", fullName);
+    TestAccount reviewer1 = user("customuser2", fullName);
+    TestAccount reviewer2 = user("customuser3", fullName);
+
+    setApiUser(userWhoOwns);
+    String changeId1 = createChangeFromApi();
+
+    setApiUser(reviewer1);
+    reviewChange(changeId1);
+
+    setApiUser(userWhoOwns);
+    String changeId2 = createChangeFromApi(newProject);
+
+    setApiUser(reviewer2);
+    reviewChange(changeId2);
+
+    setApiUser(userWhoOwns);
+    String changeId3 = createChangeFromApi(newProject);
+
+    setApiUser(reviewer2);
+    reviewChange(changeId3);
+
+    setApiUser(userWhoOwns);
+    List<SuggestedReviewerInfo> reviewers = suggestReviewers(createChangeFromApi(), "Prim", 4);
+
+    // Assert that reviewer1 is on top, even though reviewer2 has more reviews
+    // in other projects
+    assertThat(reviewers.stream().map(r -> r.account._accountId).collect(toList()))
+        .containsExactly(reviewer1.id.get(), reviewer2.id.get())
+        .inOrder();
+  }
+
+  @Test
+  public void suggestNoInactiveAccounts() throws Exception {
+    String name = name("foo");
+    TestAccount foo1 = accountCreator.create(name + "-1");
+    assertThat(gApi.accounts().id(foo1.username).getActive()).isTrue();
+
+    TestAccount foo2 = accountCreator.create(name + "-2");
+    assertThat(gApi.accounts().id(foo2.username).getActive()).isTrue();
+
+    String changeId = createChange().getChangeId();
+    assertReviewers(
+        suggestReviewers(changeId, name), ImmutableList.of(foo1, foo2), ImmutableList.of());
+
+    gApi.accounts().id(foo2.username).setActive(false);
+    assertThat(gApi.accounts().id(foo2.username).getActive()).isFalse();
+    assertReviewers(suggestReviewers(changeId, name), ImmutableList.of(foo1), ImmutableList.of());
+  }
+
+  @Test
+  public void suggestBySecondaryEmailWithModifyAccount() throws Exception {
+    String secondaryEmail = "foo.secondary@example.com";
+    TestAccount foo = createAccountWithSecondaryEmail("foo", secondaryEmail);
+
+    List<SuggestedReviewerInfo> reviewers =
+        suggestReviewers(createChange().getChangeId(), secondaryEmail, 4);
+    assertReviewers(reviewers, ImmutableList.of(foo), ImmutableList.of());
+
+    reviewers = suggestReviewers(createChange().getChangeId(), "secondary", 4);
+    assertReviewers(reviewers, ImmutableList.of(foo), ImmutableList.of());
+  }
+
+  @Test
+  public void cannotSuggestBySecondaryEmailWithoutModifyAccount() throws Exception {
+    String secondaryEmail = "foo.secondary@example.com";
+    createAccountWithSecondaryEmail("foo", secondaryEmail);
+
+    setApiUser(user);
+    List<SuggestedReviewerInfo> reviewers =
+        suggestReviewers(createChange().getChangeId(), secondaryEmail, 4);
+    assertThat(reviewers).isEmpty();
+
+    reviewers = suggestReviewers(createChange().getChangeId(), "secondary2", 4);
+    assertThat(reviewers).isEmpty();
+  }
+
+  @Test
+  public void secondaryEmailsInSuggestions() throws Exception {
+    String secondaryEmail = "foo.secondary@example.com";
+    TestAccount foo = createAccountWithSecondaryEmail("foo", secondaryEmail);
+
+    List<SuggestedReviewerInfo> reviewers =
+        suggestReviewers(createChange().getChangeId(), "foo", 4);
+    assertReviewers(reviewers, ImmutableList.of(foo), ImmutableList.of());
+    assertThat(Iterables.getOnlyElement(reviewers).account.secondaryEmails)
+        .containsExactly(secondaryEmail);
+
+    setApiUser(user);
+    reviewers = suggestReviewers(createChange().getChangeId(), "foo", 4);
+    assertReviewers(reviewers, ImmutableList.of(foo), ImmutableList.of());
+    assertThat(Iterables.getOnlyElement(reviewers).account.secondaryEmails).isNull();
+  }
+
+  private TestAccount createAccountWithSecondaryEmail(String name, String secondaryEmail)
+      throws Exception {
+    TestAccount foo = accountCreator.create(name(name), "foo.primary@example.com", "Foo");
+    EmailInput input = new EmailInput();
+    input.email = secondaryEmail;
+    input.noConfirmation = true;
+    gApi.accounts().id(foo.id.get()).addEmail(input);
+    return foo;
+  }
+
+  private List<SuggestedReviewerInfo> suggestReviewers(String changeId, String query)
+      throws Exception {
+    return gApi.changes().id(changeId).suggestReviewers(query).get();
+  }
+
+  private List<SuggestedReviewerInfo> suggestReviewers(String changeId, String query, int n)
+      throws Exception {
+    return gApi.changes().id(changeId).suggestReviewers(query).withLimit(n).get();
+  }
+
+  private InternalGroup newGroup(String name) throws Exception {
+    GroupInfo group =
+        createGroup.apply(TopLevelResource.INSTANCE, IdString.fromDecoded(name(name)), null);
+    return group(new AccountGroup.UUID(group.id));
+  }
+
+  private TestAccount user(String name, String fullName, String emailName, InternalGroup... groups)
+      throws Exception {
+    String[] groupNames = Arrays.stream(groups).map(InternalGroup::getName).toArray(String[]::new);
+    return accountCreator.create(
+        name(name), name(emailName) + "@example.com", fullName, groupNames);
+  }
+
+  private TestAccount user(String name, String fullName, InternalGroup... groups) throws Exception {
+    return user(name, fullName, name, groups);
+  }
+
+  private void reviewChange(String changeId) throws RestApiException {
+    ReviewInput ri = new ReviewInput();
+    ri.label("Code-Review", 1);
+    gApi.changes().id(changeId).current().review(ri);
+  }
+
+  private String createChangeFromApi() throws RestApiException {
+    return createChangeFromApi(project);
+  }
+
+  private String createChangeFromApi(Project.NameKey project) throws RestApiException {
+    ChangeInput ci = new ChangeInput();
+    ci.project = project.get();
+    ci.subject = "Test change at" + System.nanoTime();
+    ci.branch = "master";
+    return gApi.changes().create(ci).get().changeId;
+  }
+
+  private void assertReviewers(
+      List<SuggestedReviewerInfo> actual,
+      List<TestAccount> expectedUsers,
+      List<InternalGroup> expectedGroups) {
+    List<Integer> actualAccountIds =
+        actual.stream()
+            .filter(i -> i.account != null)
+            .map(i -> i.account._accountId)
+            .collect(toList());
+    assertThat(actualAccountIds)
+        .containsExactlyElementsIn(expectedUsers.stream().map(u -> u.id.get()).collect(toList()));
+
+    List<String> actualGroupIds =
+        actual.stream().filter(i -> i.group != null).map(i -> i.group.id).collect(toList());
+    assertThat(actualGroupIds)
+        .containsExactlyElementsIn(
+            expectedGroups.stream().map(g -> g.getGroupUUID().get()).collect(toList()))
+        .inOrder();
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/TopicIT.java b/javatests/com/google/gerrit/acceptance/rest/change/TopicIT.java
new file mode 100644
index 0000000..1d928a2
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/change/TopicIT.java
@@ -0,0 +1,61 @@
+// 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.
+
+package com.google.gerrit.acceptance.rest.change;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.PushOneCommit.Result;
+import com.google.gerrit.acceptance.RestResponse;
+import org.junit.Test;
+
+public class TopicIT extends AbstractDaemonTest {
+  @Test
+  public void topic() throws Exception {
+    Result result = createChange();
+    String endpoint = "/changes/" + result.getChangeId() + "/topic";
+    RestResponse response = adminRestSession.put(endpoint, "topic");
+    response.assertOK();
+
+    response = adminRestSession.delete(endpoint);
+    response.assertNoContent();
+
+    response = adminRestSession.put(endpoint, "topic");
+    response.assertOK();
+
+    response = adminRestSession.put(endpoint, "");
+    response.assertNoContent();
+  }
+
+  @Test
+  public void leadingAndTrailingWhitespaceGetsSanitized() throws Exception {
+    Result result = createChange();
+    String endpoint = "/changes/" + result.getChangeId() + "/topic";
+    RestResponse response = adminRestSession.put(endpoint, "\t \t topic\t ");
+    response.assertOK();
+
+    assertThat(response.getEntityContent()).isEqualTo(")]}'\n\"topic\"");
+  }
+
+  @Test
+  public void containedWhitespaceDoesNotGetSanitized() throws Exception {
+    Result result = createChange();
+    String endpoint = "/changes/" + result.getChangeId() + "/topic";
+    RestResponse response = adminRestSession.put(endpoint, "t opic");
+    response.assertOK();
+
+    assertThat(response.getEntityContent()).isEqualTo(")]}'\n\"t opic\"");
+  }
+}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/WorkInProgressByDefaultIT.java b/javatests/com/google/gerrit/acceptance/rest/change/WorkInProgressByDefaultIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/WorkInProgressByDefaultIT.java
rename to javatests/com/google/gerrit/acceptance/rest/change/WorkInProgressByDefaultIT.java
diff --git a/javatests/com/google/gerrit/acceptance/rest/config/BUILD b/javatests/com/google/gerrit/acceptance/rest/config/BUILD
new file mode 100644
index 0000000..8550423
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/config/BUILD
@@ -0,0 +1,10 @@
+load("//javatests/com/google/gerrit/acceptance:tests.bzl", "acceptance_tests")
+
+acceptance_tests(
+    srcs = glob(["*IT.java"]),
+    group = "rest_config",
+    labels = ["rest"],
+    deps = [
+        "//java/com/google/gerrit/server/restapi",
+    ],
+)
diff --git a/javatests/com/google/gerrit/acceptance/rest/config/CacheOperationsIT.java b/javatests/com/google/gerrit/acceptance/rest/config/CacheOperationsIT.java
new file mode 100644
index 0000000..7ef915b
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/config/CacheOperationsIT.java
@@ -0,0 +1,145 @@
+// Copyright (C) 2014 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.google.gerrit.acceptance.rest.config;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static com.google.gerrit.server.restapi.config.PostCaches.Operation.FLUSH;
+import static com.google.gerrit.server.restapi.config.PostCaches.Operation.FLUSH_ALL;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.server.restapi.config.ListCaches.CacheInfo;
+import com.google.gerrit.server.restapi.config.PostCaches;
+import java.util.Arrays;
+import org.junit.Test;
+
+public class CacheOperationsIT extends AbstractDaemonTest {
+
+  @Test
+  public void flushAll() throws Exception {
+    RestResponse r = adminRestSession.get("/config/server/caches/project_list");
+    r.assertOK();
+    CacheInfo cacheInfo = newGson().fromJson(r.getReader(), CacheInfo.class);
+    assertThat(cacheInfo.entries.mem).isGreaterThan((long) 0);
+
+    r = adminRestSession.post("/config/server/caches/", new PostCaches.Input(FLUSH_ALL));
+    r.assertOK();
+    r.consume();
+
+    r = adminRestSession.get("/config/server/caches/project_list");
+    r.assertOK();
+    cacheInfo = newGson().fromJson(r.getReader(), CacheInfo.class);
+    assertThat(cacheInfo.entries.mem).isNull();
+  }
+
+  @Test
+  public void flushAll_Forbidden() throws Exception {
+    userRestSession
+        .post("/config/server/caches/", new PostCaches.Input(FLUSH_ALL))
+        .assertForbidden();
+  }
+
+  @Test
+  public void flushAll_BadRequest() throws Exception {
+    adminRestSession
+        .post("/config/server/caches/", new PostCaches.Input(FLUSH_ALL, Arrays.asList("projects")))
+        .assertBadRequest();
+  }
+
+  @Test
+  public void flush() throws Exception {
+    RestResponse r = adminRestSession.get("/config/server/caches/project_list");
+    r.assertOK();
+    CacheInfo cacheInfo = newGson().fromJson(r.getReader(), CacheInfo.class);
+    assertThat(cacheInfo.entries.mem).isGreaterThan((long) 0);
+
+    r = adminRestSession.get("/config/server/caches/projects");
+    r.assertOK();
+    cacheInfo = newGson().fromJson(r.getReader(), CacheInfo.class);
+    assertThat(cacheInfo.entries.mem).isGreaterThan((long) 1);
+
+    r =
+        adminRestSession.post(
+            "/config/server/caches/",
+            new PostCaches.Input(FLUSH, Arrays.asList("accounts", "project_list")));
+    r.assertOK();
+    r.consume();
+
+    r = adminRestSession.get("/config/server/caches/project_list");
+    r.assertOK();
+    cacheInfo = newGson().fromJson(r.getReader(), CacheInfo.class);
+    assertThat(cacheInfo.entries.mem).isNull();
+
+    r = adminRestSession.get("/config/server/caches/projects");
+    r.assertOK();
+    cacheInfo = newGson().fromJson(r.getReader(), CacheInfo.class);
+    assertThat(cacheInfo.entries.mem).isGreaterThan((long) 1);
+  }
+
+  @Test
+  public void flush_Forbidden() throws Exception {
+    userRestSession
+        .post("/config/server/caches/", new PostCaches.Input(FLUSH, Arrays.asList("projects")))
+        .assertForbidden();
+  }
+
+  @Test
+  public void flush_BadRequest() throws Exception {
+    adminRestSession.post("/config/server/caches/", new PostCaches.Input(FLUSH)).assertBadRequest();
+  }
+
+  @Test
+  public void flush_UnprocessableEntity() throws Exception {
+    RestResponse r = adminRestSession.get("/config/server/caches/projects");
+    r.assertOK();
+    CacheInfo cacheInfo = newGson().fromJson(r.getReader(), CacheInfo.class);
+    assertThat(cacheInfo.entries.mem).isGreaterThan((long) 0);
+
+    r =
+        adminRestSession.post(
+            "/config/server/caches/",
+            new PostCaches.Input(FLUSH, Arrays.asList("projects", "unprocessable")));
+    r.assertUnprocessableEntity();
+    r.consume();
+
+    r = adminRestSession.get("/config/server/caches/projects");
+    r.assertOK();
+    cacheInfo = newGson().fromJson(r.getReader(), CacheInfo.class);
+    assertThat(cacheInfo.entries.mem).isGreaterThan((long) 0);
+  }
+
+  @Test
+  public void flushWebSessions_Forbidden() throws Exception {
+    allowGlobalCapabilities(
+        REGISTERED_USERS, GlobalCapability.FLUSH_CACHES, GlobalCapability.VIEW_CACHES);
+    try {
+      RestResponse r =
+          userRestSession.post(
+              "/config/server/caches/", new PostCaches.Input(FLUSH, Arrays.asList("projects")));
+      r.assertOK();
+      r.consume();
+
+      userRestSession
+          .post(
+              "/config/server/caches/", new PostCaches.Input(FLUSH, Arrays.asList("web_sessions")))
+          .assertForbidden();
+    } finally {
+      removeGlobalCapabilities(
+          REGISTERED_USERS, GlobalCapability.FLUSH_CACHES, GlobalCapability.VIEW_CACHES);
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/config/ConfirmEmailIT.java b/javatests/com/google/gerrit/acceptance/rest/config/ConfirmEmailIT.java
new file mode 100644
index 0000000..7133580
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/config/ConfirmEmailIT.java
@@ -0,0 +1,63 @@
+// Copyright (C) 2015 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.google.gerrit.acceptance.rest.config;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.server.mail.EmailTokenVerifier;
+import com.google.gerrit.server.restapi.config.ConfirmEmail;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.gwtjsonrpc.server.SignedToken;
+import com.google.inject.Inject;
+import org.eclipse.jgit.lib.Config;
+import org.junit.Test;
+
+public class ConfirmEmailIT extends AbstractDaemonTest {
+  @ConfigSuite.Default
+  public static Config defaultConfig() {
+    Config cfg = new Config();
+    cfg.setString("auth", null, "registerEmailPrivateKey", SignedToken.generateRandomKey());
+    return cfg;
+  }
+
+  @Inject private EmailTokenVerifier emailTokenVerifier;
+
+  @Test
+  public void confirm() throws Exception {
+    ConfirmEmail.Input in = new ConfirmEmail.Input();
+    in.token = emailTokenVerifier.encode(admin.getId(), "new.mail@example.com");
+    adminRestSession.put("/config/server/email.confirm", in).assertNoContent();
+  }
+
+  @Test
+  public void confirmForOtherUser_UnprocessableEntity() throws Exception {
+    ConfirmEmail.Input in = new ConfirmEmail.Input();
+    in.token = emailTokenVerifier.encode(user.getId(), "new.mail@example.com");
+    adminRestSession.put("/config/server/email.confirm", in).assertUnprocessableEntity();
+  }
+
+  @Test
+  public void confirmInvalidToken_UnprocessableEntity() throws Exception {
+    ConfirmEmail.Input in = new ConfirmEmail.Input();
+    in.token = "invalidToken";
+    adminRestSession.put("/config/server/email.confirm", in).assertUnprocessableEntity();
+  }
+
+  @Test
+  public void confirmAlreadyInUse_UnprocessableEntity() throws Exception {
+    ConfirmEmail.Input in = new ConfirmEmail.Input();
+    in.token = emailTokenVerifier.encode(admin.getId(), user.email);
+    adminRestSession.put("/config/server/email.confirm", in).assertUnprocessableEntity();
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/config/FlushCacheIT.java b/javatests/com/google/gerrit/acceptance/rest/config/FlushCacheIT.java
new file mode 100644
index 0000000..caecefa
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/config/FlushCacheIT.java
@@ -0,0 +1,81 @@
+// Copyright (C) 2014 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.google.gerrit.acceptance.rest.config;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.server.restapi.config.ListCaches.CacheInfo;
+import org.junit.Test;
+
+public class FlushCacheIT extends AbstractDaemonTest {
+
+  @Test
+  public void flushCache() throws Exception {
+    // access the admin group once so that it is loaded into the group cache
+    adminGroup();
+
+    RestResponse r = adminRestSession.get("/config/server/caches/groups_byname");
+    CacheInfo result = newGson().fromJson(r.getReader(), CacheInfo.class);
+    assertThat(result.entries.mem).isGreaterThan((long) 0);
+
+    r = adminRestSession.post("/config/server/caches/groups_byname/flush");
+    r.assertOK();
+    r.consume();
+
+    r = adminRestSession.get("/config/server/caches/groups_byname");
+    result = newGson().fromJson(r.getReader(), CacheInfo.class);
+    assertThat(result.entries.mem).isNull();
+  }
+
+  @Test
+  public void flushCache_Forbidden() throws Exception {
+    userRestSession.post("/config/server/caches/accounts/flush").assertForbidden();
+  }
+
+  @Test
+  public void flushCache_NotFound() throws Exception {
+    adminRestSession.post("/config/server/caches/nonExisting/flush").assertNotFound();
+  }
+
+  @Test
+  public void flushCacheWithGerritPrefix() throws Exception {
+    adminRestSession.post("/config/server/caches/gerrit-accounts/flush").assertOK();
+  }
+
+  @Test
+  public void flushWebSessionsCache() throws Exception {
+    adminRestSession.post("/config/server/caches/web_sessions/flush").assertOK();
+  }
+
+  @Test
+  public void flushWebSessionsCache_Forbidden() throws Exception {
+    allowGlobalCapabilities(
+        REGISTERED_USERS, GlobalCapability.VIEW_CACHES, GlobalCapability.FLUSH_CACHES);
+    try {
+      RestResponse r = userRestSession.post("/config/server/caches/accounts/flush");
+      r.assertOK();
+      r.consume();
+
+      userRestSession.post("/config/server/caches/web_sessions/flush").assertForbidden();
+    } finally {
+      removeGlobalCapabilities(
+          REGISTERED_USERS, GlobalCapability.VIEW_CACHES, GlobalCapability.FLUSH_CACHES);
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/config/GetCacheIT.java b/javatests/com/google/gerrit/acceptance/rest/config/GetCacheIT.java
new file mode 100644
index 0000000..247d63b
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/config/GetCacheIT.java
@@ -0,0 +1,65 @@
+// Copyright (C) 2014 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.google.gerrit.acceptance.rest.config;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.server.restapi.config.ListCaches.CacheInfo;
+import com.google.gerrit.server.restapi.config.ListCaches.CacheType;
+import org.junit.Test;
+
+public class GetCacheIT extends AbstractDaemonTest {
+
+  @Test
+  public void getCache() throws Exception {
+    RestResponse r = adminRestSession.get("/config/server/caches/accounts");
+    r.assertOK();
+    CacheInfo result = newGson().fromJson(r.getReader(), CacheInfo.class);
+
+    assertThat(result.name).isEqualTo("accounts");
+    assertThat(result.type).isEqualTo(CacheType.MEM);
+    assertThat(result.entries.mem).isAtLeast(1L);
+    assertThat(result.averageGet).isNotNull();
+    assertThat(result.averageGet).endsWith("s");
+    assertThat(result.entries.disk).isNull();
+    assertThat(result.entries.space).isNull();
+    assertThat(result.hitRatio.mem).isAtLeast(0);
+    assertThat(result.hitRatio.mem).isAtMost(100);
+    assertThat(result.hitRatio.disk).isNull();
+
+    userRestSession.get("/config/server/version").consume();
+    r = adminRestSession.get("/config/server/caches/accounts");
+    r.assertOK();
+    result = newGson().fromJson(r.getReader(), CacheInfo.class);
+    assertThat(result.entries.mem).isEqualTo(2);
+  }
+
+  @Test
+  public void getCache_Forbidden() throws Exception {
+    userRestSession.get("/config/server/caches/accounts").assertForbidden();
+  }
+
+  @Test
+  public void getCache_NotFound() throws Exception {
+    adminRestSession.get("/config/server/caches/nonExisting").assertNotFound();
+  }
+
+  @Test
+  public void getCacheWithGerritPrefix() throws Exception {
+    adminRestSession.get("/config/server/caches/gerrit-accounts").assertOK();
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/config/GetTaskIT.java b/javatests/com/google/gerrit/acceptance/rest/config/GetTaskIT.java
new file mode 100644
index 0000000..6d2c6dfa
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/config/GetTaskIT.java
@@ -0,0 +1,56 @@
+// Copyright (C) 2014 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.google.gerrit.acceptance.rest.config;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.server.restapi.config.ListTasks.TaskInfo;
+import com.google.gson.reflect.TypeToken;
+import java.util.List;
+import org.junit.Test;
+
+public class GetTaskIT extends AbstractDaemonTest {
+
+  @Test
+  public void getTask() throws Exception {
+    RestResponse r = adminRestSession.get("/config/server/tasks/" + getLogFileCompressorTaskId());
+    r.assertOK();
+    TaskInfo info = newGson().fromJson(r.getReader(), new TypeToken<TaskInfo>() {}.getType());
+    assertThat(info.id).isNotNull();
+    Long.parseLong(info.id, 16);
+    assertThat(info.command).isEqualTo("Log File Compressor");
+    assertThat(info.startTime).isNotNull();
+  }
+
+  @Test
+  public void getTask_NotFound() throws Exception {
+    userRestSession.get("/config/server/tasks/" + getLogFileCompressorTaskId()).assertNotFound();
+  }
+
+  private String getLogFileCompressorTaskId() throws Exception {
+    RestResponse r = adminRestSession.get("/config/server/tasks/");
+    List<TaskInfo> result =
+        newGson().fromJson(r.getReader(), new TypeToken<List<TaskInfo>>() {}.getType());
+    r.consume();
+    for (TaskInfo info : result) {
+      if ("Log File Compressor".equals(info.command)) {
+        return info.id;
+      }
+    }
+    return null;
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/config/KillTaskIT.java b/javatests/com/google/gerrit/acceptance/rest/config/KillTaskIT.java
new file mode 100644
index 0000000..2a891aa
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/config/KillTaskIT.java
@@ -0,0 +1,72 @@
+// Copyright (C) 2014 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.google.gerrit.acceptance.rest.config;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth8.assertThat;
+import static java.util.stream.Collectors.toSet;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.server.restapi.config.ListTasks.TaskInfo;
+import com.google.gson.reflect.TypeToken;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import org.junit.Test;
+
+public class KillTaskIT extends AbstractDaemonTest {
+
+  private void killTask() throws Exception {
+    RestResponse r = adminRestSession.get("/config/server/tasks/");
+    List<TaskInfo> result =
+        newGson().fromJson(r.getReader(), new TypeToken<List<TaskInfo>>() {}.getType());
+    r.consume();
+
+    Optional<String> id =
+        result.stream()
+            .filter(t -> "Log File Compressor".equals(t.command))
+            .map(t -> t.id)
+            .findFirst();
+    assertThat(id).isPresent();
+
+    r = adminRestSession.delete("/config/server/tasks/" + id.get());
+    r.assertNoContent();
+    r.consume();
+
+    r = adminRestSession.get("/config/server/tasks/");
+    result = newGson().fromJson(r.getReader(), new TypeToken<List<TaskInfo>>() {}.getType());
+    r.consume();
+    Set<String> ids = result.stream().map(t -> t.id).collect(toSet());
+    assertThat(ids).doesNotContain(id.get());
+  }
+
+  private void killTask_NotFound() throws Exception {
+    RestResponse r = adminRestSession.get("/config/server/tasks/");
+    List<TaskInfo> result =
+        newGson().fromJson(r.getReader(), new TypeToken<List<TaskInfo>>() {}.getType());
+    r.consume();
+    assertThat(result.size()).isGreaterThan(0);
+
+    userRestSession.delete("/config/server/tasks/" + result.get(0).id).assertNotFound();
+  }
+
+  @Test
+  public void killTaskTests_inOrder() throws Exception {
+    // As killTask() changes the state of the server, we want to test it last
+    killTask_NotFound();
+    killTask();
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/config/ListCachesIT.java b/javatests/com/google/gerrit/acceptance/rest/config/ListCachesIT.java
new file mode 100644
index 0000000..ae17be0
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/config/ListCachesIT.java
@@ -0,0 +1,92 @@
+// Copyright (C) 2014 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.google.gerrit.acceptance.rest.config;
+
+import static com.google.common.truth.Truth.assertThat;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.collect.Ordering;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.server.restapi.config.ListCaches.CacheInfo;
+import com.google.gerrit.server.restapi.config.ListCaches.CacheType;
+import com.google.gson.reflect.TypeToken;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.jgit.util.Base64;
+import org.junit.Test;
+
+public class ListCachesIT extends AbstractDaemonTest {
+
+  @Test
+  public void listCaches() throws Exception {
+    RestResponse r = adminRestSession.get("/config/server/caches/");
+    r.assertOK();
+    Map<String, CacheInfo> result =
+        newGson().fromJson(r.getReader(), new TypeToken<Map<String, CacheInfo>>() {}.getType());
+
+    assertThat(result).containsKey("accounts");
+    CacheInfo accountsCacheInfo = result.get("accounts");
+    assertThat(accountsCacheInfo.type).isEqualTo(CacheType.MEM);
+    assertThat(accountsCacheInfo.entries.mem).isAtLeast(1L);
+    assertThat(accountsCacheInfo.averageGet).isNotNull();
+    assertThat(accountsCacheInfo.averageGet).endsWith("s");
+    assertThat(accountsCacheInfo.entries.disk).isNull();
+    assertThat(accountsCacheInfo.entries.space).isNull();
+    assertThat(accountsCacheInfo.hitRatio.mem).isAtLeast(0);
+    assertThat(accountsCacheInfo.hitRatio.mem).isAtMost(100);
+    assertThat(accountsCacheInfo.hitRatio.disk).isNull();
+
+    userRestSession.get("/config/server/version").consume();
+    r = adminRestSession.get("/config/server/caches/");
+    r.assertOK();
+    result =
+        newGson().fromJson(r.getReader(), new TypeToken<Map<String, CacheInfo>>() {}.getType());
+    assertThat(result.get("accounts").entries.mem).isEqualTo(2);
+  }
+
+  @Test
+  public void listCaches_Forbidden() throws Exception {
+    userRestSession.get("/config/server/caches/").assertForbidden();
+  }
+
+  @Test
+  public void listCacheNames() throws Exception {
+    RestResponse r = adminRestSession.get("/config/server/caches/?format=LIST");
+    r.assertOK();
+    List<String> result =
+        newGson().fromJson(r.getReader(), new TypeToken<List<String>>() {}.getType());
+    assertThat(result).contains("accounts");
+    assertThat(result).contains("projects");
+    assertThat(Ordering.natural().isOrdered(result)).isTrue();
+  }
+
+  @Test
+  public void listCacheNamesTextList() throws Exception {
+    RestResponse r = adminRestSession.get("/config/server/caches/?format=TEXT_LIST");
+    r.assertOK();
+    String result = new String(Base64.decode(r.getEntityContent()), UTF_8.name());
+    List<String> list = Arrays.asList(result.split("\n"));
+    assertThat(list).contains("accounts");
+    assertThat(list).contains("projects");
+    assertThat(Ordering.natural().isOrdered(list)).isTrue();
+  }
+
+  @Test
+  public void listCaches_BadRequest() throws Exception {
+    adminRestSession.get("/config/server/caches/?format=NONSENSE").assertBadRequest();
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/config/ListTasksIT.java b/javatests/com/google/gerrit/acceptance/rest/config/ListTasksIT.java
new file mode 100644
index 0000000..674ca79
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/config/ListTasksIT.java
@@ -0,0 +1,57 @@
+// Copyright (C) 2014 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.google.gerrit.acceptance.rest.config;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.server.restapi.config.ListTasks.TaskInfo;
+import com.google.gson.reflect.TypeToken;
+import java.util.List;
+import org.junit.Test;
+
+public class ListTasksIT extends AbstractDaemonTest {
+
+  @Test
+  public void listTasks() throws Exception {
+    RestResponse r = adminRestSession.get("/config/server/tasks/");
+    r.assertOK();
+    List<TaskInfo> result =
+        newGson().fromJson(r.getReader(), new TypeToken<List<TaskInfo>>() {}.getType());
+    assertThat(result).isNotEmpty();
+    boolean foundLogFileCompressorTask = false;
+    for (TaskInfo info : result) {
+      if ("Log File Compressor".equals(info.command)) {
+        foundLogFileCompressorTask = true;
+      }
+      assertThat(info.id).isNotNull();
+      Long.parseLong(info.id, 16);
+      assertThat(info.command).isNotNull();
+      assertThat(info.startTime).isNotNull();
+    }
+    assertThat(foundLogFileCompressorTask).isTrue();
+  }
+
+  @Test
+  public void listTasksWithoutViewQueueCapability() throws Exception {
+    RestResponse r = userRestSession.get("/config/server/tasks/");
+    r.assertOK();
+    List<TaskInfo> result =
+        newGson().fromJson(r.getReader(), new TypeToken<List<TaskInfo>>() {}.getType());
+
+    assertThat(result).isEmpty();
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/config/ServerInfoIT.java b/javatests/com/google/gerrit/acceptance/rest/config/ServerInfoIT.java
new file mode 100644
index 0000000..874e04e
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/config/ServerInfoIT.java
@@ -0,0 +1,209 @@
+// Copyright (C) 2015 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.google.gerrit.acceptance.rest.config;
+
+import static com.google.common.truth.Truth.assertThat;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.GerritConfig;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.UseSsh;
+import com.google.gerrit.common.RawInputUtil;
+import com.google.gerrit.extensions.api.plugins.InstallPluginInput;
+import com.google.gerrit.extensions.client.AccountFieldName;
+import com.google.gerrit.extensions.client.AuthType;
+import com.google.gerrit.extensions.common.AccountVisibility;
+import com.google.gerrit.extensions.common.ServerInfo;
+import com.google.gerrit.server.config.AllProjectsNameProvider;
+import com.google.gerrit.server.config.AllUsersNameProvider;
+import com.google.gerrit.server.config.AnonymousCowardNameProvider;
+import org.junit.Test;
+
+@NoHttpd
+@UseSsh
+public class ServerInfoIT extends AbstractDaemonTest {
+  private static final byte[] JS_PLUGIN_CONTENT =
+      "Gerrit.install(function(self){});\n".getBytes(UTF_8);
+
+  @Test
+  // accounts
+  @GerritConfig(name = "accounts.visibility", value = "VISIBLE_GROUP")
+
+  // auth
+  @GerritConfig(name = "auth.type", value = "HTTP")
+  @GerritConfig(name = "auth.contributorAgreements", value = "true")
+  @GerritConfig(name = "auth.loginUrl", value = "https://example.com/login")
+  @GerritConfig(name = "auth.loginText", value = "LOGIN")
+  @GerritConfig(name = "auth.switchAccountUrl", value = "https://example.com/switch")
+
+  // auth fields ignored when auth == HTTP
+  @GerritConfig(name = "auth.registerUrl", value = "https://example.com/register")
+  @GerritConfig(name = "auth.registerText", value = "REGISTER")
+  @GerritConfig(name = "auth.editFullNameUrl", value = "https://example.com/editname")
+  @GerritConfig(name = "auth.httpPasswordUrl", value = "https://example.com/password")
+
+  // change
+  @GerritConfig(name = "change.largeChange", value = "300")
+  @GerritConfig(name = "change.replyTooltip", value = "Publish votes and draft comments")
+  @GerritConfig(name = "change.replyLabel", value = "Vote")
+  @GerritConfig(name = "change.updateDelay", value = "50s")
+  @GerritConfig(name = "change.disablePrivateChanges", value = "true")
+
+  // download
+  @GerritConfig(
+      name = "download.archive",
+      values = {"tar", "tbz2", "tgz", "txz"})
+
+  // gerrit
+  @GerritConfig(name = "gerrit.allProjects", value = "Root")
+  @GerritConfig(name = "gerrit.allUsers", value = "Users")
+  @GerritConfig(name = "gerrit.enableGwtUi", value = "true")
+  @GerritConfig(name = "gerrit.reportBugText", value = "REPORT BUG")
+  @GerritConfig(name = "gerrit.reportBugUrl", value = "https://example.com/report")
+
+  // suggest
+  @GerritConfig(name = "suggest.from", value = "3")
+
+  // user
+  @GerritConfig(name = "user.anonymousCoward", value = "Unnamed User")
+  public void serverConfig() throws Exception {
+    ServerInfo i = gApi.config().server().getInfo();
+
+    // accounts
+    assertThat(i.accounts.visibility).isEqualTo(AccountVisibility.VISIBLE_GROUP);
+
+    // auth
+    assertThat(i.auth.authType).isEqualTo(AuthType.HTTP);
+    assertThat(i.auth.editableAccountFields)
+        .containsExactly(AccountFieldName.REGISTER_NEW_EMAIL, AccountFieldName.FULL_NAME);
+    assertThat(i.auth.useContributorAgreements).isTrue();
+    assertThat(i.auth.loginUrl).isEqualTo("https://example.com/login");
+    assertThat(i.auth.loginText).isEqualTo("LOGIN");
+    assertThat(i.auth.switchAccountUrl).isEqualTo("https://example.com/switch");
+    assertThat(i.auth.registerUrl).isNull();
+    assertThat(i.auth.registerText).isNull();
+    assertThat(i.auth.editFullNameUrl).isNull();
+    assertThat(i.auth.httpPasswordUrl).isNull();
+
+    // change
+    assertThat(i.change.largeChange).isEqualTo(300);
+    assertThat(i.change.replyTooltip).startsWith("Publish votes and draft comments");
+    assertThat(i.change.replyLabel).isEqualTo("Vote\u2026");
+    assertThat(i.change.updateDelay).isEqualTo(50);
+    assertThat(i.change.disablePrivateChanges).isTrue();
+
+    // download
+    assertThat(i.download.archives).containsExactly("tar", "tbz2", "tgz", "txz");
+    assertThat(i.download.schemes).isEmpty();
+
+    // gerrit
+    assertThat(i.gerrit.allProjects).isEqualTo("Root");
+    assertThat(i.gerrit.allUsers).isEqualTo("Users");
+    assertThat(i.gerrit.reportBugUrl).isEqualTo("https://example.com/report");
+    assertThat(i.gerrit.reportBugText).isEqualTo("REPORT BUG");
+
+    // plugin
+    assertThat(i.plugin.jsResourcePaths).isEmpty();
+
+    // sshd
+    assertThat(i.sshd).isNotNull();
+
+    // suggest
+    assertThat(i.suggest.from).isEqualTo(3);
+
+    // user
+    assertThat(i.user.anonymousCowardName).isEqualTo("Unnamed User");
+
+    // notedb
+    notesMigration.setReadChanges(true);
+    assertThat(gApi.config().server().getInfo().noteDbEnabled).isTrue();
+    notesMigration.setReadChanges(false);
+    assertThat(gApi.config().server().getInfo().noteDbEnabled).isNull();
+  }
+
+  @Test
+  @GerritConfig(name = "plugins.allowRemoteAdmin", value = "true")
+  public void serverConfigWithPlugin() throws Exception {
+    ServerInfo i = gApi.config().server().getInfo();
+    assertThat(i.plugin.jsResourcePaths).isEmpty();
+
+    InstallPluginInput input = new InstallPluginInput();
+    input.raw = RawInputUtil.create(JS_PLUGIN_CONTENT);
+    gApi.plugins().install("js-plugin-1.js", input);
+
+    i = gApi.config().server().getInfo();
+    assertThat(i.plugin.jsResourcePaths).hasSize(1);
+  }
+
+  @Test
+  public void serverConfigWithDefaults() throws Exception {
+    ServerInfo i = gApi.config().server().getInfo();
+
+    // auth
+    assertThat(i.auth.authType).isEqualTo(AuthType.OPENID);
+    assertThat(i.auth.editableAccountFields)
+        .containsExactly(
+            AccountFieldName.REGISTER_NEW_EMAIL,
+            AccountFieldName.FULL_NAME,
+            AccountFieldName.USER_NAME);
+    assertThat(i.auth.useContributorAgreements).isNull();
+    assertThat(i.auth.loginUrl).isNull();
+    assertThat(i.auth.loginText).isNull();
+    assertThat(i.auth.switchAccountUrl).isNull();
+    assertThat(i.auth.registerUrl).isNull();
+    assertThat(i.auth.registerText).isNull();
+    assertThat(i.auth.editFullNameUrl).isNull();
+    assertThat(i.auth.httpPasswordUrl).isNull();
+
+    // change
+    assertThat(i.change.largeChange).isEqualTo(500);
+    assertThat(i.change.replyTooltip).startsWith("Reply and score");
+    assertThat(i.change.replyLabel).isEqualTo("Reply\u2026");
+    assertThat(i.change.updateDelay).isEqualTo(300);
+    assertThat(i.change.disablePrivateChanges).isNull();
+
+    // download
+    assertThat(i.download.archives).containsExactly("tar", "tbz2", "tgz", "txz");
+    assertThat(i.download.schemes).isEmpty();
+
+    // gerrit
+    assertThat(i.gerrit.allProjects).isEqualTo(AllProjectsNameProvider.DEFAULT);
+    assertThat(i.gerrit.allUsers).isEqualTo(AllUsersNameProvider.DEFAULT);
+    assertThat(i.gerrit.reportBugUrl).isNull();
+    assertThat(i.gerrit.reportBugText).isNull();
+
+    // plugin
+    assertThat(i.plugin.jsResourcePaths).isEmpty();
+
+    // sshd
+    assertThat(i.sshd).isNotNull();
+
+    // suggest
+    assertThat(i.suggest.from).isEqualTo(0);
+
+    // user
+    assertThat(i.user.anonymousCowardName).isEqualTo(AnonymousCowardNameProvider.DEFAULT);
+  }
+
+  @Test
+  @GerritConfig(name = "auth.contributorAgreements", value = "true")
+  public void anonymousAccess() throws Exception {
+    configureContributorAgreement(true);
+
+    setApiUserAnonymous();
+    gApi.config().server().getInfo();
+  }
+}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/group/AddMemberIT.java b/javatests/com/google/gerrit/acceptance/rest/group/AddMemberIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/group/AddMemberIT.java
rename to javatests/com/google/gerrit/acceptance/rest/group/AddMemberIT.java
diff --git a/javatests/com/google/gerrit/acceptance/rest/group/BUILD b/javatests/com/google/gerrit/acceptance/rest/group/BUILD
new file mode 100644
index 0000000..8925368
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/group/BUILD
@@ -0,0 +1,7 @@
+load("//javatests/com/google/gerrit/acceptance:tests.bzl", "acceptance_tests")
+
+acceptance_tests(
+    srcs = glob(["*IT.java"]),
+    group = "rest_group",
+    labels = ["rest"],
+)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/group/GroupsIT.java b/javatests/com/google/gerrit/acceptance/rest/group/GroupsIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/group/GroupsIT.java
rename to javatests/com/google/gerrit/acceptance/rest/group/GroupsIT.java
diff --git a/javatests/com/google/gerrit/acceptance/rest/project/AbstractPushTag.java b/javatests/com/google/gerrit/acceptance/rest/project/AbstractPushTag.java
new file mode 100644
index 0000000..95bc5a6
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/project/AbstractPushTag.java
@@ -0,0 +1,261 @@
+// 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.
+
+package com.google.gerrit.acceptance.rest.project;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.acceptance.GitUtil.createAnnotatedTag;
+import static com.google.gerrit.acceptance.GitUtil.deleteRef;
+import static com.google.gerrit.acceptance.GitUtil.pushHead;
+import static com.google.gerrit.acceptance.GitUtil.updateAnnotatedTag;
+import static com.google.gerrit.acceptance.rest.project.AbstractPushTag.TagType.ANNOTATED;
+import static com.google.gerrit.acceptance.rest.project.AbstractPushTag.TagType.LIGHTWEIGHT;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+
+import com.google.common.base.MoreObjects;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.GitUtil;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.reviewdb.client.RefNames;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.transport.PushResult;
+import org.eclipse.jgit.transport.RemoteRefUpdate;
+import org.eclipse.jgit.transport.RemoteRefUpdate.Status;
+import org.junit.Before;
+import org.junit.Test;
+
+@NoHttpd
+public abstract class AbstractPushTag extends AbstractDaemonTest {
+  enum TagType {
+    LIGHTWEIGHT(Permission.CREATE),
+    ANNOTATED(Permission.CREATE_TAG);
+
+    final String createPermission;
+
+    TagType(String createPermission) {
+      this.createPermission = createPermission;
+    }
+  }
+
+  private RevCommit initialHead;
+  private TagType tagType;
+
+  @Before
+  public void setUpTestEnvironment() throws Exception {
+    // clone with user to avoid inherited tag permissions of admin user
+    testRepo = cloneProject(project, user);
+
+    initialHead = getRemoteHead();
+    tagType = getTagType();
+  }
+
+  protected abstract TagType getTagType();
+
+  @Test
+  public void createTagForExistingCommit() throws Exception {
+    pushTagForExistingCommit(Status.REJECTED_OTHER_REASON);
+
+    allowTagCreation();
+    pushTagForExistingCommit(Status.OK);
+
+    allowPushOnRefsTags();
+    pushTagForExistingCommit(Status.OK);
+
+    removePushFromRefsTags();
+  }
+
+  @Test
+  public void createTagForNewCommit() throws Exception {
+    pushTagForNewCommit(Status.REJECTED_OTHER_REASON);
+
+    allowTagCreation();
+    pushTagForNewCommit(Status.REJECTED_OTHER_REASON);
+
+    allowPushOnRefsTags();
+    pushTagForNewCommit(Status.OK);
+
+    removePushFromRefsTags();
+  }
+
+  @Test
+  public void fastForward() throws Exception {
+    allowTagCreation();
+    String tagName = pushTagForExistingCommit(Status.OK);
+
+    fastForwardTagToExistingCommit(tagName, Status.REJECTED_OTHER_REASON);
+    fastForwardTagToNewCommit(tagName, Status.REJECTED_OTHER_REASON);
+
+    allowTagDeletion();
+    fastForwardTagToExistingCommit(tagName, Status.REJECTED_OTHER_REASON);
+    fastForwardTagToNewCommit(tagName, Status.REJECTED_OTHER_REASON);
+
+    allowPushOnRefsTags();
+    Status expectedStatus = tagType == ANNOTATED ? Status.REJECTED_OTHER_REASON : Status.OK;
+    fastForwardTagToExistingCommit(tagName, expectedStatus);
+    fastForwardTagToNewCommit(tagName, expectedStatus);
+
+    allowForcePushOnRefsTags();
+    fastForwardTagToExistingCommit(tagName, Status.OK);
+    fastForwardTagToNewCommit(tagName, Status.OK);
+
+    removePushFromRefsTags();
+  }
+
+  @Test
+  public void forceUpdate() throws Exception {
+    allowTagCreation();
+    String tagName = pushTagForExistingCommit(Status.OK);
+
+    forceUpdateTagToExistingCommit(tagName, Status.REJECTED_OTHER_REASON);
+    forceUpdateTagToNewCommit(tagName, Status.REJECTED_OTHER_REASON);
+
+    allowPushOnRefsTags();
+    forceUpdateTagToExistingCommit(tagName, Status.REJECTED_OTHER_REASON);
+    forceUpdateTagToNewCommit(tagName, Status.REJECTED_OTHER_REASON);
+
+    allowTagDeletion();
+    forceUpdateTagToExistingCommit(tagName, Status.REJECTED_OTHER_REASON);
+    forceUpdateTagToNewCommit(tagName, Status.REJECTED_OTHER_REASON);
+
+    allowForcePushOnRefsTags();
+    forceUpdateTagToExistingCommit(tagName, Status.OK);
+    forceUpdateTagToNewCommit(tagName, Status.OK);
+
+    removePushFromRefsTags();
+  }
+
+  @Test
+  public void delete() throws Exception {
+    allowTagCreation();
+    String tagName = pushTagForExistingCommit(Status.OK);
+
+    pushTagDeletion(tagName, Status.REJECTED_OTHER_REASON);
+
+    allowPushOnRefsTags();
+    pushTagDeletion(tagName, Status.REJECTED_OTHER_REASON);
+
+    allowForcePushOnRefsTags();
+    tagName = pushTagForExistingCommit(Status.OK);
+    pushTagDeletion(tagName, Status.OK);
+
+    removePushFromRefsTags();
+    allowTagDeletion();
+    tagName = pushTagForExistingCommit(Status.OK);
+    pushTagDeletion(tagName, Status.OK);
+  }
+
+  private String pushTagForExistingCommit(Status expectedStatus) throws Exception {
+    return pushTag(null, false, false, expectedStatus);
+  }
+
+  private String pushTagForNewCommit(Status expectedStatus) throws Exception {
+    return pushTag(null, true, false, expectedStatus);
+  }
+
+  private void fastForwardTagToExistingCommit(String tagName, Status expectedStatus)
+      throws Exception {
+    pushTag(tagName, false, false, expectedStatus);
+  }
+
+  private void fastForwardTagToNewCommit(String tagName, Status expectedStatus) throws Exception {
+    pushTag(tagName, true, false, expectedStatus);
+  }
+
+  private void forceUpdateTagToExistingCommit(String tagName, Status expectedStatus)
+      throws Exception {
+    pushTag(tagName, false, true, expectedStatus);
+  }
+
+  private void forceUpdateTagToNewCommit(String tagName, Status expectedStatus) throws Exception {
+    pushTag(tagName, true, true, expectedStatus);
+  }
+
+  private String pushTag(String tagName, boolean newCommit, boolean force, Status expectedStatus)
+      throws Exception {
+    if (force) {
+      testRepo.reset(initialHead);
+    }
+    commit(user.getIdent(), "subject");
+
+    boolean createTag = tagName == null;
+    tagName = MoreObjects.firstNonNull(tagName, "v1_" + System.nanoTime());
+    switch (tagType) {
+      case LIGHTWEIGHT:
+        break;
+      case ANNOTATED:
+        if (createTag) {
+          createAnnotatedTag(testRepo, tagName, user.getIdent());
+        } else {
+          updateAnnotatedTag(testRepo, tagName, user.getIdent());
+        }
+        break;
+      default:
+        throw new IllegalStateException("unexpected tag type: " + tagType);
+    }
+
+    if (!newCommit) {
+      grant(project, "refs/for/refs/heads/master", Permission.SUBMIT, false, REGISTERED_USERS);
+      pushHead(testRepo, "refs/for/master%submit");
+    }
+
+    String tagRef = tagRef(tagName);
+    PushResult r =
+        tagType == LIGHTWEIGHT
+            ? pushHead(testRepo, tagRef, false, force)
+            : GitUtil.pushTag(testRepo, tagName, !createTag);
+    RemoteRefUpdate refUpdate = r.getRemoteUpdate(tagRef);
+    assertThat(refUpdate.getStatus()).named(tagType.name()).isEqualTo(expectedStatus);
+    return tagName;
+  }
+
+  private void pushTagDeletion(String tagName, Status expectedStatus) throws Exception {
+    String tagRef = tagRef(tagName);
+    PushResult r = deleteRef(testRepo, tagRef);
+    RemoteRefUpdate refUpdate = r.getRemoteUpdate(tagRef);
+    assertThat(refUpdate.getStatus()).named(tagType.name()).isEqualTo(expectedStatus);
+  }
+
+  private void allowTagCreation() throws Exception {
+    grant(project, "refs/tags/*", tagType.createPermission, false, REGISTERED_USERS);
+  }
+
+  private void allowPushOnRefsTags() throws Exception {
+    removePushFromRefsTags();
+    grant(project, "refs/tags/*", Permission.PUSH, false, REGISTERED_USERS);
+  }
+
+  private void allowForcePushOnRefsTags() throws Exception {
+    removePushFromRefsTags();
+    grant(project, "refs/tags/*", Permission.PUSH, true, REGISTERED_USERS);
+  }
+
+  private void allowTagDeletion() throws Exception {
+    removePushFromRefsTags();
+    grant(project, "refs/tags/*", Permission.DELETE, true, REGISTERED_USERS);
+  }
+
+  private void removePushFromRefsTags() throws Exception {
+    removePermission(project, "refs/tags/*", Permission.PUSH);
+  }
+
+  private void commit(PersonIdent ident, String subject) throws Exception {
+    commitBuilder().ident(ident).message(subject + " (" + System.nanoTime() + ")").create();
+  }
+
+  private static String tagRef(String tagName) {
+    return RefNames.REFS_TAGS + tagName;
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/project/AccessIT.java b/javatests/com/google/gerrit/acceptance/rest/project/AccessIT.java
new file mode 100644
index 0000000..2722648
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/project/AccessIT.java
@@ -0,0 +1,748 @@
+// 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.
+package com.google.gerrit.acceptance.rest.project;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth8.assertThat;
+import static com.google.gerrit.extensions.client.ListChangesOption.MESSAGES;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.GitUtil;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.access.AccessSectionInfo;
+import com.google.gerrit.extensions.api.access.PermissionInfo;
+import com.google.gerrit.extensions.api.access.PermissionRuleInfo;
+import com.google.gerrit.extensions.api.access.ProjectAccessInfo;
+import com.google.gerrit.extensions.api.access.ProjectAccessInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.projects.BranchInfo;
+import com.google.gerrit.extensions.api.projects.ProjectApi;
+import com.google.gerrit.extensions.client.ChangeStatus;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.extensions.common.WebLinkInfo;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.webui.FileHistoryWebLink;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.config.AllProjectsNameProvider;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.inject.Inject;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.RefUpdate.Result;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AccessIT extends AbstractDaemonTest {
+
+  private static final String PROJECT_NAME = "newProject";
+
+  private static final String REFS_ALL = Constants.R_REFS + "*";
+  private static final String REFS_HEADS = Constants.R_HEADS + "*";
+
+  private static final String LABEL_CODE_REVIEW = "Code-Review";
+
+  private Project.NameKey newProjectName;
+
+  @Inject private DynamicSet<FileHistoryWebLink> fileHistoryWebLinkDynamicSet;
+
+  @Before
+  public void setUp() throws Exception {
+    newProjectName = createProject(PROJECT_NAME);
+  }
+
+  @Test
+  public void getDefaultInheritance() throws Exception {
+    String inheritedName = pApi().access().inheritsFrom.name;
+    assertThat(inheritedName).isEqualTo(AllProjectsNameProvider.DEFAULT);
+  }
+
+  @Test
+  public void webLink() throws Exception {
+    RegistrationHandle handle =
+        fileHistoryWebLinkDynamicSet.add(
+            "gerrit",
+            new FileHistoryWebLink() {
+              @Override
+              public WebLinkInfo getFileHistoryWebLink(
+                  String projectName, String revision, String fileName) {
+                return new WebLinkInfo(
+                    "name", "imageURL", "http://view/" + projectName + "/" + fileName);
+              }
+            });
+    try {
+      ProjectAccessInfo info = pApi().access();
+      assertThat(info.configWebLinks).hasSize(1);
+      assertThat(info.configWebLinks.get(0).url)
+          .isEqualTo("http://view/" + newProjectName + "/project.config");
+    } finally {
+      handle.remove();
+    }
+  }
+
+  @Test
+  public void webLinkNoRefsMetaConfig() throws Exception {
+    RegistrationHandle handle =
+        fileHistoryWebLinkDynamicSet.add(
+            "gerrit",
+            new FileHistoryWebLink() {
+              @Override
+              public WebLinkInfo getFileHistoryWebLink(
+                  String projectName, String revision, String fileName) {
+                return new WebLinkInfo(
+                    "name", "imageURL", "http://view/" + projectName + "/" + fileName);
+              }
+            });
+    try (Repository repo = repoManager.openRepository(newProjectName)) {
+      RefUpdate u = repo.updateRef(RefNames.REFS_CONFIG);
+      u.setForceUpdate(true);
+      assertThat(u.delete()).isEqualTo(Result.FORCED);
+
+      // This should not crash.
+      pApi().access();
+    } finally {
+      handle.remove();
+    }
+  }
+
+  @Test
+  public void addAccessSection() throws Exception {
+    RevCommit initialHead = getRemoteHead(newProjectName, RefNames.REFS_CONFIG);
+
+    ProjectAccessInput accessInput = newProjectAccessInput();
+    AccessSectionInfo accessSectionInfo = createDefaultAccessSectionInfo();
+
+    accessInput.add.put(REFS_HEADS, accessSectionInfo);
+    pApi().access(accessInput);
+
+    assertThat(pApi().access().local).isEqualTo(accessInput.add);
+
+    RevCommit updatedHead = getRemoteHead(newProjectName, RefNames.REFS_CONFIG);
+    eventRecorder.assertRefUpdatedEvents(
+        newProjectName.get(), RefNames.REFS_CONFIG, null, initialHead, initialHead, updatedHead);
+  }
+
+  @Test
+  public void createAccessChangeNop() throws Exception {
+    ProjectAccessInput accessInput = newProjectAccessInput();
+    exception.expect(BadRequestException.class);
+    pApi().accessChange(accessInput);
+  }
+
+  @Test
+  public void createAccessChangeEmptyConfig() throws Exception {
+    try (Repository repo = repoManager.openRepository(newProjectName)) {
+      RefUpdate ru = repo.updateRef(RefNames.REFS_CONFIG);
+      ru.setForceUpdate(true);
+      assertThat(ru.delete()).isEqualTo(Result.FORCED);
+
+      ProjectAccessInput accessInput = newProjectAccessInput();
+      AccessSectionInfo accessSection = newAccessSectionInfo();
+      PermissionInfo read = newPermissionInfo();
+      PermissionRuleInfo pri = new PermissionRuleInfo(PermissionRuleInfo.Action.BLOCK, false);
+      read.rules.put(SystemGroupBackend.REGISTERED_USERS.get(), pri);
+      accessSection.permissions.put(Permission.READ, read);
+      accessInput.add.put(REFS_HEADS, accessSection);
+
+      ChangeInfo out = pApi().accessChange(accessInput);
+      assertThat(out.status).isEqualTo(ChangeStatus.NEW);
+    }
+  }
+
+  @Test
+  public void createAccessChange() throws Exception {
+    allow(newProjectName, RefNames.REFS_CONFIG, Permission.READ, REGISTERED_USERS);
+    // User can see the branch
+    setApiUser(user);
+    pApi().branch("refs/heads/master").get();
+
+    ProjectAccessInput accessInput = newProjectAccessInput();
+
+    AccessSectionInfo accessSection = newAccessSectionInfo();
+
+    // Deny read to registered users.
+    PermissionInfo read = newPermissionInfo();
+    PermissionRuleInfo pri = new PermissionRuleInfo(PermissionRuleInfo.Action.DENY, false);
+    read.rules.put(SystemGroupBackend.REGISTERED_USERS.get(), pri);
+    read.exclusive = true;
+    accessSection.permissions.put(Permission.READ, read);
+    accessInput.add.put(REFS_HEADS, accessSection);
+
+    setApiUser(user);
+    ChangeInfo out = pApi().accessChange(accessInput);
+
+    assertThat(out.project).isEqualTo(newProjectName.get());
+    assertThat(out.branch).isEqualTo(RefNames.REFS_CONFIG);
+    assertThat(out.status).isEqualTo(ChangeStatus.NEW);
+    assertThat(out.submitted).isNull();
+
+    setApiUser(admin);
+
+    ChangeInfo c = gApi.changes().id(out._number).get(MESSAGES);
+    assertThat(c.messages.stream().map(m -> m.message)).containsExactly("Uploaded patch set 1");
+
+    ReviewInput reviewIn = new ReviewInput();
+    reviewIn.label("Code-Review", (short) 2);
+    gApi.changes().id(out._number).current().review(reviewIn);
+    gApi.changes().id(out._number).current().submit();
+
+    // check that the change took effect.
+    setApiUser(user);
+    try {
+      BranchInfo info = pApi().branch("refs/heads/master").get();
+      fail("wanted failure, got " + newGson().toJson(info));
+    } catch (ResourceNotFoundException e) {
+      // OK.
+    }
+
+    // Restore.
+    accessInput.add.clear();
+    accessInput.remove.put(REFS_HEADS, accessSection);
+    setApiUser(user);
+
+    setApiUser(admin);
+    out = pApi().accessChange(accessInput);
+
+    gApi.changes().id(out._number).current().review(reviewIn);
+    gApi.changes().id(out._number).current().submit();
+
+    // Now it works again.
+    setApiUser(user);
+    pApi().branch("refs/heads/master").get();
+  }
+
+  @Test
+  public void removePermission() throws Exception {
+    // Add initial permission set
+    ProjectAccessInput accessInput = newProjectAccessInput();
+    AccessSectionInfo accessSectionInfo = createDefaultAccessSectionInfo();
+
+    accessInput.add.put(REFS_HEADS, accessSectionInfo);
+    pApi().access(accessInput);
+
+    // Remove specific permission
+    AccessSectionInfo accessSectionToRemove = newAccessSectionInfo();
+    accessSectionToRemove.permissions.put(
+        Permission.LABEL + LABEL_CODE_REVIEW, newPermissionInfo());
+    ProjectAccessInput removal = newProjectAccessInput();
+    removal.remove.put(REFS_HEADS, accessSectionToRemove);
+    pApi().access(removal);
+
+    // Remove locally
+    accessInput.add.get(REFS_HEADS).permissions.remove(Permission.LABEL + LABEL_CODE_REVIEW);
+
+    // Check
+    assertThat(pApi().access().local).isEqualTo(accessInput.add);
+  }
+
+  @Test
+  public void removePermissionRule() throws Exception {
+    // Add initial permission set
+    ProjectAccessInput accessInput = newProjectAccessInput();
+    AccessSectionInfo accessSectionInfo = createDefaultAccessSectionInfo();
+
+    accessInput.add.put(REFS_HEADS, accessSectionInfo);
+    pApi().access(accessInput);
+
+    // Remove specific permission rule
+    AccessSectionInfo accessSectionToRemove = newAccessSectionInfo();
+    PermissionInfo codeReview = newPermissionInfo();
+    codeReview.label = LABEL_CODE_REVIEW;
+    PermissionRuleInfo pri = new PermissionRuleInfo(PermissionRuleInfo.Action.DENY, false);
+    codeReview.rules.put(SystemGroupBackend.REGISTERED_USERS.get(), pri);
+    accessSectionToRemove.permissions.put(Permission.LABEL + LABEL_CODE_REVIEW, codeReview);
+    ProjectAccessInput removal = newProjectAccessInput();
+    removal.remove.put(REFS_HEADS, accessSectionToRemove);
+    pApi().access(removal);
+
+    // Remove locally
+    accessInput
+        .add
+        .get(REFS_HEADS)
+        .permissions
+        .get(Permission.LABEL + LABEL_CODE_REVIEW)
+        .rules
+        .remove(SystemGroupBackend.REGISTERED_USERS.get());
+
+    // Check
+    assertThat(pApi().access().local).isEqualTo(accessInput.add);
+  }
+
+  @Test
+  public void removePermissionRulesAndCleanupEmptyEntries() throws Exception {
+    // Add initial permission set
+    ProjectAccessInput accessInput = newProjectAccessInput();
+    AccessSectionInfo accessSectionInfo = createDefaultAccessSectionInfo();
+
+    accessInput.add.put(REFS_HEADS, accessSectionInfo);
+    pApi().access(accessInput);
+
+    // Remove specific permission rules
+    AccessSectionInfo accessSectionToRemove = newAccessSectionInfo();
+    PermissionInfo codeReview = newPermissionInfo();
+    codeReview.label = LABEL_CODE_REVIEW;
+    PermissionRuleInfo pri = new PermissionRuleInfo(PermissionRuleInfo.Action.DENY, false);
+    codeReview.rules.put(SystemGroupBackend.REGISTERED_USERS.get(), pri);
+    pri = new PermissionRuleInfo(PermissionRuleInfo.Action.DENY, false);
+    codeReview.rules.put(SystemGroupBackend.PROJECT_OWNERS.get(), pri);
+    accessSectionToRemove.permissions.put(Permission.LABEL + LABEL_CODE_REVIEW, codeReview);
+    ProjectAccessInput removal = newProjectAccessInput();
+    removal.remove.put(REFS_HEADS, accessSectionToRemove);
+    pApi().access(removal);
+
+    // Remove locally
+    accessInput.add.get(REFS_HEADS).permissions.remove(Permission.LABEL + LABEL_CODE_REVIEW);
+
+    // Check
+    assertThat(pApi().access().local).isEqualTo(accessInput.add);
+  }
+
+  @Test
+  public void getPermissionsWithDisallowedUser() throws Exception {
+    // Add initial permission set
+    ProjectAccessInput accessInput = newProjectAccessInput();
+    AccessSectionInfo accessSectionInfo = createAccessSectionInfoDenyAll();
+
+    // Disallow READ
+    accessInput.add.put(REFS_ALL, accessSectionInfo);
+    pApi().access(accessInput);
+
+    setApiUser(user);
+    exception.expect(ResourceNotFoundException.class);
+    pApi().access();
+  }
+
+  @Test
+  public void setPermissionsWithDisallowedUser() throws Exception {
+    // Add initial permission set
+    ProjectAccessInput accessInput = newProjectAccessInput();
+    AccessSectionInfo accessSectionInfo = createAccessSectionInfoDenyAll();
+
+    // Disallow READ
+    accessInput.add.put(REFS_ALL, accessSectionInfo);
+    pApi().access(accessInput);
+
+    // Create a change to apply
+    ProjectAccessInput accessInfoToApply = newProjectAccessInput();
+    AccessSectionInfo accessSectionInfoToApply = createDefaultAccessSectionInfo();
+    accessInfoToApply.add.put(REFS_HEADS, accessSectionInfoToApply);
+
+    setApiUser(user);
+    exception.expect(ResourceNotFoundException.class);
+    pApi().access();
+  }
+
+  @Test
+  public void permissionsGroupMap() throws Exception {
+    // Add initial permission set
+    ProjectAccessInput accessInput = newProjectAccessInput();
+    AccessSectionInfo accessSection = newAccessSectionInfo();
+
+    PermissionInfo push = newPermissionInfo();
+    PermissionRuleInfo pri = new PermissionRuleInfo(PermissionRuleInfo.Action.ALLOW, false);
+    push.rules.put(SystemGroupBackend.PROJECT_OWNERS.get(), pri);
+    accessSection.permissions.put(Permission.PUSH, push);
+
+    PermissionInfo read = newPermissionInfo();
+    pri = new PermissionRuleInfo(PermissionRuleInfo.Action.ALLOW, false);
+    read.rules.put(SystemGroupBackend.ANONYMOUS_USERS.get(), pri);
+    accessSection.permissions.put(Permission.READ, read);
+
+    accessInput.add.put(REFS_ALL, accessSection);
+    ProjectAccessInfo result = pApi().access(accessInput);
+    assertThat(result.groups.keySet())
+        .containsExactly(
+            SystemGroupBackend.PROJECT_OWNERS.get(), SystemGroupBackend.ANONYMOUS_USERS.get());
+
+    // Check the name, which is what the UI cares about; exhaustive
+    // coverage of GroupInfo should be in groups REST API tests.
+    assertThat(result.groups.get(SystemGroupBackend.PROJECT_OWNERS.get()).name)
+        .isEqualTo("Project Owners");
+    // Strip the ID, since it is in the key.
+    assertThat(result.groups.get(SystemGroupBackend.PROJECT_OWNERS.get()).id).isNull();
+
+    // Get call returns groups too.
+    ProjectAccessInfo loggedInResult = pApi().access();
+    assertThat(loggedInResult.groups.keySet())
+        .containsExactly(
+            SystemGroupBackend.PROJECT_OWNERS.get(), SystemGroupBackend.ANONYMOUS_USERS.get());
+
+    GroupInfo owners = loggedInResult.groups.get(SystemGroupBackend.PROJECT_OWNERS.get());
+    assertThat(owners.name).isEqualTo("Project Owners");
+    assertThat(owners.id).isNull();
+    assertThat(owners.members).isNull();
+    assertThat(owners.includes).isNull();
+
+    // PROJECT_OWNERS is invisible to anonymous user, but GetAccess disregards visibility.
+    setApiUserAnonymous();
+    ProjectAccessInfo anonResult = pApi().access();
+    assertThat(anonResult.groups.keySet())
+        .containsExactly(
+            SystemGroupBackend.PROJECT_OWNERS.get(), SystemGroupBackend.ANONYMOUS_USERS.get());
+  }
+
+  @Test
+  public void updateParentAsUser() throws Exception {
+    // Create child
+    String newParentProjectName = createProject(PROJECT_NAME + "PA").get();
+
+    // Set new parent
+    ProjectAccessInput accessInput = newProjectAccessInput();
+    accessInput.parent = newParentProjectName;
+
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    exception.expectMessage("administrate server not permitted");
+    pApi().access(accessInput);
+  }
+
+  @Test
+  public void updateParentAsAdministrator() throws Exception {
+    // Create parent
+    String newParentProjectName = createProject(PROJECT_NAME + "PA").get();
+
+    // Set new parent
+    ProjectAccessInput accessInput = newProjectAccessInput();
+    accessInput.parent = newParentProjectName;
+
+    pApi().access(accessInput);
+
+    assertThat(pApi().access().inheritsFrom.name).isEqualTo(newParentProjectName);
+  }
+
+  @Test
+  public void addGlobalCapabilityAsUser() throws Exception {
+    ProjectAccessInput accessInput = newProjectAccessInput();
+    AccessSectionInfo accessSectionInfo = createDefaultGlobalCapabilitiesAccessSectionInfo();
+
+    accessInput.add.put(AccessSection.GLOBAL_CAPABILITIES, accessSectionInfo);
+
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    gApi.projects().name(allProjects.get()).access(accessInput);
+  }
+
+  @Test
+  public void addGlobalCapabilityAsAdmin() throws Exception {
+    ProjectAccessInput accessInput = newProjectAccessInput();
+    AccessSectionInfo accessSectionInfo = createDefaultGlobalCapabilitiesAccessSectionInfo();
+
+    accessInput.add.put(AccessSection.GLOBAL_CAPABILITIES, accessSectionInfo);
+
+    ProjectAccessInfo updatedAccessSectionInfo =
+        gApi.projects().name(allProjects.get()).access(accessInput);
+    assertThat(
+            updatedAccessSectionInfo
+                .local
+                .get(AccessSection.GLOBAL_CAPABILITIES)
+                .permissions
+                .keySet())
+        .containsAllIn(accessSectionInfo.permissions.keySet());
+  }
+
+  @Test
+  public void addGlobalCapabilityForNonRootProject() throws Exception {
+    ProjectAccessInput accessInput = newProjectAccessInput();
+    AccessSectionInfo accessSectionInfo = createDefaultGlobalCapabilitiesAccessSectionInfo();
+
+    accessInput.add.put(AccessSection.GLOBAL_CAPABILITIES, accessSectionInfo);
+
+    exception.expect(BadRequestException.class);
+    pApi().access(accessInput);
+  }
+
+  @Test
+  public void addNonGlobalCapabilityToGlobalCapabilities() throws Exception {
+    ProjectAccessInput accessInput = newProjectAccessInput();
+    AccessSectionInfo accessSectionInfo = newAccessSectionInfo();
+
+    PermissionInfo permissionInfo = newPermissionInfo();
+    permissionInfo.rules.put(adminGroupUuid().get(), null);
+    accessSectionInfo.permissions.put(Permission.PUSH, permissionInfo);
+
+    accessInput.add.put(AccessSection.GLOBAL_CAPABILITIES, accessSectionInfo);
+
+    exception.expect(BadRequestException.class);
+    gApi.projects().name(allProjects.get()).access(accessInput);
+  }
+
+  @Test
+  public void removeGlobalCapabilityAsUser() throws Exception {
+    ProjectAccessInput accessInput = newProjectAccessInput();
+    AccessSectionInfo accessSectionInfo = createDefaultGlobalCapabilitiesAccessSectionInfo();
+
+    accessInput.remove.put(AccessSection.GLOBAL_CAPABILITIES, accessSectionInfo);
+
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    gApi.projects().name(allProjects.get()).access(accessInput);
+  }
+
+  @Test
+  public void removeGlobalCapabilityAsAdmin() throws Exception {
+    ProjectAccessInput accessInput = newProjectAccessInput();
+    AccessSectionInfo accessSectionInfo = newAccessSectionInfo();
+
+    PermissionInfo permissionInfo = newPermissionInfo();
+    permissionInfo.rules.put(adminGroupUuid().get(), null);
+    accessSectionInfo.permissions.put(GlobalCapability.ACCESS_DATABASE, permissionInfo);
+
+    // Add and validate first as removing existing privileges such as
+    // administrateServer would break upcoming tests
+    accessInput.add.put(AccessSection.GLOBAL_CAPABILITIES, accessSectionInfo);
+
+    ProjectAccessInfo updatedProjectAccessInfo =
+        gApi.projects().name(allProjects.get()).access(accessInput);
+    assertThat(
+            updatedProjectAccessInfo
+                .local
+                .get(AccessSection.GLOBAL_CAPABILITIES)
+                .permissions
+                .keySet())
+        .containsAllIn(accessSectionInfo.permissions.keySet());
+
+    // Remove
+    accessInput.add.clear();
+    accessInput.remove.put(AccessSection.GLOBAL_CAPABILITIES, accessSectionInfo);
+
+    updatedProjectAccessInfo = gApi.projects().name(allProjects.get()).access(accessInput);
+    assertThat(
+            updatedProjectAccessInfo
+                .local
+                .get(AccessSection.GLOBAL_CAPABILITIES)
+                .permissions
+                .keySet())
+        .containsNoneIn(accessSectionInfo.permissions.keySet());
+  }
+
+  @Test
+  public void unknownPermissionRemainsUnchanged() throws Exception {
+    String access = "access";
+    String unknownPermission = "unknownPermission";
+    String registeredUsers = "group Registered Users";
+    String refsFor = "refs/for/*";
+    // Clone repository to forcefully add permission
+    TestRepository<InMemoryRepository> allProjectsRepo = cloneProject(allProjects, admin);
+
+    // Fetch permission ref
+    GitUtil.fetch(allProjectsRepo, "refs/meta/config:cfg");
+    allProjectsRepo.reset("cfg");
+
+    // Load current permissions
+    String config =
+        gApi.projects()
+            .name(allProjects.get())
+            .branch(RefNames.REFS_CONFIG)
+            .file(ProjectConfig.PROJECT_CONFIG)
+            .asString();
+
+    // Append and push unknown permission
+    Config cfg = new Config();
+    cfg.fromText(config);
+    cfg.setString(access, refsFor, unknownPermission, registeredUsers);
+    config = cfg.toText();
+    PushOneCommit push =
+        pushFactory.create(
+            db, admin.getIdent(), allProjectsRepo, "Subject", ProjectConfig.PROJECT_CONFIG, config);
+    push.to(RefNames.REFS_CONFIG).assertOkStatus();
+
+    // Verify that unknownPermission is present
+    config =
+        gApi.projects()
+            .name(allProjects.get())
+            .branch(RefNames.REFS_CONFIG)
+            .file(ProjectConfig.PROJECT_CONFIG)
+            .asString();
+    cfg.fromText(config);
+    assertThat(cfg.getString(access, refsFor, unknownPermission)).isEqualTo(registeredUsers);
+
+    // Make permission change through API
+    ProjectAccessInput accessInput = newProjectAccessInput();
+    AccessSectionInfo accessSectionInfo = createDefaultAccessSectionInfo();
+    accessInput.add.put(refsFor, accessSectionInfo);
+    gApi.projects().name(allProjects.get()).access(accessInput);
+    accessInput.add.clear();
+    accessInput.remove.put(refsFor, accessSectionInfo);
+    gApi.projects().name(allProjects.get()).access(accessInput);
+
+    // Verify that unknownPermission is still present
+    config =
+        gApi.projects()
+            .name(allProjects.get())
+            .branch(RefNames.REFS_CONFIG)
+            .file(ProjectConfig.PROJECT_CONFIG)
+            .asString();
+    cfg.fromText(config);
+    assertThat(cfg.getString(access, refsFor, unknownPermission)).isEqualTo(registeredUsers);
+  }
+
+  @Test
+  public void allUsersCanOnlyInheritFromAllProjects() throws Exception {
+    ProjectAccessInput accessInput = newProjectAccessInput();
+    accessInput.parent = project.get();
+    exception.expect(BadRequestException.class);
+    exception.expectMessage(allUsers.get() + " must inherit from " + allProjects.get());
+    gApi.projects().name(allUsers.get()).access(accessInput);
+  }
+
+  @Test
+  public void syncCreateGroupPermission() throws Exception {
+    // Grant CREATE_GROUP to Registered Users
+    ProjectAccessInput accessInput = newProjectAccessInput();
+    AccessSectionInfo accessSection = newAccessSectionInfo();
+    PermissionInfo createGroup = newPermissionInfo();
+    PermissionRuleInfo pri = new PermissionRuleInfo(PermissionRuleInfo.Action.ALLOW, false);
+    createGroup.rules.put(SystemGroupBackend.REGISTERED_USERS.get(), pri);
+    accessSection.permissions.put(GlobalCapability.CREATE_GROUP, createGroup);
+    accessInput.add.put(AccessSection.GLOBAL_CAPABILITIES, accessSection);
+    gApi.projects().name(allProjects.get()).access(accessInput);
+
+    // Assert that the permission was synced from All-Projects (global) to All-Users (ref)
+    Map<String, AccessSectionInfo> local = gApi.projects().name("All-Users").access().local;
+    assertThat(local).isNotNull();
+    assertThat(local).containsKey(RefNames.REFS_GROUPS + "*");
+    Map<String, PermissionInfo> permissions = local.get(RefNames.REFS_GROUPS + "*").permissions;
+    assertThat(permissions).hasSize(2);
+    // READ is the default permission and should be preserved by the syncer
+    assertThat(permissions.keySet()).containsExactly(Permission.READ, Permission.CREATE);
+    Map<String, PermissionRuleInfo> rules = permissions.get(Permission.CREATE).rules;
+    assertThat(rules.values()).containsExactly(pri);
+
+    // Revoke the permission
+    accessInput.add.clear();
+    accessInput.remove.put(AccessSection.GLOBAL_CAPABILITIES, accessSection);
+    gApi.projects().name(allProjects.get()).access(accessInput);
+
+    // Assert that the permission was synced from All-Projects (global) to All-Users (ref)
+    Map<String, AccessSectionInfo> local2 = gApi.projects().name("All-Users").access().local;
+    assertThat(local2).isNotNull();
+    assertThat(local2).containsKey(RefNames.REFS_GROUPS + "*");
+    Map<String, PermissionInfo> permissions2 = local2.get(RefNames.REFS_GROUPS + "*").permissions;
+    assertThat(permissions2).hasSize(1);
+    // READ is the default permission and should be preserved by the syncer
+    assertThat(permissions2.keySet()).containsExactly(Permission.READ);
+  }
+
+  @Test
+  public void addAccessSectionForInvalidRef() throws Exception {
+    ProjectAccessInput accessInput = newProjectAccessInput();
+    AccessSectionInfo accessSectionInfo = createDefaultAccessSectionInfo();
+
+    // 'refs/heads/stable_*' is invalid, correct would be '^refs/heads/stable_.*'
+    String invalidRef = Constants.R_HEADS + "stable_*";
+    accessInput.add.put(invalidRef, accessSectionInfo);
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("Invalid Name: " + invalidRef);
+    pApi().access(accessInput);
+  }
+
+  @Test
+  public void createAccessChangeWithAccessSectionForInvalidRef() throws Exception {
+    ProjectAccessInput accessInput = newProjectAccessInput();
+    AccessSectionInfo accessSectionInfo = createDefaultAccessSectionInfo();
+
+    // 'refs/heads/stable_*' is invalid, correct would be '^refs/heads/stable_.*'
+    String invalidRef = Constants.R_HEADS + "stable_*";
+    accessInput.add.put(invalidRef, accessSectionInfo);
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("Invalid Name: " + invalidRef);
+    pApi().accessChange(accessInput);
+  }
+
+  private ProjectApi pApi() throws Exception {
+    return gApi.projects().name(newProjectName.get());
+  }
+
+  private ProjectAccessInput newProjectAccessInput() {
+    ProjectAccessInput p = new ProjectAccessInput();
+    p.add = new HashMap<>();
+    p.remove = new HashMap<>();
+    return p;
+  }
+
+  private PermissionInfo newPermissionInfo() {
+    PermissionInfo p = new PermissionInfo(null, null);
+    p.rules = new HashMap<>();
+    return p;
+  }
+
+  private AccessSectionInfo newAccessSectionInfo() {
+    AccessSectionInfo a = new AccessSectionInfo();
+    a.permissions = new HashMap<>();
+    return a;
+  }
+
+  private AccessSectionInfo createDefaultAccessSectionInfo() {
+    AccessSectionInfo accessSection = newAccessSectionInfo();
+
+    PermissionInfo push = newPermissionInfo();
+    PermissionRuleInfo pri = new PermissionRuleInfo(PermissionRuleInfo.Action.ALLOW, false);
+    push.rules.put(SystemGroupBackend.REGISTERED_USERS.get(), pri);
+    accessSection.permissions.put(Permission.PUSH, push);
+
+    PermissionInfo codeReview = newPermissionInfo();
+    codeReview.label = LABEL_CODE_REVIEW;
+    pri = new PermissionRuleInfo(PermissionRuleInfo.Action.DENY, false);
+    codeReview.rules.put(SystemGroupBackend.REGISTERED_USERS.get(), pri);
+
+    pri = new PermissionRuleInfo(PermissionRuleInfo.Action.ALLOW, false);
+    pri.max = 1;
+    pri.min = -1;
+    codeReview.rules.put(SystemGroupBackend.PROJECT_OWNERS.get(), pri);
+    accessSection.permissions.put(Permission.LABEL + LABEL_CODE_REVIEW, codeReview);
+
+    return accessSection;
+  }
+
+  private AccessSectionInfo createDefaultGlobalCapabilitiesAccessSectionInfo() {
+    AccessSectionInfo accessSection = newAccessSectionInfo();
+
+    PermissionInfo email = newPermissionInfo();
+    PermissionRuleInfo pri = new PermissionRuleInfo(PermissionRuleInfo.Action.ALLOW, false);
+    email.rules.put(SystemGroupBackend.REGISTERED_USERS.get(), pri);
+    accessSection.permissions.put(GlobalCapability.EMAIL_REVIEWERS, email);
+
+    return accessSection;
+  }
+
+  private AccessSectionInfo createAccessSectionInfoDenyAll() {
+    AccessSectionInfo accessSection = newAccessSectionInfo();
+
+    PermissionInfo read = newPermissionInfo();
+    PermissionRuleInfo pri = new PermissionRuleInfo(PermissionRuleInfo.Action.DENY, false);
+    read.rules.put(SystemGroupBackend.ANONYMOUS_USERS.get(), pri);
+    accessSection.permissions.put(Permission.READ, read);
+
+    return accessSection;
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/project/BUILD b/javatests/com/google/gerrit/acceptance/rest/project/BUILD
new file mode 100644
index 0000000..64bd5c3
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/project/BUILD
@@ -0,0 +1,50 @@
+load("//javatests/com/google/gerrit/acceptance:tests.bzl", "acceptance_tests")
+
+acceptance_tests(
+    srcs = glob(["*IT.java"]),
+    group = "rest_project",
+    labels = ["rest"],
+    deps = [
+        ":project",
+        ":push_tag_util",
+        ":refassert",
+    ],
+)
+
+java_library(
+    name = "refassert",
+    srcs = [
+        "RefAssert.java",
+    ],
+    deps = [
+        "//java/com/google/gerrit/extensions:api",
+        "//lib:guava",
+        "//lib/truth",
+    ],
+)
+
+java_library(
+    name = "project",
+    srcs = [
+        "ProjectAssert.java",
+    ],
+    deps = [
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//lib:guava",
+        "//lib:gwtorm",
+        "//lib/truth",
+    ],
+)
+
+java_library(
+    name = "push_tag_util",
+    testonly = True,
+    srcs = [
+        "AbstractPushTag.java",
+    ],
+    deps = [
+        "//java/com/google/gerrit/acceptance:lib",
+    ],
+)
diff --git a/javatests/com/google/gerrit/acceptance/rest/project/BanCommitIT.java b/javatests/com/google/gerrit/acceptance/rest/project/BanCommitIT.java
new file mode 100644
index 0000000..1eea84b
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/project/BanCommitIT.java
@@ -0,0 +1,80 @@
+// Copyright (C) 2014 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.google.gerrit.acceptance.rest.project;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.acceptance.GitUtil.pushHead;
+import static org.eclipse.jgit.transport.RemoteRefUpdate.Status.REJECTED_OTHER_REASON;
+
+import com.google.common.collect.Iterables;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.extensions.api.projects.BanCommitInput;
+import com.google.gerrit.server.restapi.project.BanCommit.BanResultInfo;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.transport.RemoteRefUpdate;
+import org.junit.Test;
+
+public class BanCommitIT extends AbstractDaemonTest {
+
+  @Test
+  public void banCommit() throws Exception {
+    RevCommit c = commitBuilder().add("a.txt", "some content").create();
+
+    RestResponse r =
+        adminRestSession.put(
+            "/projects/" + project.get() + "/ban/", BanCommitInput.fromCommits(c.name()));
+    r.assertOK();
+    BanResultInfo info = newGson().fromJson(r.getReader(), BanResultInfo.class);
+    assertThat(Iterables.getOnlyElement(info.newlyBanned)).isEqualTo(c.name());
+    assertThat(info.alreadyBanned).isNull();
+    assertThat(info.ignored).isNull();
+
+    RemoteRefUpdate u =
+        pushHead(testRepo, "refs/heads/master", false).getRemoteUpdate("refs/heads/master");
+    assertThat(u).isNotNull();
+    assertThat(u.getStatus()).isEqualTo(REJECTED_OTHER_REASON);
+    assertThat(u.getMessage()).contains("contains banned commit");
+  }
+
+  @Test
+  public void banAlreadyBannedCommit() throws Exception {
+    RestResponse r =
+        adminRestSession.put(
+            "/projects/" + project.get() + "/ban/",
+            BanCommitInput.fromCommits("a8a477efffbbf3b44169bb9a1d3a334cbbd9aa96"));
+    r.consume();
+
+    r =
+        adminRestSession.put(
+            "/projects/" + project.get() + "/ban/",
+            BanCommitInput.fromCommits("a8a477efffbbf3b44169bb9a1d3a334cbbd9aa96"));
+    r.assertOK();
+    BanResultInfo info = newGson().fromJson(r.getReader(), BanResultInfo.class);
+    assertThat(Iterables.getOnlyElement(info.alreadyBanned))
+        .isEqualTo("a8a477efffbbf3b44169bb9a1d3a334cbbd9aa96");
+    assertThat(info.newlyBanned).isNull();
+    assertThat(info.ignored).isNull();
+  }
+
+  @Test
+  public void banCommit_Forbidden() throws Exception {
+    userRestSession
+        .put(
+            "/projects/" + project.get() + "/ban/",
+            BanCommitInput.fromCommits("a8a477efffbbf3b44169bb9a1d3a334cbbd9aa96"))
+        .assertForbidden();
+  }
+}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CheckMergeabilityIT.java b/javatests/com/google/gerrit/acceptance/rest/project/CheckMergeabilityIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CheckMergeabilityIT.java
rename to javatests/com/google/gerrit/acceptance/rest/project/CheckMergeabilityIT.java
diff --git a/javatests/com/google/gerrit/acceptance/rest/project/CreateBranchIT.java b/javatests/com/google/gerrit/acceptance/rest/project/CreateBranchIT.java
new file mode 100644
index 0000000..df89686
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/project/CreateBranchIT.java
@@ -0,0 +1,172 @@
+// Copyright (C) 2014 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.google.gerrit.acceptance.rest.project;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth8.assertThat;
+import static com.google.gerrit.reviewdb.client.RefNames.REFS_HEADS;
+import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.GerritConfig;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.projects.BranchApi;
+import com.google.gerrit.extensions.api.projects.BranchInfo;
+import com.google.gerrit.extensions.api.projects.BranchInput;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.RefNames;
+import org.junit.Before;
+import org.junit.Test;
+
+public class CreateBranchIT extends AbstractDaemonTest {
+  private Branch.NameKey testBranch;
+
+  @Before
+  public void setUp() throws Exception {
+    testBranch = new Branch.NameKey(project, "test");
+  }
+
+  @Test
+  public void createBranchRestApi() throws Exception {
+    BranchInput input = new BranchInput();
+    input.ref = "foo";
+    assertThat(gApi.projects().name(project.get()).branches().get().stream().map(i -> i.ref))
+        .doesNotContain(REFS_HEADS + input.ref);
+    RestResponse r =
+        adminRestSession.put("/projects/" + project.get() + "/branches/" + input.ref, input);
+    r.assertCreated();
+    assertThat(gApi.projects().name(project.get()).branches().get().stream().map(i -> i.ref))
+        .contains(REFS_HEADS + input.ref);
+  }
+
+  @Test
+  public void createBranch_Forbidden() throws Exception {
+    setApiUser(user);
+    assertCreateFails(testBranch, AuthException.class, "not permitted: create on refs/heads/test");
+  }
+
+  @Test
+  public void createBranchByAdmin() throws Exception {
+    assertCreateSucceeds(testBranch);
+  }
+
+  @Test
+  public void branchAlreadyExists_Conflict() throws Exception {
+    assertCreateSucceeds(testBranch);
+    assertCreateFails(testBranch, ResourceConflictException.class);
+  }
+
+  @Test
+  public void createBranchByProjectOwner() throws Exception {
+    grantOwner();
+    setApiUser(user);
+    assertCreateSucceeds(testBranch);
+  }
+
+  @Test
+  public void createBranchByAdminCreateReferenceBlocked_Forbidden() throws Exception {
+    blockCreateReference();
+    assertCreateFails(testBranch, AuthException.class, "not permitted: create on refs/heads/test");
+  }
+
+  @Test
+  public void createBranchByProjectOwnerCreateReferenceBlocked_Forbidden() throws Exception {
+    grantOwner();
+    blockCreateReference();
+    setApiUser(user);
+    assertCreateFails(testBranch, AuthException.class, "not permitted: create on refs/heads/test");
+  }
+
+  @Test
+  public void createMetaBranch() throws Exception {
+    String metaRef = RefNames.REFS_META + "foo";
+    allow(metaRef, Permission.CREATE, REGISTERED_USERS);
+    allow(metaRef, Permission.PUSH, REGISTERED_USERS);
+    assertCreateSucceeds(new Branch.NameKey(project, metaRef));
+  }
+
+  @Test
+  public void createUserBranch_Conflict() throws Exception {
+    allow(allUsers, RefNames.REFS_USERS + "*", Permission.CREATE, REGISTERED_USERS);
+    allow(allUsers, RefNames.REFS_USERS + "*", Permission.PUSH, REGISTERED_USERS);
+    assertCreateFails(
+        new Branch.NameKey(allUsers, RefNames.refsUsers(new Account.Id(1))),
+        RefNames.refsUsers(admin.getId()),
+        ResourceConflictException.class,
+        "Not allowed to create user branch.");
+  }
+
+  @Test
+  @GerritConfig(name = "noteDb.groups.write", value = "true")
+  public void createGroupBranch_Conflict() throws Exception {
+    allow(allUsers, RefNames.REFS_GROUPS + "*", Permission.CREATE, REGISTERED_USERS);
+    allow(allUsers, RefNames.REFS_GROUPS + "*", Permission.PUSH, REGISTERED_USERS);
+    assertCreateFails(
+        new Branch.NameKey(allUsers, RefNames.refsGroups(new AccountGroup.UUID("foo"))),
+        RefNames.refsGroups(adminGroupUuid()),
+        ResourceConflictException.class,
+        "Not allowed to create group branch.");
+  }
+
+  private void blockCreateReference() throws Exception {
+    block("refs/*", Permission.CREATE, ANONYMOUS_USERS);
+  }
+
+  private void grantOwner() throws Exception {
+    allow("refs/*", Permission.OWNER, REGISTERED_USERS);
+  }
+
+  private BranchApi branch(Branch.NameKey branch) throws Exception {
+    return gApi.projects().name(branch.getParentKey().get()).branch(branch.get());
+  }
+
+  private void assertCreateSucceeds(Branch.NameKey branch) throws Exception {
+    BranchInfo created = branch(branch).create(new BranchInput()).get();
+    assertThat(created.ref).isEqualTo(branch.get());
+  }
+
+  private void assertCreateFails(
+      Branch.NameKey branch, Class<? extends RestApiException> errType, String errMsg)
+      throws Exception {
+    assertCreateFails(branch, null, errType, errMsg);
+  }
+
+  private void assertCreateFails(
+      Branch.NameKey branch,
+      String revision,
+      Class<? extends RestApiException> errType,
+      String errMsg)
+      throws Exception {
+    BranchInput in = new BranchInput();
+    in.revision = revision;
+    if (errMsg != null) {
+      exception.expectMessage(errMsg);
+    }
+    exception.expect(errType);
+    branch(branch).create(in);
+  }
+
+  private void assertCreateFails(Branch.NameKey branch, Class<? extends RestApiException> errType)
+      throws Exception {
+    assertCreateFails(branch, errType, null);
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java b/javatests/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java
new file mode 100644
index 0000000..97558c4
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java
@@ -0,0 +1,486 @@
+// Copyright (C) 2013 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.google.gerrit.acceptance.rest.project;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+import static com.google.common.truth.Truth8.assertThat;
+import static com.google.gerrit.acceptance.rest.project.ProjectAssert.assertProjectInfo;
+import static com.google.gerrit.acceptance.rest.project.ProjectAssert.assertProjectOwners;
+import static com.google.gerrit.server.project.ProjectConfig.PROJECT_CONFIG;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+import com.google.common.net.HttpHeaders;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.GerritConfig;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.acceptance.UseLocalDisk;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.api.projects.ConfigInfo;
+import com.google.gerrit.extensions.api.projects.ConfigInput;
+import com.google.gerrit.extensions.api.projects.ProjectInput;
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.extensions.restapi.Url;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gerrit.server.project.ProjectState;
+import java.util.Collections;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CyclicBarrier;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import org.apache.http.HttpStatus;
+import org.apache.http.message.BasicHeader;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectLoader;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.treewalk.TreeWalk;
+import org.junit.Test;
+
+public class CreateProjectIT extends AbstractDaemonTest {
+  @Test
+  public void createProjectHttp() throws Exception {
+    String newProjectName = name("newProject");
+    RestResponse r = adminRestSession.put("/projects/" + newProjectName);
+    r.assertCreated();
+    ProjectInfo p = newGson().fromJson(r.getReader(), ProjectInfo.class);
+    assertThat(p.name).isEqualTo(newProjectName);
+
+    // Check that we populate the label data in the HTTP path. See GetProjectIT#getProject
+    // for more extensive coverage of the LabelTypeInfo.
+    assertThat(p.labels).hasSize(1);
+
+    ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
+    assertThat(projectState).isNotNull();
+    assertProjectInfo(projectState.getProject(), p);
+    assertHead(newProjectName, "refs/heads/master");
+  }
+
+  @Test
+  public void createProjectHttpWhenProjectAlreadyExists_Conflict() throws Exception {
+    adminRestSession.put("/projects/" + allProjects.get()).assertConflict();
+  }
+
+  @Test
+  public void createProjectHttpWhenProjectAlreadyExists_PreconditionFailed() throws Exception {
+    adminRestSession
+        .putWithHeader(
+            "/projects/" + allProjects.get(), new BasicHeader(HttpHeaders.IF_NONE_MATCH, "*"))
+        .assertPreconditionFailed();
+  }
+
+  @Test
+  public void createSameProjectFromTwoConcurrentRequests() throws Exception {
+    ExecutorService executor = Executors.newFixedThreadPool(2);
+    try {
+      for (int i = 0; i < 10; i++) {
+        String newProjectName = name("foo" + i);
+        CyclicBarrier sync = new CyclicBarrier(2);
+        Callable<RestResponse> createProjectFoo =
+            () -> {
+              sync.await();
+              return adminRestSession.put("/projects/" + newProjectName);
+            };
+
+        Future<RestResponse> r1 = executor.submit(createProjectFoo);
+        Future<RestResponse> r2 = executor.submit(createProjectFoo);
+        assertThat(ImmutableList.of(r1.get().getStatusCode(), r2.get().getStatusCode()))
+            .containsAllOf(HttpStatus.SC_CREATED, HttpStatus.SC_CONFLICT);
+      }
+    } finally {
+      executor.shutdown();
+      executor.awaitTermination(5, TimeUnit.SECONDS);
+    }
+  }
+
+  @Test
+  @UseLocalDisk
+  public void createProjectHttpWithUnreasonableName_BadRequest() throws Exception {
+    ImmutableList<String> forbiddenStrings =
+        ImmutableList.of(
+            "/../", "/./", "//", ".git/", "?", "%", "*", ":", "<", ">", "|", "$", "/+", "~");
+    for (String s : forbiddenStrings) {
+      String projectName = name("invalid" + s + "name");
+      assertWithMessage("Expected status code for " + projectName + " to be 400.")
+          .that(adminRestSession.put("/projects/" + Url.encode(projectName)).getStatusCode())
+          .isEqualTo(HttpStatus.SC_BAD_REQUEST);
+    }
+  }
+
+  @Test
+  public void createProjectHttpWithNameMismatch_BadRequest() throws Exception {
+    ProjectInput in = new ProjectInput();
+    in.name = name("otherName");
+    adminRestSession.put("/projects/" + name("someName"), in).assertBadRequest();
+  }
+
+  @Test
+  public void createProjectHttpWithInvalidRefName_BadRequest() throws Exception {
+    ProjectInput in = new ProjectInput();
+    in.branches = Collections.singletonList(name("invalid ref name"));
+    adminRestSession.put("/projects/" + name("newProject"), in).assertBadRequest();
+  }
+
+  @Test
+  public void createProject() throws Exception {
+    String newProjectName = name("newProject");
+    ProjectInfo p = gApi.projects().create(newProjectName).get();
+    assertThat(p.name).isEqualTo(newProjectName);
+    ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
+    assertThat(projectState).isNotNull();
+    assertProjectInfo(projectState.getProject(), p);
+    assertHead(newProjectName, "refs/heads/master");
+    assertThat(readProjectConfig(newProjectName))
+        .hasValue("[access]\n\tinheritFrom = All-Projects\n[submit]\n\taction = inherit\n");
+  }
+
+  @Test
+  public void createProjectWithGitSuffix() throws Exception {
+    String newProjectName = name("newProject");
+    ProjectInfo p = gApi.projects().create(newProjectName + ".git").get();
+    assertThat(p.name).isEqualTo(newProjectName);
+    ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
+    assertThat(projectState).isNotNull();
+    assertProjectInfo(projectState.getProject(), p);
+    assertHead(newProjectName, "refs/heads/master");
+  }
+
+  @Test
+  public void createProjectThatEndsWithSlash() throws Exception {
+    String newProjectName = name("newProject");
+    ProjectInfo p = gApi.projects().create(newProjectName + "/").get();
+    assertThat(p.name).isEqualTo(newProjectName);
+    ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
+    assertThat(projectState).isNotNull();
+    assertProjectInfo(projectState.getProject(), p);
+    assertHead(newProjectName, "refs/heads/master");
+  }
+
+  @Test
+  public void createProjectThatContainsSlash() throws Exception {
+    String newProjectName = name("newProject/newProject");
+    ProjectInfo p = gApi.projects().create(newProjectName).get();
+    assertThat(p.name).isEqualTo(newProjectName);
+    ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
+    assertThat(projectState).isNotNull();
+    assertProjectInfo(projectState.getProject(), p);
+    assertHead(newProjectName, "refs/heads/master");
+  }
+
+  @Test
+  public void createProjectWithProperties() throws Exception {
+    String newProjectName = name("newProject");
+    ProjectInput in = new ProjectInput();
+    in.name = newProjectName;
+    in.description = "Test description";
+    in.submitType = SubmitType.CHERRY_PICK;
+    in.useContributorAgreements = InheritableBoolean.TRUE;
+    in.useSignedOffBy = InheritableBoolean.TRUE;
+    in.useContentMerge = InheritableBoolean.TRUE;
+    in.requireChangeId = InheritableBoolean.TRUE;
+    ProjectInfo p = gApi.projects().create(in).get();
+    assertThat(p.name).isEqualTo(newProjectName);
+    Project project = projectCache.get(new Project.NameKey(newProjectName)).getProject();
+    assertProjectInfo(project, p);
+    assertThat(project.getDescription()).isEqualTo(in.description);
+    assertThat(project.getConfiguredSubmitType()).isEqualTo(in.submitType);
+    assertThat(project.getBooleanConfig(BooleanProjectConfig.USE_CONTRIBUTOR_AGREEMENTS))
+        .isEqualTo(in.useContributorAgreements);
+    assertThat(project.getBooleanConfig(BooleanProjectConfig.USE_SIGNED_OFF_BY))
+        .isEqualTo(in.useSignedOffBy);
+    assertThat(project.getBooleanConfig(BooleanProjectConfig.USE_CONTENT_MERGE))
+        .isEqualTo(in.useContentMerge);
+    assertThat(project.getBooleanConfig(BooleanProjectConfig.REQUIRE_CHANGE_ID))
+        .isEqualTo(in.requireChangeId);
+  }
+
+  @Test
+  public void createChildProject() throws Exception {
+    String parentName = name("parent");
+    ProjectInput in = new ProjectInput();
+    in.name = parentName;
+    gApi.projects().create(in);
+
+    String childName = name("child");
+    in = new ProjectInput();
+    in.name = childName;
+    in.parent = parentName;
+    gApi.projects().create(in);
+    Project project = projectCache.get(new Project.NameKey(childName)).getProject();
+    assertThat(project.getParentName()).isEqualTo(in.parent);
+  }
+
+  @Test
+  public void createChildProjectUnderNonExistingParent_UnprocessableEntity() throws Exception {
+    ProjectInput in = new ProjectInput();
+    in.name = name("newProjectName");
+    in.parent = "non-existing-project";
+    assertCreateFails(in, UnprocessableEntityException.class);
+  }
+
+  @Test
+  public void createProjectWithOwner() throws Exception {
+    String newProjectName = name("newProject");
+    ProjectInput in = new ProjectInput();
+    in.name = newProjectName;
+    in.owners = Lists.newArrayListWithCapacity(3);
+    in.owners.add("Anonymous Users"); // by name
+    in.owners.add(SystemGroupBackend.REGISTERED_USERS.get()); // by UUID
+    in.owners.add(
+        Integer.toString(
+            groupCache
+                .get(new AccountGroup.NameKey("Administrators"))
+                .orElse(null)
+                .getId()
+                .get())); // by ID
+    gApi.projects().create(in);
+    ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
+    Set<AccountGroup.UUID> expectedOwnerIds = Sets.newHashSetWithExpectedSize(3);
+    expectedOwnerIds.add(SystemGroupBackend.ANONYMOUS_USERS);
+    expectedOwnerIds.add(SystemGroupBackend.REGISTERED_USERS);
+    expectedOwnerIds.add(groupUuid("Administrators"));
+    assertProjectOwners(expectedOwnerIds, projectState);
+  }
+
+  @Test
+  public void createProjectWithNonExistingOwner_UnprocessableEntity() throws Exception {
+    ProjectInput in = new ProjectInput();
+    in.name = name("newProjectName");
+    in.owners = Collections.singletonList("non-existing-group");
+    assertCreateFails(in, UnprocessableEntityException.class);
+  }
+
+  @Test
+  public void createPermissionOnlyProject() throws Exception {
+    String newProjectName = name("newProject");
+    ProjectInput in = new ProjectInput();
+    in.name = newProjectName;
+    in.permissionsOnly = true;
+    gApi.projects().create(in);
+    assertHead(newProjectName, RefNames.REFS_CONFIG);
+  }
+
+  @Test
+  public void createProjectWithEmptyCommit() throws Exception {
+    String newProjectName = name("newProject");
+    ProjectInput in = new ProjectInput();
+    in.name = newProjectName;
+    in.createEmptyCommit = true;
+    gApi.projects().create(in);
+    assertEmptyCommit(newProjectName, "refs/heads/master");
+  }
+
+  @Test
+  public void createProjectWithBranches() throws Exception {
+    String newProjectName = name("newProject");
+    ProjectInput in = new ProjectInput();
+    in.name = newProjectName;
+    in.createEmptyCommit = true;
+    in.branches = Lists.newArrayListWithCapacity(3);
+    in.branches.add("refs/heads/test");
+    in.branches.add("refs/heads/master");
+    in.branches.add("release"); // without 'refs/heads' prefix
+    gApi.projects().create(in);
+    assertHead(newProjectName, "refs/heads/test");
+    assertEmptyCommit(newProjectName, "refs/heads/test", "refs/heads/master", "refs/heads/release");
+  }
+
+  @Test
+  public void createProjectWithCapability() throws Exception {
+    allowGlobalCapabilities(SystemGroupBackend.REGISTERED_USERS, GlobalCapability.CREATE_PROJECT);
+    try {
+      setApiUser(user);
+      ProjectInput in = new ProjectInput();
+      in.name = name("newProject");
+      ProjectInfo p = gApi.projects().create(in).get();
+      assertThat(p.name).isEqualTo(in.name);
+    } finally {
+      removeGlobalCapabilities(
+          SystemGroupBackend.REGISTERED_USERS, GlobalCapability.CREATE_PROJECT);
+    }
+  }
+
+  @Test
+  public void createProjectWithoutCapability_Forbidden() throws Exception {
+    setApiUser(user);
+    ProjectInput in = new ProjectInput();
+    in.name = name("newProject");
+    assertCreateFails(in, AuthException.class);
+  }
+
+  @Test
+  public void createProjectWhenProjectAlreadyExists_Conflict() throws Exception {
+    ProjectInput in = new ProjectInput();
+    in.name = allProjects.get();
+    assertCreateFails(in, ResourceConflictException.class);
+  }
+
+  @Test
+  public void createProjectWithCreateProjectCapabilityAndParentNotVisible() throws Exception {
+    Project parent = projectCache.get(allProjects).getProject();
+    parent.setState(com.google.gerrit.extensions.client.ProjectState.HIDDEN);
+    allowGlobalCapabilities(SystemGroupBackend.REGISTERED_USERS, GlobalCapability.CREATE_PROJECT);
+    try {
+      setApiUser(user);
+      ProjectInput in = new ProjectInput();
+      in.name = name("newProject");
+      ProjectInfo p = gApi.projects().create(in).get();
+      assertThat(p.name).isEqualTo(in.name);
+    } finally {
+      parent.setState(com.google.gerrit.extensions.client.ProjectState.ACTIVE);
+      removeGlobalCapabilities(
+          SystemGroupBackend.REGISTERED_USERS, GlobalCapability.CREATE_PROJECT);
+    }
+  }
+
+  @SuppressWarnings("deprecation")
+  @Test
+  public void createProjectWithDefaultInheritedSubmitType() throws Exception {
+    String parent = name("parent");
+    ProjectInput pin = new ProjectInput();
+    pin.name = parent;
+    ConfigInfo cfg = gApi.projects().create(pin).config();
+    assertThat(cfg.submitType).isEqualTo(SubmitType.MERGE_IF_NECESSARY);
+    assertThat(cfg.defaultSubmitType.value).isEqualTo(SubmitType.MERGE_IF_NECESSARY);
+    assertThat(cfg.defaultSubmitType.configuredValue).isEqualTo(SubmitType.INHERIT);
+    assertThat(cfg.defaultSubmitType.inheritedValue).isEqualTo(SubmitType.MERGE_IF_NECESSARY);
+
+    ConfigInput cin = new ConfigInput();
+    cin.submitType = SubmitType.CHERRY_PICK;
+    gApi.projects().name(parent).config(cin);
+    cfg = gApi.projects().name(parent).config();
+    assertThat(cfg.submitType).isEqualTo(SubmitType.CHERRY_PICK);
+    assertThat(cfg.defaultSubmitType.value).isEqualTo(SubmitType.CHERRY_PICK);
+    assertThat(cfg.defaultSubmitType.configuredValue).isEqualTo(SubmitType.CHERRY_PICK);
+    assertThat(cfg.defaultSubmitType.inheritedValue).isEqualTo(SubmitType.MERGE_IF_NECESSARY);
+
+    String child = name("child");
+    pin = new ProjectInput();
+    pin.submitType = SubmitType.INHERIT;
+    pin.parent = parent;
+    pin.name = child;
+    cfg = gApi.projects().create(pin).config();
+    assertThat(cfg.submitType).isEqualTo(SubmitType.CHERRY_PICK);
+    assertThat(cfg.defaultSubmitType.value).isEqualTo(SubmitType.CHERRY_PICK);
+    assertThat(cfg.defaultSubmitType.configuredValue).isEqualTo(SubmitType.INHERIT);
+    assertThat(cfg.defaultSubmitType.inheritedValue).isEqualTo(SubmitType.CHERRY_PICK);
+
+    cin = new ConfigInput();
+    cin.submitType = SubmitType.REBASE_IF_NECESSARY;
+    gApi.projects().name(parent).config(cin);
+    cfg = gApi.projects().name(parent).config();
+    assertThat(cfg.submitType).isEqualTo(SubmitType.REBASE_IF_NECESSARY);
+    assertThat(cfg.defaultSubmitType.value).isEqualTo(SubmitType.REBASE_IF_NECESSARY);
+    assertThat(cfg.defaultSubmitType.configuredValue).isEqualTo(SubmitType.REBASE_IF_NECESSARY);
+    assertThat(cfg.defaultSubmitType.inheritedValue).isEqualTo(SubmitType.MERGE_IF_NECESSARY);
+
+    cfg = gApi.projects().name(child).config();
+    assertThat(cfg.submitType).isEqualTo(SubmitType.REBASE_IF_NECESSARY);
+    assertThat(cfg.defaultSubmitType.value).isEqualTo(SubmitType.REBASE_IF_NECESSARY);
+    assertThat(cfg.defaultSubmitType.configuredValue).isEqualTo(SubmitType.INHERIT);
+    assertThat(cfg.defaultSubmitType.inheritedValue).isEqualTo(SubmitType.REBASE_IF_NECESSARY);
+  }
+
+  @SuppressWarnings("deprecation")
+  @Test
+  @GerritConfig(
+      name = "repository.testinheritedsubmittype/*.defaultSubmitType",
+      value = "CHERRY_PICK")
+  public void repositoryConfigTakesPrecedenceOverInheritedSubmitType() throws Exception {
+    // Can't use name() since we need to specify this project name in gerrit.config prior to
+    // startup. Pick something reasonably unique instead.
+    String parent = "testinheritedsubmittype";
+    ProjectInput pin = new ProjectInput();
+    pin.name = parent;
+    pin.submitType = SubmitType.MERGE_ALWAYS;
+    ConfigInfo cfg = gApi.projects().create(pin).config();
+    assertThat(cfg.submitType).isEqualTo(SubmitType.MERGE_ALWAYS);
+    assertThat(cfg.defaultSubmitType.value).isEqualTo(SubmitType.MERGE_ALWAYS);
+    assertThat(cfg.defaultSubmitType.configuredValue).isEqualTo(SubmitType.MERGE_ALWAYS);
+    assertThat(cfg.defaultSubmitType.inheritedValue).isEqualTo(SubmitType.MERGE_IF_NECESSARY);
+
+    String child = parent + "/child";
+    pin = new ProjectInput();
+    pin.parent = parent;
+    pin.name = child;
+    cfg = gApi.projects().create(pin).config();
+    assertThat(cfg.submitType).isEqualTo(SubmitType.CHERRY_PICK);
+    assertThat(cfg.defaultSubmitType.value).isEqualTo(SubmitType.CHERRY_PICK);
+    assertThat(cfg.defaultSubmitType.configuredValue).isEqualTo(SubmitType.CHERRY_PICK);
+    assertThat(cfg.defaultSubmitType.inheritedValue).isEqualTo(SubmitType.MERGE_ALWAYS);
+  }
+
+  private void assertHead(String projectName, String expectedRef) throws Exception {
+    try (Repository repo = repoManager.openRepository(new Project.NameKey(projectName))) {
+      assertThat(repo.exactRef(Constants.HEAD).getTarget().getName()).isEqualTo(expectedRef);
+    }
+  }
+
+  private void assertEmptyCommit(String projectName, String... refs) throws Exception {
+    Project.NameKey projectKey = new Project.NameKey(projectName);
+    try (Repository repo = repoManager.openRepository(projectKey);
+        RevWalk rw = new RevWalk(repo);
+        TreeWalk tw = new TreeWalk(rw.getObjectReader())) {
+      for (String ref : refs) {
+        RevCommit commit = rw.lookupCommit(repo.exactRef(ref).getObjectId());
+        rw.parseBody(commit);
+        tw.addTree(commit.getTree());
+        assertThat(tw.next()).isFalse();
+        tw.reset();
+      }
+    }
+  }
+
+  private void assertCreateFails(ProjectInput in, Class<? extends RestApiException> errType)
+      throws Exception {
+    exception.expect(errType);
+    gApi.projects().create(in);
+  }
+
+  private Optional<String> readProjectConfig(String projectName) throws Exception {
+    try (Repository repo = repoManager.openRepository(new Project.NameKey(projectName))) {
+      TestRepository<?> tr = new TestRepository<>(repo);
+      RevWalk rw = tr.getRevWalk();
+      Ref ref = repo.exactRef(RefNames.REFS_CONFIG);
+      if (ref == null) {
+        return Optional.empty();
+      }
+      ObjectLoader obj =
+          rw.getObjectReader()
+              .open(tr.get(rw.parseTree(ref.getObjectId()), PROJECT_CONFIG), Constants.OBJ_BLOB);
+      return Optional.of(new String(obj.getCachedBytes(Integer.MAX_VALUE), UTF_8));
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/project/DeleteBranchIT.java b/javatests/com/google/gerrit/acceptance/rest/project/DeleteBranchIT.java
new file mode 100644
index 0000000..b426a37
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/project/DeleteBranchIT.java
@@ -0,0 +1,199 @@
+// Copyright (C) 2013 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.google.gerrit.acceptance.rest.project;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static org.eclipse.jgit.lib.Constants.R_HEADS;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.GerritConfig;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.projects.BranchApi;
+import com.google.gerrit.extensions.api.projects.BranchInput;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.RefNames;
+import org.junit.Before;
+import org.junit.Test;
+
+public class DeleteBranchIT extends AbstractDaemonTest {
+
+  private Branch.NameKey testBranch;
+
+  @Before
+  public void setUp() throws Exception {
+    project = createProject(name("p"));
+    testBranch = new Branch.NameKey(project, "test");
+    branch(testBranch).create(new BranchInput());
+  }
+
+  @Test
+  public void deleteBranch_Forbidden() throws Exception {
+    setApiUser(user);
+    assertDeleteForbidden(testBranch);
+  }
+
+  @Test
+  public void deleteBranchByAdmin() throws Exception {
+    assertDeleteSucceeds(testBranch);
+  }
+
+  @Test
+  public void deleteBranchByProjectOwner() throws Exception {
+    grantOwner();
+    setApiUser(user);
+    assertDeleteSucceeds(testBranch);
+  }
+
+  @Test
+  public void deleteBranchByAdminForcePushBlocked() throws Exception {
+    blockForcePush();
+    assertDeleteSucceeds(testBranch);
+  }
+
+  @Test
+  public void deleteBranchByProjectOwnerForcePushBlocked_Forbidden() throws Exception {
+    grantOwner();
+    blockForcePush();
+    setApiUser(user);
+    assertDeleteForbidden(testBranch);
+  }
+
+  @Test
+  public void deleteBranchByUserWithForcePushPermission() throws Exception {
+    grantForcePush();
+    setApiUser(user);
+    assertDeleteSucceeds(testBranch);
+  }
+
+  @Test
+  public void deleteBranchByUserWithDeletePermission() throws Exception {
+    grantDelete();
+    setApiUser(user);
+    assertDeleteSucceeds(testBranch);
+  }
+
+  @Test
+  public void deleteBranchByRestWithoutRefsHeadsPrefix() throws Exception {
+    grantDelete();
+    String ref = testBranch.getShortName();
+    assertThat(ref).doesNotMatch(R_HEADS);
+    assertDeleteByRestSucceeds(testBranch, ref);
+  }
+
+  @Test
+  public void deleteBranchByRestWithFullName() throws Exception {
+    grantDelete();
+    assertDeleteByRestSucceeds(testBranch, testBranch.get());
+  }
+
+  @Test
+  public void deleteBranchByRestFailsWithUnencodedFullName() throws Exception {
+    grantDelete();
+    RestResponse r =
+        userRestSession.delete("/projects/" + project.get() + "/branches/" + testBranch.get());
+    r.assertNotFound();
+    branch(testBranch).get();
+  }
+
+  @Test
+  public void deleteMetaBranch() throws Exception {
+    String metaRef = RefNames.REFS_META + "foo";
+    allow(metaRef, Permission.CREATE, REGISTERED_USERS);
+    allow(metaRef, Permission.PUSH, REGISTERED_USERS);
+
+    Branch.NameKey metaBranch = new Branch.NameKey(project, metaRef);
+    branch(metaBranch).create(new BranchInput());
+
+    grantDelete();
+    assertDeleteByRestSucceeds(metaBranch, metaRef);
+  }
+
+  @Test
+  public void deleteUserBranch_Conflict() throws Exception {
+    allow(allUsers, RefNames.REFS_USERS + "*", Permission.CREATE, REGISTERED_USERS);
+    allow(allUsers, RefNames.REFS_USERS + "*", Permission.PUSH, REGISTERED_USERS);
+
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("Not allowed to delete user branch.");
+    branch(new Branch.NameKey(allUsers, RefNames.refsUsers(admin.id))).delete();
+  }
+
+  @Test
+  @GerritConfig(name = "noteDb.groups.write", value = "true")
+  public void deleteGroupBranch_Conflict() throws Exception {
+    allow(allUsers, RefNames.REFS_GROUPS + "*", Permission.CREATE, REGISTERED_USERS);
+    allow(allUsers, RefNames.REFS_GROUPS + "*", Permission.PUSH, REGISTERED_USERS);
+
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("Not allowed to delete group branch.");
+    branch(new Branch.NameKey(allUsers, RefNames.refsGroups(adminGroupUuid()))).delete();
+  }
+
+  private void blockForcePush() throws Exception {
+    block("refs/heads/*", Permission.PUSH, ANONYMOUS_USERS).setForce(true);
+  }
+
+  private void grantForcePush() throws Exception {
+    grant(project, "refs/heads/*", Permission.PUSH, true, ANONYMOUS_USERS);
+  }
+
+  private void grantDelete() throws Exception {
+    allow("refs/*", Permission.DELETE, ANONYMOUS_USERS);
+  }
+
+  private void grantOwner() throws Exception {
+    allow("refs/*", Permission.OWNER, REGISTERED_USERS);
+  }
+
+  private BranchApi branch(Branch.NameKey branch) throws Exception {
+    return gApi.projects().name(branch.getParentKey().get()).branch(branch.get());
+  }
+
+  private void assertDeleteByRestSucceeds(Branch.NameKey branch, String ref) throws Exception {
+    RestResponse r =
+        userRestSession.delete(
+            "/projects/"
+                + IdString.fromDecoded(project.get()).encoded()
+                + "/branches/"
+                + IdString.fromDecoded(ref).encoded());
+    r.assertNoContent();
+    exception.expect(ResourceNotFoundException.class);
+    branch(branch).get();
+  }
+
+  private void assertDeleteSucceeds(Branch.NameKey branch) throws Exception {
+    assertThat(branch(branch).get().canDelete).isTrue();
+    String branchRev = branch(branch).get().revision;
+    branch(branch).delete();
+    eventRecorder.assertRefUpdatedEvents(
+        project.get(), branch.get(), null, branchRev, branchRev, null);
+    exception.expect(ResourceNotFoundException.class);
+    branch(branch).get();
+  }
+
+  private void assertDeleteForbidden(Branch.NameKey branch) throws Exception {
+    assertThat(branch(branch).get().canDelete).isNull();
+    exception.expect(AuthException.class);
+    exception.expectMessage("not permitted: delete");
+    branch(branch).delete();
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/project/DeleteBranchesIT.java b/javatests/com/google/gerrit/acceptance/rest/project/DeleteBranchesIT.java
new file mode 100644
index 0000000..c1bd8f1
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/project/DeleteBranchesIT.java
@@ -0,0 +1,213 @@
+// 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.
+
+package com.google.gerrit.acceptance.rest.project;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static java.util.stream.Collectors.toList;
+import static org.eclipse.jgit.lib.Constants.R_HEADS;
+import static org.eclipse.jgit.lib.Constants.R_REFS;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.projects.BranchInput;
+import com.google.gerrit.extensions.api.projects.DeleteBranchesInput;
+import com.google.gerrit.extensions.api.projects.ProjectApi;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.reviewdb.client.RefNames;
+import java.util.HashMap;
+import java.util.List;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.junit.Before;
+import org.junit.Test;
+
+@NoHttpd
+public class DeleteBranchesIT extends AbstractDaemonTest {
+  private static final ImmutableList<String> BRANCHES =
+      ImmutableList.of("refs/heads/test-1", "refs/heads/test-2", "test-3", "refs/meta/foo");
+
+  @Before
+  public void setUp() throws Exception {
+    allow("refs/*", Permission.CREATE, REGISTERED_USERS);
+    allow("refs/*", Permission.PUSH, REGISTERED_USERS);
+    for (String name : BRANCHES) {
+      project().branch(name).create(new BranchInput());
+    }
+    assertBranches(BRANCHES);
+  }
+
+  @Test
+  public void deleteBranches() throws Exception {
+    HashMap<String, RevCommit> initialRevisions = initialRevisions(BRANCHES);
+    DeleteBranchesInput input = new DeleteBranchesInput();
+    input.branches = BRANCHES;
+    project().deleteBranches(input);
+    assertBranchesDeleted(BRANCHES);
+    assertRefUpdatedEvents(initialRevisions);
+  }
+
+  @Test
+  public void deleteOneBranchWithoutPermissionForbidden() throws Exception {
+    ImmutableList<String> branchToDelete = ImmutableList.of("refs/heads/test-1");
+
+    DeleteBranchesInput input = new DeleteBranchesInput();
+    input.branches = branchToDelete;
+    setApiUser(user);
+    try {
+      project().deleteBranches(input);
+      fail("Expected AuthException");
+    } catch (AuthException e) {
+      assertThat(e).hasMessageThat().isEqualTo("not permitted: delete on refs/heads/test-1");
+    }
+    setApiUser(admin);
+    assertBranches(BRANCHES);
+  }
+
+  @Test
+  public void deleteMultiBranchesWithoutPermissionForbidden() throws Exception {
+    DeleteBranchesInput input = new DeleteBranchesInput();
+    input.branches = BRANCHES;
+    setApiUser(user);
+    try {
+      project().deleteBranches(input);
+      fail("Expected ResourceConflictException");
+    } catch (ResourceConflictException e) {
+      assertThat(e).hasMessageThat().isEqualTo(errorMessageForBranches(BRANCHES));
+    }
+    setApiUser(admin);
+    assertBranches(BRANCHES);
+  }
+
+  @Test
+  public void deleteBranchesNotFound() throws Exception {
+    DeleteBranchesInput input = new DeleteBranchesInput();
+    List<String> branches = Lists.newArrayList(BRANCHES);
+    branches.add("refs/heads/does-not-exist");
+    input.branches = branches;
+    try {
+      project().deleteBranches(input);
+      fail("Expected ResourceConflictException");
+    } catch (ResourceConflictException e) {
+      assertThat(e)
+          .hasMessageThat()
+          .isEqualTo(errorMessageForBranches(ImmutableList.of("refs/heads/does-not-exist")));
+    }
+    assertBranchesDeleted(BRANCHES);
+  }
+
+  @Test
+  public void deleteBranchesNotFoundContinue() throws Exception {
+    // If it fails on the first branch in the input, it should still
+    // continue to process the remaining branches.
+    DeleteBranchesInput input = new DeleteBranchesInput();
+    List<String> branches = Lists.newArrayList("refs/heads/does-not-exist");
+    branches.addAll(BRANCHES);
+    input.branches = branches;
+    try {
+      project().deleteBranches(input);
+      fail("Expected ResourceConflictException");
+    } catch (ResourceConflictException e) {
+      assertThat(e)
+          .hasMessageThat()
+          .isEqualTo(errorMessageForBranches(ImmutableList.of("refs/heads/does-not-exist")));
+    }
+    assertBranchesDeleted(BRANCHES);
+  }
+
+  @Test
+  public void missingInput() throws Exception {
+    DeleteBranchesInput input = null;
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("branches must be specified");
+    project().deleteBranches(input);
+  }
+
+  @Test
+  public void missingBranchList() throws Exception {
+    DeleteBranchesInput input = new DeleteBranchesInput();
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("branches must be specified");
+    project().deleteBranches(input);
+  }
+
+  @Test
+  public void emptyBranchList() throws Exception {
+    DeleteBranchesInput input = new DeleteBranchesInput();
+    input.branches = Lists.newArrayList();
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("branches must be specified");
+    project().deleteBranches(input);
+  }
+
+  private String errorMessageForBranches(List<String> branches) {
+    StringBuilder message = new StringBuilder();
+    for (String branch : branches) {
+      message
+          .append("Cannot delete ")
+          .append(prefixRef(branch))
+          .append(": it doesn't exist or you do not have permission ")
+          .append("to delete it\n");
+    }
+    return message.toString();
+  }
+
+  private HashMap<String, RevCommit> initialRevisions(List<String> branches) throws Exception {
+    HashMap<String, RevCommit> result = new HashMap<>();
+    for (String branch : branches) {
+      result.put(branch, getRemoteHead(project, branch));
+    }
+    return result;
+  }
+
+  private void assertRefUpdatedEvents(HashMap<String, RevCommit> revisions) throws Exception {
+    for (String branch : revisions.keySet()) {
+      RevCommit revision = revisions.get(branch);
+      eventRecorder.assertRefUpdatedEvents(
+          project.get(), prefixRef(branch), null, revision, revision, null);
+    }
+  }
+
+  private String prefixRef(String ref) {
+    return ref.startsWith(R_REFS) ? ref : R_HEADS + ref;
+  }
+
+  private ProjectApi project() throws Exception {
+    return gApi.projects().name(project.get());
+  }
+
+  private void assertBranches(List<String> branches) throws Exception {
+    List<String> expected = Lists.newArrayList("HEAD", RefNames.REFS_CONFIG, "refs/heads/master");
+    expected.addAll(branches.stream().map(this::prefixRef).collect(toList()));
+    try (Repository repo = repoManager.openRepository(project)) {
+      for (String branch : expected) {
+        assertThat(repo.exactRef(branch)).isNotNull();
+      }
+    }
+  }
+
+  private void assertBranchesDeleted(List<String> branches) throws Exception {
+    try (Repository repo = repoManager.openRepository(project)) {
+      for (String branch : branches) {
+        assertThat(repo.exactRef(branch)).isNull();
+      }
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/project/DeleteTagIT.java b/javatests/com/google/gerrit/acceptance/rest/project/DeleteTagIT.java
new file mode 100644
index 0000000..3ae0b44
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/project/DeleteTagIT.java
@@ -0,0 +1,131 @@
+// 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.
+
+package com.google.gerrit.acceptance.rest.project;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static org.eclipse.jgit.lib.Constants.R_TAGS;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.projects.TagApi;
+import com.google.gerrit.extensions.api.projects.TagInfo;
+import com.google.gerrit.extensions.api.projects.TagInput;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import org.junit.Before;
+import org.junit.Test;
+
+public class DeleteTagIT extends AbstractDaemonTest {
+  private static final String TAG = "refs/tags/test";
+
+  @Before
+  public void setUp() throws Exception {
+    tag().create(new TagInput());
+  }
+
+  @Test
+  public void deleteTag_Forbidden() throws Exception {
+    setApiUser(user);
+    assertDeleteForbidden();
+  }
+
+  @Test
+  public void deleteTagByAdmin() throws Exception {
+    assertDeleteSucceeds();
+  }
+
+  @Test
+  public void deleteTagByProjectOwner() throws Exception {
+    grantOwner();
+    setApiUser(user);
+    assertDeleteSucceeds();
+  }
+
+  @Test
+  public void deleteTagByAdminForcePushBlocked() throws Exception {
+    blockForcePush();
+    assertDeleteSucceeds();
+  }
+
+  @Test
+  public void deleteTagByProjectOwnerForcePushBlocked_Forbidden() throws Exception {
+    grantOwner();
+    blockForcePush();
+    setApiUser(user);
+    assertDeleteForbidden();
+  }
+
+  @Test
+  public void deleteTagByUserWithForcePushPermission() throws Exception {
+    grantForcePush();
+    setApiUser(user);
+    assertDeleteSucceeds();
+  }
+
+  @Test
+  public void deleteTagByUserWithDeletePermission() throws Exception {
+    grantDelete();
+    setApiUser(user);
+    assertDeleteSucceeds();
+  }
+
+  @Test
+  public void deleteTagByRestWithoutRefsTagsPrefix() throws Exception {
+    grantDelete();
+    String ref = TAG.substring(R_TAGS.length());
+    RestResponse r = userRestSession.delete("/projects/" + project.get() + "/tags/" + ref);
+    r.assertNoContent();
+  }
+
+  private void blockForcePush() throws Exception {
+    block("refs/tags/*", Permission.PUSH, ANONYMOUS_USERS).setForce(true);
+  }
+
+  private void grantForcePush() throws Exception {
+    grant(project, "refs/tags/*", Permission.PUSH, true, ANONYMOUS_USERS);
+  }
+
+  private void grantDelete() throws Exception {
+    allow("refs/tags/*", Permission.DELETE, ANONYMOUS_USERS);
+  }
+
+  private void grantOwner() throws Exception {
+    allow("refs/tags/*", Permission.OWNER, REGISTERED_USERS);
+  }
+
+  private TagApi tag() throws Exception {
+    return gApi.projects().name(project.get()).tag(TAG);
+  }
+
+  private void assertDeleteSucceeds() throws Exception {
+    TagInfo tagInfo = tag().get();
+    assertThat(tagInfo.canDelete).isTrue();
+    String tagRev = tagInfo.revision;
+    tag().delete();
+    eventRecorder.assertRefUpdatedEvents(project.get(), TAG, null, tagRev, tagRev, null);
+    exception.expect(ResourceNotFoundException.class);
+    tag().get();
+  }
+
+  private void assertDeleteForbidden() throws Exception {
+    assertThat(tag().get().canDelete).isNull();
+    exception.expect(AuthException.class);
+    exception.expectMessage("not permitted: delete");
+    tag().delete();
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/project/DeleteTagsIT.java b/javatests/com/google/gerrit/acceptance/rest/project/DeleteTagsIT.java
new file mode 100644
index 0000000..2ada724
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/project/DeleteTagsIT.java
@@ -0,0 +1,159 @@
+// 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.
+
+package com.google.gerrit.acceptance.rest.project;
+
+import static com.google.common.truth.Truth.assertThat;
+import static java.util.stream.Collectors.toList;
+import static org.eclipse.jgit.lib.Constants.R_TAGS;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.extensions.api.projects.DeleteTagsInput;
+import com.google.gerrit.extensions.api.projects.ProjectApi;
+import com.google.gerrit.extensions.api.projects.TagInfo;
+import com.google.gerrit.extensions.api.projects.TagInput;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import java.util.HashMap;
+import java.util.List;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.junit.Before;
+import org.junit.Test;
+
+@NoHttpd
+public class DeleteTagsIT extends AbstractDaemonTest {
+  private static final ImmutableList<String> TAGS =
+      ImmutableList.of("refs/tags/test-1", "refs/tags/test-2", "refs/tags/test-3", "test-4");
+
+  @Before
+  public void setUp() throws Exception {
+    for (String name : TAGS) {
+      project().tag(name).create(new TagInput());
+    }
+    assertTags(TAGS);
+  }
+
+  @Test
+  public void deleteTags() throws Exception {
+    HashMap<String, RevCommit> initialRevisions = initialRevisions(TAGS);
+    DeleteTagsInput input = new DeleteTagsInput();
+    input.tags = TAGS;
+    project().deleteTags(input);
+    assertTagsDeleted();
+    assertRefUpdatedEvents(initialRevisions);
+  }
+
+  @Test
+  public void deleteTagsForbidden() throws Exception {
+    DeleteTagsInput input = new DeleteTagsInput();
+    input.tags = TAGS;
+    setApiUser(user);
+    try {
+      project().deleteTags(input);
+      fail("Expected ResourceConflictException");
+    } catch (ResourceConflictException e) {
+      assertThat(e).hasMessageThat().isEqualTo(errorMessageForTags(TAGS));
+    }
+    setApiUser(admin);
+    assertTags(TAGS);
+  }
+
+  @Test
+  public void deleteTagsNotFound() throws Exception {
+    DeleteTagsInput input = new DeleteTagsInput();
+    List<String> tags = Lists.newArrayList(TAGS);
+    tags.add("refs/tags/does-not-exist");
+    input.tags = tags;
+    try {
+      project().deleteTags(input);
+      fail("Expected ResourceConflictException");
+    } catch (ResourceConflictException e) {
+      assertThat(e)
+          .hasMessageThat()
+          .isEqualTo(errorMessageForTags(ImmutableList.of("refs/tags/does-not-exist")));
+    }
+    assertTagsDeleted();
+  }
+
+  @Test
+  public void deleteTagsNotFoundContinue() throws Exception {
+    // If it fails on the first tag in the input, it should still
+    // continue to process the remaining tags.
+    DeleteTagsInput input = new DeleteTagsInput();
+    List<String> tags = Lists.newArrayList("refs/tags/does-not-exist");
+    tags.addAll(TAGS);
+    input.tags = tags;
+    try {
+      project().deleteTags(input);
+      fail("Expected ResourceConflictException");
+    } catch (ResourceConflictException e) {
+      assertThat(e)
+          .hasMessageThat()
+          .isEqualTo(errorMessageForTags(ImmutableList.of("refs/tags/does-not-exist")));
+    }
+    assertTagsDeleted();
+  }
+
+  private String errorMessageForTags(List<String> tags) {
+    StringBuilder message = new StringBuilder();
+    for (String tag : tags) {
+      message
+          .append("Cannot delete ")
+          .append(prefixRef(tag))
+          .append(": it doesn't exist or you do not have permission ")
+          .append("to delete it\n");
+    }
+    return message.toString();
+  }
+
+  private HashMap<String, RevCommit> initialRevisions(List<String> tags) throws Exception {
+    HashMap<String, RevCommit> result = new HashMap<>();
+    for (String tag : tags) {
+      String ref = prefixRef(tag);
+      result.put(ref, getRemoteHead(project, ref));
+    }
+    return result;
+  }
+
+  private void assertRefUpdatedEvents(HashMap<String, RevCommit> revisions) throws Exception {
+    for (String tag : revisions.keySet()) {
+      RevCommit revision = revisions.get(prefixRef(tag));
+      eventRecorder.assertRefUpdatedEvents(
+          project.get(), prefixRef(tag), null, revision, revision, null);
+    }
+  }
+
+  private String prefixRef(String ref) {
+    return ref.startsWith(R_TAGS) ? ref : R_TAGS + ref;
+  }
+
+  private ProjectApi project() throws Exception {
+    return gApi.projects().name(project.get());
+  }
+
+  private void assertTags(List<String> expected) throws Exception {
+    List<TagInfo> actualTags = project().tags().get();
+    Iterable<String> actualNames = Iterables.transform(actualTags, b -> b.ref);
+    assertThat(actualNames)
+        .containsExactlyElementsIn(expected.stream().map(this::prefixRef).collect(toList()))
+        .inOrder();
+  }
+
+  private void assertTagsDeleted() throws Exception {
+    assertTags(ImmutableList.<String>of());
+  }
+}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/FileBranchIT.java b/javatests/com/google/gerrit/acceptance/rest/project/FileBranchIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/FileBranchIT.java
rename to javatests/com/google/gerrit/acceptance/rest/project/FileBranchIT.java
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GarbageCollectionIT.java b/javatests/com/google/gerrit/acceptance/rest/project/GarbageCollectionIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GarbageCollectionIT.java
rename to javatests/com/google/gerrit/acceptance/rest/project/GarbageCollectionIT.java
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetChildProjectIT.java b/javatests/com/google/gerrit/acceptance/rest/project/GetChildProjectIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetChildProjectIT.java
rename to javatests/com/google/gerrit/acceptance/rest/project/GetChildProjectIT.java
diff --git a/javatests/com/google/gerrit/acceptance/rest/project/GetCommitIT.java b/javatests/com/google/gerrit/acceptance/rest/project/GetCommitIT.java
new file mode 100644
index 0000000..0632221
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/project/GetCommitIT.java
@@ -0,0 +1,135 @@
+// Copyright (C) 2014 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.google.gerrit.acceptance.rest.project;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.Iterables;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.GitUtil;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.common.CommitInfo;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class GetCommitIT extends AbstractDaemonTest {
+  private TestRepository<Repository> repo;
+
+  @Before
+  public void setUp() throws Exception {
+    repo = GitUtil.newTestRepository(repoManager.openRepository(project));
+    blockRead("refs/*");
+  }
+
+  @After
+  public void tearDown() throws Exception {
+    if (repo != null) {
+      repo.getRepository().close();
+    }
+  }
+
+  @Test
+  public void getNonExistingCommit_NotFound() throws Exception {
+    assertNotFound(ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
+  }
+
+  @Test
+  public void getMergedCommit_Found() throws Exception {
+    unblockRead();
+    RevCommit commit =
+        repo.parseBody(repo.branch("master").commit().message("Create\n\nNew commit\n").create());
+
+    CommitInfo info = getCommit(commit);
+    assertThat(info.commit).isEqualTo(commit.name());
+    assertThat(info.subject).isEqualTo("Create");
+    assertThat(info.message).isEqualTo("Create\n\nNew commit\n");
+    assertThat(info.author.name).isEqualTo("J. Author");
+    assertThat(info.author.email).isEqualTo("jauthor@example.com");
+    assertThat(info.committer.name).isEqualTo("J. Committer");
+    assertThat(info.committer.email).isEqualTo("jcommitter@example.com");
+
+    CommitInfo parent = Iterables.getOnlyElement(info.parents);
+    assertThat(parent.commit).isEqualTo(commit.getParent(0).name());
+    assertThat(parent.subject).isEqualTo("Initial empty repository");
+    assertThat(parent.message).isNull();
+    assertThat(parent.author).isNull();
+    assertThat(parent.committer).isNull();
+  }
+
+  @Test
+  public void getMergedCommit_NotFound() throws Exception {
+    RevCommit commit =
+        repo.parseBody(repo.branch("master").commit().message("Create\n\nNew commit\n").create());
+    assertNotFound(commit);
+  }
+
+  @Test
+  public void getOpenChange_Found() throws Exception {
+    unblockRead();
+    PushOneCommit.Result r =
+        pushFactory.create(db, admin.getIdent(), testRepo).to("refs/for/master");
+    r.assertOkStatus();
+
+    CommitInfo info = getCommit(r.getCommit());
+    assertThat(info.commit).isEqualTo(r.getCommit().name());
+    assertThat(info.subject).isEqualTo("test commit");
+    assertThat(info.message).isEqualTo("test commit\n\nChange-Id: " + r.getChangeId() + "\n");
+    assertThat(info.author.name).isEqualTo("Administrator");
+    assertThat(info.author.email).isEqualTo("admin@example.com");
+    assertThat(info.committer.name).isEqualTo("Administrator");
+    assertThat(info.committer.email).isEqualTo("admin@example.com");
+
+    CommitInfo parent = Iterables.getOnlyElement(info.parents);
+    assertThat(parent.commit).isEqualTo(r.getCommit().getParent(0).name());
+    assertThat(parent.subject).isEqualTo("Initial empty repository");
+    assertThat(parent.message).isNull();
+    assertThat(parent.author).isNull();
+    assertThat(parent.committer).isNull();
+  }
+
+  @Test
+  public void getOpenChange_NotFound() throws Exception {
+    PushOneCommit.Result r =
+        pushFactory.create(db, admin.getIdent(), testRepo).to("refs/for/master");
+    r.assertOkStatus();
+    assertNotFound(r.getCommit());
+  }
+
+  private void unblockRead() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      u.getConfig().getAccessSection("refs/*").remove(new Permission(Permission.READ));
+      u.save();
+    }
+  }
+
+  private void assertNotFound(ObjectId id) throws Exception {
+    userRestSession.get("/projects/" + project.get() + "/commits/" + id.name()).assertNotFound();
+  }
+
+  private CommitInfo getCommit(ObjectId id) throws Exception {
+    RestResponse r = userRestSession.get("/projects/" + project.get() + "/commits/" + id.name());
+    r.assertOK();
+    CommitInfo result = newGson().fromJson(r.getReader(), CommitInfo.class);
+    r.consume();
+    return result;
+  }
+}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetProjectIT.java b/javatests/com/google/gerrit/acceptance/rest/project/GetProjectIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetProjectIT.java
rename to javatests/com/google/gerrit/acceptance/rest/project/GetProjectIT.java
diff --git a/javatests/com/google/gerrit/acceptance/rest/project/ListBranchesIT.java b/javatests/com/google/gerrit/acceptance/rest/project/ListBranchesIT.java
new file mode 100644
index 0000000..b46b087
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/project/ListBranchesIT.java
@@ -0,0 +1,176 @@
+// Copyright (C) 2013 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.google.gerrit.acceptance.rest.project;
+
+import static com.google.gerrit.acceptance.rest.project.RefAssert.assertRefs;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.TestProjectInput;
+import com.google.gerrit.extensions.api.projects.BranchInfo;
+import com.google.gerrit.extensions.api.projects.ProjectApi.ListRefsRequest;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.reviewdb.client.RefNames;
+import org.junit.Test;
+
+@NoHttpd
+public class ListBranchesIT extends AbstractDaemonTest {
+  @Test
+  public void listBranchesOfNonExistingProject_NotFound() throws Exception {
+    exception.expect(ResourceNotFoundException.class);
+    gApi.projects().name("non-existing").branches().get();
+  }
+
+  @Test
+  public void listBranchesOfNonVisibleProject_NotFound() throws Exception {
+    blockRead("refs/*");
+    setApiUser(user);
+    exception.expect(ResourceNotFoundException.class);
+    gApi.projects().name(project.get()).branches().get();
+  }
+
+  @Test
+  @TestProjectInput(createEmptyCommit = false)
+  public void listBranchesOfEmptyProject() throws Exception {
+    assertRefs(
+        ImmutableList.of(branch("HEAD", null, false), branch(RefNames.REFS_CONFIG, null, false)),
+        list().get());
+  }
+
+  @Test
+  public void listBranches() throws Exception {
+    String master = pushTo("refs/heads/master").getCommit().name();
+    String dev = pushTo("refs/heads/dev").getCommit().name();
+    String refsConfig = getRemoteHead(project, RefNames.REFS_CONFIG).name();
+    assertRefs(
+        ImmutableList.of(
+            branch("HEAD", "master", false),
+            branch(RefNames.REFS_CONFIG, refsConfig, false),
+            branch("refs/heads/dev", dev, true),
+            branch("refs/heads/master", master, false)),
+        list().get());
+  }
+
+  @Test
+  public void listBranchesSomeHidden() throws Exception {
+    blockRead("refs/heads/dev");
+    String master = pushTo("refs/heads/master").getCommit().name();
+    pushTo("refs/heads/dev");
+    setApiUser(user);
+    // refs/meta/config is hidden since user is no project owner
+    assertRefs(
+        ImmutableList.of(
+            branch("HEAD", "master", false), branch("refs/heads/master", master, false)),
+        list().get());
+  }
+
+  @Test
+  public void listBranchesHeadHidden() throws Exception {
+    blockRead("refs/heads/master");
+    pushTo("refs/heads/master");
+    String dev = pushTo("refs/heads/dev").getCommit().name();
+    setApiUser(user);
+    // refs/meta/config is hidden since user is no project owner
+    assertRefs(ImmutableList.of(branch("refs/heads/dev", dev, false)), list().get());
+  }
+
+  @Test
+  public void listBranchesUsingPagination() throws Exception {
+    BranchInfo head = branch("HEAD", "master", false);
+    BranchInfo refsConfig =
+        branch(RefNames.REFS_CONFIG, getRemoteHead(project, RefNames.REFS_CONFIG).name(), false);
+    BranchInfo master =
+        branch("refs/heads/master", pushTo("refs/heads/master").getCommit().getName(), false);
+    BranchInfo branch1 =
+        branch(
+            "refs/heads/someBranch1", pushTo("refs/heads/someBranch1").getCommit().getName(), true);
+    BranchInfo branch2 =
+        branch(
+            "refs/heads/someBranch2", pushTo("refs/heads/someBranch2").getCommit().getName(), true);
+    BranchInfo branch3 =
+        branch(
+            "refs/heads/someBranch3", pushTo("refs/heads/someBranch3").getCommit().getName(), true);
+
+    // Using only limit.
+    assertRefs(ImmutableList.of(head, refsConfig, master, branch1), list().withLimit(4).get());
+
+    // Limit higher than total number of branches.
+    assertRefs(
+        ImmutableList.of(head, refsConfig, master, branch1, branch2, branch3),
+        list().withLimit(25).get());
+
+    // Using start only.
+    assertRefs(ImmutableList.of(master, branch1, branch2, branch3), list().withStart(2).get());
+
+    // Skip more branches than the number of available branches.
+    assertRefs(ImmutableList.of(), list().withStart(7).get());
+
+    // Ssing start and limit.
+    assertRefs(ImmutableList.of(master, branch1), list().withStart(2).withLimit(2).get());
+  }
+
+  @Test
+  public void listBranchesUsingFilter() throws Exception {
+    BranchInfo master =
+        branch("refs/heads/master", pushTo("refs/heads/master").getCommit().getName(), false);
+    BranchInfo branch1 =
+        branch(
+            "refs/heads/someBranch1", pushTo("refs/heads/someBranch1").getCommit().getName(), true);
+    BranchInfo branch2 =
+        branch(
+            "refs/heads/someBranch2", pushTo("refs/heads/someBranch2").getCommit().getName(), true);
+    BranchInfo branch3 =
+        branch(
+            "refs/heads/someBranch3", pushTo("refs/heads/someBranch3").getCommit().getName(), true);
+
+    // Using substring.
+    assertRefs(ImmutableList.of(branch1, branch2, branch3), list().withSubstring("some").get());
+
+    assertRefs(ImmutableList.of(branch1, branch2, branch3), list().withSubstring("Branch").get());
+
+    assertRefs(
+        ImmutableList.of(branch1, branch2, branch3), list().withSubstring("somebranch").get());
+
+    // Using regex.
+    assertRefs(ImmutableList.of(master), list().withRegex(".*ast.*r").get());
+    assertRefs(ImmutableList.of(), list().withRegex(".*AST.*R").get());
+
+    // Conflicting options
+    assertBadRequest(list().withSubstring("somebranch").withRegex(".*ast.*r"));
+  }
+
+  private ListRefsRequest<BranchInfo> list() throws Exception {
+    return gApi.projects().name(project.get()).branches();
+  }
+
+  private static BranchInfo branch(String ref, String revision, boolean canDelete) {
+    BranchInfo info = new BranchInfo();
+    info.ref = ref;
+    info.revision = revision;
+    info.canDelete = canDelete ? true : null;
+    return info;
+  }
+
+  private void assertBadRequest(ListRefsRequest<BranchInfo> req) throws Exception {
+    try {
+      req.get();
+      fail("Expected BadRequestException");
+    } catch (BadRequestException e) {
+      // Expected
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/project/ListChildProjectsIT.java b/javatests/com/google/gerrit/acceptance/rest/project/ListChildProjectsIT.java
new file mode 100644
index 0000000..90906ba
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/project/ListChildProjectsIT.java
@@ -0,0 +1,73 @@
+// Copyright (C) 2013 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.google.gerrit.acceptance.rest.project;
+
+import static com.google.gerrit.acceptance.rest.project.ProjectAssert.assertThatNameList;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.reviewdb.client.Project;
+import org.junit.Test;
+
+@NoHttpd
+public class ListChildProjectsIT extends AbstractDaemonTest {
+
+  @Test
+  public void listChildrenOfNonExistingProject_NotFound() throws Exception {
+    exception.expect(ResourceNotFoundException.class);
+    exception.expectMessage("non-existing");
+    gApi.projects().name(name("non-existing")).child("children");
+  }
+
+  @Test
+  public void listNoChildren() throws Exception {
+    assertThatNameList(gApi.projects().name(project.get()).children()).isEmpty();
+  }
+
+  @Test
+  public void listChildren() throws Exception {
+    Project.NameKey child1 = createProject("p1");
+    Project.NameKey child1_1 = createProject("p1.1", child1);
+    Project.NameKey child1_2 = createProject("p1.2", child1);
+
+    assertThatNameList(gApi.projects().name(child1.get()).children())
+        .containsExactly(child1_1, child1_2)
+        .inOrder();
+  }
+
+  @Test
+  public void listChildrenWithLimit() throws Exception {
+    Project.NameKey child1 = createProject("p1");
+    Project.NameKey child1_1 = createProject("p1.1", child1);
+    createProject("p1.2", child1);
+
+    assertThatNameList(gApi.projects().name(child1.get()).children(1)).containsExactly(child1_1);
+  }
+
+  @Test
+  public void listChildrenRecursively() throws Exception {
+    Project.NameKey child1 = createProject("p1");
+    createProject("p2");
+    Project.NameKey child1_1 = createProject("p1.1", child1);
+    Project.NameKey child1_2 = createProject("p1.2", child1);
+    Project.NameKey child1_1_1 = createProject("p1.1.1", child1_1);
+    Project.NameKey child1_1_1_1 = createProject("p1.1.1.1", child1_1_1);
+
+    assertThatNameList(gApi.projects().name(child1.get()).children(true))
+        .containsExactly(child1_1, child1_1_1, child1_1_1_1, child1_2)
+        .inOrder();
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/project/ListCommitFilesIT.java b/javatests/com/google/gerrit/acceptance/rest/project/ListCommitFilesIT.java
new file mode 100644
index 0000000..3ac2d10
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/project/ListCommitFilesIT.java
@@ -0,0 +1,90 @@
+// 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.
+
+package com.google.gerrit.acceptance.rest.project;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.acceptance.GitUtil.getChangeId;
+import static com.google.gerrit.acceptance.GitUtil.pushHead;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.extensions.common.FileInfo;
+import com.google.gson.reflect.TypeToken;
+import java.lang.reflect.Type;
+import java.util.Map;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.junit.Test;
+
+public class ListCommitFilesIT extends AbstractDaemonTest {
+  private static String SUBJECT_1 = "subject 1";
+  private static String SUBJECT_2 = "subject 2";
+  private static String FILE_A = "a.txt";
+  private static String FILE_B = "b.txt";
+
+  @Test
+  public void listCommitFiles() throws Exception {
+    commitBuilder().add(FILE_B, "2").message(SUBJECT_1).create();
+    pushHead(testRepo, "refs/heads/master", false);
+
+    RevCommit a = commitBuilder().add(FILE_A, "1").rm(FILE_B).message(SUBJECT_2).create();
+    String id = getChangeId(testRepo, a).get();
+    pushHead(testRepo, "refs/for/master", false);
+
+    RestResponse r =
+        userRestSession.get("/projects/" + project.get() + "/commits/" + a.name() + "/files/");
+    r.assertOK();
+    Type type = new TypeToken<Map<String, FileInfo>>() {}.getType();
+    Map<String, FileInfo> files1 = newGson().fromJson(r.getReader(), type);
+    r.consume();
+
+    r = userRestSession.get("/changes/" + id + "/revisions/" + a.name() + "/files");
+    r.assertOK();
+    Map<String, FileInfo> files2 = newGson().fromJson(r.getReader(), type);
+    r.consume();
+
+    assertThat(files1).isEqualTo(files2);
+  }
+
+  @Test
+  public void listMergeCommitFiles() throws Exception {
+    PushOneCommit.Result result = createMergeCommitChange("refs/for/master");
+
+    RestResponse r =
+        userRestSession.get(
+            "/projects/"
+                + project.get()
+                + "/commits/"
+                + result.getCommit().name()
+                + "/files/?parent=2");
+    r.assertOK();
+    Type type = new TypeToken<Map<String, FileInfo>>() {}.getType();
+    Map<String, FileInfo> files1 = newGson().fromJson(r.getReader(), type);
+    r.consume();
+
+    r =
+        userRestSession.get(
+            "/changes/"
+                + result.getChangeId()
+                + "/revisions/"
+                + result.getCommit().name()
+                + "/files/?parent=2");
+    r.assertOK();
+    Map<String, FileInfo> files2 = newGson().fromJson(r.getReader(), type);
+    r.consume();
+
+    assertThat(files1).isEqualTo(files2);
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/project/ListProjectsIT.java b/javatests/com/google/gerrit/acceptance/rest/project/ListProjectsIT.java
new file mode 100644
index 0000000..7189a03
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/project/ListProjectsIT.java
@@ -0,0 +1,385 @@
+// Copyright (C) 2014 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.google.gerrit.acceptance.rest.project;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.acceptance.rest.project.ProjectAssert.assertThatNameList;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.base.Splitter;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.GerritConfig;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.Sandboxed;
+import com.google.gerrit.acceptance.TestProjectInput;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.projects.ConfigInfo;
+import com.google.gerrit.extensions.api.projects.ConfigInput;
+import com.google.gerrit.extensions.api.projects.Projects.ListRequest;
+import com.google.gerrit.extensions.api.projects.Projects.ListRequest.FilterType;
+import com.google.gerrit.extensions.client.ProjectState;
+import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.OutputFormat;
+import com.google.gerrit.server.project.ProjectCacheImpl;
+import com.google.gerrit.server.project.testing.Util;
+import com.google.gerrit.server.restapi.project.ListProjects;
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import com.google.inject.Inject;
+import java.io.ByteArrayOutputStream;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.IntStream;
+import org.junit.Test;
+
+@NoHttpd
+@Sandboxed
+public class ListProjectsIT extends AbstractDaemonTest {
+  @Inject private ListProjects listProjects;
+
+  @Test
+  public void listProjects() throws Exception {
+    Project.NameKey someProject = createProject("some-project");
+    assertThatNameList(filter(gApi.projects().list().get()))
+        .containsExactly(allProjects, allUsers, project, someProject)
+        .inOrder();
+  }
+
+  @Test
+  public void listProjectsFiltersInvisibleProjects() throws Exception {
+    setApiUser(user);
+    assertThatNameList(gApi.projects().list().get()).contains(project);
+
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      Util.block(u.getConfig(), Permission.READ, REGISTERED_USERS, "refs/*");
+      u.save();
+    }
+
+    assertThatNameList(filter(gApi.projects().list().get())).doesNotContain(project);
+  }
+
+  @Test
+  public void listProjectsWithBranch() throws Exception {
+    Map<String, ProjectInfo> result = gApi.projects().list().addShowBranch("master").getAsMap();
+    assertThat(result).containsKey(project.get());
+    ProjectInfo info = result.get(project.get());
+    assertThat(info.branches).isNotNull();
+    assertThat(info.branches).hasSize(1);
+    assertThat(info.branches.get("master")).isNotNull();
+  }
+
+  @Test
+  @TestProjectInput(description = "Description of some-project")
+  public void listProjectWithDescription() throws Exception {
+    // description not be included in the results by default.
+    Map<String, ProjectInfo> result = gApi.projects().list().getAsMap();
+    assertThat(result).containsKey(project.get());
+    assertThat(result.get(project.get()).description).isNull();
+
+    result = gApi.projects().list().withDescription(true).getAsMap();
+    assertThat(result).containsKey(project.get());
+    assertThat(result.get(project.get()).description).isEqualTo("Description of some-project");
+  }
+
+  @Test
+  public void listProjectsWithLimit() throws Exception {
+    ProjectCacheImpl projectCacheImpl = (ProjectCacheImpl) projectCache;
+    for (int i = 0; i < 5; i++) {
+      createProject("someProject" + i);
+    }
+
+    String p = name("");
+    // 5, plus p which was automatically created.
+    int n = 6;
+    projectCacheImpl.evictAllByName();
+    for (int i = 1; i <= n + 2; i++) {
+      assertThatNameList(gApi.projects().list().withPrefix(p).withLimit(i).get())
+          .hasSize(Math.min(i, n));
+      assertThat(projectCacheImpl.sizeAllByName())
+          .isAtMost((long) (i + 2)); // 2 = AllProjects + AllUsers
+    }
+  }
+
+  @Test
+  @GerritConfig(name = "gerrit.listProjectsFromIndex", value = "true")
+  public void listProjectsFromIndexShouldBeLimitedTo500() throws Exception {
+    int numTestProjects = 501;
+    assertThat(createProjects("foo", numTestProjects)).hasSize(numTestProjects);
+    assertThat(gApi.projects().list().get()).hasSize(500);
+  }
+
+  @Test
+  public void listProjectsShouldNotBeLimitedByDefault() throws Exception {
+    int numTestProjects = 501;
+    assertThat(createProjects("foo", numTestProjects)).hasSize(numTestProjects);
+    assertThat(gApi.projects().list().get().size()).isAtLeast(numTestProjects);
+  }
+
+  @Test
+  public void listProjectsToOutputStream() throws Exception {
+    int numInitialProjects = gApi.projects().list().get().size();
+    int numTestProjects = 5;
+    List<String> testProjects = createProjects("zzz_testProject", numTestProjects);
+    try (ByteArrayOutputStream displayOut = new ByteArrayOutputStream()) {
+
+      listProjects.setStart(numInitialProjects);
+      listProjects.displayToStream(displayOut);
+
+      List<String> lines =
+          Splitter.on("\n").omitEmptyStrings().splitToList(new String(displayOut.toByteArray()));
+      assertThat(lines).isEqualTo(testProjects);
+    }
+  }
+
+  @Test
+  public void listProjectsAsJsonMultilineToOutputStream() throws Exception {
+    listProjectsAsJsonToOutputStream(OutputFormat.JSON);
+  }
+
+  @Test
+  public void listProjectsAsJsonCompactToOutputStream() throws Exception {
+    String jsonOutput = listProjectsAsJsonToOutputStream(OutputFormat.JSON_COMPACT).trim();
+    assertThat(jsonOutput).doesNotContain("\n");
+  }
+
+  private String listProjectsAsJsonToOutputStream(OutputFormat jsonFormat) throws Exception {
+    assertThat(jsonFormat.isJson()).isTrue();
+
+    int numInitialProjects = gApi.projects().list().get().size();
+    int numTestProjects = 5;
+    Set<String> testProjects =
+        ImmutableSet.copyOf(createProjects("zzz_testProject", numTestProjects));
+    try (ByteArrayOutputStream displayOut = new ByteArrayOutputStream()) {
+
+      listProjects.setStart(numInitialProjects);
+      listProjects.setFormat(jsonFormat);
+      listProjects.displayToStream(displayOut);
+
+      String projectsJsonOutput = new String(displayOut.toByteArray());
+
+      Gson gson = jsonFormat.newGson();
+      Set<String> projectsJsonNames = gson.fromJson(projectsJsonOutput, JsonObject.class).keySet();
+      assertThat(projectsJsonNames).isEqualTo(testProjects);
+
+      return projectsJsonOutput;
+    }
+  }
+
+  private List<String> createProjects(String prefix, int numProjects) {
+    return IntStream.range(0, numProjects)
+        .mapToObj(
+            i -> {
+              String projectName = prefix + i;
+              try {
+                return createProject(projectName);
+              } catch (RestApiException e) {
+                throw new IllegalStateException("Unable to create project " + projectName, e);
+              }
+            })
+        .map(Project.NameKey::get)
+        .collect(toList());
+  }
+
+  @Test
+  public void listProjectsWithPrefix() throws Exception {
+    Project.NameKey someProject = createProject("some-project");
+    Project.NameKey someOtherProject = createProject("some-other-project");
+    createProject("project-awesome");
+
+    String p = name("some");
+    assertBadRequest(gApi.projects().list().withPrefix(p).withRegex(".*"));
+    assertBadRequest(gApi.projects().list().withPrefix(p).withSubstring(p));
+    assertThatNameList(filter(gApi.projects().list().withPrefix(p).get()))
+        .containsExactly(someOtherProject, someProject)
+        .inOrder();
+    p = name("SOME");
+    assertThatNameList(filter(gApi.projects().list().withPrefix(p).get())).isEmpty();
+  }
+
+  @Test
+  public void listProjectsWithRegex() throws Exception {
+    Project.NameKey someProject = createProject("some-project");
+    Project.NameKey someOtherProject = createProject("some-other-project");
+    Project.NameKey projectAwesome = createProject("project-awesome");
+
+    assertBadRequest(gApi.projects().list().withRegex("[.*"));
+    assertBadRequest(gApi.projects().list().withRegex(".*").withPrefix("p"));
+    assertBadRequest(gApi.projects().list().withRegex(".*").withSubstring("p"));
+
+    assertThatNameList(filter(gApi.projects().list().withRegex(".*some").get()))
+        .containsExactly(projectAwesome);
+    String r = name("some-project$").replace(".", "\\.");
+    assertThatNameList(filter(gApi.projects().list().withRegex(r).get()))
+        .containsExactly(someProject);
+    assertThatNameList(filter(gApi.projects().list().withRegex(".*").get()))
+        .containsExactly(
+            allProjects, allUsers, project, projectAwesome, someOtherProject, someProject)
+        .inOrder();
+  }
+
+  @Test
+  public void listProjectsWithStart() throws Exception {
+    for (int i = 0; i < 5; i++) {
+      createProject(new Project.NameKey("someProject" + i).get());
+    }
+
+    String p = name("");
+    List<ProjectInfo> all = gApi.projects().list().withPrefix(p).get();
+    // 5, plus p which was automatically created.
+    int n = 6;
+    assertThat(all).hasSize(n);
+    assertThatNameList(gApi.projects().list().withPrefix(p).withStart(n - 1).get())
+        .containsExactly(new Project.NameKey(Iterables.getLast(all).name));
+  }
+
+  @Test
+  public void listProjectsWithSubstring() throws Exception {
+    Project.NameKey someProject = createProject("some-project");
+    Project.NameKey someOtherProject = createProject("some-other-project");
+    Project.NameKey projectAwesome = createProject("project-awesome");
+
+    assertBadRequest(gApi.projects().list().withSubstring("some").withRegex(".*"));
+    assertBadRequest(gApi.projects().list().withSubstring("some").withPrefix("some"));
+    assertThatNameList(filter(gApi.projects().list().withSubstring("some").get()))
+        .containsExactly(projectAwesome, someOtherProject, someProject)
+        .inOrder();
+    assertThatNameList(filter(gApi.projects().list().withSubstring("SOME").get()))
+        .containsExactly(projectAwesome, someOtherProject, someProject)
+        .inOrder();
+  }
+
+  @Test
+  public void listProjectsWithTree() throws Exception {
+    Project.NameKey someParentProject = createProject("some-parent-project");
+    Project.NameKey someChildProject = createProject("some-child-project", someParentProject);
+
+    Map<String, ProjectInfo> result = gApi.projects().list().withTree(true).getAsMap();
+    assertThat(result).containsKey(someChildProject.get());
+    assertThat(result.get(someChildProject.get()).parent).isEqualTo(someParentProject.get());
+  }
+
+  @Test
+  public void listProjectWithType() throws Exception {
+    Map<String, ProjectInfo> result =
+        gApi.projects().list().withType(FilterType.PERMISSIONS).getAsMap();
+    assertThat(result.keySet()).containsExactly(allProjects.get(), allUsers.get());
+
+    assertThatNameList(filter(gApi.projects().list().withType(FilterType.ALL).get()))
+        .containsExactly(allProjects, allUsers, project)
+        .inOrder();
+  }
+
+  @Test
+  public void listParentCandidates() throws Exception {
+    Map<String, ProjectInfo> result =
+        gApi.projects().list().withType(FilterType.PARENT_CANDIDATES).getAsMap();
+    assertThat(result).hasSize(1);
+    assertThat(result).containsKey(allProjects.get());
+
+    // Create a new project with 'project' as parent
+    Project.NameKey testProject = createProject(name("test"), project);
+
+    // Parent candidates are All-Projects and 'project'
+    assertThatNameList(filter(gApi.projects().list().withType(FilterType.PARENT_CANDIDATES).get()))
+        .containsExactly(allProjects, project)
+        .inOrder();
+
+    // All projects are listed
+    assertThatNameList(filter(gApi.projects().list().get()))
+        .containsExactly(allProjects, allUsers, testProject, project)
+        .inOrder();
+  }
+
+  @Test
+  public void listWithHiddenAndReadonlyProjects() throws Exception {
+    Project.NameKey hidden = createProject("project-to-hide");
+    Project.NameKey readonly = createProject("project-to-read");
+
+    // Set project read-only
+    ConfigInput input = new ConfigInput();
+    input.state = ProjectState.READ_ONLY;
+    ConfigInfo info = gApi.projects().name(readonly.get()).config(input);
+    assertThat(info.state).isEqualTo(input.state);
+
+    // The hidden project is included because it was not hidden yet.
+    // The read-only project is included.
+    assertThatNameList(gApi.projects().list().get())
+        .containsExactly(allProjects, allUsers, project, hidden, readonly)
+        .inOrder();
+
+    // Hide the project
+    input.state = ProjectState.HIDDEN;
+    info = gApi.projects().name(hidden.get()).config(input);
+    assertThat(info.state).isEqualTo(input.state);
+
+    // Project is still accessible directly
+    gApi.projects().name(hidden.get()).get();
+
+    // Hidden project is not included in the list
+    assertThatNameList(gApi.projects().list().get())
+        .containsExactly(allProjects, allUsers, project, readonly)
+        .inOrder();
+
+    // ALL filter applies to type, and doesn't include hidden state
+    assertThatNameList(gApi.projects().list().withType(FilterType.ALL).get())
+        .containsExactly(allProjects, allUsers, project, readonly)
+        .inOrder();
+
+    // "All" boolean option causes hidden projects to be included
+    assertThatNameList(gApi.projects().list().withAll(true).get())
+        .containsExactly(allProjects, allUsers, project, hidden, readonly)
+        .inOrder();
+
+    // "State" option causes only the projects in that state to be included
+    assertThatNameList(gApi.projects().list().withState(ProjectState.HIDDEN).get())
+        .containsExactly(hidden);
+    assertThatNameList(gApi.projects().list().withState(ProjectState.READ_ONLY).get())
+        .containsExactly(readonly);
+    assertThatNameList(gApi.projects().list().withState(ProjectState.ACTIVE).get())
+        .containsExactly(allProjects, allUsers, project)
+        .inOrder();
+
+    // Cannot use "all" and "state" together
+    assertBadRequest(gApi.projects().list().withAll(true).withState(ProjectState.ACTIVE));
+  }
+
+  private void assertBadRequest(ListRequest req) throws Exception {
+    try {
+      req.get();
+      fail("Expected BadRequestException");
+    } catch (BadRequestException expected) {
+      // Expected.
+    }
+  }
+
+  private Iterable<ProjectInfo> filter(Iterable<ProjectInfo> infos) {
+    String prefix = name("");
+    return Iterables.filter(
+        infos,
+        p -> {
+          return p.name != null
+              && (p.name.equals(allProjects.get())
+                  || p.name.equals(allUsers.get())
+                  || p.name.startsWith(prefix));
+        });
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/project/PluginAccessIT.java b/javatests/com/google/gerrit/acceptance/rest/project/PluginAccessIT.java
new file mode 100644
index 0000000..1e6afa8
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/project/PluginAccessIT.java
@@ -0,0 +1,78 @@
+// 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.
+
+package com.google.gerrit.acceptance.rest.project;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.extensions.annotations.Exports;
+import com.google.gerrit.extensions.api.access.AccessSectionInfo;
+import com.google.gerrit.extensions.api.access.PermissionInfo;
+import com.google.gerrit.extensions.api.access.PermissionRuleInfo;
+import com.google.gerrit.extensions.api.access.ProjectAccessInfo;
+import com.google.gerrit.extensions.api.access.ProjectAccessInput;
+import com.google.gerrit.extensions.config.CapabilityDefinition;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.inject.AbstractModule;
+import com.google.inject.Module;
+import org.junit.Test;
+
+public class PluginAccessIT extends AbstractDaemonTest {
+
+  private static final String CORE_PLUGIN_PREFIX = "gerrit-";
+  private static final String PLUGIN_CAPABILITY = "printHello";
+
+  @Override
+  public Module createModule() {
+    return new AbstractModule() {
+      @Override
+      protected void configure() {
+        bind(CapabilityDefinition.class)
+            .annotatedWith(Exports.named(PLUGIN_CAPABILITY))
+            .toInstance(
+                new CapabilityDefinition() {
+                  @Override
+                  public String getDescription() {
+                    return "Print Hello";
+                  }
+                });
+      }
+    };
+  }
+
+  @Test
+  public void addPluginCapability() throws Exception {
+    ProjectAccessInput accessInput = new ProjectAccessInput();
+    AccessSectionInfo accessSectionInfo = new AccessSectionInfo();
+    PermissionInfo email = new PermissionInfo(null, null);
+    PermissionRuleInfo pri = new PermissionRuleInfo(PermissionRuleInfo.Action.ALLOW, false);
+
+    email.rules = ImmutableMap.of(SystemGroupBackend.REGISTERED_USERS.get(), pri);
+    accessSectionInfo.permissions = ImmutableMap.of(CORE_PLUGIN_PREFIX + PLUGIN_CAPABILITY, email);
+    accessInput.add = ImmutableMap.of(AccessSection.GLOBAL_CAPABILITIES, accessSectionInfo);
+
+    ProjectAccessInfo updatedAccessSectionInfo =
+        gApi.projects().name(allProjects.get()).access(accessInput);
+    assertThat(
+            updatedAccessSectionInfo
+                .local
+                .get(AccessSection.GLOBAL_CAPABILITIES)
+                .permissions
+                .keySet())
+        .containsAllIn(accessSectionInfo.permissions.keySet());
+  }
+}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ProjectAssert.java b/javatests/com/google/gerrit/acceptance/rest/project/ProjectAssert.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ProjectAssert.java
rename to javatests/com/google/gerrit/acceptance/rest/project/ProjectAssert.java
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ProjectLevelConfigIT.java b/javatests/com/google/gerrit/acceptance/rest/project/ProjectLevelConfigIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ProjectLevelConfigIT.java
rename to javatests/com/google/gerrit/acceptance/rest/project/ProjectLevelConfigIT.java
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/PushAnnotatedTagIT.java b/javatests/com/google/gerrit/acceptance/rest/project/PushAnnotatedTagIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/PushAnnotatedTagIT.java
rename to javatests/com/google/gerrit/acceptance/rest/project/PushAnnotatedTagIT.java
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/PushLightweightTagIT.java b/javatests/com/google/gerrit/acceptance/rest/project/PushLightweightTagIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/PushLightweightTagIT.java
rename to javatests/com/google/gerrit/acceptance/rest/project/PushLightweightTagIT.java
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/RefAssert.java b/javatests/com/google/gerrit/acceptance/rest/project/RefAssert.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/RefAssert.java
rename to javatests/com/google/gerrit/acceptance/rest/project/RefAssert.java
diff --git a/javatests/com/google/gerrit/acceptance/rest/project/TagsIT.java b/javatests/com/google/gerrit/acceptance/rest/project/TagsIT.java
new file mode 100644
index 0000000..d4edc0d
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/project/TagsIT.java
@@ -0,0 +1,380 @@
+// Copyright (C) 2014 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.google.gerrit.acceptance.rest.project;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static org.eclipse.jgit.lib.Constants.R_TAGS;
+
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.projects.ProjectApi.ListRefsRequest;
+import com.google.gerrit.extensions.api.projects.TagApi;
+import com.google.gerrit.extensions.api.projects.TagInfo;
+import com.google.gerrit.extensions.api.projects.TagInput;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import java.sql.Timestamp;
+import java.util.List;
+import org.junit.Test;
+
+@NoHttpd
+public class TagsIT extends AbstractDaemonTest {
+  private static final List<String> testTags =
+      ImmutableList.of("tag-A", "tag-B", "tag-C", "tag-D", "tag-E", "tag-F", "tag-G", "tag-H");
+
+  private static final String SIGNED_ANNOTATION =
+      "annotation\n"
+          + "-----BEGIN PGP SIGNATURE-----\n"
+          + "Version: GnuPG v1\n"
+          + "\n"
+          + "iQEcBAABAgAGBQJVeGg5AAoJEPfTicJkUdPkUggH/RKAeI9/i/LduuiqrL/SSdIa\n"
+          + "9tYaSqJKLbXz63M/AW4Sp+4u+dVCQvnAt/a35CVEnpZz6hN4Kn/tiswOWVJf4CO7\n"
+          + "htNubGs5ZMwvD6sLYqKAnrM3WxV/2TbbjzjZW6Jkidz3jz/WRT4SmjGYiEO7aA+V\n"
+          + "4ZdIS9f7sW5VsHHYlNThCA7vH8Uu48bUovFXyQlPTX0pToSgrWV3JnTxDNxfn3iG\n"
+          + "IL0zTY/qwVCdXgFownLcs6J050xrrBWIKqfcWr3u4D2aCLyR0v+S/KArr7ulZygY\n"
+          + "+SOklImn8TAZiNxhWtA6ens66IiammUkZYFv7SSzoPLFZT4dC84SmGPWgf94NoQ=\n"
+          + "=XFeC\n"
+          + "-----END PGP SIGNATURE-----";
+
+  @Test
+  public void listTagsOfNonExistingProject() throws Exception {
+    exception.expect(ResourceNotFoundException.class);
+    gApi.projects().name("does-not-exist").tags().get();
+  }
+
+  @Test
+  public void getTagOfNonExistingProject() throws Exception {
+    exception.expect(ResourceNotFoundException.class);
+    gApi.projects().name("does-not-exist").tag("tag").get();
+  }
+
+  @Test
+  public void listTagsOfNonVisibleProject() throws Exception {
+    blockRead("refs/*");
+    setApiUser(user);
+    exception.expect(ResourceNotFoundException.class);
+    gApi.projects().name(project.get()).tags().get();
+  }
+
+  @Test
+  public void getTagOfNonVisibleProject() throws Exception {
+    blockRead("refs/*");
+    exception.expect(ResourceNotFoundException.class);
+    gApi.projects().name(project.get()).tag("tag").get();
+  }
+
+  @Test
+  public void listTags() throws Exception {
+    createTags();
+
+    // No options
+    List<TagInfo> result = getTags().get();
+    assertTagList(FluentIterable.from(testTags), result);
+
+    // With start option
+    result = getTags().withStart(1).get();
+    assertTagList(FluentIterable.from(testTags).skip(1), result);
+
+    // With limit option
+    int limit = testTags.size() - 1;
+    result = getTags().withLimit(limit).get();
+    assertTagList(FluentIterable.from(testTags).limit(limit), result);
+
+    // With both start and limit
+    limit = testTags.size() - 3;
+    result = getTags().withStart(1).withLimit(limit).get();
+    assertTagList(FluentIterable.from(testTags).skip(1).limit(limit), result);
+
+    // With regular expression filter
+    result = getTags().withRegex("^tag-[C|D]$").get();
+    assertTagList(FluentIterable.from(ImmutableList.of("tag-C", "tag-D")), result);
+
+    result = getTags().withRegex("^tag-[c|d]$").get();
+    assertTagList(FluentIterable.from(ImmutableList.of()), result);
+
+    // With substring filter
+    result = getTags().withSubstring("tag-").get();
+    assertTagList(FluentIterable.from(testTags), result);
+    result = getTags().withSubstring("ag-B").get();
+    assertTagList(FluentIterable.from(ImmutableList.of("tag-B")), result);
+
+    // With conflicting options
+    assertBadRequest(getTags().withSubstring("ag-B").withRegex("^tag-[c|d]$"));
+  }
+
+  @Test
+  public void listTagsOfNonVisibleBranch() throws Exception {
+    grantTagPermissions();
+
+    PushOneCommit push1 = pushFactory.create(db, admin.getIdent(), testRepo);
+    PushOneCommit.Result r1 = push1.to("refs/heads/master");
+    r1.assertOkStatus();
+    TagInput tag1 = new TagInput();
+    tag1.ref = "v1.0";
+    tag1.revision = r1.getCommit().getName();
+    TagInfo result = tag(tag1.ref).create(tag1).get();
+    assertThat(result.ref).isEqualTo(R_TAGS + tag1.ref);
+    assertThat(result.revision).isEqualTo(tag1.revision);
+
+    pushTo("refs/heads/hidden");
+    PushOneCommit push2 = pushFactory.create(db, admin.getIdent(), testRepo);
+    PushOneCommit.Result r2 = push2.to("refs/heads/hidden");
+    r2.assertOkStatus();
+
+    TagInput tag2 = new TagInput();
+    tag2.ref = "v2.0";
+    tag2.revision = r2.getCommit().getName();
+    result = tag(tag2.ref).create(tag2).get();
+    assertThat(result.ref).isEqualTo(R_TAGS + tag2.ref);
+    assertThat(result.revision).isEqualTo(tag2.revision);
+
+    List<TagInfo> tags = getTags().get();
+    assertThat(tags).hasSize(2);
+    assertThat(tags.get(0).ref).isEqualTo(R_TAGS + tag1.ref);
+    assertThat(tags.get(0).revision).isEqualTo(tag1.revision);
+    assertThat(tags.get(1).ref).isEqualTo(R_TAGS + tag2.ref);
+    assertThat(tags.get(1).revision).isEqualTo(tag2.revision);
+
+    blockRead("refs/heads/hidden");
+    tags = getTags().get();
+    assertThat(tags).hasSize(1);
+    assertThat(tags.get(0).ref).isEqualTo(R_TAGS + tag1.ref);
+    assertThat(tags.get(0).revision).isEqualTo(tag1.revision);
+  }
+
+  @Test
+  public void lightweightTag() throws Exception {
+    grantTagPermissions();
+
+    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
+    PushOneCommit.Result r = push.to("refs/heads/master");
+    r.assertOkStatus();
+
+    TagInput input = new TagInput();
+    input.ref = "v1.0";
+    input.revision = r.getCommit().getName();
+
+    TagInfo result = tag(input.ref).create(input).get();
+    assertThat(result.ref).isEqualTo(R_TAGS + input.ref);
+    assertThat(result.revision).isEqualTo(input.revision);
+    assertThat(result.canDelete).isTrue();
+    assertThat(result.created).isEqualTo(timestamp(r));
+
+    input.ref = "refs/tags/v2.0";
+    result = tag(input.ref).create(input).get();
+    assertThat(result.ref).isEqualTo(input.ref);
+    assertThat(result.revision).isEqualTo(input.revision);
+    assertThat(result.canDelete).isTrue();
+    assertThat(result.created).isEqualTo(timestamp(r));
+
+    setApiUser(user);
+    result = tag(input.ref).get();
+    assertThat(result.canDelete).isNull();
+
+    eventRecorder.assertRefUpdatedEvents(project.get(), result.ref, null, result.revision);
+  }
+
+  @Test
+  public void annotatedTag() throws Exception {
+    grantTagPermissions();
+
+    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
+    PushOneCommit.Result r = push.to("refs/heads/master");
+    r.assertOkStatus();
+
+    TagInput input = new TagInput();
+    input.ref = "v1.0";
+    input.revision = r.getCommit().getName();
+    input.message = "annotation message";
+
+    TagInfo result = tag(input.ref).create(input).get();
+    assertThat(result.ref).isEqualTo(R_TAGS + input.ref);
+    assertThat(result.object).isEqualTo(input.revision);
+    assertThat(result.message).isEqualTo(input.message);
+    assertThat(result.tagger.name).isEqualTo(admin.fullName);
+    assertThat(result.tagger.email).isEqualTo(admin.email);
+    assertThat(result.created).isEqualTo(result.tagger.date);
+
+    eventRecorder.assertRefUpdatedEvents(project.get(), result.ref, null, result.revision);
+
+    // A second tag pushed on the same ref should have the same ref
+    TagInput input2 = new TagInput();
+    input2.ref = "refs/tags/v2.0";
+    input2.revision = input.revision;
+    input2.message = "second annotation message";
+    TagInfo result2 = tag(input2.ref).create(input2).get();
+    assertThat(result2.ref).isEqualTo(input2.ref);
+    assertThat(result2.object).isEqualTo(input2.revision);
+    assertThat(result2.message).isEqualTo(input2.message);
+    assertThat(result2.tagger.name).isEqualTo(admin.fullName);
+    assertThat(result2.tagger.email).isEqualTo(admin.email);
+    assertThat(result2.created).isEqualTo(result2.tagger.date);
+
+    eventRecorder.assertRefUpdatedEvents(project.get(), result2.ref, null, result2.revision);
+  }
+
+  @Test
+  public void createExistingTag() throws Exception {
+    grantTagPermissions();
+
+    TagInput input = new TagInput();
+    input.ref = "test";
+    TagInfo result = tag(input.ref).create(input).get();
+    assertThat(result.ref).isEqualTo(R_TAGS + "test");
+
+    input.ref = "refs/tags/test";
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("tag \"" + R_TAGS + "test\" already exists");
+    tag(input.ref).create(input);
+  }
+
+  @Test
+  public void createTagNotAllowed() throws Exception {
+    block(R_TAGS + "*", Permission.CREATE, REGISTERED_USERS);
+    TagInput input = new TagInput();
+    input.ref = "test";
+    exception.expect(AuthException.class);
+    exception.expectMessage("not permitted: create");
+    tag(input.ref).create(input);
+  }
+
+  @Test
+  public void createAnnotatedTagNotAllowed() throws Exception {
+    block(R_TAGS + "*", Permission.CREATE_TAG, REGISTERED_USERS);
+    TagInput input = new TagInput();
+    input.ref = "test";
+    input.message = "annotation";
+    exception.expect(AuthException.class);
+    exception.expectMessage("Cannot create annotated tag \"" + R_TAGS + "test\"");
+    tag(input.ref).create(input);
+  }
+
+  @Test
+  public void createSignedTagNotSupported() throws Exception {
+    TagInput input = new TagInput();
+    input.ref = "test";
+    input.message = SIGNED_ANNOTATION;
+    exception.expect(MethodNotAllowedException.class);
+    exception.expectMessage("Cannot create signed tag \"" + R_TAGS + "test\"");
+    tag(input.ref).create(input);
+  }
+
+  @Test
+  public void mismatchedInput() throws Exception {
+    TagInput input = new TagInput();
+    input.ref = "test";
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("ref must match URL");
+    tag("TEST").create(input);
+  }
+
+  @Test
+  public void invalidTagName() throws Exception {
+    grantTagPermissions();
+
+    TagInput input = new TagInput();
+    input.ref = "refs/heads/test";
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("invalid tag name \"" + input.ref + "\"");
+    tag(input.ref).create(input);
+  }
+
+  @Test
+  public void invalidTagNameOnlySlashes() throws Exception {
+    grantTagPermissions();
+
+    TagInput input = new TagInput();
+    input.ref = "//";
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("invalid tag name \"refs/tags/\"");
+    tag(input.ref).create(input);
+  }
+
+  @Test
+  public void invalidBaseRevision() throws Exception {
+    grantTagPermissions();
+
+    TagInput input = new TagInput();
+    input.ref = "test";
+    input.revision = "abcdefg";
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("Invalid base revision");
+    tag(input.ref).create(input);
+  }
+
+  private void assertTagList(FluentIterable<String> expected, List<TagInfo> actual)
+      throws Exception {
+    assertThat(actual).hasSize(expected.size());
+    for (int i = 0; i < expected.size(); i++) {
+      TagInfo info = actual.get(i);
+      assertThat(info.created).isNotNull();
+      assertThat(info.ref).isEqualTo(R_TAGS + expected.get(i));
+    }
+  }
+
+  private void createTags() throws Exception {
+    grantTagPermissions();
+
+    String revision = pushTo("refs/heads/master").getCommit().name();
+    TagInput input = new TagInput();
+    input.revision = revision;
+
+    for (String tagname : testTags) {
+      TagInfo result = tag(tagname).create(input).get();
+      assertThat(result.revision).isEqualTo(input.revision);
+      assertThat(result.ref).isEqualTo(R_TAGS + tagname);
+    }
+  }
+
+  private ListRefsRequest<TagInfo> getTags() throws Exception {
+    return gApi.projects().name(project.get()).tags();
+  }
+
+  private TagApi tag(String tagname) throws Exception {
+    return gApi.projects().name(project.get()).tag(tagname);
+  }
+
+  private Timestamp timestamp(PushOneCommit.Result r) {
+    return new Timestamp(r.getCommit().getCommitterIdent().getWhen().getTime());
+  }
+
+  private void assertBadRequest(ListRefsRequest<TagInfo> req) throws Exception {
+    try {
+      req.get();
+      fail("Expected BadRequestException");
+    } catch (BadRequestException e) {
+      // Expected
+    }
+  }
+
+  private void grantTagPermissions() throws Exception {
+    grant(project, R_TAGS + "*", Permission.CREATE);
+    grant(project, R_TAGS + "", Permission.DELETE);
+    grant(project, R_TAGS + "*", Permission.CREATE_TAG);
+    grant(project, R_TAGS + "*", Permission.CREATE_SIGNED_TAG);
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/rest/revision/BUILD b/javatests/com/google/gerrit/acceptance/rest/revision/BUILD
new file mode 100644
index 0000000..10839f2
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/revision/BUILD
@@ -0,0 +1,7 @@
+load("//javatests/com/google/gerrit/acceptance:tests.bzl", "acceptance_tests")
+
+acceptance_tests(
+    srcs = glob(["*IT.java"]),
+    group = "rest_revision",
+    labels = ["rest"],
+)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/revision/RevisionIT.java b/javatests/com/google/gerrit/acceptance/rest/revision/RevisionIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/revision/RevisionIT.java
rename to javatests/com/google/gerrit/acceptance/rest/revision/RevisionIT.java
diff --git a/javatests/com/google/gerrit/acceptance/server/change/BUILD b/javatests/com/google/gerrit/acceptance/server/change/BUILD
new file mode 100644
index 0000000..4d1634d
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/server/change/BUILD
@@ -0,0 +1,8 @@
+load("//javatests/com/google/gerrit/acceptance:tests.bzl", "acceptance_tests")
+
+acceptance_tests(
+    srcs = glob(["*IT.java"]),
+    group = "server_change",
+    labels = ["server"],
+    deps = ["//java/com/google/gerrit/server/util/time"],
+)
diff --git a/javatests/com/google/gerrit/acceptance/server/change/CommentsIT.java b/javatests/com/google/gerrit/acceptance/server/change/CommentsIT.java
new file mode 100644
index 0000000..e9d2611
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/server/change/CommentsIT.java
@@ -0,0 +1,1190 @@
+// Copyright (C) 2014 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.google.gerrit.acceptance.server.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth8.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static com.google.gerrit.acceptance.PushOneCommit.FILE_NAME;
+import static com.google.gerrit.acceptance.PushOneCommit.SUBJECT;
+import static java.util.stream.Collectors.groupingBy;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.base.Function;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.AcceptanceTestRequestScope;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.extensions.api.changes.DeleteCommentInput;
+import com.google.gerrit.extensions.api.changes.DraftInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput.CommentInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput.DraftHandling;
+import com.google.gerrit.extensions.client.Comment;
+import com.google.gerrit.extensions.client.Side;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.notedb.ChangeNoteUtil;
+import com.google.gerrit.server.notedb.DeleteCommentRewriter;
+import com.google.gerrit.server.restapi.change.ChangesCollection;
+import com.google.gerrit.server.restapi.change.PostReview;
+import com.google.gerrit.testing.FakeEmailSender;
+import com.google.gerrit.testing.FakeEmailSender.Message;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.function.Supplier;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.notes.NoteMap;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.junit.Before;
+import org.junit.Test;
+
+@NoHttpd
+public class CommentsIT extends AbstractDaemonTest {
+
+  @Inject private Provider<ChangesCollection> changes;
+
+  @Inject private Provider<PostReview> postReview;
+
+  @Inject private FakeEmailSender email;
+
+  @Inject private ChangeNoteUtil noteUtil;
+
+  private final Integer[] lines = {0, 1};
+
+  @Before
+  public void setUp() {
+    setApiUser(user);
+  }
+
+  @Test
+  public void getNonExistingComment() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String changeId = r.getChangeId();
+    String revId = r.getCommit().getName();
+    exception.expect(ResourceNotFoundException.class);
+    getPublishedComment(changeId, revId, "non-existing");
+  }
+
+  @Test
+  public void createDraft() throws Exception {
+    for (Integer line : lines) {
+      PushOneCommit.Result r = createChange();
+      String changeId = r.getChangeId();
+      String revId = r.getCommit().getName();
+      String path = "file1";
+      DraftInput comment = newDraft(path, Side.REVISION, line, "comment 1");
+      addDraft(changeId, revId, comment);
+      Map<String, List<CommentInfo>> result = getDraftComments(changeId, revId);
+      assertThat(result).hasSize(1);
+      CommentInfo actual = Iterables.getOnlyElement(result.get(comment.path));
+      assertThat(comment).isEqualTo(infoToDraft(path).apply(actual));
+    }
+  }
+
+  @Test
+  public void createDraftOnMergeCommitChange() throws Exception {
+    for (Integer line : lines) {
+      PushOneCommit.Result r = createMergeCommitChange("refs/for/master");
+      String changeId = r.getChangeId();
+      String revId = r.getCommit().getName();
+      String path = "file1";
+      DraftInput c1 = newDraft(path, Side.REVISION, line, "ps-1");
+      DraftInput c2 = newDraft(path, Side.PARENT, line, "auto-merge of ps-1");
+      DraftInput c3 = newDraftOnParent(path, 1, line, "parent-1 of ps-1");
+      DraftInput c4 = newDraftOnParent(path, 2, line, "parent-2 of ps-1");
+      addDraft(changeId, revId, c1);
+      addDraft(changeId, revId, c2);
+      addDraft(changeId, revId, c3);
+      addDraft(changeId, revId, c4);
+      Map<String, List<CommentInfo>> result = getDraftComments(changeId, revId);
+      assertThat(result).hasSize(1);
+      assertThat(Lists.transform(result.get(path), infoToDraft(path)))
+          .containsExactly(c1, c2, c3, c4);
+    }
+  }
+
+  @Test
+  public void postComment() throws Exception {
+    for (Integer line : lines) {
+      String file = "file";
+      String contents = "contents " + line;
+      PushOneCommit push =
+          pushFactory.create(db, admin.getIdent(), testRepo, "first subject", file, contents);
+      PushOneCommit.Result r = push.to("refs/for/master");
+      String changeId = r.getChangeId();
+      String revId = r.getCommit().getName();
+      ReviewInput input = new ReviewInput();
+      CommentInput comment = newComment(file, Side.REVISION, line, "comment 1", false);
+      input.comments = new HashMap<>();
+      input.comments.put(comment.path, Lists.newArrayList(comment));
+      revision(r).review(input);
+      Map<String, List<CommentInfo>> result = getPublishedComments(changeId, revId);
+      assertThat(result).isNotEmpty();
+      CommentInfo actual = Iterables.getOnlyElement(result.get(comment.path));
+      assertThat(comment).isEqualTo(infoToInput(file).apply(actual));
+      assertThat(comment)
+          .isEqualTo(infoToInput(file).apply(getPublishedComment(changeId, revId, actual.id)));
+    }
+  }
+
+  @Test
+  public void postCommentWithReply() throws Exception {
+    for (Integer line : lines) {
+      String file = "file";
+      String contents = "contents " + line;
+      PushOneCommit push =
+          pushFactory.create(db, admin.getIdent(), testRepo, "first subject", file, contents);
+      PushOneCommit.Result r = push.to("refs/for/master");
+      String changeId = r.getChangeId();
+      String revId = r.getCommit().getName();
+      ReviewInput input = new ReviewInput();
+      CommentInput comment = newComment(file, Side.REVISION, line, "comment 1", false);
+      input.comments = new HashMap<>();
+      input.comments.put(comment.path, Lists.newArrayList(comment));
+      revision(r).review(input);
+      Map<String, List<CommentInfo>> result = getPublishedComments(changeId, revId);
+      CommentInfo actual = Iterables.getOnlyElement(result.get(comment.path));
+
+      input = new ReviewInput();
+      comment = newComment(file, Side.REVISION, line, "comment 1 reply", false);
+      comment.inReplyTo = actual.id;
+      input.comments = new HashMap<>();
+      input.comments.put(comment.path, Lists.newArrayList(comment));
+      revision(r).review(input);
+      result = getPublishedComments(changeId, revId);
+      actual = result.get(comment.path).get(1);
+      assertThat(comment).isEqualTo(infoToInput(file).apply(actual));
+      assertThat(comment)
+          .isEqualTo(infoToInput(file).apply(getPublishedComment(changeId, revId, actual.id)));
+    }
+  }
+
+  @Test
+  public void postCommentWithUnresolved() throws Exception {
+    for (Integer line : lines) {
+      String file = "file";
+      String contents = "contents " + line;
+      PushOneCommit push =
+          pushFactory.create(db, admin.getIdent(), testRepo, "first subject", file, contents);
+      PushOneCommit.Result r = push.to("refs/for/master");
+      String changeId = r.getChangeId();
+      String revId = r.getCommit().getName();
+      ReviewInput input = new ReviewInput();
+      CommentInput comment = newComment(file, Side.REVISION, line, "comment 1", true);
+      input.comments = new HashMap<>();
+      input.comments.put(comment.path, Lists.newArrayList(comment));
+      revision(r).review(input);
+      Map<String, List<CommentInfo>> result = getPublishedComments(changeId, revId);
+      assertThat(result).isNotEmpty();
+      CommentInfo actual = Iterables.getOnlyElement(result.get(comment.path));
+      assertThat(comment).isEqualTo(infoToInput(file).apply(actual));
+      assertThat(comment)
+          .isEqualTo(infoToInput(file).apply(getPublishedComment(changeId, revId, actual.id)));
+    }
+  }
+
+  @Test
+  public void postCommentOnMergeCommitChange() throws Exception {
+    for (Integer line : lines) {
+      String file = "foo";
+      PushOneCommit.Result r = createMergeCommitChange("refs/for/master", file);
+      String changeId = r.getChangeId();
+      String revId = r.getCommit().getName();
+      ReviewInput input = new ReviewInput();
+      CommentInput c1 = newComment(file, Side.REVISION, line, "ps-1", false);
+      CommentInput c2 = newComment(file, Side.PARENT, line, "auto-merge of ps-1", false);
+      CommentInput c3 = newCommentOnParent(file, 1, line, "parent-1 of ps-1");
+      CommentInput c4 = newCommentOnParent(file, 2, line, "parent-2 of ps-1");
+      input.comments = new HashMap<>();
+      input.comments.put(file, ImmutableList.of(c1, c2, c3, c4));
+      revision(r).review(input);
+      Map<String, List<CommentInfo>> result = getPublishedComments(changeId, revId);
+      assertThat(result).isNotEmpty();
+      assertThat(Lists.transform(result.get(file), infoToInput(file)))
+          .containsExactly(c1, c2, c3, c4);
+    }
+
+    // for the commit message comments on the auto-merge are not possible
+    for (Integer line : lines) {
+      String file = Patch.COMMIT_MSG;
+      PushOneCommit.Result r = createMergeCommitChange("refs/for/master");
+      String changeId = r.getChangeId();
+      String revId = r.getCommit().getName();
+      ReviewInput input = new ReviewInput();
+      CommentInput c1 = newComment(file, Side.REVISION, line, "ps-1", false);
+      CommentInput c2 = newCommentOnParent(file, 1, line, "parent-1 of ps-1");
+      CommentInput c3 = newCommentOnParent(file, 2, line, "parent-2 of ps-1");
+      input.comments = new HashMap<>();
+      input.comments.put(file, ImmutableList.of(c1, c2, c3));
+      revision(r).review(input);
+      Map<String, List<CommentInfo>> result = getPublishedComments(changeId, revId);
+      assertThat(result).isNotEmpty();
+      assertThat(Lists.transform(result.get(file), infoToInput(file))).containsExactly(c1, c2, c3);
+    }
+  }
+
+  @Test
+  public void postCommentOnCommitMessageOnAutoMerge() throws Exception {
+    PushOneCommit.Result r = createMergeCommitChange("refs/for/master");
+    ReviewInput input = new ReviewInput();
+    CommentInput c = newComment(Patch.COMMIT_MSG, Side.PARENT, 0, "comment on auto-merge", false);
+    input.comments = new HashMap<>();
+    input.comments.put(Patch.COMMIT_MSG, ImmutableList.of(c));
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("cannot comment on " + Patch.COMMIT_MSG + " on auto-merge");
+    revision(r).review(input);
+  }
+
+  @Test
+  public void listComments() throws Exception {
+    String file = "file";
+    PushOneCommit push =
+        pushFactory.create(db, admin.getIdent(), testRepo, "first subject", file, "contents");
+    PushOneCommit.Result r = push.to("refs/for/master");
+    String changeId = r.getChangeId();
+    String revId = r.getCommit().getName();
+    assertThat(getPublishedComments(changeId, revId)).isEmpty();
+
+    List<CommentInput> expectedComments = new ArrayList<>();
+    for (Integer line : lines) {
+      ReviewInput input = new ReviewInput();
+      CommentInput comment = newComment(file, Side.REVISION, line, "comment " + line, false);
+      expectedComments.add(comment);
+      input.comments = new HashMap<>();
+      input.comments.put(comment.path, Lists.newArrayList(comment));
+      revision(r).review(input);
+    }
+
+    Map<String, List<CommentInfo>> result = getPublishedComments(changeId, revId);
+    assertThat(result).isNotEmpty();
+    List<CommentInfo> actualComments = result.get(file);
+    assertThat(Lists.transform(actualComments, infoToInput(file)))
+        .containsExactlyElementsIn(expectedComments);
+  }
+
+  @Test
+  public void putDraft() throws Exception {
+    for (Integer line : lines) {
+      PushOneCommit.Result r = createChange();
+      Timestamp origLastUpdated = r.getChange().change().getLastUpdatedOn();
+      String changeId = r.getChangeId();
+      String revId = r.getCommit().getName();
+      String path = "file1";
+      DraftInput comment = newDraft(path, Side.REVISION, line, "comment 1");
+      addDraft(changeId, revId, comment);
+      Map<String, List<CommentInfo>> result = getDraftComments(changeId, revId);
+      CommentInfo actual = Iterables.getOnlyElement(result.get(comment.path));
+      assertThat(comment).isEqualTo(infoToDraft(path).apply(actual));
+      String uuid = actual.id;
+      comment.message = "updated comment 1";
+      updateDraft(changeId, revId, comment, uuid);
+      result = getDraftComments(changeId, revId);
+      actual = Iterables.getOnlyElement(result.get(comment.path));
+      assertThat(comment).isEqualTo(infoToDraft(path).apply(actual));
+
+      // Posting a draft comment doesn't cause lastUpdatedOn to change.
+      assertThat(r.getChange().change().getLastUpdatedOn()).isEqualTo(origLastUpdated);
+    }
+  }
+
+  @Test
+  public void listDrafts() throws Exception {
+    String file = "file";
+    PushOneCommit.Result r = createChange();
+    String changeId = r.getChangeId();
+    String revId = r.getCommit().getName();
+    assertThat(getDraftComments(changeId, revId)).isEmpty();
+
+    List<DraftInput> expectedDrafts = new ArrayList<>();
+    for (Integer line : lines) {
+      DraftInput comment = newDraft(file, Side.REVISION, line, "comment " + line);
+      expectedDrafts.add(comment);
+      addDraft(changeId, revId, comment);
+    }
+
+    Map<String, List<CommentInfo>> result = getDraftComments(changeId, revId);
+    assertThat(result).isNotEmpty();
+    List<CommentInfo> actualComments = result.get(file);
+    assertThat(Lists.transform(actualComments, infoToDraft(file)))
+        .containsExactlyElementsIn(expectedDrafts);
+  }
+
+  @Test
+  public void getDraft() throws Exception {
+    for (Integer line : lines) {
+      PushOneCommit.Result r = createChange();
+      String changeId = r.getChangeId();
+      String revId = r.getCommit().getName();
+      String path = "file1";
+      DraftInput comment = newDraft(path, Side.REVISION, line, "comment 1");
+      CommentInfo returned = addDraft(changeId, revId, comment);
+      CommentInfo actual = getDraftComment(changeId, revId, returned.id);
+      assertThat(comment).isEqualTo(infoToDraft(path).apply(actual));
+    }
+  }
+
+  @Test
+  public void deleteDraft() throws Exception {
+    for (Integer line : lines) {
+      PushOneCommit.Result r = createChange();
+      Timestamp origLastUpdated = r.getChange().change().getLastUpdatedOn();
+      String changeId = r.getChangeId();
+      String revId = r.getCommit().getName();
+      DraftInput draft = newDraft("file1", Side.REVISION, line, "comment 1");
+      CommentInfo returned = addDraft(changeId, revId, draft);
+      deleteDraft(changeId, revId, returned.id);
+      Map<String, List<CommentInfo>> drafts = getDraftComments(changeId, revId);
+      assertThat(drafts).isEmpty();
+
+      // Deleting a draft comment doesn't cause lastUpdatedOn to change.
+      assertThat(r.getChange().change().getLastUpdatedOn()).isEqualTo(origLastUpdated);
+    }
+  }
+
+  @Test
+  public void insertCommentsWithHistoricTimestamp() throws Exception {
+    Timestamp timestamp = new Timestamp(0);
+    for (Integer line : lines) {
+      String file = "file";
+      String contents = "contents " + line;
+      PushOneCommit push =
+          pushFactory.create(db, admin.getIdent(), testRepo, "first subject", file, contents);
+      PushOneCommit.Result r = push.to("refs/for/master");
+      String changeId = r.getChangeId();
+      String revId = r.getCommit().getName();
+      Timestamp origLastUpdated = r.getChange().change().getLastUpdatedOn();
+
+      ReviewInput input = new ReviewInput();
+      CommentInput comment = newComment(file, Side.REVISION, line, "comment 1", false);
+      comment.updated = timestamp;
+      input.comments = new HashMap<>();
+      input.comments.put(comment.path, Lists.newArrayList(comment));
+      ChangeResource changeRsrc =
+          changes.get().parse(TopLevelResource.INSTANCE, IdString.fromDecoded(changeId));
+      RevisionResource revRsrc = revisions.parse(changeRsrc, IdString.fromDecoded(revId));
+      postReview.get().apply(batchUpdateFactory, revRsrc, input, timestamp);
+      Map<String, List<CommentInfo>> result = getPublishedComments(changeId, revId);
+      assertThat(result).isNotEmpty();
+      CommentInfo actual = Iterables.getOnlyElement(result.get(comment.path));
+      CommentInput ci = infoToInput(file).apply(actual);
+      ci.updated = comment.updated;
+      assertThat(comment).isEqualTo(ci);
+      assertThat(actual.updated).isEqualTo(gApi.changes().id(r.getChangeId()).info().created);
+
+      // Updating historic comments doesn't cause lastUpdatedOn to regress.
+      assertThat(r.getChange().change().getLastUpdatedOn()).isEqualTo(origLastUpdated);
+    }
+  }
+
+  @Test
+  public void addDuplicateComments() throws Exception {
+    PushOneCommit.Result r1 = createChange();
+    String changeId = r1.getChangeId();
+    String revId = r1.getCommit().getName();
+    addComment(r1, "nit: trailing whitespace");
+    addComment(r1, "nit: trailing whitespace");
+    Map<String, List<CommentInfo>> result = getPublishedComments(changeId, revId);
+    assertThat(result.get(FILE_NAME)).hasSize(2);
+    addComment(r1, "nit: trailing whitespace", true, false, null);
+    result = getPublishedComments(changeId, revId);
+    assertThat(result.get(FILE_NAME)).hasSize(2);
+
+    PushOneCommit.Result r2 =
+        pushFactory
+            .create(db, admin.getIdent(), testRepo, SUBJECT, FILE_NAME, "content")
+            .to("refs/for/master");
+    changeId = r2.getChangeId();
+    revId = r2.getCommit().getName();
+    addComment(r2, "nit: trailing whitespace", true, false, null);
+    result = getPublishedComments(changeId, revId);
+    assertThat(result.get(FILE_NAME)).hasSize(1);
+  }
+
+  @Test
+  public void listChangeDrafts() throws Exception {
+    PushOneCommit.Result r1 = createChange();
+
+    PushOneCommit.Result r2 =
+        pushFactory
+            .create(
+                db, admin.getIdent(), testRepo, SUBJECT, FILE_NAME, "new content", r1.getChangeId())
+            .to("refs/for/master");
+
+    setApiUser(admin);
+    addDraft(
+        r1.getChangeId(),
+        r1.getCommit().getName(),
+        newDraft(FILE_NAME, Side.REVISION, 1, "nit: trailing whitespace"));
+    addDraft(
+        r2.getChangeId(),
+        r2.getCommit().getName(),
+        newDraft(FILE_NAME, Side.REVISION, 1, "typo: content"));
+
+    setApiUser(user);
+    addDraft(
+        r2.getChangeId(),
+        r2.getCommit().getName(),
+        newDraft(FILE_NAME, Side.REVISION, 1, "+1, please fix"));
+
+    setApiUser(admin);
+    Map<String, List<CommentInfo>> actual = gApi.changes().id(r1.getChangeId()).drafts();
+    assertThat(actual.keySet()).containsExactly(FILE_NAME);
+    List<CommentInfo> comments = actual.get(FILE_NAME);
+    assertThat(comments).hasSize(2);
+
+    CommentInfo c1 = comments.get(0);
+    assertThat(c1.author).isNull();
+    assertThat(c1.patchSet).isEqualTo(1);
+    assertThat(c1.message).isEqualTo("nit: trailing whitespace");
+    assertThat(c1.side).isNull();
+    assertThat(c1.line).isEqualTo(1);
+
+    CommentInfo c2 = comments.get(1);
+    assertThat(c2.author).isNull();
+    assertThat(c2.patchSet).isEqualTo(2);
+    assertThat(c2.message).isEqualTo("typo: content");
+    assertThat(c2.side).isNull();
+    assertThat(c2.line).isEqualTo(1);
+  }
+
+  @Test
+  public void listChangeComments() throws Exception {
+    PushOneCommit.Result r1 = createChange();
+
+    PushOneCommit.Result r2 =
+        pushFactory
+            .create(
+                db, admin.getIdent(), testRepo, SUBJECT, FILE_NAME, "new cntent", r1.getChangeId())
+            .to("refs/for/master");
+
+    addComment(r1, "nit: trailing whitespace");
+    addComment(r2, "typo: content");
+
+    Map<String, List<CommentInfo>> actual = gApi.changes().id(r2.getChangeId()).comments();
+    assertThat(actual.keySet()).containsExactly(FILE_NAME);
+
+    List<CommentInfo> comments = actual.get(FILE_NAME);
+    assertThat(comments).hasSize(2);
+
+    CommentInfo c1 = comments.get(0);
+    assertThat(c1.author._accountId).isEqualTo(user.getId().get());
+    assertThat(c1.patchSet).isEqualTo(1);
+    assertThat(c1.message).isEqualTo("nit: trailing whitespace");
+    assertThat(c1.side).isNull();
+    assertThat(c1.line).isEqualTo(1);
+
+    CommentInfo c2 = comments.get(1);
+    assertThat(c2.author._accountId).isEqualTo(user.getId().get());
+    assertThat(c2.patchSet).isEqualTo(2);
+    assertThat(c2.message).isEqualTo("typo: content");
+    assertThat(c2.side).isNull();
+    assertThat(c2.line).isEqualTo(1);
+  }
+
+  @Test
+  public void listChangeWithDrafts() throws Exception {
+    for (Integer line : lines) {
+      PushOneCommit.Result r = createChange();
+      String changeId = r.getChangeId();
+      String revId = r.getCommit().getName();
+      DraftInput comment = newDraft("file1", Side.REVISION, line, "comment 1");
+      addDraft(changeId, revId, comment);
+      assertThat(gApi.changes().query("change:" + changeId + " has:draft").get()).hasSize(1);
+    }
+  }
+
+  @Test
+  public void publishCommentsAllRevisions() throws Exception {
+    PushOneCommit.Result r1 =
+        pushFactory
+            .create(db, admin.getIdent(), testRepo, SUBJECT, FILE_NAME, "old boring content\n")
+            .to("refs/for/master");
+
+    PushOneCommit.Result r2 =
+        pushFactory
+            .create(
+                db,
+                admin.getIdent(),
+                testRepo,
+                SUBJECT,
+                FILE_NAME,
+                "new interesting\ncntent\n",
+                r1.getChangeId())
+            .to("refs/for/master");
+
+    addDraft(
+        r1.getChangeId(),
+        r1.getCommit().getName(),
+        newDraft(FILE_NAME, Side.REVISION, createLineRange(1, 4, 10), "Is it that bad?"));
+    addDraft(
+        r1.getChangeId(),
+        r1.getCommit().getName(),
+        newDraft(FILE_NAME, Side.PARENT, 2, "what happened to this?"));
+    addDraft(
+        r2.getChangeId(),
+        r2.getCommit().getName(),
+        newDraft(FILE_NAME, Side.REVISION, createLineRange(1, 4, 15), "better now"));
+    addDraft(
+        r2.getChangeId(),
+        r2.getCommit().getName(),
+        newDraft(FILE_NAME, Side.REVISION, 2, "typo: content"));
+    addDraft(
+        r2.getChangeId(),
+        r2.getCommit().getName(),
+        newDraft(FILE_NAME, Side.PARENT, 1, "comment 1 on base"));
+    addDraft(
+        r2.getChangeId(),
+        r2.getCommit().getName(),
+        newDraft(FILE_NAME, Side.PARENT, 2, "comment 2 on base"));
+
+    PushOneCommit.Result other = createChange();
+    // Drafts on other changes aren't returned.
+    addDraft(
+        other.getChangeId(),
+        other.getCommit().getName(),
+        newDraft(FILE_NAME, Side.REVISION, 1, "unrelated comment"));
+
+    setApiUser(admin);
+    // Drafts by other users aren't returned.
+    addDraft(
+        r2.getChangeId(), r2.getCommit().getName(), newDraft(FILE_NAME, Side.REVISION, 2, "oops"));
+    setApiUser(user);
+
+    ReviewInput reviewInput = new ReviewInput();
+    reviewInput.drafts = DraftHandling.PUBLISH_ALL_REVISIONS;
+    reviewInput.message = "comments";
+    gApi.changes().id(r2.getChangeId()).current().review(reviewInput);
+
+    assertThat(gApi.changes().id(r1.getChangeId()).revision(r1.getCommit().name()).drafts())
+        .isEmpty();
+    Map<String, List<CommentInfo>> ps1Map =
+        gApi.changes().id(r1.getChangeId()).revision(r1.getCommit().name()).comments();
+    assertThat(ps1Map.keySet()).containsExactly(FILE_NAME);
+    List<CommentInfo> ps1List = ps1Map.get(FILE_NAME);
+    assertThat(ps1List).hasSize(2);
+    assertThat(ps1List.get(0).message).isEqualTo("what happened to this?");
+    assertThat(ps1List.get(0).side).isEqualTo(Side.PARENT);
+    assertThat(ps1List.get(1).message).isEqualTo("Is it that bad?");
+    assertThat(ps1List.get(1).side).isNull();
+
+    assertThat(gApi.changes().id(r2.getChangeId()).revision(r2.getCommit().name()).drafts())
+        .isEmpty();
+    Map<String, List<CommentInfo>> ps2Map =
+        gApi.changes().id(r2.getChangeId()).revision(r2.getCommit().name()).comments();
+    assertThat(ps2Map.keySet()).containsExactly(FILE_NAME);
+    List<CommentInfo> ps2List = ps2Map.get(FILE_NAME);
+    assertThat(ps2List).hasSize(4);
+    assertThat(ps2List.get(0).message).isEqualTo("comment 1 on base");
+    assertThat(ps2List.get(1).message).isEqualTo("comment 2 on base");
+    assertThat(ps2List.get(2).message).isEqualTo("better now");
+    assertThat(ps2List.get(3).message).isEqualTo("typo: content");
+
+    List<Message> messages = email.getMessages(r2.getChangeId(), "comment");
+    assertThat(messages).hasSize(1);
+    String url = canonicalWebUrl.get();
+    int c = r1.getChange().getId().get();
+    assertThat(extractComments(messages.get(0).body()))
+        .isEqualTo(
+            "Patch Set 2:\n"
+                + "\n"
+                + "(6 comments)\n"
+                + "\n"
+                + "comments\n"
+                + "\n"
+                + url
+                + "#/c/"
+                + c
+                + "/1/a.txt \n"
+                + "File a.txt:\n"
+                + "\n"
+                + url
+                + "#/c/"
+                + c
+                + "/1/a.txt@a2 \n"
+                + "PS1, Line 2: \n"
+                + "what happened to this?\n"
+                + "\n"
+                + "\n"
+                + url
+                + "#/c/"
+                + c
+                + "/1/a.txt@1 \n"
+                + "PS1, Line 1: boring\n"
+                + "Is it that bad?\n"
+                + "\n"
+                + "\n"
+                + url
+                + "#/c/"
+                + c
+                + "/2/a.txt \n"
+                + "File a.txt:\n"
+                + "\n"
+                + url
+                + "#/c/"
+                + c
+                + "/2/a.txt@a1 \n"
+                + "PS2, Line 1: \n"
+                + "comment 1 on base\n"
+                + "\n"
+                + "\n"
+                + url
+                + "#/c/"
+                + c
+                + "/2/a.txt@a2 \n"
+                + "PS2, Line 2: \n"
+                + "comment 2 on base\n"
+                + "\n"
+                + "\n"
+                + url
+                + "#/c/"
+                + c
+                + "/2/a.txt@1 \n"
+                + "PS2, Line 1: interesting\n"
+                + "better now\n"
+                + "\n"
+                + "\n"
+                + url
+                + "#/c/"
+                + c
+                + "/2/a.txt@2 \n"
+                + "PS2, Line 2: nten\n"
+                + "typo: content\n"
+                + "\n"
+                + "\n");
+  }
+
+  @Test
+  public void commentTags() throws Exception {
+    PushOneCommit.Result r = createChange();
+
+    CommentInput pub = new CommentInput();
+    pub.line = 1;
+    pub.message = "published comment";
+    pub.path = FILE_NAME;
+    ReviewInput rin = newInput(pub);
+    rin.tag = "tag1";
+    gApi.changes().id(r.getChangeId()).current().review(rin);
+
+    List<CommentInfo> comments = gApi.changes().id(r.getChangeId()).current().commentsAsList();
+    assertThat(comments).hasSize(1);
+    assertThat(comments.get(0).tag).isEqualTo("tag1");
+
+    DraftInput draft = new DraftInput();
+    draft.line = 2;
+    draft.message = "draft comment";
+    draft.path = FILE_NAME;
+    draft.tag = "tag2";
+    addDraft(r.getChangeId(), r.getCommit().name(), draft);
+
+    List<CommentInfo> drafts = gApi.changes().id(r.getChangeId()).current().draftsAsList();
+    assertThat(drafts).hasSize(1);
+    assertThat(drafts.get(0).tag).isEqualTo("tag2");
+  }
+
+  @Test
+  public void queryChangesWithUnresolvedCommentCount() throws Exception {
+    // PS1 has three comments in three different threads, PS2 has one comment in one thread.
+    PushOneCommit.Result result = createChange("change 1", FILE_NAME, "content 1");
+    String changeId1 = result.getChangeId();
+    addComment(result, "comment 1", false, true, null);
+    addComment(result, "comment 2", false, null, null);
+    addComment(result, "comment 3", false, false, null);
+    PushOneCommit.Result result2 = amendChange(changeId1);
+    addComment(result2, "comment4", false, true, null);
+
+    // Change2 has two comments in one thread, the first is unresolved and the second is resolved.
+    result = createChange("change 2", FILE_NAME, "content 2");
+    String changeId2 = result.getChangeId();
+    addComment(result, "comment 1", false, true, null);
+    Map<String, List<CommentInfo>> comments =
+        getPublishedComments(changeId2, result.getCommit().name());
+    assertThat(comments).hasSize(1);
+    assertThat(comments.get(FILE_NAME)).hasSize(1);
+    addComment(result, "comment 2", false, false, comments.get(FILE_NAME).get(0).id);
+
+    // Change3 has two comments in one thread, the first is resolved, the second is unresolved.
+    result = createChange("change 3", FILE_NAME, "content 3");
+    String changeId3 = result.getChangeId();
+    addComment(result, "comment 1", false, false, null);
+    comments = getPublishedComments(result.getChangeId(), result.getCommit().name());
+    assertThat(comments).hasSize(1);
+    assertThat(comments.get(FILE_NAME)).hasSize(1);
+    addComment(result, "comment 2", false, true, comments.get(FILE_NAME).get(0).id);
+
+    AcceptanceTestRequestScope.Context ctx = disableDb();
+    try {
+      ChangeInfo changeInfo1 = Iterables.getOnlyElement(query(changeId1));
+      ChangeInfo changeInfo2 = Iterables.getOnlyElement(query(changeId2));
+      ChangeInfo changeInfo3 = Iterables.getOnlyElement(query(changeId3));
+      assertThat(changeInfo1.unresolvedCommentCount).isEqualTo(2);
+      assertThat(changeInfo2.unresolvedCommentCount).isEqualTo(0);
+      assertThat(changeInfo3.unresolvedCommentCount).isEqualTo(1);
+    } finally {
+      enableDb(ctx);
+    }
+  }
+
+  @Test
+  public void deleteCommentCannotBeAppliedByUser() throws Exception {
+    PushOneCommit.Result result = createChange();
+    CommentInput targetComment = addComment(result.getChangeId(), "My password: abc123");
+
+    Map<String, List<CommentInfo>> commentsMap =
+        getPublishedComments(result.getChangeId(), result.getCommit().name());
+
+    assertThat(commentsMap).hasSize(1);
+    assertThat(commentsMap.get(FILE_NAME)).hasSize(1);
+
+    String uuid = commentsMap.get(targetComment.path).get(0).id;
+    DeleteCommentInput input = new DeleteCommentInput("contains confidential information");
+
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    gApi.changes().id(result.getChangeId()).current().comment(uuid).delete(input);
+  }
+
+  @Test
+  public void deleteCommentByRewritingCommitHistory() throws Exception {
+    // Creates the following commit history on the meta branch of the test change. Then tries to
+    // delete the comments one by one, which will rewrite most of the commits on the 'meta' branch.
+    // Commits will be rewritten N times for N added comments. After each deletion, the meta branch
+    // should keep its previous state except that the target comment's message should be updated.
+
+    // 1st commit: Create PS1.
+    PushOneCommit.Result result1 = createChange(SUBJECT, "a.txt", "a");
+    Change.Id id = result1.getChange().getId();
+    String changeId = result1.getChangeId();
+    String ps1 = result1.getCommit().name();
+
+    // 2nd commit: Add (c1) to PS1.
+    CommentInput c1 = newComment("a.txt", "comment 1");
+    addComments(changeId, ps1, c1);
+
+    // 3rd commit: Add (c2, c3) to PS1.
+    CommentInput c2 = newComment("a.txt", "comment 2");
+    CommentInput c3 = newComment("a.txt", "comment 3");
+    addComments(changeId, ps1, c2, c3);
+
+    // 4th commit: Add (c4) to PS1.
+    CommentInput c4 = newComment("a.txt", "comment 4");
+    addComments(changeId, ps1, c4);
+
+    // 5th commit: Create PS2.
+    PushOneCommit.Result result2 = amendChange(changeId, "refs/for/master", "b.txt", "b");
+    String ps2 = result2.getCommit().name();
+
+    // 6th commit: Add (c5) to PS1.
+    CommentInput c5 = newComment("a.txt", "comment 5");
+    addComments(changeId, ps1, c5);
+
+    // 7th commit: Add (c6) to PS2.
+    CommentInput c6 = newComment("b.txt", "comment 6");
+    addComments(changeId, ps2, c6);
+
+    // 8th commit: Create PS3.
+    PushOneCommit.Result result3 = amendChange(changeId);
+    String ps3 = result3.getCommit().name();
+
+    // 9th commit: Create PS4.
+    PushOneCommit.Result result4 = amendChange(changeId, "refs/for/master", "c.txt", "c");
+    String ps4 = result4.getCommit().name();
+
+    // 10th commit: Add (c7, c8) to PS4.
+    CommentInput c7 = newComment("c.txt", "comment 7");
+    CommentInput c8 = newComment("b.txt", "comment 8");
+    addComments(changeId, ps4, c7, c8);
+
+    // 11th commit: Add (c9) to PS2.
+    CommentInput c9 = newComment("b.txt", "comment 9");
+    addComments(changeId, ps2, c9);
+
+    List<CommentInfo> commentsBeforeDelete = getChangeSortedComments(id.get());
+    assertThat(commentsBeforeDelete).hasSize(9);
+    // PS1 has comments [c1, c2, c3, c4, c5].
+    assertThat(getRevisionComments(changeId, ps1)).hasSize(5);
+    // PS2 has comments [c6, c9].
+    assertThat(getRevisionComments(changeId, ps2)).hasSize(2);
+    // PS3 has no comment.
+    assertThat(getRevisionComments(changeId, ps3)).hasSize(0);
+    // PS4 has comments [c7, c8].
+    assertThat(getRevisionComments(changeId, ps4)).hasSize(2);
+
+    setApiUser(admin);
+    for (int i = 0; i < commentsBeforeDelete.size(); i++) {
+      List<RevCommit> commitsBeforeDelete = new ArrayList<>();
+      if (notesMigration.commitChangeWrites()) {
+        commitsBeforeDelete = getChangeMetaCommitsInReverseOrder(id);
+      }
+
+      CommentInfo comment = commentsBeforeDelete.get(i);
+      String uuid = comment.id;
+      int patchSet = comment.patchSet;
+      // 'oldComment' has some fields unset compared with 'comment'.
+      CommentInfo oldComment = gApi.changes().id(changeId).revision(patchSet).comment(uuid).get();
+
+      DeleteCommentInput input = new DeleteCommentInput("delete comment " + uuid);
+      CommentInfo updatedComment =
+          gApi.changes().id(changeId).revision(patchSet).comment(uuid).delete(input);
+
+      String expectedMsg =
+          String.format("Comment removed by: %s; Reason: %s", admin.fullName, input.reason);
+      assertThat(updatedComment.message).isEqualTo(expectedMsg);
+      oldComment.message = expectedMsg;
+      assertThat(updatedComment).isEqualTo(oldComment);
+
+      // Check the NoteDb state after the deletion.
+      if (notesMigration.commitChangeWrites()) {
+        assertMetaBranchCommitsAfterRewriting(commitsBeforeDelete, id, uuid, expectedMsg);
+      }
+
+      comment.message = expectedMsg;
+      commentsBeforeDelete.set(i, comment);
+      List<CommentInfo> commentsAfterDelete = getChangeSortedComments(id.get());
+      assertThat(commentsAfterDelete).isEqualTo(commentsBeforeDelete);
+    }
+
+    // Make sure that comments can still be added correctly.
+    CommentInput c10 = newComment("a.txt", "comment 10");
+    CommentInput c11 = newComment("b.txt", "comment 11");
+    CommentInput c12 = newComment("a.txt", "comment 12");
+    CommentInput c13 = newComment("c.txt", "comment 13");
+    addComments(changeId, ps1, c10);
+    addComments(changeId, ps2, c11);
+    addComments(changeId, ps3, c12);
+    addComments(changeId, ps4, c13);
+
+    assertThat(getChangeSortedComments(id.get())).hasSize(13);
+    assertThat(getRevisionComments(changeId, ps1)).hasSize(6);
+    assertThat(getRevisionComments(changeId, ps2)).hasSize(3);
+    assertThat(getRevisionComments(changeId, ps3)).hasSize(1);
+    assertThat(getRevisionComments(changeId, ps4)).hasSize(3);
+  }
+
+  @Test
+  public void deleteOneCommentMultipleTimes() throws Exception {
+    PushOneCommit.Result result = createChange();
+    Change.Id id = result.getChange().getId();
+    String changeId = result.getChangeId();
+    String ps1 = result.getCommit().name();
+
+    CommentInput c1 = newComment(FILE_NAME, "comment 1");
+    CommentInput c2 = newComment(FILE_NAME, "comment 2");
+    CommentInput c3 = newComment(FILE_NAME, "comment 3");
+    addComments(changeId, ps1, c1);
+    addComments(changeId, ps1, c2);
+    addComments(changeId, ps1, c3);
+
+    List<CommentInfo> commentsBeforeDelete = getChangeSortedComments(id.get());
+    assertThat(commentsBeforeDelete).hasSize(3);
+    Optional<CommentInfo> targetComment =
+        commentsBeforeDelete.stream().filter(c -> c.message.equals("comment 2")).findFirst();
+    assertThat(targetComment).isPresent();
+    String uuid = targetComment.get().id;
+    CommentInfo oldComment = gApi.changes().id(changeId).revision(ps1).comment(uuid).get();
+
+    List<RevCommit> commitsBeforeDelete = new ArrayList<>();
+    if (notesMigration.commitChangeWrites()) {
+      commitsBeforeDelete = getChangeMetaCommitsInReverseOrder(id);
+    }
+
+    setApiUser(admin);
+    for (int i = 0; i < 3; i++) {
+      DeleteCommentInput input = new DeleteCommentInput("delete comment 2, iteration: " + i);
+      gApi.changes().id(changeId).revision(ps1).comment(uuid).delete(input);
+    }
+
+    CommentInfo updatedComment = gApi.changes().id(changeId).revision(ps1).comment(uuid).get();
+    String expectedMsg =
+        String.format(
+            "Comment removed by: %s; Reason: %s", admin.fullName, "delete comment 2, iteration: 2");
+    assertThat(updatedComment.message).isEqualTo(expectedMsg);
+    oldComment.message = expectedMsg;
+    assertThat(updatedComment).isEqualTo(oldComment);
+
+    if (notesMigration.commitChangeWrites()) {
+      assertMetaBranchCommitsAfterRewriting(commitsBeforeDelete, id, uuid, expectedMsg);
+    }
+    assertThat(getChangeSortedComments(id.get())).hasSize(3);
+  }
+
+  @Test
+  public void jsonCommentHasLegacyFormatFalse() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    PushOneCommit.Result result = createChange();
+    Change.Id changeId = result.getChange().getId();
+    addComment(result.getChangeId(), "comment");
+
+    Collection<com.google.gerrit.reviewdb.client.Comment> comments =
+        notesFactory.createChecked(db, project, changeId).getComments().values();
+    assertThat(comments).hasSize(1);
+    com.google.gerrit.reviewdb.client.Comment comment = comments.iterator().next();
+    assertThat(comment.message).isEqualTo("comment");
+    assertThat(comment.legacyFormat).isFalse();
+  }
+
+  private List<CommentInfo> getRevisionComments(String changeId, String revId) throws Exception {
+    return getPublishedComments(changeId, revId).values().stream()
+        .flatMap(List::stream)
+        .collect(toList());
+  }
+
+  private CommentInput addComment(String changeId, String message) throws Exception {
+    ReviewInput input = new ReviewInput();
+    CommentInput comment = newComment(FILE_NAME, Side.REVISION, 0, message, false);
+    input.comments = ImmutableMap.of(comment.path, Lists.newArrayList(comment));
+    gApi.changes().id(changeId).current().review(input);
+    return comment;
+  }
+
+  private void addComments(String changeId, String revision, CommentInput... commentInputs)
+      throws Exception {
+    ReviewInput input = new ReviewInput();
+    input.comments = Arrays.stream(commentInputs).collect(groupingBy(c -> c.path));
+    gApi.changes().id(changeId).revision(revision).review(input);
+  }
+
+  /**
+   * All the commits, which contain the target comment before, should still contain the comment with
+   * the updated message. All the other metas of the commits should be exactly the same.
+   */
+  private void assertMetaBranchCommitsAfterRewriting(
+      List<RevCommit> beforeDelete,
+      Change.Id changeId,
+      String targetCommentUuid,
+      String expectedMessage)
+      throws Exception {
+    List<RevCommit> afterDelete = getChangeMetaCommitsInReverseOrder(changeId);
+    assertThat(afterDelete).hasSize(beforeDelete.size());
+
+    try (Repository repo = repoManager.openRepository(project);
+        ObjectReader reader = repo.newObjectReader()) {
+      for (int i = 0; i < beforeDelete.size(); i++) {
+        RevCommit commitBefore = beforeDelete.get(i);
+        RevCommit commitAfter = afterDelete.get(i);
+
+        Map<String, com.google.gerrit.reviewdb.client.Comment> commentMapBefore =
+            DeleteCommentRewriter.getPublishedComments(
+                noteUtil, changeId, reader, NoteMap.read(reader, commitBefore));
+        Map<String, com.google.gerrit.reviewdb.client.Comment> commentMapAfter =
+            DeleteCommentRewriter.getPublishedComments(
+                noteUtil, changeId, reader, NoteMap.read(reader, commitAfter));
+
+        if (commentMapBefore.containsKey(targetCommentUuid)) {
+          assertThat(commentMapAfter).containsKey(targetCommentUuid);
+          com.google.gerrit.reviewdb.client.Comment comment =
+              commentMapAfter.get(targetCommentUuid);
+          assertThat(comment.message).isEqualTo(expectedMessage);
+          comment.message = commentMapBefore.get(targetCommentUuid).message;
+          commentMapAfter.put(targetCommentUuid, comment);
+          assertThat(commentMapAfter).isEqualTo(commentMapBefore);
+        } else {
+          assertThat(commentMapAfter).doesNotContainKey(targetCommentUuid);
+        }
+
+        // Other metas should be exactly the same.
+        assertThat(commitAfter.getFullMessage()).isEqualTo(commitBefore.getFullMessage());
+        assertThat(commitAfter.getCommitterIdent()).isEqualTo(commitBefore.getCommitterIdent());
+        assertThat(commitAfter.getAuthorIdent()).isEqualTo(commitBefore.getAuthorIdent());
+        assertThat(commitAfter.getEncoding()).isEqualTo(commitBefore.getEncoding());
+        assertThat(commitAfter.getEncodingName()).isEqualTo(commitBefore.getEncodingName());
+      }
+    }
+  }
+
+  private static String extractComments(String msg) {
+    // Extract lines between start "....." and end "-- ".
+    Pattern p = Pattern.compile(".*[.]{5}\n+(.*)\\n+-- \n.*", Pattern.DOTALL);
+    Matcher m = p.matcher(msg);
+    return m.matches() ? m.group(1) : msg;
+  }
+
+  private ReviewInput newInput(CommentInput c) {
+    ReviewInput in = new ReviewInput();
+    in.comments = new HashMap<>();
+    in.comments.put(c.path, Lists.newArrayList(c));
+    return in;
+  }
+
+  private void addComment(PushOneCommit.Result r, String message) throws Exception {
+    addComment(r, message, false, false, null);
+  }
+
+  private void addComment(
+      PushOneCommit.Result r,
+      String message,
+      boolean omitDuplicateComments,
+      Boolean unresolved,
+      String inReplyTo)
+      throws Exception {
+    CommentInput c = new CommentInput();
+    c.line = 1;
+    c.message = message;
+    c.path = FILE_NAME;
+    c.unresolved = unresolved;
+    c.inReplyTo = inReplyTo;
+    ReviewInput in = newInput(c);
+    in.omitDuplicateComments = omitDuplicateComments;
+    gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(in);
+  }
+
+  private CommentInfo addDraft(String changeId, String revId, DraftInput in) throws Exception {
+    return gApi.changes().id(changeId).revision(revId).createDraft(in).get();
+  }
+
+  private void updateDraft(String changeId, String revId, DraftInput in, String uuid)
+      throws Exception {
+    gApi.changes().id(changeId).revision(revId).draft(uuid).update(in);
+  }
+
+  private void deleteDraft(String changeId, String revId, String uuid) throws Exception {
+    gApi.changes().id(changeId).revision(revId).draft(uuid).delete();
+  }
+
+  private CommentInfo getPublishedComment(String changeId, String revId, String uuid)
+      throws Exception {
+    return gApi.changes().id(changeId).revision(revId).comment(uuid).get();
+  }
+
+  private Map<String, List<CommentInfo>> getPublishedComments(String changeId, String revId)
+      throws Exception {
+    return gApi.changes().id(changeId).revision(revId).comments();
+  }
+
+  private Map<String, List<CommentInfo>> getDraftComments(String changeId, String revId)
+      throws Exception {
+    return gApi.changes().id(changeId).revision(revId).drafts();
+  }
+
+  private CommentInfo getDraftComment(String changeId, String revId, String uuid) throws Exception {
+    return gApi.changes().id(changeId).revision(revId).draft(uuid).get();
+  }
+
+  private static CommentInput newComment(String file, String message) {
+    return newComment(file, Side.REVISION, 0, message, false);
+  }
+
+  private static CommentInput newComment(
+      String path, Side side, int line, String message, Boolean unresolved) {
+    CommentInput c = new CommentInput();
+    return populate(c, path, side, null, line, message, unresolved);
+  }
+
+  private static CommentInput newCommentOnParent(
+      String path, int parent, int line, String message) {
+    CommentInput c = new CommentInput();
+    return populate(c, path, Side.PARENT, Integer.valueOf(parent), line, message, false);
+  }
+
+  private DraftInput newDraft(String path, Side side, int line, String message) {
+    DraftInput d = new DraftInput();
+    return populate(d, path, side, null, line, message, false);
+  }
+
+  private DraftInput newDraft(String path, Side side, Comment.Range range, String message) {
+    DraftInput d = new DraftInput();
+    return populate(d, path, side, null, range, message, false);
+  }
+
+  private DraftInput newDraftOnParent(String path, int parent, int line, String message) {
+    DraftInput d = new DraftInput();
+    return populate(d, path, Side.PARENT, Integer.valueOf(parent), line, message, false);
+  }
+
+  private static <C extends Comment> C populate(
+      C c,
+      String path,
+      Side side,
+      Integer parent,
+      Comment.Range range,
+      String message,
+      Boolean unresolved) {
+    int line = range.startLine;
+    c.path = path;
+    c.side = side;
+    c.parent = parent;
+    c.line = line != 0 ? line : null;
+    c.message = message;
+    c.unresolved = unresolved;
+    if (line != 0) c.range = range;
+    return c;
+  }
+
+  private static <C extends Comment> C populate(
+      C c, String path, Side side, Integer parent, int line, String message, Boolean unresolved) {
+    return populate(c, path, side, parent, createLineRange(line, 1, 5), message, unresolved);
+  }
+
+  private static Comment.Range createLineRange(int line, int startChar, int endChar) {
+    Comment.Range range = new Comment.Range();
+    range.startLine = line;
+    range.startCharacter = startChar;
+    range.endLine = line;
+    range.endCharacter = endChar;
+    return range;
+  }
+
+  private static Function<CommentInfo, CommentInput> infoToInput(String path) {
+    return infoToInput(path, CommentInput::new);
+  }
+
+  private static Function<CommentInfo, DraftInput> infoToDraft(String path) {
+    return infoToInput(path, DraftInput::new);
+  }
+
+  private static <I extends Comment> Function<CommentInfo, I> infoToInput(
+      String path, Supplier<I> supplier) {
+    return info -> {
+      I i = supplier.get();
+      i.path = path;
+      copy(info, i);
+      return i;
+    };
+  }
+
+  private static void copy(Comment from, Comment to) {
+    to.side = from.side == null ? Side.REVISION : from.side;
+    to.parent = from.parent;
+    to.line = from.line;
+    to.message = from.message;
+    to.range = from.range;
+    to.unresolved = from.unresolved;
+    to.inReplyTo = from.inReplyTo;
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/server/change/ConsistencyCheckerIT.java b/javatests/com/google/gerrit/acceptance/server/change/ConsistencyCheckerIT.java
new file mode 100644
index 0000000..2af90a8
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/server/change/ConsistencyCheckerIT.java
@@ -0,0 +1,992 @@
+// Copyright (C) 2014 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.google.gerrit.acceptance.server.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static com.google.gerrit.extensions.common.ProblemInfo.Status.FIXED;
+import static com.google.gerrit.extensions.common.ProblemInfo.Status.FIX_FAILED;
+import static com.google.gerrit.testing.TestChanges.newPatchSet;
+import static java.util.Collections.singleton;
+import static java.util.Objects.requireNonNull;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.TestAccount;
+import com.google.gerrit.common.FooterConstants;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.api.changes.FixInput;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.client.ChangeStatus;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.ProblemInfo;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.ChangeUtil;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.Sequences;
+import com.google.gerrit.server.change.ChangeInserter;
+import com.google.gerrit.server.change.ConsistencyChecker;
+import com.google.gerrit.server.change.PatchSetInserter;
+import com.google.gerrit.server.config.AnonymousCowardName;
+import com.google.gerrit.server.notedb.ChangeNoteUtil;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.RepoContext;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.testing.InMemoryRepositoryManager;
+import com.google.gerrit.testing.NoteDbMode;
+import com.google.gerrit.testing.TestChanges;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.RefUpdate.Result;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.junit.Before;
+import org.junit.Test;
+
+@NoHttpd
+public class ConsistencyCheckerIT extends AbstractDaemonTest {
+  @Inject private ChangeNotes.Factory changeNotesFactory;
+
+  @Inject private Provider<ConsistencyChecker> checkerProvider;
+
+  @Inject private IdentifiedUser.GenericFactory userFactory;
+
+  @Inject private ChangeInserter.Factory changeInserterFactory;
+
+  @Inject private PatchSetInserter.Factory patchSetInserterFactory;
+
+  @Inject private ChangeNoteUtil noteUtil;
+
+  @Inject @AnonymousCowardName private String anonymousCowardName;
+
+  @Inject private Sequences sequences;
+
+  private RevCommit tip;
+  private Account.Id adminId;
+  private ConsistencyChecker checker;
+  private TestRepository<InMemoryRepository> serverSideTestRepo;
+
+  private void assumeNoteDbDisabled() {
+    assume().that(notesMigration.readChanges()).isFalse();
+    assume().that(NoteDbMode.get()).isNotEqualTo(NoteDbMode.CHECK);
+  }
+
+  @Before
+  public void setUp() throws Exception {
+    serverSideTestRepo =
+        new TestRepository<>((InMemoryRepository) repoManager.openRepository(project));
+    tip =
+        serverSideTestRepo
+            .getRevWalk()
+            .parseCommit(serverSideTestRepo.getRepository().exactRef("HEAD").getObjectId());
+    adminId = admin.getId();
+    checker = checkerProvider.get();
+  }
+
+  @Test
+  public void validNewChange() throws Exception {
+    assertNoProblems(insertChange(), null);
+  }
+
+  @Test
+  public void validMergedChange() throws Exception {
+    ChangeNotes notes = mergeChange(incrementPatchSet(insertChange()));
+    assertNoProblems(notes, null);
+  }
+
+  @Test
+  public void missingOwner() throws Exception {
+    TestAccount owner = accountCreator.create("missing");
+    ChangeNotes notes = insertChange(owner);
+    deleteUserBranch(owner.getId());
+
+    assertProblems(notes, null, problem("Missing change owner: " + owner.getId()));
+  }
+
+  @Test
+  public void missingRepo() throws Exception {
+    // NoteDb can't have a change without a repo.
+    assumeNoteDbDisabled();
+
+    ChangeNotes notes = insertChange();
+    Project.NameKey name = notes.getProjectName();
+    ((InMemoryRepositoryManager) repoManager).deleteRepository(name);
+    assertThat(checker.check(notes, null).problems())
+        .containsExactly(problem("Destination repository not found: " + name));
+  }
+
+  @Test
+  public void invalidRevision() throws Exception {
+    // NoteDb always parses the revision when inserting a patch set, so we can't
+    // create an invalid patch set.
+    assumeNoteDbDisabled();
+
+    ChangeNotes notes = insertChange();
+    PatchSet ps =
+        newPatchSet(
+            notes.getChange().currentPatchSetId(),
+            "fooooooooooooooooooooooooooooooooooooooo",
+            adminId);
+    db.patchSets().update(singleton(ps));
+
+    assertProblems(
+        notes,
+        null,
+        problem("Invalid revision on patch set 1: fooooooooooooooooooooooooooooooooooooooo"));
+  }
+
+  // No test for ref existing but object missing; InMemoryRepository won't let
+  // us do such a thing.
+
+  @Test
+  public void patchSetObjectAndRefMissing() throws Exception {
+    String rev = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef";
+    ChangeNotes notes = insertChange();
+    PatchSet ps = insertMissingPatchSet(notes, rev);
+    notes = reload(notes);
+    assertProblems(
+        notes,
+        null,
+        problem("Ref missing: " + ps.getId().toRefName()),
+        problem("Object missing: patch set 2: deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
+  }
+
+  @Test
+  public void patchSetObjectAndRefMissingWithFix() throws Exception {
+    String rev = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef";
+    ChangeNotes notes = insertChange();
+    PatchSet ps = insertMissingPatchSet(notes, rev);
+    notes = reload(notes);
+
+    String refName = ps.getId().toRefName();
+    assertProblems(
+        notes,
+        new FixInput(),
+        problem("Ref missing: " + refName),
+        problem("Object missing: patch set 2: " + rev));
+  }
+
+  @Test
+  public void patchSetRefMissing() throws Exception {
+    ChangeNotes notes = insertChange();
+    serverSideTestRepo.update(
+        "refs/other/foo", ObjectId.fromString(psUtil.current(db, notes).getRevision().get()));
+    String refName = notes.getChange().currentPatchSetId().toRefName();
+    deleteRef(refName);
+
+    assertProblems(notes, null, problem("Ref missing: " + refName));
+  }
+
+  @Test
+  public void patchSetRefMissingWithFix() throws Exception {
+    ChangeNotes notes = insertChange();
+    String rev = psUtil.current(db, notes).getRevision().get();
+    serverSideTestRepo.update("refs/other/foo", ObjectId.fromString(rev));
+    String refName = notes.getChange().currentPatchSetId().toRefName();
+    deleteRef(refName);
+
+    assertProblems(
+        notes, new FixInput(), problem("Ref missing: " + refName, FIXED, "Repaired patch set ref"));
+    assertThat(serverSideTestRepo.getRepository().exactRef(refName).getObjectId().name())
+        .isEqualTo(rev);
+  }
+
+  @Test
+  public void patchSetObjectAndRefMissingWithDeletingPatchSet() throws Exception {
+    ChangeNotes notes = insertChange();
+    PatchSet ps1 = psUtil.current(db, notes);
+
+    String rev2 = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef";
+    PatchSet ps2 = insertMissingPatchSet(notes, rev2);
+    notes = reload(notes);
+
+    FixInput fix = new FixInput();
+    fix.deletePatchSetIfCommitMissing = true;
+    assertProblems(
+        notes,
+        fix,
+        problem("Ref missing: " + ps2.getId().toRefName()),
+        problem("Object missing: patch set 2: " + rev2, FIXED, "Deleted patch set"));
+
+    notes = reload(notes);
+    assertThat(notes.getChange().currentPatchSetId().get()).isEqualTo(1);
+    assertThat(psUtil.get(db, notes, ps1.getId())).isNotNull();
+    assertThat(psUtil.get(db, notes, ps2.getId())).isNull();
+  }
+
+  @Test
+  public void patchSetMultipleObjectsMissingWithDeletingPatchSets() throws Exception {
+    ChangeNotes notes = insertChange();
+    PatchSet ps1 = psUtil.current(db, notes);
+
+    String rev2 = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef";
+    PatchSet ps2 = insertMissingPatchSet(notes, rev2);
+
+    notes = incrementPatchSet(reload(notes));
+    PatchSet ps3 = psUtil.current(db, notes);
+
+    String rev4 = "c0ffeeeec0ffeeeec0ffeeeec0ffeeeec0ffeeee";
+    PatchSet ps4 = insertMissingPatchSet(notes, rev4);
+    notes = reload(notes);
+
+    FixInput fix = new FixInput();
+    fix.deletePatchSetIfCommitMissing = true;
+    assertProblems(
+        notes,
+        fix,
+        problem("Ref missing: " + ps2.getId().toRefName()),
+        problem("Object missing: patch set 2: " + rev2, FIXED, "Deleted patch set"),
+        problem("Ref missing: " + ps4.getId().toRefName()),
+        problem("Object missing: patch set 4: " + rev4, FIXED, "Deleted patch set"));
+
+    notes = reload(notes);
+    assertThat(notes.getChange().currentPatchSetId().get()).isEqualTo(3);
+    assertThat(psUtil.get(db, notes, ps1.getId())).isNotNull();
+    assertThat(psUtil.get(db, notes, ps2.getId())).isNull();
+    assertThat(psUtil.get(db, notes, ps3.getId())).isNotNull();
+    assertThat(psUtil.get(db, notes, ps4.getId())).isNull();
+  }
+
+  @Test
+  public void onlyPatchSetObjectMissingWithFix() throws Exception {
+    Change c = TestChanges.newChange(project, admin.getId(), sequences.nextChangeId());
+
+    // Set review started, mimicking Schema_153, so tests pass with NoteDbMode.CHECK.
+    c.setReviewStarted(true);
+
+    PatchSet.Id psId = c.currentPatchSetId();
+    String rev = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef";
+    PatchSet ps = newPatchSet(psId, rev, adminId);
+
+    if (notesMigration.changePrimaryStorage() == PrimaryStorage.REVIEW_DB) {
+      db.changes().insert(singleton(c));
+      db.patchSets().insert(singleton(ps));
+    }
+    addNoteDbCommit(
+        c.getId(),
+        "Create change\n"
+            + "\n"
+            + "Patch-set: 1\n"
+            + "Branch: "
+            + c.getDest().get()
+            + "\n"
+            + "Change-id: "
+            + c.getKey().get()
+            + "\n"
+            + "Subject: Bogus subject\n"
+            + "Commit: "
+            + rev
+            + "\n"
+            + "Groups: "
+            + rev
+            + "\n");
+    indexer.index(db, c.getProject(), c.getId());
+    ChangeNotes notes = changeNotesFactory.create(db, c.getProject(), c.getId());
+
+    FixInput fix = new FixInput();
+    fix.deletePatchSetIfCommitMissing = true;
+    assertProblems(
+        notes,
+        fix,
+        problem("Ref missing: " + ps.getId().toRefName()),
+        problem(
+            "Object missing: patch set 1: " + rev,
+            FIX_FAILED,
+            "Cannot delete patch set; no patch sets would remain"));
+
+    notes = reload(notes);
+    assertThat(notes.getChange().currentPatchSetId().get()).isEqualTo(1);
+    assertThat(psUtil.current(db, notes)).isNotNull();
+  }
+
+  @Test
+  public void currentPatchSetMissing() throws Exception {
+    // NoteDb can't create a change without a patch set.
+    assumeNoteDbDisabled();
+
+    ChangeNotes notes = insertChange();
+    db.patchSets().deleteKeys(singleton(notes.getChange().currentPatchSetId()));
+    assertProblems(notes, null, problem("Current patch set 1 not found"));
+  }
+
+  @Test
+  public void duplicatePatchSetRevisions() throws Exception {
+    ChangeNotes notes = insertChange();
+    PatchSet ps1 = psUtil.current(db, notes);
+    String rev = ps1.getRevision().get();
+
+    notes =
+        incrementPatchSet(
+            notes, serverSideTestRepo.getRevWalk().parseCommit(ObjectId.fromString(rev)));
+
+    assertProblems(notes, null, problem("Multiple patch sets pointing to " + rev + ": [1, 2]"));
+  }
+
+  @Test
+  public void missingDestRef() throws Exception {
+    ChangeNotes notes = insertChange();
+
+    String ref = "refs/heads/master";
+    // Detach head so we're allowed to delete ref.
+    serverSideTestRepo.reset(serverSideTestRepo.getRepository().exactRef(ref).getObjectId());
+    RefUpdate ru = serverSideTestRepo.getRepository().updateRef(ref);
+    ru.setForceUpdate(true);
+    assertThat(ru.delete()).isEqualTo(RefUpdate.Result.FORCED);
+
+    assertProblems(notes, null, problem("Destination ref not found (may be new branch): " + ref));
+  }
+
+  @Test
+  public void mergedChangeIsNotMerged() throws Exception {
+    ChangeNotes notes = insertChange();
+
+    try (BatchUpdate bu = newUpdate(adminId)) {
+      bu.addOp(
+          notes.getChangeId(),
+          new BatchUpdateOp() {
+            @Override
+            public boolean updateChange(ChangeContext ctx) throws OrmException {
+              ctx.getChange().setStatus(Change.Status.MERGED);
+              ctx.getUpdate(ctx.getChange().currentPatchSetId()).fixStatus(Change.Status.MERGED);
+              return true;
+            }
+          });
+      bu.execute();
+    }
+    notes = reload(notes);
+
+    String rev = psUtil.current(db, notes).getRevision().get();
+    ObjectId tip = getDestRef(notes);
+    assertProblems(
+        notes,
+        null,
+        problem(
+            "Patch set 1 ("
+                + rev
+                + ") is not merged into destination ref"
+                + " refs/heads/master ("
+                + tip.name()
+                + "), but change status is MERGED"));
+  }
+
+  @Test
+  public void newChangeIsMerged() throws Exception {
+    ChangeNotes notes = insertChange();
+    String rev = psUtil.current(db, notes).getRevision().get();
+    serverSideTestRepo
+        .branch(notes.getChange().getDest().get())
+        .update(serverSideTestRepo.getRevWalk().parseCommit(ObjectId.fromString(rev)));
+
+    assertProblems(
+        notes,
+        null,
+        problem(
+            "Patch set 1 ("
+                + rev
+                + ") is merged into destination ref"
+                + " refs/heads/master ("
+                + rev
+                + "), but change status is NEW"));
+  }
+
+  @Test
+  public void newChangeIsMergedWithFix() throws Exception {
+    ChangeNotes notes = insertChange();
+    String rev = psUtil.current(db, notes).getRevision().get();
+    serverSideTestRepo
+        .branch(notes.getChange().getDest().get())
+        .update(serverSideTestRepo.getRevWalk().parseCommit(ObjectId.fromString(rev)));
+
+    assertProblems(
+        notes,
+        new FixInput(),
+        problem(
+            "Patch set 1 ("
+                + rev
+                + ") is merged into destination ref"
+                + " refs/heads/master ("
+                + rev
+                + "), but change status is NEW",
+            FIXED,
+            "Marked change as merged"));
+
+    notes = reload(notes);
+    assertThat(notes.getChange().getStatus()).isEqualTo(Change.Status.MERGED);
+    assertNoProblems(notes, null);
+  }
+
+  @Test
+  public void extensionApiReturnsUpdatedValueAfterFix() throws Exception {
+    ChangeNotes notes = insertChange();
+    String rev = psUtil.current(db, notes).getRevision().get();
+    serverSideTestRepo
+        .branch(notes.getChange().getDest().get())
+        .update(serverSideTestRepo.getRevWalk().parseCommit(ObjectId.fromString(rev)));
+
+    ChangeInfo info = gApi.changes().id(notes.getChangeId().get()).info();
+    assertThat(info.status).isEqualTo(ChangeStatus.NEW);
+
+    info = gApi.changes().id(notes.getChangeId().get()).check(new FixInput());
+    assertThat(info.status).isEqualTo(ChangeStatus.MERGED);
+  }
+
+  @Test
+  public void expectedMergedCommitIsLatestPatchSet() throws Exception {
+    ChangeNotes notes = insertChange();
+    String rev = psUtil.current(db, notes).getRevision().get();
+    serverSideTestRepo
+        .branch(notes.getChange().getDest().get())
+        .update(serverSideTestRepo.getRevWalk().parseCommit(ObjectId.fromString(rev)));
+
+    FixInput fix = new FixInput();
+    fix.expectMergedAs = rev;
+    assertProblems(
+        notes,
+        fix,
+        problem(
+            "Patch set 1 ("
+                + rev
+                + ") is merged into destination ref"
+                + " refs/heads/master ("
+                + rev
+                + "), but change status is NEW",
+            FIXED,
+            "Marked change as merged"));
+
+    notes = reload(notes);
+    assertThat(notes.getChange().getStatus()).isEqualTo(Change.Status.MERGED);
+    assertNoProblems(notes, null);
+  }
+
+  @Test
+  public void expectedMergedCommitNotMergedIntoDestination() throws Exception {
+    ChangeNotes notes = insertChange();
+    String rev = psUtil.current(db, notes).getRevision().get();
+    RevCommit commit = serverSideTestRepo.getRevWalk().parseCommit(ObjectId.fromString(rev));
+    serverSideTestRepo.branch(notes.getChange().getDest().get()).update(commit);
+
+    FixInput fix = new FixInput();
+    RevCommit other = serverSideTestRepo.commit().message(commit.getFullMessage()).create();
+    fix.expectMergedAs = other.name();
+    assertProblems(
+        notes,
+        fix,
+        problem(
+            "Expected merged commit "
+                + other.name()
+                + " is not merged into destination ref refs/heads/master"
+                + " ("
+                + commit.name()
+                + ")"));
+  }
+
+  @Test
+  public void createNewPatchSetForExpectedMergeCommitWithNoChangeId() throws Exception {
+    ChangeNotes notes = insertChange();
+    String dest = notes.getChange().getDest().get();
+    String rev = psUtil.current(db, notes).getRevision().get();
+    RevCommit commit = serverSideTestRepo.getRevWalk().parseCommit(ObjectId.fromString(rev));
+
+    RevCommit mergedAs =
+        serverSideTestRepo
+            .commit()
+            .parent(commit.getParent(0))
+            .message(commit.getShortMessage())
+            .create();
+    serverSideTestRepo.getRevWalk().parseBody(mergedAs);
+    assertThat(mergedAs.getFooterLines(FooterConstants.CHANGE_ID)).isEmpty();
+    serverSideTestRepo.update(dest, mergedAs);
+
+    assertNoProblems(notes, null);
+
+    FixInput fix = new FixInput();
+    fix.expectMergedAs = mergedAs.name();
+    assertProblems(
+        notes,
+        fix,
+        problem(
+            "No patch set found for merged commit " + mergedAs.name(),
+            FIXED,
+            "Marked change as merged"),
+        problem(
+            "Expected merged commit " + mergedAs.name() + " has no associated patch set",
+            FIXED,
+            "Inserted as patch set 2"));
+
+    notes = reload(notes);
+    PatchSet.Id psId2 = new PatchSet.Id(notes.getChangeId(), 2);
+    assertThat(notes.getChange().currentPatchSetId()).isEqualTo(psId2);
+    assertThat(psUtil.get(db, notes, psId2).getRevision().get()).isEqualTo(mergedAs.name());
+
+    assertNoProblems(notes, null);
+  }
+
+  @Test
+  public void createNewPatchSetForExpectedMergeCommitWithChangeId() throws Exception {
+    ChangeNotes notes = insertChange();
+    String dest = notes.getChange().getDest().get();
+    String rev = psUtil.current(db, notes).getRevision().get();
+    RevCommit commit = serverSideTestRepo.getRevWalk().parseCommit(ObjectId.fromString(rev));
+
+    RevCommit mergedAs =
+        serverSideTestRepo
+            .commit()
+            .parent(commit.getParent(0))
+            .message(
+                commit.getShortMessage()
+                    + "\n"
+                    + "\n"
+                    + "Change-Id: "
+                    + notes.getChange().getKey().get()
+                    + "\n")
+            .create();
+    serverSideTestRepo.getRevWalk().parseBody(mergedAs);
+    assertThat(mergedAs.getFooterLines(FooterConstants.CHANGE_ID))
+        .containsExactly(notes.getChange().getKey().get());
+    serverSideTestRepo.update(dest, mergedAs);
+
+    assertNoProblems(notes, null);
+
+    FixInput fix = new FixInput();
+    fix.expectMergedAs = mergedAs.name();
+    assertProblems(
+        notes,
+        fix,
+        problem(
+            "No patch set found for merged commit " + mergedAs.name(),
+            FIXED,
+            "Marked change as merged"),
+        problem(
+            "Expected merged commit " + mergedAs.name() + " has no associated patch set",
+            FIXED,
+            "Inserted as patch set 2"));
+
+    notes = reload(notes);
+    PatchSet.Id psId2 = new PatchSet.Id(notes.getChangeId(), 2);
+    assertThat(notes.getChange().currentPatchSetId()).isEqualTo(psId2);
+    assertThat(psUtil.get(db, notes, psId2).getRevision().get()).isEqualTo(mergedAs.name());
+
+    assertNoProblems(notes, null);
+  }
+
+  @Test
+  public void expectedMergedCommitIsOldPatchSetOfSameChange() throws Exception {
+    ChangeNotes notes = insertChange();
+    PatchSet ps1 = psUtil.current(db, notes);
+    String rev1 = ps1.getRevision().get();
+    notes = incrementPatchSet(notes);
+    PatchSet ps2 = psUtil.current(db, notes);
+    serverSideTestRepo
+        .branch(notes.getChange().getDest().get())
+        .update(serverSideTestRepo.getRevWalk().parseCommit(ObjectId.fromString(rev1)));
+
+    FixInput fix = new FixInput();
+    fix.expectMergedAs = rev1;
+    assertProblems(
+        notes,
+        fix,
+        problem("No patch set found for merged commit " + rev1, FIXED, "Marked change as merged"),
+        problem(
+            "Expected merge commit "
+                + rev1
+                + " corresponds to patch set 1,"
+                + " not the current patch set 2",
+            FIXED,
+            "Deleted patch set"),
+        problem(
+            "Expected merge commit "
+                + rev1
+                + " corresponds to patch set 1,"
+                + " not the current patch set 2",
+            FIXED,
+            "Inserted as patch set 3"));
+
+    notes = reload(notes);
+    PatchSet.Id psId3 = new PatchSet.Id(notes.getChangeId(), 3);
+    assertThat(notes.getChange().currentPatchSetId()).isEqualTo(psId3);
+    assertThat(notes.getChange().getStatus()).isEqualTo(Change.Status.MERGED);
+    assertThat(psUtil.byChangeAsMap(db, notes).keySet()).containsExactly(ps2.getId(), psId3);
+    assertThat(psUtil.get(db, notes, psId3).getRevision().get()).isEqualTo(rev1);
+  }
+
+  @Test
+  public void expectedMergedCommitIsDanglingPatchSetOlderThanCurrent() throws Exception {
+    ChangeNotes notes = insertChange();
+    PatchSet ps1 = psUtil.current(db, notes);
+
+    // Create dangling ref so next ID in the database becomes 3.
+    PatchSet.Id psId2 = new PatchSet.Id(notes.getChangeId(), 2);
+    RevCommit commit2 = patchSetCommit(psId2);
+    String rev2 = commit2.name();
+    serverSideTestRepo.branch(psId2.toRefName()).update(commit2);
+
+    notes = incrementPatchSet(notes);
+    PatchSet ps3 = psUtil.current(db, notes);
+    assertThat(ps3.getId().get()).isEqualTo(3);
+
+    serverSideTestRepo
+        .branch(notes.getChange().getDest().get())
+        .update(serverSideTestRepo.getRevWalk().parseCommit(ObjectId.fromString(rev2)));
+
+    FixInput fix = new FixInput();
+    fix.expectMergedAs = rev2;
+    assertProblems(
+        notes,
+        fix,
+        problem("No patch set found for merged commit " + rev2, FIXED, "Marked change as merged"),
+        problem(
+            "Expected merge commit "
+                + rev2
+                + " corresponds to patch set 2,"
+                + " not the current patch set 3",
+            FIXED,
+            "Deleted patch set"),
+        problem(
+            "Expected merge commit "
+                + rev2
+                + " corresponds to patch set 2,"
+                + " not the current patch set 3",
+            FIXED,
+            "Inserted as patch set 4"));
+
+    notes = reload(notes);
+    PatchSet.Id psId4 = new PatchSet.Id(notes.getChangeId(), 4);
+    assertThat(notes.getChange().currentPatchSetId()).isEqualTo(psId4);
+    assertThat(notes.getChange().getStatus()).isEqualTo(Change.Status.MERGED);
+    assertThat(psUtil.byChangeAsMap(db, notes).keySet())
+        .containsExactly(ps1.getId(), ps3.getId(), psId4);
+    assertThat(psUtil.get(db, notes, psId4).getRevision().get()).isEqualTo(rev2);
+  }
+
+  @Test
+  public void expectedMergedCommitIsDanglingPatchSetNewerThanCurrent() throws Exception {
+    ChangeNotes notes = insertChange();
+    PatchSet ps1 = psUtil.current(db, notes);
+
+    // Create dangling ref with no patch set.
+    PatchSet.Id psId2 = new PatchSet.Id(notes.getChangeId(), 2);
+    RevCommit commit2 = patchSetCommit(psId2);
+    String rev2 = commit2.name();
+    serverSideTestRepo.branch(psId2.toRefName()).update(commit2);
+
+    serverSideTestRepo
+        .branch(notes.getChange().getDest().get())
+        .update(serverSideTestRepo.getRevWalk().parseCommit(ObjectId.fromString(rev2)));
+
+    FixInput fix = new FixInput();
+    fix.expectMergedAs = rev2;
+    assertProblems(
+        notes,
+        fix,
+        problem("No patch set found for merged commit " + rev2, FIXED, "Marked change as merged"),
+        problem(
+            "Expected merge commit "
+                + rev2
+                + " corresponds to patch set 2,"
+                + " not the current patch set 1",
+            FIXED,
+            "Inserted as patch set 2"));
+
+    notes = reload(notes);
+    assertThat(notes.getChange().currentPatchSetId()).isEqualTo(psId2);
+    assertThat(notes.getChange().getStatus()).isEqualTo(Change.Status.MERGED);
+    assertThat(psUtil.byChangeAsMap(db, notes).keySet()).containsExactly(ps1.getId(), psId2);
+    assertThat(psUtil.get(db, notes, psId2).getRevision().get()).isEqualTo(rev2);
+  }
+
+  @Test
+  public void expectedMergedCommitWithMismatchedChangeId() throws Exception {
+    ChangeNotes notes = insertChange();
+    String dest = notes.getChange().getDest().get();
+    RevCommit parent = serverSideTestRepo.branch(dest).commit().message("parent").create();
+    String rev = psUtil.current(db, notes).getRevision().get();
+    RevCommit commit = serverSideTestRepo.getRevWalk().parseCommit(ObjectId.fromString(rev));
+    serverSideTestRepo.branch(dest).update(commit);
+
+    String badId = "I0000000000000000000000000000000000000000";
+    RevCommit mergedAs =
+        serverSideTestRepo
+            .commit()
+            .parent(parent)
+            .message(commit.getShortMessage() + "\n\nChange-Id: " + badId + "\n")
+            .create();
+    serverSideTestRepo.getRevWalk().parseBody(mergedAs);
+    assertThat(mergedAs.getFooterLines(FooterConstants.CHANGE_ID)).containsExactly(badId);
+    serverSideTestRepo.update(dest, mergedAs);
+
+    assertNoProblems(notes, null);
+
+    FixInput fix = new FixInput();
+    fix.expectMergedAs = mergedAs.name();
+    assertProblems(
+        notes,
+        fix,
+        problem(
+            "Expected merged commit "
+                + mergedAs.name()
+                + " has Change-Id: "
+                + badId
+                + ", but expected "
+                + notes.getChange().getKey().get()));
+  }
+
+  @Test
+  public void expectedMergedCommitMatchesMultiplePatchSets() throws Exception {
+    ChangeNotes notes1 = insertChange();
+    PatchSet.Id psId1 = psUtil.current(db, notes1).getId();
+    String dest = notes1.getChange().getDest().get();
+    String rev = psUtil.current(db, notes1).getRevision().get();
+    RevCommit commit = serverSideTestRepo.getRevWalk().parseCommit(ObjectId.fromString(rev));
+    serverSideTestRepo.branch(dest).update(commit);
+
+    ChangeNotes notes2 = insertChange();
+    notes2 = incrementPatchSet(notes2, commit);
+    PatchSet.Id psId2 = psUtil.current(db, notes2).getId();
+
+    ChangeNotes notes3 = insertChange();
+    notes3 = incrementPatchSet(notes3, commit);
+    PatchSet.Id psId3 = psUtil.current(db, notes3).getId();
+
+    FixInput fix = new FixInput();
+    fix.expectMergedAs = commit.name();
+    assertProblems(
+        notes1,
+        fix,
+        problem(
+            "Multiple patch sets for expected merged commit "
+                + commit.name()
+                + ": ["
+                + psId1
+                + ", "
+                + psId2
+                + ", "
+                + psId3
+                + "]"));
+  }
+
+  private BatchUpdate newUpdate(Account.Id owner) {
+    return batchUpdateFactory.create(db, project, userFactory.create(owner), TimeUtil.nowTs());
+  }
+
+  private ChangeNotes insertChange() throws Exception {
+    return insertChange(admin);
+  }
+
+  private ChangeNotes insertChange(TestAccount owner) throws Exception {
+    return insertChange(owner, "refs/heads/master");
+  }
+
+  private ChangeNotes insertChange(TestAccount owner, String dest) throws Exception {
+    Change.Id id = new Change.Id(sequences.nextChangeId());
+    ChangeInserter ins;
+    try (BatchUpdate bu = newUpdate(owner.getId())) {
+      RevCommit commit = patchSetCommit(new PatchSet.Id(id, 1));
+      ins =
+          changeInserterFactory
+              .create(id, commit, dest)
+              .setValidate(false)
+              .setNotify(NotifyHandling.NONE)
+              .setFireRevisionCreated(false)
+              .setSendMail(false);
+      bu.insertChange(ins).execute();
+    }
+    return changeNotesFactory.create(db, project, ins.getChange().getId());
+  }
+
+  private PatchSet.Id nextPatchSetId(ChangeNotes notes) throws Exception {
+    return ChangeUtil.nextPatchSetId(
+        serverSideTestRepo.getRepository(), notes.getChange().currentPatchSetId());
+  }
+
+  private ChangeNotes incrementPatchSet(ChangeNotes notes) throws Exception {
+    return incrementPatchSet(notes, patchSetCommit(nextPatchSetId(notes)));
+  }
+
+  private ChangeNotes incrementPatchSet(ChangeNotes notes, RevCommit commit) throws Exception {
+    PatchSetInserter ins;
+    try (BatchUpdate bu = newUpdate(notes.getChange().getOwner())) {
+      ins =
+          patchSetInserterFactory
+              .create(notes, nextPatchSetId(notes), commit)
+              .setValidate(false)
+              .setFireRevisionCreated(false)
+              .setNotify(NotifyHandling.NONE);
+      bu.addOp(notes.getChangeId(), ins).execute();
+    }
+    return reload(notes);
+  }
+
+  private ChangeNotes reload(ChangeNotes notes) throws Exception {
+    return changeNotesFactory.create(db, notes.getChange().getProject(), notes.getChangeId());
+  }
+
+  private RevCommit patchSetCommit(PatchSet.Id psId) throws Exception {
+    RevCommit c = serverSideTestRepo.commit().parent(tip).message("Change " + psId).create();
+    return serverSideTestRepo.parseBody(c);
+  }
+
+  private PatchSet insertMissingPatchSet(ChangeNotes notes, String rev) throws Exception {
+    // Don't use BatchUpdate since we're manually updating the meta ref rather
+    // than using ChangeUpdate.
+    String subject = "Subject for missing commit";
+    Change c = new Change(notes.getChange());
+    PatchSet.Id psId = nextPatchSetId(notes);
+    c.setCurrentPatchSet(psId, subject, c.getOriginalSubject());
+    PatchSet ps = newPatchSet(psId, rev, adminId);
+
+    if (PrimaryStorage.of(c) == PrimaryStorage.REVIEW_DB) {
+      db.patchSets().insert(singleton(ps));
+      db.changes().update(singleton(c));
+    }
+
+    addNoteDbCommit(
+        c.getId(),
+        "Update patch set "
+            + psId.get()
+            + "\n"
+            + "\n"
+            + "Patch-set: "
+            + psId.get()
+            + "\n"
+            + "Commit: "
+            + rev
+            + "\n"
+            + "Subject: "
+            + subject
+            + "\n");
+    indexer.index(db, c.getProject(), c.getId());
+
+    return ps;
+  }
+
+  private void deleteRef(String refName) throws Exception {
+    RefUpdate ru = serverSideTestRepo.getRepository().updateRef(refName, true);
+    ru.setForceUpdate(true);
+    assertThat(ru.delete()).isEqualTo(RefUpdate.Result.FORCED);
+  }
+
+  private void addNoteDbCommit(Change.Id id, String commitMessage) throws Exception {
+    if (!notesMigration.commitChangeWrites()) {
+      return;
+    }
+    PersonIdent committer = serverIdent.get();
+    PersonIdent author =
+        noteUtil.newIdent(getAccount(admin.getId()), committer.getWhen(), committer);
+    serverSideTestRepo
+        .branch(RefNames.changeMetaRef(id))
+        .commit()
+        .author(author)
+        .committer(committer)
+        .message(commitMessage)
+        .create();
+  }
+
+  private ObjectId getDestRef(ChangeNotes notes) throws Exception {
+    return serverSideTestRepo
+        .getRepository()
+        .exactRef(notes.getChange().getDest().get())
+        .getObjectId();
+  }
+
+  private ChangeNotes mergeChange(ChangeNotes notes) throws Exception {
+    final ObjectId oldId = getDestRef(notes);
+    final ObjectId newId = ObjectId.fromString(psUtil.current(db, notes).getRevision().get());
+    final String dest = notes.getChange().getDest().get();
+
+    try (BatchUpdate bu = newUpdate(adminId)) {
+      bu.addOp(
+          notes.getChangeId(),
+          new BatchUpdateOp() {
+            @Override
+            public void updateRepo(RepoContext ctx) throws IOException {
+              ctx.addRefUpdate(oldId, newId, dest);
+            }
+
+            @Override
+            public boolean updateChange(ChangeContext ctx) throws OrmException {
+              ctx.getChange().setStatus(Change.Status.MERGED);
+              ctx.getUpdate(ctx.getChange().currentPatchSetId()).fixStatus(Change.Status.MERGED);
+              return true;
+            }
+          });
+      bu.execute();
+    }
+    return reload(notes);
+  }
+
+  private static ProblemInfo problem(String message) {
+    ProblemInfo p = new ProblemInfo();
+    p.message = message;
+    return p;
+  }
+
+  private static ProblemInfo problem(String message, ProblemInfo.Status status, String outcome) {
+    ProblemInfo p = problem(message);
+    p.status = requireNonNull(status);
+    p.outcome = requireNonNull(outcome);
+    return p;
+  }
+
+  private void assertProblems(
+      ChangeNotes notes, @Nullable FixInput fix, ProblemInfo first, ProblemInfo... rest)
+      throws Exception {
+    List<ProblemInfo> expected = new ArrayList<>(1 + rest.length);
+    expected.add(first);
+    expected.addAll(Arrays.asList(rest));
+    assertThat(checker.check(notes, fix).problems()).containsExactlyElementsIn(expected).inOrder();
+  }
+
+  private void assertNoProblems(ChangeNotes notes, @Nullable FixInput fix) throws Exception {
+    assertThat(checker.check(notes, fix).problems()).isEmpty();
+  }
+
+  private void deleteUserBranch(Account.Id accountId) throws IOException {
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      String refName = RefNames.refsUsers(accountId);
+      Ref ref = repo.exactRef(refName);
+      if (ref == null) {
+        return;
+      }
+
+      RefUpdate ru = repo.updateRef(refName);
+      ru.setExpectedOldObjectId(ref.getObjectId());
+      ru.setNewObjectId(ObjectId.zeroId());
+      ru.setForceUpdate(true);
+      Result result = ru.delete();
+      if (result != Result.FORCED) {
+        throw new IOException(String.format("Failed to delete ref %s: %s", refName, result.name()));
+      }
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/server/change/GetRelatedIT.java b/javatests/com/google/gerrit/acceptance/server/change/GetRelatedIT.java
new file mode 100644
index 0000000..dd47c01
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/server/change/GetRelatedIT.java
@@ -0,0 +1,649 @@
+// Copyright (C) 2013 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.google.gerrit.acceptance.server.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.acceptance.GitUtil.assertPushOk;
+import static com.google.gerrit.acceptance.GitUtil.pushHead;
+import static com.google.gerrit.extensions.common.testing.EditInfoSubject.assertThat;
+import static java.util.concurrent.TimeUnit.SECONDS;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.GerritConfig;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.common.RawInputUtil;
+import com.google.gerrit.extensions.api.changes.RelatedChangeAndCommitInfo;
+import com.google.gerrit.extensions.common.CommitInfo;
+import com.google.gerrit.extensions.common.EditInfo;
+import com.google.gerrit.index.IndexConfig;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.restapi.change.ChangesCollection;
+import com.google.gerrit.server.restapi.change.GetRelated;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.gerrit.testing.TestTimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+@NoHttpd
+public class GetRelatedIT extends AbstractDaemonTest {
+  private static final int MAX_TERMS = 10;
+
+  @ConfigSuite.Default
+  public static Config defaultConfig() {
+    Config cfg = new Config();
+    cfg.setInt("index", null, "maxTerms", MAX_TERMS);
+    return cfg;
+  }
+
+  private String systemTimeZone;
+
+  @Before
+  public void setTimeForTesting() {
+    systemTimeZone = System.setProperty("user.timezone", "US/Eastern");
+    TestTimeUtil.resetWithClockStep(1, SECONDS);
+  }
+
+  @After
+  public void resetTime() {
+    TestTimeUtil.useSystemTime();
+    System.setProperty("user.timezone", systemTimeZone);
+  }
+
+  @Inject private IndexConfig indexConfig;
+  @Inject private ChangesCollection changes;
+
+  @Test
+  public void getRelatedNoResult() throws Exception {
+    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
+    assertRelated(push.to("refs/for/master").getPatchSetId());
+  }
+
+  @Test
+  public void getRelatedLinear() throws Exception {
+    // 1,1---2,1
+    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
+    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
+    pushHead(testRepo, "refs/for/master", false);
+    PatchSet.Id ps1_1 = getPatchSetId(c1_1);
+    PatchSet.Id ps2_1 = getPatchSetId(c2_1);
+
+    for (PatchSet.Id ps : ImmutableList.of(ps2_1, ps1_1)) {
+      assertRelated(ps, changeAndCommit(ps2_1, c2_1, 1), changeAndCommit(ps1_1, c1_1, 1));
+    }
+  }
+
+  @Test
+  public void getRelatedLinearSeparatePushes() throws Exception {
+    // 1,1---2,1
+    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
+    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
+
+    testRepo.reset(c1_1);
+    pushHead(testRepo, "refs/for/master", false);
+    PatchSet.Id ps1_1 = getPatchSetId(c1_1);
+    String oldETag = changes.parse(ps1_1.getParentKey()).getETag();
+
+    testRepo.reset(c2_1);
+    pushHead(testRepo, "refs/for/master", false);
+    PatchSet.Id ps2_1 = getPatchSetId(c2_1);
+
+    // Push of change 2 should not affect groups (or anything else) of change 1.
+    assertThat(changes.parse(ps1_1.getParentKey()).getETag()).isEqualTo(oldETag);
+
+    for (PatchSet.Id ps : ImmutableList.of(ps2_1, ps1_1)) {
+      assertRelated(ps, changeAndCommit(ps2_1, c2_1, 1), changeAndCommit(ps1_1, c1_1, 1));
+    }
+  }
+
+  @Test
+  public void getRelatedReorder() throws Exception {
+    // 1,1---2,1
+    //
+    // 2,2---1,2
+
+    // Create two commits and push.
+    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
+    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
+    pushHead(testRepo, "refs/for/master", false);
+    PatchSet.Id ps1_1 = getPatchSetId(c1_1);
+    PatchSet.Id ps2_1 = getPatchSetId(c2_1);
+
+    // Swap the order of commits and push again.
+    testRepo.reset("HEAD~2");
+    RevCommit c2_2 = testRepo.cherryPick(c2_1);
+    RevCommit c1_2 = testRepo.cherryPick(c1_1);
+    pushHead(testRepo, "refs/for/master", false);
+    PatchSet.Id ps1_2 = getPatchSetId(c1_1);
+    PatchSet.Id ps2_2 = getPatchSetId(c2_1);
+
+    for (PatchSet.Id ps : ImmutableList.of(ps2_2, ps1_2)) {
+      assertRelated(ps, changeAndCommit(ps1_2, c1_2, 2), changeAndCommit(ps2_2, c2_2, 2));
+    }
+
+    for (PatchSet.Id ps : ImmutableList.of(ps2_1, ps1_1)) {
+      assertRelated(ps, changeAndCommit(ps2_1, c2_1, 2), changeAndCommit(ps1_1, c1_1, 2));
+    }
+  }
+
+  @Test
+  public void getRelatedAmendParentChange() throws Exception {
+    // 1,1---2,1
+    //
+    // 1,2
+
+    // Create two commits and push.
+    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
+    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
+    pushHead(testRepo, "refs/for/master", false);
+    PatchSet.Id ps1_1 = getPatchSetId(c1_1);
+    PatchSet.Id ps2_1 = getPatchSetId(c2_1);
+
+    // Amend parent change and push.
+    testRepo.reset("HEAD~1");
+    RevCommit c1_2 = amendBuilder().add("c.txt", "2").create();
+    pushHead(testRepo, "refs/for/master", false);
+    PatchSet.Id ps1_2 = getPatchSetId(c1_2);
+
+    for (PatchSet.Id ps : ImmutableList.of(ps2_1, ps1_1)) {
+      assertRelated(ps, changeAndCommit(ps2_1, c2_1, 1), changeAndCommit(ps1_1, c1_1, 2));
+    }
+
+    assertRelated(ps1_2, changeAndCommit(ps2_1, c2_1, 1), changeAndCommit(ps1_2, c1_2, 2));
+  }
+
+  @Test
+  public void getRelatedReorderAndExtend() throws Exception {
+    // 1,1---2,1
+    //
+    // 2,2---1,2---3,1
+
+    // Create two commits and push.
+    ObjectId initial = repo().exactRef("HEAD").getObjectId();
+    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
+    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
+    pushHead(testRepo, "refs/for/master", false);
+    PatchSet.Id ps1_1 = getPatchSetId(c1_1);
+    PatchSet.Id ps2_1 = getPatchSetId(c2_1);
+
+    // Swap the order of commits, create a new commit on top, and push again.
+    testRepo.reset(initial);
+    RevCommit c2_2 = testRepo.cherryPick(c2_1);
+    RevCommit c1_2 = testRepo.cherryPick(c1_1);
+    RevCommit c3_1 = commitBuilder().add("c.txt", "3").message("subject: 3").create();
+    pushHead(testRepo, "refs/for/master", false);
+    PatchSet.Id ps1_2 = getPatchSetId(c1_1);
+    PatchSet.Id ps2_2 = getPatchSetId(c2_1);
+    PatchSet.Id ps3_1 = getPatchSetId(c3_1);
+
+    for (PatchSet.Id ps : ImmutableList.of(ps3_1, ps2_2, ps1_2)) {
+      assertRelated(
+          ps,
+          changeAndCommit(ps3_1, c3_1, 1),
+          changeAndCommit(ps1_2, c1_2, 2),
+          changeAndCommit(ps2_2, c2_2, 2));
+    }
+
+    for (PatchSet.Id ps : ImmutableList.of(ps2_1, ps1_1)) {
+      assertRelated(
+          ps,
+          changeAndCommit(ps3_1, c3_1, 1),
+          changeAndCommit(ps2_1, c2_1, 2),
+          changeAndCommit(ps1_1, c1_1, 2));
+    }
+  }
+
+  @Test
+  public void getRelatedReworkSeries() throws Exception {
+    // 1,1---2,1---3,1
+    //
+    // 1,2---2,2---3,2
+
+    // Create three commits and push.
+    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
+    RevCommit c2_1 = commitBuilder().add("b.txt", "1").message("subject: 2").create();
+    RevCommit c3_1 = commitBuilder().add("b.txt", "1").message("subject: 3").create();
+    pushHead(testRepo, "refs/for/master", false);
+    PatchSet.Id ps1_1 = getPatchSetId(c1_1);
+    PatchSet.Id ps2_1 = getPatchSetId(c2_1);
+    PatchSet.Id ps3_1 = getPatchSetId(c3_1);
+
+    // Amend all changes change and push.
+    testRepo.reset(c1_1);
+    RevCommit c1_2 = amendBuilder().add("a.txt", "2").create();
+    RevCommit c2_2 =
+        commitBuilder().add("b.txt", "2").message(parseBody(c2_1).getFullMessage()).create();
+    RevCommit c3_2 =
+        commitBuilder().add("b.txt", "3").message(parseBody(c3_1).getFullMessage()).create();
+    pushHead(testRepo, "refs/for/master", false);
+    PatchSet.Id ps1_2 = getPatchSetId(c1_2);
+    PatchSet.Id ps2_2 = getPatchSetId(c2_2);
+    PatchSet.Id ps3_2 = getPatchSetId(c3_2);
+
+    for (PatchSet.Id ps : ImmutableList.of(ps1_1, ps2_1, ps3_1)) {
+      assertRelated(
+          ps,
+          changeAndCommit(ps3_1, c3_1, 2),
+          changeAndCommit(ps2_1, c2_1, 2),
+          changeAndCommit(ps1_1, c1_1, 2));
+    }
+
+    for (PatchSet.Id ps : ImmutableList.of(ps1_2, ps2_2, ps3_2)) {
+      assertRelated(
+          ps,
+          changeAndCommit(ps3_2, c3_2, 2),
+          changeAndCommit(ps2_2, c2_2, 2),
+          changeAndCommit(ps1_2, c1_2, 2));
+    }
+  }
+
+  @Test
+  public void getRelatedReworkThenExtendInTheMiddleOfSeries() throws Exception {
+    // 1,1---2,1---3,1
+    //
+    // 1,2---2,2---3,2
+    //   \---4,1
+
+    // Create three commits and push.
+    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
+    RevCommit c2_1 = commitBuilder().add("b.txt", "1").message("subject: 2").create();
+    RevCommit c3_1 = commitBuilder().add("b.txt", "1").message("subject: 3").create();
+    pushHead(testRepo, "refs/for/master", false);
+    PatchSet.Id ps1_1 = getPatchSetId(c1_1);
+    PatchSet.Id ps2_1 = getPatchSetId(c2_1);
+    PatchSet.Id ps3_1 = getPatchSetId(c3_1);
+
+    // Amend all changes change and push.
+    testRepo.reset(c1_1);
+    RevCommit c1_2 = amendBuilder().add("a.txt", "2").create();
+    RevCommit c2_2 =
+        commitBuilder().add("b.txt", "2").message(parseBody(c2_1).getFullMessage()).create();
+    RevCommit c3_2 =
+        commitBuilder().add("b.txt", "3").message(parseBody(c3_1).getFullMessage()).create();
+    pushHead(testRepo, "refs/for/master", false);
+    PatchSet.Id ps1_2 = getPatchSetId(c1_2);
+    PatchSet.Id ps2_2 = getPatchSetId(c2_2);
+    PatchSet.Id ps3_2 = getPatchSetId(c3_2);
+
+    // Add one more commit 4,1 based on 1,2.
+    testRepo.reset(c1_2);
+    RevCommit c4_1 = commitBuilder().add("d.txt", "4").message("subject: 4").create();
+    pushHead(testRepo, "refs/for/master", false);
+    PatchSet.Id ps4_1 = getPatchSetId(c4_1);
+
+    // 1,1 is related indirectly to 4,1.
+    assertRelated(
+        ps1_1,
+        changeAndCommit(ps4_1, c4_1, 1),
+        changeAndCommit(ps3_1, c3_1, 2),
+        changeAndCommit(ps2_1, c2_1, 2),
+        changeAndCommit(ps1_1, c1_1, 2));
+
+    // 2,1 and 3,1 don't include 4,1 since we don't walk forward after walking
+    // backward.
+    for (PatchSet.Id ps : ImmutableList.of(ps2_1, ps3_1)) {
+      assertRelated(
+          ps,
+          changeAndCommit(ps3_1, c3_1, 2),
+          changeAndCommit(ps2_1, c2_1, 2),
+          changeAndCommit(ps1_1, c1_1, 2));
+    }
+
+    // 1,2 is related directly to 4,1, and the 2-3 parallel branch stays intact.
+    assertRelated(
+        ps1_2,
+        changeAndCommit(ps4_1, c4_1, 1),
+        changeAndCommit(ps3_2, c3_2, 2),
+        changeAndCommit(ps2_2, c2_2, 2),
+        changeAndCommit(ps1_2, c1_2, 2));
+
+    // 4,1 is only related to 1,2, since we don't walk forward after walking
+    // backward.
+    assertRelated(ps4_1, changeAndCommit(ps4_1, c4_1, 1), changeAndCommit(ps1_2, c1_2, 2));
+
+    // 2,2 and 3,2 don't include 4,1 since we don't walk forward after walking
+    // backward.
+    for (PatchSet.Id ps : ImmutableList.of(ps2_2, ps3_2)) {
+      assertRelated(
+          ps,
+          changeAndCommit(ps3_2, c3_2, 2),
+          changeAndCommit(ps2_2, c2_2, 2),
+          changeAndCommit(ps1_2, c1_2, 2));
+    }
+  }
+
+  @Test
+  public void getRelatedCrissCrossDependency() throws Exception {
+    // 1,1---2,1---3,2
+    //
+    // 1,2---2,2---3,1
+
+    // Create two commits and push.
+    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
+    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
+    pushHead(testRepo, "refs/for/master", false);
+    PatchSet.Id ps1_1 = getPatchSetId(c1_1);
+    PatchSet.Id ps2_1 = getPatchSetId(c2_1);
+
+    // Amend both changes change and push.
+    testRepo.reset(c1_1);
+    RevCommit c1_2 = amendBuilder().add("a.txt", "2").create();
+    RevCommit c2_2 =
+        commitBuilder().add("b.txt", "2").message(parseBody(c2_1).getFullMessage()).create();
+    pushHead(testRepo, "refs/for/master", false);
+    PatchSet.Id ps1_2 = getPatchSetId(c1_2);
+    PatchSet.Id ps2_2 = getPatchSetId(c2_2);
+
+    // PS 3,1 depends on 2,2.
+    RevCommit c3_1 = commitBuilder().add("c.txt", "1").message("subject: 3").create();
+    pushHead(testRepo, "refs/for/master", false);
+    PatchSet.Id ps3_1 = getPatchSetId(c3_1);
+
+    // PS 3,2 depends on 2,1.
+    testRepo.reset(c2_1);
+    RevCommit c3_2 =
+        commitBuilder().add("c.txt", "2").message(parseBody(c3_1).getFullMessage()).create();
+    pushHead(testRepo, "refs/for/master", false);
+    PatchSet.Id ps3_2 = getPatchSetId(c3_2);
+
+    for (PatchSet.Id ps : ImmutableList.of(ps1_1, ps2_1, ps3_2)) {
+      assertRelated(
+          ps,
+          changeAndCommit(ps3_2, c3_2, 2),
+          changeAndCommit(ps2_1, c2_1, 2),
+          changeAndCommit(ps1_1, c1_1, 2));
+    }
+
+    for (PatchSet.Id ps : ImmutableList.of(ps1_2, ps2_2, ps3_1)) {
+      assertRelated(
+          ps,
+          changeAndCommit(ps3_1, c3_1, 2),
+          changeAndCommit(ps2_2, c2_2, 2),
+          changeAndCommit(ps1_2, c1_2, 2));
+    }
+  }
+
+  @Test
+  public void getRelatedParallelDescendentBranches() throws Exception {
+    // 1,1---2,1---3,1
+    //   \---4,1---5,1
+    //    \--6,1---7,1
+
+    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
+    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
+    RevCommit c3_1 = commitBuilder().add("c.txt", "3").message("subject: 3").create();
+    pushHead(testRepo, "refs/for/master", false);
+    PatchSet.Id ps1_1 = getPatchSetId(c1_1);
+    PatchSet.Id ps2_1 = getPatchSetId(c2_1);
+    PatchSet.Id ps3_1 = getPatchSetId(c3_1);
+
+    testRepo.reset(c1_1);
+    RevCommit c4_1 = commitBuilder().add("d.txt", "4").message("subject: 4").create();
+    RevCommit c5_1 = commitBuilder().add("e.txt", "5").message("subject: 5").create();
+    pushHead(testRepo, "refs/for/master", false);
+    PatchSet.Id ps4_1 = getPatchSetId(c4_1);
+    PatchSet.Id ps5_1 = getPatchSetId(c5_1);
+
+    testRepo.reset(c1_1);
+    RevCommit c6_1 = commitBuilder().add("f.txt", "6").message("subject: 6").create();
+    RevCommit c7_1 = commitBuilder().add("g.txt", "7").message("subject: 7").create();
+    pushHead(testRepo, "refs/for/master", false);
+    PatchSet.Id ps6_1 = getPatchSetId(c6_1);
+    PatchSet.Id ps7_1 = getPatchSetId(c7_1);
+
+    // All changes are related to 1,1, keeping each of the parallel branches
+    // intact.
+    assertRelated(
+        ps1_1,
+        changeAndCommit(ps7_1, c7_1, 1),
+        changeAndCommit(ps6_1, c6_1, 1),
+        changeAndCommit(ps5_1, c5_1, 1),
+        changeAndCommit(ps4_1, c4_1, 1),
+        changeAndCommit(ps3_1, c3_1, 1),
+        changeAndCommit(ps2_1, c2_1, 1),
+        changeAndCommit(ps1_1, c1_1, 1));
+
+    // The 2-3 branch is only related back to 1, not the other branches.
+    for (PatchSet.Id ps : ImmutableList.of(ps2_1, ps3_1)) {
+      assertRelated(
+          ps,
+          changeAndCommit(ps3_1, c3_1, 1),
+          changeAndCommit(ps2_1, c2_1, 1),
+          changeAndCommit(ps1_1, c1_1, 1));
+    }
+
+    // The 4-5 branch is only related back to 1, not the other branches.
+    for (PatchSet.Id ps : ImmutableList.of(ps4_1, ps5_1)) {
+      assertRelated(
+          ps,
+          changeAndCommit(ps5_1, c5_1, 1),
+          changeAndCommit(ps4_1, c4_1, 1),
+          changeAndCommit(ps1_1, c1_1, 1));
+    }
+
+    // The 6-7 branch is only related back to 1, not the other branches.
+    for (PatchSet.Id ps : ImmutableList.of(ps6_1, ps7_1)) {
+      assertRelated(
+          ps,
+          changeAndCommit(ps7_1, c7_1, 1),
+          changeAndCommit(ps6_1, c6_1, 1),
+          changeAndCommit(ps1_1, c1_1, 1));
+    }
+  }
+
+  @Test
+  public void getRelatedEdit() throws Exception {
+    // 1,1---2,1---3,1
+    //   \---2,E---/
+
+    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
+    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
+    RevCommit c3_1 = commitBuilder().add("c.txt", "3").message("subject: 3").create();
+    pushHead(testRepo, "refs/for/master", false);
+
+    Change ch2 = getChange(c2_1).change();
+    String changeId2 = ch2.getKey().get();
+    gApi.changes().id(changeId2).edit().create();
+    gApi.changes().id(changeId2).edit().modifyFile("a.txt", RawInputUtil.create(new byte[] {'a'}));
+    Optional<EditInfo> edit = getEdit(changeId2);
+    assertThat(edit).isPresent();
+    ObjectId editRev = ObjectId.fromString(edit.get().commit.commit);
+
+    PatchSet.Id ps1_1 = getPatchSetId(c1_1);
+    PatchSet.Id ps2_1 = getPatchSetId(c2_1);
+    PatchSet.Id ps2_edit = new PatchSet.Id(ch2.getId(), 0);
+    PatchSet.Id ps3_1 = getPatchSetId(c3_1);
+
+    for (PatchSet.Id ps : ImmutableList.of(ps1_1, ps2_1, ps3_1)) {
+      assertRelated(
+          ps,
+          changeAndCommit(ps3_1, c3_1, 1),
+          changeAndCommit(ps2_1, c2_1, 1),
+          changeAndCommit(ps1_1, c1_1, 1));
+    }
+
+    assertRelated(
+        ps2_edit,
+        changeAndCommit(ps3_1, c3_1, 1),
+        changeAndCommit(new PatchSet.Id(ch2.getId(), 0), editRev, 1),
+        changeAndCommit(ps1_1, c1_1, 1));
+  }
+
+  @Test
+  public void pushNewPatchSetWhenParentHasNullGroup() throws Exception {
+    // 1,1---2,1
+    //   \---2,2
+
+    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
+    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
+    pushHead(testRepo, "refs/for/master", false);
+    PatchSet.Id psId1_1 = getPatchSetId(c1_1);
+    PatchSet.Id psId2_1 = getPatchSetId(c2_1);
+
+    for (PatchSet.Id psId : ImmutableList.of(psId1_1, psId2_1)) {
+      assertRelated(psId, changeAndCommit(psId2_1, c2_1, 1), changeAndCommit(psId1_1, c1_1, 1));
+    }
+
+    // Pretend PS1,1 was pushed before the groups field was added.
+    clearGroups(psId1_1);
+    indexer.index(changeDataFactory.create(db, project, psId1_1.getParentKey()));
+
+    // PS1,1 has no groups, so disappeared from related changes.
+    assertRelated(psId2_1);
+
+    RevCommit c2_2 = testRepo.amend(c2_1).add("c.txt", "2").create();
+    testRepo.reset(c2_2);
+    pushHead(testRepo, "refs/for/master", false);
+    PatchSet.Id psId2_2 = getPatchSetId(c2_2);
+
+    // Push updated the group for PS1,1, so it shows up in related changes even
+    // though a new patch set was not pushed.
+    assertRelated(psId2_2, changeAndCommit(psId2_2, c2_2, 2), changeAndCommit(psId1_1, c1_1, 1));
+  }
+
+  @Test
+  @GerritConfig(name = "index.autoReindexIfStale", value = "false")
+  public void getRelatedForStaleChange() throws Exception {
+    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
+
+    RevCommit c2_1 = commitBuilder().add("b.txt", "1").message("subject: 1").create();
+    pushHead(testRepo, "refs/for/master", false);
+
+    RevCommit c2_2 = testRepo.amend(c2_1).add("b.txt", "2").create();
+    testRepo.reset(c2_2);
+
+    disableChangeIndexWrites();
+    try {
+      pushHead(testRepo, "refs/for/master", false);
+    } finally {
+      enableChangeIndexWrites();
+    }
+
+    PatchSet.Id psId1_1 = getPatchSetId(c1_1);
+    PatchSet.Id psId2_1 = getPatchSetId(c2_1);
+    PatchSet.Id psId2_2 = new PatchSet.Id(psId2_1.changeId, psId2_1.get() + 1);
+
+    assertRelated(psId2_2, changeAndCommit(psId2_2, c2_2, 2), changeAndCommit(psId1_1, c1_1, 1));
+  }
+
+  @Test
+  public void getRelatedManyGroups() throws Exception {
+    List<RevCommit> commits = new ArrayList<>();
+    RevCommit last = null;
+    int n = 2 * MAX_TERMS;
+    assertThat(n).isGreaterThan(indexConfig.maxTerms());
+    for (int i = 1; i <= n; i++) {
+      TestRepository<?>.CommitBuilder cb = last != null ? amendBuilder() : commitBuilder();
+      last = cb.add("a.txt", Integer.toString(i)).message("subject: " + i).create();
+      testRepo.reset(last);
+      assertPushOk(pushHead(testRepo, "refs/for/master", false), "refs/for/master");
+      commits.add(last);
+    }
+
+    ChangeData cd = getChange(last);
+    assertThat(cd.patchSets()).hasSize(n);
+    assertThat(GetRelated.getAllGroups(cd.notes(), db, psUtil)).hasSize(n);
+
+    assertRelated(cd.change().currentPatchSetId());
+  }
+
+  private List<RelatedChangeAndCommitInfo> getRelated(PatchSet.Id ps) throws Exception {
+    return getRelated(ps.getParentKey(), ps.get());
+  }
+
+  private List<RelatedChangeAndCommitInfo> getRelated(Change.Id changeId, int ps) throws Exception {
+    return gApi.changes().id(changeId.get()).revision(ps).related().changes;
+  }
+
+  private RevCommit parseBody(RevCommit c) throws Exception {
+    testRepo.getRevWalk().parseBody(c);
+    return c;
+  }
+
+  private PatchSet.Id getPatchSetId(ObjectId c) throws Exception {
+    return getChange(c).change().currentPatchSetId();
+  }
+
+  private ChangeData getChange(ObjectId c) throws Exception {
+    return Iterables.getOnlyElement(queryProvider.get().byCommit(c));
+  }
+
+  private RelatedChangeAndCommitInfo changeAndCommit(
+      PatchSet.Id psId, ObjectId commitId, int currentRevisionNum) {
+    RelatedChangeAndCommitInfo result = new RelatedChangeAndCommitInfo();
+    result.project = project.get();
+    result._changeNumber = psId.getParentKey().get();
+    result.commit = new CommitInfo();
+    result.commit.commit = commitId.name();
+    result._revisionNumber = psId.get();
+    result._currentRevisionNumber = currentRevisionNum;
+    result.status = "NEW";
+    return result;
+  }
+
+  private void clearGroups(PatchSet.Id psId) throws Exception {
+    try (BatchUpdate bu = batchUpdateFactory.create(db, project, user(user), TimeUtil.nowTs())) {
+      bu.addOp(
+          psId.getParentKey(),
+          new BatchUpdateOp() {
+            @Override
+            public boolean updateChange(ChangeContext ctx) throws OrmException {
+              PatchSet ps = psUtil.get(ctx.getDb(), ctx.getNotes(), psId);
+              psUtil.setGroups(ctx.getDb(), ctx.getUpdate(psId), ps, ImmutableList.<String>of());
+              ctx.dontBumpLastUpdatedOn();
+              return true;
+            }
+          });
+      bu.execute();
+    }
+  }
+
+  private void assertRelated(PatchSet.Id psId, RelatedChangeAndCommitInfo... expected)
+      throws Exception {
+    List<RelatedChangeAndCommitInfo> actual = getRelated(psId);
+    assertThat(actual).named("related to " + psId).hasSize(expected.length);
+    for (int i = 0; i < actual.size(); i++) {
+      String name = "index " + i + " related to " + psId;
+      RelatedChangeAndCommitInfo a = actual.get(i);
+      RelatedChangeAndCommitInfo e = expected[i];
+      assertThat(a.project).named("project of " + name).isEqualTo(e.project);
+      assertThat(a._changeNumber).named("change ID of " + name).isEqualTo(e._changeNumber);
+      // Don't bother checking changeId; assume _changeNumber is sufficient.
+      assertThat(a._revisionNumber).named("revision of " + name).isEqualTo(e._revisionNumber);
+      assertThat(a.commit.commit).named("commit of " + name).isEqualTo(e.commit.commit);
+      assertThat(a._currentRevisionNumber)
+          .named("current revision of " + name)
+          .isEqualTo(e._currentRevisionNumber);
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/server/change/PatchListCacheIT.java b/javatests/com/google/gerrit/acceptance/server/change/PatchListCacheIT.java
new file mode 100644
index 0000000..1892566
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/server/change/PatchListCacheIT.java
@@ -0,0 +1,305 @@
+// Copyright (C) 2014 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.google.gerrit.acceptance.server.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.acceptance.GitUtil.getChangeId;
+import static com.google.gerrit.acceptance.GitUtil.pushHead;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.cache.Cache;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.reviewdb.client.Patch.ChangeType;
+import com.google.gerrit.server.patch.IntraLineDiff;
+import com.google.gerrit.server.patch.IntraLineDiffArgs;
+import com.google.gerrit.server.patch.IntraLineDiffKey;
+import com.google.gerrit.server.patch.PatchList;
+import com.google.gerrit.server.patch.PatchListCache;
+import com.google.gerrit.server.patch.PatchListCacheImpl;
+import com.google.gerrit.server.patch.PatchListEntry;
+import com.google.gerrit.server.patch.PatchListKey;
+import com.google.gerrit.server.patch.Text;
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import org.eclipse.jgit.diff.Edit;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.junit.Test;
+
+@NoHttpd
+public class PatchListCacheIT extends AbstractDaemonTest {
+  private static String SUBJECT_1 = "subject 1";
+  private static String SUBJECT_2 = "subject 2";
+  private static String SUBJECT_3 = "subject 3";
+  private static String FILE_A = "a.txt";
+  private static String FILE_B = "b.txt";
+  private static String FILE_C = "c.txt";
+  private static String FILE_D = "d.txt";
+
+  @Inject private PatchListCache patchListCache;
+
+  @Inject
+  @Named("diff")
+  private Cache<PatchListKey, PatchList> abstractPatchListCache;
+
+  @Test
+  public void listPatchesAgainstBase() throws Exception {
+    commitBuilder().add(FILE_D, "4").message(SUBJECT_1).create();
+    pushHead(testRepo, "refs/heads/master", false);
+
+    // Change 1, 1 (+FILE_A, -FILE_D)
+    RevCommit c =
+        commitBuilder().add(FILE_A, "1").rm(FILE_D).message(SUBJECT_2).insertChangeId().create();
+    String id = getChangeId(testRepo, c).get();
+    pushHead(testRepo, "refs/for/master", false);
+
+    // Compare Change 1,1 with Base (+FILE_A, -FILE_D)
+    List<PatchListEntry> entries = getCurrentPatches(id);
+    assertThat(entries).hasSize(3);
+    assertAdded(Patch.COMMIT_MSG, entries.get(0));
+    assertAdded(FILE_A, entries.get(1));
+    assertDeleted(FILE_D, entries.get(2));
+
+    // Change 1,2 (+FILE_A, +FILE_B, -FILE_D)
+    amendBuilder().add(FILE_B, "2").create();
+    pushHead(testRepo, "refs/for/master", false);
+    entries = getCurrentPatches(id);
+
+    // Compare Change 1,2 with Base (+FILE_A, +FILE_B, -FILE_D)
+    assertThat(entries).hasSize(4);
+    assertAdded(Patch.COMMIT_MSG, entries.get(0));
+    assertAdded(FILE_A, entries.get(1));
+    assertAdded(FILE_B, entries.get(2));
+    assertDeleted(FILE_D, entries.get(3));
+  }
+
+  @Test
+  public void listPatchesAgainstBaseWithRebase() throws Exception {
+    commitBuilder().add(FILE_D, "4").message(SUBJECT_1).create();
+    pushHead(testRepo, "refs/heads/master", false);
+
+    // Change 1,1 (+FILE_A, -FILE_D)
+    RevCommit c = commitBuilder().add(FILE_A, "1").rm(FILE_D).message(SUBJECT_2).create();
+    String id = getChangeId(testRepo, c).get();
+    pushHead(testRepo, "refs/for/master", false);
+    List<PatchListEntry> entries = getCurrentPatches(id);
+    assertThat(entries).hasSize(3);
+    assertAdded(Patch.COMMIT_MSG, entries.get(0));
+    assertAdded(FILE_A, entries.get(1));
+    assertDeleted(FILE_D, entries.get(2));
+
+    // Change 2,1 (+FILE_B)
+    testRepo.reset("HEAD~1");
+    commitBuilder().add(FILE_B, "2").message(SUBJECT_3).create();
+    pushHead(testRepo, "refs/for/master", false);
+
+    // Change 1,2 (+FILE_A, -FILE_D))
+    testRepo.cherryPick(c);
+    pushHead(testRepo, "refs/for/master", false);
+
+    // Compare Change 1,2 with Base (+FILE_A, -FILE_D))
+    entries = getCurrentPatches(id);
+    assertThat(entries).hasSize(3);
+    assertAdded(Patch.COMMIT_MSG, entries.get(0));
+    assertAdded(FILE_A, entries.get(1));
+    assertDeleted(FILE_D, entries.get(2));
+  }
+
+  @Test
+  public void listPatchesAgainstOtherPatchSet() throws Exception {
+    commitBuilder().add(FILE_D, "4").message(SUBJECT_1).create();
+    pushHead(testRepo, "refs/heads/master", false);
+
+    // Change 1,1 (+FILE_A, +FILE_C, -FILE_D)
+    RevCommit a =
+        commitBuilder().add(FILE_A, "1").add(FILE_C, "3").rm(FILE_D).message(SUBJECT_2).create();
+    pushHead(testRepo, "refs/for/master", false);
+
+    // Change 1,2 (+FILE_A, +FILE_B, -FILE_D)
+    RevCommit b = amendBuilder().add(FILE_B, "2").rm(FILE_C).create();
+    pushHead(testRepo, "refs/for/master", false);
+
+    // Compare Change 1,1 with Change 1,2 (+FILE_B, -FILE_C)
+    List<PatchListEntry> entries = getPatches(a, b);
+    assertThat(entries).hasSize(3);
+    assertModified(Patch.COMMIT_MSG, entries.get(0));
+    assertAdded(FILE_B, entries.get(1));
+    assertDeleted(FILE_C, entries.get(2));
+
+    // Compare Change 1,2 with Change 1,1 (-FILE_B, +FILE_C)
+    List<PatchListEntry> entriesReverse = getPatches(b, a);
+    assertThat(entriesReverse).hasSize(3);
+    assertModified(Patch.COMMIT_MSG, entriesReverse.get(0));
+    assertDeleted(FILE_B, entriesReverse.get(1));
+    assertAdded(FILE_C, entriesReverse.get(2));
+  }
+
+  @Test
+  public void listPatchesAgainstOtherPatchSetWithRebase() throws Exception {
+    commitBuilder().add(FILE_D, "4").message(SUBJECT_1).create();
+    pushHead(testRepo, "refs/heads/master", false);
+
+    // Change 1,1 (+FILE_A, -FILE_D)
+    RevCommit a = commitBuilder().add(FILE_A, "1").rm(FILE_D).message(SUBJECT_2).create();
+    pushHead(testRepo, "refs/for/master", false);
+
+    // Change 2,1 (+FILE_B)
+    testRepo.reset("HEAD~1");
+    commitBuilder().add(FILE_B, "2").message(SUBJECT_3).create();
+    pushHead(testRepo, "refs/for/master", false);
+
+    // Change 1,2 (+FILE_A, +FILE_C, -FILE_D)
+    testRepo.cherryPick(a);
+    RevCommit b = amendBuilder().add(FILE_C, "2").create();
+    pushHead(testRepo, "refs/for/master", false);
+
+    // Compare Change 1,1 with Change 1,2 (+FILE_C)
+    List<PatchListEntry> entries = getPatches(a, b);
+    assertThat(entries).hasSize(2);
+    assertModified(Patch.COMMIT_MSG, entries.get(0));
+    assertAdded(FILE_C, entries.get(1));
+
+    // Compare Change 1,2 with Change 1,1 (-FILE_C)
+    List<PatchListEntry> entriesReverse = getPatches(b, a);
+    assertThat(entriesReverse).hasSize(2);
+    assertModified(Patch.COMMIT_MSG, entriesReverse.get(0));
+    assertDeleted(FILE_C, entriesReverse.get(1));
+  }
+
+  @Test
+  public void harmfulMutationsOfEditsAreNotPossibleForPatchListEntry() throws Exception {
+    RevCommit commit =
+        commitBuilder().add("a.txt", "First line\nSecond line\n").message(SUBJECT_1).create();
+    pushHead(testRepo, "refs/heads/master", false);
+
+    PatchListKey diffKey = PatchListKey.againstDefaultBase(commit.copy(), Whitespace.IGNORE_NONE);
+    PatchList patchList = patchListCache.get(diffKey, project);
+
+    PatchListEntry patchListEntry = getEntryFor(patchList, "a.txt");
+    Edit outputEdit = Iterables.getOnlyElement(patchListEntry.getEdits());
+    Edit originalEdit =
+        new Edit(
+            outputEdit.getBeginA(),
+            outputEdit.getEndA(),
+            outputEdit.getBeginB(),
+            outputEdit.getEndB());
+
+    outputEdit.shift(5);
+
+    assertThat(patchListEntry.getEdits()).containsExactly(originalEdit);
+  }
+
+  @Test
+  public void harmfulMutationsOfEditsAreNotPossibleForIntraLineDiffArgsAndCachedValue() {
+    String a = "First line\nSecond line\n";
+    String b = "1st line\n2nd line\n";
+    Text aText = new Text(a.getBytes(UTF_8));
+    Text bText = new Text(b.getBytes(UTF_8));
+    Edit inputEdit = new Edit(0, 2, 0, 2);
+    List<Edit> inputEdits = new ArrayList<>(ImmutableList.of(inputEdit));
+    Set<Edit> inputEditsDueToRebase = new HashSet<>(ImmutableSet.of(inputEdit));
+
+    IntraLineDiffKey diffKey =
+        IntraLineDiffKey.create(ObjectId.zeroId(), ObjectId.zeroId(), Whitespace.IGNORE_NONE);
+    IntraLineDiffArgs diffArgs =
+        IntraLineDiffArgs.create(
+            aText,
+            bText,
+            inputEdits,
+            inputEditsDueToRebase,
+            project,
+            ObjectId.zeroId(),
+            "file.txt");
+    IntraLineDiff intraLineDiff = patchListCache.getIntraLineDiff(diffKey, diffArgs);
+
+    Edit outputEdit = Iterables.getOnlyElement(intraLineDiff.getEdits());
+
+    outputEdit.shift(5);
+    inputEdit.shift(7);
+    inputEdits.add(new Edit(43, 47, 50, 51));
+    inputEditsDueToRebase.add(new Edit(53, 57, 60, 61));
+
+    Edit originalEdit = new Edit(0, 2, 0, 2);
+    assertThat(diffArgs.edits()).containsExactly(originalEdit);
+    assertThat(diffArgs.editsDueToRebase()).containsExactly(originalEdit);
+    assertThat(intraLineDiff.getEdits()).containsExactly(originalEdit);
+  }
+
+  @Test
+  public void largeObjectTombstoneGetsCached() {
+    PatchListKey key = PatchListKey.againstDefaultBase(ObjectId.zeroId(), Whitespace.IGNORE_ALL);
+    PatchListCacheImpl.LargeObjectTombstone tombstone =
+        new PatchListCacheImpl.LargeObjectTombstone();
+    abstractPatchListCache.put(key, tombstone);
+    assertThat(abstractPatchListCache.getIfPresent(key)).isSameAs(tombstone);
+  }
+
+  private static void assertAdded(String expectedNewName, PatchListEntry e) {
+    assertName(expectedNewName, e);
+    assertThat(e.getChangeType()).isEqualTo(ChangeType.ADDED);
+  }
+
+  private static void assertModified(String expectedNewName, PatchListEntry e) {
+    assertName(expectedNewName, e);
+    assertThat(e.getChangeType()).isEqualTo(ChangeType.MODIFIED);
+  }
+
+  private static void assertDeleted(String expectedNewName, PatchListEntry e) {
+    assertName(expectedNewName, e);
+    assertThat(e.getChangeType()).isEqualTo(ChangeType.DELETED);
+  }
+
+  private static void assertName(String expectedNewName, PatchListEntry e) {
+    assertThat(e.getNewName()).isEqualTo(expectedNewName);
+    assertThat(e.getOldName()).isNull();
+  }
+
+  private List<PatchListEntry> getCurrentPatches(String changeId) throws Exception {
+    return patchListCache.get(getKey(null, getCurrentRevisionId(changeId)), project).getPatches();
+  }
+
+  private List<PatchListEntry> getPatches(ObjectId revisionIdA, ObjectId revisionIdB)
+      throws Exception {
+    return patchListCache.get(getKey(revisionIdA, revisionIdB), project).getPatches();
+  }
+
+  private PatchListKey getKey(ObjectId revisionIdA, ObjectId revisionIdB) {
+    return PatchListKey.againstCommit(revisionIdA, revisionIdB, Whitespace.IGNORE_NONE);
+  }
+
+  private ObjectId getCurrentRevisionId(String changeId) throws Exception {
+    return ObjectId.fromString(gApi.changes().id(changeId).get().currentRevision);
+  }
+
+  private static PatchListEntry getEntryFor(PatchList patchList, String filePath) {
+    Optional<PatchListEntry> patchListEntry =
+        patchList.getPatches().stream()
+            .filter(entry -> entry.getNewName().equals(filePath))
+            .findAny();
+    return patchListEntry.orElseThrow(
+        () -> new IllegalStateException("No PatchListEntry for " + filePath + " exists"));
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/server/change/SubmittedTogetherIT.java b/javatests/com/google/gerrit/acceptance/server/change/SubmittedTogetherIT.java
new file mode 100644
index 0000000..304a1e4
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/server/change/SubmittedTogetherIT.java
@@ -0,0 +1,307 @@
+// Copyright (C) 2015 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.google.gerrit.acceptance.server.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.acceptance.GitUtil.pushHead;
+import static com.google.gerrit.extensions.api.changes.SubmittedTogetherOption.NON_VISIBLE_CHANGES;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.GitUtil;
+import com.google.gerrit.acceptance.TestProjectInput;
+import com.google.gerrit.extensions.api.changes.SubmittedTogetherInfo;
+import com.google.gerrit.extensions.client.ChangeStatus;
+import com.google.gerrit.extensions.client.ListChangesOption;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.extensions.common.FileInfo;
+import com.google.gerrit.extensions.common.RevisionInfo;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.testing.ConfigSuite;
+import java.util.EnumSet;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.junit.Test;
+
+public class SubmittedTogetherIT extends AbstractDaemonTest {
+  @ConfigSuite.Config
+  public static Config submitWholeTopicEnabled() {
+    return submitWholeTopicEnabledConfig();
+  }
+
+  @Test
+  public void doesNotIncludeCurrentFiles() throws Exception {
+    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
+    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
+    String id2 = getChangeId(c2_1);
+    pushHead(testRepo, "refs/for/master", false);
+
+    SubmittedTogetherInfo info =
+        gApi.changes().id(id2).submittedTogether(EnumSet.of(NON_VISIBLE_CHANGES));
+    assertThat(info.changes).hasSize(2);
+    assertThat(info.changes.get(0).currentRevision).isEqualTo(c2_1.name());
+    assertThat(info.changes.get(1).currentRevision).isEqualTo(c1_1.name());
+
+    RevisionInfo rev = info.changes.get(0).revisions.get(c2_1.name());
+    assertThat(rev.files).isNull();
+  }
+
+  @Test
+  public void returnsCurrentFilesIfOptionRequested() throws Exception {
+    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
+    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
+    String id2 = getChangeId(c2_1);
+    pushHead(testRepo, "refs/for/master", false);
+
+    SubmittedTogetherInfo info =
+        gApi.changes()
+            .id(id2)
+            .submittedTogether(
+                EnumSet.of(ListChangesOption.CURRENT_FILES), EnumSet.of(NON_VISIBLE_CHANGES));
+    assertThat(info.changes).hasSize(2);
+    assertThat(info.changes.get(0).currentRevision).isEqualTo(c2_1.name());
+    assertThat(info.changes.get(1).currentRevision).isEqualTo(c1_1.name());
+
+    RevisionInfo rev = info.changes.get(0).revisions.get(c2_1.name());
+    assertThat(rev).isNotNull();
+    FileInfo file = rev.files.get("b.txt");
+    assertThat(file).isNotNull();
+    assertThat(file.status).isEqualTo('A');
+  }
+
+  @Test
+  public void returnsAncestors() throws Exception {
+    // Create two commits and push.
+    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
+    String id1 = getChangeId(c1_1);
+    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
+    String id2 = getChangeId(c2_1);
+    pushHead(testRepo, "refs/for/master", false);
+
+    assertSubmittedTogether(id1);
+    assertSubmittedTogether(id2, id2, id1);
+  }
+
+  @Test
+  public void anonymousAncestors() throws Exception {
+    RevCommit a = commitBuilder().add("a", "1").message("change 1").create();
+    RevCommit b = commitBuilder().add("b", "1").message("change 2").create();
+    pushHead(testRepo, "refs/for/master", false);
+
+    setApiUserAnonymous();
+    assertSubmittedTogether(getChangeId(a));
+    assertSubmittedTogether(getChangeId(b), getChangeId(b), getChangeId(a));
+  }
+
+  @Test
+  public void respectWholeTopic() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+    // Create two independent commits and push.
+    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
+    String id1 = getChangeId(c1_1);
+    pushHead(testRepo, "refs/for/master/" + name("connectingTopic"), false);
+
+    testRepo.reset(initialHead);
+    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
+    String id2 = getChangeId(c2_1);
+    pushHead(testRepo, "refs/for/master/" + name("connectingTopic"), false);
+
+    if (isSubmitWholeTopicEnabled()) {
+      assertSubmittedTogether(id1, id2, id1);
+      assertSubmittedTogether(id2, id2, id1);
+    } else {
+      assertSubmittedTogether(id1);
+      assertSubmittedTogether(id2);
+    }
+  }
+
+  @Test
+  public void anonymousWholeTopic() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+    RevCommit a = commitBuilder().add("a", "1").message("change 1").create();
+    pushHead(testRepo, "refs/for/master/" + name("topic"), false);
+    String id1 = getChangeId(a);
+
+    testRepo.reset(initialHead);
+    RevCommit b = commitBuilder().add("b", "1").message("change 2").create();
+    pushHead(testRepo, "refs/for/master/" + name("topic"), false);
+    String id2 = getChangeId(b);
+
+    setApiUserAnonymous();
+    if (isSubmitWholeTopicEnabled()) {
+      assertSubmittedTogether(id1, id2, id1);
+      assertSubmittedTogether(id2, id2, id1);
+    } else {
+      assertSubmittedTogether(id1);
+      assertSubmittedTogether(id2);
+    }
+  }
+
+  @Test
+  public void topicChaining() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+
+    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
+    String id1 = getChangeId(c1_1);
+    pushHead(testRepo, "refs/for/master/" + name("connectingTopic"), false);
+
+    testRepo.reset(initialHead);
+    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
+    String id2 = getChangeId(c2_1);
+    pushHead(testRepo, "refs/for/master/" + name("connectingTopic"), false);
+
+    RevCommit c3_1 = commitBuilder().add("b.txt", "3").message("subject: 3").create();
+    String id3 = getChangeId(c3_1);
+    pushHead(testRepo, "refs/for/master/" + name("unrelated-topic"), false);
+
+    if (isSubmitWholeTopicEnabled()) {
+      assertSubmittedTogether(id1, id2, id1);
+      assertSubmittedTogether(id2, id2, id1);
+      assertSubmittedTogether(id3, id3, id2, id1);
+    } else {
+      assertSubmittedTogether(id1);
+      assertSubmittedTogether(id2);
+      assertSubmittedTogether(id3, id3, id2);
+    }
+  }
+
+  @Test
+  public void respectTopicsOnAncestors() throws Exception {
+    RevCommit initialHead = getRemoteHead();
+
+    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
+    String id1 = getChangeId(c1_1);
+    pushHead(testRepo, "refs/for/master/" + name("connectingTopic"), false);
+
+    testRepo.reset(initialHead);
+    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
+    String id2 = getChangeId(c2_1);
+    pushHead(testRepo, "refs/for/master/" + name("otherConnectingTopic"), false);
+
+    RevCommit c3_1 = commitBuilder().add("b.txt", "3").message("subject: 3").create();
+    String id3 = getChangeId(c3_1);
+    pushHead(testRepo, "refs/for/master/" + name("connectingTopic"), false);
+
+    RevCommit c4_1 = commitBuilder().add("b.txt", "4").message("subject: 4").create();
+    String id4 = getChangeId(c4_1);
+    pushHead(testRepo, "refs/for/master", false);
+
+    testRepo.reset(initialHead);
+    RevCommit c5_1 = commitBuilder().add("c.txt", "5").message("subject: 5").create();
+    String id5 = getChangeId(c5_1);
+    pushHead(testRepo, "refs/for/master", false);
+
+    RevCommit c6_1 = commitBuilder().add("c.txt", "6").message("subject: 6").create();
+    String id6 = getChangeId(c6_1);
+    pushHead(testRepo, "refs/for/master/" + name("otherConnectingTopic"), false);
+
+    if (isSubmitWholeTopicEnabled()) {
+      assertSubmittedTogether(id1, id6, id5, id3, id2, id1);
+      assertSubmittedTogether(id2, id6, id5, id2);
+      assertSubmittedTogether(id3, id6, id5, id3, id2, id1);
+      assertSubmittedTogether(id4, id6, id5, id4, id3, id2, id1);
+      assertSubmittedTogether(id5);
+      assertSubmittedTogether(id6, id6, id5, id2);
+    } else {
+      assertSubmittedTogether(id1);
+      assertSubmittedTogether(id2);
+      assertSubmittedTogether(id3, id3, id2);
+      assertSubmittedTogether(id4, id4, id3, id2);
+      assertSubmittedTogether(id5);
+      assertSubmittedTogether(id6, id6, id5);
+    }
+  }
+
+  @Test
+  public void newBranchTwoChangesTogether() throws Exception {
+    Project.NameKey p1 = createProject("a-new-project", null, false);
+    TestRepository<?> repo1 = cloneProject(p1);
+
+    RevCommit c1 =
+        repo1
+            .branch("HEAD")
+            .commit()
+            .insertChangeId()
+            .add("a.txt", "1")
+            .message("subject: 1")
+            .create();
+    String id1 = GitUtil.getChangeId(repo1, c1).get();
+    pushHead(repo1, "refs/for/master", false);
+
+    RevCommit c2 =
+        repo1
+            .branch("HEAD")
+            .commit()
+            .insertChangeId()
+            .add("b.txt", "2")
+            .message("subject: 2")
+            .create();
+    String id2 = GitUtil.getChangeId(repo1, c2).get();
+    pushHead(repo1, "refs/for/master", false);
+    assertSubmittedTogether(id1);
+    assertSubmittedTogether(id2, id2, id1);
+  }
+
+  @Test
+  @TestProjectInput(submitType = SubmitType.CHERRY_PICK)
+  public void testCherryPickWithoutAncestors() throws Exception {
+    // Create two commits and push.
+    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
+    String id1 = getChangeId(c1_1);
+    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
+    String id2 = getChangeId(c2_1);
+    pushHead(testRepo, "refs/for/master", false);
+
+    assertSubmittedTogether(id1);
+    assertSubmittedTogether(id2);
+  }
+
+  @Test
+  public void submissionIdSavedOnMergeInOneProject() throws Exception {
+    // Create two commits and push.
+    RevCommit c1_1 = commitBuilder().add("a.txt", "1").message("subject: 1").create();
+    String id1 = getChangeId(c1_1);
+    RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create();
+    String id2 = getChangeId(c2_1);
+    pushHead(testRepo, "refs/for/master", false);
+
+    assertSubmittedTogether(id1);
+    assertSubmittedTogether(id2, id2, id1);
+
+    approve(id1);
+    approve(id2);
+    submit(id2);
+    assertMerged(id1);
+    assertMerged(id2);
+
+    // Prior to submission this was empty, but the post-merge value is what was
+    // actually submitted.
+    assertSubmittedTogether(id1, id2, id1);
+
+    assertSubmittedTogether(id2, id2, id1);
+  }
+
+  private String getChangeId(RevCommit c) throws Exception {
+    return GitUtil.getChangeId(testRepo, c).get();
+  }
+
+  private void submit(String changeId) throws Exception {
+    gApi.changes().id(changeId).current().submit();
+  }
+
+  private void assertMerged(String changeId) throws Exception {
+    assertThat(gApi.changes().id(changeId).get().status).isEqualTo(ChangeStatus.MERGED);
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/server/event/BUILD b/javatests/com/google/gerrit/acceptance/server/event/BUILD
new file mode 100644
index 0000000..0db2cd8
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/server/event/BUILD
@@ -0,0 +1,7 @@
+load("//javatests/com/google/gerrit/acceptance:tests.bzl", "acceptance_tests")
+
+acceptance_tests(
+    srcs = glob(["*IT.java"]),
+    group = "server_event",
+    labels = ["server"],
+)
diff --git a/javatests/com/google/gerrit/acceptance/server/event/CommentAddedEventIT.java b/javatests/com/google/gerrit/acceptance/server/event/CommentAddedEventIT.java
new file mode 100644
index 0000000..f4a833f
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/server/event/CommentAddedEventIT.java
@@ -0,0 +1,274 @@
+// 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.
+
+package com.google.gerrit.acceptance.server.event;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.extensions.client.ListChangesOption.DETAILED_LABELS;
+import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
+import static com.google.gerrit.server.project.testing.Util.category;
+import static com.google.gerrit.server.project.testing.Util.value;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.common.ApprovalInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.LabelInfo;
+import com.google.gerrit.extensions.events.CommentAddedListener;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.project.testing.Util;
+import com.google.inject.Inject;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+@NoHttpd
+public class CommentAddedEventIT extends AbstractDaemonTest {
+
+  @Inject private DynamicSet<CommentAddedListener> source;
+
+  private final LabelType label =
+      category("CustomLabel", value(1, "Positive"), value(0, "No score"), value(-1, "Negative"));
+
+  private final LabelType pLabel =
+      category("CustomLabel2", value(1, "Positive"), value(0, "No score"));
+
+  private RegistrationHandle eventListenerRegistration;
+  private CommentAddedListener.Event lastCommentAddedEvent;
+
+  @Before
+  public void setUp() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      AccountGroup.UUID anonymousUsers = systemGroupBackend.getGroup(ANONYMOUS_USERS).getUUID();
+      Util.allow(
+          u.getConfig(),
+          Permission.forLabel(label.getName()),
+          -1,
+          1,
+          anonymousUsers,
+          "refs/heads/*");
+      Util.allow(
+          u.getConfig(),
+          Permission.forLabel(pLabel.getName()),
+          0,
+          1,
+          anonymousUsers,
+          "refs/heads/*");
+      u.save();
+    }
+
+    eventListenerRegistration =
+        source.add(
+            "gerrit",
+            new CommentAddedListener() {
+              @Override
+              public void onCommentAdded(Event event) {
+                lastCommentAddedEvent = event;
+              }
+            });
+  }
+
+  @After
+  public void cleanup() {
+    eventListenerRegistration.remove();
+  }
+
+  private void saveLabelConfig() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      u.getConfig().getLabelSections().put(label.getName(), label);
+      u.getConfig().getLabelSections().put(pLabel.getName(), pLabel);
+      u.save();
+    }
+  }
+
+  /* Need to lookup info for the label under test since there can be multiple
+   * labels defined.  By default Gerrit already has a Code-Review label.
+   */
+  private ApprovalValues getApprovalValues(LabelType label) {
+    ApprovalValues res = new ApprovalValues();
+    ApprovalInfo info = lastCommentAddedEvent.getApprovals().get(label.getName());
+    if (info != null) {
+      res.value = info.value;
+    }
+    info = lastCommentAddedEvent.getOldApprovals().get(label.getName());
+    if (info != null) {
+      res.oldValue = info.value;
+    }
+    return res;
+  }
+
+  @Test
+  public void newChangeWithVote() throws Exception {
+    saveLabelConfig();
+
+    // push a new change with -1 vote
+    PushOneCommit.Result r = createChange();
+    ReviewInput reviewInput = new ReviewInput().label(label.getName(), (short) -1);
+    revision(r).review(reviewInput);
+    ApprovalValues attr = getApprovalValues(label);
+    assertThat(attr.oldValue).isEqualTo(0);
+    assertThat(attr.value).isEqualTo(-1);
+    assertThat(lastCommentAddedEvent.getComment())
+        .isEqualTo(String.format("Patch Set 1: %s-1", label.getName()));
+  }
+
+  @Test
+  public void newPatchSetWithVote() throws Exception {
+    saveLabelConfig();
+
+    // push a new change
+    PushOneCommit.Result r = createChange();
+    ReviewInput reviewInput = new ReviewInput().message(label.getName());
+    revision(r).review(reviewInput);
+
+    // push a new revision with +1 vote
+    ChangeInfo c = info(r.getChangeId());
+    r = amendChange(c.changeId);
+    reviewInput = new ReviewInput().label(label.getName(), (short) 1);
+    revision(r).review(reviewInput);
+    ApprovalValues attr = getApprovalValues(label);
+    assertThat(attr.oldValue).isEqualTo(0);
+    assertThat(attr.value).isEqualTo(1);
+    assertThat(lastCommentAddedEvent.getComment())
+        .isEqualTo(String.format("Patch Set 2: %s+1", label.getName()));
+  }
+
+  @Test
+  public void reviewChange() throws Exception {
+    saveLabelConfig();
+
+    // push a change
+    PushOneCommit.Result r = createChange();
+
+    // review with message only, do not apply votes
+    ReviewInput reviewInput = new ReviewInput().message(label.getName());
+    revision(r).review(reviewInput);
+    // reply message only so vote is shown as 0
+    ApprovalValues attr = getApprovalValues(label);
+    assertThat(attr.oldValue).isNull();
+    assertThat(attr.value).isEqualTo(0);
+    assertThat(lastCommentAddedEvent.getComment())
+        .isEqualTo(String.format("Patch Set 1:\n\n%s", label.getName()));
+
+    // transition from un-voted to -1 vote
+    reviewInput = new ReviewInput().label(label.getName(), -1);
+    revision(r).review(reviewInput);
+    attr = getApprovalValues(label);
+    assertThat(attr.oldValue).isEqualTo(0);
+    assertThat(attr.value).isEqualTo(-1);
+    assertThat(lastCommentAddedEvent.getComment())
+        .isEqualTo(String.format("Patch Set 1: %s-1", label.getName()));
+
+    // transition vote from -1 to 0
+    reviewInput = new ReviewInput().label(label.getName(), 0);
+    revision(r).review(reviewInput);
+    attr = getApprovalValues(label);
+    assertThat(attr.oldValue).isEqualTo(-1);
+    assertThat(attr.value).isEqualTo(0);
+    assertThat(lastCommentAddedEvent.getComment())
+        .isEqualTo(String.format("Patch Set 1: -%s", label.getName()));
+
+    // transition vote from 0 to 1
+    reviewInput = new ReviewInput().label(label.getName(), 1);
+    revision(r).review(reviewInput);
+    attr = getApprovalValues(label);
+    assertThat(attr.oldValue).isEqualTo(0);
+    assertThat(attr.value).isEqualTo(1);
+    assertThat(lastCommentAddedEvent.getComment())
+        .isEqualTo(String.format("Patch Set 1: %s+1", label.getName()));
+
+    // transition vote from 1 to -1
+    reviewInput = new ReviewInput().label(label.getName(), -1);
+    revision(r).review(reviewInput);
+    attr = getApprovalValues(label);
+    assertThat(attr.oldValue).isEqualTo(1);
+    assertThat(attr.value).isEqualTo(-1);
+    assertThat(lastCommentAddedEvent.getComment())
+        .isEqualTo(String.format("Patch Set 1: %s-1", label.getName()));
+
+    // review with message only, do not apply votes
+    reviewInput = new ReviewInput().message(label.getName());
+    revision(r).review(reviewInput);
+    attr = getApprovalValues(label);
+    assertThat(attr.oldValue).isNull(); // no vote change so not included
+    assertThat(attr.value).isEqualTo(-1);
+    assertThat(lastCommentAddedEvent.getComment())
+        .isEqualTo(String.format("Patch Set 1:\n\n%s", label.getName()));
+  }
+
+  @Test
+  public void reviewChange_MultipleVotes() throws Exception {
+    saveLabelConfig();
+    PushOneCommit.Result r = createChange();
+    ReviewInput reviewInput = new ReviewInput().label(label.getName(), -1);
+    reviewInput.message = label.getName();
+    revision(r).review(reviewInput);
+
+    ChangeInfo c = get(r.getChangeId(), DETAILED_LABELS);
+    LabelInfo q = c.labels.get(label.getName());
+    assertThat(q.all).hasSize(1);
+    ApprovalValues labelAttr = getApprovalValues(label);
+    assertThat(labelAttr.oldValue).isEqualTo(0);
+    assertThat(labelAttr.value).isEqualTo(-1);
+    assertThat(lastCommentAddedEvent.getComment())
+        .isEqualTo(String.format("Patch Set 1: %s-1\n\n%s", label.getName(), label.getName()));
+
+    // there should be 3 approval labels (label, pLabel, and CRVV)
+    assertThat(lastCommentAddedEvent.getApprovals()).hasSize(3);
+
+    // check the approvals that were not voted on
+    ApprovalValues pLabelAttr = getApprovalValues(pLabel);
+    assertThat(pLabelAttr.oldValue).isNull();
+    assertThat(pLabelAttr.value).isEqualTo(0);
+
+    LabelType crLabel = LabelType.withDefaultValues("Code-Review");
+    ApprovalValues crlAttr = getApprovalValues(crLabel);
+    assertThat(crlAttr.oldValue).isNull();
+    assertThat(crlAttr.value).isEqualTo(0);
+
+    // update pLabel approval
+    reviewInput = new ReviewInput().label(pLabel.getName(), 1);
+    reviewInput.message = pLabel.getName();
+    revision(r).review(reviewInput);
+
+    c = get(r.getChangeId(), DETAILED_LABELS);
+    q = c.labels.get(label.getName());
+    assertThat(q.all).hasSize(1);
+    pLabelAttr = getApprovalValues(pLabel);
+    assertThat(pLabelAttr.oldValue).isEqualTo(0);
+    assertThat(pLabelAttr.value).isEqualTo(1);
+    assertThat(lastCommentAddedEvent.getComment())
+        .isEqualTo(String.format("Patch Set 1: %s+1\n\n%s", pLabel.getName(), pLabel.getName()));
+
+    // check the approvals that were not voted on
+    labelAttr = getApprovalValues(label);
+    assertThat(labelAttr.oldValue).isNull();
+    assertThat(labelAttr.value).isEqualTo(-1);
+
+    crlAttr = getApprovalValues(crLabel);
+    assertThat(crlAttr.oldValue).isNull();
+    assertThat(crlAttr.value).isEqualTo(0);
+  }
+
+  private static class ApprovalValues {
+    Integer value;
+    Integer oldValue;
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/server/mail/AbstractMailIT.java b/javatests/com/google/gerrit/acceptance/server/mail/AbstractMailIT.java
new file mode 100644
index 0000000..c1b5cf4
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/server/mail/AbstractMailIT.java
@@ -0,0 +1,147 @@
+// Copyright (C) 2017 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.google.gerrit.acceptance.server.mail;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.TestAccount;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput.CommentInput;
+import com.google.gerrit.extensions.client.Comment;
+import com.google.gerrit.extensions.client.Side;
+import com.google.gerrit.mail.MailMessage;
+import java.time.Instant;
+import java.util.HashMap;
+import org.junit.Ignore;
+
+@Ignore
+public class AbstractMailIT extends AbstractDaemonTest {
+
+  protected MailMessage.Builder messageBuilderWithDefaultFields() {
+    MailMessage.Builder b = MailMessage.builder();
+    b.id("some id");
+    b.from(user.emailAddress);
+    b.addTo(user.emailAddress); // Not evaluated
+    b.subject("");
+    b.dateReceived(Instant.now());
+    return b;
+  }
+
+  protected String createChangeWithReview() throws Exception {
+    return createChangeWithReview(admin);
+  }
+
+  protected String createChangeWithReview(TestAccount reviewer) throws Exception {
+    // Create change
+    String file = "gerrit-server/test.txt";
+    String contents = "contents \nlorem \nipsum \nlorem";
+    PushOneCommit push =
+        pushFactory.create(db, admin.getIdent(), testRepo, "first subject", file, contents);
+    PushOneCommit.Result r = push.to("refs/for/master");
+    String changeId = r.getChangeId();
+
+    // Review it
+    setApiUser(reviewer);
+    ReviewInput input = new ReviewInput();
+    input.message = "I have two comments";
+    input.comments = new HashMap<>();
+    CommentInput c1 = newComment(file, Side.REVISION, 0, "comment on file");
+    CommentInput c2 = newComment(file, Side.REVISION, 2, "inline comment");
+    input.comments.put(c1.path, ImmutableList.of(c1, c2));
+    revision(r).review(input);
+    return changeId;
+  }
+
+  protected static CommentInput newComment(String path, Side side, int line, String message) {
+    CommentInput c = new CommentInput();
+    c.path = path;
+    c.side = side;
+    c.line = line != 0 ? line : null;
+    c.message = message;
+    if (line != 0) {
+      Comment.Range range = new Comment.Range();
+      range.startLine = line;
+      range.startCharacter = 1;
+      range.endLine = line;
+      range.endCharacter = 5;
+      c.range = range;
+    }
+    return c;
+  }
+
+  /**
+   * Create a plaintext message body with the specified comments.
+   *
+   * @param changeMessage
+   * @param c1 Comment in reply to first inline comment.
+   * @param f1 Comment on file one.
+   * @param fc1 Comment in reply to a comment of file 1.
+   * @return A string with all inline comments and the original quoted email.
+   */
+  protected static String newPlaintextBody(
+      String changeURL, String changeMessage, String c1, String f1, String fc1) {
+    return (changeMessage == null ? "" : changeMessage + "\n")
+        + "> Foo Bar has posted comments on this change. (  \n"
+        + "> "
+        + changeURL
+        + " )\n"
+        + "> \n"
+        + "> Change subject: Test change\n"
+        + "> ...............................................................\n"
+        + "> \n"
+        + "> \n"
+        + "> Patch Set 1: Code-Review+1\n"
+        + "> \n"
+        + "> (3 comments)\n"
+        + "> \n"
+        + "> "
+        + changeURL
+        + "/gerrit-server/test.txt\n"
+        + "> File  \n"
+        + "> gerrit-server/test.txt:\n"
+        + (f1 == null ? "" : f1 + "\n")
+        + "> \n"
+        + "> Patch Set #4:\n"
+        + "> "
+        + changeURL
+        + "/gerrit-server/test.txt\n"
+        + "> \n"
+        + "> Some comment"
+        + "> \n"
+        + (fc1 == null ? "" : fc1 + "\n")
+        + "> "
+        + changeURL
+        + "/gerrit-server/test.txt@2\n"
+        + "> PS1, Line 2: throw new Exception(\"Object has unsupported: \" +\n"
+        + ">               :             entry.getValue() +\n"
+        + ">               :             \" must be java.util.Date\");\n"
+        + "> Should entry.getKey() be included in this message?\n"
+        + "> \n"
+        + (c1 == null ? "" : c1 + "\n")
+        + "> \n";
+  }
+
+  protected static String textFooterForChange(int changeNumber, String timestamp) {
+    return "Gerrit-Change-Number: "
+        + changeNumber
+        + "\n"
+        + "Gerrit-PatchSet: 1\n"
+        + "Gerrit-MessageType: comment\n"
+        + "Gerrit-Comment-Date: "
+        + timestamp
+        + "\n";
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/server/mail/BUILD b/javatests/com/google/gerrit/acceptance/server/mail/BUILD
new file mode 100644
index 0000000..e21789b
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/server/mail/BUILD
@@ -0,0 +1,27 @@
+load("//javatests/com/google/gerrit/acceptance:tests.bzl", "acceptance_tests")
+
+DEPS = [
+    "//lib/greenmail",
+    "//lib/mail",
+    "//java/com/google/gerrit/mail",
+]
+
+acceptance_tests(
+    srcs = glob(
+        ["*IT.java"],
+        exclude = ["AbstractMailIT.java"],
+    ),
+    group = "server_mail",
+    labels = [
+        "no_windows",
+        "server",
+    ],
+    deps = DEPS + [":util"],
+)
+
+java_library(
+    name = "util",
+    testonly = True,
+    srcs = ["AbstractMailIT.java"],
+    deps = DEPS + ["//java/com/google/gerrit/acceptance:lib"],
+)
diff --git a/javatests/com/google/gerrit/acceptance/server/mail/ChangeNotificationsIT.java b/javatests/com/google/gerrit/acceptance/server/mail/ChangeNotificationsIT.java
new file mode 100644
index 0000000..209d0a2
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/server/mail/ChangeNotificationsIT.java
@@ -0,0 +1,2768 @@
+// Copyright (C) 2017 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.google.gerrit.acceptance.server.mail;
+
+import static com.google.common.truth.TruthJUnit.assume;
+import static com.google.gerrit.extensions.api.changes.NotifyHandling.ALL;
+import static com.google.gerrit.extensions.api.changes.NotifyHandling.NONE;
+import static com.google.gerrit.extensions.api.changes.NotifyHandling.OWNER;
+import static com.google.gerrit.extensions.api.changes.NotifyHandling.OWNER_REVIEWERS;
+import static com.google.gerrit.extensions.client.GeneralPreferencesInfo.EmailStrategy.CC_ON_OWN_COMMENTS;
+import static com.google.gerrit.extensions.client.GeneralPreferencesInfo.EmailStrategy.ENABLED;
+import static com.google.gerrit.server.account.ProjectWatches.NotifyType.ABANDONED_CHANGES;
+import static com.google.gerrit.server.account.ProjectWatches.NotifyType.ALL_COMMENTS;
+import static com.google.gerrit.server.account.ProjectWatches.NotifyType.NEW_CHANGES;
+import static com.google.gerrit.server.account.ProjectWatches.NotifyType.NEW_PATCHSETS;
+import static com.google.gerrit.server.account.ProjectWatches.NotifyType.SUBMITTED_CHANGES;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.truth.Truth;
+import com.google.gerrit.acceptance.AbstractNotificationTest;
+import com.google.gerrit.acceptance.TestAccount;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.changes.AbandonInput;
+import com.google.gerrit.extensions.api.changes.AddReviewerInput;
+import com.google.gerrit.extensions.api.changes.AssigneeInput;
+import com.google.gerrit.extensions.api.changes.DeleteReviewerInput;
+import com.google.gerrit.extensions.api.changes.DeleteVoteInput;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.changes.SubmitInput;
+import com.google.gerrit.extensions.api.projects.ConfigInput;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo.EmailStrategy;
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.extensions.client.ReviewerState;
+import com.google.gerrit.extensions.common.CommitInfo;
+import com.google.gerrit.extensions.common.CommitMessageInput;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.server.project.testing.Util;
+import com.google.gerrit.server.restapi.change.PostReview;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ChangeNotificationsIT extends AbstractNotificationTest {
+  /*
+   * Set up for extra standard test accounts and permissions.
+   */
+  private TestAccount other;
+  private TestAccount extraReviewer;
+  private TestAccount extraCcer;
+
+  @Before
+  public void createExtraAccounts() throws Exception {
+    extraReviewer =
+        accountCreator.create("extraReviewer", "extraReviewer@example.com", "extraReviewer");
+    extraCcer = accountCreator.create("extraCcer", "extraCcer@example.com", "extraCcer");
+    other = accountCreator.create("other", "other@example.com", "other");
+  }
+
+  @Before
+  public void grantPermissions() throws Exception {
+    grant(project, "refs/*", Permission.FORGE_COMMITTER, false, REGISTERED_USERS);
+    grant(project, "refs/*", Permission.SUBMIT, false, REGISTERED_USERS);
+    grant(project, "refs/heads/master", Permission.ABANDON, false, REGISTERED_USERS);
+    ProjectConfig cfg = projectCache.get(project).getConfig();
+    Util.allow(cfg, Permission.forLabel("Code-Review"), -2, +2, REGISTERED_USERS, "refs/*");
+  }
+
+  /*
+   * AbandonedSender tests.
+   */
+
+  @Test
+  public void abandonReviewableChangeByOwner() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    abandon(sc.changeId, sc.owner);
+    assertThat(sender)
+        .sent("abandon", sc)
+        .cc(sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ABANDONED_CHANGES)
+        .noOneElse();
+  }
+
+  @Test
+  public void abandonReviewableChangeByOwnerCcingSelf() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    abandon(sc.changeId, sc.owner, CC_ON_OWN_COMMENTS);
+    assertThat(sender)
+        .sent("abandon", sc)
+        .to(sc.owner)
+        .cc(sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ABANDONED_CHANGES)
+        .noOneElse();
+  }
+
+  @Test
+  public void abandonReviewableChangeByOther() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    TestAccount other = accountCreator.create("other", "other@example.com", "other");
+    abandon(sc.changeId, other);
+    assertThat(sender)
+        .sent("abandon", sc)
+        .to(sc.owner)
+        .cc(sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ABANDONED_CHANGES)
+        .noOneElse();
+  }
+
+  @Test
+  public void abandonReviewableChangeByOtherCcingSelf() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    TestAccount other = accountCreator.create("other", "other@example.com", "other");
+    abandon(sc.changeId, other, CC_ON_OWN_COMMENTS);
+    assertThat(sender)
+        .sent("abandon", sc)
+        .to(sc.owner)
+        .cc(sc.reviewer, sc.ccer, other)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ABANDONED_CHANGES)
+        .noOneElse();
+  }
+
+  @Test
+  public void abandonReviewableChangeNotifyOwnersReviewers() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    abandon(sc.changeId, sc.owner, OWNER_REVIEWERS);
+    assertThat(sender)
+        .sent("abandon", sc)
+        .cc(sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .noOneElse();
+  }
+
+  @Test
+  public void abandonReviewableChangeNotifyOwner() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    abandon(sc.changeId, sc.owner, OWNER);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void abandonReviewableChangeNotifyOwnerCcingSelf() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    abandon(sc.changeId, sc.owner, CC_ON_OWN_COMMENTS, OWNER);
+    // Self-CC applies *after* need for sending notification is determined.
+    // Since there are no recipients before including the user taking action,
+    // there should no notification sent.
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void abandonReviewableChangeByOtherCcingSelfNotifyOwner() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    TestAccount other = accountCreator.create("other", "other@example.com", "other");
+    abandon(sc.changeId, other, CC_ON_OWN_COMMENTS, OWNER);
+    assertThat(sender).sent("abandon", sc).to(sc.owner).cc(other).noOneElse();
+  }
+
+  @Test
+  public void abandonReviewableChangeNotifyNone() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    abandon(sc.changeId, sc.owner, NONE);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void abandonReviewableChangeNotifyNoneCcingSelf() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    abandon(sc.changeId, sc.owner, CC_ON_OWN_COMMENTS, NONE);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void abandonReviewableWipChange() throws Exception {
+    StagedChange sc = stageReviewableWipChange();
+    abandon(sc.changeId, sc.owner);
+    assertThat(sender)
+        .sent("abandon", sc)
+        .cc(sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ABANDONED_CHANGES)
+        .noOneElse();
+  }
+
+  @Test
+  public void abandonWipChange() throws Exception {
+    StagedChange sc = stageWipChange();
+    abandon(sc.changeId, sc.owner);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void abandonWipChangeNotifyAll() throws Exception {
+    StagedChange sc = stageWipChange();
+    abandon(sc.changeId, sc.owner, ALL);
+    assertThat(sender)
+        .sent("abandon", sc)
+        .cc(sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ABANDONED_CHANGES)
+        .noOneElse();
+  }
+
+  private void abandon(String changeId, TestAccount by) throws Exception {
+    abandon(changeId, by, ENABLED);
+  }
+
+  private void abandon(String changeId, TestAccount by, EmailStrategy emailStrategy)
+      throws Exception {
+    abandon(changeId, by, emailStrategy, null);
+  }
+
+  private void abandon(String changeId, TestAccount by, @Nullable NotifyHandling notify)
+      throws Exception {
+    abandon(changeId, by, ENABLED, notify);
+  }
+
+  private void abandon(
+      String changeId, TestAccount by, EmailStrategy emailStrategy, @Nullable NotifyHandling notify)
+      throws Exception {
+    setEmailStrategy(by, emailStrategy);
+    setApiUser(by);
+    AbandonInput in = new AbandonInput();
+    if (notify != null) {
+      in.notify = notify;
+    }
+    gApi.changes().id(changeId).abandon(in);
+  }
+
+  /*
+   * AddReviewerSender tests.
+   */
+
+  private void addReviewerToReviewableChangeInReviewDb(Adder adder) throws Exception {
+    assume().that(notesMigration.readChanges()).isFalse();
+    StagedChange sc = stageReviewableChange();
+    TestAccount reviewer = accountCreator.create("added", "added@example.com", "added");
+    addReviewer(adder, sc.changeId, sc.owner, reviewer.email);
+    assertThat(sender)
+        .sent("newchange", sc)
+        .to(reviewer)
+        .cc(sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .noOneElse();
+  }
+
+  @Test
+  public void addReviewerToReviewableChangeInReviewDbSingly() throws Exception {
+    addReviewerToReviewableChangeInReviewDb(singly());
+  }
+
+  @Test
+  public void addReviewerToReviewableChangeInReviewDbBatch() throws Exception {
+    addReviewerToReviewableChangeInReviewDb(batch());
+  }
+
+  private void addReviewerToReviewableChangeInNoteDb(Adder adder) throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedChange sc = stageReviewableChange();
+    TestAccount reviewer = accountCreator.create("added", "added@example.com", "added");
+    addReviewer(adder, sc.changeId, sc.owner, reviewer.email);
+    // TODO(logan): Should CCs be included?
+    assertThat(sender)
+        .sent("newchange", sc)
+        .to(reviewer)
+        .cc(sc.reviewer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .noOneElse();
+  }
+
+  @Test
+  public void addReviewerToReviewableChangeInNoteDbSingly() throws Exception {
+    addReviewerToReviewableChangeInNoteDb(singly());
+  }
+
+  @Test
+  public void addReviewerToReviewableChangeInNoteDbBatch() throws Exception {
+    addReviewerToReviewableChangeInNoteDb(batch());
+  }
+
+  private void addReviewerToReviewableChangeByOwnerCcingSelfInNoteDb(Adder adder) throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedChange sc = stageReviewableChange();
+    TestAccount reviewer = accountCreator.create("added", "added@example.com", "added");
+    addReviewer(adder, sc.changeId, sc.owner, reviewer.email, CC_ON_OWN_COMMENTS, null);
+    // TODO(logan): Should CCs be included?
+    assertThat(sender)
+        .sent("newchange", sc)
+        .to(reviewer)
+        .cc(sc.owner, sc.reviewer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .noOneElse();
+  }
+
+  @Test
+  public void addReviewerToReviewableChangeByOwnerCcingSelfInNoteDbSingly() throws Exception {
+    addReviewerToReviewableChangeByOwnerCcingSelfInNoteDb(singly());
+  }
+
+  @Test
+  public void addReviewerToReviewableChangeByOwnerCcingSelfInNoteDbBatch() throws Exception {
+    addReviewerToReviewableChangeByOwnerCcingSelfInNoteDb(batch());
+  }
+
+  private void addReviewerToReviewableChangeByOtherInNoteDb(Adder adder) throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    TestAccount other = accountCreator.create("other", "other@example.com", "other");
+    StagedChange sc = stageReviewableChange();
+    TestAccount reviewer = accountCreator.create("added", "added@example.com", "added");
+    addReviewer(adder, sc.changeId, other, reviewer.email);
+    // TODO(logan): Should CCs be included?
+    assertThat(sender)
+        .sent("newchange", sc)
+        .to(reviewer)
+        .cc(sc.owner, sc.reviewer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .noOneElse();
+  }
+
+  @Test
+  public void addReviewerToReviewableChangeByOtherInNoteDbSingly() throws Exception {
+    addReviewerToReviewableChangeByOtherInNoteDb(singly());
+  }
+
+  @Test
+  public void addReviewerToReviewableChangeByOtherInNoteDbBatch() throws Exception {
+    addReviewerToReviewableChangeByOtherInNoteDb(batch());
+  }
+
+  private void addReviewerToReviewableChangeByOtherCcingSelfInNoteDb(Adder adder) throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    TestAccount other = accountCreator.create("other", "other@example.com", "other");
+    StagedChange sc = stageReviewableChange();
+    TestAccount reviewer = accountCreator.create("added", "added@example.com", "added");
+    addReviewer(adder, sc.changeId, other, reviewer.email, CC_ON_OWN_COMMENTS, null);
+    // TODO(logan): Should CCs be included?
+    assertThat(sender)
+        .sent("newchange", sc)
+        .to(reviewer)
+        .cc(sc.owner, sc.reviewer, other)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .noOneElse();
+  }
+
+  @Test
+  public void addReviewerToReviewableChangeByOtherCcingSelfInNoteDbSingly() throws Exception {
+    addReviewerToReviewableChangeByOtherCcingSelfInNoteDb(singly());
+  }
+
+  @Test
+  public void addReviewerToReviewableChangeByOtherCcingSelfInNoteDbBatch() throws Exception {
+    addReviewerToReviewableChangeByOtherCcingSelfInNoteDb(batch());
+  }
+
+  private void addReviewerByEmailToReviewableChangeInReviewDb(Adder adder) throws Exception {
+    assume().that(notesMigration.readChanges()).isFalse();
+    String email = "addedbyemail@example.com";
+    StagedChange sc = stageReviewableChange();
+    addReviewer(adder, sc.changeId, sc.owner, email);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void addReviewerByEmailToReviewableChangeInReviewDbSingly() throws Exception {
+    addReviewerByEmailToReviewableChangeInReviewDb(singly());
+  }
+
+  @Test
+  public void addReviewerByEmailToReviewableChangeInReviewDbBatch() throws Exception {
+    addReviewerByEmailToReviewableChangeInReviewDb(batch());
+  }
+
+  private void addReviewerByEmailToReviewableChangeInNoteDb(Adder adder) throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    String email = "addedbyemail@example.com";
+    StagedChange sc = stageReviewableChange();
+    addReviewer(adder, sc.changeId, sc.owner, email);
+    // TODO(logan): Should CCs be included?
+    assertThat(sender)
+        .sent("newchange", sc)
+        .to(email)
+        .cc(sc.reviewer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .noOneElse();
+  }
+
+  @Test
+  public void addReviewerByEmailToReviewableChangeInNoteDbSingly() throws Exception {
+    addReviewerByEmailToReviewableChangeInNoteDb(singly());
+  }
+
+  @Test
+  public void addReviewerByEmailToReviewableChangeInNoteDbBatch() throws Exception {
+    addReviewerByEmailToReviewableChangeInNoteDb(batch());
+  }
+
+  private void addReviewerToWipChange(Adder adder) throws Exception {
+    StagedChange sc = stageWipChange();
+    TestAccount reviewer = accountCreator.create("added", "added@example.com", "added");
+    addReviewer(adder, sc.changeId, sc.owner, reviewer.email);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void addReviewerToWipChangeSingly() throws Exception {
+    addReviewerToWipChange(singly());
+  }
+
+  @Test
+  public void addReviewerToWipChangeBatch() throws Exception {
+    addReviewerToWipChange(batch());
+  }
+
+  private void addReviewerToReviewableWipChange(Adder adder) throws Exception {
+    StagedChange sc = stageReviewableWipChange();
+    TestAccount reviewer = accountCreator.create("added", "added@example.com", "added");
+    addReviewer(adder, sc.changeId, sc.owner, reviewer.email);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void addReviewerToReviewableWipChangeSingly() throws Exception {
+    addReviewerToReviewableWipChange(singly());
+  }
+
+  @Test
+  public void addReviewerToReviewableWipChangeBatch() throws Exception {
+    addReviewerToReviewableWipChange(batch());
+  }
+
+  private void addReviewerToWipChangeInNoteDbNotifyAll(Adder adder) throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedChange sc = stageWipChange();
+    TestAccount reviewer = accountCreator.create("added", "added@example.com", "added");
+    addReviewer(adder, sc.changeId, sc.owner, reviewer.email, NotifyHandling.ALL);
+    // TODO(logan): Should CCs be included?
+    assertThat(sender)
+        .sent("newchange", sc)
+        .to(reviewer)
+        .cc(sc.reviewer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .noOneElse();
+  }
+
+  @Test
+  public void addReviewerToWipChangeInNoteDbNotifyAllSingly() throws Exception {
+    addReviewerToWipChangeInNoteDbNotifyAll(singly());
+  }
+
+  @Test
+  public void addReviewerToWipChangeInNoteDbNotifyAllBatch() throws Exception {
+    addReviewerToWipChangeInNoteDbNotifyAll(batch());
+  }
+
+  private void addReviewerToWipChangeInReviewDbNotifyAll(Adder adder) throws Exception {
+    assume().that(notesMigration.readChanges()).isFalse();
+    StagedChange sc = stageWipChange();
+    TestAccount reviewer = accountCreator.create("added", "added@example.com", "added");
+    addReviewer(adder, sc.changeId, sc.owner, reviewer.email, NotifyHandling.ALL);
+    assertThat(sender)
+        .sent("newchange", sc)
+        .to(reviewer)
+        .cc(sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .noOneElse();
+  }
+
+  @Test
+  public void addReviewerToWipChangeInReviewDbNotifyAllSingly() throws Exception {
+    addReviewerToWipChangeInReviewDbNotifyAll(singly());
+  }
+
+  @Test
+  public void addReviewerToWipChangeInReviewDbNotifyAllBatch() throws Exception {
+    addReviewerToWipChangeInReviewDbNotifyAll(batch());
+  }
+
+  private void addReviewerToReviewableChangeInNoteDbNotifyOwnerReviewers(Adder adder)
+      throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedChange sc = stageReviewableChange();
+    TestAccount reviewer = accountCreator.create("added", "added@example.com", "added");
+    addReviewer(adder, sc.changeId, sc.owner, reviewer.email, OWNER_REVIEWERS);
+    // TODO(logan): Should CCs be included?
+    assertThat(sender)
+        .sent("newchange", sc)
+        .to(reviewer)
+        .cc(sc.reviewer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .noOneElse();
+  }
+
+  @Test
+  public void addReviewerToReviewableChangeInNoteDbNotifyOwnerReviewersSingly() throws Exception {
+    addReviewerToReviewableChangeInNoteDbNotifyOwnerReviewers(singly());
+  }
+
+  @Test
+  public void addReviewerToReviewableChangeInNoteDbNotifyOwnerReviewersBatch() throws Exception {
+    addReviewerToReviewableChangeInNoteDbNotifyOwnerReviewers(batch());
+  }
+
+  private void addReviewerToReviewableChangeInNoteDbByOwnerCcingSelfNotifyOwner(Adder adder)
+      throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedChange sc = stageReviewableChange();
+    TestAccount reviewer = accountCreator.create("added", "added@example.com", "added");
+    addReviewer(adder, sc.changeId, sc.owner, reviewer.email, CC_ON_OWN_COMMENTS, OWNER);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void addReviewerToReviewableChangeInNoteDbByOwnerCcingSelfNotifyOwnerSingly()
+      throws Exception {
+    addReviewerToReviewableChangeInNoteDbByOwnerCcingSelfNotifyOwner(singly());
+  }
+
+  @Test
+  public void addReviewerToReviewableChangeInNoteDbByOwnerCcingSelfNotifyOwnerBatch()
+      throws Exception {
+    addReviewerToReviewableChangeInNoteDbByOwnerCcingSelfNotifyOwner(batch());
+  }
+
+  private void addReviewerToReviewableChangeInNoteDbByOwnerCcingSelfNotifyNone(Adder adder)
+      throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedChange sc = stageReviewableChange();
+    TestAccount reviewer = accountCreator.create("added", "added@example.com", "added");
+    addReviewer(adder, sc.changeId, sc.owner, reviewer.email, CC_ON_OWN_COMMENTS, NONE);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void addReviewerToReviewableChangeInNoteDbByOwnerCcingSelfNotifyNoneSingly()
+      throws Exception {
+    addReviewerToReviewableChangeInNoteDbByOwnerCcingSelfNotifyNone(singly());
+  }
+
+  @Test
+  public void addReviewerToReviewableChangeInNoteDbByOwnerCcingSelfNotifyNoneBatch()
+      throws Exception {
+    addReviewerToReviewableChangeInNoteDbByOwnerCcingSelfNotifyNone(batch());
+  }
+
+  private void addNonUserReviewerByEmailInNoteDb(Adder adder) throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedChange sc = stageReviewableChange();
+    addReviewer(adder, sc.changeId, sc.owner, "nonexistent@example.com");
+    assertThat(sender)
+        .sent("newchange", sc)
+        .to("nonexistent@example.com")
+        .cc(sc.reviewer)
+        .cc(sc.ccerByEmail, sc.reviewerByEmail)
+        .noOneElse();
+  }
+
+  @Test
+  public void addNonUserReviewerByEmailInNoteDbSingly() throws Exception {
+    addNonUserReviewerByEmailInNoteDb(singly(ReviewerState.REVIEWER));
+  }
+
+  @Test
+  public void addNonUserReviewerByEmailInNoteDbBatch() throws Exception {
+    addNonUserReviewerByEmailInNoteDb(batch(ReviewerState.REVIEWER));
+  }
+
+  private void addNonUserCcByEmailInNoteDb(Adder adder) throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedChange sc = stageReviewableChange();
+    addReviewer(adder, sc.changeId, sc.owner, "nonexistent@example.com");
+    assertThat(sender)
+        .sent("newchange", sc)
+        .cc("nonexistent@example.com")
+        .cc(sc.reviewer)
+        .cc(sc.ccerByEmail, sc.reviewerByEmail)
+        .noOneElse();
+  }
+
+  @Test
+  public void addNonUserCcByEmailInNoteDbSingly() throws Exception {
+    addNonUserCcByEmailInNoteDb(singly(ReviewerState.CC));
+  }
+
+  @Test
+  public void addNonUserCcByEmailInNoteDbBatch() throws Exception {
+    addNonUserCcByEmailInNoteDb(batch(ReviewerState.CC));
+  }
+
+  private interface Adder {
+    void addReviewer(String changeId, String reviewer, @Nullable NotifyHandling notify)
+        throws Exception;
+  }
+
+  private Adder singly() {
+    return singly(ReviewerState.REVIEWER);
+  }
+
+  private Adder singly(ReviewerState reviewerState) {
+    return (String changeId, String reviewer, @Nullable NotifyHandling notify) -> {
+      AddReviewerInput in = new AddReviewerInput();
+      in.reviewer = reviewer;
+      in.state = reviewerState;
+      if (notify != null) {
+        in.notify = notify;
+      }
+      gApi.changes().id(changeId).addReviewer(in);
+    };
+  }
+
+  private Adder batch() {
+    return batch(ReviewerState.REVIEWER);
+  }
+
+  private Adder batch(ReviewerState reviewerState) {
+    return (String changeId, String reviewer, @Nullable NotifyHandling notify) -> {
+      ReviewInput in = ReviewInput.noScore();
+      in.reviewer(reviewer, reviewerState, false);
+      if (notify != null) {
+        in.notify = notify;
+      }
+      gApi.changes().id(changeId).revision("current").review(in);
+    };
+  }
+
+  private void addReviewer(Adder adder, String changeId, TestAccount by, String reviewer)
+      throws Exception {
+    addReviewer(adder, changeId, by, reviewer, ENABLED, null);
+  }
+
+  private void addReviewer(
+      Adder adder, String changeId, TestAccount by, String reviewer, NotifyHandling notify)
+      throws Exception {
+    addReviewer(adder, changeId, by, reviewer, ENABLED, notify);
+  }
+
+  private void addReviewer(
+      Adder adder,
+      String changeId,
+      TestAccount by,
+      String reviewer,
+      EmailStrategy emailStrategy,
+      @Nullable NotifyHandling notify)
+      throws Exception {
+    setEmailStrategy(by, emailStrategy);
+    setApiUser(by);
+    adder.addReviewer(changeId, reviewer, notify);
+  }
+
+  /*
+   * CommentSender tests.
+   */
+
+  @Test
+  public void commentOnReviewableChangeByOwner() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    review(sc.owner, sc.changeId, ENABLED);
+    assertThat(sender)
+        .sent("comment", sc)
+        .cc(sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void commentOnReviewableChangeByReviewer() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    review(sc.reviewer, sc.changeId, ENABLED);
+    assertThat(sender)
+        .sent("comment", sc)
+        .to(sc.owner)
+        .cc(sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void commentOnReviewableChangeByOwnerCcingSelf() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    review(sc.owner, sc.changeId, CC_ON_OWN_COMMENTS);
+    assertThat(sender)
+        .sent("comment", sc)
+        .to(sc.owner)
+        .cc(sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void commentOnReviewableChangeByReviewerCcingSelf() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    review(sc.reviewer, sc.changeId, CC_ON_OWN_COMMENTS);
+    assertThat(sender)
+        .sent("comment", sc)
+        .to(sc.owner)
+        .cc(sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void commentOnReviewableChangeByOther() throws Exception {
+    TestAccount other = accountCreator.create("other", "other@example.com", "other");
+    StagedChange sc = stageReviewableChange();
+    review(other, sc.changeId, ENABLED);
+    assertThat(sender)
+        .sent("comment", sc)
+        .to(sc.owner)
+        .cc(sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void commentOnReviewableChangeByOtherCcingSelf() throws Exception {
+    TestAccount other = accountCreator.create("other", "other@example.com", "other");
+    StagedChange sc = stageReviewableChange();
+    review(other, sc.changeId, CC_ON_OWN_COMMENTS);
+    assertThat(sender)
+        .sent("comment", sc)
+        .to(sc.owner)
+        .cc(sc.reviewer, sc.ccer, other)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void commentOnReviewableChangeByOwnerNotifyOwnerReviewers() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    review(sc.owner, sc.changeId, ENABLED, OWNER_REVIEWERS);
+    assertThat(sender)
+        .sent("comment", sc)
+        .cc(sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .noOneElse();
+  }
+
+  @Test
+  public void commentOnReviewableChangeByOwnerNotifyOwner() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    review(sc.owner, sc.changeId, ENABLED, OWNER);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void commentOnReviewableChangeByOwnerCcingSelfNotifyOwner() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    setEmailStrategy(sc.owner, CC_ON_OWN_COMMENTS);
+    review(sc.owner, sc.changeId, ENABLED, OWNER);
+    assertThat(sender).notSent(); // TODO(logan): Why not send to owner?
+  }
+
+  @Test
+  public void commentOnReviewableChangeByOwnerNotifyNone() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    review(sc.owner, sc.changeId, ENABLED, NONE);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void commentOnReviewableChangeByOwnerCcingSelfNotifyNone() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    setEmailStrategy(sc.owner, CC_ON_OWN_COMMENTS);
+    review(sc.owner, sc.changeId, ENABLED, NONE);
+    assertThat(sender).notSent(); // TODO(logan): Why not send to owner?
+  }
+
+  @Test
+  public void commentOnReviewableChangeByBot() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    TestAccount bot = sc.testAccount("bot");
+    review(bot, sc.changeId, ENABLED, null, "autogenerated:bot");
+    assertThat(sender)
+        .sent("comment", sc)
+        .to(sc.owner)
+        .cc(sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .noOneElse();
+  }
+
+  @Test
+  public void commentOnWipChangeByOwner() throws Exception {
+    StagedChange sc = stageWipChange();
+    review(sc.owner, sc.changeId, ENABLED);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void commentOnWipChangeByOwnerCcingSelf() throws Exception {
+    StagedChange sc = stageWipChange();
+    review(sc.owner, sc.changeId, CC_ON_OWN_COMMENTS);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void commentOnWipChangeByOwnerNotifyAll() throws Exception {
+    StagedChange sc = stageWipChange();
+    review(sc.owner, sc.changeId, ENABLED, ALL);
+    assertThat(sender)
+        .sent("comment", sc)
+        .cc(sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void commentOnWipChangeByBot() throws Exception {
+    StagedChange sc = stageWipChange();
+    TestAccount bot = sc.testAccount("bot");
+    review(bot, sc.changeId, ENABLED, null, "autogenerated:tag");
+    assertThat(sender).sent("comment", sc).to(sc.owner).noOneElse();
+  }
+
+  @Test
+  public void commentOnReviewableWipChangeByBot() throws Exception {
+    StagedChange sc = stageReviewableWipChange();
+    TestAccount bot = sc.testAccount("bot");
+    review(bot, sc.changeId, ENABLED, null, "autogenerated:tag");
+    assertThat(sender).sent("comment", sc).to(sc.owner).noOneElse();
+  }
+
+  @Test
+  public void commentOnReviewableWipChangeByBotNotifyAll() throws Exception {
+    StagedChange sc = stageWipChange();
+    TestAccount bot = sc.testAccount("bot");
+    review(bot, sc.changeId, ENABLED, ALL, "tag");
+    assertThat(sender)
+        .sent("comment", sc)
+        .to(sc.owner)
+        .cc(sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void commentOnReviewableWipChangeByOwner() throws Exception {
+    StagedChange sc = stageReviewableWipChange();
+    review(sc.owner, sc.changeId, ENABLED);
+    assertThat(sender)
+        .sent("comment", sc)
+        .cc(sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void noCommentAndSetWorkInProgress() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    ReviewInput in = ReviewInput.noScore().setWorkInProgress(true);
+    gApi.changes().id(sc.changeId).revision("current").review(in);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void commentAndSetWorkInProgress() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    ReviewInput in = ReviewInput.noScore().message("ok").setWorkInProgress(true);
+    gApi.changes().id(sc.changeId).revision("current").review(in);
+    assertThat(sender)
+        .sent("comment", sc)
+        .cc(sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void commentOnWipChangeAndStartReview() throws Exception {
+    StagedChange sc = stageWipChange();
+    ReviewInput in = ReviewInput.noScore().message("ok").setWorkInProgress(false);
+    gApi.changes().id(sc.changeId).revision("current").review(in);
+    assertThat(sender)
+        .sent("comment", sc)
+        .cc(sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void addReviewerOnWipChangeAndStartReviewInNoteDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedChange sc = stageWipChange();
+    ReviewInput in = ReviewInput.noScore().reviewer(other.email).setWorkInProgress(false);
+    gApi.changes().id(sc.changeId).revision("current").review(in);
+    assertThat(sender)
+        .sent("comment", sc)
+        .cc(sc.reviewer, sc.ccer, other)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+    // TODO(logan): Should CCs be included?
+    assertThat(sender)
+        .sent("newchange", sc)
+        .to(other)
+        .cc(sc.reviewer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .noOneElse();
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void addReviewerOnWipChangeAndStartReviewInReviewDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isFalse();
+    StagedChange sc = stageWipChange();
+    ReviewInput in = ReviewInput.noScore().reviewer(other.email).setWorkInProgress(false);
+    gApi.changes().id(sc.changeId).revision("current").review(in);
+    assertThat(sender)
+        .sent("comment", sc)
+        .cc(sc.reviewer, sc.ccer, other)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+    assertThat(sender)
+        .sent("newchange", sc)
+        .to(other)
+        .cc(sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .noOneElse();
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void startReviewMessageNotRepeated() throws Exception {
+    // TODO(logan): Remove this test check once PolyGerrit workaround is rolled back.
+    StagedChange sc = stageWipChange();
+    ReviewInput in =
+        ReviewInput.noScore().message(PostReview.START_REVIEW_MESSAGE).setWorkInProgress(false);
+    gApi.changes().id(sc.changeId).revision("current").review(in);
+    Truth.assertThat(sender.getMessages()).isNotEmpty();
+    String body = sender.getMessages().get(0).body();
+    int idx = body.indexOf(PostReview.START_REVIEW_MESSAGE);
+    Truth.assertThat(idx).isAtLeast(0);
+    Truth.assertThat(body.indexOf(PostReview.START_REVIEW_MESSAGE, idx + 1)).isEqualTo(-1);
+  }
+
+  private void review(TestAccount account, String changeId, EmailStrategy strategy)
+      throws Exception {
+    review(account, changeId, strategy, null);
+  }
+
+  private void review(
+      TestAccount account, String changeId, EmailStrategy strategy, @Nullable NotifyHandling notify)
+      throws Exception {
+    review(account, changeId, strategy, notify, null);
+  }
+
+  private void review(
+      TestAccount account,
+      String changeId,
+      EmailStrategy strategy,
+      @Nullable NotifyHandling notify,
+      @Nullable String tag)
+      throws Exception {
+    setEmailStrategy(account, strategy);
+    ReviewInput in = ReviewInput.recommend();
+    in.notify = notify;
+    in.tag = tag;
+    gApi.changes().id(changeId).revision("current").review(in);
+  }
+
+  /*
+   * CreateChangeSender tests.
+   */
+
+  @Test
+  public void createReviewableChange() throws Exception {
+    StagedPreChange spc = stagePreChange("refs/for/master");
+    assertThat(sender)
+        .sent("newchange", spc)
+        .to(spc.watchingProjectOwner)
+        .bcc(NEW_CHANGES, NEW_PATCHSETS)
+        .noOneElse();
+  }
+
+  @Test
+  public void createWipChange() throws Exception {
+    stagePreChange("refs/for/master%wip");
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void createWipChangeWithWorkInProgressByDefaultForProject() throws Exception {
+    setWorkInProgressByDefault(project, InheritableBoolean.TRUE);
+    StagedPreChange spc = stagePreChange("refs/for/master");
+    Truth.assertThat(gApi.changes().id(spc.changeId).get().workInProgress).isTrue();
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void createWipChangeWithWorkInProgressByDefaultForUser() throws Exception {
+    // Make sure owner user is created
+    StagedChange sc = stageReviewableChange();
+    // All was cleaned already
+    assertThat(sender).notSent();
+
+    // Toggle workInProgress flag for owner
+    GeneralPreferencesInfo prefs = gApi.accounts().id(sc.owner.id.get()).getPreferences();
+    prefs.workInProgressByDefault = true;
+    gApi.accounts().id(sc.owner.id.get()).setPreferences(prefs);
+
+    // Create another change without notification that should be wip
+    StagedPreChange spc = stagePreChange("refs/for/master");
+    Truth.assertThat(gApi.changes().id(spc.changeId).get().workInProgress).isTrue();
+    assertThat(sender).notSent();
+
+    // Clean up workInProgressByDefault by owner
+    prefs = gApi.accounts().id(sc.owner.id.get()).getPreferences();
+    Truth.assertThat(prefs.workInProgressByDefault).isTrue();
+    prefs.workInProgressByDefault = false;
+    gApi.accounts().id(sc.owner.id.get()).setPreferences(prefs);
+  }
+
+  @Test
+  public void createReviewableChangeWithNotifyOwnerReviewers() throws Exception {
+    stagePreChange("refs/for/master%notify=OWNER_REVIEWERS");
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void createReviewableChangeWithNotifyOwner() throws Exception {
+    stagePreChange("refs/for/master%notify=OWNER");
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void createReviewableChangeWithNotifyNone() throws Exception {
+    stagePreChange("refs/for/master%notify=OWNER");
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void createWipChangeWithNotifyAll() throws Exception {
+    StagedPreChange spc = stagePreChange("refs/for/master%wip,notify=ALL");
+    assertThat(sender)
+        .sent("newchange", spc)
+        .to(spc.watchingProjectOwner)
+        .bcc(NEW_CHANGES, NEW_PATCHSETS)
+        .noOneElse();
+  }
+
+  @Test
+  public void createReviewableChangeWithReviewersAndCcs() throws Exception {
+    StagedPreChange spc =
+        stagePreChange(
+            "refs/for/master",
+            users -> ImmutableList.of("r=" + users.reviewer.username, "cc=" + users.ccer.username));
+    FakeEmailSenderSubject subject =
+        assertThat(sender).sent("newchange", spc).to(spc.reviewer, spc.watchingProjectOwner);
+    if (notesMigration.readChanges()) {
+      subject.cc(spc.ccer);
+    } else {
+      // CCs are considered reviewers in the storage layer.
+      subject.to(spc.ccer);
+    }
+    subject.bcc(NEW_CHANGES, NEW_PATCHSETS).noOneElse();
+  }
+
+  @Test
+  public void createReviewableChangeWithReviewersAndCcsByEmailInNoteDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedPreChange spc =
+        stagePreChange(
+            "refs/for/master",
+            users -> ImmutableList.of("r=nobody1@example.com,cc=nobody2@example.com"));
+    spc.supportReviewersByEmail = true;
+    assertThat(sender)
+        .sent("newchange", spc)
+        .to("nobody1@example.com")
+        .to(spc.watchingProjectOwner)
+        .cc("nobody2@example.com")
+        .bcc(NEW_CHANGES, NEW_PATCHSETS)
+        .noOneElse();
+  }
+
+  /*
+   * DeleteReviewerSender tests.
+   */
+
+  @Test
+  public void deleteReviewerFromReviewableChange() throws Exception {
+    StagedChange sc = stageReviewableChangeWithExtraReviewer();
+    setApiUser(sc.owner);
+    removeReviewer(sc, extraReviewer);
+    assertThat(sender)
+        .sent("deleteReviewer", sc)
+        .to(extraReviewer)
+        .cc(extraCcer, sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void deleteReviewerFromReviewableChangeByOwnerCcingSelf() throws Exception {
+    StagedChange sc = stageReviewableChangeWithExtraReviewer();
+    setEmailStrategy(sc.owner, EmailStrategy.CC_ON_OWN_COMMENTS);
+    removeReviewer(sc, extraReviewer);
+    assertThat(sender)
+        .sent("deleteReviewer", sc)
+        .to(sc.owner, extraReviewer)
+        .cc(extraCcer, sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void deleteReviewerFromReviewableChangeByAdmin() throws Exception {
+    StagedChange sc = stageReviewableChangeWithExtraReviewer();
+    setApiUser(admin);
+    removeReviewer(sc, extraReviewer);
+    assertThat(sender)
+        .sent("deleteReviewer", sc)
+        .to(sc.owner, extraReviewer)
+        .cc(extraCcer, sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void deleteReviewerFromReviewableChangeByAdminCcingSelf() throws Exception {
+    StagedChange sc = stageReviewableChangeWithExtraReviewer();
+    setEmailStrategy(admin, EmailStrategy.CC_ON_OWN_COMMENTS);
+    setApiUser(admin);
+    removeReviewer(sc, extraReviewer);
+    assertThat(sender)
+        .sent("deleteReviewer", sc)
+        .to(sc.owner, extraReviewer)
+        .cc(admin, extraCcer, sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void deleteCcerFromReviewableChange() throws Exception {
+    StagedChange sc = stageReviewableChangeWithExtraReviewer();
+    setApiUser(sc.owner);
+    removeReviewer(sc, extraCcer);
+    assertThat(sender)
+        .sent("deleteReviewer", sc)
+        .to(extraCcer)
+        .cc(sc.reviewer, sc.ccer, extraReviewer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void deleteReviewerFromReviewableChangeNotifyOwnerReviewers() throws Exception {
+    StagedChange sc = stageReviewableChangeWithExtraReviewer();
+    setApiUser(sc.owner);
+    removeReviewer(sc, extraReviewer, NotifyHandling.OWNER_REVIEWERS);
+    assertThat(sender)
+        .sent("deleteReviewer", sc)
+        .to(extraReviewer)
+        .cc(extraCcer, sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .noOneElse();
+  }
+
+  @Test
+  public void deleteReviewerFromReviewableChangeNotifyOwner() throws Exception {
+    StagedChange sc = stageReviewableChangeWithExtraReviewer();
+    removeReviewer(sc, extraReviewer, NotifyHandling.OWNER);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void deleteReviewerFromReviewableChangeByOwnerCcingSelfNotifyOwner() throws Exception {
+    StagedChange sc = stageReviewableChangeWithExtraReviewer();
+    setEmailStrategy(sc.owner, EmailStrategy.CC_ON_OWN_COMMENTS);
+    removeReviewer(sc, extraReviewer, NotifyHandling.OWNER);
+    assertThat(sender).sent("deleteReviewer", sc).to(sc.owner, extraReviewer).noOneElse();
+  }
+
+  @Test
+  public void deleteReviewerFromReviewableChangeNotifyNone() throws Exception {
+    StagedChange sc = stageReviewableChangeWithExtraReviewer();
+    removeReviewer(sc, extraReviewer, NotifyHandling.NONE);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void deleteReviewerFromReviewableChangeByOwnerCcingSelfNotifyNone() throws Exception {
+    StagedChange sc = stageReviewableChangeWithExtraReviewer();
+    setEmailStrategy(sc.owner, EmailStrategy.CC_ON_OWN_COMMENTS);
+    removeReviewer(sc, extraReviewer, NotifyHandling.NONE);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void deleteReviewerFromReviewableWipChange() throws Exception {
+    StagedChange sc = stageReviewableWipChangeWithExtraReviewer();
+    removeReviewer(sc, extraReviewer);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void deleteReviewerFromWipChange() throws Exception {
+    StagedChange sc = stageWipChangeWithExtraReviewer();
+    removeReviewer(sc, extraReviewer);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void deleteReviewerFromWipChangeNotifyAll() throws Exception {
+    StagedChange sc = stageWipChangeWithExtraReviewer();
+    setApiUser(sc.owner);
+    removeReviewer(sc, extraReviewer, NotifyHandling.ALL);
+    assertThat(sender)
+        .sent("deleteReviewer", sc)
+        .to(extraReviewer)
+        .cc(extraCcer, sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void deleteReviewerWithApprovalFromWipChange() throws Exception {
+    StagedChange sc = stageWipChangeWithExtraReviewer();
+    recommend(sc, extraReviewer);
+    setApiUser(sc.owner);
+    removeReviewer(sc, extraReviewer);
+    assertThat(sender).sent("deleteReviewer", sc).to(extraReviewer).noOneElse();
+  }
+
+  @Test
+  public void deleteReviewerWithApprovalFromWipChangeNotifyOwner() throws Exception {
+    StagedChange sc = stageWipChangeWithExtraReviewer();
+    recommend(sc, extraReviewer);
+    removeReviewer(sc, extraReviewer, NotifyHandling.OWNER);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void deleteReviewerByEmailFromWipChangeInNoteDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedChange sc = stageWipChangeWithExtraReviewer();
+    gApi.changes().id(sc.changeId).reviewer(sc.reviewerByEmail).remove();
+    assertThat(sender).notSent();
+  }
+
+  private void recommend(StagedChange sc, TestAccount by) throws Exception {
+    setApiUser(by);
+    gApi.changes().id(sc.changeId).revision("current").review(ReviewInput.recommend());
+  }
+
+  private interface Stager {
+    StagedChange stage() throws Exception;
+  }
+
+  private StagedChange stageChangeWithExtraReviewer(Stager stager) throws Exception {
+    StagedChange sc = stager.stage();
+    ReviewInput in =
+        ReviewInput.noScore()
+            .reviewer(extraReviewer.email)
+            .reviewer(extraCcer.email, ReviewerState.CC, false);
+    setApiUser(extraReviewer);
+    gApi.changes().id(sc.changeId).revision("current").review(in);
+    return sc;
+  }
+
+  private StagedChange stageReviewableChangeWithExtraReviewer() throws Exception {
+    return stageChangeWithExtraReviewer(this::stageReviewableChange);
+  }
+
+  private StagedChange stageReviewableWipChangeWithExtraReviewer() throws Exception {
+    return stageChangeWithExtraReviewer(this::stageReviewableWipChange);
+  }
+
+  private StagedChange stageWipChangeWithExtraReviewer() throws Exception {
+    return stageChangeWithExtraReviewer(this::stageWipChange);
+  }
+
+  private void removeReviewer(StagedChange sc, TestAccount account) throws Exception {
+    sender.clear();
+    gApi.changes().id(sc.changeId).reviewer(account.email).remove();
+  }
+
+  private void removeReviewer(StagedChange sc, TestAccount account, NotifyHandling notify)
+      throws Exception {
+    sender.clear();
+    DeleteReviewerInput in = new DeleteReviewerInput();
+    in.notify = notify;
+    gApi.changes().id(sc.changeId).reviewer(account.email).remove(in);
+  }
+
+  /*
+   * DeleteVoteSender tests.
+   */
+
+  @Test
+  public void deleteVoteFromReviewableChange() throws Exception {
+    StagedChange sc = stageReviewableChangeWithExtraReviewer();
+    recommend(sc, extraReviewer);
+    setApiUser(sc.owner);
+    deleteVote(sc, extraReviewer);
+    assertThat(sender)
+        .sent("deleteVote", sc)
+        .cc(sc.reviewer, sc.ccer, extraReviewer, extraCcer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void deleteVoteFromReviewableChangeWithSelfCc() throws Exception {
+    StagedChange sc = stageReviewableChangeWithExtraReviewer();
+    recommend(sc, extraReviewer);
+    setEmailStrategy(sc.owner, CC_ON_OWN_COMMENTS);
+    setApiUser(sc.owner);
+    deleteVote(sc, extraReviewer);
+    assertThat(sender)
+        .sent("deleteVote", sc)
+        .to(sc.owner)
+        .cc(sc.reviewer, sc.ccer, extraReviewer, extraCcer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void deleteVoteFromReviewableChangeByAdmin() throws Exception {
+    StagedChange sc = stageReviewableChangeWithExtraReviewer();
+    recommend(sc, extraReviewer);
+    setApiUser(admin);
+    deleteVote(sc, extraReviewer);
+    assertThat(sender)
+        .sent("deleteVote", sc)
+        .to(sc.owner)
+        .cc(sc.reviewer, sc.ccer, extraReviewer, extraCcer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void deleteVoteFromReviewableChangeByAdminCcingSelf() throws Exception {
+    StagedChange sc = stageReviewableChangeWithExtraReviewer();
+    recommend(sc, extraReviewer);
+    setEmailStrategy(admin, EmailStrategy.CC_ON_OWN_COMMENTS);
+    setApiUser(admin);
+    deleteVote(sc, extraReviewer);
+    assertThat(sender)
+        .sent("deleteVote", sc)
+        .to(sc.owner)
+        .cc(sc.reviewer, sc.ccer, admin, extraReviewer, extraCcer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void deleteVoteFromReviewableChangeNotifyOwnerReviewers() throws Exception {
+    StagedChange sc = stageReviewableChangeWithExtraReviewer();
+    recommend(sc, extraReviewer);
+    setApiUser(sc.owner);
+    deleteVote(sc, extraReviewer, NotifyHandling.OWNER_REVIEWERS);
+    assertThat(sender)
+        .sent("deleteVote", sc)
+        .cc(sc.reviewer, sc.ccer, extraReviewer, extraCcer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .noOneElse();
+  }
+
+  @Test
+  public void deleteVoteFromReviewableChangeNotifyOwnerReviewersWithSelfCc() throws Exception {
+    StagedChange sc = stageReviewableChangeWithExtraReviewer();
+    recommend(sc, extraReviewer);
+    setEmailStrategy(sc.owner, CC_ON_OWN_COMMENTS);
+    setApiUser(sc.owner);
+    deleteVote(sc, extraReviewer, NotifyHandling.OWNER_REVIEWERS);
+    assertThat(sender)
+        .sent("deleteVote", sc)
+        .to(sc.owner)
+        .cc(sc.reviewer, sc.ccer, extraReviewer, extraCcer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .noOneElse();
+  }
+
+  @Test
+  public void deleteVoteFromReviewableChangeNotifyOwner() throws Exception {
+    StagedChange sc = stageReviewableChangeWithExtraReviewer();
+    recommend(sc, extraReviewer);
+    setApiUser(admin);
+    deleteVote(sc, extraReviewer, NotifyHandling.OWNER);
+    assertThat(sender).sent("deleteVote", sc).to(sc.owner).noOneElse();
+  }
+
+  @Test
+  public void deleteVoteFromReviewableChangeNotifyNone() throws Exception {
+    StagedChange sc = stageReviewableChangeWithExtraReviewer();
+    recommend(sc, extraReviewer);
+    setApiUser(sc.owner);
+    deleteVote(sc, extraReviewer, NotifyHandling.NONE);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void deleteVoteFromReviewableChangeNotifyNoneWithSelfCc() throws Exception {
+    StagedChange sc = stageReviewableChangeWithExtraReviewer();
+    recommend(sc, extraReviewer);
+    setEmailStrategy(sc.owner, CC_ON_OWN_COMMENTS);
+    setApiUser(sc.owner);
+    deleteVote(sc, extraReviewer, NotifyHandling.NONE);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void deleteVoteFromReviewableWipChange() throws Exception {
+    StagedChange sc = stageReviewableWipChangeWithExtraReviewer();
+    recommend(sc, extraReviewer);
+    setApiUser(sc.owner);
+    deleteVote(sc, extraReviewer);
+    assertThat(sender)
+        .sent("deleteVote", sc)
+        .cc(sc.reviewer, sc.ccer, extraReviewer, extraCcer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void deleteVoteFromWipChange() throws Exception {
+    StagedChange sc = stageWipChangeWithExtraReviewer();
+    recommend(sc, extraReviewer);
+    setApiUser(sc.owner);
+    deleteVote(sc, extraReviewer);
+    assertThat(sender)
+        .sent("deleteVote", sc)
+        .cc(sc.reviewer, sc.ccer, extraReviewer, extraCcer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  private void deleteVote(StagedChange sc, TestAccount account) throws Exception {
+    sender.clear();
+    gApi.changes().id(sc.changeId).reviewer(account.email).deleteVote("Code-Review");
+  }
+
+  private void deleteVote(StagedChange sc, TestAccount account, NotifyHandling notify)
+      throws Exception {
+    sender.clear();
+    DeleteVoteInput in = new DeleteVoteInput();
+    in.label = "Code-Review";
+    in.notify = notify;
+    gApi.changes().id(sc.changeId).reviewer(account.email).deleteVote(in);
+  }
+
+  /*
+   * MergedSender tests.
+   */
+
+  @Test
+  public void mergeByOwner() throws Exception {
+    StagedChange sc = stageChangeReadyForMerge();
+    merge(sc.changeId, sc.owner);
+    assertThat(sender)
+        .sent("merged", sc)
+        .cc(sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS, SUBMITTED_CHANGES)
+        .noOneElse();
+  }
+
+  @Test
+  public void mergeByOwnerCcingSelf() throws Exception {
+    StagedChange sc = stageChangeReadyForMerge();
+    merge(sc.changeId, sc.owner, EmailStrategy.CC_ON_OWN_COMMENTS);
+    assertThat(sender)
+        .sent("merged", sc)
+        .to(sc.owner)
+        .cc(sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS, SUBMITTED_CHANGES)
+        .noOneElse();
+  }
+
+  @Test
+  public void mergeByReviewer() throws Exception {
+    StagedChange sc = stageChangeReadyForMerge();
+    merge(sc.changeId, sc.reviewer);
+    assertThat(sender)
+        .sent("merged", sc)
+        .to(sc.owner)
+        .cc(sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS, SUBMITTED_CHANGES)
+        .noOneElse();
+  }
+
+  @Test
+  public void mergeByReviewerCcingSelf() throws Exception {
+    StagedChange sc = stageChangeReadyForMerge();
+    merge(sc.changeId, sc.reviewer, EmailStrategy.CC_ON_OWN_COMMENTS);
+    assertThat(sender)
+        .sent("merged", sc)
+        .to(sc.owner)
+        .cc(sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS, SUBMITTED_CHANGES)
+        .noOneElse();
+  }
+
+  @Test
+  public void mergeByOtherNotifyOwnerReviewers() throws Exception {
+    StagedChange sc = stageChangeReadyForMerge();
+    merge(sc.changeId, other, OWNER_REVIEWERS);
+    assertThat(sender)
+        .sent("merged", sc)
+        .to(sc.owner)
+        .cc(sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .noOneElse();
+  }
+
+  @Test
+  public void mergeByOtherNotifyOwner() throws Exception {
+    StagedChange sc = stageChangeReadyForMerge();
+    merge(sc.changeId, other, OWNER);
+    assertThat(sender).sent("merged", sc).to(sc.owner).noOneElse();
+  }
+
+  @Test
+  public void mergeByOtherCcingSelfNotifyOwner() throws Exception {
+    StagedChange sc = stageChangeReadyForMerge();
+    setEmailStrategy(other, EmailStrategy.CC_ON_OWN_COMMENTS);
+    merge(sc.changeId, other, OWNER);
+    assertThat(sender).sent("merged", sc).to(sc.owner).noOneElse();
+  }
+
+  @Test
+  public void mergeByOtherNotifyNone() throws Exception {
+    StagedChange sc = stageChangeReadyForMerge();
+    merge(sc.changeId, other, NONE);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void mergeByOtherCcingSelfNotifyNone() throws Exception {
+    StagedChange sc = stageChangeReadyForMerge();
+    setEmailStrategy(other, EmailStrategy.CC_ON_OWN_COMMENTS);
+    merge(sc.changeId, other, NONE);
+    assertThat(sender).notSent();
+  }
+
+  private void merge(String changeId, TestAccount by) throws Exception {
+    merge(changeId, by, ENABLED);
+  }
+
+  private void merge(String changeId, TestAccount by, EmailStrategy emailStrategy)
+      throws Exception {
+    setEmailStrategy(by, emailStrategy);
+    setApiUser(by);
+    gApi.changes().id(changeId).revision("current").submit();
+  }
+
+  private void merge(String changeId, TestAccount by, NotifyHandling notify) throws Exception {
+    merge(changeId, by, ENABLED, notify);
+  }
+
+  private void merge(
+      String changeId, TestAccount by, EmailStrategy emailStrategy, NotifyHandling notify)
+      throws Exception {
+    setEmailStrategy(by, emailStrategy);
+    setApiUser(by);
+    SubmitInput in = new SubmitInput();
+    in.notify = notify;
+    gApi.changes().id(changeId).revision("current").submit(in);
+  }
+
+  private StagedChange stageChangeReadyForMerge() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    setApiUser(sc.reviewer);
+    gApi.changes().id(sc.changeId).revision("current").review(ReviewInput.approve());
+    sender.clear();
+    return sc;
+  }
+
+  /*
+   * ReplacePatchSetSender tests.
+   */
+
+  @Test
+  public void newPatchSetByOwnerOnReviewableChangeInNoteDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedChange sc = stageReviewableChange();
+    pushTo(sc, "refs/for/master", sc.owner);
+    assertThat(sender)
+        .sent("newpatchset", sc)
+        .to(sc.reviewer)
+        .cc(sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(NEW_PATCHSETS)
+        .noOneElse();
+  }
+
+  @Test
+  public void newPatchSetByOwnerOnReviewableChangeInReviewDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isFalse();
+    StagedChange sc = stageReviewableChange();
+    pushTo(sc, "refs/for/master", sc.owner);
+    assertThat(sender)
+        .sent("newpatchset", sc)
+        .to(sc.reviewer, sc.ccer)
+        .bcc(sc.starrer)
+        .bcc(NEW_PATCHSETS)
+        .noOneElse();
+  }
+
+  @Test
+  public void newPatchSetByOtherOnReviewableChangeInNoteDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedChange sc = stageReviewableChange();
+    pushTo(sc, "refs/for/master", other);
+    assertThat(sender)
+        .sent("newpatchset", sc)
+        .notTo(sc.owner) // TODO(logan): This shouldn't be sent *from* the owner.
+        .to(sc.reviewer, other)
+        .cc(sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(NEW_PATCHSETS)
+        .noOneElse();
+  }
+
+  @Test
+  public void newPatchSetByOtherOnReviewableChangeInReviewDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isFalse();
+    StagedChange sc = stageReviewableChange();
+    pushTo(sc, "refs/for/master", other);
+    assertThat(sender)
+        .sent("newpatchset", sc)
+        .notTo(sc.owner) // TODO(logan): This email shouldn't come from the owner.
+        .to(sc.reviewer, sc.ccer, other)
+        .bcc(sc.starrer)
+        .bcc(NEW_PATCHSETS)
+        .noOneElse();
+  }
+
+  @Test
+  public void newPatchSetByOtherOnReviewableChangeOwnerSelfCcInNoteDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedChange sc = stageReviewableChange();
+    pushTo(sc, "refs/for/master", other, EmailStrategy.CC_ON_OWN_COMMENTS);
+    assertThat(sender)
+        .sent("newpatchset", sc)
+        .notTo(sc.owner) // TODO(logan): This shouldn't be sent *from* the owner.
+        .to(sc.reviewer, other)
+        .cc(sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(NEW_PATCHSETS)
+        .noOneElse();
+  }
+
+  @Test
+  public void newPatchSetByOtherOnReviewableChangeOwnerSelfCcInReviewDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isFalse();
+    StagedChange sc = stageReviewableChange();
+    pushTo(sc, "refs/for/master", other, EmailStrategy.CC_ON_OWN_COMMENTS);
+    assertThat(sender)
+        .sent("newpatchset", sc)
+        .notTo(sc.owner) // TODO(logan): This shouldn't be sent *from* the owner.
+        .to(sc.reviewer, sc.ccer, other)
+        .bcc(sc.starrer)
+        .bcc(NEW_PATCHSETS)
+        .noOneElse();
+  }
+
+  @Test
+  public void newPatchSetByOtherOnReviewableChangeNotifyOwnerReviewersInNoteDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedChange sc = stageReviewableChange();
+    pushTo(sc, "refs/for/master%notify=OWNER_REVIEWERS", other);
+    assertThat(sender)
+        .sent("newpatchset", sc)
+        .notTo(sc.owner) // TODO(logan): This shouldn't be sent *from* the owner.
+        .to(sc.reviewer)
+        .to(other)
+        .cc(sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .noOneElse();
+  }
+
+  @Test
+  public void newPatchSetByOtherOnReviewableChangeNotifyOwnerReviewersInReviewDb()
+      throws Exception {
+    assume().that(notesMigration.readChanges()).isFalse();
+    StagedChange sc = stageReviewableChange();
+    pushTo(sc, "refs/for/master%notify=OWNER_REVIEWERS", other);
+    assertThat(sender)
+        .sent("newpatchset", sc)
+        .notTo(sc.owner) // TODO(logan): This shouldn't be sent *from* the owner.
+        .to(sc.reviewer, sc.ccer)
+        .to(other)
+        .noOneElse();
+  }
+
+  @Test
+  public void newPatchSetByOtherOnReviewableChangeOwnerSelfCcNotifyOwnerReviewersInNoteDb()
+      throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedChange sc = stageReviewableChange();
+    pushTo(sc, "refs/for/master%notify=OWNER_REVIEWERS", other, EmailStrategy.CC_ON_OWN_COMMENTS);
+    assertThat(sender)
+        .sent("newpatchset", sc)
+        .notTo(sc.owner) // TODO(logan): This shouldn't be sent *from* the owner.
+        .to(sc.reviewer)
+        .to(other)
+        .cc(sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .noOneElse();
+  }
+
+  @Test
+  public void newPatchSetByOtherOnReviewableChangeOwnerSelfCcNotifyOwnerReviewersInReviewDb()
+      throws Exception {
+    assume().that(notesMigration.readChanges()).isFalse();
+    StagedChange sc = stageReviewableChange();
+    pushTo(sc, "refs/for/master%notify=OWNER_REVIEWERS", other, EmailStrategy.CC_ON_OWN_COMMENTS);
+    assertThat(sender)
+        .sent("newpatchset", sc)
+        .to(sc.reviewer, sc.ccer)
+        .to(other)
+        .notTo(sc.owner) // TODO(logan): This shouldn't be sent *from* the owner.
+        .noOneElse();
+  }
+
+  @Test
+  public void newPatchSetByOtherOnReviewableChangeNotifyOwner() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    pushTo(sc, "refs/for/master%notify=OWNER", other);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void newPatchSetByOtherOnReviewableChangeOwnerSelfCcNotifyOwner() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    pushTo(sc, "refs/for/master%notify=OWNER", other, EmailStrategy.CC_ON_OWN_COMMENTS);
+    // TODO(logan): This email shouldn't come from the owner, and that's why
+    // no email is currently sent (owner isn't CCing self).
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void newPatchSetByOtherOnReviewableChangeNotifyNone() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    pushTo(sc, "refs/for/master%notify=NONE", other);
+    // TODO(logan): This email shouldn't come from the owner, and that's why
+    // no email is currently sent (owner isn't CCing self).
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void newPatchSetByOtherOnReviewableChangeOwnerSelfCcNotifyNone() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    pushTo(sc, "refs/for/master%notify=NONE", other, EmailStrategy.CC_ON_OWN_COMMENTS);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void newPatchSetByOwnerOnReviewableChangeToWip() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    pushTo(sc, "refs/for/master%wip", sc.owner);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void newPatchSetOnWipChange() throws Exception {
+    StagedChange sc = stageWipChange();
+    pushTo(sc, "refs/for/master%wip", sc.owner);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void newPatchSetOnWipChangeNotifyAllInNoteDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedChange sc = stageWipChange();
+    pushTo(sc, "refs/for/master%wip,notify=ALL", sc.owner);
+    assertThat(sender)
+        .sent("newpatchset", sc)
+        .to(sc.reviewer)
+        .cc(sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(NEW_PATCHSETS)
+        .noOneElse();
+  }
+
+  @Test
+  public void newPatchSetOnWipChangeNotifyAllInReviewDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isFalse();
+    StagedChange sc = stageWipChange();
+    pushTo(sc, "refs/for/master%wip,notify=ALL", sc.owner);
+    assertThat(sender)
+        .sent("newpatchset", sc)
+        .to(sc.reviewer, sc.ccer)
+        .bcc(sc.starrer)
+        .bcc(NEW_PATCHSETS)
+        .noOneElse();
+  }
+
+  @Test
+  public void newPatchSetOnWipChangeToReadyInNoteDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedChange sc = stageWipChange();
+    pushTo(sc, "refs/for/master%ready", sc.owner);
+    assertThat(sender)
+        .sent("newpatchset", sc)
+        .to(sc.reviewer)
+        .cc(sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(NEW_PATCHSETS)
+        .noOneElse();
+  }
+
+  @Test
+  public void newPatchSetOnWipChangeToReadyInReviewDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isFalse();
+    StagedChange sc = stageWipChange();
+    pushTo(sc, "refs/for/master%ready", sc.owner);
+    assertThat(sender)
+        .sent("newpatchset", sc)
+        .to(sc.reviewer, sc.ccer)
+        .bcc(sc.starrer)
+        .bcc(NEW_PATCHSETS)
+        .noOneElse();
+  }
+
+  @Test
+  public void newPatchSetOnReviewableWipChange() throws Exception {
+    StagedChange sc = stageReviewableWipChange();
+    pushTo(sc, "refs/for/master%wip", sc.owner);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void newPatchSetOnReviewableChangeAddingReviewerInNoteDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedChange sc = stageReviewableChange();
+    TestAccount newReviewer = sc.testAccount("newReviewer");
+    pushTo(sc, "refs/for/master%r=" + newReviewer.username, sc.owner);
+    assertThat(sender)
+        .sent("newpatchset", sc)
+        .to(sc.reviewer, newReviewer)
+        .cc(sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(NEW_PATCHSETS)
+        .noOneElse();
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void newPatchSetOnReviewableChangeAddingReviewerInReviewDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isFalse();
+    StagedChange sc = stageReviewableChange();
+    TestAccount newReviewer = sc.testAccount("newReviewer");
+    pushTo(sc, "refs/for/master%r=" + newReviewer.username, sc.owner);
+    assertThat(sender)
+        .sent("newpatchset", sc)
+        .to(sc.reviewer, sc.ccer, newReviewer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(NEW_PATCHSETS)
+        .noOneElse();
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void newPatchSetOnWipChangeAddingReviewer() throws Exception {
+    StagedChange sc = stageWipChange();
+    TestAccount newReviewer = sc.testAccount("newReviewer");
+    pushTo(sc, "refs/for/master%r=" + newReviewer.username, sc.owner);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void newPatchSetOnWipChangeAddingReviewerNotifyAllInNoteDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedChange sc = stageWipChange();
+    TestAccount newReviewer = sc.testAccount("newReviewer");
+    pushTo(sc, "refs/for/master%notify=ALL,r=" + newReviewer.username, sc.owner);
+    assertThat(sender)
+        .sent("newpatchset", sc)
+        .to(sc.reviewer, newReviewer)
+        .cc(sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(NEW_PATCHSETS)
+        .noOneElse();
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void newPatchSetOnWipChangeAddingReviewerNotifyAllInReviewDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isFalse();
+    StagedChange sc = stageWipChange();
+    TestAccount newReviewer = sc.testAccount("newReviewer");
+    pushTo(sc, "refs/for/master%notify=ALL,r=" + newReviewer.username, sc.owner);
+    assertThat(sender)
+        .sent("newpatchset", sc)
+        .to(sc.reviewer, sc.ccer, newReviewer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(NEW_PATCHSETS)
+        .noOneElse();
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void newPatchSetOnWipChangeSettingReadyInNoteDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedChange sc = stageWipChange();
+    pushTo(sc, "refs/for/master%ready", sc.owner);
+    assertThat(sender)
+        .sent("newpatchset", sc)
+        .to(sc.reviewer)
+        .cc(sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(NEW_PATCHSETS)
+        .noOneElse();
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void newPatchSetOnWipChangeSettingReadyInReviewDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isFalse();
+    StagedChange sc = stageWipChange();
+    pushTo(sc, "refs/for/master%ready", sc.owner);
+    assertThat(sender)
+        .sent("newpatchset", sc)
+        .to(sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(NEW_PATCHSETS)
+        .noOneElse();
+    assertThat(sender).notSent();
+  }
+
+  private void pushTo(StagedChange sc, String ref, TestAccount by) throws Exception {
+    pushTo(sc, ref, by, ENABLED);
+  }
+
+  private void pushTo(StagedChange sc, String ref, TestAccount by, EmailStrategy emailStrategy)
+      throws Exception {
+    setEmailStrategy(by, emailStrategy);
+    pushFactory.create(db, by.getIdent(), sc.repo, sc.changeId).to(ref).assertOkStatus();
+  }
+
+  @Test
+  public void editCommitMessageEditByOwnerOnReviewableChangeInNoteDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedChange sc = stageReviewableChange();
+    editCommitMessage(sc, sc.owner);
+    assertThat(sender)
+        .sent("newpatchset", sc)
+        .to(sc.reviewer)
+        .cc(sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(NEW_PATCHSETS)
+        .noOneElse();
+  }
+
+  @Test
+  public void editCommitMessageEditByOwnerOnReviewableChangeInReviewDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isFalse();
+    StagedChange sc = stageReviewableChange();
+    editCommitMessage(sc, sc.owner);
+    assertThat(sender)
+        .sent("newpatchset", sc)
+        .to(sc.reviewer, sc.ccer)
+        .bcc(sc.starrer)
+        .bcc(NEW_PATCHSETS)
+        .noOneElse();
+  }
+
+  @Test
+  public void editCommitMessageEditByOtherOnReviewableChangeInNoteDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedChange sc = stageReviewableChange();
+    editCommitMessage(sc, other);
+    assertThat(sender)
+        .sent("newpatchset", sc)
+        .to(sc.owner, sc.reviewer)
+        .cc(sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(NEW_PATCHSETS)
+        .noOneElse();
+  }
+
+  @Test
+  public void editCommitMessageEditByOtherOnReviewableChangeInReviewDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isFalse();
+    StagedChange sc = stageReviewableChange();
+    editCommitMessage(sc, other);
+    assertThat(sender)
+        .sent("newpatchset", sc)
+        .to(sc.owner, sc.reviewer, sc.ccer)
+        .bcc(sc.starrer)
+        .bcc(NEW_PATCHSETS)
+        .noOneElse();
+  }
+
+  @Test
+  public void editCommitMessageByOtherOnReviewableChangeOwnerSelfCcInNoteDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedChange sc = stageReviewableChange();
+    editCommitMessage(sc, other, CC_ON_OWN_COMMENTS);
+    assertThat(sender)
+        .sent("newpatchset", sc)
+        .to(sc.owner, sc.reviewer, other)
+        .cc(sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(NEW_PATCHSETS)
+        .noOneElse();
+  }
+
+  @Test
+  public void editCommitMessageByOtherOnReviewableChangeOwnerSelfCcInReviewDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isFalse();
+    StagedChange sc = stageReviewableChange();
+    editCommitMessage(sc, other, CC_ON_OWN_COMMENTS);
+    assertThat(sender)
+        .sent("newpatchset", sc)
+        .to(sc.owner, sc.reviewer, sc.ccer, other)
+        .bcc(sc.starrer)
+        .bcc(NEW_PATCHSETS)
+        .noOneElse();
+  }
+
+  @Test
+  public void editCommitMessageByOtherOnReviewableChangeNotifyOwnerReviewersInNoteDb()
+      throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedChange sc = stageReviewableChange();
+    editCommitMessage(sc, other, OWNER_REVIEWERS);
+    assertThat(sender)
+        .sent("newpatchset", sc)
+        .to(sc.owner, sc.reviewer)
+        .cc(sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .noOneElse();
+  }
+
+  @Test
+  public void editCommitMessageByOtherOnReviewableChangeNotifyOwnerReviewersInReviewDb()
+      throws Exception {
+    assume().that(notesMigration.readChanges()).isFalse();
+    StagedChange sc = stageReviewableChange();
+    editCommitMessage(sc, other, OWNER_REVIEWERS);
+    assertThat(sender).sent("newpatchset", sc).to(sc.owner, sc.reviewer, sc.ccer).noOneElse();
+  }
+
+  @Test
+  public void editCommitMessageByOtherOnReviewableChangeOwnerSelfCcNotifyOwnerReviewersInNoteDb()
+      throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedChange sc = stageReviewableChange();
+    editCommitMessage(sc, other, OWNER_REVIEWERS, CC_ON_OWN_COMMENTS);
+    assertThat(sender)
+        .sent("newpatchset", sc)
+        .to(sc.owner, sc.reviewer)
+        .cc(sc.ccer, other)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .noOneElse();
+  }
+
+  @Test
+  public void editCommitMessageByOtherOnReviewableChangeOwnerSelfCcNotifyOwnerReviewersInReviewDb()
+      throws Exception {
+    assume().that(notesMigration.readChanges()).isFalse();
+    StagedChange sc = stageReviewableChange();
+    editCommitMessage(sc, other, OWNER_REVIEWERS, CC_ON_OWN_COMMENTS);
+    assertThat(sender)
+        .sent("newpatchset", sc)
+        .to(sc.owner, sc.reviewer, sc.ccer)
+        .cc(other)
+        .noOneElse();
+  }
+
+  @Test
+  public void editCommitMessageByOtherOnReviewableChangeNotifyOwner() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    editCommitMessage(sc, other, OWNER);
+    assertThat(sender).sent("newpatchset", sc).to(sc.owner).noOneElse();
+  }
+
+  @Test
+  public void editCommitMessageByOtherOnReviewableChangeOwnerSelfCcNotifyOwner() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    editCommitMessage(sc, other, OWNER, CC_ON_OWN_COMMENTS);
+    assertThat(sender).sent("newpatchset", sc).to(sc.owner).cc(other).noOneElse();
+  }
+
+  @Test
+  public void editCommitMessageByOtherOnReviewableChangeNotifyNone() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    editCommitMessage(sc, other, NONE);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void editCommitMessageByOtherOnReviewableChangeOwnerSelfCcNotifyNone() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    editCommitMessage(sc, other, NONE, CC_ON_OWN_COMMENTS);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void editCommitMessageOnWipChange() throws Exception {
+    StagedChange sc = stageWipChange();
+    editCommitMessage(sc, sc.owner);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void editCommitMessageByOtherOnWipChange() throws Exception {
+    StagedChange sc = stageWipChange();
+    editCommitMessage(sc, other);
+    assertThat(sender).sent("newpatchset", sc).to(sc.owner).noOneElse();
+  }
+
+  @Test
+  public void editCommitMessageByOtherOnWipChangeSelfCc() throws Exception {
+    StagedChange sc = stageWipChange();
+    editCommitMessage(sc, other, CC_ON_OWN_COMMENTS);
+    assertThat(sender).sent("newpatchset", sc).to(sc.owner).cc(other).noOneElse();
+  }
+
+  @Test
+  public void editCommitMessageOnWipChangeNotifyAllInNoteDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedChange sc = stageWipChange();
+    editCommitMessage(sc, sc.owner, ALL);
+    assertThat(sender)
+        .sent("newpatchset", sc)
+        .to(sc.reviewer)
+        .cc(sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(NEW_PATCHSETS)
+        .noOneElse();
+  }
+
+  @Test
+  public void editCommitMessageOnWipChangeNotifyAllInReviewDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isFalse();
+    StagedChange sc = stageWipChange();
+    editCommitMessage(sc, sc.owner, ALL);
+    assertThat(sender)
+        .sent("newpatchset", sc)
+        .to(sc.reviewer, sc.ccer)
+        .bcc(sc.starrer)
+        .bcc(NEW_PATCHSETS)
+        .noOneElse();
+  }
+
+  private void editCommitMessage(StagedChange sc, TestAccount by) throws Exception {
+    editCommitMessage(sc, by, null, ENABLED);
+  }
+
+  private void editCommitMessage(StagedChange sc, TestAccount by, @Nullable NotifyHandling notify)
+      throws Exception {
+    editCommitMessage(sc, by, notify, ENABLED);
+  }
+
+  private void editCommitMessage(StagedChange sc, TestAccount by, EmailStrategy emailStrategy)
+      throws Exception {
+    editCommitMessage(sc, by, null, emailStrategy);
+  }
+
+  private void editCommitMessage(
+      StagedChange sc, TestAccount by, @Nullable NotifyHandling notify, EmailStrategy emailStrategy)
+      throws Exception {
+    setEmailStrategy(by, emailStrategy);
+    CommitInfo commit = gApi.changes().id(sc.changeId).revision("current").commit(false);
+    CommitMessageInput in = new CommitMessageInput();
+    in.message = "update\n" + commit.message;
+    in.notify = notify;
+    gApi.changes().id(sc.changeId).setMessage(in);
+  }
+
+  /*
+   * RestoredSender tests.
+   */
+
+  @Test
+  public void restoreReviewableChange() throws Exception {
+    StagedChange sc = stageAbandonedReviewableChange();
+    restore(sc.changeId, sc.owner);
+    assertThat(sender)
+        .sent("restore", sc)
+        .cc(sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void restoreReviewableWipChange() throws Exception {
+    StagedChange sc = stageAbandonedReviewableWipChange();
+    restore(sc.changeId, sc.owner);
+    assertThat(sender)
+        .sent("restore", sc)
+        .cc(sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void restoreWipChange() throws Exception {
+    StagedChange sc = stageAbandonedWipChange();
+    restore(sc.changeId, sc.owner);
+    assertThat(sender)
+        .sent("restore", sc)
+        .cc(sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void restoreReviewableChangeByAdmin() throws Exception {
+    StagedChange sc = stageAbandonedReviewableChange();
+    restore(sc.changeId, admin);
+    assertThat(sender)
+        .sent("restore", sc)
+        .to(sc.owner)
+        .cc(sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void restoreReviewableChangeByOwnerCcingSelf() throws Exception {
+    StagedChange sc = stageAbandonedReviewableChange();
+    restore(sc.changeId, sc.owner, CC_ON_OWN_COMMENTS);
+    assertThat(sender)
+        .sent("restore", sc)
+        .to(sc.owner)
+        .cc(sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void restoreReviewableChangeByAdminCcingSelf() throws Exception {
+    StagedChange sc = stageAbandonedReviewableChange();
+    restore(sc.changeId, admin, CC_ON_OWN_COMMENTS);
+    assertThat(sender)
+        .sent("restore", sc)
+        .to(sc.owner)
+        .cc(sc.reviewer, sc.ccer, admin)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  private void restore(String changeId, TestAccount by) throws Exception {
+    restore(changeId, by, ENABLED);
+  }
+
+  private void restore(String changeId, TestAccount by, EmailStrategy emailStrategy)
+      throws Exception {
+    setEmailStrategy(by, emailStrategy);
+    setApiUser(by);
+    gApi.changes().id(changeId).restore();
+  }
+
+  /*
+   * RevertedSender tests.
+   */
+
+  @Test
+  public void revertChangeByOwnerInReviewDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isFalse();
+    StagedChange sc = stageChange();
+    revert(sc, sc.owner);
+
+    // email for the newly created revert change
+    assertThat(sender)
+        .sent("newchange", sc)
+        .to(sc.reviewer, sc.ccer, sc.watchingProjectOwner, admin)
+        .bcc(NEW_CHANGES, NEW_PATCHSETS)
+        .noOneElse();
+
+    // email for the change that is reverted
+    assertThat(sender)
+        .sent("revert", sc)
+        .cc(sc.reviewer, sc.ccer, admin)
+        .cc(sc.reviewerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void revertChangeByOwnerInNoteDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedChange sc = stageChange();
+    revert(sc, sc.owner);
+
+    // email for the newly created revert change
+    assertThat(sender)
+        .sent("newchange", sc)
+        .to(sc.reviewer, sc.watchingProjectOwner, admin)
+        .cc(sc.ccer)
+        .bcc(NEW_CHANGES, NEW_PATCHSETS)
+        .noOneElse();
+
+    // email for the change that is reverted
+    assertThat(sender)
+        .sent("revert", sc)
+        .cc(sc.reviewer, sc.ccer, admin)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void revertChangeByOwnerCcingSelfInReviewDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isFalse();
+    StagedChange sc = stageChange();
+    revert(sc, sc.owner, CC_ON_OWN_COMMENTS);
+
+    // email for the newly created revert change
+    assertThat(sender)
+        .sent("newchange", sc)
+        .to(sc.reviewer, sc.ccer, sc.watchingProjectOwner, admin)
+        .cc(sc.owner)
+        .bcc(NEW_CHANGES, NEW_PATCHSETS)
+        .noOneElse();
+
+    // email for the change that is reverted
+    assertThat(sender)
+        .sent("revert", sc)
+        .to(sc.owner)
+        .cc(sc.reviewer, sc.ccer, admin)
+        .cc(sc.reviewerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void revertChangeByOwnerCcingSelfInNoteDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedChange sc = stageChange();
+    revert(sc, sc.owner, CC_ON_OWN_COMMENTS);
+
+    // email for the newly created revert change
+    assertThat(sender)
+        .sent("newchange", sc)
+        .to(sc.reviewer, sc.watchingProjectOwner, admin)
+        .cc(sc.owner, sc.ccer)
+        .bcc(NEW_CHANGES, NEW_PATCHSETS)
+        .noOneElse();
+
+    // email for the change that is reverted
+    assertThat(sender)
+        .sent("revert", sc)
+        .to(sc.owner)
+        .cc(sc.reviewer, sc.ccer, admin)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void revertChangeByOtherInReviewDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isFalse();
+    StagedChange sc = stageChange();
+    revert(sc, other);
+
+    // email for the newly created revert change
+    assertThat(sender)
+        .sent("newchange", sc)
+        .to(sc.owner, sc.reviewer, sc.ccer, sc.watchingProjectOwner, admin)
+        .bcc(NEW_CHANGES, NEW_PATCHSETS)
+        .noOneElse();
+
+    // email for the change that is reverted
+    assertThat(sender)
+        .sent("revert", sc)
+        .to(sc.owner)
+        .cc(sc.reviewer, sc.ccer, admin)
+        .cc(sc.reviewerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void revertChangeByOtherInNoteDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedChange sc = stageChange();
+    revert(sc, other);
+
+    // email for the newly created revert change
+    assertThat(sender)
+        .sent("newchange", sc)
+        .to(sc.owner, sc.reviewer, sc.watchingProjectOwner, admin)
+        .cc(sc.ccer)
+        .bcc(NEW_CHANGES, NEW_PATCHSETS)
+        .noOneElse();
+
+    // email for the change that is reverted
+    assertThat(sender)
+        .sent("revert", sc)
+        .to(sc.owner)
+        .cc(sc.reviewer, sc.ccer, admin)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void revertChangeByOtherCcingSelfInReviewDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isFalse();
+    StagedChange sc = stageChange();
+    revert(sc, other, CC_ON_OWN_COMMENTS);
+
+    // email for the newly created revert change
+    assertThat(sender)
+        .sent("newchange", sc)
+        .to(sc.owner, sc.reviewer, sc.ccer, sc.watchingProjectOwner, admin)
+        .cc(other)
+        .bcc(NEW_CHANGES, NEW_PATCHSETS)
+        .noOneElse();
+
+    // email for the change that is reverted
+    assertThat(sender)
+        .sent("revert", sc)
+        .to(sc.owner)
+        .cc(other, sc.reviewer, sc.ccer, admin)
+        .cc(sc.reviewerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void revertChangeByOtherCcingSelfInNoteDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedChange sc = stageChange();
+    revert(sc, other, CC_ON_OWN_COMMENTS);
+
+    // email for the newly created revert change
+    assertThat(sender)
+        .sent("newchange", sc)
+        .to(sc.owner, sc.reviewer, sc.watchingProjectOwner, admin)
+        .cc(sc.ccer, other)
+        .bcc(NEW_CHANGES, NEW_PATCHSETS)
+        .noOneElse();
+
+    // email for the change that is reverted
+    assertThat(sender)
+        .sent("revert", sc)
+        .to(sc.owner)
+        .cc(other, sc.reviewer, sc.ccer, admin)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  private StagedChange stageChange() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    setApiUser(admin);
+    gApi.changes().id(sc.changeId).revision("current").review(ReviewInput.approve());
+    gApi.changes().id(sc.changeId).revision("current").submit();
+    sender.clear();
+    return sc;
+  }
+
+  private void revert(StagedChange sc, TestAccount by) throws Exception {
+    revert(sc, by, ENABLED);
+  }
+
+  private void revert(StagedChange sc, TestAccount by, EmailStrategy emailStrategy)
+      throws Exception {
+    setEmailStrategy(by, emailStrategy);
+    setApiUser(by);
+    gApi.changes().id(sc.changeId).revert();
+  }
+
+  /*
+   * SetAssigneeSender tests.
+   */
+
+  @Test
+  public void setAssigneeOnReviewableChange() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    assign(sc, sc.owner, sc.assignee);
+    assertThat(sender)
+        .sent("setassignee", sc)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail) // TODO(logan): This is probably not intended!
+        .to(sc.assignee)
+        .noOneElse();
+  }
+
+  @Test
+  public void setAssigneeOnReviewableChangeByOwnerCcingSelf() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    assign(sc, sc.owner, sc.assignee, CC_ON_OWN_COMMENTS);
+    assertThat(sender)
+        .sent("setassignee", sc)
+        .cc(sc.owner)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail) // TODO(logan): This is probably not intended!
+        .to(sc.assignee)
+        .noOneElse();
+  }
+
+  @Test
+  public void setAssigneeOnReviewableChangeByAdmin() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    assign(sc, admin, sc.assignee);
+    assertThat(sender)
+        .sent("setassignee", sc)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail) // TODO(logan): This is probably not intended!
+        .to(sc.assignee)
+        .noOneElse();
+  }
+
+  @Test
+  public void setAssigneeOnReviewableChangeByAdminCcingSelf() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    assign(sc, admin, sc.assignee, CC_ON_OWN_COMMENTS);
+    assertThat(sender)
+        .sent("setassignee", sc)
+        .cc(admin)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail) // TODO(logan): This is probably not intended!
+        .to(sc.assignee)
+        .noOneElse();
+  }
+
+  @Test
+  public void setAssigneeToSelfOnReviewableChangeInNoteDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedChange sc = stageReviewableChange();
+    assign(sc, sc.owner, sc.owner);
+    assertThat(sender)
+        .sent("setassignee", sc)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail) // TODO(logan): This is probably not intended!
+        .noOneElse();
+  }
+
+  @Test
+  public void setAssigneeToSelfOnReviewableChangeInReviewDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isFalse();
+    StagedChange sc = stageReviewableChange();
+    assign(sc, sc.owner, sc.owner);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void changeAssigneeOnReviewableChange() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    TestAccount other = accountCreator.create("other", "other@example.com", "other");
+    assign(sc, sc.owner, other);
+    sender.clear();
+    assign(sc, sc.owner, sc.assignee);
+    assertThat(sender)
+        .sent("setassignee", sc)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail) // TODO(logan): This is probably not intended!
+        .to(sc.assignee)
+        .noOneElse();
+  }
+
+  @Test
+  public void changeAssigneeToSelfOnReviewableChangeInNoteDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    StagedChange sc = stageReviewableChange();
+    assign(sc, sc.owner, sc.assignee);
+    sender.clear();
+    assign(sc, sc.owner, sc.owner);
+    assertThat(sender)
+        .sent("setassignee", sc)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail) // TODO(logan): This is probably not intended!
+        .noOneElse();
+  }
+
+  @Test
+  public void changeAssigneeToSelfOnReviewableChangeInReviewDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isFalse();
+    StagedChange sc = stageReviewableChange();
+    assign(sc, sc.owner, sc.assignee);
+    sender.clear();
+    assign(sc, sc.owner, sc.owner);
+    assertThat(sender).notSent();
+  }
+
+  @Test
+  public void setAssigneeOnReviewableWipChange() throws Exception {
+    StagedChange sc = stageReviewableWipChange();
+    assign(sc, sc.owner, sc.assignee);
+    assertThat(sender)
+        .sent("setassignee", sc)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail) // TODO(logan): This is probably not intended!
+        .to(sc.assignee)
+        .noOneElse();
+  }
+
+  @Test
+  public void setAssigneeOnWipChange() throws Exception {
+    StagedChange sc = stageWipChange();
+    assign(sc, sc.owner, sc.assignee);
+    assertThat(sender)
+        .sent("setassignee", sc)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail) // TODO(logan): This is probably not intended!
+        .to(sc.assignee)
+        .noOneElse();
+  }
+
+  private void assign(StagedChange sc, TestAccount by, TestAccount to) throws Exception {
+    assign(sc, by, to, ENABLED);
+  }
+
+  private void assign(StagedChange sc, TestAccount by, TestAccount to, EmailStrategy emailStrategy)
+      throws Exception {
+    setEmailStrategy(by, emailStrategy);
+    setApiUser(by);
+    AssigneeInput in = new AssigneeInput();
+    in.assignee = to.email;
+    gApi.changes().id(sc.changeId).setAssignee(in);
+  }
+
+  /*
+   * Start review and WIP tests.
+   */
+
+  @Test
+  public void startReviewOnWipChange() throws Exception {
+    StagedChange sc = stageWipChange();
+    startReview(sc);
+    assertThat(sender)
+        .sent("comment", sc)
+        .cc(sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void startReviewOnWipChangeCcingSelf() throws Exception {
+    StagedChange sc = stageWipChange();
+    setEmailStrategy(sc.owner, CC_ON_OWN_COMMENTS);
+    startReview(sc);
+    assertThat(sender)
+        .sent("comment", sc)
+        .to(sc.owner)
+        .cc(sc.reviewer, sc.ccer)
+        .cc(sc.reviewerByEmail, sc.ccerByEmail)
+        .bcc(sc.starrer)
+        .bcc(ALL_COMMENTS)
+        .noOneElse();
+  }
+
+  @Test
+  public void setWorkInProgress() throws Exception {
+    StagedChange sc = stageReviewableChange();
+    gApi.changes().id(sc.changeId).setWorkInProgress();
+    assertThat(sender).notSent();
+  }
+
+  private void startReview(StagedChange sc) throws Exception {
+    setApiUser(sc.owner);
+    gApi.changes().id(sc.changeId).setReadyForReview();
+    // PolyGerrit current immediately follows up with a review.
+    gApi.changes().id(sc.changeId).revision("current").review(ReviewInput.noScore());
+  }
+
+  private void setWorkInProgressByDefault(Project.NameKey p, InheritableBoolean v)
+      throws Exception {
+    ConfigInput input = new ConfigInput();
+    input.workInProgressByDefault = v;
+    gApi.projects().name(p.get()).config(input);
+  }
+}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/EmailValidatorIT.java b/javatests/com/google/gerrit/acceptance/server/mail/EmailValidatorIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/mail/EmailValidatorIT.java
rename to javatests/com/google/gerrit/acceptance/server/mail/EmailValidatorIT.java
diff --git a/javatests/com/google/gerrit/acceptance/server/mail/ListMailFilterIT.java b/javatests/com/google/gerrit/acceptance/server/mail/ListMailFilterIT.java
new file mode 100644
index 0000000..13f0416
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/server/mail/ListMailFilterIT.java
@@ -0,0 +1,120 @@
+// Copyright (C) 2017 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.google.gerrit.acceptance.server.mail;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.acceptance.GerritConfig;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.ChangeMessageInfo;
+import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.mail.MailMessage;
+import com.google.gerrit.mail.MailProcessingUtil;
+import com.google.gerrit.server.mail.receive.MailProcessor;
+import com.google.inject.Inject;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.util.Collection;
+import java.util.List;
+import org.junit.Test;
+
+@NoHttpd
+public class ListMailFilterIT extends AbstractMailIT {
+  @Inject private MailProcessor mailProcessor;
+
+  @Test
+  @GerritConfig(name = "receiveemail.filter.mode", value = "OFF")
+  public void listFilterOff() throws Exception {
+    ChangeInfo changeInfo = createChangeAndReplyByEmail();
+    // Check that the comments from the email have been persisted
+    Collection<ChangeMessageInfo> messages = gApi.changes().id(changeInfo.id).get().messages;
+    assertThat(messages).hasSize(3);
+  }
+
+  @Test
+  @GerritConfig(name = "receiveemail.filter.mode", value = "WHITELIST")
+  @GerritConfig(
+      name = "receiveemail.filter.patterns",
+      values = {".+ser@example\\.com", "a@b\\.com"})
+  public void listFilterWhitelistDoesNotFilterListedUser() throws Exception {
+    ChangeInfo changeInfo = createChangeAndReplyByEmail();
+    // Check that the comments from the email have been persisted
+    Collection<ChangeMessageInfo> messages = gApi.changes().id(changeInfo.id).get().messages;
+    assertThat(messages).hasSize(3);
+  }
+
+  @Test
+  @GerritConfig(name = "receiveemail.filter.mode", value = "WHITELIST")
+  @GerritConfig(
+      name = "receiveemail.filter.patterns",
+      values = {".+@gerritcodereview\\.com", "a@b\\.com"})
+  public void listFilterWhitelistFiltersNotListedUser() throws Exception {
+    ChangeInfo changeInfo = createChangeAndReplyByEmail();
+    // Check that the comments from the email have NOT been persisted
+    Collection<ChangeMessageInfo> messages = gApi.changes().id(changeInfo.id).get().messages;
+    assertThat(messages).hasSize(2);
+
+    // Check that no emails were sent because of this error
+    assertThat(sender.getMessages()).isEmpty();
+  }
+
+  @Test
+  @GerritConfig(name = "receiveemail.filter.mode", value = "BLACKLIST")
+  @GerritConfig(
+      name = "receiveemail.filter.patterns",
+      values = {".+@gerritcodereview\\.com", "a@b\\.com"})
+  public void listFilterBlacklistDoesNotFilterNotListedUser() throws Exception {
+    ChangeInfo changeInfo = createChangeAndReplyByEmail();
+    // Check that the comments from the email have been persisted
+    Collection<ChangeMessageInfo> messages = gApi.changes().id(changeInfo.id).get().messages;
+    assertThat(messages).hasSize(3);
+  }
+
+  @Test
+  @GerritConfig(name = "receiveemail.filter.mode", value = "BLACKLIST")
+  @GerritConfig(
+      name = "receiveemail.filter.patterns",
+      values = {".+@example\\.com", "a@b\\.com"})
+  public void listFilterBlacklistFiltersListedUser() throws Exception {
+    ChangeInfo changeInfo = createChangeAndReplyByEmail();
+    // Check that the comments from the email have been persisted
+    Collection<ChangeMessageInfo> messages = gApi.changes().id(changeInfo.id).get().messages;
+    assertThat(messages).hasSize(2);
+  }
+
+  private ChangeInfo createChangeAndReplyByEmail() throws Exception {
+    String changeId = createChangeWithReview();
+    ChangeInfo changeInfo = gApi.changes().id(changeId).get();
+    List<CommentInfo> comments = gApi.changes().id(changeId).current().commentsAsList();
+    String ts =
+        MailProcessingUtil.rfcDateformatter.format(
+            ZonedDateTime.ofInstant(comments.get(0).updated.toInstant(), ZoneId.of("UTC")));
+
+    // Build Message
+    MailMessage.Builder b = messageBuilderWithDefaultFields();
+    String txt =
+        newPlaintextBody(
+            canonicalWebUrl.get() + "#/c/" + changeInfo._number + "/1",
+            "Test Message",
+            null,
+            null,
+            null);
+    b.textContent(txt + textFooterForChange(changeInfo._number, ts));
+
+    mailProcessor.process(b.build());
+    return changeInfo;
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/server/mail/MailIT.java b/javatests/com/google/gerrit/acceptance/server/mail/MailIT.java
new file mode 100644
index 0000000..0d31a96
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/server/mail/MailIT.java
@@ -0,0 +1,102 @@
+// 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.
+
+package com.google.gerrit.acceptance.server.mail;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.server.mail.receive.MailReceiver;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.inject.Inject;
+import com.icegreen.greenmail.junit.GreenMailRule;
+import com.icegreen.greenmail.user.GreenMailUser;
+import com.icegreen.greenmail.util.GreenMail;
+import com.icegreen.greenmail.util.GreenMailUtil;
+import com.icegreen.greenmail.util.ServerSetupTest;
+import javax.mail.internet.MimeMessage;
+import org.eclipse.jgit.lib.Config;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@NoHttpd
+@RunWith(ConfigSuite.class)
+public class MailIT extends AbstractDaemonTest {
+  private static final String RECEIVEEMAIL = "receiveemail";
+  private static final String HOST = "localhost";
+  private static final String USERNAME = "user@domain.com";
+  private static final String PASSWORD = "password";
+
+  @Inject private MailReceiver mailReceiver;
+
+  @Inject private GreenMail greenMail;
+
+  @Rule
+  public final GreenMailRule mockPop3Server = new GreenMailRule(ServerSetupTest.SMTP_POP3_IMAP);
+
+  @ConfigSuite.Default
+  public static Config pop3Config() {
+    Config cfg = new Config();
+    cfg.setString(RECEIVEEMAIL, null, "host", HOST);
+    cfg.setString(RECEIVEEMAIL, null, "port", "3110");
+    cfg.setString(RECEIVEEMAIL, null, "username", USERNAME);
+    cfg.setString(RECEIVEEMAIL, null, "password", PASSWORD);
+    cfg.setString(RECEIVEEMAIL, null, "protocol", "POP3");
+    cfg.setString(RECEIVEEMAIL, null, "fetchInterval", Integer.toString(Integer.MAX_VALUE));
+    return cfg;
+  }
+
+  @ConfigSuite.Config
+  public static Config imapConfig() {
+    Config cfg = new Config();
+    cfg.setString(RECEIVEEMAIL, null, "host", HOST);
+    cfg.setString(RECEIVEEMAIL, null, "port", "3143");
+    cfg.setString(RECEIVEEMAIL, null, "username", USERNAME);
+    cfg.setString(RECEIVEEMAIL, null, "password", PASSWORD);
+    cfg.setString(RECEIVEEMAIL, null, "protocol", "IMAP");
+    cfg.setString(RECEIVEEMAIL, null, "fetchInterval", Integer.toString(Integer.MAX_VALUE));
+    return cfg;
+  }
+
+  @Test
+  public void doesNotDeleteMessageNotMarkedForDeletion() throws Exception {
+    GreenMailUser user = mockPop3Server.setUser(USERNAME, USERNAME, PASSWORD);
+    user.deliver(createSimpleMessage());
+    assertThat(mockPop3Server.getReceivedMessages().length).isEqualTo(1);
+    // Let Gerrit handle emails
+    mailReceiver.handleEmails(false);
+    // Check that the message is still present
+    assertThat(mockPop3Server.getReceivedMessages().length).isEqualTo(1);
+  }
+
+  @Test
+  public void deletesMessageMarkedForDeletion() throws Exception {
+    GreenMailUser user = mockPop3Server.setUser(USERNAME, USERNAME, PASSWORD);
+    user.deliver(createSimpleMessage());
+    assertThat(mockPop3Server.getReceivedMessages().length).isEqualTo(1);
+    // Mark the message for deletion
+    mailReceiver.requestDeletion(mockPop3Server.getReceivedMessages()[0].getMessageID());
+    // Let Gerrit handle emails
+    mailReceiver.handleEmails(false);
+    // Check that the message was deleted
+    assertThat(mockPop3Server.getReceivedMessages().length).isEqualTo(0);
+  }
+
+  private MimeMessage createSimpleMessage() {
+    return GreenMailUtil.createTextEmail(
+        USERNAME, "from@localhost.com", "subject", "body", greenMail.getImap().getServerSetup());
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/server/mail/MailMetadataIT.java b/javatests/com/google/gerrit/acceptance/server/mail/MailMetadataIT.java
new file mode 100644
index 0000000..a0170d2
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/server/mail/MailMetadataIT.java
@@ -0,0 +1,171 @@
+// 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.
+
+package com.google.gerrit.acceptance.server.mail;
+
+import static com.google.common.truth.Truth.assertThat;
+import static java.util.concurrent.TimeUnit.SECONDS;
+
+import com.google.common.collect.Iterables;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.common.ChangeMessageInfo;
+import com.google.gerrit.mail.EmailHeader;
+import com.google.gerrit.mail.MailProcessingUtil;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.testing.FakeEmailSender;
+import com.google.gerrit.testing.TestTimeUtil;
+import java.sql.Timestamp;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/** Tests the presence of required metadata in email headers, text and html. */
+public class MailMetadataIT extends AbstractDaemonTest {
+  private String systemTimeZone;
+
+  @Before
+  public void setTimeForTesting() {
+    systemTimeZone = System.setProperty("user.timezone", "US/Eastern");
+    TestTimeUtil.resetWithClockStep(1, SECONDS);
+  }
+
+  @After
+  public void resetTime() {
+    TestTimeUtil.useSystemTime();
+    System.setProperty("user.timezone", systemTimeZone);
+  }
+
+  @Test
+  public void metadataOnNewChange() throws Exception {
+    PushOneCommit.Result newChange = createChange();
+    gApi.changes().id(newChange.getChangeId()).addReviewer(user.getId().toString());
+
+    List<FakeEmailSender.Message> emails = sender.getMessages();
+    assertThat(emails).hasSize(1);
+    FakeEmailSender.Message message = emails.get(0);
+
+    String changeURL = "<" + getChangeUrl(newChange.getChange()) + ">";
+
+    Map<String, Object> expectedHeaders = new HashMap<>();
+    expectedHeaders.put("Gerrit-PatchSet", "1");
+    expectedHeaders.put(
+        "Gerrit-Change-Number", String.valueOf(newChange.getChange().getId().get()));
+    expectedHeaders.put("Gerrit-MessageType", "newchange");
+    expectedHeaders.put("Gerrit-Commit", newChange.getCommit().getId().name());
+    expectedHeaders.put("Gerrit-ChangeURL", changeURL);
+
+    assertHeaders(message.headers(), expectedHeaders);
+
+    // Remove metadata that is not present in email
+    expectedHeaders.remove("Gerrit-ChangeURL");
+    expectedHeaders.remove("Gerrit-Commit");
+    assertTextFooter(message.body(), expectedHeaders);
+  }
+
+  @Test
+  public void metadataOnNewComment() throws Exception {
+    PushOneCommit.Result newChange = createChange();
+    gApi.changes().id(newChange.getChangeId()).addReviewer(user.getId().toString());
+    sender.clear();
+
+    // Review change
+    ReviewInput input = new ReviewInput();
+    input.message = "Test";
+    revision(newChange).review(input);
+    setApiUser(user);
+    Collection<ChangeMessageInfo> result =
+        gApi.changes().id(newChange.getChangeId()).get().messages;
+    assertThat(result).isNotEmpty();
+
+    List<FakeEmailSender.Message> emails = sender.getMessages();
+    assertThat(emails).hasSize(1);
+    FakeEmailSender.Message message = emails.get(0);
+
+    String changeURL = "<" + getChangeUrl(newChange.getChange()) + ">";
+    Map<String, Object> expectedHeaders = new HashMap<>();
+    expectedHeaders.put("Gerrit-PatchSet", "1");
+    expectedHeaders.put(
+        "Gerrit-Change-Number", String.valueOf(newChange.getChange().getId().get()));
+    expectedHeaders.put("Gerrit-MessageType", "comment");
+    expectedHeaders.put("Gerrit-Commit", newChange.getCommit().getId().name());
+    expectedHeaders.put("Gerrit-ChangeURL", changeURL);
+    expectedHeaders.put("Gerrit-Comment-Date", Iterables.getLast(result).date);
+
+    assertHeaders(message.headers(), expectedHeaders);
+
+    // Remove metadata that is not present in email
+    expectedHeaders.remove("Gerrit-ChangeURL");
+    expectedHeaders.remove("Gerrit-Commit");
+    assertTextFooter(message.body(), expectedHeaders);
+  }
+
+  private static void assertHeaders(Map<String, EmailHeader> have, Map<String, Object> want)
+      throws Exception {
+    for (Map.Entry<String, Object> entry : want.entrySet()) {
+      if (entry.getValue() instanceof String) {
+        assertThat(have)
+            .containsEntry(
+                "X-" + entry.getKey(), new EmailHeader.String((String) entry.getValue()));
+      } else if (entry.getValue() instanceof Date) {
+        assertThat(have)
+            .containsEntry("X-" + entry.getKey(), new EmailHeader.Date((Date) entry.getValue()));
+      } else {
+        throw new Exception(
+            "Object has unsupported type: "
+                + entry.getValue().getClass().getName()
+                + " must be java.util.Date or java.lang.String for key "
+                + entry.getKey());
+      }
+    }
+  }
+
+  private static void assertTextFooter(String body, Map<String, Object> want) throws Exception {
+    for (Map.Entry<String, Object> entry : want.entrySet()) {
+      if (entry.getValue() instanceof String) {
+        assertThat(body).contains(entry.getKey() + ": " + entry.getValue());
+      } else if (entry.getValue() instanceof Timestamp) {
+        assertThat(body)
+            .contains(
+                entry.getKey()
+                    + ": "
+                    + MailProcessingUtil.rfcDateformatter.format(
+                        ZonedDateTime.ofInstant(
+                            ((Timestamp) entry.getValue()).toInstant(), ZoneId.of("UTC"))));
+      } else {
+        throw new Exception(
+            "Object has unsupported type: "
+                + entry.getValue().getClass().getName()
+                + " must be java.util.Date or java.lang.String for key "
+                + entry.getKey());
+      }
+    }
+  }
+
+  private String getChangeUrl(ChangeData changeData) {
+    return canonicalWebUrl.get()
+        + "c/"
+        + changeData.project().get()
+        + "/+/"
+        + changeData.getId().get();
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/server/mail/MailProcessorIT.java b/javatests/com/google/gerrit/acceptance/server/mail/MailProcessorIT.java
new file mode 100644
index 0000000..9ff2c05
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/server/mail/MailProcessorIT.java
@@ -0,0 +1,230 @@
+// 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.
+
+package com.google.gerrit.acceptance.server.mail;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.Iterables;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.ChangeMessageInfo;
+import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.mail.MailMessage;
+import com.google.gerrit.mail.MailProcessingUtil;
+import com.google.gerrit.server.mail.receive.MailProcessor;
+import com.google.gerrit.testing.FakeEmailSender.Message;
+import com.google.inject.Inject;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.util.Collection;
+import java.util.List;
+import org.junit.Test;
+
+public class MailProcessorIT extends AbstractMailIT {
+  @Inject private MailProcessor mailProcessor;
+
+  @Test
+  public void parseAndPersistChangeMessage() throws Exception {
+    String changeId = createChangeWithReview();
+    ChangeInfo changeInfo = gApi.changes().id(changeId).get();
+    List<CommentInfo> comments = gApi.changes().id(changeId).current().commentsAsList();
+    String ts =
+        MailProcessingUtil.rfcDateformatter.format(
+            ZonedDateTime.ofInstant(comments.get(0).updated.toInstant(), ZoneId.of("UTC")));
+
+    // Build Message
+    MailMessage.Builder b = messageBuilderWithDefaultFields();
+    String txt =
+        newPlaintextBody(getChangeUrl(changeInfo) + "/1", "Test Message", null, null, null);
+    b.textContent(txt + textFooterForChange(changeInfo._number, ts));
+
+    mailProcessor.process(b.build());
+
+    Collection<ChangeMessageInfo> messages = gApi.changes().id(changeId).get().messages;
+    assertThat(messages).hasSize(3);
+    assertThat(Iterables.getLast(messages).message).isEqualTo("Patch Set 1:\n\nTest Message");
+    assertThat(Iterables.getLast(messages).tag).isEqualTo("mailMessageId=some id");
+  }
+
+  @Test
+  public void parseAndPersistInlineComment() throws Exception {
+    String changeId = createChangeWithReview();
+    ChangeInfo changeInfo = gApi.changes().id(changeId).get();
+    List<CommentInfo> comments = gApi.changes().id(changeId).current().commentsAsList();
+    String ts =
+        MailProcessingUtil.rfcDateformatter.format(
+            ZonedDateTime.ofInstant(comments.get(0).updated.toInstant(), ZoneId.of("UTC")));
+
+    // Build Message
+    MailMessage.Builder b = messageBuilderWithDefaultFields();
+    String txt =
+        newPlaintextBody(getChangeUrl(changeInfo) + "/1", null, "Some Inline Comment", null, null);
+    b.textContent(txt + textFooterForChange(changeInfo._number, ts));
+
+    mailProcessor.process(b.build());
+
+    // Assert messages
+    Collection<ChangeMessageInfo> messages = gApi.changes().id(changeId).get().messages;
+    assertThat(messages).hasSize(3);
+    assertThat(Iterables.getLast(messages).message).isEqualTo("Patch Set 1:\n\n(1 comment)");
+    assertThat(Iterables.getLast(messages).tag).isEqualTo("mailMessageId=some id");
+
+    // Assert comment
+    comments = gApi.changes().id(changeId).current().commentsAsList();
+    assertThat(comments).hasSize(3);
+    assertThat(comments.get(2).message).isEqualTo("Some Inline Comment");
+    assertThat(comments.get(2).tag).isEqualTo("mailMessageId=some id");
+    assertThat(comments.get(2).inReplyTo).isEqualTo(comments.get(1).id);
+  }
+
+  @Test
+  public void parseAndPersistFileComment() throws Exception {
+    String changeId = createChangeWithReview();
+    ChangeInfo changeInfo = gApi.changes().id(changeId).get();
+    List<CommentInfo> comments = gApi.changes().id(changeId).current().commentsAsList();
+    String ts =
+        MailProcessingUtil.rfcDateformatter.format(
+            ZonedDateTime.ofInstant(comments.get(0).updated.toInstant(), ZoneId.of("UTC")));
+
+    // Build Message
+    MailMessage.Builder b = messageBuilderWithDefaultFields();
+    String txt =
+        newPlaintextBody(
+            getChangeUrl(changeInfo) + "/1", null, null, "Some Comment on File 1", null);
+    b.textContent(txt + textFooterForChange(changeInfo._number, ts));
+
+    mailProcessor.process(b.build());
+
+    // Assert messages
+    Collection<ChangeMessageInfo> messages = gApi.changes().id(changeId).get().messages;
+    assertThat(messages).hasSize(3);
+    assertThat(Iterables.getLast(messages).message).isEqualTo("Patch Set 1:\n\n(1 comment)");
+    assertThat(Iterables.getLast(messages).tag).isEqualTo("mailMessageId=some id");
+
+    // Assert comment
+    comments = gApi.changes().id(changeId).current().commentsAsList();
+    assertThat(comments).hasSize(3);
+    assertThat(comments.get(0).message).isEqualTo("Some Comment on File 1");
+    assertThat(comments.get(0).inReplyTo).isNull();
+    assertThat(comments.get(0).tag).isEqualTo("mailMessageId=some id");
+    assertThat(comments.get(0).path).isEqualTo("gerrit-server/test.txt");
+  }
+
+  @Test
+  public void parseAndPersistMessageTwice() throws Exception {
+    String changeId = createChangeWithReview();
+    ChangeInfo changeInfo = gApi.changes().id(changeId).get();
+    List<CommentInfo> comments = gApi.changes().id(changeId).current().commentsAsList();
+    String ts =
+        MailProcessingUtil.rfcDateformatter.format(
+            ZonedDateTime.ofInstant(comments.get(0).updated.toInstant(), ZoneId.of("UTC")));
+
+    // Build Message
+    MailMessage.Builder b = messageBuilderWithDefaultFields();
+    String txt =
+        newPlaintextBody(getChangeUrl(changeInfo) + "/1", null, "Some Inline Comment", null, null);
+    b.textContent(txt + textFooterForChange(changeInfo._number, ts));
+
+    mailProcessor.process(b.build());
+    comments = gApi.changes().id(changeId).current().commentsAsList();
+    assertThat(comments).hasSize(3);
+
+    // Check that the comment has not been persisted a second time
+    mailProcessor.process(b.build());
+    comments = gApi.changes().id(changeId).current().commentsAsList();
+    assertThat(comments).hasSize(3);
+  }
+
+  @Test
+  public void parseAndPersistMessageFromInactiveAccount() throws Exception {
+    String changeId = createChangeWithReview();
+    ChangeInfo changeInfo = gApi.changes().id(changeId).get();
+    List<CommentInfo> comments = gApi.changes().id(changeId).current().commentsAsList();
+    String ts =
+        MailProcessingUtil.rfcDateformatter.format(
+            ZonedDateTime.ofInstant(comments.get(0).updated.toInstant(), ZoneId.of("UTC")));
+    assertThat(comments).hasSize(2);
+
+    // Build Message
+    MailMessage.Builder b = messageBuilderWithDefaultFields();
+    String txt =
+        newPlaintextBody(getChangeUrl(changeInfo) + "/1", null, "Some Inline Comment", null, null);
+    b.textContent(txt + textFooterForChange(changeInfo._number, ts));
+
+    // Set account state to inactive
+    gApi.accounts().id("user").setActive(false);
+
+    mailProcessor.process(b.build());
+    comments = gApi.changes().id(changeId).current().commentsAsList();
+
+    // Check that comment size has not changed
+    assertThat(comments).hasSize(2);
+
+    // Reset
+    gApi.accounts().id("user").setActive(true);
+  }
+
+  @Test
+  public void sendNotificationAfterPersistingComments() throws Exception {
+    String changeId = createChangeWithReview();
+    ChangeInfo changeInfo = gApi.changes().id(changeId).get();
+    List<CommentInfo> comments = gApi.changes().id(changeId).current().commentsAsList();
+    assertThat(comments).hasSize(2);
+    String ts =
+        MailProcessingUtil.rfcDateformatter.format(
+            ZonedDateTime.ofInstant(comments.get(0).updated.toInstant(), ZoneId.of("UTC")));
+
+    // Build Message
+    String txt =
+        newPlaintextBody(getChangeUrl(changeInfo) + "/1", "Test Message", null, null, null);
+    MailMessage.Builder b =
+        messageBuilderWithDefaultFields()
+            .from(user.emailAddress)
+            .textContent(txt + textFooterForChange(changeInfo._number, ts));
+
+    sender.clear();
+    mailProcessor.process(b.build());
+
+    assertNotifyTo(admin);
+  }
+
+  @Test
+  public void sendNotificationOnMissingMetadatas() throws Exception {
+    String changeId = createChangeWithReview();
+    ChangeInfo changeInfo = gApi.changes().id(changeId).get();
+    List<CommentInfo> comments = gApi.changes().id(changeId).current().commentsAsList();
+    assertThat(comments).hasSize(2);
+    String ts = "null"; // Erroneous timestamp to be used in erroneous metadatas
+
+    // Build Message
+    String txt =
+        newPlaintextBody(getChangeUrl(changeInfo) + "/1", "Test Message", null, null, null);
+    MailMessage.Builder b =
+        messageBuilderWithDefaultFields()
+            .from(user.emailAddress)
+            .textContent(txt + textFooterForChange(changeInfo._number, ts));
+
+    sender.clear();
+    mailProcessor.process(b.build());
+
+    assertNotifyTo(user);
+    Message message = sender.nextMessage();
+    assertThat(message.body()).contains("was unable to parse your email");
+    assertThat(message.headers()).containsKey("Subject");
+  }
+
+  private String getChangeUrl(ChangeInfo changeInfo) {
+    return canonicalWebUrl.get() + "c/" + changeInfo.project + "/+/" + changeInfo._number;
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/server/mail/MailSenderIT.java b/javatests/com/google/gerrit/acceptance/server/mail/MailSenderIT.java
new file mode 100644
index 0000000..8d21b5b
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/server/mail/MailSenderIT.java
@@ -0,0 +1,70 @@
+// Copyright (C) 2017 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.google.gerrit.acceptance.server.mail;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.acceptance.GerritConfig;
+import com.google.gerrit.mail.EmailHeader;
+import java.net.URI;
+import java.util.Map;
+import org.junit.Test;
+
+public class MailSenderIT extends AbstractMailIT {
+
+  @Test
+  @GerritConfig(name = "sendemail.replyToAddress", value = "custom@gerritcodereview.com")
+  @GerritConfig(name = "receiveemail.protocol", value = "POP3")
+  public void outgoingMailHasCustomReplyToHeader() throws Exception {
+    createChangeWithReview(user);
+    // Check that the custom address was added as Reply-To
+    assertThat(sender.getMessages()).hasSize(1);
+    Map<String, EmailHeader> headers = sender.getMessages().iterator().next().headers();
+    assertThat(headerString(headers, "Reply-To")).isEqualTo("custom@gerritcodereview.com");
+  }
+
+  @Test
+  public void outgoingMailHasUserEmailInReplyToHeader() throws Exception {
+    createChangeWithReview(user);
+    // Check that the user's email was added as Reply-To
+    assertThat(sender.getMessages()).hasSize(1);
+    Map<String, EmailHeader> headers = sender.getMessages().iterator().next().headers();
+    assertThat(headerString(headers, "Reply-To")).contains(user.email);
+  }
+
+  @Test
+  public void outgoingMailHasListHeaders() throws Exception {
+    String changeId = createChangeWithReview(user);
+    // Check that the mail has the expected headers
+    assertThat(sender.getMessages()).hasSize(1);
+    Map<String, EmailHeader> headers = sender.getMessages().iterator().next().headers();
+    String hostname = URI.create(canonicalWebUrl.get()).getHost();
+    String listId = String.format("<gerrit-%s.%s>", project.get(), hostname);
+    String unsubscribeLink = String.format("<%ssettings>", canonicalWebUrl.get());
+    String threadId =
+        String.format(
+            "<gerrit.%s.%s@%s>",
+            gApi.changes().id(changeId).get().created.getTime(), changeId, hostname);
+    assertThat(headerString(headers, "List-Id")).isEqualTo(listId);
+    assertThat(headerString(headers, "List-Unsubscribe")).isEqualTo(unsubscribeLink);
+    assertThat(headerString(headers, "In-Reply-To")).isEqualTo(threadId);
+  }
+
+  private String headerString(Map<String, EmailHeader> headers, String name) {
+    EmailHeader header = headers.get(name);
+    assertThat(header).isInstanceOf(EmailHeader.String.class);
+    return ((EmailHeader.String) header).getString();
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/server/mail/NotificationMailFormatIT.java b/javatests/com/google/gerrit/acceptance/server/mail/NotificationMailFormatIT.java
new file mode 100644
index 0000000..c8292ba
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/server/mail/NotificationMailFormatIT.java
@@ -0,0 +1,70 @@
+// Copyright (C) 2017 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.google.gerrit.acceptance.server.mail;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo.EmailFormat;
+import com.google.gerrit.testing.FakeEmailSender;
+import org.junit.Test;
+
+public class NotificationMailFormatIT extends AbstractDaemonTest {
+
+  @Test
+  public void userReceivesPlaintextEmail() throws Exception {
+    // Set user preference to receive only plaintext content
+    GeneralPreferencesInfo i = new GeneralPreferencesInfo();
+    i.emailFormat = EmailFormat.PLAINTEXT;
+    gApi.accounts().id(admin.getId().toString()).setPreferences(i);
+
+    // Create change as admin and review as user
+    PushOneCommit.Result r = createChange();
+    setApiUser(user);
+    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.recommend());
+
+    // Check that admin has received only plaintext content
+    assertThat(sender.getMessages()).hasSize(1);
+    FakeEmailSender.Message m = sender.getMessages().get(0);
+    assertThat(m.body()).isNotNull();
+    assertThat(m.htmlBody()).isNull();
+    assertMailReplyTo(m, admin.email);
+    assertMailReplyTo(m, user.email);
+
+    // Reset user preference
+    setApiUser(admin);
+    i.emailFormat = EmailFormat.HTML_PLAINTEXT;
+    gApi.accounts().id(admin.getId().toString()).setPreferences(i);
+  }
+
+  @Test
+  public void userReceivesHtmlAndPlaintextEmail() throws Exception {
+    // Create change as admin and review as user
+    PushOneCommit.Result r = createChange();
+    setApiUser(user);
+    gApi.changes().id(r.getChangeId()).current().review(ReviewInput.recommend());
+
+    // Check that admin has received both HTML and plaintext content
+    assertThat(sender.getMessages()).hasSize(1);
+    FakeEmailSender.Message m = sender.getMessages().get(0);
+    assertThat(m.body()).isNotNull();
+    assertThat(m.htmlBody()).isNotNull();
+    assertMailReplyTo(m, admin.email);
+    assertMailReplyTo(m, user.email);
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/server/notedb/BUILD b/javatests/com/google/gerrit/acceptance/server/notedb/BUILD
new file mode 100644
index 0000000..bdb3f3b
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/server/notedb/BUILD
@@ -0,0 +1,17 @@
+load("//javatests/com/google/gerrit/acceptance:tests.bzl", "acceptance_tests")
+
+acceptance_tests(
+    srcs = glob(["*IT.java"]),
+    group = "server_notedb",
+    labels = [
+        "notedb",
+        "server",
+    ],
+    # TODO(dborowitz): Fix leaks in local disk tests so we can reduce heap size.
+    # http://crbug.com/gerrit/8567
+    vm_args = ["-Xmx1024m"],
+    deps = [
+        "//java/com/google/gerrit/server/schema",
+        "//java/com/google/gerrit/server/util/time",
+    ],
+)
diff --git a/javatests/com/google/gerrit/acceptance/server/notedb/ChangeRebuilderIT.java b/javatests/com/google/gerrit/acceptance/server/notedb/ChangeRebuilderIT.java
new file mode 100644
index 0000000..5ebfa9e
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/server/notedb/ChangeRebuilderIT.java
@@ -0,0 +1,1594 @@
+// 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.
+
+package com.google.gerrit.acceptance.server.notedb;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assert_;
+import static com.google.common.truth.TruthJUnit.assume;
+import static com.google.gerrit.reviewdb.client.RefNames.changeMetaRef;
+import static com.google.gerrit.reviewdb.client.RefNames.refsDraftComments;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.concurrent.TimeUnit.DAYS;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static java.util.stream.Collectors.joining;
+import static java.util.stream.Collectors.toList;
+import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Ordering;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.AcceptanceTestRequestScope;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.TestAccount;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.api.changes.DraftInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput.CommentInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput.DraftHandling;
+import com.google.gerrit.extensions.client.Side;
+import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.common.Input;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.reviewdb.client.PatchLineComment;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.client.RevId;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.reviewdb.server.ReviewDbUtil;
+import com.google.gerrit.server.ChangeUtil;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.Sequences;
+import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.git.RepoRefCache;
+import com.google.gerrit.server.notedb.ChangeBundle;
+import com.google.gerrit.server.notedb.ChangeBundleReader;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.NoteDbChangeState;
+import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
+import com.google.gerrit.server.notedb.NoteDbUpdateManager;
+import com.google.gerrit.server.notedb.TestChangeRebuilderWrapper;
+import com.google.gerrit.server.notedb.rebuild.ChangeRebuilder.NoPatchSetsException;
+import com.google.gerrit.server.patch.PatchListCache;
+import com.google.gerrit.server.patch.PatchListNotAvailableException;
+import com.google.gerrit.server.patch.PatchSetInfoFactory;
+import com.google.gerrit.server.patch.PatchSetInfoNotAvailableException;
+import com.google.gerrit.server.project.testing.Util;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.restapi.change.PostReview;
+import com.google.gerrit.server.restapi.change.Rebuild;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.UpdateException;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.gerrit.testing.NoteDbChecker;
+import com.google.gerrit.testing.NoteDbMode;
+import com.google.gerrit.testing.TestChanges;
+import com.google.gerrit.testing.TestTimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.OrmRuntimeException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.sql.Timestamp;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Stream;
+import org.apache.http.Header;
+import org.apache.http.message.BasicHeader;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.Repository;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ChangeRebuilderIT extends AbstractDaemonTest {
+  @ConfigSuite.Default
+  public static Config defaultConfig() {
+    Config cfg = new Config();
+    cfg.setBoolean("noteDb", null, "testRebuilderWrapper", true);
+
+    // Disable async reindex-if-stale check after index update. This avoids
+    // unintentional auto-rebuilding of the change in NoteDb during the read
+    // path of the reindex-if-stale check. For the purposes of this test, we
+    // want precise control over when auto-rebuilding happens.
+    cfg.setBoolean("index", null, "autoReindexIfStale", false);
+
+    // setNotesMigration tries to keep IDs in sync between ReviewDb and NoteDb, which is behavior
+    // unique to this test. This gets prohibitively slow if we use the default sequence gap.
+    cfg.setInt("noteDb", "changes", "initialSequenceGap", 0);
+
+    return cfg;
+  }
+
+  @Inject private NoteDbChecker checker;
+
+  @Inject private Rebuild rebuildHandler;
+
+  @Inject private Provider<ReviewDb> dbProvider;
+
+  @Inject private CommentsUtil commentsUtil;
+
+  @Inject private Provider<PostReview> postReview;
+
+  @Inject private TestChangeRebuilderWrapper rebuilderWrapper;
+
+  @Inject private Sequences seq;
+
+  @Inject private ChangeBundleReader bundleReader;
+
+  @Inject private PatchSetInfoFactory patchSetInfoFactory;
+
+  @Inject private PatchListCache patchListCache;
+
+  @Before
+  public void setUp() throws Exception {
+    assume().that(NoteDbMode.get()).isEqualTo(NoteDbMode.OFF);
+    TestTimeUtil.resetWithClockStep(1, SECONDS);
+    setNotesMigration(false, false);
+  }
+
+  @After
+  public void tearDown() {
+    TestTimeUtil.useSystemTime();
+  }
+
+  @SuppressWarnings("deprecation")
+  private void setNotesMigration(boolean writeChanges, boolean readChanges) throws Exception {
+    notesMigration.setWriteChanges(writeChanges);
+    notesMigration.setReadChanges(readChanges);
+    db = atrScope.reopenDb().getReviewDbProvider().get();
+
+    if (notesMigration.readChangeSequence()) {
+      // Copy next ReviewDb ID to NoteDb.
+      seq.getChangeIdRepoSequence().set(db.nextChangeId());
+    } else {
+      // Copy next NoteDb ID to ReviewDb.
+      while (db.nextChangeId() < seq.getChangeIdRepoSequence().next()) {}
+    }
+  }
+
+  @Test
+  public void changeFields() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getPatchSetId().getParentKey();
+    gApi.changes().id(id.get()).topic(name("a-topic"));
+    checker.rebuildAndCheckChanges(id);
+  }
+
+  @Test
+  public void patchSets() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getPatchSetId().getParentKey();
+    amendChange(r.getChangeId());
+    checker.rebuildAndCheckChanges(id);
+  }
+
+  @Test
+  public void publishedComment() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getPatchSetId().getParentKey();
+    putComment(user, id, 1, "comment", null);
+    checker.rebuildAndCheckChanges(id);
+  }
+
+  @Test
+  public void publishedCommentAndReply() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getPatchSetId().getParentKey();
+    putComment(user, id, 1, "comment", null);
+    Map<String, List<CommentInfo>> comments = getPublishedComments(id);
+    String parentUuid = comments.get("a.txt").get(0).id;
+    putComment(user, id, 1, "comment", parentUuid);
+    checker.rebuildAndCheckChanges(id);
+  }
+
+  @Test
+  public void patchSetWithNullGroups() throws Exception {
+    Timestamp ts = TimeUtil.nowTs();
+    Change c = TestChanges.newChange(project, user.getId(), seq.nextChangeId());
+    c.setCreatedOn(ts);
+    c.setLastUpdatedOn(ts);
+    c.setReviewStarted(true);
+    PatchSet ps =
+        TestChanges.newPatchSet(
+            c.currentPatchSetId(), "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef", user.getId());
+    ps.setCreatedOn(ts);
+    db.changes().insert(Collections.singleton(c));
+    db.patchSets().insert(Collections.singleton(ps));
+
+    assertThat(ps.getGroups()).isEmpty();
+    checker.rebuildAndCheckChanges(c.getId());
+  }
+
+  @Test
+  public void draftComment() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getPatchSetId().getParentKey();
+    putDraft(user, id, 1, "comment", null);
+    checker.rebuildAndCheckChanges(id);
+  }
+
+  @Test
+  public void draftAndPublishedComment() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getPatchSetId().getParentKey();
+    putDraft(user, id, 1, "draft comment", null);
+    putComment(user, id, 1, "published comment", null);
+    checker.rebuildAndCheckChanges(id);
+  }
+
+  @Test
+  public void publishDraftComment() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getPatchSetId().getParentKey();
+    putDraft(user, id, 1, "draft comment", null);
+    publishDrafts(user, id);
+    checker.rebuildAndCheckChanges(id);
+  }
+
+  @Test
+  public void nullAccountId() throws Exception {
+    PushOneCommit.Result r = createChange();
+    PatchSet.Id psId = r.getPatchSetId();
+    Change.Id id = psId.getParentKey();
+
+    // Events need to be otherwise identical for the account ID to be compared.
+    ChangeMessage msg1 = insertMessage(id, psId, user.getId(), TimeUtil.nowTs(), "message 1");
+    insertMessage(id, psId, null, msg1.getWrittenOn(), "message 2");
+
+    checker.rebuildAndCheckChanges(id);
+  }
+
+  @Test
+  public void nullPatchSetId() throws Exception {
+    PushOneCommit.Result r = createChange();
+    PatchSet.Id psId1 = r.getPatchSetId();
+    Change.Id id = psId1.getParentKey();
+
+    // Events need to be otherwise identical for the PatchSet.ID to be compared.
+    ChangeMessage msg1 = insertMessage(id, null, user.getId(), TimeUtil.nowTs(), "message 1");
+    insertMessage(id, null, user.getId(), msg1.getWrittenOn(), "message 2");
+
+    PatchSet.Id psId2 = amendChange(r.getChangeId()).getPatchSetId();
+
+    ChangeMessage msg3 = insertMessage(id, null, user.getId(), TimeUtil.nowTs(), "message 3");
+    insertMessage(id, null, user.getId(), msg3.getWrittenOn(), "message 4");
+
+    checker.rebuildAndCheckChanges(id);
+
+    setNotesMigration(true, true);
+
+    ChangeNotes notes = notesFactory.create(db, project, id);
+    Map<String, PatchSet.Id> psIds = new HashMap<>();
+    for (ChangeMessage msg : notes.getChangeMessages()) {
+      PatchSet.Id psId = msg.getPatchSetId();
+      assertThat(psId).named("patchset for " + msg).isNotNull();
+      psIds.put(msg.getMessage(), psId);
+    }
+    // Patch set IDs were replaced during conversion process.
+    assertThat(psIds).containsEntry("message 1", psId1);
+    assertThat(psIds).containsEntry("message 2", psId1);
+    assertThat(psIds).containsEntry("message 3", psId2);
+    assertThat(psIds).containsEntry("message 4", psId2);
+  }
+
+  @Test
+  public void noWriteToNewRef() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getPatchSetId().getParentKey();
+    checker.assertNoChangeRef(project, id);
+
+    setNotesMigration(true, false);
+    gApi.changes().id(id.get()).topic(name("a-topic"));
+
+    // First write doesn't create the ref, but rebuilding works.
+    checker.assertNoChangeRef(project, id);
+    assertThat(getUnwrappedDb().changes().get(id).getNoteDbState()).isNull();
+    checker.rebuildAndCheckChanges(id);
+
+    // Now that there is a ref, writes are "turned on" for this change, and
+    // NoteDb stays up to date without explicit rebuilding.
+    gApi.changes().id(id.get()).topic(name("new-topic"));
+    assertThat(getUnwrappedDb().changes().get(id).getNoteDbState()).isNotNull();
+    checker.checkChanges(id);
+  }
+
+  @Test
+  public void restApiNotFoundWhenNoteDbDisabled() throws Exception {
+    PushOneCommit.Result r = createChange();
+    exception.expect(ResourceNotFoundException.class);
+    rebuildHandler.apply(parseChangeResource(r.getChangeId()), new Input());
+  }
+
+  @Test
+  public void rebuildViaRestApi() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getPatchSetId().getParentKey();
+    setNotesMigration(true, false);
+
+    checker.assertNoChangeRef(project, id);
+    rebuildHandler.apply(parseChangeResource(r.getChangeId()), new Input());
+    checker.checkChanges(id);
+  }
+
+  @Test
+  public void writeToNewRefForNewChange() throws Exception {
+    PushOneCommit.Result r1 = createChange();
+    Change.Id id1 = r1.getPatchSetId().getParentKey();
+
+    setNotesMigration(true, false);
+    gApi.changes().id(id1.get()).topic(name("a-topic"));
+    PushOneCommit.Result r2 = createChange();
+    Change.Id id2 = r2.getPatchSetId().getParentKey();
+
+    // Second change was created after NoteDb writes were turned on, so it was
+    // allowed to write to a new ref.
+    checker.checkChanges(id2);
+
+    // First change was created before NoteDb writes were turned on, so its meta
+    // ref doesn't exist until a manual rebuild.
+    checker.assertNoChangeRef(project, id1);
+    checker.rebuildAndCheckChanges(id1);
+  }
+
+  @Test
+  public void noteDbChangeState() throws Exception {
+    setNotesMigration(true, true);
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getPatchSetId().getParentKey();
+
+    ObjectId changeMetaId = getMetaRef(project, changeMetaRef(id));
+    assertThat(getUnwrappedDb().changes().get(id).getNoteDbState()).isEqualTo(changeMetaId.name());
+
+    putDraft(user, id, 1, "comment by user", null);
+    ObjectId userDraftsId = getMetaRef(allUsers, refsDraftComments(id, user.getId()));
+    assertThat(getUnwrappedDb().changes().get(id).getNoteDbState())
+        .isEqualTo(changeMetaId.name() + "," + user.getId() + "=" + userDraftsId.name());
+
+    putDraft(admin, id, 2, "comment by admin", null);
+    ObjectId adminDraftsId = getMetaRef(allUsers, refsDraftComments(id, admin.getId()));
+    assertThat(admin.getId().get()).isLessThan(user.getId().get());
+    assertThat(getUnwrappedDb().changes().get(id).getNoteDbState())
+        .isEqualTo(
+            changeMetaId.name()
+                + ","
+                + admin.getId()
+                + "="
+                + adminDraftsId.name()
+                + ","
+                + user.getId()
+                + "="
+                + userDraftsId.name());
+
+    putDraft(admin, id, 2, "revised comment by admin", null);
+    adminDraftsId = getMetaRef(allUsers, refsDraftComments(id, admin.getId()));
+    assertThat(getUnwrappedDb().changes().get(id).getNoteDbState())
+        .isEqualTo(
+            changeMetaId.name()
+                + ","
+                + admin.getId()
+                + "="
+                + adminDraftsId.name()
+                + ","
+                + user.getId()
+                + "="
+                + userDraftsId.name());
+  }
+
+  @Test
+  public void rebuildAutomaticallyWhenChangeOutOfDate() throws Exception {
+    setNotesMigration(true, true);
+
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getPatchSetId().getParentKey();
+    assertChangeUpToDate(true, id);
+
+    // Make a ReviewDb change behind NoteDb's back and ensure it's detected.
+    setNotesMigration(false, false);
+    gApi.changes().id(id.get()).topic(name("a-topic"));
+    setInvalidNoteDbState(id);
+    assertChangeUpToDate(false, id);
+
+    // On next NoteDb read, the change is transparently rebuilt.
+    setNotesMigration(true, true);
+    assertThat(gApi.changes().id(id.get()).info().topic).isEqualTo(name("a-topic"));
+    assertChangeUpToDate(true, id);
+
+    // Check that the bundles are equal.
+    ChangeBundle actual =
+        ChangeBundle.fromNotes(commentsUtil, notesFactory.create(dbProvider.get(), project, id));
+    ChangeBundle expected = bundleReader.fromReviewDb(getUnwrappedDb(), id);
+    assertThat(actual.differencesFrom(expected)).isEmpty();
+  }
+
+  @Test
+  public void rebuildAutomaticallyWithinBatchUpdate() throws Exception {
+    setNotesMigration(true, true);
+
+    PushOneCommit.Result r = createChange();
+    final Change.Id id = r.getPatchSetId().getParentKey();
+    assertChangeUpToDate(true, id);
+
+    // Update ReviewDb and NoteDb, then revert the corresponding NoteDb change
+    // to simulate it failing.
+    NoteDbChangeState oldState = NoteDbChangeState.parse(getUnwrappedDb().changes().get(id));
+    String topic = name("a-topic");
+    gApi.changes().id(id.get()).topic(topic);
+    try (Repository repo = repoManager.openRepository(project)) {
+      new TestRepository<>(repo).update(RefNames.changeMetaRef(id), oldState.getChangeMetaId());
+    }
+    assertChangeUpToDate(false, id);
+
+    // Next NoteDb read comes inside the transaction started by BatchUpdate. In
+    // reality this could be caused by a failed update happening between when
+    // the change is parsed by ChangesCollection and when the BatchUpdate
+    // executes. We simulate it here by using BatchUpdate directly and not going
+    // through an API handler.
+    final String msg = "message from BatchUpdate";
+    try (BatchUpdate bu =
+        batchUpdateFactory.create(
+            db, project, identifiedUserFactory.create(user.getId()), TimeUtil.nowTs())) {
+      bu.addOp(
+          id,
+          new BatchUpdateOp() {
+            @Override
+            public boolean updateChange(ChangeContext ctx) throws OrmException {
+              PatchSet.Id psId = ctx.getChange().currentPatchSetId();
+              ChangeMessage cm =
+                  new ChangeMessage(
+                      new ChangeMessage.Key(id, ChangeUtil.messageUuid()),
+                      ctx.getAccountId(),
+                      ctx.getWhen(),
+                      psId);
+              cm.setMessage(msg);
+              ctx.getDb().changeMessages().insert(Collections.singleton(cm));
+              ctx.getUpdate(psId).setChangeMessage(msg);
+              return true;
+            }
+          });
+      try {
+        bu.execute();
+        fail("expected update to fail");
+      } catch (UpdateException e) {
+        assertThat(e.getMessage()).contains("cannot copy ChangeNotesState");
+      }
+    }
+
+    // TODO(dborowitz): Re-enable these assertions once we fix auto-rebuilding
+    // in the BatchUpdate path.
+    // As an implementation detail, change wasn't actually rebuilt inside the
+    // BatchUpdate transaction, but it was rebuilt during read for the
+    // subsequent reindex. Thus it's impossible to actually observe an
+    // out-of-date state in the caller.
+    // assertChangeUpToDate(true, id);
+
+    // Check that the bundles are equal.
+    // ChangeNotes notes = notesFactory.create(dbProvider.get(), project, id);
+    // ChangeBundle actual = ChangeBundle.fromNotes(commentsUtil, notes);
+    // ChangeBundle expected = bundleReader.fromReviewDb(getUnwrappedDb(), id);
+    // assertThat(actual.differencesFrom(expected)).isEmpty();
+    // assertThat(
+    //        Iterables.transform(
+    //            notes.getChangeMessages(),
+    //            ChangeMessage::getMessage))
+    //    .contains(msg);
+    // assertThat(actual.getChange().getTopic()).isEqualTo(topic);
+  }
+
+  @Test
+  public void rebuildIgnoresErrorIfChangeIsUpToDateAfter() throws Exception {
+    setNotesMigration(true, true);
+
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getPatchSetId().getParentKey();
+    assertChangeUpToDate(true, id);
+
+    // Make a ReviewDb change behind NoteDb's back and ensure it's detected.
+    setNotesMigration(false, false);
+    gApi.changes().id(id.get()).topic(name("a-topic"));
+    setInvalidNoteDbState(id);
+    assertChangeUpToDate(false, id);
+
+    // Force the next rebuild attempt to fail but also rebuild the change in the
+    // background.
+    rebuilderWrapper.stealNextUpdate();
+    setNotesMigration(true, true);
+    assertThat(gApi.changes().id(id.get()).info().topic).isEqualTo(name("a-topic"));
+    assertChangeUpToDate(true, id);
+
+    // Check that the bundles are equal.
+    ChangeBundle actual =
+        ChangeBundle.fromNotes(commentsUtil, notesFactory.create(dbProvider.get(), project, id));
+    ChangeBundle expected = bundleReader.fromReviewDb(getUnwrappedDb(), id);
+    assertThat(actual.differencesFrom(expected)).isEmpty();
+  }
+
+  @Test
+  public void rebuildReturnsCorrectResultEvenIfSavingToNoteDbFailed() throws Exception {
+    setNotesMigration(true, true);
+
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getPatchSetId().getParentKey();
+    assertChangeUpToDate(true, id);
+    ObjectId oldMetaId = getMetaRef(project, changeMetaRef(id));
+
+    // Make a ReviewDb change behind NoteDb's back.
+    setNotesMigration(false, false);
+    gApi.changes().id(id.get()).topic(name("a-topic"));
+    setInvalidNoteDbState(id);
+    assertChangeUpToDate(false, id);
+    assertThat(getMetaRef(project, changeMetaRef(id))).isEqualTo(oldMetaId);
+
+    // Force the next rebuild attempt to fail.
+    rebuilderWrapper.failNextUpdate();
+    setNotesMigration(true, true);
+    ChangeNotes notes = notesFactory.create(dbProvider.get(), project, id);
+
+    // Not up to date, but the actual returned state matches anyway.
+    assertChangeUpToDate(false, id);
+    assertThat(getMetaRef(project, changeMetaRef(id))).isEqualTo(oldMetaId);
+    ChangeBundle actual = ChangeBundle.fromNotes(commentsUtil, notes);
+    ChangeBundle expected = bundleReader.fromReviewDb(getUnwrappedDb(), id);
+    assertThat(actual.differencesFrom(expected)).isEmpty();
+    assertChangeUpToDate(false, id);
+
+    // Another rebuild attempt succeeds
+    notesFactory.create(dbProvider.get(), project, id);
+    assertThat(getMetaRef(project, changeMetaRef(id))).isNotEqualTo(oldMetaId);
+    assertChangeUpToDate(true, id);
+  }
+
+  @Test
+  public void rebuildReturnsDraftResultWhenRebuildingInChangeNotesFails() throws Exception {
+    setNotesMigration(true, true);
+
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getPatchSetId().getParentKey();
+    putDraft(user, id, 1, "comment by user", null);
+    assertChangeUpToDate(true, id);
+
+    ObjectId oldMetaId = getMetaRef(allUsers, refsDraftComments(id, user.getId()));
+
+    // Add a draft behind NoteDb's back.
+    setNotesMigration(false, false);
+    putDraft(user, id, 1, "second comment by user", null);
+    setInvalidNoteDbState(id);
+    assertDraftsUpToDate(false, id, user);
+    assertThat(getMetaRef(allUsers, refsDraftComments(id, user.getId()))).isEqualTo(oldMetaId);
+
+    // Force the next rebuild attempt to fail (in ChangeNotes).
+    rebuilderWrapper.failNextUpdate();
+    setNotesMigration(true, true);
+    ChangeNotes notes = notesFactory.create(dbProvider.get(), project, id);
+    notes.getDraftComments(user.getId());
+    assertThat(getMetaRef(allUsers, refsDraftComments(id, user.getId()))).isEqualTo(oldMetaId);
+
+    // Not up to date, but the actual returned state matches anyway.
+    assertDraftsUpToDate(false, id, user);
+    ChangeBundle actual = ChangeBundle.fromNotes(commentsUtil, notes);
+    ChangeBundle expected = bundleReader.fromReviewDb(getUnwrappedDb(), id);
+    assertThat(actual.differencesFrom(expected)).isEmpty();
+
+    // Another rebuild attempt succeeds
+    notesFactory.create(dbProvider.get(), project, id);
+    assertChangeUpToDate(true, id);
+    assertDraftsUpToDate(true, id, user);
+    assertThat(getMetaRef(allUsers, refsDraftComments(id, user.getId()))).isNotEqualTo(oldMetaId);
+  }
+
+  @Test
+  public void rebuildReturnsDraftResultWhenRebuildingInDraftCommentNotesFails() throws Exception {
+    setNotesMigration(true, true);
+
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getPatchSetId().getParentKey();
+    putDraft(user, id, 1, "comment by user", null);
+    assertChangeUpToDate(true, id);
+
+    ObjectId oldMetaId = getMetaRef(allUsers, refsDraftComments(id, user.getId()));
+
+    // Add a draft behind NoteDb's back.
+    setNotesMigration(false, false);
+    putDraft(user, id, 1, "second comment by user", null);
+
+    ReviewDb db = getUnwrappedDb();
+    Change c = db.changes().get(id);
+    // Leave change meta ID alone so DraftCommentNotes does the rebuild.
+    ObjectId badSha = ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef");
+    NoteDbChangeState bogusState =
+        new NoteDbChangeState(
+            id,
+            PrimaryStorage.REVIEW_DB,
+            Optional.of(
+                NoteDbChangeState.RefState.create(
+                    NoteDbChangeState.parse(c).getChangeMetaId(),
+                    ImmutableMap.of(user.getId(), badSha))),
+            Optional.empty());
+    c.setNoteDbState(bogusState.toString());
+    db.changes().update(Collections.singleton(c));
+
+    assertDraftsUpToDate(false, id, user);
+    assertThat(getMetaRef(allUsers, refsDraftComments(id, user.getId()))).isEqualTo(oldMetaId);
+
+    // Force the next rebuild attempt to fail (in DraftCommentNotes).
+    rebuilderWrapper.failNextUpdate();
+    setNotesMigration(true, true);
+    ChangeNotes notes = notesFactory.create(dbProvider.get(), project, id);
+    notes.getDraftComments(user.getId());
+    assertThat(getMetaRef(allUsers, refsDraftComments(id, user.getId()))).isEqualTo(oldMetaId);
+
+    // Not up to date, but the actual returned state matches anyway.
+    assertChangeUpToDate(true, id);
+    assertDraftsUpToDate(false, id, user);
+    ChangeBundle actual = ChangeBundle.fromNotes(commentsUtil, notes);
+    ChangeBundle expected = bundleReader.fromReviewDb(getUnwrappedDb(), id);
+    assertThat(actual.differencesFrom(expected)).isEmpty();
+
+    // Another rebuild attempt succeeds
+    notesFactory.create(dbProvider.get(), project, id).getDraftComments(user.getId());
+    assertChangeUpToDate(true, id);
+    assertDraftsUpToDate(true, id, user);
+    assertThat(getMetaRef(allUsers, refsDraftComments(id, user.getId()))).isNotEqualTo(oldMetaId);
+  }
+
+  @Test
+  public void rebuildAutomaticallyWhenDraftsOutOfDate() throws Exception {
+    setNotesMigration(true, true);
+    setApiUser(user);
+
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getPatchSetId().getParentKey();
+    putDraft(user, id, 1, "comment", null);
+    assertDraftsUpToDate(true, id, user);
+
+    // Make a ReviewDb change behind NoteDb's back and ensure it's detected.
+    setNotesMigration(false, false);
+    putDraft(user, id, 1, "comment", null);
+    setInvalidNoteDbState(id);
+    assertDraftsUpToDate(false, id, user);
+
+    // On next NoteDb read, the drafts are transparently rebuilt.
+    setNotesMigration(true, true);
+    assertThat(gApi.changes().id(id.get()).current().drafts()).containsKey(PushOneCommit.FILE_NAME);
+    assertDraftsUpToDate(true, id, user);
+  }
+
+  @Test
+  public void pushCert() throws Exception {
+    // We don't have the code in our test harness to do signed pushes, so just
+    // use a hard-coded cert. This cert was actually generated by C git 2.2.0
+    // (albeit not for sending to Gerrit).
+    String cert =
+        "certificate version 0.1\n"
+            + "pusher Dave Borowitz <dborowitz@google.com> 1433954361 -0700\n"
+            + "pushee git://localhost/repo.git\n"
+            + "nonce 1433954361-bde756572d665bba81d8\n"
+            + "\n"
+            + "0000000000000000000000000000000000000000"
+            + "b981a177396fb47345b7df3e4d3f854c6bea7"
+            + "s/heads/master\n"
+            + "-----BEGIN PGP SIGNATURE-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "iQEcBAABAgAGBQJVeGg5AAoJEPfTicJkUdPkUggH/RKAeI9/i/LduuiqrL/SSdIa\n"
+            + "9tYaSqJKLbXz63M/AW4Sp+4u+dVCQvnAt/a35CVEnpZz6hN4Kn/tiswOWVJf4CO7\n"
+            + "htNubGs5ZMwvD6sLYqKAnrM3WxV/2TbbjzjZW6Jkidz3jz/WRT4SmjGYiEO7aA+V\n"
+            + "4ZdIS9f7sW5VsHHYlNThCA7vH8Uu48bUovFXyQlPTX0pToSgrWV3JnTxDNxfn3iG\n"
+            + "IL0zTY/qwVCdXgFownLcs6J050xrrBWIKqfcWr3u4D2aCLyR0v+S/KArr7ulZygY\n"
+            + "+SOklImn8TAZiNxhWtA6ens66IiammUkZYFv7SSzoPLFZT4dC84SmGPWgf94NoQ=\n"
+            + "=XFeC\n"
+            + "-----END PGP SIGNATURE-----\n";
+
+    PushOneCommit.Result r = createChange();
+    PatchSet.Id psId = r.getPatchSetId();
+    Change.Id id = psId.getParentKey();
+
+    PatchSet ps = db.patchSets().get(psId);
+    ps.setPushCertificate(cert);
+    db.patchSets().update(Collections.singleton(ps));
+    indexer.index(db, project, id);
+
+    checker.rebuildAndCheckChanges(id);
+  }
+
+  @Test
+  public void emptyTopic() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getPatchSetId().getParentKey();
+    Change c = db.changes().get(id);
+    assertThat(c.getTopic()).isNull();
+    c.setTopic("");
+    db.changes().update(Collections.singleton(c));
+
+    checker.rebuildAndCheckChanges(id);
+
+    setNotesMigration(true, true);
+
+    // Rebuild and check was successful, but NoteDb doesn't support storing an
+    // empty topic, so it comes out as null.
+    ChangeNotes notes = notesFactory.create(db, project, id);
+    assertThat(notes.getChange().getTopic()).isNull();
+  }
+
+  @Test
+  public void commentBeforeFirstPatchSet() throws Exception {
+    PushOneCommit.Result r = createChange();
+    PatchSet.Id psId = r.getPatchSetId();
+    Change.Id id = psId.getParentKey();
+
+    Change c = db.changes().get(id);
+    c.setCreatedOn(new Timestamp(c.getCreatedOn().getTime() - 5000));
+    db.changes().update(Collections.singleton(c));
+    indexer.index(db, project, id);
+
+    ReviewInput rin = new ReviewInput();
+    rin.message = "comment";
+
+    Timestamp ts = new Timestamp(c.getCreatedOn().getTime() + 2000);
+    assertThat(ts).isGreaterThan(c.getCreatedOn());
+    assertThat(ts).isLessThan(db.patchSets().get(psId).getCreatedOn());
+    RevisionResource revRsrc = parseCurrentRevisionResource(r.getChangeId());
+    postReview.get().apply(batchUpdateFactory, revRsrc, rin, ts);
+
+    checker.rebuildAndCheckChanges(id);
+  }
+
+  @Test
+  public void commentPredatingChangeBySomeoneOtherThanOwner() throws Exception {
+    PushOneCommit.Result r = createChange();
+    PatchSet.Id psId = r.getPatchSetId();
+    Change.Id id = psId.getParentKey();
+    Change c = db.changes().get(id);
+
+    ReviewInput rin = new ReviewInput();
+    rin.message = "comment";
+
+    Timestamp ts = new Timestamp(c.getCreatedOn().getTime() - 10000);
+    RevisionResource revRsrc = parseCurrentRevisionResource(r.getChangeId());
+    setApiUser(user);
+    postReview.get().apply(batchUpdateFactory, revRsrc, rin, ts);
+
+    checker.rebuildAndCheckChanges(id);
+  }
+
+  @Test
+  public void noteDbUsesOriginalSubjectFromPatchSetAndIgnoresChangeField() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String orig = r.getChange().change().getSubject();
+    r =
+        pushFactory
+            .create(
+                db,
+                admin.getIdent(),
+                testRepo,
+                orig + " v2",
+                PushOneCommit.FILE_NAME,
+                "new contents",
+                r.getChangeId())
+            .to("refs/for/master");
+    r.assertOkStatus();
+
+    PatchSet.Id psId = r.getPatchSetId();
+    Change.Id id = psId.getParentKey();
+    Change c = db.changes().get(id);
+
+    c.setCurrentPatchSet(psId, c.getSubject(), "Bogus original subject");
+    db.changes().update(Collections.singleton(c));
+
+    checker.rebuildAndCheckChanges(id);
+
+    setNotesMigration(true, true);
+    ChangeNotes notes = notesFactory.create(db, project, id);
+    Change nc = notes.getChange();
+    assertThat(nc.getSubject()).isEqualTo(c.getSubject());
+    assertThat(nc.getSubject()).isEqualTo(orig + " v2");
+    assertThat(nc.getOriginalSubject()).isNotEqualTo(c.getOriginalSubject());
+    assertThat(nc.getOriginalSubject()).isEqualTo(orig);
+  }
+
+  @Test
+  public void ignorePatchLineCommentsOnPatchSet0() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change change = r.getChange().change();
+    Change.Id id = change.getId();
+
+    PatchLineComment comment =
+        new PatchLineComment(
+            new PatchLineComment.Key(
+                new Patch.Key(new PatchSet.Id(id, 0), PushOneCommit.FILE_NAME), "uuid"),
+            0,
+            user.getId(),
+            null,
+            TimeUtil.nowTs());
+    comment.setSide((short) 1);
+    comment.setMessage("message");
+    comment.setStatus(PatchLineComment.Status.PUBLISHED);
+    db.patchComments().insert(Collections.singleton(comment));
+    indexer.index(db, change.getProject(), id);
+
+    checker.rebuildAndCheckChanges(id);
+
+    setNotesMigration(true, true);
+    ChangeNotes notes = notesFactory.create(db, project, id);
+    assertThat(notes.getComments()).isEmpty();
+  }
+
+  @Test
+  public void leadingSpacesInSubject() throws Exception {
+    String subj = "   " + PushOneCommit.SUBJECT;
+    PushOneCommit push =
+        pushFactory.create(
+            db,
+            admin.getIdent(),
+            testRepo,
+            subj,
+            PushOneCommit.FILE_NAME,
+            PushOneCommit.FILE_CONTENT);
+    PushOneCommit.Result r = push.to("refs/for/master");
+    r.assertOkStatus();
+    Change change = r.getChange().change();
+    assertThat(change.getSubject()).isEqualTo(subj);
+    Change.Id id = r.getPatchSetId().getParentKey();
+
+    checker.rebuildAndCheckChanges(id);
+
+    setNotesMigration(true, true);
+    ChangeNotes notes = notesFactory.create(db, project, id);
+    assertThat(notes.getChange().getSubject()).isNotEqualTo(subj);
+    assertThat(notes.getChange().getSubject()).isEqualTo(PushOneCommit.SUBJECT);
+  }
+
+  @Test
+  public void allTimestampsExceptUpdatedAreEqualDueToBadMigration() throws Exception {
+    // https://bugs.chromium.org/p/gerrit/issues/detail?id=7397
+    PushOneCommit.Result r = createChange();
+    Change c = r.getChange().change();
+    Change.Id id = c.getId();
+    Timestamp ts = TimeUtil.nowTs();
+    Timestamp origUpdated = c.getLastUpdatedOn();
+
+    c.setCreatedOn(ts);
+    assertThat(c.getCreatedOn()).isGreaterThan(c.getLastUpdatedOn());
+    db.changes().update(Collections.singleton(c));
+
+    List<ChangeMessage> cm = db.changeMessages().byChange(id).toList();
+    cm.forEach(m -> m.setWrittenOn(ts));
+    db.changeMessages().update(cm);
+
+    List<PatchSet> ps = db.patchSets().byChange(id).toList();
+    ps.forEach(p -> p.setCreatedOn(ts));
+    db.patchSets().update(ps);
+
+    List<PatchSetApproval> psa = db.patchSetApprovals().byChange(id).toList();
+    psa.forEach(p -> p.setGranted(ts));
+    db.patchSetApprovals().update(psa);
+
+    List<PatchLineComment> plc = db.patchComments().byChange(id).toList();
+    plc.forEach(p -> p.setWrittenOn(ts));
+    db.patchComments().update(plc);
+
+    checker.rebuildAndCheckChanges(id);
+
+    setNotesMigration(true, true);
+    ChangeNotes notes = notesFactory.create(db, project, id);
+    assertThat(notes.getChange().getCreatedOn()).isEqualTo(origUpdated);
+    assertThat(notes.getChange().getLastUpdatedOn()).isAtLeast(origUpdated);
+    assertThat(notes.getPatchSets().get(new PatchSet.Id(id, 1)).getCreatedOn())
+        .isEqualTo(origUpdated);
+  }
+
+  @Test
+  public void createWithAutoRebuildingDisabled() throws Exception {
+    ReviewDb oldDb = db;
+    setNotesMigration(true, true);
+
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getPatchSetId().getParentKey();
+    ChangeNotes oldNotes = notesFactory.create(db, project, id);
+
+    // Make a ReviewDb change behind NoteDb's back.
+    Change c = oldDb.changes().get(id);
+    assertThat(c.getTopic()).isNull();
+    String topic = name("a-topic");
+    c.setTopic(topic);
+    oldDb.changes().update(Collections.singleton(c));
+
+    c = oldDb.changes().get(c.getId());
+    ChangeNotes newNotes = notesFactory.createWithAutoRebuildingDisabled(c, null);
+    assertThat(newNotes.getChange().getTopic()).isNotEqualTo(topic);
+    assertThat(newNotes.getChange().getTopic()).isEqualTo(oldNotes.getChange().getTopic());
+  }
+
+  @Test
+  public void rebuildDeletesOldDraftRefs() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getPatchSetId().getParentKey();
+    putDraft(user, id, 1, "comment", null);
+
+    Account.Id otherAccountId = new Account.Id(user.getId().get() + 1234);
+    String otherDraftRef = refsDraftComments(id, otherAccountId);
+
+    try (Repository repo = repoManager.openRepository(allUsers);
+        ObjectInserter ins = repo.newObjectInserter()) {
+      ObjectId sha = ins.insert(OBJ_BLOB, "garbage data".getBytes(UTF_8));
+      ins.flush();
+      RefUpdate ru = repo.updateRef(otherDraftRef);
+      ru.setExpectedOldObjectId(ObjectId.zeroId());
+      ru.setNewObjectId(sha);
+      assertThat(ru.update()).isEqualTo(RefUpdate.Result.NEW);
+    }
+
+    checker.rebuildAndCheckChanges(id);
+
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      assertThat(repo.exactRef(otherDraftRef)).isNull();
+    }
+  }
+
+  @Test
+  public void failWhenWritesDisabled() throws Exception {
+    setNotesMigration(true, true);
+
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getPatchSetId().getParentKey();
+    assertChangeUpToDate(true, id);
+    assertThat(gApi.changes().id(id.get()).info().topic).isNull();
+
+    // Turning off writes causes failure.
+    setNotesMigration(false, true);
+    try {
+      gApi.changes().id(id.get()).topic(name("a-topic"));
+      fail("Expected write to fail");
+    } catch (RestApiException e) {
+      assertChangesReadOnly(e);
+    }
+
+    // Update was not written.
+    assertThat(gApi.changes().id(id.get()).info().topic).isNull();
+    assertChangeUpToDate(true, id);
+  }
+
+  @Test
+  public void rebuildWhenWritesDisabledWorksButDoesNotWrite() throws Exception {
+    setNotesMigration(true, true);
+
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getPatchSetId().getParentKey();
+    assertChangeUpToDate(true, id);
+
+    // Make a ReviewDb change behind NoteDb's back and ensure it's detected.
+    setNotesMigration(false, false);
+    gApi.changes().id(id.get()).topic(name("a-topic"));
+    setInvalidNoteDbState(id);
+    assertChangeUpToDate(false, id);
+
+    // On next NoteDb read, change is rebuilt in-memory but not stored.
+    setNotesMigration(false, true);
+    assertThat(gApi.changes().id(id.get()).info().topic).isEqualTo(name("a-topic"));
+    assertChangeUpToDate(false, id);
+
+    // Attempting to write directly causes failure.
+    try {
+      gApi.changes().id(id.get()).topic(name("other-topic"));
+      fail("Expected write to fail");
+    } catch (RestApiException e) {
+      assertChangesReadOnly(e);
+    }
+
+    // Update was not written.
+    assertThat(gApi.changes().id(id.get()).info().topic).isEqualTo(name("a-topic"));
+    assertChangeUpToDate(false, id);
+  }
+
+  @Test
+  public void rebuildChangeWithNoPatchSets() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getPatchSetId().getParentKey();
+    db.changes().beginTransaction(id);
+    try {
+      db.patchSets().delete(db.patchSets().byChange(id));
+      db.commit();
+    } finally {
+      db.rollback();
+    }
+
+    try {
+      checker.rebuildAndCheckChanges(id);
+      assert_().fail("expected NoPatchSetsException");
+    } catch (NoPatchSetsException e) {
+      // Expected.
+    }
+
+    Change c = db.changes().get(id);
+    assertThat(c.getNoteDbState()).isNull();
+    checker.assertNoChangeRef(project, id);
+  }
+
+  @Test
+  public void rebuildChangeWithNoEntitiesOtherThanChange() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getPatchSetId().getParentKey();
+    db.changes().beginTransaction(id);
+    try {
+      db.changeMessages().delete(db.changeMessages().byChange(id));
+      db.patchSets().delete(db.patchSets().byChange(id));
+      db.patchSetApprovals().delete(db.patchSetApprovals().byChange(id));
+      db.patchComments().delete(db.patchComments().byChange(id));
+      db.commit();
+    } finally {
+      db.rollback();
+    }
+
+    try {
+      checker.rebuildAndCheckChanges(id);
+      assert_().fail("expected NoPatchSetsException");
+    } catch (NoPatchSetsException e) {
+      // Expected.
+    }
+
+    Change c = db.changes().get(id);
+    assertThat(c.getNoteDbState()).isNull();
+    checker.assertNoChangeRef(project, id);
+  }
+
+  @Test
+  public void rebuildEntitiesCreatedByImpersonation() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getPatchSetId().getParentKey();
+    PatchSet.Id psId = new PatchSet.Id(id, 1);
+    String prefix = "/changes/" + id + "/revisions/current/";
+
+    // For each of the entities that have a real user field, create one entity
+    // without impersonation and one with.
+    CommentInput ci = new CommentInput();
+    ci.path = Patch.COMMIT_MSG;
+    ci.side = Side.REVISION;
+    ci.line = 1;
+    ci.message = "comment without impersonation";
+    ReviewInput ri = new ReviewInput();
+    ri.label("Code-Review", -1);
+    ri.message = "message without impersonation";
+    ri.drafts = DraftHandling.KEEP;
+    ri.comments = ImmutableMap.of(ci.path, ImmutableList.of(ci));
+    userRestSession.post(prefix + "review", ri).assertOK();
+
+    DraftInput di = new DraftInput();
+    di.path = Patch.COMMIT_MSG;
+    di.side = Side.REVISION;
+    di.line = 1;
+    di.message = "draft without impersonation";
+    userRestSession.put(prefix + "drafts", di).assertCreated();
+
+    allowRunAs();
+    try {
+      Header runAs = new BasicHeader("X-Gerrit-RunAs", user.id.toString());
+      ci.message = "comment with impersonation";
+      ri.message = "message with impersonation";
+      ri.label("Code-Review", 1);
+      adminRestSession.postWithHeader(prefix + "review", runAs, ri).assertOK();
+
+      di.message = "draft with impersonation";
+      adminRestSession.putWithHeader(prefix + "drafts", runAs, di).assertCreated();
+    } finally {
+      removeRunAs();
+    }
+
+    List<ChangeMessage> msgs =
+        Ordering.natural()
+            .onResultOf(ChangeMessage::getWrittenOn)
+            .sortedCopy(db.changeMessages().byChange(id));
+    assertThat(msgs).hasSize(3);
+    assertThat(msgs.get(1).getMessage()).endsWith("message without impersonation");
+    assertThat(msgs.get(1).getAuthor()).isEqualTo(user.id);
+    assertThat(msgs.get(1).getRealAuthor()).isEqualTo(user.id);
+    assertThat(msgs.get(2).getMessage()).endsWith("message with impersonation");
+    assertThat(msgs.get(2).getAuthor()).isEqualTo(user.id);
+    assertThat(msgs.get(2).getRealAuthor()).isEqualTo(admin.id);
+
+    List<PatchSetApproval> psas = db.patchSetApprovals().byChange(id).toList();
+    assertThat(psas).hasSize(1);
+    assertThat(psas.get(0).getLabel()).isEqualTo("Code-Review");
+    assertThat(psas.get(0).getValue()).isEqualTo(1);
+    assertThat(psas.get(0).getAccountId()).isEqualTo(user.id);
+    assertThat(psas.get(0).getRealAccountId()).isEqualTo(admin.id);
+
+    Ordering<PatchLineComment> commentOrder =
+        Ordering.natural().onResultOf(PatchLineComment::getWrittenOn);
+    List<PatchLineComment> drafts =
+        commentOrder.sortedCopy(db.patchComments().draftByPatchSetAuthor(psId, user.id));
+    assertThat(drafts).hasSize(2);
+    assertThat(drafts.get(0).getMessage()).isEqualTo("draft without impersonation");
+    assertThat(drafts.get(0).getAuthor()).isEqualTo(user.id);
+    assertThat(drafts.get(0).getRealAuthor()).isEqualTo(user.id);
+    assertThat(drafts.get(1).getMessage()).isEqualTo("draft with impersonation");
+    assertThat(drafts.get(1).getAuthor()).isEqualTo(user.id);
+    assertThat(drafts.get(1).getRealAuthor()).isEqualTo(admin.id);
+
+    List<PatchLineComment> pub =
+        commentOrder.sortedCopy(db.patchComments().publishedByPatchSet(psId));
+    assertThat(pub).hasSize(2);
+    assertThat(pub.get(0).getMessage()).isEqualTo("comment without impersonation");
+    assertThat(pub.get(0).getAuthor()).isEqualTo(user.id);
+    assertThat(pub.get(0).getRealAuthor()).isEqualTo(user.id);
+    assertThat(pub.get(1).getMessage()).isEqualTo("comment with impersonation");
+    assertThat(pub.get(1).getAuthor()).isEqualTo(user.id);
+    assertThat(pub.get(1).getRealAuthor()).isEqualTo(admin.id);
+  }
+
+  @Test
+  public void laterEventsDependingOnEarlierPatchSetDontIntefereWithOtherPatchSets()
+      throws Exception {
+    PushOneCommit.Result r1 = createChange();
+    ChangeData cd = r1.getChange();
+    Change.Id id = cd.getId();
+    amendChange(cd.change().getKey().get());
+    TestTimeUtil.incrementClock(90, TimeUnit.DAYS);
+
+    ReviewInput rin = ReviewInput.approve();
+    rin.message = "Some very late message on PS1";
+    gApi.changes().id(id.get()).revision(1).review(rin);
+
+    checker.rebuildAndCheckChanges(id);
+  }
+
+  @Test
+  public void ignoreChangeMessageBeyondCurrentPatchSet() throws Exception {
+    PushOneCommit.Result r = createChange();
+    PatchSet.Id psId1 = r.getPatchSetId();
+    Change.Id id = psId1.getParentKey();
+    gApi.changes().id(id.get()).current().review(ReviewInput.recommend());
+
+    r = amendChange(r.getChangeId());
+    PatchSet.Id psId2 = r.getPatchSetId();
+
+    assertThat(db.patchSets().byChange(id)).hasSize(2);
+    assertThat(db.changeMessages().byPatchSet(psId2)).hasSize(1);
+    db.patchSets().deleteKeys(Collections.singleton(psId2));
+
+    checker.rebuildAndCheckChanges(psId2.getParentKey());
+    setNotesMigration(true, true);
+
+    ChangeData cd = changeDataFactory.create(db, project, id);
+    assertThat(cd.change().currentPatchSetId()).isEqualTo(psId1);
+    assertThat(cd.patchSets().stream().map(PatchSet::getId).collect(toList()))
+        .containsExactly(psId1);
+    PatchSet ps = cd.currentPatchSet();
+    assertThat(ps).isNotNull();
+    assertThat(ps.getId()).isEqualTo(psId1);
+  }
+
+  @Test
+  public void highestNumberedPatchSetIsNotCurrent() throws Exception {
+    PushOneCommit.Result r1 = createChange();
+    PatchSet.Id psId1 = r1.getPatchSetId();
+    Change.Id id = psId1.getParentKey();
+    PushOneCommit.Result r2 = amendChange(r1.getChangeId());
+    PatchSet.Id psId2 = r2.getPatchSetId();
+
+    try (BatchUpdate bu =
+        batchUpdateFactory.create(
+            db, project, identifiedUserFactory.create(user.getId()), TimeUtil.nowTs())) {
+      bu.addOp(
+          id,
+          new BatchUpdateOp() {
+            @Override
+            public boolean updateChange(ChangeContext ctx)
+                throws PatchSetInfoNotAvailableException {
+              ctx.getChange()
+                  .setCurrentPatchSet(patchSetInfoFactory.get(ctx.getDb(), ctx.getNotes(), psId1));
+              return true;
+            }
+          });
+      bu.execute();
+    }
+    ChangeNotes notes = notesFactory.create(db, project, id);
+    assertThat(psUtil.byChangeAsMap(db, notes).keySet()).containsExactly(psId1, psId2);
+    assertThat(notes.getChange().currentPatchSetId()).isEqualTo(psId1);
+
+    assertThat(db.changes().get(id).currentPatchSetId()).isEqualTo(psId1);
+
+    checker.rebuildAndCheckChanges(id);
+    setNotesMigration(true, true);
+
+    notes = notesFactory.create(db, project, id);
+    assertThat(psUtil.byChangeAsMap(db, notes).keySet()).containsExactly(psId1, psId2);
+    assertThat(notes.getChange().currentPatchSetId()).isEqualTo(psId1);
+  }
+
+  @Test
+  public void resolveCommentsInheritsValueFromParentWhenUnspecified() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getPatchSetId().getParentKey();
+    putDraft(user, id, 1, "comment", true);
+    putDraft(user, id, 1, "newComment", null);
+
+    Map<String, List<CommentInfo>> comments = gApi.changes().id(id.get()).current().drafts();
+    for (List<CommentInfo> cList : comments.values()) {
+      for (CommentInfo ci : cList) {
+        assertThat(ci.unresolved).isTrue();
+      }
+    }
+  }
+
+  @Test
+  public void rebuilderRespectsReadOnlyInNoteDbChangeState() throws Exception {
+    TestTimeUtil.resetWithClockStep(1, SECONDS);
+    PushOneCommit.Result r = createChange();
+    PatchSet.Id psId1 = r.getPatchSetId();
+    Change.Id id = psId1.getParentKey();
+
+    checker.rebuildAndCheckChanges(id);
+    setNotesMigration(true, true);
+
+    ReviewDb db = getUnwrappedDb();
+    Change c = db.changes().get(id);
+    NoteDbChangeState state = NoteDbChangeState.parse(c);
+    Timestamp until = new Timestamp(TimeUtil.nowMs() + MILLISECONDS.convert(1, DAYS));
+    state = state.withReadOnlyUntil(until);
+    c.setNoteDbState(state.toString());
+    db.changes().update(Collections.singleton(c));
+
+    try {
+      rebuilderWrapper.rebuild(db, id);
+      fail("expected rebuild to fail");
+    } catch (OrmRuntimeException e) {
+      assertThat(e.getMessage()).contains("read-only until");
+    }
+
+    TestTimeUtil.setClock(new Timestamp(until.getTime() + MILLISECONDS.convert(1, SECONDS)));
+    rebuilderWrapper.rebuild(db, id);
+  }
+
+  @Test
+  public void commitWithCrLineEndings() throws Exception {
+    PushOneCommit.Result r =
+        createChange("Subject\r\rBody\r", PushOneCommit.FILE_NAME, PushOneCommit.FILE_CONTENT);
+    Change c = r.getChange().change();
+
+    // This assertion demonstrates an arguable bug in JGit's commit subject
+    // parsing, and shows how this kind of data might have gotten into
+    // ReviewDb. If that bug ever gets fixed upstream, this assert may start
+    // failing. If that happens, this test can be rewritten to directly set the
+    // subject field in ReviewDb.
+    assertThat(c.getSubject()).isEqualTo("Subject\r\rBody");
+
+    checker.rebuildAndCheckChanges(c.getId());
+  }
+
+  @Test
+  public void patchSetsOutOfOrder() throws Exception {
+    String id = createChange().getChangeId();
+    amendChange(id);
+    PushOneCommit.Result r = amendChange(id);
+
+    ChangeData cd = r.getChange();
+    PatchSet.Id psId3 = cd.change().currentPatchSetId();
+    assertThat(psId3.get()).isEqualTo(3);
+
+    PatchSet ps1 = db.patchSets().get(new PatchSet.Id(cd.getId(), 1));
+    PatchSet ps3 = db.patchSets().get(psId3);
+    assertThat(ps1.getCreatedOn()).isLessThan(ps3.getCreatedOn());
+
+    // Simulate an old Gerrit bug by setting the created timestamp of the latest
+    // patch set ID to the timestamp of PS1.
+    ps3.setCreatedOn(ps1.getCreatedOn());
+    db.patchSets().update(Collections.singleton(ps3));
+
+    checker.rebuildAndCheckChanges(cd.getId());
+
+    setNotesMigration(true, true);
+    cd = changeDataFactory.create(db, project, cd.getId());
+    assertThat(cd.change().currentPatchSetId()).isEqualTo(psId3);
+
+    List<PatchSet> patchSets = ImmutableList.copyOf(cd.patchSets());
+    assertThat(patchSets).hasSize(3);
+
+    PatchSet newPs1 = patchSets.get(0);
+    assertThat(newPs1.getId()).isEqualTo(ps1.getId());
+    assertThat(newPs1.getCreatedOn()).isEqualTo(ps1.getCreatedOn());
+
+    PatchSet newPs2 = patchSets.get(1);
+    assertThat(newPs2.getCreatedOn()).isGreaterThan(newPs1.getCreatedOn());
+
+    PatchSet newPs3 = patchSets.get(2);
+    assertThat(newPs3.getId()).isEqualTo(ps3.getId());
+    // Migrated with a newer timestamp than the original, to preserve ordering.
+    assertThat(newPs3.getCreatedOn()).isAtLeast(newPs2.getCreatedOn());
+    assertThat(newPs3.getCreatedOn()).isGreaterThan(ps1.getCreatedOn());
+  }
+
+  @Test
+  public void ignoreNoteDbStateWithNoCorrespondingRefWhenWritesAndReadsDisabled() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getChange().getId();
+    ReviewDb db = getUnwrappedDb();
+    Change c = db.changes().get(id);
+    c.setNoteDbState("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef");
+    db.changes().update(Collections.singleton(c));
+    c = db.changes().get(id);
+
+    String refName = RefNames.changeMetaRef(id);
+    assertThat(getMetaRef(project, refName)).isNull();
+
+    ChangeNotes notes = notesFactory.create(dbProvider.get(), project, id);
+    assertThat(notes.getChange().getRowVersion()).isEqualTo(c.getRowVersion());
+
+    notes = notesFactory.createChecked(dbProvider.get(), project, id);
+    assertThat(notes.getChange().getRowVersion()).isEqualTo(c.getRowVersion());
+
+    assertThat(getMetaRef(project, refName)).isNull();
+  }
+
+  @Test
+  public void autoRebuildMissingRefWriteOnly() throws Exception {
+    setNotesMigration(true, false);
+    testAutoRebuildMissingRef();
+  }
+
+  @Test
+  public void autoRebuildMissingRefReadWrite() throws Exception {
+    setNotesMigration(true, true);
+    testAutoRebuildMissingRef();
+  }
+
+  private void testAutoRebuildMissingRef() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getChange().getId();
+
+    assertChangeUpToDate(true, id);
+    notesFactory.createChecked(db, project, id);
+
+    try (Repository repo = repoManager.openRepository(project)) {
+      RefUpdate ru = repo.updateRef(RefNames.changeMetaRef(id));
+      ru.setForceUpdate(true);
+      assertThat(ru.delete()).isEqualTo(RefUpdate.Result.FORCED);
+    }
+    assertChangeUpToDate(false, id);
+
+    notesFactory.createChecked(db, project, id);
+    assertChangeUpToDate(true, id);
+  }
+
+  @Test
+  public void missingPatchSetCommitOkForCommentsNotOnParentSide() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getChange().getId();
+
+    putDraft(user, id, 1, "draft comment", null, Side.REVISION);
+    putComment(user, id, 1, "published comment", null, Side.REVISION);
+
+    ReviewDb db = getUnwrappedDb();
+    PatchSet ps = db.patchSets().get(new PatchSet.Id(id, 1));
+    ps.setRevision(new RevId("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
+    db.patchSets().update(Collections.singleton(ps));
+
+    try {
+      patchListCache.getOldId(db.changes().get(id), ps, null);
+      assert_().fail("Expected PatchListNotAvailableException");
+    } catch (PatchListNotAvailableException e) {
+      // Expected.
+    }
+
+    checker.rebuildAndCheckChanges(id);
+  }
+
+  @Test
+  public void missingPatchSetCommitOmitsCommentsOnParentSide() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getChange().getId();
+
+    CommentInfo draftInfo = putDraft(user, id, 1, "draft comment", null, Side.PARENT);
+    putComment(user, id, 1, "published comment", null, Side.PARENT);
+    CommentInfo commentInfo =
+        gApi.changes().id(id.get()).comments().values().stream()
+            .flatMap(List::stream)
+            .findFirst()
+            .get();
+
+    ReviewDb db = getUnwrappedDb();
+    PatchSet ps = db.patchSets().get(new PatchSet.Id(id, 1));
+    ps.setRevision(new RevId("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
+    db.patchSets().update(Collections.singleton(ps));
+
+    try {
+      patchListCache.getOldId(db.changes().get(id), ps, null);
+      assert_().fail("Expected PatchListNotAvailableException");
+    } catch (PatchListNotAvailableException e) {
+      // Expected.
+    }
+
+    checker.rebuildAndCheckChange(
+        id,
+        Stream.of(draftInfo.id, commentInfo.id)
+            .sorted()
+            .map(c -> id + ",1," + PushOneCommit.FILE_NAME + "," + c)
+            .collect(
+                joining(", ", "PatchLineComment.Key sets differ: [", "] only in A; [] only in B")));
+  }
+
+  private void assertChangesReadOnly(RestApiException e) throws Exception {
+    Throwable cause = e.getCause();
+    assertThat(cause).isInstanceOf(UpdateException.class);
+    assertThat(cause.getCause()).isInstanceOf(OrmException.class);
+    assertThat(cause.getCause()).hasMessageThat().isEqualTo(NoteDbUpdateManager.CHANGES_READ_ONLY);
+  }
+
+  private void setInvalidNoteDbState(Change.Id id) throws Exception {
+    ReviewDb db = getUnwrappedDb();
+    Change c = db.changes().get(id);
+    // In reality we would have NoteDb writes enabled, which would write a real
+    // state into this field. For tests however, we turn NoteDb writes off, so
+    // just use a dummy state to force ChangeNotes to view the notes as
+    // out-of-date.
+    c.setNoteDbState("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef");
+    db.changes().update(Collections.singleton(c));
+  }
+
+  private void assertChangeUpToDate(boolean expected, Change.Id id) throws Exception {
+    try (Repository repo = repoManager.openRepository(project)) {
+      Change c = getUnwrappedDb().changes().get(id);
+      assertThat(c).isNotNull();
+      assertThat(c.getNoteDbState()).isNotNull();
+      NoteDbChangeState state = NoteDbChangeState.parse(c);
+      assertThat(state).isNotNull();
+      assertThat(state.getPrimaryStorage()).isEqualTo(PrimaryStorage.REVIEW_DB);
+      assertThat(state.isChangeUpToDate(new RepoRefCache(repo))).isEqualTo(expected);
+    }
+  }
+
+  private void assertDraftsUpToDate(boolean expected, Change.Id changeId, TestAccount account)
+      throws Exception {
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      Change c = getUnwrappedDb().changes().get(changeId);
+      assertThat(c).isNotNull();
+      assertThat(c.getNoteDbState()).isNotNull();
+      NoteDbChangeState state = NoteDbChangeState.parse(c);
+      assertThat(state.areDraftsUpToDate(new RepoRefCache(repo), account.getId()))
+          .isEqualTo(expected);
+    }
+  }
+
+  private ObjectId getMetaRef(Project.NameKey p, String name) throws Exception {
+    try (Repository repo = repoManager.openRepository(p)) {
+      Ref ref = repo.exactRef(name);
+      return ref != null ? ref.getObjectId() : null;
+    }
+  }
+
+  private CommentInfo putDraft(
+      TestAccount account, Change.Id id, int line, String msg, Boolean unresolved)
+      throws Exception {
+    return putDraft(account, id, line, msg, unresolved, Side.REVISION);
+  }
+
+  private CommentInfo putDraft(
+      TestAccount account, Change.Id id, int line, String msg, Boolean unresolved, Side side)
+      throws Exception {
+    DraftInput in = new DraftInput();
+    in.side = side;
+    in.line = line;
+    in.message = msg;
+    in.path = PushOneCommit.FILE_NAME;
+    in.unresolved = unresolved;
+    AcceptanceTestRequestScope.Context old = setApiUser(account);
+    try {
+      return gApi.changes().id(id.get()).current().createDraft(in).get();
+    } finally {
+      atrScope.set(old);
+    }
+  }
+
+  private void putComment(TestAccount account, Change.Id id, int line, String msg, String inReplyTo)
+      throws Exception {
+    putComment(account, id, line, msg, inReplyTo, Side.REVISION);
+  }
+
+  private void putComment(
+      TestAccount account, Change.Id id, int line, String msg, String inReplyTo, Side side)
+      throws Exception {
+    CommentInput in = new CommentInput();
+    in.side = side;
+    in.line = line;
+    in.message = msg;
+    in.inReplyTo = inReplyTo;
+    ReviewInput rin = new ReviewInput();
+    rin.comments = new HashMap<>();
+    rin.comments.put(PushOneCommit.FILE_NAME, ImmutableList.of(in));
+    rin.drafts = ReviewInput.DraftHandling.KEEP;
+    AcceptanceTestRequestScope.Context old = setApiUser(account);
+    try {
+      gApi.changes().id(id.get()).current().review(rin);
+    } finally {
+      atrScope.set(old);
+    }
+  }
+
+  private void publishDrafts(TestAccount account, Change.Id id) throws Exception {
+    ReviewInput rin = new ReviewInput();
+    rin.drafts = ReviewInput.DraftHandling.PUBLISH_ALL_REVISIONS;
+    AcceptanceTestRequestScope.Context old = setApiUser(account);
+    try {
+      gApi.changes().id(id.get()).current().review(rin);
+    } finally {
+      atrScope.set(old);
+    }
+  }
+
+  private ChangeMessage insertMessage(
+      Change.Id id, PatchSet.Id psId, Account.Id author, Timestamp ts, String message)
+      throws Exception {
+    ChangeMessage msg =
+        new ChangeMessage(new ChangeMessage.Key(id, ChangeUtil.messageUuid()), author, ts, psId);
+    msg.setMessage(message);
+    db.changeMessages().insert(Collections.singleton(msg));
+
+    Change c = db.changes().get(id);
+    if (ts.compareTo(c.getLastUpdatedOn()) > 0) {
+      c.setLastUpdatedOn(ts);
+      db.changes().update(Collections.singleton(c));
+    }
+
+    return msg;
+  }
+
+  private ReviewDb getUnwrappedDb() {
+    ReviewDb db = dbProvider.get();
+    return ReviewDbUtil.unwrapDb(db);
+  }
+
+  private void allowRunAs() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(allProjects)) {
+      Util.allow(
+          u.getConfig(),
+          GlobalCapability.RUN_AS,
+          systemGroupBackend.getGroup(REGISTERED_USERS).getUUID());
+      u.save();
+    }
+  }
+
+  private void removeRunAs() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(allProjects)) {
+      Util.remove(
+          u.getConfig(),
+          GlobalCapability.RUN_AS,
+          systemGroupBackend.getGroup(REGISTERED_USERS).getUUID());
+      u.save();
+    }
+  }
+
+  private Map<String, List<CommentInfo>> getPublishedComments(Change.Id id) throws Exception {
+    return gApi.changes().id(id.get()).current().comments();
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/server/notedb/NoteDbOnlyIT.java b/javatests/com/google/gerrit/acceptance/server/notedb/NoteDbOnlyIT.java
new file mode 100644
index 0000000..f4cedbb
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/server/notedb/NoteDbOnlyIT.java
@@ -0,0 +1,323 @@
+// Copyright (C) 2017 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.google.gerrit.acceptance.server.notedb;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth8.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static com.google.gerrit.extensions.client.ListChangesOption.MESSAGES;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Streams;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.update.BatchUpdateListener;
+import com.google.gerrit.server.update.BatchUpdateOp;
+import com.google.gerrit.server.update.ChangeContext;
+import com.google.gerrit.server.update.RepoContext;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.Callable;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevSort;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.junit.Before;
+import org.junit.Test;
+
+public class NoteDbOnlyIT extends AbstractDaemonTest {
+  @ConfigSuite.Default
+  public static Config defaultConfig() {
+    Config cfg = new Config();
+    // Avoid spurious timeouts during intentional retries due to overloaded test machines.
+    cfg.setString("retry", null, "timeout", Integer.MAX_VALUE + "s");
+    return cfg;
+  }
+
+  @Inject private RetryHelper retryHelper;
+
+  @Before
+  public void setUp() throws Exception {
+    assume().that(notesMigration.disableChangeReviewDb()).isTrue();
+  }
+
+  @Test
+  public void updateChangeFailureRollsBackRefUpdate() throws Exception {
+    assume().that(notesMigration.disableChangeReviewDb()).isTrue();
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getChange().getId();
+
+    String master = "refs/heads/master";
+    String backup = "refs/backup/master";
+    ObjectId master1 = getRef(master).get();
+    assertThat(getRef(backup)).isEmpty();
+
+    // Toy op that copies the value of refs/heads/master to refs/backup/master.
+    BatchUpdateOp backupMasterOp =
+        new BatchUpdateOp() {
+          ObjectId newId;
+
+          @Override
+          public void updateRepo(RepoContext ctx) throws IOException {
+            ObjectId oldId = ctx.getRepoView().getRef(backup).orElse(ObjectId.zeroId());
+            newId = ctx.getRepoView().getRef(master).get();
+            ctx.addRefUpdate(oldId, newId, backup);
+          }
+
+          @Override
+          public boolean updateChange(ChangeContext ctx) {
+            ctx.getUpdate(ctx.getChange().currentPatchSetId())
+                .setChangeMessage("Backed up master branch to " + newId.name());
+            return true;
+          }
+        };
+
+    try (BatchUpdate bu = newBatchUpdate(batchUpdateFactory)) {
+      bu.addOp(id, backupMasterOp);
+      bu.execute();
+    }
+
+    // Ensure backupMasterOp worked.
+    assertThat(getRef(backup)).hasValue(master1);
+    assertThat(getMessages(id)).contains("Backed up master branch to " + master1.name());
+
+    // Advance master by submitting the change.
+    gApi.changes().id(id.get()).current().review(ReviewInput.approve());
+    gApi.changes().id(id.get()).current().submit();
+    ObjectId master2 = getRef(master).get();
+    assertThat(master2).isNotEqualTo(master1);
+    int msgCount = getMessages(id).size();
+
+    try (BatchUpdate bu = newBatchUpdate(batchUpdateFactory)) {
+      // This time, we attempt to back up master, but we fail during updateChange.
+      bu.addOp(id, backupMasterOp);
+      String msg = "Change is bad";
+      bu.addOp(
+          id,
+          new BatchUpdateOp() {
+            @Override
+            public boolean updateChange(ChangeContext ctx) throws ResourceConflictException {
+              throw new ResourceConflictException(msg);
+            }
+          });
+      try {
+        bu.execute();
+        fail("expected ResourceConflictException");
+      } catch (ResourceConflictException e) {
+        assertThat(e).hasMessageThat().isEqualTo(msg);
+      }
+    }
+
+    // If updateChange hadn't failed, backup would have been updated to master2.
+    assertThat(getRef(backup)).hasValue(master1);
+    assertThat(getMessages(id)).hasSize(msgCount);
+  }
+
+  @Test
+  public void retryOnLockFailureWithAtomicUpdates() throws Exception {
+    assume().that(notesMigration.disableChangeReviewDb()).isTrue();
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getChange().getId();
+    String master = "refs/heads/master";
+    ObjectId initial;
+    try (Repository repo = repoManager.openRepository(project)) {
+      ensureAtomicTransactions(repo);
+      initial = repo.exactRef(master).getObjectId();
+    }
+
+    AtomicInteger updateRepoCalledCount = new AtomicInteger();
+    AtomicInteger updateChangeCalledCount = new AtomicInteger();
+    AtomicInteger afterUpdateReposCalledCount = new AtomicInteger();
+
+    String result =
+        retryHelper.execute(
+            batchUpdateFactory -> {
+              try (BatchUpdate bu = newBatchUpdate(batchUpdateFactory)) {
+                bu.addOp(
+                    id,
+                    new UpdateRefAndAddMessageOp(updateRepoCalledCount, updateChangeCalledCount));
+                bu.execute(new ConcurrentWritingListener(afterUpdateReposCalledCount));
+              }
+              return "Done";
+            });
+
+    assertThat(result).isEqualTo("Done");
+    assertThat(updateRepoCalledCount.get()).isEqualTo(2);
+    assertThat(afterUpdateReposCalledCount.get()).isEqualTo(2);
+    assertThat(updateChangeCalledCount.get()).isEqualTo(2);
+
+    List<String> messages = getMessages(id);
+    assertThat(Iterables.getLast(messages)).isEqualTo(UpdateRefAndAddMessageOp.CHANGE_MESSAGE);
+    assertThat(Collections.frequency(messages, UpdateRefAndAddMessageOp.CHANGE_MESSAGE))
+        .isEqualTo(1);
+
+    try (Repository repo = repoManager.openRepository(project)) {
+      // Op lost the race, so the other writer's commit happened first. Then op retried and wrote
+      // its commit with the other writer's commit as parent.
+      assertThat(commitMessages(repo, initial, repo.exactRef(master).getObjectId()))
+          .containsExactly(
+              ConcurrentWritingListener.MSG_PREFIX + "1", UpdateRefAndAddMessageOp.COMMIT_MESSAGE)
+          .inOrder();
+    }
+  }
+
+  @Test
+  public void missingChange() throws Exception {
+    Change.Id changeId = new Change.Id(1234567);
+    assertNoSuchChangeException(() -> notesFactory.create(db, project, changeId));
+    assertNoSuchChangeException(() -> notesFactory.createChecked(db, project, changeId));
+  }
+
+  private void assertNoSuchChangeException(Callable<?> callable) throws Exception {
+    try {
+      callable.call();
+      fail("expected NoSuchChangeException");
+    } catch (NoSuchChangeException e) {
+      // Expected.
+    }
+  }
+
+  private class ConcurrentWritingListener implements BatchUpdateListener {
+    static final String MSG_PREFIX = "Other writer ";
+
+    private final AtomicInteger calledCount;
+
+    private ConcurrentWritingListener(AtomicInteger calledCount) {
+      this.calledCount = calledCount;
+    }
+
+    @Override
+    public void afterUpdateRepos() throws Exception {
+      // Reopen repo and update ref, to simulate a concurrent write in another
+      // thread. Only do this the first time the listener is called.
+      if (calledCount.getAndIncrement() > 0) {
+        return;
+      }
+      try (Repository repo = repoManager.openRepository(project);
+          RevWalk rw = new RevWalk(repo);
+          ObjectInserter ins = repo.newObjectInserter()) {
+        String master = "refs/heads/master";
+        ObjectId oldId = repo.exactRef(master).getObjectId();
+        ObjectId newId = newCommit(rw, ins, oldId, MSG_PREFIX + calledCount.get());
+        ins.flush();
+        RefUpdate ru = repo.updateRef(master);
+        ru.setExpectedOldObjectId(oldId);
+        ru.setNewObjectId(newId);
+        assertThat(ru.update(rw)).isEqualTo(RefUpdate.Result.FAST_FORWARD);
+      }
+    }
+  }
+
+  private class UpdateRefAndAddMessageOp implements BatchUpdateOp {
+    static final String COMMIT_MESSAGE = "A commit";
+    static final String CHANGE_MESSAGE = "A change message";
+
+    private final AtomicInteger updateRepoCalledCount;
+    private final AtomicInteger updateChangeCalledCount;
+
+    private UpdateRefAndAddMessageOp(
+        AtomicInteger updateRepoCalledCount, AtomicInteger updateChangeCalledCount) {
+      this.updateRepoCalledCount = updateRepoCalledCount;
+      this.updateChangeCalledCount = updateChangeCalledCount;
+    }
+
+    @Override
+    public void updateRepo(RepoContext ctx) throws Exception {
+      String master = "refs/heads/master";
+      ObjectId oldId = ctx.getRepoView().getRef(master).get();
+      ObjectId newId = newCommit(ctx.getRevWalk(), ctx.getInserter(), oldId, COMMIT_MESSAGE);
+      ctx.addRefUpdate(oldId, newId, master);
+      updateRepoCalledCount.incrementAndGet();
+    }
+
+    @Override
+    public boolean updateChange(ChangeContext ctx) throws Exception {
+      ctx.getUpdate(ctx.getChange().currentPatchSetId()).setChangeMessage(CHANGE_MESSAGE);
+      updateChangeCalledCount.incrementAndGet();
+      return true;
+    }
+  }
+
+  private ObjectId newCommit(RevWalk rw, ObjectInserter ins, ObjectId parent, String msg)
+      throws IOException {
+    PersonIdent ident = serverIdent.get();
+    CommitBuilder cb = new CommitBuilder();
+    cb.setParentId(parent);
+    cb.setTreeId(rw.parseCommit(parent).getTree());
+    cb.setMessage(msg);
+    cb.setAuthor(ident);
+    cb.setCommitter(ident);
+    return ins.insert(Constants.OBJ_COMMIT, cb.build());
+  }
+
+  private BatchUpdate newBatchUpdate(BatchUpdate.Factory buf) {
+    return buf.create(db, project, identifiedUserFactory.create(user.getId()), TimeUtil.nowTs());
+  }
+
+  private Optional<ObjectId> getRef(String name) throws Exception {
+    try (Repository repo = repoManager.openRepository(project)) {
+      return Optional.ofNullable(repo.exactRef(name)).map(Ref::getObjectId);
+    }
+  }
+
+  private List<String> getMessages(Change.Id id) throws Exception {
+    return gApi.changes().id(id.get()).get(MESSAGES).messages.stream()
+        .map(m -> m.message)
+        .collect(toList());
+  }
+
+  private static List<String> commitMessages(
+      Repository repo, ObjectId fromExclusive, ObjectId toInclusive) throws Exception {
+    try (RevWalk rw = new RevWalk(repo)) {
+      rw.markStart(rw.parseCommit(toInclusive));
+      rw.markUninteresting(rw.parseCommit(fromExclusive));
+      rw.sort(RevSort.REVERSE);
+      rw.setRetainBody(true);
+      return Streams.stream(rw).map(RevCommit::getShortMessage).collect(toList());
+    }
+  }
+
+  private void ensureAtomicTransactions(Repository repo) throws Exception {
+    if (repo instanceof InMemoryRepository) {
+      ((InMemoryRepository) repo).setPerformsAtomicTransactions(true);
+    } else {
+      assertThat(repo.getRefDatabase().performsAtomicTransactions())
+          .named("performsAtomicTransactions on %s", repo)
+          .isTrue();
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/server/notedb/NoteDbPrimaryIT.java b/javatests/com/google/gerrit/acceptance/server/notedb/NoteDbPrimaryIT.java
new file mode 100644
index 0000000..486a0de
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/server/notedb/NoteDbPrimaryIT.java
@@ -0,0 +1,518 @@
+// 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.
+
+package com.google.gerrit.acceptance.server.notedb;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth8.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage.REVIEW_DB;
+import static com.google.gerrit.server.notedb.NoteDbUtil.formatTime;
+import static java.util.concurrent.TimeUnit.DAYS;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static java.util.stream.Collectors.toList;
+
+import com.github.rholder.retry.Retryer;
+import com.github.rholder.retry.RetryerBuilder;
+import com.github.rholder.retry.StopStrategies;
+import com.google.common.base.Throwables;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.api.changes.DraftInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput.CommentInput;
+import com.google.gerrit.extensions.client.ChangeStatus;
+import com.google.gerrit.extensions.common.ApprovalInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDbUtil;
+import com.google.gerrit.server.ChangeMessagesUtil;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.InternalUser;
+import com.google.gerrit.server.git.RepoRefCache;
+import com.google.gerrit.server.notedb.ChangeBundle;
+import com.google.gerrit.server.notedb.ChangeBundleReader;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.server.notedb.NoteDbChangeState;
+import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
+import com.google.gerrit.server.notedb.PrimaryStorageMigrator;
+import com.google.gerrit.server.notedb.TestChangeRebuilderWrapper;
+import com.google.gerrit.server.update.RetryHelper;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.gerrit.testing.NoteDbMode;
+import com.google.gerrit.testing.TestTimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.OrmRuntimeException;
+import com.google.inject.Inject;
+import com.google.inject.util.Providers;
+import java.sql.Timestamp;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+@NoHttpd
+public class NoteDbPrimaryIT extends AbstractDaemonTest {
+  @ConfigSuite.Default
+  public static Config defaultConfig() {
+    Config cfg = new Config();
+    cfg.setString("notedb", null, "concurrentWriterTimeout", "0s");
+    cfg.setString("notedb", null, "primaryStorageMigrationTimeout", "1d");
+    cfg.setBoolean("noteDb", null, "testRebuilderWrapper", true);
+    return cfg;
+  }
+
+  @Inject private ChangeBundleReader bundleReader;
+  @Inject private CommentsUtil commentsUtil;
+  @Inject private TestChangeRebuilderWrapper rebuilderWrapper;
+  @Inject private ChangeNotes.Factory changeNotesFactory;
+  @Inject private ChangeUpdate.Factory updateFactory;
+  @Inject private InternalUser.Factory internalUserFactory;
+  @Inject private RetryHelper retryHelper;
+
+  private PrimaryStorageMigrator migrator;
+
+  @Before
+  public void setUp() throws Exception {
+    assume().that(NoteDbMode.get()).isEqualTo(NoteDbMode.READ_WRITE);
+    db = ReviewDbUtil.unwrapDb(db);
+    TestTimeUtil.resetWithClockStep(1, SECONDS);
+    migrator = newMigrator(null);
+  }
+
+  private PrimaryStorageMigrator newMigrator(
+      @Nullable Retryer<NoteDbChangeState> ensureRebuiltRetryer) {
+    return new PrimaryStorageMigrator(
+        cfg,
+        Providers.of(db),
+        repoManager,
+        allUsers,
+        rebuilderWrapper,
+        ensureRebuiltRetryer,
+        changeNotesFactory,
+        queryProvider,
+        updateFactory,
+        internalUserFactory,
+        retryHelper);
+  }
+
+  @After
+  public void tearDown() {
+    TestTimeUtil.useSystemTime();
+  }
+
+  @Test
+  public void updateChange() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getChange().getId();
+    setNoteDbPrimary(id);
+
+    gApi.changes().id(id.get()).current().review(ReviewInput.approve());
+    gApi.changes().id(id.get()).current().submit();
+
+    ChangeInfo info = gApi.changes().id(id.get()).get();
+    assertThat(info.status).isEqualTo(ChangeStatus.MERGED);
+    ApprovalInfo approval = Iterables.getOnlyElement(info.labels.get("Code-Review").all);
+    assertThat(approval._accountId).isEqualTo(admin.id.get());
+    assertThat(approval.value).isEqualTo(2);
+    assertThat(info.messages).hasSize(3);
+    assertThat(Iterables.getLast(info.messages).message)
+        .isEqualTo("Change has been successfully merged by " + admin.fullName);
+
+    ChangeNotes notes = notesFactory.create(db, project, id);
+    assertThat(notes.getChange().getStatus()).isEqualTo(Change.Status.MERGED);
+    assertThat(notes.getChange().getNoteDbState())
+        .isEqualTo(NoteDbChangeState.NOTE_DB_PRIMARY_STATE);
+
+    // Writes weren't reflected in ReviewDb.
+    assertThat(db.changes().get(id).getStatus()).isEqualTo(Change.Status.NEW);
+    assertThat(db.patchSetApprovals().byChange(id)).isEmpty();
+    assertThat(db.changeMessages().byChange(id)).hasSize(1);
+  }
+
+  @Test
+  public void deleteDraftComment() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getChange().getId();
+    setNoteDbPrimary(id);
+
+    DraftInput din = new DraftInput();
+    din.path = PushOneCommit.FILE_NAME;
+    din.line = 1;
+    din.message = "A comment";
+    gApi.changes().id(id.get()).current().createDraft(din);
+
+    CommentInfo di =
+        Iterables.getOnlyElement(
+            gApi.changes().id(id.get()).current().drafts().get(PushOneCommit.FILE_NAME));
+    assertThat(di.message).isEqualTo(din.message);
+
+    assertThat(db.patchComments().draftByChangeFileAuthor(id, din.path, admin.id)).isEmpty();
+
+    gApi.changes().id(id.get()).current().draft(di.id).delete();
+    assertThat(gApi.changes().id(id.get()).current().drafts()).isEmpty();
+  }
+
+  @Test
+  public void deleteVote() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getChange().getId();
+    setNoteDbPrimary(id);
+
+    gApi.changes().id(id.get()).current().review(ReviewInput.approve());
+    List<ApprovalInfo> approvals = gApi.changes().id(id.get()).get().labels.get("Code-Review").all;
+    assertThat(approvals).hasSize(1);
+    assertThat(approvals.get(0).value).isEqualTo(2);
+
+    gApi.changes().id(id.get()).reviewer(admin.id.toString()).deleteVote("Code-Review");
+
+    approvals = gApi.changes().id(id.get()).get().labels.get("Code-Review").all;
+    assertThat(approvals).hasSize(1);
+    assertThat(approvals.get(0).value).isEqualTo(0);
+  }
+
+  @Test
+  public void deleteVoteViaReview() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getChange().getId();
+    setNoteDbPrimary(id);
+
+    gApi.changes().id(id.get()).current().review(ReviewInput.approve());
+    List<ApprovalInfo> approvals = gApi.changes().id(id.get()).get().labels.get("Code-Review").all;
+    assertThat(approvals).hasSize(1);
+    assertThat(approvals.get(0).value).isEqualTo(2);
+
+    gApi.changes().id(id.get()).current().review(ReviewInput.noScore());
+
+    approvals = gApi.changes().id(id.get()).get().labels.get("Code-Review").all;
+    assertThat(approvals).hasSize(1);
+    assertThat(approvals.get(0).value).isEqualTo(0);
+  }
+
+  @Test
+  public void deleteReviewer() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getChange().getId();
+    setNoteDbPrimary(id);
+
+    gApi.changes().id(id.get()).addReviewer(user.id.toString());
+    assertThat(getReviewers(id)).containsExactly(user.id);
+    gApi.changes().id(id.get()).reviewer(user.id.toString()).remove();
+    assertThat(getReviewers(id)).isEmpty();
+  }
+
+  @Test
+  public void readOnlyReviewDb() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getChange().getId();
+    testReadOnly(id);
+  }
+
+  @Test
+  public void readOnlyNoteDb() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getChange().getId();
+    setNoteDbPrimary(id);
+    testReadOnly(id);
+  }
+
+  private void testReadOnly(Change.Id id) throws Exception {
+    Timestamp before = TimeUtil.nowTs();
+    Timestamp until = new Timestamp(before.getTime() + 1000 * 3600);
+
+    // Set read-only.
+    Change c = db.changes().get(id);
+    assertThat(c).named("change " + id).isNotNull();
+    NoteDbChangeState state = NoteDbChangeState.parse(c);
+    state = state.withReadOnlyUntil(until);
+    c.setNoteDbState(state.toString());
+    db.changes().update(Collections.singleton(c));
+
+    assertThat(gApi.changes().id(id.get()).get().subject).isEqualTo(PushOneCommit.SUBJECT);
+    assertThat(gApi.changes().id(id.get()).get().topic).isNull();
+    try {
+      gApi.changes().id(id.get()).topic("a-topic");
+      fail("expected read-only exception");
+    } catch (RestApiException e) {
+      Optional<Throwable> oe =
+          Throwables.getCausalChain(e).stream()
+              .filter(x -> x instanceof OrmRuntimeException)
+              .findFirst();
+      assertThat(oe).named("OrmRuntimeException in causal chain of " + e).isPresent();
+      assertThat(oe.get().getMessage()).contains("read-only");
+    }
+    assertThat(gApi.changes().id(id.get()).get().topic).isNull();
+
+    TestTimeUtil.setClock(new Timestamp(until.getTime() + 1000));
+    assertThat(gApi.changes().id(id.get()).get().subject).isEqualTo(PushOneCommit.SUBJECT);
+    gApi.changes().id(id.get()).topic("a-topic");
+    assertThat(gApi.changes().id(id.get()).get().topic).isEqualTo("a-topic");
+  }
+
+  @Test
+  public void migrateToNoteDb() throws Exception {
+    testMigrateToNoteDb(createChange().getChange().getId());
+  }
+
+  @Test
+  public void migrateToNoteDbWithRebuildingFirst() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getChange().getId();
+
+    Change c = db.changes().get(id);
+    c.setNoteDbState("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef");
+    db.changes().update(Collections.singleton(c));
+    testMigrateToNoteDb(id);
+  }
+
+  private void testMigrateToNoteDb(Change.Id id) throws Exception {
+    assertThat(PrimaryStorage.of(db.changes().get(id))).isEqualTo(PrimaryStorage.REVIEW_DB);
+    migrator.migrateToNoteDbPrimary(id);
+    assertNoteDbPrimary(id);
+
+    gApi.changes().id(id.get()).topic("a-topic");
+    assertThat(gApi.changes().id(id.get()).get().topic).isEqualTo("a-topic");
+    assertThat(db.changes().get(id).getTopic()).isNull();
+  }
+
+  @Test
+  public void migrateToNoteDbFailsRebuildingOnceAndRetries() throws Exception {
+    Change.Id id = createChange().getChange().getId();
+
+    Change c = db.changes().get(id);
+    c.setNoteDbState("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef");
+    db.changes().update(Collections.singleton(c));
+    rebuilderWrapper.failNextUpdate();
+
+    migrator =
+        newMigrator(
+            RetryerBuilder.<NoteDbChangeState>newBuilder()
+                .retryIfException()
+                .withStopStrategy(StopStrategies.neverStop())
+                .build());
+    migrator.migrateToNoteDbPrimary(id);
+    assertNoteDbPrimary(id);
+  }
+
+  @Test
+  public void migrateToNoteDbFailsRebuildingAndStops() throws Exception {
+    Change.Id id = createChange().getChange().getId();
+
+    Change c = db.changes().get(id);
+    c.setNoteDbState("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef");
+    db.changes().update(Collections.singleton(c));
+    rebuilderWrapper.failNextUpdate();
+
+    migrator =
+        newMigrator(
+            RetryerBuilder.<NoteDbChangeState>newBuilder()
+                .retryIfException()
+                .withStopStrategy(StopStrategies.stopAfterAttempt(1))
+                .build());
+    exception.expect(OrmException.class);
+    exception.expectMessage("Retrying failed");
+    migrator.migrateToNoteDbPrimary(id);
+  }
+
+  @Test
+  public void migrateToNoteDbMissingOldState() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getChange().getId();
+
+    Change c = db.changes().get(id);
+    c.setNoteDbState(null);
+    db.changes().update(Collections.singleton(c));
+
+    exception.expect(PrimaryStorageMigrator.NoNoteDbStateException.class);
+    exception.expectMessage("no note_db_state");
+    migrator.migrateToNoteDbPrimary(id);
+  }
+
+  @Test
+  public void migrateToNoteDbLeaseExpires() throws Exception {
+    TestTimeUtil.resetWithClockStep(2, DAYS);
+    exception.expect(OrmRuntimeException.class);
+    exception.expectMessage("read-only lease");
+    migrator.migrateToNoteDbPrimary(createChange().getChange().getId());
+  }
+
+  @Test
+  public void migrateToNoteDbAlreadyReadOnly() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getChange().getId();
+
+    Change c = db.changes().get(id);
+    NoteDbChangeState state = NoteDbChangeState.parse(c);
+    Timestamp until = new Timestamp(TimeUtil.nowMs() + MILLISECONDS.convert(1, DAYS));
+    state = state.withReadOnlyUntil(until);
+    c.setNoteDbState(state.toString());
+    db.changes().update(Collections.singleton(c));
+
+    exception.expect(OrmRuntimeException.class);
+    exception.expectMessage("read-only until " + until);
+    migrator.migrateToNoteDbPrimary(id);
+  }
+
+  @Test
+  public void migrateToNoteDbAlreadyMigrated() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getChange().getId();
+
+    assertThat(PrimaryStorage.of(db.changes().get(id))).isEqualTo(PrimaryStorage.REVIEW_DB);
+    migrator.migrateToNoteDbPrimary(id);
+    assertNoteDbPrimary(id);
+
+    migrator.migrateToNoteDbPrimary(id);
+    assertNoteDbPrimary(id);
+  }
+
+  @Test
+  public void rebuildReviewDb() throws Exception {
+    Change c = createChange().getChange().change();
+    Change.Id id = c.getId();
+
+    CommentInput cin = new CommentInput();
+    cin.line = 1;
+    cin.message = "Published comment";
+    ReviewInput rin = ReviewInput.approve();
+    rin.comments = ImmutableMap.of(PushOneCommit.FILE_NAME, ImmutableList.of(cin));
+    gApi.changes().id(id.get()).current().review(ReviewInput.approve());
+
+    DraftInput din = new DraftInput();
+    din.path = PushOneCommit.FILE_NAME;
+    din.line = 1;
+    din.message = "Draft comment";
+    gApi.changes().id(id.get()).current().createDraft(din);
+    gApi.changes().id(id.get()).current().review(ReviewInput.approve());
+    gApi.changes().id(id.get()).current().createDraft(din);
+
+    assertThat(db.changeMessages().byChange(id)).isNotEmpty();
+    assertThat(db.patchSets().byChange(id)).isNotEmpty();
+    assertThat(db.patchSetApprovals().byChange(id)).isNotEmpty();
+    assertThat(db.patchComments().byChange(id)).isNotEmpty();
+
+    ChangeBundle noteDbBundle =
+        ChangeBundle.fromNotes(commentsUtil, notesFactory.create(db, project, id));
+
+    setNoteDbPrimary(id);
+
+    db.changeMessages().delete(db.changeMessages().byChange(id));
+    db.patchSets().delete(db.patchSets().byChange(id));
+    db.patchSetApprovals().delete(db.patchSetApprovals().byChange(id));
+    db.patchComments().delete(db.patchComments().byChange(id));
+    ChangeMessage bogusMessage =
+        ChangeMessagesUtil.newMessage(
+            c.currentPatchSetId(),
+            identifiedUserFactory.create(admin.getId()),
+            TimeUtil.nowTs(),
+            "some message",
+            null);
+    db.changeMessages().insert(Collections.singleton(bogusMessage));
+
+    rebuilderWrapper.rebuildReviewDb(db, project, id);
+
+    assertThat(db.changeMessages().byChange(id)).isNotEmpty();
+    assertThat(db.patchSets().byChange(id)).isNotEmpty();
+    assertThat(db.patchSetApprovals().byChange(id)).isNotEmpty();
+    assertThat(db.patchComments().byChange(id)).isNotEmpty();
+
+    ChangeBundle reviewDbBundle = bundleReader.fromReviewDb(ReviewDbUtil.unwrapDb(db), id);
+    assertThat(reviewDbBundle.differencesFrom(noteDbBundle)).isEmpty();
+  }
+
+  @Test
+  public void migrateBackToReviewDbPrimary() throws Exception {
+    Change c = createChange().getChange().change();
+    Change.Id id = c.getId();
+
+    migrator.migrateToNoteDbPrimary(id);
+    assertNoteDbPrimary(id);
+
+    gApi.changes().id(id.get()).topic("new-topic");
+    assertThat(gApi.changes().id(id.get()).topic()).isEqualTo("new-topic");
+    assertThat(db.changes().get(id).getTopic()).isNotEqualTo("new-topic");
+
+    migrator.migrateToReviewDbPrimary(id, null);
+    ObjectId metaId;
+    try (Repository repo = repoManager.openRepository(c.getProject());
+        RevWalk rw = new RevWalk(repo)) {
+      metaId = repo.exactRef(RefNames.changeMetaRef(id)).getObjectId();
+      RevCommit commit = rw.parseCommit(metaId);
+      rw.parseBody(commit);
+      assertThat(commit.getFullMessage())
+          .contains("Read-only-until: " + formatTime(serverIdent.get(), new Timestamp(0)));
+    }
+    NoteDbChangeState state = NoteDbChangeState.parse(db.changes().get(id));
+    assertThat(state.getPrimaryStorage()).isEqualTo(PrimaryStorage.REVIEW_DB);
+    assertThat(state.getChangeMetaId()).isEqualTo(metaId);
+    assertThat(gApi.changes().id(id.get()).topic()).isEqualTo("new-topic");
+    assertThat(db.changes().get(id).getTopic()).isEqualTo("new-topic");
+
+    ChangeNotes notes = notesFactory.create(db, project, id);
+    assertThat(notes.getRevision()).isEqualTo(metaId); // No rebuilding, change was up to date.
+    assertThat(notes.getReadOnlyUntil()).isNotNull();
+
+    gApi.changes().id(id.get()).topic("reviewdb-topic");
+    assertThat(db.changes().get(id).getTopic()).isEqualTo("reviewdb-topic");
+  }
+
+  private void setNoteDbPrimary(Change.Id id) throws Exception {
+    Change c = db.changes().get(id);
+    assertThat(c).named("change " + id).isNotNull();
+    NoteDbChangeState state = NoteDbChangeState.parse(c);
+    assertThat(state.getPrimaryStorage()).named("storage of " + id).isEqualTo(REVIEW_DB);
+
+    try (Repository changeRepo = repoManager.openRepository(c.getProject());
+        Repository allUsersRepo = repoManager.openRepository(allUsers)) {
+      assertThat(state.isUpToDate(new RepoRefCache(changeRepo), new RepoRefCache(allUsersRepo)))
+          .named("change " + id + " up to date")
+          .isTrue();
+    }
+
+    c.setNoteDbState(NoteDbChangeState.NOTE_DB_PRIMARY_STATE);
+    db.changes().update(Collections.singleton(c));
+  }
+
+  private void assertNoteDbPrimary(Change.Id id) throws Exception {
+    assertThat(PrimaryStorage.of(db.changes().get(id))).isEqualTo(PrimaryStorage.NOTE_DB);
+  }
+
+  private List<Account.Id> getReviewers(Change.Id id) throws Exception {
+    return gApi.changes().id(id.get()).get().reviewers.values().stream()
+        .flatMap(Collection::stream)
+        .map(a -> new Account.Id(a._accountId))
+        .collect(toList());
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/server/notedb/OnlineNoteDbMigrationIT.java b/javatests/com/google/gerrit/acceptance/server/notedb/OnlineNoteDbMigrationIT.java
new file mode 100644
index 0000000..c249973
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/server/notedb/OnlineNoteDbMigrationIT.java
@@ -0,0 +1,667 @@
+// Copyright (C) 2017 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.google.gerrit.acceptance.server.notedb;
+
+import static com.google.common.collect.ImmutableSortedSet.toImmutableSortedSet;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth8.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static com.google.gerrit.server.notedb.NoteDbChangeState.NOTE_DB_PRIMARY_STATE;
+import static com.google.gerrit.server.notedb.NotesMigrationState.NOTE_DB;
+import static com.google.gerrit.server.notedb.NotesMigrationState.READ_WRITE_NO_SEQUENCE;
+import static com.google.gerrit.server.notedb.NotesMigrationState.READ_WRITE_WITH_SEQUENCE_NOTE_DB_PRIMARY;
+import static com.google.gerrit.server.notedb.NotesMigrationState.READ_WRITE_WITH_SEQUENCE_REVIEW_DB_PRIMARY;
+import static com.google.gerrit.server.notedb.NotesMigrationState.REVIEW_DB;
+import static com.google.gerrit.server.notedb.NotesMigrationState.WRITE;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Comparator.naturalOrder;
+import static org.easymock.EasyMock.createStrictMock;
+import static org.easymock.EasyMock.expectLastCall;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSortedSet;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.GerritConfig;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.Sandboxed;
+import com.google.gerrit.acceptance.UseLocalDisk;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.Sequences;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.notedb.ChangeBundle;
+import com.google.gerrit.server.notedb.ChangeBundleReader;
+import com.google.gerrit.server.notedb.NoteDbChangeState;
+import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
+import com.google.gerrit.server.notedb.NoteDbChangeState.RefState;
+import com.google.gerrit.server.notedb.NotesMigrationState;
+import com.google.gerrit.server.notedb.rebuild.MigrationException;
+import com.google.gerrit.server.notedb.rebuild.NoteDbMigrator;
+import com.google.gerrit.server.notedb.rebuild.NotesMigrationStateListener;
+import com.google.gerrit.server.schema.ReviewDbFactory;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.gerrit.testing.NoteDbMode;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Stream;
+import org.eclipse.jgit.internal.storage.file.FileRepository;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectLoader;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.storage.file.FileBasedConfig;
+import org.eclipse.jgit.util.FS;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+@Sandboxed
+@UseLocalDisk
+@NoHttpd
+public class OnlineNoteDbMigrationIT extends AbstractDaemonTest {
+  private static final String INVALID_STATE = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef";
+
+  @ConfigSuite.Default
+  public static Config defaultConfig() {
+    Config cfg = new Config();
+    cfg.setInt("noteDb", "changes", "sequenceBatchSize", 10);
+    cfg.setInt("noteDb", "changes", "initialSequenceGap", 500);
+    return cfg;
+  }
+
+  // Tests in this class are generally interested in the actual ReviewDb contents, but the shifting
+  // migration state may result in various kinds of wrappers showing up unexpectedly.
+  @Inject @ReviewDbFactory private SchemaFactory<ReviewDb> schemaFactory;
+
+  @Inject private ChangeBundleReader changeBundleReader;
+  @Inject private CommentsUtil commentsUtil;
+  @Inject private DynamicSet<NotesMigrationStateListener> listeners;
+  @Inject private Provider<NoteDbMigrator.Builder> migratorBuilderProvider;
+  @Inject private Sequences sequences;
+  @Inject private SitePaths sitePaths;
+
+  private FileBasedConfig noteDbConfig;
+  private List<RegistrationHandle> addedListeners;
+
+  @Before
+  public void setUp() throws Exception {
+    assume().that(NoteDbMode.get()).isEqualTo(NoteDbMode.OFF);
+    // Unlike in the running server, for tests, we don't stack notedb.config on gerrit.config.
+    noteDbConfig = new FileBasedConfig(sitePaths.notedb_config.toFile(), FS.detect());
+    assertNotesMigrationState(REVIEW_DB, false, false);
+    addedListeners = new ArrayList<>();
+  }
+
+  @After
+  public void tearDown() throws Exception {
+    if (addedListeners != null) {
+      addedListeners.forEach(RegistrationHandle::remove);
+      addedListeners = null;
+    }
+  }
+
+  @Test
+  public void preconditionsFail() throws Exception {
+    List<Change.Id> cs = ImmutableList.of(new Change.Id(1));
+    List<Project.NameKey> ps = ImmutableList.of(new Project.NameKey("p"));
+    assertMigrationException(
+        "Cannot rebuild without noteDb.changes.write=true", b -> b, NoteDbMigrator::rebuild);
+    assertMigrationException(
+        "Cannot combine changes, projects and skipProjects",
+        b -> b.setChanges(cs).setProjects(ps),
+        m -> {});
+    assertMigrationException(
+        "Cannot combine changes, projects and skipProjects",
+        b -> b.setChanges(cs).setSkipProjects(ps),
+        m -> {});
+    assertMigrationException(
+        "Cannot combine changes, projects and skipProjects",
+        b -> b.setProjects(ps).setSkipProjects(ps),
+        m -> {});
+    assertMigrationException(
+        "Cannot set changes or projects or skipProjects during full migration",
+        b -> b.setChanges(cs),
+        NoteDbMigrator::migrate);
+    assertMigrationException(
+        "Cannot set changes or projects or skipProjects during full migration",
+        b -> b.setProjects(ps),
+        NoteDbMigrator::migrate);
+    assertMigrationException(
+        "Cannot set changes or projects or skipProjects during full migration",
+        b -> b.setSkipProjects(ps),
+        NoteDbMigrator::migrate);
+
+    setNotesMigrationState(READ_WRITE_WITH_SEQUENCE_REVIEW_DB_PRIMARY);
+    assertMigrationException(
+        "Migration has already progressed past the endpoint of the \"trial mode\" state",
+        b -> b.setTrialMode(true),
+        NoteDbMigrator::migrate);
+
+    setNotesMigrationState(READ_WRITE_WITH_SEQUENCE_NOTE_DB_PRIMARY);
+    assertMigrationException(
+        "Cannot force rebuild changes; NoteDb is already the primary storage for some changes",
+        b -> b.setForceRebuild(true),
+        NoteDbMigrator::migrate);
+  }
+
+  @Test
+  @GerritConfig(name = "noteDb.changes.initialSequenceGap", value = "-7")
+  public void initialSequenceGapMustBeNonNegative() throws Exception {
+    setNotesMigrationState(READ_WRITE_NO_SEQUENCE);
+    assertMigrationException("Sequence gap must be non-negative: -7", b -> b, m -> {});
+  }
+
+  @Test
+  public void rebuildOneChangeTrialModeAndForceRebuild() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getChange().getId();
+
+    migrate(b -> b.setTrialMode(true));
+    assertNotesMigrationState(READ_WRITE_NO_SEQUENCE, false, true);
+
+    ObjectId oldMetaId;
+    try (Repository repo = repoManager.openRepository(project);
+        ReviewDb db = schemaFactory.open()) {
+      Ref ref = repo.exactRef(RefNames.changeMetaRef(id));
+      assertThat(ref).isNotNull();
+      oldMetaId = ref.getObjectId();
+
+      Change c = db.changes().get(id);
+      assertThat(c).isNotNull();
+      NoteDbChangeState state = NoteDbChangeState.parse(c);
+      assertThat(state).isNotNull();
+      assertThat(state.getPrimaryStorage()).isEqualTo(PrimaryStorage.REVIEW_DB);
+      assertThat(state.getRefState()).hasValue(RefState.create(oldMetaId, ImmutableMap.of()));
+
+      // Force change to be out of date, and change topic so it will get rebuilt as something other
+      // than oldMetaId.
+      c.setNoteDbState(INVALID_STATE);
+      c.setTopic(name("a-new-topic"));
+      db.changes().update(ImmutableList.of(c));
+    }
+
+    migrate(b -> b.setTrialMode(true));
+    assertNotesMigrationState(READ_WRITE_NO_SEQUENCE, false, true);
+
+    try (Repository repo = repoManager.openRepository(project);
+        ReviewDb db = schemaFactory.open()) {
+      // Change is out of date, but was not rebuilt without forceRebuild.
+      assertThat(repo.exactRef(RefNames.changeMetaRef(id)).getObjectId()).isEqualTo(oldMetaId);
+      Change c = db.changes().get(id);
+      assertThat(c.getNoteDbState()).isEqualTo(INVALID_STATE);
+    }
+
+    migrate(b -> b.setTrialMode(true).setForceRebuild(true));
+    assertNotesMigrationState(READ_WRITE_NO_SEQUENCE, false, true);
+
+    try (Repository repo = repoManager.openRepository(project);
+        ReviewDb db = schemaFactory.open()) {
+      Ref ref = repo.exactRef(RefNames.changeMetaRef(id));
+      assertThat(ref).isNotNull();
+      ObjectId newMetaId = ref.getObjectId();
+      assertThat(newMetaId).isNotEqualTo(oldMetaId);
+
+      NoteDbChangeState state = NoteDbChangeState.parse(db.changes().get(id));
+      assertThat(state).isNotNull();
+      assertThat(state.getPrimaryStorage()).isEqualTo(PrimaryStorage.REVIEW_DB);
+      assertThat(state.getRefState()).hasValue(RefState.create(newMetaId, ImmutableMap.of()));
+    }
+  }
+
+  @Test
+  public void autoMigrateTrialMode() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getChange().getId();
+
+    migrate(b -> b.setAutoMigrate(true).setTrialMode(true).setStopAtStateForTesting(WRITE));
+    assertNotesMigrationState(WRITE, true, true);
+
+    migrate(b -> b);
+    // autoMigrate is still enabled so that we can continue the migration by only unsetting trial.
+    assertNotesMigrationState(READ_WRITE_NO_SEQUENCE, true, true);
+
+    ObjectId metaId;
+    try (Repository repo = repoManager.openRepository(project);
+        ReviewDb db = schemaFactory.open()) {
+      Ref ref = repo.exactRef(RefNames.changeMetaRef(id));
+      assertThat(ref).isNotNull();
+      metaId = ref.getObjectId();
+      NoteDbChangeState state = NoteDbChangeState.parse(db.changes().get(id));
+      assertThat(state).isNotNull();
+      assertThat(state.getPrimaryStorage()).isEqualTo(PrimaryStorage.REVIEW_DB);
+      assertThat(state.getRefState()).hasValue(RefState.create(metaId, ImmutableMap.of()));
+    }
+
+    // Unset trial mode and the next migration runs to completion.
+    noteDbConfig.load();
+    NoteDbMigrator.setTrialMode(noteDbConfig, false);
+    noteDbConfig.save();
+
+    migrate(b -> b);
+    assertNotesMigrationState(NOTE_DB, false, false);
+
+    try (Repository repo = repoManager.openRepository(project);
+        ReviewDb db = schemaFactory.open()) {
+      Ref ref = repo.exactRef(RefNames.changeMetaRef(id));
+      assertThat(ref).isNotNull();
+      assertThat(ref.getObjectId()).isEqualTo(metaId);
+      NoteDbChangeState state = NoteDbChangeState.parse(db.changes().get(id));
+      assertThat(state).isNotNull();
+      assertThat(state.getPrimaryStorage()).isEqualTo(PrimaryStorage.NOTE_DB);
+    }
+  }
+
+  @Test
+  public void rebuildSubsetOfChanges() throws Exception {
+    setNotesMigrationState(WRITE);
+
+    PushOneCommit.Result r1 = createChange();
+    PushOneCommit.Result r2 = createChange();
+    Change.Id id1 = r1.getChange().getId();
+    Change.Id id2 = r2.getChange().getId();
+
+    invalidateNoteDbState(id1, id2);
+    migrate(b -> b.setChanges(ImmutableList.of(id2)), NoteDbMigrator::rebuild);
+    assertNotRebuilt(id1);
+    assertRebuilt(id2);
+  }
+
+  @Test
+  public void rebuildSubsetOfProjects() throws Exception {
+    setNotesMigrationState(WRITE);
+
+    Project.NameKey p2 = createProject("project2");
+    TestRepository<?> tr2 = cloneProject(p2, admin);
+
+    PushOneCommit.Result r1 = createChange();
+    PushOneCommit.Result r2 = pushFactory.create(db, admin.getIdent(), tr2).to("refs/for/master");
+    Change.Id id1 = r1.getChange().getId();
+    Change.Id id2 = r2.getChange().getId();
+
+    invalidateNoteDbState(id1, id2);
+    migrate(b -> b.setProjects(ImmutableList.of(p2)), NoteDbMigrator::rebuild);
+    assertNotRebuilt(id1);
+    assertRebuilt(id2);
+  }
+
+  @Test
+  public void rebuildNonSkippedProjects() throws Exception {
+    setNotesMigrationState(WRITE);
+
+    Project.NameKey p2 = createProject("project2");
+    TestRepository<?> tr2 = cloneProject(p2, admin);
+    Project.NameKey p3 = createProject("project3");
+    TestRepository<?> tr3 = cloneProject(p3, admin);
+
+    PushOneCommit.Result r1 = createChange();
+    PushOneCommit.Result r2 = pushFactory.create(db, admin.getIdent(), tr2).to("refs/for/master");
+    PushOneCommit.Result r3 = pushFactory.create(db, admin.getIdent(), tr3).to("refs/for/master");
+    Change.Id id1 = r1.getChange().getId();
+    Change.Id id2 = r2.getChange().getId();
+    Change.Id id3 = r3.getChange().getId();
+
+    invalidateNoteDbState(id1, id2, id3);
+    migrate(b -> b.setSkipProjects(ImmutableList.of(p3)), NoteDbMigrator::rebuild);
+    assertRebuilt(id1, id2);
+    assertNotRebuilt(id3);
+  }
+
+  private void invalidateNoteDbState(Change.Id... ids) throws OrmException {
+    List<Change> list = new ArrayList<>(ids.length);
+    try (ReviewDb db = schemaFactory.open()) {
+      for (Change.Id id : ids) {
+        Change c = db.changes().get(id);
+        c.setNoteDbState(INVALID_STATE);
+        list.add(c);
+      }
+      db.changes().update(list);
+    }
+  }
+
+  private void assertRebuilt(Change.Id... ids) throws OrmException {
+    try (ReviewDb db = schemaFactory.open()) {
+      for (Change.Id id : ids) {
+        NoteDbChangeState s = NoteDbChangeState.parse(db.changes().get(id));
+        assertThat(s.getChangeMetaId().name()).isNotEqualTo(INVALID_STATE);
+      }
+    }
+  }
+
+  private void assertNotRebuilt(Change.Id... ids) throws OrmException {
+    try (ReviewDb db = schemaFactory.open()) {
+      for (Change.Id id : ids) {
+        NoteDbChangeState s = NoteDbChangeState.parse(db.changes().get(id));
+        assertThat(s.getChangeMetaId().name()).isEqualTo(INVALID_STATE);
+      }
+    }
+  }
+
+  @Test
+  public void enableSequencesNoGap() throws Exception {
+    testEnableSequences(0, 3, "13");
+  }
+
+  @Test
+  public void enableSequencesWithGap() throws Exception {
+    testEnableSequences(-1, 502, "512");
+  }
+
+  private void testEnableSequences(int builderOption, int expectedFirstId, String expectedRefValue)
+      throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getChange().getId();
+    assertThat(id.get()).isEqualTo(1);
+
+    migrate(
+        b ->
+            b.setSequenceGap(builderOption)
+                .setStopAtStateForTesting(READ_WRITE_WITH_SEQUENCE_REVIEW_DB_PRIMARY));
+
+    assertThat(sequences.nextChangeId()).isEqualTo(expectedFirstId);
+    assertThat(sequences.nextChangeId()).isEqualTo(expectedFirstId + 1);
+
+    try (Repository repo = repoManager.openRepository(allProjects);
+        ObjectReader reader = repo.newObjectReader()) {
+      Ref ref = repo.exactRef("refs/sequences/changes");
+      assertThat(ref).isNotNull();
+      ObjectLoader loader = reader.open(ref.getObjectId());
+      assertThat(loader.getType()).isEqualTo(Constants.OBJ_BLOB);
+      // Acquired a block of 10 to serve the first nextChangeId call after migration.
+      assertThat(new String(loader.getCachedBytes(), UTF_8)).isEqualTo(expectedRefValue);
+    }
+
+    try (ReviewDb db = schemaFactory.open()) {
+      // Underlying, unused ReviewDb is still on its own sequence.
+      @SuppressWarnings("deprecation")
+      int nextFromReviewDb = db.nextChangeId();
+      assertThat(nextFromReviewDb).isEqualTo(3);
+    }
+  }
+
+  @Test
+  public void fullMigrationSameThread() throws Exception {
+    testFullMigration(1);
+  }
+
+  @Test
+  public void fullMigrationMultipleThreads() throws Exception {
+    testFullMigration(2);
+  }
+
+  private void testFullMigration(int threads) throws Exception {
+    PushOneCommit.Result r1 = createChange();
+    PushOneCommit.Result r2 = createChange();
+    Change.Id id1 = r1.getChange().getId();
+    Change.Id id2 = r2.getChange().getId();
+
+    Set<String> objectFiles = getObjectFiles(project);
+    assertThat(objectFiles).isNotEmpty();
+
+    migrate(b -> b.setThreads(threads));
+
+    assertNotesMigrationState(NOTE_DB, false, false);
+    assertThat(sequences.nextChangeId()).isEqualTo(503);
+    assertThat(getObjectFiles(project)).containsExactlyElementsIn(objectFiles);
+
+    ObjectId oldMetaId = null;
+    int rowVersion = 0;
+    try (ReviewDb db = schemaFactory.open();
+        Repository repo = repoManager.openRepository(project)) {
+      for (Change.Id id : ImmutableList.of(id1, id2)) {
+        String refName = RefNames.changeMetaRef(id);
+        Ref ref = repo.exactRef(refName);
+        assertThat(ref).named(refName).isNotNull();
+
+        Change c = db.changes().get(id);
+        assertThat(c.getTopic()).named("topic of change %s", id).isNull();
+        NoteDbChangeState s = NoteDbChangeState.parse(c);
+        assertThat(s.getPrimaryStorage())
+            .named("primary storage of change %s", id)
+            .isEqualTo(PrimaryStorage.NOTE_DB);
+        assertThat(s.getRefState()).named("ref state of change %s").isEmpty();
+
+        if (id.equals(id1)) {
+          oldMetaId = ref.getObjectId();
+          rowVersion = c.getRowVersion();
+        }
+      }
+    }
+
+    // Do not open a new context, to simulate races with other threads that opened a context earlier
+    // in the migration process; this needs to work.
+    gApi.changes().id(id1.get()).topic(name("a-topic"));
+
+    // Of course, it should also work with a new context.
+    resetCurrentApiUser();
+    gApi.changes().id(id1.get()).topic(name("another-topic"));
+
+    try (ReviewDb db = schemaFactory.open();
+        Repository repo = repoManager.openRepository(project)) {
+      assertThat(repo.exactRef(RefNames.changeMetaRef(id1)).getObjectId()).isNotEqualTo(oldMetaId);
+
+      Change c = db.changes().get(id1);
+      assertThat(c.getTopic()).isNull();
+      assertThat(c.getRowVersion()).isEqualTo(rowVersion);
+    }
+  }
+
+  @Test
+  public void fullMigrationOneChangeWithNoPatchSets() throws Exception {
+    PushOneCommit.Result r1 = createChange();
+    PushOneCommit.Result r2 = createChange();
+    Change.Id id1 = r1.getChange().getId();
+    Change.Id id2 = r2.getChange().getId();
+
+    db.changes().beginTransaction(id2);
+    try {
+      db.patchSets().delete(db.patchSets().byChange(id2));
+      db.commit();
+    } finally {
+      db.rollback();
+    }
+
+    migrate(b -> b);
+    assertNotesMigrationState(NOTE_DB, false, false);
+
+    try (ReviewDb db = schemaFactory.open();
+        Repository repo = repoManager.openRepository(project)) {
+      assertThat(repo.exactRef(RefNames.changeMetaRef(id1))).isNotNull();
+      assertThat(db.changes().get(id1).getNoteDbState()).isEqualTo(NOTE_DB_PRIMARY_STATE);
+
+      // A change with no patch sets is so corrupt that it is completely skipped by the migration
+      // process.
+      assertThat(repo.exactRef(RefNames.changeMetaRef(id2))).isNull();
+      assertThat(db.changes().get(id2).getNoteDbState()).isNull();
+    }
+  }
+
+  @Test
+  public void fullMigrationMissingPatchSetRefs() throws Exception {
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getChange().getId();
+
+    try (Repository repo = repoManager.openRepository(project)) {
+      RefUpdate u = repo.updateRef(new PatchSet.Id(id, 1).toRefName());
+      u.setForceUpdate(true);
+      assertThat(u.delete()).isEqualTo(RefUpdate.Result.FORCED);
+    }
+
+    ChangeBundle reviewDbBundle;
+    try (ReviewDb db = schemaFactory.open()) {
+      reviewDbBundle = changeBundleReader.fromReviewDb(db, id);
+    }
+
+    migrate(b -> b);
+    assertNotesMigrationState(NOTE_DB, false, false);
+
+    try (ReviewDb db = schemaFactory.open();
+        Repository repo = repoManager.openRepository(project)) {
+      // Change migrated successfully even though it was missing patch set refs.
+      assertThat(repo.exactRef(RefNames.changeMetaRef(id))).isNotNull();
+      assertThat(db.changes().get(id).getNoteDbState()).isEqualTo(NOTE_DB_PRIMARY_STATE);
+
+      ChangeBundle noteDbBundle =
+          ChangeBundle.fromNotes(commentsUtil, notesFactory.createChecked(db, project, id));
+      assertThat(noteDbBundle.differencesFrom(reviewDbBundle)).isEmpty();
+    }
+  }
+
+  @Test
+  public void autoMigrationConfig() throws Exception {
+    createChange();
+
+    migrate(b -> b.setStopAtStateForTesting(WRITE));
+    assertNotesMigrationState(WRITE, false, false);
+
+    migrate(b -> b.setAutoMigrate(true).setStopAtStateForTesting(READ_WRITE_NO_SEQUENCE));
+    assertNotesMigrationState(READ_WRITE_NO_SEQUENCE, true, false);
+
+    migrate(b -> b);
+    assertNotesMigrationState(NOTE_DB, false, false);
+  }
+
+  @Test
+  public void notesMigrationStateListener() throws Exception {
+    NotesMigrationStateListener listener = createStrictMock(NotesMigrationStateListener.class);
+    listener.preStateChange(REVIEW_DB, WRITE);
+    expectLastCall();
+    listener.preStateChange(WRITE, READ_WRITE_NO_SEQUENCE);
+    expectLastCall();
+    listener.preStateChange(READ_WRITE_NO_SEQUENCE, READ_WRITE_WITH_SEQUENCE_REVIEW_DB_PRIMARY);
+    expectLastCall();
+    listener.preStateChange(
+        READ_WRITE_WITH_SEQUENCE_REVIEW_DB_PRIMARY, READ_WRITE_WITH_SEQUENCE_NOTE_DB_PRIMARY);
+    listener.preStateChange(READ_WRITE_WITH_SEQUENCE_NOTE_DB_PRIMARY, NOTE_DB);
+    expectLastCall();
+    replay(listener);
+    addListener(listener);
+
+    createChange();
+    migrate(b -> b);
+    assertNotesMigrationState(NOTE_DB, false, false);
+    verify(listener);
+  }
+
+  @Test
+  public void notesMigrationStateListenerFails() throws Exception {
+    NotesMigrationStateListener listener = createStrictMock(NotesMigrationStateListener.class);
+    listener.preStateChange(REVIEW_DB, WRITE);
+    expectLastCall();
+    listener.preStateChange(WRITE, READ_WRITE_NO_SEQUENCE);
+    IOException listenerException = new IOException("Listener failed");
+    expectLastCall().andThrow(listenerException);
+    replay(listener);
+    addListener(listener);
+
+    createChange();
+    try {
+      migrate(b -> b);
+      fail("expected IOException");
+    } catch (IOException e) {
+      assertThat(e).isSameAs(listenerException);
+    }
+    assertNotesMigrationState(WRITE, false, false);
+    verify(listener);
+  }
+
+  private void assertNotesMigrationState(
+      NotesMigrationState expected, boolean autoMigrate, boolean trialMode) throws Exception {
+    assertThat(NotesMigrationState.forNotesMigration(notesMigration)).hasValue(expected);
+    noteDbConfig.load();
+    assertThat(NotesMigrationState.forConfig(noteDbConfig)).hasValue(expected);
+    assertThat(NoteDbMigrator.getAutoMigrate(noteDbConfig))
+        .named("noteDb.changes.autoMigrate")
+        .isEqualTo(autoMigrate);
+    assertThat(NoteDbMigrator.getTrialMode(noteDbConfig))
+        .named("noteDb.changes.trial")
+        .isEqualTo(trialMode);
+  }
+
+  private void setNotesMigrationState(NotesMigrationState state) throws Exception {
+    noteDbConfig.load();
+    state.setConfigValues(noteDbConfig);
+    noteDbConfig.save();
+    notesMigration.setFrom(state);
+  }
+
+  @FunctionalInterface
+  interface PrepareBuilder {
+    NoteDbMigrator.Builder prepare(NoteDbMigrator.Builder b) throws Exception;
+  }
+
+  @FunctionalInterface
+  interface RunMigration {
+    void run(NoteDbMigrator m) throws Exception;
+  }
+
+  private void migrate(PrepareBuilder b) throws Exception {
+    migrate(b, NoteDbMigrator::migrate);
+  }
+
+  private void migrate(PrepareBuilder b, RunMigration m) throws Exception {
+    try (NoteDbMigrator migrator = b.prepare(migratorBuilderProvider.get()).build()) {
+      m.run(migrator);
+    }
+  }
+
+  private void assertMigrationException(
+      String expectMessageContains, PrepareBuilder b, RunMigration m) throws Exception {
+    try {
+      migrate(b, m);
+      fail("expected MigrationException");
+    } catch (MigrationException e) {
+      assertThat(e).hasMessageThat().contains(expectMessageContains);
+    }
+  }
+
+  private void addListener(NotesMigrationStateListener listener) {
+    addedListeners.add(listeners.add("gerrit", listener));
+  }
+
+  private ImmutableSortedSet<String> getObjectFiles(Project.NameKey project) throws Exception {
+    try (Repository repo = repoManager.openRepository(project);
+        Stream<Path> paths =
+            Files.walk(((FileRepository) repo).getObjectDatabase().getDirectory().toPath())) {
+      return paths
+          .filter(path -> !Files.isDirectory(path))
+          .map(Path::toString)
+          .filter(name -> !name.endsWith(".pack") && !name.endsWith(".idx"))
+          .collect(toImmutableSortedSet(naturalOrder()));
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/server/permissions/PermissionBackendConditionIT.java b/javatests/com/google/gerrit/acceptance/server/permissions/PermissionBackendConditionIT.java
new file mode 100644
index 0000000..720eeed
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/server/permissions/PermissionBackendConditionIT.java
@@ -0,0 +1,170 @@
+// 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.
+
+package com.google.gerrit.acceptance.server.permissions;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.extensions.conditions.BooleanCondition;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.permissions.ChangePermission;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.inject.Inject;
+import org.junit.Test;
+
+public class PermissionBackendConditionIT extends AbstractDaemonTest {
+
+  @Inject PermissionBackend pb;
+
+  @Test
+  public void globalPermissions_sameUserAndPermissionEquals() throws Exception {
+    BooleanCondition cond1 = pb.user(user()).testCond(GlobalPermission.CREATE_GROUP);
+    BooleanCondition cond2 = pb.user(user()).testCond(GlobalPermission.CREATE_GROUP);
+    assertEquals(cond1, cond2);
+    assertEquals(cond1.hashCode(), cond2.hashCode());
+  }
+
+  @Test
+  public void globalPermissions_differentPermissionDoesNotEquals() throws Exception {
+    BooleanCondition cond1 = pb.user(user()).testCond(GlobalPermission.CREATE_GROUP);
+    BooleanCondition cond2 = pb.user(user()).testCond(GlobalPermission.ACCESS_DATABASE);
+    assertNotEquals(cond1, cond2);
+    assertNotEquals(cond1.hashCode(), cond2.hashCode());
+  }
+
+  @Test
+  public void globalPermissions_differentUserDoesNotEqual() throws Exception {
+    BooleanCondition cond1 = pb.user(user()).testCond(GlobalPermission.CREATE_GROUP);
+    BooleanCondition cond2 = pb.user(admin()).testCond(GlobalPermission.CREATE_GROUP);
+    assertNotEquals(cond1, cond2);
+    assertNotEquals(cond1.hashCode(), cond2.hashCode());
+  }
+
+  @Test
+  public void changePermissions_sameResourceAndUserEquals() throws Exception {
+    ChangeData change = createChange().getChange();
+    BooleanCondition cond1 = pb.user(user()).change(change).testCond(ChangePermission.READ);
+    BooleanCondition cond2 = pb.user(user()).change(change).testCond(ChangePermission.READ);
+
+    assertEquals(cond1, cond2);
+    assertEquals(cond1.hashCode(), cond2.hashCode());
+  }
+
+  @Test
+  public void changePermissions_sameResourceDifferentUserDoesNotEqual() throws Exception {
+    ChangeData change = createChange().getChange();
+    BooleanCondition cond1 = pb.user(user()).change(change).testCond(ChangePermission.READ);
+    BooleanCondition cond2 = pb.user(admin()).change(change).testCond(ChangePermission.READ);
+
+    assertNotEquals(cond1, cond2);
+    assertNotEquals(cond1.hashCode(), cond2.hashCode());
+  }
+
+  @Test
+  public void changePermissions_differentResourceSameUserDoesNotEqual() throws Exception {
+    ChangeData change1 = createChange().getChange();
+    ChangeData change2 = createChange().getChange();
+    BooleanCondition cond1 = pb.user(user()).change(change1).testCond(ChangePermission.READ);
+    BooleanCondition cond2 = pb.user(user()).change(change2).testCond(ChangePermission.READ);
+
+    assertNotEquals(cond1, cond2);
+    assertNotEquals(cond1.hashCode(), cond2.hashCode());
+  }
+
+  @Test
+  public void projectPermissions_sameResourceAndUserEquals() throws Exception {
+    BooleanCondition cond1 = pb.user(user()).project(project).testCond(ProjectPermission.READ);
+    BooleanCondition cond2 = pb.user(user()).project(project).testCond(ProjectPermission.READ);
+
+    assertEquals(cond1, cond2);
+    assertEquals(cond1.hashCode(), cond2.hashCode());
+  }
+
+  @Test
+  public void projectPermissions_sameResourceDifferentUserDoesNotEqual() throws Exception {
+    BooleanCondition cond1 = pb.user(user()).project(project).testCond(ProjectPermission.READ);
+    BooleanCondition cond2 = pb.user(admin()).project(project).testCond(ProjectPermission.READ);
+
+    assertNotEquals(cond1, cond2);
+    assertNotEquals(cond1.hashCode(), cond2.hashCode());
+  }
+
+  @Test
+  public void projectPermissions_differentResourceSameUserDoesNotEqual() throws Exception {
+    Project.NameKey project2 = createProject("p2");
+    BooleanCondition cond1 = pb.user(user()).project(project).testCond(ProjectPermission.READ);
+    BooleanCondition cond2 = pb.user(user()).project(project2).testCond(ProjectPermission.READ);
+
+    assertNotEquals(cond1, cond2);
+    assertNotEquals(cond1.hashCode(), cond2.hashCode());
+  }
+
+  @Test
+  public void refPermissions_sameResourceAndUserEquals() throws Exception {
+    Branch.NameKey branch = new Branch.NameKey(project, "branch");
+    BooleanCondition cond1 = pb.user(user()).ref(branch).testCond(RefPermission.READ);
+    BooleanCondition cond2 = pb.user(user()).ref(branch).testCond(RefPermission.READ);
+
+    assertEquals(cond1, cond2);
+    assertEquals(cond1.hashCode(), cond2.hashCode());
+  }
+
+  @Test
+  public void refPermissions_sameResourceAndDifferentUserDoesNotEqual() throws Exception {
+    Branch.NameKey branch = new Branch.NameKey(project, "branch");
+    BooleanCondition cond1 = pb.user(user()).ref(branch).testCond(RefPermission.READ);
+    BooleanCondition cond2 = pb.user(admin()).ref(branch).testCond(RefPermission.READ);
+
+    assertNotEquals(cond1, cond2);
+    assertNotEquals(cond1.hashCode(), cond2.hashCode());
+  }
+
+  @Test
+  public void refPermissions_differentResourceAndSameUserDoesNotEqual() throws Exception {
+    Branch.NameKey branch1 = new Branch.NameKey(project, "branch");
+    Branch.NameKey branch2 = new Branch.NameKey(project, "branch2");
+    BooleanCondition cond1 = pb.user(user()).ref(branch1).testCond(RefPermission.READ);
+    BooleanCondition cond2 = pb.user(user()).ref(branch2).testCond(RefPermission.READ);
+
+    assertNotEquals(cond1, cond2);
+    assertNotEquals(cond1.hashCode(), cond2.hashCode());
+  }
+
+  @Test
+  public void refPermissions_differentResourceAndSameUserDoesNotEqual2() throws Exception {
+    Branch.NameKey branch1 = new Branch.NameKey(project, "branch");
+    Branch.NameKey branch2 = new Branch.NameKey(createProject("p2"), "branch");
+    BooleanCondition cond1 = pb.user(user()).ref(branch1).testCond(RefPermission.READ);
+    BooleanCondition cond2 = pb.user(user()).ref(branch2).testCond(RefPermission.READ);
+
+    assertNotEquals(cond1, cond2);
+    assertNotEquals(cond1.hashCode(), cond2.hashCode());
+  }
+
+  private CurrentUser user() {
+    return identifiedUserFactory.create(user.id);
+  }
+
+  private CurrentUser admin() {
+    return identifiedUserFactory.create(admin.id);
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/server/project/BUILD b/javatests/com/google/gerrit/acceptance/server/project/BUILD
new file mode 100644
index 0000000..42dfbac
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/server/project/BUILD
@@ -0,0 +1,8 @@
+load("//javatests/com/google/gerrit/acceptance:tests.bzl", "acceptance_tests")
+
+acceptance_tests(
+    srcs = glob(["*IT.java"]),
+    group = "server_project",
+    labels = ["server"],
+    deps = ["//java/com/google/gerrit/mail"],
+)
diff --git a/javatests/com/google/gerrit/acceptance/server/project/CustomLabelIT.java b/javatests/com/google/gerrit/acceptance/server/project/CustomLabelIT.java
new file mode 100644
index 0000000..8b0c56b
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/server/project/CustomLabelIT.java
@@ -0,0 +1,374 @@
+// Copyright (C) 2014 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.google.gerrit.acceptance.server.project;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.common.data.LabelFunction.ANY_WITH_BLOCK;
+import static com.google.gerrit.common.data.LabelFunction.MAX_NO_BLOCK;
+import static com.google.gerrit.common.data.LabelFunction.MAX_WITH_BLOCK;
+import static com.google.gerrit.common.data.LabelFunction.NO_BLOCK;
+import static com.google.gerrit.common.data.LabelFunction.NO_OP;
+import static com.google.gerrit.extensions.client.ListChangesOption.DETAILED_LABELS;
+import static com.google.gerrit.extensions.client.ListChangesOption.LABELS;
+import static com.google.gerrit.extensions.client.ListChangesOption.SUBMITTABLE;
+import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
+import static com.google.gerrit.server.project.testing.Util.category;
+import static com.google.gerrit.server.project.testing.Util.value;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.common.data.LabelFunction;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.changes.AddReviewerInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.LabelInfo;
+import com.google.gerrit.extensions.events.CommentAddedListener;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.server.project.testing.Util;
+import com.google.inject.Inject;
+import java.util.Arrays;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+@NoHttpd
+public class CustomLabelIT extends AbstractDaemonTest {
+
+  @Inject private DynamicSet<CommentAddedListener> source;
+
+  private final LabelType label =
+      category("CustomLabel", value(1, "Positive"), value(0, "No score"), value(-1, "Negative"));
+
+  private final LabelType P = category("CustomLabel2", value(1, "Positive"), value(0, "No score"));
+
+  private RegistrationHandle eventListenerRegistration;
+  private CommentAddedListener.Event lastCommentAddedEvent;
+
+  @Before
+  public void setUp() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      AccountGroup.UUID anonymousUsers = systemGroupBackend.getGroup(ANONYMOUS_USERS).getUUID();
+      Util.allow(
+          u.getConfig(),
+          Permission.forLabel(label.getName()),
+          -1,
+          1,
+          anonymousUsers,
+          "refs/heads/*");
+      Util.allow(
+          u.getConfig(), Permission.forLabel(P.getName()), 0, 1, anonymousUsers, "refs/heads/*");
+      u.save();
+    }
+
+    eventListenerRegistration =
+        source.add(
+            "gerrit",
+            new CommentAddedListener() {
+              @Override
+              public void onCommentAdded(Event event) {
+                lastCommentAddedEvent = event;
+              }
+            });
+  }
+
+  @After
+  public void cleanup() {
+    eventListenerRegistration.remove();
+    db.close();
+  }
+
+  @Test
+  public void customLabelNoOp_NegativeVoteNotBlock() throws Exception {
+    label.setFunction(NO_OP);
+    saveLabelConfig();
+    PushOneCommit.Result r = createChange();
+    revision(r).review(new ReviewInput().label(label.getName(), -1));
+    ChangeInfo c = getWithLabels(r);
+    LabelInfo q = c.labels.get(label.getName());
+    assertThat(q.all).hasSize(1);
+    assertThat(q.approved).isNull();
+    assertThat(q.recommended).isNull();
+    assertThat(q.disliked).isNull();
+    assertThat(q.rejected).isNotNull();
+    assertThat(q.blocking).isNull();
+  }
+
+  @Test
+  public void customLabelNoBlock_NegativeVoteNotBlock() throws Exception {
+    label.setFunction(NO_BLOCK);
+    saveLabelConfig();
+    PushOneCommit.Result r = createChange();
+    revision(r).review(new ReviewInput().label(label.getName(), -1));
+    ChangeInfo c = getWithLabels(r);
+    LabelInfo q = c.labels.get(label.getName());
+    assertThat(q.all).hasSize(1);
+    assertThat(q.approved).isNull();
+    assertThat(q.recommended).isNull();
+    assertThat(q.disliked).isNull();
+    assertThat(q.rejected).isNotNull();
+    assertThat(q.blocking).isNull();
+  }
+
+  @Test
+  public void customLabelMaxNoBlock_NegativeVoteNotBlock() throws Exception {
+    label.setFunction(MAX_NO_BLOCK);
+    saveLabelConfig();
+    PushOneCommit.Result r = createChange();
+    revision(r).review(new ReviewInput().label(label.getName(), -1));
+    ChangeInfo c = getWithLabels(r);
+    LabelInfo q = c.labels.get(label.getName());
+    assertThat(q.all).hasSize(1);
+    assertThat(q.approved).isNull();
+    assertThat(q.recommended).isNull();
+    assertThat(q.disliked).isNull();
+    assertThat(q.rejected).isNotNull();
+    assertThat(q.blocking).isNull();
+  }
+
+  @Test
+  public void customLabelMaxNoBlock_MaxVoteSubmittable() throws Exception {
+    label.setFunction(MAX_NO_BLOCK);
+    P.setFunction(NO_OP);
+    saveLabelConfig();
+    PushOneCommit.Result r = createChange();
+    assertThat(info(r.getChangeId()).submittable).isNull();
+    revision(r).review(ReviewInput.approve().label(label.getName(), 1));
+
+    ChangeInfo c = getWithLabels(r);
+    assertThat(c.submittable).isTrue();
+    LabelInfo q = c.labels.get(label.getName());
+    assertThat(q.all).hasSize(1);
+    assertThat(q.approved).isNotNull();
+    assertThat(q.recommended).isNull();
+    assertThat(q.disliked).isNull();
+    assertThat(q.rejected).isNull();
+    assertThat(q.blocking).isNull();
+  }
+
+  @Test
+  public void customLabelAnyWithBlock_NegativeVoteBlock() throws Exception {
+    label.setFunction(ANY_WITH_BLOCK);
+    saveLabelConfig();
+    PushOneCommit.Result r = createChange();
+    revision(r).review(new ReviewInput().label(label.getName(), -1));
+    ChangeInfo c = getWithLabels(r);
+    LabelInfo q = c.labels.get(label.getName());
+    assertThat(q.all).hasSize(1);
+    assertThat(q.approved).isNull();
+    assertThat(q.recommended).isNull();
+    assertThat(q.disliked).isNull();
+    assertThat(q.rejected).isNotNull();
+    assertThat(q.blocking).isTrue();
+  }
+
+  @Test
+  public void customLabelAnyWithBlock_Addreviewer_ZeroVote() throws Exception {
+    P.setFunction(ANY_WITH_BLOCK);
+    saveLabelConfig();
+    PushOneCommit.Result r = createChange();
+    AddReviewerInput in = new AddReviewerInput();
+    in.reviewer = user.email;
+    gApi.changes().id(r.getChangeId()).addReviewer(in);
+
+    ReviewInput input = new ReviewInput().label(P.getName(), 0);
+    input.message = "foo";
+
+    revision(r).review(input);
+    ChangeInfo c = getWithLabels(r);
+    LabelInfo q = c.labels.get(P.getName());
+    assertThat(q.all).hasSize(2);
+    assertThat(q.approved).isNull();
+    assertThat(q.recommended).isNull();
+    assertThat(q.disliked).isNull();
+    assertThat(q.rejected).isNull();
+    assertThat(q.blocking).isNull();
+    assertThat(lastCommentAddedEvent.getComment()).isEqualTo("Patch Set 1:\n\n" + input.message);
+  }
+
+  @Test
+  public void customLabelMaxWithBlock_NegativeVoteBlock() throws Exception {
+    label.setFunction(MAX_WITH_BLOCK);
+    saveLabelConfig();
+    PushOneCommit.Result r = createChange();
+    revision(r).review(new ReviewInput().label(label.getName(), -1));
+    ChangeInfo c = getWithLabels(r);
+    LabelInfo q = c.labels.get(label.getName());
+    assertThat(q.all).hasSize(1);
+    assertThat(q.approved).isNull();
+    assertThat(q.recommended).isNull();
+    assertThat(q.disliked).isNull();
+    assertThat(q.rejected).isNotNull();
+    assertThat(q.blocking).isTrue();
+  }
+
+  @Test
+  public void customLabelMaxWithBlock_MaxVoteSubmittable() throws Exception {
+    label.setFunction(MAX_WITH_BLOCK);
+    P.setFunction(NO_OP);
+    saveLabelConfig();
+    PushOneCommit.Result r = createChange();
+    assertThat(info(r.getChangeId()).submittable).isNull();
+    revision(r).review(ReviewInput.approve().label(label.getName(), 1));
+
+    ChangeInfo c = getWithLabels(r);
+    assertThat(c.submittable).isTrue();
+    LabelInfo q = c.labels.get(label.getName());
+    assertThat(q.all).hasSize(1);
+    assertThat(q.approved).isNotNull();
+    assertThat(q.recommended).isNull();
+    assertThat(q.disliked).isNull();
+    assertThat(q.rejected).isNull();
+    assertThat(q.blocking).isNull();
+  }
+
+  @Test
+  public void customLabelMaxWithBlock_MaxVoteNegativeVoteBlock() throws Exception {
+    label.setFunction(MAX_WITH_BLOCK);
+    saveLabelConfig();
+    PushOneCommit.Result r = createChange();
+    revision(r).review(new ReviewInput().label(label.getName(), 1));
+    revision(r).review(new ReviewInput().label(label.getName(), -1));
+    ChangeInfo c = getWithLabels(r);
+    LabelInfo q = c.labels.get(label.getName());
+    assertThat(q.all).hasSize(1);
+    assertThat(q.approved).isNull();
+    assertThat(q.recommended).isNull();
+    assertThat(q.disliked).isNull();
+    assertThat(q.rejected).isNotNull();
+    assertThat(q.blocking).isTrue();
+  }
+
+  @Test
+  public void customLabel_DisallowPostSubmit() throws Exception {
+    label.setFunction(NO_OP);
+    label.setAllowPostSubmit(false);
+    P.setFunction(NO_OP);
+    saveLabelConfig();
+
+    PushOneCommit.Result r = createChange();
+    revision(r).review(ReviewInput.approve());
+    revision(r).submit();
+
+    ChangeInfo info = getWithLabels(r);
+    assertPermitted(info, "Code-Review", 2);
+    assertPermitted(info, P.getName(), 0, 1);
+    assertPermitted(info, label.getName());
+
+    ReviewInput in = new ReviewInput();
+    in.label(P.getName(), P.getMax().getValue());
+    revision(r).review(in);
+
+    in = new ReviewInput();
+    in.label(label.getName(), label.getMax().getValue());
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("Voting on labels disallowed after submit: " + label.getName());
+    revision(r).review(in);
+  }
+
+  @Test
+  public void customLabelWithUserPermissionChange() throws Exception {
+    String testLabel = "Test-Label";
+    configLabel(
+        project,
+        testLabel,
+        LabelFunction.MAX_WITH_BLOCK,
+        value(2, "Looks good to me, approved"),
+        value(1, "Looks good to me, but someone else must approve"),
+        value(0, "No score"),
+        value(-1, "I would prefer this is not merged as is"),
+        value(-2, "This shall not be merged"));
+
+    AccountGroup.UUID registered = SystemGroupBackend.REGISTERED_USERS;
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      Util.allow(u.getConfig(), Permission.forLabel(testLabel), -2, +2, registered, "refs/heads/*");
+      u.save();
+    }
+
+    PushOneCommit.Result result = createChange();
+    String changeId = result.getChangeId();
+
+    // admin votes 'Test-Label +2' and 'Code-Review +2'.
+    ReviewInput input = new ReviewInput();
+    input.label(testLabel, 2);
+    input.label("Code-Review", 2);
+    revision(result).review(input);
+
+    // Verify the value of 'Test-Label' is +2.
+    assertLabelStatus(changeId, testLabel);
+
+    // The change is submittable.
+    assertThat(gApi.changes().id(changeId).get().submittable).isTrue();
+
+    // Update admin's permitted range for 'Test-Label' to be -1...+1.
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      Util.remove(u.getConfig(), Permission.forLabel(testLabel), registered, "refs/heads/*");
+      Util.allow(u.getConfig(), Permission.forLabel(testLabel), -1, +1, registered, "refs/heads/*");
+      u.save();
+    }
+
+    // Verify admin doesn't have +2 permission any more.
+    assertPermitted(gApi.changes().id(changeId).get(), testLabel, -1, 0, 1);
+
+    // Verify the value of 'Test-Label' is still +2.
+    assertLabelStatus(changeId, testLabel);
+
+    // Verify the change is still submittable.
+    assertThat(gApi.changes().id(changeId).get().submittable).isTrue();
+    gApi.changes().id(changeId).current().submit();
+  }
+
+  @Test
+  public void customLabel_withBranch() throws Exception {
+    label.setRefPatterns(Arrays.asList("master"));
+    saveLabelConfig();
+    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
+    assertThat(cfg.getLabelSections().get(label.getName()).getRefPatterns()).contains("master");
+  }
+
+  private void assertLabelStatus(String changeId, String testLabel) throws Exception {
+    ChangeInfo changeInfo = getWithLabels(changeId);
+    LabelInfo labelInfo = changeInfo.labels.get(testLabel);
+    assertThat(labelInfo.all).hasSize(1);
+    assertThat(labelInfo.approved).isNotNull();
+    assertThat(labelInfo.recommended).isNull();
+    assertThat(labelInfo.disliked).isNull();
+    assertThat(labelInfo.rejected).isNull();
+    assertThat(labelInfo.blocking).isNull();
+  }
+
+  private void saveLabelConfig() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      u.getConfig().getLabelSections().put(label.getName(), label);
+      u.getConfig().getLabelSections().put(P.getName(), P);
+      u.save();
+    }
+  }
+
+  private ChangeInfo getWithLabels(PushOneCommit.Result r) throws Exception {
+    return getWithLabels(r.getChangeId());
+  }
+
+  private ChangeInfo getWithLabels(String changeId) throws Exception {
+    return get(changeId, LABELS, DETAILED_LABELS, SUBMITTABLE);
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/server/project/ProjectWatchIT.java b/javatests/com/google/gerrit/acceptance/server/project/ProjectWatchIT.java
new file mode 100644
index 0000000..cfdd781
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/server/project/ProjectWatchIT.java
@@ -0,0 +1,556 @@
+// Copyright (C) 2015 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.google.gerrit.acceptance.server.project;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.server.StarredChangesUtil.IGNORE_LABEL;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.TestAccount;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.changes.StarsInput;
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gerrit.server.git.NotifyConfig;
+import com.google.gerrit.testing.FakeEmailSender.Message;
+import java.util.EnumSet;
+import java.util.List;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.junit.TestRepository;
+import org.junit.Test;
+
+@NoHttpd
+public class ProjectWatchIT extends AbstractDaemonTest {
+  @Test
+  public void newPatchSetsNotifyConfig() throws Exception {
+    Address addr = new Address("Watcher", "watcher@example.com");
+    NotifyConfig nc = new NotifyConfig();
+    nc.addEmail(addr);
+    nc.setName("new-patch-set");
+    nc.setHeader(NotifyConfig.Header.CC);
+    nc.setTypes(EnumSet.of(NotifyType.NEW_PATCHSETS));
+    nc.setFilter("message:sekret");
+
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      u.getConfig().putNotifyConfig("watch", nc);
+      u.save();
+    }
+
+    PushOneCommit.Result r =
+        pushFactory
+            .create(db, admin.getIdent(), testRepo, "original subject", "a", "a1")
+            .to("refs/for/master");
+    r.assertOkStatus();
+
+    r =
+        pushFactory
+            .create(
+                db, admin.getIdent(), testRepo, "super sekret subject", "a", "a2", r.getChangeId())
+            .to("refs/for/master");
+    r.assertOkStatus();
+
+    r =
+        pushFactory
+            .create(db, admin.getIdent(), testRepo, "back to original subject", "a", "a3")
+            .to("refs/for/master");
+    r.assertOkStatus();
+
+    List<Message> messages = sender.getMessages();
+    assertThat(messages).hasSize(1);
+    Message m = messages.get(0);
+    assertThat(m.rcpt()).containsExactly(addr);
+    assertThat(m.body()).contains("Change subject: super sekret subject\n");
+    assertThat(m.body()).contains("Gerrit-PatchSet: 2\n");
+  }
+
+  @Test
+  public void noNotificationForPrivateChangesForWatchersInNotifyConfig() throws Exception {
+    Address addr = new Address("Watcher", "watcher@example.com");
+    NotifyConfig nc = new NotifyConfig();
+    nc.addEmail(addr);
+    nc.setName("team");
+    nc.setHeader(NotifyConfig.Header.TO);
+    nc.setTypes(EnumSet.of(NotifyType.NEW_CHANGES, NotifyType.ALL_COMMENTS));
+
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      u.getConfig().putNotifyConfig("team", nc);
+      u.save();
+    }
+
+    sender.clear();
+    PushOneCommit.Result r =
+        pushFactory
+            .create(db, admin.getIdent(), testRepo, "private change", "a", "a1")
+            .to("refs/for/master%private");
+    r.assertOkStatus();
+
+    assertThat(sender.getMessages()).isEmpty();
+
+    setApiUser(admin);
+    ReviewInput in = new ReviewInput();
+    in.message = "comment";
+    gApi.changes().id(r.getChangeId()).current().review(in);
+
+    assertThat(sender.getMessages()).isEmpty();
+  }
+
+  @Test
+  public void noNotificationForChangeThatIsTurnedPrivateForWatchersInNotifyConfig()
+      throws Exception {
+    Address addr = new Address("Watcher", "watcher@example.com");
+    NotifyConfig nc = new NotifyConfig();
+    nc.addEmail(addr);
+    nc.setName("team");
+    nc.setHeader(NotifyConfig.Header.TO);
+    nc.setTypes(EnumSet.of(NotifyType.NEW_PATCHSETS));
+
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      u.getConfig().putNotifyConfig("team", nc);
+      u.save();
+    }
+
+    PushOneCommit.Result r =
+        pushFactory
+            .create(db, admin.getIdent(), testRepo, "subject", "a", "a1")
+            .to("refs/for/master");
+    r.assertOkStatus();
+
+    sender.clear();
+
+    r =
+        pushFactory
+            .create(db, admin.getIdent(), testRepo, "subject", "a", "a2", r.getChangeId())
+            .to("refs/for/master%private");
+    r.assertOkStatus();
+
+    assertThat(sender.getMessages()).isEmpty();
+  }
+
+  @Test
+  public void noNotificationForWipChangesForWatchersInNotifyConfig() throws Exception {
+    Address addr = new Address("Watcher", "watcher@example.com");
+    NotifyConfig nc = new NotifyConfig();
+    nc.addEmail(addr);
+    nc.setName("team");
+    nc.setHeader(NotifyConfig.Header.TO);
+    nc.setTypes(EnumSet.of(NotifyType.NEW_CHANGES, NotifyType.ALL_COMMENTS));
+
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      u.getConfig().putNotifyConfig("team", nc);
+      u.save();
+    }
+
+    sender.clear();
+    PushOneCommit.Result r =
+        pushFactory
+            .create(db, admin.getIdent(), testRepo, "wip change", "a", "a1")
+            .to("refs/for/master%wip");
+    r.assertOkStatus();
+
+    assertThat(sender.getMessages()).isEmpty();
+
+    setApiUser(admin);
+    ReviewInput in = new ReviewInput();
+    in.message = "comment";
+    gApi.changes().id(r.getChangeId()).current().review(in);
+
+    assertThat(sender.getMessages()).isEmpty();
+  }
+
+  @Test
+  public void noNotificationForChangeThatIsTurnedWipForWatchersInNotifyConfig() throws Exception {
+    Address addr = new Address("Watcher", "watcher@example.com");
+    NotifyConfig nc = new NotifyConfig();
+    nc.addEmail(addr);
+    nc.setName("team");
+    nc.setHeader(NotifyConfig.Header.TO);
+    nc.setTypes(EnumSet.of(NotifyType.NEW_PATCHSETS));
+
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      u.getConfig().putNotifyConfig("team", nc);
+      u.save();
+    }
+
+    PushOneCommit.Result r =
+        pushFactory
+            .create(db, admin.getIdent(), testRepo, "subject", "a", "a1")
+            .to("refs/for/master");
+    r.assertOkStatus();
+
+    sender.clear();
+
+    r =
+        pushFactory
+            .create(db, admin.getIdent(), testRepo, "subject", "a", "a2", r.getChangeId())
+            .to("refs/for/master%wip");
+    r.assertOkStatus();
+
+    assertThat(sender.getMessages()).isEmpty();
+  }
+
+  @Test
+  public void watchProject() throws Exception {
+    // watch project
+    String watchedProject = createProject("watchedProject").get();
+    setApiUser(user);
+    watch(watchedProject);
+
+    // push a change to watched project -> should trigger email notification
+    setApiUser(admin);
+    TestRepository<InMemoryRepository> watchedRepo =
+        cloneProject(new Project.NameKey(watchedProject), admin);
+    PushOneCommit.Result r =
+        pushFactory
+            .create(db, admin.getIdent(), watchedRepo, "TRIGGER", "a", "a1")
+            .to("refs/for/master");
+    r.assertOkStatus();
+
+    // push a change to non-watched project -> should not trigger email
+    // notification
+    String notWatchedProject = createProject("otherProject").get();
+    TestRepository<InMemoryRepository> notWatchedRepo =
+        cloneProject(new Project.NameKey(notWatchedProject), admin);
+    r =
+        pushFactory
+            .create(db, admin.getIdent(), notWatchedRepo, "DONT_TRIGGER", "a", "a1")
+            .to("refs/for/master");
+    r.assertOkStatus();
+
+    // assert email notification
+    List<Message> messages = sender.getMessages();
+    assertThat(messages).hasSize(1);
+    Message m = messages.get(0);
+    assertThat(m.rcpt()).containsExactly(user.emailAddress);
+    assertThat(m.body()).contains("Change subject: TRIGGER\n");
+    assertThat(m.body()).contains("Gerrit-PatchSet: 1\n");
+  }
+
+  @Test
+  public void watchFile() throws Exception {
+    String watchedProject = createProject("watchedProject").get();
+    String otherWatchedProject = createProject("otherWatchedProject").get();
+    setApiUser(user);
+
+    // watch file in project as user
+    watch(watchedProject, "file:a.txt");
+
+    // watch other project as user
+    watch(otherWatchedProject);
+
+    // push a change to watched file -> should trigger email notification for
+    // user
+    setApiUser(admin);
+    TestRepository<InMemoryRepository> watchedRepo =
+        cloneProject(new Project.NameKey(watchedProject), admin);
+    PushOneCommit.Result r =
+        pushFactory
+            .create(db, admin.getIdent(), watchedRepo, "TRIGGER", "a.txt", "a1")
+            .to("refs/for/master");
+    r.assertOkStatus();
+
+    // assert email notification for user
+    List<Message> messages = sender.getMessages();
+    assertThat(messages).hasSize(1);
+    Message m = messages.get(0);
+    assertThat(m.rcpt()).containsExactly(user.emailAddress);
+    assertThat(m.body()).contains("Change subject: TRIGGER\n");
+    assertThat(m.body()).contains("Gerrit-PatchSet: 1\n");
+    sender.clear();
+
+    // watch project as user2
+    TestAccount user2 = accountCreator.create("user2", "user2@test.com", "User2");
+    setApiUser(user2);
+    watch(watchedProject);
+
+    // push a change to non-watched file -> should not trigger email
+    // notification for user, only for user2
+    r =
+        pushFactory
+            .create(db, admin.getIdent(), watchedRepo, "TRIGGER_USER2", "b.txt", "b1")
+            .to("refs/for/master");
+    r.assertOkStatus();
+
+    // assert email notification
+    messages = sender.getMessages();
+    assertThat(messages).hasSize(1);
+    m = messages.get(0);
+    assertThat(m.rcpt()).containsExactly(user2.emailAddress);
+    assertThat(m.body()).contains("Change subject: TRIGGER_USER2\n");
+    assertThat(m.body()).contains("Gerrit-PatchSet: 1\n");
+  }
+
+  @Test
+  public void watchKeyword() throws Exception {
+    String watchedProject = createProject("watchedProject").get();
+    setApiUser(user);
+
+    // watch keyword in project as user
+    watch(watchedProject, "multimaster");
+
+    // push a change with keyword -> should trigger email notification
+    setApiUser(admin);
+    TestRepository<InMemoryRepository> watchedRepo =
+        cloneProject(new Project.NameKey(watchedProject), admin);
+    PushOneCommit.Result r =
+        pushFactory
+            .create(db, admin.getIdent(), watchedRepo, "Document multimaster setup", "a.txt", "a1")
+            .to("refs/for/master");
+    r.assertOkStatus();
+
+    // assert email notification for user
+    List<Message> messages = sender.getMessages();
+    assertThat(messages).hasSize(1);
+    Message m = messages.get(0);
+    assertThat(m.rcpt()).containsExactly(user.emailAddress);
+    assertThat(m.body()).contains("Change subject: Document multimaster setup\n");
+    assertThat(m.body()).contains("Gerrit-PatchSet: 1\n");
+    sender.clear();
+
+    // push a change without keyword -> should not trigger email notification
+    r =
+        pushFactory
+            .create(
+                db, admin.getIdent(), watchedRepo, "Cleanup cache implementation", "b.txt", "b1")
+            .to("refs/for/master");
+    r.assertOkStatus();
+
+    // assert email notification
+    assertThat(sender.getMessages()).isEmpty();
+  }
+
+  @Test
+  public void watchAllProjects() throws Exception {
+    String anyProject = createProject("anyProject").get();
+    setApiUser(user);
+
+    // watch the All-Projects project to watch all projects
+    watch(allProjects.get());
+
+    // push a change to any project -> should trigger email notification
+    setApiUser(admin);
+    TestRepository<InMemoryRepository> anyRepo =
+        cloneProject(new Project.NameKey(anyProject), admin);
+    PushOneCommit.Result r =
+        pushFactory
+            .create(db, admin.getIdent(), anyRepo, "TRIGGER", "a", "a1")
+            .to("refs/for/master");
+    r.assertOkStatus();
+
+    // assert email notification
+    List<Message> messages = sender.getMessages();
+    assertThat(messages).hasSize(1);
+    Message m = messages.get(0);
+    assertThat(m.rcpt()).containsExactly(user.emailAddress);
+    assertThat(m.body()).contains("Change subject: TRIGGER\n");
+    assertThat(m.body()).contains("Gerrit-PatchSet: 1\n");
+  }
+
+  @Test
+  public void watchFileAllProjects() throws Exception {
+    String anyProject = createProject("anyProject").get();
+    setApiUser(user);
+
+    // watch file in All-Projects project as user to watch the file in all
+    // projects
+    watch(allProjects.get(), "file:a.txt");
+
+    // push a change to watched file in any project -> should trigger email
+    // notification for user
+    setApiUser(admin);
+    TestRepository<InMemoryRepository> anyRepo =
+        cloneProject(new Project.NameKey(anyProject), admin);
+    PushOneCommit.Result r =
+        pushFactory
+            .create(db, admin.getIdent(), anyRepo, "TRIGGER", "a.txt", "a1")
+            .to("refs/for/master");
+    r.assertOkStatus();
+
+    // assert email notification for user
+    List<Message> messages = sender.getMessages();
+    assertThat(messages).hasSize(1);
+    Message m = messages.get(0);
+    assertThat(m.rcpt()).containsExactly(user.emailAddress);
+    assertThat(m.body()).contains("Change subject: TRIGGER\n");
+    assertThat(m.body()).contains("Gerrit-PatchSet: 1\n");
+    sender.clear();
+
+    // watch project as user2
+    TestAccount user2 = accountCreator.create("user2", "user2@test.com", "User2");
+    setApiUser(user2);
+    watch(anyProject);
+
+    // push a change to non-watched file in any project -> should not trigger
+    // email notification for user, only for user2
+    r =
+        pushFactory
+            .create(db, admin.getIdent(), anyRepo, "TRIGGER_USER2", "b.txt", "b1")
+            .to("refs/for/master");
+    r.assertOkStatus();
+
+    // assert email notification
+    messages = sender.getMessages();
+    assertThat(messages).hasSize(1);
+    m = messages.get(0);
+    assertThat(m.rcpt()).containsExactly(user2.emailAddress);
+    assertThat(m.body()).contains("Change subject: TRIGGER_USER2\n");
+    assertThat(m.body()).contains("Gerrit-PatchSet: 1\n");
+  }
+
+  @Test
+  public void watchKeywordAllProjects() throws Exception {
+    String anyProject = createProject("anyProject").get();
+    setApiUser(user);
+
+    // watch keyword in project as user
+    watch(allProjects.get(), "multimaster");
+
+    // push a change with keyword to any project -> should trigger email
+    // notification
+    setApiUser(admin);
+    TestRepository<InMemoryRepository> anyRepo =
+        cloneProject(new Project.NameKey(anyProject), admin);
+    PushOneCommit.Result r =
+        pushFactory
+            .create(db, admin.getIdent(), anyRepo, "Document multimaster setup", "a.txt", "a1")
+            .to("refs/for/master");
+    r.assertOkStatus();
+
+    // assert email notification for user
+    List<Message> messages = sender.getMessages();
+    assertThat(messages).hasSize(1);
+    Message m = messages.get(0);
+    assertThat(m.rcpt()).containsExactly(user.emailAddress);
+    assertThat(m.body()).contains("Change subject: Document multimaster setup\n");
+    assertThat(m.body()).contains("Gerrit-PatchSet: 1\n");
+    sender.clear();
+
+    // push a change without keyword to any project -> should not trigger email
+    // notification
+    r =
+        pushFactory
+            .create(db, admin.getIdent(), anyRepo, "Cleanup cache implementation", "b.txt", "b1")
+            .to("refs/for/master");
+    r.assertOkStatus();
+
+    // assert email notification
+    assertThat(sender.getMessages()).isEmpty();
+  }
+
+  @Test
+  public void watchProjectNoNotificationForIgnoredChange() throws Exception {
+    // watch project
+    String watchedProject = createProject("watchedProject").get();
+    setApiUser(user);
+    watch(watchedProject);
+
+    // push a change to watched project
+    setApiUser(admin);
+    TestRepository<InMemoryRepository> watchedRepo =
+        cloneProject(new Project.NameKey(watchedProject), admin);
+    PushOneCommit.Result r =
+        pushFactory
+            .create(db, admin.getIdent(), watchedRepo, "ignored change", "a", "a1")
+            .to("refs/for/master");
+    r.assertOkStatus();
+
+    // ignore the change
+    setApiUser(user);
+    gApi.accounts().self().setStars(r.getChangeId(), new StarsInput(ImmutableSet.of(IGNORE_LABEL)));
+
+    sender.clear();
+
+    // post a comment -> should not trigger email notification since user ignored the change
+    setApiUser(admin);
+    ReviewInput in = new ReviewInput();
+    in.message = "comment";
+    gApi.changes().id(r.getChangeId()).current().review(in);
+
+    // assert email notification
+    assertThat(sender.getMessages()).isEmpty();
+  }
+
+  @Test
+  public void watchProjectNoNotificationForPrivateChange() throws Exception {
+    // watch project
+    String watchedProject = createProject("watchedProject").get();
+    setApiUser(user);
+    watch(watchedProject);
+
+    // push a private change to watched project -> should not trigger email notification
+    setApiUser(admin);
+    TestRepository<InMemoryRepository> watchedRepo =
+        cloneProject(new Project.NameKey(watchedProject), admin);
+    PushOneCommit.Result r =
+        pushFactory
+            .create(db, admin.getIdent(), watchedRepo, "private change", "a", "a1")
+            .to("refs/for/master%private");
+    r.assertOkStatus();
+
+    // assert email notification
+    assertThat(sender.getMessages()).isEmpty();
+  }
+
+  @Test
+  public void watchProjectNotifyOnPrivateChange() throws Exception {
+    String watchedProject = createProject("watchedProject").get();
+
+    // create group that can view all private changes
+    GroupInfo groupThatCanViewPrivateChanges =
+        gApi.groups().create("groupThatCanViewPrivateChanges").get();
+    grant(
+        new Project.NameKey(watchedProject),
+        "refs/*",
+        Permission.VIEW_PRIVATE_CHANGES,
+        false,
+        new AccountGroup.UUID(groupThatCanViewPrivateChanges.id));
+
+    // watch project as user that can't view private changes
+    setApiUser(user);
+    watch(watchedProject);
+
+    // watch project as user that can view all private change
+    TestAccount userThatCanViewPrivateChanges =
+        accountCreator.create(
+            "user2", "user2@test.com", "User2", groupThatCanViewPrivateChanges.name);
+    setApiUser(userThatCanViewPrivateChanges);
+    watch(watchedProject);
+
+    // push a private change to watched project -> should trigger email notification for
+    // userThatCanViewPrivateChanges, but not for user
+    setApiUser(admin);
+    TestRepository<InMemoryRepository> watchedRepo =
+        cloneProject(new Project.NameKey(watchedProject), admin);
+    PushOneCommit.Result r =
+        pushFactory
+            .create(db, admin.getIdent(), watchedRepo, "TRIGGER", "a", "a1")
+            .to("refs/for/master%private");
+    r.assertOkStatus();
+
+    // assert email notification
+    List<Message> messages = sender.getMessages();
+    assertThat(messages).hasSize(1);
+    Message m = messages.get(0);
+    assertThat(m.rcpt()).containsExactly(userThatCanViewPrivateChanges.emailAddress);
+    assertThat(m.body()).contains("Change subject: TRIGGER\n");
+    assertThat(m.body()).contains("Gerrit-PatchSet: 1\n");
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/server/project/ReflogIT.java b/javatests/com/google/gerrit/acceptance/server/project/ReflogIT.java
new file mode 100644
index 0000000..8abb59d
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/server/project/ReflogIT.java
@@ -0,0 +1,110 @@
+// Copyright (C) 2017 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.google.gerrit.acceptance.server.project;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static com.google.gerrit.reviewdb.client.RefNames.changeMetaRef;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.UseLocalDisk;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.groups.GroupApi;
+import com.google.gerrit.extensions.api.projects.BranchApi;
+import com.google.gerrit.extensions.api.projects.ReflogEntryInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.project.testing.Util;
+import java.io.File;
+import java.util.List;
+import org.eclipse.jgit.lib.ReflogEntry;
+import org.eclipse.jgit.lib.Repository;
+import org.junit.Test;
+
+@UseLocalDisk
+public class ReflogIT extends AbstractDaemonTest {
+  @Test
+  public void guessRestApiInReflog() throws Exception {
+    assume().that(notesMigration.disableChangeReviewDb()).isTrue();
+    PushOneCommit.Result r = createChange();
+    Change.Id id = r.getChange().getId();
+
+    try (Repository repo = repoManager.openRepository(r.getChange().project())) {
+      File log = new File(repo.getDirectory(), "logs/" + changeMetaRef(id));
+      if (!log.exists()) {
+        log.getParentFile().mkdirs();
+        assertThat(log.createNewFile()).isTrue();
+      }
+
+      gApi.changes().id(id.get()).topic("foo");
+      ReflogEntry last = repo.getReflogReader(changeMetaRef(id)).getLastEntry();
+      assertThat(last).named("last RefLogEntry").isNotNull();
+      assertThat(last.getComment()).isEqualTo("restapi.change.PutTopic");
+    }
+  }
+
+  @Test
+  public void reflogUpdatedBySubmittingChange() throws Exception {
+    BranchApi branchApi = gApi.projects().name(project.get()).branch("master");
+    List<ReflogEntryInfo> reflog = branchApi.reflog();
+    assertThat(reflog).isNotEmpty();
+
+    // Current number of entries in the reflog
+    int refLogLen = reflog.size();
+
+    // Create and submit a change
+    PushOneCommit.Result r = createChange();
+    String changeId = r.getChangeId();
+    String revision = r.getCommit().name();
+    ReviewInput in = ReviewInput.approve();
+    gApi.changes().id(changeId).revision(revision).review(in);
+    gApi.changes().id(changeId).revision(revision).submit();
+
+    // Submitting the change causes a new entry in the reflog
+    reflog = branchApi.reflog();
+    assertThat(reflog).hasSize(refLogLen + 1);
+  }
+
+  @Test
+  public void regularUserIsNotAllowedToGetReflog() throws Exception {
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    gApi.projects().name(project.get()).branch("master").reflog();
+  }
+
+  @Test
+  public void ownerUserIsAllowedToGetReflog() throws Exception {
+    GroupApi groupApi = gApi.groups().create(name("get-reflog"));
+    groupApi.addMembers("user");
+
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      Util.allow(
+          u.getConfig(), Permission.OWNER, new AccountGroup.UUID(groupApi.get().id), "refs/*");
+      u.save();
+    }
+
+    setApiUser(user);
+    gApi.projects().name(project.get()).branch("master").reflog();
+  }
+
+  @Test
+  public void adminUserIsAllowedToGetReflog() throws Exception {
+    setApiUser(admin);
+    gApi.projects().name(project.get()).branch("master").reflog();
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/server/rules/BUILD b/javatests/com/google/gerrit/acceptance/server/rules/BUILD
new file mode 100644
index 0000000..1f547f7
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/server/rules/BUILD
@@ -0,0 +1,10 @@
+load("//javatests/com/google/gerrit/acceptance:tests.bzl", "acceptance_tests")
+
+acceptance_tests(
+    srcs = glob(["*IT.java"]),
+    group = "server_rules",
+    labels = ["server"],
+    deps = [
+        "@prolog-runtime//jar",
+    ],
+)
diff --git a/javatests/com/google/gerrit/acceptance/server/rules/IgnoreSelfApprovalRuleIT.java b/javatests/com/google/gerrit/acceptance/server/rules/IgnoreSelfApprovalRuleIT.java
new file mode 100644
index 0000000..d1b05e3
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/server/rules/IgnoreSelfApprovalRuleIT.java
@@ -0,0 +1,99 @@
+// 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.
+
+package com.google.gerrit.acceptance.server.rules;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.SubmitRecord;
+import com.google.gerrit.common.data.SubmitRequirement;
+import com.google.gerrit.server.project.SubmitRuleOptions;
+import com.google.gerrit.server.rules.IgnoreSelfApprovalRule;
+import com.google.inject.Inject;
+import java.util.Collection;
+import java.util.Map;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.junit.TestRepository;
+import org.junit.Test;
+
+@NoHttpd
+public class IgnoreSelfApprovalRuleIT extends AbstractDaemonTest {
+  @Inject private IgnoreSelfApprovalRule rule;
+
+  @Test
+  public void blocksWhenUploaderIsOnlyApprover() throws Exception {
+    enableRule("Code-Review", true);
+
+    PushOneCommit.Result r = createChange();
+    approve(r.getChangeId());
+
+    Collection<SubmitRecord> submitRecords =
+        rule.evaluate(r.getChange(), SubmitRuleOptions.defaults());
+
+    assertThat(submitRecords).hasSize(1);
+    SubmitRecord result = submitRecords.iterator().next();
+    assertThat(result.status).isEqualTo(SubmitRecord.Status.NOT_READY);
+    assertThat(result.labels).isNotEmpty();
+    assertThat(result.requirements)
+        .containsExactly(
+            SubmitRequirement.builder()
+                .setFallbackText("Approval from non-uploader required")
+                .setType("non_uploader_approval")
+                .build());
+  }
+
+  @Test
+  public void allowsSubmissionWhenChangeHasNonUploaderApproval() throws Exception {
+    enableRule("Code-Review", true);
+
+    // Create change as user
+    TestRepository<InMemoryRepository> userTestRepo = cloneProject(project, user);
+    PushOneCommit push = pushFactory.create(db, user.getIdent(), userTestRepo);
+    PushOneCommit.Result r = push.to("refs/for/master");
+
+    // Approve as admin
+    approve(r.getChangeId());
+
+    Collection<SubmitRecord> submitRecords =
+        rule.evaluate(r.getChange(), SubmitRuleOptions.defaults());
+    assertThat(submitRecords).isEmpty();
+  }
+
+  @Test
+  public void doesNothingByDefault() throws Exception {
+    enableRule("Code-Review", false);
+
+    PushOneCommit.Result r = createChange();
+    approve(r.getChangeId());
+
+    Collection<SubmitRecord> submitRecords =
+        rule.evaluate(r.getChange(), SubmitRuleOptions.defaults());
+    assertThat(submitRecords).isEmpty();
+  }
+
+  private void enableRule(String labelName, boolean newState) throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      Map<String, LabelType> localLabelSections = u.getConfig().getLabelSections();
+      if (localLabelSections.isEmpty()) {
+        localLabelSections.putAll(projectCache.getAllProjects().getConfig().getLabelSections());
+      }
+      localLabelSections.get(labelName).setIgnoreSelfApproval(newState);
+      u.save();
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/server/rules/PrologRuleEvaluatorIT.java b/javatests/com/google/gerrit/acceptance/server/rules/PrologRuleEvaluatorIT.java
new file mode 100644
index 0000000..8fc32b4
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/server/rules/PrologRuleEvaluatorIT.java
@@ -0,0 +1,160 @@
+// 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.
+
+package com.google.gerrit.acceptance.server.rules;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.TestAccount;
+import com.google.gerrit.common.data.SubmitRecord;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.project.SubmitRuleOptions;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.rules.PrologRuleEvaluator;
+import com.google.gerrit.testing.TestChanges;
+import com.google.inject.Inject;
+import com.googlecode.prolog_cafe.lang.IntegerTerm;
+import com.googlecode.prolog_cafe.lang.StructureTerm;
+import com.googlecode.prolog_cafe.lang.Term;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.junit.Test;
+
+public class PrologRuleEvaluatorIT extends AbstractDaemonTest {
+  @Inject private PrologRuleEvaluator.Factory evaluatorFactory;
+
+  @Test
+  public void convertsPrologToSubmitRecord() {
+    PrologRuleEvaluator evaluator = makeEvaluator();
+
+    StructureTerm verifiedLabel = makeLabel("Verified", "may");
+    StructureTerm labels = new StructureTerm("label", verifiedLabel);
+
+    List<Term> terms = ImmutableList.of(makeTerm("ok", labels));
+    Collection<SubmitRecord> records = evaluator.resultsToSubmitRecord(null, terms);
+
+    assertThat(records).hasSize(1);
+  }
+
+  /**
+   * The Prolog behavior is everything but intuitive. Several submit_rules can be defined, and each
+   * will provide a different SubmitRecord answer when queried. The current implementation stops
+   * parsing the Prolog terms into SubmitRecord objects once it finds an OK record. This might lead
+   * to tangling results, as reproduced by this test.
+   *
+   * <p>Let's consider this rules.pl file (equivalent to the code in this test)
+   *
+   * <pre>{@code
+   * submit_rule(submit(R)) :-
+   *     gerrit:uploader(U),
+   *     R = label('Verified', reject(U)).
+   *
+   * submit_rule(submit(CR, V)) :-
+   *     gerrit:uploader(U),
+   *     V = label('Code-Review', ok(U)).
+   *
+   * submit_rule(submit(R)) :-
+   *     gerrit:uploader(U),
+   *     R = label('Any-Label-Name', reject(U)).
+   * }</pre>
+   *
+   * The first submit_rule always fails because the Verified label is rejected.
+   *
+   * <p>The second submit_rule is always valid, and provides two labels: OK and Code-Review.
+   *
+   * <p>The third submit_rule always fails because the Any-Label-Name label is rejected.
+   *
+   * <p>In this case, the last two SubmitRecords are used, the first one is discarded.
+   */
+  @Test
+  public void abortsEarlyWithOkayRecord() {
+    PrologRuleEvaluator evaluator = makeEvaluator();
+
+    SubmitRecord.Label submitRecordLabel1 = new SubmitRecord.Label();
+    submitRecordLabel1.label = "Verified";
+    submitRecordLabel1.status = SubmitRecord.Label.Status.REJECT;
+    submitRecordLabel1.appliedBy = admin.id;
+
+    SubmitRecord.Label submitRecordLabel2 = new SubmitRecord.Label();
+    submitRecordLabel2.label = "Code-Review";
+    submitRecordLabel2.status = SubmitRecord.Label.Status.OK;
+    submitRecordLabel2.appliedBy = admin.id;
+
+    SubmitRecord.Label submitRecordLabel3 = new SubmitRecord.Label();
+    submitRecordLabel3.label = "Any-Label-Name";
+    submitRecordLabel3.status = SubmitRecord.Label.Status.REJECT;
+    submitRecordLabel3.appliedBy = user.id;
+
+    List<Term> terms = new ArrayList<>();
+
+    StructureTerm label1 = makeLabel(submitRecordLabel1.label, "reject", admin);
+
+    StructureTerm label2 = makeLabel(submitRecordLabel2.label, "ok", admin);
+
+    StructureTerm label3 = makeLabel(submitRecordLabel3.label, "reject", user);
+
+    terms.add(makeTerm("not_ready", makeLabels(label1)));
+    terms.add(makeTerm("ok", makeLabels(label2)));
+    terms.add(makeTerm("not_ready", makeLabels(label3)));
+
+    // When
+    List<SubmitRecord> records = evaluator.resultsToSubmitRecord(null, terms);
+
+    // assert that
+    SubmitRecord record1Expected = new SubmitRecord();
+    record1Expected.status = SubmitRecord.Status.OK;
+    record1Expected.labels = new ArrayList<>();
+    record1Expected.labels.add(submitRecordLabel2);
+
+    SubmitRecord record2Expected = new SubmitRecord();
+    record2Expected.status = SubmitRecord.Status.OK;
+    record2Expected.labels = new ArrayList<>();
+    record2Expected.labels.add(submitRecordLabel3);
+
+    assertThat(records).hasSize(2);
+
+    assertThat(records.get(0)).isEqualTo(record1Expected);
+    assertThat(records.get(1)).isEqualTo(record2Expected);
+  }
+
+  private static Term makeTerm(String status, StructureTerm labels) {
+    return new StructureTerm(status, labels);
+  }
+
+  private static StructureTerm makeLabel(String name, String status) {
+    return new StructureTerm("label", new StructureTerm(name), new StructureTerm(status));
+  }
+
+  private static StructureTerm makeLabel(String name, String status, TestAccount account) {
+    StructureTerm user = new StructureTerm("user", new IntegerTerm(account.id.get()));
+    return new StructureTerm("label", new StructureTerm(name), new StructureTerm(status, user));
+  }
+
+  private static StructureTerm makeLabels(StructureTerm... labels) {
+    return new StructureTerm("label", labels);
+  }
+
+  private ChangeData makeChangeData() {
+    ChangeData cd = ChangeData.createForTest(project, new Change.Id(1), 1);
+    cd.setChange(TestChanges.newChange(project, admin.id));
+    return cd;
+  }
+
+  private PrologRuleEvaluator makeEvaluator() {
+    return evaluatorFactory.create(makeChangeData(), SubmitRuleOptions.defaults());
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/server/rules/RulesIT.java b/javatests/com/google/gerrit/acceptance/server/rules/RulesIT.java
new file mode 100644
index 0000000..98dca3e
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/server/rules/RulesIT.java
@@ -0,0 +1,122 @@
+// 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.
+
+package com.google.gerrit.acceptance.server.rules;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.common.data.SubmitRecord;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.project.SubmitRuleEvaluator;
+import com.google.gerrit.server.project.SubmitRuleOptions;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.inject.Inject;
+import java.util.Collection;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.Repository;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Tests the Prolog rules to make sure they work even when the change and account indexes are not
+ * available.
+ */
+@NoHttpd
+public class RulesIT extends AbstractDaemonTest {
+  private static final String RULE_TEMPLATE =
+      "submit_rule(submit(W)) :- \n" + "%s,\n" + "W = label('OK', ok(user(1000000))).";
+
+  @Inject private SubmitRuleEvaluator.Factory evaluatorFactory;
+
+  @Before
+  public void setUp() {
+    // We don't want caches to interfere with our tests. If we didn't, the cache would take
+    // precedence over the index, which would never be called.
+    baseConfig.setString("cache", "changes", "memoryLimit", "0");
+    baseConfig.setString("cache", "projects", "memoryLimit", "0");
+  }
+
+  @Test
+  public void testUnresolvedCommentsCountPredicate() throws Exception {
+    modifySubmitRules("gerrit:unresolved_comments_count(0)");
+    assertThat(statusForRule()).isEqualTo(SubmitRecord.Status.OK);
+  }
+
+  @Test
+  public void testUploaderPredicate() throws Exception {
+    modifySubmitRules("gerrit:uploader(U)");
+    assertThat(statusForRule()).isEqualTo(SubmitRecord.Status.OK);
+  }
+
+  @Test
+  public void testUnresolvedCommentsCount() throws Exception {
+    modifySubmitRules("gerrit:commit_message_matches('.*')");
+    assertThat(statusForRule()).isEqualTo(SubmitRecord.Status.OK);
+  }
+
+  @Test
+  public void testUserPredicate() throws Exception {
+    modifySubmitRules(
+        String.format(
+            "gerrit:commit_author(user(%d), '%s', '%s')",
+            user.getId().get(), user.fullName, user.email));
+    assertThat(statusForRule()).isEqualTo(SubmitRecord.Status.OK);
+  }
+
+  @Test
+  public void testCommitAuthorPredicate() throws Exception {
+    modifySubmitRules("gerrit:commit_author(Id)");
+    assertThat(statusForRule()).isEqualTo(SubmitRecord.Status.OK);
+  }
+
+  private SubmitRecord.Status statusForRule() throws Exception {
+    String oldHead = getRemoteHead().name();
+    PushOneCommit.Result result1 =
+        pushFactory.create(db, user.getIdent(), testRepo).to("refs/for/master");
+    testRepo.reset(oldHead);
+    ChangeData cd = result1.getChange();
+
+    Collection<SubmitRecord> records;
+    try (AutoCloseable changeIndex = disableChangeIndex()) {
+      try (AutoCloseable accountIndex = disableAccountIndex()) {
+        SubmitRuleEvaluator ruleEvaluator = evaluatorFactory.create(SubmitRuleOptions.defaults());
+        records = ruleEvaluator.evaluate(cd);
+      }
+    }
+
+    assertThat(records).hasSize(1);
+    SubmitRecord record = records.iterator().next();
+    return record.status;
+  }
+
+  private void modifySubmitRules(String ruleTested) throws Exception {
+    String newContent = String.format(RULE_TEMPLATE, ruleTested);
+
+    try (Repository repo = repoManager.openRepository(project)) {
+      TestRepository<?> testRepo = new TestRepository<>((InMemoryRepository) repo);
+      testRepo
+          .branch(RefNames.REFS_CONFIG)
+          .commit()
+          .author(admin.getIdent())
+          .committer(admin.getIdent())
+          .add("rules.pl", newContent)
+          .message("Modify rules.pl")
+          .create();
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/ssh/AbandonRestoreIT.java b/javatests/com/google/gerrit/acceptance/ssh/AbandonRestoreIT.java
new file mode 100644
index 0000000..9d6ae44
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/ssh/AbandonRestoreIT.java
@@ -0,0 +1,80 @@
+// 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.
+
+package com.google.gerrit.acceptance.ssh;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.extensions.client.ListChangesOption.MESSAGES;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.PushOneCommit.Result;
+import com.google.gerrit.acceptance.UseSsh;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.ChangeMessageInfo;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import org.junit.Test;
+
+@NoHttpd
+@UseSsh
+public class AbandonRestoreIT extends AbstractDaemonTest {
+
+  @Test
+  public void withMessage() throws Exception {
+    Result result = createChange();
+    String commit = result.getCommit().name();
+    executeCmd(commit, "abandon", "'abandon it'");
+    executeCmd(commit, "restore", "'restore it'");
+    assertChangeMessages(
+        result.getChangeId(),
+        ImmutableList.of(
+            "Uploaded patch set 1.", "Abandoned\n\nabandon it", "Restored\n\nrestore it"));
+  }
+
+  @Test
+  public void withoutMessage() throws Exception {
+    Result result = createChange();
+    String commit = result.getCommit().name();
+    executeCmd(commit, "abandon", null);
+    executeCmd(commit, "restore", null);
+    assertChangeMessages(
+        result.getChangeId(), ImmutableList.of("Uploaded patch set 1.", "Abandoned", "Restored"));
+  }
+
+  private void executeCmd(String commit, String op, String message) throws Exception {
+    StringBuilder command =
+        new StringBuilder("gerrit review ").append(commit).append(" --").append(op);
+    if (message != null) {
+      command.append(" --message ").append(message);
+    }
+    String response = adminSshSession.exec(command.toString());
+    adminSshSession.assertSuccess();
+    assertThat(response.toLowerCase(Locale.US)).doesNotContain("error");
+  }
+
+  private void assertChangeMessages(String changeId, List<String> expected) throws Exception {
+    ChangeInfo c = get(changeId, MESSAGES);
+    Iterable<ChangeMessageInfo> messages = c.messages;
+    assertThat(messages).isNotNull();
+    assertThat(messages).hasSize(expected.size());
+    List<String> actual = new ArrayList<>();
+    for (ChangeMessageInfo info : messages) {
+      actual.add(info.message);
+    }
+    assertThat(actual).containsExactlyElementsIn(expected);
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/ssh/AbstractIndexTests.java b/javatests/com/google/gerrit/acceptance/ssh/AbstractIndexTests.java
new file mode 100644
index 0000000..ed3cdbc
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/ssh/AbstractIndexTests.java
@@ -0,0 +1,130 @@
+// 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.
+
+package com.google.gerrit.acceptance.ssh;
+
+import static com.google.common.truth.Truth.assertThat;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.base.Joiner;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.ChangeIndexedCounter;
+import com.google.gerrit.acceptance.GerritConfig;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.UseSsh;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.events.ChangeIndexedListener;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import java.util.List;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+@NoHttpd
+@UseSsh
+public abstract class AbstractIndexTests extends AbstractDaemonTest {
+  @Inject private DynamicSet<ChangeIndexedListener> changeIndexedListeners;
+
+  private ChangeIndexedCounter changeIndexedCounter;
+  private RegistrationHandle changeIndexedCounterHandle;
+
+  /** @param injector injector */
+  public abstract void configureIndex(Injector injector) throws Exception;
+
+  @Before
+  public void addChangeIndexedCounter() {
+    changeIndexedCounter = new ChangeIndexedCounter();
+    changeIndexedCounterHandle = changeIndexedListeners.add("gerrit", changeIndexedCounter);
+  }
+
+  @After
+  public void removeChangeIndexedCounter() {
+    if (changeIndexedCounterHandle != null) {
+      changeIndexedCounterHandle.remove();
+    }
+  }
+
+  @Test
+  @GerritConfig(name = "index.autoReindexIfStale", value = "false")
+  public void indexChange() throws Exception {
+    configureIndex(server.getTestInjector());
+
+    PushOneCommit.Result change = createChange("first change", "test1.txt", "test1");
+    String changeId = change.getChangeId();
+    String changeLegacyId = change.getChange().getId().toString();
+    ChangeInfo changeInfo = gApi.changes().id(changeId).get();
+
+    disableChangeIndexWrites();
+    amendChange(changeId, "second test", "test2.txt", "test2");
+
+    assertChangeQuery("message:second", change.getChange(), false);
+    enableChangeIndexWrites();
+
+    changeIndexedCounter.clear();
+    String cmd = Joiner.on(" ").join("gerrit", "index", "changes", changeLegacyId);
+    adminSshSession.exec(cmd);
+    adminSshSession.assertSuccess();
+
+    changeIndexedCounter.assertReindexOf(changeInfo, 1);
+
+    assertChangeQuery("message:second", change.getChange(), true);
+  }
+
+  @Test
+  @GerritConfig(name = "index.autoReindexIfStale", value = "false")
+  public void indexProject() throws Exception {
+    configureIndex(server.getTestInjector());
+
+    PushOneCommit.Result change = createChange("first change", "test1.txt", "test1");
+    String changeId = change.getChangeId();
+    ChangeInfo changeInfo = gApi.changes().id(changeId).get();
+
+    disableChangeIndexWrites();
+    amendChange(changeId, "second test", "test2.txt", "test2");
+
+    assertChangeQuery("message:second", change.getChange(), false);
+    enableChangeIndexWrites();
+
+    changeIndexedCounter.clear();
+    String cmd = Joiner.on(" ").join("gerrit", "index", "changes-in-project", project.get());
+    adminSshSession.exec(cmd);
+    adminSshSession.assertSuccess();
+
+    boolean indexing = true;
+    while (indexing) {
+      String out = adminSshSession.exec("gerrit show-queue --wide");
+      adminSshSession.assertSuccess();
+      indexing = out.contains("Index all changes of project " + project.get());
+    }
+
+    changeIndexedCounter.assertReindexOf(changeInfo, 1);
+
+    assertChangeQuery("message:second", change.getChange(), true);
+  }
+
+  protected void assertChangeQuery(String q, ChangeData change, boolean assertTrue)
+      throws Exception {
+    List<Integer> ids = query(q).stream().map(c -> c._number).collect(toList());
+    if (assertTrue) {
+      assertThat(ids).contains(change.getId().get());
+    } else {
+      assertThat(ids).doesNotContain(change.getId().get());
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/ssh/BUILD b/javatests/com/google/gerrit/acceptance/ssh/BUILD
new file mode 100644
index 0000000..00a0914
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/ssh/BUILD
@@ -0,0 +1,40 @@
+load("//javatests/com/google/gerrit/acceptance:tests.bzl", "acceptance_tests")
+
+java_library(
+    name = "util",
+    testonly = True,
+    srcs = ["AbstractIndexTests.java"],
+    deps = ["//java/com/google/gerrit/acceptance:lib"],
+)
+
+acceptance_tests(
+    srcs = glob(
+        ["*IT.java"],
+        exclude = ["ElasticIndexIT.java"],
+    ),
+    group = "ssh",
+    labels = ["ssh"],
+    vm_args = ["-Xmx512m"],
+    deps = [
+        ":util",
+        "//java/com/google/gerrit/server/logging",
+        "//lib/commons:compress",
+    ],
+)
+
+acceptance_tests(
+    srcs = ["ElasticIndexIT.java"],
+    group = "elastic",
+    labels = [
+        "docker",
+        "elastic",
+        "exclusive",
+        "ssh",
+    ],
+    deps = [
+        ":util",
+        "//java/com/google/gerrit/elasticsearch",
+        "//javatests/com/google/gerrit/elasticsearch:elasticsearch_test_utils",
+        "//lib/commons:compress",
+    ],
+)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/BanCommitIT.java b/javatests/com/google/gerrit/acceptance/ssh/BanCommitIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/BanCommitIT.java
rename to javatests/com/google/gerrit/acceptance/ssh/BanCommitIT.java
diff --git a/javatests/com/google/gerrit/acceptance/ssh/CreateProjectIT.java b/javatests/com/google/gerrit/acceptance/ssh/CreateProjectIT.java
new file mode 100644
index 0000000..0ce05b0
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/ssh/CreateProjectIT.java
@@ -0,0 +1,86 @@
+// Copyright (C) 2015 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.google.gerrit.acceptance.ssh;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.UseSsh;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.project.ProjectState;
+import org.junit.Test;
+
+@UseSsh
+public class CreateProjectIT extends AbstractDaemonTest {
+
+  @Test
+  public void withValidGroupName() throws Exception {
+    String newGroupName = "newGroup";
+    adminRestSession.put("/groups/" + newGroupName);
+    String newProjectName = "newProject";
+    adminSshSession.exec(
+        "gerrit create-project --branch master --owner " + newGroupName + " " + newProjectName);
+    adminSshSession.assertSuccess();
+    ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
+    assertThat(projectState).isNotNull();
+  }
+
+  @Test
+  public void withInvalidGroupName() throws Exception {
+    String newGroupName = "newGroup";
+    adminRestSession.put("/groups/" + newGroupName);
+    String wrongGroupName = "newG";
+    String newProjectName = "newProject";
+    adminSshSession.exec(
+        "gerrit create-project --branch master --owner " + wrongGroupName + " " + newProjectName);
+    adminSshSession.assertFailure();
+    ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
+    assertThat(projectState).isNull();
+  }
+
+  @Test
+  public void withDotGit() throws Exception {
+    String newGroupName = "newGroup";
+    adminRestSession.put("/groups/" + newGroupName);
+    String newProjectName = name("newProject");
+    adminSshSession.exec(
+        "gerrit create-project --branch master --owner "
+            + newGroupName
+            + " "
+            + newProjectName
+            + ".git");
+    adminSshSession.assertSuccess();
+    ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
+    assertThat(projectState).isNotNull();
+    assertThat(projectState.getName()).isEqualTo(newProjectName);
+  }
+
+  @Test
+  public void withTrailingSlash() throws Exception {
+    String newGroupName = "newGroup";
+    adminRestSession.put("/groups/" + newGroupName);
+    String newProjectName = name("newProject");
+    adminSshSession.exec(
+        "gerrit create-project --branch master --owner "
+            + newGroupName
+            + " "
+            + newProjectName
+            + "/");
+    adminSshSession.assertSuccess();
+    ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
+    assertThat(projectState).isNotNull();
+    assertThat(projectState.getName()).isEqualTo(newProjectName);
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/ssh/ElasticIndexIT.java b/javatests/com/google/gerrit/acceptance/ssh/ElasticIndexIT.java
new file mode 100644
index 0000000..05516d5
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/ssh/ElasticIndexIT.java
@@ -0,0 +1,46 @@
+// 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.
+
+package com.google.gerrit.acceptance.ssh;
+
+import static com.google.gerrit.elasticsearch.ElasticTestUtils.createAllIndexes;
+import static com.google.gerrit.elasticsearch.ElasticTestUtils.getConfig;
+
+import com.google.gerrit.elasticsearch.ElasticVersion;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.inject.Injector;
+import org.eclipse.jgit.lib.Config;
+
+public class ElasticIndexIT extends AbstractIndexTests {
+
+  @ConfigSuite.Default
+  public static Config elasticsearchV5() {
+    return getConfig(ElasticVersion.V5_6);
+  }
+
+  @ConfigSuite.Config
+  public static Config elasticsearchV6() {
+    return getConfig(ElasticVersion.V6_6);
+  }
+
+  @ConfigSuite.Config
+  public static Config elasticsearchV7() {
+    return getConfig(ElasticVersion.V7_0);
+  }
+
+  @Override
+  public void configureIndex(Injector injector) throws Exception {
+    createAllIndexes(injector);
+  }
+}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/GarbageCollectionIT.java b/javatests/com/google/gerrit/acceptance/ssh/GarbageCollectionIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/GarbageCollectionIT.java
rename to javatests/com/google/gerrit/acceptance/ssh/GarbageCollectionIT.java
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/IndexIT.java b/javatests/com/google/gerrit/acceptance/ssh/IndexIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/IndexIT.java
rename to javatests/com/google/gerrit/acceptance/ssh/IndexIT.java
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/QueryIT.java b/javatests/com/google/gerrit/acceptance/ssh/QueryIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/QueryIT.java
rename to javatests/com/google/gerrit/acceptance/ssh/QueryIT.java
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/SetReviewersIT.java b/javatests/com/google/gerrit/acceptance/ssh/SetReviewersIT.java
similarity index 100%
rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/SetReviewersIT.java
rename to javatests/com/google/gerrit/acceptance/ssh/SetReviewersIT.java
diff --git a/javatests/com/google/gerrit/acceptance/ssh/SshCommandsIT.java b/javatests/com/google/gerrit/acceptance/ssh/SshCommandsIT.java
new file mode 100644
index 0000000..eb79c18
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/ssh/SshCommandsIT.java
@@ -0,0 +1,203 @@
+// Copyright (C) 2017 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.google.gerrit.acceptance.ssh;
+
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Streams;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.Sandboxed;
+import com.google.gerrit.acceptance.UseSsh;
+import com.google.gerrit.common.data.GlobalCapability;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import org.junit.Test;
+
+@NoHttpd
+@UseSsh
+public class SshCommandsIT extends AbstractDaemonTest {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  // TODO: It would be better to dynamically generate these lists
+  private static final ImmutableList<String> COMMON_ROOT_COMMANDS =
+      ImmutableList.of(
+          "apropos",
+          "close-connection",
+          "flush-caches",
+          "gc",
+          "logging",
+          "ls-groups",
+          "ls-members",
+          "ls-projects",
+          "ls-user-refs",
+          "plugin",
+          "reload-config",
+          "show-caches",
+          "show-connections",
+          "show-queue",
+          "version");
+
+  private static final ImmutableList<String> MASTER_ONLY_ROOT_COMMANDS =
+      ImmutableList.of(
+          "ban-commit",
+          "create-account",
+          "create-branch",
+          "create-group",
+          "create-project",
+          "gsql",
+          "index",
+          "query",
+          "receive-pack",
+          "rename-group",
+          "review",
+          "set-account",
+          "set-head",
+          "set-members",
+          "set-project",
+          "set-project-parent",
+          "set-reviewers",
+          "stream-events",
+          "test-submit");
+
+  private static final ImmutableList<String> EMPTY = ImmutableList.of();
+  private static final ImmutableMap<String, List<String>> MASTER_COMMANDS =
+      ImmutableMap.<String, List<String>>builder()
+          .put("kill", EMPTY)
+          .put("ps", EMPTY)
+          // TODO(dpursehouse): Add "scp" and "suexec"
+          .put(
+              "gerrit",
+              Streams.concat(COMMON_ROOT_COMMANDS.stream(), MASTER_ONLY_ROOT_COMMANDS.stream())
+                  .sorted()
+                  .collect(toImmutableList()))
+          .put(
+              "gerrit index",
+              ImmutableList.of(
+                  "changes", "changes-in-project")) // "activate" and "start" are not included
+          .put("gerrit logging", ImmutableList.of("ls", "set"))
+          .put(
+              "gerrit plugin",
+              ImmutableList.of("add", "enable", "install", "ls", "reload", "remove", "rm"))
+          .put("gerrit test-submit", ImmutableList.of("rule", "type"))
+          .build();
+
+  private static final ImmutableMap<String, List<String>> SLAVE_COMMANDS =
+      ImmutableMap.of(
+          "kill",
+          EMPTY,
+          "gerrit",
+          COMMON_ROOT_COMMANDS,
+          "gerrit plugin",
+          ImmutableList.of("add", "enable", "install", "ls", "reload", "remove", "rm"));
+
+  @Test
+  @Sandboxed
+  public void sshCommandCanBeExecuted() throws Exception {
+    // Access Database capability is required to run the "gerrit gsql" command
+    allowGlobalCapabilities(REGISTERED_USERS, GlobalCapability.ACCESS_DATABASE);
+
+    testCommandExecution(MASTER_COMMANDS);
+
+    restartAsSlave();
+    testCommandExecution(SLAVE_COMMANDS);
+  }
+
+  private void testCommandExecution(Map<String, List<String>> commands) throws Exception {
+    for (String root : commands.keySet()) {
+      List<String> cmds = commands.get(root);
+      if (cmds.isEmpty()) {
+        testCommandExecution(root);
+      } else {
+        for (String cmd : cmds) {
+          testCommandExecution(String.format("%s %s", root, cmd));
+        }
+      }
+    }
+  }
+
+  private void testCommandExecution(String cmd) throws Exception {
+    // We can't assert that adminSshSession.hasError() is false, because using the --help
+    // option causes the usage info to be written to stderr. Instead, we assert on the
+    // content of the stderr, which will always start with "gerrit command" when the --help
+    // option is used.
+    logger.atFine().log(cmd);
+    adminSshSession.exec(String.format("%s --help", cmd));
+    String response = adminSshSession.getError();
+    assertWithMessage(String.format("command %s failed: %s", cmd, response))
+        .that(response)
+        .startsWith(cmd);
+  }
+
+  @Test
+  public void nonExistingCommandFails() throws Exception {
+    adminSshSession.exec("gerrit non-existing-command --help");
+    assertThat(adminSshSession.getError())
+        .startsWith("fatal: gerrit: non-existing-command: not found");
+  }
+
+  @Test
+  @Sandboxed
+  public void listCommands() throws Exception {
+    adminSshSession.exec("gerrit --help");
+    List<String> commands = parseCommandsFromGerritHelpText(adminSshSession.getError());
+    assertThat(commands).containsExactlyElementsIn(MASTER_COMMANDS.get("gerrit")).inOrder();
+
+    restartAsSlave();
+    adminSshSession.exec("gerrit --help");
+    commands = parseCommandsFromGerritHelpText(adminSshSession.getError());
+    assertThat(commands).containsExactlyElementsIn(SLAVE_COMMANDS.get("gerrit")).inOrder();
+  }
+
+  private List<String> parseCommandsFromGerritHelpText(String helpText) {
+    List<String> commands = new ArrayList<>();
+
+    String[] lines = helpText.split("\\n");
+
+    // Skip all lines including the line starting with "Available commands"
+    int row = 0;
+    do {
+      row++;
+    } while (row < lines.length && !lines[row - 1].startsWith("Available commands"));
+
+    // Skip all empty lines
+    while (lines[row].trim().isEmpty()) {
+      row++;
+    }
+
+    // Parse commands from all lines that are indented (start with a space)
+    while (row < lines.length && lines[row].startsWith(" ")) {
+      String line = lines[row].trim();
+      // Abort on empty line
+      if (line.isEmpty()) {
+        break;
+      }
+
+      // Cut off command description if there is one
+      int endOfCommand = line.indexOf(' ');
+      commands.add(endOfCommand > 0 ? line.substring(0, line.indexOf(' ')) : line);
+      row++;
+    }
+
+    return commands;
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/ssh/SshTraceIT.java b/javatests/com/google/gerrit/acceptance/ssh/SshTraceIT.java
new file mode 100644
index 0000000..899b0cf
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/ssh/SshTraceIT.java
@@ -0,0 +1,92 @@
+package com.google.gerrit.acceptance.ssh;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.Iterables;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.UseSsh;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import com.google.gerrit.server.logging.LoggingContext;
+import com.google.gerrit.server.logging.RequestId;
+import com.google.gerrit.server.project.CreateProjectArgs;
+import com.google.gerrit.server.validators.ProjectCreationValidationListener;
+import com.google.gerrit.server.validators.ValidationException;
+import com.google.inject.Inject;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+@UseSsh
+public class SshTraceIT extends AbstractDaemonTest {
+  @Inject private DynamicSet<ProjectCreationValidationListener> projectCreationValidationListeners;
+
+  private TraceValidatingProjectCreationValidationListener projectCreationListener;
+  private RegistrationHandle projectCreationListenerRegistrationHandle;
+
+  @Before
+  public void setup() {
+    projectCreationListener = new TraceValidatingProjectCreationValidationListener();
+    projectCreationListenerRegistrationHandle =
+        projectCreationValidationListeners.add("gerrit", projectCreationListener);
+  }
+
+  @After
+  public void cleanup() {
+    projectCreationListenerRegistrationHandle.remove();
+  }
+
+  @Test
+  public void sshCallWithoutTrace() throws Exception {
+    adminSshSession.exec("gerrit create-project new1");
+    adminSshSession.assertSuccess();
+    assertThat(projectCreationListener.traceId).isNull();
+    assertThat(projectCreationListener.foundTraceId).isFalse();
+    assertThat(projectCreationListener.isLoggingForced).isFalse();
+  }
+
+  @Test
+  public void sshCallWithTrace() throws Exception {
+    adminSshSession.exec("gerrit create-project --trace new2");
+
+    // The trace ID is written to stderr.
+    adminSshSession.assertFailure(RequestId.Type.TRACE_ID.name());
+
+    assertThat(projectCreationListener.traceId).isNotNull();
+    assertThat(projectCreationListener.foundTraceId).isTrue();
+    assertThat(projectCreationListener.isLoggingForced).isTrue();
+  }
+
+  @Test
+  public void sshCallWithTraceAndProvidedTraceId() throws Exception {
+    adminSshSession.exec("gerrit create-project --trace --trace-id issue/123 new3");
+
+    // The trace ID is written to stderr.
+    adminSshSession.assertFailure(RequestId.Type.TRACE_ID.name());
+
+    assertThat(projectCreationListener.traceId).isEqualTo("issue/123");
+    assertThat(projectCreationListener.foundTraceId).isTrue();
+    assertThat(projectCreationListener.isLoggingForced).isTrue();
+  }
+
+  @Test
+  public void sshCallWithTraceIdAndWithoutTraceFails() throws Exception {
+    adminSshSession.exec("gerrit create-project --trace-id issue/123 new3");
+    adminSshSession.assertFailure("A trace ID can only be set if --trace was specified.");
+  }
+
+  private static class TraceValidatingProjectCreationValidationListener
+      implements ProjectCreationValidationListener {
+    String traceId;
+    Boolean foundTraceId;
+    Boolean isLoggingForced;
+
+    @Override
+    public void validateNewProject(CreateProjectArgs args) throws ValidationException {
+      this.traceId =
+          Iterables.getFirst(LoggingContext.getInstance().getTagsAsMap().get("TRACE_ID"), null);
+      this.foundTraceId = traceId != null;
+      this.isLoggingForced = LoggingContext.getInstance().shouldForceLogging(null, null, false);
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/ssh/UploadArchiveIT.java b/javatests/com/google/gerrit/acceptance/ssh/UploadArchiveIT.java
new file mode 100644
index 0000000..93fc769
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/ssh/UploadArchiveIT.java
@@ -0,0 +1,168 @@
+// Copyright (C) 2015 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.google.gerrit.acceptance.ssh;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+
+import com.google.common.base.Splitter;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.GerritConfig;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.UseSsh;
+import com.google.gerrit.testing.NoteDbMode;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.util.Set;
+import java.util.TreeSet;
+import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
+import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
+import org.eclipse.jgit.transport.PacketLineIn;
+import org.eclipse.jgit.transport.PacketLineOut;
+import org.eclipse.jgit.util.IO;
+import org.junit.Before;
+import org.junit.Test;
+
+@NoHttpd
+@UseSsh
+public class UploadArchiveIT extends AbstractDaemonTest {
+
+  @Before
+  public void setUp() {
+    // There is some Guice request scoping problem preventing this test from
+    // passing in CHECK mode.
+    assume().that(NoteDbMode.get()).isNotEqualTo(NoteDbMode.CHECK);
+  }
+
+  @Test
+  @GerritConfig(name = "download.archive", value = "off")
+  public void archiveFeatureOff() throws Exception {
+    assertArchiveNotPermitted();
+  }
+
+  @Test
+  @GerritConfig(
+      name = "download.archive",
+      values = {"tar", "tbz2", "tgz", "txz"})
+  public void zipFormatDisabled() throws Exception {
+    assertArchiveNotPermitted();
+  }
+
+  @Test
+  public void zipFormat() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String abbreviated = r.getCommit().abbreviate(8).name();
+    String c = command(r, "zip", abbreviated);
+
+    InputStream out =
+        adminSshSession.exec2("git-upload-archive " + project.get(), argumentsToInputStream(c));
+
+    // Wrap with PacketLineIn to read ACK bytes from output stream
+    PacketLineIn in = new PacketLineIn(out);
+    String tmp = in.readString();
+    assertThat(tmp).isEqualTo("ACK");
+    in.readString();
+
+    // Skip length (4 bytes) + 1 byte
+    // to position the output stream to the raw zip stream
+    byte[] buffer = new byte[5];
+    IO.readFully(out, buffer, 0, 5);
+    Set<String> entryNames = new TreeSet<>();
+    try (ZipArchiveInputStream zip = new ZipArchiveInputStream(out)) {
+      ZipArchiveEntry zipEntry = zip.getNextZipEntry();
+      while (zipEntry != null) {
+        String name = zipEntry.getName();
+        entryNames.add(name);
+        zipEntry = zip.getNextZipEntry();
+      }
+    }
+
+    assertThat(entryNames)
+        .containsExactly(
+            String.format("%s/", abbreviated),
+            String.format("%s/%s", abbreviated, PushOneCommit.FILE_NAME))
+        .inOrder();
+  }
+
+  // Make sure we have coverage for the dependency on xz.
+  @Test
+  public void txzFormat() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String abbreviated = r.getCommit().abbreviate(8).name();
+    String c = command(r, "tar.xz", abbreviated);
+
+    try (InputStream out =
+        adminSshSession.exec2("git-upload-archive " + project.get(), argumentsToInputStream(c))) {
+
+      // Wrap with PacketLineIn to read ACK bytes from output stream
+      PacketLineIn in = new PacketLineIn(out);
+      String packet = in.readString();
+      assertThat(packet).isEqualTo("ACK");
+
+      // Discard first bit of data, which should be empty.
+      packet = in.readString();
+      assertThat(packet).isEmpty();
+
+      // Make sure the next one is not on the error channel
+      packet = in.readString();
+
+      // 1 = DATA. It would be nicer to parse the OutputStream with SideBandInputStream from JGit,
+      // but
+      // that is currently not public.
+      char channel = packet.charAt(0);
+      if (channel != 1) {
+        fail("got packet on channel " + (int) channel, packet);
+      }
+    }
+  }
+
+  private String command(PushOneCommit.Result r, String format, String abbreviated) {
+    String c =
+        String.format(
+            "-f=%s --prefix=%s/ %s %s",
+            format, abbreviated, r.getCommit().name(), PushOneCommit.FILE_NAME);
+    return c;
+  }
+
+  private void assertArchiveNotPermitted() throws Exception {
+    PushOneCommit.Result r = createChange();
+    String abbreviated = r.getCommit().abbreviate(8).name();
+    String c = command(r, "zip", abbreviated);
+
+    InputStream out =
+        adminSshSession.exec2("git-upload-archive " + project.get(), argumentsToInputStream(c));
+
+    // Wrap with PacketLineIn to read ACK bytes from output stream
+    PacketLineIn in = new PacketLineIn(out);
+    String tmp = in.readString();
+    assertThat(tmp).isEqualTo("ACK");
+    in.readString();
+    tmp = in.readString();
+    tmp = tmp.substring(1);
+    assertThat(tmp).isEqualTo("fatal: upload-archive not permitted for format zip");
+  }
+
+  private InputStream argumentsToInputStream(String c) throws Exception {
+    ByteArrayOutputStream out = new ByteArrayOutputStream();
+    PacketLineOut pctOut = new PacketLineOut(out);
+    for (String arg : Splitter.on(' ').split(c)) {
+      pctOut.writeString("argument " + arg);
+    }
+    pctOut.end();
+    return new ByteArrayInputStream(out.toByteArray());
+  }
+}
diff --git a/javatests/com/google/gerrit/acceptance/tests.bzl b/javatests/com/google/gerrit/acceptance/tests.bzl
new file mode 100644
index 0000000..08556a0
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/tests.bzl
@@ -0,0 +1,21 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+def acceptance_tests(
+        group,
+        deps = [],
+        labels = [],
+        vm_args = ["-Xmx256m"],
+        **kwargs):
+    junit_tests(
+        name = group,
+        deps = deps + [
+            "//java/com/google/gerrit/acceptance:lib",
+        ],
+        tags = labels + [
+            "acceptance",
+            "slow",
+        ],
+        size = "large",
+        jvm_flags = vm_args,
+        **kwargs
+    )
diff --git a/javatests/com/google/gerrit/acceptance/testsuite/group/GroupOperationsImplTest.java b/javatests/com/google/gerrit/acceptance/testsuite/group/GroupOperationsImplTest.java
new file mode 100644
index 0000000..954b0e6
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/testsuite/group/GroupOperationsImplTest.java
@@ -0,0 +1,656 @@
+// 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.
+
+package com.google.gerrit.acceptance.testsuite.group;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth8.assertThat;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.truth.Correspondence;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.testsuite.account.AccountOperations;
+import com.google.gerrit.extensions.api.groups.GroupInput;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.inject.Inject;
+import java.sql.Timestamp;
+import java.util.Objects;
+import java.util.Optional;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+public class GroupOperationsImplTest extends AbstractDaemonTest {
+
+  @Rule public ExpectedException expectedException = ExpectedException.none();
+
+  @Inject private AccountOperations accountOperations;
+
+  @Inject private GroupOperationsImpl groupOperations;
+
+  private int uniqueGroupNameIndex;
+
+  @Test
+  public void groupCanBeCreatedWithoutSpecifyingAnyParameters() throws Exception {
+    AccountGroup.UUID groupUuid = groupOperations.newGroup().create();
+
+    GroupInfo foundGroup = getGroupFromServer(groupUuid);
+    assertThat(foundGroup.id).isEqualTo(groupUuid.get());
+    assertThat(foundGroup.name).isNotEmpty();
+  }
+
+  @Test
+  public void twoGroupsWithoutAnyParametersDoNotClash() throws Exception {
+    AccountGroup.UUID groupUuid1 = groupOperations.newGroup().create();
+    AccountGroup.UUID groupUuid2 = groupOperations.newGroup().create();
+
+    TestGroup group1 = groupOperations.group(groupUuid1).get();
+    TestGroup group2 = groupOperations.group(groupUuid2).get();
+    assertThat(group1.groupUuid()).isNotEqualTo(group2.groupUuid());
+  }
+
+  @Test
+  public void groupCreatedByTestApiCanBeRetrievedViaOfficialApi() throws Exception {
+    AccountGroup.UUID groupUuid =
+        groupOperations.newGroup().name("unique group created via test API").create();
+
+    GroupInfo foundGroup = getGroupFromServer(groupUuid);
+    assertThat(foundGroup.id).isEqualTo(groupUuid.get());
+    assertThat(foundGroup.name).isEqualTo("unique group created via test API");
+  }
+
+  @Test
+  public void specifiedNameIsRespectedForGroupCreation() throws Exception {
+    AccountGroup.UUID groupUuid =
+        groupOperations.newGroup().name("XYZ-123-this-name-must-be-unique").create();
+
+    GroupInfo group = getGroupFromServer(groupUuid);
+    assertThat(group.name).isEqualTo("XYZ-123-this-name-must-be-unique");
+  }
+
+  @Test
+  public void specifiedDescriptionIsRespectedForGroupCreation() throws Exception {
+    AccountGroup.UUID groupUuid =
+        groupOperations.newGroup().description("All authenticated users").create();
+
+    GroupInfo group = getGroupFromServer(groupUuid);
+    assertThat(group.description).isEqualTo("All authenticated users");
+  }
+
+  @Test
+  public void requestingNoDescriptionIsPossibleForGroupCreation() throws Exception {
+    AccountGroup.UUID groupUuid = groupOperations.newGroup().clearDescription().create();
+
+    GroupInfo group = getGroupFromServer(groupUuid);
+    assertThat(group.description).isNull();
+  }
+
+  @Test
+  public void specifiedOwnerIsRespectedForGroupCreation() throws Exception {
+    AccountGroup.UUID ownerGroupUuid = groupOperations.newGroup().create();
+
+    AccountGroup.UUID groupUuid =
+        groupOperations.newGroup().ownerGroupUuid(ownerGroupUuid).create();
+
+    GroupInfo foundGroup = getGroupFromServer(groupUuid);
+    assertThat(foundGroup.ownerId).isEqualTo(ownerGroupUuid.get());
+  }
+
+  @Test
+  public void specifiedVisibilityIsRespectedForGroupCreation() throws Exception {
+    AccountGroup.UUID group1Uuid = groupOperations.newGroup().visibleToAll(true).create();
+    AccountGroup.UUID group2Uuid = groupOperations.newGroup().visibleToAll(false).create();
+
+    GroupInfo foundGroup1 = getGroupFromServer(group1Uuid);
+    GroupInfo foundGroup2 = getGroupFromServer(group2Uuid);
+    assertThat(foundGroup1.options.visibleToAll).isTrue();
+    // False == null
+    assertThat(foundGroup2.options.visibleToAll).isNull();
+  }
+
+  @Test
+  public void specifiedMembersAreRespectedForGroupCreation() throws Exception {
+    Account.Id account1Id = accountOperations.newAccount().create();
+    Account.Id account2Id = accountOperations.newAccount().create();
+    Account.Id account3Id = accountOperations.newAccount().create();
+    Account.Id account4Id = accountOperations.newAccount().create();
+
+    AccountGroup.UUID groupUuid =
+        groupOperations
+            .newGroup()
+            .members(account1Id, account2Id)
+            .addMember(account3Id)
+            .addMember(account4Id)
+            .create();
+
+    GroupInfo foundGroup = getGroupFromServer(groupUuid);
+    assertThat(foundGroup.members)
+        .comparingElementsUsing(getAccountToIdCorrespondence())
+        .containsExactly(account1Id, account2Id, account3Id, account4Id);
+  }
+
+  @Test
+  public void directlyAddingMembersIsPossibleForGroupCreation() throws Exception {
+    Account.Id account1Id = accountOperations.newAccount().create();
+    Account.Id account2Id = accountOperations.newAccount().create();
+
+    AccountGroup.UUID groupUuid =
+        groupOperations.newGroup().addMember(account1Id).addMember(account2Id).create();
+
+    GroupInfo foundGroup = getGroupFromServer(groupUuid);
+    assertThat(foundGroup.members)
+        .comparingElementsUsing(getAccountToIdCorrespondence())
+        .containsExactly(account1Id, account2Id);
+  }
+
+  @Test
+  public void requestingNoMembersIsPossibleForGroupCreation() throws Exception {
+    AccountGroup.UUID groupUuid = groupOperations.newGroup().clearMembers().create();
+
+    GroupInfo foundGroup = getGroupFromServer(groupUuid);
+    assertThat(foundGroup.members).isEmpty();
+  }
+
+  @Test
+  public void specifiedSubgroupsAreRespectedForGroupCreation() throws Exception {
+    AccountGroup.UUID group1Uuid = groupOperations.newGroup().create();
+    AccountGroup.UUID group2Uuid = groupOperations.newGroup().create();
+    AccountGroup.UUID group3Uuid = groupOperations.newGroup().create();
+    AccountGroup.UUID group4Uuid = groupOperations.newGroup().create();
+
+    AccountGroup.UUID groupUuid =
+        groupOperations
+            .newGroup()
+            .subgroups(group1Uuid, group2Uuid)
+            .addSubgroup(group3Uuid)
+            .addSubgroup(group4Uuid)
+            .create();
+
+    GroupInfo foundGroup = getGroupFromServer(groupUuid);
+    assertThat(foundGroup.includes)
+        .comparingElementsUsing(getGroupToUuidCorrespondence())
+        .containsExactly(group1Uuid, group2Uuid, group3Uuid, group4Uuid);
+  }
+
+  @Test
+  public void directlyAddingSubgroupsIsPossibleForGroupCreation() throws Exception {
+    AccountGroup.UUID group1Uuid = groupOperations.newGroup().create();
+    AccountGroup.UUID group2Uuid = groupOperations.newGroup().create();
+
+    AccountGroup.UUID groupUuid =
+        groupOperations.newGroup().addSubgroup(group1Uuid).addSubgroup(group2Uuid).create();
+
+    GroupInfo foundGroup = getGroupFromServer(groupUuid);
+    assertThat(foundGroup.includes)
+        .comparingElementsUsing(getGroupToUuidCorrespondence())
+        .containsExactly(group1Uuid, group2Uuid);
+  }
+
+  @Test
+  public void requestingNoSubgroupsIsPossibleForGroupCreation() throws Exception {
+    AccountGroup.UUID groupUuid = groupOperations.newGroup().clearSubgroups().create();
+
+    GroupInfo foundGroup = getGroupFromServer(groupUuid);
+    assertThat(foundGroup.includes).isEmpty();
+  }
+
+  @Test
+  public void existingGroupCanBeCheckedForExistence() throws Exception {
+    AccountGroup.UUID groupUuid = createGroupInServer(createArbitraryGroupInput());
+
+    boolean exists = groupOperations.group(groupUuid).exists();
+
+    assertThat(exists).isTrue();
+  }
+
+  @Test
+  public void notExistingGroupCanBeCheckedForExistence() throws Exception {
+    AccountGroup.UUID notExistingGroupUuid = new AccountGroup.UUID("not-existing-group");
+
+    boolean exists = groupOperations.group(notExistingGroupUuid).exists();
+
+    assertThat(exists).isFalse();
+  }
+
+  @Test
+  public void retrievingNotExistingGroupFails() throws Exception {
+    AccountGroup.UUID notExistingGroupUuid = new AccountGroup.UUID("not-existing-group");
+
+    expectedException.expect(IllegalStateException.class);
+    groupOperations.group(notExistingGroupUuid).get();
+  }
+
+  @Test
+  public void groupNotCreatedByTestApiCanBeRetrieved() throws Exception {
+    GroupInput input = createArbitraryGroupInput();
+    input.name = "unique group not created via test API";
+    AccountGroup.UUID groupUuid = createGroupInServer(input);
+
+    TestGroup foundGroup = groupOperations.group(groupUuid).get();
+
+    assertThat(foundGroup.groupUuid()).isEqualTo(groupUuid);
+    assertThat(foundGroup.name()).isEqualTo("unique group not created via test API");
+  }
+
+  @Test
+  public void uuidOfExistingGroupCanBeRetrieved() throws Exception {
+    AccountGroup.UUID groupUuid = groupOperations.newGroup().create();
+
+    AccountGroup.UUID foundGroupUuid = groupOperations.group(groupUuid).get().groupUuid();
+
+    assertThat(foundGroupUuid).isEqualTo(groupUuid);
+  }
+
+  @Test
+  public void nameOfExistingGroupCanBeRetrieved() throws Exception {
+    AccountGroup.UUID groupUuid =
+        groupOperations.newGroup().name("ABC-789-this-name-must-be-unique").create();
+
+    String groupName = groupOperations.group(groupUuid).get().name();
+
+    assertThat(groupName).isEqualTo("ABC-789-this-name-must-be-unique");
+  }
+
+  @Test
+  public void nameKeyOfExistingGroupCanBeRetrieved() throws Exception {
+    AccountGroup.UUID groupUuid =
+        groupOperations.newGroup().name("ABC-789-this-name-must-be-unique").create();
+
+    AccountGroup.NameKey groupName = groupOperations.group(groupUuid).get().nameKey();
+
+    assertThat(groupName).isEqualTo(new AccountGroup.NameKey("ABC-789-this-name-must-be-unique"));
+  }
+
+  @Test
+  public void descriptionOfExistingGroupCanBeRetrieved() throws Exception {
+    AccountGroup.UUID groupUuid =
+        groupOperations
+            .newGroup()
+            .description("This is a very detailed description of this group.")
+            .create();
+
+    Optional<String> description = groupOperations.group(groupUuid).get().description();
+
+    assertThat(description).hasValue("This is a very detailed description of this group.");
+  }
+
+  @Test
+  public void emptyDescriptionOfExistingGroupCanBeRetrieved() throws Exception {
+    AccountGroup.UUID groupUuid = groupOperations.newGroup().clearDescription().create();
+
+    Optional<String> description = groupOperations.group(groupUuid).get().description();
+
+    assertThat(description).isEmpty();
+  }
+
+  @Test
+  public void ownerGroupUuidOfExistingGroupCanBeRetrieved() throws Exception {
+    AccountGroup.UUID originalOwnerGroupUuid = new AccountGroup.UUID("owner group");
+    AccountGroup.UUID groupUuid =
+        groupOperations.newGroup().ownerGroupUuid(originalOwnerGroupUuid).create();
+
+    AccountGroup.UUID ownerGroupUuid = groupOperations.group(groupUuid).get().ownerGroupUuid();
+
+    assertThat(ownerGroupUuid).isEqualTo(originalOwnerGroupUuid);
+  }
+
+  @Test
+  public void visibilityOfExistingGroupCanBeRetrieved() throws Exception {
+    AccountGroup.UUID visibleGroupUuid = groupOperations.newGroup().visibleToAll(true).create();
+    AccountGroup.UUID invisibleGroupUuid = groupOperations.newGroup().visibleToAll(false).create();
+
+    TestGroup visibleGroup = groupOperations.group(visibleGroupUuid).get();
+    TestGroup invisibleGroup = groupOperations.group(invisibleGroupUuid).get();
+
+    assertThat(visibleGroup.visibleToAll()).named("visibility of visible group").isTrue();
+    assertThat(invisibleGroup.visibleToAll()).named("visibility of invisible group").isFalse();
+  }
+
+  @Test
+  public void createdOnOfExistingGroupCanBeRetrieved() throws Exception {
+    GroupInfo group = gApi.groups().create(createArbitraryGroupInput()).detail();
+    AccountGroup.UUID groupUuid = new AccountGroup.UUID(group.id);
+
+    Timestamp createdOn = groupOperations.group(groupUuid).get().createdOn();
+
+    assertThat(createdOn).isEqualTo(group.createdOn);
+  }
+
+  @Test
+  public void membersOfExistingGroupCanBeRetrieved() throws Exception {
+    Account.Id memberId1 = new Account.Id(1000);
+    Account.Id memberId2 = new Account.Id(2000);
+    Account.Id memberId3 = new Account.Id(3000);
+    AccountGroup.UUID groupUuid =
+        groupOperations.newGroup().members(memberId1, memberId2, memberId3).create();
+
+    ImmutableSet<Account.Id> members = groupOperations.group(groupUuid).get().members();
+
+    assertThat(members).containsExactly(memberId1, memberId2, memberId3);
+  }
+
+  @Test
+  public void emptyMembersOfExistingGroupCanBeRetrieved() throws Exception {
+    AccountGroup.UUID groupUuid = groupOperations.newGroup().clearMembers().create();
+
+    ImmutableSet<Account.Id> members = groupOperations.group(groupUuid).get().members();
+
+    assertThat(members).isEmpty();
+  }
+
+  @Test
+  public void subgroupsOfExistingGroupCanBeRetrieved() throws Exception {
+    AccountGroup.UUID subgroupUuid1 = new AccountGroup.UUID("subgroup 1");
+    AccountGroup.UUID subgroupUuid2 = new AccountGroup.UUID("subgroup 2");
+    AccountGroup.UUID subgroupUuid3 = new AccountGroup.UUID("subgroup 3");
+    AccountGroup.UUID groupUuid =
+        groupOperations.newGroup().subgroups(subgroupUuid1, subgroupUuid2, subgroupUuid3).create();
+
+    ImmutableSet<AccountGroup.UUID> subgroups = groupOperations.group(groupUuid).get().subgroups();
+
+    assertThat(subgroups).containsExactly(subgroupUuid1, subgroupUuid2, subgroupUuid3);
+  }
+
+  @Test
+  public void emptySubgroupsOfExistingGroupCanBeRetrieved() throws Exception {
+    AccountGroup.UUID groupUuid = groupOperations.newGroup().clearSubgroups().create();
+
+    ImmutableSet<AccountGroup.UUID> subgroups = groupOperations.group(groupUuid).get().subgroups();
+
+    assertThat(subgroups).isEmpty();
+  }
+
+  @Test
+  public void updateWithoutAnyParametersIsANoop() throws Exception {
+    AccountGroup.UUID groupUuid = groupOperations.newGroup().create();
+    TestGroup originalGroup = groupOperations.group(groupUuid).get();
+
+    groupOperations.group(groupUuid).forUpdate().update();
+
+    TestGroup updatedGroup = groupOperations.group(groupUuid).get();
+    assertThat(updatedGroup).isEqualTo(originalGroup);
+  }
+
+  @Test
+  public void updateWritesToInternalGroupSystem() throws Exception {
+    AccountGroup.UUID groupUuid =
+        groupOperations.newGroup().description("original description").create();
+
+    groupOperations.group(groupUuid).forUpdate().description("updated description").update();
+
+    String currentDescription = getGroupFromServer(groupUuid).description;
+    assertThat(currentDescription).isEqualTo("updated description");
+  }
+
+  @Test
+  public void nameCanBeUpdated() throws Exception {
+    AccountGroup.UUID groupUuid = groupOperations.newGroup().name("original name").create();
+
+    groupOperations.group(groupUuid).forUpdate().name("updated name").update();
+
+    String currentName = groupOperations.group(groupUuid).get().name();
+    assertThat(currentName).isEqualTo("updated name");
+  }
+
+  @Test
+  public void descriptionCanBeUpdated() throws Exception {
+    AccountGroup.UUID groupUuid =
+        groupOperations.newGroup().description("original description").create();
+
+    groupOperations.group(groupUuid).forUpdate().description("updated description").update();
+
+    Optional<String> currentDescription = groupOperations.group(groupUuid).get().description();
+    assertThat(currentDescription).hasValue("updated description");
+  }
+
+  @Test
+  public void descriptionCanBeCleared() throws Exception {
+    AccountGroup.UUID groupUuid =
+        groupOperations.newGroup().description("original description").create();
+
+    groupOperations.group(groupUuid).forUpdate().clearDescription().update();
+
+    Optional<String> currentDescription = groupOperations.group(groupUuid).get().description();
+    assertThat(currentDescription).isEmpty();
+  }
+
+  @Test
+  public void ownerGroupUuidCanBeUpdated() throws Exception {
+    AccountGroup.UUID originalOwnerGroupUuid = new AccountGroup.UUID("original owner");
+    AccountGroup.UUID groupUuid =
+        groupOperations.newGroup().ownerGroupUuid(originalOwnerGroupUuid).create();
+
+    AccountGroup.UUID updatedOwnerGroupUuid = new AccountGroup.UUID("updated owner");
+    groupOperations.group(groupUuid).forUpdate().ownerGroupUuid(updatedOwnerGroupUuid).update();
+
+    AccountGroup.UUID currentOwnerGroupUuid =
+        groupOperations.group(groupUuid).get().ownerGroupUuid();
+    assertThat(currentOwnerGroupUuid).isEqualTo(updatedOwnerGroupUuid);
+  }
+
+  @Test
+  public void visibilityCanBeUpdated() throws Exception {
+    AccountGroup.UUID groupUuid = groupOperations.newGroup().visibleToAll(true).create();
+
+    groupOperations.group(groupUuid).forUpdate().visibleToAll(false).update();
+
+    boolean visibleToAll = groupOperations.group(groupUuid).get().visibleToAll();
+    assertThat(visibleToAll).isFalse();
+  }
+
+  @Test
+  public void membersCanBeAdded() throws Exception {
+    AccountGroup.UUID groupUuid = groupOperations.newGroup().clearMembers().create();
+
+    Account.Id memberId1 = new Account.Id(1000);
+    Account.Id memberId2 = new Account.Id(2000);
+    groupOperations.group(groupUuid).forUpdate().addMember(memberId1).addMember(memberId2).update();
+
+    ImmutableSet<Account.Id> members = groupOperations.group(groupUuid).get().members();
+    assertThat(members).containsExactly(memberId1, memberId2);
+  }
+
+  @Test
+  public void membersCanBeRemoved() throws Exception {
+    Account.Id memberId1 = new Account.Id(1000);
+    Account.Id memberId2 = new Account.Id(2000);
+    AccountGroup.UUID groupUuid = groupOperations.newGroup().members(memberId1, memberId2).create();
+
+    groupOperations.group(groupUuid).forUpdate().removeMember(memberId2).update();
+
+    ImmutableSet<Account.Id> members = groupOperations.group(groupUuid).get().members();
+    assertThat(members).containsExactly(memberId1);
+  }
+
+  @Test
+  public void memberAdditionAndRemovalCanBeMixed() throws Exception {
+    Account.Id memberId1 = new Account.Id(1000);
+    Account.Id memberId2 = new Account.Id(2000);
+    AccountGroup.UUID groupUuid = groupOperations.newGroup().members(memberId1, memberId2).create();
+
+    Account.Id memberId3 = new Account.Id(3000);
+    groupOperations
+        .group(groupUuid)
+        .forUpdate()
+        .removeMember(memberId1)
+        .addMember(memberId3)
+        .update();
+
+    ImmutableSet<Account.Id> members = groupOperations.group(groupUuid).get().members();
+    assertThat(members).containsExactly(memberId2, memberId3);
+  }
+
+  @Test
+  public void membersCanBeCleared() throws Exception {
+    Account.Id memberId1 = new Account.Id(1000);
+    Account.Id memberId2 = new Account.Id(2000);
+    AccountGroup.UUID groupUuid = groupOperations.newGroup().members(memberId1, memberId2).create();
+
+    groupOperations.group(groupUuid).forUpdate().clearMembers().update();
+
+    ImmutableSet<Account.Id> members = groupOperations.group(groupUuid).get().members();
+    assertThat(members).isEmpty();
+  }
+
+  @Test
+  public void furtherMembersCanBeAddedAfterClearingAll() throws Exception {
+    Account.Id memberId1 = new Account.Id(1000);
+    Account.Id memberId2 = new Account.Id(2000);
+    AccountGroup.UUID groupUuid = groupOperations.newGroup().members(memberId1, memberId2).create();
+
+    Account.Id memberId3 = new Account.Id(3000);
+    groupOperations.group(groupUuid).forUpdate().clearMembers().addMember(memberId3).update();
+
+    ImmutableSet<Account.Id> members = groupOperations.group(groupUuid).get().members();
+    assertThat(members).containsExactly(memberId3);
+  }
+
+  @Test
+  public void subgroupsCanBeAdded() throws Exception {
+    AccountGroup.UUID groupUuid = groupOperations.newGroup().clearSubgroups().create();
+
+    AccountGroup.UUID subgroupUuid1 = new AccountGroup.UUID("subgroup 1");
+    AccountGroup.UUID subgroupUuid2 = new AccountGroup.UUID("subgroup 2");
+    groupOperations
+        .group(groupUuid)
+        .forUpdate()
+        .addSubgroup(subgroupUuid1)
+        .addSubgroup(subgroupUuid2)
+        .update();
+
+    ImmutableSet<AccountGroup.UUID> subgroups = groupOperations.group(groupUuid).get().subgroups();
+    assertThat(subgroups).containsExactly(subgroupUuid1, subgroupUuid2);
+  }
+
+  @Test
+  public void subgroupsCanBeRemoved() throws Exception {
+    AccountGroup.UUID subgroupUuid1 = new AccountGroup.UUID("subgroup 1");
+    AccountGroup.UUID subgroupUuid2 = new AccountGroup.UUID("subgroup 2");
+    AccountGroup.UUID groupUuid =
+        groupOperations.newGroup().subgroups(subgroupUuid1, subgroupUuid2).create();
+
+    groupOperations.group(groupUuid).forUpdate().removeSubgroup(subgroupUuid2).update();
+
+    ImmutableSet<AccountGroup.UUID> subgroups = groupOperations.group(groupUuid).get().subgroups();
+    assertThat(subgroups).containsExactly(subgroupUuid1);
+  }
+
+  @Test
+  public void subgroupAdditionAndRemovalCanBeMixed() throws Exception {
+    AccountGroup.UUID subgroupUuid1 = new AccountGroup.UUID("subgroup 1");
+    AccountGroup.UUID subgroupUuid2 = new AccountGroup.UUID("subgroup 2");
+    AccountGroup.UUID groupUuid =
+        groupOperations.newGroup().subgroups(subgroupUuid1, subgroupUuid2).create();
+
+    AccountGroup.UUID subgroupUuid3 = new AccountGroup.UUID("subgroup 3");
+    groupOperations
+        .group(groupUuid)
+        .forUpdate()
+        .removeSubgroup(subgroupUuid1)
+        .addSubgroup(subgroupUuid3)
+        .update();
+
+    ImmutableSet<AccountGroup.UUID> subgroups = groupOperations.group(groupUuid).get().subgroups();
+    assertThat(subgroups).containsExactly(subgroupUuid2, subgroupUuid3);
+  }
+
+  @Test
+  public void subgroupsCanBeCleared() throws Exception {
+    AccountGroup.UUID subgroupUuid1 = new AccountGroup.UUID("subgroup 1");
+    AccountGroup.UUID subgroupUuid2 = new AccountGroup.UUID("subgroup 2");
+    AccountGroup.UUID groupUuid =
+        groupOperations.newGroup().subgroups(subgroupUuid1, subgroupUuid2).create();
+
+    groupOperations.group(groupUuid).forUpdate().clearSubgroups().update();
+
+    ImmutableSet<AccountGroup.UUID> subgroups = groupOperations.group(groupUuid).get().subgroups();
+    assertThat(subgroups).isEmpty();
+  }
+
+  @Test
+  public void furtherSubgroupsCanBeAddedAfterClearingAll() throws Exception {
+    AccountGroup.UUID subgroupUuid1 = new AccountGroup.UUID("subgroup 1");
+    AccountGroup.UUID subgroupUuid2 = new AccountGroup.UUID("subgroup 2");
+    AccountGroup.UUID groupUuid =
+        groupOperations.newGroup().subgroups(subgroupUuid1, subgroupUuid2).create();
+
+    AccountGroup.UUID subgroupUuid3 = new AccountGroup.UUID("subgroup 3");
+    groupOperations
+        .group(groupUuid)
+        .forUpdate()
+        .clearSubgroups()
+        .addSubgroup(subgroupUuid3)
+        .update();
+
+    ImmutableSet<AccountGroup.UUID> subgroups = groupOperations.group(groupUuid).get().subgroups();
+    assertThat(subgroups).containsExactly(subgroupUuid3);
+  }
+
+  private GroupInput createArbitraryGroupInput() {
+    GroupInput groupInput = new GroupInput();
+    groupInput.name = name("verifiers-" + uniqueGroupNameIndex++);
+    return groupInput;
+  }
+
+  private GroupInfo getGroupFromServer(AccountGroup.UUID groupUuid) throws RestApiException {
+    return gApi.groups().id(groupUuid.get()).detail();
+  }
+
+  private AccountGroup.UUID createGroupInServer(GroupInput input) throws RestApiException {
+    GroupInfo group = gApi.groups().create(input).detail();
+    return new AccountGroup.UUID(group.id);
+  }
+
+  private static Correspondence<AccountInfo, Account.Id> getAccountToIdCorrespondence() {
+    return new Correspondence<AccountInfo, Account.Id>() {
+      @Override
+      public boolean compare(AccountInfo actualAccount, Account.Id expectedId) {
+        Account.Id accountId =
+            Optional.ofNullable(actualAccount)
+                .map(account -> account._accountId)
+                .map(Account.Id::new)
+                .orElse(null);
+        return Objects.equals(accountId, expectedId);
+      }
+
+      @Override
+      public String toString() {
+        return "has ID";
+      }
+    };
+  }
+
+  private static Correspondence<GroupInfo, AccountGroup.UUID> getGroupToUuidCorrespondence() {
+    return new Correspondence<GroupInfo, AccountGroup.UUID>() {
+      @Override
+      public boolean compare(GroupInfo actualGroup, AccountGroup.UUID expectedUuid) {
+        AccountGroup.UUID groupUuid =
+            Optional.ofNullable(actualGroup)
+                .map(group -> group.id)
+                .map(AccountGroup.UUID::new)
+                .orElse(null);
+        return Objects.equals(groupUuid, expectedUuid);
+      }
+
+      @Override
+      public String toString() {
+        return "has UUID";
+      }
+    };
+  }
+}
diff --git a/gerrit-common/src/test/java/com/google/gerrit/common/AutoValueTest.java b/javatests/com/google/gerrit/common/AutoValueTest.java
similarity index 100%
rename from gerrit-common/src/test/java/com/google/gerrit/common/AutoValueTest.java
rename to javatests/com/google/gerrit/common/AutoValueTest.java
diff --git a/javatests/com/google/gerrit/common/BUILD b/javatests/com/google/gerrit/common/BUILD
new file mode 100644
index 0000000..c4f2c0a
--- /dev/null
+++ b/javatests/com/google/gerrit/common/BUILD
@@ -0,0 +1,17 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+junit_tests(
+    name = "common_tests",
+    srcs = glob(["**/*.java"]),
+    tags = ["no_windows"],
+    deps = [
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/common:version",
+        "//java/com/google/gerrit/launcher",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//lib:guava",
+        "//lib/auto:auto-value",
+        "//lib/auto:auto-value-annotations",
+        "//lib/truth",
+    ],
+)
diff --git a/javatests/com/google/gerrit/common/VersionTest.java b/javatests/com/google/gerrit/common/VersionTest.java
new file mode 100644
index 0000000..bceb203
--- /dev/null
+++ b/javatests/com/google/gerrit/common/VersionTest.java
@@ -0,0 +1,63 @@
+// Copyright (C) 2017 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.google.gerrit.common;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.launcher.GerritLauncher;
+import java.util.regex.Pattern;
+import org.junit.Test;
+
+public final class VersionTest {
+  private static final Pattern DEV_PATTERN =
+      Pattern.compile("^" + Pattern.quote(Version.DEV) + "$");
+
+  private static final Pattern GIT_DESCRIBE_PATTERN =
+      Pattern.compile(
+          "^[1-9]+\\.[0-9]+(\\.[0-9]+)*(-rc[0-9]+)?(-[0-9]+" + "-g[0-9a-f]{7,})?(-dirty)?$");
+
+  @Test
+  public void version() {
+    Pattern expected =
+        GerritLauncher.isRunningInEclipse()
+            ? DEV_PATTERN // Different source line so it shows up in coverage.
+            : GIT_DESCRIBE_PATTERN;
+    assertThat(Version.getVersion()).matches(expected);
+    // Try again in case of caching issues.
+    assertThat(Version.getVersion()).matches(expected);
+  }
+
+  @Test
+  public void gitDescribePattern() {
+    for (String suffix : ImmutableList.of("", "-dirty")) {
+      assertThat("2.15-rc0" + suffix).matches(GIT_DESCRIBE_PATTERN);
+      assertThat("2.15-rc0" + suffix).matches(GIT_DESCRIBE_PATTERN);
+      assertThat("2.15-rc1" + suffix).matches(GIT_DESCRIBE_PATTERN);
+      assertThat("2.15" + suffix).matches(GIT_DESCRIBE_PATTERN);
+      assertThat("2.15.1" + suffix).matches(GIT_DESCRIBE_PATTERN);
+      assertThat("2.15.1.2" + suffix).matches(GIT_DESCRIBE_PATTERN);
+      assertThat("2.15.1.2.3" + suffix).matches(GIT_DESCRIBE_PATTERN);
+      assertThat("2.15.1-rc1" + suffix).matches(GIT_DESCRIBE_PATTERN);
+      assertThat("2.15-rc2-123-gabcd123" + suffix).matches(GIT_DESCRIBE_PATTERN);
+      assertThat("2.15-123-gabcd123" + suffix).matches(GIT_DESCRIBE_PATTERN);
+    }
+
+    assertThat("2.15-ugly").doesNotMatch(GIT_DESCRIBE_PATTERN);
+    assertThat("(dev)").doesNotMatch(GIT_DESCRIBE_PATTERN);
+    assertThat("1").doesNotMatch(GIT_DESCRIBE_PATTERN);
+    assertThat("v2.15").doesNotMatch(GIT_DESCRIBE_PATTERN);
+  }
+}
diff --git a/javatests/com/google/gerrit/common/data/AccessSectionTest.java b/javatests/com/google/gerrit/common/data/AccessSectionTest.java
new file mode 100644
index 0000000..a59c015
--- /dev/null
+++ b/javatests/com/google/gerrit/common/data/AccessSectionTest.java
@@ -0,0 +1,274 @@
+// 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.
+
+package com.google.gerrit.common.data;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableList;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+public class AccessSectionTest {
+  @Rule public ExpectedException exception = ExpectedException.none();
+
+  private static final String REF_PATTERN = "refs/heads/master";
+
+  private AccessSection accessSection;
+
+  @Before
+  public void setup() {
+    this.accessSection = new AccessSection(REF_PATTERN);
+  }
+
+  @Test
+  public void getName() {
+    assertThat(accessSection.getName()).isEqualTo(REF_PATTERN);
+  }
+
+  @Test
+  public void getEmptyPermissions() {
+    assertThat(accessSection.getPermissions()).isNotNull();
+    assertThat(accessSection.getPermissions()).isEmpty();
+  }
+
+  @Test
+  public void setAndGetPermissions() {
+    Permission abandonPermission = new Permission(Permission.ABANDON);
+    Permission rebasePermission = new Permission(Permission.REBASE);
+    accessSection.setPermissions(ImmutableList.of(abandonPermission, rebasePermission));
+    assertThat(accessSection.getPermissions())
+        .containsExactly(abandonPermission, rebasePermission)
+        .inOrder();
+
+    Permission submitPermission = new Permission(Permission.SUBMIT);
+    accessSection.setPermissions(ImmutableList.of(submitPermission));
+    assertThat(accessSection.getPermissions()).containsExactly(submitPermission);
+
+    exception.expect(NullPointerException.class);
+    accessSection.setPermissions(null);
+  }
+
+  @Test
+  public void cannotSetDuplicatePermissions() {
+    exception.expect(IllegalArgumentException.class);
+    accessSection.setPermissions(
+        ImmutableList.of(new Permission(Permission.ABANDON), new Permission(Permission.ABANDON)));
+  }
+
+  @Test
+  public void cannotSetPermissionsWithConflictingNames() {
+    Permission abandonPermissionLowerCase =
+        new Permission(Permission.ABANDON.toLowerCase(Locale.US));
+    Permission abandonPermissionUpperCase =
+        new Permission(Permission.ABANDON.toUpperCase(Locale.US));
+
+    exception.expect(IllegalArgumentException.class);
+    accessSection.setPermissions(
+        ImmutableList.of(abandonPermissionLowerCase, abandonPermissionUpperCase));
+  }
+
+  @Test
+  public void getNonExistingPermission() {
+    assertThat(accessSection.getPermission("non-existing")).isNull();
+    assertThat(accessSection.getPermission("non-existing", false)).isNull();
+  }
+
+  @Test
+  public void getPermission() {
+    Permission submitPermission = new Permission(Permission.SUBMIT);
+    accessSection.setPermissions(ImmutableList.of(submitPermission));
+    assertThat(accessSection.getPermission(Permission.SUBMIT)).isEqualTo(submitPermission);
+
+    exception.expect(NullPointerException.class);
+    accessSection.getPermission(null);
+  }
+
+  @Test
+  public void getPermissionWithOtherCase() {
+    Permission submitPermissionLowerCase = new Permission(Permission.SUBMIT.toLowerCase(Locale.US));
+    accessSection.setPermissions(ImmutableList.of(submitPermissionLowerCase));
+    assertThat(accessSection.getPermission(Permission.SUBMIT.toUpperCase(Locale.US)))
+        .isEqualTo(submitPermissionLowerCase);
+  }
+
+  @Test
+  public void createMissingPermissionOnGet() {
+    assertThat(accessSection.getPermission(Permission.SUBMIT)).isNull();
+
+    assertThat(accessSection.getPermission(Permission.SUBMIT, true))
+        .isEqualTo(new Permission(Permission.SUBMIT));
+
+    exception.expect(NullPointerException.class);
+    accessSection.getPermission(null, true);
+  }
+
+  @Test
+  public void addPermission() {
+    Permission abandonPermission = new Permission(Permission.ABANDON);
+    Permission rebasePermission = new Permission(Permission.REBASE);
+
+    accessSection.setPermissions(ImmutableList.of(abandonPermission, rebasePermission));
+    assertThat(accessSection.getPermission(Permission.SUBMIT)).isNull();
+
+    Permission submitPermission = new Permission(Permission.SUBMIT);
+    accessSection.addPermission(submitPermission);
+    assertThat(accessSection.getPermission(Permission.SUBMIT)).isEqualTo(submitPermission);
+    assertThat(accessSection.getPermissions())
+        .containsExactly(abandonPermission, rebasePermission, submitPermission)
+        .inOrder();
+
+    exception.expect(NullPointerException.class);
+    accessSection.addPermission(null);
+  }
+
+  @Test
+  public void cannotAddPermissionByModifyingListThatWasProvidedToAccessSection() {
+    Permission abandonPermission = new Permission(Permission.ABANDON);
+    Permission rebasePermission = new Permission(Permission.REBASE);
+
+    List<Permission> permissions = new ArrayList<>();
+    permissions.add(abandonPermission);
+    permissions.add(rebasePermission);
+    accessSection.setPermissions(permissions);
+    assertThat(accessSection.getPermission(Permission.SUBMIT)).isNull();
+
+    Permission submitPermission = new Permission(Permission.SUBMIT);
+    permissions.add(submitPermission);
+    assertThat(accessSection.getPermission(Permission.SUBMIT)).isNull();
+  }
+
+  @Test
+  public void cannotAddPermissionByModifyingListThatWasRetrievedFromAccessSection() {
+    Permission submitPermission = new Permission(Permission.SUBMIT);
+    accessSection.getPermissions().add(submitPermission);
+    assertThat(accessSection.getPermission(Permission.SUBMIT)).isNull();
+
+    List<Permission> permissions = new ArrayList<>();
+    permissions.add(new Permission(Permission.ABANDON));
+    permissions.add(new Permission(Permission.REBASE));
+    accessSection.setPermissions(permissions);
+    assertThat(accessSection.getPermission(Permission.SUBMIT)).isNull();
+    accessSection.getPermissions().add(submitPermission);
+    assertThat(accessSection.getPermission(Permission.SUBMIT)).isNull();
+  }
+
+  @Test
+  public void removePermission() {
+    Permission abandonPermission = new Permission(Permission.ABANDON);
+    Permission rebasePermission = new Permission(Permission.REBASE);
+    Permission submitPermission = new Permission(Permission.SUBMIT);
+
+    accessSection.setPermissions(
+        ImmutableList.of(abandonPermission, rebasePermission, submitPermission));
+    assertThat(accessSection.getPermission(Permission.SUBMIT)).isNotNull();
+
+    accessSection.remove(submitPermission);
+    assertThat(accessSection.getPermission(Permission.SUBMIT)).isNull();
+    assertThat(accessSection.getPermissions())
+        .containsExactly(abandonPermission, rebasePermission)
+        .inOrder();
+
+    exception.expect(NullPointerException.class);
+    accessSection.remove(null);
+  }
+
+  @Test
+  public void removePermissionByName() {
+    Permission abandonPermission = new Permission(Permission.ABANDON);
+    Permission rebasePermission = new Permission(Permission.REBASE);
+    Permission submitPermission = new Permission(Permission.SUBMIT);
+
+    accessSection.setPermissions(
+        ImmutableList.of(abandonPermission, rebasePermission, submitPermission));
+    assertThat(accessSection.getPermission(Permission.SUBMIT)).isNotNull();
+
+    accessSection.removePermission(Permission.SUBMIT);
+    assertThat(accessSection.getPermission(Permission.SUBMIT)).isNull();
+    assertThat(accessSection.getPermissions())
+        .containsExactly(abandonPermission, rebasePermission)
+        .inOrder();
+
+    exception.expect(NullPointerException.class);
+    accessSection.removePermission(null);
+  }
+
+  @Test
+  public void removePermissionByNameOtherCase() {
+    Permission abandonPermission = new Permission(Permission.ABANDON);
+    Permission rebasePermission = new Permission(Permission.REBASE);
+
+    String submitLowerCase = Permission.SUBMIT.toLowerCase(Locale.US);
+    String submitUpperCase = Permission.SUBMIT.toUpperCase(Locale.US);
+    Permission submitPermissionLowerCase = new Permission(submitLowerCase);
+
+    accessSection.setPermissions(
+        ImmutableList.of(abandonPermission, rebasePermission, submitPermissionLowerCase));
+    assertThat(accessSection.getPermission(submitLowerCase)).isNotNull();
+    assertThat(accessSection.getPermission(submitUpperCase)).isNotNull();
+
+    accessSection.removePermission(submitUpperCase);
+    assertThat(accessSection.getPermission(submitLowerCase)).isNull();
+    assertThat(accessSection.getPermission(submitUpperCase)).isNull();
+    assertThat(accessSection.getPermissions())
+        .containsExactly(abandonPermission, rebasePermission)
+        .inOrder();
+  }
+
+  @Test
+  public void mergeAccessSections() {
+    Permission abandonPermission = new Permission(Permission.ABANDON);
+    Permission rebasePermission = new Permission(Permission.REBASE);
+    Permission submitPermission = new Permission(Permission.SUBMIT);
+
+    AccessSection accessSection1 = new AccessSection("refs/heads/foo");
+    accessSection1.setPermissions(ImmutableList.of(abandonPermission, rebasePermission));
+
+    AccessSection accessSection2 = new AccessSection("refs/heads/bar");
+    accessSection2.setPermissions(ImmutableList.of(rebasePermission, submitPermission));
+
+    accessSection1.mergeFrom(accessSection2);
+    assertThat(accessSection1.getPermissions())
+        .containsExactly(abandonPermission, rebasePermission, submitPermission)
+        .inOrder();
+
+    exception.expect(NullPointerException.class);
+    accessSection.mergeFrom(null);
+  }
+
+  @Test
+  public void testEquals() {
+    Permission abandonPermission = new Permission(Permission.ABANDON);
+    Permission rebasePermission = new Permission(Permission.REBASE);
+
+    accessSection.setPermissions(ImmutableList.of(abandonPermission, rebasePermission));
+
+    AccessSection accessSectionSamePermissionsOtherRef = new AccessSection("refs/heads/other");
+    accessSectionSamePermissionsOtherRef.setPermissions(
+        ImmutableList.of(abandonPermission, rebasePermission));
+    assertThat(accessSection.equals(accessSectionSamePermissionsOtherRef)).isFalse();
+
+    AccessSection accessSectionOther = new AccessSection(REF_PATTERN);
+    accessSectionOther.setPermissions(ImmutableList.of(abandonPermission));
+    assertThat(accessSection.equals(accessSectionOther)).isFalse();
+
+    accessSectionOther.addPermission(rebasePermission);
+    assertThat(accessSection.equals(accessSectionOther)).isTrue();
+  }
+}
diff --git a/javatests/com/google/gerrit/common/data/EncodePathSeparatorTest.java b/javatests/com/google/gerrit/common/data/EncodePathSeparatorTest.java
new file mode 100644
index 0000000..dcd3c05
--- /dev/null
+++ b/javatests/com/google/gerrit/common/data/EncodePathSeparatorTest.java
@@ -0,0 +1,33 @@
+// Copyright (C) 2011 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.google.gerrit.common.data;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import org.junit.Test;
+
+public class EncodePathSeparatorTest {
+  @Test
+  public void defaultBehaviour() {
+    assertThat(new GitwebType().replacePathSeparator("a/b")).isEqualTo("a/b");
+  }
+
+  @Test
+  public void exclamationMark() {
+    GitwebType gitwebType = new GitwebType();
+    gitwebType.setPathSeparator('!');
+    assertThat(gitwebType.replacePathSeparator("a/b")).isEqualTo("a!b");
+  }
+}
diff --git a/gerrit-common/src/test/java/com/google/gerrit/common/data/FilenameComparatorTest.java b/javatests/com/google/gerrit/common/data/FilenameComparatorTest.java
similarity index 100%
rename from gerrit-common/src/test/java/com/google/gerrit/common/data/FilenameComparatorTest.java
rename to javatests/com/google/gerrit/common/data/FilenameComparatorTest.java
diff --git a/javatests/com/google/gerrit/common/data/GroupReferenceTest.java b/javatests/com/google/gerrit/common/data/GroupReferenceTest.java
new file mode 100644
index 0000000..fdc9dc6
--- /dev/null
+++ b/javatests/com/google/gerrit/common/data/GroupReferenceTest.java
@@ -0,0 +1,168 @@
+// 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.
+
+package com.google.gerrit.common.data;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.AccountGroup.UUID;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+public class GroupReferenceTest {
+  @Rule public ExpectedException exception = ExpectedException.none();
+
+  @Test
+  public void forGroupDescription() {
+    String name = "foo";
+    AccountGroup.UUID uuid = new AccountGroup.UUID("uuid-foo");
+    GroupReference groupReference =
+        GroupReference.forGroup(
+            new GroupDescription.Basic() {
+
+              @Override
+              public String getUrl() {
+                return null;
+              }
+
+              @Override
+              public String getName() {
+                return name;
+              }
+
+              @Override
+              public UUID getGroupUUID() {
+                return uuid;
+              }
+
+              @Override
+              public String getEmailAddress() {
+                return null;
+              }
+            });
+    assertThat(groupReference.getName()).isEqualTo(name);
+    assertThat(groupReference.getUUID()).isEqualTo(uuid);
+  }
+
+  @Test
+  public void create() {
+    AccountGroup.UUID uuid = new AccountGroup.UUID("uuid");
+    String name = "foo";
+    GroupReference groupReference = new GroupReference(uuid, name);
+    assertThat(groupReference.getUUID()).isEqualTo(uuid);
+    assertThat(groupReference.getName()).isEqualTo(name);
+  }
+
+  @Test
+  public void createWithoutUuid() {
+    // GroupReferences where the UUID is null are used to represent groups from project.config that
+    // cannot be resolved.
+    String name = "foo";
+    GroupReference groupReference = new GroupReference(null, name);
+    assertThat(groupReference.getUUID()).isNull();
+    assertThat(groupReference.getName()).isEqualTo(name);
+  }
+
+  @Test
+  public void cannotCreateWithoutName() {
+    exception.expect(NullPointerException.class);
+    new GroupReference(new AccountGroup.UUID("uuid"), null);
+  }
+
+  @Test
+  public void isGroupReference() {
+    assertThat(GroupReference.isGroupReference("foo")).isFalse();
+    assertThat(GroupReference.isGroupReference("groupfoo")).isFalse();
+    assertThat(GroupReference.isGroupReference("group foo")).isTrue();
+    assertThat(GroupReference.isGroupReference("group foo-bar")).isTrue();
+    assertThat(GroupReference.isGroupReference("group foo bar")).isTrue();
+  }
+
+  @Test
+  public void extractGroupName() {
+    assertThat(GroupReference.extractGroupName("foo")).isNull();
+    assertThat(GroupReference.extractGroupName("groupfoo")).isNull();
+    assertThat(GroupReference.extractGroupName("group foo")).isEqualTo("foo");
+    assertThat(GroupReference.extractGroupName("group foo-bar")).isEqualTo("foo-bar");
+    assertThat(GroupReference.extractGroupName("group foo bar")).isEqualTo("foo bar");
+  }
+
+  @Test
+  public void getAndSetUuid() {
+    AccountGroup.UUID uuid = new AccountGroup.UUID("uuid-foo");
+    String name = "foo";
+    GroupReference groupReference = new GroupReference(uuid, name);
+    assertThat(groupReference.getUUID()).isEqualTo(uuid);
+
+    AccountGroup.UUID uuid2 = new AccountGroup.UUID("uuid-bar");
+    groupReference.setUUID(uuid2);
+    assertThat(groupReference.getUUID()).isEqualTo(uuid2);
+
+    // GroupReferences where the UUID is null are used to represent groups from project.config that
+    // cannot be resolved.
+    groupReference.setUUID(null);
+    assertThat(groupReference.getUUID()).isNull();
+  }
+
+  @Test
+  public void getAndSetName() {
+    AccountGroup.UUID uuid = new AccountGroup.UUID("uuid-foo");
+    String name = "foo";
+    GroupReference groupReference = new GroupReference(uuid, name);
+    assertThat(groupReference.getName()).isEqualTo(name);
+
+    String name2 = "bar";
+    groupReference.setName(name2);
+    assertThat(groupReference.getName()).isEqualTo(name2);
+
+    exception.expect(NullPointerException.class);
+    groupReference.setName(null);
+  }
+
+  @Test
+  public void toConfigValue() {
+    String name = "foo";
+    GroupReference groupReference = new GroupReference(new AccountGroup.UUID("uuid-foo"), name);
+    assertThat(groupReference.toConfigValue()).isEqualTo("group " + name);
+  }
+
+  @Test
+  public void testEquals() {
+    AccountGroup.UUID uuid1 = new AccountGroup.UUID("uuid-foo");
+    AccountGroup.UUID uuid2 = new AccountGroup.UUID("uuid-bar");
+    String name1 = "foo";
+    String name2 = "bar";
+
+    GroupReference groupReference1 = new GroupReference(uuid1, name1);
+    GroupReference groupReference2 = new GroupReference(uuid1, name2);
+    GroupReference groupReference3 = new GroupReference(uuid2, name1);
+
+    assertThat(groupReference1.equals(groupReference2)).isTrue();
+    assertThat(groupReference1.equals(groupReference3)).isFalse();
+    assertThat(groupReference2.equals(groupReference3)).isFalse();
+  }
+
+  @Test
+  public void testHashcode() {
+    AccountGroup.UUID uuid1 = new AccountGroup.UUID("uuid1");
+    assertThat(new GroupReference(uuid1, "foo").hashCode())
+        .isEqualTo(new GroupReference(uuid1, "bar").hashCode());
+
+    // Check that the following calls don't fail with an exception.
+    new GroupReference(null, "bar").hashCode();
+    new GroupReference(new AccountGroup.UUID(null), "bar").hashCode();
+  }
+}
diff --git a/javatests/com/google/gerrit/common/data/LabelFunctionTest.java b/javatests/com/google/gerrit/common/data/LabelFunctionTest.java
new file mode 100644
index 0000000..985f514
--- /dev/null
+++ b/javatests/com/google/gerrit/common/data/LabelFunctionTest.java
@@ -0,0 +1,148 @@
+// 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.
+
+package com.google.gerrit.common.data;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.LabelId;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSet.Id;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import java.sql.Date;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Test;
+
+public class LabelFunctionTest {
+  private static final String LABEL_NAME = "Verified";
+  private static final LabelId LABEL_ID = new LabelId(LABEL_NAME);
+  private static final Change.Id CHANGE_ID = new Change.Id(100);
+  private static final PatchSet.Id PS_ID = new PatchSet.Id(CHANGE_ID, 1);
+  private static final LabelType VERIFIED_LABEL = makeLabel();
+  private static final PatchSetApproval APPROVAL_2 = makeApproval(2);
+  private static final PatchSetApproval APPROVAL_1 = makeApproval(1);
+  private static final PatchSetApproval APPROVAL_0 = makeApproval(0);
+  private static final PatchSetApproval APPROVAL_M1 = makeApproval(-1);
+  private static final PatchSetApproval APPROVAL_M2 = makeApproval(-2);
+
+  @Test
+  public void checkLabelNameIsCorrect() {
+    for (LabelFunction function : LabelFunction.values()) {
+      SubmitRecord.Label myLabel = function.check(VERIFIED_LABEL, ImmutableList.of());
+      assertThat(myLabel.label).isEqualTo("Verified");
+    }
+  }
+
+  @Test
+  public void checkFunctionDoesNothing() {
+    checkNothingHappens(LabelFunction.NO_BLOCK);
+    checkNothingHappens(LabelFunction.NO_OP);
+    checkNothingHappens(LabelFunction.PATCH_SET_LOCK);
+    checkNothingHappens(LabelFunction.ANY_WITH_BLOCK);
+
+    checkLabelIsRequired(LabelFunction.MAX_WITH_BLOCK);
+    checkLabelIsRequired(LabelFunction.MAX_NO_BLOCK);
+  }
+
+  @Test
+  public void checkBlockWorks() {
+    checkBlockWorks(LabelFunction.ANY_WITH_BLOCK);
+    checkBlockWorks(LabelFunction.MAX_WITH_BLOCK);
+  }
+
+  @Test
+  public void checkMaxWorks() {
+    checkMaxIsEnforced(LabelFunction.MAX_NO_BLOCK);
+    checkMaxIsEnforced(LabelFunction.MAX_WITH_BLOCK);
+
+    checkMaxValidatesTheLabel(LabelFunction.MAX_NO_BLOCK);
+    checkMaxValidatesTheLabel(LabelFunction.MAX_WITH_BLOCK);
+  }
+
+  @Test
+  public void checkMaxNoBlockIgnoresMin() {
+    List<PatchSetApproval> approvals = ImmutableList.of(APPROVAL_M2, APPROVAL_2, APPROVAL_M2);
+
+    SubmitRecord.Label myLabel = LabelFunction.MAX_NO_BLOCK.check(VERIFIED_LABEL, approvals);
+
+    assertThat(myLabel.status).isEqualTo(SubmitRecord.Label.Status.OK);
+    assertThat(myLabel.appliedBy).isEqualTo(APPROVAL_2.getAccountId());
+  }
+
+  private static LabelType makeLabel() {
+    List<LabelValue> values = new ArrayList<>();
+    // The label text is irrelevant here, only the numerical value is used
+    values.add(new LabelValue((short) -2, "Great job, please fix compilation."));
+    values.add(new LabelValue((short) -1, "Really good, please make some minor changes."));
+    values.add(new LabelValue((short) 0, "No vote."));
+    values.add(new LabelValue((short) 1, "Closest thing perfection."));
+    values.add(new LabelValue((short) 2, "Perfect!"));
+    return new LabelType(LABEL_NAME, values);
+  }
+
+  private static PatchSetApproval makeApproval(int value) {
+    Account.Id accountId = new Account.Id(10000 + value);
+    PatchSetApproval.Key key = makeKey(PS_ID, accountId, LABEL_ID);
+    return new PatchSetApproval(key, (short) value, Date.from(Instant.now()));
+  }
+
+  private static PatchSetApproval.Key makeKey(Id psId, Account.Id accountId, LabelId labelId) {
+    return new PatchSetApproval.Key(psId, accountId, labelId);
+  }
+
+  private static void checkBlockWorks(LabelFunction function) {
+    List<PatchSetApproval> approvals = ImmutableList.of(APPROVAL_1, APPROVAL_M2, APPROVAL_2);
+
+    SubmitRecord.Label myLabel = function.check(VERIFIED_LABEL, approvals);
+
+    assertThat(myLabel.status).isEqualTo(SubmitRecord.Label.Status.REJECT);
+    assertThat(myLabel.appliedBy).isEqualTo(APPROVAL_M2.getAccountId());
+  }
+
+  private static void checkNothingHappens(LabelFunction function) {
+    SubmitRecord.Label myLabel = function.check(VERIFIED_LABEL, ImmutableList.of());
+
+    assertThat(myLabel.status).isEqualTo(SubmitRecord.Label.Status.MAY);
+    assertThat(myLabel.appliedBy).isNull();
+  }
+
+  private static void checkLabelIsRequired(LabelFunction function) {
+    SubmitRecord.Label myLabel = function.check(VERIFIED_LABEL, ImmutableList.of());
+
+    assertThat(myLabel.status).isEqualTo(SubmitRecord.Label.Status.NEED);
+    assertThat(myLabel.appliedBy).isNull();
+  }
+
+  private static void checkMaxIsEnforced(LabelFunction function) {
+    List<PatchSetApproval> approvals = ImmutableList.of(APPROVAL_1, APPROVAL_0);
+
+    SubmitRecord.Label myLabel = function.check(VERIFIED_LABEL, approvals);
+
+    assertThat(myLabel.status).isEqualTo(SubmitRecord.Label.Status.NEED);
+  }
+
+  private static void checkMaxValidatesTheLabel(LabelFunction function) {
+    List<PatchSetApproval> approvals = ImmutableList.of(APPROVAL_1, APPROVAL_2, APPROVAL_M1);
+
+    SubmitRecord.Label myLabel = function.check(VERIFIED_LABEL, approvals);
+
+    assertThat(myLabel.status).isEqualTo(SubmitRecord.Label.Status.OK);
+    assertThat(myLabel.appliedBy).isEqualTo(APPROVAL_2.getAccountId());
+  }
+}
diff --git a/javatests/com/google/gerrit/common/data/LabelTypeTest.java b/javatests/com/google/gerrit/common/data/LabelTypeTest.java
new file mode 100644
index 0000000..6c3befb
--- /dev/null
+++ b/javatests/com/google/gerrit/common/data/LabelTypeTest.java
@@ -0,0 +1,48 @@
+// 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.
+
+package com.google.gerrit.common.data;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableList;
+import org.junit.Test;
+
+public class LabelTypeTest {
+  @Test
+  public void sortLabelValues() {
+    LabelValue v0 = new LabelValue((short) 0, "Zero");
+    LabelValue v1 = new LabelValue((short) 1, "One");
+    LabelValue v2 = new LabelValue((short) 2, "Two");
+    LabelType types = new LabelType("Label", ImmutableList.of(v2, v0, v1));
+    assertThat(types.getValues()).containsExactly(v0, v1, v2).inOrder();
+  }
+
+  @Test
+  public void insertMissingLabelValues() {
+    LabelValue v0 = new LabelValue((short) 0, "Zero");
+    LabelValue v2 = new LabelValue((short) 2, "Two");
+    LabelValue v5 = new LabelValue((short) 5, "Five");
+    LabelType types = new LabelType("Label", ImmutableList.of(v2, v5, v0));
+    assertThat(types.getValues())
+        .containsExactly(
+            v0,
+            new LabelValue((short) 1, ""),
+            v2,
+            new LabelValue((short) 3, ""),
+            new LabelValue((short) 4, ""),
+            v5)
+        .inOrder();
+  }
+}
diff --git a/javatests/com/google/gerrit/common/data/ParameterizedStringTest.java b/javatests/com/google/gerrit/common/data/ParameterizedStringTest.java
new file mode 100644
index 0000000..b646d2b
--- /dev/null
+++ b/javatests/com/google/gerrit/common/data/ParameterizedStringTest.java
@@ -0,0 +1,398 @@
+// Copyright (C) 2009 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.google.gerrit.common.data;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableMap;
+import java.util.HashMap;
+import java.util.Map;
+import org.junit.Test;
+
+public class ParameterizedStringTest {
+  @Test
+  public void emptyString() {
+    ParameterizedString p = new ParameterizedString("");
+    assertThat(p.getPattern()).isEmpty();
+    assertThat(p.getRawPattern()).isEmpty();
+    assertThat(p.getParameterNames()).isEmpty();
+
+    Map<String, String> a = new HashMap<>();
+    assertThat(p.bind(a)).isNotNull();
+    assertThat(p.bind(a)).isEmpty();
+    assertThat(p.replace(a)).isEmpty();
+  }
+
+  @Test
+  public void asis1() {
+    ParameterizedString p = ParameterizedString.asis("${bar}c");
+    assertThat(p.getPattern()).isEqualTo("${bar}c");
+    assertThat(p.getRawPattern()).isEqualTo("${bar}c");
+    assertThat(p.getParameterNames()).isEmpty();
+
+    Map<String, String> a = new HashMap<>();
+    a.put("bar", "frobinator");
+    assertThat(p.bind(a)).isNotNull();
+    assertThat(p.bind(a)).isEmpty();
+    assertThat(p.replace(a)).isEqualTo("${bar}c");
+  }
+
+  @Test
+  public void replace1() {
+    ParameterizedString p = new ParameterizedString("${bar}c");
+    assertThat(p.getPattern()).isEqualTo("${bar}c");
+    assertThat(p.getRawPattern()).isEqualTo("{0}c");
+    assertThat(p.getParameterNames()).containsExactly("bar");
+
+    Map<String, String> a = new HashMap<>();
+    a.put("bar", "frobinator");
+    assertThat(p.bind(a)).isNotNull();
+    assertThat(p.bind(a)).hasLength(1);
+    assertThat(p.bind(a)[0]).isEqualTo("frobinator");
+    assertThat(p.replace(a)).isEqualTo("frobinatorc");
+  }
+
+  @Test
+  public void replace2() {
+    ParameterizedString p = new ParameterizedString("a${bar}c");
+    assertThat(p.getPattern()).isEqualTo("a${bar}c");
+    assertThat(p.getRawPattern()).isEqualTo("a{0}c");
+    assertThat(p.getParameterNames()).containsExactly("bar");
+
+    Map<String, String> a = new HashMap<>();
+    a.put("bar", "frobinator");
+    assertThat(p.bind(a)).isNotNull();
+    assertThat(p.bind(a)).hasLength(1);
+    assertThat(p.bind(a)[0]).isEqualTo("frobinator");
+    assertThat(p.replace(a)).isEqualTo("afrobinatorc");
+  }
+
+  @Test
+  public void replace3() {
+    ParameterizedString p = new ParameterizedString("a${bar}");
+    assertThat(p.getPattern()).isEqualTo("a${bar}");
+    assertThat(p.getRawPattern()).isEqualTo("a{0}");
+    assertThat(p.getParameterNames()).containsExactly("bar");
+
+    Map<String, String> a = new HashMap<>();
+    a.put("bar", "frobinator");
+    assertThat(p.bind(a)).isNotNull();
+    assertThat(p.bind(a)).hasLength(1);
+    assertThat(p.bind(a)[0]).isEqualTo("frobinator");
+    assertThat(p.replace(a)).isEqualTo("afrobinator");
+  }
+
+  @Test
+  public void replace4() {
+    ParameterizedString p = new ParameterizedString("a${bar}c");
+    assertThat(p.getPattern()).isEqualTo("a${bar}c");
+    assertThat(p.getRawPattern()).isEqualTo("a{0}c");
+    assertThat(p.getParameterNames()).containsExactly("bar");
+
+    Map<String, String> a = new HashMap<>();
+    assertThat(p.bind(a)).isNotNull();
+    assertThat(p.bind(a)).hasLength(1);
+    assertThat(p.bind(a)[0]).isEmpty();
+    assertThat(p.replace(a)).isEqualTo("ac");
+  }
+
+  @Test
+  public void replaceToLowerCase() {
+    ParameterizedString p = new ParameterizedString("${a.toLowerCase}");
+    assertThat(p.getParameterNames()).containsExactly("a");
+
+    Map<String, String> a = new HashMap<>();
+
+    a.put("a", "foo");
+    assertThat(p.bind(a)).isNotNull();
+    assertThat(p.bind(a)).hasLength(1);
+    assertThat(p.bind(a)[0]).isEqualTo("foo");
+    assertThat(p.replace(a)).isEqualTo("foo");
+
+    a.put("a", "FOO");
+    assertThat(p.bind(a)).isNotNull();
+    assertThat(p.bind(a)).hasLength(1);
+    assertThat(p.bind(a)[0]).isEqualTo("foo");
+    assertThat(p.replace(a)).isEqualTo("foo");
+  }
+
+  @Test
+  public void replaceToUpperCase() {
+    ParameterizedString p = new ParameterizedString("${a.toUpperCase}");
+    assertThat(p.getParameterNames()).containsExactly("a");
+
+    Map<String, String> a = new HashMap<>();
+
+    a.put("a", "foo");
+    assertThat(p.bind(a)).isNotNull();
+    assertThat(p.bind(a)).hasLength(1);
+    assertThat(p.bind(a)[0]).isEqualTo("FOO");
+    assertThat(p.replace(a)).isEqualTo("FOO");
+
+    a.put("a", "FOO");
+    assertThat(p.bind(a)).isNotNull();
+    assertThat(p.bind(a)).hasLength(1);
+    assertThat(p.bind(a)[0]).isEqualTo("FOO");
+    assertThat(p.replace(a)).isEqualTo("FOO");
+  }
+
+  @Test
+  public void replaceLocalName() {
+    ParameterizedString p = new ParameterizedString("${a.localPart}");
+    assertThat(p.getParameterNames()).containsExactly("a");
+
+    Map<String, String> a = new HashMap<>();
+
+    a.put("a", "foo@example.com");
+    assertThat(p.bind(a)).isNotNull();
+    assertThat(p.bind(a)).hasLength(1);
+    assertThat(p.bind(a)[0]).isEqualTo("foo");
+    assertThat(p.replace(a)).isEqualTo("foo");
+
+    a.put("a", "foo");
+    assertThat(p.bind(a)).isNotNull();
+    assertThat(p.bind(a)).hasLength(1);
+    assertThat(p.bind(a)[0]).isEqualTo("foo");
+    assertThat(p.replace(a)).isEqualTo("foo");
+  }
+
+  @Test
+  public void undefinedFunctionName() {
+    ParameterizedString p =
+        new ParameterizedString(
+            "hi, ${userName.toUpperCase},your eamil address is '${email.toLowerCase.localPart}'.right?");
+    assertThat(p.getParameterNames()).containsExactly("userName", "email");
+
+    Map<String, String> a = new HashMap<>();
+    a.put("userName", "firstName lastName");
+    a.put("email", "FIRSTNAME.LASTNAME@EXAMPLE.COM");
+    assertThat(p.bind(a)).isNotNull();
+    assertThat(p.bind(a)).hasLength(2);
+
+    assertThat(p.bind(a)[0]).isEqualTo("FIRSTNAME LASTNAME");
+    assertThat(p.bind(a)[1]).isEqualTo("firstname.lastname");
+    assertThat(p.replace(a))
+        .isEqualTo("hi, FIRSTNAME LASTNAME,your eamil address is 'firstname.lastname'.right?");
+  }
+
+  @Test
+  public void replaceToUpperCaseToLowerCase() {
+    ParameterizedString p = new ParameterizedString("${a.toUpperCase.toLowerCase}");
+    assertThat(p.getParameterNames()).containsExactly("a");
+
+    Map<String, String> a = new HashMap<>();
+
+    a.put("a", "FOO@EXAMPLE.COM");
+    assertThat(p.bind(a)).isNotNull();
+    assertThat(p.bind(a)).hasLength(1);
+    assertThat(p.bind(a)[0]).isEqualTo("foo@example.com");
+    assertThat(p.replace(a)).isEqualTo("foo@example.com");
+
+    a.put("a", "foo@example.com");
+    assertThat(p.bind(a)).isNotNull();
+    assertThat(p.bind(a)).hasLength(1);
+    assertThat(p.bind(a)[0]).isEqualTo("foo@example.com");
+    assertThat(p.replace(a)).isEqualTo("foo@example.com");
+  }
+
+  @Test
+  public void replaceToUpperCaseLocalName() {
+    ParameterizedString p = new ParameterizedString("${a.toUpperCase.localPart}");
+    assertThat(p.getParameterNames()).containsExactly("a");
+
+    Map<String, String> a = new HashMap<>();
+
+    a.put("a", "foo@example.com");
+    assertThat(p.bind(a)).isNotNull();
+    assertThat(p.bind(a)).hasLength(1);
+    assertThat(p.bind(a)[0]).isEqualTo("FOO");
+    assertThat(p.replace(a)).isEqualTo("FOO");
+
+    a.put("a", "FOO@EXAMPLE.COM");
+    assertThat(p.bind(a)).isNotNull();
+    assertThat(p.bind(a)).hasLength(1);
+    assertThat(p.bind(a)[0]).isEqualTo("FOO");
+    assertThat(p.replace(a)).isEqualTo("FOO");
+  }
+
+  @Test
+  public void replaceToUpperCaseAnUndefinedMethod() {
+    ParameterizedString p = new ParameterizedString("${a.toUpperCase.anUndefinedMethod}");
+    assertThat(p.getParameterNames()).containsExactly("a");
+
+    Map<String, String> a = new HashMap<>();
+
+    a.put("a", "foo@example.com");
+    assertThat(p.bind(a)).isNotNull();
+    assertThat(p.bind(a)).hasLength(1);
+    assertThat(p.bind(a)[0]).isEqualTo("FOO@EXAMPLE.COM");
+    assertThat(p.replace(a)).isEqualTo("FOO@EXAMPLE.COM");
+
+    a.put("a", "FOO@EXAMPLE.COM");
+    assertThat(p.bind(a)).isNotNull();
+    assertThat(p.bind(a)).hasLength(1);
+    assertThat(p.bind(a)[0]).isEqualTo("FOO@EXAMPLE.COM");
+    assertThat(p.replace(a)).isEqualTo("FOO@EXAMPLE.COM");
+  }
+
+  @Test
+  public void replaceLocalNameToUpperCase() {
+    ParameterizedString p = new ParameterizedString("${a.localPart.toUpperCase}");
+    assertThat(p.getParameterNames()).containsExactly("a");
+
+    Map<String, String> a = new HashMap<>();
+
+    a.put("a", "foo@example.com");
+    assertThat(p.bind(a)).isNotNull();
+    assertThat(p.bind(a)).hasLength(1);
+    assertThat(p.bind(a)[0]).isEqualTo("FOO");
+    assertThat(p.replace(a)).isEqualTo("FOO");
+
+    a.put("a", "FOO@EXAMPLE.COM");
+    assertThat(p.bind(a)).isNotNull();
+    assertThat(p.bind(a)).hasLength(1);
+    assertThat(p.bind(a)[0]).isEqualTo("FOO");
+    assertThat(p.replace(a)).isEqualTo("FOO");
+  }
+
+  @Test
+  public void replaceLocalNameToLowerCase() {
+    ParameterizedString p = new ParameterizedString("${a.localPart.toLowerCase}");
+    assertThat(p.getParameterNames()).containsExactly("a");
+
+    Map<String, String> a = new HashMap<>();
+
+    a.put("a", "FOO@EXAMPLE.COM");
+    assertThat(p.bind(a)).isNotNull();
+    assertThat(p.bind(a)).hasLength(1);
+    assertThat(p.bind(a)[0]).isEqualTo("foo");
+    assertThat(p.replace(a)).isEqualTo("foo");
+
+    a.put("a", "foo@example.com");
+    assertThat(p.bind(a)).isNotNull();
+    assertThat(p.bind(a)).hasLength(1);
+    assertThat(p.bind(a)[0]).isEqualTo("foo");
+    assertThat(p.replace(a)).isEqualTo("foo");
+  }
+
+  @Test
+  public void replaceLocalNameAnUndefinedMethod() {
+    ParameterizedString p = new ParameterizedString("${a.localPart.anUndefinedMethod}");
+    assertThat(p.getParameterNames()).containsExactly("a");
+
+    Map<String, String> a = new HashMap<>();
+
+    a.put("a", "FOO@EXAMPLE.COM");
+    assertThat(p.bind(a)).isNotNull();
+    assertThat(p.bind(a)).hasLength(1);
+    assertThat(p.bind(a)[0]).isEqualTo("FOO");
+    assertThat(p.replace(a)).isEqualTo("FOO");
+
+    a.put("a", "foo@example.com");
+    assertThat(p.bind(a)).isNotNull();
+    assertThat(p.bind(a)).hasLength(1);
+    assertThat(p.bind(a)[0]).isEqualTo("foo");
+    assertThat(p.replace(a)).isEqualTo("foo");
+  }
+
+  @Test
+  public void replaceToLowerCaseToUpperCase() {
+    ParameterizedString p = new ParameterizedString("${a.toLowerCase.toUpperCase}");
+    assertThat(p.getParameterNames()).hasSize(1);
+    assertThat(p.getParameterNames()).containsExactly("a");
+
+    Map<String, String> a = new HashMap<>();
+
+    a.put("a", "FOO@EXAMPLE.COM");
+    assertThat(p.bind(a)).isNotNull();
+    assertThat(p.bind(a)).hasLength(1);
+    assertThat(p.bind(a)[0]).isEqualTo("FOO@EXAMPLE.COM");
+    assertThat(p.replace(a)).isEqualTo("FOO@EXAMPLE.COM");
+
+    a.put("a", "foo@example.com");
+    assertThat(p.bind(a)).isNotNull();
+    assertThat(p.bind(a)).hasLength(1);
+    assertThat(p.bind(a)[0]).isEqualTo("FOO@EXAMPLE.COM");
+    assertThat(p.replace(a)).isEqualTo("FOO@EXAMPLE.COM");
+  }
+
+  @Test
+  public void replaceToLowerCaseLocalName() {
+    ParameterizedString p = new ParameterizedString("${a.toLowerCase.localPart}");
+    assertThat(p.getParameterNames()).containsExactly("a");
+
+    Map<String, String> a = new HashMap<>();
+
+    a.put("a", "FOO@EXAMPLE.COM");
+    assertThat(p.bind(a)).isNotNull();
+    assertThat(p.bind(a)).hasLength(1);
+    assertThat(p.bind(a)[0]).isEqualTo("foo");
+    assertThat(p.replace(a)).isEqualTo("foo");
+
+    a.put("a", "foo@example.com");
+    assertThat(p.bind(a)).isNotNull();
+    assertThat(p.bind(a)).hasLength(1);
+    assertThat(p.bind(a)[0]).isEqualTo("foo");
+    assertThat(p.replace(a)).isEqualTo("foo");
+  }
+
+  @Test
+  public void replaceToLowerCaseAnUndefinedMethod() {
+    ParameterizedString p = new ParameterizedString("${a.toLowerCase.anUndefinedMethod}");
+    assertThat(p.getParameterNames()).containsExactly("a");
+
+    Map<String, String> a = new HashMap<>();
+
+    a.put("a", "foo@example.com");
+    assertThat(p.bind(a)).isNotNull();
+    assertThat(p.bind(a)).hasLength(1);
+    assertThat(p.bind(a)[0]).isEqualTo("foo@example.com");
+    assertThat(p.replace(a)).isEqualTo("foo@example.com");
+
+    a.put("a", "FOO@EXAMPLE.COM");
+    assertThat(p.bind(a)).isNotNull();
+    assertThat(p.bind(a)).hasLength(1);
+    assertThat(p.bind(a)[0]).isEqualTo("foo@example.com");
+    assertThat(p.replace(a)).isEqualTo("foo@example.com");
+  }
+
+  @Test
+  public void replaceSubmitTooltipWithVariables() {
+    ParameterizedString p = new ParameterizedString("Submit patch set ${patchSet} into ${branch}");
+    assertThat(p.getParameterNames()).hasSize(2);
+    assertThat(p.getParameterNames()).containsExactly("patchSet", "branch");
+
+    Map<String, String> params =
+        ImmutableMap.of(
+            "patchSet", "42",
+            "branch", "foo");
+    assertThat(p.bind(params)).isNotNull();
+    assertThat(p.bind(params)).hasLength(2);
+    assertThat(p.bind(params)[0]).isEqualTo("42");
+    assertThat(p.bind(params)[1]).isEqualTo("foo");
+    assertThat(p.replace(params)).isEqualTo("Submit patch set 42 into foo");
+  }
+
+  @Test
+  public void replaceSubmitTooltipWithoutVariables() {
+    ParameterizedString p = new ParameterizedString("Submit patch set 40 into master");
+    Map<String, String> params =
+        ImmutableMap.of(
+            "patchSet", "42",
+            "branch", "foo");
+    assertThat(p.bind(params)).isEmpty();
+    assertThat(p.replace(params)).isEqualTo("Submit patch set 40 into master");
+  }
+}
diff --git a/javatests/com/google/gerrit/common/data/PermissionRuleTest.java b/javatests/com/google/gerrit/common/data/PermissionRuleTest.java
new file mode 100644
index 0000000..14c47b4
--- /dev/null
+++ b/javatests/com/google/gerrit/common/data/PermissionRuleTest.java
@@ -0,0 +1,399 @@
+// 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.
+
+package com.google.gerrit.common.data;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.common.data.PermissionRule.Action;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+public class PermissionRuleTest {
+  @Rule public ExpectedException exception = ExpectedException.none();
+
+  private GroupReference groupReference;
+  private PermissionRule permissionRule;
+
+  @Before
+  public void setup() {
+    this.groupReference = new GroupReference(new AccountGroup.UUID("uuid"), "group");
+    this.permissionRule = new PermissionRule(groupReference);
+  }
+
+  @Test
+  public void getAndSetAction() {
+    assertThat(permissionRule.getAction()).isEqualTo(Action.ALLOW);
+
+    permissionRule.setAction(Action.DENY);
+    assertThat(permissionRule.getAction()).isEqualTo(Action.DENY);
+  }
+
+  @Test
+  public void cannotSetActionToNull() {
+    exception.expect(NullPointerException.class);
+    permissionRule.setAction(null);
+  }
+
+  @Test
+  public void setDeny() {
+    assertThat(permissionRule.isDeny()).isFalse();
+
+    permissionRule.setDeny();
+    assertThat(permissionRule.isDeny()).isTrue();
+  }
+
+  @Test
+  public void setBlock() {
+    assertThat(permissionRule.isBlock()).isFalse();
+
+    permissionRule.setBlock();
+    assertThat(permissionRule.isBlock()).isTrue();
+  }
+
+  @Test
+  public void setForce() {
+    assertThat(permissionRule.getForce()).isFalse();
+
+    permissionRule.setForce(true);
+    assertThat(permissionRule.getForce()).isTrue();
+
+    permissionRule.setForce(false);
+    assertThat(permissionRule.getForce()).isFalse();
+  }
+
+  @Test
+  public void setMin() {
+    assertThat(permissionRule.getMin()).isEqualTo(0);
+
+    permissionRule.setMin(-2);
+    assertThat(permissionRule.getMin()).isEqualTo(-2);
+
+    permissionRule.setMin(2);
+    assertThat(permissionRule.getMin()).isEqualTo(2);
+  }
+
+  @Test
+  public void setMax() {
+    assertThat(permissionRule.getMax()).isEqualTo(0);
+
+    permissionRule.setMax(2);
+    assertThat(permissionRule.getMax()).isEqualTo(2);
+
+    permissionRule.setMax(-2);
+    assertThat(permissionRule.getMax()).isEqualTo(-2);
+  }
+
+  @Test
+  public void setRange() {
+    assertThat(permissionRule.getMin()).isEqualTo(0);
+    assertThat(permissionRule.getMax()).isEqualTo(0);
+
+    permissionRule.setRange(-2, 2);
+    assertThat(permissionRule.getMin()).isEqualTo(-2);
+    assertThat(permissionRule.getMax()).isEqualTo(2);
+
+    permissionRule.setRange(2, -2);
+    assertThat(permissionRule.getMin()).isEqualTo(-2);
+    assertThat(permissionRule.getMax()).isEqualTo(2);
+
+    permissionRule.setRange(1, 1);
+    assertThat(permissionRule.getMin()).isEqualTo(1);
+    assertThat(permissionRule.getMax()).isEqualTo(1);
+  }
+
+  @Test
+  public void hasRange() {
+    assertThat(permissionRule.hasRange()).isFalse();
+
+    permissionRule.setMin(-1);
+    assertThat(permissionRule.hasRange()).isTrue();
+
+    permissionRule.setMax(1);
+    assertThat(permissionRule.hasRange()).isTrue();
+  }
+
+  @Test
+  public void getGroup() {
+    assertThat(permissionRule.getGroup()).isEqualTo(groupReference);
+  }
+
+  @Test
+  public void setGroup() {
+    GroupReference groupReference2 = new GroupReference(new AccountGroup.UUID("uuid2"), "group2");
+    assertThat(groupReference2).isNotEqualTo(groupReference);
+
+    assertThat(permissionRule.getGroup()).isEqualTo(groupReference);
+
+    permissionRule.setGroup(groupReference2);
+    assertThat(permissionRule.getGroup()).isEqualTo(groupReference2);
+  }
+
+  @Test
+  public void mergeFromAnyBlock() {
+    GroupReference groupReference1 = new GroupReference(new AccountGroup.UUID("uuid1"), "group1");
+    PermissionRule permissionRule1 = new PermissionRule(groupReference1);
+
+    GroupReference groupReference2 = new GroupReference(new AccountGroup.UUID("uuid2"), "group2");
+    PermissionRule permissionRule2 = new PermissionRule(groupReference2);
+
+    permissionRule1.mergeFrom(permissionRule2);
+    assertThat(permissionRule1.isBlock()).isFalse();
+    assertThat(permissionRule2.isBlock()).isFalse();
+
+    permissionRule2.setBlock();
+    permissionRule1.mergeFrom(permissionRule2);
+    assertThat(permissionRule1.isBlock()).isTrue();
+    assertThat(permissionRule2.isBlock()).isTrue();
+
+    permissionRule2.setDeny();
+    permissionRule1.mergeFrom(permissionRule2);
+    assertThat(permissionRule1.isBlock()).isTrue();
+    assertThat(permissionRule2.isBlock()).isFalse();
+
+    permissionRule2.setAction(Action.BATCH);
+    permissionRule1.mergeFrom(permissionRule2);
+    assertThat(permissionRule1.isBlock()).isTrue();
+    assertThat(permissionRule2.isBlock()).isFalse();
+  }
+
+  @Test
+  public void mergeFromAnyDeny() {
+    GroupReference groupReference1 = new GroupReference(new AccountGroup.UUID("uuid1"), "group1");
+    PermissionRule permissionRule1 = new PermissionRule(groupReference1);
+
+    GroupReference groupReference2 = new GroupReference(new AccountGroup.UUID("uuid2"), "group2");
+    PermissionRule permissionRule2 = new PermissionRule(groupReference2);
+
+    permissionRule1.mergeFrom(permissionRule2);
+    assertThat(permissionRule1.isDeny()).isFalse();
+    assertThat(permissionRule2.isDeny()).isFalse();
+
+    permissionRule2.setDeny();
+    permissionRule1.mergeFrom(permissionRule2);
+    assertThat(permissionRule1.isDeny()).isTrue();
+    assertThat(permissionRule2.isDeny()).isTrue();
+
+    permissionRule2.setAction(Action.BATCH);
+    permissionRule1.mergeFrom(permissionRule2);
+    assertThat(permissionRule1.isDeny()).isTrue();
+    assertThat(permissionRule2.isDeny()).isFalse();
+  }
+
+  @Test
+  public void mergeFromAnyBatch() {
+    GroupReference groupReference1 = new GroupReference(new AccountGroup.UUID("uuid1"), "group1");
+    PermissionRule permissionRule1 = new PermissionRule(groupReference1);
+
+    GroupReference groupReference2 = new GroupReference(new AccountGroup.UUID("uuid2"), "group2");
+    PermissionRule permissionRule2 = new PermissionRule(groupReference2);
+
+    permissionRule1.mergeFrom(permissionRule2);
+    assertThat(permissionRule1.getAction()).isNotEqualTo(Action.BATCH);
+    assertThat(permissionRule2.getAction()).isNotEqualTo(Action.BATCH);
+
+    permissionRule2.setAction(Action.BATCH);
+    permissionRule1.mergeFrom(permissionRule2);
+    assertThat(permissionRule1.getAction()).isEqualTo(Action.BATCH);
+    assertThat(permissionRule2.getAction()).isEqualTo(Action.BATCH);
+
+    permissionRule2.setAction(Action.ALLOW);
+    permissionRule1.mergeFrom(permissionRule2);
+    assertThat(permissionRule1.getAction()).isEqualTo(Action.BATCH);
+    assertThat(permissionRule2.getAction()).isNotEqualTo(Action.BATCH);
+  }
+
+  @Test
+  public void mergeFromAnyForce() {
+    GroupReference groupReference1 = new GroupReference(new AccountGroup.UUID("uuid1"), "group1");
+    PermissionRule permissionRule1 = new PermissionRule(groupReference1);
+
+    GroupReference groupReference2 = new GroupReference(new AccountGroup.UUID("uuid2"), "group2");
+    PermissionRule permissionRule2 = new PermissionRule(groupReference2);
+
+    permissionRule1.mergeFrom(permissionRule2);
+    assertThat(permissionRule1.getForce()).isFalse();
+    assertThat(permissionRule2.getForce()).isFalse();
+
+    permissionRule2.setForce(true);
+    permissionRule1.mergeFrom(permissionRule2);
+    assertThat(permissionRule1.getForce()).isTrue();
+    assertThat(permissionRule2.getForce()).isTrue();
+
+    permissionRule2.setForce(false);
+    permissionRule1.mergeFrom(permissionRule2);
+    assertThat(permissionRule1.getForce()).isTrue();
+    assertThat(permissionRule2.getForce()).isFalse();
+  }
+
+  @Test
+  public void mergeFromMergeRange() {
+    GroupReference groupReference1 = new GroupReference(new AccountGroup.UUID("uuid1"), "group1");
+    PermissionRule permissionRule1 = new PermissionRule(groupReference1);
+    permissionRule1.setRange(-1, 2);
+
+    GroupReference groupReference2 = new GroupReference(new AccountGroup.UUID("uuid2"), "group2");
+    PermissionRule permissionRule2 = new PermissionRule(groupReference2);
+    permissionRule2.setRange(-2, 1);
+
+    permissionRule1.mergeFrom(permissionRule2);
+    assertThat(permissionRule1.getMin()).isEqualTo(-2);
+    assertThat(permissionRule1.getMax()).isEqualTo(2);
+    assertThat(permissionRule2.getMin()).isEqualTo(-2);
+    assertThat(permissionRule2.getMax()).isEqualTo(1);
+  }
+
+  @Test
+  public void mergeFromGroupNotChanged() {
+    GroupReference groupReference1 = new GroupReference(new AccountGroup.UUID("uuid1"), "group1");
+    PermissionRule permissionRule1 = new PermissionRule(groupReference1);
+
+    GroupReference groupReference2 = new GroupReference(new AccountGroup.UUID("uuid2"), "group2");
+    PermissionRule permissionRule2 = new PermissionRule(groupReference2);
+
+    permissionRule1.mergeFrom(permissionRule2);
+    assertThat(permissionRule1.getGroup()).isEqualTo(groupReference1);
+    assertThat(permissionRule2.getGroup()).isEqualTo(groupReference2);
+  }
+
+  @Test
+  public void asString() {
+    assertThat(permissionRule.asString(true)).isEqualTo("group " + groupReference.getName());
+
+    permissionRule.setDeny();
+    assertThat(permissionRule.asString(true)).isEqualTo("deny group " + groupReference.getName());
+
+    permissionRule.setBlock();
+    assertThat(permissionRule.asString(true)).isEqualTo("block group " + groupReference.getName());
+
+    permissionRule.setAction(Action.BATCH);
+    assertThat(permissionRule.asString(true)).isEqualTo("batch group " + groupReference.getName());
+
+    permissionRule.setAction(Action.INTERACTIVE);
+    assertThat(permissionRule.asString(true))
+        .isEqualTo("interactive group " + groupReference.getName());
+
+    permissionRule.setForce(true);
+    assertThat(permissionRule.asString(true))
+        .isEqualTo("interactive +force group " + groupReference.getName());
+
+    permissionRule.setAction(Action.ALLOW);
+    assertThat(permissionRule.asString(true)).isEqualTo("+force group " + groupReference.getName());
+
+    permissionRule.setMax(1);
+    assertThat(permissionRule.asString(true))
+        .isEqualTo("+force +0..+1 group " + groupReference.getName());
+
+    permissionRule.setMin(-1);
+    assertThat(permissionRule.asString(true))
+        .isEqualTo("+force -1..+1 group " + groupReference.getName());
+
+    assertThat(permissionRule.asString(false))
+        .isEqualTo("+force group " + groupReference.getName());
+  }
+
+  @Test
+  public void fromString() {
+    PermissionRule permissionRule = PermissionRule.fromString("group A", true);
+    assertPermissionRule(permissionRule, "A", Action.ALLOW, false, 0, 0);
+
+    permissionRule = PermissionRule.fromString("deny group A", true);
+    assertPermissionRule(permissionRule, "A", Action.DENY, false, 0, 0);
+
+    permissionRule = PermissionRule.fromString("block group A", true);
+    assertPermissionRule(permissionRule, "A", Action.BLOCK, false, 0, 0);
+
+    permissionRule = PermissionRule.fromString("batch group A", true);
+    assertPermissionRule(permissionRule, "A", Action.BATCH, false, 0, 0);
+
+    permissionRule = PermissionRule.fromString("interactive group A", true);
+    assertPermissionRule(permissionRule, "A", Action.INTERACTIVE, false, 0, 0);
+
+    permissionRule = PermissionRule.fromString("interactive +force group A", true);
+    assertPermissionRule(permissionRule, "A", Action.INTERACTIVE, true, 0, 0);
+
+    permissionRule = PermissionRule.fromString("+force group A", true);
+    assertPermissionRule(permissionRule, "A", Action.ALLOW, true, 0, 0);
+
+    permissionRule = PermissionRule.fromString("+force +0..+1 group A", true);
+    assertPermissionRule(permissionRule, "A", Action.ALLOW, true, 0, 1);
+
+    permissionRule = PermissionRule.fromString("+force -1..+1 group A", true);
+    assertPermissionRule(permissionRule, "A", Action.ALLOW, true, -1, 1);
+
+    permissionRule = PermissionRule.fromString("+force group A", false);
+    assertPermissionRule(permissionRule, "A", Action.ALLOW, true, 0, 0);
+  }
+
+  @Test
+  public void parseInt() {
+    assertThat(PermissionRule.parseInt("0")).isEqualTo(0);
+    assertThat(PermissionRule.parseInt("+0")).isEqualTo(0);
+    assertThat(PermissionRule.parseInt("-0")).isEqualTo(0);
+    assertThat(PermissionRule.parseInt("1")).isEqualTo(1);
+    assertThat(PermissionRule.parseInt("+1")).isEqualTo(1);
+    assertThat(PermissionRule.parseInt("-1")).isEqualTo(-1);
+  }
+
+  @Test
+  public void testEquals() {
+    GroupReference groupReference2 = new GroupReference(new AccountGroup.UUID("uuid2"), "group2");
+    PermissionRule permissionRuleOther = new PermissionRule(groupReference2);
+    assertThat(permissionRule.equals(permissionRuleOther)).isFalse();
+
+    permissionRuleOther.setGroup(groupReference);
+    assertThat(permissionRule.equals(permissionRuleOther)).isTrue();
+
+    permissionRule.setDeny();
+    assertThat(permissionRule.equals(permissionRuleOther)).isFalse();
+
+    permissionRuleOther.setDeny();
+    assertThat(permissionRule.equals(permissionRuleOther)).isTrue();
+
+    permissionRule.setForce(true);
+    assertThat(permissionRule.equals(permissionRuleOther)).isFalse();
+
+    permissionRuleOther.setForce(true);
+    assertThat(permissionRule.equals(permissionRuleOther)).isTrue();
+
+    permissionRule.setMin(-1);
+    assertThat(permissionRule.equals(permissionRuleOther)).isFalse();
+
+    permissionRuleOther.setMin(-1);
+    assertThat(permissionRule.equals(permissionRuleOther)).isTrue();
+
+    permissionRule.setMax(1);
+    assertThat(permissionRule.equals(permissionRuleOther)).isFalse();
+
+    permissionRuleOther.setMax(1);
+    assertThat(permissionRule.equals(permissionRuleOther)).isTrue();
+  }
+
+  private void assertPermissionRule(
+      PermissionRule permissionRule,
+      String expectedGroupName,
+      Action expectedAction,
+      boolean expectedForce,
+      int expectedMin,
+      int expectedMax) {
+    assertThat(permissionRule.getGroup().getName()).isEqualTo(expectedGroupName);
+    assertThat(permissionRule.getAction()).isEqualTo(expectedAction);
+    assertThat(permissionRule.getForce()).isEqualTo(expectedForce);
+    assertThat(permissionRule.getMin()).isEqualTo(expectedMin);
+    assertThat(permissionRule.getMax()).isEqualTo(expectedMax);
+  }
+}
diff --git a/javatests/com/google/gerrit/common/data/PermissionTest.java b/javatests/com/google/gerrit/common/data/PermissionTest.java
new file mode 100644
index 0000000..f76323f
--- /dev/null
+++ b/javatests/com/google/gerrit/common/data/PermissionTest.java
@@ -0,0 +1,341 @@
+// 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.
+
+package com.google.gerrit.common.data;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Before;
+import org.junit.Test;
+
+public class PermissionTest {
+  private static final String PERMISSION_NAME = "foo";
+
+  private Permission permission;
+
+  @Before
+  public void setup() {
+    this.permission = new Permission(PERMISSION_NAME);
+  }
+
+  @Test
+  public void isPermission() {
+    assertThat(Permission.isPermission(Permission.ABANDON)).isTrue();
+    assertThat(Permission.isPermission("no-permission")).isFalse();
+
+    assertThat(Permission.isPermission(Permission.LABEL + "Code-Review")).isTrue();
+    assertThat(Permission.isPermission(Permission.LABEL_AS + "Code-Review")).isTrue();
+    assertThat(Permission.isPermission("Code-Review")).isFalse();
+  }
+
+  @Test
+  public void hasRange() {
+    assertThat(Permission.hasRange(Permission.ABANDON)).isFalse();
+    assertThat(Permission.hasRange("no-permission")).isFalse();
+
+    assertThat(Permission.hasRange(Permission.LABEL + "Code-Review")).isTrue();
+    assertThat(Permission.hasRange(Permission.LABEL_AS + "Code-Review")).isTrue();
+    assertThat(Permission.hasRange("Code-Review")).isFalse();
+  }
+
+  @Test
+  public void isLabel() {
+    assertThat(Permission.isLabel(Permission.ABANDON)).isFalse();
+    assertThat(Permission.isLabel("no-permission")).isFalse();
+
+    assertThat(Permission.isLabel(Permission.LABEL + "Code-Review")).isTrue();
+    assertThat(Permission.isLabel(Permission.LABEL_AS + "Code-Review")).isFalse();
+    assertThat(Permission.isLabel("Code-Review")).isFalse();
+  }
+
+  @Test
+  public void isLabelAs() {
+    assertThat(Permission.isLabelAs(Permission.ABANDON)).isFalse();
+    assertThat(Permission.isLabelAs("no-permission")).isFalse();
+
+    assertThat(Permission.isLabelAs(Permission.LABEL + "Code-Review")).isFalse();
+    assertThat(Permission.isLabelAs(Permission.LABEL_AS + "Code-Review")).isTrue();
+    assertThat(Permission.isLabelAs("Code-Review")).isFalse();
+  }
+
+  @Test
+  public void forLabel() {
+    assertThat(Permission.forLabel("Code-Review")).isEqualTo(Permission.LABEL + "Code-Review");
+  }
+
+  @Test
+  public void forLabelAs() {
+    assertThat(Permission.forLabelAs("Code-Review")).isEqualTo(Permission.LABEL_AS + "Code-Review");
+  }
+
+  @Test
+  public void extractLabel() {
+    assertThat(Permission.extractLabel(Permission.LABEL + "Code-Review")).isEqualTo("Code-Review");
+    assertThat(Permission.extractLabel(Permission.LABEL_AS + "Code-Review"))
+        .isEqualTo("Code-Review");
+    assertThat(Permission.extractLabel("Code-Review")).isNull();
+    assertThat(Permission.extractLabel(Permission.ABANDON)).isNull();
+  }
+
+  @Test
+  public void canBeOnAllProjects() {
+    assertThat(Permission.canBeOnAllProjects(AccessSection.ALL, Permission.ABANDON)).isTrue();
+    assertThat(Permission.canBeOnAllProjects(AccessSection.ALL, Permission.OWNER)).isFalse();
+    assertThat(Permission.canBeOnAllProjects(AccessSection.ALL, Permission.LABEL + "Code-Review"))
+        .isTrue();
+    assertThat(
+            Permission.canBeOnAllProjects(AccessSection.ALL, Permission.LABEL_AS + "Code-Review"))
+        .isTrue();
+
+    assertThat(Permission.canBeOnAllProjects("refs/heads/*", Permission.ABANDON)).isTrue();
+    assertThat(Permission.canBeOnAllProjects("refs/heads/*", Permission.OWNER)).isTrue();
+    assertThat(Permission.canBeOnAllProjects("refs/heads/*", Permission.LABEL + "Code-Review"))
+        .isTrue();
+    assertThat(Permission.canBeOnAllProjects("refs/heads/*", Permission.LABEL_AS + "Code-Review"))
+        .isTrue();
+  }
+
+  @Test
+  public void getName() {
+    assertThat(permission.getName()).isEqualTo(PERMISSION_NAME);
+  }
+
+  @Test
+  public void getLabel() {
+    assertThat(new Permission(Permission.LABEL + "Code-Review").getLabel())
+        .isEqualTo("Code-Review");
+    assertThat(new Permission(Permission.LABEL_AS + "Code-Review").getLabel())
+        .isEqualTo("Code-Review");
+    assertThat(new Permission("Code-Review").getLabel()).isNull();
+    assertThat(new Permission(Permission.ABANDON).getLabel()).isNull();
+  }
+
+  @Test
+  public void exclusiveGroup() {
+    assertThat(permission.getExclusiveGroup()).isFalse();
+
+    permission.setExclusiveGroup(true);
+    assertThat(permission.getExclusiveGroup()).isTrue();
+
+    permission.setExclusiveGroup(false);
+    assertThat(permission.getExclusiveGroup()).isFalse();
+  }
+
+  @Test
+  public void noExclusiveGroupOnOwnerPermission() {
+    Permission permission = new Permission(Permission.OWNER);
+    assertThat(permission.getExclusiveGroup()).isFalse();
+
+    permission.setExclusiveGroup(true);
+    assertThat(permission.getExclusiveGroup()).isFalse();
+  }
+
+  @Test
+  public void getEmptyRules() {
+    assertThat(permission.getRules()).isNotNull();
+    assertThat(permission.getRules()).isEmpty();
+  }
+
+  @Test
+  public void setAndGetRules() {
+    PermissionRule permissionRule1 =
+        new PermissionRule(new GroupReference(new AccountGroup.UUID("uuid-1"), "group1"));
+    PermissionRule permissionRule2 =
+        new PermissionRule(new GroupReference(new AccountGroup.UUID("uuid-2"), "group2"));
+    permission.setRules(ImmutableList.of(permissionRule1, permissionRule2));
+    assertThat(permission.getRules()).containsExactly(permissionRule1, permissionRule2).inOrder();
+
+    PermissionRule permissionRule3 =
+        new PermissionRule(new GroupReference(new AccountGroup.UUID("uuid-3"), "group3"));
+    permission.setRules(ImmutableList.of(permissionRule3));
+    assertThat(permission.getRules()).containsExactly(permissionRule3);
+  }
+
+  @Test
+  public void cannotAddPermissionByModifyingListThatWasProvidedToAccessSection() {
+    PermissionRule permissionRule1 =
+        new PermissionRule(new GroupReference(new AccountGroup.UUID("uuid-1"), "group1"));
+    PermissionRule permissionRule2 =
+        new PermissionRule(new GroupReference(new AccountGroup.UUID("uuid-2"), "group2"));
+    GroupReference groupReference3 = new GroupReference(new AccountGroup.UUID("uuid-3"), "group3");
+
+    List<PermissionRule> rules = new ArrayList<>();
+    rules.add(permissionRule1);
+    rules.add(permissionRule2);
+    permission.setRules(rules);
+    assertThat(permission.getRule(groupReference3)).isNull();
+
+    PermissionRule permissionRule3 = new PermissionRule(groupReference3);
+    rules.add(permissionRule3);
+    assertThat(permission.getRule(groupReference3)).isNull();
+  }
+
+  @Test
+  public void cannotAddPermissionByModifyingListThatWasRetrievedFromAccessSection() {
+    GroupReference groupReference1 = new GroupReference(new AccountGroup.UUID("uuid-1"), "group1");
+    PermissionRule permissionRule1 = new PermissionRule(groupReference1);
+    permission.getRules().add(permissionRule1);
+    assertThat(permission.getRule(groupReference1)).isNull();
+
+    List<PermissionRule> rules = new ArrayList<>();
+    rules.add(new PermissionRule(new GroupReference(new AccountGroup.UUID("uuid-2"), "group2")));
+    rules.add(new PermissionRule(new GroupReference(new AccountGroup.UUID("uuid-3"), "group3")));
+    permission.setRules(rules);
+    assertThat(permission.getRule(groupReference1)).isNull();
+    permission.getRules().add(permissionRule1);
+    assertThat(permission.getRule(groupReference1)).isNull();
+  }
+
+  @Test
+  public void getNonExistingRule() {
+    GroupReference groupReference = new GroupReference(new AccountGroup.UUID("uuid-1"), "group1");
+    assertThat(permission.getRule(groupReference)).isNull();
+    assertThat(permission.getRule(groupReference, false)).isNull();
+  }
+
+  @Test
+  public void getRule() {
+    GroupReference groupReference = new GroupReference(new AccountGroup.UUID("uuid-1"), "group1");
+    PermissionRule permissionRule = new PermissionRule(groupReference);
+    permission.setRules(ImmutableList.of(permissionRule));
+    assertThat(permission.getRule(groupReference)).isEqualTo(permissionRule);
+  }
+
+  @Test
+  public void createMissingRuleOnGet() {
+    GroupReference groupReference = new GroupReference(new AccountGroup.UUID("uuid-1"), "group1");
+    assertThat(permission.getRule(groupReference)).isNull();
+
+    assertThat(permission.getRule(groupReference, true))
+        .isEqualTo(new PermissionRule(groupReference));
+  }
+
+  @Test
+  public void addRule() {
+    PermissionRule permissionRule1 =
+        new PermissionRule(new GroupReference(new AccountGroup.UUID("uuid-1"), "group1"));
+    PermissionRule permissionRule2 =
+        new PermissionRule(new GroupReference(new AccountGroup.UUID("uuid-2"), "group2"));
+    permission.setRules(ImmutableList.of(permissionRule1, permissionRule2));
+    GroupReference groupReference3 = new GroupReference(new AccountGroup.UUID("uuid-3"), "group3");
+    assertThat(permission.getRule(groupReference3)).isNull();
+
+    PermissionRule permissionRule3 = new PermissionRule(groupReference3);
+    permission.add(permissionRule3);
+    assertThat(permission.getRule(groupReference3)).isEqualTo(permissionRule3);
+    assertThat(permission.getRules())
+        .containsExactly(permissionRule1, permissionRule2, permissionRule3)
+        .inOrder();
+  }
+
+  @Test
+  public void removeRule() {
+    PermissionRule permissionRule1 =
+        new PermissionRule(new GroupReference(new AccountGroup.UUID("uuid-1"), "group1"));
+    PermissionRule permissionRule2 =
+        new PermissionRule(new GroupReference(new AccountGroup.UUID("uuid-2"), "group2"));
+    GroupReference groupReference3 = new GroupReference(new AccountGroup.UUID("uuid-3"), "group3");
+    PermissionRule permissionRule3 = new PermissionRule(groupReference3);
+
+    permission.setRules(ImmutableList.of(permissionRule1, permissionRule2, permissionRule3));
+    assertThat(permission.getRule(groupReference3)).isNotNull();
+
+    permission.remove(permissionRule3);
+    assertThat(permission.getRule(groupReference3)).isNull();
+    assertThat(permission.getRules()).containsExactly(permissionRule1, permissionRule2).inOrder();
+  }
+
+  @Test
+  public void removeRuleByGroupReference() {
+    PermissionRule permissionRule1 =
+        new PermissionRule(new GroupReference(new AccountGroup.UUID("uuid-1"), "group1"));
+    PermissionRule permissionRule2 =
+        new PermissionRule(new GroupReference(new AccountGroup.UUID("uuid-2"), "group2"));
+    GroupReference groupReference3 = new GroupReference(new AccountGroup.UUID("uuid-3"), "group3");
+    PermissionRule permissionRule3 = new PermissionRule(groupReference3);
+
+    permission.setRules(ImmutableList.of(permissionRule1, permissionRule2, permissionRule3));
+    assertThat(permission.getRule(groupReference3)).isNotNull();
+
+    permission.removeRule(groupReference3);
+    assertThat(permission.getRule(groupReference3)).isNull();
+    assertThat(permission.getRules()).containsExactly(permissionRule1, permissionRule2).inOrder();
+  }
+
+  @Test
+  public void clearRules() {
+    PermissionRule permissionRule1 =
+        new PermissionRule(new GroupReference(new AccountGroup.UUID("uuid-1"), "group1"));
+    PermissionRule permissionRule2 =
+        new PermissionRule(new GroupReference(new AccountGroup.UUID("uuid-2"), "group2"));
+
+    permission.setRules(ImmutableList.of(permissionRule1, permissionRule2));
+    assertThat(permission.getRules()).isNotEmpty();
+
+    permission.clearRules();
+    assertThat(permission.getRules()).isEmpty();
+  }
+
+  @Test
+  public void mergePermissions() {
+    PermissionRule permissionRule1 =
+        new PermissionRule(new GroupReference(new AccountGroup.UUID("uuid-1"), "group1"));
+    PermissionRule permissionRule2 =
+        new PermissionRule(new GroupReference(new AccountGroup.UUID("uuid-2"), "group2"));
+    PermissionRule permissionRule3 =
+        new PermissionRule(new GroupReference(new AccountGroup.UUID("uuid-3"), "group3"));
+
+    Permission permission1 = new Permission("foo");
+    permission1.setRules(ImmutableList.of(permissionRule1, permissionRule2));
+
+    Permission permission2 = new Permission("bar");
+    permission2.setRules(ImmutableList.of(permissionRule2, permissionRule3));
+
+    permission1.mergeFrom(permission2);
+    assertThat(permission1.getRules())
+        .containsExactly(permissionRule1, permissionRule2, permissionRule3)
+        .inOrder();
+  }
+
+  @Test
+  public void testEquals() {
+    PermissionRule permissionRule1 =
+        new PermissionRule(new GroupReference(new AccountGroup.UUID("uuid-1"), "group1"));
+    PermissionRule permissionRule2 =
+        new PermissionRule(new GroupReference(new AccountGroup.UUID("uuid-2"), "group2"));
+
+    permission.setRules(ImmutableList.of(permissionRule1, permissionRule2));
+
+    Permission permissionSameRulesOtherName = new Permission("bar");
+    permissionSameRulesOtherName.setRules(ImmutableList.of(permissionRule1, permissionRule2));
+    assertThat(permission.equals(permissionSameRulesOtherName)).isFalse();
+
+    Permission permissionSameRulesSameNameOtherExclusiveGroup = new Permission("foo");
+    permissionSameRulesSameNameOtherExclusiveGroup.setRules(
+        ImmutableList.of(permissionRule1, permissionRule2));
+    permissionSameRulesSameNameOtherExclusiveGroup.setExclusiveGroup(true);
+    assertThat(permission.equals(permissionSameRulesSameNameOtherExclusiveGroup)).isFalse();
+
+    Permission permissionOther = new Permission(PERMISSION_NAME);
+    permissionOther.setRules(ImmutableList.of(permissionRule1));
+    assertThat(permission.equals(permissionOther)).isFalse();
+
+    permissionOther.add(permissionRule2);
+    assertThat(permission.equals(permissionOther)).isTrue();
+  }
+}
diff --git a/javatests/com/google/gerrit/common/data/SubmitRecordTest.java b/javatests/com/google/gerrit/common/data/SubmitRecordTest.java
new file mode 100644
index 0000000..5386b87
--- /dev/null
+++ b/javatests/com/google/gerrit/common/data/SubmitRecordTest.java
@@ -0,0 +1,70 @@
+// 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.
+
+package com.google.gerrit.common.data;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import org.junit.Test;
+
+public class SubmitRecordTest {
+  private static final SubmitRecord OK_RECORD;
+  private static final SubmitRecord FORCED_RECORD;
+  private static final SubmitRecord NOT_READY_RECORD;
+
+  static {
+    OK_RECORD = new SubmitRecord();
+    OK_RECORD.status = SubmitRecord.Status.OK;
+
+    FORCED_RECORD = new SubmitRecord();
+    FORCED_RECORD.status = SubmitRecord.Status.FORCED;
+
+    NOT_READY_RECORD = new SubmitRecord();
+    NOT_READY_RECORD.status = SubmitRecord.Status.NOT_READY;
+  }
+
+  @Test
+  public void okIfAllOkay() {
+    Collection<SubmitRecord> submitRecords = new ArrayList<>();
+    submitRecords.add(OK_RECORD);
+
+    assertThat(SubmitRecord.allRecordsOK(submitRecords)).isTrue();
+  }
+
+  @Test
+  public void okWhenEmpty() {
+    Collection<SubmitRecord> submitRecords = new ArrayList<>();
+
+    assertThat(SubmitRecord.allRecordsOK(submitRecords)).isTrue();
+  }
+
+  @Test
+  public void okWhenForced() {
+    Collection<SubmitRecord> submitRecords = new ArrayList<>();
+    submitRecords.add(FORCED_RECORD);
+
+    assertThat(SubmitRecord.allRecordsOK(submitRecords)).isTrue();
+  }
+
+  @Test
+  public void emptyResultIfInvalid() {
+    Collection<SubmitRecord> submitRecords = new ArrayList<>();
+    submitRecords.add(NOT_READY_RECORD);
+    submitRecords.add(OK_RECORD);
+
+    assertThat(SubmitRecord.allRecordsOK(submitRecords)).isFalse();
+  }
+}
diff --git a/javatests/com/google/gerrit/elasticsearch/BUILD b/javatests/com/google/gerrit/elasticsearch/BUILD
new file mode 100644
index 0000000..c586080
--- /dev/null
+++ b/javatests/com/google/gerrit/elasticsearch/BUILD
@@ -0,0 +1,98 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+java_library(
+    name = "elasticsearch_test_utils",
+    testonly = True,
+    srcs = [
+        "ElasticContainer.java",
+        "ElasticTestUtils.java",
+    ],
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/elasticsearch",
+        "//java/com/google/gerrit/index",
+        "//java/com/google/gerrit/server",
+        "//lib:guava",
+        "//lib:junit",
+        "//lib/guice",
+        "//lib/httpcomponents:httpcore",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/testcontainers",
+        "//lib/testcontainers:testcontainers-elasticsearch",
+    ],
+)
+
+ELASTICSEARCH_DEPS = [
+    ":elasticsearch_test_utils",
+    "//java/com/google/gerrit/elasticsearch",
+    "//java/com/google/gerrit/testing:gerrit-test-util",
+    "//lib/guice",
+    "//lib/jgit/org.eclipse.jgit:jgit",
+]
+
+QUERY_TESTS_DEP = "//javatests/com/google/gerrit/server/query/%s:abstract_query_tests"
+
+TYPES = [
+    "account",
+    "change",
+    "group",
+    "project",
+]
+
+SUFFIX = "sTest.java"
+
+ELASTICSEARCH_TESTS_V5 = {i: "ElasticV5Query" + i.capitalize() + SUFFIX for i in TYPES}
+
+ELASTICSEARCH_TESTS_V6 = {i: "ElasticV6Query" + i.capitalize() + SUFFIX for i in TYPES}
+
+ELASTICSEARCH_TESTS_V7 = {i: "ElasticV7Query" + i.capitalize() + SUFFIX for i in TYPES}
+
+ELASTICSEARCH_TAGS = [
+    "docker",
+    "elastic",
+    "exclusive",
+]
+
+[junit_tests(
+    name = "elasticsearch_query_%ss_test_V5" % name,
+    size = "large",
+    srcs = [src],
+    tags = ELASTICSEARCH_TAGS,
+    deps = ELASTICSEARCH_DEPS + [QUERY_TESTS_DEP % name],
+) for name, src in ELASTICSEARCH_TESTS_V5.items()]
+
+[junit_tests(
+    name = "elasticsearch_query_%ss_test_V6" % name,
+    size = "large",
+    srcs = [src],
+    tags = ELASTICSEARCH_TAGS,
+    deps = ELASTICSEARCH_DEPS + [QUERY_TESTS_DEP % name],
+) for name, src in ELASTICSEARCH_TESTS_V6.items()]
+
+[junit_tests(
+    name = "elasticsearch_query_%ss_test_V7" % name,
+    size = "large",
+    srcs = [src],
+    tags = ELASTICSEARCH_TAGS,
+    deps = ELASTICSEARCH_DEPS + [QUERY_TESTS_DEP % name] + [
+        "//lib/httpcomponents:httpasyncclient",
+        "//lib/httpcomponents:httpclient",
+    ],
+) for name, src in ELASTICSEARCH_TESTS_V7.items()]
+
+junit_tests(
+    name = "elasticsearch_tests",
+    size = "small",
+    srcs = glob(
+        ["*Test.java"],
+        exclude = ["Elastic*Query*" + SUFFIX],
+    ),
+    tags = ["elastic"],
+    deps = [
+        "//java/com/google/gerrit/elasticsearch",
+        "//lib:guava",
+        "//lib/guice",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/truth",
+    ],
+)
diff --git a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticConfigurationTest.java b/javatests/com/google/gerrit/elasticsearch/ElasticConfigurationTest.java
similarity index 100%
rename from gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticConfigurationTest.java
rename to javatests/com/google/gerrit/elasticsearch/ElasticConfigurationTest.java
diff --git a/javatests/com/google/gerrit/elasticsearch/ElasticContainer.java b/javatests/com/google/gerrit/elasticsearch/ElasticContainer.java
new file mode 100644
index 0000000..79170c4
--- /dev/null
+++ b/javatests/com/google/gerrit/elasticsearch/ElasticContainer.java
@@ -0,0 +1,64 @@
+// 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.
+
+package com.google.gerrit.elasticsearch;
+
+import org.apache.http.HttpHost;
+import org.junit.AssumptionViolatedException;
+import org.testcontainers.elasticsearch.ElasticsearchContainer;
+
+/* Helper class for running ES integration tests in docker container */
+public class ElasticContainer extends ElasticsearchContainer {
+  private static final int ELASTICSEARCH_DEFAULT_PORT = 9200;
+
+  public static ElasticContainer createAndStart(ElasticVersion version) {
+    // Assumption violation is not natively supported by Testcontainers.
+    // See https://github.com/testcontainers/testcontainers-java/issues/343
+    try {
+      ElasticContainer container = new ElasticContainer(version);
+      container.start();
+      return container;
+    } catch (Throwable t) {
+      throw new AssumptionViolatedException("Unable to start container", t);
+    }
+  }
+
+  private static String getImageName(ElasticVersion version) {
+    switch (version) {
+      case V5_6:
+        return "docker.elastic.co/elasticsearch/elasticsearch:5.6.15";
+      case V6_2:
+        return "docker.elastic.co/elasticsearch/elasticsearch-oss:6.2.4";
+      case V6_3:
+        return "docker.elastic.co/elasticsearch/elasticsearch-oss:6.3.2";
+      case V6_4:
+        return "docker.elastic.co/elasticsearch/elasticsearch-oss:6.4.3";
+      case V6_5:
+        return "docker.elastic.co/elasticsearch/elasticsearch-oss:6.5.4";
+      case V6_6:
+        return "docker.elastic.co/elasticsearch/elasticsearch-oss:6.6.1";
+      case V7_0:
+        return "docker.elastic.co/elasticsearch/elasticsearch-oss:7.0.0-beta1";
+    }
+    throw new IllegalStateException("No tests for version: " + version.name());
+  }
+
+  private ElasticContainer(ElasticVersion version) {
+    super(getImageName(version));
+  }
+
+  public HttpHost getHttpHost() {
+    return new HttpHost(getContainerIpAddress(), getMappedPort(ELASTICSEARCH_DEFAULT_PORT));
+  }
+}
diff --git a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticTestUtils.java b/javatests/com/google/gerrit/elasticsearch/ElasticTestUtils.java
similarity index 100%
rename from gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticTestUtils.java
rename to javatests/com/google/gerrit/elasticsearch/ElasticTestUtils.java
diff --git a/javatests/com/google/gerrit/elasticsearch/ElasticV5QueryAccountsTest.java b/javatests/com/google/gerrit/elasticsearch/ElasticV5QueryAccountsTest.java
new file mode 100644
index 0000000..c8ce54a
--- /dev/null
+++ b/javatests/com/google/gerrit/elasticsearch/ElasticV5QueryAccountsTest.java
@@ -0,0 +1,70 @@
+// 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.
+
+package com.google.gerrit.elasticsearch;
+
+import com.google.gerrit.elasticsearch.ElasticTestUtils.ElasticNodeInfo;
+import com.google.gerrit.server.query.account.AbstractQueryAccountsTest;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.gerrit.testing.InMemoryModule;
+import com.google.gerrit.testing.IndexConfig;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.eclipse.jgit.lib.Config;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+public class ElasticV5QueryAccountsTest extends AbstractQueryAccountsTest {
+  @ConfigSuite.Default
+  public static Config defaultConfig() {
+    return IndexConfig.createForElasticsearch();
+  }
+
+  private static ElasticNodeInfo nodeInfo;
+  private static ElasticContainer container;
+
+  @BeforeClass
+  public static void startIndexService() {
+    if (nodeInfo != null) {
+      // do not start Elasticsearch twice
+      return;
+    }
+
+    container = ElasticContainer.createAndStart(ElasticVersion.V5_6);
+    nodeInfo = new ElasticNodeInfo(container.getHttpHost().getPort());
+  }
+
+  @AfterClass
+  public static void stopElasticsearchServer() {
+    if (container != null) {
+      container.stop();
+    }
+  }
+
+  @Override
+  protected void initAfterLifecycleStart() throws Exception {
+    super.initAfterLifecycleStart();
+    ElasticTestUtils.createAllIndexes(injector);
+  }
+
+  @Override
+  protected Injector createInjector() {
+    Config elasticsearchConfig = new Config(config);
+    InMemoryModule.setDefaults(elasticsearchConfig);
+    String indicesPrefix = getSanitizedMethodName();
+    ElasticTestUtils.configure(
+        elasticsearchConfig, nodeInfo.port, indicesPrefix, ElasticVersion.V5_6);
+    return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
+  }
+}
diff --git a/javatests/com/google/gerrit/elasticsearch/ElasticV5QueryChangesTest.java b/javatests/com/google/gerrit/elasticsearch/ElasticV5QueryChangesTest.java
new file mode 100644
index 0000000..cfdfa98
--- /dev/null
+++ b/javatests/com/google/gerrit/elasticsearch/ElasticV5QueryChangesTest.java
@@ -0,0 +1,70 @@
+// 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.
+
+package com.google.gerrit.elasticsearch;
+
+import com.google.gerrit.elasticsearch.ElasticTestUtils.ElasticNodeInfo;
+import com.google.gerrit.server.query.change.AbstractQueryChangesTest;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.gerrit.testing.InMemoryModule;
+import com.google.gerrit.testing.IndexConfig;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.eclipse.jgit.lib.Config;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+public class ElasticV5QueryChangesTest extends AbstractQueryChangesTest {
+  @ConfigSuite.Default
+  public static Config defaultConfig() {
+    return IndexConfig.createForElasticsearch();
+  }
+
+  private static ElasticNodeInfo nodeInfo;
+  private static ElasticContainer container;
+
+  @BeforeClass
+  public static void startIndexService() {
+    if (nodeInfo != null) {
+      // do not start Elasticsearch twice
+      return;
+    }
+
+    container = ElasticContainer.createAndStart(ElasticVersion.V5_6);
+    nodeInfo = new ElasticNodeInfo(container.getHttpHost().getPort());
+  }
+
+  @AfterClass
+  public static void stopElasticsearchServer() {
+    if (container != null) {
+      container.stop();
+    }
+  }
+
+  @Override
+  protected void initAfterLifecycleStart() throws Exception {
+    super.initAfterLifecycleStart();
+    ElasticTestUtils.createAllIndexes(injector);
+  }
+
+  @Override
+  protected Injector createInjector() {
+    Config elasticsearchConfig = new Config(config);
+    InMemoryModule.setDefaults(elasticsearchConfig);
+    String indicesPrefix = getSanitizedMethodName();
+    ElasticTestUtils.configure(
+        elasticsearchConfig, nodeInfo.port, indicesPrefix, ElasticVersion.V5_6);
+    return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
+  }
+}
diff --git a/javatests/com/google/gerrit/elasticsearch/ElasticV5QueryGroupsTest.java b/javatests/com/google/gerrit/elasticsearch/ElasticV5QueryGroupsTest.java
new file mode 100644
index 0000000..832a7bd
--- /dev/null
+++ b/javatests/com/google/gerrit/elasticsearch/ElasticV5QueryGroupsTest.java
@@ -0,0 +1,70 @@
+// 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.
+
+package com.google.gerrit.elasticsearch;
+
+import com.google.gerrit.elasticsearch.ElasticTestUtils.ElasticNodeInfo;
+import com.google.gerrit.server.query.group.AbstractQueryGroupsTest;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.gerrit.testing.InMemoryModule;
+import com.google.gerrit.testing.IndexConfig;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.eclipse.jgit.lib.Config;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+public class ElasticV5QueryGroupsTest extends AbstractQueryGroupsTest {
+  @ConfigSuite.Default
+  public static Config defaultConfig() {
+    return IndexConfig.createForElasticsearch();
+  }
+
+  private static ElasticNodeInfo nodeInfo;
+  private static ElasticContainer container;
+
+  @BeforeClass
+  public static void startIndexService() {
+    if (nodeInfo != null) {
+      // do not start Elasticsearch twice
+      return;
+    }
+
+    container = ElasticContainer.createAndStart(ElasticVersion.V5_6);
+    nodeInfo = new ElasticNodeInfo(container.getHttpHost().getPort());
+  }
+
+  @AfterClass
+  public static void stopElasticsearchServer() {
+    if (container != null) {
+      container.stop();
+    }
+  }
+
+  @Override
+  protected void initAfterLifecycleStart() throws Exception {
+    super.initAfterLifecycleStart();
+    ElasticTestUtils.createAllIndexes(injector);
+  }
+
+  @Override
+  protected Injector createInjector() {
+    Config elasticsearchConfig = new Config(config);
+    InMemoryModule.setDefaults(elasticsearchConfig);
+    String indicesPrefix = getSanitizedMethodName();
+    ElasticTestUtils.configure(
+        elasticsearchConfig, nodeInfo.port, indicesPrefix, ElasticVersion.V5_6);
+    return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
+  }
+}
diff --git a/javatests/com/google/gerrit/elasticsearch/ElasticV5QueryProjectsTest.java b/javatests/com/google/gerrit/elasticsearch/ElasticV5QueryProjectsTest.java
new file mode 100644
index 0000000..29d3fa4
--- /dev/null
+++ b/javatests/com/google/gerrit/elasticsearch/ElasticV5QueryProjectsTest.java
@@ -0,0 +1,70 @@
+// 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.
+
+package com.google.gerrit.elasticsearch;
+
+import com.google.gerrit.elasticsearch.ElasticTestUtils.ElasticNodeInfo;
+import com.google.gerrit.server.query.project.AbstractQueryProjectsTest;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.gerrit.testing.InMemoryModule;
+import com.google.gerrit.testing.IndexConfig;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.eclipse.jgit.lib.Config;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+public class ElasticV5QueryProjectsTest extends AbstractQueryProjectsTest {
+  @ConfigSuite.Default
+  public static Config defaultConfig() {
+    return IndexConfig.createForElasticsearch();
+  }
+
+  private static ElasticNodeInfo nodeInfo;
+  private static ElasticContainer container;
+
+  @BeforeClass
+  public static void startIndexService() {
+    if (nodeInfo != null) {
+      // do not start Elasticsearch twice
+      return;
+    }
+
+    container = ElasticContainer.createAndStart(ElasticVersion.V5_6);
+    nodeInfo = new ElasticNodeInfo(container.getHttpHost().getPort());
+  }
+
+  @AfterClass
+  public static void stopElasticsearchServer() {
+    if (container != null) {
+      container.stop();
+    }
+  }
+
+  @Override
+  protected void initAfterLifecycleStart() throws Exception {
+    super.initAfterLifecycleStart();
+    ElasticTestUtils.createAllIndexes(injector);
+  }
+
+  @Override
+  protected Injector createInjector() {
+    Config elasticsearchConfig = new Config(config);
+    InMemoryModule.setDefaults(elasticsearchConfig);
+    String indicesPrefix = getSanitizedMethodName();
+    ElasticTestUtils.configure(
+        elasticsearchConfig, nodeInfo.port, indicesPrefix, ElasticVersion.V5_6);
+    return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
+  }
+}
diff --git a/javatests/com/google/gerrit/elasticsearch/ElasticV6QueryAccountsTest.java b/javatests/com/google/gerrit/elasticsearch/ElasticV6QueryAccountsTest.java
new file mode 100644
index 0000000..9b1badc
--- /dev/null
+++ b/javatests/com/google/gerrit/elasticsearch/ElasticV6QueryAccountsTest.java
@@ -0,0 +1,69 @@
+// 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.
+
+package com.google.gerrit.elasticsearch;
+
+import com.google.gerrit.elasticsearch.ElasticTestUtils.ElasticNodeInfo;
+import com.google.gerrit.server.query.account.AbstractQueryAccountsTest;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.gerrit.testing.InMemoryModule;
+import com.google.gerrit.testing.IndexConfig;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.eclipse.jgit.lib.Config;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+public class ElasticV6QueryAccountsTest extends AbstractQueryAccountsTest {
+  @ConfigSuite.Default
+  public static Config defaultConfig() {
+    return IndexConfig.createForElasticsearch();
+  }
+
+  private static ElasticNodeInfo nodeInfo;
+  private static ElasticContainer container;
+
+  @BeforeClass
+  public static void startIndexService() {
+    if (nodeInfo != null) {
+      // do not start Elasticsearch twice
+      return;
+    }
+
+    container = ElasticContainer.createAndStart(ElasticVersion.V6_6);
+    nodeInfo = new ElasticNodeInfo(container.getHttpHost().getPort());
+  }
+
+  @AfterClass
+  public static void stopElasticsearchServer() {
+    if (container != null) {
+      container.stop();
+    }
+  }
+
+  @Override
+  protected void initAfterLifecycleStart() throws Exception {
+    super.initAfterLifecycleStart();
+    ElasticTestUtils.createAllIndexes(injector);
+  }
+
+  @Override
+  protected Injector createInjector() {
+    Config elasticsearchConfig = new Config(config);
+    InMemoryModule.setDefaults(elasticsearchConfig);
+    String indicesPrefix = getSanitizedMethodName();
+    ElasticTestUtils.configure(elasticsearchConfig, nodeInfo.port, indicesPrefix);
+    return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
+  }
+}
diff --git a/javatests/com/google/gerrit/elasticsearch/ElasticV6QueryChangesTest.java b/javatests/com/google/gerrit/elasticsearch/ElasticV6QueryChangesTest.java
new file mode 100644
index 0000000..74cb6d2
--- /dev/null
+++ b/javatests/com/google/gerrit/elasticsearch/ElasticV6QueryChangesTest.java
@@ -0,0 +1,69 @@
+// 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.
+
+package com.google.gerrit.elasticsearch;
+
+import com.google.gerrit.elasticsearch.ElasticTestUtils.ElasticNodeInfo;
+import com.google.gerrit.server.query.change.AbstractQueryChangesTest;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.gerrit.testing.InMemoryModule;
+import com.google.gerrit.testing.IndexConfig;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.eclipse.jgit.lib.Config;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+public class ElasticV6QueryChangesTest extends AbstractQueryChangesTest {
+  @ConfigSuite.Default
+  public static Config defaultConfig() {
+    return IndexConfig.createForElasticsearch();
+  }
+
+  private static ElasticNodeInfo nodeInfo;
+  private static ElasticContainer container;
+
+  @BeforeClass
+  public static void startIndexService() {
+    if (nodeInfo != null) {
+      // do not start Elasticsearch twice
+      return;
+    }
+
+    container = ElasticContainer.createAndStart(ElasticVersion.V6_6);
+    nodeInfo = new ElasticNodeInfo(container.getHttpHost().getPort());
+  }
+
+  @AfterClass
+  public static void stopElasticsearchServer() {
+    if (container != null) {
+      container.stop();
+    }
+  }
+
+  @Override
+  protected void initAfterLifecycleStart() throws Exception {
+    super.initAfterLifecycleStart();
+    ElasticTestUtils.createAllIndexes(injector);
+  }
+
+  @Override
+  protected Injector createInjector() {
+    Config elasticsearchConfig = new Config(config);
+    InMemoryModule.setDefaults(elasticsearchConfig);
+    String indicesPrefix = getSanitizedMethodName();
+    ElasticTestUtils.configure(elasticsearchConfig, nodeInfo.port, indicesPrefix);
+    return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
+  }
+}
diff --git a/javatests/com/google/gerrit/elasticsearch/ElasticV6QueryGroupsTest.java b/javatests/com/google/gerrit/elasticsearch/ElasticV6QueryGroupsTest.java
new file mode 100644
index 0000000..c70f182
--- /dev/null
+++ b/javatests/com/google/gerrit/elasticsearch/ElasticV6QueryGroupsTest.java
@@ -0,0 +1,69 @@
+// 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.
+
+package com.google.gerrit.elasticsearch;
+
+import com.google.gerrit.elasticsearch.ElasticTestUtils.ElasticNodeInfo;
+import com.google.gerrit.server.query.group.AbstractQueryGroupsTest;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.gerrit.testing.InMemoryModule;
+import com.google.gerrit.testing.IndexConfig;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.eclipse.jgit.lib.Config;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+public class ElasticV6QueryGroupsTest extends AbstractQueryGroupsTest {
+  @ConfigSuite.Default
+  public static Config defaultConfig() {
+    return IndexConfig.createForElasticsearch();
+  }
+
+  private static ElasticNodeInfo nodeInfo;
+  private static ElasticContainer container;
+
+  @BeforeClass
+  public static void startIndexService() {
+    if (nodeInfo != null) {
+      // do not start Elasticsearch twice
+      return;
+    }
+
+    container = ElasticContainer.createAndStart(ElasticVersion.V6_6);
+    nodeInfo = new ElasticNodeInfo(container.getHttpHost().getPort());
+  }
+
+  @AfterClass
+  public static void stopElasticsearchServer() {
+    if (container != null) {
+      container.stop();
+    }
+  }
+
+  @Override
+  protected void initAfterLifecycleStart() throws Exception {
+    super.initAfterLifecycleStart();
+    ElasticTestUtils.createAllIndexes(injector);
+  }
+
+  @Override
+  protected Injector createInjector() {
+    Config elasticsearchConfig = new Config(config);
+    InMemoryModule.setDefaults(elasticsearchConfig);
+    String indicesPrefix = getSanitizedMethodName();
+    ElasticTestUtils.configure(elasticsearchConfig, nodeInfo.port, indicesPrefix);
+    return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
+  }
+}
diff --git a/javatests/com/google/gerrit/elasticsearch/ElasticV6QueryProjectsTest.java b/javatests/com/google/gerrit/elasticsearch/ElasticV6QueryProjectsTest.java
new file mode 100644
index 0000000..47e9b10
--- /dev/null
+++ b/javatests/com/google/gerrit/elasticsearch/ElasticV6QueryProjectsTest.java
@@ -0,0 +1,69 @@
+// 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.
+
+package com.google.gerrit.elasticsearch;
+
+import com.google.gerrit.elasticsearch.ElasticTestUtils.ElasticNodeInfo;
+import com.google.gerrit.server.query.project.AbstractQueryProjectsTest;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.gerrit.testing.InMemoryModule;
+import com.google.gerrit.testing.IndexConfig;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.eclipse.jgit.lib.Config;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+public class ElasticV6QueryProjectsTest extends AbstractQueryProjectsTest {
+  @ConfigSuite.Default
+  public static Config defaultConfig() {
+    return IndexConfig.createForElasticsearch();
+  }
+
+  private static ElasticNodeInfo nodeInfo;
+  private static ElasticContainer container;
+
+  @BeforeClass
+  public static void startIndexService() {
+    if (nodeInfo != null) {
+      // do not start Elasticsearch twice
+      return;
+    }
+
+    container = ElasticContainer.createAndStart(ElasticVersion.V6_2);
+    nodeInfo = new ElasticNodeInfo(container.getHttpHost().getPort());
+  }
+
+  @AfterClass
+  public static void stopElasticsearchServer() {
+    if (container != null) {
+      container.stop();
+    }
+  }
+
+  @Override
+  protected void initAfterLifecycleStart() throws Exception {
+    super.initAfterLifecycleStart();
+    ElasticTestUtils.createAllIndexes(injector);
+  }
+
+  @Override
+  protected Injector createInjector() {
+    Config elasticsearchConfig = new Config(config);
+    InMemoryModule.setDefaults(elasticsearchConfig);
+    String indicesPrefix = getSanitizedMethodName();
+    ElasticTestUtils.configure(elasticsearchConfig, nodeInfo.port, indicesPrefix);
+    return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
+  }
+}
diff --git a/javatests/com/google/gerrit/elasticsearch/ElasticV7QueryAccountsTest.java b/javatests/com/google/gerrit/elasticsearch/ElasticV7QueryAccountsTest.java
new file mode 100644
index 0000000..bddbbc9
--- /dev/null
+++ b/javatests/com/google/gerrit/elasticsearch/ElasticV7QueryAccountsTest.java
@@ -0,0 +1,69 @@
+// 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.
+
+package com.google.gerrit.elasticsearch;
+
+import com.google.gerrit.elasticsearch.ElasticTestUtils.ElasticNodeInfo;
+import com.google.gerrit.server.query.account.AbstractQueryAccountsTest;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.gerrit.testing.InMemoryModule;
+import com.google.gerrit.testing.IndexConfig;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.eclipse.jgit.lib.Config;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+public class ElasticV7QueryAccountsTest extends AbstractQueryAccountsTest {
+  @ConfigSuite.Default
+  public static Config defaultConfig() {
+    return IndexConfig.createForElasticsearch();
+  }
+
+  private static ElasticNodeInfo nodeInfo;
+  private static ElasticContainer container;
+
+  @BeforeClass
+  public static void startIndexService() {
+    if (nodeInfo != null) {
+      // do not start Elasticsearch twice
+      return;
+    }
+
+    container = ElasticContainer.createAndStart(ElasticVersion.V7_0);
+    nodeInfo = new ElasticNodeInfo(container.getHttpHost().getPort());
+  }
+
+  @AfterClass
+  public static void stopElasticsearchServer() {
+    if (container != null) {
+      container.stop();
+    }
+  }
+
+  @Override
+  protected void initAfterLifecycleStart() throws Exception {
+    super.initAfterLifecycleStart();
+    ElasticTestUtils.createAllIndexes(injector);
+  }
+
+  @Override
+  protected Injector createInjector() {
+    Config elasticsearchConfig = new Config(config);
+    InMemoryModule.setDefaults(elasticsearchConfig);
+    String indicesPrefix = getSanitizedMethodName();
+    ElasticTestUtils.configure(elasticsearchConfig, nodeInfo.port, indicesPrefix);
+    return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
+  }
+}
diff --git a/javatests/com/google/gerrit/elasticsearch/ElasticV7QueryChangesTest.java b/javatests/com/google/gerrit/elasticsearch/ElasticV7QueryChangesTest.java
new file mode 100644
index 0000000..5dcf159
--- /dev/null
+++ b/javatests/com/google/gerrit/elasticsearch/ElasticV7QueryChangesTest.java
@@ -0,0 +1,87 @@
+// 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.
+
+package com.google.gerrit.elasticsearch;
+
+import com.google.gerrit.elasticsearch.ElasticTestUtils.ElasticNodeInfo;
+import com.google.gerrit.server.query.change.AbstractQueryChangesTest;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.gerrit.testing.InMemoryModule;
+import com.google.gerrit.testing.IndexConfig;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.protocol.HttpClientContext;
+import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
+import org.apache.http.impl.nio.client.HttpAsyncClients;
+import org.eclipse.jgit.lib.Config;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+public class ElasticV7QueryChangesTest extends AbstractQueryChangesTest {
+  @ConfigSuite.Default
+  public static Config defaultConfig() {
+    return IndexConfig.createForElasticsearch();
+  }
+
+  private static ElasticNodeInfo nodeInfo;
+  private static ElasticContainer container;
+  private static CloseableHttpAsyncClient client;
+
+  @BeforeClass
+  public static void startIndexService() {
+    if (nodeInfo != null) {
+      // do not start Elasticsearch twice
+      return;
+    }
+
+    container = ElasticContainer.createAndStart(ElasticVersion.V7_0);
+    nodeInfo = new ElasticNodeInfo(container.getHttpHost().getPort());
+    client = HttpAsyncClients.createDefault();
+    client.start();
+  }
+
+  @AfterClass
+  public static void stopElasticsearchServer() {
+    if (container != null) {
+      container.stop();
+    }
+  }
+
+  @After
+  public void closeIndex() {
+    client.execute(
+        new HttpPost(
+            String.format(
+                "http://localhost:%d/%s*/_close", nodeInfo.port, getSanitizedMethodName())),
+        HttpClientContext.create(),
+        null);
+  }
+
+  @Override
+  protected void initAfterLifecycleStart() throws Exception {
+    super.initAfterLifecycleStart();
+    ElasticTestUtils.createAllIndexes(injector);
+  }
+
+  @Override
+  protected Injector createInjector() {
+    Config elasticsearchConfig = new Config(config);
+    InMemoryModule.setDefaults(elasticsearchConfig);
+    String indicesPrefix = getSanitizedMethodName();
+    ElasticTestUtils.configure(elasticsearchConfig, nodeInfo.port, indicesPrefix);
+    return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
+  }
+}
diff --git a/javatests/com/google/gerrit/elasticsearch/ElasticV7QueryGroupsTest.java b/javatests/com/google/gerrit/elasticsearch/ElasticV7QueryGroupsTest.java
new file mode 100644
index 0000000..54be7b9
--- /dev/null
+++ b/javatests/com/google/gerrit/elasticsearch/ElasticV7QueryGroupsTest.java
@@ -0,0 +1,69 @@
+// 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.
+
+package com.google.gerrit.elasticsearch;
+
+import com.google.gerrit.elasticsearch.ElasticTestUtils.ElasticNodeInfo;
+import com.google.gerrit.server.query.group.AbstractQueryGroupsTest;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.gerrit.testing.InMemoryModule;
+import com.google.gerrit.testing.IndexConfig;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.eclipse.jgit.lib.Config;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+public class ElasticV7QueryGroupsTest extends AbstractQueryGroupsTest {
+  @ConfigSuite.Default
+  public static Config defaultConfig() {
+    return IndexConfig.createForElasticsearch();
+  }
+
+  private static ElasticNodeInfo nodeInfo;
+  private static ElasticContainer container;
+
+  @BeforeClass
+  public static void startIndexService() {
+    if (nodeInfo != null) {
+      // do not start Elasticsearch twice
+      return;
+    }
+
+    container = ElasticContainer.createAndStart(ElasticVersion.V7_0);
+    nodeInfo = new ElasticNodeInfo(container.getHttpHost().getPort());
+  }
+
+  @AfterClass
+  public static void stopElasticsearchServer() {
+    if (container != null) {
+      container.stop();
+    }
+  }
+
+  @Override
+  protected void initAfterLifecycleStart() throws Exception {
+    super.initAfterLifecycleStart();
+    ElasticTestUtils.createAllIndexes(injector);
+  }
+
+  @Override
+  protected Injector createInjector() {
+    Config elasticsearchConfig = new Config(config);
+    InMemoryModule.setDefaults(elasticsearchConfig);
+    String indicesPrefix = getSanitizedMethodName();
+    ElasticTestUtils.configure(elasticsearchConfig, nodeInfo.port, indicesPrefix);
+    return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
+  }
+}
diff --git a/javatests/com/google/gerrit/elasticsearch/ElasticV7QueryProjectsTest.java b/javatests/com/google/gerrit/elasticsearch/ElasticV7QueryProjectsTest.java
new file mode 100644
index 0000000..e8b4a2c
--- /dev/null
+++ b/javatests/com/google/gerrit/elasticsearch/ElasticV7QueryProjectsTest.java
@@ -0,0 +1,69 @@
+// 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.
+
+package com.google.gerrit.elasticsearch;
+
+import com.google.gerrit.elasticsearch.ElasticTestUtils.ElasticNodeInfo;
+import com.google.gerrit.server.query.project.AbstractQueryProjectsTest;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.gerrit.testing.InMemoryModule;
+import com.google.gerrit.testing.IndexConfig;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.eclipse.jgit.lib.Config;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+public class ElasticV7QueryProjectsTest extends AbstractQueryProjectsTest {
+  @ConfigSuite.Default
+  public static Config defaultConfig() {
+    return IndexConfig.createForElasticsearch();
+  }
+
+  private static ElasticNodeInfo nodeInfo;
+  private static ElasticContainer container;
+
+  @BeforeClass
+  public static void startIndexService() {
+    if (nodeInfo != null) {
+      // do not start Elasticsearch twice
+      return;
+    }
+
+    container = ElasticContainer.createAndStart(ElasticVersion.V7_0);
+    nodeInfo = new ElasticNodeInfo(container.getHttpHost().getPort());
+  }
+
+  @AfterClass
+  public static void stopElasticsearchServer() {
+    if (container != null) {
+      container.stop();
+    }
+  }
+
+  @Override
+  protected void initAfterLifecycleStart() throws Exception {
+    super.initAfterLifecycleStart();
+    ElasticTestUtils.createAllIndexes(injector);
+  }
+
+  @Override
+  protected Injector createInjector() {
+    Config elasticsearchConfig = new Config(config);
+    InMemoryModule.setDefaults(elasticsearchConfig);
+    String indicesPrefix = getSanitizedMethodName();
+    ElasticTestUtils.configure(elasticsearchConfig, nodeInfo.port, indicesPrefix);
+    return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
+  }
+}
diff --git a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticVersionTest.java b/javatests/com/google/gerrit/elasticsearch/ElasticVersionTest.java
similarity index 100%
rename from gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticVersionTest.java
rename to javatests/com/google/gerrit/elasticsearch/ElasticVersionTest.java
diff --git a/javatests/com/google/gerrit/extensions/BUILD b/javatests/com/google/gerrit/extensions/BUILD
new file mode 100644
index 0000000..069c915
--- /dev/null
+++ b/javatests/com/google/gerrit/extensions/BUILD
@@ -0,0 +1,13 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+junit_tests(
+    name = "extensions_api_tests",
+    size = "small",
+    srcs = glob(["**/*.java"]),
+    deps = [
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/extensions/common/testing:common-test-util",
+        "//lib/guice",
+        "//lib/truth",
+    ],
+)
diff --git a/gerrit-extension-api/src/test/java/com/google/gerrit/extensions/api/lfs/LfsDefinitionsTest.java b/javatests/com/google/gerrit/extensions/api/lfs/LfsDefinitionsTest.java
similarity index 100%
rename from gerrit-extension-api/src/test/java/com/google/gerrit/extensions/api/lfs/LfsDefinitionsTest.java
rename to javatests/com/google/gerrit/extensions/api/lfs/LfsDefinitionsTest.java
diff --git a/javatests/com/google/gerrit/extensions/client/RangeTest.java b/javatests/com/google/gerrit/extensions/client/RangeTest.java
new file mode 100644
index 0000000..b8938aa
--- /dev/null
+++ b/javatests/com/google/gerrit/extensions/client/RangeTest.java
@@ -0,0 +1,110 @@
+// 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.
+
+package com.google.gerrit.extensions.client;
+
+import static com.google.gerrit.extensions.common.testing.RangeSubject.assertThat;
+
+import org.junit.Test;
+
+public class RangeTest {
+
+  @Test
+  public void rangeOverMultipleLinesWithSmallerEndCharacterIsValid() {
+    Comment.Range range = createRange(13, 31, 19, 10);
+    assertThat(range).isValid();
+  }
+
+  @Test
+  public void rangeInOneLineIsValid() {
+    Comment.Range range = createRange(13, 2, 13, 10);
+    assertThat(range).isValid();
+  }
+
+  @Test
+  public void startPositionEqualToEndPositionIsValidRange() {
+    Comment.Range range = createRange(13, 11, 13, 11);
+    assertThat(range).isValid();
+  }
+
+  @Test
+  public void negativeStartLineResultsInInvalidRange() {
+    Comment.Range range = createRange(-1, 2, 19, 10);
+    assertThat(range).isInvalid();
+  }
+
+  @Test
+  public void negativeEndLineResultsInInvalidRange() {
+    Comment.Range range = createRange(13, 2, -1, 10);
+    assertThat(range).isInvalid();
+  }
+
+  @Test
+  public void negativeStartCharacterResultsInInvalidRange() {
+    Comment.Range range = createRange(13, -1, 19, 10);
+    assertThat(range).isInvalid();
+  }
+
+  @Test
+  public void negativeEndCharacterResultsInInvalidRange() {
+    Comment.Range range = createRange(13, 2, 19, -1);
+    assertThat(range).isInvalid();
+  }
+
+  @Test
+  public void zeroStartLineResultsInInvalidRange() {
+    Comment.Range range = createRange(0, 2, 19, 10);
+    assertThat(range).isInvalid();
+  }
+
+  @Test
+  public void zeroEndLineResultsInInvalidRange() {
+    Comment.Range range = createRange(13, 2, 0, 10);
+    assertThat(range).isInvalid();
+  }
+
+  @Test
+  public void zeroStartCharacterResultsInValidRange() {
+    Comment.Range range = createRange(13, 0, 19, 10);
+    assertThat(range).isValid();
+  }
+
+  @Test
+  public void zeroEndCharacterResultsInValidRange() {
+    Comment.Range range = createRange(13, 31, 19, 0);
+    assertThat(range).isValid();
+  }
+
+  @Test
+  public void startLineGreaterThanEndLineResultsInInvalidRange() {
+    Comment.Range range = createRange(20, 2, 19, 10);
+    assertThat(range).isInvalid();
+  }
+
+  @Test
+  public void startCharGreaterThanEndCharForSameLineResultsInInvalidRange() {
+    Comment.Range range = createRange(13, 11, 13, 10);
+    assertThat(range).isInvalid();
+  }
+
+  private Comment.Range createRange(
+      int startLine, int startCharacter, int endLine, int endCharacter) {
+    Comment.Range range = new Comment.Range();
+    range.startLine = startLine;
+    range.startCharacter = startCharacter;
+    range.endLine = endLine;
+    range.endCharacter = endCharacter;
+    return range;
+  }
+}
diff --git a/javatests/com/google/gerrit/extensions/conditions/BUILD b/javatests/com/google/gerrit/extensions/conditions/BUILD
new file mode 100644
index 0000000..e2d5951
--- /dev/null
+++ b/javatests/com/google/gerrit/extensions/conditions/BUILD
@@ -0,0 +1,10 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+junit_tests(
+    name = "conditions_tests",
+    srcs = glob(["*.java"]),
+    deps = [
+        "//java/com/google/gerrit/extensions:lib",
+        "//lib/truth",
+    ],
+)
diff --git a/javatests/com/google/gerrit/extensions/conditions/BooleanConditionTest.java b/javatests/com/google/gerrit/extensions/conditions/BooleanConditionTest.java
new file mode 100644
index 0000000..f9f1fa85
--- /dev/null
+++ b/javatests/com/google/gerrit/extensions/conditions/BooleanConditionTest.java
@@ -0,0 +1,152 @@
+// 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.
+
+package com.google.gerrit.extensions.conditions;
+
+import static com.google.gerrit.extensions.conditions.BooleanCondition.and;
+import static com.google.gerrit.extensions.conditions.BooleanCondition.not;
+import static com.google.gerrit.extensions.conditions.BooleanCondition.or;
+import static com.google.gerrit.extensions.conditions.BooleanCondition.valueOf;
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class BooleanConditionTest {
+
+  private static final BooleanCondition NO_TRIVIAL_EVALUATION =
+      new BooleanCondition() {
+        @Override
+        public boolean value() {
+          throw new UnsupportedOperationException("value() is not supported");
+        }
+
+        @Override
+        public <T> Iterable<T> children(Class<T> type) {
+          throw new UnsupportedOperationException("children(Class<T> type) is not supported");
+        }
+
+        @Override
+        public BooleanCondition reduce() {
+          return this;
+        }
+
+        @Override
+        protected boolean evaluatesTrivially() {
+          return false;
+        }
+      };
+
+  @Test
+  public void reduceAnd_CutOffNonTrivialWhenPossible() throws Exception {
+    BooleanCondition nonReduced = and(false, NO_TRIVIAL_EVALUATION);
+    BooleanCondition reduced = valueOf(false);
+    assertEquals(nonReduced.reduce(), reduced);
+  }
+
+  @Test
+  public void reduceAnd_CutOffNonTrivialWhenPossibleSwapped() throws Exception {
+    BooleanCondition nonReduced = and(NO_TRIVIAL_EVALUATION, valueOf(false));
+    BooleanCondition reduced = valueOf(false);
+    assertEquals(nonReduced.reduce(), reduced);
+  }
+
+  @Test
+  public void reduceAnd_KeepNonTrivialWhenNoCutOffPossible() throws Exception {
+    BooleanCondition nonReduced = and(true, NO_TRIVIAL_EVALUATION);
+    BooleanCondition reduced = and(true, NO_TRIVIAL_EVALUATION);
+    assertEquals(nonReduced.reduce(), reduced);
+  }
+
+  @Test
+  public void reduceAnd_KeepNonTrivialWhenNoCutOffPossibleSwapped() throws Exception {
+    BooleanCondition nonReduced = and(NO_TRIVIAL_EVALUATION, valueOf(true));
+    BooleanCondition reduced = and(NO_TRIVIAL_EVALUATION, valueOf(true));
+    assertEquals(nonReduced.reduce(), reduced);
+  }
+
+  @Test
+  public void reduceOr_CutOffNonTrivialWhenPossible() throws Exception {
+    BooleanCondition nonReduced = or(true, NO_TRIVIAL_EVALUATION);
+    BooleanCondition reduced = valueOf(true);
+    assertEquals(nonReduced.reduce(), reduced);
+  }
+
+  @Test
+  public void reduceOr_CutOffNonTrivialWhenPossibleSwapped() throws Exception {
+    BooleanCondition nonReduced = or(NO_TRIVIAL_EVALUATION, valueOf(true));
+    BooleanCondition reduced = valueOf(true);
+    assertEquals(nonReduced.reduce(), reduced);
+  }
+
+  @Test
+  public void reduceOr_KeepNonTrivialWhenNoCutOffPossible() throws Exception {
+    BooleanCondition nonReduced = or(false, NO_TRIVIAL_EVALUATION);
+    BooleanCondition reduced = or(false, NO_TRIVIAL_EVALUATION);
+    assertEquals(nonReduced.reduce(), reduced);
+  }
+
+  @Test
+  public void reduceOr_KeepNonTrivialWhenNoCutOffPossibleSwapped() throws Exception {
+    BooleanCondition nonReduced = or(NO_TRIVIAL_EVALUATION, valueOf(false));
+    BooleanCondition reduced = or(NO_TRIVIAL_EVALUATION, valueOf(false));
+    assertEquals(nonReduced.reduce(), reduced);
+  }
+
+  @Test
+  public void reduceNot_ReduceIrrelevant() throws Exception {
+    BooleanCondition nonReduced = not(valueOf(true));
+    BooleanCondition reduced = valueOf(false);
+    assertEquals(nonReduced.reduce(), reduced);
+  }
+
+  @Test
+  public void reduceNot_ReduceIrrelevant2() throws Exception {
+    BooleanCondition nonReduced = not(valueOf(false));
+    BooleanCondition reduced = valueOf(true);
+    assertEquals(nonReduced.reduce(), reduced);
+  }
+
+  @Test
+  public void reduceNot_KeepNonTrivialWhenNoCutOffPossible() throws Exception {
+    BooleanCondition nonReduced = not(NO_TRIVIAL_EVALUATION);
+    BooleanCondition reduced = not(NO_TRIVIAL_EVALUATION);
+    assertEquals(nonReduced.reduce(), reduced);
+  }
+
+  @Test
+  public void reduceComplexTreeToSingleValue() throws Exception {
+    //        AND
+    //       /   \
+    //      OR   NOT
+    //     /  \    \
+    //   NTE NTE  TRUE
+    BooleanCondition nonReduced =
+        and(or(NO_TRIVIAL_EVALUATION, NO_TRIVIAL_EVALUATION), not(valueOf(true)));
+    BooleanCondition reduced = valueOf(false);
+    assertEquals(nonReduced.reduce(), reduced);
+  }
+
+  @Test
+  public void reduceComplexTreeToSmallerTree() throws Exception {
+    //        AND
+    //       /   \
+    //      OR    OR
+    //     /  \   / \
+    //   NTE NTE  T  F
+    BooleanCondition nonReduced =
+        and(or(NO_TRIVIAL_EVALUATION, NO_TRIVIAL_EVALUATION), or(valueOf(true), valueOf(false)));
+    BooleanCondition reduced = and(or(NO_TRIVIAL_EVALUATION, NO_TRIVIAL_EVALUATION), valueOf(true));
+    assertEquals(nonReduced.reduce(), reduced);
+  }
+}
diff --git a/javatests/com/google/gerrit/extensions/registration/DynamicSetTest.java b/javatests/com/google/gerrit/extensions/registration/DynamicSetTest.java
new file mode 100644
index 0000000..0542c35
--- /dev/null
+++ b/javatests/com/google/gerrit/extensions/registration/DynamicSetTest.java
@@ -0,0 +1,141 @@
+// Copyright (C) 2015 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.google.gerrit.extensions.registration;
+
+import static com.google.common.truth.Truth.assertThat;
+import static java.util.stream.Collectors.toSet;
+
+import com.google.inject.Key;
+import com.google.inject.Provider;
+import com.google.inject.util.Providers;
+import java.util.Iterator;
+import org.junit.Test;
+
+public class DynamicSetTest {
+  // In tests for {@link DynamicSet#contains(Object)}, be sure to avoid
+  // {@code assertThat(ds).contains(...) @} and
+  // {@code assertThat(ds).DoesNotContains(...) @} as (since
+  // {@link DynamicSet@} is not a {@link Collection@}) those boil down to
+  // iterating over the {@link DynamicSet@} and checking equality instead
+  // of calling {@link DynamicSet#contains(Object)}.
+  // To test for {@link DynamicSet#contains(Object)}, use
+  // {@code assertThat(ds.contains(...)).isTrue() @} and
+  // {@code assertThat(ds.contains(...)).isFalse() @} instead.
+
+  @Test
+  public void containsWithEmpty() throws Exception {
+    DynamicSet<Integer> ds = new DynamicSet<>();
+    assertThat(ds.contains(2)).isFalse(); // See above comment about ds.contains
+  }
+
+  @Test
+  public void containsTrueWithSingleElement() throws Exception {
+    DynamicSet<Integer> ds = new DynamicSet<>();
+    ds.add("gerrit", 2);
+
+    assertThat(ds.contains(2)).isTrue(); // See above comment about ds.contains
+  }
+
+  @Test
+  public void containsFalseWithSingleElement() throws Exception {
+    DynamicSet<Integer> ds = new DynamicSet<>();
+    ds.add("gerrit", 2);
+
+    assertThat(ds.contains(3)).isFalse(); // See above comment about ds.contains
+  }
+
+  @Test
+  public void containsTrueWithTwoElements() throws Exception {
+    DynamicSet<Integer> ds = new DynamicSet<>();
+    ds.add("gerrit", 2);
+    ds.add("gerrit", 4);
+
+    assertThat(ds.contains(4)).isTrue(); // See above comment about ds.contains
+  }
+
+  @Test
+  public void containsFalseWithTwoElements() throws Exception {
+    DynamicSet<Integer> ds = new DynamicSet<>();
+    ds.add("gerrit", 2);
+    ds.add("gerrit", 4);
+
+    assertThat(ds.contains(3)).isFalse(); // See above comment about ds.contains
+  }
+
+  @Test
+  public void containsDynamic() throws Exception {
+    DynamicSet<Integer> ds = new DynamicSet<>();
+    ds.add("gerrit", 2);
+
+    Key<Integer> key = Key.get(Integer.class);
+    ReloadableRegistrationHandle<Integer> handle = ds.add("gerrit", key, Providers.of(4));
+
+    ds.add("gerrit", 6);
+
+    // At first, 4 is contained.
+    assertThat(ds.contains(4)).isTrue(); // See above comment about ds.contains
+
+    // Then we remove 4.
+    handle.remove();
+
+    // And now 4 should no longer be contained.
+    assertThat(ds.contains(4)).isFalse(); // See above comment about ds.contains
+  }
+
+  @Test
+  public void plugins() {
+    DynamicSet<Integer> ds = new DynamicSet<>();
+    ds.add("foo", 1);
+    ds.add("bar", 2);
+    ds.add("bar", 3);
+
+    assertThat(ds.plugins()).containsExactly("bar", "foo").inOrder();
+  }
+
+  @Test
+  public void byPlugin() {
+    DynamicSet<Integer> ds = new DynamicSet<>();
+    ds.add("foo", 1);
+    ds.add("bar", 2);
+    ds.add("bar", 3);
+
+    assertThat(ds.byPlugin("foo").stream().map(Provider::get).collect(toSet())).containsExactly(1);
+    assertThat(ds.byPlugin("bar").stream().map(Provider::get).collect(toSet()))
+        .containsExactly(2, 3);
+  }
+
+  @Test
+  public void entryIterator() {
+    DynamicSet<Integer> ds = new DynamicSet<>();
+    ds.add("foo", 1);
+    ds.add("bar", 2);
+    ds.add("bar", 3);
+
+    Iterator<Extension<Integer>> entryIterator = ds.entries().iterator();
+    Extension<Integer> next = entryIterator.next();
+    assertThat(next.getPluginName()).isEqualTo("foo");
+    assertThat(next.getProvider().get()).isEqualTo(1);
+
+    next = entryIterator.next();
+    assertThat(next.getPluginName()).isEqualTo("bar");
+    assertThat(next.getProvider().get()).isEqualTo(2);
+
+    next = entryIterator.next();
+    assertThat(next.getPluginName()).isEqualTo("bar");
+    assertThat(next.getProvider().get()).isEqualTo(3);
+
+    assertThat(entryIterator.hasNext()).isFalse();
+  }
+}
diff --git a/javatests/com/google/gerrit/git/testing/BUILD b/javatests/com/google/gerrit/git/testing/BUILD
new file mode 100644
index 0000000..56e9ec2
--- /dev/null
+++ b/javatests/com/google/gerrit/git/testing/BUILD
@@ -0,0 +1,10 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+junit_tests(
+    name = "testing_tests",
+    srcs = glob(["*.java"]),
+    deps = [
+        "//java/com/google/gerrit/git/testing",
+        "//lib/truth",
+    ],
+)
diff --git a/javatests/com/google/gerrit/git/testing/PushResultSubjectTest.java b/javatests/com/google/gerrit/git/testing/PushResultSubjectTest.java
new file mode 100644
index 0000000..3bf815b
--- /dev/null
+++ b/javatests/com/google/gerrit/git/testing/PushResultSubjectTest.java
@@ -0,0 +1,53 @@
+// 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.
+
+package com.google.gerrit.git.testing;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.git.testing.PushResultSubject.parseProcessed;
+import static com.google.gerrit.git.testing.PushResultSubject.trimMessages;
+
+import org.junit.Test;
+
+public class PushResultSubjectTest {
+  @Test
+  public void testTrimMessages() {
+    assertThat(trimMessages(null)).isNull();
+    assertThat(trimMessages("")).isEqualTo("");
+    assertThat(trimMessages(" \n ")).isEqualTo("");
+    assertThat(trimMessages("\n Foo\nBar\n\nProcessing changes: 1, 2, 3 done   \n"))
+        .isEqualTo("Foo\nBar");
+  }
+
+  @Test
+  public void testParseProcessed() {
+    assertThat(parseProcessed(null)).isEmpty();
+    assertThat(parseProcessed("some other output")).isEmpty();
+    assertThat(parseProcessed("Processing changes: done\n")).isEmpty();
+    assertThat(parseProcessed("Processing changes: refs: 1, done \n")).containsExactly("refs", 1);
+    assertThat(parseProcessed("Processing changes: new: 1, updated: 2, refs: 3, done \n"))
+        .containsExactly("new", 1, "updated", 2, "refs", 3)
+        .inOrder();
+    assertThat(
+            parseProcessed(
+                "Some\nlonger\nmessage\nProcessing changes: new: 1\r"
+                    + "Processing changes: new: 1, updated: 1\r"
+                    + "Processing changes: new: 1, updated: 2, done"))
+        .containsExactly("new", 1, "updated", 2)
+        .inOrder();
+
+    // Atypical, but could potentially happen if there is an uncaught exception.
+    assertThat(parseProcessed("Processing changes: refs: 1")).containsExactly("refs", 1);
+  }
+}
diff --git a/javatests/com/google/gerrit/gpg/BUILD b/javatests/com/google/gerrit/gpg/BUILD
new file mode 100644
index 0000000..baf65b7
--- /dev/null
+++ b/javatests/com/google/gerrit/gpg/BUILD
@@ -0,0 +1,34 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+junit_tests(
+    name = "gpg_tests",
+    srcs = glob(["**/*.java"]),
+    tags = ["no_windows"],
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/gpg",
+        "//java/com/google/gerrit/gpg/testing:gpg-test-util",
+        "//java/com/google/gerrit/lifecycle",
+        "//java/com/google/gerrit/lucene",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/server/cache/h2",
+        "//java/com/google/gerrit/server/project/testing:project-test-util",
+        "//java/com/google/gerrit/server/schema",
+        "//java/com/google/gerrit/testing:gerrit-test-util",
+        "//lib:guava",
+        "//lib:gwtorm",
+        "//lib/bouncycastle:bcpg",
+        "//lib/bouncycastle:bcpg-neverlink",
+        "//lib/bouncycastle:bcprov",
+        "//lib/bouncycastle:bcprov-neverlink",
+        "//lib/flogger:api",
+        "//lib/guice",
+        "//lib/guice:guice-assistedinject",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/jgit/org.eclipse.jgit.junit:junit",
+        "//lib/truth",
+    ],
+)
diff --git a/javatests/com/google/gerrit/gpg/GerritPublicKeyCheckerTest.java b/javatests/com/google/gerrit/gpg/GerritPublicKeyCheckerTest.java
new file mode 100644
index 0000000..685f42d
--- /dev/null
+++ b/javatests/com/google/gerrit/gpg/GerritPublicKeyCheckerTest.java
@@ -0,0 +1,439 @@
+// Copyright (C) 2015 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.google.gerrit.gpg;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.gpg.GerritPublicKeyChecker.toExtIdKey;
+import static com.google.gerrit.gpg.PublicKeyStore.keyToString;
+import static com.google.gerrit.gpg.testing.TestKeys.validKeyWithSecondUserId;
+import static com.google.gerrit.gpg.testing.TestTrustKeys.keyA;
+import static com.google.gerrit.gpg.testing.TestTrustKeys.keyB;
+import static com.google.gerrit.gpg.testing.TestTrustKeys.keyC;
+import static com.google.gerrit.gpg.testing.TestTrustKeys.keyD;
+import static com.google.gerrit.gpg.testing.TestTrustKeys.keyE;
+import static org.eclipse.jgit.lib.RefUpdate.Result.FAST_FORWARD;
+import static org.eclipse.jgit.lib.RefUpdate.Result.FORCED;
+import static org.eclipse.jgit.lib.RefUpdate.Result.NEW;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterators;
+import com.google.gerrit.extensions.common.GpgKeyInfo.Status;
+import com.google.gerrit.gpg.testing.TestKey;
+import com.google.gerrit.lifecycle.LifecycleManager;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.ServerInitiated;
+import com.google.gerrit.server.account.AccountManager;
+import com.google.gerrit.server.account.AccountsUpdate;
+import com.google.gerrit.server.account.AuthRequest;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.schema.SchemaCreator;
+import com.google.gerrit.server.util.RequestContext;
+import com.google.gerrit.server.util.ThreadLocalRequestContext;
+import com.google.gerrit.testing.InMemoryDatabase;
+import com.google.gerrit.testing.InMemoryModule;
+import com.google.gerrit.testing.NoteDbMode;
+import com.google.inject.Guice;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Provider;
+import com.google.inject.util.Providers;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.bouncycastle.openpgp.PGPPublicKey;
+import org.bouncycastle.openpgp.PGPPublicKeyRing;
+import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.transport.PushCertificateIdent;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/** Unit tests for {@link GerritPublicKeyChecker}. */
+public class GerritPublicKeyCheckerTest {
+  @Inject @ServerInitiated private Provider<AccountsUpdate> accountsUpdateProvider;
+
+  @Inject private AccountManager accountManager;
+
+  @Inject private GerritPublicKeyChecker.Factory checkerFactory;
+
+  @Inject private IdentifiedUser.GenericFactory userFactory;
+
+  @Inject private InMemoryDatabase schemaFactory;
+
+  @Inject private SchemaCreator schemaCreator;
+
+  @Inject private ThreadLocalRequestContext requestContext;
+
+  private LifecycleManager lifecycle;
+  private ReviewDb db;
+  private Account.Id userId;
+  private IdentifiedUser user;
+  private Repository storeRepo;
+  private PublicKeyStore store;
+
+  @Before
+  public void setUpInjector() throws Exception {
+    Config cfg = InMemoryModule.newDefaultConfig();
+    cfg.setInt("receive", null, "maxTrustDepth", 2);
+    cfg.setStringList(
+        "receive",
+        null,
+        "trustedKey",
+        ImmutableList.of(
+            Fingerprint.toString(keyB().getPublicKey().getFingerprint()),
+            Fingerprint.toString(keyD().getPublicKey().getFingerprint())));
+    Injector injector =
+        Guice.createInjector(new InMemoryModule(cfg, NoteDbMode.newNotesMigrationFromEnv()));
+
+    lifecycle = new LifecycleManager();
+    lifecycle.add(injector);
+    injector.injectMembers(this);
+    lifecycle.start();
+
+    db = schemaFactory.open();
+    schemaCreator.create(db);
+    userId = accountManager.authenticate(AuthRequest.forUser("user")).getAccountId();
+    // Note: does not match any key in TestKeys.
+    accountsUpdateProvider
+        .get()
+        .update("Set Preferred Email", userId, u -> u.setPreferredEmail("user@example.com"));
+    user = reloadUser();
+
+    requestContext.setContext(
+        new RequestContext() {
+          @Override
+          public CurrentUser getUser() {
+            return user;
+          }
+
+          @Override
+          public Provider<ReviewDb> getReviewDbProvider() {
+            return Providers.of(db);
+          }
+        });
+
+    storeRepo = new InMemoryRepository(new DfsRepositoryDescription("repo"));
+    store = new PublicKeyStore(storeRepo);
+  }
+
+  @After
+  public void tearDown() throws Exception {
+    store.close();
+    storeRepo.close();
+  }
+
+  private IdentifiedUser addUser(String name) throws Exception {
+    AuthRequest req = AuthRequest.forUser(name);
+    Account.Id id = accountManager.authenticate(req).getAccountId();
+    return userFactory.create(id);
+  }
+
+  private IdentifiedUser reloadUser() {
+    user = userFactory.create(userId);
+    return user;
+  }
+
+  @After
+  public void tearDownInjector() {
+    if (lifecycle != null) {
+      lifecycle.stop();
+    }
+    if (db != null) {
+      db.close();
+    }
+    InMemoryDatabase.drop(schemaFactory);
+  }
+
+  @Test
+  public void defaultGpgCertificationMatchesEmail() throws Exception {
+    TestKey key = validKeyWithSecondUserId();
+    PublicKeyChecker checker = checkerFactory.create(user, store).disableTrust();
+    assertProblems(
+        checker.check(key.getPublicKey()),
+        Status.BAD,
+        "Key must contain a valid certification for one of the following "
+            + "identities:\n"
+            + "  gerrit:user\n"
+            + "  username:user");
+
+    addExternalId("test", "test", "test5@example.com");
+    checker = checkerFactory.create(user, store).disableTrust();
+    assertNoProblems(checker.check(key.getPublicKey()));
+  }
+
+  @Test
+  public void defaultGpgCertificationDoesNotMatchEmail() throws Exception {
+    addExternalId("test", "test", "nobody@example.com");
+    PublicKeyChecker checker = checkerFactory.create(user, store).disableTrust();
+    assertProblems(
+        checker.check(validKeyWithSecondUserId().getPublicKey()),
+        Status.BAD,
+        "Key must contain a valid certification for one of the following "
+            + "identities:\n"
+            + "  gerrit:user\n"
+            + "  nobody@example.com\n"
+            + "  test:test\n"
+            + "  username:user");
+  }
+
+  @Test
+  public void manualCertificationMatchesExternalId() throws Exception {
+    addExternalId("foo", "myId", null);
+    PublicKeyChecker checker = checkerFactory.create(user, store).disableTrust();
+    assertNoProblems(checker.check(validKeyWithSecondUserId().getPublicKey()));
+  }
+
+  @Test
+  public void manualCertificationDoesNotMatchExternalId() throws Exception {
+    addExternalId("foo", "otherId", null);
+    PublicKeyChecker checker = checkerFactory.create(user, store).disableTrust();
+    assertProblems(
+        checker.check(validKeyWithSecondUserId().getPublicKey()),
+        Status.BAD,
+        "Key must contain a valid certification for one of the following "
+            + "identities:\n"
+            + "  foo:otherId\n"
+            + "  gerrit:user\n"
+            + "  username:user");
+  }
+
+  @Test
+  public void noExternalIds() throws Exception {
+    accountsUpdateProvider
+        .get()
+        .update(
+            "Delete External IDs",
+            user.getAccountId(),
+            (a, u) -> u.deleteExternalIds(a.getExternalIds()));
+    reloadUser();
+
+    TestKey key = validKeyWithSecondUserId();
+    PublicKeyChecker checker = checkerFactory.create(user, store).disableTrust();
+    assertProblems(
+        checker.check(key.getPublicKey()),
+        Status.BAD,
+        "No identities found for user; check http://test/settings#Identities");
+
+    checker = checkerFactory.create().setStore(store).disableTrust();
+    assertProblems(
+        checker.check(key.getPublicKey()), Status.BAD, "Key is not associated with any users");
+    insertExtId(ExternalId.create(toExtIdKey(key.getPublicKey()), user.getAccountId()));
+    assertProblems(checker.check(key.getPublicKey()), Status.BAD, "No identities found for user");
+  }
+
+  @Test
+  public void checkValidTrustChainAndCorrectExternalIds() throws Exception {
+    // A---Bx
+    //  \
+    //   \---C---D
+    //        \
+    //         \---Ex
+    //
+    // The server ultimately trusts B and D.
+    // D and E trust C to be a valid introducer of depth 2.
+    IdentifiedUser userB = addUser("userB");
+    TestKey keyA = add(keyA(), user);
+    TestKey keyB = add(keyB(), userB);
+    add(keyC(), addUser("userC"));
+    add(keyD(), addUser("userD"));
+    add(keyE(), addUser("userE"));
+
+    // Checker for A, checking A.
+    PublicKeyChecker checkerA = checkerFactory.create(user, store);
+    assertNoProblems(checkerA.check(keyA.getPublicKey()));
+
+    // Checker for B, checking B. Trust chain and IDs are correct, so the only
+    // problem is with the key itself.
+    PublicKeyChecker checkerB = checkerFactory.create(userB, store);
+    assertProblems(checkerB.check(keyB.getPublicKey()), Status.BAD, "Key is expired");
+  }
+
+  @Test
+  public void checkWithValidKeyButWrongExpectedUserInChecker() throws Exception {
+    // A---Bx
+    //  \
+    //   \---C---D
+    //        \
+    //         \---Ex
+    //
+    // The server ultimately trusts B and D.
+    // D and E trust C to be a valid introducer of depth 2.
+    IdentifiedUser userB = addUser("userB");
+    TestKey keyA = add(keyA(), user);
+    TestKey keyB = add(keyB(), userB);
+    add(keyC(), addUser("userC"));
+    add(keyD(), addUser("userD"));
+    add(keyE(), addUser("userE"));
+
+    // Checker for A, checking B.
+    PublicKeyChecker checkerA = checkerFactory.create(user, store);
+    assertProblems(
+        checkerA.check(keyB.getPublicKey()),
+        Status.BAD,
+        "Key is expired",
+        "Key must contain a valid certification for one of the following"
+            + " identities:\n"
+            + "  gerrit:user\n"
+            + "  mailto:testa@example.com\n"
+            + "  testa@example.com\n"
+            + "  username:user");
+
+    // Checker for B, checking A.
+    PublicKeyChecker checkerB = checkerFactory.create(userB, store);
+    assertProblems(
+        checkerB.check(keyA.getPublicKey()),
+        Status.BAD,
+        "Key must contain a valid certification for one of the following"
+            + " identities:\n"
+            + "  gerrit:userB\n"
+            + "  mailto:testb@example.com\n"
+            + "  testb@example.com\n"
+            + "  username:userB");
+  }
+
+  @Test
+  public void checkTrustChainWithExpiredKey() throws Exception {
+    // A---Bx
+    //
+    // The server ultimately trusts B.
+    TestKey keyA = add(keyA(), user);
+    TestKey keyB = add(keyB(), addUser("userB"));
+
+    PublicKeyChecker checker = checkerFactory.create(user, store);
+    assertProblems(
+        checker.check(keyA.getPublicKey()),
+        Status.OK,
+        "No path to a trusted key",
+        "Certification by "
+            + keyToString(keyB.getPublicKey())
+            + " is valid, but key is not trusted",
+        "Key D24FE467 used for certification is not in store");
+  }
+
+  @Test
+  public void checkTrustChainUsingCheckerWithoutExpectedKey() throws Exception {
+    // A---Bx
+    //  \
+    //   \---C---D
+    //        \
+    //         \---Ex
+    //
+    // The server ultimately trusts B and D.
+    // D and E trust C to be a valid introducer of depth 2.
+    TestKey keyA = add(keyA(), user);
+    TestKey keyB = add(keyB(), addUser("userB"));
+    TestKey keyC = add(keyC(), addUser("userC"));
+    TestKey keyD = add(keyD(), addUser("userD"));
+    TestKey keyE = add(keyE(), addUser("userE"));
+
+    // This checker can check any key, so the only problems come from issues
+    // with the keys themselves, not having invalid user IDs.
+    PublicKeyChecker checker = checkerFactory.create().setStore(store);
+    assertNoProblems(checker.check(keyA.getPublicKey()));
+    assertProblems(checker.check(keyB.getPublicKey()), Status.BAD, "Key is expired");
+    assertNoProblems(checker.check(keyC.getPublicKey()));
+    assertNoProblems(checker.check(keyD.getPublicKey()));
+    assertProblems(
+        checker.check(keyE.getPublicKey()),
+        Status.BAD,
+        "Key is expired",
+        "No path to a trusted key");
+  }
+
+  @Test
+  public void keyLaterInTrustChainMissingUserId() throws Exception {
+    // A---Bx
+    //  \
+    //   \---C
+    //
+    // The server ultimately trusts B.
+    // C signed A's key but is not in the store.
+    TestKey keyA = add(keyA(), user);
+
+    PGPPublicKeyRing keyRingB = keyB().getPublicKeyRing();
+    PGPPublicKey keyB = keyRingB.getPublicKey();
+    keyB = PGPPublicKey.removeCertification(keyB, keyB.getUserIDs().next());
+    keyRingB = PGPPublicKeyRing.insertPublicKey(keyRingB, keyB);
+    add(keyRingB, addUser("userB"));
+
+    PublicKeyChecker checkerA = checkerFactory.create(user, store);
+    assertProblems(
+        checkerA.check(keyA.getPublicKey()),
+        Status.OK,
+        "No path to a trusted key",
+        "Certification by " + keyToString(keyB) + " is valid, but key is not trusted",
+        "Key D24FE467 used for certification is not in store");
+  }
+
+  private void add(PGPPublicKeyRing kr, IdentifiedUser user) throws Exception {
+    Account.Id id = user.getAccountId();
+    List<ExternalId> newExtIds = new ArrayList<>(2);
+    newExtIds.add(ExternalId.create(toExtIdKey(kr.getPublicKey()), id));
+
+    String userId = Iterators.getOnlyElement(kr.getPublicKey().getUserIDs(), null);
+    if (userId != null) {
+      String email = PushCertificateIdent.parse(userId).getEmailAddress();
+      assertThat(email).contains("@");
+      newExtIds.add(ExternalId.createEmail(id, email));
+    }
+
+    store.add(kr);
+    PersonIdent ident = new PersonIdent("A U Thor", "author@example.com");
+    CommitBuilder cb = new CommitBuilder();
+    cb.setAuthor(ident);
+    cb.setCommitter(ident);
+    assertThat(store.save(cb)).isAnyOf(NEW, FAST_FORWARD, FORCED);
+
+    accountsUpdateProvider.get().update("Add External IDs", id, u -> u.addExternalIds(newExtIds));
+  }
+
+  private TestKey add(TestKey k, IdentifiedUser user) throws Exception {
+    add(k.getPublicKeyRing(), user);
+    return k;
+  }
+
+  private void assertProblems(
+      CheckResult result, Status expectedStatus, String first, String... rest) throws Exception {
+    List<String> expectedProblems = new ArrayList<>();
+    expectedProblems.add(first);
+    expectedProblems.addAll(Arrays.asList(rest));
+    assertThat(result.getStatus()).isEqualTo(expectedStatus);
+    assertThat(result.getProblems()).containsExactlyElementsIn(expectedProblems).inOrder();
+  }
+
+  private void assertNoProblems(CheckResult result) {
+    assertThat(result.getStatus()).isEqualTo(Status.TRUSTED);
+    assertThat(result.getProblems()).isEmpty();
+  }
+
+  private void addExternalId(String scheme, String id, String email) throws Exception {
+    insertExtId(ExternalId.createWithEmail(scheme, id, user.getAccountId(), email));
+  }
+
+  private void insertExtId(ExternalId extId) throws Exception {
+    accountsUpdateProvider
+        .get()
+        .update("Add External ID", extId.accountId(), u -> u.addExternalId(extId));
+    reloadUser();
+  }
+}
diff --git a/javatests/com/google/gerrit/gpg/PublicKeyCheckerTest.java b/javatests/com/google/gerrit/gpg/PublicKeyCheckerTest.java
new file mode 100644
index 0000000..48d5266
--- /dev/null
+++ b/javatests/com/google/gerrit/gpg/PublicKeyCheckerTest.java
@@ -0,0 +1,377 @@
+// Copyright (C) 2015 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.google.gerrit.gpg;
+
+import static com.google.gerrit.gpg.PublicKeyStore.keyToString;
+import static com.google.gerrit.gpg.testing.TestKeys.expiredKey;
+import static com.google.gerrit.gpg.testing.TestKeys.keyRevokedByExpiredKeyAfterExpiration;
+import static com.google.gerrit.gpg.testing.TestKeys.keyRevokedByExpiredKeyBeforeExpiration;
+import static com.google.gerrit.gpg.testing.TestKeys.revokedCompromisedKey;
+import static com.google.gerrit.gpg.testing.TestKeys.revokedNoLongerUsedKey;
+import static com.google.gerrit.gpg.testing.TestKeys.selfRevokedKey;
+import static com.google.gerrit.gpg.testing.TestKeys.validKeyWithExpiration;
+import static com.google.gerrit.gpg.testing.TestKeys.validKeyWithoutExpiration;
+import static com.google.gerrit.gpg.testing.TestTrustKeys.keyA;
+import static com.google.gerrit.gpg.testing.TestTrustKeys.keyB;
+import static com.google.gerrit.gpg.testing.TestTrustKeys.keyC;
+import static com.google.gerrit.gpg.testing.TestTrustKeys.keyD;
+import static com.google.gerrit.gpg.testing.TestTrustKeys.keyE;
+import static com.google.gerrit.gpg.testing.TestTrustKeys.keyF;
+import static com.google.gerrit.gpg.testing.TestTrustKeys.keyG;
+import static com.google.gerrit.gpg.testing.TestTrustKeys.keyH;
+import static com.google.gerrit.gpg.testing.TestTrustKeys.keyI;
+import static com.google.gerrit.gpg.testing.TestTrustKeys.keyJ;
+import static org.bouncycastle.bcpg.SignatureSubpacketTags.REVOCATION_KEY;
+import static org.bouncycastle.openpgp.PGPSignature.DIRECT_KEY;
+import static org.junit.Assert.assertEquals;
+
+import com.google.gerrit.gpg.testing.TestKey;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import org.bouncycastle.openpgp.PGPPublicKey;
+import org.bouncycastle.openpgp.PGPPublicKeyRing;
+import org.bouncycastle.openpgp.PGPSignature;
+import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+public class PublicKeyCheckerTest {
+  @Rule public ExpectedException thrown = ExpectedException.none();
+
+  private InMemoryRepository repo;
+  private PublicKeyStore store;
+
+  @Before
+  public void setUp() {
+    repo = new InMemoryRepository(new DfsRepositoryDescription("repo"));
+    store = new PublicKeyStore(repo);
+  }
+
+  @After
+  public void tearDown() {
+    if (store != null) {
+      store.close();
+      store = null;
+    }
+    if (repo != null) {
+      repo.close();
+      repo = null;
+    }
+  }
+
+  @Test
+  public void validKey() throws Exception {
+    assertNoProblems(validKeyWithoutExpiration());
+  }
+
+  @Test
+  public void keyExpiringInFuture() throws Exception {
+    TestKey k = validKeyWithExpiration();
+
+    PublicKeyChecker checker = new PublicKeyChecker().setStore(store);
+    assertNoProblems(checker, k);
+
+    checker.setEffectiveTime(parseDate("2015-07-10 12:00:00 -0400"));
+    assertNoProblems(checker, k);
+
+    checker.setEffectiveTime(parseDate("2075-07-10 12:00:00 -0400"));
+    assertProblems(checker, k, "Key is expired");
+  }
+
+  @Test
+  public void expiredKeyIsExpired() throws Exception {
+    assertProblems(expiredKey(), "Key is expired");
+  }
+
+  @Test
+  public void selfRevokedKeyIsRevoked() throws Exception {
+    assertProblems(selfRevokedKey(), "Key is revoked (key material has been compromised)");
+  }
+
+  // Test keys specific to this test are at the bottom of this class. Each test
+  // has a diagram of the trust network, where:
+  //  - The notation M---N indicates N trusts M.
+  //  - An 'x' indicates the key is expired.
+
+  @Test
+  public void trustValidPathLength2() throws Exception {
+    // A---Bx
+    //  \
+    //   \---C---D
+    //        \
+    //         \---Ex
+    //
+    // D and E trust C to be a valid introducer of depth 2.
+    TestKey ka = add(keyA());
+    TestKey kb = add(keyB());
+    TestKey kc = add(keyC());
+    TestKey kd = add(keyD());
+    TestKey ke = add(keyE());
+    save();
+
+    PublicKeyChecker checker = newChecker(2, kb, kd);
+    assertNoProblems(checker, ka);
+    assertProblems(checker, kb, "Key is expired");
+    assertNoProblems(checker, kc);
+    assertNoProblems(checker, kd);
+    assertProblems(checker, ke, "Key is expired", "No path to a trusted key");
+  }
+
+  @Test
+  public void trustValidPathLength1() throws Exception {
+    // A---Bx
+    //  \
+    //   \---C---D
+    //        \
+    //         \---Ex
+    //
+    // D and E trust C to be a valid introducer of depth 2.
+    TestKey ka = add(keyA());
+    TestKey kb = add(keyB());
+    TestKey kc = add(keyC());
+    TestKey kd = add(keyD());
+    add(keyE());
+    save();
+
+    PublicKeyChecker checker = newChecker(1, kd);
+    assertProblems(checker, ka, "No path to a trusted key", notTrusted(kb), notTrusted(kc));
+  }
+
+  @Test
+  public void trustCycle() throws Exception {
+    // F---G---F, in a cycle.
+    TestKey kf = add(keyF());
+    TestKey kg = add(keyG());
+    save();
+
+    PublicKeyChecker checker = newChecker(10, keyA());
+    assertProblems(checker, kf, "No path to a trusted key", notTrusted(kg));
+    assertProblems(checker, kg, "No path to a trusted key", notTrusted(kf));
+  }
+
+  @Test
+  public void trustInsufficientDepthInSignature() throws Exception {
+    // H---I---J, but J is only trusted to length 1.
+    TestKey kh = add(keyH());
+    TestKey ki = add(keyI());
+    add(keyJ());
+    save();
+
+    PublicKeyChecker checker = newChecker(10, keyJ());
+
+    // J trusts I to a depth of 1, so I itself is valid, but I's certification
+    // of K is not valid.
+    assertNoProblems(checker, ki);
+    assertProblems(checker, kh, "No path to a trusted key", notTrusted(ki));
+  }
+
+  @Test
+  public void revokedKeyDueToCompromise() throws Exception {
+    TestKey k = add(revokedCompromisedKey());
+    add(validKeyWithoutExpiration());
+    save();
+
+    assertProblems(k, "Key is revoked (key material has been compromised): test6 compromised");
+
+    PGPPublicKeyRing kr = removeRevokers(k.getPublicKeyRing());
+    store.add(kr);
+    save();
+
+    // Key no longer specified as revoker.
+    assertNoProblems(kr.getPublicKey());
+  }
+
+  @Test
+  public void revokedKeyDueToCompromiseRevokesKeyRetroactively() throws Exception {
+    TestKey k = add(revokedCompromisedKey());
+    add(validKeyWithoutExpiration());
+    save();
+
+    String problem = "Key is revoked (key material has been compromised): test6 compromised";
+    assertProblems(k, problem);
+
+    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    PublicKeyChecker checker =
+        new PublicKeyChecker().setStore(store).setEffectiveTime(df.parse("2010-01-01 12:00:00"));
+    assertProblems(checker, k, problem);
+  }
+
+  @Test
+  public void revokedByKeyNotPresentInStore() throws Exception {
+    TestKey k = add(revokedCompromisedKey());
+    save();
+
+    assertProblems(k, "Key is revoked (key material has been compromised): test6 compromised");
+  }
+
+  @Test
+  public void revokedKeyDueToNoLongerBeingUsed() throws Exception {
+    TestKey k = add(revokedNoLongerUsedKey());
+    add(validKeyWithoutExpiration());
+    save();
+
+    assertProblems(k, "Key is revoked (retired and no longer valid): test7 not used");
+  }
+
+  @Test
+  public void revokedKeyDueToNoLongerBeingUsedDoesNotRevokeKeyRetroactively() throws Exception {
+    TestKey k = add(revokedNoLongerUsedKey());
+    add(validKeyWithoutExpiration());
+    save();
+
+    assertProblems(k, "Key is revoked (retired and no longer valid): test7 not used");
+
+    PublicKeyChecker checker =
+        new PublicKeyChecker()
+            .setStore(store)
+            .setEffectiveTime(parseDate("2010-01-01 12:00:00 -0400"));
+    assertNoProblems(checker, k);
+  }
+
+  @Test
+  public void keyRevokedByExpiredKeyAfterExpirationIsNotRevoked() throws Exception {
+    TestKey k = add(keyRevokedByExpiredKeyAfterExpiration());
+    add(expiredKey());
+    save();
+
+    PublicKeyChecker checker = new PublicKeyChecker().setStore(store);
+    assertNoProblems(checker, k);
+  }
+
+  @Test
+  public void keyRevokedByExpiredKeyBeforeExpirationIsRevoked() throws Exception {
+    TestKey k = add(keyRevokedByExpiredKeyBeforeExpiration());
+    add(expiredKey());
+    save();
+
+    PublicKeyChecker checker = new PublicKeyChecker().setStore(store);
+    assertProblems(checker, k, "Key is revoked (retired and no longer valid): test9 not used");
+
+    // Set time between key creation and revocation.
+    checker.setEffectiveTime(parseDate("2005-08-01 13:00:00 -0400"));
+    assertNoProblems(checker, k);
+  }
+
+  private PGPPublicKeyRing removeRevokers(PGPPublicKeyRing kr) {
+    PGPPublicKey k = kr.getPublicKey();
+    @SuppressWarnings("unchecked")
+    Iterator<PGPSignature> sigs = k.getSignaturesOfType(DIRECT_KEY);
+    while (sigs.hasNext()) {
+      PGPSignature sig = sigs.next();
+      if (sig.getHashedSubPackets().hasSubpacket(REVOCATION_KEY)) {
+        k = PGPPublicKey.removeCertification(k, sig);
+      }
+    }
+    return PGPPublicKeyRing.insertPublicKey(kr, k);
+  }
+
+  private PublicKeyChecker newChecker(int maxTrustDepth, TestKey... trusted) {
+    Map<Long, Fingerprint> fps = new HashMap<>();
+    for (TestKey k : trusted) {
+      Fingerprint fp = new Fingerprint(k.getPublicKey().getFingerprint());
+      fps.put(fp.getId(), fp);
+    }
+    return new PublicKeyChecker().enableTrust(maxTrustDepth, fps).setStore(store);
+  }
+
+  private TestKey add(TestKey k) {
+    store.add(k.getPublicKeyRing());
+    return k;
+  }
+
+  private void save() throws Exception {
+    PersonIdent ident = new PersonIdent("A U Thor", "author@example.com");
+    CommitBuilder cb = new CommitBuilder();
+    cb.setAuthor(ident);
+    cb.setCommitter(ident);
+    RefUpdate.Result result = store.save(cb);
+    switch (result) {
+      case NEW:
+      case FAST_FORWARD:
+      case FORCED:
+        break;
+      case IO_FAILURE:
+      case LOCK_FAILURE:
+      case NOT_ATTEMPTED:
+      case NO_CHANGE:
+      case REJECTED:
+      case REJECTED_CURRENT_BRANCH:
+      case RENAMED:
+      case REJECTED_MISSING_OBJECT:
+      case REJECTED_OTHER_REASON:
+      default:
+        throw new AssertionError(result);
+    }
+  }
+
+  private void assertProblems(PublicKeyChecker checker, TestKey k, String first, String... rest) {
+    CheckResult result = checker.setStore(store).check(k.getPublicKey());
+    assertEquals(list(first, rest), result.getProblems());
+  }
+
+  private void assertNoProblems(PublicKeyChecker checker, TestKey k) {
+    CheckResult result = checker.setStore(store).check(k.getPublicKey());
+    assertEquals(Collections.emptyList(), result.getProblems());
+  }
+
+  private void assertProblems(TestKey tk, String first, String... rest) {
+    assertProblems(tk.getPublicKey(), first, rest);
+  }
+
+  private void assertNoProblems(TestKey tk) {
+    assertNoProblems(tk.getPublicKey());
+  }
+
+  private void assertProblems(PGPPublicKey k, String first, String... rest) {
+    CheckResult result = new PublicKeyChecker().setStore(store).check(k);
+    assertEquals(list(first, rest), result.getProblems());
+  }
+
+  private void assertNoProblems(PGPPublicKey k) {
+    CheckResult result = new PublicKeyChecker().setStore(store).check(k);
+    assertEquals(Collections.emptyList(), result.getProblems());
+  }
+
+  private static String notTrusted(TestKey k) {
+    return "Certification by "
+        + keyToString(k.getPublicKey())
+        + " is valid, but key is not trusted";
+  }
+
+  private static Date parseDate(String str) throws Exception {
+    return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z").parse(str);
+  }
+
+  private static List<String> list(String first, String[] rest) {
+    List<String> all = new ArrayList<>();
+    all.add(first);
+    all.addAll(Arrays.asList(rest));
+    return all;
+  }
+}
diff --git a/javatests/com/google/gerrit/gpg/PublicKeyStoreTest.java b/javatests/com/google/gerrit/gpg/PublicKeyStoreTest.java
new file mode 100644
index 0000000..2fc06a6
--- /dev/null
+++ b/javatests/com/google/gerrit/gpg/PublicKeyStoreTest.java
@@ -0,0 +1,255 @@
+// Copyright (C) 2015 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.google.gerrit.gpg;
+
+import static com.google.gerrit.gpg.PublicKeyStore.REFS_GPG_KEYS;
+import static com.google.gerrit.gpg.PublicKeyStore.keyIdToString;
+import static com.google.gerrit.gpg.PublicKeyStore.keyObjectId;
+import static com.google.gerrit.gpg.PublicKeyStore.keyToString;
+import static com.google.gerrit.gpg.testing.TestKeys.validKeyWithExpiration;
+import static com.google.gerrit.gpg.testing.TestKeys.validKeyWithSecondUserId;
+import static com.google.gerrit.gpg.testing.TestKeys.validKeyWithoutExpiration;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import com.google.common.collect.Iterators;
+import com.google.gerrit.gpg.testing.TestKey;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+import org.bouncycastle.openpgp.PGPPublicKey;
+import org.bouncycastle.openpgp.PGPPublicKeyRing;
+import org.bouncycastle.openpgp.PGPPublicKeyRingCollection;
+import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.notes.NoteMap;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.junit.Before;
+import org.junit.Test;
+
+public class PublicKeyStoreTest {
+  private TestRepository<?> tr;
+  private PublicKeyStore store;
+
+  @Before
+  public void setUp() throws Exception {
+    tr = new TestRepository<>(new InMemoryRepository(new DfsRepositoryDescription("pubkeys")));
+    store = new PublicKeyStore(tr.getRepository());
+  }
+
+  @Test
+  public void testKeyIdToString() throws Exception {
+    PGPPublicKey key = validKeyWithoutExpiration().getPublicKey();
+    assertEquals("46328A8C", keyIdToString(key.getKeyID()));
+  }
+
+  @Test
+  public void testKeyToString() throws Exception {
+    PGPPublicKey key = validKeyWithoutExpiration().getPublicKey();
+    assertEquals(
+        "46328A8C Testuser One <test1@example.com>"
+            + " (04AE A7ED 2F82 1133 E5B1  28D1 ED06 25DC 4632 8A8C)",
+        keyToString(key));
+  }
+
+  @Test
+  public void testKeyObjectId() throws Exception {
+    PGPPublicKey key = validKeyWithoutExpiration().getPublicKey();
+    String objId = keyObjectId(key.getKeyID()).name();
+    assertEquals("ed0625dc46328a8c000000000000000000000000", objId);
+    assertEquals(keyIdToString(key.getKeyID()).toLowerCase(), objId.substring(8, 16));
+  }
+
+  @Test
+  public void get() throws Exception {
+    TestKey key1 = validKeyWithoutExpiration();
+    tr.branch(REFS_GPG_KEYS)
+        .commit()
+        .add(keyObjectId(key1.getKeyId()).name(), key1.getPublicKeyArmored())
+        .create();
+    TestKey key2 = validKeyWithExpiration();
+    tr.branch(REFS_GPG_KEYS)
+        .commit()
+        .add(keyObjectId(key2.getKeyId()).name(), key2.getPublicKeyArmored())
+        .create();
+
+    assertKeys(key1.getKeyId(), key1);
+    assertKeys(key2.getKeyId(), key2);
+  }
+
+  @Test
+  public void getMultiple() throws Exception {
+    TestKey key1 = validKeyWithoutExpiration();
+    TestKey key2 = validKeyWithExpiration();
+    tr.branch(REFS_GPG_KEYS)
+        .commit()
+        .add(
+            keyObjectId(key1.getKeyId()).name(),
+            key1.getPublicKeyArmored()
+                // Mismatched for this key ID, but we can still read it out.
+                + key2.getPublicKeyArmored())
+        .create();
+    assertKeys(key1.getKeyId(), key1, key2);
+  }
+
+  @Test
+  public void save() throws Exception {
+    TestKey key1 = validKeyWithoutExpiration();
+    TestKey key2 = validKeyWithExpiration();
+    store.add(key1.getPublicKeyRing());
+    store.add(key2.getPublicKeyRing());
+
+    assertEquals(RefUpdate.Result.NEW, store.save(newCommitBuilder()));
+
+    assertKeys(key1.getKeyId(), key1);
+    assertKeys(key2.getKeyId(), key2);
+  }
+
+  @Test
+  public void saveAppendsToExistingList() throws Exception {
+    TestKey key1 = validKeyWithoutExpiration();
+    TestKey key2 = validKeyWithExpiration();
+    tr.branch(REFS_GPG_KEYS)
+        .commit()
+        // Mismatched for this key ID, but we can still read it out.
+        .add(keyObjectId(key1.getKeyId()).name(), key2.getPublicKeyArmored())
+        .create();
+
+    store.add(key1.getPublicKeyRing());
+    assertEquals(RefUpdate.Result.FAST_FORWARD, store.save(newCommitBuilder()));
+
+    assertKeys(key1.getKeyId(), key1, key2);
+
+    try (ObjectReader reader = tr.getRepository().newObjectReader();
+        RevWalk rw = new RevWalk(reader)) {
+      NoteMap notes =
+          NoteMap.read(
+              reader,
+              tr.getRevWalk()
+                  .parseCommit(tr.getRepository().exactRef(REFS_GPG_KEYS).getObjectId()));
+      String contents =
+          new String(reader.open(notes.get(keyObjectId(key1.getKeyId()))).getBytes(), UTF_8);
+      String header = "-----BEGIN PGP PUBLIC KEY BLOCK-----";
+      int i1 = contents.indexOf(header);
+      assertTrue(i1 >= 0);
+      int i2 = contents.indexOf(header, i1 + header.length());
+      assertTrue(i2 >= 0);
+    }
+  }
+
+  @Test
+  public void updateExisting() throws Exception {
+    TestKey key5 = validKeyWithSecondUserId();
+    PGPPublicKeyRing keyRing = key5.getPublicKeyRing();
+    PGPPublicKey key = keyRing.getPublicKey();
+    PGPPublicKey subKey =
+        keyRing.getPublicKey(Iterators.get(keyRing.getPublicKeys(), 1).getKeyID());
+    store.add(keyRing);
+    assertEquals(RefUpdate.Result.NEW, store.save(newCommitBuilder()));
+
+    assertUserIds(
+        store.get(key5.getKeyId()).iterator().next(),
+        "Testuser Five <test5@example.com>",
+        "foo:myId");
+
+    keyRing = PGPPublicKeyRing.removePublicKey(keyRing, subKey);
+    keyRing = PGPPublicKeyRing.removePublicKey(keyRing, key);
+    key = PGPPublicKey.removeCertification(key, "foo:myId");
+    keyRing = PGPPublicKeyRing.insertPublicKey(keyRing, key);
+    keyRing = PGPPublicKeyRing.insertPublicKey(keyRing, subKey);
+    store.add(keyRing);
+    assertEquals(RefUpdate.Result.FAST_FORWARD, store.save(newCommitBuilder()));
+
+    Iterator<PGPPublicKeyRing> keyRings = store.get(key.getKeyID()).iterator();
+    keyRing = keyRings.next();
+    assertFalse(keyRings.hasNext());
+    assertUserIds(keyRing, "Testuser Five <test5@example.com>");
+  }
+
+  @Test
+  public void remove() throws Exception {
+    TestKey key1 = validKeyWithoutExpiration();
+    store.add(key1.getPublicKeyRing());
+    assertEquals(RefUpdate.Result.NEW, store.save(newCommitBuilder()));
+    assertKeys(key1.getKeyId(), key1);
+
+    store.remove(key1.getPublicKey().getFingerprint());
+    assertEquals(RefUpdate.Result.FAST_FORWARD, store.save(newCommitBuilder()));
+    assertKeys(key1.getKeyId());
+  }
+
+  @Test
+  public void removeNonexisting() throws Exception {
+    TestKey key1 = validKeyWithoutExpiration();
+    store.add(key1.getPublicKeyRing());
+    assertEquals(RefUpdate.Result.NEW, store.save(newCommitBuilder()));
+
+    TestKey key2 = validKeyWithExpiration();
+    store.remove(key2.getPublicKey().getFingerprint());
+    assertEquals(RefUpdate.Result.NO_CHANGE, store.save(newCommitBuilder()));
+    assertKeys(key1.getKeyId(), key1);
+  }
+
+  @Test
+  public void addThenRemove() throws Exception {
+    TestKey key1 = validKeyWithoutExpiration();
+    store.add(key1.getPublicKeyRing());
+    store.remove(key1.getPublicKey().getFingerprint());
+    assertEquals(RefUpdate.Result.NO_CHANGE, store.save(newCommitBuilder()));
+    assertKeys(key1.getKeyId());
+  }
+
+  private void assertKeys(long keyId, TestKey... expected) throws Exception {
+    Set<String> expectedStrings = new TreeSet<>();
+    for (TestKey k : expected) {
+      expectedStrings.add(keyToString(k.getPublicKey()));
+    }
+    PGPPublicKeyRingCollection actual = store.get(keyId);
+    Set<String> actualStrings = new TreeSet<>();
+    for (PGPPublicKeyRing k : actual) {
+      actualStrings.add(keyToString(k.getPublicKey()));
+    }
+    assertEquals(expectedStrings, actualStrings);
+  }
+
+  private void assertUserIds(PGPPublicKeyRing keyRing, String... expected) throws Exception {
+    List<String> actual = new ArrayList<>();
+    Iterator<String> userIds =
+        store.get(keyRing.getPublicKey().getKeyID()).iterator().next().getPublicKey().getUserIDs();
+    while (userIds.hasNext()) {
+      actual.add(userIds.next());
+    }
+
+    assertEquals(Arrays.asList(expected), actual);
+  }
+
+  private CommitBuilder newCommitBuilder() {
+    CommitBuilder cb = new CommitBuilder();
+    PersonIdent ident = new PersonIdent("A U Thor", "author@example.com");
+    cb.setAuthor(ident);
+    cb.setCommitter(ident);
+    return cb;
+  }
+}
diff --git a/javatests/com/google/gerrit/gpg/PushCertificateCheckerTest.java b/javatests/com/google/gerrit/gpg/PushCertificateCheckerTest.java
new file mode 100644
index 0000000..266f868
--- /dev/null
+++ b/javatests/com/google/gerrit/gpg/PushCertificateCheckerTest.java
@@ -0,0 +1,204 @@
+// Copyright (C) 2015 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.google.gerrit.gpg;
+
+import static com.google.gerrit.gpg.PublicKeyStore.keyIdToString;
+import static com.google.gerrit.gpg.PublicKeyStore.keyToString;
+import static com.google.gerrit.gpg.testing.TestKeys.expiredKey;
+import static com.google.gerrit.gpg.testing.TestKeys.validKeyWithExpiration;
+import static com.google.gerrit.gpg.testing.TestKeys.validKeyWithoutExpiration;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.junit.Assert.assertEquals;
+
+import com.google.gerrit.gpg.testing.TestKey;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import org.bouncycastle.bcpg.ArmoredOutputStream;
+import org.bouncycastle.bcpg.BCPGOutputStream;
+import org.bouncycastle.openpgp.PGPSignature;
+import org.bouncycastle.openpgp.PGPSignatureGenerator;
+import org.bouncycastle.openpgp.PGPSignatureSubpacketGenerator;
+import org.bouncycastle.openpgp.PGPUtil;
+import org.bouncycastle.openpgp.operator.bc.BcPGPContentSignerBuilder;
+import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.transport.PushCertificate;
+import org.eclipse.jgit.transport.PushCertificateIdent;
+import org.eclipse.jgit.transport.PushCertificateParser;
+import org.eclipse.jgit.transport.SignedPushConfig;
+import org.junit.Before;
+import org.junit.Test;
+
+public class PushCertificateCheckerTest {
+  private InMemoryRepository repo;
+  private PublicKeyStore store;
+  private SignedPushConfig signedPushConfig;
+  private PushCertificateChecker checker;
+
+  @Before
+  public void setUp() throws Exception {
+    TestKey key1 = validKeyWithoutExpiration();
+    TestKey key3 = expiredKey();
+    repo = new InMemoryRepository(new DfsRepositoryDescription("repo"));
+    store = new PublicKeyStore(repo);
+    store.add(key1.getPublicKeyRing());
+    store.add(key3.getPublicKeyRing());
+
+    PersonIdent ident = new PersonIdent("A U Thor", "author@example.com");
+    CommitBuilder cb = new CommitBuilder();
+    cb.setAuthor(ident);
+    cb.setCommitter(ident);
+    assertEquals(RefUpdate.Result.NEW, store.save(cb));
+
+    signedPushConfig = new SignedPushConfig();
+    signedPushConfig.setCertNonceSeed("sekret");
+    signedPushConfig.setCertNonceSlopLimit(60 * 24);
+    checker = newChecker(true);
+  }
+
+  private PushCertificateChecker newChecker(boolean checkNonce) {
+    PublicKeyChecker keyChecker = new PublicKeyChecker().setStore(store);
+    return new PushCertificateChecker(keyChecker) {
+      @Override
+      protected Repository getRepository() {
+        return repo;
+      }
+
+      @Override
+      protected boolean shouldClose(Repository repo) {
+        return false;
+      }
+    }.setCheckNonce(checkNonce);
+  }
+
+  @Test
+  public void validCert() throws Exception {
+    PushCertificate cert = newSignedCert(validNonce(), validKeyWithoutExpiration());
+    assertNoProblems(cert);
+  }
+
+  @Test
+  public void invalidNonce() throws Exception {
+    PushCertificate cert = newSignedCert("invalid-nonce", validKeyWithoutExpiration());
+    assertProblems(cert, "Invalid nonce");
+  }
+
+  @Test
+  public void invalidNonceNotChecked() throws Exception {
+    checker = newChecker(false);
+    PushCertificate cert = newSignedCert("invalid-nonce", validKeyWithoutExpiration());
+    assertNoProblems(cert);
+  }
+
+  @Test
+  public void missingKey() throws Exception {
+    TestKey key2 = validKeyWithExpiration();
+    PushCertificate cert = newSignedCert(validNonce(), key2);
+    assertProblems(cert, "No public keys found for key ID " + keyIdToString(key2.getKeyId()));
+  }
+
+  @Test
+  public void invalidKey() throws Exception {
+    TestKey key3 = expiredKey();
+    PushCertificate cert = newSignedCert(validNonce(), key3);
+    assertProblems(
+        cert, "Invalid public key " + keyToString(key3.getPublicKey()) + ":\n  Key is expired");
+  }
+
+  @Test
+  public void signatureByExpiredKeyBeforeExpiration() throws Exception {
+    TestKey key3 = expiredKey();
+    Date now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z").parse("2005-07-10 12:00:00 -0400");
+    PushCertificate cert = newSignedCert(validNonce(), key3, now);
+    assertNoProblems(cert);
+  }
+
+  private String validNonce() {
+    return signedPushConfig
+        .getNonceGenerator()
+        .createNonce(repo, System.currentTimeMillis() / 1000);
+  }
+
+  private PushCertificate newSignedCert(String nonce, TestKey signingKey) throws Exception {
+    return newSignedCert(nonce, signingKey, null);
+  }
+
+  private PushCertificate newSignedCert(String nonce, TestKey signingKey, Date now)
+      throws Exception {
+    PushCertificateIdent ident =
+        new PushCertificateIdent(signingKey.getFirstUserId(), System.currentTimeMillis(), -7 * 60);
+    String payload =
+        "certificate version 0.1\n"
+            + "pusher "
+            + ident.getRaw()
+            + "\n"
+            + "pushee test://localhost/repo.git\n"
+            + "nonce "
+            + nonce
+            + "\n"
+            + "\n"
+            + "0000000000000000000000000000000000000000"
+            + " deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"
+            + " refs/heads/master\n";
+    PGPSignatureGenerator gen =
+        new PGPSignatureGenerator(
+            new BcPGPContentSignerBuilder(signingKey.getPublicKey().getAlgorithm(), PGPUtil.SHA1));
+
+    if (now != null) {
+      PGPSignatureSubpacketGenerator subGen = new PGPSignatureSubpacketGenerator();
+      subGen.setSignatureCreationTime(false, now);
+      gen.setHashedSubpackets(subGen.generate());
+    }
+
+    gen.init(PGPSignature.BINARY_DOCUMENT, signingKey.getPrivateKey());
+    gen.update(payload.getBytes(UTF_8));
+    PGPSignature sig = gen.generate();
+
+    ByteArrayOutputStream bout = new ByteArrayOutputStream();
+    try (BCPGOutputStream out = new BCPGOutputStream(new ArmoredOutputStream(bout))) {
+      sig.encode(out);
+    }
+
+    String cert = payload + new String(bout.toByteArray(), UTF_8);
+    Reader reader = new InputStreamReader(new ByteArrayInputStream(cert.getBytes(UTF_8)), UTF_8);
+    PushCertificateParser parser = new PushCertificateParser(repo, signedPushConfig);
+    return parser.parse(reader);
+  }
+
+  private void assertProblems(PushCertificate cert, String first, String... rest) throws Exception {
+    List<String> expected = new ArrayList<>();
+    expected.add(first);
+    expected.addAll(Arrays.asList(rest));
+    CheckResult result = checker.check(cert).getCheckResult();
+    assertEquals(expected, result.getProblems());
+  }
+
+  private void assertNoProblems(PushCertificate cert) {
+    CheckResult result = checker.check(cert).getCheckResult();
+    assertEquals(Collections.emptyList(), result.getProblems());
+  }
+}
diff --git a/javatests/com/google/gerrit/httpd/AllRequestFilterFilterProxyTest.java b/javatests/com/google/gerrit/httpd/AllRequestFilterFilterProxyTest.java
new file mode 100644
index 0000000..1c6559b0
--- /dev/null
+++ b/javatests/com/google/gerrit/httpd/AllRequestFilterFilterProxyTest.java
@@ -0,0 +1,360 @@
+// Copyright (C) 2015 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.google.gerrit.httpd;
+
+import static org.easymock.EasyMock.anyObject;
+import static org.easymock.EasyMock.capture;
+import static org.easymock.EasyMock.eq;
+
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.registration.ReloadableRegistrationHandle;
+import com.google.gerrit.server.plugins.Plugin;
+import com.google.gerrit.util.http.testutil.FakeHttpServletRequest;
+import com.google.gerrit.util.http.testutil.FakeHttpServletResponse;
+import com.google.inject.Key;
+import com.google.inject.util.Providers;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.easymock.Capture;
+import org.easymock.EasyMockSupport;
+import org.easymock.IMocksControl;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AllRequestFilterFilterProxyTest {
+  /**
+   * Set of filters for FilterProxy
+   *
+   * <p>This set is used to as set of filters when fetching an {@link AllRequestFilter.FilterProxy}
+   * instance through {@link #getFilterProxy()}.
+   */
+  private DynamicSet<AllRequestFilter> filters;
+
+  @Before
+  public void setUp() throws Exception {
+    // Force starting each test with an initially empty set of filters.
+    // Filters get added by the tests themselves.
+    filters = new DynamicSet<>();
+  }
+
+  // The wrapping of {@link #getFilterProxy()} and
+  // {@link #addFilter(AllRequestFilter)} into separate methods may seem
+  // overengineered at this point. However, if in the future we decide to not
+  // test the inner class directly, but rather test from the outside using
+  // Guice Injectors, it is now sufficient to change only those two methods,
+  // and we need not mess with the individual tests.
+
+  /**
+   * Obtain a FilterProxy with a known DynamicSet of filters
+   *
+   * <p>The returned {@link AllRequestFilter.FilterProxy} can have new filters added dynamically by
+   * calling {@link #addFilter(AllRequestFilter)}.
+   */
+  private AllRequestFilter.FilterProxy getFilterProxy() {
+    return new AllRequestFilter.FilterProxy(filters);
+  }
+
+  /**
+   * Add a filter to created FilterProxy instances
+   *
+   * <p>This method adds the given filter to all {@link AllRequestFilter.FilterProxy} instances
+   * created by {@link #getFilterProxy()}.
+   */
+  private ReloadableRegistrationHandle<AllRequestFilter> addFilter(AllRequestFilter filter) {
+    Key<AllRequestFilter> key = Key.get(AllRequestFilter.class);
+    return filters.add("gerrit", key, Providers.of(filter));
+  }
+
+  @Test
+  public void noFilters() throws Exception {
+    EasyMockSupport ems = new EasyMockSupport();
+
+    FilterConfig config = ems.createMock(FilterConfig.class);
+    HttpServletRequest req = new FakeHttpServletRequest();
+    HttpServletResponse res = new FakeHttpServletResponse();
+
+    FilterChain chain = ems.createMock(FilterChain.class);
+    chain.doFilter(req, res);
+
+    ems.replayAll();
+
+    AllRequestFilter.FilterProxy filterProxy = getFilterProxy();
+
+    filterProxy.init(config);
+    filterProxy.doFilter(req, res, chain);
+    filterProxy.destroy();
+
+    ems.verifyAll();
+  }
+
+  @Test
+  public void singleFilterNoBubbling() throws Exception {
+    EasyMockSupport ems = new EasyMockSupport();
+
+    FilterConfig config = ems.createMock("config", FilterConfig.class);
+    HttpServletRequest req = new FakeHttpServletRequest();
+    HttpServletResponse res = new FakeHttpServletResponse();
+
+    FilterChain chain = ems.createMock("chain", FilterChain.class);
+
+    AllRequestFilter filter = ems.createStrictMock("filter", AllRequestFilter.class);
+    filter.init(config);
+    filter.doFilter(eq(req), eq(res), anyObject(FilterChain.class));
+    filter.destroy();
+
+    ems.replayAll();
+
+    AllRequestFilter.FilterProxy filterProxy = getFilterProxy();
+    addFilter(filter);
+
+    filterProxy.init(config);
+    filterProxy.doFilter(req, res, chain);
+    filterProxy.destroy();
+
+    ems.verifyAll();
+  }
+
+  @Test
+  public void singleFilterBubbling() throws Exception {
+    EasyMockSupport ems = new EasyMockSupport();
+
+    FilterConfig config = ems.createMock(FilterConfig.class);
+    HttpServletRequest req = new FakeHttpServletRequest();
+    HttpServletResponse res = new FakeHttpServletResponse();
+
+    IMocksControl mockControl = ems.createStrictControl();
+    FilterChain chain = mockControl.createMock(FilterChain.class);
+
+    Capture<FilterChain> capturedChain = new Capture<>();
+
+    AllRequestFilter filter = mockControl.createMock(AllRequestFilter.class);
+    filter.init(config);
+    filter.doFilter(eq(req), eq(res), capture(capturedChain));
+    chain.doFilter(req, res);
+    filter.destroy();
+
+    ems.replayAll();
+
+    AllRequestFilter.FilterProxy filterProxy = getFilterProxy();
+    addFilter(filter);
+
+    filterProxy.init(config);
+    filterProxy.doFilter(req, res, chain);
+    capturedChain.getValue().doFilter(req, res);
+    filterProxy.destroy();
+
+    ems.verifyAll();
+  }
+
+  @Test
+  public void twoFiltersNoBubbling() throws Exception {
+    EasyMockSupport ems = new EasyMockSupport();
+
+    FilterConfig config = ems.createMock(FilterConfig.class);
+    HttpServletRequest req = new FakeHttpServletRequest();
+    HttpServletResponse res = new FakeHttpServletResponse();
+
+    IMocksControl mockControl = ems.createStrictControl();
+    FilterChain chain = mockControl.createMock(FilterChain.class);
+
+    AllRequestFilter filterA = mockControl.createMock(AllRequestFilter.class);
+
+    AllRequestFilter filterB = mockControl.createMock(AllRequestFilter.class);
+    filterA.init(config);
+    filterB.init(config);
+    filterA.doFilter(eq(req), eq(res), anyObject(FilterChain.class));
+    filterA.destroy();
+    filterB.destroy();
+
+    ems.replayAll();
+
+    AllRequestFilter.FilterProxy filterProxy = getFilterProxy();
+    addFilter(filterA);
+    addFilter(filterB);
+
+    filterProxy.init(config);
+    filterProxy.doFilter(req, res, chain);
+    filterProxy.destroy();
+
+    ems.verifyAll();
+  }
+
+  @Test
+  public void twoFiltersBubbling() throws Exception {
+    EasyMockSupport ems = new EasyMockSupport();
+
+    FilterConfig config = ems.createMock(FilterConfig.class);
+    HttpServletRequest req = new FakeHttpServletRequest();
+    HttpServletResponse res = new FakeHttpServletResponse();
+
+    IMocksControl mockControl = ems.createStrictControl();
+    FilterChain chain = mockControl.createMock(FilterChain.class);
+
+    Capture<FilterChain> capturedChainA = new Capture<>();
+    Capture<FilterChain> capturedChainB = new Capture<>();
+
+    AllRequestFilter filterA = mockControl.createMock(AllRequestFilter.class);
+    AllRequestFilter filterB = mockControl.createMock(AllRequestFilter.class);
+
+    filterA.init(config);
+    filterB.init(config);
+    filterA.doFilter(eq(req), eq(res), capture(capturedChainA));
+    filterB.doFilter(eq(req), eq(res), capture(capturedChainB));
+    chain.doFilter(req, res);
+    filterA.destroy();
+    filterB.destroy();
+
+    ems.replayAll();
+
+    AllRequestFilter.FilterProxy filterProxy = getFilterProxy();
+    addFilter(filterA);
+    addFilter(filterB);
+
+    filterProxy.init(config);
+    filterProxy.doFilter(req, res, chain);
+    capturedChainA.getValue().doFilter(req, res);
+    capturedChainB.getValue().doFilter(req, res);
+    filterProxy.destroy();
+
+    ems.verifyAll();
+  }
+
+  @Test
+  public void postponedLoading() throws Exception {
+    EasyMockSupport ems = new EasyMockSupport();
+
+    FilterConfig config = ems.createMock(FilterConfig.class);
+    HttpServletRequest req1 = new FakeHttpServletRequest();
+    HttpServletRequest req2 = new FakeHttpServletRequest();
+    HttpServletResponse res1 = new FakeHttpServletResponse();
+    HttpServletResponse res2 = new FakeHttpServletResponse();
+
+    IMocksControl mockControl = ems.createStrictControl();
+    FilterChain chain = mockControl.createMock("chain", FilterChain.class);
+
+    Capture<FilterChain> capturedChainA1 = new Capture<>();
+    Capture<FilterChain> capturedChainA2 = new Capture<>();
+    Capture<FilterChain> capturedChainB = new Capture<>();
+
+    AllRequestFilter filterA = mockControl.createMock("filterA", AllRequestFilter.class);
+    AllRequestFilter filterB = mockControl.createMock("filterB", AllRequestFilter.class);
+
+    filterA.init(config);
+    filterA.doFilter(eq(req1), eq(res1), capture(capturedChainA1));
+    chain.doFilter(req1, res1);
+
+    filterA.doFilter(eq(req2), eq(res2), capture(capturedChainA2));
+    filterB.init(config); // <-- This is crucial part. filterB got loaded
+    // after filterProxy's init finished. Nonetheless filterB gets initialized.
+    filterB.doFilter(eq(req2), eq(res2), capture(capturedChainB));
+    chain.doFilter(req2, res2);
+
+    filterA.destroy();
+    filterB.destroy();
+
+    ems.replayAll();
+
+    AllRequestFilter.FilterProxy filterProxy = getFilterProxy();
+    addFilter(filterA);
+
+    filterProxy.init(config);
+    filterProxy.doFilter(req1, res1, chain);
+    capturedChainA1.getValue().doFilter(req1, res1);
+
+    addFilter(filterB); // <-- Adds filter after filterProxy's init got called.
+    filterProxy.doFilter(req2, res2, chain);
+    capturedChainA2.getValue().doFilter(req2, res2);
+    capturedChainB.getValue().doFilter(req2, res2);
+
+    filterProxy.destroy();
+
+    ems.verifyAll();
+  }
+
+  @Test
+  public void dynamicUnloading() throws Exception {
+    EasyMockSupport ems = new EasyMockSupport();
+
+    FilterConfig config = ems.createMock(FilterConfig.class);
+    HttpServletRequest req1 = new FakeHttpServletRequest();
+    HttpServletRequest req2 = new FakeHttpServletRequest();
+    HttpServletRequest req3 = new FakeHttpServletRequest();
+    HttpServletResponse res1 = new FakeHttpServletResponse();
+    HttpServletResponse res2 = new FakeHttpServletResponse();
+    HttpServletResponse res3 = new FakeHttpServletResponse();
+
+    Plugin plugin = ems.createMock(Plugin.class);
+
+    IMocksControl mockControl = ems.createStrictControl();
+    FilterChain chain = mockControl.createMock("chain", FilterChain.class);
+
+    Capture<FilterChain> capturedChainA1 = new Capture<>();
+    Capture<FilterChain> capturedChainB1 = new Capture<>();
+    Capture<FilterChain> capturedChainB2 = new Capture<>();
+
+    AllRequestFilter filterA = mockControl.createMock("filterA", AllRequestFilter.class);
+    AllRequestFilter filterB = mockControl.createMock("filterB", AllRequestFilter.class);
+
+    filterA.init(config);
+    filterB.init(config);
+
+    filterA.doFilter(eq(req1), eq(res1), capture(capturedChainA1));
+    filterB.doFilter(eq(req1), eq(res1), capture(capturedChainB1));
+    chain.doFilter(req1, res1);
+
+    filterA.destroy(); // Cleaning up of filterA after it got unloaded
+
+    filterB.doFilter(eq(req2), eq(res2), capture(capturedChainB2));
+    chain.doFilter(req2, res2);
+
+    filterB.destroy(); // Cleaning up of filterA after it got unloaded
+
+    chain.doFilter(req3, res3);
+
+    ems.replayAll();
+
+    AllRequestFilter.FilterProxy filterProxy = getFilterProxy();
+    ReloadableRegistrationHandle<AllRequestFilter> handleFilterA = addFilter(filterA);
+    ReloadableRegistrationHandle<AllRequestFilter> handleFilterB = addFilter(filterB);
+
+    filterProxy.init(config);
+
+    // Request #1 with filterA and filterB
+    filterProxy.doFilter(req1, res1, chain);
+    capturedChainA1.getValue().doFilter(req1, res1);
+    capturedChainB1.getValue().doFilter(req1, res1);
+
+    // Unloading filterA
+    handleFilterA.remove();
+    filterProxy.onStopPlugin(plugin);
+
+    // Request #1 only with filterB
+    filterProxy.doFilter(req2, res2, chain);
+    capturedChainA1.getValue().doFilter(req2, res2);
+
+    // Unloading filterB
+    handleFilterB.remove();
+    filterProxy.onStopPlugin(plugin);
+
+    // Request #1 with no additional filters
+    filterProxy.doFilter(req3, res3, chain);
+
+    filterProxy.destroy();
+
+    ems.verifyAll();
+  }
+}
diff --git a/javatests/com/google/gerrit/httpd/BUILD b/javatests/com/google/gerrit/httpd/BUILD
new file mode 100644
index 0000000..ec2df15
--- /dev/null
+++ b/javatests/com/google/gerrit/httpd/BUILD
@@ -0,0 +1,29 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+junit_tests(
+    name = "httpd_tests",
+    srcs = glob(["**/*.java"]),
+    deps = [
+        "//java/com/google/gerrit/common:annotations",
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/httpd",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/util/http",
+        "//javatests/com/google/gerrit/util/http/testutil",
+        "//lib:gson",
+        "//lib:guava",
+        "//lib:gwtorm",
+        "//lib:jimfs",
+        "//lib:junit",
+        "//lib:servlet-api-3_1-without-neverlink",
+        "//lib:soy",
+        "//lib/easymock",
+        "//lib/guice",
+        "//lib/guice:guice-servlet",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/jgit/org.eclipse.jgit.junit:junit",
+        "//lib/truth",
+    ],
+)
diff --git a/gerrit-httpd/src/test/java/com/google/gerrit/httpd/RemoteUserUtilTest.java b/javatests/com/google/gerrit/httpd/RemoteUserUtilTest.java
similarity index 100%
rename from gerrit-httpd/src/test/java/com/google/gerrit/httpd/RemoteUserUtilTest.java
rename to javatests/com/google/gerrit/httpd/RemoteUserUtilTest.java
diff --git a/gerrit-httpd/src/test/java/com/google/gerrit/httpd/plugins/ContextMapperTest.java b/javatests/com/google/gerrit/httpd/plugins/ContextMapperTest.java
similarity index 100%
rename from gerrit-httpd/src/test/java/com/google/gerrit/httpd/plugins/ContextMapperTest.java
rename to javatests/com/google/gerrit/httpd/plugins/ContextMapperTest.java
diff --git a/javatests/com/google/gerrit/httpd/raw/IndexServletTest.java b/javatests/com/google/gerrit/httpd/raw/IndexServletTest.java
new file mode 100644
index 0000000..307a23e
--- /dev/null
+++ b/javatests/com/google/gerrit/httpd/raw/IndexServletTest.java
@@ -0,0 +1,88 @@
+// Copyright (C) 2017 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.google.gerrit.httpd.raw;
+
+import static com.google.common.truth.Truth.assertThat;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.template.soy.data.SoyMapData;
+import java.net.URISyntaxException;
+import org.junit.Test;
+
+public class IndexServletTest {
+  static class TestIndexServlet extends IndexServlet {
+    private static final long serialVersionUID = 1L;
+
+    TestIndexServlet(String canonicalURL, String cdnPath, String faviconPath)
+        throws URISyntaxException {
+      super(canonicalURL, cdnPath, faviconPath);
+    }
+
+    String getIndexSource() {
+      return new String(indexSource, UTF_8);
+    }
+  }
+
+  @Test
+  public void noPathAndNoCDN() throws URISyntaxException {
+    SoyMapData data = IndexServlet.getTemplateData("http://example.com/", null, null);
+    assertThat(data.getSingle("canonicalPath").stringValue()).isEqualTo("");
+    assertThat(data.getSingle("staticResourcePath").stringValue()).isEqualTo("");
+  }
+
+  @Test
+  public void pathAndNoCDN() throws URISyntaxException {
+    SoyMapData data = IndexServlet.getTemplateData("http://example.com/gerrit/", null, null);
+    assertThat(data.getSingle("canonicalPath").stringValue()).isEqualTo("/gerrit");
+    assertThat(data.getSingle("staticResourcePath").stringValue()).isEqualTo("/gerrit");
+  }
+
+  @Test
+  public void noPathAndCDN() throws URISyntaxException {
+    SoyMapData data =
+        IndexServlet.getTemplateData("http://example.com/", "http://my-cdn.com/foo/bar/", null);
+    assertThat(data.getSingle("canonicalPath").stringValue()).isEqualTo("");
+    assertThat(data.getSingle("staticResourcePath").stringValue())
+        .isEqualTo("http://my-cdn.com/foo/bar/");
+  }
+
+  @Test
+  public void pathAndCDN() throws URISyntaxException {
+    SoyMapData data =
+        IndexServlet.getTemplateData(
+            "http://example.com/gerrit", "http://my-cdn.com/foo/bar/", null);
+    assertThat(data.getSingle("canonicalPath").stringValue()).isEqualTo("/gerrit");
+    assertThat(data.getSingle("staticResourcePath").stringValue())
+        .isEqualTo("http://my-cdn.com/foo/bar/");
+  }
+
+  @Test
+  public void renderTemplate() throws URISyntaxException {
+    String testCanonicalUrl = "foo-url";
+    String testCdnPath = "bar-cdn";
+    String testFaviconURL = "zaz-url";
+    TestIndexServlet servlet = new TestIndexServlet(testCanonicalUrl, testCdnPath, testFaviconURL);
+    String output = servlet.getIndexSource();
+    assertThat(output).contains("<!DOCTYPE html>");
+    assertThat(output).contains("window.CANONICAL_PATH = '" + testCanonicalUrl);
+    assertThat(output).contains("<link rel=\"preload\" href=\"" + testCdnPath);
+    assertThat(output)
+        .contains(
+            "<link rel=\"icon\" type=\"image/x-icon\" href=\""
+                + testCanonicalUrl
+                + "/"
+                + testFaviconURL);
+  }
+}
diff --git a/javatests/com/google/gerrit/httpd/raw/ResourceServletTest.java b/javatests/com/google/gerrit/httpd/raw/ResourceServletTest.java
new file mode 100644
index 0000000..6dd15bc
--- /dev/null
+++ b/javatests/com/google/gerrit/httpd/raw/ResourceServletTest.java
@@ -0,0 +1,377 @@
+// Copyright (C) 2015 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.google.gerrit.httpd.raw;
+
+import static com.google.common.truth.Truth.assertThat;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND;
+import static javax.servlet.http.HttpServletResponse.SC_OK;
+
+import com.google.common.base.CharMatcher;
+import com.google.common.base.Strings;
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.collect.Lists;
+import com.google.common.io.ByteStreams;
+import com.google.common.jimfs.Configuration;
+import com.google.common.jimfs.Jimfs;
+import com.google.gerrit.httpd.raw.ResourceServlet.Resource;
+import com.google.gerrit.util.http.testutil.FakeHttpServletRequest;
+import com.google.gerrit.util.http.testutil.FakeHttpServletResponse;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.nio.file.FileSystem;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.attribute.FileTime;
+import java.time.LocalDateTime;
+import java.time.Month;
+import java.time.ZoneOffset;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.zip.GZIPInputStream;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ResourceServletTest {
+  private static Cache<Path, Resource> newCache(int size) {
+    return CacheBuilder.newBuilder().maximumSize(size).recordStats().build();
+  }
+
+  private static class Servlet extends ResourceServlet {
+    private static final long serialVersionUID = 1L;
+
+    private final FileSystem fs;
+
+    private Servlet(FileSystem fs, Cache<Path, Resource> cache, boolean refresh) {
+      super(cache, refresh);
+      this.fs = fs;
+    }
+
+    private Servlet(
+        FileSystem fs, Cache<Path, Resource> cache, boolean refresh, boolean cacheOnClient) {
+      super(cache, refresh, cacheOnClient);
+      this.fs = fs;
+    }
+
+    private Servlet(
+        FileSystem fs, Cache<Path, Resource> cache, boolean refresh, int cacheFileSizeLimitBytes) {
+      super(cache, refresh, true, cacheFileSizeLimitBytes);
+      this.fs = fs;
+    }
+
+    private Servlet(
+        FileSystem fs,
+        Cache<Path, Resource> cache,
+        boolean refresh,
+        boolean cacheOnClient,
+        int cacheFileSizeLimitBytes) {
+      super(cache, refresh, cacheOnClient, cacheFileSizeLimitBytes);
+      this.fs = fs;
+    }
+
+    @Override
+    protected Path getResourcePath(String pathInfo) {
+      return fs.getPath("/" + CharMatcher.is('/').trimLeadingFrom(pathInfo));
+    }
+  }
+
+  private FileSystem fs;
+  private AtomicLong ts;
+
+  @Before
+  public void setUp() {
+    fs = Jimfs.newFileSystem(Configuration.unix());
+    ts =
+        new AtomicLong(
+            LocalDateTime.of(2010, Month.JANUARY, 30, 12, 0, 0)
+                .atOffset(ZoneOffset.ofHours(-8))
+                .toInstant()
+                .toEpochMilli());
+  }
+
+  @Test
+  public void notFoundWithoutRefresh() throws Exception {
+    Cache<Path, Resource> cache = newCache(1);
+    Servlet servlet = new Servlet(fs, cache, false);
+
+    FakeHttpServletResponse res = new FakeHttpServletResponse();
+    servlet.doGet(request("/notfound"), res);
+    assertThat(res.getStatus()).isEqualTo(SC_NOT_FOUND);
+    assertNotCacheable(res);
+    assertCacheHits(cache, 0, 1);
+
+    res = new FakeHttpServletResponse();
+    servlet.doGet(request("/notfound"), res);
+    assertThat(res.getStatus()).isEqualTo(SC_NOT_FOUND);
+    assertNotCacheable(res);
+    assertCacheHits(cache, 1, 1);
+  }
+
+  @Test
+  public void notFoundWithRefresh() throws Exception {
+    Cache<Path, Resource> cache = newCache(1);
+    Servlet servlet = new Servlet(fs, cache, true);
+
+    FakeHttpServletResponse res = new FakeHttpServletResponse();
+    servlet.doGet(request("/notfound"), res);
+    assertThat(res.getStatus()).isEqualTo(SC_NOT_FOUND);
+    assertNotCacheable(res);
+    assertCacheHits(cache, 0, 1);
+
+    res = new FakeHttpServletResponse();
+    servlet.doGet(request("/notfound"), res);
+    assertThat(res.getStatus()).isEqualTo(SC_NOT_FOUND);
+    assertNotCacheable(res);
+    assertCacheHits(cache, 1, 1);
+  }
+
+  @Test
+  public void smallFileWithRefresh() throws Exception {
+    Cache<Path, Resource> cache = newCache(1);
+    Servlet servlet = new Servlet(fs, cache, true);
+
+    writeFile("/foo", "foo1");
+    FakeHttpServletResponse res = new FakeHttpServletResponse();
+    servlet.doGet(request("/foo"), res);
+    assertThat(res.getStatus()).isEqualTo(SC_OK);
+    assertThat(res.getActualBodyString()).isEqualTo("foo1");
+    assertCacheable(res, true);
+    assertHasETag(res);
+    // Miss on getIfPresent, miss on get.
+    assertCacheHits(cache, 0, 2);
+
+    res = new FakeHttpServletResponse();
+    servlet.doGet(request("/foo"), res);
+    assertThat(res.getStatus()).isEqualTo(SC_OK);
+    assertThat(res.getActualBodyString()).isEqualTo("foo1");
+    assertCacheable(res, true);
+    assertHasETag(res);
+    assertCacheHits(cache, 1, 2);
+
+    writeFile("/foo", "foo2");
+    res = new FakeHttpServletResponse();
+    servlet.doGet(request("/foo"), res);
+    assertThat(res.getStatus()).isEqualTo(SC_OK);
+    assertThat(res.getActualBodyString()).isEqualTo("foo2");
+    assertCacheable(res, true);
+    assertHasETag(res);
+    // Hit, invalidate, miss.
+    assertCacheHits(cache, 2, 3);
+  }
+
+  @Test
+  public void smallFileWithoutClientCache() throws Exception {
+    Cache<Path, Resource> cache = newCache(1);
+    Servlet servlet = new Servlet(fs, cache, false, false);
+
+    writeFile("/foo", "foo1");
+    FakeHttpServletResponse res = new FakeHttpServletResponse();
+    servlet.doGet(request("/foo"), res);
+    assertThat(res.getStatus()).isEqualTo(SC_OK);
+    assertThat(res.getActualBodyString()).isEqualTo("foo1");
+    assertNotCacheable(res);
+
+    // Miss on getIfPresent, miss on get.
+    assertCacheHits(cache, 0, 2);
+
+    res = new FakeHttpServletResponse();
+    servlet.doGet(request("/foo"), res);
+    assertThat(res.getStatus()).isEqualTo(SC_OK);
+    assertThat(res.getActualBodyString()).isEqualTo("foo1");
+    assertNotCacheable(res);
+    assertCacheHits(cache, 1, 2);
+
+    writeFile("/foo", "foo2");
+    res = new FakeHttpServletResponse();
+    servlet.doGet(request("/foo"), res);
+    assertThat(res.getStatus()).isEqualTo(SC_OK);
+    assertThat(res.getActualBodyString()).isEqualTo("foo1");
+    assertNotCacheable(res);
+    assertCacheHits(cache, 2, 2);
+  }
+
+  @Test
+  public void smallFileWithoutRefresh() throws Exception {
+    Cache<Path, Resource> cache = newCache(1);
+    Servlet servlet = new Servlet(fs, cache, false);
+
+    writeFile("/foo", "foo1");
+    FakeHttpServletResponse res = new FakeHttpServletResponse();
+    servlet.doGet(request("/foo"), res);
+    assertThat(res.getStatus()).isEqualTo(SC_OK);
+    assertThat(res.getActualBodyString()).isEqualTo("foo1");
+    assertCacheable(res, false);
+    assertHasETag(res);
+    // Miss on getIfPresent, miss on get.
+    assertCacheHits(cache, 0, 2);
+
+    res = new FakeHttpServletResponse();
+    servlet.doGet(request("/foo"), res);
+    assertThat(res.getStatus()).isEqualTo(SC_OK);
+    assertThat(res.getActualBodyString()).isEqualTo("foo1");
+    assertCacheable(res, false);
+    assertHasETag(res);
+    assertCacheHits(cache, 1, 2);
+
+    writeFile("/foo", "foo2");
+    res = new FakeHttpServletResponse();
+    servlet.doGet(request("/foo"), res);
+    assertThat(res.getStatus()).isEqualTo(SC_OK);
+    assertThat(res.getActualBodyString()).isEqualTo("foo1");
+    assertCacheable(res, false);
+    assertHasETag(res);
+    assertCacheHits(cache, 2, 2);
+  }
+
+  @Test
+  public void verySmallFileDoesntBotherWithGzip() throws Exception {
+    Cache<Path, Resource> cache = newCache(1);
+    Servlet servlet = new Servlet(fs, cache, true);
+    writeFile("/foo", "foo1");
+
+    FakeHttpServletRequest req = request("/foo").addHeader("Accept-Encoding", "gzip");
+    FakeHttpServletResponse res = new FakeHttpServletResponse();
+    servlet.doGet(req, res);
+    assertThat(res.getStatus()).isEqualTo(SC_OK);
+    assertThat(res.getHeader("Content-Encoding")).isNull();
+    assertThat(res.getActualBodyString()).isEqualTo("foo1");
+    assertHasETag(res);
+    assertCacheable(res, true);
+  }
+
+  @Test
+  public void smallFileWithGzip() throws Exception {
+    Cache<Path, Resource> cache = newCache(1);
+    Servlet servlet = new Servlet(fs, cache, true);
+    String content = Strings.repeat("a", 100);
+    writeFile("/foo", content);
+
+    FakeHttpServletRequest req = request("/foo").addHeader("Accept-Encoding", "gzip");
+    FakeHttpServletResponse res = new FakeHttpServletResponse();
+    servlet.doGet(req, res);
+    assertThat(res.getStatus()).isEqualTo(SC_OK);
+    assertThat(res.getHeader("Content-Encoding")).isEqualTo("gzip");
+    assertThat(gunzip(res.getActualBody())).isEqualTo(content);
+    assertHasETag(res);
+    assertCacheable(res, true);
+  }
+
+  @Test
+  public void largeFileBypassesCacheRegardlessOfRefreshParamter() throws Exception {
+    for (boolean refresh : Lists.newArrayList(true, false)) {
+      Cache<Path, Resource> cache = newCache(1);
+      Servlet servlet = new Servlet(fs, cache, refresh, 3);
+
+      writeFile("/foo", "foo1");
+      FakeHttpServletResponse res = new FakeHttpServletResponse();
+      servlet.doGet(request("/foo"), res);
+      assertThat(res.getStatus()).isEqualTo(SC_OK);
+      assertThat(res.getActualBodyString()).isEqualTo("foo1");
+      assertThat(res.getHeader("Last-Modified")).isNotNull();
+      assertCacheable(res, refresh);
+      assertHasLastModified(res);
+      assertCacheHits(cache, 0, 1);
+
+      writeFile("/foo", "foo1");
+      res = new FakeHttpServletResponse();
+      servlet.doGet(request("/foo"), res);
+      assertThat(res.getStatus()).isEqualTo(SC_OK);
+      assertThat(res.getActualBodyString()).isEqualTo("foo1");
+      assertThat(res.getHeader("Last-Modified")).isNotNull();
+      assertCacheable(res, refresh);
+      assertHasLastModified(res);
+      assertCacheHits(cache, 0, 2);
+
+      writeFile("/foo", "foo2");
+      res = new FakeHttpServletResponse();
+      servlet.doGet(request("/foo"), res);
+      assertThat(res.getStatus()).isEqualTo(SC_OK);
+      assertThat(res.getActualBodyString()).isEqualTo("foo2");
+      assertThat(res.getHeader("Last-Modified")).isNotNull();
+      assertCacheable(res, refresh);
+      assertHasLastModified(res);
+      assertCacheHits(cache, 0, 3);
+    }
+  }
+
+  @Test
+  public void largeFileWithGzip() throws Exception {
+    Cache<Path, Resource> cache = newCache(1);
+    Servlet servlet = new Servlet(fs, cache, true, 3);
+    String content = Strings.repeat("a", 100);
+    writeFile("/foo", content);
+
+    FakeHttpServletRequest req = request("/foo").addHeader("Accept-Encoding", "gzip");
+    FakeHttpServletResponse res = new FakeHttpServletResponse();
+    servlet.doGet(req, res);
+    assertThat(res.getStatus()).isEqualTo(SC_OK);
+    assertThat(res.getHeader("Content-Encoding")).isEqualTo("gzip");
+    assertThat(gunzip(res.getActualBody())).isEqualTo(content);
+    assertHasLastModified(res);
+    assertCacheable(res, true);
+  }
+
+  // TODO(dborowitz): Check MIME type.
+  // TODO(dborowitz): Test that JS is not gzipped.
+  // TODO(dborowitz): Test ?e parameter.
+  // TODO(dborowitz): Test If-None-Match behavior.
+  // TODO(dborowitz): Test If-Modified-Since behavior.
+
+  private void writeFile(String path, String content) throws Exception {
+    Files.write(fs.getPath(path), content.getBytes(UTF_8));
+    Files.setLastModifiedTime(fs.getPath(path), FileTime.fromMillis(ts.getAndIncrement()));
+  }
+
+  private static void assertCacheHits(Cache<?, ?> cache, int hits, int misses) {
+    assertThat(cache.stats().hitCount()).named("hits").isEqualTo(hits);
+    assertThat(cache.stats().missCount()).named("misses").isEqualTo(misses);
+  }
+
+  private static void assertCacheable(FakeHttpServletResponse res, boolean revalidate) {
+    String header = res.getHeader("Cache-Control").toLowerCase();
+    assertThat(header).contains("public");
+    if (revalidate) {
+      assertThat(header).contains("must-revalidate");
+    } else {
+      assertThat(header).doesNotContain("must-revalidate");
+    }
+  }
+
+  private static void assertHasLastModified(FakeHttpServletResponse res) {
+    assertThat(res.getHeader("Last-Modified")).isNotNull();
+    assertThat(res.getHeader("ETag")).isNull();
+  }
+
+  private static void assertHasETag(FakeHttpServletResponse res) {
+    assertThat(res.getHeader("ETag")).isNotNull();
+    assertThat(res.getHeader("Last-Modified")).isNull();
+  }
+
+  private static void assertNotCacheable(FakeHttpServletResponse res) {
+    assertThat(res.getHeader("Cache-Control")).contains("no-cache");
+    assertThat(res.getHeader("ETag")).isNull();
+    assertThat(res.getHeader("Last-Modified")).isNull();
+  }
+
+  private static FakeHttpServletRequest request(String path) {
+    return new FakeHttpServletRequest().setPathInfo(path);
+  }
+
+  private static String gunzip(byte[] data) throws Exception {
+    try (InputStream in = new GZIPInputStream(new ByteArrayInputStream(data))) {
+      return new String(ByteStreams.toByteArray(in), UTF_8);
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/httpd/restapi/HttpLogRedactTest.java b/javatests/com/google/gerrit/httpd/restapi/HttpLogRedactTest.java
new file mode 100644
index 0000000..fb1ebd9
--- /dev/null
+++ b/javatests/com/google/gerrit/httpd/restapi/HttpLogRedactTest.java
@@ -0,0 +1,35 @@
+// Copyright (C) 2017 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.google.gerrit.httpd.restapi;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import org.junit.Test;
+
+public class HttpLogRedactTest {
+  @Test
+  public void redactAuth() {
+    assertThat(LogRedactUtil.redactQueryString("query=status:open")).isEqualTo("query=status:open");
+
+    assertThat(LogRedactUtil.redactQueryString("query=status:open&access_token=foo"))
+        .isEqualTo("query=status:open&access_token=*");
+
+    assertThat(LogRedactUtil.redactQueryString("access_token=foo")).isEqualTo("access_token=*");
+
+    assertThat(
+            LogRedactUtil.redactQueryString("query=status:open&access_token=foo&access_token=bar"))
+        .isEqualTo("query=status:open&access_token=*&access_token=*");
+  }
+}
diff --git a/gerrit-httpd/src/test/java/com/google/gerrit/httpd/restapi/ParameterParserTest.java b/javatests/com/google/gerrit/httpd/restapi/ParameterParserTest.java
similarity index 100%
rename from gerrit-httpd/src/test/java/com/google/gerrit/httpd/restapi/ParameterParserTest.java
rename to javatests/com/google/gerrit/httpd/restapi/ParameterParserTest.java
diff --git a/javatests/com/google/gerrit/index/BUILD b/javatests/com/google/gerrit/index/BUILD
new file mode 100644
index 0000000..5597ed1
--- /dev/null
+++ b/javatests/com/google/gerrit/index/BUILD
@@ -0,0 +1,18 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+junit_tests(
+    name = "tests",
+    size = "small",
+    srcs = glob(["**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//antlr3:query_parser",
+        "//java/com/google/gerrit/index",
+        "//java/com/google/gerrit/index:query_exception",
+        "//lib:guava",
+        "//lib:junit",
+        "//lib/antlr:java-runtime",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/truth",
+    ],
+)
diff --git a/gerrit-index/src/test/java/com/google/gerrit/index/SchemaUtilTest.java b/javatests/com/google/gerrit/index/SchemaUtilTest.java
similarity index 100%
rename from gerrit-index/src/test/java/com/google/gerrit/index/SchemaUtilTest.java
rename to javatests/com/google/gerrit/index/SchemaUtilTest.java
diff --git a/gerrit-index/src/test/java/com/google/gerrit/index/query/AndPredicateTest.java b/javatests/com/google/gerrit/index/query/AndPredicateTest.java
similarity index 100%
rename from gerrit-index/src/test/java/com/google/gerrit/index/query/AndPredicateTest.java
rename to javatests/com/google/gerrit/index/query/AndPredicateTest.java
diff --git a/gerrit-index/src/test/java/com/google/gerrit/index/query/FieldPredicateTest.java b/javatests/com/google/gerrit/index/query/FieldPredicateTest.java
similarity index 100%
rename from gerrit-index/src/test/java/com/google/gerrit/index/query/FieldPredicateTest.java
rename to javatests/com/google/gerrit/index/query/FieldPredicateTest.java
diff --git a/gerrit-index/src/test/java/com/google/gerrit/index/query/NotPredicateTest.java b/javatests/com/google/gerrit/index/query/NotPredicateTest.java
similarity index 100%
rename from gerrit-index/src/test/java/com/google/gerrit/index/query/NotPredicateTest.java
rename to javatests/com/google/gerrit/index/query/NotPredicateTest.java
diff --git a/gerrit-index/src/test/java/com/google/gerrit/index/query/OrPredicateTest.java b/javatests/com/google/gerrit/index/query/OrPredicateTest.java
similarity index 100%
rename from gerrit-index/src/test/java/com/google/gerrit/index/query/OrPredicateTest.java
rename to javatests/com/google/gerrit/index/query/OrPredicateTest.java
diff --git a/gerrit-index/src/test/java/com/google/gerrit/index/query/PredicateTest.java b/javatests/com/google/gerrit/index/query/PredicateTest.java
similarity index 100%
rename from gerrit-index/src/test/java/com/google/gerrit/index/query/PredicateTest.java
rename to javatests/com/google/gerrit/index/query/PredicateTest.java
diff --git a/gerrit-index/src/test/java/com/google/gerrit/index/query/QueryParserTest.java b/javatests/com/google/gerrit/index/query/QueryParserTest.java
similarity index 100%
rename from gerrit-index/src/test/java/com/google/gerrit/index/query/QueryParserTest.java
rename to javatests/com/google/gerrit/index/query/QueryParserTest.java
diff --git a/javatests/com/google/gerrit/mail/AbstractParserTest.java b/javatests/com/google/gerrit/mail/AbstractParserTest.java
new file mode 100644
index 0000000..6ab4ca2
--- /dev/null
+++ b/javatests/com/google/gerrit/mail/AbstractParserTest.java
@@ -0,0 +1,103 @@
+// 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.
+
+package com.google.gerrit.mail;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Comment;
+import java.sql.Timestamp;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Ignore;
+
+@Ignore
+public class AbstractParserTest {
+  protected static final String CHANGE_URL =
+      "https://gerrit-review.googlesource.com/c/project/+/123";
+
+  protected static void assertChangeMessage(String message, MailComment comment) {
+    assertThat(comment.fileName).isNull();
+    assertThat(comment.message).isEqualTo(message);
+    assertThat(comment.inReplyTo).isNull();
+    assertThat(comment.type).isEqualTo(MailComment.CommentType.CHANGE_MESSAGE);
+  }
+
+  protected static void assertInlineComment(
+      String message, MailComment comment, Comment inReplyTo) {
+    assertThat(comment.fileName).isNull();
+    assertThat(comment.message).isEqualTo(message);
+    assertThat(comment.inReplyTo).isEqualTo(inReplyTo);
+    assertThat(comment.type).isEqualTo(MailComment.CommentType.INLINE_COMMENT);
+  }
+
+  protected static void assertFileComment(String message, MailComment comment, String file) {
+    assertThat(comment.fileName).isEqualTo(file);
+    assertThat(comment.message).isEqualTo(message);
+    assertThat(comment.inReplyTo).isNull();
+    assertThat(comment.type).isEqualTo(MailComment.CommentType.FILE_COMMENT);
+  }
+
+  protected static Comment newComment(String uuid, String file, String message, int line) {
+    Comment c =
+        new Comment(
+            new Comment.Key(uuid, file, 1),
+            new Account.Id(0),
+            new Timestamp(0L),
+            (short) 0,
+            message,
+            "",
+            false);
+    c.lineNbr = line;
+    return c;
+  }
+
+  protected static Comment newRangeComment(String uuid, String file, String message, int line) {
+    Comment c =
+        new Comment(
+            new Comment.Key(uuid, file, 1),
+            new Account.Id(0),
+            new Timestamp(0L),
+            (short) 0,
+            message,
+            "",
+            false);
+    c.range = new Comment.Range(line, 1, line + 1, 1);
+    c.lineNbr = line + 1;
+    return c;
+  }
+
+  /** Returns a MailMessage.Builder with all required fields populated. */
+  protected static MailMessage.Builder newMailMessageBuilder() {
+    MailMessage.Builder b = MailMessage.builder();
+    b.id("id");
+    b.from(new Address("Foo Bar", "foo@bar.com"));
+    b.dateReceived(Instant.now());
+    b.subject("");
+    return b;
+  }
+
+  /** Returns a List of default comments for testing. */
+  protected static List<Comment> defaultComments() {
+    List<Comment> comments = new ArrayList<>();
+    comments.add(newComment("c1", "gerrit-server/test.txt", "comment", 0));
+    comments.add(newComment("c2", "gerrit-server/test.txt", "comment", 2));
+    comments.add(newComment("c3", "gerrit-server/test.txt", "comment", 3));
+    comments.add(newComment("c3", "gerrit-server/test.txt", "comment", 115));
+    comments.add(newRangeComment("c5", "gerrit-server/readme.txt", "comment", 3));
+    return comments;
+  }
+}
diff --git a/javatests/com/google/gerrit/mail/AddressTest.java b/javatests/com/google/gerrit/mail/AddressTest.java
new file mode 100644
index 0000000..53ff1fe
--- /dev/null
+++ b/javatests/com/google/gerrit/mail/AddressTest.java
@@ -0,0 +1,157 @@
+// Copyright (C) 2009 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.google.gerrit.mail;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.fail;
+
+import com.google.gerrit.testing.GerritBaseTests;
+import org.junit.Test;
+
+public class AddressTest extends GerritBaseTests {
+  @Test
+  public void parse_NameEmail1() {
+    final Address a = Address.parse("A U Thor <author@example.com>");
+    assertThat(a.getName()).isEqualTo("A U Thor");
+    assertThat(a.getEmail()).isEqualTo("author@example.com");
+  }
+
+  @Test
+  public void parse_NameEmail2() {
+    final Address a = Address.parse("A <a@b>");
+    assertThat(a.getName()).isEqualTo("A");
+    assertThat(a.getEmail()).isEqualTo("a@b");
+  }
+
+  @Test
+  public void parse_NameEmail3() {
+    final Address a = Address.parse("<a@b>");
+    assertThat(a.getName()).isNull();
+    assertThat(a.getEmail()).isEqualTo("a@b");
+  }
+
+  @Test
+  public void parse_NameEmail4() {
+    final Address a = Address.parse("A U Thor<author@example.com>");
+    assertThat(a.getName()).isEqualTo("A U Thor");
+    assertThat(a.getEmail()).isEqualTo("author@example.com");
+  }
+
+  @Test
+  public void parse_NameEmail5() {
+    final Address a = Address.parse("A U Thor  <author@example.com>");
+    assertThat(a.getName()).isEqualTo("A U Thor");
+    assertThat(a.getEmail()).isEqualTo("author@example.com");
+  }
+
+  @Test
+  public void parse_Email1() {
+    final Address a = Address.parse("author@example.com");
+    assertThat(a.getName()).isNull();
+    assertThat(a.getEmail()).isEqualTo("author@example.com");
+  }
+
+  @Test
+  public void parse_Email2() {
+    final Address a = Address.parse("a@b");
+    assertThat(a.getName()).isNull();
+    assertThat(a.getEmail()).isEqualTo("a@b");
+  }
+
+  @Test
+  public void parse_NewTLD() {
+    Address a = Address.parse("A U Thor <author@example.systems>");
+    assertThat(a.getName()).isEqualTo("A U Thor");
+    assertThat(a.getEmail()).isEqualTo("author@example.systems");
+  }
+
+  @Test
+  public void parseInvalid() {
+    assertInvalid("");
+    assertInvalid("a");
+    assertInvalid("a<");
+    assertInvalid("<a");
+    assertInvalid("<a>");
+    assertInvalid("a<a>");
+    assertInvalid("a <a>");
+
+    assertInvalid("a");
+    assertInvalid("a<@");
+    assertInvalid("<a@");
+    assertInvalid("<a@>");
+    assertInvalid("a<a@>");
+    assertInvalid("a <a@>");
+    assertInvalid("a <@a>");
+  }
+
+  private void assertInvalid(String in) {
+    try {
+      Address.parse(in);
+      fail("Expected IllegalArgumentException for " + in);
+    } catch (IllegalArgumentException e) {
+      assertThat(e.getMessage()).isEqualTo("Invalid email address: " + in);
+    }
+  }
+
+  @Test
+  public void toHeaderString_NameEmail1() {
+    assertThat(format("A", "a@a")).isEqualTo("A <a@a>");
+  }
+
+  @Test
+  public void toHeaderString_NameEmail2() {
+    assertThat(format("A B", "a@a")).isEqualTo("A B <a@a>");
+  }
+
+  @Test
+  public void toHeaderString_NameEmail3() {
+    assertThat(format("A B. C", "a@a")).isEqualTo("\"A B. C\" <a@a>");
+  }
+
+  @Test
+  public void toHeaderString_NameEmail4() {
+    assertThat(format("A B, C", "a@a")).isEqualTo("\"A B, C\" <a@a>");
+  }
+
+  @Test
+  public void toHeaderString_NameEmail5() {
+    assertThat(format("A \" C", "a@a")).isEqualTo("\"A \\\" C\" <a@a>");
+  }
+
+  @Test
+  public void toHeaderString_NameEmail6() {
+    assertThat(format("A \u20ac B", "a@a")).isEqualTo("=?UTF-8?Q?A_=E2=82=AC_B?= <a@a>");
+  }
+
+  @Test
+  public void toHeaderString_NameEmail7() {
+    assertThat(format("A \u20ac B (Code Review)", "a@a"))
+        .isEqualTo("=?UTF-8?Q?A_=E2=82=AC_B_=28Code_Review=29?= <a@a>");
+  }
+
+  @Test
+  public void toHeaderString_Email1() {
+    assertThat(format(null, "a@a")).isEqualTo("a@a");
+  }
+
+  @Test
+  public void toHeaderString_Email2() {
+    assertThat(format(null, "a,b@a")).isEqualTo("<a,b@a>");
+  }
+
+  private static String format(String name, String email) {
+    return new Address(name, email).toHeaderString();
+  }
+}
diff --git a/javatests/com/google/gerrit/mail/BUILD b/javatests/com/google/gerrit/mail/BUILD
new file mode 100644
index 0000000..2fd8f24
--- /dev/null
+++ b/javatests/com/google/gerrit/mail/BUILD
@@ -0,0 +1,35 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+junit_tests(
+    name = "maillib_tests",
+    size = "small",
+    srcs = glob(
+        ["**/*.java"],
+    ),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/common:annotations",
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/extensions/common/testing:common-test-util",
+        "//java/com/google/gerrit/index",
+        "//java/com/google/gerrit/index:query_exception",
+        "//java/com/google/gerrit/lifecycle",
+        "//java/com/google/gerrit/mail",
+        "//java/com/google/gerrit/metrics",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/server/project/testing:project-test-util",
+        "//java/com/google/gerrit/testing:gerrit-test-util",
+        "//java/org/eclipse/jgit:server",
+        "//lib:gson",
+        "//lib:guava-retrying",
+        "//lib:gwtorm",
+        "//lib/commons:codec",
+        "//lib/guice",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/jgit/org.eclipse.jgit.junit:junit",
+        "//lib/truth",
+        "//lib/truth:truth-java8-extension",
+    ],
+)
diff --git a/javatests/com/google/gerrit/mail/GenericHtmlParserTest.java b/javatests/com/google/gerrit/mail/GenericHtmlParserTest.java
new file mode 100644
index 0000000..4718bad
--- /dev/null
+++ b/javatests/com/google/gerrit/mail/GenericHtmlParserTest.java
@@ -0,0 +1,121 @@
+// 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.
+
+package com.google.gerrit.mail;
+
+/** Test parser for a generic Html email client response */
+public class GenericHtmlParserTest extends HtmlParserTest {
+  @Override
+  protected String newHtmlBody(
+      String changeMessage, String c1, String c2, String c3, String f1, String f2, String fc1) {
+    String email =
+        ""
+            + "<div dir=\"ltr\">"
+            + (changeMessage != null ? changeMessage : "")
+            + "<div class=\"extra\"><br><div class=\"quote\">"
+            + "On Fri, Nov 18, 2016 at 11:15 AM, foobar (Gerrit) noreply@gerrit.com"
+            + "<span dir=\"ltr\">&lt;<a href=\"mailto:noreply@gerrit.com\" "
+            + "target=\"_blank\">noreply@gerrit.com</a>&gt;</span> wrote:<br>"
+            + "<blockquote class=\"quote\" "
+            + "<p>foobar <strong>posted comments</strong> on this change.</p>"
+            + "<p><a href=\""
+            + CHANGE_URL
+            + "/1\" "
+            + "target=\"_blank\">View Change</a></p><div>Patch Set 2: CR-1\n"
+            + "\n"
+            + "(3 comments)</div><ul><li>"
+            + "<p>"
+            + // File #1: test.txt
+            "<a href=\""
+            + CHANGE_URL
+            + "/1/gerrit-server/test.txt\">"
+            + "File gerrit-server/<wbr>test.txt:</a></p>"
+            + commentBlock(f1)
+            + "<li><p>"
+            + "<a href=\""
+            + CHANGE_URL
+            + "/1/gerrit-server/test.txt\">"
+            + "Patch Set #2:</a> </p>"
+            + "<blockquote><pre>Some inline comment from Gerrit</pre>"
+            + "</blockquote><p>Some comment on file 1</p>"
+            + "</li>"
+            + commentBlock(fc1)
+            + "<li><p>"
+            + "<a href=\""
+            + CHANGE_URL
+            + "/1/gerrit-server/test.txt@2\">"
+            + "Patch Set #2, Line 31:</a> </p>"
+            + "<blockquote><pre>Some inline comment from Gerrit</pre>"
+            + "</blockquote><p>Some text from original comment</p>"
+            + "</li>"
+            + commentBlock(c1)
+            + ""
+            + // Inline comment #2
+            "<li><p>"
+            + "<a href=\""
+            + CHANGE_URL
+            + "/1/gerrit-server/test.txt@3\">"
+            + "Patch Set #2, Line 47:</a> </p>"
+            + "<blockquote><pre>Some comment posted on Gerrit</pre>"
+            + "</blockquote><p>Some more comments from Gerrit</p>"
+            + "</li>"
+            + commentBlock(c2)
+            + "<li><p>"
+            + "<a href=\""
+            + CHANGE_URL
+            + "/1/gerrit-server/test.txt@115\">"
+            + "Patch Set #2, Line 115:</a> <code>some code</code></p>"
+            + "<p>some comment</p></li></ul></li>"
+            + ""
+            + "<li><p>"
+            + // File #2: test.txt
+            "<a href=\""
+            + CHANGE_URL
+            + "/1/gerrit-server/readme.txt\">"
+            + "File gerrit-server/<wbr>readme.txt:</a></p>"
+            + commentBlock(f2)
+            + "<li><p>"
+            + "<a href=\""
+            + CHANGE_URL
+            + "/1/gerrit-server/readme.txt@3\">"
+            + "Patch Set #2, Line 31:</a> </p>"
+            + "<blockquote><pre>Some inline comment from Gerrit</pre>"
+            + "</blockquote><p>Some text from original comment</p>"
+            + "</li>"
+            + commentBlock(c3)
+            + ""
+            + // Inline comment #2
+            "</ul></li></ul>"
+            + ""
+            + // Footer
+            "<p>To view, visit <a href=\""
+            + CHANGE_URL
+            + "/1\">this change</a>. "
+            + "To unsubscribe, visit <a href=\"https://someurl\">settings</a>."
+            + "</p><p>Gerrit-MessageType: comment<br>"
+            + "Footer omitted</p>"
+            + "<div><div></div></div>"
+            + "<p>Gerrit-HasComments: Yes</p></blockquote></div><br></div></div>";
+    return email;
+  }
+
+  private static String commentBlock(String comment) {
+    if (comment == null) {
+      return "";
+    }
+    return "</ul></li></ul></blockquote><div>"
+        + comment
+        + "</div><blockquote class=\"quote\"><ul><li><ul>";
+  }
+}
diff --git a/javatests/com/google/gerrit/mail/GmailHtmlParserTest.java b/javatests/com/google/gerrit/mail/GmailHtmlParserTest.java
new file mode 100644
index 0000000..f597dee
--- /dev/null
+++ b/javatests/com/google/gerrit/mail/GmailHtmlParserTest.java
@@ -0,0 +1,119 @@
+// 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.
+
+package com.google.gerrit.mail;
+
+public class GmailHtmlParserTest extends HtmlParserTest {
+  @Override
+  protected String newHtmlBody(
+      String changeMessage, String c1, String c2, String c3, String f1, String f2, String fc1) {
+    String email =
+        ""
+            + "<div class=\"gmail_default\" dir=\"ltr\">"
+            + (changeMessage != null ? changeMessage : "")
+            + "<div class=\"gmail_extra\"><br><div class=\"gmail_quote\">"
+            + "On Fri, Nov 18, 2016 at 11:15 AM, foobar (Gerrit) noreply@gerrit.com"
+            + "<span dir=\"ltr\">&lt;<a href=\"mailto:noreply@gerrit.com\" "
+            + "target=\"_blank\">noreply@gerrit.com</a>&gt;</span> wrote:<br>"
+            + "</div></div><blockquote class=\"gmail_quote\" "
+            + "<p>foobar <strong>posted comments</strong> on this change.</p>"
+            + "<p><a href=\""
+            + CHANGE_URL
+            + "/1\" "
+            + "target=\"_blank\">View Change</a></p><div>Patch Set 2: CR-1\n"
+            + "\n"
+            + "(3 comments)</div><ul><li>"
+            + "<p>"
+            + // File #1: test.txt
+            "<a href=\""
+            + CHANGE_URL
+            + "/1/gerrit-server/test.txt\">"
+            + "File gerrit-server/<wbr>test.txt:</a></p>"
+            + commentBlock(f1)
+            + "<a href=\""
+            + CHANGE_URL
+            + "/1/gerrit-server/test.txt\">"
+            + "Patch Set #2:</a> </p>"
+            + "<blockquote><pre>Some inline comment from Gerrit</pre>"
+            + "</blockquote><p>Some comment on file 1</p>"
+            + "</li>"
+            + commentBlock(fc1)
+            + "<li><p>"
+            + "<a href=\""
+            + CHANGE_URL
+            + "/1/gerrit-server/test.txt@2\">"
+            + "Patch Set #2, Line 31:</a> </p>"
+            + "<blockquote><pre>Some inline comment from Gerrit</pre>"
+            + "</blockquote><p>Some text from original comment</p>"
+            + "</li>"
+            + commentBlock(c1)
+            + ""
+            + // Inline comment #2
+            "<li><p>"
+            + "<a href=\""
+            + CHANGE_URL
+            + "/1/gerrit-server/test.txt@3\">"
+            + "Patch Set #2, Line 47:</a> </p>"
+            + "<blockquote><pre>Some comment posted on Gerrit</pre>"
+            + "</blockquote><p>Some more comments from Gerrit</p>"
+            + "</li>"
+            + commentBlock(c2)
+            + "<li><p>"
+            + "<a href=\""
+            + CHANGE_URL
+            + "/1/gerrit-server/test.txt@115\">"
+            + "Patch Set #2, Line 115:</a> <code>some code</code></p>"
+            + "<p>some comment</p></li></ul></li>"
+            + ""
+            + "<li><p>"
+            + // File #2: test.txt
+            "<a href=\""
+            + CHANGE_URL
+            + "/1/gerrit-server/readme.txt\">"
+            + "File gerrit-server/<wbr>readme.txt:</a></p>"
+            + commentBlock(f2)
+            + "<li><p>"
+            + "<a href=\""
+            + CHANGE_URL
+            + "/1/gerrit-server/readme.txt@3\">"
+            + "Patch Set #2, Line 31:</a> </p>"
+            + "<blockquote><pre>Some inline comment from Gerrit</pre>"
+            + "</blockquote><p>Some text from original comment</p>"
+            + "</li>"
+            + commentBlock(c3)
+            + ""
+            + // Inline comment #2
+            "</ul></li></ul>"
+            + ""
+            + // Footer
+            "<p>To view, visit <a href=\""
+            + CHANGE_URL
+            + "/1\">this change</a>. "
+            + "To unsubscribe, visit <a href=\"https://someurl\">settings</a>."
+            + "</p><p>Gerrit-MessageType: comment<br>"
+            + "Footer omitted</p>"
+            + "<div><div></div></div>"
+            + "<p>Gerrit-HasComments: Yes</p></blockquote></div>";
+    return email;
+  }
+
+  private static String commentBlock(String comment) {
+    if (comment == null) {
+      return "";
+    }
+    return "</ul></li></ul></blockquote><div>"
+        + comment
+        + "</div><blockquote class=\"gmail_quote\"><ul><li><ul>";
+  }
+}
diff --git a/javatests/com/google/gerrit/mail/HtmlParserTest.java b/javatests/com/google/gerrit/mail/HtmlParserTest.java
new file mode 100644
index 0000000..d630bd6
--- /dev/null
+++ b/javatests/com/google/gerrit/mail/HtmlParserTest.java
@@ -0,0 +1,190 @@
+// 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.
+
+package com.google.gerrit.mail;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.reviewdb.client.Comment;
+import java.util.List;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/**
+ * Abstract parser test for HTML messages. Payload will be added through concrete implementations.
+ */
+@Ignore
+public abstract class HtmlParserTest extends AbstractParserTest {
+  @Test
+  public void simpleChangeMessage() {
+    MailMessage.Builder b = newMailMessageBuilder();
+    b.htmlContent(newHtmlBody("Looks good to me", null, null, null, null, null, null));
+
+    List<Comment> comments = defaultComments();
+    List<MailComment> parsedComments = HtmlParser.parse(b.build(), comments, "");
+
+    assertThat(parsedComments).hasSize(1);
+    assertChangeMessage("Looks good to me", parsedComments.get(0));
+  }
+
+  @Test
+  public void changeMessageWithLink() {
+    MailMessage.Builder b = newMailMessageBuilder();
+    b.htmlContent(
+        newHtmlBody(
+            "Did you consider this: "
+                + "<a href=\"http://gerritcodereview.com\">http://gerritcodereview.com</a>",
+            null,
+            null,
+            null,
+            null,
+            null,
+            null));
+
+    List<Comment> comments = defaultComments();
+    List<MailComment> parsedComments = HtmlParser.parse(b.build(), comments, "");
+
+    assertThat(parsedComments).hasSize(1);
+    assertChangeMessage(
+        "Did you consider this: http://gerritcodereview.com", parsedComments.get(0));
+  }
+
+  @Test
+  public void simpleInlineComments() {
+    MailMessage.Builder b = newMailMessageBuilder();
+    b.htmlContent(
+        newHtmlBody(
+            "Looks good to me",
+            "I have a comment on this.&nbsp;",
+            null,
+            "Also have a comment here.",
+            null,
+            null,
+            null));
+
+    List<Comment> comments = defaultComments();
+    List<MailComment> parsedComments = HtmlParser.parse(b.build(), comments, CHANGE_URL);
+
+    assertThat(parsedComments).hasSize(3);
+    assertChangeMessage("Looks good to me", parsedComments.get(0));
+    assertInlineComment("I have a comment on this.", parsedComments.get(1), comments.get(1));
+    assertInlineComment("Also have a comment here.", parsedComments.get(2), comments.get(4));
+  }
+
+  @Test
+  public void simpleInlineCommentsWithLink() {
+    MailMessage.Builder b = newMailMessageBuilder();
+    b.htmlContent(
+        newHtmlBody(
+            "Looks good to me",
+            "How about [1]? This would help IMHO.</div><div>[1] "
+                + "<a href=\"http://gerritcodereview.com\">http://gerritcodereview.com</a>",
+            null,
+            "Also have a comment here.",
+            null,
+            null,
+            null));
+
+    List<Comment> comments = defaultComments();
+    List<MailComment> parsedComments = HtmlParser.parse(b.build(), comments, CHANGE_URL);
+
+    assertThat(parsedComments).hasSize(3);
+    assertChangeMessage("Looks good to me", parsedComments.get(0));
+    assertInlineComment(
+        "How about [1]? This would help IMHO.\n\n[1] http://gerritcodereview.com",
+        parsedComments.get(1),
+        comments.get(1));
+    assertInlineComment("Also have a comment here.", parsedComments.get(2), comments.get(4));
+  }
+
+  @Test
+  public void simpleFileComment() {
+    MailMessage.Builder b = newMailMessageBuilder();
+    b.htmlContent(
+        newHtmlBody(
+            "Looks good to me",
+            null,
+            null,
+            "Also have a comment here.",
+            "This is a nice file",
+            null,
+            null));
+
+    List<Comment> comments = defaultComments();
+    List<MailComment> parsedComments = HtmlParser.parse(b.build(), comments, CHANGE_URL);
+
+    assertThat(parsedComments).hasSize(3);
+    assertChangeMessage("Looks good to me", parsedComments.get(0));
+    assertFileComment("This is a nice file", parsedComments.get(1), comments.get(1).key.filename);
+    assertInlineComment("Also have a comment here.", parsedComments.get(2), comments.get(4));
+  }
+
+  @Test
+  public void noComments() {
+    MailMessage.Builder b = newMailMessageBuilder();
+    b.htmlContent(newHtmlBody(null, null, null, null, null, null, null));
+
+    List<Comment> comments = defaultComments();
+    List<MailComment> parsedComments = HtmlParser.parse(b.build(), comments, CHANGE_URL);
+
+    assertThat(parsedComments).isEmpty();
+  }
+
+  @Test
+  public void noChangeMessage() {
+    MailMessage.Builder b = newMailMessageBuilder();
+    b.htmlContent(
+        newHtmlBody(
+            null, null, null, "Also have a comment here.", "This is a nice file", null, null));
+
+    List<Comment> comments = defaultComments();
+    List<MailComment> parsedComments = HtmlParser.parse(b.build(), comments, CHANGE_URL);
+
+    assertThat(parsedComments).hasSize(2);
+    assertFileComment("This is a nice file", parsedComments.get(0), comments.get(1).key.filename);
+    assertInlineComment("Also have a comment here.", parsedComments.get(1), comments.get(4));
+  }
+
+  @Test
+  public void commentsSpanningMultipleBlocks() {
+    String htmlMessage =
+        "This is a very long test comment. <div><br></div><div>Now this is a new paragraph yay.</div>";
+    String txtMessage = "This is a very long test comment.\n\nNow this is a new paragraph yay.";
+    MailMessage.Builder b = newMailMessageBuilder();
+    b.htmlContent(newHtmlBody(htmlMessage, null, null, htmlMessage, htmlMessage, null, null));
+
+    List<Comment> comments = defaultComments();
+    List<MailComment> parsedComments = HtmlParser.parse(b.build(), comments, CHANGE_URL);
+
+    assertThat(parsedComments).hasSize(3);
+    assertChangeMessage(txtMessage, parsedComments.get(0));
+    assertFileComment(txtMessage, parsedComments.get(1), comments.get(1).key.filename);
+    assertInlineComment(txtMessage, parsedComments.get(2), comments.get(4));
+  }
+
+  /**
+   * Create an html message body with the specified comments.
+   *
+   * @param changeMessage
+   * @param c1 Comment in reply to first comment.
+   * @param c2 Comment in reply to second comment.
+   * @param c3 Comment in reply to third comment.
+   * @param f1 Comment on file one.
+   * @param f2 Comment on file two.
+   * @param fc1 Comment in reply to a comment on file 1.
+   * @return A string with all inline comments and the original quoted email.
+   */
+  protected abstract String newHtmlBody(
+      String changeMessage, String c1, String c2, String c3, String f1, String f2, String fc1);
+}
diff --git a/javatests/com/google/gerrit/mail/MailHeaderParserTest.java b/javatests/com/google/gerrit/mail/MailHeaderParserTest.java
new file mode 100644
index 0000000..2d2c2ea
--- /dev/null
+++ b/javatests/com/google/gerrit/mail/MailHeaderParserTest.java
@@ -0,0 +1,129 @@
+// 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.
+
+package com.google.gerrit.mail;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.Month;
+import java.time.ZoneOffset;
+import org.junit.Test;
+
+public class MailHeaderParserTest {
+  @Test
+  public void parseMetadataFromHeader() {
+    // This tests if the metadata parser is able to parse metadata from the
+    // email headers of the message.
+    MailMessage.Builder b = MailMessage.builder();
+    b.id("");
+    b.dateReceived(Instant.now());
+    b.subject("");
+
+    b.addAdditionalHeader(MailHeader.CHANGE_NUMBER.fieldWithDelimiter() + "123");
+    b.addAdditionalHeader(MailHeader.PATCH_SET.fieldWithDelimiter() + "1");
+    b.addAdditionalHeader(MailHeader.MESSAGE_TYPE.fieldWithDelimiter() + "comment");
+    b.addAdditionalHeader(
+        MailHeader.COMMENT_DATE.fieldWithDelimiter() + "Tue, 25 Oct 2016 02:11:35 -0700");
+
+    Address author = new Address("Diffy", "test@gerritcodereview.com");
+    b.from(author);
+
+    MailMetadata meta = MailHeaderParser.parse(b.build());
+    assertThat(meta.author).isEqualTo(author.getEmail());
+    assertThat(meta.changeNumber).isEqualTo(123);
+    assertThat(meta.patchSet).isEqualTo(1);
+    assertThat(meta.messageType).isEqualTo("comment");
+    assertThat(meta.timestamp.toInstant())
+        .isEqualTo(
+            LocalDateTime.of(2016, Month.OCTOBER, 25, 9, 11, 35)
+                .atOffset(ZoneOffset.UTC)
+                .toInstant());
+  }
+
+  @Test
+  public void parseMetadataFromText() {
+    // This tests if the metadata parser is able to parse metadata from the
+    // the text body of the message.
+    MailMessage.Builder b = MailMessage.builder();
+    b.id("");
+    b.dateReceived(Instant.now());
+    b.subject("");
+
+    StringBuilder stringBuilder = new StringBuilder();
+    stringBuilder.append(MailHeader.CHANGE_NUMBER.withDelimiter()).append("123\r\n");
+    stringBuilder.append("> ").append(MailHeader.PATCH_SET.withDelimiter()).append("1\n");
+    stringBuilder.append(MailHeader.MESSAGE_TYPE.withDelimiter()).append("comment\n");
+    stringBuilder
+        .append(MailHeader.COMMENT_DATE.withDelimiter())
+        .append("Tue, 25 Oct 2016 02:11:35 -0700\r\n");
+    b.textContent(stringBuilder.toString());
+
+    Address author = new Address("Diffy", "test@gerritcodereview.com");
+    b.from(author);
+
+    MailMetadata meta = MailHeaderParser.parse(b.build());
+    assertThat(meta.author).isEqualTo(author.getEmail());
+    assertThat(meta.changeNumber).isEqualTo(123);
+    assertThat(meta.patchSet).isEqualTo(1);
+    assertThat(meta.messageType).isEqualTo("comment");
+    assertThat(meta.timestamp.toInstant())
+        .isEqualTo(
+            LocalDateTime.of(2016, Month.OCTOBER, 25, 9, 11, 35)
+                .atOffset(ZoneOffset.UTC)
+                .toInstant());
+  }
+
+  @Test
+  public void parseMetadataFromHTML() {
+    // This tests if the metadata parser is able to parse metadata from the
+    // the HTML body of the message.
+    MailMessage.Builder b = MailMessage.builder();
+    b.id("");
+    b.dateReceived(Instant.now());
+    b.subject("");
+
+    StringBuilder stringBuilder = new StringBuilder();
+    stringBuilder
+        .append("<div id\"someid\">")
+        .append(MailHeader.CHANGE_NUMBER.withDelimiter())
+        .append("123</div>");
+    stringBuilder.append("<div>").append(MailHeader.PATCH_SET.withDelimiter()).append("1</div>");
+    stringBuilder
+        .append("<div>")
+        .append(MailHeader.MESSAGE_TYPE.withDelimiter())
+        .append("comment</div>");
+    stringBuilder
+        .append("<div>")
+        .append(MailHeader.COMMENT_DATE.withDelimiter())
+        .append("Tue, 25 Oct 2016 02:11:35 -0700")
+        .append("</div>");
+    b.htmlContent(stringBuilder.toString());
+
+    Address author = new Address("Diffy", "test@gerritcodereview.com");
+    b.from(author);
+
+    MailMetadata meta = MailHeaderParser.parse(b.build());
+    assertThat(meta.author).isEqualTo(author.getEmail());
+    assertThat(meta.changeNumber).isEqualTo(123);
+    assertThat(meta.patchSet).isEqualTo(1);
+    assertThat(meta.messageType).isEqualTo("comment");
+    assertThat(meta.timestamp.toInstant())
+        .isEqualTo(
+            LocalDateTime.of(2016, Month.OCTOBER, 25, 9, 11, 35)
+                .atOffset(ZoneOffset.UTC)
+                .toInstant());
+  }
+}
diff --git a/javatests/com/google/gerrit/mail/ParserUtilTest.java b/javatests/com/google/gerrit/mail/ParserUtilTest.java
new file mode 100644
index 0000000..47a5367
--- /dev/null
+++ b/javatests/com/google/gerrit/mail/ParserUtilTest.java
@@ -0,0 +1,58 @@
+// 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.
+
+package com.google.gerrit.mail;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import org.junit.Test;
+
+public class ParserUtilTest {
+  @Test
+  public void trimQuotationLineOnMessageWithoutQuoatationLine() throws Exception {
+    assertThat(ParserUtil.trimQuotation("One line")).isEqualTo("One line");
+    assertThat(ParserUtil.trimQuotation("Two\nlines")).isEqualTo("Two\nlines");
+    assertThat(ParserUtil.trimQuotation("Thr\nee\nlines")).isEqualTo("Thr\nee\nlines");
+  }
+
+  @Test
+  public void trimQuotationLineOnMixedMessages() throws Exception {
+    assertThat(
+            ParserUtil.trimQuotation(
+                "One line\n"
+                    + "On Thu, Feb 9, 2017 at 8:21 AM, ekempin (Gerrit)\n"
+                    + "<noreply-gerritcodereview-qUgXfQecoDLHwp0MldAzig@google.com> wrote:"))
+        .isEqualTo("One line");
+    assertThat(
+            ParserUtil.trimQuotation(
+                "One line\n"
+                    + "On Thu, Feb 9, 2017 at 8:21 AM, ekempin (Gerrit) "
+                    + "<noreply-gerritcodereview-qUgXfQecoDLHwp0MldAzig@google.com> wrote:"))
+        .isEqualTo("One line");
+  }
+
+  @Test
+  public void trimQuotationLineOnMessagesContainingQuoationLine() throws Exception {
+    assertThat(
+            ParserUtil.trimQuotation(
+                "On Thu, Feb 9, 2017 at 8:21 AM, ekempin (Gerrit)\n"
+                    + "<noreply-gerritcodereview-qUgXfQecoDLHwp0MldAzig@google.com> wrote:"))
+        .isEqualTo("");
+    assertThat(
+            ParserUtil.trimQuotation(
+                "On Thu, Feb 9, 2017 at 8:21 AM, ekempin (Gerrit) "
+                    + "<noreply-gerritcodereview-qUgXfQecoDLHwp0MldAzig@google.com> wrote:"))
+        .isEqualTo("");
+  }
+}
diff --git a/javatests/com/google/gerrit/mail/RawMailParserTest.java b/javatests/com/google/gerrit/mail/RawMailParserTest.java
new file mode 100644
index 0000000..9049704
--- /dev/null
+++ b/javatests/com/google/gerrit/mail/RawMailParserTest.java
@@ -0,0 +1,74 @@
+// 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.
+
+package com.google.gerrit.mail;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.mail.data.AttachmentMessage;
+import com.google.gerrit.mail.data.Base64HeaderMessage;
+import com.google.gerrit.mail.data.HtmlMimeMessage;
+import com.google.gerrit.mail.data.NonUTF8Message;
+import com.google.gerrit.mail.data.QuotedPrintableHeaderMessage;
+import com.google.gerrit.mail.data.RawMailMessage;
+import com.google.gerrit.mail.data.SimpleTextMessage;
+import com.google.gerrit.testing.GerritBaseTests;
+import org.junit.Test;
+
+public class RawMailParserTest extends GerritBaseTests {
+  @Test
+  public void parseEmail() throws Exception {
+    RawMailMessage[] messages =
+        new RawMailMessage[] {
+          new SimpleTextMessage(),
+          new Base64HeaderMessage(),
+          new QuotedPrintableHeaderMessage(),
+          new HtmlMimeMessage(),
+          new AttachmentMessage(),
+          new NonUTF8Message(),
+        };
+    for (RawMailMessage rawMailMessage : messages) {
+      if (rawMailMessage.rawChars() != null) {
+        // Assert Character to Mail Parser
+        MailMessage parsedMailMessage = RawMailParser.parse(rawMailMessage.rawChars());
+        assertMail(parsedMailMessage, rawMailMessage.expectedMailMessage());
+      }
+      if (rawMailMessage.raw() != null) {
+        // Assert String to Mail Parser
+        MailMessage parsedMailMessage = RawMailParser.parse(rawMailMessage.raw());
+        assertMail(parsedMailMessage, rawMailMessage.expectedMailMessage());
+      }
+    }
+  }
+
+  /**
+   * This method makes it easier to debug failing tests by checking each property individual instead
+   * of calling equals as it will immediately reveal the property that diverges between the two
+   * objects.
+   *
+   * @param have MailMessage retrieved from the parser
+   * @param want MailMessage that would be expected
+   */
+  private void assertMail(MailMessage have, MailMessage want) {
+    assertThat(have.id()).isEqualTo(want.id());
+    assertThat(have.to()).isEqualTo(want.to());
+    assertThat(have.from()).isEqualTo(want.from());
+    assertThat(have.cc()).isEqualTo(want.cc());
+    assertThat(have.dateReceived()).isEqualTo(want.dateReceived());
+    assertThat(have.additionalHeaders()).isEqualTo(want.additionalHeaders());
+    assertThat(have.subject()).isEqualTo(want.subject());
+    assertThat(have.textContent()).isEqualTo(want.textContent());
+    assertThat(have.htmlContent()).isEqualTo(want.htmlContent());
+  }
+}
diff --git a/javatests/com/google/gerrit/mail/TextParserTest.java b/javatests/com/google/gerrit/mail/TextParserTest.java
new file mode 100644
index 0000000..a5c2152
--- /dev/null
+++ b/javatests/com/google/gerrit/mail/TextParserTest.java
@@ -0,0 +1,261 @@
+// 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.
+
+package com.google.gerrit.mail;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.reviewdb.client.Comment;
+import java.util.List;
+import org.junit.Test;
+
+public class TextParserTest extends AbstractParserTest {
+  private static final String quotedFooter =
+      ""
+          + "> To view, visit https://gerrit-review.googlesource.com/c/project/+/123\n"
+          + "> To unsubscribe, visit https://gerrit-review.googlesource.com\n"
+          + "> \n"
+          + "> Gerrit-MessageType: comment\n"
+          + "> Gerrit-Change-Id: Ie1234021bf1e8d1425641af58fd648fc011db153\n"
+          + "> Gerrit-PatchSet: 1\n"
+          + "> Gerrit-Project: gerrit\n"
+          + "> Gerrit-Branch: master\n"
+          + "> Gerrit-Owner: Foo Bar <foo@bar.com>\n"
+          + "> Gerrit-HasComments: Yes";
+
+  @Test
+  public void simpleChangeMessage() {
+    MailMessage.Builder b = newMailMessageBuilder();
+    b.textContent("Looks good to me\n" + quotedFooter);
+
+    List<Comment> comments = defaultComments();
+    List<MailComment> parsedComments = TextParser.parse(b.build(), comments, CHANGE_URL);
+
+    assertThat(parsedComments).hasSize(1);
+    assertChangeMessage("Looks good to me", parsedComments.get(0));
+  }
+
+  @Test
+  public void simpleInlineComments() {
+    MailMessage.Builder b = newMailMessageBuilder();
+    b.textContent(
+        newPlaintextBody(
+                "Looks good to me",
+                "I have a comment on this.",
+                null,
+                "Also have a comment here.",
+                null,
+                null,
+                null)
+            + quotedFooter);
+
+    List<Comment> comments = defaultComments();
+    List<MailComment> parsedComments = TextParser.parse(b.build(), comments, CHANGE_URL);
+
+    assertThat(parsedComments).hasSize(3);
+    assertChangeMessage("Looks good to me", parsedComments.get(0));
+    assertInlineComment("I have a comment on this.", parsedComments.get(1), comments.get(1));
+    assertInlineComment("Also have a comment here.", parsedComments.get(2), comments.get(3));
+  }
+
+  @Test
+  public void simpleFileComment() {
+    MailMessage.Builder b = newMailMessageBuilder();
+    b.textContent(
+        newPlaintextBody(
+                "Looks good to me",
+                null,
+                null,
+                "Also have a comment here.",
+                "This is a nice file",
+                null,
+                null)
+            + quotedFooter);
+
+    List<Comment> comments = defaultComments();
+    List<MailComment> parsedComments = TextParser.parse(b.build(), comments, CHANGE_URL);
+
+    assertThat(parsedComments).hasSize(3);
+    assertChangeMessage("Looks good to me", parsedComments.get(0));
+    assertFileComment("This is a nice file", parsedComments.get(1), comments.get(1).key.filename);
+    assertInlineComment("Also have a comment here.", parsedComments.get(2), comments.get(3));
+  }
+
+  @Test
+  public void noComments() {
+    MailMessage.Builder b = newMailMessageBuilder();
+    b.textContent(newPlaintextBody(null, null, null, null, null, null, null) + quotedFooter);
+
+    List<Comment> comments = defaultComments();
+    List<MailComment> parsedComments = TextParser.parse(b.build(), comments, CHANGE_URL);
+
+    assertThat(parsedComments).isEmpty();
+  }
+
+  @Test
+  public void noChangeMessage() {
+    MailMessage.Builder b = newMailMessageBuilder();
+    b.textContent(
+        newPlaintextBody(
+                null, null, null, "Also have a comment here.", "This is a nice file", null, null)
+            + quotedFooter);
+
+    List<Comment> comments = defaultComments();
+    List<MailComment> parsedComments = TextParser.parse(b.build(), comments, CHANGE_URL);
+
+    assertThat(parsedComments).hasSize(2);
+    assertFileComment("This is a nice file", parsedComments.get(0), comments.get(1).key.filename);
+    assertInlineComment("Also have a comment here.", parsedComments.get(1), comments.get(3));
+  }
+
+  @Test
+  public void allCommentsGmail() {
+    MailMessage.Builder b = newMailMessageBuilder();
+    b.textContent(
+        (newPlaintextBody(
+                    "Looks good to me",
+                    null,
+                    null,
+                    "Also have a comment here.",
+                    "This is a nice file",
+                    null,
+                    null)
+                + quotedFooter)
+            .replace("> ", ">> "));
+
+    List<Comment> comments = defaultComments();
+    List<MailComment> parsedComments = TextParser.parse(b.build(), comments, CHANGE_URL);
+
+    assertThat(parsedComments).hasSize(3);
+    assertChangeMessage("Looks good to me", parsedComments.get(0));
+    assertFileComment("This is a nice file", parsedComments.get(1), comments.get(1).key.filename);
+    assertInlineComment("Also have a comment here.", parsedComments.get(2), comments.get(3));
+  }
+
+  @Test
+  public void replyToFileComment() {
+    MailMessage.Builder b = newMailMessageBuilder();
+    b.textContent(
+        newPlaintextBody(
+                "Looks good to me",
+                null,
+                null,
+                null,
+                null,
+                null,
+                "Comment in reply to file comment")
+            + quotedFooter);
+
+    List<Comment> comments = defaultComments();
+    List<MailComment> parsedComments = TextParser.parse(b.build(), comments, CHANGE_URL);
+
+    assertThat(parsedComments).hasSize(2);
+    assertChangeMessage("Looks good to me", parsedComments.get(0));
+    assertInlineComment("Comment in reply to file comment", parsedComments.get(1), comments.get(0));
+  }
+
+  @Test
+  public void squashComments() {
+    MailMessage.Builder b = newMailMessageBuilder();
+    b.textContent(
+        "Nice change\n> Some quoted content\nMy other comment on the same entity\n" + quotedFooter);
+
+    List<MailComment> parsedComments = TextParser.parse(b.build(), defaultComments(), CHANGE_URL);
+
+    assertThat(parsedComments).hasSize(1);
+    assertChangeMessage(
+        "Nice change\n\nMy other comment on the same entity", parsedComments.get(0));
+  }
+
+  /**
+   * Create a plaintext message body with the specified comments.
+   *
+   * @param changeMessage
+   * @param c1 Comment in reply to first inline comment.
+   * @param c2 Comment in reply to second inline comment.
+   * @param c3 Comment in reply to third inline comment.
+   * @param f1 Comment on file one.
+   * @param f2 Comment on file two.
+   * @param fc1 Comment in reply to a comment of file 1.
+   * @return A string with all inline comments and the original quoted email.
+   */
+  private static String newPlaintextBody(
+      String changeMessage, String c1, String c2, String c3, String f1, String f2, String fc1) {
+    return (changeMessage == null ? "" : changeMessage + "\n")
+        + "On Thu, Feb 9, 2017 at 8:21 AM, ekempin (Gerrit)\n"
+        + "<noreply-gerritcodereview-qUgXfQecoDLHwp0MldAzig@google.com> wrote: \n"
+        + "> Foo Bar has posted comments on this change. (  \n"
+        + "> "
+        + CHANGE_URL
+        + "/1 )\n"
+        + "> \n"
+        + "> Change subject: Test change\n"
+        + "> ...............................................................\n"
+        + "> \n"
+        + "> \n"
+        + "> Patch Set 1: Code-Review+1\n"
+        + "> \n"
+        + "> (3 comments)\n"
+        + "> \n"
+        + "> "
+        + CHANGE_URL
+        + "/1/gerrit-server/test.txt\n"
+        + "> File  \n"
+        + "> gerrit-server/test.txt:\n"
+        + (f1 == null ? "" : f1 + "\n")
+        + "> \n"
+        + "> Patch Set #4:\n"
+        + "> "
+        + CHANGE_URL
+        + "/1/gerrit-server/test.txt\n"
+        + "> \n"
+        + "> Some comment"
+        + "> \n"
+        + (fc1 == null ? "" : fc1 + "\n")
+        + "> "
+        + CHANGE_URL
+        + "/1/gerrit-server/test.txt@2\n"
+        + "> PS1, Line 2: throw new Exception(\"Object has unsupported: \" +\n"
+        + ">               :             entry.getValue() +\n"
+        + ">               :             \" must be java.util.Date\");\n"
+        + "> Should entry.getKey() be included in this message?\n"
+        + "> \n"
+        + (c1 == null ? "" : c1 + "\n")
+        + ">\n"
+        + "> \n"
+        + "> "
+        + CHANGE_URL
+        + "/1/gerrit-server/test.txt@3\n"
+        + "> PS1, Line 3: throw new Exception(\"Object has: \" +\n"
+        + ">               :             entry.getValue().getClass() +\n"
+        + ">              :             \" must be java.util.Date\");\n"
+        + "> same here\n"
+        + "> \n"
+        + (c2 == null ? "" : c2 + "\n")
+        + "> \n"
+        + "> "
+        + CHANGE_URL
+        + "/1/gerrit-server/readme.txt\n"
+        + "> File  \n"
+        + "> gerrit-server/readme.txt:\n"
+        + (f2 == null ? "" : f2 + "\n")
+        + "> \n"
+        + "> "
+        + CHANGE_URL
+        + "/1/gerrit-server/readme.txt@3\n"
+        + "> PS1, Line 3: E\n"
+        + "> Should this be EEE like in other places?\n"
+        + (c3 == null ? "" : c3 + "\n");
+  }
+}
diff --git a/javatests/com/google/gerrit/mail/data/AttachmentMessage.java b/javatests/com/google/gerrit/mail/data/AttachmentMessage.java
new file mode 100644
index 0000000..1d94d68
--- /dev/null
+++ b/javatests/com/google/gerrit/mail/data/AttachmentMessage.java
@@ -0,0 +1,92 @@
+// 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.
+
+package com.google.gerrit.mail.data;
+
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.mail.MailMessage;
+import java.time.LocalDateTime;
+import java.time.Month;
+import java.time.ZoneOffset;
+import org.junit.Ignore;
+
+/**
+ * Provides a raw message payload and a parsed {@code MailMessage} to check that mime parts that are
+ * neither text/plain, nor * text/html are dropped.
+ */
+@Ignore
+public class AttachmentMessage extends RawMailMessage {
+  private static String raw =
+      "MIME-Version: 1.0\n"
+          + "Date: Tue, 25 Oct 2016 02:11:35 -0700\n"
+          + "Message-ID: <CAM7sg=3meaAVUxW3KXeJEVs8sv_ADw1BnvpcHHiYVR2TQQi__w"
+          + "@mail.gmail.com>\n"
+          + "Subject: Test Subject\n"
+          + "From: Patrick Hiesel <hiesel@google.com>\n"
+          + "To: Patrick Hiesel <hiesel@google.com>\n"
+          + "Content-Type: multipart/mixed; boundary=001a114e019a56962d054062708f\n"
+          + "\n"
+          + "--001a114e019a56962d054062708f\n"
+          + "Content-Type: multipart/alternative; boundary=001a114e019a5696250540"
+          + "62708d\n"
+          + "\n"
+          + "--001a114e019a569625054062708d\n"
+          + "Content-Type: text/plain; charset=UTF-8\n"
+          + "\n"
+          + "Contains unwanted attachment"
+          + "\n"
+          + "--001a114e019a569625054062708d\n"
+          + "Content-Type: text/html; charset=UTF-8\n"
+          + "\n"
+          + "<div dir=\"ltr\">Contains unwanted attachment</div>"
+          + "\n"
+          + "--001a114e019a569625054062708d--\n"
+          + "--001a114e019a56962d054062708f\n"
+          + "Content-Type: text/plain; charset=US-ASCII; name=\"test.txt\"\n"
+          + "Content-Disposition: attachment; filename=\"test.txt\"\n"
+          + "Content-Transfer-Encoding: base64\n"
+          + "X-Attachment-Id: f_iv264bt50\n"
+          + "\n"
+          + "VEVTVAo=\n"
+          + "--001a114e019a56962d054062708f--";
+
+  @Override
+  public String raw() {
+    return raw;
+  }
+
+  @Override
+  public int[] rawChars() {
+    return null;
+  }
+
+  @Override
+  public MailMessage expectedMailMessage() {
+    System.out.println("\uD83D\uDE1B test");
+    MailMessage.Builder expect = MailMessage.builder();
+    expect
+        .id("<CAM7sg=3meaAVUxW3KXeJEVs8sv_ADw1BnvpcHHiYVR2TQQi__w@mail.gmail.com>")
+        .from(new Address("Patrick Hiesel", "hiesel@google.com"))
+        .addTo(new Address("Patrick Hiesel", "hiesel@google.com"))
+        .textContent("Contains unwanted attachment")
+        .htmlContent("<div dir=\"ltr\">Contains unwanted attachment</div>")
+        .subject("Test Subject")
+        .addAdditionalHeader("MIME-Version: 1.0")
+        .dateReceived(
+            LocalDateTime.of(2016, Month.OCTOBER, 25, 9, 11, 35)
+                .atOffset(ZoneOffset.UTC)
+                .toInstant());
+    return expect.build();
+  }
+}
diff --git a/javatests/com/google/gerrit/mail/data/Base64HeaderMessage.java b/javatests/com/google/gerrit/mail/data/Base64HeaderMessage.java
new file mode 100644
index 0000000..aa19537
--- /dev/null
+++ b/javatests/com/google/gerrit/mail/data/Base64HeaderMessage.java
@@ -0,0 +1,68 @@
+// 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.
+
+package com.google.gerrit.mail.data;
+
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.mail.MailMessage;
+import java.time.LocalDateTime;
+import java.time.Month;
+import java.time.ZoneOffset;
+import org.junit.Ignore;
+
+/** Tests parsing a Base64 encoded subject. */
+@Ignore
+public class Base64HeaderMessage extends RawMailMessage {
+  private static String textContent = "Some Text";
+  private static String raw =
+      ""
+          + "Date: Tue, 25 Oct 2016 02:11:35 -0700\n"
+          + "Message-ID: <001a114da7ae26e2eb053fe0c29c@google.com>\n"
+          + "Subject: =?UTF-8?B?8J+YmyB0ZXN0?=\n"
+          + "From: \"Jonathan Nieder (Gerrit)\" <noreply-gerritcodereview-"
+          + "CtTy0igsBrnvL7dKoWEIEg@google.com>\n"
+          + "To: ekempin <ekempin@google.com>\n"
+          + "Content-Type: text/plain; charset=UTF-8; format=flowed; delsp=yes\n"
+          + "\n"
+          + textContent;
+
+  @Override
+  public String raw() {
+    return raw;
+  }
+
+  @Override
+  public int[] rawChars() {
+    return null;
+  }
+
+  @Override
+  public MailMessage expectedMailMessage() {
+    MailMessage.Builder expect = MailMessage.builder();
+    expect
+        .id("<001a114da7ae26e2eb053fe0c29c@google.com>")
+        .from(
+            new Address(
+                "Jonathan Nieder (Gerrit)",
+                "noreply-gerritcodereview-CtTy0igsBrnvL7dKoWEIEg@google.com"))
+        .addTo(new Address("ekempin", "ekempin@google.com"))
+        .textContent(textContent)
+        .subject("\uD83D\uDE1B test")
+        .dateReceived(
+            LocalDateTime.of(2016, Month.OCTOBER, 25, 9, 11, 35)
+                .atOffset(ZoneOffset.UTC)
+                .toInstant());
+    return expect.build();
+  }
+}
diff --git a/javatests/com/google/gerrit/mail/data/HtmlMimeMessage.java b/javatests/com/google/gerrit/mail/data/HtmlMimeMessage.java
new file mode 100644
index 0000000..1d68cc8
--- /dev/null
+++ b/javatests/com/google/gerrit/mail/data/HtmlMimeMessage.java
@@ -0,0 +1,108 @@
+// 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.
+
+package com.google.gerrit.mail.data;
+
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.mail.MailMessage;
+import java.time.LocalDateTime;
+import java.time.Month;
+import java.time.ZoneOffset;
+import org.junit.Ignore;
+
+/** Tests a message containing mime/alternative (text + html) content. */
+@Ignore
+public class HtmlMimeMessage extends RawMailMessage {
+  private static String textContent = "Simple test";
+
+  // htmlContent is encoded in quoted-printable
+  private static String htmlContent =
+      "<div dir=3D\"ltr\">Test <span style"
+          + "=3D\"background-color:rgb(255,255,0)\">Messa=\n"
+          + "ge</span> in <u>HTML=C2=A0</u><a href=3D\"https://en.wikipedia.org/"
+          + "wiki/%C3%=\n9Cmlaut_(band)\" class=3D\"gmail-mw-redirect\" title=3D\""
+          + "=C3=9Cmlaut (band)\" st=\nyle=3D\"text-decoration:none;color:rgb(11,"
+          + "0,128);background-image:none;backg=\nround-position:initial;background"
+          + "-size:initial;background-repeat:initial;ba=\nckground-origin:initial;"
+          + "background-clip:initial;font-family:sans-serif;font=\n"
+          + "-size:14px\">=C3=9C</a></div>";
+
+  private static String unencodedHtmlContent =
+      ""
+          + "<div dir=\"ltr\">Test <span style=\"background-color:rgb(255,255,0)\">"
+          + "Message</span> in <u>HTML </u><a href=\"https://en.wikipedia.org/wiki/"
+          + "%C3%9Cmlaut_(band)\" class=\"gmail-mw-redirect\" title=\"Ümlaut "
+          + "(band)\" style=\"text-decoration:none;color:rgb(11,0,128);"
+          + "background-image:none;background-position:initial;background-size:"
+          + "initial;background-repeat:initial;background-origin:initial;background"
+          + "-clip:initial;font-family:sans-serif;font-size:14px\">Ü</a></div>";
+
+  private static String raw =
+      ""
+          + "MIME-Version: 1.0\n"
+          + "Date: Tue, 25 Oct 2016 02:11:35 -0700\n"
+          + "Message-ID: <001a114cd8be55b4ab053face5cd@google.com>\n"
+          + "Subject: Change in gerrit[master]: Implement receiver class structure "
+          + "and bindings\n"
+          + "From: \"ekempin (Gerrit)\" <noreply-gerritcodereview-qUgXfQecoDLHwp0Ml"
+          + "dAzig@google.com>\n"
+          + "To: Patrick Hiesel <hiesel@google.com>\n"
+          + "Cc: ekempin <ekempin@google.com>\n"
+          + "Content-Type: multipart/alternative; boundary=001a114cd8b"
+          + "e55b486053face5ca\n"
+          + "\n"
+          + "--001a114cd8be55b486053face5ca\n"
+          + "Content-Type: text/plain; charset=UTF-8; format=flowed; delsp=yes\n"
+          + "\n"
+          + textContent
+          + "\n"
+          + "--001a114cd8be55b486053face5ca\n"
+          + "Content-Type: text/html; charset=UTF-8\n"
+          + "Content-Transfer-Encoding: quoted-printable\n"
+          + "\n"
+          + htmlContent
+          + "\n"
+          + "--001a114cd8be55b486053face5ca--";
+
+  @Override
+  public String raw() {
+    return raw;
+  }
+
+  @Override
+  public int[] rawChars() {
+    return null;
+  }
+
+  @Override
+  public MailMessage expectedMailMessage() {
+    MailMessage.Builder expect = MailMessage.builder();
+    expect
+        .id("<001a114cd8be55b4ab053face5cd@google.com>")
+        .from(
+            new Address(
+                "ekempin (Gerrit)", "noreply-gerritcodereview-qUgXfQecoDLHwp0MldAzig@google.com"))
+        .addCc(new Address("ekempin", "ekempin@google.com"))
+        .addTo(new Address("Patrick Hiesel", "hiesel@google.com"))
+        .textContent(textContent)
+        .htmlContent(unencodedHtmlContent)
+        .subject("Change in gerrit[master]: Implement receiver class structure and bindings")
+        .addAdditionalHeader("MIME-Version: 1.0")
+        .dateReceived(
+            LocalDateTime.of(2016, Month.OCTOBER, 25, 9, 11, 35)
+                .atOffset(ZoneOffset.UTC)
+                .toInstant());
+    return expect.build();
+  }
+}
diff --git a/javatests/com/google/gerrit/mail/data/NonUTF8Message.java b/javatests/com/google/gerrit/mail/data/NonUTF8Message.java
new file mode 100644
index 0000000..32915e7
--- /dev/null
+++ b/javatests/com/google/gerrit/mail/data/NonUTF8Message.java
@@ -0,0 +1,72 @@
+// 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.
+package com.google.gerrit.mail.data;
+
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.mail.MailMessage;
+import java.time.LocalDateTime;
+import java.time.Month;
+import java.time.ZoneOffset;
+import org.junit.Ignore;
+
+/** Tests that non-UTF8 encodings are handled correctly. */
+@Ignore
+public class NonUTF8Message extends RawMailMessage {
+  private static String textContent = "Some Text";
+  private static String raw =
+      ""
+          + "Date: Tue, 25 Oct 2016 02:11:35 -0700\n"
+          + "Message-ID: <001a114da7ae26e2eb053fe0c29c@google.com>\n"
+          + "Subject: =?UTF-8?B?8J+YmyB0ZXN0?=\n"
+          + "From: \"Jonathan Nieder (Gerrit)\" <noreply-gerritcodereview-"
+          + "CtTy0igsBrnvL7dKoWEIEg@google.com>\n"
+          + "To: ekempin <ekempin@google.com>\n"
+          + "Content-Type: text/plain; charset=UTF-8; format=flowed; delsp=yes\n"
+          + "\n"
+          + textContent;
+
+  @Override
+  public String raw() {
+    return null;
+  }
+
+  @Override
+  public int[] rawChars() {
+    int[] arr = new int[raw.length()];
+    int i = 0;
+    for (char c : raw.toCharArray()) {
+      arr[i++] = c;
+    }
+    return arr;
+  }
+
+  @Override
+  public MailMessage expectedMailMessage() {
+    MailMessage.Builder expect = MailMessage.builder();
+    expect
+        .id("<001a114da7ae26e2eb053fe0c29c@google.com>")
+        .from(
+            new Address(
+                "Jonathan Nieder (Gerrit)",
+                "noreply-gerritcodereview-CtTy0igsBrnvL7dKoWEIEg@google.com"))
+        .addTo(new Address("ekempin", "ekempin@google.com"))
+        .textContent(textContent)
+        .subject("\uD83D\uDE1B test")
+        .dateReceived(
+            LocalDateTime.of(2016, Month.OCTOBER, 25, 9, 11, 35)
+                .atOffset(ZoneOffset.UTC)
+                .toInstant());
+    return expect.build();
+  }
+}
diff --git a/javatests/com/google/gerrit/mail/data/QuotedPrintableHeaderMessage.java b/javatests/com/google/gerrit/mail/data/QuotedPrintableHeaderMessage.java
new file mode 100644
index 0000000..47e813a
--- /dev/null
+++ b/javatests/com/google/gerrit/mail/data/QuotedPrintableHeaderMessage.java
@@ -0,0 +1,69 @@
+// 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.
+
+package com.google.gerrit.mail.data;
+
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.mail.MailMessage;
+import java.time.LocalDateTime;
+import java.time.Month;
+import java.time.ZoneOffset;
+import org.junit.Ignore;
+
+/** Tests parsing a quoted printable encoded subject */
+@Ignore
+public class QuotedPrintableHeaderMessage extends RawMailMessage {
+  private static String textContent = "Some Text";
+  private static String raw =
+      ""
+          + "Date: Tue, 25 Oct 2016 02:11:35 -0700\n"
+          + "Message-ID: <001a114da7ae26e2eb053fe0c29c@google.com>\n"
+          + "Subject: =?UTF-8?Q?=C3=A2me vulgaire?=\n"
+          + "From: \"Jonathan Nieder (Gerrit)\" <noreply-gerritcodereview-"
+          + "CtTy0igsBrnvL7dKoWEIEg@google.com>\n"
+          + "To: ekempin <ekempin@google.com>\n"
+          + "Content-Type: text/plain; charset=UTF-8; format=flowed; delsp=yes\n"
+          + "\n"
+          + textContent;
+
+  @Override
+  public String raw() {
+    return raw;
+  }
+
+  @Override
+  public int[] rawChars() {
+    return null;
+  }
+
+  @Override
+  public MailMessage expectedMailMessage() {
+    System.out.println("\uD83D\uDE1B test");
+    MailMessage.Builder expect = MailMessage.builder();
+    expect
+        .id("<001a114da7ae26e2eb053fe0c29c@google.com>")
+        .from(
+            new Address(
+                "Jonathan Nieder (Gerrit)",
+                "noreply-gerritcodereview-CtTy0igsBrnvL7dKoWEIEg@google.com"))
+        .addTo(new Address("ekempin", "ekempin@google.com"))
+        .textContent(textContent)
+        .subject("âme vulgaire")
+        .dateReceived(
+            LocalDateTime.of(2016, Month.OCTOBER, 25, 9, 11, 35)
+                .atOffset(ZoneOffset.UTC)
+                .toInstant());
+    return expect.build();
+  }
+}
diff --git a/javatests/com/google/gerrit/mail/data/RawMailMessage.java b/javatests/com/google/gerrit/mail/data/RawMailMessage.java
new file mode 100644
index 0000000..53c782c
--- /dev/null
+++ b/javatests/com/google/gerrit/mail/data/RawMailMessage.java
@@ -0,0 +1,29 @@
+// 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.
+
+package com.google.gerrit.mail.data;
+
+import com.google.gerrit.mail.MailMessage;
+import org.junit.Ignore;
+
+/** Base class for all email parsing tests. */
+@Ignore
+public abstract class RawMailMessage {
+  // Raw content to feed the parser
+  public abstract String raw();
+
+  public abstract int[] rawChars();
+  // Parsed representation for asserting the expected parser output
+  public abstract MailMessage expectedMailMessage();
+}
diff --git a/javatests/com/google/gerrit/mail/data/SimpleTextMessage.java b/javatests/com/google/gerrit/mail/data/SimpleTextMessage.java
new file mode 100644
index 0000000..a8f5b94
--- /dev/null
+++ b/javatests/com/google/gerrit/mail/data/SimpleTextMessage.java
@@ -0,0 +1,142 @@
+// 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.
+
+package com.google.gerrit.mail.data;
+
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.mail.MailMessage;
+import java.time.LocalDateTime;
+import java.time.Month;
+import java.time.ZoneOffset;
+import org.junit.Ignore;
+
+/** Tests parsing a simple text message with different headers. */
+@Ignore
+public class SimpleTextMessage extends RawMailMessage {
+  private static String textContent =
+      ""
+          + "Jonathan Nieder has posted comments on this change. (  \n"
+          + "https://gerrit-review.googlesource.com/90018 )\n"
+          + "\n"
+          + "Change subject: (Re)enable voting buttons for merged changes\n"
+          + "...........................................................\n"
+          + "\n"
+          + "\n"
+          + "Patch Set 2:\n"
+          + "\n"
+          + "This is producing NPEs server-side and 500s for the client.   \n"
+          + "when I try to load this change:\n"
+          + "\n"
+          + "  Error in GET /changes/90018/detail?O=10004\n"
+          + "  com.google.gwtorm.OrmException: java.lang.NullPointerException\n"
+          + "\tat com.google.gerrit.change.ChangeJson.format(ChangeJson.java:303)\n"
+          + "\tat com.google.gerrit.change.ChangeJson.format(ChangeJson.java:285)\n"
+          + "\tat com.google.gerrit.change.ChangeJson.format(ChangeJson.java:263)\n"
+          + "\tat com.google.gerrit.change.GetChange.apply(GetChange.java:50)\n"
+          + "\tat com.google.gerrit.change.GetDetail.apply(GetDetail.java:51)\n"
+          + "\tat com.google.gerrit.change.GetDetail.apply(GetDetail.java:26)\n"
+          + "\tat  \n"
+          + "com.google.gerrit.RestApiServlet.service(RestApiServlet.java:367)\n"
+          + "\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:717)\n"
+          + "[...]\n"
+          + "  Caused by: java.lang.NullPointerException\n"
+          + "\tat  \n"
+          + "com.google.gerrit.ChangeJson.setLabelScores(ChangeJson.java:670)\n"
+          + "\tat  \n"
+          + "com.google.gerrit.ChangeJson.labelsFor(ChangeJson.java:845)\n"
+          + "\tat  \n"
+          + "com.google.gerrit.change.ChangeJson.labelsFor(ChangeJson.java:598)\n"
+          + "\tat  \n"
+          + "com.google.gerrit.change.ChangeJson.toChange(ChangeJson.java:499)\n"
+          + "\tat com.google.gerrit.change.ChangeJson.format(ChangeJson.java:294)\n"
+          + "\t... 105 more\n"
+          + "-- \n"
+          + "To view, visit https://gerrit-review.googlesource.com/90018\n"
+          + "To unsubscribe, visit https://gerrit-review.googlesource.com\n"
+          + "\n"
+          + "Gerrit-MessageType: comment\n"
+          + "Gerrit-Change-Id: Iba501e00bee77be3bd0ced72f88fd04ba0accaed\n"
+          + "Gerrit-PatchSet: 2\n"
+          + "Gerrit-Project: gerrit\n"
+          + "Gerrit-Branch: master\n"
+          + "Gerrit-Owner: ekempin <ekempin@google.com>\n"
+          + "Gerrit-Reviewer: Dave Borowitz <dborowitz@google.com>\n"
+          + "Gerrit-Reviewer: Edwin Kempin <ekempin@google.com>\n"
+          + "Gerrit-Reviewer: GerritForge CI <gerritforge@gmail.com>\n"
+          + "Gerrit-Reviewer: Jonathan Nieder <jrn@google.com>\n"
+          + "Gerrit-Reviewer: Patrick Hiesel <hiesel@google.com>\n"
+          + "Gerrit-Reviewer: ekempin <ekempin@google.com>\n"
+          + "Gerrit-HasComments: No";
+
+  private static String raw =
+      ""
+          + "Authentication-Results: mx.google.com; dkim=pass header.i="
+          + "@google.com;\n"
+          + "Date: Tue, 25 Oct 2016 02:11:35 -0700\n"
+          + "In-Reply-To: <gerrit.1477487889000.Iba501e00bee77be3bd0ced"
+          + "72f88fd04ba0accaed@gerrit-review.googlesource.com>\n"
+          + "References: <gerrit.1477487889000.Iba501e00bee77be3bd0ced72f8"
+          + "8fd04ba0accaed@gerrit-review.googlesource.com>\n"
+          + "Message-ID: <001a114da7ae26e2eb053fe0c29c@google.com>\n"
+          + "Subject: Change in gerrit[master]: (Re)enable voting buttons for "
+          + "merged changes\n"
+          + "From: \"Jonathan Nieder (Gerrit)\" <noreply-gerritcodereview-CtTy0"
+          + "igsBrnvL7dKoWEIEg@google.com>\n"
+          + "To: ekempin <ekempin@google.com>\n"
+          + "Cc: Dave Borowitz <dborowitz@google.com>, Jonathan Nieder "
+          + "<jrn@google.com>, Patrick Hiesel <hiesel@google.com>\n"
+          + "Content-Type: text/plain; charset=UTF-8; format=flowed; delsp=yes\n"
+          + "\n"
+          + textContent;
+
+  @Override
+  public String raw() {
+    return raw;
+  }
+
+  @Override
+  public int[] rawChars() {
+    return null;
+  }
+
+  @Override
+  public MailMessage expectedMailMessage() {
+    MailMessage.Builder expect = MailMessage.builder();
+    expect
+        .id("<001a114da7ae26e2eb053fe0c29c@google.com>")
+        .from(
+            new Address(
+                "Jonathan Nieder (Gerrit)",
+                "noreply-gerritcodereview-CtTy0igsBrnvL7dKoWEIEg@google.com"))
+        .addTo(new Address("ekempin", "ekempin@google.com"))
+        .addCc(new Address("Dave Borowitz", "dborowitz@google.com"))
+        .addCc(new Address("Jonathan Nieder", "jrn@google.com"))
+        .addCc(new Address("Patrick Hiesel", "hiesel@google.com"))
+        .textContent(textContent)
+        .subject("Change in gerrit[master]: (Re)enable voting buttons for merged changes")
+        .dateReceived(
+            LocalDateTime.of(2016, Month.OCTOBER, 25, 9, 11, 35)
+                .atOffset(ZoneOffset.UTC)
+                .toInstant())
+        .addAdditionalHeader(
+            "Authentication-Results: mx.google.com; dkim=pass header.i=@google.com;")
+        .addAdditionalHeader(
+            "In-Reply-To: <gerrit.1477487889000.Iba501e00bee"
+                + "77be3bd0ced72f88fd04ba0accaed@gerrit-review.googlesource.com>")
+        .addAdditionalHeader(
+            "References: <gerrit.1477487889000.Iba501e00bee"
+                + "77be3bd0ced72f88fd04ba0accaed@gerrit-review.googlesource.com>");
+    return expect.build();
+  }
+}
diff --git a/javatests/com/google/gerrit/metrics/dropwizard/BUILD b/javatests/com/google/gerrit/metrics/dropwizard/BUILD
new file mode 100644
index 0000000..98d12b2
--- /dev/null
+++ b/javatests/com/google/gerrit/metrics/dropwizard/BUILD
@@ -0,0 +1,12 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+junit_tests(
+    name = "dropwizard_tests",
+    srcs = glob(["**/*.java"]),
+    tags = ["metrics"],
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/metrics/dropwizard",
+        "//lib/truth",
+    ],
+)
diff --git a/gerrit-server/src/test/java/com/google/gerrit/metrics/dropwizard/DropWizardMetricMakerTest.java b/javatests/com/google/gerrit/metrics/dropwizard/DropWizardMetricMakerTest.java
similarity index 100%
rename from gerrit-server/src/test/java/com/google/gerrit/metrics/dropwizard/DropWizardMetricMakerTest.java
rename to javatests/com/google/gerrit/metrics/dropwizard/DropWizardMetricMakerTest.java
diff --git a/javatests/com/google/gerrit/metrics/proc/BUILD b/javatests/com/google/gerrit/metrics/proc/BUILD
new file mode 100644
index 0000000..91e5cf6
--- /dev/null
+++ b/javatests/com/google/gerrit/metrics/proc/BUILD
@@ -0,0 +1,16 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+junit_tests(
+    name = "proc_tests",
+    size = "small",
+    srcs = glob(["**/*.java"]),
+    deps = [
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/lifecycle",
+        "//java/com/google/gerrit/metrics",
+        "//java/com/google/gerrit/metrics/dropwizard",
+        "//lib/dropwizard:dropwizard-core",
+        "//lib/guice",
+        "//lib/truth",
+    ],
+)
diff --git a/gerrit-server/src/test/java/com/google/gerrit/metrics/proc/ProcMetricModuleTest.java b/javatests/com/google/gerrit/metrics/proc/ProcMetricModuleTest.java
similarity index 100%
rename from gerrit-server/src/test/java/com/google/gerrit/metrics/proc/ProcMetricModuleTest.java
rename to javatests/com/google/gerrit/metrics/proc/ProcMetricModuleTest.java
diff --git a/javatests/com/google/gerrit/pgm/BUILD b/javatests/com/google/gerrit/pgm/BUILD
new file mode 100644
index 0000000..e4afae2
--- /dev/null
+++ b/javatests/com/google/gerrit/pgm/BUILD
@@ -0,0 +1,27 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+load("//tools/bzl:license.bzl", "license_test")
+
+junit_tests(
+    name = "pgm_tests",
+    srcs = glob(["**/*.java"]),
+    deps = [
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/pgm",
+        "//java/com/google/gerrit/pgm/http",
+        "//java/com/google/gerrit/pgm/init",
+        "//java/com/google/gerrit/pgm/init/api",
+        "//java/com/google/gerrit/server",
+        "//lib:guava",
+        "//lib:junit",
+        "//lib/easymock",
+        "//lib/guice",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/jgit/org.eclipse.jgit.junit:junit",
+        "//lib/truth",
+    ],
+)
+
+license_test(
+    name = "pgm_license_test",
+    target = "//java/com/google/gerrit/pgm",
+)
diff --git a/gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/InitTestCase.java b/javatests/com/google/gerrit/pgm/init/InitTestCase.java
similarity index 100%
rename from gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/InitTestCase.java
rename to javatests/com/google/gerrit/pgm/init/InitTestCase.java
diff --git a/gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/LibrariesTest.java b/javatests/com/google/gerrit/pgm/init/LibrariesTest.java
similarity index 100%
rename from gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/LibrariesTest.java
rename to javatests/com/google/gerrit/pgm/init/LibrariesTest.java
diff --git a/gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_xTest.java b/javatests/com/google/gerrit/pgm/init/UpgradeFrom2_0_xTest.java
similarity index 100%
rename from gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_xTest.java
rename to javatests/com/google/gerrit/pgm/init/UpgradeFrom2_0_xTest.java
diff --git a/javatests/com/google/gerrit/proto/BUILD b/javatests/com/google/gerrit/proto/BUILD
new file mode 100644
index 0000000..0940f6b
--- /dev/null
+++ b/javatests/com/google/gerrit/proto/BUILD
@@ -0,0 +1,17 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+junit_tests(
+    name = "proto_tests",
+    srcs = glob(["*.java"]),
+    deps = [
+        "//lib/truth:truth-proto-extension",
+        "//proto:reviewdb_java_proto",
+
+        # TODO(dborowitz): These are already runtime_deps of
+        # truth-proto-extension, but either omitting them or adding them as
+        # runtime_deps to this target fails with:
+        #   class file for com.google.common.collect.Multimap not found
+        "//lib:guava",
+        "//lib/truth",
+    ],
+)
diff --git a/javatests/com/google/gerrit/proto/ReviewDbProtoTest.java b/javatests/com/google/gerrit/proto/ReviewDbProtoTest.java
new file mode 100644
index 0000000..49cd2921
--- /dev/null
+++ b/javatests/com/google/gerrit/proto/ReviewDbProtoTest.java
@@ -0,0 +1,31 @@
+// 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.
+
+package com.google.gerrit.proto;
+
+import static com.google.common.truth.extensions.proto.ProtoTruth.assertThat;
+
+import com.google.gerrit.proto.reviewdb.Reviewdb.Change;
+import com.google.gerrit.proto.reviewdb.Reviewdb.Change_Id;
+import org.junit.Test;
+
+public class ReviewDbProtoTest {
+  @Test
+  public void generatedProtoApi() {
+    Change c1 = Change.newBuilder().setChangeId(Change_Id.newBuilder().setId(1234).build()).build();
+    Change c2 = Change.newBuilder().setChangeId(Change_Id.newBuilder().setId(5678).build()).build();
+    assertThat(c1).isEqualTo(c1);
+    assertThat(c1).isNotEqualTo(c2);
+  }
+}
diff --git a/javatests/com/google/gerrit/reviewdb/BUILD b/javatests/com/google/gerrit/reviewdb/BUILD
new file mode 100644
index 0000000..0fd140e
--- /dev/null
+++ b/javatests/com/google/gerrit/reviewdb/BUILD
@@ -0,0 +1,14 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+junit_tests(
+    name = "client_tests",
+    srcs = glob(["client/**/*.java"]),
+    deps = [
+        "//java/com/google/gerrit/reviewdb:client",
+        "//java/com/google/gerrit/server/project/testing:project-test-util",
+        "//java/com/google/gerrit/testing:gerrit-test-util",
+        "//lib:guava",
+        "//lib:gwtorm",
+        "//lib/truth",
+    ],
+)
diff --git a/javatests/com/google/gerrit/reviewdb/client/AccountGroupTest.java b/javatests/com/google/gerrit/reviewdb/client/AccountGroupTest.java
new file mode 100644
index 0000000..18a55bf
--- /dev/null
+++ b/javatests/com/google/gerrit/reviewdb/client/AccountGroupTest.java
@@ -0,0 +1,76 @@
+// Copyright (C) 2017 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.google.gerrit.reviewdb.client;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.reviewdb.client.AccountGroup.UUID.fromRef;
+import static com.google.gerrit.reviewdb.client.AccountGroup.UUID.fromRefPart;
+
+import java.sql.Timestamp;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.Month;
+import java.time.ZoneOffset;
+import org.junit.Test;
+
+public class AccountGroupTest {
+  private static final String TEST_UUID = "ccab3195282a8ce4f5014efa391e82d10f884c64";
+  private static final String TEST_SHARDED_UUID = TEST_UUID.substring(0, 2) + "/" + TEST_UUID;
+
+  @Test
+  public void auditCreationInstant() {
+    Instant instant = LocalDateTime.of(2009, Month.JUNE, 8, 19, 31).toInstant(ZoneOffset.UTC);
+    assertThat(AccountGroup.auditCreationInstantTs()).isEqualTo(Timestamp.from(instant));
+  }
+
+  @Test
+  public void parseRefName() {
+    assertThat(fromRef("refs/groups/" + TEST_SHARDED_UUID)).isEqualTo(uuid(TEST_UUID));
+    assertThat(fromRef("refs/groups/" + TEST_SHARDED_UUID + "-2"))
+        .isEqualTo(uuid(TEST_UUID + "-2"));
+    assertThat(fromRef("refs/groups/7e/7ec4775d")).isEqualTo(uuid("7ec4775d"));
+    assertThat(fromRef("refs/groups/fo/foo")).isEqualTo(uuid("foo"));
+
+    assertThat(fromRef(null)).isNull();
+    assertThat(fromRef("")).isNull();
+
+    // Missing prefix.
+    assertThat(fromRef(TEST_SHARDED_UUID)).isNull();
+
+    // Invalid shards.
+    assertThat(fromRef("refs/groups/c/" + TEST_UUID)).isNull();
+    assertThat(fromRef("refs/groups/cca/" + TEST_UUID)).isNull();
+
+    // Mismatched shard.
+    assertThat(fromRef("refs/groups/ca/" + TEST_UUID)).isNull();
+    assertThat(fromRef("refs/groups/64/" + TEST_UUID)).isNull();
+
+    // Wrong number of segments.
+    assertThat(fromRef("refs/groups/cc")).isNull();
+    assertThat(fromRef("refs/groups/" + TEST_SHARDED_UUID + "/1")).isNull();
+  }
+
+  @Test
+  public void parseRefNameParts() {
+    assertThat(fromRefPart(TEST_SHARDED_UUID)).isEqualTo(uuid(TEST_UUID));
+
+    // Mismatched shard.
+    assertThat(fromRefPart("ab/" + TEST_UUID)).isNull();
+  }
+
+  private AccountGroup.UUID uuid(String uuid) {
+    return new AccountGroup.UUID(uuid);
+  }
+}
diff --git a/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/AccountTest.java b/javatests/com/google/gerrit/reviewdb/client/AccountTest.java
similarity index 100%
rename from gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/AccountTest.java
rename to javatests/com/google/gerrit/reviewdb/client/AccountTest.java
diff --git a/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/ChangeTest.java b/javatests/com/google/gerrit/reviewdb/client/ChangeTest.java
similarity index 100%
rename from gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/ChangeTest.java
rename to javatests/com/google/gerrit/reviewdb/client/ChangeTest.java
diff --git a/javatests/com/google/gerrit/reviewdb/client/PatchSetApprovalTest.java b/javatests/com/google/gerrit/reviewdb/client/PatchSetApprovalTest.java
new file mode 100644
index 0000000..5e42ce0
--- /dev/null
+++ b/javatests/com/google/gerrit/reviewdb/client/PatchSetApprovalTest.java
@@ -0,0 +1,53 @@
+// Copyright (C) 2015 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.google.gerrit.reviewdb.client;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.testing.GerritBaseTests;
+import java.util.HashMap;
+import java.util.Map;
+import org.junit.Test;
+
+public class PatchSetApprovalTest extends GerritBaseTests {
+  @Test
+  public void keyEquality() {
+    PatchSetApproval.Key k1 =
+        new PatchSetApproval.Key(
+            new PatchSet.Id(new Change.Id(1), 2), new Account.Id(3), new LabelId("My-Label"));
+    PatchSetApproval.Key k2 =
+        new PatchSetApproval.Key(
+            new PatchSet.Id(new Change.Id(1), 2), new Account.Id(3), new LabelId("My-Label"));
+    PatchSetApproval.Key k3 =
+        new PatchSetApproval.Key(
+            new PatchSet.Id(new Change.Id(1), 2), new Account.Id(3), new LabelId("Other-Label"));
+
+    assertThat(k2).isEqualTo(k1);
+    assertThat(k3).isNotEqualTo(k1);
+    assertThat(k2.hashCode()).isEqualTo(k1.hashCode());
+    assertThat(k3.hashCode()).isNotEqualTo(k1.hashCode());
+
+    Map<PatchSetApproval.Key, String> map = new HashMap<>();
+    map.put(k1, "k1");
+    map.put(k2, "k2");
+    map.put(k3, "k3");
+    assertThat(map).containsKey(k1);
+    assertThat(map).containsKey(k2);
+    assertThat(map).containsKey(k3);
+    assertThat(map).containsEntry(k1, "k2");
+    assertThat(map).containsEntry(k2, "k2");
+    assertThat(map).containsEntry(k3, "k3");
+  }
+}
diff --git a/gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/PatchSetTest.java b/javatests/com/google/gerrit/reviewdb/client/PatchSetTest.java
similarity index 100%
rename from gerrit-reviewdb/src/test/java/com/google/gerrit/reviewdb/client/PatchSetTest.java
rename to javatests/com/google/gerrit/reviewdb/client/PatchSetTest.java
diff --git a/javatests/com/google/gerrit/reviewdb/client/RefNamesTest.java b/javatests/com/google/gerrit/reviewdb/client/RefNamesTest.java
new file mode 100644
index 0000000..fa6a722
--- /dev/null
+++ b/javatests/com/google/gerrit/reviewdb/client/RefNamesTest.java
@@ -0,0 +1,300 @@
+// Copyright (C) 2015 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.google.gerrit.reviewdb.client;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.reviewdb.client.RefNames.parseAfterShardedRefPart;
+import static com.google.gerrit.reviewdb.client.RefNames.parseRefSuffix;
+import static com.google.gerrit.reviewdb.client.RefNames.parseShardedRefPart;
+import static com.google.gerrit.reviewdb.client.RefNames.parseShardedUuidFromRefPart;
+import static com.google.gerrit.reviewdb.client.RefNames.skipShardedRefPart;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+public class RefNamesTest {
+  private static final String TEST_GROUP_UUID = "ccab3195282a8ce4f5014efa391e82d10f884c64";
+  private static final String TEST_SHARDED_GROUP_UUID =
+      TEST_GROUP_UUID.substring(0, 2) + "/" + TEST_GROUP_UUID;
+
+  @Rule public ExpectedException expectedException = ExpectedException.none();
+
+  private final Account.Id accountId = new Account.Id(1011123);
+  private final Change.Id changeId = new Change.Id(67473);
+  private final PatchSet.Id psId = new PatchSet.Id(changeId, 42);
+
+  @Test
+  public void fullName() throws Exception {
+    assertThat(RefNames.fullName(RefNames.REFS_CONFIG)).isEqualTo(RefNames.REFS_CONFIG);
+    assertThat(RefNames.fullName("refs/heads/master")).isEqualTo("refs/heads/master");
+    assertThat(RefNames.fullName("master")).isEqualTo("refs/heads/master");
+    assertThat(RefNames.fullName("refs/tags/v1.0")).isEqualTo("refs/tags/v1.0");
+    assertThat(RefNames.fullName("HEAD")).isEqualTo("HEAD");
+  }
+
+  @Test
+  public void changeRefs() throws Exception {
+    String changeMetaRef = RefNames.changeMetaRef(changeId);
+    assertThat(changeMetaRef).isEqualTo("refs/changes/73/67473/meta");
+    assertThat(RefNames.isNoteDbMetaRef(changeMetaRef)).isTrue();
+
+    String robotCommentsRef = RefNames.robotCommentsRef(changeId);
+    assertThat(robotCommentsRef).isEqualTo("refs/changes/73/67473/robot-comments");
+    assertThat(RefNames.isNoteDbMetaRef(robotCommentsRef)).isTrue();
+  }
+
+  @Test
+  public void refForGroupIsSharded() throws Exception {
+    AccountGroup.UUID groupUuid = new AccountGroup.UUID("ABCDEFG");
+    String groupRef = RefNames.refsGroups(groupUuid);
+    assertThat(groupRef).isEqualTo("refs/groups/AB/ABCDEFG");
+  }
+
+  @Test
+  public void refForGroupWithUuidLessThanTwoCharsIsRejected() throws Exception {
+    AccountGroup.UUID groupUuid = new AccountGroup.UUID("A");
+    expectedException.expect(IllegalArgumentException.class);
+    RefNames.refsGroups(groupUuid);
+  }
+
+  @Test
+  public void refForDeletedGroupIsSharded() throws Exception {
+    AccountGroup.UUID groupUuid = new AccountGroup.UUID("ABCDEFG");
+    String groupRef = RefNames.refsDeletedGroups(groupUuid);
+    assertThat(groupRef).isEqualTo("refs/deleted-groups/AB/ABCDEFG");
+  }
+
+  @Test
+  public void refForDeletedGroupWithUuidLessThanTwoCharsIsRejected() throws Exception {
+    AccountGroup.UUID groupUuid = new AccountGroup.UUID("A");
+    expectedException.expect(IllegalArgumentException.class);
+    RefNames.refsDeletedGroups(groupUuid);
+  }
+
+  @Test
+  public void refsUsers() throws Exception {
+    assertThat(RefNames.refsUsers(accountId)).isEqualTo("refs/users/23/1011123");
+  }
+
+  @Test
+  public void refsDraftComments() throws Exception {
+    assertThat(RefNames.refsDraftComments(changeId, accountId))
+        .isEqualTo("refs/draft-comments/73/67473/1011123");
+  }
+
+  @Test
+  public void refsDraftCommentsPrefix() throws Exception {
+    assertThat(RefNames.refsDraftCommentsPrefix(changeId))
+        .isEqualTo("refs/draft-comments/73/67473/");
+  }
+
+  @Test
+  public void refsStarredChanges() throws Exception {
+    assertThat(RefNames.refsStarredChanges(changeId, accountId))
+        .isEqualTo("refs/starred-changes/73/67473/1011123");
+  }
+
+  @Test
+  public void refsStarredChangesPrefix() throws Exception {
+    assertThat(RefNames.refsStarredChangesPrefix(changeId))
+        .isEqualTo("refs/starred-changes/73/67473/");
+  }
+
+  @Test
+  public void refsEdit() throws Exception {
+    assertThat(RefNames.refsEdit(accountId, changeId, psId))
+        .isEqualTo("refs/users/23/1011123/edit-67473/42");
+  }
+
+  @Test
+  public void isRefsEdit() throws Exception {
+    assertThat(RefNames.isRefsEdit("refs/users/23/1011123/edit-67473/42")).isTrue();
+
+    // user ref, but no edit ref
+    assertThat(RefNames.isRefsEdit("refs/users/23/1011123")).isFalse();
+
+    // other ref
+    assertThat(RefNames.isRefsEdit("refs/heads/master")).isFalse();
+  }
+
+  @Test
+  public void isRefsUsers() throws Exception {
+    assertThat(RefNames.isRefsUsers("refs/users/23/1011123")).isTrue();
+    assertThat(RefNames.isRefsUsers("refs/users/default")).isTrue();
+    assertThat(RefNames.isRefsUsers("refs/users/23/1011123/edit-67473/42")).isTrue();
+
+    assertThat(RefNames.isRefsUsers("refs/heads/master")).isFalse();
+    assertThat(RefNames.isRefsUsers("refs/groups/" + TEST_SHARDED_GROUP_UUID)).isFalse();
+  }
+
+  @Test
+  public void isRefsGroups() throws Exception {
+    assertThat(RefNames.isRefsGroups("refs/groups/" + TEST_SHARDED_GROUP_UUID)).isTrue();
+
+    assertThat(RefNames.isRefsGroups("refs/heads/master")).isFalse();
+    assertThat(RefNames.isRefsGroups("refs/users/23/1011123")).isFalse();
+    assertThat(RefNames.isRefsGroups(RefNames.REFS_GROUPNAMES)).isFalse();
+    assertThat(RefNames.isRefsGroups("refs/deleted-groups/" + TEST_SHARDED_GROUP_UUID)).isFalse();
+  }
+
+  @Test
+  public void isRefsDeletedGroups() throws Exception {
+    assertThat(RefNames.isRefsDeletedGroups("refs/deleted-groups/" + TEST_SHARDED_GROUP_UUID))
+        .isTrue();
+
+    assertThat(RefNames.isRefsDeletedGroups("refs/heads/master")).isFalse();
+    assertThat(RefNames.isRefsDeletedGroups("refs/users/23/1011123")).isFalse();
+    assertThat(RefNames.isRefsDeletedGroups(RefNames.REFS_GROUPNAMES)).isFalse();
+    assertThat(RefNames.isRefsDeletedGroups("refs/groups/" + TEST_SHARDED_GROUP_UUID)).isFalse();
+  }
+
+  @Test
+  public void isGroupRef() throws Exception {
+    assertThat(RefNames.isGroupRef("refs/groups/" + TEST_SHARDED_GROUP_UUID)).isTrue();
+    assertThat(RefNames.isGroupRef("refs/deleted-groups/" + TEST_SHARDED_GROUP_UUID)).isTrue();
+    assertThat(RefNames.isGroupRef(RefNames.REFS_GROUPNAMES)).isTrue();
+
+    assertThat(RefNames.isGroupRef("refs/heads/master")).isFalse();
+    assertThat(RefNames.isGroupRef("refs/users/23/1011123")).isFalse();
+  }
+
+  @Test
+  public void parseShardedRefsPart() throws Exception {
+    assertThat(parseShardedRefPart("01/1")).isEqualTo(1);
+    assertThat(parseShardedRefPart("01/1-drafts")).isEqualTo(1);
+    assertThat(parseShardedRefPart("01/1-drafts/2")).isEqualTo(1);
+
+    assertThat(parseShardedRefPart(null)).isNull();
+    assertThat(parseShardedRefPart("")).isNull();
+
+    // Prefix not stripped.
+    assertThat(parseShardedRefPart("refs/users/01/1")).isNull();
+
+    // Invalid characters.
+    assertThat(parseShardedRefPart("01a/1")).isNull();
+    assertThat(parseShardedRefPart("01/a1")).isNull();
+
+    // Mismatched shard.
+    assertThat(parseShardedRefPart("01/23")).isNull();
+
+    // Shard too short.
+    assertThat(parseShardedRefPart("1/1")).isNull();
+  }
+
+  @Test
+  public void parseShardedUuidFromRefsPart() throws Exception {
+    assertThat(parseShardedUuidFromRefPart(TEST_SHARDED_GROUP_UUID)).isEqualTo(TEST_GROUP_UUID);
+    assertThat(parseShardedUuidFromRefPart(TEST_SHARDED_GROUP_UUID + "-2"))
+        .isEqualTo(TEST_GROUP_UUID + "-2");
+    assertThat(parseShardedUuidFromRefPart("7e/7ec4775d")).isEqualTo("7ec4775d");
+    assertThat(parseShardedUuidFromRefPart("fo/foo")).isEqualTo("foo");
+
+    assertThat(parseShardedUuidFromRefPart(null)).isNull();
+    assertThat(parseShardedUuidFromRefPart("")).isNull();
+
+    // Prefix not stripped.
+    assertThat(parseShardedUuidFromRefPart("refs/groups/" + TEST_SHARDED_GROUP_UUID)).isNull();
+
+    // Invalid shards.
+    assertThat(parseShardedUuidFromRefPart("c/" + TEST_GROUP_UUID)).isNull();
+    assertThat(parseShardedUuidFromRefPart("cca/" + TEST_GROUP_UUID)).isNull();
+
+    // Mismatched shard.
+    assertThat(parseShardedUuidFromRefPart("ca/" + TEST_GROUP_UUID)).isNull();
+    assertThat(parseShardedUuidFromRefPart("64/" + TEST_GROUP_UUID)).isNull();
+
+    // Wrong number of segments.
+    assertThat(parseShardedUuidFromRefPart("cc")).isNull();
+    assertThat(parseShardedUuidFromRefPart(TEST_SHARDED_GROUP_UUID + "/1")).isNull();
+  }
+
+  @Test
+  public void skipShardedRefsPart() throws Exception {
+    assertThat(skipShardedRefPart("01/1")).isEqualTo("");
+    assertThat(skipShardedRefPart("01/1/")).isEqualTo("/");
+    assertThat(skipShardedRefPart("01/1/2")).isEqualTo("/2");
+    assertThat(skipShardedRefPart("01/1-edit")).isEqualTo("-edit");
+
+    assertThat(skipShardedRefPart(null)).isNull();
+    assertThat(skipShardedRefPart("")).isNull();
+
+    // Prefix not stripped.
+    assertThat(skipShardedRefPart("refs/draft-comments/01/1/2")).isNull();
+
+    // Invalid characters.
+    assertThat(skipShardedRefPart("01a/1/2")).isNull();
+    assertThat(skipShardedRefPart("01a/a1/2")).isNull();
+
+    // Mismatched shard.
+    assertThat(skipShardedRefPart("01/23/2")).isNull();
+
+    // Shard too short.
+    assertThat(skipShardedRefPart("1/1")).isNull();
+  }
+
+  @Test
+  public void parseAfterShardedRefsPart() throws Exception {
+    assertThat(parseAfterShardedRefPart("01/1/2")).isEqualTo(2);
+    assertThat(parseAfterShardedRefPart("01/1/2/4")).isEqualTo(2);
+    assertThat(parseAfterShardedRefPart("01/1/2-edit")).isEqualTo(2);
+
+    assertThat(parseAfterShardedRefPart(null)).isNull();
+    assertThat(parseAfterShardedRefPart("")).isNull();
+
+    // No ID after sharded ref part
+    assertThat(parseAfterShardedRefPart("01/1")).isNull();
+    assertThat(parseAfterShardedRefPart("01/1/")).isNull();
+    assertThat(parseAfterShardedRefPart("01/1/a")).isNull();
+
+    // Prefix not stripped.
+    assertThat(parseAfterShardedRefPart("refs/draft-comments/01/1/2")).isNull();
+
+    // Invalid characters.
+    assertThat(parseAfterShardedRefPart("01a/1/2")).isNull();
+    assertThat(parseAfterShardedRefPart("01a/a1/2")).isNull();
+
+    // Mismatched shard.
+    assertThat(parseAfterShardedRefPart("01/23/2")).isNull();
+
+    // Shard too short.
+    assertThat(parseAfterShardedRefPart("1/1")).isNull();
+  }
+
+  @Test
+  public void testParseRefSuffix() throws Exception {
+    assertThat(parseRefSuffix("1/2/34")).isEqualTo(34);
+    assertThat(parseRefSuffix("/34")).isEqualTo(34);
+
+    assertThat(parseRefSuffix(null)).isNull();
+    assertThat(parseRefSuffix("")).isNull();
+    assertThat(parseRefSuffix("34")).isNull();
+    assertThat(parseRefSuffix("12/ab")).isNull();
+    assertThat(parseRefSuffix("12/a4")).isNull();
+    assertThat(parseRefSuffix("12/4a")).isNull();
+    assertThat(parseRefSuffix("a4")).isNull();
+    assertThat(parseRefSuffix("4a")).isNull();
+  }
+
+  @Test
+  public void shard() throws Exception {
+    assertThat(RefNames.shard(1011123)).isEqualTo("23/1011123");
+    assertThat(RefNames.shard(537)).isEqualTo("37/537");
+    assertThat(RefNames.shard(12)).isEqualTo("12/12");
+    assertThat(RefNames.shard(0)).isEqualTo("00/0");
+    assertThat(RefNames.shard(1)).isEqualTo("01/1");
+    assertThat(RefNames.shard(-1)).isNull();
+  }
+}
diff --git a/javatests/com/google/gerrit/server/BUILD b/javatests/com/google/gerrit/server/BUILD
new file mode 100644
index 0000000..8b35b6a
--- /dev/null
+++ b/javatests/com/google/gerrit/server/BUILD
@@ -0,0 +1,77 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+CUSTOM_TRUTH_SUBJECTS = glob([
+    "**/*Subject.java",
+])
+
+java_library(
+    name = "custom-truth-subjects",
+    testonly = True,
+    srcs = CUSTOM_TRUTH_SUBJECTS,
+    deps = [
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/truth",
+        "//lib:guava",
+        "//lib/truth",
+    ],
+)
+
+junit_tests(
+    name = "server_tests",
+    size = "large",
+    srcs = glob(
+        ["**/*.java"],
+        exclude = CUSTOM_TRUTH_SUBJECTS,
+    ),
+    resource_strip_prefix = "resources",
+    resources = ["//resources/com/google/gerrit/server"],
+    tags = ["no_windows"],
+    visibility = ["//visibility:public"],
+    runtime_deps = [
+        "//lib/bouncycastle:bcprov",
+        "//prolog:gerrit-prolog-common",
+    ],
+    deps = [
+        ":custom-truth-subjects",
+        "//java/com/google/gerrit/common:annotations",
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/extensions/common/testing:common-test-util",
+        "//java/com/google/gerrit/index",
+        "//java/com/google/gerrit/index:query_exception",
+        "//java/com/google/gerrit/lifecycle",
+        "//java/com/google/gerrit/mail",
+        "//java/com/google/gerrit/metrics",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/server/cache/serialize",
+        "//java/com/google/gerrit/server/cache/testing",
+        "//java/com/google/gerrit/server/group/testing",
+        "//java/com/google/gerrit/server/ioutil",
+        "//java/com/google/gerrit/server/logging",
+        "//java/com/google/gerrit/server/project/testing:project-test-util",
+        "//java/com/google/gerrit/server/restapi",
+        "//java/com/google/gerrit/server/schema",
+        "//java/com/google/gerrit/server/util/time",
+        "//java/com/google/gerrit/testing:gerrit-test-util",
+        "//java/com/google/gerrit/truth",
+        "//java/org/eclipse/jgit:server",
+        "//lib:gson",
+        "//lib:guava",
+        "//lib:guava-retrying",
+        "//lib:gwtorm",
+        "//lib:protobuf",
+        "//lib/auto:auto-value",
+        "//lib/auto:auto-value-annotations",
+        "//lib/commons:codec",
+        "//lib/flogger:api",
+        "//lib/guice",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/jgit/org.eclipse.jgit.junit:junit",
+        "//lib/truth",
+        "//lib/truth:truth-java8-extension",
+        "//lib/truth:truth-proto-extension",
+        "//proto:cache_java_proto",
+    ],
+)
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/ChangeUtilTest.java b/javatests/com/google/gerrit/server/ChangeUtilTest.java
similarity index 100%
rename from gerrit-server/src/test/java/com/google/gerrit/server/ChangeUtilTest.java
rename to javatests/com/google/gerrit/server/ChangeUtilTest.java
diff --git a/javatests/com/google/gerrit/server/IdentifiedUserTest.java b/javatests/com/google/gerrit/server/IdentifiedUserTest.java
new file mode 100644
index 0000000..da6c56d
--- /dev/null
+++ b/javatests/com/google/gerrit/server/IdentifiedUserTest.java
@@ -0,0 +1,126 @@
+// Copyright (C) 2015 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.google.gerrit.server;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.inject.Scopes.SINGLETON;
+
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.FakeRealm;
+import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.account.Realm;
+import com.google.gerrit.server.config.AnonymousCowardName;
+import com.google.gerrit.server.config.AnonymousCowardNameProvider;
+import com.google.gerrit.server.config.CanonicalWebUrl;
+import com.google.gerrit.server.config.DisableReverseDnsLookup;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.gerrit.testing.FakeAccountCache;
+import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.jgit.lib.Config;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(ConfigSuite.class)
+public class IdentifiedUserTest {
+  @ConfigSuite.Parameter public Config config;
+
+  private IdentifiedUser identifiedUser;
+
+  @Inject private IdentifiedUser.GenericFactory identifiedUserFactory;
+
+  private static final String[] TEST_CASES = {
+    "",
+    "FirstName.LastName@Corporation.com",
+    "!#$%&'+-/=.?^`{|}~@[IPv6:0123:4567:89AB:CDEF:0123:4567:89AB:CDEF]",
+  };
+
+  @Before
+  public void setUp() throws Exception {
+    final FakeAccountCache accountCache = new FakeAccountCache();
+    final Realm mockRealm =
+        new FakeRealm() {
+          HashSet<String> emails = new HashSet<>(Arrays.asList(TEST_CASES));
+
+          @Override
+          public boolean hasEmailAddress(IdentifiedUser who, String email) {
+            return emails.contains(email);
+          }
+
+          @Override
+          public Set<String> getEmailAddresses(IdentifiedUser who) {
+            return emails;
+          }
+        };
+
+    AbstractModule mod =
+        new AbstractModule() {
+          @Override
+          protected void configure() {
+            bind(Boolean.class)
+                .annotatedWith(DisableReverseDnsLookup.class)
+                .toInstance(Boolean.FALSE);
+            bind(Config.class).annotatedWith(GerritServerConfig.class).toInstance(config);
+            bind(String.class)
+                .annotatedWith(AnonymousCowardName.class)
+                .toProvider(AnonymousCowardNameProvider.class);
+            bind(String.class)
+                .annotatedWith(CanonicalWebUrl.class)
+                .toInstance("http://localhost:8080/");
+            bind(AccountCache.class).toInstance(accountCache);
+            bind(GroupBackend.class).to(SystemGroupBackend.class).in(SINGLETON);
+            bind(Realm.class).toInstance(mockRealm);
+          }
+        };
+
+    Injector injector = Guice.createInjector(mod);
+    injector.injectMembers(this);
+
+    Account account = new Account(new Account.Id(1), TimeUtil.nowTs());
+    Account.Id ownerId = account.getId();
+
+    identifiedUser = identifiedUserFactory.create(ownerId);
+
+    /* Trigger identifiedUser to load the email addresses from mockRealm */
+    identifiedUser.getEmailAddresses();
+  }
+
+  @Test
+  public void emailsExistence() {
+    assertThat(identifiedUser.hasEmailAddress(TEST_CASES[0])).isTrue();
+    assertThat(identifiedUser.hasEmailAddress(TEST_CASES[1].toLowerCase())).isTrue();
+    assertThat(identifiedUser.hasEmailAddress(TEST_CASES[1])).isTrue();
+    assertThat(identifiedUser.hasEmailAddress(TEST_CASES[1].toUpperCase())).isTrue();
+    /* assert again to test cached email address by IdentifiedUser.validEmails */
+    assertThat(identifiedUser.hasEmailAddress(TEST_CASES[1])).isTrue();
+
+    assertThat(identifiedUser.hasEmailAddress(TEST_CASES[2])).isTrue();
+    assertThat(identifiedUser.hasEmailAddress(TEST_CASES[2].toLowerCase())).isTrue();
+
+    assertThat(identifiedUser.hasEmailAddress("non-exist@email.com")).isFalse();
+    /* assert again to test cached email address by IdentifiedUser.invalidEmails */
+    assertThat(identifiedUser.hasEmailAddress("non-exist@email.com")).isFalse();
+  }
+}
diff --git a/javatests/com/google/gerrit/server/account/AuthorizedKeysTest.java b/javatests/com/google/gerrit/server/account/AuthorizedKeysTest.java
new file mode 100644
index 0000000..80a15a3
--- /dev/null
+++ b/javatests/com/google/gerrit/server/account/AuthorizedKeysTest.java
@@ -0,0 +1,198 @@
+// 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.
+
+package com.google.gerrit.server.account;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.reviewdb.client.Account;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import org.junit.Test;
+
+public class AuthorizedKeysTest {
+  private static final String KEY1 =
+      "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCgug5VyMXQGnem2H1KVC4/HcRcD4zzBqS"
+          + "uJBRWVonSSoz3RoAZ7bWXCVVGwchtXwUURD689wFYdiPecOrWOUgeeyRq754YWRhU+W28"
+          + "vf8IZixgjCmiBhaL2gt3wff6pP+NXJpTSA4aeWE5DfNK5tZlxlSxqkKOS8JRSUeNQov5T"
+          + "w== john.doe@example.com";
+  private static final String KEY1_WITH_NEWLINES =
+      "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCgug5VyMXQGnem2H1KVC4/HcRcD4zzBqS\n"
+          + "uJBRWVonSSoz3RoAZ7bWXCVVGwchtXwUURD689wFYdiPecOrWOUgeeyRq754YWRhU+W28\n"
+          + "vf8IZixgjCmiBhaL2gt3wff6pP+NXJpTSA4aeWE5DfNK5tZlxlSxqkKOS8JRSUeNQov5T\n"
+          + "w== john.doe@example.com";
+  private static final String KEY2 =
+      "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDm5yP7FmEoqzQRDyskX+9+N0q9GrvZeh5"
+          + "RG52EUpE4ms/Ujm3ewV1LoGzc/lYKJAIbdcZQNJ9+06EfWZaIRA3oOwAPe1eCnX+aLr8E"
+          + "6Tw2gDMQOGc5e9HfyXpC2pDvzauoZNYqLALOG3y/1xjo7IH8GYRS2B7zO/Mf9DdCcCKSf"
+          + "w== john.doe@example.com";
+  private static final String KEY3 =
+      "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCaS7RHEcZ/zjl9hkWkqnm29RNr2OQ/TZ5"
+          + "jk2qBVMH3BgzPsTsEs+7ag9tfD8OCj+vOcwm626mQBZoR2e3niHa/9gnHBHFtOrGfzKbp"
+          + "RjTWtiOZbB9HF+rqMVD+Dawo/oicX/dDg7VAgOFSPothe6RMhbgWf84UcK5aQd5eP5y+t"
+          + "Q== john.doe@example.com";
+  private static final String KEY4 =
+      "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDIJzW9BaAeO+upFletwwEBnGS15lJmS5i"
+          + "08/NiFef0jXtNNKcLtnd13bq8jOi5VA2is0bwof1c8YbwcvUkdFa8RL5aXoyZBpfYZsWs"
+          + "/YBLZGiHy5rjooMZQMnH37A50cBPnXr0AQz0WRBxLDBDyOZho+O/DfYAKv4rzPSQ3yw4+"
+          + "w== john.doe@example.com";
+  private static final String KEY5 =
+      "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCgBRKGhiXvY6D9sM+Vbth5Kate57YF7kD"
+          + "rqIyUiYIMJK93/AXc8qR/J/p3OIFQAxvLz1qozAur3j5HaiwvxVU19IiSA0vafdhaDLRi"
+          + "zRuEL5e/QOu9yGq9xkWApCmg6edpWAHG+Bx4AldU78MiZvzoB7gMMdxc9RmZ1gYj/DjxV"
+          + "w== john.doe@example.com";
+
+  private final Account.Id accountId = new Account.Id(1);
+
+  @Test
+  public void test() throws Exception {
+    List<Optional<AccountSshKey>> keys = new ArrayList<>();
+    StringBuilder expected = new StringBuilder();
+    assertSerialization(keys, expected);
+    assertParse(expected, keys);
+
+    expected.append(addKey(keys, KEY1));
+    assertSerialization(keys, expected);
+    assertParse(expected, keys);
+
+    expected.append(addKey(keys, KEY2));
+    assertSerialization(keys, expected);
+    assertParse(expected, keys);
+
+    expected.append(addInvalidKey(keys, KEY3));
+    assertSerialization(keys, expected);
+    assertParse(expected, keys);
+
+    expected.append(addKey(keys, KEY4));
+    assertSerialization(keys, expected);
+    assertParse(expected, keys);
+
+    expected.append(addDeletedKey(keys));
+    assertSerialization(keys, expected);
+    assertParse(expected, keys);
+
+    expected.append(addKey(keys, KEY5));
+    assertSerialization(keys, expected);
+    assertParse(expected, keys);
+  }
+
+  @Test
+  public void parseWindowsLineEndings() throws Exception {
+    List<Optional<AccountSshKey>> keys = new ArrayList<>();
+    StringBuilder authorizedKeys = new StringBuilder();
+    authorizedKeys.append(toWindowsLineEndings(addKey(keys, KEY1)));
+    assertParse(authorizedKeys, keys);
+
+    authorizedKeys.append(toWindowsLineEndings(addKey(keys, KEY2)));
+    assertParse(authorizedKeys, keys);
+
+    authorizedKeys.append(toWindowsLineEndings(addInvalidKey(keys, KEY3)));
+    assertParse(authorizedKeys, keys);
+
+    authorizedKeys.append(toWindowsLineEndings(addKey(keys, KEY4)));
+    assertParse(authorizedKeys, keys);
+
+    authorizedKeys.append(toWindowsLineEndings(addDeletedKey(keys)));
+    assertParse(authorizedKeys, keys);
+
+    authorizedKeys.append(toWindowsLineEndings(addKey(keys, KEY5)));
+    assertParse(authorizedKeys, keys);
+  }
+
+  @Test
+  public void validity() throws Exception {
+    AccountSshKey key = AccountSshKey.create(accountId, -1, KEY1);
+    assertThat(key.valid()).isFalse();
+    key = AccountSshKey.create(accountId, 0, KEY1);
+    assertThat(key.valid()).isFalse();
+    key = AccountSshKey.create(accountId, 1, KEY1);
+    assertThat(key.valid()).isTrue();
+  }
+
+  @Test
+  public void getters() throws Exception {
+    AccountSshKey key = AccountSshKey.create(accountId, 1, KEY1);
+    assertThat(key.sshPublicKey()).isEqualTo(KEY1);
+    assertThat(key.algorithm()).isEqualTo(KEY1.split(" ")[0]);
+    assertThat(key.encodedKey()).isEqualTo(KEY1.split(" ")[1]);
+    assertThat(key.comment()).isEqualTo(KEY1.split(" ")[2]);
+  }
+
+  @Test
+  public void keyWithNewLines() throws Exception {
+    AccountSshKey key = AccountSshKey.create(accountId, 1, KEY1_WITH_NEWLINES);
+    assertThat(key.sshPublicKey()).isEqualTo(KEY1);
+    assertThat(key.algorithm()).isEqualTo(KEY1.split(" ")[0]);
+    assertThat(key.encodedKey()).isEqualTo(KEY1.split(" ")[1]);
+    assertThat(key.comment()).isEqualTo(KEY1.split(" ")[2]);
+  }
+
+  private static String toWindowsLineEndings(String s) {
+    return s.replaceAll("\n", "\r\n");
+  }
+
+  private static void assertSerialization(
+      List<Optional<AccountSshKey>> keys, StringBuilder expected) {
+    assertThat(AuthorizedKeys.serialize(keys)).isEqualTo(expected.toString());
+  }
+
+  private static void assertParse(
+      StringBuilder authorizedKeys, List<Optional<AccountSshKey>> expectedKeys) {
+    Account.Id accountId = new Account.Id(1);
+    List<Optional<AccountSshKey>> parsedKeys =
+        AuthorizedKeys.parse(accountId, authorizedKeys.toString());
+    assertThat(parsedKeys).containsExactlyElementsIn(expectedKeys);
+    int seq = 1;
+    for (Optional<AccountSshKey> sshKey : parsedKeys) {
+      if (sshKey.isPresent()) {
+        assertThat(sshKey.get().accountId()).isEqualTo(accountId);
+        assertThat(sshKey.get().seq()).isEqualTo(seq);
+      }
+      seq++;
+    }
+  }
+
+  /**
+   * Adds the given public key as new SSH key to the given list.
+   *
+   * @return the expected line for this key in the authorized_keys file
+   */
+  private static String addKey(List<Optional<AccountSshKey>> keys, String pub) {
+    AccountSshKey key = AccountSshKey.create(new Account.Id(1), keys.size() + 1, pub);
+    keys.add(Optional.of(key));
+    return key.sshPublicKey() + "\n";
+  }
+
+  /**
+   * Adds the given public key as invalid SSH key to the given list.
+   *
+   * @return the expected line for this key in the authorized_keys file
+   */
+  private static String addInvalidKey(List<Optional<AccountSshKey>> keys, String pub) {
+    AccountSshKey key = AccountSshKey.createInvalid(new Account.Id(1), keys.size() + 1, pub);
+    keys.add(Optional.of(key));
+    return AuthorizedKeys.INVALID_KEY_COMMENT_PREFIX + key.sshPublicKey() + "\n";
+  }
+
+  /**
+   * Adds a deleted SSH key to the given list.
+   *
+   * @return the expected line for this key in the authorized_keys file
+   */
+  private static String addDeletedKey(List<Optional<AccountSshKey>> keys) {
+    keys.add(Optional.empty());
+    return AuthorizedKeys.DELETED_KEY_COMMENT + "\n";
+  }
+}
diff --git a/javatests/com/google/gerrit/server/account/DestinationListTest.java b/javatests/com/google/gerrit/server/account/DestinationListTest.java
new file mode 100644
index 0000000..1f6ed60
--- /dev/null
+++ b/javatests/com/google/gerrit/server/account/DestinationListTest.java
@@ -0,0 +1,163 @@
+// Copyright (C) 2015 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.google.gerrit.server.account;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.easymock.EasyMock.createNiceMock;
+import static org.easymock.EasyMock.replay;
+
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.git.ValidationError;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Set;
+import junit.framework.TestCase;
+import org.junit.Test;
+
+public class DestinationListTest extends TestCase {
+  public static final String R_FOO = "refs/heads/foo";
+  public static final String R_BAR = "refs/heads/bar";
+
+  public static final String P_MY = "myproject";
+  public static final String P_SLASH = "my/project/with/slashes";
+  public static final String P_COMPLEX = " a/project/with spaces and \ttabs ";
+
+  public static final String L_FOO = R_FOO + "\t" + P_MY + "\n";
+  public static final String L_BAR = R_BAR + "\t" + P_SLASH + "\n";
+  public static final String L_FOO_PAD_F = " " + R_FOO + "\t" + P_MY + "\n";
+  public static final String L_FOO_PAD_E = R_FOO + " \t" + P_MY + "\n";
+  public static final String L_COMPLEX = R_FOO + "\t" + P_COMPLEX + "\n";
+  public static final String L_BAD = R_FOO + "\n";
+
+  public static final String HEADER = "# Ref\tProject\n";
+  public static final String HEADER_PROPER = "# Ref         \tProject\n";
+  public static final String C1 = "# A Simple Comment\n";
+  public static final String C2 = "# Comment with a tab\t and multi # # #\n";
+
+  public static final String F_SIMPLE = L_FOO + L_BAR;
+  public static final String F_PROPER = L_BAR + L_FOO; // alpha order
+  public static final String F_PAD_F = L_FOO_PAD_F + L_BAR;
+  public static final String F_PAD_E = L_FOO_PAD_E + L_BAR;
+
+  public static final String LABEL = "label";
+  public static final String LABEL2 = "another";
+
+  public static final Branch.NameKey B_FOO = dest(P_MY, R_FOO);
+  public static final Branch.NameKey B_BAR = dest(P_SLASH, R_BAR);
+  public static final Branch.NameKey B_COMPLEX = dest(P_COMPLEX, R_FOO);
+
+  public static final Set<Branch.NameKey> D_SIMPLE = new HashSet<>();
+
+  static {
+    D_SIMPLE.clear();
+    D_SIMPLE.add(B_FOO);
+    D_SIMPLE.add(B_BAR);
+  }
+
+  private static Branch.NameKey dest(String project, String ref) {
+    return new Branch.NameKey(new Project.NameKey(project), ref);
+  }
+
+  @Test
+  public void testParseSimple() throws Exception {
+    DestinationList dl = new DestinationList();
+    dl.parseLabel(LABEL, F_SIMPLE, null);
+    Set<Branch.NameKey> branches = dl.getDestinations(LABEL);
+    assertThat(branches).containsExactlyElementsIn(D_SIMPLE);
+  }
+
+  @Test
+  public void testParseWHeader() throws Exception {
+    DestinationList dl = new DestinationList();
+    dl.parseLabel(LABEL, HEADER + F_SIMPLE, null);
+    Set<Branch.NameKey> branches = dl.getDestinations(LABEL);
+    assertThat(branches).containsExactlyElementsIn(D_SIMPLE);
+  }
+
+  @Test
+  public void testParseWComments() throws Exception {
+    DestinationList dl = new DestinationList();
+    dl.parseLabel(LABEL, C1 + F_SIMPLE + C2, null);
+    Set<Branch.NameKey> branches = dl.getDestinations(LABEL);
+    assertThat(branches).containsExactlyElementsIn(D_SIMPLE);
+  }
+
+  @Test
+  public void testParseFooComment() throws Exception {
+    DestinationList dl = new DestinationList();
+    dl.parseLabel(LABEL, "#" + L_FOO + L_BAR, null);
+    Set<Branch.NameKey> branches = dl.getDestinations(LABEL);
+    assertThat(branches).doesNotContain(B_FOO);
+    assertThat(branches).contains(B_BAR);
+  }
+
+  @Test
+  public void testParsePaddedFronts() throws Exception {
+    DestinationList dl = new DestinationList();
+    dl.parseLabel(LABEL, F_PAD_F, null);
+    Set<Branch.NameKey> branches = dl.getDestinations(LABEL);
+    assertThat(branches).containsExactlyElementsIn(D_SIMPLE);
+  }
+
+  @Test
+  public void testParsePaddedEnds() throws Exception {
+    DestinationList dl = new DestinationList();
+    dl.parseLabel(LABEL, F_PAD_E, null);
+    Set<Branch.NameKey> branches = dl.getDestinations(LABEL);
+    assertThat(branches).containsExactlyElementsIn(D_SIMPLE);
+  }
+
+  @Test
+  public void testParseComplex() throws Exception {
+    DestinationList dl = new DestinationList();
+    dl.parseLabel(LABEL, L_COMPLEX, null);
+    Set<Branch.NameKey> branches = dl.getDestinations(LABEL);
+    assertThat(branches).contains(B_COMPLEX);
+  }
+
+  @Test(expected = IOException.class)
+  public void testParseBad() throws IOException {
+    ValidationError.Sink sink = createNiceMock(ValidationError.Sink.class);
+    replay(sink);
+    new DestinationList().parseLabel(LABEL, L_BAD, sink);
+  }
+
+  @Test
+  public void testParse2Labels() throws Exception {
+    DestinationList dl = new DestinationList();
+    dl.parseLabel(LABEL, F_SIMPLE, null);
+    Set<Branch.NameKey> branches = dl.getDestinations(LABEL);
+    assertThat(branches).containsExactlyElementsIn(D_SIMPLE);
+
+    dl.parseLabel(LABEL2, L_COMPLEX, null);
+    branches = dl.getDestinations(LABEL);
+    assertThat(branches).containsExactlyElementsIn(D_SIMPLE);
+    branches = dl.getDestinations(LABEL2);
+    assertThat(branches).contains(B_COMPLEX);
+  }
+
+  @Test
+  public void testAsText() throws Exception {
+    String text = HEADER_PROPER + "#\n" + F_PROPER;
+    DestinationList dl = new DestinationList();
+    dl.parseLabel(LABEL, F_SIMPLE, null);
+    String asText = dl.asText(LABEL);
+    assertThat(text).isEqualTo(asText);
+
+    dl.parseLabel(LABEL2, asText, null);
+    assertThat(text).isEqualTo(dl.asText(LABEL2));
+  }
+}
diff --git a/javatests/com/google/gerrit/server/account/GroupUUIDTest.java b/javatests/com/google/gerrit/server/account/GroupUUIDTest.java
new file mode 100644
index 0000000..3b72b08
--- /dev/null
+++ b/javatests/com/google/gerrit/server/account/GroupUUIDTest.java
@@ -0,0 +1,32 @@
+// Copyright (C) 2017 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.google.gerrit.server.account;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.junit.Test;
+
+public class GroupUUIDTest {
+  @Test
+  public void createdUuidsForSameInputShouldBeDifferent() {
+    String groupName = "Users";
+    PersonIdent personIdent = new PersonIdent("John", "john@example.com");
+    AccountGroup.UUID uuid1 = GroupUUID.make(groupName, personIdent);
+    AccountGroup.UUID uuid2 = GroupUUID.make(groupName, personIdent);
+    assertThat(uuid2).isNotEqualTo(uuid1);
+  }
+}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/account/HashedPasswordTest.java b/javatests/com/google/gerrit/server/account/HashedPasswordTest.java
similarity index 100%
rename from gerrit-server/src/test/java/com/google/gerrit/server/account/HashedPasswordTest.java
rename to javatests/com/google/gerrit/server/account/HashedPasswordTest.java
diff --git a/javatests/com/google/gerrit/server/account/QueryListTest.java b/javatests/com/google/gerrit/server/account/QueryListTest.java
new file mode 100644
index 0000000..2792de8
--- /dev/null
+++ b/javatests/com/google/gerrit/server/account/QueryListTest.java
@@ -0,0 +1,120 @@
+// Copyright (C) 2015 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.google.gerrit.server.account;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.easymock.EasyMock.createNiceMock;
+import static org.easymock.EasyMock.replay;
+
+import com.google.gerrit.server.git.ValidationError;
+import java.io.IOException;
+import junit.framework.TestCase;
+import org.junit.Test;
+
+public class QueryListTest extends TestCase {
+  public static final String Q_P = "project:foo";
+  public static final String Q_B = "branch:bar";
+  public static final String Q_COMPLEX = "branch:bar AND peers:'is:open\t'";
+
+  public static final String N_FOO = "foo";
+  public static final String N_BAR = "bar";
+
+  public static final String L_FOO = N_FOO + "\t" + Q_P + "\n";
+  public static final String L_BAR = N_BAR + "\t" + Q_B + "\n";
+  public static final String L_FOO_PROP = N_FOO + "   \t" + Q_P + "\n";
+  public static final String L_BAR_PROP = N_BAR + "   \t" + Q_B + "\n";
+  public static final String L_FOO_PAD_F = " " + N_FOO + "\t" + Q_P + "\n";
+  public static final String L_FOO_PAD_E = N_FOO + " \t" + Q_P + "\n";
+  public static final String L_BAR_PAD_F = N_BAR + "\t " + Q_B + "\n";
+  public static final String L_BAR_PAD_E = N_BAR + "\t" + Q_B + " \n";
+  public static final String L_COMPLEX = N_FOO + "\t" + Q_COMPLEX + "\t \n";
+  public static final String L_BAD = N_FOO + "\n";
+
+  public static final String HEADER = "# Name\tQuery\n";
+  public static final String C1 = "# A Simple Comment\n";
+  public static final String C2 = "# Comment with a tab\t and multi # # #\n";
+
+  public static final String F_SIMPLE = L_FOO + L_BAR;
+  public static final String F_PROPER = L_BAR_PROP + L_FOO_PROP; // alpha order
+  public static final String F_PAD_F = L_FOO_PAD_F + L_BAR_PAD_F;
+  public static final String F_PAD_E = L_FOO_PAD_E + L_BAR_PAD_E;
+
+  @Test
+  public void testParseSimple() throws Exception {
+    QueryList ql = QueryList.parse(F_SIMPLE, null);
+    assertThat(ql.getQuery(N_FOO)).isEqualTo(Q_P);
+    assertThat(ql.getQuery(N_BAR)).isEqualTo(Q_B);
+  }
+
+  @Test
+  public void testParseWHeader() throws Exception {
+    QueryList ql = QueryList.parse(HEADER + F_SIMPLE, null);
+    assertThat(ql.getQuery(N_FOO)).isEqualTo(Q_P);
+    assertThat(ql.getQuery(N_BAR)).isEqualTo(Q_B);
+  }
+
+  @Test
+  public void testParseWComments() throws Exception {
+    QueryList ql = QueryList.parse(C1 + F_SIMPLE + C2, null);
+    assertThat(ql.getQuery(N_FOO)).isEqualTo(Q_P);
+    assertThat(ql.getQuery(N_BAR)).isEqualTo(Q_B);
+  }
+
+  @Test
+  public void testParseFooComment() throws Exception {
+    QueryList ql = QueryList.parse("#" + L_FOO + L_BAR, null);
+    assertThat(ql.getQuery(N_FOO)).isNull();
+    assertThat(ql.getQuery(N_BAR)).isEqualTo(Q_B);
+  }
+
+  @Test
+  public void testParsePaddedFronts() throws Exception {
+    QueryList ql = QueryList.parse(F_PAD_F, null);
+    assertThat(ql.getQuery(N_FOO)).isEqualTo(Q_P);
+    assertThat(ql.getQuery(N_BAR)).isEqualTo(Q_B);
+  }
+
+  @Test
+  public void testParsePaddedEnds() throws Exception {
+    QueryList ql = QueryList.parse(F_PAD_E, null);
+    assertThat(ql.getQuery(N_FOO)).isEqualTo(Q_P);
+    assertThat(ql.getQuery(N_BAR)).isEqualTo(Q_B);
+  }
+
+  @Test
+  public void testParseComplex() throws Exception {
+    QueryList ql = QueryList.parse(L_COMPLEX, null);
+    assertThat(ql.getQuery(N_FOO)).isEqualTo(Q_COMPLEX);
+  }
+
+  @Test(expected = IOException.class)
+  public void testParseBad() throws Exception {
+    ValidationError.Sink sink = createNiceMock(ValidationError.Sink.class);
+    replay(sink);
+    QueryList.parse(L_BAD, sink);
+  }
+
+  @Test
+  public void testAsText() throws Exception {
+    String expectedText = HEADER + "#\n" + F_PROPER;
+    QueryList ql = QueryList.parse(F_SIMPLE, null);
+    String asText = ql.asText();
+    assertThat(asText).isEqualTo(expectedText);
+
+    ql = QueryList.parse(asText, null);
+    asText = ql.asText();
+    assertThat(asText).isEqualTo(expectedText);
+  }
+}
diff --git a/javatests/com/google/gerrit/server/account/UniversalGroupBackendTest.java b/javatests/com/google/gerrit/server/account/UniversalGroupBackendTest.java
new file mode 100644
index 0000000..f69bafa
--- /dev/null
+++ b/javatests/com/google/gerrit/server/account/UniversalGroupBackendTest.java
@@ -0,0 +1,144 @@
+// Copyright (C) 2014 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.google.gerrit.server.account;
+
+import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
+import static com.google.gerrit.server.group.SystemGroupBackend.PROJECT_OWNERS;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static org.easymock.EasyMock.anyObject;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.createNiceMock;
+import static org.easymock.EasyMock.eq;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.getCurrentArguments;
+import static org.easymock.EasyMock.not;
+import static org.easymock.EasyMock.replay;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.AccountGroup.UUID;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gerrit.server.plugincontext.PluginContext.PluginMetrics;
+import com.google.gerrit.server.plugincontext.PluginSetContext;
+import com.google.gerrit.testing.GerritBaseTests;
+import java.util.Set;
+import org.easymock.IAnswer;
+import org.eclipse.jgit.lib.Config;
+import org.junit.Before;
+import org.junit.Test;
+
+public class UniversalGroupBackendTest extends GerritBaseTests {
+  private static final AccountGroup.UUID OTHER_UUID = new AccountGroup.UUID("other");
+
+  private UniversalGroupBackend backend;
+  private IdentifiedUser user;
+
+  private DynamicSet<GroupBackend> backends;
+
+  @Before
+  public void setup() {
+    user = createNiceMock(IdentifiedUser.class);
+    replay(user);
+    backends = new DynamicSet<>();
+    backends.add("gerrit", new SystemGroupBackend(new Config()));
+    backend =
+        new UniversalGroupBackend(
+            new PluginSetContext<>(backends, PluginMetrics.DISABLED_INSTANCE));
+  }
+
+  @Test
+  public void handles() {
+    assertTrue(backend.handles(ANONYMOUS_USERS));
+    assertTrue(backend.handles(PROJECT_OWNERS));
+    assertFalse(backend.handles(OTHER_UUID));
+  }
+
+  @Test
+  public void get() {
+    assertEquals("Registered Users", backend.get(REGISTERED_USERS).getName());
+    assertEquals("Project Owners", backend.get(PROJECT_OWNERS).getName());
+    assertNull(backend.get(OTHER_UUID));
+  }
+
+  @Test
+  public void suggest() {
+    assertTrue(backend.suggest("X", null).isEmpty());
+    assertEquals(1, backend.suggest("project", null).size());
+    assertEquals(1, backend.suggest("reg", null).size());
+  }
+
+  @Test
+  public void sytemGroupMemberships() {
+    GroupMembership checker = backend.membershipsOf(user);
+    assertTrue(checker.contains(REGISTERED_USERS));
+    assertFalse(checker.contains(OTHER_UUID));
+    assertFalse(checker.contains(PROJECT_OWNERS));
+  }
+
+  @Test
+  public void knownGroups() {
+    GroupMembership checker = backend.membershipsOf(user);
+    Set<UUID> knownGroups = checker.getKnownGroups();
+    assertEquals(2, knownGroups.size());
+    assertTrue(knownGroups.contains(REGISTERED_USERS));
+    assertTrue(knownGroups.contains(ANONYMOUS_USERS));
+  }
+
+  @Test
+  public void otherMemberships() {
+    final AccountGroup.UUID handled = new AccountGroup.UUID("handled");
+    final AccountGroup.UUID notHandled = new AccountGroup.UUID("not handled");
+    final IdentifiedUser member = createNiceMock(IdentifiedUser.class);
+    final IdentifiedUser notMember = createNiceMock(IdentifiedUser.class);
+
+    GroupBackend backend = createMock(GroupBackend.class);
+    expect(backend.handles(handled)).andStubReturn(true);
+    expect(backend.handles(not(eq(handled)))).andStubReturn(false);
+    expect(backend.membershipsOf(anyObject(IdentifiedUser.class)))
+        .andStubAnswer(
+            new IAnswer<GroupMembership>() {
+              @Override
+              public GroupMembership answer() throws Throwable {
+                Object[] args = getCurrentArguments();
+                GroupMembership membership = createMock(GroupMembership.class);
+                expect(membership.contains(eq(handled))).andStubReturn(args[0] == member);
+                expect(membership.contains(not(eq(notHandled)))).andStubReturn(false);
+                replay(membership);
+                return membership;
+              }
+            });
+    replay(member, notMember, backend);
+
+    backends = new DynamicSet<>();
+    backends.add("gerrit", backend);
+    backend =
+        new UniversalGroupBackend(
+            new PluginSetContext<>(backends, PluginMetrics.DISABLED_INSTANCE));
+
+    GroupMembership checker = backend.membershipsOf(member);
+    assertFalse(checker.contains(REGISTERED_USERS));
+    assertFalse(checker.contains(OTHER_UUID));
+    assertTrue(checker.contains(handled));
+    assertFalse(checker.contains(notHandled));
+    checker = backend.membershipsOf(notMember);
+    assertFalse(checker.contains(handled));
+    assertFalse(checker.contains(notHandled));
+  }
+}
diff --git a/javatests/com/google/gerrit/server/account/WatchConfigTest.java b/javatests/com/google/gerrit/server/account/WatchConfigTest.java
new file mode 100644
index 0000000..2ac7be7
--- /dev/null
+++ b/javatests/com/google/gerrit/server/account/WatchConfigTest.java
@@ -0,0 +1,187 @@
+// 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.
+
+package com.google.gerrit.server.account;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gerrit.server.account.ProjectWatches.NotifyValue;
+import com.google.gerrit.server.account.ProjectWatches.ProjectWatchKey;
+import com.google.gerrit.server.git.ValidationError;
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.eclipse.jgit.lib.Config;
+import org.junit.Before;
+import org.junit.Test;
+
+public class WatchConfigTest implements ValidationError.Sink {
+  private List<ValidationError> validationErrors = new ArrayList<>();
+
+  @Before
+  public void setup() {
+    validationErrors.clear();
+  }
+
+  @Test
+  public void parseWatchConfig() throws Exception {
+    Config cfg = new Config();
+    cfg.fromText(
+        "[project \"myProject\"]\n"
+            + "  notify = * [ALL_COMMENTS, NEW_PATCHSETS]\n"
+            + "  notify = branch:master [NEW_CHANGES]\n"
+            + "  notify = branch:master [NEW_PATCHSETS]\n"
+            + "  notify = branch:foo []\n"
+            + "[project \"otherProject\"]\n"
+            + "  notify = [NEW_PATCHSETS]\n"
+            + "  notify = * [NEW_PATCHSETS, ALL_COMMENTS]\n");
+    Map<ProjectWatchKey, ImmutableSet<NotifyType>> projectWatches =
+        ProjectWatches.parse(new Account.Id(1000000), cfg, this);
+
+    assertThat(validationErrors).isEmpty();
+
+    Project.NameKey myProject = new Project.NameKey("myProject");
+    Project.NameKey otherProject = new Project.NameKey("otherProject");
+    Map<ProjectWatchKey, Set<NotifyType>> expectedProjectWatches = new HashMap<>();
+    expectedProjectWatches.put(
+        ProjectWatchKey.create(myProject, null),
+        EnumSet.of(NotifyType.ALL_COMMENTS, NotifyType.NEW_PATCHSETS));
+    expectedProjectWatches.put(
+        ProjectWatchKey.create(myProject, "branch:master"),
+        EnumSet.of(NotifyType.NEW_CHANGES, NotifyType.NEW_PATCHSETS));
+    expectedProjectWatches.put(
+        ProjectWatchKey.create(myProject, "branch:foo"), EnumSet.noneOf(NotifyType.class));
+    expectedProjectWatches.put(
+        ProjectWatchKey.create(otherProject, null), EnumSet.of(NotifyType.NEW_PATCHSETS));
+    expectedProjectWatches.put(
+        ProjectWatchKey.create(otherProject, null),
+        EnumSet.of(NotifyType.ALL_COMMENTS, NotifyType.NEW_PATCHSETS));
+    assertThat(projectWatches).containsExactlyEntriesIn(expectedProjectWatches);
+  }
+
+  @Test
+  public void parseInvalidWatchConfig() throws Exception {
+    Config cfg = new Config();
+    cfg.fromText(
+        "[project \"myProject\"]\n"
+            + "  notify = * [ALL_COMMENTS, NEW_PATCHSETS]\n"
+            + "  notify = branch:master [INVALID, NEW_CHANGES]\n"
+            + "[project \"otherProject\"]\n"
+            + "  notify = [NEW_PATCHSETS]\n");
+
+    ProjectWatches.parse(new Account.Id(1000000), cfg, this);
+    assertThat(validationErrors).hasSize(1);
+    assertThat(validationErrors.get(0).getMessage())
+        .isEqualTo(
+            "watch.config: Invalid notify type INVALID in project watch of"
+                + " account 1000000 for project myProject: branch:master"
+                + " [INVALID, NEW_CHANGES]");
+  }
+
+  @Test
+  public void parseNotifyValue() throws Exception {
+    assertParseNotifyValue("* []", null, EnumSet.noneOf(NotifyType.class));
+    assertParseNotifyValue("* [ALL_COMMENTS]", null, EnumSet.of(NotifyType.ALL_COMMENTS));
+    assertParseNotifyValue("[]", null, EnumSet.noneOf(NotifyType.class));
+    assertParseNotifyValue(
+        "[ALL_COMMENTS, NEW_PATCHSETS]",
+        null,
+        EnumSet.of(NotifyType.ALL_COMMENTS, NotifyType.NEW_PATCHSETS));
+    assertParseNotifyValue("branch:master []", "branch:master", EnumSet.noneOf(NotifyType.class));
+    assertParseNotifyValue(
+        "branch:master || branch:stable []",
+        "branch:master || branch:stable",
+        EnumSet.noneOf(NotifyType.class));
+    assertParseNotifyValue(
+        "branch:master [ALL_COMMENTS]", "branch:master", EnumSet.of(NotifyType.ALL_COMMENTS));
+    assertParseNotifyValue(
+        "branch:master [ALL_COMMENTS, NEW_PATCHSETS]",
+        "branch:master",
+        EnumSet.of(NotifyType.ALL_COMMENTS, NotifyType.NEW_PATCHSETS));
+    assertParseNotifyValue("* [ALL]", null, EnumSet.of(NotifyType.ALL));
+
+    assertThat(validationErrors).isEmpty();
+  }
+
+  @Test
+  public void parseInvalidNotifyValue() {
+    assertParseNotifyValueFails("* [] illegal-characters-at-the-end");
+    assertParseNotifyValueFails("* [INVALID]");
+    assertParseNotifyValueFails("* [ALL_COMMENTS, UNKNOWN]");
+    assertParseNotifyValueFails("* [ALL_COMMENTS NEW_CHANGES]");
+    assertParseNotifyValueFails("* [ALL_COMMENTS, NEW_CHANGES");
+    assertParseNotifyValueFails("* ALL_COMMENTS, NEW_CHANGES]");
+  }
+
+  @Test
+  public void toNotifyValue() throws Exception {
+    assertToNotifyValue(null, EnumSet.noneOf(NotifyType.class), "* []");
+    assertToNotifyValue("*", EnumSet.noneOf(NotifyType.class), "* []");
+    assertToNotifyValue(null, EnumSet.of(NotifyType.ALL_COMMENTS), "* [ALL_COMMENTS]");
+    assertToNotifyValue("branch:master", EnumSet.noneOf(NotifyType.class), "branch:master []");
+    assertToNotifyValue(
+        "branch:master",
+        EnumSet.of(NotifyType.ALL_COMMENTS, NotifyType.NEW_PATCHSETS),
+        "branch:master [ALL_COMMENTS, NEW_PATCHSETS]");
+    assertToNotifyValue(
+        "branch:master",
+        EnumSet.of(
+            NotifyType.ABANDONED_CHANGES,
+            NotifyType.ALL_COMMENTS,
+            NotifyType.NEW_CHANGES,
+            NotifyType.NEW_PATCHSETS,
+            NotifyType.SUBMITTED_CHANGES),
+        "branch:master [ABANDONED_CHANGES, ALL_COMMENTS, NEW_CHANGES,"
+            + " NEW_PATCHSETS, SUBMITTED_CHANGES]");
+    assertToNotifyValue("*", EnumSet.of(NotifyType.ALL), "* [ALL]");
+  }
+
+  private void assertParseNotifyValue(
+      String notifyValue, String expectedFilter, Set<NotifyType> expectedNotifyTypes) {
+    NotifyValue nv = parseNotifyValue(notifyValue);
+    assertThat(nv.filter()).isEqualTo(expectedFilter);
+    assertThat(nv.notifyTypes()).containsExactlyElementsIn(expectedNotifyTypes);
+  }
+
+  private static void assertToNotifyValue(
+      String filter, Set<NotifyType> notifyTypes, String expectedNotifyValue) {
+    NotifyValue nv = NotifyValue.create(filter, notifyTypes);
+    assertThat(nv.toString()).isEqualTo(expectedNotifyValue);
+  }
+
+  private void assertParseNotifyValueFails(String notifyValue) {
+    assertThat(validationErrors).isEmpty();
+    parseNotifyValue(notifyValue);
+    assertThat(validationErrors)
+        .named("expected validation error for notifyValue: " + notifyValue)
+        .isNotEmpty();
+    validationErrors.clear();
+  }
+
+  private NotifyValue parseNotifyValue(String notifyValue) {
+    return NotifyValue.parse(new Account.Id(1000000), "project", notifyValue, this);
+  }
+
+  @Override
+  public void error(ValidationError error) {
+    validationErrors.add(error);
+  }
+}
diff --git a/javatests/com/google/gerrit/server/account/externalids/AllExternalIdsTest.java b/javatests/com/google/gerrit/server/account/externalids/AllExternalIdsTest.java
new file mode 100644
index 0000000..f29ff1f
--- /dev/null
+++ b/javatests/com/google/gerrit/server/account/externalids/AllExternalIdsTest.java
@@ -0,0 +1,143 @@
+// 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.
+
+package com.google.gerrit.server.account.externalids;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.extensions.proto.ProtoTruth.assertThat;
+import static com.google.gerrit.server.cache.testing.CacheSerializerTestUtil.byteString;
+import static com.google.gerrit.server.cache.testing.SerializedClassSubject.assertThatSerializedClass;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSetMultimap;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.account.externalids.AllExternalIds.Serializer;
+import com.google.gerrit.server.cache.proto.Cache.AllExternalIdsProto;
+import com.google.gerrit.server.cache.proto.Cache.AllExternalIdsProto.ExternalIdProto;
+import com.google.inject.TypeLiteral;
+import java.util.Arrays;
+import org.eclipse.jgit.lib.ObjectId;
+import org.junit.Test;
+
+public class AllExternalIdsTest {
+  @Test
+  public void serializeEmptyExternalIds() throws Exception {
+    assertRoundTrip(allExternalIds(), AllExternalIdsProto.getDefaultInstance());
+  }
+
+  @Test
+  public void serializeMultipleExternalIds() throws Exception {
+    Account.Id accountId1 = new Account.Id(1001);
+    Account.Id accountId2 = new Account.Id(1002);
+    assertRoundTrip(
+        allExternalIds(
+            ExternalId.create("scheme1", "id1", accountId1),
+            ExternalId.create("scheme2", "id2", accountId1),
+            ExternalId.create("scheme2", "id3", accountId2),
+            ExternalId.create("scheme3", "id4", accountId2)),
+        AllExternalIdsProto.newBuilder()
+            .addExternalId(
+                ExternalIdProto.newBuilder().setKey("scheme1:id1").setAccountId(1001).build())
+            .addExternalId(
+                ExternalIdProto.newBuilder().setKey("scheme2:id2").setAccountId(1001).build())
+            .addExternalId(
+                ExternalIdProto.newBuilder().setKey("scheme2:id3").setAccountId(1002).build())
+            .addExternalId(
+                ExternalIdProto.newBuilder().setKey("scheme3:id4").setAccountId(1002).build())
+            .build());
+  }
+
+  @Test
+  public void serializeExternalIdWithEmail() throws Exception {
+    assertRoundTrip(
+        allExternalIds(ExternalId.createEmail(new Account.Id(1001), "foo@example.com")),
+        AllExternalIdsProto.newBuilder()
+            .addExternalId(
+                ExternalIdProto.newBuilder()
+                    .setKey("mailto:foo@example.com")
+                    .setAccountId(1001)
+                    .setEmail("foo@example.com"))
+            .build());
+  }
+
+  @Test
+  public void serializeExternalIdWithPassword() throws Exception {
+    assertRoundTrip(
+        allExternalIds(
+            ExternalId.create("scheme", "id", new Account.Id(1001), null, "hashed password")),
+        AllExternalIdsProto.newBuilder()
+            .addExternalId(
+                ExternalIdProto.newBuilder()
+                    .setKey("scheme:id")
+                    .setAccountId(1001)
+                    .setPassword("hashed password"))
+            .build());
+  }
+
+  @Test
+  public void serializeExternalIdWithBlobId() throws Exception {
+    assertRoundTrip(
+        allExternalIds(
+            ExternalId.create(
+                ExternalId.create("scheme", "id", new Account.Id(1001)),
+                ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"))),
+        AllExternalIdsProto.newBuilder()
+            .addExternalId(
+                ExternalIdProto.newBuilder()
+                    .setKey("scheme:id")
+                    .setAccountId(1001)
+                    .setBlobId(
+                        byteString(
+                            0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef,
+                            0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef)))
+            .build());
+  }
+
+  @Test
+  public void allExternalIdsMethods() {
+    assertThatSerializedClass(AllExternalIds.class)
+        .hasAutoValueMethods(
+            ImmutableMap.of(
+                "byAccount",
+                    new TypeLiteral<ImmutableSetMultimap<Account.Id, ExternalId>>() {}.getType(),
+                "byEmail",
+                    new TypeLiteral<ImmutableSetMultimap<String, ExternalId>>() {}.getType()));
+  }
+
+  @Test
+  public void externalIdMethods() {
+    assertThatSerializedClass(ExternalId.class)
+        .hasAutoValueMethods(
+            ImmutableMap.of(
+                "key", ExternalId.Key.class,
+                "accountId", Account.Id.class,
+                "email", String.class,
+                "password", String.class,
+                "blobId", ObjectId.class));
+  }
+
+  private static AllExternalIds allExternalIds(ExternalId... externalIds) {
+    return AllExternalIds.create(Arrays.asList(externalIds));
+  }
+
+  private static void assertRoundTrip(
+      AllExternalIds allExternalIds, AllExternalIdsProto expectedProto) throws Exception {
+    AllExternalIdsProto actualProto =
+        AllExternalIdsProto.parseFrom(Serializer.INSTANCE.serialize(allExternalIds));
+    assertThat(actualProto).ignoringRepeatedFieldOrder().isEqualTo(expectedProto);
+    AllExternalIds actual =
+        Serializer.INSTANCE.deserialize(Serializer.INSTANCE.serialize(allExternalIds));
+    assertThat(actual).isEqualTo(allExternalIds);
+  }
+}
diff --git a/javatests/com/google/gerrit/server/auth/oauth/OAuthTokenCacheTest.java b/javatests/com/google/gerrit/server/auth/oauth/OAuthTokenCacheTest.java
new file mode 100644
index 0000000..81fd6d7
--- /dev/null
+++ b/javatests/com/google/gerrit/server/auth/oauth/OAuthTokenCacheTest.java
@@ -0,0 +1,75 @@
+package com.google.gerrit.server.auth.oauth;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.extensions.proto.ProtoTruth.assertThat;
+import static com.google.gerrit.server.cache.testing.SerializedClassSubject.assertThatSerializedClass;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.gerrit.extensions.auth.oauth.OAuthToken;
+import com.google.gerrit.server.cache.proto.Cache.OAuthTokenProto;
+import com.google.gerrit.server.cache.serialize.CacheSerializer;
+import java.lang.reflect.Type;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public final class OAuthTokenCacheTest {
+  @Test
+  public void oAuthTokenSerializer() throws Exception {
+    OAuthToken token = new OAuthToken("token", "secret", "raw", 12345L, "provider");
+    CacheSerializer<OAuthToken> s = new OAuthTokenCache.Serializer();
+    byte[] serialized = s.serialize(token);
+    assertThat(OAuthTokenProto.parseFrom(serialized))
+        .isEqualTo(
+            OAuthTokenProto.newBuilder()
+                .setToken("token")
+                .setSecret("secret")
+                .setRaw("raw")
+                .setExpiresAt(12345L)
+                .setProviderId("provider")
+                .build());
+    assertThat(s.deserialize(serialized)).isEqualTo(token);
+  }
+
+  @Test
+  public void oAuthTokenSerializerWithNullProvider() throws Exception {
+    OAuthToken tokenWithNull = new OAuthToken("token", "secret", "raw", 12345L, null);
+    CacheSerializer<OAuthToken> s = new OAuthTokenCache.Serializer();
+    OAuthTokenProto expectedProto =
+        OAuthTokenProto.newBuilder()
+            .setToken("token")
+            .setSecret("secret")
+            .setRaw("raw")
+            .setExpiresAt(12345L)
+            .setProviderId("")
+            .build();
+
+    byte[] serializedWithNull = s.serialize(tokenWithNull);
+    assertThat(OAuthTokenProto.parseFrom(serializedWithNull)).isEqualTo(expectedProto);
+    assertThat(s.deserialize(serializedWithNull)).isEqualTo(tokenWithNull);
+
+    OAuthToken tokenWithEmptyString = new OAuthToken("token", "secret", "raw", 12345L, "");
+    assertThat(tokenWithEmptyString).isEqualTo(tokenWithNull);
+    byte[] serializedWithEmptyString = s.serialize(tokenWithEmptyString);
+    assertThat(OAuthTokenProto.parseFrom(serializedWithEmptyString)).isEqualTo(expectedProto);
+    assertThat(s.deserialize(serializedWithEmptyString)).isEqualTo(tokenWithNull);
+  }
+
+  /**
+   * See {@link com.google.gerrit.server.cache.testing.SerializedClassSubject} for background and
+   * what to do if this test fails.
+   */
+  @Test
+  public void oAuthTokenFields() throws Exception {
+    assertThatSerializedClass(OAuthToken.class)
+        .hasFields(
+            ImmutableMap.<String, Type>builder()
+                .put("token", String.class)
+                .put("secret", String.class)
+                .put("raw", String.class)
+                .put("expiresAt", long.class)
+                .put("providerId", String.class)
+                .build());
+  }
+}
diff --git a/javatests/com/google/gerrit/server/cache/BUILD b/javatests/com/google/gerrit/server/cache/BUILD
new file mode 100644
index 0000000..4950266
--- /dev/null
+++ b/javatests/com/google/gerrit/server/cache/BUILD
@@ -0,0 +1,11 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+junit_tests(
+    name = "tests",
+    srcs = glob(["*.java"]),
+    deps = [
+        "//java/com/google/gerrit/server",
+        "//lib:junit",
+        "//lib/truth",
+    ],
+)
diff --git a/javatests/com/google/gerrit/server/cache/PerThreadCacheTest.java b/javatests/com/google/gerrit/server/cache/PerThreadCacheTest.java
new file mode 100644
index 0000000..cfb5f3f
--- /dev/null
+++ b/javatests/com/google/gerrit/server/cache/PerThreadCacheTest.java
@@ -0,0 +1,102 @@
+// 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.
+
+package com.google.gerrit.server.cache;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import java.util.function.Supplier;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+public class PerThreadCacheTest {
+  @Rule public ExpectedException exception = ExpectedException.none();
+
+  @Test
+  public void key_respectsClass() {
+    assertThat(PerThreadCache.Key.create(String.class))
+        .isEqualTo(PerThreadCache.Key.create(String.class));
+    assertThat(PerThreadCache.Key.create(String.class))
+        .isNotEqualTo(PerThreadCache.Key.create(Integer.class));
+  }
+
+  @Test
+  public void key_respectsIdentifiers() {
+    assertThat(PerThreadCache.Key.create(String.class, "id1"))
+        .isEqualTo(PerThreadCache.Key.create(String.class, "id1"));
+    assertThat(PerThreadCache.Key.create(String.class, "id1"))
+        .isNotEqualTo(PerThreadCache.Key.create(String.class, "id2"));
+  }
+
+  @Test
+  public void endToEndCache() {
+    try (PerThreadCache ignored = PerThreadCache.create()) {
+      PerThreadCache cache = PerThreadCache.get();
+      PerThreadCache.Key<String> key1 = PerThreadCache.Key.create(String.class);
+
+      String value1 = cache.get(key1, () -> "value1");
+      assertThat(value1).isEqualTo("value1");
+
+      Supplier<String> neverCalled =
+          () -> {
+            throw new IllegalStateException("this method must not be called");
+          };
+      assertThat(cache.get(key1, neverCalled)).isEqualTo("value1");
+    }
+  }
+
+  @Test
+  public void cleanUp() {
+    PerThreadCache.Key<String> key = PerThreadCache.Key.create(String.class);
+    try (PerThreadCache ignored = PerThreadCache.create()) {
+      PerThreadCache cache = PerThreadCache.get();
+      String value1 = cache.get(key, () -> "value1");
+      assertThat(value1).isEqualTo("value1");
+    }
+
+    // Create a second cache and assert that it is not connected to the first one.
+    // This ensures that the cleanup is actually working.
+    try (PerThreadCache ignored = PerThreadCache.create()) {
+      PerThreadCache cache = PerThreadCache.get();
+      String value1 = cache.get(key, () -> "value2");
+      assertThat(value1).isEqualTo("value2");
+    }
+  }
+
+  @Test
+  public void doubleInstantiationFails() {
+    try (PerThreadCache ignored = PerThreadCache.create()) {
+      exception.expect(IllegalStateException.class);
+      exception.expectMessage("called create() twice on the same request");
+      PerThreadCache.create();
+    }
+  }
+
+  @Test
+  public void enforceMaxSize() {
+    try (PerThreadCache cache = PerThreadCache.create()) {
+      // Fill the cache
+      for (int i = 0; i < 50; i++) {
+        PerThreadCache.Key<String> key = PerThreadCache.Key.create(String.class, i);
+        cache.get(key, () -> "cached value");
+      }
+      // Assert that the value was not persisted
+      PerThreadCache.Key<String> key = PerThreadCache.Key.create(String.class, 1000);
+      cache.get(key, () -> "new value");
+      String value = cache.get(key, () -> "directly served");
+      assertThat(value).isEqualTo("directly served");
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/server/cache/h2/BUILD b/javatests/com/google/gerrit/server/cache/h2/BUILD
new file mode 100644
index 0000000..2ee8e48
--- /dev/null
+++ b/javatests/com/google/gerrit/server/cache/h2/BUILD
@@ -0,0 +1,16 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+junit_tests(
+    name = "tests",
+    srcs = glob(["**/*.java"]),
+    deps = [
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/server/cache/h2",
+        "//java/com/google/gerrit/server/cache/serialize",
+        "//lib:guava",
+        "//lib:h2",
+        "//lib:junit",
+        "//lib/guice",
+        "//lib/truth",
+    ],
+)
diff --git a/javatests/com/google/gerrit/server/cache/h2/H2CacheTest.java b/javatests/com/google/gerrit/server/cache/h2/H2CacheTest.java
new file mode 100644
index 0000000..147aeeb
--- /dev/null
+++ b/javatests/com/google/gerrit/server/cache/h2/H2CacheTest.java
@@ -0,0 +1,129 @@
+// Copyright (C) 2015 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.google.gerrit.server.cache.h2;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.util.concurrent.MoreExecutors;
+import com.google.gerrit.server.cache.h2.H2CacheImpl.SqlStore;
+import com.google.gerrit.server.cache.h2.H2CacheImpl.ValueHolder;
+import com.google.gerrit.server.cache.serialize.StringCacheSerializer;
+import com.google.inject.TypeLiteral;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.atomic.AtomicBoolean;
+import org.junit.Test;
+
+public class H2CacheTest {
+  private static final TypeLiteral<String> KEY_TYPE = new TypeLiteral<String>() {};
+  private static final int DEFAULT_VERSION = 1234;
+  private static int dbCnt;
+
+  private static int nextDbId() {
+    return ++dbCnt;
+  }
+
+  private static H2CacheImpl<String, String> newH2CacheImpl(
+      int id, Cache<String, ValueHolder<String>> mem, int version) {
+    SqlStore<String, String> store =
+        new SqlStore<>(
+            "jdbc:h2:mem:Test_" + id,
+            KEY_TYPE,
+            StringCacheSerializer.INSTANCE,
+            StringCacheSerializer.INSTANCE,
+            version,
+            1 << 20,
+            null);
+    return new H2CacheImpl<>(MoreExecutors.directExecutor(), store, KEY_TYPE, mem);
+  }
+
+  @Test
+  public void get() throws ExecutionException {
+    Cache<String, ValueHolder<String>> mem = CacheBuilder.newBuilder().build();
+    H2CacheImpl<String, String> impl = newH2CacheImpl(nextDbId(), mem, DEFAULT_VERSION);
+
+    assertThat(impl.getIfPresent("foo")).isNull();
+
+    AtomicBoolean called = new AtomicBoolean();
+    assertThat(
+            impl.get(
+                "foo",
+                () -> {
+                  called.set(true);
+                  return "bar";
+                }))
+        .isEqualTo("bar");
+    assertThat(called.get()).named("Callable was called").isTrue();
+    assertThat(impl.getIfPresent("foo")).named("in-memory value").isEqualTo("bar");
+    mem.invalidate("foo");
+    assertThat(impl.getIfPresent("foo")).named("persistent value").isEqualTo("bar");
+
+    called.set(false);
+    assertThat(
+            impl.get(
+                "foo",
+                () -> {
+                  called.set(true);
+                  return "baz";
+                }))
+        .named("cached value")
+        .isEqualTo("bar");
+    assertThat(called.get()).named("Callable was called").isFalse();
+  }
+
+  @Test
+  public void stringSerializer() {
+    String input = "foo";
+    byte[] serialized = StringCacheSerializer.INSTANCE.serialize(input);
+    assertThat(serialized).isEqualTo(new byte[] {'f', 'o', 'o'});
+    assertThat(StringCacheSerializer.INSTANCE.deserialize(serialized)).isEqualTo(input);
+  }
+
+  @Test
+  public void version() throws Exception {
+    int id = nextDbId();
+    H2CacheImpl<String, String> oldImpl = newH2CacheImpl(id, disableMemCache(), DEFAULT_VERSION);
+    H2CacheImpl<String, String> newImpl =
+        newH2CacheImpl(id, disableMemCache(), DEFAULT_VERSION + 1);
+
+    assertThat(oldImpl.diskStats().space()).isEqualTo(0);
+    assertThat(newImpl.diskStats().space()).isEqualTo(0);
+    oldImpl.put("key", "val");
+    assertThat(oldImpl.getIfPresent("key")).isEqualTo("val");
+    assertThat(oldImpl.diskStats().space()).isEqualTo(12);
+    assertThat(oldImpl.diskStats().hitCount()).isEqualTo(1);
+
+    // Can't find key in cache with wrong version, but the data is still there.
+    assertThat(newImpl.diskStats().requestCount()).isEqualTo(0);
+    assertThat(newImpl.diskStats().space()).isEqualTo(12);
+    assertThat(newImpl.getIfPresent("key")).isNull();
+    assertThat(newImpl.diskStats().space()).isEqualTo(12);
+
+    // Re-putting it via the new cache works, and uses the same amount of space.
+    newImpl.put("key", "val2");
+    assertThat(newImpl.getIfPresent("key")).isEqualTo("val2");
+    assertThat(newImpl.diskStats().hitCount()).isEqualTo(1);
+    assertThat(newImpl.diskStats().space()).isEqualTo(14);
+
+    // Now it's no longer in the old cache.
+    assertThat(oldImpl.diskStats().space()).isEqualTo(14);
+    assertThat(oldImpl.getIfPresent("key")).isNull();
+  }
+
+  private static <K, V> Cache<K, ValueHolder<V>> disableMemCache() {
+    return CacheBuilder.newBuilder().maximumSize(0).build();
+  }
+}
diff --git a/javatests/com/google/gerrit/server/cache/serialize/BUILD b/javatests/com/google/gerrit/server/cache/serialize/BUILD
new file mode 100644
index 0000000..35d8527
--- /dev/null
+++ b/javatests/com/google/gerrit/server/cache/serialize/BUILD
@@ -0,0 +1,20 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+junit_tests(
+    name = "tests",
+    srcs = glob(["*.java"]),
+    deps = [
+        "//java/com/google/gerrit/server/cache/serialize",
+        "//java/com/google/gerrit/server/cache/testing",
+        "//lib:guava",
+        "//lib:gwtorm",
+        "//lib:junit",
+        "//lib:protobuf",
+        "//lib/auto:auto-value",
+        "//lib/auto:auto-value-annotations",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/truth",
+        "//lib/truth:truth-proto-extension",
+        "//proto:cache_java_proto",
+    ],
+)
diff --git a/javatests/com/google/gerrit/server/cache/serialize/BooleanCacheSerializerTest.java b/javatests/com/google/gerrit/server/cache/serialize/BooleanCacheSerializerTest.java
new file mode 100644
index 0000000..7504850
--- /dev/null
+++ b/javatests/com/google/gerrit/server/cache/serialize/BooleanCacheSerializerTest.java
@@ -0,0 +1,62 @@
+// 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.
+
+package com.google.gerrit.server.cache.serialize;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assert_;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.protobuf.TextFormat;
+import org.junit.Test;
+
+public class BooleanCacheSerializerTest {
+  @Test
+  public void serialize() throws Exception {
+    assertThat(BooleanCacheSerializer.INSTANCE.serialize(true))
+        .isEqualTo(new byte[] {'t', 'r', 'u', 'e'});
+    assertThat(BooleanCacheSerializer.INSTANCE.serialize(false))
+        .isEqualTo(new byte[] {'f', 'a', 'l', 's', 'e'});
+  }
+
+  @Test
+  public void deserialize() throws Exception {
+    assertThat(BooleanCacheSerializer.INSTANCE.deserialize(new byte[] {'t', 'r', 'u', 'e'}))
+        .isEqualTo(true);
+    assertThat(BooleanCacheSerializer.INSTANCE.deserialize(new byte[] {'f', 'a', 'l', 's', 'e'}))
+        .isEqualTo(false);
+  }
+
+  @Test
+  public void deserializeInvalid() throws Exception {
+    assertDeserializeFails(null);
+    assertDeserializeFails("t".getBytes(UTF_8));
+    assertDeserializeFails("tru".getBytes(UTF_8));
+    assertDeserializeFails("trueee".getBytes(UTF_8));
+    assertDeserializeFails("TRUE".getBytes(UTF_8));
+    assertDeserializeFails("f".getBytes(UTF_8));
+    assertDeserializeFails("fal".getBytes(UTF_8));
+    assertDeserializeFails("falseee".getBytes(UTF_8));
+    assertDeserializeFails("FALSE".getBytes(UTF_8));
+  }
+
+  private static void assertDeserializeFails(byte[] in) {
+    try {
+      BooleanCacheSerializer.INSTANCE.deserialize(in);
+      assert_().fail("expected deserialization to fail for \"%s\"", TextFormat.escapeBytes(in));
+    } catch (RuntimeException e) {
+      // Expected.
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/server/cache/serialize/EnumCacheSerializerTest.java b/javatests/com/google/gerrit/server/cache/serialize/EnumCacheSerializerTest.java
new file mode 100644
index 0000000..0b80fc7
--- /dev/null
+++ b/javatests/com/google/gerrit/server/cache/serialize/EnumCacheSerializerTest.java
@@ -0,0 +1,59 @@
+// 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.
+
+package com.google.gerrit.server.cache.serialize;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assert_;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import org.junit.Test;
+
+public class EnumCacheSerializerTest {
+  @Test
+  public void serialize() throws Exception {
+    assertRoundTrip(MyEnum.FOO);
+    assertRoundTrip(MyEnum.BAR);
+    assertRoundTrip(MyEnum.BAZ);
+  }
+
+  @Test
+  public void deserializeInvalidValues() throws Exception {
+    assertDeserializeFails(null);
+    assertDeserializeFails("".getBytes(UTF_8));
+    assertDeserializeFails("foo".getBytes(UTF_8));
+    assertDeserializeFails("QUUX".getBytes(UTF_8));
+  }
+
+  private enum MyEnum {
+    FOO,
+    BAR,
+    BAZ;
+  }
+
+  private static void assertRoundTrip(MyEnum e) throws Exception {
+    CacheSerializer<MyEnum> s = new EnumCacheSerializer<>(MyEnum.class);
+    assertThat(s.deserialize(s.serialize(e))).isEqualTo(e);
+  }
+
+  private static void assertDeserializeFails(byte[] in) {
+    CacheSerializer<MyEnum> s = new EnumCacheSerializer<>(MyEnum.class);
+    try {
+      s.deserialize(in);
+      assert_().fail("expected RuntimeException");
+    } catch (RuntimeException e) {
+      // Expected.
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/server/cache/serialize/IntKeyCacheSerializerTest.java b/javatests/com/google/gerrit/server/cache/serialize/IntKeyCacheSerializerTest.java
new file mode 100644
index 0000000..987a62a
--- /dev/null
+++ b/javatests/com/google/gerrit/server/cache/serialize/IntKeyCacheSerializerTest.java
@@ -0,0 +1,66 @@
+// 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.
+
+package com.google.gerrit.server.cache.serialize;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assert_;
+
+import com.google.gwtorm.client.IntKey;
+import com.google.gwtorm.client.Key;
+import org.junit.Test;
+
+public class IntKeyCacheSerializerTest {
+
+  private static class MyIntKey extends IntKey<Key<?>> {
+    private static final long serialVersionUID = 1L;
+
+    private int val;
+
+    MyIntKey(int val) {
+      this.val = val;
+    }
+
+    @Override
+    public int get() {
+      return val;
+    }
+
+    @Override
+    protected void set(int newValue) {
+      this.val = newValue;
+    }
+  }
+
+  private static final IntKeyCacheSerializer<MyIntKey> SERIALIZER =
+      new IntKeyCacheSerializer<>(MyIntKey::new);
+
+  @Test
+  public void serialize() throws Exception {
+    MyIntKey k = new MyIntKey(1234);
+    byte[] serialized = SERIALIZER.serialize(k);
+    assertThat(serialized).isEqualTo(new byte[] {-46, 9});
+    assertThat(SERIALIZER.deserialize(serialized).get()).isEqualTo(1234);
+  }
+
+  @Test
+  public void deserializeNullFails() throws Exception {
+    try {
+      SERIALIZER.deserialize(null);
+      assert_().fail("expected RuntimeException");
+    } catch (RuntimeException e) {
+      // Expected.
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/server/cache/serialize/IntegerCacheSerializerTest.java b/javatests/com/google/gerrit/server/cache/serialize/IntegerCacheSerializerTest.java
new file mode 100644
index 0000000..c2db808
--- /dev/null
+++ b/javatests/com/google/gerrit/server/cache/serialize/IntegerCacheSerializerTest.java
@@ -0,0 +1,64 @@
+// 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.
+
+package com.google.gerrit.server.cache.serialize;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assert_;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.primitives.Bytes;
+import com.google.protobuf.TextFormat;
+import org.junit.Test;
+
+public class IntegerCacheSerializerTest {
+  @Test
+  public void serialize() throws Exception {
+    for (int i :
+        ImmutableList.of(
+            Integer.MIN_VALUE,
+            Integer.MIN_VALUE + 20,
+            -1,
+            0,
+            1,
+            Integer.MAX_VALUE - 20,
+            Integer.MAX_VALUE)) {
+      assertRoundTrip(i);
+    }
+  }
+
+  @Test
+  public void deserializeInvalidValues() throws Exception {
+    assertDeserializeFails(null);
+    assertDeserializeFails(
+        Bytes.concat(IntegerCacheSerializer.INSTANCE.serialize(1), new byte[] {0, 0, 0, 0}));
+  }
+
+  private static void assertRoundTrip(int i) throws Exception {
+    byte[] serialized = IntegerCacheSerializer.INSTANCE.serialize(i);
+    int result = IntegerCacheSerializer.INSTANCE.deserialize(serialized);
+    assertThat(result)
+        .named("round-trip of %s via \"%s\"", i, TextFormat.escapeBytes(serialized))
+        .isEqualTo(i);
+  }
+
+  private static void assertDeserializeFails(byte[] in) {
+    try {
+      IntegerCacheSerializer.INSTANCE.deserialize(in);
+      assert_().fail("expected RuntimeException");
+    } catch (RuntimeException e) {
+      // Expected.
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/server/cache/serialize/JavaCacheSerializerTest.java b/javatests/com/google/gerrit/server/cache/serialize/JavaCacheSerializerTest.java
new file mode 100644
index 0000000..6596730
--- /dev/null
+++ b/javatests/com/google/gerrit/server/cache/serialize/JavaCacheSerializerTest.java
@@ -0,0 +1,49 @@
+// 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.
+
+package com.google.gerrit.server.cache.serialize;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.auto.value.AutoValue;
+import java.io.Serializable;
+import org.junit.Test;
+
+public class JavaCacheSerializerTest {
+  @Test
+  public void builtInTypes() throws Exception {
+    assertRoundTrip("foo");
+    assertRoundTrip(Integer.valueOf(1234));
+    assertRoundTrip(Boolean.TRUE);
+  }
+
+  @Test
+  public void customType() throws Exception {
+    assertRoundTrip(new AutoValue_JavaCacheSerializerTest_MyType(123, "four five six"));
+  }
+
+  @AutoValue
+  abstract static class MyType implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    abstract Integer anInt();
+
+    abstract String aString();
+  }
+
+  private static <T extends Serializable> void assertRoundTrip(T input) throws Exception {
+    JavaCacheSerializer<T> s = new JavaCacheSerializer<>();
+    assertThat(s.deserialize(s.serialize(input))).isEqualTo(input);
+  }
+}
diff --git a/javatests/com/google/gerrit/server/cache/serialize/ObjectIdCacheSerializerTest.java b/javatests/com/google/gerrit/server/cache/serialize/ObjectIdCacheSerializerTest.java
new file mode 100644
index 0000000..c56f8f8
--- /dev/null
+++ b/javatests/com/google/gerrit/server/cache/serialize/ObjectIdCacheSerializerTest.java
@@ -0,0 +1,56 @@
+// 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.
+
+package com.google.gerrit.server.cache.serialize;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assert_;
+import static com.google.gerrit.server.cache.testing.CacheSerializerTestUtil.byteArray;
+
+import org.eclipse.jgit.lib.ObjectId;
+import org.junit.Test;
+
+public class ObjectIdCacheSerializerTest {
+  @Test
+  public void serialize() {
+    ObjectId id = ObjectId.fromString("aabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
+    byte[] serialized = ObjectIdCacheSerializer.INSTANCE.serialize(id);
+    assertThat(serialized)
+        .isEqualTo(
+            byteArray(
+                0xaa, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+                0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb));
+    assertThat(ObjectIdCacheSerializer.INSTANCE.deserialize(serialized)).isEqualTo(id);
+  }
+
+  @Test
+  public void deserializeInvalid() {
+    assertDeserializeFails(null);
+    assertDeserializeFails(byteArray());
+    assertDeserializeFails(byteArray(0xaa));
+    assertDeserializeFails(
+        byteArray(
+            0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+            0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa));
+  }
+
+  private void assertDeserializeFails(byte[] bytes) {
+    try {
+      ObjectIdCacheSerializer.INSTANCE.deserialize(bytes);
+      assert_().fail("expected IllegalArgumentException");
+    } catch (IllegalArgumentException e) {
+      // Expected.
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/server/cache/serialize/ProtoCacheSerializersTest.java b/javatests/com/google/gerrit/server/cache/serialize/ProtoCacheSerializersTest.java
new file mode 100644
index 0000000..69694fe
--- /dev/null
+++ b/javatests/com/google/gerrit/server/cache/serialize/ProtoCacheSerializersTest.java
@@ -0,0 +1,116 @@
+// 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.
+
+package com.google.gerrit.server.cache.serialize;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assert_;
+import static com.google.common.truth.extensions.proto.ProtoTruth.assertThat;
+import static com.google.gerrit.server.cache.testing.CacheSerializerTestUtil.byteString;
+
+import com.google.gerrit.server.cache.proto.Cache.ChangeNotesKeyProto;
+import com.google.gerrit.server.cache.proto.Cache.ChangeNotesStateProto;
+import com.google.gerrit.server.cache.serialize.ProtoCacheSerializers.ObjectIdConverter;
+import com.google.protobuf.ByteString;
+import org.eclipse.jgit.lib.ObjectId;
+import org.junit.Test;
+
+public class ProtoCacheSerializersTest {
+  @Test
+  public void objectIdFromByteString() {
+    ObjectIdConverter idConverter = ObjectIdConverter.create();
+    assertThat(
+            idConverter.fromByteString(
+                byteString(
+                    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+                    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa)))
+        .isEqualTo(ObjectId.fromString("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"));
+    assertThat(
+            idConverter.fromByteString(
+                byteString(
+                    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+                    0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb)))
+        .isEqualTo(ObjectId.fromString("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"));
+  }
+
+  @Test
+  public void objectIdFromByteStringWrongSize() {
+    try {
+      ObjectIdConverter.create().fromByteString(ByteString.copyFromUtf8("foo"));
+      assert_().fail("expected IllegalArgumentException");
+    } catch (IllegalArgumentException e) {
+      // Expected.
+    }
+  }
+
+  @Test
+  public void objectIdToByteString() {
+    ObjectIdConverter idConverter = ObjectIdConverter.create();
+    assertThat(
+            idConverter.toByteString(
+                ObjectId.fromString("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")))
+        .isEqualTo(
+            byteString(
+                0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+                0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa));
+    assertThat(
+            idConverter.toByteString(
+                ObjectId.fromString("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb")))
+        .isEqualTo(
+            byteString(
+                0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+                0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb));
+  }
+
+  @Test
+  public void parseUncheckedWrongProtoType() {
+    ChangeNotesKeyProto proto =
+        ChangeNotesKeyProto.newBuilder()
+            .setProject("project")
+            .setChangeId(1234)
+            .setId(ByteString.copyFromUtf8("foo"))
+            .build();
+    byte[] bytes = ProtoCacheSerializers.toByteArray(proto);
+    try {
+      ProtoCacheSerializers.parseUnchecked(ChangeNotesStateProto.parser(), bytes);
+      assert_().fail("expected IllegalArgumentException");
+    } catch (IllegalArgumentException e) {
+      // Expected.
+    }
+  }
+
+  @Test
+  public void parseUncheckedInvalidData() {
+    byte[] bytes = new byte[] {0x00};
+    try {
+      ProtoCacheSerializers.parseUnchecked(ChangeNotesStateProto.parser(), bytes);
+      assert_().fail("expected IllegalArgumentException");
+    } catch (IllegalArgumentException e) {
+      // Expected.
+    }
+  }
+
+  @Test
+  public void parseUnchecked() {
+    ChangeNotesKeyProto proto =
+        ChangeNotesKeyProto.newBuilder()
+            .setProject("project")
+            .setChangeId(1234)
+            .setId(ByteString.copyFromUtf8("foo"))
+            .build();
+    byte[] bytes = ProtoCacheSerializers.toByteArray(proto);
+    assertThat(ProtoCacheSerializers.parseUnchecked(ChangeNotesKeyProto.parser(), bytes))
+        .isEqualTo(proto);
+  }
+}
diff --git a/javatests/com/google/gerrit/server/cache/serialize/StringCacheSerializerTest.java b/javatests/com/google/gerrit/server/cache/serialize/StringCacheSerializerTest.java
new file mode 100644
index 0000000..fa3b7d7
--- /dev/null
+++ b/javatests/com/google/gerrit/server/cache/serialize/StringCacheSerializerTest.java
@@ -0,0 +1,65 @@
+// 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.
+
+package com.google.gerrit.server.cache.serialize;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assert_;
+
+import java.nio.charset.CharacterCodingException;
+import java.nio.charset.StandardCharsets;
+import org.junit.Test;
+
+public class StringCacheSerializerTest {
+  @Test
+  public void serialize() {
+    assertThat(StringCacheSerializer.INSTANCE.serialize("")).isEmpty();
+    assertThat(StringCacheSerializer.INSTANCE.serialize("abc"))
+        .isEqualTo(new byte[] {'a', 'b', 'c'});
+    assertThat(StringCacheSerializer.INSTANCE.serialize("a\u1234c"))
+        .isEqualTo(new byte[] {'a', (byte) 0xe1, (byte) 0x88, (byte) 0xb4, 'c'});
+  }
+
+  @Test
+  public void serializeInvalidChar() {
+    // Can't use UTF-8 for the test, since it can encode all Unicode code points.
+    try {
+      StringCacheSerializer.serialize(StandardCharsets.US_ASCII, "\u1234");
+      assert_().fail("expected IllegalStateException");
+    } catch (IllegalStateException expected) {
+      assertThat(expected).hasCauseThat().isInstanceOf(CharacterCodingException.class);
+    }
+  }
+
+  @Test
+  public void deserialize() {
+    assertThat(StringCacheSerializer.INSTANCE.deserialize(new byte[0])).isEmpty();
+    assertThat(StringCacheSerializer.INSTANCE.deserialize(new byte[] {'a', 'b', 'c'}))
+        .isEqualTo("abc");
+    assertThat(
+            StringCacheSerializer.INSTANCE.deserialize(
+                new byte[] {'a', (byte) 0xe1, (byte) 0x88, (byte) 0xb4, 'c'}))
+        .isEqualTo("a\u1234c");
+  }
+
+  @Test
+  public void deserializeInvalidChar() {
+    try {
+      StringCacheSerializer.INSTANCE.deserialize(new byte[] {(byte) 0xff});
+      assert_().fail("expected IllegalStateException");
+    } catch (IllegalStateException expected) {
+      assertThat(expected).hasCauseThat().isInstanceOf(CharacterCodingException.class);
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/server/change/ChangeKindCacheImplTest.java b/javatests/com/google/gerrit/server/change/ChangeKindCacheImplTest.java
new file mode 100644
index 0000000..b847ed7
--- /dev/null
+++ b/javatests/com/google/gerrit/server/change/ChangeKindCacheImplTest.java
@@ -0,0 +1,63 @@
+// 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.
+
+package com.google.gerrit.server.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.extensions.proto.ProtoTruth.assertThat;
+import static com.google.gerrit.server.cache.testing.CacheSerializerTestUtil.byteString;
+import static com.google.gerrit.server.cache.testing.SerializedClassSubject.assertThatSerializedClass;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.gerrit.server.cache.proto.Cache.ChangeKindKeyProto;
+import com.google.gerrit.server.cache.serialize.CacheSerializer;
+import com.google.gerrit.server.change.ChangeKindCacheImpl.Key;
+import org.eclipse.jgit.lib.ObjectId;
+import org.junit.Test;
+
+public class ChangeKindCacheImplTest {
+  @Test
+  public void keySerializer() throws Exception {
+    ChangeKindCacheImpl.Key key =
+        Key.create(
+            ObjectId.zeroId(),
+            ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"),
+            "aStrategy");
+    CacheSerializer<ChangeKindCacheImpl.Key> s = new ChangeKindCacheImpl.Key.Serializer();
+    byte[] serialized = s.serialize(key);
+    assertThat(ChangeKindKeyProto.parseFrom(serialized))
+        .isEqualTo(
+            ChangeKindKeyProto.newBuilder()
+                .setPrior(byteString(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0))
+                .setNext(
+                    byteString(
+                        0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef,
+                        0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef))
+                .setStrategyName("aStrategy")
+                .build());
+    assertThat(s.deserialize(serialized)).isEqualTo(key);
+  }
+
+  /**
+   * See {@link com.google.gerrit.server.cache.testing.SerializedClassSubject} for background and
+   * what to do if this test fails.
+   */
+  @Test
+  public void keyFields() throws Exception {
+    assertThatSerializedClass(ChangeKindCacheImpl.Key.class)
+        .hasAutoValueMethods(
+            ImmutableMap.of(
+                "prior", ObjectId.class, "next", ObjectId.class, "strategyName", String.class));
+  }
+}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/change/HashtagsTest.java b/javatests/com/google/gerrit/server/change/HashtagsTest.java
similarity index 100%
rename from gerrit-server/src/test/java/com/google/gerrit/server/change/HashtagsTest.java
rename to javatests/com/google/gerrit/server/change/HashtagsTest.java
diff --git a/javatests/com/google/gerrit/server/change/IncludedInResolverTest.java b/javatests/com/google/gerrit/server/change/IncludedInResolverTest.java
new file mode 100644
index 0000000..dca2dcb
--- /dev/null
+++ b/javatests/com/google/gerrit/server/change/IncludedInResolverTest.java
@@ -0,0 +1,182 @@
+// Copyright (C) 2013 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.google.gerrit.server.change;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import java.io.IOException;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.api.MergeCommand.FastForwardMode;
+import org.eclipse.jgit.junit.RepositoryTestCase;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevTag;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class IncludedInResolverTest extends RepositoryTestCase {
+
+  // Branch names
+  private static final String BRANCH_MASTER = "master";
+  private static final String BRANCH_1_0 = "rel-1.0";
+  private static final String BRANCH_1_3 = "rel-1.3";
+  private static final String BRANCH_2_0 = "rel-2.0";
+  private static final String BRANCH_2_5 = "rel-2.5";
+
+  // Tag names
+  private static final String TAG_1_0 = "1.0";
+  private static final String TAG_1_0_1 = "1.0.1";
+  private static final String TAG_1_3 = "1.3";
+  private static final String TAG_2_0_1 = "2.0.1";
+  private static final String TAG_2_0 = "2.0";
+  private static final String TAG_2_5 = "2.5";
+  private static final String TAG_2_5_ANNOTATED = "2.5-annotated";
+  private static final String TAG_2_5_ANNOTATED_TWICE = "2.5-annotated_twice";
+
+  // Commits
+  private RevCommit commit_initial;
+  private RevCommit commit_v1_3;
+  private RevCommit commit_v2_5;
+
+  private RevWalk revWalk;
+
+  @Override
+  @Before
+  public void setUp() throws Exception {
+    super.setUp();
+
+    /*- The following graph will be created.
+
+     o   tag 2.5, 2.5_annotated, 2.5_annotated_twice
+     |\
+     | o tag 2.0.1
+     | o tag 2.0
+     o | tag 1.3
+     |/
+     o   c3
+
+     | o tag 1.0.1
+     |/
+     o   tag 1.0
+     o   c2
+     o   c1
+
+    */
+
+    // TODO(dborowitz): Use try/finally when this doesn't double-close the repo.
+    @SuppressWarnings("resource")
+    Git git = new Git(db);
+    revWalk = new RevWalk(db);
+    // Version 1.0
+    commit_initial = git.commit().setMessage("c1").call();
+    git.commit().setMessage("c2").call();
+    RevCommit commit_v1_0 = git.commit().setMessage("version 1.0").call();
+    git.tag().setName(TAG_1_0).setObjectId(commit_v1_0).call();
+    RevCommit c3 = git.commit().setMessage("c3").call();
+    // Version 1.01
+    createAndCheckoutBranch(commit_v1_0, BRANCH_1_0);
+    RevCommit commit_v1_0_1 = git.commit().setMessage("verREFS_HEADS_RELsion 1.0.1").call();
+    git.tag().setName(TAG_1_0_1).setObjectId(commit_v1_0_1).call();
+    // Version 1.3
+    createAndCheckoutBranch(c3, BRANCH_1_3);
+    commit_v1_3 = git.commit().setMessage("version 1.3").call();
+    git.tag().setName(TAG_1_3).setObjectId(commit_v1_3).call();
+    // Version 2.0
+    createAndCheckoutBranch(c3, BRANCH_2_0);
+    RevCommit commit_v2_0 = git.commit().setMessage("version 2.0").call();
+    git.tag().setName(TAG_2_0).setObjectId(commit_v2_0).call();
+    RevCommit commit_v2_0_1 = git.commit().setMessage("version 2.0.1").call();
+    git.tag().setName(TAG_2_0_1).setObjectId(commit_v2_0_1).call();
+
+    // Version 2.5
+    createAndCheckoutBranch(commit_v1_3, BRANCH_2_5);
+    git.merge()
+        .include(commit_v2_0_1)
+        .setCommit(false)
+        .setFastForward(FastForwardMode.NO_FF)
+        .call();
+    commit_v2_5 = git.commit().setMessage("version 2.5").call();
+    git.tag().setName(TAG_2_5).setObjectId(commit_v2_5).setAnnotated(false).call();
+    Ref ref_tag_2_5_annotated =
+        git.tag().setName(TAG_2_5_ANNOTATED).setObjectId(commit_v2_5).setAnnotated(true).call();
+    RevTag tag_2_5_annotated = revWalk.parseTag(ref_tag_2_5_annotated.getObjectId());
+    git.tag()
+        .setName(TAG_2_5_ANNOTATED_TWICE)
+        .setObjectId(tag_2_5_annotated)
+        .setAnnotated(true)
+        .call();
+  }
+
+  @Override
+  @After
+  public void tearDown() throws Exception {
+    revWalk.close();
+    super.tearDown();
+  }
+
+  @Test
+  public void resolveLatestCommit() throws Exception {
+    // Check tip commit
+    IncludedInResolver.Result detail = resolve(commit_v2_5);
+
+    // Check that only tags and branches which refer the tip are returned
+    assertThat(detail.tags()).containsExactly(TAG_2_5, TAG_2_5_ANNOTATED, TAG_2_5_ANNOTATED_TWICE);
+    assertThat(detail.branches()).containsExactly(BRANCH_2_5);
+  }
+
+  @Test
+  public void resolveFirstCommit() throws Exception {
+    // Check first commit
+    IncludedInResolver.Result detail = resolve(commit_initial);
+
+    // Check whether all tags and branches are returned
+    assertThat(detail.tags())
+        .containsExactly(
+            TAG_1_0,
+            TAG_1_0_1,
+            TAG_1_3,
+            TAG_2_0,
+            TAG_2_0_1,
+            TAG_2_5,
+            TAG_2_5_ANNOTATED,
+            TAG_2_5_ANNOTATED_TWICE);
+    assertThat(detail.branches())
+        .containsExactly(BRANCH_MASTER, BRANCH_1_0, BRANCH_1_3, BRANCH_2_0, BRANCH_2_5);
+  }
+
+  @Test
+  public void resolveBetwixtCommit() throws Exception {
+    // Check a commit somewhere in the middle
+    IncludedInResolver.Result detail = resolve(commit_v1_3);
+
+    // Check whether all succeeding tags and branches are returned
+    assertThat(detail.tags())
+        .containsExactly(TAG_1_3, TAG_2_5, TAG_2_5_ANNOTATED, TAG_2_5_ANNOTATED_TWICE);
+    assertThat(detail.branches()).containsExactly(BRANCH_1_3, BRANCH_2_5);
+  }
+
+  private IncludedInResolver.Result resolve(RevCommit commit) throws Exception {
+    return IncludedInResolver.resolve(db, revWalk, commit);
+  }
+
+  private void createAndCheckoutBranch(ObjectId objectId, String branchName) throws IOException {
+    String fullBranchName = "refs/heads/" + branchName;
+    super.createBranch(objectId, fullBranchName);
+    super.checkoutBranch(fullBranchName);
+  }
+}
diff --git a/javatests/com/google/gerrit/server/change/LabelNormalizerTest.java b/javatests/com/google/gerrit/server/change/LabelNormalizerTest.java
new file mode 100644
index 0000000..5a067f1
--- /dev/null
+++ b/javatests/com/google/gerrit/server/change/LabelNormalizerTest.java
@@ -0,0 +1,230 @@
+// Copyright (C) 2014 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.google.gerrit.server.change;
+
+import static com.google.gerrit.common.data.Permission.forLabel;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static com.google.gerrit.server.project.testing.Util.allow;
+import static com.google.gerrit.server.project.testing.Util.category;
+import static com.google.gerrit.server.project.testing.Util.value;
+import static org.junit.Assert.assertEquals;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.lifecycle.LifecycleManager;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.LabelId;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.client.PatchSetInfo;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountManager;
+import com.google.gerrit.server.account.AuthRequest;
+import com.google.gerrit.server.change.LabelNormalizer.Result;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.server.schema.SchemaCreator;
+import com.google.gerrit.server.util.RequestContext;
+import com.google.gerrit.server.util.ThreadLocalRequestContext;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.testing.InMemoryDatabase;
+import com.google.gerrit.testing.InMemoryModule;
+import com.google.inject.Guice;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Provider;
+import com.google.inject.util.Providers;
+import java.util.List;
+import org.eclipse.jgit.lib.Repository;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/** Unit tests for {@link LabelNormalizer}. */
+public class LabelNormalizerTest {
+  @Inject private AccountManager accountManager;
+  @Inject private AllProjectsName allProjects;
+  @Inject private GitRepositoryManager repoManager;
+  @Inject private IdentifiedUser.GenericFactory userFactory;
+  @Inject private InMemoryDatabase schemaFactory;
+  @Inject private LabelNormalizer norm;
+  @Inject private MetaDataUpdate.User metaDataUpdateFactory;
+  @Inject private ProjectCache projectCache;
+  @Inject private SchemaCreator schemaCreator;
+  @Inject protected ThreadLocalRequestContext requestContext;
+  @Inject private ChangeNotes.Factory changeNotesFactory;
+
+  private LifecycleManager lifecycle;
+  private ReviewDb db;
+  private Account.Id userId;
+  private IdentifiedUser user;
+  private Change change;
+  private ChangeNotes notes;
+
+  @Before
+  public void setUpInjector() throws Exception {
+    Injector injector = Guice.createInjector(new InMemoryModule());
+    injector.injectMembers(this);
+    lifecycle = new LifecycleManager();
+    lifecycle.add(injector);
+    lifecycle.start();
+
+    db = schemaFactory.open();
+    schemaCreator.create(db);
+    userId = accountManager.authenticate(AuthRequest.forUser("user")).getAccountId();
+    user = userFactory.create(userId);
+
+    requestContext.setContext(
+        new RequestContext() {
+          @Override
+          public CurrentUser getUser() {
+            return user;
+          }
+
+          @Override
+          public Provider<ReviewDb> getReviewDbProvider() {
+            return Providers.of(db);
+          }
+        });
+
+    configureProject();
+    setUpChange();
+  }
+
+  private void configureProject() throws Exception {
+    ProjectConfig pc = loadAllProjects();
+    for (AccessSection sec : pc.getAccessSections()) {
+      for (String label : pc.getLabelSections().keySet()) {
+        sec.removePermission(forLabel(label));
+      }
+    }
+    LabelType lt =
+        category("Verified", value(1, "Verified"), value(0, "No score"), value(-1, "Fails"));
+    pc.getLabelSections().put(lt.getName(), lt);
+    save(pc);
+  }
+
+  private void setUpChange() throws Exception {
+    change =
+        new Change(
+            new Change.Key("Iabcd1234abcd1234abcd1234abcd1234abcd1234"),
+            new Change.Id(1),
+            userId,
+            new Branch.NameKey(allProjects, "refs/heads/master"),
+            TimeUtil.nowTs());
+    PatchSetInfo ps = new PatchSetInfo(new PatchSet.Id(change.getId(), 1));
+    ps.setSubject("Test change");
+    change.setCurrentPatchSet(ps);
+    db.changes().insert(ImmutableList.of(change));
+    notes = changeNotesFactory.createChecked(db, change);
+  }
+
+  @After
+  public void tearDown() {
+    if (lifecycle != null) {
+      lifecycle.stop();
+    }
+    requestContext.setContext(null);
+    if (db != null) {
+      db.close();
+    }
+    InMemoryDatabase.drop(schemaFactory);
+  }
+
+  @Test
+  public void noNormalizeByPermission() throws Exception {
+    ProjectConfig pc = loadAllProjects();
+    allow(pc, forLabel("Code-Review"), -1, 1, REGISTERED_USERS, "refs/heads/*");
+    allow(pc, forLabel("Verified"), -1, 1, REGISTERED_USERS, "refs/heads/*");
+    save(pc);
+
+    PatchSetApproval cr = psa(userId, "Code-Review", 2);
+    PatchSetApproval v = psa(userId, "Verified", 1);
+    assertEquals(Result.create(list(cr, v), list(), list()), norm.normalize(notes, list(cr, v)));
+  }
+
+  @Test
+  public void normalizeByType() throws Exception {
+    ProjectConfig pc = loadAllProjects();
+    allow(pc, forLabel("Code-Review"), -5, 5, REGISTERED_USERS, "refs/heads/*");
+    allow(pc, forLabel("Verified"), -5, 5, REGISTERED_USERS, "refs/heads/*");
+    save(pc);
+
+    PatchSetApproval cr = psa(userId, "Code-Review", 5);
+    PatchSetApproval v = psa(userId, "Verified", 5);
+    assertEquals(
+        Result.create(list(), list(copy(cr, 2), copy(v, 1)), list()),
+        norm.normalize(notes, list(cr, v)));
+  }
+
+  @Test
+  public void emptyPermissionRangeKeepsResult() throws Exception {
+    PatchSetApproval cr = psa(userId, "Code-Review", 1);
+    PatchSetApproval v = psa(userId, "Verified", 1);
+    assertEquals(Result.create(list(cr, v), list(), list()), norm.normalize(notes, list(cr, v)));
+  }
+
+  @Test
+  public void explicitZeroVoteOnNonEmptyRangeIsPresent() throws Exception {
+    ProjectConfig pc = loadAllProjects();
+    allow(pc, forLabel("Code-Review"), -1, 1, REGISTERED_USERS, "refs/heads/*");
+    save(pc);
+
+    PatchSetApproval cr = psa(userId, "Code-Review", 0);
+    PatchSetApproval v = psa(userId, "Verified", 0);
+    assertEquals(Result.create(list(cr, v), list(), list()), norm.normalize(notes, list(cr, v)));
+  }
+
+  private ProjectConfig loadAllProjects() throws Exception {
+    try (Repository repo = repoManager.openRepository(allProjects)) {
+      ProjectConfig pc = new ProjectConfig(allProjects);
+      pc.load(repo);
+      return pc;
+    }
+  }
+
+  private void save(ProjectConfig pc) throws Exception {
+    try (MetaDataUpdate md = metaDataUpdateFactory.create(pc.getProject().getNameKey(), user)) {
+      pc.commit(md);
+      projectCache.evict(pc.getProject().getNameKey());
+    }
+  }
+
+  private PatchSetApproval psa(Account.Id accountId, String label, int value) {
+    return new PatchSetApproval(
+        new PatchSetApproval.Key(change.currentPatchSetId(), accountId, new LabelId(label)),
+        (short) value,
+        TimeUtil.nowTs());
+  }
+
+  private PatchSetApproval copy(PatchSetApproval src, int newValue) {
+    PatchSetApproval result = new PatchSetApproval(src.getKey().getParentKey(), src);
+    result.setValue((short) newValue);
+    return result;
+  }
+
+  private static List<PatchSetApproval> list(PatchSetApproval... psas) {
+    return ImmutableList.<PatchSetApproval>copyOf(psas);
+  }
+}
diff --git a/javatests/com/google/gerrit/server/change/MergeabilityCacheImplTest.java b/javatests/com/google/gerrit/server/change/MergeabilityCacheImplTest.java
new file mode 100644
index 0000000..e10a236
--- /dev/null
+++ b/javatests/com/google/gerrit/server/change/MergeabilityCacheImplTest.java
@@ -0,0 +1,70 @@
+// 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.
+
+package com.google.gerrit.server.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.extensions.proto.ProtoTruth.assertThat;
+import static com.google.gerrit.server.cache.testing.CacheSerializerTestUtil.byteString;
+import static com.google.gerrit.server.cache.testing.SerializedClassSubject.assertThatSerializedClass;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.server.cache.proto.Cache.MergeabilityKeyProto;
+import org.eclipse.jgit.lib.ObjectId;
+import org.junit.Test;
+
+public class MergeabilityCacheImplTest {
+  @Test
+  public void keySerializer() throws Exception {
+    MergeabilityCacheImpl.EntryKey key =
+        new MergeabilityCacheImpl.EntryKey(
+            ObjectId.fromString("badc0feebadc0feebadc0feebadc0feebadc0fee"),
+            ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"),
+            SubmitType.MERGE_IF_NECESSARY,
+            "aStrategy");
+    byte[] serialized = MergeabilityCacheImpl.EntryKey.Serializer.INSTANCE.serialize(key);
+    assertThat(MergeabilityKeyProto.parseFrom(serialized))
+        .isEqualTo(
+            MergeabilityKeyProto.newBuilder()
+                .setCommit(
+                    byteString(
+                        0xba, 0xdc, 0x0f, 0xee, 0xba, 0xdc, 0x0f, 0xee, 0xba, 0xdc, 0x0f, 0xee,
+                        0xba, 0xdc, 0x0f, 0xee, 0xba, 0xdc, 0x0f, 0xee))
+                .setInto(
+                    byteString(
+                        0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef,
+                        0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef))
+                .setSubmitType("MERGE_IF_NECESSARY")
+                .setMergeStrategy("aStrategy")
+                .build());
+    assertThat(MergeabilityCacheImpl.EntryKey.Serializer.INSTANCE.deserialize(serialized))
+        .isEqualTo(key);
+  }
+
+  /**
+   * See {@link com.google.gerrit.server.cache.testing.SerializedClassSubject} for background and
+   * what to do if this test fails.
+   */
+  @Test
+  public void keyFields() throws Exception {
+    assertThatSerializedClass(MergeabilityCacheImpl.EntryKey.class)
+        .hasFields(
+            ImmutableMap.of(
+                "commit", ObjectId.class,
+                "into", ObjectId.class,
+                "submitType", SubmitType.class,
+                "mergeStrategy", String.class));
+  }
+}
diff --git a/javatests/com/google/gerrit/server/change/WalkSorterTest.java b/javatests/com/google/gerrit/server/change/WalkSorterTest.java
new file mode 100644
index 0000000..189dfbc
--- /dev/null
+++ b/javatests/com/google/gerrit/server/change/WalkSorterTest.java
@@ -0,0 +1,374 @@
+// Copyright (C) 2015 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.google.gerrit.server.change;
+
+import static com.google.common.collect.Collections2.permutations;
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RevId;
+import com.google.gerrit.server.change.WalkSorter.PatchSetData;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.testing.GerritBaseTests;
+import com.google.gerrit.testing.InMemoryRepositoryManager;
+import com.google.gerrit.testing.InMemoryRepositoryManager.Repo;
+import com.google.gerrit.testing.TestChanges;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.junit.Before;
+import org.junit.Test;
+
+public class WalkSorterTest extends GerritBaseTests {
+  private Account.Id userId;
+  private InMemoryRepositoryManager repoManager;
+
+  @Before
+  public void setUp() {
+    userId = new Account.Id(1);
+    repoManager = new InMemoryRepositoryManager();
+  }
+
+  @Test
+  public void seriesOfChanges() throws Exception {
+    TestRepository<Repo> p = newRepo("p");
+    RevCommit c1_1 = p.commit().create();
+    RevCommit c2_1 = p.commit().parent(c1_1).create();
+    RevCommit c3_1 = p.commit().parent(c2_1).create();
+
+    ChangeData cd1 = newChange(p, c1_1);
+    ChangeData cd2 = newChange(p, c2_1);
+    ChangeData cd3 = newChange(p, c3_1);
+
+    List<ChangeData> changes = ImmutableList.of(cd1, cd2, cd3);
+    WalkSorter sorter = new WalkSorter(repoManager);
+
+    assertSorted(
+        sorter,
+        changes,
+        ImmutableList.of(
+            patchSetData(cd3, c3_1), patchSetData(cd2, c2_1), patchSetData(cd1, c1_1)));
+
+    // Add new patch sets whose commits are in reverse order, so output is in
+    // reverse order.
+    RevCommit c3_2 = p.commit().create();
+    RevCommit c2_2 = p.commit().parent(c3_2).create();
+    RevCommit c1_2 = p.commit().parent(c2_2).create();
+
+    addPatchSet(cd1, c1_2);
+    addPatchSet(cd2, c2_2);
+    addPatchSet(cd3, c3_2);
+
+    assertSorted(
+        sorter,
+        changes,
+        ImmutableList.of(
+            patchSetData(cd1, c1_2), patchSetData(cd2, c2_2), patchSetData(cd3, c3_2)));
+  }
+
+  @Test
+  public void subsetOfSeriesOfChanges() throws Exception {
+    TestRepository<Repo> p = newRepo("p");
+    RevCommit c1_1 = p.commit().create();
+    RevCommit c2_1 = p.commit().parent(c1_1).create();
+    RevCommit c3_1 = p.commit().parent(c2_1).create();
+
+    ChangeData cd1 = newChange(p, c1_1);
+    ChangeData cd3 = newChange(p, c3_1);
+
+    List<ChangeData> changes = ImmutableList.of(cd1, cd3);
+    WalkSorter sorter = new WalkSorter(repoManager);
+
+    assertSorted(
+        sorter, changes, ImmutableList.of(patchSetData(cd3, c3_1), patchSetData(cd1, c1_1)));
+  }
+
+  @Test
+  public void seriesOfChangesAtSameTimestamp() throws Exception {
+    TestRepository<Repo> p = newRepo("p");
+    RevCommit c0 = p.commit().tick(0).create();
+    RevCommit c1 = p.commit().tick(0).parent(c0).create();
+    RevCommit c2 = p.commit().tick(0).parent(c1).create();
+    RevCommit c3 = p.commit().tick(0).parent(c2).create();
+    RevCommit c4 = p.commit().tick(0).parent(c3).create();
+
+    RevWalk rw = p.getRevWalk();
+    rw.parseCommit(c1);
+    assertThat(rw.parseCommit(c2).getCommitTime()).isEqualTo(c1.getCommitTime());
+    assertThat(rw.parseCommit(c3).getCommitTime()).isEqualTo(c1.getCommitTime());
+    assertThat(rw.parseCommit(c4).getCommitTime()).isEqualTo(c1.getCommitTime());
+
+    ChangeData cd1 = newChange(p, c1);
+    ChangeData cd2 = newChange(p, c2);
+    ChangeData cd3 = newChange(p, c3);
+    ChangeData cd4 = newChange(p, c4);
+
+    List<ChangeData> changes = ImmutableList.of(cd1, cd2, cd3, cd4);
+    WalkSorter sorter = new WalkSorter(repoManager);
+
+    assertSorted(
+        sorter,
+        changes,
+        ImmutableList.of(
+            patchSetData(cd4, c4),
+            patchSetData(cd3, c3),
+            patchSetData(cd2, c2),
+            patchSetData(cd1, c1)));
+  }
+
+  @Test
+  public void seriesOfChangesWithReverseTimestamps() throws Exception {
+    TestRepository<Repo> p = newRepo("p");
+    RevCommit c0 = p.commit().tick(-1).create();
+    RevCommit c1 = p.commit().tick(-1).parent(c0).create();
+    RevCommit c2 = p.commit().tick(-1).parent(c1).create();
+    RevCommit c3 = p.commit().tick(-1).parent(c2).create();
+    RevCommit c4 = p.commit().tick(-1).parent(c3).create();
+
+    RevWalk rw = p.getRevWalk();
+    rw.parseCommit(c1);
+    assertThat(rw.parseCommit(c2).getCommitTime()).isLessThan(c1.getCommitTime());
+    assertThat(rw.parseCommit(c3).getCommitTime()).isLessThan(c2.getCommitTime());
+    assertThat(rw.parseCommit(c4).getCommitTime()).isLessThan(c3.getCommitTime());
+
+    ChangeData cd1 = newChange(p, c1);
+    ChangeData cd2 = newChange(p, c2);
+    ChangeData cd3 = newChange(p, c3);
+    ChangeData cd4 = newChange(p, c4);
+
+    List<ChangeData> changes = ImmutableList.of(cd1, cd2, cd3, cd4);
+    WalkSorter sorter = new WalkSorter(repoManager);
+
+    assertSorted(
+        sorter,
+        changes,
+        ImmutableList.of(
+            patchSetData(cd4, c4),
+            patchSetData(cd3, c3),
+            patchSetData(cd2, c2),
+            patchSetData(cd1, c1)));
+  }
+
+  @Test
+  public void subsetOfSeriesOfChangesWithReverseTimestamps() throws Exception {
+    TestRepository<Repo> p = newRepo("p");
+    RevCommit c0 = p.commit().tick(-1).create();
+    RevCommit c1 = p.commit().tick(-1).parent(c0).create();
+    RevCommit c2 = p.commit().tick(-1).parent(c1).create();
+    RevCommit c3 = p.commit().tick(-1).parent(c2).create();
+    RevCommit c4 = p.commit().tick(-1).parent(c3).create();
+
+    RevWalk rw = p.getRevWalk();
+    rw.parseCommit(c1);
+    assertThat(rw.parseCommit(c2).getCommitTime()).isLessThan(c1.getCommitTime());
+    assertThat(rw.parseCommit(c3).getCommitTime()).isLessThan(c2.getCommitTime());
+    assertThat(rw.parseCommit(c4).getCommitTime()).isLessThan(c3.getCommitTime());
+
+    ChangeData cd1 = newChange(p, c1);
+    ChangeData cd2 = newChange(p, c2);
+    ChangeData cd4 = newChange(p, c4);
+
+    List<ChangeData> changes = ImmutableList.of(cd1, cd2, cd4);
+    WalkSorter sorter = new WalkSorter(repoManager);
+    List<PatchSetData> expected =
+        ImmutableList.of(patchSetData(cd4, c4), patchSetData(cd2, c2), patchSetData(cd1, c1));
+
+    for (List<ChangeData> list : permutations(changes)) {
+      // Not inOrder(); since child of c2 is missing, partial topo sort isn't
+      // guaranteed to work.
+      assertThat(sorter.sort(list)).containsExactlyElementsIn(expected);
+    }
+  }
+
+  @Test
+  public void seriesOfChangesAtSameTimestampWithRootCommit() throws Exception {
+    TestRepository<Repo> p = newRepo("p");
+    RevCommit c1 = p.commit().tick(0).create();
+    RevCommit c2 = p.commit().tick(0).parent(c1).create();
+    RevCommit c3 = p.commit().tick(0).parent(c2).create();
+    RevCommit c4 = p.commit().tick(0).parent(c3).create();
+
+    RevWalk rw = p.getRevWalk();
+    rw.parseCommit(c1);
+    assertThat(rw.parseCommit(c2).getCommitTime()).isEqualTo(c1.getCommitTime());
+    assertThat(rw.parseCommit(c3).getCommitTime()).isEqualTo(c1.getCommitTime());
+    assertThat(rw.parseCommit(c4).getCommitTime()).isEqualTo(c1.getCommitTime());
+
+    ChangeData cd1 = newChange(p, c1);
+    ChangeData cd2 = newChange(p, c2);
+    ChangeData cd3 = newChange(p, c3);
+    ChangeData cd4 = newChange(p, c4);
+
+    List<ChangeData> changes = ImmutableList.of(cd1, cd2, cd3, cd4);
+    WalkSorter sorter = new WalkSorter(repoManager);
+
+    assertSorted(
+        sorter,
+        changes,
+        ImmutableList.of(
+            patchSetData(cd4, c4),
+            patchSetData(cd3, c3),
+            patchSetData(cd2, c2),
+            patchSetData(cd1, c1)));
+  }
+
+  @Test
+  public void projectsSortedByName() throws Exception {
+    TestRepository<Repo> pa = newRepo("a");
+    TestRepository<Repo> pb = newRepo("b");
+    RevCommit c1 = pa.commit().create();
+    RevCommit c2 = pb.commit().create();
+    RevCommit c3 = pa.commit().parent(c1).create();
+    RevCommit c4 = pb.commit().parent(c2).create();
+
+    ChangeData cd1 = newChange(pa, c1);
+    ChangeData cd2 = newChange(pb, c2);
+    ChangeData cd3 = newChange(pa, c3);
+    ChangeData cd4 = newChange(pb, c4);
+
+    assertSorted(
+        new WalkSorter(repoManager),
+        ImmutableList.of(cd1, cd2, cd3, cd4),
+        ImmutableList.of(
+            patchSetData(cd3, c3),
+            patchSetData(cd1, c1),
+            patchSetData(cd4, c4),
+            patchSetData(cd2, c2)));
+  }
+
+  @Test
+  public void restrictToPatchSets() throws Exception {
+    TestRepository<Repo> p = newRepo("p");
+    RevCommit c1_1 = p.commit().create();
+    RevCommit c2_1 = p.commit().parent(c1_1).create();
+
+    ChangeData cd1 = newChange(p, c1_1);
+    ChangeData cd2 = newChange(p, c2_1);
+
+    // Add new patch sets whose commits are in reverse order.
+    RevCommit c2_2 = p.commit().create();
+    RevCommit c1_2 = p.commit().parent(c2_2).create();
+
+    addPatchSet(cd1, c1_2);
+    addPatchSet(cd2, c2_2);
+
+    List<ChangeData> changes = ImmutableList.of(cd1, cd2);
+    WalkSorter sorter = new WalkSorter(repoManager);
+
+    assertSorted(
+        sorter, changes, ImmutableList.of(patchSetData(cd1, c1_2), patchSetData(cd2, c2_2)));
+
+    // If we restrict to PS1 of each change, the sorter uses that commit.
+    sorter.includePatchSets(
+        ImmutableSet.of(new PatchSet.Id(cd1.getId(), 1), new PatchSet.Id(cd2.getId(), 1)));
+    assertSorted(
+        sorter, changes, ImmutableList.of(patchSetData(cd2, 1, c2_1), patchSetData(cd1, 1, c1_1)));
+  }
+
+  @Test
+  public void restrictToPatchSetsOmittingWholeProject() throws Exception {
+    TestRepository<Repo> pa = newRepo("a");
+    TestRepository<Repo> pb = newRepo("b");
+    RevCommit c1 = pa.commit().create();
+    RevCommit c2 = pa.commit().create();
+
+    ChangeData cd1 = newChange(pa, c1);
+    ChangeData cd2 = newChange(pb, c2);
+
+    List<ChangeData> changes = ImmutableList.of(cd1, cd2);
+    WalkSorter sorter =
+        new WalkSorter(repoManager)
+            .includePatchSets(ImmutableSet.of(cd1.currentPatchSet().getId()));
+
+    assertSorted(sorter, changes, ImmutableList.of(patchSetData(cd1, c1)));
+  }
+
+  @Test
+  public void retainBody() throws Exception {
+    TestRepository<Repo> p = newRepo("p");
+    RevCommit c = p.commit().message("message").create();
+    ChangeData cd = newChange(p, c);
+
+    List<ChangeData> changes = ImmutableList.of(cd);
+    RevCommit actual =
+        new WalkSorter(repoManager).setRetainBody(true).sort(changes).iterator().next().commit();
+    assertThat(actual.getRawBuffer()).isNotNull();
+    assertThat(actual.getShortMessage()).isEqualTo("message");
+
+    actual =
+        new WalkSorter(repoManager).setRetainBody(false).sort(changes).iterator().next().commit();
+    assertThat(actual.getRawBuffer()).isNull();
+  }
+
+  @Test
+  public void oneChange() throws Exception {
+    TestRepository<Repo> p = newRepo("p");
+    RevCommit c = p.commit().create();
+    ChangeData cd = newChange(p, c);
+
+    List<ChangeData> changes = ImmutableList.of(cd);
+    WalkSorter sorter = new WalkSorter(repoManager);
+
+    assertSorted(sorter, changes, ImmutableList.of(patchSetData(cd, c)));
+  }
+
+  private ChangeData newChange(TestRepository<Repo> tr, ObjectId id) throws Exception {
+    Project.NameKey project = tr.getRepository().getDescription().getProject();
+    Change c = TestChanges.newChange(project, userId);
+    ChangeData cd = ChangeData.createForTest(project, c.getId(), 1);
+    cd.setChange(c);
+    cd.currentPatchSet().setRevision(new RevId(id.name()));
+    cd.setPatchSets(ImmutableList.of(cd.currentPatchSet()));
+    return cd;
+  }
+
+  private PatchSet addPatchSet(ChangeData cd, ObjectId id) throws Exception {
+    TestChanges.incrementPatchSet(cd.change());
+    PatchSet ps = new PatchSet(cd.change().currentPatchSetId());
+    ps.setRevision(new RevId(id.name()));
+    List<PatchSet> patchSets = new ArrayList<>(cd.patchSets());
+    patchSets.add(ps);
+    cd.setPatchSets(patchSets);
+    return ps;
+  }
+
+  private TestRepository<Repo> newRepo(String name) throws Exception {
+    return new TestRepository<>(repoManager.createRepository(new Project.NameKey(name)));
+  }
+
+  private static PatchSetData patchSetData(ChangeData cd, RevCommit commit) throws Exception {
+    return PatchSetData.create(cd, cd.currentPatchSet(), commit);
+  }
+
+  private static PatchSetData patchSetData(ChangeData cd, int psId, RevCommit commit)
+      throws Exception {
+    return PatchSetData.create(cd, cd.patchSet(new PatchSet.Id(cd.getId(), psId)), commit);
+  }
+
+  private static void assertSorted(
+      WalkSorter sorter, List<ChangeData> changes, List<PatchSetData> expected) throws Exception {
+    for (List<ChangeData> list : permutations(changes)) {
+      assertThat(sorter.sort(list)).containsExactlyElementsIn(expected).inOrder();
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/server/config/ConfigUtilTest.java b/javatests/com/google/gerrit/server/config/ConfigUtilTest.java
new file mode 100644
index 0000000..231b584
--- /dev/null
+++ b/javatests/com/google/gerrit/server/config/ConfigUtilTest.java
@@ -0,0 +1,196 @@
+// Copyright (C) 2010 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.google.gerrit.server.config;
+
+import static com.google.common.truth.Truth.assertThat;
+import static java.util.concurrent.TimeUnit.DAYS;
+import static java.util.concurrent.TimeUnit.HOURS;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.MINUTES;
+import static java.util.concurrent.TimeUnit.SECONDS;
+
+import com.google.gerrit.extensions.client.Theme;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.lib.Config;
+import org.junit.Test;
+
+public class ConfigUtilTest {
+  private static final String SECT = "foo";
+  private static final String SUB = "bar";
+
+  static class SectionInfo {
+    public static final String CONSTANT = "42";
+    public transient String missing;
+    public int i;
+    public Integer ii;
+    public Integer id;
+    public long l;
+    public Long ll;
+    public Long ld;
+    public boolean b;
+    public Boolean bb;
+    public Boolean bd;
+    public String s;
+    public String sd;
+    public String nd;
+    public Theme t;
+    public Theme td;
+    public List<String> list;
+    public Map<String, String> map;
+
+    static SectionInfo defaults() {
+      SectionInfo i = new SectionInfo();
+      i.i = 1;
+      i.ii = 2;
+      i.id = 3;
+      i.l = 4L;
+      i.ll = 5L;
+      i.ld = 6L;
+      i.b = true;
+      i.bb = false;
+      i.bd = true;
+      i.s = "foo";
+      i.sd = "bar";
+      // i.nd = null; // Don't need to explicitly set it; it's null by default
+      i.t = Theme.DEFAULT;
+      i.td = Theme.DEFAULT;
+      return i;
+    }
+  }
+
+  @Test
+  public void storeLoadSection() throws Exception {
+    SectionInfo d = SectionInfo.defaults();
+    SectionInfo in = new SectionInfo();
+    in.missing = "42";
+    in.i = 1;
+    in.ii = 43;
+    in.l = 4L;
+    in.ll = -43L;
+    in.b = false;
+    in.bb = true;
+    in.bd = false;
+    in.s = "baz";
+    in.t = Theme.MIDNIGHT;
+
+    Config cfg = new Config();
+    ConfigUtil.storeSection(cfg, SECT, SUB, in, d);
+
+    assertThat(cfg.getString(SECT, SUB, "CONSTANT")).isNull();
+    assertThat(cfg.getString(SECT, SUB, "missing")).isNull();
+    assertThat(cfg.getBoolean(SECT, SUB, "b", false)).isEqualTo(in.b);
+    assertThat(cfg.getBoolean(SECT, SUB, "bb", false)).isEqualTo(in.bb);
+    assertThat(cfg.getInt(SECT, SUB, "i", 0)).isEqualTo(0);
+    assertThat(cfg.getInt(SECT, SUB, "ii", 0)).isEqualTo(in.ii);
+    assertThat(cfg.getLong(SECT, SUB, "l", 0L)).isEqualTo(0L);
+    assertThat(cfg.getLong(SECT, SUB, "ll", 0L)).isEqualTo(in.ll);
+    assertThat(cfg.getString(SECT, SUB, "s")).isEqualTo(in.s);
+    assertThat(cfg.getString(SECT, SUB, "sd")).isNull();
+    assertThat(cfg.getString(SECT, SUB, "nd")).isNull();
+
+    SectionInfo out = new SectionInfo();
+    ConfigUtil.loadSection(cfg, SECT, SUB, out, d, null);
+    assertThat(out.i).isEqualTo(in.i);
+    assertThat(out.ii).isEqualTo(in.ii);
+    assertThat(out.id).isEqualTo(d.id);
+    assertThat(out.l).isEqualTo(in.l);
+    assertThat(out.ll).isEqualTo(in.ll);
+    assertThat(out.ld).isEqualTo(d.ld);
+    assertThat(out.b).isEqualTo(in.b);
+    assertThat(out.bb).isEqualTo(in.bb);
+    assertThat(out.bd).isNull();
+    assertThat(out.s).isEqualTo(in.s);
+    assertThat(out.sd).isEqualTo(d.sd);
+    assertThat(out.nd).isNull();
+    assertThat(out.t).isEqualTo(in.t);
+    assertThat(out.td).isEqualTo(d.td);
+  }
+
+  @Test
+  public void mergeSection() throws Exception {
+    SectionInfo d = SectionInfo.defaults();
+    Config cfg = new Config();
+    ConfigUtil.storeSection(cfg, SECT, SUB, d, d);
+
+    SectionInfo in = new SectionInfo();
+    in.i = 42;
+
+    SectionInfo out = new SectionInfo();
+    ConfigUtil.loadSection(cfg, SECT, SUB, out, d, in);
+    // Check original values preserved
+    assertThat(out.id).isEqualTo(d.id);
+    // Check merged values
+    assertThat(out.i).isEqualTo(in.i);
+    // Check that boolean attribute not nullified
+    assertThat(out.bb).isFalse();
+  }
+
+  @Test
+  public void timeUnit() {
+    assertThat(parse("0")).isEqualTo(ms(0, MILLISECONDS));
+    assertThat(parse("2ms")).isEqualTo(ms(2, MILLISECONDS));
+    assertThat(parse("200 milliseconds")).isEqualTo(ms(200, MILLISECONDS));
+
+    assertThat(parse("0s")).isEqualTo(ms(0, SECONDS));
+    assertThat(parse("2s")).isEqualTo(ms(2, SECONDS));
+    assertThat(parse("231sec")).isEqualTo(ms(231, SECONDS));
+    assertThat(parse("1second")).isEqualTo(ms(1, SECONDS));
+    assertThat(parse("300 seconds")).isEqualTo(ms(300, SECONDS));
+
+    assertThat(parse("2m")).isEqualTo(ms(2, MINUTES));
+    assertThat(parse("2min")).isEqualTo(ms(2, MINUTES));
+    assertThat(parse("1 minute")).isEqualTo(ms(1, MINUTES));
+    assertThat(parse("10 minutes")).isEqualTo(ms(10, MINUTES));
+
+    assertThat(parse("5h")).isEqualTo(ms(5, HOURS));
+    assertThat(parse("5hr")).isEqualTo(ms(5, HOURS));
+    assertThat(parse("1hour")).isEqualTo(ms(1, HOURS));
+    assertThat(parse("48hours")).isEqualTo(ms(48, HOURS));
+
+    assertThat(parse("5 h")).isEqualTo(ms(5, HOURS));
+    assertThat(parse("5 hr")).isEqualTo(ms(5, HOURS));
+    assertThat(parse("1 hour")).isEqualTo(ms(1, HOURS));
+    assertThat(parse("48 hours")).isEqualTo(ms(48, HOURS));
+    assertThat(parse("48 \t \r hours")).isEqualTo(ms(48, HOURS));
+
+    assertThat(parse("4d")).isEqualTo(ms(4, DAYS));
+    assertThat(parse("1day")).isEqualTo(ms(1, DAYS));
+    assertThat(parse("14days")).isEqualTo(ms(14, DAYS));
+
+    assertThat(parse("1w")).isEqualTo(ms(7, DAYS));
+    assertThat(parse("1week")).isEqualTo(ms(7, DAYS));
+    assertThat(parse("2w")).isEqualTo(ms(14, DAYS));
+    assertThat(parse("2weeks")).isEqualTo(ms(14, DAYS));
+
+    assertThat(parse("1mon")).isEqualTo(ms(30, DAYS));
+    assertThat(parse("1month")).isEqualTo(ms(30, DAYS));
+    assertThat(parse("2mon")).isEqualTo(ms(60, DAYS));
+    assertThat(parse("2months")).isEqualTo(ms(60, DAYS));
+
+    assertThat(parse("1y")).isEqualTo(ms(365, DAYS));
+    assertThat(parse("1year")).isEqualTo(ms(365, DAYS));
+    assertThat(parse("2years")).isEqualTo(ms(365 * 2, DAYS));
+  }
+
+  private static long ms(int cnt, TimeUnit unit) {
+    return MILLISECONDS.convert(cnt, unit);
+  }
+
+  private static long parse(String string) {
+    return ConfigUtil.getTimeUnit(string, 1, MILLISECONDS);
+  }
+}
diff --git a/javatests/com/google/gerrit/server/config/GitwebConfigTest.java b/javatests/com/google/gerrit/server/config/GitwebConfigTest.java
new file mode 100644
index 0000000..cb6de34
--- /dev/null
+++ b/javatests/com/google/gerrit/server/config/GitwebConfigTest.java
@@ -0,0 +1,42 @@
+// Copyright (C) 2011 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.google.gerrit.server.config;
+
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import org.junit.Test;
+
+public class GitwebConfigTest {
+  private static final String VALID_CHARACTERS = "*()";
+  private static final String SOME_INVALID_CHARACTERS = "09AZaz$-_.+!',";
+
+  @Test
+  public void validPathSeparator() {
+    for (char c : VALID_CHARACTERS.toCharArray()) {
+      assertWithMessage("valid character rejected: " + c)
+          .that(GitwebConfig.isValidPathSeparator(c))
+          .isTrue();
+    }
+  }
+
+  @Test
+  public void inalidPathSeparator() {
+    for (char c : SOME_INVALID_CHARACTERS.toCharArray()) {
+      assertWithMessage("invalid character accepted: " + c)
+          .that(GitwebConfig.isValidPathSeparator(c))
+          .isFalse();
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/server/config/ListCapabilitiesTest.java b/javatests/com/google/gerrit/server/config/ListCapabilitiesTest.java
new file mode 100644
index 0000000..fd9c925
--- /dev/null
+++ b/javatests/com/google/gerrit/server/config/ListCapabilitiesTest.java
@@ -0,0 +1,99 @@
+// Copyright (C) 2013 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.google.gerrit.server.config;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.annotations.Exports;
+import com.google.gerrit.extensions.config.CapabilityDefinition;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.reviewdb.client.Account.Id;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.restapi.config.ListCapabilities;
+import com.google.gerrit.server.restapi.config.ListCapabilities.CapabilityInfo;
+import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Singleton;
+import java.util.Map;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ListCapabilitiesTest {
+  private Injector injector;
+
+  @Before
+  public void setUp() throws Exception {
+    AbstractModule mod =
+        new AbstractModule() {
+          @Override
+          protected void configure() {
+            DynamicMap.mapOf(binder(), CapabilityDefinition.class);
+            bind(CapabilityDefinition.class)
+                .annotatedWith(Exports.named("printHello"))
+                .toInstance(
+                    new CapabilityDefinition() {
+                      @Override
+                      public String getDescription() {
+                        return "Print Hello";
+                      }
+                    });
+            bind(PermissionBackend.class).to(FakePermissionBackend.class);
+          }
+        };
+    injector = Guice.createInjector(mod);
+  }
+
+  @Test
+  public void list() throws Exception {
+    Map<String, CapabilityInfo> m =
+        injector.getInstance(ListCapabilities.class).apply(new ConfigResource());
+    for (String id : GlobalCapability.getAllNames()) {
+      assertThat(m).containsKey(id);
+      assertThat(m.get(id).id).isEqualTo(id);
+      assertThat(m.get(id).name).isNotNull();
+    }
+
+    String pluginCapability = "gerrit-printHello";
+    assertThat(m).containsKey(pluginCapability);
+    assertThat(m.get(pluginCapability).id).isEqualTo(pluginCapability);
+    assertThat(m.get(pluginCapability).name).isEqualTo("Print Hello");
+  }
+
+  @Singleton
+  private static class FakePermissionBackend extends PermissionBackend {
+    @Override
+    public WithUser currentUser() {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public WithUser user(CurrentUser user) {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public WithUser absentUser(Id id) {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public boolean usesDefaultCapabilities() {
+      return true;
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/server/config/RepositoryConfigTest.java b/javatests/com/google/gerrit/server/config/RepositoryConfigTest.java
new file mode 100644
index 0000000..2edcf7c
--- /dev/null
+++ b/javatests/com/google/gerrit/server/config/RepositoryConfigTest.java
@@ -0,0 +1,207 @@
+// Copyright (C) 2014 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.google.gerrit.server.config;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth8.assertThat;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.reviewdb.client.Project.NameKey;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+import org.eclipse.jgit.lib.Config;
+import org.junit.Before;
+import org.junit.Test;
+
+public class RepositoryConfigTest {
+
+  private Config cfg;
+  private RepositoryConfig repoCfg;
+
+  @Before
+  public void setUp() throws Exception {
+    cfg = new Config();
+    repoCfg = new RepositoryConfig(cfg);
+  }
+
+  @Test
+  public void defaultSubmitTypeWhenNotConfigured() {
+    // Check expected value explicitly rather than depending on constant.
+    assertThat(repoCfg.getDefaultSubmitType(new NameKey("someProject")))
+        .isEqualTo(SubmitType.INHERIT);
+  }
+
+  @Test
+  public void defaultSubmitTypeForStarFilter() {
+    configureDefaultSubmitType("*", SubmitType.CHERRY_PICK);
+    assertThat(repoCfg.getDefaultSubmitType(new NameKey("someProject")))
+        .isEqualTo(SubmitType.CHERRY_PICK);
+
+    configureDefaultSubmitType("*", SubmitType.FAST_FORWARD_ONLY);
+    assertThat(repoCfg.getDefaultSubmitType(new NameKey("someProject")))
+        .isEqualTo(SubmitType.FAST_FORWARD_ONLY);
+
+    configureDefaultSubmitType("*", SubmitType.REBASE_IF_NECESSARY);
+    assertThat(repoCfg.getDefaultSubmitType(new NameKey("someProject")))
+        .isEqualTo(SubmitType.REBASE_IF_NECESSARY);
+
+    configureDefaultSubmitType("*", SubmitType.REBASE_ALWAYS);
+    assertThat(repoCfg.getDefaultSubmitType(new NameKey("someProject")))
+        .isEqualTo(SubmitType.REBASE_ALWAYS);
+  }
+
+  @Test
+  public void defaultSubmitTypeForSpecificFilter() {
+    configureDefaultSubmitType("someProject", SubmitType.CHERRY_PICK);
+    assertThat(repoCfg.getDefaultSubmitType(new NameKey("someOtherProject")))
+        .isEqualTo(RepositoryConfig.DEFAULT_SUBMIT_TYPE);
+    assertThat(repoCfg.getDefaultSubmitType(new NameKey("someProject")))
+        .isEqualTo(SubmitType.CHERRY_PICK);
+  }
+
+  @Test
+  public void defaultSubmitTypeForStartWithFilter() {
+    configureDefaultSubmitType("somePath/somePath/*", SubmitType.REBASE_IF_NECESSARY);
+    configureDefaultSubmitType("somePath/*", SubmitType.CHERRY_PICK);
+    configureDefaultSubmitType("*", SubmitType.MERGE_ALWAYS);
+
+    assertThat(repoCfg.getDefaultSubmitType(new NameKey("someProject")))
+        .isEqualTo(SubmitType.MERGE_ALWAYS);
+
+    assertThat(repoCfg.getDefaultSubmitType(new NameKey("somePath/someProject")))
+        .isEqualTo(SubmitType.CHERRY_PICK);
+
+    assertThat(repoCfg.getDefaultSubmitType(new NameKey("somePath/somePath/someProject")))
+        .isEqualTo(SubmitType.REBASE_IF_NECESSARY);
+  }
+
+  private void configureDefaultSubmitType(String projectFilter, SubmitType submitType) {
+    cfg.setString(
+        RepositoryConfig.SECTION_NAME,
+        projectFilter,
+        RepositoryConfig.DEFAULT_SUBMIT_TYPE_NAME,
+        submitType.toString());
+  }
+
+  @Test
+  public void ownerGroupsWhenNotConfigured() {
+    assertThat(repoCfg.getOwnerGroups(new NameKey("someProject"))).isEmpty();
+  }
+
+  @Test
+  public void ownerGroupsForStarFilter() {
+    ImmutableList<String> ownerGroups = ImmutableList.of("group1", "group2");
+    configureOwnerGroups("*", ownerGroups);
+    assertThat(repoCfg.getOwnerGroups(new NameKey("someProject")))
+        .containsExactlyElementsIn(ownerGroups);
+  }
+
+  @Test
+  public void ownerGroupsForSpecificFilter() {
+    ImmutableList<String> ownerGroups = ImmutableList.of("group1", "group2");
+    configureOwnerGroups("someProject", ownerGroups);
+    assertThat(repoCfg.getOwnerGroups(new NameKey("someOtherProject"))).isEmpty();
+    assertThat(repoCfg.getOwnerGroups(new NameKey("someProject")))
+        .containsExactlyElementsIn(ownerGroups);
+  }
+
+  @Test
+  public void ownerGroupsForStartWithFilter() {
+    ImmutableList<String> ownerGroups1 = ImmutableList.of("group1");
+    ImmutableList<String> ownerGroups2 = ImmutableList.of("group2");
+    ImmutableList<String> ownerGroups3 = ImmutableList.of("group3");
+
+    configureOwnerGroups("*", ownerGroups1);
+    configureOwnerGroups("somePath/*", ownerGroups2);
+    configureOwnerGroups("somePath/somePath/*", ownerGroups3);
+
+    assertThat(repoCfg.getOwnerGroups(new NameKey("someProject")))
+        .containsExactlyElementsIn(ownerGroups1);
+
+    assertThat(repoCfg.getOwnerGroups(new NameKey("somePath/someProject")))
+        .containsExactlyElementsIn(ownerGroups2);
+
+    assertThat(repoCfg.getOwnerGroups(new NameKey("somePath/somePath/someProject")))
+        .containsExactlyElementsIn(ownerGroups3);
+  }
+
+  private void configureOwnerGroups(String projectFilter, List<String> ownerGroups) {
+    cfg.setStringList(
+        RepositoryConfig.SECTION_NAME,
+        projectFilter,
+        RepositoryConfig.OWNER_GROUP_NAME,
+        ownerGroups);
+  }
+
+  @Test
+  public void basePathWhenNotConfigured() {
+    assertThat(repoCfg.getBasePath(new NameKey("someProject"))).isNull();
+  }
+
+  @Test
+  public void basePathForStarFilter() {
+    String basePath = "/someAbsolutePath/someDirectory";
+    configureBasePath("*", basePath);
+    assertThat(repoCfg.getBasePath(new NameKey("someProject")).toString()).isEqualTo(basePath);
+  }
+
+  @Test
+  public void basePathForSpecificFilter() {
+    String basePath = "/someAbsolutePath/someDirectory";
+    configureBasePath("someProject", basePath);
+    assertThat(repoCfg.getBasePath(new NameKey("someOtherProject"))).isNull();
+    assertThat(repoCfg.getBasePath(new NameKey("someProject")).toString()).isEqualTo(basePath);
+  }
+
+  @Test
+  public void basePathForStartWithFilter() {
+    String basePath1 = "/someAbsolutePath1/someDirectory";
+    String basePath2 = "someRelativeDirectory2";
+    String basePath3 = "/someAbsolutePath3/someDirectory";
+    String basePath4 = "/someAbsolutePath4/someDirectory";
+
+    configureBasePath("pro*", basePath1);
+    configureBasePath("project/project/*", basePath2);
+    configureBasePath("project/*", basePath3);
+    configureBasePath("*", basePath4);
+
+    assertThat(repoCfg.getBasePath(new NameKey("project1")).toString()).isEqualTo(basePath1);
+    assertThat(repoCfg.getBasePath(new NameKey("project/project/someProject")).toString())
+        .isEqualTo(basePath2);
+    assertThat(repoCfg.getBasePath(new NameKey("project/someProject")).toString())
+        .isEqualTo(basePath3);
+    assertThat(repoCfg.getBasePath(new NameKey("someProject")).toString()).isEqualTo(basePath4);
+  }
+
+  @Test
+  public void allBasePath() {
+    ImmutableList<Path> allBasePaths =
+        ImmutableList.of(
+            Paths.get("/someBasePath1"), Paths.get("/someBasePath2"), Paths.get("/someBasePath2"));
+
+    configureBasePath("*", allBasePaths.get(0).toString());
+    configureBasePath("project/*", allBasePaths.get(1).toString());
+    configureBasePath("project/project/*", allBasePaths.get(2).toString());
+
+    assertThat(repoCfg.getAllBasePaths()).isEqualTo(allBasePaths);
+  }
+
+  private void configureBasePath(String projectFilter, String basePath) {
+    cfg.setString(
+        RepositoryConfig.SECTION_NAME, projectFilter, RepositoryConfig.BASE_PATH_NAME, basePath);
+  }
+}
diff --git a/javatests/com/google/gerrit/server/config/ScheduleConfigTest.java b/javatests/com/google/gerrit/server/config/ScheduleConfigTest.java
new file mode 100644
index 0000000..70893a9
--- /dev/null
+++ b/javatests/com/google/gerrit/server/config/ScheduleConfigTest.java
@@ -0,0 +1,234 @@
+// Copyright (C) 2014 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.google.gerrit.server.config;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth8.assertThat;
+import static java.util.concurrent.TimeUnit.DAYS;
+import static java.util.concurrent.TimeUnit.HOURS;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.MINUTES;
+
+import com.google.gerrit.server.config.ScheduleConfig.Schedule;
+import java.time.LocalDateTime;
+import java.time.Month;
+import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
+import java.util.Optional;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.lib.Config;
+import org.junit.Test;
+
+public class ScheduleConfigTest {
+
+  // Friday June 13, 2014 10:00 UTC
+  private static final ZonedDateTime NOW =
+      LocalDateTime.of(2014, Month.JUNE, 13, 10, 0, 0).atOffset(ZoneOffset.UTC).toZonedDateTime();
+
+  @Test
+  public void initialDelay() throws Exception {
+    assertThat(initialDelay("11:00", "1h")).isEqualTo(ms(1, HOURS));
+    assertThat(initialDelay("05:30", "1h")).isEqualTo(ms(30, MINUTES));
+    assertThat(initialDelay("09:30", "1h")).isEqualTo(ms(30, MINUTES));
+    assertThat(initialDelay("13:30", "1h")).isEqualTo(ms(30, MINUTES));
+    assertThat(initialDelay("13:59", "1h")).isEqualTo(ms(59, MINUTES));
+
+    assertThat(initialDelay("11:00", "1d")).isEqualTo(ms(1, HOURS));
+    assertThat(initialDelay("05:30", "1d")).isEqualTo(ms(19, HOURS) + ms(30, MINUTES));
+
+    assertThat(initialDelay("11:00", "1w")).isEqualTo(ms(1, HOURS));
+    assertThat(initialDelay("05:30", "1w")).isEqualTo(ms(7, DAYS) - ms(4, HOURS) - ms(30, MINUTES));
+
+    assertThat(initialDelay("Mon 11:00", "1w")).isEqualTo(ms(3, DAYS) + ms(1, HOURS));
+    assertThat(initialDelay("Fri 11:00", "1w")).isEqualTo(ms(1, HOURS));
+
+    assertThat(initialDelay("Mon 11:00", "1d")).isEqualTo(ms(1, HOURS));
+    assertThat(initialDelay("Mon 09:00", "1d")).isEqualTo(ms(23, HOURS));
+    assertThat(initialDelay("Mon 10:00", "1d")).isEqualTo(ms(1, DAYS));
+    assertThat(initialDelay("Mon 10:00", "1d")).isEqualTo(ms(1, DAYS));
+  }
+
+  @Test
+  public void defaultKeysWithoutSubsection() {
+    Config rc = new Config();
+    rc.setString("a", null, ScheduleConfig.KEY_INTERVAL, "1h");
+    rc.setString("a", null, ScheduleConfig.KEY_STARTTIME, "01:00");
+
+    assertThat(ScheduleConfig.builder(rc, "a").setNow(NOW).buildSchedule())
+        .hasValue(Schedule.create(ms(1, HOURS), ms(1, HOURS)));
+  }
+
+  @Test
+  public void defaultKeysWithSubsection() {
+    Config rc = new Config();
+    rc.setString("a", "b", ScheduleConfig.KEY_INTERVAL, "1h");
+    rc.setString("a", "b", ScheduleConfig.KEY_STARTTIME, "01:00");
+
+    assertThat(ScheduleConfig.builder(rc, "a").setSubsection("b").setNow(NOW).buildSchedule())
+        .hasValue(Schedule.create(ms(1, HOURS), ms(1, HOURS)));
+  }
+
+  @Test
+  public void customKeysWithoutSubsection() {
+    Config rc = new Config();
+    rc.setString("a", null, "i", "1h");
+    rc.setString("a", null, "s", "01:00");
+
+    assertThat(
+            ScheduleConfig.builder(rc, "a")
+                .setKeyInterval("i")
+                .setKeyStartTime("s")
+                .setNow(NOW)
+                .buildSchedule())
+        .hasValue(Schedule.create(ms(1, HOURS), ms(1, HOURS)));
+  }
+
+  @Test
+  public void customKeysWithSubsection() {
+    Config rc = new Config();
+    rc.setString("a", "b", "i", "1h");
+    rc.setString("a", "b", "s", "01:00");
+
+    assertThat(
+            ScheduleConfig.builder(rc, "a")
+                .setSubsection("b")
+                .setKeyInterval("i")
+                .setKeyStartTime("s")
+                .setNow(NOW)
+                .buildSchedule())
+        .hasValue(Schedule.create(ms(1, HOURS), ms(1, HOURS)));
+  }
+
+  @Test
+  public void missingConfigWithoutSubsection() {
+    Config rc = new Config();
+    rc.setString("a", null, ScheduleConfig.KEY_INTERVAL, "1h");
+    rc.setString("a", null, ScheduleConfig.KEY_STARTTIME, "01:00");
+
+    assertThat(
+            ScheduleConfig.builder(rc, "a")
+                .setKeyInterval("myInterval")
+                .setKeyStartTime("myStart")
+                .buildSchedule())
+        .isEmpty();
+
+    assertThat(ScheduleConfig.builder(rc, "x").buildSchedule()).isEmpty();
+  }
+
+  @Test
+  public void missingConfigWithSubsection() {
+    Config rc = new Config();
+    rc.setString("a", "b", ScheduleConfig.KEY_INTERVAL, "1h");
+    rc.setString("a", "b", ScheduleConfig.KEY_STARTTIME, "01:00");
+
+    assertThat(
+            ScheduleConfig.builder(rc, "a")
+                .setSubsection("b")
+                .setKeyInterval("myInterval")
+                .setKeyStartTime("myStart")
+                .buildSchedule())
+        .isEmpty();
+
+    assertThat(ScheduleConfig.builder(rc, "a").setSubsection("x").buildSchedule()).isEmpty();
+
+    assertThat(ScheduleConfig.builder(rc, "x").setSubsection("b").buildSchedule()).isEmpty();
+  }
+
+  @Test
+  public void incompleteConfigMissingInterval() {
+    Config rc = new Config();
+    rc.setString("a", null, ScheduleConfig.KEY_STARTTIME, "01:00");
+
+    assertThat(ScheduleConfig.builder(rc, "a").buildSchedule()).isEmpty();
+  }
+
+  @Test
+  public void incompleteConfigMissingStartTime() {
+    Config rc = new Config();
+    rc.setString("a", null, ScheduleConfig.KEY_INTERVAL, "1h");
+
+    assertThat(ScheduleConfig.builder(rc, "a").buildSchedule()).isEmpty();
+  }
+
+  @Test
+  public void invalidConfigBadInterval() {
+    Config rc = new Config();
+    rc.setString("a", null, ScheduleConfig.KEY_STARTTIME, "01:00");
+
+    rc.setString("a", null, ScheduleConfig.KEY_INTERVAL, "x");
+    assertThat(ScheduleConfig.builder(rc, "a").buildSchedule()).isEmpty();
+
+    rc.setString("a", null, ScheduleConfig.KEY_INTERVAL, "1x");
+    assertThat(ScheduleConfig.builder(rc, "a").buildSchedule()).isEmpty();
+
+    rc.setString("a", null, ScheduleConfig.KEY_INTERVAL, "0");
+    assertThat(ScheduleConfig.builder(rc, "a").buildSchedule()).isEmpty();
+
+    rc.setString("a", null, ScheduleConfig.KEY_INTERVAL, "-1");
+    assertThat(ScheduleConfig.builder(rc, "a").buildSchedule()).isEmpty();
+  }
+
+  @Test
+  public void invalidConfigBadStartTime() {
+    Config rc = new Config();
+    rc.setString("a", null, ScheduleConfig.KEY_INTERVAL, "1h");
+
+    rc.setString("a", null, ScheduleConfig.KEY_STARTTIME, "x");
+    assertThat(ScheduleConfig.builder(rc, "a").buildSchedule()).isEmpty();
+
+    rc.setString("a", null, ScheduleConfig.KEY_STARTTIME, "Foo 01:00");
+    assertThat(ScheduleConfig.builder(rc, "a").buildSchedule()).isEmpty();
+
+    rc.setString("a", null, ScheduleConfig.KEY_STARTTIME, "Mon 01:000");
+    assertThat(ScheduleConfig.builder(rc, "a").buildSchedule()).isEmpty();
+
+    rc.setString("a", null, ScheduleConfig.KEY_STARTTIME, "001:00");
+    assertThat(ScheduleConfig.builder(rc, "a").buildSchedule()).isEmpty();
+
+    rc.setString("a", null, ScheduleConfig.KEY_STARTTIME, "0100");
+    assertThat(ScheduleConfig.builder(rc, "a").buildSchedule()).isEmpty();
+  }
+
+  @Test
+  public void createInvalidSchedule() {
+    assertThat(Schedule.create(-1, "00:00")).isEmpty();
+    assertThat(Schedule.create(1, "x")).isEmpty();
+    assertThat(Schedule.create(1, "Foo 00:00")).isEmpty();
+    assertThat(Schedule.create(0, "Mon 00:000")).isEmpty();
+    assertThat(Schedule.create(1, "000:00")).isEmpty();
+    assertThat(Schedule.create(1, "0000")).isEmpty();
+  }
+
+  private static long initialDelay(String startTime, String interval) {
+    Optional<Schedule> schedule =
+        ScheduleConfig.builder(config(startTime, interval), "section")
+            .setSubsection("subsection")
+            .setNow(NOW)
+            .buildSchedule();
+    assertThat(schedule).isPresent();
+    return schedule.get().initialDelay();
+  }
+
+  private static Config config(String startTime, String interval) {
+    Config rc = new Config();
+    rc.setString("section", "subsection", "startTime", startTime);
+    rc.setString("section", "subsection", "interval", interval);
+    return rc;
+  }
+
+  private static long ms(int cnt, TimeUnit unit) {
+    return MILLISECONDS.convert(cnt, unit);
+  }
+}
diff --git a/javatests/com/google/gerrit/server/config/SitePathsTest.java b/javatests/com/google/gerrit/server/config/SitePathsTest.java
new file mode 100644
index 0000000..b4cde14
--- /dev/null
+++ b/javatests/com/google/gerrit/server/config/SitePathsTest.java
@@ -0,0 +1,103 @@
+// Copyright (C) 2009 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.google.gerrit.server.config;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth8.assertThat;
+
+import com.google.gerrit.server.ioutil.HostPlatform;
+import com.google.gerrit.testing.GerritBaseTests;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.NotDirectoryException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import org.junit.Test;
+
+public class SitePathsTest extends GerritBaseTests {
+  @Test
+  public void create_NotExisting() throws IOException {
+    final Path root = random();
+    final SitePaths site = new SitePaths(root);
+    assertThat(site.isNew).isTrue();
+    assertThat(site.site_path).isEqualTo(root);
+    assertThat(site.etc_dir).isEqualTo(root.resolve("etc"));
+  }
+
+  @Test
+  public void create_Empty() throws IOException {
+    final Path root = random();
+    try {
+      Files.createDirectory(root);
+
+      final SitePaths site = new SitePaths(root);
+      assertThat(site.isNew).isTrue();
+      assertThat(site.site_path).isEqualTo(root);
+    } finally {
+      Files.delete(root);
+    }
+  }
+
+  @Test
+  public void create_NonEmpty() throws IOException {
+    final Path root = random();
+    final Path txt = root.resolve("test.txt");
+    try {
+      Files.createDirectory(root);
+      Files.createFile(txt);
+
+      final SitePaths site = new SitePaths(root);
+      assertThat(site.isNew).isFalse();
+      assertThat(site.site_path).isEqualTo(root);
+    } finally {
+      Files.delete(txt);
+      Files.delete(root);
+    }
+  }
+
+  @Test
+  public void create_NotDirectory() throws IOException {
+    final Path root = random();
+    try {
+      Files.createFile(root);
+      exception.expect(NotDirectoryException.class);
+      new SitePaths(root);
+    } finally {
+      Files.delete(root);
+    }
+  }
+
+  @Test
+  public void resolve() throws IOException {
+    final Path root = random();
+    final SitePaths site = new SitePaths(root);
+
+    assertThat(site.resolve(null)).isNull();
+    assertThat(site.resolve("")).isNull();
+
+    assertThat(site.resolve("a")).isNotNull();
+    assertThat(site.resolve("a")).isEqualTo(root.resolve("a").toAbsolutePath().normalize());
+
+    final String pfx = HostPlatform.isWin32() ? "C:/" : "/";
+    assertThat(site.resolve(pfx + "a")).isNotNull();
+    assertThat(site.resolve(pfx + "a")).isEqualTo(Paths.get(pfx + "a"));
+  }
+
+  private static Path random() throws IOException {
+    Path tmp = Files.createTempFile("gerrit_test_", "_site");
+    Files.deleteIfExists(tmp);
+    return tmp;
+  }
+}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/edit/ChangeEditTest.java b/javatests/com/google/gerrit/server/edit/ChangeEditTest.java
similarity index 100%
rename from gerrit-server/src/test/java/com/google/gerrit/server/edit/ChangeEditTest.java
rename to javatests/com/google/gerrit/server/edit/ChangeEditTest.java
diff --git a/javatests/com/google/gerrit/server/edit/tree/ChangeFileContentModificationSubject.java b/javatests/com/google/gerrit/server/edit/tree/ChangeFileContentModificationSubject.java
new file mode 100644
index 0000000..574c795
--- /dev/null
+++ b/javatests/com/google/gerrit/server/edit/tree/ChangeFileContentModificationSubject.java
@@ -0,0 +1,56 @@
+// Copyright (C) 2017 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.google.gerrit.server.edit.tree;
+
+import static com.google.common.truth.Truth.assertAbout;
+
+import com.google.common.io.CharStreams;
+import com.google.common.truth.FailureMetadata;
+import com.google.common.truth.StringSubject;
+import com.google.common.truth.Subject;
+import com.google.common.truth.Truth;
+import com.google.gerrit.extensions.restapi.RawInput;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+
+public class ChangeFileContentModificationSubject
+    extends Subject<ChangeFileContentModificationSubject, ChangeFileContentModification> {
+
+  public static ChangeFileContentModificationSubject assertThat(
+      ChangeFileContentModification modification) {
+    return assertAbout(ChangeFileContentModificationSubject::new).that(modification);
+  }
+
+  private ChangeFileContentModificationSubject(
+      FailureMetadata failureMetadata, ChangeFileContentModification modification) {
+    super(failureMetadata, modification);
+  }
+
+  public StringSubject filePath() {
+    isNotNull();
+    return Truth.assertThat(actual().getFilePath()).named("filePath");
+  }
+
+  public StringSubject newContent() throws IOException {
+    isNotNull();
+    RawInput newContent = actual().getNewContent();
+    Truth.assertThat(newContent).named("newContent").isNotNull();
+    String contentString =
+        CharStreams.toString(
+            new InputStreamReader(newContent.getInputStream(), StandardCharsets.UTF_8));
+    return Truth.assertThat(contentString).named("newContent");
+  }
+}
diff --git a/javatests/com/google/gerrit/server/edit/tree/TreeModificationSubject.java b/javatests/com/google/gerrit/server/edit/tree/TreeModificationSubject.java
new file mode 100644
index 0000000..59ee2b7
--- /dev/null
+++ b/javatests/com/google/gerrit/server/edit/tree/TreeModificationSubject.java
@@ -0,0 +1,46 @@
+// Copyright (C) 2017 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.google.gerrit.server.edit.tree;
+
+import static com.google.common.truth.Truth.assertAbout;
+
+import com.google.common.truth.FailureMetadata;
+import com.google.common.truth.Subject;
+import com.google.gerrit.truth.ListSubject;
+import java.util.List;
+
+public class TreeModificationSubject extends Subject<TreeModificationSubject, TreeModification> {
+
+  public static TreeModificationSubject assertThat(TreeModification treeModification) {
+    return assertAbout(TreeModificationSubject::new).that(treeModification);
+  }
+
+  public static ListSubject<TreeModificationSubject, TreeModification> assertThatList(
+      List<TreeModification> treeModifications) {
+    return ListSubject.assertThat(treeModifications, TreeModificationSubject::assertThat)
+        .named("treeModifications");
+  }
+
+  private TreeModificationSubject(
+      FailureMetadata failureMetadata, TreeModification treeModification) {
+    super(failureMetadata, treeModification);
+  }
+
+  public ChangeFileContentModificationSubject asChangeFileContentModification() {
+    isInstanceOf(ChangeFileContentModification.class);
+    return ChangeFileContentModificationSubject.assertThat(
+        (ChangeFileContentModification) actual());
+  }
+}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/events/EventDeserializerTest.java b/javatests/com/google/gerrit/server/events/EventDeserializerTest.java
similarity index 100%
rename from gerrit-server/src/test/java/com/google/gerrit/server/events/EventDeserializerTest.java
rename to javatests/com/google/gerrit/server/events/EventDeserializerTest.java
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/events/EventTypesTest.java b/javatests/com/google/gerrit/server/events/EventTypesTest.java
similarity index 100%
rename from gerrit-server/src/test/java/com/google/gerrit/server/events/EventTypesTest.java
rename to javatests/com/google/gerrit/server/events/EventTypesTest.java
diff --git a/javatests/com/google/gerrit/server/extensions/webui/UiActionsTest.java b/javatests/com/google/gerrit/server/extensions/webui/UiActionsTest.java
new file mode 100644
index 0000000..08d7082
--- /dev/null
+++ b/javatests/com/google/gerrit/server/extensions/webui/UiActionsTest.java
@@ -0,0 +1,138 @@
+// 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.
+
+package com.google.gerrit.server.extensions.webui;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.extensions.conditions.BooleanCondition;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.GroupMembership;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackend.ForProject;
+import com.google.gerrit.server.permissions.PermissionBackend.ForRef;
+import com.google.gerrit.server.permissions.PermissionBackend.RefFilterOptions;
+import com.google.gerrit.server.permissions.PermissionBackendCondition;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Set;
+import org.easymock.EasyMock;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.junit.Test;
+
+public class UiActionsTest {
+
+  private static class FakeForProject extends ForProject {
+    private boolean allowValueQueries = true;
+
+    @Override
+    public String resourcePath() {
+      return "/projects/test-project";
+    }
+
+    @Override
+    public ForRef ref(String ref) {
+      throw new UnsupportedOperationException("not implemented");
+    }
+
+    @Override
+    public void check(ProjectPermission perm) throws AuthException, PermissionBackendException {
+      throw new UnsupportedOperationException("not implemented");
+    }
+
+    @Override
+    public Set<ProjectPermission> test(Collection<ProjectPermission> permSet)
+        throws PermissionBackendException {
+      assertThat(allowValueQueries).isTrue();
+      return ImmutableSet.of(ProjectPermission.READ);
+    }
+
+    @Override
+    public BooleanCondition testCond(ProjectPermission perm) {
+      return new PermissionBackendCondition.ForProject(this, perm, fakeUser());
+    }
+
+    @Override
+    public Map<String, Ref> filter(Map<String, Ref> refs, Repository repo, RefFilterOptions opts)
+        throws PermissionBackendException {
+      throw new UnsupportedOperationException("not implemented");
+    }
+
+    private void disallowValueQueries() {
+      allowValueQueries = false;
+    }
+
+    private static CurrentUser fakeUser() {
+      return new CurrentUser() {
+        @Override
+        public GroupMembership getEffectiveGroups() {
+          throw new UnsupportedOperationException("not implemented");
+        }
+
+        @Override
+        public Object getCacheKey() {
+          return new Object();
+        }
+
+        @Override
+        public boolean isIdentifiedUser() {
+          return true;
+        }
+
+        @Override
+        public Account.Id getAccountId() {
+          return new Account.Id(1);
+        }
+      };
+    }
+  }
+
+  @Test
+  public void permissionBackendConditionEvaluationDeduplicatesAndBackfills() throws Exception {
+    FakeForProject forProject = new FakeForProject();
+
+    // Create three conditions, two of which are identical
+    PermissionBackendCondition cond1 =
+        (PermissionBackendCondition) forProject.testCond(ProjectPermission.CREATE_CHANGE);
+    PermissionBackendCondition cond2 =
+        (PermissionBackendCondition) forProject.testCond(ProjectPermission.READ);
+    PermissionBackendCondition cond3 =
+        (PermissionBackendCondition) forProject.testCond(ProjectPermission.CREATE_CHANGE);
+
+    // Set up the Mock to expect a call of bulkEvaluateTest to only contain cond{1,2} since cond3
+    // needs to be identified as duplicate and not called out explicitly.
+    PermissionBackend permissionBackendMock = EasyMock.createMock(PermissionBackend.class);
+    permissionBackendMock.bulkEvaluateTest(ImmutableSet.of(cond1, cond2));
+    EasyMock.replay(permissionBackendMock);
+
+    UiActions.evaluatePermissionBackendConditions(
+        permissionBackendMock, ImmutableList.of(cond1, cond2, cond3));
+
+    // Disallow queries for value to ensure that cond3 (previously left behind) is backfilled with
+    // the value of cond1 and issues no additional call to PermissionBackend.
+    forProject.disallowValueQueries();
+
+    // Assert the values of all conditions
+    assertThat(cond1.value()).isFalse();
+    assertThat(cond2.value()).isTrue();
+    assertThat(cond3.value()).isFalse();
+  }
+}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/fixes/FixReplacementInterpreterTest.java b/javatests/com/google/gerrit/server/fixes/FixReplacementInterpreterTest.java
similarity index 100%
rename from gerrit-server/src/test/java/com/google/gerrit/server/fixes/FixReplacementInterpreterTest.java
rename to javatests/com/google/gerrit/server/fixes/FixReplacementInterpreterTest.java
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/fixes/LineIdentifierTest.java b/javatests/com/google/gerrit/server/fixes/LineIdentifierTest.java
similarity index 100%
rename from gerrit-server/src/test/java/com/google/gerrit/server/fixes/LineIdentifierTest.java
rename to javatests/com/google/gerrit/server/fixes/LineIdentifierTest.java
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/fixes/StringModifierTest.java b/javatests/com/google/gerrit/server/fixes/StringModifierTest.java
similarity index 100%
rename from gerrit-server/src/test/java/com/google/gerrit/server/fixes/StringModifierTest.java
rename to javatests/com/google/gerrit/server/fixes/StringModifierTest.java
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/git/GroupCollectorTest.java b/javatests/com/google/gerrit/server/git/GroupCollectorTest.java
similarity index 100%
rename from gerrit-server/src/test/java/com/google/gerrit/server/git/GroupCollectorTest.java
rename to javatests/com/google/gerrit/server/git/GroupCollectorTest.java
diff --git a/javatests/com/google/gerrit/server/git/LocalDiskRepositoryManagerTest.java b/javatests/com/google/gerrit/server/git/LocalDiskRepositoryManagerTest.java
new file mode 100644
index 0000000..4e0cb0c
--- /dev/null
+++ b/javatests/com/google/gerrit/server/git/LocalDiskRepositoryManagerTest.java
@@ -0,0 +1,251 @@
+// Copyright (C) 2015 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.google.gerrit.server.git;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.ioutil.HostPlatform;
+import com.google.gerrit.testing.TempFileUtil;
+import com.google.gwtorm.client.KeyUtil;
+import com.google.gwtorm.server.StandardKeyEncoder;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import org.easymock.EasyMockSupport;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.lib.RepositoryCache;
+import org.eclipse.jgit.lib.RepositoryCache.FileKey;
+import org.eclipse.jgit.util.FS;
+import org.junit.Before;
+import org.junit.Test;
+
+public class LocalDiskRepositoryManagerTest extends EasyMockSupport {
+
+  static {
+    KeyUtil.setEncoderImpl(new StandardKeyEncoder());
+  }
+
+  private Config cfg;
+  private SitePaths site;
+  private LocalDiskRepositoryManager repoManager;
+
+  @Before
+  public void setUp() throws Exception {
+    site = new SitePaths(TempFileUtil.createTempDirectory().toPath());
+    site.resolve("git").toFile().mkdir();
+    cfg = new Config();
+    cfg.setString("gerrit", null, "basePath", "git");
+    repoManager = new LocalDiskRepositoryManager(site, cfg);
+  }
+
+  @Test(expected = IllegalStateException.class)
+  public void testThatNullBasePathThrowsAnException() {
+    new LocalDiskRepositoryManager(site, new Config());
+  }
+
+  @Test
+  public void projectCreation() throws Exception {
+    Project.NameKey projectA = new Project.NameKey("projectA");
+    try (Repository repo = repoManager.createRepository(projectA)) {
+      assertThat(repo).isNotNull();
+    }
+    try (Repository repo = repoManager.openRepository(projectA)) {
+      assertThat(repo).isNotNull();
+    }
+    assertThat(repoManager.list()).containsExactly(projectA);
+  }
+
+  @Test(expected = RepositoryNotFoundException.class)
+  public void testProjectCreationWithEmptyName() throws Exception {
+    repoManager.createRepository(new Project.NameKey(""));
+  }
+
+  @Test(expected = RepositoryNotFoundException.class)
+  public void testProjectCreationWithTrailingSlash() throws Exception {
+    repoManager.createRepository(new Project.NameKey("projectA/"));
+  }
+
+  @Test(expected = RepositoryNotFoundException.class)
+  public void testProjectCreationWithBackSlash() throws Exception {
+    repoManager.createRepository(new Project.NameKey("a\\projectA"));
+  }
+
+  @Test(expected = RepositoryNotFoundException.class)
+  public void testProjectCreationAbsolutePath() throws Exception {
+    repoManager.createRepository(new Project.NameKey("/projectA"));
+  }
+
+  @Test(expected = RepositoryNotFoundException.class)
+  public void testProjectCreationStartingWithDotDot() throws Exception {
+    repoManager.createRepository(new Project.NameKey("../projectA"));
+  }
+
+  @Test(expected = RepositoryNotFoundException.class)
+  public void testProjectCreationContainsDotDot() throws Exception {
+    repoManager.createRepository(new Project.NameKey("a/../projectA"));
+  }
+
+  @Test(expected = RepositoryNotFoundException.class)
+  public void testProjectCreationDotPathSegment() throws Exception {
+    repoManager.createRepository(new Project.NameKey("a/./projectA"));
+  }
+
+  @Test(expected = RepositoryNotFoundException.class)
+  public void testProjectCreationWithTwoSlashes() throws Exception {
+    repoManager.createRepository(new Project.NameKey("a//projectA"));
+  }
+
+  @Test(expected = RepositoryNotFoundException.class)
+  public void testProjectCreationWithPathSegmentEndingByDotGit() throws Exception {
+    repoManager.createRepository(new Project.NameKey("a/b.git/projectA"));
+  }
+
+  @Test(expected = RepositoryNotFoundException.class)
+  public void testProjectCreationWithQuestionMark() throws Exception {
+    repoManager.createRepository(new Project.NameKey("project?A"));
+  }
+
+  @Test(expected = RepositoryNotFoundException.class)
+  public void testProjectCreationWithPercentageSign() throws Exception {
+    repoManager.createRepository(new Project.NameKey("project%A"));
+  }
+
+  @Test(expected = RepositoryNotFoundException.class)
+  public void testProjectCreationWithWidlcard() throws Exception {
+    repoManager.createRepository(new Project.NameKey("project*A"));
+  }
+
+  @Test(expected = RepositoryNotFoundException.class)
+  public void testProjectCreationWithColon() throws Exception {
+    repoManager.createRepository(new Project.NameKey("project:A"));
+  }
+
+  @Test(expected = RepositoryNotFoundException.class)
+  public void testProjectCreationWithLessThatSign() throws Exception {
+    repoManager.createRepository(new Project.NameKey("project<A"));
+  }
+
+  @Test(expected = RepositoryNotFoundException.class)
+  public void testProjectCreationWithGreaterThatSign() throws Exception {
+    repoManager.createRepository(new Project.NameKey("project>A"));
+  }
+
+  @Test(expected = RepositoryNotFoundException.class)
+  public void testProjectCreationWithPipe() throws Exception {
+    repoManager.createRepository(new Project.NameKey("project|A"));
+  }
+
+  @Test(expected = RepositoryNotFoundException.class)
+  public void testProjectCreationWithDollarSign() throws Exception {
+    repoManager.createRepository(new Project.NameKey("project$A"));
+  }
+
+  @Test(expected = RepositoryNotFoundException.class)
+  public void testProjectCreationWithCarriageReturn() throws Exception {
+    repoManager.createRepository(new Project.NameKey("project\\rA"));
+  }
+
+  @Test(expected = IllegalStateException.class)
+  public void testProjectRecreation() throws Exception {
+    repoManager.createRepository(new Project.NameKey("a"));
+    repoManager.createRepository(new Project.NameKey("a"));
+  }
+
+  @Test(expected = IllegalStateException.class)
+  public void testProjectRecreationAfterRestart() throws Exception {
+    repoManager.createRepository(new Project.NameKey("a"));
+    LocalDiskRepositoryManager newRepoManager = new LocalDiskRepositoryManager(site, cfg);
+    newRepoManager.createRepository(new Project.NameKey("a"));
+  }
+
+  @Test
+  public void openRepositoryCreatedDirectlyOnDisk() throws Exception {
+    Project.NameKey projectA = new Project.NameKey("projectA");
+    createRepository(repoManager.getBasePath(projectA), projectA.get());
+    try (Repository repo = repoManager.openRepository(projectA)) {
+      assertThat(repo).isNotNull();
+    }
+    assertThat(repoManager.list()).containsExactly(projectA);
+  }
+
+  @Test(expected = RepositoryCaseMismatchException.class)
+  public void testNameCaseMismatch() throws Exception {
+    assume().that(HostPlatform.isWin32() || HostPlatform.isMac()).isTrue();
+    repoManager.createRepository(new Project.NameKey("a"));
+    repoManager.createRepository(new Project.NameKey("A"));
+  }
+
+  @Test(expected = RepositoryCaseMismatchException.class)
+  public void testNameCaseMismatchWithSymlink() throws Exception {
+    assume().that(HostPlatform.isWin32() || HostPlatform.isMac()).isTrue();
+    Project.NameKey name = new Project.NameKey("a");
+    repoManager.createRepository(name);
+    createSymLink(name, "b.git");
+    repoManager.createRepository(new Project.NameKey("B"));
+  }
+
+  @Test(expected = RepositoryCaseMismatchException.class)
+  public void testNameCaseMismatchAfterRestart() throws Exception {
+    assume().that(HostPlatform.isWin32() || HostPlatform.isMac()).isTrue();
+    Project.NameKey name = new Project.NameKey("a");
+    repoManager.createRepository(name);
+
+    LocalDiskRepositoryManager newRepoManager = new LocalDiskRepositoryManager(site, cfg);
+    newRepoManager.createRepository(new Project.NameKey("A"));
+  }
+
+  private void createSymLink(Project.NameKey project, String link) throws IOException {
+    Path base = repoManager.getBasePath(project);
+    Path projectDir = base.resolve(project.get() + ".git");
+    Path symlink = base.resolve(link);
+    Files.createSymbolicLink(symlink, projectDir);
+  }
+
+  @Test(expected = RepositoryNotFoundException.class)
+  public void testOpenRepositoryInvalidName() throws Exception {
+    repoManager.openRepository(new Project.NameKey("project%?|<>A"));
+  }
+
+  @Test
+  public void list() throws Exception {
+    Project.NameKey projectA = new Project.NameKey("projectA");
+    createRepository(repoManager.getBasePath(projectA), projectA.get());
+
+    Project.NameKey projectB = new Project.NameKey("path/projectB");
+    createRepository(repoManager.getBasePath(projectB), projectB.get());
+
+    Project.NameKey projectC = new Project.NameKey("anotherPath/path/projectC");
+    createRepository(repoManager.getBasePath(projectC), projectC.get());
+    // create an invalid git repo named only .git
+    repoManager.getBasePath(null).resolve(".git").toFile().mkdir();
+    // create an invalid repo name
+    createRepository(repoManager.getBasePath(null), "project?A");
+    assertThat(repoManager.list()).containsExactly(projectA, projectB, projectC);
+  }
+
+  private void createRepository(Path directory, String projectName) throws IOException {
+    String n = projectName + Constants.DOT_GIT_EXT;
+    FileKey loc = FileKey.exact(directory.resolve(n).toFile(), FS.DETECTED);
+    try (Repository db = RepositoryCache.open(loc, false)) {
+      db.create(true /* bare */);
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/server/git/MultiBaseLocalDiskRepositoryManagerTest.java b/javatests/com/google/gerrit/server/git/MultiBaseLocalDiskRepositoryManagerTest.java
new file mode 100644
index 0000000..e848fa3
--- /dev/null
+++ b/javatests/com/google/gerrit/server/git/MultiBaseLocalDiskRepositoryManagerTest.java
@@ -0,0 +1,163 @@
+// Copyright (C) 2015 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.google.gerrit.server.git;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.easymock.EasyMock.createNiceMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.reset;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.config.RepositoryConfig;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.testing.GerritBaseTests;
+import com.google.gerrit.testing.TempFileUtil;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.SortedSet;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.lib.RepositoryCache;
+import org.eclipse.jgit.lib.RepositoryCache.FileKey;
+import org.eclipse.jgit.util.FS;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class MultiBaseLocalDiskRepositoryManagerTest extends GerritBaseTests {
+  private Config cfg;
+  private SitePaths site;
+  private MultiBaseLocalDiskRepositoryManager repoManager;
+  private RepositoryConfig configMock;
+
+  @Before
+  public void setUp() throws IOException {
+    site = new SitePaths(TempFileUtil.createTempDirectory().toPath());
+    site.resolve("git").toFile().mkdir();
+    cfg = new Config();
+    cfg.setString("gerrit", null, "basePath", "git");
+    configMock = createNiceMock(RepositoryConfig.class);
+    expect(configMock.getAllBasePaths()).andReturn(ImmutableList.of()).anyTimes();
+    replay(configMock);
+    repoManager = new MultiBaseLocalDiskRepositoryManager(site, cfg, configMock);
+  }
+
+  @After
+  public void tearDown() throws IOException {
+    TempFileUtil.cleanup();
+  }
+
+  @Test
+  public void defaultRepositoryLocation()
+      throws RepositoryCaseMismatchException, RepositoryNotFoundException, IOException {
+    Project.NameKey someProjectKey = new Project.NameKey("someProject");
+    Repository repo = repoManager.createRepository(someProjectKey);
+    assertThat(repo.getDirectory()).isNotNull();
+    assertThat(repo.getDirectory().exists()).isTrue();
+    assertThat(repo.getDirectory().getParent())
+        .isEqualTo(repoManager.getBasePath(someProjectKey).toAbsolutePath().toString());
+
+    repo = repoManager.openRepository(someProjectKey);
+    assertThat(repo.getDirectory()).isNotNull();
+    assertThat(repo.getDirectory().exists()).isTrue();
+    assertThat(repo.getDirectory().getParent())
+        .isEqualTo(repoManager.getBasePath(someProjectKey).toAbsolutePath().toString());
+
+    assertThat(repoManager.getBasePath(someProjectKey).toAbsolutePath().toString())
+        .isEqualTo(repoManager.getBasePath(someProjectKey).toAbsolutePath().toString());
+
+    SortedSet<Project.NameKey> repoList = repoManager.list();
+    assertThat(repoList).hasSize(1);
+    assertThat(repoList.toArray(new Project.NameKey[repoList.size()]))
+        .isEqualTo(new Project.NameKey[] {someProjectKey});
+  }
+
+  @Test
+  public void alternateRepositoryLocation() throws IOException {
+    Path alternateBasePath = TempFileUtil.createTempDirectory().toPath();
+    Project.NameKey someProjectKey = new Project.NameKey("someProject");
+    reset(configMock);
+    expect(configMock.getBasePath(someProjectKey)).andReturn(alternateBasePath).anyTimes();
+    expect(configMock.getAllBasePaths()).andReturn(ImmutableList.of(alternateBasePath)).anyTimes();
+    replay(configMock);
+
+    Repository repo = repoManager.createRepository(someProjectKey);
+    assertThat(repo.getDirectory()).isNotNull();
+    assertThat(repo.getDirectory().exists()).isTrue();
+    assertThat(repo.getDirectory().getParent()).isEqualTo(alternateBasePath.toString());
+
+    repo = repoManager.openRepository(someProjectKey);
+    assertThat(repo.getDirectory()).isNotNull();
+    assertThat(repo.getDirectory().exists()).isTrue();
+    assertThat(repo.getDirectory().getParent()).isEqualTo(alternateBasePath.toString());
+
+    assertThat(repoManager.getBasePath(someProjectKey).toAbsolutePath().toString())
+        .isEqualTo(alternateBasePath.toString());
+
+    SortedSet<Project.NameKey> repoList = repoManager.list();
+    assertThat(repoList).hasSize(1);
+    assertThat(repoList.toArray(new Project.NameKey[repoList.size()]))
+        .isEqualTo(new Project.NameKey[] {someProjectKey});
+  }
+
+  @Test
+  public void listReturnRepoFromProperLocation() throws IOException {
+    Project.NameKey basePathProject = new Project.NameKey("basePathProject");
+    Project.NameKey altPathProject = new Project.NameKey("altPathProject");
+    Project.NameKey misplacedProject1 = new Project.NameKey("misplacedProject1");
+    Project.NameKey misplacedProject2 = new Project.NameKey("misplacedProject2");
+
+    Path alternateBasePath = TempFileUtil.createTempDirectory().toPath();
+
+    reset(configMock);
+    expect(configMock.getBasePath(altPathProject)).andReturn(alternateBasePath).anyTimes();
+    expect(configMock.getBasePath(misplacedProject2)).andReturn(alternateBasePath).anyTimes();
+    expect(configMock.getAllBasePaths()).andReturn(ImmutableList.of(alternateBasePath)).anyTimes();
+    replay(configMock);
+
+    repoManager.createRepository(basePathProject);
+    repoManager.createRepository(altPathProject);
+    // create the misplaced ones without the repomanager otherwise they would
+    // end up at the proper place.
+    createRepository(repoManager.getBasePath(basePathProject), misplacedProject2);
+    createRepository(alternateBasePath, misplacedProject1);
+
+    SortedSet<Project.NameKey> repoList = repoManager.list();
+    assertThat(repoList).hasSize(2);
+    assertThat(repoList.toArray(new Project.NameKey[repoList.size()]))
+        .isEqualTo(new Project.NameKey[] {altPathProject, basePathProject});
+  }
+
+  private void createRepository(Path directory, Project.NameKey projectName) throws IOException {
+    String n = projectName.get() + Constants.DOT_GIT_EXT;
+    FileKey loc = FileKey.exact(directory.resolve(n).toFile(), FS.DETECTED);
+    try (Repository db = RepositoryCache.open(loc, false)) {
+      db.create(true /* bare */);
+    }
+  }
+
+  @Test(expected = IllegalStateException.class)
+  public void testRelativeAlternateLocation() {
+    configMock = createNiceMock(RepositoryConfig.class);
+    expect(configMock.getAllBasePaths()).andReturn(ImmutableList.of(Paths.get("repos"))).anyTimes();
+    replay(configMock);
+    repoManager = new MultiBaseLocalDiskRepositoryManager(site, cfg, configMock);
+  }
+}
diff --git a/javatests/com/google/gerrit/server/git/TagSetHolderTest.java b/javatests/com/google/gerrit/server/git/TagSetHolderTest.java
new file mode 100644
index 0000000..3d3e734
--- /dev/null
+++ b/javatests/com/google/gerrit/server/git/TagSetHolderTest.java
@@ -0,0 +1,69 @@
+// 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.
+
+package com.google.gerrit.server.git;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.extensions.proto.ProtoTruth.assertThat;
+import static com.google.gerrit.server.cache.testing.SerializedClassSubject.assertThatSerializedClass;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.cache.proto.Cache.TagSetHolderProto;
+import org.junit.Test;
+
+public class TagSetHolderTest {
+  @Test
+  public void serializerWithTagSet() throws Exception {
+    TagSetHolder holder = new TagSetHolder(new Project.NameKey("project"));
+    holder.setTagSet(new TagSet(holder.getProjectName()));
+
+    byte[] serialized = TagSetHolder.Serializer.INSTANCE.serialize(holder);
+    assertThat(TagSetHolderProto.parseFrom(serialized))
+        .ignoringRepeatedFieldOrder()
+        .isEqualTo(
+            TagSetHolderProto.newBuilder()
+                .setProjectName("project")
+                .setTags(holder.getTagSet().toProto())
+                .build());
+
+    TagSetHolder deserialized = TagSetHolder.Serializer.INSTANCE.deserialize(serialized);
+    assertThat(deserialized.getProjectName()).isEqualTo(holder.getProjectName());
+    TagSetTest.assertEqual(holder.getTagSet(), deserialized.getTagSet());
+  }
+
+  @Test
+  public void serializerWithoutTagSet() throws Exception {
+    TagSetHolder holder = new TagSetHolder(new Project.NameKey("project"));
+
+    byte[] serialized = TagSetHolder.Serializer.INSTANCE.serialize(holder);
+    assertThat(TagSetHolderProto.parseFrom(serialized))
+        .ignoringRepeatedFieldOrder()
+        .isEqualTo(TagSetHolderProto.newBuilder().setProjectName("project").build());
+
+    TagSetHolder deserialized = TagSetHolder.Serializer.INSTANCE.deserialize(serialized);
+    assertThat(deserialized.getProjectName()).isEqualTo(holder.getProjectName());
+    TagSetTest.assertEqual(holder.getTagSet(), deserialized.getTagSet());
+  }
+
+  @Test
+  public void fields() {
+    assertThatSerializedClass(TagSetHolder.class)
+        .hasFields(
+            ImmutableMap.of(
+                "buildLock", Object.class,
+                "projectName", Project.NameKey.class,
+                "tags", TagSet.class));
+  }
+}
diff --git a/javatests/com/google/gerrit/server/git/TagSetTest.java b/javatests/com/google/gerrit/server/git/TagSetTest.java
new file mode 100644
index 0000000..1eebe75
--- /dev/null
+++ b/javatests/com/google/gerrit/server/git/TagSetTest.java
@@ -0,0 +1,188 @@
+// 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.
+
+package com.google.gerrit.server.git;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+import static com.google.common.truth.extensions.proto.ProtoTruth.assertThat;
+import static com.google.gerrit.server.cache.testing.CacheSerializerTestUtil.byteString;
+import static com.google.gerrit.server.cache.testing.SerializedClassSubject.assertThatSerializedClass;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSortedSet;
+import com.google.common.collect.Streams;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.cache.proto.Cache.TagSetHolderProto.TagSetProto;
+import com.google.gerrit.server.cache.proto.Cache.TagSetHolderProto.TagSetProto.CachedRefProto;
+import com.google.gerrit.server.cache.proto.Cache.TagSetHolderProto.TagSetProto.TagProto;
+import com.google.gerrit.server.git.TagSet.CachedRef;
+import com.google.gerrit.server.git.TagSet.Tag;
+import com.google.inject.TypeLiteral;
+import java.lang.reflect.Type;
+import java.util.Arrays;
+import java.util.BitSet;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectIdOwnerMap;
+import org.junit.Test;
+
+public class TagSetTest {
+  @Test
+  public void roundTripToProto() {
+    HashMap<String, CachedRef> refs = new HashMap<>();
+    refs.put(
+        "refs/heads/master",
+        new CachedRef(1, ObjectId.fromString("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")));
+    refs.put(
+        "refs/heads/branch",
+        new CachedRef(2, ObjectId.fromString("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb")));
+    ObjectIdOwnerMap<Tag> tags = new ObjectIdOwnerMap<>();
+    tags.add(
+        new Tag(
+            ObjectId.fromString("cccccccccccccccccccccccccccccccccccccccc"), newBitSet(1, 3, 5)));
+    tags.add(
+        new Tag(
+            ObjectId.fromString("dddddddddddddddddddddddddddddddddddddddd"), newBitSet(2, 4, 6)));
+    TagSet tagSet = new TagSet(new Project.NameKey("project"), refs, tags);
+
+    TagSetProto proto = tagSet.toProto();
+    assertThat(proto)
+        .ignoringRepeatedFieldOrder()
+        .isEqualTo(
+            TagSetProto.newBuilder()
+                .setProjectName("project")
+                .putRef(
+                    "refs/heads/master",
+                    CachedRefProto.newBuilder()
+                        .setId(
+                            byteString(
+                                0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+                                0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa))
+                        .setFlag(1)
+                        .build())
+                .putRef(
+                    "refs/heads/branch",
+                    CachedRefProto.newBuilder()
+                        .setId(
+                            byteString(
+                                0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
+                                0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb))
+                        .setFlag(2)
+                        .build())
+                .addTag(
+                    TagProto.newBuilder()
+                        .setId(
+                            byteString(
+                                0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
+                                0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc))
+                        .setFlags(byteString(0x2a))
+                        .build())
+                .addTag(
+                    TagProto.newBuilder()
+                        .setId(
+                            byteString(
+                                0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
+                                0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd))
+                        .setFlags(byteString(0x54))
+                        .build())
+                .build());
+
+    assertEqual(tagSet, TagSet.fromProto(proto));
+  }
+
+  @Test
+  public void tagSetFields() {
+    assertThatSerializedClass(TagSet.class)
+        .hasFields(
+            ImmutableMap.of(
+                "projectName", Project.NameKey.class,
+                "refs", new TypeLiteral<Map<String, CachedRef>>() {}.getType(),
+                "tags", new TypeLiteral<ObjectIdOwnerMap<Tag>>() {}.getType()));
+  }
+
+  @Test
+  public void cachedRefFields() {
+    assertThatSerializedClass(CachedRef.class)
+        .extendsClass(new TypeLiteral<AtomicReference<ObjectId>>() {}.getType());
+    assertThatSerializedClass(CachedRef.class)
+        .hasFields(
+            ImmutableMap.of(
+                "flag", int.class, "value", AtomicReference.class.getTypeParameters()[0]));
+  }
+
+  @Test
+  public void tagFields() {
+    assertThatSerializedClass(Tag.class).extendsClass(ObjectIdOwnerMap.Entry.class);
+    assertThatSerializedClass(Tag.class)
+        .hasFields(
+            ImmutableMap.<String, Type>builder()
+                .put("refFlags", BitSet.class)
+                .put("next", ObjectIdOwnerMap.Entry.class)
+                .put("w1", int.class)
+                .put("w2", int.class)
+                .put("w3", int.class)
+                .put("w4", int.class)
+                .put("w5", int.class)
+                .build());
+  }
+
+  // TODO(dborowitz): Find some more common place to put this method, which requires access to
+  // package-private TagSet details.
+  static void assertEqual(@Nullable TagSet a, @Nullable TagSet b) {
+    if (a == null || b == null) {
+      assertWithMessage("only one TagSet is null out of\n%s\n%s", a, b)
+          .that(a == null && b == null)
+          .isTrue();
+      return;
+    }
+    assertThat(a.getProjectName()).isEqualTo(b.getProjectName());
+
+    Map<String, CachedRef> aRefs = a.getRefsForTesting();
+    Map<String, CachedRef> bRefs = b.getRefsForTesting();
+    assertThat(ImmutableSortedSet.copyOf(aRefs.keySet()))
+        .named("ref name set")
+        .isEqualTo(ImmutableSortedSet.copyOf(bRefs.keySet()));
+    for (String name : aRefs.keySet()) {
+      CachedRef aRef = aRefs.get(name);
+      CachedRef bRef = bRefs.get(name);
+      assertThat(aRef.get()).named("value of ref %s", name).isEqualTo(bRef.get());
+      assertThat(aRef.flag).named("flag of ref %s", name).isEqualTo(bRef.flag);
+    }
+
+    ObjectIdOwnerMap<Tag> aTags = a.getTagsForTesting();
+    ObjectIdOwnerMap<Tag> bTags = b.getTagsForTesting();
+    assertThat(getTagIds(aTags)).named("tag ID set").isEqualTo(getTagIds(bTags));
+    for (Tag aTag : aTags) {
+      Tag bTag = bTags.get(aTag);
+      assertThat(aTag.refFlags).named("flags for tag %s", aTag.name()).isEqualTo(bTag.refFlags);
+    }
+  }
+
+  private static ImmutableSortedSet<String> getTagIds(ObjectIdOwnerMap<Tag> bTags) {
+    return Streams.stream(bTags)
+        .map(Tag::name)
+        .collect(ImmutableSortedSet.toImmutableSortedSet(Comparator.naturalOrder()));
+  }
+
+  private BitSet newBitSet(int... bits) {
+    BitSet result = new BitSet();
+    Arrays.stream(bits).forEach(result::set);
+    return result;
+  }
+}
diff --git a/javatests/com/google/gerrit/server/git/meta/VersionedMetaDataTest.java b/javatests/com/google/gerrit/server/git/meta/VersionedMetaDataTest.java
new file mode 100644
index 0000000..7e12439
--- /dev/null
+++ b/javatests/com/google/gerrit/server/git/meta/VersionedMetaDataTest.java
@@ -0,0 +1,304 @@
+// Copyright (C) 2017 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.google.gerrit.server.git.meta;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth8.assertThat;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Streams;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.meta.VersionedMetaData.BatchMetaDataUpdate;
+import com.google.gerrit.server.update.RefUpdateUtil;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.testing.TestTimeUtil;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Optional;
+import java.util.TimeZone;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevSort;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.transport.ReceiveCommand;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class VersionedMetaDataTest {
+  // If you're considering fleshing out this test and making it more comprehensive, please consider
+  // instead coming up with a replacement interface for
+  // VersionedMetaData/BatchMetaDataUpdate/MetaDataUpdate that is easier to use correctly.
+
+  private static final TimeZone TZ = TimeZone.getTimeZone("America/Los_Angeles");
+  private static final String DEFAULT_REF = "refs/meta/config";
+
+  private Project.NameKey project;
+  private Repository repo;
+
+  @Before
+  public void setUp() {
+    TestTimeUtil.resetWithClockStep(1, TimeUnit.SECONDS);
+    project = new Project.NameKey("repo");
+    repo = new InMemoryRepository(new DfsRepositoryDescription(project.get()));
+  }
+
+  @After
+  public void tearDown() {
+    TestTimeUtil.useSystemTime();
+  }
+
+  @Test
+  public void singleUpdate() throws Exception {
+    MyMetaData d = load(0);
+    d.setIncrement(3);
+    d.commit(newMetaDataUpdate());
+    assertMyMetaData(3, "Increment conf.value by 3");
+  }
+
+  @Test
+  public void noOpNoSetter() throws Exception {
+    MyMetaData d = load(0);
+    d.commit(newMetaDataUpdate());
+    assertMyMetaData(0);
+  }
+
+  @Test
+  public void noOpWithSetter() throws Exception {
+    MyMetaData d = load(0);
+    d.setIncrement(0);
+    d.commit(newMetaDataUpdate());
+    // First commit is actually not a no-op because it creates an empty config file.
+    assertMyMetaData(0, "Increment conf.value by 0");
+
+    d = load(0);
+    d.setIncrement(0);
+    d.commit(newMetaDataUpdate());
+    assertMyMetaData(0, "Increment conf.value by 0");
+  }
+
+  @Test
+  public void multipleSeparateUpdatesWithSameObject() throws Exception {
+    MyMetaData d = load(0);
+    d.setIncrement(1);
+    d.commit(newMetaDataUpdate());
+    assertMyMetaData(1, "Increment conf.value by 1");
+    d.setIncrement(2);
+    d.commit(newMetaDataUpdate());
+    assertMyMetaData(3, "Increment conf.value by 1", "Increment conf.value by 2");
+  }
+
+  @Test
+  public void multipleSeparateUpdatesWithDifferentObject() throws Exception {
+    MyMetaData d = load(0);
+    d.setIncrement(1);
+    d.commit(newMetaDataUpdate());
+    assertMyMetaData(1, "Increment conf.value by 1");
+
+    d = load(1);
+    d.setIncrement(2);
+    d.commit(newMetaDataUpdate());
+    assertMyMetaData(3, "Increment conf.value by 1", "Increment conf.value by 2");
+  }
+
+  @Test
+  public void multipleUpdatesInBatchWithSameObject() throws Exception {
+    MyMetaData d = load(0);
+    d.setIncrement(1);
+    try (BatchMetaDataUpdate batch = d.openUpdate(newMetaDataUpdate())) {
+      batch.write(d, newCommitBuilder());
+      assertMyMetaData(0); // Batch not yet committed.
+
+      d.setIncrement(2);
+      batch.write(d, newCommitBuilder());
+      batch.commit();
+    }
+
+    assertMyMetaData(3, "Increment conf.value by 1", "Increment conf.value by 2");
+  }
+
+  @Test
+  public void multipleUpdatesSomeNoOps() throws Exception {
+    MyMetaData d = load(0);
+    d.setIncrement(1);
+    try (BatchMetaDataUpdate batch = d.openUpdate(newMetaDataUpdate())) {
+      batch.write(d, newCommitBuilder());
+      assertMyMetaData(0); // Batch not yet committed.
+
+      d.setIncrement(0);
+      batch.write(d, newCommitBuilder());
+      assertMyMetaData(0); // Batch not yet committed.
+
+      d.setIncrement(3);
+      batch.write(d, newCommitBuilder());
+      batch.commit();
+    }
+
+    assertMyMetaData(4, "Increment conf.value by 1", "Increment conf.value by 3");
+  }
+
+  @Test
+  public void sharedBatchRefUpdate() throws Exception {
+    MyMetaData d1 = load("refs/meta/1", 0);
+    MyMetaData d2 = load("refs/meta/2", 0);
+
+    BatchRefUpdate bru = repo.getRefDatabase().newBatchUpdate();
+    try (BatchMetaDataUpdate batch1 = d1.openUpdate(newMetaDataUpdate(bru));
+        BatchMetaDataUpdate batch2 = d2.openUpdate(newMetaDataUpdate(bru))) {
+      d1.setIncrement(1);
+      batch1.write(d1, newCommitBuilder());
+
+      d2.setIncrement(2000);
+      batch2.write(d2, newCommitBuilder());
+
+      d1.setIncrement(3);
+      batch1.write(d1, newCommitBuilder());
+
+      d2.setIncrement(4000);
+      batch2.write(d2, newCommitBuilder());
+
+      batch1.commit();
+      batch2.commit();
+    }
+
+    assertMyMetaData(d1.getRefName(), 0);
+    assertMyMetaData(d2.getRefName(), 0);
+    assertThat(bru.getCommands().stream().map(ReceiveCommand::getRefName))
+        .containsExactly("refs/meta/1", "refs/meta/2");
+    RefUpdateUtil.executeChecked(bru, repo);
+
+    assertMyMetaData(d1.getRefName(), 4, "Increment conf.value by 1", "Increment conf.value by 3");
+    assertMyMetaData(
+        d2.getRefName(), 6000, "Increment conf.value by 2000", "Increment conf.value by 4000");
+  }
+
+  private MyMetaData load(int expectedValue) throws Exception {
+    return load(DEFAULT_REF, expectedValue);
+  }
+
+  private MyMetaData load(String ref, int expectedValue) throws Exception {
+    MyMetaData d = new MyMetaData(ref);
+    d.load(project, repo);
+    assertThat(d.getValue()).isEqualTo(expectedValue);
+    return d;
+  }
+
+  private MetaDataUpdate newMetaDataUpdate() {
+    return newMetaDataUpdate(null);
+  }
+
+  private MetaDataUpdate newMetaDataUpdate(@Nullable BatchRefUpdate bru) {
+    MetaDataUpdate u = new MetaDataUpdate(GitReferenceUpdated.DISABLED, project, repo, bru);
+    CommitBuilder cb = newCommitBuilder();
+    u.getCommitBuilder().setAuthor(cb.getAuthor());
+    u.getCommitBuilder().setCommitter(cb.getCommitter());
+    return u;
+  }
+
+  private CommitBuilder newCommitBuilder() {
+    CommitBuilder cb = new CommitBuilder();
+    PersonIdent author = new PersonIdent("J. Author", "author@example.com", TimeUtil.nowTs(), TZ);
+    cb.setAuthor(author);
+    cb.setCommitter(
+        new PersonIdent(
+            "M. Committer", "committer@example.com", author.getWhen(), author.getTimeZone()));
+    return cb;
+  }
+
+  private void assertMyMetaData(String ref, int expectedValue, String... expectedLog)
+      throws Exception {
+    MyMetaData d = load(ref, expectedValue);
+    assertThat(log(d)).containsExactlyElementsIn(Arrays.asList(expectedLog)).inOrder();
+  }
+
+  private void assertMyMetaData(int expectedValue, String... expectedLog) throws Exception {
+    assertMyMetaData(DEFAULT_REF, expectedValue, expectedLog);
+  }
+
+  private ImmutableList<String> log(MyMetaData d) throws Exception {
+    try (RevWalk rw = new RevWalk(repo)) {
+      Ref ref = repo.exactRef(d.getRefName());
+      if (ref == null) {
+        return ImmutableList.of();
+      }
+      rw.sort(RevSort.REVERSE);
+      rw.setRetainBody(true);
+      rw.markStart(rw.parseCommit(ref.getObjectId()));
+      return Streams.stream(rw).map(RevCommit::getFullMessage).collect(toImmutableList());
+    }
+  }
+
+  private static class MyMetaData extends VersionedMetaData {
+    private static final String CONFIG_FILE = "my.config";
+    private static final String SECTION = "conf";
+    private static final String NAME = "value";
+
+    private final String ref;
+
+    MyMetaData(String ref) {
+      this.ref = ref;
+    }
+
+    @Override
+    protected String getRefName() {
+      return ref;
+    }
+
+    private int curr;
+    private Optional<Integer> increment = Optional.empty();
+
+    @Override
+    protected void onLoad() throws IOException, ConfigInvalidException {
+      Config cfg = readConfig(CONFIG_FILE);
+      curr = cfg.getInt(SECTION, null, NAME, 0);
+    }
+
+    int getValue() {
+      return curr;
+    }
+
+    void setIncrement(int increment) {
+      checkArgument(increment >= 0, "increment must be positive: %s", increment);
+      this.increment = Optional.of(increment);
+    }
+
+    @Override
+    protected boolean onSave(CommitBuilder cb) throws IOException, ConfigInvalidException {
+      // Two ways to produce a no-op: don't call setIncrement, and call setIncrement(0);
+      if (!increment.isPresent()) {
+        return false;
+      }
+      Config cfg = readConfig(CONFIG_FILE);
+      cfg.setInt(SECTION, null, NAME, cfg.getInt(SECTION, null, NAME, 0) + increment.get());
+      cb.setMessage(String.format("Increment %s.%s by %d", SECTION, NAME, increment.get()));
+      saveConfig(CONFIG_FILE, cfg);
+      increment = Optional.empty();
+      return true;
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/server/group/db/AbstractGroupTest.java b/javatests/com/google/gerrit/server/group/db/AbstractGroupTest.java
new file mode 100644
index 0000000..9fc6da1
--- /dev/null
+++ b/javatests/com/google/gerrit/server/group/db/AbstractGroupTest.java
@@ -0,0 +1,174 @@
+// Copyright (C) 2017 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.google.gerrit.server.group.db;
+
+import static com.google.gerrit.extensions.common.testing.CommitInfoSubject.assertThat;
+
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.extensions.common.CommitInfo;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.AllUsersNameProvider;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.testing.GerritBaseTests;
+import com.google.gerrit.testing.InMemoryRepositoryManager;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.Optional;
+import java.util.TimeZone;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
+
+@Ignore
+public class AbstractGroupTest extends GerritBaseTests {
+  protected static final TimeZone TZ = TimeZone.getTimeZone("America/Los_Angeles");
+  protected static final String SERVER_ID = "server-id";
+  protected static final String SERVER_NAME = "Gerrit Server";
+  protected static final String SERVER_EMAIL = "noreply@gerritcodereview.com";
+  protected static final int SERVER_ACCOUNT_NUMBER = 100000;
+  protected static final int USER_ACCOUNT_NUMBER = 100001;
+
+  protected AllUsersName allUsersName;
+  protected InMemoryRepositoryManager repoManager;
+  protected Repository allUsersRepo;
+  protected Account.Id serverAccountId;
+  protected PersonIdent serverIdent;
+  protected Account.Id userId;
+  protected PersonIdent userIdent;
+
+  @Before
+  public void abstractGroupTestSetUp() throws Exception {
+    allUsersName = new AllUsersName(AllUsersNameProvider.DEFAULT);
+    repoManager = new InMemoryRepositoryManager();
+    allUsersRepo = repoManager.createRepository(allUsersName);
+    serverAccountId = new Account.Id(SERVER_ACCOUNT_NUMBER);
+    serverIdent = new PersonIdent(SERVER_NAME, SERVER_EMAIL, TimeUtil.nowTs(), TZ);
+    userId = new Account.Id(USER_ACCOUNT_NUMBER);
+    userIdent = newPersonIdent(userId, serverIdent);
+  }
+
+  @After
+  public void abstractGroupTestTearDown() throws Exception {
+    allUsersRepo.close();
+  }
+
+  protected Timestamp getTipTimestamp(AccountGroup.UUID uuid) throws Exception {
+    try (RevWalk rw = new RevWalk(allUsersRepo)) {
+      Ref ref = allUsersRepo.exactRef(RefNames.refsGroups(uuid));
+      return ref == null
+          ? null
+          : new Timestamp(rw.parseCommit(ref.getObjectId()).getAuthorIdent().getWhen().getTime());
+    }
+  }
+
+  protected static void assertServerCommit(CommitInfo commitInfo, String expectedMessage) {
+    assertCommit(commitInfo, expectedMessage, SERVER_NAME, SERVER_EMAIL);
+  }
+
+  protected static void assertCommit(
+      CommitInfo commitInfo, String expectedMessage, String expectedName, String expectedEmail) {
+    assertThat(commitInfo).message().isEqualTo(expectedMessage);
+    assertThat(commitInfo).author().name().isEqualTo(expectedName);
+    assertThat(commitInfo).author().email().isEqualTo(expectedEmail);
+
+    // Committer should always be the server, regardless of author.
+    assertThat(commitInfo).committer().name().isEqualTo(SERVER_NAME);
+    assertThat(commitInfo).committer().email().isEqualTo(SERVER_EMAIL);
+    assertThat(commitInfo).committer().date().isEqualTo(commitInfo.author.date);
+    assertThat(commitInfo).committer().tz().isEqualTo(commitInfo.author.tz);
+  }
+
+  protected MetaDataUpdate createMetaDataUpdate(PersonIdent authorIdent) {
+    MetaDataUpdate md =
+        new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, allUsersRepo);
+    md.getCommitBuilder().setAuthor(authorIdent);
+    md.getCommitBuilder().setCommitter(serverIdent); // Committer is always the server identity.
+    return md;
+  }
+
+  protected static PersonIdent newPersonIdent() {
+    return new PersonIdent(SERVER_NAME, SERVER_EMAIL, TimeUtil.nowTs(), TZ);
+  }
+
+  protected static PersonIdent newPersonIdent(Account.Id id, PersonIdent ident) {
+    return new PersonIdent(
+        getAccountName(id), getAccountEmail(id), ident.getWhen(), ident.getTimeZone());
+  }
+
+  protected AuditLogFormatter getAuditLogFormatter() {
+    return AuditLogFormatter.create(AbstractGroupTest::getAccount, this::getGroup, SERVER_ID);
+  }
+
+  private static Optional<Account> getAccount(Account.Id id) {
+    Account account = new Account(id, TimeUtil.nowTs());
+    account.setFullName("Account " + id);
+    return Optional.of(account);
+  }
+
+  private Optional<GroupDescription.Basic> getGroup(AccountGroup.UUID uuid) {
+    GroupDescription.Basic group =
+        new GroupDescription.Basic() {
+          @Override
+          public AccountGroup.UUID getGroupUUID() {
+            return uuid;
+          }
+
+          @Override
+          public String getName() {
+            try {
+              return GroupConfig.loadForGroup(allUsersName, allUsersRepo, uuid)
+                  .getLoadedGroup()
+                  .map(InternalGroup::getName)
+                  .orElse("Group " + uuid);
+            } catch (IOException | ConfigInvalidException e) {
+              return "Group " + uuid;
+            }
+          }
+
+          @Nullable
+          @Override
+          public String getEmailAddress() {
+            return null;
+          }
+
+          @Nullable
+          @Override
+          public String getUrl() {
+            return null;
+          }
+        };
+    return Optional.of(group);
+  }
+
+  protected static String getAccountName(Account.Id id) {
+    return "Account " + id;
+  }
+
+  protected static String getAccountEmail(Account.Id id) {
+    return String.format("%s@%s", id, SERVER_ID);
+  }
+}
diff --git a/javatests/com/google/gerrit/server/group/db/AuditLogReaderTest.java b/javatests/com/google/gerrit/server/group/db/AuditLogReaderTest.java
new file mode 100644
index 0000000..309d710
--- /dev/null
+++ b/javatests/com/google/gerrit/server/group/db/AuditLogReaderTest.java
@@ -0,0 +1,314 @@
+// Copyright (C) 2017 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.google.gerrit.server.group.db;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.AccountGroupByIdAud;
+import com.google.gerrit.reviewdb.client.AccountGroupMemberAudit;
+import com.google.gerrit.server.account.GroupUUID;
+import com.google.gerrit.server.group.InternalGroup;
+import java.sql.Timestamp;
+import java.util.Set;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.junit.Before;
+import org.junit.Test;
+
+/** Unit tests for {@link AuditLogReader}. */
+public final class AuditLogReaderTest extends AbstractGroupTest {
+
+  private AuditLogReader auditLogReader;
+
+  @Before
+  public void setUp() throws Exception {
+    auditLogReader = new AuditLogReader(SERVER_ID, allUsersName);
+  }
+
+  @Test
+  public void createGroupAsUserIdent() throws Exception {
+    InternalGroup group = createGroupAsUser(1, "test-group");
+    AccountGroup.UUID uuid = group.getGroupUUID();
+
+    AccountGroupMemberAudit expAudit =
+        createExpMemberAudit(group.getId(), userId, userId, getTipTimestamp(uuid));
+    assertThat(auditLogReader.getMembersAudit(allUsersRepo, uuid)).containsExactly(expAudit);
+  }
+
+  @Test
+  public void createGroupAsServerIdent() throws Exception {
+    InternalGroup group = createGroup(1, "test-group", serverIdent, null);
+    assertThat(auditLogReader.getMembersAudit(allUsersRepo, group.getGroupUUID())).hasSize(0);
+  }
+
+  @Test
+  public void addAndRemoveMember() throws Exception {
+    InternalGroup group = createGroupAsUser(1, "test-group");
+    AccountGroup.UUID uuid = group.getGroupUUID();
+
+    AccountGroupMemberAudit expAudit1 =
+        createExpMemberAudit(group.getId(), userId, userId, getTipTimestamp(uuid));
+    assertThat(auditLogReader.getMembersAudit(allUsersRepo, uuid)).containsExactly(expAudit1);
+
+    // User adds account 100002 to the group.
+    Account.Id id = new Account.Id(100002);
+    addMembers(uuid, ImmutableSet.of(id));
+
+    AccountGroupMemberAudit expAudit2 =
+        createExpMemberAudit(group.getId(), id, userId, getTipTimestamp(uuid));
+    assertThat(auditLogReader.getMembersAudit(allUsersRepo, uuid))
+        .containsExactly(expAudit1, expAudit2)
+        .inOrder();
+
+    // User removes account 100002 from the group.
+    removeMembers(uuid, ImmutableSet.of(id));
+
+    expAudit2.removed(userId, getTipTimestamp(uuid));
+    assertThat(auditLogReader.getMembersAudit(allUsersRepo, uuid))
+        .containsExactly(expAudit1, expAudit2)
+        .inOrder();
+  }
+
+  @Test
+  public void addMultiMembers() throws Exception {
+    InternalGroup group = createGroupAsUser(1, "test-group");
+    AccountGroup.Id groupId = group.getId();
+    AccountGroup.UUID uuid = group.getGroupUUID();
+
+    AccountGroupMemberAudit expAudit1 =
+        createExpMemberAudit(groupId, userId, userId, getTipTimestamp(uuid));
+    assertThat(auditLogReader.getMembersAudit(allUsersRepo, uuid)).containsExactly(expAudit1);
+
+    Account.Id id1 = new Account.Id(100002);
+    Account.Id id2 = new Account.Id(100003);
+    addMembers(uuid, ImmutableSet.of(id1, id2));
+
+    AccountGroupMemberAudit expAudit2 =
+        createExpMemberAudit(groupId, id1, userId, getTipTimestamp(uuid));
+    AccountGroupMemberAudit expAudit3 =
+        createExpMemberAudit(groupId, id2, userId, getTipTimestamp(uuid));
+
+    assertThat(auditLogReader.getMembersAudit(allUsersRepo, uuid))
+        .containsExactly(expAudit1, expAudit2, expAudit3)
+        .inOrder();
+  }
+
+  @Test
+  public void addAndRemoveSubgroups() throws Exception {
+    InternalGroup group = createGroupAsUser(1, "test-group");
+    AccountGroup.UUID uuid = group.getGroupUUID();
+
+    InternalGroup subgroup = createGroupAsUser(2, "test-group-2");
+    AccountGroup.UUID subgroupUuid = subgroup.getGroupUUID();
+
+    addSubgroups(uuid, ImmutableSet.of(subgroupUuid));
+
+    AccountGroupByIdAud expAudit =
+        createExpGroupAudit(group.getId(), subgroupUuid, userId, getTipTimestamp(uuid));
+    assertThat(auditLogReader.getSubgroupsAudit(allUsersRepo, uuid)).containsExactly(expAudit);
+
+    removeSubgroups(uuid, ImmutableSet.of(subgroupUuid));
+
+    expAudit.removed(userId, getTipTimestamp(uuid));
+    assertThat(auditLogReader.getSubgroupsAudit(allUsersRepo, uuid)).containsExactly(expAudit);
+  }
+
+  @Test
+  public void addMultiSubgroups() throws Exception {
+    InternalGroup group = createGroupAsUser(1, "test-group");
+    AccountGroup.UUID uuid = group.getGroupUUID();
+
+    InternalGroup subgroup1 = createGroupAsUser(2, "test-group-2");
+    InternalGroup subgroup2 = createGroupAsUser(3, "test-group-3");
+    AccountGroup.UUID subgroupUuid1 = subgroup1.getGroupUUID();
+    AccountGroup.UUID subgroupUuid2 = subgroup2.getGroupUUID();
+
+    addSubgroups(uuid, ImmutableSet.of(subgroupUuid1, subgroupUuid2));
+
+    AccountGroupByIdAud expAudit1 =
+        createExpGroupAudit(group.getId(), subgroupUuid1, userId, getTipTimestamp(uuid));
+    AccountGroupByIdAud expAudit2 =
+        createExpGroupAudit(group.getId(), subgroupUuid2, userId, getTipTimestamp(uuid));
+    assertThat(auditLogReader.getSubgroupsAudit(allUsersRepo, uuid))
+        .containsExactly(expAudit1, expAudit2)
+        .inOrder();
+  }
+
+  @Test
+  public void addAndRemoveMembersAndSubgroups() throws Exception {
+    InternalGroup group = createGroupAsUser(1, "test-group");
+    AccountGroup.Id groupId = group.getId();
+    AccountGroup.UUID uuid = group.getGroupUUID();
+    AccountGroupMemberAudit expMemberAudit =
+        createExpMemberAudit(groupId, userId, userId, getTipTimestamp(uuid));
+    assertThat(auditLogReader.getMembersAudit(allUsersRepo, uuid)).containsExactly(expMemberAudit);
+
+    Account.Id id1 = new Account.Id(100002);
+    Account.Id id2 = new Account.Id(100003);
+    Account.Id id3 = new Account.Id(100004);
+    InternalGroup subgroup1 = createGroupAsUser(2, "test-group-2");
+    InternalGroup subgroup2 = createGroupAsUser(3, "test-group-3");
+    InternalGroup subgroup3 = createGroupAsUser(4, "test-group-4");
+    AccountGroup.UUID subgroupUuid1 = subgroup1.getGroupUUID();
+    AccountGroup.UUID subgroupUuid2 = subgroup2.getGroupUUID();
+    AccountGroup.UUID subgroupUuid3 = subgroup3.getGroupUUID();
+
+    // Add two accounts.
+    addMembers(uuid, ImmutableSet.of(id1, id2));
+    AccountGroupMemberAudit expMemberAudit1 =
+        createExpMemberAudit(groupId, id1, userId, getTipTimestamp(uuid));
+    AccountGroupMemberAudit expMemberAudit2 =
+        createExpMemberAudit(groupId, id2, userId, getTipTimestamp(uuid));
+    assertThat(auditLogReader.getMembersAudit(allUsersRepo, uuid))
+        .containsExactly(expMemberAudit, expMemberAudit1, expMemberAudit2)
+        .inOrder();
+
+    // Add one subgroup.
+    addSubgroups(uuid, ImmutableSet.of(subgroupUuid1));
+    AccountGroupByIdAud expGroupAudit1 =
+        createExpGroupAudit(group.getId(), subgroupUuid1, userId, getTipTimestamp(uuid));
+    assertThat(auditLogReader.getSubgroupsAudit(allUsersRepo, uuid))
+        .containsExactly(expGroupAudit1);
+
+    // Remove one account.
+    removeMembers(uuid, ImmutableSet.of(id2));
+    expMemberAudit2.removed(userId, getTipTimestamp(uuid));
+    assertThat(auditLogReader.getMembersAudit(allUsersRepo, uuid))
+        .containsExactly(expMemberAudit, expMemberAudit1, expMemberAudit2)
+        .inOrder();
+
+    // Add two subgroups.
+    addSubgroups(uuid, ImmutableSet.of(subgroupUuid2, subgroupUuid3));
+    AccountGroupByIdAud expGroupAudit2 =
+        createExpGroupAudit(group.getId(), subgroupUuid2, userId, getTipTimestamp(uuid));
+    AccountGroupByIdAud expGroupAudit3 =
+        createExpGroupAudit(group.getId(), subgroupUuid3, userId, getTipTimestamp(uuid));
+    assertThat(auditLogReader.getSubgroupsAudit(allUsersRepo, uuid))
+        .containsExactly(expGroupAudit1, expGroupAudit2, expGroupAudit3)
+        .inOrder();
+
+    // Add two account, including a removed account.
+    addMembers(uuid, ImmutableSet.of(id2, id3));
+    AccountGroupMemberAudit expMemberAudit4 =
+        createExpMemberAudit(groupId, id2, userId, getTipTimestamp(uuid));
+    AccountGroupMemberAudit expMemberAudit3 =
+        createExpMemberAudit(groupId, id3, userId, getTipTimestamp(uuid));
+    assertThat(auditLogReader.getMembersAudit(allUsersRepo, uuid))
+        .containsExactly(
+            expMemberAudit, expMemberAudit1, expMemberAudit2, expMemberAudit4, expMemberAudit3)
+        .inOrder();
+
+    // Remove two subgroups.
+    removeSubgroups(uuid, ImmutableSet.of(subgroupUuid1, subgroupUuid3));
+    expGroupAudit1.removed(userId, getTipTimestamp(uuid));
+    expGroupAudit3.removed(userId, getTipTimestamp(uuid));
+    assertThat(auditLogReader.getSubgroupsAudit(allUsersRepo, uuid))
+        .containsExactly(expGroupAudit1, expGroupAudit2, expGroupAudit3)
+        .inOrder();
+
+    // Add back one removed subgroup.
+    addSubgroups(uuid, ImmutableSet.of(subgroupUuid1));
+    AccountGroupByIdAud expGroupAudit4 =
+        createExpGroupAudit(group.getId(), subgroupUuid1, userId, getTipTimestamp(uuid));
+    assertThat(auditLogReader.getSubgroupsAudit(allUsersRepo, uuid))
+        .containsExactly(expGroupAudit1, expGroupAudit2, expGroupAudit3, expGroupAudit4)
+        .inOrder();
+  }
+
+  private InternalGroup createGroupAsUser(int next, String groupName) throws Exception {
+    return createGroup(next, groupName, userIdent, userId);
+  }
+
+  private InternalGroup createGroup(
+      int next, String groupName, PersonIdent authorIdent, Account.Id authorId) throws Exception {
+    InternalGroupCreation groupCreation =
+        InternalGroupCreation.builder()
+            .setGroupUUID(GroupUUID.make(groupName, serverIdent))
+            .setNameKey(new AccountGroup.NameKey(groupName))
+            .setId(new AccountGroup.Id(next))
+            .build();
+    InternalGroupUpdate groupUpdate =
+        authorIdent.equals(serverIdent)
+            ? InternalGroupUpdate.builder().setDescription("Groups").build()
+            : InternalGroupUpdate.builder()
+                .setDescription("Groups")
+                .setMemberModification(members -> ImmutableSet.of(authorId))
+                .build();
+
+    GroupConfig groupConfig =
+        GroupConfig.createForNewGroup(allUsersName, allUsersRepo, groupCreation);
+    groupConfig.setGroupUpdate(groupUpdate, getAuditLogFormatter());
+
+    groupConfig.commit(createMetaDataUpdate(authorIdent));
+    return groupConfig
+        .getLoadedGroup()
+        .orElseThrow(() -> new IllegalStateException("create group failed"));
+  }
+
+  private void updateGroup(AccountGroup.UUID uuid, InternalGroupUpdate groupUpdate)
+      throws Exception {
+    GroupConfig groupConfig = GroupConfig.loadForGroup(allUsersName, allUsersRepo, uuid);
+    groupConfig.setGroupUpdate(groupUpdate, getAuditLogFormatter());
+    groupConfig.commit(createMetaDataUpdate(userIdent));
+  }
+
+  private void addMembers(AccountGroup.UUID groupUuid, Set<Account.Id> ids) throws Exception {
+    InternalGroupUpdate update =
+        InternalGroupUpdate.builder()
+            .setMemberModification(memberIds -> Sets.union(memberIds, ids))
+            .build();
+    updateGroup(groupUuid, update);
+  }
+
+  private void removeMembers(AccountGroup.UUID groupUuid, Set<Account.Id> ids) throws Exception {
+    InternalGroupUpdate update =
+        InternalGroupUpdate.builder()
+            .setMemberModification(memberIds -> Sets.difference(memberIds, ids))
+            .build();
+    updateGroup(groupUuid, update);
+  }
+
+  private void addSubgroups(AccountGroup.UUID groupUuid, Set<AccountGroup.UUID> uuids)
+      throws Exception {
+    InternalGroupUpdate update =
+        InternalGroupUpdate.builder()
+            .setSubgroupModification(memberIds -> Sets.union(memberIds, uuids))
+            .build();
+    updateGroup(groupUuid, update);
+  }
+
+  private void removeSubgroups(AccountGroup.UUID groupUuid, Set<AccountGroup.UUID> uuids)
+      throws Exception {
+    InternalGroupUpdate update =
+        InternalGroupUpdate.builder()
+            .setSubgroupModification(memberIds -> Sets.difference(memberIds, uuids))
+            .build();
+    updateGroup(groupUuid, update);
+  }
+
+  private static AccountGroupMemberAudit createExpMemberAudit(
+      AccountGroup.Id groupId, Account.Id id, Account.Id addedBy, Timestamp addedOn) {
+    return new AccountGroupMemberAudit(
+        new AccountGroupMemberAudit.Key(id, groupId, addedOn), addedBy);
+  }
+
+  private static AccountGroupByIdAud createExpGroupAudit(
+      AccountGroup.Id groupId, AccountGroup.UUID uuid, Account.Id addedBy, Timestamp addedOn) {
+    return new AccountGroupByIdAud(new AccountGroupByIdAud.Key(groupId, uuid, addedOn), addedBy);
+  }
+}
diff --git a/javatests/com/google/gerrit/server/group/db/BUILD b/javatests/com/google/gerrit/server/group/db/BUILD
new file mode 100644
index 0000000..f3dd5d6
--- /dev/null
+++ b/javatests/com/google/gerrit/server/group/db/BUILD
@@ -0,0 +1,26 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+junit_tests(
+    name = "db_tests",
+    size = "small",
+    srcs = glob(["*.java"]),
+    deps = [
+        "//java/com/google/gerrit/common:annotations",
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/common/data/testing:common-data-test-util",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/extensions/common/testing:common-test-util",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/server/group/db/testing",
+        "//java/com/google/gerrit/server/group/testing",
+        "//java/com/google/gerrit/server/util/time",
+        "//java/com/google/gerrit/testing:gerrit-test-util",
+        "//java/com/google/gerrit/truth",
+        "//lib:guava",
+        "//lib:gwtorm",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/jgit/org.eclipse.jgit.junit:junit",
+        "//lib/truth",
+    ],
+)
diff --git a/javatests/com/google/gerrit/server/group/db/GroupConfigTest.java b/javatests/com/google/gerrit/server/group/db/GroupConfigTest.java
new file mode 100644
index 0000000..a5744d1
--- /dev/null
+++ b/javatests/com/google/gerrit/server/group/db/GroupConfigTest.java
@@ -0,0 +1,1688 @@
+// Copyright (C) 2017 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.google.gerrit.server.group.db;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+import static com.google.gerrit.truth.OptionalSubject.assertThat;
+import static org.hamcrest.CoreMatchers.instanceOf;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.group.testing.InternalGroupSubject;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.truth.OptionalSubject;
+import com.google.gwtorm.client.KeyUtil;
+import com.google.gwtorm.server.StandardKeyEncoder;
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.Month;
+import java.time.ZoneId;
+import java.util.Optional;
+import java.util.TimeZone;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+public class GroupConfigTest {
+  static {
+    // Necessary so that toString() methods of ReviewDb entities work correctly.
+    KeyUtil.setEncoderImpl(new StandardKeyEncoder());
+  }
+
+  @Rule public ExpectedException expectedException = ExpectedException.none();
+
+  private Project.NameKey projectName;
+  private Repository repository;
+  private TestRepository<?> testRepository;
+  private final AccountGroup.UUID groupUuid = new AccountGroup.UUID("users-XYZ");
+  private final AccountGroup.NameKey groupName = new AccountGroup.NameKey("users");
+  private final AccountGroup.Id groupId = new AccountGroup.Id(123);
+  private final AuditLogFormatter auditLogFormatter =
+      AuditLogFormatter.createBackedBy(ImmutableSet.of(), ImmutableSet.of(), "server-id");
+  private final TimeZone timeZone = TimeZone.getTimeZone("America/Los_Angeles");
+
+  @Before
+  public void setUp() throws Exception {
+    projectName = new Project.NameKey("Test Repository");
+    repository = new InMemoryRepository(new DfsRepositoryDescription("Test Repository"));
+    testRepository = new TestRepository<>(repository);
+  }
+
+  @Test
+  public void specifiedGroupUuidIsRespectedForNewGroup() throws Exception {
+    InternalGroupCreation groupCreation =
+        getPrefilledGroupCreationBuilder().setGroupUUID(groupUuid).build();
+    createGroup(groupCreation);
+
+    Optional<InternalGroup> group = loadGroup(groupUuid);
+    assertThatGroup(group).value().groupUuid().isEqualTo(groupUuid);
+  }
+
+  @Test
+  public void specifiedNameIsRespectedForNewGroup() throws Exception {
+    InternalGroupCreation groupCreation =
+        getPrefilledGroupCreationBuilder().setNameKey(groupName).build();
+    createGroup(groupCreation);
+
+    Optional<InternalGroup> group = loadGroup(groupCreation.getGroupUUID());
+    assertThatGroup(group).value().nameKey().isEqualTo(groupName);
+  }
+
+  @Test
+  public void nameOfGroupUpdateOverridesGroupCreation() throws Exception {
+    AccountGroup.NameKey anotherName = new AccountGroup.NameKey("Another name");
+
+    InternalGroupCreation groupCreation =
+        getPrefilledGroupCreationBuilder().setNameKey(groupName).build();
+    InternalGroupUpdate groupUpdate = InternalGroupUpdate.builder().setName(anotherName).build();
+    createGroup(groupCreation, groupUpdate);
+
+    Optional<InternalGroup> group = loadGroup(groupCreation.getGroupUUID());
+    assertThatGroup(group).value().nameKey().isEqualTo(anotherName);
+  }
+
+  @Test
+  public void nameOfNewGroupMustNotBeEmpty() throws Exception {
+    InternalGroupCreation groupCreation =
+        getPrefilledGroupCreationBuilder().setNameKey(new AccountGroup.NameKey("")).build();
+    GroupConfig groupConfig = GroupConfig.createForNewGroup(projectName, repository, groupCreation);
+
+    try (MetaDataUpdate metaDataUpdate = createMetaDataUpdate()) {
+      expectedException.expectCause(instanceOf(ConfigInvalidException.class));
+      expectedException.expectMessage("Name of the group " + groupUuid);
+      groupConfig.commit(metaDataUpdate);
+    }
+  }
+
+  @Test
+  public void nameOfNewGroupMustNotBeNull() throws Exception {
+    InternalGroupCreation groupCreation =
+        getPrefilledGroupCreationBuilder().setNameKey(new AccountGroup.NameKey(null)).build();
+    GroupConfig groupConfig = GroupConfig.createForNewGroup(projectName, repository, groupCreation);
+
+    try (MetaDataUpdate metaDataUpdate = createMetaDataUpdate()) {
+      expectedException.expectCause(instanceOf(ConfigInvalidException.class));
+      expectedException.expectMessage("Name of the group " + groupUuid);
+      groupConfig.commit(metaDataUpdate);
+    }
+  }
+
+  @Test
+  public void specifiedIdIsRespectedForNewGroup() throws Exception {
+    InternalGroupCreation groupCreation = getPrefilledGroupCreationBuilder().setId(groupId).build();
+    createGroup(groupCreation);
+
+    Optional<InternalGroup> group = loadGroup(groupCreation.getGroupUUID());
+    assertThatGroup(group).value().id().isEqualTo(groupId);
+  }
+
+  @Test
+  public void idOfNewGroupMustNotBeNegative() throws Exception {
+    InternalGroupCreation groupCreation =
+        getPrefilledGroupCreationBuilder().setId(new AccountGroup.Id(-2)).build();
+    GroupConfig groupConfig = GroupConfig.createForNewGroup(projectName, repository, groupCreation);
+
+    try (MetaDataUpdate metaDataUpdate = createMetaDataUpdate()) {
+      expectedException.expectCause(instanceOf(ConfigInvalidException.class));
+      expectedException.expectMessage("ID of the group " + groupUuid);
+      groupConfig.commit(metaDataUpdate);
+    }
+  }
+
+  @Test
+  public void descriptionDefaultsToNull() throws Exception {
+    InternalGroupCreation groupCreation =
+        InternalGroupCreation.builder()
+            .setGroupUUID(groupUuid)
+            .setNameKey(groupName)
+            .setId(groupId)
+            .build();
+    createGroup(groupCreation);
+
+    Optional<InternalGroup> group = loadGroup(groupCreation.getGroupUUID());
+    assertThatGroup(group).value().description().isNull();
+  }
+
+  @Test
+  public void specifiedDescriptionIsRespectedForNewGroup() throws Exception {
+    String description = "This is a test group.";
+
+    InternalGroupCreation groupCreation = getPrefilledGroupCreationBuilder().build();
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder().setDescription(description).build();
+    createGroup(groupCreation, groupUpdate);
+
+    Optional<InternalGroup> group = loadGroup(groupCreation.getGroupUUID());
+    assertThatGroup(group).value().description().isEqualTo(description);
+  }
+
+  @Test
+  public void emptyDescriptionForNewGroupIsIgnored() throws Exception {
+    InternalGroupCreation groupCreation = getPrefilledGroupCreationBuilder().build();
+    InternalGroupUpdate groupUpdate = InternalGroupUpdate.builder().setDescription("").build();
+    createGroup(groupCreation, groupUpdate);
+
+    Optional<InternalGroup> group = loadGroup(groupCreation.getGroupUUID());
+    assertThatGroup(group).value().description().isNull();
+  }
+
+  @Test
+  public void ownerGroupUuidDefaultsToGroupItself() throws Exception {
+    InternalGroupCreation groupCreation =
+        InternalGroupCreation.builder()
+            .setGroupUUID(groupUuid)
+            .setNameKey(groupName)
+            .setId(groupId)
+            .build();
+    createGroup(groupCreation);
+
+    Optional<InternalGroup> group = loadGroup(groupCreation.getGroupUUID());
+    assertThatGroup(group).value().ownerGroupUuid().isEqualTo(groupUuid);
+  }
+
+  @Test
+  public void specifiedOwnerGroupUuidIsRespectedForNewGroup() throws Exception {
+    AccountGroup.UUID ownerGroupUuid = new AccountGroup.UUID("anotherOwnerUuid");
+
+    InternalGroupCreation groupCreation = getPrefilledGroupCreationBuilder().build();
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder().setOwnerGroupUUID(ownerGroupUuid).build();
+    createGroup(groupCreation, groupUpdate);
+
+    Optional<InternalGroup> group = loadGroup(groupCreation.getGroupUUID());
+    assertThatGroup(group).value().ownerGroupUuid().isEqualTo(ownerGroupUuid);
+  }
+
+  @Test
+  public void ownerGroupUuidOfNewGroupMustNotBeNull() throws Exception {
+    InternalGroupCreation groupCreation = getPrefilledGroupCreationBuilder().build();
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder().setOwnerGroupUUID(new AccountGroup.UUID(null)).build();
+    GroupConfig groupConfig = GroupConfig.createForNewGroup(projectName, repository, groupCreation);
+    groupConfig.setGroupUpdate(groupUpdate, auditLogFormatter);
+
+    try (MetaDataUpdate metaDataUpdate = createMetaDataUpdate()) {
+      expectedException.expectCause(instanceOf(ConfigInvalidException.class));
+      expectedException.expectMessage("Owner UUID of the group " + groupUuid);
+      groupConfig.commit(metaDataUpdate);
+    }
+  }
+
+  @Test
+  public void ownerGroupUuidOfNewGroupMustNotBeEmpty() throws Exception {
+    InternalGroupCreation groupCreation = getPrefilledGroupCreationBuilder().build();
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder().setOwnerGroupUUID(new AccountGroup.UUID("")).build();
+    GroupConfig groupConfig = GroupConfig.createForNewGroup(projectName, repository, groupCreation);
+    groupConfig.setGroupUpdate(groupUpdate, auditLogFormatter);
+
+    try (MetaDataUpdate metaDataUpdate = createMetaDataUpdate()) {
+      expectedException.expectCause(instanceOf(ConfigInvalidException.class));
+      expectedException.expectMessage("Owner UUID of the group " + groupUuid);
+      groupConfig.commit(metaDataUpdate);
+    }
+  }
+
+  @Test
+  public void visibleToAllDefaultsToFalse() throws Exception {
+    InternalGroupCreation groupCreation =
+        InternalGroupCreation.builder()
+            .setGroupUUID(groupUuid)
+            .setNameKey(groupName)
+            .setId(groupId)
+            .build();
+    createGroup(groupCreation);
+
+    Optional<InternalGroup> group = loadGroup(groupCreation.getGroupUUID());
+    assertThatGroup(group).value().visibleToAll().isFalse();
+  }
+
+  @Test
+  public void specifiedVisibleToAllIsRespectedForNewGroup() throws Exception {
+    InternalGroupCreation groupCreation = getPrefilledGroupCreationBuilder().build();
+    InternalGroupUpdate groupUpdate = InternalGroupUpdate.builder().setVisibleToAll(true).build();
+    createGroup(groupCreation, groupUpdate);
+
+    Optional<InternalGroup> group = loadGroup(groupCreation.getGroupUUID());
+    assertThatGroup(group).value().visibleToAll().isTrue();
+  }
+
+  @Test
+  public void createdOnDefaultsToNow() throws Exception {
+    // Git timestamps are only precise to the second.
+    Timestamp testStart = TimeUtil.truncateToSecond(TimeUtil.nowTs());
+
+    InternalGroupCreation groupCreation =
+        InternalGroupCreation.builder()
+            .setGroupUUID(groupUuid)
+            .setNameKey(groupName)
+            .setId(groupId)
+            .build();
+    createGroup(groupCreation);
+
+    Optional<InternalGroup> group = loadGroup(groupCreation.getGroupUUID());
+    assertThatGroup(group).value().createdOn().isAtLeast(testStart);
+  }
+
+  @Test
+  public void specifiedCreatedOnIsRespectedForNewGroup() throws Exception {
+    Timestamp createdOn = toTimestamp(LocalDate.of(2017, Month.DECEMBER, 11).atTime(13, 44, 10));
+
+    InternalGroupCreation groupCreation = getPrefilledGroupCreationBuilder().build();
+    InternalGroupUpdate groupUpdate = InternalGroupUpdate.builder().setUpdatedOn(createdOn).build();
+    createGroup(groupCreation, groupUpdate);
+
+    Optional<InternalGroup> group = loadGroup(groupCreation.getGroupUUID());
+    assertThatGroup(group).value().createdOn().isEqualTo(createdOn);
+  }
+
+  @Test
+  public void specifiedMembersAreRespectedForNewGroup() throws Exception {
+    Account.Id member1 = new Account.Id(1);
+    Account.Id member2 = new Account.Id(2);
+
+    InternalGroupCreation groupCreation = getPrefilledGroupCreationBuilder().build();
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder()
+            .setMemberModification(members -> ImmutableSet.of(member1, member2))
+            .build();
+    createGroup(groupCreation, groupUpdate);
+
+    Optional<InternalGroup> group = loadGroup(groupCreation.getGroupUUID());
+    assertThatGroup(group).value().members().containsExactly(member1, member2);
+  }
+
+  @Test
+  public void specifiedSubgroupsAreRespectedForNewGroup() throws Exception {
+    AccountGroup.UUID subgroup1 = new AccountGroup.UUID("subgroup1");
+    AccountGroup.UUID subgroup2 = new AccountGroup.UUID("subgroup2");
+
+    InternalGroupCreation groupCreation = getPrefilledGroupCreationBuilder().build();
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder()
+            .setSubgroupModification(subgroups -> ImmutableSet.of(subgroup1, subgroup2))
+            .build();
+    createGroup(groupCreation, groupUpdate);
+
+    Optional<InternalGroup> group = loadGroup(groupCreation.getGroupUUID());
+    assertThatGroup(group).value().subgroups().containsExactly(subgroup1, subgroup2);
+  }
+
+  @Test
+  public void nameInConfigMayBeUndefined() throws Exception {
+    populateGroupConfig(groupUuid, "[group]\n\tid = 42\n\townerGroupUuid = owners\n");
+
+    Optional<InternalGroup> group = loadGroup(groupUuid);
+    assertThatGroup(group).value().name().isEmpty();
+  }
+
+  @Test
+  public void nameInConfigMayBeEmpty() throws Exception {
+    populateGroupConfig(groupUuid, "[group]\n\tname=\n\tid = 42\n\townerGroupUuid = owners\n");
+
+    Optional<InternalGroup> group = loadGroup(groupUuid);
+    assertThatGroup(group).value().name().isEmpty();
+  }
+
+  @Test
+  public void idInConfigMustBeDefined() throws Exception {
+    populateGroupConfig(groupUuid, "[group]\n\tname = users\n\townerGroupUuid = owners\n");
+
+    expectedException.expect(ConfigInvalidException.class);
+    expectedException.expectMessage("ID of the group " + groupUuid);
+    GroupConfig.loadForGroup(projectName, repository, groupUuid);
+  }
+
+  @Test
+  public void idInConfigMustNotBeNegative() throws Exception {
+    populateGroupConfig(
+        groupUuid, "[group]\n\tname = users\n\tid = -5\n\townerGroupUuid = owners\n");
+
+    expectedException.expect(ConfigInvalidException.class);
+    expectedException.expectMessage("ID of the group " + groupUuid);
+    GroupConfig.loadForGroup(projectName, repository, groupUuid);
+  }
+
+  @Test
+  public void descriptionInConfigMayBeUndefined() throws Exception {
+    populateGroupConfig(groupUuid, "[group]\n\tid = 42\n\townerGroupUuid = owners\n");
+
+    Optional<InternalGroup> group = loadGroup(groupUuid);
+    assertThatGroup(group).value().description().isNull();
+  }
+
+  @Test
+  public void descriptionInConfigMayBeEmpty() throws Exception {
+    populateGroupConfig(
+        groupUuid, "[group]\n\tdescription=\n\tid = 42\n\townerGroupUuid = owners\n");
+
+    Optional<InternalGroup> group = loadGroup(groupUuid);
+    assertThatGroup(group).value().description().isNull();
+  }
+
+  @Test
+  public void ownerGroupUuidInConfigMustBeDefined() throws Exception {
+    populateGroupConfig(groupUuid, "[group]\n\tname = users\n\tid = 42\n");
+
+    expectedException.expect(ConfigInvalidException.class);
+    expectedException.expectMessage("Owner UUID of the group " + groupUuid);
+    GroupConfig.loadForGroup(projectName, repository, groupUuid);
+  }
+
+  @Test
+  public void membersFileNeedNotExist() throws Exception {
+    populateGroupConfig(groupUuid, "[group]\n\tname=users\n\tid = 42\n\townerGroupUuid = owners\n");
+
+    Optional<InternalGroup> group = loadGroup(groupUuid);
+    assertThatGroup(group).value().members().isEmpty();
+  }
+
+  @Test
+  public void membersFileMayBeEmpty() throws Exception {
+    populateGroupConfig(groupUuid, "[group]\n\tname=users\n\tid = 42\n\townerGroupUuid = owners\n");
+    populateSubgroupsFile(groupUuid, "");
+
+    Optional<InternalGroup> group = loadGroup(groupUuid);
+    assertThatGroup(group).value().members().isEmpty();
+  }
+
+  @Test
+  public void membersFileMayContainOnlyWhitespace() throws Exception {
+    populateGroupConfig(groupUuid, "[group]\n\tname=users\n\tid = 42\n\townerGroupUuid = owners\n");
+    populateMembersFile(groupUuid, "\n\t\n\n");
+
+    Optional<InternalGroup> group = loadGroup(groupUuid);
+    assertThatGroup(group).value().members().isEmpty();
+  }
+
+  @Test
+  public void membersFileMayUseAnyLineBreakCharacters() throws Exception {
+    populateGroupConfig(groupUuid, "[group]\n\tname=users\n\tid = 42\n\townerGroupUuid = owners\n");
+    populateMembersFile(groupUuid, "1\n2\n3\r4\r\n5\u20296");
+
+    Optional<InternalGroup> group = loadGroup(groupUuid);
+    assertThatGroup(group)
+        .value()
+        .members()
+        .containsExactly(
+            new Account.Id(1),
+            new Account.Id(2),
+            new Account.Id(3),
+            new Account.Id(4),
+            new Account.Id(5),
+            new Account.Id(6));
+  }
+
+  @Test
+  public void membersFileMustContainIntegers() throws Exception {
+    populateGroupConfig(groupUuid, "[group]\n\tname=users\n\tid = 42\n\townerGroupUuid = owners\n");
+    populateMembersFile(groupUuid, "One");
+
+    expectedException.expect(ConfigInvalidException.class);
+    expectedException.expectMessage("Invalid file members");
+    loadGroup(groupUuid);
+  }
+
+  @Test
+  public void membersFileUsesLineBreaksToSeparateMembers() throws Exception {
+    populateGroupConfig(groupUuid, "[group]\n\tname=users\n\tid = 42\n\townerGroupUuid = owners\n");
+    populateMembersFile(groupUuid, "1\t2");
+
+    expectedException.expect(ConfigInvalidException.class);
+    expectedException.expectMessage("Invalid file members");
+    loadGroup(groupUuid);
+  }
+
+  @Test
+  public void subgroupsFileNeedNotExist() throws Exception {
+    populateGroupConfig(groupUuid, "[group]\n\tname=users\n\tid = 42\n\townerGroupUuid = owners\n");
+
+    Optional<InternalGroup> group = loadGroup(groupUuid);
+    assertThatGroup(group).value().subgroups().isEmpty();
+  }
+
+  @Test
+  public void subgroupsFileMayBeEmpty() throws Exception {
+    populateGroupConfig(groupUuid, "[group]\n\tname=users\n\tid = 42\n\townerGroupUuid = owners\n");
+    populateMembersFile(groupUuid, "");
+
+    Optional<InternalGroup> group = loadGroup(groupUuid);
+    assertThatGroup(group).value().subgroups().isEmpty();
+  }
+
+  @Test
+  public void subgroupsFileMayContainOnlyWhitespace() throws Exception {
+    populateGroupConfig(groupUuid, "[group]\n\tname=users\n\tid = 42\n\townerGroupUuid = owners\n");
+    populateSubgroupsFile(groupUuid, "\n\t\n\n");
+
+    Optional<InternalGroup> group = loadGroup(groupUuid);
+    assertThatGroup(group).value().subgroups().isEmpty();
+  }
+
+  @Test
+  public void subgroupsFileMayUseAnyLineBreakCharacters() throws Exception {
+    populateGroupConfig(groupUuid, "[group]\n\tname=users\n\tid = 42\n\townerGroupUuid = owners\n");
+    populateSubgroupsFile(groupUuid, "1\n2\n3\r4\r\n5\u20296");
+
+    Optional<InternalGroup> group = loadGroup(groupUuid);
+    assertThatGroup(group)
+        .value()
+        .subgroups()
+        .containsExactly(
+            new AccountGroup.UUID("1"),
+            new AccountGroup.UUID("2"),
+            new AccountGroup.UUID("3"),
+            new AccountGroup.UUID("4"),
+            new AccountGroup.UUID("5"),
+            new AccountGroup.UUID("6"));
+  }
+
+  @Test
+  public void subgroupsFileMayContainSubgroupsWithWhitespaceInUuid() throws Exception {
+    populateGroupConfig(groupUuid, "[group]\n\tname=users\n\tid = 42\n\townerGroupUuid = owners\n");
+    populateSubgroupsFile(groupUuid, "1\t2 3");
+
+    Optional<InternalGroup> group = loadGroup(groupUuid);
+    assertThatGroup(group).value().subgroups().containsExactly(new AccountGroup.UUID("1\t2 3"));
+  }
+
+  @Test
+  public void subgroupsFileUsesLineBreaksToSeparateSubgroups() throws Exception {
+    populateGroupConfig(groupUuid, "[group]\n\tname=users\n\tid = 42\n\townerGroupUuid = owners\n");
+    populateSubgroupsFile(groupUuid, "1\t2\n3");
+
+    Optional<InternalGroup> group = loadGroup(groupUuid);
+    assertThatGroup(group)
+        .value()
+        .subgroups()
+        .containsExactly(new AccountGroup.UUID("1\t2"), new AccountGroup.UUID("3"));
+  }
+
+  @Test
+  public void nameCanBeUpdated() throws Exception {
+    createArbitraryGroup(groupUuid);
+    AccountGroup.NameKey newName = new AccountGroup.NameKey("New name");
+
+    InternalGroupUpdate groupUpdate = InternalGroupUpdate.builder().setName(newName).build();
+    updateGroup(groupUuid, groupUpdate);
+
+    Optional<InternalGroup> group = loadGroup(groupUuid);
+    assertThatGroup(group).value().nameKey().isEqualTo(newName);
+  }
+
+  @Test
+  public void nameCannotBeUpdatedToNull() throws Exception {
+    createArbitraryGroup(groupUuid);
+
+    GroupConfig groupConfig = GroupConfig.loadForGroup(projectName, repository, groupUuid);
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder().setName(new AccountGroup.NameKey(null)).build();
+    groupConfig.setGroupUpdate(groupUpdate, auditLogFormatter);
+
+    try (MetaDataUpdate metaDataUpdate = createMetaDataUpdate()) {
+      expectedException.expectCause(instanceOf(ConfigInvalidException.class));
+      expectedException.expectMessage("Name of the group " + groupUuid);
+      groupConfig.commit(metaDataUpdate);
+    }
+  }
+
+  @Test
+  public void nameCannotBeUpdatedToEmptyString() throws Exception {
+    createArbitraryGroup(groupUuid);
+
+    GroupConfig groupConfig = GroupConfig.loadForGroup(projectName, repository, groupUuid);
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder().setName(new AccountGroup.NameKey("")).build();
+    groupConfig.setGroupUpdate(groupUpdate, auditLogFormatter);
+
+    try (MetaDataUpdate metaDataUpdate = createMetaDataUpdate()) {
+      expectedException.expectCause(instanceOf(ConfigInvalidException.class));
+      expectedException.expectMessage("Name of the group " + groupUuid);
+      groupConfig.commit(metaDataUpdate);
+    }
+  }
+
+  @Test
+  public void nameCanBeUpdatedToEmptyStringIfExplicitlySpecified() throws Exception {
+    createArbitraryGroup(groupUuid);
+    AccountGroup.NameKey emptyName = new AccountGroup.NameKey("");
+
+    GroupConfig groupConfig = GroupConfig.loadForGroup(projectName, repository, groupUuid);
+    groupConfig.setAllowSaveEmptyName();
+    InternalGroupUpdate groupUpdate = InternalGroupUpdate.builder().setName(emptyName).build();
+    groupConfig.setGroupUpdate(groupUpdate, auditLogFormatter);
+    commit(groupConfig);
+
+    Optional<InternalGroup> group = loadGroup(groupUuid);
+    assertThatGroup(group).value().nameKey().isEqualTo(emptyName);
+  }
+
+  @Test
+  public void descriptionCanBeUpdated() throws Exception {
+    createArbitraryGroup(groupUuid);
+    String newDescription = "New description";
+
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder().setDescription(newDescription).build();
+    updateGroup(groupUuid, groupUpdate);
+
+    Optional<InternalGroup> group = loadGroup(groupUuid);
+    assertThatGroup(group).value().description().isEqualTo(newDescription);
+  }
+
+  @Test
+  public void descriptionCanBeRemoved() throws Exception {
+    createArbitraryGroup(groupUuid);
+
+    InternalGroupUpdate groupUpdate = InternalGroupUpdate.builder().setDescription("").build();
+    Optional<InternalGroup> group = updateGroup(groupUuid, groupUpdate);
+
+    assertThatGroup(group).value().description().isNull();
+  }
+
+  @Test
+  public void ownerGroupUuidCanBeUpdated() throws Exception {
+    createArbitraryGroup(groupUuid);
+    AccountGroup.UUID newOwnerGroupUuid = new AccountGroup.UUID("New owner");
+
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder().setOwnerGroupUUID(newOwnerGroupUuid).build();
+    updateGroup(groupUuid, groupUpdate);
+
+    Optional<InternalGroup> group = loadGroup(groupUuid);
+    assertThatGroup(group).value().ownerGroupUuid().isEqualTo(newOwnerGroupUuid);
+  }
+
+  @Test
+  public void ownerGroupUuidCannotBeUpdatedToNull() throws Exception {
+    createArbitraryGroup(groupUuid);
+
+    GroupConfig groupConfig = GroupConfig.loadForGroup(projectName, repository, groupUuid);
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder().setOwnerGroupUUID(new AccountGroup.UUID(null)).build();
+    groupConfig.setGroupUpdate(groupUpdate, auditLogFormatter);
+
+    try (MetaDataUpdate metaDataUpdate = createMetaDataUpdate()) {
+      expectedException.expectCause(instanceOf(ConfigInvalidException.class));
+      expectedException.expectMessage("Owner UUID of the group " + groupUuid);
+      groupConfig.commit(metaDataUpdate);
+    }
+  }
+
+  @Test
+  public void ownerGroupUuidCannotBeUpdatedToEmptyString() throws Exception {
+    createArbitraryGroup(groupUuid);
+
+    GroupConfig groupConfig = GroupConfig.loadForGroup(projectName, repository, groupUuid);
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder().setOwnerGroupUUID(new AccountGroup.UUID("")).build();
+    groupConfig.setGroupUpdate(groupUpdate, auditLogFormatter);
+
+    try (MetaDataUpdate metaDataUpdate = createMetaDataUpdate()) {
+      expectedException.expectCause(instanceOf(ConfigInvalidException.class));
+      expectedException.expectMessage("Owner UUID of the group " + groupUuid);
+      groupConfig.commit(metaDataUpdate);
+    }
+  }
+
+  @Test
+  public void visibleToAllCanBeUpdated() throws Exception {
+    createArbitraryGroup(groupUuid);
+    boolean oldVisibleAll = loadGroup(groupUuid).map(InternalGroup::isVisibleToAll).orElse(false);
+
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder().setVisibleToAll(!oldVisibleAll).build();
+    updateGroup(groupUuid, groupUpdate);
+
+    Optional<InternalGroup> group = loadGroup(groupUuid);
+    assertThatGroup(group).value().visibleToAll().isEqualTo(!oldVisibleAll);
+  }
+
+  @Test
+  public void createdOnIsNotAffectedByFurtherUpdates() throws Exception {
+    Timestamp createdOn = toTimestamp(LocalDate.of(2017, Month.MAY, 11).atTime(13, 44, 10));
+    Timestamp updatedOn = toTimestamp(LocalDate.of(2017, Month.DECEMBER, 12).atTime(10, 21, 49));
+
+    InternalGroupCreation groupCreation = getPrefilledGroupCreationBuilder().build();
+    InternalGroupUpdate initialGroupUpdate =
+        InternalGroupUpdate.builder().setUpdatedOn(createdOn).build();
+    createGroup(groupCreation, initialGroupUpdate);
+
+    InternalGroupUpdate laterGroupUpdate =
+        InternalGroupUpdate.builder()
+            .setName(new AccountGroup.NameKey("Another name"))
+            .setUpdatedOn(updatedOn)
+            .build();
+    Optional<InternalGroup> group = updateGroup(groupCreation.getGroupUUID(), laterGroupUpdate);
+
+    assertThatGroup(group).value().createdOn().isEqualTo(createdOn);
+    Optional<InternalGroup> reloadedGroup = loadGroup(groupUuid);
+    assertThatGroup(reloadedGroup).value().createdOn().isEqualTo(createdOn);
+  }
+
+  @Test
+  public void membersCanBeAdded() throws Exception {
+    createArbitraryGroup(groupUuid);
+    Account.Id member1 = new Account.Id(1);
+    Account.Id member2 = new Account.Id(2);
+
+    InternalGroupUpdate groupUpdate1 =
+        InternalGroupUpdate.builder()
+            .setMemberModification(members -> ImmutableSet.of(member1))
+            .build();
+    updateGroup(groupUuid, groupUpdate1);
+
+    InternalGroupUpdate groupUpdate2 =
+        InternalGroupUpdate.builder()
+            .setMemberModification(members -> Sets.union(members, ImmutableSet.of(member2)))
+            .build();
+    updateGroup(groupUuid, groupUpdate2);
+
+    Optional<InternalGroup> group = loadGroup(groupUuid);
+    assertThatGroup(group).value().members().containsExactly(member1, member2);
+  }
+
+  @Test
+  public void membersCanBeDeleted() throws Exception {
+    createArbitraryGroup(groupUuid);
+    Account.Id member1 = new Account.Id(1);
+    Account.Id member2 = new Account.Id(2);
+
+    InternalGroupUpdate groupUpdate1 =
+        InternalGroupUpdate.builder()
+            .setMemberModification(members -> ImmutableSet.of(member1, member2))
+            .build();
+    updateGroup(groupUuid, groupUpdate1);
+
+    InternalGroupUpdate groupUpdate2 =
+        InternalGroupUpdate.builder()
+            .setMemberModification(members -> Sets.difference(members, ImmutableSet.of(member1)))
+            .build();
+    updateGroup(groupUuid, groupUpdate2);
+
+    Optional<InternalGroup> group = loadGroup(groupUuid);
+    assertThatGroup(group).value().members().containsExactly(member2);
+  }
+
+  @Test
+  public void subgroupsCanBeAdded() throws Exception {
+    createArbitraryGroup(groupUuid);
+    AccountGroup.UUID subgroup1 = new AccountGroup.UUID("subgroups1");
+    AccountGroup.UUID subgroup2 = new AccountGroup.UUID("subgroups2");
+
+    InternalGroupUpdate groupUpdate1 =
+        InternalGroupUpdate.builder()
+            .setSubgroupModification(subgroups -> ImmutableSet.of(subgroup1))
+            .build();
+    updateGroup(groupUuid, groupUpdate1);
+
+    InternalGroupUpdate groupUpdate2 =
+        InternalGroupUpdate.builder()
+            .setSubgroupModification(subgroups -> Sets.union(subgroups, ImmutableSet.of(subgroup2)))
+            .build();
+    updateGroup(groupUuid, groupUpdate2);
+
+    Optional<InternalGroup> group = loadGroup(groupUuid);
+    assertThatGroup(group).value().subgroups().containsExactly(subgroup1, subgroup2);
+  }
+
+  @Test
+  public void subgroupsCanBeDeleted() throws Exception {
+    createArbitraryGroup(groupUuid);
+    AccountGroup.UUID subgroup1 = new AccountGroup.UUID("subgroups1");
+    AccountGroup.UUID subgroup2 = new AccountGroup.UUID("subgroups2");
+
+    InternalGroupUpdate groupUpdate1 =
+        InternalGroupUpdate.builder()
+            .setSubgroupModification(members -> ImmutableSet.of(subgroup1, subgroup2))
+            .build();
+    updateGroup(groupUuid, groupUpdate1);
+
+    InternalGroupUpdate groupUpdate2 =
+        InternalGroupUpdate.builder()
+            .setSubgroupModification(
+                members -> Sets.difference(members, ImmutableSet.of(subgroup1)))
+            .build();
+    updateGroup(groupUuid, groupUpdate2);
+
+    Optional<InternalGroup> group = loadGroup(groupUuid);
+    assertThatGroup(group).value().subgroups().containsExactly(subgroup2);
+  }
+
+  @Test
+  public void createdGroupIsLoadedAutomatically() throws Exception {
+    InternalGroupCreation groupCreation = getPrefilledGroupCreationBuilder().build();
+    Optional<InternalGroup> group = createGroup(groupCreation);
+
+    assertThat(group).isPresent();
+  }
+
+  @Test
+  public void loadedNewGroupWithMandatoryPropertiesDoesNotChangeOnReload() throws Exception {
+    InternalGroupCreation groupCreation = getPrefilledGroupCreationBuilder().build();
+
+    Optional<InternalGroup> createdGroup = createGroup(groupCreation);
+    Optional<InternalGroup> reloadedGroup = loadGroup(groupCreation.getGroupUUID());
+
+    assertThat(createdGroup).isEqualTo(reloadedGroup);
+  }
+
+  @Test
+  public void loadedNewGroupWithAllPropertiesDoesNotChangeOnReload() throws Exception {
+    InternalGroupCreation groupCreation = getPrefilledGroupCreationBuilder().build();
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder()
+            .setDescription("A test group")
+            .setOwnerGroupUUID(new AccountGroup.UUID("another owner"))
+            .setVisibleToAll(true)
+            .setName(new AccountGroup.NameKey("Another name"))
+            .setUpdatedOn(new Timestamp(92900892))
+            .setMemberModification(members -> ImmutableSet.of(new Account.Id(1), new Account.Id(2)))
+            .setSubgroupModification(
+                subgroups -> ImmutableSet.of(new AccountGroup.UUID("subgroup")))
+            .build();
+
+    Optional<InternalGroup> createdGroup = createGroup(groupCreation, groupUpdate);
+    Optional<InternalGroup> reloadedGroup = loadGroup(groupCreation.getGroupUUID());
+
+    assertThat(createdGroup).isEqualTo(reloadedGroup);
+  }
+
+  @Test
+  public void loadedGroupAfterUpdatesForAllPropertiesDoesNotChangeOnReload() throws Exception {
+    createArbitraryGroup(groupUuid);
+
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder()
+            .setDescription("A test group")
+            .setOwnerGroupUUID(new AccountGroup.UUID("another owner"))
+            .setVisibleToAll(true)
+            .setName(new AccountGroup.NameKey("Another name"))
+            .setUpdatedOn(new Timestamp(92900892))
+            .setMemberModification(members -> ImmutableSet.of(new Account.Id(1), new Account.Id(2)))
+            .setSubgroupModification(
+                subgroups -> ImmutableSet.of(new AccountGroup.UUID("subgroup")))
+            .build();
+
+    Optional<InternalGroup> updatedGroup = updateGroup(groupUuid, groupUpdate);
+    Optional<InternalGroup> reloadedGroup = loadGroup(groupUuid);
+
+    assertThat(updatedGroup).isEqualTo(reloadedGroup);
+  }
+
+  @Test
+  public void loadedGroupWithAllPropertiesAndUpdateOfSinglePropertyDoesNotChangeOnReload()
+      throws Exception {
+    // Create a group with all properties set.
+    InternalGroupCreation groupCreation = getPrefilledGroupCreationBuilder().build();
+    InternalGroupUpdate initialGroupUpdate =
+        InternalGroupUpdate.builder()
+            .setDescription("A test group")
+            .setOwnerGroupUUID(new AccountGroup.UUID("another owner"))
+            .setVisibleToAll(true)
+            .setName(new AccountGroup.NameKey("Another name"))
+            .setUpdatedOn(new Timestamp(92900892))
+            .setMemberModification(members -> ImmutableSet.of(new Account.Id(1), new Account.Id(2)))
+            .setSubgroupModification(
+                subgroups -> ImmutableSet.of(new AccountGroup.UUID("subgroup")))
+            .build();
+    createGroup(groupCreation, initialGroupUpdate);
+
+    // Only update one of the properties.
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder().setName(new AccountGroup.NameKey("Another name")).build();
+
+    Optional<InternalGroup> updatedGroup = updateGroup(groupCreation.getGroupUUID(), groupUpdate);
+    Optional<InternalGroup> reloadedGroup = loadGroup(groupCreation.getGroupUUID());
+
+    assertThat(updatedGroup).isEqualTo(reloadedGroup);
+  }
+
+  @Test
+  public void groupConfigMayBeReusedForFurtherUpdates() throws Exception {
+    InternalGroupCreation groupCreation =
+        getPrefilledGroupCreationBuilder().setGroupUUID(groupUuid).setId(groupId).build();
+    GroupConfig groupConfig = GroupConfig.createForNewGroup(projectName, repository, groupCreation);
+    commit(groupConfig);
+
+    AccountGroup.NameKey name = new AccountGroup.NameKey("Robots");
+    InternalGroupUpdate groupUpdate1 = InternalGroupUpdate.builder().setName(name).build();
+    groupConfig.setGroupUpdate(groupUpdate1, auditLogFormatter);
+    commit(groupConfig);
+
+    String description = "Test group for robots";
+    InternalGroupUpdate groupUpdate2 =
+        InternalGroupUpdate.builder().setDescription(description).build();
+    groupConfig.setGroupUpdate(groupUpdate2, auditLogFormatter);
+    commit(groupConfig);
+
+    Optional<InternalGroup> group = loadGroup(groupUuid);
+    assertThatGroup(group).value().id().isEqualTo(groupId);
+    assertThatGroup(group).value().nameKey().isEqualTo(name);
+    assertThatGroup(group).value().description().isEqualTo(description);
+  }
+
+  @Test
+  public void newGroupIsRepresentedByARefPointingToARootCommit() throws Exception {
+    createArbitraryGroup(groupUuid);
+
+    Ref ref = repository.exactRef(RefNames.refsGroups(groupUuid));
+    assertThat(ref.getObjectId()).isNotNull();
+
+    try (RevWalk revWalk = new RevWalk(repository)) {
+      RevCommit revCommit = revWalk.parseCommit(ref.getObjectId());
+      assertThat(revCommit.getParentCount()).isEqualTo(0);
+    }
+  }
+
+  @Test
+  public void updatedGroupIsRepresentedByARefPointingToACommitSequence() throws Exception {
+    createArbitraryGroup(groupUuid);
+
+    RevCommit commitAfterCreation = getLatestCommitForGroup(groupUuid);
+
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder().setName(new AccountGroup.NameKey("Another name")).build();
+    updateGroup(groupUuid, groupUpdate);
+
+    RevCommit commitAfterUpdate = getLatestCommitForGroup(groupUuid);
+    assertThat(commitAfterUpdate).isNotEqualTo(commitAfterCreation);
+    assertThat(commitAfterUpdate.getParents()).asList().containsExactly(commitAfterCreation);
+  }
+
+  @Test
+  public void newCommitIsNotCreatedForEmptyUpdate() throws Exception {
+    createArbitraryGroup(groupUuid);
+
+    InternalGroupUpdate groupUpdate = InternalGroupUpdate.builder().build();
+
+    RevCommit commitBeforeUpdate = getLatestCommitForGroup(groupUuid);
+    updateGroup(groupUuid, groupUpdate);
+    RevCommit commitAfterUpdate = getLatestCommitForGroup(groupUuid);
+
+    assertThat(commitAfterUpdate).isEqualTo(commitBeforeUpdate);
+  }
+
+  @Test
+  public void newCommitIsNotCreatedForPureUpdatedOnUpdate() throws Exception {
+    createArbitraryGroup(groupUuid);
+
+    Timestamp updatedOn = toTimestamp(LocalDate.of(3017, Month.DECEMBER, 12).atTime(10, 21, 49));
+    InternalGroupUpdate groupUpdate = InternalGroupUpdate.builder().setUpdatedOn(updatedOn).build();
+
+    RevCommit commitBeforeUpdate = getLatestCommitForGroup(groupUuid);
+    updateGroup(groupUuid, groupUpdate);
+    RevCommit commitAfterUpdate = getLatestCommitForGroup(groupUuid);
+
+    assertThat(commitAfterUpdate).isEqualTo(commitBeforeUpdate);
+  }
+
+  @Test
+  public void newCommitIsNotCreatedForRedundantNameUpdate() throws Exception {
+    createArbitraryGroup(groupUuid);
+
+    InternalGroupUpdate groupUpdate = InternalGroupUpdate.builder().setName(groupName).build();
+    updateGroup(groupUuid, groupUpdate);
+
+    RevCommit commitBeforeUpdate = getLatestCommitForGroup(groupUuid);
+    updateGroup(groupUuid, groupUpdate);
+    RevCommit commitAfterUpdate = getLatestCommitForGroup(groupUuid);
+
+    assertThat(commitAfterUpdate).isEqualTo(commitBeforeUpdate);
+  }
+
+  @Test
+  public void newCommitIsNotCreatedForRedundantDescriptionUpdate() throws Exception {
+    createArbitraryGroup(groupUuid);
+
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder().setDescription("A test group").build();
+    updateGroup(groupUuid, groupUpdate);
+
+    RevCommit commitBeforeUpdate = getLatestCommitForGroup(groupUuid);
+    updateGroup(groupUuid, groupUpdate);
+    RevCommit commitAfterUpdate = getLatestCommitForGroup(groupUuid);
+
+    assertThat(commitAfterUpdate).isEqualTo(commitBeforeUpdate);
+  }
+
+  @Test
+  public void newCommitIsNotCreatedForRedundantVisibleToAllUpdate() throws Exception {
+    createArbitraryGroup(groupUuid);
+
+    InternalGroupUpdate groupUpdate = InternalGroupUpdate.builder().setVisibleToAll(true).build();
+    updateGroup(groupUuid, groupUpdate);
+
+    RevCommit commitBeforeUpdate = getLatestCommitForGroup(groupUuid);
+    updateGroup(groupUuid, groupUpdate);
+    RevCommit commitAfterUpdate = getLatestCommitForGroup(groupUuid);
+
+    assertThat(commitAfterUpdate).isEqualTo(commitBeforeUpdate);
+  }
+
+  @Test
+  public void newCommitIsNotCreatedForRedundantOwnerGroupUuidUpdate() throws Exception {
+    createArbitraryGroup(groupUuid);
+
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder()
+            .setOwnerGroupUUID(new AccountGroup.UUID("Another owner"))
+            .build();
+    updateGroup(groupUuid, groupUpdate);
+
+    RevCommit commitBeforeUpdate = getLatestCommitForGroup(groupUuid);
+    updateGroup(groupUuid, groupUpdate);
+    RevCommit commitAfterUpdate = getLatestCommitForGroup(groupUuid);
+
+    assertThat(commitAfterUpdate).isEqualTo(commitBeforeUpdate);
+  }
+
+  @Test
+  public void newCommitIsNotCreatedForRedundantMemberUpdate() throws Exception {
+    createArbitraryGroup(groupUuid);
+
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder()
+            .setMemberModification(
+                members -> Sets.union(members, ImmutableSet.of(new Account.Id(10))))
+            .build();
+    updateGroup(groupUuid, groupUpdate);
+
+    RevCommit commitBeforeUpdate = getLatestCommitForGroup(groupUuid);
+    updateGroup(groupUuid, groupUpdate);
+    RevCommit commitAfterUpdate = getLatestCommitForGroup(groupUuid);
+
+    assertThat(commitAfterUpdate).isEqualTo(commitBeforeUpdate);
+  }
+
+  @Test
+  public void newCommitIsNotCreatedForRedundantSubgroupsUpdate() throws Exception {
+    createArbitraryGroup(groupUuid);
+
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder()
+            .setSubgroupModification(
+                subgroups ->
+                    Sets.union(subgroups, ImmutableSet.of(new AccountGroup.UUID("subgroup"))))
+            .build();
+    updateGroup(groupUuid, groupUpdate);
+
+    RevCommit commitBeforeUpdate = getLatestCommitForGroup(groupUuid);
+    updateGroup(groupUuid, groupUpdate);
+    RevCommit commitAfterUpdate = getLatestCommitForGroup(groupUuid);
+
+    assertThat(commitAfterUpdate).isEqualTo(commitBeforeUpdate);
+  }
+
+  @Test
+  public void newCommitIsNotCreatedWhenCommittingGroupCreationTwice() throws Exception {
+    InternalGroupCreation groupCreation =
+        getPrefilledGroupCreationBuilder().setGroupUUID(groupUuid).build();
+
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder().setName(new AccountGroup.NameKey("Another name")).build();
+
+    GroupConfig groupConfig = GroupConfig.createForNewGroup(projectName, repository, groupCreation);
+    groupConfig.setGroupUpdate(groupUpdate, auditLogFormatter);
+    commit(groupConfig);
+
+    RevCommit commitBeforeSecondCommit = getLatestCommitForGroup(groupUuid);
+    commit(groupConfig);
+    RevCommit commitAfterSecondCommit = getLatestCommitForGroup(groupUuid);
+
+    assertThat(commitAfterSecondCommit).isEqualTo(commitBeforeSecondCommit);
+  }
+
+  @Test
+  public void newCommitIsNotCreatedWhenCommittingGroupUpdateTwice() throws Exception {
+    createArbitraryGroup(groupUuid);
+
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder().setDescription("A test group").build();
+
+    GroupConfig groupConfig = GroupConfig.loadForGroup(projectName, repository, groupUuid);
+    groupConfig.setGroupUpdate(groupUpdate, auditLogFormatter);
+    commit(groupConfig);
+
+    RevCommit commitBeforeSecondCommit = getLatestCommitForGroup(groupUuid);
+    commit(groupConfig);
+    RevCommit commitAfterSecondCommit = getLatestCommitForGroup(groupUuid);
+
+    assertThat(commitAfterSecondCommit).isEqualTo(commitBeforeSecondCommit);
+  }
+
+  @Test
+  public void commitTimeMatchesDefaultCreatedOnOfNewGroup() throws Exception {
+    // Git timestamps are only precise to the second.
+    long testStartAsSecondsSinceEpoch = TimeUtil.nowTs().getTime() / 1000;
+
+    InternalGroupCreation groupCreation =
+        InternalGroupCreation.builder()
+            .setGroupUUID(groupUuid)
+            .setNameKey(groupName)
+            .setId(groupId)
+            .build();
+    createGroup(groupCreation);
+
+    RevCommit revCommit = getLatestCommitForGroup(groupUuid);
+    assertThat(revCommit.getCommitTime()).isAtLeast((int) testStartAsSecondsSinceEpoch);
+  }
+
+  @Test
+  public void commitTimeMatchesSpecifiedCreatedOnOfNewGroup() throws Exception {
+    // Git timestamps are only precise to the second.
+    long createdOnAsSecondsSinceEpoch = 9082093;
+
+    InternalGroupCreation groupCreation =
+        InternalGroupCreation.builder()
+            .setGroupUUID(groupUuid)
+            .setNameKey(groupName)
+            .setId(groupId)
+            .build();
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder()
+            .setUpdatedOn(new Timestamp(createdOnAsSecondsSinceEpoch * 1000))
+            .build();
+    createGroup(groupCreation, groupUpdate);
+
+    RevCommit revCommit = getLatestCommitForGroup(groupUuid);
+    assertThat(revCommit.getCommitTime()).isEqualTo(createdOnAsSecondsSinceEpoch);
+  }
+
+  @Test
+  public void timestampOfCommitterMatchesSpecifiedCreatedOnOfNewGroup() throws Exception {
+    Timestamp committerTimestamp =
+        toTimestamp(LocalDate.of(2017, Month.DECEMBER, 13).atTime(15, 5, 27));
+    Timestamp createdOn = toTimestamp(LocalDate.of(2016, Month.MARCH, 11).atTime(23, 49, 11));
+
+    InternalGroupCreation groupCreation =
+        InternalGroupCreation.builder()
+            .setGroupUUID(groupUuid)
+            .setNameKey(groupName)
+            .setId(groupId)
+            .build();
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder()
+            .setName(new AccountGroup.NameKey("Another name"))
+            .setUpdatedOn(createdOn)
+            .build();
+    GroupConfig groupConfig = GroupConfig.createForNewGroup(projectName, repository, groupCreation);
+    groupConfig.setGroupUpdate(groupUpdate, auditLogFormatter);
+
+    PersonIdent committerIdent =
+        new PersonIdent("Jane", "Jane@gerritcodereview.com", committerTimestamp, timeZone);
+    try (MetaDataUpdate metaDataUpdate = createMetaDataUpdate()) {
+      metaDataUpdate.getCommitBuilder().setCommitter(committerIdent);
+      groupConfig.commit(metaDataUpdate);
+    }
+
+    RevCommit revCommit = getLatestCommitForGroup(groupUuid);
+    assertThat(revCommit.getCommitterIdent().getWhen()).isEqualTo(createdOn);
+    assertThat(revCommit.getCommitterIdent().getTimeZone().getRawOffset())
+        .isEqualTo(timeZone.getRawOffset());
+  }
+
+  @Test
+  public void timestampOfAuthorMatchesSpecifiedCreatedOnOfNewGroup() throws Exception {
+    Timestamp authorTimestamp =
+        toTimestamp(LocalDate.of(2017, Month.DECEMBER, 13).atTime(15, 5, 27));
+    Timestamp createdOn = toTimestamp(LocalDate.of(2016, Month.MARCH, 11).atTime(23, 49, 11));
+
+    InternalGroupCreation groupCreation =
+        InternalGroupCreation.builder()
+            .setGroupUUID(groupUuid)
+            .setNameKey(groupName)
+            .setId(groupId)
+            .build();
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder()
+            .setName(new AccountGroup.NameKey("Another name"))
+            .setUpdatedOn(createdOn)
+            .build();
+    GroupConfig groupConfig = GroupConfig.createForNewGroup(projectName, repository, groupCreation);
+    groupConfig.setGroupUpdate(groupUpdate, auditLogFormatter);
+
+    PersonIdent authorIdent =
+        new PersonIdent("Jane", "Jane@gerritcodereview.com", authorTimestamp, timeZone);
+    try (MetaDataUpdate metaDataUpdate = createMetaDataUpdate()) {
+      metaDataUpdate.getCommitBuilder().setAuthor(authorIdent);
+      groupConfig.commit(metaDataUpdate);
+    }
+
+    RevCommit revCommit = getLatestCommitForGroup(groupUuid);
+    assertThat(revCommit.getAuthorIdent().getWhen()).isEqualTo(createdOn);
+    assertThat(revCommit.getAuthorIdent().getTimeZone().getRawOffset())
+        .isEqualTo(timeZone.getRawOffset());
+  }
+
+  @Test
+  public void commitTimeMatchesDefaultUpdatedOnOfUpdatedGroup() throws Exception {
+    // Git timestamps are only precise to the second.
+    long testStartAsSecondsSinceEpoch = TimeUtil.nowTs().getTime() / 1000;
+
+    createArbitraryGroup(groupUuid);
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder().setName(new AccountGroup.NameKey("Another name")).build();
+    updateGroup(groupUuid, groupUpdate);
+
+    RevCommit revCommit = getLatestCommitForGroup(groupUuid);
+    assertThat(revCommit.getCommitTime()).isAtLeast((int) testStartAsSecondsSinceEpoch);
+  }
+
+  @Test
+  public void commitTimeMatchesSpecifiedUpdatedOnOfUpdatedGroup() throws Exception {
+    // Git timestamps are only precise to the second.
+    long updatedOnAsSecondsSinceEpoch = 9082093;
+
+    createArbitraryGroup(groupUuid);
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder()
+            .setName(new AccountGroup.NameKey("Another name"))
+            .setUpdatedOn(new Timestamp(updatedOnAsSecondsSinceEpoch * 1000))
+            .build();
+    updateGroup(groupUuid, groupUpdate);
+
+    RevCommit revCommit = getLatestCommitForGroup(groupUuid);
+    assertThat(revCommit.getCommitTime()).isEqualTo(updatedOnAsSecondsSinceEpoch);
+  }
+
+  @Test
+  public void timestampOfCommitterMatchesSpecifiedUpdatedOnOfUpdatedGroup() throws Exception {
+    Timestamp committerTimestamp =
+        toTimestamp(LocalDate.of(2017, Month.DECEMBER, 13).atTime(15, 5, 27));
+    Timestamp updatedOn = toTimestamp(LocalDate.of(2016, Month.MARCH, 11).atTime(23, 49, 11));
+
+    createArbitraryGroup(groupUuid);
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder()
+            .setName(new AccountGroup.NameKey("Another name"))
+            .setUpdatedOn(updatedOn)
+            .build();
+    GroupConfig groupConfig = GroupConfig.loadForGroup(projectName, repository, groupUuid);
+    groupConfig.setGroupUpdate(groupUpdate, auditLogFormatter);
+
+    PersonIdent committerIdent =
+        new PersonIdent("Jane", "Jane@gerritcodereview.com", committerTimestamp, timeZone);
+    try (MetaDataUpdate metaDataUpdate = createMetaDataUpdate()) {
+      metaDataUpdate.getCommitBuilder().setCommitter(committerIdent);
+      groupConfig.commit(metaDataUpdate);
+    }
+
+    RevCommit revCommit = getLatestCommitForGroup(groupUuid);
+    assertThat(revCommit.getCommitterIdent().getWhen()).isEqualTo(updatedOn);
+    assertThat(revCommit.getCommitterIdent().getTimeZone().getRawOffset())
+        .isEqualTo(timeZone.getRawOffset());
+  }
+
+  @Test
+  public void timestampOfAuthorMatchesSpecifiedUpdatedOnOfUpdatedGroup() throws Exception {
+    Timestamp authorTimestamp =
+        toTimestamp(LocalDate.of(2017, Month.DECEMBER, 13).atTime(15, 5, 27));
+    Timestamp updatedOn = toTimestamp(LocalDate.of(2016, Month.MARCH, 11).atTime(23, 49, 11));
+
+    createArbitraryGroup(groupUuid);
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder()
+            .setName(new AccountGroup.NameKey("Another name"))
+            .setUpdatedOn(updatedOn)
+            .build();
+    GroupConfig groupConfig = GroupConfig.loadForGroup(projectName, repository, groupUuid);
+    groupConfig.setGroupUpdate(groupUpdate, auditLogFormatter);
+
+    PersonIdent authorIdent =
+        new PersonIdent("Jane", "Jane@gerritcodereview.com", authorTimestamp, timeZone);
+    try (MetaDataUpdate metaDataUpdate = createMetaDataUpdate()) {
+      metaDataUpdate.getCommitBuilder().setAuthor(authorIdent);
+      groupConfig.commit(metaDataUpdate);
+    }
+
+    RevCommit revCommit = getLatestCommitForGroup(groupUuid);
+    assertThat(revCommit.getAuthorIdent().getWhen()).isEqualTo(updatedOn);
+    assertThat(revCommit.getAuthorIdent().getTimeZone().getRawOffset())
+        .isEqualTo(timeZone.getRawOffset());
+  }
+
+  @Test
+  public void refStateOfLoadedGroupIsPopulatedWithCommitSha1() throws Exception {
+    createArbitraryGroup(groupUuid);
+
+    Optional<InternalGroup> group = loadGroup(groupUuid);
+
+    RevCommit revCommit = getLatestCommitForGroup(groupUuid);
+    assertThatGroup(group).value().refState().isEqualTo(revCommit.copy());
+  }
+
+  @Test
+  public void groupCanBeLoadedAtASpecificRevision() throws Exception {
+    createArbitraryGroup(groupUuid);
+
+    AccountGroup.NameKey firstName = new AccountGroup.NameKey("Bots");
+    InternalGroupUpdate groupUpdate1 = InternalGroupUpdate.builder().setName(firstName).build();
+    updateGroup(groupUuid, groupUpdate1);
+
+    RevCommit commitAfterUpdate1 = getLatestCommitForGroup(groupUuid);
+
+    InternalGroupUpdate groupUpdate2 =
+        InternalGroupUpdate.builder().setName(new AccountGroup.NameKey("Robots")).build();
+    updateGroup(groupUuid, groupUpdate2);
+
+    GroupConfig groupConfig =
+        GroupConfig.loadForGroupSnapshot(
+            projectName, repository, groupUuid, commitAfterUpdate1.copy());
+    Optional<InternalGroup> group = groupConfig.getLoadedGroup();
+    assertThatGroup(group).value().nameKey().isEqualTo(firstName);
+    assertThatGroup(group).value().refState().isEqualTo(commitAfterUpdate1.copy());
+  }
+
+  @Test
+  public void commitMessageOfNewGroupWithoutMembersOrSubgroupsContainsNoFooters() throws Exception {
+    InternalGroupCreation groupCreation =
+        getPrefilledGroupCreationBuilder().setGroupUUID(groupUuid).build();
+    createGroup(groupCreation);
+
+    RevCommit revCommit = getLatestCommitForGroup(groupUuid);
+    assertThat(revCommit.getFullMessage()).isEqualTo("Create group");
+  }
+
+  @Test
+  public void commitMessageOfNewGroupWithAdditionalNameSpecificationContainsNoFooters()
+      throws Exception {
+    InternalGroupCreation groupCreation =
+        getPrefilledGroupCreationBuilder().setGroupUUID(groupUuid).build();
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder().setName(new AccountGroup.NameKey("Another name")).build();
+    createGroup(groupCreation, groupUpdate);
+
+    RevCommit revCommit = getLatestCommitForGroup(groupUuid);
+    assertThat(revCommit.getFullMessage()).isEqualTo("Create group");
+  }
+
+  @Test
+  public void commitMessageOfNewGroupWithMembersContainsFooters() throws Exception {
+    Account account13 = createAccount(new Account.Id(13), "John");
+    Account account7 = createAccount(new Account.Id(7), "Jane");
+    ImmutableSet<Account> accounts = ImmutableSet.of(account13, account7);
+
+    AuditLogFormatter auditLogFormatter =
+        AuditLogFormatter.createBackedBy(accounts, ImmutableSet.of(), "server-id");
+
+    InternalGroupCreation groupCreation =
+        getPrefilledGroupCreationBuilder().setGroupUUID(groupUuid).build();
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder()
+            .setMemberModification(members -> ImmutableSet.of(account13.getId(), account7.getId()))
+            .build();
+
+    GroupConfig groupConfig = GroupConfig.createForNewGroup(projectName, repository, groupCreation);
+    groupConfig.setGroupUpdate(groupUpdate, auditLogFormatter);
+    commit(groupConfig);
+
+    RevCommit revCommit = getLatestCommitForGroup(groupUuid);
+    assertThat(revCommit.getFullMessage())
+        .isEqualTo("Create group\n\nAdd: Jane <7@server-id>\nAdd: John <13@server-id>");
+  }
+
+  @Test
+  public void commitMessageOfNewGroupWithSubgroupsContainsFooters() throws Exception {
+    GroupDescription.Basic group1 = createGroup(new AccountGroup.UUID("129403"), "Bots");
+    GroupDescription.Basic group2 = createGroup(new AccountGroup.UUID("8903493"), "Verifiers");
+    ImmutableSet<GroupDescription.Basic> groups = ImmutableSet.of(group1, group2);
+
+    AuditLogFormatter auditLogFormatter =
+        AuditLogFormatter.createBackedBy(ImmutableSet.of(), groups, "serverId");
+
+    InternalGroupCreation groupCreation =
+        getPrefilledGroupCreationBuilder().setGroupUUID(groupUuid).build();
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder()
+            .setSubgroupModification(
+                subgroups -> ImmutableSet.of(group1.getGroupUUID(), group2.getGroupUUID()))
+            .build();
+    GroupConfig groupConfig = GroupConfig.createForNewGroup(projectName, repository, groupCreation);
+    groupConfig.setGroupUpdate(groupUpdate, auditLogFormatter);
+    commit(groupConfig);
+
+    RevCommit revCommit = getLatestCommitForGroup(groupUuid);
+    assertThat(revCommit.getFullMessage())
+        .isEqualTo("Create group\n\nAdd-group: Bots <129403>\nAdd-group: Verifiers <8903493>");
+  }
+
+  @Test
+  public void commitMessageOfMemberAdditionContainsFooters() throws Exception {
+    Account account13 = createAccount(new Account.Id(13), "John");
+    Account account7 = createAccount(new Account.Id(7), "Jane");
+    ImmutableSet<Account> accounts = ImmutableSet.of(account13, account7);
+
+    createArbitraryGroup(groupUuid);
+
+    AuditLogFormatter auditLogFormatter =
+        AuditLogFormatter.createBackedBy(accounts, ImmutableSet.of(), "GerritServer1");
+
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder()
+            .setMemberModification(members -> ImmutableSet.of(account13.getId(), account7.getId()))
+            .build();
+    updateGroup(groupUuid, groupUpdate, auditLogFormatter);
+
+    RevCommit revCommit = getLatestCommitForGroup(groupUuid);
+    assertThat(revCommit.getFullMessage())
+        .isEqualTo("Update group\n\nAdd: Jane <7@GerritServer1>\nAdd: John <13@GerritServer1>");
+  }
+
+  @Test
+  public void commitMessageOfMemberRemovalContainsFooters() throws Exception {
+    Account account13 = createAccount(new Account.Id(13), "John");
+    Account account7 = createAccount(new Account.Id(7), "Jane");
+    ImmutableSet<Account> accounts = ImmutableSet.of(account13, account7);
+
+    createArbitraryGroup(groupUuid);
+
+    AuditLogFormatter auditLogFormatter =
+        AuditLogFormatter.createBackedBy(accounts, ImmutableSet.of(), "server-id");
+
+    InternalGroupUpdate groupUpdate1 =
+        InternalGroupUpdate.builder()
+            .setMemberModification(members -> ImmutableSet.of(account13.getId(), account7.getId()))
+            .build();
+    updateGroup(groupUuid, groupUpdate1, auditLogFormatter);
+
+    InternalGroupUpdate groupUpdate2 =
+        InternalGroupUpdate.builder()
+            .setMemberModification(members -> ImmutableSet.of(account7.getId()))
+            .build();
+    updateGroup(groupUuid, groupUpdate2, auditLogFormatter);
+
+    RevCommit revCommit = getLatestCommitForGroup(groupUuid);
+    assertThat(revCommit.getFullMessage()).isEqualTo("Update group\n\nRemove: John <13@server-id>");
+  }
+
+  @Test
+  public void commitMessageOfSubgroupAdditionContainsFooters() throws Exception {
+    GroupDescription.Basic group1 = createGroup(new AccountGroup.UUID("129403"), "Bots");
+    GroupDescription.Basic group2 = createGroup(new AccountGroup.UUID("8903493"), "Verifiers");
+    ImmutableSet<GroupDescription.Basic> groups = ImmutableSet.of(group1, group2);
+
+    createArbitraryGroup(groupUuid);
+
+    AuditLogFormatter auditLogFormatter =
+        AuditLogFormatter.createBackedBy(ImmutableSet.of(), groups, "serverId");
+
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder()
+            .setSubgroupModification(
+                subgroups -> ImmutableSet.of(group1.getGroupUUID(), group2.getGroupUUID()))
+            .build();
+    updateGroup(groupUuid, groupUpdate, auditLogFormatter);
+
+    RevCommit revCommit = getLatestCommitForGroup(groupUuid);
+    assertThat(revCommit.getFullMessage())
+        .isEqualTo("Update group\n\nAdd-group: Bots <129403>\nAdd-group: Verifiers <8903493>");
+  }
+
+  @Test
+  public void commitMessageOfSubgroupRemovalContainsFooters() throws Exception {
+    GroupDescription.Basic group1 = createGroup(new AccountGroup.UUID("129403"), "Bots");
+    GroupDescription.Basic group2 = createGroup(new AccountGroup.UUID("8903493"), "Verifiers");
+    ImmutableSet<GroupDescription.Basic> groups = ImmutableSet.of(group1, group2);
+
+    createArbitraryGroup(groupUuid);
+
+    AuditLogFormatter auditLogFormatter =
+        AuditLogFormatter.createBackedBy(ImmutableSet.of(), groups, "serverId");
+
+    InternalGroupUpdate groupUpdate1 =
+        InternalGroupUpdate.builder()
+            .setSubgroupModification(
+                subgroups -> ImmutableSet.of(group1.getGroupUUID(), group2.getGroupUUID()))
+            .build();
+    updateGroup(groupUuid, groupUpdate1, auditLogFormatter);
+
+    InternalGroupUpdate groupUpdate2 =
+        InternalGroupUpdate.builder()
+            .setSubgroupModification(subgroups -> ImmutableSet.of(group1.getGroupUUID()))
+            .build();
+    updateGroup(groupUuid, groupUpdate2, auditLogFormatter);
+
+    RevCommit revCommit = getLatestCommitForGroup(groupUuid);
+    assertThat(revCommit.getFullMessage())
+        .isEqualTo("Update group\n\nRemove-group: Verifiers <8903493>");
+  }
+
+  @Test
+  public void commitMessageOfGroupRenameContainsFooters() throws Exception {
+    createArbitraryGroup(groupUuid);
+
+    InternalGroupUpdate groupUpdate1 =
+        InternalGroupUpdate.builder().setName(new AccountGroup.NameKey("Old name")).build();
+    updateGroup(groupUuid, groupUpdate1);
+
+    InternalGroupUpdate groupUpdate2 =
+        InternalGroupUpdate.builder().setName(new AccountGroup.NameKey("New name")).build();
+    updateGroup(groupUuid, groupUpdate2);
+
+    RevCommit revCommit = getLatestCommitForGroup(groupUuid);
+    assertThat(revCommit.getFullMessage())
+        .isEqualTo("Update group\n\nRename from Old name to New name");
+  }
+
+  @Test
+  public void commitMessageFootersCanBeMixed() throws Exception {
+    Account account13 = createAccount(new Account.Id(13), "John");
+    Account account7 = createAccount(new Account.Id(7), "Jane");
+    ImmutableSet<Account> accounts = ImmutableSet.of(account13, account7);
+    GroupDescription.Basic group1 = createGroup(new AccountGroup.UUID("129403"), "Bots");
+    GroupDescription.Basic group2 = createGroup(new AccountGroup.UUID("8903493"), "Verifiers");
+    ImmutableSet<GroupDescription.Basic> groups = ImmutableSet.of(group1, group2);
+
+    createArbitraryGroup(groupUuid);
+
+    AuditLogFormatter auditLogFormatter =
+        AuditLogFormatter.createBackedBy(accounts, groups, "serverId");
+
+    InternalGroupUpdate groupUpdate1 =
+        InternalGroupUpdate.builder()
+            .setName(new AccountGroup.NameKey("Old name"))
+            .setMemberModification(members -> ImmutableSet.of(account7.getId()))
+            .setSubgroupModification(subgroups -> ImmutableSet.of(group2.getGroupUUID()))
+            .build();
+    updateGroup(groupUuid, groupUpdate1, auditLogFormatter);
+
+    InternalGroupUpdate groupUpdate2 =
+        InternalGroupUpdate.builder()
+            .setName(new AccountGroup.NameKey("New name"))
+            .setMemberModification(members -> ImmutableSet.of(account13.getId()))
+            .setSubgroupModification(subgroups -> ImmutableSet.of(group1.getGroupUUID()))
+            .build();
+    updateGroup(groupUuid, groupUpdate2, auditLogFormatter);
+
+    RevCommit revCommit = getLatestCommitForGroup(groupUuid);
+    assertThat(revCommit.getFullMessage())
+        .isEqualTo(
+            "Update group\n"
+                + "\n"
+                + "Add-group: Bots <129403>\n"
+                + "Add: John <13@serverId>\n"
+                + "Remove-group: Verifiers <8903493>\n"
+                + "Remove: Jane <7@serverId>\n"
+                + "Rename from Old name to New name");
+  }
+
+  private static Timestamp toTimestamp(LocalDateTime localDateTime) {
+    return Timestamp.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
+  }
+
+  private void populateGroupConfig(AccountGroup.UUID uuid, String fileContent) throws Exception {
+    testRepository
+        .branch(RefNames.refsGroups(uuid))
+        .commit()
+        .message("Prepopulate group.config")
+        .add(GroupConfig.GROUP_CONFIG_FILE, fileContent)
+        .create();
+  }
+
+  private void populateMembersFile(AccountGroup.UUID uuid, String fileContent) throws Exception {
+    testRepository
+        .branch(RefNames.refsGroups(uuid))
+        .commit()
+        .message("Prepopulate members")
+        .add(GroupConfig.MEMBERS_FILE, fileContent)
+        .create();
+  }
+
+  private void populateSubgroupsFile(AccountGroup.UUID uuid, String fileContent) throws Exception {
+    testRepository
+        .branch(RefNames.refsGroups(uuid))
+        .commit()
+        .message("Prepopulate subgroups")
+        .add(GroupConfig.SUBGROUPS_FILE, fileContent)
+        .create();
+  }
+
+  private void createArbitraryGroup(AccountGroup.UUID uuid) throws Exception {
+    InternalGroupCreation groupCreation =
+        getPrefilledGroupCreationBuilder().setGroupUUID(uuid).build();
+    createGroup(groupCreation);
+  }
+
+  private InternalGroupCreation.Builder getPrefilledGroupCreationBuilder() {
+    return InternalGroupCreation.builder()
+        .setGroupUUID(groupUuid)
+        .setNameKey(groupName)
+        .setId(groupId);
+  }
+
+  private Optional<InternalGroup> createGroup(InternalGroupCreation groupCreation)
+      throws Exception {
+    GroupConfig groupConfig = GroupConfig.createForNewGroup(projectName, repository, groupCreation);
+    commit(groupConfig);
+    return groupConfig.getLoadedGroup();
+  }
+
+  private Optional<InternalGroup> createGroup(
+      InternalGroupCreation groupCreation, InternalGroupUpdate groupUpdate) throws Exception {
+    GroupConfig groupConfig = GroupConfig.createForNewGroup(projectName, repository, groupCreation);
+    groupConfig.setGroupUpdate(groupUpdate, auditLogFormatter);
+    commit(groupConfig);
+    return groupConfig.getLoadedGroup();
+  }
+
+  private Optional<InternalGroup> updateGroup(
+      AccountGroup.UUID uuid, InternalGroupUpdate groupUpdate) throws Exception {
+    return updateGroup(uuid, groupUpdate, auditLogFormatter);
+  }
+
+  private Optional<InternalGroup> updateGroup(
+      AccountGroup.UUID uuid, InternalGroupUpdate groupUpdate, AuditLogFormatter auditLogFormatter)
+      throws Exception {
+    GroupConfig groupConfig = GroupConfig.loadForGroup(projectName, repository, uuid);
+    groupConfig.setGroupUpdate(groupUpdate, auditLogFormatter);
+    commit(groupConfig);
+    return groupConfig.getLoadedGroup();
+  }
+
+  private Optional<InternalGroup> loadGroup(AccountGroup.UUID uuid) throws Exception {
+    GroupConfig groupConfig = GroupConfig.loadForGroup(projectName, repository, uuid);
+    return groupConfig.getLoadedGroup();
+  }
+
+  private void commit(GroupConfig groupConfig) throws IOException {
+    try (MetaDataUpdate metaDataUpdate = createMetaDataUpdate()) {
+      groupConfig.commit(metaDataUpdate);
+    }
+  }
+
+  private MetaDataUpdate createMetaDataUpdate() {
+    PersonIdent serverIdent =
+        new PersonIdent(
+            "Gerrit Server", "noreply@gerritcodereview.com", TimeUtil.nowTs(), timeZone);
+
+    MetaDataUpdate metaDataUpdate =
+        new MetaDataUpdate(
+            GitReferenceUpdated.DISABLED, new Project.NameKey("Test Repository"), repository);
+    metaDataUpdate.getCommitBuilder().setCommitter(serverIdent);
+    metaDataUpdate.getCommitBuilder().setAuthor(serverIdent);
+    return metaDataUpdate;
+  }
+
+  private RevCommit getLatestCommitForGroup(AccountGroup.UUID uuid) throws IOException {
+    Ref ref = repository.exactRef(RefNames.refsGroups(uuid));
+    assertWithMessage("Precondition: Assumed that ref for group " + uuid + " exists.")
+        .that(ref.getObjectId())
+        .isNotNull();
+
+    try (RevWalk revWalk = new RevWalk(repository)) {
+      return revWalk.parseCommit(ref.getObjectId());
+    }
+  }
+
+  private static Account createAccount(Account.Id id, String name) {
+    Account account = new Account(id, TimeUtil.nowTs());
+    account.setFullName(name);
+    return account;
+  }
+
+  private static GroupDescription.Basic createGroup(AccountGroup.UUID uuid, String name) {
+    return new GroupDescription.Basic() {
+      @Override
+      public AccountGroup.UUID getGroupUUID() {
+        return uuid;
+      }
+
+      @Override
+      public String getName() {
+        return name;
+      }
+
+      @Nullable
+      @Override
+      public String getEmailAddress() {
+        return null;
+      }
+
+      @Nullable
+      @Override
+      public String getUrl() {
+        return null;
+      }
+    };
+  }
+
+  private static OptionalSubject<InternalGroupSubject, InternalGroup> assertThatGroup(
+      Optional<InternalGroup> loadedGroup) {
+    return assertThat(loadedGroup, InternalGroupSubject::assertThat);
+  }
+}
diff --git a/javatests/com/google/gerrit/server/group/db/GroupNameNotesTest.java b/javatests/com/google/gerrit/server/group/db/GroupNameNotesTest.java
new file mode 100644
index 0000000..42d01e2
--- /dev/null
+++ b/javatests/com/google/gerrit/server/group/db/GroupNameNotesTest.java
@@ -0,0 +1,603 @@
+// Copyright (C) 2017 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.google.gerrit.server.group.db;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assert_;
+import static com.google.gerrit.extensions.common.testing.CommitInfoSubject.assertThat;
+import static com.google.gerrit.reviewdb.client.RefNames.REFS_GROUPNAMES;
+import static com.google.gerrit.truth.OptionalSubject.assertThat;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.data.testing.GroupReferenceSubject;
+import com.google.gerrit.extensions.common.CommitInfo;
+import com.google.gerrit.extensions.common.testing.CommitInfoSubject;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.AllUsersNameProvider;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.update.RefUpdateUtil;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.testing.GitTestUtil;
+import com.google.gerrit.testing.TestTimeUtil;
+import com.google.gerrit.truth.ListSubject;
+import com.google.gerrit.truth.OptionalSubject;
+import com.google.gwtorm.client.KeyUtil;
+import com.google.gwtorm.server.OrmDuplicateKeyException;
+import com.google.gwtorm.server.StandardKeyEncoder;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+import java.util.TimeZone;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.notes.NoteMap;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+public class GroupNameNotesTest {
+  static {
+    KeyUtil.setEncoderImpl(new StandardKeyEncoder());
+  }
+
+  private static final String SERVER_NAME = "Gerrit Server";
+  private static final String SERVER_EMAIL = "noreply@gerritcodereview.com";
+  private static final TimeZone TZ = TimeZone.getTimeZone("America/Los_Angeles");
+
+  @Rule public ExpectedException expectedException = ExpectedException.none();
+
+  private final AccountGroup.UUID groupUuid = new AccountGroup.UUID("users-XYZ");
+  private final AccountGroup.NameKey groupName = new AccountGroup.NameKey("users");
+
+  private AtomicInteger idCounter;
+  private AllUsersName allUsersName;
+  private Repository repo;
+
+  @Before
+  public void setUp() {
+    TestTimeUtil.resetWithClockStep(1, TimeUnit.SECONDS);
+    idCounter = new AtomicInteger();
+    allUsersName = new AllUsersName(AllUsersNameProvider.DEFAULT);
+    repo = new InMemoryRepository(new DfsRepositoryDescription(AllUsersNameProvider.DEFAULT));
+  }
+
+  @After
+  public void tearDown() {
+    TestTimeUtil.useSystemTime();
+  }
+
+  @Test
+  public void newGroupCanBeCreated() throws Exception {
+    createGroup(groupUuid, groupName);
+
+    Optional<GroupReference> groupReference = loadGroup(groupName);
+    assertThatGroup(groupReference).value().groupUuid().isEqualTo(groupUuid);
+    assertThatGroup(groupReference).value().name().isEqualTo(groupName.get());
+  }
+
+  @Test
+  public void uuidOfNewGroupMustNotBeNull() throws Exception {
+    expectedException.expect(NullPointerException.class);
+    GroupNameNotes.forNewGroup(allUsersName, repo, null, groupName);
+  }
+
+  @Test
+  public void nameOfNewGroupMustNotBeNull() throws Exception {
+    expectedException.expect(NullPointerException.class);
+    GroupNameNotes.forNewGroup(allUsersName, repo, groupUuid, null);
+  }
+
+  @Test
+  public void nameOfNewGroupMayBeEmpty() throws Exception {
+    AccountGroup.NameKey emptyName = new AccountGroup.NameKey("");
+    createGroup(groupUuid, emptyName);
+
+    Optional<GroupReference> groupReference = loadGroup(emptyName);
+    assertThatGroup(groupReference).value().name().isEqualTo("");
+  }
+
+  @Test
+  public void newGroupMustNotReuseNameOfAnotherGroup() throws Exception {
+    createGroup(groupUuid, groupName);
+
+    AccountGroup.UUID anotherGroupUuid = new AccountGroup.UUID("AnotherGroup");
+    expectedException.expect(OrmDuplicateKeyException.class);
+    expectedException.expectMessage(groupName.get());
+    GroupNameNotes.forNewGroup(allUsersName, repo, anotherGroupUuid, groupName);
+  }
+
+  @Test
+  public void newGroupMayReuseUuidOfAnotherGroup() throws Exception {
+    createGroup(groupUuid, groupName);
+
+    AccountGroup.NameKey anotherName = new AccountGroup.NameKey("admins");
+    createGroup(groupUuid, anotherName);
+
+    Optional<GroupReference> group1 = loadGroup(groupName);
+    assertThatGroup(group1).value().groupUuid().isEqualTo(groupUuid);
+    Optional<GroupReference> group2 = loadGroup(anotherName);
+    assertThatGroup(group2).value().groupUuid().isEqualTo(groupUuid);
+  }
+
+  @Test
+  public void groupCanBeRenamed() throws Exception {
+    createGroup(groupUuid, groupName);
+
+    AccountGroup.NameKey anotherName = new AccountGroup.NameKey("admins");
+    renameGroup(groupUuid, groupName, anotherName);
+
+    Optional<GroupReference> groupReference = loadGroup(anotherName);
+    assertThatGroup(groupReference).value().groupUuid().isEqualTo(groupUuid);
+    assertThatGroup(groupReference).value().name().isEqualTo(anotherName.get());
+  }
+
+  @Test
+  public void previousNameOfGroupCannotBeUsedAfterRename() throws Exception {
+    createGroup(groupUuid, groupName);
+
+    AccountGroup.NameKey anotherName = new AccountGroup.NameKey("admins");
+    renameGroup(groupUuid, groupName, anotherName);
+
+    Optional<GroupReference> group = loadGroup(groupName);
+    assertThatGroup(group).isAbsent();
+  }
+
+  @Test
+  public void groupCannotBeRenamedToNull() throws Exception {
+    createGroup(groupUuid, groupName);
+
+    expectedException.expect(NullPointerException.class);
+    GroupNameNotes.forRename(allUsersName, repo, groupUuid, groupName, null);
+  }
+
+  @Test
+  public void oldNameOfGroupMustBeSpecifiedForRename() throws Exception {
+    createGroup(groupUuid, groupName);
+
+    AccountGroup.NameKey anotherName = new AccountGroup.NameKey("admins");
+    expectedException.expect(NullPointerException.class);
+    GroupNameNotes.forRename(allUsersName, repo, groupUuid, null, anotherName);
+  }
+
+  @Test
+  public void groupCannotBeRenamedWhenOldNameIsWrong() throws Exception {
+    createGroup(groupUuid, groupName);
+
+    AccountGroup.NameKey anotherOldName = new AccountGroup.NameKey("contributors");
+    AccountGroup.NameKey anotherName = new AccountGroup.NameKey("admins");
+    expectedException.expect(ConfigInvalidException.class);
+    expectedException.expectMessage(anotherOldName.get());
+    GroupNameNotes.forRename(allUsersName, repo, groupUuid, anotherOldName, anotherName);
+  }
+
+  @Test
+  public void groupCannotBeRenamedToNameOfAnotherGroup() throws Exception {
+    createGroup(groupUuid, groupName);
+    AccountGroup.UUID anotherGroupUuid = new AccountGroup.UUID("admins-ABC");
+    AccountGroup.NameKey anotherGroupName = new AccountGroup.NameKey("admins");
+    createGroup(anotherGroupUuid, anotherGroupName);
+
+    expectedException.expect(OrmDuplicateKeyException.class);
+    expectedException.expectMessage(anotherGroupName.get());
+    GroupNameNotes.forRename(allUsersName, repo, groupUuid, groupName, anotherGroupName);
+  }
+
+  @Test
+  public void groupCannotBeRenamedWithoutSpecifiedUuid() throws Exception {
+    createGroup(groupUuid, groupName);
+
+    AccountGroup.NameKey anotherName = new AccountGroup.NameKey("admins");
+    expectedException.expect(NullPointerException.class);
+    GroupNameNotes.forRename(allUsersName, repo, null, groupName, anotherName);
+  }
+
+  @Test
+  public void groupCannotBeRenamedWhenUuidIsWrong() throws Exception {
+    createGroup(groupUuid, groupName);
+
+    AccountGroup.UUID anotherGroupUuid = new AccountGroup.UUID("admins-ABC");
+    AccountGroup.NameKey anotherName = new AccountGroup.NameKey("admins");
+    expectedException.expect(ConfigInvalidException.class);
+    expectedException.expectMessage(groupUuid.get());
+    GroupNameNotes.forRename(allUsersName, repo, anotherGroupUuid, groupName, anotherName);
+  }
+
+  @Test
+  public void firstGroupCreationCreatesARootCommit() throws Exception {
+    createGroup(groupUuid, groupName);
+
+    Ref ref = repo.exactRef(RefNames.REFS_GROUPNAMES);
+    assertThat(ref.getObjectId()).isNotNull();
+
+    try (RevWalk revWalk = new RevWalk(repo)) {
+      RevCommit revCommit = revWalk.parseCommit(ref.getObjectId());
+      assertThat(revCommit.getParentCount()).isEqualTo(0);
+    }
+  }
+
+  @Test
+  public void furtherGroupCreationAppendsACommit() throws Exception {
+    createGroup(groupUuid, groupName);
+    ImmutableList<CommitInfo> commitsAfterCreation = log();
+
+    AccountGroup.UUID anotherGroupUuid = new AccountGroup.UUID("admins-ABC");
+    AccountGroup.NameKey anotherName = new AccountGroup.NameKey("admins");
+    createGroup(anotherGroupUuid, anotherName);
+
+    ImmutableList<CommitInfo> commitsAfterFurtherGroup = log();
+    assertThatCommits(commitsAfterFurtherGroup).containsAllIn(commitsAfterCreation);
+    assertThatCommits(commitsAfterFurtherGroup).lastElement().isNotIn(commitsAfterCreation);
+  }
+
+  @Test
+  public void groupRenamingAppendsACommit() throws Exception {
+    createGroup(groupUuid, groupName);
+    ImmutableList<CommitInfo> commitsAfterCreation = log();
+
+    AccountGroup.NameKey anotherName = new AccountGroup.NameKey("admins");
+    renameGroup(groupUuid, groupName, anotherName);
+
+    ImmutableList<CommitInfo> commitsAfterRename = log();
+    assertThatCommits(commitsAfterRename).containsAllIn(commitsAfterCreation);
+    assertThatCommits(commitsAfterRename).lastElement().isNotIn(commitsAfterCreation);
+  }
+
+  @Test
+  public void newCommitIsNotCreatedForRedundantNameUpdate() throws Exception {
+    createGroup(groupUuid, groupName);
+    ImmutableList<CommitInfo> commitsAfterCreation = log();
+
+    renameGroup(groupUuid, groupName, groupName);
+
+    ImmutableList<CommitInfo> commitsAfterRename = log();
+    assertThatCommits(commitsAfterRename).isEqualTo(commitsAfterCreation);
+  }
+
+  @Test
+  public void newCommitIsNotCreatedWhenCommittingGroupCreationTwice() throws Exception {
+    GroupNameNotes groupNameNotes =
+        GroupNameNotes.forNewGroup(allUsersName, repo, groupUuid, groupName);
+
+    commit(groupNameNotes);
+    ImmutableList<CommitInfo> commitsAfterFirstCommit = log();
+    commit(groupNameNotes);
+    ImmutableList<CommitInfo> commitsAfterSecondCommit = log();
+
+    assertThatCommits(commitsAfterSecondCommit).isEqualTo(commitsAfterFirstCommit);
+  }
+
+  @Test
+  public void newCommitIsNotCreatedWhenCommittingGroupRenamingTwice() throws Exception {
+    createGroup(groupUuid, groupName);
+
+    AccountGroup.NameKey anotherName = new AccountGroup.NameKey("admins");
+    GroupNameNotes groupNameNotes =
+        GroupNameNotes.forRename(allUsersName, repo, groupUuid, groupName, anotherName);
+
+    commit(groupNameNotes);
+    ImmutableList<CommitInfo> commitsAfterFirstCommit = log();
+    commit(groupNameNotes);
+    ImmutableList<CommitInfo> commitsAfterSecondCommit = log();
+
+    assertThatCommits(commitsAfterSecondCommit).isEqualTo(commitsAfterFirstCommit);
+  }
+
+  @Test
+  public void commitMessageMentionsGroupCreation() throws Exception {
+    createGroup(groupUuid, groupName);
+
+    ImmutableList<CommitInfo> commits = log();
+    assertThatCommits(commits).lastElement().message().contains("Create");
+    assertThatCommits(commits).lastElement().message().contains(groupName.get());
+  }
+
+  @Test
+  public void commitMessageMentionsGroupRenaming() throws Exception {
+    createGroup(groupUuid, groupName);
+
+    AccountGroup.NameKey anotherName = new AccountGroup.NameKey("admins");
+    renameGroup(groupUuid, groupName, anotherName);
+
+    ImmutableList<CommitInfo> commits = log();
+    assertThatCommits(commits).lastElement().message().contains("Rename");
+    assertThatCommits(commits).lastElement().message().contains(groupName.get());
+    assertThatCommits(commits).lastElement().message().contains(anotherName.get());
+  }
+
+  @Test
+  public void nonExistentNotesRefIsEquivalentToNonExistentGroup() throws Exception {
+    Optional<GroupReference> group = loadGroup(groupName);
+
+    assertThatGroup(group).isAbsent();
+  }
+
+  @Test
+  public void nonExistentGroupCannotBeLoaded() throws Exception {
+    createGroup(new AccountGroup.UUID("contributors-MN"), new AccountGroup.NameKey("contributors"));
+    createGroup(groupUuid, groupName);
+
+    Optional<GroupReference> group = loadGroup(new AccountGroup.NameKey("admins"));
+    assertThatGroup(group).isAbsent();
+  }
+
+  @Test
+  public void specificGroupCanBeLoaded() throws Exception {
+    createGroup(new AccountGroup.UUID("contributors-MN"), new AccountGroup.NameKey("contributors"));
+    createGroup(groupUuid, groupName);
+    createGroup(new AccountGroup.UUID("admins-ABC"), new AccountGroup.NameKey("admins"));
+
+    Optional<GroupReference> group = loadGroup(groupName);
+    assertThatGroup(group).value().groupUuid().isEqualTo(groupUuid);
+  }
+
+  @Test
+  public void nonExistentNotesRefIsEquivalentToNotAnyExistingGroups() throws Exception {
+    ImmutableList<GroupReference> allGroups = GroupNameNotes.loadAllGroups(repo);
+
+    assertThat(allGroups).isEmpty();
+  }
+
+  @Test
+  public void allGroupsCanBeLoaded() throws Exception {
+    AccountGroup.UUID groupUuid1 = new AccountGroup.UUID("contributors-MN");
+    AccountGroup.NameKey groupName1 = new AccountGroup.NameKey("contributors");
+    createGroup(groupUuid1, groupName1);
+    AccountGroup.UUID groupUuid2 = new AccountGroup.UUID("admins-ABC");
+    AccountGroup.NameKey groupName2 = new AccountGroup.NameKey("admins");
+    createGroup(groupUuid2, groupName2);
+
+    ImmutableList<GroupReference> allGroups = GroupNameNotes.loadAllGroups(repo);
+
+    GroupReference group1 = new GroupReference(groupUuid1, groupName1.get());
+    GroupReference group2 = new GroupReference(groupUuid2, groupName2.get());
+    assertThat(allGroups).containsExactly(group1, group2);
+  }
+
+  @Test
+  public void loadedGroupsContainGroupsWithDuplicateGroupUuids() throws Exception {
+    createGroup(groupUuid, groupName);
+    AccountGroup.NameKey anotherGroupName = new AccountGroup.NameKey("admins");
+    createGroup(groupUuid, anotherGroupName);
+
+    ImmutableList<GroupReference> allGroups = GroupNameNotes.loadAllGroups(repo);
+
+    GroupReference group1 = new GroupReference(groupUuid, groupName.get());
+    GroupReference group2 = new GroupReference(groupUuid, anotherGroupName.get());
+    assertThat(allGroups).containsExactly(group1, group2);
+  }
+
+  @Test
+  public void updateGroupNames() throws Exception {
+    GroupReference g1 = newGroup("a");
+    GroupReference g2 = newGroup("b");
+
+    PersonIdent ident = newPersonIdent();
+    updateAllGroups(ident, g1, g2);
+
+    ImmutableList<CommitInfo> log = log();
+    assertThat(log).hasSize(1);
+    assertThat(log.get(0)).parents().isEmpty();
+    assertThat(log.get(0)).message().isEqualTo("Store 2 group names");
+    assertThat(log.get(0)).author().matches(ident);
+    assertThat(log.get(0)).committer().matches(ident);
+
+    assertThat(GroupNameNotes.loadAllGroups(repo)).containsExactly(g1, g2);
+
+    // Updating the same set of names is a no-op.
+    String commit = log.get(0).commit;
+    updateAllGroups(newPersonIdent(), g1, g2);
+    log = log();
+    assertThat(log).hasSize(1);
+    assertThat(log.get(0)).commit().isEqualTo(commit);
+  }
+
+  @Test
+  public void updateGroupNamesOverwritesExistingNotes() throws Exception {
+    GroupReference g1 = newGroup("a");
+    GroupReference g2 = newGroup("b");
+
+    TestRepository<?> tr = new TestRepository<>(repo);
+    ObjectId k1 = getNoteKey(g1);
+    ObjectId k2 = getNoteKey(g2);
+    ObjectId k3 = GroupNameNotes.getNoteKey(new AccountGroup.NameKey("c"));
+    PersonIdent ident = newPersonIdent();
+    ObjectId origCommitId =
+        tr.branch(REFS_GROUPNAMES)
+            .commit()
+            .message("Prepopulate group name")
+            .author(ident)
+            .committer(ident)
+            .add(k1.name(), "[group]\n\tuuid = a-1\n\tname = a\nanotherKey = foo\n")
+            .add(k2.name(), "[group]\n\tuuid = a-1\n\tname = b\n")
+            .add(k3.name(), "[group]\n\tuuid = c-3\n\tname = c\n")
+            .create()
+            .copy();
+
+    ident = newPersonIdent();
+    updateAllGroups(ident, g1, g2);
+
+    assertThat(GroupNameNotes.loadAllGroups(repo)).containsExactly(g1, g2);
+
+    ImmutableList<CommitInfo> log = log();
+    assertThat(log).hasSize(2);
+    assertThat(log.get(0)).commit().isEqualTo(origCommitId.name());
+
+    assertThat(log.get(1)).message().isEqualTo("Store 2 group names");
+    assertThat(log.get(1)).author().matches(ident);
+    assertThat(log.get(1)).committer().matches(ident);
+
+    // Old note content was overwritten.
+    assertThat(readNameNote(g1)).isEqualTo("[group]\n\tuuid = a-1\n\tname = a\n");
+  }
+
+  @Test
+  public void updateGroupNamesWithEmptyCollectionClearsAllNotes() throws Exception {
+    GroupReference g1 = newGroup("a");
+    GroupReference g2 = newGroup("b");
+
+    PersonIdent ident = newPersonIdent();
+    updateAllGroups(ident, g1, g2);
+
+    assertThat(GroupNameNotes.loadAllGroups(repo)).containsExactly(g1, g2);
+
+    updateAllGroups(ident);
+
+    assertThat(GroupNameNotes.loadAllGroups(repo)).isEmpty();
+
+    ImmutableList<CommitInfo> log = log();
+    assertThat(log).hasSize(2);
+    assertThat(log.get(1)).message().isEqualTo("Store 0 group names");
+  }
+
+  @Test
+  public void updateGroupNamesRejectsNonOneToOneGroupReferences() throws Exception {
+    assertIllegalArgument(
+        new GroupReference(new AccountGroup.UUID("uuid1"), "name1"),
+        new GroupReference(new AccountGroup.UUID("uuid1"), "name2"));
+    assertIllegalArgument(
+        new GroupReference(new AccountGroup.UUID("uuid1"), "name1"),
+        new GroupReference(new AccountGroup.UUID("uuid2"), "name1"));
+    assertIllegalArgument(
+        new GroupReference(new AccountGroup.UUID("uuid1"), "name1"),
+        new GroupReference(new AccountGroup.UUID("uuid1"), "name1"));
+  }
+
+  @Test
+  public void emptyGroupName() throws Exception {
+    GroupReference g = newGroup("");
+    updateAllGroups(newPersonIdent(), g);
+
+    assertThat(GroupNameNotes.loadAllGroups(repo)).containsExactly(g);
+    assertThat(readNameNote(g)).isEqualTo("[group]\n\tuuid = -1\n\tname = \n");
+  }
+
+  private void createGroup(AccountGroup.UUID groupUuid, AccountGroup.NameKey groupName)
+      throws Exception {
+    GroupNameNotes groupNameNotes =
+        GroupNameNotes.forNewGroup(allUsersName, repo, groupUuid, groupName);
+    commit(groupNameNotes);
+  }
+
+  private void renameGroup(
+      AccountGroup.UUID groupUuid, AccountGroup.NameKey oldName, AccountGroup.NameKey newName)
+      throws Exception {
+    GroupNameNotes groupNameNotes =
+        GroupNameNotes.forRename(allUsersName, repo, groupUuid, oldName, newName);
+    commit(groupNameNotes);
+  }
+
+  private Optional<GroupReference> loadGroup(AccountGroup.NameKey groupName) throws Exception {
+    return GroupNameNotes.loadGroup(repo, groupName);
+  }
+
+  private void commit(GroupNameNotes groupNameNotes) throws IOException {
+    try (MetaDataUpdate metaDataUpdate = createMetaDataUpdate()) {
+      groupNameNotes.commit(metaDataUpdate);
+    }
+  }
+
+  private MetaDataUpdate createMetaDataUpdate() {
+    PersonIdent serverIdent = newPersonIdent();
+
+    MetaDataUpdate metaDataUpdate =
+        new MetaDataUpdate(
+            GitReferenceUpdated.DISABLED, new Project.NameKey("Test Repository"), repo);
+    metaDataUpdate.getCommitBuilder().setCommitter(serverIdent);
+    metaDataUpdate.getCommitBuilder().setAuthor(serverIdent);
+    return metaDataUpdate;
+  }
+
+  private GroupReference newGroup(String name) {
+    int id = idCounter.incrementAndGet();
+    return new GroupReference(new AccountGroup.UUID(name + "-" + id), name);
+  }
+
+  private static PersonIdent newPersonIdent() {
+    return new PersonIdent(SERVER_NAME, SERVER_EMAIL, TimeUtil.nowTs(), TZ);
+  }
+
+  private static ObjectId getNoteKey(GroupReference g) {
+    return GroupNameNotes.getNoteKey(new AccountGroup.NameKey(g.getName()));
+  }
+
+  private void updateAllGroups(PersonIdent ident, GroupReference... groupRefs) throws Exception {
+    try (ObjectInserter inserter = repo.newObjectInserter()) {
+      BatchRefUpdate bru = repo.getRefDatabase().newBatchUpdate();
+      GroupNameNotes.updateAllGroups(repo, inserter, bru, Arrays.asList(groupRefs), ident);
+      inserter.flush();
+      RefUpdateUtil.executeChecked(bru, repo);
+    }
+  }
+
+  private void assertIllegalArgument(GroupReference... groupRefs) throws Exception {
+    try (ObjectInserter inserter = repo.newObjectInserter()) {
+      BatchRefUpdate bru = repo.getRefDatabase().newBatchUpdate();
+      PersonIdent ident = newPersonIdent();
+      try {
+        GroupNameNotes.updateAllGroups(repo, inserter, bru, Arrays.asList(groupRefs), ident);
+        assert_().fail("Expected IllegalArgumentException");
+      } catch (IllegalArgumentException e) {
+        assertThat(e).hasMessageThat().isEqualTo(GroupNameNotes.UNIQUE_REF_ERROR);
+      }
+    }
+  }
+
+  private ImmutableList<CommitInfo> log() throws Exception {
+    return GitTestUtil.log(repo, REFS_GROUPNAMES);
+  }
+
+  private String readNameNote(GroupReference g) throws Exception {
+    ObjectId k = getNoteKey(g);
+    try (RevWalk rw = new RevWalk(repo)) {
+      ObjectReader reader = rw.getObjectReader();
+      Ref ref = repo.exactRef(RefNames.REFS_GROUPNAMES);
+      NoteMap noteMap = NoteMap.read(reader, rw.parseCommit(ref.getObjectId()));
+      return new String(reader.open(noteMap.get(k), OBJ_BLOB).getCachedBytes(), UTF_8);
+    }
+  }
+
+  private static OptionalSubject<GroupReferenceSubject, GroupReference> assertThatGroup(
+      Optional<GroupReference> group) {
+    return assertThat(group, GroupReferenceSubject::assertThat);
+  }
+
+  private static ListSubject<CommitInfoSubject, CommitInfo> assertThatCommits(
+      List<CommitInfo> commits) {
+    return ListSubject.assertThat(commits, CommitInfoSubject::assertThat);
+  }
+}
diff --git a/javatests/com/google/gerrit/server/group/db/GroupsNoteDbConsistencyCheckerTest.java b/javatests/com/google/gerrit/server/group/db/GroupsNoteDbConsistencyCheckerTest.java
new file mode 100644
index 0000000..a5b04ee
--- /dev/null
+++ b/javatests/com/google/gerrit/server/group/db/GroupsNoteDbConsistencyCheckerTest.java
@@ -0,0 +1,112 @@
+// Copyright (C) 2017 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.google.gerrit.server.group.db;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.extensions.api.config.ConsistencyCheckInfo.ConsistencyProblemInfo.warning;
+
+import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo.ConsistencyProblemInfo;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.group.db.testing.GroupTestUtil;
+import java.util.List;
+import org.junit.Test;
+
+public class GroupsNoteDbConsistencyCheckerTest extends AbstractGroupTest {
+
+  @Test
+  public void groupNamesRefIsMissing() throws Exception {
+    List<ConsistencyProblemInfo> problems =
+        GroupsNoteDbConsistencyChecker.checkWithGroupNameNotes(
+            allUsersRepo, new AccountGroup.NameKey("g-1"), new AccountGroup.UUID("uuid-1"));
+    assertThat(problems)
+        .containsExactly(warning("Group with name 'g-1' doesn't exist in the list of all names"));
+  }
+
+  @Test
+  public void groupNameNoteIsMissing() throws Exception {
+    updateGroupNamesRef("g-2", "[group]\n\tuuid = uuid-2\n\tname = g-2\n");
+    List<ConsistencyProblemInfo> problems =
+        GroupsNoteDbConsistencyChecker.checkWithGroupNameNotes(
+            allUsersRepo, new AccountGroup.NameKey("g-1"), new AccountGroup.UUID("uuid-1"));
+    assertThat(problems)
+        .containsExactly(warning("Group with name 'g-1' doesn't exist in the list of all names"));
+  }
+
+  @Test
+  public void groupNameNoteIsConsistent() throws Exception {
+    updateGroupNamesRef("g-1", "[group]\n\tuuid = uuid-1\n\tname = g-1\n");
+    List<ConsistencyProblemInfo> problems =
+        GroupsNoteDbConsistencyChecker.checkWithGroupNameNotes(
+            allUsersRepo, new AccountGroup.NameKey("g-1"), new AccountGroup.UUID("uuid-1"));
+    assertThat(problems).isEmpty();
+  }
+
+  @Test
+  public void groupNameNoteHasDifferentUUID() throws Exception {
+    updateGroupNamesRef("g-1", "[group]\n\tuuid = uuid-2\n\tname = g-1\n");
+    List<ConsistencyProblemInfo> problems =
+        GroupsNoteDbConsistencyChecker.checkWithGroupNameNotes(
+            allUsersRepo, new AccountGroup.NameKey("g-1"), new AccountGroup.UUID("uuid-1"));
+    assertThat(problems)
+        .containsExactly(
+            warning(
+                "group with name 'g-1' has UUID 'uuid-1' in 'group.config' but 'uuid-2' in group "
+                    + "name notes"));
+  }
+
+  @Test
+  public void groupNameNoteHasDifferentName() throws Exception {
+    updateGroupNamesRef("g-1", "[group]\n\tuuid = uuid-1\n\tname = g-2\n");
+    List<ConsistencyProblemInfo> problems =
+        GroupsNoteDbConsistencyChecker.checkWithGroupNameNotes(
+            allUsersRepo, new AccountGroup.NameKey("g-1"), new AccountGroup.UUID("uuid-1"));
+    assertThat(problems)
+        .containsExactly(warning("group note of name 'g-1' claims to represent name of 'g-2'"));
+  }
+
+  @Test
+  public void groupNameNoteHasDifferentNameAndUUID() throws Exception {
+    updateGroupNamesRef("g-1", "[group]\n\tuuid = uuid-2\n\tname = g-2\n");
+    List<ConsistencyProblemInfo> problems =
+        GroupsNoteDbConsistencyChecker.checkWithGroupNameNotes(
+            allUsersRepo, new AccountGroup.NameKey("g-1"), new AccountGroup.UUID("uuid-1"));
+    assertThat(problems)
+        .containsExactly(
+            warning(
+                "group with name 'g-1' has UUID 'uuid-1' in 'group.config' but 'uuid-2' in group "
+                    + "name notes"),
+            warning("group note of name 'g-1' claims to represent name of 'g-2'"))
+        .inOrder();
+  }
+
+  @Test
+  public void groupNameNoteFailToParse() throws Exception {
+    updateGroupNamesRef("g-1", "[invalid");
+    List<ConsistencyProblemInfo> problems =
+        GroupsNoteDbConsistencyChecker.checkWithGroupNameNotes(
+            allUsersRepo, new AccountGroup.NameKey("g-1"), new AccountGroup.UUID("uuid-1"));
+    assertThat(problems)
+        .containsExactly(
+            warning(
+                "fail to check consistency with group name notes: Unexpected end of config file"));
+  }
+
+  private void updateGroupNamesRef(String groupName, String content) throws Exception {
+    String nameKey = GroupNameNotes.getNoteKey(new AccountGroup.NameKey(groupName)).getName();
+    GroupTestUtil.updateGroupFile(
+        allUsersRepo, serverIdent, RefNames.REFS_GROUPNAMES, nameKey, content);
+  }
+}
diff --git a/javatests/com/google/gerrit/server/index/account/AccountFieldTest.java b/javatests/com/google/gerrit/server/index/account/AccountFieldTest.java
new file mode 100644
index 0000000..c69fa20
--- /dev/null
+++ b/javatests/com/google/gerrit/server/index/account/AccountFieldTest.java
@@ -0,0 +1,81 @@
+// Copyright (C) 2017 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.google.gerrit.server.index.account;
+
+import static com.google.common.truth.Truth.assertThat;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Streams;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.AllUsersNameProvider;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.testing.GerritBaseTests;
+import java.util.List;
+import org.eclipse.jgit.lib.ObjectId;
+import org.junit.Test;
+
+public class AccountFieldTest extends GerritBaseTests {
+  @Test
+  public void refStateFieldValues() throws Exception {
+    AllUsersName allUsersName = new AllUsersName(AllUsersNameProvider.DEFAULT);
+    Account account = new Account(new Account.Id(1), TimeUtil.nowTs());
+    String metaId = "0e39795bb25dc914118224995c53c5c36923a461";
+    account.setMetaId(metaId);
+    List<String> values =
+        toStrings(AccountField.REF_STATE.get(AccountState.forAccount(allUsersName, account)));
+    assertThat(values).hasSize(1);
+    String expectedValue =
+        allUsersName.get() + ":" + RefNames.refsUsers(account.getId()) + ":" + metaId;
+    assertThat(Iterables.getOnlyElement(values)).isEqualTo(expectedValue);
+  }
+
+  @Test
+  public void externalIdStateFieldValues() throws Exception {
+    Account.Id id = new Account.Id(1);
+    Account account = new Account(id, TimeUtil.nowTs());
+    ExternalId extId1 =
+        ExternalId.create(
+            ExternalId.Key.create(ExternalId.SCHEME_MAILTO, "foo.bar@example.com"),
+            id,
+            "foo.bar@example.com",
+            null,
+            ObjectId.fromString("1b9a0cf038ea38a0ab08617c39aa8e28413a27ca"));
+    ExternalId extId2 =
+        ExternalId.create(
+            ExternalId.Key.create(ExternalId.SCHEME_USERNAME, "foo"),
+            id,
+            null,
+            "secret",
+            ObjectId.fromString("5b3a73dc9a668a5b89b5f049225261e3e3291d1a"));
+    List<String> values =
+        toStrings(
+            AccountField.EXTERNAL_ID_STATE.get(
+                AccountState.forAccount(null, account, ImmutableSet.of(extId1, extId2))));
+    String expectedValue1 = extId1.key().sha1().name() + ":" + extId1.blobId().name();
+    String expectedValue2 = extId2.key().sha1().name() + ":" + extId2.blobId().name();
+    assertThat(values).containsExactly(expectedValue1, expectedValue2);
+  }
+
+  private List<String> toStrings(Iterable<byte[]> values) {
+    return Streams.stream(values).map(v -> new String(v, UTF_8)).collect(toList());
+  }
+}
diff --git a/javatests/com/google/gerrit/server/index/change/ChangeFieldTest.java b/javatests/com/google/gerrit/server/index/change/ChangeFieldTest.java
new file mode 100644
index 0000000..758c304
--- /dev/null
+++ b/javatests/com/google/gerrit/server/index/change/ChangeFieldTest.java
@@ -0,0 +1,160 @@
+// 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.
+
+package com.google.gerrit.server.index.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.collect.HashBasedTable;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Table;
+import com.google.gerrit.common.data.SubmitRecord;
+import com.google.gerrit.common.data.SubmitRequirement;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.ReviewerSet;
+import com.google.gerrit.server.notedb.ReviewerStateInternal;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.testing.GerritBaseTests;
+import com.google.gerrit.testing.TestTimeUtil;
+import java.sql.Timestamp;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ChangeFieldTest extends GerritBaseTests {
+  @Before
+  public void setUp() {
+    TestTimeUtil.resetWithClockStep(1, TimeUnit.SECONDS);
+  }
+
+  @After
+  public void tearDown() {
+    TestTimeUtil.useSystemTime();
+  }
+
+  @Test
+  public void reviewerFieldValues() {
+    Table<ReviewerStateInternal, Account.Id, Timestamp> t = HashBasedTable.create();
+    Timestamp t1 = TimeUtil.nowTs();
+    t.put(ReviewerStateInternal.REVIEWER, new Account.Id(1), t1);
+    Timestamp t2 = TimeUtil.nowTs();
+    t.put(ReviewerStateInternal.CC, new Account.Id(2), t2);
+    ReviewerSet reviewers = ReviewerSet.fromTable(t);
+
+    List<String> values = ChangeField.getReviewerFieldValues(reviewers);
+    assertThat(values)
+        .containsExactly(
+            "REVIEWER,1", "REVIEWER,1," + t1.getTime(), "CC,2", "CC,2," + t2.getTime());
+
+    assertThat(ChangeField.parseReviewerFieldValues(new Change.Id(1), values)).isEqualTo(reviewers);
+  }
+
+  @Test
+  public void formatSubmitRecordValues() {
+    assertThat(
+            ChangeField.formatSubmitRecordValues(
+                ImmutableList.of(
+                    record(
+                        SubmitRecord.Status.OK,
+                        label(SubmitRecord.Label.Status.MAY, "Label-1", null),
+                        label(SubmitRecord.Label.Status.OK, "Label-2", 1))),
+                new Account.Id(1)))
+        .containsExactly("OK", "MAY,label-1", "OK,label-2", "OK,label-2,0", "OK,label-2,1");
+  }
+
+  @Test
+  public void storedSubmitRecords() {
+    assertStoredRecordRoundTrip(record(SubmitRecord.Status.CLOSED));
+
+    SubmitRecord r =
+        record(
+            SubmitRecord.Status.OK,
+            label(SubmitRecord.Label.Status.MAY, "Label-1", null),
+            label(SubmitRecord.Label.Status.OK, "Label-2", 1));
+
+    assertStoredRecordRoundTrip(r);
+  }
+
+  @Test
+  public void storedSubmitRecordsWithRequirement() {
+    SubmitRecord r =
+        record(
+            SubmitRecord.Status.OK,
+            label(SubmitRecord.Label.Status.MAY, "Label-1", null),
+            label(SubmitRecord.Label.Status.OK, "Label-2", 1));
+
+    SubmitRequirement sr =
+        SubmitRequirement.builder()
+            .setType("short_type")
+            .setFallbackText("Fallback text may contain special symbols like < > \\ / ; :")
+            .addCustomValue("custom_data", "my value")
+            .build();
+    r.requirements = Collections.singletonList(sr);
+
+    assertStoredRecordRoundTrip(r);
+  }
+
+  @Test
+  public void storedSubmitRequirementWithoutCustomData() {
+    SubmitRecord r =
+        record(
+            SubmitRecord.Status.OK,
+            label(SubmitRecord.Label.Status.MAY, "Label-1", null),
+            label(SubmitRecord.Label.Status.OK, "Label-2", 1));
+
+    // Doesn't have any custom data value
+    SubmitRequirement sr =
+        SubmitRequirement.builder().setFallbackText("short_type").setType("ci_status").build();
+    r.requirements = Collections.singletonList(sr);
+
+    assertStoredRecordRoundTrip(r);
+  }
+
+  private static SubmitRecord record(SubmitRecord.Status status, SubmitRecord.Label... labels) {
+    SubmitRecord r = new SubmitRecord();
+    r.status = status;
+    if (labels.length > 0) {
+      r.labels = ImmutableList.copyOf(labels);
+    }
+    return r;
+  }
+
+  private static SubmitRecord.Label label(
+      SubmitRecord.Label.Status status, String label, Integer appliedBy) {
+    SubmitRecord.Label l = new SubmitRecord.Label();
+    l.status = status;
+    l.label = label;
+    if (appliedBy != null) {
+      l.appliedBy = new Account.Id(appliedBy);
+    }
+    return l;
+  }
+
+  private static void assertStoredRecordRoundTrip(SubmitRecord... records) {
+    List<SubmitRecord> recordList = ImmutableList.copyOf(records);
+    List<String> stored =
+        ChangeField.storedSubmitRecords(recordList).stream()
+            .map(s -> new String(s, UTF_8))
+            .collect(toList());
+    assertThat(ChangeField.parseSubmitRecords(stored))
+        .named("JSON %s" + stored)
+        .isEqualTo(recordList);
+  }
+}
diff --git a/javatests/com/google/gerrit/server/index/change/ChangeIndexRewriterTest.java b/javatests/com/google/gerrit/server/index/change/ChangeIndexRewriterTest.java
new file mode 100644
index 0000000..53994a6
--- /dev/null
+++ b/javatests/com/google/gerrit/server/index/change/ChangeIndexRewriterTest.java
@@ -0,0 +1,264 @@
+// Copyright (C) 2013 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.google.gerrit.server.index.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.common.data.GlobalCapability.DEFAULT_MAX_QUERY_LIMIT;
+import static com.google.gerrit.index.query.Predicate.and;
+import static com.google.gerrit.index.query.Predicate.or;
+import static com.google.gerrit.reviewdb.client.Change.Status.MERGED;
+import static com.google.gerrit.reviewdb.client.Change.Status.NEW;
+import static com.google.gerrit.server.index.change.IndexedChangeQuery.convertOptions;
+import static org.junit.Assert.assertEquals;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.index.IndexConfig;
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.query.change.AndChangeSource;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.ChangeQueryBuilder;
+import com.google.gerrit.server.query.change.ChangeStatusPredicate;
+import com.google.gerrit.server.query.change.OrSource;
+import com.google.gerrit.testing.GerritBaseTests;
+import java.util.Arrays;
+import java.util.EnumSet;
+import java.util.Set;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ChangeIndexRewriterTest extends GerritBaseTests {
+  private static final IndexConfig CONFIG = IndexConfig.createDefault();
+
+  private FakeChangeIndex index;
+  private ChangeIndexCollection indexes;
+  private ChangeQueryBuilder queryBuilder;
+  private ChangeIndexRewriter rewrite;
+
+  @Before
+  public void setUp() throws Exception {
+    index = new FakeChangeIndex(FakeChangeIndex.V2);
+    indexes = new ChangeIndexCollection();
+    indexes.setSearchIndex(index);
+    queryBuilder = new FakeQueryBuilder(indexes);
+    rewrite = new ChangeIndexRewriter(indexes, IndexConfig.builder().maxTerms(3).build());
+  }
+
+  @Test
+  public void indexPredicate() throws Exception {
+    Predicate<ChangeData> in = parse("file:a");
+    assertThat(rewrite(in)).isEqualTo(query(in));
+  }
+
+  @Test
+  public void nonIndexPredicate() throws Exception {
+    Predicate<ChangeData> in = parse("foo:a");
+    Predicate<ChangeData> out = rewrite(in);
+    assertThat(AndChangeSource.class).isSameAs(out.getClass());
+    assertThat(out.getChildren())
+        .containsExactly(
+            query(Predicate.or(ChangeStatusPredicate.open(), ChangeStatusPredicate.closed())), in)
+        .inOrder();
+  }
+
+  @Test
+  public void indexPredicates() throws Exception {
+    Predicate<ChangeData> in = parse("file:a file:b");
+    assertThat(rewrite(in)).isEqualTo(query(in));
+  }
+
+  @Test
+  public void nonIndexPredicates() throws Exception {
+    Predicate<ChangeData> in = parse("foo:a OR foo:b");
+    Predicate<ChangeData> out = rewrite(in);
+    assertThat(AndChangeSource.class).isSameAs(out.getClass());
+    assertThat(out.getChildren())
+        .containsExactly(
+            query(Predicate.or(ChangeStatusPredicate.open(), ChangeStatusPredicate.closed())), in)
+        .inOrder();
+  }
+
+  @Test
+  public void oneIndexPredicate() throws Exception {
+    Predicate<ChangeData> in = parse("foo:a file:b");
+    Predicate<ChangeData> out = rewrite(in);
+    assertThat(AndChangeSource.class).isSameAs(out.getClass());
+    assertThat(out.getChildren()).containsExactly(query(in.getChild(1)), in.getChild(0)).inOrder();
+  }
+
+  @Test
+  public void threeLevelTreeWithAllIndexPredicates() throws Exception {
+    Predicate<ChangeData> in = parse("-status:abandoned (file:a OR file:b)");
+    assertThat(rewrite.rewrite(in, options(0, DEFAULT_MAX_QUERY_LIMIT))).isEqualTo(query(in));
+  }
+
+  @Test
+  public void threeLevelTreeWithSomeIndexPredicates() throws Exception {
+    Predicate<ChangeData> in = parse("-foo:a (file:b OR file:c)");
+    Predicate<ChangeData> out = rewrite(in);
+    assertThat(out.getClass()).isSameAs(AndChangeSource.class);
+    assertThat(out.getChildren()).containsExactly(query(in.getChild(1)), in.getChild(0)).inOrder();
+  }
+
+  @Test
+  public void multipleIndexPredicates() throws Exception {
+    Predicate<ChangeData> in = parse("file:a OR foo:b OR file:c OR foo:d");
+    Predicate<ChangeData> out = rewrite(in);
+    assertThat(out.getClass()).isSameAs(OrSource.class);
+    assertThat(out.getChildren())
+        .containsExactly(query(or(in.getChild(0), in.getChild(2))), in.getChild(1), in.getChild(3))
+        .inOrder();
+  }
+
+  @Test
+  public void indexAndNonIndexPredicates() throws Exception {
+    Predicate<ChangeData> in = parse("status:new bar:p file:a");
+    Predicate<ChangeData> out = rewrite(in);
+    assertThat(AndChangeSource.class).isSameAs(out.getClass());
+    assertThat(out.getChildren())
+        .containsExactly(query(and(in.getChild(0), in.getChild(2))), in.getChild(1))
+        .inOrder();
+  }
+
+  @Test
+  public void duplicateCompoundNonIndexOnlyPredicates() throws Exception {
+    Predicate<ChangeData> in = parse("status:new bar:p file:a");
+    Predicate<ChangeData> out = rewrite(in);
+    assertThat(out.getClass()).isEqualTo(AndChangeSource.class);
+    assertThat(out.getChildren())
+        .containsExactly(query(and(in.getChild(0), in.getChild(2))), in.getChild(1))
+        .inOrder();
+  }
+
+  @Test
+  public void duplicateCompoundIndexOnlyPredicates() throws Exception {
+    Predicate<ChangeData> in = parse("(status:new OR file:a) bar:p file:b");
+    Predicate<ChangeData> out = rewrite(in);
+    assertThat(out.getClass()).isEqualTo(AndChangeSource.class);
+    assertThat(out.getChildren())
+        .containsExactly(query(and(in.getChild(0), in.getChild(2))), in.getChild(1))
+        .inOrder();
+  }
+
+  @Test
+  public void optionsArgumentOverridesAllLimitPredicates() throws Exception {
+    Predicate<ChangeData> in = parse("limit:1 file:a limit:3");
+    Predicate<ChangeData> out = rewrite(in, options(0, 5));
+    assertThat(out.getClass()).isEqualTo(AndChangeSource.class);
+    assertThat(out.getChildren())
+        .containsExactly(query(in.getChild(1), 5), parse("limit:5"), parse("limit:5"))
+        .inOrder();
+  }
+
+  @Test
+  public void startIncreasesLimitInQueryButNotPredicate() throws Exception {
+    int n = 3;
+    Predicate<ChangeData> f = parse("file:a");
+    Predicate<ChangeData> l = parse("limit:" + n);
+    Predicate<ChangeData> in = andSource(f, l);
+    assertThat(rewrite.rewrite(in, options(0, n))).isEqualTo(andSource(query(f, 3), l));
+    assertThat(rewrite.rewrite(in, options(1, n))).isEqualTo(andSource(query(f, 4), l));
+    assertThat(rewrite.rewrite(in, options(2, n))).isEqualTo(andSource(query(f, 5), l));
+  }
+
+  @Test
+  public void getPossibleStatus() throws Exception {
+    Set<Change.Status> all = EnumSet.allOf(Change.Status.class);
+    assertThat(status("file:a")).isEqualTo(all);
+    assertThat(status("is:new")).containsExactly(NEW);
+    assertThat(status("is:new OR is:merged")).containsExactly(NEW, MERGED);
+    assertThat(status("is:new OR is:x")).isEqualTo(all);
+
+    assertThat(status("is:new is:merged")).isEmpty();
+    assertThat(status("(is:new) (is:merged)")).isEmpty();
+    assertThat(status("(is:new) (is:merged)")).isEmpty();
+    assertThat(status("is:new is:x")).containsExactly(NEW);
+  }
+
+  @Test
+  public void unsupportedIndexOperator() throws Exception {
+    Predicate<ChangeData> in = parse("status:merged file:a");
+    assertThat(rewrite(in)).isEqualTo(query(in));
+
+    indexes.setSearchIndex(new FakeChangeIndex(FakeChangeIndex.V1));
+
+    exception.expect(QueryParseException.class);
+    exception.expectMessage("Unsupported index predicate: file:a");
+    rewrite(in);
+  }
+
+  @Test
+  public void tooManyTerms() throws Exception {
+    String q = "file:a OR file:b OR file:c";
+    Predicate<ChangeData> in = parse(q);
+    assertEquals(query(in), rewrite(in));
+
+    exception.expect(QueryParseException.class);
+    exception.expectMessage("too many terms in query");
+    rewrite(parse(q + " OR file:d"));
+  }
+
+  @Test
+  public void testConvertOptions() throws Exception {
+    assertEquals(options(0, 3), convertOptions(options(0, 3)));
+    assertEquals(options(0, 4), convertOptions(options(1, 3)));
+    assertEquals(options(0, 5), convertOptions(options(2, 3)));
+  }
+
+  @Test
+  public void addingStartToLimitDoesNotExceedBackendLimit() throws Exception {
+    int max = CONFIG.maxLimit();
+    assertEquals(options(0, max), convertOptions(options(0, max)));
+    assertEquals(options(0, max), convertOptions(options(1, max)));
+    assertEquals(options(0, max), convertOptions(options(1, max - 1)));
+    assertEquals(options(0, max), convertOptions(options(2, max - 1)));
+  }
+
+  private Predicate<ChangeData> parse(String query) throws QueryParseException {
+    return queryBuilder.parse(query);
+  }
+
+  @SafeVarargs
+  private static AndChangeSource andSource(Predicate<ChangeData>... preds) {
+    return new AndChangeSource(Arrays.asList(preds));
+  }
+
+  private Predicate<ChangeData> rewrite(Predicate<ChangeData> in) throws QueryParseException {
+    return rewrite.rewrite(in, options(0, DEFAULT_MAX_QUERY_LIMIT));
+  }
+
+  private Predicate<ChangeData> rewrite(Predicate<ChangeData> in, QueryOptions opts)
+      throws QueryParseException {
+    return rewrite.rewrite(in, opts);
+  }
+
+  private IndexedChangeQuery query(Predicate<ChangeData> p) throws QueryParseException {
+    return query(p, DEFAULT_MAX_QUERY_LIMIT);
+  }
+
+  private IndexedChangeQuery query(Predicate<ChangeData> p, int limit) throws QueryParseException {
+    return new IndexedChangeQuery(index, p, options(0, limit));
+  }
+
+  private static QueryOptions options(int start, int limit) {
+    return IndexedChangeQuery.createOptions(CONFIG, start, limit, ImmutableSet.<String>of());
+  }
+
+  private Set<Change.Status> status(String query) throws QueryParseException {
+    return ChangeIndexRewriter.getPossibleStatus(parse(query));
+  }
+}
diff --git a/javatests/com/google/gerrit/server/index/change/FakeChangeIndex.java b/javatests/com/google/gerrit/server/index/change/FakeChangeIndex.java
new file mode 100644
index 0000000..d4ecb6d
--- /dev/null
+++ b/javatests/com/google/gerrit/server/index/change/FakeChangeIndex.java
@@ -0,0 +1,111 @@
+// Copyright (C) 2013 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.google.gerrit.server.index.change;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.index.FieldDef;
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.index.query.FieldBundle;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryParseException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.ChangeDataSource;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.ResultSet;
+import org.junit.Ignore;
+
+@Ignore
+public class FakeChangeIndex implements ChangeIndex {
+  static final Schema<ChangeData> V1 =
+      new Schema<>(1, ImmutableList.<FieldDef<ChangeData, ?>>of(ChangeField.STATUS));
+
+  static final Schema<ChangeData> V2 =
+      new Schema<>(2, ImmutableList.of(ChangeField.STATUS, ChangeField.PATH, ChangeField.UPDATED));
+
+  private static class Source implements ChangeDataSource {
+    private final Predicate<ChangeData> p;
+
+    Source(Predicate<ChangeData> p) {
+      this.p = p;
+    }
+
+    @Override
+    public int getCardinality() {
+      return 1;
+    }
+
+    @Override
+    public boolean hasChange() {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public ResultSet<ChangeData> read() throws OrmException {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public ResultSet<FieldBundle> readRaw() throws OrmException {
+      throw new UnsupportedOperationException("not implemented");
+    }
+
+    @Override
+    public String toString() {
+      return p.toString();
+    }
+  }
+
+  private final Schema<ChangeData> schema;
+
+  FakeChangeIndex(Schema<ChangeData> schema) {
+    this.schema = schema;
+  }
+
+  @Override
+  public void replace(ChangeData cd) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public void delete(Change.Id id) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public void deleteAll() {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public ChangeDataSource getSource(Predicate<ChangeData> p, QueryOptions opts)
+      throws QueryParseException {
+    return new FakeChangeIndex.Source(p);
+  }
+
+  @Override
+  public Schema<ChangeData> getSchema() {
+    return schema;
+  }
+
+  @Override
+  public void close() {}
+
+  @Override
+  public void markReady(boolean ready) {
+    throw new UnsupportedOperationException();
+  }
+}
diff --git a/javatests/com/google/gerrit/server/index/change/FakeQueryBuilder.java b/javatests/com/google/gerrit/server/index/change/FakeQueryBuilder.java
new file mode 100644
index 0000000..b525504
--- /dev/null
+++ b/javatests/com/google/gerrit/server/index/change/FakeQueryBuilder.java
@@ -0,0 +1,46 @@
+// Copyright (C) 2013 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.google.gerrit.server.index.change;
+
+import com.google.gerrit.index.query.OperatorPredicate;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.gerrit.server.query.change.ChangeQueryBuilder;
+import org.junit.Ignore;
+
+@Ignore
+public class FakeQueryBuilder extends ChangeQueryBuilder {
+  FakeQueryBuilder(ChangeIndexCollection indexes) {
+    super(
+        new FakeQueryBuilder.Definition<>(FakeQueryBuilder.class),
+        new ChangeQueryBuilder.Arguments(
+            null, null, null, null, null, null, null, null, null, null, null, null, null, null,
+            null, null, null, null, null, indexes, null, null, null, null, null, null, null, null));
+  }
+
+  @Operator
+  public Predicate<ChangeData> foo(String value) {
+    return predicate("foo", value);
+  }
+
+  @Operator
+  public Predicate<ChangeData> bar(String value) {
+    return predicate("bar", value);
+  }
+
+  private Predicate<ChangeData> predicate(String name, String value) {
+    return new OperatorPredicate<ChangeData>(name, value) {};
+  }
+}
diff --git a/javatests/com/google/gerrit/server/index/change/StalenessCheckerTest.java b/javatests/com/google/gerrit/server/index/change/StalenessCheckerTest.java
new file mode 100644
index 0000000..51bda66
--- /dev/null
+++ b/javatests/com/google/gerrit/server/index/change/StalenessCheckerTest.java
@@ -0,0 +1,344 @@
+// 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.
+
+package com.google.gerrit.server.index.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assert_;
+import static com.google.gerrit.server.index.change.StalenessChecker.refsAreStale;
+import static com.google.gerrit.testing.TestChanges.newChange;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.ImmutableSetMultimap;
+import com.google.common.collect.ListMultimap;
+import com.google.gerrit.index.RefState;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.index.change.StalenessChecker.RefStatePattern;
+import com.google.gerrit.server.notedb.NoteDbChangeState;
+import com.google.gerrit.testing.GerritBaseTests;
+import com.google.gerrit.testing.InMemoryRepositoryManager;
+import com.google.gwtorm.protobuf.CodecFactory;
+import com.google.gwtorm.protobuf.ProtobufCodec;
+import java.util.stream.Stream;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.junit.Before;
+import org.junit.Test;
+
+public class StalenessCheckerTest extends GerritBaseTests {
+  private static final String SHA1 = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef";
+  private static final String SHA2 = "badc0feebadc0feebadc0feebadc0feebadc0fee";
+
+  private static final Project.NameKey P1 = new Project.NameKey("project1");
+  private static final Project.NameKey P2 = new Project.NameKey("project2");
+
+  private static final Change.Id C = new Change.Id(1234);
+
+  private static final ProtobufCodec<Change> CHANGE_CODEC = CodecFactory.encoder(Change.class);
+
+  private GitRepositoryManager repoManager;
+  private Repository r1;
+  private Repository r2;
+  private TestRepository<Repository> tr1;
+  private TestRepository<Repository> tr2;
+
+  @Before
+  public void setUp() throws Exception {
+    repoManager = new InMemoryRepositoryManager();
+    r1 = repoManager.createRepository(P1);
+    tr1 = new TestRepository<>(r1);
+    r2 = repoManager.createRepository(P2);
+    tr2 = new TestRepository<>(r2);
+  }
+
+  @Test
+  public void parseStates() {
+    assertInvalidState(null);
+    assertInvalidState("");
+    assertInvalidState("project1:refs/heads/foo");
+    assertInvalidState("project1:refs/heads/foo:notasha");
+    assertInvalidState("project1:refs/heads/foo:");
+
+    assertThat(
+            RefState.parseStates(
+                byteArrays(
+                    P1 + ":refs/heads/foo:" + SHA1,
+                    P1 + ":refs/heads/bar:" + SHA2,
+                    P2 + ":refs/heads/baz:" + SHA1)))
+        .isEqualTo(
+            ImmutableSetMultimap.of(
+                P1, RefState.create("refs/heads/foo", SHA1),
+                P1, RefState.create("refs/heads/bar", SHA2),
+                P2, RefState.create("refs/heads/baz", SHA1)));
+  }
+
+  private static void assertInvalidState(String state) {
+    try {
+      RefState.parseStates(byteArrays(state));
+      assert_().fail("expected IllegalArgumentException");
+    } catch (IllegalArgumentException e) {
+      // Expected.
+    }
+  }
+
+  @Test
+  public void refStateToByteArray() {
+    assertThat(
+            new String(
+                RefState.create("refs/heads/foo", ObjectId.fromString(SHA1)).toByteArray(P1),
+                UTF_8))
+        .isEqualTo(P1 + ":refs/heads/foo:" + SHA1);
+    assertThat(
+            new String(RefState.create("refs/heads/foo", (ObjectId) null).toByteArray(P1), UTF_8))
+        .isEqualTo(P1 + ":refs/heads/foo:" + ObjectId.zeroId().name());
+  }
+
+  @Test
+  public void parsePatterns() {
+    assertInvalidPattern(null);
+    assertInvalidPattern("");
+    assertInvalidPattern("project:");
+    assertInvalidPattern("project:refs/heads/foo");
+    assertInvalidPattern("project:refs/he*ds/bar");
+    assertInvalidPattern("project:refs/(he)*ds/bar");
+    assertInvalidPattern("project:invalidrefname");
+
+    ListMultimap<Project.NameKey, RefStatePattern> r =
+        StalenessChecker.parsePatterns(
+            byteArrays(
+                P1 + ":refs/heads/*",
+                P2 + ":refs/heads/foo/*/bar",
+                P2 + ":refs/heads/foo/*-baz/*/quux"));
+
+    assertThat(r.keySet()).containsExactly(P1, P2);
+    RefStatePattern p = r.get(P1).get(0);
+    assertThat(p.pattern()).isEqualTo("refs/heads/*");
+    assertThat(p.prefix()).isEqualTo("refs/heads/");
+    assertThat(p.regex().pattern()).isEqualTo("^\\Qrefs/heads/\\E.*\\Q\\E$");
+    assertThat(p.match("refs/heads/foo")).isTrue();
+    assertThat(p.match("xrefs/heads/foo")).isFalse();
+    assertThat(p.match("refs/tags/foo")).isFalse();
+
+    p = r.get(P2).get(0);
+    assertThat(p.pattern()).isEqualTo("refs/heads/foo/*/bar");
+    assertThat(p.prefix()).isEqualTo("refs/heads/foo/");
+    assertThat(p.regex().pattern()).isEqualTo("^\\Qrefs/heads/foo/\\E.*\\Q/bar\\E$");
+    assertThat(p.match("refs/heads/foo//bar")).isTrue();
+    assertThat(p.match("refs/heads/foo/x/bar")).isTrue();
+    assertThat(p.match("refs/heads/foo/x/y/bar")).isTrue();
+    assertThat(p.match("refs/heads/foo/x/baz")).isFalse();
+
+    p = r.get(P2).get(1);
+    assertThat(p.pattern()).isEqualTo("refs/heads/foo/*-baz/*/quux");
+    assertThat(p.prefix()).isEqualTo("refs/heads/foo/");
+    assertThat(p.regex().pattern()).isEqualTo("^\\Qrefs/heads/foo/\\E.*\\Q-baz/\\E.*\\Q/quux\\E$");
+    assertThat(p.match("refs/heads/foo/-baz//quux")).isTrue();
+    assertThat(p.match("refs/heads/foo/x-baz/x/quux")).isTrue();
+    assertThat(p.match("refs/heads/foo/x/y-baz/x/y/quux")).isTrue();
+    assertThat(p.match("refs/heads/foo/x-baz/x/y")).isFalse();
+  }
+
+  @Test
+  public void refStatePatternToByteArray() {
+    assertThat(new String(RefStatePattern.create("refs/*").toByteArray(P1), UTF_8))
+        .isEqualTo(P1 + ":refs/*");
+  }
+
+  private static void assertInvalidPattern(String state) {
+    try {
+      StalenessChecker.parsePatterns(byteArrays(state));
+      assert_().fail("expected IllegalArgumentException");
+    } catch (IllegalArgumentException e) {
+      // Expected.
+    }
+  }
+
+  @Test
+  public void isStaleRefStatesOnly() throws Exception {
+    String ref1 = "refs/heads/foo";
+    ObjectId id1 = tr1.update(ref1, tr1.commit().message("commit 1"));
+    String ref2 = "refs/heads/bar";
+    ObjectId id2 = tr2.update(ref2, tr2.commit().message("commit 2"));
+
+    // Not stale.
+    assertThat(
+            refsAreStale(
+                repoManager,
+                C,
+                ImmutableSetMultimap.of(
+                    P1, RefState.create(ref1, id1.name()),
+                    P2, RefState.create(ref2, id2.name())),
+                ImmutableListMultimap.of()))
+        .isFalse();
+
+    // Wrong ref value.
+    assertThat(
+            refsAreStale(
+                repoManager,
+                C,
+                ImmutableSetMultimap.of(
+                    P1, RefState.create(ref1, SHA1),
+                    P2, RefState.create(ref2, id2.name())),
+                ImmutableListMultimap.of()))
+        .isTrue();
+
+    // Swapped repos.
+    assertThat(
+            refsAreStale(
+                repoManager,
+                C,
+                ImmutableSetMultimap.of(
+                    P1, RefState.create(ref1, id2.name()),
+                    P2, RefState.create(ref2, id1.name())),
+                ImmutableListMultimap.of()))
+        .isTrue();
+
+    // Two refs in same repo, not stale.
+    String ref3 = "refs/heads/baz";
+    ObjectId id3 = tr1.update(ref3, tr1.commit().message("commit 3"));
+    tr1.update(ref3, id3);
+    assertThat(
+            refsAreStale(
+                repoManager,
+                C,
+                ImmutableSetMultimap.of(
+                    P1, RefState.create(ref1, id1.name()),
+                    P1, RefState.create(ref3, id3.name())),
+                ImmutableListMultimap.of()))
+        .isFalse();
+
+    // Ignore ref not mentioned.
+    assertThat(
+            refsAreStale(
+                repoManager,
+                C,
+                ImmutableSetMultimap.of(P1, RefState.create(ref1, id1.name())),
+                ImmutableListMultimap.of()))
+        .isFalse();
+
+    // One ref wrong.
+    assertThat(
+            refsAreStale(
+                repoManager,
+                C,
+                ImmutableSetMultimap.of(
+                    P1, RefState.create(ref1, id1.name()),
+                    P1, RefState.create(ref3, SHA1)),
+                ImmutableListMultimap.of()))
+        .isTrue();
+  }
+
+  @Test
+  public void isStaleWithRefStatePatterns() throws Exception {
+    String ref1 = "refs/heads/foo";
+    ObjectId id1 = tr1.update(ref1, tr1.commit().message("commit 1"));
+
+    // ref1 is only ref matching pattern.
+    assertThat(
+            refsAreStale(
+                repoManager,
+                C,
+                ImmutableSetMultimap.of(P1, RefState.create(ref1, id1.name())),
+                ImmutableListMultimap.of(P1, RefStatePattern.create("refs/heads/*"))))
+        .isFalse();
+
+    // Now ref2 matches pattern, so stale unless ref2 is present in state map.
+    String ref2 = "refs/heads/bar";
+    ObjectId id2 = tr1.update(ref2, tr1.commit().message("commit 2"));
+    assertThat(
+            refsAreStale(
+                repoManager,
+                C,
+                ImmutableSetMultimap.of(P1, RefState.create(ref1, id1.name())),
+                ImmutableListMultimap.of(P1, RefStatePattern.create("refs/heads/*"))))
+        .isTrue();
+    assertThat(
+            refsAreStale(
+                repoManager,
+                C,
+                ImmutableSetMultimap.of(
+                    P1, RefState.create(ref1, id1.name()),
+                    P1, RefState.create(ref2, id2.name())),
+                ImmutableListMultimap.of(P1, RefStatePattern.create("refs/heads/*"))))
+        .isFalse();
+  }
+
+  @Test
+  public void isStaleWithNonPrefixPattern() throws Exception {
+    String ref1 = "refs/heads/foo";
+    ObjectId id1 = tr1.update(ref1, tr1.commit().message("commit 1"));
+    tr1.update("refs/heads/bar", tr1.commit().message("commit 2"));
+
+    // ref1 is only ref matching pattern.
+    assertThat(
+            refsAreStale(
+                repoManager,
+                C,
+                ImmutableSetMultimap.of(P1, RefState.create(ref1, id1.name())),
+                ImmutableListMultimap.of(P1, RefStatePattern.create("refs/*/foo"))))
+        .isFalse();
+
+    // Now ref2 matches pattern, so stale unless ref2 is present in state map.
+    String ref3 = "refs/other/foo";
+    ObjectId id3 = tr1.update(ref3, tr1.commit().message("commit 3"));
+    assertThat(
+            refsAreStale(
+                repoManager,
+                C,
+                ImmutableSetMultimap.of(P1, RefState.create(ref1, id1.name())),
+                ImmutableListMultimap.of(P1, RefStatePattern.create("refs/*/foo"))))
+        .isTrue();
+    assertThat(
+            refsAreStale(
+                repoManager,
+                C,
+                ImmutableSetMultimap.of(
+                    P1, RefState.create(ref1, id1.name()),
+                    P1, RefState.create(ref3, id3.name())),
+                ImmutableListMultimap.of(P1, RefStatePattern.create("refs/*/foo"))))
+        .isFalse();
+  }
+
+  @Test
+  public void reviewDbChangeIsStale() throws Exception {
+    Change indexChange = newChange(P1, new Account.Id(1));
+    indexChange.setNoteDbState(SHA1);
+
+    // Change is missing from ReviewDb but present in index.
+    assertThat(StalenessChecker.reviewDbChangeIsStale(indexChange, null)).isTrue();
+
+    // Change differs only in primary storage.
+    Change noteDbPrimary = clone(indexChange);
+    noteDbPrimary.setNoteDbState(NoteDbChangeState.NOTE_DB_PRIMARY_STATE);
+    assertThat(StalenessChecker.reviewDbChangeIsStale(indexChange, noteDbPrimary)).isTrue();
+
+    assertThat(StalenessChecker.reviewDbChangeIsStale(indexChange, clone(indexChange))).isFalse();
+
+    // Can't easily change row version to check true case.
+  }
+
+  private static Iterable<byte[]> byteArrays(String... strs) {
+    return Stream.of(strs).map(s -> s != null ? s.getBytes(UTF_8) : null).collect(toList());
+  }
+
+  private static Change clone(Change change) {
+    return CHANGE_CODEC.decode(CHANGE_CODEC.encodeToByteArray(change));
+  }
+}
diff --git a/javatests/com/google/gerrit/server/ioutil/BUILD b/javatests/com/google/gerrit/server/ioutil/BUILD
new file mode 100644
index 0000000..ac9530f
--- /dev/null
+++ b/javatests/com/google/gerrit/server/ioutil/BUILD
@@ -0,0 +1,17 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+junit_tests(
+    name = "ioutil_tests",
+    size = "small",
+    srcs = glob(
+        ["**/*.java"],
+    ),
+    resource_strip_prefix = "resources",
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/server/ioutil",
+        "//lib:guava",
+        "//lib/truth",
+        "//lib/truth:truth-java8-extension",
+    ],
+)
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/ioutil/BasicSerializationTest.java b/javatests/com/google/gerrit/server/ioutil/BasicSerializationTest.java
similarity index 100%
rename from gerrit-server/src/test/java/com/google/gerrit/server/ioutil/BasicSerializationTest.java
rename to javatests/com/google/gerrit/server/ioutil/BasicSerializationTest.java
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/ioutil/ColumnFormatterTest.java b/javatests/com/google/gerrit/server/ioutil/ColumnFormatterTest.java
similarity index 100%
rename from gerrit-server/src/test/java/com/google/gerrit/server/ioutil/ColumnFormatterTest.java
rename to javatests/com/google/gerrit/server/ioutil/ColumnFormatterTest.java
diff --git a/javatests/com/google/gerrit/server/ioutil/HexFormatTest.java b/javatests/com/google/gerrit/server/ioutil/HexFormatTest.java
new file mode 100644
index 0000000..9bb6951
--- /dev/null
+++ b/javatests/com/google/gerrit/server/ioutil/HexFormatTest.java
@@ -0,0 +1,29 @@
+// 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.
+
+package com.google.gerrit.server.ioutil;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class HexFormatTest {
+
+  @Test
+  public void fromInt() {
+    assertEquals("0000000f", HexFormat.fromInt(0xf));
+    assertEquals("801234ab", HexFormat.fromInt(0x801234ab));
+    assertEquals("deadbeef", HexFormat.fromInt(0xdeadbeef));
+  }
+}
diff --git a/javatests/com/google/gerrit/server/ioutil/RegexListSearcherTest.java b/javatests/com/google/gerrit/server/ioutil/RegexListSearcherTest.java
new file mode 100644
index 0000000..3043985
--- /dev/null
+++ b/javatests/com/google/gerrit/server/ioutil/RegexListSearcherTest.java
@@ -0,0 +1,65 @@
+// 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.
+
+package com.google.gerrit.server.ioutil;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth8.assertThat;
+
+import com.google.common.collect.ImmutableList;
+import java.util.List;
+import org.junit.Test;
+
+public class RegexListSearcherTest {
+  private static final ImmutableList<String> EMPTY = ImmutableList.of();
+
+  @Test
+  public void emptyList() {
+    assertSearchReturns(EMPTY, "pat", EMPTY);
+  }
+
+  @Test
+  public void anchors() {
+    List<String> list = ImmutableList.of("foo");
+    assertSearchReturns(list, "^f.*", list);
+    assertSearchReturns(list, "^f.*o$", list);
+    assertSearchReturns(list, "f.*o$", list);
+    assertSearchReturns(list, "f.*o$", list);
+    assertSearchReturns(EMPTY, "^.*\\$", list);
+  }
+
+  @Test
+  public void noCommonPrefix() {
+    List<String> list = ImmutableList.of("bar", "foo", "quux");
+    assertSearchReturns(ImmutableList.of("foo"), "f.*", list);
+    assertSearchReturns(ImmutableList.of("foo"), ".*o.*", list);
+    assertSearchReturns(ImmutableList.of("bar", "foo", "quux"), ".*[aou].*", list);
+  }
+
+  @Test
+  public void commonPrefix() {
+    List<String> list = ImmutableList.of("bar", "baz", "foo1", "foo2", "foo3", "quux");
+    assertSearchReturns(ImmutableList.of("bar", "baz"), "b.*", list);
+    assertSearchReturns(ImmutableList.of("foo1", "foo2"), "foo[12]", list);
+    assertSearchReturns(ImmutableList.of("foo1", "foo2", "foo3"), "foo.*", list);
+    assertSearchReturns(ImmutableList.of("quux"), "q.*", list);
+  }
+
+  private void assertSearchReturns(List<?> expected, String re, List<String> inputs) {
+    assertThat(inputs).isOrdered();
+    assertThat(RegexListSearcher.ofStrings(re).search(inputs))
+        .containsExactlyElementsIn(expected)
+        .inOrder();
+  }
+}
diff --git a/javatests/com/google/gerrit/server/ioutil/StringUtilTest.java b/javatests/com/google/gerrit/server/ioutil/StringUtilTest.java
new file mode 100644
index 0000000..04f806d
--- /dev/null
+++ b/javatests/com/google/gerrit/server/ioutil/StringUtilTest.java
@@ -0,0 +1,51 @@
+// Copyright (C) 2012 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.google.gerrit.server.ioutil;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class StringUtilTest {
+  /** Test the boundary condition that the first character of a string should be escaped. */
+  @Test
+  public void escapeFirstChar() {
+    assertEquals(StringUtil.escapeString("\tLeading tab"), "\\tLeading tab");
+  }
+
+  /** Test the boundary condition that the last character of a string should be escaped. */
+  @Test
+  public void escapeLastChar() {
+    assertEquals(StringUtil.escapeString("Trailing tab\t"), "Trailing tab\\t");
+  }
+
+  /** Test that various forms of input strings are escaped (or left as-is) in the expected way. */
+  @Test
+  public void escapeString() {
+    final String[] testPairs = {
+      "", "",
+      "plain string", "plain string",
+      "string with \"quotes\"", "string with \"quotes\"",
+      "string with 'quotes'", "string with 'quotes'",
+      "string with 'quotes'", "string with 'quotes'",
+      "C:\\Program Files\\MyProgram", "C:\\\\Program Files\\\\MyProgram",
+      "string\nwith\nnewlines", "string\\nwith\\nnewlines",
+      "string\twith\ttabs", "string\\twith\\ttabs",
+    };
+    for (int i = 0; i < testPairs.length; i += 2) {
+      assertEquals(StringUtil.escapeString(testPairs[i]), testPairs[i + 1]);
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/server/logging/LoggingContextAwareExecutorServiceTest.java b/javatests/com/google/gerrit/server/logging/LoggingContextAwareExecutorServiceTest.java
new file mode 100644
index 0000000..5117c01
--- /dev/null
+++ b/javatests/com/google/gerrit/server/logging/LoggingContextAwareExecutorServiceTest.java
@@ -0,0 +1,71 @@
+// 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.
+
+package com.google.gerrit.server.logging;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.truth.Expect;
+import java.util.SortedMap;
+import java.util.SortedSet;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class LoggingContextAwareExecutorServiceTest {
+  @Rule public final Expect expect = Expect.create();
+
+  @Test
+  public void loggingContextPropagationToBackgroundThread() throws Exception {
+    assertThat(LoggingContext.getInstance().getTags().isEmpty()).isTrue();
+    assertForceLogging(false);
+    try (TraceContext traceContext = TraceContext.open().forceLogging().addTag("foo", "bar")) {
+      SortedMap<String, SortedSet<Object>> tagMap = LoggingContext.getInstance().getTags().asMap();
+      assertThat(tagMap.keySet()).containsExactly("foo");
+      assertThat(tagMap.get("foo")).containsExactly("bar");
+      assertForceLogging(true);
+
+      ExecutorService executor =
+          new LoggingContextAwareExecutorService(Executors.newFixedThreadPool(1));
+      executor
+          .submit(
+              () -> {
+                // Verify that the tags and force logging flag have been propagated to the new
+                // thread.
+                SortedMap<String, SortedSet<Object>> threadTagMap =
+                    LoggingContext.getInstance().getTags().asMap();
+                expect.that(threadTagMap.keySet()).containsExactly("foo");
+                expect.that(threadTagMap.get("foo")).containsExactly("bar");
+                expect
+                    .that(LoggingContext.getInstance().shouldForceLogging(null, null, false))
+                    .isTrue();
+              })
+          .get();
+
+      // Verify that tags and force logging flag in the outer thread are still set.
+      tagMap = LoggingContext.getInstance().getTags().asMap();
+      assertThat(tagMap.keySet()).containsExactly("foo");
+      assertThat(tagMap.get("foo")).containsExactly("bar");
+      assertForceLogging(true);
+    }
+    assertThat(LoggingContext.getInstance().getTags().isEmpty()).isTrue();
+    assertForceLogging(false);
+  }
+
+  private void assertForceLogging(boolean expected) {
+    assertThat(LoggingContext.getInstance().shouldForceLogging(null, null, false))
+        .isEqualTo(expected);
+  }
+}
diff --git a/javatests/com/google/gerrit/server/logging/MutableTagsTest.java b/javatests/com/google/gerrit/server/logging/MutableTagsTest.java
new file mode 100644
index 0000000..4fadbb4
--- /dev/null
+++ b/javatests/com/google/gerrit/server/logging/MutableTagsTest.java
@@ -0,0 +1,176 @@
+// 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.
+
+package com.google.gerrit.server.logging;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assert_;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableSetMultimap;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.SortedSet;
+import org.junit.Before;
+import org.junit.Test;
+
+public class MutableTagsTest {
+  private MutableTags tags;
+
+  @Before
+  public void setup() {
+    tags = new MutableTags();
+  }
+
+  @Test
+  public void addTag() {
+    assertThat(tags.add("name", "value")).isTrue();
+    assertTags(ImmutableMap.of("name", ImmutableSet.of("value")));
+  }
+
+  @Test
+  public void addTagsWithDifferentName() {
+    assertThat(tags.add("name1", "value1")).isTrue();
+    assertThat(tags.add("name2", "value2")).isTrue();
+    assertTags(
+        ImmutableMap.of("name1", ImmutableSet.of("value1"), "name2", ImmutableSet.of("value2")));
+  }
+
+  @Test
+  public void addTagsWithSameNameButDifferentValues() {
+    assertThat(tags.add("name", "value1")).isTrue();
+    assertThat(tags.add("name", "value2")).isTrue();
+    assertTags(ImmutableMap.of("name", ImmutableSet.of("value1", "value2")));
+  }
+
+  @Test
+  public void addTagsWithSameNameAndSameValue() {
+    assertThat(tags.add("name", "value")).isTrue();
+    assertThat(tags.add("name", "value")).isFalse();
+    assertTags(ImmutableMap.of("name", ImmutableSet.of("value")));
+  }
+
+  @Test
+  public void getEmptyTags() {
+    assertThat(tags.getTags().isEmpty()).isTrue();
+    assertTags(ImmutableMap.of());
+  }
+
+  @Test
+  public void isEmpty() {
+    assertThat(tags.isEmpty()).isTrue();
+
+    tags.add("foo", "bar");
+    assertThat(tags.isEmpty()).isFalse();
+
+    tags.remove("foo", "bar");
+    assertThat(tags.isEmpty()).isTrue();
+  }
+
+  @Test
+  public void removeTags() {
+    tags.add("name1", "value1");
+    tags.add("name1", "value2");
+    tags.add("name2", "value");
+    assertTags(
+        ImmutableMap.of(
+            "name1", ImmutableSet.of("value1", "value2"), "name2", ImmutableSet.of("value")));
+
+    tags.remove("name2", "value");
+    assertTags(ImmutableMap.of("name1", ImmutableSet.of("value1", "value2")));
+
+    tags.remove("name1", "value1");
+    assertTags(ImmutableMap.of("name1", ImmutableSet.of("value2")));
+
+    tags.remove("name1", "value2");
+    assertTags(ImmutableMap.of());
+  }
+
+  @Test
+  public void removeNonExistingTag() {
+    tags.add("name", "value");
+    assertTags(ImmutableMap.of("name", ImmutableSet.of("value")));
+
+    tags.remove("foo", "bar");
+    assertTags(ImmutableMap.of("name", ImmutableSet.of("value")));
+
+    tags.remove("name", "foo");
+    assertTags(ImmutableMap.of("name", ImmutableSet.of("value")));
+  }
+
+  @Test
+  public void setTags() {
+    tags.add("name", "value");
+    assertTags(ImmutableMap.of("name", ImmutableSet.of("value")));
+
+    tags.set(ImmutableSetMultimap.of("foo", "bar", "foo", "baz", "bar", "baz"));
+    assertTags(
+        ImmutableMap.of("foo", ImmutableSet.of("bar", "baz"), "bar", ImmutableSet.of("baz")));
+  }
+
+  @Test
+  public void asMap() {
+    tags.add("name", "value");
+    assertThat(tags.asMap()).containsExactlyEntriesIn(ImmutableSetMultimap.of("name", "value"));
+
+    tags.set(ImmutableSetMultimap.of("foo", "bar", "foo", "baz", "bar", "baz"));
+    assertThat(tags.asMap())
+        .containsExactlyEntriesIn(
+            ImmutableSetMultimap.of("foo", "bar", "foo", "baz", "bar", "baz"));
+  }
+
+  @Test
+  public void clearTags() {
+    tags.add("name1", "value1");
+    tags.add("name1", "value2");
+    tags.add("name2", "value");
+    assertTags(
+        ImmutableMap.of(
+            "name1", ImmutableSet.of("value1", "value2"), "name2", ImmutableSet.of("value")));
+
+    tags.clear();
+    assertTags(ImmutableMap.of());
+  }
+
+  @Test
+  public void addInvalidTag() {
+    assertNullPointerException("tag name is required", () -> tags.add(null, "foo"));
+    assertNullPointerException("tag value is required", () -> tags.add("foo", null));
+  }
+
+  @Test
+  public void removeInvalidTag() {
+    assertNullPointerException("tag name is required", () -> tags.remove(null, "foo"));
+    assertNullPointerException("tag value is required", () -> tags.remove("foo", null));
+  }
+
+  private void assertTags(ImmutableMap<String, ImmutableSet<String>> expectedTagMap) {
+    SortedMap<String, SortedSet<Object>> actualTagMap = tags.getTags().asMap();
+    assertThat(actualTagMap.keySet()).containsExactlyElementsIn(expectedTagMap.keySet());
+    for (Map.Entry<String, ImmutableSet<String>> expectedEntry : expectedTagMap.entrySet()) {
+      assertThat(actualTagMap.get(expectedEntry.getKey()))
+          .containsExactlyElementsIn(expectedEntry.getValue());
+    }
+  }
+
+  private void assertNullPointerException(String expectedMessage, Runnable r) {
+    try {
+      r.run();
+      assert_().fail("expected NullPointerException");
+    } catch (NullPointerException e) {
+      assertThat(e.getMessage()).isEqualTo(expectedMessage);
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/server/logging/TraceContextTest.java b/javatests/com/google/gerrit/server/logging/TraceContextTest.java
new file mode 100644
index 0000000..044d237
--- /dev/null
+++ b/javatests/com/google/gerrit/server/logging/TraceContextTest.java
@@ -0,0 +1,264 @@
+// 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.
+
+package com.google.gerrit.server.logging;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.server.logging.TraceContext.TraceIdConsumer;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.SortedSet;
+import org.junit.After;
+import org.junit.Test;
+
+public class TraceContextTest {
+  @After
+  public void cleanup() {
+    LoggingContext.getInstance().clearTags();
+    LoggingContext.getInstance().forceLogging(false);
+  }
+
+  @Test
+  public void openContext() {
+    assertTags(ImmutableMap.of());
+    try (TraceContext traceContext = TraceContext.open().addTag("foo", "bar")) {
+      assertTags(ImmutableMap.of("foo", ImmutableSet.of("bar")));
+    }
+    assertTags(ImmutableMap.of());
+  }
+
+  @Test
+  public void openNestedContexts() {
+    assertTags(ImmutableMap.of());
+    try (TraceContext traceContext = TraceContext.open().addTag("foo", "bar")) {
+      assertTags(ImmutableMap.of("foo", ImmutableSet.of("bar")));
+
+      try (TraceContext traceContext2 = TraceContext.open().addTag("abc", "xyz")) {
+        assertTags(ImmutableMap.of("abc", ImmutableSet.of("xyz"), "foo", ImmutableSet.of("bar")));
+      }
+
+      assertTags(ImmutableMap.of("foo", ImmutableSet.of("bar")));
+    }
+    assertTags(ImmutableMap.of());
+  }
+
+  @Test
+  public void openNestedContextsWithSameTagName() {
+    assertTags(ImmutableMap.of());
+    try (TraceContext traceContext = TraceContext.open().addTag("foo", "bar")) {
+      assertTags(ImmutableMap.of("foo", ImmutableSet.of("bar")));
+
+      try (TraceContext traceContext2 = TraceContext.open().addTag("foo", "baz")) {
+        assertTags(ImmutableMap.of("foo", ImmutableSet.of("bar", "baz")));
+      }
+
+      assertTags(ImmutableMap.of("foo", ImmutableSet.of("bar")));
+    }
+    assertTags(ImmutableMap.of());
+  }
+
+  @Test
+  public void openNestedContextsWithSameTagNameAndValue() {
+    assertTags(ImmutableMap.of());
+    try (TraceContext traceContext = TraceContext.open().addTag("foo", "bar")) {
+      assertTags(ImmutableMap.of("foo", ImmutableSet.of("bar")));
+
+      try (TraceContext traceContext2 = TraceContext.open().addTag("foo", "bar")) {
+        assertTags(ImmutableMap.of("foo", ImmutableSet.of("bar")));
+      }
+
+      assertTags(ImmutableMap.of("foo", ImmutableSet.of("bar")));
+    }
+    assertTags(ImmutableMap.of());
+  }
+
+  @Test
+  public void openContextWithRequestId() {
+    assertTags(ImmutableMap.of());
+    try (TraceContext traceContext = TraceContext.open().addTag(RequestId.Type.RECEIVE_ID, "foo")) {
+      assertTags(ImmutableMap.of("RECEIVE_ID", ImmutableSet.of("foo")));
+    }
+    assertTags(ImmutableMap.of());
+  }
+
+  @Test
+  public void addTag() {
+    assertTags(ImmutableMap.of());
+    try (TraceContext traceContext = TraceContext.open().addTag("foo", "bar")) {
+      assertTags(ImmutableMap.of("foo", ImmutableSet.of("bar")));
+
+      traceContext.addTag("foo", "baz");
+      traceContext.addTag("bar", "baz");
+      assertTags(
+          ImmutableMap.of("foo", ImmutableSet.of("bar", "baz"), "bar", ImmutableSet.of("baz")));
+    }
+    assertTags(ImmutableMap.of());
+  }
+
+  @Test
+  public void openContextWithForceLogging() {
+    assertForceLogging(false);
+    try (TraceContext traceContext = TraceContext.open().forceLogging()) {
+      assertForceLogging(true);
+    }
+    assertForceLogging(false);
+  }
+
+  @Test
+  public void openNestedContextsWithForceLogging() {
+    assertForceLogging(false);
+    try (TraceContext traceContext = TraceContext.open().forceLogging()) {
+      assertForceLogging(true);
+
+      try (TraceContext traceContext2 = TraceContext.open()) {
+        // force logging is still enabled since outer trace context forced logging
+        assertForceLogging(true);
+
+        try (TraceContext traceContext3 = TraceContext.open().forceLogging()) {
+          assertForceLogging(true);
+        }
+
+        assertForceLogging(true);
+      }
+
+      assertForceLogging(true);
+    }
+    assertForceLogging(false);
+  }
+
+  @Test
+  public void forceLogging() {
+    assertForceLogging(false);
+    try (TraceContext traceContext = TraceContext.open()) {
+      assertForceLogging(false);
+
+      traceContext.forceLogging();
+      assertForceLogging(true);
+
+      traceContext.forceLogging();
+      assertForceLogging(true);
+    }
+    assertForceLogging(false);
+  }
+
+  @Test
+  public void newTrace() {
+    TestTraceIdConsumer traceIdConsumer = new TestTraceIdConsumer();
+    try (TraceContext traceContext = TraceContext.newTrace(true, null, traceIdConsumer)) {
+      assertForceLogging(true);
+      assertThat(LoggingContext.getInstance().getTagsAsMap().keySet())
+          .containsExactly(RequestId.Type.TRACE_ID.name());
+    }
+    assertThat(traceIdConsumer.tagName).isEqualTo(RequestId.Type.TRACE_ID.name());
+    assertThat(traceIdConsumer.traceId).isNotNull();
+  }
+
+  @Test
+  public void newTraceWithProvidedTraceId() {
+    TestTraceIdConsumer traceIdConsumer = new TestTraceIdConsumer();
+    String traceId = "foo";
+    try (TraceContext traceContext = TraceContext.newTrace(true, traceId, traceIdConsumer)) {
+      assertForceLogging(true);
+      assertTags(ImmutableMap.of(RequestId.Type.TRACE_ID.name(), ImmutableSet.of(traceId)));
+    }
+    assertThat(traceIdConsumer.tagName).isEqualTo(RequestId.Type.TRACE_ID.name());
+    assertThat(traceIdConsumer.traceId).isEqualTo(traceId);
+  }
+
+  @Test
+  public void newTraceDisabled() {
+    TestTraceIdConsumer traceIdConsumer = new TestTraceIdConsumer();
+    try (TraceContext traceContext = TraceContext.newTrace(false, null, traceIdConsumer)) {
+      assertForceLogging(false);
+      assertTags(ImmutableMap.of());
+    }
+    assertThat(traceIdConsumer.tagName).isNull();
+    assertThat(traceIdConsumer.traceId).isNull();
+  }
+
+  @Test
+  public void newTraceDisabledWithProvidedTraceId() {
+    TestTraceIdConsumer traceIdConsumer = new TestTraceIdConsumer();
+    try (TraceContext traceContext = TraceContext.newTrace(false, "foo", traceIdConsumer)) {
+      assertForceLogging(false);
+      assertTags(ImmutableMap.of());
+    }
+    assertThat(traceIdConsumer.tagName).isNull();
+    assertThat(traceIdConsumer.traceId).isNull();
+  }
+
+  @Test
+  public void onlyOneTraceId() {
+    TestTraceIdConsumer traceIdConsumer1 = new TestTraceIdConsumer();
+    try (TraceContext traceContext1 = TraceContext.newTrace(true, null, traceIdConsumer1)) {
+      String expectedTraceId = traceIdConsumer1.traceId;
+      assertThat(expectedTraceId).isNotNull();
+
+      TestTraceIdConsumer traceIdConsumer2 = new TestTraceIdConsumer();
+      try (TraceContext traceContext2 = TraceContext.newTrace(true, null, traceIdConsumer2)) {
+        assertForceLogging(true);
+        assertTags(
+            ImmutableMap.of(RequestId.Type.TRACE_ID.name(), ImmutableSet.of(expectedTraceId)));
+      }
+      assertThat(traceIdConsumer2.tagName).isEqualTo(RequestId.Type.TRACE_ID.name());
+      assertThat(traceIdConsumer2.traceId).isEqualTo(expectedTraceId);
+    }
+  }
+
+  @Test
+  public void multipleTraceIdsIfTraceIdProvided() {
+    String traceId1 = "foo";
+    try (TraceContext traceContext1 =
+        TraceContext.newTrace(true, traceId1, (tagName, traceId) -> {})) {
+      TestTraceIdConsumer traceIdConsumer = new TestTraceIdConsumer();
+      String traceId2 = "bar";
+      try (TraceContext traceContext2 = TraceContext.newTrace(true, traceId2, traceIdConsumer)) {
+        assertForceLogging(true);
+        assertTags(
+            ImmutableMap.of(RequestId.Type.TRACE_ID.name(), ImmutableSet.of(traceId1, traceId2)));
+      }
+      assertThat(traceIdConsumer.tagName).isEqualTo(RequestId.Type.TRACE_ID.name());
+      assertThat(traceIdConsumer.traceId).isEqualTo(traceId2);
+    }
+  }
+
+  private void assertTags(ImmutableMap<String, ImmutableSet<String>> expectedTagMap) {
+    SortedMap<String, SortedSet<Object>> actualTagMap =
+        LoggingContext.getInstance().getTags().asMap();
+    assertThat(actualTagMap.keySet()).containsExactlyElementsIn(expectedTagMap.keySet());
+    for (Map.Entry<String, ImmutableSet<String>> expectedEntry : expectedTagMap.entrySet()) {
+      assertThat(actualTagMap.get(expectedEntry.getKey()))
+          .containsExactlyElementsIn(expectedEntry.getValue());
+    }
+  }
+
+  private void assertForceLogging(boolean expected) {
+    assertThat(LoggingContext.getInstance().shouldForceLogging(null, null, false))
+        .isEqualTo(expected);
+  }
+
+  private static class TestTraceIdConsumer implements TraceIdConsumer {
+    String tagName;
+    String traceId;
+
+    @Override
+    public void accept(String tagName, String traceId) {
+      this.tagName = tagName;
+      this.traceId = traceId;
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/server/mail/AutoReplyMailFilterTest.java b/javatests/com/google/gerrit/server/mail/AutoReplyMailFilterTest.java
new file mode 100644
index 0000000..f8a613a
--- /dev/null
+++ b/javatests/com/google/gerrit/server/mail/AutoReplyMailFilterTest.java
@@ -0,0 +1,72 @@
+// 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.
+
+package com.google.gerrit.server.mail;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.mail.MailMessage;
+import com.google.gerrit.testing.GerritBaseTests;
+import java.time.Instant;
+import org.junit.Test;
+
+public class AutoReplyMailFilterTest extends GerritBaseTests {
+
+  private AutoReplyMailFilter autoReplyMailFilter = new AutoReplyMailFilter();
+
+  @Test
+  public void acceptsHumanReply() {
+    MailMessage.Builder b = createChangeAndReplyByEmail();
+    assertThat(autoReplyMailFilter.shouldProcessMessage(b.build())).isTrue();
+  }
+
+  @Test
+  public void discardsBulk() {
+    MailMessage.Builder b = createChangeAndReplyByEmail();
+    b.addAdditionalHeader("Precedence: bulk");
+    assertThat(autoReplyMailFilter.shouldProcessMessage(b.build())).isFalse();
+
+    b = createChangeAndReplyByEmail();
+    b.addAdditionalHeader("Precedence: list");
+    assertThat(autoReplyMailFilter.shouldProcessMessage(b.build())).isFalse();
+
+    b = createChangeAndReplyByEmail();
+    b.addAdditionalHeader("Precedence: junk");
+    assertThat(autoReplyMailFilter.shouldProcessMessage(b.build())).isFalse();
+  }
+
+  @Test
+  public void discardsAutoSubmitted() {
+    MailMessage.Builder b = createChangeAndReplyByEmail();
+    b.addAdditionalHeader("Auto-Submitted: yes");
+    assertThat(autoReplyMailFilter.shouldProcessMessage(b.build())).isFalse();
+
+    b = createChangeAndReplyByEmail();
+    b.addAdditionalHeader("Auto-Submitted: no");
+    assertThat(autoReplyMailFilter.shouldProcessMessage(b.build())).isTrue();
+  }
+
+  private MailMessage.Builder createChangeAndReplyByEmail() {
+    // Build Message
+    MailMessage.Builder b = MailMessage.builder();
+    b.id("some id");
+    b.from(new Address("admim@example.com"));
+    b.addTo(new Address("gerrit@my-company.com")); // Not evaluated
+    b.subject("");
+    b.dateReceived(Instant.now());
+    b.textContent("I am currently out of office, please leave a code review after the beep.");
+    return b;
+  }
+}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/send/CommentFormatterTest.java b/javatests/com/google/gerrit/server/mail/send/CommentFormatterTest.java
similarity index 100%
rename from gerrit-server/src/test/java/com/google/gerrit/server/mail/send/CommentFormatterTest.java
rename to javatests/com/google/gerrit/server/mail/send/CommentFormatterTest.java
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/send/CommentSenderTest.java b/javatests/com/google/gerrit/server/mail/send/CommentSenderTest.java
similarity index 100%
rename from gerrit-server/src/test/java/com/google/gerrit/server/mail/send/CommentSenderTest.java
rename to javatests/com/google/gerrit/server/mail/send/CommentSenderTest.java
diff --git a/javatests/com/google/gerrit/server/mail/send/FromAddressGeneratorProviderTest.java b/javatests/com/google/gerrit/server/mail/send/FromAddressGeneratorProviderTest.java
new file mode 100644
index 0000000..75923b4
--- /dev/null
+++ b/javatests/com/google/gerrit/server/mail/send/FromAddressGeneratorProviderTest.java
@@ -0,0 +1,388 @@
+// Copyright (C) 2009 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.google.gerrit.server.mail.send;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.easymock.EasyMock.createStrictMock;
+import static org.easymock.EasyMock.eq;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.AllUsersNameProvider;
+import com.google.gerrit.server.util.time.TimeUtil;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.junit.Before;
+import org.junit.Test;
+
+public class FromAddressGeneratorProviderTest {
+  private Config config;
+  private PersonIdent ident;
+  private AccountCache accountCache;
+
+  @Before
+  public void setUp() throws Exception {
+    config = new Config();
+    ident = new PersonIdent("NAME", "e@email", 0, 0);
+    accountCache = createStrictMock(AccountCache.class);
+  }
+
+  private FromAddressGenerator create() {
+    return new FromAddressGeneratorProvider(config, "Anonymous Coward", ident, accountCache).get();
+  }
+
+  private void setFrom(String newFrom) {
+    config.setString("sendemail", null, "from", newFrom);
+  }
+
+  private void setDomains(List<String> domains) {
+    config.setStringList("sendemail", null, "allowedDomain", domains);
+  }
+
+  @Test
+  public void defaultIsMIXED() {
+    assertThat(create()).isInstanceOf(FromAddressGeneratorProvider.PatternGen.class);
+  }
+
+  @Test
+  public void selectUSER() {
+    setFrom("USER");
+    assertThat(create()).isInstanceOf(FromAddressGeneratorProvider.UserGen.class);
+
+    setFrom("user");
+    assertThat(create()).isInstanceOf(FromAddressGeneratorProvider.UserGen.class);
+
+    setFrom("uSeR");
+    assertThat(create()).isInstanceOf(FromAddressGeneratorProvider.UserGen.class);
+  }
+
+  @Test
+  public void USER_FullyConfiguredUser() {
+    setFrom("USER");
+
+    final String name = "A U. Thor";
+    final String email = "a.u.thor@test.example.com";
+    final Account.Id user = user(name, email);
+
+    replay(accountCache);
+    final Address r = create().from(user);
+    assertThat(r).isNotNull();
+    assertThat(r.getName()).isEqualTo(name);
+    assertThat(r.getEmail()).isEqualTo(email);
+    verify(accountCache);
+  }
+
+  @Test
+  public void USER_NoFullNameUser() {
+    setFrom("USER");
+
+    final String email = "a.u.thor@test.example.com";
+    final Account.Id user = user(null, email);
+
+    replay(accountCache);
+    final Address r = create().from(user);
+    assertThat(r).isNotNull();
+    assertThat(r.getName()).isNull();
+    assertThat(r.getEmail()).isEqualTo(email);
+    verify(accountCache);
+  }
+
+  @Test
+  public void USER_NoPreferredEmailUser() {
+    setFrom("USER");
+
+    final String name = "A U. Thor";
+    final Account.Id user = user(name, null);
+
+    replay(accountCache);
+    final Address r = create().from(user);
+    assertThat(r).isNotNull();
+    assertThat(r.getName()).isEqualTo(name + " (Code Review)");
+    assertThat(r.getEmail()).isEqualTo(ident.getEmailAddress());
+    verify(accountCache);
+  }
+
+  @Test
+  public void USER_NullUser() {
+    setFrom("USER");
+    replay(accountCache);
+    final Address r = create().from(null);
+    assertThat(r).isNotNull();
+    assertThat(r.getName()).isEqualTo(ident.getName());
+    assertThat(r.getEmail()).isEqualTo(ident.getEmailAddress());
+    verify(accountCache);
+  }
+
+  @Test
+  public void USERAllowDomain() {
+    setFrom("USER");
+    setDomains(Arrays.asList("*.example.com"));
+    final String name = "A U. Thor";
+    final String email = "a.u.thor@test.example.com";
+    final Account.Id user = user(name, email);
+
+    replay(accountCache);
+    final Address r = create().from(user);
+    assertThat(r).isNotNull();
+    assertThat(r.getName()).isEqualTo(name);
+    assertThat(r.getEmail()).isEqualTo(email);
+    verify(accountCache);
+  }
+
+  @Test
+  public void USERNoAllowDomain() {
+    setFrom("USER");
+    setDomains(Arrays.asList("example.com"));
+    final String name = "A U. Thor";
+    final String email = "a.u.thor@test.com";
+    final Account.Id user = user(name, email);
+
+    replay(accountCache);
+    final Address r = create().from(user);
+    assertThat(r).isNotNull();
+    assertThat(r.getName()).isEqualTo(name + " (Code Review)");
+    assertThat(r.getEmail()).isEqualTo(ident.getEmailAddress());
+    verify(accountCache);
+  }
+
+  @Test
+  public void USERAllowDomainTwice() {
+    setFrom("USER");
+    setDomains(Arrays.asList("example.com"));
+    setDomains(Arrays.asList("test.com"));
+    final String name = "A U. Thor";
+    final String email = "a.u.thor@test.com";
+    final Account.Id user = user(name, email);
+
+    replay(accountCache);
+    final Address r = create().from(user);
+    assertThat(r).isNotNull();
+    assertThat(r.getName()).isEqualTo(name);
+    assertThat(r.getEmail()).isEqualTo(email);
+    verify(accountCache);
+  }
+
+  @Test
+  public void USERAllowDomainTwiceReverse() {
+    setFrom("USER");
+    setDomains(Arrays.asList("test.com"));
+    setDomains(Arrays.asList("example.com"));
+    final String name = "A U. Thor";
+    final String email = "a.u.thor@test.com";
+    final Account.Id user = user(name, email);
+
+    replay(accountCache);
+    final Address r = create().from(user);
+    assertThat(r).isNotNull();
+    assertThat(r.getName()).isEqualTo(name + " (Code Review)");
+    assertThat(r.getEmail()).isEqualTo(ident.getEmailAddress());
+    verify(accountCache);
+  }
+
+  @Test
+  public void USERAllowTwoDomains() {
+    setFrom("USER");
+    setDomains(Arrays.asList("example.com", "test.com"));
+    final String name = "A U. Thor";
+    final String email = "a.u.thor@test.com";
+    final Account.Id user = user(name, email);
+
+    replay(accountCache);
+    final Address r = create().from(user);
+    assertThat(r).isNotNull();
+    assertThat(r.getName()).isEqualTo(name);
+    assertThat(r.getEmail()).isEqualTo(email);
+    verify(accountCache);
+  }
+
+  @Test
+  public void selectSERVER() {
+    setFrom("SERVER");
+    assertThat(create()).isInstanceOf(FromAddressGeneratorProvider.ServerGen.class);
+
+    setFrom("server");
+    assertThat(create()).isInstanceOf(FromAddressGeneratorProvider.ServerGen.class);
+
+    setFrom("sErVeR");
+    assertThat(create()).isInstanceOf(FromAddressGeneratorProvider.ServerGen.class);
+  }
+
+  @Test
+  public void SERVER_FullyConfiguredUser() {
+    setFrom("SERVER");
+
+    final String name = "A U. Thor";
+    final String email = "a.u.thor@test.example.com";
+    final Account.Id user = userNoLookup(name, email);
+
+    replay(accountCache);
+    final Address r = create().from(user);
+    assertThat(r).isNotNull();
+    assertThat(r.getName()).isEqualTo(ident.getName());
+    assertThat(r.getEmail()).isEqualTo(ident.getEmailAddress());
+    verify(accountCache);
+  }
+
+  @Test
+  public void SERVER_NullUser() {
+    setFrom("SERVER");
+    replay(accountCache);
+    final Address r = create().from(null);
+    assertThat(r).isNotNull();
+    assertThat(r.getName()).isEqualTo(ident.getName());
+    assertThat(r.getEmail()).isEqualTo(ident.getEmailAddress());
+    verify(accountCache);
+  }
+
+  @Test
+  public void selectMIXED() {
+    setFrom("MIXED");
+    assertThat(create()).isInstanceOf(FromAddressGeneratorProvider.PatternGen.class);
+
+    setFrom("mixed");
+    assertThat(create()).isInstanceOf(FromAddressGeneratorProvider.PatternGen.class);
+
+    setFrom("mIxEd");
+    assertThat(create()).isInstanceOf(FromAddressGeneratorProvider.PatternGen.class);
+  }
+
+  @Test
+  public void MIXED_FullyConfiguredUser() {
+    setFrom("MIXED");
+
+    final String name = "A U. Thor";
+    final String email = "a.u.thor@test.example.com";
+    final Account.Id user = user(name, email);
+
+    replay(accountCache);
+    final Address r = create().from(user);
+    assertThat(r).isNotNull();
+    assertThat(r.getName()).isEqualTo(name + " (Code Review)");
+    assertThat(r.getEmail()).isEqualTo(ident.getEmailAddress());
+    verify(accountCache);
+  }
+
+  @Test
+  public void MIXED_NoFullNameUser() {
+    setFrom("MIXED");
+
+    final String email = "a.u.thor@test.example.com";
+    final Account.Id user = user(null, email);
+
+    replay(accountCache);
+    final Address r = create().from(user);
+    assertThat(r).isNotNull();
+    assertThat(r.getName()).isEqualTo("Anonymous Coward (Code Review)");
+    assertThat(r.getEmail()).isEqualTo(ident.getEmailAddress());
+    verify(accountCache);
+  }
+
+  @Test
+  public void MIXED_NoPreferredEmailUser() {
+    setFrom("MIXED");
+
+    final String name = "A U. Thor";
+    final Account.Id user = user(name, null);
+
+    replay(accountCache);
+    final Address r = create().from(user);
+    assertThat(r).isNotNull();
+    assertThat(r.getName()).isEqualTo(name + " (Code Review)");
+    assertThat(r.getEmail()).isEqualTo(ident.getEmailAddress());
+    verify(accountCache);
+  }
+
+  @Test
+  public void MIXED_NullUser() {
+    setFrom("MIXED");
+    replay(accountCache);
+    final Address r = create().from(null);
+    assertThat(r).isNotNull();
+    assertThat(r.getName()).isEqualTo(ident.getName());
+    assertThat(r.getEmail()).isEqualTo(ident.getEmailAddress());
+    verify(accountCache);
+  }
+
+  @Test
+  public void CUSTOM_FullyConfiguredUser() {
+    setFrom("A ${user} B <my.server@email.address>");
+
+    final String name = "A U. Thor";
+    final String email = "a.u.thor@test.example.com";
+    final Account.Id user = user(name, email);
+
+    replay(accountCache);
+    final Address r = create().from(user);
+    assertThat(r).isNotNull();
+    assertThat(r.getName()).isEqualTo("A " + name + " B");
+    assertThat(r.getEmail()).isEqualTo("my.server@email.address");
+    verify(accountCache);
+  }
+
+  @Test
+  public void CUSTOM_NoFullNameUser() {
+    setFrom("A ${user} B <my.server@email.address>");
+
+    final String email = "a.u.thor@test.example.com";
+    final Account.Id user = user(null, email);
+
+    replay(accountCache);
+    final Address r = create().from(user);
+    assertThat(r).isNotNull();
+    assertThat(r.getName()).isEqualTo("A Anonymous Coward B");
+    assertThat(r.getEmail()).isEqualTo("my.server@email.address");
+    verify(accountCache);
+  }
+
+  @Test
+  public void CUSTOM_NullUser() {
+    setFrom("A ${user} B <my.server@email.address>");
+
+    replay(accountCache);
+    final Address r = create().from(null);
+    assertThat(r).isNotNull();
+    assertThat(r.getName()).isEqualTo(ident.getName());
+    assertThat(r.getEmail()).isEqualTo("my.server@email.address");
+    verify(accountCache);
+  }
+
+  private Account.Id user(String name, String email) {
+    final AccountState s = makeUser(name, email);
+    expect(accountCache.get(eq(s.getAccount().getId()))).andReturn(Optional.of(s));
+    return s.getAccount().getId();
+  }
+
+  private Account.Id userNoLookup(String name, String email) {
+    final AccountState s = makeUser(name, email);
+    return s.getAccount().getId();
+  }
+
+  private AccountState makeUser(String name, String email) {
+    final Account.Id userId = new Account.Id(42);
+    final Account account = new Account(userId, TimeUtil.nowTs());
+    account.setFullName(name);
+    account.setPreferredEmail(email);
+    return AccountState.forAccount(new AllUsersName(AllUsersNameProvider.DEFAULT), account);
+  }
+}
diff --git a/javatests/com/google/gerrit/server/mail/send/NotificationEmailTest.java b/javatests/com/google/gerrit/server/mail/send/NotificationEmailTest.java
new file mode 100644
index 0000000..885f7cd
--- /dev/null
+++ b/javatests/com/google/gerrit/server/mail/send/NotificationEmailTest.java
@@ -0,0 +1,41 @@
+// 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.
+
+package com.google.gerrit.server.mail.send;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import org.junit.Test;
+
+public class NotificationEmailTest {
+
+  @Test
+  public void getInstanceAndProjectName_returnsTheRightValue() {
+    String instanceAndProjectName = NotificationEmail.getInstanceAndProjectName("test", "/my/api");
+    assertThat(instanceAndProjectName).isEqualTo("test/api");
+  }
+
+  @Test
+  public void getInstanceAndProjectName_handlesNull() {
+    String instanceAndProjectName = NotificationEmail.getInstanceAndProjectName(null, "/my/api");
+    assertThat(instanceAndProjectName).isEqualTo("...api");
+  }
+
+  @Test
+  public void getShortProjectName() {
+    assertThat(NotificationEmail.getShortProjectName("/api")).isEqualTo("api");
+    assertThat(NotificationEmail.getShortProjectName("/my/api")).isEqualTo("...api");
+    assertThat(NotificationEmail.getShortProjectName("/my/sub/project")).isEqualTo("...project");
+  }
+}
diff --git a/javatests/com/google/gerrit/server/notedb/AbstractChangeNotesTest.java b/javatests/com/google/gerrit/server/notedb/AbstractChangeNotesTest.java
new file mode 100644
index 0000000..d00f96b
--- /dev/null
+++ b/javatests/com/google/gerrit/server/notedb/AbstractChangeNotesTest.java
@@ -0,0 +1,287 @@
+// Copyright (C) 2014 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.google.gerrit.server.notedb;
+
+import static com.google.inject.Scopes.SINGLETON;
+import static java.util.concurrent.TimeUnit.SECONDS;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.common.data.SubmitRecord;
+import com.google.gerrit.extensions.config.FactoryModule;
+import com.google.gerrit.metrics.DisabledMetricMaker;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.CommentRange;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.InternalUser;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.FakeRealm;
+import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.account.Realm;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.AllUsersNameProvider;
+import com.google.gerrit.server.config.AnonymousCowardName;
+import com.google.gerrit.server.config.AnonymousCowardNameProvider;
+import com.google.gerrit.server.config.CanonicalWebUrl;
+import com.google.gerrit.server.config.DefaultUrlFormatter;
+import com.google.gerrit.server.config.DisableReverseDnsLookup;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.GerritServerId;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitModule;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.gerrit.testing.FakeAccountCache;
+import com.google.gerrit.testing.GerritBaseTests;
+import com.google.gerrit.testing.InMemoryRepositoryManager;
+import com.google.gerrit.testing.TestChanges;
+import com.google.gerrit.testing.TestTimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.Guice;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.TypeLiteral;
+import com.google.inject.util.Providers;
+import java.sql.Timestamp;
+import java.util.TimeZone;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.runner.RunWith;
+
+@Ignore
+@RunWith(ConfigSuite.class)
+public abstract class AbstractChangeNotesTest extends GerritBaseTests {
+  private static final TimeZone TZ = TimeZone.getTimeZone("America/Los_Angeles");
+
+  @ConfigSuite.Parameter public Config testConfig;
+
+  protected Account.Id otherUserId;
+  protected FakeAccountCache accountCache;
+  protected IdentifiedUser changeOwner;
+  protected IdentifiedUser otherUser;
+  protected InMemoryRepository repo;
+  protected InMemoryRepositoryManager repoManager;
+  protected PersonIdent serverIdent;
+  protected InternalUser internalUser;
+  protected Project.NameKey project;
+  protected RevWalk rw;
+  protected TestRepository<InMemoryRepository> tr;
+
+  @Inject protected IdentifiedUser.GenericFactory userFactory;
+
+  @Inject protected NoteDbUpdateManager.Factory updateManagerFactory;
+
+  @Inject protected AllUsersName allUsers;
+
+  @Inject protected AbstractChangeNotes.Args args;
+
+  @Inject @GerritServerId private String serverId;
+
+  protected Injector injector;
+  private String systemTimeZone;
+
+  @Before
+  public void setUpTestEnvironment() throws Exception {
+    setTimeForTesting();
+
+    serverIdent = new PersonIdent("Gerrit Server", "noreply@gerrit.com", TimeUtil.nowTs(), TZ);
+    project = new Project.NameKey("test-project");
+    repoManager = new InMemoryRepositoryManager();
+    repo = repoManager.createRepository(project);
+    tr = new TestRepository<>(repo);
+    rw = tr.getRevWalk();
+    accountCache = new FakeAccountCache();
+    Account co = new Account(new Account.Id(1), TimeUtil.nowTs());
+    co.setFullName("Change Owner");
+    co.setPreferredEmail("change@owner.com");
+    accountCache.put(co);
+    Account ou = new Account(new Account.Id(2), TimeUtil.nowTs());
+    ou.setFullName("Other Account");
+    ou.setPreferredEmail("other@account.com");
+    accountCache.put(ou);
+
+    injector =
+        Guice.createInjector(
+            new FactoryModule() {
+              @Override
+              public void configure() {
+                install(new GitModule());
+
+                install(new DefaultUrlFormatter.Module());
+                install(NoteDbModule.forTest(testConfig));
+                bind(AllUsersName.class).toProvider(AllUsersNameProvider.class);
+                bind(String.class).annotatedWith(GerritServerId.class).toInstance("gerrit");
+                bind(GitRepositoryManager.class).toInstance(repoManager);
+                bind(ProjectCache.class).toProvider(Providers.<ProjectCache>of(null));
+                bind(Config.class).annotatedWith(GerritServerConfig.class).toInstance(testConfig);
+                bind(String.class)
+                    .annotatedWith(AnonymousCowardName.class)
+                    .toProvider(AnonymousCowardNameProvider.class);
+                bind(String.class)
+                    .annotatedWith(CanonicalWebUrl.class)
+                    .toInstance("http://localhost:8080/");
+                bind(Boolean.class)
+                    .annotatedWith(DisableReverseDnsLookup.class)
+                    .toInstance(Boolean.FALSE);
+                bind(Realm.class).to(FakeRealm.class);
+                bind(GroupBackend.class).to(SystemGroupBackend.class).in(SINGLETON);
+                bind(AccountCache.class).toInstance(accountCache);
+                bind(PersonIdent.class)
+                    .annotatedWith(GerritPersonIdent.class)
+                    .toInstance(serverIdent);
+                bind(GitReferenceUpdated.class).toInstance(GitReferenceUpdated.DISABLED);
+                bind(MetricMaker.class).to(DisabledMetricMaker.class);
+                bind(ReviewDb.class).toProvider(Providers.<ReviewDb>of(null));
+                MutableNotesMigration migration = MutableNotesMigration.newDisabled();
+                migration.setFrom(NotesMigrationState.FINAL);
+                bind(MutableNotesMigration.class).toInstance(migration);
+                bind(NotesMigration.class).to(MutableNotesMigration.class);
+
+                // Tests don't support ReviewDb at all, but bindings are required via NoteDbModule.
+                bind(new TypeLiteral<SchemaFactory<ReviewDb>>() {})
+                    .toInstance(
+                        () -> {
+                          throw new UnsupportedOperationException();
+                        });
+                bind(ChangeBundleReader.class)
+                    .toInstance(
+                        (db, id) -> {
+                          throw new UnsupportedOperationException();
+                        });
+              }
+            });
+
+    injector.injectMembers(this);
+    repoManager.createRepository(allUsers);
+    changeOwner = userFactory.create(co.getId());
+    otherUser = userFactory.create(ou.getId());
+    otherUserId = otherUser.getAccountId();
+    internalUser = new InternalUser();
+  }
+
+  private void setTimeForTesting() {
+    systemTimeZone = System.setProperty("user.timezone", "US/Eastern");
+    TestTimeUtil.resetWithClockStep(1, SECONDS);
+  }
+
+  @After
+  public void resetTime() {
+    TestTimeUtil.useSystemTime();
+    System.setProperty("user.timezone", systemTimeZone);
+  }
+
+  protected Change newChange(boolean workInProgress) throws Exception {
+    Change c = TestChanges.newChange(project, changeOwner.getAccountId());
+    ChangeUpdate u = newUpdate(c, changeOwner);
+    u.setChangeId(c.getKey().get());
+    u.setBranch(c.getDest().get());
+    u.setWorkInProgress(workInProgress);
+    u.commit();
+    return c;
+  }
+
+  protected Change newWorkInProgressChange() throws Exception {
+    return newChange(true);
+  }
+
+  protected Change newChange() throws Exception {
+    return newChange(false);
+  }
+
+  protected ChangeUpdate newUpdate(Change c, CurrentUser user) throws Exception {
+    ChangeUpdate update = TestChanges.newUpdate(injector, c, user);
+    update.setPatchSetId(c.currentPatchSetId());
+    update.setAllowWriteToNewRef(true);
+    return update;
+  }
+
+  protected ChangeNotes newNotes(Change c) throws OrmException {
+    return new ChangeNotes(args, c).load();
+  }
+
+  protected static SubmitRecord submitRecord(
+      String status, String errorMessage, SubmitRecord.Label... labels) {
+    SubmitRecord rec = new SubmitRecord();
+    rec.status = SubmitRecord.Status.valueOf(status);
+    rec.errorMessage = errorMessage;
+    if (labels.length > 0) {
+      rec.labels = ImmutableList.copyOf(labels);
+    }
+    return rec;
+  }
+
+  protected static SubmitRecord.Label submitLabel(
+      String name, String status, Account.Id appliedBy) {
+    SubmitRecord.Label label = new SubmitRecord.Label();
+    label.label = name;
+    label.status = SubmitRecord.Label.Status.valueOf(status);
+    label.appliedBy = appliedBy;
+    return label;
+  }
+
+  protected Comment newComment(
+      PatchSet.Id psId,
+      String filename,
+      String UUID,
+      CommentRange range,
+      int line,
+      IdentifiedUser commenter,
+      String parentUUID,
+      Timestamp t,
+      String message,
+      short side,
+      String commitSHA1,
+      boolean unresolved) {
+    Comment c =
+        new Comment(
+            new Comment.Key(UUID, filename, psId.get()),
+            commenter.getAccountId(),
+            t,
+            side,
+            message,
+            serverId,
+            unresolved);
+    c.lineNbr = line;
+    c.parentUuid = parentUUID;
+    c.revId = commitSHA1;
+    c.setRange(range);
+    return c;
+  }
+
+  protected static Timestamp truncate(Timestamp ts) {
+    return new Timestamp((ts.getTime() / 1000) * 1000);
+  }
+
+  protected static Timestamp after(Change c, long millis) {
+    return new Timestamp(c.getCreatedOn().getTime() + millis);
+  }
+}
diff --git a/javatests/com/google/gerrit/server/notedb/ChangeBundleTest.java b/javatests/com/google/gerrit/server/notedb/ChangeBundleTest.java
new file mode 100644
index 0000000..fc2a272
--- /dev/null
+++ b/javatests/com/google/gerrit/server/notedb/ChangeBundleTest.java
@@ -0,0 +1,1976 @@
+// 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.
+
+package com.google.gerrit.server.notedb;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.server.notedb.ChangeBundle.Source.NOTE_DB;
+import static com.google.gerrit.server.notedb.ChangeBundle.Source.REVIEW_DB;
+import static com.google.gerrit.server.notedb.ReviewerStateInternal.CC;
+import static com.google.gerrit.server.notedb.ReviewerStateInternal.REVIEWER;
+import static com.google.gerrit.server.util.time.TimeUtil.truncateToSecond;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.SECONDS;
+
+import com.google.common.collect.HashBasedTable;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Table;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.LabelId;
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.reviewdb.client.PatchLineComment;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RevId;
+import com.google.gerrit.server.ReviewerSet;
+import com.google.gerrit.server.notedb.rebuild.ChangeRebuilderImpl;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.testing.GerritBaseTests;
+import com.google.gerrit.testing.TestChanges;
+import com.google.gerrit.testing.TestTimeUtil;
+import com.google.gwtorm.protobuf.CodecFactory;
+import com.google.gwtorm.protobuf.ProtobufCodec;
+import java.sql.Timestamp;
+import java.time.LocalDate;
+import java.time.Month;
+import java.time.ZoneId;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.TimeZone;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ChangeBundleTest extends GerritBaseTests {
+  private static final ProtobufCodec<Change> CHANGE_CODEC = CodecFactory.encoder(Change.class);
+  private static final ProtobufCodec<ChangeMessage> CHANGE_MESSAGE_CODEC =
+      CodecFactory.encoder(ChangeMessage.class);
+  private static final ProtobufCodec<PatchSet> PATCH_SET_CODEC =
+      CodecFactory.encoder(PatchSet.class);
+  private static final ProtobufCodec<PatchSetApproval> PATCH_SET_APPROVAL_CODEC =
+      CodecFactory.encoder(PatchSetApproval.class);
+  private static final ProtobufCodec<PatchLineComment> PATCH_LINE_COMMENT_CODEC =
+      CodecFactory.encoder(PatchLineComment.class);
+  private static final String TIMEZONE_ID = "US/Eastern";
+
+  private String systemTimeZoneProperty;
+  private TimeZone systemTimeZone;
+
+  private Project.NameKey project;
+  private Account.Id accountId;
+
+  @Before
+  public void setUp() {
+    systemTimeZoneProperty = System.setProperty("user.timezone", TIMEZONE_ID);
+    systemTimeZone = TimeZone.getDefault();
+    TimeZone.setDefault(TimeZone.getTimeZone(TIMEZONE_ID));
+    long maxMs = ChangeRebuilderImpl.MAX_WINDOW_MS;
+    assertThat(maxMs).isGreaterThan(1000L);
+    TestTimeUtil.resetWithClockStep(maxMs * 2, MILLISECONDS);
+    project = new Project.NameKey("project");
+    accountId = new Account.Id(100);
+  }
+
+  @After
+  public void tearDown() {
+    TestTimeUtil.useSystemTime();
+    System.setProperty("user.timezone", systemTimeZoneProperty);
+    TimeZone.setDefault(systemTimeZone);
+  }
+
+  private void superWindowResolution() {
+    TestTimeUtil.setClockStep(ChangeRebuilderImpl.MAX_WINDOW_MS * 2, MILLISECONDS);
+    TimeUtil.nowTs();
+  }
+
+  private void subWindowResolution() {
+    TestTimeUtil.setClockStep(1, SECONDS);
+    TimeUtil.nowTs();
+  }
+
+  @Test
+  public void diffChangesDifferentIds() throws Exception {
+    Change c1 = TestChanges.newChange(project, accountId);
+    int id1 = c1.getId().get();
+    Change c2 = TestChanges.newChange(project, accountId);
+    int id2 = c2.getId().get();
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+
+    assertDiffs(
+        b1,
+        b2,
+        "changeId differs for Changes: {" + id1 + "} != {" + id2 + "}",
+        "createdOn differs for Changes: {2009-09-30 17:00:00.0} != {2009-09-30 17:00:06.0}",
+        "effective last updated time differs for Changes:"
+            + " {2009-09-30 17:00:00.0} != {2009-09-30 17:00:06.0}");
+  }
+
+  @Test
+  public void diffChangesSameId() throws Exception {
+    Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100));
+    Change c2 = clone(c1);
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+
+    assertNoDiffs(b1, b2);
+
+    c2.setTopic("topic");
+    assertDiffs(b1, b2, "topic differs for Change.Id " + c1.getId() + ": {null} != {topic}");
+  }
+
+  @Test
+  public void diffChangesMixedSourcesAllowsSlop() throws Exception {
+    subWindowResolution();
+    Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100));
+    Change c2 = clone(c1);
+    c2.setCreatedOn(TimeUtil.nowTs());
+    c2.setLastUpdatedOn(TimeUtil.nowTs());
+
+    // Both are ReviewDb, exact timestamp match is required.
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    assertDiffs(
+        b1,
+        b2,
+        "createdOn differs for Change.Id "
+            + c1.getId()
+            + ":"
+            + " {2009-09-30 17:00:01.0} != {2009-09-30 17:00:02.0}",
+        "effective last updated time differs for Change.Id "
+            + c1.getId()
+            + ":"
+            + " {2009-09-30 17:00:01.0} != {2009-09-30 17:00:03.0}");
+
+    // One NoteDb, slop is allowed.
+    b1 =
+        new ChangeBundle(
+            c1, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
+    b2 =
+        new ChangeBundle(
+            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    assertNoDiffs(b1, b2);
+    assertNoDiffs(b2, b1);
+
+    // But not too much slop.
+    superWindowResolution();
+    Change c3 = clone(c1);
+    c3.setLastUpdatedOn(TimeUtil.nowTs());
+    b1 =
+        new ChangeBundle(
+            c1, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
+    ChangeBundle b3 =
+        new ChangeBundle(
+            c3, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    String msg =
+        "effective last updated time differs for Change.Id "
+            + c1.getId()
+            + " in NoteDb vs. ReviewDb:"
+            + " {2009-09-30 17:00:01.0} != {2009-09-30 17:00:10.0}";
+    assertDiffs(b1, b3, msg);
+    assertDiffs(b3, b1, msg);
+  }
+
+  @Test
+  public void diffChangesIgnoresOriginalSubjectInReviewDb() throws Exception {
+    Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100));
+    c1.setCurrentPatchSet(c1.currentPatchSetId(), "Subject", "Original A");
+    Change c2 = clone(c1);
+    c2.setCurrentPatchSet(c2.currentPatchSetId(), c1.getSubject(), "Original B");
+
+    // Both ReviewDb, exact match required.
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    assertDiffs(
+        b1,
+        b2,
+        "originalSubject differs for Change.Id "
+            + c1.getId()
+            + ":"
+            + " {Original A} != {Original B}");
+
+    // Both NoteDb, exact match required.
+    b1 =
+        new ChangeBundle(
+            c1, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
+    b2 =
+        new ChangeBundle(
+            c2, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
+    assertDiffs(
+        b1,
+        b2,
+        "originalSubject differs for Change.Id "
+            + c1.getId()
+            + ":"
+            + " {Original A} != {Original B}");
+
+    // One ReviewDb, one NoteDb, original subject is ignored.
+    b1 =
+        new ChangeBundle(
+            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    b2 =
+        new ChangeBundle(
+            c2, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
+    assertNoDiffs(b1, b2);
+    assertNoDiffs(b2, b1);
+  }
+
+  @Test
+  public void diffChangesSanitizesSubjectsBeforeComparison() throws Exception {
+    Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100));
+    c1.setCurrentPatchSet(c1.currentPatchSetId(), "Subject\r\rbody", "Original");
+    Change c2 = clone(c1);
+    c2.setCurrentPatchSet(c2.currentPatchSetId(), "Subject  body", "Original");
+
+    // Both ReviewDb, exact match required
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    assertDiffs(
+        b1,
+        b2,
+        "subject differs for Change.Id "
+            + c1.getId()
+            + ":"
+            + " {Subject\r\rbody} != {Subject  body}");
+
+    // Both NoteDb, exact match required (although it should be impossible to
+    // create a NoteDb change with '\r' in the subject).
+    b1 =
+        new ChangeBundle(
+            c1, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
+    b2 =
+        new ChangeBundle(
+            c2, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
+    assertDiffs(
+        b1,
+        b2,
+        "subject differs for Change.Id "
+            + c1.getId()
+            + ":"
+            + " {Subject\r\rbody} != {Subject  body}");
+
+    // One ReviewDb, one NoteDb, '\r' is normalized to ' '.
+    b1 =
+        new ChangeBundle(
+            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    b2 =
+        new ChangeBundle(
+            c2, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
+    assertNoDiffs(b1, b2);
+    assertNoDiffs(b2, b1);
+  }
+
+  @Test
+  public void diffChangesConsidersEmptyReviewDbTopicEquivalentToNullInNoteDb() throws Exception {
+    Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100));
+    c1.setTopic("");
+    Change c2 = clone(c1);
+    c2.setTopic(null);
+
+    // Both ReviewDb, exact match required.
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    assertDiffs(b1, b2, "topic differs for Change.Id " + c1.getId() + ": {} != {null}");
+
+    // Topic ignored if ReviewDb is empty and NoteDb is null.
+    b1 =
+        new ChangeBundle(
+            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    b2 =
+        new ChangeBundle(
+            c2, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
+    assertNoDiffs(b1, b2);
+
+    // Exact match still required if NoteDb has empty value (not realistic).
+    b1 =
+        new ChangeBundle(
+            c1, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
+    b2 =
+        new ChangeBundle(
+            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    assertDiffs(b1, b2, "topic differs for Change.Id " + c1.getId() + ": {} != {null}");
+
+    // Null is not equal to a non-empty string.
+    Change c3 = clone(c1);
+    c3.setTopic("topic");
+    b1 =
+        new ChangeBundle(
+            c3, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    b2 =
+        new ChangeBundle(
+            c2, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
+    assertDiffs(b1, b2, "topic differs for Change.Id " + c1.getId() + ": {topic} != {null}");
+
+    // Null is equal to a string that is all whitespace.
+    Change c4 = clone(c1);
+    c4.setTopic("  ");
+    b1 =
+        new ChangeBundle(
+            c4, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    b2 =
+        new ChangeBundle(
+            c2, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
+    assertNoDiffs(b1, b2);
+    assertNoDiffs(b2, b1);
+  }
+
+  @Test
+  public void diffChangesIgnoresLeadingAndTrailingWhitespaceInReviewDbTopics() throws Exception {
+    Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100));
+    c1.setTopic(" abc ");
+    Change c2 = clone(c1);
+    c2.setTopic("abc");
+
+    // Both ReviewDb, exact match required.
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    assertDiffs(b1, b2, "topic differs for Change.Id " + c1.getId() + ": { abc } != {abc}");
+
+    // Leading whitespace in ReviewDb topic is ignored.
+    b1 =
+        new ChangeBundle(
+            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    b2 =
+        new ChangeBundle(
+            c2, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
+    assertNoDiffs(b1, b2);
+    assertNoDiffs(b2, b1);
+
+    // Must match except for the leading/trailing whitespace.
+    Change c3 = clone(c1);
+    c3.setTopic("cba");
+    b1 =
+        new ChangeBundle(
+            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    b2 =
+        new ChangeBundle(
+            c3, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
+    assertDiffs(b1, b2, "topic differs for Change.Id " + c1.getId() + ": { abc } != {cba}");
+  }
+
+  @Test
+  public void diffChangesTakesMaxEntityTimestampFromReviewDb() throws Exception {
+    Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100));
+    PatchSet ps = new PatchSet(c1.currentPatchSetId());
+    ps.setRevision(new RevId("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
+    ps.setUploader(accountId);
+    ps.setCreatedOn(TimeUtil.nowTs());
+    PatchSetApproval a =
+        new PatchSetApproval(
+            new PatchSetApproval.Key(c1.currentPatchSetId(), accountId, new LabelId("Code-Review")),
+            (short) 1,
+            TimeUtil.nowTs());
+
+    Change c2 = clone(c1);
+    c2.setLastUpdatedOn(a.getGranted());
+
+    // Both ReviewDb, exact match required.
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c1, messages(), patchSets(ps), approvals(a), comments(), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c2, messages(), patchSets(ps), approvals(a), comments(), reviewers(), REVIEW_DB);
+    assertDiffs(
+        b1,
+        b2,
+        "effective last updated time differs for Change.Id "
+            + c1.getId()
+            + ":"
+            + " {2009-09-30 17:00:00.0} != {2009-09-30 17:00:12.0}");
+
+    // NoteDb allows latest timestamp from all entities in bundle.
+    b2 =
+        new ChangeBundle(
+            c2, messages(), patchSets(ps), approvals(a), comments(), reviewers(), NOTE_DB);
+    assertNoDiffs(b1, b2);
+  }
+
+  @Test
+  public void diffChangesIgnoresChangeTimestampIfAnyOtherEntitiesExist() {
+    Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100));
+    PatchSet ps = new PatchSet(c1.currentPatchSetId());
+    ps.setRevision(new RevId("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
+    ps.setUploader(accountId);
+    ps.setCreatedOn(TimeUtil.nowTs());
+    PatchSetApproval a =
+        new PatchSetApproval(
+            new PatchSetApproval.Key(c1.currentPatchSetId(), accountId, new LabelId("Code-Review")),
+            (short) 1,
+            TimeUtil.nowTs());
+    c1.setLastUpdatedOn(a.getGranted());
+
+    Change c2 = clone(c1);
+    c2.setLastUpdatedOn(TimeUtil.nowTs());
+
+    // ReviewDb has later lastUpdatedOn timestamp than NoteDb, allowed since
+    // NoteDb matches the latest timestamp of a non-Change entity.
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c2, messages(), patchSets(ps), approvals(a), comments(), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c1, messages(), patchSets(ps), approvals(a), comments(), reviewers(), NOTE_DB);
+    assertThat(b1.getChange().getLastUpdatedOn()).isGreaterThan(b2.getChange().getLastUpdatedOn());
+    assertNoDiffs(b1, b2);
+
+    // Timestamps must actually match if Change is the only entity.
+    b1 =
+        new ChangeBundle(
+            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    b2 =
+        new ChangeBundle(
+            c1, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
+    assertDiffs(
+        b1,
+        b2,
+        "effective last updated time differs for Change.Id "
+            + c1.getId()
+            + " in NoteDb vs. ReviewDb:"
+            + " {2009-09-30 17:00:12.0} != {2009-09-30 17:00:18.0}");
+  }
+
+  @Test
+  public void diffChangesAllowsReviewDbSubjectToBePrefixOfNoteDbSubject() throws Exception {
+    Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100));
+    Change c2 = clone(c1);
+    c2.setCurrentPatchSet(
+        c1.currentPatchSetId(), c1.getSubject().substring(0, 10), c1.getOriginalSubject());
+    assertThat(c2.getSubject()).isNotEqualTo(c1.getSubject());
+
+    // Both ReviewDb, exact match required.
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    assertDiffs(
+        b1,
+        b2,
+        "subject differs for Change.Id " + c1.getId() + ": {Change subject} != {Change sub}");
+
+    // ReviewDb has shorter subject, allowed.
+    b1 =
+        new ChangeBundle(
+            c1, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
+    b2 =
+        new ChangeBundle(
+            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    assertNoDiffs(b1, b2);
+
+    // NoteDb has shorter subject, not allowed.
+    b1 =
+        new ChangeBundle(
+            c1, messages(), latest(c1), approvals(), comments(), reviewers(), REVIEW_DB);
+    b2 =
+        new ChangeBundle(c2, messages(), latest(c2), approvals(), comments(), reviewers(), NOTE_DB);
+    assertDiffs(
+        b1,
+        b2,
+        "subject differs for Change.Id " + c1.getId() + ": {Change subject} != {Change sub}");
+  }
+
+  @Test
+  public void diffChangesTrimsLeadingSpacesFromReviewDbComparingToNoteDb() throws Exception {
+    Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100));
+    Change c2 = clone(c1);
+    c2.setCurrentPatchSet(c1.currentPatchSetId(), "   " + c1.getSubject(), c1.getOriginalSubject());
+
+    // Both ReviewDb, exact match required.
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    assertDiffs(
+        b1,
+        b2,
+        "subject differs for Change.Id "
+            + c1.getId()
+            + ":"
+            + " {Change subject} != {   Change subject}");
+
+    // ReviewDb is missing leading spaces, allowed.
+    b1 =
+        new ChangeBundle(
+            c1, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
+    b2 =
+        new ChangeBundle(
+            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    assertNoDiffs(b1, b2);
+    assertNoDiffs(b2, b1);
+  }
+
+  @Test
+  public void diffChangesDoesntTrimLeadingNonSpaceWhitespaceFromSubject() throws Exception {
+    Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100));
+    Change c2 = clone(c1);
+    c2.setCurrentPatchSet(c1.currentPatchSetId(), "\t" + c1.getSubject(), c1.getOriginalSubject());
+
+    // Both ReviewDb.
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    assertDiffs(
+        b1,
+        b2,
+        "subject differs for Change.Id "
+            + c1.getId()
+            + ":"
+            + " {Change subject} != {\tChange subject}");
+
+    // One NoteDb.
+    b1 =
+        new ChangeBundle(c1, messages(), latest(c1), approvals(), comments(), reviewers(), NOTE_DB);
+    b2 =
+        new ChangeBundle(
+            c2, messages(), latest(c2), approvals(), comments(), reviewers(), REVIEW_DB);
+    assertDiffs(
+        b1,
+        b2,
+        "subject differs for Change.Id "
+            + c1.getId()
+            + ":"
+            + " {Change subject} != {\tChange subject}");
+    assertDiffs(
+        b2,
+        b1,
+        "subject differs for Change.Id "
+            + c1.getId()
+            + ":"
+            + " {\tChange subject} != {Change subject}");
+  }
+
+  @Test
+  public void diffChangesHandlesBuggyJGitSubjectExtraction() throws Exception {
+    Change c1 = TestChanges.newChange(project, accountId);
+    String buggySubject = "Subject\r \r Rest of message.";
+    c1.setCurrentPatchSet(c1.currentPatchSetId(), buggySubject, buggySubject);
+    Change c2 = clone(c1);
+    c2.setCurrentPatchSet(c2.currentPatchSetId(), "Subject", "Subject");
+
+    // Both ReviewDb.
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    assertDiffs(
+        b1,
+        b2,
+        "originalSubject differs for Change.Id "
+            + c1.getId()
+            + ":"
+            + " {Subject\r \r Rest of message.} != {Subject}",
+        "subject differs for Change.Id "
+            + c1.getId()
+            + ":"
+            + " {Subject\r \r Rest of message.} != {Subject}");
+
+    // NoteDb has correct subject without "\r ".
+    b1 =
+        new ChangeBundle(
+            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    b2 =
+        new ChangeBundle(
+            c2, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
+    assertNoDiffs(b1, b2);
+    assertNoDiffs(b2, b1);
+  }
+
+  @Test
+  public void diffChangesIgnoresInvalidCurrentPatchSetIdInReviewDb() throws Exception {
+    Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100));
+    Change c2 = clone(c1);
+    c2.setCurrentPatchSet(
+        new PatchSet.Id(c2.getId(), 0), "Unrelated subject", c2.getOriginalSubject());
+
+    // Both ReviewDb.
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    assertDiffs(
+        b1,
+        b2,
+        "currentPatchSetId differs for Change.Id " + c1.getId() + ": {1} != {0}",
+        "subject differs for Change.Id "
+            + c1.getId()
+            + ":"
+            + " {Change subject} != {Unrelated subject}");
+
+    // One NoteDb.
+    //
+    // This is based on a real corrupt change where all patch sets were deleted
+    // but the Change entity stuck around, resulting in a currentPatchSetId of 0
+    // after converting to NoteDb.
+    b1 =
+        new ChangeBundle(
+            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    b2 =
+        new ChangeBundle(
+            c2, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
+    assertNoDiffs(b1, b2);
+    assertNoDiffs(b2, b1);
+  }
+
+  @Test
+  public void diffChangesAllowsCreatedToMatchLastUpdated() throws Exception {
+    Change c1 = TestChanges.newChange(new Project.NameKey("project"), new Account.Id(100));
+    c1.setCreatedOn(TimeUtil.nowTs());
+    assertThat(c1.getCreatedOn()).isGreaterThan(c1.getLastUpdatedOn());
+    Change c2 = clone(c1);
+    c2.setCreatedOn(c2.getLastUpdatedOn());
+
+    // Both ReviewDb.
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c2, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    assertDiffs(
+        b1,
+        b2,
+        "createdOn differs for Change.Id "
+            + c1.getId()
+            + ": {2009-09-30 17:00:06.0} != {2009-09-30 17:00:00.0}");
+
+    // One NoteDb.
+    b1 =
+        new ChangeBundle(
+            c1, messages(), patchSets(), approvals(), comments(), reviewers(), REVIEW_DB);
+    b2 =
+        new ChangeBundle(
+            c2, messages(), patchSets(), approvals(), comments(), reviewers(), NOTE_DB);
+    assertNoDiffs(b1, b2);
+    assertNoDiffs(b2, b1);
+  }
+
+  @Test
+  public void diffChangeMessageKeySets() throws Exception {
+    Change c = TestChanges.newChange(project, accountId);
+    int id = c.getId().get();
+    ChangeMessage cm1 =
+        new ChangeMessage(
+            new ChangeMessage.Key(c.getId(), "uuid1"),
+            accountId,
+            TimeUtil.nowTs(),
+            c.currentPatchSetId());
+    ChangeMessage cm2 =
+        new ChangeMessage(
+            new ChangeMessage.Key(c.getId(), "uuid2"),
+            accountId,
+            TimeUtil.nowTs(),
+            c.currentPatchSetId());
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c, messages(cm1), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c, messages(cm2), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
+
+    assertDiffs(
+        b1,
+        b2,
+        "ChangeMessage.Key sets differ:"
+            + " ["
+            + id
+            + ",uuid1] only in A; ["
+            + id
+            + ",uuid2] only in B");
+  }
+
+  @Test
+  public void diffChangeMessages() throws Exception {
+    Change c = TestChanges.newChange(project, accountId);
+    ChangeMessage cm1 =
+        new ChangeMessage(
+            new ChangeMessage.Key(c.getId(), "uuid"),
+            accountId,
+            TimeUtil.nowTs(),
+            c.currentPatchSetId());
+    cm1.setMessage("message 1");
+    ChangeMessage cm2 = clone(cm1);
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c, messages(cm1), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c, messages(cm2), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
+
+    assertNoDiffs(b1, b2);
+
+    cm2.setMessage("message 2");
+    assertDiffs(
+        b1,
+        b2,
+        "message differs for ChangeMessage.Key "
+            + c.getId()
+            + ",uuid:"
+            + " {message 1} != {message 2}");
+  }
+
+  @Test
+  public void diffChangeMessagesIgnoresUuids() throws Exception {
+    Change c = TestChanges.newChange(project, accountId);
+    int id = c.getId().get();
+    ChangeMessage cm1 =
+        new ChangeMessage(
+            new ChangeMessage.Key(c.getId(), "uuid1"),
+            accountId,
+            TimeUtil.nowTs(),
+            c.currentPatchSetId());
+    cm1.setMessage("message 1");
+    ChangeMessage cm2 = clone(cm1);
+    cm2.getKey().set("uuid2");
+
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c, messages(cm1), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c, messages(cm2), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
+    // Both are ReviewDb, exact UUID match is required.
+    assertDiffs(
+        b1,
+        b2,
+        "ChangeMessage.Key sets differ:"
+            + " ["
+            + id
+            + ",uuid1] only in A; ["
+            + id
+            + ",uuid2] only in B");
+
+    // One NoteDb, UUIDs are ignored.
+    b1 =
+        new ChangeBundle(
+            c, messages(cm1), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
+    b2 =
+        new ChangeBundle(
+            c, messages(cm2), latest(c), approvals(), comments(), reviewers(), NOTE_DB);
+    assertNoDiffs(b1, b2);
+  }
+
+  @Test
+  public void diffChangeMessagesWithDifferentCounts() throws Exception {
+    Change c = TestChanges.newChange(project, accountId);
+    int id = c.getId().get();
+    ChangeMessage cm1 =
+        new ChangeMessage(
+            new ChangeMessage.Key(c.getId(), "uuid1"),
+            accountId,
+            TimeUtil.nowTs(),
+            c.currentPatchSetId());
+    cm1.setMessage("message 1");
+    ChangeMessage cm2 =
+        new ChangeMessage(
+            new ChangeMessage.Key(c.getId(), "uuid2"),
+            accountId,
+            TimeUtil.nowTs(),
+            c.currentPatchSetId());
+    cm1.setMessage("message 2");
+
+    // Both ReviewDb: Uses same keySet diff as other types.
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c, messages(cm1, cm2), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c, messages(cm1), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
+    assertDiffs(
+        b1, b2, "ChangeMessage.Key sets differ: [" + id + ",uuid2] only in A; [] only in B");
+
+    // One NoteDb: UUIDs in keys can't be used for comparison, just diff counts.
+    b1 =
+        new ChangeBundle(
+            c, messages(cm1, cm2), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
+    b2 =
+        new ChangeBundle(
+            c, messages(cm1), latest(c), approvals(), comments(), reviewers(), NOTE_DB);
+    assertDiffs(b1, b2, "ChangeMessages differ for Change.Id " + id + "\nOnly in A:\n  " + cm2);
+    assertDiffs(b2, b1, "ChangeMessages differ for Change.Id " + id + "\nOnly in B:\n  " + cm2);
+  }
+
+  @Test
+  public void diffChangeMessagesMixedSourcesWithDifferences() throws Exception {
+    Change c = TestChanges.newChange(project, accountId);
+    int id = c.getId().get();
+    ChangeMessage cm1 =
+        new ChangeMessage(
+            new ChangeMessage.Key(c.getId(), "uuid1"),
+            accountId,
+            TimeUtil.nowTs(),
+            c.currentPatchSetId());
+    cm1.setMessage("message 1");
+    ChangeMessage cm2 = clone(cm1);
+    cm2.setMessage("message 2");
+    ChangeMessage cm3 = clone(cm1);
+    cm3.getKey().set("uuid2"); // Differs only in UUID.
+
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c, messages(cm1, cm3), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c, messages(cm2, cm3), latest(c), approvals(), comments(), reviewers(), NOTE_DB);
+    // Implementation happens to pair up cm1 in b1 with cm3 in b2 because it
+    // depends on iteration order and doesn't care about UUIDs. The important
+    // thing is that there's some diff.
+    assertDiffs(
+        b1,
+        b2,
+        "ChangeMessages differ for Change.Id "
+            + id
+            + "\n"
+            + "Only in A:\n  "
+            + cm3
+            + "\n"
+            + "Only in B:\n  "
+            + cm2);
+    assertDiffs(
+        b2,
+        b1,
+        "ChangeMessages differ for Change.Id "
+            + id
+            + "\n"
+            + "Only in A:\n  "
+            + cm2
+            + "\n"
+            + "Only in B:\n  "
+            + cm3);
+  }
+
+  @Test
+  public void diffChangeMessagesMixedSourcesAllowsSlop() throws Exception {
+    subWindowResolution();
+    Change c = TestChanges.newChange(project, accountId);
+    ChangeMessage cm1 =
+        new ChangeMessage(
+            new ChangeMessage.Key(c.getId(), "uuid1"),
+            accountId,
+            TimeUtil.nowTs(),
+            c.currentPatchSetId());
+    ChangeMessage cm2 = clone(cm1);
+    cm2.setWrittenOn(TimeUtil.nowTs());
+
+    // Both are ReviewDb, exact timestamp match is required.
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c, messages(cm1), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c, messages(cm2), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
+    assertDiffs(
+        b1,
+        b2,
+        "writtenOn differs for ChangeMessage.Key "
+            + c.getId()
+            + ",uuid1:"
+            + " {2009-09-30 17:00:02.0} != {2009-09-30 17:00:03.0}");
+
+    // One NoteDb, slop is allowed.
+    b1 =
+        new ChangeBundle(
+            c, messages(cm1), latest(c), approvals(), comments(), reviewers(), NOTE_DB);
+    b2 =
+        new ChangeBundle(
+            c, messages(cm2), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
+    assertNoDiffs(b1, b2);
+    assertNoDiffs(b2, b1);
+
+    // But not too much slop.
+    superWindowResolution();
+    ChangeMessage cm3 = clone(cm1);
+    cm3.setWrittenOn(TimeUtil.nowTs());
+    b1 =
+        new ChangeBundle(
+            c, messages(cm1), latest(c), approvals(), comments(), reviewers(), NOTE_DB);
+    ChangeBundle b3 =
+        new ChangeBundle(
+            c, messages(cm3), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
+    int id = c.getId().get();
+    assertDiffs(
+        b1,
+        b3,
+        "ChangeMessages differ for Change.Id "
+            + id
+            + "\n"
+            + "Only in A:\n  "
+            + cm1
+            + "\n"
+            + "Only in B:\n  "
+            + cm3);
+    assertDiffs(
+        b3,
+        b1,
+        "ChangeMessages differ for Change.Id "
+            + id
+            + "\n"
+            + "Only in A:\n  "
+            + cm3
+            + "\n"
+            + "Only in B:\n  "
+            + cm1);
+  }
+
+  @Test
+  public void diffChangeMessagesAllowsNullPatchSetIdFromReviewDb() throws Exception {
+    Change c = TestChanges.newChange(project, accountId);
+    int id = c.getId().get();
+    ChangeMessage cm1 =
+        new ChangeMessage(
+            new ChangeMessage.Key(c.getId(), "uuid"),
+            accountId,
+            TimeUtil.nowTs(),
+            c.currentPatchSetId());
+    cm1.setMessage("message 1");
+    ChangeMessage cm2 = clone(cm1);
+    cm2.setPatchSetId(null);
+
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c, messages(cm1), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c, messages(cm2), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
+
+    // Both are ReviewDb, exact patch set ID match is required.
+    assertDiffs(
+        b1,
+        b2,
+        "patchset differs for ChangeMessage.Key "
+            + c.getId()
+            + ",uuid:"
+            + " {"
+            + id
+            + ",1} != {null}");
+
+    // Null patch set ID on ReviewDb is ignored.
+    b1 =
+        new ChangeBundle(
+            c, messages(cm1), latest(c), approvals(), comments(), reviewers(), NOTE_DB);
+    b2 =
+        new ChangeBundle(
+            c, messages(cm2), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
+    assertNoDiffs(b1, b2);
+
+    // Null patch set ID on NoteDb is not ignored (but is not realistic).
+    b1 =
+        new ChangeBundle(
+            c, messages(cm1), latest(c), approvals(), comments(), reviewers(), REVIEW_DB);
+    b2 =
+        new ChangeBundle(
+            c, messages(cm2), latest(c), approvals(), comments(), reviewers(), NOTE_DB);
+    assertDiffs(
+        b1,
+        b2,
+        "ChangeMessages differ for Change.Id "
+            + id
+            + "\n"
+            + "Only in A:\n  "
+            + cm1
+            + "\n"
+            + "Only in B:\n  "
+            + cm2);
+    assertDiffs(
+        b2,
+        b1,
+        "ChangeMessages differ for Change.Id "
+            + id
+            + "\n"
+            + "Only in A:\n  "
+            + cm2
+            + "\n"
+            + "Only in B:\n  "
+            + cm1);
+  }
+
+  @Test
+  public void diffPatchSetIdSets() throws Exception {
+    Change c = TestChanges.newChange(project, accountId);
+    TestChanges.incrementPatchSet(c);
+
+    PatchSet ps1 = new PatchSet(new PatchSet.Id(c.getId(), 1));
+    ps1.setRevision(new RevId("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
+    ps1.setUploader(accountId);
+    ps1.setCreatedOn(TimeUtil.nowTs());
+    PatchSet ps2 = new PatchSet(new PatchSet.Id(c.getId(), 2));
+    ps2.setRevision(new RevId("badc0feebadc0feebadc0feebadc0feebadc0fee"));
+    ps2.setUploader(accountId);
+    ps2.setCreatedOn(TimeUtil.nowTs());
+
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c, messages(), patchSets(ps2), approvals(), comments(), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c, messages(), patchSets(ps1, ps2), approvals(), comments(), reviewers(), REVIEW_DB);
+
+    assertDiffs(b1, b2, "PatchSet.Id sets differ: [] only in A; [" + c.getId() + ",1] only in B");
+  }
+
+  @Test
+  public void diffPatchSets() throws Exception {
+    Change c = TestChanges.newChange(project, accountId);
+    PatchSet ps1 = new PatchSet(c.currentPatchSetId());
+    ps1.setRevision(new RevId("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
+    ps1.setUploader(accountId);
+    ps1.setCreatedOn(TimeUtil.nowTs());
+    PatchSet ps2 = clone(ps1);
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c, messages(), patchSets(ps1), approvals(), comments(), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c, messages(), patchSets(ps2), approvals(), comments(), reviewers(), REVIEW_DB);
+
+    assertNoDiffs(b1, b2);
+
+    ps2.setRevision(new RevId("badc0feebadc0feebadc0feebadc0feebadc0fee"));
+    assertDiffs(
+        b1,
+        b2,
+        "revision differs for PatchSet.Id "
+            + c.getId()
+            + ",1:"
+            + " {RevId{deadbeefdeadbeefdeadbeefdeadbeefdeadbeef}}"
+            + " != {RevId{badc0feebadc0feebadc0feebadc0feebadc0fee}}");
+  }
+
+  @Test
+  public void diffPatchSetsMixedSourcesAllowsSlop() throws Exception {
+    subWindowResolution();
+    Change c = TestChanges.newChange(project, accountId);
+    PatchSet ps1 = new PatchSet(c.currentPatchSetId());
+    ps1.setRevision(new RevId("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
+    ps1.setUploader(accountId);
+    ps1.setCreatedOn(truncateToSecond(TimeUtil.nowTs()));
+    PatchSet ps2 = clone(ps1);
+    ps2.setCreatedOn(TimeUtil.nowTs());
+
+    // Both are ReviewDb, exact timestamp match is required.
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c, messages(), patchSets(ps1), approvals(), comments(), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c, messages(), patchSets(ps2), approvals(), comments(), reviewers(), REVIEW_DB);
+    assertDiffs(
+        b1,
+        b2,
+        "createdOn differs for PatchSet.Id "
+            + c.getId()
+            + ",1:"
+            + " {2009-09-30 17:00:02.0} != {2009-09-30 17:00:03.0}");
+
+    // One NoteDb, slop is allowed.
+    b1 =
+        new ChangeBundle(
+            c, messages(), patchSets(ps1), approvals(), comments(), reviewers(), NOTE_DB);
+    b2 =
+        new ChangeBundle(
+            c, messages(), patchSets(ps2), approvals(), comments(), reviewers(), REVIEW_DB);
+    assertNoDiffs(b1, b2);
+
+    // But not too much slop.
+    superWindowResolution();
+    PatchSet ps3 = clone(ps1);
+    ps3.setCreatedOn(TimeUtil.nowTs());
+    b1 =
+        new ChangeBundle(
+            c, messages(), patchSets(ps1), approvals(), comments(), reviewers(), NOTE_DB);
+    ChangeBundle b3 =
+        new ChangeBundle(
+            c, messages(), patchSets(ps3), approvals(), comments(), reviewers(), REVIEW_DB);
+    String msg =
+        "createdOn differs for PatchSet.Id "
+            + c.getId()
+            + ",1 in NoteDb vs. ReviewDb:"
+            + " {2009-09-30 17:00:02.0} != {2009-09-30 17:00:10.0}";
+    assertDiffs(b1, b3, msg);
+    assertDiffs(b3, b1, msg);
+  }
+
+  @Test
+  public void diffPatchSetsIgnoresTrailingNewlinesInPushCertificate() throws Exception {
+    subWindowResolution();
+    Change c = TestChanges.newChange(project, accountId);
+    PatchSet ps1 = new PatchSet(c.currentPatchSetId());
+    ps1.setRevision(new RevId("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
+    ps1.setUploader(accountId);
+    ps1.setCreatedOn(truncateToSecond(TimeUtil.nowTs()));
+    ps1.setPushCertificate("some cert");
+    PatchSet ps2 = clone(ps1);
+    ps2.setPushCertificate(ps2.getPushCertificate() + "\n\n");
+
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c, messages(), patchSets(ps1), approvals(), comments(), reviewers(), NOTE_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c, messages(), patchSets(ps2), approvals(), comments(), reviewers(), REVIEW_DB);
+    assertNoDiffs(b1, b2);
+    assertNoDiffs(b2, b1);
+
+    b1 =
+        new ChangeBundle(
+            c, messages(), patchSets(ps1), approvals(), comments(), reviewers(), REVIEW_DB);
+    b2 =
+        new ChangeBundle(
+            c, messages(), patchSets(ps2), approvals(), comments(), reviewers(), NOTE_DB);
+    assertNoDiffs(b1, b2);
+    assertNoDiffs(b2, b1);
+  }
+
+  @Test
+  public void diffPatchSetsGreaterThanCurrent() throws Exception {
+    Change c = TestChanges.newChange(project, accountId);
+
+    PatchSet ps1 = new PatchSet(new PatchSet.Id(c.getId(), 1));
+    ps1.setRevision(new RevId("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
+    ps1.setUploader(accountId);
+    ps1.setCreatedOn(TimeUtil.nowTs());
+    PatchSet ps2 = new PatchSet(new PatchSet.Id(c.getId(), 2));
+    ps2.setRevision(new RevId("badc0feebadc0feebadc0feebadc0feebadc0fee"));
+    ps2.setUploader(accountId);
+    ps2.setCreatedOn(TimeUtil.nowTs());
+    assertThat(ps2.getId().get()).isGreaterThan(c.currentPatchSetId().get());
+
+    ChangeMessage cm1 =
+        new ChangeMessage(
+            new ChangeMessage.Key(c.getId(), "uuid1"),
+            accountId,
+            TimeUtil.nowTs(),
+            c.currentPatchSetId());
+    ChangeMessage cm2 =
+        new ChangeMessage(
+            new ChangeMessage.Key(c.getId(), "uuid2"),
+            accountId,
+            TimeUtil.nowTs(),
+            c.currentPatchSetId());
+
+    PatchSetApproval a1 =
+        new PatchSetApproval(
+            new PatchSetApproval.Key(ps1.getId(), accountId, new LabelId("Code-Review")),
+            (short) 1,
+            TimeUtil.nowTs());
+    PatchSetApproval a2 =
+        new PatchSetApproval(
+            new PatchSetApproval.Key(ps2.getId(), accountId, new LabelId("Code-Review")),
+            (short) 1,
+            TimeUtil.nowTs());
+
+    // Both ReviewDb.
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c, messages(cm1), patchSets(ps1), approvals(a1), comments(), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c,
+            messages(cm1, cm2),
+            patchSets(ps1, ps2),
+            approvals(a1, a2),
+            comments(),
+            reviewers(),
+            REVIEW_DB);
+    assertDiffs(
+        b1,
+        b2,
+        "ChangeMessage.Key sets differ: [] only in A; [" + cm2.getKey() + "] only in B",
+        "PatchSet.Id sets differ: [] only in A; [" + ps2.getId() + "] only in B",
+        "PatchSetApproval.Key sets differ: [] only in A; [" + a2.getKey() + "] only in B");
+
+    // One NoteDb.
+    b1 =
+        new ChangeBundle(
+            c, messages(cm1), patchSets(ps1), approvals(a1), comments(), reviewers(), NOTE_DB);
+    b2 =
+        new ChangeBundle(
+            c,
+            messages(cm1, cm2),
+            patchSets(ps1, ps2),
+            approvals(a1, a2),
+            comments(),
+            reviewers(),
+            REVIEW_DB);
+    assertDiffs(
+        b1,
+        b2,
+        "ChangeMessages differ for Change.Id " + c.getId() + "\nOnly in B:\n  " + cm2,
+        "PatchSet.Id sets differ: [] only in A; [" + ps2.getId() + "] only in B",
+        "PatchSetApproval.Key sets differ: [] only in A; [" + a2.getKey() + "] only in B");
+
+    // Both NoteDb.
+    b1 =
+        new ChangeBundle(
+            c, messages(cm1), patchSets(ps1), approvals(a1), comments(), reviewers(), NOTE_DB);
+    b2 =
+        new ChangeBundle(
+            c,
+            messages(cm1, cm2),
+            patchSets(ps1, ps2),
+            approvals(a1, a2),
+            comments(),
+            reviewers(),
+            NOTE_DB);
+    assertDiffs(
+        b1,
+        b2,
+        "ChangeMessages differ for Change.Id " + c.getId() + "\nOnly in B:\n  " + cm2,
+        "PatchSet.Id sets differ: [] only in A; [" + ps2.getId() + "] only in B",
+        "PatchSetApproval.Key sets differ: [] only in A; [" + a2.getKey() + "] only in B");
+  }
+
+  @Test
+  public void diffPatchSetsIgnoresLeadingAndTrailingWhitespaceInReviewDbDescriptions()
+      throws Exception {
+    Change c = TestChanges.newChange(project, accountId);
+
+    PatchSet ps1 = new PatchSet(new PatchSet.Id(c.getId(), 1));
+    ps1.setRevision(new RevId("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
+    ps1.setUploader(accountId);
+    ps1.setCreatedOn(TimeUtil.nowTs());
+    ps1.setDescription(" abc ");
+    PatchSet ps2 = clone(ps1);
+    ps2.setDescription("abc");
+
+    // Both ReviewDb, exact match required.
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c, messages(), patchSets(ps1), approvals(), comments(), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c, messages(), patchSets(ps2), approvals(), comments(), reviewers(), REVIEW_DB);
+    assertDiffs(
+        b1, b2, "description differs for PatchSet.Id " + ps1.getId() + ": { abc } != {abc}");
+
+    // Whitespace in ReviewDb description is ignored.
+    b1 =
+        new ChangeBundle(
+            c, messages(), patchSets(ps1), approvals(), comments(), reviewers(), REVIEW_DB);
+    b2 =
+        new ChangeBundle(
+            c, messages(), patchSets(ps2), approvals(), comments(), reviewers(), NOTE_DB);
+    assertNoDiffs(b1, b2);
+    assertNoDiffs(b2, b1);
+
+    // Must match except for the leading/trailing whitespace.
+    PatchSet ps3 = clone(ps1);
+    ps3.setDescription("cba");
+    b1 =
+        new ChangeBundle(
+            c, messages(), patchSets(ps1), approvals(), comments(), reviewers(), REVIEW_DB);
+    b2 =
+        new ChangeBundle(
+            c, messages(), patchSets(ps3), approvals(), comments(), reviewers(), NOTE_DB);
+    assertDiffs(
+        b1, b2, "description differs for PatchSet.Id " + ps1.getId() + ": { abc } != {cba}");
+  }
+
+  @Test
+  public void diffPatchSetsIgnoresCreatedOnWhenReviewDbIsNonMonotonic() throws Exception {
+    Change c = TestChanges.newChange(project, accountId);
+
+    Timestamp beforePs1 = TimeUtil.nowTs();
+
+    PatchSet goodPs1 = new PatchSet(new PatchSet.Id(c.getId(), 1));
+    goodPs1.setRevision(new RevId("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
+    goodPs1.setUploader(accountId);
+    goodPs1.setCreatedOn(TimeUtil.nowTs());
+    PatchSet goodPs2 = new PatchSet(new PatchSet.Id(c.getId(), 2));
+    goodPs2.setRevision(new RevId("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
+    goodPs2.setUploader(accountId);
+    goodPs2.setCreatedOn(TimeUtil.nowTs());
+    assertThat(goodPs2.getCreatedOn()).isGreaterThan(goodPs1.getCreatedOn());
+
+    PatchSet badPs2 = clone(goodPs2);
+    badPs2.setCreatedOn(beforePs1);
+    assertThat(badPs2.getCreatedOn()).isLessThan(goodPs1.getCreatedOn());
+
+    // Both ReviewDb, exact match required.
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c,
+            messages(),
+            patchSets(goodPs1, goodPs2),
+            approvals(),
+            comments(),
+            reviewers(),
+            REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c,
+            messages(),
+            patchSets(goodPs1, badPs2),
+            approvals(),
+            comments(),
+            reviewers(),
+            REVIEW_DB);
+    assertDiffs(
+        b1,
+        b2,
+        "createdOn differs for PatchSet.Id "
+            + badPs2.getId()
+            + ":"
+            + " {2009-09-30 17:00:18.0} != {2009-09-30 17:00:06.0}");
+
+    // Non-monotonic in ReviewDb but monotonic in NoteDb, timestamps are
+    // ignored, including for ps1.
+    PatchSet badPs1 = clone(goodPs1);
+    badPs1.setCreatedOn(TimeUtil.nowTs());
+    b1 =
+        new ChangeBundle(
+            c,
+            messages(),
+            patchSets(badPs1, badPs2),
+            approvals(),
+            comments(),
+            reviewers(),
+            REVIEW_DB);
+    b2 =
+        new ChangeBundle(
+            c,
+            messages(),
+            patchSets(goodPs1, goodPs2),
+            approvals(),
+            comments(),
+            reviewers(),
+            NOTE_DB);
+    assertNoDiffs(b1, b2);
+    assertNoDiffs(b2, b1);
+
+    // Non-monotonic in NoteDb but monotonic in ReviewDb, timestamps are not
+    // ignored.
+    b1 =
+        new ChangeBundle(
+            c,
+            messages(),
+            patchSets(goodPs1, goodPs2),
+            approvals(),
+            comments(),
+            reviewers(),
+            REVIEW_DB);
+    b2 =
+        new ChangeBundle(
+            c,
+            messages(),
+            patchSets(badPs1, badPs2),
+            approvals(),
+            comments(),
+            reviewers(),
+            NOTE_DB);
+    assertDiffs(
+        b1,
+        b2,
+        "createdOn differs for PatchSet.Id "
+            + badPs1.getId()
+            + " in NoteDb vs. ReviewDb:"
+            + " {2009-09-30 17:00:24.0} != {2009-09-30 17:00:12.0}",
+        "createdOn differs for PatchSet.Id "
+            + badPs2.getId()
+            + " in NoteDb vs. ReviewDb:"
+            + " {2009-09-30 17:00:06.0} != {2009-09-30 17:00:18.0}");
+  }
+
+  @Test
+  public void diffPatchSetsAllowsFirstPatchSetCreatedOnToMatchChangeCreatedOn() {
+    Change c = TestChanges.newChange(project, accountId);
+    c.setLastUpdatedOn(TimeUtil.nowTs());
+
+    PatchSet goodPs1 = new PatchSet(new PatchSet.Id(c.getId(), 1));
+    goodPs1.setRevision(new RevId("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
+    goodPs1.setUploader(accountId);
+    goodPs1.setCreatedOn(TimeUtil.nowTs());
+    assertThat(goodPs1.getCreatedOn()).isGreaterThan(c.getCreatedOn());
+
+    PatchSet ps1AtCreatedOn = clone(goodPs1);
+    ps1AtCreatedOn.setCreatedOn(c.getCreatedOn());
+
+    PatchSet goodPs2 = new PatchSet(new PatchSet.Id(c.getId(), 2));
+    goodPs2.setRevision(new RevId("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
+    goodPs2.setUploader(accountId);
+    goodPs2.setCreatedOn(TimeUtil.nowTs());
+
+    PatchSet ps2AtCreatedOn = clone(goodPs2);
+    ps2AtCreatedOn.setCreatedOn(c.getCreatedOn());
+
+    // Both ReviewDb, exact match required.
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c,
+            messages(),
+            patchSets(goodPs1, goodPs2),
+            approvals(),
+            comments(),
+            reviewers(),
+            REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c,
+            messages(),
+            patchSets(ps1AtCreatedOn, ps2AtCreatedOn),
+            approvals(),
+            comments(),
+            reviewers(),
+            REVIEW_DB);
+    assertDiffs(
+        b1,
+        b2,
+        "createdOn differs for PatchSet.Id "
+            + c.getId()
+            + ",1: {2009-09-30 17:00:12.0} != {2009-09-30 17:00:00.0}",
+        "createdOn differs for PatchSet.Id "
+            + c.getId()
+            + ",2: {2009-09-30 17:00:18.0} != {2009-09-30 17:00:00.0}");
+
+    // One ReviewDb, PS1 is allowed to match change createdOn, but PS2 isn't.
+    b1 =
+        new ChangeBundle(
+            c,
+            messages(),
+            patchSets(goodPs1, goodPs2),
+            approvals(),
+            comments(),
+            reviewers(),
+            REVIEW_DB);
+    b2 =
+        new ChangeBundle(
+            c,
+            messages(),
+            patchSets(ps1AtCreatedOn, ps2AtCreatedOn),
+            approvals(),
+            comments(),
+            reviewers(),
+            NOTE_DB);
+    assertDiffs(
+        b1,
+        b2,
+        "createdOn differs for PatchSet.Id "
+            + c.getId()
+            + ",2 in NoteDb vs. ReviewDb: {2009-09-30 17:00:00.0} != {2009-09-30 17:00:18.0}");
+    assertDiffs(
+        b2,
+        b1,
+        "createdOn differs for PatchSet.Id "
+            + c.getId()
+            + ",2 in NoteDb vs. ReviewDb: {2009-09-30 17:00:00.0} != {2009-09-30 17:00:18.0}");
+  }
+
+  @Test
+  public void diffPatchSetApprovalKeySets() throws Exception {
+    Change c = TestChanges.newChange(project, accountId);
+    int id = c.getId().get();
+    PatchSetApproval a1 =
+        new PatchSetApproval(
+            new PatchSetApproval.Key(c.currentPatchSetId(), accountId, new LabelId("Code-Review")),
+            (short) 1,
+            TimeUtil.nowTs());
+    PatchSetApproval a2 =
+        new PatchSetApproval(
+            new PatchSetApproval.Key(c.currentPatchSetId(), accountId, new LabelId("Verified")),
+            (short) 1,
+            TimeUtil.nowTs());
+
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c, messages(), latest(c), approvals(a1), comments(), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c, messages(), latest(c), approvals(a2), comments(), reviewers(), REVIEW_DB);
+
+    assertDiffs(
+        b1,
+        b2,
+        "PatchSetApproval.Key sets differ:"
+            + " ["
+            + id
+            + "%2C1,100,Code-Review] only in A;"
+            + " ["
+            + id
+            + "%2C1,100,Verified] only in B");
+  }
+
+  @Test
+  public void diffPatchSetApprovals() throws Exception {
+    Change c = TestChanges.newChange(project, accountId);
+    PatchSetApproval a1 =
+        new PatchSetApproval(
+            new PatchSetApproval.Key(c.currentPatchSetId(), accountId, new LabelId("Code-Review")),
+            (short) 1,
+            TimeUtil.nowTs());
+    PatchSetApproval a2 = clone(a1);
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c, messages(), latest(c), approvals(a1), comments(), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c, messages(), latest(c), approvals(a2), comments(), reviewers(), REVIEW_DB);
+
+    assertNoDiffs(b1, b2);
+
+    a2.setValue((short) -1);
+    assertDiffs(
+        b1,
+        b2,
+        "value differs for PatchSetApproval.Key "
+            + c.getId()
+            + "%2C1,100,Code-Review: {1} != {-1}");
+  }
+
+  @Test
+  public void diffPatchSetApprovalsMixedSourcesAllowsSlop() throws Exception {
+    Change c = TestChanges.newChange(project, accountId);
+    subWindowResolution();
+    PatchSetApproval a1 =
+        new PatchSetApproval(
+            new PatchSetApproval.Key(c.currentPatchSetId(), accountId, new LabelId("Code-Review")),
+            (short) 1,
+            truncateToSecond(TimeUtil.nowTs()));
+    PatchSetApproval a2 = clone(a1);
+    a2.setGranted(TimeUtil.nowTs());
+
+    // Both are ReviewDb, exact timestamp match is required.
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c, messages(), latest(c), approvals(a1), comments(), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c, messages(), latest(c), approvals(a2), comments(), reviewers(), REVIEW_DB);
+    assertDiffs(
+        b1,
+        b2,
+        "granted differs for PatchSetApproval.Key "
+            + c.getId()
+            + "%2C1,100,Code-Review:"
+            + " {2009-09-30 17:00:07.0} != {2009-09-30 17:00:08.0}");
+
+    // One NoteDb, slop is allowed.
+    b1 =
+        new ChangeBundle(c, messages(), latest(c), approvals(a1), comments(), reviewers(), NOTE_DB);
+    b2 =
+        new ChangeBundle(
+            c, messages(), latest(c), approvals(a2), comments(), reviewers(), REVIEW_DB);
+    assertNoDiffs(b1, b2);
+
+    // But not too much slop.
+    superWindowResolution();
+    PatchSetApproval a3 = clone(a1);
+    a3.setGranted(TimeUtil.nowTs());
+    b1 =
+        new ChangeBundle(c, messages(), latest(c), approvals(a1), comments(), reviewers(), NOTE_DB);
+    ChangeBundle b3 =
+        new ChangeBundle(
+            c, messages(), latest(c), approvals(a3), comments(), reviewers(), REVIEW_DB);
+    String msg =
+        "granted differs for PatchSetApproval.Key "
+            + c.getId()
+            + "%2C1,100,Code-Review in NoteDb vs. ReviewDb:"
+            + " {2009-09-30 17:00:07.0} != {2009-09-30 17:00:15.0}";
+    assertDiffs(b1, b3, msg);
+    assertDiffs(b3, b1, msg);
+  }
+
+  @Test
+  public void diffPatchSetApprovalsAllowsTruncatedTimestampInNoteDb() throws Exception {
+    Change c = TestChanges.newChange(project, accountId);
+    PatchSetApproval a1 =
+        new PatchSetApproval(
+            new PatchSetApproval.Key(c.currentPatchSetId(), accountId, new LabelId("Code-Review")),
+            (short) 1,
+            c.getCreatedOn());
+    PatchSetApproval a2 = clone(a1);
+    a2.setGranted(
+        new Timestamp(
+            LocalDate.of(1900, Month.JANUARY, 1)
+                .atStartOfDay()
+                .atZone(ZoneId.of(TIMEZONE_ID))
+                .toInstant()
+                .toEpochMilli()));
+
+    // Both are ReviewDb, exact match is required.
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c, messages(), latest(c), approvals(a1), comments(), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c, messages(), latest(c), approvals(a2), comments(), reviewers(), REVIEW_DB);
+    assertDiffs(
+        b1,
+        b2,
+        "granted differs for PatchSetApproval.Key "
+            + c.getId()
+            + "%2C1,100,Code-Review:"
+            + " {2009-09-30 17:00:00.0} != {1900-01-01 00:00:00.0}");
+
+    // Truncating NoteDb timestamp is allowed.
+    b1 =
+        new ChangeBundle(c, messages(), latest(c), approvals(a1), comments(), reviewers(), NOTE_DB);
+    b2 =
+        new ChangeBundle(
+            c, messages(), latest(c), approvals(a2), comments(), reviewers(), REVIEW_DB);
+    assertNoDiffs(b1, b2);
+    assertNoDiffs(b2, b1);
+  }
+
+  @Test
+  public void diffPatchSetApprovalsIgnoresPostSubmitBitOnZeroVote() throws Exception {
+    Change c = TestChanges.newChange(project, accountId);
+    c.setStatus(Change.Status.MERGED);
+    PatchSetApproval a1 =
+        new PatchSetApproval(
+            new PatchSetApproval.Key(c.currentPatchSetId(), accountId, new LabelId("Code-Review")),
+            (short) 0,
+            TimeUtil.nowTs());
+    a1.setPostSubmit(false);
+    PatchSetApproval a2 = clone(a1);
+    a2.setPostSubmit(true);
+
+    // Both are ReviewDb, exact match is required.
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c, messages(), latest(c), approvals(a1), comments(), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c, messages(), latest(c), approvals(a2), comments(), reviewers(), REVIEW_DB);
+    assertDiffs(
+        b1,
+        b2,
+        "postSubmit differs for PatchSetApproval.Key "
+            + c.getId()
+            + "%2C1,100,Code-Review:"
+            + " {false} != {true}");
+
+    // One NoteDb, postSubmit is ignored.
+    b1 =
+        new ChangeBundle(
+            c, messages(), latest(c), approvals(a1), comments(), reviewers(), REVIEW_DB);
+    b2 =
+        new ChangeBundle(c, messages(), latest(c), approvals(a2), comments(), reviewers(), NOTE_DB);
+    assertNoDiffs(b1, b2);
+    assertNoDiffs(b2, b1);
+
+    // postSubmit is not ignored if vote isn't 0.
+    a1.setValue((short) 1);
+    a2.setValue((short) 1);
+    assertDiffs(
+        b1,
+        b2,
+        "postSubmit differs for PatchSetApproval.Key "
+            + c.getId()
+            + "%2C1,100,Code-Review:"
+            + " {false} != {true}");
+    assertDiffs(
+        b2,
+        b1,
+        "postSubmit differs for PatchSetApproval.Key "
+            + c.getId()
+            + "%2C1,100,Code-Review:"
+            + " {true} != {false}");
+  }
+
+  @Test
+  public void diffReviewers() throws Exception {
+    Change c = TestChanges.newChange(project, accountId);
+    Timestamp now = TimeUtil.nowTs();
+    ReviewerSet r1 = reviewers(REVIEWER, new Account.Id(1), now);
+    ReviewerSet r2 = reviewers(REVIEWER, new Account.Id(2), now);
+
+    ChangeBundle b1 =
+        new ChangeBundle(c, messages(), latest(c), approvals(), comments(), r1, REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(c, messages(), latest(c), approvals(), comments(), r2, REVIEW_DB);
+    assertNoDiffs(b1, b1);
+    assertNoDiffs(b2, b2);
+    assertDiffs(b1, b2, "reviewer sets differ: [1] only in A; [2] only in B");
+  }
+
+  @Test
+  public void diffReviewersIgnoresStateAndTimestamp() throws Exception {
+    Change c = TestChanges.newChange(project, accountId);
+    ReviewerSet r1 = reviewers(REVIEWER, new Account.Id(1), TimeUtil.nowTs());
+    ReviewerSet r2 = reviewers(CC, new Account.Id(1), TimeUtil.nowTs());
+
+    ChangeBundle b1 =
+        new ChangeBundle(c, messages(), latest(c), approvals(), comments(), r1, REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(c, messages(), latest(c), approvals(), comments(), r2, REVIEW_DB);
+    assertNoDiffs(b1, b1);
+    assertNoDiffs(b2, b2);
+  }
+
+  @Test
+  public void diffPatchLineCommentKeySets() throws Exception {
+    Change c = TestChanges.newChange(project, accountId);
+    int id = c.getId().get();
+    PatchLineComment c1 =
+        new PatchLineComment(
+            new PatchLineComment.Key(new Patch.Key(c.currentPatchSetId(), "filename1"), "uuid1"),
+            5,
+            accountId,
+            null,
+            TimeUtil.nowTs());
+    PatchLineComment c2 =
+        new PatchLineComment(
+            new PatchLineComment.Key(new Patch.Key(c.currentPatchSetId(), "filename2"), "uuid2"),
+            5,
+            accountId,
+            null,
+            TimeUtil.nowTs());
+
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c, messages(), latest(c), approvals(), comments(c1), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c, messages(), latest(c), approvals(), comments(c2), reviewers(), REVIEW_DB);
+
+    assertDiffs(
+        b1,
+        b2,
+        "PatchLineComment.Key sets differ:"
+            + " ["
+            + id
+            + ",1,filename1,uuid1] only in A;"
+            + " ["
+            + id
+            + ",1,filename2,uuid2] only in B");
+  }
+
+  @Test
+  public void diffPatchLineComments() throws Exception {
+    Change c = TestChanges.newChange(project, accountId);
+    PatchLineComment c1 =
+        new PatchLineComment(
+            new PatchLineComment.Key(new Patch.Key(c.currentPatchSetId(), "filename"), "uuid"),
+            5,
+            accountId,
+            null,
+            TimeUtil.nowTs());
+    PatchLineComment c2 = clone(c1);
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c, messages(), latest(c), approvals(), comments(c1), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c, messages(), latest(c), approvals(), comments(c2), reviewers(), REVIEW_DB);
+
+    assertNoDiffs(b1, b2);
+
+    c2.setStatus(PatchLineComment.Status.PUBLISHED);
+    assertDiffs(
+        b1,
+        b2,
+        "status differs for PatchLineComment.Key " + c.getId() + ",1,filename,uuid: {d} != {P}");
+  }
+
+  @Test
+  public void diffPatchLineCommentsMixedSourcesAllowsSlop() throws Exception {
+    subWindowResolution();
+    Change c = TestChanges.newChange(project, accountId);
+    PatchLineComment c1 =
+        new PatchLineComment(
+            new PatchLineComment.Key(new Patch.Key(c.currentPatchSetId(), "filename"), "uuid"),
+            5,
+            accountId,
+            null,
+            truncateToSecond(TimeUtil.nowTs()));
+    PatchLineComment c2 = clone(c1);
+    c2.setWrittenOn(TimeUtil.nowTs());
+
+    // Both are ReviewDb, exact timestamp match is required.
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c, messages(), latest(c), approvals(), comments(c1), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c, messages(), latest(c), approvals(), comments(c2), reviewers(), REVIEW_DB);
+    assertDiffs(
+        b1,
+        b2,
+        "writtenOn differs for PatchLineComment.Key "
+            + c.getId()
+            + ",1,filename,uuid:"
+            + " {2009-09-30 17:00:02.0} != {2009-09-30 17:00:03.0}");
+
+    // One NoteDb, slop is allowed.
+    b1 =
+        new ChangeBundle(c, messages(), latest(c), approvals(), comments(c1), reviewers(), NOTE_DB);
+    b2 =
+        new ChangeBundle(
+            c, messages(), latest(c), approvals(), comments(c2), reviewers(), REVIEW_DB);
+    assertNoDiffs(b1, b2);
+
+    // But not too much slop.
+    superWindowResolution();
+    PatchLineComment c3 = clone(c1);
+    c3.setWrittenOn(TimeUtil.nowTs());
+    b1 =
+        new ChangeBundle(c, messages(), latest(c), approvals(), comments(c1), reviewers(), NOTE_DB);
+    ChangeBundle b3 =
+        new ChangeBundle(
+            c, messages(), latest(c), approvals(), comments(c3), reviewers(), REVIEW_DB);
+    String msg =
+        "writtenOn differs for PatchLineComment.Key "
+            + c.getId()
+            + ",1,filename,uuid in NoteDb vs. ReviewDb:"
+            + " {2009-09-30 17:00:02.0} != {2009-09-30 17:00:10.0}";
+    assertDiffs(b1, b3, msg);
+    assertDiffs(b3, b1, msg);
+  }
+
+  @Test
+  public void diffPatchLineCommentsIgnoresCommentsOnInvalidPatchSet() throws Exception {
+    Change c = TestChanges.newChange(project, accountId);
+    PatchLineComment c1 =
+        new PatchLineComment(
+            new PatchLineComment.Key(new Patch.Key(c.currentPatchSetId(), "filename1"), "uuid1"),
+            5,
+            accountId,
+            null,
+            TimeUtil.nowTs());
+    PatchLineComment c2 =
+        new PatchLineComment(
+            new PatchLineComment.Key(
+                new Patch.Key(new PatchSet.Id(c.getId(), 0), "filename2"), "uuid2"),
+            5,
+            accountId,
+            null,
+            TimeUtil.nowTs());
+
+    ChangeBundle b1 =
+        new ChangeBundle(
+            c, messages(), latest(c), approvals(), comments(c1, c2), reviewers(), REVIEW_DB);
+    ChangeBundle b2 =
+        new ChangeBundle(
+            c, messages(), latest(c), approvals(), comments(c1), reviewers(), REVIEW_DB);
+    assertNoDiffs(b1, b2);
+  }
+
+  private static void assertNoDiffs(ChangeBundle a, ChangeBundle b) {
+    assertThat(a.differencesFrom(b)).isEmpty();
+    assertThat(b.differencesFrom(a)).isEmpty();
+  }
+
+  private static void assertDiffs(ChangeBundle a, ChangeBundle b, String first, String... rest) {
+    List<String> actual = a.differencesFrom(b);
+    if (actual.size() == 1 && rest.length == 0) {
+      // This error message is much easier to read.
+      assertThat(actual.get(0)).isEqualTo(first);
+    } else {
+      List<String> expected = new ArrayList<>(1 + rest.length);
+      expected.add(first);
+      Collections.addAll(expected, rest);
+      assertThat(actual).containsExactlyElementsIn(expected).inOrder();
+    }
+    assertThat(a).isNotEqualTo(b);
+  }
+
+  private static List<ChangeMessage> messages(ChangeMessage... ents) {
+    return Arrays.asList(ents);
+  }
+
+  private static List<PatchSet> patchSets(PatchSet... ents) {
+    return Arrays.asList(ents);
+  }
+
+  private static List<PatchSet> latest(Change c) {
+    PatchSet ps = new PatchSet(c.currentPatchSetId());
+    ps.setCreatedOn(c.getLastUpdatedOn());
+    return ImmutableList.of(ps);
+  }
+
+  private static List<PatchSetApproval> approvals(PatchSetApproval... ents) {
+    return Arrays.asList(ents);
+  }
+
+  private static ReviewerSet reviewers(Object... ents) {
+    checkArgument(ents.length % 3 == 0);
+    Table<ReviewerStateInternal, Account.Id, Timestamp> t = HashBasedTable.create();
+    for (int i = 0; i < ents.length; i += 3) {
+      t.put((ReviewerStateInternal) ents[i], (Account.Id) ents[i + 1], (Timestamp) ents[i + 2]);
+    }
+    return ReviewerSet.fromTable(t);
+  }
+
+  private static List<PatchLineComment> comments(PatchLineComment... ents) {
+    return Arrays.asList(ents);
+  }
+
+  private static Change clone(Change ent) {
+    return clone(CHANGE_CODEC, ent);
+  }
+
+  private static ChangeMessage clone(ChangeMessage ent) {
+    return clone(CHANGE_MESSAGE_CODEC, ent);
+  }
+
+  private static PatchSet clone(PatchSet ent) {
+    return clone(PATCH_SET_CODEC, ent);
+  }
+
+  private static PatchSetApproval clone(PatchSetApproval ent) {
+    return clone(PATCH_SET_APPROVAL_CODEC, ent);
+  }
+
+  private static PatchLineComment clone(PatchLineComment ent) {
+    return clone(PATCH_LINE_COMMENT_CODEC, ent);
+  }
+
+  private static <T> T clone(ProtobufCodec<T> codec, T obj) {
+    return codec.decode(codec.encodeToByteArray(obj));
+  }
+}
diff --git a/javatests/com/google/gerrit/server/notedb/ChangeNotesCacheTest.java b/javatests/com/google/gerrit/server/notedb/ChangeNotesCacheTest.java
new file mode 100644
index 0000000..7b140b7
--- /dev/null
+++ b/javatests/com/google/gerrit/server/notedb/ChangeNotesCacheTest.java
@@ -0,0 +1,60 @@
+// 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.
+
+package com.google.gerrit.server.notedb;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.extensions.proto.ProtoTruth.assertThat;
+import static com.google.gerrit.server.cache.testing.CacheSerializerTestUtil.byteString;
+import static com.google.gerrit.server.cache.testing.SerializedClassSubject.assertThatSerializedClass;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.cache.proto.Cache.ChangeNotesKeyProto;
+import org.eclipse.jgit.lib.ObjectId;
+import org.junit.Test;
+
+public final class ChangeNotesCacheTest {
+  @Test
+  public void keySerializer() throws Exception {
+    ChangeNotesCache.Key key =
+        ChangeNotesCache.Key.create(
+            new Project.NameKey("project"),
+            new Change.Id(1234),
+            ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"));
+    byte[] serialized = ChangeNotesCache.Key.Serializer.INSTANCE.serialize(key);
+    assertThat(ChangeNotesKeyProto.parseFrom(serialized))
+        .isEqualTo(
+            ChangeNotesKeyProto.newBuilder()
+                .setProject("project")
+                .setChangeId(1234)
+                .setId(
+                    byteString(
+                        0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef,
+                        0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef))
+                .build());
+    assertThat(ChangeNotesCache.Key.Serializer.INSTANCE.deserialize(serialized)).isEqualTo(key);
+  }
+
+  @Test
+  public void keyMethods() throws Exception {
+    assertThatSerializedClass(ChangeNotesCache.Key.class)
+        .hasAutoValueMethods(
+            ImmutableMap.of(
+                "project", Project.NameKey.class,
+                "changeId", Change.Id.class,
+                "id", ObjectId.class));
+  }
+}
diff --git a/javatests/com/google/gerrit/server/notedb/ChangeNotesParserTest.java b/javatests/com/google/gerrit/server/notedb/ChangeNotesParserTest.java
new file mode 100644
index 0000000..79dcd5b
--- /dev/null
+++ b/javatests/com/google/gerrit/server/notedb/ChangeNotesParserTest.java
@@ -0,0 +1,563 @@
+// Copyright (C) 2014 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.google.gerrit.server.notedb;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.fail;
+
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.notedb.ChangeNotesCommit.ChangeNotesRevWalk;
+import com.google.gerrit.server.util.time.TimeUtil;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ChangeNotesParserTest extends AbstractChangeNotesTest {
+  private TestRepository<InMemoryRepository> testRepo;
+  private ChangeNotesRevWalk walk;
+
+  @Before
+  public void setUpTestRepo() throws Exception {
+    testRepo = new TestRepository<>(repo);
+    walk = ChangeNotesCommit.newRevWalk(repo);
+  }
+
+  @After
+  public void tearDownTestRepo() throws Exception {
+    walk.close();
+  }
+
+  @Test
+  public void parseAuthor() throws Exception {
+    assertParseSucceeds(
+        "Update change\n"
+            + "\n"
+            + "Branch: refs/heads/master\n"
+            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
+            + "Patch-set: 1\n"
+            + "Subject: This is a test change\n");
+    assertParseFails(
+        writeCommit(
+            "Update change\n\nPatch-set: 1\n",
+            new PersonIdent(
+                "Change Owner",
+                "owner@example.com",
+                serverIdent.getWhen(),
+                serverIdent.getTimeZone())));
+    assertParseFails(
+        writeCommit(
+            "Update change\n\nPatch-set: 1\n",
+            new PersonIdent(
+                "Change Owner", "x@gerrit", serverIdent.getWhen(), serverIdent.getTimeZone())));
+    assertParseFails(
+        writeCommit(
+            "Update change\n\nPatch-set: 1\n",
+            new PersonIdent(
+                "Change\n\u1234<Owner>",
+                "\n\nx<@>\u0002gerrit",
+                serverIdent.getWhen(),
+                serverIdent.getTimeZone())));
+  }
+
+  @Test
+  public void parseStatus() throws Exception {
+    assertParseSucceeds(
+        "Update change\n"
+            + "\n"
+            + "Branch: refs/heads/master\n"
+            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
+            + "Patch-set: 1\n"
+            + "Status: NEW\n"
+            + "Subject: This is a test change\n");
+    assertParseSucceeds(
+        "Update change\n"
+            + "\n"
+            + "Branch: refs/heads/master\n"
+            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
+            + "Patch-set: 1\n"
+            + "Status: new\n"
+            + "Subject: This is a test change\n");
+    assertParseFails("Update change\n\nPatch-set: 1\nStatus: OOPS\n");
+    assertParseFails("Update change\n\nPatch-set: 1\nStatus: NEW\nStatus: NEW\n");
+  }
+
+  @Test
+  public void parsePatchSetId() throws Exception {
+    assertParseSucceeds(
+        "Update change\n"
+            + "\n"
+            + "Branch: refs/heads/master\n"
+            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
+            + "Patch-set: 1\n"
+            + "Subject: This is a test change\n");
+    assertParseFails("Update change\n\n");
+    assertParseFails("Update change\n\nPatch-set: 1\nPatch-set: 1\n");
+    assertParseSucceeds(
+        "Update change\n"
+            + "\n"
+            + "Branch: refs/heads/master\n"
+            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
+            + "Patch-set: 1\n"
+            + "Subject: This is a test change\n");
+    assertParseFails("Update change\n\nPatch-set: x\n");
+  }
+
+  @Test
+  public void parseApproval() throws Exception {
+    assertParseSucceeds(
+        "Update change\n"
+            + "\n"
+            + "Branch: refs/heads/master\n"
+            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
+            + "Patch-set: 1\n"
+            + "Label: Label1=+1\n"
+            + "Label: Label2=1\n"
+            + "Label: Label3=0\n"
+            + "Label: Label4=-1\n"
+            + "Subject: This is a test change\n");
+    assertParseSucceeds(
+        "Update change\n"
+            + "\n"
+            + "Branch: refs/heads/master\n"
+            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
+            + "Patch-set: 1\n"
+            + "Label: -Label1\n"
+            + "Label: -Label1 Other Account <2@gerrit>\n"
+            + "Subject: This is a test change\n");
+    assertParseFails("Update change\n\nPatch-set: 1\nLabel: Label1=X\n");
+    assertParseFails("Update change\n\nPatch-set: 1\nLabel: Label1 = 1\n");
+    assertParseFails("Update change\n\nPatch-set: 1\nLabel: X+Y\n");
+    assertParseFails("Update change\n\nPatch-set: 1\nLabel: Label1 Other Account <2@gerrit>\n");
+    assertParseFails("Update change\n\nPatch-set: 1\nLabel: -Label!1\n");
+    assertParseFails("Update change\n\nPatch-set: 1\nLabel: -Label!1 Other Account <2@gerrit>\n");
+  }
+
+  @Test
+  public void parseSubmitRecords() throws Exception {
+    assertParseSucceeds(
+        "Update change\n"
+            + "\n"
+            + "Branch: refs/heads/master\n"
+            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
+            + "Patch-set: 1\n"
+            + "Subject: This is a test change\n"
+            + "Submitted-with: NOT_READY\n"
+            + "Submitted-with: OK: Verified: Change Owner <1@gerrit>\n"
+            + "Submitted-with: NEED: Code-Review\n"
+            + "Submitted-with: NOT_READY\n"
+            + "Submitted-with: OK: Verified: Change Owner <1@gerrit>\n"
+            + "Submitted-with: NEED: Alternative-Code-Review\n");
+    assertParseFails("Update change\n\nPatch-set: 1\nSubmitted-with: OOPS\n");
+    assertParseFails("Update change\n\nPatch-set: 1\nSubmitted-with: NEED: X+Y\n");
+    assertParseFails(
+        "Update change\n"
+            + "\n"
+            + "Patch-set: 1\n"
+            + "Submitted-with: OK: X+Y: Change Owner <1@gerrit>\n");
+    assertParseFails(
+        "Update change\n"
+            + "\n"
+            + "Patch-set: 1\n"
+            + "Submitted-with: OK: Code-Review: 1@gerrit\n");
+  }
+
+  @Test
+  public void parseSubmissionId() throws Exception {
+    assertParseSucceeds(
+        "Update change\n"
+            + "\n"
+            + "Branch: refs/heads/master\n"
+            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
+            + "Patch-set: 1\n"
+            + "Subject: This is a test change\n"
+            + "Submission-id: 1-1453387607626-96fabc25");
+    assertParseFails(
+        "Update change\n"
+            + "\n"
+            + "Patch-set: 1\n"
+            + "Submission-id: 1-1453387607626-96fabc25\n"
+            + "Submission-id: 1-1453387901516-5d1e2450");
+  }
+
+  @Test
+  public void parseReviewer() throws Exception {
+    assertParseSucceeds(
+        "Update change\n"
+            + "\n"
+            + "Branch: refs/heads/master\n"
+            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
+            + "Patch-set: 1\n"
+            + "Reviewer: Change Owner <1@gerrit>\n"
+            + "CC: Other Account <2@gerrit>\n"
+            + "Subject: This is a test change\n");
+    assertParseFails("Update change\n\nPatch-set: 1\nReviewer: 1@gerrit\n");
+  }
+
+  @Test
+  public void parseTopic() throws Exception {
+    assertParseSucceeds(
+        "Update change\n"
+            + "\n"
+            + "Branch: refs/heads/master\n"
+            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
+            + "Patch-set: 1\n"
+            + "Topic: Some Topic\n"
+            + "Subject: This is a test change\n");
+    assertParseSucceeds(
+        "Update change\n"
+            + "\n"
+            + "Branch: refs/heads/master\n"
+            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
+            + "Patch-set: 1\n"
+            + "Topic:\n"
+            + "Subject: This is a test change\n");
+    assertParseFails("Update change\n\nPatch-set: 1\nTopic: Some Topic\nTopic: Other Topic");
+  }
+
+  @Test
+  public void parseBranch() throws Exception {
+    assertParseSucceeds(
+        "Update change\n"
+            + "\n"
+            + "Branch: refs/heads/master\n"
+            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
+            + "Patch-set: 1\n"
+            + "Subject: This is a test change\n");
+    assertParseSucceeds(
+        "Update change\n"
+            + "\n"
+            + "Branch: master\n"
+            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
+            + "Patch-set: 1\n"
+            + "Subject: This is a test change\n");
+    assertParseFails(
+        "Update change\n"
+            + "\n"
+            + "Patch-set: 1\n"
+            + "Branch: refs/heads/master\n"
+            + "Branch: refs/heads/stable");
+  }
+
+  @Test
+  public void parseChangeId() throws Exception {
+    assertParseSucceeds(
+        "Update change\n"
+            + "\n"
+            + "Branch: refs/heads/master\n"
+            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
+            + "Patch-set: 1\n"
+            + "Subject: This is a test change\n");
+    assertParseFails(
+        "Update change\n"
+            + "\n"
+            + "Patch-set: 1\n"
+            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
+            + "Change-id: I159532ef4844d7c18f7f3fd37a0b275590d41b1b");
+  }
+
+  @Test
+  public void parseSubject() throws Exception {
+    assertParseSucceeds(
+        "Update change\n"
+            + "\n"
+            + "Patch-set: 1\n"
+            + "Branch: refs/heads/master\n"
+            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
+            + "Subject: Some subject of a change\n");
+    assertParseFails(
+        "Update change\n"
+            + "\n"
+            + "Patch-set: 1\n"
+            + "Subject: Some subject of a change\n"
+            + "Subject: Some other subject\n");
+  }
+
+  @Test
+  public void parseCommit() throws Exception {
+    assertParseSucceeds(
+        "Update change\n"
+            + "\n"
+            + "Patch-set: 2\n"
+            + "Branch: refs/heads/master\n"
+            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
+            + "Subject: Some subject of a change\n"
+            + "Commit: abcd1234abcd1234abcd1234abcd1234abcd1234");
+    assertParseFails(
+        "Update change\n"
+            + "\n"
+            + "Patch-set: 2\n"
+            + "Branch: refs/heads/master\n"
+            + "Subject: Some subject of a change\n"
+            + "Commit: abcd1234abcd1234abcd1234abcd1234abcd1234\n"
+            + "Commit: deadbeefdeadbeefdeadbeefdeadbeefdeadbeef");
+    assertParseFails(
+        "Update patch set 1\n"
+            + "Uploaded patch set 1.\n"
+            + "Patch-set: 2\n"
+            + "Branch: refs/heads/master\n"
+            + "Subject: Some subject of a change\n"
+            + "Commit: beef");
+  }
+
+  @Test
+  public void parsePatchSetState() throws Exception {
+    assertParseSucceeds(
+        "Update change\n"
+            + "\n"
+            + "Patch-set: 1 (PUBLISHED)\n"
+            + "Branch: refs/heads/master\n"
+            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
+            + "Subject: Some subject of a change\n");
+    assertParseFails(
+        "Update change\n"
+            + "\n"
+            + "Patch-set: 1 (DRAFT)\n"
+            + "Branch: refs/heads/master\n"
+            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
+            + "Subject: Some subject of a change\n");
+    assertParseSucceeds(
+        "Update change\n"
+            + "\n"
+            + "Patch-set: 1 (DELETED)\n"
+            + "Branch: refs/heads/master\n"
+            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
+            + "Subject: Some subject of a change\n");
+    assertParseFails(
+        "Update change\n"
+            + "\n"
+            + "Patch-set: 1 (NOT A STATUS)\n"
+            + "Branch: refs/heads/master\n"
+            + "Subject: Some subject of a change\n");
+  }
+
+  @Test
+  public void parsePatchSetGroups() throws Exception {
+    assertParseSucceeds(
+        "Update change\n"
+            + "\n"
+            + "Patch-set: 2\n"
+            + "Branch: refs/heads/master\n"
+            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
+            + "Commit: abcd1234abcd1234abcd1234abcd1234abcd1234\n"
+            + "Subject: Change subject\n"
+            + "Groups: a,b,c\n");
+    assertParseFails(
+        "Update change\n"
+            + "\n"
+            + "Patch-set: 2\n"
+            + "Branch: refs/heads/master\n"
+            + "Commit: abcd1234abcd1234abcd1234abcd1234abcd1234\n"
+            + "Subject: Change subject\n"
+            + "Groups: a,b,c\n"
+            + "Groups: d,e,f\n");
+  }
+
+  @Test
+  public void parseServerIdent() throws Exception {
+    String msg =
+        "Update change\n"
+            + "\n"
+            + "Patch-set: 1\n"
+            + "Branch: refs/heads/master\n"
+            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
+            + "Subject: Change subject\n";
+    assertParseSucceeds(msg);
+    assertParseSucceeds(writeCommit(msg, serverIdent));
+
+    msg =
+        "Update change\n"
+            + "\n"
+            + "With a message."
+            + "\n"
+            + "Patch-set: 1\n"
+            + "Branch: refs/heads/master\n"
+            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
+            + "Subject: Change subject\n";
+    assertParseSucceeds(msg);
+    assertParseSucceeds(writeCommit(msg, serverIdent));
+
+    msg =
+        "Update change\n"
+            + "\n"
+            + "Patch-set: 1\n"
+            + "Branch: refs/heads/master\n"
+            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
+            + "Subject: Change subject\n"
+            + "Label: Label1=+1\n";
+    assertParseSucceeds(msg);
+    assertParseFails(writeCommit(msg, serverIdent));
+  }
+
+  @Test
+  public void parseTag() throws Exception {
+    assertParseSucceeds(
+        "Update change\n"
+            + "\n"
+            + "Patch-set: 1\n"
+            + "Branch: refs/heads/master\n"
+            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
+            + "Subject: Change subject\n"
+            + "Tag:\n");
+    assertParseSucceeds(
+        "Update change\n"
+            + "\n"
+            + "Patch-set: 1\n"
+            + "Branch: refs/heads/master\n"
+            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
+            + "Subject: Change subject\n"
+            + "Tag: jenkins\n");
+    assertParseFails(
+        "Update change\n"
+            + "\n"
+            + "Patch-set: 1\n"
+            + "Branch: refs/heads/master\n"
+            + "Change-id: I577fb248e474018276351785930358ec0450e9f7\n"
+            + "Subject: Change subject\n"
+            + "Tag: ci\n"
+            + "Tag: jenkins\n");
+  }
+
+  @Test
+  public void parseWorkInProgress() throws Exception {
+    // Change created in WIP remains in WIP.
+    RevCommit commit = writeCommit("Update WIP change\n" + "\n" + "Patch-set: 1\n", true);
+    ChangeNotesState state = newParser(commit).parseAll();
+    assertThat(state.columns().reviewStarted()).isFalse();
+
+    // Moving change out of WIP starts review.
+    commit =
+        writeCommit("New ready change\n" + "\n" + "Patch-set: 1\n" + "Work-in-progress: false\n");
+    state = newParser(commit).parseAll();
+    assertThat(state.columns().reviewStarted()).isTrue();
+
+    // Change created not in WIP has always been in review started state.
+    state = assertParseSucceeds("New change that doesn't declare WIP\n" + "\n" + "Patch-set: 1\n");
+    assertThat(state.columns().reviewStarted()).isTrue();
+  }
+
+  @Test
+  public void pendingReviewers() throws Exception {
+    // Change created in WIP.
+    RevCommit commit = writeCommit("Update WIP change\n" + "\n" + "Patch-set: 1\n", true);
+    ChangeNotesState state = newParser(commit).parseAll();
+    assertThat(state.pendingReviewers().all()).isEmpty();
+    assertThat(state.pendingReviewersByEmail().all()).isEmpty();
+
+    // Reviewers added while in WIP.
+    commit =
+        writeCommit(
+            "Add reviewers\n"
+                + "\n"
+                + "Patch-set: 1\n"
+                + "Reviewer: Change Owner "
+                + "<1@gerrit>\n",
+            true);
+    state = newParser(commit).parseAll();
+    assertThat(state.pendingReviewers().byState(ReviewerStateInternal.REVIEWER)).isNotEmpty();
+  }
+
+  @Test
+  public void caseInsensitiveFooters() throws Exception {
+    assertParseSucceeds(
+        "Update change\n"
+            + "\n"
+            + "BRaNch: refs/heads/master\n"
+            + "Change-ID: I577fb248e474018276351785930358ec0450e9f7\n"
+            + "patcH-set: 1\n"
+            + "subject: This is a test change\n");
+  }
+
+  @Test
+  public void currentPatchSet() throws Exception {
+    assertParseSucceeds("Update change\n\nPatch-set: 1\nCurrent: true");
+    assertParseSucceeds("Update change\n\nPatch-set: 1\nCurrent: tRUe");
+    assertParseFails("Update change\n\nPatch-set: 1\nCurrent: false");
+    assertParseFails("Update change\n\nPatch-set: 1\nCurrent: blah");
+  }
+
+  private RevCommit writeCommit(String body) throws Exception {
+    ChangeNoteUtil noteUtil = injector.getInstance(ChangeNoteUtil.class);
+    return writeCommit(
+        body, noteUtil.newIdent(changeOwner.getAccount(), TimeUtil.nowTs(), serverIdent), false);
+  }
+
+  private RevCommit writeCommit(String body, PersonIdent author) throws Exception {
+    return writeCommit(body, author, false);
+  }
+
+  private RevCommit writeCommit(String body, boolean initWorkInProgress) throws Exception {
+    ChangeNoteUtil noteUtil = injector.getInstance(ChangeNoteUtil.class);
+    return writeCommit(
+        body,
+        noteUtil.newIdent(changeOwner.getAccount(), TimeUtil.nowTs(), serverIdent),
+        initWorkInProgress);
+  }
+
+  private RevCommit writeCommit(String body, PersonIdent author, boolean initWorkInProgress)
+      throws Exception {
+    Change change = newChange(initWorkInProgress);
+    ChangeNotes notes = newNotes(change).load();
+    try (ObjectInserter ins = testRepo.getRepository().newObjectInserter()) {
+      CommitBuilder cb = new CommitBuilder();
+      cb.setParentId(notes.getRevision());
+      cb.setAuthor(author);
+      cb.setCommitter(new PersonIdent(serverIdent, author.getWhen()));
+      cb.setTreeId(testRepo.tree());
+      cb.setMessage(body);
+      ObjectId id = ins.insert(cb);
+      ins.flush();
+      RevCommit commit = walk.parseCommit(id);
+      walk.parseBody(commit);
+      return commit;
+    }
+  }
+
+  private ChangeNotesState assertParseSucceeds(String body) throws Exception {
+    return assertParseSucceeds(writeCommit(body));
+  }
+
+  private ChangeNotesState assertParseSucceeds(RevCommit commit) throws Exception {
+    return newParser(commit).parseAll();
+  }
+
+  private void assertParseFails(String body) throws Exception {
+    assertParseFails(writeCommit(body));
+  }
+
+  private void assertParseFails(RevCommit commit) throws Exception {
+    try {
+      newParser(commit).parseAll();
+      fail("Expected parse to fail:\n" + commit.getFullMessage());
+    } catch (ConfigInvalidException e) {
+      // Expected
+    }
+  }
+
+  private ChangeNotesParser newParser(ObjectId tip) throws Exception {
+    walk.reset();
+    ChangeNoteJson changeNoteJson = injector.getInstance(ChangeNoteJson.class);
+    LegacyChangeNoteRead reader = injector.getInstance(LegacyChangeNoteRead.class);
+    return new ChangeNotesParser(
+        newChange().getId(), tip, walk, changeNoteJson, reader, args.metrics);
+  }
+}
diff --git a/javatests/com/google/gerrit/server/notedb/ChangeNotesStateTest.java b/javatests/com/google/gerrit/server/notedb/ChangeNotesStateTest.java
new file mode 100644
index 0000000..7b41ba3
--- /dev/null
+++ b/javatests/com/google/gerrit/server/notedb/ChangeNotesStateTest.java
@@ -0,0 +1,946 @@
+// 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.
+
+package com.google.gerrit.server.notedb;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.extensions.proto.ProtoTruth.assertThat;
+import static com.google.gerrit.reviewdb.server.ReviewDbCodecs.APPROVAL_CODEC;
+import static com.google.gerrit.reviewdb.server.ReviewDbCodecs.MESSAGE_CODEC;
+import static com.google.gerrit.reviewdb.server.ReviewDbCodecs.PATCH_SET_CODEC;
+import static com.google.gerrit.server.cache.serialize.ProtoCacheSerializers.toByteString;
+import static com.google.gerrit.server.cache.testing.SerializedClassSubject.assertThatSerializedClass;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableTable;
+import com.google.common.collect.Iterables;
+import com.google.gerrit.common.data.SubmitRecord;
+import com.google.gerrit.common.data.SubmitRequirement;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.LabelId;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.client.RevId;
+import com.google.gerrit.server.ReviewerByEmailSet;
+import com.google.gerrit.server.ReviewerSet;
+import com.google.gerrit.server.ReviewerStatusUpdate;
+import com.google.gerrit.server.cache.proto.Cache.ChangeNotesStateProto;
+import com.google.gerrit.server.cache.proto.Cache.ChangeNotesStateProto.ChangeColumnsProto;
+import com.google.gerrit.server.cache.proto.Cache.ChangeNotesStateProto.ReviewerByEmailSetEntryProto;
+import com.google.gerrit.server.cache.proto.Cache.ChangeNotesStateProto.ReviewerSetEntryProto;
+import com.google.gerrit.server.cache.proto.Cache.ChangeNotesStateProto.ReviewerStatusUpdateProto;
+import com.google.gerrit.server.cache.serialize.ProtoCacheSerializers.ObjectIdConverter;
+import com.google.gerrit.server.notedb.ChangeNotesState.ChangeColumns;
+import com.google.gerrit.server.notedb.ChangeNotesState.Serializer;
+import com.google.gwtorm.client.KeyUtil;
+import com.google.gwtorm.server.StandardKeyEncoder;
+import com.google.inject.TypeLiteral;
+import com.google.protobuf.ByteString;
+import java.lang.reflect.Type;
+import java.sql.Timestamp;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.jgit.lib.ObjectId;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ChangeNotesStateTest {
+  static {
+    KeyUtil.setEncoderImpl(new StandardKeyEncoder());
+  }
+
+  private static final Change.Id ID = new Change.Id(123);
+  private static final ObjectId SHA =
+      ObjectId.fromString("1234567812345678123456781234567812345678");
+  private static final ByteString SHA_BYTES = ObjectIdConverter.create().toByteString(SHA);
+  private static final String CHANGE_KEY = "Iabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd";
+
+  private ChangeColumns cols;
+  private ChangeColumnsProto colsProto;
+
+  @Before
+  public void setUp() throws Exception {
+    cols =
+        ChangeColumns.builder()
+            .changeKey(new Change.Key(CHANGE_KEY))
+            .createdOn(new Timestamp(123456L))
+            .lastUpdatedOn(new Timestamp(234567L))
+            .owner(new Account.Id(1000))
+            .branch("refs/heads/master")
+            .subject("Test change")
+            .isPrivate(false)
+            .workInProgress(false)
+            .reviewStarted(true)
+            .build();
+    colsProto = toProto(newBuilder().build()).getColumns();
+  }
+
+  private ChangeNotesState.Builder newBuilder() {
+    return ChangeNotesState.Builder.empty(ID).metaId(SHA).columns(cols);
+  }
+
+  @Test
+  public void serializeChangeKey() throws Exception {
+    assertRoundTrip(
+        newBuilder()
+            .columns(
+                cols.toBuilder()
+                    .changeKey(new Change.Key("Ieeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"))
+                    .build())
+            .build(),
+        ChangeNotesStateProto.newBuilder()
+            .setMetaId(SHA_BYTES)
+            .setChangeId(ID.get())
+            .setColumns(
+                colsProto.toBuilder().setChangeKey("Ieeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"))
+            .build());
+  }
+
+  @Test
+  public void serializeCreatedOn() throws Exception {
+    assertRoundTrip(
+        newBuilder().columns(cols.toBuilder().createdOn(new Timestamp(98765L)).build()).build(),
+        ChangeNotesStateProto.newBuilder()
+            .setMetaId(SHA_BYTES)
+            .setChangeId(ID.get())
+            .setColumns(colsProto.toBuilder().setCreatedOn(98765L))
+            .build());
+  }
+
+  @Test
+  public void serializeLastUpdatedOn() throws Exception {
+    assertRoundTrip(
+        newBuilder().columns(cols.toBuilder().lastUpdatedOn(new Timestamp(98765L)).build()).build(),
+        ChangeNotesStateProto.newBuilder()
+            .setMetaId(SHA_BYTES)
+            .setChangeId(ID.get())
+            .setColumns(colsProto.toBuilder().setLastUpdatedOn(98765L))
+            .build());
+  }
+
+  @Test
+  public void serializeOwner() throws Exception {
+    assertRoundTrip(
+        newBuilder().columns(cols.toBuilder().owner(new Account.Id(7777)).build()).build(),
+        ChangeNotesStateProto.newBuilder()
+            .setMetaId(SHA_BYTES)
+            .setChangeId(ID.get())
+            .setColumns(colsProto.toBuilder().setOwner(7777))
+            .build());
+  }
+
+  @Test
+  public void serializeBranch() throws Exception {
+    assertRoundTrip(
+        newBuilder().columns(cols.toBuilder().branch("refs/heads/bar").build()).build(),
+        ChangeNotesStateProto.newBuilder()
+            .setMetaId(SHA_BYTES)
+            .setChangeId(ID.get())
+            .setColumns(colsProto.toBuilder().setBranch("refs/heads/bar"))
+            .build());
+  }
+
+  @Test
+  public void serializeSubject() throws Exception {
+    assertRoundTrip(
+        newBuilder().columns(cols.toBuilder().subject("A different test change").build()).build(),
+        ChangeNotesStateProto.newBuilder()
+            .setMetaId(SHA_BYTES)
+            .setChangeId(ID.get())
+            .setColumns(colsProto.toBuilder().setSubject("A different test change"))
+            .build());
+  }
+
+  @Test
+  public void serializeCurrentPatchSetId() throws Exception {
+    assertRoundTrip(
+        newBuilder()
+            .columns(cols.toBuilder().currentPatchSetId(new PatchSet.Id(ID, 2)).build())
+            .build(),
+        ChangeNotesStateProto.newBuilder()
+            .setMetaId(SHA_BYTES)
+            .setChangeId(ID.get())
+            .setColumns(colsProto.toBuilder().setCurrentPatchSetId(2).setHasCurrentPatchSetId(true))
+            .build());
+  }
+
+  @Test
+  public void serializeNullTopic() throws Exception {
+    assertRoundTrip(
+        newBuilder().columns(cols.toBuilder().topic(null).build()).build(),
+        ChangeNotesStateProto.newBuilder()
+            .setMetaId(SHA_BYTES)
+            .setChangeId(ID.get())
+            .setColumns(colsProto)
+            .build());
+  }
+
+  @Test
+  public void serializeEmptyTopic() throws Exception {
+    ChangeNotesState state = newBuilder().columns(cols.toBuilder().topic("").build()).build();
+    assertRoundTrip(
+        state,
+        ChangeNotesStateProto.newBuilder()
+            .setMetaId(SHA_BYTES)
+            .setChangeId(ID.get())
+            .setColumns(colsProto.toBuilder().setTopic("").setHasTopic(true))
+            .build());
+  }
+
+  @Test
+  public void serializeNonEmptyTopic() throws Exception {
+    ChangeNotesState state = newBuilder().columns(cols.toBuilder().topic("topic").build()).build();
+    assertRoundTrip(
+        state,
+        ChangeNotesStateProto.newBuilder()
+            .setMetaId(SHA_BYTES)
+            .setChangeId(ID.get())
+            .setColumns(colsProto.toBuilder().setTopic("topic").setHasTopic(true))
+            .build());
+  }
+
+  @Test
+  public void serializeOriginalSubject() throws Exception {
+    assertRoundTrip(
+        newBuilder()
+            .columns(cols.toBuilder().originalSubject("The first patch set").build())
+            .build(),
+        ChangeNotesStateProto.newBuilder()
+            .setMetaId(SHA_BYTES)
+            .setChangeId(ID.get())
+            .setColumns(
+                colsProto
+                    .toBuilder()
+                    .setOriginalSubject("The first patch set")
+                    .setHasOriginalSubject(true))
+            .build());
+  }
+
+  @Test
+  public void serializeSubmissionId() throws Exception {
+    assertRoundTrip(
+        newBuilder().columns(cols.toBuilder().submissionId("xyz").build()).build(),
+        ChangeNotesStateProto.newBuilder()
+            .setMetaId(SHA_BYTES)
+            .setChangeId(ID.get())
+            .setColumns(colsProto.toBuilder().setSubmissionId("xyz").setHasSubmissionId(true))
+            .build());
+  }
+
+  @Test
+  public void serializeAssignee() throws Exception {
+    assertRoundTrip(
+        newBuilder().columns(cols.toBuilder().assignee(new Account.Id(2000)).build()).build(),
+        ChangeNotesStateProto.newBuilder()
+            .setMetaId(SHA_BYTES)
+            .setChangeId(ID.get())
+            .setColumns(colsProto.toBuilder().setAssignee(2000).setHasAssignee(true))
+            .build());
+  }
+
+  @Test
+  public void serializeStatus() throws Exception {
+    assertRoundTrip(
+        newBuilder().columns(cols.toBuilder().status(Change.Status.MERGED).build()).build(),
+        ChangeNotesStateProto.newBuilder()
+            .setMetaId(SHA_BYTES)
+            .setChangeId(ID.get())
+            .setColumns(colsProto.toBuilder().setStatus("MERGED").setHasStatus(true))
+            .build());
+  }
+
+  @Test
+  public void serializeIsPrivate() throws Exception {
+    assertRoundTrip(
+        newBuilder().columns(cols.toBuilder().isPrivate(true).build()).build(),
+        ChangeNotesStateProto.newBuilder()
+            .setMetaId(SHA_BYTES)
+            .setChangeId(ID.get())
+            .setColumns(colsProto.toBuilder().setIsPrivate(true))
+            .build());
+  }
+
+  @Test
+  public void serializeIsWorkInProgress() throws Exception {
+    assertRoundTrip(
+        newBuilder().columns(cols.toBuilder().workInProgress(true).build()).build(),
+        ChangeNotesStateProto.newBuilder()
+            .setMetaId(SHA_BYTES)
+            .setChangeId(ID.get())
+            .setColumns(colsProto.toBuilder().setWorkInProgress(true))
+            .build());
+  }
+
+  @Test
+  public void serializeHasReviewStarted() throws Exception {
+    assertRoundTrip(
+        newBuilder().columns(cols.toBuilder().reviewStarted(true).build()).build(),
+        ChangeNotesStateProto.newBuilder()
+            .setMetaId(SHA_BYTES)
+            .setChangeId(ID.get())
+            .setColumns(colsProto.toBuilder().setReviewStarted(true))
+            .build());
+  }
+
+  @Test
+  public void serializeRevertOf() throws Exception {
+    assertRoundTrip(
+        newBuilder().columns(cols.toBuilder().revertOf(new Change.Id(999)).build()).build(),
+        ChangeNotesStateProto.newBuilder()
+            .setMetaId(SHA_BYTES)
+            .setChangeId(ID.get())
+            .setColumns(colsProto.toBuilder().setRevertOf(999).setHasRevertOf(true))
+            .build());
+  }
+
+  @Test
+  public void serializePastAssignees() throws Exception {
+    assertRoundTrip(
+        newBuilder()
+            .pastAssignees(ImmutableSet.of(new Account.Id(2002), new Account.Id(2001)))
+            .build(),
+        ChangeNotesStateProto.newBuilder()
+            .setMetaId(SHA_BYTES)
+            .setChangeId(ID.get())
+            .setColumns(colsProto)
+            .addPastAssignee(2002)
+            .addPastAssignee(2001)
+            .build());
+  }
+
+  @Test
+  public void serializeHashtags() throws Exception {
+    assertRoundTrip(
+        newBuilder().hashtags(ImmutableSet.of("tag2", "tag1")).build(),
+        ChangeNotesStateProto.newBuilder()
+            .setMetaId(SHA_BYTES)
+            .setChangeId(ID.get())
+            .setColumns(colsProto)
+            .addHashtag("tag2")
+            .addHashtag("tag1")
+            .build());
+  }
+
+  @Test
+  public void serializePatchSets() throws Exception {
+    PatchSet ps1 = new PatchSet(new PatchSet.Id(ID, 1));
+    ps1.setUploader(new Account.Id(2000));
+    ps1.setRevision(new RevId("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"));
+    ps1.setCreatedOn(cols.createdOn());
+    ByteString ps1Bytes = toByteString(ps1, PATCH_SET_CODEC);
+    assertThat(ps1Bytes.size()).isEqualTo(66);
+
+    PatchSet ps2 = new PatchSet(new PatchSet.Id(ID, 2));
+    ps2.setUploader(new Account.Id(3000));
+    ps2.setRevision(new RevId("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"));
+    ps2.setCreatedOn(cols.lastUpdatedOn());
+    ByteString ps2Bytes = toByteString(ps2, PATCH_SET_CODEC);
+    assertThat(ps2Bytes.size()).isEqualTo(66);
+    assertThat(ps2Bytes).isNotEqualTo(ps1Bytes);
+
+    assertRoundTrip(
+        newBuilder()
+            .patchSets(ImmutableMap.of(ps2.getId(), ps2, ps1.getId(), ps1).entrySet())
+            .build(),
+        ChangeNotesStateProto.newBuilder()
+            .setMetaId(SHA_BYTES)
+            .setChangeId(ID.get())
+            .setColumns(colsProto)
+            .addPatchSet(ps2Bytes)
+            .addPatchSet(ps1Bytes)
+            .build());
+  }
+
+  @Test
+  public void serializeApprovals() throws Exception {
+    PatchSetApproval a1 =
+        new PatchSetApproval(
+            new PatchSetApproval.Key(
+                new PatchSet.Id(ID, 1), new Account.Id(2001), new LabelId("Code-Review")),
+            (short) 1,
+            new Timestamp(1212L));
+    ByteString a1Bytes = toByteString(a1, APPROVAL_CODEC);
+    assertThat(a1Bytes.size()).isEqualTo(43);
+
+    PatchSetApproval a2 =
+        new PatchSetApproval(
+            new PatchSetApproval.Key(
+                new PatchSet.Id(ID, 1), new Account.Id(2002), new LabelId("Verified")),
+            (short) -1,
+            new Timestamp(3434L));
+    ByteString a2Bytes = toByteString(a2, APPROVAL_CODEC);
+    assertThat(a2Bytes.size()).isEqualTo(49);
+    assertThat(a2Bytes).isNotEqualTo(a1Bytes);
+
+    assertRoundTrip(
+        newBuilder()
+            .approvals(
+                ImmutableListMultimap.of(a2.getPatchSetId(), a2, a1.getPatchSetId(), a1).entries())
+            .build(),
+        ChangeNotesStateProto.newBuilder()
+            .setMetaId(SHA_BYTES)
+            .setChangeId(ID.get())
+            .setColumns(colsProto)
+            .addApproval(a2Bytes)
+            .addApproval(a1Bytes)
+            .build());
+  }
+
+  @Test
+  public void serializeReviewers() throws Exception {
+    assertRoundTrip(
+        newBuilder()
+            .reviewers(
+                ReviewerSet.fromTable(
+                    ImmutableTable.<ReviewerStateInternal, Account.Id, Timestamp>builder()
+                        .put(ReviewerStateInternal.CC, new Account.Id(2001), new Timestamp(1212L))
+                        .put(
+                            ReviewerStateInternal.REVIEWER,
+                            new Account.Id(2002),
+                            new Timestamp(3434L))
+                        .build()))
+            .build(),
+        ChangeNotesStateProto.newBuilder()
+            .setMetaId(SHA_BYTES)
+            .setChangeId(ID.get())
+            .setColumns(colsProto)
+            .addReviewer(
+                ReviewerSetEntryProto.newBuilder()
+                    .setState("CC")
+                    .setAccountId(2001)
+                    .setTimestamp(1212L))
+            .addReviewer(
+                ReviewerSetEntryProto.newBuilder()
+                    .setState("REVIEWER")
+                    .setAccountId(2002)
+                    .setTimestamp(3434L))
+            .build());
+  }
+
+  @Test
+  public void serializeReviewersByEmail() throws Exception {
+    assertRoundTrip(
+        newBuilder()
+            .reviewersByEmail(
+                ReviewerByEmailSet.fromTable(
+                    ImmutableTable.<ReviewerStateInternal, Address, Timestamp>builder()
+                        .put(
+                            ReviewerStateInternal.CC,
+                            new Address("Name1", "email1@example.com"),
+                            new Timestamp(1212L))
+                        .put(
+                            ReviewerStateInternal.REVIEWER,
+                            new Address("Name2", "email2@example.com"),
+                            new Timestamp(3434L))
+                        .build()))
+            .build(),
+        ChangeNotesStateProto.newBuilder()
+            .setMetaId(SHA_BYTES)
+            .setChangeId(ID.get())
+            .setColumns(colsProto)
+            .addReviewerByEmail(
+                ReviewerByEmailSetEntryProto.newBuilder()
+                    .setState("CC")
+                    .setAddress("Name1 <email1@example.com>")
+                    .setTimestamp(1212L))
+            .addReviewerByEmail(
+                ReviewerByEmailSetEntryProto.newBuilder()
+                    .setState("REVIEWER")
+                    .setAddress("Name2 <email2@example.com>")
+                    .setTimestamp(3434L))
+            .build());
+  }
+
+  @Test
+  public void serializeReviewersByEmailWithNullName() throws Exception {
+    ChangeNotesState actual =
+        assertRoundTrip(
+            newBuilder()
+                .reviewersByEmail(
+                    ReviewerByEmailSet.fromTable(
+                        ImmutableTable.of(
+                            ReviewerStateInternal.CC,
+                            new Address("emailonly@example.com"),
+                            new Timestamp(1212L))))
+                .build(),
+            ChangeNotesStateProto.newBuilder()
+                .setMetaId(SHA_BYTES)
+                .setChangeId(ID.get())
+                .setColumns(colsProto)
+                .addReviewerByEmail(
+                    ReviewerByEmailSetEntryProto.newBuilder()
+                        .setState("CC")
+                        .setAddress("emailonly@example.com")
+                        .setTimestamp(1212L))
+                .build());
+
+    // Address doesn't consider the name field in equals, so we have to check it manually.
+    // TODO(dborowitz): Fix Address#equals.
+    ImmutableSet<Address> ccs = actual.reviewersByEmail().byState(ReviewerStateInternal.CC);
+    assertThat(ccs).hasSize(1);
+    Address address = Iterables.getOnlyElement(ccs);
+    assertThat(address.getName()).isNull();
+    assertThat(address.getEmail()).isEqualTo("emailonly@example.com");
+  }
+
+  @Test
+  public void serializePendingReviewers() throws Exception {
+    assertRoundTrip(
+        newBuilder()
+            .pendingReviewers(
+                ReviewerSet.fromTable(
+                    ImmutableTable.<ReviewerStateInternal, Account.Id, Timestamp>builder()
+                        .put(ReviewerStateInternal.CC, new Account.Id(2001), new Timestamp(1212L))
+                        .put(
+                            ReviewerStateInternal.REVIEWER,
+                            new Account.Id(2002),
+                            new Timestamp(3434L))
+                        .build()))
+            .build(),
+        ChangeNotesStateProto.newBuilder()
+            .setMetaId(SHA_BYTES)
+            .setChangeId(ID.get())
+            .setColumns(colsProto)
+            .addPendingReviewer(
+                ReviewerSetEntryProto.newBuilder()
+                    .setState("CC")
+                    .setAccountId(2001)
+                    .setTimestamp(1212L))
+            .addPendingReviewer(
+                ReviewerSetEntryProto.newBuilder()
+                    .setState("REVIEWER")
+                    .setAccountId(2002)
+                    .setTimestamp(3434L))
+            .build());
+  }
+
+  @Test
+  public void serializePendingReviewersByEmail() throws Exception {
+    assertRoundTrip(
+        newBuilder()
+            .pendingReviewersByEmail(
+                ReviewerByEmailSet.fromTable(
+                    ImmutableTable.<ReviewerStateInternal, Address, Timestamp>builder()
+                        .put(
+                            ReviewerStateInternal.CC,
+                            new Address("Name1", "email1@example.com"),
+                            new Timestamp(1212L))
+                        .put(
+                            ReviewerStateInternal.REVIEWER,
+                            new Address("Name2", "email2@example.com"),
+                            new Timestamp(3434L))
+                        .build()))
+            .build(),
+        ChangeNotesStateProto.newBuilder()
+            .setMetaId(SHA_BYTES)
+            .setChangeId(ID.get())
+            .setColumns(colsProto)
+            .addPendingReviewerByEmail(
+                ReviewerByEmailSetEntryProto.newBuilder()
+                    .setState("CC")
+                    .setAddress("Name1 <email1@example.com>")
+                    .setTimestamp(1212L))
+            .addPendingReviewerByEmail(
+                ReviewerByEmailSetEntryProto.newBuilder()
+                    .setState("REVIEWER")
+                    .setAddress("Name2 <email2@example.com>")
+                    .setTimestamp(3434L))
+            .build());
+  }
+
+  @Test
+  public void serializeAllPastReviewers() throws Exception {
+    assertRoundTrip(
+        newBuilder()
+            .allPastReviewers(ImmutableList.of(new Account.Id(2002), new Account.Id(2001)))
+            .build(),
+        ChangeNotesStateProto.newBuilder()
+            .setMetaId(SHA_BYTES)
+            .setChangeId(ID.get())
+            .setColumns(colsProto)
+            .addPastReviewer(2002)
+            .addPastReviewer(2001)
+            .build());
+  }
+
+  @Test
+  public void serializeReviewerUpdates() throws Exception {
+    assertRoundTrip(
+        newBuilder()
+            .reviewerUpdates(
+                ImmutableList.of(
+                    ReviewerStatusUpdate.create(
+                        new Timestamp(1212L),
+                        new Account.Id(1000),
+                        new Account.Id(2002),
+                        ReviewerStateInternal.CC),
+                    ReviewerStatusUpdate.create(
+                        new Timestamp(3434L),
+                        new Account.Id(1000),
+                        new Account.Id(2001),
+                        ReviewerStateInternal.REVIEWER)))
+            .build(),
+        ChangeNotesStateProto.newBuilder()
+            .setMetaId(SHA_BYTES)
+            .setChangeId(ID.get())
+            .setColumns(colsProto)
+            .addReviewerUpdate(
+                ReviewerStatusUpdateProto.newBuilder()
+                    .setDate(1212L)
+                    .setUpdatedBy(1000)
+                    .setReviewer(2002)
+                    .setState("CC"))
+            .addReviewerUpdate(
+                ReviewerStatusUpdateProto.newBuilder()
+                    .setDate(3434L)
+                    .setUpdatedBy(1000)
+                    .setReviewer(2001)
+                    .setState("REVIEWER"))
+            .build());
+  }
+
+  @Test
+  public void serializeSubmitRecords() throws Exception {
+    SubmitRecord sr1 = new SubmitRecord();
+    sr1.status = SubmitRecord.Status.OK;
+
+    SubmitRecord sr2 = new SubmitRecord();
+    sr2.status = SubmitRecord.Status.FORCED;
+
+    assertRoundTrip(
+        newBuilder().submitRecords(ImmutableList.of(sr2, sr1)).build(),
+        ChangeNotesStateProto.newBuilder()
+            .setMetaId(SHA_BYTES)
+            .setChangeId(ID.get())
+            .setColumns(colsProto)
+            .addSubmitRecord("{\"status\":\"FORCED\"}")
+            .addSubmitRecord("{\"status\":\"OK\"}")
+            .build());
+  }
+
+  @Test
+  public void serializeChangeMessages() throws Exception {
+    ChangeMessage m1 =
+        new ChangeMessage(
+            new ChangeMessage.Key(ID, "uuid1"),
+            new Account.Id(1000),
+            new Timestamp(1212L),
+            new PatchSet.Id(ID, 1));
+    ByteString m1Bytes = toByteString(m1, MESSAGE_CODEC);
+    assertThat(m1Bytes.size()).isEqualTo(35);
+
+    ChangeMessage m2 =
+        new ChangeMessage(
+            new ChangeMessage.Key(ID, "uuid2"),
+            new Account.Id(2000),
+            new Timestamp(3434L),
+            new PatchSet.Id(ID, 2));
+    ByteString m2Bytes = toByteString(m2, MESSAGE_CODEC);
+    assertThat(m2Bytes.size()).isEqualTo(35);
+    assertThat(m2Bytes).isNotEqualTo(m1Bytes);
+
+    assertRoundTrip(
+        newBuilder().changeMessages(ImmutableList.of(m2, m1)).build(),
+        ChangeNotesStateProto.newBuilder()
+            .setMetaId(SHA_BYTES)
+            .setChangeId(ID.get())
+            .setColumns(colsProto)
+            .addChangeMessage(m2Bytes)
+            .addChangeMessage(m1Bytes)
+            .build());
+  }
+
+  @Test
+  public void serializePublishedComments() throws Exception {
+    Comment c1 =
+        new Comment(
+            new Comment.Key("uuid1", "file1", 1),
+            new Account.Id(1001),
+            new Timestamp(1212L),
+            (short) 1,
+            "message 1",
+            "serverId",
+            false);
+    c1.setRevId(new RevId("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"));
+    String c1Json = Serializer.GSON.toJson(c1);
+
+    Comment c2 =
+        new Comment(
+            new Comment.Key("uuid2", "file2", 2),
+            new Account.Id(1002),
+            new Timestamp(3434L),
+            (short) 2,
+            "message 2",
+            "serverId",
+            true);
+    c2.setRevId(new RevId("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"));
+    String c2Json = Serializer.GSON.toJson(c2);
+
+    assertRoundTrip(
+        newBuilder()
+            .publishedComments(
+                ImmutableListMultimap.of(new RevId(c2.revId), c2, new RevId(c1.revId), c1))
+            .build(),
+        ChangeNotesStateProto.newBuilder()
+            .setMetaId(SHA_BYTES)
+            .setChangeId(ID.get())
+            .setColumns(colsProto)
+            .addPublishedComment(c2Json)
+            .addPublishedComment(c1Json)
+            .build());
+  }
+
+  @Test
+  public void serializeReadOnlyUntil() throws Exception {
+    assertRoundTrip(
+        newBuilder().readOnlyUntil(new Timestamp(1212L)).build(),
+        ChangeNotesStateProto.newBuilder()
+            .setMetaId(SHA_BYTES)
+            .setChangeId(ID.get())
+            .setColumns(colsProto)
+            .setReadOnlyUntil(1212L)
+            .setHasReadOnlyUntil(true)
+            .build());
+  }
+
+  @Test
+  public void changeNotesStateMethods() throws Exception {
+    assertThatSerializedClass(ChangeNotesState.class)
+        .hasAutoValueMethods(
+            ImmutableMap.<String, Type>builder()
+                .put("metaId", ObjectId.class)
+                .put("changeId", Change.Id.class)
+                .put("columns", ChangeColumns.class)
+                .put("pastAssignees", new TypeLiteral<ImmutableSet<Account.Id>>() {}.getType())
+                .put("hashtags", new TypeLiteral<ImmutableSet<String>>() {}.getType())
+                .put(
+                    "patchSets",
+                    new TypeLiteral<ImmutableList<Map.Entry<PatchSet.Id, PatchSet>>>() {}.getType())
+                .put(
+                    "approvals",
+                    new TypeLiteral<
+                        ImmutableList<Map.Entry<PatchSet.Id, PatchSetApproval>>>() {}.getType())
+                .put("reviewers", ReviewerSet.class)
+                .put("reviewersByEmail", ReviewerByEmailSet.class)
+                .put("pendingReviewers", ReviewerSet.class)
+                .put("pendingReviewersByEmail", ReviewerByEmailSet.class)
+                .put("allPastReviewers", new TypeLiteral<ImmutableList<Account.Id>>() {}.getType())
+                .put(
+                    "reviewerUpdates",
+                    new TypeLiteral<ImmutableList<ReviewerStatusUpdate>>() {}.getType())
+                .put("submitRecords", new TypeLiteral<ImmutableList<SubmitRecord>>() {}.getType())
+                .put("changeMessages", new TypeLiteral<ImmutableList<ChangeMessage>>() {}.getType())
+                .put(
+                    "publishedComments",
+                    new TypeLiteral<ImmutableListMultimap<RevId, Comment>>() {}.getType())
+                .put("readOnlyUntil", Timestamp.class)
+                .build());
+  }
+
+  @Test
+  public void changeColumnsMethods() throws Exception {
+    assertThatSerializedClass(ChangeColumns.class)
+        .hasAutoValueMethods(
+            ImmutableMap.<String, Type>builder()
+                .put("changeKey", Change.Key.class)
+                .put("createdOn", Timestamp.class)
+                .put("lastUpdatedOn", Timestamp.class)
+                .put("owner", Account.Id.class)
+                .put("branch", String.class)
+                .put("currentPatchSetId", PatchSet.Id.class)
+                .put("subject", String.class)
+                .put("topic", String.class)
+                .put("originalSubject", String.class)
+                .put("submissionId", String.class)
+                .put("assignee", Account.Id.class)
+                .put("status", Change.Status.class)
+                .put("isPrivate", boolean.class)
+                .put("workInProgress", boolean.class)
+                .put("reviewStarted", boolean.class)
+                .put("revertOf", Change.Id.class)
+                .put("toBuilder", ChangeNotesState.ChangeColumns.Builder.class)
+                .build());
+  }
+
+  @Test
+  public void patchSetFields() throws Exception {
+    assertThatSerializedClass(PatchSet.class)
+        .hasFields(
+            ImmutableMap.<String, Type>builder()
+                .put("id", PatchSet.Id.class)
+                .put("revision", RevId.class)
+                .put("uploader", Account.Id.class)
+                .put("createdOn", Timestamp.class)
+                .put("groups", String.class)
+                .put("pushCertificate", String.class)
+                .put("description", String.class)
+                .build());
+  }
+
+  @Test
+  public void patchSetApprovalFields() throws Exception {
+    assertThatSerializedClass(PatchSetApproval.Key.class)
+        .hasFields(
+            ImmutableMap.<String, Type>builder()
+                .put("patchSetId", PatchSet.Id.class)
+                .put("accountId", Account.Id.class)
+                .put("categoryId", LabelId.class)
+                .build());
+    assertThatSerializedClass(PatchSetApproval.class)
+        .hasFields(
+            ImmutableMap.<String, Type>builder()
+                .put("key", PatchSetApproval.Key.class)
+                .put("value", short.class)
+                .put("granted", Timestamp.class)
+                .put("tag", String.class)
+                .put("realAccountId", Account.Id.class)
+                .put("postSubmit", boolean.class)
+                .build());
+  }
+
+  @Test
+  public void reviewerSetFields() throws Exception {
+    assertThatSerializedClass(ReviewerSet.class)
+        .hasFields(
+            ImmutableMap.of(
+                "table",
+                    new TypeLiteral<
+                        ImmutableTable<
+                            ReviewerStateInternal, Account.Id, Timestamp>>() {}.getType(),
+                "accounts", new TypeLiteral<ImmutableSet<Account.Id>>() {}.getType()));
+  }
+
+  @Test
+  public void reviewerByEmailSetFields() throws Exception {
+    assertThatSerializedClass(ReviewerByEmailSet.class)
+        .hasFields(
+            ImmutableMap.of(
+                "table",
+                    new TypeLiteral<
+                        ImmutableTable<ReviewerStateInternal, Address, Timestamp>>() {}.getType(),
+                "users", new TypeLiteral<ImmutableSet<Address>>() {}.getType()));
+  }
+
+  @Test
+  public void reviewerStatusUpdateMethods() throws Exception {
+    assertThatSerializedClass(ReviewerStatusUpdate.class)
+        .hasAutoValueMethods(
+            ImmutableMap.of(
+                "date", Timestamp.class,
+                "updatedBy", Account.Id.class,
+                "reviewer", Account.Id.class,
+                "state", ReviewerStateInternal.class));
+  }
+
+  @Test
+  public void submitRecordFields() throws Exception {
+    assertThatSerializedClass(SubmitRecord.class)
+        .hasFields(
+            ImmutableMap.of(
+                "status",
+                SubmitRecord.Status.class,
+                "labels",
+                new TypeLiteral<List<SubmitRecord.Label>>() {}.getType(),
+                "requirements",
+                new TypeLiteral<List<SubmitRequirement>>() {}.getType(),
+                "errorMessage",
+                String.class));
+    assertThatSerializedClass(SubmitRecord.Label.class)
+        .hasFields(
+            ImmutableMap.of(
+                "label", String.class,
+                "status", SubmitRecord.Label.Status.class,
+                "appliedBy", Account.Id.class));
+    assertThatSerializedClass(SubmitRequirement.class)
+        .hasAutoValueMethods(
+            ImmutableMap.of(
+                "fallbackText", String.class,
+                "type", String.class,
+                "data", new TypeLiteral<ImmutableMap<String, String>>() {}.getType()));
+  }
+
+  @Test
+  public void changeMessageFields() throws Exception {
+    assertThatSerializedClass(ChangeMessage.Key.class)
+        .hasFields(ImmutableMap.of("changeId", Change.Id.class, "uuid", String.class));
+    assertThatSerializedClass(ChangeMessage.class)
+        .hasFields(
+            ImmutableMap.<String, Type>builder()
+                .put("key", ChangeMessage.Key.class)
+                .put("author", Account.Id.class)
+                .put("writtenOn", Timestamp.class)
+                .put("message", String.class)
+                .put("patchset", PatchSet.Id.class)
+                .put("tag", String.class)
+                .put("realAuthor", Account.Id.class)
+                .build());
+  }
+
+  @Test
+  public void commentFields() throws Exception {
+    assertThatSerializedClass(Comment.Key.class)
+        .hasFields(
+            ImmutableMap.of(
+                "uuid", String.class, "filename", String.class, "patchSetId", int.class));
+    assertThatSerializedClass(Comment.Identity.class).hasFields(ImmutableMap.of("id", int.class));
+    assertThatSerializedClass(Comment.Range.class)
+        .hasFields(
+            ImmutableMap.of(
+                "startLine", int.class,
+                "startChar", int.class,
+                "endLine", int.class,
+                "endChar", int.class));
+    assertThatSerializedClass(Comment.class)
+        .hasFields(
+            ImmutableMap.<String, Type>builder()
+                .put("key", Comment.Key.class)
+                .put("lineNbr", int.class)
+                .put("author", Comment.Identity.class)
+                .put("realAuthor", Comment.Identity.class)
+                .put("writtenOn", Timestamp.class)
+                .put("side", short.class)
+                .put("message", String.class)
+                .put("parentUuid", String.class)
+                .put("range", Comment.Range.class)
+                .put("tag", String.class)
+                .put("revId", String.class)
+                .put("serverId", String.class)
+                .put("unresolved", boolean.class)
+                .put("legacyFormat", boolean.class)
+                .build());
+  }
+
+  private static ChangeNotesStateProto toProto(ChangeNotesState state) throws Exception {
+    return ChangeNotesStateProto.parseFrom(Serializer.INSTANCE.serialize(state));
+  }
+
+  private static ChangeNotesState assertRoundTrip(
+      ChangeNotesState state, ChangeNotesStateProto expectedProto) throws Exception {
+    ChangeNotesStateProto actualProto = toProto(state);
+    assertThat(actualProto).isEqualTo(expectedProto);
+    ChangeNotesState actual = Serializer.INSTANCE.deserialize(Serializer.INSTANCE.serialize(state));
+    assertThat(actual).isEqualTo(state);
+    // It's possible that ChangeNotesState contains objects which implement equals without taking
+    // into account all fields. Return the actual deserialized instance so that callers can perform
+    // additional assertions if necessary.
+    return actual;
+  }
+}
diff --git a/javatests/com/google/gerrit/server/notedb/ChangeNotesTest.java b/javatests/com/google/gerrit/server/notedb/ChangeNotesTest.java
new file mode 100644
index 0000000..549f5db
--- /dev/null
+++ b/javatests/com/google/gerrit/server/notedb/ChangeNotesTest.java
@@ -0,0 +1,3146 @@
+// Copyright (C) 2013 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.google.gerrit.server.notedb;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assert_;
+import static com.google.gerrit.reviewdb.client.RefNames.changeMetaRef;
+import static com.google.gerrit.reviewdb.client.RefNames.refsDraftComments;
+import static com.google.gerrit.server.notedb.ReviewerStateInternal.CC;
+import static com.google.gerrit.server.notedb.ReviewerStateInternal.REMOVED;
+import static com.google.gerrit.server.notedb.ReviewerStateInternal.REVIEWER;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
+import static org.junit.Assert.fail;
+
+import com.google.common.base.Throwables;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableTable;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Lists;
+import com.google.gerrit.common.data.SubmitRecord;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.CommentRange;
+import com.google.gerrit.reviewdb.client.PatchLineComment.Status;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.client.RevId;
+import com.google.gerrit.reviewdb.server.ReviewDbUtil;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.ReviewerSet;
+import com.google.gerrit.server.config.GerritServerId;
+import com.google.gerrit.server.logging.RequestId;
+import com.google.gerrit.server.notedb.ChangeNotesCommit.ChangeNotesRevWalk;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.testing.TestChanges;
+import com.google.gerrit.testing.TestTimeUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.sql.Timestamp;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.notes.NoteMap;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.junit.Test;
+
+public class ChangeNotesTest extends AbstractChangeNotesTest {
+  @Inject private DraftCommentNotes.Factory draftNotesFactory;
+
+  @Inject private ChangeNoteJson changeNoteJson;
+  @Inject private LegacyChangeNoteRead legacyChangeNoteRead;
+
+  @Inject private @GerritServerId String serverId;
+
+  @Test
+  public void tagChangeMessage() throws Exception {
+    String tag = "jenkins";
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setChangeMessage("verification from jenkins");
+    update.setTag(tag);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+
+    assertThat(notes.getChangeMessages()).hasSize(1);
+    assertThat(notes.getChangeMessages().get(0).getTag()).isEqualTo(tag);
+  }
+
+  @Test
+  public void patchSetDescription() throws Exception {
+    String description = "descriptive";
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setPsDescription(description);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getCurrentPatchSet().getDescription()).isEqualTo(description);
+
+    description = "new, now more descriptive!";
+    update = newUpdate(c, changeOwner);
+    update.setPsDescription(description);
+    update.commit();
+
+    notes = newNotes(c);
+    assertThat(notes.getCurrentPatchSet().getDescription()).isEqualTo(description);
+  }
+
+  @Test
+  public void tagInlineComments() throws Exception {
+    String tag = "jenkins";
+    Change c = newChange();
+    RevCommit commit = tr.commit().message("PS2").create();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.putComment(
+        Status.PUBLISHED,
+        newComment(
+            c.currentPatchSetId(),
+            "a.txt",
+            "uuid1",
+            new CommentRange(1, 2, 3, 4),
+            1,
+            changeOwner,
+            null,
+            TimeUtil.nowTs(),
+            "Comment",
+            (short) 1,
+            commit.name(),
+            false));
+    update.setTag(tag);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+
+    ImmutableListMultimap<RevId, Comment> comments = notes.getComments();
+    assertThat(comments).hasSize(1);
+    assertThat(comments.entries().asList().get(0).getValue().tag).isEqualTo(tag);
+  }
+
+  @Test
+  public void tagApprovals() throws Exception {
+    String tag1 = "jenkins";
+    String tag2 = "ip";
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.putApproval("Verified", (short) -1);
+    update.setTag(tag1);
+    update.commit();
+
+    update = newUpdate(c, changeOwner);
+    update.putApproval("Verified", (short) 1);
+    update.setTag(tag2);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+
+    ImmutableListMultimap<PatchSet.Id, PatchSetApproval> approvals = notes.getApprovals();
+    assertThat(approvals).hasSize(1);
+    assertThat(approvals.entries().asList().get(0).getValue().getTag()).isEqualTo(tag2);
+  }
+
+  @Test
+  public void multipleTags() throws Exception {
+    String ipTag = "ip";
+    String coverageTag = "coverage";
+    String integrationTag = "integration";
+    Change c = newChange();
+
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.putApproval("Verified", (short) -1);
+    update.setChangeMessage("integration verification");
+    update.setTag(integrationTag);
+    update.commit();
+
+    RevCommit commit = tr.commit().message("PS2").create();
+    update = newUpdate(c, changeOwner);
+    update.putComment(
+        Status.PUBLISHED,
+        newComment(
+            c.currentPatchSetId(),
+            "a.txt",
+            "uuid1",
+            new CommentRange(1, 2, 3, 4),
+            1,
+            changeOwner,
+            null,
+            TimeUtil.nowTs(),
+            "Comment",
+            (short) 1,
+            commit.name(),
+            false));
+    update.setChangeMessage("coverage verification");
+    update.setTag(coverageTag);
+    update.commit();
+
+    update = newUpdate(c, changeOwner);
+    update.setChangeMessage("ip clear");
+    update.setTag(ipTag);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+
+    ImmutableListMultimap<PatchSet.Id, PatchSetApproval> approvals = notes.getApprovals();
+    assertThat(approvals).hasSize(1);
+    PatchSetApproval approval = approvals.entries().asList().get(0).getValue();
+    assertThat(approval.getTag()).isEqualTo(integrationTag);
+    assertThat(approval.getValue()).isEqualTo(-1);
+
+    ImmutableListMultimap<RevId, Comment> comments = notes.getComments();
+    assertThat(comments).hasSize(1);
+    assertThat(comments.entries().asList().get(0).getValue().tag).isEqualTo(coverageTag);
+
+    ImmutableList<ChangeMessage> messages = notes.getChangeMessages();
+    assertThat(messages).hasSize(3);
+    assertThat(messages.get(0).getTag()).isEqualTo(integrationTag);
+    assertThat(messages.get(1).getTag()).isEqualTo(coverageTag);
+    assertThat(messages.get(2).getTag()).isEqualTo(ipTag);
+  }
+
+  @Test
+  public void approvalsOnePatchSet() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.putApproval("Verified", (short) 1);
+    update.putApproval("Code-Review", (short) -1);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getApprovals().keySet()).containsExactly(c.currentPatchSetId());
+    List<PatchSetApproval> psas = notes.getApprovals().get(c.currentPatchSetId());
+    assertThat(psas).hasSize(2);
+
+    assertThat(psas.get(0).getPatchSetId()).isEqualTo(c.currentPatchSetId());
+    assertThat(psas.get(0).getAccountId().get()).isEqualTo(1);
+    assertThat(psas.get(0).getLabel()).isEqualTo("Code-Review");
+    assertThat(psas.get(0).getValue()).isEqualTo((short) -1);
+    assertThat(psas.get(0).getGranted()).isEqualTo(truncate(after(c, 2000)));
+
+    assertThat(psas.get(1).getPatchSetId()).isEqualTo(c.currentPatchSetId());
+    assertThat(psas.get(1).getAccountId().get()).isEqualTo(1);
+    assertThat(psas.get(1).getLabel()).isEqualTo("Verified");
+    assertThat(psas.get(1).getValue()).isEqualTo((short) 1);
+    assertThat(psas.get(1).getGranted()).isEqualTo(psas.get(0).getGranted());
+  }
+
+  @Test
+  public void approvalsMultiplePatchSets() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.putApproval("Code-Review", (short) -1);
+    update.commit();
+    PatchSet.Id ps1 = c.currentPatchSetId();
+
+    incrementPatchSet(c);
+    update = newUpdate(c, changeOwner);
+    update.putApproval("Code-Review", (short) 1);
+    update.commit();
+    PatchSet.Id ps2 = c.currentPatchSetId();
+
+    ChangeNotes notes = newNotes(c);
+    ListMultimap<PatchSet.Id, PatchSetApproval> psas = notes.getApprovals();
+    assertThat(psas).hasSize(2);
+
+    PatchSetApproval psa1 = Iterables.getOnlyElement(psas.get(ps1));
+    assertThat(psa1.getPatchSetId()).isEqualTo(ps1);
+    assertThat(psa1.getAccountId().get()).isEqualTo(1);
+    assertThat(psa1.getLabel()).isEqualTo("Code-Review");
+    assertThat(psa1.getValue()).isEqualTo((short) -1);
+    assertThat(psa1.getGranted()).isEqualTo(truncate(after(c, 2000)));
+
+    PatchSetApproval psa2 = Iterables.getOnlyElement(psas.get(ps2));
+    assertThat(psa2.getPatchSetId()).isEqualTo(ps2);
+    assertThat(psa2.getAccountId().get()).isEqualTo(1);
+    assertThat(psa2.getLabel()).isEqualTo("Code-Review");
+    assertThat(psa2.getValue()).isEqualTo((short) +1);
+    assertThat(psa2.getGranted()).isEqualTo(truncate(after(c, 4000)));
+  }
+
+  @Test
+  public void approvalsMultipleApprovals() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.putApproval("Code-Review", (short) -1);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    PatchSetApproval psa =
+        Iterables.getOnlyElement(notes.getApprovals().get(c.currentPatchSetId()));
+    assertThat(psa.getLabel()).isEqualTo("Code-Review");
+    assertThat(psa.getValue()).isEqualTo((short) -1);
+
+    update = newUpdate(c, changeOwner);
+    update.putApproval("Code-Review", (short) 1);
+    update.commit();
+
+    notes = newNotes(c);
+    psa = Iterables.getOnlyElement(notes.getApprovals().get(c.currentPatchSetId()));
+    assertThat(psa.getLabel()).isEqualTo("Code-Review");
+    assertThat(psa.getValue()).isEqualTo((short) 1);
+  }
+
+  @Test
+  public void approvalsMultipleUsers() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.putApproval("Code-Review", (short) -1);
+    update.commit();
+
+    update = newUpdate(c, otherUser);
+    update.putApproval("Code-Review", (short) 1);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getApprovals().keySet()).containsExactly(c.currentPatchSetId());
+    List<PatchSetApproval> psas = notes.getApprovals().get(c.currentPatchSetId());
+    assertThat(psas).hasSize(2);
+
+    assertThat(psas.get(0).getPatchSetId()).isEqualTo(c.currentPatchSetId());
+    assertThat(psas.get(0).getAccountId().get()).isEqualTo(1);
+    assertThat(psas.get(0).getLabel()).isEqualTo("Code-Review");
+    assertThat(psas.get(0).getValue()).isEqualTo((short) -1);
+    assertThat(psas.get(0).getGranted()).isEqualTo(truncate(after(c, 2000)));
+
+    assertThat(psas.get(1).getPatchSetId()).isEqualTo(c.currentPatchSetId());
+    assertThat(psas.get(1).getAccountId().get()).isEqualTo(2);
+    assertThat(psas.get(1).getLabel()).isEqualTo("Code-Review");
+    assertThat(psas.get(1).getValue()).isEqualTo((short) 1);
+    assertThat(psas.get(1).getGranted()).isEqualTo(truncate(after(c, 3000)));
+  }
+
+  @Test
+  public void approvalsTombstone() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.putApproval("Not-For-Long", (short) 1);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    PatchSetApproval psa =
+        Iterables.getOnlyElement(notes.getApprovals().get(c.currentPatchSetId()));
+    assertThat(psa.getAccountId().get()).isEqualTo(1);
+    assertThat(psa.getLabel()).isEqualTo("Not-For-Long");
+    assertThat(psa.getValue()).isEqualTo((short) 1);
+
+    update = newUpdate(c, changeOwner);
+    update.removeApproval("Not-For-Long");
+    update.commit();
+
+    notes = newNotes(c);
+    assertThat(notes.getApprovals())
+        .containsExactlyEntriesIn(
+            ImmutableListMultimap.of(
+                psa.getPatchSetId(),
+                new PatchSetApproval(psa.getKey(), (short) 0, update.getWhen())));
+  }
+
+  @Test
+  public void removeOtherUsersApprovals() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, otherUser);
+    update.putApproval("Not-For-Long", (short) 1);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    PatchSetApproval psa =
+        Iterables.getOnlyElement(notes.getApprovals().get(c.currentPatchSetId()));
+    assertThat(psa.getAccountId()).isEqualTo(otherUserId);
+    assertThat(psa.getLabel()).isEqualTo("Not-For-Long");
+    assertThat(psa.getValue()).isEqualTo((short) 1);
+
+    update = newUpdate(c, changeOwner);
+    update.removeApprovalFor(otherUserId, "Not-For-Long");
+    update.commit();
+
+    notes = newNotes(c);
+    assertThat(notes.getApprovals())
+        .containsExactlyEntriesIn(
+            ImmutableListMultimap.of(
+                psa.getPatchSetId(),
+                new PatchSetApproval(psa.getKey(), (short) 0, update.getWhen())));
+
+    // Add back approval on same label.
+    update = newUpdate(c, otherUser);
+    update.putApproval("Not-For-Long", (short) 2);
+    update.commit();
+
+    notes = newNotes(c);
+    psa = Iterables.getOnlyElement(notes.getApprovals().get(c.currentPatchSetId()));
+    assertThat(psa.getAccountId()).isEqualTo(otherUserId);
+    assertThat(psa.getLabel()).isEqualTo("Not-For-Long");
+    assertThat(psa.getValue()).isEqualTo((short) 2);
+  }
+
+  @Test
+  public void putOtherUsersApprovals() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.putApproval("Code-Review", (short) 1);
+    update.putApprovalFor(otherUser.getAccountId(), "Code-Review", (short) -1);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    List<PatchSetApproval> approvals =
+        ReviewDbUtil.intKeyOrdering()
+            .onResultOf(PatchSetApproval::getAccountId)
+            .sortedCopy(notes.getApprovals().get(c.currentPatchSetId()));
+    assertThat(approvals).hasSize(2);
+
+    assertThat(approvals.get(0).getAccountId()).isEqualTo(changeOwner.getAccountId());
+    assertThat(approvals.get(0).getLabel()).isEqualTo("Code-Review");
+    assertThat(approvals.get(0).getValue()).isEqualTo((short) 1);
+
+    assertThat(approvals.get(1).getAccountId()).isEqualTo(otherUser.getAccountId());
+    assertThat(approvals.get(1).getLabel()).isEqualTo("Code-Review");
+    assertThat(approvals.get(1).getValue()).isEqualTo((short) -1);
+  }
+
+  @Test
+  public void approvalsPostSubmit() throws Exception {
+    Change c = newChange();
+    RequestId submissionId = submissionId(c);
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.putApproval("Code-Review", (short) 1);
+    update.putApproval("Verified", (short) 1);
+    update.commit();
+
+    update = newUpdate(c, changeOwner);
+    update.merge(
+        submissionId,
+        ImmutableList.of(
+            submitRecord(
+                "NOT_READY",
+                null,
+                submitLabel("Verified", "OK", changeOwner.getAccountId()),
+                submitLabel("Code-Review", "NEED", null))));
+    update.commit();
+
+    update = newUpdate(c, changeOwner);
+    update.putApproval("Code-Review", (short) 2);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    List<PatchSetApproval> approvals = Lists.newArrayList(notes.getApprovals().values());
+    assertThat(approvals).hasSize(2);
+    assertThat(approvals.get(0).getLabel()).isEqualTo("Verified");
+    assertThat(approvals.get(0).getValue()).isEqualTo((short) 1);
+    assertThat(approvals.get(0).isPostSubmit()).isFalse();
+    assertThat(approvals.get(1).getLabel()).isEqualTo("Code-Review");
+    assertThat(approvals.get(1).getValue()).isEqualTo((short) 2);
+    assertThat(approvals.get(1).isPostSubmit()).isTrue();
+  }
+
+  @Test
+  public void approvalsDuringSubmit() throws Exception {
+    Change c = newChange();
+    RequestId submissionId = submissionId(c);
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.putApproval("Code-Review", (short) 1);
+    update.putApproval("Verified", (short) 1);
+    update.commit();
+
+    Account.Id ownerId = changeOwner.getAccountId();
+    Account.Id otherId = otherUser.getAccountId();
+    update = newUpdate(c, otherUser);
+    update.merge(
+        submissionId,
+        ImmutableList.of(
+            submitRecord(
+                "NOT_READY",
+                null,
+                submitLabel("Verified", "OK", ownerId),
+                submitLabel("Code-Review", "NEED", null))));
+    update.putApproval("Other-Label", (short) 1);
+    update.putApprovalFor(ownerId, "Code-Review", (short) 2);
+    update.commit();
+
+    update = newUpdate(c, otherUser);
+    update.putApproval("Other-Label", (short) 2);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+
+    List<PatchSetApproval> approvals = Lists.newArrayList(notes.getApprovals().values());
+    assertThat(approvals).hasSize(3);
+    assertThat(approvals.get(0).getAccountId()).isEqualTo(ownerId);
+    assertThat(approvals.get(0).getLabel()).isEqualTo("Verified");
+    assertThat(approvals.get(0).getValue()).isEqualTo(1);
+    assertThat(approvals.get(0).isPostSubmit()).isFalse();
+    assertThat(approvals.get(1).getAccountId()).isEqualTo(ownerId);
+    assertThat(approvals.get(1).getLabel()).isEqualTo("Code-Review");
+    assertThat(approvals.get(1).getValue()).isEqualTo(2);
+    assertThat(approvals.get(1).isPostSubmit()).isFalse(); // During submit.
+    assertThat(approvals.get(2).getAccountId()).isEqualTo(otherId);
+    assertThat(approvals.get(2).getLabel()).isEqualTo("Other-Label");
+    assertThat(approvals.get(2).getValue()).isEqualTo(2);
+    assertThat(approvals.get(2).isPostSubmit()).isTrue();
+  }
+
+  @Test
+  public void multipleReviewers() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.putReviewer(changeOwner.getAccount().getId(), REVIEWER);
+    update.putReviewer(otherUser.getAccount().getId(), REVIEWER);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    Timestamp ts = new Timestamp(update.getWhen().getTime());
+    assertThat(notes.getReviewers())
+        .isEqualTo(
+            ReviewerSet.fromTable(
+                ImmutableTable.<ReviewerStateInternal, Account.Id, Timestamp>builder()
+                    .put(REVIEWER, new Account.Id(1), ts)
+                    .put(REVIEWER, new Account.Id(2), ts)
+                    .build()));
+  }
+
+  @Test
+  public void reviewerTypes() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.putReviewer(changeOwner.getAccount().getId(), REVIEWER);
+    update.putReviewer(otherUser.getAccount().getId(), CC);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    Timestamp ts = new Timestamp(update.getWhen().getTime());
+    assertThat(notes.getReviewers())
+        .isEqualTo(
+            ReviewerSet.fromTable(
+                ImmutableTable.<ReviewerStateInternal, Account.Id, Timestamp>builder()
+                    .put(REVIEWER, new Account.Id(1), ts)
+                    .put(CC, new Account.Id(2), ts)
+                    .build()));
+  }
+
+  @Test
+  public void oneReviewerMultipleTypes() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.putReviewer(otherUser.getAccount().getId(), REVIEWER);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    Timestamp ts = new Timestamp(update.getWhen().getTime());
+    assertThat(notes.getReviewers())
+        .isEqualTo(ReviewerSet.fromTable(ImmutableTable.of(REVIEWER, new Account.Id(2), ts)));
+
+    update = newUpdate(c, otherUser);
+    update.putReviewer(otherUser.getAccount().getId(), CC);
+    update.commit();
+
+    notes = newNotes(c);
+    ts = new Timestamp(update.getWhen().getTime());
+    assertThat(notes.getReviewers())
+        .isEqualTo(ReviewerSet.fromTable(ImmutableTable.of(CC, new Account.Id(2), ts)));
+  }
+
+  @Test
+  public void removeReviewer() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.putReviewer(otherUser.getAccount().getId(), REVIEWER);
+    update.commit();
+
+    update = newUpdate(c, changeOwner);
+    update.putApproval("Code-Review", (short) 1);
+    update.commit();
+
+    update = newUpdate(c, otherUser);
+    update.putApproval("Code-Review", (short) 1);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    List<PatchSetApproval> psas = notes.getApprovals().get(c.currentPatchSetId());
+    assertThat(psas).hasSize(2);
+    assertThat(psas.get(0).getAccountId()).isEqualTo(changeOwner.getAccount().getId());
+    assertThat(psas.get(1).getAccountId()).isEqualTo(otherUser.getAccount().getId());
+
+    update = newUpdate(c, changeOwner);
+    update.removeReviewer(otherUser.getAccount().getId());
+    update.commit();
+
+    notes = newNotes(c);
+    psas = notes.getApprovals().get(c.currentPatchSetId());
+    assertThat(psas).hasSize(1);
+    assertThat(psas.get(0).getAccountId()).isEqualTo(changeOwner.getAccount().getId());
+  }
+
+  @Test
+  public void submitRecords() throws Exception {
+    Change c = newChange();
+    RequestId submissionId = submissionId(c);
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setSubjectForCommit("Submit patch set 1");
+
+    update.merge(
+        submissionId,
+        ImmutableList.of(
+            submitRecord(
+                "NOT_READY",
+                null,
+                submitLabel("Verified", "OK", changeOwner.getAccountId()),
+                submitLabel("Code-Review", "NEED", null)),
+            submitRecord(
+                "NOT_READY",
+                null,
+                submitLabel("Verified", "OK", changeOwner.getAccountId()),
+                submitLabel("Alternative-Code-Review", "NEED", null))));
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    List<SubmitRecord> recs = notes.getSubmitRecords();
+    assertThat(recs).hasSize(2);
+    assertThat(recs.get(0))
+        .isEqualTo(
+            submitRecord(
+                "NOT_READY",
+                null,
+                submitLabel("Verified", "OK", changeOwner.getAccountId()),
+                submitLabel("Code-Review", "NEED", null)));
+    assertThat(recs.get(1))
+        .isEqualTo(
+            submitRecord(
+                "NOT_READY",
+                null,
+                submitLabel("Verified", "OK", changeOwner.getAccountId()),
+                submitLabel("Alternative-Code-Review", "NEED", null)));
+    assertThat(notes.getChange().getSubmissionId()).isEqualTo(submissionId.toStringForStorage());
+  }
+
+  @Test
+  public void latestSubmitRecordsOnly() throws Exception {
+    Change c = newChange();
+    RequestId submissionId = submissionId(c);
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setSubjectForCommit("Submit patch set 1");
+    update.merge(
+        submissionId,
+        ImmutableList.of(
+            submitRecord("OK", null, submitLabel("Code-Review", "OK", otherUser.getAccountId()))));
+    update.commit();
+
+    incrementPatchSet(c);
+    update = newUpdate(c, changeOwner);
+    update.setSubjectForCommit("Submit patch set 2");
+    update.merge(
+        submissionId,
+        ImmutableList.of(
+            submitRecord(
+                "OK", null, submitLabel("Code-Review", "OK", changeOwner.getAccountId()))));
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getSubmitRecords())
+        .containsExactly(
+            submitRecord("OK", null, submitLabel("Code-Review", "OK", changeOwner.getAccountId())));
+    assertThat(notes.getChange().getSubmissionId()).isEqualTo(submissionId.toStringForStorage());
+  }
+
+  @Test
+  public void emptyChangeUpdate() throws Exception {
+    Change c = newChange();
+    Ref initial = repo.exactRef(changeMetaRef(c.getId()));
+    assertThat(initial).isNotNull();
+
+    // Empty update doesn't create a new commit.
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.commit();
+    assertThat(update.getResult()).isNull();
+
+    Ref updated = repo.exactRef(changeMetaRef(c.getId()));
+    assertThat(updated.getObjectId()).isEqualTo(initial.getObjectId());
+  }
+
+  @Test
+  public void assigneeCommit() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setAssignee(otherUserId);
+    ObjectId result = update.commit();
+    assertThat(result).isNotNull();
+    try (RevWalk rw = new RevWalk(repo)) {
+      RevCommit commit = rw.parseCommit(update.getResult());
+      rw.parseBody(commit);
+      String strIdent = "Gerrit User " + otherUserId + " <" + otherUserId + "@" + serverId + ">";
+      assertThat(commit.getFullMessage()).contains("Assignee: " + strIdent);
+    }
+  }
+
+  @Test
+  public void assigneeChangeNotes() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setAssignee(otherUserId);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getChange().getAssignee()).isEqualTo(otherUserId);
+
+    update = newUpdate(c, changeOwner);
+    update.setAssignee(changeOwner.getAccountId());
+    update.commit();
+
+    notes = newNotes(c);
+    assertThat(notes.getChange().getAssignee()).isEqualTo(changeOwner.getAccountId());
+  }
+
+  @Test
+  public void pastAssigneesChangeNotes() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setAssignee(otherUserId);
+    update.commit();
+
+    update = newUpdate(c, changeOwner);
+    update.setAssignee(changeOwner.getAccountId());
+    update.commit();
+
+    update = newUpdate(c, changeOwner);
+    update.setAssignee(otherUserId);
+    update.commit();
+
+    update = newUpdate(c, changeOwner);
+    update.removeAssignee();
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getPastAssignees()).hasSize(2);
+  }
+
+  @Test
+  public void hashtagCommit() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    LinkedHashSet<String> hashtags = new LinkedHashSet<>();
+    hashtags.add("tag1");
+    hashtags.add("tag2");
+    update.setHashtags(hashtags);
+    update.commit();
+    try (RevWalk walk = new RevWalk(repo)) {
+      RevCommit commit = walk.parseCommit(update.getResult());
+      walk.parseBody(commit);
+      assertThat(commit.getFullMessage()).contains("Hashtags: tag1,tag2\n");
+    }
+  }
+
+  @Test
+  public void hashtagChangeNotes() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    LinkedHashSet<String> hashtags = new LinkedHashSet<>();
+    hashtags.add("tag1");
+    hashtags.add("tag2");
+    update.setHashtags(hashtags);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getHashtags()).isEqualTo(hashtags);
+  }
+
+  @Test
+  public void topicChangeNotes() throws Exception {
+    Change c = newChange();
+
+    // initially topic is not set
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getChange().getTopic()).isNull();
+
+    // set topic
+    String topic = "myTopic";
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setTopic(topic);
+    update.commit();
+    notes = newNotes(c);
+    assertThat(notes.getChange().getTopic()).isEqualTo(topic);
+
+    // clear topic by setting empty string
+    update = newUpdate(c, changeOwner);
+    update.setTopic("");
+    update.commit();
+    notes = newNotes(c);
+    assertThat(notes.getChange().getTopic()).isNull();
+
+    // set other topic
+    topic = "otherTopic";
+    update = newUpdate(c, changeOwner);
+    update.setTopic(topic);
+    update.commit();
+    notes = newNotes(c);
+    assertThat(notes.getChange().getTopic()).isEqualTo(topic);
+
+    // clear topic by setting null
+    update = newUpdate(c, changeOwner);
+    update.setTopic(null);
+    update.commit();
+    notes = newNotes(c);
+    assertThat(notes.getChange().getTopic()).isNull();
+  }
+
+  @Test
+  public void changeIdChangeNotes() throws Exception {
+    Change c = newChange();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getChange().getKey()).isEqualTo(c.getKey());
+
+    // An update doesn't affect the Change-Id
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setTopic("topic"); // Change something to get a new commit.
+    update.commit();
+    assertThat(notes.getChange().getKey()).isEqualTo(c.getKey());
+
+    // Trying to set another Change-Id fails
+    String otherChangeId = "I577fb248e474018276351785930358ec0450e9f7";
+    update = newUpdate(c, changeOwner);
+    exception.expect(IllegalArgumentException.class);
+    exception.expectMessage(
+        "The Change-Id was already set to "
+            + c.getKey()
+            + ", so we cannot set this Change-Id: "
+            + otherChangeId);
+    update.setChangeId(otherChangeId);
+  }
+
+  @Test
+  public void branchChangeNotes() throws Exception {
+    Change c = newChange();
+
+    ChangeNotes notes = newNotes(c);
+    Branch.NameKey expectedBranch = new Branch.NameKey(project, "refs/heads/master");
+    assertThat(notes.getChange().getDest()).isEqualTo(expectedBranch);
+
+    // An update doesn't affect the branch
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setTopic("topic"); // Change something to get a new commit.
+    update.commit();
+    assertThat(newNotes(c).getChange().getDest()).isEqualTo(expectedBranch);
+
+    // Set another branch
+    String otherBranch = "refs/heads/stable";
+    update = newUpdate(c, changeOwner);
+    update.setBranch(otherBranch);
+    update.commit();
+    assertThat(newNotes(c).getChange().getDest())
+        .isEqualTo(new Branch.NameKey(project, otherBranch));
+  }
+
+  @Test
+  public void ownerChangeNotes() throws Exception {
+    Change c = newChange();
+
+    assertThat(newNotes(c).getChange().getOwner()).isEqualTo(changeOwner.getAccountId());
+
+    // An update doesn't affect the owner
+    ChangeUpdate update = newUpdate(c, otherUser);
+    update.setTopic("topic"); // Change something to get a new commit.
+    update.commit();
+    assertThat(newNotes(c).getChange().getOwner()).isEqualTo(changeOwner.getAccountId());
+  }
+
+  @Test
+  public void createdOnChangeNotes() throws Exception {
+    Change c = newChange();
+
+    Timestamp createdOn = newNotes(c).getChange().getCreatedOn();
+    assertThat(createdOn).isNotNull();
+
+    // An update doesn't affect the createdOn timestamp.
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setTopic("topic"); // Change something to get a new commit.
+    update.commit();
+    assertThat(newNotes(c).getChange().getCreatedOn()).isEqualTo(createdOn);
+  }
+
+  @Test
+  public void lastUpdatedOnChangeNotes() throws Exception {
+    Change c = newChange();
+
+    ChangeNotes notes = newNotes(c);
+    Timestamp ts1 = notes.getChange().getLastUpdatedOn();
+    assertThat(ts1).isEqualTo(notes.getChange().getCreatedOn());
+
+    // Various kinds of updates that update the timestamp.
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setTopic("topic"); // Change something to get a new commit.
+    update.commit();
+    Timestamp ts2 = newNotes(c).getChange().getLastUpdatedOn();
+    assertThat(ts2).isGreaterThan(ts1);
+
+    update = newUpdate(c, changeOwner);
+    update.setChangeMessage("Some message");
+    update.commit();
+    Timestamp ts3 = newNotes(c).getChange().getLastUpdatedOn();
+    assertThat(ts3).isGreaterThan(ts2);
+
+    update = newUpdate(c, changeOwner);
+    update.setHashtags(ImmutableSet.of("foo"));
+    update.commit();
+    Timestamp ts4 = newNotes(c).getChange().getLastUpdatedOn();
+    assertThat(ts4).isGreaterThan(ts3);
+
+    incrementPatchSet(c);
+    Timestamp ts5 = newNotes(c).getChange().getLastUpdatedOn();
+    assertThat(ts5).isGreaterThan(ts4);
+
+    update = newUpdate(c, changeOwner);
+    update.putApproval("Code-Review", (short) 1);
+    update.commit();
+    Timestamp ts6 = newNotes(c).getChange().getLastUpdatedOn();
+    assertThat(ts6).isGreaterThan(ts5);
+
+    update = newUpdate(c, changeOwner);
+    update.setStatus(Change.Status.ABANDONED);
+    update.commit();
+    Timestamp ts7 = newNotes(c).getChange().getLastUpdatedOn();
+    assertThat(ts7).isGreaterThan(ts6);
+
+    update = newUpdate(c, changeOwner);
+    update.putReviewer(otherUser.getAccountId(), ReviewerStateInternal.REVIEWER);
+    update.commit();
+    Timestamp ts8 = newNotes(c).getChange().getLastUpdatedOn();
+    assertThat(ts8).isGreaterThan(ts7);
+
+    update = newUpdate(c, changeOwner);
+    update.setGroups(ImmutableList.of("a", "b"));
+    update.commit();
+    Timestamp ts9 = newNotes(c).getChange().getLastUpdatedOn();
+    assertThat(ts9).isGreaterThan(ts8);
+
+    // Finish off by merging the change.
+    update = newUpdate(c, changeOwner);
+    update.merge(
+        submissionId(c),
+        ImmutableList.of(
+            submitRecord(
+                "NOT_READY",
+                null,
+                submitLabel("Verified", "OK", changeOwner.getAccountId()),
+                submitLabel("Alternative-Code-Review", "NEED", null))));
+    update.commit();
+    Timestamp ts10 = newNotes(c).getChange().getLastUpdatedOn();
+    assertThat(ts10).isGreaterThan(ts9);
+  }
+
+  @Test
+  public void subjectLeadingWhitespaceChangeNotes() throws Exception {
+    Change c = TestChanges.newChange(project, changeOwner.getAccountId());
+    String trimmedSubj = c.getSubject();
+    c.setCurrentPatchSet(c.currentPatchSetId(), "  " + trimmedSubj, c.getOriginalSubject());
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setChangeId(c.getKey().get());
+    update.setBranch(c.getDest().get());
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getChange().getSubject()).isEqualTo(trimmedSubj);
+
+    String tabSubj = "\t\t" + trimmedSubj;
+
+    c = TestChanges.newChange(project, changeOwner.getAccountId());
+    c.setCurrentPatchSet(c.currentPatchSetId(), tabSubj, c.getOriginalSubject());
+    update = newUpdate(c, changeOwner);
+    update.setChangeId(c.getKey().get());
+    update.setBranch(c.getDest().get());
+    update.commit();
+
+    notes = newNotes(c);
+    assertThat(notes.getChange().getSubject()).isEqualTo(tabSubj);
+  }
+
+  @Test
+  public void commitChangeNotesUnique() throws Exception {
+    // PatchSetId -> RevId must be a one to one mapping
+    Change c = newChange();
+
+    ChangeNotes notes = newNotes(c);
+    PatchSet ps = notes.getCurrentPatchSet();
+    assertThat(ps).isNotNull();
+
+    // new revId for the same patch set, ps1
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    RevCommit commit = tr.commit().message("PS1 again").create();
+    update.setCommit(rw, commit);
+    update.commit();
+
+    try {
+      newNotes(c);
+      fail("Expected IOException");
+    } catch (OrmException e) {
+      assertCause(
+          e,
+          ConfigInvalidException.class,
+          "Multiple revisions parsed for patch set 1:"
+              + " RevId{"
+              + commit.name()
+              + "} and "
+              + ps.getRevision().get());
+    }
+  }
+
+  @Test
+  public void patchSetChangeNotes() throws Exception {
+    Change c = newChange();
+
+    // ps1 created by newChange()
+    ChangeNotes notes = newNotes(c);
+    PatchSet ps1 = notes.getCurrentPatchSet();
+    assertThat(notes.getChange().currentPatchSetId()).isEqualTo(ps1.getId());
+    assertThat(notes.getChange().getSubject()).isEqualTo("Change subject");
+    assertThat(notes.getChange().getOriginalSubject()).isEqualTo("Change subject");
+    assertThat(ps1.getId()).isEqualTo(new PatchSet.Id(c.getId(), 1));
+    assertThat(ps1.getUploader()).isEqualTo(changeOwner.getAccountId());
+
+    // ps2 by other user
+    RevCommit commit = incrementPatchSet(c, otherUser);
+    notes = newNotes(c);
+    PatchSet ps2 = notes.getCurrentPatchSet();
+    assertThat(ps2.getId()).isEqualTo(new PatchSet.Id(c.getId(), 2));
+    assertThat(notes.getChange().getSubject()).isEqualTo("PS2");
+    assertThat(notes.getChange().getOriginalSubject()).isEqualTo("Change subject");
+    assertThat(notes.getChange().currentPatchSetId()).isEqualTo(ps2.getId());
+    assertThat(ps2.getRevision().get()).isNotEqualTo(ps1.getRevision());
+    assertThat(ps2.getRevision().get()).isEqualTo(commit.name());
+    assertThat(ps2.getUploader()).isEqualTo(otherUser.getAccountId());
+    assertThat(ps2.getCreatedOn()).isEqualTo(notes.getChange().getLastUpdatedOn());
+
+    // comment on ps1, current patch set is still ps2
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setPatchSetId(ps1.getId());
+    update.setChangeMessage("Comment on old patch set.");
+    update.commit();
+    notes = newNotes(c);
+    assertThat(notes.getChange().currentPatchSetId()).isEqualTo(ps2.getId());
+  }
+
+  @Test
+  public void patchSetStates() throws Exception {
+    Change c = newChange();
+    PatchSet.Id psId1 = c.currentPatchSetId();
+
+    incrementCurrentPatchSetFieldOnly(c);
+    PatchSet.Id psId2 = c.currentPatchSetId();
+    RevCommit commit = tr.commit().message("PS2").create();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setCommit(rw, commit);
+    update.putApproval("Code-Review", (short) 1);
+    update.setChangeMessage("This is a message");
+    update.putComment(
+        Status.PUBLISHED,
+        newComment(
+            c.currentPatchSetId(),
+            "a.txt",
+            "uuid1",
+            new CommentRange(1, 2, 3, 4),
+            1,
+            changeOwner,
+            null,
+            TimeUtil.nowTs(),
+            "Comment",
+            (short) 1,
+            commit.name(),
+            false));
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getPatchSets().keySet()).containsExactly(psId1, psId2);
+    assertThat(notes.getApprovals()).isNotEmpty();
+    assertThat(notes.getChangeMessages()).isNotEmpty();
+    assertThat(notes.getComments()).isNotEmpty();
+
+    // publish ps2
+    update = newUpdate(c, changeOwner);
+    update.setPatchSetState(PatchSetState.PUBLISHED);
+    update.commit();
+
+    // delete ps2
+    update = newUpdate(c, changeOwner);
+    update.setPatchSetState(PatchSetState.DELETED);
+    update.commit();
+
+    notes = newNotes(c);
+    assertThat(notes.getPatchSets().keySet()).containsExactly(psId1);
+    assertThat(notes.getApprovals()).isEmpty();
+    assertThat(notes.getChangeMessages()).isEmpty();
+    assertThat(notes.getComments()).isEmpty();
+  }
+
+  @Test
+  public void patchSetGroups() throws Exception {
+    Change c = newChange();
+    PatchSet.Id psId1 = c.currentPatchSetId();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getPatchSets().get(psId1).getGroups()).isEmpty();
+
+    // ps1
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setGroups(ImmutableList.of("a", "b"));
+    update.commit();
+    notes = newNotes(c);
+    assertThat(notes.getPatchSets().get(psId1).getGroups()).containsExactly("a", "b").inOrder();
+
+    incrementCurrentPatchSetFieldOnly(c);
+    PatchSet.Id psId2 = c.currentPatchSetId();
+    update = newUpdate(c, changeOwner);
+    update.setCommit(rw, tr.commit().message("PS2").create());
+    update.setGroups(ImmutableList.of("d"));
+    update.commit();
+    notes = newNotes(c);
+    assertThat(notes.getPatchSets().get(psId2).getGroups()).containsExactly("d");
+    assertThat(notes.getPatchSets().get(psId1).getGroups()).containsExactly("a", "b").inOrder();
+  }
+
+  @Test
+  public void pushCertificate() throws Exception {
+    String pushCert =
+        "certificate version 0.1\n"
+            + "pusher This is not a real push cert\n"
+            + "-----BEGIN PGP SIGNATURE-----\n"
+            + "Version: GnuPG v1\n"
+            + "\n"
+            + "Nor is this a real signature.\n"
+            + "-----END PGP SIGNATURE-----\n";
+
+    // ps2 with push cert
+    Change c = newChange();
+    PatchSet.Id psId1 = c.currentPatchSetId();
+    incrementCurrentPatchSetFieldOnly(c);
+    PatchSet.Id psId2 = c.currentPatchSetId();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setPatchSetId(psId2);
+    RevCommit commit = tr.commit().message("PS2").create();
+    update.setCommit(rw, commit, pushCert);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    readNote(notes, commit);
+
+    Map<PatchSet.Id, PatchSet> patchSets = notes.getPatchSets();
+    assertThat(patchSets.get(psId1).getPushCertificate()).isNull();
+    assertThat(patchSets.get(psId2).getPushCertificate()).isEqualTo(pushCert);
+    assertThat(notes.getComments()).isEmpty();
+
+    // comment on ps2
+    update = newUpdate(c, changeOwner);
+    update.setPatchSetId(psId2);
+    Timestamp ts = TimeUtil.nowTs();
+    update.putComment(
+        Status.PUBLISHED,
+        newComment(
+            psId2,
+            "a.txt",
+            "uuid1",
+            new CommentRange(1, 2, 3, 4),
+            1,
+            changeOwner,
+            null,
+            ts,
+            "Comment",
+            (short) 1,
+            commit.name(),
+            false));
+    update.commit();
+
+    notes = newNotes(c);
+
+    patchSets = notes.getPatchSets();
+    assertThat(patchSets.get(psId1).getPushCertificate()).isNull();
+    assertThat(patchSets.get(psId2).getPushCertificate()).isEqualTo(pushCert);
+    assertThat(notes.getComments()).isNotEmpty();
+  }
+
+  @Test
+  public void emptyExceptSubject() throws Exception {
+    ChangeUpdate update = newUpdate(newChange(), changeOwner);
+    update.setSubjectForCommit("Create change");
+    assertThat(update.commit()).isNotNull();
+  }
+
+  @Test
+  public void multipleUpdatesInManager() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update1 = newUpdate(c, changeOwner);
+    update1.putApproval("Verified", (short) 1);
+
+    ChangeUpdate update2 = newUpdate(c, otherUser);
+    update2.putApproval("Code-Review", (short) 2);
+
+    try (NoteDbUpdateManager updateManager = updateManagerFactory.create(project)) {
+      updateManager.add(update1);
+      updateManager.add(update2);
+      updateManager.execute();
+    }
+
+    ChangeNotes notes = newNotes(c);
+    List<PatchSetApproval> psas = notes.getApprovals().get(c.currentPatchSetId());
+    assertThat(psas).hasSize(2);
+
+    assertThat(psas.get(0).getAccountId()).isEqualTo(changeOwner.getAccount().getId());
+    assertThat(psas.get(0).getLabel()).isEqualTo("Verified");
+    assertThat(psas.get(0).getValue()).isEqualTo((short) 1);
+
+    assertThat(psas.get(1).getAccountId()).isEqualTo(otherUser.getAccount().getId());
+    assertThat(psas.get(1).getLabel()).isEqualTo("Code-Review");
+    assertThat(psas.get(1).getValue()).isEqualTo((short) 2);
+  }
+
+  @Test
+  public void multipleUpdatesIncludingComments() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update1 = newUpdate(c, otherUser);
+    String uuid1 = "uuid1";
+    String message1 = "comment 1";
+    CommentRange range1 = new CommentRange(1, 1, 2, 1);
+    Timestamp time1 = TimeUtil.nowTs();
+    PatchSet.Id psId = c.currentPatchSetId();
+    RevCommit tipCommit;
+    try (NoteDbUpdateManager updateManager = updateManagerFactory.create(project)) {
+      Comment comment1 =
+          newComment(
+              psId,
+              "file1",
+              uuid1,
+              range1,
+              range1.getEndLine(),
+              otherUser,
+              null,
+              time1,
+              message1,
+              (short) 0,
+              "abcd1234abcd1234abcd1234abcd1234abcd1234",
+              false);
+      update1.setPatchSetId(psId);
+      update1.putComment(Status.PUBLISHED, comment1);
+      updateManager.add(update1);
+
+      ChangeUpdate update2 = newUpdate(c, otherUser);
+      update2.putApproval("Code-Review", (short) 2);
+      updateManager.add(update2);
+
+      updateManager.execute();
+    }
+
+    ChangeNotes notes = newNotes(c);
+    ObjectId tip = notes.getRevision();
+    tipCommit = rw.parseCommit(tip);
+
+    RevCommit commitWithApprovals = tipCommit;
+    assertThat(commitWithApprovals).isNotNull();
+    RevCommit commitWithComments = commitWithApprovals.getParent(0);
+    assertThat(commitWithComments).isNotNull();
+
+    try (ChangeNotesRevWalk rw = ChangeNotesCommit.newRevWalk(repo)) {
+      ChangeNotesParser notesWithComments =
+          new ChangeNotesParser(
+              c.getId(),
+              commitWithComments.copy(),
+              rw,
+              changeNoteJson,
+              legacyChangeNoteRead,
+              args.metrics);
+      ChangeNotesState state = notesWithComments.parseAll();
+      assertThat(state.approvals()).isEmpty();
+      assertThat(state.publishedComments()).hasSize(1);
+    }
+
+    try (ChangeNotesRevWalk rw = ChangeNotesCommit.newRevWalk(repo)) {
+      ChangeNotesParser notesWithApprovals =
+          new ChangeNotesParser(
+              c.getId(),
+              commitWithApprovals.copy(),
+              rw,
+              changeNoteJson,
+              legacyChangeNoteRead,
+              args.metrics);
+
+      ChangeNotesState state = notesWithApprovals.parseAll();
+      assertThat(state.approvals()).hasSize(1);
+      assertThat(state.publishedComments()).hasSize(1);
+    }
+  }
+
+  @Test
+  public void multipleUpdatesAcrossRefs() throws Exception {
+    Change c1 = newChange();
+    ChangeUpdate update1 = newUpdate(c1, changeOwner);
+    update1.putApproval("Verified", (short) 1);
+
+    Change c2 = newChange();
+    ChangeUpdate update2 = newUpdate(c2, otherUser);
+    update2.putApproval("Code-Review", (short) 2);
+
+    Ref initial1 = repo.exactRef(update1.getRefName());
+    assertThat(initial1).isNotNull();
+    Ref initial2 = repo.exactRef(update2.getRefName());
+    assertThat(initial2).isNotNull();
+
+    try (NoteDbUpdateManager updateManager = updateManagerFactory.create(project)) {
+      updateManager.add(update1);
+      updateManager.add(update2);
+      updateManager.execute();
+    }
+
+    Ref ref1 = repo.exactRef(update1.getRefName());
+    assertThat(ref1.getObjectId()).isEqualTo(update1.getResult());
+    assertThat(ref1.getObjectId()).isNotEqualTo(initial1.getObjectId());
+    Ref ref2 = repo.exactRef(update2.getRefName());
+    assertThat(ref2.getObjectId()).isEqualTo(update2.getResult());
+    assertThat(ref2.getObjectId()).isNotEqualTo(initial2.getObjectId());
+
+    PatchSetApproval approval1 =
+        newNotes(c1).getApprovals().get(c1.currentPatchSetId()).iterator().next();
+    assertThat(approval1.getLabel()).isEqualTo("Verified");
+
+    PatchSetApproval approval2 =
+        newNotes(c2).getApprovals().get(c2.currentPatchSetId()).iterator().next();
+    assertThat(approval2.getLabel()).isEqualTo("Code-Review");
+  }
+
+  @Test
+  public void changeMessageOnePatchSet() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.putReviewer(changeOwner.getAccount().getId(), REVIEWER);
+    update.setChangeMessage("Just a little code change.\n");
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    ChangeMessage cm = Iterables.getOnlyElement(notes.getChangeMessages());
+    assertThat(cm.getMessage()).isEqualTo("Just a little code change.\n");
+    assertThat(cm.getAuthor()).isEqualTo(changeOwner.getAccount().getId());
+    assertThat(cm.getPatchSetId()).isEqualTo(c.currentPatchSetId());
+  }
+
+  @Test
+  public void noChangeMessage() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.putReviewer(changeOwner.getAccount().getId(), REVIEWER);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getChangeMessages()).isEmpty();
+  }
+
+  @Test
+  public void changeMessageWithTrailingDoubleNewline() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setChangeMessage("Testing trailing double newline\n\n");
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    ChangeMessage cm1 = Iterables.getOnlyElement(notes.getChangeMessages());
+    assertThat(cm1.getMessage()).isEqualTo("Testing trailing double newline\n\n");
+    assertThat(cm1.getAuthor()).isEqualTo(changeOwner.getAccount().getId());
+  }
+
+  @Test
+  public void changeMessageWithMultipleParagraphs() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setChangeMessage("Testing paragraph 1\n\nTesting paragraph 2\n\nTesting paragraph 3");
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    ChangeMessage cm1 = Iterables.getOnlyElement(notes.getChangeMessages());
+    assertThat(cm1.getMessage())
+        .isEqualTo(
+            "Testing paragraph 1\n"
+                + "\n"
+                + "Testing paragraph 2\n"
+                + "\n"
+                + "Testing paragraph 3");
+    assertThat(cm1.getAuthor()).isEqualTo(changeOwner.getAccount().getId());
+  }
+
+  @Test
+  public void changeMessagesMultiplePatchSets() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.putReviewer(changeOwner.getAccount().getId(), REVIEWER);
+    update.setChangeMessage("This is the change message for the first PS.");
+    update.commit();
+    PatchSet.Id ps1 = c.currentPatchSetId();
+
+    incrementPatchSet(c);
+    update = newUpdate(c, changeOwner);
+
+    update.setChangeMessage("This is the change message for the second PS.");
+    update.commit();
+    PatchSet.Id ps2 = c.currentPatchSetId();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getChangeMessages()).hasSize(2);
+
+    ChangeMessage cm1 = notes.getChangeMessages().get(0);
+    assertThat(cm1.getPatchSetId()).isEqualTo(ps1);
+    assertThat(cm1.getMessage()).isEqualTo("This is the change message for the first PS.");
+    assertThat(cm1.getAuthor()).isEqualTo(changeOwner.getAccount().getId());
+
+    ChangeMessage cm2 = notes.getChangeMessages().get(1);
+    assertThat(cm2.getPatchSetId()).isEqualTo(ps2);
+    assertThat(cm2.getMessage()).isEqualTo("This is the change message for the second PS.");
+    assertThat(cm2.getAuthor()).isEqualTo(changeOwner.getAccount().getId());
+    assertThat(cm2.getPatchSetId()).isEqualTo(ps2);
+  }
+
+  @Test
+  public void changeMessageMultipleInOnePatchSet() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.putReviewer(changeOwner.getAccount().getId(), REVIEWER);
+    update.setChangeMessage("First change message.\n");
+    update.commit();
+
+    PatchSet.Id ps1 = c.currentPatchSetId();
+
+    update = newUpdate(c, changeOwner);
+    update.putReviewer(changeOwner.getAccount().getId(), REVIEWER);
+    update.setChangeMessage("Second change message.\n");
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+
+    List<ChangeMessage> cm = notes.getChangeMessages();
+    assertThat(cm).hasSize(2);
+    assertThat(cm.get(0).getMessage()).isEqualTo("First change message.\n");
+    assertThat(cm.get(0).getAuthor()).isEqualTo(changeOwner.getAccount().getId());
+    assertThat(cm.get(0).getPatchSetId()).isEqualTo(ps1);
+    assertThat(cm.get(1).getMessage()).isEqualTo("Second change message.\n");
+    assertThat(cm.get(1).getAuthor()).isEqualTo(changeOwner.getAccount().getId());
+    assertThat(cm.get(1).getPatchSetId()).isEqualTo(ps1);
+  }
+
+  @Test
+  public void patchLineCommentsFileComment() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, otherUser);
+    PatchSet.Id psId = c.currentPatchSetId();
+    RevId revId = new RevId("abcd1234abcd1234abcd1234abcd1234abcd1234");
+
+    Comment comment =
+        newComment(
+            psId,
+            "file1",
+            "uuid",
+            null,
+            0,
+            otherUser,
+            null,
+            TimeUtil.nowTs(),
+            "message",
+            (short) 1,
+            revId.get(),
+            false);
+    update.setPatchSetId(psId);
+    update.putComment(Status.PUBLISHED, comment);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getComments()).isEqualTo(ImmutableListMultimap.of(revId, comment));
+  }
+
+  @Test
+  public void patchLineCommentsZeroColumns() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, otherUser);
+    PatchSet.Id psId = c.currentPatchSetId();
+    RevId revId = new RevId("abcd1234abcd1234abcd1234abcd1234abcd1234");
+    CommentRange range = new CommentRange(1, 0, 2, 0);
+
+    Comment comment =
+        newComment(
+            psId,
+            "file1",
+            "uuid",
+            range,
+            range.getEndLine(),
+            otherUser,
+            null,
+            TimeUtil.nowTs(),
+            "message",
+            (short) 1,
+            revId.get(),
+            false);
+    update.setPatchSetId(psId);
+    update.putComment(Status.PUBLISHED, comment);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getComments()).isEqualTo(ImmutableListMultimap.of(revId, comment));
+  }
+
+  @Test
+  public void patchLineCommentZeroRange() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, otherUser);
+    PatchSet.Id psId = c.currentPatchSetId();
+    RevId revId = new RevId("abcd1234abcd1234abcd1234abcd1234abcd1234");
+    CommentRange range = new CommentRange(0, 0, 0, 0);
+
+    Comment comment =
+        newComment(
+            psId,
+            "file",
+            "uuid",
+            range,
+            range.getEndLine(),
+            otherUser,
+            null,
+            TimeUtil.nowTs(),
+            "message",
+            (short) 1,
+            revId.get(),
+            false);
+    update.setPatchSetId(psId);
+    update.putComment(Status.PUBLISHED, comment);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getComments()).isEqualTo(ImmutableListMultimap.of(revId, comment));
+  }
+
+  @Test
+  public void patchLineCommentEmptyFilename() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, otherUser);
+    PatchSet.Id psId = c.currentPatchSetId();
+    RevId revId = new RevId("abcd1234abcd1234abcd1234abcd1234abcd1234");
+    CommentRange range = new CommentRange(1, 2, 3, 4);
+
+    Comment comment =
+        newComment(
+            psId,
+            "",
+            "uuid",
+            range,
+            range.getEndLine(),
+            otherUser,
+            null,
+            TimeUtil.nowTs(),
+            "message",
+            (short) 1,
+            revId.get(),
+            false);
+    update.setPatchSetId(psId);
+    update.putComment(Status.PUBLISHED, comment);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getComments()).isEqualTo(ImmutableListMultimap.of(revId, comment));
+  }
+
+  @Test
+  public void patchLineCommentNotesFormatMultiplePatchSetsSameRevId() throws Exception {
+    Change c = newChange();
+    PatchSet.Id psId1 = c.currentPatchSetId();
+    incrementPatchSet(c);
+    PatchSet.Id psId2 = c.currentPatchSetId();
+    String uuid1 = "uuid1";
+    String uuid2 = "uuid2";
+    String uuid3 = "uuid3";
+    String message1 = "comment 1";
+    String message2 = "comment 2";
+    String message3 = "comment 3";
+    CommentRange range1 = new CommentRange(1, 1, 2, 1);
+    CommentRange range2 = new CommentRange(2, 1, 3, 1);
+    Timestamp time = TimeUtil.nowTs();
+    RevId revId = new RevId("abcd1234abcd1234abcd1234abcd1234abcd1234");
+
+    Comment comment1 =
+        newComment(
+            psId1,
+            "file1",
+            uuid1,
+            range1,
+            range1.getEndLine(),
+            otherUser,
+            null,
+            time,
+            message1,
+            (short) 0,
+            revId.get(),
+            false);
+    Comment comment2 =
+        newComment(
+            psId1,
+            "file1",
+            uuid2,
+            range2,
+            range2.getEndLine(),
+            otherUser,
+            null,
+            time,
+            message2,
+            (short) 0,
+            revId.get(),
+            false);
+    Comment comment3 =
+        newComment(
+            psId2,
+            "file1",
+            uuid3,
+            range1,
+            range1.getEndLine(),
+            otherUser,
+            null,
+            time,
+            message3,
+            (short) 0,
+            revId.get(),
+            false);
+
+    ChangeUpdate update = newUpdate(c, otherUser);
+    update.setPatchSetId(psId2);
+    update.putComment(Status.PUBLISHED, comment3);
+    update.putComment(Status.PUBLISHED, comment2);
+    update.putComment(Status.PUBLISHED, comment1);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getComments())
+        .isEqualTo(
+            ImmutableListMultimap.of(
+                revId, comment1,
+                revId, comment2,
+                revId, comment3));
+  }
+
+  @Test
+  public void patchLineCommentNotesFormatRealAuthor() throws Exception {
+    Change c = newChange();
+    CurrentUser ownerAsOtherUser = userFactory.runAs(null, otherUserId, changeOwner);
+    ChangeUpdate update = newUpdate(c, ownerAsOtherUser);
+    String uuid = "uuid";
+    String message = "comment";
+    CommentRange range = new CommentRange(1, 1, 2, 1);
+    Timestamp time = TimeUtil.nowTs();
+    PatchSet.Id psId = c.currentPatchSetId();
+    RevId revId = new RevId("abcd1234abcd1234abcd1234abcd1234abcd1234");
+
+    Comment comment =
+        newComment(
+            psId,
+            "file",
+            uuid,
+            range,
+            range.getEndLine(),
+            otherUser,
+            null,
+            time,
+            message,
+            (short) 1,
+            revId.get(),
+            false);
+    comment.setRealAuthor(changeOwner.getAccountId());
+    update.setPatchSetId(psId);
+    update.putComment(Status.PUBLISHED, comment);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+
+    assertThat(notes.getComments()).isEqualTo(ImmutableListMultimap.of(revId, comment));
+  }
+
+  @Test
+  public void patchLineCommentNotesFormatWeirdUser() throws Exception {
+    Account account = new Account(new Account.Id(3), TimeUtil.nowTs());
+    account.setFullName("Weird\n\u0002<User>\n");
+    account.setPreferredEmail(" we\r\nird@ex>ample<.com");
+    accountCache.put(account);
+    IdentifiedUser user = userFactory.create(account.getId());
+
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, user);
+    String uuid = "uuid";
+    CommentRange range = new CommentRange(1, 1, 2, 1);
+    Timestamp time = TimeUtil.nowTs();
+    PatchSet.Id psId = c.currentPatchSetId();
+
+    Comment comment =
+        newComment(
+            psId,
+            "file1",
+            uuid,
+            range,
+            range.getEndLine(),
+            user,
+            null,
+            time,
+            "comment",
+            (short) 1,
+            "abcd1234abcd1234abcd1234abcd1234abcd1234",
+            false);
+    update.setPatchSetId(psId);
+    update.putComment(Status.PUBLISHED, comment);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+
+    assertThat(notes.getComments())
+        .isEqualTo(ImmutableListMultimap.of(new RevId(comment.revId), comment));
+  }
+
+  @Test
+  public void patchLineCommentMultipleOnePatchsetOneFileBothSides() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, otherUser);
+    String uuid1 = "uuid1";
+    String uuid2 = "uuid2";
+    String rev1 = "abcd1234abcd1234abcd1234abcd1234abcd1234";
+    String rev2 = "abcd4567abcd4567abcd4567abcd4567abcd4567";
+    String messageForBase = "comment for base";
+    String messageForPS = "comment for ps";
+    CommentRange range = new CommentRange(1, 1, 2, 1);
+    Timestamp now = TimeUtil.nowTs();
+    PatchSet.Id psId = c.currentPatchSetId();
+
+    Comment commentForBase =
+        newComment(
+            psId,
+            "filename",
+            uuid1,
+            range,
+            range.getEndLine(),
+            otherUser,
+            null,
+            now,
+            messageForBase,
+            (short) 0,
+            rev1,
+            false);
+    update.setPatchSetId(psId);
+    update.putComment(Status.PUBLISHED, commentForBase);
+    update.commit();
+
+    update = newUpdate(c, otherUser);
+    Comment commentForPS =
+        newComment(
+            psId,
+            "filename",
+            uuid2,
+            range,
+            range.getEndLine(),
+            otherUser,
+            null,
+            now,
+            messageForPS,
+            (short) 1,
+            rev2,
+            false);
+    update.setPatchSetId(psId);
+    update.putComment(Status.PUBLISHED, commentForPS);
+    update.commit();
+
+    assertThat(newNotes(c).getComments())
+        .containsExactlyEntriesIn(
+            ImmutableListMultimap.of(
+                new RevId(rev1), commentForBase,
+                new RevId(rev2), commentForPS));
+  }
+
+  @Test
+  public void patchLineCommentMultipleOnePatchsetOneFile() throws Exception {
+    Change c = newChange();
+    String uuid1 = "uuid1";
+    String uuid2 = "uuid2";
+    String rev = "abcd1234abcd1234abcd1234abcd1234abcd1234";
+    CommentRange range = new CommentRange(1, 1, 2, 1);
+    PatchSet.Id psId = c.currentPatchSetId();
+    String filename = "filename";
+    short side = (short) 1;
+
+    ChangeUpdate update = newUpdate(c, otherUser);
+    Timestamp timeForComment1 = TimeUtil.nowTs();
+    Timestamp timeForComment2 = TimeUtil.nowTs();
+    Comment comment1 =
+        newComment(
+            psId,
+            filename,
+            uuid1,
+            range,
+            range.getEndLine(),
+            otherUser,
+            null,
+            timeForComment1,
+            "comment 1",
+            side,
+            rev,
+            false);
+    update.setPatchSetId(psId);
+    update.putComment(Status.PUBLISHED, comment1);
+    update.commit();
+
+    update = newUpdate(c, otherUser);
+    Comment comment2 =
+        newComment(
+            psId,
+            filename,
+            uuid2,
+            range,
+            range.getEndLine(),
+            otherUser,
+            null,
+            timeForComment2,
+            "comment 2",
+            side,
+            rev,
+            false);
+    update.setPatchSetId(psId);
+    update.putComment(Status.PUBLISHED, comment2);
+    update.commit();
+
+    assertThat(newNotes(c).getComments())
+        .containsExactlyEntriesIn(
+            ImmutableListMultimap.of(
+                new RevId(rev), comment1,
+                new RevId(rev), comment2))
+        .inOrder();
+  }
+
+  @Test
+  public void patchLineCommentMultipleOnePatchsetMultipleFiles() throws Exception {
+    Change c = newChange();
+    String uuid = "uuid";
+    String rev = "abcd1234abcd1234abcd1234abcd1234abcd1234";
+    CommentRange range = new CommentRange(1, 1, 2, 1);
+    PatchSet.Id psId = c.currentPatchSetId();
+    String filename1 = "filename1";
+    String filename2 = "filename2";
+    short side = (short) 1;
+
+    ChangeUpdate update = newUpdate(c, otherUser);
+    Timestamp now = TimeUtil.nowTs();
+    Comment comment1 =
+        newComment(
+            psId,
+            filename1,
+            uuid,
+            range,
+            range.getEndLine(),
+            otherUser,
+            null,
+            now,
+            "comment 1",
+            side,
+            rev,
+            false);
+    update.setPatchSetId(psId);
+    update.putComment(Status.PUBLISHED, comment1);
+    update.commit();
+
+    update = newUpdate(c, otherUser);
+    Comment comment2 =
+        newComment(
+            psId,
+            filename2,
+            uuid,
+            range,
+            range.getEndLine(),
+            otherUser,
+            null,
+            now,
+            "comment 2",
+            side,
+            rev,
+            false);
+    update.setPatchSetId(psId);
+    update.putComment(Status.PUBLISHED, comment2);
+    update.commit();
+
+    assertThat(newNotes(c).getComments())
+        .containsExactlyEntriesIn(
+            ImmutableListMultimap.of(
+                new RevId(rev), comment1,
+                new RevId(rev), comment2))
+        .inOrder();
+  }
+
+  @Test
+  public void patchLineCommentMultiplePatchsets() throws Exception {
+    Change c = newChange();
+    String uuid = "uuid";
+    String rev1 = "abcd1234abcd1234abcd1234abcd1234abcd1234";
+    String rev2 = "abcd4567abcd4567abcd4567abcd4567abcd4567";
+    CommentRange range = new CommentRange(1, 1, 2, 1);
+    PatchSet.Id ps1 = c.currentPatchSetId();
+    String filename = "filename1";
+    short side = (short) 1;
+
+    ChangeUpdate update = newUpdate(c, otherUser);
+    Timestamp now = TimeUtil.nowTs();
+    Comment comment1 =
+        newComment(
+            ps1,
+            filename,
+            uuid,
+            range,
+            range.getEndLine(),
+            otherUser,
+            null,
+            now,
+            "comment on ps1",
+            side,
+            rev1,
+            false);
+    update.setPatchSetId(ps1);
+    update.putComment(Status.PUBLISHED, comment1);
+    update.commit();
+
+    incrementPatchSet(c);
+    PatchSet.Id ps2 = c.currentPatchSetId();
+
+    update = newUpdate(c, otherUser);
+    now = TimeUtil.nowTs();
+    Comment comment2 =
+        newComment(
+            ps2,
+            filename,
+            uuid,
+            range,
+            range.getEndLine(),
+            otherUser,
+            null,
+            now,
+            "comment on ps2",
+            side,
+            rev2,
+            false);
+    update.setPatchSetId(ps2);
+    update.putComment(Status.PUBLISHED, comment2);
+    update.commit();
+
+    assertThat(newNotes(c).getComments())
+        .containsExactlyEntriesIn(
+            ImmutableListMultimap.of(
+                new RevId(rev1), comment1,
+                new RevId(rev2), comment2));
+  }
+
+  @Test
+  public void patchLineCommentSingleDraftToPublished() throws Exception {
+    Change c = newChange();
+    String uuid = "uuid";
+    String rev = "abcd4567abcd4567abcd4567abcd4567abcd4567";
+    CommentRange range = new CommentRange(1, 1, 2, 1);
+    PatchSet.Id ps1 = c.currentPatchSetId();
+    String filename = "filename1";
+    short side = (short) 1;
+
+    ChangeUpdate update = newUpdate(c, otherUser);
+    Timestamp now = TimeUtil.nowTs();
+    Comment comment1 =
+        newComment(
+            ps1,
+            filename,
+            uuid,
+            range,
+            range.getEndLine(),
+            otherUser,
+            null,
+            now,
+            "comment on ps1",
+            side,
+            rev,
+            false);
+    update.setPatchSetId(ps1);
+    update.putComment(Status.DRAFT, comment1);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getDraftComments(otherUserId))
+        .containsExactlyEntriesIn(ImmutableListMultimap.of(new RevId(rev), comment1));
+    assertThat(notes.getComments()).isEmpty();
+
+    update = newUpdate(c, otherUser);
+    update.setPatchSetId(ps1);
+    update.putComment(Status.PUBLISHED, comment1);
+    update.commit();
+
+    notes = newNotes(c);
+    assertThat(notes.getDraftComments(otherUserId)).isEmpty();
+    assertThat(notes.getComments())
+        .containsExactlyEntriesIn(ImmutableListMultimap.of(new RevId(rev), comment1));
+  }
+
+  @Test
+  public void patchLineCommentMultipleDraftsSameSidePublishOne() throws Exception {
+    Change c = newChange();
+    String uuid1 = "uuid1";
+    String uuid2 = "uuid2";
+    String rev = "abcd4567abcd4567abcd4567abcd4567abcd4567";
+    CommentRange range1 = new CommentRange(1, 1, 2, 2);
+    CommentRange range2 = new CommentRange(2, 2, 3, 3);
+    String filename = "filename1";
+    short side = (short) 1;
+    Timestamp now = TimeUtil.nowTs();
+    PatchSet.Id psId = c.currentPatchSetId();
+
+    // Write two drafts on the same side of one patch set.
+    ChangeUpdate update = newUpdate(c, otherUser);
+    update.setPatchSetId(psId);
+    Comment comment1 =
+        newComment(
+            psId,
+            filename,
+            uuid1,
+            range1,
+            range1.getEndLine(),
+            otherUser,
+            null,
+            now,
+            "comment on ps1",
+            side,
+            rev,
+            false);
+    Comment comment2 =
+        newComment(
+            psId,
+            filename,
+            uuid2,
+            range2,
+            range2.getEndLine(),
+            otherUser,
+            null,
+            now,
+            "other on ps1",
+            side,
+            rev,
+            false);
+    update.putComment(Status.DRAFT, comment1);
+    update.putComment(Status.DRAFT, comment2);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getDraftComments(otherUserId))
+        .containsExactlyEntriesIn(
+            ImmutableListMultimap.of(
+                new RevId(rev), comment1,
+                new RevId(rev), comment2))
+        .inOrder();
+    assertThat(notes.getComments()).isEmpty();
+
+    // Publish first draft.
+    update = newUpdate(c, otherUser);
+    update.setPatchSetId(psId);
+    update.putComment(Status.PUBLISHED, comment1);
+    update.commit();
+
+    notes = newNotes(c);
+    assertThat(notes.getDraftComments(otherUserId))
+        .containsExactlyEntriesIn(ImmutableListMultimap.of(new RevId(rev), comment2));
+    assertThat(notes.getComments())
+        .containsExactlyEntriesIn(ImmutableListMultimap.of(new RevId(rev), comment1));
+  }
+
+  @Test
+  public void patchLineCommentsMultipleDraftsBothSidesPublishAll() throws Exception {
+    Change c = newChange();
+    String uuid1 = "uuid1";
+    String uuid2 = "uuid2";
+    String rev1 = "abcd1234abcd1234abcd1234abcd1234abcd1234";
+    String rev2 = "abcd4567abcd4567abcd4567abcd4567abcd4567";
+    CommentRange range1 = new CommentRange(1, 1, 2, 2);
+    CommentRange range2 = new CommentRange(2, 2, 3, 3);
+    String filename = "filename1";
+    Timestamp now = TimeUtil.nowTs();
+    PatchSet.Id psId = c.currentPatchSetId();
+
+    // Write two drafts, one on each side of the patchset.
+    ChangeUpdate update = newUpdate(c, otherUser);
+    update.setPatchSetId(psId);
+    Comment baseComment =
+        newComment(
+            psId,
+            filename,
+            uuid1,
+            range1,
+            range1.getEndLine(),
+            otherUser,
+            null,
+            now,
+            "comment on base",
+            (short) 0,
+            rev1,
+            false);
+    Comment psComment =
+        newComment(
+            psId,
+            filename,
+            uuid2,
+            range2,
+            range2.getEndLine(),
+            otherUser,
+            null,
+            now,
+            "comment on ps",
+            (short) 1,
+            rev2,
+            false);
+
+    update.putComment(Status.DRAFT, baseComment);
+    update.putComment(Status.DRAFT, psComment);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getDraftComments(otherUserId))
+        .containsExactlyEntriesIn(
+            ImmutableListMultimap.of(
+                new RevId(rev1), baseComment,
+                new RevId(rev2), psComment));
+    assertThat(notes.getComments()).isEmpty();
+
+    // Publish both comments.
+    update = newUpdate(c, otherUser);
+    update.setPatchSetId(psId);
+
+    update.putComment(Status.PUBLISHED, baseComment);
+    update.putComment(Status.PUBLISHED, psComment);
+    update.commit();
+
+    notes = newNotes(c);
+    assertThat(notes.getDraftComments(otherUserId)).isEmpty();
+    assertThat(notes.getComments())
+        .containsExactlyEntriesIn(
+            ImmutableListMultimap.of(
+                new RevId(rev1), baseComment,
+                new RevId(rev2), psComment));
+  }
+
+  @Test
+  public void patchLineCommentsDeleteAllDrafts() throws Exception {
+    Change c = newChange();
+    String uuid = "uuid";
+    String rev = "abcd1234abcd1234abcd1234abcd1234abcd1234";
+    ObjectId objId = ObjectId.fromString(rev);
+    CommentRange range = new CommentRange(1, 1, 2, 1);
+    PatchSet.Id psId = c.currentPatchSetId();
+    String filename = "filename";
+    short side = (short) 1;
+
+    ChangeUpdate update = newUpdate(c, otherUser);
+    Timestamp now = TimeUtil.nowTs();
+    Comment comment =
+        newComment(
+            psId,
+            filename,
+            uuid,
+            range,
+            range.getEndLine(),
+            otherUser,
+            null,
+            now,
+            "comment on ps1",
+            side,
+            rev,
+            false);
+    update.setPatchSetId(psId);
+    update.putComment(Status.DRAFT, comment);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getDraftComments(otherUserId)).hasSize(1);
+    assertThat(notes.getDraftCommentNotes().getNoteMap().contains(objId)).isTrue();
+
+    update = newUpdate(c, otherUser);
+    update.setPatchSetId(psId);
+    update.deleteComment(comment);
+    update.commit();
+
+    notes = newNotes(c);
+    assertThat(notes.getDraftComments(otherUserId)).isEmpty();
+    assertThat(notes.getDraftCommentNotes().getNoteMap()).isNull();
+  }
+
+  @Test
+  public void patchLineCommentsDeleteAllDraftsForOneRevision() throws Exception {
+    Change c = newChange();
+    String uuid = "uuid";
+    String rev1 = "abcd1234abcd1234abcd1234abcd1234abcd1234";
+    String rev2 = "abcd4567abcd4567abcd4567abcd4567abcd4567";
+    ObjectId objId1 = ObjectId.fromString(rev1);
+    ObjectId objId2 = ObjectId.fromString(rev2);
+    CommentRange range = new CommentRange(1, 1, 2, 1);
+    PatchSet.Id ps1 = c.currentPatchSetId();
+    String filename = "filename1";
+    short side = (short) 1;
+
+    ChangeUpdate update = newUpdate(c, otherUser);
+    Timestamp now = TimeUtil.nowTs();
+    Comment comment1 =
+        newComment(
+            ps1,
+            filename,
+            uuid,
+            range,
+            range.getEndLine(),
+            otherUser,
+            null,
+            now,
+            "comment on ps1",
+            side,
+            rev1,
+            false);
+    update.setPatchSetId(ps1);
+    update.putComment(Status.DRAFT, comment1);
+    update.commit();
+
+    incrementPatchSet(c);
+    PatchSet.Id ps2 = c.currentPatchSetId();
+
+    update = newUpdate(c, otherUser);
+    now = TimeUtil.nowTs();
+    Comment comment2 =
+        newComment(
+            ps2,
+            filename,
+            uuid,
+            range,
+            range.getEndLine(),
+            otherUser,
+            null,
+            now,
+            "comment on ps2",
+            side,
+            rev2,
+            false);
+    update.setPatchSetId(ps2);
+    update.putComment(Status.DRAFT, comment2);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getDraftComments(otherUserId)).hasSize(2);
+
+    update = newUpdate(c, otherUser);
+    update.setPatchSetId(ps2);
+    update.deleteComment(comment2);
+    update.commit();
+
+    notes = newNotes(c);
+    assertThat(notes.getDraftComments(otherUserId)).hasSize(1);
+    NoteMap noteMap = notes.getDraftCommentNotes().getNoteMap();
+    assertThat(noteMap.contains(objId1)).isTrue();
+    assertThat(noteMap.contains(objId2)).isFalse();
+  }
+
+  @Test
+  public void addingPublishedCommentDoesNotCreateNoOpCommitOnEmptyDraftRef() throws Exception {
+    Change c = newChange();
+    String uuid = "uuid";
+    String rev = "abcd4567abcd4567abcd4567abcd4567abcd4567";
+    CommentRange range = new CommentRange(1, 1, 2, 1);
+    PatchSet.Id ps1 = c.currentPatchSetId();
+    String filename = "filename1";
+    short side = (short) 1;
+
+    ChangeUpdate update = newUpdate(c, otherUser);
+    Timestamp now = TimeUtil.nowTs();
+    Comment comment =
+        newComment(
+            ps1,
+            filename,
+            uuid,
+            range,
+            range.getEndLine(),
+            otherUser,
+            null,
+            now,
+            "comment on ps1",
+            side,
+            rev,
+            false);
+    update.putComment(Status.PUBLISHED, comment);
+    update.commit();
+
+    assertThat(repo.exactRef(changeMetaRef(c.getId()))).isNotNull();
+    String draftRef = refsDraftComments(c.getId(), otherUser.getAccountId());
+    assertThat(exactRefAllUsers(draftRef)).isNull();
+  }
+
+  @Test
+  public void addingPublishedCommentDoesNotCreateNoOpCommitOnNonEmptyDraftRef() throws Exception {
+    Change c = newChange();
+    String rev = "abcd4567abcd4567abcd4567abcd4567abcd4567";
+    CommentRange range = new CommentRange(1, 1, 2, 1);
+    PatchSet.Id ps1 = c.currentPatchSetId();
+    String filename = "filename1";
+    short side = (short) 1;
+
+    ChangeUpdate update = newUpdate(c, otherUser);
+    Timestamp now = TimeUtil.nowTs();
+    Comment draft =
+        newComment(
+            ps1,
+            filename,
+            "uuid1",
+            range,
+            range.getEndLine(),
+            otherUser,
+            null,
+            now,
+            "draft comment on ps1",
+            side,
+            rev,
+            false);
+    update.putComment(Status.DRAFT, draft);
+    update.commit();
+
+    String draftRef = refsDraftComments(c.getId(), otherUser.getAccountId());
+    ObjectId old = exactRefAllUsers(draftRef);
+    assertThat(old).isNotNull();
+
+    update = newUpdate(c, otherUser);
+    Comment pub =
+        newComment(
+            ps1,
+            filename,
+            "uuid2",
+            range,
+            range.getEndLine(),
+            otherUser,
+            null,
+            now,
+            "comment on ps1",
+            side,
+            rev,
+            false);
+    update.putComment(Status.PUBLISHED, pub);
+    update.commit();
+
+    assertThat(exactRefAllUsers(draftRef)).isEqualTo(old);
+  }
+
+  @Test
+  public void fileComment() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, otherUser);
+    String uuid = "uuid";
+    String rev = "abcd1234abcd1234abcd1234abcd1234abcd1234";
+    String messageForBase = "comment for base";
+    Timestamp now = TimeUtil.nowTs();
+    PatchSet.Id psId = c.currentPatchSetId();
+
+    Comment comment =
+        newComment(
+            psId,
+            "filename",
+            uuid,
+            null,
+            0,
+            otherUser,
+            null,
+            now,
+            messageForBase,
+            (short) 0,
+            rev,
+            false);
+    update.setPatchSetId(psId);
+    update.putComment(Status.PUBLISHED, comment);
+    update.commit();
+
+    assertThat(newNotes(c).getComments())
+        .containsExactlyEntriesIn(ImmutableListMultimap.of(new RevId(rev), comment));
+  }
+
+  @Test
+  public void patchLineCommentNoRange() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, otherUser);
+    String uuid = "uuid";
+    String rev = "abcd1234abcd1234abcd1234abcd1234abcd1234";
+    String messageForBase = "comment for base";
+    Timestamp now = TimeUtil.nowTs();
+    PatchSet.Id psId = c.currentPatchSetId();
+
+    Comment comment =
+        newComment(
+            psId,
+            "filename",
+            uuid,
+            null,
+            1,
+            otherUser,
+            null,
+            now,
+            messageForBase,
+            (short) 0,
+            rev,
+            false);
+    update.setPatchSetId(psId);
+    update.putComment(Status.PUBLISHED, comment);
+    update.commit();
+
+    assertThat(newNotes(c).getComments())
+        .containsExactlyEntriesIn(ImmutableListMultimap.of(new RevId(rev), comment));
+  }
+
+  @Test
+  public void putCommentsForMultipleRevisions() throws Exception {
+    Change c = newChange();
+    String uuid = "uuid";
+    String rev1 = "abcd1234abcd1234abcd1234abcd1234abcd1234";
+    String rev2 = "abcd4567abcd4567abcd4567abcd4567abcd4567";
+    CommentRange range = new CommentRange(1, 1, 2, 1);
+    PatchSet.Id ps1 = c.currentPatchSetId();
+    String filename = "filename1";
+    short side = (short) 1;
+
+    incrementPatchSet(c);
+    PatchSet.Id ps2 = c.currentPatchSetId();
+
+    ChangeUpdate update = newUpdate(c, otherUser);
+    update.setPatchSetId(ps2);
+    Timestamp now = TimeUtil.nowTs();
+    Comment comment1 =
+        newComment(
+            ps1,
+            filename,
+            uuid,
+            range,
+            range.getEndLine(),
+            otherUser,
+            null,
+            now,
+            "comment on ps1",
+            side,
+            rev1,
+            false);
+    Comment comment2 =
+        newComment(
+            ps2,
+            filename,
+            uuid,
+            range,
+            range.getEndLine(),
+            otherUser,
+            null,
+            now,
+            "comment on ps2",
+            side,
+            rev2,
+            false);
+    update.putComment(Status.DRAFT, comment1);
+    update.putComment(Status.DRAFT, comment2);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getDraftComments(otherUserId)).hasSize(2);
+    assertThat(notes.getComments()).isEmpty();
+
+    update = newUpdate(c, otherUser);
+    update.setPatchSetId(ps2);
+    update.putComment(Status.PUBLISHED, comment1);
+    update.putComment(Status.PUBLISHED, comment2);
+    update.commit();
+
+    notes = newNotes(c);
+    assertThat(notes.getDraftComments(otherUserId)).isEmpty();
+    assertThat(notes.getComments()).hasSize(2);
+  }
+
+  @Test
+  public void publishSubsetOfCommentsOnRevision() throws Exception {
+    Change c = newChange();
+    RevId rev1 = new RevId("abcd1234abcd1234abcd1234abcd1234abcd1234");
+    CommentRange range = new CommentRange(1, 1, 2, 1);
+    PatchSet.Id ps1 = c.currentPatchSetId();
+    short side = (short) 1;
+
+    ChangeUpdate update = newUpdate(c, otherUser);
+    update.setPatchSetId(ps1);
+    Timestamp now = TimeUtil.nowTs();
+    Comment comment1 =
+        newComment(
+            ps1,
+            "file1",
+            "uuid1",
+            range,
+            range.getEndLine(),
+            otherUser,
+            null,
+            now,
+            "comment1",
+            side,
+            rev1.get(),
+            false);
+    Comment comment2 =
+        newComment(
+            ps1,
+            "file2",
+            "uuid2",
+            range,
+            range.getEndLine(),
+            otherUser,
+            null,
+            now,
+            "comment2",
+            side,
+            rev1.get(),
+            false);
+    update.putComment(Status.DRAFT, comment1);
+    update.putComment(Status.DRAFT, comment2);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getDraftComments(otherUserId).get(rev1)).containsExactly(comment1, comment2);
+    assertThat(notes.getComments()).isEmpty();
+
+    update = newUpdate(c, otherUser);
+    update.setPatchSetId(ps1);
+    update.putComment(Status.PUBLISHED, comment2);
+    update.commit();
+
+    notes = newNotes(c);
+    assertThat(notes.getDraftComments(otherUserId).get(rev1)).containsExactly(comment1);
+    assertThat(notes.getComments().get(rev1)).containsExactly(comment2);
+  }
+
+  @Test
+  public void updateWithServerIdent() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, internalUser);
+    update.setChangeMessage("A message.");
+    update.commit();
+
+    ChangeMessage msg = Iterables.getLast(newNotes(c).getChangeMessages());
+    assertThat(msg.getMessage()).isEqualTo("A message.");
+    assertThat(msg.getAuthor()).isNull();
+
+    update = newUpdate(c, internalUser);
+    exception.expect(IllegalStateException.class);
+    update.putApproval("Code-Review", (short) 1);
+  }
+
+  @Test
+  public void filterOutAndFixUpZombieDraftComments() throws Exception {
+    Change c = newChange();
+    RevId rev1 = new RevId("abcd1234abcd1234abcd1234abcd1234abcd1234");
+    CommentRange range = new CommentRange(1, 1, 2, 1);
+    PatchSet.Id ps1 = c.currentPatchSetId();
+    short side = (short) 1;
+
+    ChangeUpdate update = newUpdate(c, otherUser);
+    Timestamp now = TimeUtil.nowTs();
+    Comment comment1 =
+        newComment(
+            ps1,
+            "file1",
+            "uuid1",
+            range,
+            range.getEndLine(),
+            otherUser,
+            null,
+            now,
+            "comment on ps1",
+            side,
+            rev1.get(),
+            false);
+    Comment comment2 =
+        newComment(
+            ps1,
+            "file2",
+            "uuid2",
+            range,
+            range.getEndLine(),
+            otherUser,
+            null,
+            now,
+            "another comment",
+            side,
+            rev1.get(),
+            false);
+    update.putComment(Status.DRAFT, comment1);
+    update.putComment(Status.DRAFT, comment2);
+    update.commit();
+
+    String refName = refsDraftComments(c.getId(), otherUserId);
+    ObjectId oldDraftId = exactRefAllUsers(refName);
+
+    update = newUpdate(c, otherUser);
+    update.setPatchSetId(ps1);
+    update.putComment(Status.PUBLISHED, comment2);
+    update.commit();
+    assertThat(exactRefAllUsers(refName)).isNotNull();
+    assertThat(exactRefAllUsers(refName)).isNotEqualTo(oldDraftId);
+
+    // Re-add draft version of comment2 back to draft ref without updating
+    // change ref. Simulates the case where deleting the draft failed
+    // non-atomically after adding the published comment succeeded.
+    ChangeDraftUpdate draftUpdate = newUpdate(c, otherUser).createDraftUpdateIfNull();
+    draftUpdate.putComment(comment2);
+    try (NoteDbUpdateManager manager = updateManagerFactory.create(c.getProject())) {
+      manager.add(draftUpdate);
+      manager.execute();
+    }
+
+    // Looking at drafts directly shows the zombie comment.
+    DraftCommentNotes draftNotes = draftNotesFactory.create(c, otherUserId);
+    assertThat(draftNotes.load().getComments().get(rev1)).containsExactly(comment1, comment2);
+
+    // Zombie comment is filtered out of drafts via ChangeNotes.
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getDraftComments(otherUserId).get(rev1)).containsExactly(comment1);
+    assertThat(notes.getComments().get(rev1)).containsExactly(comment2);
+
+    update = newUpdate(c, otherUser);
+    update.setPatchSetId(ps1);
+    update.putComment(Status.PUBLISHED, comment1);
+    update.commit();
+
+    // Updating an unrelated comment causes the zombie comment to get fixed up.
+    assertThat(exactRefAllUsers(refName)).isNull();
+  }
+
+  @Test
+  public void updateCommentsInSequentialUpdates() throws Exception {
+    Change c = newChange();
+    CommentRange range = new CommentRange(1, 1, 2, 1);
+    String rev = "abcd1234abcd1234abcd1234abcd1234abcd1234";
+
+    ChangeUpdate update1 = newUpdate(c, otherUser);
+    Comment comment1 =
+        newComment(
+            c.currentPatchSetId(),
+            "filename",
+            "uuid1",
+            range,
+            range.getEndLine(),
+            otherUser,
+            null,
+            new Timestamp(update1.getWhen().getTime()),
+            "comment 1",
+            (short) 1,
+            rev,
+            false);
+    update1.putComment(Status.PUBLISHED, comment1);
+
+    ChangeUpdate update2 = newUpdate(c, otherUser);
+    Comment comment2 =
+        newComment(
+            c.currentPatchSetId(),
+            "filename",
+            "uuid2",
+            range,
+            range.getEndLine(),
+            otherUser,
+            null,
+            new Timestamp(update2.getWhen().getTime()),
+            "comment 2",
+            (short) 1,
+            rev,
+            false);
+    update2.putComment(Status.PUBLISHED, comment2);
+
+    try (NoteDbUpdateManager manager = updateManagerFactory.create(project)) {
+      manager.add(update1);
+      manager.add(update2);
+      manager.execute();
+    }
+
+    ChangeNotes notes = newNotes(c);
+    List<Comment> comments = notes.getComments().get(new RevId(rev));
+    assertThat(comments).hasSize(2);
+    assertThat(comments.get(0).message).isEqualTo("comment 1");
+    assertThat(comments.get(1).message).isEqualTo("comment 2");
+  }
+
+  @Test
+  public void realUser() throws Exception {
+    Change c = newChange();
+    CurrentUser ownerAsOtherUser = userFactory.runAs(null, otherUserId, changeOwner);
+    ChangeUpdate update = newUpdate(c, ownerAsOtherUser);
+    update.setChangeMessage("Message on behalf of other user");
+    update.commit();
+
+    ChangeMessage msg = Iterables.getLast(newNotes(c).getChangeMessages());
+    assertThat(msg.getMessage()).isEqualTo("Message on behalf of other user");
+    assertThat(msg.getAuthor()).isEqualTo(otherUserId);
+    assertThat(msg.getRealAuthor()).isEqualTo(changeOwner.getAccountId());
+  }
+
+  @Test
+  public void ignoreEntitiesBeyondCurrentPatchSet() throws Exception {
+    Change c = newChange();
+    ChangeNotes notes = newNotes(c);
+    int numMessages = notes.getChangeMessages().size();
+    int numPatchSets = notes.getPatchSets().size();
+    int numApprovals = notes.getApprovals().size();
+    int numComments = notes.getComments().size();
+
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setPatchSetId(new PatchSet.Id(c.getId(), c.currentPatchSetId().get() + 1));
+    update.setChangeMessage("Should be ignored");
+    update.putApproval("Code-Review", (short) 2);
+    CommentRange range = new CommentRange(1, 1, 2, 1);
+    Comment comment =
+        newComment(
+            update.getPatchSetId(),
+            "filename",
+            "uuid",
+            range,
+            range.getEndLine(),
+            changeOwner,
+            null,
+            new Timestamp(update.getWhen().getTime()),
+            "comment",
+            (short) 1,
+            "abcd1234abcd1234abcd1234abcd1234abcd1234",
+            false);
+    update.putComment(Status.PUBLISHED, comment);
+    update.commit();
+
+    notes = newNotes(c);
+    assertThat(notes.getChangeMessages()).hasSize(numMessages);
+    assertThat(notes.getPatchSets()).hasSize(numPatchSets);
+    assertThat(notes.getApprovals()).hasSize(numApprovals);
+    assertThat(notes.getComments()).hasSize(numComments);
+  }
+
+  @Test
+  public void currentPatchSet() throws Exception {
+    Change c = newChange();
+    assertThat(newNotes(c).getChange().currentPatchSetId().get()).isEqualTo(1);
+
+    incrementPatchSet(c);
+    assertThat(newNotes(c).getChange().currentPatchSetId().get()).isEqualTo(2);
+
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setPatchSetId(new PatchSet.Id(c.getId(), 1));
+    update.setCurrentPatchSet();
+    update.commit();
+    assertThat(newNotes(c).getChange().currentPatchSetId().get()).isEqualTo(1);
+
+    incrementPatchSet(c);
+    assertThat(newNotes(c).getChange().currentPatchSetId().get()).isEqualTo(3);
+
+    // Delete PS3, PS1 becomes current, as the most recent event explicitly set
+    // it to current.
+    update = newUpdate(c, changeOwner);
+    update.setPatchSetState(PatchSetState.DELETED);
+    update.commit();
+    assertThat(newNotes(c).getChange().currentPatchSetId().get()).isEqualTo(1);
+
+    // Delete PS1, PS2 becomes current.
+    update = newUpdate(c, changeOwner);
+    update.setPatchSetId(new PatchSet.Id(c.getId(), 1));
+    update.setPatchSetState(PatchSetState.DELETED);
+    update.commit();
+    assertThat(newNotes(c).getChange().currentPatchSetId().get()).isEqualTo(2);
+  }
+
+  @Test
+  public void readOnlyUntilExpires() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    Timestamp until = new Timestamp(TimeUtil.nowMs() + 10000);
+    update.setReadOnlyUntil(until);
+    update.commit();
+
+    update = newUpdate(c, changeOwner);
+    update.setTopic("failing-topic");
+    try {
+      update.commit();
+      assert_().fail("expected OrmException");
+    } catch (OrmException e) {
+      assertThat(e.getMessage()).contains("read-only until");
+    }
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getChange().getTopic()).isNotEqualTo("failing-topic");
+    assertThat(notes.getReadOnlyUntil()).isEqualTo(until);
+
+    TestTimeUtil.incrementClock(30, TimeUnit.SECONDS);
+    update = newUpdate(c, changeOwner);
+    update.setTopic("succeeding-topic");
+    update.commit();
+
+    // Write succeeded; lease still exists, even though it's expired.
+    notes = newNotes(c);
+    assertThat(notes.getChange().getTopic()).isEqualTo("succeeding-topic");
+    assertThat(notes.getReadOnlyUntil()).isEqualTo(until);
+
+    // New lease takes precedence.
+    update = newUpdate(c, changeOwner);
+    until = new Timestamp(TimeUtil.nowMs() + 10000);
+    update.setReadOnlyUntil(until);
+    update.commit();
+    assertThat(newNotes(c).getReadOnlyUntil()).isEqualTo(until);
+  }
+
+  @Test
+  public void readOnlyUntilCleared() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    Timestamp until = new Timestamp(TimeUtil.nowMs() + TimeUnit.DAYS.toMillis(30));
+    update.setReadOnlyUntil(until);
+    update.commit();
+
+    update = newUpdate(c, changeOwner);
+    update.setTopic("failing-topic");
+    try {
+      update.commit();
+      assert_().fail("expected OrmException");
+    } catch (OrmException e) {
+      assertThat(e.getMessage()).contains("read-only until");
+    }
+
+    // Sentinel timestamp of 0 can be written to clear lease.
+    update = newUpdate(c, changeOwner);
+    update.setReadOnlyUntil(new Timestamp(0));
+    update.commit();
+
+    update = newUpdate(c, changeOwner);
+    update.setTopic("succeeding-topic");
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getChange().getTopic()).isEqualTo("succeeding-topic");
+    assertThat(notes.getReadOnlyUntil()).isEqualTo(new Timestamp(0));
+  }
+
+  @Test
+  public void privateDefault() throws Exception {
+    Change c = newChange();
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getChange().isPrivate()).isFalse();
+  }
+
+  @Test
+  public void privateSetPrivate() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setPrivate(true);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getChange().isPrivate()).isTrue();
+  }
+
+  @Test
+  public void privateSetPrivateMultipleTimes() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setPrivate(true);
+    update.commit();
+
+    update = newUpdate(c, changeOwner);
+    update.setPrivate(false);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getChange().isPrivate()).isFalse();
+  }
+
+  @Test
+  public void defaultReviewersByEmailIsEmpty() throws Exception {
+    Change c = newChange();
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getReviewersByEmail().all()).isEmpty();
+  }
+
+  @Test
+  public void putReviewerByEmail() throws Exception {
+    Address adr = new Address("Foo Bar", "foo.bar@gerritcodereview.com");
+
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.putReviewerByEmail(adr, ReviewerStateInternal.REVIEWER);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getReviewersByEmail().all()).containsExactly(adr);
+  }
+
+  @Test
+  public void putAndRemoveReviewerByEmail() throws Exception {
+    Address adr = new Address("Foo Bar", "foo.bar@gerritcodereview.com");
+
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.putReviewerByEmail(adr, ReviewerStateInternal.REVIEWER);
+    update.commit();
+
+    update = newUpdate(c, changeOwner);
+    update.removeReviewerByEmail(adr);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getReviewersByEmail().all()).isEmpty();
+  }
+
+  @Test
+  public void putRemoveAndAddBackReviewerByEmail() throws Exception {
+    Address adr = new Address("Foo Bar", "foo.bar@gerritcodereview.com");
+
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.putReviewerByEmail(adr, ReviewerStateInternal.REVIEWER);
+    update.commit();
+
+    update = newUpdate(c, changeOwner);
+    update.removeReviewerByEmail(adr);
+    update.commit();
+
+    update = newUpdate(c, changeOwner);
+    update.putReviewerByEmail(adr, ReviewerStateInternal.CC);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getReviewersByEmail().all()).containsExactly(adr);
+  }
+
+  @Test
+  public void putReviewerByEmailAndCcByEmail() throws Exception {
+    Address adrReviewer = new Address("Foo Bar", "foo.bar@gerritcodereview.com");
+    Address adrCc = new Address("Foo Bor", "foo.bar.2@gerritcodereview.com");
+
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.putReviewerByEmail(adrReviewer, ReviewerStateInternal.REVIEWER);
+    update.commit();
+
+    update = newUpdate(c, changeOwner);
+    update.putReviewerByEmail(adrCc, ReviewerStateInternal.CC);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getReviewersByEmail().byState(ReviewerStateInternal.REVIEWER))
+        .containsExactly(adrReviewer);
+    assertThat(notes.getReviewersByEmail().byState(ReviewerStateInternal.CC))
+        .containsExactly(adrCc);
+    assertThat(notes.getReviewersByEmail().all()).containsExactly(adrReviewer, adrCc);
+  }
+
+  @Test
+  public void putReviewerByEmailAndChangeToCc() throws Exception {
+    Address adr = new Address("Foo Bar", "foo.bar@gerritcodereview.com");
+
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.putReviewerByEmail(adr, ReviewerStateInternal.REVIEWER);
+    update.commit();
+
+    update = newUpdate(c, changeOwner);
+    update.putReviewerByEmail(adr, ReviewerStateInternal.CC);
+    update.commit();
+
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getReviewersByEmail().byState(ReviewerStateInternal.REVIEWER)).isEmpty();
+    assertThat(notes.getReviewersByEmail().byState(ReviewerStateInternal.CC)).containsExactly(adr);
+    assertThat(notes.getReviewersByEmail().all()).containsExactly(adr);
+  }
+
+  @Test
+  public void hasReviewStarted() throws Exception {
+    ChangeNotes notes = newNotes(newChange());
+    assertThat(notes.getChange().hasReviewStarted()).isTrue();
+
+    notes = newNotes(newWorkInProgressChange());
+    assertThat(notes.getChange().hasReviewStarted()).isFalse();
+
+    Change c = newWorkInProgressChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.commit();
+    notes = newNotes(c);
+    assertThat(notes.getChange().hasReviewStarted()).isFalse();
+
+    update = newUpdate(c, changeOwner);
+    update.setWorkInProgress(true);
+    update.commit();
+    notes = newNotes(c);
+    assertThat(notes.getChange().hasReviewStarted()).isFalse();
+
+    update = newUpdate(c, changeOwner);
+    update.setWorkInProgress(false);
+    update.commit();
+    notes = newNotes(c);
+    assertThat(notes.getChange().hasReviewStarted()).isTrue();
+
+    // Once review is started, setting WIP should have no impact.
+    c = newChange();
+    notes = newNotes(c);
+    assertThat(notes.getChange().hasReviewStarted()).isTrue();
+    update = newUpdate(c, changeOwner);
+    update.setWorkInProgress(true);
+    update.commit();
+    notes = newNotes(c);
+    assertThat(notes.getChange().hasReviewStarted()).isTrue();
+  }
+
+  @Test
+  public void pendingReviewers() throws Exception {
+    Address adr1 = new Address("Foo Bar1", "foo.bar1@gerritcodereview.com");
+    Address adr2 = new Address("Foo Bar2", "foo.bar2@gerritcodereview.com");
+    Account.Id ownerId = changeOwner.getAccount().getId();
+    Account.Id otherUserId = otherUser.getAccount().getId();
+
+    ChangeNotes notes = newNotes(newChange());
+    assertThat(notes.getPendingReviewers().asTable()).isEmpty();
+    assertThat(notes.getPendingReviewersByEmail().asTable()).isEmpty();
+
+    Change c = newWorkInProgressChange();
+    notes = newNotes(c);
+    assertThat(notes.getPendingReviewers().asTable()).isEmpty();
+    assertThat(notes.getPendingReviewersByEmail().asTable()).isEmpty();
+
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.putReviewer(ownerId, REVIEWER);
+    update.putReviewer(otherUserId, CC);
+    update.putReviewerByEmail(adr1, REVIEWER);
+    update.putReviewerByEmail(adr2, CC);
+    update.commit();
+    notes = newNotes(c);
+    assertThat(notes.getPendingReviewers().byState(REVIEWER)).containsExactly(ownerId);
+    assertThat(notes.getPendingReviewers().byState(CC)).containsExactly(otherUserId);
+    assertThat(notes.getPendingReviewers().byState(REMOVED)).isEmpty();
+    assertThat(notes.getPendingReviewersByEmail().byState(REVIEWER)).containsExactly(adr1);
+    assertThat(notes.getPendingReviewersByEmail().byState(CC)).containsExactly(adr2);
+    assertThat(notes.getPendingReviewersByEmail().byState(REMOVED)).isEmpty();
+
+    update = newUpdate(c, changeOwner);
+    update.removeReviewer(ownerId);
+    update.removeReviewerByEmail(adr1);
+    update.commit();
+    notes = newNotes(c);
+    assertThat(notes.getPendingReviewers().byState(REVIEWER)).isEmpty();
+    assertThat(notes.getPendingReviewers().byState(CC)).containsExactly(otherUserId);
+    assertThat(notes.getPendingReviewers().byState(REMOVED)).containsExactly(ownerId);
+    assertThat(notes.getPendingReviewersByEmail().byState(REVIEWER)).isEmpty();
+    assertThat(notes.getPendingReviewersByEmail().byState(CC)).containsExactly(adr2);
+    assertThat(notes.getPendingReviewersByEmail().byState(REMOVED)).containsExactly(adr1);
+
+    update = newUpdate(c, changeOwner);
+    update.setWorkInProgress(false);
+    update.commit();
+    notes = newNotes(c);
+    assertThat(notes.getPendingReviewers().asTable()).isEmpty();
+    assertThat(notes.getPendingReviewersByEmail().asTable()).isEmpty();
+
+    update = newUpdate(c, changeOwner);
+    update.putReviewer(ownerId, REVIEWER);
+    update.putReviewerByEmail(adr1, REVIEWER);
+    update.commit();
+    notes = newNotes(c);
+    assertThat(notes.getPendingReviewers().asTable()).isEmpty();
+    assertThat(notes.getPendingReviewersByEmail().asTable()).isEmpty();
+  }
+
+  @Test
+  public void revertOfIsNullByDefault() throws Exception {
+    Change c = newChange();
+    ChangeNotes notes = newNotes(c);
+    assertThat(notes.getChange().getRevertOf()).isNull();
+  }
+
+  @Test
+  public void setRevertOfPersistsValue() throws Exception {
+    Change changeToRevert = newChange();
+    Change c = TestChanges.newChange(project, changeOwner.getAccountId());
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setChangeId(c.getKey().get());
+    update.setRevertOf(changeToRevert.getId().get());
+    update.commit();
+    assertThat(newNotes(c).getChange().getRevertOf()).isEqualTo(changeToRevert.getId());
+  }
+
+  @Test
+  public void setRevertOfToCurrentChangeFails() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    exception.expect(IllegalArgumentException.class);
+    exception.expectMessage("A change cannot revert itself");
+    update.setRevertOf(c.getId().get());
+  }
+
+  @Test
+  public void setRevertOfOnChildCommitFails() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setRevertOf(newChange().getId().get());
+    exception.expect(OrmException.class);
+    exception.expectMessage("Given ChangeUpdate is only allowed on initial commit");
+    update.commit();
+  }
+
+  private String readNote(ChangeNotes notes, ObjectId noteId) throws Exception {
+    ObjectId dataId = notes.revisionNoteMap.noteMap.getNote(noteId).getData();
+    return new String(rw.getObjectReader().open(dataId, OBJ_BLOB).getCachedBytes(), UTF_8);
+  }
+
+  private ObjectId exactRefAllUsers(String refName) throws Exception {
+    try (Repository allUsersRepo = repoManager.openRepository(allUsers)) {
+      Ref ref = allUsersRepo.exactRef(refName);
+      return ref != null ? ref.getObjectId() : null;
+    }
+  }
+
+  private void assertCause(
+      Throwable e, Class<? extends Throwable> expectedClass, String expectedMsg) {
+    Throwable cause = null;
+    for (Throwable t : Throwables.getCausalChain(e)) {
+      if (expectedClass.isAssignableFrom(t.getClass())) {
+        cause = t;
+        break;
+      }
+    }
+    assertThat(cause)
+        .named(
+            expectedClass.getSimpleName()
+                + " in causal chain of:\n"
+                + Throwables.getStackTraceAsString(e))
+        .isNotNull();
+    assertThat(cause.getMessage()).isEqualTo(expectedMsg);
+  }
+
+  private void incrementCurrentPatchSetFieldOnly(Change c) {
+    TestChanges.incrementPatchSet(c);
+  }
+
+  private RevCommit incrementPatchSet(Change c) throws Exception {
+    return incrementPatchSet(c, userFactory.create(c.getOwner()));
+  }
+
+  private RevCommit incrementPatchSet(Change c, IdentifiedUser user) throws Exception {
+    incrementCurrentPatchSetFieldOnly(c);
+    RevCommit commit = tr.commit().message("PS" + c.currentPatchSetId().get()).create();
+    ChangeUpdate update = newUpdate(c, user);
+    update.setCommit(rw, commit);
+    update.commit();
+    return tr.parseBody(commit);
+  }
+
+  private RequestId submissionId(Change c) {
+    return new RequestId(c.getId().toString());
+  }
+}
diff --git a/javatests/com/google/gerrit/server/notedb/CommentJsonMigratorTest.java b/javatests/com/google/gerrit/server/notedb/CommentJsonMigratorTest.java
new file mode 100644
index 0000000..dee6181
--- /dev/null
+++ b/javatests/com/google/gerrit/server/notedb/CommentJsonMigratorTest.java
@@ -0,0 +1,527 @@
+// Copyright (C) 2017 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.google.gerrit.server.notedb;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.collect.ImmutableMap.toImmutableMap;
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Multimaps;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gerrit.reviewdb.client.PatchLineComment.Status;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.client.RevId;
+import com.google.gerrit.server.CommentsUtil;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.notedb.CommentJsonMigrator.ProjectMigrationResult;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.testing.TestChanges;
+import com.google.inject.Inject;
+import java.io.ByteArrayOutputStream;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.notes.NoteMap;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevSort;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.junit.Before;
+import org.junit.Test;
+
+public class CommentJsonMigratorTest extends AbstractChangeNotesTest {
+  private CommentJsonMigrator migrator;
+  @Inject private ChangeNoteUtil noteUtil;
+  @Inject private CommentsUtil commentsUtil;
+  @Inject private LegacyChangeNoteWrite legacyChangeNoteWrite;
+  @Inject private AllUsersName allUsersName;
+
+  private AtomicInteger uuidCounter;
+
+  @Before
+  public void setUpCounter() {
+    uuidCounter = new AtomicInteger();
+    migrator = new CommentJsonMigrator(new ChangeNoteJson(), "gerrit", allUsersName);
+  }
+
+  @Test
+  public void noOpIfAllCommentsAreJson() throws Exception {
+    Change c = newChange();
+    incrementPatchSet(c);
+
+    ChangeNotes notes = newNotes(c);
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    Comment ps1Comment = newComment(notes, 1, "comment on ps1");
+    update.putComment(Status.PUBLISHED, ps1Comment);
+    update.commit();
+
+    notes = newNotes(c);
+    update = newUpdate(c, changeOwner);
+    Comment ps2Comment = newComment(notes, 2, "comment on ps2");
+    update.putComment(Status.PUBLISHED, ps2Comment);
+    update.commit();
+
+    notes = newNotes(c);
+    assertThat(getToStringRepresentations(notes.getComments()))
+        .containsExactly(
+            getRevId(notes, 1), ps1Comment.toString(),
+            getRevId(notes, 2), ps2Comment.toString());
+
+    ChangeNotes oldNotes = notes;
+    checkMigrate(project, ImmutableList.of());
+    assertNoDifferences(notes, oldNotes);
+    assertThat(notes.getMetaId()).isEqualTo(oldNotes.getMetaId());
+  }
+
+  @Test
+  public void migratePublishedComments() throws Exception {
+    Change c = newChange();
+    incrementPatchSet(c);
+
+    ChangeNotes notes = newNotes(c);
+
+    Comment ps1Comment1 = newComment(notes, 1, "first comment on ps1");
+    Comment ps2Comment1 = newComment(notes, 2, "first comment on ps2");
+    Comment ps1Comment2 = newComment(notes, 1, "second comment on ps1");
+
+    // Construct legacy format 'by hand'.
+    ByteArrayOutputStream out1 = new ByteArrayOutputStream(0);
+    legacyChangeNoteWrite.buildNote(
+        ImmutableListMultimap.<Integer, Comment>builder().put(1, ps1Comment1).build(), out1);
+
+    ByteArrayOutputStream out2 = new ByteArrayOutputStream(0);
+    legacyChangeNoteWrite.buildNote(
+        ImmutableListMultimap.<Integer, Comment>builder().put(2, ps2Comment1).build(), out2);
+
+    ByteArrayOutputStream out3 = new ByteArrayOutputStream(0);
+    legacyChangeNoteWrite.buildNote(
+        ImmutableListMultimap.<Integer, Comment>builder()
+            .put(1, ps1Comment2)
+            .put(1, ps1Comment1)
+            .build(),
+        out3);
+
+    TestRepository<Repository> testRepository = new TestRepository<>(repo, rw);
+
+    String metaRefName = RefNames.changeMetaRef(c.getId());
+    testRepository
+        .branch(metaRefName)
+        .commit()
+        .message("Review ps 1\n\nPatch-set: 1")
+        .add(ps1Comment1.revId, out1.toString())
+        .author(serverIdent)
+        .committer(serverIdent)
+        .create();
+
+    testRepository
+        .branch(metaRefName)
+        .commit()
+        .message("Review ps 2\n\nPatch-set: 2")
+        .add(ps2Comment1.revId, out2.toString())
+        .add(ps1Comment1.revId, out3.toString())
+        .author(serverIdent)
+        .committer(serverIdent)
+        .create();
+
+    notes = newNotes(c);
+    assertThat(getToStringRepresentations(notes.getComments()))
+        .containsExactly(
+            getRevId(notes, 1), ps1Comment1.toString(),
+            getRevId(notes, 1), ps1Comment2.toString(),
+            getRevId(notes, 2), ps2Comment1.toString());
+
+    // Comments at each commit all have legacy format.
+    ImmutableList<RevCommit> oldLog = log(project, RefNames.changeMetaRef(c.getId()));
+    assertThat(oldLog).hasSize(4);
+    assertThat(getLegacyFormatMapForPublishedComments(notes, oldLog.get(0))).isEmpty();
+    assertThat(getLegacyFormatMapForPublishedComments(notes, oldLog.get(1))).isEmpty();
+    assertThat(getLegacyFormatMapForPublishedComments(notes, oldLog.get(2)))
+        .containsExactly(ps1Comment1.key, true);
+    assertThat(getLegacyFormatMapForPublishedComments(notes, oldLog.get(3)))
+        .containsExactly(ps1Comment1.key, true, ps1Comment2.key, true, ps2Comment1.key, true);
+
+    // Check that dryRun doesn't touch anything.
+    String refName = RefNames.changeMetaRef(c.getId());
+    ObjectId before = repo.getRefDatabase().getRef(refName).getObjectId();
+    ProjectMigrationResult dryRunResult = migrator.migrateProject(project, repo, true);
+    ObjectId after = repo.getRefDatabase().getRef(refName).getObjectId();
+    assertThat(before).isEqualTo(after);
+    assertThat(dryRunResult.refsUpdated).isEqualTo(ImmutableList.of(refName));
+
+    ChangeNotes oldNotes = notes;
+    checkMigrate(project, ImmutableList.of(refName));
+
+    // Comment content is the same.
+    notes = newNotes(c);
+    assertNoDifferences(notes, oldNotes);
+    assertThat(getToStringRepresentations(notes.getComments()))
+        .containsExactly(
+            getRevId(notes, 1), ps1Comment1.toString(),
+            getRevId(notes, 1), ps1Comment2.toString(),
+            getRevId(notes, 2), ps2Comment1.toString());
+
+    // Comments at each commit all have JSON format.
+    ImmutableList<RevCommit> newLog = log(project, RefNames.changeMetaRef(c.getId()));
+    assertLogEqualExceptTrees(newLog, oldLog);
+    assertThat(getLegacyFormatMapForPublishedComments(notes, newLog.get(0))).isEmpty();
+    assertThat(getLegacyFormatMapForPublishedComments(notes, newLog.get(1))).isEmpty();
+    assertThat(getLegacyFormatMapForPublishedComments(notes, newLog.get(2)))
+        .containsExactly(ps1Comment1.key, false);
+    assertThat(getLegacyFormatMapForPublishedComments(notes, newLog.get(3)))
+        .containsExactly(ps1Comment1.key, false, ps1Comment2.key, false, ps2Comment1.key, false);
+  }
+
+  @Test
+  public void migrateDraftComments() throws Exception {
+    Change c = newChange();
+    incrementPatchSet(c);
+
+    ChangeNotes notes = newNotes(c);
+    ObjectId origMetaId = notes.getMetaId();
+
+    Comment ownerCommentPs1 = newComment(notes, 1, "owner comment on ps1", changeOwner);
+    Comment ownerCommentPs2 = newComment(notes, 2, "owner comment on ps2", changeOwner);
+    Comment otherCommentPs1 = newComment(notes, 1, "other user comment on ps1", otherUser);
+
+    ByteArrayOutputStream out1 = new ByteArrayOutputStream(0);
+    legacyChangeNoteWrite.buildNote(
+        ImmutableListMultimap.<Integer, Comment>builder().put(1, ownerCommentPs1).build(), out1);
+
+    ByteArrayOutputStream out2 = new ByteArrayOutputStream(0);
+    legacyChangeNoteWrite.buildNote(
+        ImmutableListMultimap.<Integer, Comment>builder().put(2, ownerCommentPs2).build(), out2);
+
+    ByteArrayOutputStream out3 = new ByteArrayOutputStream(0);
+    legacyChangeNoteWrite.buildNote(
+        ImmutableListMultimap.<Integer, Comment>builder().put(1, otherCommentPs1).build(), out3);
+
+    try (Repository allUsersRepo = repoManager.openRepository(allUsers);
+        RevWalk allUsersRw = new RevWalk(allUsersRepo)) {
+      TestRepository<Repository> testRepository = new TestRepository<>(allUsersRepo, allUsersRw);
+
+      testRepository
+          .branch(RefNames.refsDraftComments(c.getId(), changeOwner.getAccountId()))
+          .commit()
+          .message("Review ps 1\n\nPatch-set: 1")
+          .add(ownerCommentPs1.revId, out1.toString())
+          .author(serverIdent)
+          .committer(serverIdent)
+          .create();
+
+      testRepository
+          .branch(RefNames.refsDraftComments(c.getId(), changeOwner.getAccountId()))
+          .commit()
+          .message("Review ps 1\n\nPatch-set: 2")
+          .add(ownerCommentPs2.revId, out2.toString())
+          .author(serverIdent)
+          .committer(serverIdent)
+          .create();
+
+      testRepository
+          .branch(RefNames.refsDraftComments(c.getId(), otherUser.getAccountId()))
+          .commit()
+          .message("Review ps 2\n\nPatch-set: 2")
+          .add(otherCommentPs1.revId, out3.toString())
+          .author(serverIdent)
+          .committer(serverIdent)
+          .create();
+    }
+
+    notes = newNotes(c);
+    assertThat(getToStringRepresentations(notes.getDraftComments(changeOwner.getAccountId())))
+        .containsExactly(
+            getRevId(notes, 1), ownerCommentPs1.toString(),
+            getRevId(notes, 2), ownerCommentPs2.toString());
+    assertThat(getToStringRepresentations(notes.getDraftComments(otherUser.getAccountId())))
+        .containsExactly(getRevId(notes, 1), otherCommentPs1.toString());
+
+    // Comments at each commit all have legacy format.
+    ImmutableList<RevCommit> oldOwnerLog =
+        log(allUsers, RefNames.refsDraftComments(c.getId(), changeOwner.getAccountId()));
+    assertThat(oldOwnerLog).hasSize(2);
+    assertThat(getLegacyFormatMapForDraftComments(notes, oldOwnerLog.get(0)))
+        .containsExactly(ownerCommentPs1.key, true);
+    assertThat(getLegacyFormatMapForDraftComments(notes, oldOwnerLog.get(1)))
+        .containsExactly(ownerCommentPs1.key, true, ownerCommentPs2.key, true);
+
+    ImmutableList<RevCommit> oldOtherLog =
+        log(allUsers, RefNames.refsDraftComments(c.getId(), otherUser.getAccountId()));
+    assertThat(oldOtherLog).hasSize(1);
+    assertThat(getLegacyFormatMapForDraftComments(notes, oldOtherLog.get(0)))
+        .containsExactly(otherCommentPs1.key, true);
+
+    ChangeNotes oldNotes = notes;
+    checkMigrate(
+        allUsers,
+        ImmutableList.of(
+            RefNames.refsDraftComments(c.getId(), changeOwner.getAccountId()),
+            RefNames.refsDraftComments(c.getId(), otherUser.getAccountId())));
+    assertNoDifferences(notes, oldNotes);
+
+    // Migration doesn't touch change ref.
+    assertThat(repo.exactRef(RefNames.changeMetaRef(c.getId())).getObjectId())
+        .isEqualTo(origMetaId);
+
+    // Comment content is the same.
+    notes = newNotes(c);
+    assertThat(getToStringRepresentations(notes.getDraftComments(changeOwner.getAccountId())))
+        .containsExactly(
+            getRevId(notes, 1), ownerCommentPs1.toString(),
+            getRevId(notes, 2), ownerCommentPs2.toString());
+    assertThat(getToStringRepresentations(notes.getDraftComments(otherUser.getAccountId())))
+        .containsExactly(getRevId(notes, 1), otherCommentPs1.toString());
+
+    // Comments at each commit all have JSON format.
+    ImmutableList<RevCommit> newOwnerLog =
+        log(allUsers, RefNames.refsDraftComments(c.getId(), changeOwner.getAccountId()));
+    assertLogEqualExceptTrees(newOwnerLog, oldOwnerLog);
+    assertThat(getLegacyFormatMapForDraftComments(notes, newOwnerLog.get(0)))
+        .containsExactly(ownerCommentPs1.key, false);
+    assertThat(getLegacyFormatMapForDraftComments(notes, newOwnerLog.get(1)))
+        .containsExactly(ownerCommentPs1.key, false, ownerCommentPs2.key, false);
+
+    ImmutableList<RevCommit> newOtherLog =
+        log(allUsers, RefNames.refsDraftComments(c.getId(), otherUser.getAccountId()));
+    assertLogEqualExceptTrees(newOtherLog, oldOtherLog);
+    assertThat(getLegacyFormatMapForDraftComments(notes, newOtherLog.get(0)))
+        .containsExactly(otherCommentPs1.key, false);
+  }
+
+  @Test
+  public void migrateMixOfJsonAndLegacyComments() throws Exception {
+    // 3 comments: legacy, JSON, legacy. Because adding a comment necessarily rewrites the entire
+    // note, these comments need to be on separate patch sets.
+    Change c = newChange();
+    incrementPatchSet(c);
+    incrementPatchSet(c);
+
+    ChangeNotes notes = newNotes(c);
+
+    Comment ps1Comment = newComment(notes, 1, "comment on ps1 (legacy)");
+
+    ByteArrayOutputStream out1 = new ByteArrayOutputStream(0);
+    legacyChangeNoteWrite.buildNote(
+        ImmutableListMultimap.<Integer, Comment>builder().put(1, ps1Comment).build(), out1);
+
+    TestRepository<Repository> testRepository = new TestRepository<>(repo, rw);
+
+    String metaRefName = RefNames.changeMetaRef(c.getId());
+    testRepository
+        .branch(metaRefName)
+        .commit()
+        .message("Review ps 1\n\nPatch-set: 1")
+        .add(ps1Comment.revId, out1.toString())
+        .author(serverIdent)
+        .committer(serverIdent)
+        .create();
+
+    notes = newNotes(c);
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    Comment ps2Comment = newComment(notes, 2, "comment on ps2 (JSON)");
+    update.putComment(Status.PUBLISHED, ps2Comment);
+    update.commit();
+
+    Comment ps3Comment = newComment(notes, 3, "comment on ps3 (legacy)");
+    ByteArrayOutputStream out3 = new ByteArrayOutputStream(0);
+    legacyChangeNoteWrite.buildNote(
+        ImmutableListMultimap.<Integer, Comment>builder().put(3, ps3Comment).build(), out3);
+
+    testRepository
+        .branch(metaRefName)
+        .commit()
+        .message("Review ps 3\n\nPatch-set: 3")
+        .add(ps3Comment.revId, out3.toString())
+        .author(serverIdent)
+        .committer(serverIdent)
+        .create();
+
+    notes = newNotes(c);
+    assertThat(getToStringRepresentations(notes.getComments()))
+        .containsExactly(
+            getRevId(notes, 1), ps1Comment.toString(),
+            getRevId(notes, 2), ps2Comment.toString(),
+            getRevId(notes, 3), ps3Comment.toString());
+
+    // Comments at each commit match expected format.
+    ImmutableList<RevCommit> oldLog = log(project, RefNames.changeMetaRef(c.getId()));
+    assertThat(oldLog).hasSize(6);
+    assertThat(getLegacyFormatMapForPublishedComments(notes, oldLog.get(0))).isEmpty();
+    assertThat(getLegacyFormatMapForPublishedComments(notes, oldLog.get(1))).isEmpty();
+    assertThat(getLegacyFormatMapForPublishedComments(notes, oldLog.get(2))).isEmpty();
+    assertThat(getLegacyFormatMapForPublishedComments(notes, oldLog.get(3)))
+        .containsExactly(ps1Comment.key, true);
+    assertThat(getLegacyFormatMapForPublishedComments(notes, oldLog.get(4)))
+        .containsExactly(ps1Comment.key, true, ps2Comment.key, false);
+    assertThat(getLegacyFormatMapForPublishedComments(notes, oldLog.get(5)))
+        .containsExactly(ps1Comment.key, true, ps2Comment.key, false, ps3Comment.key, true);
+
+    ChangeNotes oldNotes = notes;
+    checkMigrate(project, ImmutableList.of(RefNames.changeMetaRef(c.getId())));
+    assertNoDifferences(notes, oldNotes);
+
+    // Comment content is the same.
+    notes = newNotes(c);
+    assertThat(getToStringRepresentations(notes.getComments()))
+        .containsExactly(
+            getRevId(notes, 1), ps1Comment.toString(),
+            getRevId(notes, 2), ps2Comment.toString(),
+            getRevId(notes, 3), ps3Comment.toString());
+
+    // Comments at each commit all have JSON format.
+    ImmutableList<RevCommit> newLog = log(project, RefNames.changeMetaRef(c.getId()));
+    assertLogEqualExceptTrees(newLog, oldLog);
+    assertThat(getLegacyFormatMapForPublishedComments(notes, newLog.get(0))).isEmpty();
+    assertThat(getLegacyFormatMapForPublishedComments(notes, newLog.get(1))).isEmpty();
+    assertThat(getLegacyFormatMapForPublishedComments(notes, newLog.get(2))).isEmpty();
+    assertThat(getLegacyFormatMapForPublishedComments(notes, newLog.get(3)))
+        .containsExactly(ps1Comment.key, false);
+    assertThat(getLegacyFormatMapForPublishedComments(notes, newLog.get(4)))
+        .containsExactly(ps1Comment.key, false, ps2Comment.key, false);
+    assertThat(getLegacyFormatMapForPublishedComments(notes, newLog.get(5)))
+        .containsExactly(ps1Comment.key, false, ps2Comment.key, false, ps3Comment.key, false);
+  }
+
+  private void checkMigrate(Project.NameKey project, List<String> expectedRefs) throws Exception {
+    try (Repository repo = repoManager.openRepository(project)) {
+      ProjectMigrationResult progress = migrator.migrateProject(project, repo, false);
+
+      assertThat(progress.ok).isTrue();
+      assertThat(progress.refsUpdated).isEqualTo(expectedRefs);
+    }
+  }
+
+  private Comment newComment(ChangeNotes notes, int psNum, String message) {
+    return newComment(notes, psNum, message, changeOwner);
+  }
+
+  private Comment newComment(
+      ChangeNotes notes, int psNum, String message, IdentifiedUser commenter) {
+    return newComment(
+        new PatchSet.Id(notes.getChangeId(), psNum),
+        "filename",
+        "uuid-" + uuidCounter.getAndIncrement(),
+        null,
+        0,
+        commenter,
+        null,
+        TimeUtil.nowTs(),
+        message,
+        (short) 1,
+        getRevId(notes, psNum).get(),
+        false);
+  }
+
+  private void incrementPatchSet(Change c) throws Exception {
+    TestChanges.incrementPatchSet(c);
+    RevCommit commit = tr.commit().message("PS" + c.currentPatchSetId().get()).create();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setCommit(rw, commit);
+    update.commit();
+  }
+
+  private static RevId getRevId(ChangeNotes notes, int psNum) {
+    PatchSet.Id psId = new PatchSet.Id(notes.getChangeId(), psNum);
+    PatchSet ps = notes.getPatchSets().get(psId);
+    checkArgument(ps != null, "no patch set %s: %s", psNum, notes.getPatchSets());
+    return ps.getRevision();
+  }
+
+  private static ListMultimap<RevId, String> getToStringRepresentations(
+      ListMultimap<RevId, Comment> comments) {
+    // Use string representation for equality comparison in this test, because Comment#equals only
+    // compares keys.
+    return Multimaps.transformValues(comments, Comment::toString);
+  }
+
+  private ImmutableMap<Comment.Key, Boolean> getLegacyFormatMapForPublishedComments(
+      ChangeNotes notes, ObjectId metaId) throws Exception {
+    return getLegacyFormatMap(project, notes.getChangeId(), metaId, Status.PUBLISHED);
+  }
+
+  private ImmutableMap<Comment.Key, Boolean> getLegacyFormatMapForDraftComments(
+      ChangeNotes notes, ObjectId metaId) throws Exception {
+    return getLegacyFormatMap(allUsers, notes.getChangeId(), metaId, Status.DRAFT);
+  }
+
+  private ImmutableMap<Comment.Key, Boolean> getLegacyFormatMap(
+      Project.NameKey project, Change.Id changeId, ObjectId metaId, Status status)
+      throws Exception {
+    try (Repository repo = repoManager.openRepository(project);
+        ObjectReader reader = repo.newObjectReader();
+        RevWalk rw = new RevWalk(reader)) {
+      NoteMap noteMap = NoteMap.read(reader, rw.parseCommit(metaId));
+      RevisionNoteMap<ChangeRevisionNote> revNoteMap =
+          RevisionNoteMap.parse(
+              noteUtil.getChangeNoteJson(),
+              noteUtil.getLegacyChangeNoteRead(),
+              changeId,
+              reader,
+              noteMap,
+              status);
+      return revNoteMap.revisionNotes.values().stream()
+          .flatMap(crn -> crn.getComments().stream())
+          .collect(toImmutableMap(c -> c.key, c -> c.legacyFormat));
+    }
+  }
+
+  private ImmutableList<RevCommit> log(Project.NameKey project, String refName) throws Exception {
+    try (Repository repo = repoManager.openRepository(project);
+        RevWalk rw = new RevWalk(repo)) {
+      rw.sort(RevSort.TOPO);
+      rw.sort(RevSort.REVERSE);
+      Ref ref = repo.exactRef(refName);
+      checkArgument(ref != null, "missing ref: %s", refName);
+      rw.markStart(rw.parseCommit(ref.getObjectId()));
+      return ImmutableList.copyOf(rw);
+    }
+  }
+
+  private static void assertLogEqualExceptTrees(
+      ImmutableList<RevCommit> actualLog, ImmutableList<RevCommit> expectedLog) {
+    assertThat(actualLog).hasSize(expectedLog.size());
+    for (int i = 0; i < expectedLog.size(); i++) {
+      RevCommit actual = actualLog.get(i);
+      RevCommit expected = expectedLog.get(i);
+      assertThat(actual.getAuthorIdent())
+          .named("author of entry %s", i)
+          .isEqualTo(expected.getAuthorIdent());
+      assertThat(actual.getCommitterIdent())
+          .named("committer of entry %s", i)
+          .isEqualTo(expected.getCommitterIdent());
+      assertThat(actual.getFullMessage()).named("message of entry %s", i).isNotNull();
+      assertThat(actual.getFullMessage())
+          .named("message of entry %s", i)
+          .isEqualTo(expected.getFullMessage());
+    }
+  }
+
+  private void assertNoDifferences(ChangeNotes actual, ChangeNotes expected) throws Exception {
+    assertThat(
+            ChangeBundle.fromNotes(commentsUtil, actual)
+                .differencesFrom(ChangeBundle.fromNotes(commentsUtil, expected)))
+        .isEmpty();
+  }
+}
diff --git a/javatests/com/google/gerrit/server/notedb/CommentTimestampAdapterTest.java b/javatests/com/google/gerrit/server/notedb/CommentTimestampAdapterTest.java
new file mode 100644
index 0000000..e7d8956
--- /dev/null
+++ b/javatests/com/google/gerrit/server/notedb/CommentTimestampAdapterTest.java
@@ -0,0 +1,173 @@
+// Copyright (C) 2017 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.google.gerrit.server.notedb;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Comment;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import java.sql.Timestamp;
+import java.time.ZonedDateTime;
+import java.util.TimeZone;
+import java.util.concurrent.TimeUnit;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class CommentTimestampAdapterTest {
+  /** Arbitrary time outside of a DST transition, as an ISO instant. */
+  private static final String NON_DST_STR = "2017-02-07T10:20:30.123Z";
+
+  /** Arbitrary time outside of a DST transition, as a reasonable Java 8 representation. */
+  private static final ZonedDateTime NON_DST = ZonedDateTime.parse(NON_DST_STR);
+
+  /** {@link #NON_DST_STR} truncated to seconds. */
+  private static final String NON_DST_STR_TRUNC = "2017-02-07T10:20:30Z";
+
+  /** Arbitrary time outside of a DST transition, as an unreasonable Timestamp representation. */
+  private static final Timestamp NON_DST_TS = Timestamp.from(NON_DST.toInstant());
+
+  /** {@link #NON_DST_TS} truncated to seconds. */
+  private static final Timestamp NON_DST_TS_TRUNC =
+      Timestamp.from(ZonedDateTime.parse(NON_DST_STR_TRUNC).toInstant());
+
+  /**
+   * Real live ms since epoch timestamp of a comment that was posted during the PDT to PST
+   * transition in November 2013.
+   */
+  private static final long MID_DST_MS = 1383466224175L;
+
+  /**
+   * Ambiguous string representation of {@link #MID_DST_MS} that was actually stored in NoteDb for
+   * this comment.
+   */
+  private static final String MID_DST_STR = "Nov 3, 2013 1:10:24 AM";
+
+  private TimeZone systemTimeZone;
+  private Gson legacyGson;
+  private Gson gson;
+
+  @Before
+  public void setUp() {
+    systemTimeZone = TimeZone.getDefault();
+    TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles"));
+
+    // Match ChangeNoteUtil#gson as of 4e1f02db913d91f2988f559048e513e6093a1bce
+    legacyGson = new GsonBuilder().setPrettyPrinting().create();
+    gson = ChangeNoteJson.newGson();
+  }
+
+  @After
+  public void tearDown() {
+    TimeZone.setDefault(systemTimeZone);
+  }
+
+  @Test
+  public void legacyGsonBehavesAsExpectedDuringDstTransition() {
+    long oneHourMs = TimeUnit.HOURS.toMillis(1);
+
+    String beforeJson = "\"Nov 3, 2013 12:10:24 AM\"";
+    Timestamp beforeTs = new Timestamp(MID_DST_MS - oneHourMs);
+    assertThat(legacyGson.toJson(beforeTs)).isEqualTo(beforeJson);
+
+    String ambiguousJson = '"' + MID_DST_STR + '"';
+    Timestamp duringTs = new Timestamp(MID_DST_MS);
+    assertThat(legacyGson.toJson(duringTs)).isEqualTo(ambiguousJson);
+
+    Timestamp afterTs = new Timestamp(MID_DST_MS + oneHourMs);
+    assertThat(legacyGson.toJson(afterTs)).isEqualTo(ambiguousJson);
+
+    Timestamp beforeTsTruncated = new Timestamp(beforeTs.getTime() / 1000 * 1000);
+    assertThat(legacyGson.fromJson(beforeJson, Timestamp.class)).isEqualTo(beforeTsTruncated);
+
+    // Gson just picks one, and it happens to be the one after the PST transition.
+    Timestamp afterTsTruncated = new Timestamp(afterTs.getTime() / 1000 * 1000);
+    assertThat(legacyGson.fromJson(ambiguousJson, Timestamp.class)).isEqualTo(afterTsTruncated);
+  }
+
+  @Test
+  public void legacyAdapterViaZonedDateTime() {
+    assertThat(legacyGson.toJson(NON_DST_TS)).isEqualTo("\"Feb 7, 2017 2:20:30 AM\"");
+  }
+
+  @Test
+  public void legacyAdapterCanParseOutputOfNewAdapter() {
+    String instantJson = gson.toJson(NON_DST_TS);
+    assertThat(instantJson).isEqualTo('"' + NON_DST_STR_TRUNC + '"');
+    Timestamp result = legacyGson.fromJson(instantJson, Timestamp.class);
+    assertThat(result).isEqualTo(NON_DST_TS_TRUNC);
+  }
+
+  @Test
+  public void newAdapterCanParseOutputOfLegacyAdapter() {
+    String legacyJson = legacyGson.toJson(NON_DST_TS);
+    assertThat(legacyJson).isEqualTo("\"Feb 7, 2017 2:20:30 AM\"");
+    assertThat(gson.fromJson(legacyJson, Timestamp.class))
+        .isEqualTo(new Timestamp(NON_DST_TS.getTime() / 1000 * 1000));
+  }
+
+  @Test
+  public void newAdapterDisagreesWithLegacyAdapterDuringDstTransition() {
+    String duringJson = legacyGson.toJson(new Timestamp(MID_DST_MS));
+    Timestamp duringTs = legacyGson.fromJson(duringJson, Timestamp.class);
+
+    // This is unfortunate, but it's just documenting the current behavior, there is no real good
+    // solution here. The goal is that all these changes will be rebuilt with proper UTC instant
+    // strings shortly after the new adapter is live.
+    Timestamp newDuringTs = gson.fromJson(duringJson, Timestamp.class);
+    assertThat(newDuringTs.toString()).isEqualTo(duringTs.toString());
+    assertThat(newDuringTs).isNotEqualTo(duringTs);
+  }
+
+  @Test
+  public void newAdapterRoundTrip() {
+    String json = gson.toJson(NON_DST_TS);
+    // Round-trip lossily truncates ms, but that's ok.
+    assertThat(json).isEqualTo('"' + NON_DST_STR_TRUNC + '"');
+    assertThat(gson.fromJson(json, Timestamp.class)).isEqualTo(NON_DST_TS_TRUNC);
+  }
+
+  @Test
+  public void nullSafety() {
+    assertThat(gson.toJson(null, Timestamp.class)).isEqualTo("null");
+    assertThat(gson.fromJson("null", Timestamp.class)).isNull();
+  }
+
+  @Test
+  public void newAdapterRoundTripOfWholeComment() {
+    Comment c =
+        new Comment(
+            new Comment.Key("uuid", "filename", 1),
+            new Account.Id(100),
+            NON_DST_TS,
+            (short) 0,
+            "message",
+            "serverId",
+            false);
+    c.lineNbr = 1;
+    c.revId = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef";
+
+    String json = gson.toJson(c);
+    assertThat(json).contains("\"writtenOn\": \"" + NON_DST_STR_TRUNC + "\",");
+
+    Comment result = gson.fromJson(json, Comment.class);
+    // Round-trip lossily truncates ms, but that's ok.
+    assertThat(result.writtenOn).isEqualTo(NON_DST_TS_TRUNC);
+    result.writtenOn = NON_DST_TS;
+    assertThat(result).isEqualTo(c);
+  }
+}
diff --git a/javatests/com/google/gerrit/server/notedb/CommitMessageOutputTest.java b/javatests/com/google/gerrit/server/notedb/CommitMessageOutputTest.java
new file mode 100644
index 0000000..1b50431
--- /dev/null
+++ b/javatests/com/google/gerrit/server/notedb/CommitMessageOutputTest.java
@@ -0,0 +1,431 @@
+// Copyright (C) 2014 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.google.gerrit.server.notedb;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.server.notedb.ReviewerStateInternal.CC;
+import static com.google.gerrit.server.notedb.ReviewerStateInternal.REVIEWER;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.mail.Address;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.logging.RequestId;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.gerrit.testing.TestChanges;
+import java.util.Date;
+import java.util.TimeZone;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(ConfigSuite.class)
+public class CommitMessageOutputTest extends AbstractChangeNotesTest {
+  @Test
+  public void approvalsCommitFormatSimple() throws Exception {
+    Change c = TestChanges.newChange(project, changeOwner.getAccountId(), 1);
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.putApproval("Verified", (short) 1);
+    update.putApproval("Code-Review", (short) -1);
+    update.putReviewer(changeOwner.getAccount().getId(), REVIEWER);
+    update.putReviewer(otherUser.getAccount().getId(), CC);
+    update.commit();
+    assertThat(update.getRefName()).isEqualTo("refs/changes/01/1/meta");
+
+    RevCommit commit = parseCommit(update.getResult());
+    assertBodyEquals(
+        "Update patch set 1\n"
+            + "\n"
+            + "Patch-set: 1\n"
+            + "Change-id: "
+            + c.getKey().get()
+            + "\n"
+            + "Subject: Change subject\n"
+            + "Branch: refs/heads/master\n"
+            + "Commit: "
+            + update.getCommit().name()
+            + "\n"
+            + "Reviewer: Gerrit User 1 <1@gerrit>\n"
+            + "CC: Gerrit User 2 <2@gerrit>\n"
+            + "Label: Code-Review=-1\n"
+            + "Label: Verified=+1\n",
+        commit);
+
+    PersonIdent author = commit.getAuthorIdent();
+    assertThat(author.getName()).isEqualTo("Gerrit User 1");
+    assertThat(author.getEmailAddress()).isEqualTo("1@gerrit");
+    assertThat(author.getWhen()).isEqualTo(new Date(c.getCreatedOn().getTime() + 1000));
+    assertThat(author.getTimeZone()).isEqualTo(TimeZone.getTimeZone("GMT-7:00"));
+
+    PersonIdent committer = commit.getCommitterIdent();
+    assertThat(committer.getName()).isEqualTo("Gerrit Server");
+    assertThat(committer.getEmailAddress()).isEqualTo("noreply@gerrit.com");
+    assertThat(committer.getWhen()).isEqualTo(author.getWhen());
+    assertThat(committer.getTimeZone()).isEqualTo(author.getTimeZone());
+  }
+
+  @Test
+  public void changeMessageCommitFormatSimple() throws Exception {
+    Change c = TestChanges.newChange(project, changeOwner.getAccountId(), 1);
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setChangeMessage("Just a little code change.\nHow about a new line");
+    update.commit();
+    assertThat(update.getRefName()).isEqualTo("refs/changes/01/1/meta");
+
+    assertBodyEquals(
+        "Update patch set 1\n"
+            + "\n"
+            + "Just a little code change.\n"
+            + "How about a new line\n"
+            + "\n"
+            + "Patch-set: 1\n"
+            + "Change-id: "
+            + c.getKey().get()
+            + "\n"
+            + "Subject: Change subject\n"
+            + "Branch: refs/heads/master\n"
+            + "Commit: "
+            + update.getCommit().name()
+            + "\n",
+        update.getResult());
+  }
+
+  @Test
+  public void changeWithRevision() throws Exception {
+    Change c = TestChanges.newChange(project, changeOwner.getAccountId(), 1);
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setChangeMessage("Foo");
+    RevCommit commit = tr.commit().message("Subject").create();
+    update.setCommit(rw, commit);
+    update.commit();
+    assertThat(update.getRefName()).isEqualTo("refs/changes/01/1/meta");
+
+    assertBodyEquals(
+        "Update patch set 1\n"
+            + "\n"
+            + "Foo\n"
+            + "\n"
+            + "Patch-set: 1\n"
+            + "Change-id: "
+            + c.getKey().get()
+            + "\n"
+            + "Subject: Subject\n"
+            + "Branch: refs/heads/master\n"
+            + "Commit: "
+            + commit.name()
+            + "\n",
+        update.getResult());
+  }
+
+  @Test
+  public void approvalTombstoneCommitFormat() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.removeApproval("Code-Review");
+    update.commit();
+
+    assertBodyEquals(
+        "Update patch set 1\n\nPatch-set: 1\nLabel: -Code-Review\n", update.getResult());
+  }
+
+  @Test
+  public void submitCommitFormat() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setSubjectForCommit("Submit patch set 1");
+
+    RequestId submissionId = submissionId(c);
+    update.merge(
+        submissionId,
+        ImmutableList.of(
+            submitRecord(
+                "NOT_READY",
+                null,
+                submitLabel("Verified", "OK", changeOwner.getAccountId()),
+                submitLabel("Code-Review", "NEED", null)),
+            submitRecord(
+                "NOT_READY",
+                null,
+                submitLabel("Verified", "OK", changeOwner.getAccountId()),
+                submitLabel("Alternative-Code-Review", "NEED", null))));
+    update.commit();
+
+    RevCommit commit = parseCommit(update.getResult());
+    assertBodyEquals(
+        "Submit patch set 1\n"
+            + "\n"
+            + "Patch-set: 1\n"
+            + "Status: merged\n"
+            + "Submission-id: "
+            + submissionId.toStringForStorage()
+            + "\n"
+            + "Submitted-with: NOT_READY\n"
+            + "Submitted-with: OK: Verified: Gerrit User 1 <1@gerrit>\n"
+            + "Submitted-with: NEED: Code-Review\n"
+            + "Submitted-with: NOT_READY\n"
+            + "Submitted-with: OK: Verified: Gerrit User 1 <1@gerrit>\n"
+            + "Submitted-with: NEED: Alternative-Code-Review\n",
+        commit);
+
+    PersonIdent author = commit.getAuthorIdent();
+    assertThat(author.getName()).isEqualTo("Gerrit User 1");
+    assertThat(author.getEmailAddress()).isEqualTo("1@gerrit");
+    assertThat(author.getWhen()).isEqualTo(new Date(c.getCreatedOn().getTime() + 2000));
+    assertThat(author.getTimeZone()).isEqualTo(TimeZone.getTimeZone("GMT-7:00"));
+
+    PersonIdent committer = commit.getCommitterIdent();
+    assertThat(committer.getName()).isEqualTo("Gerrit Server");
+    assertThat(committer.getEmailAddress()).isEqualTo("noreply@gerrit.com");
+    assertThat(committer.getWhen()).isEqualTo(author.getWhen());
+    assertThat(committer.getTimeZone()).isEqualTo(author.getTimeZone());
+  }
+
+  @Test
+  public void anonymousUser() throws Exception {
+    Account anon = new Account(new Account.Id(3), TimeUtil.nowTs());
+    accountCache.put(anon);
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, userFactory.create(anon.getId()));
+    update.setChangeMessage("Comment on the change.");
+    update.commit();
+
+    RevCommit commit = parseCommit(update.getResult());
+    assertBodyEquals("Update patch set 1\n\nComment on the change.\n\nPatch-set: 1\n", commit);
+
+    PersonIdent author = commit.getAuthorIdent();
+    assertThat(author.getName()).isEqualTo("Gerrit User 3");
+    assertThat(author.getEmailAddress()).isEqualTo("3@gerrit");
+  }
+
+  @Test
+  public void submitWithErrorMessage() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setSubjectForCommit("Submit patch set 1");
+
+    RequestId submissionId = submissionId(c);
+    update.merge(
+        submissionId, ImmutableList.of(submitRecord("RULE_ERROR", "Problem with patch set:\n1")));
+    update.commit();
+
+    assertBodyEquals(
+        "Submit patch set 1\n"
+            + "\n"
+            + "Patch-set: 1\n"
+            + "Status: merged\n"
+            + "Submission-id: "
+            + submissionId.toStringForStorage()
+            + "\n"
+            + "Submitted-with: RULE_ERROR Problem with patch set: 1\n",
+        update.getResult());
+  }
+
+  @Test
+  public void noChangeMessage() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.putReviewer(changeOwner.getAccount().getId(), REVIEWER);
+    update.commit();
+
+    assertBodyEquals(
+        "Update patch set 1\n\nPatch-set: 1\nReviewer: Gerrit User 1 <1@gerrit>\n",
+        update.getResult());
+  }
+
+  @Test
+  public void changeMessageWithTrailingDoubleNewline() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setChangeMessage("Testing trailing double newline\n\n");
+    update.commit();
+
+    assertBodyEquals(
+        "Update patch set 1\n"
+            + "\n"
+            + "Testing trailing double newline\n"
+            + "\n"
+            + "\n"
+            + "\n"
+            + "Patch-set: 1\n",
+        update.getResult());
+  }
+
+  @Test
+  public void changeMessageWithMultipleParagraphs() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setChangeMessage("Testing paragraph 1\n\nTesting paragraph 2\n\nTesting paragraph 3");
+    update.commit();
+
+    assertBodyEquals(
+        "Update patch set 1\n"
+            + "\n"
+            + "Testing paragraph 1\n"
+            + "\n"
+            + "Testing paragraph 2\n"
+            + "\n"
+            + "Testing paragraph 3\n"
+            + "\n"
+            + "Patch-set: 1\n",
+        update.getResult());
+  }
+
+  @Test
+  public void changeMessageWithTag() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setChangeMessage("Change message with tag");
+    update.setTag("jenkins");
+    update.commit();
+
+    assertBodyEquals(
+        "Update patch set 1\n"
+            + "\n"
+            + "Change message with tag\n"
+            + "\n"
+            + "Patch-set: 1\n"
+            + "Tag: jenkins\n",
+        update.getResult());
+  }
+
+  @Test
+  public void leadingWhitespace() throws Exception {
+    Change c = TestChanges.newChange(project, changeOwner.getAccountId());
+    c.setCurrentPatchSet(c.currentPatchSetId(), "  " + c.getSubject(), c.getOriginalSubject());
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setChangeId(c.getKey().get());
+    update.setBranch(c.getDest().get());
+    update.commit();
+
+    assertBodyEquals(
+        "Update patch set 1\n"
+            + "\n"
+            + "Patch-set: 1\n"
+            + "Change-id: "
+            + c.getKey().get()
+            + "\n"
+            + "Subject:   Change subject\n"
+            + "Branch: refs/heads/master\n"
+            + "Commit: "
+            + update.getCommit().name()
+            + "\n",
+        update.getResult());
+
+    c = TestChanges.newChange(project, changeOwner.getAccountId());
+    c.setCurrentPatchSet(c.currentPatchSetId(), "\t\t" + c.getSubject(), c.getOriginalSubject());
+    update = newUpdate(c, changeOwner);
+    update.setChangeId(c.getKey().get());
+    update.setBranch(c.getDest().get());
+    update.commit();
+
+    assertBodyEquals(
+        "Update patch set 1\n"
+            + "\n"
+            + "Patch-set: 1\n"
+            + "Change-id: "
+            + c.getKey().get()
+            + "\n"
+            + "Subject: \t\tChange subject\n"
+            + "Branch: refs/heads/master\n"
+            + "Commit: "
+            + update.getCommit().name()
+            + "\n",
+        update.getResult());
+  }
+
+  @Test
+  public void realUser() throws Exception {
+    Change c = newChange();
+    CurrentUser ownerAsOtherUser = userFactory.runAs(null, otherUserId, changeOwner);
+    ChangeUpdate update = newUpdate(c, ownerAsOtherUser);
+    update.setChangeMessage("Message on behalf of other user");
+    update.commit();
+
+    RevCommit commit = parseCommit(update.getResult());
+    PersonIdent author = commit.getAuthorIdent();
+    assertThat(author.getName()).isEqualTo("Gerrit User 2");
+    assertThat(author.getEmailAddress()).isEqualTo("2@gerrit");
+
+    assertBodyEquals(
+        "Update patch set 1\n"
+            + "\n"
+            + "Message on behalf of other user\n"
+            + "\n"
+            + "Patch-set: 1\n"
+            + "Real-user: Gerrit User 1 <1@gerrit>\n",
+        commit);
+  }
+
+  @Test
+  public void currentPatchSet() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.setCurrentPatchSet();
+    update.commit();
+
+    assertBodyEquals("Update patch set 1\n\nPatch-set: 1\nCurrent: true\n", update.getResult());
+  }
+
+  @Test
+  public void reviewerByEmail() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.putReviewerByEmail(
+        new Address("John Doe", "j.doe@gerritcodereview.com"), ReviewerStateInternal.REVIEWER);
+    update.commit();
+
+    assertBodyEquals(
+        "Update patch set 1\n\nPatch-set: 1\n"
+            + "Reviewer-email: John Doe <j.doe@gerritcodereview.com>\n",
+        update.getResult());
+  }
+
+  @Test
+  public void ccByEmail() throws Exception {
+    Change c = newChange();
+    ChangeUpdate update = newUpdate(c, changeOwner);
+    update.putReviewerByEmail(new Address("j.doe@gerritcodereview.com"), ReviewerStateInternal.CC);
+    update.commit();
+
+    assertBodyEquals(
+        "Update patch set 1\n\nPatch-set: 1\nCC-email: j.doe@gerritcodereview.com\n",
+        update.getResult());
+  }
+
+  private RevCommit parseCommit(ObjectId id) throws Exception {
+    if (id instanceof RevCommit) {
+      return (RevCommit) id;
+    }
+    try (RevWalk walk = new RevWalk(repo)) {
+      RevCommit commit = walk.parseCommit(id);
+      walk.parseBody(commit);
+      return commit;
+    }
+  }
+
+  private void assertBodyEquals(String expected, ObjectId commitId) throws Exception {
+    RevCommit commit = parseCommit(commitId);
+    assertThat(commit.getFullMessage()).isEqualTo(expected);
+  }
+
+  private RequestId submissionId(Change c) {
+    return new RequestId(c.getId().toString());
+  }
+}
diff --git a/javatests/com/google/gerrit/server/notedb/NoteDbChangeStateTest.java b/javatests/com/google/gerrit/server/notedb/NoteDbChangeStateTest.java
new file mode 100644
index 0000000..c82135e
--- /dev/null
+++ b/javatests/com/google/gerrit/server/notedb/NoteDbChangeStateTest.java
@@ -0,0 +1,241 @@
+// 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.
+
+package com.google.gerrit.server.notedb;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth8.assertThat;
+import static com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage.NOTE_DB;
+import static com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage.REVIEW_DB;
+import static com.google.gerrit.server.notedb.NoteDbChangeState.applyDelta;
+import static com.google.gerrit.server.notedb.NoteDbChangeState.parse;
+import static com.google.gerrit.server.util.time.TimeUtil.nowTs;
+import static org.eclipse.jgit.lib.ObjectId.zeroId;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.notedb.NoteDbChangeState.Delta;
+import com.google.gerrit.server.notedb.NoteDbChangeState.RefState;
+import com.google.gerrit.testing.GerritBaseTests;
+import com.google.gerrit.testing.TestChanges;
+import com.google.gerrit.testing.TestTimeUtil;
+import java.sql.Timestamp;
+import java.util.Optional;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.lib.ObjectId;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/** Unit tests for {@link NoteDbChangeState}. */
+public class NoteDbChangeStateTest extends GerritBaseTests {
+  ObjectId SHA1 = ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef");
+  ObjectId SHA2 = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
+  ObjectId SHA3 = ObjectId.fromString("badc0feebadc0feebadc0feebadc0feebadc0fee");
+
+  @Before
+  public void setUp() {
+    TestTimeUtil.resetWithClockStep(1, TimeUnit.SECONDS);
+  }
+
+  @After
+  public void tearDown() {
+    TestTimeUtil.useSystemTime();
+  }
+
+  @Test
+  public void parseReviewDbWithoutDrafts() {
+    NoteDbChangeState state = parse(new Change.Id(1), SHA1.name());
+    assertThat(state.getPrimaryStorage()).isEqualTo(REVIEW_DB);
+    assertThat(state.getChangeId()).isEqualTo(new Change.Id(1));
+    assertThat(state.getChangeMetaId()).isEqualTo(SHA1);
+    assertThat(state.getDraftIds()).isEmpty();
+    assertThat(state.getReadOnlyUntil()).isEmpty();
+    assertThat(state.toString()).isEqualTo(SHA1.name());
+
+    state = parse(new Change.Id(1), "R," + SHA1.name());
+    assertThat(state.getPrimaryStorage()).isEqualTo(REVIEW_DB);
+    assertThat(state.getChangeId()).isEqualTo(new Change.Id(1));
+    assertThat(state.getChangeMetaId()).isEqualTo(SHA1);
+    assertThat(state.getDraftIds()).isEmpty();
+    assertThat(state.getReadOnlyUntil()).isEmpty();
+    assertThat(state.toString()).isEqualTo(SHA1.name());
+  }
+
+  @Test
+  public void parseReviewDbWithDrafts() {
+    String str = SHA1.name() + ",2003=" + SHA2.name() + ",1001=" + SHA3.name();
+    String expected = SHA1.name() + ",1001=" + SHA3.name() + ",2003=" + SHA2.name();
+    NoteDbChangeState state = parse(new Change.Id(1), str);
+    assertThat(state.getPrimaryStorage()).isEqualTo(REVIEW_DB);
+    assertThat(state.getChangeId()).isEqualTo(new Change.Id(1));
+    assertThat(state.getChangeMetaId()).isEqualTo(SHA1);
+    assertThat(state.getDraftIds())
+        .containsExactly(
+            new Account.Id(1001), SHA3,
+            new Account.Id(2003), SHA2);
+    assertThat(state.getReadOnlyUntil()).isEmpty();
+    assertThat(state.toString()).isEqualTo(expected);
+
+    state = parse(new Change.Id(1), "R," + str);
+    assertThat(state.getPrimaryStorage()).isEqualTo(REVIEW_DB);
+    assertThat(state.getChangeId()).isEqualTo(new Change.Id(1));
+    assertThat(state.getChangeMetaId()).isEqualTo(SHA1);
+    assertThat(state.getDraftIds())
+        .containsExactly(
+            new Account.Id(1001), SHA3,
+            new Account.Id(2003), SHA2);
+    assertThat(state.getReadOnlyUntil()).isEmpty();
+    assertThat(state.toString()).isEqualTo(expected);
+  }
+
+  @Test
+  public void parseReadOnlyUntil() {
+    Timestamp ts = new Timestamp(12345);
+    String str = "R=12345," + SHA1.name();
+    NoteDbChangeState state = parse(new Change.Id(1), str);
+    assertThat(state.getPrimaryStorage()).isEqualTo(REVIEW_DB);
+    assertThat(state.getChangeId()).isEqualTo(new Change.Id(1));
+    assertThat(state.getChangeMetaId()).isEqualTo(SHA1);
+    assertThat(state.getReadOnlyUntil().get()).isEqualTo(ts);
+    assertThat(state.toString()).isEqualTo(str);
+
+    str = "N=12345";
+    state = parse(new Change.Id(1), str);
+    assertThat(state.getPrimaryStorage()).isEqualTo(NOTE_DB);
+    assertThat(state.getChangeId()).isEqualTo(new Change.Id(1));
+    assertThat(state.getRefState()).isEmpty();
+    assertThat(state.getReadOnlyUntil().get()).isEqualTo(ts);
+    assertThat(state.toString()).isEqualTo(str);
+  }
+
+  @Test
+  public void applyDeltaToNullWithNoNewMetaId() throws Exception {
+    Change c = newChange();
+    assertThat(c.getNoteDbState()).isNull();
+    applyDelta(c, Delta.create(c.getId(), noMetaId(), noDrafts()));
+    assertThat(c.getNoteDbState()).isNull();
+
+    applyDelta(c, Delta.create(c.getId(), noMetaId(), drafts(new Account.Id(1001), zeroId())));
+    assertThat(c.getNoteDbState()).isNull();
+  }
+
+  @Test
+  public void applyDeltaToMetaId() throws Exception {
+    Change c = newChange();
+    applyDelta(c, Delta.create(c.getId(), metaId(SHA1), noDrafts()));
+    assertThat(c.getNoteDbState()).isEqualTo(SHA1.name());
+
+    applyDelta(c, Delta.create(c.getId(), metaId(SHA2), noDrafts()));
+    assertThat(c.getNoteDbState()).isEqualTo(SHA2.name());
+
+    // No-op delta.
+    applyDelta(c, Delta.create(c.getId(), noMetaId(), noDrafts()));
+    assertThat(c.getNoteDbState()).isEqualTo(SHA2.name());
+
+    // Set to zero clears the field.
+    applyDelta(c, Delta.create(c.getId(), metaId(zeroId()), noDrafts()));
+    assertThat(c.getNoteDbState()).isNull();
+  }
+
+  @Test
+  public void applyDeltaToDrafts() throws Exception {
+    Change c = newChange();
+    applyDelta(c, Delta.create(c.getId(), metaId(SHA1), drafts(new Account.Id(1001), SHA2)));
+    assertThat(c.getNoteDbState()).isEqualTo(SHA1.name() + ",1001=" + SHA2.name());
+
+    applyDelta(c, Delta.create(c.getId(), noMetaId(), drafts(new Account.Id(2003), SHA3)));
+    assertThat(c.getNoteDbState())
+        .isEqualTo(SHA1.name() + ",1001=" + SHA2.name() + ",2003=" + SHA3.name());
+
+    applyDelta(c, Delta.create(c.getId(), noMetaId(), drafts(new Account.Id(2003), zeroId())));
+    assertThat(c.getNoteDbState()).isEqualTo(SHA1.name() + ",1001=" + SHA2.name());
+
+    applyDelta(c, Delta.create(c.getId(), metaId(SHA3), noDrafts()));
+    assertThat(c.getNoteDbState()).isEqualTo(SHA3.name() + ",1001=" + SHA2.name());
+  }
+
+  @Test
+  public void applyDeltaToReadOnly() throws Exception {
+    Timestamp ts = nowTs();
+    Change c = newChange();
+    NoteDbChangeState state =
+        new NoteDbChangeState(
+            c.getId(),
+            REVIEW_DB,
+            Optional.of(RefState.create(SHA1, ImmutableMap.of())),
+            Optional.of(new Timestamp(ts.getTime() + 10000)));
+    c.setNoteDbState(state.toString());
+    Delta delta = Delta.create(c.getId(), metaId(SHA2), noDrafts());
+    applyDelta(c, delta);
+    assertThat(NoteDbChangeState.parse(c))
+        .isEqualTo(
+            new NoteDbChangeState(
+                state.getChangeId(),
+                state.getPrimaryStorage(),
+                Optional.of(RefState.create(SHA2, ImmutableMap.of())),
+                state.getReadOnlyUntil()));
+  }
+
+  @Test
+  public void parseNoteDbPrimary() {
+    NoteDbChangeState state = parse(new Change.Id(1), "N");
+    assertThat(state.getPrimaryStorage()).isEqualTo(NOTE_DB);
+    assertThat(state.getRefState()).isEmpty();
+    assertThat(state.getReadOnlyUntil()).isEmpty();
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void parseInvalidPrimaryStorage() {
+    parse(new Change.Id(1), "X");
+  }
+
+  @Test
+  public void applyDeltaToNoteDbPrimaryIsNoOp() throws Exception {
+    Change c = newChange();
+    c.setNoteDbState("N");
+    applyDelta(c, Delta.create(c.getId(), metaId(SHA1), drafts(new Account.Id(1001), SHA2)));
+    assertThat(c.getNoteDbState()).isEqualTo("N");
+  }
+
+  private static Change newChange() {
+    return TestChanges.newChange(new Project.NameKey("project"), new Account.Id(12345));
+  }
+
+  // Static factory methods to avoid type arguments when using as method args.
+
+  private static Optional<ObjectId> noMetaId() {
+    return Optional.empty();
+  }
+
+  private static Optional<ObjectId> metaId(ObjectId id) {
+    return Optional.of(id);
+  }
+
+  private static ImmutableMap<Account.Id, ObjectId> noDrafts() {
+    return ImmutableMap.of();
+  }
+
+  private static ImmutableMap<Account.Id, ObjectId> drafts(Object... args) {
+    checkArgument(args.length % 2 == 0);
+    ImmutableMap.Builder<Account.Id, ObjectId> b = ImmutableMap.builder();
+    for (int i = 0; i < args.length / 2; i++) {
+      b.put((Account.Id) args[2 * i], (ObjectId) args[2 * i + 1]);
+    }
+    return b.build();
+  }
+}
diff --git a/javatests/com/google/gerrit/server/notedb/RepoSequenceTest.java b/javatests/com/google/gerrit/server/notedb/RepoSequenceTest.java
new file mode 100644
index 0000000..a21f5ba
--- /dev/null
+++ b/javatests/com/google/gerrit/server/notedb/RepoSequenceTest.java
@@ -0,0 +1,394 @@
+// 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.
+
+package com.google.gerrit.server.notedb;
+
+import static com.google.common.truth.Truth.assertThat;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
+import static org.junit.Assert.fail;
+
+import com.github.rholder.retry.Retryer;
+import com.github.rholder.retry.RetryerBuilder;
+import com.github.rholder.retry.StopStrategies;
+import com.google.common.util.concurrent.Runnables;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.testing.InMemoryRepositoryManager;
+import com.google.gwtorm.server.OrmException;
+import java.io.IOException;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.eclipse.jgit.errors.IncorrectObjectTypeException;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+public class RepoSequenceTest {
+  // Don't sleep in tests.
+  private static final Retryer<RefUpdate.Result> RETRYER =
+      RepoSequence.retryerBuilder().withBlockStrategy(t -> {}).build();
+
+  @Rule public ExpectedException exception = ExpectedException.none();
+
+  private InMemoryRepositoryManager repoManager;
+  private Project.NameKey project;
+
+  @Before
+  public void setUp() throws Exception {
+    repoManager = new InMemoryRepositoryManager();
+    project = new Project.NameKey("project");
+    repoManager.createRepository(project);
+  }
+
+  @Test
+  public void oneCaller() throws Exception {
+    int max = 20;
+    for (int batchSize = 1; batchSize <= 10; batchSize++) {
+      String name = "batch-size-" + batchSize;
+      RepoSequence s = newSequence(name, 1, batchSize);
+      for (int i = 1; i <= max; i++) {
+        try {
+          assertThat(s.next()).named("i=" + i + " for " + name).isEqualTo(i);
+        } catch (OrmException e) {
+          throw new AssertionError("failed batchSize=" + batchSize + ", i=" + i, e);
+        }
+      }
+      assertThat(s.acquireCount)
+          .named("acquireCount for " + name)
+          .isEqualTo(divCeil(max, batchSize));
+    }
+  }
+
+  @Test
+  public void oneCallerNoLoop() throws Exception {
+    RepoSequence s = newSequence("id", 1, 3);
+    assertThat(s.acquireCount).isEqualTo(0);
+
+    assertThat(s.next()).isEqualTo(1);
+    assertThat(s.acquireCount).isEqualTo(1);
+    assertThat(s.next()).isEqualTo(2);
+    assertThat(s.acquireCount).isEqualTo(1);
+    assertThat(s.next()).isEqualTo(3);
+    assertThat(s.acquireCount).isEqualTo(1);
+
+    assertThat(s.next()).isEqualTo(4);
+    assertThat(s.acquireCount).isEqualTo(2);
+    assertThat(s.next()).isEqualTo(5);
+    assertThat(s.acquireCount).isEqualTo(2);
+    assertThat(s.next()).isEqualTo(6);
+    assertThat(s.acquireCount).isEqualTo(2);
+
+    assertThat(s.next()).isEqualTo(7);
+    assertThat(s.acquireCount).isEqualTo(3);
+    assertThat(s.next()).isEqualTo(8);
+    assertThat(s.acquireCount).isEqualTo(3);
+    assertThat(s.next()).isEqualTo(9);
+    assertThat(s.acquireCount).isEqualTo(3);
+
+    assertThat(s.next()).isEqualTo(10);
+    assertThat(s.acquireCount).isEqualTo(4);
+  }
+
+  @Test
+  public void twoCallers() throws Exception {
+    RepoSequence s1 = newSequence("id", 1, 3);
+    RepoSequence s2 = newSequence("id", 1, 3);
+
+    // s1 acquires 1-3; s2 acquires 4-6.
+    assertThat(s1.next()).isEqualTo(1);
+    assertThat(s2.next()).isEqualTo(4);
+    assertThat(s1.next()).isEqualTo(2);
+    assertThat(s2.next()).isEqualTo(5);
+    assertThat(s1.next()).isEqualTo(3);
+    assertThat(s2.next()).isEqualTo(6);
+
+    // s2 acquires 7-9; s1 acquires 10-12.
+    assertThat(s2.next()).isEqualTo(7);
+    assertThat(s1.next()).isEqualTo(10);
+    assertThat(s2.next()).isEqualTo(8);
+    assertThat(s1.next()).isEqualTo(11);
+    assertThat(s2.next()).isEqualTo(9);
+    assertThat(s1.next()).isEqualTo(12);
+  }
+
+  @Test
+  public void populateEmptyRefWithStartValue() throws Exception {
+    RepoSequence s = newSequence("id", 1234, 10);
+    assertThat(s.next()).isEqualTo(1234);
+    assertThat(readBlob("id")).isEqualTo("1244");
+  }
+
+  @Test
+  public void startIsIgnoredIfRefIsPresent() throws Exception {
+    writeBlob("id", "1234");
+    RepoSequence s = newSequence("id", 3456, 10);
+    assertThat(s.next()).isEqualTo(1234);
+    assertThat(readBlob("id")).isEqualTo("1244");
+  }
+
+  @Test
+  public void retryOnLockFailure() throws Exception {
+    // Seed existing ref value.
+    writeBlob("id", "1");
+
+    AtomicBoolean doneBgUpdate = new AtomicBoolean(false);
+    Runnable bgUpdate =
+        () -> {
+          if (!doneBgUpdate.getAndSet(true)) {
+            writeBlob("id", "1234");
+          }
+        };
+
+    RepoSequence s = newSequence("id", 1, 10, bgUpdate, RETRYER);
+    assertThat(doneBgUpdate.get()).isFalse();
+    assertThat(s.next()).isEqualTo(1234);
+    // Single acquire call that results in 2 ref reads.
+    assertThat(s.acquireCount).isEqualTo(1);
+    assertThat(doneBgUpdate.get()).isTrue();
+  }
+
+  @Test
+  public void failOnInvalidValue() throws Exception {
+    ObjectId id = writeBlob("id", "not a number");
+    exception.expect(OrmException.class);
+    exception.expectMessage("invalid value in refs/sequences/id blob at " + id.name());
+    newSequence("id", 1, 3).next();
+  }
+
+  @Test
+  public void failOnWrongType() throws Exception {
+    try (Repository repo = repoManager.openRepository(project)) {
+      TestRepository<Repository> tr = new TestRepository<>(repo);
+      tr.branch(RefNames.REFS_SEQUENCES + "id").commit().create();
+      try {
+        newSequence("id", 1, 3).next();
+        fail();
+      } catch (OrmException e) {
+        assertThat(e.getCause()).isInstanceOf(ExecutionException.class);
+        assertThat(e.getCause().getCause()).isInstanceOf(IncorrectObjectTypeException.class);
+      }
+    }
+  }
+
+  @Test
+  public void failAfterRetryerGivesUp() throws Exception {
+    AtomicInteger bgCounter = new AtomicInteger(1234);
+    RepoSequence s =
+        newSequence(
+            "id",
+            1,
+            10,
+            () -> writeBlob("id", Integer.toString(bgCounter.getAndAdd(1000))),
+            RetryerBuilder.<RefUpdate.Result>newBuilder()
+                .withStopStrategy(StopStrategies.stopAfterAttempt(3))
+                .build());
+    exception.expect(OrmException.class);
+    exception.expectMessage("failed to update refs/sequences/id: LOCK_FAILURE");
+    s.next();
+  }
+
+  @Test
+  public void nextWithCountOneCaller() throws Exception {
+    RepoSequence s = newSequence("id", 1, 3);
+    assertThat(s.next(2)).containsExactly(1, 2).inOrder();
+    assertThat(s.acquireCount).isEqualTo(1);
+    assertThat(s.next(2)).containsExactly(3, 4).inOrder();
+    assertThat(s.acquireCount).isEqualTo(2);
+    assertThat(s.next(2)).containsExactly(5, 6).inOrder();
+    assertThat(s.acquireCount).isEqualTo(2);
+
+    assertThat(s.next(3)).containsExactly(7, 8, 9).inOrder();
+    assertThat(s.acquireCount).isEqualTo(3);
+    assertThat(s.next(3)).containsExactly(10, 11, 12).inOrder();
+    assertThat(s.acquireCount).isEqualTo(4);
+    assertThat(s.next(3)).containsExactly(13, 14, 15).inOrder();
+    assertThat(s.acquireCount).isEqualTo(5);
+
+    assertThat(s.next(7)).containsExactly(16, 17, 18, 19, 20, 21, 22).inOrder();
+    assertThat(s.acquireCount).isEqualTo(6);
+    assertThat(s.next(7)).containsExactly(23, 24, 25, 26, 27, 28, 29).inOrder();
+    assertThat(s.acquireCount).isEqualTo(7);
+    assertThat(s.next(7)).containsExactly(30, 31, 32, 33, 34, 35, 36).inOrder();
+    assertThat(s.acquireCount).isEqualTo(8);
+  }
+
+  @Test
+  public void nextWithCountMultipleCallers() throws Exception {
+    RepoSequence s1 = newSequence("id", 1, 3);
+    RepoSequence s2 = newSequence("id", 1, 4);
+
+    assertThat(s1.next(2)).containsExactly(1, 2).inOrder();
+    assertThat(s1.acquireCount).isEqualTo(1);
+
+    // s1 hasn't exhausted its last batch.
+    assertThat(s2.next(2)).containsExactly(4, 5).inOrder();
+    assertThat(s2.acquireCount).isEqualTo(1);
+
+    // s1 acquires again to cover this request, plus a whole new batch.
+    assertThat(s1.next(3)).containsExactly(3, 8, 9);
+    assertThat(s1.acquireCount).isEqualTo(2);
+
+    // s2 hasn't exhausted its last batch, do so now.
+    assertThat(s2.next(2)).containsExactly(6, 7);
+    assertThat(s2.acquireCount).isEqualTo(1);
+  }
+
+  @Test
+  public void increaseTo() throws Exception {
+    // Seed existing ref value.
+    writeBlob("id", "1");
+
+    RepoSequence s = newSequence("id", 1, 10);
+
+    s.increaseTo(2);
+    assertThat(s.next()).isEqualTo(2);
+  }
+
+  @Test
+  public void increaseToLowerValueIsIgnored() throws Exception {
+    // Seed existing ref value.
+    writeBlob("id", "2");
+
+    RepoSequence s = newSequence("id", 1, 10);
+
+    s.increaseTo(1);
+    assertThat(s.next()).isEqualTo(2);
+  }
+
+  @Test
+  public void increaseToRetryOnLockFailureV1() throws Exception {
+    // Seed existing ref value.
+    writeBlob("id", "1");
+
+    AtomicBoolean doneBgUpdate = new AtomicBoolean(false);
+    Runnable bgUpdate =
+        () -> {
+          if (!doneBgUpdate.getAndSet(true)) {
+            writeBlob("id", "2");
+          }
+        };
+
+    RepoSequence s = newSequence("id", 1, 10, bgUpdate, RETRYER);
+    assertThat(doneBgUpdate.get()).isFalse();
+
+    // Increase the value to 3. The background thread increases the value to 2, which makes the
+    // increase to value 3 fail once with LockFailure. The increase to 3 is then retried and is
+    // expected to succeed.
+    s.increaseTo(3);
+    assertThat(s.next()).isEqualTo(3);
+
+    assertThat(doneBgUpdate.get()).isTrue();
+  }
+
+  @Test
+  public void increaseToRetryOnLockFailureV2() throws Exception {
+    // Seed existing ref value.
+    writeBlob("id", "1");
+
+    AtomicBoolean doneBgUpdate = new AtomicBoolean(false);
+    Runnable bgUpdate =
+        () -> {
+          if (!doneBgUpdate.getAndSet(true)) {
+            writeBlob("id", "3");
+          }
+        };
+
+    RepoSequence s = newSequence("id", 1, 10, bgUpdate, RETRYER);
+    assertThat(doneBgUpdate.get()).isFalse();
+
+    // Increase the value to 2. The background thread increases the value to 3, which makes the
+    // increase to value 2 fail with LockFailure. The increase to 2 is then not retried because the
+    // current value is already higher and it should be preserved.
+    s.increaseTo(2);
+    assertThat(s.next()).isEqualTo(3);
+
+    assertThat(doneBgUpdate.get()).isTrue();
+  }
+
+  @Test
+  public void increaseToFailAfterRetryerGivesUp() throws Exception {
+    AtomicInteger bgCounter = new AtomicInteger(1234);
+    RepoSequence s =
+        newSequence(
+            "id",
+            1,
+            10,
+            () -> writeBlob("id", Integer.toString(bgCounter.getAndAdd(1000))),
+            RetryerBuilder.<RefUpdate.Result>newBuilder()
+                .withStopStrategy(StopStrategies.stopAfterAttempt(3))
+                .build());
+    exception.expect(OrmException.class);
+    exception.expectMessage("failed to update refs/sequences/id: LOCK_FAILURE");
+    s.increaseTo(2);
+  }
+
+  private RepoSequence newSequence(String name, int start, int batchSize) {
+    return newSequence(name, start, batchSize, Runnables.doNothing(), RETRYER);
+  }
+
+  private RepoSequence newSequence(
+      String name,
+      final int start,
+      int batchSize,
+      Runnable afterReadRef,
+      Retryer<RefUpdate.Result> retryer) {
+    return new RepoSequence(
+        repoManager,
+        GitReferenceUpdated.DISABLED,
+        project,
+        name,
+        () -> start,
+        batchSize,
+        afterReadRef,
+        retryer);
+  }
+
+  private ObjectId writeBlob(String sequenceName, String value) {
+    String refName = RefNames.REFS_SEQUENCES + sequenceName;
+    try (Repository repo = repoManager.openRepository(project);
+        ObjectInserter ins = repo.newObjectInserter()) {
+      ObjectId newId = ins.insert(OBJ_BLOB, value.getBytes(UTF_8));
+      ins.flush();
+      RefUpdate ru = repo.updateRef(refName);
+      ru.setNewObjectId(newId);
+      assertThat(ru.forceUpdate()).isAnyOf(RefUpdate.Result.NEW, RefUpdate.Result.FORCED);
+      return newId;
+    } catch (IOException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  private String readBlob(String sequenceName) throws Exception {
+    String refName = RefNames.REFS_SEQUENCES + sequenceName;
+    try (Repository repo = repoManager.openRepository(project);
+        RevWalk rw = new RevWalk(repo)) {
+      ObjectId id = repo.exactRef(refName).getObjectId();
+      return new String(rw.getObjectReader().open(id).getCachedBytes(), UTF_8);
+    }
+  }
+
+  private static long divCeil(float a, float b) {
+    return Math.round(Math.ceil(a / b));
+  }
+}
diff --git a/javatests/com/google/gerrit/server/notedb/rebuild/EventSorterTest.java b/javatests/com/google/gerrit/server/notedb/rebuild/EventSorterTest.java
new file mode 100644
index 0000000..c81a176
--- /dev/null
+++ b/javatests/com/google/gerrit/server/notedb/rebuild/EventSorterTest.java
@@ -0,0 +1,231 @@
+// 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.
+
+package com.google.gerrit.server.notedb.rebuild;
+
+import static com.google.common.truth.Truth.assertThat;
+import static java.util.stream.Collectors.toList;
+import static org.junit.Assert.fail;
+
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Lists;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.testing.TestTimeUtil;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Stream;
+import org.junit.Before;
+import org.junit.Test;
+
+public class EventSorterTest {
+  private class TestEvent extends Event {
+    protected TestEvent(Timestamp when) {
+      super(
+          new PatchSet.Id(new Change.Id(1), 1),
+          new Account.Id(1000),
+          new Account.Id(1000),
+          when,
+          changeCreatedOn,
+          null);
+    }
+
+    @Override
+    boolean uniquePerUpdate() {
+      return false;
+    }
+
+    @Override
+    void apply(ChangeUpdate update) {
+      throw new UnsupportedOperationException();
+    }
+
+    @SuppressWarnings("deprecation")
+    @Override
+    public String toString() {
+      return "E{" + when.getSeconds() + '}';
+    }
+  }
+
+  private Timestamp changeCreatedOn;
+
+  @Before
+  public void setUp() {
+    TestTimeUtil.resetWithClockStep(10, TimeUnit.SECONDS);
+    changeCreatedOn = TimeUtil.nowTs();
+  }
+
+  @Test
+  public void naturalSort() {
+    Event e1 = new TestEvent(TimeUtil.nowTs());
+    Event e2 = new TestEvent(TimeUtil.nowTs());
+    Event e3 = new TestEvent(TimeUtil.nowTs());
+
+    for (List<Event> events : Collections2.permutations(events(e1, e2, e3))) {
+      assertSorted(events, events(e1, e2, e3));
+    }
+  }
+
+  @Test
+  public void topoSortOneDep() {
+    List<Event> es;
+
+    // Input list is 0,1,2
+
+    // 0 depends on 1 => 1,0,2
+    es = threeEventsOneDep(0, 1);
+    assertSorted(es, events(es, 1, 0, 2));
+
+    // 1 depends on 0 => 0,1,2
+    es = threeEventsOneDep(1, 0);
+    assertSorted(es, events(es, 0, 1, 2));
+
+    // 0 depends on 2 => 1,2,0
+    es = threeEventsOneDep(0, 2);
+    assertSorted(es, events(es, 1, 2, 0));
+
+    // 2 depends on 0 => 0,1,2
+    es = threeEventsOneDep(2, 0);
+    assertSorted(es, events(es, 0, 1, 2));
+
+    // 1 depends on 2 => 0,2,1
+    es = threeEventsOneDep(1, 2);
+    assertSorted(es, events(es, 0, 2, 1));
+
+    // 2 depends on 1 => 0,1,2
+    es = threeEventsOneDep(2, 1);
+    assertSorted(es, events(es, 0, 1, 2));
+  }
+
+  private List<Event> threeEventsOneDep(int depFromIdx, int depOnIdx) {
+    List<Event> events =
+        Lists.newArrayList(
+            new TestEvent(TimeUtil.nowTs()),
+            new TestEvent(TimeUtil.nowTs()),
+            new TestEvent(TimeUtil.nowTs()));
+    events.get(depFromIdx).addDep(events.get(depOnIdx));
+    return events;
+  }
+
+  @Test
+  public void lastEventDependsOnFirstEvent() {
+    List<Event> events = new ArrayList<>();
+    for (int i = 0; i < 20; i++) {
+      events.add(new TestEvent(TimeUtil.nowTs()));
+    }
+    events.get(events.size() - 1).addDep(events.get(0));
+    assertSorted(events, events);
+  }
+
+  @Test
+  public void firstEventDependsOnLastEvent() {
+    List<Event> events = new ArrayList<>();
+    for (int i = 0; i < 20; i++) {
+      events.add(new TestEvent(TimeUtil.nowTs()));
+    }
+    events.get(0).addDep(events.get(events.size() - 1));
+
+    List<Event> expected = new ArrayList<>();
+    expected.addAll(events.subList(1, events.size()));
+    expected.add(events.get(0));
+    assertSorted(events, expected);
+  }
+
+  @Test
+  public void topoSortChainOfDeps() {
+    Event e1 = new TestEvent(TimeUtil.nowTs());
+    Event e2 = new TestEvent(TimeUtil.nowTs());
+    Event e3 = new TestEvent(TimeUtil.nowTs());
+    Event e4 = new TestEvent(TimeUtil.nowTs());
+    e1.addDep(e2);
+    e2.addDep(e3);
+    e3.addDep(e4);
+
+    assertSorted(events(e1, e2, e3, e4), events(e4, e3, e2, e1));
+  }
+
+  @Test
+  public void topoSortMultipleDeps() {
+    Event e1 = new TestEvent(TimeUtil.nowTs());
+    Event e2 = new TestEvent(TimeUtil.nowTs());
+    Event e3 = new TestEvent(TimeUtil.nowTs());
+    Event e4 = new TestEvent(TimeUtil.nowTs());
+    e1.addDep(e2);
+    e1.addDep(e4);
+    e2.addDep(e3);
+
+    // Processing 3 pops 2, processing 4 pops 1.
+    assertSorted(events(e2, e3, e1, e4), events(e3, e2, e4, e1));
+  }
+
+  @Test
+  public void topoSortMultipleDepsPreservesNaturalOrder() {
+    Event e1 = new TestEvent(TimeUtil.nowTs());
+    Event e2 = new TestEvent(TimeUtil.nowTs());
+    Event e3 = new TestEvent(TimeUtil.nowTs());
+    Event e4 = new TestEvent(TimeUtil.nowTs());
+    e1.addDep(e4);
+    e2.addDep(e4);
+    e3.addDep(e4);
+
+    // Processing 4 pops 1, 2, 3 in natural order.
+    assertSorted(events(e4, e3, e2, e1), events(e4, e1, e2, e3));
+  }
+
+  @Test
+  public void topoSortCycle() {
+    Event e1 = new TestEvent(TimeUtil.nowTs());
+    Event e2 = new TestEvent(TimeUtil.nowTs());
+
+    // Implementation is not really defined, but infinite looping would be bad.
+    // According to current implementation details, 2 pops 1, 1 pops 2 which was
+    // already seen.
+    assertSorted(events(e2, e1), events(e1, e2));
+  }
+
+  @Test
+  public void topoSortDepNotInInputList() {
+    Event e1 = new TestEvent(TimeUtil.nowTs());
+    Event e2 = new TestEvent(TimeUtil.nowTs());
+    Event e3 = new TestEvent(TimeUtil.nowTs());
+    e1.addDep(e3);
+
+    List<Event> events = events(e2, e1);
+    try {
+      new EventSorter(events).sort();
+      fail("expected IllegalArgumentException");
+    } catch (IllegalArgumentException e) {
+      // Expected.
+    }
+  }
+
+  private static List<Event> events(Event... es) {
+    return Lists.newArrayList(es);
+  }
+
+  private static List<Event> events(List<Event> in, Integer... indexes) {
+    return Stream.of(indexes).map(in::get).collect(toList());
+  }
+
+  private static void assertSorted(List<Event> unsorted, List<Event> expected) {
+    List<Event> actual = new ArrayList<>(unsorted);
+    new EventSorter(actual).sort();
+    assertThat(actual).named("sorted" + unsorted).isEqualTo(expected);
+  }
+}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/patch/IntraLineLoaderTest.java b/javatests/com/google/gerrit/server/patch/IntraLineLoaderTest.java
similarity index 100%
rename from gerrit-server/src/test/java/com/google/gerrit/server/patch/IntraLineLoaderTest.java
rename to javatests/com/google/gerrit/server/patch/IntraLineLoaderTest.java
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/patch/PatchListEntryTest.java b/javatests/com/google/gerrit/server/patch/PatchListEntryTest.java
similarity index 100%
rename from gerrit-server/src/test/java/com/google/gerrit/server/patch/PatchListEntryTest.java
rename to javatests/com/google/gerrit/server/patch/PatchListEntryTest.java
diff --git a/javatests/com/google/gerrit/server/patch/PatchListTest.java b/javatests/com/google/gerrit/server/patch/PatchListTest.java
new file mode 100644
index 0000000..6fbafb6
--- /dev/null
+++ b/javatests/com/google/gerrit/server/patch/PatchListTest.java
@@ -0,0 +1,71 @@
+// Copyright (C) 2017 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.google.gerrit.server.patch;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.reviewdb.client.Patch;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.Arrays;
+import org.junit.Test;
+
+public class PatchListTest {
+  @Test
+  public void fileOrder() {
+    String[] names = {
+      "zzz", "def/g", "/!xxx", "abc", Patch.MERGE_LIST, "qrx", Patch.COMMIT_MSG,
+    };
+    String[] want = {
+      Patch.COMMIT_MSG, Patch.MERGE_LIST, "/!xxx", "abc", "def/g", "qrx", "zzz",
+    };
+
+    Arrays.sort(names, 0, names.length, PatchList::comparePaths);
+    assertThat(names).isEqualTo(want);
+  }
+
+  @Test
+  public void fileOrderNoMerge() {
+    String[] names = {
+      "zzz", "def/g", "/!xxx", "abc", "qrx", Patch.COMMIT_MSG,
+    };
+    String[] want = {
+      Patch.COMMIT_MSG, "/!xxx", "abc", "def/g", "qrx", "zzz",
+    };
+
+    Arrays.sort(names, 0, names.length, PatchList::comparePaths);
+    assertThat(names).isEqualTo(want);
+  }
+
+  @Test
+  public void largeObjectTombstoneCanBeSerializedAndDeserialized() throws Exception {
+    // Serialize
+    byte[] serializedObject;
+    try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ObjectOutputStream objectStream = new ObjectOutputStream(baos)) {
+      objectStream.writeObject(new PatchListCacheImpl.LargeObjectTombstone());
+      serializedObject = baos.toByteArray();
+      assertThat(serializedObject).isNotNull();
+    }
+    // Deserialize
+    try (InputStream is = new ByteArrayInputStream(serializedObject);
+        ObjectInputStream ois = new ObjectInputStream(is)) {
+      assertThat(ois.readObject()).isInstanceOf(PatchListCacheImpl.LargeObjectTombstone.class);
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/server/permissions/DefaultPermissionsMappingTest.java b/javatests/com/google/gerrit/server/permissions/DefaultPermissionsMappingTest.java
new file mode 100644
index 0000000..305e81b
--- /dev/null
+++ b/javatests/com/google/gerrit/server/permissions/DefaultPermissionsMappingTest.java
@@ -0,0 +1,31 @@
+// 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.
+
+package com.google.gerrit.server.permissions;
+
+import static com.google.common.truth.Truth8.assertThat;
+import static com.google.gerrit.server.permissions.DefaultPermissionMappings.refPermission;
+
+import com.google.gerrit.common.data.Permission;
+import org.junit.Test;
+
+public class DefaultPermissionsMappingTest {
+  @Test
+  public void stringToRefPermission() {
+    assertThat(refPermission("doesnotexist")).isEmpty();
+    assertThat(refPermission("")).isEmpty();
+    assertThat(refPermission(Permission.VIEW_PRIVATE_CHANGES))
+        .hasValue(RefPermission.READ_PRIVATE_CHANGES);
+  }
+}
diff --git a/javatests/com/google/gerrit/server/permissions/RefControlTest.java b/javatests/com/google/gerrit/server/permissions/RefControlTest.java
new file mode 100644
index 0000000..a3f9f93
--- /dev/null
+++ b/javatests/com/google/gerrit/server/permissions/RefControlTest.java
@@ -0,0 +1,1031 @@
+// Copyright (C) 2010 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.google.gerrit.server.permissions;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.common.data.Permission.EDIT_TOPIC_NAME;
+import static com.google.gerrit.common.data.Permission.LABEL;
+import static com.google.gerrit.common.data.Permission.OWNER;
+import static com.google.gerrit.common.data.Permission.PUSH;
+import static com.google.gerrit.common.data.Permission.READ;
+import static com.google.gerrit.common.data.Permission.SUBMIT;
+import static com.google.gerrit.server.group.SystemGroupBackend.ANONYMOUS_USERS;
+import static com.google.gerrit.server.group.SystemGroupBackend.CHANGE_OWNER;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static com.google.gerrit.server.project.testing.Util.ADMIN;
+import static com.google.gerrit.server.project.testing.Util.DEVS;
+import static com.google.gerrit.server.project.testing.Util.allow;
+import static com.google.gerrit.server.project.testing.Util.allowExclusive;
+import static com.google.gerrit.server.project.testing.Util.block;
+import static com.google.gerrit.server.project.testing.Util.deny;
+import static com.google.gerrit.server.project.testing.Util.doNotInherit;
+import static com.google.gerrit.testing.InMemoryRepositoryManager.newRepository;
+
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.collect.ImmutableSortedSet;
+import com.google.common.collect.Lists;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.PermissionRange;
+import com.google.gerrit.common.data.PermissionRule;
+import com.google.gerrit.common.errors.InvalidNameException;
+import com.google.gerrit.extensions.api.projects.CommentLinkInfo;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.CapabilityCollection;
+import com.google.gerrit.server.account.GroupMembership;
+import com.google.gerrit.server.account.ListGroupMembership;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.AllProjectsNameProvider;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.AllUsersNameProvider;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.git.TransferConfig;
+import com.google.gerrit.server.index.SingleVersionModule.SingleVersionListener;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.gerrit.server.project.RefPattern;
+import com.google.gerrit.server.project.testing.Util;
+import com.google.gerrit.server.schema.SchemaCreator;
+import com.google.gerrit.server.util.RequestContext;
+import com.google.gerrit.server.util.ThreadLocalRequestContext;
+import com.google.gerrit.testing.InMemoryDatabase;
+import com.google.gerrit.testing.InMemoryModule;
+import com.google.gerrit.testing.InMemoryRepositoryManager;
+import com.google.inject.Guice;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Provider;
+import com.google.inject.util.Providers;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.lib.Repository;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class RefControlTest {
+  private void assertAdminsAreOwnersAndDevsAreNot() {
+    ProjectControl uBlah = user(local, DEVS);
+    ProjectControl uAdmin = user(local, DEVS, ADMIN);
+
+    assertThat(uBlah.isOwner()).named("not owner").isFalse();
+    assertThat(uAdmin.isOwner()).named("is owner").isTrue();
+  }
+
+  private void assertOwner(String ref, ProjectControl u) {
+    assertThat(u.controlForRef(ref).isOwner()).named("OWN " + ref).isTrue();
+  }
+
+  private void assertNotOwner(ProjectControl u) {
+    assertThat(u.isOwner()).named("not owner").isFalse();
+  }
+
+  private void assertNotOwner(String ref, ProjectControl u) {
+    assertThat(u.controlForRef(ref).isOwner()).named("NOT OWN " + ref).isFalse();
+  }
+
+  private void assertCanAccess(ProjectControl u) {
+    boolean access = u.asForProject().testOrFalse(ProjectPermission.ACCESS);
+    assertThat(access).named("can access").isTrue();
+  }
+
+  private void assertAccessDenied(ProjectControl u) {
+    boolean access = u.asForProject().testOrFalse(ProjectPermission.ACCESS);
+    assertThat(access).named("cannot access").isFalse();
+  }
+
+  private void assertCanRead(String ref, ProjectControl u) {
+    assertThat(u.controlForRef(ref).isVisible()).named("can read " + ref).isTrue();
+  }
+
+  private void assertCannotRead(String ref, ProjectControl u) {
+    assertThat(u.controlForRef(ref).isVisible()).named("cannot read " + ref).isFalse();
+  }
+
+  private void assertCanSubmit(String ref, ProjectControl u) {
+    assertThat(u.controlForRef(ref).canSubmit(false)).named("can submit " + ref).isTrue();
+  }
+
+  private void assertCannotSubmit(String ref, ProjectControl u) {
+    assertThat(u.controlForRef(ref).canSubmit(false)).named("can submit " + ref).isFalse();
+  }
+
+  private void assertCanUpload(ProjectControl u) {
+    assertThat(u.canPushToAtLeastOneRef()).named("can upload").isTrue();
+  }
+
+  private void assertCreateChange(String ref, ProjectControl u) {
+    boolean create = u.asForProject().ref(ref).testOrFalse(RefPermission.CREATE_CHANGE);
+    assertThat(create).named("can create change " + ref).isTrue();
+  }
+
+  private void assertCannotUpload(ProjectControl u) {
+    assertThat(u.canPushToAtLeastOneRef()).named("cannot upload").isFalse();
+  }
+
+  private void assertCannotCreateChange(String ref, ProjectControl u) {
+    boolean create = u.asForProject().ref(ref).testOrFalse(RefPermission.CREATE_CHANGE);
+    assertThat(create).named("cannot create change " + ref).isFalse();
+  }
+
+  private void assertCanUpdate(String ref, ProjectControl u) {
+    boolean update = u.asForProject().ref(ref).testOrFalse(RefPermission.UPDATE);
+    assertThat(update).named("can update " + ref).isTrue();
+  }
+
+  private void assertCannotUpdate(String ref, ProjectControl u) {
+    boolean update = u.asForProject().ref(ref).testOrFalse(RefPermission.UPDATE);
+    assertThat(update).named("cannot update " + ref).isFalse();
+  }
+
+  private void assertCanForceUpdate(String ref, ProjectControl u) {
+    boolean update = u.asForProject().ref(ref).testOrFalse(RefPermission.FORCE_UPDATE);
+    assertThat(update).named("can force push " + ref).isTrue();
+  }
+
+  private void assertCannotForceUpdate(String ref, ProjectControl u) {
+    boolean update = u.asForProject().ref(ref).testOrFalse(RefPermission.FORCE_UPDATE);
+    assertThat(update).named("cannot force push " + ref).isFalse();
+  }
+
+  private void assertCanVote(int score, PermissionRange range) {
+    assertThat(range.contains(score)).named("can vote " + score).isTrue();
+  }
+
+  private void assertCannotVote(int score, PermissionRange range) {
+    assertThat(range.contains(score)).named("cannot vote " + score).isFalse();
+  }
+
+  private final AllProjectsName allProjectsName =
+      new AllProjectsName(AllProjectsNameProvider.DEFAULT);
+  private final AllUsersName allUsersName = new AllUsersName(AllUsersNameProvider.DEFAULT);
+  private final AccountGroup.UUID fixers = new AccountGroup.UUID("test.fixers");
+  private final Map<Project.NameKey, ProjectState> all = new HashMap<>();
+  private Project.NameKey localKey = new Project.NameKey("local");
+  private ProjectConfig local;
+  private Project.NameKey parentKey = new Project.NameKey("parent");
+  private ProjectConfig parent;
+  private InMemoryRepositoryManager repoManager;
+  private ProjectCache projectCache;
+  private PermissionCollection.Factory sectionSorter;
+  private ChangeControl.Factory changeControlFactory;
+  private ReviewDb db;
+
+  @Inject private PermissionBackend permissionBackend;
+  @Inject private CapabilityCollection.Factory capabilityCollectionFactory;
+  @Inject private SchemaCreator schemaCreator;
+  @Inject private SingleVersionListener singleVersionListener;
+  @Inject private InMemoryDatabase schemaFactory;
+  @Inject private ThreadLocalRequestContext requestContext;
+  @Inject private DefaultRefFilter.Factory refFilterFactory;
+  @Inject private TransferConfig transferConfig;
+  @Inject private MetricMaker metricMaker;
+
+  @Before
+  public void setUp() throws Exception {
+    repoManager = new InMemoryRepositoryManager();
+    projectCache =
+        new ProjectCache() {
+          @Override
+          public ProjectState getAllProjects() {
+            return get(allProjectsName);
+          }
+
+          @Override
+          public ProjectState getAllUsers() {
+            return null;
+          }
+
+          @Override
+          public ProjectState get(Project.NameKey projectName) {
+            return all.get(projectName);
+          }
+
+          @Override
+          public void evict(Project p) {}
+
+          @Override
+          public void remove(Project p) {}
+
+          @Override
+          public void remove(Project.NameKey name) {}
+
+          @Override
+          public ImmutableSortedSet<Project.NameKey> all() {
+            return ImmutableSortedSet.of();
+          }
+
+          @Override
+          public ImmutableSortedSet<Project.NameKey> byName(String prefix) {
+            return ImmutableSortedSet.of();
+          }
+
+          @Override
+          public void onCreateProject(Project.NameKey newProjectName) {}
+
+          @Override
+          public Set<AccountGroup.UUID> guessRelevantGroupUUIDs() {
+            return Collections.emptySet();
+          }
+
+          @Override
+          public ProjectState checkedGet(Project.NameKey projectName) throws IOException {
+            return all.get(projectName);
+          }
+
+          @Override
+          public void evict(Project.NameKey p) {}
+
+          @Override
+          public ProjectState checkedGet(Project.NameKey projectName, boolean strict)
+              throws Exception {
+            return all.get(projectName);
+          }
+        };
+
+    Injector injector = Guice.createInjector(new InMemoryModule());
+    injector.injectMembers(this);
+
+    try {
+      Repository repo = repoManager.createRepository(allProjectsName);
+      ProjectConfig allProjects = new ProjectConfig(new Project.NameKey(allProjectsName.get()));
+      allProjects.load(repo);
+      LabelType cr = Util.codeReview();
+      allProjects.getLabelSections().put(cr.getName(), cr);
+      add(allProjects);
+    } catch (IOException | ConfigInvalidException e) {
+      throw new RuntimeException(e);
+    }
+
+    db = schemaFactory.open();
+    singleVersionListener.start();
+    try {
+      schemaCreator.create(db);
+    } finally {
+      singleVersionListener.stop();
+    }
+
+    Cache<SectionSortCache.EntryKey, SectionSortCache.EntryVal> c =
+        CacheBuilder.newBuilder().build();
+    sectionSorter = new PermissionCollection.Factory(new SectionSortCache(c), metricMaker);
+
+    parent = new ProjectConfig(parentKey);
+    parent.load(newRepository(parentKey));
+    add(parent);
+
+    local = new ProjectConfig(localKey);
+    local.load(newRepository(localKey));
+    add(local);
+    local.getProject().setParentName(parentKey);
+
+    requestContext.setContext(
+        new RequestContext() {
+          @Override
+          public CurrentUser getUser() {
+            return null;
+          }
+
+          @Override
+          public Provider<ReviewDb> getReviewDbProvider() {
+            return Providers.of(db);
+          }
+        });
+
+    changeControlFactory = injector.getInstance(ChangeControl.Factory.class);
+  }
+
+  @After
+  public void tearDown() {
+    requestContext.setContext(null);
+    if (db != null) {
+      db.close();
+    }
+    InMemoryDatabase.drop(schemaFactory);
+  }
+
+  @Test
+  public void ownerProject() {
+    allow(local, OWNER, ADMIN, "refs/*");
+
+    assertAdminsAreOwnersAndDevsAreNot();
+  }
+
+  @Test
+  public void denyOwnerProject() {
+    allow(local, OWNER, ADMIN, "refs/*");
+    deny(local, OWNER, DEVS, "refs/*");
+
+    assertAdminsAreOwnersAndDevsAreNot();
+  }
+
+  @Test
+  public void blockOwnerProject() {
+    allow(local, OWNER, ADMIN, "refs/*");
+    block(local, OWNER, DEVS, "refs/*");
+
+    assertAdminsAreOwnersAndDevsAreNot();
+  }
+
+  @Test
+  public void branchDelegation1() {
+    allow(local, OWNER, ADMIN, "refs/*");
+    allow(local, OWNER, DEVS, "refs/heads/x/*");
+
+    ProjectControl uDev = user(local, DEVS);
+    assertNotOwner(uDev);
+
+    assertOwner("refs/heads/x/*", uDev);
+    assertOwner("refs/heads/x/y", uDev);
+    assertOwner("refs/heads/x/y/*", uDev);
+
+    assertNotOwner("refs/*", uDev);
+    assertNotOwner("refs/heads/master", uDev);
+  }
+
+  @Test
+  public void branchDelegation2() {
+    allow(local, OWNER, ADMIN, "refs/*");
+    allow(local, OWNER, DEVS, "refs/heads/x/*");
+    allow(local, OWNER, fixers, "refs/heads/x/y/*");
+    doNotInherit(local, OWNER, "refs/heads/x/y/*");
+
+    ProjectControl uDev = user(local, DEVS);
+    assertNotOwner(uDev);
+
+    assertOwner("refs/heads/x/*", uDev);
+    assertOwner("refs/heads/x/y", uDev);
+    assertOwner("refs/heads/x/y/*", uDev);
+    assertNotOwner("refs/*", uDev);
+    assertNotOwner("refs/heads/master", uDev);
+
+    ProjectControl uFix = user(local, fixers);
+    assertNotOwner(uFix);
+
+    assertOwner("refs/heads/x/y/*", uFix);
+    assertOwner("refs/heads/x/y/bar", uFix);
+    assertNotOwner("refs/heads/x/*", uFix);
+    assertNotOwner("refs/heads/x/y", uFix);
+    assertNotOwner("refs/*", uFix);
+    assertNotOwner("refs/heads/master", uFix);
+  }
+
+  @Test
+  public void inheritRead_SingleBranchDeniesUpload() {
+    allow(parent, READ, REGISTERED_USERS, "refs/*");
+    allow(parent, PUSH, REGISTERED_USERS, "refs/for/refs/*");
+    allow(local, READ, REGISTERED_USERS, "refs/heads/foobar");
+    doNotInherit(local, READ, "refs/heads/foobar");
+    doNotInherit(local, PUSH, "refs/for/refs/heads/foobar");
+
+    ProjectControl u = user(local);
+    assertCanUpload(u);
+    assertCreateChange("refs/heads/master", u);
+    assertCannotCreateChange("refs/heads/foobar", u);
+  }
+
+  @Test
+  public void blockPushDrafts() {
+    allow(parent, PUSH, REGISTERED_USERS, "refs/for/refs/*");
+    block(parent, PUSH, ANONYMOUS_USERS, "refs/drafts/*");
+    allow(local, PUSH, REGISTERED_USERS, "refs/drafts/*");
+
+    ProjectControl u = user(local);
+    assertCreateChange("refs/heads/master", u);
+    assertThat(u.controlForRef("refs/drafts/master").canPerform(PUSH)).isFalse();
+  }
+
+  @Test
+  public void blockPushDraftsUnblockAdmin() {
+    block(parent, PUSH, ANONYMOUS_USERS, "refs/drafts/*");
+    allow(parent, PUSH, ADMIN, "refs/drafts/*");
+    allow(local, PUSH, REGISTERED_USERS, "refs/drafts/*");
+
+    ProjectControl u = user(local);
+    ProjectControl a = user(local, "a", ADMIN);
+
+    assertThat(a.controlForRef("refs/drafts/master").canPerform(PUSH))
+        .named("push is allowed")
+        .isTrue();
+    assertThat(u.controlForRef("refs/drafts/master").canPerform(PUSH))
+        .named("push is not allowed")
+        .isFalse();
+  }
+
+  @Test
+  public void inheritRead_SingleBranchDoesNotOverrideInherited() {
+    allow(parent, READ, REGISTERED_USERS, "refs/*");
+    allow(parent, PUSH, REGISTERED_USERS, "refs/for/refs/*");
+    allow(local, READ, REGISTERED_USERS, "refs/heads/foobar");
+
+    ProjectControl u = user(local);
+    assertCanUpload(u);
+    assertCreateChange("refs/heads/master", u);
+    assertCreateChange("refs/heads/foobar", u);
+  }
+
+  @Test
+  public void inheritDuplicateSections() throws Exception {
+    allow(parent, READ, ADMIN, "refs/*");
+    allow(local, READ, DEVS, "refs/heads/*");
+    assertCanAccess(user(local, "a", ADMIN));
+
+    local = new ProjectConfig(localKey);
+    local.load(newRepository(localKey));
+    local.getProject().setParentName(parentKey);
+    allow(local, READ, DEVS, "refs/*");
+    assertCanAccess(user(local, "d", DEVS));
+  }
+
+  @Test
+  public void inheritRead_OverrideWithDeny() {
+    allow(parent, READ, REGISTERED_USERS, "refs/*");
+    deny(local, READ, REGISTERED_USERS, "refs/*");
+
+    assertAccessDenied(user(local));
+  }
+
+  @Test
+  public void inheritRead_AppendWithDenyOfRef() {
+    allow(parent, READ, REGISTERED_USERS, "refs/*");
+    deny(local, READ, REGISTERED_USERS, "refs/heads/*");
+
+    ProjectControl u = user(local);
+    assertCanAccess(u);
+    assertCanRead("refs/master", u);
+    assertCanRead("refs/tags/foobar", u);
+    assertCanRead("refs/heads/master", u);
+  }
+
+  @Test
+  public void inheritRead_OverridesAndDeniesOfRef() {
+    allow(parent, READ, REGISTERED_USERS, "refs/*");
+    deny(local, READ, REGISTERED_USERS, "refs/*");
+    allow(local, READ, REGISTERED_USERS, "refs/heads/*");
+
+    ProjectControl u = user(local);
+    assertCanAccess(u);
+    assertCannotRead("refs/foobar", u);
+    assertCannotRead("refs/tags/foobar", u);
+    assertCanRead("refs/heads/foobar", u);
+  }
+
+  @Test
+  public void inheritSubmit_OverridesAndDeniesOfRef() {
+    allow(parent, SUBMIT, REGISTERED_USERS, "refs/*");
+    deny(local, SUBMIT, REGISTERED_USERS, "refs/*");
+    allow(local, SUBMIT, REGISTERED_USERS, "refs/heads/*");
+
+    ProjectControl u = user(local);
+    assertCannotSubmit("refs/foobar", u);
+    assertCannotSubmit("refs/tags/foobar", u);
+    assertCanSubmit("refs/heads/foobar", u);
+  }
+
+  @Test
+  public void cannotUploadToAnyRef() {
+    allow(parent, READ, REGISTERED_USERS, "refs/*");
+    allow(local, READ, DEVS, "refs/heads/*");
+    allow(local, PUSH, DEVS, "refs/for/refs/heads/*");
+
+    ProjectControl u = user(local);
+    assertCannotUpload(u);
+    assertCannotCreateChange("refs/heads/master", u);
+  }
+
+  @Test
+  public void usernamePatternCanUploadToAnyRef() {
+    allow(local, PUSH, REGISTERED_USERS, "refs/heads/users/${username}/*");
+    ProjectControl u = user(local, "a-registered-user");
+    assertCanUpload(u);
+  }
+
+  @Test
+  public void usernamePatternNonRegex() {
+    allow(local, READ, DEVS, "refs/sb/${username}/heads/*");
+
+    ProjectControl u = user(local, "u", DEVS);
+    ProjectControl d = user(local, "d", DEVS);
+    assertCannotRead("refs/sb/d/heads/foobar", u);
+    assertCanRead("refs/sb/d/heads/foobar", d);
+  }
+
+  @Test
+  public void usernamePatternWithRegex() {
+    allow(local, READ, DEVS, "^refs/sb/${username}/heads/.*");
+
+    ProjectControl u = user(local, "d.v", DEVS);
+    ProjectControl d = user(local, "dev", DEVS);
+    assertCannotRead("refs/sb/dev/heads/foobar", u);
+    assertCanRead("refs/sb/dev/heads/foobar", d);
+  }
+
+  @Test
+  public void usernameEmailPatternWithRegex() {
+    allow(local, READ, DEVS, "^refs/sb/${username}/heads/.*");
+
+    ProjectControl u = user(local, "d.v@ger-rit.org", DEVS);
+    ProjectControl d = user(local, "dev@ger-rit.org", DEVS);
+    assertCannotRead("refs/sb/dev@ger-rit.org/heads/foobar", u);
+    assertCanRead("refs/sb/dev@ger-rit.org/heads/foobar", d);
+  }
+
+  @Test
+  public void sortWithRegex() {
+    allow(local, READ, DEVS, "^refs/heads/.*");
+    allow(parent, READ, ANONYMOUS_USERS, "^refs/heads/.*-QA-.*");
+
+    ProjectControl u = user(local, DEVS);
+    ProjectControl d = user(local, DEVS);
+    assertCanRead("refs/heads/foo-QA-bar", u);
+    assertCanRead("refs/heads/foo-QA-bar", d);
+  }
+
+  @Test
+  public void blockRule_ParentBlocksChild() {
+    allow(local, PUSH, DEVS, "refs/tags/*");
+    block(parent, PUSH, ANONYMOUS_USERS, "refs/tags/*");
+    ProjectControl u = user(local, DEVS);
+    assertCannotUpdate("refs/tags/V10", u);
+  }
+
+  @Test
+  public void blockRule_ParentBlocksChildEvenIfAlreadyBlockedInChild() {
+    allow(local, PUSH, DEVS, "refs/tags/*");
+    block(local, PUSH, ANONYMOUS_USERS, "refs/tags/*");
+    block(parent, PUSH, ANONYMOUS_USERS, "refs/tags/*");
+
+    ProjectControl u = user(local, DEVS);
+    assertCannotUpdate("refs/tags/V10", u);
+  }
+
+  @Test
+  public void blockLabelRange_ParentBlocksChild() {
+    allow(local, LABEL + "Code-Review", -2, +2, DEVS, "refs/heads/*");
+    block(parent, LABEL + "Code-Review", -2, +2, DEVS, "refs/heads/*");
+
+    ProjectControl u = user(local, DEVS);
+
+    PermissionRange range = u.controlForRef("refs/heads/master").getRange(LABEL + "Code-Review");
+    assertCanVote(-1, range);
+    assertCanVote(1, range);
+    assertCannotVote(-2, range);
+    assertCannotVote(2, range);
+  }
+
+  @Test
+  public void blockLabelRange_ParentBlocksChildEvenIfAlreadyBlockedInChild() {
+    allow(local, LABEL + "Code-Review", -2, +2, DEVS, "refs/heads/*");
+    block(local, LABEL + "Code-Review", -2, +2, DEVS, "refs/heads/*");
+    block(parent, LABEL + "Code-Review", -2, +2, DEVS, "refs/heads/*");
+
+    ProjectControl u = user(local, DEVS);
+
+    PermissionRange range = u.controlForRef("refs/heads/master").getRange(LABEL + "Code-Review");
+    assertCanVote(-1, range);
+    assertCanVote(1, range);
+    assertCannotVote(-2, range);
+    assertCannotVote(2, range);
+  }
+
+  @Test
+  public void inheritSubmit_AllowInChildDoesntAffectUnblockInParent() {
+    block(parent, SUBMIT, ANONYMOUS_USERS, "refs/heads/*");
+    allow(parent, SUBMIT, REGISTERED_USERS, "refs/heads/*");
+    allow(local, SUBMIT, REGISTERED_USERS, "refs/heads/*");
+
+    ProjectControl u = user(local);
+    assertThat(u.controlForRef("refs/heads/master").canPerform(SUBMIT))
+        .named("submit is allowed")
+        .isTrue();
+  }
+
+  @Test
+  public void unblockNoForce() {
+    block(local, PUSH, ANONYMOUS_USERS, "refs/heads/*");
+    allow(local, PUSH, DEVS, "refs/heads/*");
+
+    ProjectControl u = user(local, DEVS);
+    assertCanUpdate("refs/heads/master", u);
+  }
+
+  @Test
+  public void unblockForce() {
+    PermissionRule r = block(local, PUSH, ANONYMOUS_USERS, "refs/heads/*");
+    r.setForce(true);
+    allow(local, PUSH, DEVS, "refs/heads/*").setForce(true);
+
+    ProjectControl u = user(local, DEVS);
+    assertCanForceUpdate("refs/heads/master", u);
+  }
+
+  @Test
+  public void unblockRead_NotPossible() {
+    block(parent, READ, ANONYMOUS_USERS, "refs/*");
+    allow(parent, READ, ADMIN, "refs/*");
+    allow(local, READ, ANONYMOUS_USERS, "refs/*");
+    allow(local, READ, ADMIN, "refs/*");
+    ProjectControl u = user(local);
+    assertCannotRead("refs/heads/master", u);
+  }
+
+  @Test
+  public void unblockForceWithAllowNoForce_NotPossible() {
+    PermissionRule r = block(local, PUSH, ANONYMOUS_USERS, "refs/heads/*");
+    r.setForce(true);
+    allow(local, PUSH, DEVS, "refs/heads/*");
+
+    ProjectControl u = user(local, DEVS);
+    assertCannotForceUpdate("refs/heads/master", u);
+  }
+
+  @Test
+  public void unblockMoreSpecificRef_Fails() {
+    block(local, PUSH, ANONYMOUS_USERS, "refs/heads/*");
+    allow(local, PUSH, DEVS, "refs/heads/master");
+
+    ProjectControl u = user(local, DEVS);
+    assertCannotUpdate("refs/heads/master", u);
+  }
+
+  @Test
+  public void unblockMoreSpecificRefInLocal_Fails() {
+    block(parent, PUSH, ANONYMOUS_USERS, "refs/heads/*");
+    allow(local, PUSH, DEVS, "refs/heads/master");
+
+    ProjectControl u = user(local, DEVS);
+    assertCannotUpdate("refs/heads/master", u);
+  }
+
+  @Test
+  public void unblockMoreSpecificRefWithExclusiveFlag() {
+    block(local, PUSH, ANONYMOUS_USERS, "refs/heads/*");
+    allow(local, PUSH, DEVS, "refs/heads/master", true);
+
+    ProjectControl u = user(local, DEVS);
+    assertCanUpdate("refs/heads/master", u);
+  }
+
+  @Test
+  public void unblockVoteMoreSpecificRefWithExclusiveFlag() {
+    String perm = LABEL + "Code-Review";
+
+    block(local, perm, -1, 1, ANONYMOUS_USERS, "refs/heads/*");
+    allowExclusive(local, perm, -2, 2, DEVS, "refs/heads/master");
+
+    ProjectControl u = user(local, DEVS);
+    PermissionRange range = u.controlForRef("refs/heads/master").getRange(perm);
+    assertCanVote(-2, range);
+  }
+
+  @Test
+  public void unblockFromParentDoesNotAffectChild() {
+    allow(parent, PUSH, DEVS, "refs/heads/master", true);
+    block(local, PUSH, DEVS, "refs/heads/master");
+
+    ProjectControl u = user(local, DEVS);
+    assertCannotUpdate("refs/heads/master", u);
+  }
+
+  @Test
+  public void unblockFromParentDoesNotAffectChildDifferentGroups() {
+    allow(parent, PUSH, DEVS, "refs/heads/master", true);
+    block(local, PUSH, ANONYMOUS_USERS, "refs/heads/master");
+
+    ProjectControl u = user(local, DEVS);
+    assertCannotUpdate("refs/heads/master", u);
+  }
+
+  @Test
+  public void unblockMoreSpecificRefInLocalWithExclusiveFlag_Fails() {
+    block(parent, PUSH, ANONYMOUS_USERS, "refs/heads/*");
+    allow(local, PUSH, DEVS, "refs/heads/master", true);
+
+    ProjectControl u = user(local, DEVS);
+    assertCannotUpdate("refs/heads/master", u);
+  }
+
+  @Test
+  public void blockMoreSpecificRefWithinProject() {
+    block(local, PUSH, ANONYMOUS_USERS, "refs/heads/secret");
+    allow(local, PUSH, DEVS, "refs/heads/*", true);
+
+    ProjectControl u = user(local, DEVS);
+    assertCannotUpdate("refs/heads/secret", u);
+    assertCanUpdate("refs/heads/master", u);
+  }
+
+  @Test
+  public void unblockOtherPermissionWithMoreSpecificRefAndExclusiveFlag_Fails() {
+    block(local, PUSH, ANONYMOUS_USERS, "refs/heads/*");
+    allow(local, PUSH, DEVS, "refs/heads/master");
+    allow(local, SUBMIT, DEVS, "refs/heads/master", true);
+
+    ProjectControl u = user(local, DEVS);
+    assertCannotUpdate("refs/heads/master", u);
+  }
+
+  @Test
+  public void unblockLargerScope_Fails() {
+    block(local, PUSH, ANONYMOUS_USERS, "refs/heads/master");
+    allow(local, PUSH, DEVS, "refs/heads/*");
+
+    ProjectControl u = user(local, DEVS);
+    assertCannotUpdate("refs/heads/master", u);
+  }
+
+  @Test
+  public void unblockInLocal_Fails() {
+    block(parent, PUSH, ANONYMOUS_USERS, "refs/heads/*");
+    allow(local, PUSH, fixers, "refs/heads/*");
+
+    ProjectControl f = user(local, fixers);
+    assertCannotUpdate("refs/heads/master", f);
+  }
+
+  @Test
+  public void unblockInParentBlockInLocal() {
+    block(parent, PUSH, ANONYMOUS_USERS, "refs/heads/*");
+    allow(parent, PUSH, DEVS, "refs/heads/*");
+    block(local, PUSH, DEVS, "refs/heads/*");
+
+    ProjectControl d = user(local, DEVS);
+    assertCannotUpdate("refs/heads/master", d);
+  }
+
+  @Test
+  public void unblockForceEditTopicName() {
+    block(local, EDIT_TOPIC_NAME, ANONYMOUS_USERS, "refs/heads/*");
+    allow(local, EDIT_TOPIC_NAME, DEVS, "refs/heads/*").setForce(true);
+
+    ProjectControl u = user(local, DEVS);
+    assertThat(u.controlForRef("refs/heads/master").canForceEditTopicName())
+        .named("u can edit topic name")
+        .isTrue();
+  }
+
+  @Test
+  public void unblockInLocalForceEditTopicName_Fails() {
+    block(parent, EDIT_TOPIC_NAME, ANONYMOUS_USERS, "refs/heads/*");
+    allow(local, EDIT_TOPIC_NAME, DEVS, "refs/heads/*").setForce(true);
+
+    ProjectControl u = user(local, REGISTERED_USERS);
+    assertThat(u.controlForRef("refs/heads/master").canForceEditTopicName())
+        .named("u can't edit topic name")
+        .isFalse();
+  }
+
+  @Test
+  public void unblockRange() {
+    block(local, LABEL + "Code-Review", -1, +1, ANONYMOUS_USERS, "refs/heads/*");
+    allow(local, LABEL + "Code-Review", -2, +2, DEVS, "refs/heads/*");
+
+    ProjectControl u = user(local, DEVS);
+    PermissionRange range = u.controlForRef("refs/heads/master").getRange(LABEL + "Code-Review");
+    assertCanVote(-2, range);
+    assertCanVote(2, range);
+  }
+
+  @Test
+  public void unblockRangeOnMoreSpecificRef_Fails() {
+    block(local, LABEL + "Code-Review", -1, +1, ANONYMOUS_USERS, "refs/heads/*");
+    allow(local, LABEL + "Code-Review", -2, +2, DEVS, "refs/heads/master");
+
+    ProjectControl u = user(local, DEVS);
+    PermissionRange range = u.controlForRef("refs/heads/master").getRange(LABEL + "Code-Review");
+    assertCannotVote(-2, range);
+    assertCannotVote(2, range);
+  }
+
+  @Test
+  public void unblockRangeOnLargerScope_Fails() {
+    block(local, LABEL + "Code-Review", -1, +1, ANONYMOUS_USERS, "refs/heads/master");
+    allow(local, LABEL + "Code-Review", -2, +2, DEVS, "refs/heads/*");
+
+    ProjectControl u = user(local, DEVS);
+    PermissionRange range = u.controlForRef("refs/heads/master").getRange(LABEL + "Code-Review");
+    assertCannotVote(-2, range);
+    assertCannotVote(2, range);
+  }
+
+  @Test
+  public void nonconfiguredCannotVote() {
+    allow(local, LABEL + "Code-Review", -2, +2, DEVS, "refs/heads/*");
+
+    ProjectControl u = user(local, REGISTERED_USERS);
+    PermissionRange range = u.controlForRef("refs/heads/master").getRange(LABEL + "Code-Review");
+    assertCannotVote(-1, range);
+    assertCannotVote(1, range);
+  }
+
+  @Test
+  public void unblockInLocalRange_Fails() {
+    block(parent, LABEL + "Code-Review", -1, 1, ANONYMOUS_USERS, "refs/heads/*");
+    allow(local, LABEL + "Code-Review", -2, +2, DEVS, "refs/heads/*");
+
+    ProjectControl u = user(local, DEVS);
+    PermissionRange range = u.controlForRef("refs/heads/master").getRange(LABEL + "Code-Review");
+    assertCannotVote(-2, range);
+    assertCannotVote(2, range);
+  }
+
+  @Test
+  public void unblockRangeForChangeOwner() {
+    allow(local, LABEL + "Code-Review", -2, +2, CHANGE_OWNER, "refs/heads/*");
+
+    ProjectControl u = user(local, DEVS);
+    PermissionRange range =
+        u.controlForRef("refs/heads/master").getRange(LABEL + "Code-Review", true);
+    assertCanVote(-2, range);
+    assertCanVote(2, range);
+  }
+
+  @Test
+  public void unblockRangeForNotChangeOwner() {
+    allow(local, LABEL + "Code-Review", -2, +2, CHANGE_OWNER, "refs/heads/*");
+
+    ProjectControl u = user(local, DEVS);
+    PermissionRange range = u.controlForRef("refs/heads/master").getRange(LABEL + "Code-Review");
+    assertCannotVote(-2, range);
+    assertCannotVote(2, range);
+  }
+
+  @Test
+  public void blockChangeOwnerVote() {
+    block(local, LABEL + "Code-Review", -2, +2, CHANGE_OWNER, "refs/heads/*");
+
+    ProjectControl u = user(local, DEVS);
+    PermissionRange range = u.controlForRef("refs/heads/master").getRange(LABEL + "Code-Review");
+    assertCannotVote(-2, range);
+    assertCannotVote(2, range);
+  }
+
+  @Test
+  public void unionOfPermissibleVotes() {
+    allow(local, LABEL + "Code-Review", -1, +1, DEVS, "refs/heads/*");
+    allow(local, LABEL + "Code-Review", -2, +2, REGISTERED_USERS, "refs/heads/*");
+
+    ProjectControl u = user(local, DEVS);
+    PermissionRange range = u.controlForRef("refs/heads/master").getRange(LABEL + "Code-Review");
+    assertCanVote(-2, range);
+    assertCanVote(2, range);
+  }
+
+  @Test
+  public void unionOfPermissibleVotesPermissionOrder() {
+    allow(local, LABEL + "Code-Review", -2, +2, REGISTERED_USERS, "refs/heads/*");
+    allow(local, LABEL + "Code-Review", -1, +1, DEVS, "refs/heads/*");
+
+    ProjectControl u = user(local, DEVS);
+    PermissionRange range = u.controlForRef("refs/heads/master").getRange(LABEL + "Code-Review");
+    assertCanVote(-2, range);
+    assertCanVote(2, range);
+  }
+
+  @Test
+  public void unionOfBlockedVotes() {
+    allow(parent, LABEL + "Code-Review", -1, +1, DEVS, "refs/heads/*");
+    block(parent, LABEL + "Code-Review", -2, +2, REGISTERED_USERS, "refs/heads/*");
+    block(local, LABEL + "Code-Review", -2, +1, REGISTERED_USERS, "refs/heads/*");
+
+    ProjectControl u = user(local, DEVS);
+    PermissionRange range = u.controlForRef("refs/heads/master").getRange(LABEL + "Code-Review");
+    assertCanVote(-1, range);
+    assertCannotVote(1, range);
+  }
+
+  @Test
+  public void blockOwner() {
+    block(parent, OWNER, ANONYMOUS_USERS, "refs/*");
+    allow(local, OWNER, DEVS, "refs/*");
+
+    assertThat(user(local, DEVS).isOwner()).isFalse();
+  }
+
+  @Test
+  public void validateRefPatternsOK() throws Exception {
+    RefPattern.validate("refs/*");
+    RefPattern.validate("^refs/heads/*");
+    RefPattern.validate("^refs/tags/[0-9a-zA-Z-_.]+");
+    RefPattern.validate("refs/heads/review/${username}/*");
+  }
+
+  @Test(expected = InvalidNameException.class)
+  public void testValidateBadRefPatternDoubleCaret() throws Exception {
+    RefPattern.validate("^^refs/*");
+  }
+
+  @Test(expected = InvalidNameException.class)
+  public void testValidateBadRefPatternDanglingCharacter() throws Exception {
+    RefPattern.validate("^refs/heads/tmp/sdk/[0-9]{3,3}_R[1-9][A-Z][0-9]{3,3}*");
+  }
+
+  @Test
+  public void validateRefPatternNoDanglingCharacter() throws Exception {
+    RefPattern.validate("^refs/heads/tmp/sdk/[0-9]{3,3}_R[1-9][A-Z][0-9]{3,3}");
+  }
+
+  private InMemoryRepository add(ProjectConfig pc) {
+    SitePaths sitePaths = null;
+    List<CommentLinkInfo> commentLinks = null;
+
+    InMemoryRepository repo;
+    try {
+      repo = repoManager.createRepository(pc.getName());
+      if (pc.getProject() == null) {
+        pc.load(repo);
+      }
+    } catch (IOException | ConfigInvalidException e) {
+      throw new RuntimeException(e);
+    }
+    all.put(
+        pc.getName(),
+        new ProjectState(
+            sitePaths,
+            projectCache,
+            allProjectsName,
+            allUsersName,
+            repoManager,
+            commentLinks,
+            capabilityCollectionFactory,
+            transferConfig,
+            metricMaker,
+            pc));
+    return repo;
+  }
+
+  private ProjectControl user(ProjectConfig local, AccountGroup.UUID... memberOf) {
+    return user(local, null, memberOf);
+  }
+
+  private ProjectControl user(
+      ProjectConfig local, @Nullable String name, AccountGroup.UUID... memberOf) {
+    return new ProjectControl(
+        Collections.<AccountGroup.UUID>emptySet(),
+        Collections.<AccountGroup.UUID>emptySet(),
+        sectionSorter,
+        changeControlFactory,
+        permissionBackend,
+        refFilterFactory,
+        new MockUser(name, memberOf),
+        newProjectState(local));
+  }
+
+  private ProjectState newProjectState(ProjectConfig local) {
+    add(local);
+    return all.get(local.getProject().getNameKey());
+  }
+
+  private static class MockUser extends CurrentUser {
+    @Nullable private final String username;
+    private final GroupMembership groups;
+
+    MockUser(@Nullable String name, AccountGroup.UUID[] groupId) {
+      username = name;
+      ArrayList<AccountGroup.UUID> groupIds = Lists.newArrayList(groupId);
+      groupIds.add(REGISTERED_USERS);
+      groupIds.add(ANONYMOUS_USERS);
+      groups = new ListGroupMembership(groupIds);
+    }
+
+    @Override
+    public GroupMembership getEffectiveGroups() {
+      return groups;
+    }
+
+    @Override
+    public Object getCacheKey() {
+      return new Object();
+    }
+
+    @Override
+    public Optional<String> getUserName() {
+      return Optional.ofNullable(username);
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/server/project/CommitsCollectionTest.java b/javatests/com/google/gerrit/server/project/CommitsCollectionTest.java
new file mode 100644
index 0000000..07f64a8
--- /dev/null
+++ b/javatests/com/google/gerrit/server/project/CommitsCollectionTest.java
@@ -0,0 +1,228 @@
+// Copyright (C) 2014 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.google.gerrit.server.project;
+
+import static com.google.gerrit.common.data.Permission.READ;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.common.data.PermissionRule;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.account.AccountManager;
+import com.google.gerrit.server.account.AuthRequest;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.project.testing.Util;
+import com.google.gerrit.server.restapi.project.CommitsCollection;
+import com.google.gerrit.testing.InMemoryRepositoryManager;
+import com.google.gerrit.testing.InMemoryTestEnvironment;
+import com.google.inject.Inject;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+/** Unit tests for {@link CommitsCollection}. */
+public class CommitsCollectionTest {
+  @Rule public InMemoryTestEnvironment testEnvironment = new InMemoryTestEnvironment();
+
+  @Inject private AccountManager accountManager;
+  @Inject private InMemoryRepositoryManager repoManager;
+  @Inject protected ProjectCache projectCache;
+  @Inject protected MetaDataUpdate.Server metaDataUpdateFactory;
+  @Inject protected AllProjectsName allProjects;
+  @Inject private CommitsCollection commits;
+
+  private TestRepository<InMemoryRepository> repo;
+  private ProjectConfig project;
+
+  @Before
+  public void setUp() throws Exception {
+    setUpPermissions();
+
+    Account.Id user = accountManager.authenticate(AuthRequest.forUser("user")).getAccountId();
+    testEnvironment.setApiUser(user);
+
+    Project.NameKey name = new Project.NameKey("project");
+    InMemoryRepository inMemoryRepo = repoManager.createRepository(name);
+    project = new ProjectConfig(name);
+    project.load(inMemoryRepo);
+    repo = new TestRepository<>(inMemoryRepo);
+  }
+
+  @Test
+  public void canReadCommitWhenAllRefsVisible() throws Exception {
+    allow(project, READ, REGISTERED_USERS, "refs/*");
+    ObjectId id = repo.branch("master").commit().create();
+    ProjectState state = readProjectState();
+    RevWalk rw = repo.getRevWalk();
+    Repository r = repo.getRepository();
+
+    assertTrue(commits.canRead(state, r, rw.parseCommit(id)));
+  }
+
+  @Test
+  public void canReadCommitIfTwoRefsVisible() throws Exception {
+    allow(project, READ, REGISTERED_USERS, "refs/heads/branch1");
+    allow(project, READ, REGISTERED_USERS, "refs/heads/branch2");
+
+    ObjectId id1 = repo.branch("branch1").commit().create();
+    ObjectId id2 = repo.branch("branch2").commit().create();
+
+    ProjectState state = readProjectState();
+    RevWalk rw = repo.getRevWalk();
+    Repository r = repo.getRepository();
+
+    assertTrue(commits.canRead(state, r, rw.parseCommit(id1)));
+    assertTrue(commits.canRead(state, r, rw.parseCommit(id2)));
+  }
+
+  @Test
+  public void canReadCommitIfRefVisible() throws Exception {
+    allow(project, READ, REGISTERED_USERS, "refs/heads/branch1");
+    deny(project, READ, REGISTERED_USERS, "refs/heads/branch2");
+
+    ObjectId id1 = repo.branch("branch1").commit().create();
+    ObjectId id2 = repo.branch("branch2").commit().create();
+
+    ProjectState state = readProjectState();
+    RevWalk rw = repo.getRevWalk();
+    Repository r = repo.getRepository();
+
+    assertTrue(commits.canRead(state, r, rw.parseCommit(id1)));
+    assertFalse(commits.canRead(state, r, rw.parseCommit(id2)));
+  }
+
+  @Test
+  public void canReadCommitIfReachableFromVisibleRef() throws Exception {
+    allow(project, READ, REGISTERED_USERS, "refs/heads/branch1");
+    deny(project, READ, REGISTERED_USERS, "refs/heads/branch2");
+
+    RevCommit parent1 = repo.commit().create();
+    repo.branch("branch1").commit().parent(parent1).create();
+
+    RevCommit parent2 = repo.commit().create();
+    repo.branch("branch2").commit().parent(parent2).create();
+
+    ProjectState state = readProjectState();
+    RevWalk rw = repo.getRevWalk();
+    Repository r = repo.getRepository();
+    assertTrue(commits.canRead(state, r, rw.parseCommit(parent1)));
+    assertFalse(commits.canRead(state, r, rw.parseCommit(parent2)));
+  }
+
+  @Test
+  public void cannotReadAfterRollbackWithRestrictedRead() throws Exception {
+    allow(project, READ, REGISTERED_USERS, "refs/heads/branch1");
+
+    RevCommit parent1 = repo.commit().create();
+    ObjectId id1 = repo.branch("branch1").commit().parent(parent1).create();
+
+    ProjectState state = readProjectState();
+    RevWalk rw = repo.getRevWalk();
+    Repository r = repo.getRepository();
+
+    assertTrue(commits.canRead(state, r, rw.parseCommit(parent1)));
+    assertTrue(commits.canRead(state, r, rw.parseCommit(id1)));
+
+    repo.branch("branch1").update(parent1);
+    assertTrue(commits.canRead(state, r, rw.parseCommit(parent1)));
+    assertFalse(commits.canRead(state, r, rw.parseCommit(id1)));
+  }
+
+  @Test
+  public void canReadAfterRollbackWithAllRefsVisible() throws Exception {
+    allow(project, READ, REGISTERED_USERS, "refs/*");
+
+    RevCommit parent1 = repo.commit().create();
+    ObjectId id1 = repo.branch("branch1").commit().parent(parent1).create();
+
+    ProjectState state = readProjectState();
+    RevWalk rw = repo.getRevWalk();
+    Repository r = repo.getRepository();
+
+    assertTrue(commits.canRead(state, r, rw.parseCommit(parent1)));
+    assertTrue(commits.canRead(state, r, rw.parseCommit(id1)));
+
+    repo.branch("branch1").update(parent1);
+    assertTrue(commits.canRead(state, r, rw.parseCommit(parent1)));
+    assertFalse(commits.canRead(state, r, rw.parseCommit(id1)));
+  }
+
+  private ProjectState readProjectState() throws Exception {
+    return projectCache.get(project.getName());
+  }
+
+  protected void allow(ProjectConfig project, String permission, AccountGroup.UUID id, String ref)
+      throws Exception {
+    Util.allow(project, permission, id, ref);
+    saveProjectConfig(project);
+  }
+
+  protected void deny(ProjectConfig project, String permission, AccountGroup.UUID id, String ref)
+      throws Exception {
+    Util.deny(project, permission, id, ref);
+    saveProjectConfig(project);
+  }
+
+  protected void saveProjectConfig(ProjectConfig cfg) throws Exception {
+    try (MetaDataUpdate md = metaDataUpdateFactory.create(cfg.getName())) {
+      cfg.commit(md);
+    }
+    projectCache.evict(cfg.getProject());
+  }
+
+  private void setUpPermissions() throws Exception {
+    ImmutableList<AccountGroup.UUID> admins = getAdmins();
+
+    // Remove read permissions for all users besides admin, because by default
+    // Anonymous user group has ALLOW READ permission in refs/*.
+    // This method is idempotent, so is safe to call on every test setup.
+    ProjectConfig pc = projectCache.checkedGet(allProjects).getConfig();
+    for (AccessSection sec : pc.getAccessSections()) {
+      sec.removePermission(Permission.READ);
+    }
+    for (AccountGroup.UUID admin : admins) {
+      allow(pc, Permission.READ, admin, "refs/*");
+    }
+  }
+
+  private ImmutableList<AccountGroup.UUID> getAdmins() {
+    Permission adminPermission =
+        projectCache
+            .getAllProjects()
+            .getConfig()
+            .getAccessSection(AccessSection.GLOBAL_CAPABILITIES)
+            .getPermission(GlobalCapability.ADMINISTRATE_SERVER);
+
+    return adminPermission.getRules().stream()
+        .map(PermissionRule::getGroup)
+        .map(GroupReference::getUUID)
+        .collect(ImmutableList.toImmutableList());
+  }
+}
diff --git a/javatests/com/google/gerrit/server/project/GroupListTest.java b/javatests/com/google/gerrit/server/project/GroupListTest.java
new file mode 100644
index 0000000..2249a16
--- /dev/null
+++ b/javatests/com/google/gerrit/server/project/GroupListTest.java
@@ -0,0 +1,121 @@
+// Copyright (C) 2014 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.google.gerrit.server.project;
+
+import static org.easymock.EasyMock.anyObject;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.createNiceMock;
+import static org.easymock.EasyMock.expectLastCall;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.git.ValidationError;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Set;
+import org.junit.Before;
+import org.junit.Test;
+
+public class GroupListTest {
+  private static final Project.NameKey PROJECT = new Project.NameKey("project");
+  private static final String TEXT =
+      "# UUID                                  \tGroup Name\n"
+          + "#\n"
+          + "d96b998f8a66ff433af50befb975d0e2bb6e0999\tNon-Interactive Users\n"
+          + "ebe31c01aec2c9ac3b3c03e87a47450829ff4310\tAdministrators\n";
+
+  private GroupList groupList;
+
+  @Before
+  public void setup() throws IOException {
+    ValidationError.Sink sink = createNiceMock(ValidationError.Sink.class);
+    replay(sink);
+    groupList = GroupList.parse(PROJECT, TEXT, sink);
+  }
+
+  @Test
+  public void byUUID() throws Exception {
+    AccountGroup.UUID uuid = new AccountGroup.UUID("d96b998f8a66ff433af50befb975d0e2bb6e0999");
+
+    GroupReference groupReference = groupList.byUUID(uuid);
+
+    assertEquals(uuid, groupReference.getUUID());
+    assertEquals("Non-Interactive Users", groupReference.getName());
+  }
+
+  @Test
+  public void put() {
+    AccountGroup.UUID uuid = new AccountGroup.UUID("abc");
+    GroupReference groupReference = new GroupReference(uuid, "Hutzliputz");
+
+    groupList.put(uuid, groupReference);
+
+    assertEquals(3, groupList.references().size());
+    GroupReference found = groupList.byUUID(uuid);
+    assertEquals(groupReference, found);
+  }
+
+  @Test
+  public void references() throws Exception {
+    Collection<GroupReference> result = groupList.references();
+
+    assertEquals(2, result.size());
+    AccountGroup.UUID uuid = new AccountGroup.UUID("ebe31c01aec2c9ac3b3c03e87a47450829ff4310");
+    GroupReference expected = new GroupReference(uuid, "Administrators");
+
+    assertTrue(result.contains(expected));
+  }
+
+  @Test
+  public void uUIDs() throws Exception {
+    Set<AccountGroup.UUID> result = groupList.uuids();
+
+    assertEquals(2, result.size());
+    AccountGroup.UUID expected = new AccountGroup.UUID("ebe31c01aec2c9ac3b3c03e87a47450829ff4310");
+    assertTrue(result.contains(expected));
+  }
+
+  @Test
+  public void validationError() throws Exception {
+    ValidationError.Sink sink = createMock(ValidationError.Sink.class);
+    sink.error(anyObject(ValidationError.class));
+    expectLastCall().times(2);
+    replay(sink);
+    groupList = GroupList.parse(PROJECT, TEXT.replace("\t", "    "), sink);
+    verify(sink);
+  }
+
+  @Test
+  public void retainAll() throws Exception {
+    AccountGroup.UUID uuid = new AccountGroup.UUID("d96b998f8a66ff433af50befb975d0e2bb6e0999");
+    groupList.retainUUIDs(Collections.singleton(uuid));
+
+    assertNotNull(groupList.byUUID(uuid));
+    assertNull(groupList.byUUID(new AccountGroup.UUID("ebe31c01aec2c9ac3b3c03e87a47450829ff4310")));
+  }
+
+  @Test
+  public void asText() throws Exception {
+    assertTrue(TEXT.equals(groupList.asText()));
+  }
+}
diff --git a/javatests/com/google/gerrit/server/project/ProjectConfigTest.java b/javatests/com/google/gerrit/server/project/ProjectConfigTest.java
new file mode 100644
index 0000000..0e4ba10
--- /dev/null
+++ b/javatests/com/google/gerrit/server/project/ProjectConfigTest.java
@@ -0,0 +1,614 @@
+// Copyright (C) 2011 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.google.gerrit.server.project;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import com.google.common.collect.Iterables;
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.ContributorAgreement;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.common.data.PermissionRule;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.config.PluginConfig;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.ValidationError;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.project.testing.Util;
+import com.google.gerrit.testing.GerritBaseTests;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Map;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.IncorrectObjectTypeException;
+import org.eclipse.jgit.errors.MissingObjectException;
+import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.lib.RefUpdate.Result;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevObject;
+import org.eclipse.jgit.util.RawParseUtils;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ProjectConfigTest extends GerritBaseTests {
+  private static final String LABEL_SCORES_CONFIG =
+      "  copyMinScore = "
+          + !LabelType.DEF_COPY_MIN_SCORE
+          + "\n"
+          + "  copyMaxScore = "
+          + !LabelType.DEF_COPY_MAX_SCORE
+          + "\n"
+          + "  copyAllScoresOnMergeFirstParentUpdate = "
+          + !LabelType.DEF_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE
+          + "\n"
+          + "  copyAllScoresOnTrivialRebase = "
+          + !LabelType.DEF_COPY_ALL_SCORES_ON_TRIVIAL_REBASE
+          + "\n"
+          + "  copyAllScoresIfNoCodeChange = "
+          + !LabelType.DEF_COPY_ALL_SCORES_IF_NO_CODE_CHANGE
+          + "\n"
+          + "  copyAllScoresIfNoChange = "
+          + !LabelType.DEF_COPY_ALL_SCORES_IF_NO_CHANGE
+          + "\n";
+
+  private final GroupReference developers =
+      new GroupReference(new AccountGroup.UUID("X"), "Developers");
+  private final GroupReference staff = new GroupReference(new AccountGroup.UUID("Y"), "Staff");
+
+  private Repository db;
+  private TestRepository<?> tr;
+
+  @Before
+  public void setUp() throws Exception {
+    db = new InMemoryRepository(new DfsRepositoryDescription("repo"));
+    tr = new TestRepository<>(db);
+  }
+
+  @Test
+  public void readConfig() throws Exception {
+    RevCommit rev =
+        tr.commit()
+            .add("groups", group(developers))
+            .add(
+                "project.config",
+                "[access \"refs/heads/*\"]\n"
+                    + "  exclusiveGroupPermissions = read submit create\n"
+                    + "  submit = group Developers\n"
+                    + "  push = group Developers\n"
+                    + "  read = group Developers\n"
+                    + "[accounts]\n"
+                    + "  sameGroupVisibility = deny group Developers\n"
+                    + "  sameGroupVisibility = block group Staff\n"
+                    + "[contributor-agreement \"Individual\"]\n"
+                    + "  description = A simple description\n"
+                    + "  accepted = group Developers\n"
+                    + "  accepted = group Staff\n"
+                    + "  autoVerify = group Developers\n"
+                    + "  agreementUrl = http://www.example.com/agree\n")
+            .create();
+
+    ProjectConfig cfg = read(rev);
+    assertThat(cfg.getAccountsSection().getSameGroupVisibility()).hasSize(2);
+    ContributorAgreement ca = cfg.getContributorAgreement("Individual");
+    assertThat(ca.getName()).isEqualTo("Individual");
+    assertThat(ca.getDescription()).isEqualTo("A simple description");
+    assertThat(ca.getAgreementUrl()).isEqualTo("http://www.example.com/agree");
+    assertThat(ca.getAccepted()).hasSize(2);
+    assertThat(ca.getAccepted().get(0).getGroup()).isEqualTo(developers);
+    assertThat(ca.getAccepted().get(1).getGroup().getName()).isEqualTo("Staff");
+    assertThat(ca.getAutoVerify().getName()).isEqualTo("Developers");
+
+    AccessSection section = cfg.getAccessSection("refs/heads/*");
+    assertThat(section).isNotNull();
+    assertThat(cfg.getAccessSection("refs/*")).isNull();
+
+    Permission create = section.getPermission(Permission.CREATE);
+    Permission submit = section.getPermission(Permission.SUBMIT);
+    Permission read = section.getPermission(Permission.READ);
+    Permission push = section.getPermission(Permission.PUSH);
+
+    assertThat(create.getExclusiveGroup()).isTrue();
+    assertThat(submit.getExclusiveGroup()).isTrue();
+    assertThat(read.getExclusiveGroup()).isTrue();
+    assertThat(push.getExclusiveGroup()).isFalse();
+  }
+
+  @Test
+  public void readConfigLabelDefaultValue() throws Exception {
+    RevCommit rev =
+        tr.commit()
+            .add("groups", group(developers))
+            .add(
+                "project.config",
+                "[label \"CustomLabel\"]\n"
+                    + "  value = -1 Negative\n"
+                    // No leading space before 0.
+                    + "  value = 0 No Score\n"
+                    + "  value =  1 Positive\n")
+            .create();
+
+    ProjectConfig cfg = read(rev);
+    Map<String, LabelType> labels = cfg.getLabelSections();
+    Short dv = labels.entrySet().iterator().next().getValue().getDefaultValue();
+    assertThat((int) dv).isEqualTo(0);
+  }
+
+  @Test
+  public void readConfigLabelOldStyleWithLeadingSpace() throws Exception {
+    RevCommit rev =
+        tr.commit()
+            .add("groups", group(developers))
+            .add(
+                "project.config",
+                "[label \"CustomLabel\"]\n"
+                    + "  value = -1 Negative\n"
+                    // Leading space before 0.
+                    + "  value =  0 No Score\n"
+                    + "  value =  1 Positive\n")
+            .create();
+
+    ProjectConfig cfg = read(rev);
+    Map<String, LabelType> labels = cfg.getLabelSections();
+    Short dv = labels.entrySet().iterator().next().getValue().getDefaultValue();
+    assertThat((int) dv).isEqualTo(0);
+  }
+
+  @Test
+  public void readConfigLabelDefaultValueInRange() throws Exception {
+    RevCommit rev =
+        tr.commit()
+            .add("groups", group(developers))
+            .add(
+                "project.config",
+                "[label \"CustomLabel\"]\n"
+                    + "  value = -1 Negative\n"
+                    + "  value = 0 No Score\n"
+                    + "  value =  1 Positive\n"
+                    + "  defaultValue = -1\n")
+            .create();
+
+    ProjectConfig cfg = read(rev);
+    Map<String, LabelType> labels = cfg.getLabelSections();
+    Short dv = labels.entrySet().iterator().next().getValue().getDefaultValue();
+    assertThat((int) dv).isEqualTo(-1);
+  }
+
+  @Test
+  public void readConfigLabelDefaultValueNotInRange() throws Exception {
+    RevCommit rev =
+        tr.commit()
+            .add("groups", group(developers))
+            .add(
+                "project.config",
+                "[label \"CustomLabel\"]\n"
+                    + "  value = -1 Negative\n"
+                    + "  value = 0 No Score\n"
+                    + "  value =  1 Positive\n"
+                    + "  defaultValue = -2\n")
+            .create();
+
+    ProjectConfig cfg = read(rev);
+    assertThat(cfg.getValidationErrors()).hasSize(1);
+    assertThat(Iterables.getOnlyElement(cfg.getValidationErrors()).getMessage())
+        .isEqualTo("project.config: Invalid defaultValue \"-2\" for label \"CustomLabel\"");
+  }
+
+  @Test
+  public void readConfigLabelScores() throws Exception {
+    RevCommit rev =
+        tr.commit()
+            .add("groups", group(developers))
+            .add("project.config", "[label \"CustomLabel\"]\n" + LABEL_SCORES_CONFIG)
+            .create();
+
+    ProjectConfig cfg = read(rev);
+    Map<String, LabelType> labels = cfg.getLabelSections();
+    LabelType type = labels.entrySet().iterator().next().getValue();
+    assertThat(type.isCopyMinScore()).isNotEqualTo(LabelType.DEF_COPY_MIN_SCORE);
+    assertThat(type.isCopyMaxScore()).isNotEqualTo(LabelType.DEF_COPY_MAX_SCORE);
+    assertThat(type.isCopyAllScoresOnMergeFirstParentUpdate())
+        .isNotEqualTo(LabelType.DEF_COPY_ALL_SCORES_ON_MERGE_FIRST_PARENT_UPDATE);
+    assertThat(type.isCopyAllScoresOnTrivialRebase())
+        .isNotEqualTo(LabelType.DEF_COPY_ALL_SCORES_ON_TRIVIAL_REBASE);
+    assertThat(type.isCopyAllScoresIfNoCodeChange())
+        .isNotEqualTo(LabelType.DEF_COPY_ALL_SCORES_IF_NO_CODE_CHANGE);
+    assertThat(type.isCopyAllScoresIfNoChange())
+        .isNotEqualTo(LabelType.DEF_COPY_ALL_SCORES_IF_NO_CHANGE);
+  }
+
+  @Test
+  public void editConfig() throws Exception {
+    RevCommit rev =
+        tr.commit()
+            .add("groups", group(developers))
+            .add(
+                "project.config",
+                "[access \"refs/heads/*\"]\n"
+                    + "  exclusiveGroupPermissions = read submit\n"
+                    + "  submit = group Developers\n"
+                    + "  upload = group Developers\n"
+                    + "  read = group Developers\n"
+                    + "[accounts]\n"
+                    + "  sameGroupVisibility = deny group Developers\n"
+                    + "  sameGroupVisibility = block group Staff\n"
+                    + "[contributor-agreement \"Individual\"]\n"
+                    + "  description = A simple description\n"
+                    + "  accepted = group Developers\n"
+                    + "  autoVerify = group Developers\n"
+                    + "  agreementUrl = http://www.example.com/agree\n"
+                    + "[label \"CustomLabel\"]\n"
+                    + LABEL_SCORES_CONFIG)
+            .create();
+    update(rev);
+
+    ProjectConfig cfg = read(rev);
+    AccessSection section = cfg.getAccessSection("refs/heads/*");
+    cfg.getAccountsSection()
+        .setSameGroupVisibility(Collections.singletonList(new PermissionRule(cfg.resolve(staff))));
+    Permission submit = section.getPermission(Permission.SUBMIT);
+    submit.add(new PermissionRule(cfg.resolve(staff)));
+    ContributorAgreement ca = cfg.getContributorAgreement("Individual");
+    ca.setAccepted(Collections.singletonList(new PermissionRule(cfg.resolve(staff))));
+    ca.setAutoVerify(null);
+    ca.setDescription("A new description");
+    rev = commit(cfg);
+    assertThat(text(rev, "project.config"))
+        .isEqualTo(
+            "[access \"refs/heads/*\"]\n"
+                + "  exclusiveGroupPermissions = read submit\n"
+                + "  submit = group Developers\n"
+                + "\tsubmit = group Staff\n"
+                + "  upload = group Developers\n"
+                + "  read = group Developers\n"
+                + "[accounts]\n"
+                + "  sameGroupVisibility = group Staff\n"
+                + "[contributor-agreement \"Individual\"]\n"
+                + "  description = A new description\n"
+                + "  accepted = group Staff\n"
+                + "  agreementUrl = http://www.example.com/agree\n"
+                + "[label \"CustomLabel\"]\n"
+                + LABEL_SCORES_CONFIG
+                + "\tfunction = MaxWithBlock\n" // label gets this function when it is created
+                + "\tdefaultValue = 0\n"); //  label gets this value when it is created
+  }
+
+  @Test
+  public void editConfigLabelValues() throws Exception {
+    RevCommit rev = tr.commit().create();
+    update(rev);
+
+    ProjectConfig cfg = read(rev);
+    cfg.getLabelSections()
+        .put(
+            "My-Label",
+            Util.category(
+                "My-Label",
+                Util.value(-1, "Negative"),
+                Util.value(0, "No score"),
+                Util.value(1, "Positive")));
+    rev = commit(cfg);
+    assertThat(text(rev, "project.config"))
+        .isEqualTo(
+            "[label \"My-Label\"]\n"
+                + "\tfunction = MaxWithBlock\n"
+                + "\tdefaultValue = 0\n"
+                + "\tvalue = -1 Negative\n"
+                + "\tvalue = 0 No score\n"
+                + "\tvalue = +1 Positive\n");
+  }
+
+  @Test
+  public void addCommentLink() throws Exception {
+    RevCommit rev = tr.commit().create();
+    update(rev);
+
+    ProjectConfig cfg = read(rev);
+    CommentLinkInfoImpl cm = new CommentLinkInfoImpl("Test", "abc.*", null, "<a>link</a>", true);
+    cfg.addCommentLinkSection(cm);
+    rev = commit(cfg);
+    assertThat(text(rev, "project.config"))
+        .isEqualTo("[commentlink \"Test\"]\n\tmatch = abc.*\n\thtml = <a>link</a>\n");
+  }
+
+  @Test
+  public void editConfigMissingGroupTableEntry() throws Exception {
+    RevCommit rev =
+        tr.commit()
+            .add("groups", group(developers))
+            .add(
+                "project.config",
+                "[access \"refs/heads/*\"]\n"
+                    + "  exclusiveGroupPermissions = read submit\n"
+                    + "  submit = group People Who Can Submit\n"
+                    + "  upload = group Developers\n"
+                    + "  read = group Developers\n")
+            .create();
+    update(rev);
+
+    ProjectConfig cfg = read(rev);
+    AccessSection section = cfg.getAccessSection("refs/heads/*");
+    Permission submit = section.getPermission(Permission.SUBMIT);
+    submit.add(new PermissionRule(cfg.resolve(staff)));
+    rev = commit(cfg);
+    assertThat(text(rev, "project.config"))
+        .isEqualTo(
+            "[access \"refs/heads/*\"]\n"
+                + "  exclusiveGroupPermissions = read submit\n"
+                + "  submit = group People Who Can Submit\n"
+                + "\tsubmit = group Staff\n"
+                + "  upload = group Developers\n"
+                + "  read = group Developers\n");
+  }
+
+  @Test
+  public void readExistingPluginConfig() throws Exception {
+    RevCommit rev =
+        tr.commit()
+            .add(
+                "project.config",
+                "[plugin \"somePlugin\"]\n"
+                    + "  key1 = value1\n"
+                    + "  key2 = value2a\n"
+                    + "  key2 = value2b\n")
+            .create();
+    update(rev);
+
+    ProjectConfig cfg = read(rev);
+    PluginConfig pluginCfg = cfg.getPluginConfig("somePlugin");
+    assertThat(pluginCfg.getNames()).hasSize(2);
+    assertThat(pluginCfg.getString("key1")).isEqualTo("value1");
+    assertThat(pluginCfg.getStringList(("key2"))).isEqualTo(new String[] {"value2a", "value2b"});
+  }
+
+  @Test
+  public void readUnexistingPluginConfig() throws Exception {
+    ProjectConfig cfg = new ProjectConfig(new Project.NameKey("test"));
+    cfg.load(db);
+    PluginConfig pluginCfg = cfg.getPluginConfig("somePlugin");
+    assertThat(pluginCfg.getNames()).isEmpty();
+  }
+
+  @Test
+  public void editPluginConfig() throws Exception {
+    RevCommit rev =
+        tr.commit()
+            .add(
+                "project.config",
+                "[plugin \"somePlugin\"]\n"
+                    + "  key1 = value1\n"
+                    + "  key2 = value2a\n"
+                    + "  key2 = value2b\n")
+            .create();
+    update(rev);
+
+    ProjectConfig cfg = read(rev);
+    PluginConfig pluginCfg = cfg.getPluginConfig("somePlugin");
+    pluginCfg.setString("key1", "updatedValue1");
+    pluginCfg.setStringList("key2", Arrays.asList("updatedValue2a", "updatedValue2b"));
+    rev = commit(cfg);
+    assertThat(text(rev, "project.config"))
+        .isEqualTo(
+            "[plugin \"somePlugin\"]\n"
+                + "\tkey1 = updatedValue1\n"
+                + "\tkey2 = updatedValue2a\n"
+                + "\tkey2 = updatedValue2b\n");
+  }
+
+  @Test
+  public void readPluginConfigGroupReference() throws Exception {
+    RevCommit rev =
+        tr.commit()
+            .add("groups", group(developers))
+            .add("project.config", "[plugin \"somePlugin\"]\nkey1 = " + developers.toConfigValue())
+            .create();
+    update(rev);
+
+    ProjectConfig cfg = read(rev);
+    PluginConfig pluginCfg = cfg.getPluginConfig("somePlugin");
+    assertThat(pluginCfg.getNames()).hasSize(1);
+    assertThat(pluginCfg.getGroupReference("key1")).isEqualTo(developers);
+  }
+
+  @Test
+  public void readPluginConfigGroupReferenceNotInGroupsFile() throws Exception {
+    RevCommit rev =
+        tr.commit()
+            .add("groups", group(developers))
+            .add("project.config", "[plugin \"somePlugin\"]\nkey1 = " + staff.toConfigValue())
+            .create();
+    update(rev);
+
+    ProjectConfig cfg = read(rev);
+    assertThat(cfg.getValidationErrors()).hasSize(1);
+    assertThat(Iterables.getOnlyElement(cfg.getValidationErrors()).getMessage())
+        .isEqualTo(
+            "project.config: group \"" + staff.getName() + "\" not in " + GroupList.FILE_NAME);
+  }
+
+  @Test
+  public void editPluginConfigGroupReference() throws Exception {
+    RevCommit rev =
+        tr.commit()
+            .add("groups", group(developers))
+            .add("project.config", "[plugin \"somePlugin\"]\nkey1 = " + developers.toConfigValue())
+            .create();
+    update(rev);
+
+    ProjectConfig cfg = read(rev);
+    PluginConfig pluginCfg = cfg.getPluginConfig("somePlugin");
+    assertThat(pluginCfg.getNames()).hasSize(1);
+    assertThat(pluginCfg.getGroupReference("key1")).isEqualTo(developers);
+
+    pluginCfg.setGroupReference("key1", staff);
+    rev = commit(cfg);
+    assertThat(text(rev, "project.config"))
+        .isEqualTo("[plugin \"somePlugin\"]\n\tkey1 = " + staff.toConfigValue() + "\n");
+    assertThat(text(rev, "groups"))
+        .isEqualTo(
+            "# UUID\tGroup Name\n"
+                + "#\n"
+                + staff.getUUID().get()
+                + "     \t"
+                + staff.getName()
+                + "\n");
+  }
+
+  @Test
+  public void readCommentLinks() throws Exception {
+    RevCommit rev =
+        tr.commit()
+            .add(
+                "project.config",
+                "[commentlink \"bugzilla\"]\n"
+                    + "\tmatch = \"(bug\\\\s+#?)(\\\\d+)\"\n"
+                    + "\tlink = http://bugs.example.com/show_bug.cgi?id=$2")
+            .create();
+    ProjectConfig cfg = read(rev);
+    assertThat(cfg.getCommentLinkSections())
+        .containsExactly(
+            new CommentLinkInfoImpl(
+                "bugzilla",
+                "(bug\\s+#?)(\\d+)",
+                "http://bugs.example.com/show_bug.cgi?id=$2",
+                null,
+                null));
+  }
+
+  @Test
+  public void readCommentLinksNoHtmlOrLinkButEnabled() throws Exception {
+    RevCommit rev =
+        tr.commit().add("project.config", "[commentlink \"bugzilla\"]\n \tenabled = true").create();
+    ProjectConfig cfg = read(rev);
+    assertThat(cfg.getCommentLinkSections())
+        .containsExactly(new CommentLinkInfoImpl.Enabled("bugzilla"));
+  }
+
+  @Test
+  public void readCommentLinksNoHtmlOrLinkAndDisabled() throws Exception {
+    RevCommit rev =
+        tr.commit()
+            .add("project.config", "[commentlink \"bugzilla\"]\n \tenabled = false")
+            .create();
+    ProjectConfig cfg = read(rev);
+    assertThat(cfg.getCommentLinkSections())
+        .containsExactly(new CommentLinkInfoImpl.Disabled("bugzilla"));
+  }
+
+  @Test
+  public void readCommentLinkInvalidPattern() throws Exception {
+    RevCommit rev =
+        tr.commit()
+            .add(
+                "project.config",
+                "[commentlink \"bugzilla\"]\n"
+                    + "\tmatch = \"(bugs{+#?)(d+)\"\n"
+                    + "\tlink = http://bugs.example.com/show_bug.cgi?id=$2")
+            .create();
+    ProjectConfig cfg = read(rev);
+    assertThat(cfg.getCommentLinkSections()).isEmpty();
+    assertThat(cfg.getValidationErrors())
+        .containsExactly(
+            new ValidationError(
+                "project.config: Invalid pattern \"(bugs{+#?)(d+)\" in commentlink.bugzilla.match: "
+                    + "Illegal repetition near index 4\n"
+                    + "(bugs{+#?)(d+)\n"
+                    + "    ^"));
+  }
+
+  @Test
+  public void readCommentLinkRawHtml() throws Exception {
+    RevCommit rev =
+        tr.commit()
+            .add(
+                "project.config",
+                "[commentlink \"bugzilla\"]\n"
+                    + "\tmatch = \"(bugs#?)(d+)\"\n"
+                    + "\thtml = http://bugs.example.com/show_bug.cgi?id=$2")
+            .create();
+    ProjectConfig cfg = read(rev);
+    assertThat(cfg.getCommentLinkSections()).isEmpty();
+    assertThat(cfg.getValidationErrors())
+        .containsExactly(
+            new ValidationError(
+                "project.config: Error in pattern \"(bugs#?)(d+)\" in commentlink.bugzilla.match: "
+                    + "Raw html replacement not allowed"));
+  }
+
+  @Test
+  public void readCommentLinkMatchButNoHtmlOrLink() throws Exception {
+    RevCommit rev =
+        tr.commit()
+            .add("project.config", "[commentlink \"bugzilla\"]\n" + "\tmatch = \"(bugs#?)(d+)\"\n")
+            .create();
+    ProjectConfig cfg = read(rev);
+    assertThat(cfg.getCommentLinkSections()).isEmpty();
+    assertThat(cfg.getValidationErrors())
+        .containsExactly(
+            new ValidationError(
+                "project.config: Error in pattern \"(bugs#?)(d+)\" in commentlink.bugzilla.match: "
+                    + "commentlink.bugzilla must have either link or html"));
+  }
+
+  private ProjectConfig read(RevCommit rev) throws IOException, ConfigInvalidException {
+    ProjectConfig cfg = new ProjectConfig(new Project.NameKey("test"));
+    cfg.load(db, rev);
+    return cfg;
+  }
+
+  private RevCommit commit(ProjectConfig cfg)
+      throws IOException, MissingObjectException, IncorrectObjectTypeException {
+    try (MetaDataUpdate md =
+        new MetaDataUpdate(GitReferenceUpdated.DISABLED, cfg.getProject().getNameKey(), db)) {
+      tr.tick(5);
+      tr.setAuthorAndCommitter(md.getCommitBuilder());
+      md.setMessage("Edit\n");
+      cfg.commit(md);
+
+      Ref ref = db.exactRef(RefNames.REFS_CONFIG);
+      return tr.getRevWalk().parseCommit(ref.getObjectId());
+    }
+  }
+
+  private void update(RevCommit rev) throws Exception {
+    RefUpdate u = db.updateRef(RefNames.REFS_CONFIG);
+    u.disableRefLog();
+    u.setNewObjectId(rev);
+    Result result = u.forceUpdate();
+    assertWithMessage("Cannot update ref for test: " + result)
+        .that(result)
+        .isAnyOf(Result.FAST_FORWARD, Result.FORCED, Result.NEW, Result.NO_CHANGE);
+  }
+
+  private String text(RevCommit rev, String path) throws Exception {
+    RevObject blob = tr.get(rev.getTree(), path);
+    byte[] data = db.open(blob).getCachedBytes(Integer.MAX_VALUE);
+    return RawParseUtils.decode(data);
+  }
+
+  private static String group(GroupReference g) {
+    return g.getUUID().get() + "\t" + g.getName() + "\n";
+  }
+}
diff --git a/javatests/com/google/gerrit/server/query/account/AbstractQueryAccountsTest.java b/javatests/com/google/gerrit/server/query/account/AbstractQueryAccountsTest.java
new file mode 100644
index 0000000..d292e19
--- /dev/null
+++ b/javatests/com/google/gerrit/server/query/account/AbstractQueryAccountsTest.java
@@ -0,0 +1,939 @@
+// 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.
+
+package com.google.gerrit.server.query.account;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth8.assertThat;
+import static java.util.stream.Collectors.toList;
+import static org.junit.Assert.fail;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Streams;
+import com.google.gerrit.extensions.api.GerritApi;
+import com.google.gerrit.extensions.api.access.AccessSectionInfo;
+import com.google.gerrit.extensions.api.access.PermissionInfo;
+import com.google.gerrit.extensions.api.access.PermissionRuleInfo;
+import com.google.gerrit.extensions.api.access.ProjectAccessInput;
+import com.google.gerrit.extensions.api.accounts.Accounts.QueryRequest;
+import com.google.gerrit.extensions.api.groups.GroupInput;
+import com.google.gerrit.extensions.api.projects.ProjectInput;
+import com.google.gerrit.extensions.client.ListAccountsOption;
+import com.google.gerrit.extensions.client.ProjectWatchInfo;
+import com.google.gerrit.extensions.common.AccountExternalIdInfo;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.ChangeInput;
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.index.FieldDef;
+import com.google.gerrit.index.IndexConfig;
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.index.query.FieldBundle;
+import com.google.gerrit.lifecycle.LifecycleManager;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.AnonymousUser;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.ServerInitiated;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountConfig;
+import com.google.gerrit.server.account.AccountManager;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.account.Accounts;
+import com.google.gerrit.server.account.AccountsUpdate;
+import com.google.gerrit.server.account.AuthRequest;
+import com.google.gerrit.server.account.InternalAccountUpdate;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.account.externalids.ExternalIds;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.index.account.AccountField;
+import com.google.gerrit.server.index.account.AccountIndex;
+import com.google.gerrit.server.index.account.AccountIndexCollection;
+import com.google.gerrit.server.index.account.AccountIndexer;
+import com.google.gerrit.server.schema.SchemaCreator;
+import com.google.gerrit.server.util.ManualRequestContext;
+import com.google.gerrit.server.util.OneOffRequestContext;
+import com.google.gerrit.server.util.RequestContext;
+import com.google.gerrit.server.util.ThreadLocalRequestContext;
+import com.google.gerrit.testing.GerritServerTests;
+import com.google.gerrit.testing.InMemoryDatabase;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Provider;
+import com.google.inject.util.Providers;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Optional;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+
+@Ignore
+public abstract class AbstractQueryAccountsTest extends GerritServerTests {
+  @Inject protected Accounts accounts;
+
+  @Inject @ServerInitiated protected Provider<AccountsUpdate> accountsUpdate;
+
+  @Inject protected AccountCache accountCache;
+
+  @Inject protected AccountIndexer accountIndexer;
+
+  @Inject protected AccountManager accountManager;
+
+  @Inject protected GerritApi gApi;
+
+  @Inject @GerritPersonIdent Provider<PersonIdent> serverIdent;
+
+  @Inject protected IdentifiedUser.GenericFactory userFactory;
+
+  @Inject private Provider<AnonymousUser> anonymousUser;
+
+  @Inject protected InMemoryDatabase schemaFactory;
+
+  @Inject protected SchemaCreator schemaCreator;
+
+  @Inject protected ThreadLocalRequestContext requestContext;
+
+  @Inject protected OneOffRequestContext oneOffRequestContext;
+
+  @Inject protected Provider<InternalAccountQuery> queryProvider;
+
+  @Inject protected AllProjectsName allProjects;
+
+  @Inject protected AllUsersName allUsers;
+
+  @Inject protected GitRepositoryManager repoManager;
+
+  @Inject protected AccountIndexCollection indexes;
+
+  @Inject protected ExternalIds externalIds;
+
+  protected LifecycleManager lifecycle;
+  protected Injector injector;
+  protected ReviewDb db;
+  protected AccountInfo currentUserInfo;
+  protected CurrentUser admin;
+
+  protected abstract Injector createInjector();
+
+  @Before
+  public void setUpInjector() throws Exception {
+    lifecycle = new LifecycleManager();
+    injector = createInjector();
+    lifecycle.add(injector);
+    injector.injectMembers(this);
+    lifecycle.start();
+    initAfterLifecycleStart();
+    setUpDatabase();
+  }
+
+  @After
+  public void cleanUp() {
+    lifecycle.stop();
+    db.close();
+  }
+
+  protected void setUpDatabase() throws Exception {
+    db = schemaFactory.open();
+    schemaCreator.create(db);
+
+    Account.Id adminId = createAccount("admin", "Administrator", "admin@example.com", true);
+    admin = userFactory.create(adminId);
+    requestContext.setContext(newRequestContext(adminId));
+    currentUserInfo = gApi.accounts().id(adminId.get()).get();
+  }
+
+  protected void initAfterLifecycleStart() throws Exception {}
+
+  protected RequestContext newRequestContext(Account.Id requestUserId) {
+    final CurrentUser requestUser = userFactory.create(requestUserId);
+    return new RequestContext() {
+      @Override
+      public CurrentUser getUser() {
+        return requestUser;
+      }
+
+      @Override
+      public Provider<ReviewDb> getReviewDbProvider() {
+        return Providers.of(db);
+      }
+    };
+  }
+
+  protected void setAnonymous() {
+    requestContext.setContext(
+        new RequestContext() {
+          @Override
+          public CurrentUser getUser() {
+            return anonymousUser.get();
+          }
+
+          @Override
+          public Provider<ReviewDb> getReviewDbProvider() {
+            return Providers.of(db);
+          }
+        });
+  }
+
+  @After
+  public void tearDownInjector() {
+    if (lifecycle != null) {
+      lifecycle.stop();
+    }
+    requestContext.setContext(null);
+    if (db != null) {
+      db.close();
+    }
+    InMemoryDatabase.drop(schemaFactory);
+  }
+
+  @Test
+  public void byId() throws Exception {
+    AccountInfo user = newAccount("user");
+
+    assertQuery("9999999");
+    assertQuery(currentUserInfo._accountId, currentUserInfo);
+    assertQuery(user._accountId, user);
+  }
+
+  @Test
+  public void bySelf() throws Exception {
+    assertQuery("self", currentUserInfo);
+  }
+
+  @Test
+  public void byEmail() throws Exception {
+    AccountInfo user1 = newAccountWithEmail("user1", name("user1@example.com"));
+
+    String domain = name("test.com");
+    AccountInfo user2 = newAccountWithEmail("user2", "user2@" + domain);
+    AccountInfo user3 = newAccountWithEmail("user3", "user3@" + domain);
+
+    String prefix = name("prefix");
+    AccountInfo user4 = newAccountWithEmail("user4", prefix + "user4@example.com");
+
+    AccountInfo user5 = newAccountWithEmail("user5", name("user5MixedCase@example.com"));
+
+    assertQuery("notexisting@test.com");
+
+    assertQuery(currentUserInfo.email, currentUserInfo);
+    assertQuery("email:" + currentUserInfo.email, currentUserInfo);
+
+    assertQuery(user1.email, user1);
+    assertQuery("email:" + user1.email, user1);
+
+    assertQuery(domain, user2, user3);
+
+    assertQuery("email:" + prefix, user4);
+
+    assertQuery(user5.email, user5);
+    assertQuery("email:" + user5.email, user5);
+    assertQuery("email:" + user5.email.toUpperCase(), user5);
+  }
+
+  @Test
+  public void bySecondaryEmail() throws Exception {
+    String prefix = name("secondary");
+    String domain = name("test.com");
+    String secondaryEmail = prefix + "@" + domain;
+    AccountInfo user1 = newAccountWithEmail("user1", name("user1@example.com"));
+    addEmails(user1, secondaryEmail);
+
+    AccountInfo user2 = newAccountWithEmail("user2", name("user2@example.com"));
+    addEmails(user2, name("other@" + domain));
+
+    assertQuery(secondaryEmail, user1);
+    assertQuery("email:" + secondaryEmail, user1);
+    assertQuery("email:" + prefix, user1);
+    assertQuery(domain, user1, user2);
+  }
+
+  @Test
+  public void byEmailWithoutModifyAccountCapability() throws Exception {
+    String preferredEmail = name("primary@test.com");
+    String secondaryEmail = name("secondary@test.com");
+    AccountInfo user1 = newAccountWithEmail("user1", preferredEmail);
+    addEmails(user1, secondaryEmail);
+
+    AccountInfo user2 = newAccount("user");
+    requestContext.setContext(newRequestContext(new Account.Id(user2._accountId)));
+
+    if (getSchemaVersion() < 5) {
+      assertMissingField(AccountField.PREFERRED_EMAIL);
+      assertFailingQuery("email:foo", "'email' operator is not supported by account index version");
+      return;
+    }
+
+    // This at least needs the PREFERRED_EMAIL field which is available from schema version 5.
+    if (getSchemaVersion() >= 5) {
+      assertQuery(preferredEmail, user1);
+    } else {
+      assertQuery(preferredEmail);
+    }
+
+    assertQuery(secondaryEmail);
+
+    assertQuery("email:" + preferredEmail, user1);
+    assertQuery("email:" + secondaryEmail);
+  }
+
+  @Test
+  public void byUsername() throws Exception {
+    AccountInfo user1 = newAccount("myuser");
+
+    assertQuery("notexisting");
+    assertQuery("Not Existing");
+
+    assertQuery(user1.username, user1);
+    assertQuery("username:" + user1.username, user1);
+    assertQuery("username:" + user1.username.toUpperCase(), user1);
+  }
+
+  @Test
+  public void isActive() throws Exception {
+    String domain = name("test.com");
+    AccountInfo user1 = newAccountWithEmail("user1", "user1@" + domain);
+    AccountInfo user2 = newAccountWithEmail("user2", "user2@" + domain);
+    AccountInfo user3 = newAccount("user3", "user3@" + domain, false);
+    AccountInfo user4 = newAccount("user4", "user4@" + domain, false);
+
+    // by default only active accounts are returned
+    assertQuery(domain, user1, user2);
+    assertQuery("name:" + domain, user1, user2);
+
+    assertQuery("is:active name:" + domain, user1, user2);
+
+    assertQuery("is:inactive name:" + domain, user3, user4);
+  }
+
+  @Test
+  public void byName() throws Exception {
+    AccountInfo user1 = newAccountWithFullName("jdoe", "John Doe");
+    AccountInfo user2 = newAccountWithFullName("jroe", "Jane Roe");
+    AccountInfo user3 = newAccountWithFullName("user3", "Mr Selfish");
+
+    assertQuery("notexisting");
+    assertQuery("Not Existing");
+
+    assertQuery(quote(user1.name), user1);
+    assertQuery("name:" + quote(user1.name), user1);
+    assertQuery("John", user1);
+    assertQuery("john", user1);
+    assertQuery("Doe", user1);
+    assertQuery("doe", user1);
+    assertQuery("DOE", user1);
+    assertQuery("Jo Do", user1);
+    assertQuery("jo do", user1);
+    assertQuery("self", currentUserInfo, user3);
+    assertQuery("me", currentUserInfo);
+    assertQuery("name:John", user1);
+    assertQuery("name:john", user1);
+    assertQuery("name:Doe", user1);
+    assertQuery("name:doe", user1);
+    assertQuery("name:DOE", user1);
+    assertQuery("name:self", user3);
+
+    assertQuery(quote(user2.name), user2);
+    assertQuery("name:" + quote(user2.name), user2);
+  }
+
+  @Test
+  public void byNameWithoutModifyAccountCapability() throws Exception {
+    AccountInfo user1 = newAccountWithFullName("jdoe", "John Doe");
+    AccountInfo user2 = newAccountWithFullName("jroe", "Jane Roe");
+
+    AccountInfo user3 = newAccount("user");
+    requestContext.setContext(newRequestContext(new Account.Id(user3._accountId)));
+
+    assertQuery("notexisting");
+    assertQuery("Not Existing");
+
+    // by full name works with any index version
+    assertQuery(quote(user1.name), user1);
+    assertQuery("name:" + quote(user1.name), user1);
+    assertQuery(quote(user2.name), user2);
+    assertQuery("name:" + quote(user2.name), user2);
+
+    // by self/me works with any index version
+    assertQuery("self", user3);
+    assertQuery("me", user3);
+
+    if (getSchemaVersion() < 8) {
+      assertMissingField(AccountField.NAME_PART_NO_SECONDARY_EMAIL);
+
+      // prefix queries only work if the NAME_PART_NO_SECONDARY_EMAIL field is available
+      assertQuery("john");
+      return;
+    }
+
+    assertQuery("John", user1);
+    assertQuery("john", user1);
+    assertQuery("Doe", user1);
+    assertQuery("doe", user1);
+    assertQuery("DOE", user1);
+    assertQuery("Jo Do", user1);
+    assertQuery("jo do", user1);
+    assertQuery("name:John", user1);
+    assertQuery("name:john", user1);
+    assertQuery("name:Doe", user1);
+    assertQuery("name:doe", user1);
+    assertQuery("name:DOE", user1);
+  }
+
+  @Test
+  public void byCansee() throws Exception {
+    String domain = name("test.com");
+    AccountInfo user1 = newAccountWithEmail("account1", "account1@" + domain);
+    AccountInfo user2 = newAccountWithEmail("account2", "account2@" + domain);
+    AccountInfo user3 = newAccountWithEmail("account3", "account3@" + domain);
+
+    Project.NameKey p = createProject(name("p"));
+    ChangeInfo c = createChange(p);
+    assertQuery("name:" + domain + " cansee:" + c.changeId, user1, user2, user3);
+
+    GroupInfo group = createGroup(name("group"), user1, user2);
+    blockRead(p, group);
+    assertQuery("name:" + domain + " cansee:" + c.changeId, user3);
+  }
+
+  @Test
+  public void byWatchedProject() throws Exception {
+    Project.NameKey p = createProject(name("p"));
+    Project.NameKey p2 = createProject(name("p2"));
+    AccountInfo user1 = newAccountWithFullName("jdoe", "John Doe");
+    AccountInfo user2 = newAccountWithFullName("jroe", "Jane Roe");
+    AccountInfo user3 = newAccountWithFullName("user3", "Mr Selfish");
+
+    assertThat(queryProvider.get().byWatchedProject(p)).isEmpty();
+
+    watch(user1, p, null);
+    assertAccounts(queryProvider.get().byWatchedProject(p), user1);
+
+    watch(user2, p, "keyword");
+    assertAccounts(queryProvider.get().byWatchedProject(p), user1, user2);
+
+    watch(user3, p2, "keyword");
+    watch(user3, allProjects, "keyword");
+    assertAccounts(queryProvider.get().byWatchedProject(p), user1, user2);
+    assertAccounts(queryProvider.get().byWatchedProject(p2), user3);
+    assertAccounts(queryProvider.get().byWatchedProject(allProjects), user3);
+  }
+
+  @Test
+  public void byDeletedAccount() throws Exception {
+    AccountInfo user = newAccountWithFullName("jdoe", "John Doe");
+    Account.Id userId = Account.Id.tryParse(user._accountId.toString()).get();
+    assertQuery("John", user);
+
+    for (AccountIndex index : indexes.getWriteIndexes()) {
+      index.delete(userId);
+    }
+    assertQuery("John");
+  }
+
+  @Test
+  public void withLimit() throws Exception {
+    String domain = name("test.com");
+    AccountInfo user1 = newAccountWithEmail("user1", "user1@" + domain);
+    AccountInfo user2 = newAccountWithEmail("user2", "user2@" + domain);
+    AccountInfo user3 = newAccountWithEmail("user3", "user3@" + domain);
+
+    List<AccountInfo> result = assertQuery(domain, user1, user2, user3);
+    assertThat(Iterables.getLast(result)._moreAccounts).isNull();
+
+    result = assertQuery(newQuery(domain).withLimit(2), result.subList(0, 2));
+    assertThat(Iterables.getLast(result)._moreAccounts).isTrue();
+  }
+
+  @Test
+  public void withStart() throws Exception {
+    String domain = name("test.com");
+    AccountInfo user1 = newAccountWithEmail("user1", "user1@" + domain);
+    AccountInfo user2 = newAccountWithEmail("user2", "user2@" + domain);
+    AccountInfo user3 = newAccountWithEmail("user3", "user3@" + domain);
+
+    List<AccountInfo> result = assertQuery(domain, user1, user2, user3);
+    assertQuery(newQuery(domain).withStart(1), result.subList(1, 3));
+  }
+
+  @Test
+  public void sortedByFullname() throws Exception {
+    String appendix = name("name");
+
+    // Use an account creation order that ensures that sorting by fullname differs from sorting by
+    // account ID.
+    AccountInfo userFoo = newAccountWithFullName("user1", "foo-" + appendix);
+    AccountInfo userBar = newAccountWithFullName("user2", "bar-" + appendix);
+    AccountInfo userBaz = newAccountWithFullName("user3", "baz-" + appendix);
+    assertThat(userFoo._accountId).isLessThan(userBar._accountId);
+    assertThat(userBar._accountId).isLessThan(userBaz._accountId);
+
+    String query = "name:" + userFoo.name + " OR name:" + userBar.name + " OR name:" + userBaz.name;
+    // Must request details to populate fullname in the results. If fullname is not set sorting by
+    // fullname is not possible.
+    assertQuery(newQuery(query).withOption(ListAccountsOption.DETAILS), userBar, userBaz, userFoo);
+  }
+
+  @Test
+  public void sortedByPreferredEmail() throws Exception {
+    String appendix = name("name");
+
+    // Use an account creation order that ensures that sorting by preferred email differs from
+    // sorting by account ID. Use the same fullname for all accounts so that sorting must be done by
+    // preferred email.
+    AccountInfo userFoo3 =
+        newAccount("user3", "foo-" + appendix, "foo3-" + appendix + "@test.com", true);
+    AccountInfo userFoo1 =
+        newAccount("user1", "foo-" + appendix, "foo1-" + appendix + "@test.com", true);
+    AccountInfo userFoo2 =
+        newAccount("user2", "foo-" + appendix, "foo2-" + appendix + "@test.com", true);
+    assertThat(userFoo3._accountId).isLessThan(userFoo1._accountId);
+    assertThat(userFoo1._accountId).isLessThan(userFoo2._accountId);
+
+    String query =
+        "name:" + userFoo1.name + " OR name:" + userFoo2.name + " OR name:" + userFoo3.name;
+    // Must request details to populate fullname and preferred email in the results. If fullname and
+    // preferred email are not set sorting by fullname and preferred email is not possible. Since
+    // all 3 accounts have the same fullname we expect sorting by preferred email.
+    assertQuery(
+        newQuery(query).withOption(ListAccountsOption.DETAILS), userFoo1, userFoo2, userFoo3);
+  }
+
+  @Test
+  public void sortedById() throws Exception {
+    String appendix = name("name");
+
+    // Each new account gets a higher account ID. Create the accounts in an order that sorting by
+    // fullname differs from sorting by accout ID.
+    AccountInfo userFoo = newAccountWithFullName("user1", "foo-" + appendix);
+    AccountInfo userBar = newAccountWithFullName("user2", "bar-" + appendix);
+    AccountInfo userBaz = newAccountWithFullName("user3", "baz-" + appendix);
+    assertThat(userFoo._accountId).isLessThan(userBar._accountId);
+    assertThat(userBar._accountId).isLessThan(userBaz._accountId);
+
+    String query = "name:" + userFoo.name + " OR name:" + userBar.name + " OR name:" + userBaz.name;
+    // Normally sorting is done by fullname and preferred email, but if no details are requested
+    // fullname and preferred email are not set and then sorting is done by account ID.
+    assertQuery(newQuery(query), userFoo, userBar, userBaz);
+  }
+
+  @Test
+  public void withDetails() throws Exception {
+    AccountInfo user1 = newAccount("myuser", "My User", "my.user@example.com", true);
+
+    List<AccountInfo> result = assertQuery(user1.username, user1);
+    AccountInfo ai = result.get(0);
+    assertThat(ai._accountId).isEqualTo(user1._accountId);
+    assertThat(ai.name).isNull();
+    assertThat(ai.username).isNull();
+    assertThat(ai.email).isNull();
+    assertThat(ai.avatars).isNull();
+
+    result = assertQuery(newQuery(user1.username).withOption(ListAccountsOption.DETAILS), user1);
+    ai = result.get(0);
+    assertThat(ai._accountId).isEqualTo(user1._accountId);
+    assertThat(ai.name).isEqualTo(user1.name);
+    assertThat(ai.username).isEqualTo(user1.username);
+    assertThat(ai.email).isEqualTo(user1.email);
+    assertThat(ai.avatars).isNull();
+  }
+
+  @Test
+  public void withSecondaryEmails() throws Exception {
+    AccountInfo user1 = newAccount("myuser", "My User", "my.user@example.com", true);
+    String[] secondaryEmails = new String[] {"bar@example.com", "foo@example.com"};
+    addEmails(user1, secondaryEmails);
+
+    List<AccountInfo> result = assertQuery(user1.username, user1);
+    assertThat(result.get(0).secondaryEmails).isNull();
+
+    result = assertQuery(newQuery(user1.username).withSuggest(true), user1);
+    assertThat(result.get(0).secondaryEmails)
+        .containsExactlyElementsIn(Arrays.asList(secondaryEmails))
+        .inOrder();
+
+    result = assertQuery(newQuery(user1.username).withOption(ListAccountsOption.DETAILS), user1);
+    assertThat(result.get(0).secondaryEmails).isNull();
+
+    result = assertQuery(newQuery(user1.username).withOption(ListAccountsOption.ALL_EMAILS), user1);
+    assertThat(result.get(0).secondaryEmails)
+        .containsExactlyElementsIn(Arrays.asList(secondaryEmails))
+        .inOrder();
+
+    result =
+        assertQuery(
+            newQuery(user1.username)
+                .withOptions(ListAccountsOption.DETAILS, ListAccountsOption.ALL_EMAILS),
+            user1);
+    assertThat(result.get(0).secondaryEmails)
+        .containsExactlyElementsIn(Arrays.asList(secondaryEmails))
+        .inOrder();
+  }
+
+  @Test
+  public void withSecondaryEmailsWithoutModifyAccountCapability() throws Exception {
+    AccountInfo user = newAccount("myuser", "My User", "other@example.com", true);
+
+    AccountInfo otherUser = newAccount("otheruser", "Other User", "abc@example.com", true);
+    String[] secondaryEmails = new String[] {"dfg@example.com", "hij@example.com"};
+    addEmails(otherUser, secondaryEmails);
+
+    requestContext.setContext(newRequestContext(new Account.Id(user._accountId)));
+
+    List<AccountInfo> result = newQuery(otherUser.username).withSuggest(true).get();
+    assertThat(result.get(0).secondaryEmails).isNull();
+
+    exception.expect(AuthException.class);
+    newQuery(otherUser.username).withOption(ListAccountsOption.ALL_EMAILS).get();
+  }
+
+  @Test
+  public void asAnonymous() throws Exception {
+    AccountInfo user1 = newAccount("user1");
+
+    setAnonymous();
+    assertQuery("9999999");
+    assertQuery("self");
+    assertQuery("username:" + user1.username, user1);
+  }
+
+  // reindex permissions are tested by {@link AccountIT#reindexPermissions}
+  @Test
+  public void reindex() throws Exception {
+    AccountInfo user1 = newAccountWithFullName("tester", "Test Usre");
+
+    // update account without reindex so that account index is stale
+    Account.Id accountId = new Account.Id(user1._accountId);
+    String newName = "Test User";
+    try (Repository repo = repoManager.openRepository(allUsers)) {
+      MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsers, repo);
+      PersonIdent ident = serverIdent.get();
+      md.getCommitBuilder().setAuthor(ident);
+      md.getCommitBuilder().setCommitter(ident);
+      new AccountConfig(accountId, allUsers, repo)
+          .load()
+          .setAccountUpdate(InternalAccountUpdate.builder().setFullName(newName).build())
+          .commit(md);
+    }
+
+    assertQuery("name:" + quote(user1.name), user1);
+    assertQuery("name:" + quote(newName));
+
+    gApi.accounts().id(user1.username).index();
+    assertQuery("name:" + quote(user1.name));
+    assertQuery("name:" + quote(newName), user1);
+  }
+
+  @Test
+  public void rawDocument() throws Exception {
+    AccountInfo userInfo = gApi.accounts().id(admin.getAccountId().get()).get();
+
+    Optional<FieldBundle> rawFields =
+        indexes
+            .getSearchIndex()
+            .getRaw(
+                new Account.Id(userInfo._accountId),
+                QueryOptions.create(
+                    IndexConfig.createDefault(),
+                    0,
+                    1,
+                    indexes.getSearchIndex().getSchema().getStoredFields().keySet()));
+
+    assertThat(rawFields).isPresent();
+    assertThat(rawFields.get().getValue(AccountField.ID)).isEqualTo(userInfo._accountId);
+
+    // The field EXTERNAL_ID_STATE is only supported from schema version 6.
+    if (getSchemaVersion() < 6) {
+      return;
+    }
+
+    List<AccountExternalIdInfo> externalIdInfos = gApi.accounts().self().getExternalIds();
+    List<ByteArrayWrapper> blobs = new ArrayList<>();
+    for (AccountExternalIdInfo info : externalIdInfos) {
+      Optional<ExternalId> extId = externalIds.get(ExternalId.Key.parse(info.identity));
+      assertThat(extId).isPresent();
+      blobs.add(new ByteArrayWrapper(extId.get().toByteArray()));
+    }
+    assertThat(rawFields.get().getValue(AccountField.EXTERNAL_ID_STATE)).hasSize(blobs.size());
+    assertThat(
+            Streams.stream(rawFields.get().getValue(AccountField.EXTERNAL_ID_STATE))
+                .map(ByteArrayWrapper::new)
+                .collect(toList()))
+        .containsExactlyElementsIn(blobs);
+  }
+
+  protected AccountInfo newAccount(String username) throws Exception {
+    return newAccountWithEmail(username, null);
+  }
+
+  protected AccountInfo newAccountWithEmail(String username, String email) throws Exception {
+    return newAccount(username, email, true);
+  }
+
+  protected AccountInfo newAccountWithFullName(String username, String fullName) throws Exception {
+    return newAccount(username, fullName, null, true);
+  }
+
+  protected AccountInfo newAccount(String username, String email, boolean active) throws Exception {
+    return newAccount(username, null, email, active);
+  }
+
+  protected AccountInfo newAccount(String username, String fullName, String email, boolean active)
+      throws Exception {
+    String uniqueName = name(username);
+
+    try {
+      gApi.accounts().id(uniqueName).get();
+      fail("user " + uniqueName + " already exists");
+    } catch (ResourceNotFoundException e) {
+      // expected: user does not exist yet
+    }
+
+    Account.Id id = createAccount(uniqueName, fullName, email, active);
+    return gApi.accounts().id(id.get()).get();
+  }
+
+  protected Project.NameKey createProject(String name) throws RestApiException {
+    ProjectInput in = new ProjectInput();
+    in.name = name;
+    in.createEmptyCommit = true;
+    gApi.projects().create(in);
+    return new Project.NameKey(name);
+  }
+
+  protected void blockRead(Project.NameKey project, GroupInfo group) throws RestApiException {
+    ProjectAccessInput in = new ProjectAccessInput();
+    in.add = new HashMap<>();
+
+    AccessSectionInfo a = new AccessSectionInfo();
+    PermissionInfo p = new PermissionInfo(null, null);
+    p.rules =
+        ImmutableMap.of(group.id, new PermissionRuleInfo(PermissionRuleInfo.Action.BLOCK, false));
+    a.permissions = ImmutableMap.of("read", p);
+    in.add = ImmutableMap.of("refs/*", a);
+
+    gApi.projects().name(project.get()).access(in);
+  }
+
+  protected ChangeInfo createChange(Project.NameKey project) throws RestApiException {
+    ChangeInput in = new ChangeInput();
+    in.subject = "A change";
+    in.project = project.get();
+    in.branch = "master";
+    return gApi.changes().create(in).get();
+  }
+
+  protected GroupInfo createGroup(String name, AccountInfo... members) throws RestApiException {
+    GroupInput in = new GroupInput();
+    in.name = name;
+    in.members =
+        Arrays.asList(members).stream().map(a -> String.valueOf(a._accountId)).collect(toList());
+    return gApi.groups().create(in).get();
+  }
+
+  protected void watch(AccountInfo account, Project.NameKey project, String filter)
+      throws RestApiException {
+    List<ProjectWatchInfo> projectsToWatch = new ArrayList<>();
+    ProjectWatchInfo pwi = new ProjectWatchInfo();
+    pwi.project = project.get();
+    pwi.filter = filter;
+    pwi.notifyAbandonedChanges = true;
+    pwi.notifyNewChanges = true;
+    pwi.notifyAllComments = true;
+    projectsToWatch.add(pwi);
+    gApi.accounts().id(account._accountId).setWatchedProjects(projectsToWatch);
+  }
+
+  protected String quote(String s) {
+    return "\"" + s + "\"";
+  }
+
+  protected String name(String name) {
+    if (name == null) {
+      return null;
+    }
+
+    String suffix = getSanitizedMethodName();
+    if (name.contains("@")) {
+      return name + "." + suffix;
+    }
+    return name + "_" + suffix;
+  }
+
+  private Account.Id createAccount(String username, String fullName, String email, boolean active)
+      throws Exception {
+    try (ManualRequestContext ctx = oneOffRequestContext.open()) {
+      Account.Id id = accountManager.authenticate(AuthRequest.forUser(username)).getAccountId();
+      if (email != null) {
+        accountManager.link(id, AuthRequest.forEmail(email));
+      }
+      accountsUpdate
+          .get()
+          .update(
+              "Update Test Account",
+              id,
+              u -> {
+                u.setFullName(fullName).setPreferredEmail(email).setActive(active);
+              });
+      return id;
+    }
+  }
+
+  private void addEmails(AccountInfo account, String... emails) throws Exception {
+    Account.Id id = new Account.Id(account._accountId);
+    for (String email : emails) {
+      accountManager.link(id, AuthRequest.forEmail(email));
+    }
+    accountCache.evict(id);
+    accountIndexer.index(id);
+  }
+
+  protected QueryRequest newQuery(Object query) throws RestApiException {
+    return gApi.accounts().query(query.toString());
+  }
+
+  protected List<AccountInfo> assertQuery(Object query, AccountInfo... accounts) throws Exception {
+    return assertQuery(newQuery(query), accounts);
+  }
+
+  protected List<AccountInfo> assertQuery(QueryRequest query, AccountInfo... accounts)
+      throws Exception {
+    return assertQuery(query, Arrays.asList(accounts));
+  }
+
+  protected List<AccountInfo> assertQuery(QueryRequest query, List<AccountInfo> accounts)
+      throws Exception {
+    List<AccountInfo> result = query.get();
+    Iterable<Integer> ids = ids(result);
+    assertThat(ids)
+        .named(format(query, result, accounts))
+        .containsExactlyElementsIn(ids(accounts))
+        .inOrder();
+    return result;
+  }
+
+  protected void assertAccounts(List<AccountState> accounts, AccountInfo... expectedAccounts) {
+    assertThat(accounts.stream().map(a -> a.getAccount().getId().get()).collect(toList()))
+        .containsExactlyElementsIn(
+            Arrays.asList(expectedAccounts).stream().map(a -> a._accountId).collect(toList()));
+  }
+
+  private String format(
+      QueryRequest query, List<AccountInfo> actualIds, List<AccountInfo> expectedAccounts) {
+    StringBuilder b = new StringBuilder();
+    b.append("query '").append(query.getQuery()).append("' with expected accounts ");
+    b.append(format(expectedAccounts));
+    b.append(" and result ");
+    b.append(format(actualIds));
+    return b.toString();
+  }
+
+  private String format(Iterable<AccountInfo> accounts) {
+    StringBuilder b = new StringBuilder();
+    b.append("[");
+    Iterator<AccountInfo> it = accounts.iterator();
+    while (it.hasNext()) {
+      AccountInfo a = it.next();
+      b.append("{")
+          .append(a._accountId)
+          .append(", ")
+          .append("name=")
+          .append(a.name)
+          .append(", ")
+          .append("email=")
+          .append(a.email)
+          .append(", ")
+          .append("username=")
+          .append(a.username)
+          .append("}");
+      if (it.hasNext()) {
+        b.append(", ");
+      }
+    }
+    b.append("]");
+    return b.toString();
+  }
+
+  protected static Iterable<Integer> ids(AccountInfo... accounts) {
+    return ids(Arrays.asList(accounts));
+  }
+
+  protected static Iterable<Integer> ids(List<AccountInfo> accounts) {
+    return accounts.stream().map(a -> a._accountId).collect(toList());
+  }
+
+  protected void assertMissingField(FieldDef<AccountState, ?> field) {
+    assertThat(getSchema().hasField(field))
+        .named("schema %s has field %s", getSchemaVersion(), field.getName())
+        .isFalse();
+  }
+
+  protected void assertFailingQuery(String query, String expectedMessage) throws Exception {
+    try {
+      assertQuery(query);
+      fail("expected BadRequestException for query '" + query + "'");
+    } catch (BadRequestException e) {
+      assertThat(e.getMessage()).isEqualTo(expectedMessage);
+    }
+  }
+
+  protected int getSchemaVersion() {
+    return getSchema().getVersion();
+  }
+
+  protected Schema<AccountState> getSchema() {
+    return indexes.getSearchIndex().getSchema();
+  }
+
+  /** Boiler plate code to check two byte arrays for equality */
+  private static class ByteArrayWrapper {
+    private byte[] arr;
+
+    private ByteArrayWrapper(byte[] arr) {
+      this.arr = arr;
+    }
+
+    @Override
+    public boolean equals(Object other) {
+      if (!(other instanceof ByteArrayWrapper)) {
+        return false;
+      }
+      return Arrays.equals(arr, ((ByteArrayWrapper) other).arr);
+    }
+
+    @Override
+    public int hashCode() {
+      return Arrays.hashCode(arr);
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/server/query/account/BUILD b/javatests/com/google/gerrit/server/query/account/BUILD
new file mode 100644
index 0000000..e41d390
--- /dev/null
+++ b/javatests/com/google/gerrit/server/query/account/BUILD
@@ -0,0 +1,42 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+ABSTRACT_QUERY_TEST = ["AbstractQueryAccountsTest.java"]
+
+java_library(
+    name = "abstract_query_tests",
+    testonly = True,
+    srcs = ABSTRACT_QUERY_TEST,
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/index",
+        "//java/com/google/gerrit/lifecycle",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/server/schema",
+        "//java/com/google/gerrit/testing:gerrit-test-util",
+        "//lib:guava",
+        "//lib/guice",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/truth",
+        "//lib/truth:truth-java8-extension",
+        "//prolog:gerrit-prolog-common",
+    ],
+)
+
+junit_tests(
+    name = "lucene_query_test",
+    size = "large",
+    srcs = glob(
+        ["*.java"],
+        exclude = ABSTRACT_QUERY_TEST,
+    ),
+    visibility = ["//visibility:public"],
+    deps = [
+        ":abstract_query_tests",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/testing:gerrit-test-util",
+        "//lib/guice",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+    ],
+)
diff --git a/javatests/com/google/gerrit/server/query/account/LuceneQueryAccountsTest.java b/javatests/com/google/gerrit/server/query/account/LuceneQueryAccountsTest.java
new file mode 100644
index 0000000..660c1d8
--- /dev/null
+++ b/javatests/com/google/gerrit/server/query/account/LuceneQueryAccountsTest.java
@@ -0,0 +1,49 @@
+// 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.
+
+package com.google.gerrit.server.query.account;
+
+import com.google.gerrit.server.index.account.AccountSchemaDefinitions;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.gerrit.testing.InMemoryModule;
+import com.google.gerrit.testing.IndexConfig;
+import com.google.gerrit.testing.IndexVersions;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.jgit.lib.Config;
+
+public class LuceneQueryAccountsTest extends AbstractQueryAccountsTest {
+  @ConfigSuite.Default
+  public static Config defaultConfig() {
+    return IndexConfig.createForLucene();
+  }
+
+  @ConfigSuite.Configs
+  public static Map<String, Config> againstPreviousIndexVersion() {
+    // the current schema version is already tested by the inherited default config suite
+    List<Integer> schemaVersions =
+        IndexVersions.getWithoutLatest(AccountSchemaDefinitions.INSTANCE);
+    return IndexVersions.asConfigMap(
+        AccountSchemaDefinitions.INSTANCE, schemaVersions, "againstIndexVersion", defaultConfig());
+  }
+
+  @Override
+  protected Injector createInjector() {
+    Config luceneConfig = new Config(config);
+    InMemoryModule.setDefaults(luceneConfig);
+    return Guice.createInjector(new InMemoryModule(luceneConfig, notesMigration));
+  }
+}
diff --git a/javatests/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java b/javatests/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java
new file mode 100644
index 0000000..c01bf04
--- /dev/null
+++ b/javatests/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java
@@ -0,0 +1,3397 @@
+// Copyright (C) 2013 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.google.gerrit.server.query.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static com.google.gerrit.extensions.client.ListChangesOption.DETAILED_LABELS;
+import static com.google.gerrit.extensions.client.ListChangesOption.REVIEWED;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+import static com.google.gerrit.server.project.testing.Util.allow;
+import static com.google.gerrit.server.project.testing.Util.category;
+import static com.google.gerrit.server.project.testing.Util.value;
+import static com.google.gerrit.server.project.testing.Util.verified;
+import static java.util.concurrent.TimeUnit.HOURS;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.MINUTES;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static java.util.stream.Collectors.toList;
+import static org.junit.Assert.fail;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Streams;
+import com.google.common.truth.ThrowableSubject;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.GerritApi;
+import com.google.gerrit.extensions.api.changes.AddReviewerInput;
+import com.google.gerrit.extensions.api.changes.AssigneeInput;
+import com.google.gerrit.extensions.api.changes.ChangeApi;
+import com.google.gerrit.extensions.api.changes.Changes.QueryRequest;
+import com.google.gerrit.extensions.api.changes.DraftInput;
+import com.google.gerrit.extensions.api.changes.HashtagsInput;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput.DraftHandling;
+import com.google.gerrit.extensions.api.changes.ReviewInput.RobotCommentInput;
+import com.google.gerrit.extensions.api.changes.StarsInput;
+import com.google.gerrit.extensions.api.groups.GroupInput;
+import com.google.gerrit.extensions.api.projects.ConfigInput;
+import com.google.gerrit.extensions.api.projects.ProjectInput;
+import com.google.gerrit.extensions.client.InheritableBoolean;
+import com.google.gerrit.extensions.client.ProjectWatchInfo;
+import com.google.gerrit.extensions.client.ReviewerState;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.ChangeInput;
+import com.google.gerrit.extensions.common.ChangeMessageInfo;
+import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.index.FieldDef;
+import com.google.gerrit.index.IndexConfig;
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.lifecycle.LifecycleManager;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Account.Id;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.reviewdb.server.ReviewDbUtil;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.PatchSetUtil;
+import com.google.gerrit.server.Sequences;
+import com.google.gerrit.server.ServerInitiated;
+import com.google.gerrit.server.StarredChangesUtil;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountManager;
+import com.google.gerrit.server.account.Accounts;
+import com.google.gerrit.server.account.AccountsUpdate;
+import com.google.gerrit.server.account.AuthRequest;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.change.ChangeInserter;
+import com.google.gerrit.server.change.ChangeTriplet;
+import com.google.gerrit.server.change.PatchSetInserter;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.index.change.ChangeField;
+import com.google.gerrit.server.index.change.ChangeIndexCollection;
+import com.google.gerrit.server.index.change.ChangeIndexer;
+import com.google.gerrit.server.index.change.IndexedChangeQuery;
+import com.google.gerrit.server.index.change.StalenessChecker;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.notedb.NoteDbChangeState;
+import com.google.gerrit.server.notedb.NoteDbChangeState.PrimaryStorage;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.server.schema.SchemaCreator;
+import com.google.gerrit.server.update.BatchUpdate;
+import com.google.gerrit.server.util.ManualRequestContext;
+import com.google.gerrit.server.util.OneOffRequestContext;
+import com.google.gerrit.server.util.RequestContext;
+import com.google.gerrit.server.util.ThreadLocalRequestContext;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.testing.DisabledReviewDb;
+import com.google.gerrit.testing.GerritServerTests;
+import com.google.gerrit.testing.InMemoryDatabase;
+import com.google.gerrit.testing.InMemoryRepositoryManager;
+import com.google.gerrit.testing.InMemoryRepositoryManager.Repo;
+import com.google.gerrit.testing.TestTimeUtil;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Provider;
+import com.google.inject.util.Providers;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.util.SystemReader;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+
+@Ignore
+public abstract class AbstractQueryChangesTest extends GerritServerTests {
+  @Inject protected Accounts accounts;
+  @Inject protected AccountCache accountCache;
+  @Inject @ServerInitiated protected Provider<AccountsUpdate> accountsUpdate;
+  @Inject protected AccountManager accountManager;
+  @Inject protected AllUsersName allUsersName;
+  @Inject protected BatchUpdate.Factory updateFactory;
+  @Inject protected ChangeInserter.Factory changeFactory;
+  @Inject protected ChangeQueryBuilder queryBuilder;
+  @Inject protected GerritApi gApi;
+  @Inject protected IdentifiedUser.GenericFactory userFactory;
+  @Inject protected ChangeIndexCollection indexes;
+  @Inject protected ChangeIndexer indexer;
+  @Inject protected IndexConfig indexConfig;
+  @Inject protected InMemoryRepositoryManager repoManager;
+  @Inject protected Provider<InternalChangeQuery> queryProvider;
+  @Inject protected ChangeNotes.Factory notesFactory;
+  @Inject protected OneOffRequestContext oneOffRequestContext;
+  @Inject protected PatchSetInserter.Factory patchSetFactory;
+  @Inject protected PatchSetUtil psUtil;
+  @Inject protected ChangeNotes.Factory changeNotesFactory;
+  @Inject protected Provider<ChangeQueryProcessor> queryProcessorProvider;
+  @Inject protected SchemaCreator schemaCreator;
+  @Inject protected SchemaFactory<ReviewDb> schemaFactory;
+  @Inject protected Sequences seq;
+  @Inject protected ThreadLocalRequestContext requestContext;
+  @Inject protected ProjectCache projectCache;
+  @Inject protected MetaDataUpdate.Server metaDataUpdateFactory;
+  @Inject protected IdentifiedUser.GenericFactory identifiedUserFactory;
+
+  // Only for use in setting up/tearing down injector; other users should use schemaFactory.
+  @Inject private InMemoryDatabase inMemoryDatabase;
+
+  protected Injector injector;
+  protected LifecycleManager lifecycle;
+  protected ReviewDb db;
+  protected Account.Id userId;
+  protected CurrentUser user;
+
+  private String systemTimeZone;
+
+  // These queries must be kept in sync with PolyGerrit:
+  // polygerrit-ui/app/elements/change-list/gr-dashboard-view/gr-dashboard-view.js
+
+  protected static final String DASHBOARD_HAS_UNPUBLISHED_DRAFTS_QUERY = "has:draft";
+  protected static final String DASHBOARD_ASSIGNED_QUERY =
+      "assignee:${user} (-is:wip OR " + "owner:self OR assignee:self) is:open -is:ignored";
+  protected static final String DASHBOARD_WORK_IN_PROGRESS_QUERY = "is:open owner:${user} is:wip";
+  protected static final String DASHBOARD_OUTGOING_QUERY =
+      "is:open owner:${user} -is:wip -is:ignored";
+  protected static final String DASHBOARD_INCOMING_QUERY =
+      "is:open -owner:${user} -is:wip -is:ignored (reviewer:${user} OR assignee:${user})";
+  protected static final String DASHBOARD_RECENTLY_CLOSED_QUERY =
+      "is:closed -is:ignored (-is:wip OR owner:self) "
+          + "(owner:${user} OR reviewer:${user} OR assignee:${user} "
+          + "OR cc:${user})";
+
+  protected abstract Injector createInjector();
+
+  @Before
+  public void setUpInjector() throws Exception {
+    lifecycle = new LifecycleManager();
+    injector = createInjector();
+    lifecycle.add(injector);
+    injector.injectMembers(this);
+    lifecycle.start();
+    initAfterLifecycleStart();
+    setUpDatabase();
+  }
+
+  @After
+  public void cleanUp() {
+    lifecycle.stop();
+    db.close();
+  }
+
+  protected void initAfterLifecycleStart() throws Exception {}
+
+  protected void setUpDatabase() throws Exception {
+    try (ReviewDb underlyingDb = inMemoryDatabase.getDatabase().open()) {
+      schemaCreator.create(underlyingDb);
+    }
+    db = schemaFactory.open();
+
+    userId = accountManager.authenticate(AuthRequest.forUser("user")).getAccountId();
+    String email = "user@example.com";
+    accountsUpdate
+        .get()
+        .update(
+            "Add Email",
+            userId,
+            u -> u.addExternalId(ExternalId.createEmail(userId, email)).setPreferredEmail(email));
+    resetUser();
+  }
+
+  protected RequestContext newRequestContext(Account.Id requestUserId) {
+    final CurrentUser requestUser = userFactory.create(requestUserId);
+    return new RequestContext() {
+      @Override
+      public CurrentUser getUser() {
+        return requestUser;
+      }
+
+      @Override
+      public Provider<ReviewDb> getReviewDbProvider() {
+        return Providers.of(db);
+      }
+    };
+  }
+
+  protected void resetUser() {
+    user = userFactory.create(userId);
+    requestContext.setContext(newRequestContext(userId));
+  }
+
+  @After
+  public void tearDownInjector() {
+    if (lifecycle != null) {
+      lifecycle.stop();
+    }
+    requestContext.setContext(null);
+    if (db != null) {
+      db.close();
+    }
+    InMemoryDatabase.drop(inMemoryDatabase);
+  }
+
+  @Before
+  public void setTimeForTesting() {
+    resetTimeWithClockStep(1, SECONDS);
+  }
+
+  private void resetTimeWithClockStep(long clockStep, TimeUnit clockStepUnit) {
+    systemTimeZone = System.setProperty("user.timezone", "US/Eastern");
+    // TODO(dborowitz): Figure out why tests fail when stubbing out
+    // SystemReader.
+    TestTimeUtil.resetWithClockStep(clockStep, clockStepUnit);
+    SystemReader.setInstance(null);
+  }
+
+  @After
+  public void resetTime() {
+    TestTimeUtil.useSystemTime();
+    System.setProperty("user.timezone", systemTimeZone);
+  }
+
+  @Test
+  public void byId() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    Change change1 = insert(repo, newChange(repo));
+    Change change2 = insert(repo, newChange(repo));
+
+    assertQuery("12345");
+    assertQuery(change1.getId().get(), change1);
+    assertQuery(change2.getId().get(), change2);
+  }
+
+  @Test
+  public void byKey() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    Change change = insert(repo, newChange(repo));
+    String key = change.getKey().get();
+
+    assertQuery("I0000000000000000000000000000000000000000");
+    for (int i = 0; i <= 36; i++) {
+      String q = key.substring(0, 41 - i);
+      assertQuery(q, change);
+    }
+  }
+
+  @Test
+  public void byTriplet() throws Exception {
+    TestRepository<Repo> repo = createProject("iabcde");
+    Change change = insert(repo, newChangeForBranch(repo, "branch"));
+    String k = change.getKey().get();
+
+    assertQuery("iabcde~branch~" + k, change);
+    assertQuery("change:iabcde~branch~" + k, change);
+    assertQuery("iabcde~refs/heads/branch~" + k, change);
+    assertQuery("change:iabcde~refs/heads/branch~" + k, change);
+    assertQuery("iabcde~branch~" + k.substring(0, 10), change);
+    assertQuery("change:iabcde~branch~" + k.substring(0, 10), change);
+
+    assertQuery("foo~bar");
+    assertThatQueryException("change:foo~bar").hasMessageThat().isEqualTo("Invalid change format");
+    assertQuery("otherrepo~branch~" + k);
+    assertQuery("change:otherrepo~branch~" + k);
+    assertQuery("iabcde~otherbranch~" + k);
+    assertQuery("change:iabcde~otherbranch~" + k);
+    assertQuery("iabcde~branch~I0000000000000000000000000000000000000000");
+    assertQuery("change:iabcde~branch~I0000000000000000000000000000000000000000");
+  }
+
+  @Test
+  public void byStatus() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    ChangeInserter ins1 = newChangeWithStatus(repo, Change.Status.NEW);
+    Change change1 = insert(repo, ins1);
+    ChangeInserter ins2 = newChangeWithStatus(repo, Change.Status.MERGED);
+    Change change2 = insert(repo, ins2);
+
+    assertQuery("status:new", change1);
+    assertQuery("status:NEW", change1);
+    assertQuery("is:new", change1);
+    assertQuery("status:merged", change2);
+    assertQuery("is:merged", change2);
+    assertQuery("status:draft");
+    assertQuery("is:draft");
+  }
+
+  @Test
+  public void byStatusOpen() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    ChangeInserter ins1 = newChangeWithStatus(repo, Change.Status.NEW);
+    Change change1 = insert(repo, ins1);
+    insert(repo, newChangeWithStatus(repo, Change.Status.MERGED));
+
+    Change[] expected = new Change[] {change1};
+    assertQuery("status:open", expected);
+    assertQuery("status:OPEN", expected);
+    assertQuery("status:o", expected);
+    assertQuery("status:op", expected);
+    assertQuery("status:ope", expected);
+    assertQuery("status:pending", expected);
+    assertQuery("status:PENDING", expected);
+    assertQuery("status:p", expected);
+    assertQuery("status:pe", expected);
+    assertQuery("status:pen", expected);
+    assertQuery("is:open", expected);
+    assertQuery("is:pending", expected);
+  }
+
+  @Test
+  public void byStatusClosed() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    ChangeInserter ins1 = newChangeWithStatus(repo, Change.Status.MERGED);
+    Change change1 = insert(repo, ins1);
+    ChangeInserter ins2 = newChangeWithStatus(repo, Change.Status.ABANDONED);
+    Change change2 = insert(repo, ins2);
+    insert(repo, newChangeWithStatus(repo, Change.Status.NEW));
+
+    Change[] expected = new Change[] {change2, change1};
+    assertQuery("status:closed", expected);
+    assertQuery("status:CLOSED", expected);
+    assertQuery("status:c", expected);
+    assertQuery("status:cl", expected);
+    assertQuery("status:clo", expected);
+    assertQuery("status:clos", expected);
+    assertQuery("status:close", expected);
+    assertQuery("status:closed", expected);
+    assertQuery("is:closed", expected);
+  }
+
+  @Test
+  public void byStatusAbandoned() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    ChangeInserter ins1 = newChangeWithStatus(repo, Change.Status.MERGED);
+    insert(repo, ins1);
+    ChangeInserter ins2 = newChangeWithStatus(repo, Change.Status.ABANDONED);
+    Change change1 = insert(repo, ins2);
+    insert(repo, newChangeWithStatus(repo, Change.Status.NEW));
+
+    assertQuery("status:abandoned", change1);
+    assertQuery("status:ABANDONED", change1);
+    assertQuery("is:abandoned", change1);
+  }
+
+  @Test
+  public void byStatusPrefix() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    ChangeInserter ins1 = newChangeWithStatus(repo, Change.Status.NEW);
+    Change change1 = insert(repo, ins1);
+    insert(repo, newChangeWithStatus(repo, Change.Status.MERGED));
+
+    assertQuery("status:n", change1);
+    assertQuery("status:ne", change1);
+    assertQuery("status:new", change1);
+    assertQuery("status:N", change1);
+    assertQuery("status:nE", change1);
+    assertQuery("status:neW", change1);
+    assertQuery("status:nx");
+    assertQuery("status:newx");
+  }
+
+  @Test
+  public void byPrivate() throws Exception {
+    if (getSchemaVersion() < 40) {
+      assertMissingField(ChangeField.PRIVATE);
+      assertFailingQuery(
+          "is:private", "'is:private' operator is not supported by change index version");
+      return;
+    }
+
+    TestRepository<Repo> repo = createProject("repo");
+    Change change1 = insert(repo, newChange(repo), userId);
+    Account.Id user2 =
+        accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId();
+    Change change2 = insert(repo, newChange(repo), user2);
+
+    // No private changes.
+    assertQuery("is:open", change2, change1);
+    assertQuery("is:private");
+
+    gApi.changes().id(change1.getChangeId()).setPrivate(true, null);
+
+    // Change1 is not private, but should be still visible to its owner.
+    assertQuery("is:open", change1, change2);
+    assertQuery("is:private", change1);
+
+    // Switch request context to user2.
+    requestContext.setContext(newRequestContext(user2));
+    assertQuery("is:open", change2);
+    assertQuery("is:private");
+  }
+
+  @Test
+  public void byWip() throws Exception {
+    if (getSchemaVersion() < 42) {
+      assertMissingField(ChangeField.WIP);
+      assertFailingQuery("is:wip", "'is:wip' operator is not supported by change index version");
+      return;
+    }
+
+    TestRepository<Repo> repo = createProject("repo");
+    Change change1 = insert(repo, newChange(repo), userId);
+
+    assertQuery("is:open", change1);
+    assertQuery("is:wip");
+
+    gApi.changes().id(change1.getChangeId()).setWorkInProgress();
+
+    assertQuery("is:wip", change1);
+
+    gApi.changes().id(change1.getChangeId()).setReadyForReview();
+
+    assertQuery("is:wip");
+  }
+
+  @Test
+  public void excludeWipChangeFromReviewersDashboardsBeforeSchema42() throws Exception {
+    assume().that(getSchemaVersion()).isLessThan(42);
+
+    assertMissingField(ChangeField.WIP);
+    assertFailingQuery("is:wip", "'is:wip' operator is not supported by change index version");
+
+    Account.Id user1 = createAccount("user1");
+    TestRepository<Repo> repo = createProject("repo");
+    Change change1 = insert(repo, newChangeWorkInProgress(repo), userId);
+    assertQuery("reviewer:" + user1, change1);
+    gApi.changes().id(change1.getChangeId()).setWorkInProgress();
+    assertQuery("reviewer:" + user1, change1);
+  }
+
+  @Test
+  public void excludeWipChangeFromReviewersDashboards() throws Exception {
+    assume().that(getSchemaVersion()).isAtLeast(42);
+
+    Account.Id user1 = createAccount("user1");
+    TestRepository<Repo> repo = createProject("repo");
+    Change change1 = insert(repo, newChangeWorkInProgress(repo), userId);
+
+    assertQuery("is:wip", change1);
+    assertQuery("reviewer:" + user1);
+
+    gApi.changes().id(change1.getChangeId()).setReadyForReview();
+    assertQuery("is:wip");
+    assertQuery("reviewer:" + user1);
+
+    gApi.changes().id(change1.getChangeId()).setWorkInProgress();
+    assertQuery("is:wip", change1);
+    assertQuery("reviewer:" + user1);
+  }
+
+  @Test
+  public void byStartedBeforeSchema44() throws Exception {
+    assume().that(getSchemaVersion()).isLessThan(44);
+    assertMissingField(ChangeField.STARTED);
+    assertFailingQuery(
+        "is:started", "'is:started' operator is not supported by change index version");
+  }
+
+  @Test
+  public void byStarted() throws Exception {
+    assume().that(getSchemaVersion()).isAtLeast(44);
+
+    TestRepository<Repo> repo = createProject("repo");
+    Change change1 = insert(repo, newChangeWorkInProgress(repo));
+
+    assertQuery("is:started");
+
+    gApi.changes().id(change1.getChangeId()).setReadyForReview();
+    assertQuery("is:started", change1);
+
+    gApi.changes().id(change1.getChangeId()).setWorkInProgress();
+    assertQuery("is:started", change1);
+  }
+
+  private void assertReviewers(Collection<AccountInfo> reviewers, Object... expected)
+      throws Exception {
+    if (expected.length == 0) {
+      assertThat(reviewers).isNull();
+      return;
+    }
+
+    // Convert AccountInfos to strings, either account ID or email.
+    List<String> reviewerIds =
+        reviewers.stream()
+            .map(
+                ai -> {
+                  if (ai._accountId != null) {
+                    return ai._accountId.toString();
+                  }
+                  return ai.email;
+                })
+            .collect(toList());
+    assertThat(reviewerIds).containsExactly(expected);
+  }
+
+  @Test
+  public void restorePendingReviewers() throws Exception {
+    assume().that(getSchemaVersion()).isAtLeast(44);
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    Project.NameKey project = new Project.NameKey("repo");
+    TestRepository<Repo> repo = createProject(project.get());
+    ConfigInput conf = new ConfigInput();
+    conf.enableReviewerByEmail = InheritableBoolean.TRUE;
+    gApi.projects().name(project.get()).config(conf);
+    Change change1 = insert(repo, newChangeWorkInProgress(repo));
+    Account.Id user1 = createAccount("user1");
+    Account.Id user2 = createAccount("user2");
+    String email1 = "email1@example.com";
+    String email2 = "email2@example.com";
+
+    ReviewInput in =
+        ReviewInput.noScore()
+            .reviewer(user1.toString())
+            .reviewer(user2.toString(), ReviewerState.CC, false)
+            .reviewer(email1)
+            .reviewer(email2, ReviewerState.CC, false);
+    gApi.changes().id(change1.getId().get()).revision("current").review(in);
+
+    List<ChangeInfo> changeInfos =
+        assertQuery(newQuery("is:wip").withOption(DETAILED_LABELS), change1);
+    assertThat(changeInfos).isNotEmpty();
+
+    Map<ReviewerState, Collection<AccountInfo>> pendingReviewers =
+        changeInfos.get(0).pendingReviewers;
+    assertThat(pendingReviewers).isNotNull();
+
+    assertReviewers(
+        pendingReviewers.get(ReviewerState.REVIEWER), userId.toString(), user1.toString(), email1);
+    assertReviewers(pendingReviewers.get(ReviewerState.CC), user2.toString(), email2);
+    assertReviewers(pendingReviewers.get(ReviewerState.REMOVED));
+
+    // Pending reviewers may also be presented in the REMOVED state. Toggle the
+    // change to ready and then back to WIP and remove reviewers to produce.
+    assertThat(pendingReviewers.get(ReviewerState.REMOVED)).isNull();
+    gApi.changes().id(change1.getId().get()).setReadyForReview();
+    gApi.changes().id(change1.getId().get()).setWorkInProgress();
+    gApi.changes().id(change1.getId().get()).reviewer(user1.toString()).remove();
+    gApi.changes().id(change1.getId().get()).reviewer(user2.toString()).remove();
+    gApi.changes().id(change1.getId().get()).reviewer(email1).remove();
+    gApi.changes().id(change1.getId().get()).reviewer(email2).remove();
+
+    changeInfos = assertQuery(newQuery("is:wip").withOption(DETAILED_LABELS), change1);
+    assertThat(changeInfos).isNotEmpty();
+
+    pendingReviewers = changeInfos.get(0).pendingReviewers;
+    assertThat(pendingReviewers).isNotNull();
+    assertReviewers(pendingReviewers.get(ReviewerState.REVIEWER));
+    assertReviewers(pendingReviewers.get(ReviewerState.CC));
+    assertReviewers(
+        pendingReviewers.get(ReviewerState.REMOVED),
+        user1.toString(),
+        user2.toString(),
+        email1,
+        email2);
+  }
+
+  @Test
+  public void byCommit() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    ChangeInserter ins = newChange(repo);
+    Change change = insert(repo, ins);
+    String sha = ins.getCommitId().name();
+
+    assertQuery("0000000000000000000000000000000000000000");
+    assertQuery("commit:0000000000000000000000000000000000000000");
+    for (int i = 0; i <= 36; i++) {
+      String q = sha.substring(0, 40 - i);
+      assertQuery(q, change);
+      assertQuery("commit:" + q, change);
+    }
+  }
+
+  @Test
+  public void byOwner() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    Change change1 = insert(repo, newChange(repo), userId);
+    Account.Id user2 =
+        accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId();
+    Change change2 = insert(repo, newChange(repo), user2);
+
+    assertQuery("is:owner", change1);
+    assertQuery("owner:" + userId.get(), change1);
+    assertQuery("owner:" + user2, change2);
+
+    String nameEmail = user.asIdentifiedUser().getNameEmail();
+    assertQuery("owner: \"" + nameEmail + "\"", change1);
+  }
+
+  @Test
+  public void byAuthorExact() throws Exception {
+    assume().that(getSchema().hasField(ChangeField.EXACT_AUTHOR)).isTrue();
+    byAuthorOrCommitterExact("author:");
+  }
+
+  @Test
+  public void byAuthorFullText() throws Exception {
+    byAuthorOrCommitterFullText("author:");
+  }
+
+  @Test
+  public void byCommitterExact() throws Exception {
+    assume().that(getSchema().hasField(ChangeField.EXACT_COMMITTER)).isTrue();
+    byAuthorOrCommitterExact("committer:");
+  }
+
+  @Test
+  public void byCommitterFullText() throws Exception {
+    byAuthorOrCommitterFullText("committer:");
+  }
+
+  private void byAuthorOrCommitterExact(String searchOperator) throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    PersonIdent johnDoe = new PersonIdent("John Doe", "john.doe@example.com");
+    PersonIdent john = new PersonIdent("John", "john@example.com");
+    PersonIdent doeSmith = new PersonIdent("Doe Smith", "doe_smith@example.com");
+    Change change1 = createChange(repo, johnDoe);
+    Change change2 = createChange(repo, john);
+    Change change3 = createChange(repo, doeSmith);
+
+    // Only email address.
+    assertQuery(searchOperator + "john.doe@example.com", change1);
+    assertQuery(searchOperator + "john@example.com", change2);
+    assertQuery(searchOperator + "Doe_SmIth@example.com", change3); // Case insensitive.
+
+    // Right combination of email address and name.
+    assertQuery(searchOperator + "\"John Doe <john.doe@example.com>\"", change1);
+    assertQuery(searchOperator + "\" John <john@example.com> \"", change2);
+    assertQuery(searchOperator + "\"doE SMITH <doe_smitH@example.com>\"", change3);
+
+    // Wrong combination of email address and name.
+    assertQuery(searchOperator + "\"John <john.doe@example.com>\"");
+    assertQuery(searchOperator + "\"Doe John <john@example.com>\"");
+    assertQuery(searchOperator + "\"Doe John <doe_smith@example.com>\"");
+  }
+
+  private void byAuthorOrCommitterFullText(String searchOperator) throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    PersonIdent johnDoe = new PersonIdent("John Doe", "john.doe@example.com");
+    PersonIdent john = new PersonIdent("John", "john@example.com");
+    PersonIdent doeSmith = new PersonIdent("Doe Smith", "doe_smith@example.com");
+    Change change1 = createChange(repo, johnDoe);
+    Change change2 = createChange(repo, john);
+    Change change3 = createChange(repo, doeSmith);
+
+    // By exact name.
+    assertQuery(searchOperator + "\"John Doe\"", change1);
+    assertQuery(searchOperator + "\"john\"", change2, change1);
+    assertQuery(searchOperator + "\"Doe smith\"", change3);
+
+    // By name part.
+    assertQuery(searchOperator + "Doe", change3, change1);
+    assertQuery(searchOperator + "smith", change3);
+
+    // By wrong combination.
+    assertQuery(searchOperator + "\"John Smith\"");
+
+    // By invalid query.
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("invalid value");
+    // SchemaUtil.getNameParts will return an empty set for query only containing these characters.
+    assertQuery(searchOperator + "@.- /_");
+  }
+
+  private Change createChange(TestRepository<Repo> repo, PersonIdent person) throws Exception {
+    RevCommit commit =
+        repo.parseBody(repo.commit().message("message").author(person).committer(person).create());
+    return insert(repo, newChangeForCommit(repo, commit), null);
+  }
+
+  @Test
+  public void byOwnerIn() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    Change change1 = insert(repo, newChange(repo), userId);
+    Account.Id user2 =
+        accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId();
+    Change change2 = insert(repo, newChange(repo), user2);
+    Change change3 = insert(repo, newChange(repo), user2);
+    gApi.changes().id(change3.getId().get()).current().review(ReviewInput.approve());
+    gApi.changes().id(change3.getId().get()).current().submit();
+
+    assertQuery("ownerin:Administrators", change1);
+    assertQuery("ownerin:\"Registered Users\"", change3, change2, change1);
+    assertQuery("ownerin:\"Registered Users\" project:repo", change3, change2, change1);
+    assertQuery("ownerin:\"Registered Users\" status:merged", change3);
+  }
+
+  @Test
+  public void byProject() throws Exception {
+    TestRepository<Repo> repo1 = createProject("repo1");
+    TestRepository<Repo> repo2 = createProject("repo2");
+    Change change1 = insert(repo1, newChange(repo1));
+    Change change2 = insert(repo2, newChange(repo2));
+
+    assertQuery("project:foo");
+    assertQuery("project:repo");
+    assertQuery("project:repo1", change1);
+    assertQuery("project:repo2", change2);
+  }
+
+  @Test
+  public void byParentProject() throws Exception {
+    TestRepository<Repo> repo1 = createProject("repo1");
+    TestRepository<Repo> repo2 = createProject("repo2", "repo1");
+    Change change1 = insert(repo1, newChange(repo1));
+    Change change2 = insert(repo2, newChange(repo2));
+
+    assertQuery("parentproject:repo1", change2, change1);
+    assertQuery("parentproject:repo2", change2);
+  }
+
+  @Test
+  public void byProjectPrefix() throws Exception {
+    TestRepository<Repo> repo1 = createProject("repo1");
+    TestRepository<Repo> repo2 = createProject("repo2");
+    Change change1 = insert(repo1, newChange(repo1));
+    Change change2 = insert(repo2, newChange(repo2));
+
+    assertQuery("projects:foo");
+    assertQuery("projects:repo1", change1);
+    assertQuery("projects:repo2", change2);
+    assertQuery("projects:repo", change2, change1);
+  }
+
+  @Test
+  public void byRepository() throws Exception {
+    TestRepository<Repo> repo1 = createProject("repo1");
+    TestRepository<Repo> repo2 = createProject("repo2");
+    Change change1 = insert(repo1, newChange(repo1));
+    Change change2 = insert(repo2, newChange(repo2));
+
+    assertQuery("repository:foo");
+    assertQuery("repository:repo");
+    assertQuery("repository:repo1", change1);
+    assertQuery("repository:repo2", change2);
+  }
+
+  @Test
+  public void byParentRepository() throws Exception {
+    TestRepository<Repo> repo1 = createProject("repo1");
+    TestRepository<Repo> repo2 = createProject("repo2", "repo1");
+    Change change1 = insert(repo1, newChange(repo1));
+    Change change2 = insert(repo2, newChange(repo2));
+
+    assertQuery("parentrepository:repo1", change2, change1);
+    assertQuery("parentrepository:repo2", change2);
+  }
+
+  @Test
+  public void byRepositoryPrefix() throws Exception {
+    TestRepository<Repo> repo1 = createProject("repo1");
+    TestRepository<Repo> repo2 = createProject("repo2");
+    Change change1 = insert(repo1, newChange(repo1));
+    Change change2 = insert(repo2, newChange(repo2));
+
+    assertQuery("repositories:foo");
+    assertQuery("repositories:repo1", change1);
+    assertQuery("repositories:repo2", change2);
+    assertQuery("repositories:repo", change2, change1);
+  }
+
+  @Test
+  public void byRepo() throws Exception {
+    TestRepository<Repo> repo1 = createProject("repo1");
+    TestRepository<Repo> repo2 = createProject("repo2");
+    Change change1 = insert(repo1, newChange(repo1));
+    Change change2 = insert(repo2, newChange(repo2));
+
+    assertQuery("repo:foo");
+    assertQuery("repo:repo");
+    assertQuery("repo:repo1", change1);
+    assertQuery("repo:repo2", change2);
+  }
+
+  @Test
+  public void byParentRepo() throws Exception {
+    TestRepository<Repo> repo1 = createProject("repo1");
+    TestRepository<Repo> repo2 = createProject("repo2", "repo1");
+    Change change1 = insert(repo1, newChange(repo1));
+    Change change2 = insert(repo2, newChange(repo2));
+
+    assertQuery("parentrepo:repo1", change2, change1);
+    assertQuery("parentrepo:repo2", change2);
+  }
+
+  @Test
+  public void byRepoPrefix() throws Exception {
+    TestRepository<Repo> repo1 = createProject("repo1");
+    TestRepository<Repo> repo2 = createProject("repo2");
+    Change change1 = insert(repo1, newChange(repo1));
+    Change change2 = insert(repo2, newChange(repo2));
+
+    assertQuery("repos:foo");
+    assertQuery("repos:repo1", change1);
+    assertQuery("repos:repo2", change2);
+    assertQuery("repos:repo", change2, change1);
+  }
+
+  @Test
+  public void byBranchAndRef() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    Change change1 = insert(repo, newChangeForBranch(repo, "master"));
+    Change change2 = insert(repo, newChangeForBranch(repo, "branch"));
+
+    assertQuery("branch:foo");
+    assertQuery("branch:master", change1);
+    assertQuery("branch:refs/heads/master", change1);
+    assertQuery("ref:master");
+    assertQuery("ref:refs/heads/master", change1);
+    assertQuery("branch:refs/heads/master", change1);
+    assertQuery("branch:branch", change2);
+    assertQuery("branch:refs/heads/branch", change2);
+    assertQuery("ref:branch");
+    assertQuery("ref:refs/heads/branch", change2);
+  }
+
+  @Test
+  public void byTopic() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    ChangeInserter ins1 = newChangeWithTopic(repo, "feature1");
+    Change change1 = insert(repo, ins1);
+
+    ChangeInserter ins2 = newChangeWithTopic(repo, "feature2");
+    Change change2 = insert(repo, ins2);
+
+    ChangeInserter ins3 = newChangeWithTopic(repo, "Cherrypick-feature2");
+    Change change3 = insert(repo, ins3);
+
+    ChangeInserter ins4 = newChangeWithTopic(repo, "feature2-fixup");
+    Change change4 = insert(repo, ins4);
+
+    ChangeInserter ins5 = newChangeWithTopic(repo, "https://gerrit.local");
+    Change change5 = insert(repo, ins5);
+
+    ChangeInserter ins6 = newChangeWithTopic(repo, "git_gerrit_training");
+    Change change6 = insert(repo, ins6);
+
+    Change change_no_topic = insert(repo, newChange(repo));
+
+    assertQuery("intopic:foo");
+    assertQuery("intopic:feature1", change1);
+    assertQuery("intopic:feature2", change4, change3, change2);
+    assertQuery("topic:feature2", change2);
+    assertQuery("intopic:feature2", change4, change3, change2);
+    assertQuery("intopic:fixup", change4);
+    assertQuery("intopic:gerrit", change6, change5);
+    assertQuery("topic:\"\"", change_no_topic);
+    assertQuery("intopic:\"\"", change_no_topic);
+  }
+
+  @Test
+  public void byTopicRegex() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+
+    ChangeInserter ins1 = newChangeWithTopic(repo, "feature1");
+    Change change1 = insert(repo, ins1);
+
+    ChangeInserter ins2 = newChangeWithTopic(repo, "Cherrypick-feature1");
+    Change change2 = insert(repo, ins2);
+
+    ChangeInserter ins3 = newChangeWithTopic(repo, "feature1-fixup");
+    Change change3 = insert(repo, ins3);
+
+    assertQuery("intopic:^feature1.*", change3, change1);
+    assertQuery("intopic:{^.*feature1$}", change2, change1);
+  }
+
+  @Test
+  public void byMessageExact() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    RevCommit commit1 = repo.parseBody(repo.commit().message("one").create());
+    Change change1 = insert(repo, newChangeForCommit(repo, commit1));
+    RevCommit commit2 = repo.parseBody(repo.commit().message("two").create());
+    Change change2 = insert(repo, newChangeForCommit(repo, commit2));
+
+    assertQuery("message:foo");
+    assertQuery("message:one", change1);
+    assertQuery("message:two", change2);
+  }
+
+  @Test
+  public void fullTextWithNumbers() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    RevCommit commit1 = repo.parseBody(repo.commit().message("12345 67890").create());
+    Change change1 = insert(repo, newChangeForCommit(repo, commit1));
+    RevCommit commit2 = repo.parseBody(repo.commit().message("12346 67891").create());
+    Change change2 = insert(repo, newChangeForCommit(repo, commit2));
+
+    assertQuery("message:1234");
+    assertQuery("message:12345", change1);
+    assertQuery("message:12346", change2);
+  }
+
+  @Test
+  public void byMessageMixedCase() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    RevCommit commit1 = repo.parseBody(repo.commit().message("Hello gerrit").create());
+    Change change1 = insert(repo, newChangeForCommit(repo, commit1));
+    RevCommit commit2 = repo.parseBody(repo.commit().message("Hello Gerrit").create());
+    Change change2 = insert(repo, newChangeForCommit(repo, commit2));
+
+    assertQuery("message:gerrit", change2, change1);
+    assertQuery("message:Gerrit", change2, change1);
+  }
+
+  @Test
+  public void byMessageSubstring() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    RevCommit commit1 = repo.parseBody(repo.commit().message("https://gerrit.local").create());
+    Change change1 = insert(repo, newChangeForCommit(repo, commit1));
+    assertQuery("message:gerrit", change1);
+  }
+
+  @Test
+  public void byLabel() throws Exception {
+    accountManager.authenticate(AuthRequest.forUser("anotheruser"));
+    TestRepository<Repo> repo = createProject("repo");
+    ChangeInserter ins = newChange(repo, null, null, null, null, false);
+    ChangeInserter ins2 = newChange(repo, null, null, null, null, false);
+    ChangeInserter ins3 = newChange(repo, null, null, null, null, false);
+    ChangeInserter ins4 = newChange(repo, null, null, null, null, false);
+    ChangeInserter ins5 = newChange(repo, null, null, null, null, false);
+
+    Change reviewMinus2Change = insert(repo, ins);
+    gApi.changes().id(reviewMinus2Change.getId().get()).current().review(ReviewInput.reject());
+
+    Change reviewMinus1Change = insert(repo, ins2);
+    gApi.changes().id(reviewMinus1Change.getId().get()).current().review(ReviewInput.dislike());
+
+    Change noLabelChange = insert(repo, ins3);
+
+    Change reviewPlus1Change = insert(repo, ins4);
+    gApi.changes().id(reviewPlus1Change.getId().get()).current().review(ReviewInput.recommend());
+
+    Change reviewPlus2Change = insert(repo, ins5);
+    gApi.changes().id(reviewPlus2Change.getId().get()).current().review(ReviewInput.approve());
+
+    Map<String, Short> m =
+        gApi.changes()
+            .id(reviewPlus1Change.getId().get())
+            .reviewer(user.getAccountId().toString())
+            .votes();
+    assertThat(m).hasSize(1);
+    assertThat(m).containsEntry("Code-Review", Short.valueOf((short) 1));
+
+    Map<Integer, Change> changes = new LinkedHashMap<>(5);
+    changes.put(2, reviewPlus2Change);
+    changes.put(1, reviewPlus1Change);
+    changes.put(0, noLabelChange);
+    changes.put(-1, reviewMinus1Change);
+    changes.put(-2, reviewMinus2Change);
+
+    assertQuery("label:Code-Review=-2", reviewMinus2Change);
+    assertQuery("label:Code-Review-2", reviewMinus2Change);
+    assertQuery("label:Code-Review=-1", reviewMinus1Change);
+    assertQuery("label:Code-Review-1", reviewMinus1Change);
+    assertQuery("label:Code-Review=0", noLabelChange);
+    assertQuery("label:Code-Review=+1", reviewPlus1Change);
+    assertQuery("label:Code-Review=1", reviewPlus1Change);
+    assertQuery("label:Code-Review+1", reviewPlus1Change);
+    assertQuery("label:Code-Review=+2", reviewPlus2Change);
+    assertQuery("label:Code-Review=2", reviewPlus2Change);
+    assertQuery("label:Code-Review+2", reviewPlus2Change);
+
+    assertQuery("label:Code-Review>-3", codeReviewInRange(changes, -2, 2));
+    assertQuery("label:Code-Review>=-2", codeReviewInRange(changes, -2, 2));
+    assertQuery("label:Code-Review>-2", codeReviewInRange(changes, -1, 2));
+    assertQuery("label:Code-Review>=-1", codeReviewInRange(changes, -1, 2));
+    assertQuery("label:Code-Review>-1", codeReviewInRange(changes, 0, 2));
+    assertQuery("label:Code-Review>=0", codeReviewInRange(changes, 0, 2));
+    assertQuery("label:Code-Review>0", codeReviewInRange(changes, 1, 2));
+    assertQuery("label:Code-Review>=1", codeReviewInRange(changes, 1, 2));
+    assertQuery("label:Code-Review>1", reviewPlus2Change);
+    assertQuery("label:Code-Review>=2", reviewPlus2Change);
+    assertQuery("label:Code-Review>2");
+
+    assertQuery("label:Code-Review<=2", codeReviewInRange(changes, -2, 2));
+    assertQuery("label:Code-Review<2", codeReviewInRange(changes, -2, 1));
+    assertQuery("label:Code-Review<=1", codeReviewInRange(changes, -2, 1));
+    assertQuery("label:Code-Review<1", codeReviewInRange(changes, -2, 0));
+    assertQuery("label:Code-Review<=0", codeReviewInRange(changes, -2, 0));
+    assertQuery("label:Code-Review<0", codeReviewInRange(changes, -2, -1));
+    assertQuery("label:Code-Review<=-1", codeReviewInRange(changes, -2, -1));
+    assertQuery("label:Code-Review<-1", reviewMinus2Change);
+    assertQuery("label:Code-Review<=-2", reviewMinus2Change);
+    assertQuery("label:Code-Review<-2");
+
+    assertQuery("label:Code-Review=+1,anotheruser");
+    assertQuery("label:Code-Review=+1,user", reviewPlus1Change);
+    assertQuery("label:Code-Review=+1,user=user", reviewPlus1Change);
+    assertQuery("label:Code-Review=+1,Administrators", reviewPlus1Change);
+    assertQuery("label:Code-Review=+1,group=Administrators", reviewPlus1Change);
+    assertQuery("label:Code-Review=+1,user=owner", reviewPlus1Change);
+    assertQuery("label:Code-Review=+1,owner", reviewPlus1Change);
+    assertQuery("label:Code-Review=+2,owner", reviewPlus2Change);
+    assertQuery("label:Code-Review=-2,owner", reviewMinus2Change);
+  }
+
+  @Test
+  public void byLabelMulti() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    Project.NameKey project =
+        new Project.NameKey(repo.getRepository().getDescription().getRepositoryName());
+    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
+
+    LabelType verified =
+        category("Verified", value(1, "Passes"), value(0, "No score"), value(-1, "Failed"));
+    cfg.getLabelSections().put(verified.getName(), verified);
+
+    String heads = RefNames.REFS_HEADS + "*";
+    allow(cfg, Permission.forLabel(verified().getName()), -1, 1, REGISTERED_USERS, heads);
+
+    try (MetaDataUpdate md = metaDataUpdateFactory.create(project)) {
+      cfg.commit(md);
+    }
+    projectCache.evict(cfg.getProject());
+
+    ReviewInput reviewVerified = new ReviewInput().label("Verified", 1);
+    ChangeInserter ins = newChange(repo, null, null, null, null, false);
+    ChangeInserter ins2 = newChange(repo, null, null, null, null, false);
+    ChangeInserter ins3 = newChange(repo, null, null, null, null, false);
+    ChangeInserter ins4 = newChange(repo, null, null, null, null, false);
+    ChangeInserter ins5 = newChange(repo, null, null, null, null, false);
+
+    // CR+1
+    Change reviewCRplus1 = insert(repo, ins);
+    gApi.changes().id(reviewCRplus1.getId().get()).current().review(ReviewInput.recommend());
+
+    // CR+2
+    Change reviewCRplus2 = insert(repo, ins2);
+    gApi.changes().id(reviewCRplus2.getId().get()).current().review(ReviewInput.approve());
+
+    // CR+1 VR+1
+    Change reviewCRplus1VRplus1 = insert(repo, ins3);
+    gApi.changes().id(reviewCRplus1VRplus1.getId().get()).current().review(ReviewInput.recommend());
+    gApi.changes().id(reviewCRplus1VRplus1.getId().get()).current().review(reviewVerified);
+
+    // CR+2 VR+1
+    Change reviewCRplus2VRplus1 = insert(repo, ins4);
+    gApi.changes().id(reviewCRplus2VRplus1.getId().get()).current().review(ReviewInput.approve());
+    gApi.changes().id(reviewCRplus2VRplus1.getId().get()).current().review(reviewVerified);
+
+    // VR+1
+    Change reviewVRplus1 = insert(repo, ins5);
+    gApi.changes().id(reviewVRplus1.getId().get()).current().review(reviewVerified);
+
+    assertQuery("label:Code-Review=+1", reviewCRplus1VRplus1, reviewCRplus1);
+    assertQuery(
+        "label:Code-Review>=+1",
+        reviewCRplus2VRplus1,
+        reviewCRplus1VRplus1,
+        reviewCRplus2,
+        reviewCRplus1);
+    assertQuery("label:Code-Review>=+2", reviewCRplus2VRplus1, reviewCRplus2);
+
+    assertQuery(
+        "label:Code-Review>=+1 label:Verified=+1", reviewCRplus2VRplus1, reviewCRplus1VRplus1);
+    assertQuery("label:Code-Review>=+2 label:Verified=+1", reviewCRplus2VRplus1);
+  }
+
+  @Test
+  public void byLabelNotOwner() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    ChangeInserter ins = newChange(repo, null, null, null, null, false);
+    Account.Id user1 = createAccount("user1");
+
+    Change reviewPlus1Change = insert(repo, ins);
+
+    // post a review with user1
+    requestContext.setContext(newRequestContext(user1));
+    gApi.changes().id(reviewPlus1Change.getId().get()).current().review(ReviewInput.recommend());
+
+    assertQuery("label:Code-Review=+1,user=user1", reviewPlus1Change);
+    assertQuery("label:Code-Review=+1,owner");
+  }
+
+  private Change[] codeReviewInRange(Map<Integer, Change> changes, int start, int end) {
+    int size = 0;
+    Change[] range = new Change[end - start + 1];
+    for (int i : changes.keySet()) {
+      if (i >= start && i <= end) {
+        range[size] = changes.get(i);
+        size++;
+      }
+    }
+    return range;
+  }
+
+  private String createGroup(String name, String owner) throws Exception {
+    GroupInput in = new GroupInput();
+    in.name = name;
+    in.ownerId = owner;
+    gApi.groups().create(in);
+    return name;
+  }
+
+  private Account.Id createAccount(String name) throws Exception {
+    return accountManager.authenticate(AuthRequest.forUser(name)).getAccountId();
+  }
+
+  @Test
+  public void byLabelGroup() throws Exception {
+    Account.Id user1 = createAccount("user1");
+    createAccount("user2");
+    TestRepository<Repo> repo = createProject("repo");
+
+    // create group and add users
+    String g1 = createGroup("group1", "Administrators");
+    String g2 = createGroup("group2", "Administrators");
+    gApi.groups().id(g1).addMembers("user1");
+    gApi.groups().id(g2).addMembers("user2");
+
+    // create a change
+    Change change1 = insert(repo, newChange(repo), user1);
+
+    // post a review with user1
+    requestContext.setContext(newRequestContext(user1));
+    gApi.changes()
+        .id(change1.getId().get())
+        .current()
+        .review(new ReviewInput().label("Code-Review", 1));
+
+    // verify that query with user1 will return results.
+    requestContext.setContext(newRequestContext(userId));
+    assertQuery("label:Code-Review=+1,group1", change1);
+    assertQuery("label:Code-Review=+1,group=group1", change1);
+    assertQuery("label:Code-Review=+1,user=user1", change1);
+    assertQuery("label:Code-Review=+1,user=user2");
+    assertQuery("label:Code-Review=+1,group=group2");
+  }
+
+  @Test
+  public void limit() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    Change last = null;
+    int n = 5;
+    for (int i = 0; i < n; i++) {
+      last = insert(repo, newChange(repo));
+    }
+
+    for (int i = 1; i <= n + 2; i++) {
+      int expectedSize;
+      Boolean expectedMoreChanges;
+      if (i < n) {
+        expectedSize = i;
+        expectedMoreChanges = true;
+      } else {
+        expectedSize = n;
+        expectedMoreChanges = null;
+      }
+      String q = "status:new limit:" + i;
+      List<ChangeInfo> results = newQuery(q).get();
+      assertThat(results).named(q).hasSize(expectedSize);
+      assertThat(results.get(results.size() - 1)._moreChanges)
+          .named(q)
+          .isEqualTo(expectedMoreChanges);
+      assertThat(results.get(0)._number).isEqualTo(last.getId().get());
+    }
+  }
+
+  @Test
+  public void start() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    List<Change> changes = new ArrayList<>();
+    for (int i = 0; i < 2; i++) {
+      changes.add(insert(repo, newChange(repo)));
+    }
+
+    assertQuery("status:new", changes.get(1), changes.get(0));
+    assertQuery(newQuery("status:new").withStart(1), changes.get(0));
+    assertQuery(newQuery("status:new").withStart(2));
+    assertQuery(newQuery("status:new").withStart(3));
+  }
+
+  @Test
+  public void startWithLimit() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    List<Change> changes = new ArrayList<>();
+    for (int i = 0; i < 3; i++) {
+      changes.add(insert(repo, newChange(repo)));
+    }
+
+    assertQuery("status:new limit:2", changes.get(2), changes.get(1));
+    assertQuery(newQuery("status:new limit:2").withStart(1), changes.get(1), changes.get(0));
+    assertQuery(newQuery("status:new limit:2").withStart(2), changes.get(0));
+    assertQuery(newQuery("status:new limit:2").withStart(3));
+  }
+
+  @Test
+  public void maxPages() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    Change change = insert(repo, newChange(repo));
+
+    QueryRequest query = newQuery("status:new").withLimit(10);
+    assertQuery(query, change);
+    assertQuery(query.withStart(1));
+    assertQuery(query.withStart(99));
+    assertThatQueryException(query.withStart(100))
+        .hasMessageThat()
+        .isEqualTo("Cannot go beyond page 10 of results");
+    assertQuery(query.withLimit(100).withStart(100));
+  }
+
+  @Test
+  public void updateOrder() throws Exception {
+    resetTimeWithClockStep(2, MINUTES);
+    TestRepository<Repo> repo = createProject("repo");
+    List<ChangeInserter> inserters = new ArrayList<>();
+    List<Change> changes = new ArrayList<>();
+    for (int i = 0; i < 5; i++) {
+      inserters.add(newChange(repo));
+      changes.add(insert(repo, inserters.get(i)));
+    }
+
+    for (int i : ImmutableList.of(2, 0, 1, 4, 3)) {
+      gApi.changes()
+          .id(changes.get(i).getId().get())
+          .current()
+          .review(new ReviewInput().message("modifying " + i));
+    }
+
+    assertQuery(
+        "status:new",
+        changes.get(3),
+        changes.get(4),
+        changes.get(1),
+        changes.get(0),
+        changes.get(2));
+  }
+
+  @Test
+  public void updatedOrder() throws Exception {
+    resetTimeWithClockStep(1, SECONDS);
+    TestRepository<Repo> repo = createProject("repo");
+    ChangeInserter ins1 = newChange(repo);
+    Change change1 = insert(repo, ins1);
+    Change change2 = insert(repo, newChange(repo));
+
+    assertThat(lastUpdatedMs(change1)).isLessThan(lastUpdatedMs(change2));
+    assertQuery("status:new", change2, change1);
+
+    gApi.changes().id(change1.getId().get()).topic("new-topic");
+    change1 = notesFactory.create(db, change1.getProject(), change1.getId()).getChange();
+
+    assertThat(lastUpdatedMs(change1)).isGreaterThan(lastUpdatedMs(change2));
+    assertThat(lastUpdatedMs(change1) - lastUpdatedMs(change2))
+        .isAtLeast(MILLISECONDS.convert(1, SECONDS));
+
+    // change1 moved to the top.
+    assertQuery("status:new", change1, change2);
+  }
+
+  @Test
+  public void filterOutMoreThanOnePageOfResults() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    Change change = insert(repo, newChange(repo), userId);
+    Account.Id user2 =
+        accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId();
+    for (int i = 0; i < 5; i++) {
+      insert(repo, newChange(repo), user2);
+    }
+
+    assertQuery("status:new ownerin:Administrators", change);
+    assertQuery("status:new ownerin:Administrators limit:2", change);
+  }
+
+  @Test
+  public void filterOutAllResults() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    Account.Id user2 =
+        accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId();
+    for (int i = 0; i < 5; i++) {
+      insert(repo, newChange(repo), user2);
+    }
+
+    assertQuery("status:new ownerin:Administrators");
+    assertQuery("status:new ownerin:Administrators limit:2");
+  }
+
+  @Test
+  public void byFileExact() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    RevCommit commit =
+        repo.parseBody(
+            repo.commit()
+                .message("one")
+                .add("dir/file1", "contents1")
+                .add("dir/file2", "contents2")
+                .create());
+    Change change = insert(repo, newChangeForCommit(repo, commit));
+
+    assertQuery("file:file");
+    assertQuery("file:dir", change);
+    assertQuery("file:file1", change);
+    assertQuery("file:file2", change);
+    assertQuery("file:dir/file1", change);
+    assertQuery("file:dir/file2", change);
+  }
+
+  @Test
+  public void byFileRegex() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    RevCommit commit =
+        repo.parseBody(
+            repo.commit()
+                .message("one")
+                .add("dir/file1", "contents1")
+                .add("dir/file2", "contents2")
+                .create());
+    Change change = insert(repo, newChangeForCommit(repo, commit));
+
+    assertQuery("file:.*file.*");
+    assertQuery("file:^file.*"); // Whole path only.
+    assertQuery("file:^dir.file.*", change);
+  }
+
+  @Test
+  public void byPathExact() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    RevCommit commit =
+        repo.parseBody(
+            repo.commit()
+                .message("one")
+                .add("dir/file1", "contents1")
+                .add("dir/file2", "contents2")
+                .create());
+    Change change = insert(repo, newChangeForCommit(repo, commit));
+
+    assertQuery("path:file");
+    assertQuery("path:dir");
+    assertQuery("path:file1");
+    assertQuery("path:file2");
+    assertQuery("path:dir/file1", change);
+    assertQuery("path:dir/file2", change);
+  }
+
+  @Test
+  public void byPathRegex() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    RevCommit commit =
+        repo.parseBody(
+            repo.commit()
+                .message("one")
+                .add("dir/file1", "contents1")
+                .add("dir/file2", "contents2")
+                .create());
+    Change change = insert(repo, newChangeForCommit(repo, commit));
+
+    assertQuery("path:.*file.*");
+    assertQuery("path:^dir.file.*", change);
+  }
+
+  @Test
+  public void byComment() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    ChangeInserter ins = newChange(repo);
+    Change change = insert(repo, ins);
+
+    ReviewInput input = new ReviewInput();
+    input.message = "toplevel";
+    ReviewInput.CommentInput commentInput = new ReviewInput.CommentInput();
+    commentInput.line = 1;
+    commentInput.message = "inline";
+    input.comments =
+        ImmutableMap.<String, List<ReviewInput.CommentInput>>of(
+            Patch.COMMIT_MSG, ImmutableList.<ReviewInput.CommentInput>of(commentInput));
+    gApi.changes().id(change.getId().get()).current().review(input);
+
+    Map<String, List<CommentInfo>> comments =
+        gApi.changes().id(change.getId().get()).current().comments();
+    assertThat(comments).hasSize(1);
+    CommentInfo comment = Iterables.getOnlyElement(comments.get(Patch.COMMIT_MSG));
+    assertThat(comment.message).isEqualTo(commentInput.message);
+    ChangeMessageInfo lastMsg =
+        Iterables.getLast(gApi.changes().id(change.getId().get()).get().messages, null);
+    assertThat(lastMsg.message).isEqualTo("Patch Set 1:\n\n(1 comment)\n\n" + input.message);
+
+    assertQuery("comment:foo");
+    assertQuery("comment:toplevel", change);
+    assertQuery("comment:inline", change);
+  }
+
+  @Test
+  public void byAge() throws Exception {
+    long thirtyHoursInMs = MILLISECONDS.convert(30, HOURS);
+    resetTimeWithClockStep(thirtyHoursInMs, MILLISECONDS);
+    TestRepository<Repo> repo = createProject("repo");
+    long startMs = TestTimeUtil.START.toEpochMilli();
+    Change change1 = insert(repo, newChange(repo), null, new Timestamp(startMs));
+    Change change2 = insert(repo, newChange(repo), null, new Timestamp(startMs + thirtyHoursInMs));
+
+    // Stop time so age queries use the same endpoint.
+    TestTimeUtil.setClockStep(0, MILLISECONDS);
+    TestTimeUtil.setClock(new Timestamp(startMs + 2 * thirtyHoursInMs));
+    long nowMs = TimeUtil.nowMs();
+
+    assertThat(lastUpdatedMs(change2) - lastUpdatedMs(change1)).isEqualTo(thirtyHoursInMs);
+    assertThat(nowMs - lastUpdatedMs(change2)).isEqualTo(thirtyHoursInMs);
+    assertThat(TimeUtil.nowMs()).isEqualTo(nowMs);
+
+    assertQuery("-age:1d");
+    assertQuery("-age:" + (30 * 60 - 1) + "m");
+    assertQuery("-age:2d", change2);
+    assertQuery("-age:3d", change2, change1);
+    assertQuery("age:3d");
+    assertQuery("age:2d", change1);
+    assertQuery("age:1d", change2, change1);
+  }
+
+  @Test
+  public void byBeforeUntil() throws Exception {
+    long thirtyHoursInMs = MILLISECONDS.convert(30, HOURS);
+    resetTimeWithClockStep(thirtyHoursInMs, MILLISECONDS);
+    TestRepository<Repo> repo = createProject("repo");
+    long startMs = TestTimeUtil.START.toEpochMilli();
+    Change change1 = insert(repo, newChange(repo), null, new Timestamp(startMs));
+    Change change2 = insert(repo, newChange(repo), null, new Timestamp(startMs + thirtyHoursInMs));
+    TestTimeUtil.setClockStep(0, MILLISECONDS);
+
+    for (String predicate : Lists.newArrayList("before:", "until:")) {
+      assertQuery(predicate + "2009-09-29");
+      assertQuery(predicate + "2009-09-30");
+      assertQuery(predicate + "\"2009-09-30 16:59:00 -0400\"");
+      assertQuery(predicate + "\"2009-09-30 20:59:00 -0000\"");
+      assertQuery(predicate + "\"2009-09-30 20:59:00\"");
+      assertQuery(predicate + "\"2009-09-30 17:02:00 -0400\"", change1);
+      assertQuery(predicate + "\"2009-10-01 21:02:00 -0000\"", change1);
+      assertQuery(predicate + "\"2009-10-01 21:02:00\"", change1);
+      assertQuery(predicate + "2009-10-01", change1);
+      assertQuery(predicate + "2009-10-03", change2, change1);
+    }
+  }
+
+  @Test
+  public void byAfterSince() throws Exception {
+    long thirtyHoursInMs = MILLISECONDS.convert(30, HOURS);
+    resetTimeWithClockStep(thirtyHoursInMs, MILLISECONDS);
+    TestRepository<Repo> repo = createProject("repo");
+    long startMs = TestTimeUtil.START.toEpochMilli();
+    Change change1 = insert(repo, newChange(repo), null, new Timestamp(startMs));
+    Change change2 = insert(repo, newChange(repo), null, new Timestamp(startMs + thirtyHoursInMs));
+    TestTimeUtil.setClockStep(0, MILLISECONDS);
+
+    for (String predicate : Lists.newArrayList("after:", "since:")) {
+      assertQuery(predicate + "2009-10-03");
+      assertQuery(predicate + "\"2009-10-01 20:59:59 -0400\"", change2);
+      assertQuery(predicate + "\"2009-10-01 20:59:59 -0000\"", change2);
+      assertQuery(predicate + "2009-10-01", change2);
+      assertQuery(predicate + "2009-09-30", change2, change1);
+    }
+  }
+
+  @Test
+  public void bySize() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+
+    // added = 3, deleted = 0, delta = 3
+    RevCommit commit1 = repo.parseBody(repo.commit().add("file1", "foo\n\foo\nfoo").create());
+    // added = 0, deleted = 2, delta = 2
+    RevCommit commit2 = repo.parseBody(repo.commit().parent(commit1).add("file1", "foo").create());
+
+    Change change1 = insert(repo, newChangeForCommit(repo, commit1));
+    Change change2 = insert(repo, newChangeForCommit(repo, commit2));
+
+    assertQuery("added:>4");
+    assertQuery("-added:<=4");
+
+    assertQuery("added:3", change1);
+    assertQuery("-(added:<3 OR added>3)", change1);
+
+    assertQuery("added:>2", change1);
+    assertQuery("-added:<=2", change1);
+
+    assertQuery("added:>=3", change1);
+    assertQuery("-added:<3", change1);
+
+    assertQuery("added:<1", change2);
+    assertQuery("-added:>=1", change2);
+
+    assertQuery("added:<=0", change2);
+    assertQuery("-added:>0", change2);
+
+    assertQuery("deleted:>3");
+    assertQuery("-deleted:<=3");
+
+    assertQuery("deleted:2", change2);
+    assertQuery("-(deleted:<2 OR deleted>2)", change2);
+
+    assertQuery("deleted:>1", change2);
+    assertQuery("-deleted:<=1", change2);
+
+    assertQuery("deleted:>=2", change2);
+    assertQuery("-deleted:<2", change2);
+
+    assertQuery("deleted:<1", change1);
+    assertQuery("-deleted:>=1", change1);
+
+    assertQuery("deleted:<=0", change1);
+
+    for (String str : Lists.newArrayList("delta:", "size:")) {
+      assertQuery(str + "<2");
+      assertQuery(str + "3", change1);
+      assertQuery(str + ">2", change1);
+      assertQuery(str + ">=3", change1);
+      assertQuery(str + "<3", change2);
+      assertQuery(str + "<=2", change2);
+    }
+  }
+
+  private List<Change> setUpHashtagChanges() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    Change change1 = insert(repo, newChange(repo));
+    Change change2 = insert(repo, newChange(repo));
+
+    HashtagsInput in = new HashtagsInput();
+    in.add = ImmutableSet.of("foo");
+    gApi.changes().id(change1.getId().get()).setHashtags(in);
+
+    in.add = ImmutableSet.of("foo", "bar", "a tag", "ACamelCaseTag");
+    gApi.changes().id(change2.getId().get()).setHashtags(in);
+
+    return ImmutableList.of(change1, change2);
+  }
+
+  @Test
+  public void byHashtagWithNoteDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+    List<Change> changes = setUpHashtagChanges();
+    assertQuery("hashtag:foo", changes.get(1), changes.get(0));
+    assertQuery("hashtag:bar", changes.get(1));
+    assertQuery("hashtag:\"a tag\"", changes.get(1));
+    assertQuery("hashtag:\"a tag \"", changes.get(1));
+    assertQuery("hashtag:\" a tag \"", changes.get(1));
+    assertQuery("hashtag:\"#a tag\"", changes.get(1));
+    assertQuery("hashtag:\"# #a tag\"", changes.get(1));
+    assertQuery("hashtag:acamelcasetag", changes.get(1));
+    assertQuery("hashtag:ACamelCaseTAg", changes.get(1));
+  }
+
+  @Test
+  public void byHashtagWithoutNoteDb() throws Exception {
+    assume().that(notesMigration.readChanges()).isFalse();
+
+    notesMigration.setWriteChanges(true);
+    notesMigration.setReadChanges(true);
+    db.close();
+    db = schemaFactory.open();
+    List<Change> changes;
+    try {
+      changes = setUpHashtagChanges();
+      notesMigration.setWriteChanges(false);
+      notesMigration.setReadChanges(false);
+    } finally {
+      db.close();
+    }
+    db = schemaFactory.open();
+    for (Change c : changes) {
+      indexer.index(db, c); // Reindex without hashtag field.
+    }
+    assertQuery("hashtag:foo");
+    assertQuery("hashtag:bar");
+    assertQuery("hashtag:\" bar \"");
+    assertQuery("hashtag:\"a tag\"");
+    assertQuery("hashtag:\" a tag \"");
+    assertQuery("hashtag:#foo");
+    assertQuery("hashtag:\"# #foo\"");
+  }
+
+  @Test
+  public void byDefault() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+
+    Change change1 = insert(repo, newChange(repo));
+
+    RevCommit commit2 = repo.parseBody(repo.commit().message("foosubject").create());
+    Change change2 = insert(repo, newChangeForCommit(repo, commit2));
+
+    RevCommit commit3 = repo.parseBody(repo.commit().add("Foo.java", "foo contents").create());
+    Change change3 = insert(repo, newChangeForCommit(repo, commit3));
+
+    ChangeInserter ins4 = newChange(repo);
+    Change change4 = insert(repo, ins4);
+    ReviewInput ri4 = new ReviewInput();
+    ri4.message = "toplevel";
+    ri4.labels = ImmutableMap.<String, Short>of("Code-Review", (short) 1);
+    gApi.changes().id(change4.getId().get()).current().review(ri4);
+
+    ChangeInserter ins5 = newChangeWithTopic(repo, "feature5");
+    Change change5 = insert(repo, ins5);
+
+    Change change6 = insert(repo, newChangeForBranch(repo, "branch6"));
+
+    assertQuery(change1.getId().get(), change1);
+    assertQuery(ChangeTriplet.format(change1), change1);
+    assertQuery("foosubject", change2);
+    assertQuery("Foo.java", change3);
+    assertQuery("Code-Review+1", change4);
+    assertQuery("toplevel", change4);
+    assertQuery("feature5", change5);
+    assertQuery("branch6", change6);
+    assertQuery("refs/heads/branch6", change6);
+
+    Change[] expected = new Change[] {change6, change5, change4, change3, change2, change1};
+    assertQuery("user@example.com", expected);
+    assertQuery("repo", expected);
+  }
+
+  @Test
+  public void byDefaultWithCommitPrefix() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    RevCommit commit = repo.parseBody(repo.commit().message("message").create());
+    Change change = insert(repo, newChangeForCommit(repo, commit));
+
+    assertQuery(commit.getId().getName().substring(0, 6), change);
+  }
+
+  @Test
+  public void visible() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    Change change1 = insert(repo, newChange(repo));
+    Change change2 = insert(repo, newChange(repo));
+
+    gApi.changes().id(change2.getChangeId()).setPrivate(true, "private");
+
+    String q = "project:repo";
+    assertQuery(q, change2, change1);
+
+    // Second user cannot see first user's private change.
+    Account.Id user2 =
+        accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId();
+    assertQuery(q + " visibleto:" + user2.get(), change1);
+
+    String g1 = createGroup("group1", "Administrators");
+    gApi.groups().id(g1).addMembers("anotheruser");
+    assertQuery(q + " visibleto:" + g1, change1);
+
+    requestContext.setContext(
+        newRequestContext(
+            accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId()));
+    assertQuery("is:visible", change1);
+  }
+
+  @Test
+  public void byCommentBy() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    Change change1 = insert(repo, newChange(repo));
+    Change change2 = insert(repo, newChange(repo));
+
+    int user2 =
+        accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId().get();
+
+    ReviewInput input = new ReviewInput();
+    input.message = "toplevel";
+    ReviewInput.CommentInput comment = new ReviewInput.CommentInput();
+    comment.line = 1;
+    comment.message = "inline";
+    input.comments =
+        ImmutableMap.<String, List<ReviewInput.CommentInput>>of(
+            Patch.COMMIT_MSG, ImmutableList.<ReviewInput.CommentInput>of(comment));
+    gApi.changes().id(change1.getId().get()).current().review(input);
+
+    input = new ReviewInput();
+    input.message = "toplevel";
+    gApi.changes().id(change2.getId().get()).current().review(input);
+
+    assertQuery("commentby:" + userId.get(), change2, change1);
+    assertQuery("commentby:" + user2);
+  }
+
+  @Test
+  public void byDraftBy() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    Change change1 = insert(repo, newChange(repo));
+    Change change2 = insert(repo, newChange(repo));
+
+    assertQuery("has:draft");
+
+    DraftInput in = new DraftInput();
+    in.line = 1;
+    in.message = "nit: trailing whitespace";
+    in.path = Patch.COMMIT_MSG;
+    gApi.changes().id(change1.getId().get()).current().createDraft(in);
+
+    in = new DraftInput();
+    in.line = 2;
+    in.message = "nit: point in the end of the statement";
+    in.path = Patch.COMMIT_MSG;
+    gApi.changes().id(change2.getId().get()).current().createDraft(in);
+
+    int user2 =
+        accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId().get();
+
+    assertQuery("has:draft", change2, change1);
+    assertQuery("draftby:" + userId.get(), change2, change1);
+    assertQuery("draftby:" + user2);
+  }
+
+  @Test
+  public void byDraftByExcludesZombieDrafts() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    Project.NameKey project = new Project.NameKey("repo");
+    TestRepository<Repo> repo = createProject(project.get());
+    Change change = insert(repo, newChange(repo));
+    Change.Id id = change.getId();
+
+    DraftInput in = new DraftInput();
+    in.line = 1;
+    in.message = "nit: trailing whitespace";
+    in.path = Patch.COMMIT_MSG;
+    gApi.changes().id(id.get()).current().createDraft(in);
+
+    assertQuery("draftby:" + userId, change);
+    assertQuery("commentby:" + userId);
+
+    TestRepository<Repo> allUsers = new TestRepository<>(repoManager.openRepository(allUsersName));
+
+    Ref draftsRef = allUsers.getRepository().exactRef(RefNames.refsDraftComments(id, userId));
+    assertThat(draftsRef).isNotNull();
+
+    ReviewInput rin = ReviewInput.dislike();
+    rin.drafts = DraftHandling.PUBLISH_ALL_REVISIONS;
+    gApi.changes().id(id.get()).current().review(rin);
+
+    assertQuery("draftby:" + userId);
+    assertQuery("commentby:" + userId, change);
+    assertThat(allUsers.getRepository().exactRef(draftsRef.getName())).isNull();
+
+    // Re-add drafts ref and ensure it gets filtered out during indexing.
+    allUsers.update(draftsRef.getName(), draftsRef.getObjectId());
+    assertThat(allUsers.getRepository().exactRef(draftsRef.getName())).isNotNull();
+
+    if (PrimaryStorage.of(change) == PrimaryStorage.REVIEW_DB
+        && !notesMigration.disableChangeReviewDb()) {
+      // Record draft ref in noteDbState as well.
+      ReviewDb db = ReviewDbUtil.unwrapDb(this.db);
+      change = db.changes().get(id);
+      NoteDbChangeState.applyDelta(
+          change,
+          NoteDbChangeState.Delta.create(
+              id, Optional.empty(), ImmutableMap.of(userId, draftsRef.getObjectId())));
+      db.changes().update(Collections.singleton(change));
+    }
+
+    indexer.index(db, project, id);
+    assertQuery("draftby:" + userId);
+  }
+
+  @Test
+  public void byStarredBy() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    Change change1 = insert(repo, newChange(repo));
+    Change change2 = insert(repo, newChange(repo));
+    insert(repo, newChange(repo));
+
+    gApi.accounts().self().starChange(change1.getId().toString());
+    gApi.accounts().self().starChange(change2.getId().toString());
+
+    int user2 =
+        accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId().get();
+
+    assertQuery("starredby:self", change2, change1);
+    assertQuery("starredby:" + user2);
+  }
+
+  @Test
+  public void byStar() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    Change change1 = insert(repo, newChange(repo));
+    Change change2 = insert(repo, newChangeWithStatus(repo, Change.Status.MERGED));
+    Change change3 = insert(repo, newChangeWithStatus(repo, Change.Status.MERGED));
+    Change change4 = insert(repo, newChange(repo));
+
+    gApi.accounts()
+        .self()
+        .setStars(
+            change1.getId().toString(),
+            new StarsInput(new HashSet<>(Arrays.asList("red", "blue"))));
+    gApi.accounts()
+        .self()
+        .setStars(
+            change2.getId().toString(),
+            new StarsInput(
+                new HashSet<>(Arrays.asList(StarredChangesUtil.DEFAULT_LABEL, "green", "blue"))));
+
+    gApi.accounts()
+        .self()
+        .setStars(
+            change4.getId().toString(), new StarsInput(new HashSet<>(Arrays.asList("ignore"))));
+
+    // check labeled stars
+    assertQuery("star:red", change1);
+    assertQuery("star:blue", change2, change1);
+    assertQuery("has:stars", change4, change2, change1);
+
+    // check default star
+    assertQuery("has:star", change2);
+    assertQuery("is:starred", change2);
+    assertQuery("starredby:self", change2);
+    assertQuery("star:" + StarredChangesUtil.DEFAULT_LABEL, change2);
+
+    // check ignored
+    assertQuery("is:ignored", change4);
+    assertQuery("-is:ignored", change3, change2, change1);
+  }
+
+  @Test
+  public void byIgnore() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    Account.Id user2 =
+        accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId();
+    Change change1 = insert(repo, newChange(repo), user2);
+    Change change2 = insert(repo, newChange(repo), user2);
+
+    gApi.changes().id(change1.getId().toString()).ignore(true);
+    assertQuery("is:ignored", change1);
+    assertQuery("-is:ignored", change2);
+
+    gApi.changes().id(change1.getId().toString()).ignore(false);
+    assertQuery("is:ignored");
+    assertQuery("-is:ignored", change2, change1);
+  }
+
+  @Test
+  public void byFrom() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    Change change1 = insert(repo, newChange(repo));
+
+    Account.Id user2 =
+        accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId();
+    Change change2 = insert(repo, newChange(repo), user2);
+
+    ReviewInput input = new ReviewInput();
+    input.message = "toplevel";
+    ReviewInput.CommentInput comment = new ReviewInput.CommentInput();
+    comment.line = 1;
+    comment.message = "inline";
+    input.comments =
+        ImmutableMap.<String, List<ReviewInput.CommentInput>>of(
+            Patch.COMMIT_MSG, ImmutableList.<ReviewInput.CommentInput>of(comment));
+    gApi.changes().id(change2.getId().get()).current().review(input);
+
+    assertQuery("from:" + userId.get(), change2, change1);
+    assertQuery("from:" + user2, change2);
+  }
+
+  @Test
+  public void conflicts() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    RevCommit commit1 =
+        repo.parseBody(
+            repo.commit()
+                .add("file1", "contents1")
+                .add("dir/file2", "contents2")
+                .add("dir/file3", "contents3")
+                .create());
+    RevCommit commit2 = repo.parseBody(repo.commit().add("file1", "contents1").create());
+    RevCommit commit3 =
+        repo.parseBody(repo.commit().add("dir/file2", "contents2 different").create());
+    RevCommit commit4 = repo.parseBody(repo.commit().add("file4", "contents4").create());
+    Change change1 = insert(repo, newChangeForCommit(repo, commit1));
+    Change change2 = insert(repo, newChangeForCommit(repo, commit2));
+    Change change3 = insert(repo, newChangeForCommit(repo, commit3));
+    Change change4 = insert(repo, newChangeForCommit(repo, commit4));
+
+    assertQuery("conflicts:" + change1.getId().get(), change3);
+    assertQuery("conflicts:" + change2.getId().get());
+    assertQuery("conflicts:" + change3.getId().get(), change1);
+    assertQuery("conflicts:" + change4.getId().get());
+  }
+
+  @Test
+  public void mergeable() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    RevCommit commit1 = repo.parseBody(repo.commit().add("file1", "contents1").create());
+    RevCommit commit2 = repo.parseBody(repo.commit().add("file1", "contents2").create());
+    Change change1 = insert(repo, newChangeForCommit(repo, commit1));
+    Change change2 = insert(repo, newChangeForCommit(repo, commit2));
+
+    assertQuery("conflicts:" + change1.getId().get(), change2);
+    assertQuery("conflicts:" + change2.getId().get(), change1);
+    assertQuery("is:mergeable", change2, change1);
+
+    gApi.changes().id(change1.getChangeId()).revision("current").review(ReviewInput.approve());
+    gApi.changes().id(change1.getChangeId()).revision("current").submit();
+
+    assertQuery("status:open conflicts:" + change2.getId().get());
+    assertQuery("status:open is:mergeable");
+    assertQuery("status:open -is:mergeable", change2);
+  }
+
+  @Test
+  public void reviewedBy() throws Exception {
+    resetTimeWithClockStep(2, MINUTES);
+    TestRepository<Repo> repo = createProject("repo");
+    Change change1 = insert(repo, newChange(repo));
+    Change change2 = insert(repo, newChange(repo));
+    Change change3 = insert(repo, newChange(repo));
+
+    gApi.changes().id(change1.getId().get()).current().review(new ReviewInput().message("comment"));
+
+    Account.Id user2 =
+        accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId();
+    requestContext.setContext(newRequestContext(user2));
+
+    gApi.changes().id(change2.getId().get()).current().review(new ReviewInput().message("comment"));
+
+    PatchSet.Id ps3_1 = change3.currentPatchSetId();
+    change3 = newPatchSet(repo, change3);
+    assertThat(change3.currentPatchSetId()).isNotEqualTo(ps3_1);
+    // Response to previous patch set still counts as reviewing.
+    gApi.changes()
+        .id(change3.getId().get())
+        .revision(ps3_1.get())
+        .review(new ReviewInput().message("comment"));
+
+    List<ChangeInfo> actual;
+    actual = assertQuery(newQuery("is:reviewed").withOption(REVIEWED), change3, change2);
+    assertThat(actual.get(0).reviewed).isTrue();
+    assertThat(actual.get(1).reviewed).isTrue();
+
+    actual = assertQuery(newQuery("-is:reviewed").withOption(REVIEWED), change1);
+    assertThat(actual.get(0).reviewed).isNull();
+
+    assertQuery("reviewedby:" + userId.get());
+
+    actual =
+        assertQuery(newQuery("reviewedby:" + user2.get()).withOption(REVIEWED), change3, change2);
+    assertThat(actual.get(0).reviewed).isTrue();
+    assertThat(actual.get(1).reviewed).isTrue();
+  }
+
+  @Test
+  public void reviewerAndCc() throws Exception {
+    Account.Id user1 = createAccount("user1");
+    TestRepository<Repo> repo = createProject("repo");
+    Change change1 = insert(repo, newChange(repo));
+    Change change2 = insert(repo, newChange(repo));
+    Change change3 = insert(repo, newChange(repo));
+    insert(repo, newChange(repo));
+
+    AddReviewerInput rin = new AddReviewerInput();
+    rin.reviewer = user1.toString();
+    rin.state = ReviewerState.REVIEWER;
+    gApi.changes().id(change1.getId().get()).addReviewer(rin);
+
+    rin = new AddReviewerInput();
+    rin.reviewer = user1.toString();
+    rin.state = ReviewerState.CC;
+    gApi.changes().id(change2.getId().get()).addReviewer(rin);
+
+    assertQuery("is:reviewer");
+    assertQuery("reviewer:self");
+    gApi.changes().id(change3.getChangeId()).revision("current").review(ReviewInput.recommend());
+    assertQuery("is:reviewer", change3);
+    assertQuery("reviewer:self", change3);
+
+    requestContext.setContext(newRequestContext(user1));
+    if (notesMigration.readChanges()) {
+      assertQuery("reviewer:" + user1, change1);
+      assertQuery("cc:" + user1, change2);
+      assertQuery("is:cc", change2);
+      assertQuery("cc:self", change2);
+    } else {
+      assertQuery("reviewer:" + user1, change2, change1);
+      assertQuery("cc:" + user1);
+      assertQuery("is:cc");
+      assertQuery("cc:self");
+    }
+  }
+
+  @Test
+  public void byReviewed() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    Account.Id otherUser =
+        accountManager.authenticate(AuthRequest.forUser("anotheruser")).getAccountId();
+    Change change1 = insert(repo, newChange(repo));
+    Change change2 = insert(repo, newChange(repo));
+
+    assertQuery("is:reviewed");
+    assertQuery("status:reviewed");
+    assertQuery("-is:reviewed", change2, change1);
+    assertQuery("-status:reviewed", change2, change1);
+
+    requestContext.setContext(newRequestContext(otherUser));
+    gApi.changes().id(change1.getChangeId()).current().review(ReviewInput.recommend());
+
+    assertQuery("is:reviewed", change1);
+    assertQuery("status:reviewed", change1);
+    assertQuery("-is:reviewed", change2);
+    assertQuery("-status:reviewed", change2);
+  }
+
+  @Test
+  public void reviewerin() throws Exception {
+    Account.Id user1 = accountManager.authenticate(AuthRequest.forUser("user1")).getAccountId();
+    Account.Id user2 = accountManager.authenticate(AuthRequest.forUser("user2")).getAccountId();
+    Account.Id user3 = accountManager.authenticate(AuthRequest.forUser("user3")).getAccountId();
+    TestRepository<Repo> repo = createProject("repo");
+
+    Change change1 = insert(repo, newChange(repo));
+    Change change2 = insert(repo, newChange(repo));
+    Change change3 = insert(repo, newChange(repo));
+
+    AddReviewerInput rin = new AddReviewerInput();
+    rin.reviewer = user1.toString();
+    rin.state = ReviewerState.REVIEWER;
+    gApi.changes().id(change1.getId().get()).addReviewer(rin);
+
+    rin = new AddReviewerInput();
+    rin.reviewer = user2.toString();
+    rin.state = ReviewerState.REVIEWER;
+    gApi.changes().id(change2.getId().get()).addReviewer(rin);
+
+    rin = new AddReviewerInput();
+    rin.reviewer = user3.toString();
+    rin.state = ReviewerState.CC;
+    gApi.changes().id(change3.getId().get()).addReviewer(rin);
+
+    String group = gApi.groups().create("foo").get().name;
+    gApi.groups().id(group).addMembers(user2.toString(), user3.toString());
+
+    List<String> members =
+        gApi.groups().id(group).members().stream()
+            .map(a -> a._accountId.toString())
+            .collect(toList());
+    assertThat(members).contains(user2.toString());
+
+    if (notesMigration.readChanges()) {
+      // CC and REVIEWER are separate in NoteDB
+      assertQuery("reviewerin:\"Registered Users\"", change2, change1);
+      assertQuery("reviewerin:" + group, change2);
+    } else {
+      // CC and REVIEWER are the same in ReviewDb
+      assertQuery("reviewerin:\"Registered Users\"", change3, change2, change1);
+      assertQuery("reviewerin:" + group, change3, change2);
+    }
+
+    gApi.changes().id(change2.getId().get()).current().review(ReviewInput.approve());
+    gApi.changes().id(change2.getId().get()).current().submit();
+
+    if (notesMigration.readChanges()) {
+      // CC and REVIEWER are separate in NoteDB
+      assertQuery("reviewerin:" + group, change2);
+      assertQuery("project:repo reviewerin:" + group, change2);
+      assertQuery("status:merged reviewerin:" + group, change2);
+    } else {
+      // CC and REVIEWER are the same in ReviewDb
+      assertQuery("reviewerin:" + group, change2, change3);
+      assertQuery("project:repo reviewerin:" + group, change2, change3);
+      assertQuery("status:merged reviewerin:" + group, change2);
+    }
+  }
+
+  @Test
+  public void reviewerAndCcByEmail() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    Project.NameKey project = new Project.NameKey("repo");
+    TestRepository<Repo> repo = createProject(project.get());
+    ConfigInput conf = new ConfigInput();
+    conf.enableReviewerByEmail = InheritableBoolean.TRUE;
+    gApi.projects().name(project.get()).config(conf);
+
+    String userByEmail = "un.registered@reviewer.com";
+    String userByEmailWithName = "John Doe <" + userByEmail + ">";
+
+    Change change1 = insert(repo, newChange(repo));
+    Change change2 = insert(repo, newChange(repo));
+    insert(repo, newChange(repo));
+
+    AddReviewerInput rin = new AddReviewerInput();
+    rin.reviewer = userByEmailWithName;
+    rin.state = ReviewerState.REVIEWER;
+    gApi.changes().id(change1.getId().get()).addReviewer(rin);
+
+    rin = new AddReviewerInput();
+    rin.reviewer = userByEmailWithName;
+    rin.state = ReviewerState.CC;
+    gApi.changes().id(change2.getId().get()).addReviewer(rin);
+
+    if (getSchemaVersion() >= 41) {
+      assertQuery("reviewer:\"" + userByEmailWithName + "\"", change1);
+      assertQuery("cc:\"" + userByEmailWithName + "\"", change2);
+
+      // Omitting the name:
+      assertQuery("reviewer:\"" + userByEmail + "\"", change1);
+      assertQuery("cc:\"" + userByEmail + "\"", change2);
+    } else {
+      assertMissingField(ChangeField.REVIEWER_BY_EMAIL);
+
+      assertFailingQuery(
+          "reviewer:\"" + userByEmailWithName + "\"", "User " + userByEmailWithName + " not found");
+      assertFailingQuery(
+          "cc:\"" + userByEmailWithName + "\"", "User " + userByEmailWithName + " not found");
+
+      // Omitting the name:
+      assertFailingQuery("reviewer:\"" + userByEmail + "\"", "User " + userByEmail + " not found");
+      assertFailingQuery("cc:\"" + userByEmail + "\"", "User " + userByEmail + " not found");
+    }
+  }
+
+  @Test
+  public void reviewerAndCcByEmailWithQueryForDifferentUser() throws Exception {
+    assume().that(notesMigration.readChanges()).isTrue();
+
+    Project.NameKey project = new Project.NameKey("repo");
+    TestRepository<Repo> repo = createProject(project.get());
+    ConfigInput conf = new ConfigInput();
+    conf.enableReviewerByEmail = InheritableBoolean.TRUE;
+    gApi.projects().name(project.get()).config(conf);
+
+    String userByEmail = "John Doe <un.registered@reviewer.com>";
+
+    Change change1 = insert(repo, newChange(repo));
+    Change change2 = insert(repo, newChange(repo));
+    insert(repo, newChange(repo));
+
+    AddReviewerInput rin = new AddReviewerInput();
+    rin.reviewer = userByEmail;
+    rin.state = ReviewerState.REVIEWER;
+    gApi.changes().id(change1.getId().get()).addReviewer(rin);
+
+    rin = new AddReviewerInput();
+    rin.reviewer = userByEmail;
+    rin.state = ReviewerState.CC;
+    gApi.changes().id(change2.getId().get()).addReviewer(rin);
+
+    if (getSchemaVersion() >= 41) {
+      assertQuery("reviewer:\"someone@example.com\"");
+      assertQuery("cc:\"someone@example.com\"");
+    } else {
+      assertMissingField(ChangeField.REVIEWER_BY_EMAIL);
+
+      String someoneEmail = "someone@example.com";
+      assertFailingQuery(
+          "reviewer:\"" + someoneEmail + "\"", "User " + someoneEmail + " not found");
+      assertFailingQuery("cc:\"" + someoneEmail + "\"", "User " + someoneEmail + " not found");
+    }
+  }
+
+  @Test
+  public void submitRecords() throws Exception {
+    Account.Id user1 = createAccount("user1");
+    TestRepository<Repo> repo = createProject("repo");
+    Change change1 = insert(repo, newChange(repo));
+    Change change2 = insert(repo, newChange(repo));
+
+    gApi.changes().id(change1.getId().get()).current().review(ReviewInput.approve());
+    requestContext.setContext(newRequestContext(user1));
+    gApi.changes().id(change2.getId().get()).current().review(ReviewInput.recommend());
+    requestContext.setContext(newRequestContext(user.getAccountId()));
+
+    assertQuery("is:submittable", change1);
+    assertQuery("-is:submittable", change2);
+    assertQuery("submittable:ok", change1);
+    assertQuery("submittable:not_ready", change2);
+
+    assertQuery("label:CodE-RevieW=ok", change1);
+    assertQuery("label:CodE-RevieW=ok,user=user", change1);
+    assertQuery("label:CodE-RevieW=ok,Administrators", change1);
+    assertQuery("label:CodE-RevieW=ok,group=Administrators", change1);
+    assertQuery("label:CodE-RevieW=ok,owner", change1);
+    assertQuery("label:CodE-RevieW=ok,user1");
+    assertQuery("label:CodE-RevieW=need", change2);
+    // NEED records don't have associated users.
+    assertQuery("label:CodE-RevieW=need,user1");
+    assertQuery("label:CodE-RevieW=need,user");
+
+    gApi.changes().id(change1.getId().get()).current().submit();
+    assertQuery("submittable:ok");
+    assertQuery("submittable:closed", change1);
+  }
+
+  @Test
+  public void hasEdit() throws Exception {
+    Account.Id user1 = createAccount("user1");
+    Account.Id user2 = createAccount("user2");
+    TestRepository<Repo> repo = createProject("repo");
+    Change change1 = insert(repo, newChange(repo));
+    String changeId1 = change1.getKey().get();
+    Change change2 = insert(repo, newChange(repo));
+    String changeId2 = change2.getKey().get();
+
+    requestContext.setContext(newRequestContext(user1));
+    assertQuery("has:edit");
+    gApi.changes().id(changeId1).edit().create();
+    gApi.changes().id(changeId2).edit().create();
+
+    requestContext.setContext(newRequestContext(user2));
+    assertQuery("has:edit");
+    gApi.changes().id(changeId2).edit().create();
+
+    requestContext.setContext(newRequestContext(user1));
+    assertQuery("has:edit", change2, change1);
+
+    requestContext.setContext(newRequestContext(user2));
+    assertQuery("has:edit", change2);
+  }
+
+  @Test
+  public void byUnresolved() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    Change change1 = insert(repo, newChange(repo));
+    Change change2 = insert(repo, newChange(repo));
+    Change change3 = insert(repo, newChange(repo));
+
+    // Change1 has one resolved comment (unresolvedcount = 0)
+    // Change2 has one unresolved comment (unresolvedcount = 1)
+    // Change3 has one resolved comment and one unresolved comment (unresolvedcount = 1)
+    addComment(change1.getChangeId(), "comment 1", false);
+    addComment(change2.getChangeId(), "comment 2", true);
+    addComment(change3.getChangeId(), "comment 3", false);
+    addComment(change3.getChangeId(), "comment 4", true);
+
+    assertQuery("has:unresolved", change3, change2);
+
+    assertQuery("unresolved:0", change1);
+    List<ChangeInfo> changeInfos = assertQuery("unresolved:>=0", change3, change2, change1);
+    assertThat(changeInfos.get(0).unresolvedCommentCount).isEqualTo(1); // Change3
+    assertThat(changeInfos.get(1).unresolvedCommentCount).isEqualTo(1); // Change2
+    assertThat(changeInfos.get(2).unresolvedCommentCount).isEqualTo(0); // Change1
+    assertQuery("unresolved:>0", change3, change2);
+
+    assertQuery("unresolved:<1", change1);
+    assertQuery("unresolved:<=1", change3, change2, change1);
+    assertQuery("unresolved:1", change3, change2);
+    assertQuery("unresolved:>1");
+    assertQuery("unresolved:>=1", change3, change2);
+  }
+
+  @Test
+  public void byCommitsOnBranchNotMerged() throws Exception {
+    TestRepository<Repo> tr = createProject("repo");
+    testByCommitsOnBranchNotMerged(tr, ImmutableSet.of());
+  }
+
+  @Test
+  public void byCommitsOnBranchNotMergedSkipsMissingChanges() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    ObjectId missing =
+        repo.branch(new PatchSet.Id(new Change.Id(987654), 1).toRefName())
+            .commit()
+            .message("No change for this commit")
+            .insertChangeId()
+            .create()
+            .copy();
+    testByCommitsOnBranchNotMerged(repo, ImmutableSet.of(missing));
+  }
+
+  private void testByCommitsOnBranchNotMerged(TestRepository<Repo> repo, Collection<ObjectId> extra)
+      throws Exception {
+    int n = 10;
+    List<String> shas = new ArrayList<>(n + extra.size());
+    extra.forEach(i -> shas.add(i.name()));
+    List<Integer> expectedIds = new ArrayList<>(n);
+    Branch.NameKey dest = null;
+    for (int i = 0; i < n; i++) {
+      ChangeInserter ins = newChange(repo);
+      insert(repo, ins);
+      if (dest == null) {
+        dest = ins.getChange().getDest();
+      }
+      shas.add(ins.getCommitId().name());
+      expectedIds.add(ins.getChange().getId().get());
+    }
+
+    for (int i = 1; i <= 11; i++) {
+      Iterable<ChangeData> cds =
+          queryProvider.get().byCommitsOnBranchNotMerged(repo.getRepository(), db, dest, shas, i);
+      Iterable<Integer> ids = FluentIterable.from(cds).transform(in -> in.getId().get());
+      String name = "limit " + i;
+      assertThat(ids).named(name).hasSize(n);
+      assertThat(ids).named(name).containsExactlyElementsIn(expectedIds);
+    }
+  }
+
+  @Test
+  public void prepopulatedFields() throws Exception {
+    assume().that(notesMigration.readChanges()).isFalse();
+    TestRepository<Repo> repo = createProject("repo");
+    Change change = insert(repo, newChange(repo));
+
+    db = new DisabledReviewDb();
+    requestContext.setContext(newRequestContext(userId));
+    // Use QueryProcessor directly instead of API so we get ChangeDatas back.
+    List<ChangeData> cds =
+        queryProcessorProvider
+            .get()
+            .query(queryBuilder.parse(change.getId().toString()))
+            .entities();
+    assertThat(cds).hasSize(1);
+
+    ChangeData cd = cds.get(0);
+    cd.change();
+    cd.patchSets();
+    cd.currentApprovals();
+    cd.changedLines();
+    cd.reviewedBy();
+    cd.reviewers();
+    cd.unresolvedCommentCount();
+
+    // TODO(dborowitz): Swap out GitRepositoryManager somehow? Will probably be
+    // necessary for NoteDb anyway.
+    cd.isMergeable();
+
+    exception.expect(DisabledReviewDb.Disabled.class);
+    cd.messages();
+  }
+
+  @Test
+  public void prepopulateOnlyRequestedFields() throws Exception {
+    assume().that(notesMigration.readChanges()).isFalse();
+    TestRepository<Repo> repo = createProject("repo");
+    Change change = insert(repo, newChange(repo));
+
+    db = new DisabledReviewDb();
+    requestContext.setContext(newRequestContext(userId));
+    // Use QueryProcessor directly instead of API so we get ChangeDatas back.
+    List<ChangeData> cds =
+        queryProcessorProvider
+            .get()
+            .setRequestedFields(
+                ImmutableSet.of(ChangeField.PATCH_SET.getName(), ChangeField.CHANGE.getName()))
+            .query(queryBuilder.parse(change.getId().toString()))
+            .entities();
+    assertThat(cds).hasSize(1);
+
+    ChangeData cd = cds.get(0);
+    cd.change();
+    cd.patchSets();
+
+    exception.expect(DisabledReviewDb.Disabled.class);
+    cd.currentApprovals();
+  }
+
+  @Test
+  public void reindexIfStale() throws Exception {
+    Account.Id user = createAccount("user");
+    Project.NameKey project = new Project.NameKey("repo");
+    TestRepository<Repo> repo = createProject(project.get());
+    Change change = insert(repo, newChange(repo));
+    String changeId = change.getKey().get();
+    ChangeNotes notes = notesFactory.create(db, change.getProject(), change.getId());
+    PatchSet ps = psUtil.get(db, notes, change.currentPatchSetId());
+
+    requestContext.setContext(newRequestContext(user));
+    gApi.changes().id(changeId).edit().create();
+    assertQuery("has:edit", change);
+    assertThat(indexer.reindexIfStale(project, change.getId()).get()).isFalse();
+
+    // Delete edit ref behind index's back.
+    RefUpdate ru =
+        repo.getRepository().updateRef(RefNames.refsEdit(user, change.getId(), ps.getId()));
+    ru.setForceUpdate(true);
+    assertThat(ru.delete()).isEqualTo(RefUpdate.Result.FORCED);
+
+    // Index is stale.
+    assertQuery("has:edit", change);
+    assertThat(indexer.reindexIfStale(project, change.getId()).get()).isTrue();
+    assertQuery("has:edit");
+  }
+
+  @Test
+  public void refStateFields() throws Exception {
+    // This test method manages primary storage manually.
+    assume().that(notesMigration.changePrimaryStorage()).isEqualTo(PrimaryStorage.REVIEW_DB);
+    Account.Id user = createAccount("user");
+    Project.NameKey project = new Project.NameKey("repo");
+    TestRepository<Repo> repo = createProject(project.get());
+    String path = "file";
+    RevCommit commit = repo.parseBody(repo.commit().message("one").add(path, "contents").create());
+    Change change = insert(repo, newChangeForCommit(repo, commit));
+    Change.Id id = change.getId();
+    int c = id.get();
+    String changeId = change.getKey().get();
+    requestContext.setContext(newRequestContext(user));
+
+    // Ensure one of each type of supported ref is present for the change. If
+    // any more refs are added, update this test to reflect them.
+
+    // Edit
+    gApi.changes().id(changeId).edit().create();
+
+    // Star
+    gApi.accounts().self().starChange(change.getId().toString());
+
+    if (notesMigration.readChanges()) {
+      // Robot comment.
+      ReviewInput rin = new ReviewInput();
+      RobotCommentInput rcin = new RobotCommentInput();
+      rcin.robotId = "happyRobot";
+      rcin.robotRunId = "1";
+      rcin.line = 1;
+      rcin.message = "nit: trailing whitespace";
+      rcin.path = path;
+      rin.robotComments = ImmutableMap.of(path, ImmutableList.of(rcin));
+      gApi.changes().id(c).current().review(rin);
+    }
+
+    // Draft.
+    DraftInput din = new DraftInput();
+    din.path = path;
+    din.line = 1;
+    din.message = "draft";
+    gApi.changes().id(c).current().createDraft(din);
+
+    if (notesMigration.readChanges()) {
+      // Force NoteDb primary.
+      change = ReviewDbUtil.unwrapDb(db).changes().get(id);
+      change.setNoteDbState(NoteDbChangeState.NOTE_DB_PRIMARY_STATE);
+      ReviewDbUtil.unwrapDb(db).changes().update(Collections.singleton(change));
+      indexer.index(db, change);
+    }
+
+    QueryOptions opts =
+        IndexedChangeQuery.createOptions(indexConfig, 0, 1, StalenessChecker.FIELDS);
+    ChangeData cd = indexes.getSearchIndex().get(id, opts).get();
+
+    String cs = RefNames.shard(c);
+    int u = user.get();
+    String us = RefNames.shard(u);
+
+    List<String> expectedStates =
+        Lists.newArrayList(
+            "repo:refs/users/" + us + "/edit-" + c + "/1",
+            "All-Users:refs/starred-changes/" + cs + "/" + u);
+    if (notesMigration.readChanges()) {
+      expectedStates.add("repo:refs/changes/" + cs + "/meta");
+      expectedStates.add("repo:refs/changes/" + cs + "/robot-comments");
+      expectedStates.add("All-Users:refs/draft-comments/" + cs + "/" + u);
+    }
+    assertThat(
+            cd.getRefStates().stream()
+                .map(String::new)
+                // Omit SHA-1, we're just concerned with the project/ref names.
+                .map(s -> s.substring(0, s.lastIndexOf(':')))
+                .collect(toList()))
+        .containsExactlyElementsIn(expectedStates);
+
+    List<String> expectedPatterns = Lists.newArrayList("repo:refs/users/*/edit-" + c + "/*");
+    expectedPatterns.add("All-Users:refs/starred-changes/" + cs + "/*");
+    if (notesMigration.readChanges()) {
+      expectedPatterns.add("All-Users:refs/draft-comments/" + cs + "/*");
+    }
+    assertThat(cd.getRefStatePatterns().stream().map(String::new).collect(toList()))
+        .containsExactlyElementsIn(expectedPatterns);
+  }
+
+  @Test
+  public void watched() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    ChangeInserter ins1 = newChangeWithStatus(repo, Change.Status.NEW);
+    Change change1 = insert(repo, ins1);
+
+    TestRepository<Repo> repo2 = createProject("repo2");
+
+    ChangeInserter ins2 = newChangeWithStatus(repo2, Change.Status.NEW);
+    insert(repo2, ins2);
+
+    assertQuery("is:watched");
+    assertQuery("watchedby:self");
+
+    List<ProjectWatchInfo> projectsToWatch = new ArrayList<>();
+    ProjectWatchInfo pwi = new ProjectWatchInfo();
+    pwi.project = "repo";
+    pwi.filter = null;
+    pwi.notifyAbandonedChanges = true;
+    pwi.notifyNewChanges = true;
+    pwi.notifyAllComments = true;
+    projectsToWatch.add(pwi);
+    gApi.accounts().self().setWatchedProjects(projectsToWatch);
+    resetUser();
+
+    assertQuery("is:watched", change1);
+    assertQuery("watchedby:self", change1);
+  }
+
+  @Test
+  public void trackingid() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    RevCommit commit1 =
+        repo.parseBody(repo.commit().message("Change one\n\nBug:QUERY123").create());
+    Change change1 = insert(repo, newChangeForCommit(repo, commit1));
+    RevCommit commit2 =
+        repo.parseBody(repo.commit().message("Change two\n\nFeature:QUERY456").create());
+    Change change2 = insert(repo, newChangeForCommit(repo, commit2));
+
+    assertQuery("tr:QUERY123", change1);
+    assertQuery("bug:QUERY123", change1);
+    assertQuery("tr:QUERY456", change2);
+    assertQuery("bug:QUERY456", change2);
+    assertQuery("tr:QUERY-123");
+    assertQuery("bug:QUERY-123");
+    assertQuery("tr:QUERY12");
+    assertQuery("bug:QUERY12");
+    assertQuery("tr:QUERY789");
+    assertQuery("bug:QUERY789");
+  }
+
+  @Test
+  public void selfAndMe() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    Change change1 = insert(repo, newChange(repo));
+    Change change2 = insert(repo, newChange(repo), userId);
+    insert(repo, newChange(repo));
+    gApi.accounts().self().starChange(change1.getId().toString());
+    gApi.accounts().self().starChange(change2.getId().toString());
+
+    assertQuery("starredby:self", change2, change1);
+    assertQuery("starredby:me", change2, change1);
+  }
+
+  @Test
+  public void defaultFieldWithManyUsers() throws Exception {
+    for (int i = 0; i < ChangeQueryBuilder.MAX_ACCOUNTS_PER_DEFAULT_FIELD * 2; i++) {
+      createAccount("user" + i, "User " + i, "user" + i + "@example.com", true);
+    }
+    assertQuery("us");
+  }
+
+  @Test
+  public void revertOf() throws Exception {
+    if (getSchemaVersion() < 45) {
+      assertMissingField(ChangeField.REVERT_OF);
+      assertFailingQuery(
+          "revertof:1", "'revertof' operator is not supported by change index version");
+      return;
+    }
+
+    TestRepository<Repo> repo = createProject("repo");
+    // Create two commits and revert second commit (initial commit can't be reverted)
+    Change initial = insert(repo, newChange(repo));
+    gApi.changes().id(initial.getChangeId()).current().review(ReviewInput.approve());
+    gApi.changes().id(initial.getChangeId()).current().submit();
+
+    ChangeInfo changeToRevert =
+        gApi.changes().create(new ChangeInput("repo", "master", "commit to revert")).get();
+    gApi.changes().id(changeToRevert.id).current().review(ReviewInput.approve());
+    gApi.changes().id(changeToRevert.id).current().submit();
+
+    ChangeInfo changeThatReverts = gApi.changes().id(changeToRevert.id).revert().get();
+    assertQueryByIds(
+        "revertof:" + changeToRevert._number, new Change.Id(changeThatReverts._number));
+  }
+
+  /** Change builder for helping in tests for dashboard sections. */
+  protected class DashboardChangeState {
+    private final Account.Id ownerId;
+    private final List<Account.Id> reviewedBy;
+    private final List<Account.Id> cced;
+    private final List<Account.Id> ignoredBy;
+    private final List<Account.Id> draftCommentBy;
+    private final List<Account.Id> deleteDraftCommentBy;
+    private boolean wip;
+    private boolean abandoned;
+    @Nullable private Account.Id mergedBy;
+    @Nullable private Account.Id assigneeId;
+
+    @Nullable Change.Id id;
+
+    DashboardChangeState(Account.Id ownerId) {
+      this.ownerId = ownerId;
+      reviewedBy = new ArrayList<>();
+      cced = new ArrayList<>();
+      ignoredBy = new ArrayList<>();
+      draftCommentBy = new ArrayList<>();
+      deleteDraftCommentBy = new ArrayList<>();
+    }
+
+    DashboardChangeState assignTo(Account.Id assigneeId) {
+      this.assigneeId = assigneeId;
+      return this;
+    }
+
+    DashboardChangeState wip() {
+      wip = true;
+      return this;
+    }
+
+    DashboardChangeState abandon() {
+      abandoned = true;
+      return this;
+    }
+
+    DashboardChangeState mergeBy(Account.Id mergedBy) {
+      this.mergedBy = mergedBy;
+      return this;
+    }
+
+    DashboardChangeState ignoreBy(Account.Id ignorerId) {
+      ignoredBy.add(ignorerId);
+      return this;
+    }
+
+    DashboardChangeState addReviewer(Account.Id reviewerId) {
+      reviewedBy.add(reviewerId);
+      return this;
+    }
+
+    DashboardChangeState addCc(Account.Id ccId) {
+      cced.add(ccId);
+      return this;
+    }
+
+    DashboardChangeState draftCommentBy(Account.Id commenterId) {
+      draftCommentBy.add(commenterId);
+      return this;
+    }
+
+    DashboardChangeState draftAndDeleteCommentBy(Id commenterId) {
+      deleteDraftCommentBy.add(commenterId);
+      return this;
+    }
+
+    DashboardChangeState create(TestRepository<Repo> repo) throws Exception {
+      requestContext.setContext(newRequestContext(ownerId));
+      Change change = insert(repo, newChange(repo), ownerId);
+      id = change.getId();
+      ChangeApi cApi = gApi.changes().id(change.getChangeId());
+      if (assigneeId != null) {
+        AssigneeInput in = new AssigneeInput();
+        in.assignee = "" + assigneeId;
+        cApi.setAssignee(in);
+      }
+      if (wip) {
+        cApi.setWorkInProgress();
+      }
+      if (abandoned) {
+        cApi.abandon();
+      }
+      for (Account.Id reviewerId : reviewedBy) {
+        cApi.addReviewer("" + reviewerId);
+      }
+      for (Account.Id reviewerId : cced) {
+        AddReviewerInput in = new AddReviewerInput();
+        in.reviewer = reviewerId.toString();
+        in.state = ReviewerState.CC;
+        cApi.addReviewer(in);
+      }
+      for (Account.Id ignorerId : ignoredBy) {
+        requestContext.setContext(newRequestContext(ignorerId));
+        StarsInput in = new StarsInput(new HashSet<>(Arrays.asList("ignore")));
+        gApi.accounts().self().setStars("" + id, in);
+      }
+      DraftInput in = new DraftInput();
+      in.path = Patch.COMMIT_MSG;
+      in.message = "message";
+      for (Account.Id commenterId : draftCommentBy) {
+        requestContext.setContext(newRequestContext(commenterId));
+        gApi.changes().id(change.getChangeId()).current().createDraft(in);
+      }
+      for (Account.Id commenterId : deleteDraftCommentBy) {
+        requestContext.setContext(newRequestContext(commenterId));
+        gApi.changes().id(change.getChangeId()).current().createDraft(in).delete();
+      }
+      if (mergedBy != null) {
+        requestContext.setContext(newRequestContext(mergedBy));
+        cApi = gApi.changes().id(change.getChangeId());
+        cApi.current().review(ReviewInput.approve());
+        cApi.current().submit();
+      }
+      requestContext.setContext(newRequestContext(user.getAccountId()));
+      return this;
+    }
+  }
+
+  protected List<ChangeInfo> assertDashboardQuery(
+      String viewedUser, String query, DashboardChangeState... expected) throws Exception {
+    Change.Id[] ids = new Change.Id[expected.length];
+    for (int i = 0; i < expected.length; i++) {
+      ids[i] = expected[i].id;
+    }
+    return assertQueryByIds(query.replaceAll("\\$\\{user}", viewedUser), ids);
+  }
+
+  @Test
+  public void dashboardHasUnpublishedDrafts() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    Account.Id otherAccountId = createAccount("other");
+    DashboardChangeState hasUnpublishedDraft =
+        new DashboardChangeState(otherAccountId).draftCommentBy(user.getAccountId()).create(repo);
+
+    // Create changes that should not be returned by query.
+    new DashboardChangeState(user.getAccountId()).create(repo);
+    new DashboardChangeState(user.getAccountId()).draftCommentBy(otherAccountId).create(repo);
+    new DashboardChangeState(user.getAccountId())
+        .draftAndDeleteCommentBy(user.getAccountId())
+        .create(repo);
+
+    assertDashboardQuery("self", DASHBOARD_HAS_UNPUBLISHED_DRAFTS_QUERY, hasUnpublishedDraft);
+  }
+
+  @Test
+  public void dashboardAssignedReviews() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    Account.Id otherAccountId = createAccount("other");
+    DashboardChangeState otherOpenWip =
+        new DashboardChangeState(otherAccountId).wip().assignTo(user.getAccountId()).create(repo);
+    DashboardChangeState selfOpenWip =
+        new DashboardChangeState(user.getAccountId())
+            .wip()
+            .assignTo(user.getAccountId())
+            .create(repo);
+
+    // Create changes that should not be returned by query.
+    new DashboardChangeState(user.getAccountId()).assignTo(user.getAccountId()).abandon();
+    new DashboardChangeState(user.getAccountId())
+        .assignTo(user.getAccountId())
+        .ignoreBy(user.getAccountId());
+    new DashboardChangeState(user.getAccountId())
+        .assignTo(user.getAccountId())
+        .mergeBy(user.getAccountId());
+
+    assertDashboardQuery("self", DASHBOARD_ASSIGNED_QUERY, selfOpenWip, otherOpenWip);
+
+    // Viewing another user's dashboard.
+    requestContext.setContext(newRequestContext(otherAccountId));
+    assertDashboardQuery(user.getUserName().get(), DASHBOARD_ASSIGNED_QUERY, otherOpenWip);
+  }
+
+  @Test
+  public void dashboardWorkInProgressReviews() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    DashboardChangeState ownedOpenWip =
+        new DashboardChangeState(user.getAccountId()).wip().create(repo);
+
+    // Create changes that should not be returned by query.
+    new DashboardChangeState(user.getAccountId()).wip().abandon().create(repo);
+    new DashboardChangeState(user.getAccountId()).mergeBy(user.getAccountId()).create(repo);
+    new DashboardChangeState(createAccount("other")).wip().create(repo);
+
+    assertDashboardQuery("self", DASHBOARD_WORK_IN_PROGRESS_QUERY, ownedOpenWip);
+  }
+
+  @Test
+  public void dashboardOutgoingReviews() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    Account.Id otherAccountId = createAccount("other");
+    DashboardChangeState ownedOpenReviewable =
+        new DashboardChangeState(user.getAccountId()).create(repo);
+    DashboardChangeState ownedOpenReviewableIgnoredByOther =
+        new DashboardChangeState(user.getAccountId()).ignoreBy(otherAccountId).create(repo);
+
+    // Create changes that should not be returned by any queries in this test.
+    new DashboardChangeState(user.getAccountId()).wip().create(repo);
+    new DashboardChangeState(otherAccountId).create(repo);
+
+    // Viewing one's own dashboard.
+    assertDashboardQuery(
+        "self", DASHBOARD_OUTGOING_QUERY, ownedOpenReviewableIgnoredByOther, ownedOpenReviewable);
+
+    // Viewing another user's dashboard.
+    requestContext.setContext(newRequestContext(otherAccountId));
+    assertDashboardQuery(user.getUserName().get(), DASHBOARD_OUTGOING_QUERY, ownedOpenReviewable);
+  }
+
+  @Test
+  public void dashboardIncomingReviews() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    Account.Id otherAccountId = createAccount("other");
+    DashboardChangeState reviewingReviewable =
+        new DashboardChangeState(otherAccountId).addReviewer(user.getAccountId()).create(repo);
+    DashboardChangeState reviewingReviewableIgnoredByReviewer =
+        new DashboardChangeState(otherAccountId)
+            .addReviewer(user.getAccountId())
+            .ignoreBy(user.getAccountId())
+            .create(repo);
+    DashboardChangeState assignedReviewable =
+        new DashboardChangeState(otherAccountId).assignTo(user.getAccountId()).create(repo);
+    DashboardChangeState assignedReviewableIgnoredByAssignee =
+        new DashboardChangeState(otherAccountId)
+            .assignTo(user.getAccountId())
+            .ignoreBy(user.getAccountId())
+            .create(repo);
+
+    // Create changes that should not be returned by any queries in this test.
+    new DashboardChangeState(otherAccountId).wip().addReviewer(user.getAccountId()).create(repo);
+    new DashboardChangeState(otherAccountId).wip().assignTo(user.getAccountId()).create(repo);
+    new DashboardChangeState(otherAccountId).addReviewer(otherAccountId).create(repo);
+    new DashboardChangeState(otherAccountId)
+        .addReviewer(user.getAccountId())
+        .mergeBy(user.getAccountId())
+        .create(repo);
+
+    // Viewing one's own dashboard.
+    assertDashboardQuery("self", DASHBOARD_INCOMING_QUERY, assignedReviewable, reviewingReviewable);
+
+    // Viewing another user's dashboard.
+    requestContext.setContext(newRequestContext(otherAccountId));
+    assertDashboardQuery(
+        user.getUserName().get(),
+        DASHBOARD_INCOMING_QUERY,
+        assignedReviewableIgnoredByAssignee,
+        assignedReviewable,
+        reviewingReviewableIgnoredByReviewer,
+        reviewingReviewable);
+  }
+
+  @Test
+  public void dashboardRecentlyClosedReviews() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    Account.Id otherAccountId = createAccount("other");
+    DashboardChangeState mergedOwned =
+        new DashboardChangeState(user.getAccountId()).mergeBy(user.getAccountId()).create(repo);
+    DashboardChangeState mergedOwnedIgnoredByOther =
+        new DashboardChangeState(user.getAccountId())
+            .ignoreBy(otherAccountId)
+            .mergeBy(user.getAccountId())
+            .create(repo);
+    DashboardChangeState mergedReviewing =
+        new DashboardChangeState(otherAccountId)
+            .addReviewer(user.getAccountId())
+            .mergeBy(user.getAccountId())
+            .create(repo);
+    DashboardChangeState mergedReviewingIgnoredByUser =
+        new DashboardChangeState(otherAccountId)
+            .addReviewer(user.getAccountId())
+            .ignoreBy(user.getAccountId())
+            .mergeBy(user.getAccountId())
+            .create(repo);
+    DashboardChangeState mergedCced =
+        new DashboardChangeState(otherAccountId)
+            .addCc(user.getAccountId())
+            .mergeBy(user.getAccountId())
+            .create(repo);
+    DashboardChangeState mergedAssigned =
+        new DashboardChangeState(otherAccountId)
+            .assignTo(user.getAccountId())
+            .mergeBy(user.getAccountId())
+            .create(repo);
+    DashboardChangeState mergedAssignedIgnoredByUser =
+        new DashboardChangeState(otherAccountId)
+            .assignTo(user.getAccountId())
+            .ignoreBy(user.getAccountId())
+            .mergeBy(user.getAccountId())
+            .create(repo);
+    DashboardChangeState abandonedOwned =
+        new DashboardChangeState(user.getAccountId()).abandon().create(repo);
+    DashboardChangeState abandonedOwnedIgnoredByOther =
+        new DashboardChangeState(user.getAccountId())
+            .ignoreBy(otherAccountId)
+            .abandon()
+            .create(repo);
+    DashboardChangeState abandonedOwnedWip =
+        new DashboardChangeState(user.getAccountId()).wip().abandon().create(repo);
+    DashboardChangeState abandonedOwnedWipIgnoredByOther =
+        new DashboardChangeState(user.getAccountId())
+            .ignoreBy(otherAccountId)
+            .wip()
+            .abandon()
+            .create(repo);
+    DashboardChangeState abandonedReviewing =
+        new DashboardChangeState(otherAccountId)
+            .addReviewer(user.getAccountId())
+            .abandon()
+            .create(repo);
+    DashboardChangeState abandonedReviewingIgnoredByUser =
+        new DashboardChangeState(otherAccountId)
+            .addReviewer(user.getAccountId())
+            .ignoreBy(user.getAccountId())
+            .abandon()
+            .create(repo);
+    DashboardChangeState abandonedAssigned =
+        new DashboardChangeState(otherAccountId)
+            .assignTo(user.getAccountId())
+            .abandon()
+            .create(repo);
+    DashboardChangeState abandonedAssignedIgnoredByUser =
+        new DashboardChangeState(otherAccountId)
+            .assignTo(user.getAccountId())
+            .ignoreBy(user.getAccountId())
+            .abandon()
+            .create(repo);
+    DashboardChangeState abandonedAssignedWip =
+        new DashboardChangeState(otherAccountId)
+            .assignTo(user.getAccountId())
+            .wip()
+            .abandon()
+            .create(repo);
+    DashboardChangeState abandonedAssignedWipIgnoredByUser =
+        new DashboardChangeState(otherAccountId)
+            .assignTo(user.getAccountId())
+            .ignoreBy(user.getAccountId())
+            .wip()
+            .abandon()
+            .create(repo);
+
+    // Create changes that should not be returned by any queries in this test.
+    new DashboardChangeState(otherAccountId)
+        .addReviewer(user.getAccountId())
+        .wip()
+        .abandon()
+        .create(repo);
+    new DashboardChangeState(otherAccountId)
+        .addReviewer(user.getAccountId())
+        .ignoreBy(user.getAccountId())
+        .wip()
+        .abandon()
+        .create(repo);
+
+    // Viewing one's own dashboard.
+    assertDashboardQuery(
+        "self",
+        DASHBOARD_RECENTLY_CLOSED_QUERY,
+        abandonedAssigned,
+        abandonedReviewing,
+        abandonedOwnedWipIgnoredByOther,
+        abandonedOwnedWip,
+        abandonedOwnedIgnoredByOther,
+        abandonedOwned,
+        mergedAssigned,
+        mergedCced,
+        mergedReviewing,
+        mergedOwnedIgnoredByOther,
+        mergedOwned);
+
+    // Viewing another user's dashboard.
+    requestContext.setContext(newRequestContext(otherAccountId));
+    assertDashboardQuery(
+        user.getUserName().get(),
+        DASHBOARD_RECENTLY_CLOSED_QUERY,
+        abandonedAssignedWipIgnoredByUser,
+        abandonedAssignedWip,
+        abandonedAssignedIgnoredByUser,
+        abandonedAssigned,
+        abandonedReviewingIgnoredByUser,
+        abandonedReviewing,
+        abandonedOwned,
+        mergedAssignedIgnoredByUser,
+        mergedAssigned,
+        mergedCced,
+        mergedReviewingIgnoredByUser,
+        mergedReviewing,
+        mergedOwned);
+  }
+
+  @Test
+  public void assignee() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    Change change1 = insert(repo, newChange(repo));
+    Change change2 = insert(repo, newChange(repo));
+
+    AssigneeInput input = new AssigneeInput();
+    input.assignee = user.getUserName().get();
+    gApi.changes().id(change1.getChangeId()).setAssignee(input);
+
+    assertQuery("is:assigned", change1);
+    assertQuery("-is:assigned", change2);
+    assertQuery("is:unassigned", change2);
+    assertQuery("-is:unassigned", change1);
+    assertQuery("assignee:" + user.getUserName().get(), change1);
+    assertQuery("-assignee:" + user.getUserName().get(), change2);
+  }
+
+  @Test
+  public void userDestination() throws Exception {
+    TestRepository<Repo> repo1 = createProject("repo1");
+    Change change1 = insert(repo1, newChange(repo1));
+    TestRepository<Repo> repo2 = createProject("repo2");
+    Change change2 = insert(repo2, newChange(repo2));
+
+    assertThatQueryException("destination:foo")
+        .hasMessageThat()
+        .isEqualTo("Unknown named destination: foo");
+
+    String destination1 = "refs/heads/master\trepo1";
+    String destination2 = "refs/heads/master\trepo2";
+    String destination3 = "refs/heads/master\trepo1\nrefs/heads/master\trepo2";
+    String destination4 = "refs/heads/master\trepo3";
+    String destination5 = "refs/heads/other\trepo1";
+
+    TestRepository<Repo> allUsers = new TestRepository<>(repoManager.openRepository(allUsersName));
+    String refsUsers = RefNames.refsUsers(userId);
+    allUsers.branch(refsUsers).commit().add("destinations/destination1", destination1).create();
+    allUsers.branch(refsUsers).commit().add("destinations/destination2", destination2).create();
+    allUsers.branch(refsUsers).commit().add("destinations/destination3", destination3).create();
+    allUsers.branch(refsUsers).commit().add("destinations/destination4", destination4).create();
+    allUsers.branch(refsUsers).commit().add("destinations/destination5", destination5).create();
+
+    Ref userRef = allUsers.getRepository().exactRef(refsUsers);
+    assertThat(userRef).isNotNull();
+
+    assertQuery("destination:destination1", change1);
+    assertQuery("destination:destination2", change2);
+    assertQuery("destination:destination3", change2, change1);
+    assertQuery("destination:destination4");
+    assertQuery("destination:destination5");
+  }
+
+  @Test
+  public void userQuery() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    Change change1 = insert(repo, newChange(repo));
+    Change change2 = insert(repo, newChangeForBranch(repo, "stable"));
+
+    String queries =
+        "query1\tproject:repo\n"
+            + "query2\tproject:repo status:open\n"
+            + "query3\tproject:repo branch:stable\n"
+            + "query4\tproject:repo branch:other";
+
+    TestRepository<Repo> allUsers = new TestRepository<>(repoManager.openRepository(allUsersName));
+    String refsUsers = RefNames.refsUsers(userId);
+    allUsers.branch(refsUsers).commit().add("queries", queries).create();
+
+    Ref userRef = allUsers.getRepository().exactRef(refsUsers);
+    assertThat(userRef).isNotNull();
+
+    assertThatQueryException("query:foo").hasMessageThat().isEqualTo("Unknown named query: foo");
+
+    assertQuery("query:query1", change2, change1);
+    assertQuery("query:query2", change2, change1);
+    gApi.changes().id(change1.getChangeId()).revision("current").review(ReviewInput.approve());
+    gApi.changes().id(change1.getChangeId()).revision("current").submit();
+    assertQuery("query:query2", change2);
+    assertQuery("query:query3", change2);
+    assertQuery("query:query4");
+  }
+
+  @Test
+  public void byOwnerInvalidQuery() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    insert(repo, newChange(repo), userId);
+    String nameEmail = user.asIdentifiedUser().getNameEmail();
+    assertQuery("owner: \"" + nameEmail + "\"\\");
+  }
+
+  @Test
+  public void byDeletedChange() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    Change change = insert(repo, newChange(repo));
+
+    String query = "change:" + change.getId();
+    assertQuery(query, change);
+
+    gApi.changes().id(change.getChangeId()).delete();
+    assertQuery(query);
+  }
+
+  @Test
+  public void byUrlEncodedProject() throws Exception {
+    TestRepository<Repo> repo = createProject("repo+foo");
+    Change change = insert(repo, newChange(repo));
+    assertQuery("project:repo+foo", change);
+  }
+
+  protected ChangeInserter newChange(TestRepository<Repo> repo) throws Exception {
+    return newChange(repo, null, null, null, null, false);
+  }
+
+  protected ChangeInserter newChangeForCommit(TestRepository<Repo> repo, RevCommit commit)
+      throws Exception {
+    return newChange(repo, commit, null, null, null, false);
+  }
+
+  protected ChangeInserter newChangeForBranch(TestRepository<Repo> repo, String branch)
+      throws Exception {
+    return newChange(repo, null, branch, null, null, false);
+  }
+
+  protected ChangeInserter newChangeWithStatus(TestRepository<Repo> repo, Change.Status status)
+      throws Exception {
+    return newChange(repo, null, null, status, null, false);
+  }
+
+  protected ChangeInserter newChangeWithTopic(TestRepository<Repo> repo, String topic)
+      throws Exception {
+    return newChange(repo, null, null, null, topic, false);
+  }
+
+  protected ChangeInserter newChangeWorkInProgress(TestRepository<Repo> repo) throws Exception {
+    return newChange(repo, null, null, null, null, true);
+  }
+
+  protected ChangeInserter newChange(
+      TestRepository<Repo> repo,
+      @Nullable RevCommit commit,
+      @Nullable String branch,
+      @Nullable Change.Status status,
+      @Nullable String topic,
+      boolean workInProgress)
+      throws Exception {
+    if (commit == null) {
+      commit = repo.parseBody(repo.commit().message("message").create());
+    }
+
+    branch = MoreObjects.firstNonNull(branch, "refs/heads/master");
+    if (!branch.startsWith("refs/heads/")) {
+      branch = "refs/heads/" + branch;
+    }
+
+    Change.Id id = new Change.Id(seq.nextChangeId());
+    ChangeInserter ins =
+        changeFactory
+            .create(id, commit, branch)
+            .setValidate(false)
+            .setStatus(status)
+            .setTopic(topic)
+            .setWorkInProgress(workInProgress);
+    return ins;
+  }
+
+  protected Change insert(TestRepository<Repo> repo, ChangeInserter ins) throws Exception {
+    return insert(repo, ins, null, TimeUtil.nowTs());
+  }
+
+  protected Change insert(TestRepository<Repo> repo, ChangeInserter ins, @Nullable Account.Id owner)
+      throws Exception {
+    return insert(repo, ins, owner, TimeUtil.nowTs());
+  }
+
+  protected Change insert(
+      TestRepository<Repo> repo,
+      ChangeInserter ins,
+      @Nullable Account.Id owner,
+      Timestamp createdOn)
+      throws Exception {
+    Project.NameKey project =
+        new Project.NameKey(repo.getRepository().getDescription().getRepositoryName());
+    Account.Id ownerId = owner != null ? owner : userId;
+    IdentifiedUser user = userFactory.create(ownerId);
+    try (BatchUpdate bu = updateFactory.create(db, project, user, createdOn)) {
+      bu.insertChange(ins);
+      bu.execute();
+      return ins.getChange();
+    }
+  }
+
+  protected Change newPatchSet(TestRepository<Repo> repo, Change c) throws Exception {
+    // Add a new file so the patch set is not a trivial rebase, to avoid default
+    // Code-Review label copying.
+    int n = c.currentPatchSetId().get() + 1;
+    RevCommit commit =
+        repo.parseBody(repo.commit().message("message").add("file" + n, "contents " + n).create());
+
+    PatchSetInserter inserter =
+        patchSetFactory
+            .create(changeNotesFactory.createChecked(db, c), new PatchSet.Id(c.getId(), n), commit)
+            .setNotify(NotifyHandling.NONE)
+            .setFireRevisionCreated(false)
+            .setValidate(false);
+    try (BatchUpdate bu = updateFactory.create(db, c.getProject(), user, TimeUtil.nowTs());
+        ObjectInserter oi = repo.getRepository().newObjectInserter();
+        ObjectReader reader = oi.newReader();
+        RevWalk rw = new RevWalk(reader)) {
+      bu.setRepository(repo.getRepository(), rw, oi);
+      bu.addOp(c.getId(), inserter);
+      bu.execute();
+    }
+
+    return inserter.getChange();
+  }
+
+  protected ThrowableSubject assertThatQueryException(Object query) throws Exception {
+    return assertThatQueryException(newQuery(query));
+  }
+
+  protected ThrowableSubject assertThatQueryException(QueryRequest query) throws Exception {
+    try {
+      query.get();
+      throw new AssertionError("expected BadRequestException for query: " + query);
+    } catch (BadRequestException e) {
+      return assertThat(e);
+    }
+  }
+
+  protected TestRepository<Repo> createProject(String name) throws Exception {
+    gApi.projects().create(name).get();
+    return new TestRepository<>(repoManager.openRepository(new Project.NameKey(name)));
+  }
+
+  protected TestRepository<Repo> createProject(String name, String parent) throws Exception {
+    ProjectInput input = new ProjectInput();
+    input.name = name;
+    input.parent = parent;
+    gApi.projects().create(input).get();
+    return new TestRepository<>(repoManager.openRepository(new Project.NameKey(name)));
+  }
+
+  protected QueryRequest newQuery(Object query) {
+    return gApi.changes().query(query.toString());
+  }
+
+  protected List<ChangeInfo> assertQuery(Object query, Change... changes) throws Exception {
+    return assertQuery(newQuery(query), changes);
+  }
+
+  protected List<ChangeInfo> assertQueryByIds(Object query, Change.Id... changes) throws Exception {
+    return assertQueryByIds(newQuery(query), changes);
+  }
+
+  protected List<ChangeInfo> assertQuery(QueryRequest query, Change... changes) throws Exception {
+    return assertQueryByIds(
+        query, Arrays.stream(changes).map(Change::getId).toArray(Change.Id[]::new));
+  }
+
+  protected List<ChangeInfo> assertQueryByIds(QueryRequest query, Change.Id... changes)
+      throws Exception {
+    List<ChangeInfo> result = query.get();
+    Iterable<Change.Id> ids = ids(result);
+    assertThat(ids)
+        .named(format(query, ids, changes))
+        .containsExactlyElementsIn(Arrays.asList(changes))
+        .inOrder();
+    return result;
+  }
+
+  private String format(
+      QueryRequest query, Iterable<Change.Id> actualIds, Change.Id... expectedChanges)
+      throws RestApiException {
+    StringBuilder b = new StringBuilder();
+    b.append("query '").append(query.getQuery()).append("' with expected changes ");
+    b.append(format(Arrays.asList(expectedChanges)));
+    b.append(" and result ");
+    b.append(format(actualIds));
+    return b.toString();
+  }
+
+  private String format(Iterable<Change.Id> changeIds) throws RestApiException {
+    return format(changeIds.iterator());
+  }
+
+  private String format(Iterator<Change.Id> changeIds) throws RestApiException {
+    StringBuilder b = new StringBuilder();
+    b.append("[");
+    while (changeIds.hasNext()) {
+      Change.Id id = changeIds.next();
+      ChangeInfo c = gApi.changes().id(id.get()).get();
+      b.append("{")
+          .append(id)
+          .append(" (")
+          .append(c.changeId)
+          .append("), ")
+          .append("dest=")
+          .append(new Branch.NameKey(new Project.NameKey(c.project), c.branch))
+          .append(", ")
+          .append("status=")
+          .append(c.status)
+          .append(", ")
+          .append("lastUpdated=")
+          .append(c.updated.getTime())
+          .append("}");
+      if (changeIds.hasNext()) {
+        b.append(", ");
+      }
+    }
+    b.append("]");
+    return b.toString();
+  }
+
+  protected static Iterable<Change.Id> ids(Change... changes) {
+    return Arrays.stream(changes).map(Change::getId).collect(toList());
+  }
+
+  protected static Iterable<Change.Id> ids(Iterable<ChangeInfo> changes) {
+    return Streams.stream(changes).map(c -> new Change.Id(c._number)).collect(toList());
+  }
+
+  protected static long lastUpdatedMs(Change c) {
+    return c.getLastUpdatedOn().getTime();
+  }
+
+  private void addComment(int changeId, String message, Boolean unresolved) throws Exception {
+    ReviewInput input = new ReviewInput();
+    ReviewInput.CommentInput comment = new ReviewInput.CommentInput();
+    comment.line = 1;
+    comment.message = message;
+    comment.unresolved = unresolved;
+    input.comments =
+        ImmutableMap.<String, List<ReviewInput.CommentInput>>of(
+            Patch.COMMIT_MSG, ImmutableList.<ReviewInput.CommentInput>of(comment));
+    gApi.changes().id(changeId).current().review(input);
+  }
+
+  private Account.Id createAccount(String username, String fullName, String email, boolean active)
+      throws Exception {
+    try (ManualRequestContext ctx = oneOffRequestContext.open()) {
+      Account.Id id = accountManager.authenticate(AuthRequest.forUser(username)).getAccountId();
+      if (email != null) {
+        accountManager.link(id, AuthRequest.forEmail(email));
+      }
+      accountsUpdate
+          .get()
+          .update(
+              "Update Test Account",
+              id,
+              u -> {
+                u.setFullName(fullName).setPreferredEmail(email).setActive(active);
+              });
+      return id;
+    }
+  }
+
+  protected void assertMissingField(FieldDef<ChangeData, ?> field) {
+    assertThat(getSchema().hasField(field))
+        .named("schema %s has field %s", getSchemaVersion(), field.getName())
+        .isFalse();
+  }
+
+  protected void assertFailingQuery(String query, String expectedMessage) throws Exception {
+    try {
+      assertQuery(query);
+      fail("expected BadRequestException for query '" + query + "'");
+    } catch (BadRequestException e) {
+      assertThat(e.getMessage()).isEqualTo(expectedMessage);
+    }
+  }
+
+  protected int getSchemaVersion() {
+    return getSchema().getVersion();
+  }
+
+  protected Schema<ChangeData> getSchema() {
+    return indexes.getSearchIndex().getSchema();
+  }
+}
diff --git a/javatests/com/google/gerrit/server/query/change/BUILD b/javatests/com/google/gerrit/server/query/change/BUILD
new file mode 100644
index 0000000..fc1483c
--- /dev/null
+++ b/javatests/com/google/gerrit/server/query/change/BUILD
@@ -0,0 +1,75 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+ABSTRACT_QUERY_TEST = ["AbstractQueryChangesTest.java"]
+
+java_library(
+    name = "abstract_query_tests",
+    testonly = True,
+    srcs = ABSTRACT_QUERY_TEST,
+    visibility = ["//visibility:public"],
+    runtime_deps = ["//prolog:gerrit-prolog-common"],
+    deps = [
+        "//java/com/google/gerrit/common:annotations",
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/index",
+        "//java/com/google/gerrit/lifecycle",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/server/project/testing:project-test-util",
+        "//java/com/google/gerrit/server/schema",
+        "//java/com/google/gerrit/server/util/time",
+        "//java/com/google/gerrit/testing:gerrit-test-util",
+        "//lib:guava",
+        "//lib:gwtorm",
+        "//lib/guice",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/jgit/org.eclipse.jgit.junit:junit",
+        "//lib/truth",
+    ],
+)
+
+LUCENE_QUERY_TEST = ["LuceneQueryChangesTest.java"]
+
+junit_tests(
+    name = "lucene_query_test",
+    size = "large",
+    srcs = LUCENE_QUERY_TEST,
+    visibility = ["//visibility:public"],
+    deps = [
+        ":abstract_query_tests",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/testing:gerrit-test-util",
+        "//lib:guava",
+        "//lib:gwtorm",
+        "//lib/guice",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/jgit/org.eclipse.jgit.junit:junit",
+        "//lib/truth",
+    ],
+)
+
+junit_tests(
+    name = "small_tests",
+    size = "small",
+    srcs = glob(
+        ["*.java"],
+        exclude = ABSTRACT_QUERY_TEST + LUCENE_QUERY_TEST,
+    ),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/server/cache/testing",
+        "//java/com/google/gerrit/testing:gerrit-test-util",
+        "//lib:guava",
+        "//lib:gwtorm",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/truth",
+        "//lib/truth:truth-proto-extension",
+        "//proto:cache_java_proto",
+    ],
+)
diff --git a/javatests/com/google/gerrit/server/query/change/ChangeDataTest.java b/javatests/com/google/gerrit/server/query/change/ChangeDataTest.java
new file mode 100644
index 0000000..c8637cd
--- /dev/null
+++ b/javatests/com/google/gerrit/server/query/change/ChangeDataTest.java
@@ -0,0 +1,41 @@
+// Copyright (C) 2015 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.google.gerrit.server.query.change;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.testing.TestChanges;
+import org.junit.Test;
+
+public class ChangeDataTest {
+  @Test
+  public void setPatchSetsClearsCurrentPatchSet() throws Exception {
+    Project.NameKey project = new Project.NameKey("project");
+    ChangeData cd = ChangeData.createForTest(project, new Change.Id(1), 1);
+    cd.setChange(TestChanges.newChange(project, new Account.Id(1000)));
+    PatchSet curr1 = cd.currentPatchSet();
+    int currId = curr1.getId().get();
+    PatchSet ps1 = new PatchSet(new PatchSet.Id(cd.getId(), currId + 1));
+    PatchSet ps2 = new PatchSet(new PatchSet.Id(cd.getId(), currId + 2));
+    cd.setPatchSets(ImmutableList.of(ps1, ps2));
+    PatchSet curr2 = cd.currentPatchSet();
+    assertThat(curr2).isNotSameAs(curr1);
+  }
+}
diff --git a/javatests/com/google/gerrit/server/query/change/ConflictKeyTest.java b/javatests/com/google/gerrit/server/query/change/ConflictKeyTest.java
new file mode 100644
index 0000000..de2acf0
--- /dev/null
+++ b/javatests/com/google/gerrit/server/query/change/ConflictKeyTest.java
@@ -0,0 +1,98 @@
+// 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.
+
+package com.google.gerrit.server.query.change;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.extensions.proto.ProtoTruth.assertThat;
+import static com.google.gerrit.extensions.client.SubmitType.FAST_FORWARD_ONLY;
+import static com.google.gerrit.extensions.client.SubmitType.MERGE_IF_NECESSARY;
+import static com.google.gerrit.server.cache.testing.CacheSerializerTestUtil.byteString;
+import static com.google.gerrit.server.cache.testing.SerializedClassSubject.assertThatSerializedClass;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.gerrit.extensions.client.SubmitType;
+import com.google.gerrit.server.cache.proto.Cache.ConflictKeyProto;
+import org.eclipse.jgit.lib.ObjectId;
+import org.junit.Test;
+
+public class ConflictKeyTest {
+  @Test
+  public void ffOnlyPreservesInputOrder() {
+    ObjectId id1 = ObjectId.fromString("badc0feebadc0feebadc0feebadc0feebadc0fee");
+    ObjectId id2 = ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef");
+    ConflictKey id1First = ConflictKey.create(id1, id2, FAST_FORWARD_ONLY, true);
+    ConflictKey id2First = ConflictKey.create(id2, id1, FAST_FORWARD_ONLY, true);
+
+    assertThat(id1First)
+        .isEqualTo(ConflictKey.createWithoutNormalization(id1, id2, FAST_FORWARD_ONLY, true));
+    assertThat(id2First)
+        .isEqualTo(ConflictKey.createWithoutNormalization(id2, id1, FAST_FORWARD_ONLY, true));
+    assertThat(id1First).isNotEqualTo(id2First);
+  }
+
+  @Test
+  public void nonFfOnlyNormalizesInputOrder() {
+    ObjectId id1 = ObjectId.fromString("badc0feebadc0feebadc0feebadc0feebadc0fee");
+    ObjectId id2 = ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef");
+    ConflictKey id1First = ConflictKey.create(id1, id2, MERGE_IF_NECESSARY, true);
+    ConflictKey id2First = ConflictKey.create(id2, id1, MERGE_IF_NECESSARY, true);
+    ConflictKey expected =
+        ConflictKey.createWithoutNormalization(id1, id2, MERGE_IF_NECESSARY, true);
+
+    assertThat(id1First).isEqualTo(expected);
+    assertThat(id2First).isEqualTo(expected);
+  }
+
+  @Test
+  public void serializer() throws Exception {
+    ConflictKey key =
+        ConflictKey.create(
+            ObjectId.fromString("badc0feebadc0feebadc0feebadc0feebadc0fee"),
+            ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"),
+            SubmitType.MERGE_IF_NECESSARY,
+            false);
+    byte[] serialized = ConflictKey.Serializer.INSTANCE.serialize(key);
+    assertThat(ConflictKeyProto.parseFrom(serialized))
+        .isEqualTo(
+            ConflictKeyProto.newBuilder()
+                .setCommit(
+                    byteString(
+                        0xba, 0xdc, 0x0f, 0xee, 0xba, 0xdc, 0x0f, 0xee, 0xba, 0xdc, 0x0f, 0xee,
+                        0xba, 0xdc, 0x0f, 0xee, 0xba, 0xdc, 0x0f, 0xee))
+                .setOtherCommit(
+                    byteString(
+                        0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef,
+                        0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef))
+                .setSubmitType("MERGE_IF_NECESSARY")
+                .setContentMerge(false)
+                .build());
+    assertThat(ConflictKey.Serializer.INSTANCE.deserialize(serialized)).isEqualTo(key);
+  }
+
+  /**
+   * See {@link com.google.gerrit.server.cache.testing.SerializedClassSubject} for background and
+   * what to do if this test fails.
+   */
+  @Test
+  public void methods() throws Exception {
+    assertThatSerializedClass(ConflictKey.class)
+        .hasAutoValueMethods(
+            ImmutableMap.of(
+                "commit", ObjectId.class,
+                "otherCommit", ObjectId.class,
+                "submitType", SubmitType.class,
+                "contentMerge", boolean.class));
+  }
+}
diff --git a/javatests/com/google/gerrit/server/query/change/LuceneQueryChangesTest.java b/javatests/com/google/gerrit/server/query/change/LuceneQueryChangesTest.java
new file mode 100644
index 0000000..1dfe7df
--- /dev/null
+++ b/javatests/com/google/gerrit/server/query/change/LuceneQueryChangesTest.java
@@ -0,0 +1,83 @@
+// Copyright (C) 2013 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.google.gerrit.server.query.change;
+
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.index.change.ChangeSchemaDefinitions;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.gerrit.testing.InMemoryModule;
+import com.google.gerrit.testing.InMemoryRepositoryManager.Repo;
+import com.google.gerrit.testing.IndexConfig;
+import com.google.gerrit.testing.IndexVersions;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.junit.Test;
+
+public class LuceneQueryChangesTest extends AbstractQueryChangesTest {
+  @ConfigSuite.Default
+  public static Config defaultConfig() {
+    return IndexConfig.createForLucene();
+  }
+
+  @ConfigSuite.Configs
+  public static Map<String, Config> againstPreviousIndexVersion() {
+    // the current schema version is already tested by the inherited default config suite
+    List<Integer> schemaVersions = IndexVersions.getWithoutLatest(ChangeSchemaDefinitions.INSTANCE);
+    return IndexVersions.asConfigMap(
+        ChangeSchemaDefinitions.INSTANCE, schemaVersions, "againstIndexVersion", defaultConfig());
+  }
+
+  @Override
+  protected Injector createInjector() {
+    Config luceneConfig = new Config(config);
+    InMemoryModule.setDefaults(luceneConfig);
+    return Guice.createInjector(new InMemoryModule(luceneConfig, notesMigration));
+  }
+
+  @Test
+  public void fullTextWithSpecialChars() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    RevCommit commit1 = repo.parseBody(repo.commit().message("foo_bar_foo").create());
+    Change change1 = insert(repo, newChangeForCommit(repo, commit1));
+    RevCommit commit2 = repo.parseBody(repo.commit().message("one.two.three").create());
+    Change change2 = insert(repo, newChangeForCommit(repo, commit2));
+
+    assertQuery("message:foo_ba");
+    assertQuery("message:bar", change1);
+    assertQuery("message:foo_bar", change1);
+    assertQuery("message:foo bar", change1);
+    assertQuery("message:two", change2);
+    assertQuery("message:one.two", change2);
+    assertQuery("message:one two", change2);
+  }
+
+  @Test
+  @Override
+  public void byOwnerInvalidQuery() throws Exception {
+    TestRepository<Repo> repo = createProject("repo");
+    Change change1 = insert(repo, newChange(repo), userId);
+    String nameEmail = user.asIdentifiedUser().getNameEmail();
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("Cannot create full-text query with value: \\");
+    assertQuery("owner: \"" + nameEmail + "\"\\", change1);
+  }
+}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/RegexPathPredicateTest.java b/javatests/com/google/gerrit/server/query/change/RegexPathPredicateTest.java
similarity index 100%
rename from gerrit-server/src/test/java/com/google/gerrit/server/query/change/RegexPathPredicateTest.java
rename to javatests/com/google/gerrit/server/query/change/RegexPathPredicateTest.java
diff --git a/javatests/com/google/gerrit/server/query/group/AbstractQueryGroupsTest.java b/javatests/com/google/gerrit/server/query/group/AbstractQueryGroupsTest.java
new file mode 100644
index 0000000..fd65f83
--- /dev/null
+++ b/javatests/com/google/gerrit/server/query/group/AbstractQueryGroupsTest.java
@@ -0,0 +1,581 @@
+// Copyright (C) 2017 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.google.gerrit.server.query.group;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth8.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.base.CharMatcher;
+import com.google.gerrit.extensions.api.GerritApi;
+import com.google.gerrit.extensions.api.accounts.AccountInput;
+import com.google.gerrit.extensions.api.groups.GroupInput;
+import com.google.gerrit.extensions.api.groups.Groups.QueryRequest;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.index.IndexConfig;
+import com.google.gerrit.index.QueryOptions;
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.index.query.FieldBundle;
+import com.google.gerrit.lifecycle.LifecycleManager;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.AnonymousUser;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.ServerInitiated;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountManager;
+import com.google.gerrit.server.account.Accounts;
+import com.google.gerrit.server.account.AccountsUpdate;
+import com.google.gerrit.server.account.AuthRequest;
+import com.google.gerrit.server.account.GroupCache;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.group.db.GroupsUpdate;
+import com.google.gerrit.server.group.db.InternalGroupUpdate;
+import com.google.gerrit.server.index.group.GroupField;
+import com.google.gerrit.server.index.group.GroupIndex;
+import com.google.gerrit.server.index.group.GroupIndexCollection;
+import com.google.gerrit.server.schema.SchemaCreator;
+import com.google.gerrit.server.util.ManualRequestContext;
+import com.google.gerrit.server.util.OneOffRequestContext;
+import com.google.gerrit.server.util.RequestContext;
+import com.google.gerrit.server.util.ThreadLocalRequestContext;
+import com.google.gerrit.testing.GerritServerTests;
+import com.google.gerrit.testing.InMemoryDatabase;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Provider;
+import com.google.inject.util.Providers;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Optional;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+
+@Ignore
+public abstract class AbstractQueryGroupsTest extends GerritServerTests {
+  @Inject protected Accounts accounts;
+
+  @Inject @ServerInitiated protected Provider<AccountsUpdate> accountsUpdate;
+
+  @Inject protected AccountCache accountCache;
+
+  @Inject protected AccountManager accountManager;
+
+  @Inject protected GerritApi gApi;
+
+  @Inject protected IdentifiedUser.GenericFactory userFactory;
+
+  @Inject private Provider<AnonymousUser> anonymousUser;
+
+  @Inject protected InMemoryDatabase schemaFactory;
+
+  @Inject protected SchemaCreator schemaCreator;
+
+  @Inject protected ThreadLocalRequestContext requestContext;
+
+  @Inject protected OneOffRequestContext oneOffRequestContext;
+
+  @Inject protected AllProjectsName allProjects;
+
+  @Inject protected GroupCache groupCache;
+
+  @Inject @ServerInitiated protected Provider<GroupsUpdate> groupsUpdateProvider;
+
+  @Inject protected GroupIndexCollection indexes;
+
+  @Inject private GroupIndexCollection groupIndexes;
+
+  protected LifecycleManager lifecycle;
+  protected Injector injector;
+  protected ReviewDb db;
+  protected AccountInfo currentUserInfo;
+  protected CurrentUser user;
+
+  protected abstract Injector createInjector();
+
+  @Before
+  public void setUpInjector() throws Exception {
+    lifecycle = new LifecycleManager();
+    injector = createInjector();
+    lifecycle.add(injector);
+    injector.injectMembers(this);
+    lifecycle.start();
+    initAfterLifecycleStart();
+    setUpDatabase();
+  }
+
+  @After
+  public void cleanUp() {
+    lifecycle.stop();
+    db.close();
+  }
+
+  protected void setUpDatabase() throws Exception {
+    db = schemaFactory.open();
+    schemaCreator.create(db);
+
+    Account.Id userId =
+        createAccountOutsideRequestContext("user", "User", "user@example.com", true);
+    user = userFactory.create(userId);
+    requestContext.setContext(newRequestContext(userId));
+    currentUserInfo = gApi.accounts().id(userId.get()).get();
+  }
+
+  protected void initAfterLifecycleStart() throws Exception {}
+
+  protected RequestContext newRequestContext(Account.Id requestUserId) {
+    final CurrentUser requestUser = userFactory.create(requestUserId);
+    return new RequestContext() {
+      @Override
+      public CurrentUser getUser() {
+        return requestUser;
+      }
+
+      @Override
+      public Provider<ReviewDb> getReviewDbProvider() {
+        return Providers.of(db);
+      }
+    };
+  }
+
+  protected void setAnonymous() {
+    requestContext.setContext(
+        new RequestContext() {
+          @Override
+          public CurrentUser getUser() {
+            return anonymousUser.get();
+          }
+
+          @Override
+          public Provider<ReviewDb> getReviewDbProvider() {
+            return Providers.of(db);
+          }
+        });
+  }
+
+  @After
+  public void tearDownInjector() {
+    if (lifecycle != null) {
+      lifecycle.stop();
+    }
+    if (requestContext != null) {
+      requestContext.setContext(null);
+    }
+    if (db != null) {
+      db.close();
+    }
+    InMemoryDatabase.drop(schemaFactory);
+  }
+
+  @Test
+  public void byUuid() throws Exception {
+    assertQuery("uuid:6d70856bc40ded50f2585c4c0f7e179f3544a272");
+    assertQuery("uuid:non-existing");
+
+    GroupInfo group = createGroup(name("group"));
+    assertQuery("uuid:" + group.id, group);
+
+    GroupInfo admins = gApi.groups().id("Administrators").get();
+    assertQuery("uuid:" + admins.id, admins);
+  }
+
+  @Test
+  public void byName() throws Exception {
+    assertQuery("name:non-existing");
+
+    GroupInfo group = createGroup(name("Group"));
+    assertQuery("name:" + group.name, group);
+    assertQuery("name:" + group.name.toLowerCase(Locale.US));
+
+    // only exact match
+    GroupInfo groupWithHyphen = createGroup(name("group-with-hyphen"));
+    createGroup(name("group-no-match-with-hyphen"));
+    assertQuery("name:" + groupWithHyphen.name, groupWithHyphen);
+  }
+
+  @Test
+  public void byInname() throws Exception {
+    String namePart = getSanitizedMethodName();
+    namePart = CharMatcher.is('_').removeFrom(namePart);
+
+    GroupInfo group1 = createGroup("group-" + namePart);
+    GroupInfo group2 = createGroup("group-" + namePart + "-2");
+    GroupInfo group3 = createGroup("group-" + namePart + "3");
+    assertQuery("inname:" + namePart, group1, group2, group3);
+    assertQuery("inname:" + namePart.toUpperCase(Locale.US), group1, group2, group3);
+    assertQuery("inname:" + namePart.toLowerCase(Locale.US), group1, group2, group3);
+  }
+
+  @Test
+  public void byDescription() throws Exception {
+    GroupInfo group1 = createGroupWithDescription(name("group1"), "This is a test group.");
+    GroupInfo group2 = createGroupWithDescription(name("group2"), "ANOTHER TEST GROUP.");
+    createGroupWithDescription(name("group3"), "Maintainers of project foo.");
+    assertQuery("description:test", group1, group2);
+
+    assertQuery("description:non-existing");
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("description operator requires a value");
+    assertQuery("description:\"\"");
+  }
+
+  @Test
+  public void byOwner() throws Exception {
+    GroupInfo ownerGroup = createGroup(name("owner-group"));
+    GroupInfo group = createGroupWithOwner(name("group"), ownerGroup);
+    createGroup(name("group2"));
+
+    assertQuery("owner:" + group.id);
+
+    // ownerGroup owns itself
+    assertQuery("owner:" + ownerGroup.id, group, ownerGroup);
+    assertQuery("owner:" + ownerGroup.name, group, ownerGroup);
+  }
+
+  @Test
+  public void byIsVisibleToAll() throws Exception {
+    assertQuery("is:visibletoall");
+
+    GroupInfo groupThatIsVisibleToAll =
+        createGroupThatIsVisibleToAll(name("group-that-is-visible-to-all"));
+    createGroup(name("group"));
+
+    assertQuery("is:visibletoall", groupThatIsVisibleToAll);
+  }
+
+  @Test
+  public void byMember() throws Exception {
+    assume().that(getSchemaVersion() >= 4).isTrue();
+
+    AccountInfo user1 = createAccount("user1", "User1", "user1@example.com");
+    AccountInfo user2 = createAccount("user2", "User2", "user2@example.com");
+
+    GroupInfo group1 = createGroup(name("group1"), user1);
+    GroupInfo group2 = createGroup(name("group2"), user2);
+    GroupInfo group3 = createGroup(name("group3"), user1);
+
+    assertQuery("member:" + user1.name, group1, group3);
+    assertQuery("member:" + user1.email, group1, group3);
+
+    gApi.groups().id(group3.id).removeMembers(user1.username);
+    gApi.groups().id(group2.id).addMembers(user1.username);
+
+    assertQuery("member:" + user1.name, group1, group2);
+  }
+
+  @Test
+  public void bySubgroups() throws Exception {
+    assume().that(getSchemaVersion() >= 4).isTrue();
+
+    GroupInfo superParentGroup = createGroup(name("superParentGroup"));
+    GroupInfo parentGroup1 = createGroup(name("parentGroup1"));
+    GroupInfo parentGroup2 = createGroup(name("parentGroup2"));
+    GroupInfo subGroup = createGroup(name("subGroup"));
+
+    gApi.groups().id(superParentGroup.id).addGroups(parentGroup1.id, parentGroup2.id);
+    gApi.groups().id(parentGroup1.id).addGroups(subGroup.id);
+    gApi.groups().id(parentGroup2.id).addGroups(subGroup.id);
+
+    assertQuery("subgroup:" + subGroup.id, parentGroup1, parentGroup2);
+    assertQuery("subgroup:" + parentGroup1.id, superParentGroup);
+
+    gApi.groups().id(superParentGroup.id).addGroups(subGroup.id);
+    gApi.groups().id(parentGroup1.id).removeGroups(subGroup.id);
+
+    assertQuery("subgroup:" + subGroup.id, superParentGroup, parentGroup2);
+  }
+
+  @Test
+  public void byDefaultField() throws Exception {
+    GroupInfo group1 = createGroup(name("foo-group"));
+    GroupInfo group2 = createGroup(name("group2"));
+    GroupInfo group3 =
+        createGroupWithDescription(
+            name("group3"), "decription that contains foo and the UUID of group2: " + group2.id);
+
+    assertQuery("non-existing");
+    assertQuery("foo", group1, group3);
+    assertQuery(group2.id, group2, group3);
+  }
+
+  @Test
+  public void withLimit() throws Exception {
+    GroupInfo group1 = createGroup(name("group1"));
+    GroupInfo group2 = createGroup(name("group2"));
+    GroupInfo group3 = createGroup(name("group3"));
+
+    String query = "uuid:" + group1.id + " OR uuid:" + group2.id + " OR uuid:" + group3.id;
+    List<GroupInfo> result = assertQuery(query, group1, group2, group3);
+    assertThat(result.get(result.size() - 1)._moreGroups).isNull();
+
+    result = assertQuery(newQuery(query).withLimit(2), result.subList(0, 2));
+    assertThat(result.get(result.size() - 1)._moreGroups).isTrue();
+  }
+
+  @Test
+  public void withStart() throws Exception {
+    GroupInfo group1 = createGroup(name("group1"));
+    GroupInfo group2 = createGroup(name("group2"));
+    GroupInfo group3 = createGroup(name("group3"));
+
+    String query = "uuid:" + group1.id + " OR uuid:" + group2.id + " OR uuid:" + group3.id;
+    List<GroupInfo> result = assertQuery(query, group1, group2, group3);
+
+    assertQuery(newQuery(query).withStart(1), result.subList(1, 3));
+  }
+
+  @Test
+  public void sortedByUuid() throws Exception {
+    GroupInfo group1 = createGroup(name("group1"));
+    GroupInfo group2 = createGroup(name("group2"));
+    GroupInfo group3 = createGroup(name("group3"));
+
+    String query = "uuid:" + group1.id + " OR uuid:" + group2.id + " OR uuid:" + group3.id;
+    // assertQuery sorts the expected groups by UUID
+    assertQuery(newQuery(query), group1, group2, group3);
+  }
+
+  @Test
+  public void asAnonymous() throws Exception {
+    GroupInfo group = createGroup(name("group"));
+
+    setAnonymous();
+    assertQuery("uuid:" + group.id);
+  }
+
+  // reindex permissions are tested by {@link GroupsIT#reindexPermissions}
+  @Test
+  public void reindex() throws Exception {
+    GroupInfo group1 = createGroupWithDescription(name("group"), "barX");
+
+    // update group in the database so that group index is stale
+    String newDescription = "barY";
+    AccountGroup.UUID groupUuid = new AccountGroup.UUID(group1.id);
+    InternalGroupUpdate groupUpdate =
+        InternalGroupUpdate.builder().setDescription(newDescription).build();
+    groupsUpdateProvider.get().updateGroupInNoteDb(groupUuid, groupUpdate);
+
+    assertQuery("description:" + group1.description, group1);
+    assertQuery("description:" + newDescription);
+
+    gApi.groups().id(group1.id).index();
+    assertQuery("description:" + group1.description);
+    assertQuery("description:" + newDescription, group1);
+  }
+
+  @Test
+  public void rawDocument() throws Exception {
+    GroupInfo group1 = createGroup(name("group1"));
+    AccountGroup.UUID uuid = new AccountGroup.UUID(group1.id);
+
+    Optional<FieldBundle> rawFields =
+        indexes
+            .getSearchIndex()
+            .getRaw(
+                uuid,
+                QueryOptions.create(
+                    IndexConfig.createDefault(),
+                    0,
+                    10,
+                    indexes.getSearchIndex().getSchema().getStoredFields().keySet()));
+
+    assertThat(rawFields).isPresent();
+    assertThat(rawFields.get().getValue(GroupField.UUID)).isEqualTo(uuid.get());
+  }
+
+  @Test
+  public void byDeletedGroup() throws Exception {
+    GroupInfo group = createGroup(name("group"));
+    AccountGroup.UUID uuid = new AccountGroup.UUID(group.id);
+    String query = "uuid:" + uuid;
+    assertQuery(query, group);
+
+    for (GroupIndex index : groupIndexes.getWriteIndexes()) {
+      index.delete(uuid);
+    }
+    assertQuery(query);
+  }
+
+  private Account.Id createAccountOutsideRequestContext(
+      String username, String fullName, String email, boolean active) throws Exception {
+    try (ManualRequestContext ctx = oneOffRequestContext.open()) {
+      Account.Id id = accountManager.authenticate(AuthRequest.forUser(username)).getAccountId();
+      if (email != null) {
+        accountManager.link(id, AuthRequest.forEmail(email));
+      }
+      accountsUpdate
+          .get()
+          .update(
+              "Update Test Account",
+              id,
+              u -> {
+                u.setFullName(fullName).setPreferredEmail(email).setActive(active);
+              });
+      return id;
+    }
+  }
+
+  protected AccountInfo createAccount(String username, String fullName, String email)
+      throws Exception {
+    String uniqueName = name(username);
+    AccountInput accountInput = new AccountInput();
+    accountInput.username = uniqueName;
+    accountInput.name = fullName;
+    accountInput.email = email;
+    return gApi.accounts().create(accountInput).get();
+  }
+
+  protected GroupInfo createGroup(String name, AccountInfo... members) throws Exception {
+    return createGroupWithDescription(name, null, members);
+  }
+
+  protected GroupInfo createGroupWithDescription(
+      String name, String description, AccountInfo... members) throws Exception {
+    GroupInput in = new GroupInput();
+    in.name = name;
+    in.description = description;
+    in.members =
+        Arrays.asList(members).stream().map(a -> String.valueOf(a._accountId)).collect(toList());
+    return gApi.groups().create(in).get();
+  }
+
+  protected GroupInfo createGroupWithOwner(String name, GroupInfo ownerGroup) throws Exception {
+    GroupInput in = new GroupInput();
+    in.name = name;
+    in.ownerId = ownerGroup.id;
+    return gApi.groups().create(in).get();
+  }
+
+  protected GroupInfo createGroupThatIsVisibleToAll(String name) throws Exception {
+    GroupInput in = new GroupInput();
+    in.name = name;
+    in.visibleToAll = true;
+    return gApi.groups().create(in).get();
+  }
+
+  protected GroupInfo getGroup(AccountGroup.UUID uuid) throws Exception {
+    return gApi.groups().id(uuid.get()).get();
+  }
+
+  protected List<GroupInfo> assertQuery(Object query, GroupInfo... groups) throws Exception {
+    return assertQuery(newQuery(query), groups);
+  }
+
+  protected List<GroupInfo> assertQuery(QueryRequest query, GroupInfo... groups) throws Exception {
+    return assertQuery(query, Arrays.asList(groups));
+  }
+
+  protected List<GroupInfo> assertQuery(QueryRequest query, List<GroupInfo> groups)
+      throws Exception {
+    List<GroupInfo> result = query.get();
+    Iterable<String> uuids = uuids(result);
+    assertThat(uuids)
+        .named(format(query, result, groups))
+        .containsExactlyElementsIn(uuids(groups))
+        .inOrder();
+    return result;
+  }
+
+  protected QueryRequest newQuery(Object query) {
+    return gApi.groups().query(query.toString());
+  }
+
+  protected String format(
+      QueryRequest query, List<GroupInfo> actualGroups, List<GroupInfo> expectedGroups) {
+    StringBuilder b = new StringBuilder();
+    b.append("query '").append(query.getQuery()).append("' with expected groups ");
+    b.append(format(expectedGroups));
+    b.append(" and result ");
+    b.append(format(actualGroups));
+    return b.toString();
+  }
+
+  protected String format(Iterable<GroupInfo> groups) {
+    StringBuilder b = new StringBuilder();
+    b.append("[");
+    Iterator<GroupInfo> it = groups.iterator();
+    while (it.hasNext()) {
+      GroupInfo g = it.next();
+      b.append("{")
+          .append(g.id)
+          .append(", ")
+          .append("name=")
+          .append(g.name)
+          .append(", ")
+          .append("groupId=")
+          .append(g.groupId)
+          .append(", ")
+          .append("url=")
+          .append(g.url)
+          .append(", ")
+          .append("ownerId=")
+          .append(g.ownerId)
+          .append(", ")
+          .append("owner=")
+          .append(g.owner)
+          .append(", ")
+          .append("description=")
+          .append(g.description)
+          .append(", ")
+          .append("visibleToAll=")
+          .append(toBoolean(g.options.visibleToAll))
+          .append("}");
+      if (it.hasNext()) {
+        b.append(", ");
+      }
+    }
+    b.append("]");
+    return b.toString();
+  }
+
+  protected static boolean toBoolean(Boolean b) {
+    return b == null ? false : b;
+  }
+
+  protected static Iterable<String> ids(GroupInfo... groups) {
+    return uuids(Arrays.asList(groups));
+  }
+
+  protected static Iterable<String> uuids(List<GroupInfo> groups) {
+    return groups.stream().map(g -> g.id).sorted().collect(toList());
+  }
+
+  protected String name(String name) {
+    if (name == null) {
+      return null;
+    }
+
+    return name + "_" + getSanitizedMethodName();
+  }
+
+  protected int getSchemaVersion() {
+    return getSchema().getVersion();
+  }
+
+  protected Schema<InternalGroup> getSchema() {
+    return indexes.getSearchIndex().getSchema();
+  }
+}
diff --git a/javatests/com/google/gerrit/server/query/group/BUILD b/javatests/com/google/gerrit/server/query/group/BUILD
new file mode 100644
index 0000000..3f147c9
--- /dev/null
+++ b/javatests/com/google/gerrit/server/query/group/BUILD
@@ -0,0 +1,41 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+ABSTRACT_QUERY_TEST = ["AbstractQueryGroupsTest.java"]
+
+java_library(
+    name = "abstract_query_tests",
+    testonly = True,
+    srcs = ABSTRACT_QUERY_TEST,
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/index",
+        "//java/com/google/gerrit/lifecycle",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/server/schema",
+        "//java/com/google/gerrit/testing:gerrit-test-util",
+        "//lib:guava",
+        "//lib/guice",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/truth",
+        "//lib/truth:truth-java8-extension",
+    ],
+)
+
+junit_tests(
+    name = "lucene_query_test",
+    size = "large",
+    srcs = glob(
+        ["*.java"],
+        exclude = ABSTRACT_QUERY_TEST,
+    ),
+    visibility = ["//visibility:public"],
+    deps = [
+        ":abstract_query_tests",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/testing:gerrit-test-util",
+        "//lib/guice",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+    ],
+)
diff --git a/javatests/com/google/gerrit/server/query/group/LuceneQueryGroupsTest.java b/javatests/com/google/gerrit/server/query/group/LuceneQueryGroupsTest.java
new file mode 100644
index 0000000..83835c1
--- /dev/null
+++ b/javatests/com/google/gerrit/server/query/group/LuceneQueryGroupsTest.java
@@ -0,0 +1,48 @@
+// Copyright (C) 2017 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.google.gerrit.server.query.group;
+
+import com.google.gerrit.server.index.group.GroupSchemaDefinitions;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.gerrit.testing.InMemoryModule;
+import com.google.gerrit.testing.IndexConfig;
+import com.google.gerrit.testing.IndexVersions;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.jgit.lib.Config;
+
+public class LuceneQueryGroupsTest extends AbstractQueryGroupsTest {
+  @ConfigSuite.Default
+  public static Config defaultConfig() {
+    return IndexConfig.createForLucene();
+  }
+
+  @ConfigSuite.Configs
+  public static Map<String, Config> againstPreviousIndexVersion() {
+    // the current schema version is already tested by the inherited default config suite
+    List<Integer> schemaVersions = IndexVersions.getWithoutLatest(GroupSchemaDefinitions.INSTANCE);
+    return IndexVersions.asConfigMap(
+        GroupSchemaDefinitions.INSTANCE, schemaVersions, "againstIndexVersion", defaultConfig());
+  }
+
+  @Override
+  protected Injector createInjector() {
+    Config luceneConfig = new Config(config);
+    InMemoryModule.setDefaults(luceneConfig);
+    return Guice.createInjector(new InMemoryModule(luceneConfig, notesMigration));
+  }
+}
diff --git a/javatests/com/google/gerrit/server/query/project/AbstractQueryProjectsTest.java b/javatests/com/google/gerrit/server/query/project/AbstractQueryProjectsTest.java
new file mode 100644
index 0000000..7872b44
--- /dev/null
+++ b/javatests/com/google/gerrit/server/query/project/AbstractQueryProjectsTest.java
@@ -0,0 +1,481 @@
+// Copyright (C) 2017 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.google.gerrit.server.query.project;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.base.CharMatcher;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.extensions.api.GerritApi;
+import com.google.gerrit.extensions.api.access.AccessSectionInfo;
+import com.google.gerrit.extensions.api.access.PermissionInfo;
+import com.google.gerrit.extensions.api.access.PermissionRuleInfo;
+import com.google.gerrit.extensions.api.access.ProjectAccessInput;
+import com.google.gerrit.extensions.api.projects.ConfigInput;
+import com.google.gerrit.extensions.api.projects.ProjectInput;
+import com.google.gerrit.extensions.api.projects.Projects.QueryRequest;
+import com.google.gerrit.extensions.client.ProjectState;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.index.Schema;
+import com.google.gerrit.index.project.ProjectData;
+import com.google.gerrit.index.project.ProjectIndexCollection;
+import com.google.gerrit.lifecycle.LifecycleManager;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.AnonymousUser;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.ServerInitiated;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountManager;
+import com.google.gerrit.server.account.Accounts;
+import com.google.gerrit.server.account.AccountsUpdate;
+import com.google.gerrit.server.account.AuthRequest;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gerrit.server.schema.SchemaCreator;
+import com.google.gerrit.server.util.ManualRequestContext;
+import com.google.gerrit.server.util.OneOffRequestContext;
+import com.google.gerrit.server.util.RequestContext;
+import com.google.gerrit.server.util.ThreadLocalRequestContext;
+import com.google.gerrit.testing.GerritServerTests;
+import com.google.gerrit.testing.InMemoryDatabase;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Provider;
+import com.google.inject.util.Providers;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+
+@Ignore
+public abstract class AbstractQueryProjectsTest extends GerritServerTests {
+  @Inject protected Accounts accounts;
+
+  @Inject @ServerInitiated protected Provider<AccountsUpdate> accountsUpdate;
+
+  @Inject protected AccountCache accountCache;
+
+  @Inject protected AccountManager accountManager;
+
+  @Inject protected GerritApi gApi;
+
+  @Inject protected IdentifiedUser.GenericFactory userFactory;
+
+  @Inject private Provider<AnonymousUser> anonymousUser;
+
+  @Inject protected InMemoryDatabase schemaFactory;
+
+  @Inject protected SchemaCreator schemaCreator;
+
+  @Inject protected ThreadLocalRequestContext requestContext;
+
+  @Inject protected OneOffRequestContext oneOffRequestContext;
+
+  @Inject protected ProjectIndexCollection indexes;
+
+  @Inject protected AllProjectsName allProjects;
+
+  @Inject protected AllUsersName allUsers;
+
+  protected LifecycleManager lifecycle;
+  protected Injector injector;
+  protected ReviewDb db;
+  protected AccountInfo currentUserInfo;
+  protected CurrentUser user;
+
+  protected abstract Injector createInjector();
+
+  @Before
+  public void setUpInjector() throws Exception {
+    lifecycle = new LifecycleManager();
+    injector = createInjector();
+    lifecycle.add(injector);
+    injector.injectMembers(this);
+    lifecycle.start();
+    initAfterLifecycleStart();
+    setUpDatabase();
+  }
+
+  @After
+  public void cleanUp() {
+    lifecycle.stop();
+    db.close();
+  }
+
+  protected void setUpDatabase() throws Exception {
+    db = schemaFactory.open();
+    schemaCreator.create(db);
+
+    Account.Id userId = createAccount("user", "User", "user@example.com", true);
+    user = userFactory.create(userId);
+    requestContext.setContext(newRequestContext(userId));
+    currentUserInfo = gApi.accounts().id(userId.get()).get();
+  }
+
+  protected void initAfterLifecycleStart() throws Exception {}
+
+  protected RequestContext newRequestContext(Account.Id requestUserId) {
+    final CurrentUser requestUser = userFactory.create(requestUserId);
+    return new RequestContext() {
+      @Override
+      public CurrentUser getUser() {
+        return requestUser;
+      }
+
+      @Override
+      public Provider<ReviewDb> getReviewDbProvider() {
+        return Providers.of(db);
+      }
+    };
+  }
+
+  protected void setAnonymous() {
+    requestContext.setContext(
+        new RequestContext() {
+          @Override
+          public CurrentUser getUser() {
+            return anonymousUser.get();
+          }
+
+          @Override
+          public Provider<ReviewDb> getReviewDbProvider() {
+            return Providers.of(db);
+          }
+        });
+  }
+
+  @After
+  public void tearDownInjector() {
+    if (lifecycle != null) {
+      lifecycle.stop();
+    }
+    requestContext.setContext(null);
+    if (db != null) {
+      db.close();
+    }
+    InMemoryDatabase.drop(schemaFactory);
+  }
+
+  @Test
+  public void byName() throws Exception {
+    assertQuery("name:project");
+    assertQuery("name:non-existing");
+
+    ProjectInfo project = createProject(name("project"));
+
+    assertQuery("name:" + project.name, project);
+
+    // only exact match
+    ProjectInfo projectWithHyphen = createProject(name("project-with-hyphen"));
+    createProject(name("project-no-match-with-hyphen"));
+    assertQuery("name:" + projectWithHyphen.name, projectWithHyphen);
+  }
+
+  @Test
+  public void byParent() throws Exception {
+    assertQuery("parent:project");
+    ProjectInfo parent = createProject(name("parent"));
+    assertQuery("parent:" + parent.name);
+    ProjectInfo child = createProject(name("child"), parent.name);
+    assertQuery("parent:" + parent.name, child);
+  }
+
+  @Test
+  public void byParentOfAllProjects() throws Exception {
+    Set<String> excludedProjects = ImmutableSet.of(allProjects.get(), allUsers.get());
+    ProjectInfo[] projects =
+        gApi.projects().list().get().stream()
+            .filter(p -> !excludedProjects.contains(p.name))
+            .toArray(s -> new ProjectInfo[s]);
+    assertQuery("parent:" + allProjects.get(), projects);
+  }
+
+  @Test
+  public void byInname() throws Exception {
+    String namePart = getSanitizedMethodName();
+    namePart = CharMatcher.is('_').removeFrom(namePart);
+
+    ProjectInfo project1 = createProject(name("project1-" + namePart));
+    ProjectInfo project2 = createProject(name("project2-" + namePart + "-foo"));
+    ProjectInfo project3 = createProject(name("project3-" + namePart + "foo"));
+
+    assertQuery("inname:" + namePart, project1, project2, project3);
+    assertQuery("inname:" + namePart.toUpperCase(Locale.US), project1, project2, project3);
+    assertQuery("inname:" + namePart.toLowerCase(Locale.US), project1, project2, project3);
+  }
+
+  @Test
+  public void byDescription() throws Exception {
+    ProjectInfo project1 =
+        createProjectWithDescription(name("project1"), "This is a test project.");
+    ProjectInfo project2 = createProjectWithDescription(name("project2"), "ANOTHER TEST PROJECT.");
+    createProjectWithDescription(name("project3"), "Maintainers of project foo.");
+    assertQuery("description:test", project1, project2);
+
+    assertQuery("description:non-existing");
+
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("description operator requires a value");
+    assertQuery("description:\"\"");
+  }
+
+  @Test
+  public void byState() throws Exception {
+    assume().that(getSchemaVersion() >= 2).isTrue();
+
+    ProjectInfo project1 = createProjectWithState(name("project1"), ProjectState.ACTIVE);
+    ProjectInfo project2 = createProjectWithState(name("project2"), ProjectState.READ_ONLY);
+    assertQuery("state:active", project1);
+    assertQuery("state:read-only", project2);
+  }
+
+  @Test
+  public void byState_emptyQuery() throws Exception {
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("state operator requires a value");
+    assertQuery("state:\"\"");
+  }
+
+  @Test
+  public void byState_badQuery() throws Exception {
+    exception.expect(BadRequestException.class);
+    exception.expectMessage("state operator must be either 'active' or 'read-only'");
+    assertQuery("state:bla");
+  }
+
+  @Test
+  public void byDefaultField() throws Exception {
+    ProjectInfo project1 = createProject(name("foo-project"));
+    ProjectInfo project2 = createProject(name("project2"));
+    ProjectInfo project3 =
+        createProjectWithDescription(
+            name("project3"),
+            "decription that contains foo and the UUID of project2: " + project2.id);
+
+    assertQuery("non-existing");
+    assertQuery("foo", project1, project3);
+    assertQuery(project2.id, project2, project3);
+  }
+
+  @Test
+  public void withLimit() throws Exception {
+    ProjectInfo project1 = createProject(name("project1"));
+    ProjectInfo project2 = createProject(name("project2"));
+    ProjectInfo project3 = createProject(name("project3"));
+
+    String query =
+        "name:" + project1.name + " OR name:" + project2.name + " OR name:" + project3.name;
+    List<ProjectInfo> result = assertQuery(query, project1, project2, project3);
+
+    assertQuery(newQuery(query).withLimit(2), result.subList(0, 2));
+  }
+
+  @Test
+  public void withStart() throws Exception {
+    ProjectInfo project1 = createProject(name("project1"));
+    ProjectInfo project2 = createProject(name("project2"));
+    ProjectInfo project3 = createProject(name("project3"));
+
+    String query =
+        "name:" + project1.name + " OR name:" + project2.name + " OR name:" + project3.name;
+    List<ProjectInfo> result = assertQuery(query, project1, project2, project3);
+
+    assertQuery(newQuery(query).withStart(1), result.subList(1, 3));
+  }
+
+  @Test
+  public void sortedByName() throws Exception {
+    ProjectInfo projectFoo = createProject("foo-" + name("project1"));
+    ProjectInfo projectBar = createProject("bar-" + name("project2"));
+    ProjectInfo projectBaz = createProject("baz-" + name("project3"));
+
+    String query =
+        "name:" + projectFoo.name + " OR name:" + projectBar.name + " OR name:" + projectBaz.name;
+    assertQuery(newQuery(query), projectBar, projectBaz, projectFoo);
+  }
+
+  @Test
+  public void asAnonymous() throws Exception {
+    ProjectInfo project = createProjectRestrictedToRegisteredUsers(name("project"));
+
+    setAnonymous();
+    assertQuery("name:" + project.name);
+  }
+
+  private Account.Id createAccount(String username, String fullName, String email, boolean active)
+      throws Exception {
+    try (ManualRequestContext ctx = oneOffRequestContext.open()) {
+      Account.Id id = accountManager.authenticate(AuthRequest.forUser(username)).getAccountId();
+      if (email != null) {
+        accountManager.link(id, AuthRequest.forEmail(email));
+      }
+      accountsUpdate
+          .get()
+          .update(
+              "Update Test Account",
+              id,
+              u -> {
+                u.setFullName(fullName).setPreferredEmail(email).setActive(active);
+              });
+      return id;
+    }
+  }
+
+  protected ProjectInfo createProject(String name) throws Exception {
+    ProjectInput in = new ProjectInput();
+    in.name = name;
+    return gApi.projects().create(in).get();
+  }
+
+  protected ProjectInfo createProject(String name, String parent) throws Exception {
+    ProjectInput in = new ProjectInput();
+    in.name = name;
+    in.parent = parent;
+    return gApi.projects().create(in).get();
+  }
+
+  protected ProjectInfo createProjectWithDescription(String name, String description)
+      throws Exception {
+    ProjectInput in = new ProjectInput();
+    in.name = name;
+    in.description = description;
+    return gApi.projects().create(in).get();
+  }
+
+  protected ProjectInfo createProjectWithState(String name, ProjectState state) throws Exception {
+    ProjectInfo info = createProject(name);
+    ConfigInput config = new ConfigInput();
+    config.state = state;
+    gApi.projects().name(info.name).config(config);
+    return info;
+  }
+
+  protected ProjectInfo createProjectRestrictedToRegisteredUsers(String name) throws Exception {
+    createProject(name);
+
+    ProjectAccessInput accessInput = new ProjectAccessInput();
+    AccessSectionInfo accessSection = new AccessSectionInfo();
+    PermissionInfo read = new PermissionInfo(null, null);
+    PermissionRuleInfo pri = new PermissionRuleInfo(PermissionRuleInfo.Action.BLOCK, false);
+    read.rules = ImmutableMap.of(SystemGroupBackend.ANONYMOUS_USERS.get(), pri);
+    accessSection.permissions = ImmutableMap.of("read", read);
+    accessInput.add = ImmutableMap.of("refs/*", accessSection);
+    gApi.projects().name(name).access(accessInput);
+
+    return gApi.projects().name(name).get();
+  }
+
+  protected ProjectInfo getProject(Project.NameKey nameKey) throws Exception {
+    return gApi.projects().name(nameKey.get()).get();
+  }
+
+  protected List<ProjectInfo> assertQuery(Object query, ProjectInfo... projects) throws Exception {
+    return assertQuery(newQuery(query), projects);
+  }
+
+  protected List<ProjectInfo> assertQuery(QueryRequest query, ProjectInfo... projects)
+      throws Exception {
+    return assertQuery(query, Arrays.asList(projects));
+  }
+
+  protected List<ProjectInfo> assertQuery(QueryRequest query, List<ProjectInfo> projects)
+      throws Exception {
+    List<ProjectInfo> result = query.get();
+    Iterable<String> names = names(result);
+    assertThat(names)
+        .named(format(query, result, projects))
+        .containsExactlyElementsIn(names(projects))
+        .inOrder();
+    return result;
+  }
+
+  protected QueryRequest newQuery(Object query) {
+    return gApi.projects().query(query.toString());
+  }
+
+  protected String format(
+      QueryRequest query, List<ProjectInfo> actualProjects, List<ProjectInfo> expectedProjects) {
+    StringBuilder b = new StringBuilder();
+    b.append("query '").append(query.getQuery()).append("' with expected projects ");
+    b.append(format(expectedProjects));
+    b.append(" and result ");
+    b.append(format(actualProjects));
+    return b.toString();
+  }
+
+  protected String format(Iterable<ProjectInfo> projects) {
+    StringBuilder b = new StringBuilder();
+    b.append("[");
+    Iterator<ProjectInfo> it = projects.iterator();
+    while (it.hasNext()) {
+      ProjectInfo p = it.next();
+      b.append("{")
+          .append(p.id)
+          .append(", ")
+          .append("name=")
+          .append(p.name)
+          .append(", ")
+          .append("parent=")
+          .append(p.parent)
+          .append(", ")
+          .append("description=")
+          .append(p.description)
+          .append("}");
+      if (it.hasNext()) {
+        b.append(", ");
+      }
+    }
+    b.append("]");
+    return b.toString();
+  }
+
+  protected int getSchemaVersion() {
+    return getSchema().getVersion();
+  }
+
+  protected Schema<ProjectData> getSchema() {
+    return indexes.getSearchIndex().getSchema();
+  }
+
+  protected static Iterable<String> names(ProjectInfo... projects) {
+    return names(Arrays.asList(projects));
+  }
+
+  protected static Iterable<String> names(List<ProjectInfo> projects) {
+    return projects.stream().map(p -> p.name).collect(toList());
+  }
+
+  protected String name(String name) {
+    if (name == null) {
+      return null;
+    }
+
+    return name + "_" + getSanitizedMethodName();
+  }
+}
diff --git a/javatests/com/google/gerrit/server/query/project/BUILD b/javatests/com/google/gerrit/server/query/project/BUILD
new file mode 100644
index 0000000..4ce1c00
--- /dev/null
+++ b/javatests/com/google/gerrit/server/query/project/BUILD
@@ -0,0 +1,42 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+ABSTRACT_QUERY_TEST = ["AbstractQueryProjectsTest.java"]
+
+java_library(
+    name = "abstract_query_tests",
+    testonly = True,
+    srcs = ABSTRACT_QUERY_TEST,
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/index",
+        "//java/com/google/gerrit/index/project",
+        "//java/com/google/gerrit/lifecycle",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/server/schema",
+        "//java/com/google/gerrit/testing:gerrit-test-util",
+        "//lib:guava",
+        "//lib/guice",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/truth",
+    ],
+)
+
+junit_tests(
+    name = "lucene_query_test",
+    size = "large",
+    srcs = glob(
+        ["*.java"],
+        exclude = ABSTRACT_QUERY_TEST,
+    ),
+    visibility = ["//visibility:public"],
+    deps = [
+        ":abstract_query_tests",
+        "//java/com/google/gerrit/index/project",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/testing:gerrit-test-util",
+        "//lib/guice",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+    ],
+)
diff --git a/javatests/com/google/gerrit/server/query/project/LuceneQueryProjectsTest.java b/javatests/com/google/gerrit/server/query/project/LuceneQueryProjectsTest.java
new file mode 100644
index 0000000..42964fa
--- /dev/null
+++ b/javatests/com/google/gerrit/server/query/project/LuceneQueryProjectsTest.java
@@ -0,0 +1,50 @@
+// Copyright (C) 2017 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.google.gerrit.server.query.project;
+
+import com.google.gerrit.index.project.ProjectSchemaDefinitions;
+import com.google.gerrit.testing.ConfigSuite;
+import com.google.gerrit.testing.InMemoryModule;
+import com.google.gerrit.testing.IndexConfig;
+import com.google.gerrit.testing.IndexVersions;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.jgit.lib.Config;
+
+public class LuceneQueryProjectsTest extends AbstractQueryProjectsTest {
+  @ConfigSuite.Default
+  public static Config defaultConfig() {
+    return IndexConfig.createForLucene();
+  }
+
+  @ConfigSuite.Configs
+  public static Map<String, Config> againstPreviousIndexVersion() {
+    // the current schema version is already tested by the inherited default config suite
+    List<Integer> schemaVersions =
+        IndexVersions.getWithoutLatest(
+            com.google.gerrit.index.project.ProjectSchemaDefinitions.INSTANCE);
+    return IndexVersions.asConfigMap(
+        ProjectSchemaDefinitions.INSTANCE, schemaVersions, "againstIndexVersion", defaultConfig());
+  }
+
+  @Override
+  protected Injector createInjector() {
+    Config luceneConfig = new Config(config);
+    InMemoryModule.setDefaults(luceneConfig);
+    return Guice.createInjector(new InMemoryModule(luceneConfig, notesMigration));
+  }
+}
diff --git a/javatests/com/google/gerrit/server/rules/BUILD b/javatests/com/google/gerrit/server/rules/BUILD
new file mode 100644
index 0000000..62d9a79
--- /dev/null
+++ b/javatests/com/google/gerrit/server/rules/BUILD
@@ -0,0 +1,22 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+junit_tests(
+    name = "prolog_tests",
+    srcs = glob(["*.java"]),
+    resource_strip_prefix = "prologtests",
+    resources = ["//prologtests:gerrit_common_test"],
+    deps = [
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/server/project/testing:project-test-util",
+        "//java/com/google/gerrit/server/util/time",
+        "//java/com/google/gerrit/testing:gerrit-test-util",
+        "//lib:guava",
+        "//lib/guice",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/prolog:runtime",
+        "//lib/truth",
+        "//prolog:gerrit-prolog-common",
+    ],
+)
diff --git a/javatests/com/google/gerrit/server/rules/GerritCommonTest.java b/javatests/com/google/gerrit/server/rules/GerritCommonTest.java
new file mode 100644
index 0000000..086dd65
--- /dev/null
+++ b/javatests/com/google/gerrit/server/rules/GerritCommonTest.java
@@ -0,0 +1,92 @@
+// Copyright (C) 2011 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.google.gerrit.server.rules;
+
+import static org.easymock.EasyMock.expect;
+
+import com.google.gerrit.common.data.LabelTypes;
+import com.google.gerrit.server.project.testing.Util;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.inject.AbstractModule;
+import com.googlecode.prolog_cafe.exceptions.CompileException;
+import com.googlecode.prolog_cafe.exceptions.ReductionLimitException;
+import com.googlecode.prolog_cafe.lang.JavaObjectTerm;
+import com.googlecode.prolog_cafe.lang.Prolog;
+import com.googlecode.prolog_cafe.lang.StructureTerm;
+import com.googlecode.prolog_cafe.lang.SymbolTerm;
+import java.io.PushbackReader;
+import java.io.StringReader;
+import java.util.Arrays;
+import org.easymock.EasyMock;
+import org.eclipse.jgit.lib.Config;
+import org.junit.Before;
+import org.junit.Test;
+
+public class GerritCommonTest extends PrologTestCase {
+  @Before
+  public void setUp() throws Exception {
+    load(
+        "gerrit",
+        "gerrit_common_test.pl",
+        new AbstractModule() {
+          @Override
+          protected void configure() {
+            Config cfg = new Config();
+            cfg.setInt("rules", null, "reductionLimit", 1300);
+            cfg.setInt("rules", null, "compileReductionLimit", (int) 1e6);
+            bind(PrologEnvironment.Args.class)
+                .toInstance(
+                    new PrologEnvironment.Args(
+                        null, null, null, null, null, null, null, cfg, null, null));
+          }
+        });
+  }
+
+  @Override
+  protected void setUpEnvironment(PrologEnvironment env) throws Exception {
+    LabelTypes labelTypes = new LabelTypes(Arrays.asList(Util.codeReview(), Util.verified()));
+    ChangeData cd = EasyMock.createMock(ChangeData.class);
+    expect(cd.getLabelTypes()).andStubReturn(labelTypes);
+    EasyMock.replay(cd);
+    env.set(StoredValues.CHANGE_DATA, cd);
+  }
+
+  @Test
+  public void gerritCommon() throws Exception {
+    runPrologBasedTests();
+  }
+
+  @Test
+  public void reductionLimit() throws Exception {
+    PrologEnvironment env = envFactory.create(machine);
+    setUpEnvironment(env);
+
+    String script = "loopy :- b(5).\nb(N) :- N > 0, !, S = N - 1, b(S).\nb(_) :- true.\n";
+
+    SymbolTerm nameTerm = SymbolTerm.create("testReductionLimit");
+    JavaObjectTerm inTerm =
+        new JavaObjectTerm(new PushbackReader(new StringReader(script), Prolog.PUSHBACK_SIZE));
+    if (!env.execute(Prolog.BUILTIN, "consult_stream", nameTerm, inTerm)) {
+      throw new CompileException("Cannot consult " + nameTerm);
+    }
+
+    exception.expect(ReductionLimitException.class);
+    exception.expectMessage("exceeded reduction limit of 1300");
+    env.once(
+        Prolog.BUILTIN,
+        "call",
+        new StructureTerm(":", SymbolTerm.create("user"), SymbolTerm.create("loopy")));
+  }
+}
diff --git a/javatests/com/google/gerrit/server/rules/IgnoreSelfApprovalRuleTest.java b/javatests/com/google/gerrit/server/rules/IgnoreSelfApprovalRuleTest.java
new file mode 100644
index 0000000..27f4423
--- /dev/null
+++ b/javatests/com/google/gerrit/server/rules/IgnoreSelfApprovalRuleTest.java
@@ -0,0 +1,96 @@
+// 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.
+
+package com.google.gerrit.server.rules;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.LabelValue;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.LabelId;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+import org.junit.Test;
+
+public class IgnoreSelfApprovalRuleTest {
+  private static final Change.Id CHANGE_ID = new Change.Id(100);
+  private static final PatchSet.Id PS_ID = new PatchSet.Id(CHANGE_ID, 1);
+  private static final LabelType VERIFIED = makeLabel("Verified");
+  private static final Account.Id USER1 = makeAccount(100001);
+
+  @Test
+  public void filtersByLabel() {
+    LabelType codeReview = makeLabel("Code-Review");
+    PatchSetApproval approvalVerified = makeApproval(VERIFIED.getLabelId(), USER1, 2);
+    PatchSetApproval approvalCr = makeApproval(codeReview.getLabelId(), USER1, 2);
+
+    Collection<PatchSetApproval> filteredApprovals =
+        IgnoreSelfApprovalRule.filterApprovalsByLabel(
+            ImmutableList.of(approvalVerified, approvalCr), VERIFIED);
+
+    assertThat(filteredApprovals).containsExactly(approvalVerified);
+  }
+
+  @Test
+  public void filtersVotesFromUser() {
+    PatchSetApproval approvalM2 = makeApproval(VERIFIED.getLabelId(), USER1, -2);
+    PatchSetApproval approvalM1 = makeApproval(VERIFIED.getLabelId(), USER1, -1);
+
+    ImmutableList<PatchSetApproval> approvals =
+        ImmutableList.of(
+            approvalM2,
+            approvalM1,
+            makeApproval(VERIFIED.getLabelId(), USER1, 0),
+            makeApproval(VERIFIED.getLabelId(), USER1, +1),
+            makeApproval(VERIFIED.getLabelId(), USER1, +2));
+
+    Collection<PatchSetApproval> filteredApprovals =
+        IgnoreSelfApprovalRule.filterOutPositiveApprovalsOfUser(approvals, USER1);
+
+    assertThat(filteredApprovals).containsExactly(approvalM1, approvalM2);
+  }
+
+  private static LabelType makeLabel(String labelName) {
+    List<LabelValue> values = new ArrayList<>();
+    // The label text is irrelevant here, only the numerical value is used
+    values.add(new LabelValue((short) -2, "-2"));
+    values.add(new LabelValue((short) -1, "-1"));
+    values.add(new LabelValue((short) 0, "No vote."));
+    values.add(new LabelValue((short) 1, "+1"));
+    values.add(new LabelValue((short) 2, "+2"));
+    return new LabelType(labelName, values);
+  }
+
+  private static PatchSetApproval makeApproval(LabelId labelId, Account.Id accountId, int value) {
+    PatchSetApproval.Key key = makeKey(PS_ID, accountId, labelId);
+    return new PatchSetApproval(key, (short) value, Date.from(Instant.now()));
+  }
+
+  private static PatchSetApproval.Key makeKey(
+      PatchSet.Id psId, Account.Id accountId, LabelId labelId) {
+    return new PatchSetApproval.Key(psId, accountId, labelId);
+  }
+
+  private static Account.Id makeAccount(int account) {
+    return new Account.Id(account);
+  }
+}
diff --git a/javatests/com/google/gerrit/server/rules/PrologRuleEvaluatorTest.java b/javatests/com/google/gerrit/server/rules/PrologRuleEvaluatorTest.java
new file mode 100644
index 0000000..8622b32
--- /dev/null
+++ b/javatests/com/google/gerrit/server/rules/PrologRuleEvaluatorTest.java
@@ -0,0 +1,47 @@
+// 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.
+
+package com.google.gerrit.server.rules;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import org.junit.Test;
+
+public class PrologRuleEvaluatorTest {
+
+  @Test
+  public void validLabelNamesAreKept() {
+    for (String labelName : new String[] {"Verified", "Code-Review"}) {
+      assertThat(PrologRuleEvaluator.checkLabelName(labelName)).isEqualTo(labelName);
+    }
+  }
+
+  @Test
+  public void labelWithSpacesIsTransformed() {
+    assertThat(PrologRuleEvaluator.checkLabelName("Label with spaces"))
+        .isEqualTo("Invalid-Prolog-Rules-Label-Name-Labelwithspaces");
+  }
+
+  @Test
+  public void labelStartingWithADashIsTransformed() {
+    assertThat(PrologRuleEvaluator.checkLabelName("-dashed-label"))
+        .isEqualTo("Invalid-Prolog-Rules-Label-Name-dashed-label");
+  }
+
+  @Test
+  public void labelWithInvalidCharactersIsTransformed() {
+    assertThat(PrologRuleEvaluator.checkLabelName("*urgent*"))
+        .isEqualTo("Invalid-Prolog-Rules-Label-Name-urgent");
+  }
+}
diff --git a/javatests/com/google/gerrit/server/rules/PrologTestCase.java b/javatests/com/google/gerrit/server/rules/PrologTestCase.java
new file mode 100644
index 0000000..f4d8eac
--- /dev/null
+++ b/javatests/com/google/gerrit/server/rules/PrologTestCase.java
@@ -0,0 +1,189 @@
+// Copyright (C) 2011 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.google.gerrit.server.rules;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.testing.GerritBaseTests;
+import com.google.inject.Guice;
+import com.google.inject.Module;
+import com.googlecode.prolog_cafe.exceptions.CompileException;
+import com.googlecode.prolog_cafe.lang.BufferingPrologControl;
+import com.googlecode.prolog_cafe.lang.JavaObjectTerm;
+import com.googlecode.prolog_cafe.lang.Prolog;
+import com.googlecode.prolog_cafe.lang.PrologClassLoader;
+import com.googlecode.prolog_cafe.lang.PrologMachineCopy;
+import com.googlecode.prolog_cafe.lang.StructureTerm;
+import com.googlecode.prolog_cafe.lang.SymbolTerm;
+import com.googlecode.prolog_cafe.lang.Term;
+import com.googlecode.prolog_cafe.lang.VariableTerm;
+import java.io.BufferedReader;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.PushbackReader;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.junit.Ignore;
+
+/** Base class for any tests written in Prolog. */
+@Ignore
+public abstract class PrologTestCase extends GerritBaseTests {
+  private static final SymbolTerm test_1 = SymbolTerm.intern("test", 1);
+
+  private String pkg;
+  private boolean hasSetup;
+  private boolean hasTeardown;
+  private List<Term> tests;
+  protected PrologMachineCopy machine;
+  protected PrologEnvironment.Factory envFactory;
+
+  protected void load(String pkg, String prologResource, Module... modules)
+      throws CompileException, IOException {
+    ArrayList<Module> moduleList = new ArrayList<>();
+    moduleList.add(new PrologModule.EnvironmentModule());
+    moduleList.addAll(Arrays.asList(modules));
+
+    envFactory = Guice.createInjector(moduleList).getInstance(PrologEnvironment.Factory.class);
+    PrologEnvironment env = envFactory.create(newMachine());
+    consult(env, getClass(), prologResource);
+
+    this.pkg = pkg;
+    hasSetup = has(env, "setup");
+    hasTeardown = has(env, "teardown");
+
+    StructureTerm head =
+        new StructureTerm(
+            ":", SymbolTerm.intern(pkg), new StructureTerm(test_1, new VariableTerm()));
+
+    tests = new ArrayList<>();
+    for (Term[] pair : env.all(Prolog.BUILTIN, "clause", head, new VariableTerm())) {
+      tests.add(pair[0]);
+    }
+    assertThat(tests).isNotEmpty();
+    machine = PrologMachineCopy.save(env);
+  }
+
+  /**
+   * Set up the Prolog environment.
+   *
+   * @param env Prolog environment.
+   */
+  protected void setUpEnvironment(PrologEnvironment env) throws Exception {}
+
+  private PrologMachineCopy newMachine() {
+    BufferingPrologControl ctl = new BufferingPrologControl();
+    ctl.setMaxDatabaseSize(16 * 1024);
+    ctl.setPrologClassLoader(new PrologClassLoader(getClass().getClassLoader()));
+    return PrologMachineCopy.save(ctl);
+  }
+
+  protected void consult(BufferingPrologControl env, Class<?> clazz, String prologResource)
+      throws CompileException, IOException {
+    try (InputStream in = clazz.getResourceAsStream(prologResource)) {
+      if (in == null) {
+        throw new FileNotFoundException(prologResource);
+      }
+      SymbolTerm pathTerm = SymbolTerm.create(prologResource);
+      JavaObjectTerm inTerm =
+          new JavaObjectTerm(
+              new PushbackReader(
+                  new BufferedReader(new InputStreamReader(in, UTF_8)), Prolog.PUSHBACK_SIZE));
+      if (!env.execute(Prolog.BUILTIN, "consult_stream", pathTerm, inTerm)) {
+        throw new CompileException("Cannot consult " + prologResource);
+      }
+    }
+  }
+
+  private boolean has(BufferingPrologControl env, String name) {
+    StructureTerm head = SymbolTerm.create(pkg, name, 0);
+    return env.execute(Prolog.BUILTIN, "clause", head, new VariableTerm());
+  }
+
+  public void runPrologBasedTests() throws Exception {
+    int errors = 0;
+    long start = TimeUtil.nowMs();
+
+    for (Term test : tests) {
+      PrologEnvironment env = envFactory.create(machine);
+      setUpEnvironment(env);
+      env.setEnabled(Prolog.Feature.IO, true);
+
+      System.out.format("Prolog %-60s ...", removePackage(test));
+      System.out.flush();
+
+      if (hasSetup) {
+        call(env, "setup");
+      }
+
+      List<Term> all = env.all(Prolog.BUILTIN, "call", test);
+
+      if (hasTeardown) {
+        call(env, "teardown");
+      }
+
+      System.out.println(all.size() == 1 ? "OK" : "FAIL");
+
+      if (all.size() > 0 && !test.equals(all.get(0))) {
+        for (Term t : all) {
+          Term head = ((StructureTerm) removePackage(t)).args()[0];
+          Term[] args = ((StructureTerm) head).args();
+          System.out.print("  Result: ");
+          for (int i = 0; i < args.length; i++) {
+            if (0 < i) {
+              System.out.print(", ");
+            }
+            System.out.print(args[i]);
+          }
+          System.out.println();
+        }
+        System.out.println();
+      }
+
+      if (all.size() != 1) {
+        errors++;
+      }
+    }
+
+    long end = TimeUtil.nowMs();
+    System.out.println("-------------------------------");
+    System.out.format(
+        "Prolog tests: %d, Failures: %d, Time elapsed %.3f sec",
+        tests.size(), errors, (end - start) / 1000.0);
+    System.out.println();
+
+    assertThat(errors).isEqualTo(0);
+  }
+
+  private void call(BufferingPrologControl env, String name) {
+    StructureTerm head = SymbolTerm.create(pkg, name, 0);
+    assertWithMessage("Cannot invoke " + pkg + ":" + name)
+        .that(env.execute(Prolog.BUILTIN, "call", head))
+        .isTrue();
+  }
+
+  private Term removePackage(Term test) {
+    Term name = test;
+    if (name instanceof StructureTerm && ":".equals(name.name())) {
+      name = name.arg(1);
+    }
+    return name;
+  }
+}
diff --git a/javatests/com/google/gerrit/server/schema/GroupBundleTest.java b/javatests/com/google/gerrit/server/schema/GroupBundleTest.java
new file mode 100644
index 0000000..c1de3a3
--- /dev/null
+++ b/javatests/com/google/gerrit/server/schema/GroupBundleTest.java
@@ -0,0 +1,146 @@
+// Copyright (C) 2017 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.google.gerrit.server.schema;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.AccountGroupById;
+import com.google.gerrit.reviewdb.client.AccountGroupByIdAud;
+import com.google.gerrit.reviewdb.client.AccountGroupMember;
+import com.google.gerrit.reviewdb.client.AccountGroupMemberAudit;
+import com.google.gerrit.server.schema.GroupBundle.Source;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.testing.GerritBaseTests;
+import com.google.gerrit.testing.TestTimeUtil;
+import java.sql.Timestamp;
+import java.util.TimeZone;
+import java.util.concurrent.TimeUnit;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class GroupBundleTest extends GerritBaseTests {
+  // This class just contains sanity checks that GroupBundle#compare correctly compares all parts of
+  // the bundle. Most other test coverage should come via the slightly more realistic
+  // GroupRebuilderTest.
+
+  private static final String TIMEZONE_ID = "US/Eastern";
+
+  private String systemTimeZoneProperty;
+  private TimeZone systemTimeZone;
+  private Timestamp ts;
+
+  @Before
+  public void setUp() {
+    systemTimeZoneProperty = System.setProperty("user.timezone", TIMEZONE_ID);
+    systemTimeZone = TimeZone.getDefault();
+    TimeZone.setDefault(TimeZone.getTimeZone(TIMEZONE_ID));
+    TestTimeUtil.resetWithClockStep(1, TimeUnit.SECONDS);
+    ts = TimeUtil.nowTs();
+  }
+
+  @After
+  public void tearDown() {
+    TestTimeUtil.useSystemTime();
+    System.setProperty("user.timezone", systemTimeZoneProperty);
+    TimeZone.setDefault(systemTimeZone);
+  }
+
+  @Test
+  public void compareNonEqual() throws Exception {
+    GroupBundle reviewDbBundle = newBundle().source(Source.REVIEW_DB).build();
+    AccountGroup g2 = new AccountGroup(reviewDbBundle.group());
+    g2.setDescription("Hello!");
+    GroupBundle noteDbBundle = GroupBundle.builder().source(Source.NOTE_DB).group(g2).build();
+    assertThat(GroupBundle.compareWithAudits(reviewDbBundle, noteDbBundle))
+        .containsExactly(
+            "AccountGroups differ\n"
+                + ("ReviewDb: AccountGroup{name=group, groupId=1, description=null,"
+                    + " visibleToAll=false, groupUUID=group-1, ownerGroupUUID=group-1,"
+                    + " createdOn=2009-09-30 17:00:00.0}\n")
+                + ("NoteDb  : AccountGroup{name=group, groupId=1, description=Hello!,"
+                    + " visibleToAll=false, groupUUID=group-1, ownerGroupUUID=group-1,"
+                    + " createdOn=2009-09-30 17:00:00.0}"),
+            "AccountGroupMembers differ\n"
+                + "ReviewDb: [AccountGroupMember{key=1000,1}]\n"
+                + "NoteDb  : []",
+            "AccountGroupMemberAudits differ\n"
+                + ("ReviewDb: [AccountGroupMemberAudit{key=Key{groupId=1, accountId=1000,"
+                    + " addedOn=2009-09-30 17:00:00.0}, addedBy=2000, removedBy=null,"
+                    + " removedOn=null}]\n")
+                + "NoteDb  : []",
+            "AccountGroupByIds differ\n"
+                + "ReviewDb: [AccountGroupById{key=1,subgroup}]\n"
+                + "NoteDb  : []",
+            "AccountGroupByIdAudits differ\n"
+                + ("ReviewDb: [AccountGroupByIdAud{key=Key{groupId=1, includeUUID=subgroup,"
+                    + " addedOn=2009-09-30 17:00:00.0}, addedBy=3000, removedBy=null,"
+                    + " removedOn=null}]\n")
+                + "NoteDb  : []");
+  }
+
+  @Test
+  public void compareIgnoreAudits() throws Exception {
+    GroupBundle reviewDbBundle = newBundle().source(Source.REVIEW_DB).build();
+    AccountGroup group = new AccountGroup(reviewDbBundle.group());
+
+    AccountGroupMember member =
+        new AccountGroupMember(new AccountGroupMember.Key(new Account.Id(1), group.getId()));
+    AccountGroupMemberAudit memberAudit =
+        new AccountGroupMemberAudit(member, new Account.Id(2), ts);
+    AccountGroupById byId =
+        new AccountGroupById(
+            new AccountGroupById.Key(group.getId(), new AccountGroup.UUID("subgroup-2")));
+    AccountGroupByIdAud byIdAudit = new AccountGroupByIdAud(byId, new Account.Id(3), ts);
+
+    GroupBundle noteDbBundle =
+        newBundle().source(Source.NOTE_DB).memberAudit(memberAudit).byIdAudit(byIdAudit).build();
+
+    assertThat(GroupBundle.compareWithAudits(reviewDbBundle, noteDbBundle)).isNotEmpty();
+    assertThat(GroupBundle.compareWithoutAudits(reviewDbBundle, noteDbBundle)).isEmpty();
+  }
+
+  @Test
+  public void compareEqual() throws Exception {
+    GroupBundle reviewDbBundle = newBundle().source(Source.REVIEW_DB).build();
+    GroupBundle noteDbBundle = newBundle().source(Source.NOTE_DB).build();
+    assertThat(GroupBundle.compareWithAudits(reviewDbBundle, noteDbBundle)).isEmpty();
+  }
+
+  private GroupBundle.Builder newBundle() {
+    AccountGroup group =
+        new AccountGroup(
+            new AccountGroup.NameKey("group"),
+            new AccountGroup.Id(1),
+            new AccountGroup.UUID("group-1"),
+            ts);
+    AccountGroupMember member =
+        new AccountGroupMember(new AccountGroupMember.Key(new Account.Id(1000), group.getId()));
+    AccountGroupMemberAudit memberAudit =
+        new AccountGroupMemberAudit(member, new Account.Id(2000), ts);
+    AccountGroupById byId =
+        new AccountGroupById(
+            new AccountGroupById.Key(group.getId(), new AccountGroup.UUID("subgroup")));
+    AccountGroupByIdAud byIdAudit = new AccountGroupByIdAud(byId, new Account.Id(3000), ts);
+    return GroupBundle.builder()
+        .group(group)
+        .members(member)
+        .memberAudit(memberAudit)
+        .byId(byId)
+        .byIdAudit(byIdAudit);
+  }
+}
diff --git a/javatests/com/google/gerrit/server/schema/GroupRebuilderTest.java b/javatests/com/google/gerrit/server/schema/GroupRebuilderTest.java
new file mode 100644
index 0000000..bf6953a
--- /dev/null
+++ b/javatests/com/google/gerrit/server/schema/GroupRebuilderTest.java
@@ -0,0 +1,747 @@
+// Copyright (C) 2017 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.google.gerrit.server.schema;
+
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assert_;
+import static com.google.gerrit.extensions.common.testing.CommitInfoSubject.assertThat;
+import static com.google.gerrit.reviewdb.client.RefNames.REFS_GROUPNAMES;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.GroupDescription;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.extensions.common.CommitInfo;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.AccountGroupById;
+import com.google.gerrit.reviewdb.client.AccountGroupByIdAud;
+import com.google.gerrit.reviewdb.client.AccountGroupMember;
+import com.google.gerrit.reviewdb.client.AccountGroupMemberAudit;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.AllUsersNameProvider;
+import com.google.gerrit.server.group.db.AuditLogFormatter;
+import com.google.gerrit.server.group.db.AuditLogReader;
+import com.google.gerrit.server.group.db.GroupNameNotes;
+import com.google.gerrit.server.update.RefUpdateUtil;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.testing.GerritBaseTests;
+import com.google.gerrit.testing.GitTestUtil;
+import com.google.gerrit.testing.InMemoryRepositoryManager;
+import com.google.gerrit.testing.TestTimeUtil;
+import com.google.gwtorm.server.OrmDuplicateKeyException;
+import java.sql.Timestamp;
+import java.util.Optional;
+import java.util.TimeZone;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.IntStream;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class GroupRebuilderTest extends GerritBaseTests {
+  private static final TimeZone TZ = TimeZone.getTimeZone("America/Los_Angeles");
+  private static final String SERVER_ID = "server-id";
+  private static final String SERVER_NAME = "Gerrit Server";
+  private static final String SERVER_EMAIL = "noreply@gerritcodereview.com";
+
+  private AtomicInteger idCounter;
+  private AllUsersName allUsersName;
+  private Repository repo;
+  private GroupRebuilder rebuilder;
+  private GroupBundle.Factory bundleFactory;
+
+  @Before
+  public void setUp() throws Exception {
+    TestTimeUtil.resetWithClockStep(1, TimeUnit.SECONDS);
+    idCounter = new AtomicInteger();
+    allUsersName = new AllUsersName(AllUsersNameProvider.DEFAULT);
+    repo = new InMemoryRepositoryManager().createRepository(allUsersName);
+    rebuilder =
+        new GroupRebuilder(
+            GroupRebuilderTest.newPersonIdent(),
+            allUsersName,
+            // Note that the expected name/email values in tests are not necessarily realistic,
+            // since they use these trivial name/email functions.
+            getAuditLogFormatter());
+    bundleFactory = new GroupBundle.Factory(new AuditLogReader(SERVER_ID, allUsersName));
+  }
+
+  @After
+  public void tearDown() {
+    TestTimeUtil.useSystemTime();
+  }
+
+  @Test
+  public void minimalGroupFields() throws Exception {
+    AccountGroup g = newGroup("a");
+    GroupBundle b = builder().group(g).build();
+
+    rebuilder.rebuild(repo, b, null);
+
+    assertMigratedCleanly(reload(g), b);
+    ImmutableList<CommitInfo> log = log(g);
+    assertThat(log).hasSize(1);
+    assertCommit(log.get(0), "Create group", SERVER_NAME, SERVER_EMAIL);
+    assertThat(logGroupNames()).isEmpty();
+  }
+
+  @Test
+  public void allGroupFields() throws Exception {
+    AccountGroup g = newGroup("a");
+    g.setDescription("Description");
+    g.setOwnerGroupUUID(new AccountGroup.UUID("owner"));
+    g.setVisibleToAll(true);
+    GroupBundle b = builder().group(g).build();
+
+    rebuilder.rebuild(repo, b, null);
+
+    assertMigratedCleanly(reload(g), b);
+    ImmutableList<CommitInfo> log = log(g);
+    assertThat(log).hasSize(1);
+    assertServerCommit(log.get(0), "Create group");
+  }
+
+  @Test
+  public void emptyGroupName() throws Exception {
+    AccountGroup g = newGroup("");
+    GroupBundle b = builder().group(g).build();
+
+    rebuilder.rebuild(repo, b, null);
+
+    GroupBundle noteDbBundle = reload(g);
+    assertMigratedCleanly(noteDbBundle, b);
+    assertThat(noteDbBundle.group().getName()).isEmpty();
+  }
+
+  @Test
+  public void nullGroupDescription() throws Exception {
+    AccountGroup g = newGroup("a");
+    g.setDescription(null);
+    assertThat(g.getDescription()).isNull();
+    GroupBundle b = builder().group(g).build();
+
+    rebuilder.rebuild(repo, b, null);
+
+    GroupBundle noteDbBundle = reload(g);
+    assertMigratedCleanly(noteDbBundle, b);
+    assertThat(noteDbBundle.group().getDescription()).isNull();
+  }
+
+  @Test
+  public void emptyGroupDescription() throws Exception {
+    AccountGroup g = newGroup("a");
+    g.setDescription("");
+    assertThat(g.getDescription()).isEmpty();
+    GroupBundle b = builder().group(g).build();
+
+    rebuilder.rebuild(repo, b, null);
+
+    GroupBundle noteDbBundle = reload(g);
+    assertMigratedCleanly(noteDbBundle, b);
+    assertThat(noteDbBundle.group().getDescription()).isNull();
+  }
+
+  @Test
+  public void membersAndSubgroups() throws Exception {
+    AccountGroup g = newGroup("a");
+    GroupBundle b =
+        builder()
+            .group(g)
+            .members(member(g, 1), member(g, 2))
+            .byId(byId(g, "x"), byId(g, "y"))
+            .build();
+
+    rebuilder.rebuild(repo, b, null);
+
+    assertMigratedCleanly(reload(g), b);
+    ImmutableList<CommitInfo> log = log(g);
+    assertThat(log).hasSize(2);
+    assertServerCommit(log.get(0), "Create group");
+    assertServerCommit(
+        log.get(1),
+        "Update group\n"
+            + "\n"
+            + "Add-group: Group x <x>\n"
+            + "Add-group: Group y <y>\n"
+            + "Add: Account 1 <1@server-id>\n"
+            + "Add: Account 2 <2@server-id>");
+  }
+
+  @Test
+  public void memberAudit() throws Exception {
+    AccountGroup g = newGroup("a");
+    Timestamp t1 = TimeUtil.nowTs();
+    Timestamp t2 = TimeUtil.nowTs();
+    Timestamp t3 = TimeUtil.nowTs();
+    GroupBundle b =
+        builder()
+            .group(g)
+            .members(member(g, 1))
+            .memberAudit(addMember(g, 1, 8, t2), addAndRemoveMember(g, 2, 8, t1, 9, t3))
+            .build();
+
+    rebuilder.rebuild(repo, b, null);
+
+    assertMigratedCleanly(reload(g), b);
+    ImmutableList<CommitInfo> log = log(g);
+    assertThat(log).hasSize(4);
+    assertServerCommit(log.get(0), "Create group");
+    assertCommit(
+        log.get(1), "Update group\n\nAdd: Account 2 <2@server-id>", "Account 8", "8@server-id");
+    assertCommit(
+        log.get(2), "Update group\n\nAdd: Account 1 <1@server-id>", "Account 8", "8@server-id");
+    assertCommit(
+        log.get(3), "Update group\n\nRemove: Account 2 <2@server-id>", "Account 9", "9@server-id");
+  }
+
+  @Test
+  public void memberAuditLegacyRemoved() throws Exception {
+    AccountGroup g = newGroup("a");
+    GroupBundle b =
+        builder()
+            .group(g)
+            .members(member(g, 2))
+            .memberAudit(
+                addAndLegacyRemoveMember(g, 1, 8, TimeUtil.nowTs()),
+                addMember(g, 2, 8, TimeUtil.nowTs()))
+            .build();
+
+    rebuilder.rebuild(repo, b, null);
+
+    assertMigratedCleanly(reload(g), b);
+    ImmutableList<CommitInfo> log = log(g);
+    assertThat(log).hasSize(4);
+    assertServerCommit(log.get(0), "Create group");
+    assertCommit(
+        log.get(1), "Update group\n\nAdd: Account 1 <1@server-id>", "Account 8", "8@server-id");
+    assertCommit(
+        log.get(2), "Update group\n\nRemove: Account 1 <1@server-id>", "Account 8", "8@server-id");
+    assertCommit(
+        log.get(3), "Update group\n\nAdd: Account 2 <2@server-id>", "Account 8", "8@server-id");
+  }
+
+  @Test
+  public void unauditedMembershipsAddedAtEnd() throws Exception {
+    AccountGroup g = newGroup("a");
+    GroupBundle b =
+        builder()
+            .group(g)
+            .members(member(g, 1), member(g, 2), member(g, 3))
+            .memberAudit(addMember(g, 1, 8, TimeUtil.nowTs()))
+            .build();
+
+    rebuilder.rebuild(repo, b, null);
+
+    assertMigratedCleanly(reload(g), b);
+    ImmutableList<CommitInfo> log = log(g);
+    assertThat(log).hasSize(3);
+    assertServerCommit(log.get(0), "Create group");
+    assertCommit(
+        log.get(1), "Update group\n\nAdd: Account 1 <1@server-id>", "Account 8", "8@server-id");
+    assertServerCommit(
+        log.get(2), "Update group\n\nAdd: Account 2 <2@server-id>\nAdd: Account 3 <3@server-id>");
+  }
+
+  @Test
+  public void byIdAudit() throws Exception {
+    AccountGroup g = newGroup("a");
+    Timestamp t1 = TimeUtil.nowTs();
+    Timestamp t2 = TimeUtil.nowTs();
+    Timestamp t3 = TimeUtil.nowTs();
+    GroupBundle b =
+        builder()
+            .group(g)
+            .byId(byId(g, "x"))
+            .byIdAudit(addById(g, "x", 8, t2), addAndRemoveById(g, "y", 8, t1, 9, t3))
+            .build();
+
+    rebuilder.rebuild(repo, b, null);
+
+    assertMigratedCleanly(reload(g), b);
+    ImmutableList<CommitInfo> log = log(g);
+    assertThat(log).hasSize(4);
+    assertServerCommit(log.get(0), "Create group");
+    assertCommit(log.get(1), "Update group\n\nAdd-group: Group y <y>", "Account 8", "8@server-id");
+    assertCommit(log.get(2), "Update group\n\nAdd-group: Group x <x>", "Account 8", "8@server-id");
+    assertCommit(
+        log.get(3), "Update group\n\nRemove-group: Group y <y>", "Account 9", "9@server-id");
+  }
+
+  @Test
+  public void unauditedByIdAddedAtEnd() throws Exception {
+    AccountGroup g = newGroup("a");
+    GroupBundle b =
+        builder()
+            .group(g)
+            .byId(byId(g, "x"), byId(g, "y"), byId(g, "z"))
+            .byIdAudit(addById(g, "x", 8, TimeUtil.nowTs()))
+            .build();
+
+    rebuilder.rebuild(repo, b, null);
+
+    assertMigratedCleanly(reload(g), b);
+    ImmutableList<CommitInfo> log = log(g);
+    assertThat(log).hasSize(3);
+    assertServerCommit(log.get(0), "Create group");
+    assertCommit(log.get(1), "Update group\n\nAdd-group: Group x <x>", "Account 8", "8@server-id");
+    assertServerCommit(
+        log.get(2), "Update group\n\nAdd-group: Group y <y>\nAdd-group: Group z <z>");
+  }
+
+  @Test
+  public void auditsAtSameTimestampBrokenDownByType() throws Exception {
+    AccountGroup g = newGroup("a");
+    Timestamp ts = TimeUtil.nowTs();
+    int user = 8;
+    GroupBundle b =
+        builder()
+            .group(g)
+            .members(member(g, 1), member(g, 2))
+            .memberAudit(
+                addMember(g, 1, user, ts),
+                addMember(g, 2, user, ts),
+                addAndRemoveMember(g, 3, user, ts, user, ts))
+            .byId(byId(g, "x"), byId(g, "y"))
+            .byIdAudit(
+                addById(g, "x", user, ts),
+                addById(g, "y", user, ts),
+                addAndRemoveById(g, "z", user, ts, user, ts))
+            .build();
+
+    rebuilder.rebuild(repo, b, null);
+
+    assertMigratedCleanly(reload(g), b);
+    ImmutableList<CommitInfo> log = log(g);
+    assertThat(log).hasSize(5);
+    assertServerCommit(log.get(0), "Create group");
+    assertCommit(
+        log.get(1),
+        "Update group\n"
+            + "\n"
+            + "Add: Account 1 <1@server-id>\n"
+            + "Add: Account 2 <2@server-id>\n"
+            + "Add: Account 3 <3@server-id>",
+        "Account 8",
+        "8@server-id");
+    assertCommit(
+        log.get(2), "Update group\n\nRemove: Account 3 <3@server-id>", "Account 8", "8@server-id");
+    assertCommit(
+        log.get(3),
+        "Update group\n"
+            + "\n"
+            + "Add-group: Group x <x>\n"
+            + "Add-group: Group y <y>\n"
+            + "Add-group: Group z <z>",
+        "Account 8",
+        "8@server-id");
+    assertCommit(
+        log.get(4), "Update group\n\nRemove-group: Group z <z>", "Account 8", "8@server-id");
+  }
+
+  @Test
+  public void auditsAtSameTimestampBrokenDownByUserAndType() throws Exception {
+    AccountGroup g = newGroup("a");
+    Timestamp ts = TimeUtil.nowTs();
+    int user1 = 8;
+    int user2 = 9;
+
+    GroupBundle b =
+        builder()
+            .group(g)
+            .members(member(g, 1), member(g, 2), member(g, 3))
+            .memberAudit(
+                addMember(g, 1, user1, ts), addMember(g, 2, user2, ts), addMember(g, 3, user1, ts))
+            .byId(byId(g, "x"), byId(g, "y"), byId(g, "z"))
+            .byIdAudit(
+                addById(g, "x", user1, ts), addById(g, "y", user2, ts), addById(g, "z", user1, ts))
+            .build();
+
+    rebuilder.rebuild(repo, b, null);
+
+    assertMigratedCleanly(reload(g), b);
+    ImmutableList<CommitInfo> log = log(g);
+    assertThat(log).hasSize(5);
+    assertServerCommit(log.get(0), "Create group");
+    assertCommit(
+        log.get(1),
+        "Update group\n" + "\n" + "Add: Account 1 <1@server-id>\n" + "Add: Account 3 <3@server-id>",
+        "Account 8",
+        "8@server-id");
+    assertCommit(
+        log.get(2),
+        "Update group\n\nAdd-group: Group x <x>\nAdd-group: Group z <z>",
+        "Account 8",
+        "8@server-id");
+    assertCommit(
+        log.get(3), "Update group\n\nAdd: Account 2 <2@server-id>", "Account 9", "9@server-id");
+    assertCommit(log.get(4), "Update group\n\nAdd-group: Group y <y>", "Account 9", "9@server-id");
+  }
+
+  @Test
+  public void fixupCommitPostDatesAllAuditEventsEvenIfAuditEventsAreInTheFuture() throws Exception {
+    AccountGroup g = newGroup("a");
+    IntStream.range(0, 20).forEach(i -> TimeUtil.nowTs());
+    Timestamp future = TimeUtil.nowTs();
+    TestTimeUtil.resetWithClockStep(1, TimeUnit.SECONDS);
+
+    GroupBundle b =
+        builder()
+            .group(g)
+            .byId(byId(g, "x"), byId(g, "y"), byId(g, "z"))
+            .byIdAudit(addById(g, "x", 8, future))
+            .build();
+
+    rebuilder.rebuild(repo, b, null);
+
+    assertMigratedCleanly(reload(g), b);
+    ImmutableList<CommitInfo> log = log(g);
+    assertThat(log).hasSize(3);
+    assertServerCommit(log.get(0), "Create group");
+    assertCommit(log.get(1), "Update group\n\nAdd-group: Group x <x>", "Account 8", "8@server-id");
+    assertServerCommit(
+        log.get(2), "Update group\n\nAdd-group: Group y <y>\nAdd-group: Group z <z>");
+
+    assertThat(log.stream().map(c -> c.committer.date).collect(toImmutableList()))
+        .named("%s", log)
+        .isOrdered();
+    assertThat(TimeUtil.nowTs()).isLessThan(future);
+  }
+
+  @Test
+  public void redundantMemberAuditsAreIgnored() throws Exception {
+    AccountGroup g = newGroup("a");
+    Timestamp t1 = TimeUtil.nowTs();
+    Timestamp t2 = TimeUtil.nowTs();
+    Timestamp t3 = TimeUtil.nowTs();
+    Timestamp t4 = TimeUtil.nowTs();
+    Timestamp t5 = TimeUtil.nowTs();
+    GroupBundle b =
+        builder()
+            .group(g)
+            .members(member(g, 2))
+            .memberAudit(
+                addMember(g, 1, 8, t1),
+                addMember(g, 1, 8, t1),
+                addMember(g, 1, 8, t3),
+                addMember(g, 1, 9, t4),
+                addAndRemoveMember(g, 1, 8, t2, 9, t5),
+                addAndLegacyRemoveMember(g, 2, 9, t3),
+                addMember(g, 2, 8, t1),
+                addMember(g, 2, 9, t4),
+                addMember(g, 1, 8, t5))
+            .build();
+
+    rebuilder.rebuild(repo, b, null);
+
+    assertMigratedCleanly(reload(g), b);
+    ImmutableList<CommitInfo> log = log(g);
+    assertThat(log).hasSize(5);
+    assertServerCommit(log.get(0), "Create group");
+    assertCommit(
+        log.get(1),
+        "Update group\n\nAdd: Account 1 <1@server-id>\nAdd: Account 2 <2@server-id>",
+        "Account 8",
+        "8@server-id");
+    assertCommit(
+        log.get(2), "Update group\n\nRemove: Account 2 <2@server-id>", "Account 9", "9@server-id");
+    assertCommit(
+        log.get(3), "Update group\n\nAdd: Account 2 <2@server-id>", "Account 9", "9@server-id");
+    assertCommit(
+        log.get(4), "Update group\n\nRemove: Account 1 <1@server-id>", "Account 9", "9@server-id");
+  }
+
+  @Test
+  public void additionsAndRemovalsWithinSameSecondCanBeMigrated() throws Exception {
+    TestTimeUtil.resetWithClockStep(1, TimeUnit.MILLISECONDS);
+    AccountGroup g = newGroup("a");
+    Timestamp t1 = TimeUtil.nowTs();
+    Timestamp t2 = TimeUtil.nowTs();
+    Timestamp t3 = TimeUtil.nowTs();
+    Timestamp t4 = TimeUtil.nowTs();
+    Timestamp t5 = TimeUtil.nowTs();
+    GroupBundle b =
+        builder()
+            .group(g)
+            .members(member(g, 1))
+            .memberAudit(
+                addAndLegacyRemoveMember(g, 1, 8, t1),
+                addMember(g, 1, 10, t2),
+                addAndRemoveMember(g, 1, 8, t3, 9, t4),
+                addMember(g, 1, 8, t5))
+            .build();
+
+    rebuilder.rebuild(repo, b, null);
+
+    assertMigratedCleanly(reload(g), b);
+    ImmutableList<CommitInfo> log = log(g);
+    assertThat(log).hasSize(6);
+    assertServerCommit(log.get(0), "Create group");
+    assertCommit(
+        log.get(1), "Update group\n\nAdd: Account 1 <1@server-id>", "Account 8", "8@server-id");
+    assertCommit(
+        log.get(2), "Update group\n\nRemove: Account 1 <1@server-id>", "Account 8", "8@server-id");
+    assertCommit(
+        log.get(3), "Update group\n\nAdd: Account 1 <1@server-id>", "Account 10", "10@server-id");
+    assertCommit(
+        log.get(4), "Update group\n\nRemove: Account 1 <1@server-id>", "Account 9", "9@server-id");
+    assertCommit(
+        log.get(5), "Update group\n\nAdd: Account 1 <1@server-id>", "Account 8", "8@server-id");
+  }
+
+  @Test
+  public void redundantByIdAuditsAreIgnored() throws Exception {
+    AccountGroup g = newGroup("a");
+    Timestamp t1 = TimeUtil.nowTs();
+    Timestamp t2 = TimeUtil.nowTs();
+    Timestamp t3 = TimeUtil.nowTs();
+    Timestamp t4 = TimeUtil.nowTs();
+    Timestamp t5 = TimeUtil.nowTs();
+    GroupBundle b =
+        builder()
+            .group(g)
+            .byId()
+            .byIdAudit(
+                addById(g, "x", 8, t1),
+                addById(g, "x", 8, t3),
+                addById(g, "x", 9, t4),
+                addAndRemoveById(g, "x", 8, t2, 9, t5))
+            .build();
+
+    rebuilder.rebuild(repo, b, null);
+
+    assertMigratedCleanly(reload(g), b);
+    ImmutableList<CommitInfo> log = log(g);
+    assertThat(log).hasSize(3);
+    assertServerCommit(log.get(0), "Create group");
+    assertCommit(log.get(1), "Update group\n\nAdd-group: Group x <x>", "Account 8", "8@server-id");
+    assertCommit(
+        log.get(2), "Update group\n\nRemove-group: Group x <x>", "Account 9", "9@server-id");
+  }
+
+  @Test
+  public void combineWithBatchGroupNameNotes() throws Exception {
+    AccountGroup g1 = newGroup("a");
+    AccountGroup g2 = newGroup("b");
+    GroupReference gr1 = new GroupReference(g1.getGroupUUID(), g1.getName());
+    GroupReference gr2 = new GroupReference(g2.getGroupUUID(), g2.getName());
+
+    GroupBundle b1 = builder().group(g1).build();
+    GroupBundle b2 = builder().group(g2).build();
+
+    BatchRefUpdate bru = repo.getRefDatabase().newBatchUpdate();
+
+    rebuilder.rebuild(repo, b1, bru);
+    rebuilder.rebuild(repo, b2, bru);
+    try (ObjectInserter inserter = repo.newObjectInserter()) {
+      ImmutableList<GroupReference> refs = ImmutableList.of(gr1, gr2);
+      GroupNameNotes.updateAllGroups(repo, inserter, bru, refs, newPersonIdent());
+      inserter.flush();
+    }
+
+    assertThat(log(g1)).isEmpty();
+    assertThat(log(g2)).isEmpty();
+    assertThat(logGroupNames()).isEmpty();
+
+    RefUpdateUtil.executeChecked(bru, repo);
+
+    assertThat(log(g1)).hasSize(1);
+    assertThat(log(g2)).hasSize(1);
+    assertThat(logGroupNames()).hasSize(1);
+    assertMigratedCleanly(reload(g1), b1);
+    assertMigratedCleanly(reload(g2), b2);
+
+    assertThat(GroupNameNotes.loadAllGroups(repo)).containsExactly(gr1, gr2);
+  }
+
+  @Test
+  public void groupNamesWithLeadingAndTrailingWhitespace() throws Exception {
+    for (String leading : ImmutableList.of("", " ", "  ")) {
+      for (String trailing : ImmutableList.of("", " ", "  ")) {
+        AccountGroup g = newGroup(leading + "a" + trailing);
+        GroupBundle b = builder().group(g).build();
+        rebuilder.rebuild(repo, b, null);
+        assertMigratedCleanly(reload(g), b);
+      }
+    }
+  }
+
+  @Test
+  public void disallowExisting() throws Exception {
+    AccountGroup g = newGroup("a");
+    GroupBundle b = builder().group(g).build();
+
+    rebuilder.rebuild(repo, b, null);
+    assertMigratedCleanly(reload(g), b);
+    String refName = RefNames.refsGroups(g.getGroupUUID());
+    ObjectId oldId = repo.exactRef(refName).getObjectId();
+
+    try {
+      rebuilder.rebuild(repo, b, null);
+      assert_().fail("expected OrmDuplicateKeyException");
+    } catch (OrmDuplicateKeyException e) {
+      // Expected.
+    }
+
+    assertThat(repo.exactRef(refName).getObjectId()).isEqualTo(oldId);
+  }
+
+  private GroupBundle reload(AccountGroup g) throws Exception {
+    return bundleFactory.fromNoteDb(allUsersName, repo, g.getGroupUUID());
+  }
+
+  private void assertMigratedCleanly(GroupBundle noteDbBundle, GroupBundle expectedReviewDbBundle) {
+    assertThat(GroupBundle.compareWithAudits(expectedReviewDbBundle, noteDbBundle)).isEmpty();
+  }
+
+  private AccountGroup newGroup(String name) {
+    int id = idCounter.incrementAndGet();
+    return new AccountGroup(
+        new AccountGroup.NameKey(name),
+        new AccountGroup.Id(id),
+        new AccountGroup.UUID(name.trim() + "-" + id),
+        TimeUtil.nowTs());
+  }
+
+  private AccountGroupMember member(AccountGroup g, int accountId) {
+    return new AccountGroupMember(new AccountGroupMember.Key(new Account.Id(accountId), g.getId()));
+  }
+
+  private AccountGroupMemberAudit addMember(
+      AccountGroup g, int accountId, int adder, Timestamp addedOn) {
+    return new AccountGroupMemberAudit(member(g, accountId), new Account.Id(adder), addedOn);
+  }
+
+  private AccountGroupMemberAudit addAndLegacyRemoveMember(
+      AccountGroup g, int accountId, int adder, Timestamp addedOn) {
+    AccountGroupMemberAudit a = addMember(g, accountId, adder, addedOn);
+    a.removedLegacy();
+    return a;
+  }
+
+  private AccountGroupMemberAudit addAndRemoveMember(
+      AccountGroup g,
+      int accountId,
+      int adder,
+      Timestamp addedOn,
+      int removedBy,
+      Timestamp removedOn) {
+    AccountGroupMemberAudit a = addMember(g, accountId, adder, addedOn);
+    a.removed(new Account.Id(removedBy), removedOn);
+    return a;
+  }
+
+  private AccountGroupByIdAud addById(
+      AccountGroup g, String subgroupUuid, int adder, Timestamp addedOn) {
+    return new AccountGroupByIdAud(byId(g, subgroupUuid), new Account.Id(adder), addedOn);
+  }
+
+  private AccountGroupByIdAud addAndRemoveById(
+      AccountGroup g,
+      String subgroupUuid,
+      int adder,
+      Timestamp addedOn,
+      int removedBy,
+      Timestamp removedOn) {
+    AccountGroupByIdAud a = addById(g, subgroupUuid, adder, addedOn);
+    a.removed(new Account.Id(removedBy), removedOn);
+    return a;
+  }
+
+  private AccountGroupById byId(AccountGroup g, String subgroupUuid) {
+    return new AccountGroupById(
+        new AccountGroupById.Key(g.getId(), new AccountGroup.UUID(subgroupUuid)));
+  }
+
+  private ImmutableList<CommitInfo> log(AccountGroup g) throws Exception {
+    return GitTestUtil.log(repo, RefNames.refsGroups(g.getGroupUUID()));
+  }
+
+  private ImmutableList<CommitInfo> logGroupNames() throws Exception {
+    return GitTestUtil.log(repo, REFS_GROUPNAMES);
+  }
+
+  private static GroupBundle.Builder builder() {
+    return GroupBundle.builder().source(GroupBundle.Source.REVIEW_DB);
+  }
+
+  private static PersonIdent newPersonIdent() {
+    return new PersonIdent(SERVER_NAME, SERVER_EMAIL, TimeUtil.nowTs(), TZ);
+  }
+
+  private static void assertServerCommit(CommitInfo commitInfo, String expectedMessage) {
+    assertCommit(commitInfo, expectedMessage, SERVER_NAME, SERVER_EMAIL);
+  }
+
+  private static void assertCommit(
+      CommitInfo commitInfo, String expectedMessage, String expectedName, String expectedEmail) {
+    assertThat(commitInfo).message().isEqualTo(expectedMessage);
+    assertThat(commitInfo).author().name().isEqualTo(expectedName);
+    assertThat(commitInfo).author().email().isEqualTo(expectedEmail);
+
+    // Committer should always be the server, regardless of author.
+    assertThat(commitInfo).committer().name().isEqualTo(SERVER_NAME);
+    assertThat(commitInfo).committer().email().isEqualTo(SERVER_EMAIL);
+    assertThat(commitInfo).committer().date().isEqualTo(commitInfo.author.date);
+    assertThat(commitInfo).committer().tz().isEqualTo(commitInfo.author.tz);
+  }
+
+  private static AuditLogFormatter getAuditLogFormatter() {
+    return AuditLogFormatter.create(
+        GroupRebuilderTest::getAccount, GroupRebuilderTest::getGroup, SERVER_ID);
+  }
+
+  private static Optional<Account> getAccount(Account.Id id) {
+    Account account = new Account(id, TimeUtil.nowTs());
+    account.setFullName("Account " + id);
+    return Optional.of(account);
+  }
+
+  private static Optional<GroupDescription.Basic> getGroup(AccountGroup.UUID uuid) {
+    GroupDescription.Basic group =
+        new GroupDescription.Basic() {
+          @Override
+          public AccountGroup.UUID getGroupUUID() {
+            return uuid;
+          }
+
+          @Override
+          public String getName() {
+            return "Group " + uuid;
+          }
+
+          @Nullable
+          @Override
+          public String getEmailAddress() {
+            return null;
+          }
+
+          @Nullable
+          @Override
+          public String getUrl() {
+            return null;
+          }
+        };
+    return Optional.of(group);
+  }
+}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/schema/HANATest.java b/javatests/com/google/gerrit/server/schema/HANATest.java
similarity index 100%
rename from gerrit-server/src/test/java/com/google/gerrit/server/schema/HANATest.java
rename to javatests/com/google/gerrit/server/schema/HANATest.java
diff --git a/javatests/com/google/gerrit/server/schema/SchemaCreatorTest.java b/javatests/com/google/gerrit/server/schema/SchemaCreatorTest.java
new file mode 100644
index 0000000..9569745
--- /dev/null
+++ b/javatests/com/google/gerrit/server/schema/SchemaCreatorTest.java
@@ -0,0 +1,128 @@
+// Copyright (C) 2009 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.google.gerrit.server.schema;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth8.assertThat;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.common.data.LabelFunction;
+import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.LabelTypes;
+import com.google.gerrit.common.data.LabelValue;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.testing.InMemoryDatabase;
+import com.google.gerrit.testing.InMemoryModule;
+import com.google.gwtorm.jdbc.JdbcSchema;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.io.File;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import org.eclipse.jgit.lib.Repository;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class SchemaCreatorTest {
+  @Inject private AllProjectsName allProjects;
+
+  @Inject private GitRepositoryManager repoManager;
+
+  @Inject private InMemoryDatabase db;
+
+  @Before
+  public void setUp() throws Exception {
+    new InMemoryModule().inject(this);
+  }
+
+  @After
+  public void tearDown() throws Exception {
+    InMemoryDatabase.drop(db);
+  }
+
+  @Test
+  public void getCauses_CreateSchema() throws OrmException, SQLException {
+    // Initially the schema should be empty.
+    String[] types = {"TABLE", "VIEW"};
+    try (JdbcSchema d = (JdbcSchema) db.open();
+        ResultSet rs = d.getConnection().getMetaData().getTables(null, null, null, types)) {
+      assertThat(rs.next()).isFalse();
+    }
+
+    // Create the schema using the current schema version.
+    //
+    db.create();
+    db.assertSchemaVersion();
+
+    // By default sitePath is set to the current working directory.
+    //
+    File sitePath = new File(".").getAbsoluteFile();
+    if (sitePath.getName().equals(".")) {
+      sitePath = sitePath.getParentFile();
+    }
+  }
+
+  private LabelTypes getLabelTypes() throws Exception {
+    db.create();
+    ProjectConfig c = new ProjectConfig(allProjects);
+    try (Repository repo = repoManager.openRepository(allProjects)) {
+      c.load(repo);
+      return new LabelTypes(ImmutableList.copyOf(c.getLabelSections().values()));
+    }
+  }
+
+  @Test
+  public void createSchema_LabelTypes() throws Exception {
+    List<String> labels = new ArrayList<>();
+    for (LabelType label : getLabelTypes().getLabelTypes()) {
+      labels.add(label.getName());
+    }
+    assertThat(labels).containsExactly("Code-Review");
+  }
+
+  @Test
+  public void createSchema_Label_CodeReview() throws Exception {
+    LabelType codeReview = getLabelTypes().byLabel("Code-Review");
+    assertThat(codeReview).isNotNull();
+    assertThat(codeReview.getName()).isEqualTo("Code-Review");
+    assertThat(codeReview.getDefaultValue()).isEqualTo(0);
+    assertThat(codeReview.getFunction()).isEqualTo(LabelFunction.MAX_WITH_BLOCK);
+    assertThat(codeReview.isCopyMinScore()).isTrue();
+    assertValueRange(codeReview, -2, -1, 0, 1, 2);
+  }
+
+  private void assertValueRange(LabelType label, Integer... range) {
+    List<Integer> rangeList = Arrays.asList(range);
+    assertThat(rangeList).isNotEmpty();
+    assertThat(rangeList).isStrictlyOrdered();
+
+    assertThat(label.getValues().stream().map(v -> (int) v.getValue()))
+        .containsExactlyElementsIn(rangeList)
+        .inOrder();
+    assertThat(label.getMax().getValue()).isEqualTo(Collections.max(rangeList));
+    assertThat(label.getMin().getValue()).isEqualTo(Collections.min(rangeList));
+    for (LabelValue v : label.getValues()) {
+      assertThat(v.getText()).isNotNull();
+      assertThat(v.getText()).isNotEmpty();
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/server/schema/SchemaUpdaterTest.java b/javatests/com/google/gerrit/server/schema/SchemaUpdaterTest.java
new file mode 100644
index 0000000..7ea4d93
--- /dev/null
+++ b/javatests/com/google/gerrit/server/schema/SchemaUpdaterTest.java
@@ -0,0 +1,149 @@
+// Copyright (C) 2009 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.google.gerrit.server.schema;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.extensions.config.FactoryModule;
+import com.google.gerrit.lifecycle.LifecycleManager;
+import com.google.gerrit.metrics.DisabledMetricMaker;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.GerritPersonIdentProvider;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.AnonymousCowardName;
+import com.google.gerrit.server.config.AnonymousCowardNameProvider;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.GerritServerId;
+import com.google.gerrit.server.config.GerritServerIdProvider;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gerrit.testing.InMemoryDatabase;
+import com.google.gerrit.testing.InMemoryH2Type;
+import com.google.gerrit.testing.InMemoryRepositoryManager;
+import com.google.gerrit.testing.TestUpdateUI;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.Guice;
+import com.google.inject.Key;
+import com.google.inject.ProvisionException;
+import com.google.inject.TypeLiteral;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.UUID;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class SchemaUpdaterTest {
+  private LifecycleManager lifecycle;
+  private InMemoryDatabase db;
+
+  @Before
+  public void setUp() throws Exception {
+    lifecycle = new LifecycleManager();
+    db = InMemoryDatabase.newDatabase(lifecycle);
+    lifecycle.start();
+  }
+
+  @After
+  public void tearDown() throws Exception {
+    if (lifecycle != null) {
+      lifecycle.stop();
+    }
+    InMemoryDatabase.drop(db);
+  }
+
+  @Test
+  public void update() throws OrmException, FileNotFoundException, IOException {
+    db.create();
+
+    final Path site = Paths.get(UUID.randomUUID().toString());
+    final SitePaths paths = new SitePaths(site);
+    SchemaUpdater u =
+        Guice.createInjector(
+                new FactoryModule() {
+                  @Override
+                  protected void configure() {
+                    TypeLiteral<SchemaFactory<ReviewDb>> schemaFactory =
+                        new TypeLiteral<SchemaFactory<ReviewDb>>() {};
+                    bind(schemaFactory).to(NotesMigrationSchemaFactory.class);
+                    bind(Key.get(schemaFactory, ReviewDbFactory.class)).toInstance(db);
+                    bind(SitePaths.class).toInstance(paths);
+
+                    Config cfg = new Config();
+                    cfg.setString("user", null, "name", "Gerrit Code Review");
+                    cfg.setString("user", null, "email", "gerrit@localhost");
+                    cfg.setString(
+                        GerritServerIdProvider.SECTION,
+                        null,
+                        GerritServerIdProvider.KEY,
+                        "1234567");
+                    bind(Config.class) //
+                        .annotatedWith(GerritServerConfig.class) //
+                        .toInstance(cfg);
+
+                    bind(PersonIdent.class) //
+                        .annotatedWith(GerritPersonIdent.class) //
+                        .toProvider(GerritPersonIdentProvider.class);
+
+                    bind(String.class).annotatedWith(GerritServerId.class).toInstance("gerrit");
+
+                    bind(AllProjectsName.class).toInstance(new AllProjectsName("All-Projects"));
+                    bind(AllUsersName.class).toInstance(new AllUsersName("All-Users"));
+
+                    bind(GitRepositoryManager.class).toInstance(new InMemoryRepositoryManager());
+
+                    bind(String.class) //
+                        .annotatedWith(AnonymousCowardName.class) //
+                        .toProvider(AnonymousCowardNameProvider.class);
+
+                    bind(DataSourceType.class).to(InMemoryH2Type.class);
+
+                    bind(SystemGroupBackend.class);
+                    install(new NotesMigration.Module());
+                    bind(MetricMaker.class).to(DisabledMetricMaker.class);
+                  }
+                })
+            .getInstance(SchemaUpdater.class);
+
+    for (SchemaVersion s = u.getLatestSchemaVersion(); s.getVersionNbr() > 1; s = s.getPrior()) {
+      try {
+        assertThat(s.getPrior().getVersionNbr())
+            .named(
+                "schema %s has prior version %s. Not true that",
+                s.getVersionNbr(), s.getPrior().getVersionNbr())
+            .isEqualTo(s.getVersionNbr() - 1);
+      } catch (ProvisionException e) {
+        // Ignored
+        // The oldest supported schema version doesn't have a prior schema
+        // version.
+        break;
+      }
+    }
+
+    u.update(new TestUpdateUI());
+
+    db.assertSchemaVersion();
+  }
+}
diff --git a/javatests/com/google/gerrit/server/schema/Schema_150_to_151_Test.java b/javatests/com/google/gerrit/server/schema/Schema_150_to_151_Test.java
new file mode 100644
index 0000000..4d5db6d
--- /dev/null
+++ b/javatests/com/google/gerrit/server/schema/Schema_150_to_151_Test.java
@@ -0,0 +1,253 @@
+// Copyright (C) 2017 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.google.gerrit.server.schema;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.AccountGroup.Id;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.reviewdb.server.ReviewDbWrapper;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.Sequences;
+import com.google.gerrit.server.account.GroupUUID;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.testing.InMemoryTestEnvironment;
+import com.google.gerrit.testing.TestUpdateUI;
+import com.google.gwtorm.jdbc.JdbcSchema;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.Statement;
+import java.sql.Timestamp;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.Month;
+import java.time.ZoneOffset;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class Schema_150_to_151_Test {
+
+  @Rule public InMemoryTestEnvironment testEnv = new InMemoryTestEnvironment();
+
+  @Inject private Schema_151 schema151;
+  @Inject private ReviewDb db;
+  @Inject private IdentifiedUser currentUser;
+  @Inject private @GerritPersonIdent Provider<PersonIdent> serverIdent;
+  @Inject private Sequences seq;
+
+  private Connection connection;
+  private PreparedStatement createdOnRetrieval;
+  private PreparedStatement createdOnUpdate;
+  private PreparedStatement auditEntryDeletion;
+  private JdbcSchema jdbcSchema;
+
+  @Before
+  public void unwrapDb() {
+    jdbcSchema = ReviewDbWrapper.unwrapJbdcSchema(db);
+  }
+
+  @Before
+  public void setUp() throws Exception {
+    assume().that(db instanceof JdbcSchema).isTrue();
+
+    connection = ((JdbcSchema) db).getConnection();
+
+    try (Statement stmt = connection.createStatement()) {
+      stmt.execute(
+          "CREATE TABLE account_groups ("
+              + " group_uuid varchar(255) DEFAULT '' NOT NULL,"
+              + " group_id INTEGER DEFAULT 0 NOT NULL,"
+              + " name varchar(255) DEFAULT '' NOT NULL,"
+              + " created_on TIMESTAMP,"
+              + " description CLOB,"
+              + " owner_group_uuid varchar(255) DEFAULT '' NOT NULL,"
+              + " visible_to_all CHAR(1) DEFAULT 'N' NOT NULL"
+              + ")");
+
+      stmt.execute(
+          "CREATE TABLE account_group_members ("
+              + " group_id INTEGER DEFAULT 0 NOT NULL,"
+              + " account_id INTEGER DEFAULT 0 NOT NULL"
+              + ")");
+
+      stmt.execute(
+          "CREATE TABLE account_group_members_audit ("
+              + " group_id INTEGER DEFAULT 0 NOT NULL,"
+              + " account_id INTEGER DEFAULT 0 NOT NULL,"
+              + " added_by INTEGER DEFAULT 0 NOT NULL,"
+              + " added_on TIMESTAMP,"
+              + " removed_by INTEGER,"
+              + " removed_on TIMESTAMP"
+              + ")");
+    }
+
+    createdOnRetrieval =
+        connection.prepareStatement("SELECT created_on FROM account_groups WHERE group_id = ?");
+    createdOnUpdate =
+        connection.prepareStatement("UPDATE account_groups SET created_on = ? WHERE group_id = ?");
+    auditEntryDeletion =
+        connection.prepareStatement("DELETE FROM account_group_members_audit WHERE group_id = ?");
+  }
+
+  @After
+  public void tearDown() throws Exception {
+    if (auditEntryDeletion != null) {
+      auditEntryDeletion.close();
+    }
+    if (createdOnUpdate != null) {
+      createdOnUpdate.close();
+    }
+    if (createdOnRetrieval != null) {
+      createdOnRetrieval.close();
+    }
+    if (connection != null) {
+      connection.close();
+    }
+  }
+
+  @Test
+  public void createdOnIsPopulatedForGroupsCreatedAfterAudit() throws Exception {
+    Timestamp testStartTime = TimeUtil.nowTs();
+    AccountGroup.Id groupId = createGroupInReviewDb("Group for schema migration");
+    setCreatedOnToVeryOldTimestamp(groupId);
+
+    schema151.migrateData(db, new TestUpdateUI());
+
+    Timestamp createdOn = getCreatedOn(groupId);
+    assertThat(createdOn).isAtLeast(testStartTime);
+  }
+
+  @Test
+  public void createdOnIsPopulatedForGroupsCreatedBeforeAudit() throws Exception {
+    AccountGroup.Id groupId = createGroupInReviewDb("Ancient group for schema migration");
+    setCreatedOnToVeryOldTimestamp(groupId);
+    removeAuditEntriesFor(groupId);
+
+    schema151.migrateData(db, new TestUpdateUI());
+
+    Timestamp createdOn = getCreatedOn(groupId);
+    assertThat(createdOn).isEqualTo(AccountGroup.auditCreationInstantTs());
+  }
+
+  private AccountGroup.Id createGroupInReviewDb(String name) throws Exception {
+    AccountGroup group =
+        new AccountGroup(
+            new AccountGroup.NameKey(name),
+            new AccountGroup.Id(seq.nextGroupId()),
+            GroupUUID.make(name, serverIdent.get()),
+            TimeUtil.nowTs());
+    storeInReviewDb(group);
+    addMembersInReviewDb(group.getId(), currentUser.getAccountId());
+    return group.getId();
+  }
+
+  private Timestamp getCreatedOn(Id groupId) throws Exception {
+    createdOnRetrieval.setInt(1, groupId.get());
+    try (ResultSet results = createdOnRetrieval.executeQuery()) {
+      if (results.first()) {
+        return results.getTimestamp(1);
+      }
+    }
+    return null;
+  }
+
+  private void setCreatedOnToVeryOldTimestamp(Id groupId) throws Exception {
+    createdOnUpdate.setInt(1, groupId.get());
+    Instant instant = LocalDateTime.of(1800, Month.JANUARY, 1, 0, 0).toInstant(ZoneOffset.UTC);
+    createdOnUpdate.setTimestamp(1, Timestamp.from(instant));
+    createdOnUpdate.setInt(2, groupId.get());
+    createdOnUpdate.executeUpdate();
+  }
+
+  private void removeAuditEntriesFor(AccountGroup.Id groupId) throws Exception {
+    auditEntryDeletion.setInt(1, groupId.get());
+    auditEntryDeletion.executeUpdate();
+  }
+
+  private void storeInReviewDb(AccountGroup... groups) throws Exception {
+    try (PreparedStatement stmt =
+        jdbcSchema
+            .getConnection()
+            .prepareStatement(
+                "INSERT INTO account_groups"
+                    + " (group_uuid,"
+                    + " group_id,"
+                    + " name,"
+                    + " description,"
+                    + " created_on,"
+                    + " owner_group_uuid,"
+                    + " visible_to_all) VALUES (?, ?, ?, ?, ?, ?, ?)")) {
+      for (AccountGroup group : groups) {
+        stmt.setString(1, group.getGroupUUID().get());
+        stmt.setInt(2, group.getId().get());
+        stmt.setString(3, group.getName());
+        stmt.setString(4, group.getDescription());
+        stmt.setTimestamp(5, group.getCreatedOn());
+        stmt.setString(6, group.getOwnerGroupUUID().get());
+        stmt.setString(7, group.isVisibleToAll() ? "Y" : "N");
+        stmt.addBatch();
+      }
+      stmt.executeBatch();
+    }
+  }
+
+  private void addMembersInReviewDb(AccountGroup.Id groupId, Account.Id... memberIds)
+      throws Exception {
+    try (PreparedStatement addMemberStmt =
+            jdbcSchema
+                .getConnection()
+                .prepareStatement(
+                    "INSERT INTO account_group_members"
+                        + " (group_id,"
+                        + " account_id) VALUES ("
+                        + groupId.get()
+                        + ", ?)");
+        PreparedStatement addMemberAuditStmt =
+            jdbcSchema
+                .getConnection()
+                .prepareStatement(
+                    "INSERT INTO account_group_members_audit"
+                        + " (group_id,"
+                        + " account_id,"
+                        + " added_by,"
+                        + " added_on) VALUES ("
+                        + groupId.get()
+                        + ", ?, "
+                        + currentUser.getAccountId().get()
+                        + ", ?)")) {
+      Timestamp addedOn = TimeUtil.nowTs();
+      for (Account.Id memberId : memberIds) {
+        addMemberStmt.setInt(1, memberId.get());
+        addMemberStmt.addBatch();
+
+        addMemberAuditStmt.setInt(1, memberId.get());
+        addMemberAuditStmt.setTimestamp(2, addedOn);
+        addMemberAuditStmt.addBatch();
+      }
+      addMemberStmt.executeBatch();
+      addMemberAuditStmt.executeBatch();
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/server/schema/Schema_159_to_160_Test.java b/javatests/com/google/gerrit/server/schema/Schema_159_to_160_Test.java
new file mode 100644
index 0000000..9bd2084
--- /dev/null
+++ b/javatests/com/google/gerrit/server/schema/Schema_159_to_160_Test.java
@@ -0,0 +1,222 @@
+// Copyright (C) 2017 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.google.gerrit.server.schema;
+
+import static com.google.common.base.MoreObjects.firstNonNull;
+import static com.google.common.collect.ImmutableMap.toImmutableMap;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth8.assertThat;
+import static com.google.gerrit.reviewdb.client.RefNames.REFS_USERS_DEFAULT;
+import static com.google.gerrit.server.git.UserConfigSections.KEY_URL;
+import static com.google.gerrit.server.git.UserConfigSections.MY;
+import static com.google.gerrit.server.schema.Schema_160.DEFAULT_DRAFT_ITEMS;
+import static com.google.gerrit.server.schema.VersionedAccountPreferences.PREFERENCES;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.extensions.api.GerritApi;
+import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
+import com.google.gerrit.extensions.client.MenuItem;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.index.account.AccountIndexer;
+import com.google.gerrit.testing.InMemoryTestEnvironment;
+import com.google.gerrit.testing.TestUpdateUI;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import java.util.List;
+import java.util.Optional;
+import java.util.function.Supplier;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.BlobBasedConfig;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class Schema_159_to_160_Test {
+  @Rule public InMemoryTestEnvironment testEnv = new InMemoryTestEnvironment();
+
+  @Inject private AccountCache accountCache;
+  @Inject private AccountIndexer accountIndexer;
+  @Inject private AllUsersName allUsersName;
+  @Inject private GerritApi gApi;
+  @Inject private GitRepositoryManager repoManager;
+  @Inject private Provider<IdentifiedUser> userProvider;
+  @Inject private ReviewDb db;
+  @Inject private Schema_160 schema160;
+
+  private Account.Id accountId;
+
+  @Before
+  public void setUp() throws Exception {
+    accountId = userProvider.get().getAccountId();
+  }
+
+  @Test
+  public void skipUnmodified() throws Exception {
+    ObjectId oldMetaId = metaRef(accountId);
+    ImmutableSet<String> fromNoteDb = myMenusFromNoteDb(accountId);
+    ImmutableSet<String> fromApi = myMenusFromApi(accountId);
+    for (String item : DEFAULT_DRAFT_ITEMS) {
+      assertThat(fromNoteDb).doesNotContain(item);
+      assertThat(fromApi).doesNotContain(item);
+    }
+
+    schema160.migrateData(db, new TestUpdateUI());
+
+    assertThat(metaRef(accountId)).isEqualTo(oldMetaId);
+  }
+
+  @Test
+  public void deleteItems() throws Exception {
+    ObjectId oldMetaId = metaRef(accountId);
+    ImmutableSet<String> defaultNames = myMenusFromApi(accountId);
+
+    GeneralPreferencesInfo prefs = gApi.accounts().id(accountId.get()).getPreferences();
+    prefs.my.add(0, new MenuItem("Something else", DEFAULT_DRAFT_ITEMS.get(0) + "+is:mergeable"));
+    for (int i = 0; i < DEFAULT_DRAFT_ITEMS.size(); i++) {
+      prefs.my.add(new MenuItem("Draft entry " + i, DEFAULT_DRAFT_ITEMS.get(i)));
+    }
+    gApi.accounts().id(accountId.get()).setPreferences(prefs);
+
+    List<String> oldNames =
+        ImmutableList.<String>builder()
+            .add("Something else")
+            .addAll(defaultNames)
+            .add("Draft entry 0")
+            .add("Draft entry 1")
+            .add("Draft entry 2")
+            .add("Draft entry 3")
+            .build();
+    assertThat(myMenusFromApi(accountId)).containsExactlyElementsIn(oldNames).inOrder();
+
+    schema160.migrateData(db, new TestUpdateUI());
+    accountCache.evict(accountId);
+    accountIndexer.index(accountId);
+    testEnv.setApiUser(accountId);
+
+    assertThat(metaRef(accountId)).isNotEqualTo(oldMetaId);
+
+    List<String> newNames =
+        ImmutableList.<String>builder().add("Something else").addAll(defaultNames).build();
+    assertThat(myMenusFromNoteDb(accountId)).containsExactlyElementsIn(newNames).inOrder();
+    assertThat(myMenusFromApi(accountId)).containsExactlyElementsIn(newNames).inOrder();
+  }
+
+  @Test
+  public void skipNonExistentRefsUsersDefault() throws Exception {
+    assertThat(readRef(REFS_USERS_DEFAULT)).isEmpty();
+    schema160.migrateData(db, new TestUpdateUI());
+    assertThat(readRef(REFS_USERS_DEFAULT)).isEmpty();
+  }
+
+  @Test
+  public void deleteDefaultItem() throws Exception {
+    assertThat(readRef(REFS_USERS_DEFAULT)).isEmpty();
+    ImmutableSet<String> defaultNames = defaultMenusFromApi();
+
+    // Setting *any* preference causes preferences.config to contain the full set of "my" sections.
+    // This mimics real-world behavior prior to the 2.15 upgrade; see Issue 8439 for details.
+    GeneralPreferencesInfo prefs = gApi.config().server().getDefaultPreferences();
+    prefs.signedOffBy = !firstNonNull(prefs.signedOffBy, false);
+    gApi.config().server().setDefaultPreferences(prefs);
+
+    try (Repository repo = repoManager.openRepository(allUsersName)) {
+      Config cfg = new BlobBasedConfig(null, repo, readRef(REFS_USERS_DEFAULT).get(), PREFERENCES);
+      assertThat(cfg.getSubsections("my")).containsExactlyElementsIn(defaultNames).inOrder();
+
+      // Add more defaults directly in git, the SetPreferences endpoint doesn't respect the "my"
+      // field in the input in 2.15 and earlier.
+      cfg.setString("my", "Drafts", "url", "#/q/owner:self+is:draft");
+      cfg.setString("my", "Something else", "url", "#/q/owner:self+is:draft+is:mergeable");
+      cfg.setString("my", "Totally not drafts", "url", "#/q/owner:self+is:draft");
+      new TestRepository<>(repo)
+          .branch(REFS_USERS_DEFAULT)
+          .commit()
+          .add(PREFERENCES, cfg.toText())
+          .create();
+    }
+
+    List<String> oldNames =
+        ImmutableList.<String>builder()
+            .addAll(defaultNames)
+            .add("Drafts")
+            .add("Something else")
+            .add("Totally not drafts")
+            .build();
+    assertThat(defaultMenusFromApi()).containsExactlyElementsIn(oldNames).inOrder();
+
+    schema160.migrateData(db, new TestUpdateUI());
+
+    assertThat(readRef(REFS_USERS_DEFAULT)).isPresent();
+
+    List<String> newNames =
+        ImmutableList.<String>builder().addAll(defaultNames).add("Something else").build();
+    assertThat(myMenusFromNoteDb(VersionedAccountPreferences::forDefault).keySet())
+        .containsExactlyElementsIn(newNames)
+        .inOrder();
+    assertThat(defaultMenusFromApi()).containsExactlyElementsIn(newNames).inOrder();
+  }
+
+  private ImmutableSet<String> myMenusFromNoteDb(Account.Id id) throws Exception {
+    return myMenusFromNoteDb(() -> VersionedAccountPreferences.forUser(id)).keySet();
+  }
+
+  // Raw config values, bypassing the defaults set by PreferencesConfig.
+  private ImmutableMap<String, String> myMenusFromNoteDb(
+      Supplier<VersionedAccountPreferences> prefsSupplier) throws Exception {
+    try (Repository repo = repoManager.openRepository(allUsersName)) {
+      VersionedAccountPreferences prefs = prefsSupplier.get();
+      prefs.load(allUsersName, repo);
+      Config cfg = prefs.getConfig();
+      return cfg.getSubsections(MY).stream()
+          .collect(toImmutableMap(i -> i, i -> cfg.getString(MY, i, KEY_URL)));
+    }
+  }
+
+  private ImmutableSet<String> myMenusFromApi(Account.Id id) throws Exception {
+    return myMenus(gApi.accounts().id(id.get()).getPreferences()).keySet();
+  }
+
+  private ImmutableSet<String> defaultMenusFromApi() throws Exception {
+    return myMenus(gApi.config().server().getDefaultPreferences()).keySet();
+  }
+
+  private static ImmutableMap<String, String> myMenus(GeneralPreferencesInfo prefs) {
+
+    return prefs.my.stream().collect(toImmutableMap(i -> i.name, i -> i.url));
+  }
+
+  private ObjectId metaRef(Account.Id id) throws Exception {
+    return readRef(RefNames.refsUsers(id))
+        .orElseThrow(() -> new AssertionError("missing ref for account " + id));
+  }
+
+  private Optional<ObjectId> readRef(String ref) throws Exception {
+    try (Repository repo = repoManager.openRepository(allUsersName)) {
+      return Optional.ofNullable(repo.exactRef(ref)).map(Ref::getObjectId);
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/server/schema/Schema_161_to_162_Test.java b/javatests/com/google/gerrit/server/schema/Schema_161_to_162_Test.java
new file mode 100644
index 0000000..67d071d
--- /dev/null
+++ b/javatests/com/google/gerrit/server/schema/Schema_161_to_162_Test.java
@@ -0,0 +1,96 @@
+// Copyright (C) 2017 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.google.gerrit.server.schema;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.extensions.api.GerritApi;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.project.ProjectConfig;
+import com.google.gerrit.testing.InMemoryTestEnvironment;
+import com.google.gerrit.testing.TestUpdateUI;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class Schema_161_to_162_Test {
+  @Rule public InMemoryTestEnvironment testEnv = new InMemoryTestEnvironment();
+
+  @Inject private AllProjectsName allProjectsName;
+  @Inject private AllUsersName allUsersName;
+  @Inject private GerritApi gApi;
+  @Inject private GitRepositoryManager repoManager;
+  @Inject private Schema_162 schema162;
+  @Inject private ReviewDb db;
+  @Inject @GerritPersonIdent private PersonIdent serverUser;
+
+  @Test
+  public void skipCorrectInheritance() throws Exception {
+    assertThatAllUsersInheritsFrom(allProjectsName.get());
+    ObjectId oldHead;
+    try (Repository git = repoManager.openRepository(allUsersName)) {
+      oldHead = git.findRef(RefNames.REFS_CONFIG).getObjectId();
+    }
+
+    schema162.migrateData(db, new TestUpdateUI());
+
+    // Check that the parent remained unchanged and that no commit was made
+    assertThatAllUsersInheritsFrom(allProjectsName.get());
+    try (Repository git = repoManager.openRepository(allUsersName)) {
+      assertThat(oldHead).isEqualTo(git.findRef(RefNames.REFS_CONFIG).getObjectId());
+    }
+  }
+
+  @Test
+  public void fixIncorrectInheritance() throws Exception {
+    String testProject = gApi.projects().create("test").get().name;
+    assertThatAllUsersInheritsFrom(allProjectsName.get());
+
+    try (Repository git = repoManager.openRepository(allUsersName);
+        MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, allUsersName, git)) {
+      ProjectConfig cfg = ProjectConfig.read(md);
+      cfg.getProject().setParentName(testProject);
+      md.getCommitBuilder().setCommitter(serverUser);
+      md.getCommitBuilder().setAuthor(serverUser);
+      md.setMessage("Test");
+      cfg.commit(md);
+    } catch (ConfigInvalidException | IOException ex) {
+      throw new OrmException(ex);
+    }
+    assertThatAllUsersInheritsFrom(testProject);
+
+    schema162.migrateData(db, new TestUpdateUI());
+
+    assertThatAllUsersInheritsFrom(allProjectsName.get());
+  }
+
+  private void assertThatAllUsersInheritsFrom(String parent) throws Exception {
+    assertThat(gApi.projects().name(allUsersName.get()).access().inheritsFrom.name)
+        .isEqualTo(parent);
+  }
+}
diff --git a/javatests/com/google/gerrit/server/schema/Schema_166_to_167_WithGroupsInNoteDbTest.java b/javatests/com/google/gerrit/server/schema/Schema_166_to_167_WithGroupsInNoteDbTest.java
new file mode 100644
index 0000000..57689b3
--- /dev/null
+++ b/javatests/com/google/gerrit/server/schema/Schema_166_to_167_WithGroupsInNoteDbTest.java
@@ -0,0 +1,227 @@
+// 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.
+
+package com.google.gerrit.server.schema;
+
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.server.notedb.NoteDbTable.GROUPS;
+import static com.google.gerrit.server.notedb.NotesMigration.DISABLE_REVIEW_DB;
+import static com.google.gerrit.server.notedb.NotesMigration.SECTION_NOTE_DB;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.common.Nullable;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.reviewdb.server.ReviewDbWrapper;
+import com.google.gerrit.server.Sequences;
+import com.google.gerrit.server.ServerInitiated;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.GerritServerIdProvider;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.group.db.GroupNameNotes;
+import com.google.gerrit.server.group.db.GroupsUpdate;
+import com.google.gerrit.server.group.db.InternalGroupCreation;
+import com.google.gerrit.server.group.db.InternalGroupUpdate;
+import com.google.gerrit.testing.InMemoryTestEnvironment;
+import com.google.gerrit.testing.TestUpdateUI;
+import com.google.gwtorm.jdbc.JdbcSchema;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.sql.PreparedStatement;
+import java.sql.Statement;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class Schema_166_to_167_WithGroupsInNoteDbTest {
+  private static Config createConfig() {
+    Config config = new Config();
+    config.setString(GerritServerIdProvider.SECTION, null, GerritServerIdProvider.KEY, "1234567");
+
+    // Disable groups in ReviewDb. This means the primary storage for groups is NoteDb.
+    config.setBoolean(SECTION_NOTE_DB, GROUPS.key(), DISABLE_REVIEW_DB, true);
+
+    return config;
+  }
+
+  @Rule
+  public InMemoryTestEnvironment testEnv =
+      new InMemoryTestEnvironment(Schema_166_to_167_WithGroupsInNoteDbTest::createConfig);
+
+  @Inject private Schema_167 schema167;
+  @Inject private ReviewDb db;
+  @Inject private GitRepositoryManager gitRepoManager;
+  @Inject private AllUsersName allUsersName;
+  @Inject private @ServerInitiated GroupsUpdate groupsUpdate;
+  @Inject private Sequences seq;
+
+  private JdbcSchema jdbcSchema;
+
+  @Before
+  public void initDb() throws Exception {
+    jdbcSchema = ReviewDbWrapper.unwrapJbdcSchema(db);
+
+    try (Statement stmt = jdbcSchema.getConnection().createStatement()) {
+      stmt.execute(
+          "CREATE TABLE account_groups ("
+              + " group_uuid varchar(255) DEFAULT '' NOT NULL,"
+              + " group_id INTEGER DEFAULT 0 NOT NULL,"
+              + " name varchar(255) DEFAULT '' NOT NULL,"
+              + " created_on TIMESTAMP,"
+              + " description CLOB,"
+              + " owner_group_uuid varchar(255) DEFAULT '' NOT NULL,"
+              + " visible_to_all CHAR(1) DEFAULT 'N' NOT NULL"
+              + ")");
+    }
+  }
+
+  @Test
+  public void migrationIsSkipped() throws Exception {
+    // Create a group in NoteDb (doesn't create the group in ReviewDb since
+    // disableReviewDb == true)
+    InternalGroup internalGroup =
+        groupsUpdate.createGroup(
+            InternalGroupCreation.builder()
+                .setNameKey(new AccountGroup.NameKey("users"))
+                .setGroupUUID(new AccountGroup.UUID("users"))
+                .setId(new AccountGroup.Id(seq.nextGroupId()))
+                .build(),
+            InternalGroupUpdate.builder().setDescription("description").build());
+
+    // Insert the group into ReviewDb
+    AccountGroup group1 =
+        newGroup()
+            .setName(internalGroup.getName())
+            .setGroupUuid(internalGroup.getGroupUUID())
+            .setId(internalGroup.getId())
+            .setCreatedOn(internalGroup.getCreatedOn())
+            .setDescription(internalGroup.getDescription())
+            .setGroupUuid(internalGroup.getGroupUUID())
+            .setVisibleToAll(internalGroup.isVisibleToAll())
+            .build();
+    storeInReviewDb(group1);
+
+    // Update the group description in ReviewDb so that the group state differs between ReviewDb and
+    // NoteDb
+    group1.setDescription("outdated");
+    updateInReviewDb(group1);
+
+    // Create a group that only exists in ReviewDb
+    AccountGroup group2 = newGroup().setName("reviewDbOnlyGroup").build();
+    storeInReviewDb(group2);
+
+    // Remember the SHA1 of the group ref in NoteDb
+    ObjectId groupSha1 = getGroupSha1(group1.getGroupUUID());
+
+    executeSchemaMigration(schema167);
+
+    // Verify the groups in NoteDb: "users" should still exist, "reviewDbOnlyGroup" should not have
+    // been created
+    ImmutableList<GroupReference> groupReferences = getAllGroupsFromNoteDb();
+    ImmutableList<String> groupNames =
+        groupReferences.stream().map(GroupReference::getName).collect(toImmutableList());
+    assertThat(groupNames).contains("users");
+    assertThat(groupNames).doesNotContain("reviewDbOnlyGroup");
+
+    // Verify that the group refs in NoteDb were not touched.
+    assertThat(getGroupSha1(group1.getGroupUUID())).isEqualTo(groupSha1);
+    assertThat(getGroupSha1(group2.getGroupUUID())).isNull();
+  }
+
+  private static TestGroup.Builder newGroup() {
+    return TestGroup.builder();
+  }
+
+  private void storeInReviewDb(AccountGroup... groups) throws Exception {
+    try (PreparedStatement stmt =
+        jdbcSchema
+            .getConnection()
+            .prepareStatement(
+                "INSERT INTO account_groups"
+                    + " (group_uuid,"
+                    + " group_id,"
+                    + " name,"
+                    + " description,"
+                    + " created_on,"
+                    + " owner_group_uuid,"
+                    + " visible_to_all) VALUES (?, ?, ?, ?, ?, ?, ?)")) {
+      for (AccountGroup group : groups) {
+        stmt.setString(1, group.getGroupUUID().get());
+        stmt.setInt(2, group.getId().get());
+        stmt.setString(3, group.getName());
+        stmt.setString(4, group.getDescription());
+        stmt.setTimestamp(5, group.getCreatedOn());
+        stmt.setString(6, group.getOwnerGroupUUID().get());
+        stmt.setString(7, group.isVisibleToAll() ? "Y" : "N");
+        stmt.addBatch();
+      }
+      stmt.executeBatch();
+    }
+  }
+
+  private void updateInReviewDb(AccountGroup... groups) throws Exception {
+    try (PreparedStatement stmt =
+        jdbcSchema
+            .getConnection()
+            .prepareStatement(
+                "UPDATE account_groups SET"
+                    + " group_uuid = ?,"
+                    + " name = ?,"
+                    + " description = ?,"
+                    + " created_on = ?,"
+                    + " owner_group_uuid = ?,"
+                    + " visible_to_all = ?"
+                    + " WHERE group_id = ?")) {
+      for (AccountGroup group : groups) {
+        stmt.setString(1, group.getGroupUUID().get());
+        stmt.setString(2, group.getName());
+        stmt.setString(3, group.getDescription());
+        stmt.setTimestamp(4, group.getCreatedOn());
+        stmt.setString(5, group.getOwnerGroupUUID().get());
+        stmt.setString(6, group.isVisibleToAll() ? "Y" : "N");
+        stmt.setInt(7, group.getId().get());
+        stmt.addBatch();
+      }
+      stmt.executeBatch();
+    }
+  }
+
+  private void executeSchemaMigration(SchemaVersion schema) throws Exception {
+    schema.migrateData(db, new TestUpdateUI());
+  }
+
+  private ImmutableList<GroupReference> getAllGroupsFromNoteDb()
+      throws IOException, ConfigInvalidException {
+    try (Repository allUsersRepo = gitRepoManager.openRepository(allUsersName)) {
+      return GroupNameNotes.loadAllGroups(allUsersRepo);
+    }
+  }
+
+  @Nullable
+  private ObjectId getGroupSha1(AccountGroup.UUID groupUuid) throws IOException {
+    try (Repository allUsersRepo = gitRepoManager.openRepository(allUsersName)) {
+      Ref ref = allUsersRepo.exactRef(RefNames.refsGroups(groupUuid));
+      return ref != null ? ref.getObjectId() : null;
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/server/schema/Schema_166_to_167_WithGroupsInReviewDbTest.java b/javatests/com/google/gerrit/server/schema/Schema_166_to_167_WithGroupsInReviewDbTest.java
new file mode 100644
index 0000000..78fef39
--- /dev/null
+++ b/javatests/com/google/gerrit/server/schema/Schema_166_to_167_WithGroupsInReviewDbTest.java
@@ -0,0 +1,1125 @@
+// 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.
+
+package com.google.gerrit.server.schema;
+
+import static com.google.common.collect.ImmutableList.toImmutableList;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.extensions.common.testing.CommitInfoSubject.assertThat;
+import static com.google.gerrit.server.notedb.NoteDbTable.GROUPS;
+import static com.google.gerrit.server.notedb.NotesMigration.DISABLE_REVIEW_DB;
+import static com.google.gerrit.server.notedb.NotesMigration.SECTION_NOTE_DB;
+import static com.google.gerrit.truth.OptionalSubject.assertThat;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.extensions.api.GerritApi;
+import com.google.gerrit.extensions.api.accounts.AccountInput;
+import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo;
+import com.google.gerrit.extensions.api.groups.GroupInput;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.common.CommitInfo;
+import com.google.gerrit.extensions.common.GroupAuditEventInfo;
+import com.google.gerrit.extensions.common.GroupAuditEventInfo.GroupMemberAuditEventInfo;
+import com.google.gerrit.extensions.common.GroupAuditEventInfo.Type;
+import com.google.gerrit.extensions.common.GroupAuditEventInfo.UserMemberAuditEventInfo;
+import com.google.gerrit.extensions.common.GroupInfo;
+import com.google.gerrit.extensions.common.GroupOptionsInfo;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.reviewdb.server.ReviewDbWrapper;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.Sequences;
+import com.google.gerrit.server.account.GroupBackend;
+import com.google.gerrit.server.account.GroupUUID;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.GerritServerId;
+import com.google.gerrit.server.config.GerritServerIdProvider;
+import com.google.gerrit.server.git.CommitUtil;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.group.InternalGroup;
+import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.gerrit.server.group.db.GroupConfig;
+import com.google.gerrit.server.group.db.GroupNameNotes;
+import com.google.gerrit.server.group.db.GroupsConsistencyChecker;
+import com.google.gerrit.server.group.testing.InternalGroupSubject;
+import com.google.gerrit.server.group.testing.TestGroupBackend;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.testing.InMemoryTestEnvironment;
+import com.google.gerrit.testing.TestTimeUtil;
+import com.google.gerrit.testing.TestTimeUtil.TempClockStep;
+import com.google.gerrit.testing.TestUpdateUI;
+import com.google.gerrit.truth.OptionalSubject;
+import com.google.gwtorm.jdbc.JdbcSchema;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import java.io.IOException;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.Statement;
+import java.sql.Timestamp;
+import java.time.LocalDate;
+import java.time.Month;
+import java.time.ZoneOffset;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevSort;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class Schema_166_to_167_WithGroupsInReviewDbTest {
+  private static Config createConfig() {
+    Config config = new Config();
+    config.setString(GerritServerIdProvider.SECTION, null, GerritServerIdProvider.KEY, "1234567");
+
+    // Enable groups in ReviewDb. This means the primary storage for groups is ReviewDb.
+    config.setBoolean(SECTION_NOTE_DB, GROUPS.key(), DISABLE_REVIEW_DB, false);
+
+    return config;
+  }
+
+  @Rule
+  public InMemoryTestEnvironment testEnv =
+      new InMemoryTestEnvironment(Schema_166_to_167_WithGroupsInReviewDbTest::createConfig);
+
+  @Inject private GerritApi gApi;
+  @Inject private Schema_167 schema167;
+  @Inject private ReviewDb db;
+  @Inject private GitRepositoryManager gitRepoManager;
+  @Inject private AllUsersName allUsersName;
+  @Inject private GroupsConsistencyChecker consistencyChecker;
+  @Inject private IdentifiedUser currentUser;
+  @Inject private @GerritServerId String serverId;
+  @Inject private @GerritPersonIdent PersonIdent serverIdent;
+  @Inject private GroupBundle.Factory groupBundleFactory;
+  @Inject private GroupBackend groupBackend;
+  @Inject private DynamicSet<GroupBackend> backends;
+  @Inject private Sequences seq;
+
+  private JdbcSchema jdbcSchema;
+
+  @Before
+  public void initDb() throws Exception {
+    jdbcSchema = ReviewDbWrapper.unwrapJbdcSchema(db);
+
+    try (Statement stmt = jdbcSchema.getConnection().createStatement()) {
+      stmt.execute(
+          "CREATE TABLE account_groups ("
+              + " group_uuid varchar(255) DEFAULT '' NOT NULL,"
+              + " group_id INTEGER DEFAULT 0 NOT NULL,"
+              + " name varchar(255) DEFAULT '' NOT NULL,"
+              + " created_on TIMESTAMP,"
+              + " description CLOB,"
+              + " owner_group_uuid varchar(255) DEFAULT '' NOT NULL,"
+              + " visible_to_all CHAR(1) DEFAULT 'N' NOT NULL"
+              + ")");
+
+      stmt.execute(
+          "CREATE TABLE account_group_members ("
+              + " group_id INTEGER DEFAULT 0 NOT NULL,"
+              + " account_id INTEGER DEFAULT 0 NOT NULL"
+              + ")");
+
+      stmt.execute(
+          "CREATE TABLE account_group_members_audit ("
+              + " group_id INTEGER DEFAULT 0 NOT NULL,"
+              + " account_id INTEGER DEFAULT 0 NOT NULL,"
+              + " added_by INTEGER DEFAULT 0 NOT NULL,"
+              + " added_on TIMESTAMP,"
+              + " removed_by INTEGER,"
+              + " removed_on TIMESTAMP"
+              + ")");
+
+      stmt.execute(
+          "CREATE TABLE account_group_by_id ("
+              + " group_id INTEGER DEFAULT 0 NOT NULL,"
+              + " include_uuid VARCHAR(255) DEFAULT '' NOT NULL"
+              + ")");
+
+      stmt.execute(
+          "CREATE TABLE account_group_by_id_aud ("
+              + " group_id INTEGER DEFAULT 0 NOT NULL,"
+              + " include_uuid VARCHAR(255) DEFAULT '' NOT NULL,"
+              + " added_by INTEGER DEFAULT 0 NOT NULL,"
+              + " added_on TIMESTAMP,"
+              + " removed_by INTEGER,"
+              + " removed_on TIMESTAMP"
+              + ")");
+    }
+  }
+
+  @Before
+  public void setTimeForTesting() {
+    TestTimeUtil.resetWithClockStep(1, TimeUnit.SECONDS);
+  }
+
+  @After
+  public void resetTime() {
+    TestTimeUtil.useSystemTime();
+  }
+
+  @Test
+  public void reviewDbOnlyGroupsAreMigratedToNoteDb() throws Exception {
+    // Create groups only in ReviewDb
+    AccountGroup group1 = newGroup().setName("verifiers").build();
+    AccountGroup group2 = newGroup().setName("contributors").build();
+    storeInReviewDb(group1, group2);
+
+    executeSchemaMigration(schema167, group1, group2);
+
+    ImmutableList<GroupReference> groups = getAllGroupsFromNoteDb();
+    ImmutableList<String> groupNames =
+        groups.stream().map(GroupReference::getName).collect(toImmutableList());
+    assertThat(groupNames).containsAllOf("verifiers", "contributors");
+  }
+
+  @Test
+  public void alreadyExistingGroupsAreMigratedToNoteDb() throws Exception {
+    // Create group in NoteDb and ReviewDb
+    GroupInput groupInput = new GroupInput();
+    groupInput.name = "verifiers";
+    groupInput.description = "old";
+    GroupInfo group1 = gApi.groups().create(groupInput).get();
+    storeInReviewDb(group1);
+
+    // Update group only in ReviewDb
+    AccountGroup group1InReviewDb = getFromReviewDb(new AccountGroup.Id(group1.groupId));
+    group1InReviewDb.setDescription("new");
+    updateInReviewDb(group1InReviewDb);
+
+    // Create a second group in NoteDb and ReviewDb
+    GroupInfo group2 = gApi.groups().create("contributors").get();
+    storeInReviewDb(group2);
+
+    executeSchemaMigration(schema167, group1, group2);
+
+    // Verify that both groups are present in NoteDb
+    ImmutableList<GroupReference> groups = getAllGroupsFromNoteDb();
+    ImmutableList<String> groupNames =
+        groups.stream().map(GroupReference::getName).collect(toImmutableList());
+    assertThat(groupNames).containsAllOf("verifiers", "contributors");
+
+    // Verify that group1 has the description from ReviewDb
+    Optional<InternalGroup> group1InNoteDb = getGroupFromNoteDb(new AccountGroup.UUID(group1.id));
+    assertThatGroup(group1InNoteDb).value().description().isEqualTo("new");
+  }
+
+  @Test
+  public void adminGroupIsMigratedToNoteDb() throws Exception {
+    // Administrators group is automatically created for all Gerrit servers (NoteDb only).
+    GroupInfo adminGroup = gApi.groups().id("Administrators").get();
+    storeInReviewDb(adminGroup);
+
+    executeSchemaMigration(schema167, adminGroup);
+
+    ImmutableList<GroupReference> groups = getAllGroupsFromNoteDb();
+    ImmutableList<String> groupNames =
+        groups.stream().map(GroupReference::getName).collect(toImmutableList());
+    assertThat(groupNames).contains("Administrators");
+  }
+
+  @Test
+  public void nonInteractiveUsersGroupIsMigratedToNoteDb() throws Exception {
+    // 'Non-Interactive Users' group is automatically created for all Gerrit servers (NoteDb only).
+    GroupInfo nonInteractiveUsersGroup = gApi.groups().id("Non-Interactive Users").get();
+    storeInReviewDb(nonInteractiveUsersGroup);
+
+    executeSchemaMigration(schema167, nonInteractiveUsersGroup);
+
+    ImmutableList<GroupReference> groups = getAllGroupsFromNoteDb();
+    ImmutableList<String> groupNames =
+        groups.stream().map(GroupReference::getName).collect(toImmutableList());
+    assertThat(groupNames).contains("Non-Interactive Users");
+  }
+
+  @Test
+  public void groupsAreConsistentAfterMigrationToNoteDb() throws Exception {
+    // Administrators group are automatically created for all Gerrit servers (NoteDb only).
+    GroupInfo adminGroup = gApi.groups().id("Administrators").get();
+    GroupInfo nonInteractiveUsersGroup = gApi.groups().id("Non-Interactive Users").get();
+    storeInReviewDb(adminGroup, nonInteractiveUsersGroup);
+
+    AccountGroup group1 = newGroup().setName("verifiers").build();
+    AccountGroup group2 = newGroup().setName("contributors").build();
+    storeInReviewDb(group1, group2);
+
+    executeSchemaMigration(schema167, group1, group2);
+
+    List<ConsistencyCheckInfo.ConsistencyProblemInfo> consistencyProblems =
+        consistencyChecker.check();
+    assertThat(consistencyProblems).isEmpty();
+  }
+
+  @Test
+  public void nameIsKeptDuringMigrationToNoteDb() throws Exception {
+    AccountGroup group = newGroup().setName("verifiers").build();
+    storeInReviewDb(group);
+
+    executeSchemaMigration(schema167, group);
+
+    Optional<InternalGroup> groupInNoteDb = getGroupFromNoteDb(group.getGroupUUID());
+    assertThatGroup(groupInNoteDb).value().name().isEqualTo("verifiers");
+  }
+
+  @Test
+  public void emptyNameIsKeptDuringMigrationToNoteDb() throws Exception {
+    AccountGroup group = newGroup().setName("").build();
+    storeInReviewDb(group);
+
+    executeSchemaMigration(schema167, group);
+
+    Optional<InternalGroup> groupInNoteDb = getGroupFromNoteDb(group.getGroupUUID());
+    assertThatGroup(groupInNoteDb).value().name().isEqualTo("");
+  }
+
+  @Test
+  public void uuidIsKeptDuringMigrationToNoteDb() throws Exception {
+    AccountGroup.UUID groupUuid = new AccountGroup.UUID("ABCDEF");
+    AccountGroup group = newGroup().setGroupUuid(groupUuid).build();
+    storeInReviewDb(group);
+
+    executeSchemaMigration(schema167, group);
+
+    Optional<InternalGroup> groupInNoteDb = getGroupFromNoteDb(groupUuid);
+    assertThatGroup(groupInNoteDb).value().groupUuid().isEqualTo(groupUuid);
+  }
+
+  @Test
+  public void idIsKeptDuringMigrationToNoteDb() throws Exception {
+    AccountGroup.Id id = new AccountGroup.Id(12345);
+    AccountGroup group = newGroup().setId(id).build();
+    storeInReviewDb(group);
+
+    executeSchemaMigration(schema167, group);
+
+    Optional<InternalGroup> groupInNoteDb = getGroupFromNoteDb(group.getGroupUUID());
+    assertThatGroup(groupInNoteDb).value().id().isEqualTo(id);
+  }
+
+  @Test
+  public void createdOnIsKeptDuringMigrationToNoteDb() throws Exception {
+    Timestamp createdOn =
+        Timestamp.from(
+            LocalDate.of(2018, Month.FEBRUARY, 20)
+                .atTime(18, 2, 56)
+                .atZone(ZoneOffset.UTC)
+                .toInstant());
+    AccountGroup group = newGroup().setCreatedOn(createdOn).build();
+    storeInReviewDb(group);
+
+    executeSchemaMigration(schema167, group);
+
+    Optional<InternalGroup> groupInNoteDb = getGroupFromNoteDb(group.getGroupUUID());
+    assertThatGroup(groupInNoteDb).value().createdOn().isEqualTo(createdOn);
+  }
+
+  @Test
+  public void ownerUuidIsKeptDuringMigrationToNoteDb() throws Exception {
+    AccountGroup.UUID ownerGroupUuid = new AccountGroup.UUID("UVWXYZ");
+    AccountGroup group = newGroup().setOwnerGroupUuid(ownerGroupUuid).build();
+    storeInReviewDb(group);
+
+    executeSchemaMigration(schema167, group);
+
+    Optional<InternalGroup> groupInNoteDb = getGroupFromNoteDb(group.getGroupUUID());
+    assertThatGroup(groupInNoteDb).value().ownerGroupUuid().isEqualTo(ownerGroupUuid);
+  }
+
+  @Test
+  public void descriptionIsKeptDuringMigrationToNoteDb() throws Exception {
+    AccountGroup group = newGroup().setDescription("A test group").build();
+    storeInReviewDb(group);
+
+    executeSchemaMigration(schema167, group);
+
+    Optional<InternalGroup> groupInNoteDb = getGroupFromNoteDb(group.getGroupUUID());
+    assertThatGroup(groupInNoteDb).value().description().isEqualTo("A test group");
+  }
+
+  @Test
+  public void absentDescriptionIsKeptDuringMigrationToNoteDb() throws Exception {
+    AccountGroup group = newGroup().build();
+    storeInReviewDb(group);
+
+    executeSchemaMigration(schema167, group);
+
+    Optional<InternalGroup> groupInNoteDb = getGroupFromNoteDb(group.getGroupUUID());
+    assertThatGroup(groupInNoteDb).value().description().isNull();
+  }
+
+  @Test
+  public void visibleToAllIsKeptDuringMigrationToNoteDb() throws Exception {
+    AccountGroup group = newGroup().setVisibleToAll(true).build();
+    storeInReviewDb(group);
+
+    executeSchemaMigration(schema167, group);
+
+    Optional<InternalGroup> groupInNoteDb = getGroupFromNoteDb(group.getGroupUUID());
+    assertThatGroup(groupInNoteDb).value().visibleToAll().isTrue();
+  }
+
+  @Test
+  public void membersAreKeptDuringMigrationToNoteDb() throws Exception {
+    AccountGroup group = newGroup().build();
+    storeInReviewDb(group);
+    Account.Id member1 = new Account.Id(23456);
+    Account.Id member2 = new Account.Id(93483);
+    addMembersInReviewDb(group.getId(), member1, member2);
+
+    executeSchemaMigration(schema167, group);
+
+    Optional<InternalGroup> groupInNoteDb = getGroupFromNoteDb(group.getGroupUUID());
+    assertThatGroup(groupInNoteDb).value().members().containsExactly(member1, member2);
+  }
+
+  @Test
+  public void subgroupsAreKeptDuringMigrationToNoteDb() throws Exception {
+    AccountGroup group = newGroup().build();
+    storeInReviewDb(group);
+    AccountGroup.UUID subgroup1 = new AccountGroup.UUID("FGHIKL");
+    AccountGroup.UUID subgroup2 = new AccountGroup.UUID("MNOPQR");
+    addSubgroupsInReviewDb(group.getId(), subgroup1, subgroup2);
+
+    executeSchemaMigration(schema167, group);
+
+    Optional<InternalGroup> groupInNoteDb = getGroupFromNoteDb(group.getGroupUUID());
+    assertThatGroup(groupInNoteDb).value().subgroups().containsExactly(subgroup1, subgroup2);
+  }
+
+  @Test
+  public void logFormatWithAccountsAndGerritGroups() throws Exception {
+    AccountInfo user1 = createAccount("user1");
+    AccountInfo user2 = createAccount("user2");
+
+    AccountGroup group1 = createInReviewDb("group1");
+    AccountGroup group2 = createInReviewDb("group2");
+    AccountGroup group3 = createInReviewDb("group3");
+
+    // Add some accounts
+    try (TempClockStep step = TestTimeUtil.freezeClock()) {
+      addMembersInReviewDb(
+          group1.getId(), new Account.Id(user1._accountId), new Account.Id(user2._accountId));
+    }
+    TimeUtil.nowTs();
+
+    // Add some Gerrit groups
+    try (TempClockStep step = TestTimeUtil.freezeClock()) {
+      addSubgroupsInReviewDb(group1.getId(), group2.getGroupUUID(), group3.getGroupUUID());
+    }
+
+    executeSchemaMigration(schema167, group1, group2, group3);
+
+    GroupBundle noteDbBundle = readGroupBundleFromNoteDb(group1.getGroupUUID());
+
+    ImmutableList<CommitInfo> log = log(group1);
+    assertThat(log).hasSize(4);
+
+    // Verify commit that created the group
+    assertThat(log.get(0)).message().isEqualTo("Create group");
+    assertThat(log.get(0)).author().name().isEqualTo(serverIdent.getName());
+    assertThat(log.get(0)).author().email().isEqualTo(serverIdent.getEmailAddress());
+    assertThat(log.get(0)).author().date().isEqualTo(noteDbBundle.group().getCreatedOn());
+    assertThat(log.get(0)).author().tz().isEqualTo(serverIdent.getTimeZoneOffset());
+    assertThat(log.get(0)).committer().isEqualTo(log.get(0).author);
+
+    // Verify commit that the group creator as member
+    assertThat(log.get(1))
+        .message()
+        .isEqualTo(
+            "Update group\n\nAdd: "
+                + currentUser.getName()
+                + " <"
+                + currentUser.getAccountId()
+                + "@"
+                + serverId
+                + ">");
+    assertThat(log.get(1)).author().name().isEqualTo(currentUser.getName());
+    assertThat(log.get(1)).author().email().isEqualTo(currentUser.getAccountId() + "@" + serverId);
+    assertThat(log.get(1)).committer().hasSameDateAs(log.get(1).author);
+
+    // Verify commit that added members
+    assertThat(log.get(2))
+        .message()
+        .isEqualTo(
+            "Update group\n"
+                + "\n"
+                + ("Add: user1 <" + user1._accountId + "@" + serverId + ">\n")
+                + ("Add: user2 <" + user2._accountId + "@" + serverId + ">"));
+    assertThat(log.get(2)).author().name().isEqualTo(currentUser.getName());
+    assertThat(log.get(2)).author().email().isEqualTo(currentUser.getAccountId() + "@" + serverId);
+    assertThat(log.get(2)).committer().hasSameDateAs(log.get(2).author);
+
+    // Verify commit that added Gerrit groups
+    assertThat(log.get(3))
+        .message()
+        .isEqualTo(
+            "Update group\n"
+                + "\n"
+                + ("Add-group: " + group2.getName() + " <" + group2.getGroupUUID().get() + ">\n")
+                + ("Add-group: " + group3.getName() + " <" + group3.getGroupUUID().get() + ">"));
+    assertThat(log.get(3)).author().name().isEqualTo(currentUser.getName());
+    assertThat(log.get(3)).author().email().isEqualTo(currentUser.getAccountId() + "@" + serverId);
+    assertThat(log.get(3)).committer().hasSameDateAs(log.get(3).author);
+
+    // Verify that audit log is correctly read by Gerrit
+    List<? extends GroupAuditEventInfo> auditEvents =
+        gApi.groups().id(group1.getGroupUUID().get()).auditLog();
+    assertThat(auditEvents).hasSize(5);
+    AccountInfo currentUserInfo = gApi.accounts().id(currentUser.getAccountId().get()).get();
+    assertMemberAuditEvent(
+        auditEvents.get(4), Type.ADD_USER, currentUser.getAccountId(), currentUserInfo);
+    assertMemberAuditEvents(
+        auditEvents.get(3),
+        auditEvents.get(2),
+        Type.ADD_USER,
+        currentUser.getAccountId(),
+        user1,
+        user2);
+    assertSubgroupAuditEvents(
+        auditEvents.get(1),
+        auditEvents.get(0),
+        Type.ADD_GROUP,
+        currentUser.getAccountId(),
+        toGroupInfo(group2),
+        toGroupInfo(group3));
+  }
+
+  @Test
+  public void logFormatWithSystemGroups() throws Exception {
+    AccountGroup group = createInReviewDb("group");
+
+    try (TempClockStep step = TestTimeUtil.freezeClock()) {
+      addSubgroupsInReviewDb(
+          group.getId(), SystemGroupBackend.ANONYMOUS_USERS, SystemGroupBackend.REGISTERED_USERS);
+    }
+
+    executeSchemaMigration(schema167, group);
+
+    GroupBundle noteDbBundle = readGroupBundleFromNoteDb(group.getGroupUUID());
+
+    ImmutableList<CommitInfo> log = log(group);
+    assertThat(log).hasSize(3);
+
+    // Verify commit that created the group
+    assertThat(log.get(0)).message().isEqualTo("Create group");
+    assertThat(log.get(0)).author().name().isEqualTo(serverIdent.getName());
+    assertThat(log.get(0)).author().email().isEqualTo(serverIdent.getEmailAddress());
+    assertThat(log.get(0)).author().date().isEqualTo(noteDbBundle.group().getCreatedOn());
+    assertThat(log.get(0)).author().tz().isEqualTo(serverIdent.getTimeZoneOffset());
+    assertThat(log.get(0)).committer().isEqualTo(log.get(0).author);
+
+    // Verify commit that the group creator as member
+    assertThat(log.get(1))
+        .message()
+        .isEqualTo(
+            "Update group\n\nAdd: "
+                + currentUser.getName()
+                + " <"
+                + currentUser.getAccountId()
+                + "@"
+                + serverId
+                + ">");
+    assertThat(log.get(1)).author().name().isEqualTo(currentUser.getName());
+    assertThat(log.get(1)).author().email().isEqualTo(currentUser.getAccountId() + "@" + serverId);
+    assertThat(log.get(1)).committer().hasSameDateAs(log.get(1).author);
+
+    // Verify commit that added system groups
+    assertThat(log.get(2))
+        .message()
+        .isEqualTo(
+            "Update group\n"
+                + "\n"
+                + "Add-group: Anonymous Users <global:Anonymous-Users>\n"
+                + "Add-group: Registered Users <global:Registered-Users>");
+    assertThat(log.get(2)).author().name().isEqualTo(currentUser.getName());
+    assertThat(log.get(2)).author().email().isEqualTo(currentUser.getAccountId() + "@" + serverId);
+    assertThat(log.get(2)).committer().hasSameDateAs(log.get(2).author);
+
+    // Verify that audit log is correctly read by Gerrit
+    List<? extends GroupAuditEventInfo> auditEvents =
+        gApi.groups().id(group.getGroupUUID().get()).auditLog();
+    assertThat(auditEvents).hasSize(3);
+    AccountInfo currentUserInfo = gApi.accounts().id(currentUser.getAccountId().get()).get();
+    assertMemberAuditEvent(
+        auditEvents.get(2), Type.ADD_USER, currentUser.getAccountId(), currentUserInfo);
+    assertSubgroupAuditEvents(
+        auditEvents.get(1),
+        auditEvents.get(0),
+        Type.ADD_GROUP,
+        currentUser.getAccountId(),
+        groupInfoForExternalGroup(SystemGroupBackend.ANONYMOUS_USERS),
+        groupInfoForExternalGroup(SystemGroupBackend.REGISTERED_USERS));
+  }
+
+  @Test
+  public void logFormatWithExternalGroup() throws Exception {
+    AccountGroup group = createInReviewDb("group");
+
+    TestGroupBackend testGroupBackend = new TestGroupBackend();
+    backends.add("gerrit", testGroupBackend);
+    AccountGroup.UUID subgroupUuid = testGroupBackend.create("test").getGroupUUID();
+    assertThat(groupBackend.handles(subgroupUuid)).isTrue();
+    addSubgroupsInReviewDb(group.getId(), subgroupUuid);
+
+    executeSchemaMigration(schema167, group);
+
+    GroupBundle noteDbBundle = readGroupBundleFromNoteDb(group.getGroupUUID());
+
+    ImmutableList<CommitInfo> log = log(group);
+    assertThat(log).hasSize(3);
+
+    // Verify commit that created the group
+    assertThat(log.get(0)).message().isEqualTo("Create group");
+    assertThat(log.get(0)).author().name().isEqualTo(serverIdent.getName());
+    assertThat(log.get(0)).author().email().isEqualTo(serverIdent.getEmailAddress());
+    assertThat(log.get(0)).author().date().isEqualTo(noteDbBundle.group().getCreatedOn());
+    assertThat(log.get(0)).author().tz().isEqualTo(serverIdent.getTimeZoneOffset());
+    assertThat(log.get(0)).committer().isEqualTo(log.get(0).author);
+
+    // Verify commit that the group creator as member
+    assertThat(log.get(1))
+        .message()
+        .isEqualTo(
+            "Update group\n\nAdd: "
+                + currentUser.getName()
+                + " <"
+                + currentUser.getAccountId()
+                + "@"
+                + serverId
+                + ">");
+    assertThat(log.get(1)).author().name().isEqualTo(currentUser.getName());
+    assertThat(log.get(1)).author().email().isEqualTo(currentUser.getAccountId() + "@" + serverId);
+    assertThat(log.get(1)).committer().hasSameDateAs(log.get(1).author);
+
+    // Verify commit that added system groups
+    // Note: The schema migration can only resolve names of Gerrit groups, not of external groups
+    // and system groups, hence the UUID shows up in commit messages where we would otherwise
+    // expect the group name.
+    assertThat(log.get(2))
+        .message()
+        .isEqualTo(
+            "Update group\n"
+                + "\n"
+                + "Add-group: "
+                + subgroupUuid.get()
+                + " <"
+                + subgroupUuid.get()
+                + ">");
+    assertThat(log.get(2)).author().name().isEqualTo(currentUser.getName());
+    assertThat(log.get(2)).author().email().isEqualTo(currentUser.getAccountId() + "@" + serverId);
+    assertThat(log.get(2)).committer().hasSameDateAs(log.get(2).author);
+
+    // Verify that audit log is correctly read by Gerrit
+    List<? extends GroupAuditEventInfo> auditEvents =
+        gApi.groups().id(group.getGroupUUID().get()).auditLog();
+    assertThat(auditEvents).hasSize(2);
+    AccountInfo currentUserInfo = gApi.accounts().id(currentUser.getAccountId().get()).get();
+    assertMemberAuditEvent(
+        auditEvents.get(1), Type.ADD_USER, currentUser.getAccountId(), currentUserInfo);
+    assertSubgroupAuditEvent(
+        auditEvents.get(0),
+        Type.ADD_GROUP,
+        currentUser.getAccountId(),
+        groupInfoForExternalGroup(subgroupUuid));
+  }
+
+  @Test
+  public void logFormatWithNonExistingExternalGroup() throws Exception {
+    AccountGroup group = createInReviewDb("group");
+
+    AccountGroup.UUID subgroupUuid = new AccountGroup.UUID("notExisting:foo");
+
+    assertThat(groupBackend.handles(subgroupUuid)).isFalse();
+    addSubgroupsInReviewDb(group.getId(), subgroupUuid);
+
+    executeSchemaMigration(schema167, group);
+
+    GroupBundle noteDbBundle = readGroupBundleFromNoteDb(group.getGroupUUID());
+
+    ImmutableList<CommitInfo> log = log(group);
+    assertThat(log).hasSize(3);
+
+    // Verify commit that created the group
+    assertThat(log.get(0)).message().isEqualTo("Create group");
+    assertThat(log.get(0)).author().name().isEqualTo(serverIdent.getName());
+    assertThat(log.get(0)).author().email().isEqualTo(serverIdent.getEmailAddress());
+    assertThat(log.get(0)).author().date().isEqualTo(noteDbBundle.group().getCreatedOn());
+    assertThat(log.get(0)).author().tz().isEqualTo(serverIdent.getTimeZoneOffset());
+    assertThat(log.get(0)).committer().isEqualTo(log.get(0).author);
+
+    // Verify commit that the group creator as member
+    assertThat(log.get(1))
+        .message()
+        .isEqualTo(
+            "Update group\n\nAdd: "
+                + currentUser.getName()
+                + " <"
+                + currentUser.getAccountId()
+                + "@"
+                + serverId
+                + ">");
+    assertThat(log.get(1)).author().name().isEqualTo(currentUser.getName());
+    assertThat(log.get(1)).author().email().isEqualTo(currentUser.getAccountId() + "@" + serverId);
+    assertThat(log.get(1)).committer().hasSameDateAs(log.get(1).author);
+
+    // Verify commit that added system groups
+    // Note: The schema migration can only resolve names of Gerrit groups, not of external groups
+    // and system groups, hence the UUID shows up in commit messages where we would otherwise
+    // expect the group name.
+    assertThat(log.get(2))
+        .message()
+        .isEqualTo("Update group\n" + "\n" + "Add-group: notExisting:foo <notExisting:foo>");
+    assertThat(log.get(2)).author().name().isEqualTo(currentUser.getName());
+    assertThat(log.get(2)).author().email().isEqualTo(currentUser.getAccountId() + "@" + serverId);
+    assertThat(log.get(2)).committer().hasSameDateAs(log.get(2).author);
+
+    // Verify that audit log is correctly read by Gerrit
+    List<? extends GroupAuditEventInfo> auditEvents =
+        gApi.groups().id(group.getGroupUUID().get()).auditLog();
+    assertThat(auditEvents).hasSize(2);
+    AccountInfo currentUserInfo = gApi.accounts().id(currentUser.getAccountId().get()).get();
+    assertMemberAuditEvent(
+        auditEvents.get(1), Type.ADD_USER, currentUser.getAccountId(), currentUserInfo);
+    assertSubgroupAuditEvent(
+        auditEvents.get(0),
+        Type.ADD_GROUP,
+        currentUser.getAccountId(),
+        groupInfoForExternalGroup(subgroupUuid));
+  }
+
+  private static TestGroup.Builder newGroup() {
+    return TestGroup.builder();
+  }
+
+  private AccountGroup createInReviewDb(String groupName) throws Exception {
+    AccountGroup group =
+        new AccountGroup(
+            new AccountGroup.NameKey(groupName),
+            new AccountGroup.Id(seq.nextGroupId()),
+            GroupUUID.make(groupName, serverIdent),
+            TimeUtil.nowTs());
+    storeInReviewDb(group);
+    addMembersInReviewDb(group.getId(), currentUser.getAccountId());
+    return group;
+  }
+
+  private void storeInReviewDb(GroupInfo... groups) throws Exception {
+    storeInReviewDb(
+        Arrays.stream(groups)
+            .map(Schema_166_to_167_WithGroupsInReviewDbTest::toAccountGroup)
+            .toArray(AccountGroup[]::new));
+  }
+
+  private void storeInReviewDb(AccountGroup... groups) throws Exception {
+    try (PreparedStatement stmt =
+        jdbcSchema
+            .getConnection()
+            .prepareStatement(
+                "INSERT INTO account_groups"
+                    + " (group_uuid,"
+                    + " group_id,"
+                    + " name,"
+                    + " description,"
+                    + " created_on,"
+                    + " owner_group_uuid,"
+                    + " visible_to_all) VALUES (?, ?, ?, ?, ?, ?, ?)")) {
+      for (AccountGroup group : groups) {
+        stmt.setString(1, group.getGroupUUID().get());
+        stmt.setInt(2, group.getId().get());
+        stmt.setString(3, group.getName());
+        stmt.setString(4, group.getDescription());
+        stmt.setTimestamp(5, group.getCreatedOn());
+        stmt.setString(6, group.getOwnerGroupUUID().get());
+        stmt.setString(7, group.isVisibleToAll() ? "Y" : "N");
+        stmt.addBatch();
+      }
+      stmt.executeBatch();
+    }
+  }
+
+  private void updateInReviewDb(AccountGroup... groups) throws Exception {
+    try (PreparedStatement stmt =
+        jdbcSchema
+            .getConnection()
+            .prepareStatement(
+                "UPDATE account_groups SET"
+                    + " group_uuid = ?,"
+                    + " name = ?,"
+                    + " description = ?,"
+                    + " created_on = ?,"
+                    + " owner_group_uuid = ?,"
+                    + " visible_to_all = ?"
+                    + " WHERE group_id = ?")) {
+      for (AccountGroup group : groups) {
+        stmt.setString(1, group.getGroupUUID().get());
+        stmt.setString(2, group.getName());
+        stmt.setString(3, group.getDescription());
+        stmt.setTimestamp(4, group.getCreatedOn());
+        stmt.setString(5, group.getOwnerGroupUUID().get());
+        stmt.setString(6, group.isVisibleToAll() ? "Y" : "N");
+        stmt.setInt(7, group.getId().get());
+        stmt.addBatch();
+      }
+      stmt.executeBatch();
+    }
+  }
+
+  private AccountGroup getFromReviewDb(AccountGroup.Id groupId) throws Exception {
+    try (Statement stmt = jdbcSchema.getConnection().createStatement();
+        ResultSet rs =
+            stmt.executeQuery(
+                "SELECT group_uuid,"
+                    + " name,"
+                    + " description,"
+                    + " created_on,"
+                    + " owner_group_uuid,"
+                    + " visible_to_all"
+                    + " FROM account_groups"
+                    + " WHERE group_id = "
+                    + groupId.get())) {
+      if (!rs.next()) {
+        throw new OrmException(String.format("Group %s not found", groupId.get()));
+      }
+
+      AccountGroup.UUID groupUuid = new AccountGroup.UUID(rs.getString(1));
+      AccountGroup.NameKey groupName = new AccountGroup.NameKey(rs.getString(2));
+      String description = rs.getString(3);
+      Timestamp createdOn = rs.getTimestamp(4);
+      AccountGroup.UUID ownerGroupUuid = new AccountGroup.UUID(rs.getString(5));
+      boolean visibleToAll = "Y".equals(rs.getString(6));
+
+      AccountGroup group = new AccountGroup(groupName, groupId, groupUuid, createdOn);
+      group.setDescription(description);
+      group.setOwnerGroupUUID(ownerGroupUuid);
+      group.setVisibleToAll(visibleToAll);
+
+      if (rs.next()) {
+        throw new OrmException(String.format("Group ID %s is ambiguous", groupId.get()));
+      }
+
+      return group;
+    }
+  }
+
+  private void addMembersInReviewDb(AccountGroup.Id groupId, Account.Id... memberIds)
+      throws Exception {
+    try (PreparedStatement addMemberStmt =
+            jdbcSchema
+                .getConnection()
+                .prepareStatement(
+                    "INSERT INTO account_group_members"
+                        + " (group_id,"
+                        + " account_id) VALUES ("
+                        + groupId.get()
+                        + ", ?)");
+        PreparedStatement addMemberAuditStmt =
+            jdbcSchema
+                .getConnection()
+                .prepareStatement(
+                    "INSERT INTO account_group_members_audit"
+                        + " (group_id,"
+                        + " account_id,"
+                        + " added_by,"
+                        + " added_on) VALUES ("
+                        + groupId.get()
+                        + ", ?, "
+                        + currentUser.getAccountId().get()
+                        + ", ?)")) {
+      Timestamp addedOn = TimeUtil.nowTs();
+      for (Account.Id memberId : memberIds) {
+        addMemberStmt.setInt(1, memberId.get());
+        addMemberStmt.addBatch();
+
+        addMemberAuditStmt.setInt(1, memberId.get());
+        addMemberAuditStmt.setTimestamp(2, addedOn);
+        addMemberAuditStmt.addBatch();
+      }
+      addMemberStmt.executeBatch();
+      addMemberAuditStmt.executeBatch();
+    }
+  }
+
+  private void addSubgroupsInReviewDb(AccountGroup.Id groupId, AccountGroup.UUID... subgroupUuids)
+      throws Exception {
+    try (PreparedStatement addSubGroupStmt =
+            jdbcSchema
+                .getConnection()
+                .prepareStatement(
+                    "INSERT INTO account_group_by_id"
+                        + " (group_id,"
+                        + " include_uuid) VALUES ("
+                        + groupId.get()
+                        + ", ?)");
+        PreparedStatement addSubGroupAuditStmt =
+            jdbcSchema
+                .getConnection()
+                .prepareStatement(
+                    "INSERT INTO account_group_by_id_aud"
+                        + " (group_id,"
+                        + " include_uuid,"
+                        + " added_by,"
+                        + " added_on) VALUES ("
+                        + groupId.get()
+                        + ", ?, "
+                        + currentUser.getAccountId().get()
+                        + ", ?)")) {
+      Timestamp addedOn = TimeUtil.nowTs();
+      for (AccountGroup.UUID subgroupUuid : subgroupUuids) {
+        addSubGroupStmt.setString(1, subgroupUuid.get());
+        addSubGroupStmt.addBatch();
+
+        addSubGroupAuditStmt.setString(1, subgroupUuid.get());
+        addSubGroupAuditStmt.setTimestamp(2, addedOn);
+        addSubGroupAuditStmt.addBatch();
+      }
+      addSubGroupStmt.executeBatch();
+      addSubGroupAuditStmt.executeBatch();
+    }
+  }
+
+  private AccountInfo createAccount(String name) throws RestApiException {
+    AccountInput accountInput = new AccountInput();
+    accountInput.username = name;
+    accountInput.name = name;
+    return gApi.accounts().create(accountInput).get();
+  }
+
+  private GroupBundle readGroupBundleFromNoteDb(AccountGroup.UUID groupUuid) throws Exception {
+    try (Repository allUsersRepo = gitRepoManager.openRepository(allUsersName)) {
+      return groupBundleFactory.fromNoteDb(allUsersName, allUsersRepo, groupUuid);
+    }
+  }
+
+  private void executeSchemaMigration(SchemaVersion schema, AccountGroup... groupsToVerify)
+      throws Exception {
+    executeSchemaMigration(
+        schema,
+        Arrays.stream(groupsToVerify)
+            .map(AccountGroup::getGroupUUID)
+            .toArray(AccountGroup.UUID[]::new));
+  }
+
+  private void executeSchemaMigration(SchemaVersion schema, GroupInfo... groupsToVerify)
+      throws Exception {
+    executeSchemaMigration(
+        schema,
+        Arrays.stream(groupsToVerify)
+            .map(i -> new AccountGroup.UUID(i.id))
+            .toArray(AccountGroup.UUID[]::new));
+  }
+
+  private void executeSchemaMigration(SchemaVersion schema, AccountGroup.UUID... groupsToVerify)
+      throws Exception {
+    List<GroupBundle> reviewDbBundles = new ArrayList<>();
+    for (AccountGroup.UUID groupUuid : groupsToVerify) {
+      reviewDbBundles.add(GroupBundle.Factory.fromReviewDb(db, groupUuid));
+    }
+
+    schema.migrateData(db, new TestUpdateUI());
+
+    for (GroupBundle reviewDbBundle : reviewDbBundles) {
+      assertMigratedCleanly(readGroupBundleFromNoteDb(reviewDbBundle.uuid()), reviewDbBundle);
+    }
+  }
+
+  private void assertMigratedCleanly(GroupBundle noteDbBundle, GroupBundle expectedReviewDbBundle) {
+    assertThat(GroupBundle.compareWithAudits(expectedReviewDbBundle, noteDbBundle)).isEmpty();
+  }
+
+  private ImmutableList<CommitInfo> log(AccountGroup group) throws Exception {
+    ImmutableList.Builder<CommitInfo> result = ImmutableList.builder();
+    List<Date> commitDates = new ArrayList<>();
+    try (Repository allUsersRepo = gitRepoManager.openRepository(allUsersName);
+        RevWalk rw = new RevWalk(allUsersRepo)) {
+      Ref ref = allUsersRepo.exactRef(RefNames.refsGroups(group.getGroupUUID()));
+      if (ref != null) {
+        rw.sort(RevSort.REVERSE);
+        rw.setRetainBody(true);
+        rw.markStart(rw.parseCommit(ref.getObjectId()));
+        for (RevCommit c : rw) {
+          result.add(CommitUtil.toCommitInfo(c));
+          commitDates.add(c.getCommitterIdent().getWhen());
+        }
+      }
+    }
+    assertThat(commitDates).named("commit timestamps for %s", result).isOrdered();
+    return result.build();
+  }
+
+  private ImmutableList<GroupReference> getAllGroupsFromNoteDb()
+      throws IOException, ConfigInvalidException {
+    try (Repository allUsersRepo = gitRepoManager.openRepository(allUsersName)) {
+      return GroupNameNotes.loadAllGroups(allUsersRepo);
+    }
+  }
+
+  private Optional<InternalGroup> getGroupFromNoteDb(AccountGroup.UUID groupUuid) throws Exception {
+    try (Repository allUsersRepo = gitRepoManager.openRepository(allUsersName)) {
+      return GroupConfig.loadForGroup(allUsersName, allUsersRepo, groupUuid).getLoadedGroup();
+    }
+  }
+
+  private static OptionalSubject<InternalGroupSubject, InternalGroup> assertThatGroup(
+      Optional<InternalGroup> group) {
+    return assertThat(group, InternalGroupSubject::assertThat).named("group");
+  }
+
+  private void assertMemberAuditEvent(
+      GroupAuditEventInfo info,
+      Type expectedType,
+      Account.Id expectedUser,
+      AccountInfo expectedMember) {
+    assertThat(info.user._accountId).isEqualTo(expectedUser.get());
+    assertThat(info.type).isEqualTo(expectedType);
+    assertThat(info).isInstanceOf(UserMemberAuditEventInfo.class);
+    assertAccount(((UserMemberAuditEventInfo) info).member, expectedMember);
+  }
+
+  private void assertMemberAuditEvents(
+      GroupAuditEventInfo info1,
+      GroupAuditEventInfo info2,
+      Type expectedType,
+      Account.Id expectedUser,
+      AccountInfo expectedMember1,
+      AccountInfo expectedMember2) {
+    assertThat(info1).isInstanceOf(UserMemberAuditEventInfo.class);
+    assertThat(info2).isInstanceOf(UserMemberAuditEventInfo.class);
+
+    UserMemberAuditEventInfo event1 = (UserMemberAuditEventInfo) info1;
+    UserMemberAuditEventInfo event2 = (UserMemberAuditEventInfo) info2;
+
+    assertThat(event1.member._accountId)
+        .isAnyOf(expectedMember1._accountId, expectedMember2._accountId);
+    assertThat(event2.member._accountId)
+        .isAnyOf(expectedMember1._accountId, expectedMember2._accountId);
+    assertThat(event1.member._accountId).isNotEqualTo(event2.member._accountId);
+
+    if (event1.member._accountId == expectedMember1._accountId) {
+      assertMemberAuditEvent(info1, expectedType, expectedUser, expectedMember1);
+      assertMemberAuditEvent(info2, expectedType, expectedUser, expectedMember2);
+    } else {
+      assertMemberAuditEvent(info1, expectedType, expectedUser, expectedMember2);
+      assertMemberAuditEvent(info2, expectedType, expectedUser, expectedMember1);
+    }
+  }
+
+  private void assertSubgroupAuditEvent(
+      GroupAuditEventInfo info,
+      Type expectedType,
+      Account.Id expectedUser,
+      GroupInfo expectedSubGroup) {
+    assertThat(info.user._accountId).isEqualTo(expectedUser.get());
+    assertThat(info.type).isEqualTo(expectedType);
+    assertThat(info).isInstanceOf(GroupMemberAuditEventInfo.class);
+    assertGroup(((GroupMemberAuditEventInfo) info).member, expectedSubGroup);
+  }
+
+  private void assertSubgroupAuditEvents(
+      GroupAuditEventInfo info1,
+      GroupAuditEventInfo info2,
+      Type expectedType,
+      Account.Id expectedUser,
+      GroupInfo expectedSubGroup1,
+      GroupInfo expectedSubGroup2) {
+    assertThat(info1).isInstanceOf(GroupMemberAuditEventInfo.class);
+    assertThat(info2).isInstanceOf(GroupMemberAuditEventInfo.class);
+
+    GroupMemberAuditEventInfo event1 = (GroupMemberAuditEventInfo) info1;
+    GroupMemberAuditEventInfo event2 = (GroupMemberAuditEventInfo) info2;
+
+    assertThat(event1.member.id).isAnyOf(expectedSubGroup1.id, expectedSubGroup2.id);
+    assertThat(event2.member.id).isAnyOf(expectedSubGroup1.id, expectedSubGroup2.id);
+    assertThat(event1.member.id).isNotEqualTo(event2.member.id);
+
+    if (event1.member.id.equals(expectedSubGroup1.id)) {
+      assertSubgroupAuditEvent(info1, expectedType, expectedUser, expectedSubGroup1);
+      assertSubgroupAuditEvent(info2, expectedType, expectedUser, expectedSubGroup2);
+    } else {
+      assertSubgroupAuditEvent(info1, expectedType, expectedUser, expectedSubGroup2);
+      assertSubgroupAuditEvent(info2, expectedType, expectedUser, expectedSubGroup1);
+    }
+  }
+
+  private void assertAccount(AccountInfo actual, AccountInfo expected) {
+    assertThat(actual._accountId).isEqualTo(expected._accountId);
+    assertThat(actual.name).isEqualTo(expected.name);
+    assertThat(actual.email).isEqualTo(expected.email);
+    assertThat(actual.username).isEqualTo(expected.username);
+  }
+
+  private void assertGroup(GroupInfo actual, GroupInfo expected) {
+    assertThat(actual.id).isEqualTo(expected.id);
+    assertThat(actual.name).isEqualTo(expected.name);
+    assertThat(actual.groupId).isEqualTo(expected.groupId);
+  }
+
+  private GroupInfo groupInfoForExternalGroup(AccountGroup.UUID groupUuid) {
+    GroupInfo groupInfo = new GroupInfo();
+    groupInfo.id = IdString.fromDecoded(groupUuid.get()).encoded();
+
+    if (groupBackend.handles(groupUuid)) {
+      groupInfo.name = groupBackend.get(groupUuid).getName();
+    }
+
+    return groupInfo;
+  }
+
+  private static AccountGroup toAccountGroup(GroupInfo info) {
+    AccountGroup group =
+        new AccountGroup(
+            new AccountGroup.NameKey(info.name),
+            new AccountGroup.Id(info.groupId),
+            new AccountGroup.UUID(info.id),
+            info.createdOn);
+    group.setDescription(info.description);
+    if (info.ownerId != null) {
+      group.setOwnerGroupUUID(new AccountGroup.UUID(info.ownerId));
+    }
+    group.setVisibleToAll(
+        info.options != null && info.options.visibleToAll != null && info.options.visibleToAll);
+    return group;
+  }
+
+  private static GroupInfo toGroupInfo(AccountGroup group) {
+    GroupInfo groupInfo = new GroupInfo();
+    groupInfo.id = group.getGroupUUID().get();
+    groupInfo.groupId = group.getId().get();
+    groupInfo.name = group.getName();
+    groupInfo.createdOn = group.getCreatedOn();
+    groupInfo.description = group.getDescription();
+    groupInfo.owner = group.getOwnerGroupUUID().get();
+    groupInfo.options = new GroupOptionsInfo();
+    groupInfo.options.visibleToAll = group.isVisibleToAll() ? true : null;
+    return groupInfo;
+  }
+}
diff --git a/javatests/com/google/gerrit/server/schema/TestGroup.java b/javatests/com/google/gerrit/server/schema/TestGroup.java
new file mode 100644
index 0000000..4627e8b
--- /dev/null
+++ b/javatests/com/google/gerrit/server/schema/TestGroup.java
@@ -0,0 +1,81 @@
+// 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.
+
+package com.google.gerrit.server.schema;
+
+import com.google.auto.value.AutoValue;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.util.time.TimeUtil;
+import java.sql.Timestamp;
+import java.util.Optional;
+import org.junit.Ignore;
+
+@AutoValue
+@Ignore
+public abstract class TestGroup {
+  abstract Optional<AccountGroup.NameKey> getNameKey();
+
+  abstract Optional<AccountGroup.UUID> getGroupUuid();
+
+  abstract Optional<AccountGroup.Id> getId();
+
+  abstract Optional<Timestamp> getCreatedOn();
+
+  abstract Optional<AccountGroup.UUID> getOwnerGroupUuid();
+
+  abstract Optional<String> getDescription();
+
+  abstract boolean isVisibleToAll();
+
+  public static Builder builder() {
+    return new AutoValue_TestGroup.Builder().setVisibleToAll(false);
+  }
+
+  @AutoValue.Builder
+  public abstract static class Builder {
+    public abstract Builder setNameKey(AccountGroup.NameKey nameKey);
+
+    public Builder setName(String name) {
+      return setNameKey(new AccountGroup.NameKey(name));
+    }
+
+    public abstract Builder setGroupUuid(AccountGroup.UUID uuid);
+
+    public abstract Builder setId(AccountGroup.Id id);
+
+    public abstract Builder setCreatedOn(Timestamp createdOn);
+
+    public abstract Builder setOwnerGroupUuid(AccountGroup.UUID ownerGroupUuid);
+
+    public abstract Builder setDescription(String description);
+
+    public abstract Builder setVisibleToAll(boolean visibleToAll);
+
+    public abstract TestGroup autoBuild();
+
+    public AccountGroup build() {
+      TestGroup testGroup = autoBuild();
+      AccountGroup.NameKey name = testGroup.getNameKey().orElse(new AccountGroup.NameKey("users"));
+      AccountGroup.Id id = testGroup.getId().orElse(new AccountGroup.Id(Math.abs(name.hashCode())));
+      AccountGroup.UUID uuid =
+          testGroup.getGroupUuid().orElse(new AccountGroup.UUID(name + "-UUID"));
+      Timestamp createdOn = testGroup.getCreatedOn().orElseGet(TimeUtil::nowTs);
+      AccountGroup accountGroup = new AccountGroup(name, id, uuid, createdOn);
+      testGroup.getOwnerGroupUuid().ifPresent(accountGroup::setOwnerGroupUUID);
+      testGroup.getDescription().ifPresent(accountGroup::setDescription);
+      accountGroup.setVisibleToAll(testGroup.isVisibleToAll());
+      return accountGroup;
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/server/update/BUILD b/javatests/com/google/gerrit/server/update/BUILD
new file mode 100644
index 0000000..cef3d63
--- /dev/null
+++ b/javatests/com/google/gerrit/server/update/BUILD
@@ -0,0 +1,44 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+MEDIUM_TESTS = ["RefUpdateUtilRepoTest.java"]
+
+junit_tests(
+    name = "medium_tests",
+    size = "medium",
+    timeout = "short",
+    srcs = MEDIUM_TESTS,
+    tags = ["no_windows"],
+    deps = [
+        "//java/com/google/gerrit/server",
+        "//lib:guava",
+        "//lib:junit",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/jgit/org.eclipse.jgit.junit:junit",
+        "//lib/truth",
+    ],
+)
+
+junit_tests(
+    name = "small_tests",
+    size = "small",
+    srcs = glob(
+        ["*.java"],
+        exclude = MEDIUM_TESTS,
+    ),
+    deps = [
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/lifecycle",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/server/schema",
+        "//java/com/google/gerrit/server/util/time",
+        "//java/com/google/gerrit/testing:gerrit-test-util",
+        "//lib:guava",
+        "//lib:gwtorm",
+        "//lib/guice",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/jgit/org.eclipse.jgit.junit:junit",
+        "//lib/truth",
+        "//lib/truth:truth-java8-extension",
+    ],
+)
diff --git a/javatests/com/google/gerrit/server/update/BatchUpdateTest.java b/javatests/com/google/gerrit/server/update/BatchUpdateTest.java
new file mode 100644
index 0000000..70c4383
--- /dev/null
+++ b/javatests/com/google/gerrit/server/update/BatchUpdateTest.java
@@ -0,0 +1,72 @@
+// Copyright (C) 2017 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.google.gerrit.server.update;
+
+import static org.junit.Assert.assertEquals;
+
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.testing.InMemoryTestEnvironment;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class BatchUpdateTest {
+  @Rule public InMemoryTestEnvironment testEnvironment = new InMemoryTestEnvironment();
+
+  @Inject private GitRepositoryManager repoManager;
+  @Inject private BatchUpdate.Factory batchUpdateFactory;
+  @Inject private ReviewDb db;
+  @Inject private Provider<CurrentUser> user;
+
+  private Project.NameKey project;
+  private TestRepository<Repository> repo;
+
+  @Before
+  public void setUp() throws Exception {
+    project = new Project.NameKey("test");
+
+    Repository inMemoryRepo = repoManager.createRepository(project);
+    repo = new TestRepository<>(inMemoryRepo);
+  }
+
+  @Test
+  public void addRefUpdateFromFastForwardCommit() throws Exception {
+    final RevCommit masterCommit = repo.branch("master").commit().create();
+    final RevCommit branchCommit = repo.branch("branch").commit().parent(masterCommit).create();
+
+    try (BatchUpdate bu = batchUpdateFactory.create(db, project, user.get(), TimeUtil.nowTs())) {
+      bu.addRepoOnlyOp(
+          new RepoOnlyOp() {
+            @Override
+            public void updateRepo(RepoContext ctx) throws Exception {
+              ctx.addRefUpdate(masterCommit.getId(), branchCommit.getId(), "refs/heads/master");
+            }
+          });
+      bu.execute();
+    }
+
+    assertEquals(
+        repo.getRepository().exactRef("refs/heads/master").getObjectId(), branchCommit.getId());
+  }
+}
diff --git a/javatests/com/google/gerrit/server/update/RefUpdateUtilRepoTest.java b/javatests/com/google/gerrit/server/update/RefUpdateUtilRepoTest.java
new file mode 100644
index 0000000..fe9d522
--- /dev/null
+++ b/javatests/com/google/gerrit/server/update/RefUpdateUtilRepoTest.java
@@ -0,0 +1,117 @@
+// Copyright (C) 2017 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.google.gerrit.server.update;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.io.MoreFiles;
+import com.google.common.io.RecursiveDeleteOption;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.internal.storage.file.FileRepository;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.Repository;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class RefUpdateUtilRepoTest {
+  public enum RepoSetup {
+    LOCAL_DISK {
+      @Override
+      Repository setUpRepo() throws Exception {
+        Path p = Files.createTempDirectory("gerrit_repo_");
+        try {
+          Repository repo = new FileRepository(p.toFile());
+          repo.create(true);
+          return repo;
+        } catch (Exception e) {
+          delete(p);
+          throw e;
+        }
+      }
+
+      @Override
+      void tearDownRepo(Repository repo) throws Exception {
+        delete(repo.getDirectory().toPath());
+      }
+
+      private void delete(Path p) throws Exception {
+        MoreFiles.deleteRecursively(p, RecursiveDeleteOption.ALLOW_INSECURE);
+      }
+    },
+
+    IN_MEMORY {
+      @Override
+      Repository setUpRepo() {
+        return new InMemoryRepository(new DfsRepositoryDescription("repo"));
+      }
+
+      @Override
+      void tearDownRepo(Repository repo) {}
+    };
+
+    abstract Repository setUpRepo() throws Exception;
+
+    abstract void tearDownRepo(Repository repo) throws Exception;
+  }
+
+  @Parameters(name = "{0}")
+  public static ImmutableList<RepoSetup[]> data() {
+    return ImmutableList.copyOf(new RepoSetup[][] {{RepoSetup.LOCAL_DISK}, {RepoSetup.IN_MEMORY}});
+  }
+
+  @Parameter public RepoSetup repoSetup;
+
+  private Repository repo;
+
+  @Before
+  public void setUp() throws Exception {
+    repo = repoSetup.setUpRepo();
+  }
+
+  @After
+  public void tearDown() throws Exception {
+    if (repo != null) {
+      repoSetup.tearDownRepo(repo);
+      repo = null;
+    }
+  }
+
+  @Test
+  public void deleteRefNoOp() throws Exception {
+    String ref = "refs/heads/foo";
+    assertThat(repo.exactRef(ref)).isNull();
+    RefUpdateUtil.deleteChecked(repo, "refs/heads/foo");
+    assertThat(repo.exactRef(ref)).isNull();
+  }
+
+  @Test
+  public void deleteRef() throws Exception {
+    String ref = "refs/heads/foo";
+    new TestRepository<>(repo).branch(ref).commit().create();
+    assertThat(repo.exactRef(ref)).isNotNull();
+    RefUpdateUtil.deleteChecked(repo, "refs/heads/foo");
+    assertThat(repo.exactRef(ref)).isNull();
+  }
+}
diff --git a/javatests/com/google/gerrit/server/update/RefUpdateUtilTest.java b/javatests/com/google/gerrit/server/update/RefUpdateUtilTest.java
new file mode 100644
index 0000000..fc8696a
--- /dev/null
+++ b/javatests/com/google/gerrit/server/update/RefUpdateUtilTest.java
@@ -0,0 +1,119 @@
+// Copyright (C) 2017 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.google.gerrit.server.update;
+
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assert_;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gerrit.server.git.LockFailureException;
+import java.io.IOException;
+import java.util.function.Consumer;
+import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.lib.BatchRefUpdate;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.transport.ReceiveCommand;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class RefUpdateUtilTest {
+  private static final Consumer<ReceiveCommand> OK = c -> c.setResult(ReceiveCommand.Result.OK);
+  private static final Consumer<ReceiveCommand> LOCK_FAILURE =
+      c -> c.setResult(ReceiveCommand.Result.LOCK_FAILURE);
+  private static final Consumer<ReceiveCommand> REJECTED =
+      c -> c.setResult(ReceiveCommand.Result.REJECTED_OTHER_REASON);
+  private static final Consumer<ReceiveCommand> ABORTED =
+      c -> {
+        c.setResult(ReceiveCommand.Result.NOT_ATTEMPTED);
+        ReceiveCommand.abort(ImmutableList.of(c));
+        checkState(
+            c.getResult() != ReceiveCommand.Result.NOT_ATTEMPTED
+                && c.getResult() != ReceiveCommand.Result.LOCK_FAILURE
+                && c.getResult() != ReceiveCommand.Result.OK,
+            "unexpected state after abort: %s",
+            c);
+      };
+
+  @Test
+  public void checkBatchRefUpdateResults() throws Exception {
+    checkResults();
+    checkResults(OK);
+    checkResults(OK, OK);
+
+    assertIoException(REJECTED);
+    assertIoException(OK, REJECTED);
+    assertIoException(LOCK_FAILURE, REJECTED);
+    assertIoException(LOCK_FAILURE, OK);
+    assertIoException(LOCK_FAILURE, REJECTED, OK);
+    assertIoException(LOCK_FAILURE, LOCK_FAILURE, REJECTED);
+    assertIoException(LOCK_FAILURE, ABORTED, REJECTED);
+    assertIoException(LOCK_FAILURE, ABORTED, OK);
+
+    assertLockFailureException(LOCK_FAILURE);
+    assertLockFailureException(LOCK_FAILURE, LOCK_FAILURE);
+    assertLockFailureException(LOCK_FAILURE, LOCK_FAILURE, ABORTED);
+    assertLockFailureException(LOCK_FAILURE, LOCK_FAILURE, ABORTED, ABORTED);
+    assertLockFailureException(ABORTED);
+    assertLockFailureException(ABORTED, ABORTED);
+  }
+
+  @SafeVarargs
+  private static void checkResults(Consumer<ReceiveCommand>... resultSetters) throws Exception {
+    RefUpdateUtil.checkResults(newBatchRefUpdate(resultSetters));
+  }
+
+  @SafeVarargs
+  private static void assertIoException(Consumer<ReceiveCommand>... resultSetters) {
+    try {
+      RefUpdateUtil.checkResults(newBatchRefUpdate(resultSetters));
+      assert_().fail("expected IOException");
+    } catch (IOException e) {
+      assertThat(e).isNotInstanceOf(LockFailureException.class);
+    }
+  }
+
+  @SafeVarargs
+  private static void assertLockFailureException(Consumer<ReceiveCommand>... resultSetters)
+      throws Exception {
+    try {
+      RefUpdateUtil.checkResults(newBatchRefUpdate(resultSetters));
+      assert_().fail("expected LockFailureException");
+    } catch (LockFailureException e) {
+      // Expected.
+    }
+  }
+
+  @SafeVarargs
+  private static BatchRefUpdate newBatchRefUpdate(Consumer<ReceiveCommand>... resultSetters) {
+    try (Repository repo = new InMemoryRepository(new DfsRepositoryDescription("repo"))) {
+      BatchRefUpdate bru = repo.getRefDatabase().newBatchUpdate();
+      for (int i = 0; i < resultSetters.length; i++) {
+        ReceiveCommand cmd =
+            new ReceiveCommand(
+                ObjectId.fromString(String.format("%039x1", i)),
+                ObjectId.fromString(String.format("%039x2", i)),
+                "refs/heads/branch" + i);
+        bru.addCommand(cmd);
+        resultSetters[i].accept(cmd);
+      }
+      return bru;
+    }
+  }
+}
diff --git a/javatests/com/google/gerrit/server/update/RepoViewTest.java b/javatests/com/google/gerrit/server/update/RepoViewTest.java
new file mode 100644
index 0000000..9f7deee
--- /dev/null
+++ b/javatests/com/google/gerrit/server/update/RepoViewTest.java
@@ -0,0 +1,154 @@
+// Copyright (C) 2017 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.google.gerrit.server.update;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth8.assertThat;
+import static org.eclipse.jgit.lib.Constants.R_HEADS;
+
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.testing.InMemoryRepositoryManager;
+import org.eclipse.jgit.junit.TestRepository;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.lib.StoredConfig;
+import org.eclipse.jgit.transport.ReceiveCommand;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class RepoViewTest {
+  private static final String MASTER = "refs/heads/master";
+  private static final String BRANCH = "refs/heads/branch";
+
+  private Repository repo;
+  private TestRepository<?> tr;
+  private RepoView view;
+
+  @Before
+  public void setUp() throws Exception {
+    InMemoryRepositoryManager repoManager = new InMemoryRepositoryManager();
+    Project.NameKey project = new Project.NameKey("project");
+    repo = repoManager.createRepository(project);
+    tr = new TestRepository<>(repo);
+    tr.branch(MASTER).commit().create();
+    view = new RepoView(repoManager, project);
+  }
+
+  @After
+  public void tearDown() {
+    view.close();
+    repo.close();
+  }
+
+  @Test
+  public void getConfigIsDefensiveCopy() throws Exception {
+    StoredConfig orig = repo.getConfig();
+    orig.setString("a", "config", "option", "yes");
+    orig.save();
+
+    Config copy = view.getConfig();
+    copy.setString("a", "config", "option", "no");
+
+    assertThat(orig.getString("a", "config", "option")).isEqualTo("yes");
+    assertThat(repo.getConfig().getString("a", "config", "option")).isEqualTo("yes");
+  }
+
+  @Test
+  public void getRef() throws Exception {
+    ObjectId oldMaster = repo.exactRef(MASTER).getObjectId();
+    assertThat(repo.exactRef(MASTER).getObjectId()).isEqualTo(oldMaster);
+    assertThat(repo.exactRef(BRANCH)).isNull();
+    assertThat(view.getRef(MASTER)).hasValue(oldMaster);
+    assertThat(view.getRef(BRANCH)).isEmpty();
+
+    tr.branch(MASTER).commit().create();
+    tr.branch(BRANCH).commit().create();
+    assertThat(repo.exactRef(MASTER).getObjectId()).isNotEqualTo(oldMaster);
+    assertThat(repo.exactRef(BRANCH)).isNotNull();
+    assertThat(view.getRef(MASTER)).hasValue(oldMaster);
+    assertThat(view.getRef(BRANCH)).isEmpty();
+  }
+
+  @Test
+  public void getRefsRescansWhenNotCaching() throws Exception {
+    ObjectId oldMaster = repo.exactRef(MASTER).getObjectId();
+    assertThat(view.getRefs(R_HEADS)).containsExactly("master", oldMaster);
+
+    ObjectId newBranch = tr.branch(BRANCH).commit().create();
+    assertThat(view.getRefs(R_HEADS)).containsExactly("master", oldMaster, "branch", newBranch);
+  }
+
+  @Test
+  public void getRefsUsesCachedValueMatchingGetRef() throws Exception {
+    ObjectId master1 = repo.exactRef(MASTER).getObjectId();
+    assertThat(view.getRefs(R_HEADS)).containsExactly("master", master1);
+    assertThat(view.getRef(MASTER)).hasValue(master1);
+
+    // Doesn't reflect new value for master.
+    ObjectId master2 = tr.branch(MASTER).commit().create();
+    assertThat(repo.exactRef(MASTER).getObjectId()).isEqualTo(master2);
+    assertThat(view.getRefs(R_HEADS)).containsExactly("master", master1);
+
+    // Branch wasn't previously cached, so does reflect new value.
+    ObjectId branch1 = tr.branch(BRANCH).commit().create();
+    assertThat(view.getRefs(R_HEADS)).containsExactly("master", master1, "branch", branch1);
+
+    // Looking up branch causes it to be cached.
+    assertThat(view.getRef(BRANCH)).hasValue(branch1);
+    ObjectId branch2 = tr.branch(BRANCH).commit().create();
+    assertThat(repo.exactRef(BRANCH).getObjectId()).isEqualTo(branch2);
+    assertThat(view.getRefs(R_HEADS)).containsExactly("master", master1, "branch", branch1);
+  }
+
+  @Test
+  public void getRefsReflectsCommands() throws Exception {
+    ObjectId master1 = repo.exactRef(MASTER).getObjectId();
+    assertThat(view.getRefs(R_HEADS)).containsExactly("master", master1);
+
+    ObjectId master2 = tr.commit().create();
+    view.getCommands().add(new ReceiveCommand(master1, master2, MASTER));
+
+    assertThat(repo.exactRef(MASTER).getObjectId()).isEqualTo(master1);
+    assertThat(view.getRef(MASTER)).hasValue(master2);
+    assertThat(view.getRefs(R_HEADS)).containsExactly("master", master2);
+
+    view.getCommands().add(new ReceiveCommand(master2, ObjectId.zeroId(), MASTER));
+
+    assertThat(repo.exactRef(MASTER).getObjectId()).isEqualTo(master1);
+    assertThat(view.getRef(MASTER)).isEmpty();
+    assertThat(view.getRefs(R_HEADS)).isEmpty();
+  }
+
+  @Test
+  public void getRefsOverwritesCachedValueWithCommand() throws Exception {
+    ObjectId master1 = repo.exactRef(MASTER).getObjectId();
+    assertThat(view.getRef(MASTER)).hasValue(master1);
+
+    ObjectId master2 = tr.commit().create();
+    view.getCommands().add(new ReceiveCommand(master1, master2, MASTER));
+
+    assertThat(repo.exactRef(MASTER).getObjectId()).isEqualTo(master1);
+    assertThat(view.getRef(MASTER)).hasValue(master2);
+    assertThat(view.getRefs(R_HEADS)).containsExactly("master", master2);
+
+    view.getCommands().add(new ReceiveCommand(master2, ObjectId.zeroId(), MASTER));
+
+    assertThat(repo.exactRef(MASTER).getObjectId()).isEqualTo(master1);
+    assertThat(view.getRef(MASTER)).isEmpty();
+    assertThat(view.getRefs(R_HEADS)).isEmpty();
+  }
+}
diff --git a/javatests/com/google/gerrit/server/util/IdGeneratorTest.java b/javatests/com/google/gerrit/server/util/IdGeneratorTest.java
new file mode 100644
index 0000000..808eca8
--- /dev/null
+++ b/javatests/com/google/gerrit/server/util/IdGeneratorTest.java
@@ -0,0 +1,37 @@
+// Copyright (C) 2009 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.google.gerrit.server.util;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.HashSet;
+import org.junit.Test;
+
+public class IdGeneratorTest {
+  @Test
+  public void test1234() {
+    final HashSet<Integer> seen = new HashSet<>();
+    for (int i = 0; i < 1 << 16; i++) {
+      final int e = IdGenerator.mix(i);
+      assertTrue("no duplicates", seen.add(e));
+      assertEquals("mirror image", i, IdGenerator.unmix(e));
+    }
+    assertEquals(0x801234ab, IdGenerator.unmix(IdGenerator.mix(0x801234ab)));
+    assertEquals(0xc0ffee12, IdGenerator.unmix(IdGenerator.mix(0xc0ffee12)));
+    assertEquals(0xdeadbeef, IdGenerator.unmix(IdGenerator.mix(0xdeadbeef)));
+    assertEquals(0x0b966b11, IdGenerator.unmix(IdGenerator.mix(0x0b966b11)));
+  }
+}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/util/LabelVoteTest.java b/javatests/com/google/gerrit/server/util/LabelVoteTest.java
similarity index 100%
rename from gerrit-server/src/test/java/com/google/gerrit/server/util/LabelVoteTest.java
rename to javatests/com/google/gerrit/server/util/LabelVoteTest.java
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/util/MostSpecificComparatorTest.java b/javatests/com/google/gerrit/server/util/MostSpecificComparatorTest.java
similarity index 100%
rename from gerrit-server/src/test/java/com/google/gerrit/server/util/MostSpecificComparatorTest.java
rename to javatests/com/google/gerrit/server/util/MostSpecificComparatorTest.java
diff --git a/javatests/com/google/gerrit/server/util/SocketUtilTest.java b/javatests/com/google/gerrit/server/util/SocketUtilTest.java
new file mode 100644
index 0000000..018b8db
--- /dev/null
+++ b/javatests/com/google/gerrit/server/util/SocketUtilTest.java
@@ -0,0 +1,141 @@
+// Copyright (C) 2009 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.google.gerrit.server.util;
+
+import static com.google.gerrit.server.util.SocketUtil.hostname;
+import static com.google.gerrit.server.util.SocketUtil.isIPv6;
+import static com.google.gerrit.server.util.SocketUtil.parse;
+import static com.google.gerrit.server.util.SocketUtil.resolve;
+import static java.net.InetAddress.getByName;
+import static java.net.InetSocketAddress.createUnresolved;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import com.google.gerrit.testing.GerritBaseTests;
+import java.net.Inet4Address;
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.UnknownHostException;
+import org.junit.Test;
+
+public class SocketUtilTest extends GerritBaseTests {
+  @Test
+  public void testIsIPv6() throws UnknownHostException {
+    final InetAddress ipv6 = getByName("1:2:3:4:5:6:7:8");
+    assertTrue(ipv6 instanceof Inet6Address);
+    assertTrue(isIPv6(ipv6));
+
+    final InetAddress ipv4 = getByName("127.0.0.1");
+    assertTrue(ipv4 instanceof Inet4Address);
+    assertFalse(isIPv6(ipv4));
+  }
+
+  @Test
+  public void testHostname() {
+    assertEquals("*", hostname(new InetSocketAddress(80)));
+    assertEquals("localhost", hostname(new InetSocketAddress("localhost", 80)));
+    assertEquals("foo", hostname(createUnresolved("foo", 80)));
+  }
+
+  @Test
+  public void testFormat() throws UnknownHostException {
+    assertEquals("*:1234", SocketUtil.format(new InetSocketAddress(1234), 80));
+    assertEquals("*", SocketUtil.format(new InetSocketAddress(80), 80));
+
+    assertEquals("foo:1234", SocketUtil.format(createUnresolved("foo", 1234), 80));
+    assertEquals("foo", SocketUtil.format(createUnresolved("foo", 80), 80));
+
+    assertEquals(
+        "[1:2:3:4:5:6:7:8]:1234", //
+        SocketUtil.format(new InetSocketAddress(getByName("1:2:3:4:5:6:7:8"), 1234), 80));
+    assertEquals(
+        "[1:2:3:4:5:6:7:8]", //
+        SocketUtil.format(new InetSocketAddress(getByName("1:2:3:4:5:6:7:8"), 80), 80));
+
+    assertEquals(
+        "localhost:1234", //
+        SocketUtil.format(new InetSocketAddress("localhost", 1234), 80));
+    assertEquals(
+        "localhost", //
+        SocketUtil.format(new InetSocketAddress("localhost", 80), 80));
+  }
+
+  @Test
+  public void testParse() {
+    assertEquals(new InetSocketAddress(1234), parse("*:1234", 80));
+    assertEquals(new InetSocketAddress(80), parse("*", 80));
+    assertEquals(new InetSocketAddress(1234), parse(":1234", 80));
+    assertEquals(new InetSocketAddress(80), parse("", 80));
+
+    assertEquals(
+        createUnresolved("1:2:3:4:5:6:7:8", 1234), //
+        parse("[1:2:3:4:5:6:7:8]:1234", 80));
+    assertEquals(
+        createUnresolved("1:2:3:4:5:6:7:8", 80), //
+        parse("[1:2:3:4:5:6:7:8]", 80));
+
+    assertEquals(
+        createUnresolved("localhost", 1234), //
+        parse("[localhost]:1234", 80));
+    assertEquals(
+        createUnresolved("localhost", 80), //
+        parse("[localhost]", 80));
+
+    assertEquals(
+        createUnresolved("foo.bar.example.com", 1234), //
+        parse("[foo.bar.example.com]:1234", 80));
+    assertEquals(
+        createUnresolved("foo.bar.example.com", 80), //
+        parse("[foo.bar.example.com]", 80));
+  }
+
+  @Test
+  public void testParseInvalidIPv6() {
+    exception.expect(IllegalArgumentException.class);
+    exception.expectMessage("invalid IPv6: [:3");
+    parse("[:3", 80);
+  }
+
+  @Test
+  public void testParseInvalidPort() {
+    exception.expect(IllegalArgumentException.class);
+    exception.expectMessage("invalid port: localhost:A");
+    parse("localhost:A", 80);
+  }
+
+  @Test
+  public void testResolve() throws UnknownHostException {
+    assertEquals(new InetSocketAddress(1234), resolve("*:1234", 80));
+    assertEquals(new InetSocketAddress(80), resolve("*", 80));
+    assertEquals(new InetSocketAddress(1234), resolve(":1234", 80));
+    assertEquals(new InetSocketAddress(80), resolve("", 80));
+
+    assertEquals(
+        new InetSocketAddress(getByName("1:2:3:4:5:6:7:8"), 1234), //
+        resolve("[1:2:3:4:5:6:7:8]:1234", 80));
+    assertEquals(
+        new InetSocketAddress(getByName("1:2:3:4:5:6:7:8"), 80), //
+        resolve("[1:2:3:4:5:6:7:8]", 80));
+
+    assertEquals(
+        new InetSocketAddress(getByName("localhost"), 1234), //
+        resolve("[localhost]:1234", 80));
+    assertEquals(
+        new InetSocketAddress(getByName("localhost"), 80), //
+        resolve("[localhost]", 80));
+  }
+}
diff --git a/javatests/com/google/gerrit/server/util/git/BUILD b/javatests/com/google/gerrit/server/util/git/BUILD
new file mode 100644
index 0000000..61a776fa
--- /dev/null
+++ b/javatests/com/google/gerrit/server/util/git/BUILD
@@ -0,0 +1,31 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+junit_tests(
+    name = "git_tests",
+    size = "small",
+    srcs = glob(
+        ["**/*.java"],
+    ),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/server/util/git",
+        "//java/com/google/gerrit/truth",
+        "//java/org/eclipse/jgit:server",
+        "//lib:gson",
+        "//lib:guava",
+        "//lib:guava-retrying",
+        "//lib:gwtorm",
+        "//lib:protobuf",
+        "//lib/auto:auto-value",
+        "//lib/auto:auto-value-annotations",
+        "//lib/commons:codec",
+        "//lib/guice",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+        "//lib/jgit/org.eclipse.jgit.junit:junit",
+        "//lib/truth",
+        "//lib/truth:truth-java8-extension",
+        "//lib/truth:truth-proto-extension",
+        "//proto:cache_java_proto",
+    ],
+)
diff --git a/javatests/com/google/gerrit/server/util/git/SubmoduleSectionParserTest.java b/javatests/com/google/gerrit/server/util/git/SubmoduleSectionParserTest.java
new file mode 100644
index 0000000..0ec9b38
--- /dev/null
+++ b/javatests/com/google/gerrit/server/util/git/SubmoduleSectionParserTest.java
@@ -0,0 +1,424 @@
+// 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.
+
+package com.google.gerrit.server.util.git;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.Sets;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.SubmoduleSubscription;
+import java.util.Set;
+import org.eclipse.jgit.lib.Config;
+import org.junit.Test;
+
+public class SubmoduleSectionParserTest {
+  private static final String THIS_SERVER = "http://localhost/";
+
+  @Test
+  public void followMasterBranch() throws Exception {
+    Project.NameKey p = new Project.NameKey("proj");
+    Config cfg = new Config();
+    cfg.fromText(
+        ""
+            + "[submodule \"a\"]\n"
+            + "path = localpath-to-a\n"
+            + "url = ssh://localhost/"
+            + p.get()
+            + "\n"
+            + "branch = master\n");
+    Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master");
+
+    Set<SubmoduleSubscription> res =
+        new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections();
+
+    Set<SubmoduleSubscription> expected =
+        Sets.newHashSet(
+            new SubmoduleSubscription(
+                targetBranch, new Branch.NameKey(p, "master"), "localpath-to-a"));
+
+    assertThat(res).containsExactlyElementsIn(expected);
+  }
+
+  @Test
+  public void followMatchingBranch() throws Exception {
+    Project.NameKey p = new Project.NameKey("a");
+    Config cfg = new Config();
+    cfg.fromText(
+        ""
+            + "[submodule \"a\"]\n"
+            + "path = a\n"
+            + "url = ssh://localhost/"
+            + p.get()
+            + "\n"
+            + "branch = .\n");
+
+    Branch.NameKey targetBranch1 = new Branch.NameKey(new Project.NameKey("project"), "master");
+
+    Set<SubmoduleSubscription> res1 =
+        new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch1).parseAllSections();
+
+    Set<SubmoduleSubscription> expected1 =
+        Sets.newHashSet(
+            new SubmoduleSubscription(targetBranch1, new Branch.NameKey(p, "master"), "a"));
+
+    assertThat(res1).containsExactlyElementsIn(expected1);
+
+    Branch.NameKey targetBranch2 = new Branch.NameKey(new Project.NameKey("project"), "somebranch");
+
+    Set<SubmoduleSubscription> res2 =
+        new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch2).parseAllSections();
+
+    Set<SubmoduleSubscription> expected2 =
+        Sets.newHashSet(
+            new SubmoduleSubscription(targetBranch2, new Branch.NameKey(p, "somebranch"), "a"));
+
+    assertThat(res2).containsExactlyElementsIn(expected2);
+  }
+
+  @Test
+  public void followAnotherBranch() throws Exception {
+    Project.NameKey p = new Project.NameKey("a");
+    Config cfg = new Config();
+    cfg.fromText(
+        ""
+            + "[submodule \"a\"]\n"
+            + "path = a\n"
+            + "url = ssh://localhost/"
+            + p.get()
+            + "\n"
+            + "branch = anotherbranch\n");
+
+    Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master");
+
+    Set<SubmoduleSubscription> res =
+        new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections();
+
+    Set<SubmoduleSubscription> expected =
+        Sets.newHashSet(
+            new SubmoduleSubscription(targetBranch, new Branch.NameKey(p, "anotherbranch"), "a"));
+
+    assertThat(res).containsExactlyElementsIn(expected);
+  }
+
+  @Test
+  public void withAnotherURI() throws Exception {
+    Project.NameKey p = new Project.NameKey("a");
+    Config cfg = new Config();
+    cfg.fromText(
+        ""
+            + "[submodule \"a\"]\n"
+            + "path = a\n"
+            + "url = http://localhost:80/"
+            + p.get()
+            + "\n"
+            + "branch = master\n");
+
+    Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master");
+
+    Set<SubmoduleSubscription> res =
+        new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections();
+
+    Set<SubmoduleSubscription> expected =
+        Sets.newHashSet(
+            new SubmoduleSubscription(targetBranch, new Branch.NameKey(p, "master"), "a"));
+
+    assertThat(res).containsExactlyElementsIn(expected);
+  }
+
+  @Test
+  public void withSlashesInProjectName() throws Exception {
+    Project.NameKey p = new Project.NameKey("project/with/slashes/a");
+    Config cfg = new Config();
+    cfg.fromText(
+        ""
+            + "[submodule \"project/with/slashes/a\"]\n"
+            + "path = a\n"
+            + "url = http://localhost:80/"
+            + p.get()
+            + "\n"
+            + "branch = master\n");
+
+    Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master");
+
+    Set<SubmoduleSubscription> res =
+        new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections();
+
+    Set<SubmoduleSubscription> expected =
+        Sets.newHashSet(
+            new SubmoduleSubscription(targetBranch, new Branch.NameKey(p, "master"), "a"));
+
+    assertThat(res).containsExactlyElementsIn(expected);
+  }
+
+  @Test
+  public void withSlashesInPath() throws Exception {
+    Project.NameKey p = new Project.NameKey("a");
+    Config cfg = new Config();
+    cfg.fromText(
+        ""
+            + "[submodule \"a\"]\n"
+            + "path = a/b/c/d/e\n"
+            + "url = http://localhost:80/"
+            + p.get()
+            + "\n"
+            + "branch = master\n");
+
+    Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master");
+
+    Set<SubmoduleSubscription> res =
+        new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections();
+
+    Set<SubmoduleSubscription> expected =
+        Sets.newHashSet(
+            new SubmoduleSubscription(targetBranch, new Branch.NameKey(p, "master"), "a/b/c/d/e"));
+
+    assertThat(res).containsExactlyElementsIn(expected);
+  }
+
+  @Test
+  public void withMoreSections() throws Exception {
+    Project.NameKey p1 = new Project.NameKey("a");
+    Project.NameKey p2 = new Project.NameKey("b");
+    Config cfg = new Config();
+    cfg.fromText(
+        ""
+            + "[submodule \"a\"]\n"
+            + "     path = a\n"
+            + "     url = ssh://localhost/"
+            + p1.get()
+            + "\n"
+            + "     branch = .\n"
+            + "[submodule \"b\"]\n"
+            + "		path = b\n"
+            + "		url = http://localhost:80/"
+            + p2.get()
+            + "\n"
+            + "		branch = master\n");
+
+    Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master");
+
+    Set<SubmoduleSubscription> res =
+        new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections();
+
+    Set<SubmoduleSubscription> expected =
+        Sets.newHashSet(
+            new SubmoduleSubscription(targetBranch, new Branch.NameKey(p1, "master"), "a"),
+            new SubmoduleSubscription(targetBranch, new Branch.NameKey(p2, "master"), "b"));
+
+    assertThat(res).containsExactlyElementsIn(expected);
+  }
+
+  @Test
+  public void withSubProjectFound() throws Exception {
+    Project.NameKey p1 = new Project.NameKey("a/b");
+    Project.NameKey p2 = new Project.NameKey("b");
+    Config cfg = new Config();
+    cfg.fromText(
+        "\n"
+            + "[submodule \"a/b\"]\n"
+            + "path = a/b\n"
+            + "url = ssh://localhost/"
+            + p1.get()
+            + "\n"
+            + "branch = .\n"
+            + "[submodule \"b\"]\n"
+            + "path = b\n"
+            + "url = http://localhost/"
+            + p2.get()
+            + "\n"
+            + "branch = .\n");
+
+    Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master");
+
+    Set<SubmoduleSubscription> res =
+        new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections();
+
+    Set<SubmoduleSubscription> expected =
+        Sets.newHashSet(
+            new SubmoduleSubscription(targetBranch, new Branch.NameKey(p2, "master"), "b"),
+            new SubmoduleSubscription(targetBranch, new Branch.NameKey(p1, "master"), "a/b"));
+
+    assertThat(res).containsExactlyElementsIn(expected);
+  }
+
+  @Test
+  public void withAnInvalidSection() throws Exception {
+    Project.NameKey p1 = new Project.NameKey("a");
+    Project.NameKey p2 = new Project.NameKey("b");
+    Project.NameKey p3 = new Project.NameKey("d");
+    Project.NameKey p4 = new Project.NameKey("e");
+    Config cfg = new Config();
+    cfg.fromText(
+        "\n"
+            + "[submodule \"a\"]\n"
+            + "    path = a\n"
+            + "    url = ssh://localhost/"
+            + p1.get()
+            + "\n"
+            + "    branch = .\n"
+            + "[submodule \"b\"]\n"
+            // path missing
+            + "    url = http://localhost:80/"
+            + p2.get()
+            + "\n"
+            + "    branch = master\n"
+            + "[submodule \"c\"]\n"
+            + "    path = c\n"
+            // url missing
+            + "    branch = .\n"
+            + "[submodule \"d\"]\n"
+            + "    path = d-parent/the-d-folder\n"
+            + "    url = ssh://localhost/"
+            + p3.get()
+            + "\n"
+            // branch missing
+            + "[submodule \"e\"]\n"
+            + "    path = e\n"
+            + "    url = ssh://localhost/"
+            + p4.get()
+            + "\n"
+            + "    branch = refs/heads/master\n");
+
+    Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master");
+
+    Set<SubmoduleSubscription> res =
+        new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections();
+
+    Set<SubmoduleSubscription> expected =
+        Sets.newHashSet(
+            new SubmoduleSubscription(targetBranch, new Branch.NameKey(p1, "master"), "a"),
+            new SubmoduleSubscription(targetBranch, new Branch.NameKey(p4, "master"), "e"));
+
+    assertThat(res).containsExactlyElementsIn(expected);
+  }
+
+  @Test
+  public void withSectionOfNonexistingProject() throws Exception {
+    Config cfg = new Config();
+    cfg.fromText(
+        "\n"
+            + "[submodule \"a\"]\n"
+            + "path = a\n"
+            + "url = ssh://non-localhost/a\n"
+            // Project "a" doesn't exist
+            + "branch = .\\n");
+
+    Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master");
+
+    Set<SubmoduleSubscription> res =
+        new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections();
+
+    assertThat(res).isEmpty();
+  }
+
+  @Test
+  public void withSectionToOtherServer() throws Exception {
+    Project.NameKey p1 = new Project.NameKey("a");
+    Config cfg = new Config();
+    cfg.fromText(
+        ""
+            + "[submodule \"a\"]"
+            + "path = a"
+            + "url = ssh://non-localhost/"
+            + p1.get()
+            + "\n"
+            + "branch = .");
+
+    Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master");
+
+    Set<SubmoduleSubscription> res =
+        new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections();
+
+    assertThat(res).isEmpty();
+  }
+
+  @Test
+  public void withRelativeURI() throws Exception {
+    Project.NameKey p1 = new Project.NameKey("a");
+    Config cfg = new Config();
+    cfg.fromText(
+        ""
+            + "[submodule \"a\"]\n"
+            + "path = a\n"
+            + "url = ../"
+            + p1.get()
+            + "\n"
+            + "branch = master\n");
+
+    Branch.NameKey targetBranch = new Branch.NameKey(new Project.NameKey("project"), "master");
+
+    Set<SubmoduleSubscription> res =
+        new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections();
+
+    Set<SubmoduleSubscription> expected =
+        Sets.newHashSet(
+            new SubmoduleSubscription(targetBranch, new Branch.NameKey(p1, "master"), "a"));
+
+    assertThat(res).containsExactlyElementsIn(expected);
+  }
+
+  @Test
+  public void withDeepRelativeURI() throws Exception {
+    Project.NameKey p1 = new Project.NameKey("a");
+    Config cfg = new Config();
+    cfg.fromText(
+        ""
+            + "[submodule \"a\"]\n"
+            + "path = a\n"
+            + "url = ../../"
+            + p1.get()
+            + "\n"
+            + "branch = master\n");
+
+    Branch.NameKey targetBranch =
+        new Branch.NameKey(new Project.NameKey("nested/project"), "master");
+
+    Set<SubmoduleSubscription> res =
+        new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections();
+
+    Set<SubmoduleSubscription> expected =
+        Sets.newHashSet(
+            new SubmoduleSubscription(targetBranch, new Branch.NameKey(p1, "master"), "a"));
+
+    assertThat(res).containsExactlyElementsIn(expected);
+  }
+
+  @Test
+  public void withOverlyDeepRelativeURI() throws Exception {
+    Project.NameKey p1 = new Project.NameKey("nested/a");
+    Config cfg = new Config();
+    cfg.fromText(
+        ""
+            + "[submodule \"a\"]\n"
+            + "path = a\n"
+            + "url = ../../"
+            + p1.get()
+            + "\n"
+            + "branch = master\n");
+
+    Branch.NameKey targetBranch =
+        new Branch.NameKey(new Project.NameKey("nested/project"), "master");
+
+    Set<SubmoduleSubscription> res =
+        new SubmoduleSectionParser(cfg, THIS_SERVER, targetBranch).parseAllSections();
+
+    Set<SubmoduleSubscription> expected =
+        Sets.newHashSet(
+            new SubmoduleSubscription(targetBranch, new Branch.NameKey(p1, "master"), "a"));
+
+    assertThat(res).containsExactlyElementsIn(expected);
+  }
+}
diff --git a/javatests/com/google/gerrit/sshd/BUILD b/javatests/com/google/gerrit/sshd/BUILD
new file mode 100644
index 0000000..ad7d8a9
--- /dev/null
+++ b/javatests/com/google/gerrit/sshd/BUILD
@@ -0,0 +1,13 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+junit_tests(
+    name = "sshd_tests",
+    srcs = glob(["**/*.java"]),
+    deps = [
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/sshd",
+        "//lib/mina:sshd",
+        "//lib/truth",
+    ],
+)
diff --git a/gerrit-sshd/src/test/java/com/google/gerrit/sshd/commands/ProjectConfigParamParserTest.java b/javatests/com/google/gerrit/sshd/commands/ProjectConfigParamParserTest.java
similarity index 100%
rename from gerrit-sshd/src/test/java/com/google/gerrit/sshd/commands/ProjectConfigParamParserTest.java
rename to javatests/com/google/gerrit/sshd/commands/ProjectConfigParamParserTest.java
diff --git a/javatests/com/google/gerrit/testing/BUILD b/javatests/com/google/gerrit/testing/BUILD
new file mode 100644
index 0000000..5774707
--- /dev/null
+++ b/javatests/com/google/gerrit/testing/BUILD
@@ -0,0 +1,12 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+junit_tests(
+    name = "testing_tests",
+    size = "small",
+    srcs = glob(["*.java"]),
+    deps = [
+        "//java/com/google/gerrit/server",
+        "//java/com/google/gerrit/testing:gerrit-test-util",
+        "//lib/truth",
+    ],
+)
diff --git a/javatests/com/google/gerrit/testing/IndexVersionsTest.java b/javatests/com/google/gerrit/testing/IndexVersionsTest.java
new file mode 100644
index 0000000..36247f8
--- /dev/null
+++ b/javatests/com/google/gerrit/testing/IndexVersionsTest.java
@@ -0,0 +1,140 @@
+// Copyright (C) 2017 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.google.gerrit.testing;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.TruthJUnit.assume;
+import static com.google.gerrit.testing.IndexVersions.ALL;
+import static com.google.gerrit.testing.IndexVersions.CURRENT;
+import static com.google.gerrit.testing.IndexVersions.PREVIOUS;
+
+import com.google.gerrit.server.index.change.ChangeSchemaDefinitions;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Test;
+
+public class IndexVersionsTest extends GerritBaseTests {
+  private static final ChangeSchemaDefinitions SCHEMA_DEF = ChangeSchemaDefinitions.INSTANCE;
+
+  @Test
+  public void noValue() {
+    List<Integer> expected = new ArrayList<>();
+    if (SCHEMA_DEF.getPrevious() != null) {
+      expected.add(SCHEMA_DEF.getPrevious().getVersion());
+    }
+    expected.add(SCHEMA_DEF.getLatest().getVersion());
+
+    assertThat(get(null)).containsExactlyElementsIn(expected).inOrder();
+  }
+
+  @Test
+  public void emptyValue() {
+    List<Integer> expected = new ArrayList<>();
+    if (SCHEMA_DEF.getPrevious() != null) {
+      expected.add(SCHEMA_DEF.getPrevious().getVersion());
+    }
+    expected.add(SCHEMA_DEF.getLatest().getVersion());
+
+    assertThat(get("")).containsExactlyElementsIn(expected).inOrder();
+  }
+
+  @Test
+  public void all() {
+    assertThat(get(ALL)).containsExactlyElementsIn(SCHEMA_DEF.getSchemas().keySet()).inOrder();
+  }
+
+  @Test
+  public void current() {
+    assertThat(get(CURRENT)).containsExactly(SCHEMA_DEF.getLatest().getVersion());
+  }
+
+  @Test
+  public void previous() {
+    assume().that(SCHEMA_DEF.getPrevious()).isNotNull();
+
+    assertThat(get(PREVIOUS)).containsExactly(SCHEMA_DEF.getPrevious().getVersion());
+  }
+
+  @Test
+  public void versionNumber() {
+    assume().that(SCHEMA_DEF.getPrevious()).isNotNull();
+
+    assertThat(get(Integer.toString(SCHEMA_DEF.getPrevious().getVersion())))
+        .containsExactly(SCHEMA_DEF.getPrevious().getVersion());
+  }
+
+  @Test
+  public void invalid() {
+    assertIllegalArgument("foo", "Invalid value for test: foo");
+  }
+
+  @Test
+  public void currentAndPrevious() {
+    if (SCHEMA_DEF.getPrevious() == null) {
+      assertIllegalArgument(CURRENT + "," + PREVIOUS, "previous version does not exist");
+      return;
+    }
+
+    assertThat(get(CURRENT + "," + PREVIOUS))
+        .containsExactly(SCHEMA_DEF.getLatest().getVersion(), SCHEMA_DEF.getPrevious().getVersion())
+        .inOrder();
+    assertThat(get(PREVIOUS + "," + CURRENT))
+        .containsExactly(SCHEMA_DEF.getPrevious().getVersion(), SCHEMA_DEF.getLatest().getVersion())
+        .inOrder();
+  }
+
+  @Test
+  public void currentAndVersionNumber() {
+    assume().that(SCHEMA_DEF.getPrevious()).isNotNull();
+
+    assertThat(get(CURRENT + "," + SCHEMA_DEF.getPrevious().getVersion()))
+        .containsExactly(SCHEMA_DEF.getLatest().getVersion(), SCHEMA_DEF.getPrevious().getVersion())
+        .inOrder();
+    assertThat(get(SCHEMA_DEF.getPrevious().getVersion() + "," + CURRENT))
+        .containsExactly(SCHEMA_DEF.getPrevious().getVersion(), SCHEMA_DEF.getLatest().getVersion())
+        .inOrder();
+  }
+
+  @Test
+  public void currentAndAll() {
+    assertIllegalArgument(CURRENT + "," + ALL, "Invalid value for test: " + ALL);
+  }
+
+  @Test
+  public void currentAndInvalid() {
+    assertIllegalArgument(CURRENT + ",foo", "Invalid value for test: foo");
+  }
+
+  @Test
+  public void nonExistingVersion() {
+    int nonExistingVersion = SCHEMA_DEF.getLatest().getVersion() + 1;
+    assertIllegalArgument(
+        Integer.toString(nonExistingVersion),
+        "Index version "
+            + nonExistingVersion
+            + " that was specified by test not found. Possible versions are: "
+            + SCHEMA_DEF.getSchemas().keySet());
+  }
+
+  private static List<Integer> get(String value) {
+    return IndexVersions.get(ChangeSchemaDefinitions.INSTANCE, "test", value);
+  }
+
+  private void assertIllegalArgument(String value, String expectedMessage) {
+    exception.expect(IllegalArgumentException.class);
+    exception.expectMessage(expectedMessage);
+    get(value);
+  }
+}
diff --git a/javatests/com/google/gerrit/util/http/BUILD b/javatests/com/google/gerrit/util/http/BUILD
new file mode 100644
index 0000000..48b4339
--- /dev/null
+++ b/javatests/com/google/gerrit/util/http/BUILD
@@ -0,0 +1,14 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+junit_tests(
+    name = "http_tests",
+    srcs = glob(["**/*.java"]),
+    deps = [
+        "//java/com/google/gerrit/util/http",
+        "//javatests/com/google/gerrit/util/http/testutil",
+        "//lib:junit",
+        "//lib:servlet-api-3_1-without-neverlink",
+        "//lib/easymock",
+        "//lib/truth",
+    ],
+)
diff --git a/gerrit-util-http/src/test/java/com/google/gerrit/util/http/RequestUtilTest.java b/javatests/com/google/gerrit/util/http/RequestUtilTest.java
similarity index 100%
rename from gerrit-util-http/src/test/java/com/google/gerrit/util/http/RequestUtilTest.java
rename to javatests/com/google/gerrit/util/http/RequestUtilTest.java
diff --git a/javatests/com/google/gerrit/util/http/testutil/BUILD b/javatests/com/google/gerrit/util/http/testutil/BUILD
new file mode 100644
index 0000000..adae68e
--- /dev/null
+++ b/javatests/com/google/gerrit/util/http/testutil/BUILD
@@ -0,0 +1,13 @@
+java_library(
+    name = "testutil",
+    testonly = True,
+    srcs = glob(["**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/com/google/gerrit/extensions:api",
+        "//lib:guava",
+        "//lib:servlet-api-3_1",
+        "//lib/httpcomponents:httpclient",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+    ],
+)
diff --git a/javatests/com/google/gerrit/util/http/testutil/FakeHttpServletRequest.java b/javatests/com/google/gerrit/util/http/testutil/FakeHttpServletRequest.java
new file mode 100644
index 0000000..a4175e3
--- /dev/null
+++ b/javatests/com/google/gerrit/util/http/testutil/FakeHttpServletRequest.java
@@ -0,0 +1,463 @@
+// Copyright (C) 2015 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.google.gerrit.util.http.testutil;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.base.Splitter;
+import com.google.common.base.Strings;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.LinkedListMultimap;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Maps;
+import java.io.BufferedReader;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.security.Principal;
+import java.time.Instant;
+import java.time.format.DateTimeFormatter;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import javax.servlet.AsyncContext;
+import javax.servlet.DispatcherType;
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletInputStream;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import javax.servlet.http.HttpUpgradeHandler;
+import javax.servlet.http.Part;
+
+/** Simple fake implementation of {@link HttpServletRequest}. */
+public class FakeHttpServletRequest implements HttpServletRequest {
+  public static final String SERVLET_PATH = "/b";
+  public static final DateTimeFormatter rfcDateformatter =
+      DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss ZZZ");
+
+  private final Map<String, Object> attributes;
+  private final ListMultimap<String, String> headers;
+
+  private ListMultimap<String, String> parameters;
+  private String queryString;
+  private String hostName;
+  private int port;
+  private String contextPath;
+  private String servletPath;
+  private String path;
+
+  public FakeHttpServletRequest() {
+    this("gerrit.example.com", 80, "", SERVLET_PATH);
+  }
+
+  public FakeHttpServletRequest(String hostName, int port, String contextPath, String servletPath) {
+    this.hostName = requireNonNull(hostName, "hostName");
+    checkArgument(port > 0);
+    this.port = port;
+    this.contextPath = requireNonNull(contextPath, "contextPath");
+    this.servletPath = requireNonNull(servletPath, "servletPath");
+    attributes = Maps.newConcurrentMap();
+    parameters = LinkedListMultimap.create();
+    headers = LinkedListMultimap.create();
+  }
+
+  @Override
+  public Object getAttribute(String name) {
+    return attributes.get(name);
+  }
+
+  @Override
+  public Enumeration<String> getAttributeNames() {
+    return Collections.enumeration(attributes.keySet());
+  }
+
+  @Override
+  public String getCharacterEncoding() {
+    return UTF_8.name();
+  }
+
+  @Override
+  public int getContentLength() {
+    return -1;
+  }
+
+  @Override
+  public String getContentType() {
+    return null;
+  }
+
+  @Override
+  public ServletInputStream getInputStream() {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public String getLocalAddr() {
+    return "1.2.3.4";
+  }
+
+  @Override
+  public String getLocalName() {
+    return hostName;
+  }
+
+  @Override
+  public int getLocalPort() {
+    return port;
+  }
+
+  @Override
+  public Locale getLocale() {
+    return Locale.US;
+  }
+
+  @Override
+  public Enumeration<Locale> getLocales() {
+    return Collections.enumeration(Collections.singleton(Locale.US));
+  }
+
+  @Override
+  public String getParameter(String name) {
+    return Iterables.getFirst(parameters.get(name), null);
+  }
+
+  @Override
+  public Map<String, String[]> getParameterMap() {
+    return Collections.unmodifiableMap(
+        Maps.transformValues(parameters.asMap(), vs -> vs.toArray(new String[0])));
+  }
+
+  @Override
+  public Enumeration<String> getParameterNames() {
+    return Collections.enumeration(parameters.keySet());
+  }
+
+  @Override
+  public String[] getParameterValues(String name) {
+    return parameters.get(name).toArray(new String[0]);
+  }
+
+  public void setQueryString(String qs) {
+    this.queryString = qs;
+    ListMultimap<String, String> params = LinkedListMultimap.create();
+    for (String entry : Splitter.on('&').split(qs)) {
+      List<String> kv = Splitter.on('=').limit(2).splitToList(entry);
+      try {
+        params.put(
+            URLDecoder.decode(kv.get(0), UTF_8.name()),
+            kv.size() == 2 ? URLDecoder.decode(kv.get(1), UTF_8.name()) : "");
+      } catch (UnsupportedEncodingException e) {
+        throw new IllegalArgumentException(e);
+      }
+    }
+    parameters = params;
+  }
+
+  @Override
+  public String getProtocol() {
+    return "HTTP/1.1";
+  }
+
+  @Override
+  public BufferedReader getReader() {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  @Deprecated
+  public String getRealPath(String path) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public String getRemoteAddr() {
+    return "5.6.7.8";
+  }
+
+  @Override
+  public String getRemoteHost() {
+    return "remotehost";
+  }
+
+  @Override
+  public int getRemotePort() {
+    return 1234;
+  }
+
+  @Override
+  public RequestDispatcher getRequestDispatcher(String path) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public String getScheme() {
+    return port == 443 ? "https" : "http";
+  }
+
+  @Override
+  public String getServerName() {
+    return hostName;
+  }
+
+  @Override
+  public int getServerPort() {
+    return port;
+  }
+
+  @Override
+  public boolean isSecure() {
+    return port == 443;
+  }
+
+  @Override
+  public void removeAttribute(String name) {
+    attributes.remove(name);
+  }
+
+  @Override
+  public void setAttribute(String name, Object value) {
+    attributes.put(name, value);
+  }
+
+  @Override
+  public void setCharacterEncoding(String env) throws UnsupportedOperationException {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public String getAuthType() {
+    return null;
+  }
+
+  @Override
+  public String getContextPath() {
+    return contextPath;
+  }
+
+  @Override
+  public Cookie[] getCookies() {
+    return new Cookie[0];
+  }
+
+  @Override
+  public long getDateHeader(String name) {
+    String v = getHeader(name);
+    return v == null ? 0 : rfcDateformatter.parse(v, Instant::from).getEpochSecond();
+  }
+
+  @Override
+  public String getHeader(String name) {
+    return Iterables.getFirst(headers.get(name), null);
+  }
+
+  @Override
+  public Enumeration<String> getHeaderNames() {
+    return Collections.enumeration(headers.keySet());
+  }
+
+  @Override
+  public Enumeration<String> getHeaders(String name) {
+    return Collections.enumeration(headers.get(name));
+  }
+
+  @Override
+  public int getIntHeader(String name) {
+    return Integer.parseInt(getHeader(name));
+  }
+
+  @Override
+  public String getMethod() {
+    return "GET";
+  }
+
+  @Override
+  public String getPathInfo() {
+    return path;
+  }
+
+  public FakeHttpServletRequest setPathInfo(String path) {
+    this.path = path;
+    return this;
+  }
+
+  @Override
+  public String getPathTranslated() {
+    return path;
+  }
+
+  @Override
+  public String getQueryString() {
+    return queryString;
+  }
+
+  @Override
+  public String getRemoteUser() {
+    return null;
+  }
+
+  @Override
+  public String getRequestURI() {
+    String uri = contextPath + servletPath + path;
+    if (!Strings.isNullOrEmpty(queryString)) {
+      uri += '?' + queryString;
+    }
+    return uri;
+  }
+
+  @Override
+  public StringBuffer getRequestURL() {
+    return null;
+  }
+
+  @Override
+  public String getRequestedSessionId() {
+    return null;
+  }
+
+  @Override
+  public String getServletPath() {
+    return servletPath;
+  }
+
+  @Override
+  public HttpSession getSession() {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public HttpSession getSession(boolean create) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public Principal getUserPrincipal() {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public boolean isRequestedSessionIdFromCookie() {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public boolean isRequestedSessionIdFromURL() {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  @Deprecated
+  public boolean isRequestedSessionIdFromUrl() {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public boolean isRequestedSessionIdValid() {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public boolean isUserInRole(String role) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public AsyncContext getAsyncContext() {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public DispatcherType getDispatcherType() {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public ServletContext getServletContext() {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public boolean isAsyncStarted() {
+    return false;
+  }
+
+  @Override
+  public boolean isAsyncSupported() {
+    return false;
+  }
+
+  @Override
+  public AsyncContext startAsync() {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public AsyncContext startAsync(ServletRequest req, ServletResponse res) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public boolean authenticate(HttpServletResponse res) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public Part getPart(String name) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public Collection<Part> getParts() {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public void login(String username, String password) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public void logout() {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public long getContentLengthLong() {
+    return getContentLength();
+  }
+
+  @Override
+  public String changeSessionId() {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public <T extends HttpUpgradeHandler> T upgrade(Class<T> httpUpgradeHandlerClass) {
+    throw new UnsupportedOperationException();
+  }
+
+  public FakeHttpServletRequest addHeader(String name, String value) {
+    headers.put(name, value);
+    return this;
+  }
+}
diff --git a/javatests/com/google/gerrit/util/http/testutil/FakeHttpServletResponse.java b/javatests/com/google/gerrit/util/http/testutil/FakeHttpServletResponse.java
new file mode 100644
index 0000000..9a98ecd
--- /dev/null
+++ b/javatests/com/google/gerrit/util/http/testutil/FakeHttpServletResponse.java
@@ -0,0 +1,285 @@
+// Copyright (C) 2015 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.google.gerrit.util.http.testutil;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkState;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.Iterables;
+import com.google.common.collect.LinkedListMultimap;
+import com.google.common.collect.ListMultimap;
+import com.google.common.net.HttpHeaders;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.nio.charset.Charset;
+import java.util.Collection;
+import java.util.Locale;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.WriteListener;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletResponse;
+import org.eclipse.jgit.util.RawParseUtils;
+
+/** Simple fake implementation of {@link HttpServletResponse}. */
+public class FakeHttpServletResponse implements HttpServletResponse {
+  private final ByteArrayOutputStream actualBody = new ByteArrayOutputStream();
+  private final ListMultimap<String, String> headers = LinkedListMultimap.create();
+
+  private int status = SC_OK;
+  private boolean committed;
+  private ServletOutputStream outputStream;
+  private PrintWriter writer;
+
+  public FakeHttpServletResponse() {}
+
+  @Override
+  public synchronized void flushBuffer() throws IOException {
+    if (outputStream != null) {
+      outputStream.flush();
+    }
+    if (writer != null) {
+      writer.flush();
+    }
+  }
+
+  @Override
+  public int getBufferSize() {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public String getCharacterEncoding() {
+    return UTF_8.name();
+  }
+
+  @Override
+  public String getContentType() {
+    return null;
+  }
+
+  @Override
+  public Locale getLocale() {
+    return Locale.US;
+  }
+
+  @Override
+  public synchronized ServletOutputStream getOutputStream() {
+    checkState(writer == null, "getWriter() already called");
+    if (outputStream == null) {
+      outputStream =
+          new ServletOutputStream() {
+            @Override
+            public void write(int c) throws IOException {
+              actualBody.write(c);
+            }
+
+            @Override
+            public boolean isReady() {
+              return true;
+            }
+
+            @Override
+            public void setWriteListener(WriteListener listener) {
+              throw new UnsupportedOperationException();
+            }
+          };
+    }
+    return outputStream;
+  }
+
+  @Override
+  public synchronized PrintWriter getWriter() {
+    checkState(outputStream == null, "getOutputStream() already called");
+    if (writer == null) {
+      writer = new PrintWriter(new OutputStreamWriter(actualBody, UTF_8));
+    }
+    return writer;
+  }
+
+  @Override
+  public synchronized boolean isCommitted() {
+    return committed;
+  }
+
+  @Override
+  public void reset() {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public void resetBuffer() {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public void setBufferSize(int sz) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public void setCharacterEncoding(String name) {
+    checkArgument(UTF_8.equals(Charset.forName(name)), "unsupported charset: %s", name);
+  }
+
+  @Override
+  public void setContentLength(int length) {
+    setContentLengthLong(length);
+  }
+
+  @Override
+  public void setContentLengthLong(long length) {
+    headers.removeAll(HttpHeaders.CONTENT_LENGTH);
+    addHeader(HttpHeaders.CONTENT_LENGTH, Long.toString(length));
+  }
+
+  @Override
+  public void setContentType(String type) {
+    headers.removeAll(HttpHeaders.CONTENT_TYPE);
+    addHeader(HttpHeaders.CONTENT_TYPE, type);
+  }
+
+  @Override
+  public void setLocale(Locale locale) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public void addCookie(Cookie cookie) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public void addDateHeader(String name, long value) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public void addHeader(String name, String value) {
+    headers.put(name.toLowerCase(), value);
+  }
+
+  @Override
+  public void addIntHeader(String name, int value) {
+    addHeader(name, Integer.toString(value));
+  }
+
+  @Override
+  public boolean containsHeader(String name) {
+    return headers.containsKey(name.toLowerCase());
+  }
+
+  @Override
+  public String encodeRedirectURL(String url) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  @Deprecated
+  public String encodeRedirectUrl(String url) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public String encodeURL(String url) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  @Deprecated
+  public String encodeUrl(String url) {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public synchronized void sendError(int sc) {
+    status = sc;
+    committed = true;
+  }
+
+  @Override
+  public synchronized void sendError(int sc, String msg) {
+    status = sc;
+    committed = true;
+  }
+
+  @Override
+  public synchronized void sendRedirect(String loc) {
+    status = SC_FOUND;
+    setHeader(HttpHeaders.LOCATION, loc);
+    committed = true;
+  }
+
+  @Override
+  public void setDateHeader(String name, long value) {
+    setHeader(name, Long.toString(value));
+  }
+
+  @Override
+  public void setHeader(String name, String value) {
+    headers.removeAll(name.toLowerCase());
+    addHeader(name, value);
+  }
+
+  @Override
+  public void setIntHeader(String name, int value) {
+    headers.removeAll(name.toLowerCase());
+    addIntHeader(name, value);
+  }
+
+  @Override
+  public synchronized void setStatus(int sc) {
+    status = sc;
+    committed = true;
+  }
+
+  @Override
+  @Deprecated
+  public synchronized void setStatus(int sc, String msg) {
+    status = sc;
+    committed = true;
+  }
+
+  @Override
+  public synchronized int getStatus() {
+    return status;
+  }
+
+  @Override
+  public String getHeader(String name) {
+    return Iterables.getFirst(headers.get(requireNonNull(name.toLowerCase())), null);
+  }
+
+  @Override
+  public Collection<String> getHeaderNames() {
+    return headers.keySet();
+  }
+
+  @Override
+  public Collection<String> getHeaders(String name) {
+    return headers.get(requireNonNull(name.toLowerCase()));
+  }
+
+  public byte[] getActualBody() {
+    return actualBody.toByteArray();
+  }
+
+  public String getActualBodyString() {
+    return RawParseUtils.decode(getActualBody());
+  }
+}
diff --git a/javatests/com/google/gwtexpui/safehtml/BUILD b/javatests/com/google/gwtexpui/safehtml/BUILD
new file mode 100644
index 0000000..694f422
--- /dev/null
+++ b/javatests/com/google/gwtexpui/safehtml/BUILD
@@ -0,0 +1,13 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+junit_tests(
+    name = "safehtml_tests",
+    srcs = glob(["client/**/*.java"]),
+    deps = [
+        "//java/com/google/gwtexpui/safehtml",
+        "//lib:guava",
+        "//lib/gwt:dev",
+        "//lib/gwt:user",
+        "//lib/truth",
+    ],
+)
diff --git a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/LinkFindReplaceTest.java b/javatests/com/google/gwtexpui/safehtml/client/LinkFindReplaceTest.java
similarity index 100%
rename from gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/LinkFindReplaceTest.java
rename to javatests/com/google/gwtexpui/safehtml/client/LinkFindReplaceTest.java
diff --git a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/RawFindReplaceTest.java b/javatests/com/google/gwtexpui/safehtml/client/RawFindReplaceTest.java
similarity index 100%
rename from gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/RawFindReplaceTest.java
rename to javatests/com/google/gwtexpui/safehtml/client/RawFindReplaceTest.java
diff --git a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtmlBuilderTest.java b/javatests/com/google/gwtexpui/safehtml/client/SafeHtmlBuilderTest.java
similarity index 100%
rename from gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtmlBuilderTest.java
rename to javatests/com/google/gwtexpui/safehtml/client/SafeHtmlBuilderTest.java
diff --git a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_LinkifyTest.java b/javatests/com/google/gwtexpui/safehtml/client/SafeHtml_LinkifyTest.java
similarity index 100%
rename from gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_LinkifyTest.java
rename to javatests/com/google/gwtexpui/safehtml/client/SafeHtml_LinkifyTest.java
diff --git a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_ReplaceTest.java b/javatests/com/google/gwtexpui/safehtml/client/SafeHtml_ReplaceTest.java
similarity index 100%
rename from gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_ReplaceTest.java
rename to javatests/com/google/gwtexpui/safehtml/client/SafeHtml_ReplaceTest.java
diff --git a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyListTest.java b/javatests/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyListTest.java
similarity index 100%
rename from gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyListTest.java
rename to javatests/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyListTest.java
diff --git a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyPreformatTest.java b/javatests/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyPreformatTest.java
similarity index 100%
rename from gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyPreformatTest.java
rename to javatests/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyPreformatTest.java
diff --git a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyQuoteTest.java b/javatests/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyQuoteTest.java
similarity index 100%
rename from gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyQuoteTest.java
rename to javatests/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyQuoteTest.java
diff --git a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyTest.java b/javatests/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyTest.java
similarity index 100%
rename from gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyTest.java
rename to javatests/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyTest.java
diff --git a/javatests/org/eclipse/jgit/BUILD b/javatests/org/eclipse/jgit/BUILD
new file mode 100644
index 0000000..213c8c5
--- /dev/null
+++ b/javatests/org/eclipse/jgit/BUILD
@@ -0,0 +1,11 @@
+java_test(
+    name = "jgit_patch_tests",
+    srcs = glob(["**/*.java"]),
+    test_class = "org.eclipse.jgit.diff.EditDeserializerTest",
+    visibility = ["//visibility:public"],
+    deps = [
+        "//java/org/eclipse/jgit:server",
+        "//lib:junit",
+        "//lib/jgit/org.eclipse.jgit:jgit",
+    ],
+)
diff --git a/gerrit-patch-jgit/src/test/java/org/eclipse/jgit/diff/EditDeserializerTest.java b/javatests/org/eclipse/jgit/diff/EditDeserializerTest.java
similarity index 100%
rename from gerrit-patch-jgit/src/test/java/org/eclipse/jgit/diff/EditDeserializerTest.java
rename to javatests/org/eclipse/jgit/diff/EditDeserializerTest.java
diff --git a/lib/BUILD b/lib/BUILD
index 7fe6e10..95ca4db 100644
--- a/lib/BUILD
+++ b/lib/BUILD
@@ -72,7 +72,11 @@
     name = "gwtorm",
     visibility = ["//visibility:public"],
     exports = [":gwtorm-client"],
-    runtime_deps = [":protobuf"],
+    runtime_deps = [
+        ":protobuf",
+        "//lib/antlr:java-runtime",
+        "//lib/ow2:ow2-asm",
+    ],
 )
 
 java_library(
@@ -93,18 +97,6 @@
 )
 
 java_library(
-    name = "velocity",
-    data = ["//lib:LICENSE-Apache2.0"],
-    visibility = ["//visibility:public"],
-    exports = ["@velocity//jar"],
-    runtime_deps = [
-        "//lib/commons:collections",
-        "//lib/commons:lang",
-        "//lib/commons:oro",
-    ],
-)
-
-java_library(
     name = "jsch",
     data = ["//lib:LICENSE-jsch"],
     visibility = ["//visibility:public"],
@@ -122,7 +114,7 @@
     name = "args4j",
     data = ["//lib:LICENSE-args4j"],
     visibility = ["//visibility:public"],
-    exports = ["@args4j//jar"],
+    exports = ["@args4j-intern//jar"],
 )
 
 java_library(
@@ -133,32 +125,257 @@
 )
 
 java_library(
-    name = "pegdown",
-    data = ["//lib:LICENSE-Apache2.0"],
+    name = "flexmark",
+    data = ["//lib:LICENSE-flexmark"],
     visibility = ["//visibility:public"],
-    exports = ["@pegdown//jar"],
-    runtime_deps = [":grappa"],
-)
-
-java_library(
-    name = "grappa",
-    data = ["//lib:LICENSE-Apache2.0"],
-    visibility = ["//visibility:public"],
-    exports = ["@grappa//jar"],
+    exports = ["@flexmark//jar"],
     runtime_deps = [
-        ":jitescript",
-        "//lib/ow2:ow2-asm",
-        "//lib/ow2:ow2-asm-analysis",
-        "//lib/ow2:ow2-asm-tree",
-        "//lib/ow2:ow2-asm-util",
+        ":flexmark-ext-abbreviation",
     ],
 )
 
 java_library(
-    name = "jitescript",
-    data = ["//lib:LICENSE-Apache2.0"],
+    name = "flexmark-ext-abbreviation",
+    data = ["//lib:LICENSE-flexmark"],
     visibility = ["//visibility:public"],
-    exports = ["@jitescript//jar"],
+    exports = ["@flexmark-ext-abbreviation//jar"],
+    runtime_deps = [
+        ":flexmark-ext-anchorlink",
+    ],
+)
+
+java_library(
+    name = "flexmark-ext-anchorlink",
+    data = ["//lib:LICENSE-flexmark"],
+    visibility = ["//visibility:public"],
+    exports = ["@flexmark-ext-anchorlink//jar"],
+    runtime_deps = [
+        ":flexmark-ext-autolink",
+    ],
+)
+
+java_library(
+    name = "flexmark-ext-autolink",
+    data = ["//lib:LICENSE-flexmark"],
+    visibility = ["//visibility:public"],
+    exports = ["@flexmark-ext-autolink//jar"],
+    runtime_deps = [
+        ":flexmark-ext-definition",
+    ],
+)
+
+java_library(
+    name = "flexmark-ext-definition",
+    data = ["//lib:LICENSE-flexmark"],
+    visibility = ["//visibility:public"],
+    exports = ["@flexmark-ext-definition//jar"],
+    runtime_deps = [
+        ":flexmark-ext-emoji",
+    ],
+)
+
+java_library(
+    name = "flexmark-ext-emoji",
+    data = ["//lib:LICENSE-flexmark"],
+    visibility = ["//visibility:public"],
+    exports = ["@flexmark-ext-emoji//jar"],
+    runtime_deps = [
+        ":flexmark-ext-escaped-character",
+    ],
+)
+
+java_library(
+    name = "flexmark-ext-escaped-character",
+    data = ["//lib:LICENSE-flexmark"],
+    visibility = ["//visibility:public"],
+    exports = ["@flexmark-ext-escaped-character//jar"],
+    runtime_deps = [
+        ":flexmark-ext-footnotes",
+    ],
+)
+
+java_library(
+    name = "flexmark-ext-footnotes",
+    data = ["//lib:LICENSE-flexmark"],
+    visibility = ["//visibility:public"],
+    exports = ["@flexmark-ext-footnotes//jar"],
+    runtime_deps = [
+        ":flexmark-ext-gfm-issues",
+    ],
+)
+
+java_library(
+    name = "flexmark-ext-gfm-issues",
+    data = ["//lib:LICENSE-flexmark"],
+    visibility = ["//visibility:public"],
+    exports = ["@flexmark-ext-gfm-issues//jar"],
+    runtime_deps = [
+        ":flexmark-ext-gfm-strikethrough",
+    ],
+)
+
+java_library(
+    name = "flexmark-ext-gfm-strikethrough",
+    data = ["//lib:LICENSE-flexmark"],
+    visibility = ["//visibility:public"],
+    exports = ["@flexmark-ext-gfm-strikethrough//jar"],
+    runtime_deps = [
+        ":flexmark-ext-gfm-tables",
+    ],
+)
+
+java_library(
+    name = "flexmark-ext-gfm-tables",
+    data = ["//lib:LICENSE-flexmark"],
+    visibility = ["//visibility:public"],
+    exports = ["@flexmark-ext-gfm-tables//jar"],
+    runtime_deps = [
+        ":flexmark-ext-gfm-tasklist",
+    ],
+)
+
+java_library(
+    name = "flexmark-ext-gfm-tasklist",
+    data = ["//lib:LICENSE-flexmark"],
+    visibility = ["//visibility:public"],
+    exports = ["@flexmark-ext-gfm-tasklist//jar"],
+    runtime_deps = [
+        ":flexmark-ext-gfm-users",
+    ],
+)
+
+java_library(
+    name = "flexmark-ext-gfm-users",
+    data = ["//lib:LICENSE-flexmark"],
+    visibility = ["//visibility:public"],
+    exports = ["@flexmark-ext-gfm-users//jar"],
+    runtime_deps = [
+        ":flexmark-ext-ins",
+    ],
+)
+
+java_library(
+    name = "flexmark-ext-ins",
+    data = ["//lib:LICENSE-flexmark"],
+    visibility = ["//visibility:public"],
+    exports = ["@flexmark-ext-ins//jar"],
+    runtime_deps = [
+        ":flexmark-ext-jekyll-front-matter",
+    ],
+)
+
+java_library(
+    name = "flexmark-ext-jekyll-front-matter",
+    data = ["//lib:LICENSE-flexmark"],
+    visibility = ["//visibility:public"],
+    exports = ["@flexmark-ext-jekyll-front-matter//jar"],
+    runtime_deps = [
+        ":flexmark-ext-superscript",
+    ],
+)
+
+java_library(
+    name = "flexmark-ext-superscript",
+    data = ["//lib:LICENSE-flexmark"],
+    visibility = ["//visibility:public"],
+    exports = ["@flexmark-ext-superscript//jar"],
+    runtime_deps = [
+        ":flexmark-ext-tables",
+    ],
+)
+
+java_library(
+    name = "flexmark-ext-tables",
+    data = ["//lib:LICENSE-flexmark"],
+    visibility = ["//visibility:public"],
+    exports = ["@flexmark-ext-tables//jar"],
+    runtime_deps = [
+        ":flexmark-ext-toc",
+    ],
+)
+
+java_library(
+    name = "flexmark-ext-toc",
+    data = ["//lib:LICENSE-flexmark"],
+    visibility = ["//visibility:public"],
+    exports = ["@flexmark-ext-toc//jar"],
+    runtime_deps = [
+        ":flexmark-ext-typographic",
+    ],
+)
+
+java_library(
+    name = "flexmark-ext-typographic",
+    data = ["//lib:LICENSE-flexmark"],
+    visibility = ["//visibility:public"],
+    exports = ["@flexmark-ext-typographic//jar"],
+    runtime_deps = [
+        ":flexmark-ext-wikilink",
+    ],
+)
+
+java_library(
+    name = "flexmark-ext-wikilink",
+    data = ["//lib:LICENSE-flexmark"],
+    visibility = ["//visibility:public"],
+    exports = ["@flexmark-ext-wikilink//jar"],
+    runtime_deps = [
+        ":flexmark-ext-yaml-front-matter",
+    ],
+)
+
+java_library(
+    name = "flexmark-ext-yaml-front-matter",
+    data = ["//lib:LICENSE-flexmark"],
+    visibility = ["//visibility:public"],
+    exports = ["@flexmark-ext-yaml-front-matter//jar"],
+    runtime_deps = [
+        ":flexmark-formatter",
+    ],
+)
+
+java_library(
+    name = "flexmark-formatter",
+    data = ["//lib:LICENSE-flexmark"],
+    visibility = ["//visibility:public"],
+    exports = ["@flexmark-formatter//jar"],
+    runtime_deps = [
+        ":flexmark-html-parser",
+    ],
+)
+
+java_library(
+    name = "flexmark-html-parser",
+    data = ["//lib:LICENSE-flexmark"],
+    visibility = ["//visibility:public"],
+    exports = ["@flexmark-html-parser//jar"],
+    runtime_deps = [
+        ":flexmark-profile-pegdown",
+    ],
+)
+
+java_library(
+    name = "flexmark-profile-pegdown",
+    data = ["//lib:LICENSE-flexmark"],
+    visibility = ["//visibility:public"],
+    exports = ["@flexmark-profile-pegdown//jar"],
+    runtime_deps = [
+        ":flexmark-util",
+    ],
+)
+
+java_library(
+    name = "flexmark-util",
+    data = ["//lib:LICENSE-flexmark"],
+    visibility = ["//visibility:public"],
+    exports = ["@flexmark-util//jar"],
+)
+
+java_library(
+    name = "autolink",
+    data = ["//lib:LICENSE-autolink"],
+    visibility = ["//visibility:public"],
+    exports = ["@autolink//jar"],
 )
 
 java_library(
@@ -231,28 +448,6 @@
 )
 
 java_library(
-    name = "truth",
-    data = ["//lib:LICENSE-DO_NOT_DISTRIBUTE"],
-    visibility = ["//visibility:public"],
-    exports = [
-        ":guava",
-        ":junit",
-        "@truth//jar",
-    ],
-)
-
-java_library(
-    name = "truth-java8-extension",
-    data = ["//lib:LICENSE-DO_NOT_DISTRIBUTE"],
-    visibility = ["//visibility:public"],
-    exports = [
-        ":guava",
-        ":truth",
-        "@truth-java8-extension//jar",
-    ],
-)
-
-java_library(
     name = "javassist",
     data = ["//lib:LICENSE-DO_NOT_DISTRIBUTE"],
     visibility = ["//visibility:public"],
@@ -281,7 +476,7 @@
         ":protobuf",
         "//lib/guice",
         "//lib/guice:guice-assistedinject",
-        "//lib/guice:javax-inject",
+        "//lib/guice:javax_inject",
         "//lib/ow2:ow2-asm",
         "//lib/ow2:ow2-asm-analysis",
         "//lib/ow2:ow2-asm-commons",
diff --git a/lib/LICENSE-Apache1.1 b/lib/LICENSE-Apache1.1
deleted file mode 100644
index 8eda4fc..0000000
--- a/lib/LICENSE-Apache1.1
+++ /dev/null
@@ -1,51 +0,0 @@
-The Apache Software License, Version 1.1
-
-Copyright (c) 2000-2002 The Apache Software Foundation.  All rights
-reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-
-1. Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in
-   the documentation and/or other materials provided with the
-   distribution.
-
-3. The end-user documentation included with the redistribution,
-   if any, must include the following acknowledgment:
-      "This product includes software developed by the
-       Apache Software Foundation (http://www.apache.org/)."
-   Alternately, this acknowledgment may appear in the software itself,
-   if and wherever such third-party acknowledgments normally appear.
-
-4. The names "Apache" and "Apache Software Foundation", "Jakarta-Oro"
-   must not be used to endorse or promote products derived from this
-   software without prior written permission. For written
-   permission, please contact apache@apache.org.
-
-5. Products derived from this software may not be called "Apache"
-   or "Jakarta-Oro", nor may "Apache" or "Jakarta-Oro" appear in their
-   name, without prior written permission of the Apache Software Foundation.
-
-THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
-ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
-OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGE.
-====================================================================
-
-This software consists of voluntary contributions made by many
-individuals on behalf of the Apache Software Foundation.  For more
-information on the Apache Software Foundation, please see
-<http://www.apache.org/>.
diff --git a/lib/LICENSE-autolink b/lib/LICENSE-autolink
new file mode 100644
index 0000000..565820a
--- /dev/null
+++ b/lib/LICENSE-autolink
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Robin Stocker
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/lib/LICENSE-ba-linkify b/lib/LICENSE-ba-linkify
new file mode 100644
index 0000000..93672f9
--- /dev/null
+++ b/lib/LICENSE-ba-linkify
@@ -0,0 +1,22 @@
+Copyright (c) 2009 "Cowboy" Ben Alman
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/lib/LICENSE-flexmark b/lib/LICENSE-flexmark
new file mode 100644
index 0000000..c5e6ce0
--- /dev/null
+++ b/lib/LICENSE-flexmark
@@ -0,0 +1,26 @@
+Copyright (c) 2015-2016, Atlassian Pty Ltd
+All rights reserved.
+
+Copyright (c) 2016, Vladimir Schneider,
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+  list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/lib/LICENSE-resemblejs b/lib/LICENSE-resemblejs
new file mode 100644
index 0000000..b265c8a
--- /dev/null
+++ b/lib/LICENSE-resemblejs
@@ -0,0 +1,18 @@
+The MIT License (MIT) Copyright © 2013 Huddle
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the “Software”), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/lib/antlr/BUILD b/lib/antlr/BUILD
index 99eb9e6..c35c2b5 100644
--- a/lib/antlr/BUILD
+++ b/lib/antlr/BUILD
@@ -1,4 +1,4 @@
-package(default_visibility = ["//gerrit-index:__pkg__"])
+package(default_visibility = ["//java/com/google/gerrit/index:__pkg__"])
 
 [java_library(
     name = n,
@@ -22,7 +22,7 @@
     name = "antlr-tool",
     jvm_flags = ["-XX:-UsePerfData"],
     main_class = "org.antlr.Tool",
-    visibility = ["//gerrit-index:__pkg__"],
+    visibility = ["//antlr3:__pkg__"],
     runtime_deps = [":tool"],
 )
 
diff --git a/lib/asciidoctor/BUILD b/lib/asciidoctor/BUILD
index c7567d9..62b1114 100644
--- a/lib/asciidoctor/BUILD
+++ b/lib/asciidoctor/BUILD
@@ -1,48 +1,7 @@
-java_binary(
-    name = "asciidoc",
-    main_class = "AsciiDoctor",
-    visibility = ["//visibility:public"],
-    runtime_deps = [":asciidoc_lib"],
-)
-
-java_library(
-    name = "asciidoc_lib",
-    srcs = ["java/AsciiDoctor.java"],
-    visibility = ["//visibility:public"],
-    deps = [
-        ":asciidoctor",
-        "//lib:args4j",
-        "//lib:guava",
-        "//lib/log:api",
-        "//lib/log:nop",
-    ],
-)
-
-java_binary(
-    name = "doc_indexer",
-    main_class = "DocIndexer",
-    visibility = ["//visibility:public"],
-    runtime_deps = [":doc_indexer_lib"],
-)
-
-java_library(
-    name = "doc_indexer_lib",
-    srcs = ["java/DocIndexer.java"],
-    visibility = ["//visibility:public"],
-    deps = [
-        ":asciidoc_lib",
-        "//gerrit-server:constants",
-        "//lib:args4j",
-        "//lib:guava",
-        "//lib/lucene:lucene-analyzers-common",
-        "//lib/lucene:lucene-core-and-backward-codecs",
-    ],
-)
-
 java_library(
     name = "asciidoctor",
     data = ["//lib:LICENSE-asciidoctor"],
-    visibility = ["//visibility:public"],
+    visibility = ["//java/com/google/gerrit/asciidoctor:__pkg__"],
     exports = ["@asciidoctor//jar"],
     runtime_deps = [":jruby"],
 )
diff --git a/lib/asciidoctor/java/AsciiDoctor.java b/lib/asciidoctor/java/AsciiDoctor.java
deleted file mode 100644
index 3f30643..0000000
--- a/lib/asciidoctor/java/AsciiDoctor.java
+++ /dev/null
@@ -1,215 +0,0 @@
-// Copyright (C) 2013 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.
-
-import com.google.common.io.ByteStreams;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipOutputStream;
-import org.asciidoctor.Asciidoctor;
-import org.asciidoctor.AttributesBuilder;
-import org.asciidoctor.Options;
-import org.asciidoctor.OptionsBuilder;
-import org.asciidoctor.SafeMode;
-import org.asciidoctor.internal.JRubyAsciidoctor;
-import org.kohsuke.args4j.Argument;
-import org.kohsuke.args4j.CmdLineException;
-import org.kohsuke.args4j.CmdLineParser;
-import org.kohsuke.args4j.Option;
-
-public class AsciiDoctor {
-
-  private static final String DOCTYPE = "article";
-  private static final String ERUBY = "erb";
-  private static final String REVNUMBER_NAME = "revnumber";
-
-  @Option(name = "-b", usage = "set output format backend")
-  private String backend = "html5";
-
-  @Option(name = "-z", usage = "output zip file")
-  private String zipFile;
-
-  @Option(name = "--in-ext", usage = "extension for input files")
-  private String inExt = ".txt";
-
-  @Option(name = "--out-ext", usage = "extension for output files")
-  private String outExt = ".html";
-
-  @Option(name = "--base-dir", usage = "base directory")
-  private File basedir;
-
-  @Option(name = "--tmp", usage = "temporary output path")
-  private File tmpdir;
-
-  @Option(name = "--mktmp", usage = "create a temporary output path")
-  private boolean mktmp;
-
-  @Option(name = "-a", usage = "a list of attributes, in the form key or key=value pair")
-  private List<String> attributes = new ArrayList<>();
-
-  @Option(
-      name = "--bazel",
-      usage = "bazel mode: generate multiple output files instead of a single zip file")
-  private boolean bazel;
-
-  @Option(name = "--revnumber-file", usage = "the file contains revnumber string")
-  private File revnumberFile;
-
-  @Argument(usage = "input files")
-  private List<String> inputFiles = new ArrayList<>();
-
-  private String revnumber;
-
-  public static String mapInFileToOutFile(String inFile, String inExt, String outExt) {
-    String basename = new File(inFile).getName();
-    if (basename.endsWith(inExt)) {
-      basename = basename.substring(0, basename.length() - inExt.length());
-    } else {
-      // Strip out the last extension
-      int pos = basename.lastIndexOf('.');
-      if (pos > 0) {
-        basename = basename.substring(0, pos);
-      }
-    }
-    return basename + outExt;
-  }
-
-  private Options createOptions(File base, File outputFile) {
-    OptionsBuilder optionsBuilder = OptionsBuilder.options();
-
-    optionsBuilder
-        .backend(backend)
-        .docType(DOCTYPE)
-        .eruby(ERUBY)
-        .safe(SafeMode.UNSAFE)
-        .baseDir(base)
-        .toFile(outputFile);
-
-    AttributesBuilder attributesBuilder = AttributesBuilder.attributes();
-    attributesBuilder.attributes(getAttributes());
-    if (revnumber != null) {
-      attributesBuilder.attribute(REVNUMBER_NAME, revnumber);
-    }
-    optionsBuilder.attributes(attributesBuilder.get());
-
-    return optionsBuilder.get();
-  }
-
-  private Map<String, Object> getAttributes() {
-    Map<String, Object> attributeValues = new HashMap<>();
-
-    for (String attribute : attributes) {
-      int equalsIndex = attribute.indexOf('=');
-      if (equalsIndex > -1) {
-        String name = attribute.substring(0, equalsIndex);
-        String value = attribute.substring(equalsIndex + 1, attribute.length());
-
-        attributeValues.put(name, value);
-      } else {
-        attributeValues.put(attribute, "");
-      }
-    }
-
-    return attributeValues;
-  }
-
-  private void invoke(String... parameters) throws IOException {
-    CmdLineParser parser = new CmdLineParser(this);
-    try {
-      parser.parseArgument(parameters);
-      if (inputFiles.isEmpty()) {
-        throw new CmdLineException(parser, "asciidoctor: FAILED: input file missing");
-      }
-    } catch (CmdLineException e) {
-      System.err.println(e.getMessage());
-      parser.printUsage(System.err);
-      System.exit(1);
-      return;
-    }
-
-    if (revnumberFile != null) {
-      try (BufferedReader reader = new BufferedReader(new FileReader(revnumberFile))) {
-        revnumber = reader.readLine();
-      }
-    }
-
-    if (mktmp) {
-      tmpdir = Files.createTempDirectory("asciidoctor-").toFile();
-    }
-
-    if (bazel) {
-      renderFiles(inputFiles, null);
-    } else {
-      try (ZipOutputStream zip = new ZipOutputStream(Files.newOutputStream(Paths.get(zipFile)))) {
-        renderFiles(inputFiles, zip);
-
-        File[] cssFiles =
-            tmpdir.listFiles(
-                new FilenameFilter() {
-                  @Override
-                  public boolean accept(File dir, String name) {
-                    return name.endsWith(".css");
-                  }
-                });
-        for (File css : cssFiles) {
-          zipFile(css, css.getName(), zip);
-        }
-      }
-    }
-  }
-
-  private void renderFiles(List<String> inputFiles, ZipOutputStream zip) throws IOException {
-    Asciidoctor asciidoctor = JRubyAsciidoctor.create();
-    for (String inputFile : inputFiles) {
-      String outName = mapInFileToOutFile(inputFile, inExt, outExt);
-      File out = bazel ? new File(outName) : new File(tmpdir, outName);
-      if (!bazel) {
-        out.getParentFile().mkdirs();
-      }
-      File input = new File(inputFile);
-      Options options = createOptions(basedir != null ? basedir : input.getParentFile(), out);
-      asciidoctor.renderFile(input, options);
-      if (zip != null) {
-        zipFile(out, outName, zip);
-      }
-    }
-  }
-
-  public static void zipFile(File file, String name, ZipOutputStream zip) throws IOException {
-    zip.putNextEntry(new ZipEntry(name));
-    try (InputStream input = Files.newInputStream(file.toPath())) {
-      ByteStreams.copy(input, zip);
-    }
-    zip.closeEntry();
-  }
-
-  public static void main(String[] args) {
-    try {
-      new AsciiDoctor().invoke(args);
-    } catch (IOException e) {
-      System.err.println(e.getMessage());
-      System.exit(1);
-    }
-  }
-}
diff --git a/lib/asciidoctor/java/DocIndexer.java b/lib/asciidoctor/java/DocIndexer.java
deleted file mode 100644
index fbb7f94..0000000
--- a/lib/asciidoctor/java/DocIndexer.java
+++ /dev/null
@@ -1,163 +0,0 @@
-// Copyright (C) 2013 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.
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-
-import com.google.gerrit.server.documentation.Constants;
-import java.io.BufferedReader;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.UnsupportedEncodingException;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.jar.JarEntry;
-import java.util.jar.JarOutputStream;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipOutputStream;
-import org.apache.lucene.analysis.standard.StandardAnalyzer;
-import org.apache.lucene.analysis.util.CharArraySet;
-import org.apache.lucene.document.Document;
-import org.apache.lucene.document.Field;
-import org.apache.lucene.document.StringField;
-import org.apache.lucene.document.TextField;
-import org.apache.lucene.index.IndexWriter;
-import org.apache.lucene.index.IndexWriterConfig;
-import org.apache.lucene.index.IndexWriterConfig.OpenMode;
-import org.apache.lucene.store.IndexInput;
-import org.apache.lucene.store.RAMDirectory;
-import org.kohsuke.args4j.Argument;
-import org.kohsuke.args4j.CmdLineException;
-import org.kohsuke.args4j.CmdLineParser;
-import org.kohsuke.args4j.Option;
-
-public class DocIndexer {
-  private static final Pattern SECTION_HEADER = Pattern.compile("^=+ (.*)");
-
-  @Option(name = "-o", usage = "output JAR file")
-  private String outFile;
-
-  @Option(name = "--prefix", usage = "prefix for the html filepath")
-  private String prefix = "";
-
-  @Option(name = "--in-ext", usage = "extension for input files")
-  private String inExt = ".txt";
-
-  @Option(name = "--out-ext", usage = "extension for output files")
-  private String outExt = ".html";
-
-  @Argument(usage = "input files")
-  private List<String> inputFiles = new ArrayList<>();
-
-  private void invoke(String... parameters) throws IOException {
-    CmdLineParser parser = new CmdLineParser(this);
-    try {
-      parser.parseArgument(parameters);
-      if (inputFiles.isEmpty()) {
-        throw new CmdLineException(parser, "FAILED: input file missing");
-      }
-    } catch (CmdLineException e) {
-      System.err.println(e.getMessage());
-      parser.printUsage(System.err);
-      System.exit(1);
-      return;
-    }
-
-    try (JarOutputStream jar = new JarOutputStream(Files.newOutputStream(Paths.get(outFile)))) {
-      byte[] compressedIndex = zip(index());
-      JarEntry entry = new JarEntry(String.format("%s/%s", Constants.PACKAGE, Constants.INDEX_ZIP));
-      entry.setSize(compressedIndex.length);
-      jar.putNextEntry(entry);
-      jar.write(compressedIndex);
-      jar.closeEntry();
-    }
-  }
-
-  private RAMDirectory index()
-      throws IOException, UnsupportedEncodingException, FileNotFoundException {
-    RAMDirectory directory = new RAMDirectory();
-    IndexWriterConfig config = new IndexWriterConfig(new StandardAnalyzer(CharArraySet.EMPTY_SET));
-    config.setOpenMode(OpenMode.CREATE);
-    config.setCommitOnClose(true);
-    try (IndexWriter iwriter = new IndexWriter(directory, config)) {
-      for (String inputFile : inputFiles) {
-        File file = new File(inputFile);
-        if (file.length() == 0) {
-          continue;
-        }
-
-        String title;
-        try (BufferedReader titleReader =
-            new BufferedReader(new InputStreamReader(Files.newInputStream(file.toPath()), UTF_8))) {
-          title = titleReader.readLine();
-          if (title != null && title.startsWith("[[")) {
-            // Generally the first line of the txt is the title. In a few cases the
-            // first line is a "[[tag]]" and the second line is the title.
-            title = titleReader.readLine();
-          }
-        }
-        Matcher matcher = SECTION_HEADER.matcher(title);
-        if (matcher.matches()) {
-          title = matcher.group(1);
-        }
-
-        String outputFile = AsciiDoctor.mapInFileToOutFile(inputFile, inExt, outExt);
-        try (FileReader reader = new FileReader(file)) {
-          Document doc = new Document();
-          doc.add(new TextField(Constants.DOC_FIELD, reader));
-          doc.add(new StringField(Constants.URL_FIELD, prefix + outputFile, Field.Store.YES));
-          doc.add(new TextField(Constants.TITLE_FIELD, title, Field.Store.YES));
-          iwriter.addDocument(doc);
-        }
-      }
-    }
-    return directory;
-  }
-
-  private byte[] zip(RAMDirectory dir) throws IOException {
-    ByteArrayOutputStream buf = new ByteArrayOutputStream();
-    try (ZipOutputStream zip = new ZipOutputStream(buf)) {
-      for (String name : dir.listAll()) {
-        try (IndexInput in = dir.openInput(name, null)) {
-          int len = (int) in.length();
-          byte[] tmp = new byte[len];
-          ZipEntry entry = new ZipEntry(name);
-          entry.setSize(len);
-          in.readBytes(tmp, 0, len);
-          zip.putNextEntry(entry);
-          zip.write(tmp, 0, len);
-          zip.closeEntry();
-        }
-      }
-    }
-
-    return buf.toByteArray();
-  }
-
-  public static void main(String[] args) {
-    try {
-      new DocIndexer().invoke(args);
-    } catch (IOException e) {
-      System.err.println(e.getMessage());
-      System.exit(1);
-    }
-  }
-}
diff --git a/lib/ba-linkify/BUILD b/lib/ba-linkify/BUILD
new file mode 100644
index 0000000..9a8b442
--- /dev/null
+++ b/lib/ba-linkify/BUILD
@@ -0,0 +1 @@
+exports_files(["ba-linkify.js"])
diff --git a/lib/ba-linkify/README.md b/lib/ba-linkify/README.md
new file mode 100644
index 0000000..8c3e9a4
--- /dev/null
+++ b/lib/ba-linkify/README.md
@@ -0,0 +1,6 @@
+This is the latest version of ba-linkify.js from:
+https://github.com/cowboy/javascript-linkify/blob/178ffc271f89cef403faf73cabd74dda0a79af62/ba-linkify.js
+
+The file was modified manually to include a @license JSDoc tag. The file hasn't
+been updated since 2009, but on the off chance you need to update it, please
+make sure you include a @license.
diff --git a/lib/ba-linkify/ba-linkify.js b/lib/ba-linkify/ba-linkify.js
new file mode 100644
index 0000000..32fbea3
--- /dev/null
+++ b/lib/ba-linkify/ba-linkify.js
@@ -0,0 +1,239 @@
+/**
+ * @license
+ * Copyright (c) 2009 "Cowboy" Ben Alman
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+/*!
+ * JavaScript Linkify - v0.3 - 6/27/2009
+ * http://benalman.com/projects/javascript-linkify/
+ * 
+ * Copyright (c) 2009 "Cowboy" Ben Alman
+ * Dual licensed under the MIT and GPL licenses.
+ * http://benalman.com/about/license/
+ * 
+ * Some regexps adapted from http://userscripts.org/scripts/review/7122
+ */
+
+// Script: JavaScript Linkify: Process links in text!
+//
+// *Version: 0.3, Last updated: 6/27/2009*
+// 
+// Project Home - http://benalman.com/projects/javascript-linkify/
+// GitHub       - http://github.com/cowboy/javascript-linkify/
+// Source       - http://github.com/cowboy/javascript-linkify/raw/master/ba-linkify.js
+// (Minified)   - http://github.com/cowboy/javascript-linkify/raw/master/ba-linkify.min.js (2.8kb)
+// 
+// About: License
+// 
+// Copyright (c) 2009 "Cowboy" Ben Alman,
+// Dual licensed under the MIT and GPL licenses.
+// http://benalman.com/about/license/
+// 
+// About: Examples
+// 
+// This working example, complete with fully commented code, illustrates one way
+// in which this code can be used.
+// 
+// Linkify - http://benalman.com/code/projects/javascript-linkify/examples/linkify/
+// 
+// About: Support and Testing
+// 
+// Information about what browsers this code has been tested in.
+// 
+// Browsers Tested - Internet Explorer 6-8, Firefox 2-3.7, Safari 3-4, Chrome, Opera 9.6-10.
+// 
+// About: Release History
+// 
+// 0.3 - (6/27/2009) Initial release
+
+// Function: linkify
+// 
+// Turn text into linkified html.
+// 
+// Usage:
+// 
+//  > var html = linkify( text [, options ] );
+// 
+// Arguments:
+// 
+//  text - (String) Non-HTML text containing links to be parsed.
+//  options - (Object) An optional object containing linkify parse options.
+// 
+// Options:
+// 
+//  callback (Function) - If specified, this will be called once for each link-
+//    or non-link-chunk with two arguments, text and href. If the chunk is
+//    non-link, href will be omitted. If unspecified, the default linkification
+//    callback is used.
+//  punct_regexp (RegExp) - A RegExp that will be used to trim trailing
+//    punctuation from links, instead of the default. If set to null, trailing
+//    punctuation will not be trimmed.
+// 
+// Returns:
+// 
+//  (String) An HTML string containing links.
+
+window.linkify = (function(){
+  var
+    SCHEME = "[a-z\\d.-]+://",
+    IPV4 = "(?:(?:[0-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])\\.){3}(?:[0-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])",
+    HOSTNAME = "(?:(?:[^\\s!@#$%^&*()_=+[\\]{}\\\\|;:'\",.<>/?]+)\\.)+",
+    TLD = "(?:ac|ad|aero|ae|af|ag|ai|al|am|an|ao|aq|arpa|ar|asia|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|biz|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|cat|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|coop|com|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|edu|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gov|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|info|int|in|io|iq|ir|is|it|je|jm|jobs|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mil|mk|ml|mm|mn|mobi|mo|mp|mq|mr|ms|mt|museum|mu|mv|mw|mx|my|mz|name|na|nc|net|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|org|pa|pe|pf|pg|ph|pk|pl|pm|pn|pro|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tel|tf|tg|th|tj|tk|tl|tm|tn|to|tp|travel|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|xn--0zwm56d|xn--11b5bs3a9aj6g|xn--80akhbyknj4f|xn--9t4b11yi5a|xn--deba0ad|xn--g6w251d|xn--hgbk6aj7f53bba|xn--hlcj6aya9esc7a|xn--jxalpdlp|xn--kgbechtv|xn--zckzah|ye|yt|yu|za|zm|zw)",
+    HOST_OR_IP = "(?:" + HOSTNAME + TLD + "|" + IPV4 + ")",
+    PATH = "(?:[;/][^#?<>\\s]*)?",
+    QUERY_FRAG = "(?:\\?[^#<>\\s]*)?(?:#[^<>\\s]*)?",
+    URI1 = "\\b" + SCHEME + "[^<>\\s]+",
+    URI2 = "\\b" + HOST_OR_IP + PATH + QUERY_FRAG + "(?!\\w)",
+    
+    MAILTO = "mailto:",
+    EMAIL = "(?:" + MAILTO + ")?[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@" + HOST_OR_IP + QUERY_FRAG + "(?!\\w)",
+    
+    URI_RE = new RegExp( "(?:" + URI1 + "|" + URI2 + "|" + EMAIL + ")", "ig" ),
+    SCHEME_RE = new RegExp( "^" + SCHEME, "i" ),
+    
+    quotes = {
+      "'": "`",
+      '>': '<',
+      ')': '(',
+      ']': '[',
+      '}': '{',
+      '»': '«',
+      '›': '‹'
+    },
+    
+    default_options = {
+      callback: function( text, href ) {
+        return href ? '<a href="' + href + '" title="' + href + '">' + text + '</a>' : text;
+      },
+      punct_regexp: /(?:[!?.,:;'"]|(?:&|&amp;)(?:lt|gt|quot|apos|raquo|laquo|rsaquo|lsaquo);)$/
+    };
+  
+  return function( txt, options ) {
+    options = options || {};
+    
+    // Temp variables.
+    var arr,
+      i,
+      link,
+      href,
+      
+      // Output HTML.
+      html = '',
+      
+      // Store text / link parts, in order, for re-combination.
+      parts = [],
+      
+      // Used for keeping track of indices in the text.
+      idx_prev,
+      idx_last,
+      idx,
+      link_last,
+      
+      // Used for trimming trailing punctuation and quotes from links.
+      matches_begin,
+      matches_end,
+      quote_begin,
+      quote_end;
+    
+    // Initialize options.
+    for ( i in default_options ) {
+      if ( options[ i ] === undefined ) {
+        options[ i ] = default_options[ i ];
+      }
+    }
+    
+    // Find links.
+    while ( arr = URI_RE.exec( txt ) ) {
+      
+      link = arr[0];
+      idx_last = URI_RE.lastIndex;
+      idx = idx_last - link.length;
+      
+      // Not a link if preceded by certain characters.
+      if ( /[\/:]/.test( txt.charAt( idx - 1 ) ) ) {
+        continue;
+      }
+      
+      // Trim trailing punctuation.
+      do {
+        // If no changes are made, we don't want to loop forever!
+        link_last = link;
+        
+        quote_end = link.substr( -1 )
+        quote_begin = quotes[ quote_end ];
+        
+        // Ending quote character?
+        if ( quote_begin ) {
+          matches_begin = link.match( new RegExp( '\\' + quote_begin + '(?!$)', 'g' ) );
+          matches_end = link.match( new RegExp( '\\' + quote_end, 'g' ) );
+          
+          // If quotes are unbalanced, remove trailing quote character.
+          if ( ( matches_begin ? matches_begin.length : 0 ) < ( matches_end ? matches_end.length : 0 ) ) {
+            link = link.substr( 0, link.length - 1 );
+            idx_last--;
+          }
+        }
+        
+        // Ending non-quote punctuation character?
+        if ( options.punct_regexp ) {
+          link = link.replace( options.punct_regexp, function(a){
+            idx_last -= a.length;
+            return '';
+          });
+        }
+      } while ( link.length && link !== link_last );
+      
+      href = link;
+      
+      // Add appropriate protocol to naked links.
+      if ( !SCHEME_RE.test( href ) ) {
+        href = ( href.indexOf( '@' ) !== -1 ? ( !href.indexOf( MAILTO ) ? '' : MAILTO )
+          : !href.indexOf( 'irc.' ) ? 'irc://'
+          : !href.indexOf( 'ftp.' ) ? 'ftp://'
+          : 'http://' )
+          + href;
+      }
+      
+      // Push preceding non-link text onto the array.
+      if ( idx_prev != idx ) {
+        parts.push([ txt.slice( idx_prev, idx ) ]);
+        idx_prev = idx_last;
+      }
+      
+      // Push massaged link onto the array
+      parts.push([ link, href ]);
+    };
+    
+    // Push remaining non-link text onto the array.
+    parts.push([ txt.substr( idx_prev ) ]);
+    
+    // Process the array items.
+    for ( i = 0; i < parts.length; i++ ) {
+      html += options.callback.apply( window, parts[i] );
+    }
+    
+    // In case of catastrophic failure, return the original text;
+    return html || txt;
+  };
+  
+})();
diff --git a/lib/codemirror/cm.bzl b/lib/codemirror/cm.bzl
index 10de23d..593caa3 100644
--- a/lib/codemirror/cm.bzl
+++ b/lib/codemirror/cm.bzl
@@ -55,11 +55,14 @@
     "eclipse",
     "elegant",
     "erlang-dark",
+    "gruvbox-dark",
     "hopscotch",
     "icecoder",
+    "idea",
     "isotope",
     "lesser-dark",
     "liquibyte",
+    "lucario",
     "material",
     "mbo",
     "mdn-like",
@@ -75,6 +78,7 @@
     "rubyblue",
     "seti",
     "solarized",
+    "ssms",
     "the-matrix",
     "tomorrow-night-bright",
     "tomorrow-night-eighties",
@@ -214,7 +218,7 @@
     "z80",
 ]
 
-CM_VERSION = "5.25.0"
+CM_VERSION = "5.37.0"
 
 TOP = "META-INF/resources/webjars/codemirror/%s" % CM_VERSION
 
@@ -231,8 +235,8 @@
 
 def pkg_cm():
     for archive, suffix, top, license in [
-        ("@codemirror-original//jar", "", TOP, LICENSE),
-        ("@codemirror-minified//jar", "_r", TOP_MINIFIED, LICENSE_MINIFIED),
+        ("@codemirror-original-gwt//jar", "", TOP, LICENSE),
+        ("@codemirror-minified-gwt//jar", "_r", TOP_MINIFIED, LICENSE_MINIFIED),
     ]:
         # Main JavaScript and addons
         genrule2(
diff --git a/lib/commons/BUILD b/lib/commons/BUILD
index 4208ec5..93d3c2f 100644
--- a/lib/commons/BUILD
+++ b/lib/commons/BUILD
@@ -7,30 +7,24 @@
 )
 
 java_library(
-    name = "collections",
-    data = ["//lib:LICENSE-Apache2.0"],
-    exports = ["@commons-collections//jar"],
-)
-
-java_library(
     name = "compress",
     data = ["//lib:LICENSE-Apache2.0"],
     exports = ["@commons-compress//jar"],
 )
 
 java_library(
-    name = "io",
-    data = ["//lib:LICENSE-Apache2.0"],
-    exports = ["@commons-io//jar"],
-)
-
-java_library(
     name = "lang",
     data = ["//lib:LICENSE-Apache2.0"],
     exports = ["@commons-lang//jar"],
 )
 
 java_library(
+    name = "lang3",
+    data = ["//lib:LICENSE-Apache2.0"],
+    exports = ["@commons-lang3//jar"],
+)
+
+java_library(
     name = "net",
     data = ["//lib:LICENSE-Apache2.0"],
     exports = ["@commons-net//jar"],
@@ -50,13 +44,13 @@
 )
 
 java_library(
-    name = "oro",
-    data = ["//lib:LICENSE-Apache1.1"],
-    exports = ["@commons-oro//jar"],
-)
-
-java_library(
     name = "validator",
     data = ["//lib:LICENSE-Apache2.0"],
     exports = ["@commons-validator//jar"],
 )
+
+java_library(
+    name = "io",
+    data = ["//lib:LICENSE-Apache2.0"],
+    exports = ["@commons-io//jar"],
+)
diff --git a/lib/flogger/BUILD b/lib/flogger/BUILD
new file mode 100644
index 0000000..c41e12f
--- /dev/null
+++ b/lib/flogger/BUILD
@@ -0,0 +1,10 @@
+java_library(
+    name = "api",
+    data = ["//lib:LICENSE-Apache2.0"],
+    visibility = ["//visibility:public"],
+    exports = [
+        "@flogger-log4j-backend//jar",
+        "@flogger-system-backend//jar",
+        "@flogger//jar",
+    ],
+)
diff --git a/lib/greenmail/BUILD b/lib/greenmail/BUILD
index 41fbdab..062f866 100644
--- a/lib/greenmail/BUILD
+++ b/lib/greenmail/BUILD
@@ -2,6 +2,7 @@
 
 java_library(
     name = "greenmail",
+    testonly = True,
     data = ["//lib:LICENSE-Apache2.0"],
     exports = ["@greenmail//jar"],
 )
diff --git a/lib/guava.bzl b/lib/guava.bzl
index 0cd3f38..1add718 100644
--- a/lib/guava.bzl
+++ b/lib/guava.bzl
@@ -1,5 +1,5 @@
-GUAVA_VERSION = "24.1.1-jre"
+GUAVA_VERSION = "26.0-jre"
 
-GUAVA_BIN_SHA1 = "2e3014320a8005e3f3c1800cb246ed42db8cab81"
+GUAVA_BIN_SHA1 = "6a806eff209f36f635f943e16d97491f00f6bfab"
 
 GUAVA_DOC_URL = "https://google.github.io/guava/releases/" + GUAVA_VERSION + "/api/docs/"
diff --git a/lib/guice/BUILD b/lib/guice/BUILD
index 5554479..7f384e2 100644
--- a/lib/guice/BUILD
+++ b/lib/guice/BUILD
@@ -4,7 +4,7 @@
     visibility = ["//visibility:public"],
     exports = [
         ":guice-library",
-        ":javax-inject",
+        ":javax_inject",
     ],
 )
 
@@ -39,7 +39,7 @@
 )
 
 java_library(
-    name = "javax-inject",
+    name = "javax_inject",
     data = ["//lib:LICENSE-Apache2.0"],
     visibility = ["//visibility:public"],
     exports = ["@javax_inject//jar"],
diff --git a/lib/highlightjs/building.md b/lib/highlightjs/building.md
index b35592f..cd5884a 100644
--- a/lib/highlightjs/building.md
+++ b/lib/highlightjs/building.md
@@ -20,52 +20,25 @@
 languages included. Build it with the following:
 
     $>  # start in some temp directory
-    $>  git clone https://github.com/isagalaev/highlight.js.git
+    $>  git clone https://github.com/highlightjs/highlight.js
     $>  cd highlight.js
-    $>  node tools/build.js -n \
-          bash \
-          cpp \
-          cs \
-          clojure \
-          css \
-          d \
-          dart \
-          erb \
-          go \
-          haskell \
-          java \
-          javascript \
-          json \
-          kotlin \
-          lisp \
-          lua \
-          markdown \
-          objectivec \
-          ocaml \
-          perl \
-          php \
-          protobuf \
-          puppet \
-          python \
-          ruby \
-          rust \
-          scala \
-          shell \
-          sql \
-          swift \
-          typescript \
-          xml \
-          yaml
+    $>  npm install
+    $>  node tools/build.js -n
 
 The resulting JS file will appear in the "build" directory of the Highlight.js
 repo under the name "highlight.pack.js".
 
 ## Minification
 
-Minify the file using closure-compiler using the command below. (Modify
-`/path/to` with the path to your compiler jar.)
+Minify the file using closure-compiler using the command below.
 
-    $>  java -jar /path/to/closure-compiler.jar \
+    $> wget https://dl.google.com/closure-compiler/compiler-latest.zip
+
+    $> unzip compiler-latest.zip
+
+    $> mv closure-compiler-*.jar closure-compiler.jar
+
+    $>  java -jar ./closure-compiler.jar \
             --js build/highlight.pack.js \
             --js_output_file build/highlight.min.js
 
diff --git a/lib/highlightjs/highlight.min.js b/lib/highlightjs/highlight.min.js
index 069a018..afe3f54 100644
--- a/lib/highlightjs/highlight.min.js
+++ b/lib/highlightjs/highlight.min.js
@@ -1,124 +1,479 @@
 /*
- highlight.js v9.12.0 | BSD3 License | git.io/hljslicense */
-var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(b,g,l){b!=Array.prototype&&b!=Object.prototype&&(b[g]=l.value)};$jscomp.getGlobal=function(b){return"undefined"!=typeof window&&window===b?b:"undefined"!=typeof global&&null!=global?global:b};$jscomp.global=$jscomp.getGlobal(this);$jscomp.SYMBOL_PREFIX="jscomp_symbol_";
-$jscomp.initSymbol=function(){$jscomp.initSymbol=function(){};$jscomp.global.Symbol||($jscomp.global.Symbol=$jscomp.Symbol)};$jscomp.symbolCounter_=0;$jscomp.Symbol=function(b){return $jscomp.SYMBOL_PREFIX+(b||"")+$jscomp.symbolCounter_++};
-$jscomp.initSymbolIterator=function(){$jscomp.initSymbol();var b=$jscomp.global.Symbol.iterator;b||(b=$jscomp.global.Symbol.iterator=$jscomp.global.Symbol("iterator"));"function"!=typeof Array.prototype[b]&&$jscomp.defineProperty(Array.prototype,b,{configurable:!0,writable:!0,value:function(){return $jscomp.arrayIterator(this)}});$jscomp.initSymbolIterator=function(){}};$jscomp.arrayIterator=function(b){var g=0;return $jscomp.iteratorPrototype(function(){return g<b.length?{done:!1,value:b[g++]}:{done:!0}})};
-$jscomp.iteratorPrototype=function(b){$jscomp.initSymbolIterator();b={next:b};b[$jscomp.global.Symbol.iterator]=function(){return this};return b};$jscomp.iteratorFromArray=function(b,g){$jscomp.initSymbolIterator();b instanceof String&&(b+="");var l=0,k={next:function(){if(l<b.length){var m=l++;return{value:g(m,b[m]),done:!1}}k.next=function(){return{done:!0,value:void 0}};return k.next()}};k[Symbol.iterator]=function(){return k};return k};
-$jscomp.polyfill=function(b,g,l,k){if(g){l=$jscomp.global;b=b.split(".");for(k=0;k<b.length-1;k++){var m=b[k];m in l||(l[m]={});l=l[m]}b=b[b.length-1];k=l[b];g=g(k);g!=k&&null!=g&&$jscomp.defineProperty(l,b,{configurable:!0,writable:!0,value:g})}};$jscomp.polyfill("Array.prototype.keys",function(b){return b?b:function(){return $jscomp.iteratorFromArray(this,function(b){return b})}},"es6","es3");
-(function(b){var g="object"===typeof window&&window||"object"===typeof self&&self;"undefined"!==typeof exports?b(exports):g&&(g.hljs=b({}),"function"===typeof define&&define.amd&&define([],function(){return g.hljs}))})(function(b){function g(a){return a.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function l(a,f){return(a=a&&a.exec(f))&&0===a.index}function k(a){var f,b={},e=Array.prototype.slice.call(arguments,1);for(f in a)b[f]=a[f];e.forEach(function(a){for(f in a)b[f]=a[f]});
-return b}function m(a){var f=[];(function e(a,b){for(a=a.firstChild;a;a=a.nextSibling)3===a.nodeType?b+=a.nodeValue.length:1===a.nodeType&&(f.push({event:"start",offset:b,node:a}),b=e(a,b),a.nodeName.toLowerCase().match(/br|hr|img|input/)||f.push({event:"stop",offset:b,node:a}));return b})(a,0);return f}function L(a,f,b){function d(){return a.length&&f.length?a[0].offset!==f[0].offset?a[0].offset<f[0].offset?a:f:"start"===f[0].event?a:f:a.length?a:f}function c(a){B+="<"+a.nodeName.toLowerCase()+H.map.call(a.attributes,
-function(a){return" "+a.nodeName+'="'+g(a.value).replace('"',"&quot;")+'"'}).join("")+">"}function q(a){B+="</"+a.nodeName.toLowerCase()+">"}function w(a){("start"===a.event?c:q)(a.node)}for(var r=0,B="",n=[];a.length||f.length;){var h=d();B+=g(b.substring(r,h[0].offset));r=h[0].offset;if(h===a){n.reverse().forEach(q);do w(h.splice(0,1)[0]),h=d();while(h===a&&h.length&&h[0].offset===r);n.reverse().forEach(c)}else"start"===h[0].event?n.push(h[0].node):n.pop(),w(h.splice(0,1)[0])}return B+g(b.substr(r))}
-function M(a){a.variants&&!a.cached_variants&&(a.cached_variants=a.variants.map(function(f){return k(a,{variants:null},f)}));return a.cached_variants||a.endsWithParent&&[k(a)]||[a]}function N(a){function f(a){return a&&a.source||a}function b(b,d){return new RegExp(f(b),"m"+(a.case_insensitive?"i":"")+(d?"g":""))}function e(c,d){if(!c.compiled){c.compiled=!0;c.keywords=c.keywords||c.beginKeywords;if(c.keywords){var q={},g=function(f,b){a.case_insensitive&&(b=b.toLowerCase());b.split(" ").forEach(function(a){a=
-a.split("|");q[a[0]]=[f,a[1]?Number(a[1]):1]})};"string"===typeof c.keywords?g("keyword",c.keywords):x(c.keywords).forEach(function(a){g(a,c.keywords[a])});c.keywords=q}c.lexemesRe=b(c.lexemes||/\w+/,!0);d&&(c.beginKeywords&&(c.begin="\\b("+c.beginKeywords.split(" ").join("|")+")\\b"),c.begin||(c.begin=/\B|\b/),c.beginRe=b(c.begin),c.end||c.endsWithParent||(c.end=/\B|\b/),c.end&&(c.endRe=b(c.end)),c.terminator_end=f(c.end)||"",c.endsWithParent&&d.terminator_end&&(c.terminator_end+=(c.end?"|":"")+
-d.terminator_end));c.illegal&&(c.illegalRe=b(c.illegal));null==c.relevance&&(c.relevance=1);c.contains||(c.contains=[]);c.contains=Array.prototype.concat.apply([],c.contains.map(function(a){return M("self"===a?c:a)}));c.contains.forEach(function(a){e(a,c)});c.starts&&e(c.starts,d);d=c.contains.map(function(a){return a.beginKeywords?"\\.?("+a.begin+")\\.?":a.begin}).concat([c.terminator_end,c.illegal]).map(f).filter(Boolean);c.terminators=d.length?b(d.join("|"),!0):{exec:function(){return null}}}}
-e(a)}function C(a,f,b,e){function c(a,b){if(l(a.endRe,b)){for(;a.endsParent&&a.parent;)a=a.parent;return a}if(a.endsWithParent)return c(a.parent,b)}function d(a,b,f,d){return'<span class="'+(d?"":t.classPrefix)+(a+'">')+b+(f?"":"</span>")}function w(){var a=v,b;if(null!=h.subLanguage)if((b="string"===typeof h.subLanguage)&&!y[h.subLanguage])b=g(p);else{var f=b?C(h.subLanguage,p,!0,m[h.subLanguage]):F(p,h.subLanguage.length?h.subLanguage:void 0);0<h.relevance&&(u+=f.relevance);b&&(m[h.subLanguage]=
-f.top);b=d(f.language,f.value,!1,!0)}else if(h.keywords){f="";var c=0;h.lexemesRe.lastIndex=0;for(b=h.lexemesRe.exec(p);b;){f+=g(p.substring(c,b.index));c=h;var e=b;e=n.case_insensitive?e[0].toLowerCase():e[0];(c=c.keywords.hasOwnProperty(e)&&c.keywords[e])?(u+=c[1],f+=d(c[0],g(b[0]))):f+=g(b[0]);c=h.lexemesRe.lastIndex;b=h.lexemesRe.exec(p)}b=f+g(p.substr(c))}else b=g(p);v=a+b;p=""}function r(a){v+=a.className?d(a.className,"",!0):"";h=Object.create(a,{parent:{value:h}})}function k(a,f){p+=a;if(null==
-f)return w(),0;a:{a=h;var d;var e=0;for(d=a.contains.length;e<d;e++)if(l(a.contains[e].beginRe,f)){a=a.contains[e];break a}a=void 0}if(a)return a.skip?p+=f:(a.excludeBegin&&(p+=f),w(),a.returnBegin||a.excludeBegin||(p=f)),r(a,f),a.returnBegin?0:f.length;if(a=c(h,f)){e=h;e.skip?p+=f:(e.returnEnd||e.excludeEnd||(p+=f),w(),e.excludeEnd&&(p=f));do h.className&&(v+="</span>"),h.skip||(u+=h.relevance),h=h.parent;while(h!==a.parent);a.starts&&r(a.starts,"");return e.returnEnd?0:f.length}if(!b&&l(h.illegalRe,
-f))throw Error('Illegal lexeme "'+f+'" for mode "'+(h.className||"<unnamed>")+'"');p+=f;return f.length||1}var n=z(a);if(!n)throw Error('Unknown language: "'+a+'"');N(n);var h=e||n,m={},v="";for(e=h;e!==n;e=e.parent)e.className&&(v=d(e.className,"",!0)+v);var p="",u=0;try{for(var A,x,D=0;;){h.terminators.lastIndex=D;A=h.terminators.exec(f);if(!A)break;x=k(f.substring(D,A.index),A[0]);D=A.index+x}k(f.substr(D));for(e=h;e.parent;e=e.parent)e.className&&(v+="</span>");return{relevance:u,value:v,language:a,
-top:h}}catch(E){if(E.message&&-1!==E.message.indexOf("Illegal"))return{relevance:0,value:g(f)};throw E;}}function F(a,f){f=f||t.languages||x(y);var b={relevance:0,value:g(a)},e=b;f.filter(z).forEach(function(f){var c=C(f,a,!1);c.language=f;c.relevance>e.relevance&&(e=c);c.relevance>b.relevance&&(e=b,b=c)});e.language&&(b.second_best=e);return b}function I(a){return t.tabReplace||t.useBR?a.replace(O,function(a,b){return t.useBR&&"\n"===a?"<br>":t.tabReplace?b.replace(/\t/g,t.tabReplace):""}):a}function J(a){var b,
-d;a:{var e=a.className+" ";e+=a.parentNode?a.parentNode.className:"";if(d=P.exec(e))d=z(d[1])?d[1]:"no-highlight";else{e=e.split(/\s+/);d=0;for(b=e.length;d<b;d++){var c=e[d];if(K.test(c)||z(c)){d=c;break a}}d=void 0}}if(!K.test(d)){t.useBR?(c=document.createElementNS("http://www.w3.org/1999/xhtml","div"),c.innerHTML=a.innerHTML.replace(/\n/g,"").replace(/<br[ \/]*>/g,"\n")):c=a;b=c.textContent;e=d?C(d,b,!0):F(b);c=m(c);if(c.length){var q=document.createElementNS("http://www.w3.org/1999/xhtml","div");
-q.innerHTML=e.value;e.value=L(c,m(q),b)}e.value=I(e.value);a.innerHTML=e.value;b=a.className;d=d?G[d]:e.language;c=[b.trim()];b.match(/\bhljs\b/)||c.push("hljs");-1===b.indexOf(d)&&c.push(d);d=c.join(" ").trim();a.className=d;a.result={language:e.language,re:e.relevance};e.second_best&&(a.second_best={language:e.second_best.language,re:e.second_best.relevance})}}function u(){if(!u.called){u.called=!0;var a=document.querySelectorAll("pre code");H.forEach.call(a,J)}}function z(a){a=(a||"").toLowerCase();
-return y[a]||y[G[a]]}var H=[],x=Object.keys,y={},G={},K=/^(no-?highlight|plain|text)$/i,P=/\blang(?:uage)?-([\w-]+)\b/i,O=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,t={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};b.highlight=C;b.highlightAuto=F;b.fixMarkup=I;b.highlightBlock=J;b.configure=function(a){t=k(t,a)};b.initHighlighting=u;b.initHighlightingOnLoad=function(){addEventListener("DOMContentLoaded",u,!1);addEventListener("load",u,!1)};b.registerLanguage=function(a,f){f=y[a]=f(b);f.aliases&&
-f.aliases.forEach(function(b){G[b]=a})};b.listLanguages=function(){return x(y)};b.getLanguage=z;b.inherit=k;b.IDENT_RE="[a-zA-Z]\\w*";b.UNDERSCORE_IDENT_RE="[a-zA-Z_]\\w*";b.NUMBER_RE="\\b\\d+(\\.\\d+)?";b.C_NUMBER_RE="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";b.BINARY_NUMBER_RE="\\b(0b[01]+)";b.RE_STARTERS_RE="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";b.BACKSLASH_ESCAPE=
-{begin:"\\\\[\\s\\S]",relevance:0};b.APOS_STRING_MODE={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[b.BACKSLASH_ESCAPE]};b.QUOTE_STRING_MODE={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[b.BACKSLASH_ESCAPE]};b.PHRASAL_WORDS_MODE={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/};b.COMMENT=function(a,f,d){a=b.inherit({className:"comment",begin:a,end:f,contains:[]},d||{});
-a.contains.push(b.PHRASAL_WORDS_MODE);a.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|XXX):",relevance:0});return a};b.C_LINE_COMMENT_MODE=b.COMMENT("//","$");b.C_BLOCK_COMMENT_MODE=b.COMMENT("/\\*","\\*/");b.HASH_COMMENT_MODE=b.COMMENT("#","$");b.NUMBER_MODE={className:"number",begin:b.NUMBER_RE,relevance:0};b.C_NUMBER_MODE={className:"number",begin:b.C_NUMBER_RE,relevance:0};b.BINARY_NUMBER_MODE={className:"number",begin:b.BINARY_NUMBER_RE,relevance:0};b.CSS_NUMBER_MODE={className:"number",
-begin:b.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0};b.REGEXP_MODE={className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[b.BACKSLASH_ESCAPE,{begin:/\[/,end:/\]/,relevance:0,contains:[b.BACKSLASH_ESCAPE]}]};b.TITLE_MODE={className:"title",begin:b.IDENT_RE,relevance:0};b.UNDERSCORE_TITLE_MODE={className:"title",begin:b.UNDERSCORE_IDENT_RE,relevance:0};b.METHOD_GUARD={begin:"\\.\\s*"+b.UNDERSCORE_IDENT_RE,relevance:0};
-b.registerLanguage("bash",function(a){var b={className:"variable",variants:[{begin:/\$[\w\d#@][\w\d_]*/},{begin:/\$\{(.*?)}/}]},d={className:"string",begin:/"/,end:/"/,contains:[a.BACKSLASH_ESCAPE,b,{className:"variable",begin:/\$\(/,end:/\)/,contains:[a.BACKSLASH_ESCAPE]}]};return{aliases:["sh","zsh"],lexemes:/\b-?[a-z\._]+\b/,keywords:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",
-_:"-ne -eq -lt -gt -f -d -e -s -l -a"},contains:[{className:"meta",begin:/^#![^\n]+sh\s*$/,relevance:10},{className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[a.inherit(a.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0},a.HASH_COMMENT_MODE,d,{className:"string",begin:/'/,end:/'/},b]}});b.registerLanguage("clojure",function(a){var b={className:"number",begin:"[-+]?\\d+(\\.\\d+)?",relevance:0},d=a.inherit(a.QUOTE_STRING_MODE,{illegal:null}),e=a.COMMENT(";","$",{relevance:0}),
-c={className:"literal",begin:/\b(true|false|nil)\b/},q={begin:"[\\[\\{]",end:"[\\]\\}]"},g={className:"comment",begin:"\\^[a-zA-Z_\\-!.?+*=<>&#'][a-zA-Z_\\-!.?+*=<>&#'0-9/;:]*"},r=a.COMMENT("\\^\\{","\\}"),k={className:"symbol",begin:"[:]{1,2}[a-zA-Z_\\-!.?+*=<>&#'][a-zA-Z_\\-!.?+*=<>&#'0-9/;:]*"},n={begin:"\\(",end:"\\)"},h={endsWithParent:!0,relevance:0},l={keywords:{"builtin-name":"def defonce cond apply if-not if-let if not not= = < > <= >= == + / * - rem quot neg? pos? delay? symbol? keyword? true? false? integer? empty? coll? list? set? ifn? fn? associative? sequential? sorted? counted? reversible? number? decimal? class? distinct? isa? float? rational? reduced? ratio? odd? even? char? seq? vector? string? map? nil? contains? zero? instance? not-every? not-any? libspec? -> ->> .. . inc compare do dotimes mapcat take remove take-while drop letfn drop-last take-last drop-while while intern condp case reduced cycle split-at split-with repeat replicate iterate range merge zipmap declare line-seq sort comparator sort-by dorun doall nthnext nthrest partition eval doseq await await-for let agent atom send send-off release-pending-sends add-watch mapv filterv remove-watch agent-error restart-agent set-error-handler error-handler set-error-mode! error-mode shutdown-agents quote var fn loop recur throw try monitor-enter monitor-exit defmacro defn defn- macroexpand macroexpand-1 for dosync and or when when-not when-let comp juxt partial sequence memoize constantly complement identity assert peek pop doto proxy defstruct first rest cons defprotocol cast coll deftype defrecord last butlast sigs reify second ffirst fnext nfirst nnext defmulti defmethod meta with-meta ns in-ns create-ns import refer keys select-keys vals key val rseq name namespace promise into transient persistent! conj! assoc! dissoc! pop! disj! use class type num float double short byte boolean bigint biginteger bigdec print-method print-dup throw-if printf format load compile get-in update-in pr pr-on newline flush read slurp read-line subvec with-open memfn time re-find re-groups rand-int rand mod locking assert-valid-fdecl alias resolve ref deref refset swap! reset! set-validator! compare-and-set! alter-meta! reset-meta! commute get-validator alter ref-set ref-history-count ref-min-history ref-max-history ensure sync io! new next conj set! to-array future future-call into-array aset gen-class reduce map filter find empty hash-map hash-set sorted-map sorted-map-by sorted-set sorted-set-by vec vector seq flatten reverse assoc dissoc list disj get union difference intersection extend extend-type extend-protocol int nth delay count concat chunk chunk-buffer chunk-append chunk-first chunk-rest max min dec unchecked-inc-int unchecked-inc unchecked-dec-inc unchecked-dec unchecked-negate unchecked-add-int unchecked-add unchecked-subtract-int unchecked-subtract chunk-next chunk-cons chunked-seq? prn vary-meta lazy-seq spread list* str find-keyword keyword symbol gensym force rationalize"},
-lexemes:"[a-zA-Z_\\-!.?+*=<>&#'][a-zA-Z_\\-!.?+*=<>&#'0-9/;:]*",className:"name",begin:"[a-zA-Z_\\-!.?+*=<>&#'][a-zA-Z_\\-!.?+*=<>&#'0-9/;:]*",starts:h},m=[n,d,g,r,e,k,q,b,c,{begin:"[a-zA-Z_\\-!.?+*=<>&#'][a-zA-Z_\\-!.?+*=<>&#'0-9/;:]*",relevance:0}];n.contains=[a.COMMENT("comment",""),l,h];h.contains=m;q.contains=m;r.contains=[q];return{aliases:["clj"],illegal:/\S/,contains:[n,d,g,r,e,k,q,b,c]}});b.registerLanguage("cpp",function(a){var b={className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},d={className:"string",
-variants:[{begin:'(u8?|U)?L?"',end:'"',illegal:"\\n",contains:[a.BACKSLASH_ESCAPE]},{begin:'(u8?|U)?R"',end:'"',contains:[a.BACKSLASH_ESCAPE]},{begin:"'\\\\?.",end:"'",illegal:"."}]},e={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},c={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{"meta-keyword":"if else elif endif define undef warning error line pragma ifdef ifndef include"},
-contains:[{begin:/\\\n/,relevance:0},a.inherit(d,{className:"meta-string"}),{className:"meta-string",begin:/<[^\n>]*>/,end:/$/,illegal:"\\n"},a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE]},q=a.IDENT_RE+"\\s*\\(",g={keyword:"int float while private char catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignof constexpr decltype noexcept static_assert thread_local restrict _Bool complex _Complex _Imaginary atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and or not",
+ highlight.js v9.14.0 | BSD3 License | git.io/hljslicense */
+var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.arrayIteratorImpl=function(b){var l=0;return function(){return l<b.length?{done:!1,value:b[l++]}:{done:!0}}};$jscomp.arrayIterator=function(b){return{next:$jscomp.arrayIteratorImpl(b)}};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.SIMPLE_FROUND_POLYFILL=!1;
+$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(b,l,t){b!=Array.prototype&&b!=Object.prototype&&(b[l]=t.value)};$jscomp.getGlobal=function(b){return"undefined"!=typeof window&&window===b?b:"undefined"!=typeof global&&null!=global?global:b};$jscomp.global=$jscomp.getGlobal(this);$jscomp.SYMBOL_PREFIX="jscomp_symbol_";$jscomp.initSymbol=function(){$jscomp.initSymbol=function(){};$jscomp.global.Symbol||($jscomp.global.Symbol=$jscomp.Symbol)};
+$jscomp.Symbol=function(){var b=0;return function(l){return $jscomp.SYMBOL_PREFIX+(l||"")+b++}}();$jscomp.initSymbolIterator=function(){$jscomp.initSymbol();var b=$jscomp.global.Symbol.iterator;b||(b=$jscomp.global.Symbol.iterator=$jscomp.global.Symbol("iterator"));"function"!=typeof Array.prototype[b]&&$jscomp.defineProperty(Array.prototype,b,{configurable:!0,writable:!0,value:function(){return $jscomp.iteratorPrototype($jscomp.arrayIteratorImpl(this))}});$jscomp.initSymbolIterator=function(){}};
+$jscomp.initSymbolAsyncIterator=function(){$jscomp.initSymbol();var b=$jscomp.global.Symbol.asyncIterator;b||(b=$jscomp.global.Symbol.asyncIterator=$jscomp.global.Symbol("asyncIterator"));$jscomp.initSymbolAsyncIterator=function(){}};$jscomp.iteratorPrototype=function(b){$jscomp.initSymbolIterator();b={next:b};b[$jscomp.global.Symbol.iterator]=function(){return this};return b};
+$jscomp.iteratorFromArray=function(b,l){$jscomp.initSymbolIterator();b instanceof String&&(b+="");var t=0,q={next:function(){if(t<b.length){var u=t++;return{value:l(u,b[u]),done:!1}}q.next=function(){return{done:!0,value:void 0}};return q.next()}};q[Symbol.iterator]=function(){return q};return q};
+$jscomp.polyfill=function(b,l,t,q){if(l){t=$jscomp.global;b=b.split(".");for(q=0;q<b.length-1;q++){var u=b[q];u in t||(t[u]={});t=t[u]}b=b[b.length-1];q=t[b];l=l(q);l!=q&&null!=l&&$jscomp.defineProperty(t,b,{configurable:!0,writable:!0,value:l})}};$jscomp.polyfill("Array.prototype.keys",function(b){return b?b:function(){return $jscomp.iteratorFromArray(this,function(b){return b})}},"es6","es3");
+(function(b){var l="object"===typeof window&&window||"object"===typeof self&&self;"undefined"!==typeof exports?b(exports):l&&(l.hljs=b({}),"function"===typeof define&&define.amd&&define([],function(){return l.hljs}))})(function(b){function l(a){return a.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function t(a,c){return(a=a&&a.exec(c))&&0===a.index}function q(a){var c,d={},b=Array.prototype.slice.call(arguments,1);for(c in a)d[c]=a[c];b.forEach(function(a){for(c in a)d[c]=a[c]});
+return d}function u(a){var c=[];(function g(a,b){for(a=a.firstChild;a;a=a.nextSibling)3===a.nodeType?b+=a.nodeValue.length:1===a.nodeType&&(c.push({event:"start",offset:b,node:a}),b=g(a,b),a.nodeName.toLowerCase().match(/br|hr|img|input/)||c.push({event:"stop",offset:b,node:a}));return b})(a,0);return c}function L(a,c,b){function d(){return a.length&&c.length?a[0].offset!==c[0].offset?a[0].offset<c[0].offset?a:c:"start"===c[0].event?a:c:a.length?a:c}function f(a){p+="<"+a.nodeName.toLowerCase()+G.map.call(a.attributes,
+function(a){return" "+a.nodeName+'="'+l(a.value).replace('"',"&quot;")+'"'}).join("")+">"}function g(a){p+="</"+a.nodeName.toLowerCase()+">"}function k(a){("start"===a.event?f:g)(a.node)}for(var m=0,p="",n=[];a.length||c.length;){var h=d();p+=l(b.substring(m,h[0].offset));m=h[0].offset;if(h===a){n.reverse().forEach(g);do k(h.splice(0,1)[0]),h=d();while(h===a&&h.length&&h[0].offset===m);n.reverse().forEach(f)}else"start"===h[0].event?n.push(h[0].node):n.pop(),k(h.splice(0,1)[0])}return p+l(b.substr(m))}
+function M(a){a.variants&&!a.cached_variants&&(a.cached_variants=a.variants.map(function(c){return q(a,{variants:null},c)}));return a.cached_variants||a.endsWithParent&&[q(a)]||[a]}function N(a){function c(a){return a&&a.source||a}function b(b,d){return new RegExp(c(b),"m"+(a.case_insensitive?"i":"")+(d?"g":""))}function e(d,g){if(!d.compiled){d.compiled=!0;d.keywords=d.keywords||d.beginKeywords;if(d.keywords){var f={},m=function(c,d){a.case_insensitive&&(d=d.toLowerCase());d.split(" ").forEach(function(a){a=
+a.split("|");f[a[0]]=[c,a[1]?Number(a[1]):1]})};"string"===typeof d.keywords?m("keyword",d.keywords):y(d.keywords).forEach(function(a){m(a,d.keywords[a])});d.keywords=f}d.lexemesRe=b(d.lexemes||/\w+/,!0);g&&(d.beginKeywords&&(d.begin="\\b("+d.beginKeywords.split(" ").join("|")+")\\b"),d.begin||(d.begin=/\B|\b/),d.beginRe=b(d.begin),d.endSameAsBegin&&(d.end=d.begin),d.end||d.endsWithParent||(d.end=/\B|\b/),d.end&&(d.endRe=b(d.end)),d.terminator_end=c(d.end)||"",d.endsWithParent&&g.terminator_end&&
+(d.terminator_end+=(d.end?"|":"")+g.terminator_end));d.illegal&&(d.illegalRe=b(d.illegal));null==d.relevance&&(d.relevance=1);d.contains||(d.contains=[]);d.contains=Array.prototype.concat.apply([],d.contains.map(function(a){return M("self"===a?d:a)}));d.contains.forEach(function(a){e(a,d)});d.starts&&e(d.starts,g);g=d.contains.map(function(a){return a.beginKeywords?"\\.?("+a.begin+")\\.?":a.begin}).concat([d.terminator_end,d.illegal]).map(c).filter(Boolean);d.terminators=g.length?b(g.join("|"),!0):
+{exec:function(){return null}}}}e(a)}function B(a,c,d,b){function e(a,c){if(t(a.endRe,c)){for(;a.endsParent&&a.parent;)a=a.parent;return a}if(a.endsWithParent)return e(a.parent,c)}function g(a,c,d,b){return'<span class="'+(b?"":w.classPrefix)+(a+'">')+c+(d?"":"</span>")}function k(){var a=x,c;if(null!=h.subLanguage)if((c="string"===typeof h.subLanguage)&&!z[h.subLanguage])c=l(r);else{var d=c?B(h.subLanguage,r,!0,q[h.subLanguage]):E(r,h.subLanguage.length?h.subLanguage:void 0);0<h.relevance&&(u+=d.relevance);
+c&&(q[h.subLanguage]=d.top);c=g(d.language,d.value,!1,!0)}else if(h.keywords){d="";var b=0;h.lexemesRe.lastIndex=0;for(c=h.lexemesRe.exec(r);c;){d+=l(r.substring(b,c.index));b=h;var e=c;e=n.case_insensitive?e[0].toLowerCase():e[0];(b=b.keywords.hasOwnProperty(e)&&b.keywords[e])?(u+=b[1],d+=g(b[0],l(c[0]))):d+=l(c[0]);b=h.lexemesRe.lastIndex;c=h.lexemesRe.exec(r)}c=d+l(r.substr(b))}else c=l(r);x=a+c;r=""}function m(a){x+=a.className?g(a.className,"",!0):"";h=Object.create(a,{parent:{value:h}})}function p(a,
+c){r+=a;if(null==c)return k(),0;a:{a=h;var b;var f=0;for(b=a.contains.length;f<b;f++)if(t(a.contains[f].beginRe,c)){a.contains[f].endSameAsBegin&&(a.contains[f].endRe=new RegExp(a.contains[f].beginRe.exec(c)[0].replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"),"m"));a=a.contains[f];break a}a=void 0}if(a)return a.skip?r+=c:(a.excludeBegin&&(r+=c),k(),a.returnBegin||a.excludeBegin||(r=c)),m(a,c),a.returnBegin?0:c.length;if(a=e(h,c)){f=h;f.skip?r+=c:(f.returnEnd||f.excludeEnd||(r+=c),k(),f.excludeEnd&&(r=c));
+do h.className&&(x+="</span>"),h.skip||h.subLanguage||(u+=h.relevance),h=h.parent;while(h!==a.parent);a.starts&&(a.endSameAsBegin&&(a.starts.endRe=a.endRe),m(a.starts,""));return f.returnEnd?0:c.length}if(!d&&t(h.illegalRe,c))throw Error('Illegal lexeme "'+c+'" for mode "'+(h.className||"<unnamed>")+'"');r+=c;return c.length||1}var n=A(a);if(!n)throw Error('Unknown language: "'+a+'"');N(n);var h=b||n,q={},x="";for(b=h;b!==n;b=b.parent)b.className&&(x=g(b.className,"",!0)+x);var r="",u=0;try{for(var v,
+y,C=0;;){h.terminators.lastIndex=C;v=h.terminators.exec(c);if(!v)break;y=p(c.substring(C,v.index),v[0]);C=v.index+y}p(c.substr(C));for(b=h;b.parent;b=b.parent)b.className&&(x+="</span>");return{relevance:u,value:x,language:a,top:h}}catch(D){if(D.message&&-1!==D.message.indexOf("Illegal"))return{relevance:0,value:l(c)};throw D;}}function E(a,c){c=c||w.languages||y(z);var d={relevance:0,value:l(a)},b=d;c.filter(A).filter(H).forEach(function(c){var e=B(c,a,!1);e.language=c;e.relevance>b.relevance&&(b=
+e);e.relevance>d.relevance&&(b=d,d=e)});b.language&&(d.second_best=b);return d}function I(a){return w.tabReplace||w.useBR?a.replace(O,function(a,d){return w.useBR&&"\n"===a?"<br>":w.tabReplace?d.replace(/\t/g,w.tabReplace):""}):a}function J(a){var c,d;a:{var b=a.className+" ";b+=a.parentNode?a.parentNode.className:"";if(d=P.exec(b))d=A(d[1])?d[1]:"no-highlight";else{b=b.split(/\s+/);d=0;for(c=b.length;d<c;d++){var f=b[d];if(K.test(f)||A(f)){d=f;break a}}d=void 0}}if(!K.test(d)){w.useBR?(f=document.createElementNS("http://www.w3.org/1999/xhtml",
+"div"),f.innerHTML=a.innerHTML.replace(/\n/g,"").replace(/<br[ \/]*>/g,"\n")):f=a;c=f.textContent;b=d?B(d,c,!0):E(c);f=u(f);if(f.length){var g=document.createElementNS("http://www.w3.org/1999/xhtml","div");g.innerHTML=b.value;b.value=L(f,u(g),c)}b.value=I(b.value);a.innerHTML=b.value;c=a.className;d=d?F[d]:b.language;f=[c.trim()];c.match(/\bhljs\b/)||f.push("hljs");-1===c.indexOf(d)&&f.push(d);d=f.join(" ").trim();a.className=d;a.result={language:b.language,re:b.relevance};b.second_best&&(a.second_best=
+{language:b.second_best.language,re:b.second_best.relevance})}}function v(){if(!v.called){v.called=!0;var a=document.querySelectorAll("pre code");G.forEach.call(a,J)}}function A(a){a=(a||"").toLowerCase();return z[a]||z[F[a]]}function H(a){return(a=A(a))&&!a.disableAutodetect}var G=[],y=Object.keys,z={},F={},K=/^(no-?highlight|plain|text)$/i,P=/\blang(?:uage)?-([\w-]+)\b/i,O=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,w={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};b.highlight=B;b.highlightAuto=
+E;b.fixMarkup=I;b.highlightBlock=J;b.configure=function(a){w=q(w,a)};b.initHighlighting=v;b.initHighlightingOnLoad=function(){addEventListener("DOMContentLoaded",v,!1);addEventListener("load",v,!1)};b.registerLanguage=function(a,c){c=z[a]=c(b);c.aliases&&c.aliases.forEach(function(c){F[c]=a})};b.listLanguages=function(){return y(z)};b.getLanguage=A;b.autoDetection=H;b.inherit=q;b.IDENT_RE="[a-zA-Z]\\w*";b.UNDERSCORE_IDENT_RE="[a-zA-Z_]\\w*";b.NUMBER_RE="\\b\\d+(\\.\\d+)?";b.C_NUMBER_RE="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";
+b.BINARY_NUMBER_RE="\\b(0b[01]+)";b.RE_STARTERS_RE="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";b.BACKSLASH_ESCAPE={begin:"\\\\[\\s\\S]",relevance:0};b.APOS_STRING_MODE={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[b.BACKSLASH_ESCAPE]};b.QUOTE_STRING_MODE={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[b.BACKSLASH_ESCAPE]};b.PHRASAL_WORDS_MODE={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/};
+b.COMMENT=function(a,c,d){a=b.inherit({className:"comment",begin:a,end:c,contains:[]},d||{});a.contains.push(b.PHRASAL_WORDS_MODE);a.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|XXX):",relevance:0});return a};b.C_LINE_COMMENT_MODE=b.COMMENT("//","$");b.C_BLOCK_COMMENT_MODE=b.COMMENT("/\\*","\\*/");b.HASH_COMMENT_MODE=b.COMMENT("#","$");b.NUMBER_MODE={className:"number",begin:b.NUMBER_RE,relevance:0};b.C_NUMBER_MODE={className:"number",begin:b.C_NUMBER_RE,relevance:0};b.BINARY_NUMBER_MODE=
+{className:"number",begin:b.BINARY_NUMBER_RE,relevance:0};b.CSS_NUMBER_MODE={className:"number",begin:b.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0};b.REGEXP_MODE={className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[b.BACKSLASH_ESCAPE,{begin:/\[/,end:/\]/,relevance:0,contains:[b.BACKSLASH_ESCAPE]}]};b.TITLE_MODE={className:"title",begin:b.IDENT_RE,relevance:0};b.UNDERSCORE_TITLE_MODE={className:"title",begin:b.UNDERSCORE_IDENT_RE,
+relevance:0};b.METHOD_GUARD={begin:"\\.\\s*"+b.UNDERSCORE_IDENT_RE,relevance:0};b.registerLanguage("1c",function(a){var c=a.inherit(a.NUMBER_MODE),b={className:"string",begin:'"|\\|',end:'"|$',contains:[{begin:'""'}]},e={begin:"'",end:"'",excludeBegin:!0,excludeEnd:!0,contains:[{className:"number",begin:"\\d{4}([\\.\\\\/:-]?\\d{2}){0,5}"}]},f=a.inherit(a.C_LINE_COMMENT_MODE),g={className:"meta",lexemes:"[A-Za-z\u0410-\u042f\u0430-\u044f\u0451\u0401_][A-Za-z\u0410-\u042f\u0430-\u044f\u0451\u0401_0-9]+",
+begin:"#|&",end:"$",keywords:{"meta-keyword":"\u0434\u0430\u043b\u0435\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c\u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0434\u043b\u044f \u0435\u0441\u043b\u0438 \u0438 \u0438\u0437 \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435 \u0438\u043d\u0430\u0447\u0435\u0435\u0441\u043b\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u043d\u0435\u0446\u0435\u0441\u043b\u0438 \u043a\u043e\u043d\u0435\u0446\u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043a\u043e\u043d\u0435\u0446\u0446\u0438\u043a\u043b\u0430 \u043d\u0435 \u043d\u043e\u0432\u044b\u0439 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043f\u0435\u0440\u0435\u043c \u043f\u043e \u043f\u043e\u043a\u0430 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043f\u0440\u0435\u0440\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0442\u043e\u0433\u0434\u0430 \u0446\u0438\u043a\u043b \u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0438\u0437\u0444\u0430\u0439\u043b\u0430 \u0432\u0435\u0431\u043a\u043b\u0438\u0435\u043d\u0442 \u0432\u043c\u0435\u0441\u0442\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0435\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043a\u043b\u0438\u0435\u043d\u0442 \u043a\u043e\u043d\u0435\u0446\u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0435\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043a\u043b\u0438\u0435\u043d\u0442 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0435\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430\u043a\u043b\u0438\u0435\u043d\u0442\u0435 \u043d\u0430\u043a\u043b\u0438\u0435\u043d\u0442\u0435\u043d\u0430\u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043d\u0430\u043a\u043b\u0438\u0435\u043d\u0442\u0435\u043d\u0430\u0441\u0435\u0440\u0432\u0435\u0440\u0435\u0431\u0435\u0437\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043d\u0430\u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043d\u0430\u0441\u0435\u0440\u0432\u0435\u0440\u0435\u0431\u0435\u0437\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0434 \u043f\u043e\u0441\u043b\u0435 \u0441\u0435\u0440\u0432\u0435\u0440 \u0442\u043e\u043b\u0441\u0442\u044b\u0439\u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0431\u044b\u0447\u043d\u043e\u0435\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0442\u043e\u043b\u0441\u0442\u044b\u0439\u043a\u043b\u0438\u0435\u043d\u0442\u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u0435\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0442\u043e\u043d\u043a\u0438\u0439\u043a\u043b\u0438\u0435\u043d\u0442 "},
+contains:[f]};a={className:"function",lexemes:"[A-Za-z\u0410-\u042f\u0430-\u044f\u0451\u0401_][A-Za-z\u0410-\u042f\u0430-\u044f\u0451\u0401_0-9]+",variants:[{begin:"\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430|\u0444\u0443\u043d\u043a\u0446\u0438\u044f",end:"\\)",keywords:"\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f"},{begin:"\u043a\u043e\u043d\u0435\u0446\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b|\u043a\u043e\u043d\u0435\u0446\u0444\u0443\u043d\u043a\u0446\u0438\u0438",
+keywords:"\u043a\u043e\u043d\u0435\u0446\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u043a\u043e\u043d\u0435\u0446\u0444\u0443\u043d\u043a\u0446\u0438\u0438"}],contains:[{begin:"\\(",end:"\\)",endsParent:!0,contains:[{className:"params",lexemes:"[A-Za-z\u0410-\u042f\u0430-\u044f\u0451\u0401_][A-Za-z\u0410-\u042f\u0430-\u044f\u0451\u0401_0-9]+",begin:"[A-Za-z\u0410-\u042f\u0430-\u044f\u0451\u0401_][A-Za-z\u0410-\u042f\u0430-\u044f\u0451\u0401_0-9]+",end:",",excludeEnd:!0,endsWithParent:!0,
+keywords:{keyword:"\u0437\u043d\u0430\u0447",literal:"null \u0438\u0441\u0442\u0438\u043d\u0430 \u043b\u043e\u0436\u044c \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e"},contains:[c,b,e]},f]},a.inherit(a.TITLE_MODE,{begin:"[A-Za-z\u0410-\u042f\u0430-\u044f\u0451\u0401_][A-Za-z\u0410-\u042f\u0430-\u044f\u0451\u0401_0-9]+"})]};return{case_insensitive:!0,lexemes:"[A-Za-z\u0410-\u042f\u0430-\u044f\u0451\u0401_][A-Za-z\u0410-\u042f\u0430-\u044f\u0451\u0401_0-9]+",keywords:{keyword:"\u0434\u0430\u043b\u0435\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c\u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0434\u043b\u044f \u0435\u0441\u043b\u0438 \u0438 \u0438\u0437 \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435 \u0438\u043d\u0430\u0447\u0435\u0435\u0441\u043b\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u043d\u0435\u0446\u0435\u0441\u043b\u0438 \u043a\u043e\u043d\u0435\u0446\u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043a\u043e\u043d\u0435\u0446\u0446\u0438\u043a\u043b\u0430 \u043d\u0435 \u043d\u043e\u0432\u044b\u0439 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043f\u0435\u0440\u0435\u043c \u043f\u043e \u043f\u043e\u043a\u0430 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043f\u0440\u0435\u0440\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0442\u043e\u0433\u0434\u0430 \u0446\u0438\u043a\u043b \u044d\u043a\u0441\u043f\u043e\u0440\u0442 ",
+built_in:"\u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c\u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c\u0441\u0442\u0440\u043e\u043a \u0441\u0438\u043c\u0432\u043e\u043b\u0442\u0430\u0431\u0443\u043b\u044f\u0446\u0438\u0438 ansitooem oemtoansi \u0432\u0432\u0435\u0441\u0442\u0438\u0432\u0438\u0434\u0441\u0443\u0431\u043a\u043e\u043d\u0442\u043e \u0432\u0432\u0435\u0441\u0442\u0438\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0432\u0432\u0435\u0441\u0442\u0438\u043f\u0435\u0440\u0438\u043e\u0434 \u0432\u0432\u0435\u0441\u0442\u0438\u043f\u043b\u0430\u043d\u0441\u0447\u0435\u0442\u043e\u0432 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439\u043f\u043b\u0430\u043d\u0441\u0447\u0435\u0442\u043e\u0432 \u0434\u0430\u0442\u0430\u0433\u043e\u0434 \u0434\u0430\u0442\u0430\u043c\u0435\u0441\u044f\u0446 \u0434\u0430\u0442\u0430\u0447\u0438\u0441\u043b\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u0432\u0441\u0442\u0440\u043e\u043a\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u0438\u0437\u0441\u0442\u0440\u043e\u043a\u0438 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0438\u0431 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043a\u043e\u0434\u0441\u0438\u043c\u0432 \u043a\u043e\u043d\u0433\u043e\u0434\u0430 \u043a\u043e\u043d\u0435\u0446\u043f\u0435\u0440\u0438\u043e\u0434\u0430\u0431\u0438 \u043a\u043e\u043d\u0435\u0446\u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u043e\u0433\u043e\u043f\u0435\u0440\u0438\u043e\u0434\u0430\u0431\u0438 \u043a\u043e\u043d\u0435\u0446\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e\u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 \u043a\u043e\u043d\u043a\u0432\u0430\u0440\u0442\u0430\u043b\u0430 \u043a\u043e\u043d\u043c\u0435\u0441\u044f\u0446\u0430 \u043a\u043e\u043d\u043d\u0435\u0434\u0435\u043b\u0438 \u043b\u043e\u0433 \u043b\u043e\u043310 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u0441\u0443\u0431\u043a\u043e\u043d\u0442\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043d\u0430\u0431\u043e\u0440\u0430\u043f\u0440\u0430\u0432 \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c\u0432\u0438\u0434 \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c\u0441\u0447\u0435\u0442 \u043d\u0430\u0439\u0442\u0438\u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430\u0447\u0430\u043b\u043e\u043f\u0435\u0440\u0438\u043e\u0434\u0430\u0431\u0438 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e\u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 \u043d\u0430\u0447\u0433\u043e\u0434\u0430 \u043d\u0430\u0447\u043a\u0432\u0430\u0440\u0442\u0430\u043b\u0430 \u043d\u0430\u0447\u043c\u0435\u0441\u044f\u0446\u0430 \u043d\u0430\u0447\u043d\u0435\u0434\u0435\u043b\u0438 \u043d\u043e\u043c\u0435\u0440\u0434\u043d\u044f\u0433\u043e\u0434\u0430 \u043d\u043e\u043c\u0435\u0440\u0434\u043d\u044f\u043d\u0435\u0434\u0435\u043b\u0438 \u043d\u043e\u043c\u0435\u0440\u043d\u0435\u0434\u0435\u043b\u0438\u0433\u043e\u0434\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430\u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439\u0436\u0443\u0440\u043d\u0430\u043b\u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439\u043f\u043b\u0430\u043d\u0441\u0447\u0435\u0442\u043e\u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439\u044f\u0437\u044b\u043a \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c\u043e\u043a\u043d\u043e\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043f\u0435\u0440\u0438\u043e\u0434\u0441\u0442\u0440 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0432\u0440\u0435\u043c\u044f\u0442\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0434\u0430\u0442\u0443\u0442\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0442\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043e\u0442\u0431\u043e\u0440\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u043f\u043e\u0437\u0438\u0446\u0438\u044e\u0442\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u043f\u0443\u0441\u0442\u043e\u0435\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0442\u0430 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0430\u0432\u0442\u043e\u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u044c \u043f\u0443\u0441\u0442\u043e\u0435\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u043f\u043e\u0437\u0438\u0446\u0438\u044e\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b\u043d\u0430 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b\u043f\u043e \u0441\u0438\u043c\u0432 \u0441\u043e\u0437\u0434\u0430\u0442\u044c\u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u0442\u0430\u0442\u0443\u0441\u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0441\u0442\u0440\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u0441\u0442\u0440\u043e\u043a \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u043f\u043e\u0437\u0438\u0446\u0438\u044e\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0441\u0447\u0435\u0442\u043f\u043e\u043a\u043e\u0434\u0443 \u0442\u0435\u043a\u0443\u0449\u0435\u0435\u0432\u0440\u0435\u043c\u044f \u0442\u0438\u043f\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0441\u0442\u0440 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0442\u0430\u043d\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0442\u0430\u043f\u043e \u0444\u0438\u043a\u0441\u0448\u0430\u0431\u043b\u043e\u043d \u0448\u0430\u0431\u043b\u043e\u043d acos asin atan base64\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 base64\u0441\u0442\u0440\u043e\u043a\u0430 cos exp log log10 pow sin sqrt tan xml\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 xml\u0441\u0442\u0440\u043e\u043a\u0430 xml\u0442\u0438\u043f xml\u0442\u0438\u043f\u0437\u043d\u0447 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435\u043e\u043a\u043d\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439\u0440\u0435\u0436\u0438\u043c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439\u0440\u0435\u0436\u0438\u043c\u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f\u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u0443\u043b\u0435\u0432\u043e \u0432\u0432\u0435\u0441\u0442\u0438\u0434\u0430\u0442\u0443 \u0432\u0432\u0435\u0441\u0442\u0438\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u0432\u0435\u0441\u0442\u0438\u0441\u0442\u0440\u043e\u043a\u0443 \u0432\u0432\u0435\u0441\u0442\u0438\u0447\u0438\u0441\u043b\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u0447\u0442\u0435\u043d\u0438\u044fxml \u0432\u043e\u043f\u0440\u043e\u0441 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u0433 \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0436\u0443\u0440\u043d\u0430\u043b\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443\u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443\u043f\u0440\u0430\u0432\u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0433\u043e\u0434 \u0434\u0430\u043d\u043d\u044b\u0435\u0444\u043e\u0440\u043c\u044b\u0432\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u0442\u0430 \u0434\u0435\u043d\u044c \u0434\u0435\u043d\u044c\u0433\u043e\u0434\u0430 \u0434\u0435\u043d\u044c\u043d\u0435\u0434\u0435\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c\u043c\u0435\u0441\u044f\u0446 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0434\u0430\u043d\u043d\u044b\u0435\u0434\u043b\u044f\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0440\u0430\u0431\u043e\u0442\u0443\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c\u0440\u0430\u0431\u043e\u0442\u0443\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0432\u043d\u0435\u0448\u043d\u044e\u044e\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u044c\u0441\u043f\u0440\u0430\u0432\u043a\u0443 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044cjson \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044cxml \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c\u0434\u0430\u0442\u0443json \u0437\u0430\u043f\u0438\u0441\u044c\u0436\u0443\u0440\u043d\u0430\u043b\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c\u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u0432\u0434\u0430\u043d\u043d\u044b\u0435\u0444\u043e\u0440\u043c\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u0432\u0441\u0442\u0440\u043e\u043a\u0443\u0432\u043d\u0443\u0442\u0440 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u0432\u0444\u0430\u0439\u043b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u0438\u0437\u0441\u0442\u0440\u043e\u043a\u0438\u0432\u043d\u0443\u0442\u0440 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u0438\u0437\u0444\u0430\u0439\u043b\u0430 \u0438\u0437xml\u0442\u0438\u043f\u0430 \u0438\u043c\u043f\u043e\u0440\u0442\u043c\u043e\u0434\u0435\u043b\u0438xdto \u0438\u043c\u044f\u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430 \u0438\u043c\u044f\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u043f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f\u043e\u0431\u043e\u0448\u0438\u0431\u043a\u0435 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438\u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445\u0444\u0430\u0439\u043b\u043e\u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u0442\u0440\u043e\u043a\u0443 \u043a\u043e\u0434\u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439\u0431\u0430\u0437\u044b \u043a\u043e\u0434\u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043d\u0435\u0446\u0433\u043e\u0434\u0430 \u043a\u043e\u043d\u0435\u0446\u0434\u043d\u044f \u043a\u043e\u043d\u0435\u0446\u043a\u0432\u0430\u0440\u0442\u0430\u043b\u0430 \u043a\u043e\u043d\u0435\u0446\u043c\u0435\u0441\u044f\u0446\u0430 \u043a\u043e\u043d\u0435\u0446\u043c\u0438\u043d\u0443\u0442\u044b \u043a\u043e\u043d\u0435\u0446\u043d\u0435\u0434\u0435\u043b\u0438 \u043a\u043e\u043d\u0435\u0446\u0447\u0430\u0441\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u0431\u0430\u0437\u044b\u0434\u0430\u043d\u043d\u044b\u0445\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0430\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0430 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0434\u0430\u043d\u043d\u044b\u0435\u0444\u043e\u0440\u043c\u044b \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0444\u0430\u0439\u043b \u043a\u0440\u0430\u0442\u043a\u043e\u0435\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043e\u0448\u0438\u0431\u043a\u0438 \u043b\u0435\u0432 \u043c\u0430\u043a\u0441 \u043c\u0435\u0441\u0442\u043d\u043e\u0435\u0432\u0440\u0435\u043c\u044f \u043c\u0435\u0441\u044f\u0446 \u043c\u0438\u043d \u043c\u0438\u043d\u0443\u0442\u0430 \u043c\u043e\u043d\u043e\u043f\u043e\u043b\u044c\u043d\u044b\u0439\u0440\u0435\u0436\u0438\u043c \u043d\u0430\u0439\u0442\u0438 \u043d\u0430\u0439\u0442\u0438\u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0435\u0441\u0438\u043c\u0432\u043e\u043b\u044bxml \u043d\u0430\u0439\u0442\u0438\u043e\u043a\u043d\u043e\u043f\u043e\u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439\u0441\u0441\u044b\u043b\u043a\u0435 \u043d\u0430\u0439\u0442\u0438\u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435\u043d\u0430\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0442\u0438\u043f\u043e\u0441\u0441\u044b\u043b\u043a\u0430\u043c \u043d\u0430\u0439\u0442\u0438\u0444\u0430\u0439\u043b\u044b \u043d\u0430\u0447\u0430\u043b\u043e\u0433\u043e\u0434\u0430 \u043d\u0430\u0447\u0430\u043b\u043e\u0434\u043d\u044f \u043d\u0430\u0447\u0430\u043b\u043e\u043a\u0432\u0430\u0440\u0442\u0430\u043b\u0430 \u043d\u0430\u0447\u0430\u043b\u043e\u043c\u0435\u0441\u044f\u0446\u0430 \u043d\u0430\u0447\u0430\u043b\u043e\u043c\u0438\u043d\u0443\u0442\u044b \u043d\u0430\u0447\u0430\u043b\u043e\u043d\u0435\u0434\u0435\u043b\u0438 \u043d\u0430\u0447\u0430\u043b\u043e\u0447\u0430\u0441\u0430 \u043d\u0430\u0447\u0430\u0442\u044c\u0437\u0430\u043f\u0440\u043e\u0441\u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0430\u0447\u0430\u0442\u044c\u0437\u0430\u043f\u0443\u0441\u043a\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0447\u0430\u0442\u044c\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u0444\u0430\u0439\u043b\u0430 \u043d\u0430\u0447\u0430\u0442\u044c\u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435\u0444\u0430\u0439\u043b\u0430 \u043d\u0430\u0447\u0430\u0442\u044c\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u0432\u043d\u0435\u0448\u043d\u0435\u0439\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043d\u0430\u0447\u0430\u0442\u044c\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u0440\u0430\u0431\u043e\u0442\u044b\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0435\u0439 \u043d\u0430\u0447\u0430\u0442\u044c\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u0440\u0430\u0431\u043e\u0442\u044b\u0441\u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u043d\u0430\u0447\u0430\u0442\u044c\u043f\u043e\u0438\u0441\u043a\u0444\u0430\u0439\u043b\u043e\u0432 \u043d\u0430\u0447\u0430\u0442\u044c\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435\u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445\u0444\u0430\u0439\u043b\u043e\u0432 \u043d\u0430\u0447\u0430\u0442\u044c\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435\u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u0447\u0430\u0442\u044c\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435\u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e\u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430\u0434\u0430\u043d\u043d\u044b\u0445\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0430\u0447\u0430\u0442\u044c\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435\u0444\u0430\u0439\u043b\u043e\u0432 \u043d\u0430\u0447\u0430\u0442\u044c\u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u0435\u0444\u0430\u0439\u043b\u0430 \u043d\u0430\u0447\u0430\u0442\u044c\u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u0435\u0444\u0430\u0439\u043b\u043e\u0432 \u043d\u0430\u0447\u0430\u0442\u044c\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0445\u0434\u0430\u043d\u043d\u044b\u0445\u0438\u0437\u0444\u0430\u0439\u043b\u0430 \u043d\u0430\u0447\u0430\u0442\u044c\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 \u043d\u0430\u0447\u0430\u0442\u044c\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e \u043d\u0430\u0447\u0430\u0442\u044c\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\u0444\u0430\u0439\u043b\u043e\u0432 \u043d\u0430\u0447\u0430\u0442\u044c\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443\u0432\u043d\u0435\u0448\u043d\u0435\u0439\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043d\u0430\u0447\u0430\u0442\u044c\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u0440\u0430\u0431\u043e\u0442\u044b\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0435\u0439 \u043d\u0430\u0447\u0430\u0442\u044c\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u0440\u0430\u0431\u043e\u0442\u044b\u0441\u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u043d\u0435\u0434\u0435\u043b\u044f\u0433\u043e\u0434\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043d\u043e\u043c\u0435\u0440\u0441\u0435\u0430\u043d\u0441\u0430\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439\u0431\u0430\u0437\u044b \u043d\u043e\u043c\u0435\u0440\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439\u0431\u0430\u0437\u044b \u043d\u0440\u0435\u0433 \u043d\u0441\u0442\u0440 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c\u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u044e\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c\u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430\u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c\u0444\u0430\u0439\u043b\u044b \u043e\u043a\u0440 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043e\u0448\u0438\u0431\u043a\u0438 \u043e\u043f\u043e\u0432\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u043e\u0432\u0435\u0441\u0442\u0438\u0442\u044c\u043e\u0431\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a\u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u044c\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u044c\u0438\u043d\u0434\u0435\u043a\u0441\u0441\u043f\u0440\u0430\u0432\u043a\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u044c\u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435\u0441\u043f\u0440\u0430\u0432\u043a\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u044c\u0441\u043f\u0440\u0430\u0432\u043a\u0443 \u043e\u0442\u043a\u0440\u044b\u0442\u044c\u0444\u043e\u0440\u043c\u0443 \u043e\u0442\u043a\u0440\u044b\u0442\u044c\u0444\u043e\u0440\u043c\u0443\u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c\u0436\u0443\u0440\u043d\u0430\u043b\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b\u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043f\u0435\u0440\u0435\u0439\u0442\u0438\u043f\u043e\u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439\u0441\u0441\u044b\u043b\u043a\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c\u0444\u0430\u0439\u043b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0432\u043d\u0435\u0448\u043d\u044e\u044e\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a\u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u0440\u0430\u0431\u043e\u0442\u044b\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0435\u0439 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u0440\u0430\u0431\u043e\u0442\u044b\u0441\u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0432\u0432\u043e\u0434\u0434\u0430\u0442\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0432\u0432\u043e\u0434\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0432\u0432\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0432\u0432\u043e\u0434\u0447\u0438\u0441\u043b\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0432\u043e\u043f\u0440\u043e\u0441 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e\u043e\u0431\u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u043d\u0430\u043a\u0430\u0440\u0442\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u0435\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u0435\u0438\u043c\u044f\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044ccom\u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044cxml\u0442\u0438\u043f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0430\u0434\u0440\u0435\u0441\u043f\u043e\u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443\u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0432\u0440\u0435\u043c\u044f\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\u0441\u043f\u044f\u0449\u0435\u0433\u043e\u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0432\u0440\u0435\u043c\u044f\u0437\u0430\u0441\u044b\u043f\u0430\u043d\u0438\u044f\u043f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0433\u043e\u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0432\u0440\u0435\u043c\u044f\u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0434\u0430\u043d\u043d\u044b\u0435\u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0435\u043a\u043e\u0434\u044b\u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0435\u0447\u0430\u0441\u043e\u0432\u044b\u0435\u043f\u043e\u044f\u0441\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043e\u0442\u0431\u043e\u0440\u0430\u0436\u0443\u0440\u043d\u0430\u043b\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0438\u0437\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0438\u043c\u044f\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e\u0444\u0430\u0439\u043b\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0438\u043c\u044f\u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e\u044d\u043a\u0440\u0430\u043d\u043e\u0432\u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u0436\u0443\u0440\u043d\u0430\u043b\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0436\u0443\u0440\u043d\u0430\u043b\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u043a\u0440\u0430\u0442\u043a\u0438\u0439\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u043c\u0430\u043a\u0435\u0442\u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u043c\u0430\u0441\u043a\u0443\u0432\u0441\u0435\u0444\u0430\u0439\u043b\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u043c\u0430\u0441\u043a\u0443\u0432\u0441\u0435\u0444\u0430\u0439\u043b\u044b\u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u043c\u0430\u0441\u043a\u0443\u0432\u0441\u0435\u0444\u0430\u0439\u043b\u044b\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043f\u043e\u0430\u0434\u0440\u0435\u0441\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e\u0434\u043b\u0438\u043d\u0443\u043f\u0430\u0440\u043e\u043b\u0435\u0439\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u0443\u044e\u0441\u0441\u044b\u043b\u043a\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u0443\u044e\u0441\u0441\u044b\u043b\u043a\u0443\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439\u0431\u0430\u0437\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438\u0431\u0430\u0437\u044b\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u043f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445\u0434\u0430\u043d\u043d\u044b\u0445\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439\u0431\u0430\u0437\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u043e\u0431\u0449\u0438\u0439\u043c\u0430\u043a\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u043e\u0431\u0449\u0443\u044e\u0444\u043e\u0440\u043c\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u043e\u043a\u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0443\u044e\u043e\u0442\u043c\u0435\u0442\u043a\u0443\u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e\u0440\u0435\u0436\u0438\u043c\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445\u043e\u043f\u0446\u0438\u0439\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u043f\u043e\u043b\u043d\u043e\u0435\u0438\u043c\u044f\u043f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445\u0441\u0441\u044b\u043b\u043e\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443\u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438\u043f\u0430\u0440\u043e\u043b\u0435\u0439\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c\u043f\u0443\u0442\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c\u043f\u0443\u0442\u0438\u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c\u043f\u0443\u0442\u0438\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u0435\u0430\u043d\u0441\u044b\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439\u0431\u0430\u0437\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439\u0431\u0430\u0437\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435\u043e\u0431\u044a\u0435\u043a\u0442\u0430\u0438\u0444\u043e\u0440\u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u043e\u0441\u0442\u0430\u0432\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430odata \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f\u0431\u0430\u0437\u044b\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0442\u0435\u043a\u0443\u0449\u0438\u0439\u0441\u0435\u0430\u043d\u0441\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439\u0431\u0430\u0437\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0444\u0430\u0439\u043b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0444\u0430\u0439\u043b\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0444\u043e\u0440\u043c\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0443\u044e\u043e\u043f\u0446\u0438\u044e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0443\u044e\u043e\u043f\u0446\u0438\u044e\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0447\u0430\u0441\u043e\u0432\u043e\u0439\u043f\u043e\u044f\u0441\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439\u0431\u0430\u0437\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\u043e\u0441 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c\u0432\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c\u0444\u0430\u0439\u043b \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c\u0444\u0430\u0439\u043b\u044b \u043f\u0440\u0430\u0432 \u043f\u0440\u0430\u0432\u043e\u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043a\u043e\u0434\u0430\u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043f\u0440\u0430\u0432\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0436\u0443\u0440\u043d\u0430\u043b\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u0447\u0430\u0441\u043e\u0432\u043e\u0433\u043e\u043f\u043e\u044f\u0441\u0430 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u0442\u044c\u0440\u0430\u0431\u043e\u0442\u0443\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439\u0440\u0435\u0436\u0438\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c\u0432\u044b\u0437\u043e\u0432 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044cjson \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044cxml \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c\u0434\u0430\u0442\u0443json \u043f\u0443\u0441\u0442\u0430\u044f\u0441\u0442\u0440\u043e\u043a\u0430 \u0440\u0430\u0431\u043e\u0447\u0438\u0439\u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0434\u0430\u043d\u043d\u044b\u0445\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0434\u0430\u043d\u043d\u044b\u0435\u0434\u043b\u044f\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c\u0444\u0430\u0439\u043b \u0440\u0430\u0437\u043e\u0440\u0432\u0430\u0442\u044c\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435\u0441\u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c\u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0441\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u0442\u0440\u043e\u043a\u0443 \u0440\u043e\u043b\u044c\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0441\u0435\u043a\u0443\u043d\u0434\u0430 \u0441\u0438\u0433\u043d\u0430\u043b \u0441\u0438\u043c\u0432\u043e\u043b \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0436\u0443\u0440\u043d\u0430\u043b\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435\u043b\u0435\u0442\u043d\u0435\u0433\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c\u0431\u0443\u0444\u0435\u0440\u044b\u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0445\u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u0437\u0434\u0430\u0442\u044c\u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0441\u043e\u0437\u0434\u0430\u0442\u044c\u0444\u0430\u0431\u0440\u0438\u043a\u0443xdto \u0441\u043e\u043a\u0440\u043b \u0441\u043e\u043a\u0440\u043b\u043f \u0441\u043e\u043a\u0440\u043f \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441\u0440\u0435\u0434 \u0441\u0442\u0440\u0434\u043b\u0438\u043d\u0430 \u0441\u0442\u0440\u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f\u043d\u0430 \u0441\u0442\u0440\u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0442\u0440\u043d\u0430\u0439\u0442\u0438 \u0441\u0442\u0440\u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f\u0441 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441\u0442\u0440\u043e\u043a\u0430\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439\u0431\u0430\u0437\u044b \u0441\u0442\u0440\u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u0442\u0440\u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0441\u0442\u0440\u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0441\u0442\u0440\u0447\u0438\u0441\u043b\u043e\u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0439 \u0441\u0442\u0440\u0447\u0438\u0441\u043b\u043e\u0441\u0442\u0440\u043e\u043a \u0441\u0442\u0440\u0448\u0430\u0431\u043b\u043e\u043d \u0442\u0435\u043a\u0443\u0449\u0430\u044f\u0434\u0430\u0442\u0430 \u0442\u0435\u043a\u0443\u0449\u0430\u044f\u0434\u0430\u0442\u0430\u0441\u0435\u0430\u043d\u0441\u0430 \u0442\u0435\u043a\u0443\u0449\u0430\u044f\u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u0430\u044f\u0434\u0430\u0442\u0430 \u0442\u0435\u043a\u0443\u0449\u0430\u044f\u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u0430\u044f\u0434\u0430\u0442\u0430\u0432\u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445 \u0442\u0435\u043a\u0443\u0449\u0438\u0439\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0438\u0439\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e\u0448\u0440\u0438\u0444\u0442\u0430\u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0438\u0439\u043a\u043e\u0434\u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0439\u0440\u0435\u0436\u0438\u043c\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439\u044f\u0437\u044b\u043a \u0442\u0435\u043a\u0443\u0449\u0438\u0439\u044f\u0437\u044b\u043a\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0438\u043f \u0442\u0438\u043f\u0437\u043d\u0447 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f\u0430\u043a\u0442\u0438\u0432\u043d\u0430 \u0442\u0440\u0435\u0433 \u0443\u0434\u0430\u043b\u0438\u0442\u044c\u0434\u0430\u043d\u043d\u044b\u0435\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439\u0431\u0430\u0437\u044b \u0443\u0434\u0430\u043b\u0438\u0442\u044c\u0438\u0437\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0443\u0434\u0430\u043b\u0438\u0442\u044c\u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0443\u0434\u0430\u043b\u0438\u0442\u044c\u0444\u0430\u0439\u043b\u044b \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0435\u0432\u0440\u0435\u043c\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439\u0440\u0435\u0436\u0438\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439\u0440\u0435\u0436\u0438\u043c\u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f\u0434\u0430\u043d\u043d\u044b\u0445 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443\u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0432\u043d\u0435\u0448\u043d\u044e\u044e\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0432\u0440\u0435\u043c\u044f\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\u0441\u043f\u044f\u0449\u0435\u0433\u043e\u0441\u0435\u0430\u043d\u0441\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0432\u0440\u0435\u043c\u044f\u0437\u0430\u0441\u044b\u043f\u0430\u043d\u0438\u044f\u043f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0433\u043e\u0441\u0435\u0430\u043d\u0441\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0432\u0440\u0435\u043c\u044f\u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u0436\u0443\u0440\u043d\u0430\u043b\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0436\u0443\u0440\u043d\u0430\u043b\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u043a\u0440\u0430\u0442\u043a\u0438\u0439\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e\u0434\u043b\u0438\u043d\u0443\u043f\u0430\u0440\u043e\u043b\u0435\u0439\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u043c\u043e\u043d\u043e\u043f\u043e\u043b\u044c\u043d\u044b\u0439\u0440\u0435\u0436\u0438\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u043f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445\u0434\u0430\u043d\u043d\u044b\u0445\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439\u0431\u0430\u0437\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e\u0440\u0435\u0436\u0438\u043c\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445\u043e\u043f\u0446\u0438\u0439\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439\u0440\u0435\u0436\u0438\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443\u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438\u043f\u0430\u0440\u043e\u043b\u0435\u0439\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u0440\u0430\u0431\u043e\u0442\u044b\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0435\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u0440\u0430\u0431\u043e\u0442\u044b\u0441\u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435\u0441\u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c\u0434\u0430\u043d\u043d\u044b\u0445 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435\u043e\u0431\u044a\u0435\u043a\u0442\u0430\u0438\u0444\u043e\u0440\u043c\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u043e\u0441\u0442\u0430\u0432\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430odata \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0447\u0430\u0441\u043e\u0432\u043e\u0439\u043f\u043e\u044f\u0441\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439\u0431\u0430\u0437\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0447\u0430\u0441\u043e\u0432\u043e\u0439\u043f\u043e\u044f\u0441\u0441\u0435\u0430\u043d\u0441\u0430 \u0444\u043e\u0440\u043c\u0430\u0442 \u0446\u0435\u043b \u0447\u0430\u0441 \u0447\u0430\u0441\u043e\u0432\u043e\u0439\u043f\u043e\u044f\u0441 \u0447\u0430\u0441\u043e\u0432\u043e\u0439\u043f\u043e\u044f\u0441\u0441\u0435\u0430\u043d\u0441\u0430 \u0447\u0438\u0441\u043b\u043e \u0447\u0438\u0441\u043b\u043e\u043f\u0440\u043e\u043f\u0438\u0441\u044c\u044e \u044d\u0442\u043e\u0430\u0434\u0440\u0435\u0441\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 ws\u0441\u0441\u044b\u043b\u043a\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0430\u043a\u0435\u0442\u043e\u0432\u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0441\u0442\u0438\u043b\u0435\u0439 \u0431\u0438\u0437\u043d\u0435\u0441\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0432\u043d\u0435\u0448\u043d\u0438\u0435\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u043d\u0435\u0448\u043d\u0438\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0435\u043e\u0442\u0447\u0435\u0442\u044b \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435\u043f\u043e\u043a\u0443\u043f\u043a\u0438 \u0433\u043b\u0430\u0432\u043d\u044b\u0439\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0433\u043b\u0430\u0432\u043d\u044b\u0439\u0441\u0442\u0438\u043b\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0435\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0436\u0443\u0440\u043d\u0430\u043b\u044b\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f\u043e\u0431\u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u0440\u0430\u0431\u043e\u0447\u0435\u0439\u0434\u0430\u0442\u044b \u0438\u0441\u0442\u043e\u0440\u0438\u044f\u0440\u0430\u0431\u043e\u0442\u044b\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0438\u043e\u0442\u0431\u043e\u0440\u0430 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u0440\u0435\u043a\u043b\u0430\u043c\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439 \u043e\u0442\u0447\u0435\u0442\u044b \u043f\u0430\u043d\u0435\u043b\u044c\u0437\u0430\u0434\u0430\u0447\u043e\u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b\u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043f\u043b\u0430\u043d\u044b\u0432\u0438\u0434\u043e\u0432\u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u043f\u043b\u0430\u043d\u044b\u0432\u0438\u0434\u043e\u0432\u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a \u043f\u043b\u0430\u043d\u044b\u043e\u0431\u043c\u0435\u043d\u0430 \u043f\u043b\u0430\u043d\u044b\u0441\u0447\u0435\u0442\u043e\u0432 \u043f\u043e\u043b\u043d\u043e\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439\u043f\u043e\u0438\u0441\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439\u0431\u0430\u0437\u044b \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445\u043f\u043e\u043a\u0443\u043f\u043e\u043a \u0440\u0430\u0431\u043e\u0447\u0430\u044f\u0434\u0430\u0442\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b\u0431\u0443\u0445\u0433\u0430\u043b\u0442\u0435\u0440\u0438\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b\u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b\u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b\u0441\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u0440\u0435\u0433\u043b\u0430\u043c\u0435\u043d\u0442\u043d\u044b\u0435\u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440xdto \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u0433\u0435\u043e\u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0443\u043b\u044c\u0442\u0438\u043c\u0435\u0434\u0438\u0430 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0440\u0435\u043a\u043b\u0430\u043c\u044b \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043f\u043e\u0447\u0442\u044b \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0438\u0438 \u0444\u0430\u0431\u0440\u0438\u043a\u0430xdto \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0435\u043f\u043e\u0442\u043e\u043a\u0438 \u0444\u043e\u043d\u043e\u0432\u044b\u0435\u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432\u043e\u0442\u0447\u0435\u0442\u043e\u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a\u0434\u0430\u043d\u043d\u044b\u0445\u0444\u043e\u0440\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u043e\u0431\u0449\u0438\u0445\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445\u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a\u043e\u0442\u0447\u0435\u0442\u043e\u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a ",
+class:"web\u0446\u0432\u0435\u0442\u0430 windows\u0446\u0432\u0435\u0442\u0430 windows\u0448\u0440\u0438\u0444\u0442\u044b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u0440\u0430\u043c\u043a\u0438\u0441\u0442\u0438\u043b\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0446\u0432\u0435\u0442\u0430\u0441\u0442\u0438\u043b\u044f \u0448\u0440\u0438\u0444\u0442\u044b\u0441\u0442\u0438\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435\u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u0434\u0430\u043d\u043d\u044b\u0445\u0444\u043e\u0440\u043c\u044b\u0432\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0430\u0432\u0442\u043e\u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u044f\u0432\u0444\u043e\u0440\u043c\u0435 \u0430\u0432\u0442\u043e\u0440\u0430\u0437\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435\u0441\u0435\u0440\u0438\u0439 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\u0438\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0432\u044b\u0441\u043e\u0442\u043e\u0439\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0430\u044f\u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430\u0444\u043e\u0440\u043c\u044b \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u0438\u0434\u0433\u0440\u0443\u043f\u043f\u044b\u0444\u043e\u0440\u043c\u044b \u0432\u0438\u0434\u0434\u0435\u043a\u043e\u0440\u0430\u0446\u0438\u0438\u0444\u043e\u0440\u043c\u044b \u0432\u0438\u0434\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0444\u043e\u0440\u043c\u044b \u0432\u0438\u0434\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0438\u0434\u043a\u043d\u043e\u043f\u043a\u0438\u0444\u043e\u0440\u043c\u044b \u0432\u0438\u0434\u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044f \u0432\u0438\u0434\u043f\u043e\u0434\u043f\u0438\u0441\u0435\u0439\u043a\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0435 \u0432\u0438\u0434\u043f\u043e\u043b\u044f\u0444\u043e\u0440\u043c\u044b \u0432\u0438\u0434\u0444\u043b\u0430\u0436\u043a\u0430 \u0432\u043b\u0438\u044f\u043d\u0438\u0435\u0440\u0430\u0437\u043c\u0435\u0440\u0430\u043d\u0430\u043f\u0443\u0437\u044b\u0440\u0435\u043a\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430\u043a\u043e\u043b\u043e\u043d\u043e\u043a \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430\u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u0445\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\u0444\u043e\u0440\u043c\u044b \u0433\u0440\u0443\u043f\u043f\u044b\u0438\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439\u0440\u0435\u0436\u0438\u043c\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043c\u0435\u0436\u0434\u0443\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438\u0444\u043e\u0440\u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u0432\u044b\u0432\u043e\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043f\u043e\u043b\u043e\u0441\u044b\u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0435\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u0442\u043e\u0447\u043a\u0438\u0431\u0438\u0440\u0436\u0435\u0432\u043e\u0439\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0438\u0441\u0442\u043e\u0440\u0438\u044f\u0432\u044b\u0431\u043e\u0440\u0430\u043f\u0440\u0438\u0432\u0432\u043e\u0434\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439\u043e\u0441\u0438\u0442\u043e\u0447\u0435\u043a\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0440\u0430\u0437\u043c\u0435\u0440\u0430\u043f\u0443\u0437\u044b\u0440\u044c\u043a\u0430\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u0433\u0440\u0443\u043f\u043f\u044b\u043a\u043e\u043c\u0430\u043d\u0434 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0441\u0435\u0440\u0438\u0439 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u0434\u0435\u0440\u0435\u0432\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u0441\u043f\u0438\u0441\u043a\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u0442\u0435\u043a\u0441\u0442\u0430\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f\u0434\u0435\u043d\u0434\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f\u043c\u0435\u0442\u043e\u043a\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f\u043c\u0435\u0442\u043e\u043a\u0441\u0432\u043e\u0434\u043d\u043e\u0439\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0444\u043e\u0440\u043c\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u0432\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u0432\u043b\u0435\u0433\u0435\u043d\u0434\u0435\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u0433\u0440\u0443\u043f\u043f\u044b\u043a\u043d\u043e\u043f\u043e\u043a \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u0448\u043a\u0430\u043b\u044b\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439\u0441\u0432\u043e\u0434\u043d\u043e\u0439\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0438\u0437\u043c\u0435\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b\u0433\u0430\u043d\u0442\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043a\u043d\u043e\u043f\u043a\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043a\u043d\u043e\u043f\u043a\u0438\u0432\u044b\u0431\u043e\u0440\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0439\u0444\u043e\u0440\u043c\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043e\u0431\u044b\u0447\u043d\u043e\u0439\u0433\u0440\u0443\u043f\u043f\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439\u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u043e\u0439\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043f\u0430\u043d\u0435\u043b\u0438\u043f\u043e\u0438\u0441\u043a\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f\u043f\u0440\u0438\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0438\u043f\u043e\u043b\u043e\u0441\u044b\u0440\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0444\u043e\u0440\u043c\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u0442\u0435\u043a\u0441\u0442\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b\u0433\u0430\u043d\u0442\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u043e\u0431\u044b\u0447\u043d\u043e\u0439\u0433\u0440\u0443\u043f\u043f\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u0444\u0438\u0433\u0443\u0440\u044b\u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u0430\u043b\u0438\u0442\u0440\u0430\u0446\u0432\u0435\u0442\u043e\u0432\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043e\u0431\u044b\u0447\u043d\u043e\u0439\u0433\u0440\u0443\u043f\u043f\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430\u0434\u0435\u043d\u0434\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b\u0433\u0430\u043d\u0442\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430\u0441\u0432\u043e\u0434\u043d\u043e\u0439\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u043f\u043e\u0438\u0441\u043a\u0432\u0442\u0430\u0431\u043b\u0438\u0446\u0435\u043f\u0440\u0438\u0432\u0432\u043e\u0434\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0444\u043e\u0440\u043c\u044b \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438\u043a\u043d\u043e\u043f\u043a\u0438\u0444\u043e\u0440\u043c\u044b \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439\u0441\u0445\u0435\u043c\u044b \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439\u043f\u0430\u043d\u0435\u043b\u0438\u0444\u043e\u0440\u043c\u044b \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439\u043f\u0430\u043d\u0435\u043b\u0438\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0444\u043e\u0440\u043c\u044b \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043e\u043f\u043e\u0440\u043d\u043e\u0439\u0442\u043e\u0447\u043a\u0438\u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043f\u043e\u0434\u043f\u0438\u0441\u0435\u0439\u043a\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043f\u043e\u0434\u043f\u0438\u0441\u0435\u0439\u0448\u043a\u0430\u043b\u044b\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439\u0438\u0437\u043c\u0435\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0441\u0442\u0440\u043e\u043a\u0438\u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0442\u0435\u043a\u0441\u0442\u0430\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439\u043b\u0438\u043d\u0438\u0438 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u043f\u043e\u0438\u0441\u043a\u043e\u043c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0448\u043a\u0430\u043b\u044b\u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u043e\u0440\u044f\u0434\u043e\u043a\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0442\u043e\u0447\u0435\u043a\u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439\u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043f\u043e\u0440\u044f\u0434\u043e\u043a\u0441\u0435\u0440\u0438\u0439\u0432\u043b\u0435\u0433\u0435\u043d\u0434\u0435\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0440\u0430\u0437\u043c\u0435\u0440\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u0448\u043a\u0430\u043b\u044b\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0440\u0430\u0441\u0442\u044f\u0433\u0438\u0432\u0430\u043d\u0438\u0435\u043f\u043e\u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b\u0433\u0430\u043d\u0442\u0430 \u0440\u0435\u0436\u0438\u043c\u0430\u0432\u0442\u043e\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0435\u0436\u0438\u043c\u0432\u0432\u043e\u0434\u0430\u0441\u0442\u0440\u043e\u043a\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0440\u0435\u0436\u0438\u043c\u0432\u044b\u0431\u043e\u0440\u0430\u043d\u0435\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f\u0434\u0430\u0442\u044b \u0440\u0435\u0436\u0438\u043c\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f\u0441\u0442\u0440\u043e\u043a\u0438\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0440\u0435\u0436\u0438\u043c\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0440\u0435\u0436\u0438\u043c\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0440\u0435\u0436\u0438\u043c\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0433\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0436\u0438\u043c\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f\u0434\u0438\u0430\u043b\u043e\u0433\u0430\u043f\u0435\u0447\u0430\u0442\u0438 \u0440\u0435\u0436\u0438\u043c\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0440\u0435\u0436\u0438\u043c\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0440\u0435\u0436\u0438\u043c\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e\u043e\u043a\u043d\u0430\u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0440\u0435\u0436\u0438\u043c\u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f\u043e\u043a\u043d\u0430\u0444\u043e\u0440\u043c\u044b \u0440\u0435\u0436\u0438\u043c\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u0436\u0438\u043c\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439\u0441\u0445\u0435\u043c\u044b \u0440\u0435\u0436\u0438\u043c\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439\u0441\u0435\u0440\u0438\u0438 \u0440\u0435\u0436\u0438\u043c\u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438\u0441\u0435\u0442\u043a\u0438\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439\u0441\u0445\u0435\u043c\u044b \u0440\u0435\u0436\u0438\u043c\u043f\u043e\u043b\u0443\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u0438\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0440\u0435\u0436\u0438\u043c\u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0440\u0435\u0436\u0438\u043c\u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f\u043d\u0430\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0440\u0435\u0436\u0438\u043c\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\u043a\u043e\u043b\u043e\u043d\u043a\u0438 \u0440\u0435\u0436\u0438\u043c\u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u044f\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0440\u0435\u0436\u0438\u043c\u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u044f\u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0440\u0435\u0436\u0438\u043c\u0441\u043f\u0438\u0441\u043a\u0430\u0437\u0430\u0434\u0430\u0447 \u0441\u043a\u0432\u043e\u0437\u043d\u043e\u0435\u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u0434\u0430\u043d\u043d\u044b\u0445\u0444\u043e\u0440\u043c\u044b\u0432\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\u0442\u0435\u043a\u0441\u0442\u0430\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u0448\u043a\u0430\u043b\u044b\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u044e\u0449\u0435\u0433\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f\u0433\u0440\u0443\u043f\u043f\u0430\u043a\u043e\u043c\u0430\u043d\u0434 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435\u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u044f\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441\u0442\u0438\u043b\u044c\u0441\u0442\u0440\u0435\u043b\u043a\u0438 \u0442\u0438\u043f\u0430\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0430\u0446\u0438\u0438\u043b\u0438\u043d\u0438\u0438\u0442\u0440\u0435\u043d\u0434\u0430\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0442\u0438\u043f\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0442\u0438\u043f\u0435\u0434\u0438\u043d\u0438\u0446\u044b\u0448\u043a\u0430\u043b\u044b\u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0442\u0438\u043f\u0438\u043c\u043f\u043e\u0440\u0442\u0430\u0441\u0435\u0440\u0438\u0439\u0441\u043b\u043e\u044f\u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439\u0441\u0445\u0435\u043c\u044b \u0442\u0438\u043f\u043b\u0438\u043d\u0438\u0438\u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439\u0441\u0445\u0435\u043c\u044b \u0442\u0438\u043f\u043b\u0438\u043d\u0438\u0438\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0442\u0438\u043f\u043c\u0430\u0440\u043a\u0435\u0440\u0430\u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439\u0441\u0445\u0435\u043c\u044b \u0442\u0438\u043f\u043c\u0430\u0440\u043a\u0435\u0440\u0430\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0442\u0438\u043f\u043e\u0431\u043b\u0430\u0441\u0442\u0438\u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u0434\u0430\u043d\u043d\u044b\u0445\u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439\u0441\u0445\u0435\u043c\u044b \u0442\u0438\u043f\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0441\u0435\u0440\u0438\u0438\u0441\u043b\u043e\u044f\u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439\u0441\u0445\u0435\u043c\u044b \u0442\u0438\u043f\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0442\u043e\u0447\u0435\u0447\u043d\u043e\u0433\u043e\u043e\u0431\u044a\u0435\u043a\u0442\u0430\u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439\u0441\u0445\u0435\u043c\u044b \u0442\u0438\u043f\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0448\u043a\u0430\u043b\u044b\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u0435\u0433\u0435\u043d\u0434\u044b\u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439\u0441\u0445\u0435\u043c\u044b \u0442\u0438\u043f\u043f\u043e\u0438\u0441\u043a\u0430\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439\u0441\u0445\u0435\u043c\u044b \u0442\u0438\u043f\u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438\u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439\u0441\u0445\u0435\u043c\u044b \u0442\u0438\u043f\u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f\u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f\u0440\u0435\u043a\u0432\u0438\u0437\u0438\u0442\u043e\u0432\u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u0440\u0430\u043c\u043a\u0438\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u0441\u0432\u043e\u0434\u043d\u043e\u0439\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0442\u0438\u043f\u0441\u0432\u044f\u0437\u0438\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b\u0433\u0430\u043d\u0442\u0430 \u0442\u0438\u043f\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439\u043f\u043e\u0441\u0435\u0440\u0438\u044f\u043c\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0442\u0438\u043f\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f\u0442\u043e\u0447\u0435\u043a\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0442\u0438\u043f\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439\u043b\u0438\u043d\u0438\u0438 \u0442\u0438\u043f\u0441\u0442\u043e\u0440\u043e\u043d\u044b\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439\u0441\u0445\u0435\u043c\u044b \u0442\u0438\u043f\u0444\u043e\u0440\u043c\u044b\u043e\u0442\u0447\u0435\u0442\u0430 \u0442\u0438\u043f\u0448\u043a\u0430\u043b\u044b\u0440\u0430\u0434\u0430\u0440\u043d\u043e\u0439\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0444\u0430\u043a\u0442\u043e\u0440\u043b\u0438\u043d\u0438\u0438\u0442\u0440\u0435\u043d\u0434\u0430\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0444\u0438\u0433\u0443\u0440\u0430\u043a\u043d\u043e\u043f\u043a\u0438 \u0444\u0438\u0433\u0443\u0440\u044b\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439\u0441\u0445\u0435\u043c\u044b \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u044f\u0432\u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0434\u043d\u044f\u0448\u043a\u0430\u043b\u044b\u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0448\u0438\u0440\u0438\u043d\u0430\u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u0445\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\u0444\u043e\u0440\u043c\u044b \u0432\u0438\u0434\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f\u0431\u0443\u0445\u0433\u0430\u043b\u0442\u0435\u0440\u0438\u0438 \u0432\u0438\u0434\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f\u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u044f \u0432\u0438\u0434\u043f\u0435\u0440\u0438\u043e\u0434\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u0432\u0438\u0434\u0441\u0447\u0435\u0442\u0430 \u0432\u0438\u0434\u0442\u043e\u0447\u043a\u0438\u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430\u0431\u0438\u0437\u043d\u0435\u0441\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u0430\u0433\u0440\u0435\u0433\u0430\u0442\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u0433\u0440\u0443\u043f\u043f\u0438\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u0440\u0435\u0436\u0438\u043c\u0430\u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u0441\u0440\u0435\u0437\u0430 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u043d\u043e\u0441\u0442\u044c\u0430\u0433\u0440\u0435\u0433\u0430\u0442\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u0436\u0438\u043c\u0430\u0432\u0442\u043e\u0432\u0440\u0435\u043c\u044f \u0440\u0435\u0436\u0438\u043c\u0437\u0430\u043f\u0438\u0441\u0438\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0440\u0435\u0436\u0438\u043c\u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0430\u0432\u0442\u043e\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0439\u043d\u043e\u043c\u0435\u0440\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438\u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0438\u0442\u043e\u0433\u043e\u0432\u043a\u043e\u043b\u043e\u043d\u043e\u043a\u0441\u0432\u043e\u0434\u043d\u043e\u0439\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0438\u0442\u043e\u0433\u043e\u0432\u0441\u0442\u0440\u043e\u043a\u0441\u0432\u043e\u0434\u043d\u043e\u0439\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0442\u0435\u043a\u0441\u0442\u0430\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438\u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0447\u0442\u0435\u043d\u0438\u044f\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439\u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0442\u0438\u043f\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439\u043f\u0435\u0447\u0430\u0442\u0438 \u0442\u0438\u043f\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\u043e\u0431\u043b\u0430\u0441\u0442\u0438\u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0442\u0438\u043f\u043a\u0443\u0440\u0441\u043e\u0440\u043e\u0432\u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0442\u0438\u043f\u043b\u0438\u043d\u0438\u0438\u0440\u0438\u0441\u0443\u043d\u043a\u0430\u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0442\u0438\u043f\u043b\u0438\u043d\u0438\u0438\u044f\u0447\u0435\u0439\u043a\u0438\u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0442\u0438\u043f\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430\u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0442\u0438\u043f\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f\u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0442\u0438\u043f\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043b\u0438\u043d\u0438\u0439\u0441\u0432\u043e\u0434\u043d\u043e\u0439\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0442\u0438\u043f\u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f\u0442\u0435\u043a\u0441\u0442\u0430\u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0442\u0438\u043f\u0440\u0438\u0441\u0443\u043d\u043a\u0430\u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0442\u0438\u043f\u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f\u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0442\u0438\u043f\u0443\u0437\u043e\u0440\u0430\u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0442\u0438\u043f\u0444\u0430\u0439\u043b\u0430\u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u043f\u0435\u0447\u0430\u0442\u0438 \u0447\u0435\u0440\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435\u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u0432\u0440\u0435\u043c\u0435\u043d\u0438\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430 \u0442\u0438\u043f\u0444\u0430\u0439\u043b\u0430\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u043e\u0431\u0445\u043e\u0434\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0442\u0438\u043f\u0437\u0430\u043f\u0438\u0441\u0438\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432\u0438\u0434\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438\u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044f\u043e\u0442\u0447\u0435\u0442\u0430 \u0442\u0438\u043f\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f\u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044f\u043e\u0442\u0447\u0435\u0442\u0430 \u0442\u0438\u043f\u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f\u0438\u0442\u043e\u0433\u043e\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u043a\u0444\u0430\u0439\u043b\u0443 \u0440\u0435\u0436\u0438\u043c\u0434\u0438\u0430\u043b\u043e\u0433\u0430\u0432\u044b\u0431\u043e\u0440\u0430\u0444\u0430\u0439\u043b\u0430 \u0440\u0435\u0436\u0438\u043c\u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f\u0444\u0430\u0439\u043b\u0430 \u0442\u0438\u043f\u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f\u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044f\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432\u0438\u0434\u0434\u0430\u043d\u043d\u044b\u0445\u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043c\u0435\u0442\u043e\u0434\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0438\u043f\u0435\u0434\u0438\u043d\u0438\u0446\u044b\u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430\u0432\u0440\u0435\u043c\u0435\u043d\u0438\u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\u0442\u0430\u0431\u043b\u0438\u0446\u044b\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f\u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0445\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439\u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u0434\u0430\u043d\u043d\u044b\u0445\u043f\u043e\u0438\u0441\u043a\u0430\u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0446\u0438\u0439 \u0442\u0438\u043f\u043a\u043e\u043b\u043e\u043d\u043a\u0438\u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445\u0434\u0435\u0440\u0435\u0432\u043e\u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u043a\u043e\u043b\u043e\u043d\u043a\u0438\u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0438\u043f\u043a\u043e\u043b\u043e\u043d\u043a\u0438\u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445\u043e\u0431\u0449\u0430\u044f\u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u0442\u0438\u043f\u043a\u043e\u043b\u043e\u043d\u043a\u0438\u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445\u043f\u043e\u0438\u0441\u043a\u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0446\u0438\u0439 \u0442\u0438\u043f\u043a\u043e\u043b\u043e\u043d\u043a\u0438\u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445\u043f\u043e\u0438\u0441\u043a\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439 \u0442\u0438\u043f\u043a\u043e\u043b\u043e\u043d\u043a\u0438\u043c\u043e\u0434\u0435\u043b\u0438\u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0430 \u0442\u0438\u043f\u043c\u0435\u0440\u044b\u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u044f\u043f\u0440\u0430\u0432\u0438\u043b\u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0446\u0438\u0438 \u0442\u0438\u043f\u043f\u043e\u043b\u044f\u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0438\u0437\u0430\u0446\u0438\u0438\u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f\u043f\u0440\u0430\u0432\u0438\u043b\u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0446\u0438\u0438\u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f\u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439\u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f\u0434\u0435\u0440\u0435\u0432\u0430\u0440\u0435\u0448\u0435\u043d\u0438\u0439 ws\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442xpathxs \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0437\u0430\u043f\u0438\u0441\u0438\u0434\u0430\u0442\u044bjson \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e\u0442\u0438\u043f\u0430xs \u0432\u0438\u0434\u0433\u0440\u0443\u043f\u043f\u044b\u043c\u043e\u0434\u0435\u043b\u0438xs \u0432\u0438\u0434\u0444\u0430\u0441\u0435\u0442\u0430xdto \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044fdom \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e\u0442\u0438\u043f\u0430xs \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0433\u043e\u0442\u0438\u043f\u0430xs \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u0441\u0445\u0435\u043c\u044bxs \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u043d\u044b\u0435\u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438xs \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u0433\u0440\u0443\u043f\u043f\u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438xs \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430xs \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u0438xs \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0438\u043c\u0435\u043dxs \u043c\u0435\u0442\u043e\u0434\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044fxs \u043c\u043e\u0434\u0435\u043b\u044c\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043exs \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u0442\u0438\u043f\u0430xml \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0435\u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438xs \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430\u043f\u0440\u043e\u0431\u0435\u043b\u044c\u043d\u044b\u0445\u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432xs \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043exs \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044fxs \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b\u043e\u0442\u0431\u043e\u0440\u0430\u0443\u0437\u043b\u043e\u0432dom \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0441\u0442\u0440\u043e\u043ajson \u043f\u043e\u0437\u0438\u0446\u0438\u044f\u0432\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435dom \u043f\u0440\u043e\u0431\u0435\u043b\u044c\u043d\u044b\u0435\u0441\u0438\u043c\u0432\u043e\u043b\u044bxml \u0442\u0438\u043f\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430xml \u0442\u0438\u043f\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044fjson \u0442\u0438\u043f\u043a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043exml \u0442\u0438\u043f\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044bxs \u0442\u0438\u043f\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438xml \u0442\u0438\u043f\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430domxpath \u0442\u0438\u043f\u0443\u0437\u043b\u0430dom \u0442\u0438\u043f\u0443\u0437\u043b\u0430xml \u0444\u043e\u0440\u043c\u0430xml \u0444\u043e\u0440\u043c\u0430\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044fxs \u0444\u043e\u0440\u043c\u0430\u0442\u0434\u0430\u0442\u044bjson \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432json \u0432\u0438\u0434\u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438\u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0438\u0442\u043e\u0433\u043e\u0432\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043f\u043e\u043b\u0435\u0439\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043f\u043e\u043b\u044f\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0440\u0435\u043a\u0432\u0438\u0437\u0438\u0442\u043e\u0432\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u0431\u0443\u0445\u0433\u0430\u043b\u0442\u0435\u0440\u0441\u043a\u043e\u0433\u043e\u043e\u0441\u0442\u0430\u0442\u043a\u0430\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u0432\u044b\u0432\u043e\u0434\u0430\u0442\u0435\u043a\u0441\u0442\u0430\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u0433\u0440\u0443\u043f\u043f\u044b\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\u043e\u0442\u0431\u043e\u0440\u0430\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\u043f\u0435\u0440\u0438\u043e\u0434\u0430\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u043f\u043e\u043b\u0435\u0439\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043c\u0430\u043a\u0435\u0442\u0430\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043c\u0430\u043a\u0435\u0442\u0430\u043e\u0431\u043b\u0430\u0441\u0442\u0438\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0441\u0442\u0430\u0442\u043a\u0430\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043f\u0435\u0440\u0438\u043e\u0434\u0430\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f\u0442\u0435\u043a\u0441\u0442\u0430\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u0441\u0432\u044f\u0437\u0438\u043d\u0430\u0431\u043e\u0440\u043e\u0432\u0434\u0430\u043d\u043d\u044b\u0445\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043b\u0435\u0433\u0435\u043d\u0434\u044b\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043e\u0442\u0431\u043e\u0440\u0430\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0435\u0436\u0438\u043c\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0435\u0436\u0438\u043c\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0435\u0436\u0438\u043c\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0430\u0432\u0442\u043e\u043f\u043e\u0437\u0438\u0446\u0438\u044f\u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432\u0432\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0435\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u044f\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0433\u043e\u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u044c\u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u043f\u043e\u0447\u0442\u043e\u0432\u043e\u0433\u043e\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430\u0442\u0435\u043a\u0441\u0442\u0430\u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u043f\u043e\u0447\u0442\u043e\u0432\u043e\u0433\u043e\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u043f\u043e\u0447\u0442\u043e\u0432\u043e\u0433\u043e\u0432\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\u043d\u0435ascii\u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432\u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u043f\u043e\u0447\u0442\u043e\u0432\u043e\u0433\u043e\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u0442\u0435\u043a\u0441\u0442\u0430\u043f\u043e\u0447\u0442\u043e\u0432\u043e\u0433\u043e\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u043f\u043e\u0447\u0442\u044b \u0441\u0442\u0430\u0442\u0443\u0441\u0440\u0430\u0437\u0431\u043e\u0440\u0430\u043f\u043e\u0447\u0442\u043e\u0432\u043e\u0433\u043e\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0440\u0435\u0436\u0438\u043c\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438\u0437\u0430\u043f\u0438\u0441\u0438\u0436\u0443\u0440\u043d\u0430\u043b\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0441\u0442\u0430\u0442\u0443\u0441\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438\u0437\u0430\u043f\u0438\u0441\u0438\u0436\u0443\u0440\u043d\u0430\u043b\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0443\u0440\u043e\u0432\u0435\u043d\u044c\u0436\u0443\u0440\u043d\u0430\u043b\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432\u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0440\u0435\u0436\u0438\u043c\u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432\u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0440\u0435\u0436\u0438\u043c\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430\u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0442\u0438\u043f\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432\u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430\u0438\u043c\u0435\u043d\u0444\u0430\u0439\u043b\u043e\u0432\u0432zip\u0444\u0430\u0439\u043b\u0435 \u043c\u0435\u0442\u043e\u0434\u0441\u0436\u0430\u0442\u0438\u044fzip \u043c\u0435\u0442\u043e\u0434\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044fzip \u0440\u0435\u0436\u0438\u043c\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f\u043f\u0443\u0442\u0435\u0439\u0444\u0430\u0439\u043b\u043e\u0432zip \u0440\u0435\u0436\u0438\u043c\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438\u043f\u043e\u0434\u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432zip \u0440\u0435\u0436\u0438\u043c\u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f\u043f\u0443\u0442\u0435\u0439zip \u0443\u0440\u043e\u0432\u0435\u043d\u044c\u0441\u0436\u0430\u0442\u0438\u044fzip \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0435\u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430\u043a\u0441\u0442\u0440\u043e\u043a\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u044f\u0432\u043f\u043e\u0442\u043e\u043a\u0435 \u043f\u043e\u0440\u044f\u0434\u043e\u043a\u0431\u0430\u0439\u0442\u043e\u0432 \u0440\u0435\u0436\u0438\u043c\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0435\u0436\u0438\u043c\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u043e\u0439\u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445\u043f\u043e\u043a\u0443\u043f\u043e\u043a \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u0444\u043e\u043d\u043e\u0432\u043e\u0433\u043e\u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0442\u0438\u043f\u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0430\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f\u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u0433\u043e\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044fftp \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043f\u043e\u0440\u044f\u0434\u043a\u0430\u0441\u0445\u0435\u043c\u044b\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0442\u0438\u043f\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\u043f\u0435\u0440\u0438\u043e\u0434\u0430\u043c\u0438\u0441\u0445\u0435\u043c\u044b\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0442\u0438\u043f\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439\u0442\u043e\u0447\u043a\u0438\u0441\u0445\u0435\u043c\u044b\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0442\u0438\u043f\u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f\u0441\u0445\u0435\u043c\u044b\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0442\u0438\u043f\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0439\u0442\u0430\u0431\u043b\u0438\u0446\u044b\u0441\u0445\u0435\u043c\u044b\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0442\u0438\u043f\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f\u0441\u0445\u0435\u043c\u044b\u0437\u0430\u043f\u0440\u043e\u0441\u0430 http\u043c\u0435\u0442\u043e\u0434 \u0430\u0432\u0442\u043e\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043e\u0431\u0449\u0435\u0433\u043e\u0440\u0435\u043a\u0432\u0438\u0437\u0438\u0442\u0430 \u0430\u0432\u0442\u043e\u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u043e\u043c\u0435\u0440\u0430\u0437\u0430\u0434\u0430\u0447\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e\u044f\u0437\u044b\u043a\u0430 \u0432\u0438\u0434\u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 \u0432\u0438\u0434\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u044f \u0432\u0438\u0434\u0442\u0430\u0431\u043b\u0438\u0446\u044b\u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u044c\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0439\u043f\u0440\u0438\u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u0431\u0430\u0437\u044b\u043f\u043b\u0430\u043d\u0430\u0432\u0438\u0434\u043e\u0432\u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e\u0432\u044b\u0431\u043e\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043e\u0431\u0449\u0435\u0433\u043e\u0440\u0435\u043a\u0432\u0438\u0437\u0438\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043f\u043e\u043b\u043d\u043e\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e\u043f\u043e\u0438\u0441\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0445\u0434\u0430\u043d\u043d\u044b\u0445\u043e\u0431\u0449\u0435\u0433\u043e\u0440\u0435\u043a\u0432\u0438\u0437\u0438\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u0440\u0435\u043a\u0432\u0438\u0437\u0438\u0442\u0430 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u043f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445\u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0435\u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u0432\u0438\u0434\u0430\u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u0432\u0438\u0434\u0430\u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u0437\u0430\u0434\u0430\u0447\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043f\u043b\u0430\u043d\u0430\u043e\u0431\u043c\u0435\u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u0441\u0447\u0435\u0442\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435\u0433\u0440\u0430\u043d\u0438\u0446\u044b\u043f\u0440\u0438\u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u043d\u043e\u0441\u0442\u044c\u043d\u043e\u043c\u0435\u0440\u0430\u0431\u0438\u0437\u043d\u0435\u0441\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u043d\u043e\u0441\u0442\u044c\u043d\u043e\u043c\u0435\u0440\u0430\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u043d\u043e\u0441\u0442\u044c\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u043d\u043e\u0441\u0442\u044c\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0441\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0445\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u043e\u043b\u043d\u043e\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439\u043f\u043e\u0438\u0441\u043a\u043f\u0440\u0438\u0432\u0432\u043e\u0434\u0435\u043f\u043e\u0441\u0442\u0440\u043e\u043a\u0435 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u043d\u043e\u0441\u0442\u044c\u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438\u043e\u0431\u0449\u0435\u0433\u043e\u0440\u0435\u043a\u0432\u0438\u0437\u0438\u0442\u0430 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u0434\u0430\u043d\u043d\u044b\u0445\u043e\u0431\u0449\u0435\u0433\u043e\u0440\u0435\u043a\u0432\u0438\u0437\u0438\u0442\u0430 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438\u043e\u0431\u0449\u0435\u0433\u043e\u0440\u0435\u043a\u0432\u0438\u0437\u0438\u0442\u0430 \u0440\u0435\u0436\u0438\u043c\u0430\u0432\u0442\u043e\u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u0438\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0440\u0435\u0436\u0438\u043c\u0437\u0430\u043f\u0438\u0441\u0438\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0440\u0435\u0436\u0438\u043c\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0436\u0438\u043c\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445\u0432\u044b\u0437\u043e\u0432\u043e\u0432\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b\u0438\u0432\u043d\u0435\u0448\u043d\u0438\u0445\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0440\u0435\u0436\u0438\u043c\u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f\u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u0440\u0435\u0436\u0438\u043c\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f\u0434\u0430\u043d\u043d\u044b\u0445\u0432\u044b\u0431\u043e\u0440\u0430\u043f\u0440\u0438\u0432\u0432\u043e\u0434\u0435\u043f\u043e\u0441\u0442\u0440\u043e\u043a\u0435 \u0440\u0435\u0436\u0438\u043c\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0440\u0435\u0436\u0438\u043c\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0440\u0435\u0436\u0438\u043c\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u043e\u0439\u0434\u0430\u043d\u043d\u044b\u0445\u043f\u043e\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0438\u0438\u043a\u043e\u0434\u043e\u0432\u043f\u043b\u0430\u043d\u0430\u0432\u0438\u0434\u043e\u0432\u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a \u0441\u0435\u0440\u0438\u0438\u043a\u043e\u0434\u043e\u0432\u043f\u043b\u0430\u043d\u0430\u0441\u0447\u0435\u0442\u043e\u0432 \u0441\u0435\u0440\u0438\u0438\u043a\u043e\u0434\u043e\u0432\u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043f\u0440\u0438\u0432\u0432\u043e\u0434\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u0432\u044b\u0431\u043e\u0440\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u043f\u043e\u0438\u0441\u043a\u0430\u0441\u0442\u0440\u043e\u043a\u0438\u043f\u0440\u0438\u0432\u0432\u043e\u0434\u0435\u043f\u043e\u0441\u0442\u0440\u043e\u043a\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0438\u043f\u0434\u0430\u043d\u043d\u044b\u0445\u0442\u0430\u0431\u043b\u0438\u0446\u044b\u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043a\u043e\u0434\u0430\u043f\u043b\u0430\u043d\u0430\u0432\u0438\u0434\u043e\u0432\u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u0442\u0438\u043f\u043a\u043e\u0434\u0430\u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0430 \u0442\u0438\u043f\u043c\u0430\u043a\u0435\u0442\u0430 \u0442\u0438\u043f\u043d\u043e\u043c\u0435\u0440\u0430\u0431\u0438\u0437\u043d\u0435\u0441\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0442\u0438\u043f\u043d\u043e\u043c\u0435\u0440\u0430\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0442\u0438\u043f\u043d\u043e\u043c\u0435\u0440\u0430\u0437\u0430\u0434\u0430\u0447\u0438 \u0442\u0438\u043f\u0444\u043e\u0440\u043c\u044b \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0439 \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u044c\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b\u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430\u0444\u043e\u0440\u043c\u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e\u0448\u0440\u0438\u0444\u0442\u0430\u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e\u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439\u0434\u0430\u0442\u044b\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u0438\u0434\u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u0438\u0434\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0432\u0438\u0434\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043f\u043e\u043b\u043d\u043e\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e\u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u0438\u0434\u0440\u0430\u043c\u043a\u0438 \u0432\u0438\u0434\u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0432\u0438\u0434\u0446\u0432\u0435\u0442\u0430 \u0432\u0438\u0434\u0447\u0438\u0441\u043b\u043e\u0432\u043e\u0433\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0438\u0434\u0448\u0440\u0438\u0444\u0442\u0430 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u0430\u044f\u0434\u043b\u0438\u043d\u0430 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0439\u0437\u043d\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435byteordermark \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445\u043f\u043e\u043b\u043d\u043e\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e\u043f\u043e\u0438\u0441\u043a\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043a\u043b\u0430\u0432\u0438\u0448\u0430 \u043a\u043e\u0434\u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430\u0434\u0438\u0430\u043b\u043e\u0433\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430xbase \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430\u0442\u0435\u043a\u0441\u0442\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043f\u043e\u0438\u0441\u043a\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u043f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445\u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u043f\u0440\u0438\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043f\u0430\u043d\u0435\u043b\u0438\u0440\u0430\u0437\u0434\u0435\u043b\u043e\u0432 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0436\u0438\u043c\u0434\u0438\u0430\u043b\u043e\u0433\u0430\u0432\u043e\u043f\u0440\u043e\u0441 \u0440\u0435\u0436\u0438\u043c\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0440\u0435\u0436\u0438\u043c\u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u0436\u0438\u043c\u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f\u0444\u043e\u0440\u043c\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0440\u0435\u0436\u0438\u043c\u043f\u043e\u043b\u043d\u043e\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e\u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438\u0431\u0430\u0437\u044b\u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u0432\u044b\u0431\u043e\u0440\u0430\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430windows \u0441\u043f\u043e\u0441\u043e\u0431\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\u0441\u0442\u0440\u043e\u043a\u0438 \u0441\u0442\u0430\u0442\u0443\u0441\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u0432\u043d\u0435\u0448\u043d\u0435\u0439\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0442\u0438\u043f\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0442\u0438\u043f\u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f\u043a\u043b\u0430\u0432\u0438\u0448\u0438enter \u0442\u0438\u043f\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438\u043e\u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438\u0431\u0430\u0437\u044b\u0434\u0430\u043d\u043d\u044b\u0445 \u0443\u0440\u043e\u0432\u0435\u043d\u044c\u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u0445\u0435\u0448\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0447\u0430\u0441\u0442\u0438\u0434\u0430\u0442\u044b",
+type:"com\u043e\u0431\u044a\u0435\u043a\u0442 ftp\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 http\u0437\u0430\u043f\u0440\u043e\u0441 http\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0442\u0432\u0435\u0442 http\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 ws\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f ws\u043f\u0440\u043e\u043a\u0441\u0438 xbase \u0430\u043d\u0430\u043b\u0438\u0437\u0434\u0430\u043d\u043d\u044b\u0445 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044fxs \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u0443\u0444\u0435\u0440\u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0445\u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435xs \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445\u0447\u0438\u0441\u0435\u043b \u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0430\u044f\u0441\u0445\u0435\u043c\u0430 \u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0430\u044f\u0441\u0445\u0435\u043c\u0430 \u0433\u0440\u0443\u043f\u043f\u0430\u043c\u043e\u0434\u0435\u043b\u0438xs \u0434\u0430\u043d\u043d\u044b\u0435\u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u0435\u043d\u0434\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430\u0433\u0430\u043d\u0442\u0430 \u0434\u0438\u0430\u043b\u043e\u0433\u0432\u044b\u0431\u043e\u0440\u0430\u0444\u0430\u0439\u043b\u0430 \u0434\u0438\u0430\u043b\u043e\u0433\u0432\u044b\u0431\u043e\u0440\u0430\u0446\u0432\u0435\u0442\u0430 \u0434\u0438\u0430\u043b\u043e\u0433\u0432\u044b\u0431\u043e\u0440\u0430\u0448\u0440\u0438\u0444\u0442\u0430 \u0434\u0438\u0430\u043b\u043e\u0433\u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f\u0440\u0435\u0433\u043b\u0430\u043c\u0435\u043d\u0442\u043d\u043e\u0433\u043e\u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0434\u0438\u0430\u043b\u043e\u0433\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e\u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442dom \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442html \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044fxs \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u0435\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u044cdom \u0437\u0430\u043f\u0438\u0441\u044cfastinfoset \u0437\u0430\u043f\u0438\u0441\u044chtml \u0437\u0430\u043f\u0438\u0441\u044cjson \u0437\u0430\u043f\u0438\u0441\u044cxml \u0437\u0430\u043f\u0438\u0441\u044czip\u0444\u0430\u0439\u043b\u0430 \u0437\u0430\u043f\u0438\u0441\u044c\u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u044c\u0442\u0435\u043a\u0441\u0442\u0430 \u0437\u0430\u043f\u0438\u0441\u044c\u0443\u0437\u043b\u043e\u0432dom \u0437\u0430\u043f\u0440\u043e\u0441 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u0435\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435openssl \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043f\u043e\u043b\u0435\u0439\u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435\u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u043c\u043f\u043e\u0440\u0442xs \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u043f\u043e\u0447\u0442\u0430 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u043f\u043e\u0447\u0442\u043e\u0432\u043e\u0435\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u043f\u043e\u0447\u0442\u043e\u0432\u044b\u0439\u043f\u0440\u043e\u0444\u0438\u043b\u044c \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u043f\u0440\u043e\u043a\u0441\u0438 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f\u0434\u043b\u044f\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044fxs \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430xs \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0436\u0443\u0440\u043d\u0430\u043b\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0443\u0437\u043b\u043e\u0432dom \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u043a\u0432\u0430\u043b\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b\u0434\u0430\u0442\u044b \u043a\u0432\u0430\u043b\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b\u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0445\u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0432\u0430\u043b\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b\u0441\u0442\u0440\u043e\u043a\u0438 \u043a\u0432\u0430\u043b\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b\u0447\u0438\u0441\u043b\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u0449\u0438\u043a\u043c\u0430\u043a\u0435\u0442\u0430\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u0449\u0438\u043a\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043c\u0430\u043a\u0435\u0442\u0430\u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0444\u043e\u0440\u043c\u0430\u0442\u043d\u043e\u0439\u0441\u0442\u0440\u043e\u043a\u0438 \u043b\u0438\u043d\u0438\u044f \u043c\u0430\u043a\u0435\u0442\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0430\u043a\u0435\u0442\u043e\u0431\u043b\u0430\u0441\u0442\u0438\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0430\u043a\u0435\u0442\u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0430\u0441\u043a\u0430xs \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u043d\u0430\u0431\u043e\u0440\u0441\u0445\u0435\u043cxml \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438json \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430\u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430\u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0431\u0445\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430dom \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430xs \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043d\u043e\u0442\u0430\u0446\u0438\u0438xs \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430xs \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f\u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0434\u043e\u0441\u0442\u0443\u043f\u0436\u0443\u0440\u043d\u0430\u043b\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f\u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043e\u0442\u043a\u0430\u0437\u0432\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u0436\u0443\u0440\u043d\u0430\u043b\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438\u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0433\u043e\u0444\u0430\u0439\u043b\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u0442\u0438\u043f\u043e\u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u0433\u0440\u0443\u043f\u043f\u044b\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432xs \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u0433\u0440\u0443\u043f\u043f\u044b\u043c\u043e\u0434\u0435\u043b\u0438xs \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u0438xs \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e\u0442\u0438\u043f\u0430xs \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0433\u043e\u0442\u0438\u043f\u0430xs \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u0442\u0438\u043f\u0430\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430dom \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044fxpathxs \u043e\u0442\u0431\u043e\u0440\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u044b\u0445\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b\u0437\u0430\u043f\u0438\u0441\u0438json \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b\u0437\u0430\u043f\u0438\u0441\u0438xml \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b\u0447\u0442\u0435\u043d\u0438\u044fxml \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435xs \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043f\u043e\u043b\u0435\u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044cdom \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u043e\u0442\u0447\u0435\u0442\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u043e\u0442\u0447\u0435\u0442\u0430\u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u0441\u0445\u0435\u043cxml \u043f\u043e\u0442\u043e\u043a \u043f\u043e\u0442\u043e\u043a\u0432\u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e\u0447\u0442\u0430 \u043f\u043e\u0447\u0442\u043e\u0432\u043e\u0435\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435xsl \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043a\u043a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443xml \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0432\u044b\u0432\u043e\u0434\u0430\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445\u0432\u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0432\u044b\u0432\u043e\u0434\u0430\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445\u0432\u0442\u0430\u0431\u043b\u0438\u0447\u043d\u044b\u0439\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0437\u044b\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0438\u043c\u0435\u043ddom \u0440\u0430\u043c\u043a\u0430 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u0440\u0435\u0433\u043b\u0430\u043c\u0435\u043d\u0442\u043d\u043e\u0433\u043e\u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u0435\u0438\u043c\u044fxml \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0447\u0442\u0435\u043d\u0438\u044f\u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0432\u043e\u0434\u043d\u0430\u044f\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0441\u0432\u044f\u0437\u044c\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0432\u044b\u0431\u043e\u0440\u0430 \u0441\u0432\u044f\u0437\u044c\u043f\u043e\u0442\u0438\u043f\u0443 \u0441\u0432\u044f\u0437\u044c\u043f\u043e\u0442\u0438\u043f\u0443\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440xdto \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043a\u043b\u0438\u0435\u043d\u0442\u0430windows \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043a\u043b\u0438\u0435\u043d\u0442\u0430\u0444\u0430\u0439\u043b \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b\u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u044f\u044e\u0449\u0438\u0445\u0446\u0435\u043d\u0442\u0440\u043e\u0432windows \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b\u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u044f\u044e\u0449\u0438\u0445\u0446\u0435\u043d\u0442\u0440\u043e\u0432\u0444\u0430\u0439\u043b \u0441\u0436\u0430\u0442\u0438\u0435\u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435\u043a\u043b\u0430\u0432\u0438\u0448 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f\u0434\u0430\u0442\u0430\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439\u043f\u0435\u0440\u0438\u043e\u0434 \u0441\u0445\u0435\u043c\u0430xml \u0441\u0445\u0435\u043c\u0430\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u044b\u0439\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0435\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0434\u0430\u043d\u043d\u044b\u0445xml \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0444\u0430\u0431\u0440\u0438\u043a\u0430xdto \u0444\u0430\u0439\u043b \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0439\u043f\u043e\u0442\u043e\u043a \u0444\u0430\u0441\u0435\u0442\u0434\u043b\u0438\u043d\u044bxs \u0444\u0430\u0441\u0435\u0442\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430\u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432\u0434\u0440\u043e\u0431\u043d\u043e\u0439\u0447\u0430\u0441\u0442\u0438xs \u0444\u0430\u0441\u0435\u0442\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e\u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0435\u0433\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044fxs \u0444\u0430\u0441\u0435\u0442\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e\u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0435\u0433\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044fxs \u0444\u0430\u0441\u0435\u0442\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439\u0434\u043b\u0438\u043d\u044bxs \u0444\u0430\u0441\u0435\u0442\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e\u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0435\u0433\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044fxs \u0444\u0430\u0441\u0435\u0442\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e\u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0435\u0433\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044fxs \u0444\u0430\u0441\u0435\u0442\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439\u0434\u043b\u0438\u043d\u044bxs \u0444\u0430\u0441\u0435\u0442\u043e\u0431\u0440\u0430\u0437\u0446\u0430xs \u0444\u0430\u0441\u0435\u0442\u043e\u0431\u0449\u0435\u0433\u043e\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430\u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432xs \u0444\u0430\u0441\u0435\u0442\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044fxs \u0444\u0430\u0441\u0435\u0442\u043f\u0440\u043e\u0431\u0435\u043b\u044c\u043d\u044b\u0445\u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432xs \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u0437\u043b\u043e\u0432dom \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f\u0441\u0442\u0440\u043e\u043a\u0430 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442xs \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u0434\u0430\u043d\u043d\u044b\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0446\u0432\u0435\u0442 \u0447\u0442\u0435\u043d\u0438\u0435fastinfoset \u0447\u0442\u0435\u043d\u0438\u0435html \u0447\u0442\u0435\u043d\u0438\u0435json \u0447\u0442\u0435\u043d\u0438\u0435xml \u0447\u0442\u0435\u043d\u0438\u0435zip\u0444\u0430\u0439\u043b\u0430 \u0447\u0442\u0435\u043d\u0438\u0435\u0434\u0430\u043d\u043d\u044b\u0445 \u0447\u0442\u0435\u043d\u0438\u0435\u0442\u0435\u043a\u0441\u0442\u0430 \u0447\u0442\u0435\u043d\u0438\u0435\u0443\u0437\u043b\u043e\u0432dom \u0448\u0440\u0438\u0444\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438\u0434\u0430\u043d\u043d\u044b\u0445 comsafearray \u0434\u0435\u0440\u0435\u0432\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043f\u0438\u0441\u043e\u043a\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439\u043c\u0430\u0441\u0441\u0438\u0432 ",
+literal:"null \u0438\u0441\u0442\u0438\u043d\u0430 \u043b\u043e\u0436\u044c \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e"},contains:[g,a,f,{className:"symbol",begin:"~",end:";|:",excludeEnd:!0},c,b,e]}});b.registerLanguage("abnf",function(a){return{illegal:"[!@#$^&',?+~`|:]",keywords:"ALPHA BIT CHAR CR CRLF CTL DIGIT DQUOTE HEXDIG HTAB LF LWSP OCTET SP VCHAR WSP",contains:[{begin:"^[a-zA-Z][a-zA-Z0-9-]*\\s*=",returnBegin:!0,end:/=/,relevance:0,contains:[{className:"attribute",
+begin:"^[a-zA-Z][a-zA-Z0-9-]*"}]},a.COMMENT(";","$"),{className:"symbol",begin:/%b[0-1]+(-[0-1]+|(\.[0-1]+)+){0,1}/},{className:"symbol",begin:/%d[0-9]+(-[0-9]+|(\.[0-9]+)+){0,1}/},{className:"symbol",begin:/%x[0-9A-F]+(-[0-9A-F]+|(\.[0-9A-F]+)+){0,1}/},{className:"symbol",begin:/%[si]/},a.QUOTE_STRING_MODE,a.NUMBER_MODE]}});b.registerLanguage("accesslog",function(a){return{contains:[{className:"number",begin:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{className:"number",begin:"\\b\\d+\\b",
+relevance:0},{className:"string",begin:'"(GET|POST|HEAD|PUT|DELETE|CONNECT|OPTIONS|PATCH|TRACE)',end:'"',keywords:"GET POST HEAD PUT DELETE CONNECT OPTIONS PATCH TRACE",illegal:"\\n",relevance:10},{className:"string",begin:/\[/,end:/\]/,illegal:"\\n"},{className:"string",begin:'"',end:'"',illegal:"\\n"}]}});b.registerLanguage("actionscript",function(a){return{aliases:["as"],keywords:{keyword:"as break case catch class const continue default delete do dynamic each else extends final finally for function get if implements import in include instanceof interface internal is namespace native new override package private protected public return set static super switch this throw try typeof use var void while with",
+literal:"true false null undefined"},contains:[a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,a.C_NUMBER_MODE,{className:"class",beginKeywords:"package",end:"{",contains:[a.TITLE_MODE]},{className:"class",beginKeywords:"class interface",end:"{",excludeEnd:!0,contains:[{beginKeywords:"extends implements"},a.TITLE_MODE]},{className:"meta",beginKeywords:"import include",end:";",keywords:{"meta-keyword":"import include"}},{className:"function",beginKeywords:"function",
+end:"[{;]",excludeEnd:!0,illegal:"\\S",contains:[a.TITLE_MODE,{className:"params",begin:"\\(",end:"\\)",contains:[a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,{className:"rest_arg",begin:"[.]{3}",end:"[a-zA-Z_$][a-zA-Z0-9_$]*",relevance:10}]},{begin:":\\s*([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)"}]},a.METHOD_GUARD],illegal:/#/}});b.registerLanguage("ada",function(a){a=a.COMMENT("--","$");var c={begin:"\\s+:\\s+",end:"\\s*(:=|;|\\)|=>|$)",illegal:"[]{}%#'\"",contains:[{beginKeywords:"loop for declare others",
+endsParent:!0},{className:"keyword",beginKeywords:"not null constant access function procedure in out aliased exception"},{className:"type",begin:"[A-Za-z](_?[A-Za-z0-9.])*",endsParent:!0,relevance:0}]};return{case_insensitive:!0,keywords:{keyword:"abort else new return abs elsif not reverse abstract end accept entry select access exception of separate aliased exit or some all others subtype and for out synchronized array function overriding at tagged generic package task begin goto pragma terminate body private then if procedure type case in protected constant interface is raise use declare range delay limited record when delta loop rem while digits renames with do mod requeue xor",
+literal:"True False"},contains:[a,{className:"string",begin:/"/,end:/"/,contains:[{begin:/""/,relevance:0}]},{className:"string",begin:/'.'/},{className:"number",begin:"\\b(\\d(_|\\d)*#\\w+(\\.\\w+)?#([eE][-+]?\\d(_|\\d)*)?|\\d(_|\\d)*(\\.\\d(_|\\d)*)?([eE][-+]?\\d(_|\\d)*)?)",relevance:0},{className:"symbol",begin:"'[A-Za-z](_?[A-Za-z0-9.])*"},{className:"title",begin:"(\\bwith\\s+)?(\\bprivate\\s+)?\\bpackage\\s+(\\bbody\\s+)?",end:"(is|$)",keywords:"package body",excludeBegin:!0,excludeEnd:!0,
+illegal:"[]{}%#'\""},{begin:"(\\b(with|overriding)\\s+)?\\b(function|procedure)\\s+",end:"(\\bis|\\bwith|\\brenames|\\)\\s*;)",keywords:"overriding function procedure with is renames return",returnBegin:!0,contains:[a,{className:"title",begin:"(\\bwith\\s+)?\\b(function|procedure)\\s+",end:"(\\(|\\s+|$)",excludeBegin:!0,excludeEnd:!0,illegal:"[]{}%#'\""},c,{className:"type",begin:"\\breturn\\s+",end:"(\\s+|;|$)",keywords:"return",excludeBegin:!0,excludeEnd:!0,endsParent:!0,illegal:"[]{}%#'\""}]},
+{className:"type",begin:"\\b(sub)?type\\s+",end:"\\s+",keywords:"type",excludeBegin:!0,illegal:"[]{}%#'\""},c]}});b.registerLanguage("angelscript",function(a){var c={className:"built_in",begin:"\\b(void|bool|int|int8|int16|int32|int64|uint|uint8|uint16|uint32|uint64|string|ref|array|double|float|auto|dictionary)"},b={className:"symbol",begin:"[a-zA-Z0-9_]+@"},e={className:"keyword",begin:"<",end:">",contains:[c,b]};c.contains=[e];b.contains=[e];return{aliases:["asc"],keywords:"for in|0 break continue while do|0 return if else case switch namespace is cast or and xor not get|0 in inout|10 out override set|0 private public const default|0 final shared external mixin|10 enum typedef funcdef this super import from interface abstract|0 try catch protected explicit",
+illegal:"(^using\\s+[A-Za-z0-9_\\.]+;$|\\bfunctions*[^\\(])",contains:[{className:"string",begin:"'",end:"'",illegal:"\\n",contains:[a.BACKSLASH_ESCAPE],relevance:0},{className:"string",begin:'"',end:'"',illegal:"\\n",contains:[a.BACKSLASH_ESCAPE],relevance:0},{className:"string",begin:'"""',end:'"""'},a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,{beginKeywords:"interface namespace",end:"{",illegal:"[;.\\-]",contains:[{className:"symbol",begin:"[a-zA-Z0-9_]+"}]},{beginKeywords:"class",end:"{",illegal:"[;.\\-]",
+contains:[{className:"symbol",begin:"[a-zA-Z0-9_]+",contains:[{begin:"[:,]\\s*",contains:[{className:"symbol",begin:"[a-zA-Z0-9_]+"}]}]}]},c,b,{className:"literal",begin:"\\b(null|true|false)"},{className:"number",begin:"(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?f?|\\.\\d+f?)([eE][-+]?\\d+f?)?)"}]}});b.registerLanguage("apache",function(a){var c={className:"number",begin:"[\\$%]\\d+"};return{aliases:["apacheconf"],case_insensitive:!0,contains:[a.HASH_COMMENT_MODE,{className:"section",begin:"</?",
+end:">"},{className:"attribute",begin:/\w+/,relevance:0,keywords:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{end:/$/,relevance:0,keywords:{literal:"on off all"},contains:[{className:"meta",begin:"\\s\\[",end:"\\]$"},{className:"variable",begin:"[\\$%]\\{",end:"\\}",contains:["self",c]},c,a.QUOTE_STRING_MODE]}}],illegal:/\S/}});b.registerLanguage("applescript",function(a){var c=
+a.inherit(a.QUOTE_STRING_MODE,{illegal:""}),b={className:"params",begin:"\\(",end:"\\)",contains:["self",a.C_NUMBER_MODE,c]},e=a.COMMENT("--","$"),f=a.COMMENT("\\(\\*","\\*\\)",{contains:["self",e]});return{aliases:["osascript"],keywords:{keyword:"about above after against and around as at back before beginning behind below beneath beside between but by considering contain contains continue copy div does eighth else end equal equals error every exit fifth first for fourth from front get given global if ignoring in into is it its last local me middle mod my ninth not of on onto or over prop property put ref reference repeat returning script second set seventh since sixth some tell tenth that the|0 then third through thru timeout times to transaction try until where while whose with without",
+literal:"AppleScript false linefeed return pi quote result space tab true",built_in:"alias application boolean class constant date file integer list number real record string text activate beep count delay launch log offset read round run say summarize write character characters contents day frontmost id item length month name paragraph paragraphs rest reverse running time version weekday word words year"},contains:[c,a.C_NUMBER_MODE,{className:"built_in",begin:"\\b(clipboard info|the clipboard|info for|list (disks|folder)|mount volume|path to|(close|open for) access|(get|set) eof|current date|do shell script|get volume settings|random number|set volume|system attribute|system info|time to GMT|(load|run|store) script|scripting components|ASCII (character|number)|localized string|choose (application|color|file|file name|folder|from list|remote application|URL)|display (alert|dialog))\\b|^\\s*return\\b"},
+{className:"literal",begin:"\\b(text item delimiters|current application|missing value)\\b"},{className:"keyword",begin:"\\b(apart from|aside from|instead of|out of|greater than|isn't|(doesn't|does not) (equal|come before|come after|contain)|(greater|less) than( or equal)?|(starts?|ends|begins?) with|contained by|comes (before|after)|a (ref|reference)|POSIX file|POSIX path|(date|time) string|quoted form)\\b"},{beginKeywords:"on",illegal:"[${=;\\n]",contains:[a.UNDERSCORE_TITLE_MODE,b]}].concat([e,
+f,a.HASH_COMMENT_MODE]),illegal:"//|->|=>|\\[\\["}});b.registerLanguage("arcade",function(a){var c={keyword:"if for while var new function do return void else break",literal:"true false null undefined NaN Infinity PI BackSlash DoubleQuote ForwardSlash NewLine SingleQuote Tab",built_in:"Abs Acos Area AreaGeodetic Asin Atan Atan2 Average Boolean Buffer BufferGeodetic Ceil Centroid Clip Console Constrain Contains Cos Count Crosses Cut Date DateAdd DateDiff Day Decode DefaultValue Dictionary Difference Disjoint Distance Distinct DomainCode DomainName Equals Exp Extent Feature FeatureSet FeatureSetById FeatureSetByTitle FeatureSetByUrl Filter First Floor Geometry Guid HasKey Hour IIf IndexOf Intersection Intersects IsEmpty Length LengthGeodetic Log Max Mean Millisecond Min Minute Month MultiPartToSinglePart Multipoint NextSequenceValue Now Number OrderBy Overlaps Point Polygon Polyline Pow Random Relate Reverse Round Second SetGeometry Sin Sort Sqrt Stdev Sum SymmetricDifference Tan Text Timestamp Today ToLocal Top Touches ToUTC TypeOf Union Variance Weekday When Within Year "},
+b={className:"number",variants:[{begin:"\\b(0[bB][01]+)"},{begin:"\\b(0[oO][0-7]+)"},{begin:a.C_NUMBER_RE}],relevance:0},e={className:"subst",begin:"\\$\\{",end:"\\}",keywords:c,contains:[]},f={className:"string",begin:"`",end:"`",contains:[a.BACKSLASH_ESCAPE,e]};e.contains=[a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,f,b,a.REGEXP_MODE];e=e.contains.concat([a.C_BLOCK_COMMENT_MODE,a.C_LINE_COMMENT_MODE]);return{aliases:["arcade"],keywords:c,contains:[a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,f,a.C_LINE_COMMENT_MODE,
+a.C_BLOCK_COMMENT_MODE,{className:"symbol",begin:"\\$[feature|layer|map|value|view]+"},b,{begin:/[{,]\s*/,relevance:0,contains:[{begin:"[A-Za-z_][0-9A-Za-z_]*\\s*:",returnBegin:!0,relevance:0,contains:[{className:"attr",begin:"[A-Za-z_][0-9A-Za-z_]*",relevance:0}]}]},{begin:"("+a.RE_STARTERS_RE+"|\\b(return)\\b)\\s*",keywords:"return",contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,a.REGEXP_MODE,{className:"function",begin:"(\\(.*?\\)|[A-Za-z_][0-9A-Za-z_]*)\\s*=>",returnBegin:!0,end:"\\s*=>",
+contains:[{className:"params",variants:[{begin:"[A-Za-z_][0-9A-Za-z_]*"},{begin:/\(\s*\)/},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:c,contains:e}]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/\{/,excludeEnd:!0,contains:[a.inherit(a.TITLE_MODE,{begin:"[A-Za-z_][0-9A-Za-z_]*"}),{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:e}],illegal:/\[|%/},{begin:/\$[(.]/}],illegal:/#(?!!)/}});b.registerLanguage("cpp",function(a){var c={className:"keyword",
+begin:"\\b[a-z\\d_]*_t\\b"},b={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[a.BACKSLASH_ESCAPE]},{begin:'(u8?|U|L)?R"\\(',end:'\\)"'},{begin:"'\\\\?.",end:"'",illegal:"."}]},e={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},f={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{"meta-keyword":"if else elif endif define undef warning error line pragma ifdef ifndef include"},
+contains:[{begin:/\\\n/,relevance:0},a.inherit(b,{className:"meta-string"}),{className:"meta-string",begin:/<[^\n>]*>/,end:/$/,illegal:"\\n"},a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE]},g=a.IDENT_RE+"\\s*\\(",k={keyword:"int float while private char catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignof constexpr decltype noexcept static_assert thread_local restrict _Bool complex _Complex _Imaginary atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and or not",
 built_in:"std string cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr",
-literal:"true false nullptr NULL"},k=[b,a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,e,d];return{aliases:"c cc h c++ h++ hpp".split(" "),keywords:g,illegal:"</",contains:k.concat([c,{begin:"\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",end:">",keywords:g,contains:["self",b]},{begin:a.IDENT_RE+"::",keywords:g},{variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",
-end:/;/}],keywords:g,contains:k.concat([{begin:/\(/,end:/\)/,keywords:g,contains:k.concat(["self"]),relevance:0}]),relevance:0},{className:"function",begin:"("+a.IDENT_RE+"[\\*&\\s]+)+"+q,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:g,illegal:/[^\w\s\*&]/,contains:[{begin:q,returnBegin:!0,contains:[a.TITLE_MODE],relevance:0},{className:"params",begin:/\(/,end:/\)/,keywords:g,relevance:0,contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,d,e,b]},a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,
-c]},{className:"class",beginKeywords:"class struct",end:/[{;:]/,contains:[{begin:/</,end:/>/,contains:["self"]},a.TITLE_MODE]}]),exports:{preprocessor:c,strings:d,keywords:g}}});b.registerLanguage("cs",function(a){var b={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long nameof object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let on orderby partial remove select set value var where yield",
-literal:"null false true"},d={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]},e=a.inherit(d,{illegal:/\n/}),c={className:"subst",begin:"{",end:"}",keywords:b},g=a.inherit(c,{illegal:/\n/}),k={className:"string",begin:/\$"/,end:'"',illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},a.BACKSLASH_ESCAPE,g]},l={className:"string",begin:/\$@"/,end:'"',contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},c]},m=a.inherit(l,{illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},g]});c.contains=
-[l,k,d,a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,a.C_NUMBER_MODE,a.C_BLOCK_COMMENT_MODE];g.contains=[m,k,e,a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,a.C_NUMBER_MODE,a.inherit(a.C_BLOCK_COMMENT_MODE,{illegal:/\n/})];d={variants:[l,k,d,a.APOS_STRING_MODE,a.QUOTE_STRING_MODE]};e=a.IDENT_RE+"(<"+a.IDENT_RE+"(\\s*,\\s*"+a.IDENT_RE+")*>)?(\\[\\])?";return{aliases:["csharp"],keywords:b,illegal:/::/,contains:[a.COMMENT("///","$",{returnBegin:!0,contains:[{className:"doctag",variants:[{begin:"///",relevance:0},
-{begin:"\x3c!--|--\x3e"},{begin:"</?",end:">"}]}]}),a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",end:"$",keywords:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},d,a.C_NUMBER_MODE,{beginKeywords:"class interface",end:/[{;=]/,illegal:/[^\s:]/,contains:[a.TITLE_MODE,a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace",end:/[{;=]/,illegal:/[^\s:]/,contains:[a.inherit(a.TITLE_MODE,{begin:"[a-zA-Z](\\.?\\w)*"}),
-a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE]},{className:"meta",begin:"^\\s*\\[",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{className:"meta-string",begin:/"/,end:/"/}]},{beginKeywords:"new return throw await else",relevance:0},{className:"function",begin:"("+e+"\\s+)+"+a.IDENT_RE+"\\s*\\(",returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:b,contains:[{begin:a.IDENT_RE+"\\s*\\(",returnBegin:!0,contains:[a.TITLE_MODE],relevance:0},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,
-keywords:b,relevance:0,contains:[d,a.C_NUMBER_MODE,a.C_BLOCK_COMMENT_MODE]},a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE]}]}});b.registerLanguage("css",function(a){return{case_insensitive:!0,illegal:/[=\/|'\$]/,contains:[a.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/},{className:"selector-class",begin:/\.[A-Za-z0-9_-]+/},{className:"selector-attr",begin:/\[/,end:/\]/,illegal:"$"},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"@(font-face|page)",
-lexemes:"[a-z-]+",keywords:"font-face page"},{begin:"@",end:"[{;]",illegal:/:/,contains:[{className:"keyword",begin:/\w+/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,contains:[a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,a.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0},{begin:"{",end:"}",illegal:/\S/,contains:[a.C_BLOCK_COMMENT_MODE,{begin:/[A-Z\_\.\-]+\s*:/,returnBegin:!0,end:";",endsWithParent:!0,contains:[{className:"attribute",begin:/\S/,end:":",
-excludeEnd:!0,starts:{endsWithParent:!0,excludeEnd:!0,contains:[{begin:/[\w-]+\(/,returnBegin:!0,contains:[{className:"built_in",begin:/[\w-]+/},{begin:/\(/,end:/\)/,contains:[a.APOS_STRING_MODE,a.QUOTE_STRING_MODE]}]},a.CSS_NUMBER_MODE,a.QUOTE_STRING_MODE,a.APOS_STRING_MODE,a.C_BLOCK_COMMENT_MODE,{className:"number",begin:"#[0-9A-Fa-f]+"},{className:"meta",begin:"!important"}]}}]}]}]}});b.registerLanguage("d",function(a){var b=a.COMMENT("\\/\\+","\\+\\/",{contains:["self"],relevance:10});return{lexemes:a.UNDERSCORE_IDENT_RE,
-keywords:{keyword:"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__",
-built_in:"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring",literal:"false null true"},contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,b,{className:"string",begin:'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',relevance:10},{className:"string",begin:'"',contains:[{begin:"\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};",relevance:0}],
+literal:"true false nullptr NULL"},m=[c,a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,e,b];return{aliases:"c cc h c++ h++ hpp".split(" "),keywords:k,illegal:"</",contains:m.concat([f,{begin:"\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",end:">",keywords:k,contains:["self",c]},{begin:a.IDENT_RE+"::",keywords:k},{variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",
+end:/;/}],keywords:k,contains:m.concat([{begin:/\(/,end:/\)/,keywords:k,contains:m.concat(["self"]),relevance:0}]),relevance:0},{className:"function",begin:"("+a.IDENT_RE+"[\\*&\\s]+)+"+g,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:k,illegal:/[^\w\s\*&]/,contains:[{begin:g,returnBegin:!0,contains:[a.TITLE_MODE],relevance:0},{className:"params",begin:/\(/,end:/\)/,keywords:k,relevance:0,contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,b,e,c,{begin:/\(/,end:/\)/,keywords:k,relevance:0,contains:["self",
+a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,b,e,c]}]},a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,f]},{className:"class",beginKeywords:"class struct",end:/[{;:]/,contains:[{begin:/</,end:/>/,contains:["self"]},a.TITLE_MODE]}]),exports:{preprocessor:f,strings:b,keywords:k}}});b.registerLanguage("arduino",function(a){var c=a.getLanguage("cpp").exports;return{keywords:{keyword:"boolean byte word string String array "+c.keywords.keyword,built_in:"setup loop while catch for if do goto try switch case else default break continue return KeyboardController MouseController SoftwareSerial EthernetServer EthernetClient LiquidCrystal RobotControl GSMVoiceCall EthernetUDP EsploraTFT HttpClient RobotMotor WiFiClient GSMScanner FileSystem Scheduler GSMServer YunClient YunServer IPAddress GSMClient GSMModem Keyboard Ethernet Console GSMBand Esplora Stepper Process WiFiUDP GSM_SMS Mailbox USBHost Firmata PImage Client Server GSMPIN FileIO Bridge Serial EEPROM Stream Mouse Audio Servo File Task GPRS WiFi Wire TFT GSM SPI SD runShellCommandAsynchronously analogWriteResolution retrieveCallingNumber printFirmwareVersion analogReadResolution sendDigitalPortPair noListenOnLocalhost readJoystickButton setFirmwareVersion readJoystickSwitch scrollDisplayRight getVoiceCallStatus scrollDisplayLeft writeMicroseconds delayMicroseconds beginTransmission getSignalStrength runAsynchronously getAsynchronously listenOnLocalhost getCurrentCarrier readAccelerometer messageAvailable sendDigitalPorts lineFollowConfig countryNameWrite runShellCommand readStringUntil rewindDirectory readTemperature setClockDivider readLightSensor endTransmission analogReference detachInterrupt countryNameRead attachInterrupt encryptionType readBytesUntil robotNameWrite readMicrophone robotNameRead cityNameWrite userNameWrite readJoystickY readJoystickX mouseReleased openNextFile scanNetworks noInterrupts digitalWrite beginSpeaker mousePressed isActionDone mouseDragged displayLogos noAutoscroll addParameter remoteNumber getModifiers keyboardRead userNameRead waitContinue processInput parseCommand printVersion readNetworks writeMessage blinkVersion cityNameRead readMessage setDataMode parsePacket isListening setBitOrder beginPacket isDirectory motorsWrite drawCompass digitalRead clearScreen serialEvent rightToLeft setTextSize leftToRight requestFrom keyReleased compassRead analogWrite interrupts WiFiServer disconnect playMelody parseFloat autoscroll getPINUsed setPINUsed setTimeout sendAnalog readSlider analogRead beginWrite createChar motorsStop keyPressed tempoWrite readButton subnetMask debugPrint macAddress writeGreen randomSeed attachGPRS readString sendString remotePort releaseAll mouseMoved background getXChange getYChange answerCall getResult voiceCall endPacket constrain getSocket writeJSON getButton available connected findUntil readBytes exitValue readGreen writeBlue startLoop IPAddress isPressed sendSysex pauseMode gatewayIP setCursor getOemKey tuneWrite noDisplay loadImage switchPIN onRequest onReceive changePIN playFile noBuffer parseInt overflow checkPIN knobRead beginTFT bitClear updateIR bitWrite position writeRGB highByte writeRed setSpeed readBlue noStroke remoteIP transfer shutdown hangCall beginSMS endWrite attached maintain noCursor checkReg checkPUK shiftOut isValid shiftIn pulseIn connect println localIP pinMode getIMEI display noBlink process getBand running beginSD drawBMP lowByte setBand release bitRead prepare pointTo readRed setMode noFill remove listen stroke detach attach noTone exists buffer height bitSet circle config cursor random IRread setDNS endSMS getKey micros millis begin print write ready flush width isPIN blink clear press mkdir rmdir close point yield image BSSID click delay read text move peek beep rect line open seek fill size turn stop home find step tone sqrt RSSI SSID end bit tan cos sin pow map abs max min get run put",
+literal:"DIGITAL_MESSAGE FIRMATA_STRING ANALOG_MESSAGE REPORT_DIGITAL REPORT_ANALOG INPUT_PULLUP SET_PIN_MODE INTERNAL2V56 SYSTEM_RESET LED_BUILTIN INTERNAL1V1 SYSEX_START INTERNAL EXTERNAL DEFAULT OUTPUT INPUT HIGH LOW"},contains:[c.preprocessor,a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,a.C_NUMBER_MODE]}});b.registerLanguage("armasm",function(a){return{case_insensitive:!0,aliases:["arm"],lexemes:"\\.?"+a.IDENT_RE,keywords:{meta:".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND ",
+built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 pc lr sp ip sl sb fp a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 {PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @"},
+contains:[{className:"keyword",begin:"\\b(adc|(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|wfe|wfi|yield)(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?[sptrx]?",
+end:"\\s"},a.COMMENT("[;@]","$",{relevance:0}),a.C_BLOCK_COMMENT_MODE,a.QUOTE_STRING_MODE,{className:"string",begin:"'",end:"[^\\\\]'",relevance:0},{className:"title",begin:"\\|",end:"\\|",illegal:"\\n",relevance:0},{className:"number",variants:[{begin:"[#$=]?0x[0-9a-f]+"},{begin:"[#$=]?0b[01]+"},{begin:"[#$=]\\d+"},{begin:"\\b\\d+"}],relevance:0},{className:"symbol",variants:[{begin:"^[a-z_\\.\\$][a-z0-9_\\.\\$]+"},{begin:"^\\s*[a-z_\\.\\$][a-z0-9_\\.\\$]+:"},{begin:"[=#]\\w+"}],relevance:0}]}});
+b.registerLanguage("xml",function(a){var c={endsWithParent:!0,illegal:/</,relevance:0,contains:[{className:"attr",begin:"[A-Za-z0-9\\._:-]+",relevance:0},{begin:/=\s*/,relevance:0,contains:[{className:"string",endsParent:!0,variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/},{begin:/[^\s"'=<>`]+/}]}]}]};return{aliases:"html xhtml rss atom xjb xsd xsl plist".split(" "),case_insensitive:!0,contains:[{className:"meta",begin:"<!DOCTYPE",end:">",relevance:10,contains:[{begin:"\\[",end:"\\]"}]},a.COMMENT("\x3c!--",
+"--\x3e",{relevance:10}),{begin:"<\\!\\[CDATA\\[",end:"\\]\\]>",relevance:10},{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{begin:/<\?(php)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},a.inherit(a.APOS_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),a.inherit(a.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0})]},{className:"tag",begin:"<style(?=\\s|>|$)",end:">",
+keywords:{name:"style"},contains:[c],starts:{end:"</style>",returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:"<script(?=\\s|>|$)",end:">",keywords:{name:"script"},contains:[c],starts:{end:"\x3c/script>",returnEnd:!0,subLanguage:["actionscript","javascript","handlebars","xml"]}},{className:"tag",begin:"</?",end:"/?>",contains:[{className:"name",begin:/[^\/><\s]+/,relevance:0},c]}]}});b.registerLanguage("asciidoc",function(a){return{aliases:["adoc"],contains:[a.COMMENT("^/{4,}\\n","\\n/{4,}$",
+{relevance:10}),a.COMMENT("^//","$",{relevance:0}),{className:"title",begin:"^\\.\\w.*$"},{begin:"^[=\\*]{4,}\\n",end:"\\n^[=\\*]{4,}$",relevance:10},{className:"section",relevance:10,variants:[{begin:"^(={1,5}) .+?( \\1)?$"},{begin:"^[^\\[\\]\\n]+?\\n[=\\-~\\^\\+]{2,}$"}]},{className:"meta",begin:"^:.+?:",end:"\\s",excludeEnd:!0,relevance:10},{className:"meta",begin:"^\\[.+?\\]$",relevance:0},{className:"quote",begin:"^_{4,}\\n",end:"\\n_{4,}$",relevance:10},{className:"code",begin:"^[\\-\\.]{4,}\\n",
+end:"\\n[\\-\\.]{4,}$",relevance:10},{begin:"^\\+{4,}\\n",end:"\\n\\+{4,}$",contains:[{begin:"<",end:">",subLanguage:"xml",relevance:0}],relevance:10},{className:"bullet",begin:"^(\\*+|\\-+|\\.+|[^\\n]+?::)\\s+"},{className:"symbol",begin:"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\s+",relevance:10},{className:"strong",begin:"\\B\\*(?![\\*\\s])",end:"(\\n{2}|\\*)",contains:[{begin:"\\\\*\\w",relevance:0}]},{className:"emphasis",begin:"\\B'(?!['\\s])",end:"(\\n{2}|')",contains:[{begin:"\\\\'\\w",relevance:0}],
+relevance:0},{className:"emphasis",begin:"_(?![_\\s])",end:"(\\n{2}|_)",relevance:0},{className:"string",variants:[{begin:"``.+?''"},{begin:"`.+?'"}]},{className:"code",begin:"(`.+?`|\\+.+?\\+)",relevance:0},{className:"code",begin:"^[ \\t]",end:"$",relevance:0},{begin:"^'{3,}[ \\t]*$",relevance:10},{begin:"(link:)?(http|https|ftp|file|irc|image:?):\\S+\\[.*?\\]",returnBegin:!0,contains:[{begin:"(link|image:?):",relevance:0},{className:"link",begin:"\\w",end:"[^\\[]+",relevance:0},{className:"string",
+begin:"\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0,relevance:0}],relevance:10}]}});b.registerLanguage("aspectj",function(a){return{keywords:"false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else extends implements break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws privileged aspectOf adviceexecution proceed cflowbelow cflow initialization preinitialization staticinitialization withincode target within execution getWithinTypeName handler thisJoinPoint thisJoinPointStaticPart thisEnclosingJoinPointStaticPart declare parents warning error soft precedence thisAspectInstance",
+illegal:/<\/|#/,contains:[a.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,{className:"class",beginKeywords:"aspect",end:/[{;=]/,excludeEnd:!0,illegal:/[:;"\[\]]/,contains:[{beginKeywords:"extends implements pertypewithin perthis pertarget percflowbelow percflow issingleton"},a.UNDERSCORE_TITLE_MODE,{begin:/\([^\)]*/,end:/[)]+/,keywords:"false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else extends implements break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws privileged aspectOf adviceexecution proceed cflowbelow cflow initialization preinitialization staticinitialization withincode target within execution getWithinTypeName handler thisJoinPoint thisJoinPointStaticPart thisEnclosingJoinPointStaticPart declare parents warning error soft precedence thisAspectInstance get set args call",
+excludeEnd:!1}]},{className:"class",beginKeywords:"class interface",end:/[{;=]/,excludeEnd:!0,relevance:0,keywords:"class interface",illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends implements"},a.UNDERSCORE_TITLE_MODE]},{beginKeywords:"pointcut after before around throwing returning",end:/[)]/,excludeEnd:!1,illegal:/["\[\]]/,contains:[{begin:a.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,contains:[a.UNDERSCORE_TITLE_MODE]}]},{begin:/[:]/,returnBegin:!0,end:/[{;]/,relevance:0,excludeEnd:!1,keywords:"false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else extends implements break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws privileged aspectOf adviceexecution proceed cflowbelow cflow initialization preinitialization staticinitialization withincode target within execution getWithinTypeName handler thisJoinPoint thisJoinPointStaticPart thisEnclosingJoinPointStaticPart declare parents warning error soft precedence thisAspectInstance",
+illegal:/["\[\]]/,contains:[{begin:a.UNDERSCORE_IDENT_RE+"\\s*\\(",keywords:"false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else extends implements break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws privileged aspectOf adviceexecution proceed cflowbelow cflow initialization preinitialization staticinitialization withincode target within execution getWithinTypeName handler thisJoinPoint thisJoinPointStaticPart thisEnclosingJoinPointStaticPart declare parents warning error soft precedence thisAspectInstance get set args call",
+relevance:0},a.QUOTE_STRING_MODE]},{beginKeywords:"new throw",relevance:0},{className:"function",begin:/\w+ +\w+(\.)?\w+\s*\([^\)]*\)\s*((throws)[\w\s,]+)?[\{;]/,returnBegin:!0,end:/[{;=]/,keywords:"false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else extends implements break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws privileged aspectOf adviceexecution proceed cflowbelow cflow initialization preinitialization staticinitialization withincode target within execution getWithinTypeName handler thisJoinPoint thisJoinPointStaticPart thisEnclosingJoinPointStaticPart declare parents warning error soft precedence thisAspectInstance",
+excludeEnd:!0,contains:[{begin:a.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[a.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/,relevance:0,keywords:"false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else extends implements break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws privileged aspectOf adviceexecution proceed cflowbelow cflow initialization preinitialization staticinitialization withincode target within execution getWithinTypeName handler thisJoinPoint thisJoinPointStaticPart thisEnclosingJoinPointStaticPart declare parents warning error soft precedence thisAspectInstance",
+contains:[a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,a.C_NUMBER_MODE,a.C_BLOCK_COMMENT_MODE]},a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE]},a.C_NUMBER_MODE,{className:"meta",begin:"@[A-Za-z]+"}]}});b.registerLanguage("autohotkey",function(a){var c={begin:"`[\\s\\S]"};return{case_insensitive:!0,aliases:["ahk"],keywords:{keyword:"Break Continue Critical Exit ExitApp Gosub Goto New OnExit Pause return SetBatchLines SetTimer Suspend Thread Throw Until ahk_id ahk_class ahk_pid ahk_exe ahk_group",literal:"A|0 true false NOT AND OR",
+built_in:"ComSpec Clipboard ClipboardAll ErrorLevel"},contains:[{className:"built_in",begin:"A_[a-zA-Z0-9]+"},c,a.inherit(a.QUOTE_STRING_MODE,{contains:[c]}),a.COMMENT(";","$",{relevance:0}),a.C_BLOCK_COMMENT_MODE,{className:"number",begin:a.NUMBER_RE,relevance:0},{className:"subst",begin:"%(?=[a-zA-Z0-9#_$@])",end:"%",illegal:"[^a-zA-Z0-9#_$@]"},{className:"built_in",begin:"^\\s*\\w+\\s*,"},{className:"meta",begin:"^\\s*#w+",end:"$",relevance:0},{className:"symbol",contains:[c],variants:[{begin:'^[^\\n";]+::(?!=)'},
+{begin:'^[^\\n";]+:(?!=)',relevance:0}]},{begin:",\\s*,"}]}});b.registerLanguage("autoit",function(a){var c={variants:[a.COMMENT(";","$",{relevance:0}),a.COMMENT("#cs","#ce"),a.COMMENT("#comments-start","#comments-end")]},b={begin:"\\$[A-z0-9_]+"},e={className:"string",variants:[{begin:/"/,end:/"/,contains:[{begin:/""/,relevance:0}]},{begin:/'/,end:/'/,contains:[{begin:/''/,relevance:0}]}]},f={variants:[a.BINARY_NUMBER_MODE,a.C_NUMBER_MODE]};return{case_insensitive:!0,illegal:/\/\*/,keywords:{keyword:"ByRef Case Const ContinueCase ContinueLoop Default Dim Do Else ElseIf EndFunc EndIf EndSelect EndSwitch EndWith Enum Exit ExitLoop For Func Global If In Local Next ReDim Return Select Static Step Switch Then To Until Volatile WEnd While With",
+built_in:"Abs ACos AdlibRegister AdlibUnRegister Asc AscW ASin Assign ATan AutoItSetOption AutoItWinGetTitle AutoItWinSetTitle Beep Binary BinaryLen BinaryMid BinaryToString BitAND BitNOT BitOR BitRotate BitShift BitXOR BlockInput Break Call CDTray Ceiling Chr ChrW ClipGet ClipPut ConsoleRead ConsoleWrite ConsoleWriteError ControlClick ControlCommand ControlDisable ControlEnable ControlFocus ControlGetFocus ControlGetHandle ControlGetPos ControlGetText ControlHide ControlListView ControlMove ControlSend ControlSetText ControlShow ControlTreeView Cos Dec DirCopy DirCreate DirGetSize DirMove DirRemove DllCall DllCallAddress DllCallbackFree DllCallbackGetPtr DllCallbackRegister DllClose DllOpen DllStructCreate DllStructGetData DllStructGetPtr DllStructGetSize DllStructSetData DriveGetDrive DriveGetFileSystem DriveGetLabel DriveGetSerial DriveGetType DriveMapAdd DriveMapDel DriveMapGet DriveSetLabel DriveSpaceFree DriveSpaceTotal DriveStatus EnvGet EnvSet EnvUpdate Eval Execute Exp FileChangeDir FileClose FileCopy FileCreateNTFSLink FileCreateShortcut FileDelete FileExists FileFindFirstFile FileFindNextFile FileFlush FileGetAttrib FileGetEncoding FileGetLongName FileGetPos FileGetShortcut FileGetShortName FileGetSize FileGetTime FileGetVersion FileInstall FileMove FileOpen FileOpenDialog FileRead FileReadLine FileReadToArray FileRecycle FileRecycleEmpty FileSaveDialog FileSelectFolder FileSetAttrib FileSetEnd FileSetPos FileSetTime FileWrite FileWriteLine Floor FtpSetProxy FuncName GUICreate GUICtrlCreateAvi GUICtrlCreateButton GUICtrlCreateCheckbox GUICtrlCreateCombo GUICtrlCreateContextMenu GUICtrlCreateDate GUICtrlCreateDummy GUICtrlCreateEdit GUICtrlCreateGraphic GUICtrlCreateGroup GUICtrlCreateIcon GUICtrlCreateInput GUICtrlCreateLabel GUICtrlCreateList GUICtrlCreateListView GUICtrlCreateListViewItem GUICtrlCreateMenu GUICtrlCreateMenuItem GUICtrlCreateMonthCal GUICtrlCreateObj GUICtrlCreatePic GUICtrlCreateProgress GUICtrlCreateRadio GUICtrlCreateSlider GUICtrlCreateTab GUICtrlCreateTabItem GUICtrlCreateTreeView GUICtrlCreateTreeViewItem GUICtrlCreateUpdown GUICtrlDelete GUICtrlGetHandle GUICtrlGetState GUICtrlRead GUICtrlRecvMsg GUICtrlRegisterListViewSort GUICtrlSendMsg GUICtrlSendToDummy GUICtrlSetBkColor GUICtrlSetColor GUICtrlSetCursor GUICtrlSetData GUICtrlSetDefBkColor GUICtrlSetDefColor GUICtrlSetFont GUICtrlSetGraphic GUICtrlSetImage GUICtrlSetLimit GUICtrlSetOnEvent GUICtrlSetPos GUICtrlSetResizing GUICtrlSetState GUICtrlSetStyle GUICtrlSetTip GUIDelete GUIGetCursorInfo GUIGetMsg GUIGetStyle GUIRegisterMsg GUISetAccelerators GUISetBkColor GUISetCoord GUISetCursor GUISetFont GUISetHelp GUISetIcon GUISetOnEvent GUISetState GUISetStyle GUIStartGroup GUISwitch Hex HotKeySet HttpSetProxy HttpSetUserAgent HWnd InetClose InetGet InetGetInfo InetGetSize InetRead IniDelete IniRead IniReadSection IniReadSectionNames IniRenameSection IniWrite IniWriteSection InputBox Int IsAdmin IsArray IsBinary IsBool IsDeclared IsDllStruct IsFloat IsFunc IsHWnd IsInt IsKeyword IsNumber IsObj IsPtr IsString Log MemGetStats Mod MouseClick MouseClickDrag MouseDown MouseGetCursor MouseGetPos MouseMove MouseUp MouseWheel MsgBox Number ObjCreate ObjCreateInterface ObjEvent ObjGet ObjName OnAutoItExitRegister OnAutoItExitUnRegister Ping PixelChecksum PixelGetColor PixelSearch ProcessClose ProcessExists ProcessGetStats ProcessList ProcessSetPriority ProcessWait ProcessWaitClose ProgressOff ProgressOn ProgressSet Ptr Random RegDelete RegEnumKey RegEnumVal RegRead RegWrite Round Run RunAs RunAsWait RunWait Send SendKeepActive SetError SetExtended ShellExecute ShellExecuteWait Shutdown Sin Sleep SoundPlay SoundSetWaveVolume SplashImageOn SplashOff SplashTextOn Sqrt SRandom StatusbarGetText StderrRead StdinWrite StdioClose StdoutRead String StringAddCR StringCompare StringFormat StringFromASCIIArray StringInStr StringIsAlNum StringIsAlpha StringIsASCII StringIsDigit StringIsFloat StringIsInt StringIsLower StringIsSpace StringIsUpper StringIsXDigit StringLeft StringLen StringLower StringMid StringRegExp StringRegExpReplace StringReplace StringReverse StringRight StringSplit StringStripCR StringStripWS StringToASCIIArray StringToBinary StringTrimLeft StringTrimRight StringUpper Tan TCPAccept TCPCloseSocket TCPConnect TCPListen TCPNameToIP TCPRecv TCPSend TCPShutdown, UDPShutdown TCPStartup, UDPStartup TimerDiff TimerInit ToolTip TrayCreateItem TrayCreateMenu TrayGetMsg TrayItemDelete TrayItemGetHandle TrayItemGetState TrayItemGetText TrayItemSetOnEvent TrayItemSetState TrayItemSetText TraySetClick TraySetIcon TraySetOnEvent TraySetPauseIcon TraySetState TraySetToolTip TrayTip UBound UDPBind UDPCloseSocket UDPOpen UDPRecv UDPSend VarGetType WinActivate WinActive WinClose WinExists WinFlash WinGetCaretPos WinGetClassList WinGetClientSize WinGetHandle WinGetPos WinGetProcess WinGetState WinGetText WinGetTitle WinKill WinList WinMenuSelectItem WinMinimizeAll WinMinimizeAllUndo WinMove WinSetOnTop WinSetState WinSetTitle WinSetTrans WinWait",
+literal:"True False And Null Not Or"},contains:[c,b,e,f,{className:"meta",begin:"#",end:"$",keywords:{"meta-keyword":"comments include include-once NoTrayIcon OnAutoItStartRegister pragma compile RequireAdmin"},contains:[{begin:/\\\n/,relevance:0},{beginKeywords:"include",keywords:{"meta-keyword":"include"},end:"$",contains:[e,{className:"meta-string",variants:[{begin:"<",end:">"},{begin:/"/,end:/"/,contains:[{begin:/""/,relevance:0}]},{begin:/'/,end:/'/,contains:[{begin:/''/,relevance:0}]}]}]},e,
+c]},{className:"symbol",begin:"@[A-z0-9_]+"},{className:"function",beginKeywords:"Func",end:"$",illegal:"\\$|\\[|%",contains:[a.UNDERSCORE_TITLE_MODE,{className:"params",begin:"\\(",end:"\\)",contains:[b,e,f]}]}]}});b.registerLanguage("avrasm",function(a){return{case_insensitive:!0,lexemes:"\\.?"+a.IDENT_RE,keywords:{keyword:"adc add adiw and andi asr bclr bld brbc brbs brcc brcs break breq brge brhc brhs brid brie brlo brlt brmi brne brpl brsh brtc brts brvc brvs bset bst call cbi cbr clc clh cli cln clr cls clt clv clz com cp cpc cpi cpse dec eicall eijmp elpm eor fmul fmuls fmulsu icall ijmp in inc jmp ld ldd ldi lds lpm lsl lsr mov movw mul muls mulsu neg nop or ori out pop push rcall ret reti rjmp rol ror sbc sbr sbrc sbrs sec seh sbi sbci sbic sbis sbiw sei sen ser ses set sev sez sleep spm st std sts sub subi swap tst wdr",
+built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 r23 r24 r25 r26 r27 r28 r29 r30 r31 x|0 xh xl y|0 yh yl z|0 zh zl ucsr1c udr1 ucsr1a ucsr1b ubrr1l ubrr1h ucsr0c ubrr0h tccr3c tccr3a tccr3b tcnt3h tcnt3l ocr3ah ocr3al ocr3bh ocr3bl ocr3ch ocr3cl icr3h icr3l etimsk etifr tccr1c ocr1ch ocr1cl twcr twdr twar twsr twbr osccal xmcra xmcrb eicra spmcsr spmcr portg ddrg ping portf ddrf sreg sph spl xdiv rampz eicrb eimsk gimsk gicr eifr gifr timsk tifr mcucr mcucsr tccr0 tcnt0 ocr0 assr tccr1a tccr1b tcnt1h tcnt1l ocr1ah ocr1al ocr1bh ocr1bl icr1h icr1l tccr2 tcnt2 ocr2 ocdr wdtcr sfior eearh eearl eedr eecr porta ddra pina portb ddrb pinb portc ddrc pinc portd ddrd pind spdr spsr spcr udr0 ucsr0a ucsr0b ubrr0l acsr admux adcsr adch adcl porte ddre pine pinf",
+meta:".byte .cseg .db .def .device .dseg .dw .endmacro .equ .eseg .exit .include .list .listmac .macro .nolist .org .set"},contains:[a.C_BLOCK_COMMENT_MODE,a.COMMENT(";","$",{relevance:0}),a.C_NUMBER_MODE,a.BINARY_NUMBER_MODE,{className:"number",begin:"\\b(\\$[a-zA-Z0-9]+|0o[0-7]+)"},a.QUOTE_STRING_MODE,{className:"string",begin:"'",end:"[^\\\\]'",illegal:"[^\\\\][^']"},{className:"symbol",begin:"^[A-Za-z0-9_.$]+:"},{className:"meta",begin:"#",end:"$"},{className:"subst",begin:"@[0-9]+"}]}});b.registerLanguage("awk",
+function(a){return{keywords:{keyword:"BEGIN END if else while do for in break continue delete next nextfile function func exit|10"},contains:[{className:"variable",variants:[{begin:/\$[\w\d#@][\w\d_]*/},{begin:/\$\{(.*?)}/}]},{className:"string",contains:[a.BACKSLASH_ESCAPE],variants:[{begin:/(u|b)?r?'''/,end:/'''/,relevance:10},{begin:/(u|b)?r?"""/,end:/"""/,relevance:10},{begin:/(u|r|ur)'/,end:/'/,relevance:10},{begin:/(u|r|ur)"/,end:/"/,relevance:10},{begin:/(b|br)'/,end:/'/},{begin:/(b|br)"/,
+end:/"/},a.APOS_STRING_MODE,a.QUOTE_STRING_MODE]},a.REGEXP_MODE,a.HASH_COMMENT_MODE,a.NUMBER_MODE]}});b.registerLanguage("axapta",function(a){return{keywords:"false int abstract private char boolean static null if for true while long throw finally protected final return void enum else break new catch byte super case short default double public try this switch continue reverse firstfast firstonly forupdate nofetch sum avg minof maxof count order group by asc desc index hint like dispaly edit client server ttsbegin ttscommit str real date container anytype common div mod",
+contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,a.C_NUMBER_MODE,{className:"meta",begin:"#",end:"$"},{className:"class",beginKeywords:"class interface",end:"{",excludeEnd:!0,illegal:":",contains:[{beginKeywords:"extends implements"},a.UNDERSCORE_TITLE_MODE]}]}});b.registerLanguage("bash",function(a){var c={className:"variable",variants:[{begin:/\$[\w\d#@][\w\d_]*/},{begin:/\$\{(.*?)}/}]},b={className:"string",begin:/"/,end:/"/,contains:[a.BACKSLASH_ESCAPE,
+c,{className:"variable",begin:/\$\(/,end:/\)/,contains:[a.BACKSLASH_ESCAPE]}]};return{aliases:["sh","zsh"],lexemes:/\b-?[a-z\._]+\b/,keywords:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",
+_:"-ne -eq -lt -gt -f -d -e -s -l -a"},contains:[{className:"meta",begin:/^#![^\n]+sh\s*$/,relevance:10},{className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[a.inherit(a.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0},a.HASH_COMMENT_MODE,b,{className:"string",begin:/'/,end:/'/},c]}});b.registerLanguage("basic",function(a){return{case_insensitive:!0,illegal:"^.",lexemes:"[a-zA-Z][a-zA-Z0-9_$%!#]*",keywords:{keyword:"ABS ASC AND ATN AUTO|0 BEEP BLOAD|10 BSAVE|10 CALL CALLS CDBL CHAIN CHDIR CHR$|10 CINT CIRCLE CLEAR CLOSE CLS COLOR COM COMMON CONT COS CSNG CSRLIN CVD CVI CVS DATA DATE$ DEFDBL DEFINT DEFSNG DEFSTR DEF|0 SEG USR DELETE DIM DRAW EDIT END ENVIRON ENVIRON$ EOF EQV ERASE ERDEV ERDEV$ ERL ERR ERROR EXP FIELD FILES FIX FOR|0 FRE GET GOSUB|10 GOTO HEX$ IF|0 THEN ELSE|0 INKEY$ INP INPUT INPUT# INPUT$ INSTR IMP INT IOCTL IOCTL$ KEY ON OFF LIST KILL LEFT$ LEN LET LINE LLIST LOAD LOC LOCATE LOF LOG LPRINT USING LSET MERGE MID$ MKDIR MKD$ MKI$ MKS$ MOD NAME NEW NEXT NOISE NOT OCT$ ON OR PEN PLAY STRIG OPEN OPTION BASE OUT PAINT PALETTE PCOPY PEEK PMAP POINT POKE POS PRINT PRINT] PSET PRESET PUT RANDOMIZE READ REM RENUM RESET|0 RESTORE RESUME RETURN|0 RIGHT$ RMDIR RND RSET RUN SAVE SCREEN SGN SHELL SIN SOUND SPACE$ SPC SQR STEP STICK STOP STR$ STRING$ SWAP SYSTEM TAB TAN TIME$ TIMER TROFF TRON TO USR VAL VARPTR VARPTR$ VIEW WAIT WHILE WEND WIDTH WINDOW WRITE XOR"},
+contains:[a.QUOTE_STRING_MODE,a.COMMENT("REM","$",{relevance:10}),a.COMMENT("'","$",{relevance:0}),{className:"symbol",begin:"^[0-9]+ ",relevance:10},{className:"number",begin:"\\b([0-9]+[0-9edED.]*[#!]?)",relevance:0},{className:"number",begin:"(&[hH][0-9a-fA-F]{1,4})"},{className:"number",begin:"(&[oO][0-7]{1,6})"}]}});b.registerLanguage("bnf",function(a){return{contains:[{className:"attribute",begin:/</,end:/>/},{begin:/::=/,starts:{end:/$/,contains:[{begin:/</,end:/>/},a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,
+a.APOS_STRING_MODE,a.QUOTE_STRING_MODE]}}]}});b.registerLanguage("brainfuck",function(a){var c={className:"literal",begin:"[\\+\\-]",relevance:0};return{aliases:["bf"],contains:[a.COMMENT("[^\\[\\]\\.,\\+\\-<> \r\n]","[\\[\\]\\.,\\+\\-<> \r\n]",{returnEnd:!0,relevance:0}),{className:"title",begin:"[\\[\\]]",relevance:0},{className:"string",begin:"[\\.,]",relevance:0},{begin:/\+\+|\-\-/,returnBegin:!0,contains:[c]},c]}});b.registerLanguage("cal",function(a){var c=[a.C_LINE_COMMENT_MODE,a.COMMENT(/\{/,
+/\}/,{relevance:0}),a.COMMENT(/\(\*/,/\*\)/,{relevance:10})],b={className:"string",begin:/'/,end:/'/,contains:[{begin:/''/}]},e={className:"string",begin:/(#\d+)+/};c={className:"function",beginKeywords:"procedure",end:/[:;]/,keywords:"procedure|10",contains:[a.TITLE_MODE,{className:"params",begin:/\(/,end:/\)/,keywords:"div mod in and or not xor asserterror begin case do downto else end exit for if of repeat then to until while with var",contains:[b,e]}].concat(c)};return{case_insensitive:!0,keywords:{keyword:"div mod in and or not xor asserterror begin case do downto else end exit for if of repeat then to until while with var",
+literal:"false true"},illegal:/\/\*/,contains:[b,e,{className:"number",begin:"\\b\\d+(\\.\\d+)?(DT|D|T)",relevance:0},{className:"string",begin:'"',end:'"'},a.NUMBER_MODE,{className:"class",begin:"OBJECT (Table|Form|Report|Dataport|Codeunit|XMLport|MenuSuite|Page|Query) (\\d+) ([^\\r\\n]+)",returnBegin:!0,contains:[a.TITLE_MODE,c]},c]}});b.registerLanguage("capnproto",function(a){return{aliases:["capnp"],keywords:{keyword:"struct enum interface union group import using const annotation extends in of on as with from fixed",
+built_in:"Void Bool Int8 Int16 Int32 Int64 UInt8 UInt16 UInt32 UInt64 Float32 Float64 Text Data AnyPointer AnyStruct Capability List",literal:"true false"},contains:[a.QUOTE_STRING_MODE,a.NUMBER_MODE,a.HASH_COMMENT_MODE,{className:"meta",begin:/@0x[\w\d]{16};/,illegal:/\n/},{className:"symbol",begin:/@\d+\b/},{className:"class",beginKeywords:"struct enum",end:/\{/,illegal:/\n/,contains:[a.inherit(a.TITLE_MODE,{starts:{endsWithParent:!0,excludeEnd:!0}})]},{className:"class",beginKeywords:"interface",
+end:/\{/,illegal:/\n/,contains:[a.inherit(a.TITLE_MODE,{starts:{endsWithParent:!0,excludeEnd:!0}})]}]}});b.registerLanguage("ceylon",function(a){var c={className:"subst",excludeBegin:!0,excludeEnd:!0,begin:/``/,end:/``/,keywords:"assembly module package import alias class interface object given value assign void function new of extends satisfies abstracts in out return break continue throw assert dynamic if else switch case for while try catch finally then let this outer super is exists nonempty",
+relevance:10},b=[{className:"string",begin:'"""',end:'"""',relevance:10},{className:"string",begin:'"',end:'"',contains:[c]},{className:"string",begin:"'",end:"'"},{className:"number",begin:"#[0-9a-fA-F_]+|\\$[01_]+|[0-9_]+(?:\\.[0-9_](?:[eE][+-]?\\d+)?)?[kMGTPmunpf]?",relevance:0}];c.contains=b;return{keywords:{keyword:"assembly module package import alias class interface object given value assign void function new of extends satisfies abstracts in out return break continue throw assert dynamic if else switch case for while try catch finally then let this outer super is exists nonempty shared abstract formal default actual variable late native deprecatedfinal sealed annotation suppressWarnings small",
+meta:"doc by license see throws tagged"},illegal:"\\$[^01]|#[^0-9a-fA-F]",contains:[a.C_LINE_COMMENT_MODE,a.COMMENT("/\\*","\\*/",{contains:["self"]}),{className:"meta",begin:'@[a-z]\\w*(?:\\:"[^"]*")?'}].concat(b)}});b.registerLanguage("clean",function(a){return{aliases:["clean","icl","dcl"],keywords:{keyword:"if let in with where case of class instance otherwise implementation definition system module from import qualified as special code inline foreign export ccall stdcall generic derive infix infixl infixr",
+built_in:"Int Real Char Bool",literal:"True False"},contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,a.C_NUMBER_MODE,{begin:"->|<-[|:]?|#!?|>>=|\\{\\||\\|\\}|:==|=:|<>"}]}});b.registerLanguage("clojure",function(a){var c={className:"number",begin:"[-+]?\\d+(\\.\\d+)?",relevance:0},b=a.inherit(a.QUOTE_STRING_MODE,{illegal:null}),e=a.COMMENT(";","$",{relevance:0}),f={className:"literal",begin:/\b(true|false|nil)\b/},g={begin:"[\\[\\{]",end:"[\\]\\}]"},k=
+{className:"comment",begin:"\\^[a-zA-Z_\\-!.?+*=<>&#'][a-zA-Z_\\-!.?+*=<>&#'0-9/;:]*"},m=a.COMMENT("\\^\\{","\\}"),p={className:"symbol",begin:"[:]{1,2}[a-zA-Z_\\-!.?+*=<>&#'][a-zA-Z_\\-!.?+*=<>&#'0-9/;:]*"},n={begin:"\\(",end:"\\)"},h={endsWithParent:!0,relevance:0},l={keywords:{"builtin-name":"def defonce cond apply if-not if-let if not not= = < > <= >= == + / * - rem quot neg? pos? delay? symbol? keyword? true? false? integer? empty? coll? list? set? ifn? fn? associative? sequential? sorted? counted? reversible? number? decimal? class? distinct? isa? float? rational? reduced? ratio? odd? even? char? seq? vector? string? map? nil? contains? zero? instance? not-every? not-any? libspec? -> ->> .. . inc compare do dotimes mapcat take remove take-while drop letfn drop-last take-last drop-while while intern condp case reduced cycle split-at split-with repeat replicate iterate range merge zipmap declare line-seq sort comparator sort-by dorun doall nthnext nthrest partition eval doseq await await-for let agent atom send send-off release-pending-sends add-watch mapv filterv remove-watch agent-error restart-agent set-error-handler error-handler set-error-mode! error-mode shutdown-agents quote var fn loop recur throw try monitor-enter monitor-exit defmacro defn defn- macroexpand macroexpand-1 for dosync and or when when-not when-let comp juxt partial sequence memoize constantly complement identity assert peek pop doto proxy defstruct first rest cons defprotocol cast coll deftype defrecord last butlast sigs reify second ffirst fnext nfirst nnext defmulti defmethod meta with-meta ns in-ns create-ns import refer keys select-keys vals key val rseq name namespace promise into transient persistent! conj! assoc! dissoc! pop! disj! use class type num float double short byte boolean bigint biginteger bigdec print-method print-dup throw-if printf format load compile get-in update-in pr pr-on newline flush read slurp read-line subvec with-open memfn time re-find re-groups rand-int rand mod locking assert-valid-fdecl alias resolve ref deref refset swap! reset! set-validator! compare-and-set! alter-meta! reset-meta! commute get-validator alter ref-set ref-history-count ref-min-history ref-max-history ensure sync io! new next conj set! to-array future future-call into-array aset gen-class reduce map filter find empty hash-map hash-set sorted-map sorted-map-by sorted-set sorted-set-by vec vector seq flatten reverse assoc dissoc list disj get union difference intersection extend extend-type extend-protocol int nth delay count concat chunk chunk-buffer chunk-append chunk-first chunk-rest max min dec unchecked-inc-int unchecked-inc unchecked-dec-inc unchecked-dec unchecked-negate unchecked-add-int unchecked-add unchecked-subtract-int unchecked-subtract chunk-next chunk-cons chunked-seq? prn vary-meta lazy-seq spread list* str find-keyword keyword symbol gensym force rationalize"},
+lexemes:"[a-zA-Z_\\-!.?+*=<>&#'][a-zA-Z_\\-!.?+*=<>&#'0-9/;:]*",className:"name",begin:"[a-zA-Z_\\-!.?+*=<>&#'][a-zA-Z_\\-!.?+*=<>&#'0-9/;:]*",starts:h},q=[n,b,k,m,e,p,g,c,f,{begin:"[a-zA-Z_\\-!.?+*=<>&#'][a-zA-Z_\\-!.?+*=<>&#'0-9/;:]*",relevance:0}];n.contains=[a.COMMENT("comment",""),l,h];h.contains=q;g.contains=q;m.contains=[g];return{aliases:["clj"],illegal:/\S/,contains:[n,b,k,m,e,p,g,c,f]}});b.registerLanguage("clojure-repl",function(a){return{contains:[{className:"meta",begin:/^([\w.-]+|\s*#_)?=>/,
+starts:{end:/$/,subLanguage:"clojure"}}]}});b.registerLanguage("cmake",function(a){return{aliases:["cmake.in"],case_insensitive:!0,keywords:{keyword:"break cmake_host_system_information cmake_minimum_required cmake_parse_arguments cmake_policy configure_file continue elseif else endforeach endfunction endif endmacro endwhile execute_process file find_file find_library find_package find_path find_program foreach function get_cmake_property get_directory_property get_filename_component get_property if include include_guard list macro mark_as_advanced math message option return separate_arguments set_directory_properties set_property set site_name string unset variable_watch while add_compile_definitions add_compile_options add_custom_command add_custom_target add_definitions add_dependencies add_executable add_library add_link_options add_subdirectory add_test aux_source_directory build_command create_test_sourcelist define_property enable_language enable_testing export fltk_wrap_ui get_source_file_property get_target_property get_test_property include_directories include_external_msproject include_regular_expression install link_directories link_libraries load_cache project qt_wrap_cpp qt_wrap_ui remove_definitions set_source_files_properties set_target_properties set_tests_properties source_group target_compile_definitions target_compile_features target_compile_options target_include_directories target_link_directories target_link_libraries target_link_options target_sources try_compile try_run ctest_build ctest_configure ctest_coverage ctest_empty_binary_directory ctest_memcheck ctest_read_custom_files ctest_run_script ctest_sleep ctest_start ctest_submit ctest_test ctest_update ctest_upload build_name exec_program export_library_dependencies install_files install_programs install_targets load_command make_directory output_required_files remove subdir_depends subdirs use_mangled_mesa utility_source variable_requires write_file qt5_use_modules qt5_use_package qt5_wrap_cpp on off true false and or not command policy target test exists is_newer_than is_directory is_symlink is_absolute matches less greater equal less_equal greater_equal strless strgreater strequal strless_equal strgreater_equal version_less version_greater version_equal version_less_equal version_greater_equal in_list defined"},
+contains:[{className:"variable",begin:"\\${",end:"}"},a.HASH_COMMENT_MODE,a.QUOTE_STRING_MODE,a.NUMBER_MODE]}});b.registerLanguage("coffeescript",function(a){var c={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super yield import export from as default await then unless until loop of by when and or is isnt not",literal:"true false null undefined yes no on off",built_in:"npm require console print module global window document"},
+b={className:"subst",begin:/#\{/,end:/}/,keywords:c},e=[a.BINARY_NUMBER_MODE,a.inherit(a.C_NUMBER_MODE,{starts:{end:"(\\s*/)?",relevance:0}}),{className:"string",variants:[{begin:/'''/,end:/'''/,contains:[a.BACKSLASH_ESCAPE]},{begin:/'/,end:/'/,contains:[a.BACKSLASH_ESCAPE]},{begin:/"""/,end:/"""/,contains:[a.BACKSLASH_ESCAPE,b]},{begin:/"/,end:/"/,contains:[a.BACKSLASH_ESCAPE,b]}]},{className:"regexp",variants:[{begin:"///",end:"///",contains:[b,a.HASH_COMMENT_MODE]},{begin:"//[gim]*",relevance:0},
+{begin:/\/(?![ *])(\\\/|.)*?\/[gim]*(?=\W|$)/}]},{begin:"@[A-Za-z$_][0-9A-Za-z$_]*"},{subLanguage:"javascript",excludeBegin:!0,excludeEnd:!0,variants:[{begin:"```",end:"```"},{begin:"`",end:"`"}]}];b.contains=e;b=a.inherit(a.TITLE_MODE,{begin:"[A-Za-z$_][0-9A-Za-z$_]*"});var f={className:"params",begin:"\\([^\\(]",returnBegin:!0,contains:[{begin:/\(/,end:/\)/,keywords:c,contains:["self"].concat(e)}]};return{aliases:["coffee","cson","iced"],keywords:c,illegal:/\/\*/,contains:e.concat([a.COMMENT("###",
+"###"),a.HASH_COMMENT_MODE,{className:"function",begin:"^\\s*[A-Za-z$_][0-9A-Za-z$_]*\\s*=\\s*(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[b,f]},{begin:/[:\(,=]\s*/,relevance:0,contains:[{className:"function",begin:"(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[f]}]},{className:"class",beginKeywords:"class",end:"$",illegal:/[:="\[\]]/,contains:[{beginKeywords:"extends",endsWithParent:!0,illegal:/[:="\[\]]/,contains:[b]},b]},{begin:"[A-Za-z$_][0-9A-Za-z$_]*:",end:":",
+returnBegin:!0,returnEnd:!0,relevance:0}])}});b.registerLanguage("coq",function(a){return{keywords:{keyword:"_ as at cofix else end exists exists2 fix for forall fun if IF in let match mod Prop return Set then Type using where with Abort About Add Admit Admitted All Arguments Assumptions Axiom Back BackTo Backtrack Bind Blacklist Canonical Cd Check Class Classes Close Coercion Coercions CoFixpoint CoInductive Collection Combined Compute Conjecture Conjectures Constant constr Constraint Constructors Context Corollary CreateHintDb Cut Declare Defined Definition Delimit Dependencies DependentDerive Drop eauto End Equality Eval Example Existential Existentials Existing Export exporting Extern Extract Extraction Fact Field Fields File Fixpoint Focus for From Function Functional Generalizable Global Goal Grab Grammar Graph Guarded Heap Hint HintDb Hints Hypotheses Hypothesis ident Identity If Immediate Implicit Import Include Inductive Infix Info Initial Inline Inspect Instance Instances Intro Intros Inversion Inversion_clear Language Left Lemma Let Libraries Library Load LoadPath Local Locate Ltac ML Mode Module Modules Monomorphic Morphism Next NoInline Notation Obligation Obligations Opaque Open Optimize Options Parameter Parameters Parametric Path Paths pattern Polymorphic Preterm Print Printing Program Projections Proof Proposition Pwd Qed Quit Rec Record Recursive Redirect Relation Remark Remove Require Reserved Reset Resolve Restart Rewrite Right Ring Rings Save Scheme Scope Scopes Script Search SearchAbout SearchHead SearchPattern SearchRewrite Section Separate Set Setoid Show Solve Sorted Step Strategies Strategy Structure SubClass Table Tables Tactic Term Test Theorem Time Timeout Transparent Type Typeclasses Types Undelimit Undo Unfocus Unfocused Unfold Universe Universes Unset Unshelve using Variable Variables Variant Verbose Visibility where with",
+built_in:"abstract absurd admit after apply as assert assumption at auto autorewrite autounfold before bottom btauto by case case_eq cbn cbv change classical_left classical_right clear clearbody cofix compare compute congruence constr_eq constructor contradict contradiction cut cutrewrite cycle decide decompose dependent destruct destruction dintuition discriminate discrR do double dtauto eapply eassumption eauto ecase econstructor edestruct ediscriminate eelim eexact eexists einduction einjection eleft elim elimtype enough equality erewrite eright esimplify_eq esplit evar exact exactly_once exfalso exists f_equal fail field field_simplify field_simplify_eq first firstorder fix fold fourier functional generalize generalizing gfail give_up has_evar hnf idtac in induction injection instantiate intro intro_pattern intros intuition inversion inversion_clear is_evar is_var lapply lazy left lia lra move native_compute nia nsatz omega once pattern pose progress proof psatz quote record red refine reflexivity remember rename repeat replace revert revgoals rewrite rewrite_strat right ring ring_simplify rtauto set setoid_reflexivity setoid_replace setoid_rewrite setoid_symmetry setoid_transitivity shelve shelve_unifiable simpl simple simplify_eq solve specialize split split_Rabs split_Rmult stepl stepr subst sum swap symmetry tactic tauto time timeout top transitivity trivial try tryif unfold unify until using vm_compute with"},
+contains:[a.QUOTE_STRING_MODE,a.COMMENT("\\(\\*","\\*\\)"),a.C_NUMBER_MODE,{className:"type",excludeBegin:!0,begin:"\\|\\s*",end:"\\w+"},{begin:/[-=]>/}]}});b.registerLanguage("cos",function(a){return{case_insensitive:!0,aliases:["cos","cls"],keywords:"property parameter class classmethod clientmethod extends as break catch close continue do d|0 else elseif for goto halt hang h|0 if job j|0 kill k|0 lock l|0 merge new open quit q|0 read r|0 return set s|0 tcommit throw trollback try tstart use view while write w|0 xecute x|0 zkill znspace zn ztrap zwrite zw zzdump zzwrite print zbreak zinsert zload zprint zremove zsave zzprint mv mvcall mvcrt mvdim mvprint zquit zsync ascii",
+contains:[{className:"number",begin:"\\b(\\d+(\\.\\d*)?|\\.\\d+)",relevance:0},{className:"string",variants:[{begin:'"',end:'"',contains:[{begin:'""',relevance:0}]}]},a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,{className:"comment",begin:/;/,end:"$",relevance:0},{className:"built_in",begin:/(?:\$\$?|\.\.)\^?[a-zA-Z]+/},{className:"built_in",begin:/\$\$\$[a-zA-Z]+/},{className:"built_in",begin:/%[a-z]+(?:\.[a-z]+)*/},{className:"symbol",begin:/\^%?[a-zA-Z][\w]*/},{className:"keyword",begin:/##class|##super|#define|#dim/},
+{begin:/&sql\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,subLanguage:"sql"},{begin:/&(js|jscript|javascript)</,end:/>/,excludeBegin:!0,excludeEnd:!0,subLanguage:"javascript"},{begin:/&html<\s*</,end:/>\s*>/,subLanguage:"xml"}]}});b.registerLanguage("crmsh",function(a){return{aliases:["crm","pcmk"],case_insensitive:!0,keywords:{keyword:"params meta operations op rule attributes utilization read write deny defined not_defined in_range date spec in ref reference attribute type xpath version and or lt gt tag lte gte eq ne \\ number string",
+literal:"Master Started Slave Stopped start promote demote stop monitor true false"},contains:[a.HASH_COMMENT_MODE,{beginKeywords:"node",starts:{end:"\\s*([\\w_-]+:)?",starts:{className:"title",end:"\\s*[\\$\\w_][\\w_-]*"}}},{beginKeywords:"primitive rsc_template",starts:{className:"title",end:"\\s*[\\$\\w_][\\w_-]*",starts:{end:"\\s*@?[\\w_][\\w_\\.:-]*"}}},{begin:"\\b(group|clone|ms|master|location|colocation|order|fencing_topology|rsc_ticket|acl_target|acl_group|user|role|tag|xml)\\s+",keywords:"group clone ms master location colocation order fencing_topology rsc_ticket acl_target acl_group user role tag xml",
+starts:{className:"title",end:"[\\$\\w_][\\w_-]*"}},{beginKeywords:"property rsc_defaults op_defaults",starts:{className:"title",end:"\\s*([\\w_-]+:)?"}},a.QUOTE_STRING_MODE,{className:"meta",begin:"(ocf|systemd|service|lsb):[\\w_:-]+",relevance:0},{className:"number",begin:"\\b\\d+(\\.\\d+)?(ms|s|h|m)?",relevance:0},{className:"literal",begin:"[-]?(infinity|inf)",relevance:0},{className:"attr",begin:/([A-Za-z\$_#][\w_-]+)=/,relevance:0},{className:"tag",begin:"</?",end:"/?>",relevance:0}]}});b.registerLanguage("crystal",
+function(a){function c(a,c){a=[{begin:a,end:c}];return a[0].contains=a}var b={keyword:"abstract alias annotation as as? asm begin break case class def do else elsif end ensure enum extend for fun if include instance_sizeof is_a? lib macro module next nil? of out pointerof private protected rescue responds_to? return require select self sizeof struct super then type typeof union uninitialized unless until verbatim when while with yield __DIR__ __END_LINE__ __FILE__ __LINE__",literal:"false nil true"},
+e={className:"subst",begin:"#{",end:"}",keywords:b},f={className:"template-variable",variants:[{begin:"\\{\\{",end:"\\}\\}"},{begin:"\\{%",end:"%\\}"}],keywords:b},g={className:"string",contains:[a.BACKSLASH_ESCAPE,e],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:"%[Qwi]?\\(",end:"\\)",contains:c("\\(","\\)")},{begin:"%[Qwi]?\\[",end:"\\]",contains:c("\\[","\\]")},{begin:"%[Qwi]?{",end:"}",contains:c("{","}")},{begin:"%[Qwi]?<",end:">",contains:c("<",">")},{begin:"%[Qwi]?\\|",
+end:"\\|"},{begin:/<<-\w+$/,end:/^\s*\w+$/}],relevance:0},k={className:"string",variants:[{begin:"%q\\(",end:"\\)",contains:c("\\(","\\)")},{begin:"%q\\[",end:"\\]",contains:c("\\[","\\]")},{begin:"%q{",end:"}",contains:c("{","}")},{begin:"%q<",end:">",contains:c("<",">")},{begin:"%q\\|",end:"\\|"},{begin:/<<-'\w+'$/,end:/^\s*\w+$/}],relevance:0},m={begin:"(?!%})("+a.RE_STARTERS_RE+"|\\n|\\b(case|if|select|unless|until|when|while)\\b)\\s*",keywords:"case if select unless until when while",contains:[{className:"regexp",
+contains:[a.BACKSLASH_ESCAPE,e],variants:[{begin:"//[a-z]*",relevance:0},{begin:"/(?!\\/)",end:"/[a-z]*"}]}],relevance:0},p={className:"regexp",contains:[a.BACKSLASH_ESCAPE,e],variants:[{begin:"%r\\(",end:"\\)",contains:c("\\(","\\)")},{begin:"%r\\[",end:"\\]",contains:c("\\[","\\]")},{begin:"%r{",end:"}",contains:c("{","}")},{begin:"%r<",end:">",contains:c("<",">")},{begin:"%r\\|",end:"\\|"}],relevance:0},n={className:"meta",begin:"@\\[",end:"\\]",contains:[a.inherit(a.QUOTE_STRING_MODE,{className:"meta-string"})]};
+a=[f,g,k,p,m,n,a.HASH_COMMENT_MODE,{className:"class",beginKeywords:"class module struct",end:"$|;",illegal:/=/,contains:[a.HASH_COMMENT_MODE,a.inherit(a.TITLE_MODE,{begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{begin:"<"}]},{className:"class",beginKeywords:"lib enum union",end:"$|;",illegal:/=/,contains:[a.HASH_COMMENT_MODE,a.inherit(a.TITLE_MODE,{begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"})],relevance:10},{beginKeywords:"annotation",end:"$|;",illegal:/=/,contains:[a.HASH_COMMENT_MODE,a.inherit(a.TITLE_MODE,
+{begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"})],relevance:10},{className:"function",beginKeywords:"def",end:/\B\b/,contains:[a.inherit(a.TITLE_MODE,{begin:"[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~|]|//|//=|&[-+*]=?|&\\*\\*|\\[\\][=?]?",endsParent:!0})]},{className:"function",beginKeywords:"fun macro",end:/\B\b/,contains:[a.inherit(a.TITLE_MODE,{begin:"[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~|]|//|//=|&[-+*]=?|&\\*\\*|\\[\\][=?]?",endsParent:!0})],
+relevance:5},{className:"symbol",begin:a.UNDERSCORE_IDENT_RE+"(\\!|\\?)?:",relevance:0},{className:"symbol",begin:":",contains:[g,{begin:"[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~|]|//|//=|&[-+*]=?|&\\*\\*|\\[\\][=?]?"}],relevance:0},{className:"number",variants:[{begin:"\\b0b([01_]+)(_*[ui](8|16|32|64|128))?"},{begin:"\\b0o([0-7_]+)(_*[ui](8|16|32|64|128))?"},{begin:"\\b0x([A-Fa-f0-9_]+)(_*[ui](8|16|32|64|128))?"},{begin:"\\b([1-9][0-9_]*[0-9]|[0-9])(\\.[0-9][0-9_]*)?([eE]_*[-+]?[0-9_]*)?(_*f(32|64))?(?!_)"},
+{begin:"\\b([1-9][0-9_]*|0)(_*[ui](8|16|32|64|128))?"}],relevance:0}];e.contains=a;f.contains=a.slice(1);return{aliases:["cr"],lexemes:"[a-zA-Z_]\\w*[!?=]?",keywords:b,contains:a}});b.registerLanguage("cs",function(a){var c={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long nameof object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let on orderby partial remove select set value var where yield",
+literal:"null false true"},b={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},e={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]},f=a.inherit(e,{illegal:/\n/}),g={className:"subst",begin:"{",end:"}",keywords:c},k=a.inherit(g,{illegal:/\n/}),m={className:"string",begin:/\$"/,end:'"',illegal:/\n/,contains:[{begin:"{{"},
+{begin:"}}"},a.BACKSLASH_ESCAPE,k]},p={className:"string",begin:/\$@"/,end:'"',contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},g]},n=a.inherit(p,{illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},k]});g.contains=[p,m,e,a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,b,a.C_BLOCK_COMMENT_MODE];k.contains=[n,m,f,a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,b,a.inherit(a.C_BLOCK_COMMENT_MODE,{illegal:/\n/})];e={variants:[p,m,e,a.APOS_STRING_MODE,a.QUOTE_STRING_MODE]};f=a.IDENT_RE+"(<"+a.IDENT_RE+"(\\s*,\\s*"+
+a.IDENT_RE+")*>)?(\\[\\])?";return{aliases:["csharp","c#"],keywords:c,illegal:/::/,contains:[a.COMMENT("///","$",{returnBegin:!0,contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{begin:"\x3c!--|--\x3e"},{begin:"</?",end:">"}]}]}),a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",end:"$",keywords:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},e,b,{beginKeywords:"class interface",end:/[{;=]/,illegal:/[^\s:,]/,
+contains:[a.TITLE_MODE,a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace",end:/[{;=]/,illegal:/[^\s:]/,contains:[a.inherit(a.TITLE_MODE,{begin:"[a-zA-Z](\\.?\\w)*"}),a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE]},{className:"meta",begin:"^\\s*\\[",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{className:"meta-string",begin:/"/,end:/"/}]},{beginKeywords:"new return throw await else",relevance:0},{className:"function",begin:"("+f+"\\s+)+"+a.IDENT_RE+"\\s*\\(",returnBegin:!0,
+end:/\s*[{;=]/,excludeEnd:!0,keywords:c,contains:[{begin:a.IDENT_RE+"\\s*\\(",returnBegin:!0,contains:[a.TITLE_MODE],relevance:0},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:c,relevance:0,contains:[e,b,a.C_BLOCK_COMMENT_MODE]},a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE]}]}});b.registerLanguage("csp",function(a){return{case_insensitive:!1,lexemes:"[a-zA-Z][a-zA-Z0-9_-]*",keywords:{keyword:"base-uri child-src connect-src default-src font-src form-action frame-ancestors frame-src img-src media-src object-src plugin-types report-uri sandbox script-src style-src"},
+contains:[{className:"string",begin:"'",end:"'"},{className:"attribute",begin:"^Content",end:":",excludeEnd:!0}]}});b.registerLanguage("css",function(a){return{case_insensitive:!0,illegal:/[=\/|'\$]/,contains:[a.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/},{className:"selector-class",begin:/\.[A-Za-z0-9_-]+/},{className:"selector-attr",begin:/\[/,end:/\]/,illegal:"$"},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9_\-\+\(\)"'.]+/},{begin:"@(font-face|page)",lexemes:"[a-z-]+",
+keywords:"font-face page"},{begin:"@",end:"[{;]",illegal:/:/,contains:[{className:"keyword",begin:/\w+/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,contains:[a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,a.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0},{begin:"{",end:"}",illegal:/\S/,contains:[a.C_BLOCK_COMMENT_MODE,{begin:/[A-Z_\.\-]+\s*:/,returnBegin:!0,end:";",endsWithParent:!0,contains:[{className:"attribute",begin:/\S/,end:":",excludeEnd:!0,starts:{endsWithParent:!0,
+excludeEnd:!0,contains:[{begin:/[\w-]+\(/,returnBegin:!0,contains:[{className:"built_in",begin:/[\w-]+/},{begin:/\(/,end:/\)/,contains:[a.APOS_STRING_MODE,a.QUOTE_STRING_MODE]}]},a.CSS_NUMBER_MODE,a.QUOTE_STRING_MODE,a.APOS_STRING_MODE,a.C_BLOCK_COMMENT_MODE,{className:"number",begin:"#[0-9A-Fa-f]+"},{className:"meta",begin:"!important"}]}}]}]}]}});b.registerLanguage("d",function(a){var c=a.COMMENT("\\/\\+","\\+\\/",{contains:["self"],relevance:10});return{lexemes:a.UNDERSCORE_IDENT_RE,keywords:{keyword:"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__",
+built_in:"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring",literal:"false null true"},contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,c,{className:"string",begin:'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',relevance:10},{className:"string",begin:'"',contains:[{begin:"\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};",relevance:0}],
 end:'"[cwd]?'},{className:"string",begin:'[rq]"',end:'"[cwd]?',relevance:5},{className:"string",begin:"`",end:"`[cwd]?"},{className:"string",begin:'q"\\{',end:'\\}"'},{className:"number",begin:"\\b(((0[xX](([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)\\.([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)|\\.?([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))[pP][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))|((0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(\\.\\d*|([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)))|\\d+\\.(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)|\\.(0|[1-9][\\d_]*)([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))?))([fF]|L|i|[fF]i|Li)?|((0|[1-9][\\d_]*)|0[bB][01_]+|0[xX]([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))(i|[fF]i|Li))",
 relevance:0},{className:"number",begin:"\\b((0|[1-9][\\d_]*)|0[bB][01_]+|0[xX]([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))(L|u|U|Lu|LU|uL|UL)?",relevance:0},{className:"string",begin:"'(\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};|.)",end:"'",illegal:"."},{className:"meta",begin:"^#!",end:"$",relevance:5},{className:"meta",begin:"#(line)",end:"$",relevance:5},{className:"keyword",begin:"@[a-zA-Z_][a-zA-Z_\\d]*"}]}});b.registerLanguage("markdown",
 function(a){return{aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$"},{begin:"^.+?\\n[=-]{2,}$"}]},{begin:"<",end:">",subLanguage:"xml",relevance:0},{className:"bullet",begin:"^([*+-]|(\\d+\\.))\\s+"},{className:"strong",begin:"[*_]{2}.+?[*_]{2}"},{className:"emphasis",variants:[{begin:"\\*.+?\\*"},{begin:"_.+?_",relevance:0}]},{className:"quote",begin:"^>\\s+",end:"$"},{className:"code",variants:[{begin:"^```w*s*$",end:"^```s*$"},{begin:"`.+?`"},{begin:"^( {4}|\t)",
 end:"$",relevance:0}]},{begin:"^[-\\*]{3,}",end:"$"},{begin:"\\[.+?\\][\\(\\[].*?[\\)\\]]",returnBegin:!0,contains:[{className:"string",begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0,relevance:0},{className:"link",begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}],relevance:10},{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",
-begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}});b.registerLanguage("dart",function(a){var b={className:"subst",begin:"\\$\\{",end:"}",keywords:"true false null this is new super"},d={className:"string",variants:[{begin:"r'''",end:"'''"},{begin:'r"""',end:'"""'},{begin:"r'",end:"'",illegal:"\\n"},{begin:'r"',end:'"',illegal:"\\n"},{begin:"'''",end:"'''",contains:[a.BACKSLASH_ESCAPE,b]},{begin:'"""',end:'"""',contains:[a.BACKSLASH_ESCAPE,b]},{begin:"'",end:"'",illegal:"\\n",contains:[a.BACKSLASH_ESCAPE,
-b]},{begin:'"',end:'"',illegal:"\\n",contains:[a.BACKSLASH_ESCAPE,b]}]};b.contains=[a.C_NUMBER_MODE,d];return{keywords:{keyword:"assert async await break case catch class const continue default do else enum extends false final finally for if in is new null rethrow return super switch sync this throw true try var void while with yield abstract as dynamic export external factory get implements import library operator part set static typedef",built_in:"print Comparable DateTime Duration Function Iterable Iterator List Map Match Null Object Pattern RegExp Set Stopwatch String StringBuffer StringSink Symbol Type Uri bool double int num document window querySelector querySelectorAll Element ElementList"},
-contains:[d,a.COMMENT("/\\*\\*","\\*/",{subLanguage:"markdown"}),a.COMMENT("///","$",{subLanguage:"markdown"}),a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,{className:"class",beginKeywords:"class interface",end:"{",excludeEnd:!0,contains:[{beginKeywords:"extends implements"},a.UNDERSCORE_TITLE_MODE]},a.C_NUMBER_MODE,{className:"meta",begin:"@[A-Za-z]+"},{begin:"=>"}]}});b.registerLanguage("xml",function(a){var b={endsWithParent:!0,illegal:/</,relevance:0,contains:[{className:"attr",begin:"[A-Za-z0-9\\._:-]+",
-relevance:0},{begin:/=\s*/,relevance:0,contains:[{className:"string",endsParent:!0,variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/},{begin:/[^\s"'=<>`]+/}]}]}]};return{aliases:"html xhtml rss atom xjb xsd xsl plist".split(" "),case_insensitive:!0,contains:[{className:"meta",begin:"<!DOCTYPE",end:">",relevance:10,contains:[{begin:"\\[",end:"\\]"}]},a.COMMENT("\x3c!--","--\x3e",{relevance:10}),{begin:"<\\!\\[CDATA\\[",end:"\\]\\]>",relevance:10},{begin:/<\?(php)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",
-end:"\\*/",skip:!0}]},{className:"tag",begin:"<style(?=\\s|>|$)",end:">",keywords:{name:"style"},contains:[b],starts:{end:"</style>",returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:"<script(?=\\s|>|$)",end:">",keywords:{name:"script"},contains:[b],starts:{end:"\x3c/script>",returnEnd:!0,subLanguage:["actionscript","javascript","handlebars","xml"]}},{className:"meta",variants:[{begin:/<\?xml/,end:/\?>/,relevance:10},{begin:/<\?\w+/,end:/\?>/}]},{className:"tag",begin:"</?",end:"/?>",
-contains:[{className:"name",begin:/[^\/><\s]+/,relevance:0},b]}]}});b.registerLanguage("ruby",function(a){var b={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},d={className:"doctag",begin:"@[A-Za-z]+"},e={begin:"#<",end:">"};d=[a.COMMENT("#","$",{contains:[d]}),a.COMMENT("^\\=begin",
-"^\\=end",{contains:[d],relevance:10}),a.COMMENT("^__END__","\\n$")];var c={className:"subst",begin:"#\\{",end:"}",keywords:b},g={className:"string",contains:[a.BACKSLASH_ESCAPE,c],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:"%[qQwWx]?\\(",end:"\\)"},{begin:"%[qQwWx]?\\[",end:"\\]"},{begin:"%[qQwWx]?{",end:"}"},{begin:"%[qQwWx]?<",end:">"},{begin:"%[qQwWx]?/",end:"/"},{begin:"%[qQwWx]?%",end:"%"},{begin:"%[qQwWx]?-",end:"-"},{begin:"%[qQwWx]?\\|",end:"\\|"},{begin:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},
-{begin:/<<(-?)\w+$/,end:/^\s*\w+$/}]},k={className:"params",begin:"\\(",end:"\\)",endsParent:!0,keywords:b};a=[g,e,{className:"class",beginKeywords:"class module",end:"$|;",illegal:/=/,contains:[a.inherit(a.TITLE_MODE,{begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{begin:"<\\s*",contains:[{begin:"("+a.IDENT_RE+"::)?"+a.IDENT_RE}]}].concat(d)},{className:"function",beginKeywords:"def",end:"$|;",contains:[a.inherit(a.TITLE_MODE,{begin:"[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?"}),
-k].concat(d)},{begin:a.IDENT_RE+"::"},{className:"symbol",begin:a.UNDERSCORE_IDENT_RE+"(\\!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[g,{begin:"[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?"}],relevance:0},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{className:"params",begin:/\|/,end:/\|/,keywords:b},{begin:"("+a.RE_STARTERS_RE+
-"|unless)\\s*",keywords:"unless",contains:[e,{className:"regexp",contains:[a.BACKSLASH_ESCAPE,c],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:"%r{",end:"}[a-z]*"},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(d),relevance:0}].concat(d);c.contains=a;k.contains=a;return{aliases:["rb","gemspec","podspec","thor","irb"],keywords:b,illegal:/\/\*/,contains:d.concat([{begin:/^\s*=>/,starts:{end:"$",contains:a}},{className:"meta",begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>)",
-starts:{end:"$",contains:a}}]).concat(a)}});b.registerLanguage("erb",function(a){return{subLanguage:"xml",contains:[a.COMMENT("<%#","%>"),{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0}]}});b.registerLanguage("go",function(a){var b={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",
-literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{aliases:["golang"],keywords:b,illegal:"</",contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,{className:"string",variants:[a.QUOTE_STRING_MODE,{begin:"'",end:"[^\\\\]'"},{begin:"`",end:"`"}]},{className:"number",variants:[{begin:a.C_NUMBER_RE+"[dflsi]",relevance:1},a.C_NUMBER_MODE]},{begin:/:=/},{className:"function",beginKeywords:"func",end:/\s*\{/,excludeEnd:!0,
-contains:[a.TITLE_MODE,{className:"params",begin:/\(/,end:/\)/,keywords:b,illegal:/["']/}]}]}});b.registerLanguage("haskell",function(a){var b={variants:[a.COMMENT("--","$"),a.COMMENT("{-","-}",{contains:["self"]})]},d={className:"meta",begin:"{-#",end:"#-}"},e={className:"meta",begin:"^#",end:"$"},c={className:"type",begin:"\\b[A-Z][\\w']*",relevance:0},g={begin:"\\(",end:"\\)",illegal:'"',contains:[d,e,{className:"type",begin:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},a.inherit(a.TITLE_MODE,{begin:"[_a-z][\\w']*"}),
-b]};return{aliases:["hs"],keywords:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",contains:[{beginKeywords:"module",end:"where",keywords:"module where",contains:[g,b],illegal:"\\W\\.|;"},{begin:"\\bimport\\b",end:"$",keywords:"import qualified as hiding",contains:[g,b],illegal:"\\W\\.|;"},{className:"class",begin:"^(\\s*)?(class|instance)\\b",
-end:"where",keywords:"class family instance where",contains:[c,g,b]},{className:"class",begin:"\\b(data|(new)?type)\\b",end:"$",keywords:"data family type newtype deriving",contains:[d,c,g,{begin:"{",end:"}",contains:g.contains},b]},{beginKeywords:"default",end:"$",contains:[c,g,b]},{beginKeywords:"infix infixl infixr",end:"$",contains:[a.C_NUMBER_MODE,b]},{begin:"\\bforeign\\b",end:"$",keywords:"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe",contains:[c,a.QUOTE_STRING_MODE,
-b]},{className:"meta",begin:"#!\\/usr\\/bin\\/env runhaskell",end:"$"},d,e,a.QUOTE_STRING_MODE,a.C_NUMBER_MODE,c,a.inherit(a.TITLE_MODE,{begin:"^[_a-z][\\w']*"}),b,{begin:"->|<-"}]}});b.registerLanguage("java",function(a){return{aliases:["jsp"],keywords:"false synchronized int abstract float private char boolean static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",
+begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}});b.registerLanguage("dart",function(a){var c={className:"subst",variants:[{begin:"\\$[A-Za-z0-9_]+"}]},b={className:"subst",variants:[{begin:"\\${",end:"}"}],keywords:"true false null this is new super"};c={className:"string",variants:[{begin:"r'''",end:"'''"},{begin:'r"""',end:'"""'},{begin:"r'",end:"'",illegal:"\\n"},{begin:'r"',end:'"',illegal:"\\n"},{begin:"'''",end:"'''",contains:[a.BACKSLASH_ESCAPE,c,b]},{begin:'"""',end:'"""',contains:[a.BACKSLASH_ESCAPE,
+c,b]},{begin:"'",end:"'",illegal:"\\n",contains:[a.BACKSLASH_ESCAPE,c,b]},{begin:'"',end:'"',illegal:"\\n",contains:[a.BACKSLASH_ESCAPE,c,b]}]};b.contains=[a.C_NUMBER_MODE,c];return{keywords:{keyword:"assert async await break case catch class const continue default do else enum extends false final finally for if in is new null rethrow return super switch sync this throw true try var void while with yield abstract as dynamic export external factory get implements import library operator part set static typedef",
+built_in:"print Comparable DateTime Duration Function Iterable Iterator List Map Match Null Object Pattern RegExp Set Stopwatch String StringBuffer StringSink Symbol Type Uri bool double int num document window querySelector querySelectorAll Element ElementList"},contains:[c,a.COMMENT("/\\*\\*","\\*/",{subLanguage:"markdown"}),a.COMMENT("///","$",{subLanguage:"markdown"}),a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,{className:"class",beginKeywords:"class interface",end:"{",excludeEnd:!0,contains:[{beginKeywords:"extends implements"},
+a.UNDERSCORE_TITLE_MODE]},a.C_NUMBER_MODE,{className:"meta",begin:"@[A-Za-z]+"},{begin:"=>"}]}});b.registerLanguage("delphi",function(a){var c=[a.C_LINE_COMMENT_MODE,a.COMMENT(/\{/,/\}/,{relevance:0}),a.COMMENT(/\(\*/,/\*\)/,{relevance:10})],b={className:"meta",variants:[{begin:/\{\$/,end:/\}/},{begin:/\(\*\$/,end:/\*\)/}]},e={className:"string",begin:/'/,end:/'/,contains:[{begin:/''/}]},f={className:"string",begin:/(#\d+)+/},g={begin:a.IDENT_RE+"\\s*=\\s*class\\s*\\(",returnBegin:!0,contains:[a.TITLE_MODE]},
+k={className:"function",beginKeywords:"function constructor destructor procedure",end:/[:;]/,keywords:"function constructor|10 destructor|10 procedure|10",contains:[a.TITLE_MODE,{className:"params",begin:/\(/,end:/\)/,keywords:"exports register file shl array record property for mod while set ally label uses raise not stored class safecall var interface or private static exit index inherited to else stdcall override shr asm far resourcestring finalization packed virtual out and protected library do xorwrite goto near function end div overload object unit begin string on inline repeat until destructor write message program with read initialization except default nil if case cdecl in downto threadvar of try pascal const external constructor type public then implementation finally published procedure absolute reintroduce operator as is abstract alias assembler bitpacked break continue cppdecl cvar enumerator experimental platform deprecated unimplemented dynamic export far16 forward generic helper implements interrupt iochecks local name nodefault noreturn nostackframe oldfpccall otherwise saveregisters softfloat specialize strict unaligned varargs ",
+contains:[e,f,b].concat(c)},b].concat(c)};return{aliases:"dpr dfm pas pascal freepascal lazarus lpr lfm".split(" "),case_insensitive:!0,keywords:"exports register file shl array record property for mod while set ally label uses raise not stored class safecall var interface or private static exit index inherited to else stdcall override shr asm far resourcestring finalization packed virtual out and protected library do xorwrite goto near function end div overload object unit begin string on inline repeat until destructor write message program with read initialization except default nil if case cdecl in downto threadvar of try pascal const external constructor type public then implementation finally published procedure absolute reintroduce operator as is abstract alias assembler bitpacked break continue cppdecl cvar enumerator experimental platform deprecated unimplemented dynamic export far16 forward generic helper implements interrupt iochecks local name nodefault noreturn nostackframe oldfpccall otherwise saveregisters softfloat specialize strict unaligned varargs ",
+illegal:/"|\$[G-Zg-z]|\/\*|<\/|\|/,contains:[e,f,a.NUMBER_MODE,g,k,b].concat(c)}});b.registerLanguage("diff",function(a){return{aliases:["patch"],contains:[{className:"meta",relevance:10,variants:[{begin:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{begin:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{begin:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{className:"comment",variants:[{begin:/Index: /,end:/$/},{begin:/={3,}/,end:/$/},{begin:/^\-{3}/,end:/$/},{begin:/^\*{3} /,end:/$/},{begin:/^\+{3}/,end:/$/},{begin:/\*{5}/,end:/\*{5}$/}]},
+{className:"addition",begin:"^\\+",end:"$"},{className:"deletion",begin:"^\\-",end:"$"},{className:"addition",begin:"^\\!",end:"$"}]}});b.registerLanguage("django",function(a){var c={begin:/\|[A-Za-z]+:?/,keywords:{name:"truncatewords removetags linebreaksbr yesno get_digit timesince random striptags filesizeformat escape linebreaks length_is ljust rjust cut urlize fix_ampersands title floatformat capfirst pprint divisibleby add make_list unordered_list urlencode timeuntil urlizetrunc wordcount stringformat linenumbers slice date dictsort dictsortreversed default_if_none pluralize lower join center default truncatewords_html upper length phone2numeric wordwrap time addslashes slugify first escapejs force_escape iriencode last safe safeseq truncatechars localize unlocalize localtime utc timezone"},
+contains:[a.QUOTE_STRING_MODE,a.APOS_STRING_MODE]};return{aliases:["jinja"],case_insensitive:!0,subLanguage:"xml",contains:[a.COMMENT(/\{%\s*comment\s*%}/,/\{%\s*endcomment\s*%}/),a.COMMENT(/\{#/,/#}/),{className:"template-tag",begin:/\{%/,end:/%}/,contains:[{className:"name",begin:/\w+/,keywords:{name:"comment endcomment load templatetag ifchanged endifchanged if endif firstof for endfor ifnotequal endifnotequal widthratio extends include spaceless endspaceless regroup ifequal endifequal ssi now with cycle url filter endfilter debug block endblock else autoescape endautoescape csrf_token empty elif endwith static trans blocktrans endblocktrans get_static_prefix get_media_prefix plural get_current_language language get_available_languages get_current_language_bidi get_language_info get_language_info_list localize endlocalize localtime endlocaltime timezone endtimezone get_current_timezone verbatim"},
+starts:{endsWithParent:!0,keywords:"in by as",contains:[c],relevance:0}}]},{className:"template-variable",begin:/\{\{/,end:/}}/,contains:[c]}]}});b.registerLanguage("dns",function(a){return{aliases:["bind","zone"],keywords:{keyword:"IN A AAAA AFSDB APL CAA CDNSKEY CDS CERT CNAME DHCID DLV DNAME DNSKEY DS HIP IPSECKEY KEY KX LOC MX NAPTR NS NSEC NSEC3 NSEC3PARAM PTR RRSIG RP SIG SOA SRV SSHFP TA TKEY TLSA TSIG TXT"},contains:[a.COMMENT(";","$",{relevance:0}),{className:"meta",begin:/^\$(TTL|GENERATE|INCLUDE|ORIGIN)\b/},
+{className:"number",begin:"((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))\\b"},
+{className:"number",begin:"((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\b"},a.inherit(a.NUMBER_MODE,{begin:/\b\d+[dhwm]?/})]}});b.registerLanguage("dockerfile",function(a){return{aliases:["docker"],case_insensitive:!0,keywords:"from maintainer expose env arg user onbuild stopsignal",contains:[a.HASH_COMMENT_MODE,a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,a.NUMBER_MODE,{beginKeywords:"run cmd entrypoint volume add copy workdir label healthcheck shell",starts:{end:/[^\\]$/,
+subLanguage:"bash"}}],illegal:"</"}});b.registerLanguage("dos",function(a){var c=a.COMMENT(/^\s*@?rem\b/,/$/,{relevance:10});return{aliases:["bat","cmd"],case_insensitive:!0,illegal:/\/\*/,keywords:{keyword:"if else goto for in do call exit not exist errorlevel defined equ neq lss leq gtr geq",built_in:"prn nul lpt3 lpt2 lpt1 con com4 com3 com2 com1 aux shift cd dir echo setlocal endlocal set pause copy append assoc at attrib break cacls cd chcp chdir chkdsk chkntfs cls cmd color comp compact convert date dir diskcomp diskcopy doskey erase fs find findstr format ftype graftabl help keyb label md mkdir mode more move path pause print popd pushd promt rd recover rem rename replace restore rmdir shiftsort start subst time title tree type ver verify vol ping net ipconfig taskkill xcopy ren del"},
+contains:[{className:"variable",begin:/%%[^ ]|%[^ ]+?%|![^ ]+?!/},{className:"function",begin:"^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)",end:"goto:eof",contains:[a.inherit(a.TITLE_MODE,{begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),c]},{className:"number",begin:"\\b\\d+",relevance:0},c]}});b.registerLanguage("dsconfig",function(a){return{keywords:"dsconfig",contains:[{className:"keyword",begin:"^dsconfig",end:"\\s",excludeEnd:!0,relevance:10},{className:"built_in",begin:"(list|create|get|set|delete)-(\\w+)",
+end:"\\s",excludeEnd:!0,illegal:"!@#$%^&*()",relevance:10},{className:"built_in",begin:"--(\\w+)",end:"\\s",excludeEnd:!0},{className:"string",begin:/"/,end:/"/},{className:"string",begin:/'/,end:/'/},{className:"string",begin:"[\\w-?]+:\\w+",end:"\\W",relevance:0},{className:"string",begin:"\\w+-?\\w+",end:"\\W",relevance:0},a.HASH_COMMENT_MODE]}});b.registerLanguage("dts",function(a){var c={className:"string",variants:[a.inherit(a.QUOTE_STRING_MODE,{begin:'((u8?|U)|L)?"'}),{begin:'(u8?|U)?R"',end:'"',
+contains:[a.BACKSLASH_ESCAPE]},{begin:"'\\\\?.",end:"'",illegal:"."}]},b={className:"number",variants:[{begin:"\\b(\\d+(\\.\\d*)?|\\.\\d+)(u|U|l|L|ul|UL|f|F)"},{begin:a.C_NUMBER_RE}],relevance:0},e={className:"meta",begin:"#",end:"$",keywords:{"meta-keyword":"if else elif endif define undef ifdef ifndef"},contains:[{begin:/\\\n/,relevance:0},{beginKeywords:"include",end:"$",keywords:{"meta-keyword":"include"},contains:[a.inherit(c,{className:"meta-string"}),{className:"meta-string",begin:"<",end:">",
+illegal:"\\n"}]},c,a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE]},f={className:"variable",begin:"\\&[a-z\\d_]*\\b"},g={className:"meta-keyword",begin:"/[a-z][a-z\\d-]*/"},k={className:"symbol",begin:"^\\s*[a-zA-Z_][a-zA-Z\\d_]*:"},m={className:"params",begin:"<",end:">",contains:[b,f]},p={className:"class",begin:/[a-zA-Z_][a-zA-Z\d_@]*\s{/,end:/[{;=]/,returnBegin:!0,excludeEnd:!0};return{keywords:"",contains:[{className:"class",begin:"/\\s*{",end:"};",relevance:10,contains:[f,g,k,p,m,a.C_LINE_COMMENT_MODE,
+a.C_BLOCK_COMMENT_MODE,b,c]},f,g,k,p,m,a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,b,c,e,{begin:a.IDENT_RE+"::",keywords:""}]}});b.registerLanguage("dust",function(a){return{aliases:["dst"],case_insensitive:!0,subLanguage:"xml",contains:[{className:"template-tag",begin:/\{[#\/]/,end:/\}/,illegal:/;/,contains:[{className:"name",begin:/[a-zA-Z\.-]+/,starts:{endsWithParent:!0,relevance:0,contains:[a.QUOTE_STRING_MODE]}}]},{className:"template-variable",begin:/\{/,end:/\}/,illegal:/;/,keywords:"if eq ne lt lte gt gte select default math sep"}]}});
+b.registerLanguage("ebnf",function(a){var c=a.COMMENT(/\(\*/,/\*\)/);return{illegal:/\S/,contains:[c,{className:"attribute",begin:/^[ ]*[a-zA-Z][a-zA-Z-]*([\s-]+[a-zA-Z][a-zA-Z]*)*/},{begin:/=/,end:/;/,contains:[c,{className:"meta",begin:/\?.*\?/},a.APOS_STRING_MODE,a.QUOTE_STRING_MODE]}]}});b.registerLanguage("elixir",function(a){var c={className:"subst",begin:"#\\{",end:"}",lexemes:"[a-zA-Z_][a-zA-Z0-9_.]*(\\!|\\?)?",keywords:"and false then defined module in return redo retry end for true self when next until do begin unless nil break not case cond alias while ensure or include use alias fn quote require import with|0"},
+b={className:"string",contains:[a.BACKSLASH_ESCAPE,c],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/}]},e={className:"function",beginKeywords:"def defp defmacro",end:/\B\b/,contains:[a.inherit(a.TITLE_MODE,{begin:"[a-zA-Z_][a-zA-Z0-9_.]*(\\!|\\?)?",endsParent:!0})]},f=a.inherit(e,{className:"class",beginKeywords:"defimpl defmodule defprotocol defrecord",end:/\bdo\b|$|;/});a=[b,a.HASH_COMMENT_MODE,f,e,{begin:"::"},{className:"symbol",begin:":(?![\\s:])",contains:[b,{begin:"[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?"}],
+relevance:0},{className:"symbol",begin:"[a-zA-Z_][a-zA-Z0-9_.]*(\\!|\\?)?:(?!:)",relevance:0},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{className:"variable",begin:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{begin:"->"},{begin:"("+a.RE_STARTERS_RE+")\\s*",contains:[a.HASH_COMMENT_MODE,{className:"regexp",illegal:"\\n",contains:[a.BACKSLASH_ESCAPE,c],variants:[{begin:"/",end:"/[a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}],relevance:0}];
+c.contains=a;return{lexemes:"[a-zA-Z_][a-zA-Z0-9_.]*(\\!|\\?)?",keywords:"and false then defined module in return redo retry end for true self when next until do begin unless nil break not case cond alias while ensure or include use alias fn quote require import with|0",contains:a}});b.registerLanguage("elm",function(a){var c={variants:[a.COMMENT("--","$"),a.COMMENT("{-","-}",{contains:["self"]})]},b={className:"type",begin:"\\b[A-Z][\\w']*",relevance:0},e={begin:"\\(",end:"\\)",illegal:'"',contains:[{className:"type",
+begin:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},c]};return{keywords:"let in if then else case of where module import exposing type alias as infix infixl infixr port effect command subscription",contains:[{beginKeywords:"port effect module",end:"exposing",keywords:"port effect module where command subscription exposing",contains:[e,c],illegal:"\\W\\.|;"},{begin:"import",end:"$",keywords:"import as exposing",contains:[e,c],illegal:"\\W\\.|;"},{begin:"type",end:"$",keywords:"type alias",contains:[b,
+e,{begin:"{",end:"}",contains:e.contains},c]},{beginKeywords:"infix infixl infixr",end:"$",contains:[a.C_NUMBER_MODE,c]},{begin:"port",end:"$",keywords:"port",contains:[c]},{className:"string",begin:"'\\\\?.",end:"'",illegal:"."},a.QUOTE_STRING_MODE,a.C_NUMBER_MODE,b,a.inherit(a.TITLE_MODE,{begin:"^[_a-z][\\w']*"}),c,{begin:"->|<-"}],illegal:/;/}});b.registerLanguage("ruby",function(a){var c={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",
+literal:"true false nil"},b={className:"doctag",begin:"@[A-Za-z]+"},e={begin:"#<",end:">"};b=[a.COMMENT("#","$",{contains:[b]}),a.COMMENT("^\\=begin","^\\=end",{contains:[b],relevance:10}),a.COMMENT("^__END__","\\n$")];var f={className:"subst",begin:"#\\{",end:"}",keywords:c},g={className:"string",contains:[a.BACKSLASH_ESCAPE,f],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:"%[qQwWx]?\\(",end:"\\)"},{begin:"%[qQwWx]?\\[",end:"\\]"},{begin:"%[qQwWx]?{",end:"}"},{begin:"%[qQwWx]?<",
+end:">"},{begin:"%[qQwWx]?/",end:"/"},{begin:"%[qQwWx]?%",end:"%"},{begin:"%[qQwWx]?-",end:"-"},{begin:"%[qQwWx]?\\|",end:"\\|"},{begin:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{begin:/<<(-?)\w+$/,end:/^\s*\w+$/}]},k={className:"params",begin:"\\(",end:"\\)",endsParent:!0,keywords:c};a=[g,e,{className:"class",beginKeywords:"class module",end:"$|;",illegal:/=/,contains:[a.inherit(a.TITLE_MODE,{begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{begin:"<\\s*",contains:[{begin:"("+a.IDENT_RE+
+"::)?"+a.IDENT_RE}]}].concat(b)},{className:"function",beginKeywords:"def",end:"$|;",contains:[a.inherit(a.TITLE_MODE,{begin:"[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?"}),k].concat(b)},{begin:a.IDENT_RE+"::"},{className:"symbol",begin:a.UNDERSCORE_IDENT_RE+"(\\!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[g,{begin:"[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?"}],relevance:0},{className:"number",
+begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{className:"params",begin:/\|/,end:/\|/,keywords:c},{begin:"("+a.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[e,{className:"regexp",contains:[a.BACKSLASH_ESCAPE,f],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:"%r{",end:"}[a-z]*"},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(b),relevance:0}].concat(b);
+f.contains=a;k.contains=a;return{aliases:["rb","gemspec","podspec","thor","irb"],keywords:c,illegal:/\/\*/,contains:b.concat([{begin:/^\s*=>/,starts:{end:"$",contains:a}},{className:"meta",begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>)",starts:{end:"$",contains:a}}]).concat(a)}});b.registerLanguage("erb",function(a){return{subLanguage:"xml",contains:[a.COMMENT("<%#","%>"),{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0}]}});b.registerLanguage("erlang-repl",
+function(a){return{keywords:{built_in:"spawn spawn_link self",keyword:"after and andalso|10 band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse|10 query receive rem try when xor"},contains:[{className:"meta",begin:"^[0-9]+> ",relevance:10},a.COMMENT("%","$"),{className:"number",begin:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",relevance:0},a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,{begin:"\\?(::)?([A-Z]\\w*(::)?)+"},{begin:"->"},{begin:"ok"},{begin:"!"},{begin:"(\\b[a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*)|(\\b[a-z'][a-zA-Z0-9_']*)",
+relevance:0},{begin:"[A-Z][a-zA-Z0-9_']*",relevance:0}]}});b.registerLanguage("erlang",function(a){var c={keyword:"after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun if let not of orelse|10 query receive rem try when xor",literal:"false true"},b=a.COMMENT("%","$"),e={className:"number",begin:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",relevance:0},f={begin:"fun\\s+[a-z'][a-zA-Z0-9_']*/\\d+"},g={begin:"([a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*|[a-z'][a-zA-Z0-9_']*)\\(",
+end:"\\)",returnBegin:!0,relevance:0,contains:[{begin:"([a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*|[a-z'][a-zA-Z0-9_']*)",relevance:0},{begin:"\\(",end:"\\)",endsWithParent:!0,returnEnd:!0,relevance:0}]},k={begin:"{",end:"}",relevance:0},m={begin:"\\b_([A-Z][A-Za-z0-9_]*)?",relevance:0},p={begin:"[A-Z][a-zA-Z0-9_]*",relevance:0},n={begin:"#"+a.UNDERSCORE_IDENT_RE,relevance:0,returnBegin:!0,contains:[{begin:"#"+a.UNDERSCORE_IDENT_RE,relevance:0},{begin:"{",end:"}",relevance:0}]},h={beginKeywords:"fun receive if try case",
+end:"end",keywords:c};h.contains=[b,f,a.inherit(a.APOS_STRING_MODE,{className:""}),h,g,a.QUOTE_STRING_MODE,e,k,m,p,n];f=[b,f,h,g,a.QUOTE_STRING_MODE,e,k,m,p,n];g.contains[1].contains=f;k.contains=f;n.contains[1].contains=f;g={className:"params",begin:"\\(",end:"\\)",contains:f};return{aliases:["erl"],keywords:c,illegal:"(</|\\*=|\\+=|-=|/\\*|\\*/|\\(\\*|\\*\\))",contains:[{className:"function",begin:"^[a-z'][a-zA-Z0-9_']*\\s*\\(",end:"->",returnBegin:!0,illegal:"\\(|#|//|/\\*|\\\\|:|;",contains:[g,
+a.inherit(a.TITLE_MODE,{begin:"[a-z'][a-zA-Z0-9_']*"})],starts:{end:";|\\.",keywords:c,contains:f}},b,{begin:"^-",end:"\\.",relevance:0,excludeEnd:!0,returnBegin:!0,lexemes:"-"+a.IDENT_RE,keywords:"-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn -import -include -include_lib -compile -define -else -endif -file -behaviour -behavior -spec",contains:[g]},e,a.QUOTE_STRING_MODE,n,m,p,k,{begin:/\.$/}]}});b.registerLanguage("excel",function(a){return{aliases:["xlsx","xls"],case_insensitive:!0,
+lexemes:/[a-zA-Z][\w\.]*/,keywords:{built_in:"ABS ACCRINT ACCRINTM ACOS ACOSH ACOT ACOTH AGGREGATE ADDRESS AMORDEGRC AMORLINC AND ARABIC AREAS ASC ASIN ASINH ATAN ATAN2 ATANH AVEDEV AVERAGE AVERAGEA AVERAGEIF AVERAGEIFS BAHTTEXT BASE BESSELI BESSELJ BESSELK BESSELY BETADIST BETA.DIST BETAINV BETA.INV BIN2DEC BIN2HEX BIN2OCT BINOMDIST BINOM.DIST BINOM.DIST.RANGE BINOM.INV BITAND BITLSHIFT BITOR BITRSHIFT BITXOR CALL CEILING CEILING.MATH CEILING.PRECISE CELL CHAR CHIDIST CHIINV CHITEST CHISQ.DIST CHISQ.DIST.RT CHISQ.INV CHISQ.INV.RT CHISQ.TEST CHOOSE CLEAN CODE COLUMN COLUMNS COMBIN COMBINA COMPLEX CONCAT CONCATENATE CONFIDENCE CONFIDENCE.NORM CONFIDENCE.T CONVERT CORREL COS COSH COT COTH COUNT COUNTA COUNTBLANK COUNTIF COUNTIFS COUPDAYBS COUPDAYS COUPDAYSNC COUPNCD COUPNUM COUPPCD COVAR COVARIANCE.P COVARIANCE.S CRITBINOM CSC CSCH CUBEKPIMEMBER CUBEMEMBER CUBEMEMBERPROPERTY CUBERANKEDMEMBER CUBESET CUBESETCOUNT CUBEVALUE CUMIPMT CUMPRINC DATE DATEDIF DATEVALUE DAVERAGE DAY DAYS DAYS360 DB DBCS DCOUNT DCOUNTA DDB DEC2BIN DEC2HEX DEC2OCT DECIMAL DEGREES DELTA DEVSQ DGET DISC DMAX DMIN DOLLAR DOLLARDE DOLLARFR DPRODUCT DSTDEV DSTDEVP DSUM DURATION DVAR DVARP EDATE EFFECT ENCODEURL EOMONTH ERF ERF.PRECISE ERFC ERFC.PRECISE ERROR.TYPE EUROCONVERT EVEN EXACT EXP EXPON.DIST EXPONDIST FACT FACTDOUBLE FALSE|0 F.DIST FDIST F.DIST.RT FILTERXML FIND FINDB F.INV F.INV.RT FINV FISHER FISHERINV FIXED FLOOR FLOOR.MATH FLOOR.PRECISE FORECAST FORECAST.ETS FORECAST.ETS.CONFINT FORECAST.ETS.SEASONALITY FORECAST.ETS.STAT FORECAST.LINEAR FORMULATEXT FREQUENCY F.TEST FTEST FV FVSCHEDULE GAMMA GAMMA.DIST GAMMADIST GAMMA.INV GAMMAINV GAMMALN GAMMALN.PRECISE GAUSS GCD GEOMEAN GESTEP GETPIVOTDATA GROWTH HARMEAN HEX2BIN HEX2DEC HEX2OCT HLOOKUP HOUR HYPERLINK HYPGEOM.DIST HYPGEOMDIST IF|0 IFERROR IFNA IFS IMABS IMAGINARY IMARGUMENT IMCONJUGATE IMCOS IMCOSH IMCOT IMCSC IMCSCH IMDIV IMEXP IMLN IMLOG10 IMLOG2 IMPOWER IMPRODUCT IMREAL IMSEC IMSECH IMSIN IMSINH IMSQRT IMSUB IMSUM IMTAN INDEX INDIRECT INFO INT INTERCEPT INTRATE IPMT IRR ISBLANK ISERR ISERROR ISEVEN ISFORMULA ISLOGICAL ISNA ISNONTEXT ISNUMBER ISODD ISREF ISTEXT ISO.CEILING ISOWEEKNUM ISPMT JIS KURT LARGE LCM LEFT LEFTB LEN LENB LINEST LN LOG LOG10 LOGEST LOGINV LOGNORM.DIST LOGNORMDIST LOGNORM.INV LOOKUP LOWER MATCH MAX MAXA MAXIFS MDETERM MDURATION MEDIAN MID MIDBs MIN MINIFS MINA MINUTE MINVERSE MIRR MMULT MOD MODE MODE.MULT MODE.SNGL MONTH MROUND MULTINOMIAL MUNIT N NA NEGBINOM.DIST NEGBINOMDIST NETWORKDAYS NETWORKDAYS.INTL NOMINAL NORM.DIST NORMDIST NORMINV NORM.INV NORM.S.DIST NORMSDIST NORM.S.INV NORMSINV NOT NOW NPER NPV NUMBERVALUE OCT2BIN OCT2DEC OCT2HEX ODD ODDFPRICE ODDFYIELD ODDLPRICE ODDLYIELD OFFSET OR PDURATION PEARSON PERCENTILE.EXC PERCENTILE.INC PERCENTILE PERCENTRANK.EXC PERCENTRANK.INC PERCENTRANK PERMUT PERMUTATIONA PHI PHONETIC PI PMT POISSON.DIST POISSON POWER PPMT PRICE PRICEDISC PRICEMAT PROB PRODUCT PROPER PV QUARTILE QUARTILE.EXC QUARTILE.INC QUOTIENT RADIANS RAND RANDBETWEEN RANK.AVG RANK.EQ RANK RATE RECEIVED REGISTER.ID REPLACE REPLACEB REPT RIGHT RIGHTB ROMAN ROUND ROUNDDOWN ROUNDUP ROW ROWS RRI RSQ RTD SEARCH SEARCHB SEC SECH SECOND SERIESSUM SHEET SHEETS SIGN SIN SINH SKEW SKEW.P SLN SLOPE SMALL SQL.REQUEST SQRT SQRTPI STANDARDIZE STDEV STDEV.P STDEV.S STDEVA STDEVP STDEVPA STEYX SUBSTITUTE SUBTOTAL SUM SUMIF SUMIFS SUMPRODUCT SUMSQ SUMX2MY2 SUMX2PY2 SUMXMY2 SWITCH SYD T TAN TANH TBILLEQ TBILLPRICE TBILLYIELD T.DIST T.DIST.2T T.DIST.RT TDIST TEXT TEXTJOIN TIME TIMEVALUE T.INV T.INV.2T TINV TODAY TRANSPOSE TREND TRIM TRIMMEAN TRUE|0 TRUNC T.TEST TTEST TYPE UNICHAR UNICODE UPPER VALUE VAR VAR.P VAR.S VARA VARP VARPA VDB VLOOKUP WEBSERVICE WEEKDAY WEEKNUM WEIBULL WEIBULL.DIST WORKDAY WORKDAY.INTL XIRR XNPV XOR YEAR YEARFRAC YIELD YIELDDISC YIELDMAT Z.TEST ZTEST"},
+contains:[{begin:/^=/,end:/[^=]/,returnEnd:!0,illegal:/=/,relevance:10},{className:"symbol",begin:/\b[A-Z]{1,2}\d+\b/,end:/[^\d]/,excludeEnd:!0,relevance:0},{className:"symbol",begin:/[A-Z]{0,2}\d*:[A-Z]{0,2}\d*/,relevance:0},a.BACKSLASH_ESCAPE,a.QUOTE_STRING_MODE,{className:"number",begin:a.NUMBER_RE+"(%)?",relevance:0},a.COMMENT(/\bN\(/,/\)/,{excludeBegin:!0,excludeEnd:!0,illegal:/\n/})]}});b.registerLanguage("fix",function(a){return{contains:[{begin:/[^\u2401\u0001]+/,end:/[\u2401\u0001]/,excludeEnd:!0,
+returnBegin:!0,returnEnd:!1,contains:[{begin:/([^\u2401\u0001=]+)/,end:/=([^\u2401\u0001=]+)/,returnEnd:!0,returnBegin:!1,className:"attr"},{begin:/=/,end:/([\u2401\u0001])/,excludeEnd:!0,excludeBegin:!0,className:"string"}]}],case_insensitive:!0}});b.registerLanguage("flix",function(a){return{keywords:{literal:"true false",keyword:"case class def else enum if impl import in lat rel index let match namespace switch type yield with"},contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,{className:"string",
+begin:/'(.|\\[xXuU][a-zA-Z0-9]+)'/},{className:"string",variants:[{begin:'"',end:'"'}]},{className:"function",beginKeywords:"def",end:/[:={\[(\n;]/,excludeEnd:!0,contains:[{className:"title",begin:/[^0-9\n\t "'(),.`{}\[\]:;][^\n\t "'(),.`{}\[\]:;]+|[^0-9\n\t "'(),.`{}\[\]:;=]/}]},a.C_NUMBER_MODE]}});b.registerLanguage("fortran",function(a){return{case_insensitive:!0,aliases:["f90","f95"],keywords:{literal:".False. .True.",keyword:"kind do while private call intrinsic where elsewhere type endtype endmodule endselect endinterface end enddo endif if forall endforall only contains default return stop then public subroutine|10 function program .and. .or. .not. .le. .eq. .ge. .gt. .lt. goto save else use module select case access blank direct exist file fmt form formatted iostat name named nextrec number opened rec recl sequential status unformatted unit continue format pause cycle exit c_null_char c_alert c_backspace c_form_feed flush wait decimal round iomsg synchronous nopass non_overridable pass protected volatile abstract extends import non_intrinsic value deferred generic final enumerator class associate bind enum c_int c_short c_long c_long_long c_signed_char c_size_t c_int8_t c_int16_t c_int32_t c_int64_t c_int_least8_t c_int_least16_t c_int_least32_t c_int_least64_t c_int_fast8_t c_int_fast16_t c_int_fast32_t c_int_fast64_t c_intmax_t C_intptr_t c_float c_double c_long_double c_float_complex c_double_complex c_long_double_complex c_bool c_char c_null_ptr c_null_funptr c_new_line c_carriage_return c_horizontal_tab c_vertical_tab iso_c_binding c_loc c_funloc c_associated  c_f_pointer c_ptr c_funptr iso_fortran_env character_storage_size error_unit file_storage_size input_unit iostat_end iostat_eor numeric_storage_size output_unit c_f_procpointer ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode newunit contiguous recursive pad position action delim readwrite eor advance nml interface procedure namelist include sequence elemental pure integer real character complex logical dimension allocatable|10 parameter external implicit|10 none double precision assign intent optional pointer target in out common equivalence data",
+built_in:"alog alog10 amax0 amax1 amin0 amin1 amod cabs ccos cexp clog csin csqrt dabs dacos dasin datan datan2 dcos dcosh ddim dexp dint dlog dlog10 dmax1 dmin1 dmod dnint dsign dsin dsinh dsqrt dtan dtanh float iabs idim idint idnint ifix isign max0 max1 min0 min1 sngl algama cdabs cdcos cdexp cdlog cdsin cdsqrt cqabs cqcos cqexp cqlog cqsin cqsqrt dcmplx dconjg derf derfc dfloat dgamma dimag dlgama iqint qabs qacos qasin qatan qatan2 qcmplx qconjg qcos qcosh qdim qerf qerfc qexp qgamma qimag qlgama qlog qlog10 qmax1 qmin1 qmod qnint qsign qsin qsinh qsqrt qtan qtanh abs acos aimag aint anint asin atan atan2 char cmplx conjg cos cosh exp ichar index int log log10 max min nint sign sin sinh sqrt tan tanh print write dim lge lgt lle llt mod nullify allocate deallocate adjustl adjustr all allocated any associated bit_size btest ceiling count cshift date_and_time digits dot_product eoshift epsilon exponent floor fraction huge iand ibclr ibits ibset ieor ior ishft ishftc lbound len_trim matmul maxexponent maxloc maxval merge minexponent minloc minval modulo mvbits nearest pack present product radix random_number random_seed range repeat reshape rrspacing scale scan selected_int_kind selected_real_kind set_exponent shape size spacing spread sum system_clock tiny transpose trim ubound unpack verify achar iachar transfer dble entry dprod cpu_time command_argument_count get_command get_command_argument get_environment_variable is_iostat_end ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode is_iostat_eor move_alloc new_line selected_char_kind same_type_as extends_type_ofacosh asinh atanh bessel_j0 bessel_j1 bessel_jn bessel_y0 bessel_y1 bessel_yn erf erfc erfc_scaled gamma log_gamma hypot norm2 atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits bge bgt ble blt dshiftl dshiftr findloc iall iany iparity image_index lcobound ucobound maskl maskr num_images parity popcnt poppar shifta shiftl shiftr this_image"},
+illegal:/\/\*/,contains:[a.inherit(a.APOS_STRING_MODE,{className:"string",relevance:0}),a.inherit(a.QUOTE_STRING_MODE,{className:"string",relevance:0}),{className:"function",beginKeywords:"subroutine function program",illegal:"[${=\\n]",contains:[a.UNDERSCORE_TITLE_MODE,{className:"params",begin:"\\(",end:"\\)"}]},a.COMMENT("!","$",{relevance:0}),{className:"number",begin:"(?=\\b|\\+|\\-|\\.)(?=\\.\\d|\\d)(?:\\d+)?(?:\\.?\\d*)(?:[de][+-]?\\d+)?\\b\\.?",relevance:0}]}});b.registerLanguage("fsharp",
+function(a){var c={begin:"<",end:">",contains:[a.inherit(a.TITLE_MODE,{begin:/'[a-zA-Z0-9_]+/})]};return{aliases:["fs"],keywords:"abstract and as assert base begin class default delegate do done downcast downto elif else end exception extern false finally for fun function global if in inherit inline interface internal lazy let match member module mutable namespace new null of open or override private public rec return sig static struct then to true try type upcast use val void when while with yield",
+illegal:/\/\*/,contains:[{className:"keyword",begin:/\b(yield|return|let|do)!/},{className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]},{className:"string",begin:'"""',end:'"""'},a.COMMENT("\\(\\*","\\*\\)"),{className:"class",beginKeywords:"type",end:"\\(|=|$",excludeEnd:!0,contains:[a.UNDERSCORE_TITLE_MODE,c]},{className:"meta",begin:"\\[<",end:">\\]",relevance:10},{className:"symbol",begin:"\\B('[A-Za-z])\\b",contains:[a.BACKSLASH_ESCAPE]},a.C_LINE_COMMENT_MODE,a.inherit(a.QUOTE_STRING_MODE,
+{illegal:null}),a.C_NUMBER_MODE]}});b.registerLanguage("gams",function(a){var c={keyword:"abort acronym acronyms alias all and assign binary card diag display else eq file files for free ge gt if integer le loop lt maximizing minimizing model models ne negative no not option options or ord positive prod put putpage puttl repeat sameas semicont semiint smax smin solve sos1 sos2 sum system table then until using while xor yes",literal:"eps inf na","built-in":"abs arccos arcsin arctan arctan2 Beta betaReg binomial ceil centropy cos cosh cvPower div div0 eDist entropy errorf execSeed exp fact floor frac gamma gammaReg log logBeta logGamma log10 log2 mapVal max min mod ncpCM ncpF ncpVUpow ncpVUsin normal pi poly power randBinomial randLinear randTriangle round rPower sigmoid sign signPower sin sinh slexp sllog10 slrec sqexp sqlog10 sqr sqrec sqrt tan tanh trunc uniform uniformInt vcPower bool_and bool_eqv bool_imp bool_not bool_or bool_xor ifThen rel_eq rel_ge rel_gt rel_le rel_lt rel_ne gday gdow ghour gleap gmillisec gminute gmonth gsecond gyear jdate jnow jstart jtime errorLevel execError gamsRelease gamsVersion handleCollect handleDelete handleStatus handleSubmit heapFree heapLimit heapSize jobHandle jobKill jobStatus jobTerminate licenseLevel licenseStatus maxExecError sleep timeClose timeComp timeElapsed timeExec timeStart"},
+b={className:"symbol",variants:[{begin:/=[lgenxc]=/},{begin:/\$/}]},e={className:"comment",variants:[{begin:"'",end:"'"},{begin:'"',end:'"'}],illegal:"\\n",contains:[a.BACKSLASH_ESCAPE]},f={begin:"/",end:"/",keywords:c,contains:[e,a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,a.QUOTE_STRING_MODE,a.APOS_STRING_MODE,a.C_NUMBER_MODE]};e={begin:/[a-z][a-z0-9_]*(\([a-z0-9_, ]*\))?[ \t]+/,excludeBegin:!0,end:"$",endsWithParent:!0,contains:[e,f,{className:"comment",begin:/([ ]*[a-z0-9&#*=?@>\\<:\-,()$\[\]_.{}!+%^]+)+/,
+relevance:0}]};return{aliases:["gms"],case_insensitive:!0,keywords:c,contains:[a.COMMENT(/^\$ontext/,/^\$offtext/),{className:"meta",begin:"^\\$[a-z0-9]+",end:"$",returnBegin:!0,contains:[{className:"meta-keyword",begin:"^\\$[a-z0-9]+"}]},a.COMMENT("^\\*","$"),a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,a.QUOTE_STRING_MODE,a.APOS_STRING_MODE,{beginKeywords:"set sets parameter parameters variable variables scalar scalars equation equations",end:";",contains:[a.COMMENT("^\\*","$"),a.C_LINE_COMMENT_MODE,
+a.C_BLOCK_COMMENT_MODE,a.QUOTE_STRING_MODE,a.APOS_STRING_MODE,f,e]},{beginKeywords:"table",end:";",returnBegin:!0,contains:[{beginKeywords:"table",end:"$",contains:[e]},a.COMMENT("^\\*","$"),a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,a.QUOTE_STRING_MODE,a.APOS_STRING_MODE,a.C_NUMBER_MODE]},{className:"function",begin:/^[a-z][a-z0-9_,\-+' ()$]+\.{2}/,returnBegin:!0,contains:[{className:"title",begin:/^[a-z0-9_]+/},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0},b]},a.C_NUMBER_MODE,
+b]}});b.registerLanguage("gauss",function(a){var c={keyword:"bool break call callexe checkinterrupt clear clearg closeall cls comlog compile continue create debug declare delete disable dlibrary dllcall do dos ed edit else elseif enable end endfor endif endp endo errorlog errorlogat expr external fn for format goto gosub graph if keyword let lib library line load loadarray loadexe loadf loadk loadm loadp loads loadx local locate loopnextindex lprint lpwidth lshow matrix msym ndpclex new open output outwidth plot plotsym pop prcsn print printdos proc push retp return rndcon rndmod rndmult rndseed run save saveall screen scroll setarray show sparse stop string struct system trace trap threadfor threadendfor threadbegin threadjoin threadstat threadend until use while winprint ne ge le gt lt and xor or not eq eqv",
+built_in:"abs acf aconcat aeye amax amean AmericanBinomCall AmericanBinomCall_Greeks AmericanBinomCall_ImpVol AmericanBinomPut AmericanBinomPut_Greeks AmericanBinomPut_ImpVol AmericanBSCall AmericanBSCall_Greeks AmericanBSCall_ImpVol AmericanBSPut AmericanBSPut_Greeks AmericanBSPut_ImpVol amin amult annotationGetDefaults annotationSetBkd annotationSetFont annotationSetLineColor annotationSetLineStyle annotationSetLineThickness annualTradingDays arccos arcsin areshape arrayalloc arrayindex arrayinit arraytomat asciiload asclabel astd astds asum atan atan2 atranspose axmargin balance band bandchol bandcholsol bandltsol bandrv bandsolpd bar base10 begwind besselj bessely beta box boxcox cdfBeta cdfBetaInv cdfBinomial cdfBinomialInv cdfBvn cdfBvn2 cdfBvn2e cdfCauchy cdfCauchyInv cdfChic cdfChii cdfChinc cdfChincInv cdfExp cdfExpInv cdfFc cdfFnc cdfFncInv cdfGam cdfGenPareto cdfHyperGeo cdfLaplace cdfLaplaceInv cdfLogistic cdfLogisticInv cdfmControlCreate cdfMvn cdfMvn2e cdfMvnce cdfMvne cdfMvt2e cdfMvtce cdfMvte cdfN cdfN2 cdfNc cdfNegBinomial cdfNegBinomialInv cdfNi cdfPoisson cdfPoissonInv cdfRayleigh cdfRayleighInv cdfTc cdfTci cdfTnc cdfTvn cdfWeibull cdfWeibullInv cdir ceil ChangeDir chdir chiBarSquare chol choldn cholsol cholup chrs close code cols colsf combinate combinated complex con cond conj cons ConScore contour conv convertsatostr convertstrtosa corrm corrms corrvc corrx corrxs cos cosh counts countwts crossprd crout croutp csrcol csrlin csvReadM csvReadSA cumprodc cumsumc curve cvtos datacreate datacreatecomplex datalist dataload dataloop dataopen datasave date datestr datestring datestrymd dayinyr dayofweek dbAddDatabase dbClose dbCommit dbCreateQuery dbExecQuery dbGetConnectOptions dbGetDatabaseName dbGetDriverName dbGetDrivers dbGetHostName dbGetLastErrorNum dbGetLastErrorText dbGetNumericalPrecPolicy dbGetPassword dbGetPort dbGetTableHeaders dbGetTables dbGetUserName dbHasFeature dbIsDriverAvailable dbIsOpen dbIsOpenError dbOpen dbQueryBindValue dbQueryClear dbQueryCols dbQueryExecPrepared dbQueryFetchAllM dbQueryFetchAllSA dbQueryFetchOneM dbQueryFetchOneSA dbQueryFinish dbQueryGetBoundValue dbQueryGetBoundValues dbQueryGetField dbQueryGetLastErrorNum dbQueryGetLastErrorText dbQueryGetLastInsertID dbQueryGetLastQuery dbQueryGetPosition dbQueryIsActive dbQueryIsForwardOnly dbQueryIsNull dbQueryIsSelect dbQueryIsValid dbQueryPrepare dbQueryRows dbQuerySeek dbQuerySeekFirst dbQuerySeekLast dbQuerySeekNext dbQuerySeekPrevious dbQuerySetForwardOnly dbRemoveDatabase dbRollback dbSetConnectOptions dbSetDatabaseName dbSetHostName dbSetNumericalPrecPolicy dbSetPort dbSetUserName dbTransaction DeleteFile delif delrows denseToSp denseToSpRE denToZero design det detl dfft dffti diag diagrv digamma doswin DOSWinCloseall DOSWinOpen dotfeq dotfeqmt dotfge dotfgemt dotfgt dotfgtmt dotfle dotflemt dotflt dotfltmt dotfne dotfnemt draw drop dsCreate dstat dstatmt dstatmtControlCreate dtdate dtday dttime dttodtv dttostr dttoutc dtvnormal dtvtodt dtvtoutc dummy dummybr dummydn eig eigh eighv eigv elapsedTradingDays endwind envget eof eqSolve eqSolvemt eqSolvemtControlCreate eqSolvemtOutCreate eqSolveset erf erfc erfccplx erfcplx error etdays ethsec etstr EuropeanBinomCall EuropeanBinomCall_Greeks EuropeanBinomCall_ImpVol EuropeanBinomPut EuropeanBinomPut_Greeks EuropeanBinomPut_ImpVol EuropeanBSCall EuropeanBSCall_Greeks EuropeanBSCall_ImpVol EuropeanBSPut EuropeanBSPut_Greeks EuropeanBSPut_ImpVol exctsmpl exec execbg exp extern eye fcheckerr fclearerr feq feqmt fflush fft ffti fftm fftmi fftn fge fgemt fgets fgetsa fgetsat fgetst fgt fgtmt fileinfo filesa fle flemt floor flt fltmt fmod fne fnemt fonts fopen formatcv formatnv fputs fputst fseek fstrerror ftell ftocv ftos ftostrC gamma gammacplx gammaii gausset gdaAppend gdaCreate gdaDStat gdaDStatMat gdaGetIndex gdaGetName gdaGetNames gdaGetOrders gdaGetType gdaGetTypes gdaGetVarInfo gdaIsCplx gdaLoad gdaPack gdaRead gdaReadByIndex gdaReadSome gdaReadSparse gdaReadStruct gdaReportVarInfo gdaSave gdaUpdate gdaUpdateAndPack gdaVars gdaWrite gdaWrite32 gdaWriteSome getarray getdims getf getGAUSShome getmatrix getmatrix4D getname getnamef getNextTradingDay getNextWeekDay getnr getorders getpath getPreviousTradingDay getPreviousWeekDay getRow getscalar3D getscalar4D getTrRow getwind glm gradcplx gradMT gradMTm gradMTT gradMTTm gradp graphprt graphset hasimag header headermt hess hessMT hessMTg hessMTgw hessMTm hessMTmw hessMTT hessMTTg hessMTTgw hessMTTm hessMTw hessp hist histf histp hsec imag indcv indexcat indices indices2 indicesf indicesfn indnv indsav integrate1d integrateControlCreate intgrat2 intgrat3 inthp1 inthp2 inthp3 inthp4 inthpControlCreate intquad1 intquad2 intquad3 intrleav intrleavsa intrsect intsimp inv invpd invswp iscplx iscplxf isden isinfnanmiss ismiss key keyav keyw lag lag1 lagn lapEighb lapEighi lapEighvb lapEighvi lapgEig lapgEigh lapgEighv lapgEigv lapgSchur lapgSvdcst lapgSvds lapgSvdst lapSvdcusv lapSvds lapSvdusv ldlp ldlsol linSolve listwise ln lncdfbvn lncdfbvn2 lncdfmvn lncdfn lncdfn2 lncdfnc lnfact lngammacplx lnpdfmvn lnpdfmvt lnpdfn lnpdft loadd loadstruct loadwind loess loessmt loessmtControlCreate log loglog logx logy lower lowmat lowmat1 ltrisol lu lusol machEpsilon make makevars makewind margin matalloc matinit mattoarray maxbytes maxc maxindc maxv maxvec mbesselei mbesselei0 mbesselei1 mbesseli mbesseli0 mbesseli1 meanc median mergeby mergevar minc minindc minv miss missex missrv moment momentd movingave movingaveExpwgt movingaveWgt nextindex nextn nextnevn nextwind ntos null null1 numCombinations ols olsmt olsmtControlCreate olsqr olsqr2 olsqrmt ones optn optnevn orth outtyp pacf packedToSp packr parse pause pdfCauchy pdfChi pdfExp pdfGenPareto pdfHyperGeo pdfLaplace pdfLogistic pdfn pdfPoisson pdfRayleigh pdfWeibull pi pinv pinvmt plotAddArrow plotAddBar plotAddBox plotAddHist plotAddHistF plotAddHistP plotAddPolar plotAddScatter plotAddShape plotAddTextbox plotAddTS plotAddXY plotArea plotBar plotBox plotClearLayout plotContour plotCustomLayout plotGetDefaults plotHist plotHistF plotHistP plotLayout plotLogLog plotLogX plotLogY plotOpenWindow plotPolar plotSave plotScatter plotSetAxesPen plotSetBar plotSetBarFill plotSetBarStacked plotSetBkdColor plotSetFill plotSetGrid plotSetLegend plotSetLineColor plotSetLineStyle plotSetLineSymbol plotSetLineThickness plotSetNewWindow plotSetTitle plotSetWhichYAxis plotSetXAxisShow plotSetXLabel plotSetXRange plotSetXTicInterval plotSetXTicLabel plotSetYAxisShow plotSetYLabel plotSetYRange plotSetZAxisShow plotSetZLabel plotSurface plotTS plotXY polar polychar polyeval polygamma polyint polymake polymat polymroot polymult polyroot pqgwin previousindex princomp printfm printfmt prodc psi putarray putf putvals pvCreate pvGetIndex pvGetParNames pvGetParVector pvLength pvList pvPack pvPacki pvPackm pvPackmi pvPacks pvPacksi pvPacksm pvPacksmi pvPutParVector pvTest pvUnpack QNewton QNewtonmt QNewtonmtControlCreate QNewtonmtOutCreate QNewtonSet QProg QProgmt QProgmtInCreate qqr qqre qqrep qr qre qrep qrsol qrtsol qtyr qtyre qtyrep quantile quantiled qyr qyre qyrep qz rank rankindx readr real reclassify reclassifyCuts recode recserar recsercp recserrc rerun rescale reshape rets rev rfft rffti rfftip rfftn rfftnp rfftp rndBernoulli rndBeta rndBinomial rndCauchy rndChiSquare rndCon rndCreateState rndExp rndGamma rndGeo rndGumbel rndHyperGeo rndi rndKMbeta rndKMgam rndKMi rndKMn rndKMnb rndKMp rndKMu rndKMvm rndLaplace rndLCbeta rndLCgam rndLCi rndLCn rndLCnb rndLCp rndLCu rndLCvm rndLogNorm rndMTu rndMVn rndMVt rndn rndnb rndNegBinomial rndp rndPoisson rndRayleigh rndStateSkip rndu rndvm rndWeibull rndWishart rotater round rows rowsf rref sampleData satostrC saved saveStruct savewind scale scale3d scalerr scalinfnanmiss scalmiss schtoc schur searchsourcepath seekr select selif seqa seqm setdif setdifsa setvars setvwrmode setwind shell shiftr sin singleindex sinh sleep solpd sortc sortcc sortd sorthc sorthcc sortind sortindc sortmc sortr sortrc spBiconjGradSol spChol spConjGradSol spCreate spDenseSubmat spDiagRvMat spEigv spEye spLDL spline spLU spNumNZE spOnes spreadSheetReadM spreadSheetReadSA spreadSheetWrite spScale spSubmat spToDense spTrTDense spTScalar spZeros sqpSolve sqpSolveMT sqpSolveMTControlCreate sqpSolveMTlagrangeCreate sqpSolveMToutCreate sqpSolveSet sqrt statements stdc stdsc stocv stof strcombine strindx strlen strput strrindx strsect strsplit strsplitPad strtodt strtof strtofcplx strtriml strtrimr strtrunc strtruncl strtruncpad strtruncr submat subscat substute subvec sumc sumr surface svd svd1 svd2 svdcusv svds svdusv sysstate tab tan tanh tempname time timedt timestr timeutc title tkf2eps tkf2ps tocart todaydt toeplitz token topolar trapchk trigamma trimr trunc type typecv typef union unionsa uniqindx uniqindxsa unique uniquesa upmat upmat1 upper utctodt utctodtv utrisol vals varCovMS varCovXS varget vargetl varmall varmares varput varputl vartypef vcm vcms vcx vcxs vec vech vecr vector vget view viewxyz vlist vnamecv volume vput vread vtypecv wait waitc walkindex where window writer xlabel xlsGetSheetCount xlsGetSheetSize xlsGetSheetTypes xlsMakeRange xlsReadM xlsReadSA xlsWrite xlsWriteM xlsWriteSA xpnd xtics xy xyz ylabel ytics zeros zeta zlabel ztics cdfEmpirical dot h5create h5open h5read h5readAttribute h5write h5writeAttribute ldl plotAddErrorBar plotAddSurface plotCDFEmpirical plotSetColormap plotSetContourLabels plotSetLegendFont plotSetTextInterpreter plotSetXTicCount plotSetYTicCount plotSetZLevels powerm strjoin sylvester strtrim",
+literal:"DB_AFTER_LAST_ROW DB_ALL_TABLES DB_BATCH_OPERATIONS DB_BEFORE_FIRST_ROW DB_BLOB DB_EVENT_NOTIFICATIONS DB_FINISH_QUERY DB_HIGH_PRECISION DB_LAST_INSERT_ID DB_LOW_PRECISION_DOUBLE DB_LOW_PRECISION_INT32 DB_LOW_PRECISION_INT64 DB_LOW_PRECISION_NUMBERS DB_MULTIPLE_RESULT_SETS DB_NAMED_PLACEHOLDERS DB_POSITIONAL_PLACEHOLDERS DB_PREPARED_QUERIES DB_QUERY_SIZE DB_SIMPLE_LOCKING DB_SYSTEM_TABLES DB_TABLES DB_TRANSACTIONS DB_UNICODE DB_VIEWS __STDIN __STDOUT __STDERR __FILE_DIR"};AT_COMMENT_MODE=
+a.COMMENT("@","@");PREPROCESSOR={className:"meta",begin:"#",end:"$",keywords:{"meta-keyword":"define definecs|10 undef ifdef ifndef iflight ifdllcall ifmac ifos2win ifunix else endif lineson linesoff srcfile srcline"},contains:[{begin:/\\\n/,relevance:0},{beginKeywords:"include",end:"$",keywords:{"meta-keyword":"include"},contains:[{className:"meta-string",begin:'"',end:'"',illegal:"\\n"}]},a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,AT_COMMENT_MODE]};STRUCT_TYPE={begin:/\bstruct\s+/,end:/\s/,keywords:"struct",
+contains:[{className:"type",begin:a.UNDERSCORE_IDENT_RE,relevance:0}]};PARSE_PARAMS=[{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,endsWithParent:!0,relevance:0,contains:[{className:"literal",begin:/\.\.\./},a.C_NUMBER_MODE,a.C_BLOCK_COMMENT_MODE,AT_COMMENT_MODE,STRUCT_TYPE]}];FUNCTION_DEF={className:"title",begin:a.UNDERSCORE_IDENT_RE,relevance:0};DEFINITION=function(c,b,f){c=a.inherit({className:"function",beginKeywords:c,end:b,excludeEnd:!0,contains:[].concat(PARSE_PARAMS)},
+f||{});c.contains.push(FUNCTION_DEF);c.contains.push(a.C_NUMBER_MODE);c.contains.push(a.C_BLOCK_COMMENT_MODE);c.contains.push(AT_COMMENT_MODE);return c};BUILT_IN_REF={className:"built_in",begin:"\\b("+c.built_in.split(" ").join("|")+")\\b"};STRING_REF={className:"string",begin:'"',end:'"',contains:[a.BACKSLASH_ESCAPE],relevance:0};FUNCTION_REF={begin:a.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,keywords:c,relevance:0,contains:[{beginKeywords:c.keyword},BUILT_IN_REF,{className:"built_in",begin:a.UNDERSCORE_IDENT_RE,
+relevance:0}]};FUNCTION_REF_PARAMS={begin:/\(/,end:/\)/,relevance:0,keywords:{built_in:c.built_in,literal:c.literal},contains:[a.C_NUMBER_MODE,a.C_BLOCK_COMMENT_MODE,AT_COMMENT_MODE,BUILT_IN_REF,FUNCTION_REF,STRING_REF,"self"]};FUNCTION_REF.contains.push(FUNCTION_REF_PARAMS);return{aliases:["gss"],case_insensitive:!0,keywords:c,illegal:/(\{[%#]|[%#]\}| <- )/,contains:[a.C_NUMBER_MODE,a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,AT_COMMENT_MODE,STRING_REF,PREPROCESSOR,{className:"keyword",begin:/\bexternal (matrix|string|array|sparse matrix|struct|proc|keyword|fn)/},
+DEFINITION("proc keyword",";"),DEFINITION("fn","="),{beginKeywords:"for threadfor",end:/;/,relevance:0,contains:[a.C_BLOCK_COMMENT_MODE,AT_COMMENT_MODE,FUNCTION_REF_PARAMS]},{variants:[{begin:a.UNDERSCORE_IDENT_RE+"\\."+a.UNDERSCORE_IDENT_RE},{begin:a.UNDERSCORE_IDENT_RE+"\\s*="}],relevance:0},FUNCTION_REF,STRUCT_TYPE]}});b.registerLanguage("gcode",function(a){a=[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,a.COMMENT(/\(/,/\)/),a.inherit(a.C_NUMBER_MODE,{begin:"([-+]?([0-9]*\\.?[0-9]+\\.?))|"+a.C_NUMBER_RE}),
+a.inherit(a.APOS_STRING_MODE,{illegal:null}),a.inherit(a.QUOTE_STRING_MODE,{illegal:null}),{className:"name",begin:"([G])([0-9]+\\.?[0-9]?)"},{className:"name",begin:"([M])([0-9]+\\.?[0-9]?)"},{className:"attr",begin:"(VC|VS|#)",end:"(\\d+)"},{className:"attr",begin:"(VZOFX|VZOFY|VZOFZ)"},{className:"built_in",begin:"(ATAN|ABS|ACOS|ASIN|SIN|COS|EXP|FIX|FUP|ROUND|LN|TAN)(\\[)",end:"([-+]?([0-9]*\\.?[0-9]+\\.?))(\\])"},{className:"symbol",variants:[{begin:"N",end:"\\d+",illegal:"\\W"}]}];return{aliases:["nc"],
+case_insensitive:!0,lexemes:"[A-Z_][A-Z0-9_.]*",keywords:"IF DO WHILE ENDWHILE CALL ENDIF SUB ENDSUB GOTO REPEAT ENDREPEAT EQ LT GT NE GE LE OR XOR",contains:[{className:"meta",begin:"\\%"},{className:"meta",begin:"([O])([0-9]+)"}].concat(a)}});b.registerLanguage("gherkin",function(a){return{aliases:["feature"],keywords:"Feature Background Ability Business Need Scenario Scenarios Scenario Outline Scenario Template Examples Given And Then But When",contains:[{className:"symbol",begin:"\\*",relevance:0},
+{className:"meta",begin:"@[^@\\s]+"},{begin:"\\|",end:"\\|\\w*$",contains:[{className:"string",begin:"[^|]+"}]},{className:"variable",begin:"<",end:">"},a.HASH_COMMENT_MODE,{className:"string",begin:'"""',end:'"""'},a.QUOTE_STRING_MODE]}});b.registerLanguage("glsl",function(a){return{keywords:{keyword:"break continue discard do else for if return while switch case default attribute binding buffer ccw centroid centroid varying coherent column_major const cw depth_any depth_greater depth_less depth_unchanged early_fragment_tests equal_spacing flat fractional_even_spacing fractional_odd_spacing highp in index inout invariant invocations isolines layout line_strip lines lines_adjacency local_size_x local_size_y local_size_z location lowp max_vertices mediump noperspective offset origin_upper_left out packed patch pixel_center_integer point_mode points precise precision quads r11f_g11f_b10f r16 r16_snorm r16f r16i r16ui r32f r32i r32ui r8 r8_snorm r8i r8ui readonly restrict rg16 rg16_snorm rg16f rg16i rg16ui rg32f rg32i rg32ui rg8 rg8_snorm rg8i rg8ui rgb10_a2 rgb10_a2ui rgba16 rgba16_snorm rgba16f rgba16i rgba16ui rgba32f rgba32i rgba32ui rgba8 rgba8_snorm rgba8i rgba8ui row_major sample shared smooth std140 std430 stream triangle_strip triangles triangles_adjacency uniform varying vertices volatile writeonly",
+type:"atomic_uint bool bvec2 bvec3 bvec4 dmat2 dmat2x2 dmat2x3 dmat2x4 dmat3 dmat3x2 dmat3x3 dmat3x4 dmat4 dmat4x2 dmat4x3 dmat4x4 double dvec2 dvec3 dvec4 float iimage1D iimage1DArray iimage2D iimage2DArray iimage2DMS iimage2DMSArray iimage2DRect iimage3D iimageBufferiimageCube iimageCubeArray image1D image1DArray image2D image2DArray image2DMS image2DMSArray image2DRect image3D imageBuffer imageCube imageCubeArray int isampler1D isampler1DArray isampler2D isampler2DArray isampler2DMS isampler2DMSArray isampler2DRect isampler3D isamplerBuffer isamplerCube isamplerCubeArray ivec2 ivec3 ivec4 mat2 mat2x2 mat2x3 mat2x4 mat3 mat3x2 mat3x3 mat3x4 mat4 mat4x2 mat4x3 mat4x4 sampler1D sampler1DArray sampler1DArrayShadow sampler1DShadow sampler2D sampler2DArray sampler2DArrayShadow sampler2DMS sampler2DMSArray sampler2DRect sampler2DRectShadow sampler2DShadow sampler3D samplerBuffer samplerCube samplerCubeArray samplerCubeArrayShadow samplerCubeShadow image1D uimage1DArray uimage2D uimage2DArray uimage2DMS uimage2DMSArray uimage2DRect uimage3D uimageBuffer uimageCube uimageCubeArray uint usampler1D usampler1DArray usampler2D usampler2DArray usampler2DMS usampler2DMSArray usampler2DRect usampler3D samplerBuffer usamplerCube usamplerCubeArray uvec2 uvec3 uvec4 vec2 vec3 vec4 void",
+built_in:"gl_MaxAtomicCounterBindings gl_MaxAtomicCounterBufferSize gl_MaxClipDistances gl_MaxClipPlanes gl_MaxCombinedAtomicCounterBuffers gl_MaxCombinedAtomicCounters gl_MaxCombinedImageUniforms gl_MaxCombinedImageUnitsAndFragmentOutputs gl_MaxCombinedTextureImageUnits gl_MaxComputeAtomicCounterBuffers gl_MaxComputeAtomicCounters gl_MaxComputeImageUniforms gl_MaxComputeTextureImageUnits gl_MaxComputeUniformComponents gl_MaxComputeWorkGroupCount gl_MaxComputeWorkGroupSize gl_MaxDrawBuffers gl_MaxFragmentAtomicCounterBuffers gl_MaxFragmentAtomicCounters gl_MaxFragmentImageUniforms gl_MaxFragmentInputComponents gl_MaxFragmentInputVectors gl_MaxFragmentUniformComponents gl_MaxFragmentUniformVectors gl_MaxGeometryAtomicCounterBuffers gl_MaxGeometryAtomicCounters gl_MaxGeometryImageUniforms gl_MaxGeometryInputComponents gl_MaxGeometryOutputComponents gl_MaxGeometryOutputVertices gl_MaxGeometryTextureImageUnits gl_MaxGeometryTotalOutputComponents gl_MaxGeometryUniformComponents gl_MaxGeometryVaryingComponents gl_MaxImageSamples gl_MaxImageUnits gl_MaxLights gl_MaxPatchVertices gl_MaxProgramTexelOffset gl_MaxTessControlAtomicCounterBuffers gl_MaxTessControlAtomicCounters gl_MaxTessControlImageUniforms gl_MaxTessControlInputComponents gl_MaxTessControlOutputComponents gl_MaxTessControlTextureImageUnits gl_MaxTessControlTotalOutputComponents gl_MaxTessControlUniformComponents gl_MaxTessEvaluationAtomicCounterBuffers gl_MaxTessEvaluationAtomicCounters gl_MaxTessEvaluationImageUniforms gl_MaxTessEvaluationInputComponents gl_MaxTessEvaluationOutputComponents gl_MaxTessEvaluationTextureImageUnits gl_MaxTessEvaluationUniformComponents gl_MaxTessGenLevel gl_MaxTessPatchComponents gl_MaxTextureCoords gl_MaxTextureImageUnits gl_MaxTextureUnits gl_MaxVaryingComponents gl_MaxVaryingFloats gl_MaxVaryingVectors gl_MaxVertexAtomicCounterBuffers gl_MaxVertexAtomicCounters gl_MaxVertexAttribs gl_MaxVertexImageUniforms gl_MaxVertexOutputComponents gl_MaxVertexOutputVectors gl_MaxVertexTextureImageUnits gl_MaxVertexUniformComponents gl_MaxVertexUniformVectors gl_MaxViewports gl_MinProgramTexelOffset gl_BackColor gl_BackLightModelProduct gl_BackLightProduct gl_BackMaterial gl_BackSecondaryColor gl_ClipDistance gl_ClipPlane gl_ClipVertex gl_Color gl_DepthRange gl_EyePlaneQ gl_EyePlaneR gl_EyePlaneS gl_EyePlaneT gl_Fog gl_FogCoord gl_FogFragCoord gl_FragColor gl_FragCoord gl_FragData gl_FragDepth gl_FrontColor gl_FrontFacing gl_FrontLightModelProduct gl_FrontLightProduct gl_FrontMaterial gl_FrontSecondaryColor gl_GlobalInvocationID gl_InstanceID gl_InvocationID gl_Layer gl_LightModel gl_LightSource gl_LocalInvocationID gl_LocalInvocationIndex gl_ModelViewMatrix gl_ModelViewMatrixInverse gl_ModelViewMatrixInverseTranspose gl_ModelViewMatrixTranspose gl_ModelViewProjectionMatrix gl_ModelViewProjectionMatrixInverse gl_ModelViewProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixTranspose gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 gl_Normal gl_NormalMatrix gl_NormalScale gl_NumSamples gl_NumWorkGroups gl_ObjectPlaneQ gl_ObjectPlaneR gl_ObjectPlaneS gl_ObjectPlaneT gl_PatchVerticesIn gl_Point gl_PointCoord gl_PointSize gl_Position gl_PrimitiveID gl_PrimitiveIDIn gl_ProjectionMatrix gl_ProjectionMatrixInverse gl_ProjectionMatrixInverseTranspose gl_ProjectionMatrixTranspose gl_SampleID gl_SampleMask gl_SampleMaskIn gl_SamplePosition gl_SecondaryColor gl_TessCoord gl_TessLevelInner gl_TessLevelOuter gl_TexCoord gl_TextureEnvColor gl_TextureMatrix gl_TextureMatrixInverse gl_TextureMatrixInverseTranspose gl_TextureMatrixTranspose gl_Vertex gl_VertexID gl_ViewportIndex gl_WorkGroupID gl_WorkGroupSize gl_in gl_out EmitStreamVertex EmitVertex EndPrimitive EndStreamPrimitive abs acos acosh all any asin asinh atan atanh atomicAdd atomicAnd atomicCompSwap atomicCounter atomicCounterDecrement atomicCounterIncrement atomicExchange atomicMax atomicMin atomicOr atomicXor barrier bitCount bitfieldExtract bitfieldInsert bitfieldReverse ceil clamp cos cosh cross dFdx dFdy degrees determinant distance dot equal exp exp2 faceforward findLSB findMSB floatBitsToInt floatBitsToUint floor fma fract frexp ftransform fwidth greaterThan greaterThanEqual groupMemoryBarrier imageAtomicAdd imageAtomicAnd imageAtomicCompSwap imageAtomicExchange imageAtomicMax imageAtomicMin imageAtomicOr imageAtomicXor imageLoad imageSize imageStore imulExtended intBitsToFloat interpolateAtCentroid interpolateAtOffset interpolateAtSample inverse inversesqrt isinf isnan ldexp length lessThan lessThanEqual log log2 matrixCompMult max memoryBarrier memoryBarrierAtomicCounter memoryBarrierBuffer memoryBarrierImage memoryBarrierShared min mix mod modf noise1 noise2 noise3 noise4 normalize not notEqual outerProduct packDouble2x32 packHalf2x16 packSnorm2x16 packSnorm4x8 packUnorm2x16 packUnorm4x8 pow radians reflect refract round roundEven shadow1D shadow1DLod shadow1DProj shadow1DProjLod shadow2D shadow2DLod shadow2DProj shadow2DProjLod sign sin sinh smoothstep sqrt step tan tanh texelFetch texelFetchOffset texture texture1D texture1DLod texture1DProj texture1DProjLod texture2D texture2DLod texture2DProj texture2DProjLod texture3D texture3DLod texture3DProj texture3DProjLod textureCube textureCubeLod textureGather textureGatherOffset textureGatherOffsets textureGrad textureGradOffset textureLod textureLodOffset textureOffset textureProj textureProjGrad textureProjGradOffset textureProjLod textureProjLodOffset textureProjOffset textureQueryLevels textureQueryLod textureSize transpose trunc uaddCarry uintBitsToFloat umulExtended unpackDouble2x32 unpackHalf2x16 unpackSnorm2x16 unpackSnorm4x8 unpackUnorm2x16 unpackUnorm4x8 usubBorrow",
+literal:"true false"},illegal:'"',contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,a.C_NUMBER_MODE,{className:"meta",begin:"#",end:"$"}]}});b.registerLanguage("gml",function(a){return{aliases:["gml","GML"],case_insensitive:!1,keywords:{keywords:"begin end if then else while do for break continue with until repeat exit and or xor not return mod div switch case default var globalvar enum #macro #region #endregion",built_in:"is_real is_string is_array is_undefined is_int32 is_int64 is_ptr is_vec3 is_vec4 is_matrix is_bool typeof variable_global_exists variable_global_get variable_global_set variable_instance_exists variable_instance_get variable_instance_set variable_instance_get_names array_length_1d array_length_2d array_height_2d array_equals array_create array_copy random random_range irandom irandom_range random_set_seed random_get_seed randomize randomise choose abs round floor ceil sign frac sqrt sqr exp ln log2 log10 sin cos tan arcsin arccos arctan arctan2 dsin dcos dtan darcsin darccos darctan darctan2 degtorad radtodeg power logn min max mean median clamp lerp dot_product dot_product_3d dot_product_normalised dot_product_3d_normalised dot_product_normalized dot_product_3d_normalized math_set_epsilon math_get_epsilon angle_difference point_distance_3d point_distance point_direction lengthdir_x lengthdir_y real string int64 ptr string_format chr ansi_char ord string_length string_byte_length string_pos string_copy string_char_at string_ord_at string_byte_at string_set_byte_at string_delete string_insert string_lower string_upper string_repeat string_letters string_digits string_lettersdigits string_replace string_replace_all string_count string_hash_to_newline clipboard_has_text clipboard_set_text clipboard_get_text date_current_datetime date_create_datetime date_valid_datetime date_inc_year date_inc_month date_inc_week date_inc_day date_inc_hour date_inc_minute date_inc_second date_get_year date_get_month date_get_week date_get_day date_get_hour date_get_minute date_get_second date_get_weekday date_get_day_of_year date_get_hour_of_year date_get_minute_of_year date_get_second_of_year date_year_span date_month_span date_week_span date_day_span date_hour_span date_minute_span date_second_span date_compare_datetime date_compare_date date_compare_time date_date_of date_time_of date_datetime_string date_date_string date_time_string date_days_in_month date_days_in_year date_leap_year date_is_today date_set_timezone date_get_timezone game_set_speed game_get_speed motion_set motion_add place_free place_empty place_meeting place_snapped move_random move_snap move_towards_point move_contact_solid move_contact_all move_outside_solid move_outside_all move_bounce_solid move_bounce_all move_wrap distance_to_point distance_to_object position_empty position_meeting path_start path_end mp_linear_step mp_potential_step mp_linear_step_object mp_potential_step_object mp_potential_settings mp_linear_path mp_potential_path mp_linear_path_object mp_potential_path_object mp_grid_create mp_grid_destroy mp_grid_clear_all mp_grid_clear_cell mp_grid_clear_rectangle mp_grid_add_cell mp_grid_get_cell mp_grid_add_rectangle mp_grid_add_instances mp_grid_path mp_grid_draw mp_grid_to_ds_grid collision_point collision_rectangle collision_circle collision_ellipse collision_line collision_point_list collision_rectangle_list collision_circle_list collision_ellipse_list collision_line_list instance_position_list instance_place_list point_in_rectangle point_in_triangle point_in_circle rectangle_in_rectangle rectangle_in_triangle rectangle_in_circle instance_find instance_exists instance_number instance_position instance_nearest instance_furthest instance_place instance_create_depth instance_create_layer instance_copy instance_change instance_destroy position_destroy position_change instance_id_get instance_deactivate_all instance_deactivate_object instance_deactivate_region instance_activate_all instance_activate_object instance_activate_region room_goto room_goto_previous room_goto_next room_previous room_next room_restart game_end game_restart game_load game_save game_save_buffer game_load_buffer event_perform event_user event_perform_object event_inherited show_debug_message show_debug_overlay debug_event debug_get_callstack alarm_get alarm_set font_texture_page_size keyboard_set_map keyboard_get_map keyboard_unset_map keyboard_check keyboard_check_pressed keyboard_check_released keyboard_check_direct keyboard_get_numlock keyboard_set_numlock keyboard_key_press keyboard_key_release keyboard_clear io_clear mouse_check_button mouse_check_button_pressed mouse_check_button_released mouse_wheel_up mouse_wheel_down mouse_clear draw_self draw_sprite draw_sprite_pos draw_sprite_ext draw_sprite_stretched draw_sprite_stretched_ext draw_sprite_tiled draw_sprite_tiled_ext draw_sprite_part draw_sprite_part_ext draw_sprite_general draw_clear draw_clear_alpha draw_point draw_line draw_line_width draw_rectangle draw_roundrect draw_roundrect_ext draw_triangle draw_circle draw_ellipse draw_set_circle_precision draw_arrow draw_button draw_path draw_healthbar draw_getpixel draw_getpixel_ext draw_set_colour draw_set_color draw_set_alpha draw_get_colour draw_get_color draw_get_alpha merge_colour make_colour_rgb make_colour_hsv colour_get_red colour_get_green colour_get_blue colour_get_hue colour_get_saturation colour_get_value merge_color make_color_rgb make_color_hsv color_get_red color_get_green color_get_blue color_get_hue color_get_saturation color_get_value merge_color screen_save screen_save_part draw_set_font draw_set_halign draw_set_valign draw_text draw_text_ext string_width string_height string_width_ext string_height_ext draw_text_transformed draw_text_ext_transformed draw_text_colour draw_text_ext_colour draw_text_transformed_colour draw_text_ext_transformed_colour draw_text_color draw_text_ext_color draw_text_transformed_color draw_text_ext_transformed_color draw_point_colour draw_line_colour draw_line_width_colour draw_rectangle_colour draw_roundrect_colour draw_roundrect_colour_ext draw_triangle_colour draw_circle_colour draw_ellipse_colour draw_point_color draw_line_color draw_line_width_color draw_rectangle_color draw_roundrect_color draw_roundrect_color_ext draw_triangle_color draw_circle_color draw_ellipse_color draw_primitive_begin draw_vertex draw_vertex_colour draw_vertex_color draw_primitive_end sprite_get_uvs font_get_uvs sprite_get_texture font_get_texture texture_get_width texture_get_height texture_get_uvs draw_primitive_begin_texture draw_vertex_texture draw_vertex_texture_colour draw_vertex_texture_color texture_global_scale surface_create surface_create_ext surface_resize surface_free surface_exists surface_get_width surface_get_height surface_get_texture surface_set_target surface_set_target_ext surface_reset_target surface_depth_disable surface_get_depth_disable draw_surface draw_surface_stretched draw_surface_tiled draw_surface_part draw_surface_ext draw_surface_stretched_ext draw_surface_tiled_ext draw_surface_part_ext draw_surface_general surface_getpixel surface_getpixel_ext surface_save surface_save_part surface_copy surface_copy_part application_surface_draw_enable application_get_position application_surface_enable application_surface_is_enabled display_get_width display_get_height display_get_orientation display_get_gui_width display_get_gui_height display_reset display_mouse_get_x display_mouse_get_y display_mouse_set display_set_ui_visibility window_set_fullscreen window_get_fullscreen window_set_caption window_set_min_width window_set_max_width window_set_min_height window_set_max_height window_get_visible_rects window_get_caption window_set_cursor window_get_cursor window_set_colour window_get_colour window_set_color window_get_color window_set_position window_set_size window_set_rectangle window_center window_get_x window_get_y window_get_width window_get_height window_mouse_get_x window_mouse_get_y window_mouse_set window_view_mouse_get_x window_view_mouse_get_y window_views_mouse_get_x window_views_mouse_get_y audio_listener_position audio_listener_velocity audio_listener_orientation audio_emitter_position audio_emitter_create audio_emitter_free audio_emitter_exists audio_emitter_pitch audio_emitter_velocity audio_emitter_falloff audio_emitter_gain audio_play_sound audio_play_sound_on audio_play_sound_at audio_stop_sound audio_resume_music audio_music_is_playing audio_resume_sound audio_pause_sound audio_pause_music audio_channel_num audio_sound_length audio_get_type audio_falloff_set_model audio_play_music audio_stop_music audio_master_gain audio_music_gain audio_sound_gain audio_sound_pitch audio_stop_all audio_resume_all audio_pause_all audio_is_playing audio_is_paused audio_exists audio_sound_set_track_position audio_sound_get_track_position audio_emitter_get_gain audio_emitter_get_pitch audio_emitter_get_x audio_emitter_get_y audio_emitter_get_z audio_emitter_get_vx audio_emitter_get_vy audio_emitter_get_vz audio_listener_set_position audio_listener_set_velocity audio_listener_set_orientation audio_listener_get_data audio_set_master_gain audio_get_master_gain audio_sound_get_gain audio_sound_get_pitch audio_get_name audio_sound_set_track_position audio_sound_get_track_position audio_create_stream audio_destroy_stream audio_create_sync_group audio_destroy_sync_group audio_play_in_sync_group audio_start_sync_group audio_stop_sync_group audio_pause_sync_group audio_resume_sync_group audio_sync_group_get_track_pos audio_sync_group_debug audio_sync_group_is_playing audio_debug audio_group_load audio_group_unload audio_group_is_loaded audio_group_load_progress audio_group_name audio_group_stop_all audio_group_set_gain audio_create_buffer_sound audio_free_buffer_sound audio_create_play_queue audio_free_play_queue audio_queue_sound audio_get_recorder_count audio_get_recorder_info audio_start_recording audio_stop_recording audio_sound_get_listener_mask audio_emitter_get_listener_mask audio_get_listener_mask audio_sound_set_listener_mask audio_emitter_set_listener_mask audio_set_listener_mask audio_get_listener_count audio_get_listener_info audio_system show_message show_message_async clickable_add clickable_add_ext clickable_change clickable_change_ext clickable_delete clickable_exists clickable_set_style show_question show_question_async get_integer get_string get_integer_async get_string_async get_login_async get_open_filename get_save_filename get_open_filename_ext get_save_filename_ext show_error highscore_clear highscore_add highscore_value highscore_name draw_highscore sprite_exists sprite_get_name sprite_get_number sprite_get_width sprite_get_height sprite_get_xoffset sprite_get_yoffset sprite_get_bbox_left sprite_get_bbox_right sprite_get_bbox_top sprite_get_bbox_bottom sprite_save sprite_save_strip sprite_set_cache_size sprite_set_cache_size_ext sprite_get_tpe sprite_prefetch sprite_prefetch_multi sprite_flush sprite_flush_multi sprite_set_speed sprite_get_speed_type sprite_get_speed font_exists font_get_name font_get_fontname font_get_bold font_get_italic font_get_first font_get_last font_get_size font_set_cache_size path_exists path_get_name path_get_length path_get_time path_get_kind path_get_closed path_get_precision path_get_number path_get_point_x path_get_point_y path_get_point_speed path_get_x path_get_y path_get_speed script_exists script_get_name timeline_add timeline_delete timeline_clear timeline_exists timeline_get_name timeline_moment_clear timeline_moment_add_script timeline_size timeline_max_moment object_exists object_get_name object_get_sprite object_get_solid object_get_visible object_get_persistent object_get_mask object_get_parent object_get_physics object_is_ancestor room_exists room_get_name sprite_set_offset sprite_duplicate sprite_assign sprite_merge sprite_add sprite_replace sprite_create_from_surface sprite_add_from_surface sprite_delete sprite_set_alpha_from_sprite sprite_collision_mask font_add_enable_aa font_add_get_enable_aa font_add font_add_sprite font_add_sprite_ext font_replace font_replace_sprite font_replace_sprite_ext font_delete path_set_kind path_set_closed path_set_precision path_add path_assign path_duplicate path_append path_delete path_add_point path_insert_point path_change_point path_delete_point path_clear_points path_reverse path_mirror path_flip path_rotate path_rescale path_shift script_execute object_set_sprite object_set_solid object_set_visible object_set_persistent object_set_mask room_set_width room_set_height room_set_persistent room_set_background_colour room_set_background_color room_set_view room_set_viewport room_get_viewport room_set_view_enabled room_add room_duplicate room_assign room_instance_add room_instance_clear room_get_camera room_set_camera asset_get_index asset_get_type file_text_open_from_string file_text_open_read file_text_open_write file_text_open_append file_text_close file_text_write_string file_text_write_real file_text_writeln file_text_read_string file_text_read_real file_text_readln file_text_eof file_text_eoln file_exists file_delete file_rename file_copy directory_exists directory_create directory_destroy file_find_first file_find_next file_find_close file_attributes filename_name filename_path filename_dir filename_drive filename_ext filename_change_ext file_bin_open file_bin_rewrite file_bin_close file_bin_position file_bin_size file_bin_seek file_bin_write_byte file_bin_read_byte parameter_count parameter_string environment_get_variable ini_open_from_string ini_open ini_close ini_read_string ini_read_real ini_write_string ini_write_real ini_key_exists ini_section_exists ini_key_delete ini_section_delete ds_set_precision ds_exists ds_stack_create ds_stack_destroy ds_stack_clear ds_stack_copy ds_stack_size ds_stack_empty ds_stack_push ds_stack_pop ds_stack_top ds_stack_write ds_stack_read ds_queue_create ds_queue_destroy ds_queue_clear ds_queue_copy ds_queue_size ds_queue_empty ds_queue_enqueue ds_queue_dequeue ds_queue_head ds_queue_tail ds_queue_write ds_queue_read ds_list_create ds_list_destroy ds_list_clear ds_list_copy ds_list_size ds_list_empty ds_list_add ds_list_insert ds_list_replace ds_list_delete ds_list_find_index ds_list_find_value ds_list_mark_as_list ds_list_mark_as_map ds_list_sort ds_list_shuffle ds_list_write ds_list_read ds_list_set ds_map_create ds_map_destroy ds_map_clear ds_map_copy ds_map_size ds_map_empty ds_map_add ds_map_add_list ds_map_add_map ds_map_replace ds_map_replace_map ds_map_replace_list ds_map_delete ds_map_exists ds_map_find_value ds_map_find_previous ds_map_find_next ds_map_find_first ds_map_find_last ds_map_write ds_map_read ds_map_secure_save ds_map_secure_load ds_map_secure_load_buffer ds_map_secure_save_buffer ds_map_set ds_priority_create ds_priority_destroy ds_priority_clear ds_priority_copy ds_priority_size ds_priority_empty ds_priority_add ds_priority_change_priority ds_priority_find_priority ds_priority_delete_value ds_priority_delete_min ds_priority_find_min ds_priority_delete_max ds_priority_find_max ds_priority_write ds_priority_read ds_grid_create ds_grid_destroy ds_grid_copy ds_grid_resize ds_grid_width ds_grid_height ds_grid_clear ds_grid_set ds_grid_add ds_grid_multiply ds_grid_set_region ds_grid_add_region ds_grid_multiply_region ds_grid_set_disk ds_grid_add_disk ds_grid_multiply_disk ds_grid_set_grid_region ds_grid_add_grid_region ds_grid_multiply_grid_region ds_grid_get ds_grid_get_sum ds_grid_get_max ds_grid_get_min ds_grid_get_mean ds_grid_get_disk_sum ds_grid_get_disk_min ds_grid_get_disk_max ds_grid_get_disk_mean ds_grid_value_exists ds_grid_value_x ds_grid_value_y ds_grid_value_disk_exists ds_grid_value_disk_x ds_grid_value_disk_y ds_grid_shuffle ds_grid_write ds_grid_read ds_grid_sort ds_grid_set ds_grid_get effect_create_below effect_create_above effect_clear part_type_create part_type_destroy part_type_exists part_type_clear part_type_shape part_type_sprite part_type_size part_type_scale part_type_orientation part_type_life part_type_step part_type_death part_type_speed part_type_direction part_type_gravity part_type_colour1 part_type_colour2 part_type_colour3 part_type_colour_mix part_type_colour_rgb part_type_colour_hsv part_type_color1 part_type_color2 part_type_color3 part_type_color_mix part_type_color_rgb part_type_color_hsv part_type_alpha1 part_type_alpha2 part_type_alpha3 part_type_blend part_system_create part_system_create_layer part_system_destroy part_system_exists part_system_clear part_system_draw_order part_system_depth part_system_position part_system_automatic_update part_system_automatic_draw part_system_update part_system_drawit part_system_get_layer part_system_layer part_particles_create part_particles_create_colour part_particles_create_color part_particles_clear part_particles_count part_emitter_create part_emitter_destroy part_emitter_destroy_all part_emitter_exists part_emitter_clear part_emitter_region part_emitter_burst part_emitter_stream external_call external_define external_free window_handle window_device matrix_get matrix_set matrix_build_identity matrix_build matrix_build_lookat matrix_build_projection_ortho matrix_build_projection_perspective matrix_build_projection_perspective_fov matrix_multiply matrix_transform_vertex matrix_stack_push matrix_stack_pop matrix_stack_multiply matrix_stack_set matrix_stack_clear matrix_stack_top matrix_stack_is_empty browser_input_capture os_get_config os_get_info os_get_language os_get_region os_lock_orientation display_get_dpi_x display_get_dpi_y display_set_gui_size display_set_gui_maximise display_set_gui_maximize device_mouse_dbclick_enable display_set_timing_method display_get_timing_method display_set_sleep_margin display_get_sleep_margin virtual_key_add virtual_key_hide virtual_key_delete virtual_key_show draw_enable_drawevent draw_enable_swf_aa draw_set_swf_aa_level draw_get_swf_aa_level draw_texture_flush draw_flush gpu_set_blendenable gpu_set_ztestenable gpu_set_zfunc gpu_set_zwriteenable gpu_set_lightingenable gpu_set_fog gpu_set_cullmode gpu_set_blendmode gpu_set_blendmode_ext gpu_set_blendmode_ext_sepalpha gpu_set_colorwriteenable gpu_set_colourwriteenable gpu_set_alphatestenable gpu_set_alphatestref gpu_set_alphatestfunc gpu_set_texfilter gpu_set_texfilter_ext gpu_set_texrepeat gpu_set_texrepeat_ext gpu_set_tex_filter gpu_set_tex_filter_ext gpu_set_tex_repeat gpu_set_tex_repeat_ext gpu_set_tex_mip_filter gpu_set_tex_mip_filter_ext gpu_set_tex_mip_bias gpu_set_tex_mip_bias_ext gpu_set_tex_min_mip gpu_set_tex_min_mip_ext gpu_set_tex_max_mip gpu_set_tex_max_mip_ext gpu_set_tex_max_aniso gpu_set_tex_max_aniso_ext gpu_set_tex_mip_enable gpu_set_tex_mip_enable_ext gpu_get_blendenable gpu_get_ztestenable gpu_get_zfunc gpu_get_zwriteenable gpu_get_lightingenable gpu_get_fog gpu_get_cullmode gpu_get_blendmode gpu_get_blendmode_ext gpu_get_blendmode_ext_sepalpha gpu_get_blendmode_src gpu_get_blendmode_dest gpu_get_blendmode_srcalpha gpu_get_blendmode_destalpha gpu_get_colorwriteenable gpu_get_colourwriteenable gpu_get_alphatestenable gpu_get_alphatestref gpu_get_alphatestfunc gpu_get_texfilter gpu_get_texfilter_ext gpu_get_texrepeat gpu_get_texrepeat_ext gpu_get_tex_filter gpu_get_tex_filter_ext gpu_get_tex_repeat gpu_get_tex_repeat_ext gpu_get_tex_mip_filter gpu_get_tex_mip_filter_ext gpu_get_tex_mip_bias gpu_get_tex_mip_bias_ext gpu_get_tex_min_mip gpu_get_tex_min_mip_ext gpu_get_tex_max_mip gpu_get_tex_max_mip_ext gpu_get_tex_max_aniso gpu_get_tex_max_aniso_ext gpu_get_tex_mip_enable gpu_get_tex_mip_enable_ext gpu_push_state gpu_pop_state gpu_get_state gpu_set_state draw_light_define_ambient draw_light_define_direction draw_light_define_point draw_light_enable draw_set_lighting draw_light_get_ambient draw_light_get draw_get_lighting shop_leave_rating url_get_domain url_open url_open_ext url_open_full get_timer achievement_login achievement_logout achievement_post achievement_increment achievement_post_score achievement_available achievement_show_achievements achievement_show_leaderboards achievement_load_friends achievement_load_leaderboard achievement_send_challenge achievement_load_progress achievement_reset achievement_login_status achievement_get_pic achievement_show_challenge_notifications achievement_get_challenges achievement_event achievement_show achievement_get_info cloud_file_save cloud_string_save cloud_synchronise ads_enable ads_disable ads_setup ads_engagement_launch ads_engagement_available ads_engagement_active ads_event ads_event_preload ads_set_reward_callback ads_get_display_height ads_get_display_width ads_move ads_interstitial_available ads_interstitial_display device_get_tilt_x device_get_tilt_y device_get_tilt_z device_is_keypad_open device_mouse_check_button device_mouse_check_button_pressed device_mouse_check_button_released device_mouse_x device_mouse_y device_mouse_raw_x device_mouse_raw_y device_mouse_x_to_gui device_mouse_y_to_gui iap_activate iap_status iap_enumerate_products iap_restore_all iap_acquire iap_consume iap_product_details iap_purchase_details facebook_init facebook_login facebook_status facebook_graph_request facebook_dialog facebook_logout facebook_launch_offerwall facebook_post_message facebook_send_invite facebook_user_id facebook_accesstoken facebook_check_permission facebook_request_read_permissions facebook_request_publish_permissions gamepad_is_supported gamepad_get_device_count gamepad_is_connected gamepad_get_description gamepad_get_button_threshold gamepad_set_button_threshold gamepad_get_axis_deadzone gamepad_set_axis_deadzone gamepad_button_count gamepad_button_check gamepad_button_check_pressed gamepad_button_check_released gamepad_button_value gamepad_axis_count gamepad_axis_value gamepad_set_vibration gamepad_set_colour gamepad_set_color os_is_paused window_has_focus code_is_compiled http_get http_get_file http_post_string http_request json_encode json_decode zip_unzip load_csv base64_encode base64_decode md5_string_unicode md5_string_utf8 md5_file os_is_network_connected sha1_string_unicode sha1_string_utf8 sha1_file os_powersave_enable analytics_event analytics_event_ext win8_livetile_tile_notification win8_livetile_tile_clear win8_livetile_badge_notification win8_livetile_badge_clear win8_livetile_queue_enable win8_secondarytile_pin win8_secondarytile_badge_notification win8_secondarytile_delete win8_livetile_notification_begin win8_livetile_notification_secondary_begin win8_livetile_notification_expiry win8_livetile_notification_tag win8_livetile_notification_text_add win8_livetile_notification_image_add win8_livetile_notification_end win8_appbar_enable win8_appbar_add_element win8_appbar_remove_element win8_settingscharm_add_entry win8_settingscharm_add_html_entry win8_settingscharm_add_xaml_entry win8_settingscharm_set_xaml_property win8_settingscharm_get_xaml_property win8_settingscharm_remove_entry win8_share_image win8_share_screenshot win8_share_file win8_share_url win8_share_text win8_search_enable win8_search_disable win8_search_add_suggestions win8_device_touchscreen_available win8_license_initialize_sandbox win8_license_trial_version winphone_license_trial_version winphone_tile_title winphone_tile_count winphone_tile_back_title winphone_tile_back_content winphone_tile_back_content_wide winphone_tile_front_image winphone_tile_front_image_small winphone_tile_front_image_wide winphone_tile_back_image winphone_tile_back_image_wide winphone_tile_background_colour winphone_tile_background_color winphone_tile_icon_image winphone_tile_small_icon_image winphone_tile_wide_content winphone_tile_cycle_images winphone_tile_small_background_image physics_world_create physics_world_gravity physics_world_update_speed physics_world_update_iterations physics_world_draw_debug physics_pause_enable physics_fixture_create physics_fixture_set_kinematic physics_fixture_set_density physics_fixture_set_awake physics_fixture_set_restitution physics_fixture_set_friction physics_fixture_set_collision_group physics_fixture_set_sensor physics_fixture_set_linear_damping physics_fixture_set_angular_damping physics_fixture_set_circle_shape physics_fixture_set_box_shape physics_fixture_set_edge_shape physics_fixture_set_polygon_shape physics_fixture_set_chain_shape physics_fixture_add_point physics_fixture_bind physics_fixture_bind_ext physics_fixture_delete physics_apply_force physics_apply_impulse physics_apply_angular_impulse physics_apply_local_force physics_apply_local_impulse physics_apply_torque physics_mass_properties physics_draw_debug physics_test_overlap physics_remove_fixture physics_set_friction physics_set_density physics_set_restitution physics_get_friction physics_get_density physics_get_restitution physics_joint_distance_create physics_joint_rope_create physics_joint_revolute_create physics_joint_prismatic_create physics_joint_pulley_create physics_joint_wheel_create physics_joint_weld_create physics_joint_friction_create physics_joint_gear_create physics_joint_enable_motor physics_joint_get_value physics_joint_set_value physics_joint_delete physics_particle_create physics_particle_delete physics_particle_delete_region_circle physics_particle_delete_region_box physics_particle_delete_region_poly physics_particle_set_flags physics_particle_set_category_flags physics_particle_draw physics_particle_draw_ext physics_particle_count physics_particle_get_data physics_particle_get_data_particle physics_particle_group_begin physics_particle_group_circle physics_particle_group_box physics_particle_group_polygon physics_particle_group_add_point physics_particle_group_end physics_particle_group_join physics_particle_group_delete physics_particle_group_count physics_particle_group_get_data physics_particle_group_get_mass physics_particle_group_get_inertia physics_particle_group_get_centre_x physics_particle_group_get_centre_y physics_particle_group_get_vel_x physics_particle_group_get_vel_y physics_particle_group_get_ang_vel physics_particle_group_get_x physics_particle_group_get_y physics_particle_group_get_angle physics_particle_set_group_flags physics_particle_get_group_flags physics_particle_get_max_count physics_particle_get_radius physics_particle_get_density physics_particle_get_damping physics_particle_get_gravity_scale physics_particle_set_max_count physics_particle_set_radius physics_particle_set_density physics_particle_set_damping physics_particle_set_gravity_scale network_create_socket network_create_socket_ext network_create_server network_create_server_raw network_connect network_connect_raw network_send_packet network_send_raw network_send_broadcast network_send_udp network_send_udp_raw network_set_timeout network_set_config network_resolve network_destroy buffer_create buffer_write buffer_read buffer_seek buffer_get_surface buffer_set_surface buffer_delete buffer_exists buffer_get_type buffer_get_alignment buffer_poke buffer_peek buffer_save buffer_save_ext buffer_load buffer_load_ext buffer_load_partial buffer_copy buffer_fill buffer_get_size buffer_tell buffer_resize buffer_md5 buffer_sha1 buffer_base64_encode buffer_base64_decode buffer_base64_decode_ext buffer_sizeof buffer_get_address buffer_create_from_vertex_buffer buffer_create_from_vertex_buffer_ext buffer_copy_from_vertex_buffer buffer_async_group_begin buffer_async_group_option buffer_async_group_end buffer_load_async buffer_save_async gml_release_mode gml_pragma steam_activate_overlay steam_is_overlay_enabled steam_is_overlay_activated steam_get_persona_name steam_initialised steam_is_cloud_enabled_for_app steam_is_cloud_enabled_for_account steam_file_persisted steam_get_quota_total steam_get_quota_free steam_file_write steam_file_write_file steam_file_read steam_file_delete steam_file_exists steam_file_size steam_file_share steam_is_screenshot_requested steam_send_screenshot steam_is_user_logged_on steam_get_user_steam_id steam_user_owns_dlc steam_user_installed_dlc steam_set_achievement steam_get_achievement steam_clear_achievement steam_set_stat_int steam_set_stat_float steam_set_stat_avg_rate steam_get_stat_int steam_get_stat_float steam_get_stat_avg_rate steam_reset_all_stats steam_reset_all_stats_achievements steam_stats_ready steam_create_leaderboard steam_upload_score steam_upload_score_ext steam_download_scores_around_user steam_download_scores steam_download_friends_scores steam_upload_score_buffer steam_upload_score_buffer_ext steam_current_game_language steam_available_languages steam_activate_overlay_browser steam_activate_overlay_user steam_activate_overlay_store steam_get_user_persona_name steam_get_app_id steam_get_user_account_id steam_ugc_download steam_ugc_create_item steam_ugc_start_item_update steam_ugc_set_item_title steam_ugc_set_item_description steam_ugc_set_item_visibility steam_ugc_set_item_tags steam_ugc_set_item_content steam_ugc_set_item_preview steam_ugc_submit_item_update steam_ugc_get_item_update_progress steam_ugc_subscribe_item steam_ugc_unsubscribe_item steam_ugc_num_subscribed_items steam_ugc_get_subscribed_items steam_ugc_get_item_install_info steam_ugc_get_item_update_info steam_ugc_request_item_details steam_ugc_create_query_user steam_ugc_create_query_user_ex steam_ugc_create_query_all steam_ugc_create_query_all_ex steam_ugc_query_set_cloud_filename_filter steam_ugc_query_set_match_any_tag steam_ugc_query_set_search_text steam_ugc_query_set_ranked_by_trend_days steam_ugc_query_add_required_tag steam_ugc_query_add_excluded_tag steam_ugc_query_set_return_long_description steam_ugc_query_set_return_total_only steam_ugc_query_set_allow_cached_response steam_ugc_send_query shader_set shader_get_name shader_reset shader_current shader_is_compiled shader_get_sampler_index shader_get_uniform shader_set_uniform_i shader_set_uniform_i_array shader_set_uniform_f shader_set_uniform_f_array shader_set_uniform_matrix shader_set_uniform_matrix_array shader_enable_corner_id texture_set_stage texture_get_texel_width texture_get_texel_height shaders_are_supported vertex_format_begin vertex_format_end vertex_format_delete vertex_format_add_position vertex_format_add_position_3d vertex_format_add_colour vertex_format_add_color vertex_format_add_normal vertex_format_add_texcoord vertex_format_add_textcoord vertex_format_add_custom vertex_create_buffer vertex_create_buffer_ext vertex_delete_buffer vertex_begin vertex_end vertex_position vertex_position_3d vertex_colour vertex_color vertex_argb vertex_texcoord vertex_normal vertex_float1 vertex_float2 vertex_float3 vertex_float4 vertex_ubyte4 vertex_submit vertex_freeze vertex_get_number vertex_get_buffer_size vertex_create_buffer_from_buffer vertex_create_buffer_from_buffer_ext push_local_notification push_get_first_local_notification push_get_next_local_notification push_cancel_local_notification skeleton_animation_set skeleton_animation_get skeleton_animation_mix skeleton_animation_set_ext skeleton_animation_get_ext skeleton_animation_get_duration skeleton_animation_get_frames skeleton_animation_clear skeleton_skin_set skeleton_skin_get skeleton_attachment_set skeleton_attachment_get skeleton_attachment_create skeleton_collision_draw_set skeleton_bone_data_get skeleton_bone_data_set skeleton_bone_state_get skeleton_bone_state_set skeleton_get_minmax skeleton_get_num_bounds skeleton_get_bounds skeleton_animation_get_frame skeleton_animation_set_frame draw_skeleton draw_skeleton_time draw_skeleton_instance draw_skeleton_collision skeleton_animation_list skeleton_skin_list skeleton_slot_data layer_get_id layer_get_id_at_depth layer_get_depth layer_create layer_destroy layer_destroy_instances layer_add_instance layer_has_instance layer_set_visible layer_get_visible layer_exists layer_x layer_y layer_get_x layer_get_y layer_hspeed layer_vspeed layer_get_hspeed layer_get_vspeed layer_script_begin layer_script_end layer_shader layer_get_script_begin layer_get_script_end layer_get_shader layer_set_target_room layer_get_target_room layer_reset_target_room layer_get_all layer_get_all_elements layer_get_name layer_depth layer_get_element_layer layer_get_element_type layer_element_move layer_force_draw_depth layer_is_draw_depth_forced layer_get_forced_depth layer_background_get_id layer_background_exists layer_background_create layer_background_destroy layer_background_visible layer_background_change layer_background_sprite layer_background_htiled layer_background_vtiled layer_background_stretch layer_background_yscale layer_background_xscale layer_background_blend layer_background_alpha layer_background_index layer_background_speed layer_background_get_visible layer_background_get_sprite layer_background_get_htiled layer_background_get_vtiled layer_background_get_stretch layer_background_get_yscale layer_background_get_xscale layer_background_get_blend layer_background_get_alpha layer_background_get_index layer_background_get_speed layer_sprite_get_id layer_sprite_exists layer_sprite_create layer_sprite_destroy layer_sprite_change layer_sprite_index layer_sprite_speed layer_sprite_xscale layer_sprite_yscale layer_sprite_angle layer_sprite_blend layer_sprite_alpha layer_sprite_x layer_sprite_y layer_sprite_get_sprite layer_sprite_get_index layer_sprite_get_speed layer_sprite_get_xscale layer_sprite_get_yscale layer_sprite_get_angle layer_sprite_get_blend layer_sprite_get_alpha layer_sprite_get_x layer_sprite_get_y layer_tilemap_get_id layer_tilemap_exists layer_tilemap_create layer_tilemap_destroy tilemap_tileset tilemap_x tilemap_y tilemap_set tilemap_set_at_pixel tilemap_get_tileset tilemap_get_tile_width tilemap_get_tile_height tilemap_get_width tilemap_get_height tilemap_get_x tilemap_get_y tilemap_get tilemap_get_at_pixel tilemap_get_cell_x_at_pixel tilemap_get_cell_y_at_pixel tilemap_clear draw_tilemap draw_tile tilemap_set_global_mask tilemap_get_global_mask tilemap_set_mask tilemap_get_mask tilemap_get_frame tile_set_empty tile_set_index tile_set_flip tile_set_mirror tile_set_rotate tile_get_empty tile_get_index tile_get_flip tile_get_mirror tile_get_rotate layer_tile_exists layer_tile_create layer_tile_destroy layer_tile_change layer_tile_xscale layer_tile_yscale layer_tile_blend layer_tile_alpha layer_tile_x layer_tile_y layer_tile_region layer_tile_visible layer_tile_get_sprite layer_tile_get_xscale layer_tile_get_yscale layer_tile_get_blend layer_tile_get_alpha layer_tile_get_x layer_tile_get_y layer_tile_get_region layer_tile_get_visible layer_instance_get_instance instance_activate_layer instance_deactivate_layer camera_create camera_create_view camera_destroy camera_apply camera_get_active camera_get_default camera_set_default camera_set_view_mat camera_set_proj_mat camera_set_update_script camera_set_begin_script camera_set_end_script camera_set_view_pos camera_set_view_size camera_set_view_speed camera_set_view_border camera_set_view_angle camera_set_view_target camera_get_view_mat camera_get_proj_mat camera_get_update_script camera_get_begin_script camera_get_end_script camera_get_view_x camera_get_view_y camera_get_view_width camera_get_view_height camera_get_view_speed_x camera_get_view_speed_y camera_get_view_border_x camera_get_view_border_y camera_get_view_angle camera_get_view_target view_get_camera view_get_visible view_get_xport view_get_yport view_get_wport view_get_hport view_get_surface_id view_set_camera view_set_visible view_set_xport view_set_yport view_set_wport view_set_hport view_set_surface_id gesture_drag_time gesture_drag_distance gesture_flick_speed gesture_double_tap_time gesture_double_tap_distance gesture_pinch_distance gesture_pinch_angle_towards gesture_pinch_angle_away gesture_rotate_time gesture_rotate_angle gesture_tap_count gesture_get_drag_time gesture_get_drag_distance gesture_get_flick_speed gesture_get_double_tap_time gesture_get_double_tap_distance gesture_get_pinch_distance gesture_get_pinch_angle_towards gesture_get_pinch_angle_away gesture_get_rotate_time gesture_get_rotate_angle gesture_get_tap_count keyboard_virtual_show keyboard_virtual_hide keyboard_virtual_status keyboard_virtual_height",
+literal:"self other all noone global local undefined pointer_invalid pointer_null path_action_stop path_action_restart path_action_continue path_action_reverse true false pi GM_build_date GM_version GM_runtime_version  timezone_local timezone_utc gamespeed_fps gamespeed_microseconds  ev_create ev_destroy ev_step ev_alarm ev_keyboard ev_mouse ev_collision ev_other ev_draw ev_draw_begin ev_draw_end ev_draw_pre ev_draw_post ev_keypress ev_keyrelease ev_trigger ev_left_button ev_right_button ev_middle_button ev_no_button ev_left_press ev_right_press ev_middle_press ev_left_release ev_right_release ev_middle_release ev_mouse_enter ev_mouse_leave ev_mouse_wheel_up ev_mouse_wheel_down ev_global_left_button ev_global_right_button ev_global_middle_button ev_global_left_press ev_global_right_press ev_global_middle_press ev_global_left_release ev_global_right_release ev_global_middle_release ev_joystick1_left ev_joystick1_right ev_joystick1_up ev_joystick1_down ev_joystick1_button1 ev_joystick1_button2 ev_joystick1_button3 ev_joystick1_button4 ev_joystick1_button5 ev_joystick1_button6 ev_joystick1_button7 ev_joystick1_button8 ev_joystick2_left ev_joystick2_right ev_joystick2_up ev_joystick2_down ev_joystick2_button1 ev_joystick2_button2 ev_joystick2_button3 ev_joystick2_button4 ev_joystick2_button5 ev_joystick2_button6 ev_joystick2_button7 ev_joystick2_button8 ev_outside ev_boundary ev_game_start ev_game_end ev_room_start ev_room_end ev_no_more_lives ev_animation_end ev_end_of_path ev_no_more_health ev_close_button ev_user0 ev_user1 ev_user2 ev_user3 ev_user4 ev_user5 ev_user6 ev_user7 ev_user8 ev_user9 ev_user10 ev_user11 ev_user12 ev_user13 ev_user14 ev_user15 ev_step_normal ev_step_begin ev_step_end ev_gui ev_gui_begin ev_gui_end ev_cleanup ev_gesture ev_gesture_tap ev_gesture_double_tap ev_gesture_drag_start ev_gesture_dragging ev_gesture_drag_end ev_gesture_flick ev_gesture_pinch_start ev_gesture_pinch_in ev_gesture_pinch_out ev_gesture_pinch_end ev_gesture_rotate_start ev_gesture_rotating ev_gesture_rotate_end ev_global_gesture_tap ev_global_gesture_double_tap ev_global_gesture_drag_start ev_global_gesture_dragging ev_global_gesture_drag_end ev_global_gesture_flick ev_global_gesture_pinch_start ev_global_gesture_pinch_in ev_global_gesture_pinch_out ev_global_gesture_pinch_end ev_global_gesture_rotate_start ev_global_gesture_rotating ev_global_gesture_rotate_end vk_nokey vk_anykey vk_enter vk_return vk_shift vk_control vk_alt vk_escape vk_space vk_backspace vk_tab vk_pause vk_printscreen vk_left vk_right vk_up vk_down vk_home vk_end vk_delete vk_insert vk_pageup vk_pagedown vk_f1 vk_f2 vk_f3 vk_f4 vk_f5 vk_f6 vk_f7 vk_f8 vk_f9 vk_f10 vk_f11 vk_f12 vk_numpad0 vk_numpad1 vk_numpad2 vk_numpad3 vk_numpad4 vk_numpad5 vk_numpad6 vk_numpad7 vk_numpad8 vk_numpad9 vk_divide vk_multiply vk_subtract vk_add vk_decimal vk_lshift vk_lcontrol vk_lalt vk_rshift vk_rcontrol vk_ralt  mb_any mb_none mb_left mb_right mb_middle c_aqua c_black c_blue c_dkgray c_fuchsia c_gray c_green c_lime c_ltgray c_maroon c_navy c_olive c_purple c_red c_silver c_teal c_white c_yellow c_orange fa_left fa_center fa_right fa_top fa_middle fa_bottom pr_pointlist pr_linelist pr_linestrip pr_trianglelist pr_trianglestrip pr_trianglefan bm_complex bm_normal bm_add bm_max bm_subtract bm_zero bm_one bm_src_colour bm_inv_src_colour bm_src_color bm_inv_src_color bm_src_alpha bm_inv_src_alpha bm_dest_alpha bm_inv_dest_alpha bm_dest_colour bm_inv_dest_colour bm_dest_color bm_inv_dest_color bm_src_alpha_sat tf_point tf_linear tf_anisotropic mip_off mip_on mip_markedonly audio_falloff_none audio_falloff_inverse_distance audio_falloff_inverse_distance_clamped audio_falloff_linear_distance audio_falloff_linear_distance_clamped audio_falloff_exponent_distance audio_falloff_exponent_distance_clamped audio_old_system audio_new_system audio_mono audio_stereo audio_3d cr_default cr_none cr_arrow cr_cross cr_beam cr_size_nesw cr_size_ns cr_size_nwse cr_size_we cr_uparrow cr_hourglass cr_drag cr_appstart cr_handpoint cr_size_all spritespeed_framespersecond spritespeed_framespergameframe asset_object asset_unknown asset_sprite asset_sound asset_room asset_path asset_script asset_font asset_timeline asset_tiles asset_shader fa_readonly fa_hidden fa_sysfile fa_volumeid fa_directory fa_archive  ds_type_map ds_type_list ds_type_stack ds_type_queue ds_type_grid ds_type_priority ef_explosion ef_ring ef_ellipse ef_firework ef_smoke ef_smokeup ef_star ef_spark ef_flare ef_cloud ef_rain ef_snow pt_shape_pixel pt_shape_disk pt_shape_square pt_shape_line pt_shape_star pt_shape_circle pt_shape_ring pt_shape_sphere pt_shape_flare pt_shape_spark pt_shape_explosion pt_shape_cloud pt_shape_smoke pt_shape_snow ps_distr_linear ps_distr_gaussian ps_distr_invgaussian ps_shape_rectangle ps_shape_ellipse ps_shape_diamond ps_shape_line ty_real ty_string dll_cdecl dll_stdcall matrix_view matrix_projection matrix_world os_win32 os_windows os_macosx os_ios os_android os_symbian os_linux os_unknown os_winphone os_tizen os_win8native os_wiiu os_3ds  os_psvita os_bb10 os_ps4 os_xboxone os_ps3 os_xbox360 os_uwp os_tvos os_switch browser_not_a_browser browser_unknown browser_ie browser_firefox browser_chrome browser_safari browser_safari_mobile browser_opera browser_tizen browser_edge browser_windows_store browser_ie_mobile  device_ios_unknown device_ios_iphone device_ios_iphone_retina device_ios_ipad device_ios_ipad_retina device_ios_iphone5 device_ios_iphone6 device_ios_iphone6plus device_emulator device_tablet display_landscape display_landscape_flipped display_portrait display_portrait_flipped tm_sleep tm_countvsyncs of_challenge_win of_challen ge_lose of_challenge_tie leaderboard_type_number leaderboard_type_time_mins_secs cmpfunc_never cmpfunc_less cmpfunc_equal cmpfunc_lessequal cmpfunc_greater cmpfunc_notequal cmpfunc_greaterequal cmpfunc_always cull_noculling cull_clockwise cull_counterclockwise lighttype_dir lighttype_point iap_ev_storeload iap_ev_product iap_ev_purchase iap_ev_consume iap_ev_restore iap_storeload_ok iap_storeload_failed iap_status_uninitialised iap_status_unavailable iap_status_loading iap_status_available iap_status_processing iap_status_restoring iap_failed iap_unavailable iap_available iap_purchased iap_canceled iap_refunded fb_login_default fb_login_fallback_to_webview fb_login_no_fallback_to_webview fb_login_forcing_webview fb_login_use_system_account fb_login_forcing_safari  phy_joint_anchor_1_x phy_joint_anchor_1_y phy_joint_anchor_2_x phy_joint_anchor_2_y phy_joint_reaction_force_x phy_joint_reaction_force_y phy_joint_reaction_torque phy_joint_motor_speed phy_joint_angle phy_joint_motor_torque phy_joint_max_motor_torque phy_joint_translation phy_joint_speed phy_joint_motor_force phy_joint_max_motor_force phy_joint_length_1 phy_joint_length_2 phy_joint_damping_ratio phy_joint_frequency phy_joint_lower_angle_limit phy_joint_upper_angle_limit phy_joint_angle_limits phy_joint_max_length phy_joint_max_torque phy_joint_max_force phy_debug_render_aabb phy_debug_render_collision_pairs phy_debug_render_coms phy_debug_render_core_shapes phy_debug_render_joints phy_debug_render_obb phy_debug_render_shapes  phy_particle_flag_water phy_particle_flag_zombie phy_particle_flag_wall phy_particle_flag_spring phy_particle_flag_elastic phy_particle_flag_viscous phy_particle_flag_powder phy_particle_flag_tensile phy_particle_flag_colourmixing phy_particle_flag_colormixing phy_particle_group_flag_solid phy_particle_group_flag_rigid phy_particle_data_flag_typeflags phy_particle_data_flag_position phy_particle_data_flag_velocity phy_particle_data_flag_colour phy_particle_data_flag_color phy_particle_data_flag_category  achievement_our_info achievement_friends_info achievement_leaderboard_info achievement_achievement_info achievement_filter_all_players achievement_filter_friends_only achievement_filter_favorites_only achievement_type_achievement_challenge achievement_type_score_challenge achievement_pic_loaded  achievement_show_ui achievement_show_profile achievement_show_leaderboard achievement_show_achievement achievement_show_bank achievement_show_friend_picker achievement_show_purchase_prompt network_socket_tcp network_socket_udp network_socket_bluetooth network_type_connect network_type_disconnect network_type_data network_type_non_blocking_connect network_config_connect_timeout network_config_use_non_blocking_socket network_config_enable_reliable_udp network_config_disable_reliable_udp buffer_fixed buffer_grow buffer_wrap buffer_fast buffer_vbuffer buffer_network buffer_u8 buffer_s8 buffer_u16 buffer_s16 buffer_u32 buffer_s32 buffer_u64 buffer_f16 buffer_f32 buffer_f64 buffer_bool buffer_text buffer_string buffer_surface_copy buffer_seek_start buffer_seek_relative buffer_seek_end buffer_generalerror buffer_outofspace buffer_outofbounds buffer_invalidtype  text_type button_type input_type ANSI_CHARSET DEFAULT_CHARSET EASTEUROPE_CHARSET RUSSIAN_CHARSET SYMBOL_CHARSET SHIFTJIS_CHARSET HANGEUL_CHARSET GB2312_CHARSET CHINESEBIG5_CHARSET JOHAB_CHARSET HEBREW_CHARSET ARABIC_CHARSET GREEK_CHARSET TURKISH_CHARSET VIETNAMESE_CHARSET THAI_CHARSET MAC_CHARSET BALTIC_CHARSET OEM_CHARSET  gp_face1 gp_face2 gp_face3 gp_face4 gp_shoulderl gp_shoulderr gp_shoulderlb gp_shoulderrb gp_select gp_start gp_stickl gp_stickr gp_padu gp_padd gp_padl gp_padr gp_axislh gp_axislv gp_axisrh gp_axisrv ov_friends ov_community ov_players ov_settings ov_gamegroup ov_achievements lb_sort_none lb_sort_ascending lb_sort_descending lb_disp_none lb_disp_numeric lb_disp_time_sec lb_disp_time_ms ugc_result_success ugc_filetype_community ugc_filetype_microtrans ugc_visibility_public ugc_visibility_friends_only ugc_visibility_private ugc_query_RankedByVote ugc_query_RankedByPublicationDate ugc_query_AcceptedForGameRankedByAcceptanceDate ugc_query_RankedByTrend ugc_query_FavoritedByFriendsRankedByPublicationDate ugc_query_CreatedByFriendsRankedByPublicationDate ugc_query_RankedByNumTimesReported ugc_query_CreatedByFollowedUsersRankedByPublicationDate ugc_query_NotYetRated ugc_query_RankedByTotalVotesAsc ugc_query_RankedByVotesUp ugc_query_RankedByTextSearch ugc_sortorder_CreationOrderDesc ugc_sortorder_CreationOrderAsc ugc_sortorder_TitleAsc ugc_sortorder_LastUpdatedDesc ugc_sortorder_SubscriptionDateDesc ugc_sortorder_VoteScoreDesc ugc_sortorder_ForModeration ugc_list_Published ugc_list_VotedOn ugc_list_VotedUp ugc_list_VotedDown ugc_list_WillVoteLater ugc_list_Favorited ugc_list_Subscribed ugc_list_UsedOrPlayed ugc_list_Followed ugc_match_Items ugc_match_Items_Mtx ugc_match_Items_ReadyToUse ugc_match_Collections ugc_match_Artwork ugc_match_Videos ugc_match_Screenshots ugc_match_AllGuides ugc_match_WebGuides ugc_match_IntegratedGuides ugc_match_UsableInGame ugc_match_ControllerBindings  vertex_usage_position vertex_usage_colour vertex_usage_color vertex_usage_normal vertex_usage_texcoord vertex_usage_textcoord vertex_usage_blendweight vertex_usage_blendindices vertex_usage_psize vertex_usage_tangent vertex_usage_binormal vertex_usage_fog vertex_usage_depth vertex_usage_sample vertex_type_float1 vertex_type_float2 vertex_type_float3 vertex_type_float4 vertex_type_colour vertex_type_color vertex_type_ubyte4 layerelementtype_undefined layerelementtype_background layerelementtype_instance layerelementtype_oldtilemap layerelementtype_sprite layerelementtype_tilemap layerelementtype_particlesystem layerelementtype_tile tile_rotate tile_flip tile_mirror tile_index_mask kbv_type_default kbv_type_ascii kbv_type_url kbv_type_email kbv_type_numbers kbv_type_phone kbv_type_phone_name kbv_returnkey_default kbv_returnkey_go kbv_returnkey_google kbv_returnkey_join kbv_returnkey_next kbv_returnkey_route kbv_returnkey_search kbv_returnkey_send kbv_returnkey_yahoo kbv_returnkey_done kbv_returnkey_continue kbv_returnkey_emergency kbv_autocapitalize_none kbv_autocapitalize_words kbv_autocapitalize_sentences kbv_autocapitalize_characters",
+symbol:"argument_relative argument argument0 argument1 argument2 argument3 argument4 argument5 argument6 argument7 argument8 argument9 argument10 argument11 argument12 argument13 argument14 argument15 argument_count x y xprevious yprevious xstart ystart hspeed vspeed direction speed friction gravity gravity_direction path_index path_position path_positionprevious path_speed path_scale path_orientation path_endaction object_index id solid persistent mask_index instance_count instance_id room_speed fps fps_real current_time current_year current_month current_day current_weekday current_hour current_minute current_second alarm timeline_index timeline_position timeline_speed timeline_running timeline_loop room room_first room_last room_width room_height room_caption room_persistent score lives health show_score show_lives show_health caption_score caption_lives caption_health event_type event_number event_object event_action application_surface gamemaker_pro gamemaker_registered gamemaker_version error_occurred error_last debug_mode keyboard_key keyboard_lastkey keyboard_lastchar keyboard_string mouse_x mouse_y mouse_button mouse_lastbutton cursor_sprite visible sprite_index sprite_width sprite_height sprite_xoffset sprite_yoffset image_number image_index image_speed depth image_xscale image_yscale image_angle image_alpha image_blend bbox_left bbox_right bbox_top bbox_bottom layer background_colour  background_showcolour background_color background_showcolor view_enabled view_current view_visible view_xview view_yview view_wview view_hview view_xport view_yport view_wport view_hport view_angle view_hborder view_vborder view_hspeed view_vspeed view_object view_surface_id view_camera game_id game_display_name game_project_name game_save_id working_directory temp_directory program_directory browser_width browser_height os_type os_device os_browser os_version display_aa async_load delta_time webgl_enabled event_data iap_data phy_rotation phy_position_x phy_position_y phy_angular_velocity phy_linear_velocity_x phy_linear_velocity_y phy_speed_x phy_speed_y phy_speed phy_angular_damping phy_linear_damping phy_bullet phy_fixed_rotation phy_active phy_mass phy_inertia phy_com_x phy_com_y phy_dynamic phy_kinematic phy_sleeping phy_collision_points phy_collision_x phy_collision_y phy_col_normal_x phy_col_normal_y phy_position_xprevious phy_position_yprevious"},
+contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,a.C_NUMBER_MODE]}});b.registerLanguage("go",function(a){var c={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};
+return{aliases:["golang"],keywords:c,illegal:"</",contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,{className:"string",variants:[a.QUOTE_STRING_MODE,{begin:"'",end:"[^\\\\]'"},{begin:"`",end:"`"}]},{className:"number",variants:[{begin:a.C_NUMBER_RE+"[dflsi]",relevance:1},a.C_NUMBER_MODE]},{begin:/:=/},{className:"function",beginKeywords:"func",end:/\s*\{/,excludeEnd:!0,contains:[a.TITLE_MODE,{className:"params",begin:/\(/,end:/\)/,keywords:c,illegal:/["']/}]}]}});b.registerLanguage("golo",function(a){return{keywords:{keyword:"println readln print import module function local return let var while for foreach times in case when match with break continue augment augmentation each find filter reduce if then else otherwise try catch finally raise throw orIfNull DynamicObject|10 DynamicVariable struct Observable map set vector list array",
+literal:"true false null"},contains:[a.HASH_COMMENT_MODE,a.QUOTE_STRING_MODE,a.C_NUMBER_MODE,{className:"meta",begin:"@[A-Za-z]+"}]}});b.registerLanguage("gradle",function(a){return{case_insensitive:!0,keywords:{keyword:"task project allprojects subprojects artifacts buildscript configurations dependencies repositories sourceSets description delete from into include exclude source classpath destinationDir includes options sourceCompatibility targetCompatibility group flatDir doLast doFirst flatten todir fromdir ant def abstract break case catch continue default do else extends final finally for if implements instanceof native new private protected public return static switch synchronized throw throws transient try volatile while strictfp package import false null super this true antlrtask checkstyle codenarc copy boolean byte char class double float int interface long short void compile runTime file fileTree abs any append asList asWritable call collect compareTo count div dump each eachByte eachFile eachLine every find findAll flatten getAt getErr getIn getOut getText grep immutable inject inspect intersect invokeMethods isCase join leftShift minus multiply newInputStream newOutputStream newPrintWriter newReader newWriter next plus pop power previous print println push putAt read readBytes readLines reverse reverseEach round size sort splitEachLine step subMap times toInteger toList tokenize upto waitForOrKill withPrintWriter withReader withStream withWriter withWriterAppend write writeLine"},
+contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,a.NUMBER_MODE,a.REGEXP_MODE]}});b.registerLanguage("groovy",function(a){return{keywords:{literal:"true false null",keyword:"byte short char int long boolean float double void def as in assert trait super this abstract static volatile transient public private protected synchronized final class interface enum if else for while switch case break default continue throw throws try catch finally implements extends new import package return instanceof"},
+contains:[a.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,{className:"string",begin:'"""',end:'"""'},{className:"string",begin:"'''",end:"'''"},{className:"string",begin:"\\$/",end:"/\\$",relevance:10},a.APOS_STRING_MODE,{className:"regexp",begin:/~?\/[^\/\n]+\//,contains:[a.BACKSLASH_ESCAPE]},a.QUOTE_STRING_MODE,{className:"meta",begin:"^#!/usr/bin/env",end:"$",illegal:"\n"},a.BINARY_NUMBER_MODE,
+{className:"class",beginKeywords:"class interface trait enum",end:"{",illegal:":",contains:[{beginKeywords:"extends implements"},a.UNDERSCORE_TITLE_MODE]},a.C_NUMBER_MODE,{className:"meta",begin:"@[A-Za-z]+"},{className:"string",begin:/[^\?]{0}[A-Za-z0-9_$]+ *:/},{begin:/\?/,end:/:/},{className:"symbol",begin:"^\\s*[A-Za-z0-9_$]+:",relevance:0}],illegal:/#|<\//}});b.registerLanguage("haml",function(a){return{case_insensitive:!0,contains:[{className:"meta",begin:"^!!!( (5|1\\.1|Strict|Frameset|Basic|Mobile|RDFa|XML\\b.*))?$",
+relevance:10},a.COMMENT("^\\s*(!=#|=#|-#|/).*$",!1,{relevance:0}),{begin:"^\\s*(-|=|!=)(?!#)",starts:{end:"\\n",subLanguage:"ruby"}},{className:"tag",begin:"^\\s*%",contains:[{className:"selector-tag",begin:"\\w+"},{className:"selector-id",begin:"#[\\w-]+"},{className:"selector-class",begin:"\\.[\\w-]+"},{begin:"{\\s*",end:"\\s*}",contains:[{begin:":\\w+\\s*=>",end:",\\s+",returnBegin:!0,endsWithParent:!0,contains:[{className:"attr",begin:":\\w+"},a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,{begin:"\\w+",
+relevance:0}]}]},{begin:"\\(\\s*",end:"\\s*\\)",excludeEnd:!0,contains:[{begin:"\\w+\\s*=",end:"\\s+",returnBegin:!0,endsWithParent:!0,contains:[{className:"attr",begin:"\\w+",relevance:0},a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,{begin:"\\w+",relevance:0}]}]}]},{begin:"^\\s*[=~]\\s*"},{begin:"#{",starts:{end:"}",subLanguage:"ruby"}}]}});b.registerLanguage("handlebars",function(a){var c={"builtin-name":"each in with if else unless bindattr action collection debugger log outlet template unbound view yield"};
+return{aliases:["hbs","html.hbs","html.handlebars"],case_insensitive:!0,subLanguage:"xml",contains:[a.COMMENT("{{!(--)?","(--)?}}"),{className:"template-tag",begin:/\{\{[#\/]/,end:/\}\}/,contains:[{className:"name",begin:/[a-zA-Z\.-]+/,keywords:c,starts:{endsWithParent:!0,relevance:0,contains:[a.QUOTE_STRING_MODE]}}]},{className:"template-variable",begin:/\{\{/,end:/\}\}/,keywords:c}]}});b.registerLanguage("haskell",function(a){var c={variants:[a.COMMENT("--","$"),a.COMMENT("{-","-}",{contains:["self"]})]},
+b={className:"meta",begin:"{-#",end:"#-}"},e={className:"meta",begin:"^#",end:"$"},f={className:"type",begin:"\\b[A-Z][\\w']*",relevance:0},g={begin:"\\(",end:"\\)",illegal:'"',contains:[b,e,{className:"type",begin:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},a.inherit(a.TITLE_MODE,{begin:"[_a-z][\\w']*"}),c]};return{aliases:["hs"],keywords:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",
+contains:[{beginKeywords:"module",end:"where",keywords:"module where",contains:[g,c],illegal:"\\W\\.|;"},{begin:"\\bimport\\b",end:"$",keywords:"import qualified as hiding",contains:[g,c],illegal:"\\W\\.|;"},{className:"class",begin:"^(\\s*)?(class|instance)\\b",end:"where",keywords:"class family instance where",contains:[f,g,c]},{className:"class",begin:"\\b(data|(new)?type)\\b",end:"$",keywords:"data family type newtype deriving",contains:[b,f,g,{begin:"{",end:"}",contains:g.contains},c]},{beginKeywords:"default",
+end:"$",contains:[f,g,c]},{beginKeywords:"infix infixl infixr",end:"$",contains:[a.C_NUMBER_MODE,c]},{begin:"\\bforeign\\b",end:"$",keywords:"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe",contains:[f,a.QUOTE_STRING_MODE,c]},{className:"meta",begin:"#!\\/usr\\/bin\\/env runhaskell",end:"$"},b,e,a.QUOTE_STRING_MODE,a.C_NUMBER_MODE,f,a.inherit(a.TITLE_MODE,{begin:"^[_a-z][\\w']*"}),c,{begin:"->|<-"}]}});b.registerLanguage("haxe",function(a){return{aliases:["hx"],keywords:{keyword:"break case cast catch continue default do dynamic else enum extern for function here if import in inline never new override package private get set public return static super switch this throw trace try typedef untyped using var while Int Float String Bool Dynamic Void Array ",
+built_in:"trace this",literal:"true false null _"},contains:[{className:"string",begin:"'",end:"'",contains:[a.BACKSLASH_ESCAPE,{className:"subst",begin:"\\$\\{",end:"\\}"},{className:"subst",begin:"\\$",end:"\\W}"}]},a.QUOTE_STRING_MODE,a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,a.C_NUMBER_MODE,{className:"meta",begin:"@:",end:"$"},{className:"meta",begin:"#",end:"$",keywords:{"meta-keyword":"if else elseif end error"}},{className:"type",begin:":[ \t]*",end:"[^A-Za-z0-9_ \t\\->]",excludeBegin:!0,
+excludeEnd:!0,relevance:0},{className:"type",begin:":[ \t]*",end:"\\W",excludeBegin:!0,excludeEnd:!0},{className:"type",begin:"new *",end:"\\W",excludeBegin:!0,excludeEnd:!0},{className:"class",beginKeywords:"enum",end:"\\{",contains:[a.TITLE_MODE]},{className:"class",beginKeywords:"abstract",end:"[\\{$]",contains:[{className:"type",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"type",begin:"from +",end:"\\W",excludeBegin:!0,excludeEnd:!0},{className:"type",begin:"to +",end:"\\W",
+excludeBegin:!0,excludeEnd:!0},a.TITLE_MODE],keywords:{keyword:"abstract from to"}},{className:"class",begin:"\\b(class|interface) +",end:"[\\{$]",excludeEnd:!0,keywords:"class interface",contains:[{className:"keyword",begin:"\\b(extends|implements) +",keywords:"extends implements",contains:[{className:"type",begin:a.IDENT_RE,relevance:0}]},a.TITLE_MODE]},{className:"function",beginKeywords:"function",end:"\\(",excludeEnd:!0,illegal:"\\S",contains:[a.TITLE_MODE]}],illegal:/<\//}});b.registerLanguage("hsp",
+function(a){return{case_insensitive:!0,lexemes:/[\w\._]+/,keywords:"goto gosub return break repeat loop continue wait await dim sdim foreach dimtype dup dupptr end stop newmod delmod mref run exgoto on mcall assert logmes newlab resume yield onexit onerror onkey onclick oncmd exist delete mkdir chdir dirlist bload bsave bcopy memfile if else poke wpoke lpoke getstr chdpm memexpand memcpy memset notesel noteadd notedel noteload notesave randomize noteunsel noteget split strrep setease button chgdisp exec dialog mmload mmplay mmstop mci pset pget syscolor mes print title pos circle cls font sysfont objsize picload color palcolor palette redraw width gsel gcopy gzoom gmode bmpsave hsvcolor getkey listbox chkbox combox input mesbox buffer screen bgscr mouse objsel groll line clrobj boxf objprm objmode stick grect grotate gsquare gradf objimage objskip objenable celload celdiv celput newcom querycom delcom cnvstow comres axobj winobj sendmsg comevent comevarg sarrayconv callfunc cnvwtos comevdisp libptr system hspstat hspver stat cnt err strsize looplev sublev iparam wparam lparam refstr refdval int rnd strlen length length2 length3 length4 vartype gettime peek wpeek lpeek varptr varuse noteinfo instr abs limit getease str strmid strf getpath strtrim sin cos tan atan sqrt double absf expf logf limitf powf geteasef mousex mousey mousew hwnd hinstance hdc ginfo objinfo dirinfo sysinfo thismod __hspver__ __hsp30__ __date__ __time__ __line__ __file__ _debug __hspdef__ and or xor not screen_normal screen_palette screen_hide screen_fixedsize screen_tool screen_frame gmode_gdi gmode_mem gmode_rgb0 gmode_alpha gmode_rgb0alpha gmode_add gmode_sub gmode_pixela ginfo_mx ginfo_my ginfo_act ginfo_sel ginfo_wx1 ginfo_wy1 ginfo_wx2 ginfo_wy2 ginfo_vx ginfo_vy ginfo_sizex ginfo_sizey ginfo_winx ginfo_winy ginfo_mesx ginfo_mesy ginfo_r ginfo_g ginfo_b ginfo_paluse ginfo_dispx ginfo_dispy ginfo_cx ginfo_cy ginfo_intid ginfo_newid ginfo_sx ginfo_sy objinfo_mode objinfo_bmscr objinfo_hwnd notemax notesize dir_cur dir_exe dir_win dir_sys dir_cmdline dir_desktop dir_mydoc dir_tv font_normal font_bold font_italic font_underline font_strikeout font_antialias objmode_normal objmode_guifont objmode_usefont gsquare_grad msgothic msmincho do until while wend for next _break _continue switch case default swbreak swend ddim ldim alloc m_pi rad2deg deg2rad ease_linear ease_quad_in ease_quad_out ease_quad_inout ease_cubic_in ease_cubic_out ease_cubic_inout ease_quartic_in ease_quartic_out ease_quartic_inout ease_bounce_in ease_bounce_out ease_bounce_inout ease_shake_in ease_shake_out ease_shake_inout ease_loop",
+contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,a.QUOTE_STRING_MODE,a.APOS_STRING_MODE,{className:"string",begin:'{"',end:'"}',contains:[a.BACKSLASH_ESCAPE]},a.COMMENT(";","$",{relevance:0}),{className:"meta",begin:"#",end:"$",keywords:{"meta-keyword":"addion cfunc cmd cmpopt comfunc const defcfunc deffunc define else endif enum epack func global if ifdef ifndef include modcfunc modfunc modinit modterm module pack packopt regcmd runtime undef usecom uselib"},contains:[a.inherit(a.QUOTE_STRING_MODE,
+{className:"meta-string"}),a.NUMBER_MODE,a.C_NUMBER_MODE,a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE]},{className:"symbol",begin:"^\\*(\\w+|@)"},a.NUMBER_MODE,a.C_NUMBER_MODE]}});b.registerLanguage("htmlbars",function(a){var c={endsWithParent:!0,relevance:0,keywords:{keyword:"as",built_in:"action collection component concat debugger each each-in else get hash if input link-to loc log mut outlet partial query-params render textarea unbound unless with yield view"},contains:[a.QUOTE_STRING_MODE,{illegal:/\}\}/,
+begin:/[a-zA-Z0-9_]+=/,returnBegin:!0,relevance:0,contains:[{className:"attr",begin:/[a-zA-Z0-9_]+/}]},a.NUMBER_MODE]};return{case_insensitive:!0,subLanguage:"xml",contains:[a.COMMENT("{{!(--)?","(--)?}}"),{className:"template-tag",begin:/\{\{[#\/]/,end:/\}\}/,contains:[{className:"name",begin:/[a-zA-Z\.\-]+/,keywords:{"builtin-name":"action collection component concat debugger each each-in else get hash if input link-to loc log mut outlet partial query-params render textarea unbound unless with yield view"},
+starts:c}]},{className:"template-variable",begin:/\{\{[a-zA-Z][a-zA-Z\-]+/,end:/\}\}/,keywords:{keyword:"as",built_in:"action collection component concat debugger each each-in else get hash if input link-to loc log mut outlet partial query-params render textarea unbound unless with yield view"},contains:[a.QUOTE_STRING_MODE]}]}});b.registerLanguage("http",function(a){return{aliases:["https"],illegal:"\\S",contains:[{begin:"^HTTP/[0-9\\.]+",end:"$",contains:[{className:"number",begin:"\\b\\d{3}\\b"}]},
+{begin:"^[A-Z]+ (.*?) HTTP/[0-9\\.]+$",returnBegin:!0,end:"$",contains:[{className:"string",begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{begin:"HTTP/[0-9\\.]+"},{className:"keyword",begin:"[A-Z]+"}]},{className:"attribute",begin:"^\\w",end:": ",excludeEnd:!0,illegal:"\\n|\\s|=",starts:{end:"$",relevance:0}},{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}]}});b.registerLanguage("hy",function(a){var c={className:"number",begin:"[-+]?\\d+(\\.\\d+)?",relevance:0},b=a.inherit(a.QUOTE_STRING_MODE,
+{illegal:null}),e=a.COMMENT(";","$",{relevance:0}),f={className:"literal",begin:/\b([Tt]rue|[Ff]alse|nil|None)\b/},g={begin:"[\\[\\{]",end:"[\\]\\}]"},k={className:"comment",begin:"\\^[a-zA-Z_\\-!.?+*=<>&#'][a-zA-Z_\\-!.?+*=<>&#'0-9/;:]*"},m=a.COMMENT("\\^\\{","\\}"),p={className:"symbol",begin:"[:]{1,2}[a-zA-Z_\\-!.?+*=<>&#'][a-zA-Z_\\-!.?+*=<>&#'0-9/;:]*"},n={begin:"\\(",end:"\\)"},h={endsWithParent:!0,relevance:0},l={keywords:{"builtin-name":"!= % %= & &= * ** **= *= *map + += , --build-class-- --import-- -= . / // //= /= < << <<= <= = > >= >> >>= @ @= ^ ^= abs accumulate all and any ap-compose ap-dotimes ap-each ap-each-while ap-filter ap-first ap-if ap-last ap-map ap-map-when ap-pipe ap-reduce ap-reject apply as-> ascii assert assoc bin break butlast callable calling-module-name car case cdr chain chr coll? combinations compile compress cond cons cons? continue count curry cut cycle dec def default-method defclass defmacro defmacro-alias defmacro/g! defmain defmethod defmulti defn defn-alias defnc defnr defreader defseq del delattr delete-route dict-comp dir disassemble dispatch-reader-macro distinct divmod do doto drop drop-last drop-while empty? end-sequence eval eval-and-compile eval-when-compile even? every? except exec filter first flatten float? fn fnc fnr for for* format fraction genexpr gensym get getattr global globals group-by hasattr hash hex id identity if if* if-not if-python2 import in inc input instance? integer integer-char? integer? interleave interpose is is-coll is-cons is-empty is-even is-every is-float is-instance is-integer is-integer-char is-iterable is-iterator is-keyword is-neg is-none is-not is-numeric is-odd is-pos is-string is-symbol is-zero isinstance islice issubclass iter iterable? iterate iterator? keyword keyword? lambda last len let lif lif-not list* list-comp locals loop macro-error macroexpand macroexpand-1 macroexpand-all map max merge-with method-decorator min multi-decorator multicombinations name neg? next none? nonlocal not not-in not? nth numeric? oct odd? open or ord partition permutations pos? post-route postwalk pow prewalk print product profile/calls profile/cpu put-route quasiquote quote raise range read read-str recursive-replace reduce remove repeat repeatedly repr require rest round route route-with-methods rwm second seq set-comp setattr setv some sorted string string? sum switch symbol? take take-nth take-while tee try unless unquote unquote-splicing vars walk when while with with* with-decorator with-gensyms xi xor yield yield-from zero? zip zip-longest | |= ~"},
+lexemes:"[a-zA-Z_\\-!.?+*=<>&#'][a-zA-Z_\\-!.?+*=<>&#'0-9/;:]*",className:"name",begin:"[a-zA-Z_\\-!.?+*=<>&#'][a-zA-Z_\\-!.?+*=<>&#'0-9/;:]*",starts:h},q=[n,b,k,m,e,p,g,c,f,{begin:"[a-zA-Z_\\-!.?+*=<>&#'][a-zA-Z_\\-!.?+*=<>&#'0-9/;:]*",relevance:0}];n.contains=[a.COMMENT("comment",""),l,h];h.contains=q;g.contains=q;return{aliases:["hylang"],illegal:/\S/,contains:[{className:"meta",begin:"^#!",end:"$"},n,b,k,m,e,p,g,c,f]}});b.registerLanguage("inform7",function(a){return{aliases:["i7"],case_insensitive:!0,
+keywords:{keyword:"thing room person man woman animal container supporter backdrop door scenery open closed locked inside gender is are say understand kind of rule"},contains:[{className:"string",begin:'"',end:'"',relevance:0,contains:[{className:"subst",begin:"\\[",end:"\\]"}]},{className:"section",begin:/^(Volume|Book|Part|Chapter|Section|Table)\b/,end:"$"},{begin:/^(Check|Carry out|Report|Instead of|To|Rule|When|Before|After)\b/,end:":",contains:[{begin:"\\(This",end:"\\)"}]},{className:"comment",
+begin:"\\[",end:"\\]",contains:["self"]}]}});b.registerLanguage("ini",function(a){var c={className:"string",contains:[a.BACKSLASH_ESCAPE],variants:[{begin:"'''",end:"'''",relevance:10},{begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"'},{begin:"'",end:"'"}]};return{aliases:["toml"],case_insensitive:!0,illegal:/\S/,contains:[a.COMMENT(";","$"),a.HASH_COMMENT_MODE,{className:"section",begin:/^\s*\[+/,end:/\]+/},{begin:/^[a-z0-9\[\]_-]+\s*=\s*/,end:"$",returnBegin:!0,contains:[{className:"attr",
+begin:/[a-z0-9\[\]_-]+/},{begin:/=/,endsWithParent:!0,relevance:0,contains:[{className:"literal",begin:/\bon|off|true|false|yes|no\b/},{className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{begin:/\$\{(.*?)}/}]},c,{className:"number",begin:/([\+\-]+)?[\d]+_[\d_]+/},a.NUMBER_MODE]}]}]}});b.registerLanguage("irpf90",function(a){return{case_insensitive:!0,keywords:{literal:".False. .True.",keyword:"kind do while private call intrinsic where elsewhere type endtype endmodule endselect endinterface end enddo endif if forall endforall only contains default return stop then public subroutine|10 function program .and. .or. .not. .le. .eq. .ge. .gt. .lt. goto save else use module select case access blank direct exist file fmt form formatted iostat name named nextrec number opened rec recl sequential status unformatted unit continue format pause cycle exit c_null_char c_alert c_backspace c_form_feed flush wait decimal round iomsg synchronous nopass non_overridable pass protected volatile abstract extends import non_intrinsic value deferred generic final enumerator class associate bind enum c_int c_short c_long c_long_long c_signed_char c_size_t c_int8_t c_int16_t c_int32_t c_int64_t c_int_least8_t c_int_least16_t c_int_least32_t c_int_least64_t c_int_fast8_t c_int_fast16_t c_int_fast32_t c_int_fast64_t c_intmax_t C_intptr_t c_float c_double c_long_double c_float_complex c_double_complex c_long_double_complex c_bool c_char c_null_ptr c_null_funptr c_new_line c_carriage_return c_horizontal_tab c_vertical_tab iso_c_binding c_loc c_funloc c_associated  c_f_pointer c_ptr c_funptr iso_fortran_env character_storage_size error_unit file_storage_size input_unit iostat_end iostat_eor numeric_storage_size output_unit c_f_procpointer ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode newunit contiguous recursive pad position action delim readwrite eor advance nml interface procedure namelist include sequence elemental pure integer real character complex logical dimension allocatable|10 parameter external implicit|10 none double precision assign intent optional pointer target in out common equivalence data begin_provider &begin_provider end_provider begin_shell end_shell begin_template end_template subst assert touch soft_touch provide no_dep free irp_if irp_else irp_endif irp_write irp_read",
+built_in:"alog alog10 amax0 amax1 amin0 amin1 amod cabs ccos cexp clog csin csqrt dabs dacos dasin datan datan2 dcos dcosh ddim dexp dint dlog dlog10 dmax1 dmin1 dmod dnint dsign dsin dsinh dsqrt dtan dtanh float iabs idim idint idnint ifix isign max0 max1 min0 min1 sngl algama cdabs cdcos cdexp cdlog cdsin cdsqrt cqabs cqcos cqexp cqlog cqsin cqsqrt dcmplx dconjg derf derfc dfloat dgamma dimag dlgama iqint qabs qacos qasin qatan qatan2 qcmplx qconjg qcos qcosh qdim qerf qerfc qexp qgamma qimag qlgama qlog qlog10 qmax1 qmin1 qmod qnint qsign qsin qsinh qsqrt qtan qtanh abs acos aimag aint anint asin atan atan2 char cmplx conjg cos cosh exp ichar index int log log10 max min nint sign sin sinh sqrt tan tanh print write dim lge lgt lle llt mod nullify allocate deallocate adjustl adjustr all allocated any associated bit_size btest ceiling count cshift date_and_time digits dot_product eoshift epsilon exponent floor fraction huge iand ibclr ibits ibset ieor ior ishft ishftc lbound len_trim matmul maxexponent maxloc maxval merge minexponent minloc minval modulo mvbits nearest pack present product radix random_number random_seed range repeat reshape rrspacing scale scan selected_int_kind selected_real_kind set_exponent shape size spacing spread sum system_clock tiny transpose trim ubound unpack verify achar iachar transfer dble entry dprod cpu_time command_argument_count get_command get_command_argument get_environment_variable is_iostat_end ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode is_iostat_eor move_alloc new_line selected_char_kind same_type_as extends_type_ofacosh asinh atanh bessel_j0 bessel_j1 bessel_jn bessel_y0 bessel_y1 bessel_yn erf erfc erfc_scaled gamma log_gamma hypot norm2 atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits bge bgt ble blt dshiftl dshiftr findloc iall iany iparity image_index lcobound ucobound maskl maskr num_images parity popcnt poppar shifta shiftl shiftr this_image IRP_ALIGN irp_here"},
+illegal:/\/\*/,contains:[a.inherit(a.APOS_STRING_MODE,{className:"string",relevance:0}),a.inherit(a.QUOTE_STRING_MODE,{className:"string",relevance:0}),{className:"function",beginKeywords:"subroutine function program",illegal:"[${=\\n]",contains:[a.UNDERSCORE_TITLE_MODE,{className:"params",begin:"\\(",end:"\\)"}]},a.COMMENT("!","$",{relevance:0}),a.COMMENT("begin_doc","end_doc",{relevance:10}),{className:"number",begin:"(?=\\b|\\+|\\-|\\.)(?=\\.\\d|\\d)(?:\\d+)?(?:\\.?\\d*)(?:[de][+-]?\\d+)?\\b\\.?",
+relevance:0}]}});b.registerLanguage("isbl",function(a){var c={className:"number",begin:a.NUMBER_RE,relevance:0},b={className:"string",variants:[{begin:'"',end:'"'},{begin:"'",end:"'"}]},e={className:"doctag",begin:"\\b(?:TODO|DONE|BEGIN|END|STUB|CHG|FIXME|NOTE|BUG|XXX)\\b",relevance:0};e={variants:[{className:"comment",begin:"//",end:"$",relevance:0,contains:[a.PHRASAL_WORDS_MODE,e]},{className:"comment",begin:"/\\*",end:"\\*/",relevance:0,contains:[a.PHRASAL_WORDS_MODE,e]}]};var f={keyword:"and \u0438 else \u0438\u043d\u0430\u0447\u0435 endexcept endfinally endforeach \u043a\u043e\u043d\u0435\u0446\u0432\u0441\u0435 endif \u043a\u043e\u043d\u0435\u0446\u0435\u0441\u043b\u0438 endwhile \u043a\u043e\u043d\u0435\u0446\u043f\u043e\u043a\u0430 except exitfor finally foreach \u0432\u0441\u0435 if \u0435\u0441\u043b\u0438 in \u0432 not \u043d\u0435 or \u0438\u043b\u0438 try while \u043f\u043e\u043a\u0430 ",
+built_in:"SYSRES_CONST_ACCES_RIGHT_TYPE_EDIT SYSRES_CONST_ACCES_RIGHT_TYPE_FULL SYSRES_CONST_ACCES_RIGHT_TYPE_VIEW SYSRES_CONST_ACCESS_MODE_REQUISITE_CODE SYSRES_CONST_ACCESS_NO_ACCESS_VIEW SYSRES_CONST_ACCESS_NO_ACCESS_VIEW_CODE SYSRES_CONST_ACCESS_RIGHTS_ADD_REQUISITE_CODE SYSRES_CONST_ACCESS_RIGHTS_ADD_REQUISITE_YES_CODE SYSRES_CONST_ACCESS_RIGHTS_CHANGE_REQUISITE_CODE SYSRES_CONST_ACCESS_RIGHTS_CHANGE_REQUISITE_YES_CODE SYSRES_CONST_ACCESS_RIGHTS_DELETE_REQUISITE_CODE SYSRES_CONST_ACCESS_RIGHTS_DELETE_REQUISITE_YES_CODE SYSRES_CONST_ACCESS_RIGHTS_EXECUTE_REQUISITE_CODE SYSRES_CONST_ACCESS_RIGHTS_EXECUTE_REQUISITE_YES_CODE SYSRES_CONST_ACCESS_RIGHTS_NO_ACCESS_REQUISITE_CODE SYSRES_CONST_ACCESS_RIGHTS_NO_ACCESS_REQUISITE_YES_CODE SYSRES_CONST_ACCESS_RIGHTS_RATIFY_REQUISITE_CODE SYSRES_CONST_ACCESS_RIGHTS_RATIFY_REQUISITE_YES_CODE SYSRES_CONST_ACCESS_RIGHTS_REQUISITE_CODE SYSRES_CONST_ACCESS_RIGHTS_VIEW SYSRES_CONST_ACCESS_RIGHTS_VIEW_CODE SYSRES_CONST_ACCESS_RIGHTS_VIEW_REQUISITE_CODE SYSRES_CONST_ACCESS_RIGHTS_VIEW_REQUISITE_YES_CODE SYSRES_CONST_ACCESS_TYPE_CHANGE SYSRES_CONST_ACCESS_TYPE_CHANGE_CODE SYSRES_CONST_ACCESS_TYPE_EXISTS SYSRES_CONST_ACCESS_TYPE_EXISTS_CODE SYSRES_CONST_ACCESS_TYPE_FULL SYSRES_CONST_ACCESS_TYPE_FULL_CODE SYSRES_CONST_ACCESS_TYPE_VIEW SYSRES_CONST_ACCESS_TYPE_VIEW_CODE SYSRES_CONST_ACTION_TYPE_ABORT SYSRES_CONST_ACTION_TYPE_ACCEPT SYSRES_CONST_ACTION_TYPE_ACCESS_RIGHTS SYSRES_CONST_ACTION_TYPE_ADD_ATTACHMENT SYSRES_CONST_ACTION_TYPE_CHANGE_CARD SYSRES_CONST_ACTION_TYPE_CHANGE_KIND SYSRES_CONST_ACTION_TYPE_CHANGE_STORAGE SYSRES_CONST_ACTION_TYPE_CONTINUE SYSRES_CONST_ACTION_TYPE_COPY SYSRES_CONST_ACTION_TYPE_CREATE SYSRES_CONST_ACTION_TYPE_CREATE_VERSION SYSRES_CONST_ACTION_TYPE_DELETE SYSRES_CONST_ACTION_TYPE_DELETE_ATTACHMENT SYSRES_CONST_ACTION_TYPE_DELETE_VERSION SYSRES_CONST_ACTION_TYPE_DISABLE_DELEGATE_ACCESS_RIGHTS SYSRES_CONST_ACTION_TYPE_ENABLE_DELEGATE_ACCESS_RIGHTS SYSRES_CONST_ACTION_TYPE_ENCRYPTION_BY_CERTIFICATE SYSRES_CONST_ACTION_TYPE_ENCRYPTION_BY_CERTIFICATE_AND_PASSWORD SYSRES_CONST_ACTION_TYPE_ENCRYPTION_BY_PASSWORD SYSRES_CONST_ACTION_TYPE_EXPORT_WITH_LOCK SYSRES_CONST_ACTION_TYPE_EXPORT_WITHOUT_LOCK SYSRES_CONST_ACTION_TYPE_IMPORT_WITH_UNLOCK SYSRES_CONST_ACTION_TYPE_IMPORT_WITHOUT_UNLOCK SYSRES_CONST_ACTION_TYPE_LIFE_CYCLE_STAGE SYSRES_CONST_ACTION_TYPE_LOCK SYSRES_CONST_ACTION_TYPE_LOCK_FOR_SERVER SYSRES_CONST_ACTION_TYPE_LOCK_MODIFY SYSRES_CONST_ACTION_TYPE_MARK_AS_READED SYSRES_CONST_ACTION_TYPE_MARK_AS_UNREADED SYSRES_CONST_ACTION_TYPE_MODIFY SYSRES_CONST_ACTION_TYPE_MODIFY_CARD SYSRES_CONST_ACTION_TYPE_MOVE_TO_ARCHIVE SYSRES_CONST_ACTION_TYPE_OFF_ENCRYPTION SYSRES_CONST_ACTION_TYPE_PASSWORD_CHANGE SYSRES_CONST_ACTION_TYPE_PERFORM SYSRES_CONST_ACTION_TYPE_RECOVER_FROM_LOCAL_COPY SYSRES_CONST_ACTION_TYPE_RESTART SYSRES_CONST_ACTION_TYPE_RESTORE_FROM_ARCHIVE SYSRES_CONST_ACTION_TYPE_REVISION SYSRES_CONST_ACTION_TYPE_SEND_BY_MAIL SYSRES_CONST_ACTION_TYPE_SIGN SYSRES_CONST_ACTION_TYPE_START SYSRES_CONST_ACTION_TYPE_UNLOCK SYSRES_CONST_ACTION_TYPE_UNLOCK_FROM_SERVER SYSRES_CONST_ACTION_TYPE_VERSION_STATE SYSRES_CONST_ACTION_TYPE_VERSION_VISIBILITY SYSRES_CONST_ACTION_TYPE_VIEW SYSRES_CONST_ACTION_TYPE_VIEW_SHADOW_COPY SYSRES_CONST_ACTION_TYPE_WORKFLOW_DESCRIPTION_MODIFY SYSRES_CONST_ACTION_TYPE_WRITE_HISTORY SYSRES_CONST_ACTIVE_VERSION_STATE_PICK_VALUE SYSRES_CONST_ADD_REFERENCE_MODE_NAME SYSRES_CONST_ADDITION_REQUISITE_CODE SYSRES_CONST_ADDITIONAL_PARAMS_REQUISITE_CODE SYSRES_CONST_ADITIONAL_JOB_END_DATE_REQUISITE_NAME SYSRES_CONST_ADITIONAL_JOB_READ_REQUISITE_NAME SYSRES_CONST_ADITIONAL_JOB_START_DATE_REQUISITE_NAME SYSRES_CONST_ADITIONAL_JOB_STATE_REQUISITE_NAME SYSRES_CONST_ADMINISTRATION_HISTORY_ADDING_USER_TO_GROUP_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_ADDING_USER_TO_GROUP_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_CREATION_COMP_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_CREATION_COMP_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_CREATION_GROUP_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_CREATION_GROUP_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_CREATION_USER_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_CREATION_USER_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_DATABASE_USER_CREATION SYSRES_CONST_ADMINISTRATION_HISTORY_DATABASE_USER_CREATION_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_DATABASE_USER_DELETION SYSRES_CONST_ADMINISTRATION_HISTORY_DATABASE_USER_DELETION_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_DELETION_COMP_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_DELETION_COMP_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_DELETION_GROUP_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_DELETION_GROUP_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_DELETION_USER_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_DELETION_USER_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_DELETION_USER_FROM_GROUP_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_DELETION_USER_FROM_GROUP_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_GRANTING_FILTERER_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_GRANTING_FILTERER_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_GRANTING_FILTERER_RESTRICTION_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_GRANTING_FILTERER_RESTRICTION_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_GRANTING_PRIVILEGE_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_GRANTING_PRIVILEGE_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_GRANTING_RIGHTS_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_GRANTING_RIGHTS_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_IS_MAIN_SERVER_CHANGED_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_IS_MAIN_SERVER_CHANGED_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_IS_PUBLIC_CHANGED_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_IS_PUBLIC_CHANGED_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_REMOVING_FILTERER_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_REMOVING_FILTERER_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_REMOVING_FILTERER_RESTRICTION_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_REMOVING_FILTERER_RESTRICTION_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_REMOVING_PRIVILEGE_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_REMOVING_PRIVILEGE_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_REMOVING_RIGHTS_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_REMOVING_RIGHTS_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_SERVER_LOGIN_CREATION SYSRES_CONST_ADMINISTRATION_HISTORY_SERVER_LOGIN_CREATION_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_SERVER_LOGIN_DELETION SYSRES_CONST_ADMINISTRATION_HISTORY_SERVER_LOGIN_DELETION_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_UPDATING_CATEGORY_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_UPDATING_CATEGORY_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_UPDATING_COMP_TITLE_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_UPDATING_COMP_TITLE_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_UPDATING_FULL_NAME_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_UPDATING_FULL_NAME_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_UPDATING_GROUP_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_UPDATING_GROUP_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_UPDATING_PARENT_GROUP_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_UPDATING_PARENT_GROUP_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_UPDATING_USER_AUTH_TYPE_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_UPDATING_USER_AUTH_TYPE_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_UPDATING_USER_LOGIN_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_UPDATING_USER_LOGIN_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_UPDATING_USER_STATUS_ACTION SYSRES_CONST_ADMINISTRATION_HISTORY_UPDATING_USER_STATUS_ACTION_CODE SYSRES_CONST_ADMINISTRATION_HISTORY_USER_PASSWORD_CHANGE SYSRES_CONST_ADMINISTRATION_HISTORY_USER_PASSWORD_CHANGE_ACTION SYSRES_CONST_ALL_ACCEPT_CONDITION_RUS SYSRES_CONST_ALL_USERS_GROUP SYSRES_CONST_ALL_USERS_GROUP_NAME SYSRES_CONST_ALL_USERS_SERVER_GROUP_NAME SYSRES_CONST_ALLOWED_ACCESS_TYPE_CODE SYSRES_CONST_ALLOWED_ACCESS_TYPE_NAME SYSRES_CONST_APP_VIEWER_TYPE_REQUISITE_CODE SYSRES_CONST_APPROVING_SIGNATURE_NAME SYSRES_CONST_APPROVING_SIGNATURE_REQUISITE_CODE SYSRES_CONST_ASSISTANT_SUBSTITUE_TYPE SYSRES_CONST_ASSISTANT_SUBSTITUE_TYPE_CODE SYSRES_CONST_ATTACH_TYPE_COMPONENT_TOKEN SYSRES_CONST_ATTACH_TYPE_DOC SYSRES_CONST_ATTACH_TYPE_EDOC SYSRES_CONST_ATTACH_TYPE_FOLDER SYSRES_CONST_ATTACH_TYPE_JOB SYSRES_CONST_ATTACH_TYPE_REFERENCE SYSRES_CONST_ATTACH_TYPE_TASK SYSRES_CONST_AUTH_ENCODED_PASSWORD SYSRES_CONST_AUTH_ENCODED_PASSWORD_CODE SYSRES_CONST_AUTH_NOVELL SYSRES_CONST_AUTH_PASSWORD SYSRES_CONST_AUTH_PASSWORD_CODE SYSRES_CONST_AUTH_WINDOWS SYSRES_CONST_AUTHENTICATING_SIGNATURE_NAME SYSRES_CONST_AUTHENTICATING_SIGNATURE_REQUISITE_CODE SYSRES_CONST_AUTO_ENUM_METHOD_FLAG SYSRES_CONST_AUTO_NUMERATION_CODE SYSRES_CONST_AUTO_STRONG_ENUM_METHOD_FLAG SYSRES_CONST_AUTOTEXT_NAME_REQUISITE_CODE SYSRES_CONST_AUTOTEXT_TEXT_REQUISITE_CODE SYSRES_CONST_AUTOTEXT_USAGE_ALL SYSRES_CONST_AUTOTEXT_USAGE_ALL_CODE SYSRES_CONST_AUTOTEXT_USAGE_SIGN SYSRES_CONST_AUTOTEXT_USAGE_SIGN_CODE SYSRES_CONST_AUTOTEXT_USAGE_WORK SYSRES_CONST_AUTOTEXT_USAGE_WORK_CODE SYSRES_CONST_AUTOTEXT_USE_ANYWHERE_CODE SYSRES_CONST_AUTOTEXT_USE_ON_SIGNING_CODE SYSRES_CONST_AUTOTEXT_USE_ON_WORK_CODE SYSRES_CONST_BEGIN_DATE_REQUISITE_CODE SYSRES_CONST_BLACK_LIFE_CYCLE_STAGE_FONT_COLOR SYSRES_CONST_BLUE_LIFE_CYCLE_STAGE_FONT_COLOR SYSRES_CONST_BTN_PART SYSRES_CONST_CALCULATED_ROLE_TYPE_CODE SYSRES_CONST_CALL_TYPE_VARIABLE_BUTTON_VALUE SYSRES_CONST_CALL_TYPE_VARIABLE_PROGRAM_VALUE SYSRES_CONST_CANCEL_MESSAGE_FUNCTION_RESULT SYSRES_CONST_CARD_PART SYSRES_CONST_CARD_REFERENCE_MODE_NAME SYSRES_CONST_CERTIFICATE_TYPE_REQUISITE_ENCRYPT_VALUE SYSRES_CONST_CERTIFICATE_TYPE_REQUISITE_SIGN_AND_ENCRYPT_VALUE SYSRES_CONST_CERTIFICATE_TYPE_REQUISITE_SIGN_VALUE SYSRES_CONST_CHECK_PARAM_VALUE_DATE_PARAM_TYPE SYSRES_CONST_CHECK_PARAM_VALUE_FLOAT_PARAM_TYPE SYSRES_CONST_CHECK_PARAM_VALUE_INTEGER_PARAM_TYPE SYSRES_CONST_CHECK_PARAM_VALUE_PICK_PARAM_TYPE SYSRES_CONST_CHECK_PARAM_VALUE_REEFRENCE_PARAM_TYPE SYSRES_CONST_CLOSED_RECORD_FLAG_VALUE_FEMININE SYSRES_CONST_CLOSED_RECORD_FLAG_VALUE_MASCULINE SYSRES_CONST_CODE_COMPONENT_TYPE_ADMIN SYSRES_CONST_CODE_COMPONENT_TYPE_DEVELOPER SYSRES_CONST_CODE_COMPONENT_TYPE_DOCS SYSRES_CONST_CODE_COMPONENT_TYPE_EDOC_CARDS SYSRES_CONST_CODE_COMPONENT_TYPE_EXTERNAL_EXECUTABLE SYSRES_CONST_CODE_COMPONENT_TYPE_OTHER SYSRES_CONST_CODE_COMPONENT_TYPE_REFERENCE SYSRES_CONST_CODE_COMPONENT_TYPE_REPORT SYSRES_CONST_CODE_COMPONENT_TYPE_SCRIPT SYSRES_CONST_CODE_COMPONENT_TYPE_URL SYSRES_CONST_CODE_REQUISITE_ACCESS SYSRES_CONST_CODE_REQUISITE_CODE SYSRES_CONST_CODE_REQUISITE_COMPONENT SYSRES_CONST_CODE_REQUISITE_DESCRIPTION SYSRES_CONST_CODE_REQUISITE_EXCLUDE_COMPONENT SYSRES_CONST_CODE_REQUISITE_RECORD SYSRES_CONST_COMMENT_REQ_CODE SYSRES_CONST_COMMON_SETTINGS_REQUISITE_CODE SYSRES_CONST_COMP_CODE_GRD SYSRES_CONST_COMPONENT_GROUP_TYPE_REQUISITE_CODE SYSRES_CONST_COMPONENT_TYPE_ADMIN_COMPONENTS SYSRES_CONST_COMPONENT_TYPE_DEVELOPER_COMPONENTS SYSRES_CONST_COMPONENT_TYPE_DOCS SYSRES_CONST_COMPONENT_TYPE_EDOC_CARDS SYSRES_CONST_COMPONENT_TYPE_EDOCS SYSRES_CONST_COMPONENT_TYPE_EXTERNAL_EXECUTABLE SYSRES_CONST_COMPONENT_TYPE_OTHER SYSRES_CONST_COMPONENT_TYPE_REFERENCE_TYPES SYSRES_CONST_COMPONENT_TYPE_REFERENCES SYSRES_CONST_COMPONENT_TYPE_REPORTS SYSRES_CONST_COMPONENT_TYPE_SCRIPTS SYSRES_CONST_COMPONENT_TYPE_URL SYSRES_CONST_COMPONENTS_REMOTE_SERVERS_VIEW_CODE SYSRES_CONST_CONDITION_BLOCK_DESCRIPTION SYSRES_CONST_CONST_FIRM_STATUS_COMMON SYSRES_CONST_CONST_FIRM_STATUS_INDIVIDUAL SYSRES_CONST_CONST_NEGATIVE_VALUE SYSRES_CONST_CONST_POSITIVE_VALUE SYSRES_CONST_CONST_SERVER_STATUS_DONT_REPLICATE SYSRES_CONST_CONST_SERVER_STATUS_REPLICATE SYSRES_CONST_CONTENTS_REQUISITE_CODE SYSRES_CONST_DATA_TYPE_BOOLEAN SYSRES_CONST_DATA_TYPE_DATE SYSRES_CONST_DATA_TYPE_FLOAT SYSRES_CONST_DATA_TYPE_INTEGER SYSRES_CONST_DATA_TYPE_PICK SYSRES_CONST_DATA_TYPE_REFERENCE SYSRES_CONST_DATA_TYPE_STRING SYSRES_CONST_DATA_TYPE_TEXT SYSRES_CONST_DATA_TYPE_VARIANT SYSRES_CONST_DATE_CLOSE_REQ_CODE SYSRES_CONST_DATE_FORMAT_DATE_ONLY_CHAR SYSRES_CONST_DATE_OPEN_REQ_CODE SYSRES_CONST_DATE_REQUISITE SYSRES_CONST_DATE_REQUISITE_CODE SYSRES_CONST_DATE_REQUISITE_NAME SYSRES_CONST_DATE_REQUISITE_TYPE SYSRES_CONST_DATE_TYPE_CHAR SYSRES_CONST_DATETIME_FORMAT_VALUE SYSRES_CONST_DEA_ACCESS_RIGHTS_ACTION_CODE SYSRES_CONST_DESCRIPTION_LOCALIZE_ID_REQUISITE_CODE SYSRES_CONST_DESCRIPTION_REQUISITE_CODE SYSRES_CONST_DET1_PART SYSRES_CONST_DET2_PART SYSRES_CONST_DET3_PART SYSRES_CONST_DET4_PART SYSRES_CONST_DET5_PART SYSRES_CONST_DET6_PART SYSRES_CONST_DETAIL_DATASET_KEY_REQUISITE_CODE SYSRES_CONST_DETAIL_PICK_REQUISITE_CODE SYSRES_CONST_DETAIL_REQ_CODE SYSRES_CONST_DO_NOT_USE_ACCESS_TYPE_CODE SYSRES_CONST_DO_NOT_USE_ACCESS_TYPE_NAME SYSRES_CONST_DO_NOT_USE_ON_VIEW_ACCESS_TYPE_CODE SYSRES_CONST_DO_NOT_USE_ON_VIEW_ACCESS_TYPE_NAME SYSRES_CONST_DOCUMENT_STORAGES_CODE SYSRES_CONST_DOCUMENT_TEMPLATES_TYPE_NAME SYSRES_CONST_DOUBLE_REQUISITE_CODE SYSRES_CONST_EDITOR_CLOSE_FILE_OBSERV_TYPE_CODE SYSRES_CONST_EDITOR_CLOSE_PROCESS_OBSERV_TYPE_CODE SYSRES_CONST_EDITOR_TYPE_REQUISITE_CODE SYSRES_CONST_EDITORS_APPLICATION_NAME_REQUISITE_CODE SYSRES_CONST_EDITORS_CREATE_SEVERAL_PROCESSES_REQUISITE_CODE SYSRES_CONST_EDITORS_EXTENSION_REQUISITE_CODE SYSRES_CONST_EDITORS_OBSERVER_BY_PROCESS_TYPE SYSRES_CONST_EDITORS_REFERENCE_CODE SYSRES_CONST_EDITORS_REPLACE_SPEC_CHARS_REQUISITE_CODE SYSRES_CONST_EDITORS_USE_PLUGINS_REQUISITE_CODE SYSRES_CONST_EDITORS_VIEW_DOCUMENT_OPENED_TO_EDIT_CODE SYSRES_CONST_EDOC_CARD_TYPE_REQUISITE_CODE SYSRES_CONST_EDOC_CARD_TYPES_LINK_REQUISITE_CODE SYSRES_CONST_EDOC_CERTIFICATE_AND_PASSWORD_ENCODE_CODE SYSRES_CONST_EDOC_CERTIFICATE_ENCODE_CODE SYSRES_CONST_EDOC_DATE_REQUISITE_CODE SYSRES_CONST_EDOC_KIND_REFERENCE_CODE SYSRES_CONST_EDOC_KINDS_BY_TEMPLATE_ACTION_CODE SYSRES_CONST_EDOC_MANAGE_ACCESS_CODE SYSRES_CONST_EDOC_NONE_ENCODE_CODE SYSRES_CONST_EDOC_NUMBER_REQUISITE_CODE SYSRES_CONST_EDOC_PASSWORD_ENCODE_CODE SYSRES_CONST_EDOC_READONLY_ACCESS_CODE SYSRES_CONST_EDOC_SHELL_LIFE_TYPE_VIEW_VALUE SYSRES_CONST_EDOC_SIZE_RESTRICTION_PRIORITY_REQUISITE_CODE SYSRES_CONST_EDOC_STORAGE_CHECK_ACCESS_RIGHTS_REQUISITE_CODE SYSRES_CONST_EDOC_STORAGE_COMPUTER_NAME_REQUISITE_CODE SYSRES_CONST_EDOC_STORAGE_DATABASE_NAME_REQUISITE_CODE SYSRES_CONST_EDOC_STORAGE_EDIT_IN_STORAGE_REQUISITE_CODE SYSRES_CONST_EDOC_STORAGE_LOCAL_PATH_REQUISITE_CODE SYSRES_CONST_EDOC_STORAGE_SHARED_SOURCE_NAME_REQUISITE_CODE SYSRES_CONST_EDOC_TEMPLATE_REQUISITE_CODE SYSRES_CONST_EDOC_TYPES_REFERENCE_CODE SYSRES_CONST_EDOC_VERSION_ACTIVE_STAGE_CODE SYSRES_CONST_EDOC_VERSION_DESIGN_STAGE_CODE SYSRES_CONST_EDOC_VERSION_OBSOLETE_STAGE_CODE SYSRES_CONST_EDOC_WRITE_ACCES_CODE SYSRES_CONST_EDOCUMENT_CARD_REQUISITES_REFERENCE_CODE_SELECTED_REQUISITE SYSRES_CONST_ENCODE_CERTIFICATE_TYPE_CODE SYSRES_CONST_END_DATE_REQUISITE_CODE SYSRES_CONST_ENUMERATION_TYPE_REQUISITE_CODE SYSRES_CONST_EXECUTE_ACCESS_RIGHTS_TYPE_CODE SYSRES_CONST_EXECUTIVE_FILE_STORAGE_TYPE SYSRES_CONST_EXIST_CONST SYSRES_CONST_EXIST_VALUE SYSRES_CONST_EXPORT_LOCK_TYPE_ASK SYSRES_CONST_EXPORT_LOCK_TYPE_WITH_LOCK SYSRES_CONST_EXPORT_LOCK_TYPE_WITHOUT_LOCK SYSRES_CONST_EXPORT_VERSION_TYPE_ASK SYSRES_CONST_EXPORT_VERSION_TYPE_LAST SYSRES_CONST_EXPORT_VERSION_TYPE_LAST_ACTIVE SYSRES_CONST_EXTENSION_REQUISITE_CODE SYSRES_CONST_FILTER_NAME_REQUISITE_CODE SYSRES_CONST_FILTER_REQUISITE_CODE SYSRES_CONST_FILTER_TYPE_COMMON_CODE SYSRES_CONST_FILTER_TYPE_COMMON_NAME SYSRES_CONST_FILTER_TYPE_USER_CODE SYSRES_CONST_FILTER_TYPE_USER_NAME SYSRES_CONST_FILTER_VALUE_REQUISITE_NAME SYSRES_CONST_FLOAT_NUMBER_FORMAT_CHAR SYSRES_CONST_FLOAT_REQUISITE_TYPE SYSRES_CONST_FOLDER_AUTHOR_VALUE SYSRES_CONST_FOLDER_KIND_ANY_OBJECTS SYSRES_CONST_FOLDER_KIND_COMPONENTS SYSRES_CONST_FOLDER_KIND_EDOCS SYSRES_CONST_FOLDER_KIND_JOBS SYSRES_CONST_FOLDER_KIND_TASKS SYSRES_CONST_FOLDER_TYPE_COMMON SYSRES_CONST_FOLDER_TYPE_COMPONENT SYSRES_CONST_FOLDER_TYPE_FAVORITES SYSRES_CONST_FOLDER_TYPE_INBOX SYSRES_CONST_FOLDER_TYPE_OUTBOX SYSRES_CONST_FOLDER_TYPE_QUICK_LAUNCH SYSRES_CONST_FOLDER_TYPE_SEARCH SYSRES_CONST_FOLDER_TYPE_SHORTCUTS SYSRES_CONST_FOLDER_TYPE_USER SYSRES_CONST_FROM_DICTIONARY_ENUM_METHOD_FLAG SYSRES_CONST_FULL_SUBSTITUTE_TYPE SYSRES_CONST_FULL_SUBSTITUTE_TYPE_CODE SYSRES_CONST_FUNCTION_CANCEL_RESULT SYSRES_CONST_FUNCTION_CATEGORY_SYSTEM SYSRES_CONST_FUNCTION_CATEGORY_USER SYSRES_CONST_FUNCTION_FAILURE_RESULT SYSRES_CONST_FUNCTION_SAVE_RESULT SYSRES_CONST_GENERATED_REQUISITE SYSRES_CONST_GREEN_LIFE_CYCLE_STAGE_FONT_COLOR SYSRES_CONST_GROUP_ACCOUNT_TYPE_VALUE_CODE SYSRES_CONST_GROUP_CATEGORY_NORMAL_CODE SYSRES_CONST_GROUP_CATEGORY_NORMAL_NAME SYSRES_CONST_GROUP_CATEGORY_SERVICE_CODE SYSRES_CONST_GROUP_CATEGORY_SERVICE_NAME SYSRES_CONST_GROUP_COMMON_CATEGORY_FIELD_VALUE SYSRES_CONST_GROUP_FULL_NAME_REQUISITE_CODE SYSRES_CONST_GROUP_NAME_REQUISITE_CODE SYSRES_CONST_GROUP_RIGHTS_T_REQUISITE_CODE SYSRES_CONST_GROUP_SERVER_CODES_REQUISITE_CODE SYSRES_CONST_GROUP_SERVER_NAME_REQUISITE_CODE SYSRES_CONST_GROUP_SERVICE_CATEGORY_FIELD_VALUE SYSRES_CONST_GROUP_USER_REQUISITE_CODE SYSRES_CONST_GROUPS_REFERENCE_CODE SYSRES_CONST_GROUPS_REQUISITE_CODE SYSRES_CONST_HIDDEN_MODE_NAME SYSRES_CONST_HIGH_LVL_REQUISITE_CODE SYSRES_CONST_HISTORY_ACTION_CREATE_CODE SYSRES_CONST_HISTORY_ACTION_DELETE_CODE SYSRES_CONST_HISTORY_ACTION_EDIT_CODE SYSRES_CONST_HOUR_CHAR SYSRES_CONST_ID_REQUISITE_CODE SYSRES_CONST_IDSPS_REQUISITE_CODE SYSRES_CONST_IMAGE_MODE_COLOR SYSRES_CONST_IMAGE_MODE_GREYSCALE SYSRES_CONST_IMAGE_MODE_MONOCHROME SYSRES_CONST_IMPORTANCE_HIGH SYSRES_CONST_IMPORTANCE_LOW SYSRES_CONST_IMPORTANCE_NORMAL SYSRES_CONST_IN_DESIGN_VERSION_STATE_PICK_VALUE SYSRES_CONST_INCOMING_WORK_RULE_TYPE_CODE SYSRES_CONST_INT_REQUISITE SYSRES_CONST_INT_REQUISITE_TYPE SYSRES_CONST_INTEGER_NUMBER_FORMAT_CHAR SYSRES_CONST_INTEGER_TYPE_CHAR SYSRES_CONST_IS_GENERATED_REQUISITE_NEGATIVE_VALUE SYSRES_CONST_IS_PUBLIC_ROLE_REQUISITE_CODE SYSRES_CONST_IS_REMOTE_USER_NEGATIVE_VALUE SYSRES_CONST_IS_REMOTE_USER_POSITIVE_VALUE SYSRES_CONST_IS_STORED_REQUISITE_NEGATIVE_VALUE SYSRES_CONST_IS_STORED_REQUISITE_STORED_VALUE SYSRES_CONST_ITALIC_LIFE_CYCLE_STAGE_DRAW_STYLE SYSRES_CONST_JOB_BLOCK_DESCRIPTION SYSRES_CONST_JOB_KIND_CONTROL_JOB SYSRES_CONST_JOB_KIND_JOB SYSRES_CONST_JOB_KIND_NOTICE SYSRES_CONST_JOB_STATE_ABORTED SYSRES_CONST_JOB_STATE_COMPLETE SYSRES_CONST_JOB_STATE_WORKING SYSRES_CONST_KIND_REQUISITE_CODE SYSRES_CONST_KIND_REQUISITE_NAME SYSRES_CONST_KINDS_CREATE_SHADOW_COPIES_REQUISITE_CODE SYSRES_CONST_KINDS_DEFAULT_EDOC_LIFE_STAGE_REQUISITE_CODE SYSRES_CONST_KINDS_EDOC_ALL_TEPLATES_ALLOWED_REQUISITE_CODE SYSRES_CONST_KINDS_EDOC_ALLOW_LIFE_CYCLE_STAGE_CHANGING_REQUISITE_CODE SYSRES_CONST_KINDS_EDOC_ALLOW_MULTIPLE_ACTIVE_VERSIONS_REQUISITE_CODE SYSRES_CONST_KINDS_EDOC_SHARE_ACCES_RIGHTS_BY_DEFAULT_CODE SYSRES_CONST_KINDS_EDOC_TEMPLATE_REQUISITE_CODE SYSRES_CONST_KINDS_EDOC_TYPE_REQUISITE_CODE SYSRES_CONST_KINDS_SIGNERS_REQUISITES_CODE SYSRES_CONST_KOD_INPUT_TYPE SYSRES_CONST_LAST_UPDATE_DATE_REQUISITE_CODE SYSRES_CONST_LIFE_CYCLE_START_STAGE_REQUISITE_CODE SYSRES_CONST_LILAC_LIFE_CYCLE_STAGE_FONT_COLOR SYSRES_CONST_LINK_OBJECT_KIND_COMPONENT SYSRES_CONST_LINK_OBJECT_KIND_DOCUMENT SYSRES_CONST_LINK_OBJECT_KIND_EDOC SYSRES_CONST_LINK_OBJECT_KIND_FOLDER SYSRES_CONST_LINK_OBJECT_KIND_JOB SYSRES_CONST_LINK_OBJECT_KIND_REFERENCE SYSRES_CONST_LINK_OBJECT_KIND_TASK SYSRES_CONST_LINK_REF_TYPE_REQUISITE_CODE SYSRES_CONST_LIST_REFERENCE_MODE_NAME SYSRES_CONST_LOCALIZATION_DICTIONARY_MAIN_VIEW_CODE SYSRES_CONST_MAIN_VIEW_CODE SYSRES_CONST_MANUAL_ENUM_METHOD_FLAG SYSRES_CONST_MASTER_COMP_TYPE_REQUISITE_CODE SYSRES_CONST_MASTER_TABLE_REC_ID_REQUISITE_CODE SYSRES_CONST_MAXIMIZED_MODE_NAME SYSRES_CONST_ME_VALUE SYSRES_CONST_MESSAGE_ATTENTION_CAPTION SYSRES_CONST_MESSAGE_CONFIRMATION_CAPTION SYSRES_CONST_MESSAGE_ERROR_CAPTION SYSRES_CONST_MESSAGE_INFORMATION_CAPTION SYSRES_CONST_MINIMIZED_MODE_NAME SYSRES_CONST_MINUTE_CHAR SYSRES_CONST_MODULE_REQUISITE_CODE SYSRES_CONST_MONITORING_BLOCK_DESCRIPTION SYSRES_CONST_MONTH_FORMAT_VALUE SYSRES_CONST_NAME_LOCALIZE_ID_REQUISITE_CODE SYSRES_CONST_NAME_REQUISITE_CODE SYSRES_CONST_NAME_SINGULAR_REQUISITE_CODE SYSRES_CONST_NAMEAN_INPUT_TYPE SYSRES_CONST_NEGATIVE_PICK_VALUE SYSRES_CONST_NEGATIVE_VALUE SYSRES_CONST_NO SYSRES_CONST_NO_PICK_VALUE SYSRES_CONST_NO_SIGNATURE_REQUISITE_CODE SYSRES_CONST_NO_VALUE SYSRES_CONST_NONE_ACCESS_RIGHTS_TYPE_CODE SYSRES_CONST_NONOPERATING_RECORD_FLAG_VALUE SYSRES_CONST_NONOPERATING_RECORD_FLAG_VALUE_MASCULINE SYSRES_CONST_NORMAL_ACCESS_RIGHTS_TYPE_CODE SYSRES_CONST_NORMAL_LIFE_CYCLE_STAGE_DRAW_STYLE SYSRES_CONST_NORMAL_MODE_NAME SYSRES_CONST_NOT_ALLOWED_ACCESS_TYPE_CODE SYSRES_CONST_NOT_ALLOWED_ACCESS_TYPE_NAME SYSRES_CONST_NOTE_REQUISITE_CODE SYSRES_CONST_NOTICE_BLOCK_DESCRIPTION SYSRES_CONST_NUM_REQUISITE SYSRES_CONST_NUM_STR_REQUISITE_CODE SYSRES_CONST_NUMERATION_AUTO_NOT_STRONG SYSRES_CONST_NUMERATION_AUTO_STRONG SYSRES_CONST_NUMERATION_FROM_DICTONARY SYSRES_CONST_NUMERATION_MANUAL SYSRES_CONST_NUMERIC_TYPE_CHAR SYSRES_CONST_NUMREQ_REQUISITE_CODE SYSRES_CONST_OBSOLETE_VERSION_STATE_PICK_VALUE SYSRES_CONST_OPERATING_RECORD_FLAG_VALUE SYSRES_CONST_OPERATING_RECORD_FLAG_VALUE_CODE SYSRES_CONST_OPERATING_RECORD_FLAG_VALUE_FEMININE SYSRES_CONST_OPERATING_RECORD_FLAG_VALUE_MASCULINE SYSRES_CONST_OPTIONAL_FORM_COMP_REQCODE_PREFIX SYSRES_CONST_ORANGE_LIFE_CYCLE_STAGE_FONT_COLOR SYSRES_CONST_ORIGINALREF_REQUISITE_CODE SYSRES_CONST_OURFIRM_REF_CODE SYSRES_CONST_OURFIRM_REQUISITE_CODE SYSRES_CONST_OURFIRM_VAR SYSRES_CONST_OUTGOING_WORK_RULE_TYPE_CODE SYSRES_CONST_PICK_NEGATIVE_RESULT SYSRES_CONST_PICK_POSITIVE_RESULT SYSRES_CONST_PICK_REQUISITE SYSRES_CONST_PICK_REQUISITE_TYPE SYSRES_CONST_PICK_TYPE_CHAR SYSRES_CONST_PLAN_STATUS_REQUISITE_CODE SYSRES_CONST_PLATFORM_VERSION_COMMENT SYSRES_CONST_PLUGINS_SETTINGS_DESCRIPTION_REQUISITE_CODE SYSRES_CONST_POSITIVE_PICK_VALUE SYSRES_CONST_POWER_TO_CREATE_ACTION_CODE SYSRES_CONST_POWER_TO_SIGN_ACTION_CODE SYSRES_CONST_PRIORITY_REQUISITE_CODE SYSRES_CONST_QUALIFIED_TASK_TYPE SYSRES_CONST_QUALIFIED_TASK_TYPE_CODE SYSRES_CONST_RECSTAT_REQUISITE_CODE SYSRES_CONST_RED_LIFE_CYCLE_STAGE_FONT_COLOR SYSRES_CONST_REF_ID_T_REF_TYPE_REQUISITE_CODE SYSRES_CONST_REF_REQUISITE SYSRES_CONST_REF_REQUISITE_TYPE SYSRES_CONST_REF_REQUISITES_REFERENCE_CODE_SELECTED_REQUISITE SYSRES_CONST_REFERENCE_RECORD_HISTORY_CREATE_ACTION_CODE SYSRES_CONST_REFERENCE_RECORD_HISTORY_DELETE_ACTION_CODE SYSRES_CONST_REFERENCE_RECORD_HISTORY_MODIFY_ACTION_CODE SYSRES_CONST_REFERENCE_TYPE_CHAR SYSRES_CONST_REFERENCE_TYPE_REQUISITE_NAME SYSRES_CONST_REFERENCES_ADD_PARAMS_REQUISITE_CODE SYSRES_CONST_REFERENCES_DISPLAY_REQUISITE_REQUISITE_CODE SYSRES_CONST_REMOTE_SERVER_STATUS_WORKING SYSRES_CONST_REMOTE_SERVER_TYPE_MAIN SYSRES_CONST_REMOTE_SERVER_TYPE_SECONDARY SYSRES_CONST_REMOTE_USER_FLAG_VALUE_CODE SYSRES_CONST_REPORT_APP_EDITOR_INTERNAL SYSRES_CONST_REPORT_BASE_REPORT_ID_REQUISITE_CODE SYSRES_CONST_REPORT_BASE_REPORT_REQUISITE_CODE SYSRES_CONST_REPORT_SCRIPT_REQUISITE_CODE SYSRES_CONST_REPORT_TEMPLATE_REQUISITE_CODE SYSRES_CONST_REPORT_VIEWER_CODE_REQUISITE_CODE SYSRES_CONST_REQ_ALLOW_COMPONENT_DEFAULT_VALUE SYSRES_CONST_REQ_ALLOW_RECORD_DEFAULT_VALUE SYSRES_CONST_REQ_ALLOW_SERVER_COMPONENT_DEFAULT_VALUE SYSRES_CONST_REQ_MODE_AVAILABLE_CODE SYSRES_CONST_REQ_MODE_EDIT_CODE SYSRES_CONST_REQ_MODE_HIDDEN_CODE SYSRES_CONST_REQ_MODE_NOT_AVAILABLE_CODE SYSRES_CONST_REQ_MODE_VIEW_CODE SYSRES_CONST_REQ_NUMBER_REQUISITE_CODE SYSRES_CONST_REQ_SECTION_VALUE SYSRES_CONST_REQ_TYPE_VALUE SYSRES_CONST_REQUISITE_FORMAT_BY_UNIT SYSRES_CONST_REQUISITE_FORMAT_DATE_FULL SYSRES_CONST_REQUISITE_FORMAT_DATE_TIME SYSRES_CONST_REQUISITE_FORMAT_LEFT SYSRES_CONST_REQUISITE_FORMAT_RIGHT SYSRES_CONST_REQUISITE_FORMAT_WITHOUT_UNIT SYSRES_CONST_REQUISITE_NUMBER_REQUISITE_CODE SYSRES_CONST_REQUISITE_SECTION_ACTIONS SYSRES_CONST_REQUISITE_SECTION_BUTTON SYSRES_CONST_REQUISITE_SECTION_BUTTONS SYSRES_CONST_REQUISITE_SECTION_CARD SYSRES_CONST_REQUISITE_SECTION_TABLE SYSRES_CONST_REQUISITE_SECTION_TABLE10 SYSRES_CONST_REQUISITE_SECTION_TABLE11 SYSRES_CONST_REQUISITE_SECTION_TABLE12 SYSRES_CONST_REQUISITE_SECTION_TABLE13 SYSRES_CONST_REQUISITE_SECTION_TABLE14 SYSRES_CONST_REQUISITE_SECTION_TABLE15 SYSRES_CONST_REQUISITE_SECTION_TABLE16 SYSRES_CONST_REQUISITE_SECTION_TABLE17 SYSRES_CONST_REQUISITE_SECTION_TABLE18 SYSRES_CONST_REQUISITE_SECTION_TABLE19 SYSRES_CONST_REQUISITE_SECTION_TABLE2 SYSRES_CONST_REQUISITE_SECTION_TABLE20 SYSRES_CONST_REQUISITE_SECTION_TABLE21 SYSRES_CONST_REQUISITE_SECTION_TABLE22 SYSRES_CONST_REQUISITE_SECTION_TABLE23 SYSRES_CONST_REQUISITE_SECTION_TABLE24 SYSRES_CONST_REQUISITE_SECTION_TABLE3 SYSRES_CONST_REQUISITE_SECTION_TABLE4 SYSRES_CONST_REQUISITE_SECTION_TABLE5 SYSRES_CONST_REQUISITE_SECTION_TABLE6 SYSRES_CONST_REQUISITE_SECTION_TABLE7 SYSRES_CONST_REQUISITE_SECTION_TABLE8 SYSRES_CONST_REQUISITE_SECTION_TABLE9 SYSRES_CONST_REQUISITES_PSEUDOREFERENCE_REQUISITE_NUMBER_REQUISITE_CODE SYSRES_CONST_RIGHT_ALIGNMENT_CODE SYSRES_CONST_ROLES_REFERENCE_CODE SYSRES_CONST_ROUTE_STEP_AFTER_RUS SYSRES_CONST_ROUTE_STEP_AND_CONDITION_RUS SYSRES_CONST_ROUTE_STEP_OR_CONDITION_RUS SYSRES_CONST_ROUTE_TYPE_COMPLEX SYSRES_CONST_ROUTE_TYPE_PARALLEL SYSRES_CONST_ROUTE_TYPE_SERIAL SYSRES_CONST_SBDATASETDESC_NEGATIVE_VALUE SYSRES_CONST_SBDATASETDESC_POSITIVE_VALUE SYSRES_CONST_SBVIEWSDESC_POSITIVE_VALUE SYSRES_CONST_SCRIPT_BLOCK_DESCRIPTION SYSRES_CONST_SEARCH_BY_TEXT_REQUISITE_CODE SYSRES_CONST_SEARCHES_COMPONENT_CONTENT SYSRES_CONST_SEARCHES_CRITERIA_ACTION_NAME SYSRES_CONST_SEARCHES_EDOC_CONTENT SYSRES_CONST_SEARCHES_FOLDER_CONTENT SYSRES_CONST_SEARCHES_JOB_CONTENT SYSRES_CONST_SEARCHES_REFERENCE_CODE SYSRES_CONST_SEARCHES_TASK_CONTENT SYSRES_CONST_SECOND_CHAR SYSRES_CONST_SECTION_REQUISITE_ACTIONS_VALUE SYSRES_CONST_SECTION_REQUISITE_CARD_VALUE SYSRES_CONST_SECTION_REQUISITE_CODE SYSRES_CONST_SECTION_REQUISITE_DETAIL_1_VALUE SYSRES_CONST_SECTION_REQUISITE_DETAIL_2_VALUE SYSRES_CONST_SECTION_REQUISITE_DETAIL_3_VALUE SYSRES_CONST_SECTION_REQUISITE_DETAIL_4_VALUE SYSRES_CONST_SECTION_REQUISITE_DETAIL_5_VALUE SYSRES_CONST_SECTION_REQUISITE_DETAIL_6_VALUE SYSRES_CONST_SELECT_REFERENCE_MODE_NAME SYSRES_CONST_SELECT_TYPE_SELECTABLE SYSRES_CONST_SELECT_TYPE_SELECTABLE_ONLY_CHILD SYSRES_CONST_SELECT_TYPE_SELECTABLE_WITH_CHILD SYSRES_CONST_SELECT_TYPE_UNSLECTABLE SYSRES_CONST_SERVER_TYPE_MAIN SYSRES_CONST_SERVICE_USER_CATEGORY_FIELD_VALUE SYSRES_CONST_SETTINGS_USER_REQUISITE_CODE SYSRES_CONST_SIGNATURE_AND_ENCODE_CERTIFICATE_TYPE_CODE SYSRES_CONST_SIGNATURE_CERTIFICATE_TYPE_CODE SYSRES_CONST_SINGULAR_TITLE_REQUISITE_CODE SYSRES_CONST_SQL_SERVER_AUTHENTIFICATION_FLAG_VALUE_CODE SYSRES_CONST_SQL_SERVER_ENCODE_AUTHENTIFICATION_FLAG_VALUE_CODE SYSRES_CONST_STANDART_ROUTE_REFERENCE_CODE SYSRES_CONST_STANDART_ROUTE_REFERENCE_COMMENT_REQUISITE_CODE SYSRES_CONST_STANDART_ROUTES_GROUPS_REFERENCE_CODE SYSRES_CONST_STATE_REQ_NAME SYSRES_CONST_STATE_REQUISITE_ACTIVE_VALUE SYSRES_CONST_STATE_REQUISITE_CLOSED_VALUE SYSRES_CONST_STATE_REQUISITE_CODE SYSRES_CONST_STATIC_ROLE_TYPE_CODE SYSRES_CONST_STATUS_PLAN_DEFAULT_VALUE SYSRES_CONST_STATUS_VALUE_AUTOCLEANING SYSRES_CONST_STATUS_VALUE_BLUE_SQUARE SYSRES_CONST_STATUS_VALUE_COMPLETE SYSRES_CONST_STATUS_VALUE_GREEN_SQUARE SYSRES_CONST_STATUS_VALUE_ORANGE_SQUARE SYSRES_CONST_STATUS_VALUE_PURPLE_SQUARE SYSRES_CONST_STATUS_VALUE_RED_SQUARE SYSRES_CONST_STATUS_VALUE_SUSPEND SYSRES_CONST_STATUS_VALUE_YELLOW_SQUARE SYSRES_CONST_STDROUTE_SHOW_TO_USERS_REQUISITE_CODE SYSRES_CONST_STORAGE_TYPE_FILE SYSRES_CONST_STORAGE_TYPE_SQL_SERVER SYSRES_CONST_STR_REQUISITE SYSRES_CONST_STRIKEOUT_LIFE_CYCLE_STAGE_DRAW_STYLE SYSRES_CONST_STRING_FORMAT_LEFT_ALIGN_CHAR SYSRES_CONST_STRING_FORMAT_RIGHT_ALIGN_CHAR SYSRES_CONST_STRING_REQUISITE_CODE SYSRES_CONST_STRING_REQUISITE_TYPE SYSRES_CONST_STRING_TYPE_CHAR SYSRES_CONST_SUBSTITUTES_PSEUDOREFERENCE_CODE SYSRES_CONST_SUBTASK_BLOCK_DESCRIPTION SYSRES_CONST_SYSTEM_SETTING_CURRENT_USER_PARAM_VALUE SYSRES_CONST_SYSTEM_SETTING_EMPTY_VALUE_PARAM_VALUE SYSRES_CONST_SYSTEM_VERSION_COMMENT SYSRES_CONST_TASK_ACCESS_TYPE_ALL SYSRES_CONST_TASK_ACCESS_TYPE_ALL_MEMBERS SYSRES_CONST_TASK_ACCESS_TYPE_MANUAL SYSRES_CONST_TASK_ENCODE_TYPE_CERTIFICATION SYSRES_CONST_TASK_ENCODE_TYPE_CERTIFICATION_AND_PASSWORD SYSRES_CONST_TASK_ENCODE_TYPE_NONE SYSRES_CONST_TASK_ENCODE_TYPE_PASSWORD SYSRES_CONST_TASK_ROUTE_ALL_CONDITION SYSRES_CONST_TASK_ROUTE_AND_CONDITION SYSRES_CONST_TASK_ROUTE_OR_CONDITION SYSRES_CONST_TASK_STATE_ABORTED SYSRES_CONST_TASK_STATE_COMPLETE SYSRES_CONST_TASK_STATE_CONTINUED SYSRES_CONST_TASK_STATE_CONTROL SYSRES_CONST_TASK_STATE_INIT SYSRES_CONST_TASK_STATE_WORKING SYSRES_CONST_TASK_TITLE SYSRES_CONST_TASK_TYPES_GROUPS_REFERENCE_CODE SYSRES_CONST_TASK_TYPES_REFERENCE_CODE SYSRES_CONST_TEMPLATES_REFERENCE_CODE SYSRES_CONST_TEST_DATE_REQUISITE_NAME SYSRES_CONST_TEST_DEV_DATABASE_NAME SYSRES_CONST_TEST_DEV_SYSTEM_CODE SYSRES_CONST_TEST_EDMS_DATABASE_NAME SYSRES_CONST_TEST_EDMS_MAIN_CODE SYSRES_CONST_TEST_EDMS_MAIN_DB_NAME SYSRES_CONST_TEST_EDMS_SECOND_CODE SYSRES_CONST_TEST_EDMS_SECOND_DB_NAME SYSRES_CONST_TEST_EDMS_SYSTEM_CODE SYSRES_CONST_TEST_NUMERIC_REQUISITE_NAME SYSRES_CONST_TEXT_REQUISITE SYSRES_CONST_TEXT_REQUISITE_CODE SYSRES_CONST_TEXT_REQUISITE_TYPE SYSRES_CONST_TEXT_TYPE_CHAR SYSRES_CONST_TYPE_CODE_REQUISITE_CODE SYSRES_CONST_TYPE_REQUISITE_CODE SYSRES_CONST_UNDEFINED_LIFE_CYCLE_STAGE_FONT_COLOR SYSRES_CONST_UNITS_SECTION_ID_REQUISITE_CODE SYSRES_CONST_UNITS_SECTION_REQUISITE_CODE SYSRES_CONST_UNOPERATING_RECORD_FLAG_VALUE_CODE SYSRES_CONST_UNSTORED_DATA_REQUISITE_CODE SYSRES_CONST_UNSTORED_DATA_REQUISITE_NAME SYSRES_CONST_USE_ACCESS_TYPE_CODE SYSRES_CONST_USE_ACCESS_TYPE_NAME SYSRES_CONST_USER_ACCOUNT_TYPE_VALUE_CODE SYSRES_CONST_USER_ADDITIONAL_INFORMATION_REQUISITE_CODE SYSRES_CONST_USER_AND_GROUP_ID_FROM_PSEUDOREFERENCE_REQUISITE_CODE SYSRES_CONST_USER_CATEGORY_NORMAL SYSRES_CONST_USER_CERTIFICATE_REQUISITE_CODE SYSRES_CONST_USER_CERTIFICATE_STATE_REQUISITE_CODE SYSRES_CONST_USER_CERTIFICATE_SUBJECT_NAME_REQUISITE_CODE SYSRES_CONST_USER_CERTIFICATE_THUMBPRINT_REQUISITE_CODE SYSRES_CONST_USER_COMMON_CATEGORY SYSRES_CONST_USER_COMMON_CATEGORY_CODE SYSRES_CONST_USER_FULL_NAME_REQUISITE_CODE SYSRES_CONST_USER_GROUP_TYPE_REQUISITE_CODE SYSRES_CONST_USER_LOGIN_REQUISITE_CODE SYSRES_CONST_USER_REMOTE_CONTROLLER_REQUISITE_CODE SYSRES_CONST_USER_REMOTE_SYSTEM_REQUISITE_CODE SYSRES_CONST_USER_RIGHTS_T_REQUISITE_CODE SYSRES_CONST_USER_SERVER_NAME_REQUISITE_CODE SYSRES_CONST_USER_SERVICE_CATEGORY SYSRES_CONST_USER_SERVICE_CATEGORY_CODE SYSRES_CONST_USER_STATUS_ADMINISTRATOR_CODE SYSRES_CONST_USER_STATUS_ADMINISTRATOR_NAME SYSRES_CONST_USER_STATUS_DEVELOPER_CODE SYSRES_CONST_USER_STATUS_DEVELOPER_NAME SYSRES_CONST_USER_STATUS_DISABLED_CODE SYSRES_CONST_USER_STATUS_DISABLED_NAME SYSRES_CONST_USER_STATUS_SYSTEM_DEVELOPER_CODE SYSRES_CONST_USER_STATUS_USER_CODE SYSRES_CONST_USER_STATUS_USER_NAME SYSRES_CONST_USER_STATUS_USER_NAME_DEPRECATED SYSRES_CONST_USER_TYPE_FIELD_VALUE_USER SYSRES_CONST_USER_TYPE_REQUISITE_CODE SYSRES_CONST_USERS_CONTROLLER_REQUISITE_CODE SYSRES_CONST_USERS_IS_MAIN_SERVER_REQUISITE_CODE SYSRES_CONST_USERS_REFERENCE_CODE SYSRES_CONST_USERS_REGISTRATION_CERTIFICATES_ACTION_NAME SYSRES_CONST_USERS_REQUISITE_CODE SYSRES_CONST_USERS_SYSTEM_REQUISITE_CODE SYSRES_CONST_USERS_USER_ACCESS_RIGHTS_TYPR_REQUISITE_CODE SYSRES_CONST_USERS_USER_AUTHENTICATION_REQUISITE_CODE SYSRES_CONST_USERS_USER_COMPONENT_REQUISITE_CODE SYSRES_CONST_USERS_USER_GROUP_REQUISITE_CODE SYSRES_CONST_USERS_VIEW_CERTIFICATES_ACTION_NAME SYSRES_CONST_VIEW_DEFAULT_CODE SYSRES_CONST_VIEW_DEFAULT_NAME SYSRES_CONST_VIEWER_REQUISITE_CODE SYSRES_CONST_WAITING_BLOCK_DESCRIPTION SYSRES_CONST_WIZARD_FORM_LABEL_TEST_STRING  SYSRES_CONST_WIZARD_QUERY_PARAM_HEIGHT_ETALON_STRING SYSRES_CONST_WIZARD_REFERENCE_COMMENT_REQUISITE_CODE SYSRES_CONST_WORK_RULES_DESCRIPTION_REQUISITE_CODE SYSRES_CONST_WORK_TIME_CALENDAR_REFERENCE_CODE SYSRES_CONST_WORK_WORKFLOW_HARD_ROUTE_TYPE_VALUE SYSRES_CONST_WORK_WORKFLOW_HARD_ROUTE_TYPE_VALUE_CODE SYSRES_CONST_WORK_WORKFLOW_HARD_ROUTE_TYPE_VALUE_CODE_RUS SYSRES_CONST_WORK_WORKFLOW_SOFT_ROUTE_TYPE_VALUE_CODE_RUS SYSRES_CONST_WORKFLOW_ROUTE_TYPR_HARD SYSRES_CONST_WORKFLOW_ROUTE_TYPR_SOFT SYSRES_CONST_XML_ENCODING SYSRES_CONST_XREC_STAT_REQUISITE_CODE SYSRES_CONST_XRECID_FIELD_NAME SYSRES_CONST_YES SYSRES_CONST_YES_NO_2_REQUISITE_CODE SYSRES_CONST_YES_NO_REQUISITE_CODE SYSRES_CONST_YES_NO_T_REF_TYPE_REQUISITE_CODE SYSRES_CONST_YES_PICK_VALUE SYSRES_CONST_YES_VALUE CR FALSE nil NO_VALUE NULL TAB TRUE YES_VALUE ADMINISTRATORS_GROUP_NAME CUSTOMIZERS_GROUP_NAME DEVELOPERS_GROUP_NAME SERVICE_USERS_GROUP_NAME DECISION_BLOCK_FIRST_OPERAND_PROPERTY DECISION_BLOCK_NAME_PROPERTY DECISION_BLOCK_OPERATION_PROPERTY DECISION_BLOCK_RESULT_TYPE_PROPERTY DECISION_BLOCK_SECOND_OPERAND_PROPERTY ANY_FILE_EXTENTION COMPRESSED_DOCUMENT_EXTENSION EXTENDED_DOCUMENT_EXTENSION SHORT_COMPRESSED_DOCUMENT_EXTENSION SHORT_EXTENDED_DOCUMENT_EXTENSION JOB_BLOCK_ABORT_DEADLINE_PROPERTY JOB_BLOCK_AFTER_FINISH_EVENT JOB_BLOCK_AFTER_QUERY_PARAMETERS_EVENT JOB_BLOCK_ATTACHMENT_PROPERTY JOB_BLOCK_ATTACHMENTS_RIGHTS_GROUP_PROPERTY JOB_BLOCK_ATTACHMENTS_RIGHTS_TYPE_PROPERTY JOB_BLOCK_BEFORE_QUERY_PARAMETERS_EVENT JOB_BLOCK_BEFORE_START_EVENT JOB_BLOCK_CREATED_JOBS_PROPERTY JOB_BLOCK_DEADLINE_PROPERTY JOB_BLOCK_EXECUTION_RESULTS_PROPERTY JOB_BLOCK_IS_PARALLEL_PROPERTY JOB_BLOCK_IS_RELATIVE_ABORT_DEADLINE_PROPERTY JOB_BLOCK_IS_RELATIVE_DEADLINE_PROPERTY JOB_BLOCK_JOB_TEXT_PROPERTY JOB_BLOCK_NAME_PROPERTY JOB_BLOCK_NEED_SIGN_ON_PERFORM_PROPERTY JOB_BLOCK_PERFORMER_PROPERTY JOB_BLOCK_RELATIVE_ABORT_DEADLINE_TYPE_PROPERTY JOB_BLOCK_RELATIVE_DEADLINE_TYPE_PROPERTY JOB_BLOCK_SUBJECT_PROPERTY ENGLISH_LANGUAGE_CODE RUSSIAN_LANGUAGE_CODE smHidden smMaximized smMinimized smNormal wmNo wmYes COMPONENT_TOKEN_LINK_KIND DOCUMENT_LINK_KIND EDOCUMENT_LINK_KIND FOLDER_LINK_KIND JOB_LINK_KIND REFERENCE_LINK_KIND TASK_LINK_KIND COMPONENT_TOKEN_LOCK_TYPE EDOCUMENT_VERSION_LOCK_TYPE MONITOR_BLOCK_AFTER_FINISH_EVENT MONITOR_BLOCK_BEFORE_START_EVENT MONITOR_BLOCK_DEADLINE_PROPERTY MONITOR_BLOCK_INTERVAL_PROPERTY MONITOR_BLOCK_INTERVAL_TYPE_PROPERTY MONITOR_BLOCK_IS_RELATIVE_DEADLINE_PROPERTY MONITOR_BLOCK_NAME_PROPERTY MONITOR_BLOCK_RELATIVE_DEADLINE_TYPE_PROPERTY MONITOR_BLOCK_SEARCH_SCRIPT_PROPERTY NOTICE_BLOCK_AFTER_FINISH_EVENT NOTICE_BLOCK_ATTACHMENT_PROPERTY NOTICE_BLOCK_ATTACHMENTS_RIGHTS_GROUP_PROPERTY NOTICE_BLOCK_ATTACHMENTS_RIGHTS_TYPE_PROPERTY NOTICE_BLOCK_BEFORE_START_EVENT NOTICE_BLOCK_CREATED_NOTICES_PROPERTY NOTICE_BLOCK_DEADLINE_PROPERTY NOTICE_BLOCK_IS_RELATIVE_DEADLINE_PROPERTY NOTICE_BLOCK_NAME_PROPERTY NOTICE_BLOCK_NOTICE_TEXT_PROPERTY NOTICE_BLOCK_PERFORMER_PROPERTY NOTICE_BLOCK_RELATIVE_DEADLINE_TYPE_PROPERTY NOTICE_BLOCK_SUBJECT_PROPERTY dseAfterCancel dseAfterClose dseAfterDelete dseAfterDeleteOutOfTransaction dseAfterInsert dseAfterOpen dseAfterScroll dseAfterUpdate dseAfterUpdateOutOfTransaction dseBeforeCancel dseBeforeClose dseBeforeDelete dseBeforeDetailUpdate dseBeforeInsert dseBeforeOpen dseBeforeUpdate dseOnAnyRequisiteChange dseOnCloseRecord dseOnDeleteError dseOnOpenRecord dseOnPrepareUpdate dseOnUpdateError dseOnUpdateRatifiedRecord dseOnValidDelete dseOnValidUpdate reOnChange reOnChangeValues SELECTION_BEGIN_ROUTE_EVENT SELECTION_END_ROUTE_EVENT CURRENT_PERIOD_IS_REQUIRED PREVIOUS_CARD_TYPE_NAME SHOW_RECORD_PROPERTIES_FORM ACCESS_RIGHTS_SETTING_DIALOG_CODE ADMINISTRATOR_USER_CODE ANALYTIC_REPORT_TYPE asrtHideLocal asrtHideRemote CALCULATED_ROLE_TYPE_CODE COMPONENTS_REFERENCE_DEVELOPER_VIEW_CODE DCTS_TEST_PROTOCOLS_FOLDER_PATH E_EDOC_VERSION_ALREADY_APPROVINGLY_SIGNED E_EDOC_VERSION_ALREADY_APPROVINGLY_SIGNED_BY_USER E_EDOC_VERSION_ALREDY_SIGNED E_EDOC_VERSION_ALREDY_SIGNED_BY_USER EDOC_TYPES_CODE_REQUISITE_FIELD_NAME EDOCUMENTS_ALIAS_NAME FILES_FOLDER_PATH FILTER_OPERANDS_DELIMITER FILTER_OPERATIONS_DELIMITER FORMCARD_NAME FORMLIST_NAME GET_EXTENDED_DOCUMENT_EXTENSION_CREATION_MODE GET_EXTENDED_DOCUMENT_EXTENSION_IMPORT_MODE INTEGRATED_REPORT_TYPE IS_BUILDER_APPLICATION_ROLE IS_BUILDER_APPLICATION_ROLE2 IS_BUILDER_USERS ISBSYSDEV LOG_FOLDER_PATH mbCancel mbNo mbNoToAll mbOK mbYes mbYesToAll MEMORY_DATASET_DESRIPTIONS_FILENAME mrNo mrNoToAll mrYes mrYesToAll MULTIPLE_SELECT_DIALOG_CODE NONOPERATING_RECORD_FLAG_FEMININE NONOPERATING_RECORD_FLAG_MASCULINE OPERATING_RECORD_FLAG_FEMININE OPERATING_RECORD_FLAG_MASCULINE PROFILING_SETTINGS_COMMON_SETTINGS_CODE_VALUE PROGRAM_INITIATED_LOOKUP_ACTION ratDelete ratEdit ratInsert REPORT_TYPE REQUIRED_PICK_VALUES_VARIABLE rmCard rmList SBRTE_PROGID_DEV SBRTE_PROGID_RELEASE STATIC_ROLE_TYPE_CODE SUPPRESS_EMPTY_TEMPLATE_CREATION SYSTEM_USER_CODE UPDATE_DIALOG_DATASET USED_IN_OBJECT_HINT_PARAM USER_INITIATED_LOOKUP_ACTION USER_NAME_FORMAT USER_SELECTION_RESTRICTIONS WORKFLOW_TEST_PROTOCOLS_FOLDER_PATH ELS_SUBTYPE_CONTROL_NAME ELS_FOLDER_KIND_CONTROL_NAME REPEAT_PROCESS_CURRENT_OBJECT_EXCEPTION_NAME PRIVILEGE_COMPONENT_FULL_ACCESS PRIVILEGE_DEVELOPMENT_EXPORT PRIVILEGE_DEVELOPMENT_IMPORT PRIVILEGE_DOCUMENT_DELETE PRIVILEGE_ESD PRIVILEGE_FOLDER_DELETE PRIVILEGE_MANAGE_ACCESS_RIGHTS PRIVILEGE_MANAGE_REPLICATION PRIVILEGE_MANAGE_SESSION_SERVER PRIVILEGE_OBJECT_FULL_ACCESS PRIVILEGE_OBJECT_VIEW PRIVILEGE_RESERVE_LICENSE PRIVILEGE_SYSTEM_CUSTOMIZE PRIVILEGE_SYSTEM_DEVELOP PRIVILEGE_SYSTEM_INSTALL PRIVILEGE_TASK_DELETE PRIVILEGE_USER_PLUGIN_SETTINGS_CUSTOMIZE PRIVILEGES_PSEUDOREFERENCE_CODE ACCESS_TYPES_PSEUDOREFERENCE_CODE ALL_AVAILABLE_COMPONENTS_PSEUDOREFERENCE_CODE ALL_AVAILABLE_PRIVILEGES_PSEUDOREFERENCE_CODE ALL_REPLICATE_COMPONENTS_PSEUDOREFERENCE_CODE AVAILABLE_DEVELOPERS_COMPONENTS_PSEUDOREFERENCE_CODE COMPONENTS_PSEUDOREFERENCE_CODE FILTRATER_SETTINGS_CONFLICTS_PSEUDOREFERENCE_CODE GROUPS_PSEUDOREFERENCE_CODE RECEIVE_PROTOCOL_PSEUDOREFERENCE_CODE REFERENCE_REQUISITE_PSEUDOREFERENCE_CODE REFERENCE_REQUISITES_PSEUDOREFERENCE_CODE REFTYPES_PSEUDOREFERENCE_CODE REPLICATION_SEANCES_DIARY_PSEUDOREFERENCE_CODE SEND_PROTOCOL_PSEUDOREFERENCE_CODE SUBSTITUTES_PSEUDOREFERENCE_CODE SYSTEM_SETTINGS_PSEUDOREFERENCE_CODE UNITS_PSEUDOREFERENCE_CODE USERS_PSEUDOREFERENCE_CODE VIEWERS_PSEUDOREFERENCE_CODE CERTIFICATE_TYPE_ENCRYPT CERTIFICATE_TYPE_SIGN CERTIFICATE_TYPE_SIGN_AND_ENCRYPT STORAGE_TYPE_FILE STORAGE_TYPE_NAS_CIFS STORAGE_TYPE_SAPERION STORAGE_TYPE_SQL_SERVER COMPTYPE2_REQUISITE_DOCUMENTS_VALUE COMPTYPE2_REQUISITE_TASKS_VALUE COMPTYPE2_REQUISITE_FOLDERS_VALUE COMPTYPE2_REQUISITE_REFERENCES_VALUE SYSREQ_CODE SYSREQ_COMPTYPE2 SYSREQ_CONST_AVAILABLE_FOR_WEB SYSREQ_CONST_COMMON_CODE SYSREQ_CONST_COMMON_VALUE SYSREQ_CONST_FIRM_CODE SYSREQ_CONST_FIRM_STATUS SYSREQ_CONST_FIRM_VALUE SYSREQ_CONST_SERVER_STATUS SYSREQ_CONTENTS SYSREQ_DATE_OPEN SYSREQ_DATE_CLOSE SYSREQ_DESCRIPTION SYSREQ_DESCRIPTION_LOCALIZE_ID SYSREQ_DOUBLE SYSREQ_EDOC_ACCESS_TYPE SYSREQ_EDOC_AUTHOR SYSREQ_EDOC_CREATED SYSREQ_EDOC_DELEGATE_RIGHTS_REQUISITE_CODE SYSREQ_EDOC_EDITOR SYSREQ_EDOC_ENCODE_TYPE SYSREQ_EDOC_ENCRYPTION_PLUGIN_NAME SYSREQ_EDOC_ENCRYPTION_PLUGIN_VERSION SYSREQ_EDOC_EXPORT_DATE SYSREQ_EDOC_EXPORTER SYSREQ_EDOC_KIND SYSREQ_EDOC_LIFE_STAGE_NAME SYSREQ_EDOC_LOCKED_FOR_SERVER_CODE SYSREQ_EDOC_MODIFIED SYSREQ_EDOC_NAME SYSREQ_EDOC_NOTE SYSREQ_EDOC_QUALIFIED_ID SYSREQ_EDOC_SESSION_KEY SYSREQ_EDOC_SESSION_KEY_ENCRYPTION_PLUGIN_NAME SYSREQ_EDOC_SESSION_KEY_ENCRYPTION_PLUGIN_VERSION SYSREQ_EDOC_SIGNATURE_TYPE SYSREQ_EDOC_SIGNED SYSREQ_EDOC_STORAGE SYSREQ_EDOC_STORAGES_ARCHIVE_STORAGE SYSREQ_EDOC_STORAGES_CHECK_RIGHTS SYSREQ_EDOC_STORAGES_COMPUTER_NAME SYSREQ_EDOC_STORAGES_EDIT_IN_STORAGE SYSREQ_EDOC_STORAGES_EXECUTIVE_STORAGE SYSREQ_EDOC_STORAGES_FUNCTION SYSREQ_EDOC_STORAGES_INITIALIZED SYSREQ_EDOC_STORAGES_LOCAL_PATH SYSREQ_EDOC_STORAGES_SAPERION_DATABASE_NAME SYSREQ_EDOC_STORAGES_SEARCH_BY_TEXT SYSREQ_EDOC_STORAGES_SERVER_NAME SYSREQ_EDOC_STORAGES_SHARED_SOURCE_NAME SYSREQ_EDOC_STORAGES_TYPE SYSREQ_EDOC_TEXT_MODIFIED SYSREQ_EDOC_TYPE_ACT_CODE SYSREQ_EDOC_TYPE_ACT_DESCRIPTION SYSREQ_EDOC_TYPE_ACT_DESCRIPTION_LOCALIZE_ID SYSREQ_EDOC_TYPE_ACT_ON_EXECUTE SYSREQ_EDOC_TYPE_ACT_ON_EXECUTE_EXISTS SYSREQ_EDOC_TYPE_ACT_SECTION SYSREQ_EDOC_TYPE_ADD_PARAMS SYSREQ_EDOC_TYPE_COMMENT SYSREQ_EDOC_TYPE_EVENT_TEXT SYSREQ_EDOC_TYPE_NAME_IN_SINGULAR SYSREQ_EDOC_TYPE_NAME_IN_SINGULAR_LOCALIZE_ID SYSREQ_EDOC_TYPE_NAME_LOCALIZE_ID SYSREQ_EDOC_TYPE_NUMERATION_METHOD SYSREQ_EDOC_TYPE_PSEUDO_REQUISITE_CODE SYSREQ_EDOC_TYPE_REQ_CODE SYSREQ_EDOC_TYPE_REQ_DESCRIPTION SYSREQ_EDOC_TYPE_REQ_DESCRIPTION_LOCALIZE_ID SYSREQ_EDOC_TYPE_REQ_IS_LEADING SYSREQ_EDOC_TYPE_REQ_IS_REQUIRED SYSREQ_EDOC_TYPE_REQ_NUMBER SYSREQ_EDOC_TYPE_REQ_ON_CHANGE SYSREQ_EDOC_TYPE_REQ_ON_CHANGE_EXISTS SYSREQ_EDOC_TYPE_REQ_ON_SELECT SYSREQ_EDOC_TYPE_REQ_ON_SELECT_KIND SYSREQ_EDOC_TYPE_REQ_SECTION SYSREQ_EDOC_TYPE_VIEW_CARD SYSREQ_EDOC_TYPE_VIEW_CODE SYSREQ_EDOC_TYPE_VIEW_COMMENT SYSREQ_EDOC_TYPE_VIEW_IS_MAIN SYSREQ_EDOC_TYPE_VIEW_NAME SYSREQ_EDOC_TYPE_VIEW_NAME_LOCALIZE_ID SYSREQ_EDOC_VERSION_AUTHOR SYSREQ_EDOC_VERSION_CRC SYSREQ_EDOC_VERSION_DATA SYSREQ_EDOC_VERSION_EDITOR SYSREQ_EDOC_VERSION_EXPORT_DATE SYSREQ_EDOC_VERSION_EXPORTER SYSREQ_EDOC_VERSION_HIDDEN SYSREQ_EDOC_VERSION_LIFE_STAGE SYSREQ_EDOC_VERSION_MODIFIED SYSREQ_EDOC_VERSION_NOTE SYSREQ_EDOC_VERSION_SIGNATURE_TYPE SYSREQ_EDOC_VERSION_SIGNED SYSREQ_EDOC_VERSION_SIZE SYSREQ_EDOC_VERSION_SOURCE SYSREQ_EDOC_VERSION_TEXT_MODIFIED SYSREQ_EDOCKIND_DEFAULT_VERSION_STATE_CODE SYSREQ_FOLDER_KIND SYSREQ_FUNC_CATEGORY SYSREQ_FUNC_COMMENT SYSREQ_FUNC_GROUP SYSREQ_FUNC_GROUP_COMMENT SYSREQ_FUNC_GROUP_NUMBER SYSREQ_FUNC_HELP SYSREQ_FUNC_PARAM_DEF_VALUE SYSREQ_FUNC_PARAM_IDENT SYSREQ_FUNC_PARAM_NUMBER SYSREQ_FUNC_PARAM_TYPE SYSREQ_FUNC_TEXT SYSREQ_GROUP_CATEGORY SYSREQ_ID SYSREQ_LAST_UPDATE SYSREQ_LEADER_REFERENCE SYSREQ_LINE_NUMBER SYSREQ_MAIN_RECORD_ID SYSREQ_NAME SYSREQ_NAME_LOCALIZE_ID SYSREQ_NOTE SYSREQ_ORIGINAL_RECORD SYSREQ_OUR_FIRM SYSREQ_PROFILING_SETTINGS_BATCH_LOGING SYSREQ_PROFILING_SETTINGS_BATCH_SIZE SYSREQ_PROFILING_SETTINGS_PROFILING_ENABLED SYSREQ_PROFILING_SETTINGS_SQL_PROFILING_ENABLED SYSREQ_PROFILING_SETTINGS_START_LOGGED SYSREQ_RECORD_STATUS SYSREQ_REF_REQ_FIELD_NAME SYSREQ_REF_REQ_FORMAT SYSREQ_REF_REQ_GENERATED SYSREQ_REF_REQ_LENGTH SYSREQ_REF_REQ_PRECISION SYSREQ_REF_REQ_REFERENCE SYSREQ_REF_REQ_SECTION SYSREQ_REF_REQ_STORED SYSREQ_REF_REQ_TOKENS SYSREQ_REF_REQ_TYPE SYSREQ_REF_REQ_VIEW SYSREQ_REF_TYPE_ACT_CODE SYSREQ_REF_TYPE_ACT_DESCRIPTION SYSREQ_REF_TYPE_ACT_DESCRIPTION_LOCALIZE_ID SYSREQ_REF_TYPE_ACT_ON_EXECUTE SYSREQ_REF_TYPE_ACT_ON_EXECUTE_EXISTS SYSREQ_REF_TYPE_ACT_SECTION SYSREQ_REF_TYPE_ADD_PARAMS SYSREQ_REF_TYPE_COMMENT SYSREQ_REF_TYPE_COMMON_SETTINGS SYSREQ_REF_TYPE_DISPLAY_REQUISITE_NAME SYSREQ_REF_TYPE_EVENT_TEXT SYSREQ_REF_TYPE_MAIN_LEADING_REF SYSREQ_REF_TYPE_NAME_IN_SINGULAR SYSREQ_REF_TYPE_NAME_IN_SINGULAR_LOCALIZE_ID SYSREQ_REF_TYPE_NAME_LOCALIZE_ID SYSREQ_REF_TYPE_NUMERATION_METHOD SYSREQ_REF_TYPE_REQ_CODE SYSREQ_REF_TYPE_REQ_DESCRIPTION SYSREQ_REF_TYPE_REQ_DESCRIPTION_LOCALIZE_ID SYSREQ_REF_TYPE_REQ_IS_CONTROL SYSREQ_REF_TYPE_REQ_IS_FILTER SYSREQ_REF_TYPE_REQ_IS_LEADING SYSREQ_REF_TYPE_REQ_IS_REQUIRED SYSREQ_REF_TYPE_REQ_NUMBER SYSREQ_REF_TYPE_REQ_ON_CHANGE SYSREQ_REF_TYPE_REQ_ON_CHANGE_EXISTS SYSREQ_REF_TYPE_REQ_ON_SELECT SYSREQ_REF_TYPE_REQ_ON_SELECT_KIND SYSREQ_REF_TYPE_REQ_SECTION SYSREQ_REF_TYPE_VIEW_CARD SYSREQ_REF_TYPE_VIEW_CODE SYSREQ_REF_TYPE_VIEW_COMMENT SYSREQ_REF_TYPE_VIEW_IS_MAIN SYSREQ_REF_TYPE_VIEW_NAME SYSREQ_REF_TYPE_VIEW_NAME_LOCALIZE_ID SYSREQ_REFERENCE_TYPE_ID SYSREQ_STATE SYSREQ_STAT\u0415 SYSREQ_SYSTEM_SETTINGS_VALUE SYSREQ_TYPE SYSREQ_UNIT SYSREQ_UNIT_ID SYSREQ_USER_GROUPS_GROUP_FULL_NAME SYSREQ_USER_GROUPS_GROUP_NAME SYSREQ_USER_GROUPS_GROUP_SERVER_NAME SYSREQ_USERS_ACCESS_RIGHTS SYSREQ_USERS_AUTHENTICATION SYSREQ_USERS_CATEGORY SYSREQ_USERS_COMPONENT SYSREQ_USERS_COMPONENT_USER_IS_PUBLIC SYSREQ_USERS_DOMAIN SYSREQ_USERS_FULL_USER_NAME SYSREQ_USERS_GROUP SYSREQ_USERS_IS_MAIN_SERVER SYSREQ_USERS_LOGIN SYSREQ_USERS_REFERENCE_USER_IS_PUBLIC SYSREQ_USERS_STATUS SYSREQ_USERS_USER_CERTIFICATE SYSREQ_USERS_USER_CERTIFICATE_INFO SYSREQ_USERS_USER_CERTIFICATE_PLUGIN_NAME SYSREQ_USERS_USER_CERTIFICATE_PLUGIN_VERSION SYSREQ_USERS_USER_CERTIFICATE_STATE SYSREQ_USERS_USER_CERTIFICATE_SUBJECT_NAME SYSREQ_USERS_USER_CERTIFICATE_THUMBPRINT SYSREQ_USERS_USER_DEFAULT_CERTIFICATE SYSREQ_USERS_USER_DESCRIPTION SYSREQ_USERS_USER_GLOBAL_NAME SYSREQ_USERS_USER_LOGIN SYSREQ_USERS_USER_MAIN_SERVER SYSREQ_USERS_USER_TYPE SYSREQ_WORK_RULES_FOLDER_ID RESULT_VAR_NAME RESULT_VAR_NAME_ENG AUTO_NUMERATION_RULE_ID CANT_CHANGE_ID_REQUISITE_RULE_ID CANT_CHANGE_OURFIRM_REQUISITE_RULE_ID CHECK_CHANGING_REFERENCE_RECORD_USE_RULE_ID CHECK_CODE_REQUISITE_RULE_ID CHECK_DELETING_REFERENCE_RECORD_USE_RULE_ID CHECK_FILTRATER_CHANGES_RULE_ID CHECK_RECORD_INTERVAL_RULE_ID CHECK_REFERENCE_INTERVAL_RULE_ID CHECK_REQUIRED_DATA_FULLNESS_RULE_ID CHECK_REQUIRED_REQUISITES_FULLNESS_RULE_ID MAKE_RECORD_UNRATIFIED_RULE_ID RESTORE_AUTO_NUMERATION_RULE_ID SET_FIRM_CONTEXT_FROM_RECORD_RULE_ID SET_FIRST_RECORD_IN_LIST_FORM_RULE_ID SET_IDSPS_VALUE_RULE_ID SET_NEXT_CODE_VALUE_RULE_ID SET_OURFIRM_BOUNDS_RULE_ID SET_OURFIRM_REQUISITE_RULE_ID SCRIPT_BLOCK_AFTER_FINISH_EVENT SCRIPT_BLOCK_BEFORE_START_EVENT SCRIPT_BLOCK_EXECUTION_RESULTS_PROPERTY SCRIPT_BLOCK_NAME_PROPERTY SCRIPT_BLOCK_SCRIPT_PROPERTY SUBTASK_BLOCK_ABORT_DEADLINE_PROPERTY SUBTASK_BLOCK_AFTER_FINISH_EVENT SUBTASK_BLOCK_ASSIGN_PARAMS_EVENT SUBTASK_BLOCK_ATTACHMENTS_PROPERTY SUBTASK_BLOCK_ATTACHMENTS_RIGHTS_GROUP_PROPERTY SUBTASK_BLOCK_ATTACHMENTS_RIGHTS_TYPE_PROPERTY SUBTASK_BLOCK_BEFORE_START_EVENT SUBTASK_BLOCK_CREATED_TASK_PROPERTY SUBTASK_BLOCK_CREATION_EVENT SUBTASK_BLOCK_DEADLINE_PROPERTY SUBTASK_BLOCK_IMPORTANCE_PROPERTY SUBTASK_BLOCK_INITIATOR_PROPERTY SUBTASK_BLOCK_IS_RELATIVE_ABORT_DEADLINE_PROPERTY SUBTASK_BLOCK_IS_RELATIVE_DEADLINE_PROPERTY SUBTASK_BLOCK_JOBS_TYPE_PROPERTY SUBTASK_BLOCK_NAME_PROPERTY SUBTASK_BLOCK_PARALLEL_ROUTE_PROPERTY SUBTASK_BLOCK_PERFORMERS_PROPERTY SUBTASK_BLOCK_RELATIVE_ABORT_DEADLINE_TYPE_PROPERTY SUBTASK_BLOCK_RELATIVE_DEADLINE_TYPE_PROPERTY SUBTASK_BLOCK_REQUIRE_SIGN_PROPERTY SUBTASK_BLOCK_STANDARD_ROUTE_PROPERTY SUBTASK_BLOCK_START_EVENT SUBTASK_BLOCK_STEP_CONTROL_PROPERTY SUBTASK_BLOCK_SUBJECT_PROPERTY SUBTASK_BLOCK_TASK_CONTROL_PROPERTY SUBTASK_BLOCK_TEXT_PROPERTY SUBTASK_BLOCK_UNLOCK_ATTACHMENTS_ON_STOP_PROPERTY SUBTASK_BLOCK_USE_STANDARD_ROUTE_PROPERTY SUBTASK_BLOCK_WAIT_FOR_TASK_COMPLETE_PROPERTY SYSCOMP_CONTROL_JOBS SYSCOMP_FOLDERS SYSCOMP_JOBS SYSCOMP_NOTICES SYSCOMP_TASKS SYSDLG_CREATE_EDOCUMENT SYSDLG_CREATE_EDOCUMENT_VERSION SYSDLG_CURRENT_PERIOD SYSDLG_EDIT_FUNCTION_HELP SYSDLG_EDOCUMENT_KINDS_FOR_TEMPLATE SYSDLG_EXPORT_MULTIPLE_EDOCUMENTS SYSDLG_EXPORT_SINGLE_EDOCUMENT SYSDLG_IMPORT_EDOCUMENT SYSDLG_MULTIPLE_SELECT SYSDLG_SETUP_ACCESS_RIGHTS SYSDLG_SETUP_DEFAULT_RIGHTS SYSDLG_SETUP_FILTER_CONDITION SYSDLG_SETUP_SIGN_RIGHTS SYSDLG_SETUP_TASK_OBSERVERS SYSDLG_SETUP_TASK_ROUTE SYSDLG_SETUP_USERS_LIST SYSDLG_SIGN_EDOCUMENT SYSDLG_SIGN_MULTIPLE_EDOCUMENTS SYSREF_ACCESS_RIGHTS_TYPES SYSREF_ADMINISTRATION_HISTORY SYSREF_ALL_AVAILABLE_COMPONENTS SYSREF_ALL_AVAILABLE_PRIVILEGES SYSREF_ALL_REPLICATING_COMPONENTS SYSREF_AVAILABLE_DEVELOPERS_COMPONENTS SYSREF_CALENDAR_EVENTS SYSREF_COMPONENT_TOKEN_HISTORY SYSREF_COMPONENT_TOKENS SYSREF_COMPONENTS SYSREF_CONSTANTS SYSREF_DATA_RECEIVE_PROTOCOL SYSREF_DATA_SEND_PROTOCOL SYSREF_DIALOGS SYSREF_DIALOGS_REQUISITES SYSREF_EDITORS SYSREF_EDOC_CARDS SYSREF_EDOC_TYPES SYSREF_EDOCUMENT_CARD_REQUISITES SYSREF_EDOCUMENT_CARD_TYPES SYSREF_EDOCUMENT_CARD_TYPES_REFERENCE SYSREF_EDOCUMENT_CARDS SYSREF_EDOCUMENT_HISTORY SYSREF_EDOCUMENT_KINDS SYSREF_EDOCUMENT_REQUISITES SYSREF_EDOCUMENT_SIGNATURES SYSREF_EDOCUMENT_TEMPLATES SYSREF_EDOCUMENT_TEXT_STORAGES SYSREF_EDOCUMENT_VIEWS SYSREF_FILTERER_SETUP_CONFLICTS SYSREF_FILTRATER_SETTING_CONFLICTS SYSREF_FOLDER_HISTORY SYSREF_FOLDERS SYSREF_FUNCTION_GROUPS SYSREF_FUNCTION_PARAMS SYSREF_FUNCTIONS SYSREF_JOB_HISTORY SYSREF_LINKS SYSREF_LOCALIZATION_DICTIONARY SYSREF_LOCALIZATION_LANGUAGES SYSREF_MODULES SYSREF_PRIVILEGES SYSREF_RECORD_HISTORY SYSREF_REFERENCE_REQUISITES SYSREF_REFERENCE_TYPE_VIEWS SYSREF_REFERENCE_TYPES SYSREF_REFERENCES SYSREF_REFERENCES_REQUISITES SYSREF_REMOTE_SERVERS SYSREF_REPLICATION_SESSIONS_LOG SYSREF_REPLICATION_SESSIONS_PROTOCOL SYSREF_REPORTS SYSREF_ROLES SYSREF_ROUTE_BLOCK_GROUPS SYSREF_ROUTE_BLOCKS SYSREF_SCRIPTS SYSREF_SEARCHES SYSREF_SERVER_EVENTS SYSREF_SERVER_EVENTS_HISTORY SYSREF_STANDARD_ROUTE_GROUPS SYSREF_STANDARD_ROUTES SYSREF_STATUSES SYSREF_SYSTEM_SETTINGS SYSREF_TASK_HISTORY SYSREF_TASK_KIND_GROUPS SYSREF_TASK_KINDS SYSREF_TASK_RIGHTS SYSREF_TASK_SIGNATURES SYSREF_TASKS SYSREF_UNITS SYSREF_USER_GROUPS SYSREF_USER_GROUPS_REFERENCE SYSREF_USER_SUBSTITUTION SYSREF_USERS SYSREF_USERS_REFERENCE SYSREF_VIEWERS SYSREF_WORKING_TIME_CALENDARS ACCESS_RIGHTS_TABLE_NAME EDMS_ACCESS_TABLE_NAME EDOC_TYPES_TABLE_NAME TEST_DEV_DB_NAME TEST_DEV_SYSTEM_CODE TEST_EDMS_DB_NAME TEST_EDMS_MAIN_CODE TEST_EDMS_MAIN_DB_NAME TEST_EDMS_SECOND_CODE TEST_EDMS_SECOND_DB_NAME TEST_EDMS_SYSTEM_CODE TEST_ISB5_MAIN_CODE TEST_ISB5_SECOND_CODE TEST_SQL_SERVER_2005_NAME TEST_SQL_SERVER_NAME ATTENTION_CAPTION cbsCommandLinks cbsDefault CONFIRMATION_CAPTION ERROR_CAPTION INFORMATION_CAPTION mrCancel mrOk EDOC_VERSION_ACTIVE_STAGE_CODE EDOC_VERSION_DESIGN_STAGE_CODE EDOC_VERSION_OBSOLETE_STAGE_CODE cpDataEnciphermentEnabled cpDigitalSignatureEnabled cpID cpIssuer cpPluginVersion cpSerial cpSubjectName cpSubjSimpleName cpValidFromDate cpValidToDate ISBL_SYNTAX NO_SYNTAX XML_SYNTAX WAIT_BLOCK_AFTER_FINISH_EVENT WAIT_BLOCK_BEFORE_START_EVENT WAIT_BLOCK_DEADLINE_PROPERTY WAIT_BLOCK_IS_RELATIVE_DEADLINE_PROPERTY WAIT_BLOCK_NAME_PROPERTY WAIT_BLOCK_RELATIVE_DEADLINE_TYPE_PROPERTY SYSRES_COMMON SYSRES_CONST SYSRES_MBFUNC SYSRES_SBDATA SYSRES_SBGUI SYSRES_SBINTF SYSRES_SBREFDSC SYSRES_SQLERRORS SYSRES_SYSCOMP atUser atGroup atRole aemEnabledAlways aemDisabledAlways aemEnabledOnBrowse aemEnabledOnEdit aemDisabledOnBrowseEmpty apBegin apEnd alLeft alRight asmNever asmNoButCustomize asmAsLastTime asmYesButCustomize asmAlways cirCommon cirRevoked ctSignature ctEncode ctSignatureEncode clbUnchecked clbChecked clbGrayed ceISB ceAlways ceNever ctDocument ctReference ctScript ctUnknown ctReport ctDialog ctFunction ctFolder ctEDocument ctTask ctJob ctNotice ctControlJob cfInternal cfDisplay ciUnspecified ciWrite ciRead ckFolder ckEDocument ckTask ckJob ckComponentToken ckAny ckReference ckScript ckReport ckDialog ctISBLEditor ctBevel ctButton ctCheckListBox ctComboBox ctComboEdit ctGrid ctDBCheckBox ctDBComboBox ctDBEdit ctDBEllipsis ctDBMemo ctDBNavigator ctDBRadioGroup ctDBStatusLabel ctEdit ctGroupBox ctInplaceHint ctMemo ctPanel ctListBox ctRadioButton ctRichEdit ctTabSheet ctWebBrowser ctImage ctHyperLink ctLabel ctDBMultiEllipsis ctRibbon ctRichView ctInnerPanel ctPanelGroup ctBitButton cctDate cctInteger cctNumeric cctPick cctReference cctString cctText cltInternal cltPrimary cltGUI dseBeforeOpen dseAfterOpen dseBeforeClose dseAfterClose dseOnValidDelete dseBeforeDelete dseAfterDelete dseAfterDeleteOutOfTransaction dseOnDeleteError dseBeforeInsert dseAfterInsert dseOnValidUpdate dseBeforeUpdate dseOnUpdateRatifiedRecord dseAfterUpdate dseAfterUpdateOutOfTransaction dseOnUpdateError dseAfterScroll dseOnOpenRecord dseOnCloseRecord dseBeforeCancel dseAfterCancel dseOnUpdateDeadlockError dseBeforeDetailUpdate dseOnPrepareUpdate dseOnAnyRequisiteChange dssEdit dssInsert dssBrowse dssInActive dftDate dftShortDate dftDateTime dftTimeStamp dotDays dotHours dotMinutes dotSeconds dtkndLocal dtkndUTC arNone arView arEdit arFull ddaView ddaEdit emLock emEdit emSign emExportWithLock emImportWithUnlock emChangeVersionNote emOpenForModify emChangeLifeStage emDelete emCreateVersion emImport emUnlockExportedWithLock emStart emAbort emReInit emMarkAsReaded emMarkAsUnreaded emPerform emAccept emResume emChangeRights emEditRoute emEditObserver emRecoveryFromLocalCopy emChangeWorkAccessType emChangeEncodeTypeToCertificate emChangeEncodeTypeToPassword emChangeEncodeTypeToNone emChangeEncodeTypeToCertificatePassword emChangeStandardRoute emGetText emOpenForView emMoveToStorage emCreateObject emChangeVersionHidden emDeleteVersion emChangeLifeCycleStage emApprovingSign emExport emContinue emLockFromEdit emUnLockForEdit emLockForServer emUnlockFromServer emDelegateAccessRights emReEncode ecotFile ecotProcess eaGet eaCopy eaCreate eaCreateStandardRoute edltAll edltNothing edltQuery essmText essmCard esvtLast esvtLastActive esvtSpecified edsfExecutive edsfArchive edstSQLServer edstFile edvstNone edvstEDocumentVersionCopy edvstFile edvstTemplate edvstScannedFile vsDefault vsDesign vsActive vsObsolete etNone etCertificate etPassword etCertificatePassword ecException ecWarning ecInformation estAll estApprovingOnly evtLast evtLastActive evtQuery fdtString fdtNumeric fdtInteger fdtDate fdtText fdtUnknown fdtWideString fdtLargeInteger ftInbox ftOutbox ftFavorites ftCommonFolder ftUserFolder ftComponents ftQuickLaunch ftShortcuts ftSearch grhAuto grhX1 grhX2 grhX3 hltText hltRTF hltHTML iffBMP iffJPEG iffMultiPageTIFF iffSinglePageTIFF iffTIFF iffPNG im8bGrayscale im24bRGB im1bMonochrome itBMP itJPEG itWMF itPNG ikhInformation ikhWarning ikhError ikhNoIcon icUnknown icScript icFunction icIntegratedReport icAnalyticReport icDataSetEventHandler icActionHandler icFormEventHandler icLookUpEventHandler icRequisiteChangeEventHandler icBeforeSearchEventHandler icRoleCalculation icSelectRouteEventHandler icBlockPropertyCalculation icBlockQueryParamsEventHandler icChangeSearchResultEventHandler icBlockEventHandler icSubTaskInitEventHandler icEDocDataSetEventHandler icEDocLookUpEventHandler icEDocActionHandler icEDocFormEventHandler icEDocRequisiteChangeEventHandler icStructuredConversionRule icStructuredConversionEventBefore icStructuredConversionEventAfter icWizardEventHandler icWizardFinishEventHandler icWizardStepEventHandler icWizardStepFinishEventHandler icWizardActionEnableEventHandler icWizardActionExecuteEventHandler icCreateJobsHandler icCreateNoticesHandler icBeforeLookUpEventHandler icAfterLookUpEventHandler icTaskAbortEventHandler icWorkflowBlockActionHandler icDialogDataSetEventHandler icDialogActionHandler icDialogLookUpEventHandler icDialogRequisiteChangeEventHandler icDialogFormEventHandler icDialogValidCloseEventHandler icBlockFormEventHandler icTaskFormEventHandler icReferenceMethod icEDocMethod icDialogMethod icProcessMessageHandler isShow isHide isByUserSettings jkJob jkNotice jkControlJob jtInner jtLeft jtRight jtFull jtCross lbpAbove lbpBelow lbpLeft lbpRight eltPerConnection eltPerUser sfcUndefined sfcBlack sfcGreen sfcRed sfcBlue sfcOrange sfcLilac sfsItalic sfsStrikeout sfsNormal ldctStandardRoute ldctWizard ldctScript ldctFunction ldctRouteBlock ldctIntegratedReport ldctAnalyticReport ldctReferenceType ldctEDocumentType ldctDialog ldctServerEvents mrcrtNone mrcrtUser mrcrtMaximal mrcrtCustom vtEqual vtGreaterOrEqual vtLessOrEqual vtRange rdYesterday rdToday rdTomorrow rdThisWeek rdThisMonth rdThisYear rdNextMonth rdNextWeek rdLastWeek rdLastMonth rdWindow rdFile rdPrinter rdtString rdtNumeric rdtInteger rdtDate rdtReference rdtAccount rdtText rdtPick rdtUnknown rdtLargeInteger rdtDocument reOnChange reOnChangeValues ttGlobal ttLocal ttUser ttSystem ssmBrowse ssmSelect ssmMultiSelect ssmBrowseModal smSelect smLike smCard stNone stAuthenticating stApproving sctString sctStream sstAnsiSort sstNaturalSort svtEqual svtContain soatString soatNumeric soatInteger soatDatetime soatReferenceRecord soatText soatPick soatBoolean soatEDocument soatAccount soatIntegerCollection soatNumericCollection soatStringCollection soatPickCollection soatDatetimeCollection soatBooleanCollection soatReferenceRecordCollection soatEDocumentCollection soatAccountCollection soatContents soatUnknown tarAbortByUser tarAbortByWorkflowException tvtAllWords tvtExactPhrase tvtAnyWord usNone usCompleted usRedSquare usBlueSquare usYellowSquare usGreenSquare usOrangeSquare usPurpleSquare usFollowUp utUnknown utUser utDeveloper utAdministrator utSystemDeveloper utDisconnected btAnd btDetailAnd btOr btNotOr btOnly vmView vmSelect vmNavigation vsmSingle vsmMultiple vsmMultipleCheck vsmNoSelection wfatPrevious wfatNext wfatCancel wfatFinish wfepUndefined wfepText3 wfepText6 wfepText9 wfepSpinEdit wfepDropDown wfepRadioGroup wfepFlag wfepText12 wfepText15 wfepText18 wfepText21 wfepText24 wfepText27 wfepText30 wfepRadioGroupColumn1 wfepRadioGroupColumn2 wfepRadioGroupColumn3 wfetQueryParameter wfetText wfetDelimiter wfetLabel wptString wptInteger wptNumeric wptBoolean wptDateTime wptPick wptText wptUser wptUserList wptEDocumentInfo wptEDocumentInfoList wptReferenceRecordInfo wptReferenceRecordInfoList wptFolderInfo wptTaskInfo wptContents wptFileName wptDate wsrComplete wsrGoNext wsrGoPrevious wsrCustom wsrCancel wsrGoFinal wstForm wstEDocument wstTaskCard wstReferenceRecordCard wstFinal waAll waPerformers waManual wsbStart wsbFinish wsbNotice wsbStep wsbDecision wsbWait wsbMonitor wsbScript wsbConnector wsbSubTask wsbLifeCycleStage wsbPause wdtInteger wdtFloat wdtString wdtPick wdtDateTime wdtBoolean wdtTask wdtJob wdtFolder wdtEDocument wdtReferenceRecord wdtUser wdtGroup wdtRole wdtIntegerCollection wdtFloatCollection wdtStringCollection wdtPickCollection wdtDateTimeCollection wdtBooleanCollection wdtTaskCollection wdtJobCollection wdtFolderCollection wdtEDocumentCollection wdtReferenceRecordCollection wdtUserCollection wdtGroupCollection wdtRoleCollection wdtContents wdtUserList wdtSearchDescription wdtDeadLine wdtPickSet wdtAccountCollection wiLow wiNormal wiHigh wrtSoft wrtHard wsInit wsRunning wsDone wsControlled wsAborted wsContinued wtmFull wtmFromCurrent wtmOnlyCurrent ",
+class:"AltState Application CallType ComponentTokens CreatedJobs CreatedNotices ControlState DialogResult Dialogs EDocuments EDocumentVersionSource Folders GlobalIDs Job Jobs InputValue LookUpReference LookUpRequisiteNames LookUpSearch Object ParentComponent Processes References Requisite ReportName Reports Result Scripts Searches SelectedAttachments SelectedItems SelectMode Sender ServerEvents ServiceFactory ShiftState SubTask SystemDialogs Tasks Wizard Wizards Work \u0412\u044b\u0437\u043e\u0432\u0421\u043f\u043e\u0441\u043e\u0431 \u0418\u043c\u044f\u041e\u0442\u0447\u0435\u0442\u0430 \u0420\u0435\u043a\u0432\u0417\u043d\u0430\u0447 ",
+literal:"null true false nil "};a={begin:"\\.\\s*"+a.UNDERSCORE_IDENT_RE,keywords:f,relevance:0};var g={className:"type",begin:":[ \\t]*("+"IApplication IAccessRights IAccountRepository IAccountSelectionRestrictions IAction IActionList IAdministrationHistoryDescription IAnchors IApplication IArchiveInfo IAttachment IAttachmentList ICheckListBox ICheckPointedList IColumn IComponent IComponentDescription IComponentToken IComponentTokenFactory IComponentTokenInfo ICompRecordInfo IConnection IContents IControl IControlJob IControlJobInfo IControlList ICrypto ICrypto2 ICustomJob ICustomJobInfo ICustomListBox ICustomObjectWizardStep ICustomWork ICustomWorkInfo IDataSet IDataSetAccessInfo IDataSigner IDateCriterion IDateRequisite IDateRequisiteDescription IDateValue IDeaAccessRights IDeaObjectInfo IDevelopmentComponentLock IDialog IDialogFactory IDialogPickRequisiteItems IDialogsFactory IDICSFactory IDocRequisite IDocumentInfo IDualListDialog IECertificate IECertificateInfo IECertificates IEditControl IEditorForm IEdmsExplorer IEdmsObject IEdmsObjectDescription IEdmsObjectFactory IEdmsObjectInfo IEDocument IEDocumentAccessRights IEDocumentDescription IEDocumentEditor IEDocumentFactory IEDocumentInfo IEDocumentStorage IEDocumentVersion IEDocumentVersionListDialog IEDocumentVersionSource IEDocumentWizardStep IEDocVerSignature IEDocVersionState IEnabledMode IEncodeProvider IEncrypter IEvent IEventList IException IExternalEvents IExternalHandler IFactory IField IFileDialog IFolder IFolderDescription IFolderDialog IFolderFactory IFolderInfo IForEach IForm IFormTitle IFormWizardStep IGlobalIDFactory IGlobalIDInfo IGrid IHasher IHistoryDescription IHyperLinkControl IImageButton IImageControl IInnerPanel IInplaceHint IIntegerCriterion IIntegerList IIntegerRequisite IIntegerValue IISBLEditorForm IJob IJobDescription IJobFactory IJobForm IJobInfo ILabelControl ILargeIntegerCriterion ILargeIntegerRequisite ILargeIntegerValue ILicenseInfo ILifeCycleStage IList IListBox ILocalIDInfo ILocalization ILock IMemoryDataSet IMessagingFactory IMetadataRepository INotice INoticeInfo INumericCriterion INumericRequisite INumericValue IObject IObjectDescription IObjectImporter IObjectInfo IObserver IPanelGroup IPickCriterion IPickProperty IPickRequisite IPickRequisiteDescription IPickRequisiteItem IPickRequisiteItems IPickValue IPrivilege IPrivilegeList IProcess IProcessFactory IProcessMessage IProgress IProperty IPropertyChangeEvent IQuery IReference IReferenceCriterion IReferenceEnabledMode IReferenceFactory IReferenceHistoryDescription IReferenceInfo IReferenceRecordCardWizardStep IReferenceRequisiteDescription IReferencesFactory IReferenceValue IRefRequisite IReport IReportFactory IRequisite IRequisiteDescription IRequisiteDescriptionList IRequisiteFactory IRichEdit IRouteStep IRule IRuleList ISchemeBlock IScript IScriptFactory ISearchCriteria ISearchCriterion ISearchDescription ISearchFactory ISearchFolderInfo ISearchForObjectDescription ISearchResultRestrictions ISecuredContext ISelectDialog IServerEvent IServerEventFactory IServiceDialog IServiceFactory ISignature ISignProvider ISignProvider2 ISignProvider3 ISimpleCriterion IStringCriterion IStringList IStringRequisite IStringRequisiteDescription IStringValue ISystemDialogsFactory ISystemInfo ITabSheet ITask ITaskAbortReasonInfo ITaskCardWizardStep ITaskDescription ITaskFactory ITaskInfo ITaskRoute ITextCriterion ITextRequisite ITextValue ITreeListSelectDialog IUser IUserList IValue IView IWebBrowserControl IWizard IWizardAction IWizardFactory IWizardFormElement IWizardParam IWizardPickParam IWizardReferenceParam IWizardStep IWorkAccessRights IWorkDescription IWorkflowAskableParam IWorkflowAskableParams IWorkflowBlock IWorkflowBlockResult IWorkflowEnabledMode IWorkflowParam IWorkflowPickParam IWorkflowReferenceParam IWorkState IWorkTreeCustomNode IWorkTreeJobNode IWorkTreeTaskNode IXMLEditorForm SBCrypto".replace(/\s/g,
+"|")+")",end:"[ \\t]*=",excludeEnd:!0},k={className:"variable",lexemes:"[A-Za-z\u0410-\u042f\u0430-\u044f\u0451\u0401_!][A-Za-z\u0410-\u042f\u0430-\u044f\u0451\u0401_0-9]*",keywords:f,begin:"[A-Za-z\u0410-\u042f\u0430-\u044f\u0451\u0401_!][A-Za-z\u0410-\u042f\u0430-\u044f\u0451\u0401_0-9]*",relevance:0,containts:[g,a]};return{aliases:["isbl"],case_insensitive:!0,lexemes:"[A-Za-z\u0410-\u042f\u0430-\u044f\u0451\u0401_!][A-Za-z\u0410-\u042f\u0430-\u044f\u0451\u0401_0-9]*",keywords:f,illegal:"\\$|\\?|%|,|;$|~|#|@|</",
+contains:[{className:"function",begin:"[A-Za-z\u0410-\u042f\u0430-\u044f\u0451\u0401_][A-Za-z\u0410-\u042f\u0430-\u044f\u0451\u0401_0-9]*\\(",end:"\\)$",returnBegin:!0,lexemes:"[A-Za-z\u0410-\u042f\u0430-\u044f\u0451\u0401_!][A-Za-z\u0410-\u042f\u0430-\u044f\u0451\u0401_0-9]*",keywords:f,illegal:"[\\[\\]\\|\\$\\?%,~#@]",contains:[{className:"title",lexemes:"[A-Za-z\u0410-\u042f\u0430-\u044f\u0451\u0401_!][A-Za-z\u0410-\u042f\u0430-\u044f\u0451\u0401_0-9]*",keywords:{built_in:"AddSubString AdjustLineBreaks AmountInWords Analysis ArrayDimCount ArrayHighBound ArrayLowBound ArrayOf ArrayReDim Assert Assigned BeginOfMonth BeginOfPeriod BuildProfilingOperationAnalysis CallProcedure CanReadFile CArrayElement CDataSetRequisite ChangeDate ChangeReferenceDataset Char CharPos CheckParam CheckParamValue CompareStrings ConstantExists ControlState ConvertDateStr Copy CopyFile CreateArray CreateCachedReference CreateConnection CreateDialog CreateDualListDialog CreateEditor CreateException CreateFile CreateFolderDialog CreateInputDialog CreateLinkFile CreateList CreateLock CreateMemoryDataSet CreateObject CreateOpenDialog CreateProgress CreateQuery CreateReference CreateReport CreateSaveDialog CreateScript CreateSQLPivotFunction CreateStringList CreateTreeListSelectDialog CSelectSQL CSQL CSubString CurrentUserID CurrentUserName CurrentVersion DataSetLocateEx DateDiff DateTimeDiff DateToStr DayOfWeek DeleteFile DirectoryExists DisableCheckAccessRights DisableCheckFullShowingRestriction DisableMassTaskSendingRestrictions DropTable DupeString EditText EnableCheckAccessRights EnableCheckFullShowingRestriction EnableMassTaskSendingRestrictions EndOfMonth EndOfPeriod ExceptionExists ExceptionsOff ExceptionsOn Execute ExecuteProcess Exit ExpandEnvironmentVariables ExtractFileDrive ExtractFileExt ExtractFileName ExtractFilePath ExtractParams FileExists FileSize FindFile FindSubString FirmContext ForceDirectories Format FormatDate FormatNumeric FormatSQLDate FormatString FreeException GetComponent GetComponentLaunchParam GetConstant GetLastException GetReferenceRecord GetRefTypeByRefID GetTableID GetTempFolder IfThen In IndexOf InputDialog InputDialogEx InteractiveMode IsFileLocked IsGraphicFile IsNumeric Length LoadString LoadStringFmt LocalTimeToUTC LowerCase Max MessageBox MessageBoxEx MimeDecodeBinary MimeDecodeString MimeEncodeBinary MimeEncodeString Min MoneyInWords MoveFile NewID Now OpenFile Ord Precision Raise ReadCertificateFromFile ReadFile ReferenceCodeByID ReferenceNumber ReferenceRequisiteMode ReferenceRequisiteValue RegionDateSettings RegionNumberSettings RegionTimeSettings RegRead RegWrite RenameFile Replace Round SelectServerCode SelectSQL ServerDateTime SetConstant SetManagedFolderFieldsState ShowConstantsInputDialog ShowMessage Sleep Split SQL SQL2XLSTAB SQLProfilingSendReport StrToDate SubString SubStringCount SystemSetting Time TimeDiff Today Transliterate Trim UpperCase UserStatus UTCToLocalTime ValidateXML VarIsClear VarIsEmpty VarIsNull WorkTimeDiff WriteFile WriteFileEx WriteObjectHistory \u0410\u043d\u0430\u043b\u0438\u0437 \u0411\u0430\u0437\u0430\u0414\u0430\u043d\u043d\u044b\u0445 \u0411\u043b\u043e\u043a\u0415\u0441\u0442\u044c \u0411\u043b\u043e\u043a\u0415\u0441\u0442\u044c\u0420\u0430\u0441\u0448 \u0411\u043b\u043e\u043a\u0418\u043d\u0444\u043e \u0411\u043b\u043e\u043a\u0421\u043d\u044f\u0442\u044c \u0411\u043b\u043e\u043a\u0421\u043d\u044f\u0442\u044c\u0420\u0430\u0441\u0448 \u0411\u043b\u043e\u043a\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0412\u0432\u043e\u0434 \u0412\u0432\u043e\u0434\u041c\u0435\u043d\u044e \u0412\u0435\u0434\u0421 \u0412\u0435\u0434\u0421\u043f\u0440 \u0412\u0435\u0440\u0445\u043d\u044f\u044f\u0413\u0440\u0430\u043d\u0438\u0446\u0430\u041c\u0430\u0441\u0441\u0438\u0432\u0430 \u0412\u043d\u0435\u0448\u041f\u0440\u043e\u0433\u0440 \u0412\u043e\u0441\u0441\u0442 \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f\u041f\u0430\u043f\u043a\u0430 \u0412\u0440\u0435\u043c\u044f \u0412\u044b\u0431\u043e\u0440SQL \u0412\u044b\u0431\u0440\u0430\u0442\u044c\u0417\u0430\u043f\u0438\u0441\u044c \u0412\u044b\u0434\u0435\u043b\u0438\u0442\u044c\u0421\u0442\u0440 \u0412\u044b\u0437\u0432\u0430\u0442\u044c \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0412\u044b\u043f\u041f\u0440\u043e\u0433\u0440 \u0413\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439\u0424\u0430\u0439\u043b \u0413\u0440\u0443\u043f\u043f\u0430\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0414\u0430\u0442\u0430\u0412\u0440\u0435\u043c\u044f\u0421\u0435\u0440\u0432 \u0414\u0435\u043d\u044c\u041d\u0435\u0434\u0435\u043b\u0438 \u0414\u0438\u0430\u043b\u043e\u0433\u0414\u0430\u041d\u0435\u0442 \u0414\u043b\u0438\u043d\u0430\u0421\u0442\u0440 \u0414\u043e\u0431\u041f\u043e\u0434\u0441\u0442\u0440 \u0415\u041f\u0443\u0441\u0442\u043e \u0415\u0441\u043b\u0438\u0422\u043e \u0415\u0427\u0438\u0441\u043b\u043e \u0417\u0430\u043c\u041f\u043e\u0434\u0441\u0442\u0440 \u0417\u0430\u043f\u0438\u0441\u044c\u0421\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0430 \u0417\u043d\u0430\u0447\u041f\u043e\u043b\u044f\u0421\u043f\u0440 \u0418\u0414\u0422\u0438\u043f\u0421\u043f\u0440 \u0418\u0437\u0432\u043b\u0435\u0447\u044c\u0414\u0438\u0441\u043a \u0418\u0437\u0432\u043b\u0435\u0447\u044c\u0418\u043c\u044f\u0424\u0430\u0439\u043b\u0430 \u0418\u0437\u0432\u043b\u0435\u0447\u044c\u041f\u0443\u0442\u044c \u0418\u0437\u0432\u043b\u0435\u0447\u044c\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0418\u0437\u043c\u0414\u0430\u0442 \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c\u0420\u0430\u0437\u043c\u0435\u0440\u041c\u0430\u0441\u0441\u0438\u0432\u0430 \u0418\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0439\u041c\u0430\u0441\u0441\u0438\u0432\u0430 \u0418\u043c\u044f\u041e\u0440\u0433 \u0418\u043c\u044f\u041f\u043e\u043b\u044f\u0421\u043f\u0440 \u0418\u043d\u0434\u0435\u043a\u0441 \u0418\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0417\u0430\u043a\u0440\u044b\u0442\u044c \u0418\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0418\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0428\u0430\u0433 \u0418\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439\u0420\u0435\u0436\u0438\u043c \u0418\u0442\u043e\u0433\u0422\u0431\u043b\u0421\u043f\u0440 \u041a\u043e\u0434\u0412\u0438\u0434\u0412\u0435\u0434\u0421\u043f\u0440 \u041a\u043e\u0434\u0412\u0438\u0434\u0421\u043f\u0440\u041f\u043e\u0418\u0414 \u041a\u043e\u0434\u041f\u043eAnalit \u041a\u043e\u0434\u0421\u0438\u043c\u0432\u043e\u043b\u0430 \u041a\u043e\u0434\u0421\u043f\u0440 \u041a\u043e\u043b\u041f\u043e\u0434\u0441\u0442\u0440 \u041a\u043e\u043b\u041f\u0440\u043e\u043f \u041a\u043e\u043d\u041c\u0435\u0441 \u041a\u043e\u043d\u0441\u0442 \u041a\u043e\u043d\u0441\u0442\u0415\u0441\u0442\u044c \u041a\u043e\u043d\u0441\u0442\u0417\u043d\u0430\u0447 \u041a\u043e\u043d\u0422\u0440\u0430\u043d \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0424\u0430\u0439\u043b \u041a\u043e\u043f\u0438\u044f\u0421\u0442\u0440 \u041a\u041f\u0435\u0440\u0438\u043e\u0434 \u041a\u0421\u0442\u0440\u0422\u0431\u043b\u0421\u043f\u0440 \u041c\u0430\u043a\u0441 \u041c\u0430\u043a\u0441\u0421\u0442\u0440\u0422\u0431\u043b\u0421\u043f\u0440 \u041c\u0430\u0441\u0441\u0438\u0432 \u041c\u0435\u043d\u044e \u041c\u0435\u043d\u044e\u0420\u0430\u0441\u0448 \u041c\u0438\u043d \u041d\u0430\u0431\u043e\u0440\u0414\u0430\u043d\u043d\u044b\u0445\u041d\u0430\u0439\u0442\u0438\u0420\u0430\u0441\u0448 \u041d\u0430\u0438\u043c\u0412\u0438\u0434\u0421\u043f\u0440 \u041d\u0430\u0438\u043c\u041f\u043eAnalit \u041d\u0430\u0438\u043c\u0421\u043f\u0440 \u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c\u041f\u0435\u0440\u0435\u0432\u043e\u0434\u044b\u0421\u0442\u0440\u043e\u043a \u041d\u0430\u0447\u041c\u0435\u0441 \u041d\u0430\u0447\u0422\u0440\u0430\u043d \u041d\u0438\u0436\u043d\u044f\u044f\u0413\u0440\u0430\u043d\u0438\u0446\u0430\u041c\u0430\u0441\u0441\u0438\u0432\u0430 \u041d\u043e\u043c\u0435\u0440\u0421\u043f\u0440 \u041d\u041f\u0435\u0440\u0438\u043e\u0434 \u041e\u043a\u043d\u043e \u041e\u043a\u0440 \u041e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u041e\u0442\u043b\u0418\u043d\u0444\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u041e\u0442\u043b\u0418\u043d\u0444\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u041e\u0442\u0447\u0435\u0442 \u041e\u0442\u0447\u0435\u0442\u0410\u043d\u0430\u043b \u041e\u0442\u0447\u0435\u0442\u0418\u043d\u0442 \u041f\u0430\u043f\u043a\u0430\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u041f\u0430\u0443\u0437\u0430 \u041f\u0412\u044b\u0431\u043e\u0440SQL \u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c\u0424\u0430\u0439\u043b \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c\u0424\u0430\u0439\u043b \u041f\u043e\u0434\u0441\u0442\u0440 \u041f\u043e\u0438\u0441\u043a\u041f\u043e\u0434\u0441\u0442\u0440 \u041f\u043e\u0438\u0441\u043a\u0421\u0442\u0440 \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0418\u0414\u0422\u0430\u0431\u043b\u0438\u0446\u044b \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0418\u0414 \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0418\u043c\u044f \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0421\u0442\u0430\u0442\u0443\u0441 \u041f\u0440\u0435\u0440\u0432\u0430\u0442\u044c \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0417\u043d\u0430\u0447 \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c\u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0420\u0430\u0437\u0431\u0421\u0442\u0440 \u0420\u0430\u0437\u043d\u0412\u0440\u0435\u043c\u044f \u0420\u0430\u0437\u043d\u0414\u0430\u0442 \u0420\u0430\u0437\u043d\u0414\u0430\u0442\u0430\u0412\u0440\u0435\u043c\u044f \u0420\u0430\u0437\u043d\u0420\u0430\u0431\u0412\u0440\u0435\u043c\u044f \u0420\u0435\u0433\u0423\u0441\u0442\u0412\u0440\u0435\u043c \u0420\u0435\u0433\u0423\u0441\u0442\u0414\u0430\u0442 \u0420\u0435\u0433\u0423\u0441\u0442\u0427\u0441\u043b \u0420\u0435\u0434\u0422\u0435\u043a\u0441\u0442 \u0420\u0435\u0435\u0441\u0442\u0440\u0417\u0430\u043f\u0438\u0441\u044c \u0420\u0435\u0435\u0441\u0442\u0440\u0421\u043f\u0438\u0441\u043e\u043a\u0418\u043c\u0435\u043d\u041f\u0430\u0440\u0430\u043c \u0420\u0435\u0435\u0441\u0442\u0440\u0427\u0442\u0435\u043d\u0438\u0435 \u0420\u0435\u043a\u0432\u0421\u043f\u0440 \u0420\u0435\u043a\u0432\u0421\u043f\u0440\u041f\u0440 \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0421\u0435\u0439\u0447\u0430\u0441 \u0421\u0435\u0440\u0432\u0435\u0440 \u0421\u0435\u0440\u0432\u0435\u0440\u041f\u0440\u043e\u0446\u0435\u0441\u0441\u0418\u0414 \u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0424\u0430\u0439\u043b\u0421\u0447\u0438\u0442\u0430\u0442\u044c \u0421\u0436\u041f\u0440\u043e\u0431 \u0421\u0438\u043c\u0432\u043e\u043b \u0421\u0438\u0441\u0442\u0435\u043c\u0430\u0414\u0438\u0440\u0435\u043a\u0442\u0443\u043c\u041a\u043e\u0434 \u0421\u0438\u0441\u0442\u0435\u043c\u0430\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0421\u0438\u0441\u0442\u0435\u043c\u0430\u041a\u043e\u0434 \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435\u0417\u0430\u043a\u0440\u044b\u0442\u044c \u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0421\u043e\u0437\u0434\u0430\u0442\u044c\u0414\u0438\u0430\u043b\u043e\u0433 \u0421\u043e\u0437\u0434\u0430\u0442\u044c\u0414\u0438\u0430\u043b\u043e\u0433\u0412\u044b\u0431\u043e\u0440\u0430\u0418\u0437\u0414\u0432\u0443\u0445\u0421\u043f\u0438\u0441\u043a\u043e\u0432 \u0421\u043e\u0437\u0434\u0430\u0442\u044c\u0414\u0438\u0430\u043b\u043e\u0433\u0412\u044b\u0431\u043e\u0440\u0430\u041f\u0430\u043f\u043a\u0438 \u0421\u043e\u0437\u0434\u0430\u0442\u044c\u0414\u0438\u0430\u043b\u043e\u0433\u041e\u0442\u043a\u0440\u044b\u0442\u0438\u044f\u0424\u0430\u0439\u043b\u0430 \u0421\u043e\u0437\u0434\u0430\u0442\u044c\u0414\u0438\u0430\u043b\u043e\u0433\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f\u0424\u0430\u0439\u043b\u0430 \u0421\u043e\u0437\u0434\u0430\u0442\u044c\u0417\u0430\u043f\u0440\u043e\u0441 \u0421\u043e\u0437\u0434\u0430\u0442\u044c\u0418\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u0421\u043e\u0437\u0434\u0430\u0442\u044c\u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0421\u043e\u0437\u0434\u0430\u0442\u044c\u041a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439\u0421\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a \u0421\u043e\u0437\u0434\u0430\u0442\u044c\u041c\u0430\u0441\u0441\u0438\u0432 \u0421\u043e\u0437\u0434\u0430\u0442\u044c\u041d\u0430\u0431\u043e\u0440\u0414\u0430\u043d\u043d\u044b\u0445 \u0421\u043e\u0437\u0434\u0430\u0442\u044c\u041e\u0431\u044a\u0435\u043a\u0442 \u0421\u043e\u0437\u0434\u0430\u0442\u044c\u041e\u0442\u0447\u0435\u0442 \u0421\u043e\u0437\u0434\u0430\u0442\u044c\u041f\u0430\u043f\u043a\u0443 \u0421\u043e\u0437\u0434\u0430\u0442\u044c\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0421\u043e\u0437\u0434\u0430\u0442\u044c\u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0421\u043e\u0437\u0434\u0430\u0442\u044c\u0421\u043f\u0438\u0441\u043e\u043a \u0421\u043e\u0437\u0434\u0430\u0442\u044c\u0421\u043f\u0438\u0441\u043e\u043a\u0421\u0442\u0440\u043e\u043a \u0421\u043e\u0437\u0434\u0430\u0442\u044c\u0421\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a \u0421\u043e\u0437\u0434\u0430\u0442\u044c\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0421\u043e\u0437\u0434\u0421\u043f\u0440 \u0421\u043e\u0441\u0442\u0421\u043f\u0440 \u0421\u043e\u0445\u0440 \u0421\u043e\u0445\u0440\u0421\u043f\u0440 \u0421\u043f\u0438\u0441\u043e\u043a\u0421\u0438\u0441\u0442\u0435\u043c \u0421\u043f\u0440 \u0421\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a \u0421\u043f\u0440\u0411\u043b\u043e\u043a\u0415\u0441\u0442\u044c \u0421\u043f\u0440\u0411\u043b\u043e\u043a\u0421\u043d\u044f\u0442\u044c \u0421\u043f\u0440\u0411\u043b\u043e\u043a\u0421\u043d\u044f\u0442\u044c\u0420\u0430\u0441\u0448 \u0421\u043f\u0440\u0411\u043b\u043e\u043a\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0421\u043f\u0440\u0418\u0437\u043c\u041d\u0430\u0431\u0414\u0430\u043d \u0421\u043f\u0440\u041a\u043e\u0434 \u0421\u043f\u0440\u041d\u043e\u043c\u0435\u0440 \u0421\u043f\u0440\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0421\u043f\u0440\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0421\u043f\u0440\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0421\u043f\u0440\u041f\u0430\u0440\u0430\u043c \u0421\u043f\u0440\u041f\u043e\u043b\u0435\u0417\u043d\u0430\u0447 \u0421\u043f\u0440\u041f\u043e\u043b\u0435\u0418\u043c\u044f \u0421\u043f\u0440\u0420\u0435\u043a\u0432 \u0421\u043f\u0440\u0420\u0435\u043a\u0432\u0412\u0432\u0435\u0434\u0417\u043d \u0421\u043f\u0440\u0420\u0435\u043a\u0432\u041d\u043e\u0432\u044b\u0435 \u0421\u043f\u0440\u0420\u0435\u043a\u0432\u041f\u0440 \u0421\u043f\u0440\u0420\u0435\u043a\u0432\u041f\u0440\u0435\u0434\u0417\u043d \u0421\u043f\u0440\u0420\u0435\u043a\u0432\u0420\u0435\u0436\u0438\u043c \u0421\u043f\u0440\u0420\u0435\u043a\u0432\u0422\u0438\u043f\u0422\u0435\u043a\u0441\u0442 \u0421\u043f\u0440\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0421\u043f\u0440\u0421\u043e\u0441\u0442 \u0421\u043f\u0440\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0421\u043f\u0440\u0422\u0431\u043b\u0418\u0442\u043e\u0433 \u0421\u043f\u0440\u0422\u0431\u043b\u0421\u0442\u0440 \u0421\u043f\u0440\u0422\u0431\u043b\u0421\u0442\u0440\u041a\u043e\u043b \u0421\u043f\u0440\u0422\u0431\u043b\u0421\u0442\u0440\u041c\u0430\u043a\u0441 \u0421\u043f\u0440\u0422\u0431\u043b\u0421\u0442\u0440\u041c\u0438\u043d \u0421\u043f\u0440\u0422\u0431\u043b\u0421\u0442\u0440\u041f\u0440\u0435\u0434 \u0421\u043f\u0440\u0422\u0431\u043b\u0421\u0442\u0440\u0421\u043b\u0435\u0434 \u0421\u043f\u0440\u0422\u0431\u043b\u0421\u0442\u0440\u0421\u043e\u0437\u0434 \u0421\u043f\u0440\u0422\u0431\u043b\u0421\u0442\u0440\u0423\u0434 \u0421\u043f\u0440\u0422\u0435\u043a\u041f\u0440\u0435\u0434\u0441\u0442 \u0421\u043f\u0440\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0421\u0440\u0430\u0432\u043d\u0438\u0442\u044c\u0421\u0442\u0440 \u0421\u0442\u0440\u0412\u0435\u0440\u0445\u0420\u0435\u0433\u0438\u0441\u0442\u0440 \u0421\u0442\u0440\u041d\u0438\u0436\u043d\u0420\u0435\u0433\u0438\u0441\u0442\u0440 \u0421\u0442\u0440\u0422\u0431\u043b\u0421\u043f\u0440 \u0421\u0443\u043c\u041f\u0440\u043e\u043f \u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439\u041f\u0430\u0440\u0430\u043c \u0422\u0435\u043a\u0412\u0435\u0440\u0441\u0438\u044f \u0422\u0435\u043a\u041e\u0440\u0433 \u0422\u043e\u0447\u043d \u0422\u0440\u0430\u043d \u0422\u0440\u0430\u043d\u0441\u043b\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u0423\u0434\u0430\u043b\u0438\u0442\u044c\u0422\u0430\u0431\u043b\u0438\u0446\u0443 \u0423\u0434\u0430\u043b\u0438\u0442\u044c\u0424\u0430\u0439\u043b \u0423\u0434\u0421\u043f\u0440 \u0423\u0434\u0421\u0442\u0440\u0422\u0431\u043b\u0421\u043f\u0440 \u0423\u0441\u0442 \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438\u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 \u0424\u0430\u0439\u043b\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u0421\u0447\u0438\u0442\u0430\u0442\u044c \u0424\u0430\u0439\u043b\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0424\u0430\u0439\u043b\u0412\u0440\u0435\u043c\u044f \u0424\u0430\u0439\u043b\u0412\u0440\u0435\u043c\u044f\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0424\u0430\u0439\u043b\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0424\u0430\u0439\u043b\u0417\u0430\u043d\u044f\u0442 \u0424\u0430\u0439\u043b\u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0424\u0430\u0439\u043b\u0418\u0441\u043a\u0430\u0442\u044c \u0424\u0430\u0439\u043b\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0424\u0430\u0439\u043b\u041c\u043e\u0436\u043d\u043e\u0427\u0438\u0442\u0430\u0442\u044c \u0424\u0430\u0439\u043b\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0424\u0430\u0439\u043b\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u0424\u0430\u0439\u043b\u041f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0424\u0430\u0439\u043b\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0424\u0430\u0439\u043b\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0424\u0430\u0439\u043b\u0420\u0430\u0437\u043c\u0435\u0440 \u0424\u0430\u0439\u043b\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0424\u0430\u0439\u043b\u0421\u0441\u044b\u043b\u043a\u0430\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0424\u0430\u0439\u043b\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0424\u0430\u0439\u043b\u0421\u0447\u0438\u0442\u0430\u0442\u044c \u0424\u0430\u0439\u043b\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0424\u043c\u0442SQL\u0414\u0430\u0442 \u0424\u043c\u0442\u0414\u0430\u0442 \u0424\u043c\u0442\u0421\u0442\u0440 \u0424\u043c\u0442\u0427\u0441\u043b \u0424\u043e\u0440\u043c\u0430\u0442 \u0426\u041c\u0430\u0441\u0441\u0438\u0432\u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0426\u041d\u0430\u0431\u043e\u0440\u0414\u0430\u043d\u043d\u044b\u0445\u0420\u0435\u043a\u0432\u0438\u0437\u0438\u0442 \u0426\u041f\u043e\u0434\u0441\u0442\u0440 "},
+begin:"[A-Za-z\u0410-\u042f\u0430-\u044f\u0451\u0401_][A-Za-z\u0410-\u042f\u0430-\u044f\u0451\u0401_0-9]*\\(",end:"\\(",returnBegin:!0,excludeEnd:!0},a,k,b,c,e]},g,a,k,b,c,e]}});b.registerLanguage("java",function(a){return{aliases:["jsp"],keywords:"false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",
 illegal:/<\/|#/,contains:[a.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,{className:"class",beginKeywords:"class interface",end:/[{;=]/,excludeEnd:!0,keywords:"class interface",illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends implements"},a.UNDERSCORE_TITLE_MODE]},{beginKeywords:"new throw return else",relevance:0},{className:"function",begin:"([\u00c0-\u02b8a-zA-Z_$][\u00c0-\u02b8a-zA-Z_$0-9]*(<[\u00c0-\u02b8a-zA-Z_$][\u00c0-\u02b8a-zA-Z_$0-9]*(\\s*,\\s*[\u00c0-\u02b8a-zA-Z_$][\u00c0-\u02b8a-zA-Z_$0-9]*)*>)?\\s+)+"+
-a.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:"false synchronized int abstract float private char boolean static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",contains:[{begin:a.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,
-contains:[a.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/,keywords:"false synchronized int abstract float private char boolean static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",relevance:0,contains:[a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,a.C_NUMBER_MODE,
-a.C_BLOCK_COMMENT_MODE]},a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE]},{className:"number",begin:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",relevance:0},{className:"meta",begin:"@[A-Za-z]+"}]}});b.registerLanguage("javascript",function(a){var b={keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as",
+a.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:"false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",contains:[{begin:a.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,
+contains:[a.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/,keywords:"false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",relevance:0,contains:[a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,a.C_NUMBER_MODE,
+a.C_BLOCK_COMMENT_MODE]},a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE]},{className:"number",begin:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",relevance:0},{className:"meta",begin:"@[A-Za-z]+"}]}});b.registerLanguage("javascript",function(a){var c={keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as",
 literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise"},
-d={className:"number",variants:[{begin:"\\b(0[bB][01]+)"},{begin:"\\b(0[oO][0-7]+)"},{begin:a.C_NUMBER_RE}],relevance:0},e={className:"subst",begin:"\\$\\{",end:"\\}",keywords:b,contains:[]},c={className:"string",begin:"`",end:"`",contains:[a.BACKSLASH_ESCAPE,e]};e.contains=[a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,c,d,a.REGEXP_MODE];e=e.contains.concat([a.C_BLOCK_COMMENT_MODE,a.C_LINE_COMMENT_MODE]);return{aliases:["js","jsx"],keywords:b,contains:[{className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},
-{className:"meta",begin:/^#!/,end:/$/},a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,c,a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,d,{begin:/[{,]\s*/,relevance:0,contains:[{begin:"[A-Za-z$_][0-9A-Za-z$_]*\\s*:",returnBegin:!0,relevance:0,contains:[{className:"attr",begin:"[A-Za-z$_][0-9A-Za-z$_]*",relevance:0}]}]},{begin:"("+a.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,a.REGEXP_MODE,{className:"function",begin:"(\\(.*?\\)|[A-Za-z$_][0-9A-Za-z$_]*)\\s*=>",
-returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:"[A-Za-z$_][0-9A-Za-z$_]*"},{begin:/\(\s*\)/},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:b,contains:e}]}]},{begin:/</,end:/(\/\w+|\w+\/)>/,subLanguage:"xml",contains:[{begin:/<\w+\s*\/>/,skip:!0},{begin:/<\w+/,end:/(\/\w+|\w+\/)>/,skip:!0,contains:[{begin:/<\w+\s*\/>/,skip:!0},"self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/\{/,excludeEnd:!0,contains:[a.inherit(a.TITLE_MODE,{begin:"[A-Za-z$_][0-9A-Za-z$_]*"}),
-{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:e}],illegal:/\[|%/},{begin:/\$[(.]/},a.METHOD_GUARD,{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends"},a.UNDERSCORE_TITLE_MODE]},{beginKeywords:"constructor",end:/\{/,excludeEnd:!0}],illegal:/#(?!!)/}});b.registerLanguage("json",function(a){var b={literal:"true false null"},d=[a.QUOTE_STRING_MODE,a.C_NUMBER_MODE],e={end:",",endsWithParent:!0,excludeEnd:!0,
-contains:d,keywords:b},c={begin:"{",end:"}",contains:[{className:"attr",begin:/"/,end:/"/,contains:[a.BACKSLASH_ESCAPE],illegal:"\\n"},a.inherit(e,{begin:/:/})],illegal:"\\S"};a={begin:"\\[",end:"\\]",contains:[a.inherit(e)],illegal:"\\S"};d.splice(d.length,0,c,a);return{contains:d,keywords:b,illegal:"\\S"}});b.registerLanguage("kotlin",function(a){var b={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit initinterface annotation data sealed internal infix operator out by constructor super trait volatile transient native default",
-built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},d={className:"symbol",begin:a.UNDERSCORE_IDENT_RE+"@"},e={className:"subst",begin:"\\${",end:"}",contains:[a.APOS_STRING_MODE,a.C_NUMBER_MODE]},c={className:"variable",begin:"\\$"+a.UNDERSCORE_IDENT_RE};e={className:"string",variants:[{begin:'"""',end:'"""',contains:[c,e]},{begin:"'",end:"'",illegal:/\n/,contains:[a.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/,contains:[a.BACKSLASH_ESCAPE,c,
-e]}]};c={className:"meta",begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+a.UNDERSCORE_IDENT_RE+")?"};var g={className:"meta",begin:"@"+a.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/,end:/\)/,contains:[a.inherit(e,{className:"meta-string"})]}]};return{keywords:b,contains:[a.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,{className:"keyword",begin:/\b(break|continue|return|this)\b/,
-starts:{contains:[{className:"symbol",begin:/@\w+/}]}},d,c,g,{className:"function",beginKeywords:"fun",end:"[(]|$",returnBegin:!0,excludeEnd:!0,keywords:b,illegal:/fun\s+(<.*>)?[^\s\(]+(\s+[^\s\(]+)\s*=/,relevance:5,contains:[{begin:a.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[a.UNDERSCORE_TITLE_MODE]},{className:"type",begin:/</,end:/>/,keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:b,relevance:0,contains:[{begin:/:/,end:/[=,\/]/,
-endsWithParent:!0,contains:[{className:"type",begin:a.UNDERSCORE_IDENT_RE},a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE],relevance:0},a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,c,g,e,a.C_NUMBER_MODE]},a.C_BLOCK_COMMENT_MODE]},{className:"class",beginKeywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0,illegal:"extends implements",contains:[{beginKeywords:"public protected internal private constructor"},a.UNDERSCORE_TITLE_MODE,{className:"type",begin:/</,end:/>/,excludeBegin:!0,excludeEnd:!0,
-relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,]|$/,excludeBegin:!0,returnEnd:!0},c,g]},e,{className:"meta",begin:"^#!/usr/bin/env",end:"$",illegal:"\n"},a.C_NUMBER_MODE]}});b.registerLanguage("lisp",function(a){var b={className:"literal",begin:"\\b(t{1}|nil)\\b"},d={className:"number",variants:[{begin:"(\\-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s|D|E|F|L|S)(\\+|\\-)?\\d+)?",relevance:0},{begin:"#(b|B)[0-1]+(/[0-1]+)?"},{begin:"#(o|O)[0-7]+(/[0-7]+)?"},{begin:"#(x|X)[0-9a-fA-F]+(/[0-9a-fA-F]+)?"},
-{begin:"#(c|C)\\((\\-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s|D|E|F|L|S)(\\+|\\-)?\\d+)? +(\\-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s|D|E|F|L|S)(\\+|\\-)?\\d+)?",end:"\\)"}]},e=a.inherit(a.QUOTE_STRING_MODE,{illegal:null});a=a.COMMENT(";","$",{relevance:0});var c={begin:"\\*",end:"\\*"},g={className:"symbol",begin:"[:&][a-zA-Z_\\-\\+\\*\\/\\<\\=\\>\\&\\#][a-zA-Z0-9_\\-\\+\\*\\/\\<\\=\\>\\&\\#!]*"},k={begin:"[a-zA-Z_\\-\\+\\*\\/\\<\\=\\>\\&\\#][a-zA-Z0-9_\\-\\+\\*\\/\\<\\=\\>\\&\\#!]*",relevance:0},
-l={contains:[d,e,c,g,{begin:"\\(",end:"\\)",contains:["self",b,e,d,k]},k],variants:[{begin:"['`]\\(",end:"\\)"},{begin:"\\(quote ",end:"\\)",keywords:{name:"quote"}},{begin:"'\\|[^]*?\\|"}]},m={variants:[{begin:"'[a-zA-Z_\\-\\+\\*\\/\\<\\=\\>\\&\\#][a-zA-Z0-9_\\-\\+\\*\\/\\<\\=\\>\\&\\#!]*"},{begin:"#'[a-zA-Z_\\-\\+\\*\\/\\<\\=\\>\\&\\#][a-zA-Z0-9_\\-\\+\\*\\/\\<\\=\\>\\&\\#!]*(::[a-zA-Z_\\-\\+\\*\\/\\<\\=\\>\\&\\#][a-zA-Z0-9_\\-\\+\\*\\/\\<\\=\\>\\&\\#!]*)*"}]},n={begin:"\\(\\s*",end:"\\)"},h={endsWithParent:!0,
-relevance:0};n.contains=[{className:"name",variants:[{begin:"[a-zA-Z_\\-\\+\\*\\/\\<\\=\\>\\&\\#][a-zA-Z0-9_\\-\\+\\*\\/\\<\\=\\>\\&\\#!]*"},{begin:"\\|[^]*?\\|"}]},h];h.contains=[l,m,n,b,d,e,a,c,g,{begin:"\\|[^]*?\\|"},k];return{illegal:/\S/,contains:[d,{className:"meta",begin:"^#!",end:"$"},b,e,a,l,m,n,k]}});b.registerLanguage("lua",function(a){var b={begin:"\\[=*\\[",end:"\\]=*\\]",contains:["self"]},d=[a.COMMENT("--(?!\\[=*\\[)","$"),a.COMMENT("--\\[=*\\[","\\]=*\\]",{contains:[b],relevance:10})];
-return{lexemes:a.UNDERSCORE_IDENT_RE,keywords:{literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstringmodule next pairs pcall print rawequal rawget rawset require select setfenvsetmetatable tonumber tostring type unpack xpcall arg selfcoroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},
-contains:d.concat([{className:"function",beginKeywords:"function",end:"\\)",contains:[a.inherit(a.TITLE_MODE,{begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params",begin:"\\(",endsWithParent:!0,contains:d}].concat(d)},a.C_NUMBER_MODE,a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,{className:"string",begin:"\\[=*\\[",end:"\\]=*\\]",contains:[b],relevance:5}])}});b.registerLanguage("objectivec",function(a){var b=/[a-zA-Z@][a-zA-Z0-9_]*/;return{aliases:["mm","objc","obj-c"],keywords:{keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",
-literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},lexemes:b,illegal:"</",contains:[{className:"built_in",begin:"\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+"},a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,a.C_NUMBER_MODE,a.QUOTE_STRING_MODE,{className:"string",variants:[{begin:'@"',end:'"',illegal:"\\n",contains:[a.BACKSLASH_ESCAPE]},{begin:"'",end:"[^\\\\]'",illegal:"[^\\\\][^']"}]},
-{className:"meta",begin:"#",end:"$",contains:[{className:"meta-string",variants:[{begin:'"',end:'"'},{begin:"<",end:">"}]}]},{className:"class",begin:"(@interface|@class|@protocol|@implementation)\\b",end:"({|$)",excludeEnd:!0,keywords:"@interface @class @protocol @implementation",lexemes:b,contains:[a.UNDERSCORE_TITLE_MODE]},{begin:"\\."+a.UNDERSCORE_IDENT_RE,relevance:0}]}});b.registerLanguage("ocaml",function(a){return{aliases:["ml"],keywords:{keyword:"and as assert asr begin class constraint do done downto else end exception external for fun function functor if in include inherit! inherit initializer land lazy let lor lsl lsr lxor match method!|10 method mod module mutable new object of open! open or private rec sig struct then to try type val! val virtual when while with parser value",
-built_in:"array bool bytes char exn|5 float int int32 int64 list lazy_t|5 nativeint|5 string unit in_channel out_channel ref",literal:"true false"},illegal:/\/\/|>>/,lexemes:"[a-z_]\\w*!?",contains:[{className:"literal",begin:"\\[(\\|\\|)?\\]|\\(\\)",relevance:0},a.COMMENT("\\(\\*","\\*\\)",{contains:["self"]}),{className:"symbol",begin:"'[A-Za-z_](?!')[\\w']*"},{className:"type",begin:"`[A-Z][\\w']*"},{className:"type",begin:"\\b[A-Z][\\w']*",relevance:0},{begin:"[a-z_]\\w*'[\\w']*",relevance:0},
-a.inherit(a.APOS_STRING_MODE,{className:"string",relevance:0}),a.inherit(a.QUOTE_STRING_MODE,{illegal:null}),{className:"number",begin:"\\b(0[xX][a-fA-F0-9_]+[Lln]?|0[oO][0-7_]+[Lln]?|0[bB][01_]+[Lln]?|[0-9][0-9_]*([Lln]|(\\.[0-9_]*)?([eE][-+]?[0-9_]+)?)?)",relevance:0},{begin:/[-=]>/}]}});b.registerLanguage("perl",function(a){var b={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when"},
-d={begin:"->{",end:"}"},e={variants:[{begin:/\$\d/},{begin:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{begin:/[\$%@][^\s\w{]/,relevance:0}]},c=[a.BACKSLASH_ESCAPE,b,e];a=[e,a.HASH_COMMENT_MODE,a.COMMENT("^\\=\\w","\\=cut",{endsWithParent:!0}),d,{className:"string",contains:c,variants:[{begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*\\<",
+b={className:"number",variants:[{begin:"\\b(0[bB][01]+)"},{begin:"\\b(0[oO][0-7]+)"},{begin:a.C_NUMBER_RE}],relevance:0},e={className:"subst",begin:"\\$\\{",end:"\\}",keywords:c,contains:[]},f={className:"string",begin:"`",end:"`",contains:[a.BACKSLASH_ESCAPE,e]};e.contains=[a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,f,b,a.REGEXP_MODE];e=e.contains.concat([a.C_BLOCK_COMMENT_MODE,a.C_LINE_COMMENT_MODE]);return{aliases:["js","jsx"],keywords:c,contains:[{className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},
+{className:"meta",begin:/^#!/,end:/$/},a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,f,a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,b,{begin:/[{,]\s*/,relevance:0,contains:[{begin:"[A-Za-z$_][0-9A-Za-z$_]*\\s*:",returnBegin:!0,relevance:0,contains:[{className:"attr",begin:"[A-Za-z$_][0-9A-Za-z$_]*",relevance:0}]}]},{begin:"("+a.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,a.REGEXP_MODE,{className:"function",begin:"(\\(.*?\\)|[A-Za-z$_][0-9A-Za-z$_]*)\\s*=>",
+returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:"[A-Za-z$_][0-9A-Za-z$_]*"},{begin:/\(\s*\)/},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:c,contains:e}]}]},{begin:/</,end:/(\/\w+|\w+\/)>/,subLanguage:"xml",contains:[{begin:/<\w+\s*\/>/,skip:!0},{begin:/<\w+/,end:/(\/\w+|\w+\/)>/,skip:!0,contains:[{begin:/<\w+\s*\/>/,skip:!0},"self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/\{/,excludeEnd:!0,contains:[a.inherit(a.TITLE_MODE,{begin:"[A-Za-z$_][0-9A-Za-z$_]*"}),
+{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:e}],illegal:/\[|%/},{begin:/\$[(.]/},a.METHOD_GUARD,{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends"},a.UNDERSCORE_TITLE_MODE]},{beginKeywords:"constructor get set",end:/\{/,excludeEnd:!0}],illegal:/#(?!!)/}});b.registerLanguage("jboss-cli",function(a){return{aliases:["wildfly-cli"],lexemes:"[a-z-]+",keywords:{keyword:"alias batch cd clear command connect connection-factory connection-info data-source deploy deployment-info deployment-overlay echo echo-dmr help history if jdbc-driver-info jms-queue|20 jms-topic|20 ls patch pwd quit read-attribute read-operation reload rollout-plan run-batch set shutdown try unalias undeploy unset version xa-data-source",
+literal:"true false"},contains:[a.HASH_COMMENT_MODE,a.QUOTE_STRING_MODE,{className:"params",begin:/--[\w\-=\/]+/},{className:"function",begin:/:[\w\-.]+/,relevance:0},{className:"string",begin:/\B(([\/.])[\w\-.\/=]+)+/},{className:"params",begin:/\(/,end:/\)/,contains:[{begin:/[\w-]+ *=/,returnBegin:!0,relevance:0,contains:[{className:"attr",begin:/[\w-]+/}]}],relevance:0}]}});b.registerLanguage("json",function(a){var b={literal:"true false null"},d=[a.QUOTE_STRING_MODE,a.C_NUMBER_MODE],e={end:",",
+endsWithParent:!0,excludeEnd:!0,contains:d,keywords:b},f={begin:"{",end:"}",contains:[{className:"attr",begin:/"/,end:/"/,contains:[a.BACKSLASH_ESCAPE],illegal:"\\n"},a.inherit(e,{begin:/:/})],illegal:"\\S"};a={begin:"\\[",end:"\\]",contains:[a.inherit(e)],illegal:"\\S"};d.splice(d.length,0,f,a);return{contains:d,keywords:b,illegal:"\\S"}});b.registerLanguage("julia",function(a){var b={keyword:"in isa where baremodule begin break catch ccall const continue do else elseif end export false finally for function global if import importall let local macro module quote return true try using while type immutable abstract bitstype typealias ",
+literal:"true false ARGS C_NULL DevNull ENDIAN_BOM ENV I Inf Inf16 Inf32 Inf64 InsertionSort JULIA_HOME LOAD_PATH MergeSort NaN NaN16 NaN32 NaN64 PROGRAM_FILE QuickSort RoundDown RoundFromZero RoundNearest RoundNearestTiesAway RoundNearestTiesUp RoundToZero RoundUp STDERR STDIN STDOUT VERSION catalan e|0 eu|0 eulergamma golden im nothing pi \u03b3 \u03c0 \u03c6 ",built_in:"ANY AbstractArray AbstractChannel AbstractFloat AbstractMatrix AbstractRNG AbstractSerializer AbstractSet AbstractSparseArray AbstractSparseMatrix AbstractSparseVector AbstractString AbstractUnitRange AbstractVecOrMat AbstractVector Any ArgumentError Array AssertionError Associative Base64DecodePipe Base64EncodePipe Bidiagonal BigFloat BigInt BitArray BitMatrix BitVector Bool BoundsError BufferStream CachingPool CapturedException CartesianIndex CartesianRange Cchar Cdouble Cfloat Channel Char Cint Cintmax_t Clong Clonglong ClusterManager Cmd CodeInfo Colon Complex Complex128 Complex32 Complex64 CompositeException Condition ConjArray ConjMatrix ConjVector Cptrdiff_t Cshort Csize_t Cssize_t Cstring Cuchar Cuint Cuintmax_t Culong Culonglong Cushort Cwchar_t Cwstring DataType Date DateFormat DateTime DenseArray DenseMatrix DenseVecOrMat DenseVector Diagonal Dict DimensionMismatch Dims DirectIndexString Display DivideError DomainError EOFError EachLine Enum Enumerate ErrorException Exception ExponentialBackOff Expr Factorization FileMonitor Float16 Float32 Float64 Function Future GlobalRef GotoNode HTML Hermitian IO IOBuffer IOContext IOStream IPAddr IPv4 IPv6 IndexCartesian IndexLinear IndexStyle InexactError InitError Int Int128 Int16 Int32 Int64 Int8 IntSet Integer InterruptException InvalidStateException Irrational KeyError LabelNode LinSpace LineNumberNode LoadError LowerTriangular MIME Matrix MersenneTwister Method MethodError MethodTable Module NTuple NewvarNode NullException Nullable Number ObjectIdDict OrdinalRange OutOfMemoryError OverflowError Pair ParseError PartialQuickSort PermutedDimsArray Pipe PollingFileWatcher ProcessExitedException Ptr QuoteNode RandomDevice Range RangeIndex Rational RawFD ReadOnlyMemoryError Real ReentrantLock Ref Regex RegexMatch RemoteChannel RemoteException RevString RoundingMode RowVector SSAValue SegmentationFault SerializationState Set SharedArray SharedMatrix SharedVector Signed SimpleVector Slot SlotNumber SparseMatrixCSC SparseVector StackFrame StackOverflowError StackTrace StepRange StepRangeLen StridedArray StridedMatrix StridedVecOrMat StridedVector String SubArray SubString SymTridiagonal Symbol Symmetric SystemError TCPSocket Task Text TextDisplay Timer Tridiagonal Tuple Type TypeError TypeMapEntry TypeMapLevel TypeName TypeVar TypedSlot UDPSocket UInt UInt128 UInt16 UInt32 UInt64 UInt8 UndefRefError UndefVarError UnicodeError UniformScaling Union UnionAll UnitRange Unsigned UpperTriangular Val Vararg VecElement VecOrMat Vector VersionNumber Void WeakKeyDict WeakRef WorkerConfig WorkerPool "},
+d={lexemes:"[A-Za-z_\\u00A1-\\uFFFF][A-Za-z_0-9\\u00A1-\\uFFFF]*",keywords:b,illegal:/<\//};b={className:"subst",begin:/\$\(/,end:/\)/,keywords:b};var e={className:"variable",begin:"\\$[A-Za-z_\\u00A1-\\uFFFF][A-Za-z_0-9\\u00A1-\\uFFFF]*"};d.contains=[{className:"number",begin:/(\b0x[\d_]*(\.[\d_]*)?|0x\.\d[\d_]*)p[-+]?\d+|\b0[box][a-fA-F0-9][a-fA-F0-9_]*|(\b\d[\d_]*(\.[\d_]*)?|\.\d[\d_]*)([eEfF][-+]?\d+)?/,relevance:0},{className:"string",begin:/'(.|\\[xXuU][a-zA-Z0-9]+)'/},{className:"string",contains:[a.BACKSLASH_ESCAPE,
+b,e],variants:[{begin:/\w*"""/,end:/"""\w*/,relevance:10},{begin:/\w*"/,end:/"\w*/}]},{className:"string",contains:[a.BACKSLASH_ESCAPE,b,e],begin:"`",end:"`"},{className:"meta",begin:"@[A-Za-z_\\u00A1-\\uFFFF][A-Za-z_0-9\\u00A1-\\uFFFF]*"},{className:"comment",variants:[{begin:"#=",end:"=#",relevance:10},{begin:"#",end:"$"}]},a.HASH_COMMENT_MODE,{className:"keyword",begin:"\\b(((abstract|primitive)\\s+)type|(mutable\\s+)?struct)\\b"},{begin:/<:/}];b.contains=d.contains;return d});b.registerLanguage("julia-repl",
+function(a){return{contains:[{className:"meta",begin:/^julia>/,relevance:10,starts:{end:/^(?![ ]{6})/,subLanguage:"julia"},aliases:["jldoctest"]}]}});b.registerLanguage("kotlin",function(a){var b={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual trait volatile transient native default",
+built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},d={className:"symbol",begin:a.UNDERSCORE_IDENT_RE+"@"},e={className:"subst",begin:"\\${",end:"}",contains:[a.APOS_STRING_MODE,a.C_NUMBER_MODE]},f={className:"variable",begin:"\\$"+a.UNDERSCORE_IDENT_RE};e={className:"string",variants:[{begin:'"""',end:'"""',contains:[f,e]},{begin:"'",end:"'",illegal:/\n/,contains:[a.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/,contains:[a.BACKSLASH_ESCAPE,f,
+e]}]};f={className:"meta",begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+a.UNDERSCORE_IDENT_RE+")?"};var g={className:"meta",begin:"@"+a.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/,end:/\)/,contains:[a.inherit(e,{className:"meta-string"})]}]};return{aliases:["kt"],keywords:b,contains:[a.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,{className:"keyword",begin:/\b(break|continue|return|this)\b/,
+starts:{contains:[{className:"symbol",begin:/@\w+/}]}},d,f,g,{className:"function",beginKeywords:"fun",end:"[(]|$",returnBegin:!0,excludeEnd:!0,keywords:b,illegal:/fun\s+(<.*>)?[^\s\(]+(\s+[^\s\(]+)\s*=/,relevance:5,contains:[{begin:a.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[a.UNDERSCORE_TITLE_MODE]},{className:"type",begin:/</,end:/>/,keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:b,relevance:0,contains:[{begin:/:/,end:/[=,\/]/,
+endsWithParent:!0,contains:[{className:"type",begin:a.UNDERSCORE_IDENT_RE},a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE],relevance:0},a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,f,g,e,a.C_NUMBER_MODE]},a.C_BLOCK_COMMENT_MODE]},{className:"class",beginKeywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0,illegal:"extends implements",contains:[{beginKeywords:"public protected internal private constructor"},a.UNDERSCORE_TITLE_MODE,{className:"type",begin:/</,end:/>/,excludeBegin:!0,excludeEnd:!0,
+relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,]|$/,excludeBegin:!0,returnEnd:!0},f,g]},e,{className:"meta",begin:"^#!/usr/bin/env",end:"$",illegal:"\n"},{className:"number",begin:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",relevance:0}]}});b.registerLanguage("lasso",function(a){var b={literal:"true false none minimal full all void and or not bw nbw ew new cn ncn lt lte gt gte eq neq rx nrx ft",
+built_in:"array date decimal duration integer map pair string tag xml null boolean bytes keyword list locale queue set stack staticarray local var variable global data self inherited currentcapture givenblock",keyword:"cache database_names database_schemanames database_tablenames define_tag define_type email_batch encode_set html_comment handle handle_error header if inline iterate ljax_target link link_currentaction link_currentgroup link_currentrecord link_detail link_firstgroup link_firstrecord link_lastgroup link_lastrecord link_nextgroup link_nextrecord link_prevgroup link_prevrecord log loop namespace_using output_none portal private protect records referer referrer repeating resultset rows search_args search_arguments select sort_args sort_arguments thread_atomic value_list while abort case else fail_if fail_ifnot fail if_empty if_false if_null if_true loop_abort loop_continue loop_count params params_up return return_value run_children soap_definetag soap_lastrequest soap_lastresponse tag_name ascending average by define descending do equals frozen group handle_failure import in into join let match max min on order parent protected provide public require returnhome skip split_thread sum take thread to trait type where with yield yieldhome"},
+d=a.COMMENT("\x3c!--","--\x3e",{relevance:0}),e={className:"meta",begin:"\\[noprocess\\]",starts:{end:"\\[/noprocess\\]",returnEnd:!0,contains:[d]}},f={className:"meta",begin:"\\[/noprocess|<\\?(lasso(script)?|=)"};a=[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,a.inherit(a.C_NUMBER_MODE,{begin:a.C_NUMBER_RE+"|(-?infinity|NaN)\\b"}),a.inherit(a.APOS_STRING_MODE,{illegal:null}),a.inherit(a.QUOTE_STRING_MODE,{illegal:null}),{className:"string",begin:"`",end:"`"},{variants:[{begin:"[#$][a-zA-Z_][\\w.]*"},
+{begin:"#",end:"\\d+",illegal:"\\W"}]},{className:"type",begin:"::\\s*",end:"[a-zA-Z_][\\w.]*",illegal:"\\W"},{className:"params",variants:[{begin:"-(?!infinity)[a-zA-Z_][\\w.]*",relevance:0},{begin:"(\\.\\.\\.)"}]},{begin:/(->|\.)\s*/,relevance:0,contains:[{className:"symbol",begin:"'[a-zA-Z_][\\w.]*'"}]},{className:"class",beginKeywords:"define",returnEnd:!0,end:"\\(|=>",contains:[a.inherit(a.TITLE_MODE,{begin:"[a-zA-Z_][\\w.]*(=(?!>))?|[-+*/%](?!>)"})]}];return{aliases:["ls","lassoscript"],case_insensitive:!0,
+lexemes:"[a-zA-Z_][\\w.]*|&[lg]t;",keywords:b,contains:[{className:"meta",begin:"\\]|\\?>",relevance:0,starts:{end:"\\[|<\\?(lasso(script)?|=)",returnEnd:!0,relevance:0,contains:[d]}},e,f,{className:"meta",begin:"\\[no_square_brackets",starts:{end:"\\[/no_square_brackets\\]",lexemes:"[a-zA-Z_][\\w.]*|&[lg]t;",keywords:b,contains:[{className:"meta",begin:"\\]|\\?>",relevance:0,starts:{end:"\\[noprocess\\]|<\\?(lasso(script)?|=)",returnEnd:!0,contains:[d]}},e,f].concat(a)}},{className:"meta",begin:"\\[",
+relevance:0},{className:"meta",begin:"^#!",end:"lasso9$",relevance:10}].concat(a)}});b.registerLanguage("ldif",function(a){return{contains:[{className:"attribute",begin:"^dn",end:": ",excludeEnd:!0,starts:{end:"$",relevance:0},relevance:10},{className:"attribute",begin:"^\\w",end:": ",excludeEnd:!0,starts:{end:"$",relevance:0}},{className:"literal",begin:"^-",end:"$"},a.HASH_COMMENT_MODE]}});b.registerLanguage("leaf",function(a){return{contains:[{className:"function",begin:"#+[A-Za-z_0-9]*\\(",end:" {",
+returnBegin:!0,excludeEnd:!0,contains:[{className:"keyword",begin:"#+"},{className:"title",begin:"[A-Za-z_][A-Za-z_0-9]*"},{className:"params",begin:"\\(",end:"\\)",endsParent:!0,contains:[{className:"string",begin:'"',end:'"'},{className:"variable",begin:"[A-Za-z_][A-Za-z_0-9]*"}]}]}]}});b.registerLanguage("less",function(a){var b=[],d=[],e=function(a){return{className:"string",begin:"~?"+a+".*?"+a}},f=function(a,b,c){return{className:a,begin:b,relevance:c}},g={begin:"\\(",end:"\\)",contains:d,relevance:0};
+d.push(a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,e("'"),e('"'),a.CSS_NUMBER_MODE,{begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]",excludeEnd:!0}},f("number","#[0-9A-Fa-f]+\\b"),g,f("variable","@@?[\\w-]+",10),f("variable","@{[\\w-]+}"),f("built_in","~?`[^`]*?`"),{className:"attribute",begin:"[\\w-]+\\s*:",end:":",returnBegin:!0,excludeEnd:!0},{className:"meta",begin:"!important"});g=d.concat({begin:"{",end:"}",contains:b});var k={beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not"}].concat(d)};
+e={begin:"([\\w-]+|@{[\\w-]+})\\s*:",returnBegin:!0,end:"[;}]",relevance:0,contains:[{className:"attribute",begin:"([\\w-]+|@{[\\w-]+})",end:":",excludeEnd:!0,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:d}}]};d={className:"keyword",begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",starts:{end:"[;{}]",returnEnd:!0,contains:d,relevance:0}};var m={className:"variable",variants:[{begin:"@[\\w-]+\\s*:",relevance:15},{begin:"@[\\w-]+"}],
+starts:{end:"[;}]",returnEnd:!0,contains:g}};f={variants:[{begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:"([\\w-]+|@{[\\w-]+})",end:"{"}],returnBegin:!0,returnEnd:!0,illegal:"[<='$\"]",relevance:0,contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,k,f("keyword","all\\b"),f("variable","@{[\\w-]+}"),f("selector-tag","([\\w-]+|@{[\\w-]+})%?",0),f("selector-id","#([\\w-]+|@{[\\w-]+})"),f("selector-class","\\.([\\w-]+|@{[\\w-]+})",0),f("selector-tag","&",0),{className:"selector-attr",begin:"\\[",end:"\\]"},
+{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9_\-\+\(\)"'.]+/},{begin:"\\(",end:"\\)",contains:g},{begin:"!important"}]};b.push(a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,d,m,e,f);return{case_insensitive:!0,illegal:"[=>'/<($\"]",contains:b}});b.registerLanguage("lisp",function(a){var b={className:"literal",begin:"\\b(t{1}|nil)\\b"},d={className:"number",variants:[{begin:"(\\-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s|D|E|F|L|S)(\\+|\\-)?\\d+)?",relevance:0},{begin:"#(b|B)[0-1]+(/[0-1]+)?"},{begin:"#(o|O)[0-7]+(/[0-7]+)?"},
+{begin:"#(x|X)[0-9a-fA-F]+(/[0-9a-fA-F]+)?"},{begin:"#(c|C)\\((\\-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s|D|E|F|L|S)(\\+|\\-)?\\d+)? +(\\-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s|D|E|F|L|S)(\\+|\\-)?\\d+)?",end:"\\)"}]},e=a.inherit(a.QUOTE_STRING_MODE,{illegal:null});a=a.COMMENT(";","$",{relevance:0});var f={begin:"\\*",end:"\\*"},g={className:"symbol",begin:"[:&][a-zA-Z_\\-\\+\\*\\/\\<\\=\\>\\&\\#][a-zA-Z0-9_\\-\\+\\*\\/\\<\\=\\>\\&\\#!]*"},k={begin:"[a-zA-Z_\\-\\+\\*\\/\\<\\=\\>\\&\\#][a-zA-Z0-9_\\-\\+\\*\\/\\<\\=\\>\\&\\#!]*",
+relevance:0},m={contains:[d,e,f,g,{begin:"\\(",end:"\\)",contains:["self",b,e,d,k]},k],variants:[{begin:"['`]\\(",end:"\\)"},{begin:"\\(quote ",end:"\\)",keywords:{name:"quote"}},{begin:"'\\|[^]*?\\|"}]},p={variants:[{begin:"'[a-zA-Z_\\-\\+\\*\\/\\<\\=\\>\\&\\#][a-zA-Z0-9_\\-\\+\\*\\/\\<\\=\\>\\&\\#!]*"},{begin:"#'[a-zA-Z_\\-\\+\\*\\/\\<\\=\\>\\&\\#][a-zA-Z0-9_\\-\\+\\*\\/\\<\\=\\>\\&\\#!]*(::[a-zA-Z_\\-\\+\\*\\/\\<\\=\\>\\&\\#][a-zA-Z0-9_\\-\\+\\*\\/\\<\\=\\>\\&\\#!]*)*"}]},l={begin:"\\(\\s*",end:"\\)"},
+h={endsWithParent:!0,relevance:0};l.contains=[{className:"name",variants:[{begin:"[a-zA-Z_\\-\\+\\*\\/\\<\\=\\>\\&\\#][a-zA-Z0-9_\\-\\+\\*\\/\\<\\=\\>\\&\\#!]*"},{begin:"\\|[^]*?\\|"}]},h];h.contains=[m,p,l,b,d,e,a,f,g,{begin:"\\|[^]*?\\|"},k];return{illegal:/\S/,contains:[d,{className:"meta",begin:"^#!",end:"$"},b,e,a,m,p,l,k]}});b.registerLanguage("livecodeserver",function(a){var b={begin:"\\b[gtps][A-Z]+[A-Za-z0-9_\\-]*\\b|\\$_[A-Z]+",relevance:0},d=[a.C_BLOCK_COMMENT_MODE,a.HASH_COMMENT_MODE,
+a.COMMENT("--","$"),a.COMMENT("[^:]//","$")],e=a.inherit(a.TITLE_MODE,{variants:[{begin:"\\b_*rig[A-Z]+[A-Za-z0-9_\\-]*"},{begin:"\\b_[a-z0-9\\-]+"}]}),f=a.inherit(a.TITLE_MODE,{begin:"\\b([A-Za-z0-9_\\-]+)\\b"});return{case_insensitive:!1,keywords:{keyword:"$_COOKIE $_FILES $_GET $_GET_BINARY $_GET_RAW $_POST $_POST_BINARY $_POST_RAW $_SESSION $_SERVER codepoint codepoints segment segments codeunit codeunits sentence sentences trueWord trueWords paragraph after byte bytes english the until http forever descending using line real8 with seventh for stdout finally element word words fourth before black ninth sixth characters chars stderr uInt1 uInt1s uInt2 uInt2s stdin string lines relative rel any fifth items from middle mid at else of catch then third it file milliseconds seconds second secs sec int1 int1s int4 int4s internet int2 int2s normal text item last long detailed effective uInt4 uInt4s repeat end repeat URL in try into switch to words https token binfile each tenth as ticks tick system real4 by dateItems without char character ascending eighth whole dateTime numeric short first ftp integer abbreviated abbr abbrev private case while if div mod wrap and or bitAnd bitNot bitOr bitXor among not in a an within contains ends with begins the keys of keys",
+literal:"SIX TEN FORMFEED NINE ZERO NONE SPACE FOUR FALSE COLON CRLF PI COMMA ENDOFFILE EOF EIGHT FIVE QUOTE EMPTY ONE TRUE RETURN CR LINEFEED RIGHT BACKSLASH NULL SEVEN TAB THREE TWO six ten formfeed nine zero none space four false colon crlf pi comma endoffile eof eight five quote empty one true return cr linefeed right backslash null seven tab three two RIVERSION RISTATE FILE_READ_MODE FILE_WRITE_MODE FILE_WRITE_MODE DIR_WRITE_MODE FILE_READ_UMASK FILE_WRITE_UMASK DIR_READ_UMASK DIR_WRITE_UMASK",
+built_in:"put abs acos aliasReference annuity arrayDecode arrayEncode asin atan atan2 average avg avgDev base64Decode base64Encode baseConvert binaryDecode binaryEncode byteOffset byteToNum cachedURL cachedURLs charToNum cipherNames codepointOffset codepointProperty codepointToNum codeunitOffset commandNames compound compress constantNames cos date dateFormat decompress directories diskSpace DNSServers exp exp1 exp2 exp10 extents files flushEvents folders format functionNames geometricMean global globals hasMemory harmonicMean hostAddress hostAddressToName hostName hostNameToAddress isNumber ISOToMac itemOffset keys len length libURLErrorData libUrlFormData libURLftpCommand libURLLastHTTPHeaders libURLLastRHHeaders libUrlMultipartFormAddPart libUrlMultipartFormData libURLVersion lineOffset ln ln1 localNames log log2 log10 longFilePath lower macToISO matchChunk matchText matrixMultiply max md5Digest median merge millisec millisecs millisecond milliseconds min monthNames nativeCharToNum normalizeText num number numToByte numToChar numToCodepoint numToNativeChar offset open openfiles openProcesses openProcessIDs openSockets paragraphOffset paramCount param params peerAddress pendingMessages platform popStdDev populationStandardDeviation populationVariance popVariance processID random randomBytes replaceText result revCreateXMLTree revCreateXMLTreeFromFile revCurrentRecord revCurrentRecordIsFirst revCurrentRecordIsLast revDatabaseColumnCount revDatabaseColumnIsNull revDatabaseColumnLengths revDatabaseColumnNames revDatabaseColumnNamed revDatabaseColumnNumbered revDatabaseColumnTypes revDatabaseConnectResult revDatabaseCursors revDatabaseID revDatabaseTableNames revDatabaseType revDataFromQuery revdb_closeCursor revdb_columnbynumber revdb_columncount revdb_columnisnull revdb_columnlengths revdb_columnnames revdb_columntypes revdb_commit revdb_connect revdb_connections revdb_connectionerr revdb_currentrecord revdb_cursorconnection revdb_cursorerr revdb_cursors revdb_dbtype revdb_disconnect revdb_execute revdb_iseof revdb_isbof revdb_movefirst revdb_movelast revdb_movenext revdb_moveprev revdb_query revdb_querylist revdb_recordcount revdb_rollback revdb_tablenames revGetDatabaseDriverPath revNumberOfRecords revOpenDatabase revOpenDatabases revQueryDatabase revQueryDatabaseBlob revQueryResult revQueryIsAtStart revQueryIsAtEnd revUnixFromMacPath revXMLAttribute revXMLAttributes revXMLAttributeValues revXMLChildContents revXMLChildNames revXMLCreateTreeFromFileWithNamespaces revXMLCreateTreeWithNamespaces revXMLDataFromXPathQuery revXMLEvaluateXPath revXMLFirstChild revXMLMatchingNode revXMLNextSibling revXMLNodeContents revXMLNumberOfChildren revXMLParent revXMLPreviousSibling revXMLRootNode revXMLRPC_CreateRequest revXMLRPC_Documents revXMLRPC_Error revXMLRPC_GetHost revXMLRPC_GetMethod revXMLRPC_GetParam revXMLText revXMLRPC_Execute revXMLRPC_GetParamCount revXMLRPC_GetParamNode revXMLRPC_GetParamType revXMLRPC_GetPath revXMLRPC_GetPort revXMLRPC_GetProtocol revXMLRPC_GetRequest revXMLRPC_GetResponse revXMLRPC_GetSocket revXMLTree revXMLTrees revXMLValidateDTD revZipDescribeItem revZipEnumerateItems revZipOpenArchives round sampVariance sec secs seconds sentenceOffset sha1Digest shell shortFilePath sin specialFolderPath sqrt standardDeviation statRound stdDev sum sysError systemVersion tan tempName textDecode textEncode tick ticks time to tokenOffset toLower toUpper transpose truewordOffset trunc uniDecode uniEncode upper URLDecode URLEncode URLStatus uuid value variableNames variance version waitDepth weekdayNames wordOffset xsltApplyStylesheet xsltApplyStylesheetFromFile xsltLoadStylesheet xsltLoadStylesheetFromFile add breakpoint cancel clear local variable file word line folder directory URL close socket process combine constant convert create new alias folder directory decrypt delete variable word line folder directory URL dispatch divide do encrypt filter get include intersect kill libURLDownloadToFile libURLFollowHttpRedirects libURLftpUpload libURLftpUploadFile libURLresetAll libUrlSetAuthCallback libURLSetCustomHTTPHeaders libUrlSetExpect100 libURLSetFTPListCommand libURLSetFTPMode libURLSetFTPStopTime libURLSetStatusCallback load multiply socket prepare process post seek rel relative read from process rename replace require resetAll resolve revAddXMLNode revAppendXML revCloseCursor revCloseDatabase revCommitDatabase revCopyFile revCopyFolder revCopyXMLNode revDeleteFolder revDeleteXMLNode revDeleteAllXMLTrees revDeleteXMLTree revExecuteSQL revGoURL revInsertXMLNode revMoveFolder revMoveToFirstRecord revMoveToLastRecord revMoveToNextRecord revMoveToPreviousRecord revMoveToRecord revMoveXMLNode revPutIntoXMLNode revRollBackDatabase revSetDatabaseDriverPath revSetXMLAttribute revXMLRPC_AddParam revXMLRPC_DeleteAllDocuments revXMLAddDTD revXMLRPC_Free revXMLRPC_FreeAll revXMLRPC_DeleteDocument revXMLRPC_DeleteParam revXMLRPC_SetHost revXMLRPC_SetMethod revXMLRPC_SetPort revXMLRPC_SetProtocol revXMLRPC_SetSocket revZipAddItemWithData revZipAddItemWithFile revZipAddUncompressedItemWithData revZipAddUncompressedItemWithFile revZipCancel revZipCloseArchive revZipDeleteItem revZipExtractItemToFile revZipExtractItemToVariable revZipSetProgressCallback revZipRenameItem revZipReplaceItemWithData revZipReplaceItemWithFile revZipOpenArchive send set sort split start stop subtract union unload wait write"},
+contains:[b,{className:"keyword",begin:"\\bend\\sif\\b"},{className:"function",beginKeywords:"function",end:"$",contains:[b,f,a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,a.BINARY_NUMBER_MODE,a.C_NUMBER_MODE,e]},{className:"function",begin:"\\bend\\s+",end:"$",keywords:"end",contains:[f,e],relevance:0},{beginKeywords:"command on",end:"$",contains:[b,f,a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,a.BINARY_NUMBER_MODE,a.C_NUMBER_MODE,e]},{className:"meta",variants:[{begin:"<\\?(rev|lc|livecode)",relevance:10},
+{begin:"<\\?"},{begin:"\\?>"}]},a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,a.BINARY_NUMBER_MODE,a.C_NUMBER_MODE,e].concat(d),illegal:";$|^\\[|^=|&|{"}});b.registerLanguage("livescript",function(a){var b={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger case default function var with then unless until loop of by when and or is isnt not it that otherwise from to til fallthrough super case default function var void const let enum export import native __hasProp __extends __slice __bind __indexOf",
+literal:"true false null undefined yes no on off it that void",built_in:"npm require console print module global window document"},d=a.inherit(a.TITLE_MODE,{begin:"[A-Za-z$_](?:-[0-9A-Za-z$_]|[0-9A-Za-z$_])*"}),e={className:"subst",begin:/#\{/,end:/}/,keywords:b},f={className:"subst",begin:/#[A-Za-z$_]/,end:/(?:\-[0-9A-Za-z$_]|[0-9A-Za-z$_])*/,keywords:b};f=[a.BINARY_NUMBER_MODE,{className:"number",begin:"(\\b0[xX][a-fA-F0-9_]+)|(\\b\\d(\\d|_\\d)*(\\.(\\d(\\d|_\\d)*)?)?(_*[eE]([-+]\\d(_\\d|\\d)*)?)?[_a-z]*)",
+relevance:0,starts:{end:"(\\s*/)?",relevance:0}},{className:"string",variants:[{begin:/'''/,end:/'''/,contains:[a.BACKSLASH_ESCAPE]},{begin:/'/,end:/'/,contains:[a.BACKSLASH_ESCAPE]},{begin:/"""/,end:/"""/,contains:[a.BACKSLASH_ESCAPE,e,f]},{begin:/"/,end:/"/,contains:[a.BACKSLASH_ESCAPE,e,f]},{begin:/\\/,end:/(\s|$)/,excludeEnd:!0}]},{className:"regexp",variants:[{begin:"//",end:"//[gim]*",contains:[e,a.HASH_COMMENT_MODE]},{begin:/\/(?![ *])(\\\/|.)*?\/[gim]*(?=\W|$)/}]},{begin:"@[A-Za-z$_](?:-[0-9A-Za-z$_]|[0-9A-Za-z$_])*"},
+{begin:"``",end:"``",excludeBegin:!0,excludeEnd:!0,subLanguage:"javascript"}];e.contains=f;e={className:"params",begin:"\\(",returnBegin:!0,contains:[{begin:/\(/,end:/\)/,keywords:b,contains:["self"].concat(f)}]};return{aliases:["ls"],keywords:b,illegal:/\/\*/,contains:f.concat([a.COMMENT("\\/\\*","\\*\\/"),a.HASH_COMMENT_MODE,{className:"function",contains:[d,e],returnBegin:!0,variants:[{begin:"([A-Za-z$_](?:-[0-9A-Za-z$_]|[0-9A-Za-z$_])*\\s*(?:=|:=)\\s*)?(\\(.*\\))?\\s*\\B\\->\\*?",end:"\\->\\*?"},
+{begin:"([A-Za-z$_](?:-[0-9A-Za-z$_]|[0-9A-Za-z$_])*\\s*(?:=|:=)\\s*)?!?(\\(.*\\))?\\s*\\B[-~]{1,2}>\\*?",end:"[-~]{1,2}>\\*?"},{begin:"([A-Za-z$_](?:-[0-9A-Za-z$_]|[0-9A-Za-z$_])*\\s*(?:=|:=)\\s*)?(\\(.*\\))?\\s*\\B!?[-~]{1,2}>\\*?",end:"!?[-~]{1,2}>\\*?"}]},{className:"class",beginKeywords:"class",end:"$",illegal:/[:="\[\]]/,contains:[{beginKeywords:"extends",endsWithParent:!0,illegal:/[:="\[\]]/,contains:[d]},d]},{begin:"[A-Za-z$_](?:-[0-9A-Za-z$_]|[0-9A-Za-z$_])*:",end:":",returnBegin:!0,returnEnd:!0,
+relevance:0}])}});b.registerLanguage("llvm",function(a){return{keywords:"begin end true false declare define global constant private linker_private internal available_externally linkonce linkonce_odr weak weak_odr appending dllimport dllexport common default hidden protected extern_weak external thread_local zeroinitializer undef null to tail target triple datalayout volatile nuw nsw nnan ninf nsz arcp fast exact inbounds align addrspace section alias module asm sideeffect gc dbg linker_private_weak attributes blockaddress initialexec localdynamic localexec prefix unnamed_addr ccc fastcc coldcc x86_stdcallcc x86_fastcallcc arm_apcscc arm_aapcscc arm_aapcs_vfpcc ptx_device ptx_kernel intel_ocl_bicc msp430_intrcc spir_func spir_kernel x86_64_sysvcc x86_64_win64cc x86_thiscallcc cc c signext zeroext inreg sret nounwind noreturn noalias nocapture byval nest readnone readonly inlinehint noinline alwaysinline optsize ssp sspreq noredzone noimplicitfloat naked builtin cold nobuiltin noduplicate nonlazybind optnone returns_twice sanitize_address sanitize_memory sanitize_thread sspstrong uwtable returned type opaque eq ne slt sgt sle sge ult ugt ule uge oeq one olt ogt ole oge ord uno ueq une x acq_rel acquire alignstack atomic catch cleanup filter inteldialect max min monotonic nand personality release seq_cst singlethread umax umin unordered xchg add fadd sub fsub mul fmul udiv sdiv fdiv urem srem frem shl lshr ashr and or xor icmp fcmp phi call trunc zext sext fptrunc fpext uitofp sitofp fptoui fptosi inttoptr ptrtoint bitcast addrspacecast select va_arg ret br switch invoke unwind unreachable indirectbr landingpad resume malloc alloca free load store getelementptr extractelement insertelement shufflevector getresult extractvalue insertvalue atomicrmw cmpxchg fence argmemonly double",
+contains:[{className:"keyword",begin:"i\\d+"},a.COMMENT(";","\\n",{relevance:0}),a.QUOTE_STRING_MODE,{className:"string",variants:[{begin:'"',end:'[^\\\\]"'}],relevance:0},{className:"title",variants:[{begin:"@([-a-zA-Z$._][\\w\\-$.]*)"},{begin:"@\\d+"},{begin:"!([-a-zA-Z$._][\\w\\-$.]*)"},{begin:"!\\d+([-a-zA-Z$._][\\w\\-$.]*)"}]},{className:"symbol",variants:[{begin:"%([-a-zA-Z$._][\\w\\-$.]*)"},{begin:"%\\d+"},{begin:"#\\d+"}]},{className:"number",variants:[{begin:"0[xX][a-fA-F0-9]+"},{begin:"-?\\d+(?:[.]\\d+)?(?:[eE][-+]?\\d+(?:[.]\\d+)?)?"}],
+relevance:0}]}});b.registerLanguage("lsl",function(a){var b={className:"number",begin:a.C_NUMBER_RE};return{illegal:":",contains:[{className:"string",begin:'"',end:'"',contains:[{className:"subst",begin:/\\[tn"\\]/}]},{className:"comment",variants:[a.COMMENT("//","$"),a.COMMENT("/\\*","\\*/")]},b,{className:"section",variants:[{begin:"\\b(?:state|default)\\b"},{begin:"\\b(?:state_(?:entry|exit)|touch(?:_(?:start|end))?|(?:land_)?collision(?:_(?:start|end))?|timer|listen|(?:no_)?sensor|control|(?:not_)?at_(?:rot_)?target|money|email|experience_permissions(?:_denied)?|run_time_permissions|changed|attach|dataserver|moving_(?:start|end)|link_message|(?:on|object)_rez|remote_data|http_re(?:sponse|quest)|path_update|transaction_result)\\b"}]},
+{className:"built_in",begin:"\\b(?:ll(?:AgentInExperience|(?:Create|DataSize|Delete|KeyCount|Keys|Read|Update)KeyValue|GetExperience(?:Details|ErrorMessage)|ReturnObjectsBy(?:ID|Owner)|Json(?:2List|[GS]etValue|ValueType)|Sin|Cos|Tan|Atan2|Sqrt|Pow|Abs|Fabs|Frand|Floor|Ceil|Round|Vec(?:Mag|Norm|Dist)|Rot(?:Between|2(?:Euler|Fwd|Left|Up))|(?:Euler|Axes)2Rot|Whisper|(?:Region|Owner)?Say|Shout|Listen(?:Control|Remove)?|Sensor(?:Repeat|Remove)?|Detected(?:Name|Key|Owner|Type|Pos|Vel|Grab|Rot|Group|LinkNumber)|Die|Ground|Wind|(?:[GS]et)(?:AnimationOverride|MemoryLimit|PrimMediaParams|ParcelMusicURL|Object(?:Desc|Name)|PhysicsMaterial|Status|Scale|Color|Alpha|Texture|Pos|Rot|Force|Torque)|ResetAnimationOverride|(?:Scale|Offset|Rotate)Texture|(?:Rot)?Target(?:Remove)?|(?:Stop)?MoveToTarget|Apply(?:Rotational)?Impulse|Set(?:KeyframedMotion|ContentType|RegionPos|(?:Angular)?Velocity|Buoyancy|HoverHeight|ForceAndTorque|TimerEvent|ScriptState|Damage|TextureAnim|Sound(?:Queueing|Radius)|Vehicle(?:Type|(?:Float|Vector|Rotation)Param)|(?:Touch|Sit)?Text|Camera(?:Eye|At)Offset|PrimitiveParams|ClickAction|Link(?:Alpha|Color|PrimitiveParams(?:Fast)?|Texture(?:Anim)?|Camera|Media)|RemoteScriptAccessPin|PayPrice|LocalRot)|ScaleByFactor|Get(?:(?:Max|Min)ScaleFactor|ClosestNavPoint|StaticPath|SimStats|Env|PrimitiveParams|Link(?:PrimitiveParams|Number(?:OfSides)?|Key|Name|Media)|HTTPHeader|FreeURLs|Object(?:Details|PermMask|PrimCount)|Parcel(?:MaxPrims|Details|Prim(?:Count|Owners))|Attached(?:List)?|(?:SPMax|Free|Used)Memory|Region(?:Name|TimeDilation|FPS|Corner|AgentCount)|Root(?:Position|Rotation)|UnixTime|(?:Parcel|Region)Flags|(?:Wall|GMT)clock|SimulatorHostname|BoundingBox|GeometricCenter|Creator|NumberOf(?:Prims|NotecardLines|Sides)|Animation(?:List)?|(?:Camera|Local)(?:Pos|Rot)|Vel|Accel|Omega|Time(?:stamp|OfDay)|(?:Object|CenterOf)?Mass|MassMKS|Energy|Owner|(?:Owner)?Key|SunDirection|Texture(?:Offset|Scale|Rot)|Inventory(?:Number|Name|Key|Type|Creator|PermMask)|Permissions(?:Key)?|StartParameter|List(?:Length|EntryType)|Date|Agent(?:Size|Info|Language|List)|LandOwnerAt|NotecardLine|Script(?:Name|State))|(?:Get|Reset|GetAndReset)Time|PlaySound(?:Slave)?|LoopSound(?:Master|Slave)?|(?:Trigger|Stop|Preload)Sound|(?:(?:Get|Delete)Sub|Insert)String|To(?:Upper|Lower)|Give(?:InventoryList|Money)|RezObject|(?:Stop)?LookAt|Sleep|CollisionFilter|(?:Take|Release)Controls|DetachFromAvatar|AttachToAvatar(?:Temp)?|InstantMessage|(?:GetNext)?Email|StopHover|MinEventDelay|RotLookAt|String(?:Length|Trim)|(?:Start|Stop)Animation|TargetOmega|Request(?:Experience)?Permissions|(?:Create|Break)Link|BreakAllLinks|(?:Give|Remove)Inventory|Water|PassTouches|Request(?:Agent|Inventory)Data|TeleportAgent(?:Home|GlobalCoords)?|ModifyLand|CollisionSound|ResetScript|MessageLinked|PushObject|PassCollisions|AxisAngle2Rot|Rot2(?:Axis|Angle)|A(?:cos|sin)|AngleBetween|AllowInventoryDrop|SubStringIndex|List2(?:CSV|Integer|Json|Float|String|Key|Vector|Rot|List(?:Strided)?)|DeleteSubList|List(?:Statistics|Sort|Randomize|(?:Insert|Find|Replace)List)|EdgeOfWorld|AdjustSoundVolume|Key2Name|TriggerSoundLimited|EjectFromLand|(?:CSV|ParseString)2List|OverMyLand|SameGroup|UnSit|Ground(?:Slope|Normal|Contour)|GroundRepel|(?:Set|Remove)VehicleFlags|(?:AvatarOn)?(?:Link)?SitTarget|Script(?:Danger|Profiler)|Dialog|VolumeDetect|ResetOtherScript|RemoteLoadScriptPin|(?:Open|Close)RemoteDataChannel|SendRemoteData|RemoteDataReply|(?:Integer|String)ToBase64|XorBase64|Log(?:10)?|Base64To(?:String|Integer)|ParseStringKeepNulls|RezAtRoot|RequestSimulatorData|ForceMouselook|(?:Load|Release|(?:E|Une)scape)URL|ParcelMedia(?:CommandList|Query)|ModPow|MapDestination|(?:RemoveFrom|AddTo|Reset)Land(?:Pass|Ban)List|(?:Set|Clear)CameraParams|HTTP(?:Request|Response)|TextBox|DetectedTouch(?:UV|Face|Pos|(?:N|Bin)ormal|ST)|(?:MD5|SHA1|DumpList2)String|Request(?:Secure)?URL|Clear(?:Prim|Link)Media|(?:Link)?ParticleSystem|(?:Get|Request)(?:Username|DisplayName)|RegionSayTo|CastRay|GenerateKey|TransferLindenDollars|ManageEstateAccess|(?:Create|Delete)Character|ExecCharacterCmd|Evade|FleeFrom|NavigateTo|PatrolPoints|Pursue|UpdateCharacter|WanderWithin))\\b"},
+{className:"literal",variants:[{begin:"\\b(?:PI|TWO_PI|PI_BY_TWO|DEG_TO_RAD|RAD_TO_DEG|SQRT2)\\b"},{begin:"\\b(?:XP_ERROR_(?:EXPERIENCES_DISABLED|EXPERIENCE_(?:DISABLED|SUSPENDED)|INVALID_(?:EXPERIENCE|PARAMETERS)|KEY_NOT_FOUND|MATURITY_EXCEEDED|NONE|NOT_(?:FOUND|PERMITTED(?:_LAND)?)|NO_EXPERIENCE|QUOTA_EXCEEDED|RETRY_UPDATE|STORAGE_EXCEPTION|STORE_DISABLED|THROTTLED|UNKNOWN_ERROR)|JSON_APPEND|STATUS_(?:PHYSICS|ROTATE_[XYZ]|PHANTOM|SANDBOX|BLOCK_GRAB(?:_OBJECT)?|(?:DIE|RETURN)_AT_EDGE|CAST_SHADOWS|OK|MALFORMED_PARAMS|TYPE_MISMATCH|BOUNDS_ERROR|NOT_(?:FOUND|SUPPORTED)|INTERNAL_ERROR|WHITELIST_FAILED)|AGENT(?:_(?:BY_(?:LEGACY_|USER)NAME|FLYING|ATTACHMENTS|SCRIPTED|MOUSELOOK|SITTING|ON_OBJECT|AWAY|WALKING|IN_AIR|TYPING|CROUCHING|BUSY|ALWAYS_RUN|AUTOPILOT|LIST_(?:PARCEL(?:_OWNER)?|REGION)))?|CAMERA_(?:PITCH|DISTANCE|BEHINDNESS_(?:ANGLE|LAG)|(?:FOCUS|POSITION)(?:_(?:THRESHOLD|LOCKED|LAG))?|FOCUS_OFFSET|ACTIVE)|ANIM_ON|LOOP|REVERSE|PING_PONG|SMOOTH|ROTATE|SCALE|ALL_SIDES|LINK_(?:ROOT|SET|ALL_(?:OTHERS|CHILDREN)|THIS)|ACTIVE|PASS(?:IVE|_(?:ALWAYS|IF_NOT_HANDLED|NEVER))|SCRIPTED|CONTROL_(?:FWD|BACK|(?:ROT_)?(?:LEFT|RIGHT)|UP|DOWN|(?:ML_)?LBUTTON)|PERMISSION_(?:RETURN_OBJECTS|DEBIT|OVERRIDE_ANIMATIONS|SILENT_ESTATE_MANAGEMENT|TAKE_CONTROLS|TRIGGER_ANIMATION|ATTACH|CHANGE_LINKS|(?:CONTROL|TRACK)_CAMERA|TELEPORT)|INVENTORY_(?:TEXTURE|SOUND|OBJECT|SCRIPT|LANDMARK|CLOTHING|NOTECARD|BODYPART|ANIMATION|GESTURE|ALL|NONE)|CHANGED_(?:INVENTORY|COLOR|SHAPE|SCALE|TEXTURE|LINK|ALLOWED_DROP|OWNER|REGION(?:_START)?|TELEPORT|MEDIA)|OBJECT_(?:CLICK_ACTION|HOVER_HEIGHT|LAST_OWNER_ID|(?:PHYSICS|SERVER|STREAMING)_COST|UNKNOWN_DETAIL|CHARACTER_TIME|PHANTOM|PHYSICS|TEMP_ON_REZ|NAME|DESC|POS|PRIM_(?:COUNT|EQUIVALENCE)|RETURN_(?:PARCEL(?:_OWNER)?|REGION)|REZZER_KEY|ROO?T|VELOCITY|OMEGA|OWNER|GROUP|CREATOR|ATTACHED_POINT|RENDER_WEIGHT|(?:BODY_SHAPE|PATHFINDING)_TYPE|(?:RUNNING|TOTAL)_SCRIPT_COUNT|TOTAL_INVENTORY_COUNT|SCRIPT_(?:MEMORY|TIME))|TYPE_(?:INTEGER|FLOAT|STRING|KEY|VECTOR|ROTATION|INVALID)|(?:DEBUG|PUBLIC)_CHANNEL|ATTACH_(?:AVATAR_CENTER|CHEST|HEAD|BACK|PELVIS|MOUTH|CHIN|NECK|NOSE|BELLY|[LR](?:SHOULDER|HAND|FOOT|EAR|EYE|[UL](?:ARM|LEG)|HIP)|(?:LEFT|RIGHT)_PEC|HUD_(?:CENTER_[12]|TOP_(?:RIGHT|CENTER|LEFT)|BOTTOM(?:_(?:RIGHT|LEFT))?)|[LR]HAND_RING1|TAIL_(?:BASE|TIP)|[LR]WING|FACE_(?:JAW|[LR]EAR|[LR]EYE|TOUNGE)|GROIN|HIND_[LR]FOOT)|LAND_(?:LEVEL|RAISE|LOWER|SMOOTH|NOISE|REVERT)|DATA_(?:ONLINE|NAME|BORN|SIM_(?:POS|STATUS|RATING)|PAYINFO)|PAYMENT_INFO_(?:ON_FILE|USED)|REMOTE_DATA_(?:CHANNEL|REQUEST|REPLY)|PSYS_(?:PART_(?:BF_(?:ZERO|ONE(?:_MINUS_(?:DEST_COLOR|SOURCE_(ALPHA|COLOR)))?|DEST_COLOR|SOURCE_(ALPHA|COLOR))|BLEND_FUNC_(DEST|SOURCE)|FLAGS|(?:START|END)_(?:COLOR|ALPHA|SCALE|GLOW)|MAX_AGE|(?:RIBBON|WIND|INTERP_(?:COLOR|SCALE)|BOUNCE|FOLLOW_(?:SRC|VELOCITY)|TARGET_(?:POS|LINEAR)|EMISSIVE)_MASK)|SRC_(?:MAX_AGE|PATTERN|ANGLE_(?:BEGIN|END)|BURST_(?:RATE|PART_COUNT|RADIUS|SPEED_(?:MIN|MAX))|ACCEL|TEXTURE|TARGET_KEY|OMEGA|PATTERN_(?:DROP|EXPLODE|ANGLE(?:_CONE(?:_EMPTY)?)?)))|VEHICLE_(?:REFERENCE_FRAME|TYPE_(?:NONE|SLED|CAR|BOAT|AIRPLANE|BALLOON)|(?:LINEAR|ANGULAR)_(?:FRICTION_TIMESCALE|MOTOR_DIRECTION)|LINEAR_MOTOR_OFFSET|HOVER_(?:HEIGHT|EFFICIENCY|TIMESCALE)|BUOYANCY|(?:LINEAR|ANGULAR)_(?:DEFLECTION_(?:EFFICIENCY|TIMESCALE)|MOTOR_(?:DECAY_)?TIMESCALE)|VERTICAL_ATTRACTION_(?:EFFICIENCY|TIMESCALE)|BANKING_(?:EFFICIENCY|MIX|TIMESCALE)|FLAG_(?:NO_DEFLECTION_UP|LIMIT_(?:ROLL_ONLY|MOTOR_UP)|HOVER_(?:(?:WATER|TERRAIN|UP)_ONLY|GLOBAL_HEIGHT)|MOUSELOOK_(?:STEER|BANK)|CAMERA_DECOUPLED))|PRIM_(?:ALPHA_MODE(?:_(?:BLEND|EMISSIVE|MASK|NONE))?|NORMAL|SPECULAR|TYPE(?:_(?:BOX|CYLINDER|PRISM|SPHERE|TORUS|TUBE|RING|SCULPT))?|HOLE_(?:DEFAULT|CIRCLE|SQUARE|TRIANGLE)|MATERIAL(?:_(?:STONE|METAL|GLASS|WOOD|FLESH|PLASTIC|RUBBER))?|SHINY_(?:NONE|LOW|MEDIUM|HIGH)|BUMP_(?:NONE|BRIGHT|DARK|WOOD|BARK|BRICKS|CHECKER|CONCRETE|TILE|STONE|DISKS|GRAVEL|BLOBS|SIDING|LARGETILE|STUCCO|SUCTION|WEAVE)|TEXGEN_(?:DEFAULT|PLANAR)|SCULPT_(?:TYPE_(?:SPHERE|TORUS|PLANE|CYLINDER|MASK)|FLAG_(?:MIRROR|INVERT))|PHYSICS(?:_(?:SHAPE_(?:CONVEX|NONE|PRIM|TYPE)))?|(?:POS|ROT)_LOCAL|SLICE|TEXT|FLEXIBLE|POINT_LIGHT|TEMP_ON_REZ|PHANTOM|POSITION|SIZE|ROTATION|TEXTURE|NAME|OMEGA|DESC|LINK_TARGET|COLOR|BUMP_SHINY|FULLBRIGHT|TEXGEN|GLOW|MEDIA_(?:ALT_IMAGE_ENABLE|CONTROLS|(?:CURRENT|HOME)_URL|AUTO_(?:LOOP|PLAY|SCALE|ZOOM)|FIRST_CLICK_INTERACT|(?:WIDTH|HEIGHT)_PIXELS|WHITELIST(?:_ENABLE)?|PERMS_(?:INTERACT|CONTROL)|PARAM_MAX|CONTROLS_(?:STANDARD|MINI)|PERM_(?:NONE|OWNER|GROUP|ANYONE)|MAX_(?:URL_LENGTH|WHITELIST_(?:SIZE|COUNT)|(?:WIDTH|HEIGHT)_PIXELS)))|MASK_(?:BASE|OWNER|GROUP|EVERYONE|NEXT)|PERM_(?:TRANSFER|MODIFY|COPY|MOVE|ALL)|PARCEL_(?:MEDIA_COMMAND_(?:STOP|PAUSE|PLAY|LOOP|TEXTURE|URL|TIME|AGENT|UNLOAD|AUTO_ALIGN|TYPE|SIZE|DESC|LOOP_SET)|FLAG_(?:ALLOW_(?:FLY|(?:GROUP_)?SCRIPTS|LANDMARK|TERRAFORM|DAMAGE|CREATE_(?:GROUP_)?OBJECTS)|USE_(?:ACCESS_(?:GROUP|LIST)|BAN_LIST|LAND_PASS_LIST)|LOCAL_SOUND_ONLY|RESTRICT_PUSHOBJECT|ALLOW_(?:GROUP|ALL)_OBJECT_ENTRY)|COUNT_(?:TOTAL|OWNER|GROUP|OTHER|SELECTED|TEMP)|DETAILS_(?:NAME|DESC|OWNER|GROUP|AREA|ID|SEE_AVATARS))|LIST_STAT_(?:MAX|MIN|MEAN|MEDIAN|STD_DEV|SUM(?:_SQUARES)?|NUM_COUNT|GEOMETRIC_MEAN|RANGE)|PAY_(?:HIDE|DEFAULT)|REGION_FLAG_(?:ALLOW_DAMAGE|FIXED_SUN|BLOCK_TERRAFORM|SANDBOX|DISABLE_(?:COLLISIONS|PHYSICS)|BLOCK_FLY|ALLOW_DIRECT_TELEPORT|RESTRICT_PUSHOBJECT)|HTTP_(?:METHOD|MIMETYPE|BODY_(?:MAXLENGTH|TRUNCATED)|CUSTOM_HEADER|PRAGMA_NO_CACHE|VERBOSE_THROTTLE|VERIFY_CERT)|STRING_(?:TRIM(?:_(?:HEAD|TAIL))?)|CLICK_ACTION_(?:NONE|TOUCH|SIT|BUY|PAY|OPEN(?:_MEDIA)?|PLAY|ZOOM)|TOUCH_INVALID_FACE|PROFILE_(?:NONE|SCRIPT_MEMORY)|RC_(?:DATA_FLAGS|DETECT_PHANTOM|GET_(?:LINK_NUM|NORMAL|ROOT_KEY)|MAX_HITS|REJECT_(?:TYPES|AGENTS|(?:NON)?PHYSICAL|LAND))|RCERR_(?:CAST_TIME_EXCEEDED|SIM_PERF_LOW|UNKNOWN)|ESTATE_ACCESS_(?:ALLOWED_(?:AGENT|GROUP)_(?:ADD|REMOVE)|BANNED_AGENT_(?:ADD|REMOVE))|DENSITY|FRICTION|RESTITUTION|GRAVITY_MULTIPLIER|KFM_(?:COMMAND|CMD_(?:PLAY|STOP|PAUSE)|MODE|FORWARD|LOOP|PING_PONG|REVERSE|DATA|ROTATION|TRANSLATION)|ERR_(?:GENERIC|PARCEL_PERMISSIONS|MALFORMED_PARAMS|RUNTIME_PERMISSIONS|THROTTLED)|CHARACTER_(?:CMD_(?:(?:SMOOTH_)?STOP|JUMP)|DESIRED_(?:TURN_)?SPEED|RADIUS|STAY_WITHIN_PARCEL|LENGTH|ORIENTATION|ACCOUNT_FOR_SKIPPED_FRAMES|AVOIDANCE_MODE|TYPE(?:_(?:[ABCD]|NONE))?|MAX_(?:DECEL|TURN_RADIUS|(?:ACCEL|SPEED)))|PURSUIT_(?:OFFSET|FUZZ_FACTOR|GOAL_TOLERANCE|INTERCEPT)|REQUIRE_LINE_OF_SIGHT|FORCE_DIRECT_PATH|VERTICAL|HORIZONTAL|AVOID_(?:CHARACTERS|DYNAMIC_OBSTACLES|NONE)|PU_(?:EVADE_(?:HIDDEN|SPOTTED)|FAILURE_(?:DYNAMIC_PATHFINDING_DISABLED|INVALID_(?:GOAL|START)|NO_(?:NAVMESH|VALID_DESTINATION)|OTHER|TARGET_GONE|(?:PARCEL_)?UNREACHABLE)|(?:GOAL|SLOWDOWN_DISTANCE)_REACHED)|TRAVERSAL_TYPE(?:_(?:FAST|NONE|SLOW))?|CONTENT_TYPE_(?:ATOM|FORM|HTML|JSON|LLSD|RSS|TEXT|XHTML|XML)|GCNP_(?:RADIUS|STATIC)|(?:PATROL|WANDER)_PAUSE_AT_WAYPOINTS|OPT_(?:AVATAR|CHARACTER|EXCLUSION_VOLUME|LEGACY_LINKSET|MATERIAL_VOLUME|OTHER|STATIC_OBSTACLE|WALKABLE)|SIM_STAT_PCT_CHARS_STEPPED)\\b"},
+{begin:"\\b(?:FALSE|TRUE)\\b"},{begin:"\\b(?:ZERO_ROTATION)\\b"},{begin:"\\b(?:EOF|JSON_(?:ARRAY|DELETE|FALSE|INVALID|NULL|NUMBER|OBJECT|STRING|TRUE)|NULL_KEY|TEXTURE_(?:BLANK|DEFAULT|MEDIA|PLYWOOD|TRANSPARENT)|URL_REQUEST_(?:GRANTED|DENIED))\\b"},{begin:"\\b(?:ZERO_VECTOR|TOUCH_INVALID_(?:TEXCOORD|VECTOR))\\b"}]},{className:"type",begin:"\\b(?:integer|float|string|key|vector|quaternion|rotation|list)\\b"}]}});b.registerLanguage("lua",function(a){var b={begin:"\\[=*\\[",end:"\\]=*\\]",contains:["self"]},
+d=[a.COMMENT("--(?!\\[=*\\[)","$"),a.COMMENT("--\\[=*\\[","\\]=*\\]",{contains:[b],relevance:10})];return{lexemes:a.UNDERSCORE_IDENT_RE,keywords:{literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstringmodule next pairs pcall print rawequal rawget rawset require select setfenvsetmetatable tonumber tostring type unpack xpcall arg selfcoroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},
+contains:d.concat([{className:"function",beginKeywords:"function",end:"\\)",contains:[a.inherit(a.TITLE_MODE,{begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params",begin:"\\(",endsWithParent:!0,contains:d}].concat(d)},a.C_NUMBER_MODE,a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,{className:"string",begin:"\\[=*\\[",end:"\\]=*\\]",contains:[b],relevance:5}])}});b.registerLanguage("makefile",function(a){var b={className:"variable",variants:[{begin:"\\$\\("+a.UNDERSCORE_IDENT_RE+"\\)",
+contains:[a.BACKSLASH_ESCAPE]},{begin:/\$[@%<?\^\+\*]/}]};return{aliases:["mk","mak"],keywords:"define endef undefine ifdef ifndef ifeq ifneq else endif include -include sinclude override export unexport private vpath",lexemes:/[\w-]+/,contains:[a.HASH_COMMENT_MODE,b,{className:"string",begin:/"/,end:/"/,contains:[a.BACKSLASH_ESCAPE,b]},{className:"variable",begin:/\$\([\w-]+\s/,end:/\)/,keywords:{built_in:"subst patsubst strip findstring filter filter-out sort word wordlist firstword lastword dir notdir suffix basename addsuffix addprefix join wildcard realpath abspath error warning shell origin flavor foreach if or and call eval file value"},
+contains:[b]},{begin:"^"+a.UNDERSCORE_IDENT_RE+"\\s*[:+?]?=",illegal:"\\n",returnBegin:!0,contains:[{begin:"^"+a.UNDERSCORE_IDENT_RE,end:"[:+?]?=",excludeEnd:!0}]},{className:"meta",begin:/^\.PHONY:/,end:/$/,keywords:{"meta-keyword":".PHONY"},lexemes:/[\.\w]+/},{className:"section",begin:/^[^\s]+:/,end:/$/,contains:[b]}]}});b.registerLanguage("mathematica",function(a){return{aliases:["mma"],lexemes:"(\\$|\\b)"+a.IDENT_RE+"\\b",keywords:"AbelianGroup Abort AbortKernels AbortProtect Above Abs Absolute AbsoluteCorrelation AbsoluteCorrelationFunction AbsoluteCurrentValue AbsoluteDashing AbsoluteFileName AbsoluteOptions AbsolutePointSize AbsoluteThickness AbsoluteTime AbsoluteTiming AccountingForm Accumulate Accuracy AccuracyGoal ActionDelay ActionMenu ActionMenuBox ActionMenuBoxOptions Active ActiveItem ActiveStyle AcyclicGraphQ AddOnHelpPath AddTo AdjacencyGraph AdjacencyList AdjacencyMatrix AdjustmentBox AdjustmentBoxOptions AdjustTimeSeriesForecast AffineTransform After AiryAi AiryAiPrime AiryAiZero AiryBi AiryBiPrime AiryBiZero AlgebraicIntegerQ AlgebraicNumber AlgebraicNumberDenominator AlgebraicNumberNorm AlgebraicNumberPolynomial AlgebraicNumberTrace AlgebraicRules AlgebraicRulesData Algebraics AlgebraicUnitQ Alignment AlignmentMarker AlignmentPoint All AllowedDimensions AllowGroupClose AllowInlineCells AllowKernelInitialization AllowReverseGroupClose AllowScriptLevelChange AlphaChannel AlternatingGroup AlternativeHypothesis Alternatives AmbientLight Analytic AnchoredSearch And AndersonDarlingTest AngerJ AngleBracket AngularGauge Animate AnimationCycleOffset AnimationCycleRepetitions AnimationDirection AnimationDisplayTime AnimationRate AnimationRepetitions AnimationRunning Animator AnimatorBox AnimatorBoxOptions AnimatorElements Annotation Annuity AnnuityDue Antialiasing Antisymmetric Apart ApartSquareFree Appearance AppearanceElements AppellF1 Append AppendTo Apply ArcCos ArcCosh ArcCot ArcCoth ArcCsc ArcCsch ArcSec ArcSech ArcSin ArcSinDistribution ArcSinh ArcTan ArcTanh Arg ArgMax ArgMin ArgumentCountQ ARIMAProcess ArithmeticGeometricMean ARMAProcess ARProcess Array ArrayComponents ArrayDepth ArrayFlatten ArrayPad ArrayPlot ArrayQ ArrayReshape ArrayRules Arrays Arrow Arrow3DBox ArrowBox Arrowheads AspectRatio AspectRatioFixed Assert Assuming Assumptions AstronomicalData Asynchronous AsynchronousTaskObject AsynchronousTasks AtomQ Attributes AugmentedSymmetricPolynomial AutoAction AutoDelete AutoEvaluateEvents AutoGeneratedPackage AutoIndent AutoIndentSpacings AutoItalicWords AutoloadPath AutoMatch Automatic AutomaticImageSize AutoMultiplicationSymbol AutoNumberFormatting AutoOpenNotebooks AutoOpenPalettes AutorunSequencing AutoScaling AutoScroll AutoSpacing AutoStyleOptions AutoStyleWords Axes AxesEdge AxesLabel AxesOrigin AxesStyle Axis BabyMonsterGroupB Back Background BackgroundTasksSettings Backslash Backsubstitution Backward Band BandpassFilter BandstopFilter BarabasiAlbertGraphDistribution BarChart BarChart3D BarLegend BarlowProschanImportance BarnesG BarOrigin BarSpacing BartlettHannWindow BartlettWindow BaseForm Baseline BaselinePosition BaseStyle BatesDistribution BattleLemarieWavelet Because BeckmannDistribution Beep Before Begin BeginDialogPacket BeginFrontEndInteractionPacket BeginPackage BellB BellY Below BenfordDistribution BeniniDistribution BenktanderGibratDistribution BenktanderWeibullDistribution BernoulliB BernoulliDistribution BernoulliGraphDistribution BernoulliProcess BernsteinBasis BesselFilterModel BesselI BesselJ BesselJZero BesselK BesselY BesselYZero Beta BetaBinomialDistribution BetaDistribution BetaNegativeBinomialDistribution BetaPrimeDistribution BetaRegularized BetweennessCentrality BezierCurve BezierCurve3DBox BezierCurve3DBoxOptions BezierCurveBox BezierCurveBoxOptions BezierFunction BilateralFilter Binarize BinaryFormat BinaryImageQ BinaryRead BinaryReadList BinaryWrite BinCounts BinLists Binomial BinomialDistribution BinomialProcess BinormalDistribution BiorthogonalSplineWavelet BipartiteGraphQ BirnbaumImportance BirnbaumSaundersDistribution BitAnd BitClear BitGet BitLength BitNot BitOr BitSet BitShiftLeft BitShiftRight BitXor Black BlackmanHarrisWindow BlackmanNuttallWindow BlackmanWindow Blank BlankForm BlankNullSequence BlankSequence Blend Block BlockRandom BlomqvistBeta BlomqvistBetaTest Blue Blur BodePlot BohmanWindow Bold Bookmarks Boole BooleanConsecutiveFunction BooleanConvert BooleanCountingFunction BooleanFunction BooleanGraph BooleanMaxterms BooleanMinimize BooleanMinterms Booleans BooleanTable BooleanVariables BorderDimensions BorelTannerDistribution Bottom BottomHatTransform BoundaryStyle Bounds Box BoxBaselineShift BoxData BoxDimensions Boxed Boxes BoxForm BoxFormFormatTypes BoxFrame BoxID BoxMargins BoxMatrix BoxRatios BoxRotation BoxRotationPoint BoxStyle BoxWhiskerChart Bra BracketingBar BraKet BrayCurtisDistance BreadthFirstScan Break Brown BrownForsytheTest BrownianBridgeProcess BrowserCategory BSplineBasis BSplineCurve BSplineCurve3DBox BSplineCurveBox BSplineCurveBoxOptions BSplineFunction BSplineSurface BSplineSurface3DBox BubbleChart BubbleChart3D BubbleScale BubbleSizes BulletGauge BusinessDayQ ButterflyGraph ButterworthFilterModel Button ButtonBar ButtonBox ButtonBoxOptions ButtonCell ButtonContents ButtonData ButtonEvaluator ButtonExpandable ButtonFrame ButtonFunction ButtonMargins ButtonMinHeight ButtonNote ButtonNotebook ButtonSource ButtonStyle ButtonStyleMenuListing Byte ByteCount ByteOrdering C CachedValue CacheGraphics CalendarData CalendarType CallPacket CanberraDistance Cancel CancelButton CandlestickChart Cap CapForm CapitalDifferentialD CardinalBSplineBasis CarmichaelLambda Cases Cashflow Casoratian Catalan CatalanNumber Catch CauchyDistribution CauchyWindow CayleyGraph CDF CDFDeploy CDFInformation CDFWavelet Ceiling Cell CellAutoOverwrite CellBaseline CellBoundingBox CellBracketOptions CellChangeTimes CellContents CellContext CellDingbat CellDynamicExpression CellEditDuplicate CellElementsBoundingBox CellElementSpacings CellEpilog CellEvaluationDuplicate CellEvaluationFunction CellEventActions CellFrame CellFrameColor CellFrameLabelMargins CellFrameLabels CellFrameMargins CellGroup CellGroupData CellGrouping CellGroupingRules CellHorizontalScrolling CellID CellLabel CellLabelAutoDelete CellLabelMargins CellLabelPositioning CellMargins CellObject CellOpen CellPrint CellProlog Cells CellSize CellStyle CellTags CellularAutomaton CensoredDistribution Censoring Center CenterDot CentralMoment CentralMomentGeneratingFunction CForm ChampernowneNumber ChanVeseBinarize Character CharacterEncoding CharacterEncodingsPath CharacteristicFunction CharacteristicPolynomial CharacterRange Characters ChartBaseStyle ChartElementData ChartElementDataFunction ChartElementFunction ChartElements ChartLabels ChartLayout ChartLegends ChartStyle Chebyshev1FilterModel Chebyshev2FilterModel ChebyshevDistance ChebyshevT ChebyshevU Check CheckAbort CheckAll Checkbox CheckboxBar CheckboxBox CheckboxBoxOptions ChemicalData ChessboardDistance ChiDistribution ChineseRemainder ChiSquareDistribution ChoiceButtons ChoiceDialog CholeskyDecomposition Chop Circle CircleBox CircleDot CircleMinus CirclePlus CircleTimes CirculantGraph CityData Clear ClearAll ClearAttributes ClearSystemCache ClebschGordan ClickPane Clip ClipboardNotebook ClipFill ClippingStyle ClipPlanes ClipRange Clock ClockGauge ClockwiseContourIntegral Close Closed CloseKernels ClosenessCentrality Closing ClosingAutoSave ClosingEvent ClusteringComponents CMYKColor Coarse Coefficient CoefficientArrays CoefficientDomain CoefficientList CoefficientRules CoifletWavelet Collect Colon ColonForm ColorCombine ColorConvert ColorData ColorDataFunction ColorFunction ColorFunctionScaling Colorize ColorNegate ColorOutput ColorProfileData ColorQuantize ColorReplace ColorRules ColorSelectorSettings ColorSeparate ColorSetter ColorSetterBox ColorSetterBoxOptions ColorSlider ColorSpace Column ColumnAlignments ColumnBackgrounds ColumnForm ColumnLines ColumnsEqual ColumnSpacings ColumnWidths CommonDefaultFormatTypes Commonest CommonestFilter CommonUnits CommunityBoundaryStyle CommunityGraphPlot CommunityLabels CommunityRegionStyle CompatibleUnitQ CompilationOptions CompilationTarget Compile Compiled CompiledFunction Complement CompleteGraph CompleteGraphQ CompleteKaryTree CompletionsListPacket Complex Complexes ComplexExpand ComplexInfinity ComplexityFunction ComponentMeasurements ComponentwiseContextMenu Compose ComposeList ComposeSeries Composition CompoundExpression CompoundPoissonDistribution CompoundPoissonProcess CompoundRenewalProcess Compress CompressedData Condition ConditionalExpression Conditioned Cone ConeBox ConfidenceLevel ConfidenceRange ConfidenceTransform ConfigurationPath Congruent Conjugate ConjugateTranspose Conjunction Connect ConnectedComponents ConnectedGraphQ ConnesWindow ConoverTest ConsoleMessage ConsoleMessagePacket ConsolePrint Constant ConstantArray Constants ConstrainedMax ConstrainedMin ContentPadding ContentsBoundingBox ContentSelectable ContentSize Context ContextMenu Contexts ContextToFilename ContextToFileName Continuation Continue ContinuedFraction ContinuedFractionK ContinuousAction ContinuousMarkovProcess ContinuousTimeModelQ ContinuousWaveletData ContinuousWaveletTransform ContourDetect ContourGraphics ContourIntegral ContourLabels ContourLines ContourPlot ContourPlot3D Contours ContourShading ContourSmoothing ContourStyle ContraharmonicMean Control ControlActive ControlAlignment ControllabilityGramian ControllabilityMatrix ControllableDecomposition ControllableModelQ ControllerDuration ControllerInformation ControllerInformationData ControllerLinking ControllerManipulate ControllerMethod ControllerPath ControllerState ControlPlacement ControlsRendering ControlType Convergents ConversionOptions ConversionRules ConvertToBitmapPacket ConvertToPostScript ConvertToPostScriptPacket Convolve ConwayGroupCo1 ConwayGroupCo2 ConwayGroupCo3 CoordinateChartData CoordinatesToolOptions CoordinateTransform CoordinateTransformData CoprimeQ Coproduct CopulaDistribution Copyable CopyDirectory CopyFile CopyTag CopyToClipboard CornerFilter CornerNeighbors Correlation CorrelationDistance CorrelationFunction CorrelationTest Cos Cosh CoshIntegral CosineDistance CosineWindow CosIntegral Cot Coth Count CounterAssignments CounterBox CounterBoxOptions CounterClockwiseContourIntegral CounterEvaluator CounterFunction CounterIncrements CounterStyle CounterStyleMenuListing CountRoots CountryData Covariance CovarianceEstimatorFunction CovarianceFunction CoxianDistribution CoxIngersollRossProcess CoxModel CoxModelFit CramerVonMisesTest CreateArchive CreateDialog CreateDirectory CreateDocument CreateIntermediateDirectories CreatePalette CreatePalettePacket CreateScheduledTask CreateTemporary CreateWindow CriticalityFailureImportance CriticalitySuccessImportance CriticalSection Cross CrossingDetect CrossMatrix Csc Csch CubeRoot Cubics Cuboid CuboidBox Cumulant CumulantGeneratingFunction Cup CupCap Curl CurlyDoubleQuote CurlyQuote CurrentImage CurrentlySpeakingPacket CurrentValue CurvatureFlowFilter CurveClosed Cyan CycleGraph CycleIndexPolynomial Cycles CyclicGroup Cyclotomic Cylinder CylinderBox CylindricalDecomposition D DagumDistribution DamerauLevenshteinDistance DampingFactor Darker Dashed Dashing DataCompression DataDistribution DataRange DataReversed Date DateDelimiters DateDifference DateFunction DateList DateListLogPlot DateListPlot DatePattern DatePlus DateRange DateString DateTicksFormat DaubechiesWavelet DavisDistribution DawsonF DayCount DayCountConvention DayMatchQ DayName DayPlus DayRange DayRound DeBruijnGraph Debug DebugTag Decimal DeclareKnownSymbols DeclarePackage Decompose Decrement DedekindEta Default DefaultAxesStyle DefaultBaseStyle DefaultBoxStyle DefaultButton DefaultColor DefaultControlPlacement DefaultDuplicateCellStyle DefaultDuration DefaultElement DefaultFaceGridsStyle DefaultFieldHintStyle DefaultFont DefaultFontProperties DefaultFormatType DefaultFormatTypeForStyle DefaultFrameStyle DefaultFrameTicksStyle DefaultGridLinesStyle DefaultInlineFormatType DefaultInputFormatType DefaultLabelStyle DefaultMenuStyle DefaultNaturalLanguage DefaultNewCellStyle DefaultNewInlineCellStyle DefaultNotebook DefaultOptions DefaultOutputFormatType DefaultStyle DefaultStyleDefinitions DefaultTextFormatType DefaultTextInlineFormatType DefaultTicksStyle DefaultTooltipStyle DefaultValues Defer DefineExternal DefineInputStreamMethod DefineOutputStreamMethod Definition Degree DegreeCentrality DegreeGraphDistribution DegreeLexicographic DegreeReverseLexicographic Deinitialization Del Deletable Delete DeleteBorderComponents DeleteCases DeleteContents DeleteDirectory DeleteDuplicates DeleteFile DeleteSmallComponents DeleteWithContents DeletionWarning Delimiter DelimiterFlashTime DelimiterMatching Delimiters Denominator DensityGraphics DensityHistogram DensityPlot DependentVariables Deploy Deployed Depth DepthFirstScan Derivative DerivativeFilter DescriptorStateSpace DesignMatrix Det DGaussianWavelet DiacriticalPositioning Diagonal DiagonalMatrix Dialog DialogIndent DialogInput DialogLevel DialogNotebook DialogProlog DialogReturn DialogSymbols Diamond DiamondMatrix DiceDissimilarity DictionaryLookup DifferenceDelta DifferenceOrder DifferenceRoot DifferenceRootReduce Differences DifferentialD DifferentialRoot DifferentialRootReduce DifferentiatorFilter DigitBlock DigitBlockMinimum DigitCharacter DigitCount DigitQ DihedralGroup Dilation Dimensions DiracComb DiracDelta DirectedEdge DirectedEdges DirectedGraph DirectedGraphQ DirectedInfinity Direction Directive Directory DirectoryName DirectoryQ DirectoryStack DirichletCharacter DirichletConvolve DirichletDistribution DirichletL DirichletTransform DirichletWindow DisableConsolePrintPacket DiscreteChirpZTransform DiscreteConvolve DiscreteDelta DiscreteHadamardTransform DiscreteIndicator DiscreteLQEstimatorGains DiscreteLQRegulatorGains DiscreteLyapunovSolve DiscreteMarkovProcess DiscretePlot DiscretePlot3D DiscreteRatio DiscreteRiccatiSolve DiscreteShift DiscreteTimeModelQ DiscreteUniformDistribution DiscreteVariables DiscreteWaveletData DiscreteWaveletPacketTransform DiscreteWaveletTransform Discriminant Disjunction Disk DiskBox DiskMatrix Dispatch DispersionEstimatorFunction Display DisplayAllSteps DisplayEndPacket DisplayFlushImagePacket DisplayForm DisplayFunction DisplayPacket DisplayRules DisplaySetSizePacket DisplayString DisplayTemporary DisplayWith DisplayWithRef DisplayWithVariable DistanceFunction DistanceTransform Distribute Distributed DistributedContexts DistributeDefinitions DistributionChart DistributionDomain DistributionFitTest DistributionParameterAssumptions DistributionParameterQ Dithering Div Divergence Divide DivideBy Dividers Divisible Divisors DivisorSigma DivisorSum DMSList DMSString Do DockedCells DocumentNotebook DominantColors DOSTextFormat Dot DotDashed DotEqual Dotted DoubleBracketingBar DoubleContourIntegral DoubleDownArrow DoubleLeftArrow DoubleLeftRightArrow DoubleLeftTee DoubleLongLeftArrow DoubleLongLeftRightArrow DoubleLongRightArrow DoubleRightArrow DoubleRightTee DoubleUpArrow DoubleUpDownArrow DoubleVerticalBar DoublyInfinite Down DownArrow DownArrowBar DownArrowUpArrow DownLeftRightVector DownLeftTeeVector DownLeftVector DownLeftVectorBar DownRightTeeVector DownRightVector DownRightVectorBar Downsample DownTee DownTeeArrow DownValues DragAndDrop DrawEdges DrawFrontFaces DrawHighlighted Drop DSolve Dt DualLinearProgramming DualSystemsModel DumpGet DumpSave DuplicateFreeQ Dynamic DynamicBox DynamicBoxOptions DynamicEvaluationTimeout DynamicLocation DynamicModule DynamicModuleBox DynamicModuleBoxOptions DynamicModuleParent DynamicModuleValues DynamicName DynamicNamespace DynamicReference DynamicSetting DynamicUpdating DynamicWrapper DynamicWrapperBox DynamicWrapperBoxOptions E EccentricityCentrality EdgeAdd EdgeBetweennessCentrality EdgeCapacity EdgeCapForm EdgeColor EdgeConnectivity EdgeCost EdgeCount EdgeCoverQ EdgeDashing EdgeDelete EdgeDetect EdgeForm EdgeIndex EdgeJoinForm EdgeLabeling EdgeLabels EdgeLabelStyle EdgeList EdgeOpacity EdgeQ EdgeRenderingFunction EdgeRules EdgeShapeFunction EdgeStyle EdgeThickness EdgeWeight Editable EditButtonSettings EditCellTagsSettings EditDistance EffectiveInterest Eigensystem Eigenvalues EigenvectorCentrality Eigenvectors Element ElementData Eliminate EliminationOrder EllipticE EllipticExp EllipticExpPrime EllipticF EllipticFilterModel EllipticK EllipticLog EllipticNomeQ EllipticPi EllipticReducedHalfPeriods EllipticTheta EllipticThetaPrime EmitSound EmphasizeSyntaxErrors EmpiricalDistribution Empty EmptyGraphQ EnableConsolePrintPacket Enabled Encode End EndAdd EndDialogPacket EndFrontEndInteractionPacket EndOfFile EndOfLine EndOfString EndPackage EngineeringForm Enter EnterExpressionPacket EnterTextPacket Entropy EntropyFilter Environment Epilog Equal EqualColumns EqualRows EqualTilde EquatedTo Equilibrium EquirippleFilterKernel Equivalent Erf Erfc Erfi ErlangB ErlangC ErlangDistribution Erosion ErrorBox ErrorBoxOptions ErrorNorm ErrorPacket ErrorsDialogSettings EstimatedDistribution EstimatedProcess EstimatorGains EstimatorRegulator EuclideanDistance EulerE EulerGamma EulerianGraphQ EulerPhi Evaluatable Evaluate Evaluated EvaluatePacket EvaluationCell EvaluationCompletionAction EvaluationElements EvaluationMode EvaluationMonitor EvaluationNotebook EvaluationObject EvaluationOrder Evaluator EvaluatorNames EvenQ EventData EventEvaluator EventHandler EventHandlerTag EventLabels ExactBlackmanWindow ExactNumberQ ExactRootIsolation ExampleData Except ExcludedForms ExcludePods Exclusions ExclusionsStyle Exists Exit ExitDialog Exp Expand ExpandAll ExpandDenominator ExpandFileName ExpandNumerator Expectation ExpectationE ExpectedValue ExpGammaDistribution ExpIntegralE ExpIntegralEi Exponent ExponentFunction ExponentialDistribution ExponentialFamily ExponentialGeneratingFunction ExponentialMovingAverage ExponentialPowerDistribution ExponentPosition ExponentStep Export ExportAutoReplacements ExportPacket ExportString Expression ExpressionCell ExpressionPacket ExpToTrig ExtendedGCD Extension ExtentElementFunction ExtentMarkers ExtentSize ExternalCall ExternalDataCharacterEncoding Extract ExtractArchive ExtremeValueDistribution FaceForm FaceGrids FaceGridsStyle Factor FactorComplete Factorial Factorial2 FactorialMoment FactorialMomentGeneratingFunction FactorialPower FactorInteger FactorList FactorSquareFree FactorSquareFreeList FactorTerms FactorTermsList Fail FailureDistribution False FARIMAProcess FEDisableConsolePrintPacket FeedbackSector FeedbackSectorStyle FeedbackType FEEnableConsolePrintPacket Fibonacci FieldHint FieldHintStyle FieldMasked FieldSize File FileBaseName FileByteCount FileDate FileExistsQ FileExtension FileFormat FileHash FileInformation FileName FileNameDepth FileNameDialogSettings FileNameDrop FileNameJoin FileNames FileNameSetter FileNameSplit FileNameTake FilePrint FileType FilledCurve FilledCurveBox Filling FillingStyle FillingTransform FilterRules FinancialBond FinancialData FinancialDerivative FinancialIndicator Find FindArgMax FindArgMin FindClique FindClusters FindCurvePath FindDistributionParameters FindDivisions FindEdgeCover FindEdgeCut FindEulerianCycle FindFaces FindFile FindFit FindGeneratingFunction FindGeoLocation FindGeometricTransform FindGraphCommunities FindGraphIsomorphism FindGraphPartition FindHamiltonianCycle FindIndependentEdgeSet FindIndependentVertexSet FindInstance FindIntegerNullVector FindKClan FindKClique FindKClub FindKPlex FindLibrary FindLinearRecurrence FindList FindMaximum FindMaximumFlow FindMaxValue FindMinimum FindMinimumCostFlow FindMinimumCut FindMinValue FindPermutation FindPostmanTour FindProcessParameters FindRoot FindSequenceFunction FindSettings FindShortestPath FindShortestTour FindThreshold FindVertexCover FindVertexCut Fine FinishDynamic FiniteAbelianGroupCount FiniteGroupCount FiniteGroupData First FirstPassageTimeDistribution FischerGroupFi22 FischerGroupFi23 FischerGroupFi24Prime FisherHypergeometricDistribution FisherRatioTest FisherZDistribution Fit FitAll FittedModel FixedPoint FixedPointList FlashSelection Flat Flatten FlattenAt FlatTopWindow FlipView Floor FlushPrintOutputPacket Fold FoldList Font FontColor FontFamily FontForm FontName FontOpacity FontPostScriptName FontProperties FontReencoding FontSize FontSlant FontSubstitutions FontTracking FontVariations FontWeight For ForAll Format FormatRules FormatType FormatTypeAutoConvert FormatValues FormBox FormBoxOptions FortranForm Forward ForwardBackward Fourier FourierCoefficient FourierCosCoefficient FourierCosSeries FourierCosTransform FourierDCT FourierDCTFilter FourierDCTMatrix FourierDST FourierDSTMatrix FourierMatrix FourierParameters FourierSequenceTransform FourierSeries FourierSinCoefficient FourierSinSeries FourierSinTransform FourierTransform FourierTrigSeries FractionalBrownianMotionProcess FractionalPart FractionBox FractionBoxOptions FractionLine Frame FrameBox FrameBoxOptions Framed FrameInset FrameLabel Frameless FrameMargins FrameStyle FrameTicks FrameTicksStyle FRatioDistribution FrechetDistribution FreeQ FrequencySamplingFilterKernel FresnelC FresnelS Friday FrobeniusNumber FrobeniusSolve FromCharacterCode FromCoefficientRules FromContinuedFraction FromDate FromDigits FromDMS Front FrontEndDynamicExpression FrontEndEventActions FrontEndExecute FrontEndObject FrontEndResource FrontEndResourceString FrontEndStackSize FrontEndToken FrontEndTokenExecute FrontEndValueCache FrontEndVersion FrontFaceColor FrontFaceOpacity Full FullAxes FullDefinition FullForm FullGraphics FullOptions FullSimplify Function FunctionExpand FunctionInterpolation FunctionSpace FussellVeselyImportance GaborFilter GaborMatrix GaborWavelet GainMargins GainPhaseMargins Gamma GammaDistribution GammaRegularized GapPenalty Gather GatherBy GaugeFaceElementFunction GaugeFaceStyle GaugeFrameElementFunction GaugeFrameSize GaugeFrameStyle GaugeLabels GaugeMarkers GaugeStyle GaussianFilter GaussianIntegers GaussianMatrix GaussianWindow GCD GegenbauerC General GeneralizedLinearModelFit GenerateConditions GeneratedCell GeneratedParameters GeneratingFunction Generic GenericCylindricalDecomposition GenomeData GenomeLookup GeodesicClosing GeodesicDilation GeodesicErosion GeodesicOpening GeoDestination GeodesyData GeoDirection GeoDistance GeoGridPosition GeometricBrownianMotionProcess GeometricDistribution GeometricMean GeometricMeanFilter GeometricTransformation GeometricTransformation3DBox GeometricTransformation3DBoxOptions GeometricTransformationBox GeometricTransformationBoxOptions GeoPosition GeoPositionENU GeoPositionXYZ GeoProjectionData GestureHandler GestureHandlerTag Get GetBoundingBoxSizePacket GetContext GetEnvironment GetFileName GetFrontEndOptionsDataPacket GetLinebreakInformationPacket GetMenusPacket GetPageBreakInformationPacket Glaisher GlobalClusteringCoefficient GlobalPreferences GlobalSession Glow GoldenRatio GompertzMakehamDistribution GoodmanKruskalGamma GoodmanKruskalGammaTest Goto Grad Gradient GradientFilter GradientOrientationFilter Graph GraphAssortativity GraphCenter GraphComplement GraphData GraphDensity GraphDiameter GraphDifference GraphDisjointUnion GraphDistance GraphDistanceMatrix GraphElementData GraphEmbedding GraphHighlight GraphHighlightStyle GraphHub Graphics Graphics3D Graphics3DBox Graphics3DBoxOptions GraphicsArray GraphicsBaseline GraphicsBox GraphicsBoxOptions GraphicsColor GraphicsColumn GraphicsComplex GraphicsComplex3DBox GraphicsComplex3DBoxOptions GraphicsComplexBox GraphicsComplexBoxOptions GraphicsContents GraphicsData GraphicsGrid GraphicsGridBox GraphicsGroup GraphicsGroup3DBox GraphicsGroup3DBoxOptions GraphicsGroupBox GraphicsGroupBoxOptions GraphicsGrouping GraphicsHighlightColor GraphicsRow GraphicsSpacing GraphicsStyle GraphIntersection GraphLayout GraphLinkEfficiency GraphPeriphery GraphPlot GraphPlot3D GraphPower GraphPropertyDistribution GraphQ GraphRadius GraphReciprocity GraphRoot GraphStyle GraphUnion Gray GrayLevel GreatCircleDistance Greater GreaterEqual GreaterEqualLess GreaterFullEqual GreaterGreater GreaterLess GreaterSlantEqual GreaterTilde Green Grid GridBaseline GridBox GridBoxAlignment GridBoxBackground GridBoxDividers GridBoxFrame GridBoxItemSize GridBoxItemStyle GridBoxOptions GridBoxSpacings GridCreationSettings GridDefaultElement GridElementStyleOptions GridFrame GridFrameMargins GridGraph GridLines GridLinesStyle GroebnerBasis GroupActionBase GroupCentralizer GroupElementFromWord GroupElementPosition GroupElementQ GroupElements GroupElementToWord GroupGenerators GroupMultiplicationTable GroupOrbits GroupOrder GroupPageBreakWithin GroupSetwiseStabilizer GroupStabilizer GroupStabilizerChain Gudermannian GumbelDistribution HaarWavelet HadamardMatrix HalfNormalDistribution HamiltonianGraphQ HammingDistance HammingWindow HankelH1 HankelH2 HankelMatrix HannPoissonWindow HannWindow HaradaNortonGroupHN HararyGraph HarmonicMean HarmonicMeanFilter HarmonicNumber Hash HashTable Haversine HazardFunction Head HeadCompose Heads HeavisideLambda HeavisidePi HeavisideTheta HeldGroupHe HeldPart HelpBrowserLookup HelpBrowserNotebook HelpBrowserSettings HermiteDecomposition HermiteH HermitianMatrixQ HessenbergDecomposition Hessian HexadecimalCharacter Hexahedron HexahedronBox HexahedronBoxOptions HiddenSurface HighlightGraph HighlightImage HighpassFilter HigmanSimsGroupHS HilbertFilter HilbertMatrix Histogram Histogram3D HistogramDistribution HistogramList HistogramTransform HistogramTransformInterpolation HitMissTransform HITSCentrality HodgeDual HoeffdingD HoeffdingDTest Hold HoldAll HoldAllComplete HoldComplete HoldFirst HoldForm HoldPattern HoldRest HolidayCalendar HomeDirectory HomePage Horizontal HorizontalForm HorizontalGauge HorizontalScrollPosition HornerForm HotellingTSquareDistribution HoytDistribution HTMLSave Hue HumpDownHump HumpEqual HurwitzLerchPhi HurwitzZeta HyperbolicDistribution HypercubeGraph HyperexponentialDistribution Hyperfactorial Hypergeometric0F1 Hypergeometric0F1Regularized Hypergeometric1F1 Hypergeometric1F1Regularized Hypergeometric2F1 Hypergeometric2F1Regularized HypergeometricDistribution HypergeometricPFQ HypergeometricPFQRegularized HypergeometricU Hyperlink HyperlinkCreationSettings Hyphenation HyphenationOptions HypoexponentialDistribution HypothesisTestData I Identity IdentityMatrix If IgnoreCase Im Image Image3D Image3DSlices ImageAccumulate ImageAdd ImageAdjust ImageAlign ImageApply ImageAspectRatio ImageAssemble ImageCache ImageCacheValid ImageCapture ImageChannels ImageClip ImageColorSpace ImageCompose ImageConvolve ImageCooccurrence ImageCorners ImageCorrelate ImageCorrespondingPoints ImageCrop ImageData ImageDataPacket ImageDeconvolve ImageDemosaic ImageDifference ImageDimensions ImageDistance ImageEffect ImageFeatureTrack ImageFileApply ImageFileFilter ImageFileScan ImageFilter ImageForestingComponents ImageForwardTransformation ImageHistogram ImageKeypoints ImageLevels ImageLines ImageMargins ImageMarkers ImageMeasurements ImageMultiply ImageOffset ImagePad ImagePadding ImagePartition ImagePeriodogram ImagePerspectiveTransformation ImageQ ImageRangeCache ImageReflect ImageRegion ImageResize ImageResolution ImageRotate ImageRotated ImageScaled ImageScan ImageSize ImageSizeAction ImageSizeCache ImageSizeMultipliers ImageSizeRaw ImageSubtract ImageTake ImageTransformation ImageTrim ImageType ImageValue ImageValuePositions Implies Import ImportAutoReplacements ImportString ImprovementImportance In IncidenceGraph IncidenceList IncidenceMatrix IncludeConstantBasis IncludeFileExtension IncludePods IncludeSingularTerm Increment Indent IndentingNewlineSpacings IndentMaxFraction IndependenceTest IndependentEdgeSetQ IndependentUnit IndependentVertexSetQ Indeterminate IndexCreationOptions Indexed IndexGraph IndexTag Inequality InexactNumberQ InexactNumbers Infinity Infix Information Inherited InheritScope Initialization InitializationCell InitializationCellEvaluation InitializationCellWarning InlineCounterAssignments InlineCounterIncrements InlineRules Inner Inpaint Input InputAliases InputAssumptions InputAutoReplacements InputField InputFieldBox InputFieldBoxOptions InputForm InputGrouping InputNamePacket InputNotebook InputPacket InputSettings InputStream InputString InputStringPacket InputToBoxFormPacket Insert InsertionPointObject InsertResults Inset Inset3DBox Inset3DBoxOptions InsetBox InsetBoxOptions Install InstallService InString Integer IntegerDigits IntegerExponent IntegerLength IntegerPart IntegerPartitions IntegerQ Integers IntegerString Integral Integrate Interactive InteractiveTradingChart Interlaced Interleaving InternallyBalancedDecomposition InterpolatingFunction InterpolatingPolynomial Interpolation InterpolationOrder InterpolationPoints InterpolationPrecision Interpretation InterpretationBox InterpretationBoxOptions InterpretationFunction InterpretTemplate InterquartileRange Interrupt InterruptSettings Intersection Interval IntervalIntersection IntervalMemberQ IntervalUnion Inverse InverseBetaRegularized InverseCDF InverseChiSquareDistribution InverseContinuousWaveletTransform InverseDistanceTransform InverseEllipticNomeQ InverseErf InverseErfc InverseFourier InverseFourierCosTransform InverseFourierSequenceTransform InverseFourierSinTransform InverseFourierTransform InverseFunction InverseFunctions InverseGammaDistribution InverseGammaRegularized InverseGaussianDistribution InverseGudermannian InverseHaversine InverseJacobiCD InverseJacobiCN InverseJacobiCS InverseJacobiDC InverseJacobiDN InverseJacobiDS InverseJacobiNC InverseJacobiND InverseJacobiNS InverseJacobiSC InverseJacobiSD InverseJacobiSN InverseLaplaceTransform InversePermutation InverseRadon InverseSeries InverseSurvivalFunction InverseWaveletTransform InverseWeierstrassP InverseZTransform Invisible InvisibleApplication InvisibleTimes IrreduciblePolynomialQ IsolatingInterval IsomorphicGraphQ IsotopeData Italic Item ItemBox ItemBoxOptions ItemSize ItemStyle ItoProcess JaccardDissimilarity JacobiAmplitude Jacobian JacobiCD JacobiCN JacobiCS JacobiDC JacobiDN JacobiDS JacobiNC JacobiND JacobiNS JacobiP JacobiSC JacobiSD JacobiSN JacobiSymbol JacobiZeta JankoGroupJ1 JankoGroupJ2 JankoGroupJ3 JankoGroupJ4 JarqueBeraALMTest JohnsonDistribution Join Joined JoinedCurve JoinedCurveBox JoinForm JordanDecomposition JordanModelDecomposition K KagiChart KaiserBesselWindow KaiserWindow KalmanEstimator KalmanFilter KarhunenLoeveDecomposition KaryTree KatzCentrality KCoreComponents KDistribution KelvinBei KelvinBer KelvinKei KelvinKer KendallTau KendallTauTest KernelExecute KernelMixtureDistribution KernelObject Kernels Ket Khinchin KirchhoffGraph KirchhoffMatrix KleinInvariantJ KnightTourGraph KnotData KnownUnitQ KolmogorovSmirnovTest KroneckerDelta KroneckerModelDecomposition KroneckerProduct KroneckerSymbol KuiperTest KumaraswamyDistribution Kurtosis KuwaharaFilter Label Labeled LabeledSlider LabelingFunction LabelStyle LaguerreL LambdaComponents LambertW LanczosWindow LandauDistribution Language LanguageCategory LaplaceDistribution LaplaceTransform Laplacian LaplacianFilter LaplacianGaussianFilter Large Larger Last Latitude LatitudeLongitude LatticeData LatticeReduce Launch LaunchKernels LayeredGraphPlot LayerSizeFunction LayoutInformation LCM LeafCount LeapYearQ LeastSquares LeastSquaresFilterKernel Left LeftArrow LeftArrowBar LeftArrowRightArrow LeftDownTeeVector LeftDownVector LeftDownVectorBar LeftRightArrow LeftRightVector LeftTee LeftTeeArrow LeftTeeVector LeftTriangle LeftTriangleBar LeftTriangleEqual LeftUpDownVector LeftUpTeeVector LeftUpVector LeftUpVectorBar LeftVector LeftVectorBar LegendAppearance Legended LegendFunction LegendLabel LegendLayout LegendMargins LegendMarkers LegendMarkerSize LegendreP LegendreQ LegendreType Length LengthWhile LerchPhi Less LessEqual LessEqualGreater LessFullEqual LessGreater LessLess LessSlantEqual LessTilde LetterCharacter LetterQ Level LeveneTest LeviCivitaTensor LevyDistribution Lexicographic LibraryFunction LibraryFunctionError LibraryFunctionInformation LibraryFunctionLoad LibraryFunctionUnload LibraryLoad LibraryUnload LicenseID LiftingFilterData LiftingWaveletTransform LightBlue LightBrown LightCyan Lighter LightGray LightGreen Lighting LightingAngle LightMagenta LightOrange LightPink LightPurple LightRed LightSources LightYellow Likelihood Limit LimitsPositioning LimitsPositioningTokens LindleyDistribution Line Line3DBox LinearFilter LinearFractionalTransform LinearModelFit LinearOffsetFunction LinearProgramming LinearRecurrence LinearSolve LinearSolveFunction LineBox LineBreak LinebreakAdjustments LineBreakChart LineBreakWithin LineColor LineForm LineGraph LineIndent LineIndentMaxFraction LineIntegralConvolutionPlot LineIntegralConvolutionScale LineLegend LineOpacity LineSpacing LineWrapParts LinkActivate LinkClose LinkConnect LinkConnectedQ LinkCreate LinkError LinkFlush LinkFunction LinkHost LinkInterrupt LinkLaunch LinkMode LinkObject LinkOpen LinkOptions LinkPatterns LinkProtocol LinkRead LinkReadHeld LinkReadyQ Links LinkWrite LinkWriteHeld LiouvilleLambda List Listable ListAnimate ListContourPlot ListContourPlot3D ListConvolve ListCorrelate ListCurvePathPlot ListDeconvolve ListDensityPlot Listen ListFourierSequenceTransform ListInterpolation ListLineIntegralConvolutionPlot ListLinePlot ListLogLinearPlot ListLogLogPlot ListLogPlot ListPicker ListPickerBox ListPickerBoxBackground ListPickerBoxOptions ListPlay ListPlot ListPlot3D ListPointPlot3D ListPolarPlot ListQ ListStreamDensityPlot ListStreamPlot ListSurfacePlot3D ListVectorDensityPlot ListVectorPlot ListVectorPlot3D ListZTransform Literal LiteralSearch LocalClusteringCoefficient LocalizeVariables LocationEquivalenceTest LocationTest Locator LocatorAutoCreate LocatorBox LocatorBoxOptions LocatorCentering LocatorPane LocatorPaneBox LocatorPaneBoxOptions LocatorRegion Locked Log Log10 Log2 LogBarnesG LogGamma LogGammaDistribution LogicalExpand LogIntegral LogisticDistribution LogitModelFit LogLikelihood LogLinearPlot LogLogisticDistribution LogLogPlot LogMultinormalDistribution LogNormalDistribution LogPlot LogRankTest LogSeriesDistribution LongEqual Longest LongestAscendingSequence LongestCommonSequence LongestCommonSequencePositions LongestCommonSubsequence LongestCommonSubsequencePositions LongestMatch LongForm Longitude LongLeftArrow LongLeftRightArrow LongRightArrow Loopback LoopFreeGraphQ LowerCaseQ LowerLeftArrow LowerRightArrow LowerTriangularize LowpassFilter LQEstimatorGains LQGRegulator LQOutputRegulatorGains LQRegulatorGains LUBackSubstitution LucasL LuccioSamiComponents LUDecomposition LyapunovSolve LyonsGroupLy MachineID MachineName MachineNumberQ MachinePrecision MacintoshSystemPageSetup Magenta Magnification Magnify MainSolve MaintainDynamicCaches Majority MakeBoxes MakeExpression MakeRules MangoldtLambda ManhattanDistance Manipulate Manipulator MannWhitneyTest MantissaExponent Manual Map MapAll MapAt MapIndexed MAProcess MapThread MarcumQ MardiaCombinedTest MardiaKurtosisTest MardiaSkewnessTest MarginalDistribution MarkovProcessProperties Masking MatchingDissimilarity MatchLocalNameQ MatchLocalNames MatchQ Material MathematicaNotation MathieuC MathieuCharacteristicA MathieuCharacteristicB MathieuCharacteristicExponent MathieuCPrime MathieuGroupM11 MathieuGroupM12 MathieuGroupM22 MathieuGroupM23 MathieuGroupM24 MathieuS MathieuSPrime MathMLForm MathMLText Matrices MatrixExp MatrixForm MatrixFunction MatrixLog MatrixPlot MatrixPower MatrixQ MatrixRank Max MaxBend MaxDetect MaxExtraBandwidths MaxExtraConditions MaxFeatures MaxFilter Maximize MaxIterations MaxMemoryUsed MaxMixtureKernels MaxPlotPoints MaxPoints MaxRecursion MaxStableDistribution MaxStepFraction MaxSteps MaxStepSize MaxValue MaxwellDistribution McLaughlinGroupMcL Mean MeanClusteringCoefficient MeanDegreeConnectivity MeanDeviation MeanFilter MeanGraphDistance MeanNeighborDegree MeanShift MeanShiftFilter Median MedianDeviation MedianFilter Medium MeijerG MeixnerDistribution MemberQ MemoryConstrained MemoryInUse Menu MenuAppearance MenuCommandKey MenuEvaluator MenuItem MenuPacket MenuSortingValue MenuStyle MenuView MergeDifferences Mesh MeshFunctions MeshRange MeshShading MeshStyle Message MessageDialog MessageList MessageName MessageOptions MessagePacket Messages MessagesNotebook MetaCharacters MetaInformation Method MethodOptions MexicanHatWavelet MeyerWavelet Min MinDetect MinFilter MinimalPolynomial MinimalStateSpaceModel Minimize Minors MinRecursion MinSize MinStableDistribution Minus MinusPlus MinValue Missing MissingDataMethod MittagLefflerE MixedRadix MixedRadixQuantity MixtureDistribution Mod Modal Mode Modular ModularLambda Module Modulus MoebiusMu Moment Momentary MomentConvert MomentEvaluate MomentGeneratingFunction Monday Monitor MonomialList MonomialOrder MonsterGroupM MorletWavelet MorphologicalBinarize MorphologicalBranchPoints MorphologicalComponents MorphologicalEulerNumber MorphologicalGraph MorphologicalPerimeter MorphologicalTransform Most MouseAnnotation MouseAppearance MouseAppearanceTag MouseButtons Mouseover MousePointerNote MousePosition MovingAverage MovingMedian MoyalDistribution MultiedgeStyle MultilaunchWarning MultiLetterItalics MultiLetterStyle MultilineFunction Multinomial MultinomialDistribution MultinormalDistribution MultiplicativeOrder Multiplicity Multiselection MultivariateHypergeometricDistribution MultivariatePoissonDistribution MultivariateTDistribution N NakagamiDistribution NameQ Names NamespaceBox Nand NArgMax NArgMin NBernoulliB NCache NDSolve NDSolveValue Nearest NearestFunction NeedCurrentFrontEndPackagePacket NeedCurrentFrontEndSymbolsPacket NeedlemanWunschSimilarity Needs Negative NegativeBinomialDistribution NegativeMultinomialDistribution NeighborhoodGraph Nest NestedGreaterGreater NestedLessLess NestedScriptRules NestList NestWhile NestWhileList NevilleThetaC NevilleThetaD NevilleThetaN NevilleThetaS NewPrimitiveStyle NExpectation Next NextPrime NHoldAll NHoldFirst NHoldRest NicholsGridLines NicholsPlot NIntegrate NMaximize NMaxValue NMinimize NMinValue NominalVariables NonAssociative NoncentralBetaDistribution NoncentralChiSquareDistribution NoncentralFRatioDistribution NoncentralStudentTDistribution NonCommutativeMultiply NonConstants None NonlinearModelFit NonlocalMeansFilter NonNegative NonPositive Nor NorlundB Norm Normal NormalDistribution NormalGrouping Normalize NormalizedSquaredEuclideanDistance NormalsFunction NormFunction Not NotCongruent NotCupCap NotDoubleVerticalBar Notebook NotebookApply NotebookAutoSave NotebookClose NotebookConvertSettings NotebookCreate NotebookCreateReturnObject NotebookDefault NotebookDelete NotebookDirectory NotebookDynamicExpression NotebookEvaluate NotebookEventActions NotebookFileName NotebookFind NotebookFindReturnObject NotebookGet NotebookGetLayoutInformationPacket NotebookGetMisspellingsPacket NotebookInformation NotebookInterfaceObject NotebookLocate NotebookObject NotebookOpen NotebookOpenReturnObject NotebookPath NotebookPrint NotebookPut NotebookPutReturnObject NotebookRead NotebookResetGeneratedCells Notebooks NotebookSave NotebookSaveAs NotebookSelection NotebookSetupLayoutInformationPacket NotebooksMenu NotebookWrite NotElement NotEqualTilde NotExists NotGreater NotGreaterEqual NotGreaterFullEqual NotGreaterGreater NotGreaterLess NotGreaterSlantEqual NotGreaterTilde NotHumpDownHump NotHumpEqual NotLeftTriangle NotLeftTriangleBar NotLeftTriangleEqual NotLess NotLessEqual NotLessFullEqual NotLessGreater NotLessLess NotLessSlantEqual NotLessTilde NotNestedGreaterGreater NotNestedLessLess NotPrecedes NotPrecedesEqual NotPrecedesSlantEqual NotPrecedesTilde NotReverseElement NotRightTriangle NotRightTriangleBar NotRightTriangleEqual NotSquareSubset NotSquareSubsetEqual NotSquareSuperset NotSquareSupersetEqual NotSubset NotSubsetEqual NotSucceeds NotSucceedsEqual NotSucceedsSlantEqual NotSucceedsTilde NotSuperset NotSupersetEqual NotTilde NotTildeEqual NotTildeFullEqual NotTildeTilde NotVerticalBar NProbability NProduct NProductFactors NRoots NSolve NSum NSumTerms Null NullRecords NullSpace NullWords Number NumberFieldClassNumber NumberFieldDiscriminant NumberFieldFundamentalUnits NumberFieldIntegralBasis NumberFieldNormRepresentatives NumberFieldRegulator NumberFieldRootsOfUnity NumberFieldSignature NumberForm NumberFormat NumberMarks NumberMultiplier NumberPadding NumberPoint NumberQ NumberSeparator NumberSigns NumberString Numerator NumericFunction NumericQ NuttallWindow NValues NyquistGridLines NyquistPlot O ObservabilityGramian ObservabilityMatrix ObservableDecomposition ObservableModelQ OddQ Off Offset OLEData On ONanGroupON OneIdentity Opacity Open OpenAppend Opener OpenerBox OpenerBoxOptions OpenerView OpenFunctionInspectorPacket Opening OpenRead OpenSpecialOptions OpenTemporary OpenWrite Operate OperatingSystem OptimumFlowData Optional OptionInspectorSettings OptionQ Options OptionsPacket OptionsPattern OptionValue OptionValueBox OptionValueBoxOptions Or Orange Order OrderDistribution OrderedQ Ordering Orderless OrnsteinUhlenbeckProcess Orthogonalize Out Outer OutputAutoOverwrite OutputControllabilityMatrix OutputControllableModelQ OutputForm OutputFormData OutputGrouping OutputMathEditExpression OutputNamePacket OutputResponse OutputSizeLimit OutputStream Over OverBar OverDot Overflow OverHat Overlaps Overlay OverlayBox OverlayBoxOptions Overscript OverscriptBox OverscriptBoxOptions OverTilde OverVector OwenT OwnValues PackingMethod PaddedForm Padding PadeApproximant PadLeft PadRight PageBreakAbove PageBreakBelow PageBreakWithin PageFooterLines PageFooters PageHeaderLines PageHeaders PageHeight PageRankCentrality PageWidth PairedBarChart PairedHistogram PairedSmoothHistogram PairedTTest PairedZTest PaletteNotebook PalettePath Pane PaneBox PaneBoxOptions Panel PanelBox PanelBoxOptions Paneled PaneSelector PaneSelectorBox PaneSelectorBoxOptions PaperWidth ParabolicCylinderD ParagraphIndent ParagraphSpacing ParallelArray ParallelCombine ParallelDo ParallelEvaluate Parallelization Parallelize ParallelMap ParallelNeeds ParallelProduct ParallelSubmit ParallelSum ParallelTable ParallelTry Parameter ParameterEstimator ParameterMixtureDistribution ParameterVariables ParametricFunction ParametricNDSolve ParametricNDSolveValue ParametricPlot ParametricPlot3D ParentConnect ParentDirectory ParentForm Parenthesize ParentList ParetoDistribution Part PartialCorrelationFunction PartialD ParticleData Partition PartitionsP PartitionsQ ParzenWindow PascalDistribution PassEventsDown PassEventsUp Paste PasteBoxFormInlineCells PasteButton Path PathGraph PathGraphQ Pattern PatternSequence PatternTest PauliMatrix PaulWavelet Pause PausedTime PDF PearsonChiSquareTest PearsonCorrelationTest PearsonDistribution PerformanceGoal PeriodicInterpolation Periodogram PeriodogramArray PermutationCycles PermutationCyclesQ PermutationGroup PermutationLength PermutationList PermutationListQ PermutationMax PermutationMin PermutationOrder PermutationPower PermutationProduct PermutationReplace Permutations PermutationSupport Permute PeronaMalikFilter Perpendicular PERTDistribution PetersenGraph PhaseMargins Pi Pick PIDData PIDDerivativeFilter PIDFeedforward PIDTune Piecewise PiecewiseExpand PieChart PieChart3D PillaiTrace PillaiTraceTest Pink Pivoting PixelConstrained PixelValue PixelValuePositions Placed Placeholder PlaceholderReplace Plain PlanarGraphQ Play PlayRange Plot Plot3D Plot3Matrix PlotDivision PlotJoined PlotLabel PlotLayout PlotLegends PlotMarkers PlotPoints PlotRange PlotRangeClipping PlotRangePadding PlotRegion PlotStyle Plus PlusMinus Pochhammer PodStates PodWidth Point Point3DBox PointBox PointFigureChart PointForm PointLegend PointSize PoissonConsulDistribution PoissonDistribution PoissonProcess PoissonWindow PolarAxes PolarAxesOrigin PolarGridLines PolarPlot PolarTicks PoleZeroMarkers PolyaAeppliDistribution PolyGamma Polygon Polygon3DBox Polygon3DBoxOptions PolygonBox PolygonBoxOptions PolygonHoleScale PolygonIntersections PolygonScale PolyhedronData PolyLog PolynomialExtendedGCD PolynomialForm PolynomialGCD PolynomialLCM PolynomialMod PolynomialQ PolynomialQuotient PolynomialQuotientRemainder PolynomialReduce PolynomialRemainder Polynomials PopupMenu PopupMenuBox PopupMenuBoxOptions PopupView PopupWindow Position Positive PositiveDefiniteMatrixQ PossibleZeroQ Postfix PostScript Power PowerDistribution PowerExpand PowerMod PowerModList PowerSpectralDensity PowersRepresentations PowerSymmetricPolynomial Precedence PrecedenceForm Precedes PrecedesEqual PrecedesSlantEqual PrecedesTilde Precision PrecisionGoal PreDecrement PredictionRoot PreemptProtect PreferencesPath Prefix PreIncrement Prepend PrependTo PreserveImageOptions Previous PriceGraphDistribution PrimaryPlaceholder Prime PrimeNu PrimeOmega PrimePi PrimePowerQ PrimeQ Primes PrimeZetaP PrimitiveRoot PrincipalComponents PrincipalValue Print PrintAction PrintForm PrintingCopies PrintingOptions PrintingPageRange PrintingStartingPageNumber PrintingStyleEnvironment PrintPrecision PrintTemporary Prism PrismBox PrismBoxOptions PrivateCellOptions PrivateEvaluationOptions PrivateFontOptions PrivateFrontEndOptions PrivateNotebookOptions PrivatePaths Probability ProbabilityDistribution ProbabilityPlot ProbabilityPr ProbabilityScalePlot ProbitModelFit ProcessEstimator ProcessParameterAssumptions ProcessParameterQ ProcessStateDomain ProcessTimeDomain Product ProductDistribution ProductLog ProgressIndicator ProgressIndicatorBox ProgressIndicatorBoxOptions Projection Prolog PromptForm Properties Property PropertyList PropertyValue Proportion Proportional Protect Protected ProteinData Pruning PseudoInverse Purple Put PutAppend Pyramid PyramidBox PyramidBoxOptions QBinomial QFactorial QGamma QHypergeometricPFQ QPochhammer QPolyGamma QRDecomposition QuadraticIrrationalQ Quantile QuantilePlot Quantity QuantityForm QuantityMagnitude QuantityQ QuantityUnit Quartics QuartileDeviation Quartiles QuartileSkewness QueueingNetworkProcess QueueingProcess QueueProperties Quiet Quit Quotient QuotientRemainder RadialityCentrality RadicalBox RadicalBoxOptions RadioButton RadioButtonBar RadioButtonBox RadioButtonBoxOptions Radon RamanujanTau RamanujanTauL RamanujanTauTheta RamanujanTauZ Random RandomChoice RandomComplex RandomFunction RandomGraph RandomImage RandomInteger RandomPermutation RandomPrime RandomReal RandomSample RandomSeed RandomVariate RandomWalkProcess Range RangeFilter RangeSpecification RankedMax RankedMin Raster Raster3D Raster3DBox Raster3DBoxOptions RasterArray RasterBox RasterBoxOptions Rasterize RasterSize Rational RationalFunctions Rationalize Rationals Ratios Raw RawArray RawBoxes RawData RawMedium RayleighDistribution Re Read ReadList ReadProtected Real RealBlockDiagonalForm RealDigits RealExponent Reals Reap Record RecordLists RecordSeparators Rectangle RectangleBox RectangleBoxOptions RectangleChart RectangleChart3D RecurrenceFilter RecurrenceTable RecurringDigitsForm Red Reduce RefBox ReferenceLineStyle ReferenceMarkers ReferenceMarkerStyle Refine ReflectionMatrix ReflectionTransform Refresh RefreshRate RegionBinarize RegionFunction RegionPlot RegionPlot3D RegularExpression Regularization Reinstall Release ReleaseHold ReliabilityDistribution ReliefImage ReliefPlot Remove RemoveAlphaChannel RemoveAsynchronousTask Removed RemoveInputStreamMethod RemoveOutputStreamMethod RemoveProperty RemoveScheduledTask RenameDirectory RenameFile RenderAll RenderingOptions RenewalProcess RenkoChart Repeated RepeatedNull RepeatedString Replace ReplaceAll ReplaceHeldPart ReplaceImageValue ReplaceList ReplacePart ReplacePixelValue ReplaceRepeated Resampling Rescale RescalingTransform ResetDirectory ResetMenusPacket ResetScheduledTask Residue Resolve Rest Resultant ResumePacket Return ReturnExpressionPacket ReturnInputFormPacket ReturnPacket ReturnTextPacket Reverse ReverseBiorthogonalSplineWavelet ReverseElement ReverseEquilibrium ReverseGraph ReverseUpEquilibrium RevolutionAxis RevolutionPlot3D RGBColor RiccatiSolve RiceDistribution RidgeFilter RiemannR RiemannSiegelTheta RiemannSiegelZ Riffle Right RightArrow RightArrowBar RightArrowLeftArrow RightCosetRepresentative RightDownTeeVector RightDownVector RightDownVectorBar RightTee RightTeeArrow RightTeeVector RightTriangle RightTriangleBar RightTriangleEqual RightUpDownVector RightUpTeeVector RightUpVector RightUpVectorBar RightVector RightVectorBar RiskAchievementImportance RiskReductionImportance RogersTanimotoDissimilarity Root RootApproximant RootIntervals RootLocusPlot RootMeanSquare RootOfUnityQ RootReduce Roots RootSum Rotate RotateLabel RotateLeft RotateRight RotationAction RotationBox RotationBoxOptions RotationMatrix RotationTransform Round RoundImplies RoundingRadius Row RowAlignments RowBackgrounds RowBox RowHeights RowLines RowMinHeight RowReduce RowsEqual RowSpacings RSolve RudvalisGroupRu Rule RuleCondition RuleDelayed RuleForm RulerUnits Run RunScheduledTask RunThrough RuntimeAttributes RuntimeOptions RussellRaoDissimilarity SameQ SameTest SampleDepth SampledSoundFunction SampledSoundList SampleRate SamplingPeriod SARIMAProcess SARMAProcess SatisfiabilityCount SatisfiabilityInstances SatisfiableQ Saturday Save Saveable SaveAutoDelete SaveDefinitions SawtoothWave Scale Scaled ScaleDivisions ScaledMousePosition ScaleOrigin ScalePadding ScaleRanges ScaleRangeStyle ScalingFunctions ScalingMatrix ScalingTransform Scan ScheduledTaskActiveQ ScheduledTaskData ScheduledTaskObject ScheduledTasks SchurDecomposition ScientificForm ScreenRectangle ScreenStyleEnvironment ScriptBaselineShifts ScriptLevel ScriptMinSize ScriptRules ScriptSizeMultipliers Scrollbars ScrollingOptions ScrollPosition Sec Sech SechDistribution SectionGrouping SectorChart SectorChart3D SectorOrigin SectorSpacing SeedRandom Select Selectable SelectComponents SelectedCells SelectedNotebook Selection SelectionAnimate SelectionCell SelectionCellCreateCell SelectionCellDefaultStyle SelectionCellParentStyle SelectionCreateCell SelectionDebuggerTag SelectionDuplicateCell SelectionEvaluate SelectionEvaluateCreateCell SelectionMove SelectionPlaceholder SelectionSetStyle SelectWithContents SelfLoops SelfLoopStyle SemialgebraicComponentInstances SendMail Sequence SequenceAlignment SequenceForm SequenceHold SequenceLimit Series SeriesCoefficient SeriesData SessionTime Set SetAccuracy SetAlphaChannel SetAttributes Setbacks SetBoxFormNamesPacket SetDelayed SetDirectory SetEnvironment SetEvaluationNotebook SetFileDate SetFileLoadingContext SetNotebookStatusLine SetOptions SetOptionsPacket SetPrecision SetProperty SetSelectedNotebook SetSharedFunction SetSharedVariable SetSpeechParametersPacket SetStreamPosition SetSystemOptions Setter SetterBar SetterBox SetterBoxOptions Setting SetValue Shading Shallow ShannonWavelet ShapiroWilkTest Share Sharpen ShearingMatrix ShearingTransform ShenCastanMatrix Short ShortDownArrow Shortest ShortestMatch ShortestPathFunction ShortLeftArrow ShortRightArrow ShortUpArrow Show ShowAutoStyles ShowCellBracket ShowCellLabel ShowCellTags ShowClosedCellArea ShowContents ShowControls ShowCursorTracker ShowGroupOpenCloseIcon ShowGroupOpener ShowInvisibleCharacters ShowPageBreaks ShowPredictiveInterface ShowSelection ShowShortBoxForm ShowSpecialCharacters ShowStringCharacters ShowSyntaxStyles ShrinkingDelay ShrinkWrapBoundingBox SiegelTheta SiegelTukeyTest Sign Signature SignedRankTest SignificanceLevel SignPadding SignTest SimilarityRules SimpleGraph SimpleGraphQ Simplify Sin Sinc SinghMaddalaDistribution SingleEvaluation SingleLetterItalics SingleLetterStyle SingularValueDecomposition SingularValueList SingularValuePlot SingularValues Sinh SinhIntegral SinIntegral SixJSymbol Skeleton SkeletonTransform SkellamDistribution Skewness SkewNormalDistribution Skip SliceDistribution Slider Slider2D Slider2DBox Slider2DBoxOptions SliderBox SliderBoxOptions SlideView Slot SlotSequence Small SmallCircle Smaller SmithDelayCompensator SmithWatermanSimilarity SmoothDensityHistogram SmoothHistogram SmoothHistogram3D SmoothKernelDistribution SocialMediaData Socket SokalSneathDissimilarity Solve SolveAlways SolveDelayed Sort SortBy Sound SoundAndGraphics SoundNote SoundVolume Sow Space SpaceForm Spacer Spacings Span SpanAdjustments SpanCharacterRounding SpanFromAbove SpanFromBoth SpanFromLeft SpanLineThickness SpanMaxSize SpanMinSize SpanningCharacters SpanSymmetric SparseArray SpatialGraphDistribution Speak SpeakTextPacket SpearmanRankTest SpearmanRho Spectrogram SpectrogramArray Specularity SpellingCorrection SpellingDictionaries SpellingDictionariesPath SpellingOptions SpellingSuggestionsPacket Sphere SphereBox SphericalBesselJ SphericalBesselY SphericalHankelH1 SphericalHankelH2 SphericalHarmonicY SphericalPlot3D SphericalRegion SpheroidalEigenvalue SpheroidalJoiningFactor SpheroidalPS SpheroidalPSPrime SpheroidalQS SpheroidalQSPrime SpheroidalRadialFactor SpheroidalS1 SpheroidalS1Prime SpheroidalS2 SpheroidalS2Prime Splice SplicedDistribution SplineClosed SplineDegree SplineKnots SplineWeights Split SplitBy SpokenString Sqrt SqrtBox SqrtBoxOptions Square SquaredEuclideanDistance SquareFreeQ SquareIntersection SquaresR SquareSubset SquareSubsetEqual SquareSuperset SquareSupersetEqual SquareUnion SquareWave StabilityMargins StabilityMarginsStyle StableDistribution Stack StackBegin StackComplete StackInhibit StandardDeviation StandardDeviationFilter StandardForm Standardize StandbyDistribution Star StarGraph StartAsynchronousTask StartingStepSize StartOfLine StartOfString StartScheduledTask StartupSound StateDimensions StateFeedbackGains StateOutputEstimator StateResponse StateSpaceModel StateSpaceRealization StateSpaceTransform StationaryDistribution StationaryWaveletPacketTransform StationaryWaveletTransform StatusArea StatusCentrality StepMonitor StieltjesGamma StirlingS1 StirlingS2 StopAsynchronousTask StopScheduledTask StrataVariables StratonovichProcess StreamColorFunction StreamColorFunctionScaling StreamDensityPlot StreamPlot StreamPoints StreamPosition Streams StreamScale StreamStyle String StringBreak StringByteCount StringCases StringCount StringDrop StringExpression StringForm StringFormat StringFreeQ StringInsert StringJoin StringLength StringMatchQ StringPosition StringQ StringReplace StringReplaceList StringReplacePart StringReverse StringRotateLeft StringRotateRight StringSkeleton StringSplit StringTake StringToStream StringTrim StripBoxes StripOnInput StripWrapperBoxes StrokeForm StructuralImportance StructuredArray StructuredSelection StruveH StruveL Stub StudentTDistribution Style StyleBox StyleBoxAutoDelete StyleBoxOptions StyleData StyleDefinitions StyleForm StyleKeyMapping StyleMenuListing StyleNameDialogSettings StyleNames StylePrint StyleSheetPath Subfactorial Subgraph SubMinus SubPlus SubresultantPolynomialRemainders SubresultantPolynomials Subresultants Subscript SubscriptBox SubscriptBoxOptions Subscripted Subset SubsetEqual Subsets SubStar Subsuperscript SubsuperscriptBox SubsuperscriptBoxOptions Subtract SubtractFrom SubValues Succeeds SucceedsEqual SucceedsSlantEqual SucceedsTilde SuchThat Sum SumConvergence Sunday SuperDagger SuperMinus SuperPlus Superscript SuperscriptBox SuperscriptBoxOptions Superset SupersetEqual SuperStar Surd SurdForm SurfaceColor SurfaceGraphics SurvivalDistribution SurvivalFunction SurvivalModel SurvivalModelFit SuspendPacket SuzukiDistribution SuzukiGroupSuz SwatchLegend Switch Symbol SymbolName SymletWavelet Symmetric SymmetricGroup SymmetricMatrixQ SymmetricPolynomial SymmetricReduction Symmetrize SymmetrizedArray SymmetrizedArrayRules SymmetrizedDependentComponents SymmetrizedIndependentComponents SymmetrizedReplacePart SynchronousInitialization SynchronousUpdating Syntax SyntaxForm SyntaxInformation SyntaxLength SyntaxPacket SyntaxQ SystemDialogInput SystemException SystemHelpPath SystemInformation SystemInformationData SystemOpen SystemOptions SystemsModelDelay SystemsModelDelayApproximate SystemsModelDelete SystemsModelDimensions SystemsModelExtract SystemsModelFeedbackConnect SystemsModelLabels SystemsModelOrder SystemsModelParallelConnect SystemsModelSeriesConnect SystemsModelStateFeedbackConnect SystemStub Tab TabFilling Table TableAlignments TableDepth TableDirections TableForm TableHeadings TableSpacing TableView TableViewBox TabSpacings TabView TabViewBox TabViewBoxOptions TagBox TagBoxNote TagBoxOptions TaggingRules TagSet TagSetDelayed TagStyle TagUnset Take TakeWhile Tally Tan Tanh TargetFunctions TargetUnits TautologyQ TelegraphProcess TemplateBox TemplateBoxOptions TemplateSlotSequence TemporalData Temporary TemporaryVariable TensorContract TensorDimensions TensorExpand TensorProduct TensorQ TensorRank TensorReduce TensorSymmetry TensorTranspose TensorWedge Tetrahedron TetrahedronBox TetrahedronBoxOptions TeXForm TeXSave Text Text3DBox Text3DBoxOptions TextAlignment TextBand TextBoundingBox TextBox TextCell TextClipboardType TextData TextForm TextJustification TextLine TextPacket TextParagraph TextRecognize TextRendering TextStyle Texture TextureCoordinateFunction TextureCoordinateScaling Therefore ThermometerGauge Thick Thickness Thin Thinning ThisLink ThompsonGroupTh Thread ThreeJSymbol Threshold Through Throw Thumbnail Thursday Ticks TicksStyle Tilde TildeEqual TildeFullEqual TildeTilde TimeConstrained TimeConstraint Times TimesBy TimeSeriesForecast TimeSeriesInvertibility TimeUsed TimeValue TimeZone Timing Tiny TitleGrouping TitsGroupT ToBoxes ToCharacterCode ToColor ToContinuousTimeModel ToDate ToDiscreteTimeModel ToeplitzMatrix ToExpression ToFileName Together Toggle ToggleFalse Toggler TogglerBar TogglerBox TogglerBoxOptions ToHeldExpression ToInvertibleTimeSeries TokenWords Tolerance ToLowerCase ToNumberField TooBig Tooltip TooltipBox TooltipBoxOptions TooltipDelay TooltipStyle Top TopHatTransform TopologicalSort ToRadicals ToRules ToString Total TotalHeight TotalVariationFilter TotalWidth TouchscreenAutoZoom TouchscreenControlPlacement ToUpperCase Tr Trace TraceAbove TraceAction TraceBackward TraceDepth TraceDialog TraceForward TraceInternal TraceLevel TraceOff TraceOn TraceOriginal TracePrint TraceScan TrackedSymbols TradingChart TraditionalForm TraditionalFunctionNotation TraditionalNotation TraditionalOrder TransferFunctionCancel TransferFunctionExpand TransferFunctionFactor TransferFunctionModel TransferFunctionPoles TransferFunctionTransform TransferFunctionZeros TransformationFunction TransformationFunctions TransformationMatrix TransformedDistribution TransformedField Translate TranslationTransform TransparentColor Transpose TreeForm TreeGraph TreeGraphQ TreePlot TrendStyle TriangleWave TriangularDistribution Trig TrigExpand TrigFactor TrigFactorList Trigger TrigReduce TrigToExp TrimmedMean True TrueQ TruncatedDistribution TsallisQExponentialDistribution TsallisQGaussianDistribution TTest Tube TubeBezierCurveBox TubeBezierCurveBoxOptions TubeBox TubeBSplineCurveBox TubeBSplineCurveBoxOptions Tuesday TukeyLambdaDistribution TukeyWindow Tuples TuranGraph TuringMachine Transparent UnateQ Uncompress Undefined UnderBar Underflow Underlined Underoverscript UnderoverscriptBox UnderoverscriptBoxOptions Underscript UnderscriptBox UnderscriptBoxOptions UndirectedEdge UndirectedGraph UndirectedGraphQ UndocumentedTestFEParserPacket UndocumentedTestGetSelectionPacket Unequal Unevaluated UniformDistribution UniformGraphDistribution UniformSumDistribution Uninstall Union UnionPlus Unique UnitBox UnitConvert UnitDimensions Unitize UnitRootTest UnitSimplify UnitStep UnitTriangle UnitVector Unprotect UnsameQ UnsavedVariables Unset UnsetShared UntrackedVariables Up UpArrow UpArrowBar UpArrowDownArrow Update UpdateDynamicObjects UpdateDynamicObjectsSynchronous UpdateInterval UpDownArrow UpEquilibrium UpperCaseQ UpperLeftArrow UpperRightArrow UpperTriangularize Upsample UpSet UpSetDelayed UpTee UpTeeArrow UpValues URL URLFetch URLFetchAsynchronous URLSave URLSaveAsynchronous UseGraphicsRange Using UsingFrontEnd V2Get ValidationLength Value ValueBox ValueBoxOptions ValueForm ValueQ ValuesData Variables Variance VarianceEquivalenceTest VarianceEstimatorFunction VarianceGammaDistribution VarianceTest VectorAngle VectorColorFunction VectorColorFunctionScaling VectorDensityPlot VectorGlyphData VectorPlot VectorPlot3D VectorPoints VectorQ Vectors VectorScale VectorStyle Vee Verbatim Verbose VerboseConvertToPostScriptPacket VerifyConvergence VerifySolutions VerifyTestAssumptions Version VersionNumber VertexAdd VertexCapacity VertexColors VertexComponent VertexConnectivity VertexCoordinateRules VertexCoordinates VertexCorrelationSimilarity VertexCosineSimilarity VertexCount VertexCoverQ VertexDataCoordinates VertexDegree VertexDelete VertexDiceSimilarity VertexEccentricity VertexInComponent VertexInDegree VertexIndex VertexJaccardSimilarity VertexLabeling VertexLabels VertexLabelStyle VertexList VertexNormals VertexOutComponent VertexOutDegree VertexQ VertexRenderingFunction VertexReplace VertexShape VertexShapeFunction VertexSize VertexStyle VertexTextureCoordinates VertexWeight Vertical VerticalBar VerticalForm VerticalGauge VerticalSeparator VerticalSlider VerticalTilde ViewAngle ViewCenter ViewMatrix ViewPoint ViewPointSelectorSettings ViewPort ViewRange ViewVector ViewVertical VirtualGroupData Visible VisibleCell VoigtDistribution VonMisesDistribution WaitAll WaitAsynchronousTask WaitNext WaitUntil WakebyDistribution WalleniusHypergeometricDistribution WaringYuleDistribution WatershedComponents WatsonUSquareTest WattsStrogatzGraphDistribution WaveletBestBasis WaveletFilterCoefficients WaveletImagePlot WaveletListPlot WaveletMapIndexed WaveletMatrixPlot WaveletPhi WaveletPsi WaveletScale WaveletScalogram WaveletThreshold WeaklyConnectedComponents WeaklyConnectedGraphQ WeakStationarity WeatherData WeberE Wedge Wednesday WeibullDistribution WeierstrassHalfPeriods WeierstrassInvariants WeierstrassP WeierstrassPPrime WeierstrassSigma WeierstrassZeta WeightedAdjacencyGraph WeightedAdjacencyMatrix WeightedData WeightedGraphQ Weights WelchWindow WheelGraph WhenEvent Which While White Whitespace WhitespaceCharacter WhittakerM WhittakerW WienerFilter WienerProcess WignerD WignerSemicircleDistribution WilksW WilksWTest WindowClickSelect WindowElements WindowFloating WindowFrame WindowFrameElements WindowMargins WindowMovable WindowOpacity WindowSelected WindowSize WindowStatusArea WindowTitle WindowToolbars WindowWidth With WolframAlpha WolframAlphaDate WolframAlphaQuantity WolframAlphaResult Word WordBoundary WordCharacter WordData WordSearch WordSeparators WorkingPrecision Write WriteString Wronskian XMLElement XMLObject Xnor Xor Yellow YuleDissimilarity ZernikeR ZeroSymmetric ZeroTest ZeroWidthTimes Zeta ZetaZero ZipfDistribution ZTest ZTransform $Aborted $ActivationGroupID $ActivationKey $ActivationUserRegistered $AddOnsDirectory $AssertFunction $Assumptions $AsynchronousTask $BaseDirectory $BatchInput $BatchOutput $BoxForms $ByteOrdering $Canceled $CharacterEncoding $CharacterEncodings $CommandLine $CompilationTarget $ConditionHold $ConfiguredKernels $Context $ContextPath $ControlActiveSetting $CreationDate $CurrentLink $DateStringFormat $DefaultFont $DefaultFrontEnd $DefaultImagingDevice $DefaultPath $Display $DisplayFunction $DistributedContexts $DynamicEvaluation $Echo $Epilog $ExportFormats $Failed $FinancialDataSource $FormatType $FrontEnd $FrontEndSession $GeoLocation $HistoryLength $HomeDirectory $HTTPCookies $IgnoreEOF $ImagingDevices $ImportFormats $InitialDirectory $Input $InputFileName $InputStreamMethods $Inspector $InstallationDate $InstallationDirectory $InterfaceEnvironment $IterationLimit $KernelCount $KernelID $Language $LaunchDirectory $LibraryPath $LicenseExpirationDate $LicenseID $LicenseProcesses $LicenseServer $LicenseSubprocesses $LicenseType $Line $Linked $LinkSupported $LoadedFiles $MachineAddresses $MachineDomain $MachineDomains $MachineEpsilon $MachineID $MachineName $MachinePrecision $MachineType $MaxExtraPrecision $MaxLicenseProcesses $MaxLicenseSubprocesses $MaxMachineNumber $MaxNumber $MaxPiecewiseCases $MaxPrecision $MaxRootDegree $MessageGroups $MessageList $MessagePrePrint $Messages $MinMachineNumber $MinNumber $MinorReleaseNumber $MinPrecision $ModuleNumber $NetworkLicense $NewMessage $NewSymbol $Notebooks $NumberMarks $Off $OperatingSystem $Output $OutputForms $OutputSizeLimit $OutputStreamMethods $Packages $ParentLink $ParentProcessID $PasswordFile $PatchLevelID $Path $PathnameSeparator $PerformanceGoal $PipeSupported $Post $Pre $PreferencesDirectory $PrePrint $PreRead $PrintForms $PrintLiteral $ProcessID $ProcessorCount $ProcessorType $ProductInformation $ProgramName $RandomState $RecursionLimit $ReleaseNumber $RootDirectory $ScheduledTask $ScriptCommandLine $SessionID $SetParentLink $SharedFunctions $SharedVariables $SoundDisplay $SoundDisplayFunction $SuppressInputFormHeads $SynchronousEvaluation $SyntaxHandler $System $SystemCharacterEncoding $SystemID $SystemWordLength $TemporaryDirectory $TemporaryPrefix $TextStyle $TimedOut $TimeUnit $TimeZone $TopDirectory $TraceOff $TraceOn $TracePattern $TracePostAction $TracePreAction $Urgent $UserAddOnsDirectory $UserBaseDirectory $UserDocumentsDirectory $UserName $Version $VersionNumber",
+contains:[{className:"comment",begin:/\(\*/,end:/\*\)/},a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,a.C_NUMBER_MODE,{begin:/\{/,end:/\}/,illegal:/:/}]}});b.registerLanguage("matlab",function(a){var b={relevance:0,contains:[{begin:"('|\\.')+"}]};return{keywords:{keyword:"break case catch classdef continue else elseif end enumerated events for function global if methods otherwise parfor persistent properties return spmd switch try while",built_in:"sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i inf nan isnan isinf isfinite j why compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson max min nanmax nanmin mean nanmean type table readtable writetable sortrows sort figure plot plot3 scatter scatter3 cellfun legend intersect ismember procrustes hold num2cell "},
+illegal:'(//|"|#|/\\*|\\s+/\\w+)',contains:[{className:"function",beginKeywords:"function",end:"$",contains:[a.UNDERSCORE_TITLE_MODE,{className:"params",variants:[{begin:"\\(",end:"\\)"},{begin:"\\[",end:"\\]"}]}]},{className:"built_in",begin:/true|false/,relevance:0,starts:b},{begin:"[a-zA-Z][a-zA-Z_0-9]*('|\\.')+",relevance:0},{className:"number",begin:a.C_NUMBER_RE,relevance:0,starts:b},{className:"string",begin:"'",end:"'",contains:[a.BACKSLASH_ESCAPE,{begin:"''"}]},{begin:/\]|}|\)/,relevance:0,
+starts:b},{className:"string",begin:'"',end:'"',contains:[a.BACKSLASH_ESCAPE,{begin:'""'}],starts:b},a.COMMENT("^\\s*\\%\\{\\s*$","^\\s*\\%\\}\\s*$"),a.COMMENT("\\%","$")]}});b.registerLanguage("maxima",function(a){return{lexemes:"[A-Za-z_%][0-9A-Za-z_%]*",keywords:{keyword:"if then else elseif for thru do while unless step in and or not",literal:"true false unknown inf minf ind und %e %i %pi %phi %gamma",built_in:" abasep abs absint absolute_real_time acos acosh acot acoth acsc acsch activate addcol add_edge add_edges addmatrices addrow add_vertex add_vertices adjacency_matrix adjoin adjoint af agd airy airy_ai airy_bi airy_dai airy_dbi algsys alg_type alias allroots alphacharp alphanumericp amortization %and annuity_fv annuity_pv antid antidiff AntiDifference append appendfile apply apply1 apply2 applyb1 apropos args arit_amortization arithmetic arithsum array arrayapply arrayinfo arraymake arraysetapply ascii asec asech asin asinh askinteger asksign assoc assoc_legendre_p assoc_legendre_q assume assume_external_byte_order asympa at atan atan2 atanh atensimp atom atvalue augcoefmatrix augmented_lagrangian_method av average_degree backtrace bars barsplot barsplot_description base64 base64_decode bashindices batch batchload bc2 bdvac belln benefit_cost bern bernpoly bernstein_approx bernstein_expand bernstein_poly bessel bessel_i bessel_j bessel_k bessel_simplify bessel_y beta beta_incomplete beta_incomplete_generalized beta_incomplete_regularized bezout bfallroots bffac bf_find_root bf_fmin_cobyla bfhzeta bfloat bfloatp bfpsi bfpsi0 bfzeta biconnected_components bimetric binomial bipartition block blockmatrixp bode_gain bode_phase bothcoef box boxplot boxplot_description break bug_report build_info|10 buildq build_sample burn cabs canform canten cardinality carg cartan cartesian_product catch cauchy_matrix cbffac cdf_bernoulli cdf_beta cdf_binomial cdf_cauchy cdf_chi2 cdf_continuous_uniform cdf_discrete_uniform cdf_exp cdf_f cdf_gamma cdf_general_finite_discrete cdf_geometric cdf_gumbel cdf_hypergeometric cdf_laplace cdf_logistic cdf_lognormal cdf_negative_binomial cdf_noncentral_chi2 cdf_noncentral_student_t cdf_normal cdf_pareto cdf_poisson cdf_rank_sum cdf_rayleigh cdf_signed_rank cdf_student_t cdf_weibull cdisplay ceiling central_moment cequal cequalignore cf cfdisrep cfexpand cgeodesic cgreaterp cgreaterpignore changename changevar chaosgame charat charfun charfun2 charlist charp charpoly chdir chebyshev_t chebyshev_u checkdiv check_overlaps chinese cholesky christof chromatic_index chromatic_number cint circulant_graph clear_edge_weight clear_rules clear_vertex_label clebsch_gordan clebsch_graph clessp clesspignore close closefile cmetric coeff coefmatrix cograd col collapse collectterms columnop columnspace columnswap columnvector combination combine comp2pui compare compfile compile compile_file complement_graph complete_bipartite_graph complete_graph complex_number_p components compose_functions concan concat conjugate conmetderiv connected_components connect_vertices cons constant constantp constituent constvalue cont2part content continuous_freq contortion contour_plot contract contract_edge contragrad contrib_ode convert coord copy copy_file copy_graph copylist copymatrix cor cos cosh cot coth cov cov1 covdiff covect covers crc24sum create_graph create_list csc csch csetup cspline ctaylor ct_coordsys ctransform ctranspose cube_graph cuboctahedron_graph cunlisp cv cycle_digraph cycle_graph cylindrical days360 dblint deactivate declare declare_constvalue declare_dimensions declare_fundamental_dimensions declare_fundamental_units declare_qty declare_translated declare_unit_conversion declare_units declare_weights decsym defcon define define_alt_display define_variable defint defmatch defrule defstruct deftaylor degree_sequence del delete deleten delta demo demoivre denom depends derivdegree derivlist describe desolve determinant dfloat dgauss_a dgauss_b dgeev dgemm dgeqrf dgesv dgesvd diag diagmatrix diag_matrix diagmatrixp diameter diff digitcharp dimacs_export dimacs_import dimension dimensionless dimensions dimensions_as_list direct directory discrete_freq disjoin disjointp disolate disp dispcon dispform dispfun dispJordan display disprule dispterms distrib divide divisors divsum dkummer_m dkummer_u dlange dodecahedron_graph dotproduct dotsimp dpart draw draw2d draw3d drawdf draw_file draw_graph dscalar echelon edge_coloring edge_connectivity edges eigens_by_jacobi eigenvalues eigenvectors eighth einstein eivals eivects elapsed_real_time elapsed_run_time ele2comp ele2polynome ele2pui elem elementp elevation_grid elim elim_allbut eliminate eliminate_using ellipse elliptic_e elliptic_ec elliptic_eu elliptic_f elliptic_kc elliptic_pi ematrix empty_graph emptyp endcons entermatrix entertensor entier equal equalp equiv_classes erf erfc erf_generalized erfi errcatch error errormsg errors euler ev eval_string evenp every evolution evolution2d evundiff example exp expand expandwrt expandwrt_factored expint expintegral_chi expintegral_ci expintegral_e expintegral_e1 expintegral_ei expintegral_e_simplify expintegral_li expintegral_shi expintegral_si explicit explose exponentialize express expt exsec extdiff extract_linear_equations extremal_subset ezgcd %f f90 facsum factcomb factor factorfacsum factorial factorout factorsum facts fast_central_elements fast_linsolve fasttimes featurep fernfale fft fib fibtophi fifth filename_merge file_search file_type fillarray findde find_root find_root_abs find_root_error find_root_rel first fix flatten flength float floatnump floor flower_snark flush flush1deriv flushd flushnd flush_output fmin_cobyla forget fortran fourcos fourexpand fourier fourier_elim fourint fourintcos fourintsin foursimp foursin fourth fposition frame_bracket freeof freshline fresnel_c fresnel_s from_adjacency_matrix frucht_graph full_listify fullmap fullmapl fullratsimp fullratsubst fullsetify funcsolve fundamental_dimensions fundamental_units fundef funmake funp fv g0 g1 gamma gamma_greek gamma_incomplete gamma_incomplete_generalized gamma_incomplete_regularized gauss gauss_a gauss_b gaussprob gcd gcdex gcdivide gcfac gcfactor gd generalized_lambert_w genfact gen_laguerre genmatrix gensym geo_amortization geo_annuity_fv geo_annuity_pv geomap geometric geometric_mean geosum get getcurrentdirectory get_edge_weight getenv get_lu_factors get_output_stream_string get_pixel get_plot_option get_tex_environment get_tex_environment_default get_vertex_label gfactor gfactorsum ggf girth global_variances gn gnuplot_close gnuplot_replot gnuplot_reset gnuplot_restart gnuplot_start go Gosper GosperSum gr2d gr3d gradef gramschmidt graph6_decode graph6_encode graph6_export graph6_import graph_center graph_charpoly graph_eigenvalues graph_flow graph_order graph_periphery graph_product graph_size graph_union great_rhombicosidodecahedron_graph great_rhombicuboctahedron_graph grid_graph grind grobner_basis grotzch_graph hamilton_cycle hamilton_path hankel hankel_1 hankel_2 harmonic harmonic_mean hav heawood_graph hermite hessian hgfred hilbertmap hilbert_matrix hipow histogram histogram_description hodge horner hypergeometric i0 i1 %ibes ic1 ic2 ic_convert ichr1 ichr2 icosahedron_graph icosidodecahedron_graph icurvature ident identfor identity idiff idim idummy ieqn %if ifactors iframes ifs igcdex igeodesic_coords ilt image imagpart imetric implicit implicit_derivative implicit_plot indexed_tensor indices induced_subgraph inferencep inference_result infix info_display init_atensor init_ctensor in_neighbors innerproduct inpart inprod inrt integerp integer_partitions integrate intersect intersection intervalp intopois intosum invariant1 invariant2 inverse_fft inverse_jacobi_cd inverse_jacobi_cn inverse_jacobi_cs inverse_jacobi_dc inverse_jacobi_dn inverse_jacobi_ds inverse_jacobi_nc inverse_jacobi_nd inverse_jacobi_ns inverse_jacobi_sc inverse_jacobi_sd inverse_jacobi_sn invert invert_by_adjoint invert_by_lu inv_mod irr is is_biconnected is_bipartite is_connected is_digraph is_edge_in_graph is_graph is_graph_or_digraph ishow is_isomorphic isolate isomorphism is_planar isqrt isreal_p is_sconnected is_tree is_vertex_in_graph items_inference %j j0 j1 jacobi jacobian jacobi_cd jacobi_cn jacobi_cs jacobi_dc jacobi_dn jacobi_ds jacobi_nc jacobi_nd jacobi_ns jacobi_p jacobi_sc jacobi_sd jacobi_sn JF jn join jordan julia julia_set julia_sin %k kdels kdelta kill killcontext kostka kron_delta kronecker_product kummer_m kummer_u kurtosis kurtosis_bernoulli kurtosis_beta kurtosis_binomial kurtosis_chi2 kurtosis_continuous_uniform kurtosis_discrete_uniform kurtosis_exp kurtosis_f kurtosis_gamma kurtosis_general_finite_discrete kurtosis_geometric kurtosis_gumbel kurtosis_hypergeometric kurtosis_laplace kurtosis_logistic kurtosis_lognormal kurtosis_negative_binomial kurtosis_noncentral_chi2 kurtosis_noncentral_student_t kurtosis_normal kurtosis_pareto kurtosis_poisson kurtosis_rayleigh kurtosis_student_t kurtosis_weibull label labels lagrange laguerre lambda lambert_w laplace laplacian_matrix last lbfgs lc2kdt lcharp lc_l lcm lc_u ldefint ldisp ldisplay legendre_p legendre_q leinstein length let letrules letsimp levi_civita lfreeof lgtreillis lhs li liediff limit Lindstedt linear linearinterpol linear_program linear_regression line_graph linsolve listarray list_correlations listify list_matrix_entries list_nc_monomials listoftens listofvars listp lmax lmin load loadfile local locate_matrix_entry log logcontract log_gamma lopow lorentz_gauge lowercasep lpart lratsubst lreduce lriemann lsquares_estimates lsquares_estimates_approximate lsquares_estimates_exact lsquares_mse lsquares_residual_mse lsquares_residuals lsum ltreillis lu_backsub lucas lu_factor %m macroexpand macroexpand1 make_array makebox makefact makegamma make_graph make_level_picture makelist makeOrders make_poly_continent make_poly_country make_polygon make_random_state make_rgb_picture makeset make_string_input_stream make_string_output_stream make_transform mandelbrot mandelbrot_set map mapatom maplist matchdeclare matchfix mat_cond mat_fullunblocker mat_function mathml_display mat_norm matrix matrixmap matrixp matrix_size mattrace mat_trace mat_unblocker max max_clique max_degree max_flow maximize_lp max_independent_set max_matching maybe md5sum mean mean_bernoulli mean_beta mean_binomial mean_chi2 mean_continuous_uniform mean_deviation mean_discrete_uniform mean_exp mean_f mean_gamma mean_general_finite_discrete mean_geometric mean_gumbel mean_hypergeometric mean_laplace mean_logistic mean_lognormal mean_negative_binomial mean_noncentral_chi2 mean_noncentral_student_t mean_normal mean_pareto mean_poisson mean_rayleigh mean_student_t mean_weibull median median_deviation member mesh metricexpandall mgf1_sha1 min min_degree min_edge_cut minfactorial minimalPoly minimize_lp minimum_spanning_tree minor minpack_lsquares minpack_solve min_vertex_cover min_vertex_cut mkdir mnewton mod mode_declare mode_identity ModeMatrix moebius mon2schur mono monomial_dimensions multibernstein_poly multi_display_for_texinfo multi_elem multinomial multinomial_coeff multi_orbit multiplot_mode multi_pui multsym multthru mycielski_graph nary natural_unit nc_degree ncexpt ncharpoly negative_picture neighbors new newcontext newdet new_graph newline newton new_variable next_prime nicedummies niceindices ninth nofix nonarray noncentral_moment nonmetricity nonnegintegerp nonscalarp nonzeroandfreeof notequal nounify nptetrad npv nroots nterms ntermst nthroot nullity nullspace num numbered_boundaries numberp number_to_octets num_distinct_partitions numerval numfactor num_partitions nusum nzeta nzetai nzetar octets_to_number octets_to_oid odd_girth oddp ode2 ode_check odelin oid_to_octets op opena opena_binary openr openr_binary openw openw_binary operatorp opsubst optimize %or orbit orbits ordergreat ordergreatp orderless orderlessp orthogonal_complement orthopoly_recur orthopoly_weight outermap out_neighbors outofpois pade parabolic_cylinder_d parametric parametric_surface parg parGosper parse_string parse_timedate part part2cont partfrac partition partition_set partpol path_digraph path_graph pathname_directory pathname_name pathname_type pdf_bernoulli pdf_beta pdf_binomial pdf_cauchy pdf_chi2 pdf_continuous_uniform pdf_discrete_uniform pdf_exp pdf_f pdf_gamma pdf_general_finite_discrete pdf_geometric pdf_gumbel pdf_hypergeometric pdf_laplace pdf_logistic pdf_lognormal pdf_negative_binomial pdf_noncentral_chi2 pdf_noncentral_student_t pdf_normal pdf_pareto pdf_poisson pdf_rank_sum pdf_rayleigh pdf_signed_rank pdf_student_t pdf_weibull pearson_skewness permanent permut permutation permutations petersen_graph petrov pickapart picture_equalp picturep piechart piechart_description planar_embedding playback plog plot2d plot3d plotdf ploteq plsquares pochhammer points poisdiff poisexpt poisint poismap poisplus poissimp poissubst poistimes poistrim polar polarform polartorect polar_to_xy poly_add poly_buchberger poly_buchberger_criterion poly_colon_ideal poly_content polydecomp poly_depends_p poly_elimination_ideal poly_exact_divide poly_expand poly_expt poly_gcd polygon poly_grobner poly_grobner_equal poly_grobner_member poly_grobner_subsetp poly_ideal_intersection poly_ideal_polysaturation poly_ideal_polysaturation1 poly_ideal_saturation poly_ideal_saturation1 poly_lcm poly_minimization polymod poly_multiply polynome2ele polynomialp poly_normal_form poly_normalize poly_normalize_list poly_polysaturation_extension poly_primitive_part poly_pseudo_divide poly_reduced_grobner poly_reduction poly_saturation_extension poly_s_polynomial poly_subtract polytocompanion pop postfix potential power_mod powerseries powerset prefix prev_prime primep primes principal_components print printf printfile print_graph printpois printprops prodrac product properties propvars psi psubst ptriangularize pui pui2comp pui2ele pui2polynome pui_direct puireduc push put pv qput qrange qty quad_control quad_qag quad_qagi quad_qagp quad_qags quad_qawc quad_qawf quad_qawo quad_qaws quadrilateral quantile quantile_bernoulli quantile_beta quantile_binomial quantile_cauchy quantile_chi2 quantile_continuous_uniform quantile_discrete_uniform quantile_exp quantile_f quantile_gamma quantile_general_finite_discrete quantile_geometric quantile_gumbel quantile_hypergeometric quantile_laplace quantile_logistic quantile_lognormal quantile_negative_binomial quantile_noncentral_chi2 quantile_noncentral_student_t quantile_normal quantile_pareto quantile_poisson quantile_rayleigh quantile_student_t quantile_weibull quartile_skewness quit qunit quotient racah_v racah_w radcan radius random random_bernoulli random_beta random_binomial random_bipartite_graph random_cauchy random_chi2 random_continuous_uniform random_digraph random_discrete_uniform random_exp random_f random_gamma random_general_finite_discrete random_geometric random_graph random_graph1 random_gumbel random_hypergeometric random_laplace random_logistic random_lognormal random_negative_binomial random_network random_noncentral_chi2 random_noncentral_student_t random_normal random_pareto random_permutation random_poisson random_rayleigh random_regular_graph random_student_t random_tournament random_tree random_weibull range rank rat ratcoef ratdenom ratdiff ratdisrep ratexpand ratinterpol rational rationalize ratnumer ratnump ratp ratsimp ratsubst ratvars ratweight read read_array read_binary_array read_binary_list read_binary_matrix readbyte readchar read_hashed_array readline read_list read_matrix read_nested_list readonly read_xpm real_imagpart_to_conjugate realpart realroots rearray rectangle rectform rectform_log_if_constant recttopolar rediff reduce_consts reduce_order region region_boundaries region_boundaries_plus rem remainder remarray rembox remcomps remcon remcoord remfun remfunction remlet remove remove_constvalue remove_dimensions remove_edge remove_fundamental_dimensions remove_fundamental_units remove_plot_option remove_vertex rempart remrule remsym remvalue rename rename_file reset reset_displays residue resolvante resolvante_alternee1 resolvante_bipartite resolvante_diedrale resolvante_klein resolvante_klein3 resolvante_produit_sym resolvante_unitaire resolvante_vierer rest resultant return reveal reverse revert revert2 rgb2level rhs ricci riemann rinvariant risch rk rmdir rncombine romberg room rootscontract round row rowop rowswap rreduce run_testsuite %s save saving scalarp scaled_bessel_i scaled_bessel_i0 scaled_bessel_i1 scalefactors scanmap scatterplot scatterplot_description scene schur2comp sconcat scopy scsimp scurvature sdowncase sec sech second sequal sequalignore set_alt_display setdifference set_draw_defaults set_edge_weight setelmx setequalp setify setp set_partitions set_plot_option set_prompt set_random_state set_tex_environment set_tex_environment_default setunits setup_autoload set_up_dot_simplifications set_vertex_label seventh sexplode sf sha1sum sha256sum shortest_path shortest_weighted_path show showcomps showratvars sierpinskiale sierpinskimap sign signum similaritytransform simp_inequality simplify_sum simplode simpmetderiv simtran sin sinh sinsert sinvertcase sixth skewness skewness_bernoulli skewness_beta skewness_binomial skewness_chi2 skewness_continuous_uniform skewness_discrete_uniform skewness_exp skewness_f skewness_gamma skewness_general_finite_discrete skewness_geometric skewness_gumbel skewness_hypergeometric skewness_laplace skewness_logistic skewness_lognormal skewness_negative_binomial skewness_noncentral_chi2 skewness_noncentral_student_t skewness_normal skewness_pareto skewness_poisson skewness_rayleigh skewness_student_t skewness_weibull slength smake small_rhombicosidodecahedron_graph small_rhombicuboctahedron_graph smax smin smismatch snowmap snub_cube_graph snub_dodecahedron_graph solve solve_rec solve_rec_rat some somrac sort sparse6_decode sparse6_encode sparse6_export sparse6_import specint spherical spherical_bessel_j spherical_bessel_y spherical_hankel1 spherical_hankel2 spherical_harmonic spherical_to_xyz splice split sposition sprint sqfr sqrt sqrtdenest sremove sremovefirst sreverse ssearch ssort sstatus ssubst ssubstfirst staircase standardize standardize_inverse_trig starplot starplot_description status std std1 std_bernoulli std_beta std_binomial std_chi2 std_continuous_uniform std_discrete_uniform std_exp std_f std_gamma std_general_finite_discrete std_geometric std_gumbel std_hypergeometric std_laplace std_logistic std_lognormal std_negative_binomial std_noncentral_chi2 std_noncentral_student_t std_normal std_pareto std_poisson std_rayleigh std_student_t std_weibull stemplot stirling stirling1 stirling2 strim striml strimr string stringout stringp strong_components struve_h struve_l sublis sublist sublist_indices submatrix subsample subset subsetp subst substinpart subst_parallel substpart substring subvar subvarp sum sumcontract summand_to_rec supcase supcontext symbolp symmdifference symmetricp system take_channel take_inference tan tanh taylor taylorinfo taylorp taylor_simplifier taytorat tcl_output tcontract tellrat tellsimp tellsimpafter tentex tenth test_mean test_means_difference test_normality test_proportion test_proportions_difference test_rank_sum test_sign test_signed_rank test_variance test_variance_ratio tex tex1 tex_display texput %th third throw time timedate timer timer_info tldefint tlimit todd_coxeter toeplitz tokens to_lisp topological_sort to_poly to_poly_solve totaldisrep totalfourier totient tpartpol trace tracematrix trace_options transform_sample translate translate_file transpose treefale tree_reduce treillis treinat triangle triangularize trigexpand trigrat trigreduce trigsimp trunc truncate truncated_cube_graph truncated_dodecahedron_graph truncated_icosahedron_graph truncated_tetrahedron_graph tr_warnings_get tube tutte_graph ueivects uforget ultraspherical underlying_graph undiff union unique uniteigenvectors unitp units unit_step unitvector unorder unsum untellrat untimer untrace uppercasep uricci uriemann uvect vandermonde_matrix var var1 var_bernoulli var_beta var_binomial var_chi2 var_continuous_uniform var_discrete_uniform var_exp var_f var_gamma var_general_finite_discrete var_geometric var_gumbel var_hypergeometric var_laplace var_logistic var_lognormal var_negative_binomial var_noncentral_chi2 var_noncentral_student_t var_normal var_pareto var_poisson var_rayleigh var_student_t var_weibull vector vectorpotential vectorsimp verbify vers vertex_coloring vertex_connectivity vertex_degree vertex_distance vertex_eccentricity vertex_in_degree vertex_out_degree vertices vertices_to_cycle vertices_to_path %w weyl wheel_graph wiener_index wigner_3j wigner_6j wigner_9j with_stdout write_binary_data writebyte write_data writefile wronskian xreduce xthru %y Zeilberger zeroequiv zerofor zeromatrix zeromatrixp zeta zgeev zheev zlange zn_add_table zn_carmichael_lambda zn_characteristic_factors zn_determinant zn_factor_generators zn_invert_by_lu zn_log zn_mult_table absboxchar activecontexts adapt_depth additive adim aform algebraic algepsilon algexact aliases allbut all_dotsimp_denoms allocation allsym alphabetic animation antisymmetric arrays askexp assume_pos assume_pos_pred assumescalar asymbol atomgrad atrig1 axes axis_3d axis_bottom axis_left axis_right axis_top azimuth background background_color backsubst berlefact bernstein_explicit besselexpand beta_args_sum_to_integer beta_expand bftorat bftrunc bindtest border boundaries_array box boxchar breakup %c capping cauchysum cbrange cbtics center cflength cframe_flag cnonmet_flag color color_bar color_bar_tics colorbox columns commutative complex cone context contexts contour contour_levels cosnpiflag ctaypov ctaypt ctayswitch ctayvar ct_coords ctorsion_flag ctrgsimp cube current_let_rule_package cylinder data_file_name debugmode decreasing default_let_rule_package delay dependencies derivabbrev derivsubst detout diagmetric diff dim dimensions dispflag display2d|10 display_format_internal distribute_over doallmxops domain domxexpt domxmxops domxnctimes dontfactor doscmxops doscmxplus dot0nscsimp dot0simp dot1simp dotassoc dotconstrules dotdistrib dotexptsimp dotident dotscrules draw_graph_program draw_realpart edge_color edge_coloring edge_partition edge_type edge_width %edispflag elevation %emode endphi endtheta engineering_format_floats enhanced3d %enumer epsilon_lp erfflag erf_representation errormsg error_size error_syms error_type %e_to_numlog eval even evenfun evflag evfun ev_point expandwrt_denom expintexpand expintrep expon expop exptdispflag exptisolate exptsubst facexpand facsum_combine factlim factorflag factorial_expand factors_only fb feature features file_name file_output_append file_search_demo file_search_lisp file_search_maxima|10 file_search_tests file_search_usage file_type_lisp file_type_maxima|10 fill_color fill_density filled_func fixed_vertices flipflag float2bf font font_size fortindent fortspaces fpprec fpprintprec functions gamma_expand gammalim gdet genindex gensumnum GGFCFMAX GGFINFINITY globalsolve gnuplot_command gnuplot_curve_styles gnuplot_curve_titles gnuplot_default_term_command gnuplot_dumb_term_command gnuplot_file_args gnuplot_file_name gnuplot_out_file gnuplot_pdf_term_command gnuplot_pm3d gnuplot_png_term_command gnuplot_postamble gnuplot_preamble gnuplot_ps_term_command gnuplot_svg_term_command gnuplot_term gnuplot_view_args Gosper_in_Zeilberger gradefs grid grid2d grind halfangles head_angle head_both head_length head_type height hypergeometric_representation %iargs ibase icc1 icc2 icounter idummyx ieqnprint ifb ifc1 ifc2 ifg ifgi ifr iframe_bracket_form ifri igeowedge_flag ikt1 ikt2 imaginary inchar increasing infeval infinity inflag infolists inm inmc1 inmc2 intanalysis integer integervalued integrate_use_rootsof integration_constant integration_constant_counter interpolate_color intfaclim ip_grid ip_grid_in irrational isolate_wrt_times iterations itr julia_parameter %k1 %k2 keepfloat key key_pos kinvariant kt label label_alignment label_orientation labels lassociative lbfgs_ncorrections lbfgs_nfeval_max leftjust legend letrat let_rule_packages lfg lg lhospitallim limsubst linear linear_solver linechar linel|10 linenum line_type linewidth line_width linsolve_params linsolvewarn lispdisp listarith listconstvars listdummyvars lmxchar load_pathname loadprint logabs logarc logcb logconcoeffp logexpand lognegint logsimp logx logx_secondary logy logy_secondary logz lriem m1pbranch macroexpansion macros mainvar manual_demo maperror mapprint matrix_element_add matrix_element_mult matrix_element_transpose maxapplydepth maxapplyheight maxima_tempdir|10 maxima_userdir|10 maxnegex MAX_ORD maxposex maxpsifracdenom maxpsifracnum maxpsinegint maxpsiposint maxtayorder mesh_lines_color method mod_big_prime mode_check_errorp mode_checkp mode_check_warnp mod_test mod_threshold modular_linear_solver modulus multiplicative multiplicities myoptions nary negdistrib negsumdispflag newline newtonepsilon newtonmaxiter nextlayerfactor niceindicespref nm nmc noeval nolabels nonegative_lp noninteger nonscalar noun noundisp nouns np npi nticks ntrig numer numer_pbranch obase odd oddfun opacity opproperties opsubst optimprefix optionset orientation origin orthopoly_returns_intervals outative outchar packagefile palette partswitch pdf_file pfeformat phiresolution %piargs piece pivot_count_sx pivot_max_sx plot_format plot_options plot_realpart png_file pochhammer_max_index points pointsize point_size points_joined point_type poislim poisson poly_coefficient_ring poly_elimination_order polyfactor poly_grobner_algorithm poly_grobner_debug poly_monomial_order poly_primary_elimination_order poly_return_term_list poly_secondary_elimination_order poly_top_reduction_only posfun position powerdisp pred prederror primep_number_of_tests product_use_gamma program programmode promote_float_to_bigfloat prompt proportional_axes props psexpand ps_file radexpand radius radsubstflag rassociative ratalgdenom ratchristof ratdenomdivide rateinstein ratepsilon ratfac rational ratmx ratprint ratriemann ratsimpexpons ratvarswitch ratweights ratweyl ratwtlvl real realonly redraw refcheck resolution restart resultant ric riem rmxchar %rnum_list rombergabs rombergit rombergmin rombergtol rootsconmode rootsepsilon run_viewer same_xy same_xyz savedef savefactors scalar scalarmatrixp scale scale_lp setcheck setcheckbreak setval show_edge_color show_edges show_edge_type show_edge_width show_id show_label showtime show_vertex_color show_vertex_size show_vertex_type show_vertices show_weight simp simplified_output simplify_products simpproduct simpsum sinnpiflag solvedecomposes solveexplicit solvefactors solvenullwarn solveradcan solvetrigwarn space sparse sphere spring_embedding_depth sqrtdispflag stardisp startphi starttheta stats_numer stringdisp structures style sublis_apply_lambda subnumsimp sumexpand sumsplitfact surface surface_hide svg_file symmetric tab taylordepth taylor_logexpand taylor_order_coefficients taylor_truncate_polynomials tensorkill terminal testsuite_files thetaresolution timer_devalue title tlimswitch tr track transcompile transform transform_xy translate_fast_arrays transparent transrun tr_array_as_ref tr_bound_function_applyp tr_file_tty_messagesp tr_float_can_branch_complex tr_function_call_default trigexpandplus trigexpandtimes triginverses trigsign trivial_solutions tr_numer tr_optimize_max_loop tr_semicompile tr_state_vars tr_warn_bad_function_calls tr_warn_fexpr tr_warn_meval tr_warn_mode tr_warn_undeclared tr_warn_undefined_variable tstep ttyoff tube_extremes ufg ug %unitexpand unit_vectors uric uriem use_fast_arrays user_preamble usersetunits values vect_cross verbose vertex_color vertex_coloring vertex_partition vertex_size vertex_type view warnings weyl width windowname windowtitle wired_surface wireframe xaxis xaxis_color xaxis_secondary xaxis_type xaxis_width xlabel xlabel_secondary xlength xrange xrange_secondary xtics xtics_axis xtics_rotate xtics_rotate_secondary xtics_secondary xtics_secondary_axis xu_grid x_voxel xy_file xyplane xy_scale yaxis yaxis_color yaxis_secondary yaxis_type yaxis_width ylabel ylabel_secondary ylength yrange yrange_secondary ytics ytics_axis ytics_rotate ytics_rotate_secondary ytics_secondary ytics_secondary_axis yv_grid y_voxel yx_ratio zaxis zaxis_color zaxis_type zaxis_width zeroa zerob zerobern zeta%pi zlabel zlabel_rotate zlength zmin zn_primroot_limit zn_primroot_pretest",
+symbol:"_ __ %|0 %%|0"},contains:[{className:"comment",begin:"/\\*",end:"\\*/",contains:["self"]},a.QUOTE_STRING_MODE,{className:"number",relevance:0,variants:[{begin:"\\b(\\d+|\\d+\\.|\\.\\d+|\\d+\\.\\d+)[Ee][-+]?\\d+\\b"},{begin:"\\b(\\d+|\\d+\\.|\\.\\d+|\\d+\\.\\d+)[Bb][-+]?\\d+\\b",relevance:10},{begin:"\\b(\\.\\d+|\\d+\\.\\d+)\\b"},{begin:"\\b(\\d+|0[0-9A-Za-z]+)\\.?\\b"}]}],illegal:/@/}});b.registerLanguage("mel",function(a){return{keywords:"int float string vector matrix if else switch case default while do for in break continue global proc return about abs addAttr addAttributeEditorNodeHelp addDynamic addNewShelfTab addPP addPanelCategory addPrefixToName advanceToNextDrivenKey affectedNet affects aimConstraint air alias aliasAttr align alignCtx alignCurve alignSurface allViewFit ambientLight angle angleBetween animCone animCurveEditor animDisplay animView annotate appendStringArray applicationName applyAttrPreset applyTake arcLenDimContext arcLengthDimension arclen arrayMapper art3dPaintCtx artAttrCtx artAttrPaintVertexCtx artAttrSkinPaintCtx artAttrTool artBuildPaintMenu artFluidAttrCtx artPuttyCtx artSelectCtx artSetPaintCtx artUserPaintCtx assignCommand assignInputDevice assignViewportFactories attachCurve attachDeviceAttr attachSurface attrColorSliderGrp attrCompatibility attrControlGrp attrEnumOptionMenu attrEnumOptionMenuGrp attrFieldGrp attrFieldSliderGrp attrNavigationControlGrp attrPresetEditWin attributeExists attributeInfo attributeMenu attributeQuery autoKeyframe autoPlace bakeClip bakeFluidShading bakePartialHistory bakeResults bakeSimulation basename basenameEx batchRender bessel bevel bevelPlus binMembership bindSkin blend2 blendShape blendShapeEditor blendShapePanel blendTwoAttr blindDataType boneLattice boundary boxDollyCtx boxZoomCtx bufferCurve buildBookmarkMenu buildKeyframeMenu button buttonManip CBG cacheFile cacheFileCombine cacheFileMerge cacheFileTrack camera cameraView canCreateManip canvas capitalizeString catch catchQuiet ceil changeSubdivComponentDisplayLevel changeSubdivRegion channelBox character characterMap characterOutlineEditor characterize chdir checkBox checkBoxGrp checkDefaultRenderGlobals choice circle circularFillet clamp clear clearCache clip clipEditor clipEditorCurrentTimeCtx clipSchedule clipSchedulerOutliner clipTrimBefore closeCurve closeSurface cluster cmdFileOutput cmdScrollFieldExecuter cmdScrollFieldReporter cmdShell coarsenSubdivSelectionList collision color colorAtPoint colorEditor colorIndex colorIndexSliderGrp colorSliderButtonGrp colorSliderGrp columnLayout commandEcho commandLine commandPort compactHairSystem componentEditor compositingInterop computePolysetVolume condition cone confirmDialog connectAttr connectControl connectDynamic connectJoint connectionInfo constrain constrainValue constructionHistory container containsMultibyte contextInfo control convertFromOldLayers convertIffToPsd convertLightmap convertSolidTx convertTessellation convertUnit copyArray copyFlexor copyKey copySkinWeights cos cpButton cpCache cpClothSet cpCollision cpConstraint cpConvClothToMesh cpForces cpGetSolverAttr cpPanel cpProperty cpRigidCollisionFilter cpSeam cpSetEdit cpSetSolverAttr cpSolver cpSolverTypes cpTool cpUpdateClothUVs createDisplayLayer createDrawCtx createEditor createLayeredPsdFile createMotionField createNewShelf createNode createRenderLayer createSubdivRegion cross crossProduct ctxAbort ctxCompletion ctxEditMode ctxTraverse currentCtx currentTime currentTimeCtx currentUnit curve curveAddPtCtx curveCVCtx curveEPCtx curveEditorCtx curveIntersect curveMoveEPCtx curveOnSurface curveSketchCtx cutKey cycleCheck cylinder dagPose date defaultLightListCheckBox defaultNavigation defineDataServer defineVirtualDevice deformer deg_to_rad delete deleteAttr deleteShadingGroupsAndMaterials deleteShelfTab deleteUI deleteUnusedBrushes delrandstr detachCurve detachDeviceAttr detachSurface deviceEditor devicePanel dgInfo dgdirty dgeval dgtimer dimWhen directKeyCtx directionalLight dirmap dirname disable disconnectAttr disconnectJoint diskCache displacementToPoly displayAffected displayColor displayCull displayLevelOfDetail displayPref displayRGBColor displaySmoothness displayStats displayString displaySurface distanceDimContext distanceDimension doBlur dolly dollyCtx dopeSheetEditor dot dotProduct doubleProfileBirailSurface drag dragAttrContext draggerContext dropoffLocator duplicate duplicateCurve duplicateSurface dynCache dynControl dynExport dynExpression dynGlobals dynPaintEditor dynParticleCtx dynPref dynRelEdPanel dynRelEditor dynamicLoad editAttrLimits editDisplayLayerGlobals editDisplayLayerMembers editRenderLayerAdjustment editRenderLayerGlobals editRenderLayerMembers editor editorTemplate effector emit emitter enableDevice encodeString endString endsWith env equivalent equivalentTol erf error eval evalDeferred evalEcho event exactWorldBoundingBox exclusiveLightCheckBox exec executeForEachObject exists exp expression expressionEditorListen extendCurve extendSurface extrude fcheck fclose feof fflush fgetline fgetword file fileBrowserDialog fileDialog fileExtension fileInfo filetest filletCurve filter filterCurve filterExpand filterStudioImport findAllIntersections findAnimCurves findKeyframe findMenuItem findRelatedSkinCluster finder firstParentOf fitBspline flexor floatEq floatField floatFieldGrp floatScrollBar floatSlider floatSlider2 floatSliderButtonGrp floatSliderGrp floor flow fluidCacheInfo fluidEmitter fluidVoxelInfo flushUndo fmod fontDialog fopen formLayout format fprint frameLayout fread freeFormFillet frewind fromNativePath fwrite gamma gauss geometryConstraint getApplicationVersionAsFloat getAttr getClassification getDefaultBrush getFileList getFluidAttr getInputDeviceRange getMayaPanelTypes getModifiers getPanel getParticleAttr getPluginResource getenv getpid glRender glRenderEditor globalStitch gmatch goal gotoBindPose grabColor gradientControl gradientControlNoAttr graphDollyCtx graphSelectContext graphTrackCtx gravity grid gridLayout group groupObjectsByName HfAddAttractorToAS HfAssignAS HfBuildEqualMap HfBuildFurFiles HfBuildFurImages HfCancelAFR HfConnectASToHF HfCreateAttractor HfDeleteAS HfEditAS HfPerformCreateAS HfRemoveAttractorFromAS HfSelectAttached HfSelectAttractors HfUnAssignAS hardenPointCurve hardware hardwareRenderPanel headsUpDisplay headsUpMessage help helpLine hermite hide hilite hitTest hotBox hotkey hotkeyCheck hsv_to_rgb hudButton hudSlider hudSliderButton hwReflectionMap hwRender hwRenderLoad hyperGraph hyperPanel hyperShade hypot iconTextButton iconTextCheckBox iconTextRadioButton iconTextRadioCollection iconTextScrollList iconTextStaticLabel ikHandle ikHandleCtx ikHandleDisplayScale ikSolver ikSplineHandleCtx ikSystem ikSystemInfo ikfkDisplayMethod illustratorCurves image imfPlugins inheritTransform insertJoint insertJointCtx insertKeyCtx insertKnotCurve insertKnotSurface instance instanceable instancer intField intFieldGrp intScrollBar intSlider intSliderGrp interToUI internalVar intersect iprEngine isAnimCurve isConnected isDirty isParentOf isSameObject isTrue isValidObjectName isValidString isValidUiName isolateSelect itemFilter itemFilterAttr itemFilterRender itemFilterType joint jointCluster jointCtx jointDisplayScale jointLattice keyTangent keyframe keyframeOutliner keyframeRegionCurrentTimeCtx keyframeRegionDirectKeyCtx keyframeRegionDollyCtx keyframeRegionInsertKeyCtx keyframeRegionMoveKeyCtx keyframeRegionScaleKeyCtx keyframeRegionSelectKeyCtx keyframeRegionSetKeyCtx keyframeRegionTrackCtx keyframeStats lassoContext lattice latticeDeformKeyCtx launch launchImageEditor layerButton layeredShaderPort layeredTexturePort layout layoutDialog lightList lightListEditor lightListPanel lightlink lineIntersection linearPrecision linstep listAnimatable listAttr listCameras listConnections listDeviceAttachments listHistory listInputDeviceAxes listInputDeviceButtons listInputDevices listMenuAnnotation listNodeTypes listPanelCategories listRelatives listSets listTransforms listUnselected listerEditor loadFluid loadNewShelf loadPlugin loadPluginLanguageResources loadPrefObjects localizedPanelLabel lockNode loft log longNameOf lookThru ls lsThroughFilter lsType lsUI Mayatomr mag makeIdentity makeLive makePaintable makeRoll makeSingleSurface makeTubeOn makebot manipMoveContext manipMoveLimitsCtx manipOptions manipRotateContext manipRotateLimitsCtx manipScaleContext manipScaleLimitsCtx marker match max memory menu menuBarLayout menuEditor menuItem menuItemToShelf menuSet menuSetPref messageLine min minimizeApp mirrorJoint modelCurrentTimeCtx modelEditor modelPanel mouse movIn movOut move moveIKtoFK moveKeyCtx moveVertexAlongDirection multiProfileBirailSurface mute nParticle nameCommand nameField namespace namespaceInfo newPanelItems newton nodeCast nodeIconButton nodeOutliner nodePreset nodeType noise nonLinear normalConstraint normalize nurbsBoolean nurbsCopyUVSet nurbsCube nurbsEditUV nurbsPlane nurbsSelect nurbsSquare nurbsToPoly nurbsToPolygonsPref nurbsToSubdiv nurbsToSubdivPref nurbsUVSet nurbsViewDirectionVector objExists objectCenter objectLayer objectType objectTypeUI obsoleteProc oceanNurbsPreviewPlane offsetCurve offsetCurveOnSurface offsetSurface openGLExtension openMayaPref optionMenu optionMenuGrp optionVar orbit orbitCtx orientConstraint outlinerEditor outlinerPanel overrideModifier paintEffectsDisplay pairBlend palettePort paneLayout panel panelConfiguration panelHistory paramDimContext paramDimension paramLocator parent parentConstraint particle particleExists particleInstancer particleRenderInfo partition pasteKey pathAnimation pause pclose percent performanceOptions pfxstrokes pickWalk picture pixelMove planarSrf plane play playbackOptions playblast plugAttr plugNode pluginInfo pluginResourceUtil pointConstraint pointCurveConstraint pointLight pointMatrixMult pointOnCurve pointOnSurface pointPosition poleVectorConstraint polyAppend polyAppendFacetCtx polyAppendVertex polyAutoProjection polyAverageNormal polyAverageVertex polyBevel polyBlendColor polyBlindData polyBoolOp polyBridgeEdge polyCacheMonitor polyCheck polyChipOff polyClipboard polyCloseBorder polyCollapseEdge polyCollapseFacet polyColorBlindData polyColorDel polyColorPerVertex polyColorSet polyCompare polyCone polyCopyUV polyCrease polyCreaseCtx polyCreateFacet polyCreateFacetCtx polyCube polyCut polyCutCtx polyCylinder polyCylindricalProjection polyDelEdge polyDelFacet polyDelVertex polyDuplicateAndConnect polyDuplicateEdge polyEditUV polyEditUVShell polyEvaluate polyExtrudeEdge polyExtrudeFacet polyExtrudeVertex polyFlipEdge polyFlipUV polyForceUV polyGeoSampler polyHelix polyInfo polyInstallAction polyLayoutUV polyListComponentConversion polyMapCut polyMapDel polyMapSew polyMapSewMove polyMergeEdge polyMergeEdgeCtx polyMergeFacet polyMergeFacetCtx polyMergeUV polyMergeVertex polyMirrorFace polyMoveEdge polyMoveFacet polyMoveFacetUV polyMoveUV polyMoveVertex polyNormal polyNormalPerVertex polyNormalizeUV polyOptUvs polyOptions polyOutput polyPipe polyPlanarProjection polyPlane polyPlatonicSolid polyPoke polyPrimitive polyPrism polyProjection polyPyramid polyQuad polyQueryBlindData polyReduce polySelect polySelectConstraint polySelectConstraintMonitor polySelectCtx polySelectEditCtx polySeparate polySetToFaceNormal polySewEdge polyShortestPathCtx polySmooth polySoftEdge polySphere polySphericalProjection polySplit polySplitCtx polySplitEdge polySplitRing polySplitVertex polyStraightenUVBorder polySubdivideEdge polySubdivideFacet polyToSubdiv polyTorus polyTransfer polyTriangulate polyUVSet polyUnite polyWedgeFace popen popupMenu pose pow preloadRefEd print progressBar progressWindow projFileViewer projectCurve projectTangent projectionContext projectionManip promptDialog propModCtx propMove psdChannelOutliner psdEditTextureFile psdExport psdTextureFile putenv pwd python querySubdiv quit rad_to_deg radial radioButton radioButtonGrp radioCollection radioMenuItemCollection rampColorPort rand randomizeFollicles randstate rangeControl readTake rebuildCurve rebuildSurface recordAttr recordDevice redo reference referenceEdit referenceQuery refineSubdivSelectionList refresh refreshAE registerPluginResource rehash reloadImage removeJoint removeMultiInstance removePanelCategory rename renameAttr renameSelectionList renameUI render renderGlobalsNode renderInfo renderLayerButton renderLayerParent renderLayerPostProcess renderLayerUnparent renderManip renderPartition renderQualityNode renderSettings renderThumbnailUpdate renderWindowEditor renderWindowSelectContext renderer reorder reorderDeformers requires reroot resampleFluid resetAE resetPfxToPolyCamera resetTool resolutionNode retarget reverseCurve reverseSurface revolve rgb_to_hsv rigidBody rigidSolver roll rollCtx rootOf rot rotate rotationInterpolation roundConstantRadius rowColumnLayout rowLayout runTimeCommand runup sampleImage saveAllShelves saveAttrPreset saveFluid saveImage saveInitialState saveMenu savePrefObjects savePrefs saveShelf saveToolSettings scale scaleBrushBrightness scaleComponents scaleConstraint scaleKey scaleKeyCtx sceneEditor sceneUIReplacement scmh scriptCtx scriptEditorInfo scriptJob scriptNode scriptTable scriptToShelf scriptedPanel scriptedPanelType scrollField scrollLayout sculpt searchPathArray seed selLoadSettings select selectContext selectCurveCV selectKey selectKeyCtx selectKeyframeRegionCtx selectMode selectPref selectPriority selectType selectedNodes selectionConnection separator setAttr setAttrEnumResource setAttrMapping setAttrNiceNameResource setConstraintRestPosition setDefaultShadingGroup setDrivenKeyframe setDynamic setEditCtx setEditor setFluidAttr setFocus setInfinity setInputDeviceMapping setKeyCtx setKeyPath setKeyframe setKeyframeBlendshapeTargetWts setMenuMode setNodeNiceNameResource setNodeTypeFlag setParent setParticleAttr setPfxToPolyCamera setPluginResource setProject setStampDensity setStartupMessage setState setToolTo setUITemplate setXformManip sets shadingConnection shadingGeometryRelCtx shadingLightRelCtx shadingNetworkCompare shadingNode shapeCompare shelfButton shelfLayout shelfTabLayout shellField shortNameOf showHelp showHidden showManipCtx showSelectionInTitle showShadingGroupAttrEditor showWindow sign simplify sin singleProfileBirailSurface size sizeBytes skinCluster skinPercent smoothCurve smoothTangentSurface smoothstep snap2to2 snapKey snapMode snapTogetherCtx snapshot soft softMod softModCtx sort sound soundControl source spaceLocator sphere sphrand spotLight spotLightPreviewPort spreadSheetEditor spring sqrt squareSurface srtContext stackTrace startString startsWith stitchAndExplodeShell stitchSurface stitchSurfacePoints strcmp stringArrayCatenate stringArrayContains stringArrayCount stringArrayInsertAtIndex stringArrayIntersector stringArrayRemove stringArrayRemoveAtIndex stringArrayRemoveDuplicates stringArrayRemoveExact stringArrayToString stringToStringArray strip stripPrefixFromName stroke subdAutoProjection subdCleanTopology subdCollapse subdDuplicateAndConnect subdEditUV subdListComponentConversion subdMapCut subdMapSewMove subdMatchTopology subdMirror subdToBlind subdToPoly subdTransferUVsToCache subdiv subdivCrease subdivDisplaySmoothness substitute substituteAllString substituteGeometry substring surface surfaceSampler surfaceShaderList swatchDisplayPort switchTable symbolButton symbolCheckBox sysFile system tabLayout tan tangentConstraint texLatticeDeformContext texManipContext texMoveContext texMoveUVShellContext texRotateContext texScaleContext texSelectContext texSelectShortestPathCtx texSmudgeUVContext texWinToolCtx text textCurves textField textFieldButtonGrp textFieldGrp textManip textScrollList textToShelf textureDisplacePlane textureHairColor texturePlacementContext textureWindow threadCount threePointArcCtx timeControl timePort timerX toNativePath toggle toggleAxis toggleWindowVisibility tokenize tokenizeList tolerance tolower toolButton toolCollection toolDropped toolHasOptions toolPropertyWindow torus toupper trace track trackCtx transferAttributes transformCompare transformLimits translator trim trunc truncateFluidCache truncateHairCache tumble tumbleCtx turbulence twoPointArcCtx uiRes uiTemplate unassignInputDevice undo undoInfo ungroup uniform unit unloadPlugin untangleUV untitledFileName untrim upAxis updateAE userCtx uvLink uvSnapshot validateShelfName vectorize view2dToolCtx viewCamera viewClipPlane viewFit viewHeadOn viewLookAt viewManip viewPlace viewSet visor volumeAxis vortex waitCursor warning webBrowser webBrowserPrefs whatIs window windowPref wire wireContext workspace wrinkle wrinkleContext writeTake xbmLangPathList xform",
+illegal:"</",contains:[a.C_NUMBER_MODE,a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,{className:"string",begin:"`",end:"`",contains:[a.BACKSLASH_ESCAPE]},{begin:"[\\$\\%\\@](\\^\\w\\b|#\\w+|[^\\s\\w{]|{\\w+}|\\w+)"},a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE]}});b.registerLanguage("mercury",function(a){var b=a.COMMENT("%","$"),d=a.inherit(a.APOS_STRING_MODE,{relevance:0}),e=a.inherit(a.QUOTE_STRING_MODE,{relevance:0});e.contains.push({className:"subst",begin:"\\\\[abfnrtv]\\|\\\\x[0-9a-fA-F]*\\\\\\|%[-+# *.0-9]*[dioxXucsfeEgGp]",
+relevance:0});return{aliases:["m","moo"],keywords:{keyword:"module use_module import_module include_module end_module initialise mutable initialize finalize finalise interface implementation pred mode func type inst solver any_pred any_func is semidet det nondet multi erroneous failure cc_nondet cc_multi typeclass instance where pragma promise external trace atomic or_else require_complete_switch require_det require_semidet require_multi require_nondet require_cc_multi require_cc_nondet require_erroneous require_failure",
+meta:"inline no_inline type_spec source_file fact_table obsolete memo loop_check minimal_model terminates does_not_terminate check_termination promise_equivalent_clauses foreign_proc foreign_decl foreign_code foreign_type foreign_import_module foreign_export_enum foreign_export foreign_enum may_call_mercury will_not_call_mercury thread_safe not_thread_safe maybe_thread_safe promise_pure promise_semipure tabled_for_io local untrailed trailed attach_to_io_state can_pass_as_mercury_type stable will_not_throw_exception may_modify_trail will_not_modify_trail may_duplicate may_not_duplicate affects_liveness does_not_affect_liveness doesnt_affect_liveness no_sharing unknown_sharing sharing",
+built_in:"some all not if then else true fail false try catch catch_any semidet_true semidet_false semidet_fail impure_true impure semipure"},contains:[{className:"built_in",variants:[{begin:"<=>"},{begin:"<=",relevance:0},{begin:"=>",relevance:0},{begin:"/\\\\"},{begin:"\\\\/"}]},{className:"built_in",variants:[{begin:":-\\|--\x3e"},{begin:"=",relevance:0}]},b,a.C_BLOCK_COMMENT_MODE,{className:"number",begin:"0'.\\|0[box][0-9a-fA-F]*"},a.NUMBER_MODE,d,e,{begin:/:-/}]}});b.registerLanguage("mipsasm",
+function(a){return{case_insensitive:!0,aliases:["mips"],lexemes:"\\.?"+a.IDENT_RE,keywords:{meta:".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .ltorg ",built_in:"$0 $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15 $16 $17 $18 $19 $20 $21 $22 $23 $24 $25 $26 $27 $28 $29 $30 $31 zero at v0 v1 a0 a1 a2 a3 a4 a5 a6 a7 t0 t1 t2 t3 t4 t5 t6 t7 t8 t9 s0 s1 s2 s3 s4 s5 s6 s7 s8 k0 k1 gp sp fp ra $f0 $f1 $f2 $f2 $f4 $f5 $f6 $f7 $f8 $f9 $f10 $f11 $f12 $f13 $f14 $f15 $f16 $f17 $f18 $f19 $f20 $f21 $f22 $f23 $f24 $f25 $f26 $f27 $f28 $f29 $f30 $f31 Context Random EntryLo0 EntryLo1 Context PageMask Wired EntryHi HWREna BadVAddr Count Compare SR IntCtl SRSCtl SRSMap Cause EPC PRId EBase Config Config1 Config2 Config3 LLAddr Debug DEPC DESAVE CacheErr ECC ErrorEPC TagLo DataLo TagHi DataHi WatchLo WatchHi PerfCtl PerfCnt "},
+contains:[{className:"keyword",begin:"\\b(addi?u?|andi?|b(al)?|beql?|bgez(al)?l?|bgtzl?|blezl?|bltz(al)?l?|bnel?|cl[oz]|divu?|ext|ins|j(al)?|jalr(.hb)?|jr(.hb)?|lbu?|lhu?|ll|lui|lw[lr]?|maddu?|mfhi|mflo|movn|movz|move|msubu?|mthi|mtlo|mul|multu?|nop|nor|ori?|rotrv?|sb|sc|se[bh]|sh|sllv?|slti?u?|srav?|srlv?|subu?|sw[lr]?|xori?|wsbh|abs.[sd]|add.[sd]|alnv.ps|bc1[ft]l?|c.(s?f|un|u?eq|[ou]lt|[ou]le|ngle?|seq|l[et]|ng[et]).[sd]|(ceil|floor|round|trunc).[lw].[sd]|cfc1|cvt.d.[lsw]|cvt.l.[dsw]|cvt.ps.s|cvt.s.[dlw]|cvt.s.p[lu]|cvt.w.[dls]|div.[ds]|ldx?c1|luxc1|lwx?c1|madd.[sd]|mfc1|mov[fntz]?.[ds]|msub.[sd]|mth?c1|mul.[ds]|neg.[ds]|nmadd.[ds]|nmsub.[ds]|p[lu][lu].ps|recip.fmt|r?sqrt.[ds]|sdx?c1|sub.[ds]|suxc1|swx?c1|break|cache|d?eret|[de]i|ehb|mfc0|mtc0|pause|prefx?|rdhwr|rdpgpr|sdbbp|ssnop|synci?|syscall|teqi?|tgei?u?|tlb(p|r|w[ir])|tlti?u?|tnei?|wait|wrpgpr)",
+end:"\\s"},a.COMMENT("[;#]","$"),a.C_BLOCK_COMMENT_MODE,a.QUOTE_STRING_MODE,{className:"string",begin:"'",end:"[^\\\\]'",relevance:0},{className:"title",begin:"\\|",end:"\\|",illegal:"\\n",relevance:0},{className:"number",variants:[{begin:"0x[0-9a-f]+"},{begin:"\\b-?\\d+"}],relevance:0},{className:"symbol",variants:[{begin:"^\\s*[a-z_\\.\\$][a-z0-9_\\.\\$]+:"},{begin:"^\\s*[0-9]+:"},{begin:"[0-9]+[bf]"}],relevance:0}],illegal:"/"}});b.registerLanguage("mizar",function(a){return{keywords:"environ vocabularies notations constructors definitions registrations theorems schemes requirements begin end definition registration cluster existence pred func defpred deffunc theorem proof let take assume then thus hence ex for st holds consider reconsider such that and in provided of as from be being by means equals implies iff redefine define now not or attr is mode suppose per cases set thesis contradiction scheme reserve struct correctness compatibility coherence symmetry assymetry reflexivity irreflexivity connectedness uniqueness commutativity idempotence involutiveness projectivity",
+contains:[a.COMMENT("::","$")]}});b.registerLanguage("perl",function(a){var b={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when"},
+d={begin:"->{",end:"}"},e={variants:[{begin:/\$\d/},{begin:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{begin:/[\$%@][^\s\w{]/,relevance:0}]},f=[a.BACKSLASH_ESCAPE,b,e];a=[e,a.HASH_COMMENT_MODE,a.COMMENT("^\\=\\w","\\=cut",{endsWithParent:!0}),d,{className:"string",contains:f,variants:[{begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*\\<",
 end:"\\>",relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",contains:[a.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",contains:[a.BACKSLASH_ESCAPE]},{begin:"{\\w+}",contains:[],relevance:0},{begin:"-?\\w+\\s*\\=\\>",contains:[],relevance:0}]},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\/\\/|"+a.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",keywords:"split return print reverse grep",
 relevance:0,contains:[a.HASH_COMMENT_MODE,{className:"regexp",begin:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",relevance:10},{className:"regexp",begin:"(m|qr)?/",end:"/[a-z]*",contains:[a.BACKSLASH_ESCAPE],relevance:0}]},{className:"function",beginKeywords:"sub",end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[a.TITLE_MODE]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}]}];b.contains=
 a;d.contains=a;return{aliases:["pl","pm"],lexemes:/[\w\.]+/,keywords:"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when",
-contains:a}});b.registerLanguage("php",function(a){var b={begin:"\\$+[a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*"},d={className:"meta",begin:/<\?(php)?|\?>/},e={className:"string",contains:[a.BACKSLASH_ESCAPE,d],variants:[{begin:'b"',end:'"'},{begin:"b'",end:"'"},a.inherit(a.APOS_STRING_MODE,{illegal:null}),a.inherit(a.QUOTE_STRING_MODE,{illegal:null})]},c={variants:[a.BINARY_NUMBER_MODE,a.C_NUMBER_MODE]};return{aliases:["php3","php4","php5","php6"],case_insensitive:!0,keywords:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",
+contains:a}});b.registerLanguage("mojolicious",function(a){return{subLanguage:"xml",contains:[{className:"meta",begin:"^__(END|DATA)__$"},{begin:"^\\s*%{1,2}={0,2}",end:"$",subLanguage:"perl"},{begin:"<%{1,2}={0,2}",end:"={0,1}%>",subLanguage:"perl",excludeBegin:!0,excludeEnd:!0}]}});b.registerLanguage("monkey",function(a){var b={className:"number",relevance:0,variants:[{begin:"[$][a-fA-F0-9]+"},a.NUMBER_MODE]};return{case_insensitive:!0,keywords:{keyword:"public private property continue exit extern new try catch eachin not abstract final select case default const local global field end if then else elseif endif while wend repeat until forever for to step next return module inline throw import",
+built_in:"DebugLog DebugStop Error Print ACos ACosr ASin ASinr ATan ATan2 ATan2r ATanr Abs Abs Ceil Clamp Clamp Cos Cosr Exp Floor Log Max Max Min Min Pow Sgn Sgn Sin Sinr Sqrt Tan Tanr Seed PI HALFPI TWOPI",literal:"true false null and or shl shr mod"},illegal:/\/\*/,contains:[a.COMMENT("#rem","#end"),a.COMMENT("'","$",{relevance:0}),{className:"function",beginKeywords:"function method",end:"[(=:]|$",illegal:/\n/,contains:[a.UNDERSCORE_TITLE_MODE]},{className:"class",beginKeywords:"class interface",
+end:"$",contains:[{beginKeywords:"extends implements"},a.UNDERSCORE_TITLE_MODE]},{className:"built_in",begin:"\\b(self|super)\\b"},{className:"meta",begin:"\\s*#",end:"$",keywords:{"meta-keyword":"if else elseif endif end then"}},{className:"meta",begin:"^\\s*strict\\b"},{beginKeywords:"alias",end:"=",contains:[a.UNDERSCORE_TITLE_MODE]},a.QUOTE_STRING_MODE,b]}});b.registerLanguage("moonscript",function(a){var b={keyword:"if then not for in while do return else elseif break continue switch and or unless when class extends super local import export from using",
+literal:"true false nil",built_in:"_G _VERSION assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall coroutine debug io math os package string table"},d={className:"subst",begin:/#\{/,end:/}/,keywords:b},e=[a.inherit(a.C_NUMBER_MODE,{starts:{end:"(\\s*/)?",relevance:0}}),{className:"string",variants:[{begin:/'/,end:/'/,contains:[a.BACKSLASH_ESCAPE]},
+{begin:/"/,end:/"/,contains:[a.BACKSLASH_ESCAPE,d]}]},{className:"built_in",begin:"@__"+a.IDENT_RE},{begin:"@"+a.IDENT_RE},{begin:a.IDENT_RE+"\\\\"+a.IDENT_RE}];d.contains=e;d=a.inherit(a.TITLE_MODE,{begin:"[A-Za-z$_][0-9A-Za-z$_]*"});var f={className:"params",begin:"\\([^\\(]",returnBegin:!0,contains:[{begin:/\(/,end:/\)/,keywords:b,contains:["self"].concat(e)}]};return{aliases:["moon"],keywords:b,illegal:/\/\*/,contains:e.concat([a.COMMENT("--","$"),{className:"function",begin:"^\\s*[A-Za-z$_][0-9A-Za-z$_]*\\s*=\\s*(\\(.*\\))?\\s*\\B[-=]>",
+end:"[-=]>",returnBegin:!0,contains:[d,f]},{begin:/[\(,:=]\s*/,relevance:0,contains:[{className:"function",begin:"(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[f]}]},{className:"class",beginKeywords:"class",end:"$",illegal:/[:="\[\]]/,contains:[{beginKeywords:"extends",endsWithParent:!0,illegal:/[:="\[\]]/,contains:[d]},d]},{className:"name",begin:"[A-Za-z$_][0-9A-Za-z$_]*:",end:":",returnBegin:!0,returnEnd:!0,relevance:0}])}});b.registerLanguage("n1ql",function(a){return{case_insensitive:!0,
+contains:[{beginKeywords:"build create index delete drop explain infer|10 insert merge prepare select update upsert|10",end:/;/,endsWithParent:!0,keywords:{keyword:"all alter analyze and any array as asc begin between binary boolean break bucket build by call case cast cluster collate collection commit connect continue correlate cover create database dataset datastore declare decrement delete derived desc describe distinct do drop each element else end every except exclude execute exists explain fetch first flatten for force from function grant group gsi having if ignore ilike in include increment index infer inline inner insert intersect into is join key keys keyspace known last left let letting like limit lsm map mapping matched materialized merge minus namespace nest not number object offset on option or order outer over parse partition password path pool prepare primary private privilege procedure public raw realm reduce rename return returning revoke right role rollback satisfies schema select self semi set show some start statistics string system then to transaction trigger truncate under union unique unknown unnest unset update upsert use user using validate value valued values via view when where while with within work xor",
+literal:"true false null missing|5",built_in:"array_agg array_append array_concat array_contains array_count array_distinct array_ifnull array_length array_max array_min array_position array_prepend array_put array_range array_remove array_repeat array_replace array_reverse array_sort array_sum avg count max min sum greatest least ifmissing ifmissingornull ifnull missingif nullif ifinf ifnan ifnanorinf naninf neginfif posinfif clock_millis clock_str date_add_millis date_add_str date_diff_millis date_diff_str date_part_millis date_part_str date_trunc_millis date_trunc_str duration_to_str millis str_to_millis millis_to_str millis_to_utc millis_to_zone_name now_millis now_str str_to_duration str_to_utc str_to_zone_name decode_json encode_json encoded_size poly_length base64 base64_encode base64_decode meta uuid abs acos asin atan atan2 ceil cos degrees e exp ln log floor pi power radians random round sign sin sqrt tan trunc object_length object_names object_pairs object_inner_pairs object_values object_inner_values object_add object_put object_remove object_unwrap regexp_contains regexp_like regexp_position regexp_replace contains initcap length lower ltrim position repeat replace rtrim split substr title trim upper isarray isatom isboolean isnumber isobject isstring type toarray toatom toboolean tonumber toobject tostring"},
+contains:[{className:"string",begin:"'",end:"'",contains:[a.BACKSLASH_ESCAPE],relevance:0},{className:"string",begin:'"',end:'"',contains:[a.BACKSLASH_ESCAPE],relevance:0},{className:"symbol",begin:"`",end:"`",contains:[a.BACKSLASH_ESCAPE],relevance:2},a.C_NUMBER_MODE,a.C_BLOCK_COMMENT_MODE]},a.C_BLOCK_COMMENT_MODE]}});b.registerLanguage("nginx",function(a){var b={className:"variable",variants:[{begin:/\$\d+/},{begin:/\$\{/,end:/}/},{begin:"[\\$\\@]"+a.UNDERSCORE_IDENT_RE}]};return{aliases:["nginxconf"],
+contains:[a.HASH_COMMENT_MODE,{begin:a.UNDERSCORE_IDENT_RE+"\\s+{",returnBegin:!0,end:"{",contains:[{className:"section",begin:a.UNDERSCORE_IDENT_RE}],relevance:0},{begin:a.UNDERSCORE_IDENT_RE+"\\s",end:";|{",returnBegin:!0,contains:[{className:"attribute",begin:a.UNDERSCORE_IDENT_RE,starts:{endsWithParent:!0,lexemes:"[a-z/_]+",keywords:{literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},relevance:0,
+illegal:"=>",contains:[a.HASH_COMMENT_MODE,{className:"string",contains:[a.BACKSLASH_ESCAPE,b],variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/}]},{begin:"([a-z]+):/",end:"\\s",endsWithParent:!0,excludeEnd:!0,contains:[b]},{className:"regexp",contains:[a.BACKSLASH_ESCAPE,b],variants:[{begin:"\\s\\^",end:"\\s|{|;",returnEnd:!0},{begin:"~\\*?\\s+",end:"\\s|{|;",returnEnd:!0},{begin:"\\*(\\.[a-z\\-]+)+"},{begin:"([a-z\\-]+\\.)+\\*"}]},{className:"number",begin:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},
+{className:"number",begin:"\\b\\d+[kKmMgGdshdwy]*\\b",relevance:0},b]}}],relevance:0}],illegal:"[^\\s\\}]"}});b.registerLanguage("nimrod",function(a){return{aliases:["nim"],keywords:{keyword:"addr and as asm bind block break case cast const continue converter discard distinct div do elif else end enum except export finally for from generic if import in include interface is isnot iterator let macro method mixin mod nil not notin object of or out proc ptr raise ref return shl shr static template try tuple type using var when while with without xor yield",
+literal:"shared guarded stdin stdout stderr result true false",built_in:"int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 float float32 float64 bool char string cstring pointer expr stmt void auto any range array openarray varargs seq set clong culong cchar cschar cshort cint csize clonglong cfloat cdouble clongdouble cuchar cushort cuint culonglong cstringarray semistatic"},contains:[{className:"meta",begin:/{\./,end:/\.}/,relevance:10},{className:"string",begin:/[a-zA-Z]\w*"/,end:/"/,
+contains:[{begin:/""/}]},{className:"string",begin:/([a-zA-Z]\w*)?"""/,end:/"""/},a.QUOTE_STRING_MODE,{className:"type",begin:/\b[A-Z]\w+\b/,relevance:0},{className:"number",relevance:0,variants:[{begin:/\b(0[xX][0-9a-fA-F][_0-9a-fA-F]*)('?[iIuU](8|16|32|64))?/},{begin:/\b(0o[0-7][_0-7]*)('?[iIuUfF](8|16|32|64))?/},{begin:/\b(0(b|B)[01][_01]*)('?[iIuUfF](8|16|32|64))?/},{begin:/\b(\d[_\d]*)('?[iIuUfF](8|16|32|64))?/}]},a.HASH_COMMENT_MODE]}});b.registerLanguage("nix",function(a){var b={keyword:"rec with let in inherit assert if else then",
+literal:"true false or and null",built_in:"import abort baseNameOf dirOf isNull builtins map removeAttrs throw toString derivation"},d={className:"subst",begin:/\$\{/,end:/}/,keywords:b};a=[a.NUMBER_MODE,a.HASH_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,{className:"string",contains:[d],variants:[{begin:"''",end:"''"},{begin:'"',end:'"'}]},{begin:/[a-zA-Z0-9-_]+(\s*=)/,returnBegin:!0,relevance:0,contains:[{className:"attr",begin:/\S+/}]}];d.contains=a;return{aliases:["nixos"],keywords:b,contains:a}});b.registerLanguage("nsis",
+function(a){var b={className:"variable",begin:/\$+{[\w\.:-]+}/},d={className:"variable",begin:/\$+\w+/,illegal:/\(\){}/},e={className:"variable",begin:/\$+\([\w\^\.:-]+\)/},f={className:"string",variants:[{begin:'"',end:'"'},{begin:"'",end:"'"},{begin:"`",end:"`"}],illegal:/\n/,contains:[{className:"meta",begin:/\$(\\[nrt]|\$)/},{className:"variable",begin:/\$(ADMINTOOLS|APPDATA|CDBURN_AREA|CMDLINE|COMMONFILES32|COMMONFILES64|COMMONFILES|COOKIES|DESKTOP|DOCUMENTS|EXEDIR|EXEFILE|EXEPATH|FAVORITES|FONTS|HISTORY|HWNDPARENT|INSTDIR|INTERNET_CACHE|LANGUAGE|LOCALAPPDATA|MUSIC|NETHOOD|OUTDIR|PICTURES|PLUGINSDIR|PRINTHOOD|PROFILE|PROGRAMFILES32|PROGRAMFILES64|PROGRAMFILES|QUICKLAUNCH|RECENT|RESOURCES_LOCALIZED|RESOURCES|SENDTO|SMPROGRAMS|SMSTARTUP|STARTMENU|SYSDIR|TEMP|TEMPLATES|VIDEOS|WINDIR)/},
+b,d,e]};return{case_insensitive:!1,keywords:{keyword:"Abort AddBrandingImage AddSize AllowRootDirInstall AllowSkipFiles AutoCloseWindow BGFont BGGradient BrandingText BringToFront Call CallInstDLL Caption ChangeUI CheckBitmap ClearErrors CompletedText ComponentText CopyFiles CRCCheck CreateDirectory CreateFont CreateShortCut Delete DeleteINISec DeleteINIStr DeleteRegKey DeleteRegValue DetailPrint DetailsButtonText DirText DirVar DirVerify EnableWindow EnumRegKey EnumRegValue Exch Exec ExecShell ExecShellWait ExecWait ExpandEnvStrings File FileBufSize FileClose FileErrorText FileOpen FileRead FileReadByte FileReadUTF16LE FileReadWord FileSeek FileWrite FileWriteByte FileWriteUTF16LE FileWriteWord FindClose FindFirst FindNext FindWindow FlushINI FunctionEnd GetCurInstType GetCurrentAddress GetDlgItem GetDLLVersion GetDLLVersionLocal GetErrorLevel GetFileTime GetFileTimeLocal GetFullPathName GetFunctionAddress GetInstDirError GetLabelAddress GetTempFileName Goto HideWindow Icon IfAbort IfErrors IfFileExists IfRebootFlag IfSilent InitPluginsDir InstallButtonText InstallColors InstallDir InstallDirRegKey InstProgressFlags InstType InstTypeGetText InstTypeSetText Int64Cmp Int64CmpU Int64Fmt IntCmp IntCmpU IntFmt IntOp IntPtrCmp IntPtrCmpU IntPtrOp IsWindow LangString LicenseBkColor LicenseData LicenseForceSelection LicenseLangString LicenseText LoadLanguageFile LockWindow LogSet LogText ManifestDPIAware ManifestSupportedOS MessageBox MiscButtonText Name Nop OutFile Page PageCallbacks PageExEnd Pop Push Quit ReadEnvStr ReadINIStr ReadRegDWORD ReadRegStr Reboot RegDLL Rename RequestExecutionLevel ReserveFile Return RMDir SearchPath SectionEnd SectionGetFlags SectionGetInstTypes SectionGetSize SectionGetText SectionGroupEnd SectionIn SectionSetFlags SectionSetInstTypes SectionSetSize SectionSetText SendMessage SetAutoClose SetBrandingImage SetCompress SetCompressor SetCompressorDictSize SetCtlColors SetCurInstType SetDatablockOptimize SetDateSave SetDetailsPrint SetDetailsView SetErrorLevel SetErrors SetFileAttributes SetFont SetOutPath SetOverwrite SetRebootFlag SetRegView SetShellVarContext SetSilent ShowInstDetails ShowUninstDetails ShowWindow SilentInstall SilentUnInstall Sleep SpaceTexts StrCmp StrCmpS StrCpy StrLen SubCaption Unicode UninstallButtonText UninstallCaption UninstallIcon UninstallSubCaption UninstallText UninstPage UnRegDLL Var VIAddVersionKey VIFileVersion VIProductVersion WindowIcon WriteINIStr WriteRegBin WriteRegDWORD WriteRegExpandStr WriteRegMultiStr WriteRegNone WriteRegStr WriteUninstaller XPStyle",
+literal:"admin all auto both bottom bzip2 colored components current custom directory false force hide highest ifdiff ifnewer instfiles lastused leave left license listonly lzma nevershow none normal notset off on open print right show silent silentlog smooth textonly top true try un.components un.custom un.directory un.instfiles un.license uninstConfirm user Win10 Win7 Win8 WinVista zlib"},contains:[a.HASH_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,a.COMMENT(";","$",{relevance:0}),{className:"function",
+beginKeywords:"Function PageEx Section SectionGroup",end:"$"},f,{className:"keyword",begin:/!(addincludedir|addplugindir|appendfile|cd|define|delfile|echo|else|endif|error|execute|finalize|getdllversion|gettlbversion|if|ifdef|ifmacrodef|ifmacrondef|ifndef|include|insertmacro|macro|macroend|makensis|packhdr|searchparse|searchreplace|system|tempfile|undef|verbose|warning)/},b,d,e,{className:"params",begin:"(ARCHIVE|FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_OFFLINE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_TEMPORARY|HKCR|HKCU|HKDD|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_DYN_DATA|HKEY_LOCAL_MACHINE|HKEY_PERFORMANCE_DATA|HKEY_USERS|HKLM|HKPD|HKU|IDABORT|IDCANCEL|IDIGNORE|IDNO|IDOK|IDRETRY|IDYES|MB_ABORTRETRYIGNORE|MB_DEFBUTTON1|MB_DEFBUTTON2|MB_DEFBUTTON3|MB_DEFBUTTON4|MB_ICONEXCLAMATION|MB_ICONINFORMATION|MB_ICONQUESTION|MB_ICONSTOP|MB_OK|MB_OKCANCEL|MB_RETRYCANCEL|MB_RIGHT|MB_RTLREADING|MB_SETFOREGROUND|MB_TOPMOST|MB_USERICON|MB_YESNO|NORMAL|OFFLINE|READONLY|SHCTX|SHELL_CONTEXT|SYSTEM|TEMPORARY)"},
+{className:"class",begin:/\w+::\w+/},a.NUMBER_MODE]}});b.registerLanguage("objectivec",function(a){var b=/[a-zA-Z@][a-zA-Z0-9_]*/;return{aliases:["mm","objc","obj-c"],keywords:{keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",
+literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},lexemes:b,illegal:"</",contains:[{className:"built_in",begin:"\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+"},a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,a.C_NUMBER_MODE,a.QUOTE_STRING_MODE,{className:"string",variants:[{begin:'@"',end:'"',illegal:"\\n",contains:[a.BACKSLASH_ESCAPE]},{begin:"'",end:"[^\\\\]'",illegal:"[^\\\\][^']"}]},
+{className:"meta",begin:"#",end:"$",contains:[{className:"meta-string",variants:[{begin:'"',end:'"'},{begin:"<",end:">"}]}]},{className:"class",begin:"(@interface|@class|@protocol|@implementation)\\b",end:"({|$)",excludeEnd:!0,keywords:"@interface @class @protocol @implementation",lexemes:b,contains:[a.UNDERSCORE_TITLE_MODE]},{begin:"\\."+a.UNDERSCORE_IDENT_RE,relevance:0}]}});b.registerLanguage("ocaml",function(a){return{aliases:["ml"],keywords:{keyword:"and as assert asr begin class constraint do done downto else end exception external for fun function functor if in include inherit! inherit initializer land lazy let lor lsl lsr lxor match method!|10 method mod module mutable new object of open! open or private rec sig struct then to try type val! val virtual when while with parser value",
+built_in:"array bool bytes char exn|5 float int int32 int64 list lazy_t|5 nativeint|5 string unit in_channel out_channel ref",literal:"true false"},illegal:/\/\/|>>/,lexemes:"[a-z_]\\w*!?",contains:[{className:"literal",begin:"\\[(\\|\\|)?\\]|\\(\\)",relevance:0},a.COMMENT("\\(\\*","\\*\\)",{contains:["self"]}),{className:"symbol",begin:"'[A-Za-z_](?!')[\\w']*"},{className:"type",begin:"`[A-Z][\\w']*"},{className:"type",begin:"\\b[A-Z][\\w']*",relevance:0},{begin:"[a-z_]\\w*'[\\w']*",relevance:0},
+a.inherit(a.APOS_STRING_MODE,{className:"string",relevance:0}),a.inherit(a.QUOTE_STRING_MODE,{illegal:null}),{className:"number",begin:"\\b(0[xX][a-fA-F0-9_]+[Lln]?|0[oO][0-7_]+[Lln]?|0[bB][01_]+[Lln]?|[0-9][0-9_]*([Lln]|(\\.[0-9_]*)?([eE][-+]?[0-9_]+)?)?)",relevance:0},{begin:/[-=]>/}]}});b.registerLanguage("openscad",function(a){var b={className:"keyword",begin:"\\$(f[asn]|t|vp[rtd]|children)"},d={className:"number",begin:"\\b\\d+(\\.\\d+)?(e-?\\d+)?",relevance:0},e=a.inherit(a.QUOTE_STRING_MODE,
+{illegal:null});return{aliases:["scad"],keywords:{keyword:"function module include use for intersection_for if else \\%",literal:"false true PI undef",built_in:"circle square polygon text sphere cube cylinder polyhedron translate rotate scale resize mirror multmatrix color offset hull minkowski union difference intersection abs sign sin cos tan acos asin atan atan2 floor round ceil ln log pow sqrt exp rands min max concat lookup str chr search version version_num norm cross parent_module echo import import_dxf dxf_linear_extrude linear_extrude rotate_extrude surface projection render children dxf_cross dxf_dim let assign"},
+contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,d,{className:"meta",keywords:{"meta-keyword":"include use"},begin:"include|use <",end:">"},e,b,{begin:"[*!#%]",relevance:0},{className:"function",beginKeywords:"module function",end:"\\=|\\{",contains:[{className:"params",begin:"\\(",end:"\\)",contains:["self",d,e,b,{className:"literal",begin:"false|true|PI|undef"}]},a.UNDERSCORE_TITLE_MODE]}]}});b.registerLanguage("oxygene",function(a){var b=a.COMMENT("{","}",{relevance:0}),d=a.COMMENT("\\(\\*",
+"\\*\\)",{relevance:10}),e={className:"string",begin:"'",end:"'",contains:[{begin:"''"}]},f={className:"string",begin:"(#\\d+)+"},g={className:"function",beginKeywords:"function constructor destructor procedure method",end:"[:;]",keywords:"function constructor|10 destructor|10 procedure|10 method|10",contains:[a.TITLE_MODE,{className:"params",begin:"\\(",end:"\\)",keywords:"abstract add and array as asc aspect assembly async begin break block by case class concat const copy constructor continue create default delegate desc distinct div do downto dynamic each else empty end ensure enum equals event except exit extension external false final finalize finalizer finally flags for forward from function future global group has if implementation implements implies in index inherited inline interface into invariants is iterator join locked locking loop matching method mod module namespace nested new nil not notify nullable of old on operator or order out override parallel params partial pinned private procedure property protected public queryable raise read readonly record reintroduce remove repeat require result reverse sealed select self sequence set shl shr skip static step soft take then to true try tuple type union unit unsafe until uses using var virtual raises volatile where while with write xor yield await mapped deprecated stdcall cdecl pascal register safecall overload library platform reference packed strict published autoreleasepool selector strong weak unretained",
+contains:[e,f]},b,d]};return{case_insensitive:!0,lexemes:/\.?\w+/,keywords:"abstract add and array as asc aspect assembly async begin break block by case class concat const copy constructor continue create default delegate desc distinct div do downto dynamic each else empty end ensure enum equals event except exit extension external false final finalize finalizer finally flags for forward from function future global group has if implementation implements implies in index inherited inline interface into invariants is iterator join locked locking loop matching method mod module namespace nested new nil not notify nullable of old on operator or order out override parallel params partial pinned private procedure property protected public queryable raise read readonly record reintroduce remove repeat require result reverse sealed select self sequence set shl shr skip static step soft take then to true try tuple type union unit unsafe until uses using var virtual raises volatile where while with write xor yield await mapped deprecated stdcall cdecl pascal register safecall overload library platform reference packed strict published autoreleasepool selector strong weak unretained",
+illegal:'("|\\$[G-Zg-z]|\\/\\*|</|=>|->)',contains:[b,d,a.C_LINE_COMMENT_MODE,e,f,a.NUMBER_MODE,g,{className:"class",begin:"=\\bclass\\b",end:"end;",keywords:"abstract add and array as asc aspect assembly async begin break block by case class concat const copy constructor continue create default delegate desc distinct div do downto dynamic each else empty end ensure enum equals event except exit extension external false final finalize finalizer finally flags for forward from function future global group has if implementation implements implies in index inherited inline interface into invariants is iterator join locked locking loop matching method mod module namespace nested new nil not notify nullable of old on operator or order out override parallel params partial pinned private procedure property protected public queryable raise read readonly record reintroduce remove repeat require result reverse sealed select self sequence set shl shr skip static step soft take then to true try tuple type union unit unsafe until uses using var virtual raises volatile where while with write xor yield await mapped deprecated stdcall cdecl pascal register safecall overload library platform reference packed strict published autoreleasepool selector strong weak unretained",
+contains:[e,f,b,d,a.C_LINE_COMMENT_MODE,g]}]}});b.registerLanguage("parser3",function(a){var b=a.COMMENT("{","}",{contains:["self"]});return{subLanguage:"xml",relevance:0,contains:[a.COMMENT("^#","$"),a.COMMENT("\\^rem{","}",{relevance:10,contains:[b]}),{className:"meta",begin:"^@(?:BASE|USE|CLASS|OPTIONS)$",relevance:10},{className:"title",begin:"@[\\w\\-]+\\[[\\w^;\\-]*\\](?:\\[[\\w^;\\-]*\\])?(?:.*)$"},{className:"variable",begin:"\\$\\{?[\\w\\-\\.\\:]+\\}?"},{className:"keyword",begin:"\\^[\\w\\-\\.\\:]+"},
+{className:"number",begin:"\\^#[0-9a-fA-F]+"},a.C_NUMBER_MODE]}});b.registerLanguage("pf",function(a){return{aliases:["pf.conf"],lexemes:/[a-z0-9_<>-]+/,keywords:{built_in:"block match pass load anchor|5 antispoof|10 set table",keyword:"in out log quick on rdomain inet inet6 proto from port os to routeallow-opts divert-packet divert-reply divert-to flags group icmp-typeicmp6-type label once probability recieved-on rtable prio queuetos tag tagged user keep fragment for os dropaf-to|10 binat-to|10 nat-to|10 rdr-to|10 bitmask least-stats random round-robinsource-hash static-portdup-to reply-to route-toparent bandwidth default min max qlimitblock-policy debug fingerprints hostid limit loginterface optimizationreassemble ruleset-optimization basic none profile skip state-defaultsstate-policy timeoutconst counters persistno modulate synproxy state|5 floating if-bound no-sync pflow|10 sloppysource-track global rule max-src-nodes max-src-states max-src-connmax-src-conn-rate overload flushscrub|5 max-mss min-ttl no-df|10 random-id",
+literal:"all any no-route self urpf-failed egress|5 unknown"},contains:[a.HASH_COMMENT_MODE,a.NUMBER_MODE,a.QUOTE_STRING_MODE,{className:"variable",begin:/\$[\w\d#@][\w\d_]*/},{className:"variable",begin:/<(?!\/)/,end:/>/}]}});b.registerLanguage("pgsql",function(a){var b=a.COMMENT("--","$");"HSTORE|10 LO LTREE|10 ";var d="BIGINT INT8 BIGSERIAL SERIAL8 BIT VARYING VARBIT BOOLEAN BOOL BOX BYTEA CHARACTER CHAR VARCHAR CIDR CIRCLE DATE DOUBLE PRECISION FLOAT8 FLOAT INET INTEGER INT INT4 INTERVAL JSON JSONB LINE LSEG|10 MACADDR MACADDR8 MONEY NUMERIC DEC DECIMAL PATH POINT POLYGON REAL FLOAT4 SMALLINT INT2 SMALLSERIAL|10 SERIAL2|10 SERIAL|10 SERIAL4|10 TEXT TIME ZONE TIMETZ|10 TIMESTAMP TIMESTAMPTZ|10 TSQUERY|10 TSVECTOR|10 TXID_SNAPSHOT|10 UUID XML NATIONAL NCHAR INT4RANGE|10 INT8RANGE|10 NUMRANGE|10 TSRANGE|10 TSTZRANGE|10 DATERANGE|10 ANYELEMENT ANYARRAY ANYNONARRAY ANYENUM ANYRANGE CSTRING INTERNAL RECORD PG_DDL_COMMAND VOID UNKNOWN OPAQUE REFCURSOR NAME OID REGPROC|10 REGPROCEDURE|10 REGOPER|10 REGOPERATOR|10 REGCLASS|10 REGTYPE|10 REGROLE|10 REGNAMESPACE|10 REGCONFIG|10 REGDICTIONARY|10".split(" ").map(function(a){return a.split("|")[0]}).join("|"),
+e="ARRAY_AGG AVG BIT_AND BIT_OR BOOL_AND BOOL_OR COUNT EVERY JSON_AGG JSONB_AGG JSON_OBJECT_AGG JSONB_OBJECT_AGG MAX MIN MODE STRING_AGG SUM XMLAGG CORR COVAR_POP COVAR_SAMP REGR_AVGX REGR_AVGY REGR_COUNT REGR_INTERCEPT REGR_R2 REGR_SLOPE REGR_SXX REGR_SXY REGR_SYY STDDEV STDDEV_POP STDDEV_SAMP VARIANCE VAR_POP VAR_SAMP PERCENTILE_CONT PERCENTILE_DISC ROW_NUMBER RANK DENSE_RANK PERCENT_RANK CUME_DIST NTILE LAG LEAD FIRST_VALUE LAST_VALUE NTH_VALUE NUM_NONNULLS NUM_NULLS ABS CBRT CEIL CEILING DEGREES DIV EXP FLOOR LN LOG MOD PI POWER RADIANS ROUND SCALE SIGN SQRT TRUNC WIDTH_BUCKET RANDOM SETSEED ACOS ACOSD ASIN ASIND ATAN ATAND ATAN2 ATAN2D COS COSD COT COTD SIN SIND TAN TAND BIT_LENGTH CHAR_LENGTH CHARACTER_LENGTH LOWER OCTET_LENGTH OVERLAY POSITION SUBSTRING TREAT TRIM UPPER ASCII BTRIM CHR CONCAT CONCAT_WS CONVERT CONVERT_FROM CONVERT_TO DECODE ENCODE INITCAPLEFT LENGTH LPAD LTRIM MD5 PARSE_IDENT PG_CLIENT_ENCODING QUOTE_IDENT|10 QUOTE_LITERAL|10 QUOTE_NULLABLE|10 REGEXP_MATCH REGEXP_MATCHES REGEXP_REPLACE REGEXP_SPLIT_TO_ARRAY REGEXP_SPLIT_TO_TABLE REPEAT REPLACE REVERSE RIGHT RPAD RTRIM SPLIT_PART STRPOS SUBSTR TO_ASCII TO_HEX TRANSLATE OCTET_LENGTH GET_BIT GET_BYTE SET_BIT SET_BYTE TO_CHAR TO_DATE TO_NUMBER TO_TIMESTAMP AGE CLOCK_TIMESTAMP|10 DATE_PART DATE_TRUNC ISFINITE JUSTIFY_DAYS JUSTIFY_HOURS JUSTIFY_INTERVAL MAKE_DATE MAKE_INTERVAL|10 MAKE_TIME MAKE_TIMESTAMP|10 MAKE_TIMESTAMPTZ|10 NOW STATEMENT_TIMESTAMP|10 TIMEOFDAY TRANSACTION_TIMESTAMP|10 ENUM_FIRST ENUM_LAST ENUM_RANGE AREA CENTER DIAMETER HEIGHT ISCLOSED ISOPEN NPOINTS PCLOSE POPEN RADIUS WIDTH BOX BOUND_BOX CIRCLE LINE LSEG PATH POLYGON ABBREV BROADCAST HOST HOSTMASK MASKLEN NETMASK NETWORK SET_MASKLEN TEXT INET_SAME_FAMILYINET_MERGE MACADDR8_SET7BIT ARRAY_TO_TSVECTOR GET_CURRENT_TS_CONFIG NUMNODE PLAINTO_TSQUERY PHRASETO_TSQUERY WEBSEARCH_TO_TSQUERY QUERYTREE SETWEIGHT STRIP TO_TSQUERY TO_TSVECTOR JSON_TO_TSVECTOR JSONB_TO_TSVECTOR TS_DELETE TS_FILTER TS_HEADLINE TS_RANK TS_RANK_CD TS_REWRITE TSQUERY_PHRASE TSVECTOR_TO_ARRAY TSVECTOR_UPDATE_TRIGGER TSVECTOR_UPDATE_TRIGGER_COLUMN XMLCOMMENT XMLCONCAT XMLELEMENT XMLFOREST XMLPI XMLROOT XMLEXISTS XML_IS_WELL_FORMED XML_IS_WELL_FORMED_DOCUMENT XML_IS_WELL_FORMED_CONTENT XPATH XPATH_EXISTS XMLTABLE XMLNAMESPACES TABLE_TO_XML TABLE_TO_XMLSCHEMA TABLE_TO_XML_AND_XMLSCHEMA QUERY_TO_XML QUERY_TO_XMLSCHEMA QUERY_TO_XML_AND_XMLSCHEMA CURSOR_TO_XML CURSOR_TO_XMLSCHEMA SCHEMA_TO_XML SCHEMA_TO_XMLSCHEMA SCHEMA_TO_XML_AND_XMLSCHEMA DATABASE_TO_XML DATABASE_TO_XMLSCHEMA DATABASE_TO_XML_AND_XMLSCHEMA XMLATTRIBUTES TO_JSON TO_JSONB ARRAY_TO_JSON ROW_TO_JSON JSON_BUILD_ARRAY JSONB_BUILD_ARRAY JSON_BUILD_OBJECT JSONB_BUILD_OBJECT JSON_OBJECT JSONB_OBJECT JSON_ARRAY_LENGTH JSONB_ARRAY_LENGTH JSON_EACH JSONB_EACH JSON_EACH_TEXT JSONB_EACH_TEXT JSON_EXTRACT_PATH JSONB_EXTRACT_PATH JSON_OBJECT_KEYS JSONB_OBJECT_KEYS JSON_POPULATE_RECORD JSONB_POPULATE_RECORD JSON_POPULATE_RECORDSET JSONB_POPULATE_RECORDSET JSON_ARRAY_ELEMENTS JSONB_ARRAY_ELEMENTS JSON_ARRAY_ELEMENTS_TEXT JSONB_ARRAY_ELEMENTS_TEXT JSON_TYPEOF JSONB_TYPEOF JSON_TO_RECORD JSONB_TO_RECORD JSON_TO_RECORDSET JSONB_TO_RECORDSET JSON_STRIP_NULLS JSONB_STRIP_NULLS JSONB_SET JSONB_INSERT JSONB_PRETTY CURRVAL LASTVAL NEXTVAL SETVAL COALESCE NULLIF GREATEST LEAST ARRAY_APPEND ARRAY_CAT ARRAY_NDIMS ARRAY_DIMS ARRAY_FILL ARRAY_LENGTH ARRAY_LOWER ARRAY_POSITION ARRAY_POSITIONS ARRAY_PREPEND ARRAY_REMOVE ARRAY_REPLACE ARRAY_TO_STRING ARRAY_UPPER CARDINALITY STRING_TO_ARRAY UNNEST ISEMPTY LOWER_INC UPPER_INC LOWER_INF UPPER_INF RANGE_MERGE GENERATE_SERIES GENERATE_SUBSCRIPTS CURRENT_DATABASE CURRENT_QUERY CURRENT_SCHEMA|10 CURRENT_SCHEMAS|10 INET_CLIENT_ADDR INET_CLIENT_PORT INET_SERVER_ADDR INET_SERVER_PORT ROW_SECURITY_ACTIVE FORMAT_TYPE TO_REGCLASS TO_REGPROC TO_REGPROCEDURE TO_REGOPER TO_REGOPERATOR TO_REGTYPE TO_REGNAMESPACE TO_REGROLE COL_DESCRIPTION OBJ_DESCRIPTION SHOBJ_DESCRIPTION TXID_CURRENT TXID_CURRENT_IF_ASSIGNED TXID_CURRENT_SNAPSHOT TXID_SNAPSHOT_XIP TXID_SNAPSHOT_XMAX TXID_SNAPSHOT_XMIN TXID_VISIBLE_IN_SNAPSHOT TXID_STATUS CURRENT_SETTING SET_CONFIG BRIN_SUMMARIZE_NEW_VALUES BRIN_SUMMARIZE_RANGE BRIN_DESUMMARIZE_RANGE GIN_CLEAN_PENDING_LIST SUPPRESS_REDUNDANT_UPDATES_TRIGGER LO_FROM_BYTEA LO_PUT LO_GET LO_CREAT LO_CREATE LO_UNLINK LO_IMPORT LO_EXPORT LOREAD LOWRITE GROUPING CAST".split(" ").map(function(a){return a.split("|")[0]}).join("|");
+return{aliases:["postgres","postgresql"],case_insensitive:!0,keywords:{keyword:"ABORT ALTER ANALYZE BEGIN CALL CHECKPOINT|10 CLOSE CLUSTER COMMENT COMMIT COPY CREATE DEALLOCATE DECLARE DELETE DISCARD DO DROP END EXECUTE EXPLAIN FETCH GRANT IMPORT INSERT LISTEN LOAD LOCK MOVE NOTIFY PREPARE REASSIGN|10 REFRESH REINDEX RELEASE RESET REVOKE ROLLBACK SAVEPOINT SECURITY SELECT SET SHOW START TRUNCATE UNLISTEN|10 UPDATE VACUUM|10 VALUES AGGREGATE COLLATION CONVERSION|10 DATABASE DEFAULT PRIVILEGES DOMAIN TRIGGER EXTENSION FOREIGN WRAPPER|10 TABLE FUNCTION GROUP LANGUAGE LARGE OBJECT MATERIALIZED VIEW OPERATOR CLASS FAMILY POLICY PUBLICATION|10 ROLE RULE SCHEMA SEQUENCE SERVER STATISTICS SUBSCRIPTION SYSTEM TABLESPACE CONFIGURATION DICTIONARY PARSER TEMPLATE TYPE USER MAPPING PREPARED ACCESS METHOD CAST AS TRANSFORM TRANSACTION OWNED TO INTO SESSION AUTHORIZATION INDEX PROCEDURE ASSERTION ALL ANALYSE AND ANY ARRAY ASC ASYMMETRIC|10 BOTH CASE CHECK COLLATE COLUMN CONCURRENTLY|10 CONSTRAINT CROSS DEFERRABLE RANGE DESC DISTINCT ELSE EXCEPT FOR FREEZE|10 FROM FULL HAVING ILIKE IN INITIALLY INNER INTERSECT IS ISNULL JOIN LATERAL LEADING LIKE LIMIT NATURAL NOT NOTNULL NULL OFFSET ON ONLY OR ORDER OUTER OVERLAPS PLACING PRIMARY REFERENCES RETURNING SIMILAR SOME SYMMETRIC TABLESAMPLE THEN TRAILING UNION UNIQUE USING VARIADIC|10 VERBOSE WHEN WHERE WINDOW WITH BY RETURNS INOUT OUT SETOF|10 IF STRICT CURRENT CONTINUE OWNER LOCATION OVER PARTITION WITHIN BETWEEN ESCAPE EXTERNAL INVOKER DEFINER WORK RENAME VERSION CONNECTION CONNECT TABLES TEMP TEMPORARY FUNCTIONS SEQUENCES TYPES SCHEMAS OPTION CASCADE RESTRICT ADD ADMIN EXISTS VALID VALIDATE ENABLE DISABLE REPLICA|10 ALWAYS PASSING COLUMNS PATH REF VALUE OVERRIDING IMMUTABLE STABLE VOLATILE BEFORE AFTER EACH ROW PROCEDURAL ROUTINE NO HANDLER VALIDATOR OPTIONS STORAGE OIDS|10 WITHOUT INHERIT DEPENDS CALLED INPUT LEAKPROOF|10 COST ROWS NOWAIT SEARCH UNTIL ENCRYPTED|10 PASSWORD CONFLICT|10 INSTEAD INHERITS CHARACTERISTICS WRITE CURSOR ALSO STATEMENT SHARE EXCLUSIVE INLINE ISOLATION REPEATABLE READ COMMITTED SERIALIZABLE UNCOMMITTED LOCAL GLOBAL SQL PROCEDURES RECURSIVE SNAPSHOT ROLLUP CUBE TRUSTED|10 INCLUDE FOLLOWING PRECEDING UNBOUNDED RANGE GROUPS UNENCRYPTED|10 SYSID FORMAT DELIMITER HEADER QUOTE ENCODING FILTER OFF FORCE_QUOTE FORCE_NOT_NULL FORCE_NULL COSTS BUFFERS TIMING SUMMARY DISABLE_PAGE_SKIPPING RESTART CYCLE GENERATED IDENTITY DEFERRED IMMEDIATE LEVEL LOGGED UNLOGGED OF NOTHING NONE EXCLUDE ATTRIBUTE USAGE ROUTINES TRUE FALSE NAN INFINITY ALIAS BEGIN CONSTANT DECLARE END EXCEPTION RETURN PERFORM|10 RAISE GET DIAGNOSTICS STACKED|10 FOREACH LOOP ELSIF EXIT WHILE REVERSE SLICE DEBUG LOG INFO NOTICE WARNING ASSERT OPEN SUPERUSER NOSUPERUSER CREATEDB NOCREATEDB CREATEROLE NOCREATEROLE INHERIT NOINHERIT LOGIN NOLOGIN REPLICATION NOREPLICATION BYPASSRLS NOBYPASSRLS ",
+built_in:"CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER CURRENT_CATALOG|10 CURRENT_DATE LOCALTIME LOCALTIMESTAMP CURRENT_ROLE|10 CURRENT_SCHEMA|10 SESSION_USER PUBLIC FOUND NEW OLD TG_NAME|10 TG_WHEN|10 TG_LEVEL|10 TG_OP|10 TG_RELID|10 TG_RELNAME|10 TG_TABLE_NAME|10 TG_TABLE_SCHEMA|10 TG_NARGS|10 TG_ARGV|10 TG_EVENT|10 TG_TAG|10 ROW_COUNT RESULT_OID|10 PG_CONTEXT|10 RETURNED_SQLSTATE COLUMN_NAME CONSTRAINT_NAME PG_DATATYPE_NAME|10 MESSAGE_TEXT TABLE_NAME SCHEMA_NAME PG_EXCEPTION_DETAIL|10 PG_EXCEPTION_HINT|10 PG_EXCEPTION_CONTEXT|10 SQLSTATE SQLERRM|10 SUCCESSFUL_COMPLETION WARNING DYNAMIC_RESULT_SETS_RETURNED IMPLICIT_ZERO_BIT_PADDING NULL_VALUE_ELIMINATED_IN_SET_FUNCTION PRIVILEGE_NOT_GRANTED PRIVILEGE_NOT_REVOKED STRING_DATA_RIGHT_TRUNCATION DEPRECATED_FEATURE NO_DATA NO_ADDITIONAL_DYNAMIC_RESULT_SETS_RETURNED SQL_STATEMENT_NOT_YET_COMPLETE CONNECTION_EXCEPTION CONNECTION_DOES_NOT_EXIST CONNECTION_FAILURE SQLCLIENT_UNABLE_TO_ESTABLISH_SQLCONNECTION SQLSERVER_REJECTED_ESTABLISHMENT_OF_SQLCONNECTION TRANSACTION_RESOLUTION_UNKNOWN PROTOCOL_VIOLATION TRIGGERED_ACTION_EXCEPTION FEATURE_NOT_SUPPORTED INVALID_TRANSACTION_INITIATION LOCATOR_EXCEPTION INVALID_LOCATOR_SPECIFICATION INVALID_GRANTOR INVALID_GRANT_OPERATION INVALID_ROLE_SPECIFICATION DIAGNOSTICS_EXCEPTION STACKED_DIAGNOSTICS_ACCESSED_WITHOUT_ACTIVE_HANDLER CASE_NOT_FOUND CARDINALITY_VIOLATION DATA_EXCEPTION ARRAY_SUBSCRIPT_ERROR CHARACTER_NOT_IN_REPERTOIRE DATETIME_FIELD_OVERFLOW DIVISION_BY_ZERO ERROR_IN_ASSIGNMENT ESCAPE_CHARACTER_CONFLICT INDICATOR_OVERFLOW INTERVAL_FIELD_OVERFLOW INVALID_ARGUMENT_FOR_LOGARITHM INVALID_ARGUMENT_FOR_NTILE_FUNCTION INVALID_ARGUMENT_FOR_NTH_VALUE_FUNCTION INVALID_ARGUMENT_FOR_POWER_FUNCTION INVALID_ARGUMENT_FOR_WIDTH_BUCKET_FUNCTION INVALID_CHARACTER_VALUE_FOR_CAST INVALID_DATETIME_FORMAT INVALID_ESCAPE_CHARACTER INVALID_ESCAPE_OCTET INVALID_ESCAPE_SEQUENCE NONSTANDARD_USE_OF_ESCAPE_CHARACTER INVALID_INDICATOR_PARAMETER_VALUE INVALID_PARAMETER_VALUE INVALID_REGULAR_EXPRESSION INVALID_ROW_COUNT_IN_LIMIT_CLAUSE INVALID_ROW_COUNT_IN_RESULT_OFFSET_CLAUSE INVALID_TABLESAMPLE_ARGUMENT INVALID_TABLESAMPLE_REPEAT INVALID_TIME_ZONE_DISPLACEMENT_VALUE INVALID_USE_OF_ESCAPE_CHARACTER MOST_SPECIFIC_TYPE_MISMATCH NULL_VALUE_NOT_ALLOWED NULL_VALUE_NO_INDICATOR_PARAMETER NUMERIC_VALUE_OUT_OF_RANGE SEQUENCE_GENERATOR_LIMIT_EXCEEDED STRING_DATA_LENGTH_MISMATCH STRING_DATA_RIGHT_TRUNCATION SUBSTRING_ERROR TRIM_ERROR UNTERMINATED_C_STRING ZERO_LENGTH_CHARACTER_STRING FLOATING_POINT_EXCEPTION INVALID_TEXT_REPRESENTATION INVALID_BINARY_REPRESENTATION BAD_COPY_FILE_FORMAT UNTRANSLATABLE_CHARACTER NOT_AN_XML_DOCUMENT INVALID_XML_DOCUMENT INVALID_XML_CONTENT INVALID_XML_COMMENT INVALID_XML_PROCESSING_INSTRUCTION INTEGRITY_CONSTRAINT_VIOLATION RESTRICT_VIOLATION NOT_NULL_VIOLATION FOREIGN_KEY_VIOLATION UNIQUE_VIOLATION CHECK_VIOLATION EXCLUSION_VIOLATION INVALID_CURSOR_STATE INVALID_TRANSACTION_STATE ACTIVE_SQL_TRANSACTION BRANCH_TRANSACTION_ALREADY_ACTIVE HELD_CURSOR_REQUIRES_SAME_ISOLATION_LEVEL INAPPROPRIATE_ACCESS_MODE_FOR_BRANCH_TRANSACTION INAPPROPRIATE_ISOLATION_LEVEL_FOR_BRANCH_TRANSACTION NO_ACTIVE_SQL_TRANSACTION_FOR_BRANCH_TRANSACTION READ_ONLY_SQL_TRANSACTION SCHEMA_AND_DATA_STATEMENT_MIXING_NOT_SUPPORTED NO_ACTIVE_SQL_TRANSACTION IN_FAILED_SQL_TRANSACTION IDLE_IN_TRANSACTION_SESSION_TIMEOUT INVALID_SQL_STATEMENT_NAME TRIGGERED_DATA_CHANGE_VIOLATION INVALID_AUTHORIZATION_SPECIFICATION INVALID_PASSWORD DEPENDENT_PRIVILEGE_DESCRIPTORS_STILL_EXIST DEPENDENT_OBJECTS_STILL_EXIST INVALID_TRANSACTION_TERMINATION SQL_ROUTINE_EXCEPTION FUNCTION_EXECUTED_NO_RETURN_STATEMENT MODIFYING_SQL_DATA_NOT_PERMITTED PROHIBITED_SQL_STATEMENT_ATTEMPTED READING_SQL_DATA_NOT_PERMITTED INVALID_CURSOR_NAME EXTERNAL_ROUTINE_EXCEPTION CONTAINING_SQL_NOT_PERMITTED MODIFYING_SQL_DATA_NOT_PERMITTED PROHIBITED_SQL_STATEMENT_ATTEMPTED READING_SQL_DATA_NOT_PERMITTED EXTERNAL_ROUTINE_INVOCATION_EXCEPTION INVALID_SQLSTATE_RETURNED NULL_VALUE_NOT_ALLOWED TRIGGER_PROTOCOL_VIOLATED SRF_PROTOCOL_VIOLATED EVENT_TRIGGER_PROTOCOL_VIOLATED SAVEPOINT_EXCEPTION INVALID_SAVEPOINT_SPECIFICATION INVALID_CATALOG_NAME INVALID_SCHEMA_NAME TRANSACTION_ROLLBACK TRANSACTION_INTEGRITY_CONSTRAINT_VIOLATION SERIALIZATION_FAILURE STATEMENT_COMPLETION_UNKNOWN DEADLOCK_DETECTED SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION SYNTAX_ERROR INSUFFICIENT_PRIVILEGE CANNOT_COERCE GROUPING_ERROR WINDOWING_ERROR INVALID_RECURSION INVALID_FOREIGN_KEY INVALID_NAME NAME_TOO_LONG RESERVED_NAME DATATYPE_MISMATCH INDETERMINATE_DATATYPE COLLATION_MISMATCH INDETERMINATE_COLLATION WRONG_OBJECT_TYPE GENERATED_ALWAYS UNDEFINED_COLUMN UNDEFINED_FUNCTION UNDEFINED_TABLE UNDEFINED_PARAMETER UNDEFINED_OBJECT DUPLICATE_COLUMN DUPLICATE_CURSOR DUPLICATE_DATABASE DUPLICATE_FUNCTION DUPLICATE_PREPARED_STATEMENT DUPLICATE_SCHEMA DUPLICATE_TABLE DUPLICATE_ALIAS DUPLICATE_OBJECT AMBIGUOUS_COLUMN AMBIGUOUS_FUNCTION AMBIGUOUS_PARAMETER AMBIGUOUS_ALIAS INVALID_COLUMN_REFERENCE INVALID_COLUMN_DEFINITION INVALID_CURSOR_DEFINITION INVALID_DATABASE_DEFINITION INVALID_FUNCTION_DEFINITION INVALID_PREPARED_STATEMENT_DEFINITION INVALID_SCHEMA_DEFINITION INVALID_TABLE_DEFINITION INVALID_OBJECT_DEFINITION WITH_CHECK_OPTION_VIOLATION INSUFFICIENT_RESOURCES DISK_FULL OUT_OF_MEMORY TOO_MANY_CONNECTIONS CONFIGURATION_LIMIT_EXCEEDED PROGRAM_LIMIT_EXCEEDED STATEMENT_TOO_COMPLEX TOO_MANY_COLUMNS TOO_MANY_ARGUMENTS OBJECT_NOT_IN_PREREQUISITE_STATE OBJECT_IN_USE CANT_CHANGE_RUNTIME_PARAM LOCK_NOT_AVAILABLE OPERATOR_INTERVENTION QUERY_CANCELED ADMIN_SHUTDOWN CRASH_SHUTDOWN CANNOT_CONNECT_NOW DATABASE_DROPPED SYSTEM_ERROR IO_ERROR UNDEFINED_FILE DUPLICATE_FILE SNAPSHOT_TOO_OLD CONFIG_FILE_ERROR LOCK_FILE_EXISTS FDW_ERROR FDW_COLUMN_NAME_NOT_FOUND FDW_DYNAMIC_PARAMETER_VALUE_NEEDED FDW_FUNCTION_SEQUENCE_ERROR FDW_INCONSISTENT_DESCRIPTOR_INFORMATION FDW_INVALID_ATTRIBUTE_VALUE FDW_INVALID_COLUMN_NAME FDW_INVALID_COLUMN_NUMBER FDW_INVALID_DATA_TYPE FDW_INVALID_DATA_TYPE_DESCRIPTORS FDW_INVALID_DESCRIPTOR_FIELD_IDENTIFIER FDW_INVALID_HANDLE FDW_INVALID_OPTION_INDEX FDW_INVALID_OPTION_NAME FDW_INVALID_STRING_LENGTH_OR_BUFFER_LENGTH FDW_INVALID_STRING_FORMAT FDW_INVALID_USE_OF_NULL_POINTER FDW_TOO_MANY_HANDLES FDW_OUT_OF_MEMORY FDW_NO_SCHEMAS FDW_OPTION_NAME_NOT_FOUND FDW_REPLY_HANDLE FDW_SCHEMA_NOT_FOUND FDW_TABLE_NOT_FOUND FDW_UNABLE_TO_CREATE_EXECUTION FDW_UNABLE_TO_CREATE_REPLY FDW_UNABLE_TO_ESTABLISH_CONNECTION PLPGSQL_ERROR RAISE_EXCEPTION NO_DATA_FOUND TOO_MANY_ROWS ASSERT_FAILURE INTERNAL_ERROR DATA_CORRUPTED INDEX_CORRUPTED "},
+illegal:/:==|\W\s*\(\*|(^|\s)\$[a-z]|{{|[a-z]:\s*$|\.\.\.|TO:|DO:/,contains:[{className:"keyword",variants:[{begin:/\bTEXT\s*SEARCH\b/},{begin:/\b(PRIMARY|FOREIGN|FOR(\s+NO)?)\s+KEY\b/},{begin:/\bPARALLEL\s+(UNSAFE|RESTRICTED|SAFE)\b/},{begin:/\bSTORAGE\s+(PLAIN|EXTERNAL|EXTENDED|MAIN)\b/},{begin:/\bMATCH\s+(FULL|PARTIAL|SIMPLE)\b/},{begin:/\bNULLS\s+(FIRST|LAST)\b/},{begin:/\bEVENT\s+TRIGGER\b/},{begin:/\b(MAPPING|OR)\s+REPLACE\b/},{begin:/\b(FROM|TO)\s+(PROGRAM|STDIN|STDOUT)\b/},{begin:/\b(SHARE|EXCLUSIVE)\s+MODE\b/},
+{begin:/\b(LEFT|RIGHT)\s+(OUTER\s+)?JOIN\b/},{begin:/\b(FETCH|MOVE)\s+(NEXT|PRIOR|FIRST|LAST|ABSOLUTE|RELATIVE|FORWARD|BACKWARD)\b/},{begin:/\bPRESERVE\s+ROWS\b/},{begin:/\bDISCARD\s+PLANS\b/},{begin:/\bREFERENCING\s+(OLD|NEW)\b/},{begin:/\bSKIP\s+LOCKED\b/},{begin:/\bGROUPING\s+SETS\b/},{begin:/\b(BINARY|INSENSITIVE|SCROLL|NO\s+SCROLL)\s+(CURSOR|FOR)\b/},{begin:/\b(WITH|WITHOUT)\s+HOLD\b/},{begin:/\bWITH\s+(CASCADED|LOCAL)\s+CHECK\s+OPTION\b/},{begin:/\bEXCLUDE\s+(TIES|NO\s+OTHERS)\b/},{begin:/\bFORMAT\s+(TEXT|XML|JSON|YAML)\b/},
+{begin:/\bSET\s+((SESSION|LOCAL)\s+)?NAMES\b/},{begin:/\bIS\s+(NOT\s+)?UNKNOWN\b/},{begin:/\bSECURITY\s+LABEL\b/},{begin:/\bSTANDALONE\s+(YES|NO|NO\s+VALUE)\b/},{begin:/\bWITH\s+(NO\s+)?DATA\b/},{begin:/\b(FOREIGN|SET)\s+DATA\b/},{begin:/\bSET\s+(CATALOG|CONSTRAINTS)\b/},{begin:/\b(WITH|FOR)\s+ORDINALITY\b/},{begin:/\bIS\s+(NOT\s+)?DOCUMENT\b/},{begin:/\bXML\s+OPTION\s+(DOCUMENT|CONTENT)\b/},{begin:/\b(STRIP|PRESERVE)\s+WHITESPACE\b/},{begin:/\bNO\s+(ACTION|MAXVALUE|MINVALUE)\b/},{begin:/\bPARTITION\s+BY\s+(RANGE|LIST|HASH)\b/},
+{begin:/\bAT\s+TIME\s+ZONE\b/},{begin:/\bGRANTED\s+BY\b/},{begin:/\bRETURN\s+(QUERY|NEXT)\b/},{begin:/\b(ATTACH|DETACH)\s+PARTITION\b/},{begin:/\bFORCE\s+ROW\s+LEVEL\s+SECURITY\b/},{begin:/\b(INCLUDING|EXCLUDING)\s+(COMMENTS|CONSTRAINTS|DEFAULTS|IDENTITY|INDEXES|STATISTICS|STORAGE|ALL)\b/},{begin:/\bAS\s+(ASSIGNMENT|IMPLICIT|PERMISSIVE|RESTRICTIVE|ENUM|RANGE)\b/}]},{begin:/\b(FORMAT|FAMILY|VERSION)\s*\(/},{begin:/\bINCLUDE\s*\(/,keywords:"INCLUDE"},{begin:/\bRANGE(?!\s*(BETWEEN|UNBOUNDED|CURRENT|[-0-9]+))/},
+{begin:/\b(VERSION|OWNER|TEMPLATE|TABLESPACE|CONNECTION\s+LIMIT|PROCEDURE|RESTRICT|JOIN|PARSER|COPY|START|END|COLLATION|INPUT|ANALYZE|STORAGE|LIKE|DEFAULT|DELIMITER|ENCODING|COLUMN|CONSTRAINT|TABLE|SCHEMA)\s*=/},{begin:/\b(PG_\w+?|HAS_[A-Z_]+_PRIVILEGE)\b/,relevance:10},{begin:/\bEXTRACT\s*\(/,end:/\bFROM\b/,returnEnd:!0,keywords:{type:"CENTURY DAY DECADE DOW DOY EPOCH HOUR ISODOW ISOYEAR MICROSECONDS MILLENNIUM MILLISECONDS MINUTE MONTH QUARTER SECOND TIMEZONE TIMEZONE_HOUR TIMEZONE_MINUTE WEEK YEAR"}},
+{begin:/\b(XMLELEMENT|XMLPI)\s*\(\s*NAME/,keywords:{keyword:"NAME"}},{begin:/\b(XMLPARSE|XMLSERIALIZE)\s*\(\s*(DOCUMENT|CONTENT)/,keywords:{keyword:"DOCUMENT CONTENT"}},{beginKeywords:"CACHE INCREMENT MAXVALUE MINVALUE",end:a.C_NUMBER_RE,returnEnd:!0,keywords:"BY CACHE INCREMENT MAXVALUE MINVALUE"},{className:"type",begin:/\b(WITH|WITHOUT)\s+TIME\s+ZONE\b/},{className:"type",begin:/\bINTERVAL\s+(YEAR|MONTH|DAY|HOUR|MINUTE|SECOND)(\s+TO\s+(MONTH|HOUR|MINUTE|SECOND))?\b/},{begin:/\bRETURNS\s+(LANGUAGE_HANDLER|TRIGGER|EVENT_TRIGGER|FDW_HANDLER|INDEX_AM_HANDLER|TSM_HANDLER)\b/,
+keywords:{keyword:"RETURNS",type:"LANGUAGE_HANDLER TRIGGER EVENT_TRIGGER FDW_HANDLER INDEX_AM_HANDLER TSM_HANDLER"}},{begin:"\\b("+e+")\\s*\\("},{begin:"\\.("+d+")\\b"},{begin:"\\b("+d+")\\s+PATH\\b",keywords:{keyword:"PATH",type:"BIGINT INT8 BIGSERIAL SERIAL8 BIT VARYING VARBIT BOOLEAN BOOL BOX BYTEA CHARACTER CHAR VARCHAR CIDR CIRCLE DATE DOUBLE PRECISION FLOAT8 FLOAT INET INTEGER INT INT4 INTERVAL JSON JSONB LINE LSEG|10 MACADDR MACADDR8 MONEY NUMERIC DEC DECIMAL PATH POINT POLYGON REAL FLOAT4 SMALLINT INT2 SMALLSERIAL|10 SERIAL2|10 SERIAL|10 SERIAL4|10 TEXT TIME ZONE TIMETZ|10 TIMESTAMP TIMESTAMPTZ|10 TSQUERY|10 TSVECTOR|10 TXID_SNAPSHOT|10 UUID XML NATIONAL NCHAR INT4RANGE|10 INT8RANGE|10 NUMRANGE|10 TSRANGE|10 TSTZRANGE|10 DATERANGE|10 ANYELEMENT ANYARRAY ANYNONARRAY ANYENUM ANYRANGE CSTRING INTERNAL RECORD PG_DDL_COMMAND VOID UNKNOWN OPAQUE REFCURSOR NAME OID REGPROC|10 REGPROCEDURE|10 REGOPER|10 REGOPERATOR|10 REGCLASS|10 REGTYPE|10 REGROLE|10 REGNAMESPACE|10 REGCONFIG|10 REGDICTIONARY|10 ".replace("PATH ",
+"")}},{className:"type",begin:"\\b("+d+")\\b"},{className:"string",begin:"'",end:"'",contains:[{begin:"''"}]},{className:"string",begin:"(e|E|u&|U&)'",end:"'",contains:[{begin:"\\\\."}],relevance:10},{begin:"\\$([a-zA-Z_]?|[a-zA-Z_][a-zA-Z_0-9]*)\\$",endSameAsBegin:!0,contains:[{subLanguage:"pgsql perl python tcl r lua java php ruby bash scheme xml json".split(" "),endsWithParent:!0}]},{begin:'"',end:'"',contains:[{begin:'""'}]},a.C_NUMBER_MODE,a.C_BLOCK_COMMENT_MODE,b,{className:"meta",variants:[{begin:"%(ROW)?TYPE",
+relevance:10},{begin:"\\$\\d+"},{begin:"^#\\w",end:"$"}]},{className:"symbol",begin:"<<\\s*[a-zA-Z_][a-zA-Z_0-9$]*\\s*>>",relevance:10}]}});b.registerLanguage("php",function(a){var b={begin:"\\$+[a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*"},d={className:"meta",begin:/<\?(php)?|\?>/},e={className:"string",contains:[a.BACKSLASH_ESCAPE,d],variants:[{begin:'b"',end:'"'},{begin:"b'",end:"'"},a.inherit(a.APOS_STRING_MODE,{illegal:null}),a.inherit(a.QUOTE_STRING_MODE,{illegal:null})]},f={variants:[a.BINARY_NUMBER_MODE,
+a.C_NUMBER_MODE]};return{aliases:"php php3 php4 php5 php6 php7".split(" "),case_insensitive:!0,keywords:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",
 contains:[a.HASH_COMMENT_MODE,a.COMMENT("//","$",{contains:[d]}),a.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),a.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0,keywords:"__halt_compiler",lexemes:a.UNDERSCORE_IDENT_RE}),{className:"string",begin:/<<<['"]?\w+['"]?$/,end:/^\w+;?$/,contains:[a.BACKSLASH_ESCAPE,{className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]}]},d,{className:"keyword",begin:/\$this\b/},b,{begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},
-{className:"function",beginKeywords:"function",end:/[;{]/,excludeEnd:!0,illegal:"\\$|\\[|%",contains:[a.UNDERSCORE_TITLE_MODE,{className:"params",begin:"\\(",end:"\\)",contains:["self",b,a.C_BLOCK_COMMENT_MODE,e,c]}]},{className:"class",beginKeywords:"class interface",end:"{",excludeEnd:!0,illegal:/[:\(\$"]/,contains:[{beginKeywords:"extends implements"},a.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",end:";",illegal:/[\.']/,contains:[a.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",end:";",contains:[a.UNDERSCORE_TITLE_MODE]},
-{begin:"=>"},e,c]}});b.registerLanguage("protobuf",function(a){return{keywords:{keyword:"package import option optional required repeated group",built_in:"double float int32 int64 uint32 uint64 sint32 sint64 fixed32 fixed64 sfixed32 sfixed64 bool string bytes",literal:"true false"},contains:[a.QUOTE_STRING_MODE,a.NUMBER_MODE,a.C_LINE_COMMENT_MODE,{className:"class",beginKeywords:"message enum service",end:/\{/,illegal:/\n/,contains:[a.inherit(a.TITLE_MODE,{starts:{endsWithParent:!0,excludeEnd:!0}})]},
-{className:"function",beginKeywords:"rpc",end:/;/,excludeEnd:!0,keywords:"rpc returns"},{begin:/^\s*[A-Z_]+/,end:/\s*=/,excludeEnd:!0}]}});b.registerLanguage("puppet",function(a){var b=a.COMMENT("#","$"),d=a.inherit(a.TITLE_MODE,{begin:"([A-Za-z_]|::)(\\w|::)*"}),e={className:"variable",begin:"\\$([A-Za-z_]|::)(\\w|::)*"},c={className:"string",contains:[a.BACKSLASH_ESCAPE,e],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/}]};return{aliases:["pp"],contains:[b,e,c,{beginKeywords:"class",end:"\\{|;",
-illegal:/=/,contains:[d,b]},{beginKeywords:"define",end:/\{/,contains:[{className:"section",begin:a.IDENT_RE,endsParent:!0}]},{begin:a.IDENT_RE+"\\s+\\{",returnBegin:!0,end:/\S/,contains:[{className:"keyword",begin:a.IDENT_RE},{begin:/\{/,end:/\}/,keywords:{keyword:"and case default else elsif false if in import enherits node or true undef unless main settings $string ",literal:"alias audit before loglevel noop require subscribe tag owner ensure group mode name|0 changes context force incl lens load_path onlyif provider returns root show_diff type_check en_address ip_address realname command environment hour monute month monthday special target weekday creates cwd ogoutput refresh refreshonly tries try_sleep umask backup checksum content ctime force ignore links mtime purge recurse recurselimit replace selinux_ignore_defaults selrange selrole seltype seluser source souirce_permissions sourceselect validate_cmd validate_replacement allowdupe attribute_membership auth_membership forcelocal gid ia_load_module members system host_aliases ip allowed_trunk_vlans description device_url duplex encapsulation etherchannel native_vlan speed principals allow_root auth_class auth_type authenticate_user k_of_n mechanisms rule session_owner shared options device fstype enable hasrestart directory present absent link atboot blockdevice device dump pass remounts poller_tag use message withpath adminfile allow_virtual allowcdrom category configfiles flavor install_options instance package_settings platform responsefile status uninstall_options vendor unless_system_user unless_uid binary control flags hasstatus manifest pattern restart running start stop allowdupe auths expiry gid groups home iterations key_membership keys managehome membership password password_max_age password_min_age profile_membership profiles project purge_ssh_keys role_membership roles salt shell uid baseurl cost descr enabled enablegroups exclude failovermethod gpgcheck gpgkey http_caching include includepkgs keepalive metadata_expire metalink mirrorlist priority protect proxy proxy_password proxy_username repo_gpgcheck s3_enabled skip_if_unavailable sslcacert sslclientcert sslclientkey sslverify mounted",
+{className:"function",beginKeywords:"function",end:/[;{]/,excludeEnd:!0,illegal:"\\$|\\[|%",contains:[a.UNDERSCORE_TITLE_MODE,{className:"params",begin:"\\(",end:"\\)",contains:["self",b,a.C_BLOCK_COMMENT_MODE,e,f]}]},{className:"class",beginKeywords:"class interface",end:"{",excludeEnd:!0,illegal:/[:\(\$"]/,contains:[{beginKeywords:"extends implements"},a.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",end:";",illegal:/[\.']/,contains:[a.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",end:";",contains:[a.UNDERSCORE_TITLE_MODE]},
+{begin:"=>"},e,f]}});b.registerLanguage("plaintext",function(a){return{disableAutodetect:!0}});b.registerLanguage("pony",function(a){var b={className:"type",begin:"\\b_?[A-Z][\\w]*",relevance:0},d={begin:a.IDENT_RE+"'",relevance:0};return{keywords:{keyword:"actor addressof and as be break class compile_error compile_intrinsicconsume continue delegate digestof do else elseif embed end errorfor fun if ifdef in interface is isnt lambda let match new not objector primitive recover repeat return struct then trait try type until use var where while with xor",
+meta:"iso val tag trn box ref",literal:"this false true"},contains:[{className:"class",beginKeywords:"class actor object",end:"$",contains:[a.TITLE_MODE,a.C_LINE_COMMENT_MODE]},{className:"function",beginKeywords:"new fun",end:"=>",contains:[a.TITLE_MODE,{begin:/\(/,end:/\)/,contains:[b,d,a.C_NUMBER_MODE,a.C_BLOCK_COMMENT_MODE]},{begin:/:/,endsWithParent:!0,contains:[b]},a.C_LINE_COMMENT_MODE]},b,{className:"string",begin:'"""',end:'"""',relevance:10},{className:"string",begin:'"',end:'"',contains:[a.BACKSLASH_ESCAPE]},
+{className:"string",begin:"'",end:"'",contains:[a.BACKSLASH_ESCAPE],relevance:0},d,a.C_NUMBER_MODE,a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE]}});b.registerLanguage("powershell",function(a){var b={begin:"`[\\s\\S]",relevance:0},d={className:"variable",variants:[{begin:/\$[\w\d][\w\d_:]*/}]},e={className:"string",variants:[{begin:/"/,end:/"/},{begin:/@"/,end:/^"@/}],contains:[b,d,{className:"variable",begin:/\$[A-z]/,end:/[^A-z]/}]},f=a.inherit(a.COMMENT(null,null),{variants:[{begin:/#/,end:/$/},
+{begin:/<#/,end:/#>/}],contains:[{className:"doctag",variants:[{begin:/\.(synopsis|description|example|inputs|outputs|notes|link|component|role|functionality)/},{begin:/\.(parameter|forwardhelptargetname|forwardhelpcategory|remotehelprunspace|externalhelp)\s+\S+/}]}]});return{aliases:["ps"],lexemes:/-?[A-z\.\-]+/,case_insensitive:!0,keywords:{keyword:"if else foreach return function do while until elseif begin for trap data dynamicparam end break throw param continue finally in switch exit filter try process catch",
+built_in:"Add-Computer Add-Content Add-History Add-JobTrigger Add-Member Add-PSSnapin Add-Type Checkpoint-Computer Clear-Content Clear-EventLog Clear-History Clear-Host Clear-Item Clear-ItemProperty Clear-Variable Compare-Object Complete-Transaction Connect-PSSession Connect-WSMan Convert-Path ConvertFrom-Csv ConvertFrom-Json ConvertFrom-SecureString ConvertFrom-StringData ConvertTo-Csv ConvertTo-Html ConvertTo-Json ConvertTo-SecureString ConvertTo-Xml Copy-Item Copy-ItemProperty Debug-Process Disable-ComputerRestore Disable-JobTrigger Disable-PSBreakpoint Disable-PSRemoting Disable-PSSessionConfiguration Disable-WSManCredSSP Disconnect-PSSession Disconnect-WSMan Disable-ScheduledJob Enable-ComputerRestore Enable-JobTrigger Enable-PSBreakpoint Enable-PSRemoting Enable-PSSessionConfiguration Enable-ScheduledJob Enable-WSManCredSSP Enter-PSSession Exit-PSSession Export-Alias Export-Clixml Export-Console Export-Counter Export-Csv Export-FormatData Export-ModuleMember Export-PSSession ForEach-Object Format-Custom Format-List Format-Table Format-Wide Get-Acl Get-Alias Get-AuthenticodeSignature Get-ChildItem Get-Command Get-ComputerRestorePoint Get-Content Get-ControlPanelItem Get-Counter Get-Credential Get-Culture Get-Date Get-Event Get-EventLog Get-EventSubscriber Get-ExecutionPolicy Get-FormatData Get-Host Get-HotFix Get-Help Get-History Get-IseSnippet Get-Item Get-ItemProperty Get-Job Get-JobTrigger Get-Location Get-Member Get-Module Get-PfxCertificate Get-Process Get-PSBreakpoint Get-PSCallStack Get-PSDrive Get-PSProvider Get-PSSession Get-PSSessionConfiguration Get-PSSnapin Get-Random Get-ScheduledJob Get-ScheduledJobOption Get-Service Get-TraceSource Get-Transaction Get-TypeData Get-UICulture Get-Unique Get-Variable Get-Verb Get-WinEvent Get-WmiObject Get-WSManCredSSP Get-WSManInstance Group-Object Import-Alias Import-Clixml Import-Counter Import-Csv Import-IseSnippet Import-LocalizedData Import-PSSession Import-Module Invoke-AsWorkflow Invoke-Command Invoke-Expression Invoke-History Invoke-Item Invoke-RestMethod Invoke-WebRequest Invoke-WmiMethod Invoke-WSManAction Join-Path Limit-EventLog Measure-Command Measure-Object Move-Item Move-ItemProperty New-Alias New-Event New-EventLog New-IseSnippet New-Item New-ItemProperty New-JobTrigger New-Object New-Module New-ModuleManifest New-PSDrive New-PSSession New-PSSessionConfigurationFile New-PSSessionOption New-PSTransportOption New-PSWorkflowExecutionOption New-PSWorkflowSession New-ScheduledJobOption New-Service New-TimeSpan New-Variable New-WebServiceProxy New-WinEvent New-WSManInstance New-WSManSessionOption Out-Default Out-File Out-GridView Out-Host Out-Null Out-Printer Out-String Pop-Location Push-Location Read-Host Receive-Job Register-EngineEvent Register-ObjectEvent Register-PSSessionConfiguration Register-ScheduledJob Register-WmiEvent Remove-Computer Remove-Event Remove-EventLog Remove-Item Remove-ItemProperty Remove-Job Remove-JobTrigger Remove-Module Remove-PSBreakpoint Remove-PSDrive Remove-PSSession Remove-PSSnapin Remove-TypeData Remove-Variable Remove-WmiObject Remove-WSManInstance Rename-Computer Rename-Item Rename-ItemProperty Reset-ComputerMachinePassword Resolve-Path Restart-Computer Restart-Service Restore-Computer Resume-Job Resume-Service Save-Help Select-Object Select-String Select-Xml Send-MailMessage Set-Acl Set-Alias Set-AuthenticodeSignature Set-Content Set-Date Set-ExecutionPolicy Set-Item Set-ItemProperty Set-JobTrigger Set-Location Set-PSBreakpoint Set-PSDebug Set-PSSessionConfiguration Set-ScheduledJob Set-ScheduledJobOption Set-Service Set-StrictMode Set-TraceSource Set-Variable Set-WmiInstance Set-WSManInstance Set-WSManQuickConfig Show-Command Show-ControlPanelItem Show-EventLog Sort-Object Split-Path Start-Job Start-Process Start-Service Start-Sleep Start-Transaction Start-Transcript Stop-Computer Stop-Job Stop-Process Stop-Service Stop-Transcript Suspend-Job Suspend-Service Tee-Object Test-ComputerSecureChannel Test-Connection Test-ModuleManifest Test-Path Test-PSSessionConfigurationFile Trace-Command Unblock-File Undo-Transaction Unregister-Event Unregister-PSSessionConfiguration Unregister-ScheduledJob Update-FormatData Update-Help Update-List Update-TypeData Use-Transaction Wait-Event Wait-Job Wait-Process Where-Object Write-Debug Write-Error Write-EventLog Write-Host Write-Output Write-Progress Write-Verbose Write-Warning Add-MDTPersistentDrive Disable-MDTMonitorService Enable-MDTMonitorService Get-MDTDeploymentShareStatistics Get-MDTMonitorData Get-MDTOperatingSystemCatalog Get-MDTPersistentDrive Import-MDTApplication Import-MDTDriver Import-MDTOperatingSystem Import-MDTPackage Import-MDTTaskSequence New-MDTDatabase Remove-MDTMonitorData Remove-MDTPersistentDrive Restore-MDTPersistentDrive Set-MDTMonitorData Test-MDTDeploymentShare Test-MDTMonitorData Update-MDTDatabaseSchema Update-MDTDeploymentShare Update-MDTLinkedDS Update-MDTMedia Update-MDTMedia Add-VamtProductKey Export-VamtData Find-VamtManagedMachine Get-VamtConfirmationId Get-VamtProduct Get-VamtProductKey Import-VamtData Initialize-VamtData Install-VamtConfirmationId Install-VamtProductActivation Install-VamtProductKey Update-VamtProduct",
+nomarkup:"-ne -eq -lt -gt -ge -le -not -like -notlike -match -notmatch -contains -notcontains -in -notin -replace"},contains:[b,a.NUMBER_MODE,e,{className:"string",variants:[{begin:/'/,end:/'/},{begin:/@'/,end:/^'@/}]},{className:"literal",begin:/\$(null|true|false)\b/},d,f]}});b.registerLanguage("processing",function(a){return{keywords:{keyword:"BufferedReader PVector PFont PImage PGraphics HashMap boolean byte char color double float int long String Array FloatDict FloatList IntDict IntList JSONArray JSONObject Object StringDict StringList Table TableRow XML false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private",
+literal:"P2D P3D HALF_PI PI QUARTER_PI TAU TWO_PI",title:"setup draw",built_in:"displayHeight displayWidth mouseY mouseX mousePressed pmouseX pmouseY key keyCode pixels focused frameCount frameRate height width size createGraphics beginDraw createShape loadShape PShape arc ellipse line point quad rect triangle bezier bezierDetail bezierPoint bezierTangent curve curveDetail curvePoint curveTangent curveTightness shape shapeMode beginContour beginShape bezierVertex curveVertex endContour endShape quadraticVertex vertex ellipseMode noSmooth rectMode smooth strokeCap strokeJoin strokeWeight mouseClicked mouseDragged mouseMoved mousePressed mouseReleased mouseWheel keyPressed keyPressedkeyReleased keyTyped print println save saveFrame day hour millis minute month second year background clear colorMode fill noFill noStroke stroke alpha blue brightness color green hue lerpColor red saturation modelX modelY modelZ screenX screenY screenZ ambient emissive shininess specular add createImage beginCamera camera endCamera frustum ortho perspective printCamera printProjection cursor frameRate noCursor exit loop noLoop popStyle pushStyle redraw binary boolean byte char float hex int str unbinary unhex join match matchAll nf nfc nfp nfs split splitTokens trim append arrayCopy concat expand reverse shorten sort splice subset box sphere sphereDetail createInput createReader loadBytes loadJSONArray loadJSONObject loadStrings loadTable loadXML open parseXML saveTable selectFolder selectInput beginRaw beginRecord createOutput createWriter endRaw endRecord PrintWritersaveBytes saveJSONArray saveJSONObject saveStream saveStrings saveXML selectOutput popMatrix printMatrix pushMatrix resetMatrix rotate rotateX rotateY rotateZ scale shearX shearY translate ambientLight directionalLight lightFalloff lights lightSpecular noLights normal pointLight spotLight image imageMode loadImage noTint requestImage tint texture textureMode textureWrap blend copy filter get loadPixels set updatePixels blendMode loadShader PShaderresetShader shader createFont loadFont text textFont textAlign textLeading textMode textSize textWidth textAscent textDescent abs ceil constrain dist exp floor lerp log mag map max min norm pow round sq sqrt acos asin atan atan2 cos degrees radians sin tan noise noiseDetail noiseSeed random randomGaussian randomSeed"},
+contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,a.C_NUMBER_MODE]}});b.registerLanguage("profile",function(a){return{contains:[a.C_NUMBER_MODE,{begin:"[a-zA-Z_][\\da-zA-Z_]+\\.[\\da-zA-Z_]{1,3}",end:":",excludeEnd:!0},{begin:"(ncalls|tottime|cumtime)",end:"$",keywords:"ncalls tottime|10 cumtime|10 filename",relevance:10},{begin:"function calls",end:"$",contains:[a.C_NUMBER_MODE],relevance:10},a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,{className:"string",begin:"\\(",
+end:"\\)$",excludeBegin:!0,excludeEnd:!0,relevance:0}]}});b.registerLanguage("prolog",function(a){var b={begin:/\(/,end:/\)/,relevance:0},d={begin:/\[/,end:/\]/};a=[{begin:/[a-z][A-Za-z0-9_]*/,relevance:0},{className:"symbol",variants:[{begin:/[A-Z][a-zA-Z0-9_]*/},{begin:/_[A-Za-z0-9_]*/}],relevance:0},b,{begin:/:-/},d,{className:"comment",begin:/%/,end:/$/,contains:[a.PHRASAL_WORDS_MODE]},a.C_BLOCK_COMMENT_MODE,a.QUOTE_STRING_MODE,a.APOS_STRING_MODE,{className:"string",begin:/`/,end:/`/,contains:[a.BACKSLASH_ESCAPE]},
+{className:"string",begin:/0'(\\'|.)/},{className:"string",begin:/0'\\s/},a.C_NUMBER_MODE];b.contains=a;d.contains=a;return{contains:a.concat([{begin:/\.$/}])}});b.registerLanguage("properties",function(a){var b={end:"([ \\t\\f]*[:=][ \\t\\f]*|[ \\t\\f]+)",relevance:0,starts:{className:"string",end:/$/,relevance:0,contains:[{begin:"\\\\\\n"}]}};return{case_insensitive:!0,illegal:/\S/,contains:[a.COMMENT("^\\s*[!#]","$"),{begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+([ \\t\\f]*[:=][ \\t\\f]*|[ \\t\\f]+)",
+returnBegin:!0,contains:[{className:"attr",begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",endsParent:!0,relevance:0}],starts:b},{begin:"([^\\\\:= \\t\\f\\n]|\\\\.)+([ \\t\\f]*[:=][ \\t\\f]*|[ \\t\\f]+)",returnBegin:!0,relevance:0,contains:[{className:"meta",begin:"([^\\\\:= \\t\\f\\n]|\\\\.)+",endsParent:!0,relevance:0}],starts:b},{className:"attr",relevance:0,begin:"([^\\\\:= \\t\\f\\n]|\\\\.)+[ \\t\\f]*$"}]}});b.registerLanguage("protobuf",function(a){return{keywords:{keyword:"package import option optional required repeated group oneof",
+built_in:"double float int32 int64 uint32 uint64 sint32 sint64 fixed32 fixed64 sfixed32 sfixed64 bool string bytes",literal:"true false"},contains:[a.QUOTE_STRING_MODE,a.NUMBER_MODE,a.C_LINE_COMMENT_MODE,{className:"class",beginKeywords:"message enum service",end:/\{/,illegal:/\n/,contains:[a.inherit(a.TITLE_MODE,{starts:{endsWithParent:!0,excludeEnd:!0}})]},{className:"function",beginKeywords:"rpc",end:/;/,excludeEnd:!0,keywords:"rpc returns"},{begin:/^\s*[A-Z_]+/,end:/\s*=/,excludeEnd:!0}]}});b.registerLanguage("puppet",
+function(a){var b=a.COMMENT("#","$"),d=a.inherit(a.TITLE_MODE,{begin:"([A-Za-z_]|::)(\\w|::)*"}),e={className:"variable",begin:"\\$([A-Za-z_]|::)(\\w|::)*"},f={className:"string",contains:[a.BACKSLASH_ESCAPE,e],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/}]};return{aliases:["pp"],contains:[b,e,f,{beginKeywords:"class",end:"\\{|;",illegal:/=/,contains:[d,b]},{beginKeywords:"define",end:/\{/,contains:[{className:"section",begin:a.IDENT_RE,endsParent:!0}]},{begin:a.IDENT_RE+"\\s+\\{",returnBegin:!0,
+end:/\S/,contains:[{className:"keyword",begin:a.IDENT_RE},{begin:/\{/,end:/\}/,keywords:{keyword:"and case default else elsif false if in import enherits node or true undef unless main settings $string ",literal:"alias audit before loglevel noop require subscribe tag owner ensure group mode name|0 changes context force incl lens load_path onlyif provider returns root show_diff type_check en_address ip_address realname command environment hour monute month monthday special target weekday creates cwd ogoutput refresh refreshonly tries try_sleep umask backup checksum content ctime force ignore links mtime purge recurse recurselimit replace selinux_ignore_defaults selrange selrole seltype seluser source souirce_permissions sourceselect validate_cmd validate_replacement allowdupe attribute_membership auth_membership forcelocal gid ia_load_module members system host_aliases ip allowed_trunk_vlans description device_url duplex encapsulation etherchannel native_vlan speed principals allow_root auth_class auth_type authenticate_user k_of_n mechanisms rule session_owner shared options device fstype enable hasrestart directory present absent link atboot blockdevice device dump pass remounts poller_tag use message withpath adminfile allow_virtual allowcdrom category configfiles flavor install_options instance package_settings platform responsefile status uninstall_options vendor unless_system_user unless_uid binary control flags hasstatus manifest pattern restart running start stop allowdupe auths expiry gid groups home iterations key_membership keys managehome membership password password_max_age password_min_age profile_membership profiles project purge_ssh_keys role_membership roles salt shell uid baseurl cost descr enabled enablegroups exclude failovermethod gpgcheck gpgkey http_caching include includepkgs keepalive metadata_expire metalink mirrorlist priority protect proxy proxy_password proxy_username repo_gpgcheck s3_enabled skip_if_unavailable sslcacert sslclientcert sslclientkey sslverify mounted",
 built_in:"architecture augeasversion blockdevices boardmanufacturer boardproductname boardserialnumber cfkey dhcp_servers domain ec2_ ec2_userdata facterversion filesystems ldom fqdn gid hardwareisa hardwaremodel hostname id|0 interfaces ipaddress ipaddress_ ipaddress6 ipaddress6_ iphostnumber is_virtual kernel kernelmajversion kernelrelease kernelversion kernelrelease kernelversion lsbdistcodename lsbdistdescription lsbdistid lsbdistrelease lsbmajdistrelease lsbminordistrelease lsbrelease macaddress macaddress_ macosx_buildversion macosx_productname macosx_productversion macosx_productverson_major macosx_productversion_minor manufacturer memoryfree memorysize netmask metmask_ network_ operatingsystem operatingsystemmajrelease operatingsystemrelease osfamily partitions path physicalprocessorcount processor processorcount productname ps puppetversion rubysitedir rubyversion selinux selinux_config_mode selinux_config_policy selinux_current_mode selinux_current_mode selinux_enforced selinux_policyversion serialnumber sp_ sshdsakey sshecdsakey sshrsakey swapencrypted swapfree swapsize timezone type uniqueid uptime uptime_days uptime_hours uptime_seconds uuid virtual vlans xendomains zfs_version zonenae zones zpool_version"},
-relevance:0,contains:[c,b,{begin:"[a-zA-Z_]+\\s*=>",returnBegin:!0,end:"=>",contains:[{className:"attr",begin:a.IDENT_RE}]},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},e]}],relevance:0}]}});b.registerLanguage("python",function(a){var b={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10 None True False",
-built_in:"Ellipsis NotImplemented"},d={className:"meta",begin:/^(>>>|\.\.\.) /},e={className:"subst",begin:/\{/,end:/\}/,keywords:b,illegal:/#/},c={className:"string",contains:[a.BACKSLASH_ESCAPE],variants:[{begin:/(u|b)?r?'''/,end:/'''/,contains:[d],relevance:10},{begin:/(u|b)?r?"""/,end:/"""/,contains:[d],relevance:10},{begin:/(fr|rf|f)'''/,end:/'''/,contains:[d,e]},{begin:/(fr|rf|f)"""/,end:/"""/,contains:[d,e]},{begin:/(u|r|ur)'/,end:/'/,relevance:10},{begin:/(u|r|ur)"/,end:/"/,relevance:10},
-{begin:/(b|br)'/,end:/'/},{begin:/(b|br)"/,end:/"/},{begin:/(fr|rf|f)'/,end:/'/,contains:[e]},{begin:/(fr|rf|f)"/,end:/"/,contains:[e]},a.APOS_STRING_MODE,a.QUOTE_STRING_MODE]},g={className:"number",relevance:0,variants:[{begin:a.BINARY_NUMBER_RE+"[lLjJ]?"},{begin:"\\b(0o[0-7]+)[lLjJ]?"},{begin:a.C_NUMBER_RE+"[lLjJ]?"}]},k={className:"params",begin:/\(/,end:/\)/,contains:["self",d,g,c]};e.contains=[c,g,d];return{aliases:["py","gyp"],keywords:b,illegal:/(<\/|->|\?)|=>/,contains:[d,g,c,a.HASH_COMMENT_MODE,
-{variants:[{className:"function",beginKeywords:"def"},{className:"class",beginKeywords:"class"}],end:/:/,illegal:/[${=;\n,]/,contains:[a.UNDERSCORE_TITLE_MODE,k,{begin:/->/,endsWithParent:!0,keywords:"None"}]},{className:"meta",begin:/^[\t ]*@/,end:/$/},{begin:/\b(print|exec)\(/}]}});b.registerLanguage("rust",function(a){return{aliases:["rs"],keywords:{keyword:"alignof as be box break const continue crate do else enum extern false fn for if impl in let loop match mod mut offsetof once priv proc pub pure ref return self Self sizeof static struct super trait true type typeof unsafe unsized use virtual while where yield move default",
+relevance:0,contains:[f,b,{begin:"[a-zA-Z_]+\\s*=>",returnBegin:!0,end:"=>",contains:[{className:"attr",begin:a.IDENT_RE}]},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},e]}],relevance:0}]}});b.registerLanguage("purebasic",function(a){return{aliases:["pb","pbi"],keywords:"And As Break CallDebugger Case CompilerCase CompilerDefault CompilerElse CompilerEndIf CompilerEndSelect CompilerError CompilerIf CompilerSelect Continue Data DataSection EndDataSection Debug DebugLevel Default Define Dim DisableASM DisableDebugger DisableExplicit Else ElseIf EnableASM EnableDebugger EnableExplicit End EndEnumeration EndIf EndImport EndInterface EndMacro EndProcedure EndSelect EndStructure EndStructureUnion EndWith Enumeration Extends FakeReturn For Next ForEach ForEver Global Gosub Goto If Import ImportC IncludeBinary IncludeFile IncludePath Interface Macro NewList Not Or ProcedureReturn Protected Prototype PrototypeC Read ReDim Repeat Until Restore Return Select Shared Static Step Structure StructureUnion Swap To Wend While With XIncludeFile XOr Procedure ProcedureC ProcedureCDLL ProcedureDLL Declare DeclareC DeclareCDLL DeclareDLL",
+contains:[a.COMMENT(";","$",{relevance:0}),{className:"function",begin:"\\b(Procedure|Declare)(C|CDLL|DLL)?\\b",end:"\\(",excludeEnd:!0,returnBegin:!0,contains:[{className:"keyword",begin:"(Procedure|Declare)(C|CDLL|DLL)?",excludeEnd:!0},{className:"type",begin:"\\.\\w*"},a.UNDERSCORE_TITLE_MODE]},{className:"string",begin:'(~)?"',end:'"',illegal:"\\n"},{className:"symbol",begin:"#[a-zA-Z_]\\w*\\$?"}]}});b.registerLanguage("python",function(a){var b={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10 None True False",
+built_in:"Ellipsis NotImplemented"},d={className:"meta",begin:/^(>>>|\.\.\.) /},e={className:"subst",begin:/\{/,end:/\}/,keywords:b,illegal:/#/},f={className:"string",contains:[a.BACKSLASH_ESCAPE],variants:[{begin:/(u|b)?r?'''/,end:/'''/,contains:[a.BACKSLASH_ESCAPE,d],relevance:10},{begin:/(u|b)?r?"""/,end:/"""/,contains:[a.BACKSLASH_ESCAPE,d],relevance:10},{begin:/(fr|rf|f)'''/,end:/'''/,contains:[a.BACKSLASH_ESCAPE,d,e]},{begin:/(fr|rf|f)"""/,end:/"""/,contains:[a.BACKSLASH_ESCAPE,d,e]},{begin:/(u|r|ur)'/,
+end:/'/,relevance:10},{begin:/(u|r|ur)"/,end:/"/,relevance:10},{begin:/(b|br)'/,end:/'/},{begin:/(b|br)"/,end:/"/},{begin:/(fr|rf|f)'/,end:/'/,contains:[a.BACKSLASH_ESCAPE,e]},{begin:/(fr|rf|f)"/,end:/"/,contains:[a.BACKSLASH_ESCAPE,e]},a.APOS_STRING_MODE,a.QUOTE_STRING_MODE]},g={className:"number",relevance:0,variants:[{begin:a.BINARY_NUMBER_RE+"[lLjJ]?"},{begin:"\\b(0o[0-7]+)[lLjJ]?"},{begin:a.C_NUMBER_RE+"[lLjJ]?"}]},k={className:"params",begin:/\(/,end:/\)/,contains:["self",d,g,f]};e.contains=
+[f,g,d];return{aliases:["py","gyp","ipython"],keywords:b,illegal:/(<\/|->|\?)|=>/,contains:[d,g,f,a.HASH_COMMENT_MODE,{variants:[{className:"function",beginKeywords:"def"},{className:"class",beginKeywords:"class"}],end:/:/,illegal:/[${=;\n,]/,contains:[a.UNDERSCORE_TITLE_MODE,k,{begin:/->/,endsWithParent:!0,keywords:"None"}]},{className:"meta",begin:/^[\t ]*@/,end:/$/},{begin:/\b(print|exec)\(/}]}});b.registerLanguage("q",function(a){return{aliases:["k","kdb"],keywords:{keyword:"do while select delete by update from",
+literal:"0b 1b",built_in:"neg not null string reciprocal floor ceiling signum mod xbar xlog and or each scan over prior mmu lsq inv md5 ltime gtime count first var dev med cov cor all any rand sums prds mins maxs fills deltas ratios avgs differ prev next rank reverse iasc idesc asc desc msum mcount mavg mdev xrank mmin mmax xprev rotate distinct group where flip type key til get value attr cut set upsert raze union inter except cross sv vs sublist enlist read0 read1 hopen hclose hdel hsym hcount peach system ltrim rtrim trim lower upper ssr view tables views cols xcols keys xkey xcol xasc xdesc fkeys meta lj aj aj0 ij pj asof uj ww wj wj1 fby xgroup ungroup ej save load rsave rload show csv parse eval min max avg wavg wsum sin cos tan sum",
+type:"`float `double int `timestamp `timespan `datetime `time `boolean `symbol `char `byte `short `long `real `month `date `minute `second `guid"},lexemes:/(`?)[A-Za-z0-9_]+\b/,contains:[a.C_LINE_COMMENT_MODE,a.QUOTE_STRING_MODE,a.C_NUMBER_MODE]}});b.registerLanguage("qml",function(a){var b={begin:"[a-zA-Z_][a-zA-Z0-9\\._]*\\s*{",end:"{",returnBegin:!0,relevance:0,contains:[a.inherit(a.TITLE_MODE,{begin:"[a-zA-Z_][a-zA-Z0-9\\._]*"})]};return{aliases:["qt"],case_insensitive:!1,keywords:{keyword:"in of on if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await import",
+literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Behavior bool color coordinate date double enumeration font geocircle georectangle geoshape int list matrix4x4 parent point quaternion real rect size string url variant vector2d vector3d vector4dPromise"},
+contains:[{className:"meta",begin:/^\s*['"]use (strict|asm)['"]/},a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,{className:"string",begin:"`",end:"`",contains:[a.BACKSLASH_ESCAPE,{className:"subst",begin:"\\$\\{",end:"\\}"}]},a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,{className:"number",variants:[{begin:"\\b(0[bB][01]+)"},{begin:"\\b(0[oO][0-7]+)"},{begin:a.C_NUMBER_RE}],relevance:0},{begin:"("+a.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[a.C_LINE_COMMENT_MODE,
+a.C_BLOCK_COMMENT_MODE,a.REGEXP_MODE,{begin:/</,end:/>\s*[);\]]/,relevance:0,subLanguage:"xml"}],relevance:0},{className:"keyword",begin:"\\bsignal\\b",starts:{className:"string",end:"(\\(|:|=|;|,|//|/\\*|$)",returnEnd:!0}},{className:"keyword",begin:"\\bproperty\\b",starts:{className:"string",end:"(:|=|;|,|//|/\\*|$)",returnEnd:!0}},{className:"function",beginKeywords:"function",end:/\{/,excludeEnd:!0,contains:[a.inherit(a.TITLE_MODE,{begin:/[A-Za-z$_][0-9A-Za-z$_]*/}),{className:"params",begin:/\(/,
+end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE]}],illegal:/\[|%/},{begin:"\\."+a.IDENT_RE,relevance:0},{className:"attribute",begin:"\\bid\\s*:",starts:{className:"string",end:"[a-zA-Z_][a-zA-Z0-9\\._]*",returnEnd:!1}},{begin:"[a-zA-Z_][a-zA-Z0-9\\._]*\\s*:",returnBegin:!0,contains:[{className:"attribute",begin:"[a-zA-Z_][a-zA-Z0-9\\._]*",end:"\\s*:",excludeEnd:!0,relevance:0}],relevance:0},b],illegal:/#/}});b.registerLanguage("r",function(a){return{contains:[a.HASH_COMMENT_MODE,
+{begin:"([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*",lexemes:"([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*",keywords:{keyword:"function if in break next repeat else for return switch while try tryCatch stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},relevance:0},{className:"number",begin:"0[xX][0-9a-fA-F]+[Li]?\\b",relevance:0},{className:"number",begin:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",
+relevance:0},{className:"number",begin:"\\d+\\.(?!\\d)(?:i\\b)?",relevance:0},{className:"number",begin:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{className:"number",begin:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{begin:"`",end:"`",relevance:0},{className:"string",contains:[a.BACKSLASH_ESCAPE],variants:[{begin:'"',end:'"'},{begin:"'",end:"'"}]}]}});b.registerLanguage("reasonml",function(a){var b="("+function(a){return a.map(function(a){return a.split("").map(function(a){return"\\"+
+a}).join("")}).join("|")}("|| && ++ ** +. * / *. /. ... |>".split(" "))+"|==|===)",d="\\s+"+b+"\\s+",e={keyword:"and as asr assert begin class constraint do done downto else end exception externalfor fun function functor if in include inherit initializerland lazy let lor lsl lsr lxor match method mod module mutable new nonrecobject of open or private rec sig struct then to try type val virtual when while with",built_in:"array bool bytes char exn|5 float int int32 int64 list lazy_t|5 nativeint|5 ref string unit ",
+literal:"true false"},f={className:"number",relevance:0,variants:[{begin:"\\b(0[xX][a-fA-F0-9_]+[Lln]?|0[oO][0-7_]+[Lln]?|0[bB][01_]+[Lln]?|[0-9][0-9_]*([Lln]|(\\.[0-9_]*)?([eE][-+]?[0-9_]+)?)?)"},{begin:"\\(\\-\\b(0[xX][a-fA-F0-9_]+[Lln]?|0[oO][0-7_]+[Lln]?|0[bB][01_]+[Lln]?|[0-9][0-9_]*([Lln]|(\\.[0-9_]*)?([eE][-+]?[0-9_]+)?)?)\\)"}]},g={className:"operator",relevance:0,begin:b};b=[{className:"identifier",relevance:0,begin:"~?[a-z$_][0-9a-zA-Z$_]*"},g,f];var k=[a.QUOTE_STRING_MODE,g,{className:"module",
+begin:"\\b`?[A-Z$_][0-9a-zA-Z$_]*",returnBegin:!0,end:".",contains:[{className:"identifier",begin:"`?[A-Z$_][0-9a-zA-Z$_]*",relevance:0}]}],m=[{className:"module",begin:"\\b`?[A-Z$_][0-9a-zA-Z$_]*",returnBegin:!0,end:".",relevance:0,contains:[{className:"identifier",begin:"`?[A-Z$_][0-9a-zA-Z$_]*",relevance:0}]}],l={className:"function",relevance:0,keywords:e,variants:[{begin:"\\s(\\(\\.?.*?\\)|~?[a-z$_][0-9a-zA-Z$_]*)\\s*=>",end:"\\s*=>",returnBegin:!0,relevance:0,contains:[{className:"params",variants:[{begin:"~?[a-z$_][0-9a-zA-Z$_]*"},
+{begin:"~?[a-z$_][0-9a-zA-Z$_]*(s*:s*[a-z$_][0-9a-z$_]*((s*('?[a-z$_][0-9a-z$_]*s*(,'?[a-z$_][0-9a-z$_]*)*)?s*))?)?(s*:s*[a-z$_][0-9a-z$_]*((s*('?[a-z$_][0-9a-z$_]*s*(,'?[a-z$_][0-9a-z$_]*)*)?s*))?)?"},{begin:/\(\s*\)/}]}]},{begin:"\\s\\(\\.?[^;\\|]*\\)\\s*=>",end:"\\s=>",returnBegin:!0,relevance:0,contains:[{className:"params",relevance:0,variants:[{begin:"~?[a-z$_][0-9a-zA-Z$_]*",end:"(,|\\n|\\))",relevance:0,contains:[g,{className:"typing",begin:":",end:"(,|\\n)",returnBegin:!0,relevance:0,contains:m}]}]}]},
+{begin:"\\(\\.\\s~?[a-z$_][0-9a-zA-Z$_]*\\)\\s*=>"}]};k.push(l);var n={className:"constructor",begin:"`?[A-Z$_][0-9a-zA-Z$_]*\\(",end:"\\)",illegal:"\\n",keywords:e,contains:[a.QUOTE_STRING_MODE,g,{className:"params",begin:"\\b~?[a-z$_][0-9a-zA-Z$_]*"}]};g={className:"pattern-match",begin:"\\|",returnBegin:!0,keywords:e,end:"=>",relevance:0,contains:[n,g,{relevance:0,className:"constructor",begin:"`?[A-Z$_][0-9a-zA-Z$_]*"}]};var h={className:"module-access",keywords:e,returnBegin:!0,variants:[{begin:"\\b(`?[A-Z$_][0-9a-zA-Z$_]*\\.)+~?[a-z$_][0-9a-zA-Z$_]*"},
+{begin:"\\b(`?[A-Z$_][0-9a-zA-Z$_]*\\.)+\\(",end:"\\)",returnBegin:!0,contains:[l,{begin:"\\(",end:"\\)",skip:!0}].concat(k)},{begin:"\\b(`?[A-Z$_][0-9a-zA-Z$_]*\\.)+{",end:"}"}],contains:k};m.push(h);return{aliases:["re"],keywords:e,illegal:"(:\\-|:=|\\${|\\+=)",contains:[a.COMMENT("/\\*","\\*/",{illegal:"^(\\#,\\/\\/)"}),{className:"character",begin:"'(\\\\[^']+|[^'])'",illegal:"\\n",relevance:0},a.QUOTE_STRING_MODE,{className:"literal",begin:"\\(\\)",relevance:0},{className:"literal",begin:"\\[\\|",
+end:"\\|\\]",relevance:0,contains:b},{className:"literal",begin:"\\[",end:"\\]",relevance:0,contains:b},n,{className:"operator",begin:d,illegal:"\\-\\->",relevance:0},f,a.C_LINE_COMMENT_MODE,g,l,{className:"module-def",begin:"\\bmodule\\s+~?[a-z$_][0-9a-zA-Z$_]*\\s+`?[A-Z$_][0-9a-zA-Z$_]*\\s+=\\s+{",end:"}",returnBegin:!0,keywords:e,relevance:0,contains:[{className:"module",relevance:0,begin:"`?[A-Z$_][0-9a-zA-Z$_]*"},{begin:"{",end:"}",skip:!0}].concat(k)},h]}});b.registerLanguage("rib",function(a){return{keywords:"ArchiveRecord AreaLightSource Atmosphere Attribute AttributeBegin AttributeEnd Basis Begin Blobby Bound Clipping ClippingPlane Color ColorSamples ConcatTransform Cone CoordinateSystem CoordSysTransform CropWindow Curves Cylinder DepthOfField Detail DetailRange Disk Displacement Display End ErrorHandler Exposure Exterior Format FrameAspectRatio FrameBegin FrameEnd GeneralPolygon GeometricApproximation Geometry Hider Hyperboloid Identity Illuminate Imager Interior LightSource MakeCubeFaceEnvironment MakeLatLongEnvironment MakeShadow MakeTexture Matte MotionBegin MotionEnd NuPatch ObjectBegin ObjectEnd ObjectInstance Opacity Option Orientation Paraboloid Patch PatchMesh Perspective PixelFilter PixelSamples PixelVariance Points PointsGeneralPolygons PointsPolygons Polygon Procedural Projection Quantize ReadArchive RelativeDetail ReverseOrientation Rotate Scale ScreenWindow ShadingInterpolation ShadingRate Shutter Sides Skew SolidBegin SolidEnd Sphere SubdivisionMesh Surface TextureCoordinates Torus Transform TransformBegin TransformEnd TransformPoints Translate TrimCurve WorldBegin WorldEnd",
+illegal:"</",contains:[a.HASH_COMMENT_MODE,a.C_NUMBER_MODE,a.APOS_STRING_MODE,a.QUOTE_STRING_MODE]}});b.registerLanguage("roboconf",function(a){var b={className:"attribute",begin:/[a-zA-Z-_]+/,end:/\s*:/,excludeEnd:!0,starts:{end:";",relevance:0,contains:[{className:"variable",begin:/\.[a-zA-Z-_]+/},{className:"keyword",begin:/\(optional\)/}]}};return{aliases:["graph","instances"],case_insensitive:!0,keywords:"import",contains:[{begin:"^facet [a-zA-Z-_][^\\n{]+\\{",end:"}",keywords:"facet",contains:[b,
+a.HASH_COMMENT_MODE]},{begin:"^\\s*instance of [a-zA-Z-_][^\\n{]+\\{",end:"}",keywords:"name count channels instance-data instance-state instance of",illegal:/\S/,contains:["self",b,a.HASH_COMMENT_MODE]},{begin:"^[a-zA-Z-_][^\\n{]+\\{",end:"}",contains:[b,a.HASH_COMMENT_MODE]},a.HASH_COMMENT_MODE]}});b.registerLanguage("routeros",function(a){var b={className:"variable",variants:[{begin:/\$[\w\d#@][\w\d_]*/},{begin:/\$\{(.*?)}/}]},d={className:"string",begin:/"/,end:/"/,contains:[a.BACKSLASH_ESCAPE,
+b,{className:"variable",begin:/\$\(/,end:/\)/,contains:[a.BACKSLASH_ESCAPE]}]},e={className:"string",begin:/'/,end:/'/};return{aliases:["routeros","mikrotik"],case_insensitive:!0,lexemes:/:?[\w-]+/,keywords:{literal:"true false yes no nothing nil null",keyword:"foreach do while for if from to step else on-error and or not in :foreach :do :while :for :if :from :to :step :else :on-error :and :or :not :in :global :local :beep :delay :put :len :typeof :pick :log :time :set :find :environment :terminal :error :execute :parse :resolve :toarray :tobool :toid :toip :toip6 :tonum :tostr :totime"},
+contains:[{variants:[{begin:/^@/,end:/$/},{begin:/\/\*/,end:/\*\//},{begin:/%%/,end:/$/},{begin:/^'/,end:/$/},{begin:/^\s*\/[\w-]+=/,end:/$/},{begin:/\/\//,end:/$/},{begin:/^\[</,end:/>\]$/},{begin:/<\//,end:/>/},{begin:/^facet /,end:/\}/},{begin:"^1\\.\\.(\\d+)$",end:/$/}],illegal:/./},a.COMMENT("^#","$"),d,e,b,{begin:/[\w-]+=([^\s\{\}\[\]\(\)]+)/,relevance:0,returnBegin:!0,contains:[{className:"attribute",begin:/[^=]+/},{begin:/=/,endsWithParent:!0,relevance:0,contains:[d,e,b,{className:"literal",
+begin:"\\b(true|false|yes|no|nothing|nil|null)\\b"},{begin:/("[^"]*"|[^\s\{\}\[\]]+)/}]}]},{className:"number",begin:/\*[0-9a-fA-F]+/},{begin:"\\b(add|remove|enable|disable|set|get|print|export|edit|find|run|debug|error|info|warning)([\\s[(]|])",returnBegin:!0,contains:[{className:"builtin-name",begin:/\w+/}]},{className:"built_in",variants:[{begin:"(\\.\\./|/|\\s)((traffic-flow|traffic-generator|firewall|scheduler|aaa|accounting|address-list|address|align|area|bandwidth-server|bfd|bgp|bridge|client|clock|community|config|connection|console|customer|default|dhcp-client|dhcp-server|discovery|dns|e-mail|ethernet|filter|firewall|firmware|gps|graphing|group|hardware|health|hotspot|identity|igmp-proxy|incoming|instance|interface|ip|ipsec|ipv6|irq|l2tp-server|lcd|ldp|logging|mac-server|mac-winbox|mangle|manual|mirror|mme|mpls|nat|nd|neighbor|network|note|ntp|ospf|ospf-v3|ovpn-server|page|peer|pim|ping|policy|pool|port|ppp|pppoe-client|pptp-server|prefix|profile|proposal|proxy|queue|radius|resource|rip|ripng|route|routing|screen|script|security-profiles|server|service|service-port|settings|shares|smb|sms|sniffer|snmp|snooper|socks|sstp-server|system|tool|tracking|type|upgrade|upnp|user-manager|users|user|vlan|secret|vrrp|watchdog|web-access|wireless|pptp|pppoe|lan|wan|layer7-protocol|lease|simple|raw);?\\s)+",
+relevance:10},{begin:/\.\./}]}]}});b.registerLanguage("rsl",function(a){return{keywords:{keyword:"float color point normal vector matrix while for if do return else break extern continue",built_in:"abs acos ambient area asin atan atmosphere attribute calculatenormal ceil cellnoise clamp comp concat cos degrees depth Deriv diffuse distance Du Dv environment exp faceforward filterstep floor format fresnel incident length lightsource log match max min mod noise normalize ntransform opposite option phong pnoise pow printf ptlined radians random reflect refract renderinfo round setcomp setxcomp setycomp setzcomp shadow sign sin smoothstep specular specularbrdf spline sqrt step tan texture textureinfo trace transform vtransform xcomp ycomp zcomp"},
+illegal:"</",contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,a.QUOTE_STRING_MODE,a.APOS_STRING_MODE,a.C_NUMBER_MODE,{className:"meta",begin:"#",end:"$"},{className:"class",beginKeywords:"surface displacement light volume imager",end:"\\("},{beginKeywords:"illuminate illuminance gather",end:"\\("}]}});b.registerLanguage("ruleslanguage",function(a){return{keywords:{keyword:"BILL_PERIOD BILL_START BILL_STOP RS_EFFECTIVE_START RS_EFFECTIVE_STOP RS_JURIS_CODE RS_OPCO_CODE INTDADDATTRIBUTE|5 INTDADDVMSG|5 INTDBLOCKOP|5 INTDBLOCKOPNA|5 INTDCLOSE|5 INTDCOUNT|5 INTDCOUNTSTATUSCODE|5 INTDCREATEMASK|5 INTDCREATEDAYMASK|5 INTDCREATEFACTORMASK|5 INTDCREATEHANDLE|5 INTDCREATEOVERRIDEDAYMASK|5 INTDCREATEOVERRIDEMASK|5 INTDCREATESTATUSCODEMASK|5 INTDCREATETOUPERIOD|5 INTDDELETE|5 INTDDIPTEST|5 INTDEXPORT|5 INTDGETERRORCODE|5 INTDGETERRORMESSAGE|5 INTDISEQUAL|5 INTDJOIN|5 INTDLOAD|5 INTDLOADACTUALCUT|5 INTDLOADDATES|5 INTDLOADHIST|5 INTDLOADLIST|5 INTDLOADLISTDATES|5 INTDLOADLISTENERGY|5 INTDLOADLISTHIST|5 INTDLOADRELATEDCHANNEL|5 INTDLOADSP|5 INTDLOADSTAGING|5 INTDLOADUOM|5 INTDLOADUOMDATES|5 INTDLOADUOMHIST|5 INTDLOADVERSION|5 INTDOPEN|5 INTDREADFIRST|5 INTDREADNEXT|5 INTDRECCOUNT|5 INTDRELEASE|5 INTDREPLACE|5 INTDROLLAVG|5 INTDROLLPEAK|5 INTDSCALAROP|5 INTDSCALE|5 INTDSETATTRIBUTE|5 INTDSETDSTPARTICIPANT|5 INTDSETSTRING|5 INTDSETVALUE|5 INTDSETVALUESTATUS|5 INTDSHIFTSTARTTIME|5 INTDSMOOTH|5 INTDSORT|5 INTDSPIKETEST|5 INTDSUBSET|5 INTDTOU|5 INTDTOURELEASE|5 INTDTOUVALUE|5 INTDUPDATESTATS|5 INTDVALUE|5 STDEV INTDDELETEEX|5 INTDLOADEXACTUAL|5 INTDLOADEXCUT|5 INTDLOADEXDATES|5 INTDLOADEX|5 INTDLOADEXRELATEDCHANNEL|5 INTDSAVEEX|5 MVLOAD|5 MVLOADACCT|5 MVLOADACCTDATES|5 MVLOADACCTHIST|5 MVLOADDATES|5 MVLOADHIST|5 MVLOADLIST|5 MVLOADLISTDATES|5 MVLOADLISTHIST|5 IF FOR NEXT DONE SELECT END CALL ABORT CLEAR CHANNEL FACTOR LIST NUMBER OVERRIDE SET WEEK DISTRIBUTIONNODE ELSE WHEN THEN OTHERWISE IENUM CSV INCLUDE LEAVE RIDER SAVE DELETE NOVALUE SECTION WARN SAVE_UPDATE DETERMINANT LABEL REPORT REVENUE EACH IN FROM TOTAL CHARGE BLOCK AND OR CSV_FILE RATE_CODE AUXILIARY_DEMAND UIDACCOUNT RS BILL_PERIOD_SELECT HOURS_PER_MONTH INTD_ERROR_STOP SEASON_SCHEDULE_NAME ACCOUNTFACTOR ARRAYUPPERBOUND CALLSTOREDPROC GETADOCONNECTION GETCONNECT GETDATASOURCE GETQUALIFIER GETUSERID HASVALUE LISTCOUNT LISTOP LISTUPDATE LISTVALUE PRORATEFACTOR RSPRORATE SETBINPATH SETDBMONITOR WQ_OPEN BILLINGHOURS DATE DATEFROMFLOAT DATETIMEFROMSTRING DATETIMETOSTRING DATETOFLOAT DAY DAYDIFF DAYNAME DBDATETIME HOUR MINUTE MONTH MONTHDIFF MONTHHOURS MONTHNAME ROUNDDATE SAMEWEEKDAYLASTYEAR SECOND WEEKDAY WEEKDIFF YEAR YEARDAY YEARSTR COMPSUM HISTCOUNT HISTMAX HISTMIN HISTMINNZ HISTVALUE MAXNRANGE MAXRANGE MINRANGE COMPIKVA COMPKVA COMPKVARFROMKQKW COMPLF IDATTR FLAG LF2KW LF2KWH MAXKW POWERFACTOR READING2USAGE AVGSEASON MAXSEASON MONTHLYMERGE SEASONVALUE SUMSEASON ACCTREADDATES ACCTTABLELOAD CONFIGADD CONFIGGET CREATEOBJECT CREATEREPORT EMAILCLIENT EXPBLKMDMUSAGE EXPMDMUSAGE EXPORT_USAGE FACTORINEFFECT GETUSERSPECIFIEDSTOP INEFFECT ISHOLIDAY RUNRATE SAVE_PROFILE SETREPORTTITLE USEREXIT WATFORRUNRATE TO TABLE ACOS ASIN ATAN ATAN2 BITAND CEIL COS COSECANT COSH COTANGENT DIVQUOT DIVREM EXP FABS FLOOR FMOD FREPM FREXPN LOG LOG10 MAX MAXN MIN MINNZ MODF POW ROUND ROUND2VALUE ROUNDINT SECANT SIN SINH SQROOT TAN TANH FLOAT2STRING FLOAT2STRINGNC INSTR LEFT LEN LTRIM MID RIGHT RTRIM STRING STRINGNC TOLOWER TOUPPER TRIM NUMDAYS READ_DATE STAGING",
+built_in:"IDENTIFIER OPTIONS XML_ELEMENT XML_OP XML_ELEMENT_OF DOMDOCCREATE DOMDOCLOADFILE DOMDOCLOADXML DOMDOCSAVEFILE DOMDOCGETROOT DOMDOCADDPI DOMNODEGETNAME DOMNODEGETTYPE DOMNODEGETVALUE DOMNODEGETCHILDCT DOMNODEGETFIRSTCHILD DOMNODEGETSIBLING DOMNODECREATECHILDELEMENT DOMNODESETATTRIBUTE DOMNODEGETCHILDELEMENTCT DOMNODEGETFIRSTCHILDELEMENT DOMNODEGETSIBLINGELEMENT DOMNODEGETATTRIBUTECT DOMNODEGETATTRIBUTEI DOMNODEGETATTRIBUTEBYNAME DOMNODEGETBYNAME"},contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,
+a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,a.C_NUMBER_MODE,{className:"literal",variants:[{begin:"#\\s+[a-zA-Z\\ \\.]*",relevance:0},{begin:"#[a-zA-Z\\ \\.]+"}]}]}});b.registerLanguage("rust",function(a){return{aliases:["rs"],keywords:{keyword:"alignof as be box break const continue crate do else enum extern false fn for if impl in let loop match mod mut offsetof once priv proc pub pure ref return self Self sizeof static struct super trait true type typeof unsafe unsized use virtual while where yield move default",
 literal:"true false Some None Ok Err",built_in:"drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!"},
 lexemes:a.IDENT_RE+"!?",illegal:"</",contains:[a.C_LINE_COMMENT_MODE,a.COMMENT("/\\*","\\*/",{contains:["self"]}),a.inherit(a.QUOTE_STRING_MODE,{begin:/b?"/,illegal:null}),{className:"string",variants:[{begin:/r(#*)"(.|\n)*?"\1(?!#)/},{begin:/b?'\\?(x\w{2}|u\w{4}|U\w{8}|.)'/}]},{className:"symbol",begin:/'[a-zA-Z_][a-zA-Z0-9_]*/},{className:"number",variants:[{begin:"\\b0b([01_]+)([ui](8|16|32|64|128|size)|f(32|64))?"},{begin:"\\b0o([0-7_]+)([ui](8|16|32|64|128|size)|f(32|64))?"},{begin:"\\b0x([A-Fa-f0-9_]+)([ui](8|16|32|64|128|size)|f(32|64))?"},
 {begin:"\\b(\\d[\\d_]*(\\.[0-9_]+)?([eE][+-]?[0-9_]+)?)([ui](8|16|32|64|128|size)|f(32|64))?"}],relevance:0},{className:"function",beginKeywords:"fn",end:"(\\(|<)",excludeEnd:!0,contains:[a.UNDERSCORE_TITLE_MODE]},{className:"meta",begin:"#\\!?\\[",end:"\\]",contains:[{className:"meta-string",begin:/"/,end:/"/}]},{className:"class",beginKeywords:"type",end:";",contains:[a.inherit(a.UNDERSCORE_TITLE_MODE,{endsParent:!0})],illegal:"\\S"},{className:"class",beginKeywords:"trait enum struct union",end:"{",
 contains:[a.inherit(a.UNDERSCORE_TITLE_MODE,{endsParent:!0})],illegal:"[\\w\\d]"},{begin:a.IDENT_RE+"::",keywords:{built_in:"drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!"}},
-{begin:"->"}]}});b.registerLanguage("scala",function(a){var b={className:"subst",variants:[{begin:"\\$[A-Za-z0-9_]+"},{begin:"\\${",end:"}"}]},d={className:"type",begin:"\\b[A-Z][A-Za-z0-9_]*",relevance:0},e={className:"title",begin:/[^0-9\n\t "'(),.`{}\[\]:;][^\n\t "'(),.`{}\[\]:;]+|[^0-9\n\t "'(),.`{}\[\]:;=]/,relevance:0};return{keywords:{literal:"true false null",keyword:"type yield lazy override def with val var sealed abstract private trait object if forSome for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws implicit"},
+{begin:"->"}]}});b.registerLanguage("sas",function(a){return{aliases:["sas","SAS"],case_insensitive:!0,keywords:{literal:"null missing _all_ _automatic_ _character_ _infile_ _n_ _name_ _null_ _numeric_ _user_ _webout_",meta:"do if then else end until while abort array attrib by call cards cards4 catname continue datalines datalines4 delete delim delimiter display dm drop endsas error file filename footnote format goto in infile informat input keep label leave length libname link list lostcard merge missing modify options output out page put redirect remove rename replace retain return select set skip startsas stop title update waitsas where window x systask add and alter as cascade check create delete describe distinct drop foreign from group having index insert into in key like message modify msgtype not null on or order primary references reset restrict select set table unique update validate view where"},
+contains:[{className:"keyword",begin:/^\s*(proc [\w\d_]+|data|run|quit)[\s;]/},{className:"variable",begin:/&[a-zA-Z_&][a-zA-Z0-9_]*\.?/},{className:"emphasis",begin:/^\s*datalines|cards.*;/,end:/^\s*;\s*$/},{className:"built_in",begin:"%(bquote|nrbquote|cmpres|qcmpres|compstor|datatyp|display|do|else|end|eval|global|goto|if|index|input|keydef|label|left|length|let|local|lowcase|macro|mend|nrbquote|nrquote|nrstr|put|qcmpres|qleft|qlowcase|qscan|qsubstr|qsysfunc|qtrim|quote|qupcase|scan|str|substr|superq|syscall|sysevalf|sysexec|sysfunc|sysget|syslput|sysprod|sysrc|sysrput|then|to|trim|unquote|until|upcase|verify|while|window)"},
+{className:"name",begin:/%[a-zA-Z_][a-zA-Z_0-9]*/},{className:"meta",begin:"[^%](abs|addr|airy|arcos|arsin|atan|attrc|attrn|band|betainv|blshift|bnot|bor|brshift|bxor|byte|cdf|ceil|cexist|cinv|close|cnonct|collate|compbl|compound|compress|cos|cosh|css|curobs|cv|daccdb|daccdbsl|daccsl|daccsyd|dacctab|dairy|date|datejul|datepart|datetime|day|dclose|depdb|depdbsl|depdbsl|depsl|depsl|depsyd|depsyd|deptab|deptab|dequote|dhms|dif|digamma|dim|dinfo|dnum|dopen|doptname|doptnum|dread|dropnote|dsname|erf|erfc|exist|exp|fappend|fclose|fcol|fdelete|fetch|fetchobs|fexist|fget|fileexist|filename|fileref|finfo|finv|fipname|fipnamel|fipstate|floor|fnonct|fnote|fopen|foptname|foptnum|fpoint|fpos|fput|fread|frewind|frlen|fsep|fuzz|fwrite|gaminv|gamma|getoption|getvarc|getvarn|hbound|hms|hosthelp|hour|ibessel|index|indexc|indexw|input|inputc|inputn|int|intck|intnx|intrr|irr|jbessel|juldate|kurtosis|lag|lbound|left|length|lgamma|libname|libref|log|log10|log2|logpdf|logpmf|logsdf|lowcase|max|mdy|mean|min|minute|mod|month|mopen|mort|n|netpv|nmiss|normal|note|npv|open|ordinal|pathname|pdf|peek|peekc|pmf|point|poisson|poke|probbeta|probbnml|probchi|probf|probgam|probhypr|probit|probnegb|probnorm|probt|put|putc|putn|qtr|quote|ranbin|rancau|ranexp|rangam|range|rank|rannor|ranpoi|rantbl|rantri|ranuni|repeat|resolve|reverse|rewind|right|round|saving|scan|sdf|second|sign|sin|sinh|skewness|soundex|spedis|sqrt|std|stderr|stfips|stname|stnamel|substr|sum|symget|sysget|sysmsg|sysprod|sysrc|system|tan|tanh|time|timepart|tinv|tnonct|today|translate|tranwrd|trigamma|trim|trimn|trunc|uniform|upcase|uss|var|varfmt|varinfmt|varlabel|varlen|varname|varnum|varray|varrayx|vartype|verify|vformat|vformatd|vformatdx|vformatn|vformatnx|vformatw|vformatwx|vformatx|vinarray|vinarrayx|vinformat|vinformatd|vinformatdx|vinformatn|vinformatnx|vinformatw|vinformatwx|vinformatx|vlabel|vlabelx|vlength|vlengthx|vname|vnamex|vtype|vtypex|weekday|year|yyq|zipfips|zipname|zipnamel|zipstate)[(]"},
+{className:"string",variants:[a.APOS_STRING_MODE,a.QUOTE_STRING_MODE]},a.COMMENT("\\*",";"),a.C_BLOCK_COMMENT_MODE]}});b.registerLanguage("scala",function(a){var b={className:"subst",variants:[{begin:"\\$[A-Za-z0-9_]+"},{begin:"\\${",end:"}"}]},d={className:"type",begin:"\\b[A-Z][A-Za-z0-9_]*",relevance:0},e={className:"title",begin:/[^0-9\n\t "'(),.`{}\[\]:;][^\n\t "'(),.`{}\[\]:;]+|[^0-9\n\t "'(),.`{}\[\]:;=]/,relevance:0};return{keywords:{literal:"true false null",keyword:"type yield lazy override def with val var sealed abstract private trait object if forSome for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws implicit"},
 contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,{className:"string",variants:[{begin:'"',end:'"',illegal:"\\n",contains:[a.BACKSLASH_ESCAPE]},{begin:'"""',end:'"""',relevance:10},{begin:'[a-z]+"',end:'"',illegal:"\\n",contains:[a.BACKSLASH_ESCAPE,b]},{className:"string",begin:'[a-z]+"""',end:'"""',contains:[b],relevance:10}]},{className:"symbol",begin:"'\\w[\\w\\d_]*(?!')"},d,{className:"function",beginKeywords:"def",end:/[:={\[(\n;]/,excludeEnd:!0,contains:[e]},{className:"class",beginKeywords:"class object trait type",
-end:/[:={\[\n;]/,excludeEnd:!0,contains:[{beginKeywords:"extends with",relevance:10},{begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[d]},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[d]},e]},a.C_NUMBER_MODE,{className:"meta",begin:"@[A-Za-z]+"}]}});b.registerLanguage("shell",function(a){return{aliases:["console"],contains:[{className:"meta",begin:"^\\s{0,3}[\\w\\d\\[\\]()@-]*[>%$#]",starts:{end:"$",subLanguage:"bash"}}]}});b.registerLanguage("sql",
-function(a){var b=a.COMMENT("--","$");return{case_insensitive:!0,illegal:/[<>{}*#]/,contains:[{beginKeywords:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment",end:/;/,endsWithParent:!0,
-lexemes:/[\w\.]+/,keywords:{keyword:"abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias allocate allow alter always analyze ancillary and any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second section securefile security seed segment select self sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",
-literal:"true false null",built_in:"array bigint binary bit blob boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text varchar varying void"},contains:[{className:"string",begin:"'",end:"'",contains:[a.BACKSLASH_ESCAPE,{begin:"''"}]},{className:"string",begin:'"',end:'"',contains:[a.BACKSLASH_ESCAPE,{begin:'""'}]},{className:"string",begin:"`",end:"`",contains:[a.BACKSLASH_ESCAPE]},a.C_NUMBER_MODE,a.C_BLOCK_COMMENT_MODE,b]},
-a.C_BLOCK_COMMENT_MODE,b]}});b.registerLanguage("swift",function(a){var b={keyword:"__COLUMN__ __FILE__ __FUNCTION__ __LINE__ as as! as? associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet",
+end:/[:={\[\n;]/,excludeEnd:!0,contains:[{beginKeywords:"extends with",relevance:10},{begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[d]},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[d]},e]},a.C_NUMBER_MODE,{className:"meta",begin:"@[A-Za-z]+"}]}});b.registerLanguage("scheme",function(a){var b={className:"literal",begin:"(#t|#f|#\\\\[^\\(\\)\\[\\]\\{\\}\",'`;#|\\\\\\s]+|#\\\\.)"},d={className:"number",variants:[{begin:"(\\-|\\+)?\\d+([./]\\d+)?",
+relevance:0},{begin:"(\\-|\\+)?\\d+([./]\\d+)?[+\\-](\\-|\\+)?\\d+([./]\\d+)?i",relevance:0},{begin:"#b[0-1]+(/[0-1]+)?"},{begin:"#o[0-7]+(/[0-7]+)?"},{begin:"#x[0-9a-f]+(/[0-9a-f]+)?"}]},e=a.QUOTE_STRING_MODE;a=[a.COMMENT(";","$",{relevance:0}),a.COMMENT("#\\|","\\|#")];var f={begin:"[^\\(\\)\\[\\]\\{\\}\",'`;#|\\\\\\s]+",relevance:0},g={className:"symbol",begin:"'[^\\(\\)\\[\\]\\{\\}\",'`;#|\\\\\\s]+"},k={endsWithParent:!0,relevance:0},m={variants:[{begin:/'/},{begin:"`"}],contains:[{begin:"\\(",
+end:"\\)",contains:["self",b,e,d,f,g]}]},l={className:"name",begin:"[^\\(\\)\\[\\]\\{\\}\",'`;#|\\\\\\s]+",lexemes:"[^\\(\\)\\[\\]\\{\\}\",'`;#|\\\\\\s]+",keywords:{"builtin-name":"case-lambda call/cc class define-class exit-handler field import inherit init-field interface let*-values let-values let/ec mixin opt-lambda override protect provide public rename require require-for-syntax syntax syntax-case syntax-error unit/sig unless when with-syntax and begin call-with-current-continuation call-with-input-file call-with-output-file case cond define define-syntax delay do dynamic-wind else for-each if lambda let let* let-syntax letrec letrec-syntax map or syntax-rules ' * + , ,@ - ... / ; < <= = => > >= ` abs acos angle append apply asin assoc assq assv atan boolean? caar cadr call-with-input-file call-with-output-file call-with-values car cdddar cddddr cdr ceiling char->integer char-alphabetic? char-ci<=? char-ci<? char-ci=? char-ci>=? char-ci>? char-downcase char-lower-case? char-numeric? char-ready? char-upcase char-upper-case? char-whitespace? char<=? char<? char=? char>=? char>? char? close-input-port close-output-port complex? cons cos current-input-port current-output-port denominator display eof-object? eq? equal? eqv? eval even? exact->inexact exact? exp expt floor force gcd imag-part inexact->exact inexact? input-port? integer->char integer? interaction-environment lcm length list list->string list->vector list-ref list-tail list? load log magnitude make-polar make-rectangular make-string make-vector max member memq memv min modulo negative? newline not null-environment null? number->string number? numerator odd? open-input-file open-output-file output-port? pair? peek-char port? positive? procedure? quasiquote quote quotient rational? rationalize read read-char real-part real? remainder reverse round scheme-report-environment set! set-car! set-cdr! sin sqrt string string->list string->number string->symbol string-append string-ci<=? string-ci<? string-ci=? string-ci>=? string-ci>? string-copy string-fill! string-length string-ref string-set! string<=? string<? string=? string>=? string>? string? substring symbol->string symbol? tan transcript-off transcript-on truncate values vector vector->list vector-fill! vector-length vector-ref vector-set! with-input-from-file with-output-to-file write write-char zero?"}};
+l={variants:[{begin:"\\(",end:"\\)"},{begin:"\\[",end:"\\]"}],contains:[{begin:/lambda/,endsWithParent:!0,returnBegin:!0,contains:[l,{begin:/\(/,end:/\)/,endsParent:!0,contains:[f]}]},l,k]};k.contains=[b,d,e,f,g,m,l].concat(a);return{illegal:/\S/,contains:[{className:"meta",begin:"^#!",end:"$"},d,e,g,m,l].concat(a)}});b.registerLanguage("scilab",function(a){var b=[a.C_NUMBER_MODE,{className:"string",begin:"'|\"",end:"'|\"",contains:[a.BACKSLASH_ESCAPE,{begin:"''"}]}];return{aliases:["sci"],lexemes:/%?\w+/,
+keywords:{keyword:"abort break case clear catch continue do elseif else endfunction end for function global if pause return resume select try then while",literal:"%f %F %t %T %pi %eps %inf %nan %e %i %z %s",built_in:"abs and acos asin atan ceil cd chdir clearglobal cosh cos cumprod deff disp error exec execstr exists exp eye gettext floor fprintf fread fsolve imag isdef isempty isinfisnan isvector lasterror length load linspace list listfiles log10 log2 log max min msprintf mclose mopen ones or pathconvert poly printf prod pwd rand real round sinh sin size gsort sprintf sqrt strcat strcmps tring sum system tanh tan type typename warning zeros matrix"},
+illegal:'("|#|/\\*|\\s+/\\w+)',contains:[{className:"function",beginKeywords:"function",end:"$",contains:[a.UNDERSCORE_TITLE_MODE,{className:"params",begin:"\\(",end:"\\)"}]},{begin:"[a-zA-Z_][a-zA-Z_0-9]*('+[\\.']*|[\\.']+)",end:"",relevance:0},{begin:"\\[",end:"\\]'*[\\.']*",relevance:0,contains:b},a.COMMENT("//","$")].concat(b)}});b.registerLanguage("scss",function(a){var b={className:"variable",begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"},d={className:"number",begin:"#[0-9A-Fa-f]+"};return{case_insensitive:!0,
+illegal:"[=/|']",contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:"\\#[A-Za-z0-9_-]+",relevance:0},{className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0},{className:"selector-attr",begin:"\\[",end:"\\]",illegal:"$"},{className:"selector-tag",begin:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",
+relevance:0},{begin:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{begin:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},b,{className:"attribute",
+begin:"\\b(z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",
+illegal:"[^\\s]"},{begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},
+{begin:":",end:";",contains:[b,d,a.CSS_NUMBER_MODE,a.QUOTE_STRING_MODE,a.APOS_STRING_MODE,{className:"meta",begin:"!important"}]},{begin:"@",end:"[{;]",keywords:"mixin include extend for if else each while charset import debug media page content font-face namespace warn",contains:[b,a.QUOTE_STRING_MODE,a.APOS_STRING_MODE,d,a.CSS_NUMBER_MODE,{begin:"\\s[A-Za-z0-9_.-]+",relevance:0}]}]}});b.registerLanguage("shell",function(a){return{aliases:["console"],contains:[{className:"meta",begin:"^\\s{0,3}[\\w\\d\\[\\]()@-]*[>%$#]",
+starts:{end:"$",subLanguage:"bash"}}]}});b.registerLanguage("smali",function(a){var b="add and cmp cmpg cmpl const div double float goto if int long move mul neg new nop not or rem return shl shr sput sub throw ushr xor".split(" ");return{aliases:["smali"],contains:[{className:"string",begin:'"',end:'"',relevance:0},a.COMMENT("#","$",{relevance:0}),{className:"keyword",variants:[{begin:"\\s*\\.end\\s[a-zA-Z0-9]*"},{begin:"^[ ]*\\.[a-zA-Z]*",relevance:0},{begin:"\\s:[a-zA-Z_0-9]*",relevance:0},{begin:"\\s(transient|constructor|abstract|final|synthetic|public|private|protected|static|bridge|system)"}]},
+{className:"built_in",variants:[{begin:"\\s("+b.join("|")+")\\s"},{begin:"\\s("+b.join("|")+")((\\-|/)[a-zA-Z0-9]+)+\\s",relevance:10},{begin:"\\s(aget|aput|array|check|execute|fill|filled|goto/16|goto/32|iget|instance|invoke|iput|monitor|packed|sget|sparse)((\\-|/)[a-zA-Z0-9]+)*\\s",relevance:10}]},{className:"class",begin:"L[^(;:\n]*;",relevance:0},{begin:"[vp][0-9]+"}]}});b.registerLanguage("smalltalk",function(a){var b={className:"string",begin:"\\$.{1}"},d={className:"symbol",begin:"#"+a.UNDERSCORE_IDENT_RE};
+return{aliases:["st"],keywords:"self super nil true false thisContext",contains:[a.COMMENT('"','"'),a.APOS_STRING_MODE,{className:"type",begin:"\\b[A-Z][A-Za-z0-9_]*",relevance:0},{begin:"[a-z][a-zA-Z0-9_]*:",relevance:0},a.C_NUMBER_MODE,d,b,{begin:"\\|[ ]*[a-z][a-zA-Z0-9_]*([ ]+[a-z][a-zA-Z0-9_]*)*[ ]*\\|",returnBegin:!0,end:/\|/,illegal:/\S/,contains:[{begin:"(\\|[ ]*)?[a-z][a-zA-Z0-9_]*"}]},{begin:"\\#\\(",end:"\\)",contains:[a.APOS_STRING_MODE,b,a.C_NUMBER_MODE,d]}]}});b.registerLanguage("sml",
+function(a){return{aliases:["ml"],keywords:{keyword:"abstype and andalso as case datatype do else end eqtype exception fn fun functor handle if in include infix infixr let local nonfix of op open orelse raise rec sharing sig signature struct structure then type val with withtype where while",built_in:"array bool char exn int list option order real ref string substring vector unit word",literal:"true false NONE SOME LESS EQUAL GREATER nil"},illegal:/\/\/|>>/,lexemes:"[a-z_]\\w*!?",contains:[{className:"literal",
+begin:/\[(\|\|)?\]|\(\)/,relevance:0},a.COMMENT("\\(\\*","\\*\\)",{contains:["self"]}),{className:"symbol",begin:"'[A-Za-z_](?!')[\\w']*"},{className:"type",begin:"`[A-Z][\\w']*"},{className:"type",begin:"\\b[A-Z][\\w']*",relevance:0},{begin:"[a-z_]\\w*'[\\w']*"},a.inherit(a.APOS_STRING_MODE,{className:"string",relevance:0}),a.inherit(a.QUOTE_STRING_MODE,{illegal:null}),{className:"number",begin:"\\b(0[xX][a-fA-F0-9_]+[Lln]?|0[oO][0-7_]+[Lln]?|0[bB][01_]+[Lln]?|[0-9][0-9_]*([Lln]|(\\.[0-9_]*)?([eE][-+]?[0-9_]+)?)?)",
+relevance:0},{begin:/[-=]>/}]}});b.registerLanguage("sqf",function(a){var b=a.getLanguage("cpp").exports;return{aliases:["sqf"],case_insensitive:!0,keywords:{keyword:"case catch default do else exit exitWith for forEach from if private switch then throw to try waitUntil while with",built_in:"abs accTime acos action actionIDs actionKeys actionKeysImages actionKeysNames actionKeysNamesArray actionName actionParams activateAddons activatedAddons activateKey add3DENConnection add3DENEventHandler add3DENLayer addAction addBackpack addBackpackCargo addBackpackCargoGlobal addBackpackGlobal addCamShake addCuratorAddons addCuratorCameraArea addCuratorEditableObjects addCuratorEditingArea addCuratorPoints addEditorObject addEventHandler addForce addGoggles addGroupIcon addHandgunItem addHeadgear addItem addItemCargo addItemCargoGlobal addItemPool addItemToBackpack addItemToUniform addItemToVest addLiveStats addMagazine addMagazineAmmoCargo addMagazineCargo addMagazineCargoGlobal addMagazineGlobal addMagazinePool addMagazines addMagazineTurret addMenu addMenuItem addMissionEventHandler addMPEventHandler addMusicEventHandler addOwnedMine addPlayerScores addPrimaryWeaponItem addPublicVariableEventHandler addRating addResources addScore addScoreSide addSecondaryWeaponItem addSwitchableUnit addTeamMember addToRemainsCollector addTorque addUniform addVehicle addVest addWaypoint addWeapon addWeaponCargo addWeaponCargoGlobal addWeaponGlobal addWeaponItem addWeaponPool addWeaponTurret admin agent agents AGLToASL aimedAtTarget aimPos airDensityRTD airplaneThrottle airportSide AISFinishHeal alive all3DENEntities allAirports allControls allCurators allCutLayers allDead allDeadMen allDisplays allGroups allMapMarkers allMines allMissionObjects allow3DMode allowCrewInImmobile allowCuratorLogicIgnoreAreas allowDamage allowDammage allowFileOperations allowFleeing allowGetIn allowSprint allPlayers allSimpleObjects allSites allTurrets allUnits allUnitsUAV allVariables ammo ammoOnPylon and animate animateBay animateDoor animatePylon animateSource animationNames animationPhase animationSourcePhase animationState append apply armoryPoints arrayIntersect asin ASLToAGL ASLToATL assert assignAsCargo assignAsCargoIndex assignAsCommander assignAsDriver assignAsGunner assignAsTurret assignCurator assignedCargo assignedCommander assignedDriver assignedGunner assignedItems assignedTarget assignedTeam assignedVehicle assignedVehicleRole assignItem assignTeam assignToAirport atan atan2 atg ATLToASL attachedObject attachedObjects attachedTo attachObject attachTo attackEnabled backpack backpackCargo backpackContainer backpackItems backpackMagazines backpackSpaceFor behaviour benchmark binocular boundingBox boundingBoxReal boundingCenter breakOut breakTo briefingName buildingExit buildingPos buttonAction buttonSetAction cadetMode call callExtension camCommand camCommit camCommitPrepared camCommitted camConstuctionSetParams camCreate camDestroy cameraEffect cameraEffectEnableHUD cameraInterest cameraOn cameraView campaignConfigFile camPreload camPreloaded camPrepareBank camPrepareDir camPrepareDive camPrepareFocus camPrepareFov camPrepareFovRange camPreparePos camPrepareRelPos camPrepareTarget camSetBank camSetDir camSetDive camSetFocus camSetFov camSetFovRange camSetPos camSetRelPos camSetTarget camTarget camUseNVG canAdd canAddItemToBackpack canAddItemToUniform canAddItemToVest cancelSimpleTaskDestination canFire canMove canSlingLoad canStand canSuspend canTriggerDynamicSimulation canUnloadInCombat canVehicleCargo captive captiveNum cbChecked cbSetChecked ceil channelEnabled cheatsEnabled checkAIFeature checkVisibility className clearAllItemsFromBackpack clearBackpackCargo clearBackpackCargoGlobal clearGroupIcons clearItemCargo clearItemCargoGlobal clearItemPool clearMagazineCargo clearMagazineCargoGlobal clearMagazinePool clearOverlay clearRadio clearWeaponCargo clearWeaponCargoGlobal clearWeaponPool clientOwner closeDialog closeDisplay closeOverlay collapseObjectTree collect3DENHistory collectiveRTD combatMode commandArtilleryFire commandChat commander commandFire commandFollow commandFSM commandGetOut commandingMenu commandMove commandRadio commandStop commandSuppressiveFire commandTarget commandWatch comment commitOverlay compile compileFinal completedFSM composeText configClasses configFile configHierarchy configName configProperties configSourceAddonList configSourceMod configSourceModList confirmSensorTarget connectTerminalToUAV controlsGroupCtrl copyFromClipboard copyToClipboard copyWaypoints cos count countEnemy countFriendly countSide countType countUnknown create3DENComposition create3DENEntity createAgent createCenter createDialog createDiaryLink createDiaryRecord createDiarySubject createDisplay createGearDialog createGroup createGuardedPoint createLocation createMarker createMarkerLocal createMenu createMine createMissionDisplay createMPCampaignDisplay createSimpleObject createSimpleTask createSite createSoundSource createTask createTeam createTrigger createUnit createVehicle createVehicleCrew createVehicleLocal crew ctAddHeader ctAddRow ctClear ctCurSel ctData ctFindHeaderRows ctFindRowHeader ctHeaderControls ctHeaderCount ctRemoveHeaders ctRemoveRows ctrlActivate ctrlAddEventHandler ctrlAngle ctrlAutoScrollDelay ctrlAutoScrollRewind ctrlAutoScrollSpeed ctrlChecked ctrlClassName ctrlCommit ctrlCommitted ctrlCreate ctrlDelete ctrlEnable ctrlEnabled ctrlFade ctrlHTMLLoaded ctrlIDC ctrlIDD ctrlMapAnimAdd ctrlMapAnimClear ctrlMapAnimCommit ctrlMapAnimDone ctrlMapCursor ctrlMapMouseOver ctrlMapScale ctrlMapScreenToWorld ctrlMapWorldToScreen ctrlModel ctrlModelDirAndUp ctrlModelScale ctrlParent ctrlParentControlsGroup ctrlPosition ctrlRemoveAllEventHandlers ctrlRemoveEventHandler ctrlScale ctrlSetActiveColor ctrlSetAngle ctrlSetAutoScrollDelay ctrlSetAutoScrollRewind ctrlSetAutoScrollSpeed ctrlSetBackgroundColor ctrlSetChecked ctrlSetEventHandler ctrlSetFade ctrlSetFocus ctrlSetFont ctrlSetFontH1 ctrlSetFontH1B ctrlSetFontH2 ctrlSetFontH2B ctrlSetFontH3 ctrlSetFontH3B ctrlSetFontH4 ctrlSetFontH4B ctrlSetFontH5 ctrlSetFontH5B ctrlSetFontH6 ctrlSetFontH6B ctrlSetFontHeight ctrlSetFontHeightH1 ctrlSetFontHeightH2 ctrlSetFontHeightH3 ctrlSetFontHeightH4 ctrlSetFontHeightH5 ctrlSetFontHeightH6 ctrlSetFontHeightSecondary ctrlSetFontP ctrlSetFontPB ctrlSetFontSecondary ctrlSetForegroundColor ctrlSetModel ctrlSetModelDirAndUp ctrlSetModelScale ctrlSetPixelPrecision ctrlSetPosition ctrlSetScale ctrlSetStructuredText ctrlSetText ctrlSetTextColor ctrlSetTooltip ctrlSetTooltipColorBox ctrlSetTooltipColorShade ctrlSetTooltipColorText ctrlShow ctrlShown ctrlText ctrlTextHeight ctrlTextWidth ctrlType ctrlVisible ctRowControls ctRowCount ctSetCurSel ctSetData ctSetHeaderTemplate ctSetRowTemplate ctSetValue ctValue curatorAddons curatorCamera curatorCameraArea curatorCameraAreaCeiling curatorCoef curatorEditableObjects curatorEditingArea curatorEditingAreaType curatorMouseOver curatorPoints curatorRegisteredObjects curatorSelected curatorWaypointCost current3DENOperation currentChannel currentCommand currentMagazine currentMagazineDetail currentMagazineDetailTurret currentMagazineTurret currentMuzzle currentNamespace currentTask currentTasks currentThrowable currentVisionMode currentWaypoint currentWeapon currentWeaponMode currentWeaponTurret currentZeroing cursorObject cursorTarget customChat customRadio cutFadeOut cutObj cutRsc cutText damage date dateToNumber daytime deActivateKey debriefingText debugFSM debugLog deg delete3DENEntities deleteAt deleteCenter deleteCollection deleteEditorObject deleteGroup deleteGroupWhenEmpty deleteIdentity deleteLocation deleteMarker deleteMarkerLocal deleteRange deleteResources deleteSite deleteStatus deleteTeam deleteVehicle deleteVehicleCrew deleteWaypoint detach detectedMines diag_activeMissionFSMs diag_activeScripts diag_activeSQFScripts diag_activeSQSScripts diag_captureFrame diag_captureFrameToFile diag_captureSlowFrame diag_codePerformance diag_drawMode diag_enable diag_enabled diag_fps diag_fpsMin diag_frameNo diag_lightNewLoad diag_list diag_log diag_logSlowFrame diag_mergeConfigFile diag_recordTurretLimits diag_setLightNew diag_tickTime diag_toggle dialog diarySubjectExists didJIP didJIPOwner difficulty difficultyEnabled difficultyEnabledRTD difficultyOption direction directSay disableAI disableCollisionWith disableConversation disableDebriefingStats disableMapIndicators disableNVGEquipment disableRemoteSensors disableSerialization disableTIEquipment disableUAVConnectability disableUserInput displayAddEventHandler displayCtrl displayParent displayRemoveAllEventHandlers displayRemoveEventHandler displaySetEventHandler dissolveTeam distance distance2D distanceSqr distributionRegion do3DENAction doArtilleryFire doFire doFollow doFSM doGetOut doMove doorPhase doStop doSuppressiveFire doTarget doWatch drawArrow drawEllipse drawIcon drawIcon3D drawLine drawLine3D drawLink drawLocation drawPolygon drawRectangle drawTriangle driver drop dynamicSimulationDistance dynamicSimulationDistanceCoef dynamicSimulationEnabled dynamicSimulationSystemEnabled echo edit3DENMissionAttributes editObject editorSetEventHandler effectiveCommander emptyPositions enableAI enableAIFeature enableAimPrecision enableAttack enableAudioFeature enableAutoStartUpRTD enableAutoTrimRTD enableCamShake enableCaustics enableChannel enableCollisionWith enableCopilot enableDebriefingStats enableDiagLegend enableDynamicSimulation enableDynamicSimulationSystem enableEndDialog enableEngineArtillery enableEnvironment enableFatigue enableGunLights enableInfoPanelComponent enableIRLasers enableMimics enablePersonTurret enableRadio enableReload enableRopeAttach enableSatNormalOnDetail enableSaving enableSentences enableSimulation enableSimulationGlobal enableStamina enableTeamSwitch enableTraffic enableUAVConnectability enableUAVWaypoints enableVehicleCargo enableVehicleSensor enableWeaponDisassembly endLoadingScreen endMission engineOn enginesIsOnRTD enginesRpmRTD enginesTorqueRTD entities environmentEnabled estimatedEndServerTime estimatedTimeLeft evalObjectArgument everyBackpack everyContainer exec execEditorScript execFSM execVM exp expectedDestination exportJIPMessages eyeDirection eyePos face faction fadeMusic fadeRadio fadeSound fadeSpeech failMission fillWeaponsFromPool find findCover findDisplay findEditorObject findEmptyPosition findEmptyPositionReady findIf findNearestEnemy finishMissionInit finite fire fireAtTarget firstBackpack flag flagAnimationPhase flagOwner flagSide flagTexture fleeing floor flyInHeight flyInHeightASL fog fogForecast fogParams forceAddUniform forcedMap forceEnd forceFlagTexture forceFollowRoad forceMap forceRespawn forceSpeed forceWalk forceWeaponFire forceWeatherChange forEachMember forEachMemberAgent forEachMemberTeam forgetTarget format formation formationDirection formationLeader formationMembers formationPosition formationTask formatText formLeader freeLook fromEditor fuel fullCrew gearIDCAmmoCount gearSlotAmmoCount gearSlotData get3DENActionState get3DENAttribute get3DENCamera get3DENConnections get3DENEntity get3DENEntityID get3DENGrid get3DENIconsVisible get3DENLayerEntities get3DENLinesVisible get3DENMissionAttribute get3DENMouseOver get3DENSelected getAimingCoef getAllEnvSoundControllers getAllHitPointsDamage getAllOwnedMines getAllSoundControllers getAmmoCargo getAnimAimPrecision getAnimSpeedCoef getArray getArtilleryAmmo getArtilleryComputerSettings getArtilleryETA getAssignedCuratorLogic getAssignedCuratorUnit getBackpackCargo getBleedingRemaining getBurningValue getCameraViewDirection getCargoIndex getCenterOfMass getClientState getClientStateNumber getCompatiblePylonMagazines getConnectedUAV getContainerMaxLoad getCursorObjectParams getCustomAimCoef getDammage getDescription getDir getDirVisual getDLCAssetsUsage getDLCAssetsUsageByName getDLCs getEditorCamera getEditorMode getEditorObjectScope getElevationOffset getEnvSoundController getFatigue getForcedFlagTexture getFriend getFSMVariable getFuelCargo getGroupIcon getGroupIconParams getGroupIcons getHideFrom getHit getHitIndex getHitPointDamage getItemCargo getMagazineCargo getMarkerColor getMarkerPos getMarkerSize getMarkerType getMass getMissionConfig getMissionConfigValue getMissionDLCs getMissionLayerEntities getModelInfo getMousePosition getMusicPlayedTime getNumber getObjectArgument getObjectChildren getObjectDLC getObjectMaterials getObjectProxy getObjectTextures getObjectType getObjectViewDistance getOxygenRemaining getPersonUsedDLCs getPilotCameraDirection getPilotCameraPosition getPilotCameraRotation getPilotCameraTarget getPlateNumber getPlayerChannel getPlayerScores getPlayerUID getPos getPosASL getPosASLVisual getPosASLW getPosATL getPosATLVisual getPosVisual getPosWorld getPylonMagazines getRelDir getRelPos getRemoteSensorsDisabled getRepairCargo getResolution getShadowDistance getShotParents getSlingLoad getSoundController getSoundControllerResult getSpeed getStamina getStatValue getSuppression getTerrainGrid getTerrainHeightASL getText getTotalDLCUsageTime getUnitLoadout getUnitTrait getUserMFDText getUserMFDvalue getVariable getVehicleCargo getWeaponCargo getWeaponSway getWingsOrientationRTD getWingsPositionRTD getWPPos glanceAt globalChat globalRadio goggles goto group groupChat groupFromNetId groupIconSelectable groupIconsVisible groupId groupOwner groupRadio groupSelectedUnits groupSelectUnit gunner gusts halt handgunItems handgunMagazine handgunWeapon handsHit hasInterface hasPilotCamera hasWeapon hcAllGroups hcGroupParams hcLeader hcRemoveAllGroups hcRemoveGroup hcSelected hcSelectGroup hcSetGroup hcShowBar hcShownBar headgear hideBody hideObject hideObjectGlobal hideSelection hint hintC hintCadet hintSilent hmd hostMission htmlLoad HUDMovementLevels humidity image importAllGroups importance in inArea inAreaArray incapacitatedState inflame inflamed infoPanel infoPanelComponentEnabled infoPanelComponents infoPanels inGameUISetEventHandler inheritsFrom initAmbientLife inPolygon inputAction inRangeOfArtillery insertEditorObject intersect is3DEN is3DENMultiplayer isAbleToBreathe isAgent isArray isAutoHoverOn isAutonomous isAutotest isBleeding isBurning isClass isCollisionLightOn isCopilotEnabled isDamageAllowed isDedicated isDLCAvailable isEngineOn isEqualTo isEqualType isEqualTypeAll isEqualTypeAny isEqualTypeArray isEqualTypeParams isFilePatchingEnabled isFlashlightOn isFlatEmpty isForcedWalk isFormationLeader isGroupDeletedWhenEmpty isHidden isInRemainsCollector isInstructorFigureEnabled isIRLaserOn isKeyActive isKindOf isLaserOn isLightOn isLocalized isManualFire isMarkedForCollection isMultiplayer isMultiplayerSolo isNil isNull isNumber isObjectHidden isObjectRTD isOnRoad isPipEnabled isPlayer isRealTime isRemoteExecuted isRemoteExecutedJIP isServer isShowing3DIcons isSimpleObject isSprintAllowed isStaminaEnabled isSteamMission isStreamFriendlyUIEnabled isText isTouchingGround isTurnedOut isTutHintsEnabled isUAVConnectable isUAVConnected isUIContext isUniformAllowed isVehicleCargo isVehicleRadarOn isVehicleSensorEnabled isWalking isWeaponDeployed isWeaponRested itemCargo items itemsWithMagazines join joinAs joinAsSilent joinSilent joinString kbAddDatabase kbAddDatabaseTargets kbAddTopic kbHasTopic kbReact kbRemoveTopic kbTell kbWasSaid keyImage keyName knowsAbout land landAt landResult language laserTarget lbAdd lbClear lbColor lbColorRight lbCurSel lbData lbDelete lbIsSelected lbPicture lbPictureRight lbSelection lbSetColor lbSetColorRight lbSetCurSel lbSetData lbSetPicture lbSetPictureColor lbSetPictureColorDisabled lbSetPictureColorSelected lbSetPictureRight lbSetPictureRightColor lbSetPictureRightColorDisabled lbSetPictureRightColorSelected lbSetSelectColor lbSetSelectColorRight lbSetSelected lbSetText lbSetTextRight lbSetTooltip lbSetValue lbSize lbSort lbSortByValue lbText lbTextRight lbValue leader leaderboardDeInit leaderboardGetRows leaderboardInit leaderboardRequestRowsFriends leaderboardsRequestUploadScore leaderboardsRequestUploadScoreKeepBest leaderboardState leaveVehicle libraryCredits libraryDisclaimers lifeState lightAttachObject lightDetachObject lightIsOn lightnings limitSpeed linearConversion lineIntersects lineIntersectsObjs lineIntersectsSurfaces lineIntersectsWith linkItem list listObjects listRemoteTargets listVehicleSensors ln lnbAddArray lnbAddColumn lnbAddRow lnbClear lnbColor lnbCurSelRow lnbData lnbDeleteColumn lnbDeleteRow lnbGetColumnsPosition lnbPicture lnbSetColor lnbSetColumnsPos lnbSetCurSelRow lnbSetData lnbSetPicture lnbSetText lnbSetValue lnbSize lnbSort lnbSortByValue lnbText lnbValue load loadAbs loadBackpack loadFile loadGame loadIdentity loadMagazine loadOverlay loadStatus loadUniform loadVest local localize locationPosition lock lockCameraTo lockCargo lockDriver locked lockedCargo lockedDriver lockedTurret lockIdentity lockTurret lockWP log logEntities logNetwork logNetworkTerminate lookAt lookAtPos magazineCargo magazines magazinesAllTurrets magazinesAmmo magazinesAmmoCargo magazinesAmmoFull magazinesDetail magazinesDetailBackpack magazinesDetailUniform magazinesDetailVest magazinesTurret magazineTurretAmmo mapAnimAdd mapAnimClear mapAnimCommit mapAnimDone mapCenterOnCamera mapGridPosition markAsFinishedOnSteam markerAlpha markerBrush markerColor markerDir markerPos markerShape markerSize markerText markerType max members menuAction menuAdd menuChecked menuClear menuCollapse menuData menuDelete menuEnable menuEnabled menuExpand menuHover menuPicture menuSetAction menuSetCheck menuSetData menuSetPicture menuSetValue menuShortcut menuShortcutText menuSize menuSort menuText menuURL menuValue min mineActive mineDetectedBy missionConfigFile missionDifficulty missionName missionNamespace missionStart missionVersion mod modelToWorld modelToWorldVisual modelToWorldVisualWorld modelToWorldWorld modParams moonIntensity moonPhase morale move move3DENCamera moveInAny moveInCargo moveInCommander moveInDriver moveInGunner moveInTurret moveObjectToEnd moveOut moveTime moveTo moveToCompleted moveToFailed musicVolume name nameSound nearEntities nearestBuilding nearestLocation nearestLocations nearestLocationWithDubbing nearestObject nearestObjects nearestTerrainObjects nearObjects nearObjectsReady nearRoads nearSupplies nearTargets needReload netId netObjNull newOverlay nextMenuItemIndex nextWeatherChange nMenuItems not numberOfEnginesRTD numberToDate objectCurators objectFromNetId objectParent objStatus onBriefingGroup onBriefingNotes onBriefingPlan onBriefingTeamSwitch onCommandModeChanged onDoubleClick onEachFrame onGroupIconClick onGroupIconOverEnter onGroupIconOverLeave onHCGroupSelectionChanged onMapSingleClick onPlayerConnected onPlayerDisconnected onPreloadFinished onPreloadStarted onShowNewObject onTeamSwitch openCuratorInterface openDLCPage openMap openSteamApp openYoutubeVideo or orderGetIn overcast overcastForecast owner param params parseNumber parseSimpleArray parseText parsingNamespace particlesQuality pickWeaponPool pitch pixelGrid pixelGridBase pixelGridNoUIScale pixelH pixelW playableSlotsNumber playableUnits playAction playActionNow player playerRespawnTime playerSide playersNumber playGesture playMission playMove playMoveNow playMusic playScriptedMission playSound playSound3D position positionCameraToWorld posScreenToWorld posWorldToScreen ppEffectAdjust ppEffectCommit ppEffectCommitted ppEffectCreate ppEffectDestroy ppEffectEnable ppEffectEnabled ppEffectForceInNVG precision preloadCamera preloadObject preloadSound preloadTitleObj preloadTitleRsc preprocessFile preprocessFileLineNumbers primaryWeapon primaryWeaponItems primaryWeaponMagazine priority processDiaryLink productVersion profileName profileNamespace profileNameSteam progressLoadingScreen progressPosition progressSetPosition publicVariable publicVariableClient publicVariableServer pushBack pushBackUnique putWeaponPool queryItemsPool queryMagazinePool queryWeaponPool rad radioChannelAdd radioChannelCreate radioChannelRemove radioChannelSetCallSign radioChannelSetLabel radioVolume rain rainbow random rank rankId rating rectangular registeredTasks registerTask reload reloadEnabled remoteControl remoteExec remoteExecCall remoteExecutedOwner remove3DENConnection remove3DENEventHandler remove3DENLayer removeAction removeAll3DENEventHandlers removeAllActions removeAllAssignedItems removeAllContainers removeAllCuratorAddons removeAllCuratorCameraAreas removeAllCuratorEditingAreas removeAllEventHandlers removeAllHandgunItems removeAllItems removeAllItemsWithMagazines removeAllMissionEventHandlers removeAllMPEventHandlers removeAllMusicEventHandlers removeAllOwnedMines removeAllPrimaryWeaponItems removeAllWeapons removeBackpack removeBackpackGlobal removeCuratorAddons removeCuratorCameraArea removeCuratorEditableObjects removeCuratorEditingArea removeDrawIcon removeDrawLinks removeEventHandler removeFromRemainsCollector removeGoggles removeGroupIcon removeHandgunItem removeHeadgear removeItem removeItemFromBackpack removeItemFromUniform removeItemFromVest removeItems removeMagazine removeMagazineGlobal removeMagazines removeMagazinesTurret removeMagazineTurret removeMenuItem removeMissionEventHandler removeMPEventHandler removeMusicEventHandler removeOwnedMine removePrimaryWeaponItem removeSecondaryWeaponItem removeSimpleTask removeSwitchableUnit removeTeamMember removeUniform removeVest removeWeapon removeWeaponAttachmentCargo removeWeaponCargo removeWeaponGlobal removeWeaponTurret reportRemoteTarget requiredVersion resetCamShake resetSubgroupDirection resize resources respawnVehicle restartEditorCamera reveal revealMine reverse reversedMouseY roadAt roadsConnectedTo roleDescription ropeAttachedObjects ropeAttachedTo ropeAttachEnabled ropeAttachTo ropeCreate ropeCut ropeDestroy ropeDetach ropeEndPosition ropeLength ropes ropeUnwind ropeUnwound rotorsForcesRTD rotorsRpmRTD round runInitScript safeZoneH safeZoneW safeZoneWAbs safeZoneX safeZoneXAbs safeZoneY save3DENInventory saveGame saveIdentity saveJoysticks saveOverlay saveProfileNamespace saveStatus saveVar savingEnabled say say2D say3D scopeName score scoreSide screenshot screenToWorld scriptDone scriptName scudState secondaryWeapon secondaryWeaponItems secondaryWeaponMagazine select selectBestPlaces selectDiarySubject selectedEditorObjects selectEditorObject selectionNames selectionPosition selectLeader selectMax selectMin selectNoPlayer selectPlayer selectRandom selectRandomWeighted selectWeapon selectWeaponTurret sendAUMessage sendSimpleCommand sendTask sendTaskResult sendUDPMessage serverCommand serverCommandAvailable serverCommandExecutable serverName serverTime set set3DENAttribute set3DENAttributes set3DENGrid set3DENIconsVisible set3DENLayer set3DENLinesVisible set3DENLogicType set3DENMissionAttribute set3DENMissionAttributes set3DENModelsVisible set3DENObjectType set3DENSelected setAccTime setActualCollectiveRTD setAirplaneThrottle setAirportSide setAmmo setAmmoCargo setAmmoOnPylon setAnimSpeedCoef setAperture setApertureNew setArmoryPoints setAttributes setAutonomous setBehaviour setBleedingRemaining setBrakesRTD setCameraInterest setCamShakeDefParams setCamShakeParams setCamUseTI setCaptive setCenterOfMass setCollisionLight setCombatMode setCompassOscillation setConvoySeparation setCuratorCameraAreaCeiling setCuratorCoef setCuratorEditingAreaType setCuratorWaypointCost setCurrentChannel setCurrentTask setCurrentWaypoint setCustomAimCoef setCustomWeightRTD setDamage setDammage setDate setDebriefingText setDefaultCamera setDestination setDetailMapBlendPars setDir setDirection setDrawIcon setDriveOnPath setDropInterval setDynamicSimulationDistance setDynamicSimulationDistanceCoef setEditorMode setEditorObjectScope setEffectCondition setEngineRPMRTD setFace setFaceAnimation setFatigue setFeatureType setFlagAnimationPhase setFlagOwner setFlagSide setFlagTexture setFog setFormation setFormationTask setFormDir setFriend setFromEditor setFSMVariable setFuel setFuelCargo setGroupIcon setGroupIconParams setGroupIconsSelectable setGroupIconsVisible setGroupId setGroupIdGlobal setGroupOwner setGusts setHideBehind setHit setHitIndex setHitPointDamage setHorizonParallaxCoef setHUDMovementLevels setIdentity setImportance setInfoPanel setLeader setLightAmbient setLightAttenuation setLightBrightness setLightColor setLightDayLight setLightFlareMaxDistance setLightFlareSize setLightIntensity setLightnings setLightUseFlare setLocalWindParams setMagazineTurretAmmo setMarkerAlpha setMarkerAlphaLocal setMarkerBrush setMarkerBrushLocal setMarkerColor setMarkerColorLocal setMarkerDir setMarkerDirLocal setMarkerPos setMarkerPosLocal setMarkerShape setMarkerShapeLocal setMarkerSize setMarkerSizeLocal setMarkerText setMarkerTextLocal setMarkerType setMarkerTypeLocal setMass setMimic setMousePosition setMusicEffect setMusicEventHandler setName setNameSound setObjectArguments setObjectMaterial setObjectMaterialGlobal setObjectProxy setObjectTexture setObjectTextureGlobal setObjectViewDistance setOvercast setOwner setOxygenRemaining setParticleCircle setParticleClass setParticleFire setParticleParams setParticleRandom setPilotCameraDirection setPilotCameraRotation setPilotCameraTarget setPilotLight setPiPEffect setPitch setPlateNumber setPlayable setPlayerRespawnTime setPos setPosASL setPosASL2 setPosASLW setPosATL setPosition setPosWorld setPylonLoadOut setPylonsPriority setRadioMsg setRain setRainbow setRandomLip setRank setRectangular setRepairCargo setRotorBrakeRTD setShadowDistance setShotParents setSide setSimpleTaskAlwaysVisible setSimpleTaskCustomData setSimpleTaskDescription setSimpleTaskDestination setSimpleTaskTarget setSimpleTaskType setSimulWeatherLayers setSize setSkill setSlingLoad setSoundEffect setSpeaker setSpeech setSpeedMode setStamina setStaminaScheme setStatValue setSuppression setSystemOfUnits setTargetAge setTaskMarkerOffset setTaskResult setTaskState setTerrainGrid setText setTimeMultiplier setTitleEffect setTrafficDensity setTrafficDistance setTrafficGap setTrafficSpeed setTriggerActivation setTriggerArea setTriggerStatements setTriggerText setTriggerTimeout setTriggerType setType setUnconscious setUnitAbility setUnitLoadout setUnitPos setUnitPosWeak setUnitRank setUnitRecoilCoefficient setUnitTrait setUnloadInCombat setUserActionText setUserMFDText setUserMFDvalue setVariable setVectorDir setVectorDirAndUp setVectorUp setVehicleAmmo setVehicleAmmoDef setVehicleArmor setVehicleCargo setVehicleId setVehicleLock setVehiclePosition setVehicleRadar setVehicleReceiveRemoteTargets setVehicleReportOwnPosition setVehicleReportRemoteTargets setVehicleTIPars setVehicleVarName setVelocity setVelocityModelSpace setVelocityTransformation setViewDistance setVisibleIfTreeCollapsed setWantedRPMRTD setWaves setWaypointBehaviour setWaypointCombatMode setWaypointCompletionRadius setWaypointDescription setWaypointForceBehaviour setWaypointFormation setWaypointHousePosition setWaypointLoiterRadius setWaypointLoiterType setWaypointName setWaypointPosition setWaypointScript setWaypointSpeed setWaypointStatements setWaypointTimeout setWaypointType setWaypointVisible setWeaponReloadingTime setWind setWindDir setWindForce setWindStr setWingForceScaleRTD setWPPos show3DIcons showChat showCinemaBorder showCommandingMenu showCompass showCuratorCompass showGPS showHUD showLegend showMap shownArtilleryComputer shownChat shownCompass shownCuratorCompass showNewEditorObject shownGPS shownHUD shownMap shownPad shownRadio shownScoretable shownUAVFeed shownWarrant shownWatch showPad showRadio showScoretable showSubtitles showUAVFeed showWarrant showWatch showWaypoint showWaypoints side sideChat sideEnemy sideFriendly sideRadio simpleTasks simulationEnabled simulCloudDensity simulCloudOcclusion simulInClouds simulWeatherSync sin size sizeOf skill skillFinal skipTime sleep sliderPosition sliderRange sliderSetPosition sliderSetRange sliderSetSpeed sliderSpeed slingLoadAssistantShown soldierMagazines someAmmo sort soundVolume spawn speaker speed speedMode splitString sqrt squadParams stance startLoadingScreen step stop stopEngineRTD stopped str sunOrMoon supportInfo suppressFor surfaceIsWater surfaceNormal surfaceType swimInDepth switchableUnits switchAction switchCamera switchGesture switchLight switchMove synchronizedObjects synchronizedTriggers synchronizedWaypoints synchronizeObjectsAdd synchronizeObjectsRemove synchronizeTrigger synchronizeWaypoint systemChat systemOfUnits tan targetKnowledge targets targetsAggregate targetsQuery taskAlwaysVisible taskChildren taskCompleted taskCustomData taskDescription taskDestination taskHint taskMarkerOffset taskParent taskResult taskState taskType teamMember teamName teams teamSwitch teamSwitchEnabled teamType terminate terrainIntersect terrainIntersectASL terrainIntersectAtASL text textLog textLogFormat tg time timeMultiplier titleCut titleFadeOut titleObj titleRsc titleText toArray toFixed toLower toString toUpper triggerActivated triggerActivation triggerArea triggerAttachedVehicle triggerAttachObject triggerAttachVehicle triggerDynamicSimulation triggerStatements triggerText triggerTimeout triggerTimeoutCurrent triggerType turretLocal turretOwner turretUnit tvAdd tvClear tvCollapse tvCollapseAll tvCount tvCurSel tvData tvDelete tvExpand tvExpandAll tvPicture tvSetColor tvSetCurSel tvSetData tvSetPicture tvSetPictureColor tvSetPictureColorDisabled tvSetPictureColorSelected tvSetPictureRight tvSetPictureRightColor tvSetPictureRightColorDisabled tvSetPictureRightColorSelected tvSetText tvSetTooltip tvSetValue tvSort tvSortByValue tvText tvTooltip tvValue type typeName typeOf UAVControl uiNamespace uiSleep unassignCurator unassignItem unassignTeam unassignVehicle underwater uniform uniformContainer uniformItems uniformMagazines unitAddons unitAimPosition unitAimPositionVisual unitBackpack unitIsUAV unitPos unitReady unitRecoilCoefficient units unitsBelowHeight unlinkItem unlockAchievement unregisterTask updateDrawIcon updateMenuItem updateObjectTree useAISteeringComponent useAudioTimeForMoves userInputDisabled vectorAdd vectorCos vectorCrossProduct vectorDiff vectorDir vectorDirVisual vectorDistance vectorDistanceSqr vectorDotProduct vectorFromTo vectorMagnitude vectorMagnitudeSqr vectorModelToWorld vectorModelToWorldVisual vectorMultiply vectorNormalized vectorUp vectorUpVisual vectorWorldToModel vectorWorldToModelVisual vehicle vehicleCargoEnabled vehicleChat vehicleRadio vehicleReceiveRemoteTargets vehicleReportOwnPosition vehicleReportRemoteTargets vehicles vehicleVarName velocity velocityModelSpace verifySignature vest vestContainer vestItems vestMagazines viewDistance visibleCompass visibleGPS visibleMap visiblePosition visiblePositionASL visibleScoretable visibleWatch waves waypointAttachedObject waypointAttachedVehicle waypointAttachObject waypointAttachVehicle waypointBehaviour waypointCombatMode waypointCompletionRadius waypointDescription waypointForceBehaviour waypointFormation waypointHousePosition waypointLoiterRadius waypointLoiterType waypointName waypointPosition waypoints waypointScript waypointsEnabledUAV waypointShow waypointSpeed waypointStatements waypointTimeout waypointTimeoutCurrent waypointType waypointVisible weaponAccessories weaponAccessoriesCargo weaponCargo weaponDirection weaponInertia weaponLowered weapons weaponsItems weaponsItemsCargo weaponState weaponsTurret weightRTD WFSideText wind ",
+literal:"blufor civilian configNull controlNull displayNull east endl false grpNull independent lineBreak locationNull nil objNull opfor pi resistance scriptNull sideAmbientLife sideEmpty sideLogic sideUnknown taskNull teamMemberNull true west"},contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,a.NUMBER_MODE,{className:"variable",begin:/\b_+[a-zA-Z_]\w*/},{className:"title",begin:/[a-zA-Z][a-zA-Z0-9]+_fnc_\w*/},{className:"string",variants:[{begin:'"',end:'"',contains:[{begin:'""',relevance:0}]},
+{begin:"'",end:"'",contains:[{begin:"''",relevance:0}]}]},b.preprocessor],illegal:/#|^\$ /}});b.registerLanguage("sql",function(a){var b=a.COMMENT("--","$");return{case_insensitive:!0,illegal:/[<>{}*]/,contains:[{beginKeywords:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment values with",
+end:/;/,endsWithParent:!0,lexemes:/[\w\.]+/,keywords:{keyword:"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select self semi sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",
+literal:"true false null unknown",built_in:"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp tinyint varchar varying void"},contains:[{className:"string",begin:"'",end:"'",contains:[a.BACKSLASH_ESCAPE,{begin:"''"}]},{className:"string",begin:'"',end:'"',contains:[a.BACKSLASH_ESCAPE,{begin:'""'}]},{className:"string",begin:"`",end:"`",contains:[a.BACKSLASH_ESCAPE]},a.C_NUMBER_MODE,
+a.C_BLOCK_COMMENT_MODE,b,a.HASH_COMMENT_MODE]},a.C_BLOCK_COMMENT_MODE,b,a.HASH_COMMENT_MODE]}});b.registerLanguage("stan",function(a){return{contains:[a.HASH_COMMENT_MODE,a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,{begin:a.UNDERSCORE_IDENT_RE,lexemes:a.UNDERSCORE_IDENT_RE,keywords:{name:"for in while repeat until if then else",symbol:"bernoulli bernoulli_logit binomial binomial_logit beta_binomial hypergeometric categorical categorical_logit ordered_logistic neg_binomial neg_binomial_2 neg_binomial_2_log poisson poisson_log multinomial normal exp_mod_normal skew_normal student_t cauchy double_exponential logistic gumbel lognormal chi_square inv_chi_square scaled_inv_chi_square exponential inv_gamma weibull frechet rayleigh wiener pareto pareto_type_2 von_mises uniform multi_normal multi_normal_prec multi_normal_cholesky multi_gp multi_gp_cholesky multi_student_t gaussian_dlm_obs dirichlet lkj_corr lkj_corr_cholesky wishart inv_wishart",
+"selector-tag":"int real vector simplex unit_vector ordered positive_ordered row_vector matrix cholesky_factor_corr cholesky_factor_cov corr_matrix cov_matrix",title:"functions model data parameters quantities transformed generated",literal:"true false"},relevance:0},{className:"number",begin:"0[xX][0-9a-fA-F]+[Li]?\\b",relevance:0},{className:"number",begin:"0[xX][0-9a-fA-F]+[Li]?\\b",relevance:0},{className:"number",begin:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",relevance:0},{className:"number",begin:"\\d+\\.(?!\\d)(?:i\\b)?",
+relevance:0},{className:"number",begin:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{className:"number",begin:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0}]}});b.registerLanguage("stata",function(a){return{aliases:["do","ado"],case_insensitive:!0,keywords:"if else in foreach for forv forva forval forvalu forvalue forvalues by bys bysort xi quietly qui capture about ac ac_7 acprplot acprplot_7 adjust ado adopath adoupdate alpha ameans an ano anov anova anova_estat anova_terms anovadef aorder ap app appe appen append arch arch_dr arch_estat arch_p archlm areg areg_p args arima arima_dr arima_estat arima_p as asmprobit asmprobit_estat asmprobit_lf asmprobit_mfx__dlg asmprobit_p ass asse asser assert avplot avplot_7 avplots avplots_7 bcskew0 bgodfrey binreg bip0_lf biplot bipp_lf bipr_lf bipr_p biprobit bitest bitesti bitowt blogit bmemsize boot bootsamp bootstrap bootstrap_8 boxco_l boxco_p boxcox boxcox_6 boxcox_p bprobit br break brier bro brow brows browse brr brrstat bs bs_7 bsampl_w bsample bsample_7 bsqreg bstat bstat_7 bstat_8 bstrap bstrap_7 ca ca_estat ca_p cabiplot camat canon canon_8 canon_8_p canon_estat canon_p cap caprojection capt captu captur capture cat cc cchart cchart_7 cci cd censobs_table centile cf char chdir checkdlgfiles checkestimationsample checkhlpfiles checksum chelp ci cii cl class classutil clear cli clis clist clo clog clog_lf clog_p clogi clogi_sw clogit clogit_lf clogit_p clogitp clogl_sw cloglog clonevar clslistarray cluster cluster_measures cluster_stop cluster_tree cluster_tree_8 clustermat cmdlog cnr cnre cnreg cnreg_p cnreg_sw cnsreg codebook collaps4 collapse colormult_nb colormult_nw compare compress conf confi confir confirm conren cons const constr constra constrai constrain constraint continue contract copy copyright copysource cor corc corr corr2data corr_anti corr_kmo corr_smc corre correl correla correlat correlate corrgram cou coun count cox cox_p cox_sw coxbase coxhaz coxvar cprplot cprplot_7 crc cret cretu cretur creturn cross cs cscript cscript_log csi ct ct_is ctset ctst_5 ctst_st cttost cumsp cumsp_7 cumul cusum cusum_7 cutil d|0 datasig datasign datasigna datasignat datasignatu datasignatur datasignature datetof db dbeta de dec deco decod decode deff des desc descr descri describ describe destring dfbeta dfgls dfuller di di_g dir dirstats dis discard disp disp_res disp_s displ displa display distinct do doe doed doedi doedit dotplot dotplot_7 dprobit drawnorm drop ds ds_util dstdize duplicates durbina dwstat dydx e|0 ed edi edit egen eivreg emdef en enc enco encod encode eq erase ereg ereg_lf ereg_p ereg_sw ereghet ereghet_glf ereghet_glf_sh ereghet_gp ereghet_ilf ereghet_ilf_sh ereghet_ip eret eretu eretur ereturn err erro error est est_cfexist est_cfname est_clickable est_expand est_hold est_table est_unhold est_unholdok estat estat_default estat_summ estat_vce_only esti estimates etodow etof etomdy ex exi exit expand expandcl fac fact facto factor factor_estat factor_p factor_pca_rotated factor_rotate factormat fcast fcast_compute fcast_graph fdades fdadesc fdadescr fdadescri fdadescrib fdadescribe fdasav fdasave fdause fh_st file open file read file close file filefilter fillin find_hlp_file findfile findit findit_7 fit fl fli flis flist for5_0 form forma format fpredict frac_154 frac_adj frac_chk frac_cox frac_ddp frac_dis frac_dv frac_in frac_mun frac_pp frac_pq frac_pv frac_wgt frac_xo fracgen fracplot fracplot_7 fracpoly fracpred fron_ex fron_hn fron_p fron_tn fron_tn2 frontier ftodate ftoe ftomdy ftowdate g|0 gamhet_glf gamhet_gp gamhet_ilf gamhet_ip gamma gamma_d2 gamma_p gamma_sw gammahet gdi_hexagon gdi_spokes ge gen gene gener genera generat generate genrank genstd genvmean gettoken gl gladder gladder_7 glim_l01 glim_l02 glim_l03 glim_l04 glim_l05 glim_l06 glim_l07 glim_l08 glim_l09 glim_l10 glim_l11 glim_l12 glim_lf glim_mu glim_nw1 glim_nw2 glim_nw3 glim_p glim_v1 glim_v2 glim_v3 glim_v4 glim_v5 glim_v6 glim_v7 glm glm_6 glm_p glm_sw glmpred glo glob globa global glogit glogit_8 glogit_p gmeans gnbre_lf gnbreg gnbreg_5 gnbreg_p gomp_lf gompe_sw gomper_p gompertz gompertzhet gomphet_glf gomphet_glf_sh gomphet_gp gomphet_ilf gomphet_ilf_sh gomphet_ip gphdot gphpen gphprint gprefs gprobi_p gprobit gprobit_8 gr gr7 gr_copy gr_current gr_db gr_describe gr_dir gr_draw gr_draw_replay gr_drop gr_edit gr_editviewopts gr_example gr_example2 gr_export gr_print gr_qscheme gr_query gr_read gr_rename gr_replay gr_save gr_set gr_setscheme gr_table gr_undo gr_use graph graph7 grebar greigen greigen_7 greigen_8 grmeanby grmeanby_7 gs_fileinfo gs_filetype gs_graphinfo gs_stat gsort gwood h|0 hadimvo hareg hausman haver he heck_d2 heckma_p heckman heckp_lf heckpr_p heckprob hel help hereg hetpr_lf hetpr_p hetprob hettest hexdump hilite hist hist_7 histogram hlogit hlu hmeans hotel hotelling hprobit hreg hsearch icd9 icd9_ff icd9p iis impute imtest inbase include inf infi infil infile infix inp inpu input ins insheet insp inspe inspec inspect integ inten intreg intreg_7 intreg_p intrg2_ll intrg_ll intrg_ll2 ipolate iqreg ir irf irf_create irfm iri is_svy is_svysum isid istdize ivprob_1_lf ivprob_lf ivprobit ivprobit_p ivreg ivreg_footnote ivtob_1_lf ivtob_lf ivtobit ivtobit_p jackknife jacknife jknife jknife_6 jknife_8 jkstat joinby kalarma1 kap kap_3 kapmeier kappa kapwgt kdensity kdensity_7 keep ksm ksmirnov ktau kwallis l|0 la lab labe label labelbook ladder levels levelsof leverage lfit lfit_p li lincom line linktest lis list lloghet_glf lloghet_glf_sh lloghet_gp lloghet_ilf lloghet_ilf_sh lloghet_ip llogi_sw llogis_p llogist llogistic llogistichet lnorm_lf lnorm_sw lnorma_p lnormal lnormalhet lnormhet_glf lnormhet_glf_sh lnormhet_gp lnormhet_ilf lnormhet_ilf_sh lnormhet_ip lnskew0 loadingplot loc loca local log logi logis_lf logistic logistic_p logit logit_estat logit_p loglogs logrank loneway lookfor lookup lowess lowess_7 lpredict lrecomp lroc lroc_7 lrtest ls lsens lsens_7 lsens_x lstat ltable ltable_7 ltriang lv lvr2plot lvr2plot_7 m|0 ma mac macr macro makecns man manova manova_estat manova_p manovatest mantel mark markin markout marksample mat mat_capp mat_order mat_put_rr mat_rapp mata mata_clear mata_describe mata_drop mata_matdescribe mata_matsave mata_matuse mata_memory mata_mlib mata_mosave mata_rename mata_which matalabel matcproc matlist matname matr matri matrix matrix_input__dlg matstrik mcc mcci md0_ md1_ md1debug_ md2_ md2debug_ mds mds_estat mds_p mdsconfig mdslong mdsmat mdsshepard mdytoe mdytof me_derd mean means median memory memsize meqparse mer merg merge mfp mfx mhelp mhodds minbound mixed_ll mixed_ll_reparm mkassert mkdir mkmat mkspline ml ml_5 ml_adjs ml_bhhhs ml_c_d ml_check ml_clear ml_cnt ml_debug ml_defd ml_e0 ml_e0_bfgs ml_e0_cycle ml_e0_dfp ml_e0i ml_e1 ml_e1_bfgs ml_e1_bhhh ml_e1_cycle ml_e1_dfp ml_e2 ml_e2_cycle ml_ebfg0 ml_ebfr0 ml_ebfr1 ml_ebh0q ml_ebhh0 ml_ebhr0 ml_ebr0i ml_ecr0i ml_edfp0 ml_edfr0 ml_edfr1 ml_edr0i ml_eds ml_eer0i ml_egr0i ml_elf ml_elf_bfgs ml_elf_bhhh ml_elf_cycle ml_elf_dfp ml_elfi ml_elfs ml_enr0i ml_enrr0 ml_erdu0 ml_erdu0_bfgs ml_erdu0_bhhh ml_erdu0_bhhhq ml_erdu0_cycle ml_erdu0_dfp ml_erdu0_nrbfgs ml_exde ml_footnote ml_geqnr ml_grad0 ml_graph ml_hbhhh ml_hd0 ml_hold ml_init ml_inv ml_log ml_max ml_mlout ml_mlout_8 ml_model ml_nb0 ml_opt ml_p ml_plot ml_query ml_rdgrd ml_repor ml_s_e ml_score ml_searc ml_technique ml_unhold mleval mlf_ mlmatbysum mlmatsum mlog mlogi mlogit mlogit_footnote mlogit_p mlopts mlsum mlvecsum mnl0_ mor more mov move mprobit mprobit_lf mprobit_p mrdu0_ mrdu1_ mvdecode mvencode mvreg mvreg_estat n|0 nbreg nbreg_al nbreg_lf nbreg_p nbreg_sw nestreg net newey newey_7 newey_p news nl nl_7 nl_9 nl_9_p nl_p nl_p_7 nlcom nlcom_p nlexp2 nlexp2_7 nlexp2a nlexp2a_7 nlexp3 nlexp3_7 nlgom3 nlgom3_7 nlgom4 nlgom4_7 nlinit nllog3 nllog3_7 nllog4 nllog4_7 nlog_rd nlogit nlogit_p nlogitgen nlogittree nlpred no nobreak noi nois noisi noisil noisily note notes notes_dlg nptrend numlabel numlist odbc old_ver olo olog ologi ologi_sw ologit ologit_p ologitp on one onew onewa oneway op_colnm op_comp op_diff op_inv op_str opr opro oprob oprob_sw oprobi oprobi_p oprobit oprobitp opts_exclusive order orthog orthpoly ou out outf outfi outfil outfile outs outsh outshe outshee outsheet ovtest pac pac_7 palette parse parse_dissim pause pca pca_8 pca_display pca_estat pca_p pca_rotate pcamat pchart pchart_7 pchi pchi_7 pcorr pctile pentium pergram pergram_7 permute permute_8 personal peto_st pkcollapse pkcross pkequiv pkexamine pkexamine_7 pkshape pksumm pksumm_7 pl plo plot plugin pnorm pnorm_7 poisgof poiss_lf poiss_sw poisso_p poisson poisson_estat post postclose postfile postutil pperron pr prais prais_e prais_e2 prais_p predict predictnl preserve print pro prob probi probit probit_estat probit_p proc_time procoverlay procrustes procrustes_estat procrustes_p profiler prog progr progra program prop proportion prtest prtesti pwcorr pwd q\\s qby qbys qchi qchi_7 qladder qladder_7 qnorm qnorm_7 qqplot qqplot_7 qreg qreg_c qreg_p qreg_sw qu quadchk quantile quantile_7 que quer query range ranksum ratio rchart rchart_7 rcof recast reclink recode reg reg3 reg3_p regdw regr regre regre_p2 regres regres_p regress regress_estat regriv_p remap ren rena renam rename renpfix repeat replace report reshape restore ret retu retur return rm rmdir robvar roccomp roccomp_7 roccomp_8 rocf_lf rocfit rocfit_8 rocgold rocplot rocplot_7 roctab roctab_7 rolling rologit rologit_p rot rota rotat rotate rotatemat rreg rreg_p ru run runtest rvfplot rvfplot_7 rvpplot rvpplot_7 sa safesum sample sampsi sav save savedresults saveold sc sca scal scala scalar scatter scm_mine sco scob_lf scob_p scobi_sw scobit scor score scoreplot scoreplot_help scree screeplot screeplot_help sdtest sdtesti se search separate seperate serrbar serrbar_7 serset set set_defaults sfrancia sh she shel shell shewhart shewhart_7 signestimationsample signrank signtest simul simul_7 simulate simulate_8 sktest sleep slogit slogit_d2 slogit_p smooth snapspan so sor sort spearman spikeplot spikeplot_7 spikeplt spline_x split sqreg sqreg_p sret sretu sretur sreturn ssc st st_ct st_hc st_hcd st_hcd_sh st_is st_issys st_note st_promo st_set st_show st_smpl st_subid stack statsby statsby_8 stbase stci stci_7 stcox stcox_estat stcox_fr stcox_fr_ll stcox_p stcox_sw stcoxkm stcoxkm_7 stcstat stcurv stcurve stcurve_7 stdes stem stepwise stereg stfill stgen stir stjoin stmc stmh stphplot stphplot_7 stphtest stphtest_7 stptime strate strate_7 streg streg_sw streset sts sts_7 stset stsplit stsum sttocc sttoct stvary stweib su suest suest_8 sum summ summa summar summari summariz summarize sunflower sureg survcurv survsum svar svar_p svmat svy svy_disp svy_dreg svy_est svy_est_7 svy_estat svy_get svy_gnbreg_p svy_head svy_header svy_heckman_p svy_heckprob_p svy_intreg_p svy_ivreg_p svy_logistic_p svy_logit_p svy_mlogit_p svy_nbreg_p svy_ologit_p svy_oprobit_p svy_poisson_p svy_probit_p svy_regress_p svy_sub svy_sub_7 svy_x svy_x_7 svy_x_p svydes svydes_8 svygen svygnbreg svyheckman svyheckprob svyintreg svyintreg_7 svyintrg svyivreg svylc svylog_p svylogit svymarkout svymarkout_8 svymean svymlog svymlogit svynbreg svyolog svyologit svyoprob svyoprobit svyopts svypois svypois_7 svypoisson svyprobit svyprobt svyprop svyprop_7 svyratio svyreg svyreg_p svyregress svyset svyset_7 svyset_8 svytab svytab_7 svytest svytotal sw sw_8 swcnreg swcox swereg swilk swlogis swlogit swologit swoprbt swpois swprobit swqreg swtobit swweib symmetry symmi symplot symplot_7 syntax sysdescribe sysdir sysuse szroeter ta tab tab1 tab2 tab_or tabd tabdi tabdis tabdisp tabi table tabodds tabodds_7 tabstat tabu tabul tabula tabulat tabulate te tempfile tempname tempvar tes test testnl testparm teststd tetrachoric time_it timer tis tob tobi tobit tobit_p tobit_sw token tokeni tokeniz tokenize tostring total translate translator transmap treat_ll treatr_p treatreg trim trnb_cons trnb_mean trpoiss_d2 trunc_ll truncr_p truncreg tsappend tset tsfill tsline tsline_ex tsreport tsrevar tsrline tsset tssmooth tsunab ttest ttesti tut_chk tut_wait tutorial tw tware_st two twoway twoway__fpfit_serset twoway__function_gen twoway__histogram_gen twoway__ipoint_serset twoway__ipoints_serset twoway__kdensity_gen twoway__lfit_serset twoway__normgen_gen twoway__pci_serset twoway__qfit_serset twoway__scatteri_serset twoway__sunflower_gen twoway_ksm_serset ty typ type typeof u|0 unab unabbrev unabcmd update us use uselabel var var_mkcompanion var_p varbasic varfcast vargranger varirf varirf_add varirf_cgraph varirf_create varirf_ctable varirf_describe varirf_dir varirf_drop varirf_erase varirf_graph varirf_ograph varirf_rename varirf_set varirf_table varlist varlmar varnorm varsoc varstable varstable_w varstable_w2 varwle vce vec vec_fevd vec_mkphi vec_p vec_p_w vecirf_create veclmar veclmar_w vecnorm vecnorm_w vecrank vecstable verinst vers versi versio version view viewsource vif vwls wdatetof webdescribe webseek webuse weib1_lf weib2_lf weib_lf weib_lf0 weibhet_glf weibhet_glf_sh weibhet_glfa weibhet_glfa_sh weibhet_gp weibhet_ilf weibhet_ilf_sh weibhet_ilfa weibhet_ilfa_sh weibhet_ip weibu_sw weibul_p weibull weibull_c weibull_s weibullhet wh whelp whi which whil while wilc_st wilcoxon win wind windo window winexec wntestb wntestb_7 wntestq xchart xchart_7 xcorr xcorr_7 xi xi_6 xmlsav xmlsave xmluse xpose xsh xshe xshel xshell xt_iis xt_tis xtab_p xtabond xtbin_p xtclog xtcloglog xtcloglog_8 xtcloglog_d2 xtcloglog_pa_p xtcloglog_re_p xtcnt_p xtcorr xtdata xtdes xtfront_p xtfrontier xtgee xtgee_elink xtgee_estat xtgee_makeivar xtgee_p xtgee_plink xtgls xtgls_p xthaus xthausman xtht_p xthtaylor xtile xtint_p xtintreg xtintreg_8 xtintreg_d2 xtintreg_p xtivp_1 xtivp_2 xtivreg xtline xtline_ex xtlogit xtlogit_8 xtlogit_d2 xtlogit_fe_p xtlogit_pa_p xtlogit_re_p xtmixed xtmixed_estat xtmixed_p xtnb_fe xtnb_lf xtnbreg xtnbreg_pa_p xtnbreg_refe_p xtpcse xtpcse_p xtpois xtpoisson xtpoisson_d2 xtpoisson_pa_p xtpoisson_refe_p xtpred xtprobit xtprobit_8 xtprobit_d2 xtprobit_re_p xtps_fe xtps_lf xtps_ren xtps_ren_8 xtrar_p xtrc xtrc_p xtrchh xtrefe_p xtreg xtreg_be xtreg_fe xtreg_ml xtreg_pa_p xtreg_re xtregar xtrere_p xtset xtsf_ll xtsf_llti xtsum xttab xttest0 xttobit xttobit_8 xttobit_p xttrans yx yxview__barlike_draw yxview_area_draw yxview_bar_draw yxview_dot_draw yxview_dropline_draw yxview_function_draw yxview_iarrow_draw yxview_ilabels_draw yxview_normal_draw yxview_pcarrow_draw yxview_pcbarrow_draw yxview_pccapsym_draw yxview_pcscatter_draw yxview_pcspike_draw yxview_rarea_draw yxview_rbar_draw yxview_rbarm_draw yxview_rcap_draw yxview_rcapsym_draw yxview_rconnected_draw yxview_rline_draw yxview_rscatter_draw yxview_rspike_draw yxview_spike_draw yxview_sunflower_draw zap_s zinb zinb_llf zinb_plf zip zip_llf zip_p zip_plf zt_ct_5 zt_hc_5 zt_hcd_5 zt_is_5 zt_iss_5 zt_sho_5 zt_smp_5 ztbase_5 ztcox_5 ztdes_5 ztereg_5 ztfill_5 ztgen_5 ztir_5 ztjoin_5 ztnb ztnb_p ztp ztp_p zts_5 ztset_5 ztspli_5 ztsum_5 zttoct_5 ztvary_5 ztweib_5",
+contains:[{className:"symbol",begin:/`[a-zA-Z0-9_]+'/},{className:"variable",begin:/\$\{?[a-zA-Z0-9_]+\}?/},{className:"string",variants:[{begin:'`"[^\r\n]*?"\''},{begin:'"[^\r\n"]*"'}]},{className:"built_in",variants:[{begin:"\\b(abs|acos|asin|atan|atan2|atanh|ceil|cloglog|comb|cos|digamma|exp|floor|invcloglog|invlogit|ln|lnfact|lnfactorial|lngamma|log|log10|max|min|mod|reldif|round|sign|sin|sqrt|sum|tan|tanh|trigamma|trunc|betaden|Binomial|binorm|binormal|chi2|chi2tail|dgammapda|dgammapdada|dgammapdadx|dgammapdx|dgammapdxdx|F|Fden|Ftail|gammaden|gammap|ibeta|invbinomial|invchi2|invchi2tail|invF|invFtail|invgammap|invibeta|invnchi2|invnFtail|invnibeta|invnorm|invnormal|invttail|nbetaden|nchi2|nFden|nFtail|nibeta|norm|normal|normalden|normd|npnchi2|tden|ttail|uniform|abbrev|char|index|indexnot|length|lower|ltrim|match|plural|proper|real|regexm|regexr|regexs|reverse|rtrim|string|strlen|strlower|strltrim|strmatch|strofreal|strpos|strproper|strreverse|strrtrim|strtrim|strupper|subinstr|subinword|substr|trim|upper|word|wordcount|_caller|autocode|byteorder|chop|clip|cond|e|epsdouble|epsfloat|group|inlist|inrange|irecode|matrix|maxbyte|maxdouble|maxfloat|maxint|maxlong|mi|minbyte|mindouble|minfloat|minint|minlong|missing|r|recode|replay|return|s|scalar|d|date|day|dow|doy|halfyear|mdy|month|quarter|week|year|d|daily|dofd|dofh|dofm|dofq|dofw|dofy|h|halfyearly|hofd|m|mofd|monthly|q|qofd|quarterly|tin|twithin|w|weekly|wofd|y|yearly|yh|ym|yofd|yq|yw|cholesky|colnumb|colsof|corr|det|diag|diag0cnt|el|get|hadamard|I|inv|invsym|issym|issymmetric|J|matmissing|matuniform|mreldif|nullmat|rownumb|rowsof|sweep|syminv|trace|vec|vecdiag)(?=\\(|$)"}]},
+a.COMMENT("^[ \t]*\\*.*$",!1),a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE]}});b.registerLanguage("step21",function(a){return{aliases:["p21","step","stp"],case_insensitive:!0,lexemes:"[A-Z_][A-Z0-9_.]*",keywords:{keyword:"HEADER ENDSEC DATA"},contains:[{className:"meta",begin:"ISO-10303-21;",relevance:10},{className:"meta",begin:"END-ISO-10303-21;",relevance:10},a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,a.COMMENT("/\\*\\*!","\\*/"),a.C_NUMBER_MODE,a.inherit(a.APOS_STRING_MODE,{illegal:null}),a.inherit(a.QUOTE_STRING_MODE,
+{illegal:null}),{className:"string",begin:"'",end:"'"},{className:"symbol",variants:[{begin:"#",end:"\\d+",illegal:"\\W"}]}]}});b.registerLanguage("stylus",function(a){var b={className:"variable",begin:"\\$"+a.IDENT_RE},d={className:"number",begin:"#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})"};return{aliases:["styl"],case_insensitive:!1,keywords:"if else for in",illegal:"(\\?|(\\bReturn\\b)|(\\bEnd\\b)|(\\bend\\b)|(\\bdef\\b)|;|#\\s|\\*\\s|===\\s|\\||%)",contains:[a.QUOTE_STRING_MODE,a.APOS_STRING_MODE,a.C_LINE_COMMENT_MODE,
+a.C_BLOCK_COMMENT_MODE,d,{begin:"\\.[a-zA-Z][a-zA-Z0-9_-]*[\\.\\s\\n\\[\\:,]",returnBegin:!0,contains:[{className:"selector-class",begin:"\\.[a-zA-Z][a-zA-Z0-9_-]*"}]},{begin:"\\#[a-zA-Z][a-zA-Z0-9_-]*[\\.\\s\\n\\[\\:,]",returnBegin:!0,contains:[{className:"selector-id",begin:"\\#[a-zA-Z][a-zA-Z0-9_-]*"}]},{begin:"\\b(a|abbr|address|article|aside|audio|b|blockquote|body|button|canvas|caption|cite|code|dd|del|details|dfn|div|dl|dt|em|fieldset|figcaption|figure|footer|form|h1|h2|h3|h4|h5|h6|header|hgroup|html|i|iframe|img|input|ins|kbd|label|legend|li|mark|menu|nav|object|ol|p|q|quote|samp|section|span|strong|summary|sup|table|tbody|td|textarea|tfoot|th|thead|time|tr|ul|var|video)[\\.\\s\\n\\[\\:,]",
+returnBegin:!0,contains:[{className:"selector-tag",begin:"\\b[a-zA-Z][a-zA-Z0-9_-]*"}]},{begin:"&?:?:\\b(after|before|first-letter|first-line|active|first-child|focus|hover|lang|link|visited)[\\.\\s\\n\\[\\:,]"},{begin:"@(charset|css|debug|extend|font-face|for|import|include|media|mixin|page|warn|while)\\b"},b,a.CSS_NUMBER_MODE,a.NUMBER_MODE,{className:"function",begin:"^[a-zA-Z][a-zA-Z0-9_-]*\\(.*\\)",illegal:"[\\n]",returnBegin:!0,contains:[{className:"title",begin:"\\b[a-zA-Z][a-zA-Z0-9_-]*"},
+{className:"params",begin:/\(/,end:/\)/,contains:[d,b,a.APOS_STRING_MODE,a.CSS_NUMBER_MODE,a.NUMBER_MODE,a.QUOTE_STRING_MODE]}]},{className:"attribute",begin:"\\b("+"align-content align-items align-self animation animation-delay animation-direction animation-duration animation-fill-mode animation-iteration-count animation-name animation-play-state animation-timing-function auto backface-visibility background background-attachment background-clip background-color background-image background-origin background-position background-repeat background-size border border-bottom border-bottom-color border-bottom-left-radius border-bottom-right-radius border-bottom-style border-bottom-width border-collapse border-color border-image border-image-outset border-image-repeat border-image-slice border-image-source border-image-width border-left border-left-color border-left-style border-left-width border-radius border-right border-right-color border-right-style border-right-width border-spacing border-style border-top border-top-color border-top-left-radius border-top-right-radius border-top-style border-top-width border-width bottom box-decoration-break box-shadow box-sizing break-after break-before break-inside caption-side clear clip clip-path color column-count column-fill column-gap column-rule column-rule-color column-rule-style column-rule-width column-span column-width columns content counter-increment counter-reset cursor direction display empty-cells filter flex flex-basis flex-direction flex-flow flex-grow flex-shrink flex-wrap float font font-family font-feature-settings font-kerning font-language-override font-size font-size-adjust font-stretch font-style font-variant font-variant-ligatures font-weight height hyphens icon image-orientation image-rendering image-resolution ime-mode inherit initial justify-content left letter-spacing line-height list-style list-style-image list-style-position list-style-type margin margin-bottom margin-left margin-right margin-top marks mask max-height max-width min-height min-width nav-down nav-index nav-left nav-right nav-up none normal object-fit object-position opacity order orphans outline outline-color outline-offset outline-style outline-width overflow overflow-wrap overflow-x overflow-y padding padding-bottom padding-left padding-right padding-top page-break-after page-break-before page-break-inside perspective perspective-origin pointer-events position quotes resize right tab-size table-layout text-align text-align-last text-decoration text-decoration-color text-decoration-line text-decoration-style text-indent text-overflow text-rendering text-shadow text-transform text-underline-position top transform transform-origin transform-style transition transition-delay transition-duration transition-property transition-timing-function unicode-bidi vertical-align visibility white-space widows width word-break word-spacing word-wrap z-index".split(" ").reverse().join("|")+
+")\\b",starts:{end:/;|$/,contains:[d,b,a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,a.CSS_NUMBER_MODE,a.NUMBER_MODE,a.C_BLOCK_COMMENT_MODE],illegal:/\./,relevance:0}}]}});b.registerLanguage("subunit",function(a){return{case_insensitive:!0,contains:[{className:"string",begin:"\\[\n(multipart)?",end:"\\]\n"},{className:"string",begin:"\\d{4}-\\d{2}-\\d{2}(\\s+)\\d{2}:\\d{2}:\\d{2}.\\d+Z"},{className:"string",begin:"(\\+|-)\\d+"},{className:"keyword",relevance:10,variants:[{begin:"^(test|testing|success|successful|failure|error|skip|xfail|uxsuccess)(:?)\\s+(test)?"},
+{begin:"^progress(:?)(\\s+)?(pop|push)?"},{begin:"^tags:"},{begin:"^time:"}]}]}});b.registerLanguage("swift",function(a){var b={keyword:"#available #colorLiteral #column #else #elseif #endif #file #fileLiteral #function #if #imageLiteral #line #selector #sourceLocation _ __COLUMN__ __FILE__ __FUNCTION__ __LINE__ Any as as! as? associatedtype associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet",
 literal:"true false nil",built_in:"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip"},
-d=a.COMMENT("/\\*","\\*/",{contains:["self"]}),e={className:"subst",begin:/\\\(/,end:"\\)",keywords:b,contains:[]},c={className:"number",begin:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",relevance:0},g=a.inherit(a.QUOTE_STRING_MODE,{contains:[e,a.BACKSLASH_ESCAPE]});e.contains=[c];return{keywords:b,contains:[g,a.C_LINE_COMMENT_MODE,d,{className:"type",begin:"\\b[A-Z][\\w\u00c0-\u02b8']*",relevance:0},c,{className:"function",beginKeywords:"func",end:"{",
-excludeEnd:!0,contains:[a.inherit(a.TITLE_MODE,{begin:/[A-Za-z$_][0-9A-Za-z$_]*/}),{begin:/</,end:/>/},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:b,contains:["self",c,g,a.C_BLOCK_COMMENT_MODE,{begin:":"}],illegal:/["']/}],illegal:/\[|%/},{className:"class",beginKeywords:"struct protocol class extension enum",keywords:b,end:"\\{",excludeEnd:!0,contains:[a.inherit(a.TITLE_MODE,{begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/})]},{className:"meta",begin:"(@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain)"},
-{beginKeywords:"import",end:/$/,contains:[a.C_LINE_COMMENT_MODE,d]}]}});b.registerLanguage("typescript",function(a){var b={keyword:"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class public private protected get set super static implements enum export import declare type namespace abstract as from extends async await",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document any number boolean string void Promise"};
-return{aliases:["ts"],keywords:b,contains:[{className:"meta",begin:/^\s*['"]use strict['"]/},a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,{className:"string",begin:"`",end:"`",contains:[a.BACKSLASH_ESCAPE,{className:"subst",begin:"\\$\\{",end:"\\}"}]},a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,{className:"number",variants:[{begin:"\\b(0[bB][01]+)"},{begin:"\\b(0[oO][0-7]+)"},{begin:a.C_NUMBER_RE}],relevance:0},{begin:"("+a.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",
-contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,a.REGEXP_MODE,{className:"function",begin:"(\\(.*?\\)|"+a.IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:a.IDENT_RE},{begin:/\(\s*\)/},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:b,contains:["self",a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE]}]}]}],relevance:0},{className:"function",begin:"function",end:/[\{;]/,excludeEnd:!0,keywords:b,contains:["self",a.inherit(a.TITLE_MODE,{begin:/[A-Za-z$_][0-9A-Za-z$_]*/}),
-{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:b,contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE],illegal:/["'\(]/}],illegal:/%/,relevance:0},{beginKeywords:"constructor",end:/\{/,excludeEnd:!0,contains:["self",{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:b,contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE],illegal:/["'\(]/}]},{begin:/module\./,keywords:{built_in:"module"},relevance:0},{beginKeywords:"module",end:/\{/,excludeEnd:!0},
-{beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:"interface extends"},{begin:/\$[(.]/},{begin:"\\."+a.IDENT_RE,relevance:0},{className:"meta",begin:"@[A-Za-z]+"}]}});b.registerLanguage("yaml",function(a){var b={className:"attr",variants:[{begin:"^[ \\-]*[a-zA-Z_][\\w\\-]*:"},{begin:'^[ \\-]*"[a-zA-Z_][\\w\\-]*":'},{begin:"^[ \\-]*'[a-zA-Z_][\\w\\-]*':"}]},d={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[a.BACKSLASH_ESCAPE,{className:"template-variable",
-variants:[{begin:"{{",end:"}}"},{begin:"%{",end:"}"}]}]};return{case_insensitive:!0,aliases:["yml","YAML","yaml"],contains:[b,{className:"meta",begin:"^---s*$",relevance:10},{className:"string",begin:"[\\|>] *$",returnEnd:!0,contains:d.contains,end:b.variants[0].begin},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!!"+a.UNDERSCORE_IDENT_RE},{className:"meta",begin:"&"+a.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+
-a.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"^ *-",relevance:0},a.HASH_COMMENT_MODE,{beginKeywords:"true false yes no null",keywords:{literal:"true false yes no null"}},a.C_NUMBER_MODE,d]}});return b});
+d=a.COMMENT("/\\*","\\*/",{contains:["self"]}),e={className:"subst",begin:/\\\(/,end:"\\)",keywords:b,contains:[]},f={className:"string",contains:[a.BACKSLASH_ESCAPE,e],variants:[{begin:/"""/,end:/"""/},{begin:/"/,end:/"/}]},g={className:"number",begin:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",relevance:0};e.contains=[g];return{keywords:b,contains:[f,a.C_LINE_COMMENT_MODE,d,{className:"type",begin:"\\b[A-Z][\\w\u00c0-\u02b8']*[!?]"},{className:"type",
+begin:"\\b[A-Z][\\w\u00c0-\u02b8']*",relevance:0},g,{className:"function",beginKeywords:"func",end:"{",excludeEnd:!0,contains:[a.inherit(a.TITLE_MODE,{begin:/[A-Za-z$_][0-9A-Za-z$_]*/}),{begin:/</,end:/>/},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:b,contains:["self",g,f,a.C_BLOCK_COMMENT_MODE,{begin:":"}],illegal:/["']/}],illegal:/\[|%/},{className:"class",beginKeywords:"struct protocol class extension enum",keywords:b,end:"\\{",excludeEnd:!0,contains:[a.inherit(a.TITLE_MODE,
+{begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/})]},{className:"meta",begin:"(@discardableResult|@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@objcMembers|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain)"},{beginKeywords:"import",end:/$/,contains:[a.C_LINE_COMMENT_MODE,d]}]}});b.registerLanguage("taggerscript",function(a){return{contains:[{className:"comment",
+begin:/\$noop\(/,end:/\)/,contains:[{begin:/\(/,end:/\)/,contains:["self",{begin:/\\./}]}],relevance:10},{className:"keyword",begin:/\$(?!noop)[a-zA-Z][_a-zA-Z0-9]*/,end:/\(/,excludeEnd:!0},{className:"variable",begin:/%[_a-zA-Z0-9:]*/,end:"%"},{className:"symbol",begin:/\\./}]}});b.registerLanguage("yaml",function(a){var b={className:"attr",variants:[{begin:"^[ \\-]*[a-zA-Z_][\\w\\-]*:"},{begin:'^[ \\-]*"[a-zA-Z_][\\w\\-]*":'},{begin:"^[ \\-]*'[a-zA-Z_][\\w\\-]*':"}]},d={className:"string",relevance:0,
+variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[a.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:"{{",end:"}}"},{begin:"%{",end:"}"}]}]};return{case_insensitive:!0,aliases:["yml","YAML","yaml"],contains:[b,{className:"meta",begin:"^---s*$",relevance:10},{className:"string",begin:"[\\|>] *$",returnEnd:!0,contains:d.contains,end:b.variants[0].begin},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",
+begin:"!"+a.UNDERSCORE_IDENT_RE},{className:"type",begin:"!!"+a.UNDERSCORE_IDENT_RE},{className:"meta",begin:"&"+a.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+a.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"^ *-",relevance:0},a.HASH_COMMENT_MODE,{beginKeywords:"true false yes no null",keywords:{literal:"true false yes no null"}},a.C_NUMBER_MODE,d]}});b.registerLanguage("tap",function(a){return{case_insensitive:!0,contains:[a.HASH_COMMENT_MODE,{className:"meta",variants:[{begin:"^TAP version (\\d+)$"},
+{begin:"^1\\.\\.(\\d+)$"}]},{begin:"(s+)?---$",end:"\\.\\.\\.$",subLanguage:"yaml",relevance:0},{className:"number",begin:" (\\d+) "},{className:"symbol",variants:[{begin:"^ok"},{begin:"^not ok"}]}]}});b.registerLanguage("tcl",function(a){return{aliases:["tk"],keywords:"after append apply array auto_execok auto_import auto_load auto_mkindex auto_mkindex_old auto_qualify auto_reset bgerror binary break catch cd chan clock close concat continue dde dict encoding eof error eval exec exit expr fblocked fconfigure fcopy file fileevent filename flush for foreach format gets glob global history http if incr info interp join lappend|10 lassign|10 lindex|10 linsert|10 list llength|10 load lrange|10 lrepeat|10 lreplace|10 lreverse|10 lsearch|10 lset|10 lsort|10 mathfunc mathop memory msgcat namespace open package parray pid pkg::create pkg_mkIndex platform platform::shell proc puts pwd read refchan regexp registry regsub|10 rename return safe scan seek set socket source split string subst switch tcl_endOfWord tcl_findLibrary tcl_startOfNextWord tcl_startOfPreviousWord tcl_wordBreakAfter tcl_wordBreakBefore tcltest tclvars tell time tm trace unknown unload unset update uplevel upvar variable vwait while",
+contains:[a.COMMENT(";[ \\t]*#","$"),a.COMMENT("^[ \\t]*#","$"),{beginKeywords:"proc",end:"[\\{]",excludeEnd:!0,contains:[{className:"title",begin:"[ \\t\\n\\r]+(::)?[a-zA-Z_]((::)?[a-zA-Z0-9_])*",end:"[ \\t\\n\\r]",endsWithParent:!0,excludeEnd:!0}]},{excludeEnd:!0,variants:[{begin:"\\$(\\{)?(::)?[a-zA-Z_]((::)?[a-zA-Z0-9_])*\\(([a-zA-Z0-9_])*\\)",end:"[^a-zA-Z0-9_\\}\\$]"},{begin:"\\$(\\{)?(::)?[a-zA-Z_]((::)?[a-zA-Z0-9_])*",end:"(\\))?[^a-zA-Z0-9_\\}\\$]"}]},{className:"string",contains:[a.BACKSLASH_ESCAPE],
+variants:[a.inherit(a.APOS_STRING_MODE,{illegal:null}),a.inherit(a.QUOTE_STRING_MODE,{illegal:null})]},{className:"number",variants:[a.BINARY_NUMBER_MODE,a.C_NUMBER_MODE]}]}});b.registerLanguage("tex",function(a){var b={className:"tag",begin:/\\/,relevance:0,contains:[{className:"name",variants:[{begin:/[a-zA-Z\u0430-\u044f\u0410-\u042f]+[*]?/},{begin:/[^a-zA-Z\u0430-\u044f\u0410-\u042f0-9]/}],starts:{endsWithParent:!0,relevance:0,contains:[{className:"string",variants:[{begin:/\[/,end:/\]/},{begin:/\{/,
+end:/\}/}]},{begin:/\s*=\s*/,endsWithParent:!0,relevance:0,contains:[{className:"number",begin:/-?\d*\.?\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?/}]}]}}]};return{contains:[b,{className:"formula",contains:[b],relevance:0,variants:[{begin:/\$\$/,end:/\$\$/},{begin:/\$/,end:/\$/}]},a.COMMENT("%","$",{relevance:0})]}});b.registerLanguage("thrift",function(a){return{keywords:{keyword:"namespace const typedef struct enum service exception void oneway set list map required optional",built_in:"bool byte i16 i32 i64 double string binary",
+literal:"true false"},contains:[a.QUOTE_STRING_MODE,a.NUMBER_MODE,a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,{className:"class",beginKeywords:"struct enum service exception",end:/\{/,illegal:/\n/,contains:[a.inherit(a.TITLE_MODE,{starts:{endsWithParent:!0,excludeEnd:!0}})]},{begin:"\\b(set|list|map)\\s*<",end:">",keywords:"bool byte i16 i32 i64 double string binary",contains:["self"]}]}});b.registerLanguage("tp",function(a){var b={className:"number",begin:"[1-9][0-9]*",relevance:0},d={className:"symbol",
+begin:":[^\\]]+"};return{keywords:{keyword:"ABORT ACC ADJUST AND AP_LD BREAK CALL CNT COL CONDITION CONFIG DA DB DIV DETECT ELSE END ENDFOR ERR_NUM ERROR_PROG FINE FOR GP GUARD INC IF JMP LINEAR_MAX_SPEED LOCK MOD MONITOR OFFSET Offset OR OVERRIDE PAUSE PREG PTH RT_LD RUN SELECT SKIP Skip TA TB TO TOOL_OFFSET Tool_Offset UF UT UFRAME_NUM UTOOL_NUM UNLOCK WAIT X Y Z W P R STRLEN SUBSTR FINDSTR VOFFSET PROG ATTR MN POS",literal:"ON OFF max_speed LPOS JPOS ENABLE DISABLE START STOP RESET"},contains:[{className:"built_in",
+begin:"(AR|P|PAYLOAD|PR|R|SR|RSR|LBL|VR|UALM|MESSAGE|UTOOL|UFRAME|TIMER|TIMER_OVERFLOW|JOINT_MAX_SPEED|RESUME_PROG|DIAG_REC)\\[",end:"\\]",contains:["self",b,d]},{className:"built_in",begin:"(AI|AO|DI|DO|F|RI|RO|UI|UO|GI|GO|SI|SO)\\[",end:"\\]",contains:["self",b,a.QUOTE_STRING_MODE,d]},{className:"keyword",begin:"/(PROG|ATTR|MN|POS|END)\\b"},{className:"keyword",begin:"(CALL|RUN|POINT_LOGIC|LBL)\\b"},{className:"keyword",begin:"\\b(ACC|CNT|Skip|Offset|PSPD|RT_LD|AP_LD|Tool_Offset)"},{className:"number",
+begin:"\\d+(sec|msec|mm/sec|cm/min|inch/min|deg/sec|mm|in|cm)?\\b",relevance:0},a.COMMENT("//","[;$]"),a.COMMENT("!","[;$]"),a.COMMENT("--eg:","$"),a.QUOTE_STRING_MODE,{className:"string",begin:"'",end:"'"},a.C_NUMBER_MODE,{className:"variable",begin:"\\$[A-Za-z0-9_]+"}]}});b.registerLanguage("twig",function(a){var b={beginKeywords:"attribute block constant cycle date dump include max min parent random range source template_from_string",keywords:{name:"attribute block constant cycle date dump include max min parent random range source template_from_string"},
+relevance:0,contains:[{className:"params",begin:"\\(",end:"\\)"}]},d={begin:/\|[A-Za-z_]+:?/,keywords:"abs batch capitalize convert_encoding date date_modify default escape first format join json_encode keys last length lower merge nl2br number_format raw replace reverse round slice sort split striptags title trim upper url_encode",contains:[b]},e="autoescape block do embed extends filter flush for if import include macro sandbox set spaceless use verbatim";e=e+" "+e.split(" ").map(function(a){return"end"+
+a}).join(" ");return{aliases:["craftcms"],case_insensitive:!0,subLanguage:"xml",contains:[a.COMMENT(/\{#/,/#}/),{className:"template-tag",begin:/\{%/,end:/%}/,contains:[{className:"name",begin:/\w+/,keywords:e,starts:{endsWithParent:!0,contains:[d,b],relevance:0}}]},{className:"template-variable",begin:/\{\{/,end:/}}/,contains:["self",d,b]}]}});b.registerLanguage("typescript",function(a){var b={keyword:"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class public private protected get set super static implements enum export import declare type namespace abstract as from extends async await",
+literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document any number boolean string void Promise"},
+d={className:"meta",begin:"@[A-Za-z$_][0-9A-Za-z$_]*"},e={begin:"\\(",end:/\)/,keywords:b,contains:["self",a.QUOTE_STRING_MODE,a.APOS_STRING_MODE,a.NUMBER_MODE]},f={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:b,contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,d,e]};return{aliases:["ts"],keywords:b,contains:[{className:"meta",begin:/^\s*['"]use strict['"]/},a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,{className:"string",begin:"`",end:"`",contains:[a.BACKSLASH_ESCAPE,
+{className:"subst",begin:"\\$\\{",end:"\\}"}]},a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,{className:"number",variants:[{begin:"\\b(0[bB][01]+)"},{begin:"\\b(0[oO][0-7]+)"},{begin:a.C_NUMBER_RE}],relevance:0},{begin:"("+a.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,a.REGEXP_MODE,{className:"function",begin:"(\\(.*?\\)|"+a.IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:a.IDENT_RE},
+{begin:/\(\s*\)/},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:b,contains:["self",a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE]}]}]}],relevance:0},{className:"function",begin:"function",end:/[\{;]/,excludeEnd:!0,keywords:b,contains:["self",a.inherit(a.TITLE_MODE,{begin:"[A-Za-z$_][0-9A-Za-z$_]*"}),f],illegal:/%/,relevance:0},{beginKeywords:"constructor",end:/\{/,excludeEnd:!0,contains:["self",f]},{begin:/module\./,keywords:{built_in:"module"},relevance:0},{beginKeywords:"module",end:/\{/,
+excludeEnd:!0},{beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:"interface extends"},{begin:/\$[(.]/},{begin:"\\."+a.IDENT_RE,relevance:0},d,e]}});b.registerLanguage("vala",function(a){return{keywords:{keyword:"char uchar unichar int uint long ulong short ushort int8 int16 int32 int64 uint8 uint16 uint32 uint64 float double bool struct enum string void weak unowned owned async signal static abstract interface override virtual delegate if while do for foreach else switch case break default return try catch public private protected internal using new this get set const stdout stdin stderr var",
+built_in:"DBus GLib CCode Gee Object Gtk Posix",literal:"false true null"},contains:[{className:"class",beginKeywords:"class interface namespace",end:"{",excludeEnd:!0,illegal:"[^,:\\n\\s\\.]",contains:[a.UNDERSCORE_TITLE_MODE]},a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,{className:"string",begin:'"""',end:'"""',relevance:5},a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,a.C_NUMBER_MODE,{className:"meta",begin:"^#",end:"$",relevance:2}]}});b.registerLanguage("vbnet",function(a){return{aliases:["vb"],case_insensitive:!0,
+keywords:{keyword:"addhandler addressof alias and andalso aggregate ansi as assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into is isfalse isnot istrue join key let lib like loop me mid mod module mustinherit mustoverride mybase myclass namespace narrowing new next not notinheritable notoverridable of off on operator option optional or order orelse overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim rem removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly xor",
+built_in:"boolean byte cbool cbyte cchar cdate cdec cdbl char cint clng cobj csbyte cshort csng cstr ctype date decimal directcast double gettype getxmlnamespace iif integer long object sbyte short single string trycast typeof uinteger ulong ushort",literal:"true false nothing"},illegal:"//|{|}|endif|gosub|variant|wend|^\\$ ",contains:[a.inherit(a.QUOTE_STRING_MODE,{contains:[{begin:'""'}]}),a.COMMENT("'","$",{returnBegin:!0,contains:[{className:"doctag",begin:"'''|\x3c!--|--\x3e",contains:[a.PHRASAL_WORDS_MODE]},
+{className:"doctag",begin:"</?",end:">",contains:[a.PHRASAL_WORDS_MODE]}]}),a.C_NUMBER_MODE,{className:"meta",begin:"#",end:"$",keywords:{"meta-keyword":"if else elseif end region externalsource"}}]}});b.registerLanguage("vbscript",function(a){return{aliases:["vbs"],case_insensitive:!0,keywords:{keyword:"call class const dim do loop erase execute executeglobal exit for each next function if then else on error option explicit new private property let get public randomize redim rem select case set stop sub while wend with end to elseif is or xor and not class_initialize class_terminate default preserve in me byval byref step resume goto",
+built_in:"lcase month vartype instrrev ubound setlocale getobject rgb getref string weekdayname rnd dateadd monthname now day minute isarray cbool round formatcurrency conversions csng timevalue second year space abs clng timeserial fixs len asc isempty maths dateserial atn timer isobject filter weekday datevalue ccur isdate instr datediff formatdatetime replace isnull right sgn array snumeric log cdbl hex chr lbound msgbox ucase getlocale cos cdate cbyte rtrim join hour oct typename trim strcomp int createobject loadpicture tan formatnumber mid scriptenginebuildversion scriptengine split scriptengineminorversion cint sin datepart ltrim sqr scriptenginemajorversion time derived eval date formatpercent exp inputbox left ascw chrw regexp server response request cstr err",
+literal:"true false null nothing empty"},illegal:"//",contains:[a.inherit(a.QUOTE_STRING_MODE,{contains:[{begin:'""'}]}),a.COMMENT(/'/,/$/,{relevance:0}),a.C_NUMBER_MODE]}});b.registerLanguage("vbscript-html",function(a){return{subLanguage:"xml",contains:[{begin:"<%",end:"%>",subLanguage:"vbscript"}]}});b.registerLanguage("verilog",function(a){return{aliases:["v","sv","svh"],case_insensitive:!1,keywords:{keyword:"accept_on alias always always_comb always_ff always_latch and assert assign assume automatic before begin bind bins binsof bit break buf|0 bufif0 bufif1 byte case casex casez cell chandle checker class clocking cmos config const constraint context continue cover covergroup coverpoint cross deassign default defparam design disable dist do edge else end endcase endchecker endclass endclocking endconfig endfunction endgenerate endgroup endinterface endmodule endpackage endprimitive endprogram endproperty endspecify endsequence endtable endtask enum event eventually expect export extends extern final first_match for force foreach forever fork forkjoin function generate|5 genvar global highz0 highz1 if iff ifnone ignore_bins illegal_bins implements implies import incdir include initial inout input inside instance int integer interconnect interface intersect join join_any join_none large let liblist library local localparam logic longint macromodule matches medium modport module nand negedge nettype new nexttime nmos nor noshowcancelled not notif0 notif1 or output package packed parameter pmos posedge primitive priority program property protected pull0 pull1 pulldown pullup pulsestyle_ondetect pulsestyle_onevent pure rand randc randcase randsequence rcmos real realtime ref reg reject_on release repeat restrict return rnmos rpmos rtran rtranif0 rtranif1 s_always s_eventually s_nexttime s_until s_until_with scalared sequence shortint shortreal showcancelled signed small soft solve specify specparam static string strong strong0 strong1 struct super supply0 supply1 sync_accept_on sync_reject_on table tagged task this throughout time timeprecision timeunit tran tranif0 tranif1 tri tri0 tri1 triand trior trireg type typedef union unique unique0 unsigned until until_with untyped use uwire var vectored virtual void wait wait_order wand weak weak0 weak1 while wildcard wire with within wor xnor xor",
+literal:"null",built_in:"$finish $stop $exit $fatal $error $warning $info $realtime $time $printtimescale $bitstoreal $bitstoshortreal $itor $signed $cast $bits $stime $timeformat $realtobits $shortrealtobits $rtoi $unsigned $asserton $assertkill $assertpasson $assertfailon $assertnonvacuouson $assertoff $assertcontrol $assertpassoff $assertfailoff $assertvacuousoff $isunbounded $sampled $fell $changed $past_gclk $fell_gclk $changed_gclk $rising_gclk $steady_gclk $coverage_control $coverage_get $coverage_save $set_coverage_db_name $rose $stable $past $rose_gclk $stable_gclk $future_gclk $falling_gclk $changing_gclk $display $coverage_get_max $coverage_merge $get_coverage $load_coverage_db $typename $unpacked_dimensions $left $low $increment $clog2 $ln $log10 $exp $sqrt $pow $floor $ceil $sin $cos $tan $countbits $onehot $isunknown $fatal $warning $dimensions $right $high $size $asin $acos $atan $atan2 $hypot $sinh $cosh $tanh $asinh $acosh $atanh $countones $onehot0 $error $info $random $dist_chi_square $dist_erlang $dist_exponential $dist_normal $dist_poisson $dist_t $dist_uniform $q_initialize $q_remove $q_exam $async$and$array $async$nand$array $async$or$array $async$nor$array $sync$and$array $sync$nand$array $sync$or$array $sync$nor$array $q_add $q_full $psprintf $async$and$plane $async$nand$plane $async$or$plane $async$nor$plane $sync$and$plane $sync$nand$plane $sync$or$plane $sync$nor$plane $system $display $displayb $displayh $displayo $strobe $strobeb $strobeh $strobeo $write $readmemb $readmemh $writememh $value$plusargs $dumpvars $dumpon $dumplimit $dumpports $dumpportson $dumpportslimit $writeb $writeh $writeo $monitor $monitorb $monitorh $monitoro $writememb $dumpfile $dumpoff $dumpall $dumpflush $dumpportsoff $dumpportsall $dumpportsflush $fclose $fdisplay $fdisplayb $fdisplayh $fdisplayo $fstrobe $fstrobeb $fstrobeh $fstrobeo $swrite $swriteb $swriteh $swriteo $fscanf $fread $fseek $fflush $feof $fopen $fwrite $fwriteb $fwriteh $fwriteo $fmonitor $fmonitorb $fmonitorh $fmonitoro $sformat $sformatf $fgetc $ungetc $fgets $sscanf $rewind $ftell $ferror"},
+lexemes:/[\w\$]+/,contains:[a.C_BLOCK_COMMENT_MODE,a.C_LINE_COMMENT_MODE,a.QUOTE_STRING_MODE,{className:"number",contains:[a.BACKSLASH_ESCAPE],variants:[{begin:"\\b((\\d+'(b|h|o|d|B|H|O|D))[0-9xzXZa-fA-F_]+)"},{begin:"\\B(('(b|h|o|d|B|H|O|D))[0-9xzXZa-fA-F_]+)"},{begin:"\\b([0-9_])+",relevance:0}]},{className:"variable",variants:[{begin:"#\\((?!parameter).+\\)"},{begin:"\\.\\w+",relevance:0}]},{className:"meta",begin:"`",end:"$",keywords:{"meta-keyword":"define __FILE__ __LINE__ begin_keywords celldefine default_nettype define else elsif end_keywords endcelldefine endif ifdef ifndef include line nounconnected_drive pragma resetall timescale unconnected_drive undef undefineall"},
+relevance:0}]}});b.registerLanguage("vhdl",function(a){return{case_insensitive:!0,keywords:{keyword:"abs access after alias all and architecture array assert assume assume_guarantee attribute begin block body buffer bus case component configuration constant context cover disconnect downto default else elsif end entity exit fairness file for force function generate generic group guarded if impure in inertial inout is label library linkage literal loop map mod nand new next nor not null of on open or others out package parameter port postponed procedure process property protected pure range record register reject release rem report restrict restrict_guarantee return rol ror select sequence severity shared signal sla sll sra srl strong subtype then to transport type unaffected units until use variable view vmode vprop vunit wait when while with xnor xor",
+built_in:"boolean bit character integer time delay_length natural positive string bit_vector file_open_kind file_open_status std_logic std_logic_vector unsigned signed boolean_vector integer_vector std_ulogic std_ulogic_vector unresolved_unsigned u_unsigned unresolved_signed u_signed real_vector time_vector",literal:"false true note warning error failure line text side width"},illegal:"{",contains:[a.C_BLOCK_COMMENT_MODE,a.COMMENT("--","$"),a.QUOTE_STRING_MODE,{className:"number",begin:"\\b(\\d(_|\\d)*#\\w+(\\.\\w+)?#([eE][-+]?\\d(_|\\d)*)?|\\d(_|\\d)*(\\.\\d(_|\\d)*)?([eE][-+]?\\d(_|\\d)*)?)",
+relevance:0},{className:"string",begin:"'(U|X|0|1|Z|W|L|H|-)'",contains:[a.BACKSLASH_ESCAPE]},{className:"symbol",begin:"'[A-Za-z](_?[A-Za-z0-9])*",contains:[a.BACKSLASH_ESCAPE]}]}});b.registerLanguage("vim",function(a){return{lexemes:/[!#@\w]+/,keywords:{keyword:"N|0 P|0 X|0 a|0 ab abc abo al am an|0 ar arga argd arge argdo argg argl argu as au aug aun b|0 bN ba bad bd be bel bf bl bm bn bo bp br brea breaka breakd breakl bro bufdo buffers bun bw c|0 cN cNf ca cabc caddb cad caddf cal cat cb cc ccl cd ce cex cf cfir cgetb cgete cg changes chd che checkt cl cla clo cm cmapc cme cn cnew cnf cno cnorea cnoreme co col colo com comc comp con conf cope cp cpf cq cr cs cst cu cuna cunme cw delm deb debugg delc delf dif diffg diffo diffp diffpu diffs diffthis dig di dl dell dj dli do doautoa dp dr ds dsp e|0 ea ec echoe echoh echom echon el elsei em en endfo endf endt endw ene ex exe exi exu f|0 files filet fin fina fini fir fix fo foldc foldd folddoc foldo for fu go gr grepa gu gv ha helpf helpg helpt hi hid his ia iabc if ij il im imapc ime ino inorea inoreme int is isp iu iuna iunme j|0 ju k|0 keepa kee keepj lN lNf l|0 lad laddb laddf la lan lat lb lc lch lcl lcs le lefta let lex lf lfir lgetb lgete lg lgr lgrepa lh ll lla lli lmak lm lmapc lne lnew lnf ln loadk lo loc lockv lol lope lp lpf lr ls lt lu lua luad luaf lv lvimgrepa lw m|0 ma mak map mapc marks mat me menut mes mk mks mksp mkv mkvie mod mz mzf nbc nb nbs new nm nmapc nme nn nnoreme noa no noh norea noreme norm nu nun nunme ol o|0 om omapc ome on ono onoreme opt ou ounme ow p|0 profd prof pro promptr pc ped pe perld po popu pp pre prev ps pt ptN ptf ptj ptl ptn ptp ptr pts pu pw py3 python3 py3d py3f py pyd pyf quita qa rec red redi redr redraws reg res ret retu rew ri rightb rub rubyd rubyf rund ru rv sN san sa sal sav sb sbN sba sbf sbl sbm sbn sbp sbr scrip scripte scs se setf setg setl sf sfir sh sim sig sil sl sla sm smap smapc sme sn sni sno snor snoreme sor so spelld spe spelli spellr spellu spellw sp spr sre st sta startg startr star stopi stj sts sun sunm sunme sus sv sw sy synti sync tN tabN tabc tabdo tabe tabf tabfir tabl tabm tabnew tabn tabo tabp tabr tabs tab ta tags tc tcld tclf te tf th tj tl tm tn to tp tr try ts tu u|0 undoj undol una unh unl unlo unm unme uns up ve verb vert vim vimgrepa vi viu vie vm vmapc vme vne vn vnoreme vs vu vunme windo w|0 wN wa wh wi winc winp wn wp wq wqa ws wu wv x|0 xa xmapc xm xme xn xnoreme xu xunme y|0 z|0 ~ Next Print append abbreviate abclear aboveleft all amenu anoremenu args argadd argdelete argedit argglobal arglocal argument ascii autocmd augroup aunmenu buffer bNext ball badd bdelete behave belowright bfirst blast bmodified bnext botright bprevious brewind break breakadd breakdel breaklist browse bunload bwipeout change cNext cNfile cabbrev cabclear caddbuffer caddexpr caddfile call catch cbuffer cclose center cexpr cfile cfirst cgetbuffer cgetexpr cgetfile chdir checkpath checktime clist clast close cmap cmapclear cmenu cnext cnewer cnfile cnoremap cnoreabbrev cnoremenu copy colder colorscheme command comclear compiler continue confirm copen cprevious cpfile cquit crewind cscope cstag cunmap cunabbrev cunmenu cwindow delete delmarks debug debuggreedy delcommand delfunction diffupdate diffget diffoff diffpatch diffput diffsplit digraphs display deletel djump dlist doautocmd doautoall deletep drop dsearch dsplit edit earlier echo echoerr echohl echomsg else elseif emenu endif endfor endfunction endtry endwhile enew execute exit exusage file filetype find finally finish first fixdel fold foldclose folddoopen folddoclosed foldopen function global goto grep grepadd gui gvim hardcopy help helpfind helpgrep helptags highlight hide history insert iabbrev iabclear ijump ilist imap imapclear imenu inoremap inoreabbrev inoremenu intro isearch isplit iunmap iunabbrev iunmenu join jumps keepalt keepmarks keepjumps lNext lNfile list laddexpr laddbuffer laddfile last language later lbuffer lcd lchdir lclose lcscope left leftabove lexpr lfile lfirst lgetbuffer lgetexpr lgetfile lgrep lgrepadd lhelpgrep llast llist lmake lmap lmapclear lnext lnewer lnfile lnoremap loadkeymap loadview lockmarks lockvar lolder lopen lprevious lpfile lrewind ltag lunmap luado luafile lvimgrep lvimgrepadd lwindow move mark make mapclear match menu menutranslate messages mkexrc mksession mkspell mkvimrc mkview mode mzscheme mzfile nbclose nbkey nbsart next nmap nmapclear nmenu nnoremap nnoremenu noautocmd noremap nohlsearch noreabbrev noremenu normal number nunmap nunmenu oldfiles open omap omapclear omenu only onoremap onoremenu options ounmap ounmenu ownsyntax print profdel profile promptfind promptrepl pclose pedit perl perldo pop popup ppop preserve previous psearch ptag ptNext ptfirst ptjump ptlast ptnext ptprevious ptrewind ptselect put pwd py3do py3file python pydo pyfile quit quitall qall read recover redo redir redraw redrawstatus registers resize retab return rewind right rightbelow ruby rubydo rubyfile rundo runtime rviminfo substitute sNext sandbox sargument sall saveas sbuffer sbNext sball sbfirst sblast sbmodified sbnext sbprevious sbrewind scriptnames scriptencoding scscope set setfiletype setglobal setlocal sfind sfirst shell simalt sign silent sleep slast smagic smapclear smenu snext sniff snomagic snoremap snoremenu sort source spelldump spellgood spellinfo spellrepall spellundo spellwrong split sprevious srewind stop stag startgreplace startreplace startinsert stopinsert stjump stselect sunhide sunmap sunmenu suspend sview swapname syntax syntime syncbind tNext tabNext tabclose tabedit tabfind tabfirst tablast tabmove tabnext tabonly tabprevious tabrewind tag tcl tcldo tclfile tearoff tfirst throw tjump tlast tmenu tnext topleft tprevious trewind tselect tunmenu undo undojoin undolist unabbreviate unhide unlet unlockvar unmap unmenu unsilent update vglobal version verbose vertical vimgrep vimgrepadd visual viusage view vmap vmapclear vmenu vnew vnoremap vnoremenu vsplit vunmap vunmenu write wNext wall while winsize wincmd winpos wnext wprevious wqall wsverb wundo wviminfo xit xall xmapclear xmap xmenu xnoremap xnoremenu xunmap xunmenu yank",
+built_in:"synIDtrans atan2 range matcharg did_filetype asin feedkeys xor argv complete_check add getwinposx getqflist getwinposy screencol clearmatches empty extend getcmdpos mzeval garbagecollect setreg ceil sqrt diff_hlID inputsecret get getfperm getpid filewritable shiftwidth max sinh isdirectory synID system inputrestore winline atan visualmode inputlist tabpagewinnr round getregtype mapcheck hasmapto histdel argidx findfile sha256 exists toupper getcmdline taglist string getmatches bufnr strftime winwidth bufexists strtrans tabpagebuflist setcmdpos remote_read printf setloclist getpos getline bufwinnr float2nr len getcmdtype diff_filler luaeval resolve libcallnr foldclosedend reverse filter has_key bufname str2float strlen setline getcharmod setbufvar index searchpos shellescape undofile foldclosed setqflist buflisted strchars str2nr virtcol floor remove undotree remote_expr winheight gettabwinvar reltime cursor tabpagenr finddir localtime acos getloclist search tanh matchend rename gettabvar strdisplaywidth type abs py3eval setwinvar tolower wildmenumode log10 spellsuggest bufloaded synconcealed nextnonblank server2client complete settabwinvar executable input wincol setmatches getftype hlID inputsave searchpair or screenrow line settabvar histadd deepcopy strpart remote_peek and eval getftime submatch screenchar winsaveview matchadd mkdir screenattr getfontname libcall reltimestr getfsize winnr invert pow getbufline byte2line soundfold repeat fnameescape tagfiles sin strwidth spellbadword trunc maparg log lispindent hostname setpos globpath remote_foreground getchar synIDattr fnamemodify cscope_connection stridx winbufnr indent min complete_add nr2char searchpairpos inputdialog values matchlist items hlexists strridx browsedir expand fmod pathshorten line2byte argc count getwinvar glob foldtextresult getreg foreground cosh matchdelete has char2nr simplify histget searchdecl iconv winrestcmd pumvisible writefile foldlevel haslocaldir keys cos matchstr foldtext histnr tan tempname getcwd byteidx getbufvar islocked escape eventhandler remote_send serverlist winrestview synstack pyeval prevnonblank readfile cindent filereadable changenr exp"},
+illegal:/;/,contains:[a.NUMBER_MODE,{className:"string",begin:"'",end:"'",illegal:"\\n"},{className:"string",begin:/"(\\"|\n\\|[^"\n])*"/},a.COMMENT('"',"$"),{className:"variable",begin:/[bwtglsav]:[\w\d_]*/},{className:"function",beginKeywords:"function function!",end:"$",relevance:0,contains:[a.TITLE_MODE,{className:"params",begin:"\\(",end:"\\)"}]},{className:"symbol",begin:/<[\w-]+>/}]}});b.registerLanguage("x86asm",function(a){return{case_insensitive:!0,lexemes:"[.%]?"+a.IDENT_RE,keywords:{keyword:"lock rep repe repz repne repnz xaquire xrelease bnd nobnd aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63",
+built_in:"ip eip rip al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 cs ds es fs gs ss st st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0  xmm1  xmm2  xmm3  xmm4  xmm5  xmm6  xmm7  xmm8  xmm9 xmm10  xmm11 xmm12 xmm13 xmm14 xmm15 xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ymm0  ymm1  ymm2  ymm3  ymm4  ymm5  ymm6  ymm7  ymm8  ymm9 ymm10  ymm11 ymm12 ymm13 ymm14 ymm15 ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 zmm0  zmm1  zmm2  zmm3  zmm4  zmm5  zmm6  zmm7  zmm8  zmm9 zmm10  zmm11 zmm12 zmm13 zmm14 zmm15 zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 k0 k1 k2 k3 k4 k5 k6 k7 bnd0 bnd1 bnd2 bnd3 cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d r0h r1h r2h r3h r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l db dw dd dq dt ddq do dy dz resb resw resd resq rest resdq reso resy resz incbin equ times byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr",
+meta:"%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif %if %ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep %endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment .nolist __FILE__ __LINE__ __SECT__  __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ __UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__  __PASS__ struc endstruc istruc at iend align alignb sectalign daz nodaz up down zero default option assume public bits use16 use32 use64 default section segment absolute extern global common cpu float __utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ __Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__"},
+contains:[a.COMMENT(";","$",{relevance:0}),{className:"number",variants:[{begin:"\\b(?:([0-9][0-9_]*)?\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\b",relevance:0},{begin:"\\$[0-9][0-9A-Fa-f]*",relevance:0},{begin:"\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[Hh]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\b"},{begin:"\\b(?:0[Xx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\b"}]},a.QUOTE_STRING_MODE,{className:"string",variants:[{begin:"'",
+end:"[^\\\\]'"},{begin:"`",end:"[^\\\\]`"}],relevance:0},{className:"symbol",variants:[{begin:"^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)"},{begin:"^\\s*%%[A-Za-z0-9_$#@~.?]*:"}],relevance:0},{className:"subst",begin:"%[0-9]+",relevance:0},{className:"subst",begin:"%!S+",relevance:0},{className:"meta",begin:/^\s*\.[\w_-]+/}]}});b.registerLanguage("xl",function(a){var b={keyword:"if then else do while until for loop import with is as where when by data constant integer real text name boolean symbol infix prefix postfix block tree",
+literal:"true false nil",built_in:"in mod rem and or xor not abs sign floor ceil sqrt sin cos tan asin acos atan exp expm1 log log2 log10 log1p pi at text_length text_range text_find text_replace contains page slide basic_slide title_slide title subtitle fade_in fade_out fade_at clear_color color line_color line_width texture_wrap texture_transform texture scale_?x scale_?y scale_?z? translate_?x translate_?y translate_?z? rotate_?x rotate_?y rotate_?z? rectangle circle ellipse sphere path line_to move_to quad_to curve_to theme background contents locally time mouse_?x mouse_?y mouse_buttons ObjectLoader Animate MovieCredits Slides Filters Shading Materials LensFlare Mapping VLCAudioVideo StereoDecoder PointCloud NetworkAccess RemoteControl RegExp ChromaKey Snowfall NodeJS Speech Charts"},
+d={className:"string",begin:'"',end:'"',illegal:"\\n"},e={beginKeywords:"import",end:"$",keywords:b,contains:[d]},f={className:"function",begin:/[a-z][^\n]*->/,returnBegin:!0,end:/->/,contains:[a.inherit(a.TITLE_MODE,{starts:{endsWithParent:!0,keywords:b}})]};return{aliases:["tao"],lexemes:/[a-zA-Z][a-zA-Z0-9_?]*/,keywords:b,contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,d,{className:"string",begin:"'",end:"'",illegal:"\\n"},{className:"string",begin:"<<",end:">>"},f,e,{className:"number",
+begin:"[0-9]+#[0-9A-Z_]+(\\.[0-9-A-Z_]+)?#?([Ee][+-]?[0-9]+)?"},a.NUMBER_MODE]}});b.registerLanguage("xquery",function(a){return{aliases:["xpath","xq"],case_insensitive:!1,lexemes:/[a-zA-Z\$][a-zA-Z0-9_:\-]*/,illegal:/(proc)|(abstract)|(extends)|(until)|(#)/,keywords:{keyword:"module schema namespace boundary-space preserve no-preserve strip default collation base-uri ordering context decimal-format decimal-separator copy-namespaces empty-sequence except exponent-separator external grouping-separator inherit no-inherit lax minus-sign per-mille percent schema-attribute schema-element strict unordered zero-digit declare import option function validate variable for at in let where order group by return if then else tumbling sliding window start when only end previous next stable ascending descending allowing empty greatest least some every satisfies switch case typeswitch try catch and or to union intersect instance of treat as castable cast map array delete insert into replace value rename copy modify update",
+type:"item document-node node attribute document element comment namespace namespace-node processing-instruction text construction xs:anyAtomicType xs:untypedAtomic xs:duration xs:time xs:decimal xs:float xs:double xs:gYearMonth xs:gYear xs:gMonthDay xs:gMonth xs:gDay xs:boolean xs:base64Binary xs:hexBinary xs:anyURI xs:QName xs:NOTATION xs:dateTime xs:dateTimeStamp xs:date xs:string xs:normalizedString xs:token xs:language xs:NMTOKEN xs:Name xs:NCName xs:ID xs:IDREF xs:ENTITY xs:integer xs:nonPositiveInteger xs:negativeInteger xs:long xs:int xs:short xs:byte xs:nonNegativeInteger xs:unisignedLong xs:unsignedInt xs:unsignedShort xs:unsignedByte xs:positiveInteger xs:yearMonthDuration xs:dayTimeDuration",
+literal:"eq ne lt le gt ge is self:: child:: descendant:: descendant-or-self:: attribute:: following:: following-sibling:: parent:: ancestor:: ancestor-or-self:: preceding:: preceding-sibling:: NaN"},contains:[{className:"variable",begin:/[\$][\w-:]+/},{className:"built_in",variants:[{begin:/\barray:/,end:/(?:append|filter|flatten|fold\-(?:left|right)|for-each(?:\-pair)?|get|head|insert\-before|join|put|remove|reverse|size|sort|subarray|tail)\b/},{begin:/\bmap:/,end:/(?:contains|entry|find|for\-each|get|keys|merge|put|remove|size)\b/},
+{begin:/\bmath:/,end:/(?:a(?:cos|sin|tan[2]?)|cos|exp(?:10)?|log(?:10)?|pi|pow|sin|sqrt|tan)\b/},{begin:/\bop:/,end:/\(/,excludeEnd:!0},{begin:/\bfn:/,end:/\(/,excludeEnd:!0},{begin:/[^<\/\$:'"-]\b(?:abs|accumulator\-(?:after|before)|adjust\-(?:date(?:Time)?|time)\-to\-timezone|analyze\-string|apply|available\-(?:environment\-variables|system\-properties)|avg|base\-uri|boolean|ceiling|codepoints?\-(?:equal|to\-string)|collation\-key|collection|compare|concat|contains(?:\-token)?|copy\-of|count|current(?:\-)?(?:date(?:Time)?|time|group(?:ing\-key)?|output\-uri|merge\-(?:group|key))?data|dateTime|days?\-from\-(?:date(?:Time)?|duration)|deep\-equal|default\-(?:collation|language)|distinct\-values|document(?:\-uri)?|doc(?:\-available)?|element\-(?:available|with\-id)|empty|encode\-for\-uri|ends\-with|environment\-variable|error|escape\-html\-uri|exactly\-one|exists|false|filter|floor|fold\-(?:left|right)|for\-each(?:\-pair)?|format\-(?:date(?:Time)?|time|integer|number)|function\-(?:arity|available|lookup|name)|generate\-id|has\-children|head|hours\-from\-(?:dateTime|duration|time)|id(?:ref)?|implicit\-timezone|in\-scope\-prefixes|index\-of|innermost|insert\-before|iri\-to\-uri|json\-(?:doc|to\-xml)|key|lang|last|load\-xquery\-module|local\-name(?:\-from\-QName)?|(?:lower|upper)\-case|matches|max|minutes\-from\-(?:dateTime|duration|time)|min|months?\-from\-(?:date(?:Time)?|duration)|name(?:space\-uri\-?(?:for\-prefix|from\-QName)?)?|nilled|node\-name|normalize\-(?:space|unicode)|not|number|one\-or\-more|outermost|parse\-(?:ietf\-date|json)|path|position|(?:prefix\-from\-)?QName|random\-number\-generator|regex\-group|remove|replace|resolve\-(?:QName|uri)|reverse|root|round(?:\-half\-to\-even)?|seconds\-from\-(?:dateTime|duration|time)|snapshot|sort|starts\-with|static\-base\-uri|stream\-available|string\-?(?:join|length|to\-codepoints)?|subsequence|substring\-?(?:after|before)?|sum|system\-property|tail|timezone\-from\-(?:date(?:Time)?|time)|tokenize|trace|trans(?:form|late)|true|type\-available|unordered|unparsed\-(?:entity|text)?\-?(?:public\-id|uri|available|lines)?|uri\-collection|xml\-to\-json|years?\-from\-(?:date(?:Time)?|duration)|zero\-or\-one)\b/},
+{begin:/\blocal:/,end:/\(/,excludeEnd:!0},{begin:/\bzip:/,end:/(?:zip\-file|(?:xml|html|text|binary)\-entry| (?:update\-)?entries)\b/},{begin:/\b(?:util|db|functx|app|xdmp|xmldb):/,end:/\(/,excludeEnd:!0}]},{className:"string",variants:[{begin:/"/,end:/"/,contains:[{begin:/""/,relevance:0}]},{begin:/'/,end:/'/,contains:[{begin:/''/,relevance:0}]}]},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{className:"comment",begin:"\\(:",end:":\\)",
+relevance:10,contains:[{className:"doctag",begin:"@\\w+"}]},{className:"meta",begin:/%[\w-:]+/},{className:"title",begin:/\bxquery version "[13]\.[01]"\s?(?:encoding ".+")?/,end:/;/},{beginKeywords:"element attribute comment document processing-instruction",end:"{",excludeEnd:!0},{begin:/<([\w\._:\-]+)((\s*.*)=('|").*('|"))?>/,end:/(\/[\w\._:\-]+>)/,subLanguage:"xml",contains:[{begin:"{",end:"}",subLanguage:"xquery"},"self"]}]}});b.registerLanguage("zephir",function(a){var b={className:"string",contains:[a.BACKSLASH_ESCAPE],
+variants:[{begin:'b"',end:'"'},{begin:"b'",end:"'"},a.inherit(a.APOS_STRING_MODE,{illegal:null}),a.inherit(a.QUOTE_STRING_MODE,{illegal:null})]},d={variants:[a.BINARY_NUMBER_MODE,a.C_NUMBER_MODE]};return{aliases:["zep"],case_insensitive:!0,keywords:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var let while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally int uint long ulong char uchar double float bool boolean stringlikely unlikely",
+contains:[a.C_LINE_COMMENT_MODE,a.HASH_COMMENT_MODE,a.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),a.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0,keywords:"__halt_compiler",lexemes:a.UNDERSCORE_IDENT_RE}),{className:"string",begin:"<<<['\"]?\\w+['\"]?$",end:"^\\w+;",contains:[a.BACKSLASH_ESCAPE]},{begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function",beginKeywords:"function",end:/[;{]/,excludeEnd:!0,illegal:"\\$|\\[|%",contains:[a.UNDERSCORE_TITLE_MODE,
+{className:"params",begin:"\\(",end:"\\)",contains:["self",a.C_BLOCK_COMMENT_MODE,b,d]}]},{className:"class",beginKeywords:"class interface",end:"{",excludeEnd:!0,illegal:/[:\(\$"]/,contains:[{beginKeywords:"extends implements"},a.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",end:";",illegal:/[\.']/,contains:[a.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",end:";",contains:[a.UNDERSCORE_TITLE_MODE]},{begin:"=>"},b,d]}});return b});
diff --git a/lib/httpcomponents/BUILD b/lib/httpcomponents/BUILD
index 336b3a0..03d9b68 100644
--- a/lib/httpcomponents/BUILD
+++ b/lib/httpcomponents/BUILD
@@ -27,13 +27,16 @@
 java_library(
     name = "httpasyncclient",
     data = ["//lib:LICENSE-Apache2.0"],
-    visibility = ["//gerrit-elasticsearch:__pkg__"],
+    visibility = [
+        "//java/com/google/gerrit/elasticsearch:__pkg__",
+        "//javatests/com/google/gerrit/elasticsearch:__pkg__",
+    ],
     exports = ["@httpasyncclient//jar"],
 )
 
 java_library(
     name = "httpcore-nio",
     data = ["//lib:LICENSE-Apache2.0"],
-    visibility = ["//gerrit-elasticsearch:__pkg__"],
+    visibility = ["//java/com/google/gerrit/elasticsearch:__pkg__"],
     exports = ["@httpcore-nio//jar"],
 )
diff --git a/lib/jackson/BUILD b/lib/jackson/BUILD
index 55b14af..0034748 100644
--- a/lib/jackson/BUILD
+++ b/lib/jackson/BUILD
@@ -1,6 +1,9 @@
 java_library(
     name = "jackson-core",
     data = ["//lib:LICENSE-Apache2.0"],
-    visibility = ["//gerrit-elasticsearch:__pkg__"],
+    visibility = [
+        "//java/com/google/gerrit/elasticsearch:__pkg__",
+        "//plugins:__pkg__",
+    ],
     exports = ["@jackson-core//jar"],
 )
diff --git a/lib/jgit/jgit.bzl b/lib/jgit/jgit.bzl
index ad44013..76c7e64 100644
--- a/lib/jgit/jgit.bzl
+++ b/lib/jgit/jgit.bzl
@@ -1,6 +1,6 @@
 load("//tools/bzl:maven_jar.bzl", "MAVEN_CENTRAL", "maven_jar")
 
-_JGIT_VERS = "4.9.8.201812241815-r"
+_JGIT_VERS = "5.1.5.201812261915-r"
 
 _DOC_VERS = _JGIT_VERS  # Set to _JGIT_VERS unless using a snapshot
 
@@ -29,34 +29,39 @@
         artifact = "org.hamcrest:hamcrest-library:1.3",
         sha1 = "4785a3c21320980282f9f33d0d1264a69040538f",
     )
+    maven_jar(
+        name = "jzlib",
+        artifact = "com.jcraft:jzlib:1.1.1",
+        sha1 = "a1551373315ffc2f96130a0e5704f74e151777ba",
+    )
 
 def jgit_maven_repos():
     maven_jar(
         name = "jgit-lib",
         artifact = "org.eclipse.jgit:org.eclipse.jgit:" + _JGIT_VERS,
         repository = _JGIT_REPO,
-        sha1 = "dedb5d05a952551dc465611ebde3819d86bb22fc",
-        src_sha1 = "dbbc82bb6b1f7733a3d03a5af67eb5b8cf30e2d4",
+        sha1 = "e64c71932a2a8fdc2b86cf7d5d61c3399c64b8b1",
+        src_sha1 = "5021b94b81a4ac662a9967ac6ab725e8e099fce1",
         unsign = True,
     )
     maven_jar(
         name = "jgit-servlet",
         artifact = "org.eclipse.jgit:org.eclipse.jgit.http.server:" + _JGIT_VERS,
         repository = _JGIT_REPO,
-        sha1 = "76fc4dab1d3b0c05768d7d5424e003e4dbfa5222",
+        sha1 = "98c3c1510ac44aca53e31194298b4fdd3c193ff3",
         unsign = True,
     )
     maven_jar(
         name = "jgit-archive",
         artifact = "org.eclipse.jgit:org.eclipse.jgit.archive:" + _JGIT_VERS,
         repository = _JGIT_REPO,
-        sha1 = "dfebb3889afcd4f335e9becf4bb58a06bb84b72f",
+        sha1 = "1a776e2d094b9a7d2cedb2cc232a7e42d8ed3275",
     )
     maven_jar(
         name = "jgit-junit",
         artifact = "org.eclipse.jgit:org.eclipse.jgit.junit:" + _JGIT_VERS,
         repository = _JGIT_REPO,
-        sha1 = "3e34e327979c8c263765be63abc89dda1b4b4d94",
+        sha1 = "a0cf04fcdeb43daff3409615544b87e6b8778d6f",
         unsign = True,
     )
 
diff --git a/lib/jgit/org.eclipse.jgit.junit/BUILD b/lib/jgit/org.eclipse.jgit.junit/BUILD
index 85e9167..29d80d3 100644
--- a/lib/jgit/org.eclipse.jgit.junit/BUILD
+++ b/lib/jgit/org.eclipse.jgit.junit/BUILD
@@ -2,7 +2,7 @@
 
 java_library(
     name = "junit",
-    testonly = 1,
+    testonly = True,
     data = ["//lib:LICENSE-DO_NOT_DISTRIBUTE"],
     visibility = ["//visibility:public"],
     exports = [jgit_dep("@jgit-junit//jar")],
diff --git a/lib/jgit/org.eclipse.jgit/BUILD b/lib/jgit/org.eclipse.jgit/BUILD
index 6b9bba6..d61ac93 100644
--- a/lib/jgit/org.eclipse.jgit/BUILD
+++ b/lib/jgit/org.eclipse.jgit/BUILD
@@ -5,7 +5,10 @@
     data = ["//lib:LICENSE-jgit"],
     visibility = ["//visibility:public"],
     exports = [jgit_dep("@jgit-lib//jar")],
-    runtime_deps = [":javaewah"],
+    runtime_deps = [
+        ":javaewah",
+        "//lib/log:api",
+    ],
 )
 
 alias(
diff --git a/lib/joda/BUILD b/lib/joda/BUILD
deleted file mode 100644
index e152134..0000000
--- a/lib/joda/BUILD
+++ /dev/null
@@ -1,13 +0,0 @@
-java_library(
-    name = "joda-time",
-    data = ["//lib:LICENSE-Apache2.0"],
-    visibility = ["//visibility:public"],
-    exports = ["@joda-time//jar"],
-    runtime_deps = ["joda-convert"],
-)
-
-java_library(
-    name = "joda-convert",
-    data = ["//lib:LICENSE-Apache2.0"],
-    exports = ["@joda-convert//jar"],
-)
diff --git a/lib/js/BUILD b/lib/js/BUILD
index c19f9c0..7478ef3 100644
--- a/lib/js/BUILD
+++ b/lib/js/BUILD
@@ -1,5 +1,5 @@
 load("//lib/js:bower_components.bzl", "define_bower_components")
-load("//tools/bzl:js.bzl", "js_component")
+load("//tools/bzl:js.bzl", "bower_component", "js_component")
 
 package(default_visibility = ["//visibility:public"])
 
@@ -34,3 +34,19 @@
     srcs = ["//lib/highlightjs:highlight.min.js"],
     data = ["//lib:LICENSE-highlightjs"],
 )
+
+js_component(
+    name = "ba-linkify",
+    srcs = ["//lib/ba-linkify:ba-linkify.js"],
+    license = "//lib:LICENSE-ba-linkify",
+)
+
+bower_component(
+    name = "codemirror-minified",
+    license = "//lib:LICENSE-codemirror-minified",
+)
+
+bower_component(
+    name = "resemblejs",
+    license = "//lib:LICENSE-resemblejs",
+)
diff --git a/lib/js/bower_archives.bzl b/lib/js/bower_archives.bzl
index 5f09d7a..75c8277 100644
--- a/lib/js/bower_archives.bzl
+++ b/lib/js/bower_archives.bzl
@@ -28,8 +28,8 @@
     bower_archive(
         name = "font-roboto",
         package = "PolymerElements/font-roboto",
-        version = "1.0.3",
-        sha1 = "edf478d20ae2fc0704d7c155e20162caaabdd5ae",
+        version = "1.1.0",
+        sha1 = "ab4218d87b9ce569d6282b01f7642e551879c3d5",
     )
     bower_archive(
         name = "iron-a11y-announcer",
@@ -64,8 +64,8 @@
     bower_archive(
         name = "iron-flex-layout",
         package = "PolymerElements/iron-flex-layout",
-        version = "1.3.7",
-        sha1 = "4d4cf3232cf750a17a7df0a37476117f831ac633",
+        version = "1.3.9",
+        sha1 = "d987b924cf29fcfe4b393833e81fdc9f1e268796",
     )
     bower_archive(
         name = "iron-form-element-behavior",
@@ -76,8 +76,8 @@
     bower_archive(
         name = "iron-menu-behavior",
         package = "PolymerElements/iron-menu-behavior",
-        version = "2.0.1",
-        sha1 = "139528ee1e8d86257e2aa445de7761b8ec70ae91",
+        version = "2.1.1",
+        sha1 = "1504997f6eb9aec490b855dadee473cac064f38c",
     )
     bower_archive(
         name = "iron-meta",
@@ -117,19 +117,19 @@
     )
     bower_archive(
         name = "paper-behaviors",
-        package = "polymerelements/paper-behaviors",
+        package = "PolymerElements/paper-behaviors",
         version = "1.0.13",
         sha1 = "a81eab28a952e124c208430e17508d9a1aae4ee7",
     )
     bower_archive(
-        name = "paper-material",
-        package = "polymerelements/paper-material",
-        version = "1.0.7",
-        sha1 = "159b7fb6b13b181c4276b25f9c6adbeaacb0d42b",
+        name = "paper-icon-button",
+        package = "PolymerElements/paper-icon-button",
+        version = "2.2.0",
+        sha1 = "9525e76ef433428bb9d6ec4fa65c4ef83156a803",
     )
     bower_archive(
         name = "paper-ripple",
-        package = "polymerelements/paper-ripple",
+        package = "PolymerElements/paper-ripple",
         version = "1.0.10",
         sha1 = "21199db50d02b842da54bd6f4f1d1b10b474e893",
     )
diff --git a/lib/js/bower_components.bzl b/lib/js/bower_components.bzl
index c769829..a540828 100644
--- a/lib/js/bower_components.bzl
+++ b/lib/js/bower_components.bzl
@@ -223,13 +223,22 @@
         deps = [
             ":iron-flex-layout",
             ":paper-behaviors",
-            ":paper-material",
-            ":paper-ripple",
+            ":paper-styles",
             ":polymer",
         ],
         seed = True,
     )
     bower_component(
+        name = "paper-icon-button",
+        license = "//lib:LICENSE-polymer",
+        deps = [
+            ":iron-icon",
+            ":paper-behaviors",
+            ":paper-styles",
+            ":polymer",
+        ],
+    )
+    bower_component(
         name = "paper-input",
         license = "//lib:LICENSE-polymer",
         deps = [
@@ -266,14 +275,6 @@
         seed = True,
     )
     bower_component(
-        name = "paper-material",
-        license = "//lib:LICENSE-polymer",
-        deps = [
-            ":paper-styles",
-            ":polymer",
-        ],
-    )
-    bower_component(
         name = "paper-ripple",
         license = "//lib:LICENSE-polymer",
         deps = [
@@ -291,6 +292,34 @@
         ],
     )
     bower_component(
+        name = "paper-tabs",
+        license = "//lib:LICENSE-polymer",
+        deps = [
+            ":iron-behaviors",
+            ":iron-flex-layout",
+            ":iron-icon",
+            ":iron-iconset-svg",
+            ":iron-menu-behavior",
+            ":iron-resizable-behavior",
+            ":paper-behaviors",
+            ":paper-icon-button",
+            ":paper-styles",
+            ":polymer",
+        ],
+        seed = True,
+    )
+    bower_component(
+        name = "paper-toggle-button",
+        license = "//lib:LICENSE-polymer",
+        deps = [
+            ":iron-checked-element-behavior",
+            ":paper-behaviors",
+            ":paper-styles",
+            ":polymer",
+        ],
+        seed = True,
+    )
+    bower_component(
         name = "polymer-resin",
         license = "//lib:LICENSE-polymer",
         deps = [
diff --git a/lib/js/npm.bzl b/lib/js/npm.bzl
index 0fd575d..92f44bd 100644
--- a/lib/js/npm.bzl
+++ b/lib/js/npm.bzl
@@ -1,11 +1,11 @@
 NPM_VERSIONS = {
     "bower": "1.8.2",
     "crisper": "2.0.2",
-    "vulcanize": "1.14.8",
+    "polymer-bundler": "4.0.2",
 }
 
 NPM_SHA1S = {
     "bower": "adf53529c8d4af02ef24fb8d5341c1419d33e2f7",
     "crisper": "7183c58cea33632fb036c91cefd1b43e390d22a2",
-    "vulcanize": "679107f251c19ab7539529b1e3fdd40829e6fc63",
+    "polymer-bundler": "6b296b6099ab5a0e93ca914cbe93e753f2395910",
 }
diff --git a/lib/log/BUILD b/lib/log/BUILD
index ddad6a8..8e4c927 100644
--- a/lib/log/BUILD
+++ b/lib/log/BUILD
@@ -1,19 +1,14 @@
 java_library(
     name = "api",
     data = ["//lib:LICENSE-slf4j"],
-    visibility = ["//visibility:public"],
+    visibility = [
+        "//lib/jgit/org.eclipse.jgit:__pkg__",
+        "//plugins:__pkg__",
+    ],
     exports = ["@log-api//jar"],
 )
 
 java_library(
-    name = "nop",
-    data = ["//lib:LICENSE-slf4j"],
-    visibility = ["//visibility:public"],
-    exports = ["@log-nop//jar"],
-    runtime_deps = [":api"],
-)
-
-java_library(
     name = "ext",
     data = ["//lib:LICENSE-slf4j"],
     visibility = ["//visibility:public"],
diff --git a/lib/mina/BUILD b/lib/mina/BUILD
index 8595bb5..6ee7e41 100644
--- a/lib/mina/BUILD
+++ b/lib/mina/BUILD
@@ -4,6 +4,7 @@
     visibility = ["//visibility:public"],
     exports = [
         ":eddsa",
+        "@sshd-mina//jar",
         "@sshd//jar",
     ],
     runtime_deps = [":core"],
diff --git a/lib/testcontainers/BUILD b/lib/testcontainers/BUILD
index 9d14fac..25ca327 100644
--- a/lib/testcontainers/BUILD
+++ b/lib/testcontainers/BUILD
@@ -1,6 +1,6 @@
 java_library(
     name = "duct-tape",
-    testonly = 1,
+    testonly = True,
     data = ["//lib:LICENSE-testcontainers"],
     visibility = ["//visibility:public"],
     exports = ["@duct-tape//jar"],
@@ -8,7 +8,7 @@
 
 java_library(
     name = "visible-assertions",
-    testonly = 1,
+    testonly = True,
     data = ["//lib:LICENSE-testcontainers"],
     visibility = ["//visibility:public"],
     exports = ["@visible-assertions//jar"],
@@ -16,7 +16,7 @@
 
 java_library(
     name = "jna",
-    testonly = 1,
+    testonly = True,
     data = ["//lib:LICENSE-Apache2.0"],
     visibility = ["//visibility:public"],
     exports = ["@jna//jar"],
@@ -24,7 +24,7 @@
 
 java_library(
     name = "testcontainers",
-    testonly = 1,
+    testonly = True,
     data = ["//lib:LICENSE-testcontainers"],
     visibility = ["//visibility:public"],
     exports = ["@testcontainers//jar"],
@@ -38,7 +38,7 @@
 
 java_library(
     name = "testcontainers-elasticsearch",
-    testonly = 1,
+    testonly = True,
     data = ["//lib:LICENSE-testcontainers"],
     visibility = ["//visibility:public"],
     exports = ["@testcontainers-elasticsearch//jar"],
diff --git a/lib/truth/BUILD b/lib/truth/BUILD
new file mode 100644
index 0000000..db5bc48
--- /dev/null
+++ b/lib/truth/BUILD
@@ -0,0 +1,57 @@
+java_library(
+    name = "truth",
+    data = ["//lib:LICENSE-DO_NOT_DISTRIBUTE"],
+    visibility = ["//visibility:public"],
+    exports = ["@truth//jar"],
+    runtime_deps = [
+        ":diffutils",
+        "//lib:guava",
+        "//lib:junit",
+    ],
+)
+
+java_library(
+    name = "truth-java8-extension",
+    data = ["//lib:LICENSE-DO_NOT_DISTRIBUTE"],
+    visibility = ["//visibility:public"],
+    exports = ["@truth-java8-extension//jar"],
+    runtime_deps = [
+        ":truth",
+        "//lib:guava",
+    ],
+)
+
+java_library(
+    name = "truth-liteproto-extension",
+    data = ["//lib:LICENSE-DO_NOT_DISTRIBUTE"],
+    visibility = ["//visibility:private"],
+    exports = ["@truth-liteproto-extension//jar"],
+    runtime_deps = [
+        ":truth",
+        "//lib:guava",
+        "//lib:protobuf",
+    ],
+)
+
+java_library(
+    name = "diffutils",
+    data = ["//lib:LICENSE-DO_NOT_DISTRIBUTE"],
+    visibility = ["//visibility:private"],
+    exports = ["@diffutils//jar"],
+)
+
+java_library(
+    name = "truth-proto-extension",
+    data = ["//lib:LICENSE-DO_NOT_DISTRIBUTE"],
+    visibility = ["//visibility:public"],
+    exports = [
+        ":truth-liteproto-extension",
+        "@truth-proto-extension//jar",
+    ],
+    runtime_deps = [
+        ":truth",
+        ":truth-liteproto-extension",
+        "//lib:guava",
+        "//lib:protobuf",
+    ],
+)
diff --git a/plugins/BUILD b/plugins/BUILD
index 3253b98..2b0c0d4 100644
--- a/plugins/BUILD
+++ b/plugins/BUILD
@@ -1,4 +1,5 @@
 load("//tools/bzl:genrule2.bzl", "genrule2")
+load("//tools/bzl:javadoc.bzl", "java_doc")
 load(
     "//tools/bzl:plugins.bzl",
     "CORE_PLUGINS",
@@ -16,3 +17,126 @@
           "zip -qr $$ROOT/$@ .",
     visibility = ["//visibility:public"],
 )
+
+PLUGIN_API = [
+    "//java/com/google/gerrit/server",
+    "//java/com/google/gerrit/server/ioutil",
+    "//java/com/google/gerrit/server/restapi",
+    "//java/com/google/gerrit/pgm/init/api",
+    "//java/com/google/gerrit/httpd",
+    "//java/com/google/gerrit/sshd",
+]
+
+EXPORTS = [
+    "//antlr3:query_parser",
+    "//java/com/google/gerrit/common:annotations",
+    "//java/com/google/gerrit/common:server",
+    "//java/com/google/gerrit/extensions:api",
+    "//java/com/google/gerrit/index",
+    "//java/com/google/gerrit/index/project",
+    "//java/com/google/gerrit/index:query_exception",
+    "//java/com/google/gerrit/lifecycle",
+    "//java/com/google/gerrit/mail",
+    "//java/com/google/gerrit/metrics",
+    "//java/com/google/gerrit/metrics/dropwizard",
+    "//java/com/google/gerrit/reviewdb:server",
+    "//java/com/google/gerrit/server/audit",
+    "//java/com/google/gerrit/server/cache/mem",
+    "//java/com/google/gerrit/server/logging",
+    "//java/com/google/gerrit/server/schema",
+    "//java/com/google/gerrit/server/util/time",
+    "//java/com/google/gerrit/util/cli",
+    "//java/com/google/gerrit/util/http",
+    "//lib/commons:compress",
+    "//lib/commons:dbcp",
+    "//lib/commons:lang",
+    "//lib/dropwizard:dropwizard-core",
+    "//lib/flogger:api",
+    "//lib/guice:guice",
+    "//lib/guice:guice-assistedinject",
+    "//lib/guice:guice-servlet",
+    "//lib/guice:javax_inject",
+    "//lib/httpcomponents:httpclient",
+    "//lib/httpcomponents:httpcore",
+    "//lib/jackson:jackson-core",
+    "//lib/jgit/org.eclipse.jgit.http.server:jgit-servlet",
+    "//lib/jgit/org.eclipse.jgit:jgit",
+    "//lib/log:api",
+    "//lib/log:log4j",
+    "//lib/mina:sshd",
+    "//lib/ow2:ow2-asm",
+    "//lib/ow2:ow2-asm-analysis",
+    "//lib/ow2:ow2-asm-commons",
+    "//lib/ow2:ow2-asm-util",
+    "//lib:args4j",
+    "//lib:blame-cache",
+    "//lib:guava",
+    "//lib:guava-retrying",
+    "//lib:gson",
+    "//lib:gwtorm",
+    "//lib:icu4j",
+    "//lib:jsch",
+    "//lib:mime-util",
+    "//lib:protobuf",
+    "//lib:servlet-api-3_1-without-neverlink",
+    "//lib:soy",
+    "//prolog:gerrit-prolog-common",
+]
+
+java_binary(
+    name = "plugin-api",
+    main_class = "Dummy",
+    visibility = ["//visibility:public"],
+    runtime_deps = [":plugin-lib"],
+)
+
+java_library(
+    name = "plugin-lib",
+    visibility = ["//visibility:public"],
+    exports = PLUGIN_API + EXPORTS,
+)
+
+java_library(
+    name = "plugin-lib-neverlink",
+    neverlink = 1,
+    visibility = ["//visibility:public"],
+    exports = PLUGIN_API + EXPORTS,
+)
+
+java_binary(
+    name = "plugin-api-sources",
+    main_class = "Dummy",
+    visibility = ["//visibility:public"],
+    runtime_deps = [
+        "//antlr3:libquery_parser-src.jar",
+        "//java/com/google/gerrit/common:libannotations-src.jar",
+        "//java/com/google/gerrit/common:libserver-src.jar",
+        "//java/com/google/gerrit/extensions:libapi-src.jar",
+        "//java/com/google/gerrit/httpd:libhttpd-src.jar",
+        "//java/com/google/gerrit/index:libindex-src.jar",
+        "//java/com/google/gerrit/index:libquery_exception-src.jar",
+        "//java/com/google/gerrit/pgm/init/api:libapi-src.jar",
+        "//java/com/google/gerrit/reviewdb:libserver-src.jar",
+        "//java/com/google/gerrit/server:libserver-src.jar",
+        "//java/com/google/gerrit/server/restapi:librestapi-src.jar",
+        "//java/com/google/gerrit/sshd:libsshd-src.jar",
+        "//java/com/google/gerrit/util/http:libhttp-src.jar",
+    ],
+)
+
+java_doc(
+    name = "plugin-api-javadoc",
+    libs = PLUGIN_API + [
+        "//antlr3:query_parser",
+        "//java/com/google/gerrit/index",
+        "//java/com/google/gerrit/index:query_exception",
+        "//java/com/google/gerrit/common:annotations",
+        "//java/com/google/gerrit/common:server",
+        "//java/com/google/gerrit/extensions:api",
+        "//java/com/google/gerrit/reviewdb:server",
+        "//java/com/google/gerrit/util/http",
+    ],
+    pkgs = ["com.google.gerrit"],
+    title = "Gerrit Review Plugin API Documentation",
+    visibility = ["//visibility:public"],
+)
diff --git a/plugins/codemirror-editor b/plugins/codemirror-editor
new file mode 160000
index 0000000..c4cf42b
--- /dev/null
+++ b/plugins/codemirror-editor
@@ -0,0 +1 @@
+Subproject commit c4cf42b96a049a0fb854bcbcb85b56a82d91a009
diff --git a/plugins/commit-message-length-validator b/plugins/commit-message-length-validator
index 4f6b685..556e427 160000
--- a/plugins/commit-message-length-validator
+++ b/plugins/commit-message-length-validator
@@ -1 +1 @@
-Subproject commit 4f6b685e12e34a4f583cf84ba1c58ccc2b75e8b0
+Subproject commit 556e427fd737744ce8a6a37b89fd427ae59bc8ea
diff --git a/plugins/download-commands b/plugins/download-commands
index bcfb05c..697ca37 160000
--- a/plugins/download-commands
+++ b/plugins/download-commands
@@ -1 +1 @@
-Subproject commit bcfb05cbd1200422b81e9ac2ce824868ff74f252
+Subproject commit 697ca3783add1c8fa406d60f7821ab6db7c1bfec
diff --git a/plugins/hooks b/plugins/hooks
index 491c5dd..47e4b87 160000
--- a/plugins/hooks
+++ b/plugins/hooks
@@ -1 +1 @@
-Subproject commit 491c5ddf0e3892ffe684cc825a406ef56744a458
+Subproject commit 47e4b87fca52c5b1dea9ab37833e36fb4f57d3fb
diff --git a/plugins/replication b/plugins/replication
index 0fe68ab..31b419c 160000
--- a/plugins/replication
+++ b/plugins/replication
@@ -1 +1 @@
-Subproject commit 0fe68ab58cccfae23d113a22d3ce66296b7e9fae
+Subproject commit 31b419cbd7126e2c9397ec5abd0ad975ed937d75
diff --git a/plugins/reviewnotes b/plugins/reviewnotes
index 951d84b..5ff3620 160000
--- a/plugins/reviewnotes
+++ b/plugins/reviewnotes
@@ -1 +1 @@
-Subproject commit 951d84b32e4f2393dbcf7c319e0d3f617838948c
+Subproject commit 5ff36200b29567118b3aede8e49ba0b6c6b1adb1
diff --git a/plugins/singleusergroup b/plugins/singleusergroup
index 0ffbdf1..ae9a9ab 160000
--- a/plugins/singleusergroup
+++ b/plugins/singleusergroup
@@ -1 +1 @@
-Subproject commit 0ffbdf1e5c3daa9d118ee9f53d5c00497cff6454
+Subproject commit ae9a9ab370d8026ad809a73b4dae3fb7d79ad8a4
diff --git a/polygerrit-ui/BUILD b/polygerrit-ui/BUILD
index 38ef3fd..3988f95 100644
--- a/polygerrit-ui/BUILD
+++ b/polygerrit-ui/BUILD
@@ -1,3 +1,4 @@
+load("@io_bazel_rules_go//go:def.bzl", "go_binary")
 load("//tools/bzl:genrule2.bzl", "genrule2")
 load("//tools/bzl:js.bzl", "bower_component_bundle")
 
@@ -6,9 +7,11 @@
 bower_component_bundle(
     name = "polygerrit_components.bower_components",
     deps = [
+        "//lib/js:ba-linkify",
         "//lib/js:es6-promise",
         "//lib/js:fetch",
-        # TODO(hanwen): this is inserted separately in the UI zip. Do we need this here?
+        # Although highlightjs is inserted separately in the UI zip, it's used
+        # by local development servers (e.g. --polygerrit-dev or run-server.sh).
         "//lib/js:highlightjs",
         "//lib/js:iron-a11y-keys-behavior",
         "//lib/js:iron-autogrow-textarea",
@@ -24,6 +27,8 @@
         "//lib/js:paper-input",
         "//lib/js:paper-item",
         "//lib/js:paper-listbox",
+        "//lib/js:paper-tabs",
+        "//lib/js:paper-toggle-button",
         "//lib/js:polymer",
         "//lib/js:polymer-resin",
         "//lib/js:promise-polyfill",
@@ -45,3 +50,19 @@
     ]),
     output_to_bindir = 1,
 )
+
+go_binary(
+    name = "devserver",
+    srcs = ["server.go"],
+    data = [
+        ":fonts.zip",
+        "//polygerrit-ui/app:test_components.zip",
+        "//resources/com/google/gerrit/httpd/raw",
+    ],
+    deps = [
+        "@com_github_robfig_soy//:go_default_library",
+        "@com_github_robfig_soy//soyhtml:go_default_library",
+        "@org_golang_x_tools//godoc/vfs/httpfs:go_default_library",
+        "@org_golang_x_tools//godoc/vfs/zipfs:go_default_library",
+    ],
+)
diff --git a/polygerrit-ui/README.md b/polygerrit-ui/README.md
index fb41dc1..3c21a42 100644
--- a/polygerrit-ui/README.md
+++ b/polygerrit-ui/README.md
@@ -1,52 +1,53 @@
 # PolyGerrit
 
-## Installing [Node.js](https://nodejs.org/en/download/)
-
-The minimum nodejs version supported is 6.x+
-
-```sh
-# Debian experimental
-sudo apt-get install nodejs-legacy
-
-# OS X with Homebrew
-brew install node
-```
-
-All other platforms: [download from
-nodejs.org](https://nodejs.org/en/download/).
-
 ## Installing [Bazel](https://bazel.build/)
 
 Follow the instructions
 [here](https://gerrit-review.googlesource.com/Documentation/dev-bazel.html#_installation)
 to get and install Bazel.
 
+## Installing [Node.js](https://nodejs.org/en/download/) and npm packages
+
+The minimum nodejs version supported is 8.x+
+
+```sh
+# Debian experimental
+sudo apt-get install nodejs-legacy
+sudo apt-get install npm
+
+# OS X with Homebrew
+brew install node
+brew install npm
+```
+
+All other platforms: [download from
+nodejs.org](https://nodejs.org/en/download/).
+
+Various steps below require installing additional npm packages. The full list of
+dependencies can be installed with:
+
+```sh
+sudo npm install -g \
+  eslint \
+  eslint-config-google \
+  eslint-plugin-html \
+  typescript \
+  fried-twinkie \
+  polylint \
+  web-component-tester
+```
+
+It may complain about a missing `typescript@2.3.4` peer dependency, which is
+harmless.
+
+If you're interested in the details, keep reading.
+
 ## Local UI, Production Data
 
 This is a quick and easy way to test your local changes against real data.
 Unfortunately, you can't sign in, so testing certain features will require
 you to use the "test data" technique described below.
 
-### Installing [go](https://golang.org/)
-
-This is required for running the `run-server.sh` script below.
-
-```sh
-# Debian/Ubuntu
-sudo apt-get install golang
-
-# OS X with Homebrew
-brew install go
-```
-
-All other platforms: [download from golang.org](https://golang.org/)
-
-Then add go to your path:
-
-```
-PATH=$PATH:/usr/local/go/bin
-```
-
 ### Running the server
 
 To test the local UI against gerrit-review.googlesource.com:
@@ -76,21 +77,26 @@
   -d ../gerrit_testsite --console-log --show-stack-trace
 ```
 
-## Running Tests
+Serving plugins
 
-One-time setup:
+> Local dev plugins must be put inside of gerrit/plugins
+
+Loading a single plugin file:
 
 ```sh
-# Debian/Ubuntu
-sudo apt-get install npm
-
-# OS X with Homebrew
-brew install npm
-
-# All platforms (including those above)
-sudo npm install -g web-component-tester
+./run-server.sh --plugins=plugins/my_plugin/static/my_plugin.js
 ```
 
+Loading multiple plugin files:
+
+```sh
+./run-server.sh --plugins=plugins/my_plugin/static/my_plugin.js,plugins/my_plugin/static/my_plugin.html
+```
+
+## Running Tests
+
+This step requires the `web-component-tester` npm module.
+
 Note: it may be necessary to add the options `--unsafe-perm=true --allow-root`
 to the `npm install` command to avoid file permission errors.
 
@@ -137,11 +143,7 @@
 
 In addition, we encourage the use of [ESLint](http://eslint.org/).
 It is available as a command line utility, as well as a plugin for most editors
-and IDEs. It, along with a few dependencies, can also be installed through NPM:
-
-```sh
-sudo npm install -g eslint eslint-config-google eslint-plugin-html
-```
+and IDEs.
 
 `eslint-config-google` is a port of the Google JS Style Guide to an ESLint
 config module, and `eslint-plugin-html` allows ESLint to lint scripts inside
@@ -163,13 +165,9 @@
 * To run the linter on all of your local changes:
 `git diff --name-only master | xargs eslint --ext .html,.js`
 
-We also use the polylint tool to lint use of Polymer. To install polylint,
+We also use the `polylint` tool to lint use of Polymer. To install polylint,
 execute the following command.
 
-```sh
-npm install -g polylint
-```
-
 To run polylint, execute the following command.
 
 ```sh
@@ -182,27 +180,24 @@
 - Any functions with optional parameters will need closure annotations.
 - Any Polymer parameters that are nullable or can be multiple types (other than the one explicitly delared) will need type annotations.
 
-A few dependencies are necessary to run these tests:
-``` sh
-npm install -g typescript fried-twinkie
-```
+These tests require the `typescript` and `fried-twinkie` npm packages.
 
 To run on all files, execute the following command:
 
 ```sh
-bazel test //polygerrit-ui/app:all --test_tag_filters=template --test_output errors
+./polygerrit-ui/app/run_template_test.sh
 ```
 
 To run on a specific top level directory (ex: change-list)
 ```sh
-bazel test //polygerrit-ui/app:template_test_change-list --test_output errors
+TEMPLATE_NO_DEFAULT=true ./polygerrit-ui/app/run_template_test.sh //polygerrit-ui/app:template_test_change-list
 ```
 
 To run on a specific file (ex: gr-change-list-view), execute the following command:
 ```sh
-bazel test //polygerrit-ui/app:template_test_<TOP_LEVEL_DIRECTORY> --test_arg=<VIEW_NAME> --test_output errors
+TEMPLATE_NO_DEFAULT=true ./polygerrit-ui/app/run_template_test.sh //polygerrit-ui/app:template_test_<TOP_LEVEL_DIRECTORY> --test_arg=<VIEW_NAME>
 ```
 
 ```sh
-bazel test //polygerrit-ui/app:template_test_change-list --test_arg=gr-change-list-view  --test_output errors
+TEMPLATE_NO_DEFAULT=true ./polygerrit-ui/app/run_template_test.sh //polygerrit-ui/app:template_test_change-list --test_arg=gr-change-list-view
 ```
diff --git a/polygerrit-ui/app/.eslintrc.json b/polygerrit-ui/app/.eslintrc.json
index 2b08713..b5d3dae 100644
--- a/polygerrit-ui/app/.eslintrc.json
+++ b/polygerrit-ui/app/.eslintrc.json
@@ -1,5 +1,8 @@
 {
   "extends": ["eslint:recommended", "google"],
+  "parserOptions": {
+    "ecmaVersion": 8
+  },
   "env": {
     "browser": true,
     "es6": true
diff --git a/polygerrit-ui/app/BUILD b/polygerrit-ui/app/BUILD
index 8012c20..bba0640 100644
--- a/polygerrit-ui/app/BUILD
+++ b/polygerrit-ui/app/BUILD
@@ -1,8 +1,5 @@
 load("//tools/bzl:genrule2.bzl", "genrule2")
-load(
-    "//tools/bzl:js.bzl",
-    "bower_component_bundle",
-)
+load("//tools/bzl:js.bzl", "bower_component_bundle")
 load(":rules.bzl", "polygerrit_bundle")
 
 package(default_visibility = ["//visibility:public"])
@@ -16,7 +13,6 @@
         ],
         exclude = [
             "bower_components/**",
-            "index.html",
             "test/**",
             "**/*_test.html",
         ],
@@ -27,7 +23,7 @@
 
 bower_component_bundle(
     name = "test_components",
-    testonly = 1,
+    testonly = True,
     deps = [
         "//lib/js:iron-test-helpers",
         "//lib/js:test-fixture",
@@ -127,6 +123,7 @@
     "change-list",
     "core",
     "diff",
+    "edit",
     "plugins",
     "settings",
     "shared",
@@ -160,13 +157,12 @@
         ],
         exclude = [
             "bower_components/**",
-            "index.html",
             "test/**",
             "**/*_test.html",
         ],
     ),
     outs = ["polygerrit_embed_ui.zip"],
-    app = "embed/change-diff-views.html",
+    app = "embed/embed.html",
 )
 
 filegroup(
diff --git a/polygerrit-ui/app/behaviors/async-foreach-behavior/async-foreach-behavior.html b/polygerrit-ui/app/behaviors/async-foreach-behavior/async-foreach-behavior.html
index 0148377..36e0201 100644
--- a/polygerrit-ui/app/behaviors/async-foreach-behavior/async-foreach-behavior.html
+++ b/polygerrit-ui/app/behaviors/async-foreach-behavior/async-foreach-behavior.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,12 +26,23 @@
     /**
      * @template T
      * @param {!Array<T>} array
-     * @param {!Function} fn
+     * @param {!Function} fn An iteratee function to be passed each element of
+     *     the array in order. Must return a promise, and the following
+     *     iteration will not begin until resolution of the promise returned by
+     *     the previous iteration.
+     *
+     *     An optional second argument to fn is a callback that will halt the
+     *     loop if called.
      * @return {!Promise<undefined>}
      */
     asyncForeach(array, fn) {
       if (!array.length) { return Promise.resolve(); }
-      return fn(array[0]).then(() => this.asyncForeach(array.slice(1), fn));
+      let stop = false;
+      const stopCallback = () => { stop = true; };
+      return fn(array[0], stopCallback).then(exit => {
+        if (stop) { return Promise.resolve(); }
+        return this.asyncForeach(array.slice(1), fn);
+      });
     },
   };
 })(window);
diff --git a/polygerrit-ui/app/behaviors/async-foreach-behavior/async-foreach-behavior_test.html b/polygerrit-ui/app/behaviors/async-foreach-behavior/async-foreach-behavior_test.html
index ba15ad7..fec459b 100644
--- a/polygerrit-ui/app/behaviors/async-foreach-behavior/async-foreach-behavior_test.html
+++ b/polygerrit-ui/app/behaviors/async-foreach-behavior/async-foreach-behavior_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -35,5 +36,19 @@
             assert.equal(fn.getCall(2).args[0], 3);
           });
     });
+
+    test('halts on stop condition', () => {
+      const stub = sinon.stub();
+      const fn = (e, stop) => {
+        stub(e);
+        stop();
+        return Promise.resolve();
+      };
+      return Gerrit.AsyncForeachBehavior.asyncForeach([1, 2, 3], fn)
+          .then(() => {
+            assert.isTrue(stub.calledOnce);
+            assert.equal(stub.lastCall.args[0], 1);
+          });
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/behaviors/base-url-behavior/base-url-behavior.html b/polygerrit-ui/app/behaviors/base-url-behavior/base-url-behavior.html
index cda8c530..48bd10e 100644
--- a/polygerrit-ui/app/behaviors/base-url-behavior/base-url-behavior.html
+++ b/polygerrit-ui/app/behaviors/base-url-behavior/base-url-behavior.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -20,6 +21,9 @@
 
   window.Gerrit = window.Gerrit || {};
 
+  const PROJECT_DASHBOARD_PATTERN = /\/p\/(.+)\/\+\/dashboard\/(.*)/;
+  const REPO_URL_PATTERN = /^\/admin\/repos/;
+  const PROJECT_URL = '/admin/projects';
   /** @polymerBehavior Gerrit.BaseUrlBehavior */
   Gerrit.BaseUrlBehavior = {
     /** @return {string} */
@@ -29,7 +33,13 @@
 
     computeGwtUrl(path) {
       const base = this.getBaseUrl();
-      const clientPath = path.substring(base.length);
+      let clientPath = path.substring(base.length);
+      const match = clientPath.match(PROJECT_DASHBOARD_PATTERN);
+      if (match) {
+        clientPath = `/projects/${match[1]},dashboards/${match[2]}`;
+      }
+      // Replace any '/admin/project' links to '/admin/repo'
+      clientPath = clientPath.replace(REPO_URL_PATTERN, PROJECT_URL);
       return base + '/?polygerrit=0#' + clientPath;
     },
   };
diff --git a/polygerrit-ui/app/behaviors/base-url-behavior/base-url-behavior_test.html b/polygerrit-ui/app/behaviors/base-url-behavior/base-url-behavior_test.html
index b7c29dc..429abe1 100644
--- a/polygerrit-ui/app/behaviors/base-url-behavior/base-url-behavior_test.html
+++ b/polygerrit-ui/app/behaviors/base-url-behavior/base-url-behavior_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -72,5 +73,17 @@
           '/r/?polygerrit=0#/c/1/'
       );
     });
+
+    test('computeGwtUrl for project dashboard', () => {
+      assert.deepEqual(
+          element.computeGwtUrl('/r/p/gerrit/proj/+/dashboard/main:default'),
+          '/r/?polygerrit=0#/projects/gerrit/proj,dashboards/main:default');
+    });
+
+    test('computeGwtUrl for project access', () => {
+      assert.deepEqual(
+          element.computeGwtUrl('/r/admin/repos/demo-project,access'),
+          '/r/?polygerrit=0#/admin/projects/demo-project,access');
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/behaviors/docs-url-behavior/docs-url-behavior.html b/polygerrit-ui/app/behaviors/docs-url-behavior/docs-url-behavior.html
index 07ce55e..64b725f 100644
--- a/polygerrit-ui/app/behaviors/docs-url-behavior/docs-url-behavior.html
+++ b/polygerrit-ui/app/behaviors/docs-url-behavior/docs-url-behavior.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/behaviors/docs-url-behavior/docs-url-behavior_test.html b/polygerrit-ui/app/behaviors/docs-url-behavior/docs-url-behavior_test.html
index 8154c78..e92eb49 100644
--- a/polygerrit-ui/app/behaviors/docs-url-behavior/docs-url-behavior_test.html
+++ b/polygerrit-ui/app/behaviors/docs-url-behavior/docs-url-behavior_test.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/behaviors/dom-util-behavior/dom-util-behavior.html b/polygerrit-ui/app/behaviors/dom-util-behavior/dom-util-behavior.html
new file mode 100644
index 0000000..2d25b29
--- /dev/null
+++ b/polygerrit-ui/app/behaviors/dom-util-behavior/dom-util-behavior.html
@@ -0,0 +1,46 @@
+<!--
+@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.
+-->
+<script>
+(function(window) {
+  'use strict';
+
+  window.Gerrit = window.Gerrit || {};
+
+  /** @polymerBehavior Gerrit.DomUtilBehavior */
+  Gerrit.DomUtilBehavior = {
+    /**
+     * Are any ancestors of the element (or the element itself) members of the
+     * given class.
+     * @param {!Element} element
+     * @param {string} className
+     * @param {Element=} opt_stopElement If provided, stop traversing the
+     *     ancestry when the stop element is reached. The stop element's class
+     *     is not checked.
+     * @return {boolean}
+     */
+    descendedFromClass(element, className, opt_stopElement) {
+      let isDescendant = element.classList.contains(className);
+      while (!isDescendant && element.parentElement &&
+          (!opt_stopElement || element.parentElement !== opt_stopElement)) {
+        isDescendant = element.classList.contains(className);
+        element = element.parentElement;
+      }
+      return isDescendant;
+    },
+  };
+})(window);
+</script>
diff --git a/polygerrit-ui/app/behaviors/dom-util-behavior/dom-util-behavior_test.html b/polygerrit-ui/app/behaviors/dom-util-behavior/dom-util-behavior_test.html
new file mode 100644
index 0000000..640d902
--- /dev/null
+++ b/polygerrit-ui/app/behaviors/dom-util-behavior/dom-util-behavior_test.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<!--
+@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.
+-->
+
+<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+<title>dom-util-behavior</title>
+
+<script src="../../bower_components/webcomponentsjs/webcomponents.min.js"></script>
+<script src="../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../test/common-test-setup.html"/>
+<link rel="import" href="dom-util-behavior.html">
+
+<test-fixture id="nested-structure">
+  <template>
+    <test-element></test-element>
+    <div>
+      <div class="a">
+        <div class="b">
+          <div class="c"></div>
+        </div>
+      </div>
+    </div>
+  </template>
+</test-fixture>
+
+<script>
+  suite('dom-util-behavior tests', () => {
+    let element;
+    let divs;
+
+    suiteSetup(() => {
+      // Define a Polymer element that uses this behavior.
+      Polymer({
+        is: 'test-element',
+        behaviors: [Gerrit.DomUtilBehavior],
+      });
+    });
+
+    setup(() => {
+      const testDom = fixture('nested-structure');
+      element = testDom[0];
+      divs = testDom[1];
+    });
+
+    test('descendedFromClass', () => {
+      // .c is a child of .a and not vice versa.
+      assert.isTrue(element.descendedFromClass(divs.querySelector('.c'), 'a'));
+      assert.isFalse(element.descendedFromClass(divs.querySelector('.a'), 'c'));
+
+      // Stops at stop element.
+      assert.isFalse(element.descendedFromClass(divs.querySelector('.c'), 'a',
+          divs.querySelector('.b')));
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/behaviors/gr-access-behavior/gr-access-behavior.html b/polygerrit-ui/app/behaviors/gr-access-behavior/gr-access-behavior.html
index 4e67fda..fb0c685 100644
--- a/polygerrit-ui/app/behaviors/gr-access-behavior/gr-access-behavior.html
+++ b/polygerrit-ui/app/behaviors/gr-access-behavior/gr-access-behavior.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/behaviors/gr-access-behavior/gr-access-behavior_test.html b/polygerrit-ui/app/behaviors/gr-access-behavior/gr-access-behavior_test.html
index 62992e1..929834f 100644
--- a/polygerrit-ui/app/behaviors/gr-access-behavior/gr-access-behavior_test.html
+++ b/polygerrit-ui/app/behaviors/gr-access-behavior/gr-access-behavior_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/behaviors/gr-admin-nav-behavior/gr-admin-nav-behavior.html b/polygerrit-ui/app/behaviors/gr-admin-nav-behavior/gr-admin-nav-behavior.html
new file mode 100644
index 0000000..db11937
--- /dev/null
+++ b/polygerrit-ui/app/behaviors/gr-admin-nav-behavior/gr-admin-nav-behavior.html
@@ -0,0 +1,206 @@
+<!--
+@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.
+-->
+<script>
+(function(window) {
+  'use strict';
+
+  const ACCOUNT_CAPABILITIES = ['createProject', 'createGroup', 'viewPlugins'];
+
+  const ADMIN_LINKS = [{
+    name: 'Repositories',
+    noBaseUrl: true,
+    url: '/admin/repos',
+    view: 'gr-repo-list',
+    viewableToAll: true,
+  }, {
+    name: 'Groups',
+    section: 'Groups',
+    noBaseUrl: true,
+    url: '/admin/groups',
+    view: 'gr-admin-group-list',
+  }, {
+    name: 'Plugins',
+    capability: 'viewPlugins',
+    section: 'Plugins',
+    noBaseUrl: true,
+    url: '/admin/plugins',
+    view: 'gr-plugin-list',
+  }];
+
+  window.Gerrit = window.Gerrit || {};
+
+  /** @polymerBehavior Gerrit.AdminNavBehavior */
+  Gerrit.AdminNavBehavior = {
+    /**
+     * @param {!Object} account
+     * @param {!Function} getAccountCapabilities
+     * @param {!Function} getAdminMenuLinks
+     *  Possible aguments in options:
+     *    repoName?: string
+     *    groupId?: string,
+     *    groupName?: string,
+     *    groupIsInternal?: boolean,
+     *    isAdmin?: boolean,
+     *    groupOwner?: boolean,
+     * @param {!Object=} opt_options
+     * @return {Promise<!Object>}
+     */
+    getAdminLinks(account, getAccountCapabilities, getAdminMenuLinks,
+        opt_options) {
+      if (!account) {
+        return Promise.resolve(this._filterLinks(link => link.viewableToAll,
+            getAdminMenuLinks, opt_options));
+      }
+      return getAccountCapabilities(ACCOUNT_CAPABILITIES)
+          .then(capabilities => {
+            return this._filterLinks(link => {
+              return !link.capability ||
+                  capabilities.hasOwnProperty(link.capability);
+            }, getAdminMenuLinks, opt_options);
+          });
+    },
+
+    /**
+     * @param {!Function} filterFn
+     * @param {!Function} getAdminMenuLinks
+     *  Possible aguments in options:
+     *    repoName?: string
+     *    groupId?: string,
+     *    groupName?: string,
+     *    groupIsInternal?: boolean,
+     *    isAdmin?: boolean,
+     *    groupOwner?: boolean,
+     * @param {!Object|undefined} opt_options
+     * @return {Promise<!Object>}
+     */
+    _filterLinks(filterFn, getAdminMenuLinks, opt_options) {
+      let links = ADMIN_LINKS.slice(0);
+      let expandedSection;
+
+      const isExernalLink = link => link.url[0] !== '/';
+
+      // Append top-level links that are defined by plugins.
+      links.push(...getAdminMenuLinks().map(link => ({
+        url: link.url,
+        name: link.text,
+        noBaseUrl: !isExernalLink(link),
+        view: null,
+        viewableToAll: true,
+        target: isExernalLink(link) ? '_blank' : null,
+      })));
+
+      links = links.filter(filterFn);
+
+      const filteredLinks = [];
+      const repoName = opt_options && opt_options.repoName;
+      const groupId = opt_options && opt_options.groupId;
+      const groupName = opt_options && opt_options.groupName;
+      const groupIsInternal = opt_options && opt_options.groupIsInternal;
+      const isAdmin = opt_options && opt_options.isAdmin;
+      const groupOwner = opt_options && opt_options.groupOwner;
+
+      // Don't bother to get sub-navigation items if only the top level links
+      // are needed. This is used by the main header dropdown.
+      if (!repoName && !groupId) { return {links, expandedSection}; }
+
+      // Otherwise determine the full set of links and return both the full
+      // set in addition to the subsection that should be displayed if it
+      // exists.
+      for (const link of links) {
+        const linkCopy = Object.assign({}, link);
+        if (linkCopy.name === 'Repositories' && repoName) {
+          linkCopy.subsection = this.getRepoSubsections(repoName);
+          expandedSection = linkCopy.subsection;
+        } else if (linkCopy.name === 'Groups' && groupId && groupName) {
+          linkCopy.subsection = this.getGroupSubsections(groupId, groupName,
+              groupIsInternal, isAdmin, groupOwner);
+          expandedSection = linkCopy.subsection;
+        }
+        filteredLinks.push(linkCopy);
+      }
+      return {links: filteredLinks, expandedSection};
+    },
+
+    getGroupSubsections(groupId, groupName, groupIsInternal, isAdmin,
+        groupOwner) {
+      const subsection = {
+        name: groupName,
+        view: Gerrit.Nav.View.GROUP,
+        url: Gerrit.Nav.getUrlForGroup(groupId),
+        children: [],
+      };
+      if (groupIsInternal) {
+        subsection.children.push({
+          name: 'Members',
+          detailType: Gerrit.Nav.GroupDetailView.MEMBERS,
+          view: Gerrit.Nav.View.GROUP,
+          url: Gerrit.Nav.getUrlForGroupMembers(groupId),
+        });
+      }
+      if (groupIsInternal && (isAdmin || groupOwner)) {
+        subsection.children.push(
+            {
+              name: 'Audit Log',
+              detailType: Gerrit.Nav.GroupDetailView.LOG,
+              view: Gerrit.Nav.View.GROUP,
+              url: Gerrit.Nav.getUrlForGroupLog(groupId),
+            }
+        );
+      }
+      return subsection;
+    },
+
+    getRepoSubsections(repoName) {
+      return {
+        name: repoName,
+        view: Gerrit.Nav.View.REPO,
+        url: Gerrit.Nav.getUrlForRepo(repoName),
+        children: [{
+          name: 'Access',
+          view: Gerrit.Nav.View.REPO,
+          detailType: Gerrit.Nav.RepoDetailView.ACCESS,
+          url: Gerrit.Nav.getUrlForRepoAccess(repoName),
+        },
+        {
+          name: 'Commands',
+          view: Gerrit.Nav.View.REPO,
+          detailType: Gerrit.Nav.RepoDetailView.COMMANDS,
+          url: Gerrit.Nav.getUrlForRepoCommands(repoName),
+        },
+        {
+          name: 'Branches',
+          view: Gerrit.Nav.View.REPO,
+          detailType: Gerrit.Nav.RepoDetailView.BRANCHES,
+          url: Gerrit.Nav.getUrlForRepoBranches(repoName),
+        },
+        {
+          name: 'Tags',
+          view: Gerrit.Nav.View.REPO,
+          detailType: Gerrit.Nav.RepoDetailView.TAGS,
+          url: Gerrit.Nav.getUrlForRepoTags(repoName),
+        },
+        {
+          name: 'Dashboards',
+          view: Gerrit.Nav.View.REPO,
+          detailType: Gerrit.Nav.RepoDetailView.DASHBOARDS,
+          url: Gerrit.Nav.getUrlForRepoDashboards(repoName),
+        }],
+      };
+    },
+  };
+})(window);
+</script>
diff --git a/polygerrit-ui/app/behaviors/gr-admin-nav-behavior/gr-admin-nav-behavior_test.html b/polygerrit-ui/app/behaviors/gr-admin-nav-behavior/gr-admin-nav-behavior_test.html
new file mode 100644
index 0000000..a1902cd
--- /dev/null
+++ b/polygerrit-ui/app/behaviors/gr-admin-nav-behavior/gr-admin-nav-behavior_test.html
@@ -0,0 +1,311 @@
+<!DOCTYPE html>
+<!--
+@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.
+-->
+
+<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+<title>keyboard-shortcut-behavior</title>
+
+<script src="../../bower_components/webcomponentsjs/webcomponents.min.js"></script>
+<script src="../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../test/common-test-setup.html"/>
+<link rel="import" href="gr-admin-nav-behavior.html">
+
+<test-fixture id="basic">
+  <template>
+    <test-element></test-element>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-admin-nav-behavior tests', () => {
+    let element;
+    let sandbox;
+    let capabilityStub;
+    let menuLinkStub;
+
+    suiteSetup(() => {
+      // Define a Polymer element that uses this behavior.
+      Polymer({
+        is: 'test-element',
+        behaviors: [
+          Gerrit.AdminNavBehavior,
+        ],
+      });
+    });
+
+    setup(() => {
+      element = fixture('basic');
+      sandbox = sinon.sandbox.create();
+      capabilityStub = sinon.stub();
+      menuLinkStub = sinon.stub().returns([]);
+    });
+
+    teardown(() => {
+      sandbox.restore();
+    });
+
+    const testAdminLinks = (account, options, expected, done) => {
+      element.getAdminLinks(account,
+          capabilityStub,
+          menuLinkStub,
+          options)
+          .then(res => {
+            assert.equal(expected.totalLength, res.links.length);
+            assert.equal(res.links[0].name, 'Repositories');
+            // Repos
+            if (expected.groupListShown) {
+              assert.equal(res.links[1].name, 'Groups');
+            }
+
+            if (expected.pluginListShown) {
+              assert.equal(res.links[2].name, 'Plugins');
+              assert.isNotOk(res.links[2].subsection);
+            }
+
+            if (expected.projectPageShown) {
+              assert.isOk(res.links[0].subsection);
+              assert.equal(res.links[0].subsection.children.length, 5);
+            } else {
+              assert.isNotOk(res.links[0].subsection);
+            }
+            // Groups
+            if (expected.groupPageShown) {
+              assert.isOk(res.links[1].subsection);
+              assert.equal(res.links[1].subsection.children.length,
+                  expected.groupSubpageLength);
+            } else if ( expected.totalLength > 1) {
+              assert.isNotOk(res.links[1].subsection);
+            }
+
+            if (expected.pluginGeneratedLinks) {
+              for (const link of expected.pluginGeneratedLinks) {
+                const linkMatch = res.links.find(l => {
+                  return (l.url === link.url && l.name === link.text);
+                });
+                assert.isTrue(!!linkMatch);
+
+                // External links should open in new tab.
+                if (link.url[0] !== '/') {
+                  assert.equal(linkMatch.target, '_blank');
+                } else {
+                  assert.isNotOk(linkMatch.target);
+                }
+              }
+            }
+
+            // Current section
+            if (expected.projectPageShown || expected.groupPageShown) {
+              assert.isOk(res.expandedSection);
+              assert.isOk(res.expandedSection.children);
+            } else {
+              assert.isNotOk(res.expandedSection);
+            }
+            if (expected.projectPageShown) {
+              assert.equal(res.expandedSection.name, 'my-repo');
+              assert.equal(res.expandedSection.children.length, 5);
+            } else if (expected.groupPageShown) {
+              assert.equal(res.expandedSection.name, 'my-group');
+              assert.equal(res.expandedSection.children.length,
+                  expected.groupSubpageLength);
+            }
+            done();
+          });
+    };
+
+    suite('logged out', () => {
+      let account;
+      let expected;
+
+      setup(() => {
+        expected = {
+          groupListShown: false,
+          groupPageShown: false,
+          pluginListShown: false,
+        };
+      });
+
+      test('without a specific repo or group', done => {
+        let options;
+        expected = Object.assign(expected, {
+          totalLength: 1,
+          projectPageShown: false,
+        });
+        testAdminLinks(account, options, expected, done);
+      });
+
+      test('with a repo', done => {
+        const options = {repoName: 'my-repo'};
+        expected = Object.assign(expected, {
+          totalLength: 1,
+          projectPageShown: true,
+        });
+        testAdminLinks(account, options, expected, done);
+      });
+
+      test('with plugin generated links', done => {
+        let options;
+        const generatedLinks = [
+          {text: 'internal link text', url: '/internal/link/url'},
+          {text: 'external link text', url: 'http://external/link/url'},
+        ];
+        menuLinkStub.returns(generatedLinks);
+        expected = Object.assign(expected, {
+          totalLength: 3,
+          projectPageShown: false,
+          pluginGeneratedLinks: generatedLinks,
+        });
+        testAdminLinks(account, options, expected, done);
+      });
+    });
+
+    suite('no plugin capability logged in', () => {
+      const account = {
+        name: 'test-user',
+      };
+      let expected;
+
+      setup(() => {
+        expected = {
+          totalLength: 2,
+          pluginListShown: false,
+        };
+        capabilityStub.returns(Promise.resolve({}));
+      });
+
+      test('without a specific project or group', done => {
+        let options;
+        expected = Object.assign(expected, {
+          projectPageShown: false,
+          groupListShown: true,
+          groupPageShown: false,
+        });
+        testAdminLinks(account, options, expected, done);
+      });
+
+      test('with a repo', done => {
+        const account = {
+          name: 'test-user',
+        };
+        const options = {repoName: 'my-repo'};
+        expected = Object.assign(expected, {
+          projectPageShown: true,
+          groupListShown: true,
+          groupPageShown: false,
+        });
+        testAdminLinks(account, options, expected, done);
+      });
+    });
+
+    suite('view plugin capability logged in', () => {
+      const account = {
+        name: 'test-user',
+      };
+      let expected;
+
+      setup(() => {
+        capabilityStub.returns(Promise.resolve({viewPlugins: true}));
+        expected = {
+          totalLength: 3,
+          groupListShown: true,
+          pluginListShown: true,
+        };
+      });
+
+      test('without a specific repo or group', done => {
+        let options;
+        expected = Object.assign(expected, {
+          projectPageShown: false,
+          groupPageShown: false,
+        });
+        testAdminLinks(account, options, expected, done);
+      });
+
+      test('with a repo', done => {
+        const options = {repoName: 'my-repo'};
+        expected = Object.assign(expected, {
+          projectPageShown: true,
+          groupPageShown: false,
+        });
+        testAdminLinks(account, options, expected, done);
+      });
+
+      test('admin with internal group', done => {
+        const options = {
+          groupId: 'a15262',
+          groupName: 'my-group',
+          groupIsInternal: true,
+          isAdmin: true,
+          groupOwner: false,
+        };
+        expected = Object.assign(expected, {
+          projectPageShown: false,
+          groupPageShown: true,
+          groupSubpageLength: 2,
+        });
+        testAdminLinks(account, options, expected, done);
+      });
+
+      test('group owner with internal group', done => {
+        const options = {
+          groupId: 'a15262',
+          groupName: 'my-group',
+          groupIsInternal: true,
+          isAdmin: false,
+          groupOwner: true,
+        };
+        expected = Object.assign(expected, {
+          projectPageShown: false,
+          groupPageShown: true,
+          groupSubpageLength: 2,
+        });
+        testAdminLinks(account, options, expected, done);
+      });
+
+      test('non owner or admin with internal group', done => {
+        const options = {
+          groupId: 'a15262',
+          groupName: 'my-group',
+          groupIsInternal: true,
+          isAdmin: false,
+          groupOwner: false,
+        };
+        expected = Object.assign(expected, {
+          projectPageShown: false,
+          groupPageShown: true,
+          groupSubpageLength: 1,
+        });
+        testAdminLinks(account, options, expected, done);
+      });
+
+      test('admin with external group', done => {
+        const options = {
+          groupId: 'a15262',
+          groupName: 'my-group',
+          groupIsInternal: false,
+          isAdmin: true,
+          groupOwner: true,
+        };
+        expected = Object.assign(expected, {
+          projectPageShown: false,
+          groupPageShown: true,
+          groupSubpageLength: 0,
+        });
+        testAdminLinks(account, options, expected, done);
+      });
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/behaviors/gr-anonymous-name-behavior/gr-anonymous-name-behavior.html b/polygerrit-ui/app/behaviors/gr-anonymous-name-behavior/gr-anonymous-name-behavior.html
index 10065af..40379e4 100644
--- a/polygerrit-ui/app/behaviors/gr-anonymous-name-behavior/gr-anonymous-name-behavior.html
+++ b/polygerrit-ui/app/behaviors/gr-anonymous-name-behavior/gr-anonymous-name-behavior.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -31,6 +32,8 @@
     getUserName(config, account, enableEmail) {
       if (account && account.name) {
         return account.name;
+      } else if (account && account.username) {
+        return account.username;
       } else if (enableEmail && account && account.email) {
         return account.email;
       } else if (config && config.user &&
diff --git a/polygerrit-ui/app/behaviors/gr-anonymous-name-behavior/gr-anonymous-name-behavior_test.html b/polygerrit-ui/app/behaviors/gr-anonymous-name-behavior/gr-anonymous-name-behavior_test.html
index e4a409b..3ac94fe 100644
--- a/polygerrit-ui/app/behaviors/gr-anonymous-name-behavior/gr-anonymous-name-behavior_test.html
+++ b/polygerrit-ui/app/behaviors/gr-anonymous-name-behavior/gr-anonymous-name-behavior_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -55,7 +56,14 @@
 
     test('test for it to return name', () => {
       const account = {
-        name: 'test-user',
+        name: 'test-name',
+      };
+      assert.deepEqual(element.getUserName(config, account, true), 'test-name');
+    });
+
+    test('test for it to return username', () => {
+      const account = {
+        username: 'test-user',
       };
       assert.deepEqual(element.getUserName(config, account, true), 'test-user');
     });
diff --git a/polygerrit-ui/app/behaviors/gr-change-table-behavior/gr-change-table-behavior.html b/polygerrit-ui/app/behaviors/gr-change-table-behavior/gr-change-table-behavior.html
index 20568e6..c462c6f 100644
--- a/polygerrit-ui/app/behaviors/gr-change-table-behavior/gr-change-table-behavior.html
+++ b/polygerrit-ui/app/behaviors/gr-change-table-behavior/gr-change-table-behavior.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -29,7 +30,7 @@
           'Status',
           'Owner',
           'Assignee',
-          'Project',
+          'Repo',
           'Branch',
           'Updated',
           'Size',
@@ -57,6 +58,22 @@
     isColumnHidden(columnToCheck, columnsToDisplay) {
       return !columnsToDisplay.includes(columnToCheck);
     },
+
+    /**
+     * The Project column was renamed to Repo, but some users may have
+     * preferences that use its old name. If that column is found, rename it
+     * before use.
+     * @param {!Array<string>} columns
+     * @return {!Array<string>} If the column was renamed, returns a new array
+     *     with the corrected name. Otherwise, it returns the original param.
+     */
+    getVisibleColumns(columns) {
+      const projectIndex = columns.indexOf('Project');
+      if (projectIndex === -1) { return columns; }
+      const newColumns = columns.slice(0);
+      newColumns[projectIndex] = 'Repo';
+      return newColumns;
+    },
   };
 })(window);
 </script>
diff --git a/polygerrit-ui/app/behaviors/gr-change-table-behavior/gr-change-table-behavior_test.html b/polygerrit-ui/app/behaviors/gr-change-table-behavior/gr-change-table-behavior_test.html
index c265db87c..e8cbb09 100644
--- a/polygerrit-ui/app/behaviors/gr-change-table-behavior/gr-change-table-behavior_test.html
+++ b/polygerrit-ui/app/behaviors/gr-change-table-behavior/gr-change-table-behavior_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -62,7 +63,7 @@
         'Status',
         'Owner',
         'Assignee',
-        'Project',
+        'Repo',
         'Branch',
         'Updated',
         'Size',
@@ -73,7 +74,7 @@
         'Subject',
         'Status',
         'Assignee',
-        'Project',
+        'Repo',
         'Branch',
         'Size',
       ];
@@ -82,13 +83,13 @@
     });
 
     test('isColumnHidden', () => {
-      const columnToCheck = 'Project';
+      const columnToCheck = 'Repo';
       let columnsToDisplay = [
         'Subject',
         'Status',
         'Owner',
         'Assignee',
-        'Project',
+        'Repo',
         'Branch',
         'Updated',
         'Size',
@@ -106,5 +107,17 @@
       ];
       assert.isTrue(element.isColumnHidden(columnToCheck, columnsToDisplay));
     });
+
+    test('getVisibleColumns maps Project to Repo', () => {
+      const columns = [
+        'Subject',
+        'Status',
+        'Owner',
+      ];
+      assert.deepEqual(element.getVisibleColumns(columns), columns.slice(0));
+      assert.deepEqual(
+          element.getVisibleColumns(columns.concat(['Project'])),
+          columns.slice(0).concat(['Repo']));
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/behaviors/gr-list-view-behavior/gr-list-view-behavior.html b/polygerrit-ui/app/behaviors/gr-list-view-behavior/gr-list-view-behavior.html
index 597300e..f251db8 100644
--- a/polygerrit-ui/app/behaviors/gr-list-view-behavior/gr-list-view-behavior.html
+++ b/polygerrit-ui/app/behaviors/gr-list-view-behavior/gr-list-view-behavior.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,7 +15,7 @@
 limitations under the License.
 -->
 <link rel="import" href="../base-url-behavior/base-url-behavior.html">
-<link rel="import" href="../gr-url-encoding-behavior.html">
+<link rel="import" href="../gr-url-encoding-behavior/gr-url-encoding-behavior.html">
 <script>
 (function(window) {
   'use strict';
diff --git a/polygerrit-ui/app/behaviors/gr-list-view-behavior/gr-list-view-behavior_test.html b/polygerrit-ui/app/behaviors/gr-list-view-behavior/gr-list-view-behavior_test.html
index 599f691..54b979f 100644
--- a/polygerrit-ui/app/behaviors/gr-list-view-behavior/gr-list-view-behavior_test.html
+++ b/polygerrit-ui/app/behaviors/gr-list-view-behavior/gr-list-view-behavior_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/behaviors/gr-patch-set-behavior/gr-patch-set-behavior.html b/polygerrit-ui/app/behaviors/gr-patch-set-behavior/gr-patch-set-behavior.html
index 13c232e..d4e83d9 100644
--- a/polygerrit-ui/app/behaviors/gr-patch-set-behavior/gr-patch-set-behavior.html
+++ b/polygerrit-ui/app/behaviors/gr-patch-set-behavior/gr-patch-set-behavior.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -33,6 +34,7 @@
   /** @polymerBehavior this */
   Gerrit.PatchSetBehavior = {
     EDIT_NAME: 'edit',
+    PARENT_NAME: 'PARENT',
 
     /**
      * As patchNum can be either a string (e.g. 'edit', 'PARENT') OR a number,
@@ -104,11 +106,13 @@
     },
 
     /**
-     * Sort given revisions array according to the patch set number. The sort
-     * algorithm is change edit aware. Change edit has patch set number equals
-     * 0, but must appear after the patch set it was based on. Example: change
-     * edit is based on patch set 2, and another patch set was uploaded after
-     * change edit creation, the sorted order should be: 1, 2, (0|edit), 3.
+     * Sort given revisions array according to the patch set number, in
+     * descending order.
+     * The sort algorithm is change edit aware. Change edit has patch set number
+     * equals 'edit', but must appear after the patch set it was based on.
+     * Example: change edit is based on patch set 2, and another patch set was
+     * uploaded after change edit creation, the sorted order should be:
+     * 3, edit, 2, 1.
      *
      * @param {!Array<!Object>} revisions The revisions array
      * @return {!Array<!Object>} The sorted {revisions} array
@@ -122,7 +126,7 @@
       const num = r => r._number === Gerrit.PatchSetBehavior.EDIT_NAME ?
           2 * editParent :
           2 * (r._number - 1) + 1;
-      return revisions.sort((a, b) => num(a) - num(b));
+      return revisions.sort((a, b) => num(b) - num(a));
     },
 
     /**
@@ -143,8 +147,7 @@
     computeAllPatchSets(change) {
       if (!change) { return []; }
       let patchNums = [];
-      if (change.revisions &&
-          Object.keys(change.revisions).length) {
+      if (change.revisions && Object.keys(change.revisions).length) {
         patchNums =
           Gerrit.PatchSetBehavior.sortRevisions(Object.values(change.revisions))
               .map(e => {
@@ -195,29 +198,35 @@
     /** @return {number|undefined} */
     computeLatestPatchNum(allPatchSets) {
       if (!allPatchSets || !allPatchSets.length) { return undefined; }
-      if (allPatchSets[allPatchSets.length - 1].num ===
-          Gerrit.PatchSetBehavior.EDIT_NAME) {
-        return allPatchSets[allPatchSets.length - 2].num;
+      if (allPatchSets[0].num === Gerrit.PatchSetBehavior.EDIT_NAME) {
+        return allPatchSets[1].num;
       }
-      return allPatchSets[allPatchSets.length - 1].num;
+      return allPatchSets[0].num;
     },
 
     /** @return {Boolean} */
     hasEditBasedOnCurrentPatchSet(allPatchSets) {
-      if (!allPatchSets || !allPatchSets.length) { return false; }
-      return allPatchSets[allPatchSets.length - 1].num ===
-          Gerrit.PatchSetBehavior.EDIT_NAME;
+      if (!allPatchSets || allPatchSets.length < 2) { return false; }
+      return allPatchSets[0].num === Gerrit.PatchSetBehavior.EDIT_NAME;
+    },
+
+    /** @return {Boolean} */
+    hasEditPatchsetLoaded(patchRangeRecord) {
+      const patchRange = patchRangeRecord.base;
+      if (!patchRange) { return false; }
+      return patchRange.patchNum === Gerrit.PatchSetBehavior.EDIT_NAME ||
+          patchRange.basePatchNum === Gerrit.PatchSetBehavior.EDIT_NAME;
     },
 
     /**
      * Check whether there is no newer patch than the latest patch that was
      * available when this change was loaded.
      *
-     * @return {Promise<boolean>} A promise that yields true if the latest patch
+     * @return {Promise<!Object>} A promise that yields true if the latest patch
      *     has been loaded, and false if a newer patch has been uploaded in the
      *     meantime. The promise is rejected on network error.
      */
-    fetchIsLatestKnown(change, restAPI) {
+    fetchChangeUpdates(change, restAPI) {
       const knownLatest = Gerrit.PatchSetBehavior.computeLatestPatchNum(
           Gerrit.PatchSetBehavior.computeAllPatchSets(change));
       return restAPI.getChangeDetail(change._number)
@@ -227,7 +236,11 @@
             }
             const actualLatest = Gerrit.PatchSetBehavior.computeLatestPatchNum(
                 Gerrit.PatchSetBehavior.computeAllPatchSets(detail));
-            return actualLatest <= knownLatest;
+            return {
+              isLatest: actualLatest <= knownLatest,
+              newStatus: change.status !== detail.status ? detail.status : null,
+              newMessages: change.messages.length < detail.messages.length,
+            };
           });
     },
 
@@ -242,6 +255,16 @@
       const findNum = rev => rev._number + '' === patchNum + '';
       return revisions.findIndex(findNum);
     },
+
+    /**
+     * Convert parent indexes from patch range expressions to numbers.
+     * For example, in a patch range expression `"-3"` becomes `3`.
+     * @param {number|string} rangeBase
+     * @return {number}
+     */
+    getParentIndex(rangeBase) {
+      return -parseInt(rangeBase + '', 10);
+    },
   };
 })(window);
 </script>
diff --git a/polygerrit-ui/app/behaviors/gr-patch-set-behavior/gr-patch-set-behavior_test.html b/polygerrit-ui/app/behaviors/gr-patch-set-behavior/gr-patch-set-behavior_test.html
index 54c1355..b858c51 100644
--- a/polygerrit-ui/app/behaviors/gr-patch-set-behavior/gr-patch-set-behavior_test.html
+++ b/polygerrit-ui/app/behaviors/gr-patch-set-behavior/gr-patch-set-behavior_test.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -22,7 +23,7 @@
 <link rel="import" href="gr-patch-set-behavior.html">
 
 <script>
-  suite('gr-path-list-behavior tests', () => {
+  suite('gr-patch-set-behavior tests', () => {
     test('getRevisionByPatchNum', () => {
       const get = Gerrit.PatchSetBehavior.getRevisionByPatchNum;
       const revisions = [
@@ -35,31 +36,37 @@
       assert.equal(get(revisions, '3'), undefined);
     });
 
-    test('fetchIsLatestKnown on latest', done => {
+    test('fetchChangeUpdates on latest', done => {
       const knownChange = {
         revisions: {
           sha1: {description: 'patch 1', _number: 1},
           sha2: {description: 'patch 2', _number: 2},
         },
+        status: 'NEW',
+        messages: [],
       };
       const mockRestApi = {
         getChangeDetail() {
           return Promise.resolve(knownChange);
         },
       };
-      Gerrit.PatchSetBehavior.fetchIsLatestKnown(knownChange, mockRestApi)
-          .then(isLatest => {
-            assert.isTrue(isLatest);
+      Gerrit.PatchSetBehavior.fetchChangeUpdates(knownChange, mockRestApi)
+          .then(result => {
+            assert.isTrue(result.isLatest);
+            assert.isNotOk(result.newStatus);
+            assert.isFalse(result.newMessages);
             done();
           });
     });
 
-    test('fetchIsLatestKnown not on latest', done => {
+    test('fetchChangeUpdates not on latest', done => {
       const knownChange = {
         revisions: {
           sha1: {description: 'patch 1', _number: 1},
           sha2: {description: 'patch 2', _number: 2},
         },
+        status: 'NEW',
+        messages: [],
       };
       const actualChange = {
         revisions: {
@@ -67,15 +74,81 @@
           sha2: {description: 'patch 2', _number: 2},
           sha3: {description: 'patch 3', _number: 3},
         },
+        status: 'NEW',
+        messages: [],
       };
       const mockRestApi = {
         getChangeDetail() {
           return Promise.resolve(actualChange);
         },
       };
-      Gerrit.PatchSetBehavior.fetchIsLatestKnown(knownChange, mockRestApi)
-          .then(isLatest => {
-            assert.isFalse(isLatest);
+      Gerrit.PatchSetBehavior.fetchChangeUpdates(knownChange, mockRestApi)
+          .then(result => {
+            assert.isFalse(result.isLatest);
+            assert.isNotOk(result.newStatus);
+            assert.isFalse(result.newMessages);
+            done();
+          });
+    });
+
+    test('fetchChangeUpdates new status', done => {
+      const knownChange = {
+        revisions: {
+          sha1: {description: 'patch 1', _number: 1},
+          sha2: {description: 'patch 2', _number: 2},
+        },
+        status: 'NEW',
+        messages: [],
+      };
+      const actualChange = {
+        revisions: {
+          sha1: {description: 'patch 1', _number: 1},
+          sha2: {description: 'patch 2', _number: 2},
+        },
+        status: 'MERGED',
+        messages: [],
+      };
+      const mockRestApi = {
+        getChangeDetail() {
+          return Promise.resolve(actualChange);
+        },
+      };
+      Gerrit.PatchSetBehavior.fetchChangeUpdates(knownChange, mockRestApi)
+          .then(result => {
+            assert.isTrue(result.isLatest);
+            assert.equal(result.newStatus, 'MERGED');
+            assert.isFalse(result.newMessages);
+            done();
+          });
+    });
+
+    test('fetchChangeUpdates new messages', done => {
+      const knownChange = {
+        revisions: {
+          sha1: {description: 'patch 1', _number: 1},
+          sha2: {description: 'patch 2', _number: 2},
+        },
+        status: 'NEW',
+        messages: [],
+      };
+      const actualChange = {
+        revisions: {
+          sha1: {description: 'patch 1', _number: 1},
+          sha2: {description: 'patch 2', _number: 2},
+        },
+        status: 'NEW',
+        messages: [{message: 'blah blah'}],
+      };
+      const mockRestApi = {
+        getChangeDetail() {
+          return Promise.resolve(actualChange);
+        },
+      };
+      Gerrit.PatchSetBehavior.fetchChangeUpdates(knownChange, mockRestApi)
+          .then(result => {
+            assert.isTrue(result.isLatest);
+            assert.isNotOk(result.newStatus);
+            assert.isTrue(result.newMessages);
             done();
           });
     });
@@ -226,24 +299,29 @@
         {_number: 1},
       ];
       const sorted = [
-        {_number: 0},
-        {_number: 1},
         {_number: 2},
+        {_number: 1},
+        {_number: 0},
       ];
 
       assert.deepEqual(sort(revisions), sorted);
 
       // Edit patchset should follow directly after its basePatchNum.
       revisions.push({_number: 'edit', basePatchNum: 2});
-      sorted.push({_number: 'edit', basePatchNum: 2});
+      sorted.unshift({_number: 'edit', basePatchNum: 2});
       assert.deepEqual(sort(revisions), sorted);
 
-      revisions[3].basePatchNum = 0;
-      const edit = sorted.pop();
+      revisions[0].basePatchNum = 0;
+      const edit = sorted.shift();
       edit.basePatchNum = 0;
-      // Edit patchset should be at index 1.
-      sorted.splice(1, 0, edit);
+      // Edit patchset should be at index 2.
+      sorted.splice(2, 0, edit);
       assert.deepEqual(sort(revisions), sorted);
     });
+
+    test('getParentIndex', () => {
+      assert.equal(Gerrit.PatchSetBehavior.getParentIndex('-13'), 13);
+      assert.equal(Gerrit.PatchSetBehavior.getParentIndex(-4), 4);
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/behaviors/gr-path-list-behavior/gr-path-list-behavior.html b/polygerrit-ui/app/behaviors/gr-path-list-behavior/gr-path-list-behavior.html
index d3491c7..5e597ae 100644
--- a/polygerrit-ui/app/behaviors/gr-path-list-behavior/gr-path-list-behavior.html
+++ b/polygerrit-ui/app/behaviors/gr-path-list-behavior/gr-path-list-behavior.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/behaviors/gr-path-list-behavior/gr-path-list-behavior_test.html b/polygerrit-ui/app/behaviors/gr-path-list-behavior/gr-path-list-behavior_test.html
index f48fb98..75c2433 100644
--- a/polygerrit-ui/app/behaviors/gr-path-list-behavior/gr-path-list-behavior_test.html
+++ b/polygerrit-ui/app/behaviors/gr-path-list-behavior/gr-path-list-behavior_test.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/behaviors/gr-tooltip-behavior/gr-tooltip-behavior.html b/polygerrit-ui/app/behaviors/gr-tooltip-behavior/gr-tooltip-behavior.html
index 3e9e19e..07d3484 100644
--- a/polygerrit-ui/app/behaviors/gr-tooltip-behavior/gr-tooltip-behavior.html
+++ b/polygerrit-ui/app/behaviors/gr-tooltip-behavior/gr-tooltip-behavior.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/behaviors/gr-tooltip-behavior/gr-tooltip-behavior.js b/polygerrit-ui/app/behaviors/gr-tooltip-behavior/gr-tooltip-behavior.js
index 7da82b7..04d8b6e 100644
--- a/polygerrit-ui/app/behaviors/gr-tooltip-behavior/gr-tooltip-behavior.js
+++ b/polygerrit-ui/app/behaviors/gr-tooltip-behavior/gr-tooltip-behavior.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function(window) {
   'use strict';
 
@@ -26,6 +29,11 @@
         type: Boolean,
         observer: '_setupTooltipListeners',
       },
+      positionBelow: {
+        type: Boolean,
+        value: false,
+        reflectToAttribute: true,
+      },
 
       _isTouchDevice: {
         type: Boolean,
@@ -43,7 +51,6 @@
 
     detached() {
       this._handleHideTooltip();
-      this.unlisten(window, 'scroll', '_handleWindowScroll');
     },
 
     _setupTooltipListeners() {
@@ -51,9 +58,6 @@
       this._hasSetupTooltipListeners = true;
 
       this.addEventListener('mouseenter', this._handleShowTooltip.bind(this));
-      this.addEventListener('mouseleave', this._handleHideTooltip.bind(this));
-      this.addEventListener('tap', this._handleHideTooltip.bind(this));
-      this.listen(window, 'scroll', '_handleWindowScroll');
     },
 
     _handleShowTooltip(e) {
@@ -73,6 +77,7 @@
       const tooltip = document.createElement('gr-tooltip');
       tooltip.text = this._titleText;
       tooltip.maxWidth = this.getAttribute('max-width');
+      tooltip.positionBelow = this.getAttribute('position-below');
 
       // Set visibility to hidden before appending to the DOM so that
       // calculations can be made based on the element’s size.
@@ -82,6 +87,9 @@
       tooltip.style.visibility = null;
 
       this._tooltip = tooltip;
+      this.listen(window, 'scroll', '_handleWindowScroll');
+      this.listen(this, 'mouseleave', '_handleHideTooltip');
+      this.listen(this, 'tap', '_handleHideTooltip');
     },
 
     _handleHideTooltip(e) {
@@ -91,6 +99,9 @@
         return;
       }
 
+      this.unlisten(window, 'scroll', '_handleWindowScroll');
+      this.unlisten(this, 'mouseleave', '_handleHideTooltip');
+      this.unlisten(this, 'tap', '_handleHideTooltip');
       this.setAttribute('title', this._titleText);
       if (this._tooltip && this._tooltip.parentNode) {
         this._tooltip.parentNode.removeChild(this._tooltip);
@@ -125,9 +136,14 @@
         });
       }
       tooltip.style.left = Math.max(0, left) + 'px';
-      tooltip.style.top = Math.max(0, top) + 'px';
-      tooltip.style.transform = 'translateY(calc(-100% - ' + BOTTOM_OFFSET +
-          'px))';
+
+      if (!this.positionBelow) {
+        tooltip.style.top = Math.max(0, top) + 'px';
+        tooltip.style.transform = 'translateY(calc(-100% - ' + BOTTOM_OFFSET +
+            'px))';
+      } else {
+        tooltip.style.top = top + rect.height + BOTTOM_OFFSET + 'px';
+      }
     },
   };
 })(window);
diff --git a/polygerrit-ui/app/behaviors/gr-tooltip-behavior/gr-tooltip-behavior_test.html b/polygerrit-ui/app/behaviors/gr-tooltip-behavior/gr-tooltip-behavior_test.html
index f442c43..8bca339 100644
--- a/polygerrit-ui/app/behaviors/gr-tooltip-behavior/gr-tooltip-behavior_test.html
+++ b/polygerrit-ui/app/behaviors/gr-tooltip-behavior/gr-tooltip-behavior_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -111,6 +112,24 @@
       assert.equal(tooltip.style.top, '100px');
     });
 
+    test('position to bottom', () => {
+      sandbox.stub(element, 'getBoundingClientRect', () => {
+        return {top: 100, left: 950, width: 50, height: 50};
+      });
+      const tooltip = makeTooltip(
+          {height: 30, width: 120},
+          {top: 0, left: 0, width: 1000});
+
+      element.positionBelow = true;
+      element._positionTooltip(tooltip);
+      assert.isTrue(tooltip.updateStyles.called);
+      const offset = tooltip.updateStyles
+          .lastCall.args[0]['--gr-tooltip-arrow-center-offset'];
+      assert.isAbove(parseFloat(offset.replace(/px$/, '')), 0);
+      assert.equal(tooltip.style.left, '915px');
+      assert.equal(tooltip.style.top, '157.2px');
+    });
+
     test('hides tooltip when detached', () => {
       sandbox.stub(element, '_handleHideTooltip');
       element.remove();
diff --git a/polygerrit-ui/app/behaviors/gr-url-encoding-behavior.html b/polygerrit-ui/app/behaviors/gr-url-encoding-behavior.html
deleted file mode 100644
index 99c7c16..0000000
--- a/polygerrit-ui/app/behaviors/gr-url-encoding-behavior.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!--
-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.
--->
-<script>
-(function(window) {
-  'use strict';
-
-  window.Gerrit = window.Gerrit || {};
-
-  /** @polymerBehavior Gerrit.URLEncodingBehavior */
-  Gerrit.URLEncodingBehavior = {
-    /**
-     * Pretty-encodes a URL. Double-encodes the string, and then replaces
-     *   benevolent characters for legibility.
-     */
-    encodeURL(url, replaceSlashes) {
-      // @see Issue 4255 regarding double-encoding.
-      let output = encodeURIComponent(encodeURIComponent(url));
-      // @see Issue 4577 regarding more readable URLs.
-      output = output.replace(/%253A/g, ':');
-      output = output.replace(/%2520/g, '+');
-      if (replaceSlashes) {
-        output = output.replace(/%252F/g, '/');
-      }
-      return output;
-    },
-  };
-})(window);
-</script>
diff --git a/polygerrit-ui/app/behaviors/gr-url-encoding-behavior/gr-url-encoding-behavior.html b/polygerrit-ui/app/behaviors/gr-url-encoding-behavior/gr-url-encoding-behavior.html
new file mode 100644
index 0000000..69703f6
--- /dev/null
+++ b/polygerrit-ui/app/behaviors/gr-url-encoding-behavior/gr-url-encoding-behavior.html
@@ -0,0 +1,57 @@
+<!--
+@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.
+-->
+<script>
+(function(window) {
+  'use strict';
+
+  window.Gerrit = window.Gerrit || {};
+
+  /** @polymerBehavior Gerrit.URLEncodingBehavior */
+  Gerrit.URLEncodingBehavior = {
+    /**
+     * Pretty-encodes a URL. Double-encodes the string, and then replaces
+     *   benevolent characters for legibility.
+     * @param {string} url
+     * @param {boolean=} replaceSlashes
+     * @return {string}
+     */
+    encodeURL(url, replaceSlashes) {
+      // @see Issue 4255 regarding double-encoding.
+      let output = encodeURIComponent(encodeURIComponent(url));
+      // @see Issue 4577 regarding more readable URLs.
+      output = output.replace(/%253A/g, ':');
+      output = output.replace(/%2520/g, '+');
+      if (replaceSlashes) {
+        output = output.replace(/%252F/g, '/');
+      }
+      return output;
+    },
+
+    /**
+     * Single decode for URL components. Will decode plus signs ('+') to spaces.
+     * Note: because this function decodes once, it is not the inverse of
+     * encodeURL.
+     * @param {string} url
+     * @return {string}
+     */
+    singleDecodeURL(url) {
+      const withoutPlus = url.replace(/\+/g, '%20');
+      return decodeURIComponent(withoutPlus);
+    },
+  };
+})(window);
+</script>
diff --git a/polygerrit-ui/app/behaviors/gr-url-encoding-behavior/gr-url-encoding-behavior_test.html b/polygerrit-ui/app/behaviors/gr-url-encoding-behavior/gr-url-encoding-behavior_test.html
new file mode 100644
index 0000000..73dda1b
--- /dev/null
+++ b/polygerrit-ui/app/behaviors/gr-url-encoding-behavior/gr-url-encoding-behavior_test.html
@@ -0,0 +1,91 @@
+<!DOCTYPE html>
+<!--
+@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.
+-->
+
+<title>gr-url-encoding-behavior</title>
+
+<script src="../../bower_components/webcomponentsjs/webcomponents.min.js"></script>
+<script src="../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../test/common-test-setup.html"/>
+<link rel="import" href="gr-url-encoding-behavior.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <test-element></test-element>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-url-encoding-behavior tests', () => {
+    let element;
+    let sandbox;
+
+    suiteSetup(() => {
+      // Define a Polymer element that uses this behavior.
+      Polymer({
+        is: 'test-element',
+        behaviors: [Gerrit.URLEncodingBehavior],
+      });
+    });
+
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+      element = fixture('basic');
+    });
+
+    teardown(() => {
+      sandbox.restore();
+    });
+
+    suite('encodeURL', () => {
+      test('double encodes', () => {
+        assert.equal(element.encodeURL('abc?123'), 'abc%253F123');
+        assert.equal(element.encodeURL('def/ghi'), 'def%252Fghi');
+        assert.equal(element.encodeURL('jkl'), 'jkl');
+        assert.equal(element.encodeURL(''), '');
+      });
+
+      test('does not convert colons', () => {
+        assert.equal(element.encodeURL('mno:pqr'), 'mno:pqr');
+      });
+
+      test('converts spaces to +', () => {
+        assert.equal(element.encodeURL('words with spaces'), 'words+with+spaces');
+      });
+
+      test('does not convert slashes when configured', () => {
+        assert.equal(element.encodeURL('stu/vwx', true), 'stu/vwx');
+      });
+
+      test('does not convert slashes when configured', () => {
+        assert.equal(element.encodeURL('stu/vwx', true), 'stu/vwx');
+      });
+    });
+
+    suite('singleDecodeUrl', () => {
+      test('single decodes', () => {
+        assert.equal(element.singleDecodeURL('abc%3Fdef'), 'abc?def');
+      });
+
+      test('converts + to space', () => {
+        assert.equal(element.singleDecodeURL('ghi+jkl'), 'ghi jkl');
+      });
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/behaviors/keyboard-shortcut-behavior/keyboard-shortcut-behavior.html b/polygerrit-ui/app/behaviors/keyboard-shortcut-behavior/keyboard-shortcut-behavior.html
index bd996760..af982cf 100644
--- a/polygerrit-ui/app/behaviors/keyboard-shortcut-behavior/keyboard-shortcut-behavior.html
+++ b/polygerrit-ui/app/behaviors/keyboard-shortcut-behavior/keyboard-shortcut-behavior.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -13,6 +14,88 @@
 See the License for the specific language governing permissions and
 limitations under the License.
 -->
+
+<!--
+
+How to Add a Keyboard Shortcut
+==============================
+
+A keyboard shortcut is composed of the following parts:
+
+  1. A semantic identifier (e.g. OPEN_CHANGE, NEXT_PAGE)
+  2. Documentation for the keyboard shortcut help dialog
+  3. A binding between key combos and the semantic identifier
+  4. A binding between the semantic identifier and a listener
+
+Parts (1) and (2) for all shortcuts are defined in this file. The semantic
+identifier is declared in the Shortcut enum near the head of this script:
+
+  const Shortcut = {
+    // ...
+    TOGGLE_LEFT_PANE: 'TOGGLE_LEFT_PANE',
+    // ...
+  };
+
+Immediately following the Shortcut enum definition, there is a _describe
+function defined which is then invoked many times to populate the help dialog.
+Add a new invocation here to document the shortcut:
+
+  _describe(Shortcut.TOGGLE_LEFT_PANE, ShortcutSection.DIFFS,
+      'Hide/show left diff');
+
+When an attached view binds one or more key combos to this shortcut, the help
+dialog will display this text in the given section (in this case, "Diffs"). See
+the ShortcutSection enum immediately below for the list of supported sections.
+
+Part (3), the actual key bindings, are declared by gr-app. In the future, this
+system may be expanded to allow key binding customizations by plugins or user
+preferences. Key bindings are defined in the following forms:
+
+  // Ordinary shortcut with a single binding.
+  this.bindShortcut(
+      this.Shortcut.TOGGLE_LEFT_PANE, 'shift+a');
+
+  // Ordinary shortcut with multiple bindings.
+  this.bindShortcut(
+      this.Shortcut.CURSOR_NEXT_FILE, 'j', 'down');
+
+  // A "go-key" keyboard shortcut, which is combined with a previously and
+  // continuously pressed "go" key (the go-key is hard-coded as 'g').
+  this.bindShortcut(
+      this.Shortcut.GO_TO_OPENED_CHANGES, this.GO_KEY, 'o');
+
+  // A "doc-only" keyboard shortcut. This declares the key-binding for help
+  // dialog purposes, but doesn't actually implement the binding. It is up
+  // to some element to implement this binding using iron-a11y-keys-behavior's
+  // keyBindings property.
+  this.bindShortcut(
+      this.Shortcut.EXPAND_ALL_COMMENT_THREADS, this.DOC_ONLY, 'e');
+
+Part (4), the listener definitions, are declared by the view or element that
+implements the shortcut behavior. This is done by implementing a method named
+keyboardShortcuts() in an element that mixes in this behavior, returning an
+object that maps semantic identifiers (as property names) to listener method
+names, like this:
+
+  keyboardShortcuts() {
+    return {
+      [this.Shortcut.TOGGLE_LEFT_PANE]: '_handleToggleLeftPane',
+    };
+  },
+
+You can implement key bindings in an element that is hosted by a view IF that
+element is always attached exactly once under that view (e.g. the search bar in
+gr-app). When that is not the case, you will have to define a doc-only binding
+in gr-app, declare the shortcut in the view that hosts the element, and use
+iron-a11y-keys-behavior's keyBindings attribute to implement the binding in the
+element. An example of this is in comment threads. A diff view supports actions
+on comment threads, but there may be zero or many comment threads attached at
+any given point. So the shortcut is declared as doc-only by the diff view and
+by gr-app, and actually implemented by gr-diff-comment-thread.
+
+NOTE: doc-only shortcuts will not be customizable in the same way that other
+shortcuts are.
+-->
 <link rel="import" href="../../bower_components/polymer/polymer.html">
 <link rel="import" href="../../bower_components/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html">
 
@@ -20,10 +103,194 @@
 (function(window) {
   'use strict';
 
+  const DOC_ONLY = 'DOC_ONLY';
+  const GO_KEY = 'GO_KEY';
+
+  // The maximum age of a keydown event to be used in a jump navigation. This
+  // is only for cases when the keyup event is lost.
+  const GO_KEY_TIMEOUT_MS = 1000;
+
+  const ShortcutSection = {
+    ACTIONS: 'Actions',
+    DIFFS: 'Diffs',
+    EVERYWHERE: 'Everywhere',
+    FILE_LIST: 'File list',
+    NAVIGATION: 'Navigation',
+    REPLY_DIALOG: 'Reply dialog',
+  };
+
+  const Shortcut = {
+    OPEN_SHORTCUT_HELP_DIALOG: 'OPEN_SHORTCUT_HELP_DIALOG',
+    GO_TO_OPENED_CHANGES: 'GO_TO_OPENED_CHANGES',
+    GO_TO_MERGED_CHANGES: 'GO_TO_MERGED_CHANGES',
+    GO_TO_ABANDONED_CHANGES: 'GO_TO_ABANDONED_CHANGES',
+
+    CURSOR_NEXT_CHANGE: 'CURSOR_NEXT_CHANGE',
+    CURSOR_PREV_CHANGE: 'CURSOR_PREV_CHANGE',
+    OPEN_CHANGE: 'OPEN_CHANGE',
+    NEXT_PAGE: 'NEXT_PAGE',
+    PREV_PAGE: 'PREV_PAGE',
+    TOGGLE_CHANGE_REVIEWED: 'TOGGLE_CHANGE_REVIEWED',
+    TOGGLE_CHANGE_STAR: 'TOGGLE_CHANGE_STAR',
+    REFRESH_CHANGE_LIST: 'REFRESH_CHANGE_LIST',
+
+    OPEN_REPLY_DIALOG: 'OPEN_REPLY_DIALOG',
+    OPEN_DOWNLOAD_DIALOG: 'OPEN_DOWNLOAD_DIALOG',
+    EXPAND_ALL_MESSAGES: 'EXPAND_ALL_MESSAGES',
+    COLLAPSE_ALL_MESSAGES: 'COLLAPSE_ALL_MESSAGES',
+    UP_TO_DASHBOARD: 'UP_TO_DASHBOARD',
+    UP_TO_CHANGE: 'UP_TO_CHANGE',
+    TOGGLE_DIFF_MODE: 'TOGGLE_DIFF_MODE',
+    REFRESH_CHANGE: 'REFRESH_CHANGE',
+    EDIT_TOPIC: 'EDIT_TOPIC',
+
+    NEXT_LINE: 'NEXT_LINE',
+    PREV_LINE: 'PREV_LINE',
+    NEXT_CHUNK: 'NEXT_CHUNK',
+    PREV_CHUNK: 'PREV_CHUNK',
+    EXPAND_ALL_DIFF_CONTEXT: 'EXPAND_ALL_DIFF_CONTEXT',
+    NEXT_COMMENT_THREAD: 'NEXT_COMMENT_THREAD',
+    PREV_COMMENT_THREAD: 'PREV_COMMENT_THREAD',
+    EXPAND_ALL_COMMENT_THREADS: 'EXPAND_ALL_COMMENT_THREADS',
+    COLLAPSE_ALL_COMMENT_THREADS: 'COLLAPSE_ALL_COMMENT_THREADS',
+    LEFT_PANE: 'LEFT_PANE',
+    RIGHT_PANE: 'RIGHT_PANE',
+    TOGGLE_LEFT_PANE: 'TOGGLE_LEFT_PANE',
+    NEW_COMMENT: 'NEW_COMMENT',
+    SAVE_COMMENT: 'SAVE_COMMENT',
+    OPEN_DIFF_PREFS: 'OPEN_DIFF_PREFS',
+    TOGGLE_DIFF_REVIEWED: 'TOGGLE_DIFF_REVIEWED',
+
+    NEXT_FILE: 'NEXT_FILE',
+    PREV_FILE: 'PREV_FILE',
+    NEXT_FILE_WITH_COMMENTS: 'NEXT_FILE_WITH_COMMENTS',
+    PREV_FILE_WITH_COMMENTS: 'PREV_FILE_WITH_COMMENTS',
+    NEXT_UNREVIEWED_FILE: 'NEXT_UNREVIEWED_FILE',
+    CURSOR_NEXT_FILE: 'CURSOR_NEXT_FILE',
+    CURSOR_PREV_FILE: 'CURSOR_PREV_FILE',
+    OPEN_FILE: 'OPEN_FILE',
+    TOGGLE_FILE_REVIEWED: 'TOGGLE_FILE_REVIEWED',
+    TOGGLE_ALL_INLINE_DIFFS: 'TOGGLE_ALL_INLINE_DIFFS',
+    TOGGLE_INLINE_DIFF: 'TOGGLE_INLINE_DIFF',
+
+    OPEN_FIRST_FILE: 'OPEN_FIRST_FILE',
+    OPEN_LAST_FILE: 'OPEN_LAST_FILE',
+
+    SEARCH: 'SEARCH',
+    SEND_REPLY: 'SEND_REPLY',
+  };
+
+  const _help = new Map();
+
+  function _describe(shortcut, section, text) {
+    if (!_help.has(section)) {
+      _help.set(section, []);
+    }
+    _help.get(section).push({shortcut, text});
+  }
+
+  _describe(Shortcut.SEARCH, ShortcutSection.EVERYWHERE, 'Search');
+  _describe(Shortcut.OPEN_SHORTCUT_HELP_DIALOG, ShortcutSection.EVERYWHERE,
+      'Show this dialog');
+  _describe(Shortcut.GO_TO_OPENED_CHANGES, ShortcutSection.EVERYWHERE,
+      'Go to Opened Changes');
+  _describe(Shortcut.GO_TO_MERGED_CHANGES, ShortcutSection.EVERYWHERE,
+      'Go to Merged Changes');
+  _describe(Shortcut.GO_TO_ABANDONED_CHANGES, ShortcutSection.EVERYWHERE,
+      'Go to Abandoned Changes');
+
+  _describe(Shortcut.CURSOR_NEXT_CHANGE, ShortcutSection.ACTIONS,
+      'Select next change');
+  _describe(Shortcut.CURSOR_PREV_CHANGE, ShortcutSection.ACTIONS,
+      'Select previous change');
+  _describe(Shortcut.OPEN_CHANGE, ShortcutSection.ACTIONS,
+      'Show selected change');
+  _describe(Shortcut.NEXT_PAGE, ShortcutSection.ACTIONS, 'Go to next page');
+  _describe(Shortcut.PREV_PAGE, ShortcutSection.ACTIONS, 'Go to previous page');
+  _describe(Shortcut.OPEN_REPLY_DIALOG, ShortcutSection.ACTIONS,
+      'Open reply dialog to publish comments and add reviewers');
+  _describe(Shortcut.OPEN_DOWNLOAD_DIALOG, ShortcutSection.ACTIONS,
+      'Open download overlay');
+  _describe(Shortcut.EXPAND_ALL_MESSAGES, ShortcutSection.ACTIONS,
+      'Expand all messages');
+  _describe(Shortcut.COLLAPSE_ALL_MESSAGES, ShortcutSection.ACTIONS,
+      'Collapse all messages');
+  _describe(Shortcut.REFRESH_CHANGE, ShortcutSection.ACTIONS,
+      'Reload the change at the latest patch');
+  _describe(Shortcut.TOGGLE_CHANGE_REVIEWED, ShortcutSection.ACTIONS,
+      'Mark/unmark change as reviewed');
+  _describe(Shortcut.TOGGLE_FILE_REVIEWED, ShortcutSection.ACTIONS,
+      'Toggle review flag on selected file');
+  _describe(Shortcut.REFRESH_CHANGE_LIST, ShortcutSection.ACTIONS,
+      'Refresh list of changes');
+  _describe(Shortcut.TOGGLE_CHANGE_STAR, ShortcutSection.ACTIONS,
+      'Star/unstar change');
+  _describe(Shortcut.EDIT_TOPIC, ShortcutSection.ACTIONS,
+      'Add a change topic');
+
+  _describe(Shortcut.NEXT_LINE, ShortcutSection.DIFFS, 'Go to next line');
+  _describe(Shortcut.PREV_LINE, ShortcutSection.DIFFS, 'Go to previous line');
+  _describe(Shortcut.NEXT_CHUNK, ShortcutSection.DIFFS,
+      'Go to next diff chunk');
+  _describe(Shortcut.PREV_CHUNK, ShortcutSection.DIFFS,
+      'Go to previous diff chunk');
+  _describe(Shortcut.EXPAND_ALL_DIFF_CONTEXT, ShortcutSection.DIFFS,
+      'Expand all diff context');
+  _describe(Shortcut.NEXT_COMMENT_THREAD, ShortcutSection.DIFFS,
+      'Go to next comment thread');
+  _describe(Shortcut.PREV_COMMENT_THREAD, ShortcutSection.DIFFS,
+      'Go to previous comment thread');
+  _describe(Shortcut.EXPAND_ALL_COMMENT_THREADS, ShortcutSection.DIFFS,
+      'Expand all comment threads');
+  _describe(Shortcut.COLLAPSE_ALL_COMMENT_THREADS, ShortcutSection.DIFFS,
+      'Collapse all comment threads');
+  _describe(Shortcut.LEFT_PANE, ShortcutSection.DIFFS, 'Select left pane');
+  _describe(Shortcut.RIGHT_PANE, ShortcutSection.DIFFS, 'Select right pane');
+  _describe(Shortcut.TOGGLE_LEFT_PANE, ShortcutSection.DIFFS,
+      'Hide/show left diff');
+  _describe(Shortcut.NEW_COMMENT, ShortcutSection.DIFFS, 'Draft new comment');
+  _describe(Shortcut.SAVE_COMMENT, ShortcutSection.DIFFS, 'Save comment');
+  _describe(Shortcut.OPEN_DIFF_PREFS, ShortcutSection.DIFFS,
+      'Show diff preferences');
+  _describe(Shortcut.TOGGLE_DIFF_REVIEWED, ShortcutSection.DIFFS,
+      'Mark/unmark file as reviewed');
+  _describe(Shortcut.TOGGLE_DIFF_MODE, ShortcutSection.DIFFS,
+      'Toggle unified/side-by-side diff');
+  _describe(Shortcut.NEXT_UNREVIEWED_FILE, ShortcutSection.DIFFS,
+      'Mark file as reviewed and go to next unreviewed file');
+
+  _describe(Shortcut.NEXT_FILE, ShortcutSection.NAVIGATION, 'Select next file');
+  _describe(Shortcut.PREV_FILE, ShortcutSection.NAVIGATION,
+      'Select previous file');
+  _describe(Shortcut.NEXT_FILE_WITH_COMMENTS, ShortcutSection.NAVIGATION,
+      'Select next file that has comments');
+  _describe(Shortcut.PREV_FILE_WITH_COMMENTS, ShortcutSection.NAVIGATION,
+      'Select previous file that has comments');
+  _describe(Shortcut.OPEN_FIRST_FILE, ShortcutSection.NAVIGATION,
+      'Show first file');
+  _describe(Shortcut.OPEN_LAST_FILE, ShortcutSection.NAVIGATION,
+      'Show last file');
+  _describe(Shortcut.UP_TO_DASHBOARD, ShortcutSection.NAVIGATION,
+      'Up to dashboard');
+  _describe(Shortcut.UP_TO_CHANGE, ShortcutSection.NAVIGATION, 'Up to change');
+
+  _describe(Shortcut.CURSOR_NEXT_FILE, ShortcutSection.FILE_LIST,
+      'Select next file');
+  _describe(Shortcut.CURSOR_PREV_FILE, ShortcutSection.FILE_LIST,
+      'Select previous file');
+  _describe(Shortcut.OPEN_FILE, ShortcutSection.FILE_LIST,
+      'Go to selected file');
+  _describe(Shortcut.TOGGLE_ALL_INLINE_DIFFS, ShortcutSection.FILE_LIST,
+      'Show/hide all inline diffs');
+  _describe(Shortcut.TOGGLE_INLINE_DIFF, ShortcutSection.FILE_LIST,
+      'Show/hide selected inline diff');
+
+  _describe(Shortcut.SEND_REPLY, ShortcutSection.REPLY_DIALOG, 'Send reply');
+
   // Must be declared outside behavior implementation to be accessed inside
   // behavior functions.
 
-  /** @return {!Object} */
+  /** @return {!(Event|PolymerDomApi|PolymerEventApi)} */
   const getKeyboardEvent = function(e) {
     e = Polymer.dom(e.detail ? e.detail.keyboardEvent : e);
     // When e is a keyboardEvent, e.event is not null.
@@ -31,42 +298,307 @@
     return e;
   };
 
+  class ShortcutManager {
+    constructor() {
+      this.activeHosts = new Map();
+      this.bindings = new Map();
+      this.listeners = new Set();
+    }
+
+    bindShortcut(shortcut, ...bindings) {
+      this.bindings.set(shortcut, bindings);
+    }
+
+    getBindingsForShortcut(shortcut) {
+      return this.bindings.get(shortcut);
+    }
+
+    attachHost(host) {
+      if (!host.keyboardShortcuts) { return; }
+      const shortcuts = host.keyboardShortcuts();
+      this.activeHosts.set(host, new Map(Object.entries(shortcuts)));
+      this.notifyListeners();
+      return shortcuts;
+    }
+
+    detachHost(host) {
+      if (this.activeHosts.delete(host)) {
+        this.notifyListeners();
+        return true;
+      }
+      return false;
+    }
+
+    addListener(listener) {
+      this.listeners.add(listener);
+      listener(this.directoryView());
+    }
+
+    removeListener(listener) {
+      return this.listeners.delete(listener);
+    }
+
+    activeShortcutsBySection() {
+      const activeShortcuts = new Set();
+      this.activeHosts.forEach(shortcuts => {
+        shortcuts.forEach((_, shortcut) => activeShortcuts.add(shortcut));
+      });
+
+      const activeShortcutsBySection = new Map();
+      _help.forEach((shortcutList, section) => {
+        shortcutList.forEach(shortcutHelp => {
+          if (activeShortcuts.has(shortcutHelp.shortcut)) {
+            if (!activeShortcutsBySection.has(section)) {
+              activeShortcutsBySection.set(section, []);
+            }
+            activeShortcutsBySection.get(section).push(shortcutHelp);
+          }
+        });
+      });
+      return activeShortcutsBySection;
+    }
+
+    directoryView() {
+      const view = new Map();
+      this.activeShortcutsBySection().forEach((shortcutHelps, section) => {
+        const sectionView = [];
+        shortcutHelps.forEach(shortcutHelp => {
+          const bindingDesc = this.describeBindings(shortcutHelp.shortcut);
+          if (!bindingDesc) { return; }
+          this.distributeBindingDesc(bindingDesc).forEach(bindingDesc => {
+            sectionView.push({
+              binding: bindingDesc,
+              text: shortcutHelp.text,
+            });
+          });
+        });
+        view.set(section, sectionView);
+      });
+      return view;
+    }
+
+    distributeBindingDesc(bindingDesc) {
+      if (bindingDesc.length === 1 ||
+          this.comboSetDisplayWidth(bindingDesc) < 21) {
+        return [bindingDesc];
+      }
+      // Find the largest prefix of bindings that is under the
+      // size threshold.
+      const head = [bindingDesc[0]];
+      for (let i = 1; i < bindingDesc.length; i++) {
+        head.push(bindingDesc[i]);
+        if (this.comboSetDisplayWidth(head) >= 21) {
+          head.pop();
+          return [head].concat(
+              this.distributeBindingDesc(bindingDesc.slice(i)));
+        }
+      }
+    }
+
+    comboSetDisplayWidth(bindingDesc) {
+      const bindingSizer = binding => binding.reduce(
+          (acc, key) => acc + key.length, 0);
+      // Width is the sum of strings + (n-1) * 2 to account for the word
+      // "or" joining them.
+      return bindingDesc.reduce(
+          (acc, binding) => acc + bindingSizer(binding), 0) +
+          2 * (bindingDesc.length - 1);
+    }
+
+    describeBindings(shortcut) {
+      const bindings = this.bindings.get(shortcut);
+      if (!bindings) { return null; }
+      if (bindings[0] === GO_KEY) {
+        return [['g'].concat(bindings.slice(1))];
+      }
+      return bindings
+          .filter(binding => binding !== DOC_ONLY)
+          .map(binding => this.describeBinding(binding));
+    }
+
+    describeBinding(binding) {
+      return binding.split(':')[0].split('+').map(part => {
+        switch (part) {
+          case 'shift':
+            return 'Shift';
+          case 'meta':
+            return 'Meta';
+          case 'ctrl':
+            return 'Ctrl';
+          case 'enter':
+            return 'Enter';
+          case 'up':
+            return '↑';
+          case 'down':
+            return '↓';
+          case 'left':
+            return '←';
+          case 'right':
+            return '→';
+          default:
+            return part;
+        }
+      });
+    }
+
+    notifyListeners() {
+      const view = this.directoryView();
+      this.listeners.forEach(listener => listener(view));
+    }
+  }
+
+  const shortcutManager = new ShortcutManager();
+
   window.Gerrit = window.Gerrit || {};
 
   /** @polymerBehavior KeyboardShortcutBehavior */
-  Gerrit.KeyboardShortcutBehavior = [{
-    modifierPressed(e) {
-      e = getKeyboardEvent(e);
-      return e.altKey || e.ctrlKey || e.metaKey || e.shiftKey;
-    },
-
-    isModifierPressed(e, modifier) {
-      return getKeyboardEvent(e)[modifier];
-    },
-
-    shouldSuppressKeyboardShortcut(e) {
-      e = getKeyboardEvent(e);
-      const tagName = Polymer.dom(e).rootTarget.tagName;
-      if (tagName === 'INPUT' || tagName === 'TEXTAREA') {
-        return true;
-      }
-      for (let i = 0; e.path && i < e.path.length; i++) {
-        if (e.path[i].tagName === 'GR-OVERLAY') { return true; }
-      }
-      return false;
-    },
-
-    // Alias for getKeyboardEvent.
-    /** @return {!Object} */
-    getKeyboardEvent(e) {
-      return getKeyboardEvent(e);
-    },
-
-    getRootTarget(e) {
-      return Polymer.dom(getKeyboardEvent(e)).rootTarget;
-    },
-  },
+  Gerrit.KeyboardShortcutBehavior = [
     Polymer.IronA11yKeysBehavior,
+    {
+      // Exports for convenience. Note: Closure compiler crashes when
+      // object-shorthand syntax is used here.
+      // eslint-disable-next-line object-shorthand
+      DOC_ONLY: DOC_ONLY,
+      // eslint-disable-next-line object-shorthand
+      GO_KEY: GO_KEY,
+      // eslint-disable-next-line object-shorthand
+      Shortcut: Shortcut,
+
+      properties: {
+        _shortcut_go_key_last_pressed: {
+          type: Number,
+          value: null,
+        },
+
+        _shortcut_go_table: {
+          type: Array,
+          value() { return new Map(); },
+        },
+      },
+
+      modifierPressed(e) {
+        e = getKeyboardEvent(e);
+        return e.altKey || e.ctrlKey || e.metaKey || e.shiftKey;
+      },
+
+      isModifierPressed(e, modifier) {
+        return getKeyboardEvent(e)[modifier];
+      },
+
+      shouldSuppressKeyboardShortcut(e) {
+        e = getKeyboardEvent(e);
+        const tagName = Polymer.dom(e).rootTarget.tagName;
+        if (tagName === 'INPUT' || tagName === 'TEXTAREA' ||
+            (e.keyCode === 13 && tagName === 'A')) {
+          // Suppress shortcuts if the key is 'enter' and target is an anchor.
+          return true;
+        }
+        for (let i = 0; e.path && i < e.path.length; i++) {
+          if (e.path[i].tagName === 'GR-OVERLAY') { return true; }
+        }
+        return false;
+      },
+
+      // Alias for getKeyboardEvent.
+      /** @return {!(Event|PolymerDomApi|PolymerEventApi)} */
+      getKeyboardEvent(e) {
+        return getKeyboardEvent(e);
+      },
+
+      getRootTarget(e) {
+        return Polymer.dom(getKeyboardEvent(e)).rootTarget;
+      },
+
+      bindShortcut(shortcut, ...bindings) {
+        shortcutManager.bindShortcut(shortcut, ...bindings);
+      },
+
+      _addOwnKeyBindings(shortcut, handler) {
+        const bindings = shortcutManager.getBindingsForShortcut(shortcut);
+        if (!bindings) {
+          return;
+        }
+        if (bindings[0] === DOC_ONLY) {
+          return;
+        }
+        if (bindings[0] === GO_KEY) {
+          this._shortcut_go_table.set(bindings[1], handler);
+        } else {
+          this.addOwnKeyBinding(bindings.join(' '), handler);
+        }
+      },
+
+      attached() {
+        const shortcuts = shortcutManager.attachHost(this);
+        if (!shortcuts) { return; }
+
+        for (const key of Object.keys(shortcuts)) {
+          this._addOwnKeyBindings(key, shortcuts[key]);
+        }
+
+        // If any of the shortcuts utilized GO_KEY, then they are handled
+        // directly by this behavior.
+        if (this._shortcut_go_table.size > 0) {
+          this.addOwnKeyBinding('g:keydown', '_handleGoKeyDown');
+          this.addOwnKeyBinding('g:keyup', '_handleGoKeyUp');
+          this._shortcut_go_table.forEach((handler, key) => {
+            this.addOwnKeyBinding(key, '_handleGoAction');
+          });
+        }
+      },
+
+      detached() {
+        if (shortcutManager.detachHost(this)) {
+          this.removeOwnKeyBindings();
+        }
+      },
+
+      keyboardShortcuts() {
+        return {};
+      },
+
+      addKeyboardShortcutDirectoryListener(listener) {
+        shortcutManager.addListener(listener);
+      },
+
+      removeKeyboardShortcutDirectoryListener(listener) {
+        shortcutManager.removeListener(listener);
+      },
+
+      _handleGoKeyDown(e) {
+        if (this.modifierPressed(e)) { return; }
+        this._shortcut_go_key_last_pressed = Date.now();
+      },
+
+      _handleGoKeyUp(e) {
+        this._shortcut_go_key_last_pressed = null;
+      },
+
+      _handleGoAction(e) {
+        if (!this._shortcut_go_key_last_pressed ||
+            (Date.now() - this._shortcut_go_key_last_pressed >
+                GO_KEY_TIMEOUT_MS) ||
+            !this._shortcut_go_table.has(e.detail.key) ||
+            this.shouldSuppressKeyboardShortcut(e)) {
+          return;
+        }
+        e.preventDefault();
+        const handler = this._shortcut_go_table.get(e.detail.key);
+        this[handler](e);
+      },
+    },
   ];
+
+  Gerrit.KeyboardShortcutBinder = {
+    DOC_ONLY,
+    GO_KEY,
+    Shortcut,
+    ShortcutManager,
+    ShortcutSection,
+
+    bindShortcut(shortcut, ...bindings) {
+      shortcutManager.bindShortcut(shortcut, ...bindings);
+    },
+  };
 })(window);
 </script>
diff --git a/polygerrit-ui/app/behaviors/keyboard-shortcut-behavior/keyboard-shortcut-behavior_test.html b/polygerrit-ui/app/behaviors/keyboard-shortcut-behavior/keyboard-shortcut-behavior_test.html
index 6906ea2..dac90f8 100644
--- a/polygerrit-ui/app/behaviors/keyboard-shortcut-behavior/keyboard-shortcut-behavior_test.html
+++ b/polygerrit-ui/app/behaviors/keyboard-shortcut-behavior/keyboard-shortcut-behavior_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -39,6 +40,8 @@
 
 <script>
   suite('keyboard-shortcut-behavior tests', () => {
+    const kb = window.Gerrit.KeyboardShortcutBinder;
+
     let element;
     let overlay;
     let sandbox;
@@ -50,6 +53,7 @@
         behaviors: [Gerrit.KeyboardShortcutBehavior],
         keyBindings: {
           k: '_handleKey',
+          enter: '_handleKey',
         },
         _handleKey() {},
       });
@@ -65,6 +69,228 @@
       sandbox.restore();
     });
 
+    suite('ShortcutManager', () => {
+      test('bindings management', () => {
+        const mgr = new kb.ShortcutManager();
+        const {NEXT_FILE} = kb.Shortcut;
+
+        assert.isUndefined(mgr.getBindingsForShortcut(NEXT_FILE));
+        mgr.bindShortcut(NEXT_FILE, ']', '}', 'right');
+        assert.deepEqual(
+            mgr.getBindingsForShortcut(NEXT_FILE),
+            [']', '}', 'right']);
+      });
+
+      suite('binding descriptions', () => {
+        function mapToObject(m) {
+          const o = {};
+          m.forEach((v, k) => o[k] = v);
+          return o;
+        }
+
+        test('single combo description', () => {
+          const mgr = new kb.ShortcutManager();
+          assert.deepEqual(mgr.describeBinding('a'), ['a']);
+          assert.deepEqual(mgr.describeBinding('a:keyup'), ['a']);
+          assert.deepEqual(mgr.describeBinding('ctrl+a'), ['Ctrl', 'a']);
+          assert.deepEqual(
+              mgr.describeBinding('ctrl+shift+up:keyup'),
+              ['Ctrl', 'Shift', '↑']);
+        });
+
+        test('combo set description', () => {
+          const {GO_KEY, DOC_ONLY, ShortcutManager} = kb;
+          const {GO_TO_OPENED_CHANGES, NEXT_FILE, PREV_FILE} = kb.Shortcut;
+
+          const mgr = new ShortcutManager();
+          assert.isNull(mgr.describeBindings(NEXT_FILE));
+
+          mgr.bindShortcut(GO_TO_OPENED_CHANGES, GO_KEY, 'o');
+          assert.deepEqual(
+              mgr.describeBindings(GO_TO_OPENED_CHANGES),
+              [['g', 'o']]);
+
+          mgr.bindShortcut(NEXT_FILE, DOC_ONLY, ']', 'ctrl+shift+right:keyup');
+          assert.deepEqual(
+              mgr.describeBindings(NEXT_FILE),
+              [[']'], ['Ctrl', 'Shift', '→']]);
+
+          mgr.bindShortcut(PREV_FILE, '[');
+          assert.deepEqual(mgr.describeBindings(PREV_FILE), [['[']]);
+        });
+
+        test('combo set description width', () => {
+          const mgr = new kb.ShortcutManager();
+          assert.strictEqual(mgr.comboSetDisplayWidth([['u']]), 1);
+          assert.strictEqual(mgr.comboSetDisplayWidth([['g', 'o']]), 2);
+          assert.strictEqual(mgr.comboSetDisplayWidth([['Shift', 'r']]), 6);
+          assert.strictEqual(mgr.comboSetDisplayWidth([['x'], ['y']]), 4);
+          assert.strictEqual(
+              mgr.comboSetDisplayWidth([['x'], ['y'], ['Shift', 'z']]),
+              12);
+        });
+
+        test('distribute shortcut help', () => {
+          const mgr = new kb.ShortcutManager();
+          assert.deepEqual(mgr.distributeBindingDesc([['o']]), [[['o']]]);
+          assert.deepEqual(
+              mgr.distributeBindingDesc([['g', 'o']]),
+              [[['g', 'o']]]);
+          assert.deepEqual(
+              mgr.distributeBindingDesc([['ctrl', 'shift', 'meta', 'enter']]),
+              [[['ctrl', 'shift', 'meta', 'enter']]]);
+          assert.deepEqual(
+              mgr.distributeBindingDesc([
+                ['ctrl', 'shift', 'meta', 'enter'],
+                ['o'],
+              ]),
+              [
+                [['ctrl', 'shift', 'meta', 'enter']],
+                [['o']],
+              ]);
+          assert.deepEqual(
+              mgr.distributeBindingDesc([
+                ['ctrl', 'enter'],
+                ['meta', 'enter'],
+                ['ctrl', 's'],
+                ['meta', 's'],
+              ]),
+              [
+                [['ctrl', 'enter'], ['meta', 'enter']],
+                [['ctrl', 's'], ['meta', 's']],
+              ]);
+        });
+
+        test('active shortcuts by section', () => {
+          const {NEXT_FILE, NEXT_LINE, GO_TO_OPENED_CHANGES, SEARCH} =
+              kb.Shortcut;
+          const {DIFFS, EVERYWHERE, NAVIGATION} = kb.ShortcutSection;
+
+          const mgr = new kb.ShortcutManager();
+          mgr.bindShortcut(NEXT_FILE, ']');
+          mgr.bindShortcut(NEXT_LINE, 'j');
+          mgr.bindShortcut(GO_TO_OPENED_CHANGES, 'g+o');
+          mgr.bindShortcut(SEARCH, '/');
+
+          assert.deepEqual(
+              mapToObject(mgr.activeShortcutsBySection()),
+              {});
+
+          mgr.attachHost({
+            keyboardShortcuts() {
+              return {
+                [NEXT_FILE]: null,
+              };
+            },
+          });
+          assert.deepEqual(
+              mapToObject(mgr.activeShortcutsBySection()),
+              {
+                [NAVIGATION]: [
+                  {shortcut: NEXT_FILE, text: 'Select next file'},
+                ],
+              });
+
+          mgr.attachHost({
+            keyboardShortcuts() {
+              return {
+                [NEXT_LINE]: null,
+              };
+            },
+          });
+          assert.deepEqual(
+              mapToObject(mgr.activeShortcutsBySection()),
+              {
+                [DIFFS]: [
+                  {shortcut: NEXT_LINE, text: 'Go to next line'},
+                ],
+                [NAVIGATION]: [
+                  {shortcut: NEXT_FILE, text: 'Select next file'},
+                ],
+              });
+
+          mgr.attachHost({
+            keyboardShortcuts() {
+              return {
+                [SEARCH]: null,
+                [GO_TO_OPENED_CHANGES]: null,
+              };
+            },
+          });
+          assert.deepEqual(
+              mapToObject(mgr.activeShortcutsBySection()),
+              {
+                [DIFFS]: [
+                  {shortcut: NEXT_LINE, text: 'Go to next line'},
+                ],
+                [EVERYWHERE]: [
+                  {shortcut: SEARCH, text: 'Search'},
+                  {
+                    shortcut: GO_TO_OPENED_CHANGES,
+                    text: 'Go to Opened Changes',
+                  },
+                ],
+                [NAVIGATION]: [
+                  {shortcut: NEXT_FILE, text: 'Select next file'},
+                ],
+              });
+        });
+
+        test('directory view', () => {
+          const {
+              NEXT_FILE, NEXT_LINE, GO_TO_OPENED_CHANGES, SEARCH,
+              SAVE_COMMENT,
+          } = kb.Shortcut;
+          const {DIFFS, EVERYWHERE, NAVIGATION} = kb.ShortcutSection;
+          const {GO_KEY, ShortcutManager} = kb;
+
+          const mgr = new ShortcutManager();
+          mgr.bindShortcut(NEXT_FILE, ']');
+          mgr.bindShortcut(NEXT_LINE, 'j');
+          mgr.bindShortcut(GO_TO_OPENED_CHANGES, GO_KEY, 'o');
+          mgr.bindShortcut(SEARCH, '/');
+          mgr.bindShortcut(
+              SAVE_COMMENT, 'ctrl+enter', 'meta+enter', 'ctrl+s', 'meta+s');
+
+          assert.deepEqual(mapToObject(mgr.directoryView()), {});
+
+          mgr.attachHost({
+            keyboardShortcuts() {
+              return {
+                [GO_TO_OPENED_CHANGES]: null,
+                [NEXT_FILE]: null,
+                [NEXT_LINE]: null,
+                [SAVE_COMMENT]: null,
+                [SEARCH]: null,
+              };
+            },
+          });
+          assert.deepEqual(
+              mapToObject(mgr.directoryView()),
+              {
+                [DIFFS]: [
+                  {binding: [['j']], text: 'Go to next line'},
+                  {
+                    binding: [['Ctrl', 'Enter'], ['Meta', 'Enter']],
+                    text: 'Save comment',
+                  },
+                  {
+                    binding: [['Ctrl', 's'], ['Meta', 's']],
+                    text: 'Save comment',
+                  },
+                ],
+                [EVERYWHERE]: [
+                  {binding: [['/']], text: 'Search'},
+                  {binding: [['g', 'o']], text: 'Go to Opened Changes'},
+                ],
+                [NAVIGATION]: [
+                  {binding: [[']']], text: 'Select next file'},
+                ],
+              });
+        });
+      });
+    });
+
     test('doesn’t block kb shortcuts for non-whitelisted els', done => {
       const divEl = document.createElement('div');
       element.appendChild(divEl);
@@ -106,6 +332,17 @@
       MockInteractions.keyDownOn(divEl, 75, null, 'k');
     });
 
+    test('blocks enter shortcut on an anchor', done => {
+      const anchorEl = document.createElement('a');
+      const element = overlay.querySelector('test-element');
+      element.appendChild(anchorEl);
+      element._handleKey = e => {
+        assert.isTrue(element.shouldSuppressKeyboardShortcut(e));
+        done();
+      };
+      MockInteractions.keyDownOn(anchorEl, 13, null, 'enter');
+    });
+
     test('modifierPressed returns accurate values', () => {
       const spy = sandbox.spy(element, 'modifierPressed');
       element._handleKey = e => {
@@ -147,5 +384,56 @@
       MockInteractions.keyDownOn(element, 75, 'alt', 'k');
       assert.isFalse(spy.lastCall.returnValue);
     });
+
+    suite('GO_KEY timing', () => {
+      let handlerStub;
+
+      setup(() => {
+        element._shortcut_go_table.set('a', '_handleA');
+        handlerStub = element._handleA = sinon.stub();
+        sandbox.stub(Date, 'now').returns(10000);
+      });
+
+      test('success', () => {
+        const e = {detail: {key: 'a'}, preventDefault: () => {}};
+        sandbox.stub(element, 'shouldSuppressKeyboardShortcut').returns(false);
+        element._shortcut_go_key_last_pressed = 9000;
+        element._handleGoAction(e);
+        assert.isTrue(handlerStub.calledOnce);
+        assert.strictEqual(handlerStub.lastCall.args[0], e);
+      });
+
+      test('go key not pressed', () => {
+        const e = {detail: {key: 'a'}, preventDefault: () => {}};
+        sandbox.stub(element, 'shouldSuppressKeyboardShortcut').returns(false);
+        element._shortcut_go_key_last_pressed = null;
+        element._handleGoAction(e);
+        assert.isFalse(handlerStub.called);
+      });
+
+      test('go key pressed too long ago', () => {
+        const e = {detail: {key: 'a'}, preventDefault: () => {}};
+        sandbox.stub(element, 'shouldSuppressKeyboardShortcut').returns(false);
+        element._shortcut_go_key_last_pressed = 3000;
+        element._handleGoAction(e);
+        assert.isFalse(handlerStub.called);
+      });
+
+      test('should suppress', () => {
+        const e = {detail: {key: 'a'}, preventDefault: () => {}};
+        sandbox.stub(element, 'shouldSuppressKeyboardShortcut').returns(true);
+        element._shortcut_go_key_last_pressed = 9000;
+        element._handleGoAction(e);
+        assert.isFalse(handlerStub.called);
+      });
+
+      test('unrecognized key', () => {
+        const e = {detail: {key: 'f'}, preventDefault: () => {}};
+        sandbox.stub(element, 'shouldSuppressKeyboardShortcut').returns(false);
+        element._shortcut_go_key_last_pressed = 9000;
+        element._handleGoAction(e);
+        assert.isFalse(handlerStub.called);
+      });
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/behaviors/rest-client-behavior/rest-client-behavior.html b/polygerrit-ui/app/behaviors/rest-client-behavior/rest-client-behavior.html
index a6106e4..2cb00f4 100644
--- a/polygerrit-ui/app/behaviors/rest-client-behavior/rest-client-behavior.html
+++ b/polygerrit-ui/app/behaviors/rest-client-behavior/rest-client-behavior.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -90,6 +91,12 @@
 
       // Set the submittable boolean.
       SUBMITTABLE: 20,
+
+      // If tracking ids are included, include detailed tracking ids info.
+      TRACKING_IDS: 21,
+
+      // Skip mergeability data.
+      SKIP_MERGEABLE: 22,
     },
 
     listChangesOptionsToHex(...args) {
@@ -103,8 +110,9 @@
     /**
      *  @return {string}
      */
-    changeBaseURL(changeNum, patchNum) {
-      let v = this.getBaseUrl() + '/changes/' + changeNum;
+    changeBaseURL(project, changeNum, patchNum) {
+      let v = this.getBaseUrl() + '/changes/' +
+         encodeURIComponent(project) + '~' + changeNum;
       if (patchNum) {
         v += '/revisions/' + patchNum;
       }
@@ -119,19 +127,46 @@
       return status === this.ChangeStatus.NEW;
     },
 
-    changeStatusString(change) {
+    /**
+     * @param {!Object} change
+     * @param {!Object=} opt_options
+     *
+     * @return {!Array}
+     */
+    changeStatuses(change, opt_options) {
       const states = [];
       if (change.status === this.ChangeStatus.MERGED) {
         states.push('Merged');
       } else if (change.status === this.ChangeStatus.ABANDONED) {
         states.push('Abandoned');
-      } else if (change.mergeable === false) {
+      } else if (change.mergeable === false ||
+          (opt_options && opt_options.mergeable === false)) {
         // 'mergeable' prop may not always exist (@see Issue 6819)
         states.push('Merge Conflict');
       }
       if (change.work_in_progress) { states.push('WIP'); }
       if (change.is_private) { states.push('Private'); }
-      return states.join(', ');
+
+      // If there are any pre-defined statuses, only return those. Otherwise,
+      // will determine the derived status.
+      if (states.length || !opt_options) { return states; }
+
+      // If no missing requirements, either active or ready to submit.
+      if (change.submittable && opt_options.submitEnabled) {
+        states.push('Ready to submit');
+      } else {
+        // Otherwise it is active.
+        states.push('Active');
+      }
+      return states;
+    },
+
+    /**
+     * @param {!Object} change
+     * @return {String}
+     */
+    changeStatusString(change) {
+      return this.changeStatuses(change).join(', ');
     },
   },
     Gerrit.BaseUrlBehavior,
diff --git a/polygerrit-ui/app/behaviors/rest-client-behavior/rest-client-behavior_test.html b/polygerrit-ui/app/behaviors/rest-client-behavior/rest-client-behavior_test.html
index 968b855..49d90f0 100644
--- a/polygerrit-ui/app/behaviors/rest-client-behavior/rest-client-behavior_test.html
+++ b/polygerrit-ui/app/behaviors/rest-client-behavior/rest-client-behavior_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -67,8 +68,8 @@
 
     test('changeBaseURL', () => {
       assert.deepEqual(
-          element.changeBaseURL('1', '1'),
-          '/r/changes/1/revisions/1'
+          element.changeBaseURL('test/project', '1', '2'),
+          '/r/changes/test%2Fproject~1/revisions/2'
       );
     });
 
@@ -87,8 +88,43 @@
         labels: {},
         mergeable: true,
       };
-      const status = element.changeStatusString(change);
-      assert.equal(status, '');
+      let statuses = element.changeStatuses(change);
+      const statusString = element.changeStatusString(change);
+      assert.deepEqual(statuses, []);
+      assert.equal(statusString, '');
+
+      change.submittable = false;
+      statuses = element.changeStatuses(change,
+          {includeDerived: true});
+      assert.deepEqual(statuses, ['Active']);
+
+      // With no missing labels but no submitEnabled option.
+      change.submittable = true;
+      statuses = element.changeStatuses(change,
+          {includeDerived: true});
+      assert.deepEqual(statuses, ['Active']);
+
+      // Without missing labels and enabled submit
+      statuses = element.changeStatuses(change,
+          {includeDerived: true, submitEnabled: true});
+      assert.deepEqual(statuses, ['Ready to submit']);
+
+      change.mergeable = false;
+      change.submittable = true;
+      statuses = element.changeStatuses(change,
+          {includeDerived: true});
+      assert.deepEqual(statuses, ['Merge Conflict']);
+
+      delete change.mergeable;
+      change.submittable = true;
+      statuses = element.changeStatuses(change,
+          {includeDerived: true, mergeable: true, submitEnabled: true});
+      assert.deepEqual(statuses, ['Ready to submit']);
+
+      change.submittable = true;
+      statuses = element.changeStatuses(change,
+          {includeDerived: true, mergeable: false});
+      assert.deepEqual(statuses, ['Merge Conflict']);
     });
 
     test('Merge conflict', () => {
@@ -102,8 +138,10 @@
         labels: {},
         mergeable: false,
       };
-      const status = element.changeStatusString(change);
-      assert.equal(status, 'Merge Conflict');
+      const statuses = element.changeStatuses(change);
+      const statusString = element.changeStatusString(change);
+      assert.deepEqual(statuses, ['Merge Conflict']);
+      assert.equal(statusString, 'Merge Conflict');
     });
 
     test('mergeable prop undefined', () => {
@@ -116,8 +154,10 @@
         status: 'NEW',
         labels: {},
       };
-      const status = element.changeStatusString(change);
-      assert.equal(status, '');
+      const statuses = element.changeStatuses(change);
+      const statusString = element.changeStatusString(change);
+      assert.deepEqual(statuses, []);
+      assert.equal(statusString, '');
     });
 
     test('Merged status', () => {
@@ -130,8 +170,10 @@
         status: 'MERGED',
         labels: {},
       };
-      const status = element.changeStatusString(change);
-      assert.equal(status, 'Merged');
+      const statuses = element.changeStatuses(change);
+      const statusString = element.changeStatusString(change);
+      assert.deepEqual(statuses, ['Merged']);
+      assert.equal(statusString, 'Merged');
     });
 
     test('Abandoned status', () => {
@@ -144,8 +186,10 @@
         status: 'ABANDONED',
         labels: {},
       };
-      const status = element.changeStatusString(change);
-      assert.equal(status, 'Abandoned');
+      const statuses = element.changeStatuses(change);
+      const statusString = element.changeStatusString(change);
+      assert.deepEqual(statuses, ['Abandoned']);
+      assert.equal(statusString, 'Abandoned');
     });
 
     test('Open status with private and wip', () => {
@@ -161,8 +205,10 @@
         labels: {},
         mergeable: true,
       };
-      const status = element.changeStatusString(change);
-      assert.equal(status, 'WIP, Private');
+      const statuses = element.changeStatuses(change);
+      const statusString = element.changeStatusString(change);
+      assert.deepEqual(statuses, ['WIP', 'Private']);
+      assert.equal(statusString, 'WIP, Private');
     });
 
     test('Merge conflict with private and wip', () => {
@@ -178,8 +224,10 @@
         labels: {},
         mergeable: false,
       };
-      const status = element.changeStatusString(change);
-      assert.equal(status, 'Merge Conflict, WIP, Private');
+      const statuses = element.changeStatuses(change);
+      const statusString = element.changeStatusString(change);
+      assert.deepEqual(statuses, ['Merge Conflict', 'WIP', 'Private']);
+      assert.equal(statusString, 'Merge Conflict, WIP, Private');
     });
   });
 </script>
diff --git a/polygerrit-ui/app/behaviors/safe-types-behavior/safe-types-behavior.html b/polygerrit-ui/app/behaviors/safe-types-behavior/safe-types-behavior.html
new file mode 100644
index 0000000..68000bc
--- /dev/null
+++ b/polygerrit-ui/app/behaviors/safe-types-behavior/safe-types-behavior.html
@@ -0,0 +1,75 @@
+<!--
+@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.
+-->
+<script>
+(function(window) {
+  'use strict';
+
+  window.Gerrit = window.Gerrit || {};
+
+  /** @polymerBehavior Gerrit.SafeTypes */
+  Gerrit.SafeTypes = {};
+
+  const SAFE_URL_PATTERN = /^(https?:\/\/|mailto:|\/|#)/i;
+
+  /**
+   * Wraps a string to be used as a URL. An error is thrown if the string cannot
+   * be considered safe.
+   * @constructor
+   * @param {string} url the unwrapped, potentially unsafe URL.
+   */
+  Gerrit.SafeTypes.SafeUrl = function(url) {
+    if (!SAFE_URL_PATTERN.test(url)) {
+      throw new Error(`URL not marked as safe: ${url}`);
+    }
+    this._url = url;
+  };
+
+  /**
+   * Get the string representation of the safe URL.
+   * @returns {string}
+   */
+  Gerrit.SafeTypes.SafeUrl.prototype.asString = function() {
+    return this._url;
+  };
+
+  Gerrit.SafeTypes.safeTypesBridge = function(value, type) {
+    // If the value is being bound to a URL, ensure the value is wrapped in the
+    // SafeUrl type first. If the URL is not safe, allow the SafeUrl constructor
+    // to surface the error.
+    if (type === 'URL') {
+      let safeValue = null;
+      if (value instanceof Gerrit.SafeTypes.SafeUrl) {
+        safeValue = value;
+      } else if (typeof value === 'string') {
+        safeValue = new Gerrit.SafeTypes.SafeUrl(value);
+      }
+      if (safeValue) {
+        return safeValue.asString();
+      }
+    }
+
+    // If the value is being bound to a string or a constant, then the string
+    // can be used as is.
+    if (type === 'STRING' || type === 'CONSTANT') {
+      return value;
+    }
+
+    // Otherwise fail.
+    throw new Error(`Refused to bind value as ${type}: ${value}`);
+  };
+})(window);
+</script>
diff --git a/polygerrit-ui/app/behaviors/safe-types-behavior/safe-types-behavior_test.html b/polygerrit-ui/app/behaviors/safe-types-behavior/safe-types-behavior_test.html
new file mode 100644
index 0000000..bc16b39
--- /dev/null
+++ b/polygerrit-ui/app/behaviors/safe-types-behavior/safe-types-behavior_test.html
@@ -0,0 +1,121 @@
+<!DOCTYPE html>
+<!--
+@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.
+-->
+
+<title>safe-types-behavior</title>
+
+<script src="../../bower_components/webcomponentsjs/webcomponents.min.js"></script>
+<script src="../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../test/common-test-setup.html"/>
+<link rel="import" href="safe-types-behavior.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <safe-types-element></safe-types-element>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-tooltip-behavior tests', () => {
+    let element;
+    let sandbox;
+
+    suiteSetup(() => {
+      Polymer({
+        is: 'safe-types-element',
+        behaviors: [Gerrit.SafeTypes],
+      });
+    });
+
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+      element = fixture('basic');
+    });
+
+    teardown(() => {
+      sandbox.restore();
+    });
+
+    test('SafeUrl accepts valid urls', () => {
+      function accepts(url) {
+        const safeUrl = new element.SafeUrl(url);
+        assert.isOk(safeUrl);
+        assert.equal(url, safeUrl.asString());
+      }
+      accepts('http://www.google.com/');
+      accepts('https://www.google.com/');
+      accepts('HtTpS://www.google.com/');
+      accepts('//www.google.com/');
+      accepts('/c/1234/file/path.html@45');
+      accepts('#hash-url');
+      accepts('mailto:name@example.com');
+    });
+
+    test('SafeUrl rejects invalid urls', () => {
+      function rejects(url) {
+        assert.throws(() => { new element.SafeUrl(url); });
+      }
+      rejects('javascript://alert("evil");');
+      rejects('ftp:example.com');
+      rejects('data:text/html,scary business');
+    });
+
+    suite('safeTypesBridge', () => {
+      function acceptsString(value, type) {
+        assert.equal(Gerrit.SafeTypes.safeTypesBridge(value, type),
+            value);
+      }
+
+      function rejects(value, type) {
+        assert.throws(() => { Gerrit.SafeTypes.safeTypesBridge(value, type); });
+      }
+
+      test('accepts valid URL strings', () => {
+        acceptsString('/foo/bar', 'URL');
+        acceptsString('#baz', 'URL');
+      });
+
+      test('rejects invalid URL strings', () => {
+        rejects('javascript://void();', 'URL');
+      });
+
+      test('accepts SafeUrl values', () => {
+        const url = '/abc/123';
+        const safeUrl = new element.SafeUrl(url);
+        assert.equal(Gerrit.SafeTypes.safeTypesBridge(safeUrl, 'URL'), url);
+      });
+
+      test('rejects non-string or non-SafeUrl types', () => {
+        rejects(3.1415926, 'URL');
+      });
+
+      test('accepts any binding to STRING or CONSTANT', () => {
+        acceptsString('foo/bar/baz', 'STRING');
+        acceptsString('lorem ipsum dolor', 'CONSTANT');
+      });
+
+      test('rejects all other types', () => {
+        rejects('foo', 'JAVASCRIPT');
+        rejects('foo', 'HTML');
+        rejects('foo', 'RESOURCE_URL');
+        rejects('foo', 'STYLE');
+      });
+    });
+  });
+</script>
\ No newline at end of file
diff --git a/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section.html b/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section.html
index 529e14c..45bc5f6 100644
--- a/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section.html
+++ b/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -21,6 +22,7 @@
 <link rel="import" href="../../../styles/gr-form-styles.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 <link rel="import" href="../../shared/gr-button/gr-button.html">
+<link rel="import" href="../../shared/gr-icons/gr-icons.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
 <link rel="import" href="../gr-permission/gr-permission.html">
 
@@ -34,17 +36,21 @@
         margin-bottom: 1em;
       }
       fieldset {
-        border: 1px solid #d1d2d3;
+        border: 1px solid var(--border-color);
+      }
+      .name {
+        align-items: center;
+        display: flex;
       }
       .header,
-      .editingRef .editContainer,
       #deletedContainer {
-        align-items: baseline;
-        background: #f6f6f6;
-        border-bottom: 1px dotted #d1d2d3;
+        align-items: center;
+        background: var(--table-header-background-color);
+        border-bottom: 1px dotted var(--border-color);
         display: flex;
         justify-content: space-between;
-        padding: .7em .7em;
+        min-height: 3em;
+        padding: 0 .7em;
       }
       #deletedContainer {
         border-bottom: 0;
@@ -52,53 +58,59 @@
       .sectionContent {
         padding: .7em;
       }
+      #editBtn,
+      .editing #editBtn.global,
       #deletedContainer,
       .deleted #mainContainer,
-      .global,
       #addPermission,
-      #updateBtns,
-      .editingRef .header,
-      .editContainer {
+      #deleteBtn,
+      .editingRef .name,
+      #editRefInput {
         display: none;
       }
-      .deleted #deletedContainer,
-      #mainContainer,
+      .editing #editBtn,
+      .editingRef #editRefInput {
+        display: flex;
+      }
+      .deleted #deletedContainer {
+        display: flex;
+      }
       .editing #addPermission,
-      .editing #updateBtns  {
+      #mainContainer,
+      .editing #deleteBtn  {
         display: block;
       }
-      .editingRef .editContainer {
-        display: flex;
+      .editing #deleteBtn,
+      #undoRemoveBtn {
+        padding-right: .7em;
       }
     </style>
     <style include="gr-form-styles"></style>
     <fieldset id="section"
-        class$="gr-form-styles [[_computeSectionClass(editing, _editingRef, _deleted)]]">
+        class$="gr-form-styles [[_computeSectionClass(editing, canUpload, ownerOf, _editingRef, _deleted)]]">
       <div id="mainContainer">
         <div class="header">
-          <span class="name">
+          <div class="name">
             <h3>[[_computeSectionName(section.id)]]</h3>
-          </span>
-          <div id="updateBtns">
             <gr-button
                 id="editBtn"
+                link
                 class$="[[_computeEditBtnClass(section.id)]]"
-                on-tap="_handleEditReference">Edit Reference</gr-button>
-            <gr-button
-                id="deleteBtn"
-                on-tap="_handleRemoveReference">Remove</gr-button>
-          </div><!-- end updateBtns -->
-        </div><!-- end header -->
-        <div class="editContainer">
+                on-tap="editReference">
+              <iron-icon id="icon" icon="gr-icons:create"></iron-icon>
+            </gr-button>
+          </div>
           <input
               id="editRefInput"
               bind-value="{{section.id}}"
               is="iron-input"
-              type="text">
+              type="text"
+              on-input="_handleValueChange">
           <gr-button
-              id="undoEdit"
-              on-tap="_undoReferenceEdit">Undo</gr-button>
-        </div><!-- end editContainer -->
+              link
+              id="deleteBtn"
+              on-tap="_handleRemoveReference">Remove</gr-button>
+        </div><!-- end header -->
         <div class="sectionContent">
           <template
               is="dom-repeat"
@@ -110,7 +122,8 @@
                 labels="[[labels]]"
                 section="[[section.id]]"
                 editing="[[editing]]"
-                groups="[[groups]]">
+                groups="[[groups]]"
+                on-added-permission-removed="_handleAddedPermissionRemoved">
             </gr-permission>
           </template>
           <div id="addPermission">
@@ -124,13 +137,18 @@
                 <option value="[[item.value.id]]">[[item.value.name]]</option>
               </template>
             </select>
-            <gr-button id="addBtn" on-tap="_handleAddPermission">Add</gr-button>
-          </div><!-- end addPermission -->
+            <gr-button
+                link
+                id="addBtn"
+                on-tap="_handleAddPermission">Add</gr-button>
+          </div>
+          <!-- end addPermission -->
         </div><!-- end sectionContent -->
       </div><!-- end mainContainer -->
       <div id="deletedContainer">
-        [[_computeSectionName(section.id)]] was deleted
+        <span>[[_computeSectionName(section.id)]] was deleted</span>
         <gr-button
+            link
             id="undoRemoveBtn"
             on-tap="_handleUndoRemove">Undo</gr-button>
       </div><!-- end deletedContainer -->
diff --git a/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section.js b/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section.js
index 07a7a62..6fb7b0e 100644
--- a/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section.js
+++ b/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section.js
@@ -1,19 +1,33 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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';
 
+  /**
+   * Fired when the section has been modified or removed.
+   *
+   * @event access-modified
+   */
+
+  /**
+   * Fired when a section that was previously added was removed.
+   * @event added-section-removed
+   */
+
   const GLOBAL_NAME = 'GLOBAL_CAPABILITIES';
 
   // The name that gets automatically input when a new reference is added.
@@ -31,14 +45,17 @@
       section: {
         type: Object,
         notify: true,
-        observer: '_sectionChanged',
+        observer: '_updateSection',
       },
       groups: Object,
       labels: Object,
       editing: {
         type: Boolean,
         value: false,
+        observer: '_handleEditingChanged',
       },
+      canUpload: Boolean,
+      ownerOf: Array,
       _originalId: String,
       _editingRef: {
         type: Boolean,
@@ -55,11 +72,53 @@
       Gerrit.AccessBehavior,
     ],
 
-    _sectionChanged(section) {
+    listeners: {
+      'access-saved': '_handleAccessSaved',
+    },
+
+    _updateSection(section) {
       this._permissions = this.toSortedArray(section.value.permissions);
       this._originalId = section.id;
     },
 
+    _handleAccessSaved() {
+      // Set a new 'original' value to keep track of after the value has been
+      // saved.
+      this._updateSection(this.section);
+    },
+
+    _handleValueChange() {
+      if (!this.section.value.added) {
+        this.section.value.modified = this.section.id !== this._originalId;
+        // Allows overall access page to know a change has been made.
+        // For a new section, this is not fired because new permissions and
+        // rules have to be added in order to save, modifying the ref is not
+        // enough.
+        this.dispatchEvent(new CustomEvent('access-modified', {bubbles: true}));
+      }
+      this.section.value.updatedId = this.section.id;
+    },
+
+    _handleEditingChanged(editing, editingOld) {
+      // Ignore when editing gets set initially.
+      if (!editingOld) { return; }
+      // Restore original values if no longer editing.
+      if (!editing) {
+        this._editingRef = false;
+        this._deleted = false;
+        delete this.section.value.deleted;
+        // Restore section ref.
+        this.set(['section', 'id'], this._originalId);
+        // Remove any unsaved but added permissions.
+        this._permissions = this._permissions.filter(p => !p.value.added);
+        for (const key of Object.keys(this.section.value.permissions)) {
+          if (this.section.value.permissions[key].added) {
+            delete this.section.value.permissions[key];
+          }
+        }
+      }
+    },
+
     _computePermissions(name, capabilities, labels) {
       let allPermissions;
       if (name === GLOBAL_NAME) {
@@ -74,6 +133,16 @@
       });
     },
 
+    _computeHideEditClass(section) {
+      return section.id === 'GLOBAL_CAPABILITIES' ? 'hide' : '';
+    },
+
+    _handleAddedPermissionRemoved(e) {
+      const index = e.model.index;
+      this._permissions = this._permissions.slice(0, index).concat(
+          this._permissions.slice(index + 1, this._permissions.length));
+    },
+
     _computeLabelOptions(labels) {
       const labelOptions = [];
       for (const labelName of Object.keys(labels)) {
@@ -128,8 +197,13 @@
     },
 
     _handleRemoveReference() {
+      if (this.section.value.added) {
+        this.dispatchEvent(new CustomEvent('added-section-removed',
+            {bubbles: true}));
+      }
       this._deleted = true;
-      this.set('section.value.deleted', true);
+      this.section.value.deleted = true;
+      this.dispatchEvent(new CustomEvent('access-modified', {bubbles: true}));
     },
 
     _handleUndoRemove() {
@@ -137,18 +211,18 @@
       delete this.section.value.deleted;
     },
 
-    _handleEditReference() {
+    editReference() {
       this._editingRef = true;
+      this.$.editRefInput.focus();
     },
 
-    _undoReferenceEdit() {
-      this._editingRef = false;
-      this.set('section.id', this._originalId);
+    _isEditEnabled(canUpload, ownerOf, sectionId) {
+      return canUpload || ownerOf.indexOf(sectionId) >= 0;
     },
 
-    _computeSectionClass(editing, editingRef, deleted) {
+    _computeSectionClass(editing, canUpload, ownerOf, editingRef, deleted) {
       const classList = [];
-      if (editing) {
+      if (editing && this._isEditEnabled(canUpload, ownerOf, this.section.id)) {
         classList.push('editing');
       }
       if (editingRef) {
@@ -168,7 +242,7 @@
       const value = this.$.permissionSelect.value;
       const permission = {
         id: value,
-        value: {rules: {}},
+        value: {rules: {}, added: true},
       };
 
       // This is needed to update the 'label' property of the
@@ -197,4 +271,4 @@
           permission.value);
     },
   });
-})();
\ No newline at end of file
+})();
diff --git a/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section_test.html b/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section_test.html
index 38c5d67..21a426f 100644
--- a/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section_test.html
+++ b/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -88,12 +89,12 @@
             default_value: 0,
           },
         };
-        element._sectionChanged(element.section);
+        element._updateSection(element.section);
         flushAsynchronousOperations();
       });
 
-      test('_sectionChanged', () => {
-        // _sectionChanged was called in setup, so just make assertions.
+      test('_updateSection', () => {
+        // _updateSection was called in setup, so just make assertions.
         const expectedPermissions = [
           {
             id: 'read',
@@ -128,6 +129,13 @@
             expectedLabelOptions);
       });
 
+      test('_handleAccessSaved', () => {
+        assert.equal(element._originalId, 'refs/*');
+        element.section.id = 'refs/for/bar';
+        element._handleAccessSaved();
+        assert.equal(element._originalId, 'refs/for/bar');
+      });
+
       test('_computePermissions', () => {
         sandbox.stub(element, 'toSortedArray').returns(
             [{
@@ -257,42 +265,44 @@
         assert.isFalse(element._editingRef);
       });
 
-      test('_handleEditReference', () => {
-        element._handleEditReference();
+      test('editReference', () => {
+        element.editReference();
         assert.isTrue(element._editingRef);
       });
 
-      test('_undoReferenceEdit', () => {
-        element._originalId = 'refs/for/old';
-        element.section.id = 'refs/for/new';
-        element.editing = true;
-        element._undoReferenceEdit();
-        assert.isFalse(element._editingRef);
-        assert.equal(element.section.id, 'refs/for/old');
-      });
-
       test('_computeSectionClass', () => {
         let editingRef = false;
+        let canUpload = false;
+        let ownerOf = [];
         let editing = false;
         let deleted = false;
-        assert.equal(element._computeSectionClass(editing, editingRef, deleted),
-            '');
+        assert.equal(element._computeSectionClass(editing, canUpload, ownerOf,
+            editingRef, deleted), '');
 
         editing = true;
-        assert.equal(element._computeSectionClass(editing, editingRef, deleted),
-            'editing');
+        assert.equal(element._computeSectionClass(editing, canUpload, ownerOf,
+            editingRef, deleted), '');
+
+        ownerOf = ['refs/*'];
+        assert.equal(element._computeSectionClass(editing, canUpload, ownerOf,
+            editingRef, deleted), 'editing');
+
+        ownerOf = [];
+        canUpload = true;
+        assert.equal(element._computeSectionClass(editing, canUpload, ownerOf,
+            editingRef, deleted), 'editing');
 
         editingRef = true;
-        assert.equal(element._computeSectionClass(editing, editingRef, deleted),
-            'editing editingRef');
+        assert.equal(element._computeSectionClass(editing, canUpload, ownerOf,
+            editingRef, deleted), 'editing editingRef');
 
         deleted = true;
-        assert.equal(element._computeSectionClass(editing, editingRef, deleted),
-            'editing editingRef deleted');
+        assert.equal(element._computeSectionClass(editing, canUpload, ownerOf,
+            editingRef, deleted), 'editing editingRef deleted');
 
         editingRef = false;
-        assert.equal(element._computeSectionClass(editing, editingRef, deleted),
-            'editing deleted');
+        assert.equal(element._computeSectionClass(editing, canUpload, ownerOf,
+            editingRef, deleted), 'editing deleted');
       });
 
       test('_computeEditBtnClass', () => {
@@ -348,7 +358,7 @@
               name: 'Create Account',
             },
           };
-          element._sectionChanged(element.section);
+          element._updateSection(element.section);
           flushAsynchronousOperations();
         });
 
@@ -356,6 +366,10 @@
           assert.isFalse(element.$.section.classList.contains('editing'));
           assert.isFalse(element.$.section.classList.contains('deleted'));
           assert.isTrue(element.$.editBtn.classList.contains('global'));
+          element.editing = true;
+          element.canUpload = true;
+          element.ownerOf = [];
+          assert.equal(getComputedStyle(element.$.editBtn).display, 'none');
         });
       });
 
@@ -372,7 +386,7 @@
             },
           };
           element.capabilities = {};
-          element._sectionChanged(element.section);
+          element._updateSection(element.section);
           flushAsynchronousOperations();
         });
 
@@ -380,9 +394,15 @@
           assert.isFalse(element.$.section.classList.contains('editing'));
           assert.isFalse(element.$.section.classList.contains('deleted'));
           assert.isFalse(element.$.editBtn.classList.contains('global'));
+          element.editing = true;
+          element.canUpload = true;
+          element.ownerOf = [];
+          flushAsynchronousOperations();
+          assert.notEqual(getComputedStyle(element.$.editBtn).display, 'none');
         });
 
         test('add permission', () => {
+          element.editing = true;
           element.$.permissionSelect.value = 'label-Code-Review';
           assert.equal(element._permissions.length, 1);
           assert.equal(Object.keys(element.section.value.permissions).length,
@@ -396,6 +416,7 @@
           let permission = {
             id: 'label-Code-Review',
             value: {
+              added: true,
               label: 'Code-Review',
               rules: {},
             },
@@ -408,7 +429,6 @@
               element.section.value.permissions['label-Code-Review'],
               permission.value);
 
-
           element.$.permissionSelect.value = 'abandon';
           MockInteractions.tap(element.$.addBtn);
           flushAsynchronousOperations();
@@ -416,6 +436,7 @@
           permission = {
             id: 'abandon',
             value: {
+              added: true,
               rules: {},
             },
           };
@@ -426,9 +447,18 @@
               3);
           assert.deepEqual(element.section.value.permissions['abandon'],
               permission.value);
+
+          // Unsaved changes are discarded when editing is cancelled.
+          element.editing = false;
+          assert.equal(element._permissions.length, 1);
+          assert.equal(Object.keys(element.section.value.permissions).length,
+              1);
         });
 
         test('edit section reference', () => {
+          element.canUpload = true;
+          element.ownerOf = [];
+          element.section = {id: 'refs/for/bar', value: {permissions: {}}};
           assert.isFalse(element.$.section.classList.contains('editing'));
           element.editing = true;
           assert.isTrue(element.$.section.classList.contains('editing'));
@@ -439,19 +469,49 @@
           assert.equal(element.section.id, 'new/ref');
           assert.isTrue(element._editingRef);
           assert.isTrue(element.$.section.classList.contains('editingRef'));
-          MockInteractions.tap(element.$.undoEdit);
-          flushAsynchronousOperations();
+          element.editing = false;
           assert.isFalse(element._editingRef);
-          assert.isFalse(element.$.section.classList.contains('editingRef'));
-          assert.equal(element.section.id, 'refs/*');
+          assert.equal(element.section.id, 'refs/for/bar');
+        });
+
+        test('_handleValueChange', () => {
+          // For an exising section.
+          const modifiedHandler = sandbox.stub();
+          element.section = {id: 'refs/for/bar', value: {permissions: {}}};
+          assert.notOk(element.section.value.updatedId);
+          element.section.id = 'refs/for/baz';
+          element.addEventListener('access-modified', modifiedHandler);
+          assert.isNotOk(element.section.value.modified);
+          element._handleValueChange();
+          assert.equal(element.section.value.updatedId, 'refs/for/baz');
+          assert.isTrue(element.section.value.modified);
+          assert.equal(modifiedHandler.callCount, 1);
+          element.section.id = 'refs/for/bar';
+          element._handleValueChange();
+          assert.isFalse(element.section.value.modified);
+          assert.equal(modifiedHandler.callCount, 2);
+
+          // For a new section.
+          element.section.value.added = true;
+          element._handleValueChange();
+          assert.isFalse(element.section.value.modified);
+          assert.equal(modifiedHandler.callCount, 2);
+          element.section.id = 'refs/for/bar';
+          element._handleValueChange();
+          assert.isFalse(element.section.value.modified);
+          assert.equal(modifiedHandler.callCount, 2);
         });
 
         test('remove section', () => {
           element.editing = true;
+          element.canUpload = true;
+          element.ownerOf = [];
           assert.isFalse(element._deleted);
+          assert.isNotOk(element.section.value.deleted);
           MockInteractions.tap(element.$.deleteBtn);
           flushAsynchronousOperations();
           assert.isTrue(element._deleted);
+          assert.isTrue(element.section.value.deleted);
           assert.isTrue(element.$.section.classList.contains('deleted'));
           assert.isTrue(element.section.value.deleted);
 
@@ -459,6 +519,30 @@
           flushAsynchronousOperations();
           assert.isFalse(element._deleted);
           assert.isNotOk(element.section.value.deleted);
+
+          MockInteractions.tap(element.$.deleteBtn);
+          assert.isTrue(element._deleted);
+          assert.isTrue(element.section.value.deleted);
+          element.editing = false;
+          assert.isFalse(element._deleted);
+          assert.isNotOk(element.section.value.deleted);
+        });
+
+        test('removing an added permission', () => {
+          element.editing = true;
+          assert.equal(element._permissions.length, 1);
+          element.$$('gr-permission').fire('added-permission-removed');
+          flushAsynchronousOperations();
+          assert.equal(element._permissions.length, 0);
+        });
+
+        test('remove an added section', () => {
+          const removeStub = sandbox.stub();
+          element.addEventListener('added-section-removed', removeStub);
+          element.editing = true;
+          element.section.value.added = true;
+          MockInteractions.tap(element.$.deleteBtn);
+          assert.isTrue(removeStub.called);
         });
       });
     });
diff --git a/polygerrit-ui/app/elements/admin/gr-admin-group-list/gr-admin-group-list.html b/polygerrit-ui/app/elements/admin/gr-admin-group-list/gr-admin-group-list.html
index efacb1e..ea08d89 100644
--- a/polygerrit-ui/app/elements/admin/gr-admin-group-list/gr-admin-group-list.html
+++ b/polygerrit-ui/app/elements/admin/gr-admin-group-list/gr-admin-group-list.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -20,7 +21,8 @@
 <link rel="import" href="../../../bower_components/iron-input/iron-input.html">
 <link rel="import" href="../../../styles/gr-table-styles.html">
 <link rel="import" href="../../../styles/shared-styles.html">
-<link rel="import" href="../../shared/gr-confirm-dialog/gr-confirm-dialog.html">
+<link rel="import" href="../../core/gr-navigation/gr-navigation.html">
+<link rel="import" href="../../shared/gr-dialog/gr-dialog.html">
 <link rel="import" href="../../shared/gr-list-view/gr-list-view.html">
 <link rel="import" href="../../shared/gr-overlay/gr-overlay.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
@@ -62,23 +64,24 @@
       </table>
     </gr-list-view>
     <gr-overlay id="createOverlay" with-backdrop>
-      <gr-confirm-dialog
+      <gr-dialog
           id="createDialog"
           class="confirmDialog"
           disabled="[[!_hasNewGroupName]]"
           confirm-label="Create"
+          confirm-on-enter
           on-confirm="_handleCreateGroup"
           on-cancel="_handleCloseCreate">
-        <div class="header">
+        <div class="header" slot="header">
           Create Group
         </div>
-        <div class="main">
+        <div class="main" slot="main">
           <gr-create-group-dialog
               has-new-group-name="{{_hasNewGroupName}}"
               params="[[params]]"
               id="createNewModal"></gr-create-group-dialog>
         </div>
-      </gr-confirm-dialog>
+      </gr-dialog>
     </gr-overlay>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
   </template>
diff --git a/polygerrit-ui/app/elements/admin/gr-admin-group-list/gr-admin-group-list.js b/polygerrit-ui/app/elements/admin/gr-admin-group-list/gr-admin-group-list.js
index 72439e2..1f5457a 100644
--- a/polygerrit-ui/app/elements/admin/gr-admin-group-list/gr-admin-group-list.js
+++ b/polygerrit-ui/app/elements/admin/gr-admin-group-list/gr-admin-group-list.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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';
 
@@ -93,7 +96,7 @@
     },
 
     _computeGroupUrl(id) {
-      return this.getUrl(this._path + '/', id);
+      return Gerrit.Nav.getUrlForGroup(id);
     },
 
     _getCreateGroupCapability() {
@@ -125,8 +128,16 @@
           });
     },
 
+    _refreshGroupsList() {
+      this.$.restAPI.invalidateGroupsCache();
+      return this._getGroups(this._filter, this._groupsPerPage,
+          this._offset);
+    },
+
     _handleCreateGroup() {
-      this.$.createNewModal.handleCreateGroup();
+      this.$.createNewModal.handleCreateGroup().then(() => {
+        this._refreshGroupsList();
+      });
     },
 
     _handleCloseCreate() {
diff --git a/polygerrit-ui/app/elements/admin/gr-admin-group-list/gr-admin-group-list_test.html b/polygerrit-ui/app/elements/admin/gr-admin-group-list/gr-admin-group-list_test.html
index 06428c7..065a757 100644
--- a/polygerrit-ui/app/elements/admin/gr-admin-group-list/gr-admin-group-list_test.html
+++ b/polygerrit-ui/app/elements/admin/gr-admin-group-list/gr-admin-group-list_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view.html b/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view.html
index 951df45..b6a6d27 100644
--- a/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view.html
+++ b/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,29 +18,65 @@
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
 
 <link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
-<link rel="import" href="../../../behaviors/gr-url-encoding-behavior.html">
+<link rel="import" href="../../../behaviors/gr-admin-nav-behavior/gr-admin-nav-behavior.html">
+<link rel="import" href="../../../behaviors/gr-url-encoding-behavior/gr-url-encoding-behavior.html">
 <link rel="import" href="../../../styles/gr-menu-page-styles.html">
 <link rel="import" href="../../../styles/gr-page-nav-styles.html">
 <link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../../core/gr-navigation/gr-navigation.html">
+<link rel="import" href="../../shared/gr-dropdown-list/gr-dropdown-list.html">
+<link rel="import" href="../../shared/gr-icons/gr-icons.html">
+<link rel="import" href="../../shared/gr-js-api-interface/gr-js-api-interface.html">
 <link rel="import" href="../../shared/gr-page-nav/gr-page-nav.html">
-<link rel="import" href="../../shared/gr-placeholder/gr-placeholder.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
 <link rel="import" href="../gr-admin-group-list/gr-admin-group-list.html">
 <link rel="import" href="../gr-group/gr-group.html">
 <link rel="import" href="../gr-group-audit-log/gr-group-audit-log.html">
 <link rel="import" href="../gr-group-members/gr-group-members.html">
 <link rel="import" href="../gr-plugin-list/gr-plugin-list.html">
-<link rel="import" href="../gr-project/gr-project.html">
-<link rel="import" href="../gr-project-access/gr-project-access.html">
-<link rel="import" href="../gr-project-commands/gr-project-commands.html">
-<link rel="import" href="../gr-project-detail-list/gr-project-detail-list.html">
-<link rel="import" href="../gr-project-list/gr-project-list.html">
+<link rel="import" href="../gr-repo/gr-repo.html">
+<link rel="import" href="../gr-repo-access/gr-repo-access.html">
+<link rel="import" href="../gr-repo-commands/gr-repo-commands.html">
+<link rel="import" href="../gr-repo-dashboards/gr-repo-dashboards.html">
+<link rel="import" href="../gr-repo-detail-list/gr-repo-detail-list.html">
+<link rel="import" href="../gr-repo-list/gr-repo-list.html">
 
 <dom-module id="gr-admin-view">
   <template>
     <style include="shared-styles"></style>
     <style include="gr-menu-page-styles"></style>
-    <style include="gr-page-nav-styles"></style>
+    <style include="gr-page-nav-styles">
+      gr-dropdown-list {
+        --trigger-style: {
+          text-transform: none;
+        }
+      }
+      .breadcrumbText {
+        /* Same as dropdown trigger so chevron spacing is consistent. */
+        padding: 5px 4px;
+      }
+      iron-icon {
+        margin: 0 .2em;
+      }
+      .breadcrumb {
+        align-items: center;
+        display: flex;
+      }
+      .mainHeader {
+        align-items: baseline;
+        border-bottom: 1px solid var(--border-color);
+        display: flex;
+      }
+      .selectText {
+        display: none;
+      }
+      .selectText.show {
+        display: inline-block;
+      }
+      main.breadcrumbs:not(.table) {
+        margin-top: 1em;
+      }
+    </style>
     <gr-page-nav class="navStyles">
       <ul class="sectionContent">
         <template id="adminNav" is="dom-repeat" items="[[_filteredLinks]]">
@@ -71,27 +108,24 @@
         </template>
       </ul>
     </gr-page-nav>
-    <template is="dom-if" if="[[_showProjectList]]" restamp="true">
+    <template is="dom-if" if="[[_subsectionLinks.length]]">
+      <section class="mainHeader">
+        <span class="breadcrumb">
+          <span class="breadcrumbText">[[_breadcrumbParentName]]</span>
+          <iron-icon icon="gr-icons:chevron-right"></iron-icon>
+        </span>
+        <gr-dropdown-list
+            lowercase
+            id="pageSelect"
+            value="[[_computeSelectValue(params)]]"
+            items="[[_subsectionLinks]]"
+            on-value-change="_handleSubsectionChange">
+        </gr-dropdown-list>
+      </section>
+    </template>
+    <template is="dom-if" if="[[_showRepoList]]" restamp="true">
       <main class="table">
-        <gr-project-list class="table" params="[[params]]"></gr-project-list>
-      </main>
-    </template>
-    <template is="dom-if" if="[[_showProjectMain]]" restamp="true">
-      <main>
-        <gr-project project="[[params.project]]"></gr-project>
-      </main>
-    </template>
-    <template is="dom-if" if="[[_showGroup]]" restamp="true">
-      <main>
-        <gr-group
-            group-id="[[params.groupId]]"
-            on-name-changed="_updateGroupName"></gr-group>
-      </main>
-    </template>
-    <template is="dom-if" if="[[_showGroupMembers]]" restamp="true">
-      <main>
-        <gr-group-members
-            group-id="[[params.groupId]]"></gr-group-members>
+        <gr-repo-list class="table" params="[[params]]"></gr-repo-list>
       </main>
     </template>
     <template is="dom-if" if="[[_showGroupList]]" restamp="true">
@@ -105,37 +139,58 @@
         <gr-plugin-list class="table" params="[[params]]"></gr-plugin-list>
       </main>
     </template>
-    <template is="dom-if" if="[[_showProjectDetailList]]" restamp="true">
-      <main class="table">
-        <gr-project-detail-list
+    <template is="dom-if" if="[[_showRepoMain]]" restamp="true">
+      <main class="breadcrumbs">
+        <gr-repo repo="[[params.repo]]"></gr-repo>
+      </main>
+    </template>
+    <template is="dom-if" if="[[_showGroup]]" restamp="true">
+      <main class="breadcrumbs">
+        <gr-group
+            group-id="[[params.groupId]]"
+            on-name-changed="_updateGroupName"></gr-group>
+      </main>
+    </template>
+    <template is="dom-if" if="[[_showGroupMembers]]" restamp="true">
+      <main class="breadcrumbs">
+        <gr-group-members
+            group-id="[[params.groupId]]"></gr-group-members>
+      </main>
+    </template>
+    <template is="dom-if" if="[[_showRepoDetailList]]" restamp="true">
+      <main class="table breadcrumbs">
+        <gr-repo-detail-list
             params="[[params]]"
-            class="table"></gr-project-detail-list>
+            class="table"></gr-repo-detail-list>
       </main>
     </template>
     <template is="dom-if" if="[[_showGroupAuditLog]]" restamp="true">
-      <main class="table">
+      <main class="table breadcrumbs">
         <gr-group-audit-log
             group-id="[[params.groupId]]"
             class="table"></gr-group-audit-log>
       </main>
     </template>
-    <template is="dom-if" if="[[_showProjectCommands]]" restamp="true">
-      <main>
-        <gr-project-commands
-            project="[[params.project]]"></gr-project-commands>
+    <template is="dom-if" if="[[_showRepoCommands]]" restamp="true">
+      <main class="breadcrumbs">
+        <gr-repo-commands
+            repo="[[params.repo]]"></gr-repo-commands>
       </main>
     </template>
-    <template is="dom-if" if="[[_showProjectAccess]]" restamp="true">
-      <main class="table">
-        <gr-project-access
+    <template is="dom-if" if="[[_showRepoAccess]]" restamp="true">
+      <main class="breadcrumbs">
+        <gr-repo-access
             path="[[path]]"
-            project="[[params.project]]"></gr-project-access>
+            repo="[[params.repo]]"></gr-repo-access>
       </main>
     </template>
-    <template is="dom-if" if="[[params.placeholder]]" restamp="true">
-      <gr-placeholder title="Admin" path="[[path]]"></gr-placeholder>
+    <template is="dom-if" if="[[_showRepoDashboards]]" restamp="true">
+      <main class="table breadcrumbs">
+        <gr-repo-dashboards repo="[[params.repo]]"></gr-repo-dashboards>
+      </main>
     </template>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
+    <gr-js-api-interface id="jsAPI"></gr-js-api-interface>
   </template>
   <script src="gr-admin-view.js"></script>
 </dom-module>
diff --git a/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view.js b/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view.js
index ae28a05..3d430c2 100644
--- a/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view.js
+++ b/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view.js
@@ -1,40 +1,24 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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 ADMIN_LINKS = [{
-    name: 'Projects',
-    url: '/admin/projects',
-    view: 'gr-project-list',
-    viewableToAll: true,
-    children: [],
-  }, {
-    name: 'Groups',
-    section: 'Groups',
-    url: '/admin/groups',
-    view: 'gr-admin-group-list',
-    children: [],
-  }, {
-    name: 'Plugins',
-    capability: 'viewPlugins',
-    section: 'Plugins',
-    url: '/admin/plugins',
-    view: 'gr-plugin-list',
-  }];
 
-  const ACCOUNT_CAPABILITIES = ['createProject', 'createGroup', 'viewPlugins'];
+  const INTERNAL_GROUP_REGEX = /^[\da-f]{40}$/;
 
   Polymer({
     is: 'gr-admin-view',
@@ -45,16 +29,19 @@
       path: String,
       adminView: String,
 
-      _projectName: String,
+      _breadcrumbParentName: String,
+      _repoName: String,
       _groupId: {
         type: Number,
         observer: '_computeGroupName',
       },
+      _groupIsInternal: Boolean,
       _groupName: String,
       _groupOwner: {
         type: Boolean,
         value: false,
       },
+      _subsectionLinks: Array,
       _filteredLinks: Array,
       _showDownload: {
         type: Boolean,
@@ -68,15 +55,17 @@
       _showGroupAuditLog: Boolean,
       _showGroupList: Boolean,
       _showGroupMembers: Boolean,
-      _showProjectCommands: Boolean,
-      _showProjectMain: Boolean,
-      _showProjectList: Boolean,
-      _showProjectDetailList: Boolean,
+      _showRepoAccess: Boolean,
+      _showRepoCommands: Boolean,
+      _showRepoDashboards: Boolean,
+      _showRepoDetailList: Boolean,
+      _showRepoMain: Boolean,
+      _showRepoList: Boolean,
       _showPluginList: Boolean,
-      _showProjectAccess: Boolean,
     },
 
     behaviors: [
+      Gerrit.AdminNavBehavior,
       Gerrit.BaseUrlBehavior,
       Gerrit.URLEncodingBehavior,
     ],
@@ -90,126 +79,126 @@
     },
 
     reload() {
-      return this.$.restAPI.getAccount().then(account => {
-        this._account = account;
-        if (!account) {
-          // Return so that  account capabilities don't load with no account.
-          return this._filteredLinks = this._filterLinks(link => {
-            return link.viewableToAll;
-          });
+      const promises = [
+        this.$.restAPI.getAccount(),
+        Gerrit.awaitPluginsLoaded(),
+      ];
+      return Promise.all(promises).then(result => {
+        this._account = result[0];
+        let options;
+        if (this._repoName) {
+          options = {repoName: this._repoName};
+        } else if (this._groupId) {
+          options = {
+            groupId: this._groupId,
+            groupName: this._groupName,
+            groupIsInternal: this._groupIsInternal,
+            isAdmin: this._isAdmin,
+            groupOwner: this._groupOwner,
+          };
         }
-        this._loadAccountCapabilities();
+
+        return this.getAdminLinks(this._account,
+            this.$.restAPI.getAccountCapabilities.bind(this.$.restAPI),
+            this.$.jsAPI.getAdminMenuLinks.bind(this.$.jsAPI),
+            options)
+            .then(res => {
+              this._filteredLinks = res.links;
+              this._breadcrumbParentName = res.expandedSection ?
+                  res.expandedSection.name : '';
+
+              if (!res.expandedSection) {
+                this._subsectionLinks = [];
+                return;
+              }
+              this._subsectionLinks = [res.expandedSection]
+              .concat(res.expandedSection.children).map(section => {
+                return {
+                  text: !section.detailType ? 'Home' : section.name,
+                  value: section.view + (section.detailType || ''),
+                  view: section.view,
+                  url: section.url,
+                  detailType: section.detailType,
+                  parent: this._groupId || this._repoName || '',
+                };
+              });
+            });
       });
     },
 
-    _filterLinks(filterFn) {
-      const links = ADMIN_LINKS.filter(filterFn);
-      const filteredLinks = [];
-      for (const link of links) {
-        const linkCopy = Object.assign({}, link);
-        linkCopy.children = linkCopy.children ?
-            linkCopy.children.filter(filterFn) : [];
-        if (linkCopy.name === 'Projects' && this._projectName) {
-          linkCopy.subsection = {
-            name: this._projectName,
-            view: 'gr-project',
-            url: `/admin/projects/${this.encodeURL(this._projectName, true)}`,
-            children: [{
-              name: 'Access',
-              detailType: 'access',
-              view: 'gr-project-access',
-              url: `/admin/projects/` +
-                  `${this.encodeURL(this._projectName, true)},access`,
-            },
-            {
-              name: 'Commands',
-              detailType: 'commands',
-              view: 'gr-project-commands',
-              url: `/admin/projects/` +
-                  `${this.encodeURL(this._projectName, true)},commands`,
-            },
-            {
-              name: 'Branches',
-              detailType: 'branches',
-              view: 'gr-project-detail-list',
-              url: `/admin/projects/` +
-                  `${this.encodeURL(this._projectName, true)},branches`,
-            },
-            {
-              name: 'Tags',
-              detailType: 'tags',
-              view: 'gr-project-detail-list',
-              url: `/admin/projects/` +
-                  `${this.encodeURL(this._projectName, true)},tags`,
-            }],
-          };
-        }
-        if (linkCopy.name === 'Groups' && this._groupId && this._groupName) {
-          linkCopy.subsection = {
-            name: this._groupName,
-            view: 'gr-group',
-            url: `/admin/groups/${this.encodeURL(this._groupId + '', true)}`,
-            children: [
-              {
-                name: 'Members',
-                detailType: 'members',
-                view: 'gr-group-members',
-                url: `/admin/groups/${this.encodeURL(this._groupId, true)}` +
-                    ',members',
-              },
-            ],
-          };
-          if (this._isAdmin || this._groupOwner) {
-            linkCopy.subsection.children.push(
-                {
-                  name: 'Audit Log',
-                  detailType: 'audit-log',
-                  view: 'gr-group-audit-log',
-                  url: '/admin/groups/' +
-                      `${this.encodeURL(this._groupId + '', true)},audit-log`,
-                }
-            );
-          }
-        }
-        filteredLinks.push(linkCopy);
-      }
-      return filteredLinks;
+    _computeSelectValue(params) {
+      if (!params || !params.view) { return; }
+      return params.view + (params.detail || '');
     },
 
-    _loadAccountCapabilities() {
-      return this.$.restAPI.getAccountCapabilities(ACCOUNT_CAPABILITIES)
-          .then(capabilities => {
-            this._filteredLinks = this._filterLinks(link => {
-              return !link.capability ||
-                  capabilities.hasOwnProperty(link.capability);
-            });
-          });
+    _selectedIsCurrentPage(selected) {
+      return (selected.parent === (this._repoName || this._groupId) &&
+          selected.view === this.params.view &&
+          selected.detailType === this.params.detail);
+    },
+
+    _handleSubsectionChange(e) {
+      const selected = this._subsectionLinks
+          .find(section => section.value === e.detail.value);
+
+      // This is when it gets set initially.
+      if (this._selectedIsCurrentPage(selected)) {
+        return;
+      }
+      Gerrit.Nav.navigateToRelativeUrl(selected.url);
     },
 
     _paramsChanged(params) {
-      this.set('_showGroup', params.adminView === 'gr-group');
-      this.set('_showGroupAuditLog', params.adminView === 'gr-group-audit-log');
-      this.set('_showGroupList', params.adminView === 'gr-admin-group-list');
-      this.set('_showGroupMembers', params.adminView === 'gr-group-members');
-      this.set('_showProjectCommands',
-          params.adminView === 'gr-project-commands');
-      this.set('_showProjectMain', params.adminView === 'gr-project');
-      this.set('_showProjectList',
-          params.adminView === 'gr-project-list');
-      this.set('_showProjectDetailList',
-          params.adminView === 'gr-project-detail-list');
-      this.set('_showPluginList', params.adminView === 'gr-plugin-list');
-      this.set('_showProjectAccess', params.adminView === 'gr-project-access');
-      if (params.project !== this._projectName) {
-        this._projectName = params.project || '';
+      const isGroupView = params.view === Gerrit.Nav.View.GROUP;
+      const isRepoView = params.view === Gerrit.Nav.View.REPO;
+      const isAdminView = params.view === Gerrit.Nav.View.ADMIN;
+
+      this.set('_showGroup', isGroupView && !params.detail);
+      this.set('_showGroupAuditLog', isGroupView &&
+          params.detail === Gerrit.Nav.GroupDetailView.LOG);
+      this.set('_showGroupMembers', isGroupView &&
+          params.detail === Gerrit.Nav.GroupDetailView.MEMBERS);
+
+      this.set('_showGroupList', isAdminView &&
+          params.adminView === 'gr-admin-group-list');
+
+      this.set('_showRepoAccess', isRepoView &&
+          params.detail === Gerrit.Nav.RepoDetailView.ACCESS);
+      this.set('_showRepoCommands', isRepoView &&
+          params.detail === Gerrit.Nav.RepoDetailView.COMMANDS);
+      this.set('_showRepoDetailList', isRepoView &&
+          (params.detail === Gerrit.Nav.RepoDetailView.BRANCHES ||
+           params.detail === Gerrit.Nav.RepoDetailView.TAGS));
+      this.set('_showRepoDashboards', isRepoView &&
+          params.detail === Gerrit.Nav.RepoDetailView.DASHBOARDS);
+      this.set('_showRepoMain', isRepoView && !params.detail);
+
+      this.set('_showRepoList', isAdminView &&
+          params.adminView === 'gr-repo-list');
+
+      this.set('_showPluginList', isAdminView &&
+          params.adminView === 'gr-plugin-list');
+
+      let needsReload = false;
+      if (params.repo !== this._repoName) {
+        this._repoName = params.repo || '';
         // Reloads the admin menu.
-        this.reload();
+        needsReload = true;
       }
       if (params.groupId !== this._groupId) {
         this._groupId = params.groupId || '';
         // Reloads the admin menu.
-        this.reload();
+        needsReload = true;
       }
+      if (this._breadcrumbParentName && !params.groupId && !params.repo) {
+        needsReload = true;
+      }
+      if (!needsReload) { return; }
+      this.reload();
+    },
+
+    _computeSelectedTitle(params) {
+      return this.getSelectedTitle(params.view);
     },
 
     // TODO (beckysiegel): Update these functions after router abstraction is
@@ -226,7 +215,7 @@
 
     _computeLinkURL(link) {
       if (!link || typeof link.url === 'undefined') { return ''; }
-      if (link.target) {
+      if (link.target || !link.noBaseUrl) {
         return link.url;
       }
       return this._computeRelativeURL(link.url);
@@ -238,6 +227,23 @@
      * @param {string=} opt_detailType
      */
     _computeSelectedClass(itemView, params, opt_detailType) {
+      // Group params are structured differently from admin params. Compute
+      // selected differently for groups.
+      // TODO(wyatta): Simplify this when all routes work like group params.
+      if (params.view === Gerrit.Nav.View.GROUP &&
+          itemView === Gerrit.Nav.View.GROUP) {
+        if (!params.detail && !opt_detailType) { return 'selected'; }
+        if (params.detail === opt_detailType) { return 'selected'; }
+        return '';
+      }
+
+      if (params.view === Gerrit.Nav.View.REPO &&
+          itemView === Gerrit.Nav.View.REPO) {
+        if (!params.detail && !opt_detailType) { return 'selected'; }
+        if (params.detail === opt_detailType) { return 'selected'; }
+        return '';
+      }
+
       if (params.detailType && params.detailType !== opt_detailType) {
         return '';
       }
@@ -246,17 +252,24 @@
 
     _computeGroupName(groupId) {
       if (!groupId) { return ''; }
+
       const promises = [];
       this.$.restAPI.getGroupConfig(groupId).then(group => {
+        if (!group || !group.name) { return; }
+
         this._groupName = group.name;
+        this._groupIsInternal = !!group.id.match(INTERNAL_GROUP_REGEX);
         this.reload();
+
         promises.push(this.$.restAPI.getIsAdmin().then(isAdmin => {
           this._isAdmin = isAdmin;
         }));
+
         promises.push(this.$.restAPI.getIsGroupOwner(group.name).then(
             isOwner => {
               this._groupOwner = isOwner;
             }));
+
         return Promise.all(promises).then(() => {
           this.reload();
         });
diff --git a/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view_test.html b/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view_test.html
index 117940a3..56079e3 100644
--- a/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view_test.html
+++ b/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -36,7 +37,7 @@
     let element;
     let sandbox;
 
-    setup(() => {
+    setup(done => {
       sandbox = sinon.sandbox.create();
       element = fixture('basic');
       stub('gr-rest-api-interface', {
@@ -44,6 +45,9 @@
           return Promise.resolve({});
         },
       });
+      const pluginsLoaded = Promise.resolve();
+      sandbox.stub(Gerrit, 'awaitPluginsLoaded').returns(pluginsLoaded);
+      pluginsLoaded.then(() => flush(done));
     });
 
     teardown(() => {
@@ -59,8 +63,14 @@
 
     test('link URLs', () => {
       assert.equal(
-          element._computeLinkURL({url: '/test'}),
+          element._computeLinkURL({url: '/test', noBaseUrl: true}),
           '//' + window.location.host + '/test');
+
+      sandbox.stub(element, 'getBaseUrl').returns('/foo');
+      assert.equal(
+          element._computeLinkURL({url: '/test', noBaseUrl: true}),
+          '//' + window.location.host + '/foo/test');
+      assert.equal(element._computeLinkURL({url: '/test'}), '/test');
       assert.equal(
           element._computeLinkURL({url: '/test', target: '_blank'}),
           '/test');
@@ -68,24 +78,27 @@
 
     test('current page gets selected and is displayed', () => {
       element._filteredLinks = [{
-        name: 'Projects',
-        url: '/admin/projects',
-        view: 'gr-project-list',
-        children: [],
+        name: 'Repositories',
+        url: '/admin/repos',
+        view: 'gr-repo-list',
       }];
 
       element.params = {
-        adminView: 'gr-project-list',
+        view: 'admin',
+        adminView: 'gr-repo-list',
       };
 
       flushAsynchronousOperations();
       assert.equal(Polymer.dom(element.root).querySelectorAll(
           '.selected').length, 1);
-      assert.ok(element.$$('gr-project-list'));
-      assert.isNotOk(element.$$('gr-admin-create-project'));
+      assert.ok(element.$$('gr-repo-list'));
+      assert.isNotOk(element.$$('gr-admin-create-repo'));
     });
 
     test('_filteredLinks admin', done => {
+      sandbox.stub(element.$.restAPI, 'getAccount').returns(Promise.resolve({
+        name: 'test-user',
+      }));
       sandbox.stub(element.$.restAPI, 'getAccountCapabilities', () => {
         return Promise.resolve({
           createGroup: true,
@@ -93,35 +106,36 @@
           viewPlugins: true,
         });
       });
-      element._loadAccountCapabilities().then(() => {
+      element.reload().then(() => {
         assert.equal(element._filteredLinks.length, 3);
 
-        // Projects
-        assert.equal(element._filteredLinks[0].children.length, 0);
+        // Repos
         assert.isNotOk(element._filteredLinks[0].subsection);
 
         // Groups
-        assert.equal(element._filteredLinks[1].children.length, 0);
+        assert.isNotOk(element._filteredLinks[0].subsection);
 
         // Plugins
-        assert.equal(element._filteredLinks[2].children.length, 0);
+        assert.isNotOk(element._filteredLinks[0].subsection);
         done();
       });
     });
 
     test('_filteredLinks non admin authenticated', done => {
+      sandbox.stub(element.$.restAPI, 'getAccount').returns(Promise.resolve({
+        name: 'test-user',
+      }));
       sandbox.stub(element.$.restAPI, 'getAccountCapabilities', () => {
         return Promise.resolve({});
       });
-      element._loadAccountCapabilities().then(() => {
+      element.reload().then(() => {
         assert.equal(element._filteredLinks.length, 2);
 
-        // Projects
-        assert.equal(element._filteredLinks[0].children.length, 0);
+        // Repos
         assert.isNotOk(element._filteredLinks[0].subsection);
 
         // Groups
-        assert.equal(element._filteredLinks[1].children.length, 0);
+        assert.isNotOk(element._filteredLinks[0].subsection);
         done();
       });
     });
@@ -130,15 +144,43 @@
       element.reload().then(() => {
         assert.equal(element._filteredLinks.length, 1);
 
-        // Projects
-        assert.equal(element._filteredLinks[0].children.length, 0);
+        // Repos
         assert.isNotOk(element._filteredLinks[0].subsection);
         done();
       });
     });
 
-    test('Project shows up in nav', done => {
-      element._projectName = 'Test Project';
+    test('_filteredLinks from plugin', () => {
+      sandbox.stub(element.$.jsAPI, 'getAdminMenuLinks').returns([
+        {text: 'internal link text', url: '/internal/link/url'},
+        {text: 'external link text', url: 'http://external/link/url'},
+      ]);
+      return element.reload().then(() => {
+        assert.equal(element._filteredLinks.length, 3);
+        assert.deepEqual(element._filteredLinks[1], {
+          url: '/internal/link/url',
+          name: 'internal link text',
+          noBaseUrl: true,
+          view: null,
+          viewableToAll: true,
+          target: null,
+        });
+        assert.deepEqual(element._filteredLinks[2], {
+          url: 'http://external/link/url',
+          name: 'external link text',
+          noBaseUrl: false,
+          view: null,
+          viewableToAll: true,
+          target: '_blank',
+        });
+      });
+    });
+
+    test('Repo shows up in nav', done => {
+      element._repoName = 'Test Repo';
+      sandbox.stub(element.$.restAPI, 'getAccount').returns(Promise.resolve({
+        name: 'test-user',
+      }));
       sandbox.stub(element.$.restAPI, 'getAccountCapabilities', () => {
         return Promise.resolve({
           createGroup: true,
@@ -146,23 +188,50 @@
           viewPlugins: true,
         });
       });
-      element._loadAccountCapabilities().then(() => {
-        assert.equal(element._filteredLinks.length, 3);
-
-        // Projects
-        assert.equal(element._filteredLinks[0].children.length, 0);
-        assert.equal(element._filteredLinks[0].subsection.name, 'Test Project');
-
-        // Groups
-        assert.equal(element._filteredLinks[1].children.length, 0);
-
-        // Plugins
-        assert.equal(element._filteredLinks[2].children.length, 0);
+      element.reload().then(() => {
+        flushAsynchronousOperations();
+        assert.equal(Polymer.dom(element.root)
+            .querySelectorAll('.sectionTitle').length, 3);
+        assert.equal(element.$$('.breadcrumbText').innerText, 'Test Repo');
+        assert.equal(element.$$('#pageSelect').items.length, 6);
         done();
       });
     });
 
-    test('Nav is reloaded when project changes', () => {
+    test('Group shows up in nav', done => {
+      element._groupId = 'a15262';
+      element._groupName = 'my-group';
+      element._groupIsInternal = true;
+      element._isAdmin = true;
+      element._groupOwner = false;
+      sandbox.stub(element.$.restAPI, 'getAccount').returns(Promise.resolve({
+        name: 'test-user',
+      }));
+      sandbox.stub(element.$.restAPI, 'getAccountCapabilities', () => {
+        return Promise.resolve({
+          createGroup: true,
+          createProject: true,
+          viewPlugins: true,
+        });
+      });
+      element.reload().then(() => {
+        flushAsynchronousOperations();
+        assert.equal(element._filteredLinks.length, 3);
+
+        // Repos
+        assert.isNotOk(element._filteredLinks[0].subsection);
+
+        // Groups
+        assert.equal(element._filteredLinks[1].subsection.children.length, 2);
+        assert.equal(element._filteredLinks[1].subsection.name, 'my-group');
+
+        // Plugins
+        assert.isNotOk(element._filteredLinks[2].subsection);
+        done();
+      });
+    });
+
+    test('Nav is reloaded when repo changes', () => {
       sandbox.stub(element.$.restAPI, 'getAccountCapabilities', () => {
         return Promise.resolve({
           createGroup: true,
@@ -174,10 +243,10 @@
         return Promise.resolve({_id: 1});
       });
       sandbox.stub(element, 'reload');
-      element.params = {project: 'Test Project', adminView: 'gr-project'};
+      element.params = {repo: 'Test Repo', adminView: 'gr-repo'};
       assert.equal(element.reload.callCount, 1);
-      element.params = {project: 'Test Project 2',
-        adminView: 'gr-project'};
+      element.params = {repo: 'Test Repo 2',
+        adminView: 'gr-repo'};
       assert.equal(element.reload.callCount, 2);
     });
 
@@ -206,10 +275,362 @@
         assert.isTrue(element.reload.called);
         done();
       });
-      element.params = {group: 1, adminView: 'gr-group'};
+      element.params = {group: 1, view: Gerrit.Nav.View.GROUP};
       element._groupName = 'oldName';
       flushAsynchronousOperations();
       element.$$('gr-group').fire('name-changed', {name: newName});
     });
+
+    test('dropdown displays if there is a subsection', () => {
+      assert.isNotOk(element.$$('.mainHeader'));
+      element._subsectionLinks = [
+        {
+          text: 'Home',
+          value: 'repo',
+          view: 'repo',
+          url: '',
+          parent: 'my-repo',
+          detailType: undefined,
+        },
+      ];
+      flushAsynchronousOperations();
+      assert.isOk(element.$$('.mainHeader'));
+      element._subsectionLinks = undefined;
+      flushAsynchronousOperations();
+      assert.equal(getComputedStyle(element.$$('.mainHeader')).display, 'none');
+    });
+
+    test('Dropdown only triggers navigation on explicit select', done => {
+      element._repoName = 'my-repo';
+      element.params = {
+        repo: 'my-repo',
+        view: Gerrit.Nav.View.REPO,
+        detail: Gerrit.Nav.RepoDetailView.ACCESS,
+      };
+      sandbox.stub(element.$.restAPI, 'getAccountCapabilities', () => {
+        return Promise.resolve({
+          createGroup: true,
+          createProject: true,
+          viewPlugins: true,
+        });
+      });
+      sandbox.stub(element.$.restAPI, 'getAccount', () => {
+        return Promise.resolve({_id: 1});
+      });
+      flushAsynchronousOperations();
+      const expectedFilteredLinks = [
+        {
+          name: 'Repositories',
+          noBaseUrl: true,
+          url: '/admin/repos',
+          view: 'gr-repo-list',
+          viewableToAll: true,
+          subsection: {
+            name: 'my-repo',
+            view: 'repo',
+            url: '',
+            children: [
+              {
+                name: 'Access',
+                view: 'repo',
+                detailType: 'access',
+                url: '',
+              },
+              {
+                name: 'Commands',
+                view: 'repo',
+                detailType: 'commands',
+                url: '',
+              },
+              {
+                name: 'Branches',
+                view: 'repo',
+                detailType: 'branches',
+                url: '',
+              },
+              {
+                name: 'Tags',
+                view: 'repo',
+                detailType: 'tags',
+                url: '',
+              },
+              {
+                name: 'Dashboards',
+                view: 'repo',
+                detailType: 'dashboards',
+                url: '',
+              },
+            ],
+          },
+        },
+        {
+          name: 'Groups',
+          section: 'Groups',
+          noBaseUrl: true,
+          url: '/admin/groups',
+          view: 'gr-admin-group-list',
+        },
+        {
+          name: 'Plugins',
+          capability: 'viewPlugins',
+          section: 'Plugins',
+          noBaseUrl: true,
+          url: '/admin/plugins',
+          view: 'gr-plugin-list',
+        },
+      ];
+      const expectedSubsectionLinks = [
+        {
+          text: 'Home',
+          value: 'repo',
+          view: 'repo',
+          url: '',
+          parent: 'my-repo',
+          detailType: undefined,
+        },
+        {
+          text: 'Access',
+          value: 'repoaccess',
+          view: 'repo',
+          url: '',
+          detailType: 'access',
+          parent: 'my-repo',
+        },
+        {
+          text: 'Commands',
+          value: 'repocommands',
+          view: 'repo',
+          url: '',
+          detailType: 'commands',
+          parent: 'my-repo',
+        },
+        {
+          text: 'Branches',
+          value: 'repobranches',
+          view: 'repo',
+          url: '',
+          detailType: 'branches',
+          parent: 'my-repo',
+        },
+        {
+          text: 'Tags',
+          value: 'repotags',
+          view: 'repo',
+          url: '',
+          detailType: 'tags',
+          parent: 'my-repo',
+        },
+        {
+          text: 'Dashboards',
+          value: 'repodashboards',
+          view: 'repo',
+          url: '',
+          detailType: 'dashboards',
+          parent: 'my-repo',
+        },
+      ];
+      sandbox.stub(Gerrit.Nav, 'navigateToRelativeUrl');
+      sandbox.spy(element, '_selectedIsCurrentPage');
+      sandbox.spy(element, '_handleSubsectionChange');
+      element.reload().then(() => {
+        assert.deepEqual(element._filteredLinks, expectedFilteredLinks);
+        assert.deepEqual(element._subsectionLinks, expectedSubsectionLinks);
+        assert.equal(element.$$('#pageSelect').value, 'repoaccess');
+        assert.isTrue(element._selectedIsCurrentPage.calledOnce);
+        // Doesn't trigger navigation from the page select menu.
+        assert.isFalse(Gerrit.Nav.navigateToRelativeUrl.called);
+
+        // When explicitly changed, navigation is called
+        element.$$('#pageSelect').value = 'repo';
+        assert.isTrue(element._selectedIsCurrentPage.calledTwice);
+        assert.isTrue(Gerrit.Nav.navigateToRelativeUrl.calledOnce);
+        done();
+      });
+    });
+
+    test('_selectedIsCurrentPage', () => {
+      element._repoName = 'my-repo';
+      element.params = {view: 'repo', repo: 'my-repo'};
+      const selected = {
+        view: 'repo',
+        detailType: undefined,
+        parent: 'my-repo',
+      };
+      assert.isTrue(element._selectedIsCurrentPage(selected));
+      selected.parent = 'my-second-repo';
+      assert.isFalse(element._selectedIsCurrentPage(selected));
+      selected.detailType = 'detailType';
+      assert.isFalse(element._selectedIsCurrentPage(selected));
+    });
+
+    suite('_computeSelectedClass', () => {
+      setup(() => {
+        sandbox.stub(element.$.restAPI, 'getAccountCapabilities', () => {
+          return Promise.resolve({
+            createGroup: true,
+            createProject: true,
+            viewPlugins: true,
+          });
+        });
+        sandbox.stub(element.$.restAPI, 'getAccount', () => {
+          return Promise.resolve({_id: 1});
+        });
+
+        return element.reload();
+      });
+
+      suite('repos', () => {
+        setup(() => {
+          stub('gr-repo-access', {
+            _repoChanged: () => {},
+          });
+        });
+
+        test('repo list', () => {
+          element.params = {
+            view: Gerrit.Nav.View.ADMIN,
+            adminView: 'gr-repo-list',
+            openCreateModal: false,
+          };
+          flushAsynchronousOperations();
+          const selected = element.$$('gr-page-nav .selected');
+          assert.isOk(selected);
+          assert.equal(selected.textContent.trim(), 'Repositories');
+        });
+
+        test('repo', () => {
+          element.params = {
+            view: Gerrit.Nav.View.REPO,
+            repoName: 'foo',
+          };
+          element._repoName = 'foo';
+          return element.reload().then(() => {
+            flushAsynchronousOperations();
+            const selected = element.$$('gr-page-nav .selected');
+            assert.isOk(selected);
+            assert.equal(selected.textContent.trim(), 'foo');
+          });
+        });
+
+        test('repo access', () => {
+          element.params = {
+            view: Gerrit.Nav.View.REPO,
+            detail: Gerrit.Nav.RepoDetailView.ACCESS,
+            repoName: 'foo',
+          };
+          element._repoName = 'foo';
+          return element.reload().then(() => {
+            flushAsynchronousOperations();
+            const selected = element.$$('gr-page-nav .selected');
+            assert.isOk(selected);
+            assert.equal(selected.textContent.trim(), 'Access');
+          });
+        });
+
+        test('repo dashboards', () => {
+          element.params = {
+            view: Gerrit.Nav.View.REPO,
+            detail: Gerrit.Nav.RepoDetailView.DASHBOARDS,
+            repoName: 'foo',
+          };
+          element._repoName = 'foo';
+          return element.reload().then(() => {
+            flushAsynchronousOperations();
+            const selected = element.$$('gr-page-nav .selected');
+            assert.isOk(selected);
+            assert.equal(selected.textContent.trim(), 'Dashboards');
+          });
+        });
+      });
+
+      suite('groups', () => {
+        setup(() => {
+          stub('gr-group', {
+            _loadGroup: () => Promise.resolve({}),
+          });
+          stub('gr-group-members', {
+            _loadGroupDetails: () => {},
+          });
+
+          sandbox.stub(element.$.restAPI, 'getGroupConfig')
+              .returns(Promise.resolve({
+                name: 'foo',
+                id: 'c0f83e941ce90caea30e6ad88f0d4ea0e841a7a9',
+              }));
+          sandbox.stub(element.$.restAPI, 'getIsGroupOwner')
+              .returns(Promise.resolve(true));
+          return element.reload();
+        });
+
+        test('group list', () => {
+          element.params = {
+            view: Gerrit.Nav.View.ADMIN,
+            adminView: 'gr-admin-group-list',
+            openCreateModal: false,
+          };
+          flushAsynchronousOperations();
+          const selected = element.$$('gr-page-nav .selected');
+          assert.isOk(selected);
+          assert.equal(selected.textContent.trim(), 'Groups');
+        });
+
+        test('internal group', () => {
+          element.params = {
+            view: Gerrit.Nav.View.GROUP,
+            groupId: 1234,
+          };
+          element._groupName = 'foo';
+          return element.reload().then(() => {
+            flushAsynchronousOperations();
+            const subsectionItems = Polymer.dom(element.root)
+                .querySelectorAll('.subsectionItem');
+            assert.equal(subsectionItems.length, 2);
+            assert.isTrue(element._groupIsInternal);
+            const selected = element.$$('gr-page-nav .selected');
+            assert.isOk(selected);
+            assert.equal(selected.textContent.trim(), 'foo');
+          });
+        });
+
+        test('external group', () => {
+          element.$.restAPI.getGroupConfig.restore();
+          sandbox.stub(element.$.restAPI, 'getGroupConfig')
+              .returns(Promise.resolve({
+                name: 'foo',
+                id: 'external-id',
+              }));
+          element.params = {
+            view: Gerrit.Nav.View.GROUP,
+            groupId: 1234,
+          };
+          element._groupName = 'foo';
+          return element.reload().then(() => {
+            flushAsynchronousOperations();
+            const subsectionItems = Polymer.dom(element.root)
+                .querySelectorAll('.subsectionItem');
+            assert.equal(subsectionItems.length, 0);
+            assert.isFalse(element._groupIsInternal);
+            const selected = element.$$('gr-page-nav .selected');
+            assert.isOk(selected);
+            assert.equal(selected.textContent.trim(), 'foo');
+          });
+        });
+
+        test('group members', () => {
+          element.params = {
+            view: Gerrit.Nav.View.GROUP,
+            detail: Gerrit.Nav.GroupDetailView.MEMBERS,
+            groupId: 1234,
+          };
+          element._groupName = 'foo';
+          return element.reload().then(() => {
+            flushAsynchronousOperations();
+            const selected = element.$$('gr-page-nav .selected');
+            assert.isOk(selected);
+            assert.equal(selected.textContent.trim(), 'Members');
+          });
+        });
+      });
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/admin/gr-confirm-delete-item-dialog/gr-confirm-delete-item-dialog.html b/polygerrit-ui/app/elements/admin/gr-confirm-delete-item-dialog/gr-confirm-delete-item-dialog.html
index e132100..3873083 100644
--- a/polygerrit-ui/app/elements/admin/gr-confirm-delete-item-dialog/gr-confirm-delete-item-dialog.html
+++ b/polygerrit-ui/app/elements/admin/gr-confirm-delete-item-dialog/gr-confirm-delete-item-dialog.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -15,7 +16,7 @@
 -->
 
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
-<link rel="import" href="../../shared/gr-confirm-dialog/gr-confirm-dialog.html">
+<link rel="import" href="../../shared/gr-dialog/gr-dialog.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 
 <dom-module id="gr-confirm-delete-item-dialog">
@@ -26,12 +27,13 @@
         width: 30em;
       }
     </style>
-    <gr-confirm-dialog
+    <gr-dialog
         confirm-label="Delete [[_computeItemName(itemType)]]"
+        confirm-on-enter
         on-confirm="_handleConfirmTap"
         on-cancel="_handleCancelTap">
-      <div class="header">[[_computeItemName(itemType)]] Deletion</div>
-      <div class="main">
+      <div class="header" slot="header">[[_computeItemName(itemType)]] Deletion</div>
+      <div class="main" slot="main">
         <label for="branchInput">
           Do you really want to delete the following [[_computeItemName(itemType)]]?
         </label>
@@ -39,7 +41,7 @@
           [[item]]
         </div>
       </div>
-    </gr-confirm-dialog>
+    </gr-dialog>
   </template>
   <script src="gr-confirm-delete-item-dialog.js"></script>
 </dom-module>
diff --git a/polygerrit-ui/app/elements/admin/gr-confirm-delete-item-dialog/gr-confirm-delete-item-dialog.js b/polygerrit-ui/app/elements/admin/gr-confirm-delete-item-dialog/gr-confirm-delete-item-dialog.js
index ddc98e9..b5dcf63 100644
--- a/polygerrit-ui/app/elements/admin/gr-confirm-delete-item-dialog/gr-confirm-delete-item-dialog.js
+++ b/polygerrit-ui/app/elements/admin/gr-confirm-delete-item-dialog/gr-confirm-delete-item-dialog.js
@@ -1,21 +1,25 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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 DETAIL_TYPES = {
     BRANCHES: 'branches',
+    ID: 'id',
     TAGS: 'tags',
   };
 
@@ -56,7 +60,9 @@
         return 'Branch';
       } else if (detailType === DETAIL_TYPES.TAGS) {
         return 'Tag';
+      } else if (detailType === DETAIL_TYPES.ID) {
+        return 'ID';
       }
     },
   });
-})();
\ No newline at end of file
+})();
diff --git a/polygerrit-ui/app/elements/admin/gr-confirm-delete-item-dialog/gr-confirm-delete-item-dialog_test.html b/polygerrit-ui/app/elements/admin/gr-confirm-delete-item-dialog/gr-confirm-delete-item-dialog_test.html
index 8671ad1..d735acb 100644
--- a/polygerrit-ui/app/elements/admin/gr-confirm-delete-item-dialog/gr-confirm-delete-item-dialog_test.html
+++ b/polygerrit-ui/app/elements/admin/gr-confirm-delete-item-dialog/gr-confirm-delete-item-dialog_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -49,7 +50,7 @@
       const confirmHandler = sandbox.stub();
       element.addEventListener('confirm', confirmHandler);
       sandbox.stub(element, '_handleConfirmTap');
-      element.$$('gr-confirm-dialog').fire('confirm');
+      element.$$('gr-dialog').fire('confirm');
       assert.isTrue(confirmHandler.called);
       assert.isTrue(element._handleConfirmTap.called);
     });
@@ -58,7 +59,7 @@
       const cancelHandler = sandbox.stub();
       element.addEventListener('cancel', cancelHandler);
       sandbox.stub(element, '_handleCancelTap');
-      element.$$('gr-confirm-dialog').fire('cancel');
+      element.$$('gr-dialog').fire('cancel');
       assert.isTrue(cancelHandler.called);
       assert.isTrue(element._handleCancelTap.called);
     });
diff --git a/polygerrit-ui/app/elements/admin/gr-create-change-dialog/gr-create-change-dialog.html b/polygerrit-ui/app/elements/admin/gr-create-change-dialog/gr-create-change-dialog.html
index 7c9b551..da1c871 100644
--- a/polygerrit-ui/app/elements/admin/gr-create-change-dialog/gr-create-change-dialog.html
+++ b/polygerrit-ui/app/elements/admin/gr-create-change-dialog/gr-create-change-dialog.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -18,13 +19,12 @@
 <link rel="import" href="../../../bower_components/iron-input/iron-input.html">
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
 <link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
-<link rel="import" href="../../../behaviors/gr-url-encoding-behavior.html">
+<link rel="import" href="../../../behaviors/gr-url-encoding-behavior/gr-url-encoding-behavior.html">
 <link rel="import" href="../../../styles/gr-form-styles.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 <link rel="import" href="../../core/gr-navigation/gr-navigation.html">
 <link rel="import" href="../../shared/gr-autocomplete/gr-autocomplete.html">
 <link rel="import" href="../../shared/gr-button/gr-button.html">
-<link rel="import" href="../../shared/gr-confirm-dialog/gr-confirm-dialog.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
 <link rel="import" href="../../shared/gr-select/gr-select.html">
 
@@ -32,47 +32,65 @@
   <template>
     <style include="shared-styles"></style>
     <style include="gr-form-styles">
-      :host {
-        display: inline-block;
+      input:not([type="checkbox"]),
+      gr-autocomplete,
+      iron-autogrow-textarea {
+        width: 100%;
       }
-      input {
-        width: 25em;
+      .value {
+        width: 32em;
       }
       gr-autocomplete {
-        border: none;
-        float: right;
         --gr-autocomplete: {
-          border: 1px solid #d1d2d3;
-          border-radius: 2px;
-          font-size: 1em;
-          height: 2em;
           padding: 0 .15em;
-          width: 20em;
+        }
+      }
+      .hide {
+        display: none;
+      }
+      @media only screen and (max-width: 40em) {
+        .value {
+          width: 29em;
         }
       }
     </style>
     <div class="gr-form-styles">
-      <div id="form">
-        <section>
-          <span class="title">Select branch for new change</span>
-          <span class="value">
-            <gr-autocomplete
-                id="branchInput"
-                text="{{branch}}"
-                query="[[_query]]"
-                placeholder="Destination branch">
-            </gr-autocomplete>
-          </span>
-        </section>
-        <section>
-          <span class="title">Enter topic for new change (optional)</span>
+      <section class$="[[_computeBranchClass(baseChange)]]">
+        <span class="title">Select branch for new change</span>
+        <span class="value">
+          <gr-autocomplete
+              id="branchInput"
+              text="{{branch}}"
+              query="[[_query]]"
+              placeholder="Destination branch">
+          </gr-autocomplete>
+        </span>
+      </section>
+      <section class$="[[_computeBranchClass(baseChange)]]">
+        <span class="title">Provide base commit sha1 for change</span>
+        <span class="value">
+          <input
+              is="iron-input"
+              id="baseCommitInput"
+              maxlength="40"
+              placeholder="(optional)"
+              bind-value="{{baseCommit}}">
+        </span>
+      </section>
+      <section>
+        <span class="title">Enter topic for new change</span>
+        <span class="value">
           <input
               is="iron-input"
               id="tagNameInput"
+              maxlength="1024"
+              placeholder="(optional)"
               bind-value="{{topic}}">
-        </section>
-        <section>
-          <span class="title">Description</span>
+        </span>
+      </section>
+      <section id="description">
+        <span class="title">Description</span>
+        <span class="value">
           <iron-autogrow-textarea
               id="messageInput"
               class="message"
@@ -82,18 +100,19 @@
               bind-value="{{subject}}"
               placeholder="Insert the description of the change.">
           </iron-autogrow-textarea>
-        </section>
-        <section>
-          <span class="title">Options</span>
-          <section>
-            <label for="privateChangeCheckBox">Private Change</label>
-            <input
-                type="checkbox"
-                id="privateChangeCheckBox"
-                checked$="[[_projectConfig.private_by_default.inherited_value]]">
-          </section>
-        </section>
-      </div>
+        </span>
+      </section>
+      <section class$="[[_computePrivateSectionClass(_privateChangesEnabled)]]">
+        <label
+            class="title"
+            for="privateChangeCheckBox">Private change</label>
+        <span class="value">
+          <input
+              type="checkbox"
+              id="privateChangeCheckBox"
+              checked$="[[_formatBooleanString(privateByDefault)]]">
+        </span>
+      </section>
     </div>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
   </template>
diff --git a/polygerrit-ui/app/elements/admin/gr-create-change-dialog/gr-create-change-dialog.js b/polygerrit-ui/app/elements/admin/gr-create-change-dialog/gr-create-change-dialog.js
index 8e8bc7d..8e15755 100644
--- a/polygerrit-ui/app/elements/admin/gr-create-change-dialog/gr-create-change-dialog.js
+++ b/polygerrit-ui/app/elements/admin/gr-create-change-dialog/gr-create-change-dialog.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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';
 
@@ -21,23 +24,27 @@
     is: 'gr-create-change-dialog',
 
     properties: {
-      projectName: String,
+      repoName: String,
       branch: String,
       /** @type {?} */
-      _projectConfig: Object,
+      _repoConfig: Object,
       subject: String,
       topic: String,
       _query: {
         type: Function,
         value() {
-          return this._getProjectBranchesSuggestions.bind(this);
+          return this._getRepoBranchesSuggestions.bind(this);
         },
       },
+      baseChange: String,
+      baseCommit: String,
+      privateByDefault: String,
       canCreate: {
         type: Boolean,
         notify: true,
         value: false,
       },
+      _privateChangesEnabled: Boolean,
     },
 
     behaviors: [
@@ -46,37 +53,55 @@
     ],
 
     attached() {
-      this.$.restAPI.getProjectConfig(this.projectName).then(config => {
-        this._projectConfig = config;
-      });
+      if (!this.repoName) { return Promise.resolve(); }
+
+      const promises = [];
+
+      promises.push(this.$.restAPI.getProjectConfig(this.repoName)
+          .then(config => {
+            this.privateByDefault = config.private_by_default;
+          }));
+
+      promises.push(this.$.restAPI.getConfig().then(config => {
+        if (!config) { return; }
+
+        this._privateConfig = config && config.change &&
+            config.change.disable_private_changes;
+      }));
+
+      return Promise.all(promises);
     },
 
     observers: [
       '_allowCreate(branch, subject)',
     ],
 
+    _computeBranchClass(baseChange) {
+      return baseChange ? 'hide' : '';
+    },
+
     _allowCreate(branch, subject) {
       this.canCreate = !!branch && !!subject;
     },
 
     handleCreateChange() {
       const isPrivate = this.$.privateChangeCheckBox.checked;
-      return this.$.restAPI.createChange(this.projectName, this.branch,
-          this.subject, this.topic, isPrivate, true)
+      const isWip = true;
+      return this.$.restAPI.createChange(this.repoName, this.branch,
+          this.subject, this.topic, isPrivate, isWip, this.baseChange,
+          this.baseCommit || null)
           .then(changeCreated => {
-            if (!changeCreated) {
-              return;
-            }
+            if (!changeCreated) { return; }
             Gerrit.Nav.navigateToChange(changeCreated);
           });
     },
 
-    _getProjectBranchesSuggestions(input) {
+    _getRepoBranchesSuggestions(input) {
       if (input.startsWith(REF_PREFIX)) {
         input = input.substring(REF_PREFIX.length);
       }
-      return this.$.restAPI.getProjectBranches(
-          input, this.projectName, SUGGESTIONS_LIMIT).then(response => {
+      return this.$.restAPI.getRepoBranches(
+          input, this.repoName, SUGGESTIONS_LIMIT).then(response => {
             const branches = [];
             let branch;
             for (const key in response) {
@@ -93,5 +118,25 @@
             return branches;
           });
     },
+
+    _formatBooleanString(config) {
+      if (config && config.configured_value === 'TRUE') {
+        return true;
+      } else if (config && config.configured_value === 'FALSE') {
+        return false;
+      } else if (config && config.configured_value === 'INHERIT') {
+        if (config && config.inherited_value) {
+          return true;
+        } else {
+          return false;
+        }
+      } else {
+        return false;
+      }
+    },
+
+    _computePrivateSectionClass(config) {
+      return config ? 'hide' : '';
+    },
   });
 })();
diff --git a/polygerrit-ui/app/elements/admin/gr-create-change-dialog/gr-create-change-dialog_test.html b/polygerrit-ui/app/elements/admin/gr-create-change-dialog/gr-create-change-dialog_test.html
index dbc99fb..aa4da68 100644
--- a/polygerrit-ui/app/elements/admin/gr-create-change-dialog/gr-create-change-dialog_test.html
+++ b/polygerrit-ui/app/elements/admin/gr-create-change-dialog/gr-create-change-dialog_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -40,7 +41,7 @@
       sandbox = sinon.sandbox.create();
       stub('gr-rest-api-interface', {
         getLoggedIn() { return Promise.resolve(true); },
-        getProjectBranches(input) {
+        getRepoBranches(input) {
           if (input.startsWith('test')) {
             return Promise.resolve([
               {
@@ -55,10 +56,12 @@
         },
       });
       element = fixture('basic');
-      element.projectName = 'test-project';
-      element._projectConfig = {
-        private_by_default: {},
-        work_in_progress_by_default: {},
+      element.repoName = 'test-repo',
+      element._repoConfig = {
+        private_by_default: {
+          configured_value: 'FALSE',
+          inherited_value: false,
+        },
       };
     });
 
@@ -66,19 +69,13 @@
       sandbox.restore();
     });
 
-    test('new change created with private', () => {
-      element._projectConfig = {
-        private_by_default: {
-          inherited_value: true,
-        },
-      };
-
+    test('new change created with default', done => {
       const configInputObj = {
         branch: 'test-branch',
-        topic: 'test-topic',
         subject: 'first change created with polygerrit ui',
-        work_in_progress: false,
-        project: element.projectName,
+        topic: 'test-topic',
+        is_private: false,
+        work_in_progress: true,
       };
 
       const saveStub = sandbox.stub(element.$.restAPI,
@@ -86,35 +83,6 @@
             return Promise.resolve({});
           });
 
-      element.project = element.projectName;
-      element.branch = 'test-branch';
-      element.topic = 'test-topic';
-      element.subject = 'first change created with polygerrit ui';
-      assert.isTrue(element.$.privateChangeCheckBox.checked);
-
-      element.$.branchInput.bindValue = configInputObj.branch;
-      element.$.tagNameInput.bindValue = configInputObj.topic;
-      element.$.messageInput.bindValue = configInputObj.subject;
-
-      element.handleCreateChange().then(() => {
-        assert.isTrue(saveStub.lastCall.calledWithExactly(configInputObj));
-      });
-    });
-
-    test('new change created with wip', () => {
-      const configInputObj = {
-        branch: 'test-branch',
-        topic: 'test-topic',
-        subject: 'first change created with polygerrit ui',
-        project: element.projectName,
-      };
-
-      const saveStub = sandbox.stub(element.$.restAPI,
-          'createChange', () => {
-            return Promise.resolve({});
-          });
-
-      element.project = element.projectName;
       element.branch = 'test-branch';
       element.topic = 'test-topic';
       element.subject = 'first change created with polygerrit ui';
@@ -125,23 +93,80 @@
       element.$.messageInput.bindValue = configInputObj.subject;
 
       element.handleCreateChange().then(() => {
-        assert.isTrue(saveStub.lastCall.calledWithExactly(configInputObj));
+        // Private change
+        assert.isFalse(saveStub.lastCall.args[4]);
+        // WIP Change
+        assert.isTrue(saveStub.lastCall.args[5]);
+        assert.isTrue(saveStub.called);
+        done();
       });
     });
 
-    test('_getProjectBranchesSuggestions empty', done => {
-      element._getProjectBranchesSuggestions('nonexistent').then(branches => {
+    test('new change created with private', done => {
+      element.privateByDefault = {
+        configured_value: 'TRUE',
+        inherited_value: false,
+      };
+      sandbox.stub(element, '_formatBooleanString', () => {
+        return Promise.resolve(true);
+      });
+      flushAsynchronousOperations();
+
+      const configInputObj = {
+        branch: 'test-branch',
+        subject: 'first change created with polygerrit ui',
+        topic: 'test-topic',
+        is_private: true,
+        work_in_progress: true,
+      };
+
+      const saveStub = sandbox.stub(element.$.restAPI,
+          'createChange', () => {
+            return Promise.resolve({});
+          });
+
+      element.branch = 'test-branch';
+      element.topic = 'test-topic';
+      element.subject = 'first change created with polygerrit ui';
+      assert.isTrue(element.$.privateChangeCheckBox.checked);
+
+      element.$.branchInput.bindValue = configInputObj.branch;
+      element.$.tagNameInput.bindValue = configInputObj.topic;
+      element.$.messageInput.bindValue = configInputObj.subject;
+
+      element.handleCreateChange().then(() => {
+        // Private change
+        assert.isTrue(saveStub.lastCall.args[4]);
+        // WIP Change
+        assert.isTrue(saveStub.lastCall.args[5]);
+        assert.isTrue(saveStub.called);
+        done();
+      });
+    });
+
+    test('_getRepoBranchesSuggestions empty', done => {
+      element._getRepoBranchesSuggestions('nonexistent').then(branches => {
         assert.equal(branches.length, 0);
         done();
       });
     });
 
-    test('_getProjectBranchesSuggestions non-empty', done => {
-      element._getProjectBranchesSuggestions('test-branch').then(branches => {
+    test('_getRepoBranchesSuggestions non-empty', done => {
+      element._getRepoBranchesSuggestions('test-branch').then(branches => {
         assert.equal(branches.length, 1);
         assert.equal(branches[0].name, 'test-branch');
         done();
       });
     });
+
+    test('_computeBranchClass', () => {
+      assert.equal(element._computeBranchClass(true), 'hide');
+      assert.equal(element._computeBranchClass(false), '');
+    });
+
+    test('_computePrivateSectionClass', () => {
+      assert.equal(element._computePrivateSectionClass(true), 'hide');
+      assert.equal(element._computePrivateSectionClass(false), '');
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/admin/gr-create-group-dialog/gr-create-group-dialog.html b/polygerrit-ui/app/elements/admin/gr-create-group-dialog/gr-create-group-dialog.html
index 6612e38..d96a935 100644
--- a/polygerrit-ui/app/elements/admin/gr-create-group-dialog/gr-create-group-dialog.html
+++ b/polygerrit-ui/app/elements/admin/gr-create-group-dialog/gr-create-group-dialog.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,7 +18,7 @@
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
 
 <link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
-<link rel="import" href="../../../behaviors/gr-url-encoding-behavior.html">
+<link rel="import" href="../../../behaviors/gr-url-encoding-behavior/gr-url-encoding-behavior.html">
 <link rel="import" href="../../../bower_components/iron-input/iron-input.html">
 <link rel="import" href="../../../styles/gr-form-styles.html">
 <link rel="import" href="../../../styles/shared-styles.html">
diff --git a/polygerrit-ui/app/elements/admin/gr-create-group-dialog/gr-create-group-dialog.js b/polygerrit-ui/app/elements/admin/gr-create-group-dialog/gr-create-group-dialog.js
index 51024d7..01aeb43 100644
--- a/polygerrit-ui/app/elements/admin/gr-create-group-dialog/gr-create-group-dialog.js
+++ b/polygerrit-ui/app/elements/admin/gr-create-group-dialog/gr-create-group-dialog.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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';
 
diff --git a/polygerrit-ui/app/elements/admin/gr-create-group-dialog/gr-create-group-dialog_test.html b/polygerrit-ui/app/elements/admin/gr-create-group-dialog/gr-create-group-dialog_test.html
index 7766ea6..95ffdb1 100644
--- a/polygerrit-ui/app/elements/admin/gr-create-group-dialog/gr-create-group-dialog_test.html
+++ b/polygerrit-ui/app/elements/admin/gr-create-group-dialog/gr-create-group-dialog_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/admin/gr-create-pointer-dialog/gr-create-pointer-dialog.html b/polygerrit-ui/app/elements/admin/gr-create-pointer-dialog/gr-create-pointer-dialog.html
index dcc23e1..0557021 100644
--- a/polygerrit-ui/app/elements/admin/gr-create-pointer-dialog/gr-create-pointer-dialog.html
+++ b/polygerrit-ui/app/elements/admin/gr-create-pointer-dialog/gr-create-pointer-dialog.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,7 +18,7 @@
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
 
 <link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
-<link rel="import" href="../../../behaviors/gr-url-encoding-behavior.html">
+<link rel="import" href="../../../behaviors/gr-url-encoding-behavior/gr-url-encoding-behavior.html">
 <link rel="import" href="../../../bower_components/iron-input/iron-input.html">
 <link rel="import" href="../../../styles/gr-form-styles.html">
 <link rel="import" href="../../../styles/shared-styles.html">
diff --git a/polygerrit-ui/app/elements/admin/gr-create-pointer-dialog/gr-create-pointer-dialog.js b/polygerrit-ui/app/elements/admin/gr-create-pointer-dialog/gr-create-pointer-dialog.js
index 4d552f4..4e9da90 100644
--- a/polygerrit-ui/app/elements/admin/gr-create-pointer-dialog/gr-create-pointer-dialog.js
+++ b/polygerrit-ui/app/elements/admin/gr-create-pointer-dialog/gr-create-pointer-dialog.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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';
 
@@ -24,7 +27,7 @@
 
     properties: {
       detailType: String,
-      projectName: String,
+      repoName: String,
       hasNewItemName: {
         type: Boolean,
         notify: true,
@@ -51,18 +54,18 @@
 
     _computeItemUrl(project) {
       if (this.itemDetail === DETAIL_TYPES.branches) {
-        return this.getBaseUrl() + '/admin/projects/' +
-            this.encodeURL(this.projectName, true) + ',branches';
+        return this.getBaseUrl() + '/admin/repos/' +
+            this.encodeURL(this.repoName, true) + ',branches';
       } else if (this.itemDetail === DETAIL_TYPES.tags) {
-        return this.getBaseUrl() + '/admin/projects/' +
-            this.encodeURL(this.projectName, true) + ',tags';
+        return this.getBaseUrl() + '/admin/repos/' +
+            this.encodeURL(this.repoName, true) + ',tags';
       }
     },
 
     handleCreateItem() {
       const USE_HEAD = this._itemRevision ? this._itemRevision : 'HEAD';
       if (this.itemDetail === DETAIL_TYPES.branches) {
-        return this.$.restAPI.createProjectBranch(this.projectName,
+        return this.$.restAPI.createRepoBranch(this.repoName,
             this._itemName, {revision: USE_HEAD})
             .then(itemRegistered => {
               if (itemRegistered.status === 201) {
@@ -70,7 +73,7 @@
               }
             });
       } else if (this.itemDetail === DETAIL_TYPES.tags) {
-        return this.$.restAPI.createProjectTag(this.projectName,
+        return this.$.restAPI.createRepoTag(this.repoName,
             this._itemName,
             {revision: USE_HEAD, message: this._itemAnnotation || null})
             .then(itemRegistered => {
diff --git a/polygerrit-ui/app/elements/admin/gr-create-pointer-dialog/gr-create-pointer-dialog_test.html b/polygerrit-ui/app/elements/admin/gr-create-pointer-dialog/gr-create-pointer-dialog_test.html
index dd74574..39e200a 100644
--- a/polygerrit-ui/app/elements/admin/gr-create-pointer-dialog/gr-create-pointer-dialog_test.html
+++ b/polygerrit-ui/app/elements/admin/gr-create-pointer-dialog/gr-create-pointer-dialog_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -49,7 +50,7 @@
     });
 
     test('branch created', () => {
-      sandbox.stub(element.$.restAPI, 'createProjectBranch', () => {
+      sandbox.stub(element.$.restAPI, 'createRepoBranch', () => {
         return Promise.resolve({});
       });
 
@@ -69,7 +70,7 @@
     });
 
     test('tag created', () => {
-      sandbox.stub(element.$.restAPI, 'createProjectTag', () => {
+      sandbox.stub(element.$.restAPI, 'createRepoTag', () => {
         return Promise.resolve({});
       });
 
@@ -89,7 +90,7 @@
     });
 
     test('tag created with annotations', () => {
-      sandbox.stub(element.$.restAPI, 'createProjectTag', () => {
+      sandbox.stub(element.$.restAPI, 'createRepoTag', () => {
         return Promise.resolve({});
       });
 
diff --git a/polygerrit-ui/app/elements/admin/gr-create-project-dialog/gr-create-project-dialog.html b/polygerrit-ui/app/elements/admin/gr-create-project-dialog/gr-create-project-dialog.html
deleted file mode 100644
index 88dca81..0000000
--- a/polygerrit-ui/app/elements/admin/gr-create-project-dialog/gr-create-project-dialog.html
+++ /dev/null
@@ -1,103 +0,0 @@
-<!--
-Copyright (C) 2017 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="../../../bower_components/polymer/polymer.html">
-
-<link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
-<link rel="import" href="../../../behaviors/gr-url-encoding-behavior.html">
-<link rel="import" href="../../../bower_components/iron-input/iron-input.html">
-<link rel="import" href="../../../styles/gr-form-styles.html">
-<link rel="import" href="../../../styles/shared-styles.html">
-<link rel="import" href="../../shared/gr-autocomplete/gr-autocomplete.html">
-<link rel="import" href="../../shared/gr-button/gr-button.html">
-<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
-<link rel="import" href="../../shared/gr-select/gr-select.html">
-
-<dom-module id="gr-create-project-dialog">
-  <template>
-    <style include="shared-styles"></style>
-    <style include="gr-form-styles">
-      :host {
-        display: inline-block;
-      }
-      input {
-        width: 20em;
-      }
-      gr-autocomplete {
-        border: none;
-        --gr-autocomplete: {
-          border: 1px solid #d1d2d3;
-          border-radius: 2px;
-          font-size: 1em;
-          height: 2em;
-          padding: 0 .15em;
-          width: 20em;
-        }
-      }
-    </style>
-
-    <div class="gr-form-styles">
-      <div id="form">
-        <section>
-          <span class="title">Project name</span>
-          <input is="iron-input"
-              id="projectNameInput"
-              autocomplete="on"
-              bind-value="{{_projectConfig.name}}">
-        </section>
-        <section>
-          <span class="title">Rights inherit from</span>
-          <span class="value">
-            <gr-autocomplete
-                id="rightsInheritFromInput"
-                text="{{_projectConfig.parent}}"
-                query="[[_query]]"
-                placeholder="Optional, defaults to 'All-Projects'">
-            </gr-autocomplete>
-          </span>
-        </section>
-        <section>
-          <span class="title">Create initial empty commit</span>
-          <span class="value">
-            <gr-select
-                id="initalCommit"
-                bind-value="{{_projectConfig.create_empty_commit}}">
-              <select>
-                <option value="false">False</option>
-                <option value="true">True</option>
-              </select>
-            </gr-select>
-          </span>
-        </section>
-        <section>
-          <span class="title">Only serve as parent for other projects</span>
-          <span class="value">
-            <gr-select
-                id="parentProject"
-                bind-value="{{_projectConfig.permissions_only}}">
-              <select>
-                <option value="false">False</option>
-                <option value="true">True</option>
-              </select>
-            </gr-select>
-          </span>
-        </section>
-      </div>
-    </div>
-    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
-  </template>
-  <script src="gr-create-project-dialog.js"></script>
-</dom-module>
diff --git a/polygerrit-ui/app/elements/admin/gr-create-project-dialog/gr-create-project-dialog.js b/polygerrit-ui/app/elements/admin/gr-create-project-dialog/gr-create-project-dialog.js
deleted file mode 100644
index f8fb510..0000000
--- a/polygerrit-ui/app/elements/admin/gr-create-project-dialog/gr-create-project-dialog.js
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright (C) 2017 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-create-project-dialog',
-
-    properties: {
-      params: Object,
-      hasNewProjectName: {
-        type: Boolean,
-        notify: true,
-        value: false,
-      },
-
-      /** @type {?} */
-      _projectConfig: {
-        type: Object,
-        value: () => {
-          // Set default values for dropdowns.
-          return {
-            create_empty_commit: true,
-            permissions_only: false,
-          };
-        },
-      },
-      _projectCreated: {
-        type: Boolean,
-        value: false,
-      },
-
-      _query: {
-        type: Function,
-        value() {
-          return this._getProjectSuggestions.bind(this);
-        },
-      },
-    },
-
-    observers: [
-      '_updateProjectName(_projectConfig.name)',
-    ],
-
-    behaviors: [
-      Gerrit.BaseUrlBehavior,
-      Gerrit.URLEncodingBehavior,
-    ],
-
-    _computeProjectUrl(projectName) {
-      return this.getBaseUrl() + '/admin/projects/' +
-          this.encodeURL(projectName, true);
-    },
-
-    _updateProjectName(name) {
-      this.hasNewProjectName = !!name;
-    },
-
-    handleCreateProject() {
-      return this.$.restAPI.createProject(this._projectConfig)
-          .then(projectRegistered => {
-            if (projectRegistered.status === 201) {
-              this._projectCreated = true;
-              page.show(this._computeProjectUrl(this._projectConfig.name));
-            }
-          });
-    },
-
-    _getProjectSuggestions(input) {
-      return this.$.restAPI.getSuggestedProjects(input)
-          .then(response => {
-            const projects = [];
-            for (const key in response) {
-              if (!response.hasOwnProperty(key)) { continue; }
-              projects.push({
-                name: key,
-                value: response[key],
-              });
-            }
-            return projects;
-          });
-    },
-  });
-})();
diff --git a/polygerrit-ui/app/elements/admin/gr-create-project-dialog/gr-create-project-dialog_test.html b/polygerrit-ui/app/elements/admin/gr-create-project-dialog/gr-create-project-dialog_test.html
deleted file mode 100644
index 66273c0..0000000
--- a/polygerrit-ui/app/elements/admin/gr-create-project-dialog/gr-create-project-dialog_test.html
+++ /dev/null
@@ -1,95 +0,0 @@
-<!DOCTYPE html>
-<!--
-Copyright (C) 2017 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-create-project-dialog</title>
-
-<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
-<script src="../../../bower_components/web-component-tester/browser.js"></script>
-<link rel="import" href="../../../test/common-test-setup.html"/>
-<link rel="import" href="gr-create-project-dialog.html">
-
-<script>void(0);</script>
-
-<test-fixture id="basic">
-  <template>
-    <gr-create-project-dialog></gr-create-project-dialog>
-  </template>
-</test-fixture>
-
-<script>
-  suite('gr-create-project-dialog tests', () => {
-    let element;
-    let sandbox;
-
-    setup(() => {
-      sandbox = sinon.sandbox.create();
-      stub('gr-rest-api-interface', {
-        getLoggedIn() { return Promise.resolve(true); },
-      });
-      element = fixture('basic');
-    });
-
-    teardown(() => {
-      sandbox.restore();
-    });
-
-    test('default values are populated', () => {
-      assert.isTrue(element.$.initalCommit.bindValue);
-      assert.isFalse(element.$.parentProject.bindValue);
-    });
-
-    test('project created', done => {
-      const configInputObj = {
-        name: 'test-project',
-        create_empty_commit: true,
-        parent: 'All-Project',
-        permissions_only: false,
-      };
-
-      const saveStub = sandbox.stub(element.$.restAPI,
-          'createProject', () => {
-            return Promise.resolve({});
-          });
-
-      assert.isFalse(element.hasNewProjectName);
-
-      element._projectConfig = {
-        name: 'test-project',
-        create_empty_commit: true,
-        parent: 'All-Project',
-        permissions_only: false,
-      };
-
-      element.$.projectNameInput.bindValue = configInputObj.name;
-      element.$.rightsInheritFromInput.bindValue = configInputObj.parent;
-      element.$.initalCommit.bindValue =
-          configInputObj.create_empty_commit;
-      element.$.parentProject.bindValue =
-          configInputObj.permissions_only;
-
-      assert.isTrue(element.hasNewProjectName);
-
-      assert.deepEqual(element._projectConfig, configInputObj);
-
-      element.handleCreateProject().then(() => {
-        assert.isTrue(saveStub.lastCall.calledWithExactly(configInputObj));
-        done();
-      });
-    });
-  });
-</script>
diff --git a/polygerrit-ui/app/elements/admin/gr-create-repo-dialog/gr-create-repo-dialog.html b/polygerrit-ui/app/elements/admin/gr-create-repo-dialog/gr-create-repo-dialog.html
new file mode 100644
index 0000000..f43a3e2
--- /dev/null
+++ b/polygerrit-ui/app/elements/admin/gr-create-repo-dialog/gr-create-repo-dialog.html
@@ -0,0 +1,115 @@
+<!--
+@license
+Copyright (C) 2017 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="../../../bower_components/polymer/polymer.html">
+
+<link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
+<link rel="import" href="../../../behaviors/gr-url-encoding-behavior/gr-url-encoding-behavior.html">
+<link rel="import" href="../../../bower_components/iron-input/iron-input.html">
+<link rel="import" href="../../../styles/gr-form-styles.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../../shared/gr-autocomplete/gr-autocomplete.html">
+<link rel="import" href="../../shared/gr-button/gr-button.html">
+<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
+<link rel="import" href="../../shared/gr-select/gr-select.html">
+
+<dom-module id="gr-create-repo-dialog">
+  <template>
+    <style include="shared-styles"></style>
+    <style include="gr-form-styles">
+      :host {
+        display: inline-block;
+      }
+      input {
+        width: 20em;
+      }
+      gr-autocomplete {
+        border: none;
+        --gr-autocomplete: {
+          border: 1px solid var(--border-color);
+          border-radius: 2px;
+          font-size: var(--font-size-normal);
+          height: 2em;
+          padding: 0 .15em;
+          width: 20em;
+        }
+      }
+    </style>
+
+    <div class="gr-form-styles">
+      <div id="form">
+        <section>
+          <span class="title">Repository name</span>
+          <input is="iron-input"
+              id="repoNameInput"
+              autocomplete="on"
+              bind-value="{{_repoConfig.name}}">
+        </section>
+        <section>
+          <span class="title">Rights inherit from</span>
+          <span class="value">
+            <gr-autocomplete
+                id="rightsInheritFromInput"
+                text="{{_repoConfig.parent}}"
+                query="[[_query]]"
+                placeholder="Optional, defaults to 'All-Projects'">
+            </gr-autocomplete>
+          </span>
+        </section>
+        <section>
+          <span class="title">Owner</span>
+          <span class="value">
+            <gr-autocomplete
+                id="ownerInput"
+                text="{{_repoOwner}}"
+                value="{{_repoOwnerId}}"
+                query="[[_queryGroups]]">
+            </gr-autocomplete>
+          </span>
+        </section>
+        <section>
+          <span class="title">Create initial empty commit</span>
+          <span class="value">
+            <gr-select
+                id="initalCommit"
+                bind-value="{{_repoConfig.create_empty_commit}}">
+              <select>
+                <option value="false">False</option>
+                <option value="true">True</option>
+              </select>
+            </gr-select>
+          </span>
+        </section>
+        <section>
+          <span class="title">Only serve as parent for other repositories</span>
+          <span class="value">
+            <gr-select
+                id="parentRepo"
+                bind-value="{{_repoConfig.permissions_only}}">
+              <select>
+                <option value="false">False</option>
+                <option value="true">True</option>
+              </select>
+            </gr-select>
+          </span>
+        </section>
+      </div>
+    </div>
+    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
+  </template>
+  <script src="gr-create-repo-dialog.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/admin/gr-create-repo-dialog/gr-create-repo-dialog.js b/polygerrit-ui/app/elements/admin/gr-create-repo-dialog/gr-create-repo-dialog.js
new file mode 100644
index 0000000..bb2b5f2
--- /dev/null
+++ b/polygerrit-ui/app/elements/admin/gr-create-repo-dialog/gr-create-repo-dialog.js
@@ -0,0 +1,132 @@
+/**
+ * @license
+ * Copyright (C) 2017 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-create-repo-dialog',
+
+    properties: {
+      params: Object,
+      hasNewRepoName: {
+        type: Boolean,
+        notify: true,
+        value: false,
+      },
+
+      /** @type {?} */
+      _repoConfig: {
+        type: Object,
+        value: () => {
+          // Set default values for dropdowns.
+          return {
+            create_empty_commit: true,
+            permissions_only: false,
+          };
+        },
+      },
+      _repoCreated: {
+        type: Boolean,
+        value: false,
+      },
+      _repoOwner: String,
+      _repoOwnerId: {
+        type: String,
+        observer: '_repoOwnerIdUpdate',
+      },
+
+      _query: {
+        type: Function,
+        value() {
+          return this._getRepoSuggestions.bind(this);
+        },
+      },
+      _queryGroups: {
+        type: Function,
+        value() {
+          return this._getGroupSuggestions.bind(this);
+        },
+      },
+    },
+
+    observers: [
+      '_updateRepoName(_repoConfig.name)',
+    ],
+
+    behaviors: [
+      Gerrit.BaseUrlBehavior,
+      Gerrit.URLEncodingBehavior,
+    ],
+
+    _computeRepoUrl(repoName) {
+      return this.getBaseUrl() + '/admin/repos/' +
+          this.encodeURL(repoName, true);
+    },
+
+    _updateRepoName(name) {
+      this.hasNewRepoName = !!name;
+    },
+
+    _repoOwnerIdUpdate(id) {
+      if (id) {
+        this.set('_repoConfig.owners', [id]);
+      } else {
+        this.set('_repoConfig.owners', undefined);
+      }
+    },
+
+    handleCreateRepo() {
+      return this.$.restAPI.createRepo(this._repoConfig)
+          .then(repoRegistered => {
+            if (repoRegistered.status === 201) {
+              this._repoCreated = true;
+              page.show(this._computeRepoUrl(this._repoConfig.name));
+            }
+          });
+    },
+
+    _getRepoSuggestions(input) {
+      return this.$.restAPI.getSuggestedProjects(input)
+          .then(response => {
+            const repos = [];
+            for (const key in response) {
+              if (!response.hasOwnProperty(key)) { continue; }
+              repos.push({
+                name: key,
+                value: response[key],
+              });
+            }
+            return repos;
+          });
+    },
+
+    _getGroupSuggestions(input) {
+      return this.$.restAPI.getSuggestedGroups(input)
+          .then(response => {
+            const groups = [];
+            for (const key in response) {
+              if (!response.hasOwnProperty(key)) { continue; }
+              groups.push({
+                name: key,
+                value: decodeURIComponent(response[key].id),
+              });
+            }
+            return groups;
+          });
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/admin/gr-create-repo-dialog/gr-create-repo-dialog_test.html b/polygerrit-ui/app/elements/admin/gr-create-repo-dialog/gr-create-repo-dialog_test.html
new file mode 100644
index 0000000..6bc3522
--- /dev/null
+++ b/polygerrit-ui/app/elements/admin/gr-create-repo-dialog/gr-create-repo-dialog_test.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html>
+<!--
+@license
+Copyright (C) 2017 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-create-repo-dialog</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-create-repo-dialog.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-create-repo-dialog></gr-create-repo-dialog>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-create-repo-dialog tests', () => {
+    let element;
+    let sandbox;
+
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+      stub('gr-rest-api-interface', {
+        getLoggedIn() { return Promise.resolve(true); },
+      });
+      element = fixture('basic');
+    });
+
+    teardown(() => {
+      sandbox.restore();
+    });
+
+    test('default values are populated', () => {
+      assert.isTrue(element.$.initalCommit.bindValue);
+      assert.isFalse(element.$.parentRepo.bindValue);
+    });
+
+    test('repo created', done => {
+      const configInputObj = {
+        name: 'test-repo',
+        create_empty_commit: true,
+        parent: 'All-Project',
+        permissions_only: false,
+        owners: ['testId'],
+      };
+
+      const saveStub = sandbox.stub(element.$.restAPI,
+          'createRepo', () => {
+            return Promise.resolve({});
+          });
+
+      assert.isFalse(element.hasNewRepoName);
+
+      element._repoConfig = {
+        name: 'test-repo',
+        create_empty_commit: true,
+        parent: 'All-Project',
+        permissions_only: false,
+      };
+
+      element._repoOwner = 'test';
+      element._repoOwnerId = 'testId';
+
+      element.$.repoNameInput.bindValue = configInputObj.name;
+      element.$.rightsInheritFromInput.bindValue = configInputObj.parent;
+      element.$.ownerInput.text = configInputObj.owners[0];
+      element.$.initalCommit.bindValue =
+          configInputObj.create_empty_commit;
+      element.$.parentRepo.bindValue =
+          configInputObj.permissions_only;
+
+      assert.isTrue(element.hasNewRepoName);
+
+      assert.deepEqual(element._repoConfig, configInputObj);
+
+      element.handleCreateRepo().then(() => {
+        assert.isTrue(saveStub.lastCall.calledWithExactly(configInputObj));
+        done();
+      });
+    });
+
+    test('testing observer of _repoOwner', () => {
+      element._repoOwnerId = 'test-5';
+      assert.deepEqual(element._repoConfig.owners, ['test-5']);
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log.html b/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log.html
index 43c893c..05b176c 100644
--- a/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log.html
+++ b/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -18,13 +19,20 @@
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
 <link rel="import" href="../../../styles/gr-table-styles.html">
 <link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../../core/gr-navigation/gr-navigation.html">
 <link rel="import" href="../../shared/gr-date-formatter/gr-date-formatter.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
 
 <dom-module id="gr-group-audit-log">
   <template>
     <style include="shared-styles"></style>
-    <style include="gr-table-styles"></style>
+    <style include="gr-table-styles">
+      /* GenericList style centers the last column, but we don't want that here. */
+      .genericList tr th:last-of-type,
+      .genericList tr td:last-of-type {
+        text-align: left;
+      }
+    </style>
     <table id="list" class="genericList">
       <tr class="headerRow">
         <th class="date topHeader">Date</th>
@@ -46,11 +54,20 @@
           </td>
           <td class="type">[[itemType(item.type)]]</td>
           <td class="member">
-            <a href$="[[_computeGroupUrl(item.member.group_id)]]">
-              [[_getNameForMember(item.member)]]
-            </a>
+            <template is="dom-if" if="[[_isGroupEvent(item.type)]]">
+              <a href$="[[_computeGroupUrl(item.member)]]">
+                [[_getNameForGroup(item.member)]]
+              </a>
+            </template>
+            <template is="dom-if" if="[[!_isGroupEvent(item.type)]]">
+              <gr-account-link account="[[item.member]]"></gr-account-link>
+              [[_getIdForUser(item.member)]]
+            </template>
           </td>
-          <td class="by-user">[[_getNameForUser(item.user)]]</td>
+          <td class="by-user">
+            <gr-account-link account="[[item.user]]"></gr-account-link>
+            [[_getIdForUser(item.user)]]
+          </td>
         </tr>
       </template>
     </table>
diff --git a/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log.js b/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log.js
index 0bc9a99..bc6a5d0 100644
--- a/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log.js
+++ b/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log.js
@@ -1,25 +1,30 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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 GROUP_EVENTS = ['ADD_GROUP', 'REMOVE_GROUP'];
+
   Polymer({
     is: 'gr-group-audit-log',
 
     properties: {
-      groupId: Object,
-      _auditLog: Object,
+      groupId: String,
+      _auditLog: Array,
       _loading: {
         type: Boolean,
         value: true,
@@ -39,30 +44,27 @@
     },
 
     _getAuditLogs() {
-      if (!this.groupId) {
-        return '';
-      }
-      return this.$.restAPI.getGroupAuditLog(this.groupId).then(auditLog => {
-        if (!auditLog) {
-          this._auditLog = [];
-          return;
-        }
-        this._auditLog = auditLog;
-        this._loading = false;
-      });
+      if (!this.groupId) { return ''; }
+
+      const errFn = response => {
+        this.fire('page-error', {response});
+      };
+
+      return this.$.restAPI.getGroupAuditLog(this.groupId, errFn)
+          .then(auditLog => {
+            if (!auditLog) {
+              this._auditLog = [];
+              return;
+            }
+            this._auditLog = auditLog;
+            this._loading = false;
+          });
     },
 
     _status(item) {
       return item.disabled ? 'Disabled' : 'Enabled';
     },
 
-    _computeGroupUrl(id) {
-      if (!id) {
-        return '';
-      }
-      return this.getBaseUrl() + '/admin/groups/' + id;
-    },
-
     itemType(type) {
       let item;
       switch (type) {
@@ -80,20 +82,31 @@
       return item;
     },
 
-    _getNameForUser(account) {
-      const accountId = account._account_id ? ' (' +
-        account._account_id + ')' : '';
-      return this._getNameForMember(account) + accountId;
+    _isGroupEvent(type) {
+      return GROUP_EVENTS.indexOf(type) !== -1;
     },
 
-    _getNameForMember(account) {
-      if (account && account.name) {
-        return account.name;
-      } else if (account && account.username) {
-        return account.username;
-      } else if (account && account.email) {
-        return account.email.split('@')[0];
+    _computeGroupUrl(group) {
+      if (group && group.url && group.id) {
+        return Gerrit.Nav.getUrlForGroup(group.id);
       }
+
+      return '';
+    },
+
+    _getIdForUser(account) {
+      return account._account_id ? ' (' + account._account_id + ')' : '';
+    },
+
+    _getNameForGroup(group) {
+      if (group && group.name) {
+        return group.name;
+      } else if (group && group.id) {
+        // The URL encoded id of the member
+        return decodeURIComponent(group.id);
+      }
+
+      return '';
     },
   });
 })();
diff --git a/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log_test.html b/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log_test.html
index b179718..59a665b 100644
--- a/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log_test.html
+++ b/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -34,87 +35,80 @@
 <script>
   suite('gr-group-audit-log tests', () => {
     let element;
+    let sandbox;
 
     setup(() => {
+      sandbox = sinon.sandbox.create();
       element = fixture('basic');
     });
 
-    suite('members', () => {
-      test('test getNameForMember', () => {
-        let account = {
-          member: {
-            username: 'test-user',
-            _account_id: 12,
-          },
-        };
-        assert.equal(element._getNameForMember(account.member, false),
-            'test-user');
+    teardown(() => {
+      sandbox.restore();
+    });
 
-        account = {
+    suite('members', () => {
+      test('test _getNameForGroup', () => {
+        let group = {
           member: {
             name: 'test-name',
-            _account_id: 12,
           },
         };
-        assert.equal(element._getNameForMember(account.member), 'test-name');
+        assert.equal(element._getNameForGroup(group.member), 'test-name');
 
-        account = {
-          user: {
-            email: 'test-email@gmail.com',
+        group = {
+          member: {
+            id: 'test-id',
           },
         };
-        assert.equal(element._getNameForMember(account.user), 'test-email');
+        assert.equal(element._getNameForGroup(group.member), 'test-id');
+      });
+
+      test('test _isGroupEvent', () => {
+        assert.isTrue(element._isGroupEvent('ADD_GROUP'));
+        assert.isTrue(element._isGroupEvent('REMOVE_GROUP'));
+
+        assert.isFalse(element._isGroupEvent('ADD_USER'));
+        assert.isFalse(element._isGroupEvent('REMOVE_USER'));
       });
     });
 
     suite('users', () => {
-      test('test _getName', () => {
-        let account = {
+      test('test _getIdForUser', () => {
+        const account = {
           user: {
             username: 'test-user',
             _account_id: 12,
           },
         };
-        assert.equal(element._getNameForUser(account.user), 'test-user (12)');
-
-        account = {
-          user: {
-            name: 'test-name',
-            _account_id: 12,
-          },
-        };
-        assert.equal(element._getNameForUser(account.user), 'test-name (12)');
-
-        account = {
-          user: {
-            email: 'test-email@gmail.com',
-            _account_id: 12,
-          },
-        };
-        assert.equal(element._getNameForUser(account.user), 'test-email (12)');
+        assert.equal(element._getIdForUser(account.user), ' (12)');
       });
 
       test('test _account_id not present', () => {
-        let account = {
+        const account = {
           user: {
             username: 'test-user',
           },
         };
-        assert.equal(element._getNameForUser(account.user), 'test-user');
+        assert.equal(element._getIdForUser(account.user), '');
+      });
+    });
 
-        account = {
-          user: {
-            name: 'test-name',
-          },
-        };
-        assert.equal(element._getNameForUser(account.user), 'test-name');
+    suite('404', () => {
+      test('fires page-error', done => {
+        element.groupId = 1;
 
-        account = {
-          user: {
-            email: 'test-email@gmail.com',
-          },
-        };
-        assert.equal(element._getNameForUser(account.user), 'test-email');
+        const response = {status: 404};
+        sandbox.stub(
+            element.$.restAPI, 'getGroupAuditLog', (group, errFn) => {
+              errFn(response);
+            });
+
+        element.addEventListener('page-error', e => {
+          assert.deepEqual(e.detail.response, response);
+          done();
+        });
+
+        element._getAuditLogs();
       });
     });
   });
diff --git a/polygerrit-ui/app/elements/admin/gr-group-members/gr-group-members.html b/polygerrit-ui/app/elements/admin/gr-group-members/gr-group-members.html
index 4de9a95..bcfc9e1 100644
--- a/polygerrit-ui/app/elements/admin/gr-group-members/gr-group-members.html
+++ b/polygerrit-ui/app/elements/admin/gr-group-members/gr-group-members.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -15,11 +16,13 @@
 -->
 
 <link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
-<link rel="import" href="../../../behaviors/gr-url-encoding-behavior.html">
+<link rel="import" href="../../../behaviors/gr-url-encoding-behavior/gr-url-encoding-behavior.html">
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
 <link rel="import" href="../../../bower_components/iron-autogrow-textarea/iron-autogrow-textarea.html">
 <link rel="import" href="../../../bower_components/iron-input/iron-input.html">
 <link rel="import" href="../../../styles/gr-form-styles.html">
+<link rel="import" href="../../../styles/gr-subpage-styles.html">
+<link rel="import" href="../../../styles/gr-table-styles.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 <link rel="import" href="../../shared/gr-account-link/gr-account-link.html">
 <link rel="import" href="../../shared/gr-autocomplete/gr-autocomplete.html">
@@ -31,40 +34,30 @@
 <dom-module id="gr-group-members">
   <template>
     <style include="gr-form-styles"></style>
+    <style include="gr-table-styles"></style>
+    <style include="gr-subpage-styles"></style>
     <style include="shared-styles">
-      main {
-        margin: 2em 1em;
-      }
-      .loading {
-        display: none;
-      }
-      #loading.loading {
-        display: block;
-      }
-      #loading:not(.loading) {
-        display: none;
-      }
       .input {
         width: 15em;
       }
       gr-autocomplete {
         width: 20em;
         --gr-autocomplete: {
-          font-size: 1em;
+          font-size: var(--font-size-normal);
           height: 2em;
           width: 20em;
         }
       }
       a {
-        color: var(--default-text-color);
+        color: var(--primary-text-color);
         text-decoration: none;
       }
       a:hover {
         text-decoration: underline;
       }
       th {
-        border-bottom: 1px solid #eee;
-        font-family: var(--font-family-bold);
+        border-bottom: 1px solid var(--border-color);
+        font-weight: var(--font-weight-bold);
         text-align: left;
       }
       .canModify #groupMemberSearchInput,
@@ -117,7 +110,7 @@
                     <td>[[item.email]]</td>
                     <td class="deleteColumn">
                       <gr-button
-                          class="deleteButton"
+                          class="deleteMembersButton"
                           on-tap="_handleDeleteMember">
                         Delete
                       </gr-button>
@@ -132,7 +125,8 @@
             <span class="value">
               <gr-autocomplete
                   id="includedGroupSearchInput"
-                  text="{{_includedGroupSearch}}"
+                  text="{{_includedGroupSearchName}}"
+                  value="{{_includedGroupSearchId}}"
                   query="[[_queryIncludedGroup]]"
                   placeholder="Group Name">
               </gr-autocomplete>
@@ -140,7 +134,7 @@
             <gr-button
                 id="saveIncludedGroups"
                 on-tap="_handleSavingIncludedGroups"
-                disabled="[[!_includedGroupSearch]]">
+                disabled="[[!_includedGroupSearchId]]">
               Add
             </gr-button>
             <table id="includedGroups">
@@ -155,10 +149,15 @@
                 <template is="dom-repeat" items="[[_includedGroups]]">
                   <tr>
                     <td class="nameColumn">
-                      <a href$="[[_computeGroupUrl(item.url)]]"
-                          rel="noopener">
+                      <template is="dom-if" if="[[item.url]]">
+                        <a href$="[[_computeGroupUrl(item.url)]]"
+                            rel="noopener">
+                          [[item.name]]
+                        </a>
+                      </template>
+                      <template is="dom-if" if="[[!item.url]]">
                         [[item.name]]
-                      </a>
+                      </template>
                     </td>
                     <td>[[item.description]]</td>
                     <td class="deleteColumn">
diff --git a/polygerrit-ui/app/elements/admin/gr-group-members/gr-group-members.js b/polygerrit-ui/app/elements/admin/gr-group-members/gr-group-members.js
index 5257e69..2e36a38 100644
--- a/polygerrit-ui/app/elements/admin/gr-group-members/gr-group-members.js
+++ b/polygerrit-ui/app/elements/admin/gr-group-members/gr-group-members.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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';
 
@@ -27,7 +30,8 @@
       groupId: Number,
       _groupMemberSearchId: String,
       _groupMemberSearchName: String,
-      _includedGroupSearch: String,
+      _includedGroupSearchId: String,
+      _includedGroupSearchName: String,
       _loading: {
         type: Boolean,
         value: true,
@@ -75,9 +79,13 @@
 
       const promises = [];
 
-      return this.$.restAPI.getGroupConfig(this.groupId).then(
-          config => {
-            if (!config.name) { return; }
+      const errFn = response => {
+        this.fire('page-error', {response});
+      };
+
+      return this.$.restAPI.getGroupConfig(this.groupId, errFn)
+          .then(config => {
+            if (!config || !config.name) { return Promise.resolve(); }
 
             this._groupName = config.name;
 
@@ -115,6 +123,8 @@
     },
 
     _computeGroupUrl(url) {
+      if (!url) { return; }
+
       const r = new RegExp(URL_REGEX, 'i');
       if (r.test(url)) {
         return url;
@@ -136,6 +146,7 @@
             this.$.restAPI.getGroupMembers(this._groupName).then(members => {
               this._groupMembers = members;
             });
+            this._groupMemberSearchName = '';
             this._groupMemberSearchId = '';
           });
     },
@@ -155,9 +166,9 @@
             });
       } else if (this._itemType === 'includedGroup') {
         return this.$.restAPI.deleteIncludedGroup(this._groupName,
-            this._itemName)
+            this._itemId)
             .then(itemDeleted => {
-              if (itemDeleted.status === 204) {
+              if (itemDeleted.status === 204 || itemDeleted.status === 205) {
                 this.$.restAPI.getIncludedGroup(this._groupName)
                     .then(includedGroup => {
                       this._includedGroups = includedGroup;
@@ -188,7 +199,7 @@
 
     _handleSavingIncludedGroups() {
       return this.$.restAPI.saveIncludedGroup(this._groupName,
-          this._includedGroupSearch, err => {
+          this._includedGroupSearchId.replace(/\+/g, ' '), err => {
             if (err.status === 404) {
               this.dispatchEvent(new CustomEvent('show-alert', {
                 detail: {message: SAVING_ERROR_TEXT},
@@ -206,16 +217,18 @@
                 .then(includedGroup => {
                   this._includedGroups = includedGroup;
                 });
-            this._includedGroupSearch = '';
+            this._includedGroupSearchName = '';
+            this._includedGroupSearchId = '';
           });
     },
 
     _handleDeleteIncludedGroup(e) {
+      const id = decodeURIComponent(e.model.get('item.id')).replace(/\+/g, ' ');
       const name = e.model.get('item.name');
-      if (!name) {
-        return '';
-      }
-      this._itemName = name;
+      const item = name || id;
+      if (!item) { return ''; }
+      this._itemName = item;
+      this._itemId = id;
       this._itemType = 'includedGroup';
       this.$.overlay.open();
     },
@@ -252,7 +265,7 @@
               if (!response.hasOwnProperty(key)) { continue; }
               groups.push({
                 name: key,
-                value: response[key],
+                value: decodeURIComponent(response[key].id),
               });
             }
             return groups;
diff --git a/polygerrit-ui/app/elements/admin/gr-group-members/gr-group-members_test.html b/polygerrit-ui/app/elements/admin/gr-group-members/gr-group-members_test.html
index d670d4d..81123e7 100644
--- a/polygerrit-ui/app/elements/admin/gr-group-members/gr-group-members_test.html
+++ b/polygerrit-ui/app/elements/admin/gr-group-members/gr-group-members_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -38,9 +39,11 @@
     let groups;
     let groupMembers;
     let includedGroups;
+    let groupStub;
 
     setup(() => {
       sandbox = sinon.sandbox.create();
+
       groups = {
         name: 'Administrators',
         owner: 'Administrators',
@@ -114,13 +117,24 @@
             return Promise.resolve({});
           }
         },
+        getSuggestedGroups(input) {
+          if (input.startsWith('test')) {
+            return Promise.resolve({
+              'test-admin': {
+                id: '1ce023d3fb4e4260776fb92cd08b52bbd21ce70a',
+              },
+              'test/Administrator (admin)': {
+                id: 'test%3Aadmin',
+              },
+            });
+          } else {
+            return Promise.resolve({});
+          }
+        },
         getLoggedIn() { return Promise.resolve(true); },
         getConfig() {
           return Promise.resolve();
         },
-        getGroupConfig() {
-          return Promise.resolve(groups);
-        },
         getGroupMembers() {
           return Promise.resolve(groupMembers);
         },
@@ -137,6 +151,9 @@
       element = fixture('basic');
       sandbox.stub(element, 'getBaseUrl').returns('https://test/site');
       element.groupId = 1;
+      groupStub = sandbox.stub(element.$.restAPI, 'getGroupConfig', () => {
+        return Promise.resolve(groups);
+      });
       return element._loadGroupDetails();
     });
 
@@ -156,7 +173,7 @@
           'https://test/site/group/url');
     });
 
-    test('save correctly', () => {
+    test('save members correctly', () => {
       element._groupOwner = true;
 
       const memberName = 'test-admin';
@@ -166,7 +183,7 @@
             return Promise.resolve({});
           });
 
-      const button = Polymer.dom(element.root).querySelector('gr-button');
+      const button = element.$.saveGroupMember;
 
       assert.isTrue(button.hasAttribute('disabled'));
 
@@ -183,6 +200,33 @@
       });
     });
 
+    test('save included groups correctly', () => {
+      element._groupOwner = true;
+
+      const includedGroupName = 'testName';
+
+      const saveIncludedGroupStub = sandbox.stub(
+          element.$.restAPI, 'saveIncludedGroup', () => {
+            return Promise.resolve({});
+          });
+
+      const button = element.$.saveIncludedGroups;
+
+      assert.isTrue(button.hasAttribute('disabled'));
+
+      element.$.includedGroupSearchInput.text = includedGroupName;
+      element.$.includedGroupSearchInput.value = 'testId';
+
+      assert.isFalse(button.hasAttribute('disabled'));
+
+      return element._handleSavingIncludedGroups().then(() => {
+        assert.isTrue(button.hasAttribute('disabled'));
+        assert.isFalse(element.$.Title.classList.contains('edited'));
+        assert.equal(saveIncludedGroupStub.lastCall.args[0], 'Administrators');
+        assert.equal(saveIncludedGroupStub.lastCall.args[1], 'testId');
+      });
+    });
+
     test('add included group 404 shows helpful error text', () => {
       element._groupOwner = true;
 
@@ -217,6 +261,20 @@
       });
     });
 
+    test('_getGroupSuggestions empty', () => {
+      return element._getGroupSuggestions('nonexistent').then(groups => {
+        assert.equal(groups.length, 0);
+      });
+    });
+
+    test('_getGroupSuggestions non-empty', () => {
+      return element._getGroupSuggestions('test').then(groups => {
+        assert.equal(groups.length, 2);
+        assert.equal(groups[0].name, 'test-admin');
+        assert.equal(groups[1].name, 'test/Administrator (admin)');
+      });
+    });
+
     test('_computeHideItemClass returns string for admin', () => {
       const admin = true;
       const owner = false;
@@ -237,7 +295,7 @@
 
     test('delete member', () => {
       const deletelBtns = Polymer.dom(element.root)
-          .querySelectorAll('.deleteButton');
+          .querySelectorAll('.deleteMembersButton');
       MockInteractions.tap(deletelBtns[0]);
       assert.equal(element._itemId, '1000097');
       assert.equal(element._itemName, 'jane');
@@ -251,5 +309,58 @@
       assert.equal(element._itemId, '1000098');
       assert.equal(element._itemName, '1000098');
     });
+
+    test('delete included groups', () => {
+      const deletelBtns = Polymer.dom(element.root)
+          .querySelectorAll('.deleteIncludedGroupButton');
+      MockInteractions.tap(deletelBtns[0]);
+      assert.equal(element._itemId, 'testId');
+      assert.equal(element._itemName, 'testName');
+      MockInteractions.tap(deletelBtns[1]);
+      assert.equal(element._itemId, 'testId2');
+      assert.equal(element._itemName, 'testName2');
+      MockInteractions.tap(deletelBtns[2]);
+      assert.equal(element._itemId, 'testId3');
+      assert.equal(element._itemName, 'testName3');
+    });
+
+    test('_computeLoadingClass', () => {
+      assert.equal(element._computeLoadingClass(true), 'loading');
+
+      assert.equal(element._computeLoadingClass(false), '');
+    });
+
+    test('_computeGroupUrl', () => {
+      assert.isUndefined(element._computeGroupUrl(undefined));
+
+      assert.isUndefined(element._computeGroupUrl(false));
+
+      let url = '#/admin/groups/uuid-529b3c2605bb1029c8146f9de4a91c776fe64498';
+      assert.equal(element._computeGroupUrl(url),
+          'https://test/site/admin/groups/' +
+          'uuid-529b3c2605bb1029c8146f9de4a91c776fe64498');
+
+      url = 'https://gerrit.local/admin/groups/' +
+          'uuid-529b3c2605bb1029c8146f9de4a91c776fe64498';
+      assert.equal(element._computeGroupUrl(url), url);
+    });
+
+    test('fires page-error', done => {
+      groupStub.restore();
+
+      element.groupId = 1;
+
+      const response = {status: 404};
+      sandbox.stub(
+          element.$.restAPI, 'getGroupConfig', (group, errFn) => {
+            errFn(response);
+          });
+      element.addEventListener('page-error', e => {
+        assert.deepEqual(e.detail.response, response);
+        done();
+      });
+
+      element._loadGroupDetails();
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/admin/gr-group/gr-group.html b/polygerrit-ui/app/elements/admin/gr-group/gr-group.html
index c2743b7..b92dc4b 100644
--- a/polygerrit-ui/app/elements/admin/gr-group/gr-group.html
+++ b/polygerrit-ui/app/elements/admin/gr-group/gr-group.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -18,32 +19,21 @@
 <link rel="import" href="../../../bower_components/iron-autogrow-textarea/iron-autogrow-textarea.html">
 <link rel="import" href="../../../bower_components/iron-input/iron-input.html">
 <link rel="import" href="../../../styles/gr-form-styles.html">
+<link rel="import" href="../../../styles/gr-subpage-styles.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 <link rel="import" href="../../shared/gr-autocomplete/gr-autocomplete.html">
 <link rel="import" href="../../shared/gr-copy-clipboard/gr-copy-clipboard.html">
-<link rel="import" href="../../shared/gr-download-commands/gr-download-commands.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
 <link rel="import" href="../../shared/gr-select/gr-select.html">
 
 <dom-module id="gr-group">
   <template>
-    <style include="shared-styles">
-      main {
-        margin: 2em 1em;
-      }
+    <style include="shared-styles"></style>
+    <style include="gr-subpage-styles">
       h3.edited:after {
-        color: #444;
+        color: var(--deemphasized-text-color);
         content: ' *';
       }
-      .loading {
-        display: none;
-      }
-      #loading.loading {
-        display: block;
-      }
-      #loading:not(.loading) {
-        display: none;
-      }
       .inputUpdateBtn {
         margin-top: .3em;
       }
@@ -71,9 +61,9 @@
                 <gr-autocomplete
                     id="groupNameInput"
                     text="{{_groupConfig.name}}"
-                    disabled="[[_computeGroupDisabled(_groupOwner, _isAdmin)]]"></gr-autocomplete>
+                    disabled="[[_computeGroupDisabled(_groupOwner, _isAdmin, _groupIsInternal)]]"></gr-autocomplete>
               </span>
-              <span class="value" disabled$="[[_computeGroupDisabled(_groupOwner, _isAdmin)]]">
+              <span class="value" disabled$="[[_computeGroupDisabled(_groupOwner, _isAdmin, _groupIsInternal)]]">
                 <gr-button
                     id="inputUpdateNameBtn"
                     on-tap="_handleSaveName"
@@ -91,10 +81,10 @@
                     text="{{_groupConfig.owner}}"
                     value="{{_groupConfigOwner}}"
                     query="[[_query]]"
-                    disabled="[[_computeGroupDisabled(_groupOwner, _isAdmin)]]">
+                    disabled="[[_computeGroupDisabled(_groupOwner, _isAdmin, _groupIsInternal)]]">
                 </gr-autocomplete>
               </span>
-              <span class="value" disabled$="[[_computeGroupDisabled(_groupOwner, _isAdmin)]]">
+              <span class="value" disabled$="[[_computeGroupDisabled(_groupOwner, _isAdmin, _groupIsInternal)]]">
                 <gr-button
                     on-tap="_handleSaveOwner"
                     disabled="[[!_owner]]">
@@ -110,9 +100,9 @@
                     class="description"
                     autocomplete="on"
                     bind-value="{{_groupConfig.description}}"
-                    disabled="[[_computeGroupDisabled(_groupOwner, _isAdmin)]]"></iron-autogrow-textarea>
+                    disabled="[[_computeGroupDisabled(_groupOwner, _isAdmin, _groupIsInternal)]]"></iron-autogrow-textarea>
               </div>
-              <span class="value" disabled$="[[_computeGroupDisabled(_groupOwner, _isAdmin)]]">
+              <span class="value" disabled$="[[_computeGroupDisabled(_groupOwner, _isAdmin, _groupIsInternal)]]">
                 <gr-button
                     on-tap="_handleSaveDescription"
                     disabled="[[!_description]]">
@@ -132,7 +122,7 @@
                   <gr-select
                       id="visibleToAll"
                       bind-value="{{_groupConfig.options.visible_to_all}}">
-                    <select disabled$="[[_computeGroupDisabled(_groupOwner, _isAdmin)]]">
+                    <select disabled$="[[_computeGroupDisabled(_groupOwner, _isAdmin, _groupIsInternal)]]">
                       <template is="dom-repeat" items="[[_submitTypes]]">
                         <option value="[[item.value]]">[[item.label]]</option>
                       </template>
@@ -140,7 +130,7 @@
                   </gr-select>
                 </span>
               </section>
-              <span class="value" disabled$="[[_computeGroupDisabled(_groupOwner, _isAdmin)]]">
+              <span class="value" disabled$="[[_computeGroupDisabled(_groupOwner, _isAdmin, _groupIsInternal)]]">
                 <gr-button
                     on-tap="_handleSaveOptions"
                     disabled="[[!_options]]">
diff --git a/polygerrit-ui/app/elements/admin/gr-group/gr-group.js b/polygerrit-ui/app/elements/admin/gr-group/gr-group.js
index 3067bf6..e2ecfba 100644
--- a/polygerrit-ui/app/elements/admin/gr-group/gr-group.js
+++ b/polygerrit-ui/app/elements/admin/gr-group/gr-group.js
@@ -1,19 +1,24 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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 INTERNAL_GROUP_REGEX = /^[\da-f]{40}$/;
+
   const OPTIONS = {
     submitFalse: {
       value: false,
@@ -40,6 +45,7 @@
         type: Boolean,
         value: false,
       },
+      _groupIsInternal: Boolean,
       _description: {
         type: Boolean,
         value: false,
@@ -96,18 +102,27 @@
     _loadGroup() {
       if (!this.groupId) { return; }
 
-      return this.$.restAPI.getGroupConfig(this.groupId).then(
-          config => {
+      const promises = [];
+
+      const errFn = response => {
+        this.fire('page-error', {response});
+      };
+
+      return this.$.restAPI.getGroupConfig(this.groupId, errFn)
+          .then(config => {
+            if (!config || !config.name) { return Promise.resolve(); }
+
             this._groupName = config.name;
+            this._groupIsInternal = !!config.id.match(INTERNAL_GROUP_REGEX);
 
-            this.$.restAPI.getIsAdmin().then(isAdmin => {
+            promises.push(this.$.restAPI.getIsAdmin().then(isAdmin => {
               this._isAdmin = isAdmin ? true : false;
-            });
+            }));
 
-            this.$.restAPI.getIsGroupOwner(config.name)
+            promises.push(this.$.restAPI.getIsGroupOwner(config.name)
                 .then(isOwner => {
                   this._groupOwner = isOwner ? true : false;
-                });
+                }));
 
             // If visible to all is undefined, set to false. If it is defined
             // as false, setting to false is fine. If any optional values
@@ -120,7 +135,9 @@
 
             this.fire('title-change', {title: config.name});
 
-            this._loading = false;
+            return Promise.all(promises).then(() => {
+              this._loading = false;
+            });
           });
     },
 
@@ -137,7 +154,8 @@
           .then(config => {
             if (config.status === 200) {
               this._groupName = this._groupConfig.name;
-              this.fire('name-changed', {name: this._groupConfig.name});
+              this.fire('name-changed', {name: this._groupConfig.name,
+                external: this._groupIsExtenral});
               this._rename = false;
             }
           });
@@ -211,8 +229,8 @@
           });
     },
 
-    _computeGroupDisabled(owner, admin) {
-      return admin || owner ? false : true;
+    _computeGroupDisabled(owner, admin, groupIsInternal) {
+      return groupIsInternal && (admin || owner) ? false : true;
     },
   });
 })();
diff --git a/polygerrit-ui/app/elements/admin/gr-group/gr-group_test.html b/polygerrit-ui/app/elements/admin/gr-group/gr-group_test.html
index 7789cd5..226f3ab 100644
--- a/polygerrit-ui/app/elements/admin/gr-group/gr-group_test.html
+++ b/polygerrit-ui/app/elements/admin/gr-group/gr-group_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -35,25 +36,27 @@
   suite('gr-group tests', () => {
     let element;
     let sandbox;
+    let groupStub;
+    const group = {
+      id: '6a1e70e1a88782771a91808c8af9bbb7a9871389',
+      url: '#/admin/groups/uuid-6a1e70e1a88782771a91808c8af9bbb7a9871389',
+      options: {},
+      description: 'Gerrit Site Administrators',
+      group_id: 1,
+      owner: 'Administrators',
+      owner_id: '6a1e70e1a88782771a91808c8af9bbb7a9871389',
+      name: 'Administrators',
+    };
 
     setup(() => {
       sandbox = sinon.sandbox.create();
       stub('gr-rest-api-interface', {
         getLoggedIn() { return Promise.resolve(true); },
-        getGroupConfig() {
-          return Promise.resolve({
-            id: '6a1e70e1a88782771a91808c8af9bbb7a9871389',
-            url: '#/admin/groups/uuid-6a1e70e1a88782771a91808c8af9bbb7a9871389',
-            options: {
-            },
-            description: 'Gerrit Site Administrators',
-            group_id: 1,
-            owner: 'Administrators',
-            owner_id: '6a1e70e1a88782771a91808c8af9bbb7a9871389',
-          });
-        },
       });
       element = fixture('basic');
+      groupStub = sandbox.stub(element.$.restAPI, 'getGroupConfig', () => {
+        return Promise.resolve(group);
+      });
     });
 
     teardown(() => {
@@ -68,12 +71,31 @@
           .display === 'none');
     });
 
-    test('default values are populated', done => {
+    test('default values are populated with internal group', done => {
       sandbox.stub(element.$.restAPI, 'getIsGroupOwner', () => {
         return Promise.resolve(true);
       });
       element.groupId = 1;
       element._loadGroup().then(() => {
+        assert.isTrue(element._groupIsInternal);
+        assert.isFalse(element.$.visibleToAll.bindValue);
+        done();
+      });
+    });
+
+    test('default values with external group', done => {
+      const groupExternal = Object.assign({}, group);
+      groupExternal.id = 'external-group-id';
+      groupStub.restore();
+      groupStub = sandbox.stub(element.$.restAPI, 'getGroupConfig', () => {
+        return Promise.resolve(groupExternal);
+      });
+      sandbox.stub(element.$.restAPI, 'getIsGroupOwner', () => {
+        return Promise.resolve(true);
+      });
+      element.groupId = 1;
+      element._loadGroup().then(() => {
+        assert.isFalse(element._groupIsInternal);
         assert.isFalse(element.$.visibleToAll.bindValue);
         done();
       });
@@ -127,6 +149,30 @@
       });
     });
 
+    test('test for undefined group name', done => {
+      groupStub.restore();
+
+      sandbox.stub(element.$.restAPI, 'getGroupConfig', () => {
+        return Promise.resolve({});
+      });
+
+      assert.isUndefined(element.groupId);
+
+      element.groupId = 1;
+
+      assert.isDefined(element.groupId);
+
+      // Test that loading shows instead of filling
+      // in group details
+      element._loadGroup().then(() => {
+        assert.isTrue(element.$.loading.classList.contains('loading'));
+
+        assert.isTrue(element._loading);
+
+        done();
+      });
+    });
+
     test('test fire event', done => {
       element._groupConfig = {
         name: 'test-group',
@@ -143,28 +189,56 @@
           });
     });
 
-    test('_computeGroupDisabled return false for admin', () => {
-      const admin = true;
-      const owner = false;
-      assert.equal(element._computeGroupDisabled(owner, admin), false);
+    test('_computeGroupDisabled', () => {
+      let admin = true;
+      let owner = false;
+      let groupIsInternal = true;
+      assert.equal(element._computeGroupDisabled(owner, admin,
+          groupIsInternal), false);
+
+      admin = false;
+      assert.equal(element._computeGroupDisabled(owner, admin,
+          groupIsInternal), true);
+
+      owner = true;
+      assert.equal(element._computeGroupDisabled(owner, admin,
+          groupIsInternal), false);
+
+      owner = false;
+      assert.equal(element._computeGroupDisabled(owner, admin,
+          groupIsInternal), true);
+
+      groupIsInternal = false;
+      assert.equal(element._computeGroupDisabled(owner, admin,
+          groupIsInternal), true);
+
+      admin = true;
+      assert.equal(element._computeGroupDisabled(owner, admin,
+          groupIsInternal), true);
     });
 
-    test('_computeGroupDisabled return true for admin', () => {
-      const admin = false;
-      const owner = false;
-      assert.equal(element._computeGroupDisabled(owner, admin), true);
+    test('_computeLoadingClass', () => {
+      assert.equal(element._computeLoadingClass(true), 'loading');
+      assert.equal(element._computeLoadingClass(false), '');
     });
 
-    test('_computeGroupDisabled return false for owner', () => {
-      const admin = false;
-      const owner = true;
-      assert.equal(element._computeGroupDisabled(owner, admin), false);
-    });
+    test('fires page-error', done => {
+      groupStub.restore();
 
-    test('_computeGroupDisabled return true for owner', () => {
-      const admin = false;
-      const owner = false;
-      assert.equal(element._computeGroupDisabled(owner, admin), true);
+      element.groupId = 1;
+
+      const response = {status: 404};
+      sandbox.stub(
+          element.$.restAPI, 'getGroupConfig', (group, errFn) => {
+            errFn(response);
+          });
+
+      element.addEventListener('page-error', e => {
+        assert.deepEqual(e.detail.response, response);
+        done();
+      });
+
+      element._loadGroup();
     });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/admin/gr-permission/gr-permission.html b/polygerrit-ui/app/elements/admin/gr-permission/gr-permission.html
index 31171f7..a5bb5fd 100644
--- a/polygerrit-ui/app/elements/admin/gr-permission/gr-permission.html
+++ b/polygerrit-ui/app/elements/admin/gr-permission/gr-permission.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,6 +17,7 @@
 
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
 <link rel="import" href="../../../behaviors/gr-access-behavior/gr-access-behavior.html">
+<link rel="import" href="../../../bower_components/paper-toggle-button/paper-toggle-button.html">
 <link rel="import" href="../../../styles/gr-form-styles.html">
 <link rel="import" href="../../../styles/gr-menu-page-styles.html">
 <link rel="import" href="../../../styles/shared-styles.html">
@@ -37,17 +39,13 @@
         justify-content: space-between;
         margin: .3em .7em;
       }
-      #deletedContainer {
-        border: 1px solid #d1d2d3;
-        padding: .7em;
-      }
       .rules {
-        background: #fafafa;
-        border: 1px solid #d1d2d3;
+        background: var(--table-header-background-color);
+        border: 1px solid var(--border-color);
         border-bottom: 0;
       }
       .editing .rules {
-        border-bottom: 1px solid #d1d2d3;
+        border-bottom: 1px solid var(--border-color);
       }
       .title {
         margin-bottom: .3em;
@@ -56,8 +54,13 @@
       #removeBtn {
         display: none;
       }
+      .right {
+        display: flex;
+        align-items: center;
+      }
       .editing #removeBtn {
         display: block;
+        margin-left: 1.5em;
       }
       .editing #addRule {
         display: block;
@@ -67,7 +70,13 @@
       .deleted #mainContainer {
         display: none;
       }
-      .deleted #deletedContainer,
+      .deleted #deletedContainer {
+        align-items: baseline;
+        border: 1px solid var(--border-color);
+        display: flex;
+        justify-content: space-between;
+        padding: .7em;
+      }
       #mainContainer {
         display: block;
       }
@@ -80,9 +89,19 @@
       <div id="mainContainer">
         <div class="header">
           <span class="title">[[name]]</span>
-          <gr-button
-              id="removeBtn"
-              on-tap="_handleRemovePermission">Remove</gr-button>
+          <div class="right">
+            <template is=dom-if if="[[!_permissionIsOwnerOrGlobal(permission.id, section)]]">
+              <paper-toggle-button
+                  id="exclusiveToggle"
+                  checked="{{permission.value.exclusive}}"
+                  on-change="_handleValueChange"
+                  disabled$="[[!editing]]"></paper-toggle-button>Exclusive
+            </template>
+            <gr-button
+                link
+                id="removeBtn"
+                on-tap="_handleRemovePermission">Remove</gr-button>
+          </div>
         </div><!-- end header -->
         <div class="rules">
           <template
@@ -90,27 +109,32 @@
               items="{{_rules}}"
               as="rule">
             <gr-rule-editor
+                has-range="[[_computeHasRange(name)]]"
                 label="[[_label]]"
                 editing="[[editing]]"
                 group-id="[[rule.id]]"
                 group-name="[[_computeGroupName(groups, rule.id)]]"
                 permission="[[permission.id]]"
                 rule="{{rule}}"
-                section="[[section]]"></gr-rule-editor>
+                section="[[section]]"
+                on-added-rule-removed="_handleAddedRuleRemoved"></gr-rule-editor>
           </template>
           <div id="addRule">
             <gr-autocomplete
+                id="groupAutocomplete"
                 text="{{_groupFilter}}"
                 query="[[_query]]"
                 placeholder="Add group"
                 on-commit="_handleAddRuleItem">
             </gr-autocomplete>
-          </div> <!-- end addRule -->
+          </div>
+          <!-- end addRule -->
         </div> <!-- end rules -->
       </div><!-- end mainContainer -->
       <div id="deletedContainer">
-        [[name]] was deleted
+        <span>[[name]] was deleted</span>
         <gr-button
+            link
             id="undoRemoveBtn"
             on-tap="_handleUndoRemove">Undo</gr-button>
       </div><!-- end deletedContainer -->
diff --git a/polygerrit-ui/app/elements/admin/gr-permission/gr-permission.js b/polygerrit-ui/app/elements/admin/gr-permission/gr-permission.js
index 2ba1eed..c45ffd5 100644
--- a/polygerrit-ui/app/elements/admin/gr-permission/gr-permission.js
+++ b/polygerrit-ui/app/elements/admin/gr-permission/gr-permission.js
@@ -1,21 +1,40 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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 MAX_AUTOCOMPLETE_RESULTS = 20;
 
+  const RANGE_NAMES = [
+    'QUERY LIMIT',
+    'BATCH CHANGES LIMIT',
+  ];
+
+  /**
+   * Fired when the permission has been modified or removed.
+   *
+   * @event access-modified
+   */
+
+  /**
+   * Fired when a permission that was previously added was removed.
+   * @event added-permission-removed
+   */
+
   Polymer({
     is: 'gr-permission',
 
@@ -33,6 +52,7 @@
       editing: {
         type: Boolean,
         value: false,
+        observer: '_handleEditingChanged',
       },
       _label: {
         type: Object,
@@ -51,6 +71,7 @@
         type: Boolean,
         value: false,
       },
+      _originalExclusiveValue: Boolean,
     },
 
     behaviors: [
@@ -61,6 +82,73 @@
       '_handleRulesChanged(_rules.splices)',
     ],
 
+    listeners: {
+      'access-saved': '_handleAccessSaved',
+    },
+
+    ready() {
+      this._setupValues();
+    },
+
+    _setupValues() {
+      if (!this.permission) { return; }
+      this._originalExclusiveValue = !!this.permission.value.exclusive;
+      Polymer.dom.flush();
+    },
+
+    _handleAccessSaved() {
+      // Set a new 'original' value to keep track of after the value has been
+      // saved.
+      this._setupValues();
+    },
+
+    _permissionIsOwnerOrGlobal(permissionId, section) {
+      return permissionId === 'owner' || section === 'GLOBAL_CAPABILITIES';
+    },
+
+    _handleEditingChanged(editing, editingOld) {
+      // Ignore when editing gets set initially.
+      if (!editingOld) { return; }
+      // Restore original values if no longer editing.
+      if (!editing) {
+        this._deleted = false;
+        delete this.permission.value.deleted;
+        this._groupFilter = '';
+        this._rules = this._rules.filter(rule => !rule.value.added);
+        for (const key of Object.keys(this.permission.value.rules)) {
+          if (this.permission.value.rules[key].added) {
+            delete this.permission.value.rules[key];
+          }
+        }
+
+        // Restore exclusive bit to original.
+        this.set(['permission', 'value', 'exclusive'],
+            this._originalExclusiveValue);
+      }
+    },
+
+    _handleAddedRuleRemoved(e) {
+      const index = e.model.index;
+      this._rules = this._rules.slice(0, index)
+          .concat(this._rules.slice(index + 1, this._rules.length));
+    },
+
+    _handleValueChange() {
+      this.permission.value.modified = true;
+      // Allows overall access page to know a change has been made.
+      this.dispatchEvent(new CustomEvent('access-modified', {bubbles: true}));
+    },
+
+    _handleRemovePermission() {
+      if (this.permission.value.added) {
+        this.dispatchEvent(new CustomEvent('added-permission-removed',
+            {bubbles: true}));
+      }
+      this._deleted = true;
+      this.permission.value.deleted = true;
+      this.dispatchEvent(new CustomEvent('access-modified', {bubbles: true}));
+    },
+
     _handleRulesChanged(changeRecord) {
       // Update the groups to exclude in the autocomplete.
       this._groupsWithRules = this._computeGroupsWithRules(this._rules);
@@ -70,11 +158,6 @@
       this._rules = this.toSortedArray(permission.value.rules);
     },
 
-    _handleRemovePermission() {
-      this._deleted = true;
-      this.set('permission.value.deleted', true);
-    },
-
     _computeSectionClass(editing, deleted) {
       const classList = [];
       if (editing) {
@@ -164,21 +247,38 @@
      * gr-rule-editor handles setting the default values.
      */
     _handleAddRuleItem(e) {
-      this.set(['permission', 'value', 'rules', e.detail.value.id], {});
+      // The group id is encoded, but have to decode in order for the access
+      // API to work as expected.
+      const groupId = decodeURIComponent(e.detail.value.id).replace(/\+/g, ' ');
+      this.set(['permission', 'value', 'rules', groupId], {});
 
       // Purposely don't recompute sorted array so that the newly added rule
       // is the last item of the array.
       this.push('_rules', {
-        id: e.detail.value.id,
+        id: groupId,
       });
 
-      // Wait for new rule to get value populated via gr-rule editor, and then
+      // Add the new group name to the groups object so the name renders
+      // correctly.
+      if (this.groups && !this.groups[groupId]) {
+        this.groups[groupId] = {name: this.$.groupAutocomplete.text};
+      }
+
+      // Wait for new rule to get value populated via gr-rule-editor, and then
       // add to permission values as well, so that the change gets propogated
       // back to the section. Since the rule is inside a dom-repeat, a flush
       // is needed.
       Polymer.dom.flush();
-      this.set(['permission', 'value', 'rules', e.detail.value.id],
-          this._rules[this._rules.length - 1].value);
+      const value = this._rules[this._rules.length - 1].value;
+      value.added = true;
+      this.set(['permission', 'value', 'rules', groupId], value);
+      this.dispatchEvent(new CustomEvent('access-modified', {bubbles: true}));
+    },
+
+    _computeHasRange(name) {
+      if (!name) { return false; }
+
+      return RANGE_NAMES.includes(name.toUpperCase());
     },
   });
-})();
\ No newline at end of file
+})();
diff --git a/polygerrit-ui/app/elements/admin/gr-permission/gr-permission_test.html b/polygerrit-ui/app/elements/admin/gr-permission/gr-permission_test.html
index 179d221..5f1f9b5 100644
--- a/polygerrit-ui/app/elements/admin/gr-permission/gr-permission_test.html
+++ b/polygerrit-ui/app/elements/admin/gr-permission/gr-permission_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -237,10 +238,15 @@
       });
 
       test('_handleRemovePermission', () => {
+        element.editing = true;
         element.permission = {value: {rules: {}}};
         element._handleRemovePermission();
         assert.isTrue(element._deleted);
         assert.isTrue(element.permission.value.deleted);
+
+        element.editing = false;
+        assert.isFalse(element._deleted);
+        assert.isNotOk(element.permission.value.deleted);
       });
 
       test('_handleUndoRemove', () => {
@@ -249,6 +255,14 @@
         assert.isFalse(element._deleted);
         assert.isNotOk(element.permission.value.deleted);
       });
+
+      test('_computeHasRange', () => {
+        assert.isTrue(element._computeHasRange('Query Limit'));
+
+        assert.isTrue(element._computeHasRange('Batch Changes Limit'));
+
+        assert.isFalse(element._computeHasRange('test'));
+      });
     });
 
     suite('interactions', () => {
@@ -288,28 +302,59 @@
             },
           },
         };
+        element._setupValues();
         flushAsynchronousOperations();
       });
 
       test('adding a rule', () => {
         element.name = 'Priority';
         element.section = 'refs/*';
+        element.groups = {};
+        element.$.groupAutocomplete.text = 'ldap/tests tests';
         const e = {
           detail: {
             value: {
-              id: 'newUserGroupId',
+              id: 'ldap:CN=test+test',
             },
           },
         };
-
+        element.editing = true;
         assert.equal(element._rules.length, 2);
         assert.equal(Object.keys(element._groupsWithRules).length, 2);
         element._handleAddRuleItem(e);
         flushAsynchronousOperations();
+        assert.deepEqual(element.groups, {'ldap:CN=test test': {
+          name: 'ldap/tests tests'}});
         assert.equal(element._rules.length, 3);
         assert.equal(Object.keys(element._groupsWithRules).length, 3);
-        assert.deepEqual(element.permission.value.rules['newUserGroupId'],
-            {action: 'ALLOW', min: -2, max: 2});
+        assert.deepEqual(element.permission.value.rules['ldap:CN=test test'],
+            {action: 'ALLOW', min: -2, max: 2, added: true});
+        // New rule should be removed if cancel from editing.
+        element.editing = false;
+        assert.equal(element._rules.length, 2);
+        assert.equal(Object.keys(element.permission.value.rules).length, 2);
+      });
+
+      test('removing an added rule', () => {
+        element.name = 'Priority';
+        element.section = 'refs/*';
+        element.groups = {};
+        element.$.groupAutocomplete.text = 'new group name';
+        assert.equal(element._rules.length, 2);
+        element.$$('gr-rule-editor').fire('added-rule-removed');
+        flushAsynchronousOperations();
+        assert.equal(element._rules.length, 1);
+      });
+
+      test('removing an added permission', () => {
+        const removeStub = sandbox.stub();
+        element.addEventListener('added-permission-removed', removeStub);
+        element.editing = true;
+        element.name = 'Priority';
+        element.section = 'refs/*';
+        element.permission.value.added = true;
+        MockInteractions.tap(element.$.removeBtn);
+        assert.isTrue(removeStub.called);
       });
 
       test('removing the permission', () => {
@@ -317,6 +362,9 @@
         element.name = 'Priority';
         element.section = 'refs/*';
 
+        const removeStub = sandbox.stub();
+        element.addEventListener('added-permission-removed', removeStub);
+
         assert.isFalse(element.$.permission.classList.contains('deleted'));
         assert.isFalse(element._deleted);
         MockInteractions.tap(element.$.removeBtn);
@@ -325,6 +373,51 @@
         MockInteractions.tap(element.$.undoRemoveBtn);
         assert.isFalse(element.$.permission.classList.contains('deleted'));
         assert.isFalse(element._deleted);
+        assert.isFalse(removeStub.called);
+      });
+
+      test('modify a permission', () => {
+        element.editing = true;
+        element.name = 'Priority';
+        element.section = 'refs/*';
+
+        assert.isFalse(element._originalExclusiveValue);
+        assert.isNotOk(element.permission.value.modified);
+        MockInteractions.tap(element.$$('#exclusiveToggle'));
+        flushAsynchronousOperations();
+        assert.isTrue(element.permission.value.exclusive);
+        assert.isTrue(element.permission.value.modified);
+        assert.isFalse(element._originalExclusiveValue);
+        element.editing = false;
+        assert.isFalse(element.permission.value.exclusive);
+      });
+
+      test('_handleValueChange', () => {
+        const modifiedHandler = sandbox.stub();
+        element.permission = {value: {rules: {}}};
+        element.addEventListener('access-modified', modifiedHandler);
+        assert.isNotOk(element.permission.value.modified);
+        element._handleValueChange();
+        assert.isTrue(element.permission.value.modified);
+        assert.isTrue(modifiedHandler.called);
+      });
+
+      test('Exclusive hidden for owner permission', () => {
+        assert.equal(getComputedStyle(element.$$('#exclusiveToggle')).display,
+            'flex');
+        element.set(['permission', 'id'], 'owner');
+        flushAsynchronousOperations();
+        assert.equal(getComputedStyle(element.$$('#exclusiveToggle')).display,
+            'none');
+      });
+
+      test('Exclusive hidden for any global permissions', () => {
+        assert.equal(getComputedStyle(element.$$('#exclusiveToggle')).display,
+            'flex');
+        element.section = 'GLOBAL_CAPABILITIES';
+        flushAsynchronousOperations();
+        assert.equal(getComputedStyle(element.$$('#exclusiveToggle')).display,
+            'none');
       });
     });
   });
diff --git a/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list.html b/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list.html
index 7d12e96..9e4396a 100644
--- a/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list.html
+++ b/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -45,7 +46,12 @@
           <template is="dom-repeat" items="[[_shownPlugins]]">
             <tr class="table">
               <td class="name">
-                <a href$="[[_computePluginUrl(item.index_url)]]">[[item.id]]</a>
+                <template is="dom-if" if="[[item.index_url]]">
+                  <a href$="[[_computePluginUrl(item.index_url)]]">[[item.id]]</a>
+                </template>
+                <template is="dom-if" if="[[!item.index_url]]">
+                  [[item.id]]
+                </template>
               </td>
               <td class="version">[[item.version]]</td>
               <td class="status">[[_status(item)]]</td>
diff --git a/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list.js b/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list.js
index d441407..6cbc94a 100644
--- a/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list.js
+++ b/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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';
 
@@ -78,7 +81,10 @@
     },
 
     _getPlugins(filter, pluginsPerPage, offset) {
-      return this.$.restAPI.getPlugins(filter, pluginsPerPage, offset)
+      const errFn = response => {
+        this.fire('page-error', {response});
+      };
+      return this.$.restAPI.getPlugins(filter, pluginsPerPage, offset, errFn)
           .then(plugins => {
             if (!plugins) {
               this._plugins = [];
diff --git a/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list_test.html b/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list_test.html
index 52f1a22..9781cf7 100644
--- a/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list_test.html
+++ b/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -35,12 +36,16 @@
 <script>
   let counter;
   const pluginGenerator = () => {
-    return {
+    const plugin = {
       id: `test${++counter}`,
-      index_url: `plugins/test${counter}/`,
       version: '3.0-SNAPSHOT',
       disabled: false,
     };
+
+    if (counter !== 2) {
+      plugin.index_url = `plugins/test${counter}/`;
+    }
+    return plugin;
   };
 
   suite('gr-plugin-list tests', () => {
@@ -82,6 +87,17 @@
         });
       });
 
+      test('with and without urls', done => {
+        flush(() => {
+          const names = Polymer.dom(element.root).querySelectorAll('.name');
+          assert.isOk(names[1].querySelector('a'));
+          assert.equal(names[1].querySelector('a').innerText, 'test1');
+          assert.isNotOk(names[2].querySelector('a'));
+          assert.equal(names[2].innerText, 'test2');
+          done();
+        });
+      });
+
       test('_shownPlugins', () => {
         assert.equal(element._shownPlugins.length, 25);
       });
@@ -115,8 +131,12 @@
           offset: 25,
         };
         element._paramsChanged(value).then(() => {
-          assert.isTrue(element.$.restAPI.getPlugins.lastCall
-              .calledWithExactly('test', 25, 25));
+          assert.equal(element.$.restAPI.getPlugins.lastCall.args[0],
+              'test');
+          assert.equal(element.$.restAPI.getPlugins.lastCall.args[1],
+              25);
+          assert.equal(element.$.restAPI.getPlugins.lastCall.args[2],
+              25);
           done();
         });
       });
@@ -136,5 +156,26 @@
         assert.equal(getComputedStyle(element.$.loading).display, 'none');
       });
     });
+
+    suite('404', () => {
+      test('fires page-error', done => {
+        const response = {status: 404};
+        sandbox.stub(element.$.restAPI, 'getPlugins',
+            (filter, pluginsPerPage, opt_offset, errFn) => {
+              errFn(response);
+            });
+
+        element.addEventListener('page-error', e => {
+          assert.deepEqual(e.detail.response, response);
+          done();
+        });
+
+        const value = {
+          filter: 'test',
+          offset: 25,
+        };
+        element._paramsChanged(value);
+      });
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/admin/gr-project-access/gr-project-access.html b/polygerrit-ui/app/elements/admin/gr-project-access/gr-project-access.html
deleted file mode 100644
index ca3abc4..0000000
--- a/polygerrit-ui/app/elements/admin/gr-project-access/gr-project-access.html
+++ /dev/null
@@ -1,69 +0,0 @@
-<!--
-Copyright (C) 2017 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="../../../bower_components/polymer/polymer.html">
-
-<link rel="import" href="../../../behaviors/gr-access-behavior/gr-access-behavior.html">
-<link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
-<link rel="import" href="../../../behaviors/gr-url-encoding-behavior.html">
-
-<link rel="import" href="../../../styles/gr-menu-page-styles.html">
-<link rel="import" href="../../../styles/shared-styles.html">
-<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
-<link rel="import" href="../gr-access-section/gr-access-section.html">
-
-<script src="../../../scripts/util.js"></script>
-
-<dom-module id="gr-project-access">
-  <template>
-    <style include="shared-styles">
-      .gwtLink {
-        margin-bottom: 1em;
-      }
-      .gwtLink {
-        display: none;
-      }
-      .admin .gwtLink {
-        display: block;
-      }
-    </style>
-    <style include="gr-menu-page-styles"></style>
-    <main class$="[[_computeAdminClass(_isAdmin)]]">
-      <div class="gwtLink">This is currently in read only mode.  To modify content, go to the
-        <a href$="[[computeGwtUrl(path)]]" rel="external">Old UI</a>
-      </div>
-      <template is="dom-if" if="[[_inheritsFrom]]">
-        <h3 id="inheritsFrom">Rights Inherit From
-          <a href$="[[_computeParentHref(_inheritsFrom.name)]]" rel="noopener">
-              [[_inheritsFrom.name]]</a>
-        </h3>
-      </template>
-      <template
-          is="dom-repeat"
-          items="{{_sections}}"
-          as="section">
-        <gr-access-section
-            capabilities="[[_capabilities]]"
-            section="{{section}}"
-            labels="[[_labels]]"
-            editing="[[_editing]]"
-            groups="[[_groups]]"></gr-access-section>
-      </template>
-    </main>
-    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
-  </template>
-  <script src="gr-project-access.js"></script>
-</dom-module>
diff --git a/polygerrit-ui/app/elements/admin/gr-project-access/gr-project-access.js b/polygerrit-ui/app/elements/admin/gr-project-access/gr-project-access.js
deleted file mode 100644
index d736dac..0000000
--- a/polygerrit-ui/app/elements/admin/gr-project-access/gr-project-access.js
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright (C) 2017 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-project-access',
-
-    properties: {
-      project: {
-        type: String,
-        observer: '_projectChanged',
-      },
-      // The current path
-      path: String,
-
-      _isAdmin: {
-        type: Boolean,
-        value: false,
-      },
-      _capabilities: Object,
-      _groups: Object,
-      /** @type {?} */
-      _inheritsFrom: Object,
-      _labels: Object,
-      _local: Object,
-      _editing: {
-        type: Boolean,
-        value: false,
-      },
-      _sections: Array,
-    },
-
-    behaviors: [
-      Gerrit.AccessBehavior,
-      Gerrit.BaseUrlBehavior,
-      Gerrit.URLEncodingBehavior,
-    ],
-
-    /**
-     * @param {string} project
-     * @return {!Promise}
-     */
-    _projectChanged(project) {
-      if (!project) { return Promise.resolve(); }
-      const promises = [];
-      // Always reset sections when a project changes.
-      this._sections = [];
-      promises.push(this.$.restAPI.getProjectAccessRights(project).then(res => {
-        this._inheritsFrom = res.inherits_from;
-        this._local = res.local;
-        this._groups = res.groups;
-        return this.toSortedArray(this._local);
-      }));
-
-      promises.push(this.$.restAPI.getCapabilities().then(res => {
-        return res;
-      }));
-
-      promises.push(this.$.restAPI.getProject(project).then(res => {
-        return res.labels;
-      }));
-
-      promises.push(this.$.restAPI.getIsAdmin().then(isAdmin => {
-        this._isAdmin = isAdmin;
-      }));
-
-      return Promise.all(promises).then(([sections, capabilities, labels]) => {
-        this._capabilities = capabilities;
-        this._labels = labels;
-        this._sections = sections;
-      });
-    },
-
-    _computeAdminClass(isAdmin) {
-      return isAdmin ? 'admin' : '';
-    },
-
-    _computeParentHref(projectName) {
-      return this.getBaseUrl() +
-          `/admin/projects/${this.encodeURL(projectName, true)},access`;
-    },
-  });
-})();
\ No newline at end of file
diff --git a/polygerrit-ui/app/elements/admin/gr-project-access/gr-project-access_test.html b/polygerrit-ui/app/elements/admin/gr-project-access/gr-project-access_test.html
deleted file mode 100644
index 8ea14cf..0000000
--- a/polygerrit-ui/app/elements/admin/gr-project-access/gr-project-access_test.html
+++ /dev/null
@@ -1,198 +0,0 @@
-<!DOCTYPE html>
-<!--
-Copyright (C) 2017 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-project-access</title>
-
-<script src="../../../bower_components/page/page.js"></script>
-<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
-<script src="../../../bower_components/web-component-tester/browser.js"></script>
-<link rel="import" href="../../../test/common-test-setup.html"/>
-<link rel="import" href="gr-project-access.html">
-
-<script>void(0);</script>
-
-<test-fixture id="basic">
-  <template>
-    <gr-project-access></gr-project-access>
-  </template>
-</test-fixture>
-
-<script>
-  suite('gr-project-access tests', () => {
-    let element;
-    let sandbox;
-
-    setup(() => {
-      sandbox = sinon.sandbox.create();
-      element = fixture('basic');
-    });
-
-    teardown(() => {
-      sandbox.restore();
-    });
-
-    test('_projectChanged called when project name changes', () => {
-      sandbox.stub(element, '_projectChanged');
-      element.project = 'New Project';
-      assert.isTrue(element._projectChanged.called);
-    });
-
-    test('_projectChanged', done => {
-      const capabilitiesRes = {
-        accessDatabase: {
-          id: 'accessDatabase',
-          name: 'Access Database',
-        },
-        createAccount: {
-          id: 'createAccount',
-          name: 'Create Account',
-        },
-      };
-      const accessRes = {
-        local: {
-          'refs/*': {
-            permissions: {
-              owner: {
-                rules: {
-                  234: {},
-                },
-              },
-            },
-          },
-        },
-      };
-      const accessRes2 = {
-        local: {
-          GLOBAL_CAPABILITIES: {
-            permissions: {
-              accessDatabase: {
-                rules: {
-                  group1: {
-                    action: 'ALLOW',
-                  },
-                },
-              },
-            },
-          },
-        },
-      };
-      const projectRes = {
-        labels: {
-          'Code-Review': {},
-        },
-      };
-      const accessStub = sandbox.stub(element.$.restAPI,
-          'getProjectAccessRights');
-
-
-      accessStub.withArgs('New Project').returns(Promise.resolve(accessRes));
-      accessStub.withArgs('Another New Project')
-          .returns(Promise.resolve(accessRes2));
-      const capabilitiesStub = sandbox.stub(element.$.restAPI,
-          'getCapabilities');
-      capabilitiesStub.returns(Promise.resolve(capabilitiesRes));
-      const projectStub = sandbox.stub(element.$.restAPI, 'getProject').returns(
-          Promise.resolve(projectRes));
-      const adminStub = sandbox.stub(element.$.restAPI, 'getIsAdmin').returns(
-          Promise.resolve(true));
-
-      element._projectChanged('New Project').then(() => {
-        assert.isTrue(accessStub.called);
-        assert.isTrue(capabilitiesStub.called);
-        assert.isTrue(projectStub.called);
-        assert.isTrue(adminStub.called);
-        assert.isNotOk(element._inheritsFrom);
-        assert.deepEqual(element._local, accessRes.local);
-        assert.deepEqual(element._sections,
-            element.toSortedArray(accessRes.local));
-        assert.deepEqual(element._labels, projectRes.labels);
-        return element._projectChanged('Another New Project');
-      })
-          .then(() => {
-            assert.deepEqual(element._sections,
-                element.toSortedArray(accessRes2.local));
-            done();
-          });
-    });
-
-    test('_projectChanged when project changes to undefined returns', done => {
-      const capabilitiesRes = {
-        accessDatabase: {
-          id: 'accessDatabase',
-          name: 'Access Database',
-        },
-      };
-      const accessRes = {
-        local: {
-          GLOBAL_CAPABILITIES: {
-            permissions: {
-              accessDatabase: {
-                rules: {
-                  123: {},
-                },
-              },
-            },
-          },
-        },
-      };
-      const projectRes = {
-        labels: {
-          'Code-Review': {},
-        },
-      };
-      const accessStub = sandbox.stub(element.$.restAPI,
-          'getProjectAccessRights').returns(Promise.resolve(accessRes));
-      const capabilitiesStub = sandbox.stub(element.$.restAPI,
-          'getCapabilities').returns(Promise.resolve(capabilitiesRes));
-      const projectStub = sandbox.stub(element.$.restAPI, 'getProject').returns(
-          Promise.resolve(projectRes));
-
-      element._projectChanged().then(() => {
-        assert.isFalse(accessStub.called);
-        assert.isFalse(capabilitiesStub.called);
-        assert.isFalse(projectStub.called);
-        done();
-      });
-    });
-
-    test('_computeParentHref', () => {
-      const projectName = 'test-project';
-      assert.equal(element._computeParentHref(projectName),
-          '/admin/projects/test-project,access');
-    });
-
-    test('_computeAdminClass', () => {
-      let isAdmin = true;
-      assert.equal(element._computeAdminClass(isAdmin), 'admin');
-      isAdmin = false;
-      assert.equal(element._computeAdminClass(isAdmin), '');
-    });
-
-    test('inherit section', () => {
-      sandbox.stub(element, '_computeParentHref');
-      assert.isNotOk(Polymer.dom(element.root).querySelector('#inheritsFrom'));
-      assert.isFalse(element._computeParentHref.called);
-      element._inheritsFrom = {
-        name: 'another-project',
-      };
-      flushAsynchronousOperations();
-      assert.isOk(Polymer.dom(element.root).querySelector('#inheritsFrom'));
-      assert.isTrue(element._computeParentHref.called);
-    });
-  });
-</script>
diff --git a/polygerrit-ui/app/elements/admin/gr-project-commands/gr-project-commands.html b/polygerrit-ui/app/elements/admin/gr-project-commands/gr-project-commands.html
deleted file mode 100644
index 6c0908a..0000000
--- a/polygerrit-ui/app/elements/admin/gr-project-commands/gr-project-commands.html
+++ /dev/null
@@ -1,92 +0,0 @@
-<!--
-Copyright (C) 2017 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="../../../bower_components/polymer/polymer.html">
-<link rel="import" href="../../../bower_components/iron-autogrow-textarea/iron-autogrow-textarea.html">
-<link rel="import" href="../../../bower_components/iron-input/iron-input.html">
-<link rel="import" href="../../../styles/gr-form-styles.html">
-<link rel="import" href="../../../styles/shared-styles.html">
-<link rel="import" href="../../shared/gr-confirm-dialog/gr-confirm-dialog.html">
-<link rel="import" href="../../shared/gr-overlay/gr-overlay.html">
-<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
-<link rel="import" href="../gr-create-change-dialog/gr-create-change-dialog.html">
-
-<dom-module id="gr-project-commands">
-  <template>
-    <style include="shared-styles">
-      main {
-        margin: 2em 1em;
-      }
-      .loading {
-        display: none;
-      }
-      #loading.loading {
-        display: block;
-      }
-      #loading:not(.loading) {
-        display: none;
-      }
-    </style>
-    <style include="gr-form-styles"></style>
-    <main class="gr-form-styles read-only">
-      <h1 id="Title">Project Commands</h1>
-      <div id="loading" class$="[[_computeLoadingClass(_loading)]]">Loading...</div>
-      <div id="loadedContent" class$="[[_computeLoadingClass(_loading)]]">
-        <h2 id="options">Command</h2>
-        <div id="form">
-          <fieldset>
-            <h3 id="createChange">Create Change</h3>
-            <fieldset>
-              <gr-button id="createNewChange" on-tap="_createNewChange">
-                Create Change
-              </gr-button>
-            </fieldset>
-            <h3 id="runGC" hidden$="[[!_projectConfig.actions.gc.enabled]]">
-                Run GC
-            </h3>
-            <fieldset>
-              <gr-button
-                  on-tap="_handleRunningGC"
-                  hidden$="[[!_projectConfig.actions.gc.enabled]]">
-                Run GC
-              </gr-button>
-            </fieldset>
-          </fieldset>
-        </div>
-      </div>
-    </main>
-    <gr-overlay id="createChangeOverlay" with-backdrop>
-      <gr-confirm-dialog
-          id="createChangeDialog"
-          confirm-label="Create"
-          disabled="[[!_canCreate]]"
-          on-confirm="_handleCreateChange"
-          on-cancel="_handleCloseCreateChange">
-        <div class="header">
-          Create Change
-        </div>
-        <div class="main">
-          <gr-create-change-dialog
-              id="createNewChangeModal"
-              can-create="{{_canCreate}}"
-              project-name="[[project]]"></gr-create-change-dialog>
-        </div>
-      </gr-confirm-dialog>
-    </gr-overlay>
-    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
-  </template>
-  <script src="gr-project-commands.js"></script>
-</dom-module>
diff --git a/polygerrit-ui/app/elements/admin/gr-project-commands/gr-project-commands.js b/polygerrit-ui/app/elements/admin/gr-project-commands/gr-project-commands.js
deleted file mode 100644
index 88cf058..0000000
--- a/polygerrit-ui/app/elements/admin/gr-project-commands/gr-project-commands.js
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright (C) 2017 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 GC_MESSAGE = 'Garbage collection completed successfully.';
-
-  Polymer({
-    is: 'gr-project-commands',
-
-    properties: {
-      params: Object,
-      project: String,
-      _loading: {
-        type: Boolean,
-        value: true,
-      },
-      /** @type {?} */
-      _projectConfig: Object,
-      _canCreate: Boolean,
-    },
-
-    attached() {
-      this._loadProject();
-
-      this.fire('title-change', {title: 'Project Commands'});
-    },
-
-    _loadProject() {
-      if (!this.project) { return Promise.resolve(); }
-
-      return this.$.restAPI.getProjectConfig(this.project).then(
-          config => {
-            this._projectConfig = config;
-            this._loading = false;
-          });
-    },
-
-    _computeLoadingClass(loading) {
-      return loading ? 'loading' : '';
-    },
-
-    _isLoading() {
-      return this._loading || this._loading === undefined;
-    },
-
-    _handleRunningGC() {
-      return this.$.restAPI.runProjectGC(this.project).then(response => {
-        if (response.status === 200) {
-          this.dispatchEvent(new CustomEvent('show-alert',
-              {detail: {message: GC_MESSAGE}, bubbles: true}));
-        }
-      });
-    },
-
-    _createNewChange() {
-      this.$.createChangeOverlay.open();
-    },
-
-    _handleCreateChange() {
-      this.$.createNewChangeModal.handleCreateChange();
-      this._handleCloseCreateChange();
-    },
-
-    _handleCloseCreateChange() {
-      this.$.createChangeOverlay.close();
-    },
-  });
-})();
diff --git a/polygerrit-ui/app/elements/admin/gr-project-commands/gr-project-commands_test.html b/polygerrit-ui/app/elements/admin/gr-project-commands/gr-project-commands_test.html
deleted file mode 100644
index 693f07e..0000000
--- a/polygerrit-ui/app/elements/admin/gr-project-commands/gr-project-commands_test.html
+++ /dev/null
@@ -1,69 +0,0 @@
-<!DOCTYPE html>
-<!--
-Copyright (C) 2017 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-project-commands</title>
-
-<script src="../../../bower_components/page/page.js"></script>
-<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
-<script src="../../../bower_components/web-component-tester/browser.js"></script>
-<link rel="import" href="../../../test/common-test-setup.html"/>
-<link rel="import" href="gr-project-commands.html">
-
-<script>void(0);</script>
-
-<test-fixture id="basic">
-  <template>
-    <gr-project-commands></gr-project-commands>
-  </template>
-</test-fixture>
-
-<script>
-  suite('gr-project-commands tests', () => {
-    let element;
-    let sandbox;
-
-    setup(() => {
-      sandbox = sinon.sandbox.create();
-      element = fixture('basic');
-    });
-
-    teardown(() => {
-      sandbox.restore();
-    });
-
-    suite('create new change dialog', () => {
-      test('_createNewChange opens modal', () => {
-        const openStub = sandbox.stub(element.$.createChangeOverlay, 'open');
-        element._createNewChange();
-        assert.isTrue(openStub.called);
-      });
-
-      test('_handleCreateChange called when confirm fired', () => {
-        sandbox.stub(element, '_handleCreateChange');
-        element.$.createChangeDialog.fire('confirm');
-        assert.isTrue(element._handleCreateChange.called);
-      });
-
-      test('_handleCloseCreateChange called when cancel fired', () => {
-        sandbox.stub(element, '_handleCloseCreateChange');
-        element.$.createChangeDialog.fire('cancel');
-        assert.isTrue(element._handleCloseCreateChange.called);
-      });
-    });
-  });
-</script>
diff --git a/polygerrit-ui/app/elements/admin/gr-project-detail-list/gr-project-detail-list.html b/polygerrit-ui/app/elements/admin/gr-project-detail-list/gr-project-detail-list.html
deleted file mode 100644
index 2effc20..0000000
--- a/polygerrit-ui/app/elements/admin/gr-project-detail-list/gr-project-detail-list.html
+++ /dev/null
@@ -1,173 +0,0 @@
-<!--
-Copyright (C) 2017 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="../../../behaviors/gr-list-view-behavior/gr-list-view-behavior.html">
-<link rel="import" href="../../../behaviors/gr-url-encoding-behavior.html">
-<link rel="import" href="../../../bower_components/iron-input/iron-input.html">
-<link rel="import" href="../../../bower_components/polymer/polymer.html">
-<link rel="import" href="../../../styles/gr-table-styles.html">
-<link rel="import" href="../../../styles/gr-form-styles.html">
-<link rel="import" href="../../../styles/shared-styles.html">
-<link rel="import" href="../../shared/gr-button/gr-button.html">
-<link rel="import" href="../../shared/gr-list-view/gr-list-view.html">
-<link rel="import" href="../../shared/gr-overlay/gr-overlay.html">
-<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
-<link rel="import" href="../gr-create-pointer-dialog/gr-create-pointer-dialog.html">
-<link rel="import" href="../gr-confirm-delete-item-dialog/gr-confirm-delete-item-dialog.html">
-
-<dom-module id="gr-project-detail-list">
-  <template>
-    <style include="gr-form-styles"></style>
-    <style include="shared-styles">
-      .editing .editItem {
-        display: inherit;
-      }
-      .editItem,
-      .editing .editBtn,
-      .canEdit .revisionNoEditing,
-      .editing .revisionWithEditing,
-      .revisionEdit {
-        display: none;
-      }
-      .revisionEdit gr-button {
-        margin-left: .6em;
-      }
-      .editBtn {
-        margin-left: 1em;
-      }
-      .canEdit .revisionEdit{
-        align-items: center;
-        display: flex;
-        line-height: 1em;
-      }
-      .deleteButton:not(.show) {
-        display: none;
-      }
-    </style>
-    <style include="gr-table-styles"></style>
-    <gr-list-view
-        create-new="[[_loggedIn]]"
-        filter="[[_filter]]"
-        items-per-page="[[_itemsPerPage]]"
-        items="[[_items]]"
-        loading="[[_loading]]"
-        offset="[[_offset]]"
-        on-create-clicked="_handleCreateClicked"
-        path="[[_getPath(_project, detailType)]]">
-      <table id="list" class="genericList gr-form-styles">
-        <tr class="headerRow">
-          <th class="name topHeader">Name</th>
-          <th class="description topHeader">Revision</th>
-          <th class="repositoryBrowser topHeader">
-            Repository Browser</th>
-          <th class="delete topHeader"></th>
-        </tr>
-        <tr id="loading" class$="loadingMsg [[computeLoadingClass(_loading)]]">
-          <td>Loading...</td>
-        </tr>
-        <tbody class$="[[computeLoadingClass(_loading)]]">
-          <template is="dom-repeat" items="[[_shownItems]]">
-            <tr class="table">
-              <td class="name">[[_stripRefs(item.ref, detailType)]]</td>
-              <td class$="description [[_computeCanEditClass(item.ref, detailType, _isOwner)]]">
-                <span class="revisionNoEditing">
-                  [[item.revision]]
-                </span>
-                <span class$="revisionEdit [[_computeEditingClass(_isEditing)]]">
-                  <span class="revisionWithEditing">
-                    [[item.revision]]
-                  </span>
-                  <gr-button
-                      link
-                      on-tap="_handleEditRevision"
-                      class="editBtn">
-                    edit
-                  </gr-button>
-                  <input
-                      is=iron-input
-                      bind-value="{{_revisedRef}}"
-                      class="editItem">
-                  <gr-button
-                      link
-                      on-tap="_handleCancelRevision"
-                      class="cancelBtn editItem">
-                    Cancel
-                  </gr-button>
-                  <gr-button
-                      link
-                      on-tap="_handleSaveRevision"
-                      class="saveBtn editItem"
-                      disabled="[[!_revisedRef]]">
-                    Save
-                  </gr-button>
-                </span>
-              </td>
-              <td class="repositoryBrowser">
-                <template is="dom-repeat"
-                    items="[[_computeWeblink(item)]]" as="link">
-                  <a href$="[[link.url]]"
-                      class="webLink"
-                      rel="noopener"
-                      target="_blank">
-                    ([[link.name]])
-                  </a>
-                </template>
-              </td>
-              <td class="delete">
-                <gr-button
-                    link
-                    class$="deleteButton [[_computeHideDeleteClass(_isOwner, item.can_delete)]]"
-                    on-tap="_handleDeleteItem">
-                  Delete
-                </gr-button>
-              </td>
-            </tr>
-          </template>
-        </tbody>
-      </table>
-      <gr-overlay id="overlay" with-backdrop>
-        <gr-confirm-delete-item-dialog
-            class="confirmDialog"
-            on-confirm="_handleDeleteItemConfirm"
-            on-cancel="_handleConfirmDialogCancel"
-            item="[[_refName]]"
-            item-type="[[detailType]]"></gr-confirm-delete-item-dialog>
-      </gr-overlay>
-    </gr-list-view>
-    <gr-overlay id="createOverlay" with-backdrop>
-      <gr-confirm-dialog
-          id="createDialog"
-          disabled="[[!_hasNewItemName]]"
-          confirm-label="Create"
-          on-confirm="_handleCreateItem"
-          on-cancel="_handleCloseCreate">
-        <div class="header">
-          Create [[_computeItemName(detailType)]]
-        </div>
-        <div class="main">
-          <gr-create-pointer-dialog
-              id="createNewModal"
-              detail-type="[[_computeItemName(detailType)]]"
-              has-new-item-name="{{_hasNewItemName}}"
-              item-detail="[[detailType]]"
-              project-name="[[_project]]"></gr-create-pointer-dialog>
-        </div>
-      </gr-confirm-dialog>
-    </gr-overlay>
-    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
-  </template>
-  <script src="gr-project-detail-list.js"></script>
-</dom-module>
diff --git a/polygerrit-ui/app/elements/admin/gr-project-detail-list/gr-project-detail-list.js b/polygerrit-ui/app/elements/admin/gr-project-detail-list/gr-project-detail-list.js
deleted file mode 100644
index abcb593..0000000
--- a/polygerrit-ui/app/elements/admin/gr-project-detail-list/gr-project-detail-list.js
+++ /dev/null
@@ -1,257 +0,0 @@
-// Copyright (C) 2017 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 DETAIL_TYPES = {
-    BRANCHES: 'branches',
-    TAGS: 'tags',
-  };
-
-  Polymer({
-    is: 'gr-project-detail-list',
-
-    properties: {
-      /**
-       * URL params passed from the router.
-       */
-      params: {
-        type: Object,
-        observer: '_paramsChanged',
-      },
-      /**
-       * The kind of detail we are displaying, possibilities are determined by
-       * the const DETAIL_TYPES.
-       */
-      detailType: String,
-
-      _editing: {
-        type: Boolean,
-        value: false,
-      },
-      _isOwner: {
-        type: Boolean,
-        value: false,
-      },
-      _loggedIn: {
-        type: Boolean,
-        value: false,
-      },
-      /**
-       * Offset of currently visible query results.
-       */
-      _offset: Number,
-      _project: Object,
-      _items: Array,
-      /**
-       * Because  we request one more than the projectsPerPage, _shownProjects
-       * maybe one less than _projects.
-       */
-      _shownItems: {
-        type: Array,
-        computed: 'computeShownItems(_items)',
-      },
-      _itemsPerPage: {
-        type: Number,
-        value: 25,
-      },
-      _loading: {
-        type: Boolean,
-        value: true,
-      },
-      _filter: String,
-      _refName: String,
-      _hasNewItemName: Boolean,
-      _isEditing: Boolean,
-      _revisedRef: String,
-    },
-
-    behaviors: [
-      Gerrit.ListViewBehavior,
-      Gerrit.URLEncodingBehavior,
-    ],
-
-    _determineIfOwner(project) {
-      return this.$.restAPI.getProjectAccess(project)
-          .then(access =>
-                this._isOwner = access && !!access[project].is_owner);
-    },
-
-    _paramsChanged(params) {
-      if (!params || !params.project) { return; }
-
-      this._project = params.project;
-
-      this._getLoggedIn().then(loggedIn => {
-        this._loggedIn = loggedIn;
-        if (loggedIn) {
-          this._determineIfOwner(this._project);
-        }
-      });
-
-      this.detailType = params.detailType;
-
-      this._filter = this.getFilterValue(params);
-      this._offset = this.getOffsetValue(params);
-
-      return this._getItems(this._filter, this._project,
-          this._itemsPerPage, this._offset, this.detailType);
-    },
-
-    _getItems(filter, project, itemsPerPage, offset, detailType) {
-      this._loading = true;
-      this._items = [];
-      Polymer.dom.flush();
-      if (detailType === DETAIL_TYPES.BRANCHES) {
-        return this.$.restAPI.getProjectBranches(
-            filter, project, itemsPerPage, offset) .then(items => {
-              if (!items) { return; }
-              this._items = items;
-              this._loading = false;
-            });
-      } else if (detailType === DETAIL_TYPES.TAGS) {
-        return this.$.restAPI.getProjectTags(
-            filter, project, itemsPerPage, offset) .then(items => {
-              if (!items) { return; }
-              this._items = items;
-              this._loading = false;
-            });
-      }
-    },
-
-    _getPath(project) {
-      return `/admin/projects/${this.encodeURL(project, false)},` +
-          `${this.detailType}`;
-    },
-
-    _computeWeblink(project) {
-      if (!project.web_links) { return ''; }
-      const webLinks = project.web_links;
-      return webLinks.length ? webLinks : null;
-    },
-
-    _stripRefs(item, detailType) {
-      if (detailType === DETAIL_TYPES.BRANCHES) {
-        return item.replace('refs/heads/', '');
-      } else if (detailType === DETAIL_TYPES.TAGS) {
-        return item.replace('refs/tags/', '');
-      }
-    },
-
-    _getLoggedIn() {
-      return this.$.restAPI.getLoggedIn();
-    },
-
-    _computeEditingClass(isEditing) {
-      return isEditing ? 'editing' : '';
-    },
-
-    _computeCanEditClass(ref, detailType, isOwner) {
-      return isOwner && this._stripRefs(ref, detailType) === 'HEAD' ?
-          'canEdit' : '';
-    },
-
-    _handleEditRevision(e) {
-      this._revisedRef = e.model.get('item.revision');
-      this._isEditing = true;
-    },
-
-    _handleCancelRevision() {
-      this._isEditing = false;
-    },
-
-    _handleSaveRevision(e) {
-      this._setProjectHead(this._project, this._revisedRef, e);
-    },
-
-    _setProjectHead(project, ref, e) {
-      return this.$.restAPI.setProjectHead(project, ref).then(res => {
-        if (res.status < 400) {
-          this._isEditing = false;
-          e.model.set('item.revision', ref);
-          // This is needed to refresh _items property with fresh data,
-          // specifically can_delete from the json response.
-          this._getItems(
-              this._filter, this._project, this._itemsPerPage,
-              this._offset, this.detailType);
-        }
-      });
-    },
-
-    _computeItemName(detailType) {
-      if (detailType === DETAIL_TYPES.BRANCHES) {
-        return 'Branch';
-      } else if (detailType === DETAIL_TYPES.TAGS) {
-        return 'Tag';
-      }
-    },
-
-    _handleDeleteItemConfirm() {
-      this.$.overlay.close();
-      if (this.detailType === DETAIL_TYPES.BRANCHES) {
-        return this.$.restAPI.deleteProjectBranches(this._project,
-            this._refName)
-            .then(itemDeleted => {
-              if (itemDeleted.status === 204) {
-                this._getItems(
-                    this._filter, this._project, this._itemsPerPage,
-                    this._offset, this.detailType);
-              }
-            });
-      } else if (this.detailType === DETAIL_TYPES.TAGS) {
-        return this.$.restAPI.deleteProjectTags(this._project,
-            this._refName)
-            .then(itemDeleted => {
-              if (itemDeleted.status === 204) {
-                this._getItems(
-                    this._filter, this._project, this._itemsPerPage,
-                    this._offset, this.detailType);
-              }
-            });
-      }
-    },
-
-    _handleConfirmDialogCancel() {
-      this.$.overlay.close();
-    },
-
-    _handleDeleteItem(e) {
-      const name = this._stripRefs(e.model.get('item.ref'), this.detailType);
-      if (!name) { return; }
-      this._refName = name;
-      this.$.overlay.open();
-    },
-
-    _computeHideDeleteClass(owner, canDelete) {
-      if (canDelete || owner) {
-        return 'show';
-      }
-
-      return '';
-    },
-
-    _handleCreateItem() {
-      this.$.createNewModal.handleCreateItem();
-      this._handleCloseCreate();
-    },
-
-    _handleCloseCreate() {
-      this.$.createOverlay.close();
-    },
-
-    _handleCreateClicked() {
-      this.$.createOverlay.open();
-    },
-  });
-})();
diff --git a/polygerrit-ui/app/elements/admin/gr-project-detail-list/gr-project-detail-list_test.html b/polygerrit-ui/app/elements/admin/gr-project-detail-list/gr-project-detail-list_test.html
deleted file mode 100644
index 4663ce96..0000000
--- a/polygerrit-ui/app/elements/admin/gr-project-detail-list/gr-project-detail-list_test.html
+++ /dev/null
@@ -1,445 +0,0 @@
-<!DOCTYPE html>
-<!--
-Copyright (C) 2017 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-project-detail-list</title>
-
-<script src="../../../bower_components/page/page.js"></script>
-<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
-<script src="../../../bower_components/web-component-tester/browser.js"></script>
-<link rel="import" href="../../../test/common-test-setup.html"/>
-<link rel="import" href="gr-project-detail-list.html">
-
-<script>void(0);</script>
-
-<test-fixture id="basic">
-  <template>
-    <gr-project-detail-list></gr-project-detail-list>
-  </template>
-</test-fixture>
-
-<script>
-  let counter;
-  const branchGenerator = () => {
-    return {
-      ref: `refs/heads/test${++counter}`,
-      revision: '9c9d08a438e55e52f33b608415e6dddd9b18550d',
-      web_links: [
-        {
-          name: 'diffusion',
-          url: `https://git.example.org/branch/test;refs/heads/test${counter}`,
-        },
-      ],
-    };
-  };
-  const tagGenerator = () => {
-    return {
-      ref: `refs/tags/test${++counter}`,
-      revision: '9c9d08a438e55e52f33b608415e6dddd9b18550d',
-      web_links: [
-        {
-          name: 'diffusion',
-          url: `https://git.example.org/tag/test;refs/tags/test${counter}`,
-        },
-      ],
-    };
-  };
-
-  suite('Branches', () => {
-    let element;
-    let branches;
-    let sandbox;
-
-    setup(() => {
-      sandbox = sinon.sandbox.create();
-      element = fixture('basic');
-      element.detailType = 'branches';
-      counter = 0;
-      sandbox.stub(page, 'show');
-    });
-
-    teardown(() => {
-      sandbox.restore();
-    });
-
-    suite('list of project branches', () => {
-      setup(done => {
-        branches = [{
-          ref: 'HEAD',
-          revision: 'master',
-        }].concat(_.times(25, branchGenerator));
-
-        stub('gr-rest-api-interface', {
-          getProjectBranches(num, project, offset) {
-            return Promise.resolve(branches);
-          },
-        });
-
-        const params = {
-          project: 'test',
-          detailType: 'branches',
-        };
-
-        element._paramsChanged(params).then(() => { flush(done); });
-      });
-
-      test('test for branch in the list', done => {
-        flush(() => {
-          assert.equal(element._items[2].ref, 'refs/heads/test2');
-          done();
-        });
-      });
-
-      test('test for web links in the branches list', done => {
-        flush(() => {
-          assert.equal(element._items[2].web_links[0].url,
-              'https://git.example.org/branch/test;refs/heads/test2');
-          done();
-        });
-      });
-
-      test('test for refs/heads/ being striped from ref', done => {
-        flush(() => {
-          assert.equal(element._stripRefs(element._items[2].ref,
-              element.detailType), 'test2');
-          done();
-        });
-      });
-
-      test('_shownItems', () => {
-        assert.equal(element._shownItems.length, 25);
-      });
-
-      test('Edit HEAD button not admin', done => {
-        sandbox.stub(element, '_getLoggedIn').returns(Promise.resolve(true));
-        sandbox.stub(element.$.restAPI, 'getProjectAccess').returns(
-            Promise.resolve({
-              test: {is_owner: false},
-            }));
-        element._determineIfOwner('test').then(() => {
-          assert.equal(element._isOwner, false);
-          assert.equal(getComputedStyle(Polymer.dom(element.root)
-              .querySelector('.revisionNoEditing')).display, 'inline');
-          assert.equal(getComputedStyle(Polymer.dom(element.root)
-              .querySelector('.revisionEdit')).display, 'none');
-          done();
-        });
-      });
-
-      test('Edit HEAD button admin', done => {
-        const saveBtn = Polymer.dom(element.root).querySelector('.saveBtn');
-        const cancelBtn = Polymer.dom(element.root).querySelector('.cancelBtn');
-        const editBtn = Polymer.dom(element.root).querySelector('.editBtn');
-        const revisionNoEditing = Polymer.dom(element.root)
-              .querySelector('.revisionNoEditing');
-        const revisionWithEditing = Polymer.dom(element.root)
-              .querySelector('.revisionWithEditing');
-
-        sandbox.stub(element, '_getLoggedIn').returns(Promise.resolve(true));
-        sandbox.stub(element.$.restAPI, 'getProjectAccess').returns(
-            Promise.resolve({
-              test: {is_owner: true},
-            }));
-        sandbox.stub(element, '_handleSaveRevision');
-        element._determineIfOwner('test').then(() => {
-          assert.equal(element._isOwner, true);
-          // The revision container for non-editing enabled row is not visible.
-          assert.equal(getComputedStyle(revisionNoEditing).display, 'none');
-
-          // The revision container for editing enabled row is visible.
-          assert.notEqual(getComputedStyle(Polymer.dom(element.root)
-              .querySelector('.revisionEdit')).display, 'none');
-
-          // The revision and edit button are visible.
-          assert.notEqual(getComputedStyle(revisionWithEditing).display,
-              'none');
-          assert.notEqual(getComputedStyle(editBtn).display, 'none');
-
-          // The input, cancel, and save buttons are not visible.
-          const hiddenElements = Polymer.dom(element.root)
-              .querySelectorAll('.canEdit .editItem');
-
-          for (const item of hiddenElements) {
-            assert.equal(getComputedStyle(item).display, 'none');
-          }
-
-          MockInteractions.tap(editBtn);
-          flushAsynchronousOperations();
-          // The revision and edit button are not visible.
-          assert.equal(getComputedStyle(revisionWithEditing).display, 'none');
-          assert.equal(getComputedStyle(editBtn).display, 'none');
-
-          // The input, cancel, and save buttons are not visible.
-          for (item of hiddenElements) {
-            assert.notEqual(getComputedStyle(item).display, 'none');
-          }
-
-          // The revised ref was set correctly
-          assert.equal(element._revisedRef, 'master');
-
-          assert.isFalse(saveBtn.disabled);
-
-          // Delete the ref.
-          element._revisedRef = '';
-          assert.isTrue(saveBtn.disabled);
-
-          // Change the ref to something else
-          element._revisedRef = 'newRef';
-          element._project = 'test';
-          assert.isFalse(saveBtn.disabled);
-
-          // Save button calls handleSave. since this is stubbed, the edit
-          // section remains open.
-          MockInteractions.tap(saveBtn);
-          assert.isTrue(element._handleSaveRevision.called);
-
-          // When cancel is tapped, the edit secion closes.
-          MockInteractions.tap(cancelBtn);
-          flushAsynchronousOperations();
-
-          // The revision and edit button are visible.
-          assert.notEqual(getComputedStyle(revisionWithEditing).display,
-              'none');
-          assert.notEqual(getComputedStyle(editBtn).display, 'none');
-
-          // The input, cancel, and save buttons are not visible.
-          for (const item of hiddenElements) {
-            assert.equal(getComputedStyle(item).display, 'none');
-          }
-          done();
-        });
-      });
-
-      test('_handleSaveRevision with invalid rev', done => {
-        const event = {model: {set: sandbox.stub()}};
-        element._isEditing = true;
-        sandbox.stub(element.$.restAPI, 'setProjectHead').returns(
-            Promise.resolve({
-              status: 400,
-            })
-        );
-
-        element._setProjectHead('test', 'newRef', event).then(() => {
-          assert.isTrue(element._isEditing);
-          assert.isFalse(event.model.set.called);
-          done();
-        });
-      });
-
-      test('_handleSaveRevision with valid rev', done => {
-        const event = {model: {set: sandbox.stub()}};
-        element._isEditing = true;
-        sandbox.stub(element.$.restAPI, 'setProjectHead').returns(
-            Promise.resolve({
-              status: 200,
-            })
-        );
-
-        element._setProjectHead('test', 'newRef', event).then(() => {
-          assert.isFalse(element._isEditing);
-          assert.isTrue(event.model.set.called);
-          done();
-        });
-      });
-
-      test('test _computeItemName', () => {
-        assert.deepEqual(element._computeItemName('branches'), 'Branch');
-        assert.deepEqual(element._computeItemName('tags'), 'Tag');
-      });
-    });
-
-    suite('list with less then 25 branches', () => {
-      setup(done => {
-        branches = _.times(25, branchGenerator);
-
-        stub('gr-rest-api-interface', {
-          getProjectBranches(num, project, offset) {
-            return Promise.resolve(branches);
-          },
-        });
-
-        const params = {
-          project: 'test',
-          detailType: 'branches',
-        };
-
-        element._paramsChanged(params).then(() => { flush(done); });
-      });
-
-      test('_shownProjectsBranches', () => {
-        assert.equal(element._shownItems.length, 25);
-      });
-    });
-
-    suite('filter', () => {
-      test('_paramsChanged', done => {
-        sandbox.stub(element.$.restAPI, 'getProjectBranches', () => {
-          return Promise.resolve(branches);
-        });
-        const params = {
-          detailType: 'branches',
-          project: 'test',
-          filter: 'test',
-          offset: 25,
-        };
-        element._paramsChanged(params).then(() => {
-          assert.isTrue(element.$.restAPI.getProjectBranches.lastCall
-              .calledWithExactly('test', 'test', 25, 25));
-          done();
-        });
-      });
-    });
-  });
-
-  suite('Tags', () => {
-    let element;
-    let tags;
-    let sandbox;
-
-    setup(() => {
-      sandbox = sinon.sandbox.create();
-      element = fixture('basic');
-      element.detailType = 'tags';
-      counter = 0;
-      sandbox.stub(page, 'show');
-    });
-
-    teardown(() => {
-      sandbox.restore();
-    });
-
-    suite('list of project tags', () => {
-      setup(done => {
-        tags = _.times(26, tagGenerator);
-
-        stub('gr-rest-api-interface', {
-          getProjectTags(num, project, offset) {
-            return Promise.resolve(tags);
-          },
-        });
-
-        const params = {
-          project: 'test',
-          detailType: 'tags',
-        };
-
-        element._paramsChanged(params).then(() => { flush(done); });
-      });
-
-      test('test for tag in the list', done => {
-        flush(() => {
-          assert.equal(element._items[1].ref, 'refs/tags/test2');
-          done();
-        });
-      });
-
-      test('test for web links in the tags list', done => {
-        flush(() => {
-          assert.equal(element._items[1].web_links[0].url,
-              'https://git.example.org/tag/test;refs/tags/test2');
-          done();
-        });
-      });
-
-      test('test for refs/tags/ being striped from ref', done => {
-        flush(() => {
-          assert.equal(element._stripRefs(element._items[1].ref,
-              element.detailType), 'test2');
-          done();
-        });
-      });
-
-      test('_shownItems', () => {
-        assert.equal(element._shownItems.length, 25);
-      });
-    });
-
-    suite('list with less then 25 tags', () => {
-      setup(done => {
-        tags = _.times(25, tagGenerator);
-
-        stub('gr-rest-api-interface', {
-          getProjectTags(num, project, offset) {
-            return Promise.resolve(tags);
-          },
-        });
-
-        const params = {
-          project: 'test',
-          detailType: 'tags',
-        };
-
-        element._paramsChanged(params).then(() => { flush(done); });
-      });
-
-      test('_shownItems', () => {
-        assert.equal(element._shownItems.length, 25);
-      });
-    });
-
-    suite('filter', () => {
-      test('_paramsChanged', done => {
-        sandbox.stub(element.$.restAPI, 'getProjectTags', () => {
-          return Promise.resolve(tags);
-        });
-        const params = {
-          project: 'test',
-          detailType: 'tags',
-          filter: 'test',
-          offset: 25,
-        };
-        element._paramsChanged(params).then(() => {
-          assert.isTrue(element.$.restAPI.getProjectTags.lastCall
-              .calledWithExactly('test', 'test', 25, 25));
-          done();
-        });
-      });
-    });
-
-    suite('create new', () => {
-      test('_handleCreateClicked called when create-click fired', () => {
-        sandbox.stub(element, '_handleCreateClicked');
-        element.$$('gr-list-view').fire('create-clicked');
-        assert.isTrue(element._handleCreateClicked.called);
-      });
-
-      test('_handleCreateClicked opens modal', () => {
-        const openStub = sandbox.stub(element.$.createOverlay, 'open');
-        element._handleCreateClicked();
-        assert.isTrue(openStub.called);
-      });
-
-      test('_handleCreateItem called when confirm fired', () => {
-        sandbox.stub(element, '_handleCreateItem');
-        element.$.createDialog.fire('confirm');
-        assert.isTrue(element._handleCreateItem.called);
-      });
-
-      test('_handleCloseCreate called when cancel fired', () => {
-        sandbox.stub(element, '_handleCloseCreate');
-        element.$.createDialog.fire('cancel');
-        assert.isTrue(element._handleCloseCreate.called);
-      });
-    });
-
-    test('test _computeHideDeleteClass', () => {
-      assert.deepEqual(element._computeHideDeleteClass(true, false), 'show');
-      assert.deepEqual(element._computeHideDeleteClass(false, true), 'show');
-      assert.deepEqual(element._computeHideDeleteClass(false, false), '');
-    });
-  });
-</script>
diff --git a/polygerrit-ui/app/elements/admin/gr-project-list/gr-project-list.html b/polygerrit-ui/app/elements/admin/gr-project-list/gr-project-list.html
deleted file mode 100644
index 6c45704..0000000
--- a/polygerrit-ui/app/elements/admin/gr-project-list/gr-project-list.html
+++ /dev/null
@@ -1,98 +0,0 @@
-<!--
-Copyright (C) 2017 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="../../../bower_components/polymer/polymer.html">
-
-<link rel="import" href="../../../behaviors/gr-list-view-behavior/gr-list-view-behavior.html">
-<link rel="import" href="../../../bower_components/iron-input/iron-input.html">
-<link rel="import" href="../../../styles/gr-table-styles.html">
-<link rel="import" href="../../../styles/shared-styles.html">
-<link rel="import" href="../../shared/gr-confirm-dialog/gr-confirm-dialog.html">
-<link rel="import" href="../../shared/gr-list-view/gr-list-view.html">
-<link rel="import" href="../../shared/gr-overlay/gr-overlay.html">
-<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
-<link rel="import" href="../gr-create-project-dialog/gr-create-project-dialog.html">
-
-
-<dom-module id="gr-project-list">
-  <template>
-    <style include="shared-styles"></style>
-    <style include="gr-table-styles"></style>
-    <gr-list-view
-        create-new=[[_createNewCapability]]
-        filter="[[_filter]]"
-        items-per-page="[[_projectsPerPage]]"
-        items="[[_projects]]"
-        loading="[[_loading]]"
-        offset="[[_offset]]"
-        on-create-clicked="_handleCreateClicked"
-        path="[[_path]]">
-      <table id="list" class="genericList">
-        <tr class="headerRow">
-          <th class="name topHeader">Project Name</th>
-          <th class="description topHeader">Project Description</th>
-          <th class="repositoryBrowser topHeader">Repository Browser</th>
-          <th class="readOnly topHeader">Read only</th>
-        </tr>
-        <tr id="loading" class$="loadingMsg [[computeLoadingClass(_loading)]]">
-          <td>Loading...</td>
-        </tr>
-        <tbody class$="[[computeLoadingClass(_loading)]]">
-          <template is="dom-repeat" items="[[_shownProjects]]">
-            <tr class="table">
-              <td class="name">
-                <a href$="[[_computeProjectUrl(item.name)]]">[[item.name]]</a>
-              </td>
-              <td class="description">[[item.description]]</td>
-              <td class="repositoryBrowser">
-                <template is="dom-repeat"
-                    items="[[_computeWeblink(item)]]" as="link">
-                  <a href$="[[link.url]]"
-                      class="webLink"
-                      rel="noopener"
-                      target="_blank">
-                    ([[link.name]])
-                  </a>
-                </template>
-              </td>
-              <td class="readOnly">[[_readOnly(item)]]</td>
-            </tr>
-          </template>
-        </tbody>
-      </table>
-    </gr-list-view>
-    <gr-overlay id="createOverlay" with-backdrop>
-      <gr-confirm-dialog
-          id="createDialog"
-          class="confirmDialog"
-          disabled="[[!_hasNewProjectName]]"
-          confirm-label="Create"
-          on-confirm="_handleCreateProject"
-          on-cancel="_handleCloseCreate">
-        <div class="header">
-          Create Project
-        </div>
-        <div class="main">
-          <gr-create-project-dialog
-              has-new-project-name="{{_hasNewProjectName}}"
-              params="[[params]]"
-              id="createNewModal"></gr-create-project-dialog>
-        </div>
-      </gr-confirm-dialog>
-    </gr-overlay>
-    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
-  </template>
-  <script src="gr-project-list.js"></script>
-</dom-module>
diff --git a/polygerrit-ui/app/elements/admin/gr-project-list/gr-project-list.js b/polygerrit-ui/app/elements/admin/gr-project-list/gr-project-list.js
deleted file mode 100644
index 070cc2f..0000000
--- a/polygerrit-ui/app/elements/admin/gr-project-list/gr-project-list.js
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright (C) 2017 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-project-list',
-
-    properties: {
-      /**
-       * URL params passed from the router.
-       */
-      params: {
-        type: Object,
-        observer: '_paramsChanged',
-      },
-
-      /**
-       * Offset of currently visible query results.
-       */
-      _offset: Number,
-      _path: {
-        type: String,
-        readOnly: true,
-        value: '/admin/projects',
-      },
-      _hasNewProjectName: Boolean,
-      _createNewCapability: {
-        type: Boolean,
-        value: false,
-      },
-      _projects: Array,
-
-      /**
-       * Because  we request one more than the projectsPerPage, _shownProjects
-       * maybe one less than _projects.
-       * */
-      _shownProjects: {
-        type: Array,
-        computed: 'computeShownItems(_projects)',
-      },
-
-      _projectsPerPage: {
-        type: Number,
-        value: 25,
-      },
-
-      _loading: {
-        type: Boolean,
-        value: true,
-      },
-      _filter: String,
-    },
-
-    behaviors: [
-      Gerrit.ListViewBehavior,
-    ],
-
-    attached() {
-      this._getCreateProjectCapability();
-      this.fire('title-change', {title: 'Projects'});
-      this._maybeOpenCreateOverlay(this.params);
-    },
-
-    _paramsChanged(params) {
-      this._loading = true;
-      this._filter = this.getFilterValue(params);
-      this._offset = this.getOffsetValue(params);
-
-      return this._getProjects(this._filter, this._projectsPerPage,
-          this._offset);
-    },
-
-    /**
-     * Opens the create overlay if the route has a hash 'create'
-     * @param {!Object} params
-     */
-    _maybeOpenCreateOverlay(params) {
-      if (params && params.openCreateModal) {
-        this.$.createOverlay.open();
-      }
-    },
-
-    _computeProjectUrl(name) {
-      return this.getUrl(this._path + '/', name);
-    },
-
-    _getCreateProjectCapability() {
-      return this.$.restAPI.getAccount().then(account => {
-        if (!account) { return; }
-        return this.$.restAPI.getAccountCapabilities(['createProject'])
-            .then(capabilities => {
-              if (capabilities.createProject) {
-                this._createNewCapability = true;
-              }
-            });
-      });
-    },
-
-    _getProjects(filter, projectsPerPage, offset) {
-      this._projects = [];
-      return this.$.restAPI.getProjects(filter, projectsPerPage, offset)
-          .then(projects => {
-            if (!projects) {
-              return;
-            }
-            this._projects = Object.keys(projects)
-             .map(key => {
-               const project = projects[key];
-               project.name = key;
-               return project;
-             });
-            this._loading = false;
-          });
-    },
-
-    _handleCreateProject() {
-      this.$.createNewModal.handleCreateProject();
-    },
-
-    _handleCloseCreate() {
-      this.$.createOverlay.close();
-    },
-
-    _handleCreateClicked() {
-      this.$.createOverlay.open();
-    },
-
-    _readOnly(item) {
-      return item.state === 'READ_ONLY' ? 'Y' : '';
-    },
-
-    _computeWeblink(project) {
-      if (!project.web_links) {
-        return '';
-      }
-      const webLinks = project.web_links;
-      return webLinks.length ? webLinks : null;
-    },
-  });
-})();
diff --git a/polygerrit-ui/app/elements/admin/gr-project-list/gr-project-list_test.html b/polygerrit-ui/app/elements/admin/gr-project-list/gr-project-list_test.html
deleted file mode 100644
index 87732b8..0000000
--- a/polygerrit-ui/app/elements/admin/gr-project-list/gr-project-list_test.html
+++ /dev/null
@@ -1,177 +0,0 @@
-<!DOCTYPE html>
-<!--
-Copyright (C) 2017 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-project-list</title>
-
-<script src="../../../bower_components/page/page.js"></script>
-<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
-<script src="../../../bower_components/web-component-tester/browser.js"></script>
-<link rel="import" href="../../../test/common-test-setup.html"/>
-<link rel="import" href="gr-project-list.html">
-
-<script>void(0);</script>
-
-<test-fixture id="basic">
-  <template>
-    <gr-project-list></gr-project-list>
-  </template>
-</test-fixture>
-
-<script>
-  let counter;
-  const projectGenerator = () => {
-    return {
-      id: `test${++counter}`,
-      state: 'ACTIVE',
-      web_links: [
-        {
-          name: 'diffusion',
-          url: `https://phabricator.example.org/r/project/test${counter}`,
-        },
-      ],
-    };
-  };
-
-  suite('gr-project-list tests', () => {
-    let element;
-    let projects;
-    let sandbox;
-    let value;
-
-    setup(() => {
-      sandbox = sinon.sandbox.create();
-      element = fixture('basic');
-      counter = 0;
-    });
-
-    teardown(() => {
-      sandbox.restore();
-    });
-
-    suite('list with projects', () => {
-      setup(done => {
-        projects = _.times(26, projectGenerator);
-        stub('gr-rest-api-interface', {
-          getProjects(num, offset) {
-            return Promise.resolve(projects);
-          },
-        });
-        element._paramsChanged(value).then(() => { flush(done); });
-      });
-
-      test('test for test project in the list', done => {
-        flush(() => {
-          assert.equal(element._projects[1].id, 'test2');
-          done();
-        });
-      });
-
-      test('_shownProjects', () => {
-        assert.equal(element._shownProjects.length, 25);
-      });
-
-      test('_maybeOpenCreateOverlay', () => {
-        const overlayOpen = sandbox.stub(element.$.createOverlay, 'open');
-        element._maybeOpenCreateOverlay();
-        assert.isFalse(overlayOpen.called);
-        const params = {};
-        element._maybeOpenCreateOverlay(params);
-        assert.isFalse(overlayOpen.called);
-        params.openCreateModal = true;
-        element._maybeOpenCreateOverlay(params);
-        assert.isTrue(overlayOpen.called);
-      });
-    });
-
-    suite('list with less then 25 projects', () => {
-      setup(done => {
-        projects = _.times(25, projectGenerator);
-
-        stub('gr-rest-api-interface', {
-          getProjects(num, offset) {
-            return Promise.resolve(projects);
-          },
-        });
-
-        element._paramsChanged(value).then(() => { flush(done); });
-      });
-
-      test('_shownProjects', () => {
-        assert.equal(element._shownProjects.length, 25);
-      });
-    });
-
-    suite('filter', () => {
-      test('_paramsChanged', done => {
-        sandbox.stub(element.$.restAPI, 'getProjects', () => {
-          return Promise.resolve(projects);
-        });
-        const value = {
-          filter: 'test',
-          offset: 25,
-        };
-        element._paramsChanged(value).then(() => {
-          assert.isTrue(element.$.restAPI.getProjects.lastCall
-              .calledWithExactly('test', 25, 25));
-          done();
-        });
-      });
-    });
-
-    suite('loading', () => {
-      test('correct contents are displayed', () => {
-        assert.isTrue(element._loading);
-        assert.equal(element.computeLoadingClass(element._loading), 'loading');
-        assert.equal(getComputedStyle(element.$.loading).display, 'block');
-
-        element._loading = false;
-        element._projects = _.times(25, projectGenerator);
-
-        flushAsynchronousOperations();
-        assert.equal(element.computeLoadingClass(element._loading), '');
-        assert.equal(getComputedStyle(element.$.loading).display, 'none');
-      });
-    });
-
-    suite('create new', () => {
-      test('_handleCreateClicked called when create-click fired', () => {
-        sandbox.stub(element, '_handleCreateClicked');
-        element.$$('gr-list-view').fire('create-clicked');
-        assert.isTrue(element._handleCreateClicked.called);
-      });
-
-      test('_handleCreateClicked opens modal', () => {
-        const openStub = sandbox.stub(element.$.createOverlay, 'open');
-        element._handleCreateClicked();
-        assert.isTrue(openStub.called);
-      });
-
-      test('_handleCreateProject called when confirm fired', () => {
-        sandbox.stub(element, '_handleCreateProject');
-        element.$.createDialog.fire('confirm');
-        assert.isTrue(element._handleCreateProject.called);
-      });
-
-      test('_handleCloseCreate called when cancel fired', () => {
-        sandbox.stub(element, '_handleCloseCreate');
-        element.$.createDialog.fire('cancel');
-        assert.isTrue(element._handleCloseCreate.called);
-      });
-    });
-  });
-</script>
diff --git a/polygerrit-ui/app/elements/admin/gr-project/gr-project.html b/polygerrit-ui/app/elements/admin/gr-project/gr-project.html
deleted file mode 100644
index 996cf28..0000000
--- a/polygerrit-ui/app/elements/admin/gr-project/gr-project.html
+++ /dev/null
@@ -1,333 +0,0 @@
-<!--
-Copyright (C) 2017 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="../../../bower_components/polymer/polymer.html">
-<link rel="import" href="../../../bower_components/iron-autogrow-textarea/iron-autogrow-textarea.html">
-<link rel="import" href="../../../bower_components/iron-input/iron-input.html">
-
-<link rel="import" href="../../shared/gr-download-commands/gr-download-commands.html">
-<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
-<link rel="import" href="../../shared/gr-select/gr-select.html">
-<link rel="import" href="../../../styles/gr-form-styles.html">
-<link rel="import" href="../../../styles/shared-styles.html">
-
-<dom-module id="gr-project">
-  <template>
-    <style include="shared-styles">
-      main {
-        margin: 2em 1em;
-      }
-      h2.edited:after {
-        color: #444;
-        content: ' *';
-      }
-      .loading,
-      .hideDownload {
-        display: none;
-      }
-      #loading.loading {
-        display: block;
-      }
-      #loading:not(.loading) {
-        display: none;
-      }
-      .projectSettings {
-        display: none;
-      }
-      .projectSettings.showConfig {
-        display: block;
-      }
-    </style>
-    <style include="gr-form-styles"></style>
-    <main class="gr-form-styles read-only">
-      <h1 id="Title">[[project]]</h1>
-      <div id="loading" class$="[[_computeLoadingClass(_loading)]]">Loading...</div>
-      <div id="loadedContent" class$="[[_computeLoadingClass(_loading)]]">
-        <div id="downloadContent" class$="[[_computeDownloadClass(_schemes)]]">
-          <h2 id="download">Download</h2>
-          <fieldset>
-            <gr-download-commands
-                id="downloadCommands"
-                commands="[[_computeCommands(project, _schemesObj, _selectedScheme)]]"
-                schemes="[[_schemes]]"
-                selected-scheme="{{_selectedScheme}}"></gr-download-commands>
-          </fieldset>
-        </div>
-        <h2 id="configurations"
-            class$="[[_computeHeaderClass(_configChanged)]]">Configurations</h2>
-        <div id="form">
-          <fieldset>
-            <h3 id="Description">Description</h3>
-            <fieldset>
-              <iron-autogrow-textarea
-                  id="descriptionInput"
-                  class="description"
-                  autocomplete="on"
-                  placeholder="<Insert project description here>"
-                  bind-value="{{_projectConfig.description}}"
-                  disabled$="[[_readOnly]]"></iron-autogrow-textarea>
-            </fieldset>
-            <h3 id="Options">Project Options</h3>
-            <fieldset id="options">
-              <section>
-                <span class="title">State</span>
-                <span class="value">
-                  <gr-select
-                      id="stateSelect"
-                      bind-value="{{_projectConfig.state}}">
-                    <select disabled$="[[_readOnly]]">
-                      <template is="dom-repeat" items=[[_states]]>
-                        <option value="[[item.value]]">[[item.label]]</option>
-                      </template>
-                    </select>
-                  </gr-select>
-                </span>
-              </section>
-              <section>
-                <span class="title">Submit type</span>
-                <span class="value">
-                  <gr-select
-                      id="submitTypeSelect"
-                      bind-value="{{_projectConfig.submit_type}}">
-                    <select disabled$="[[_readOnly]]">
-                      <template is="dom-repeat" items="[[_submitTypes]]">
-                        <option value="[[item.value]]">[[item.label]]</option>
-                      </template>
-                    </select>
-                  </gr-select>
-                </span>
-              </section>
-              <section>
-                <span class="title">Allow content merges</span>
-                <span class="value">
-                  <gr-select
-                      id="contentMergeSelect"
-                      bind-value="{{_projectConfig.use_content_merge.configured_value}}">
-                    <select disabled$="[[_readOnly]]">
-                      <template is="dom-repeat"
-                          items="[[_formatBooleanSelect(_projectConfig.use_content_merge)]]">
-                        <option value="[[item.value]]">[[item.label]]</option>
-                      </template>
-                    </select>
-                  </gr-select>
-                </span>
-              </section>
-              <section>
-                <span class="title">
-                  Create a new change for every commit not in the target branch
-                </span>
-                <span class="value">
-                  <gr-select
-                      id="newChangeSelect"
-                      bind-value="{{_projectConfig.create_new_change_for_all_not_in_target.configured_value}}">
-                    <select disabled$="[[_readOnly]]">
-                      <template is="dom-repeat"
-                          items="[[_formatBooleanSelect(_projectConfig.create_new_change_for_all_not_in_target)]]">
-                        <option value="[[item.value]]">[[item.label]]</option>
-                      </template>
-                    </select>
-                  </gr-select>
-                </span>
-              </section>
-              <section>
-                <span class="title">Require Change-Id in commit message</span>
-                <span class="value">
-                  <gr-select
-                      id="requireChangeIdSelect"
-                      bind-value="{{_projectConfig.require_change_id.configured_value}}">
-                    <select disabled$="[[_readOnly]]">
-                      <template is="dom-repeat"
-                          items="[[_formatBooleanSelect(_projectConfig.require_change_id)]]">
-                        <option value="[[item.value]]">[[item.label]]</option>
-                      </template>
-                    </select>
-                  </gr-select>
-                </span>
-              </section>
-              <section
-                   id="enableSignedPushSettings"
-                   class$="projectSettings [[_computeProjectsClass(_projectConfig.enable_signed_push)]]">
-                <span class="title">Enable signed push</span>
-                <span class="value">
-                  <gr-select
-                      id="enableSignedPush"
-                      bind-value="{{_projectConfig.enable_signed_push.configured_value}}">
-                    <select disabled$="[[_readOnly]]">
-                      <template is="dom-repeat"
-                          items="[[_formatBooleanSelect(_projectConfig.enable_signed_push)]]">
-                        <option value="[[item.value]]">[[item.label]]</option>
-                      </template>
-                    </select>
-                  </gr-select>
-                </span>
-              </section>
-              <section
-                   id="requireSignedPushSettings"
-                   class$="projectSettings [[_computeProjectsClass(_projectConfig.require_signed_push)]]">
-                <span class="title">Require signed push</span>
-                <span class="value">
-                  <gr-select
-                      id="requireSignedPush"
-                      bind-value="{{_projectConfig.require_signed_push.configured_value}}">
-                    <select disabled$="[[_readOnly]]">
-                      <template is="dom-repeat"
-                          items="[[_formatBooleanSelect(_projectConfig.require_signed_push)]]">
-                        <option value="[[item.value]]">[[item.label]]</option>
-                      </template>
-                    </select>
-                  </gr-select>
-                </span>
-              </section>
-              <section>
-                <span class="title">
-                  Reject implicit merges when changes are pushed for review</span>
-                <span class="value">
-                  <gr-select
-                      id="rejectImplicitMergesSelect"
-                      bind-value="{{_projectConfig.reject_implicit_merges.configured_value}}">
-                    <select disabled$="[[_readOnly]]">
-                      <template is="dom-repeat"
-                          items="[[_formatBooleanSelect(_projectConfig.reject_implicit_merges)]]">
-                        <option value="[[item.value]]">[[item.label]]</option>
-                      </template>
-                    </select>
-                  </gr-select>
-                </span>
-              </section>
-              <section id="noteDbSettings" class$="projectSettings [[_computeProjectsClass(_noteDbEnabled)]]">
-                <span class="title">
-                  Enable adding unregistered users as reviewers and CCs on changes</span>
-                <span class="value">
-                  <gr-select
-                      id="unRegisteredCcSelect"
-                      bind-value="{{_projectConfig.enable_reviewer_by_email.configured_value}}">
-                    <select disabled$="[[_readOnly]]">
-                      <template is="dom-repeat"
-                          items="[[_formatBooleanSelect(_projectConfig.enable_reviewer_by_email)]]">
-                        <option value="[[item.value]]">[[item.label]]</option>
-                      </template>
-                  </select>
-                  </gr-select>
-                </span>
-              </section>
-              <section>
-                <span class="title">
-                  Set all new changes private by default</span>
-                <span class="value">
-                  <gr-select
-                      id="setAllnewChangesPrivateByDefaultSelect"
-                      bind-value="{{_projectConfig.private_by_default.configured_value}}">
-                    <select disabled$="[[_readOnly]]">
-                      <template is="dom-repeat"
-                          items="[[_formatBooleanSelect(_projectConfig.private_by_default)]]">
-                        <option value="[[item.value]]">[[item.label]]</option>
-                      </template>
-                    </select>
-                  </gr-select>
-                </span>
-              </section>
-              <section>
-                <span class="title">
-                  Set new changes to "work in progress" by default</span>
-                <span class="value">
-                  <gr-select
-                      id="setAllNewChangesWorkInProgressByDefaultSelect"
-                      bind-value="{{_projectConfig.work_in_progress_by_default.configured_value}}">
-                    <select disabled$="[[_readOnly]]">
-                      <template is="dom-repeat"
-                          items="[[_formatBooleanSelect(_projectConfig.work_in_progress_by_default)]]">
-                        <option value="[[item.value]]">[[item.label]]</option>
-                      </template>
-                    </select>
-                  </gr-select>
-                </span>
-              </section>
-              <section>
-                <span class="title">Maximum Git object size limit</span>
-                <span class="value">
-                  <input
-                      id="maxGitObjSizeInput"
-                      bind-value="{{_projectConfig.max_object_size_limit.configured_value}}"
-                      is="iron-input"
-                      type="text"
-                      disabled$="[[_readOnly]]">
-                  <template is="dom-if" if="[[_projectConfig.max_object_size_limit.value]]">
-                    effective: [[_projectConfig.max_object_size_limit.value]] bytes
-                  </template>
-                </span>
-              </section>
-              <section>
-                <span class="title">Match authored date with committer date upon submit</span>
-                <span class="value">
-                  <gr-select
-                      id="matchAuthoredDateWithCommitterDateSelect"
-                      bind-value="{{_projectConfig.match_author_to_committer_date.configured_value}}">
-                    <select disabled$="[[_readOnly]]">
-                      <template is="dom-repeat"
-                          items="[[_formatBooleanSelect(_projectConfig.match_author_to_committer_date)]]">
-                        <option value="[[item.value]]">[[item.label]]</option>
-                      </template>
-                  </select>
-                  </gr-select>
-                </span>
-              </section>
-            </fieldset>
-            <h3 id="Options">Contributor Agreements</h3>
-            <fieldset id="agreements">
-              <section>
-                <span class="title">
-                  Require a valid contributor agreement to upload</span>
-                <span class="value">
-                  <gr-select
-                      id="contributorAgreementSelect"
-                      bind-value="{{_projectConfig.use_contributor_agreements.configured_value}}">
-                  <select disabled$="[[_readOnly]]">
-                    <template is="dom-repeat"
-                        items="[[_formatBooleanSelect(_projectConfig.use_contributor_agreements)]]">
-                      <option value="[[item.value]]">[[item.label]]</option>
-                    </template>
-                    </select>
-                  </gr-select>
-                </span>
-              </section>
-              <section>
-                <span class="title">Require Signed-off-by in commit message</span>
-                <span class="value">
-                  <gr-select
-                        id="useSignedOffBySelect"
-                        bind-value="{{_projectConfig.use_signed_off_by.configured_value}}">
-                    <select disabled$="[[_readOnly]]">
-                      <template is="dom-repeat"
-                          items="[[_formatBooleanSelect(_projectConfig.use_signed_off_by)]]">
-                        <option value="[[item.value]]">[[item.label]]</option>
-                      </template>
-                    </select>
-                  </gr-select>
-                </span>
-              </section>
-            </fieldset>
-            <!-- TODO @beckysiegel add plugin config widgets -->
-            <gr-button
-                on-tap="_handleSaveProjectConfig"
-                disabled$="[[_computeButtonDisabled(_readOnly, _configChanged)]]">Save changes</gr-button>
-          </fieldset>
-        </div>
-      </div>
-    </main>
-    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
-  </template>
-  <script src="gr-project.js"></script>
-</dom-module>
diff --git a/polygerrit-ui/app/elements/admin/gr-project/gr-project.js b/polygerrit-ui/app/elements/admin/gr-project/gr-project.js
deleted file mode 100644
index 4b4ad64..0000000
--- a/polygerrit-ui/app/elements/admin/gr-project/gr-project.js
+++ /dev/null
@@ -1,262 +0,0 @@
-// Copyright (C) 2017 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 STATES = {
-    active: {value: 'ACTIVE', label: 'Active'},
-    readOnly: {value: 'READ_ONLY', label: 'Read Only'},
-    hidden: {value: 'HIDDEN', label: 'Hidden'},
-  };
-
-  const SUBMIT_TYPES = {
-    mergeIfNecessary: {
-      value: 'MERGE_IF_NECESSARY',
-      label: 'Merge if necessary',
-    },
-    fastForwardOnly: {
-      value: 'FAST_FORWARD_ONLY',
-      label: 'Fast forward only',
-    },
-    rebaseAlways: {
-      value: 'REBASE_ALWAYS',
-      label: 'Rebase Always',
-    },
-    rebaseIfNecessary: {
-      value: 'REBASE_IF_NECESSARY',
-      label: 'Rebase if necessary',
-    },
-    mergeAlways: {
-      value: 'MERGE_ALWAYS',
-      label: 'Merge always',
-    },
-    cherryPick: {
-      value: 'CHERRY_PICK',
-      label: 'Cherry pick',
-    },
-  };
-
-  Polymer({
-    is: 'gr-project',
-
-    properties: {
-      params: Object,
-      project: String,
-
-      _configChanged: {
-        type: Boolean,
-        value: false,
-      },
-      _loading: {
-        type: Boolean,
-        value: true,
-      },
-      _loggedIn: {
-        type: Boolean,
-        value: false,
-        observer: '_loggedInChanged',
-      },
-      /** @type {?} */
-      _projectConfig: Object,
-      _readOnly: {
-        type: Boolean,
-        value: true,
-      },
-      _states: {
-        type: Array,
-        value() {
-          return Object.values(STATES);
-        },
-      },
-      _submitTypes: {
-        type: Array,
-        value() {
-          return Object.values(SUBMIT_TYPES);
-        },
-      },
-      _schemes: {
-        type: Array,
-        value() { return []; },
-        computed: '_computeSchemes(_schemesObj)',
-        observer: '_schemesChanged',
-      },
-      _selectedCommand: {
-        type: String,
-        value: 'Clone',
-      },
-      _selectedScheme: String,
-      _schemesObj: Object,
-      _noteDbEnabled: {
-        type: Boolean,
-        value: false,
-      },
-    },
-
-    observers: [
-      '_handleConfigChanged(_projectConfig.*)',
-    ],
-
-    attached() {
-      this._loadProject();
-
-      this.fire('title-change', {title: this.project});
-    },
-
-    _loadProject() {
-      if (!this.project) { return Promise.resolve(); }
-
-      const promises = [];
-      promises.push(this._getLoggedIn().then(loggedIn => {
-        this._loggedIn = loggedIn;
-        if (loggedIn) {
-          this.$.restAPI.getProjectAccess(this.project).then(access => {
-            // If the user is not an owner, is_owner is not a property.
-            this._readOnly = !access[this.project].is_owner;
-          });
-        }
-      }));
-
-      promises.push(this.$.restAPI.getProjectConfig(this.project).then(
-          config => {
-            if (!config.state) {
-              config.state = STATES.active.value;
-            }
-            this._projectConfig = config;
-            this._loading = false;
-          }));
-
-      promises.push(this.$.restAPI.getConfig().then(config => {
-        this._schemesObj = config.download.schemes;
-        this._noteDbEnabled = !!config.note_db_enabled;
-      }));
-
-      return Promise.all(promises);
-    },
-
-    _computeLoadingClass(loading) {
-      return loading ? 'loading' : '';
-    },
-
-    _computeDownloadClass(schemes) {
-      return !schemes || !schemes.length ? 'hideDownload' : '';
-    },
-
-    _loggedInChanged(_loggedIn) {
-      if (!_loggedIn) { return; }
-      this.$.restAPI.getPreferences().then(prefs => {
-        if (prefs.download_scheme) {
-          // Note (issue 5180): normalize the download scheme with lower-case.
-          this._selectedScheme = prefs.download_scheme.toLowerCase();
-        }
-      });
-    },
-
-    _formatBooleanSelect(item) {
-      if (!item) { return; }
-      let inheritLabel = 'Inherit';
-      if (item.inherited_value) {
-        inheritLabel = `Inherit (${item.inherited_value})`;
-      }
-      return [
-        {
-          label: inheritLabel,
-          value: 'INHERIT',
-        },
-        {
-          label: 'True',
-          value: 'TRUE',
-        }, {
-          label: 'False',
-          value: 'FALSE',
-        },
-      ];
-    },
-
-    _isLoading() {
-      return this._loading || this._loading === undefined;
-    },
-
-    _getLoggedIn() {
-      return this.$.restAPI.getLoggedIn();
-    },
-
-    _formatProjectConfigForSave(p) {
-      const configInputObj = {};
-      for (const key in p) {
-        if (p.hasOwnProperty(key)) {
-          if (typeof p[key] === 'object') {
-            configInputObj[key] = p[key].configured_value;
-          } else {
-            configInputObj[key] = p[key];
-          }
-        }
-      }
-      return configInputObj;
-    },
-
-    _handleSaveProjectConfig() {
-      return this.$.restAPI.saveProjectConfig(this.project,
-          this._formatProjectConfigForSave(this._projectConfig)).then(() => {
-            this._configChanged = false;
-          });
-    },
-
-    _handleConfigChanged() {
-      if (this._isLoading()) { return; }
-      this._configChanged = true;
-    },
-
-    _computeButtonDisabled(readOnly, configChanged) {
-      return readOnly || !configChanged;
-    },
-
-    _computeHeaderClass(configChanged) {
-      return configChanged ? 'edited' : '';
-    },
-
-    _computeSchemes(schemesObj) {
-      return Object.keys(schemesObj);
-    },
-
-    _schemesChanged(schemes) {
-      if (schemes.length === 0) { return; }
-      if (!schemes.includes(this._selectedScheme)) {
-        this._selectedScheme = schemes.sort()[0];
-      }
-    },
-
-    _computeCommands(project, schemesObj, _selectedScheme) {
-      const commands = [];
-      let commandObj;
-      if (schemesObj.hasOwnProperty(_selectedScheme)) {
-        commandObj = schemesObj[_selectedScheme].clone_commands;
-      }
-      for (const title in commandObj) {
-        if (!commandObj.hasOwnProperty(title)) { continue; }
-        commands.push({
-          title,
-          command: commandObj[title]
-              .replace(/\$\{project\}/gi, encodeURI(project))
-              .replace(/\$\{project-base-name\}/gi,
-              encodeURI(project.substring(project.lastIndexOf('/') + 1))),
-        });
-      }
-      return commands;
-    },
-
-    _computeProjectsClass(config) {
-      return config ? 'showConfig': '';
-    },
-  });
-})();
diff --git a/polygerrit-ui/app/elements/admin/gr-project/gr-project_test.html b/polygerrit-ui/app/elements/admin/gr-project/gr-project_test.html
deleted file mode 100644
index 0840076..0000000
--- a/polygerrit-ui/app/elements/admin/gr-project/gr-project_test.html
+++ /dev/null
@@ -1,333 +0,0 @@
-<!DOCTYPE html>
-<!--
-Copyright (C) 2017 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-project</title>
-
-<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
-<script src="../../../bower_components/web-component-tester/browser.js"></script>
-<link rel="import" href="../../../test/common-test-setup.html"/>
-<link rel="import" href="gr-project.html">
-
-<script>void(0);</script>
-
-<test-fixture id="basic">
-  <template>
-    <gr-project></gr-project>
-  </template>
-</test-fixture>
-
-<script>
-  suite('gr-project tests', () => {
-    let element;
-    let sandbox;
-    const PROJECT = 'test-project';
-    const SCHEMES = {http: {}, repo: {}, ssh: {}};
-
-    function getFormFields() {
-      const selects = Polymer.dom(element.root).querySelectorAll('select');
-      const textareas =
-          Polymer.dom(element.root).querySelectorAll('iron-autogrow-textarea');
-      const inputs = Polymer.dom(element.root).querySelectorAll('input');
-      return inputs.concat(textareas).concat(selects);
-    }
-
-    setup(() => {
-      sandbox = sinon.sandbox.create();
-      stub('gr-rest-api-interface', {
-        getLoggedIn() { return Promise.resolve(false); },
-        getProjectConfig() {
-          return Promise.resolve({
-            description: 'Access inherited by all other projects.',
-            use_contributor_agreements: {
-              value: false,
-              configured_value: 'FALSE',
-            },
-            use_content_merge: {
-              value: false,
-              configured_value: 'FALSE',
-            },
-            use_signed_off_by: {
-              value: false,
-              configured_value: 'FALSE',
-            },
-            create_new_change_for_all_not_in_target: {
-              value: false,
-              configured_value: 'FALSE',
-            },
-            require_change_id: {
-              value: false,
-              configured_value: 'FALSE',
-            },
-            enable_signed_push: {
-              value: false,
-              configured_value: 'FALSE',
-            },
-            require_signed_push: {
-              value: false,
-              configured_value: 'FALSE',
-            },
-            reject_implicit_merges: {
-              value: false,
-              configured_value: 'FALSE',
-            },
-            private_by_default: {
-              value: false,
-              configured_value: 'FALSE',
-            },
-            work_in_progress_by_default: {
-              value: false,
-              configured_value: 'FALSE',
-            },
-            match_author_to_committer_date: {
-              value: false,
-              configured_value: 'FALSE',
-            },
-            enable_reviewer_by_email: {
-              value: false,
-              configured_value: 'FALSE',
-            },
-            max_object_size_limit: {},
-            submit_type: 'MERGE_IF_NECESSARY',
-          });
-        },
-        getConfig() {
-          return Promise.resolve({download: {}});
-        },
-      });
-      element = fixture('basic');
-    });
-
-    teardown(() => {
-      sandbox.restore();
-    });
-
-    test('loading displays before project config is loaded', () => {
-      assert.isTrue(element.$.loading.classList.contains('loading'));
-      assert.isFalse(getComputedStyle(element.$.loading).display === 'none');
-      assert.isTrue(element.$.loadedContent.classList.contains('loading'));
-      assert.isTrue(getComputedStyle(element.$.loadedContent)
-          .display === 'none');
-    });
-
-    test('download commands visibility', () => {
-      element._loading = false;
-      flushAsynchronousOperations();
-      assert.isTrue(element.$.downloadContent.classList
-          .contains('hideDownload'));
-      assert.isTrue(getComputedStyle(element.$.downloadContent)
-          .display == 'none');
-      element._schemesObj = SCHEMES;
-      flushAsynchronousOperations();
-      assert.isFalse(element.$.downloadContent.classList
-          .contains('hideDownload'));
-      assert.isFalse(getComputedStyle(element.$.downloadContent)
-          .display == 'none');
-    });
-
-    test('form defaults to read only', () => {
-      assert.isTrue(element._readOnly);
-    });
-
-    test('form defaults to read only when not logged in', done => {
-      element.project = PROJECT;
-      element._loadProject().then(() => {
-        assert.isTrue(element._readOnly);
-        done();
-      });
-    });
-
-    test('form defaults to read only when logged in and not admin', done => {
-      element.project = PROJECT;
-      sandbox.stub(element, '_getLoggedIn', () => {
-        return Promise.resolve(true);
-      });
-      sandbox.stub(element.$.restAPI, 'getProjectAccess', () => {
-        return Promise.resolve({'test-project': {}});
-      });
-      element._loadProject().then(() => {
-        assert.isTrue(element._readOnly);
-        done();
-      });
-    });
-
-    test('all form elements are disabled when not admin', done => {
-      element.project = PROJECT;
-      element._loadProject().then(() => {
-        flushAsynchronousOperations();
-        const formFields = getFormFields();
-        for (const field of formFields) {
-          assert.isTrue(field.hasAttribute('disabled'));
-        }
-        done();
-      });
-    });
-
-    test('_formatBooleanSelect', () => {
-      let item = {inherited_value: 'true'};
-      assert.deepEqual(element._formatBooleanSelect(item), [
-        {
-          label: 'Inherit (true)',
-          value: 'INHERIT',
-        },
-        {
-          label: 'True',
-          value: 'TRUE',
-        }, {
-          label: 'False',
-          value: 'FALSE',
-        },
-      ]);
-
-      // For items without inherited values
-      item = {};
-      assert.deepEqual(element._formatBooleanSelect(item), [
-        {
-          label: 'Inherit',
-          value: 'INHERIT',
-        },
-        {
-          label: 'True',
-          value: 'TRUE',
-        }, {
-          label: 'False',
-          value: 'FALSE',
-        },
-      ]);
-    });
-
-    suite('admin', () => {
-      setup(() => {
-        element.project = PROJECT;
-        sandbox.stub(element, '_getLoggedIn', () => {
-          return Promise.resolve(true);
-        });
-        sandbox.stub(element.$.restAPI, 'getProjectAccess', () => {
-          return Promise.resolve({'test-project': {is_owner: true}});
-        });
-      });
-
-      test('all form elements are enabled', done => {
-        element._loadProject().then(() => {
-          flushAsynchronousOperations();
-          const formFields = getFormFields();
-          for (const field of formFields) {
-            assert.isFalse(field.hasAttribute('disabled'));
-          }
-          assert.isFalse(element._loading);
-          done();
-        });
-      });
-
-      test('state gets set correctly', done => {
-        element._loadProject().then(() => {
-          assert.equal(element._projectConfig.state, 'ACTIVE');
-          assert.equal(element.$.stateSelect.bindValue, 'ACTIVE');
-          done();
-        });
-      });
-
-      test('fields update and save correctly', done => {
-        // test notedb
-        element._noteDbEnabled = false;
-
-        assert.equal(
-            element._computeProjectsClass(element._noteDbEnabled), '');
-
-        element._noteDbEnabled = true;
-
-        assert.equal(
-            element._computeProjectsClass(element._noteDbEnabled), 'showConfig');
-
-        const configInputObj = {
-          description: 'new description',
-          use_contributor_agreements: 'TRUE',
-          use_content_merge: 'TRUE',
-          use_signed_off_by: 'TRUE',
-          create_new_change_for_all_not_in_target: 'TRUE',
-          require_change_id: 'TRUE',
-          enable_signed_push: 'TRUE',
-          require_signed_push: 'TRUE',
-          reject_implicit_merges: 'TRUE',
-          private_by_default: 'TRUE',
-          work_in_progress_by_default: 'TRUE',
-          match_author_to_committer_date: 'TRUE',
-          max_object_size_limit: 10,
-          submit_type: 'FAST_FORWARD_ONLY',
-          state: 'READ_ONLY',
-          enable_reviewer_by_email: 'TRUE',
-        };
-
-        const saveStub = sandbox.stub(element.$.restAPI, 'saveProjectConfig'
-            , () => {
-              return Promise.resolve({});
-            });
-
-        const button = Polymer.dom(element.root).querySelector('gr-button');
-
-        element._loadProject().then(() => {
-          assert.isTrue(button.hasAttribute('disabled'));
-          assert.isFalse(element.$.Title.classList.contains('edited'));
-          element.$.descriptionInput.bindValue = configInputObj.description;
-          element.$.stateSelect.bindValue = configInputObj.state;
-          element.$.submitTypeSelect.bindValue = configInputObj.submit_type;
-          element.$.contentMergeSelect.bindValue =
-              configInputObj.use_content_merge;
-          element.$.newChangeSelect.bindValue =
-              configInputObj.create_new_change_for_all_not_in_target;
-          element.$.requireChangeIdSelect.bindValue =
-              configInputObj.require_change_id;
-          element.$.enableSignedPush.bindValue =
-              configInputObj.enable_signed_push;
-          element.$.requireSignedPush.bindValue =
-              configInputObj.require_signed_push;
-          element.$.rejectImplicitMergesSelect.bindValue =
-              configInputObj.reject_implicit_merges;
-          element.$.setAllnewChangesPrivateByDefaultSelect.bindValue =
-              configInputObj.private_by_default;
-          element.$.setAllNewChangesWorkInProgressByDefaultSelect.bindValue =
-              configInputObj.work_in_progress_by_default;
-          element.$.matchAuthoredDateWithCommitterDateSelect.bindValue =
-              configInputObj.match_author_to_committer_date;
-          element.$.maxGitObjSizeInput.bindValue =
-              configInputObj.max_object_size_limit;
-          element.$.contributorAgreementSelect.bindValue =
-              configInputObj.use_contributor_agreements;
-          element.$.useSignedOffBySelect.bindValue =
-              configInputObj.use_signed_off_by;
-          element.$.unRegisteredCcSelect.bindValue =
-              configInputObj.enable_reviewer_by_email;
-
-          assert.isFalse(button.hasAttribute('disabled'));
-          assert.isTrue(element.$.configurations.classList.contains('edited'));
-
-          const formattedObj =
-              element._formatProjectConfigForSave(element._projectConfig);
-          assert.deepEqual(formattedObj, configInputObj);
-
-          element._handleSaveProjectConfig().then(() => {
-            assert.isTrue(button.hasAttribute('disabled'));
-            assert.isFalse(element.$.Title.classList.contains('edited'));
-            assert.isTrue(saveStub.lastCall.calledWithExactly(PROJECT,
-                configInputObj));
-            done();
-          });
-        });
-      });
-    });
-  });
-</script>
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access.html b/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access.html
new file mode 100644
index 0000000..b6e56de
--- /dev/null
+++ b/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access.html
@@ -0,0 +1,134 @@
+<!--
+@license
+Copyright (C) 2017 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="../../../bower_components/polymer/polymer.html">
+
+<link rel="import" href="../../../behaviors/gr-access-behavior/gr-access-behavior.html">
+<link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
+<link rel="import" href="../../../behaviors/gr-url-encoding-behavior/gr-url-encoding-behavior.html">
+
+<link rel="import" href="../../../styles/gr-menu-page-styles.html">
+<link rel="import" href="../../../styles/gr-subpage-styles.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../../core/gr-navigation/gr-navigation.html">
+<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
+<link rel="import" href="../gr-access-section/gr-access-section.html">
+
+<script src="../../../scripts/util.js"></script>
+
+<dom-module id="gr-repo-access">
+  <template>
+    <style include="shared-styles"></style>
+    <style include="gr-subpage-styles">
+      gr-button,
+      #inheritsFrom,
+      #editInheritFromInput,
+      .editing #inheritFromName,
+      .weblinks,
+      .editing .invisible{
+        display: none;
+      }
+      #inheritsFrom.show {
+        display: flex;
+        min-height: 2em;
+        align-items: center;
+      }
+      .weblink {
+        margin-right: .2em;
+      }
+      .weblinks.show,
+      .referenceContainer {
+        display: block;
+      }
+      .rightsText {
+        margin-right: .3rem;
+      }
+
+      .editing gr-button,
+      .admin #editBtn {
+        display: inline-block;
+        margin: 1em 0;
+      }
+      .editing #editInheritFromInput {
+        display: inline-block;
+      }
+    </style>
+    <style include="gr-menu-page-styles"></style>
+    <main class$="[[_computeMainClass(_ownerOf, _canUpload, _editing)]]">
+      <div id="loading" class$="[[_computeLoadingClass(_loading)]]">
+        Loading...
+      </div>
+      <div id="loadedContent" class$="[[_computeLoadingClass(_loading)]]">
+        <h3 id="inheritsFrom" class$="[[_computeShowInherit(_inheritsFrom)]]">
+          <span class="rightsText">Rights Inherit From</span>
+          <a
+              href$="[[_computeParentHref(_inheritsFrom.name)]]"
+              rel="noopener"
+              id="inheritFromName">
+            [[_inheritsFrom.name]]</a>
+          <gr-autocomplete
+              id="editInheritFromInput"
+              text="{{_inheritFromFilter}}"
+              query="[[_query]]"
+              on-commit="_handleUpdateInheritFrom"></gr-autocomplete>
+        </h3>
+        <div class$="weblinks [[_computeWebLinkClass(_weblinks)]]">
+          History:
+          <template is="dom-repeat" items="[[_weblinks]]" as="link">
+            <a href="[[link.url]]" class="weblink" rel="noopener" target="[[link.target]]">
+              [[link.name]]
+            </a>
+          </template>
+        </div>
+        <gr-button id="editBtn"
+            on-tap="_handleEdit">[[_editOrCancel(_editing)]]</gr-button>
+        <gr-button id="saveBtn"
+            primary
+            class$="[[_computeSaveBtnClass(_ownerOf)]]"
+            on-tap="_handleSave"
+            disabled$="[[!_modified]]">Save</gr-button>
+        <gr-button id="saveReviewBtn"
+            primary
+            class$="[[_computeSaveReviewBtnClass(_canUpload)]]"
+            on-tap="_handleSaveForReview"
+            disabled$="[[!_modified]]">Save for review</gr-button>
+        <template
+            is="dom-repeat"
+            items="{{_sections}}"
+            initial-count="5"
+            target-framerate="60"
+            as="section">
+          <gr-access-section
+              capabilities="[[_capabilities]]"
+              section="{{section}}"
+              labels="[[_labels]]"
+              can-upload="[[_canUpload]]"
+              editing="[[_editing]]"
+              owner-of="[[_ownerOf]]"
+              groups="[[_groups]]"
+              on-added-section-removed="_handleAddedSectionRemoved"></gr-access-section>
+        </template>
+        <div class="referenceContainer">
+          <gr-button id="addReferenceBtn"
+              on-tap="_handleCreateSection">Add Reference</gr-button>
+        </div>
+      </div>
+    </main>
+    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
+  </template>
+  <script src="gr-repo-access.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access.js b/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access.js
new file mode 100644
index 0000000..fe043d5
--- /dev/null
+++ b/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access.js
@@ -0,0 +1,464 @@
+/**
+ * @license
+ * Copyright (C) 2017 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 Defs = {};
+
+  const NOTHING_TO_SAVE = 'No changes to save.';
+
+  const MAX_AUTOCOMPLETE_RESULTS = 20;
+
+  /**
+   * Fired when save is a no-op
+   *
+   * @event show-alert
+   */
+
+  /**
+   * @typedef {{
+   *    value: !Object,
+   * }}
+   */
+  Defs.rule;
+
+  /**
+   * @typedef {{
+   *    rules: !Object<string, Defs.rule>
+   * }}
+   */
+  Defs.permission;
+
+  /**
+   * Can be an empty object or consist of permissions.
+   *
+   * @typedef {{
+   *    permissions: !Object<string, Defs.permission>
+   * }}
+   */
+  Defs.permissions;
+
+  /**
+   * Can be an empty object or consist of permissions.
+   *
+   * @typedef {!Object<string, Defs.permissions>}
+   */
+  Defs.sections;
+
+  /**
+   * @typedef {{
+   *    remove: !Defs.sections,
+   *    add: !Defs.sections,
+   * }}
+   */
+  Defs.projectAccessInput;
+
+
+  Polymer({
+    is: 'gr-repo-access',
+
+    properties: {
+      repo: {
+        type: String,
+        observer: '_repoChanged',
+      },
+      // The current path
+      path: String,
+
+      _canUpload: {
+        type: Boolean,
+        value: false,
+      },
+      _inheritFromFilter: String,
+      _query: {
+        type: Function,
+        value() {
+          return this._getInheritFromSuggestions.bind(this);
+        },
+      },
+      _ownerOf: Array,
+      _capabilities: Object,
+      _groups: Object,
+      /** @type {?} */
+      _inheritsFrom: Object,
+      _labels: Object,
+      _local: Object,
+      _editing: {
+        type: Boolean,
+        value: false,
+        observer: '_handleEditingChanged',
+      },
+      _modified: {
+        type: Boolean,
+        value: false,
+      },
+      _sections: Array,
+      _weblinks: Array,
+      _loading: {
+        type: Boolean,
+        value: true,
+      },
+    },
+
+    behaviors: [
+      Gerrit.AccessBehavior,
+      Gerrit.BaseUrlBehavior,
+      Gerrit.URLEncodingBehavior,
+    ],
+
+    listeners: {
+      'access-modified': '_handleAccessModified',
+    },
+
+    _handleAccessModified() {
+      this._modified = true;
+    },
+
+    /**
+     * @param {string} repo
+     * @return {!Promise}
+     */
+    _repoChanged(repo) {
+      this._loading = true;
+
+      if (!repo) { return Promise.resolve(); }
+
+      return this._reload(repo);
+    },
+
+    _reload(repo) {
+      const promises = [];
+
+      const errFn = response => {
+        this.fire('page-error', {response});
+      };
+
+      this._editing = false;
+
+      // Always reset sections when a project changes.
+      this._sections = [];
+      promises.push(this.$.restAPI.getRepoAccessRights(repo, errFn)
+          .then(res => {
+            if (!res) { return Promise.resolve(); }
+
+            // Keep a copy of the original inherit from values separate from
+            // the ones data bound to gr-autocomplete, so the original value
+            // can be restored if the user cancels.
+            this._inheritsFrom = res.inherits_from ? Object.assign({},
+                res.inherits_from) : null;
+            this._originalInheritsFrom = res.inherits_from ? Object.assign({},
+                res.inherits_from) : null;
+            // Initialize the filter value so when the user clicks edit, the
+            // current value appears. If there is no parent repo, it is
+            // initialized as an empty string.
+            this._inheritFromFilter = res.inherits_from ?
+                this._inheritsFrom.name : '';
+            this._local = res.local;
+            this._groups = res.groups;
+            this._weblinks = res.config_web_links || [];
+            this._canUpload = res.can_upload;
+            this._ownerOf = res.owner_of || [];
+            return this.toSortedArray(this._local);
+          }));
+
+      promises.push(this.$.restAPI.getCapabilities(errFn)
+          .then(res => {
+            if (!res) { return Promise.resolve(); }
+
+            return res;
+          }));
+
+      promises.push(this.$.restAPI.getRepo(repo, errFn)
+          .then(res => {
+            if (!res) { return Promise.resolve(); }
+
+            return res.labels;
+          }));
+
+      return Promise.all(promises).then(([sections, capabilities, labels]) => {
+        this._capabilities = capabilities;
+        this._labels = labels;
+        this._sections = sections;
+        this._loading = false;
+      });
+    },
+
+    _handleUpdateInheritFrom(e) {
+      if (!this._inheritsFrom) {
+        this._inheritsFrom = {};
+      }
+      this._inheritsFrom.id = e.detail.value;
+      this._inheritsFrom.name = this._inheritFromFilter;
+      this._handleAccessModified();
+    },
+
+    _getInheritFromSuggestions() {
+      return this.$.restAPI.getRepos(
+          this._inheritFromFilter,
+          MAX_AUTOCOMPLETE_RESULTS)
+          .then(response => {
+            const projects = [];
+            for (const key in response) {
+              if (!response.hasOwnProperty(key)) { continue; }
+              projects.push({
+                name: response[key].name,
+                value: response[key].id,
+              });
+            }
+            return projects;
+          });
+    },
+
+    _computeLoadingClass(loading) {
+      return loading ? 'loading' : '';
+    },
+
+    _handleEdit() {
+      this._editing = !this._editing;
+    },
+
+    _editOrCancel(editing) {
+      return editing ? 'Cancel' : 'Edit';
+    },
+
+    _computeWebLinkClass(weblinks) {
+      return weblinks.length ? 'show' : '';
+    },
+
+    _computeShowInherit(inheritsFrom) {
+      return inheritsFrom ? 'show' : '';
+    },
+
+    _handleAddedSectionRemoved(e) {
+      const index = e.model.index;
+      this._sections = this._sections.slice(0, index)
+          .concat(this._sections.slice(index + 1, this._sections.length));
+    },
+
+    _handleEditingChanged(editing, editingOld) {
+      // Ignore when editing gets set initially.
+      if (!editingOld || editing) { return; }
+      // Remove any unsaved but added refs.
+      if (this._sections) {
+        this._sections = this._sections.filter(p => !p.value.added);
+      }
+      // Restore inheritFrom.
+      if (this._inheritsFrom) {
+        this._inheritsFrom = Object.assign({}, this._originalInheritsFrom);
+        this._inheritFromFilter = this._inheritsFrom.name;
+      }
+      for (const key of Object.keys(this._local)) {
+        if (this._local[key].added) {
+          delete this._local[key];
+        }
+      }
+    },
+
+    /**
+     * @param {!Defs.projectAccessInput} addRemoveObj
+     * @param {!Array} path
+     * @param {string} type add or remove
+     * @param {!Object=} opt_value value to add if the type is 'add'
+     * @return {!Defs.projectAccessInput}
+     */
+    _updateAddRemoveObj(addRemoveObj, path, type, opt_value) {
+      let curPos = addRemoveObj[type];
+      for (const item of path) {
+        if (!curPos[item]) {
+          if (item === path[path.length - 1] && type === 'remove') {
+            if (path[path.length - 2] === 'permissions') {
+              curPos[item] = {rules: {}};
+            } else if (path.length === 1) {
+              curPos[item] = {permissions: {}};
+            } else {
+              curPos[item] = {};
+            }
+          } else if (item === path[path.length - 1] && type === 'add') {
+            curPos[item] = opt_value;
+          } else {
+            curPos[item] = {};
+          }
+        }
+        curPos = curPos[item];
+      }
+      return addRemoveObj;
+    },
+
+    /**
+     * Used to recursively remove any objects with a 'deleted' bit.
+     */
+    _recursivelyRemoveDeleted(obj) {
+      for (const k in obj) {
+        if (!obj.hasOwnProperty(k)) { continue; }
+
+        if (typeof obj[k] == 'object') {
+          if (obj[k].deleted) {
+            delete obj[k];
+            return;
+          }
+          this._recursivelyRemoveDeleted(obj[k]);
+        }
+      }
+    },
+
+    _recursivelyUpdateAddRemoveObj(obj, addRemoveObj, path = []) {
+      for (const k in obj) {
+        if (!obj.hasOwnProperty(k)) { continue; }
+        if (typeof obj[k] == 'object') {
+          const updatedId = obj[k].updatedId;
+          const ref = updatedId ? updatedId : k;
+          if (obj[k].deleted) {
+            this._updateAddRemoveObj(addRemoveObj,
+                path.concat(k), 'remove');
+            continue;
+          } else if (obj[k].modified) {
+            this._updateAddRemoveObj(addRemoveObj,
+                path.concat(k), 'remove');
+            this._updateAddRemoveObj(addRemoveObj, path.concat(ref), 'add',
+                obj[k]);
+            /* Special case for ref changes because they need to be added and
+             removed in a different way. The new ref needs to include all
+             changes but also the initial state. To do this, instead of
+             continuing with the same recursion, just remove anything that is
+             deleted in the current state. */
+            if (updatedId && updatedId !== k) {
+              this._recursivelyRemoveDeleted(addRemoveObj.add[updatedId]);
+            }
+            continue;
+          } else if (obj[k].added) {
+            this._updateAddRemoveObj(addRemoveObj,
+                path.concat(ref), 'add', obj[k]);
+            continue;
+          }
+          this._recursivelyUpdateAddRemoveObj(obj[k], addRemoveObj,
+              path.concat(k));
+        }
+      }
+    },
+
+    /**
+     * Returns an object formatted for saving or submitting access changes for
+     * review
+     *
+     * @return {!Defs.projectAccessInput}
+     */
+    _computeAddAndRemove() {
+      const addRemoveObj = {
+        add: {},
+        remove: {},
+      };
+
+      const originalInheritsFromId = this._originalInheritsFrom ?
+          this.singleDecodeURL(this._originalInheritsFrom.id) :
+          null;
+      const inheritsFromId = this._inheritsFrom ?
+          this.singleDecodeURL(this._inheritsFrom.id) :
+          null;
+
+      const inheritFromChanged =
+          // Inherit from changed
+          (originalInheritsFromId
+              && originalInheritsFromId !== inheritsFromId) ||
+          // Inherit from added (did not have one initially);
+          (!originalInheritsFromId && inheritsFromId);
+
+      this._recursivelyUpdateAddRemoveObj(this._local, addRemoveObj);
+
+      if (inheritFromChanged) {
+        addRemoveObj.parent = inheritsFromId;
+      }
+      return addRemoveObj;
+    },
+
+    _handleCreateSection() {
+      let newRef = 'refs/for/*';
+      // Avoid using an already used key for the placeholder, since it
+      // immediately gets added to an object.
+      while (this._local[newRef]) {
+        newRef = `${newRef}*`;
+      }
+      const section = {permissions: {}, added: true};
+      this.push('_sections', {id: newRef, value: section});
+      this.set(['_local', newRef], section);
+      Polymer.dom.flush();
+      Polymer.dom(this.root).querySelector('gr-access-section:last-of-type')
+          .editReference();
+    },
+
+    _getObjforSave() {
+      const addRemoveObj = this._computeAddAndRemove();
+      // If there are no changes, don't actually save.
+      if (!Object.keys(addRemoveObj.add).length &&
+          !Object.keys(addRemoveObj.remove).length &&
+          !addRemoveObj.parent) {
+        this.dispatchEvent(new CustomEvent('show-alert',
+            {detail: {message: NOTHING_TO_SAVE}, bubbles: true}));
+        return;
+      }
+      const obj = {
+        add: addRemoveObj.add,
+        remove: addRemoveObj.remove,
+      };
+      if (addRemoveObj.parent) {
+        obj.parent = addRemoveObj.parent;
+      }
+      return obj;
+    },
+
+    _handleSave() {
+      const obj = this._getObjforSave();
+      if (!obj) { return; }
+      return this.$.restAPI.setRepoAccessRights(this.repo, obj)
+          .then(() => {
+            this._reload(this.repo);
+          });
+    },
+
+    _handleSaveForReview() {
+      const obj = this._getObjforSave();
+      if (!obj) { return; }
+      return this.$.restAPI.setRepoAccessRightsForReview(this.repo, obj)
+          .then(change => {
+            Gerrit.Nav.navigateToChange(change);
+          });
+    },
+
+    _computeSaveReviewBtnClass(canUpload) {
+      return !canUpload ? 'invisible' : '';
+    },
+
+    _computeSaveBtnClass(ownerOf) {
+      return ownerOf.length < 0 ? 'invisible' : '';
+    },
+
+    _computeMainClass(ownerOf, canUpload, editing) {
+      const classList = [];
+      if (ownerOf.length > 0 || canUpload) {
+        classList.push('admin');
+      }
+      if (editing) {
+        classList.push('editing');
+      }
+      return classList.join(' ');
+    },
+
+    _computeParentHref(repoName) {
+      return this.getBaseUrl() +
+          `/admin/repos/${this.encodeURL(repoName, true)},access`;
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access_test.html b/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access_test.html
new file mode 100644
index 0000000..20e2b8e
--- /dev/null
+++ b/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access_test.html
@@ -0,0 +1,1101 @@
+<!DOCTYPE html>
+<!--
+@license
+Copyright (C) 2017 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-repo-access</title>
+
+<script src="../../../bower_components/page/page.js"></script>
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-repo-access.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-repo-access></gr-repo-access>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-repo-access tests', () => {
+    let element;
+    let sandbox;
+    let repoStub;
+
+    const accessRes = {
+      local: {
+        'refs/*': {
+          permissions: {
+            owner: {
+              rules: {
+                234: {action: 'ALLOW'},
+                123: {action: 'DENY'},
+              },
+            },
+            read: {
+              rules: {
+                234: {action: 'ALLOW'},
+              },
+            },
+          },
+        },
+      },
+      groups: {
+        Administrators: {
+          name: 'Administrators',
+        },
+        Maintainers: {
+          name: 'Maintainers',
+        },
+      },
+      config_web_links: [{
+        name: 'gitiles',
+        target: '_blank',
+        url: 'https://my/site/+log/123/project.config',
+      }],
+      can_upload: true,
+    };
+    const accessRes2 = {
+      local: {
+        GLOBAL_CAPABILITIES: {
+          permissions: {
+            accessDatabase: {
+              rules: {
+                group1: {
+                  action: 'ALLOW',
+                },
+              },
+            },
+          },
+        },
+      },
+    };
+    const repoRes = {
+      labels: {
+        'Code-Review': {
+          values: {
+            ' 0': 'No score',
+            '-1': 'I would prefer this is not merged as is',
+            '-2': 'This shall not be merged',
+            '+1': 'Looks good to me, but someone else must approve',
+            '+2': 'Looks good to me, approved',
+          },
+        },
+      },
+    };
+    const capabilitiesRes = {
+      accessDatabase: {
+        id: 'accessDatabase',
+        name: 'Access Database',
+      },
+      createAccount: {
+        id: 'createAccount',
+        name: 'Create Account',
+      },
+    };
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+      element = fixture('basic');
+      stub('gr-rest-api-interface', {
+        getAccount() { return Promise.resolve(null); },
+      });
+      repoStub = sandbox.stub(element.$.restAPI, 'getRepo').returns(
+          Promise.resolve(repoRes));
+      element._loading = false;
+      element._ownerOf = [];
+      element._canUpload = false;
+    });
+
+    teardown(() => {
+      sandbox.restore();
+    });
+
+    test('_repoChanged called when repo name changes', () => {
+      sandbox.stub(element, '_repoChanged');
+      element.repo = 'New Repo';
+      assert.isTrue(element._repoChanged.called);
+    });
+
+    test('_repoChanged', done => {
+      const accessStub = sandbox.stub(element.$.restAPI,
+          'getRepoAccessRights');
+
+      accessStub.withArgs('New Repo').returns(
+          Promise.resolve(JSON.parse(JSON.stringify(accessRes))));
+      accessStub.withArgs('Another New Repo')
+          .returns(Promise.resolve(JSON.parse(JSON.stringify(accessRes2))));
+      const capabilitiesStub = sandbox.stub(element.$.restAPI,
+          'getCapabilities');
+      capabilitiesStub.returns(Promise.resolve(capabilitiesRes));
+
+      element._repoChanged('New Repo').then(() => {
+        assert.isTrue(accessStub.called);
+        assert.isTrue(capabilitiesStub.called);
+        assert.isTrue(repoStub.called);
+        assert.isNotOk(element._inheritsFrom);
+        assert.deepEqual(element._local, accessRes.local);
+        assert.deepEqual(element._sections,
+            element.toSortedArray(accessRes.local));
+        assert.deepEqual(element._labels, repoRes.labels);
+        assert.equal(getComputedStyle(element.$$('.weblinks')).display,
+            'block');
+        return element._repoChanged('Another New Repo');
+      })
+          .then(() => {
+            assert.deepEqual(element._sections,
+                element.toSortedArray(accessRes2.local));
+            assert.equal(getComputedStyle(element.$$('.weblinks')).display,
+                'none');
+            done();
+          });
+    });
+
+    test('_repoChanged when repo changes to undefined returns', done => {
+      const capabilitiesRes = {
+        accessDatabase: {
+          id: 'accessDatabase',
+          name: 'Access Database',
+        },
+      };
+      const accessStub = sandbox.stub(element.$.restAPI, 'getRepoAccessRights')
+          .returns(Promise.resolve(JSON.parse(JSON.stringify(accessRes2))));
+      const capabilitiesStub = sandbox.stub(element.$.restAPI,
+          'getCapabilities').returns(Promise.resolve(capabilitiesRes));
+
+      element._repoChanged().then(() => {
+        assert.isFalse(accessStub.called);
+        assert.isFalse(capabilitiesStub.called);
+        assert.isFalse(repoStub.called);
+        done();
+      });
+    });
+
+    test('_computeParentHref', () => {
+      const repoName = 'test-repo';
+      assert.equal(element._computeParentHref(repoName),
+          '/admin/repos/test-repo,access');
+    });
+
+    test('_computeMainClass', () => {
+      let ownerOf = ['refs/*'];
+      const editing = true;
+      const canUpload = false;
+      assert.equal(element._computeMainClass(ownerOf, canUpload), 'admin');
+      assert.equal(element._computeMainClass(ownerOf, canUpload, editing),
+          'admin editing');
+      ownerOf = [];
+      assert.equal(element._computeMainClass(ownerOf, canUpload), '');
+      assert.equal(element._computeMainClass(ownerOf, canUpload, editing),
+          'editing');
+    });
+
+    test('inherit section', () => {
+      element._local = {};
+      element._ownerOf = [];
+      sandbox.stub(element, '_computeParentHref');
+      // Nothing should appear when no inherit from and not in edit mode.
+      assert.equal(getComputedStyle(element.$.inheritsFrom).display, 'none');
+      // The autocomplete should be hidden, and the link should be  displayed.
+      assert.isFalse(element._computeParentHref.called);
+      // When it edit mode, the autocomplete should appear.
+      element._editing = true;
+      // When editing, the autocomplete should still not be shown.
+      assert.equal(getComputedStyle(element.$.inheritsFrom).display, 'none');
+      element._editing = false;
+      element._inheritsFrom = {
+        name: 'another-repo',
+      };
+      // When there is a parent project, the link should be displayed.
+      flushAsynchronousOperations();
+      assert.notEqual(getComputedStyle(element.$.inheritsFrom).display, 'none');
+      assert.notEqual(getComputedStyle(element.$.inheritFromName).display,
+          'none');
+      assert.equal(getComputedStyle(element.$.editInheritFromInput).display,
+          'none');
+      assert.isTrue(element._computeParentHref.called);
+      element._editing = true;
+      // When editing, the autocomplete should be shown.
+      assert.notEqual(getComputedStyle(element.$.inheritsFrom).display, 'none');
+      assert.equal(getComputedStyle(element.$.inheritFromName).display, 'none');
+      assert.notEqual(getComputedStyle(element.$.editInheritFromInput).display,
+          'none');
+    });
+
+    test('_handleUpdateInheritFrom', () => {
+      element._inheritFromFilter = 'foo bar baz';
+      element._handleUpdateInheritFrom({detail: {value: 'abc+123'}});
+      assert.isOk(element._inheritsFrom);
+      assert.equal(element._inheritsFrom.id, 'abc+123');
+      assert.equal(element._inheritsFrom.name, 'foo bar baz');
+    });
+
+    test('_computeLoadingClass', () => {
+      assert.equal(element._computeLoadingClass(true), 'loading');
+      assert.equal(element._computeLoadingClass(false), '');
+    });
+
+    test('fires page-error', done => {
+      const response = {status: 404};
+
+      sandbox.stub(
+          element.$.restAPI, 'getRepoAccessRights', (repoName, errFn) => {
+            errFn(response);
+          });
+
+      element.addEventListener('page-error', e => {
+        assert.deepEqual(e.detail.response, response);
+        done();
+      });
+
+      element.repo = 'test';
+    });
+
+    suite('with defined sections', () => {
+      const testEditSaveCancelBtns = (shouldShowSave, shouldShowSaveReview) => {
+        // Edit button is visible and Save button is hidden.
+        assert.equal(getComputedStyle(element.$.saveReviewBtn).display, 'none');
+        assert.equal(getComputedStyle(element.$.saveBtn).display, 'none');
+        assert.notEqual(getComputedStyle(element.$.editBtn).display, 'none');
+        assert.equal(element.$.editBtn.innerText, 'EDIT');
+        assert.equal(getComputedStyle(element.$.editInheritFromInput).display,
+            'none');
+        element._inheritsFrom = {
+          id: 'test-project',
+        };
+        flushAsynchronousOperations();
+        assert.equal(getComputedStyle(element.$$('#editInheritFromInput'))
+            .display, 'none');
+
+        MockInteractions.tap(element.$.editBtn);
+        flushAsynchronousOperations();
+
+        // Edit button changes to Cancel button, and Save button is visible but
+        // disabled.
+        assert.equal(element.$.editBtn.innerText, 'CANCEL');
+        if (shouldShowSaveReview) {
+          assert.notEqual(getComputedStyle(element.$.saveReviewBtn).display,
+              'none');
+          assert.isTrue(element.$.saveReviewBtn.disabled);
+        }
+        if (shouldShowSave) {
+          assert.notEqual(getComputedStyle(element.$.saveBtn).display, 'none');
+          assert.isTrue(element.$.saveBtn.disabled);
+        }
+        assert.notEqual(getComputedStyle(element.$$('#editInheritFromInput'))
+            .display, 'none');
+
+        // Save button should be enabled after access is modified
+        element.fire('access-modified');
+        if (shouldShowSaveReview) {
+          assert.isFalse(element.$.saveReviewBtn.disabled);
+        }
+        if (shouldShowSave) {
+          assert.isFalse(element.$.saveBtn.disabled);
+        }
+      };
+
+      setup(() => {
+        // Create deep copies of these objects so the originals are not modified
+        // by any tests.
+        element._local = JSON.parse(JSON.stringify(accessRes.local));
+        element._ownerOf = [];
+        element._sections = element.toSortedArray(element._local);
+        element._groups = JSON.parse(JSON.stringify(accessRes.groups));
+        element._capabilities = JSON.parse(JSON.stringify(capabilitiesRes));
+        element._labels = JSON.parse(JSON.stringify(repoRes.labels));
+        flushAsynchronousOperations();
+      });
+
+      test('removing an added section', () => {
+        element.editing = true;
+        assert.equal(element._sections.length, 1);
+        element.$$('gr-access-section').fire('added-section-removed');
+        flushAsynchronousOperations();
+        assert.equal(element._sections.length, 0);
+      });
+
+      test('button visibility for non ref owner', () => {
+        assert.equal(getComputedStyle(element.$.saveReviewBtn).display, 'none');
+        assert.equal(getComputedStyle(element.$.editBtn).display, 'none');
+      });
+
+      test('button visibility for non ref owner with upload privilege', () => {
+        element._canUpload = true;
+        testEditSaveCancelBtns(false, true);
+      });
+
+      test('button visibility for ref owner', () => {
+        element._ownerOf = ['refs/for/*'];
+        testEditSaveCancelBtns(true, false);
+      });
+
+      test('button visibility for ref owner and upload', () => {
+        element._ownerOf = ['refs/for/*'];
+        element._canUpload = true;
+        testEditSaveCancelBtns(true, false);
+      });
+
+      test('_handleAccessModified called with event fired', () => {
+        sandbox.spy(element, '_handleAccessModified');
+        element.fire('access-modified');
+        assert.isTrue(element._handleAccessModified.called);
+      });
+
+      test('_handleAccessModified called when parent changes', () => {
+        element._inheritsFrom = {
+          id: 'test-project',
+        };
+        flushAsynchronousOperations();
+        element.$$('#editInheritFromInput').fire('commit');
+        sandbox.spy(element, '_handleAccessModified');
+        element.fire('access-modified');
+        assert.isTrue(element._handleAccessModified.called);
+      });
+
+      test('_handleSaveForReview', () => {
+        const saveStub =
+            sandbox.stub(element.$.restAPI, 'setRepoAccessRightsForReview');
+        sandbox.stub(element, '_computeAddAndRemove').returns({
+          add: {},
+          remove: {},
+        });
+        element._handleSaveForReview();
+        assert.isFalse(saveStub.called);
+      });
+
+      test('_recursivelyRemoveDeleted', () => {
+        const obj = {
+          'refs/*': {
+            permissions: {
+              owner: {
+                rules: {
+                  234: {action: 'ALLOW'},
+                  123: {action: 'DENY', deleted: true},
+                },
+              },
+              read: {
+                deleted: true,
+                rules: {
+                  234: {action: 'ALLOW'},
+                },
+              },
+            },
+          },
+        };
+        const expectedResult = {
+          'refs/*': {
+            permissions: {
+              owner: {
+                rules: {
+                  234: {action: 'ALLOW'},
+                },
+              },
+            },
+          },
+        };
+        element._recursivelyRemoveDeleted(obj);
+        assert.deepEqual(obj, expectedResult);
+      });
+
+      test('_handleSaveForReview with no changes', () => {
+        assert.deepEqual(element._computeAddAndRemove(), {add: {}, remove: {}});
+      });
+
+      test('_handleSaveForReview parent change', () => {
+        element._inheritsFrom = {
+          id: 'test-project',
+        };
+        element._originalInheritsFrom = {
+          id: 'test-project-original',
+        };
+        assert.deepEqual(element._computeAddAndRemove(), {
+          parent: 'test-project', add: {}, remove: {},
+        });
+      });
+
+      test('_handleSaveForReview new parent with spaces', () => {
+        element._inheritsFrom = {id: 'spaces+in+project+name'};
+        element._originalInheritsFrom = {id: 'old-project'};
+        assert.deepEqual(element._computeAddAndRemove(), {
+          parent: 'spaces in project name', add: {}, remove: {},
+        });
+      });
+
+      test('_handleSaveForReview rules', () => {
+        // Delete a rule.
+        element._local['refs/*'].permissions.owner.rules[123].deleted = true;
+        let expectedInput = {
+          add: {},
+          remove: {
+            'refs/*': {
+              permissions: {
+                owner: {
+                  rules: {
+                    123: {},
+                  },
+                },
+              },
+            },
+          },
+        };
+        assert.deepEqual(element._computeAddAndRemove(), expectedInput);
+
+        // Undo deleting a rule.
+        delete element._local['refs/*'].permissions.owner.rules[123].deleted;
+
+        // Modify a rule.
+        element._local['refs/*'].permissions.owner.rules[123].modified = true;
+        expectedInput = {
+          add: {
+            'refs/*': {
+              permissions: {
+                owner: {
+                  rules: {
+                    123: {action: 'DENY', modified: true},
+                  },
+                },
+              },
+            },
+          },
+          remove: {
+            'refs/*': {
+              permissions: {
+                owner: {
+                  rules: {
+                    123: {},
+                  },
+                },
+              },
+            },
+          },
+        };
+        assert.deepEqual(element._computeAddAndRemove(), expectedInput);
+      });
+
+      test('_computeAddAndRemove permissions', () => {
+        // Add a new rule to a permission.
+        let expectedInput = {
+          add: {
+            'refs/*': {
+              permissions: {
+                owner: {
+                  rules: {
+                    Maintainers: {
+                      action: 'ALLOW',
+                      added: true,
+                    },
+                  },
+                },
+              },
+            },
+          },
+          remove: {},
+        };
+
+        element.$$('gr-access-section').$$('gr-permission')._handleAddRuleItem(
+            {detail: {value: {id: 'Maintainers'}}});
+
+        flushAsynchronousOperations();
+        assert.deepEqual(element._computeAddAndRemove(), expectedInput);
+
+        // Remove the added rule.
+        delete element._local['refs/*'].permissions.owner.rules.Maintainers;
+
+        // Delete a permission.
+        element._local['refs/*'].permissions.owner.deleted = true;
+        expectedInput = {
+          add: {},
+          remove: {
+            'refs/*': {
+              permissions: {
+                owner: {rules: {}},
+              },
+            },
+          },
+        };
+        assert.deepEqual(element._computeAddAndRemove(), expectedInput);
+
+        // Undo delete permission.
+        delete element._local['refs/*'].permissions.owner.deleted;
+
+        // Modify a permission.
+        element._local['refs/*'].permissions.owner.modified = true;
+        expectedInput = {
+          add: {
+            'refs/*': {
+              permissions: {
+                owner: {
+                  modified: true,
+                  rules: {
+                    234: {action: 'ALLOW'},
+                    123: {action: 'DENY'},
+                  },
+                },
+              },
+            },
+          },
+          remove: {
+            'refs/*': {
+              permissions: {
+                owner: {rules: {}},
+              },
+            },
+          },
+        };
+        assert.deepEqual(element._computeAddAndRemove(), expectedInput);
+      });
+
+      test('_computeAddAndRemove sections', () => {
+        // Add a new permission to a section
+        expectedInput = {
+          add: {
+            'refs/*': {
+              permissions: {
+                'label-Code-Review': {
+                  added: true,
+                  rules: {},
+                  label: 'Code-Review',
+                },
+              },
+            },
+          },
+          remove: {},
+        };
+        element.$$('gr-access-section')._handleAddPermission();
+        flushAsynchronousOperations();
+        assert.deepEqual(element._computeAddAndRemove(), expectedInput);
+
+        // Add a new rule to the new permission.
+        expectedInput = {
+          add: {
+            'refs/*': {
+              permissions: {
+                'label-Code-Review': {
+                  added: true,
+                  rules: {
+                    Maintainers: {
+                      min: -2,
+                      max: 2,
+                      action: 'ALLOW',
+                      added: true,
+                    },
+                  },
+                  label: 'Code-Review',
+                },
+              },
+            },
+          },
+          remove: {},
+        };
+        const newPermission =
+            Polymer.dom(element.$$('gr-access-section').root).querySelectorAll(
+                'gr-permission')[2];
+        newPermission._handleAddRuleItem(
+           {detail: {value: {id: 'Maintainers'}}});
+        assert.deepEqual(element._computeAddAndRemove(), expectedInput);
+
+        // Modify a section reference.
+        element._local['refs/*'].updatedId = 'refs/for/bar';
+        element._local['refs/*'].modified = true;
+        expectedInput = {
+          add: {
+            'refs/for/bar': {
+              modified: true,
+              updatedId: 'refs/for/bar',
+              permissions: {
+                'owner': {
+                  rules: {
+                    234: {action: 'ALLOW'},
+                    123: {action: 'DENY'},
+                  },
+                },
+                'read': {
+                  rules: {
+                    234: {action: 'ALLOW'},
+                  },
+                },
+                'label-Code-Review': {
+                  added: true,
+                  rules: {
+                    Maintainers: {
+                      min: -2,
+                      max: 2,
+                      action: 'ALLOW',
+                      added: true,
+                    },
+                  },
+                  label: 'Code-Review',
+                },
+              },
+            },
+          },
+          remove: {
+            'refs/*': {
+              permissions: {},
+            },
+          },
+        };
+        assert.deepEqual(element._computeAddAndRemove(), expectedInput);
+
+        // Delete a section.
+        element._local['refs/*'].deleted = true;
+        expectedInput = {
+          add: {},
+          remove: {
+            'refs/*': {
+              permissions: {},
+            },
+          },
+        };
+        assert.deepEqual(element._computeAddAndRemove(), expectedInput);
+      });
+
+      test('_computeAddAndRemove new section', () => {
+        // Add a new permission to a section
+        expectedInput = {
+          add: {
+            'refs/for/*': {
+              added: true,
+              permissions: {},
+            },
+          },
+          remove: {},
+        };
+        MockInteractions.tap(element.$.addReferenceBtn);
+        assert.deepEqual(element._computeAddAndRemove(), expectedInput);
+
+        expectedInput = {
+          add: {
+            'refs/for/*': {
+              added: true,
+              permissions: {
+                'label-Code-Review': {
+                  added: true,
+                  rules: {},
+                  label: 'Code-Review',
+                },
+              },
+            },
+          },
+          remove: {},
+        };
+        const newSection = Polymer.dom(element.root)
+            .querySelectorAll('gr-access-section')[1];
+        newSection._handleAddPermission();
+        flushAsynchronousOperations();
+        assert.deepEqual(element._computeAddAndRemove(), expectedInput);
+
+        // Add rule to the new permission.
+        expectedInput = {
+          add: {
+            'refs/for/*': {
+              added: true,
+              permissions: {
+                'label-Code-Review': {
+                  added: true,
+                  rules: {
+                    Maintainers: {
+                      action: 'ALLOW',
+                      added: true,
+                      max: 2,
+                      min: -2,
+                    },
+                  },
+                  label: 'Code-Review',
+                },
+              },
+            },
+          },
+          remove: {},
+        };
+
+        newSection.$$('gr-permission')._handleAddRuleItem(
+            {detail: {value: {id: 'Maintainers'}}});
+
+        flushAsynchronousOperations();
+        assert.deepEqual(element._computeAddAndRemove(), expectedInput);
+
+        // Modify a the reference from the default value.
+        element._local['refs/for/*'].updatedId = 'refs/for/new';
+        expectedInput = {
+          add: {
+            'refs/for/new': {
+              added: true,
+              updatedId: 'refs/for/new',
+              permissions: {
+                'label-Code-Review': {
+                  added: true,
+                  rules: {
+                    Maintainers: {
+                      action: 'ALLOW',
+                      added: true,
+                      max: 2,
+                      min: -2,
+                    },
+                  },
+                  label: 'Code-Review',
+                },
+              },
+            },
+          },
+          remove: {},
+        };
+        assert.deepEqual(element._computeAddAndRemove(), expectedInput);
+      });
+
+      test('_computeAddAndRemove combinations', () => {
+        // Modify rule and delete permission that it is inside of.
+        element._local['refs/*'].permissions.owner.rules[123].modified = true;
+        element._local['refs/*'].permissions.owner.deleted = true;
+        let expectedInput = {
+          add: {},
+          remove: {
+            'refs/*': {
+              permissions: {
+                owner: {rules: {}},
+              },
+            },
+          },
+        };
+        assert.deepEqual(element._computeAddAndRemove(), expectedInput);
+        // Delete rule and delete permission that it is inside of.
+        element._local['refs/*'].permissions.owner.rules[123].modified = false;
+        element._local['refs/*'].permissions.owner.rules[123].deleted = true;
+        assert.deepEqual(element._computeAddAndRemove(), expectedInput);
+
+        // Also modify a different rule inside of another permission.
+        element._local['refs/*'].permissions.read.modified = true;
+        expectedInput = {
+          add: {
+            'refs/*': {
+              permissions: {
+                read: {
+                  modified: true,
+                  rules: {
+                    234: {action: 'ALLOW'},
+                  },
+                },
+              },
+            },
+          },
+          remove: {
+            'refs/*': {
+              permissions: {
+                owner: {rules: {}},
+                read: {rules: {}},
+              },
+            },
+          },
+        };
+        assert.deepEqual(element._computeAddAndRemove(), expectedInput);
+        // Modify both permissions with an exclusive bit. Owner is still
+        // deleted.
+        element._local['refs/*'].permissions.owner.exclusive = true;
+        element._local['refs/*'].permissions.owner.modified = true;
+        element._local['refs/*'].permissions.read.exclusive = true;
+        element._local['refs/*'].permissions.read.modified = true;
+        expectedInput = {
+          add: {
+            'refs/*': {
+              permissions: {
+                read: {
+                  exclusive: true,
+                  modified: true,
+                  rules: {
+                    234: {action: 'ALLOW'},
+                  },
+                },
+              },
+            },
+          },
+          remove: {
+            'refs/*': {
+              permissions: {
+                owner: {rules: {}},
+                read: {rules: {}},
+              },
+            },
+          },
+        };
+        assert.deepEqual(element._computeAddAndRemove(), expectedInput);
+
+        // Add a rule to the existing permission;
+        const readPermission =
+            Polymer.dom(element.$$('gr-access-section').root).querySelectorAll(
+                'gr-permission')[1];
+        readPermission._handleAddRuleItem(
+           {detail: {value: {id: 'Maintainers'}}});
+
+        expectedInput = {
+          add: {
+            'refs/*': {
+              permissions: {
+                read: {
+                  exclusive: true,
+                  modified: true,
+                  rules: {
+                    234: {action: 'ALLOW'},
+                    Maintainers: {action: 'ALLOW', added: true},
+                  },
+                },
+              },
+            },
+          },
+          remove: {
+            'refs/*': {
+              permissions: {
+                owner: {rules: {}},
+                read: {rules: {}},
+              },
+            },
+          },
+        };
+        assert.deepEqual(element._computeAddAndRemove(), expectedInput);
+
+        // Change one of the refs
+        element._local['refs/*'].updatedId = 'refs/for/bar';
+        element._local['refs/*'].modified = true;
+
+        expectedInput = {
+          add: {
+            'refs/for/bar': {
+              modified: true,
+              updatedId: 'refs/for/bar',
+              permissions: {
+                read: {
+                  exclusive: true,
+                  modified: true,
+                  rules: {
+                    234: {action: 'ALLOW'},
+                    Maintainers: {action: 'ALLOW', added: true},
+                  },
+                },
+              },
+            },
+          },
+          remove: {
+            'refs/*': {
+              permissions: {},
+            },
+          },
+        };
+        assert.deepEqual(element._computeAddAndRemove(), expectedInput);
+
+        expectedInput = {
+          add: {},
+          remove: {
+            'refs/*': {
+              permissions: {},
+            },
+          },
+        };
+        element._local['refs/*'].deleted = true;
+        assert.deepEqual(element._computeAddAndRemove(), expectedInput);
+
+        // Add a new section.
+        MockInteractions.tap(element.$.addReferenceBtn);
+        let newSection = Polymer.dom(element.root)
+            .querySelectorAll('gr-access-section')[1];
+        newSection._handleAddPermission();
+        flushAsynchronousOperations();
+        newSection.$$('gr-permission')._handleAddRuleItem(
+            {detail: {value: {id: 'Maintainers'}}});
+        // Modify a the reference from the default value.
+        element._local['refs/for/*'].updatedId = 'refs/for/new';
+
+        expectedInput = {
+          add: {
+            'refs/for/new': {
+              added: true,
+              updatedId: 'refs/for/new',
+              permissions: {
+                'label-Code-Review': {
+                  added: true,
+                  rules: {
+                    Maintainers: {
+                      action: 'ALLOW',
+                      added: true,
+                      max: 2,
+                      min: -2,
+                    },
+                  },
+                  label: 'Code-Review',
+                },
+              },
+            },
+          },
+          remove: {
+            'refs/*': {
+              permissions: {},
+            },
+          },
+        };
+        assert.deepEqual(element._computeAddAndRemove(), expectedInput);
+
+        // Modify newly added rule inside new ref.
+        element._local['refs/for/*'].permissions['label-Code-Review'].
+            rules['Maintainers'].modified = true;
+        expectedInput = {
+          add: {
+            'refs/for/new': {
+              added: true,
+              updatedId: 'refs/for/new',
+              permissions: {
+                'label-Code-Review': {
+                  added: true,
+                  rules: {
+                    Maintainers: {
+                      action: 'ALLOW',
+                      added: true,
+                      modified: true,
+                      max: 2,
+                      min: -2,
+                    },
+                  },
+                  label: 'Code-Review',
+                },
+              },
+            },
+          },
+          remove: {
+            'refs/*': {
+              permissions: {},
+            },
+          },
+        };
+        assert.deepEqual(element._computeAddAndRemove(), expectedInput);
+
+        // Add a second new section.
+        MockInteractions.tap(element.$.addReferenceBtn);
+        newSection = Polymer.dom(element.root)
+            .querySelectorAll('gr-access-section')[2];
+        newSection._handleAddPermission();
+        flushAsynchronousOperations();
+        newSection.$$('gr-permission')._handleAddRuleItem(
+            {detail: {value: {id: 'Maintainers'}}});
+        // Modify a the reference from the default value.
+        element._local['refs/for/**'].updatedId = 'refs/for/new2';
+        expectedInput = {
+          add: {
+            'refs/for/new': {
+              added: true,
+              updatedId: 'refs/for/new',
+              permissions: {
+                'label-Code-Review': {
+                  added: true,
+                  rules: {
+                    Maintainers: {
+                      action: 'ALLOW',
+                      added: true,
+                      modified: true,
+                      max: 2,
+                      min: -2,
+                    },
+                  },
+                  label: 'Code-Review',
+                },
+              },
+            },
+            'refs/for/new2': {
+              added: true,
+              updatedId: 'refs/for/new2',
+              permissions: {
+                'label-Code-Review': {
+                  added: true,
+                  rules: {
+                    Maintainers: {
+                      action: 'ALLOW',
+                      added: true,
+                      max: 2,
+                      min: -2,
+                    },
+                  },
+                  label: 'Code-Review',
+                },
+              },
+            },
+          },
+          remove: {
+            'refs/*': {
+              permissions: {},
+            },
+          },
+        };
+        assert.deepEqual(element._computeAddAndRemove(), expectedInput);
+      });
+
+      test('Unsaved added refs are discarded when edit cancelled', () => {
+        // Unsaved changes are discarded when editing is cancelled.
+        MockInteractions.tap(element.$.editBtn);
+        assert.equal(element._sections.length, 1);
+        assert.equal(Object.keys(element._local).length, 1);
+        MockInteractions.tap(element.$.addReferenceBtn);
+        assert.equal(element._sections.length, 2);
+        assert.equal(Object.keys(element._local).length, 2);
+        MockInteractions.tap(element.$.editBtn);
+        assert.equal(element._sections.length, 1);
+        assert.equal(Object.keys(element._local).length, 1);
+      });
+
+      test('_handleSaveForReview', done => {
+        const repoAccessInput = {
+          add: {
+            'refs/*': {
+              permissions: {
+                owner: {
+                  rules: {
+                    123: {action: 'DENY', modified: true},
+                  },
+                },
+              },
+            },
+          },
+          remove: {
+            'refs/*': {
+              permissions: {
+                owner: {
+                  rules: {
+                    123: {},
+                  },
+                },
+              },
+            },
+          },
+        };
+        sandbox.stub(element.$.restAPI, 'getRepoAccessRights').returns(
+            Promise.resolve(JSON.parse(JSON.stringify(accessRes))));
+        sandbox.stub(Gerrit.Nav, 'navigateToChange');
+        const saveForReviewStub = sandbox.stub(element.$.restAPI,
+            'setRepoAccessRightsForReview')
+            .returns(Promise.resolve({_number: 1}));
+
+        element.repo = 'test-repo';
+        sandbox.stub(element, '_computeAddAndRemove').returns(repoAccessInput);
+
+        element._handleSaveForReview().then(() => {
+          assert.isTrue(saveForReviewStub.called);
+          assert.isTrue(Gerrit.Nav.navigateToChange
+              .lastCall.calledWithExactly({_number: 1}));
+          done();
+        });
+      });
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-command/gr-repo-command.html b/polygerrit-ui/app/elements/admin/gr-repo-command/gr-repo-command.html
new file mode 100644
index 0000000..7db4e4c
--- /dev/null
+++ b/polygerrit-ui/app/elements/admin/gr-repo-command/gr-repo-command.html
@@ -0,0 +1,38 @@
+<!--
+@license
+Copyright (C) 2017 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="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../../shared/gr-button/gr-button.html">
+
+<dom-module id="gr-repo-command">
+  <template>
+    <style include="shared-styles">
+      :host {
+        display: block;
+        margin-bottom: 2em;
+      }
+    </style>
+    <h3>[[title]]</h3>
+    <gr-button
+        title$="[[tooltip]]"
+        disabled$="[[disabled]]"
+        on-tap="_onCommandTap">
+      [[title]]
+    </gr-button>
+  </template>
+  <script src="gr-repo-command.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-command/gr-repo-command.js b/polygerrit-ui/app/elements/admin/gr-repo-command/gr-repo-command.js
new file mode 100644
index 0000000..bcdb7f6
--- /dev/null
+++ b/polygerrit-ui/app/elements/admin/gr-repo-command/gr-repo-command.js
@@ -0,0 +1,39 @@
+/**
+ * @license
+ * Copyright (C) 2017 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-repo-command',
+
+    properties: {
+      title: String,
+      disabled: Boolean,
+      tooltip: String,
+    },
+
+    /**
+     * Fired when command button is tapped.
+     *
+     * @event command-tap
+     */
+
+    _onCommandTap() {
+      this.dispatchEvent(new CustomEvent('command-tap', {bubbles: true}));
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-command/gr-repo-command_test.html b/polygerrit-ui/app/elements/admin/gr-repo-command/gr-repo-command_test.html
new file mode 100644
index 0000000..9f9ac92
--- /dev/null
+++ b/polygerrit-ui/app/elements/admin/gr-repo-command/gr-repo-command_test.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<!--
+@license
+Copyright (C) 2017 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-repo-command</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-repo-command.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-repo-command></gr-repo-command>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-repo-command tests', () => {
+    let element;
+
+    setup(() => {
+      element = fixture('basic');
+    });
+
+    test('dispatched command-tap on button tap', done => {
+      element.addEventListener('command-tap', () => {
+        done();
+      });
+      MockInteractions.tap(
+          Polymer.dom(element.root).querySelector('gr-button'));
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-commands/gr-repo-commands.html b/polygerrit-ui/app/elements/admin/gr-repo-commands/gr-repo-commands.html
new file mode 100644
index 0000000..dba01aa
--- /dev/null
+++ b/polygerrit-ui/app/elements/admin/gr-repo-commands/gr-repo-commands.html
@@ -0,0 +1,88 @@
+<!--
+@license
+Copyright (C) 2017 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="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../../bower_components/iron-autogrow-textarea/iron-autogrow-textarea.html">
+<link rel="import" href="../../../bower_components/iron-input/iron-input.html">
+<link rel="import" href="../../../styles/gr-form-styles.html">
+<link rel="import" href="../../../styles/gr-subpage-styles.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../../plugins/gr-endpoint-decorator/gr-endpoint-decorator.html">
+<link rel="import" href="../../plugins/gr-endpoint-param/gr-endpoint-param.html">
+<link rel="import" href="../../shared/gr-dialog/gr-dialog.html">
+<link rel="import" href="../../shared/gr-overlay/gr-overlay.html">
+<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
+<link rel="import" href="../gr-create-change-dialog/gr-create-change-dialog.html">
+<link rel="import" href="../gr-repo-command/gr-repo-command.html">
+
+<dom-module id="gr-repo-commands">
+  <template>
+    <style include="shared-styles"></style>
+    <style include="gr-subpage-styles"></style>
+    <style include="gr-form-styles"></style>
+    <main class="gr-form-styles read-only">
+      <h1 id="Title">Repository Commands</h1>
+      <div id="loading" class$="[[_computeLoadingClass(_loading)]]">Loading...</div>
+      <div id="loadedContent" class$="[[_computeLoadingClass(_loading)]]">
+        <h2 id="options">Command</h2>
+        <div id="form">
+          <gr-repo-command
+              title="Create change"
+              on-command-tap="_createNewChange">
+          </gr-repo-command>
+          <gr-repo-command
+              id="editRepoConfig"
+              title="Edit repo config"
+              on-command-tap="_handleEditRepoConfig">
+          </gr-repo-command>
+          <gr-repo-command
+              title="[[_repoConfig.actions.gc.label]]"
+              tooltip="[[_repoConfig.actions.gc.title]]"
+              hidden$="[[!_repoConfig.actions.gc.enabled]]"
+              on-command-tap="_handleRunningGC">
+          </gr-repo-command>
+          <gr-endpoint-decorator name="repo-command">
+            <gr-endpoint-param name="config" value="[[_repoConfig]]">
+            </gr-endpoint-param>
+            <gr-endpoint-param name="repoName" value="[[repo]]">
+            </gr-endpoint-param>
+          </gr-endpoint-decorator>
+        </div>
+      </div>
+    </main>
+    <gr-overlay id="createChangeOverlay" with-backdrop>
+      <gr-dialog
+          id="createChangeDialog"
+          confirm-label="Create"
+          disabled="[[!_canCreate]]"
+          on-confirm="_handleCreateChange"
+          on-cancel="_handleCloseCreateChange">
+        <div class="header" slot="header">
+          Create Change
+        </div>
+        <div class="main" slot="main">
+          <gr-create-change-dialog
+              id="createNewChangeModal"
+              can-create="{{_canCreate}}"
+              repo-name="[[repo]]"></gr-create-change-dialog>
+        </div>
+      </gr-dialog>
+    </gr-overlay>
+    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
+  </template>
+  <script src="gr-repo-commands.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-commands/gr-repo-commands.js b/polygerrit-ui/app/elements/admin/gr-repo-commands/gr-repo-commands.js
new file mode 100644
index 0000000..a25055e
--- /dev/null
+++ b/polygerrit-ui/app/elements/admin/gr-repo-commands/gr-repo-commands.js
@@ -0,0 +1,111 @@
+/**
+ * @license
+ * Copyright (C) 2017 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 GC_MESSAGE = 'Garbage collection completed successfully.';
+
+  const CONFIG_BRANCH = 'refs/meta/config';
+  const CONFIG_PATH = 'project.config';
+  const EDIT_CONFIG_SUBJECT = 'Edit Repo Config';
+  const INITIAL_PATCHSET = 1;
+  const CREATE_CHANGE_FAILED_MESSAGE = 'Failed to create change.';
+  const CREATE_CHANGE_SUCCEEDED_MESSAGE = 'Navigating to change';
+
+  Polymer({
+    is: 'gr-repo-commands',
+
+    properties: {
+      params: Object,
+      repo: String,
+      _loading: {
+        type: Boolean,
+        value: true,
+      },
+      /** @type {?} */
+      _repoConfig: Object,
+      _canCreate: Boolean,
+    },
+
+    attached() {
+      this._loadRepo();
+
+      this.fire('title-change', {title: 'Repo Commands'});
+    },
+
+    _loadRepo() {
+      if (!this.repo) { return Promise.resolve(); }
+
+      const errFn = response => {
+        this.fire('page-error', {response});
+      };
+
+      return this.$.restAPI.getProjectConfig(this.repo, errFn)
+          .then(config => {
+            if (!config) { return Promise.resolve(); }
+
+            this._repoConfig = config;
+            this._loading = false;
+          });
+    },
+
+    _computeLoadingClass(loading) {
+      return loading ? 'loading' : '';
+    },
+
+    _isLoading() {
+      return this._loading || this._loading === undefined;
+    },
+
+    _handleRunningGC() {
+      return this.$.restAPI.runRepoGC(this.repo).then(response => {
+        if (response.status === 200) {
+          this.dispatchEvent(new CustomEvent('show-alert',
+              {detail: {message: GC_MESSAGE}, bubbles: true}));
+        }
+      });
+    },
+
+    _createNewChange() {
+      this.$.createChangeOverlay.open();
+    },
+
+    _handleCreateChange() {
+      this.$.createNewChangeModal.handleCreateChange();
+      this._handleCloseCreateChange();
+    },
+
+    _handleCloseCreateChange() {
+      this.$.createChangeOverlay.close();
+    },
+
+    _handleEditRepoConfig() {
+      return this.$.restAPI.createChange(this.repo, CONFIG_BRANCH,
+          EDIT_CONFIG_SUBJECT, undefined, false, true).then(change => {
+            const message = change ?
+                CREATE_CHANGE_SUCCEEDED_MESSAGE :
+                CREATE_CHANGE_FAILED_MESSAGE;
+            this.dispatchEvent(new CustomEvent('show-alert',
+                {detail: {message}, bubbles: true}));
+            if (!change) { return; }
+
+            Gerrit.Nav.navigateToRelativeUrl(Gerrit.Nav.getEditUrlForDiff(
+                change, CONFIG_PATH, INITIAL_PATCHSET));
+          });
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-commands/gr-repo-commands_test.html b/polygerrit-ui/app/elements/admin/gr-repo-commands/gr-repo-commands_test.html
new file mode 100644
index 0000000..76c65e8
--- /dev/null
+++ b/polygerrit-ui/app/elements/admin/gr-repo-commands/gr-repo-commands_test.html
@@ -0,0 +1,139 @@
+<!DOCTYPE html>
+<!--
+@license
+Copyright (C) 2017 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-repo-commands</title>
+
+<script src="../../../bower_components/page/page.js"></script>
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-repo-commands.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-repo-commands></gr-repo-commands>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-repo-commands tests', () => {
+    let element;
+    let sandbox;
+    let repoStub;
+
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+      element = fixture('basic');
+      repoStub = sandbox.stub(element.$.restAPI, 'getProjectConfig', () => {
+        return Promise.resolve({});
+      });
+    });
+
+    teardown(() => {
+      sandbox.restore();
+    });
+
+    suite('create new change dialog', () => {
+      test('_createNewChange opens modal', () => {
+        const openStub = sandbox.stub(element.$.createChangeOverlay, 'open');
+        element._createNewChange();
+        assert.isTrue(openStub.called);
+      });
+
+      test('_handleCreateChange called when confirm fired', () => {
+        sandbox.stub(element, '_handleCreateChange');
+        element.$.createChangeDialog.fire('confirm');
+        assert.isTrue(element._handleCreateChange.called);
+      });
+
+      test('_handleCloseCreateChange called when cancel fired', () => {
+        sandbox.stub(element, '_handleCloseCreateChange');
+        element.$.createChangeDialog.fire('cancel');
+        assert.isTrue(element._handleCloseCreateChange.called);
+      });
+    });
+
+    suite('edit repo config', () => {
+      let createChangeStub;
+      let urlStub;
+      let handleSpy;
+      let alertStub;
+
+      setup(() => {
+        createChangeStub = sandbox.stub(element.$.restAPI, 'createChange');
+        urlStub = sandbox.stub(Gerrit.Nav, 'getEditUrlForDiff');
+        sandbox.stub(Gerrit.Nav, 'navigateToRelativeUrl');
+        handleSpy = sandbox.spy(element, '_handleEditRepoConfig');
+        alertStub = sandbox.stub();
+        element.addEventListener('show-alert', alertStub);
+      });
+
+      test('successful creation of change', () => {
+        const change = {_number: '1'};
+        createChangeStub.returns(Promise.resolve(change));
+        MockInteractions.tap(element.$.editRepoConfig.$$('gr-button'));
+        return handleSpy.lastCall.returnValue.then(() => {
+          flushAsynchronousOperations();
+
+          assert.isTrue(alertStub.called);
+          assert.equal(alertStub.lastCall.args[0].detail.message,
+              'Navigating to change');
+          assert.isTrue(urlStub.called);
+          assert.deepEqual(urlStub.lastCall.args,
+              [change, 'project.config', 1]);
+        });
+      });
+
+      test('unsuccessful creation of change', () => {
+        createChangeStub.returns(Promise.resolve(null));
+        MockInteractions.tap(element.$.editRepoConfig.$$('gr-button'));
+        return handleSpy.lastCall.returnValue.then(() => {
+          flushAsynchronousOperations();
+
+          assert.isTrue(alertStub.called);
+          assert.equal(alertStub.lastCall.args[0].detail.message,
+              'Failed to create change.');
+          assert.isFalse(urlStub.called);
+        });
+      });
+    });
+
+    suite('404', () => {
+      test('fires page-error', done => {
+        repoStub.restore();
+
+        element.repo = 'test';
+
+        const response = {status: 404};
+        sandbox.stub(
+            element.$.restAPI, 'getProjectConfig', (repo, errFn) => {
+              errFn(response);
+            });
+        element.addEventListener('page-error', e => {
+          assert.deepEqual(e.detail.response, response);
+          done();
+        });
+
+        element._loadRepo();
+      });
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-dashboards/gr-repo-dashboards.html b/polygerrit-ui/app/elements/admin/gr-repo-dashboards/gr-repo-dashboards.html
new file mode 100644
index 0000000..1d49db9
--- /dev/null
+++ b/polygerrit-ui/app/elements/admin/gr-repo-dashboards/gr-repo-dashboards.html
@@ -0,0 +1,69 @@
+<!--
+@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="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../../core/gr-navigation/gr-navigation.html">
+<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
+
+<dom-module id="gr-repo-dashboards">
+  <template>
+    <style include="shared-styles">
+      :host {
+        display: block;
+        margin-bottom: 2em;
+      }
+      .loading #dashboards,
+      #loadingContainer {
+        display: none;
+      }
+      .loading #loadingContainer {
+        display: block;
+      }
+    </style>
+    <style include="gr-table-styles"></style>
+    <table id="list" class$="genericList [[_computeLoadingClass(_loading)]]">
+      <tr class="headerRow">
+        <th class="topHeader">Dashboard name</th>
+        <th class="topHeader">Dashboard title</th>
+        <th class="topHeader">Dashboard description</th>
+        <th class="topHeader">Inherited from</th>
+        <th class="topHeader">Default</th>
+      </tr>
+      <tr id="loadingContainer">
+        <td>Loading...</td>
+      </tr>
+      <tbody id="dashboards">
+        <template is="dom-repeat" items="[[_dashboards]]">
+          <tr class="groupHeader">
+            <td colspan="5">[[item.section]]</td>
+          </tr>
+          <template is="dom-repeat" items="[[item.dashboards]]">
+            <tr class="table">
+              <td class="name"><a href$="[[_getUrl(item.project, item.id)]]">[[item.path]]</a></td>
+              <td class="title">[[item.title]]</td>
+              <td class="desc">[[item.description]]</td>
+              <td class="inherited">[[_computeInheritedFrom(item.project, item.defining_project)]]</td>
+              <td class="default">[[_computeIsDefault(item.is_default)]]</td>
+            </tr>
+          </template>
+        </template>
+      </tbody>
+    </table>
+    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
+  </template>
+  <script src="gr-repo-dashboards.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-dashboards/gr-repo-dashboards.js b/polygerrit-ui/app/elements/admin/gr-repo-dashboards/gr-repo-dashboards.js
new file mode 100644
index 0000000..7dea7f4
--- /dev/null
+++ b/polygerrit-ui/app/elements/admin/gr-repo-dashboards/gr-repo-dashboards.js
@@ -0,0 +1,89 @@
+/**
+ * @license
+ * Copyright (C) 2017 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-repo-dashboards',
+
+    properties: {
+      repo: {
+        type: String,
+        observer: '_repoChanged',
+      },
+      _loading: {
+        type: Boolean,
+        value: true,
+      },
+      _dashboards: Array,
+    },
+
+    _repoChanged(repo) {
+      this._loading = true;
+      if (!repo) { return Promise.resolve(); }
+
+      const errFn = response => {
+        this.fire('page-error', {response});
+      };
+
+      this.$.restAPI.getRepoDashboards(this.repo, errFn).then(res => {
+        if (!res) { return Promise.resolve(); }
+
+        // Group by ref and sort by id.
+        const dashboards = res.concat.apply([], res).sort((a, b) =>
+            a.id < b.id ? -1 : 1);
+        const dashboardsByRef = {};
+        dashboards.forEach(d => {
+          if (!dashboardsByRef[d.ref]) {
+            dashboardsByRef[d.ref] = [];
+          }
+          dashboardsByRef[d.ref].push(d);
+        });
+
+        const dashboardBuilder = [];
+        Object.keys(dashboardsByRef).sort().forEach(ref => {
+          dashboardBuilder.push({
+            section: ref,
+            dashboards: dashboardsByRef[ref],
+          });
+        });
+
+        this._dashboards = dashboardBuilder;
+        this._loading = false;
+        Polymer.dom.flush();
+      });
+    },
+
+    _getUrl(project, id) {
+      if (!project || !id) { return ''; }
+
+      return Gerrit.Nav.getUrlForRepoDashboard(project, id);
+    },
+
+    _computeLoadingClass(loading) {
+      return loading ? 'loading' : '';
+    },
+
+    _computeInheritedFrom(project, definingProject) {
+      return project === definingProject ? '' : definingProject;
+    },
+
+    _computeIsDefault(isDefault) {
+      return isDefault ? '✓' : '';
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-dashboards/gr-repo-dashboards_test.html b/polygerrit-ui/app/elements/admin/gr-repo-dashboards/gr-repo-dashboards_test.html
new file mode 100644
index 0000000..94bf5e0
--- /dev/null
+++ b/polygerrit-ui/app/elements/admin/gr-repo-dashboards/gr-repo-dashboards_test.html
@@ -0,0 +1,158 @@
+<!DOCTYPE html>
+<!--
+@license
+Copyright (C) 2017 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-repo-dashboards</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-repo-dashboards.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-repo-dashboards></gr-repo-dashboards>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-repo-dashboards tests', () => {
+    let element;
+    let sandbox;
+
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+      element = fixture('basic');
+    });
+
+    teardown(() => {
+      sandbox.restore();
+    });
+
+    suite('dashboard table', () => {
+      setup(() => {
+        sandbox.stub(element.$.restAPI, 'getRepoDashboards').returns(
+            Promise.resolve([
+              {
+                id: 'default:contributor',
+                project: 'gerrit',
+                defining_project: 'gerrit',
+                ref: 'default',
+                path: 'contributor',
+                description: 'Own contributions.',
+                foreach: 'owner:self',
+                url: '/dashboard/?params',
+                title: 'Contributor Dashboard',
+                sections: [
+                  {
+                    name: 'Mine To Rebase',
+                    query: 'is:open -is:mergeable',
+                  },
+                  {
+                    name: 'My Recently Merged',
+                    query: 'is:merged limit:10',
+                  },
+                ],
+              },
+              {
+                id: 'custom:custom2',
+                project: 'gerrit',
+                defining_project: 'Public-Projects',
+                ref: 'custom',
+                path: 'open',
+                description: 'Recent open changes.',
+                url: '/dashboard/?params',
+                title: 'Open Changes',
+                sections: [
+                  {
+                    name: 'Open Changes',
+                    query: 'status:open project:${project} -age:7w',
+                  },
+                ],
+              },
+              {
+                id: 'default:abc',
+                project: 'gerrit',
+                ref: 'default',
+              },
+              {
+                id: 'custom:custom1',
+                project: 'gerrit',
+                ref: 'custom',
+              },
+            ]));
+      });
+
+      test('loading, sections, and ordering', done => {
+        assert.isTrue(element._loading);
+        assert.notEqual(getComputedStyle(element.$.loadingContainer).display,
+            'none');
+        assert.equal(getComputedStyle(element.$.dashboards).display,
+            'none');
+        element.repo = 'test';
+        flush(() => {
+          assert.equal(getComputedStyle(element.$.loadingContainer).display,
+              'none');
+          assert.notEqual(getComputedStyle(element.$.dashboards).display,
+              'none');
+
+          assert.equal(element._dashboards.length, 2);
+          assert.equal(element._dashboards[0].section, 'custom');
+          assert.equal(element._dashboards[1].section, 'default');
+
+          const dashboards = element._dashboards[0].dashboards;
+          assert.equal(dashboards.length, 2);
+          assert.equal(dashboards[0].id, 'custom:custom1');
+          assert.equal(dashboards[1].id, 'custom:custom2');
+
+          done();
+        });
+      });
+    });
+
+    suite('test url', () => {
+      test('_getUrl', () => {
+        sandbox.stub(Gerrit.Nav, 'getUrlForRepoDashboard',
+            () => '/r/dashboard/test');
+
+        assert.equal(element._getUrl('/dashboard/test', {}), '/r/dashboard/test');
+
+        assert.equal(element._getUrl(undefined, undefined), '');
+      });
+    });
+
+    suite('404', () => {
+      test('fires page-error', done => {
+        const response = {status: 404};
+        sandbox.stub(
+            element.$.restAPI, 'getRepoDashboards', (repo, errFn) => {
+              errFn(response);
+            });
+
+        element.addEventListener('page-error', e => {
+          assert.deepEqual(e.detail.response, response);
+          done();
+        });
+
+        element.repo = 'test';
+      });
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list.html b/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list.html
new file mode 100644
index 0000000..fccfa6a
--- /dev/null
+++ b/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list.html
@@ -0,0 +1,215 @@
+<!--
+@license
+Copyright (C) 2017 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="../../../behaviors/gr-list-view-behavior/gr-list-view-behavior.html">
+<link rel="import" href="../../../behaviors/gr-url-encoding-behavior/gr-url-encoding-behavior.html">
+<link rel="import" href="../../../bower_components/iron-input/iron-input.html">
+<link rel="import" href="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../../styles/gr-form-styles.html">
+<link rel="import" href="../../../styles/gr-table-styles.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../../shared/gr-account-link/gr-account-link.html">
+<link rel="import" href="../../shared/gr-button/gr-button.html">
+<link rel="import" href="../../shared/gr-date-formatter/gr-date-formatter.html">
+<link rel="import" href="../../shared/gr-dialog/gr-dialog.html">
+<link rel="import" href="../../shared/gr-list-view/gr-list-view.html">
+<link rel="import" href="../../shared/gr-overlay/gr-overlay.html">
+<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
+<link rel="import" href="../gr-create-pointer-dialog/gr-create-pointer-dialog.html">
+<link rel="import" href="../gr-confirm-delete-item-dialog/gr-confirm-delete-item-dialog.html">
+
+<dom-module id="gr-repo-detail-list">
+  <template>
+    <style include="gr-form-styles"></style>
+    <style include="gr-table-styles"></style>
+    <style include="shared-styles">
+      .tags td.name {
+        min-width: 25em;
+      }
+      td.name,
+      td.revision,
+      td.message {
+        word-break: break-word;
+      }
+      td.revision.tags {
+        width: 27em;
+      }
+      td.message,
+      td.tagger {
+        max-width: 15em;
+      }
+      .editing .editItem {
+        display: inherit;
+      }
+      .editItem,
+      .editing .editBtn,
+      .canEdit .revisionNoEditing,
+      .editing .revisionWithEditing,
+      .revisionEdit,
+      .hideItem {
+        display: none;
+      }
+      .revisionEdit gr-button {
+        margin-left: .6em;
+      }
+      .editBtn {
+        margin-left: 1em;
+      }
+      .canEdit .revisionEdit{
+        align-items: center;
+        display: flex;
+        line-height: 1;
+      }
+      .deleteButton:not(.show) {
+        display: none;
+      }
+      .tagger.hide {
+        display: none;
+      }
+    </style>
+    <style include="gr-table-styles"></style>
+    <gr-list-view
+        create-new="[[_loggedIn]]"
+        filter="[[_filter]]"
+        items-per-page="[[_itemsPerPage]]"
+        items="[[_items]]"
+        loading="[[_loading]]"
+        offset="[[_offset]]"
+        on-create-clicked="_handleCreateClicked"
+        path="[[_getPath(_repo, detailType)]]">
+      <table id="list" class="genericList gr-form-styles">
+        <tr class="headerRow">
+          <th class="name topHeader">Name</th>
+          <th class="revision topHeader">Revision</th>
+          <th class$="message topHeader [[_hideIfBranch(detailType)]]">
+            Message</th>
+          <th class$="tagger topHeader [[_hideIfBranch(detailType)]]">
+            Tagger</th>
+          <th class="repositoryBrowser topHeader">
+            Repository Browser</th>
+          <th class="delete topHeader"></th>
+        </tr>
+        <tr id="loading" class$="loadingMsg [[computeLoadingClass(_loading)]]">
+          <td>Loading...</td>
+        </tr>
+        <tbody class$="[[computeLoadingClass(_loading)]]">
+          <template is="dom-repeat" items="[[_shownItems]]">
+            <tr class="table">
+              <td class$="[[detailType]] name">[[_stripRefs(item.ref, detailType)]]</td>
+              <td class$="[[detailType]] revision [[_computeCanEditClass(item.ref, detailType, _isOwner)]]">
+                <span class="revisionNoEditing">
+                  [[item.revision]]
+                </span>
+                <span class$="revisionEdit [[_computeEditingClass(_isEditing)]]">
+                  <span class="revisionWithEditing">
+                    [[item.revision]]
+                  </span>
+                  <gr-button
+                      link
+                      on-tap="_handleEditRevision"
+                      class="editBtn">
+                    edit
+                  </gr-button>
+                  <input
+                      is=iron-input
+                      bind-value="{{_revisedRef}}"
+                      class="editItem">
+                  <gr-button
+                      link
+                      on-tap="_handleCancelRevision"
+                      class="cancelBtn editItem">
+                    Cancel
+                  </gr-button>
+                  <gr-button
+                      link
+                      on-tap="_handleSaveRevision"
+                      class="saveBtn editItem"
+                      disabled="[[!_revisedRef]]">
+                    Save
+                  </gr-button>
+                </span>
+              </td>
+              <td class$="message [[_hideIfBranch(detailType)]]">
+                [[_computeMessage(item.message)]]
+              </td>
+              <td class$="tagger [[_hideIfBranch(detailType)]]">
+                <div class$="tagger [[_computeHideTagger(item.tagger)]]">
+                  <gr-account-link
+                      account="[[item.tagger]]">
+                  </gr-account-link>
+                  (<gr-date-formatter
+                      has-tooltip
+                      date-str="[[item.tagger.date]]">
+                  </gr-date-formatter>)
+                </div>
+              </td>
+              <td class="repositoryBrowser">
+                <template is="dom-repeat"
+                    items="[[_computeWeblink(item)]]" as="link">
+                  <a href$="[[link.url]]"
+                      class="webLink"
+                      rel="noopener"
+                      target="_blank">
+                    ([[link.name]])
+                  </a>
+                </template>
+              </td>
+              <td class="delete">
+                <gr-button
+                    link
+                    class$="deleteButton [[_computeHideDeleteClass(_isOwner, item.can_delete)]]"
+                    on-tap="_handleDeleteItem">
+                  Delete
+                </gr-button>
+              </td>
+            </tr>
+          </template>
+        </tbody>
+      </table>
+      <gr-overlay id="overlay" with-backdrop>
+        <gr-confirm-delete-item-dialog
+            class="confirmDialog"
+            on-confirm="_handleDeleteItemConfirm"
+            on-cancel="_handleConfirmDialogCancel"
+            item="[[_refName]]"
+            item-type="[[detailType]]"></gr-confirm-delete-item-dialog>
+      </gr-overlay>
+    </gr-list-view>
+    <gr-overlay id="createOverlay" with-backdrop>
+      <gr-dialog
+          id="createDialog"
+          disabled="[[!_hasNewItemName]]"
+          confirm-label="Create"
+          on-confirm="_handleCreateItem"
+          on-cancel="_handleCloseCreate">
+        <div class="header" slot="header">
+          Create [[_computeItemName(detailType)]]
+        </div>
+        <div class="main" slot="main">
+          <gr-create-pointer-dialog
+              id="createNewModal"
+              detail-type="[[_computeItemName(detailType)]]"
+              has-new-item-name="{{_hasNewItemName}}"
+              item-detail="[[detailType]]"
+              repo-name="[[_repo]]"></gr-create-pointer-dialog>
+        </div>
+      </gr-dialog>
+    </gr-overlay>
+    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
+  </template>
+  <script src="gr-repo-detail-list.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list.js b/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list.js
new file mode 100644
index 0000000..8c7973d
--- /dev/null
+++ b/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list.js
@@ -0,0 +1,281 @@
+/**
+ * @license
+ * Copyright (C) 2017 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 DETAIL_TYPES = {
+    BRANCHES: 'branches',
+    TAGS: 'tags',
+  };
+
+  const PGP_START = '-----BEGIN PGP SIGNATURE-----';
+
+  Polymer({
+    is: 'gr-repo-detail-list',
+
+    properties: {
+      /**
+       * URL params passed from the router.
+       */
+      params: {
+        type: Object,
+        observer: '_paramsChanged',
+      },
+      /**
+       * The kind of detail we are displaying, possibilities are determined by
+       * the const DETAIL_TYPES.
+       */
+      detailType: String,
+
+      _editing: {
+        type: Boolean,
+        value: false,
+      },
+      _isOwner: {
+        type: Boolean,
+        value: false,
+      },
+      _loggedIn: {
+        type: Boolean,
+        value: false,
+      },
+      /**
+       * Offset of currently visible query results.
+       */
+      _offset: Number,
+      _repo: Object,
+      _items: Array,
+      /**
+       * Because  we request one more than the projectsPerPage, _shownProjects
+       * maybe one less than _projects.
+       */
+      _shownItems: {
+        type: Array,
+        computed: 'computeShownItems(_items)',
+      },
+      _itemsPerPage: {
+        type: Number,
+        value: 25,
+      },
+      _loading: {
+        type: Boolean,
+        value: true,
+      },
+      _filter: String,
+      _refName: String,
+      _hasNewItemName: Boolean,
+      _isEditing: Boolean,
+      _revisedRef: String,
+    },
+
+    behaviors: [
+      Gerrit.ListViewBehavior,
+      Gerrit.URLEncodingBehavior,
+    ],
+
+    _determineIfOwner(repo) {
+      return this.$.restAPI.getRepoAccess(repo)
+          .then(access =>
+                this._isOwner = access && !!access[repo].is_owner);
+    },
+
+    _paramsChanged(params) {
+      if (!params || !params.repo) { return; }
+
+      this._repo = params.repo;
+
+      this._getLoggedIn().then(loggedIn => {
+        this._loggedIn = loggedIn;
+        if (loggedIn) {
+          this._determineIfOwner(this._repo);
+        }
+      });
+
+      this.detailType = params.detail;
+
+      this._filter = this.getFilterValue(params);
+      this._offset = this.getOffsetValue(params);
+
+      return this._getItems(this._filter, this._repo,
+          this._itemsPerPage, this._offset, this.detailType);
+    },
+
+    _getItems(filter, repo, itemsPerPage, offset, detailType) {
+      this._loading = true;
+      this._items = [];
+      Polymer.dom.flush();
+      const errFn = response => {
+        this.fire('page-error', {response});
+      };
+      if (detailType === DETAIL_TYPES.BRANCHES) {
+        return this.$.restAPI.getRepoBranches(
+            filter, repo, itemsPerPage, offset, errFn).then(items => {
+              if (!items) { return; }
+              this._items = items;
+              this._loading = false;
+            });
+      } else if (detailType === DETAIL_TYPES.TAGS) {
+        return this.$.restAPI.getRepoTags(
+            filter, repo, itemsPerPage, offset, errFn).then(items => {
+              if (!items) { return; }
+              this._items = items;
+              this._loading = false;
+            });
+      }
+    },
+
+    _getPath(repo) {
+      return `/admin/repos/${this.encodeURL(repo, false)},` +
+          `${this.detailType}`;
+    },
+
+    _computeWeblink(repo) {
+      if (!repo.web_links) { return ''; }
+      const webLinks = repo.web_links;
+      return webLinks.length ? webLinks : null;
+    },
+
+    _computeMessage(message) {
+      if (!message) { return; }
+      // Strip PGP info.
+      return message.split(PGP_START)[0];
+    },
+
+    _stripRefs(item, detailType) {
+      if (detailType === DETAIL_TYPES.BRANCHES) {
+        return item.replace('refs/heads/', '');
+      } else if (detailType === DETAIL_TYPES.TAGS) {
+        return item.replace('refs/tags/', '');
+      }
+    },
+
+    _getLoggedIn() {
+      return this.$.restAPI.getLoggedIn();
+    },
+
+    _computeEditingClass(isEditing) {
+      return isEditing ? 'editing' : '';
+    },
+
+    _computeCanEditClass(ref, detailType, isOwner) {
+      return isOwner && this._stripRefs(ref, detailType) === 'HEAD' ?
+          'canEdit' : '';
+    },
+
+    _handleEditRevision(e) {
+      this._revisedRef = e.model.get('item.revision');
+      this._isEditing = true;
+    },
+
+    _handleCancelRevision() {
+      this._isEditing = false;
+    },
+
+    _handleSaveRevision(e) {
+      this._setRepoHead(this._repo, this._revisedRef, e);
+    },
+
+    _setRepoHead(repo, ref, e) {
+      return this.$.restAPI.setRepoHead(repo, ref).then(res => {
+        if (res.status < 400) {
+          this._isEditing = false;
+          e.model.set('item.revision', ref);
+          // This is needed to refresh _items property with fresh data,
+          // specifically can_delete from the json response.
+          this._getItems(
+              this._filter, this._repo, this._itemsPerPage,
+              this._offset, this.detailType);
+        }
+      });
+    },
+
+    _computeItemName(detailType) {
+      if (detailType === DETAIL_TYPES.BRANCHES) {
+        return 'Branch';
+      } else if (detailType === DETAIL_TYPES.TAGS) {
+        return 'Tag';
+      }
+    },
+
+    _handleDeleteItemConfirm() {
+      this.$.overlay.close();
+      if (this.detailType === DETAIL_TYPES.BRANCHES) {
+        return this.$.restAPI.deleteRepoBranches(this._repo, this._refName)
+            .then(itemDeleted => {
+              if (itemDeleted.status === 204) {
+                this._getItems(
+                    this._filter, this._repo, this._itemsPerPage,
+                    this._offset, this.detailType);
+              }
+            });
+      } else if (this.detailType === DETAIL_TYPES.TAGS) {
+        return this.$.restAPI.deleteRepoTags(this._repo, this._refName)
+            .then(itemDeleted => {
+              if (itemDeleted.status === 204) {
+                this._getItems(
+                    this._filter, this._repo, this._itemsPerPage,
+                    this._offset, this.detailType);
+              }
+            });
+      }
+    },
+
+    _handleConfirmDialogCancel() {
+      this.$.overlay.close();
+    },
+
+    _handleDeleteItem(e) {
+      const name = this._stripRefs(e.model.get('item.ref'), this.detailType);
+      if (!name) { return; }
+      this._refName = name;
+      this.$.overlay.open();
+    },
+
+    _computeHideDeleteClass(owner, canDelete) {
+      if (canDelete || owner) {
+        return 'show';
+      }
+
+      return '';
+    },
+
+    _handleCreateItem() {
+      this.$.createNewModal.handleCreateItem();
+      this._handleCloseCreate();
+    },
+
+    _handleCloseCreate() {
+      this.$.createOverlay.close();
+    },
+
+    _handleCreateClicked() {
+      this.$.createOverlay.open();
+    },
+
+    _hideIfBranch(type) {
+      if (type === DETAIL_TYPES.BRANCHES) {
+        return 'hideItem';
+      }
+
+      return '';
+    },
+
+    _computeHideTagger(tagger) {
+      return tagger ? '' : 'hide';
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list_test.html b/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list_test.html
new file mode 100644
index 0000000..5d2a9ad
--- /dev/null
+++ b/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list_test.html
@@ -0,0 +1,559 @@
+<!DOCTYPE html>
+<!--
+@license
+Copyright (C) 2017 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-repo-detail-list</title>
+
+<script src="../../../bower_components/page/page.js"></script>
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-repo-detail-list.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-repo-detail-list></gr-repo-detail-list>
+  </template>
+</test-fixture>
+
+<script>
+  let counter;
+  const branchGenerator = () => {
+    return {
+      ref: `refs/heads/test${++counter}`,
+      revision: '9c9d08a438e55e52f33b608415e6dddd9b18550d',
+      web_links: [
+        {
+          name: 'diffusion',
+          url: `https://git.example.org/branch/test;refs/heads/test${counter}`,
+        },
+      ],
+    };
+  };
+  const tagGenerator = () => {
+    return {
+      ref: `refs/tags/test${++counter}`,
+      revision: '9c9d08a438e55e52f33b608415e6dddd9b18550d',
+      web_links: [
+        {
+          name: 'diffusion',
+          url: `https://git.example.org/tag/test;refs/tags/test${counter}`,
+        },
+      ],
+      message: 'Annotated tag',
+      tagger: {
+        name: 'Test User',
+        email: 'test.user@gmail.com',
+        date: '2017-09-19 14:54:00.000000000',
+        tz: 540,
+      },
+    };
+  };
+
+  suite('Branches', () => {
+    let element;
+    let branches;
+    let sandbox;
+
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+      element = fixture('basic');
+      element.detailType = 'branches';
+      counter = 0;
+      sandbox.stub(page, 'show');
+    });
+
+    teardown(() => {
+      sandbox.restore();
+    });
+
+    suite('list of repo branches', () => {
+      setup(done => {
+        branches = [{
+          ref: 'HEAD',
+          revision: 'master',
+        }].concat(_.times(25, branchGenerator));
+
+        stub('gr-rest-api-interface', {
+          getRepoBranches(num, project, offset) {
+            return Promise.resolve(branches);
+          },
+        });
+
+        const params = {
+          repo: 'test',
+          detail: 'branches',
+        };
+
+        element._paramsChanged(params).then(() => { flush(done); });
+      });
+
+      test('test for branch in the list', done => {
+        flush(() => {
+          assert.equal(element._items[2].ref, 'refs/heads/test2');
+          done();
+        });
+      });
+
+      test('test for web links in the branches list', done => {
+        flush(() => {
+          assert.equal(element._items[2].web_links[0].url,
+              'https://git.example.org/branch/test;refs/heads/test2');
+          done();
+        });
+      });
+
+      test('test for refs/heads/ being striped from ref', done => {
+        flush(() => {
+          assert.equal(element._stripRefs(element._items[2].ref,
+              element.detailType), 'test2');
+          done();
+        });
+      });
+
+      test('_shownItems', () => {
+        assert.equal(element._shownItems.length, 25);
+      });
+
+      test('Edit HEAD button not admin', done => {
+        sandbox.stub(element, '_getLoggedIn').returns(Promise.resolve(true));
+        sandbox.stub(element.$.restAPI, 'getRepoAccess').returns(
+            Promise.resolve({
+              test: {is_owner: false},
+            }));
+        element._determineIfOwner('test').then(() => {
+          assert.equal(element._isOwner, false);
+          assert.equal(getComputedStyle(Polymer.dom(element.root)
+              .querySelector('.revisionNoEditing')).display, 'inline');
+          assert.equal(getComputedStyle(Polymer.dom(element.root)
+              .querySelector('.revisionEdit')).display, 'none');
+          done();
+        });
+      });
+
+      test('Edit HEAD button admin', done => {
+        const saveBtn = Polymer.dom(element.root).querySelector('.saveBtn');
+        const cancelBtn = Polymer.dom(element.root).querySelector('.cancelBtn');
+        const editBtn = Polymer.dom(element.root).querySelector('.editBtn');
+        const revisionNoEditing = Polymer.dom(element.root)
+              .querySelector('.revisionNoEditing');
+        const revisionWithEditing = Polymer.dom(element.root)
+              .querySelector('.revisionWithEditing');
+
+        sandbox.stub(element, '_getLoggedIn').returns(Promise.resolve(true));
+        sandbox.stub(element.$.restAPI, 'getRepoAccess').returns(
+            Promise.resolve({
+              test: {is_owner: true},
+            }));
+        sandbox.stub(element, '_handleSaveRevision');
+        element._determineIfOwner('test').then(() => {
+          assert.equal(element._isOwner, true);
+          // The revision container for non-editing enabled row is not visible.
+          assert.equal(getComputedStyle(revisionNoEditing).display, 'none');
+
+          // The revision container for editing enabled row is visible.
+          assert.notEqual(getComputedStyle(Polymer.dom(element.root)
+              .querySelector('.revisionEdit')).display, 'none');
+
+          // The revision and edit button are visible.
+          assert.notEqual(getComputedStyle(revisionWithEditing).display,
+              'none');
+          assert.notEqual(getComputedStyle(editBtn).display, 'none');
+
+          // The input, cancel, and save buttons are not visible.
+          const hiddenElements = Polymer.dom(element.root)
+              .querySelectorAll('.canEdit .editItem');
+
+          for (const item of hiddenElements) {
+            assert.equal(getComputedStyle(item).display, 'none');
+          }
+
+          MockInteractions.tap(editBtn);
+          flushAsynchronousOperations();
+          // The revision and edit button are not visible.
+          assert.equal(getComputedStyle(revisionWithEditing).display, 'none');
+          assert.equal(getComputedStyle(editBtn).display, 'none');
+
+          // The input, cancel, and save buttons are not visible.
+          for (item of hiddenElements) {
+            assert.notEqual(getComputedStyle(item).display, 'none');
+          }
+
+          // The revised ref was set correctly
+          assert.equal(element._revisedRef, 'master');
+
+          assert.isFalse(saveBtn.disabled);
+
+          // Delete the ref.
+          element._revisedRef = '';
+          assert.isTrue(saveBtn.disabled);
+
+          // Change the ref to something else
+          element._revisedRef = 'newRef';
+          element._repo = 'test';
+          assert.isFalse(saveBtn.disabled);
+
+          // Save button calls handleSave. since this is stubbed, the edit
+          // section remains open.
+          MockInteractions.tap(saveBtn);
+          assert.isTrue(element._handleSaveRevision.called);
+
+          // When cancel is tapped, the edit secion closes.
+          MockInteractions.tap(cancelBtn);
+          flushAsynchronousOperations();
+
+          // The revision and edit button are visible.
+          assert.notEqual(getComputedStyle(revisionWithEditing).display,
+              'none');
+          assert.notEqual(getComputedStyle(editBtn).display, 'none');
+
+          // The input, cancel, and save buttons are not visible.
+          for (const item of hiddenElements) {
+            assert.equal(getComputedStyle(item).display, 'none');
+          }
+          done();
+        });
+      });
+
+      test('_handleSaveRevision with invalid rev', done => {
+        const event = {model: {set: sandbox.stub()}};
+        element._isEditing = true;
+        sandbox.stub(element.$.restAPI, 'setRepoHead').returns(
+            Promise.resolve({
+              status: 400,
+            })
+        );
+
+        element._setRepoHead('test', 'newRef', event).then(() => {
+          assert.isTrue(element._isEditing);
+          assert.isFalse(event.model.set.called);
+          done();
+        });
+      });
+
+      test('_handleSaveRevision with valid rev', done => {
+        const event = {model: {set: sandbox.stub()}};
+        element._isEditing = true;
+        sandbox.stub(element.$.restAPI, 'setRepoHead').returns(
+            Promise.resolve({
+              status: 200,
+            })
+        );
+
+        element._setRepoHead('test', 'newRef', event).then(() => {
+          assert.isFalse(element._isEditing);
+          assert.isTrue(event.model.set.called);
+          done();
+        });
+      });
+
+      test('test _computeItemName', () => {
+        assert.deepEqual(element._computeItemName('branches'), 'Branch');
+        assert.deepEqual(element._computeItemName('tags'), 'Tag');
+      });
+    });
+
+    suite('list with less then 25 branches', () => {
+      setup(done => {
+        branches = _.times(25, branchGenerator);
+
+        stub('gr-rest-api-interface', {
+          getRepoBranches(num, repo, offset) {
+            return Promise.resolve(branches);
+          },
+        });
+
+        const params = {
+          repo: 'test',
+          detail: 'branches',
+        };
+
+        element._paramsChanged(params).then(() => { flush(done); });
+      });
+
+      test('_shownItems', () => {
+        assert.equal(element._shownItems.length, 25);
+      });
+    });
+
+    suite('filter', () => {
+      test('_paramsChanged', done => {
+        sandbox.stub(element.$.restAPI, 'getRepoBranches', () => {
+          return Promise.resolve(branches);
+        });
+        const params = {
+          detail: 'branches',
+          repo: 'test',
+          filter: 'test',
+          offset: 25,
+        };
+        element._paramsChanged(params).then(() => {
+          assert.equal(element.$.restAPI.getRepoBranches.lastCall.args[0],
+              'test');
+          assert.equal(element.$.restAPI.getRepoBranches.lastCall.args[1],
+              'test');
+          assert.equal(element.$.restAPI.getRepoBranches.lastCall.args[2],
+              25);
+          assert.equal(element.$.restAPI.getRepoBranches.lastCall.args[3],
+              25);
+          done();
+        });
+      });
+    });
+
+    suite('404', () => {
+      test('fires page-error', done => {
+        const response = {status: 404};
+        sandbox.stub(element.$.restAPI, 'getRepoBranches',
+            (filter, repo, reposBranchesPerPage, opt_offset, errFn) => {
+              errFn(response);
+            });
+
+        element.addEventListener('page-error', e => {
+          assert.deepEqual(e.detail.response, response);
+          done();
+        });
+
+        const params = {
+          detail: 'branches',
+          repo: 'test',
+          filter: 'test',
+          offset: 25,
+        };
+        element._paramsChanged(params);
+      });
+    });
+  });
+
+  suite('Tags', () => {
+    let element;
+    let tags;
+    let sandbox;
+
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+      element = fixture('basic');
+      element.detailType = 'tags';
+      counter = 0;
+      sandbox.stub(page, 'show');
+    });
+
+    teardown(() => {
+      sandbox.restore();
+    });
+
+    test('_computeMessage', () => {
+      let message = 'v2.15-rc1↵-----BEGIN PGP SIGNATURE-----↵Version: GnuPG v' +
+      '1↵↵iQIcBAABAgAGBQJZ27O7AAoJEF/XxZqaEoiMy6kQAMoQCpGr3J6JITI4BVWsr7QM↵xy' +
+      'EcWH5YPUko5EPTbkABHmaVyFmKGkuIQdn6c+NIbqJOk+5XT4oUyRSo1T569HPJ↵3kyxEJi' +
+      'T1ryvp5BIHwdvHx58fjw1+YkiWLZuZq1FFkUYqnWTYCrkv7Fok98pdOmV↵CL1Hgugi5uK8' +
+      '/kxf1M7+Nv6piaZ140pwSb1h6QdAjaZVfaBCnoxlG4LRUqHvEYay↵f4QYgFT67auHIGkZ4' +
+      'moUcsp2Du/1jSsCWL/CPwjPFGbbckVAjLCMT9yD3NKwpEZF↵pfsiZyHI9dL0M+QjVrM+RD' +
+      'HwIIJwra8R0IMkDlQ6MDrFlKNqNBbo588S6UPrm71L↵YuiwWlcrK9ZIybxT6LzbR65Rvez' +
+      'DSitQ+xeIfpZE19/X6BCnvlARLE8k/tC2JksI↵lEZi7Lf3FQdIcwwyt98tJkS9HX9v9jbC' +
+      '5QXifnoj3Li8tHSLuQ1dJCxHQiis6ojI↵OWUFkm0IHBXVNHA2dqYBdM+pL12mlI3wp6Ica' +
+      '4cdEVDwzu+j1xnVSFUa+d+Y2xJF↵7mytuyhHiKG4hm+zbhMv6WD8Q3FoDsJZeLY99l0hYQ' +
+      'SnnkMduFVroIs45pAs8gUA↵RvYla8mm9w/543IJAPzzFarPVLSsSyQ7tJl3UBzjKRNH/rX' +
+      'W+F22qyWD1zyHPUIR↵C00ItmwlAvveImYKpQAH↵=L+K9↵-----END PGP SIGNATURE---' +
+      '--';
+      assert.equal(element._computeMessage(message), 'v2.15-rc1↵');
+      message = 'v2.15-rc1';
+      assert.equal(element._computeMessage(message), 'v2.15-rc1');
+    });
+
+    suite('list of repo tags', () => {
+      setup(done => {
+        tags = _.times(26, tagGenerator);
+
+        stub('gr-rest-api-interface', {
+          getRepoTags(num, repo, offset) {
+            return Promise.resolve(tags);
+          },
+        });
+
+        const params = {
+          repo: 'test',
+          detail: 'tags',
+        };
+
+        element._paramsChanged(params).then(() => { flush(done); });
+      });
+
+      test('test for tag in the list', done => {
+        flush(() => {
+          assert.equal(element._items[1].ref, 'refs/tags/test2');
+          done();
+        });
+      });
+
+      test('test for tag message in the list', done => {
+        flush(() => {
+          assert.equal(element._items[1].message, 'Annotated tag');
+          done();
+        });
+      });
+
+      test('test for tagger in the tag list', done => {
+        const tagger = {
+          name: 'Test User',
+          email: 'test.user@gmail.com',
+          date: '2017-09-19 14:54:00.000000000',
+          tz: 540,
+        };
+        flush(() => {
+          assert.deepEqual(element._items[1].tagger, tagger);
+          done();
+        });
+      });
+
+      test('test for web links in the tags list', done => {
+        flush(() => {
+          assert.equal(element._items[1].web_links[0].url,
+              'https://git.example.org/tag/test;refs/tags/test2');
+          done();
+        });
+      });
+
+      test('test for refs/tags/ being striped from ref', done => {
+        flush(() => {
+          assert.equal(element._stripRefs(element._items[1].ref,
+              element.detailType), 'test2');
+          done();
+        });
+      });
+
+      test('_shownItems', () => {
+        assert.equal(element._shownItems.length, 25);
+      });
+
+      test('_computeHideTagger', () => {
+        const testObject1 = {
+          tagger: 'test',
+        };
+        assert.equal(element._computeHideTagger(testObject1), '');
+
+        assert.equal(element._computeHideTagger(undefined), 'hide');
+      });
+    });
+
+    suite('list with less then 25 tags', () => {
+      setup(done => {
+        tags = _.times(25, tagGenerator);
+
+        stub('gr-rest-api-interface', {
+          getRepoTags(num, project, offset) {
+            return Promise.resolve(tags);
+          },
+        });
+
+        const params = {
+          repo: 'test',
+          detail: 'tags',
+        };
+
+        element._paramsChanged(params).then(() => { flush(done); });
+      });
+
+      test('_shownItems', () => {
+        assert.equal(element._shownItems.length, 25);
+      });
+    });
+
+    suite('filter', () => {
+      test('_paramsChanged', done => {
+        sandbox.stub(element.$.restAPI, 'getRepoTags', () => {
+          return Promise.resolve(tags);
+        });
+        const params = {
+          repo: 'test',
+          detail: 'tags',
+          filter: 'test',
+          offset: 25,
+        };
+        element._paramsChanged(params).then(() => {
+          assert.equal(element.$.restAPI.getRepoTags.lastCall.args[0],
+              'test');
+          assert.equal(element.$.restAPI.getRepoTags.lastCall.args[1],
+              'test');
+          assert.equal(element.$.restAPI.getRepoTags.lastCall.args[2],
+              25);
+          assert.equal(element.$.restAPI.getRepoTags.lastCall.args[3],
+              25);
+          done();
+        });
+      });
+    });
+
+    suite('create new', () => {
+      test('_handleCreateClicked called when create-click fired', () => {
+        sandbox.stub(element, '_handleCreateClicked');
+        element.$$('gr-list-view').fire('create-clicked');
+        assert.isTrue(element._handleCreateClicked.called);
+      });
+
+      test('_handleCreateClicked opens modal', () => {
+        const openStub = sandbox.stub(element.$.createOverlay, 'open');
+        element._handleCreateClicked();
+        assert.isTrue(openStub.called);
+      });
+
+      test('_handleCreateItem called when confirm fired', () => {
+        sandbox.stub(element, '_handleCreateItem');
+        element.$.createDialog.fire('confirm');
+        assert.isTrue(element._handleCreateItem.called);
+      });
+
+      test('_handleCloseCreate called when cancel fired', () => {
+        sandbox.stub(element, '_handleCloseCreate');
+        element.$.createDialog.fire('cancel');
+        assert.isTrue(element._handleCloseCreate.called);
+      });
+    });
+
+    suite('404', () => {
+      test('fires page-error', done => {
+        const response = {status: 404};
+        sandbox.stub(element.$.restAPI, 'getRepoTags',
+            (filter, repo, reposTagsPerPage, opt_offset, errFn) => {
+              errFn(response);
+            });
+
+        element.addEventListener('page-error', e => {
+          assert.deepEqual(e.detail.response, response);
+          done();
+        });
+
+        const params = {
+          repo: 'test',
+          detail: 'tags',
+          filter: 'test',
+          offset: 25,
+        };
+        element._paramsChanged(params);
+      });
+    });
+
+    test('test _computeHideDeleteClass', () => {
+      assert.deepEqual(element._computeHideDeleteClass(true, false), 'show');
+      assert.deepEqual(element._computeHideDeleteClass(false, true), 'show');
+      assert.deepEqual(element._computeHideDeleteClass(false, false), '');
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-list/gr-repo-list.html b/polygerrit-ui/app/elements/admin/gr-repo-list/gr-repo-list.html
new file mode 100644
index 0000000..0490db2
--- /dev/null
+++ b/polygerrit-ui/app/elements/admin/gr-repo-list/gr-repo-list.html
@@ -0,0 +1,100 @@
+<!--
+@license
+Copyright (C) 2017 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="../../../bower_components/polymer/polymer.html">
+
+<link rel="import" href="../../../behaviors/gr-list-view-behavior/gr-list-view-behavior.html">
+<link rel="import" href="../../../bower_components/iron-input/iron-input.html">
+<link rel="import" href="../../../styles/gr-table-styles.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../../shared/gr-dialog/gr-dialog.html">
+<link rel="import" href="../../shared/gr-list-view/gr-list-view.html">
+<link rel="import" href="../../shared/gr-overlay/gr-overlay.html">
+<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
+<link rel="import" href="../gr-create-repo-dialog/gr-create-repo-dialog.html">
+
+<dom-module id="gr-repo-list">
+  <template>
+    <style include="shared-styles"></style>
+    <style include="gr-table-styles"></style>
+    <gr-list-view
+        create-new=[[_createNewCapability]]
+        filter="[[_filter]]"
+        items-per-page="[[_reposPerPage]]"
+        items="[[_repos]]"
+        loading="[[_loading]]"
+        offset="[[_offset]]"
+        on-create-clicked="_handleCreateClicked"
+        path="[[_path]]">
+      <table id="list" class="genericList">
+        <tr class="headerRow">
+          <th class="name topHeader">Repository Name</th>
+          <th class="description topHeader">Repository Description</th>
+          <th class="changesLink topHeader">Changes</th>
+          <th class="repositoryBrowser topHeader">Repository Browser</th>
+          <th class="readOnly topHeader">Read only</th>
+        </tr>
+        <tr id="loading" class$="loadingMsg [[computeLoadingClass(_loading)]]">
+          <td>Loading...</td>
+        </tr>
+        <tbody class$="[[computeLoadingClass(_loading)]]">
+          <template is="dom-repeat" items="[[_shownRepos]]">
+            <tr class="table">
+              <td class="name">
+                <a href$="[[_computeRepoUrl(item.name)]]">[[item.name]]</a>
+              </td>
+              <td class="description">[[item.description]]</td>
+              <td class="changesLink"><a href$="[[_computeChangesLink(item.name)]]">(view all)</a></td>
+              <td class="repositoryBrowser">
+                <template is="dom-repeat"
+                    items="[[_computeWeblink(item)]]" as="link">
+                  <a href$="[[link.url]]"
+                      class="webLink"
+                      rel="noopener"
+                      target="_blank">
+                    ([[link.name]])
+                  </a>
+                </template>
+              </td>
+              <td class="readOnly">[[_readOnly(item)]]</td>
+            </tr>
+          </template>
+        </tbody>
+      </table>
+    </gr-list-view>
+    <gr-overlay id="createOverlay" with-backdrop>
+      <gr-dialog
+          id="createDialog"
+          class="confirmDialog"
+          disabled="[[!_hasNewRepoName]]"
+          confirm-label="Create"
+          on-confirm="_handleCreateRepo"
+          on-cancel="_handleCloseCreate">
+        <div class="header" slot="header">
+          Create Repository
+        </div>
+        <div class="main" slot="main">
+          <gr-create-repo-dialog
+              has-new-repo-name="{{_hasNewRepoName}}"
+              params="[[params]]"
+              id="createNewModal"></gr-create-repo-dialog>
+        </div>
+      </gr-dialog>
+    </gr-overlay>
+    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
+  </template>
+  <script src="gr-repo-list.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-list/gr-repo-list.js b/polygerrit-ui/app/elements/admin/gr-repo-list/gr-repo-list.js
new file mode 100644
index 0000000..e0b054b
--- /dev/null
+++ b/polygerrit-ui/app/elements/admin/gr-repo-list/gr-repo-list.js
@@ -0,0 +1,162 @@
+/**
+ * @license
+ * Copyright (C) 2017 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-repo-list',
+
+    properties: {
+      /**
+       * URL params passed from the router.
+       */
+      params: {
+        type: Object,
+        observer: '_paramsChanged',
+      },
+
+      /**
+       * Offset of currently visible query results.
+       */
+      _offset: Number,
+      _path: {
+        type: String,
+        readOnly: true,
+        value: '/admin/repos',
+      },
+      _hasNewRepoName: Boolean,
+      _createNewCapability: {
+        type: Boolean,
+        value: false,
+      },
+      _repos: Array,
+
+      /**
+       * Because  we request one more than the projectsPerPage, _shownProjects
+       * maybe one less than _projects.
+       * */
+      _shownRepos: {
+        type: Array,
+        computed: 'computeShownItems(_repos)',
+      },
+
+      _reposPerPage: {
+        type: Number,
+        value: 25,
+      },
+
+      _loading: {
+        type: Boolean,
+        value: true,
+      },
+      _filter: {
+        type: String,
+        value: '',
+      },
+    },
+
+    behaviors: [
+      Gerrit.ListViewBehavior,
+    ],
+
+    attached() {
+      this._getCreateRepoCapability();
+      this.fire('title-change', {title: 'Repos'});
+      this._maybeOpenCreateOverlay(this.params);
+    },
+
+    _paramsChanged(params) {
+      this._loading = true;
+      this._filter = this.getFilterValue(params);
+      this._offset = this.getOffsetValue(params);
+
+      return this._getRepos(this._filter, this._reposPerPage,
+          this._offset);
+    },
+
+    /**
+     * Opens the create overlay if the route has a hash 'create'
+     * @param {!Object} params
+     */
+    _maybeOpenCreateOverlay(params) {
+      if (params && params.openCreateModal) {
+        this.$.createOverlay.open();
+      }
+    },
+
+    _computeRepoUrl(name) {
+      return this.getUrl(this._path + '/', name);
+    },
+
+    _computeChangesLink(name) {
+      return Gerrit.Nav.getUrlForProjectChanges(name);
+    },
+
+    _getCreateRepoCapability() {
+      return this.$.restAPI.getAccount().then(account => {
+        if (!account) { return; }
+        return this.$.restAPI.getAccountCapabilities(['createProject'])
+            .then(capabilities => {
+              if (capabilities.createProject) {
+                this._createNewCapability = true;
+              }
+            });
+      });
+    },
+
+    _getRepos(filter, reposPerPage, offset) {
+      this._repos = [];
+      return this.$.restAPI.getRepos(filter, reposPerPage, offset)
+          .then(repos => {
+            // Late response.
+            if (filter !== this._filter || !repos) { return; }
+            this._repos = repos;
+            this._loading = false;
+          });
+    },
+
+    _refreshReposList() {
+      this.$.restAPI.invalidateReposCache();
+      return this._getRepos(this._filter, this._reposPerPage,
+          this._offset);
+    },
+
+    _handleCreateRepo() {
+      this.$.createNewModal.handleCreateRepo().then(() => {
+        this._refreshReposList();
+      });
+    },
+
+    _handleCloseCreate() {
+      this.$.createOverlay.close();
+    },
+
+    _handleCreateClicked() {
+      this.$.createOverlay.open();
+    },
+
+    _readOnly(item) {
+      return item.state === 'READ_ONLY' ? 'Y' : '';
+    },
+
+    _computeWeblink(repo) {
+      if (!repo.web_links) { return ''; }
+      const webLinks = repo.web_links;
+      return webLinks.length ? webLinks : null;
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-list/gr-repo-list_test.html b/polygerrit-ui/app/elements/admin/gr-repo-list/gr-repo-list_test.html
new file mode 100644
index 0000000..4bc023f
--- /dev/null
+++ b/polygerrit-ui/app/elements/admin/gr-repo-list/gr-repo-list_test.html
@@ -0,0 +1,197 @@
+<!DOCTYPE html>
+<!--
+@license
+Copyright (C) 2017 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-repo-list</title>
+
+<script src="../../../bower_components/page/page.js"></script>
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-repo-list.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-repo-list></gr-repo-list>
+  </template>
+</test-fixture>
+
+<script>
+  let counter;
+  const repoGenerator = () => {
+    return {
+      id: `test${++counter}`,
+      state: 'ACTIVE',
+      web_links: [
+        {
+          name: 'diffusion',
+          url: `https://phabricator.example.org/r/project/test${counter}`,
+        },
+      ],
+    };
+  };
+
+  suite('gr-repo-list tests', () => {
+    let element;
+    let repos;
+    let sandbox;
+    let value;
+
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+      sandbox.stub(page, 'show');
+      element = fixture('basic');
+      counter = 0;
+    });
+
+    teardown(() => {
+      sandbox.restore();
+    });
+
+    suite('list with repos', () => {
+      setup(done => {
+        repos = _.times(26, repoGenerator);
+        stub('gr-rest-api-interface', {
+          getRepos(num, offset) {
+            return Promise.resolve(repos);
+          },
+        });
+        element._paramsChanged(value).then(() => { flush(done); });
+      });
+
+      test('test for test repo in the list', done => {
+        flush(() => {
+          assert.equal(element._repos[1].id, 'test2');
+          done();
+        });
+      });
+
+      test('_shownRepos', () => {
+        assert.equal(element._shownRepos.length, 25);
+      });
+
+      test('_maybeOpenCreateOverlay', () => {
+        const overlayOpen = sandbox.stub(element.$.createOverlay, 'open');
+        element._maybeOpenCreateOverlay();
+        assert.isFalse(overlayOpen.called);
+        const params = {};
+        element._maybeOpenCreateOverlay(params);
+        assert.isFalse(overlayOpen.called);
+        params.openCreateModal = true;
+        element._maybeOpenCreateOverlay(params);
+        assert.isTrue(overlayOpen.called);
+      });
+    });
+
+    suite('list with less then 25 repos', () => {
+      setup(done => {
+        repos = _.times(25, repoGenerator);
+
+        stub('gr-rest-api-interface', {
+          getRepos(num, offset) {
+            return Promise.resolve(repos);
+          },
+        });
+
+        element._paramsChanged(value).then(() => { flush(done); });
+      });
+
+      test('_shownRepos', () => {
+        assert.equal(element._shownRepos.length, 25);
+      });
+    });
+
+    suite('filter', () => {
+      setup(() => {
+        repos = _.times(25, repoGenerator);
+        reposFiltered = _.times(1, repoGenerator);
+      });
+
+      test('_paramsChanged', done => {
+        sandbox.stub(element.$.restAPI, 'getRepos', () => {
+          return Promise.resolve(repos);
+        });
+        const value = {
+          filter: 'test',
+          offset: 25,
+        };
+        element._paramsChanged(value).then(() => {
+          assert.isTrue(element.$.restAPI.getRepos.lastCall
+              .calledWithExactly('test', 25, 25));
+          done();
+        });
+      });
+
+      test('latest repos requested are always set', done => {
+        const repoStub = sandbox.stub(element.$.restAPI, 'getRepos');
+        repoStub.withArgs('test').returns(Promise.resolve(repos));
+        repoStub.withArgs('filter').returns(Promise.resolve(reposFiltered));
+        element._filter = 'test';
+
+        // Repos are not set because the element._filter differs.
+        element._getRepos('filter', 25, 0).then(() => {
+          assert.deepEqual(element._repos, []);
+          done();
+        });
+      });
+    });
+
+    suite('loading', () => {
+      test('correct contents are displayed', () => {
+        assert.isTrue(element._loading);
+        assert.equal(element.computeLoadingClass(element._loading), 'loading');
+        assert.equal(getComputedStyle(element.$.loading).display, 'block');
+
+        element._loading = false;
+        element._repos = _.times(25, repoGenerator);
+
+        flushAsynchronousOperations();
+        assert.equal(element.computeLoadingClass(element._loading), '');
+        assert.equal(getComputedStyle(element.$.loading).display, 'none');
+      });
+    });
+
+    suite('create new', () => {
+      test('_handleCreateClicked called when create-click fired', () => {
+        sandbox.stub(element, '_handleCreateClicked');
+        element.$$('gr-list-view').fire('create-clicked');
+        assert.isTrue(element._handleCreateClicked.called);
+      });
+
+      test('_handleCreateClicked opens modal', () => {
+        const openStub = sandbox.stub(element.$.createOverlay, 'open');
+        element._handleCreateClicked();
+        assert.isTrue(openStub.called);
+      });
+
+      test('_handleCreateRepo called when confirm fired', () => {
+        sandbox.stub(element, '_handleCreateRepo');
+        element.$.createDialog.fire('confirm');
+        assert.isTrue(element._handleCreateRepo.called);
+      });
+
+      test('_handleCloseCreate called when cancel fired', () => {
+        sandbox.stub(element, '_handleCloseCreate');
+        element.$.createDialog.fire('cancel');
+        assert.isTrue(element._handleCloseCreate.called);
+      });
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/admin/gr-repo/gr-repo.html b/polygerrit-ui/app/elements/admin/gr-repo/gr-repo.html
new file mode 100644
index 0000000..6ce1a09
--- /dev/null
+++ b/polygerrit-ui/app/elements/admin/gr-repo/gr-repo.html
@@ -0,0 +1,363 @@
+<!--
+@license
+Copyright (C) 2017 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="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../../bower_components/iron-autogrow-textarea/iron-autogrow-textarea.html">
+<link rel="import" href="../../../bower_components/iron-input/iron-input.html">
+
+<link rel="import" href="../../plugins/gr-endpoint-decorator/gr-endpoint-decorator.html">
+<link rel="import" href="../../shared/gr-download-commands/gr-download-commands.html">
+<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
+<link rel="import" href="../../shared/gr-select/gr-select.html">
+<link rel="import" href="../../../styles/gr-form-styles.html">
+<link rel="import" href="../../../styles/gr-subpage-styles.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+
+
+<dom-module id="gr-repo">
+  <template>
+    <style include="shared-styles"></style>
+    <style include="gr-subpage-styles">
+      h2.edited:after {
+        color: var(--deemphasized-text-color);
+        content: ' *';
+      }
+      .loading,
+      .hideDownload {
+        display: none;
+      }
+      #loading.loading {
+        display: block;
+      }
+      #loading:not(.loading) {
+        display: none;
+      }
+      .repositorySettings {
+        display: none;
+      }
+      .repositorySettings.showConfig {
+        display: block;
+      }
+    </style>
+    <style include="gr-form-styles"></style>
+    <main class="gr-form-styles read-only">
+      <style include="shared-styles"></style>
+      <div class="info">
+        <h1 id="Title" class$="name">
+          [[repo]]
+          <hr/>
+        </h1>
+        <div>
+          <a href$="[[_computeChangesUrl(repo)]]">(view changes)</a>
+        </div>
+      </div>
+      <div id="loading" class$="[[_computeLoadingClass(_loading)]]">Loading...</div>
+      <div id="loadedContent" class$="[[_computeLoadingClass(_loading)]]">
+        <div id="downloadContent" class$="[[_computeDownloadClass(_schemes)]]">
+          <h2 id="download">Download</h2>
+          <fieldset>
+            <gr-download-commands
+                id="downloadCommands"
+                commands="[[_computeCommands(repo, _schemesObj, _selectedScheme)]]"
+                schemes="[[_schemes]]"
+                selected-scheme="{{_selectedScheme}}"></gr-download-commands>
+          </fieldset>
+        </div>
+        <h2 id="configurations"
+            class$="[[_computeHeaderClass(_configChanged)]]">Configurations</h2>
+        <div id="form">
+          <fieldset>
+            <h3 id="Description">Description</h3>
+            <fieldset>
+              <iron-autogrow-textarea
+                  id="descriptionInput"
+                  class="description"
+                  autocomplete="on"
+                  placeholder="<Insert repo description here>"
+                  bind-value="{{_repoConfig.description}}"
+                  disabled$="[[_readOnly]]"></iron-autogrow-textarea>
+            </fieldset>
+            <h3 id="Options">Repository Options</h3>
+            <fieldset id="options">
+              <section>
+                <span class="title">State</span>
+                <span class="value">
+                  <gr-select
+                      id="stateSelect"
+                      bind-value="{{_repoConfig.state}}">
+                    <select disabled$="[[_readOnly]]">
+                      <template is="dom-repeat" items=[[_states]]>
+                        <option value="[[item.value]]">[[item.label]]</option>
+                      </template>
+                    </select>
+                  </gr-select>
+                </span>
+              </section>
+              <section>
+                <span class="title">Submit type</span>
+                <span class="value">
+                  <gr-select
+                      id="submitTypeSelect"
+                      bind-value="{{_repoConfig.submit_type}}">
+                    <select disabled$="[[_readOnly]]">
+                      <template is="dom-repeat"
+                          items="[[_formatSubmitTypeSelect(_repoConfig)]]">
+                        <option value="[[item.value]]">[[item.label]]</option>
+                      </template>
+                    </select>
+                  </gr-select>
+                </span>
+              </section>
+              <section>
+                <span class="title">Allow content merges</span>
+                <span class="value">
+                  <gr-select
+                      id="contentMergeSelect"
+                      bind-value="{{_repoConfig.use_content_merge.configured_value}}">
+                    <select disabled$="[[_readOnly]]">
+                      <template is="dom-repeat"
+                          items="[[_formatBooleanSelect(_repoConfig.use_content_merge)]]">
+                        <option value="[[item.value]]">[[item.label]]</option>
+                      </template>
+                    </select>
+                  </gr-select>
+                </span>
+              </section>
+              <section>
+                <span class="title">
+                  Create a new change for every commit not in the target branch
+                </span>
+                <span class="value">
+                  <gr-select
+                      id="newChangeSelect"
+                      bind-value="{{_repoConfig.create_new_change_for_all_not_in_target.configured_value}}">
+                    <select disabled$="[[_readOnly]]">
+                      <template is="dom-repeat"
+                          items="[[_formatBooleanSelect(_repoConfig.create_new_change_for_all_not_in_target)]]">
+                        <option value="[[item.value]]">[[item.label]]</option>
+                      </template>
+                    </select>
+                  </gr-select>
+                </span>
+              </section>
+              <section>
+                <span class="title">Require Change-Id in commit message</span>
+                <span class="value">
+                  <gr-select
+                      id="requireChangeIdSelect"
+                      bind-value="{{_repoConfig.require_change_id.configured_value}}">
+                    <select disabled$="[[_readOnly]]">
+                      <template is="dom-repeat"
+                          items="[[_formatBooleanSelect(_repoConfig.require_change_id)]]">
+                        <option value="[[item.value]]">[[item.label]]</option>
+                      </template>
+                    </select>
+                  </gr-select>
+                </span>
+              </section>
+              <section
+                   id="enableSignedPushSettings"
+                   class$="repositorySettings [[_computeRepositoriesClass(_repoConfig.enable_signed_push)]]">
+                <span class="title">Enable signed push</span>
+                <span class="value">
+                  <gr-select
+                      id="enableSignedPush"
+                      bind-value="{{_repoConfig.enable_signed_push.configured_value}}">
+                    <select disabled$="[[_readOnly]]">
+                      <template is="dom-repeat"
+                          items="[[_formatBooleanSelect(_repoConfig.enable_signed_push)]]">
+                        <option value="[[item.value]]">[[item.label]]</option>
+                      </template>
+                    </select>
+                  </gr-select>
+                </span>
+              </section>
+              <section
+                   id="requireSignedPushSettings"
+                   class$="repositorySettings [[_computeRepositoriesClass(_repoConfig.require_signed_push)]]">
+                <span class="title">Require signed push</span>
+                <span class="value">
+                  <gr-select
+                      id="requireSignedPush"
+                      bind-value="{{_repoConfig.require_signed_push.configured_value}}">
+                    <select disabled$="[[_readOnly]]">
+                      <template is="dom-repeat"
+                          items="[[_formatBooleanSelect(_repoConfig.require_signed_push)]]">
+                        <option value="[[item.value]]">[[item.label]]</option>
+                      </template>
+                    </select>
+                  </gr-select>
+                </span>
+              </section>
+              <section>
+                <span class="title">
+                  Reject implicit merges when changes are pushed for review</span>
+                <span class="value">
+                  <gr-select
+                      id="rejectImplicitMergesSelect"
+                      bind-value="{{_repoConfig.reject_implicit_merges.configured_value}}">
+                    <select disabled$="[[_readOnly]]">
+                      <template is="dom-repeat"
+                          items="[[_formatBooleanSelect(_repoConfig.reject_implicit_merges)]]">
+                        <option value="[[item.value]]">[[item.label]]</option>
+                      </template>
+                    </select>
+                  </gr-select>
+                </span>
+              </section>
+              <section id="noteDbSettings" class$="repositorySettings [[_computeRepositoriesClass(_noteDbEnabled)]]">
+                <span class="title">
+                  Enable adding unregistered users as reviewers and CCs on changes</span>
+                <span class="value">
+                  <gr-select
+                      id="unRegisteredCcSelect"
+                      bind-value="{{_repoConfig.enable_reviewer_by_email.configured_value}}">
+                    <select disabled$="[[_readOnly]]">
+                      <template is="dom-repeat"
+                          items="[[_formatBooleanSelect(_repoConfig.enable_reviewer_by_email)]]">
+                        <option value="[[item.value]]">[[item.label]]</option>
+                      </template>
+                  </select>
+                  </gr-select>
+                </span>
+              </section>
+              <section>
+                <span class="title">
+                  Set all new changes private by default</span>
+                <span class="value">
+                  <gr-select
+                      id="setAllnewChangesPrivateByDefaultSelect"
+                      bind-value="{{_repoConfig.private_by_default.configured_value}}">
+                    <select disabled$="[[_readOnly]]">
+                      <template is="dom-repeat"
+                          items="[[_formatBooleanSelect(_repoConfig.private_by_default)]]">
+                        <option value="[[item.value]]">[[item.label]]</option>
+                      </template>
+                    </select>
+                  </gr-select>
+                </span>
+              </section>
+              <section>
+                <span class="title">
+                  Set new changes to "work in progress" by default</span>
+                <span class="value">
+                  <gr-select
+                      id="setAllNewChangesWorkInProgressByDefaultSelect"
+                      bind-value="{{_repoConfig.work_in_progress_by_default.configured_value}}">
+                    <select disabled$="[[_readOnly]]">
+                      <template is="dom-repeat"
+                          items="[[_formatBooleanSelect(_repoConfig.work_in_progress_by_default)]]">
+                        <option value="[[item.value]]">[[item.label]]</option>
+                      </template>
+                    </select>
+                  </gr-select>
+                </span>
+              </section>
+              <section>
+                <span class="title">Maximum Git object size limit</span>
+                <span class="value">
+                  <input
+                      id="maxGitObjSizeInput"
+                      bind-value="{{_repoConfig.max_object_size_limit.configured_value}}"
+                      is="iron-input"
+                      type="text"
+                      disabled$="[[_readOnly]]">
+                  <template is="dom-if" if="[[_repoConfig.max_object_size_limit.value]]">
+                    effective: [[_repoConfig.max_object_size_limit.value]] bytes
+                  </template>
+                </span>
+              </section>
+              <section>
+                <span class="title">Match authored date with committer date upon submit</span>
+                <span class="value">
+                  <gr-select
+                      id="matchAuthoredDateWithCommitterDateSelect"
+                      bind-value="{{_repoConfig.match_author_to_committer_date.configured_value}}">
+                    <select disabled$="[[_readOnly]]">
+                      <template is="dom-repeat"
+                          items="[[_formatBooleanSelect(_repoConfig.match_author_to_committer_date)]]">
+                        <option value="[[item.value]]">[[item.label]]</option>
+                      </template>
+                  </select>
+                  </gr-select>
+                </span>
+              </section>
+              <section>
+                <span class="title">Reject empty commit upon submit</span>
+                <span class="value">
+                  <gr-select
+                      id="rejectEmptyCommitSelect"
+                      bind-value="{{_repoConfig.reject_empty_commit.configured_value}}">
+                    <select disabled$="[[_readOnly]]">
+                      <template is="dom-repeat"
+                                items="[[_formatBooleanSelect(_repoConfig.reject_empty_commit)]]">
+                        <option value="[[item.value]]">[[item.label]]</option>
+                      </template>
+                  </select>
+                  </gr-select>
+                </span>
+              </section>
+            </fieldset>
+            <h3 id="Options">Contributor Agreements</h3>
+            <fieldset id="agreements">
+              <section>
+                <span class="title">
+                  Require a valid contributor agreement to upload</span>
+                <span class="value">
+                  <gr-select
+                      id="contributorAgreementSelect"
+                      bind-value="{{_repoConfig.use_contributor_agreements.configured_value}}">
+                  <select disabled$="[[_readOnly]]">
+                    <template is="dom-repeat"
+                        items="[[_formatBooleanSelect(_repoConfig.use_contributor_agreements)]]">
+                      <option value="[[item.value]]">[[item.label]]</option>
+                    </template>
+                    </select>
+                  </gr-select>
+                </span>
+              </section>
+              <section>
+                <span class="title">Require Signed-off-by in commit message</span>
+                <span class="value">
+                  <gr-select
+                        id="useSignedOffBySelect"
+                        bind-value="{{_repoConfig.use_signed_off_by.configured_value}}">
+                    <select disabled$="[[_readOnly]]">
+                      <template is="dom-repeat"
+                          items="[[_formatBooleanSelect(_repoConfig.use_signed_off_by)]]">
+                        <option value="[[item.value]]">[[item.label]]</option>
+                      </template>
+                    </select>
+                  </gr-select>
+                </span>
+              </section>
+            </fieldset>
+            <!-- TODO @beckysiegel add plugin config widgets -->
+            <gr-button
+                on-tap="_handleSaveRepoConfig"
+                disabled$="[[_computeButtonDisabled(_readOnly, _configChanged)]]">Save changes</gr-button>
+          </fieldset>
+          <gr-endpoint-decorator name="repo-config">
+            <gr-endpoint-param name="repoName" value="[[repo]]"></gr-endpoint-param>
+          </gr-endpoint-decorator>
+        </div>
+      </div>
+    </main>
+    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
+  </template>
+  <script src="gr-repo.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/admin/gr-repo/gr-repo.js b/polygerrit-ui/app/elements/admin/gr-repo/gr-repo.js
new file mode 100644
index 0000000..d79bf0d
--- /dev/null
+++ b/polygerrit-ui/app/elements/admin/gr-repo/gr-repo.js
@@ -0,0 +1,326 @@
+/**
+ * @license
+ * Copyright (C) 2017 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 STATES = {
+    active: {value: 'ACTIVE', label: 'Active'},
+    readOnly: {value: 'READ_ONLY', label: 'Read Only'},
+    hidden: {value: 'HIDDEN', label: 'Hidden'},
+  };
+
+  const SUBMIT_TYPES = {
+    // Exclude INHERIT, which is handled specially.
+    mergeIfNecessary: {
+      value: 'MERGE_IF_NECESSARY',
+      label: 'Merge if necessary',
+    },
+    fastForwardOnly: {
+      value: 'FAST_FORWARD_ONLY',
+      label: 'Fast forward only',
+    },
+    rebaseAlways: {
+      value: 'REBASE_ALWAYS',
+      label: 'Rebase Always',
+    },
+    rebaseIfNecessary: {
+      value: 'REBASE_IF_NECESSARY',
+      label: 'Rebase if necessary',
+    },
+    mergeAlways: {
+      value: 'MERGE_ALWAYS',
+      label: 'Merge always',
+    },
+    cherryPick: {
+      value: 'CHERRY_PICK',
+      label: 'Cherry pick',
+    },
+  };
+
+  Polymer({
+    is: 'gr-repo',
+
+    properties: {
+      params: Object,
+      repo: String,
+
+      _configChanged: {
+        type: Boolean,
+        value: false,
+      },
+      _loading: {
+        type: Boolean,
+        value: true,
+      },
+      _loggedIn: {
+        type: Boolean,
+        value: false,
+        observer: '_loggedInChanged',
+      },
+      /** @type {?} */
+      _repoConfig: Object,
+      _readOnly: {
+        type: Boolean,
+        value: true,
+      },
+      _states: {
+        type: Array,
+        value() {
+          return Object.values(STATES);
+        },
+      },
+      _submitTypes: {
+        type: Array,
+        value() {
+          return Object.values(SUBMIT_TYPES);
+        },
+      },
+      _schemes: {
+        type: Array,
+        value() { return []; },
+        computed: '_computeSchemes(_schemesObj)',
+        observer: '_schemesChanged',
+      },
+      _selectedCommand: {
+        type: String,
+        value: 'Clone',
+      },
+      _selectedScheme: String,
+      _schemesObj: Object,
+      _noteDbEnabled: {
+        type: Boolean,
+        value: false,
+      },
+    },
+
+    observers: [
+      '_handleConfigChanged(_repoConfig.*)',
+    ],
+
+    attached() {
+      this._loadRepo();
+
+      this.fire('title-change', {title: this.repo});
+    },
+
+    _loadRepo() {
+      if (!this.repo) { return Promise.resolve(); }
+
+      const promises = [];
+
+      const errFn = response => {
+        this.fire('page-error', {response});
+      };
+
+      promises.push(this._getLoggedIn().then(loggedIn => {
+        this._loggedIn = loggedIn;
+        if (loggedIn) {
+          this.$.restAPI.getRepoAccess(this.repo).then(access => {
+            if (!access) { return Promise.resolve(); }
+
+            // If the user is not an owner, is_owner is not a property.
+            this._readOnly = !access[this.repo].is_owner;
+          });
+        }
+      }));
+
+      promises.push(this.$.restAPI.getProjectConfig(this.repo, errFn)
+          .then(config => {
+            if (!config) { return Promise.resolve(); }
+
+            if (config.default_submit_type) {
+              // The gr-select is bound to submit_type, which needs to be the
+              // *configured* submit type. When default_submit_type is
+              // present, the server reports the *effective* submit type in
+              // submit_type, so we need to overwrite it before storing the
+              // config in this.
+              config.submit_type =
+                  config.default_submit_type.configured_value;
+            }
+            if (!config.state) {
+              config.state = STATES.active.value;
+            }
+            this._repoConfig = config;
+            this._loading = false;
+          }));
+
+      promises.push(this.$.restAPI.getConfig().then(config => {
+        if (!config) { return Promise.resolve(); }
+
+        this._schemesObj = config.download.schemes;
+        this._noteDbEnabled = !!config.note_db_enabled;
+      }));
+
+      return Promise.all(promises);
+    },
+
+    _computeLoadingClass(loading) {
+      return loading ? 'loading' : '';
+    },
+
+    _computeDownloadClass(schemes) {
+      return !schemes || !schemes.length ? 'hideDownload' : '';
+    },
+
+    _loggedInChanged(_loggedIn) {
+      if (!_loggedIn) { return; }
+      this.$.restAPI.getPreferences().then(prefs => {
+        if (prefs.download_scheme) {
+          // Note (issue 5180): normalize the download scheme with lower-case.
+          this._selectedScheme = prefs.download_scheme.toLowerCase();
+        }
+      });
+    },
+
+    _formatBooleanSelect(item) {
+      if (!item) { return; }
+      let inheritLabel = 'Inherit';
+      if (!(item.inherited_value === undefined)) {
+        inheritLabel = `Inherit (${item.inherited_value})`;
+      }
+      return [
+        {
+          label: inheritLabel,
+          value: 'INHERIT',
+        },
+        {
+          label: 'True',
+          value: 'TRUE',
+        }, {
+          label: 'False',
+          value: 'FALSE',
+        },
+      ];
+    },
+
+    _formatSubmitTypeSelect(projectConfig) {
+      if (!projectConfig) { return; }
+      const allValues = Object.values(SUBMIT_TYPES);
+      const type = projectConfig.default_submit_type;
+      if (!type) {
+        // Server is too old to report default_submit_type, so assume INHERIT
+        // is not a valid value.
+        return allValues;
+      }
+
+      let inheritLabel = 'Inherit';
+      if (type.inherited_value) {
+        let inherited = type.inherited_value;
+        for (const val of allValues) {
+          if (val.value === type.inherited_value) {
+            inherited = val.label;
+            break;
+          }
+        }
+        inheritLabel = `Inherit (${inherited})`;
+      }
+      return [
+        {
+          label: inheritLabel,
+          value: 'INHERIT',
+        },
+        ...allValues,
+      ];
+    },
+
+    _isLoading() {
+      return this._loading || this._loading === undefined;
+    },
+
+    _getLoggedIn() {
+      return this.$.restAPI.getLoggedIn();
+    },
+
+    _formatRepoConfigForSave(p) {
+      const configInputObj = {};
+      for (const key in p) {
+        if (p.hasOwnProperty(key)) {
+          if (key === 'default_submit_type') {
+            // default_submit_type is not in the input type, and the
+            // configured value was already copied to submit_type by
+            // _loadProject. Omit this property when saving.
+            continue;
+          }
+          if (typeof p[key] === 'object') {
+            configInputObj[key] = p[key].configured_value;
+          } else {
+            configInputObj[key] = p[key];
+          }
+        }
+      }
+      return configInputObj;
+    },
+
+    _handleSaveRepoConfig() {
+      return this.$.restAPI.saveRepoConfig(this.repo,
+          this._formatRepoConfigForSave(this._repoConfig)).then(() => {
+            this._configChanged = false;
+          });
+    },
+
+    _handleConfigChanged() {
+      if (this._isLoading()) { return; }
+      this._configChanged = true;
+    },
+
+    _computeButtonDisabled(readOnly, configChanged) {
+      return readOnly || !configChanged;
+    },
+
+    _computeHeaderClass(configChanged) {
+      return configChanged ? 'edited' : '';
+    },
+
+    _computeSchemes(schemesObj) {
+      return Object.keys(schemesObj);
+    },
+
+    _schemesChanged(schemes) {
+      if (schemes.length === 0) { return; }
+      if (!schemes.includes(this._selectedScheme)) {
+        this._selectedScheme = schemes.sort()[0];
+      }
+    },
+
+    _computeCommands(repo, schemesObj, _selectedScheme) {
+      const commands = [];
+      let commandObj;
+      if (schemesObj.hasOwnProperty(_selectedScheme)) {
+        commandObj = schemesObj[_selectedScheme].clone_commands;
+      }
+      for (const title in commandObj) {
+        if (!commandObj.hasOwnProperty(title)) { continue; }
+        commands.push({
+          title,
+          command: commandObj[title]
+              .replace(/\$\{project\}/gi, encodeURI(repo))
+              .replace(/\$\{project-base-name\}/gi,
+              encodeURI(repo.substring(repo.lastIndexOf('/') + 1))),
+        });
+      }
+      return commands;
+    },
+
+    _computeRepositoriesClass(config) {
+      return config ? 'showConfig': '';
+    },
+
+    _computeChangesUrl(name) {
+      return Gerrit.Nav.getUrlForProjectChanges(name);
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/admin/gr-repo/gr-repo_test.html b/polygerrit-ui/app/elements/admin/gr-repo/gr-repo_test.html
new file mode 100644
index 0000000..d6d4366
--- /dev/null
+++ b/polygerrit-ui/app/elements/admin/gr-repo/gr-repo_test.html
@@ -0,0 +1,383 @@
+<!DOCTYPE html>
+<!--
+@license
+Copyright (C) 2017 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-repo</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-repo.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-repo></gr-repo>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-repo tests', () => {
+    let element;
+    let sandbox;
+    let repoStub;
+    const repoConf = {
+      description: 'Access inherited by all other projects.',
+      use_contributor_agreements: {
+        value: false,
+        configured_value: 'FALSE',
+      },
+      use_content_merge: {
+        value: false,
+        configured_value: 'FALSE',
+      },
+      use_signed_off_by: {
+        value: false,
+        configured_value: 'FALSE',
+      },
+      create_new_change_for_all_not_in_target: {
+        value: false,
+        configured_value: 'FALSE',
+      },
+      require_change_id: {
+        value: false,
+        configured_value: 'FALSE',
+      },
+      enable_signed_push: {
+        value: false,
+        configured_value: 'FALSE',
+      },
+      require_signed_push: {
+        value: false,
+        configured_value: 'FALSE',
+      },
+      reject_implicit_merges: {
+        value: false,
+        configured_value: 'FALSE',
+      },
+      private_by_default: {
+        value: false,
+        configured_value: 'FALSE',
+      },
+      match_author_to_committer_date: {
+        value: false,
+        configured_value: 'FALSE',
+      },
+      reject_empty_commit: {
+        value: false,
+        configured_value: 'FALSE',
+      },
+      enable_reviewer_by_email: {
+        value: false,
+        configured_value: 'FALSE',
+      },
+      max_object_size_limit: {},
+      submit_type: 'MERGE_IF_NECESSARY',
+      default_submit_type: {
+        value: 'MERGE_IF_NECESSARY',
+        configured_value: 'INHERIT',
+        inherited_value: 'MERGE_IF_NECESSARY',
+      },
+    };
+
+    const REPO = 'test-repo';
+    const SCHEMES = {http: {}, repo: {}, ssh: {}};
+
+    function getFormFields() {
+      const selects = Polymer.dom(element.root).querySelectorAll('select');
+      const textareas =
+          Polymer.dom(element.root).querySelectorAll('iron-autogrow-textarea');
+      const inputs = Polymer.dom(element.root).querySelectorAll('input');
+      return inputs.concat(textareas).concat(selects);
+    }
+
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+      stub('gr-rest-api-interface', {
+        getLoggedIn() { return Promise.resolve(false); },
+        getConfig() {
+          return Promise.resolve({download: {}});
+        },
+      });
+      element = fixture('basic');
+      repoStub = sandbox.stub(element.$.restAPI, 'getProjectConfig', () => {
+        return Promise.resolve(repoConf);
+      });
+    });
+
+    teardown(() => {
+      sandbox.restore();
+    });
+
+    test('loading displays before repo config is loaded', () => {
+      assert.isTrue(element.$.loading.classList.contains('loading'));
+      assert.isFalse(getComputedStyle(element.$.loading).display === 'none');
+      assert.isTrue(element.$.loadedContent.classList.contains('loading'));
+      assert.isTrue(getComputedStyle(element.$.loadedContent)
+          .display === 'none');
+    });
+
+    test('download commands visibility', () => {
+      element._loading = false;
+      flushAsynchronousOperations();
+      assert.isTrue(element.$.downloadContent.classList
+          .contains('hideDownload'));
+      assert.isTrue(getComputedStyle(element.$.downloadContent)
+          .display == 'none');
+      element._schemesObj = SCHEMES;
+      flushAsynchronousOperations();
+      assert.isFalse(element.$.downloadContent.classList
+          .contains('hideDownload'));
+      assert.isFalse(getComputedStyle(element.$.downloadContent)
+          .display == 'none');
+    });
+
+    test('form defaults to read only', () => {
+      assert.isTrue(element._readOnly);
+    });
+
+    test('form defaults to read only when not logged in', done => {
+      element.repo = REPO;
+      element._loadRepo().then(() => {
+        assert.isTrue(element._readOnly);
+        done();
+      });
+    });
+
+    test('form defaults to read only when logged in and not admin', done => {
+      element.repo = REPO;
+      sandbox.stub(element, '_getLoggedIn', () => {
+        return Promise.resolve(true);
+      });
+      sandbox.stub(element.$.restAPI, 'getRepoAccess', () => {
+        return Promise.resolve({'test-repo': {}});
+      });
+      element._loadRepo().then(() => {
+        assert.isTrue(element._readOnly);
+        done();
+      });
+    });
+
+    test('all form elements are disabled when not admin', done => {
+      element.repo = REPO;
+      element._loadRepo().then(() => {
+        flushAsynchronousOperations();
+        const formFields = getFormFields();
+        for (const field of formFields) {
+          assert.isTrue(field.hasAttribute('disabled'));
+        }
+        done();
+      });
+    });
+
+    test('_formatBooleanSelect', () => {
+      let item = {inherited_value: true};
+      assert.deepEqual(element._formatBooleanSelect(item), [
+        {
+          label: 'Inherit (true)',
+          value: 'INHERIT',
+        },
+        {
+          label: 'True',
+          value: 'TRUE',
+        }, {
+          label: 'False',
+          value: 'FALSE',
+        },
+      ]);
+
+      item = {inherited_value: false};
+      assert.deepEqual(element._formatBooleanSelect(item), [
+        {
+          label: 'Inherit (false)',
+          value: 'INHERIT',
+        },
+        {
+          label: 'True',
+          value: 'TRUE',
+        }, {
+          label: 'False',
+          value: 'FALSE',
+        },
+      ]);
+
+      // For items without inherited values
+      item = {};
+      assert.deepEqual(element._formatBooleanSelect(item), [
+        {
+          label: 'Inherit',
+          value: 'INHERIT',
+        },
+        {
+          label: 'True',
+          value: 'TRUE',
+        }, {
+          label: 'False',
+          value: 'FALSE',
+        },
+      ]);
+    });
+
+    test('fires page-error', done => {
+      repoStub.restore();
+
+      element.repo = 'test';
+
+      const response = {status: 404};
+      sandbox.stub(
+          element.$.restAPI, 'getProjectConfig', (repo, errFn) => {
+            errFn(response);
+          });
+      element.addEventListener('page-error', e => {
+        assert.deepEqual(e.detail.response, response);
+        done();
+      });
+
+      element._loadRepo();
+    });
+
+    suite('admin', () => {
+      setup(() => {
+        element.repo = REPO;
+        sandbox.stub(element, '_getLoggedIn', () => {
+          return Promise.resolve(true);
+        });
+        sandbox.stub(element.$.restAPI, 'getRepoAccess', () => {
+          return Promise.resolve({'test-repo': {is_owner: true}});
+        });
+      });
+
+      test('all form elements are enabled', done => {
+        element._loadRepo().then(() => {
+          flushAsynchronousOperations();
+          const formFields = getFormFields();
+          for (const field of formFields) {
+            assert.isFalse(field.hasAttribute('disabled'));
+          }
+          assert.isFalse(element._loading);
+          done();
+        });
+      });
+
+      test('state gets set correctly', done => {
+        element._loadRepo().then(() => {
+          assert.equal(element._repoConfig.state, 'ACTIVE');
+          assert.equal(element.$.stateSelect.bindValue, 'ACTIVE');
+          done();
+        });
+      });
+
+      test('inherited submit type value is calculated correctly', () => {
+        return element._loadRepo().then(() => {
+          const sel = element.$.submitTypeSelect;
+          assert.equal(sel.bindValue, 'INHERIT');
+          assert.equal(
+              sel.nativeSelect.options[0].text, 'Inherit (Merge if necessary)');
+        });
+      });
+
+      test('fields update and save correctly', () => {
+        // test notedb
+        element._noteDbEnabled = false;
+
+        assert.equal(
+            element._computeRepositoriesClass(element._noteDbEnabled), '');
+
+        element._noteDbEnabled = true;
+
+        assert.equal(element._computeRepositoriesClass(
+            element._noteDbEnabled), 'showConfig');
+
+        const configInputObj = {
+          description: 'new description',
+          use_contributor_agreements: 'TRUE',
+          use_content_merge: 'TRUE',
+          use_signed_off_by: 'TRUE',
+          create_new_change_for_all_not_in_target: 'TRUE',
+          require_change_id: 'TRUE',
+          enable_signed_push: 'TRUE',
+          require_signed_push: 'TRUE',
+          reject_implicit_merges: 'TRUE',
+          private_by_default: 'TRUE',
+          match_author_to_committer_date: 'TRUE',
+          reject_empty_commit: 'TRUE',
+          max_object_size_limit: 10,
+          submit_type: 'FAST_FORWARD_ONLY',
+          state: 'READ_ONLY',
+          enable_reviewer_by_email: 'TRUE',
+        };
+
+        const saveStub = sandbox.stub(element.$.restAPI, 'saveRepoConfig'
+            , () => {
+              return Promise.resolve({});
+            });
+
+        const button = Polymer.dom(element.root).querySelector('gr-button');
+
+        return element._loadRepo().then(() => {
+          assert.isTrue(button.hasAttribute('disabled'));
+          assert.isFalse(element.$.Title.classList.contains('edited'));
+          element.$.descriptionInput.bindValue = configInputObj.description;
+          element.$.stateSelect.bindValue = configInputObj.state;
+          element.$.submitTypeSelect.bindValue = configInputObj.submit_type;
+          element.$.contentMergeSelect.bindValue =
+              configInputObj.use_content_merge;
+          element.$.newChangeSelect.bindValue =
+              configInputObj.create_new_change_for_all_not_in_target;
+          element.$.requireChangeIdSelect.bindValue =
+              configInputObj.require_change_id;
+          element.$.enableSignedPush.bindValue =
+              configInputObj.enable_signed_push;
+          element.$.requireSignedPush.bindValue =
+              configInputObj.require_signed_push;
+          element.$.rejectImplicitMergesSelect.bindValue =
+              configInputObj.reject_implicit_merges;
+          element.$.setAllnewChangesPrivateByDefaultSelect.bindValue =
+              configInputObj.private_by_default;
+          element.$.matchAuthoredDateWithCommitterDateSelect.bindValue =
+              configInputObj.match_author_to_committer_date;
+          element.$.maxGitObjSizeInput.bindValue =
+              configInputObj.max_object_size_limit;
+          element.$.contributorAgreementSelect.bindValue =
+              configInputObj.use_contributor_agreements;
+          element.$.useSignedOffBySelect.bindValue =
+              configInputObj.use_signed_off_by;
+          element.$.rejectEmptyCommitSelect.bindValue =
+              configInputObj.reject_empty_commit;
+          element.$.unRegisteredCcSelect.bindValue =
+              configInputObj.enable_reviewer_by_email;
+
+          assert.isFalse(button.hasAttribute('disabled'));
+          assert.isTrue(element.$.configurations.classList.contains('edited'));
+
+          const formattedObj =
+              element._formatRepoConfigForSave(element._repoConfig);
+          assert.deepEqual(formattedObj, configInputObj);
+
+          return element._handleSaveRepoConfig().then(() => {
+            assert.isTrue(button.hasAttribute('disabled'));
+            assert.isFalse(element.$.Title.classList.contains('edited'));
+            assert.isTrue(saveStub.lastCall.calledWithExactly(REPO,
+                configInputObj));
+          });
+        });
+      });
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/admin/gr-rule-editor/gr-rule-editor.html b/polygerrit-ui/app/elements/admin/gr-rule-editor/gr-rule-editor.html
index 18612c8..c8ae650 100644
--- a/polygerrit-ui/app/elements/admin/gr-rule-editor/gr-rule-editor.html
+++ b/polygerrit-ui/app/elements/admin/gr-rule-editor/gr-rule-editor.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -18,7 +19,7 @@
 
 <link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
 <link rel="import" href="../../../behaviors/gr-access-behavior/gr-access-behavior.html">
-<link rel="import" href="../../../behaviors/gr-url-encoding-behavior.html">
+<link rel="import" href="../../../behaviors/gr-url-encoding-behavior/gr-url-encoding-behavior.html">
 <link rel="import" href="../../../styles/gr-form-styles.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 <link rel="import" href="../../shared/gr-button/gr-button.html">
@@ -28,14 +29,14 @@
   <template>
     <style include="shared-styles">
       :host {
-        border-bottom: 1px solid #d1d2d3;
+        border-bottom: 1px solid var(--border-color);
         padding: .7em;
         display: block;
       }
-      .buttons {
+      #removeBtn {
         display: none;
       }
-      .editing .buttons {
+      .editing #removeBtn  {
         display: flex;
       }
       #options {
@@ -51,9 +52,10 @@
         flex-wrap: nowrap;
         justify-content: space-between;
       }
-      .buttons gr-button {
-        float: left;
-        margin-left: .3em;
+      #deletedContainer.deleted {
+        align-items: baseline;
+        display: flex;
+        justify-content: space-between;
       }
       #undoBtn,
       #force,
@@ -62,15 +64,18 @@
         display: none;
       }
       #undoBtn.modified,
-      #force.force,
-      #deletedContainer.deleted {
+      #force.force {
         display: block;
       }
       .groupPath {
-        color: #666;
+        color: var(--deemphasized-text-color);
       }
     </style>
-    <style include="gr-form-styles"></style>
+    <style include="gr-form-styles">
+      iron-autogrow-textarea {
+        width: 14em;
+      }
+    </style>
     <div id="mainContainer"
         class$="gr-form-styles [[_computeSectionClass(editing, _deleted)]]">
       <div id="options">
@@ -105,36 +110,50 @@
             </select>
           </gr-select>
         </template>
+        <template is="dom-if" if="[[hasRange]]">
+          <iron-autogrow-textarea
+              id="minInput"
+              class="min"
+              autocomplete="on"
+              placeholder="Min value"
+              bind-value="{{rule.value.min}}"
+              disabled$="[[!editing]]"></iron-autogrow-textarea>
+          <iron-autogrow-textarea
+              id="maxInput"
+              class="max"
+              autocomplete="on"
+              placeholder="Max value"
+              bind-value="{{rule.value.max}}"
+              disabled$="[[!editing]]"></iron-autogrow-textarea>
+        </template>
         <a class="groupPath" href$="[[_computeGroupPath(groupId)]]">
           [[groupName]]
         </a>
         <gr-select
             id="force"
-            class$="[[_computeForceClass(permission)]]"
+            class$="[[_computeForceClass(permission, rule.value.action)]]"
             bind-value="{{rule.value.force}}"
             on-change="_handleValueChange">
           <select disabled$="[[!editing]]">
             <template
                 is="dom-repeat"
-                items="[[_computeForceOptions(permission)]]">
+                items="[[_computeForceOptions(permission, rule.value.action)]]">
               <option value="[[item.value]]">[[item.name]]</option>
             </template>
           </select>
         </gr-select>
       </div>
-      <div class="buttons">
-        <gr-button
-            id="undoBtn"
-            on-tap="_handleUndoChange"
-            class$="[[_computeModifiedClass(_modified)]]">Undo</gr-button>
-        <gr-button id="removeBtn" on-tap="_handleRemoveRule">Remove</gr-button>
-      </div>
+      <gr-button
+          link
+          id="removeBtn"
+          on-tap="_handleRemoveRule">Remove</gr-button>
     </div>
     <div
         id="deletedContainer"
         class$="gr-form-styles [[_computeSectionClass(editing, _deleted)]]">
       [[groupName]] was deleted
-      <gr-button id="undoRemoveBtn" on-tap="_handleUndoRemove">Undo</gr-button>
+      <gr-button link
+          id="undoRemoveBtn" on-tap="_handleUndoRemove">Undo</gr-button>
     </div>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
   </template>
diff --git a/polygerrit-ui/app/elements/admin/gr-rule-editor/gr-rule-editor.js b/polygerrit-ui/app/elements/admin/gr-rule-editor/gr-rule-editor.js
index 7f1a245..06f703f 100644
--- a/polygerrit-ui/app/elements/admin/gr-rule-editor/gr-rule-editor.js
+++ b/polygerrit-ui/app/elements/admin/gr-rule-editor/gr-rule-editor.js
@@ -1,40 +1,56 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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';
 
+  /**
+   * Fired when the rule has been modified or removed.
+   *
+   * @event access-modified
+   */
+
+  /**
+   * Fired when a rule that was previously added was removed.
+   * @event added-rule-removed
+   */
+
   const PRIORITY_OPTIONS = [
     'BATCH',
     'INTERACTIVE',
   ];
 
-  const DROPDOWN_OPTIONS = [
-    'ALLOW',
-    'DENY',
-    'BLOCK',
-  ];
+  const Action = {
+    ALLOW: 'ALLOW',
+    DENY: 'DENY',
+    BLOCK: 'BLOCK',
+  };
 
-  const FORCE_PUSH_OPTIONS = [
-    {
-      name: 'No Force Push',
-      value: false,
-    },
-    {
-      name: 'Force Push',
-      value: true,
-    },
-  ];
+  const DROPDOWN_OPTIONS = [Action.ALLOW, Action.DENY, Action.BLOCK];
+
+  const ForcePushOptions = {
+    ALLOW: [
+      {name: 'Allow pushing (but not force pushing)', value: false},
+      {name: 'Allow pushing with or without force', value: true},
+    ],
+    BLOCK: [
+      {name: 'Block pushing with or without force', value: false},
+      {name: 'Block force pushing', value: true},
+    ],
+  };
 
   const FORCE_EDIT_OPTIONS = [
     {
@@ -51,11 +67,13 @@
     is: 'gr-rule-editor',
 
     properties: {
+      hasRange: Boolean,
       /** @type {?} */
       label: Object,
       editing: {
         type: Boolean,
         value: false,
+        observer: '_handleEditingChanged',
       },
       groupId: String,
       groupName: String,
@@ -66,15 +84,12 @@
         notify: true,
       },
       section: String,
-      _modified: {
-        type: Boolean,
-        value: false,
-      },
-      _originalRuleValues: Object,
+
       _deleted: {
         type: Boolean,
         value: false,
       },
+      _originalRuleValues: Object,
     },
 
     behaviors: [
@@ -87,6 +102,10 @@
       '_handleValueChange(rule.value.*)',
     ],
 
+    listeners: {
+      'access-saved': '_handleAccessSaved',
+    },
+
     ready() {
       // Called on ready rather than the observer because when new rules are
       // added, the observer is triggered prior to being ready.
@@ -101,19 +120,38 @@
       this._setOriginalRuleValues(rule.value);
     },
 
-    _computeForce(permission) {
-      return this.permissionValues.push.id === permission ||
-          this.permissionValues.editTopicName.id === permission;
+    _computeForce(permission, action) {
+      if (this.permissionValues.push.id === permission &&
+          action !== Action.DENY) {
+        return true;
+      }
+
+      return this.permissionValues.editTopicName.id === permission;
     },
 
-    _computeForceClass(permission) {
-      return this._computeForce(permission) ? 'force' : '';
+    _computeForceClass(permission, action) {
+      return this._computeForce(permission, action) ? 'force' : '';
     },
 
     _computeGroupPath(group) {
       return `${this.getBaseUrl()}/admin/groups/${this.encodeURL(group, true)}`;
     },
 
+    _handleAccessSaved() {
+      // Set a new 'original' value to keep track of after the value has been
+      // saved.
+      this._setOriginalRuleValues(this.rule.value);
+    },
+
+    _handleEditingChanged(editing, editingOld) {
+      // Ignore when editing gets set initially.
+      if (!editingOld) { return; }
+      // Restore original values if no longer editing.
+      if (!editing) {
+        this._handleUndoChange();
+      }
+    },
+
     _computeSectionClass(editing, deleted) {
       const classList = [];
       if (editing) {
@@ -125,9 +163,15 @@
       return classList.join(' ');
     },
 
-    _computeForceOptions(permission) {
+    _computeForceOptions(permission, action) {
       if (permission === this.permissionValues.push.id) {
-        return FORCE_PUSH_OPTIONS;
+        if (action === Action.ALLOW) {
+          return ForcePushOptions.ALLOW;
+        } else if (action === Action.BLOCK) {
+          return ForcePushOptions.BLOCK;
+        } else {
+          return [];
+        }
       } else if (permission === this.permissionValues.editTopicName.id) {
         return FORCE_EDIT_OPTIONS;
       }
@@ -135,6 +179,7 @@
     },
 
     _getDefaultRuleValues(permission, label) {
+      const ruleAction = Action.ALLOW;
       const value = {};
       if (permission === 'priority') {
         value.action = PRIORITY_OPTIONS[0];
@@ -142,16 +187,17 @@
       } else if (label) {
         value.min = label.values[0].value;
         value.max = label.values[label.values.length - 1].value;
-      } else if (this._computeForce(permission)) {
-        value.force = this._computeForceOptions(permission)[0].value;
+      } else if (this._computeForce(permission, ruleAction)) {
+        value.force =
+            this._computeForceOptions(permission, ruleAction)[0].value;
       }
       value.action = DROPDOWN_OPTIONS[0];
       return value;
     },
 
     _setDefaultRuleValues() {
-      this.set('rule.value',
-          this._getDefaultRuleValues(this.permission, this.label));
+      this.set('rule.value', this._getDefaultRuleValues(this.permission,
+          this.label));
     },
 
     _computeOptions(permission) {
@@ -162,8 +208,13 @@
     },
 
     _handleRemoveRule() {
+      if (this.rule.value.added) {
+        this.dispatchEvent(new CustomEvent('added-rule-removed',
+            {bubbles: true}));
+      }
       this._deleted = true;
-      this.set('rule.value.deleted', true);
+      this.rule.value.deleted = true;
+      this.dispatchEvent(new CustomEvent('access-modified', {bubbles: true}));
     },
 
     _handleUndoRemove() {
@@ -172,21 +223,24 @@
     },
 
     _handleUndoChange() {
+      // gr-permission will take care of removing rules that were added but
+      // unsaved. We need to keep the added bit for the filter.
+      if (this.rule.value.added) { return; }
       this.set('rule.value', Object.assign({}, this._originalRuleValues));
-      this._modified = false;
+      this._deleted = false;
+      delete this.rule.value.deleted;
+      delete this.rule.value.modified;
     },
 
     _handleValueChange() {
       if (!this._originalRuleValues) { return; }
-      this._modified = true;
+      this.rule.value.modified = true;
+      // Allows overall access page to know a change has been made.
+      this.dispatchEvent(new CustomEvent('access-modified', {bubbles: true}));
     },
 
     _setOriginalRuleValues(value) {
       this._originalRuleValues = Object.assign({}, value);
     },
-
-    _computeModifiedClass(modified) {
-      return modified ? 'modified' : '';
-    },
   });
-})();
\ No newline at end of file
+})();
diff --git a/polygerrit-ui/app/elements/admin/gr-rule-editor/gr-rule-editor_test.html b/polygerrit-ui/app/elements/admin/gr-rule-editor/gr-rule-editor_test.html
index 3594e4b..f85c2b2 100644
--- a/polygerrit-ui/app/elements/admin/gr-rule-editor/gr-rule-editor_test.html
+++ b/polygerrit-ui/app/elements/admin/gr-rule-editor/gr-rule-editor_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -49,16 +50,16 @@
     suite('unit tests', () => {
       test('_computeForce, _computeForceClass, and _computeForceOptions',
           () => {
-            const FORCE_PUSH_OPTIONS = [
-              {
-                name: 'No Force Push',
-                value: false,
-              },
-              {
-                name: 'Force Push',
-                value: true,
-              },
-            ];
+            const ForcePushOptions = {
+              ALLOW: [
+                {name: 'Allow pushing (but not force pushing)', value: false},
+                {name: 'Allow pushing with or without force', value: true},
+              ],
+              BLOCK: [
+                {name: 'Block pushing with or without force', value: false},
+                {name: 'Block force pushing', value: true},
+              ],
+            };
 
             const FORCE_EDIT_OPTIONS = [
               {
@@ -71,10 +72,26 @@
               },
             ];
             let permission = 'push';
-            assert.isTrue(element._computeForce(permission));
-            assert.equal(element._computeForceClass(permission), 'force');
-            assert.deepEqual(element._computeForceOptions(permission),
-                FORCE_PUSH_OPTIONS);
+            let action = 'ALLOW';
+            assert.isTrue(element._computeForce(permission, action));
+            assert.equal(element._computeForceClass(permission, action),
+                'force');
+            assert.deepEqual(element._computeForceOptions(permission, action),
+                ForcePushOptions.ALLOW);
+
+            action = 'BLOCK';
+            assert.isTrue(element._computeForce(permission, action));
+            assert.equal(element._computeForceClass(permission, action),
+                'force');
+            assert.deepEqual(element._computeForceOptions(permission, action),
+                ForcePushOptions.BLOCK);
+
+            action = 'DENY';
+            assert.isFalse(element._computeForce(permission, action));
+            assert.equal(element._computeForceClass(permission, action), '');
+            assert.equal(
+                element._computeForceOptions(permission, action).length, 0);
+
             permission = 'editTopicName';
             assert.isTrue(element._computeForce(permission));
             assert.equal(element._computeForceClass(permission), 'force');
@@ -152,11 +169,24 @@
       });
 
       test('_handleValueChange', () => {
+        const modifiedHandler = sandbox.stub();
+        element.rule = {value: {}};
+        element.addEventListener('access-modified', modifiedHandler);
         element._handleValueChange();
-        assert.isFalse(element._modified);
+        assert.isNotOk(element.rule.value.modified);
         element._originalRuleValues = {};
         element._handleValueChange();
-        assert.isTrue(element._modified);
+        assert.isTrue(element.rule.value.modified);
+        assert.isTrue(modifiedHandler.called);
+      });
+
+      test('_handleAccessSaved', () => {
+        const originalValue = {action: 'DENY'};
+        const newValue = {action: 'ALLOW'};
+        element._originalRuleValues = originalValue;
+        element.rule = {value: newValue};
+        element._handleAccessSaved();
+        assert.deepEqual(element._originalRuleValues, newValue);
       });
 
       test('_setOriginalRuleValues', () => {
@@ -199,22 +229,27 @@
         assert.isFalse(element.$.force.classList.contains('force'));
       });
 
-      test('modify and undo value', () => {
-        assert.isFalse(element._modified);
-        assert.isFalse(element.$.undoBtn.classList.contains('modified'));
+      test('modify and cancel restores original values', () => {
+        element.editing = true;
+        assert.notEqual(getComputedStyle(element.$.removeBtn).display, 'none');
+        assert.isNotOk(element.rule.value.modified);
+        element.$.action.bindValue = 'DENY';
+        assert.isTrue(element.rule.value.modified);
+        element.editing = false;
+        assert.equal(getComputedStyle(element.$.removeBtn).display, 'none');
+        assert.deepEqual(element._originalRuleValues, element.rule.value);
+        assert.equal(element.$.action.bindValue, 'ALLOW');
+        assert.isNotOk(element.rule.value.modified);
+      });
+
+      test('modify value', () => {
+        assert.isNotOk(element.rule.value.modified);
         element.$.action.bindValue = 'DENY';
         flushAsynchronousOperations();
-        assert.isTrue(element._modified);
-        assert.isTrue(element.$.undoBtn.classList.contains('modified'));
+        assert.isTrue(element.rule.value.modified);
 
         // The original value should now differ from the rule values.
         assert.notDeepEqual(element._originalRuleValues, element.rule.value);
-
-        // After undoing the change, the original value should get reset.
-        MockInteractions.tap(element.$.undoBtn);
-        assert.deepEqual(element._originalRuleValues, element.rule.value);
-        assert.equal(element.$.action.bindValue, 'ALLOW');
-        assert.isFalse(element._modified);
       });
 
       test('all selects are disabled when not in edit mode', () => {
@@ -235,12 +270,39 @@
             element.$.deletedContainer.classList.contains('deleted'));
         MockInteractions.tap(element.$.removeBtn);
         assert.isTrue(element.$.deletedContainer.classList.contains('deleted'));
+        assert.isTrue(element._deleted);
         assert.isTrue(element.rule.value.deleted);
 
         MockInteractions.tap(element.$.undoRemoveBtn);
+        assert.isFalse(element._deleted);
         assert.isNotOk(element.rule.value.deleted);
       });
 
+      test('remove rule and cancel', () => {
+        element.editing = true;
+        assert.notEqual(getComputedStyle(element.$.removeBtn).display, 'none');
+        assert.equal(getComputedStyle(element.$.deletedContainer).display,
+            'none');
+
+        element.rule = {id: 123, value: {action: 'ALLOW'}};
+        MockInteractions.tap(element.$.removeBtn);
+        assert.notEqual(getComputedStyle(element.$.removeBtn).display, 'none');
+        assert.notEqual(getComputedStyle(element.$.deletedContainer).display,
+            'none');
+        assert.isTrue(element._deleted);
+        assert.isTrue(element.rule.value.deleted);
+
+        element.editing = false;
+        assert.isFalse(element._deleted);
+        assert.isNotOk(element.rule.value.deleted);
+        assert.isNotOk(element.rule.value.modified);
+
+        assert.deepEqual(element._originalRuleValues, element.rule.value);
+        assert.equal(getComputedStyle(element.$.removeBtn).display, 'none');
+        assert.equal(getComputedStyle(element.$.deletedContainer).display,
+            'none');
+      });
+
       test('_computeGroupPath', () => {
         const group = '123';
         assert.equal(element._computeGroupPath(group),
@@ -258,38 +320,42 @@
         element.section = 'refs/*';
         element._setupValues(element.rule);
         flushAsynchronousOperations();
+        element.rule.value.added = true;
       });
 
       test('_ruleValues and _originalRuleValues are set correctly', () => {
         // Since the element does not already have default values, they should
         // be set. The original values should be set to those too.
-        assert.isFalse(element._modified);
+        assert.isNotOk(element.rule.value.modified);
         const expectedRuleValue = {
           action: 'ALLOW',
           force: false,
+          added: true,
         };
         assert.deepEqual(element.rule.value, expectedRuleValue);
-        assert.deepEqual(element._originalRuleValues, expectedRuleValue);
         test('values are set correctly', () => {
           assert.equal(element.$.action.bindValue, expectedRuleValue.action);
           assert.equal(element.$.force.bindValue, expectedRuleValue.action);
         });
       });
 
-      test('modify and undo value', () => {
-        assert.isFalse(element._modified);
-        assert.isFalse(element.$.undoBtn.classList.contains('modified'));
+      test('modify value', () => {
+        assert.isNotOk(element.rule.value.modified);
         element.$.force.bindValue = true;
         flushAsynchronousOperations();
-        assert.isTrue(element._modified);
-        assert.isTrue(element.$.undoBtn.classList.contains('modified'));
+        assert.isTrue(element.rule.value.modified);
 
         // The original value should now differ from the rule values.
         assert.notDeepEqual(element._originalRuleValues, element.rule.value);
+      });
 
-        // After undoing the change, the original value should get reset.
-        MockInteractions.tap(element.$.undoBtn);
-        assert.deepEqual(element._originalRuleValues, element.rule.value);
+      test('remove value', () => {
+        element.editing = true;
+        const removeStub = sandbox.stub();
+        element.addEventListener('added-rule-removed', removeStub);
+        MockInteractions.tap(element.$.removeBtn);
+        flushAsynchronousOperations();
+        assert.isTrue(removeStub.called);
       });
     });
 
@@ -333,20 +399,17 @@
         assert.isFalse(element.$.force.classList.contains('force'));
       });
 
-      test('modify and undo value', () => {
-        assert.isFalse(element._modified);
-        assert.isFalse(element.$.undoBtn.classList.contains('modified'));
+      test('modify value', () => {
+        const removeStub = sandbox.stub();
+        element.addEventListener('added-rule-removed', removeStub);
+        assert.isNotOk(element.rule.value.modified);
         Polymer.dom(element.root).querySelector('#labelMin').bindValue = 1;
         flushAsynchronousOperations();
-        assert.isTrue(element._modified);
-        assert.isTrue(element.$.undoBtn.classList.contains('modified'));
+        assert.isTrue(element.rule.value.modified);
+        assert.isFalse(removeStub.called);
 
         // The original value should now differ from the rule values.
         assert.notDeepEqual(element._originalRuleValues, element.rule.value);
-
-        // After undoing the change, the original value should get reset.
-        MockInteractions.tap(element.$.undoBtn);
-        assert.deepEqual(element._originalRuleValues, element.rule.value);
       });
     });
 
@@ -368,21 +431,22 @@
         element.section = 'refs/*';
         element._setupValues(element.rule);
         flushAsynchronousOperations();
+        element.rule.value.added = true;
       });
 
       test('_ruleValues and _originalRuleValues are set correctly', () => {
         // Since the element does not already have default values, they should
         // be set. The original values should be set to those too.
-        assert.isFalse(element._modified);
+        assert.isNotOk(element.rule.value.modified);
         assert.isTrue(element._setDefaultRuleValues.called);
 
         const expectedRuleValue = {
           max: element.label.values[element.label.values.length - 1].value,
           min: element.label.values[0].value,
           action: 'ALLOW',
+          added: true,
         };
         assert.deepEqual(element.rule.value, expectedRuleValue);
-        assert.deepEqual(element._originalRuleValues, expectedRuleValue);
         test('values are set correctly', () => {
           assert.equal(
               element.$.action.bindValue,
@@ -396,20 +460,14 @@
         });
       });
 
-      test('modify and undo value', () => {
-        assert.isFalse(element._modified);
-        assert.isFalse(element.$.undoBtn.classList.contains('modified'));
+      test('modify value', () => {
+        assert.isNotOk(element.rule.value.modified);
         Polymer.dom(element.root).querySelector('#labelMin').bindValue = 1;
         flushAsynchronousOperations();
-        assert.isTrue(element._modified);
-        assert.isTrue(element.$.undoBtn.classList.contains('modified'));
+        assert.isTrue(element.rule.value.modified);
 
         // The original value should now differ from the rule values.
         assert.notDeepEqual(element._originalRuleValues, element.rule.value);
-
-        // After undoing the change, the original value should get reset.
-        MockInteractions.tap(element.$.undoBtn);
-        assert.deepEqual(element._originalRuleValues, element.rule.value);
       });
     });
 
@@ -443,20 +501,14 @@
         assert.isNotOk(Polymer.dom(element.root).querySelector('#labelMax'));
       });
 
-      test('modify and undo value', () => {
-        assert.isFalse(element._modified);
-        assert.isFalse(element.$.undoBtn.classList.contains('modified'));
+      test('modify value', () => {
+        assert.isNotOk(element.rule.value.modified);
         element.$.action.bindValue = false;
         flushAsynchronousOperations();
-        assert.isTrue(element._modified);
-        assert.isTrue(element.$.undoBtn.classList.contains('modified'));
+        assert.isTrue(element.rule.value.modified);
 
         // The original value should now differ from the rule values.
         assert.notDeepEqual(element._originalRuleValues, element.rule.value);
-
-        // After undoing the change, the original value should get reset.
-        MockInteractions.tap(element.$.undoBtn);
-        assert.deepEqual(element._originalRuleValues, element.rule.value);
       });
     });
 
@@ -470,38 +522,33 @@
         element.section = 'refs/*';
         element._setupValues(element.rule);
         flushAsynchronousOperations();
+        element.rule.value.added = true;
       });
 
       test('_ruleValues and _originalRuleValues are set correctly', () => {
         // Since the element does not already have default values, they should
         // be set. The original values should be set to those too.
-        assert.isFalse(element._modified);
+        assert.isNotOk(element.rule.value.modified);
         const expectedRuleValue = {
           action: 'ALLOW',
           force: false,
+          added: true,
         };
         assert.deepEqual(element.rule.value, expectedRuleValue);
-        assert.deepEqual(element._originalRuleValues, expectedRuleValue);
         test('values are set correctly', () => {
           assert.equal(element.$.action.bindValue, expectedRuleValue.action);
           assert.equal(element.$.force.bindValue, expectedRuleValue.action);
         });
       });
 
-      test('modify and undo value', () => {
-        assert.isFalse(element._modified);
-        assert.isFalse(element.$.undoBtn.classList.contains('modified'));
+      test('modify value', () => {
+        assert.isNotOk(element.rule.value.modified);
         element.$.force.bindValue = true;
         flushAsynchronousOperations();
-        assert.isTrue(element._modified);
-        assert.isTrue(element.$.undoBtn.classList.contains('modified'));
+        assert.isTrue(element.rule.value.modified);
 
         // The original value should now differ from the rule values.
         assert.notDeepEqual(element._originalRuleValues, element.rule.value);
-
-        // After undoing the change, the original value should get reset.
-        MockInteractions.tap(element.$.undoBtn);
-        assert.deepEqual(element._originalRuleValues, element.rule.value);
       });
     });
 
@@ -535,65 +582,14 @@
         assert.isNotOk(Polymer.dom(element.root).querySelector('#labelMax'));
       });
 
-      test('modify and undo value', () => {
-        assert.isFalse(element._modified);
-        assert.isFalse(element.$.undoBtn.classList.contains('modified'));
+      test('modify value', () => {
+        assert.isNotOk(element.rule.value.modified);
         element.$.action.bindValue = false;
         flushAsynchronousOperations();
-        assert.isTrue(element._modified);
-        assert.isTrue(element.$.undoBtn.classList.contains('modified'));
+        assert.isTrue(element.rule.value.modified);
 
         // The original value should now differ from the rule values.
         assert.notDeepEqual(element._originalRuleValues, element.rule.value);
-
-        // After undoing the change, the original value should get reset.
-        MockInteractions.tap(element.$.undoBtn);
-        assert.deepEqual(element._originalRuleValues, element.rule.value);
-      });
-    });
-
-    suite('new edit rule', () => {
-      setup(() => {
-        element.group = 'Group Name';
-        element.permission = 'editTopicName';
-        element.rule = {
-          id: '123',
-        };
-        element.section = 'refs/*';
-        element._setupValues(element.rule);
-        flushAsynchronousOperations();
-      });
-
-      test('_ruleValues and _originalRuleValues are set correctly', () => {
-        // Since the element does not already have default values, they should
-        // be set. The original values should be set to those too.
-        assert.isFalse(element._modified);
-        const expectedRuleValue = {
-          action: 'ALLOW',
-          force: false,
-        };
-        assert.deepEqual(element.rule.value, expectedRuleValue);
-        assert.deepEqual(element._originalRuleValues, expectedRuleValue);
-        test('values are set correctly', () => {
-          assert.equal(element.$.action.bindValue, expectedRuleValue.action);
-          assert.equal(element.$.force.bindValue, expectedRuleValue.action);
-        });
-      });
-
-      test('modify and undo value', () => {
-        assert.isFalse(element._modified);
-        assert.isFalse(element.$.undoBtn.classList.contains('modified'));
-        element.$.force.bindValue = true;
-        flushAsynchronousOperations();
-        assert.isTrue(element._modified);
-        assert.isTrue(element.$.undoBtn.classList.contains('modified'));
-
-        // The original value should now differ from the rule values.
-        assert.notDeepEqual(element._originalRuleValues, element.rule.value);
-
-        // After undoing the change, the original value should get reset.
-        MockInteractions.tap(element.$.undoBtn);
-        assert.deepEqual(element._originalRuleValues, element.rule.value);
       });
     });
   });
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.html b/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.html
index 0fab4af..8c152b6 100644
--- a/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.html
+++ b/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,15 +17,17 @@
 <link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
 <link rel="import" href="../../../behaviors/gr-change-table-behavior/gr-change-table-behavior.html">
 <link rel="import" href="../../../behaviors/gr-path-list-behavior/gr-path-list-behavior.html">
-<link rel="import" href="../../../behaviors/gr-url-encoding-behavior.html">
+<link rel="import" href="../../../behaviors/gr-url-encoding-behavior/gr-url-encoding-behavior.html">
 <link rel="import" href="../../../behaviors/rest-client-behavior/rest-client-behavior.html">
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
 <link rel="import" href="../../../styles/gr-change-list-styles.html">
 <link rel="import" href="../../core/gr-navigation/gr-navigation.html">
 <link rel="import" href="../../shared/gr-account-link/gr-account-link.html">
 <link rel="import" href="../../shared/gr-change-star/gr-change-star.html">
+<link rel="import" href="../../shared/gr-change-status/gr-change-status.html">
 <link rel="import" href="../../shared/gr-date-formatter/gr-date-formatter.html">
 <link rel="import" href="../../shared/gr-limited-text/gr-limited-text.html">
+<link rel="import" href="../../shared/gr-tooltip-content/gr-tooltip-content.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 
 <dom-module id="gr-change-list-item">
@@ -32,25 +35,18 @@
     <style include="shared-styles">
       :host {
         display: table-row;
-        border-bottom: 1px solid #eee;
+      }
+      :host(:focus) {
+        outline: none;
       }
       :host(:hover) {
-        background-color: #f5fafd;
-      }
-      :host([selected]) {
-        background-color: #ebf5fb;
+        background-color: var(--hover-background-color);
       }
       :host([needs-review]) {
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
       }
-      :host([assigned]) {
-        background-color: #fcfad6;
-      }
-      :host([selected][assigned]) {
-        background-color: #fcfaa6;
-      }
-      .cell {
-        padding: .3em .5em;
+      :host([highlight]) {
+        background-color: var(--assignee-highlight-color);
       }
       .container {
         position: relative;
@@ -73,8 +69,24 @@
         height: 0;
         overflow: hidden;
       }
+      .status {
+        align-items: center;
+        display: inline-flex;
+      }
+      .status .comma {
+        padding-right: .2rem;
+      }
+      /* Used to hide the leading separator comma for statuses. */
+      .status .comma:first-of-type {
+        display: none;
+      }
+      .size gr-tooltip-content {
+        margin: -.4rem -.6rem;
+        max-width: 2.5rem;
+        padding: .4rem .6rem;
+      }
       a {
-        color: var(--default-text-color);
+        color: var(--primary-text-color);
         cursor: pointer;
         display: inline-block;
         text-decoration: none;
@@ -82,23 +94,28 @@
       a:hover {
         text-decoration: underline;
       }
-      .positionIndicator {
-        visibility: hidden;
-      }
-      :host([selected]) .positionIndicator {
-        visibility: visible;
-      }
       .u-monospace {
         font-family: var(--monospace-font-family);
       }
       .u-green {
-        color: #388E3C;
+        color: var(--vote-text-color-recommended);
       }
       .u-red {
-        color: #D32F2F;
+        color: var(--vote-text-color-disliked);
+      }
+      .label.u-green:not(.u-monospace),
+      .label.u-red:not(.u-monospace) {
+        font-size: 1.2rem;
       }
       .u-gray-background {
-        background-color: #F5F5F5;
+        background-color: var(--table-header-background-color);
+      }
+      .comma,
+      .placeholder {
+        color: var(--deemphasized-text-color);
+      }
+      .cell.label {
+        font-weight: normal;
       }
       @media only screen and (max-width: 50em) {
         :host {
@@ -107,14 +124,12 @@
       }
     </style>
     <style include="gr-change-list-styles"></style>
-    <td class="cell keyboard">
-      <span class="positionIndicator">&#x25b6;</span>
-    </td>
+    <td class="cell leftPadding"></td>
     <td class="cell star" hidden$="[[!showStar]]" hidden>
       <gr-change-star change="{{change}}"></gr-change-star>
     </td>
     <td class="cell number" hidden$="[[!showNumber]]" hidden>
-      <a href$="[[changeURL]]"> [[change._number]]</a>
+      <a href$="[[changeURL]]">[[change._number]]</a>
     </td>
     <td class="cell subject"
         hidden$="[[isColumnHidden('Subject', visibleChangeTableColumns)]]">
@@ -132,30 +147,47 @@
     </td>
     <td class="cell status"
         hidden$="[[isColumnHidden('Status', visibleChangeTableColumns)]]">
-      [[changeStatusString(change)]]
+      <template is="dom-repeat" items="[[statuses]]" as="status">
+        <div class="comma">,</div>
+        <gr-change-status flat status="[[status]]"></gr-change-status>
+      </template>
+      <template is="dom-if" if="[[!statuses.length]]">
+        <span class="placeholder">--</span>
+      </template>
     </td>
     <td class="cell owner"
         hidden$="[[isColumnHidden('Owner', visibleChangeTableColumns)]]">
-      <gr-account-link account="[[change.owner]]"></gr-account-link>
+      <gr-account-link
+          account="[[change.owner]]"
+          additional-text="[[_computeAccountStatusString(change.owner)]]"></gr-account-link>
     </td>
     <td class="cell assignee"
         hidden$="[[isColumnHidden('Assignee', visibleChangeTableColumns)]]">
       <template is="dom-if" if="[[change.assignee]]">
-        <gr-account-link account="[[change.assignee]]"></gr-account-link>
+        <gr-account-link
+            id="assigneeAccountLink"
+            account="[[change.assignee]]"
+            additional-text="[[_computeAccountStatusString(change.assignee)]]"></gr-account-link>
+      </template>
+      <template is="dom-if" if="[[!change.assignee]]">
+        <span class="placeholder">--</span>
       </template>
     </td>
-    <td class="cell project"
-        hidden$="[[isColumnHidden('Project', visibleChangeTableColumns)]]">
-      <a class="fullProject" href$="[[_computeProjectURL(change.project)]]">
-        [[change.project]]
+    <td class="cell repo"
+        hidden$="[[isColumnHidden('Repo', visibleChangeTableColumns)]]">
+      <a class="fullRepo" href$="[[_computeRepoUrl(change)]]">
+        [[_computeRepoDisplay(change)]]
       </a>
-      <a class="truncatedProject" href$="[[_computeProjectURL(change.project)]]">
-        [[_computeTruncatedProject(change.project)]]
+      <a
+          class="truncatedRepo"
+          href$="[[_computeRepoUrl(change)]]"
+          title$="[[_computeRepoDisplay(change)]]">
+        [[_computeRepoDisplay(change, 'true')]]
       </a>
     </td>
     <td class="cell branch"
         hidden$="[[isColumnHidden('Branch', visibleChangeTableColumns)]]">
-      <a href$="[[_computeProjectBranchURL(change)]]">
+      <a href$="[[_computeRepoBranchURL(change)]]">
         [[change.branch]]
       </a>
       <template is="dom-if" if="[[change.topic]]">
@@ -171,10 +203,18 @@
           has-tooltip
           date-str="[[change.updated]]"></gr-date-formatter>
     </td>
-    <td class="cell size u-monospace"
+    <td class="cell size"
         hidden$="[[isColumnHidden('Size', visibleChangeTableColumns)]]">
-      <span class="u-green"><span>+</span>[[change.insertions]]</span>,
-      <span class="u-red"><span>-</span>[[change.deletions]]</span>
+      <gr-tooltip-content
+          has-tooltip
+          title="[[_computeSizeTooltip(change)]]">
+        <template is="dom-if" if="[[_changeSize]]">
+            <span>[[_changeSize]]</span>
+        </template>
+        <template is="dom-if" if="[[!_changeSize]]">
+            <span class="placeholder">--</span>
+        </template>
+      </gr-tooltip-content>
     </td>
     <template is="dom-repeat" items="[[labelNames]]" as="labelName">
       <td title$="[[_computeLabelTitle(change, labelName)]]"
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.js b/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.js
index d8fced2..65fe9ea 100644
--- a/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.js
+++ b/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.js
@@ -1,19 +1,29 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
+  const CHANGE_SIZE = {
+    XS: 10,
+    SMALL: 50,
+    MEDIUM: 250,
+    LARGE: 1000,
+  };
+
   Polymer({
     is: 'gr-change-list-item',
 
@@ -29,11 +39,24 @@
         type: String,
         computed: '_computeChangeURL(change)',
       },
+      needsReview: {
+        type: Boolean,
+        reflectToAttribute: true,
+        computed: '_computeItemNeedsReview(change.reviewed)',
+      },
+      statuses: {
+        type: Array,
+        computed: 'changeStatuses(change)',
+      },
       showStar: {
         type: Boolean,
         value: false,
       },
       showNumber: Boolean,
+      _changeSize: {
+        type: String,
+        computed: '_computeChangeSize(change)',
+      },
     },
 
     behaviors: [
@@ -44,6 +67,10 @@
       Gerrit.URLEncodingBehavior,
     ],
 
+    _computeItemNeedsReview(reviewed) {
+      return !reviewed;
+    },
+
     _computeChangeURL(change) {
       return Gerrit.Nav.getUrlForChange(change);
     },
@@ -104,22 +131,80 @@
       return '';
     },
 
-    _computeProjectURL(project) {
-      return Gerrit.Nav.getUrlForProject(project, true);
+    _computeRepoUrl(change) {
+      return Gerrit.Nav.getUrlForProjectChanges(change.project, true,
+          change.internalHost);
     },
 
-    _computeProjectBranchURL(change) {
-      return Gerrit.Nav.getUrlForBranch(change.branch, change.project);
+    _computeRepoBranchURL(change) {
+      return Gerrit.Nav.getUrlForBranch(change.branch, change.project, null,
+          change.internalHost);
     },
 
     _computeTopicURL(change) {
       if (!change.topic) { return ''; }
-      return Gerrit.Nav.getUrlForTopic(change.topic);
+      return Gerrit.Nav.getUrlForTopic(change.topic, change.internalHost);
     },
 
-    _computeTruncatedProject(project) {
-      if (!project) { return ''; }
-      return this.truncatePath(project, 2);
+    /**
+     * Computes the display string for the project column. If there is a host
+     * specified in the change detail, the string will be prefixed with it.
+     *
+     * @param {!Object} change
+     * @param {string=} truncate whether or not the project name should be
+     *     truncated. If this value is truthy, the name will be truncated.
+     * @return {string}
+     */
+    _computeRepoDisplay(change, truncate) {
+      if (!change || !change.project) { return ''; }
+      let str = '';
+      if (change.internalHost) { str += change.internalHost + '/'; }
+      str += truncate ? this.truncatePath(change.project, 2) : change.project;
+      return str;
+    },
+
+    _computeAccountStatusString(account) {
+      return account && account.status ? `(${account.status})` : '';
+    },
+
+    _computeSizeTooltip(change) {
+      if (change.insertions + change.deletions === 0 ||
+          isNaN(change.insertions + change.deletions)) {
+        return 'Size unknown';
+      } else {
+        return `+${change.insertions}, -${change.deletions}`;
+      }
+    },
+
+    /**
+     * TShirt sizing is based on the following paper:
+     * http://dirkriehle.com/wp-content/uploads/2008/09/hicss-42-csdistr-final-web.pdf
+     */
+    _computeChangeSize(change) {
+      const delta = change.insertions + change.deletions;
+      if (isNaN(delta) || delta === 0) {
+        return null; // Unknown
+      }
+      if (delta < CHANGE_SIZE.XS) {
+        return 'XS';
+      } else if (delta < CHANGE_SIZE.SMALL) {
+        return 'S';
+      } else if (delta < CHANGE_SIZE.MEDIUM) {
+        return 'M';
+      } else if (delta < CHANGE_SIZE.LARGE) {
+        return 'L';
+      } else {
+        return 'XL';
+      }
+    },
+
+    toggleReviewed() {
+      const newVal = !this.change.reviewed;
+      this.set('change.reviewed', newVal);
+      this.dispatchEvent(new CustomEvent('toggle-reviewed', {
+        bubbles: true,
+        detail: {change: this.change, reviewed: newVal},
+      }));
     },
   });
 })();
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item_test.html b/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item_test.html
index 243a8ab..3637653 100644
--- a/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item_test.html
+++ b/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -36,8 +37,10 @@
 <script>
   suite('gr-change-list-item tests', () => {
     let element;
+    let sandbox;
 
     setup(() => {
+      sandbox = sinon.sandbox.create();
       stub('gr-rest-api-interface', {
         getConfig() { return Promise.resolve({}); },
         getLoggedIn() { return Promise.resolve(false); },
@@ -45,6 +48,8 @@
       element = fixture('basic');
     });
 
+    teardown(() => { sandbox.restore(); });
+
     test('computed fields', () => {
       assert.equal(element._computeLabelClass({labels: {}}),
           'cell label u-gray-background');
@@ -120,7 +125,7 @@
         'Status',
         'Owner',
         'Assignee',
-        'Project',
+        'Repo',
         'Branch',
         'Updated',
         'Size',
@@ -130,31 +135,13 @@
 
       for (const column of element.columnNames) {
         const elementClass = '.' + column.toLowerCase();
+        assert.isOk(element.$$(elementClass),
+            `Expect ${elementClass} element to be found`);
         assert.isFalse(element.$$(elementClass).hidden);
       }
     });
 
-    test('no hidden columns', () => {
-      element.visibleChangeTableColumns = [
-        'Subject',
-        'Status',
-        'Owner',
-        'Assignee',
-        'Project',
-        'Branch',
-        'Updated',
-        'Size',
-      ];
-
-      flushAsynchronousOperations();
-
-      for (const column of element.columnNames) {
-        const elementClass = '.' + column.toLowerCase();
-        assert.isFalse(element.$$(elementClass).hidden);
-      }
-    });
-
-    test('project column hidden', () => {
+    test('repo column hidden', () => {
       element.visibleChangeTableColumns = [
         'Subject',
         'Status',
@@ -169,7 +156,7 @@
 
       for (const column of element.columnNames) {
         const elementClass = '.' + column.toLowerCase();
-        if (column === 'Project') {
+        if (column === 'Repo') {
           assert.isTrue(element.$$(elementClass).hidden);
         } else {
           assert.isFalse(element.$$(elementClass).hidden);
@@ -188,14 +175,102 @@
     });
 
     test('assignee only displayed if there is one', () => {
+      element.change = {};
+      flushAsynchronousOperations();
       assert.isNotOk(element.$$('.assignee gr-account-link'));
+      assert.equal(element.$$('.assignee').textContent.trim(), '--');
       element.change = {
         assignee: {
           name: 'test',
+          status: 'test',
         },
       };
       flushAsynchronousOperations();
       assert.isOk(element.$$('.assignee gr-account-link'));
+      assert.equal(Polymer.dom(element.root)
+          .querySelector('#assigneeAccountLink').additionalText, '(test)');
+    });
+
+    test('_computeAccountStatusString', () => {
+      assert.equal(element._computeAccountStatusString({}), '');
+      assert.equal(element._computeAccountStatusString({status: 'Working'}),
+          '(Working)');
+    });
+
+    test('TShirt sizing tooltip', () => {
+      assert.equal(element._computeSizeTooltip({
+        insertions: 'foo',
+        deletions: 'bar',
+      }), 'Size unknown');
+      assert.equal(element._computeSizeTooltip({
+        insertions: 0,
+        deletions: 0,
+      }), 'Size unknown');
+      assert.equal(element._computeSizeTooltip({
+        insertions: 1,
+        deletions: 2,
+      }), '+1, -2');
+    });
+
+    test('TShirt sizing', () => {
+      assert.equal(element._computeChangeSize({
+        insertions: 'foo',
+        deletions: 'bar',
+      }), null);
+      assert.equal(element._computeChangeSize({
+        insertions: 1,
+        deletions: 1,
+      }), 'XS');
+      assert.equal(element._computeChangeSize({
+        insertions: 9,
+        deletions: 1,
+      }), 'S');
+      assert.equal(element._computeChangeSize({
+        insertions: 10,
+        deletions: 200,
+      }), 'M');
+      assert.equal(element._computeChangeSize({
+        insertions: 99,
+        deletions: 900,
+      }), 'L');
+      assert.equal(element._computeChangeSize({
+        insertions: 99,
+        deletions: 999,
+      }), 'XL');
+    });
+
+    test('change params passed to gr-navigation', () => {
+      sandbox.stub(Gerrit.Nav);
+      const change = {
+        internalHost: 'test-host',
+        project: 'test-repo',
+        topic: 'test-topic',
+        branch: 'test-branch',
+      };
+      element.change = change;
+      flushAsynchronousOperations();
+
+      assert.deepEqual(Gerrit.Nav.getUrlForChange.lastCall.args, [change]);
+      assert.deepEqual(Gerrit.Nav.getUrlForProjectChanges.lastCall.args,
+          [change.project, true, change.internalHost]);
+      assert.deepEqual(Gerrit.Nav.getUrlForBranch.lastCall.args,
+          [change.branch, change.project, null, change.internalHost]);
+      assert.deepEqual(Gerrit.Nav.getUrlForTopic.lastCall.args,
+          [change.topic, change.internalHost]);
+    });
+
+    test('_computeRepoDisplay', () => {
+      const change = {
+        project: 'a/test/repo',
+        internalHost: 'host',
+      };
+      assert.equal(element._computeRepoDisplay(change), 'host/a/test/repo');
+      assert.equal(element._computeRepoDisplay(change, true),
+          'host/…/test/repo');
+      delete change.internalHost;
+      assert.equal(element._computeRepoDisplay(change), 'a/test/repo');
+      assert.equal(element._computeRepoDisplay(change, true),
+          '…/test/repo');
     });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view.html b/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view.html
index 276febb..48d5075 100644
--- a/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view.html
+++ b/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -15,11 +16,13 @@
 -->
 
 <link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
-<link rel="import" href="../../../behaviors/gr-url-encoding-behavior.html">
+<link rel="import" href="../../../behaviors/gr-url-encoding-behavior/gr-url-encoding-behavior.html">
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
 <link rel="import" href="../../core/gr-navigation/gr-navigation.html">
+<link rel="import" href="../../shared/gr-icons/gr-icons.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
 <link rel="import" href="../gr-change-list/gr-change-list.html">
+<link rel="import" href="../gr-repo-header/gr-repo-header.html">
 <link rel="import" href="../gr-user-header/gr-user-header.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 
@@ -31,21 +34,32 @@
         display: block;
       }
       .loading {
-        color: #666;
+        color: var(--deemphasized-text-color);
         padding: 1em var(--default-horizontal-margin);
       }
       gr-change-list {
         width: 100%;
       }
+      gr-user-header,
+      gr-repo-header {
+        border-bottom: 1px solid var(--border-color);
+      }
       nav {
-        padding: .5em 0;
-        text-align: center;
+        align-items: center;
+        background-color: var(--view-background-color);;
+        display: flex;
+        height: 3rem;
+        justify-content: flex-end;
+        margin-right: 20px;
       }
-      nav a {
-        display: inline-block;
+      nav,
+      iron-icon {
+        color: var(--deemphasized-text-color);
       }
-      nav a:first-of-type {
-        margin-right: .5em;
+      iron-icon {
+        height: 1.85rem;
+        margin-left: 16px;
+        width: 1.85rem;
       }
       .hide {
         display: none;
@@ -59,23 +73,34 @@
     </style>
     <div class="loading" hidden$="[[!_loading]]" hidden>Loading...</div>
     <div hidden$="[[_loading]]" hidden>
+      <gr-repo-header
+          repo="[[_repo]]"
+          class$="[[_computeHeaderClass(_repo)]]"></gr-repo-header>
       <gr-user-header
           user-id="[[_userId]]"
           show-dashboard-link
-          logged-in="[[loggedIn]]"
-          class$="[[_computeUserHeaderClass(_userId)]]"></gr-user-header>
+          logged-in="[[_loggedIn]]"
+          class$="[[_computeHeaderClass(_userId)]]"></gr-user-header>
       <gr-change-list
+          account="[[account]]"
           changes="{{_changes}}"
+          preferences="[[preferences]]"
           selected-index="{{viewState.selectedChangeIndex}}"
-          show-star="[[loggedIn]]"></gr-change-list>
-      <nav>
-        <a id="prevArrow"
-            href$="[[_computeNavLink(_query, _offset, -1, _changesPerPage)]]"
-            hidden$="[[_hidePrevArrow(_offset)]]" hidden>&larr; Prev</a>
-        <a id="nextArrow"
-            href$="[[_computeNavLink(_query, _offset, 1, _changesPerPage)]]"
-            hidden$="[[_hideNextArrow(_loading)]]" hidden>
-          Next &rarr;</a>
+          show-star="[[_loggedIn]]"
+          on-toggle-star="_handleToggleStar"
+          on-toggle-reviewed="_handleToggleReviewed"></gr-change-list>
+      <nav class$="[[_computeNavClass(_loading)]]">
+          Page [[_computePage(_offset, _changesPerPage)]]
+          <a id="prevArrow"
+              href$="[[_computeNavLink(_query, _offset, -1, _changesPerPage)]]"
+              class$="[[_computePrevArrowClass(_offset)]]">
+            <iron-icon icon="gr-icons:chevron-left"></iron-icon>
+          </a>
+          <a id="nextArrow"
+              href$="[[_computeNavLink(_query, _offset, 1, _changesPerPage)]]"
+              class$="[[_computeNextArrowClass(_changes)]]">
+            <iron-icon icon="gr-icons:chevron-right"></iron-icon>
+          </a>
       </nav>
     </div>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view.js b/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view.js
index c48b860..d5ae7c1 100644
--- a/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view.js
+++ b/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -21,6 +24,9 @@
 
   const USER_QUERY_PATTERN = /^owner:\s?("[^"]+"|[^ ]+)$/;
 
+  const REPO_QUERY_PATTERN =
+      /^project:\s?("[^"]+"|[^ ]+)(\sstatus\s?:(open|"open"))?$/;
+
   const LIMIT_OPERATOR_PATTERN = /\blimit:(\d+)/i;
 
   Polymer({
@@ -49,9 +55,14 @@
       /**
        * True when user is logged in.
        */
-      loggedIn: {
+      _loggedIn: {
         type: Boolean,
-        value: false,
+        computed: '_computeLoggedIn(account)',
+      },
+
+      account: {
+        type: Object,
+        value: null,
       },
 
       /**
@@ -68,6 +79,8 @@
         value() { return {}; },
       },
 
+      preferences: Object,
+
       _changesPerPage: Number,
 
       /**
@@ -104,6 +117,12 @@
         type: String,
         value: null,
       },
+
+      /** @type {?String} */
+      _repo: {
+        type: String,
+        value: null,
+      },
     },
 
     listeners: {
@@ -112,7 +131,7 @@
     },
 
     attached() {
-      this.fire('title-change', {title: this._query});
+      this._loadPreferences();
     },
 
     _paramsChanged(value) {
@@ -128,7 +147,9 @@
         this.set('viewState.offset', this._offset);
       }
 
-      this.fire('title-change', {title: this._query});
+      // NOTE: This method may be called before attachment. Fire title-change
+      // in an async so that attachment to the DOM can take place first.
+      this.async(() => this.fire('title-change', {title: this._query}));
 
       this._getPreferences().then(prefs => {
         this._changesPerPage = prefs.changes_per_page;
@@ -150,6 +171,18 @@
       });
     },
 
+    _loadPreferences() {
+      return this.$.restAPI.getLoggedIn().then(loggedIn => {
+        if (loggedIn) {
+          this._getPreferences().then(preferences => {
+            this.preferences = preferences;
+          });
+        } else {
+          this.preferences = {};
+        }
+      });
+    },
+
     _replaceCurrentLocation(url) {
       window.location.replace(url);
     },
@@ -176,21 +209,20 @@
       offset = +(offset || 0);
       const limit = this._limitFor(query, changesPerPage);
       const newOffset = Math.max(0, offset + (limit * direction));
-      // Double encode URI component.
-      let href = this.getBaseUrl() + '/q/' + this.encodeURL(query, false);
-      if (newOffset > 0) {
-        href += ',' + newOffset;
-      }
-      return href;
+      return Gerrit.Nav.getUrlForSearchQuery(query, newOffset);
     },
 
-    _hidePrevArrow(offset) {
-      return offset === 0;
+    _computePrevArrowClass(offset) {
+      return offset === 0 ? 'hide' : '';
     },
 
-    _hideNextArrow(loading) {
-      return loading || !this._changes || !this._changes.length ||
-          !this._changes[this._changes.length - 1]._more_changes;
+    _computeNextArrowClass(changes) {
+      const more = changes.length && changes[changes.length - 1]._more_changes;
+      return more ? '' : 'hide';
+    },
+
+    _computeNavClass(loading) {
+      return loading || !this._changes || !this._changes.length ? 'hide' : '';
     },
 
     _handleNextPage() {
@@ -206,16 +238,40 @@
     },
 
     _changesChanged(changes) {
-      if (!changes || !changes.length ||
-          !USER_QUERY_PATTERN.test(this._query)) {
-        this._userId = null;
+      this._userId = null;
+      this._repo = null;
+      if (!changes || !changes.length) {
         return;
       }
-      this._userId = changes[0].owner.email;
+      if (USER_QUERY_PATTERN.test(this._query) && changes[0].owner.email) {
+        this._userId = changes[0].owner.email;
+        return;
+      }
+      if (REPO_QUERY_PATTERN.test(this._query)) {
+        this._repo = changes[0].project;
+      }
     },
 
-    _computeUserHeaderClass(userId) {
-      return userId ? '' : 'hide';
+    _computeHeaderClass(id) {
+      return id ? '' : 'hide';
+    },
+
+    _computePage(offset, changesPerPage) {
+      return offset / changesPerPage + 1;
+    },
+
+    _computeLoggedIn(account) {
+      return !!(account && Object.keys(account).length > 0);
+    },
+
+    _handleToggleStar(e) {
+      this.$.restAPI.saveChangeStarred(e.detail.change._number,
+          e.detail.starred);
+    },
+
+    _handleToggleReviewed(e) {
+      this.$.restAPI.saveChangeReviewed(e.detail.change._number,
+          e.detail.reviewed);
     },
   });
 })();
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view_test.html b/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view_test.html
index 680f835..3911364 100644
--- a/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view_test.html
+++ b/polygerrit-ui/app/elements/change-list/gr-change-list-view/gr-change-list-view_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -46,6 +47,8 @@
         getChanges(num, query) {
           return Promise.resolve([]);
         },
+        getAccountDetails() { return Promise.resolve({}); },
+        getAccountStatus() { return Promise.resolve({}); },
       });
       element = fixture('basic');
       sandbox = sinon.sandbox.create();
@@ -58,15 +61,9 @@
       });
     });
 
-    test('url is properly encoded', () => {
-      assert.equal(element._computeNavLink(
-          'status:open project:platform/frameworks/base', 0, -1, 25),
-          '/q/status:open+project:platform%252Fframeworks%252Fbase'
-      );
-      assert.equal(element._computeNavLink(
-          'status:open project:platform/frameworks/base', 0, 1, 25),
-          '/q/status:open+project:platform%252Fframeworks%252Fbase,25'
-      );
+    test('_computePage', () => {
+      assert.equal(element._computePage(0, 25), 1);
+      assert.equal(element._computePage(50, 25), 3);
     });
 
     test('_limitFor', () => {
@@ -79,74 +76,49 @@
     });
 
     test('_computeNavLink', () => {
+      const getUrlStub = sandbox.stub(Gerrit.Nav, 'getUrlForSearchQuery')
+          .returns('');
       const query = 'status:open';
       let offset = 0;
       let direction = 1;
       const changesPerPage = 5;
-      assert.equal(
-          element._computeNavLink(query, offset, direction, changesPerPage),
-          '/q/status:open,5');
+
+      element._computeNavLink(query, offset, direction, changesPerPage);
+      assert.equal(getUrlStub.lastCall.args[1], 5);
+
       direction = -1;
-      assert.equal(
-          element._computeNavLink(query, offset, direction, changesPerPage),
-          '/q/status:open');
+      element._computeNavLink(query, offset, direction, changesPerPage);
+      assert.equal(getUrlStub.lastCall.args[1], 0);
+
       offset = 5;
       direction = 1;
-      assert.equal(
-          element._computeNavLink(query, offset, direction, changesPerPage),
-          '/q/status:open,10');
-      assert.equal(
-          element._computeNavLink(
-              query + ' limit:10', offset, direction, changesPerPage),
-          '/q/status:open+limit:10,15');
+      element._computeNavLink(query, offset, direction, changesPerPage);
+      assert.equal(getUrlStub.lastCall.args[1], 10);
     });
 
-    test('_computeNavLink with path', () => {
-      const oldCanonicalPath = window.CANONICAL_PATH;
-      window.CANONICAL_PATH = '/r';
-      const query = 'status:open';
+    test('_computePrevArrowClass', () => {
       let offset = 0;
-      let direction = 1;
-      const changesPerPage = 5;
-      assert.equal(
-          element._computeNavLink(query, offset, direction, changesPerPage),
-          '/r/q/status:open,5');
-      direction = -1;
-      assert.equal(
-          element._computeNavLink(query, offset, direction, changesPerPage),
-          '/r/q/status:open');
+      assert.equal(element._computePrevArrowClass(offset), 'hide');
       offset = 5;
-      direction = 1;
-      assert.equal(
-          element._computeNavLink(query, offset, direction, changesPerPage),
-          '/r/q/status:open,10');
-      window.CANONICAL_PATH = oldCanonicalPath;
+      assert.equal(element._computePrevArrowClass(offset), '');
     });
 
-    test('_hidePrevArrow', () => {
-      let offset = 0;
-      assert.isTrue(element._hidePrevArrow(offset));
-      offset = 5;
-      assert.isFalse(element._hidePrevArrow(offset));
+    test('_computeNextArrowClass', () => {
+      let changes = _.times(25, _.constant({_more_changes: true}));
+      assert.equal(element._computeNextArrowClass(changes), '');
+      changes = _.times(25, _.constant({}));
+      assert.equal(element._computeNextArrowClass(changes), 'hide');
     });
 
-    test('_hideNextArrow', () => {
+    test('_computeNavClass', () => {
       let loading = true;
-      assert.isTrue(element._hideNextArrow(loading));
+      assert.equal(element._computeNavClass(loading), 'hide');
       loading = false;
-      assert.isTrue(element._hideNextArrow(loading));
+      assert.equal(element._computeNavClass(loading), 'hide');
       element._changes = [];
-      assert.isTrue(element._hideNextArrow(loading));
-      element._changes =
-          Array(...Array(5)).map(Object.prototype.valueOf, {});
-      assert.isTrue(element._hideNextArrow(loading));
-      element._changes =
-          Array(...Array(25)).map(Object.prototype.valueOf,
-          {_more_changes: true});
-      assert.isFalse(element._hideNextArrow(loading));
-      element._changes =
-          Array(...Array(25)).map(Object.prototype.valueOf, {});
-      assert.isTrue(element._hideNextArrow(loading));
+      assert.equal(element._computeNavClass(loading), 'hide');
+      element._changes = _.times(5, _.constant({}));
+      assert.equal(element._computeNavClass(loading), '');
     });
 
     test('_handleNextPage', () => {
@@ -184,6 +156,42 @@
       });
     });
 
+    test('_userId query without email', done => {
+      assert.isNull(element._userId);
+      element._query = 'owner: foo@bar';
+      element._changes = [{owner: {}}];
+      flush(() => {
+        assert.isNull(element._userId);
+        done();
+      });
+    });
+
+    test('_repo query', done => {
+      assert.isNull(element._repo);
+      element._query = 'project: test-repo';
+      element._changes = [{owner: {email: 'foo@bar'}, project: 'test-repo'}];
+      flush(() => {
+        assert.equal(element._repo, 'test-repo');
+        element._query = 'foo bar baz';
+        element._changes = [{owner: {email: 'foo@bar'}}];
+        assert.isNull(element._repo);
+        done();
+      });
+    });
+
+    test('_repo query with open status', done => {
+      assert.isNull(element._repo);
+      element._query = 'project:test-repo status:open';
+      element._changes = [{owner: {email: 'foo@bar'}, project: 'test-repo'}];
+      flush(() => {
+        assert.equal(element._repo, 'test-repo');
+        element._query = 'foo bar baz';
+        element._changes = [{owner: {email: 'foo@bar'}}];
+        assert.isNull(element._repo);
+        done();
+      });
+    });
+
     suite('query based navigation', () => {
       setup(() => {
         sandbox.stub(Gerrit.Nav, 'getUrlForChange', () => '/r/c/1');
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list/gr-change-list.html b/polygerrit-ui/app/elements/change-list/gr-change-list/gr-change-list.html
index 152ef3d..372e6be 100644
--- a/polygerrit-ui/app/elements/change-list/gr-change-list/gr-change-list.html
+++ b/polygerrit-ui/app/elements/change-list/gr-change-list/gr-change-list.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,58 +17,38 @@
 
 <link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
 <link rel="import" href="../../../behaviors/gr-change-table-behavior/gr-change-table-behavior.html">
-<link rel="import" href="../../../behaviors/gr-url-encoding-behavior.html">
+<link rel="import" href="../../../behaviors/gr-url-encoding-behavior/gr-url-encoding-behavior.html">
 <link rel="import" href="../../../behaviors/keyboard-shortcut-behavior/keyboard-shortcut-behavior.html">
 <link rel="import" href="../../../behaviors/rest-client-behavior/rest-client-behavior.html">
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
 <link rel="import" href="../../../styles/gr-change-list-styles.html">
 <link rel="import" href="../../core/gr-navigation/gr-navigation.html">
-<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
+<link rel="import" href="../../shared/gr-cursor-manager/gr-cursor-manager.html">
 <link rel="import" href="../gr-change-list-item/gr-change-list-item.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 
 <dom-module id="gr-change-list">
   <template>
-    <style include="shared-styles">
+    <style include="shared-styles"></style>
+    <style include="gr-change-list-styles">
       #changeList {
         border-collapse: collapse;
         width: 100%;
       }
-      .cell {
-        padding: .3em .5em;
-      }
-      th {
-        text-align: left;
-      }
-      .groupHeader {
-        background-color: #eee;
-        border-top: 1em solid #fff;
-      }
-      .groupHeader a {
-        color: #000;
-        text-decoration: none;
-      }
-      .groupHeader a:hover {
-        text-decoration: underline;
-      }
-      .headerRow + tr {
-        border: none;
-      }
     </style>
-    <style include="gr-change-list-styles"></style>
     <table id="changeList">
-      <tr class="headerRow">
-        <th class="topHeader keyboard"></th>
-        <th class="topHeader star" hidden$="[[!showStar]]" hidden></th>
-        <th class="topHeader number" hidden$="[[!showNumber]]" hidden>#</th>
+      <tr class="topHeader">
+        <th class="leftPadding"></th>
+        <th class="star" hidden$="[[!showStar]]" hidden></th>
+        <th class="number" hidden$="[[!showNumber]]" hidden>#</th>
         <template is="dom-repeat" items="[[changeTableColumns]]" as="item">
-          <th class$="[[_lowerCase(item)]] topHeader"
+          <th class$="[[_lowerCase(item)]]"
               hidden$="[[isColumnHidden(item, visibleChangeTableColumns)]]">
             [[item]]
           </th>
         </template>
         <template is="dom-repeat" items="[[labelNames]]" as="labelName">
-          <th class="topHeader label" title$="[[labelName]]">
+          <th class="label" title$="[[labelName]]">
             [[_computeLabelShortcut(labelName)]]
           </th>
         </template>
@@ -76,6 +57,8 @@
           index-as="sectionIndex">
         <template is="dom-if" if="[[changeSection.sectionName]]">
           <tr class="groupHeader">
+            <td class="leftPadding"></td>
+            <td class="star" hidden$="[[!showStar]]" hidden></td>
             <td class="cell"
                 colspan$="[[_computeColspan(changeTableColumns, labelNames)]]">
               <a href$="[[_sectionHref(changeSection.query)]]">
@@ -84,28 +67,40 @@
             </td>
           </tr>
         </template>
-        <template is="dom-if" if="[[!changeSection.results.length]]">
+        <template is="dom-if" if="[[_isEmpty(changeSection)]]">
           <tr class="noChanges">
+            <td class="leftPadding"></td>
+            <td class="star" hidden$="[[!showStar]]" hidden></td>
             <td class="cell"
                 colspan$="[[_computeColspan(changeTableColumns, labelNames)]]">
-              No changes
+              <template is="dom-if" if="[[_isOutgoing(changeSection)]]">
+                <slot name="empty-outgoing"></slot>
+              </template>
+              <template is="dom-if" if="[[!_isOutgoing(changeSection)]]">
+                No changes
+              </template>
             </td>
           </tr>
         </template>
         <template is="dom-repeat" items="[[changeSection.results]]" as="change">
           <gr-change-list-item
               selected$="[[_computeItemSelected(sectionIndex, index, selectedIndex)]]"
-              assigned$="[[_computeItemAssigned(account, change)]]"
+              highlight$="[[_computeItemHighlight(account, change)]]"
               needs-review$="[[_computeItemNeedsReview(account, change, showReviewedState)]]"
               change="[[change]]"
               visible-change-table-columns="[[visibleChangeTableColumns]]"
               show-number="[[showNumber]]"
               show-star="[[showStar]]"
+              tabindex="0"
               label-names="[[labelNames]]"></gr-change-list-item>
         </template>
       </template>
     </table>
-    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
+    <gr-cursor-manager
+        id="cursor"
+        index="{{selectedIndex}}"
+        scroll-behavior="keep-visible"
+        focus-on-move></gr-cursor-manager>
   </template>
   <script src="gr-change-list.js"></script>
 </dom-module>
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list/gr-change-list.js b/polygerrit-ui/app/elements/change-list/gr-change-list/gr-change-list.js
index 769ef99..61c64ff 100644
--- a/polygerrit-ui/app/elements/change-list/gr-change-list/gr-change-list.js
+++ b/polygerrit-ui/app/elements/change-list/gr-change-list/gr-change-list.js
@@ -1,20 +1,26 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
   const NUMBER_FIXED_COLUMNS = 3;
+  const CLOSED_STATUS = ['MERGED', 'ABANDONED'];
+  const LABEL_PREFIX_INVALID_PROLOG = 'Invalid-Prolog-Rules-Label-Name--';
+  const MAX_SHORTCUT_CHARS = 5;
 
   Polymer({
     is: 'gr-change-list',
@@ -42,7 +48,7 @@
        */
       account: {
         type: Object,
-        value() { return {}; },
+        value: null,
       },
       /**
        * An array of ChangeInfo objects to render.
@@ -89,6 +95,7 @@
       },
       changeTableColumns: Array,
       visibleChangeTableColumns: Array,
+      preferences: Object,
     },
 
     behaviors: [
@@ -99,20 +106,28 @@
       Gerrit.URLEncodingBehavior,
     ],
 
-    keyBindings: {
-      'j': '_handleJKey',
-      'k': '_handleKKey',
-      'n ]': '_handleNKey',
-      'o': '_handleOKey',
-      'p [': '_handlePKey',
-      'shift+r': '_handleRKey',
-      's': '_handleSKey',
-    },
-
     listeners: {
       keydown: '_scopedKeydownHandler',
     },
 
+    observers: [
+      '_sectionsChanged(sections.*)',
+      '_computePreferences(account, preferences)',
+    ],
+
+    keyboardShortcuts() {
+      return {
+        [this.Shortcut.CURSOR_NEXT_CHANGE]: '_nextChange',
+        [this.Shortcut.CURSOR_PREV_CHANGE]: '_prevChange',
+        [this.Shortcut.NEXT_PAGE]: '_nextPage',
+        [this.Shortcut.PREV_PAGE]: '_prevPage',
+        [this.Shortcut.OPEN_CHANGE]: '_openChange',
+        [this.Shortcut.TOGGLE_CHANGE_REVIEWED]: '_toggleChangeReviewed',
+        [this.Shortcut.TOGGLE_CHANGE_STAR]: '_toggleChangeStar',
+        [this.Shortcut.REFRESH_CHANGE_LIST]: '_refreshChangeList',
+      };
+    },
+
     /**
      * Iron-a11y-keys-behavior catches keyboard events globally. Some keyboard
      * events must be scoped to a component level (e.g. `enter`) in order to not
@@ -123,42 +138,27 @@
     _scopedKeydownHandler(e) {
       if (e.keyCode === 13) {
         // Enter.
-        this._handleOKey(e);
+        this._openChange(e);
       }
     },
 
-    attached() {
-      this._loadPreferences();
-    },
-
     _lowerCase(column) {
       return column.toLowerCase();
     },
 
-    _loadPreferences() {
-      return this._getLoggedIn().then(loggedIn => {
-        this.changeTableColumns = this.columnNames;
+    _computePreferences(account, preferences) {
+      this.changeTableColumns = this.columnNames;
 
-        if (!loggedIn) {
-          this.showNumber = false;
-          this.visibleChangeTableColumns = this.columnNames;
-          return;
-        }
-        return this._getPreferences().then(preferences => {
-          this.showNumber = !!(preferences &&
-              preferences.legacycid_in_change_table);
-          this.visibleChangeTableColumns = preferences.change_table.length > 0 ?
-              preferences.change_table : this.columnNames;
-        });
-      });
-    },
-
-    _getLoggedIn() {
-      return this.$.restAPI.getLoggedIn();
-    },
-
-    _getPreferences() {
-      return this.$.restAPI.getPreferences();
+      if (account) {
+        this.showNumber = !!(preferences &&
+            preferences.legacycid_in_change_table);
+        this.visibleChangeTableColumns = preferences.change_table.length > 0 ?
+            this.getVisibleColumns(preferences.change_table) : this.columnNames;
+      } else {
+        // Not logged in.
+        this.showNumber = false;
+        this.visibleChangeTableColumns = this.columnNames;
+      }
     },
 
     _computeColspan(changeTableColumns, labelNames) {
@@ -184,9 +184,15 @@
     },
 
     _computeLabelShortcut(labelName) {
-      return labelName.split('-').reduce((a, i) => {
-        return a + i[0].toUpperCase();
-      }, '');
+      if (labelName.startsWith(LABEL_PREFIX_INVALID_PROLOG)) {
+        labelName = labelName.slice(LABEL_PREFIX_INVALID_PROLOG.length);
+      }
+      return labelName.split('-')
+          .reduce((a, i) => {
+            if (!i) { return a; }
+            return a + i[0].toUpperCase();
+          }, '')
+          .slice(0, MAX_SHORTCUT_CHARS);
     },
 
     _changesChanged(changes) {
@@ -194,15 +200,15 @@
     },
 
     _sectionHref(query) {
-      return `${this.getBaseUrl()}/q/${this.encodeURL(query, true)}`;
+      return Gerrit.Nav.getUrlForSearchQuery(query);
     },
 
     /**
      * Maps an index local to a particular section to the absolute index
      * across all the changes on the page.
      *
-     * @param sectionIndex {number} index of section
-     * @param localIndex {number} index of row within section
+     * @param {number} sectionIndex index of section
+     * @param {number} localIndex index of row within section
      * @return {number} absolute index of row in the aggregate dashboard
      */
     _computeItemAbsoluteIndex(sectionIndex, localIndex) {
@@ -220,36 +226,38 @@
 
     _computeItemNeedsReview(account, change, showReviewedState) {
       return showReviewedState && !change.reviewed &&
+          !change.work_in_progress &&
           this.changeIsOpen(change.status) &&
-          account._account_id != change.owner._account_id;
+          (!account || account._account_id != change.owner._account_id);
     },
 
-    _computeItemAssigned(account, change) {
-      if (!change.assignee) { return false; }
+    _computeItemHighlight(account, change) {
+      // Do not show the assignee highlight if the change is not open.
+      if (!change.assignee ||
+          !account ||
+          CLOSED_STATUS.indexOf(change.status) !== -1) {
+        return false;
+      }
       return account._account_id === change.assignee._account_id;
     },
 
-    _handleJKey(e) {
+    _nextChange(e) {
       if (this.shouldSuppressKeyboardShortcut(e) ||
           this.modifierPressed(e)) { return; }
 
       e.preventDefault();
-      // Compute absolute index of item that would come after final item.
-      const len = this._computeItemAbsoluteIndex(this.sections.length, 0);
-      if (this.selectedIndex === len - 1) { return; }
-      this.selectedIndex += 1;
+      this.$.cursor.next();
     },
 
-    _handleKKey(e) {
+    _prevChange(e) {
       if (this.shouldSuppressKeyboardShortcut(e) ||
           this.modifierPressed(e)) { return; }
 
       e.preventDefault();
-      if (this.selectedIndex === 0) { return; }
-      this.selectedIndex -= 1;
+      this.$.cursor.previous();
     },
 
-    _handleOKey(e) {
+    _openChange(e) {
       if (this.shouldSuppressKeyboardShortcut(e) ||
           this.modifierPressed(e)) { return; }
 
@@ -257,7 +265,7 @@
       Gerrit.Nav.navigateToChange(this._changeForIndex(this.selectedIndex));
     },
 
-    _handleNKey(e) {
+    _nextPage(e) {
       if (this.shouldSuppressKeyboardShortcut(e) ||
           this.modifierPressed(e) && !this.isModifierPressed(e, 'shiftKey')) {
         return;
@@ -267,7 +275,7 @@
       this.fire('next-page');
     },
 
-    _handlePKey(e) {
+    _prevPage(e) {
       if (this.shouldSuppressKeyboardShortcut(e) ||
           this.modifierPressed(e) && !this.isModifierPressed(e, 'shiftKey')) {
         return;
@@ -277,7 +285,25 @@
       this.fire('previous-page');
     },
 
-    _handleRKey(e) {
+    _toggleChangeReviewed(e) {
+      if (this.shouldSuppressKeyboardShortcut(e) ||
+          this.modifierPressed(e)) { return; }
+
+      e.preventDefault();
+      this._toggleReviewedForIndex(this.selectedIndex);
+    },
+
+    _toggleReviewedForIndex(index) {
+      const changeEls = this._getListItems();
+      if (index >= changeEls.length || !changeEls[index]) {
+        return;
+      }
+
+      const changeEl = changeEls[index];
+      changeEl.toggleReviewed();
+    },
+
+    _refreshChangeList(e) {
       if (this.shouldSuppressKeyboardShortcut(e)) { return; }
 
       e.preventDefault();
@@ -288,7 +314,7 @@
       window.location.reload();
     },
 
-    _handleSKey(e) {
+    _toggleChangeStar(e) {
       if (this.shouldSuppressKeyboardShortcut(e) ||
           this.modifierPressed(e)) { return; }
 
@@ -303,10 +329,7 @@
       }
 
       const changeEl = changeEls[index];
-      const change = changeEl.change;
-      const newVal = !change.starred;
-      changeEl.set('change.starred', newVal);
-      this.$.restAPI.saveChangeStarred(change._number, newVal);
+      changeEl.$$('gr-change-star').toggleStar();
     },
 
     _changeForIndex(index) {
@@ -320,5 +343,20 @@
     _getListItems() {
       return Polymer.dom(this.root).querySelectorAll('gr-change-list-item');
     },
+
+    _sectionsChanged() {
+      // Flush DOM operations so that the list item elements will be loaded.
+      Polymer.dom.flush();
+      this.$.cursor.stops = this._getListItems();
+      this.$.cursor.moveToStart();
+    },
+
+    _isOutgoing(section) {
+      return !!section.isOutgoing;
+    },
+
+    _isEmpty(section) {
+      return !section.results.length;
+    },
   });
 })();
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list/gr-change-list_test.html b/polygerrit-ui/app/elements/change-list/gr-change-list/gr-change-list_test.html
index 25153cd..d5b9aa9 100644
--- a/polygerrit-ui/app/elements/change-list/gr-change-list/gr-change-list_test.html
+++ b/polygerrit-ui/app/elements/change-list/gr-change-list/gr-change-list_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -41,6 +42,17 @@
 
 <script>
   suite('gr-change-list basic tests', () => {
+    // Define keybindings before attaching other fixtures.
+    const kb = window.Gerrit.KeyboardShortcutBinder;
+    kb.bindShortcut(kb.Shortcut.CURSOR_NEXT_CHANGE, 'j');
+    kb.bindShortcut(kb.Shortcut.CURSOR_PREV_CHANGE, 'k');
+    kb.bindShortcut(kb.Shortcut.OPEN_CHANGE, 'o');
+    kb.bindShortcut(kb.Shortcut.REFRESH_CHANGE_LIST, 'shift+r');
+    kb.bindShortcut(kb.Shortcut.TOGGLE_CHANGE_REVIEWED, 'r');
+    kb.bindShortcut(kb.Shortcut.TOGGLE_CHANGE_STAR, 's');
+    kb.bindShortcut(kb.Shortcut.NEXT_PAGE, 'n');
+    kb.bindShortcut(kb.Shortcut.NEXT_PAGE, 'p');
+
     let element;
     let sandbox;
 
@@ -51,22 +63,11 @@
 
     teardown(() => { sandbox.restore(); });
 
-    function stubRestAPI(preferences) {
-      const loggedInPromise = Promise.resolve(preferences !== null);
-      const preferencesPromise = Promise.resolve(preferences);
-      stub('gr-rest-api-interface', {
-        getLoggedIn: sinon.stub().returns(loggedInPromise),
-        getPreferences: sinon.stub().returns(preferencesPromise),
-      });
-      return Promise.all([loggedInPromise, preferencesPromise]);
-    }
-
     suite('test show change number not logged in', () => {
       setup(() => {
-        return stubRestAPI(null).then(() => {
-          element = fixture('basic');
-          return element._loadPreferences();
-        });
+        element = fixture('basic');
+        element.account = null;
+        element.preferences = null;
       });
 
       test('show number disabled', () => {
@@ -76,13 +77,14 @@
 
     suite('test show change number preference enabled', () => {
       setup(() => {
-        return stubRestAPI({legacycid_in_change_table: true,
+        element = fixture('basic');
+        element.preferences = {
+          legacycid_in_change_table: true,
           time_format: 'HHMM_12',
           change_table: [],
-        }).then(() => {
-          element = fixture('basic');
-          return element._loadPreferences();
-        });
+        };
+        element.account = {_account_id: 1001};
+        flushAsynchronousOperations();
       });
 
       test('show number enabled', () => {
@@ -92,12 +94,14 @@
 
     suite('test show change number preference disabled', () => {
       setup(() => {
+        element = fixture('basic');
         // legacycid_in_change_table is not set when false.
-        return stubRestAPI({time_format: 'HHMM_12', change_table: []}).then(
-            () => {
-              element = fixture('basic');
-              return element._loadPreferences();
-            });
+        element.preferences = {
+          time_format: 'HHMM_12',
+          change_table: [],
+        };
+        element.account = {_account_id: 1001};
+        flushAsynchronousOperations();
       });
 
       test('show number disabled', () => {
@@ -134,7 +138,13 @@
       assert.equal(element._computeLabelShortcut('PolyGerrit-Review'), 'PR');
       assert.equal(element._computeLabelShortcut('polygerrit-review'), 'PR');
       assert.equal(element._computeLabelShortcut(
+          'Invalid-Prolog-Rules-Label-Name--Verified'), 'V');
+      assert.equal(element._computeLabelShortcut(
           'Some-Special-Label-7'), 'SSL7');
+      assert.equal(element._computeLabelShortcut('--Too----many----dashes---'),
+          'TMD');
+      assert.equal(element._computeLabelShortcut(
+          'Really-rather-entirely-too-long-of-a-label-name'), 'RRETL');
     });
 
     test('colspans', () => {
@@ -221,11 +231,17 @@
           status: 'ABANDONED',
           owner: {_account_id: 0},
         },
+        {
+          _number: 4,
+          status: 'NEW',
+          work_in_progress: true,
+          owner: {_account_id: 0},
+        },
       ];
       flushAsynchronousOperations();
       let elementItems = Polymer.dom(element.root).querySelectorAll(
           'gr-change-list-item');
-      assert.equal(elementItems.length, 4);
+      assert.equal(elementItems.length, 5);
       for (let i = 0; i < elementItems.length; i++) {
         assert.isFalse(elementItems[i].hasAttribute('needs-review'));
       }
@@ -233,20 +249,22 @@
       element.showReviewedState = true;
       elementItems = Polymer.dom(element.root).querySelectorAll(
           'gr-change-list-item');
-      assert.equal(elementItems.length, 4);
+      assert.equal(elementItems.length, 5);
       assert.isFalse(elementItems[0].hasAttribute('needs-review'));
       assert.isTrue(elementItems[1].hasAttribute('needs-review'));
       assert.isFalse(elementItems[2].hasAttribute('needs-review'));
       assert.isFalse(elementItems[3].hasAttribute('needs-review'));
+      assert.isFalse(elementItems[4].hasAttribute('needs-review'));
 
       element.account = {_account_id: 42};
       elementItems = Polymer.dom(element.root).querySelectorAll(
           'gr-change-list-item');
-      assert.equal(elementItems.length, 4);
+      assert.equal(elementItems.length, 5);
       assert.isFalse(elementItems[0].hasAttribute('needs-review'));
       assert.isTrue(elementItems[1].hasAttribute('needs-review'));
       assert.isFalse(elementItems[2].hasAttribute('needs-review'));
       assert.isFalse(elementItems[3].hasAttribute('needs-review'));
+      assert.isFalse(elementItems[4].hasAttribute('needs-review'));
     });
 
     test('no changes', () => {
@@ -271,19 +289,45 @@
       assert.equal(noChangesMsg.length, 2);
     });
 
+    suite('empty outgoing', () => {
+      test('not shown on empty non-outgoing sections', () => {
+        const section = {results: []};
+        assert.isTrue(element._isEmpty(section));
+        assert.isFalse(element._isOutgoing(section));
+      });
+
+      test('shown on empty outgoing sections', () => {
+        const section = {results: [], isOutgoing: true};
+        assert.isTrue(element._isEmpty(section));
+        assert.isTrue(element._isOutgoing(section));
+      });
+
+      test('not shown on non-empty outgoing sections', () => {
+        const section = {isOutgoing: true, results: [
+          {_number: 0, labels: {Verified: {approved: {}}}}]};
+        assert.isFalse(element._isEmpty(section));
+        assert.isTrue(element._isOutgoing(section));
+      });
+    });
+
+    test('_isOutgoing', () => {
+      assert.isTrue(element._isOutgoing({results: [], isOutgoing: true}));
+      assert.isFalse(element._isOutgoing({results: []}));
+    });
+
     suite('empty column preference', () => {
       let element;
 
-      setup(() =>
-        stubRestAPI({
+      setup(() => {
+        element = fixture('basic');
+        element.account = {_account_id: 1001};
+        element.preferences = {
           legacycid_in_change_table: true,
           time_format: 'HHMM_12',
           change_table: [],
-        }).then(() => {
-          element = fixture('basic');
-          return element._loadPreferences();
-        })
-      );
+        };
+        flushAsynchronousOperations();
+      });
 
       test('show number enabled', () => {
         assert.isTrue(element.showNumber);
@@ -301,7 +345,9 @@
       let element;
 
       setup(() => {
-        return stubRestAPI({
+        element = fixture('basic');
+        element.account = {_account_id: 1001};
+        element.preferences = {
           legacycid_in_change_table: true,
           time_format: 'HHMM_12',
           change_table: [
@@ -309,15 +355,13 @@
             'Status',
             'Owner',
             'Assignee',
-            'Project',
+            'Repo',
             'Branch',
             'Updated',
             'Size',
           ],
-        }).then(() => {
-          element = fixture('basic');
-          return element._loadPreferences();
-        });
+        };
+        flushAsynchronousOperations();
       });
 
       test('all columns visible', () => {
@@ -332,7 +376,9 @@
       let element;
 
       setup(() => {
-        return stubRestAPI({
+        element = fixture('basic');
+        element.account = {_account_id: 1001};
+        element.preferences = {
           legacycid_in_change_table: true,
           time_format: 'HHMM_12',
           change_table: [
@@ -344,16 +390,14 @@
             'Updated',
             'Size',
           ],
-        }).then(() => {
-          element = fixture('basic');
-          return element._loadPreferences();
-        });
+        };
+        flushAsynchronousOperations();
       });
 
-      test('all columns except project visible', () => {
+      test('all columns except repo visible', () => {
         for (const column of element.changeTableColumns) {
           const elementClass = '.' + column.toLowerCase();
-          if (column === 'Project') {
+          if (column === 'Repo') {
             assert.isTrue(element.$$(elementClass).hidden);
           } else {
             assert.isFalse(element.$$(elementClass).hidden);
@@ -368,16 +412,16 @@
       /* This would only exist if somebody manually updated the config
       file. */
       setup(() => {
-        return stubRestAPI({
+        element = fixture('basic');
+        element.account = {_account_id: 1001};
+        element.preferences = {
           legacycid_in_change_table: true,
           time_format: 'HHMM_12',
           change_table: [
             'Bad',
           ],
-        }).then(() => {
-          element = fixture('basic');
-          return element._loadPreferences();
-        });
+        };
+        flushAsynchronousOperations();
       });
 
       test('bad column does not exist', () => {
@@ -452,9 +496,17 @@
       MockInteractions.pressAndReleaseKeyOn(element, 13); // 'enter'
       assert.deepEqual(navStub.lastCall.args[0], {_number: 4},
           'Should navigate to /c/4/');
+
+      MockInteractions.pressAndReleaseKeyOn(element, 82); // 'r'
+      const change = element._changeForIndex(element.selectedIndex);
+      assert.equal(change.reviewed, true,
+          'Should mark change as reviewed');
+      MockInteractions.pressAndReleaseKeyOn(element, 82); // 'r'
+      assert.equal(change.reviewed, false,
+          'Should mark change as unreviewed');
     });
 
-    test('assigned attribute set in each item', () => {
+    test('highlight attribute is updated correctly', () => {
       element.changes = [
         {
           _number: 0,
@@ -469,22 +521,25 @@
       ];
       element.account = {_account_id: 42};
       flushAsynchronousOperations();
-      const items = element._getListItems();
+      let items = element._getListItems();
       assert.equal(items.length, 2);
-      for (let i = 0; i < items.length; i++) {
-        assert.equal(items[i].hasAttribute('assigned'),
-            items[i]._account_id === element.account._account_id);
-      }
+      assert.isFalse(items[0].hasAttribute('highlight'));
+      assert.isFalse(items[1].hasAttribute('highlight'));
+
+      // Assign all issues to the user, but only the first one is highlighted
+      // because the second one is abandoned.
+      element.set(['changes', 0, 'assignee'], {_account_id: 12});
+      element.set(['changes', 1, 'assignee'], {_account_id: 12});
+      element.account = {_account_id: 12};
+      flushAsynchronousOperations();
+      items = element._getListItems();
+      assert.isTrue(items[0].hasAttribute('highlight'));
+      assert.isFalse(items[1].hasAttribute('highlight'));
     });
 
-    test('_sectionHref', () => {
-      assert.equal(
-          element._sectionHref('is:open owner:self'),
-          '/q/is:open+owner:self');
-      assert.equal(
-          element._sectionHref(
-              'is:open ((reviewer:self -is:ignored) OR assignee:self)'),
-          '/q/is:open+((reviewer:self+-is:ignored)+OR+assignee:self)');
+    test('_computeItemHighlight gives false for null account', () => {
+      assert.isFalse(
+          element._computeItemHighlight(null, {assignee: {_account_id: 42}}));
     });
 
     test('_computeItemAbsoluteIndex', () => {
diff --git a/polygerrit-ui/app/elements/change-list/gr-create-change-help/gr-create-change-help.html b/polygerrit-ui/app/elements/change-list/gr-create-change-help/gr-create-change-help.html
new file mode 100644
index 0000000..e793f42
--- /dev/null
+++ b/polygerrit-ui/app/elements/change-list/gr-create-change-help/gr-create-change-help.html
@@ -0,0 +1,88 @@
+<!--
+@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="../../../bower_components/polymer/polymer.html">
+
+<link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../../shared/gr-button/gr-button.html">
+<link rel="import" href="../../shared/gr-icons/gr-icons.html">
+
+<dom-module id="gr-create-change-help">
+  <template>
+    <style include="shared-styles">
+      :host {
+        display: block;
+      }
+      #graphic,
+      #help {
+        display: inline-block;
+        margin: .5em;
+      }
+      #graphic #circle {
+        align-items: center;
+        background-color: var(--chip-background-color);
+        border-radius: 50%;
+        display: flex;
+        height: 10em;
+        justify-content: center;
+        width: 10em;
+      }
+      #graphic iron-icon {
+        color: #9e9e9e;
+        height: 5em;
+        width: 5em;
+      }
+      #graphic p {
+        color: var(--deemphasized-text-color);
+        text-align: center;
+      }
+      #help {
+        padding-top: 1.35em;
+        vertical-align: top;
+      }
+      #help h1 {
+        font-size: var(--font-size-large);
+      }
+      #help p {
+        max-width: 35em;
+      }
+      @media only screen and (max-width: 50em) {
+        #graphic {
+          display: none;
+        }
+      }
+    </style>
+    <div id="graphic">
+      <div id="circle">
+        <iron-icon id="icon" icon="gr-icons:zeroState"></iron-icon>
+      </div>
+      <p>
+        No outgoing changes yet
+      </p>
+    </div>
+    <div id="help">
+      <h1>Push your first change for code review</h1>
+      <p>
+        Pushing a change for review is easy, but a little different from
+        other git code review tools. Click on the `Create Change' button
+        and follow the step by step instructions.
+      </p>
+      <gr-button on-tap="_handleCreateTap">Create Change</gr-button>
+    </div>
+  </template>
+  <script src="gr-create-change-help.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/change-list/gr-create-change-help/gr-create-change-help.js b/polygerrit-ui/app/elements/change-list/gr-create-change-help/gr-create-change-help.js
new file mode 100644
index 0000000..b5b02a7
--- /dev/null
+++ b/polygerrit-ui/app/elements/change-list/gr-create-change-help/gr-create-change-help.js
@@ -0,0 +1,34 @@
+/**
+ * @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-create-change-help',
+
+    /**
+     * Fired when the "Create change" button is tapped.
+     *
+     * @event create-tap
+     */
+
+    _handleCreateTap(e) {
+      e.preventDefault();
+      this.dispatchEvent(new CustomEvent('create-tap', {bubbles: true}));
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/change-list/gr-create-change-help/gr-create-change-help_test.html b/polygerrit-ui/app/elements/change-list/gr-create-change-help/gr-create-change-help_test.html
new file mode 100644
index 0000000..09d95fd
--- /dev/null
+++ b/polygerrit-ui/app/elements/change-list/gr-create-change-help/gr-create-change-help_test.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<!--
+@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.
+-->
+
+<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+<title>gr-create-change-help</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<script src="../../../scripts/util.js"></script>
+
+<link rel="import" href="gr-create-change-help.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-create-change-help></gr-create-change-help>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-create-change-help tests', () => {
+    let element;
+
+    setup(() => {
+      element = fixture('basic');
+    });
+
+    test('Create change tap', done => {
+      element.addEventListener('create-tap', () => done());
+      MockInteractions.tap(element.$$('gr-button'));
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/change-list/gr-create-commands-dialog/gr-create-commands-dialog.html b/polygerrit-ui/app/elements/change-list/gr-create-commands-dialog/gr-create-commands-dialog.html
new file mode 100644
index 0000000..bf17b911
--- /dev/null
+++ b/polygerrit-ui/app/elements/change-list/gr-create-commands-dialog/gr-create-commands-dialog.html
@@ -0,0 +1,87 @@
+<!--
+@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="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../shared/gr-dialog/gr-dialog.html">
+<link rel="import" href="../../shared/gr-overlay/gr-overlay.html">
+<link rel="import" href="../../shared/gr-shell-command/gr-shell-command.html">
+
+<dom-module id="gr-create-commands-dialog">
+  <template>
+    <style include="shared-styles">
+      ol {
+        list-style: decimal;
+        margin-left: 1em;
+      }
+      p {
+        margin-bottom: .75em;
+      }
+      #commandsDialog {
+        max-width: 40em;
+      }
+    </style>
+    <gr-overlay id="commandsOverlay" with-backdrop>
+      <gr-dialog
+          id="commandsDialog"
+          confirm-label="Done"
+          cancel-label=""
+          confirm-on-enter
+          on-confirm="_handleClose">
+        <div class="header" slot="header">
+          Create change commands
+        </div>
+        <div class="main" slot="main">
+          <ol>
+            <li>
+              <p>
+                Make the changes to the files on your machine
+              </p>
+            </li>
+            <li>
+              <p>
+                If you are making a new commit use
+              </p>
+              <gr-shell-command command="[[_createNewCommitCommand]]"></gr-shell-command>
+              <p>
+                Or to amend an existing commit use
+              </p>
+              <gr-shell-command command="[[_amendExistingCommitCommand]]"></gr-shell-command>
+              <p>
+                Please make sure you add a commit message as it becomes the
+                description for your change.
+              </p>
+            </li>
+            <li>
+              <p>
+                Push the change for code review
+              </p>
+              <gr-shell-command command="[[_pushCommand]]"></gr-shell-command>
+            </li>
+            <li>
+              <p>
+                Close this dialog and you should be able to see your recently
+                created change in ``Outgoing changes'' section on
+                ``Your changes'' page.
+              </p>
+            </li>
+          </ol>
+        </div>
+      </gr-dialog>
+    </gr-overlay>
+  </template>
+  <script src="gr-create-commands-dialog.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/change-list/gr-create-commands-dialog/gr-create-commands-dialog.js b/polygerrit-ui/app/elements/change-list/gr-create-commands-dialog/gr-create-commands-dialog.js
new file mode 100644
index 0000000..0e71f1c
--- /dev/null
+++ b/polygerrit-ui/app/elements/change-list/gr-create-commands-dialog/gr-create-commands-dialog.js
@@ -0,0 +1,58 @@
+/**
+ * @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';
+
+  const Commands = {
+    CREATE: 'git commit',
+    AMEND: 'git commit --amend',
+    PUSH_PREFIX: 'git push origin HEAD:refs/for/',
+  };
+
+  Polymer({
+    is: 'gr-create-commands-dialog',
+    properties: {
+      branch: String,
+      _createNewCommitCommand: {
+        type: String,
+        readonly: true,
+        value: Commands.CREATE,
+      },
+      _amendExistingCommitCommand: {
+        type: String,
+        readonly: true,
+        value: Commands.AMEND,
+      },
+      _pushCommand: {
+        type: String,
+        computed: '_computePushCommand(branch)',
+      },
+    },
+
+    open() {
+      this.$.commandsOverlay.open();
+    },
+
+    _handleClose() {
+      this.$.commandsOverlay.close();
+    },
+
+    _computePushCommand(branch) {
+      return Commands.PUSH_PREFIX + branch;
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/change-list/gr-create-commands-dialog/gr-create-commands-dialog_test.html b/polygerrit-ui/app/elements/change-list/gr-create-commands-dialog/gr-create-commands-dialog_test.html
new file mode 100644
index 0000000..e00037d
--- /dev/null
+++ b/polygerrit-ui/app/elements/change-list/gr-create-commands-dialog/gr-create-commands-dialog_test.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<!--
+@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.
+-->
+
+<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+<title>gr-create-commands-dialog</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-create-commands-dialog.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-create-commands-dialog></gr-create-commands-dialog>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-create-commands-dialog tests', () => {
+    let element;
+
+    setup(() => {
+      element = fixture('basic');
+    });
+
+    test('_computePushCommand', () => {
+      element.branch = 'master';
+      assert.equal(element._pushCommand,
+          'git push origin HEAD:refs/for/master');
+
+      element.branch = 'stable-2.15';
+      assert.equal(element._pushCommand,
+          'git push origin HEAD:refs/for/stable-2.15');
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/change-list/gr-create-destination-dialog/gr-create-destination-dialog.html b/polygerrit-ui/app/elements/change-list/gr-create-destination-dialog/gr-create-destination-dialog.html
new file mode 100644
index 0000000..d12d84b
--- /dev/null
+++ b/polygerrit-ui/app/elements/change-list/gr-create-destination-dialog/gr-create-destination-dialog.html
@@ -0,0 +1,48 @@
+<!--
+@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="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../shared/gr-dialog/gr-dialog.html">
+<link rel="import" href="../../shared/gr-overlay/gr-overlay.html">
+<link rel="import" href="../../shared/gr-repo-branch-picker/gr-repo-branch-picker.html">
+
+<dom-module id="gr-create-destination-dialog">
+  <template>
+    <style include="shared-styles">
+    </style>
+    <gr-overlay id="createOverlay" with-backdrop>
+      <gr-dialog
+          confirm-label="View commands"
+          on-confirm="_pickerConfirm"
+          on-cancel="_handleClose"
+          disabled="[[!_repoAndBranchSelected]]">
+        <div class="header" slot="header">
+          Create change
+        </div>
+        <div class="main" slot="main">
+          <gr-repo-branch-picker
+              repo="{{_repo}}"
+              branch="{{_branch}}"></gr-repo-branch-picker>
+          <p>
+            If you haven't done so, you will need to clone the repository.
+          </p>
+        </div>
+      </gr-dialog>
+    </gr-overlay>
+  </template>
+  <script src="gr-create-destination-dialog.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/change-list/gr-create-destination-dialog/gr-create-destination-dialog.js b/polygerrit-ui/app/elements/change-list/gr-create-destination-dialog/gr-create-destination-dialog.js
new file mode 100644
index 0000000..4d2802e
--- /dev/null
+++ b/polygerrit-ui/app/elements/change-list/gr-create-destination-dialog/gr-create-destination-dialog.js
@@ -0,0 +1,58 @@
+/**
+ * @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';
+
+  /**
+   * Fired when a destination has been picked. Event details contain the repo
+   * name and the branch name.
+   *
+   * @event confirm
+   */
+
+  Polymer({
+    is: 'gr-create-destination-dialog',
+    properties: {
+      _repo: String,
+      _branch: String,
+      _repoAndBranchSelected: {
+        type: Boolean,
+        value: false,
+        computed: '_computeRepoAndBranchSelected(_repo, _branch)',
+      },
+    },
+    open() {
+      this._repo = '';
+      this._branch = '';
+      this.$.createOverlay.open();
+    },
+
+    _handleClose() {
+      this.$.createOverlay.close();
+    },
+
+    _pickerConfirm() {
+      this.$.createOverlay.close();
+      const detail = {repo: this._repo, branch: this._branch};
+      this.dispatchEvent(new CustomEvent('confirm', {detail, bubbles: false}));
+    },
+
+    _computeRepoAndBranchSelected(repo, branch) {
+      return !!(repo && branch);
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/change-list/gr-dashboard-view/gr-dashboard-view.html b/polygerrit-ui/app/elements/change-list/gr-dashboard-view/gr-dashboard-view.html
index f04b7c6..b0ba8a2b 100644
--- a/polygerrit-ui/app/elements/change-list/gr-dashboard-view/gr-dashboard-view.html
+++ b/polygerrit-ui/app/elements/change-list/gr-dashboard-view/gr-dashboard-view.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,11 +15,19 @@
 limitations under the License.
 -->
 
-<link rel="import" href="../../../behaviors/rest-client-behavior/rest-client-behavior.html">
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../../behaviors/rest-client-behavior/rest-client-behavior.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 <link rel="import" href="../../change-list/gr-change-list/gr-change-list.html">
+<link rel="import" href="../../core/gr-reporting/gr-reporting.html">
+<link rel="import" href="../../shared/gr-button/gr-button.html">
+<link rel="import" href="../../shared/gr-dialog/gr-dialog.html">
+<link rel="import" href="../../shared/gr-overlay/gr-overlay.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
+<link rel="import" href="../gr-create-commands-dialog/gr-create-commands-dialog.html">
+<link rel="import" href="../gr-create-change-help/gr-create-change-help.html">
+<link rel="import" href="../gr-create-destination-dialog/gr-create-destination-dialog.html">
+<link rel="import" href="../gr-user-header/gr-user-header.html">
 
 <dom-module id="gr-dashboard-view">
   <template>
@@ -28,28 +37,97 @@
         display: block;
       }
       .loading {
-        color: #666;
+        color: var(--deemphasized-text-color);
         padding: 1em var(--default-horizontal-margin);
       }
       gr-change-list {
         width: 100%;
       }
+      gr-user-header {
+        border-bottom: 1px solid var(--border-color);
+      }
+      .banner {
+        align-items: center;
+        background-color: var(--comment-background-color);
+        border-bottom: 1px solid var(--border-color);
+        display: flex;
+        justify-content: space-between;
+        padding: .25em var(--default-horizontal-margin);
+      }
+      .banner gr-button {
+        --gr-button: {
+          color: var(--primary-text-color);
+        }
+      }
+      .hide {
+        display: none;
+      }
+      #emptyOutgoing {
+        display: block;
+      }
       @media only screen and (max-width: 50em) {
         .loading {
           padding: 0 var(--default-horizontal-margin);
         }
       }
     </style>
+    <div class$="banner [[_computeBannerClass(_showDraftsBanner)]]">
+      <div>
+        You have draft comments on closed changes.
+        <a href$="[[_computeDraftsLink(_showDraftsBanner)]]" target="_blank">(view all)</a>
+      </div>
+      <div>
+        <gr-button
+            class="delete"
+            link
+            on-tap="_handleOpenDeleteDialog">Delete All</gr-button>
+      </div>
+    </div>
     <div class="loading" hidden$="[[!_loading]]">Loading...</div>
     <div hidden$="[[_loading]]" hidden>
+      <gr-user-header
+          user-id="[[params.user]]"
+          class$="[[_computeUserHeaderClass(params)]]"></gr-user-header>
       <gr-change-list
           show-star
           show-reviewed-state
           account="[[account]]"
+          preferences="[[preferences]]"
           selected-index="{{viewState.selectedChangeIndex}}"
-          sections="[[_results]]"></gr-change-list>
+          sections="[[_results]]"
+          on-toggle-star="_handleToggleStar"
+          on-toggle-reviewed="_handleToggleReviewed">
+        <div id="emptyOutgoing" slot="empty-outgoing">
+          <template is="dom-if" if="[[_showNewUserHelp]]">
+            <gr-create-change-help on-create-tap="createChangeTap"></gr-create-change-help>
+          </template>
+          <template is="dom-if" if="[[!_showNewUserHelp]]">
+            No changes
+          </template>
+        </div>
+      </gr-change-list>
     </div>
+    <gr-overlay id="confirmDeleteOverlay" with-backdrop>
+      <gr-dialog
+          id="confirmDeleteDialog"
+          confirm-label="Delete"
+          on-confirm="_handleConfirmDelete"
+          on-cancel="_closeConfirmDeleteOverlay">
+        <div class="header" slot="header">
+          Delete comments
+        </div>
+        <div class="main" slot="main">
+          Are you sure you want to delete all your draft comments in closed changes? This action
+          cannot be undone.
+        </div>
+      </gr-dialog>
+    </gr-overlay>
+    <gr-create-destination-dialog
+        id="destinationDialog"
+        on-confirm="_handleDestinationConfirm"></gr-create-destination-dialog>
+    <gr-create-commands-dialog id="commandsDialog"></gr-create-commands-dialog>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
+    <gr-reporting id="reporting"></gr-reporting>
   </template>
   <script src="gr-dashboard-view.js"></script>
 </dom-module>
diff --git a/polygerrit-ui/app/elements/change-list/gr-dashboard-view/gr-dashboard-view.js b/polygerrit-ui/app/elements/change-list/gr-dashboard-view/gr-dashboard-view.js
index 6c5bad3..56bc17c 100644
--- a/polygerrit-ui/app/elements/change-list/gr-dashboard-view/gr-dashboard-view.js
+++ b/polygerrit-ui/app/elements/change-list/gr-dashboard-view/gr-dashboard-view.js
@@ -1,41 +1,23 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
-  const DEFAULT_SECTIONS = [
-    {
-      name: 'Work in progress',
-      query: 'is:open owner:${user} is:wip',
-      selfOnly: true,
-    },
-    {
-      name: 'Outgoing reviews',
-      query: 'is:open owner:${user} -is:wip',
-    },
-    {
-      name: 'Incoming reviews',
-      query: 'is:open ((reviewer:${user} -owner:${user} -is:ignored) OR ' +
-          'assignee:${user}) -is:wip',
-    },
-    {
-      name: 'Recently closed',
-      query: 'is:closed (owner:${user} OR reviewer:${user} OR ' +
-          'assignee:${user})',
-      suffixForDashboard: '-age:4w limit:10',
-    },
-  ];
+  const PROJECT_PLACEHOLDER_PATTERN = /\$\{project\}/g;
 
   Polymer({
     is: 'gr-dashboard-view',
@@ -49,20 +31,26 @@
     properties: {
       account: {
         type: Object,
-        value() { return {}; },
+        value: null,
       },
+      preferences: Object,
       /** @type {{ selectedChangeIndex: number }} */
       viewState: Object,
+
+      /** @type {{ project: string, user: string }} */
       params: {
         type: Object,
       },
 
-      _results: Array,
-      _sectionMetadata: {
-        type: Array,
-        value() { return DEFAULT_SECTIONS; },
+      createChangeTap: {
+        type: Function,
+        value() {
+          return this._createChangeTap.bind(this);
+        },
       },
 
+      _results: Array,
+
       /**
        * For showing a "loading..." string during ajax requests.
        */
@@ -70,10 +58,20 @@
         type: Boolean,
         value: true,
       },
+
+      _showDraftsBanner: {
+        type: Boolean,
+        value: false,
+      },
+
+      _showNewUserHelp: {
+        type: Boolean,
+        value: false,
+      },
     },
 
     observers: [
-      '_userChanged(params.user)',
+      '_paramsChanged(params.*)',
     ],
 
     behaviors: [
@@ -88,53 +86,205 @@
       );
     },
 
+    attached() {
+      this._loadPreferences();
+    },
+
+    _loadPreferences() {
+      return this.$.restAPI.getLoggedIn().then(loggedIn => {
+        if (loggedIn) {
+          this.$.restAPI.getPreferences().then(preferences => {
+            this.preferences = preferences;
+          });
+        } else {
+          this.preferences = {};
+        }
+      });
+    },
+
+    _getProjectDashboard(project, dashboard) {
+      const errFn = response => {
+        this.fire('page-error', {response});
+      };
+      return this.$.restAPI.getDashboard(
+          project, dashboard, errFn).then(response => {
+            if (!response) {
+              return;
+            }
+            return {
+              title: response.title,
+              sections: response.sections.map(section => {
+                const suffix = response.foreach ? ' ' + response.foreach : '';
+                return {
+                  name: section.name,
+                  query:
+                      section.query.replace(
+                          PROJECT_PLACEHOLDER_PATTERN, project) + suffix,
+                };
+              }),
+            };
+          });
+    },
+
     _computeTitle(user) {
-      if (user === 'self') {
+      if (!user || user === 'self') {
         return 'My Reviews';
       }
       return 'Dashboard for ' + user;
     },
 
-    /**
-     * Allows a refresh if menu item is selected again.
-     */
-    _userChanged(user) {
-      if (!user) { return; }
+    _isViewActive(params) {
+      return params.view === Gerrit.Nav.View.DASHBOARD;
+    },
+
+    _paramsChanged(paramsChangeRecord) {
+      const params = paramsChangeRecord.base;
+
+      if (!this._isViewActive(params)) {
+        return Promise.resolve();
+      }
+
+      const user = params.user || 'self';
 
       // NOTE: This method may be called before attachment. Fire title-change
       // in an async so that attachment to the DOM can take place first.
-      this.async(
-          () => this.fire('title-change', {title: this._computeTitle(user)}));
+      const title = params.title || this._computeTitle(user);
+      this.async(() => this.fire('title-change', {title}));
+      return this._reload();
+    },
 
+    /**
+     * Reloads the element.
+     *
+     * @return {Promise<!Object>}
+     */
+    _reload() {
       this._loading = true;
-      const sections = this._sectionMetadata.filter(
-          section => (user === 'self' || !section.selfOnly));
-      const queries =
-          sections.map(
-              section => this._dashboardQueryForSection(section, user));
-      this.$.restAPI.getChanges(null, queries, null, this.options)
-          .then(results => {
-            this._results = sections.map((section, i) => {
-              return {
-                sectionName: section.name,
-                query: queries[i],
-                results: results[i],
-              };
-            });
-            this._loading = false;
+      const {project, dashboard, title, user, sections} = this.params;
+      const dashboardPromise = project ?
+          this._getProjectDashboard(project, dashboard) :
+          Promise.resolve(Gerrit.Nav.getUserDashboard(
+              user,
+              sections,
+              title || this._computeTitle(user)));
+
+      const checkForNewUser = !project && user === 'self';
+      return dashboardPromise
+          .then(res => this._fetchDashboardChanges(res, checkForNewUser))
+          .then(() => {
+            this._maybeShowDraftsBanner();
+            this.$.reporting.dashboardDisplayed();
           }).catch(err => {
-            this._loading = false;
-            console.warn(err.message);
+            console.warn(err);
+          }).then(() => { this._loading = false; });
+    },
+
+    /**
+     * Fetches the changes for each dashboard section and sets this._results
+     * with the response.
+     *
+     * @param {!Object} res
+     * @param {boolean} checkForNewUser
+     * @return {Promise}
+     */
+    _fetchDashboardChanges(res, checkForNewUser) {
+      if (!res) { return Promise.resolve(); }
+
+      const queries = res.sections
+          .map(section => section.suffixForDashboard ?
+              section.query + ' ' + section.suffixForDashboard :
+              section.query);
+
+      if (checkForNewUser) {
+        queries.push('owner:self');
+      }
+
+      return this.$.restAPI.getChanges(null, queries, null, this.options)
+          .then(changes => {
+            if (checkForNewUser) {
+              // Last set of results is not meant for dashboard display.
+              const lastResultSet = changes.pop();
+              this._showNewUserHelp = lastResultSet.length == 0;
+            }
+            this._results = changes.map((results, i) => ({
+              sectionName: res.sections[i].name,
+              query: res.sections[i].query,
+              results,
+              isOutgoing: res.sections[i].isOutgoing,
+            })).filter((section, i) => i < res.sections.length && (
+                !res.sections[i].hideIfEmpty ||
+                section.results.length));
           });
     },
 
-    _dashboardQueryForSection(section, user) {
-      const query =
-          section.suffixForDashboard ?
-          section.query + ' ' + section.suffixForDashboard :
-          section.query;
-      return query.replace(/\$\{user\}/g, user);
+    _computeUserHeaderClass(params) {
+      if (!params || !!params.project || !params.user
+          || params.user === 'self') {
+        return 'hide';
+      }
+      return '';
     },
 
+    _handleToggleStar(e) {
+      this.$.restAPI.saveChangeStarred(e.detail.change._number,
+          e.detail.starred);
+    },
+
+    _handleToggleReviewed(e) {
+      this.$.restAPI.saveChangeReviewed(e.detail.change._number,
+          e.detail.reviewed);
+    },
+
+    /**
+     * Banner is shown if a user is on their own dashboard and they have draft
+     * comments on closed changes.
+     */
+    _maybeShowDraftsBanner() {
+      this._showDraftsBanner = false;
+      if (!(this.params.user === 'self')) { return; }
+
+      const draftSection = this._results
+          .find(section => section.query === 'has:draft');
+      if (!draftSection || !draftSection.results.length) { return; }
+
+      const closedChanges = draftSection.results
+          .filter(change => !this.changeIsOpen(change.status));
+      if (!closedChanges.length) { return; }
+
+      this._showDraftsBanner = true;
+    },
+
+    _computeBannerClass(show) {
+      return show ? '' : 'hide';
+    },
+
+    _handleOpenDeleteDialog() {
+      this.$.confirmDeleteOverlay.open();
+    },
+
+    _handleConfirmDelete() {
+      this.$.confirmDeleteDialog.disabled = true;
+      return this.$.restAPI.deleteDraftComments('-is:open').then(() => {
+        this._closeConfirmDeleteOverlay();
+        this._reload();
+      });
+    },
+
+    _closeConfirmDeleteOverlay() {
+      this.$.confirmDeleteOverlay.close();
+    },
+
+    _computeDraftsLink() {
+      return Gerrit.Nav.getUrlForSearchQuery('has:draft -is:open');
+    },
+
+    _createChangeTap(e) {
+      this.$.destinationDialog.open();
+    },
+
+    _handleDestinationConfirm(e) {
+      this.$.commandsDialog.branch = e.detail.branch;
+      this.$.commandsDialog.open();
+    },
   });
 })();
diff --git a/polygerrit-ui/app/elements/change-list/gr-dashboard-view/gr-dashboard-view_test.html b/polygerrit-ui/app/elements/change-list/gr-dashboard-view/gr-dashboard-view_test.html
index 2edf26f..3a3454d 100644
--- a/polygerrit-ui/app/elements/change-list/gr-dashboard-view/gr-dashboard-view_test.html
+++ b/polygerrit-ui/app/elements/change-list/gr-dashboard-view/gr-dashboard-view_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -35,66 +36,320 @@
   suite('gr-dashboard-view tests', () => {
     let element;
     let sandbox;
+    let paramsChangedPromise;
 
     setup(() => {
+      stub('gr-rest-api-interface', {
+        getLoggedIn() { return Promise.resolve(false); },
+        getAccountDetails() { return Promise.resolve({}); },
+        getAccountStatus() { return Promise.resolve(false); },
+      });
       element = fixture('basic');
       sandbox = sinon.sandbox.create();
       getChangesStub = sandbox.stub(element.$.restAPI, 'getChanges',
-          () => Promise.resolve());
+          (_, qs) => Promise.resolve(qs.map(() => [])));
+
+      let resolver;
+      paramsChangedPromise = new Promise(resolve => {
+        resolver = resolve;
+      });
+      const paramsChanged = element._paramsChanged.bind(element);
+      sandbox.stub(element, '_paramsChanged', params => {
+        paramsChanged(params).then(() => resolver());
+      });
     });
 
     teardown(() => {
       sandbox.restore();
     });
 
-    test('nothing happens when user param is falsy', () => {
-      element.params = {};
-      flushAsynchronousOperations();
-      assert.equal(getChangesStub.callCount, 0);
+    suite('drafts banner functionality', () => {
+      suite('_maybeShowDraftsBanner', () => {
+        test('not dashboard/self', () => {
+          element.params = {user: 'notself'};
+          element._maybeShowDraftsBanner();
+          assert.isFalse(element._showDraftsBanner);
+        });
 
-      element.params = {user: ''};
-      flushAsynchronousOperations();
-      assert.equal(getChangesStub.callCount, 0);
-    });
+        test('no drafts at all', () => {
+          element.params = {user: 'self'};
+          element._results = [];
+          element._maybeShowDraftsBanner();
+          assert.isFalse(element._showDraftsBanner);
+        });
 
-    test('content is refreshed when user param is updated', () => {
-      element.params = {user: 'self'};
-      flushAsynchronousOperations();
-      assert.equal(getChangesStub.callCount, 1);
-    });
+        test('no drafts on open changes', () => {
+          element.params = {user: 'self'};
+          element._results = [{query: 'has:draft', results: [{status: '_'}]}];
+          sandbox.stub(element, 'changeIsOpen').returns(true);
+          element._maybeShowDraftsBanner();
+          assert.isFalse(element._showDraftsBanner);
+        });
 
-    test('viewing another user\'s dashboard omits selfOnly sections', () => {
-      element._sectionMetadata = [
-        {query: '1'},
-        {query: '2', selfOnly: true},
-      ];
+        test('no drafts on open changes', () => {
+          element.params = {user: 'self'};
+          element._results = [{query: 'has:draft', results: [{status: '_'}]}];
+          sandbox.stub(element, 'changeIsOpen').returns(false);
+          element._maybeShowDraftsBanner();
+          assert.isTrue(element._showDraftsBanner);
+        });
+      });
 
-      element.params = {user: 'self'};
-      flushAsynchronousOperations();
-      assert.isTrue(
-          getChangesStub.calledWith(null, ['1', '2'], null, element.options));
+      test('_showDraftsBanner', () => {
+        element._showDraftsBanner = false;
+        flushAsynchronousOperations();
+        assert.isTrue(isHidden(element.$$('.banner')));
 
-      element.params = {user: 'user'};
-      flushAsynchronousOperations();
-      assert.isTrue(
-          getChangesStub.calledWith(null, ['1'], null, element.options));
-    });
+        element._showDraftsBanner = true;
+        flushAsynchronousOperations();
+        assert.isFalse(isHidden(element.$$('.banner')));
+      });
 
-    test('_dashboardQueryForSection', () => {
-      const query = 'query for ${user}';
-      const suffixForDashboard = 'suffix for ${user}';
-      assert.equal(
-          element._dashboardQueryForSection({query}, 'user'),
-          'query for user');
-      assert.equal(
-          element._dashboardQueryForSection(
-              {query, suffixForDashboard}, 'user'),
-          'query for user suffix for user');
+      test('delete tap opens dialog', () => {
+        sandbox.stub(element, '_handleOpenDeleteDialog');
+        element._showDraftsBanner = true;
+        flushAsynchronousOperations();
+
+        MockInteractions.tap(element.$$('.banner .delete'));
+        assert.isTrue(element._handleOpenDeleteDialog.called);
+      });
+
+      test('delete comments flow', async () => {
+        sandbox.spy(element, '_handleConfirmDelete');
+        sandbox.stub(element, '_reload');
+
+        // Set up control over timing of when RPC resolves.
+        let deleteDraftCommentsPromiseResolver;
+        const deleteDraftCommentsPromise = new Promise(resolve => {
+          deleteDraftCommentsPromiseResolver = resolve;
+        });
+        sandbox.stub(element.$.restAPI, 'deleteDraftComments')
+            .returns(deleteDraftCommentsPromise);
+
+        // Open confirmation dialog and tap confirm button.
+        await element.$.confirmDeleteOverlay.open();
+        MockInteractions.tap(element.$.confirmDeleteDialog.$.confirm);
+        flushAsynchronousOperations();
+        assert.isTrue(element.$.restAPI.deleteDraftComments
+            .calledWithExactly('-is:open'));
+        assert.isTrue(element.$.confirmDeleteDialog.disabled);
+        assert.equal(element._reload.callCount, 0);
+
+        // Verify state after RPC resolves.
+        deleteDraftCommentsPromiseResolver([]);
+        await deleteDraftCommentsPromise;
+        assert.equal(element._reload.callCount, 1);
+      });
     });
 
     test('_computeTitle', () => {
       assert.equal(element._computeTitle('self'), 'My Reviews');
       assert.equal(element._computeTitle('not self'), 'Dashboard for not self');
     });
+
+    suite('_isViewActive', () => {
+      test('nothing happens when user param is falsy', () => {
+        element.params = {};
+        flushAsynchronousOperations();
+        assert.equal(getChangesStub.callCount, 0);
+
+        element.params = {user: ''};
+        flushAsynchronousOperations();
+        assert.equal(getChangesStub.callCount, 0);
+      });
+
+      test('content is refreshed when user param is updated', () => {
+        element.params = {
+          view: Gerrit.Nav.View.DASHBOARD,
+          user: 'self',
+        };
+        return paramsChangedPromise.then(() => {
+          assert.equal(getChangesStub.callCount, 1);
+        });
+      });
+    });
+
+    suite('selfOnly sections', () => {
+      test('viewing self dashboard includes selfOnly sections', () => {
+        element.params = {
+          view: Gerrit.Nav.View.DASHBOARD,
+          sections: [
+            {query: '1'},
+            {query: '2', selfOnly: true},
+          ],
+          user: 'self',
+        };
+        return paramsChangedPromise.then(() => {
+          assert.isTrue(
+              getChangesStub.calledWith(
+                  null, ['1', '2', 'owner:self'], null, element.options));
+        });
+      });
+
+      test('viewing another user\'s dashboard omits selfOnly sections', () => {
+        element.params = {
+          view: Gerrit.Nav.View.DASHBOARD,
+          sections: [
+            {query: '1'},
+            {query: '2', selfOnly: true},
+          ],
+          user: 'user',
+        };
+        return paramsChangedPromise.then(() => {
+          assert.isTrue(
+              getChangesStub.calledWith(
+                  null, ['1'], null, element.options));
+        });
+      });
+    });
+
+    test('suffixForDashboard is included in getChanges query', () => {
+      element.params = {
+        view: Gerrit.Nav.View.DASHBOARD,
+        sections: [
+          {query: '1'},
+          {query: '2', suffixForDashboard: 'suffix'},
+        ],
+      };
+      return paramsChangedPromise.then(() => {
+        assert.isTrue(getChangesStub.calledOnce);
+        assert.deepEqual(
+            getChangesStub.firstCall.args,
+            [null, ['1', '2 suffix'], null, element.options]);
+      });
+    });
+
+    suite('_getProjectDashboard', () => {
+      test('dashboard with foreach', () => {
+        sandbox.stub(element.$.restAPI, 'getDashboard', () => Promise.resolve({
+          title: 'title',
+          // Note: ${project} should not be resolved in foreach!
+          foreach: 'foreach for ${project}',
+          sections: [
+            {name: 'section 1', query: 'query 1'},
+            {name: 'section 2', query: '${project} query 2'},
+          ],
+        }));
+        return element._getProjectDashboard('project', '').then(dashboard => {
+          assert.deepEqual(
+              dashboard,
+              {
+                title: 'title',
+                sections: [
+                  {name: 'section 1', query: 'query 1 foreach for ${project}'},
+                  {
+                    name: 'section 2',
+                    query: 'project query 2 foreach for ${project}',
+                  },
+                ],
+              });
+        });
+      });
+
+      test('dashboard without foreach', () => {
+        sandbox.stub(element.$.restAPI, 'getDashboard', () => Promise.resolve({
+          title: 'title',
+          sections: [
+            {name: 'section 1', query: 'query 1'},
+            {name: 'section 2', query: '${project} query 2'},
+          ],
+        }));
+        return element._getProjectDashboard('project', '').then(dashboard => {
+          assert.deepEqual(
+              dashboard,
+              {
+                title: 'title',
+                sections: [
+                  {name: 'section 1', query: 'query 1'},
+                  {name: 'section 2', query: 'project query 2'},
+                ],
+              });
+        });
+      });
+    });
+
+    test('hideIfEmpty sections', () => {
+      const sections = [
+        {name: 'test1', query: 'test1', hideIfEmpty: true},
+        {name: 'test2', query: 'test2', hideIfEmpty: true},
+      ];
+      getChangesStub.restore();
+      sandbox.stub(element.$.restAPI, 'getChanges')
+          .returns(Promise.resolve([[], ['nonempty']]));
+
+      return element._fetchDashboardChanges({sections}, false).then(() => {
+        assert.equal(element._results.length, 1);
+        assert.equal(element._results[0].sectionName, 'test2');
+      });
+    });
+
+    test('preserve isOutgoing sections', () => {
+      const sections = [
+        {name: 'test1', query: 'test1', isOutgoing: true},
+        {name: 'test2', query: 'test2'},
+      ];
+      getChangesStub.restore();
+      sandbox.stub(element.$.restAPI, 'getChanges')
+          .returns(Promise.resolve([[], []]));
+
+      return element._fetchDashboardChanges({sections}, false).then(() => {
+        assert.equal(element._results.length, 2);
+        assert.isTrue(element._results[0].isOutgoing);
+        assert.isNotOk(element._results[1].isOutgoing);
+      });
+    });
+
+    test('_showNewUserHelp', () => {
+      element._loading = false;
+      element._showNewUserHelp = false;
+      flushAsynchronousOperations();
+
+      assert.equal(element.$.emptyOutgoing.textContent.trim(), 'No changes');
+      assert.isNotOk(element.$$('gr-create-change-help'));
+      element._showNewUserHelp = true;
+      flushAsynchronousOperations();
+
+      assert.notEqual(element.$.emptyOutgoing.textContent.trim(), 'No changes');
+      assert.isOk(element.$$('gr-create-change-help'));
+    });
+
+    test('_computeUserHeaderClass', () => {
+      assert.equal(element._computeUserHeaderClass(undefined), 'hide');
+      assert.equal(element._computeUserHeaderClass({}), 'hide');
+      assert.equal(element._computeUserHeaderClass({user: 'self'}), 'hide');
+      assert.equal(element._computeUserHeaderClass({user: 'user'}), '');
+      assert.equal(
+          element._computeUserHeaderClass({project: 'p', user: 'user'}),
+          'hide');
+    });
+
+    test('404 page', done => {
+      const response = {status: 404};
+      sandbox.stub(element.$.restAPI, 'getDashboard',
+          async (project, dashboard, errFn) => {
+            errFn(response);
+          });
+      element.addEventListener('page-error', e => {
+        assert.strictEqual(e.detail.response, response);
+        done();
+      });
+      element.params = {
+        view: Gerrit.Nav.View.DASHBOARD,
+        project: 'project',
+        dashboard: 'dashboard',
+      };
+    });
+
+    test('params change triggers dashboardDisplayed()', () => {
+      sandbox.stub(element.$.reporting, 'dashboardDisplayed');
+      element.params = {
+        view: Gerrit.Nav.View.DASHBOARD,
+        project: 'project',
+        dashboard: 'dashboard',
+      };
+      return paramsChangedPromise.then(() => {
+        assert.isTrue(element.$.reporting.dashboardDisplayed.calledOnce);
+      });
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/change-list/gr-repo-header/gr-repo-header.html b/polygerrit-ui/app/elements/change-list/gr-repo-header/gr-repo-header.html
new file mode 100644
index 0000000..2328725
--- /dev/null
+++ b/polygerrit-ui/app/elements/change-list/gr-repo-header/gr-repo-header.html
@@ -0,0 +1,41 @@
+<!--
+@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="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../../styles/dashboard-header-styles.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../../core/gr-navigation/gr-navigation.html">
+<link rel="import" href="../../shared/gr-date-formatter/gr-date-formatter.html">
+<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
+
+<dom-module id="gr-repo-header">
+  <template>
+    <style include="shared-styles"></style>
+    <style include="dashboard-header-styles"></style>
+    <div class="info">
+      <h1 class$="name">
+        [[repo]]
+        <hr/>
+      </h1>
+      <div>
+        <span>Detail:</span> <a href$="[[_repoUrl]]">Repo settings</a>
+      </div>
+    </div>
+    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
+  </template>
+  <script src="gr-repo-header.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/change-list/gr-repo-header/gr-repo-header.js b/polygerrit-ui/app/elements/change-list/gr-repo-header/gr-repo-header.js
new file mode 100644
index 0000000..cd6eb77
--- /dev/null
+++ b/polygerrit-ui/app/elements/change-list/gr-repo-header/gr-repo-header.js
@@ -0,0 +1,40 @@
+/**
+ * @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-repo-header',
+    properties: {
+      /** @type {?String} */
+      repo: {
+        type: String,
+        observer: '_repoChanged',
+      },
+      /** @type {String|null} */
+      _repoUrl: String,
+    },
+
+    _repoChanged(repoName) {
+      if (!repoName) {
+        this._repoUrl = null;
+        return;
+      }
+      this._repoUrl = Gerrit.Nav.getUrlForRepo(repoName);
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/change-list/gr-repo-header/gr-repo-header_test.html b/polygerrit-ui/app/elements/change-list/gr-repo-header/gr-repo-header_test.html
new file mode 100644
index 0000000..a561e09
--- /dev/null
+++ b/polygerrit-ui/app/elements/change-list/gr-repo-header/gr-repo-header_test.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<!--
+@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.
+-->
+
+<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+<title>gr-repo-header</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-repo-header.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-repo-header></gr-repo-header>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-repo-header tests', () => {
+    let element;
+    let sandbox;
+
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+      element = fixture('basic');
+    });
+
+    teardown(() => { sandbox.restore(); });
+
+    test('loads and clears account info', done => {
+      sandbox.stub(element.$.restAPI, 'getAccountDetails')
+          .returns(Promise.resolve({
+            name: 'foo',
+            email: 'bar',
+            registered_on: '2015-03-12 18:32:08.000000000',
+          }));
+      sandbox.stub(element.$.restAPI, 'getAccountStatus')
+          .returns(Promise.resolve('baz'));
+
+      element.userId = 'foo.bar@baz';
+      flush(() => {
+        assert.isOk(element._accountDetails);
+        assert.isOk(element._status);
+
+        element.userId = null;
+        flush(() => {
+          flushAsynchronousOperations();
+          assert.isNull(element._accountDetails);
+          assert.isNull(element._status);
+
+          done();
+        });
+      });
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/change-list/gr-user-header/gr-user-header.html b/polygerrit-ui/app/elements/change-list/gr-user-header/gr-user-header.html
index d3d0736..89e2b7d 100644
--- a/polygerrit-ui/app/elements/change-list/gr-user-header/gr-user-header.html
+++ b/polygerrit-ui/app/elements/change-list/gr-user-header/gr-user-header.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -19,35 +20,13 @@
 <link rel="import" href="../../shared/gr-avatar/gr-avatar.html">
 <link rel="import" href="../../shared/gr-date-formatter/gr-date-formatter.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
+<link rel="import" href="../../../styles/dashboard-header-styles.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 
 <dom-module id="gr-user-header">
   <template>
-    <style include="shared-styles">
-      :host {
-        display: block;
-        height: 9em;
-        width: 100%;
-      }
-      gr-avatar {
-        display: inline-block;
-        height: 7em;
-        left: 1em;
-        margin: 1em;
-        top: 1em;
-        width: 7em;
-      }
-      .info {
-        display: inline-block;
-        padding: 1em;
-        vertical-align: top;
-      }
-      .info > div > span {
-        display: inline-block;
-        font-weight: bold;
-        text-align: right;
-        width: 4em;
-      }
+    <style include="shared-styles"></style>
+    <style include="dashboard-header-styles">
       .name {
         display: inline-block;
       }
diff --git a/polygerrit-ui/app/elements/change-list/gr-user-header/gr-user-header.js b/polygerrit-ui/app/elements/change-list/gr-user-header/gr-user-header.js
index d09e865..cf5fefd 100644
--- a/polygerrit-ui/app/elements/change-list/gr-user-header/gr-user-header.js
+++ b/polygerrit-ui/app/elements/change-list/gr-user-header/gr-user-header.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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';
 
diff --git a/polygerrit-ui/app/elements/change-list/gr-user-header/gr-user-header_test.html b/polygerrit-ui/app/elements/change-list/gr-user-header/gr-user-header_test.html
index 4ae8db4..c33be3b 100644
--- a/polygerrit-ui/app/elements/change-list/gr-user-header/gr-user-header_test.html
+++ b/polygerrit-ui/app/elements/change-list/gr-user-header/gr-user-header_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/change/gr-account-entry/gr-account-entry.html b/polygerrit-ui/app/elements/change/gr-account-entry/gr-account-entry.html
index 4931ff1..582c83b 100644
--- a/polygerrit-ui/app/elements/change/gr-account-entry/gr-account-entry.html
+++ b/polygerrit-ui/app/elements/change/gr-account-entry/gr-account-entry.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -35,9 +36,11 @@
         placeholder="[[placeholder]]"
         threshold="[[suggestFrom]]"
         query="[[query]]"
+        allow-non-suggested-values="[[allowAnyInput]]"
         on-commit="_handleInputCommit"
         clear-on-commit
-        warn-uncommitted>
+        warn-uncommitted
+        text="{{_inputText}}">
     </gr-autocomplete>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
   </template>
diff --git a/polygerrit-ui/app/elements/change/gr-account-entry/gr-account-entry.js b/polygerrit-ui/app/elements/change/gr-account-entry/gr-account-entry.js
index d3f2386..715ddc0 100644
--- a/polygerrit-ui/app/elements/change/gr-account-entry/gr-account-entry.js
+++ b/polygerrit-ui/app/elements/change/gr-account-entry/gr-account-entry.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -22,10 +25,18 @@
      *
      * @event add
      */
+
+    /**
+     * When allowAnyInput is true, account-text-changed is fired when input text
+     * changed. This is needed so that the reply dialog's save button can be
+     * enabled for arbitrary cc's, which don't need a 'commit'.
+     *
+     * @event account-text-changed
+     */
     properties: {
+      allowAnyInput: Boolean,
       borderless: Boolean,
       change: Object,
-      _config: Object,
       filter: Function,
       placeholder: String,
       /**
@@ -51,6 +62,15 @@
           return this._getReviewerSuggestions.bind(this);
         },
       },
+
+      _config: Object,
+      /** The value of the autocomplete entry. */
+      _inputText: {
+        type: String,
+        observer: '_inputTextChanged',
+      },
+
+      _loggedIn: Boolean,
     },
 
     behaviors: [
@@ -61,6 +81,9 @@
       this.$.restAPI.getConfig().then(cfg => {
         this._config = cfg;
       });
+      this.$.restAPI.getLoggedIn().then(loggedIn => {
+        this._loggedIn = loggedIn;
+      });
     },
 
     get focusStart() {
@@ -92,17 +115,26 @@
       return this.getUserName(this._config, reviewer, false);
     },
 
+    _inputTextChanged(text) {
+      if (text.length && this.allowAnyInput) {
+        this.dispatchEvent(new CustomEvent('account-text-changed',
+            {bubbles: true}));
+      }
+    },
+
     _makeSuggestion(reviewer) {
       let name;
       let value;
       const generateStatusStr = function(account) {
-        return account.status ? ' (' + account.status + ')' : '';
+        return account.status ? '(' + account.status + ')' : '';
       };
       if (reviewer.account) {
         // Reviewer is an account suggestion from getChangeSuggestedReviewers.
         const reviewerName = this._accountOrAnon(reviewer.account);
-        name = reviewerName + ' <' + reviewer.account.email + '>' +
-            generateStatusStr(reviewer.account);
+        const reviewerEmail = this._reviewerEmail(reviewer.account.email);
+        const reviewerStatus = generateStatusStr(reviewer.account);
+        name = [reviewerName, reviewerEmail, reviewerStatus]
+            .filter(p => p.length > 0).join(' ');
         value = reviewer;
       } else if (reviewer.group) {
         // Reviewer is a group suggestion from getChangeSuggestedReviewers.
@@ -111,15 +143,19 @@
       } else if (reviewer._account_id) {
         // Reviewer is an account suggestion from getSuggestedAccounts.
         const reviewerName = this._accountOrAnon(reviewer);
-        name = reviewerName + ' <' + reviewer.email + '>' +
-            generateStatusStr(reviewer);
+        const reviewerEmail = this._reviewerEmail(reviewer.email);
+        const reviewerStatus = generateStatusStr(reviewer);
+        name = [reviewerName, reviewerEmail, reviewerStatus]
+            .filter(p => p.length > 0).join(' ');
         value = {account: reviewer, count: 1};
       }
       return {name, value};
     },
 
     _getReviewerSuggestions(input) {
-      if (!this.change || !this.change._number) { return Promise.resolve([]); }
+      if (!this.change || !this.change._number || !this._loggedIn) {
+        return Promise.resolve([]);
+      }
 
       const api = this.$.restAPI;
       const xhr = this.allowAnyUser ?
@@ -136,5 +172,13 @@
             .map(this._makeSuggestion.bind(this));
       });
     },
+
+    _reviewerEmail(email) {
+      if (typeof email !== 'undefined') {
+        return '<' + email + '>';
+      }
+
+      return '';
+    },
   });
 })();
diff --git a/polygerrit-ui/app/elements/change/gr-account-entry/gr-account-entry_test.html b/polygerrit-ui/app/elements/change/gr-account-entry/gr-account-entry_test.html
index a7bf1e4..20d127d 100644
--- a/polygerrit-ui/app/elements/change/gr-account-entry/gr-account-entry_test.html
+++ b/polygerrit-ui/app/elements/change/gr-account-entry/gr-account-entry_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -55,6 +56,15 @@
         status: opt_status,
       };
     };
+    let _nextAccountId3 = 0;
+    const makeAccount3 = function(opt_status) {
+      const accountId3 = ++_nextAccountId3;
+      return {
+        _account_id: accountId3,
+        name: 'name ' + accountId3,
+        status: opt_status,
+      };
+    };
 
     let owner;
     let existingReviewer1;
@@ -64,7 +74,7 @@
     let suggestion3;
     let element;
 
-    setup(() => {
+    setup(done => {
       owner = makeAccount();
       existingReviewer1 = makeAccount();
       existingReviewer2 = makeAccount();
@@ -77,6 +87,10 @@
         },
       };
 
+      stub('gr-rest-api-interface', {
+        getLoggedIn() { return Promise.resolve(true); },
+      });
+
       element = fixture('basic');
       element.change = {
         _number: 42,
@@ -87,6 +101,7 @@
         },
       };
       sandbox = sinon.sandbox.create();
+      return flush(done);
     });
 
     teardown(() => {
@@ -109,6 +124,7 @@
       test('_makeSuggestion formats account or group accordingly', () => {
         let account = makeAccount();
         const account2 = makeAccount2();
+        const account3 = makeAccount3();
         let suggestion = element._makeSuggestion({account});
         assert.deepEqual(suggestion, {
           name: account.name + ' <' + account.email + '>',
@@ -148,6 +164,22 @@
           name: account.name + ' <' + account.email + '> (OOO)',
           value: {account, count: 1},
         });
+
+        sandbox.stub(element, '_reviewerEmail',
+            () => { return ''; });
+
+        suggestion = element._makeSuggestion(account3);
+        assert.deepEqual(suggestion, {
+          name: account3.name,
+          value: {account: account3, count: 1},
+        });
+      });
+
+      test('_reviewerEmail', () => {
+        assert.equal(
+            element._reviewerEmail('email@gerritreview.com'),
+            '<email@gerritreview.com>');
+        assert.equal(element._reviewerEmail(undefined), '');
       });
 
       test('_getReviewerSuggestions excludes owner+reviewers', done => {
@@ -167,6 +199,19 @@
           }).then(done);
         });
       });
+
+      test('_getReviewerSuggestions short circuits when logged out', () => {
+        // API call is already stubbed.
+        const xhrSpy = element.$.restAPI.getChangeSuggestedReviewers;
+        element._loggedIn = false;
+        return element._getReviewerSuggestions('').then(() => {
+          assert.isFalse(xhrSpy.called);
+          element._loggedIn = true;
+          return element._getReviewerSuggestions('').then(() => {
+            assert.isTrue(xhrSpy.called);
+          });
+        });
+      });
     });
 
     test('allowAnyUser', done => {
@@ -191,6 +236,30 @@
         });
       });
     });
+    test('account-text-changed fired when input text changed and allowAnyInput',
+        () => {
+          // Spy on query, as that is called when _updateSuggestions proceeds.
+          const changeStub = sandbox.stub();
+          element.allowAnyInput = true;
+          sandbox.stub(element.$.restAPI, 'getChangeSuggestedReviewers')
+              .returns(Promise.resolve([]));
+          element.addEventListener('account-text-changed', changeStub);
+          element.$.input.text = 'a';
+          assert.isTrue(changeStub.calledOnce);
+          element.$.input.text = 'ab';
+          assert.isTrue(changeStub.calledTwice);
+        });
+
+    test('account-text-changed not fired when input text changed without ' +
+        'allowAnyUser', () => {
+          // Spy on query, as that is called when _updateSuggestions proceeds.
+      const changeStub = sandbox.stub();
+      sandbox.stub(element.$.restAPI, 'getChangeSuggestedReviewers')
+          .returns(Promise.resolve([]));
+      element.addEventListener('account-text-changed', changeStub);
+      element.$.input.text = 'a';
+      assert.isFalse(changeStub.called);
+    });
 
     test('setText', () => {
       // Spy on query, as that is called when _updateSuggestions proceeds.
diff --git a/polygerrit-ui/app/elements/change/gr-account-list/gr-account-list.html b/polygerrit-ui/app/elements/change/gr-account-list/gr-account-list.html
index 1c78774..1bfc5eb 100644
--- a/polygerrit-ui/app/elements/change/gr-account-list/gr-account-list.html
+++ b/polygerrit-ui/app/elements/change/gr-account-list/gr-account-list.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -69,6 +70,7 @@
         placeholder="[[placeholder]]"
         on-add="_handleAdd"
         on-input-keydown="_handleInputKeydown"
+        allow-any-input="[[allowAnyInput]]"
         allow-any-user="[[allowAnyUser]]">
     </gr-account-entry>
   </template>
diff --git a/polygerrit-ui/app/elements/change/gr-account-list/gr-account-list.js b/polygerrit-ui/app/elements/change/gr-account-list/gr-account-list.js
index a8c3e2b..950c1e8 100644
--- a/polygerrit-ui/app/elements/change/gr-account-list/gr-account-list.js
+++ b/polygerrit-ui/app/elements/change/gr-account-list/gr-account-list.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
diff --git a/polygerrit-ui/app/elements/change/gr-account-list/gr-account-list_test.html b/polygerrit-ui/app/elements/change/gr-account-list/gr-account-list_test.html
index 7097b86..544238b 100644
--- a/polygerrit-ui/app/elements/change/gr-account-list/gr-account-list_test.html
+++ b/polygerrit-ui/app/elements/change/gr-account-list/gr-account-list_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.html b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.html
index eb170ae..278875e 100644
--- a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.html
+++ b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,65 +15,97 @@
 limitations under the License.
 -->
 
+<link rel="import" href="../../../bower_components/polymer/polymer.html">
+
 <link rel="import" href="../../../behaviors/gr-patch-set-behavior/gr-patch-set-behavior.html">
 <link rel="import" href="../../../behaviors/rest-client-behavior/rest-client-behavior.html">
-<link rel="import" href="../../../bower_components/polymer/polymer.html">
 <link rel="import" href="../../../bower_components/iron-input/iron-input.html">
-
+<link rel="import" href="../../admin/gr-create-change-dialog/gr-create-change-dialog.html">
 <link rel="import" href="../../core/gr-navigation/gr-navigation.html">
-
+<link rel="import" href="../../core/gr-reporting/gr-reporting.html">
 <link rel="import" href="../../shared/gr-button/gr-button.html">
+<link rel="import" href="../../shared/gr-dialog/gr-dialog.html">
 <link rel="import" href="../../shared/gr-dropdown/gr-dropdown.html">
+<link rel="import" href="../../shared/gr-icons/gr-icons.html">
 <link rel="import" href="../../shared/gr-js-api-interface/gr-js-api-interface.html">
 <link rel="import" href="../../shared/gr-overlay/gr-overlay.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
-
 <link rel="import" href="../gr-confirm-abandon-dialog/gr-confirm-abandon-dialog.html">
 <link rel="import" href="../gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog.html">
+<link rel="import" href="../gr-confirm-cherrypick-conflict-dialog/gr-confirm-cherrypick-conflict-dialog.html">
 <link rel="import" href="../gr-confirm-move-dialog/gr-confirm-move-dialog.html">
 <link rel="import" href="../gr-confirm-rebase-dialog/gr-confirm-rebase-dialog.html">
 <link rel="import" href="../gr-confirm-revert-dialog/gr-confirm-revert-dialog.html">
+<link rel="import" href="../gr-confirm-submit-dialog/gr-confirm-submit-dialog.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 
 <dom-module id="gr-change-actions">
   <template>
     <style include="shared-styles">
       :host {
-        display: inline-block;
+        display: flex;
         font-family: var(--font-family);
       }
+      #actionLoadingMessage,
+      #mainContent,
       section {
-        display: inline-block;
+        display: flex;
       }
+      #actionLoadingMessage,
       gr-button,
       gr-dropdown {
-        margin-left: .5em;
+        /* px because don't have the same font size */
+        margin-left: 8px;
       }
       #actionLoadingMessage {
-        color: #777;
+        align-items: center;
+        color: var(--deemphasized-text-color);
+      }
+      #confirmSubmitDialog .changeSubject {
+        margin: 1em;
+        text-align: center;
+      }
+      iron-icon {
+        color: inherit;
+        height: 1.2rem;
+        margin-right: .2rem;
+        width: 1.2rem;
+      }
+      gr-button {
+        min-height: 2.25em;
+      }
+      gr-dropdown {
+        --gr-button: {
+          min-height: 2.25em;
+        }
+      }
+      #moreActions iron-icon {
+        margin: 0;
+      }
+      #moreMessage,
+      .hidden {
+        display: none;
       }
       @media screen and (max-width: 50em) {
-        :host,
-        section,
-        gr-button,
-        gr-dropdown {
-          display: block;
+        #mainContent {
+          flex-wrap: wrap;
+        }
+        gr-button {
+          --gr-button: {
+            padding: .5em;
+            white-space: nowrap;
+          }
         }
         gr-button,
         gr-dropdown {
-          margin-bottom: .5em;
-          margin-left: 0;
-        }
-        .confirmDialog {
-          width: 90vw;
+          margin: 0;
         }
         #actionLoadingMessage {
-          display: block;
           margin: .5em;
           text-align: center;
         }
-        #mainContent.mobileOverlayOpened {
-          display: none;
+        #moreMessage {
+          display: inline;
         }
       }
     </style>
@@ -81,35 +114,65 @@
           id="actionLoadingMessage"
           hidden$="[[!_actionLoadingMessage]]">
         [[_actionLoadingMessage]]</span>
+        <section id="primaryActions"
+            hidden$="[[_shouldHideActions(_topLevelActions.*, _loading)]]">
+          <template
+              is="dom-repeat"
+              items="[[_topLevelPrimaryActions]]"
+              as="action">
+            <gr-button
+                link
+                title$="[[action.title]]"
+                has-tooltip="[[_computeHasTooltip(action.title)]]"
+                data-action-key$="[[action.__key]]"
+                data-action-type$="[[action.__type]]"
+                data-label$="[[action.label]]"
+                disabled$="[[_calculateDisabled(action, _hasKnownChainState)]]"
+                on-tap="_handleActionTap">
+                <iron-icon class$="[[_computeHasIcon(action)]]" icon$="gr-icons:[[action.icon]]"></iron-icon>
+              [[action.label]]
+            </gr-button>
+          </template>
+        </section>
+        <section id="secondaryActions"
+            hidden$="[[_shouldHideActions(_topLevelActions.*, _loading)]]">
+          <template
+              is="dom-repeat"
+              items="[[_topLevelSecondaryActions]]"
+              as="action">
+            <gr-button
+                link
+                title$="[[action.title]]"
+                has-tooltip="[[_computeHasTooltip(action.title)]]"
+                data-action-key$="[[action.__key]]"
+                data-action-type$="[[action.__type]]"
+                data-label$="[[action.label]]"
+                disabled$="[[_calculateDisabled(action, _hasKnownChainState)]]"
+                on-tap="_handleActionTap">
+              <iron-icon class$="[[_computeHasIcon(action)]]" icon$="gr-icons:[[action.icon]]"></iron-icon>
+              [[action.label]]
+            </gr-button>
+          </template>
+        </section>
+      <gr-button hidden$="[[!_loading]]" disabled>Loading actions...</gr-button>
       <gr-dropdown
           id="moreActions"
+          link
           tabindex="0"
-          down-arrow
           vertical-offset="32"
           horizontal-align="right"
           on-tap-item="_handleOveflowItemTap"
           hidden$="[[_shouldHideActions(_menuActions.*, _loading)]]"
           disabled-ids="[[_disabledMenuActions]]"
-          items="[[_menuActions]]">More</gr-dropdown>
-      <section hidden$="[[_shouldHideActions(_topLevelActions.*, _loading)]]">
-        <template
-            is="dom-repeat"
-            items="[[_topLevelActions]]"
-            as="action">
-          <gr-button title$="[[action.title]]"
-              primary$="[[action.__primary]]"
-              data-action-key$="[[action.__key]]"
-              data-action-type$="[[action.__type]]"
-              data-label$="[[action.label]]"
-              disabled$="[[_calculateDisabled(action, _hasKnownChainState)]]"
-              on-tap="_handleActionTap">[[action.label]]</gr-button>
-        </template>
-      </section>
-      <gr-button hidden$="[[!_loading]]" disabled>Loading actions...</gr-button>
+          items="[[_menuActions]]">
+          <iron-icon icon="gr-icons:more-vert"></iron-icon>
+          <span id="moreMessage">More</span>
+        </gr-dropdown>
     </div>
     <gr-overlay id="overlay" with-backdrop>
       <gr-confirm-rebase-dialog id="confirmRebase"
           class="confirmDialog"
+          change-number="[[change._number]]"
           on-confirm="_handleRebaseConfirm"
           on-cancel="_handleConfirmDialogCancel"
           branch="[[change.branch]]"
@@ -125,6 +188,15 @@
           on-cancel="_handleConfirmDialogCancel"
           project="[[change.project]]"
           hidden></gr-confirm-cherrypick-dialog>
+      <gr-confirm-cherrypick-conflict-dialog id="confirmCherrypickConflict"
+          class="confirmDialog"
+          change-status="[[changeStatus]]"
+          commit-message="[[commitMessage]]"
+          commit-num="[[commitNum]]"
+          on-confirm="_handleCherrypickConflictConfirm"
+          on-cancel="_handleConfirmDialogCancel"
+          project="[[change.project]]"
+          hidden></gr-confirm-cherrypick-conflict-dialog>
       <gr-confirm-move-dialog id="confirmMove"
           class="confirmDialog"
           on-confirm="_handleMoveConfirm"
@@ -141,35 +213,62 @@
           on-confirm="_handleAbandonDialogConfirm"
           on-cancel="_handleConfirmDialogCancel"
           hidden></gr-confirm-abandon-dialog>
-      <gr-confirm-dialog
+      <gr-confirm-submit-dialog
+          id="confirmSubmitDialog"
+          class="confirmDialog"
+          change="[[change]]"
+          action="[[revisionActions.submit]]"
+          on-cancel="_handleConfirmDialogCancel"
+          on-confirm="_handleSubmitConfirm" hidden></gr-confirm-submit-dialog>
+      <gr-dialog id="createFollowUpDialog"
+          class="confirmDialog"
+          confirm-label="Create"
+          on-confirm="_handleCreateFollowUpChange"
+          on-cancel="_handleCloseCreateFollowUpChange">
+        <div class="header" slot="header">
+          Create Follow-Up Change
+        </div>
+        <div class="main" slot="main">
+          <gr-create-change-dialog
+              id="createFollowUpChange"
+              branch="[[change.branch]]"
+              base-change="[[change.id]]"
+              repo-name="[[change.project]]"
+              private-by-default="[[privateByDefault]]"></gr-create-change-dialog>
+        </div>
+      </gr-dialog>
+      <gr-dialog
           id="confirmDeleteDialog"
           class="confirmDialog"
           confirm-label="Delete"
+          confirm-on-enter
           on-cancel="_handleConfirmDialogCancel"
           on-confirm="_handleDeleteConfirm">
-        <div class="header">
+        <div class="header" slot="header">
           Delete Change
         </div>
-        <div class="main">
+        <div class="main" slot="main">
           Do you really want to delete the change?
         </div>
-      </gr-confirm-dialog>
-      <gr-confirm-dialog
+      </gr-dialog>
+      <gr-dialog
           id="confirmDeleteEditDialog"
           class="confirmDialog"
           confirm-label="Delete"
+          confirm-on-enter
           on-cancel="_handleConfirmDialogCancel"
           on-confirm="_handleDeleteEditConfirm">
-        <div class="header">
+        <div class="header" slot="header">
           Delete Change Edit
         </div>
-        <div class="main">
+        <div class="main" slot="main">
           Do you really want to delete the edit?
         </div>
-      </gr-confirm-dialog>
+      </gr-dialog>
     </gr-overlay>
     <gr-js-api-interface id="jsAPI"></gr-js-api-interface>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
+    <gr-reporting id="reporting" category="change-actions"></gr-reporting>
   </template>
   <script src="gr-change-actions.js"></script>
 </dom-module>
diff --git a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.js b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.js
index e8c2d03..3e5c4f7 100644
--- a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.js
+++ b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -52,6 +55,8 @@
     ABANDON: 'abandon',
     DELETE: '/',
     DELETE_EDIT: 'deleteEdit',
+    EDIT: 'edit',
+    FOLLOW_UP: 'followup',
     IGNORE: 'ignore',
     MOVE: 'move',
     PRIVATE: 'private',
@@ -61,6 +66,7 @@
     RESTORE: 'restore',
     REVERT: 'revert',
     REVIEWED: 'reviewed',
+    STOP_EDIT: 'stopEdit',
     UNIGNORE: 'unignore',
     UNREVIEWED: 'unreviewed',
     WIP: 'wip',
@@ -76,7 +82,7 @@
 
   const ActionLoadingLabels = {
     abandon: 'Abandoning...',
-    cherrypick: 'Cherry-Picking...',
+    cherrypick: 'Cherry-picking...',
     delete: 'Deleting...',
     move: 'Moving..',
     rebase: 'Rebasing...',
@@ -97,7 +103,7 @@
     __type: 'change',
     enabled: true,
     key: 'review',
-    label: 'Quick Approve',
+    label: 'Quick approve',
     method: 'POST',
   };
 
@@ -120,7 +126,7 @@
 
   const REBASE_EDIT = {
     enabled: true,
-    label: 'Rebase Edit',
+    label: 'Rebase edit',
     title: 'Rebase change edit',
     __key: 'rebaseEdit',
     __primary: false,
@@ -130,7 +136,7 @@
 
   const PUBLISH_EDIT = {
     enabled: true,
-    label: 'Publish Edit',
+    label: 'Publish edit',
     title: 'Publish change edit',
     __key: 'publishEdit',
     __primary: false,
@@ -140,7 +146,7 @@
 
   const DELETE_EDIT = {
     enabled: true,
-    label: 'Delete Edit',
+    label: 'Delete edit',
     title: 'Delete change edit',
     __key: 'deleteEdit',
     __primary: false,
@@ -148,6 +154,40 @@
     method: 'DELETE',
   };
 
+  const EDIT = {
+    enabled: true,
+    label: 'Edit',
+    title: 'Edit this change',
+    __key: 'edit',
+    __primary: false,
+    __type: 'change',
+  };
+
+  const STOP_EDIT = {
+    enabled: true,
+    label: 'Stop editing',
+    title: 'Stop editing this change',
+    __key: 'stopEdit',
+    __primary: false,
+    __type: 'change',
+  };
+
+  // Set of keys that have icons. As more icons are added to gr-icons.html, this
+  // set should be expanded.
+  const ACTIONS_WITH_ICONS = new Set([
+    ChangeActions.ABANDON,
+    ChangeActions.DELETE_EDIT,
+    ChangeActions.EDIT,
+    ChangeActions.PUBLISH_EDIT,
+    ChangeActions.REBASE_EDIT,
+    ChangeActions.RESTORE,
+    ChangeActions.REVERT,
+    ChangeActions.STOP_EDIT,
+    QUICK_APPROVE_ACTION.key,
+    RevisionActions.REBASE,
+    RevisionActions.SUBMIT,
+  ]);
+
   const AWAIT_CHANGE_ATTEMPTS = 5;
   const AWAIT_CHANGE_TIMEOUT_MS = 1000;
 
@@ -172,8 +212,22 @@
      * @event show-alert
      */
 
+    /**
+     * Fires when a change action fails.
+     *
+     * @event show-error
+     */
+
     properties: {
-      /** @type {{ branch: string, project: string }} */
+      /**
+       * @type {{
+       *    _number: number,
+       *    branch: string,
+       *    id: string,
+       *    project: string,
+       *    subject: string,
+       *  }}
+       */
       change: Object,
       actions: {
         type: Object,
@@ -187,10 +241,18 @@
           ];
         },
       },
+      disableEdit: {
+        type: Boolean,
+        value: false,
+      },
       _hasKnownChainState: {
         type: Boolean,
         value: false,
       },
+      _hideQuickApproveAction: {
+        type: Boolean,
+        value: false,
+      },
       changeNum: String,
       changeStatus: String,
       commitNum: String,
@@ -198,7 +260,7 @@
         type: Boolean,
         observer: '_computeChainState',
       },
-      patchNum: String,
+      latestPatchNum: String,
       commitMessage: {
         type: String,
         value: '',
@@ -208,6 +270,7 @@
         type: Object,
         value() { return {}; },
       },
+      privateByDefault: String,
 
       _loading: {
         type: Boolean,
@@ -227,7 +290,10 @@
         type: Array,
         computed: '_computeTopLevelActions(_allActionValues.*, ' +
             '_hiddenActions.*, _overflowActions.*)',
+        observer: '_filterPrimaryActions',
       },
+      _topLevelPrimaryActions: Array,
+      _topLevelSecondaryActions: Array,
       _menuActions: {
         type: Array,
         computed: '_computeMenuActions(_allActionValues.*, _hiddenActions.*, ' +
@@ -281,6 +347,10 @@
               type: ActionType.CHANGE,
               key: ChangeActions.PRIVATE_DELETE,
             },
+            {
+              type: ActionType.CHANGE,
+              key: ChangeActions.FOLLOW_UP,
+            },
           ];
           return value;
         },
@@ -301,7 +371,14 @@
         type: Array,
         value() { return []; },
       },
-      editLoaded: {
+      // editPatchsetLoaded == "does the current selected patch range have
+      // 'edit' as one of either basePatchNum or patchNum".
+      editPatchsetLoaded: {
+        type: Boolean,
+        value: false,
+      },
+      // editMode == "is edit mode enabled in the file list".
+      editMode: {
         type: Boolean,
         value: false,
       },
@@ -321,9 +398,10 @@
     ],
 
     observers: [
-      '_actionsChanged(actions.*, revisionActions.*, _additionalActions.*, ' +
-          'editLoaded, editBasedOnCurrentPatchSet, change)',
+      '_actionsChanged(actions.*, revisionActions.*, _additionalActions.*)',
       '_changeChanged(change)',
+      '_editStatusChanged(editMode, editPatchsetLoaded, ' +
+          'editBasedOnCurrentPatchSet, disableEdit, actions.*, change.*)',
     ],
 
     listeners: {
@@ -333,11 +411,11 @@
 
     ready() {
       this.$.jsAPI.addElement(this.$.jsAPI.Element.CHANGE_ACTIONS, this);
-      this._loading = false;
+      this._handleLoadingComplete();
     },
 
     reload() {
-      if (!this.changeNum || !this.patchNum) {
+      if (!this.changeNum || !this.latestPatchNum) {
         return Promise.resolve();
       }
 
@@ -346,7 +424,7 @@
         if (!revisionActions) { return; }
 
         this.revisionActions = revisionActions;
-        this._loading = false;
+        this._handleLoadingComplete();
       }).catch(err => {
         this.fire('show-alert', {message: ERR_REVISION_ACTIONS});
         this._loading = false;
@@ -354,6 +432,10 @@
       });
     },
 
+    _handleLoadingComplete() {
+      Gerrit.awaitPluginsLoaded().then(() => this._loading = false);
+    },
+
     _changeChanged() {
       this.reload();
     },
@@ -457,7 +539,7 @@
 
     _getRevisionActions() {
       return this.$.restAPI.getChangeRevisionActions(this.changeNum,
-          this.patchNum);
+          this.latestPatchNum);
     },
 
     _shouldHideActions(actions, loading) {
@@ -469,8 +551,7 @@
     },
 
     _actionsChanged(actionsChangeRecord, revisionActionsChangeRecord,
-        additionalActionsChangeRecord, editLoaded, editBasedOnCurrentPatchSet,
-        change) {
+        additionalActionsChangeRecord) {
       const additionalActions = (additionalActionsChangeRecord &&
           additionalActionsChangeRecord.base) || [];
       this.hidden = this._keyCount(actionsChangeRecord) === 0 &&
@@ -480,50 +561,78 @@
       this._disabledMenuActions = [];
 
       const revisionActions = revisionActionsChangeRecord.base || {};
-      if (Object.keys(revisionActions).length !== 0 &&
-          !revisionActions.download) {
-        this.set('revisionActions.download', DOWNLOAD_ACTION);
+      if (Object.keys(revisionActions).length !== 0) {
+        if (!revisionActions.download) {
+          this.set('revisionActions.download', DOWNLOAD_ACTION);
+        }
       }
+    },
 
-      const changeActions = actionsChangeRecord.base || {};
-      if (Object.keys(changeActions).length !== 0) {
-        if (editLoaded) {
-          if (this.changeIsOpen(change.status)) {
-            if (editBasedOnCurrentPatchSet) {
-              if (!changeActions.publishEdit) {
-                this.set('actions.publishEdit', PUBLISH_EDIT);
-              }
-              if (changeActions.rebaseEdit) {
-                delete this.actions.rebaseEdit;
-                this.notifyPath('actions.rebaseEdit');
-              }
-            } else {
-              if (!changeActions.rebasEdit) {
-                this.set('actions.rebaseEdit', REBASE_EDIT);
-              }
-              if (changeActions.publishEdit) {
-                delete this.actions.publishEdit;
-                this.notifyPath('actions.publishEdit');
-              }
+      /**
+       * @param {string=} actionName
+       */
+    _deleteAndNotify(actionName) {
+      if (this.actions[actionName]) {
+        delete this.actions[actionName];
+        this.notifyPath('actions.' + actionName);
+      }
+    },
+
+    _editStatusChanged(editMode, editPatchsetLoaded,
+        editBasedOnCurrentPatchSet, disableEdit) {
+      if (disableEdit) {
+        this._deleteAndNotify('publishEdit');
+        this._deleteAndNotify('rebaseEdit');
+        this._deleteAndNotify('deleteEdit');
+        this._deleteAndNotify('stopEdit');
+        this._deleteAndNotify('edit');
+        return;
+      }
+      if (editPatchsetLoaded) {
+        // Only show actions that mutate an edit if an actual edit patch set
+        // is loaded.
+        if (this.changeIsOpen(this.change.status)) {
+          if (editBasedOnCurrentPatchSet) {
+            if (!this.actions.publishEdit) {
+              this.set('actions.publishEdit', PUBLISH_EDIT);
             }
-          }
-          if (!changeActions.deleteEdit) {
-            this.set('actions.deleteEdit', DELETE_EDIT);
-          }
-        } else {
-          if (changeActions.publishEdit) {
-            delete this.actions.publishEdit;
-            this.notifyPath('actions.publishEdit');
-          }
-          if (changeActions.rebaseEdit) {
-            delete this.actions.rebaseEdit;
-            this.notifyPath('actions.rebaseEdit');
-          }
-          if (changeActions.deleteEdit) {
-            delete this.actions.deleteEdit;
-            this.notifyPath('actions.deleteEdit');
+            this._deleteAndNotify('rebaseEdit');
+          } else {
+            if (!this.actions.rebaseEdit) {
+              this.set('actions.rebaseEdit', REBASE_EDIT);
+            }
+            this._deleteAndNotify('publishEdit');
           }
         }
+        if (!this.actions.deleteEdit) {
+          this.set('actions.deleteEdit', DELETE_EDIT);
+        }
+      } else {
+        this._deleteAndNotify('publishEdit');
+        this._deleteAndNotify('rebaseEdit');
+        this._deleteAndNotify('deleteEdit');
+      }
+
+      if (this.changeIsOpen(this.change.status)) {
+        // Only show edit button if there is no edit patchset loaded and the
+        // file list is not in edit mode.
+        if (editPatchsetLoaded || editMode) {
+          this._deleteAndNotify('edit');
+        } else {
+          if (!this.actions.edit) { this.set('actions.edit', EDIT); }
+        }
+        // Only show STOP_EDIT if edit mode is enabled, but no edit patch set
+        // is loaded.
+        if (editMode && !editPatchsetLoaded) {
+          if (!this.actions.stopEdit) {
+            this.set('actions.stopEdit', STOP_EDIT);
+          }
+        } else {
+          this._deleteAndNotify('stopEdit');
+        }
+      } else {
+        // Remove edit button.
+        this._deleteAndNotify('edit');
       }
     },
 
@@ -593,7 +702,18 @@
       return null;
     },
 
+    hideQuickApproveAction() {
+      this._topLevelSecondaryActions =
+        this._topLevelSecondaryActions.filter(sa => {
+          return sa.key !== QUICK_APPROVE_ACTION.key;
+        });
+      this._hideQuickApproveAction = true;
+    },
+
     _getQuickApproveAction() {
+      if (this._hideQuickApproveAction) {
+        return null;
+      }
       const approval = this._getTopMissingApproval();
       if (!approval) {
         return null;
@@ -636,13 +756,8 @@
         } else if (!values.includes(a)) {
           return;
         }
-        if (actions[a].label === 'Delete') {
-          // This label is common within change and revision actions. Make it
-          // more explicit to the user.
-          if (type === ActionType.CHANGE) {
-            actions[a].label += ' Change';
-          }
-        }
+        actions[a].label = this._getActionLabel(actions[a]);
+
         // Triggers a re-render by ensuring object inequality.
         result.push(Object.assign({}, actions[a]));
       });
@@ -661,19 +776,45 @@
 
     _populateActionUrl(action) {
       const patchNum =
-            action.__type === ActionType.REVISION ? this.patchNum : null;
+            action.__type === ActionType.REVISION ? this.latestPatchNum : null;
       this.$.restAPI.getChangeActionURL(
           this.changeNum, patchNum, '/' + action.__key)
           .then(url => action.__url = url);
     },
 
+    /**
+     * Given a change action, return a display label that uses the appropriate
+     * casing or includes explanatory details.
+     */
+    _getActionLabel(action) {
+      if (action.label === 'Delete') {
+        // This label is common within change and revision actions. Make it more
+        // explicit to the user.
+        return 'Delete change';
+      } else if (action.label === 'WIP') {
+        return 'Mark as work in progress';
+      }
+      // Otherwise, just map the name to sentence case.
+      return this._toSentenceCase(action.label);
+    },
+
+    /**
+     * Capitalize the first letter and lowecase all others.
+     * @param {string} s
+     * @return {string}
+     */
+    _toSentenceCase(s) {
+      if (!s.length) { return ''; }
+      return s[0].toUpperCase() + s.slice(1).toLowerCase();
+    },
+
     _computeLoadingLabel(action) {
       return ActionLoadingLabels[action] || 'Working...';
     },
 
     _canSubmitChange() {
       return this.$.jsAPI.canSubmitChange(this.change,
-          this._getRevision(this.change, this.patchNum));
+          this._getRevision(this.change, this.latestPatchNum));
     },
 
     _getRevision(change, patchNum) {
@@ -699,7 +840,12 @@
 
     _handleActionTap(e) {
       e.preventDefault();
-      const el = Polymer.dom(e).localTarget;
+      let el = Polymer.dom(e).localTarget;
+      while (el.is !== 'gr-button') {
+        if (!el.parentElement) { return; }
+        el = el.parentElement;
+      }
+
       const key = el.getAttribute('data-action-key');
       if (key.startsWith(ADDITIONAL_ACTION_KEY_PREFIX) ||
           key.indexOf('~') !== -1) {
@@ -723,6 +869,7 @@
     },
 
     _handleAction(type, key) {
+      this.$.reporting.reportInteraction(`${type}-${key}`);
       switch (type) {
         case ActionType.REVISION:
           this._handleRevisionAction(key);
@@ -751,12 +898,21 @@
           this._fireAction(
               this._prependSlash(key), action, true, action.payload);
           break;
+        case ChangeActions.EDIT:
+          this._handleEditTap();
+          break;
+        case ChangeActions.STOP_EDIT:
+          this._handleStopEditTap();
+          break;
         case ChangeActions.DELETE:
           this._handleDeleteTap();
           break;
         case ChangeActions.DELETE_EDIT:
           this._handleDeleteEditTap();
           break;
+        case ChangeActions.FOLLOW_UP:
+          this._handleFollowUpTap();
+          break;
         case ChangeActions.WIP:
           this._handleWipTap();
           break;
@@ -778,6 +934,7 @@
       switch (key) {
         case RevisionActions.REBASE:
           this._showActionDialog(this.$.confirmRebase);
+          this.$.confirmRebase.fetchRecentChanges();
           break;
         case RevisionActions.CHERRYPICK:
           this._handleCherrypickTap();
@@ -786,10 +943,9 @@
           this._handleDownloadTap();
           break;
         case RevisionActions.SUBMIT:
-          if (!this._canSubmitChange()) {
-            return;
-          }
-        // eslint-disable-next-line no-fallthrough
+          if (!this._canSubmitChange()) { return; }
+          this._showActionDialog(this.$.confirmSubmitDialog);
+          break;
         default:
           this._fireAction(this._prependSlash(key),
               this.revisionActions[key], true);
@@ -826,15 +982,23 @@
       this.$.overlay.close();
     },
 
-    _handleRebaseConfirm() {
+    _handleRebaseConfirm(e) {
       const el = this.$.confirmRebase;
-      const payload = {base: el.base};
+      const payload = {base: e.detail.base};
       this.$.overlay.close();
       el.hidden = true;
       this._fireAction('/rebase', this.revisionActions.rebase, true, payload);
     },
 
     _handleCherrypickConfirm() {
+      this._handleCherryPickRestApi(false);
+    },
+
+    _handleCherrypickConflictConfirm() {
+      this._handleCherryPickRestApi(true);
+    },
+
+    _handleCherryPickRestApi(conflicts) {
       const el = this.$.confirmCherrypick;
       if (!el.branch) {
         // TODO(davido): Fix error handling
@@ -853,7 +1017,9 @@
           true,
           {
             destination: el.branch,
+            base: el.baseCommit ? el.baseCommit : null,
             message: el.message,
+            allow_conflicts: conflicts,
           }
       );
     },
@@ -893,6 +1059,15 @@
           {message: el.message});
     },
 
+    _handleCreateFollowUpChange() {
+      this.$.createFollowUpChange.handleCreateChange();
+      this._handleCloseCreateFollowUpChange();
+    },
+
+    _handleCloseCreateFollowUpChange() {
+      this.$.overlay.close();
+    },
+
     _handleDeleteConfirm() {
       this._fireAction('/', this.actions[ChangeActions.DELETE], false);
     },
@@ -903,6 +1078,12 @@
       this._fireAction('/edit', this.actions.deleteEdit, false);
     },
 
+    _handleSubmitConfirm() {
+      if (!this._canSubmitChange()) { return; }
+      this._hideAllDialogs();
+      this._fireAction('/submit', this.revisionActions.submit, true);
+    },
+
     _getActionOverflowIndex(type, key) {
       return this._overflowActions.findIndex(action => {
         return action.type === type && action.key === key;
@@ -941,8 +1122,9 @@
     _fireAction(endpoint, action, revAction, opt_payload) {
       const cleanupFn =
           this._setLoadingOnButtonWithKey(action.__type, action.__key);
-      this._send(action.method, opt_payload, endpoint, revAction, cleanupFn)
-          .then(this._handleResponse.bind(this, action));
+
+      this._send(action.method, opt_payload, endpoint, revAction, cleanupFn,
+          action).then(this._handleResponse.bind(this, action));
     },
 
     _showActionDialog(dialog) {
@@ -961,8 +1143,7 @@
     _setLabelValuesOnRevert(newChangeId) {
       const labels = this.$.jsAPI.getLabelValuesPostRevert(this.change);
       if (!labels) { return Promise.resolve(); }
-      return this.$.restAPI.getChangeURLAndSend(newChangeId,
-          this.actions.revert.method, 'current', '/review', {labels});
+      return this.$.restAPI.saveChangeReview(newChangeId, 'current', {labels});
     },
 
     _handleResponse(action, response) {
@@ -983,14 +1164,14 @@
             break;
           case ChangeActions.DELETE:
             if (action.__type === ActionType.CHANGE) {
-              page.show('/');
+              Gerrit.Nav.navigateToRelativeUrl(Gerrit.Nav.getUrlForRoot());
             }
             break;
           case ChangeActions.WIP:
           case ChangeActions.DELETE_EDIT:
           case ChangeActions.PUBLISH_EDIT:
           case ChangeActions.REBASE_EDIT:
-            page.show(this.changePath(this.changeNum));
+            Gerrit.Nav.navigateToChange(this.change);
             break;
           default:
             this.dispatchEvent(new CustomEvent('reload-change',
@@ -1000,9 +1181,16 @@
       });
     },
 
-    _handleResponseError(response) {
+    _handleResponseError(action, response, body) {
+      if (action && action.__key === RevisionActions.CHERRYPICK) {
+        if (response && response.status === 409 &&
+            body && !body.allow_conflicts) {
+          return this._showActionDialog(
+              this.$.confirmCherrypickConflict);
+        }
+      }
       return response.text().then(errText => {
-        this.fire('show-alert',
+        this.fire('show-error',
             {message: `Could not perform action: ${errText}`});
         if (!errText.startsWith('Change is already up to date')) {
           throw Error(errText);
@@ -1016,18 +1204,17 @@
      * @param {string} actionEndpoint
      * @param {boolean} revisionAction
      * @param {?Function} cleanupFn
-     * @param {?Function=} opt_errorFn
+     * @param {!Object|undefined} action
      */
-    _send(method, payload, actionEndpoint, revisionAction, cleanupFn,
-        opt_errorFn) {
+    _send(method, payload, actionEndpoint, revisionAction, cleanupFn, action) {
       const handleError = response => {
         cleanupFn.call(this);
-        this._handleResponseError(response);
+        this._handleResponseError(action, response, payload);
       };
 
-      return this.fetchIsLatestKnown(this.change, this.$.restAPI)
-          .then(isLatest => {
-            if (!isLatest) {
+      return this.fetchChangeUpdates(this.change, this.$.restAPI)
+          .then(result => {
+            if (!result.isLatest) {
               this.fire('show-alert', {
                 message: 'Cannot set label: a newer patch has been ' +
                     'uploaded to this change.',
@@ -1044,9 +1231,9 @@
 
               return Promise.resolve();
             }
-            const patchNum = revisionAction ? this.patchNum : null;
-            return this.$.restAPI.getChangeURLAndSend(this.changeNum, method,
-                patchNum, actionEndpoint, payload, handleError, this)
+            const patchNum = revisionAction ? this.latestPatchNum : null;
+            return this.$.restAPI.executeChangeAction(this.changeNum, method,
+                actionEndpoint, patchNum, payload, handleError)
                 .then(response => {
                   cleanupFn.call(this);
                   return response;
@@ -1081,6 +1268,10 @@
       this._showActionDialog(this.$.confirmDeleteEditDialog);
     },
 
+    _handleFollowUpTap() {
+      this._showActionDialog(this.$.createFollowUpDialog);
+    },
+
     _handleWipTap() {
       this._fireAction('/wip', this.actions.wip, false);
     },
@@ -1121,9 +1312,16 @@
       if (quickApprove) {
         changeActionValues.unshift(quickApprove);
       }
+
       return revisionActionValues
           .concat(changeActionValues)
-          .sort(this._actionComparator.bind(this));
+          .sort(this._actionComparator.bind(this))
+          .map(action => {
+            if (ACTIONS_WITH_ICONS.has(action.__key)) {
+              action.icon = action.__key;
+            }
+            return action;
+          });
     },
 
     _getActionPriority(action) {
@@ -1170,6 +1368,13 @@
       });
     },
 
+    _filterPrimaryActions(_topLevelActions) {
+      this._topLevelPrimaryActions = _topLevelActions.filter(action =>
+          action.__primary);
+      this._topLevelSecondaryActions = _topLevelActions.filter(action =>
+          !action.__primary);
+    },
+
     _computeMenuActions(actionRecord, hiddenActionsRecord) {
       const hiddenActions = hiddenActionsRecord.base || [];
       return actionRecord.base.filter(a => {
@@ -1182,6 +1387,7 @@
           name: action.label,
           id: `${key}-${action.__type}`,
           action,
+          tooltip: action.title,
         };
       });
     },
@@ -1219,5 +1425,21 @@
         check();
       });
     },
+
+    _handleEditTap() {
+      this.dispatchEvent(new CustomEvent('edit-tap', {bubbles: false}));
+    },
+
+    _handleStopEditTap() {
+      this.dispatchEvent(new CustomEvent('stop-edit-tap', {bubbles: false}));
+    },
+
+    _computeHasTooltip(title) {
+      return !!title;
+    },
+
+    _computeHasIcon(action) {
+      return action.icon ? '' : 'hidden';
+    },
   });
 })();
diff --git a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions_test.html b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions_test.html
index b188aca..81fe54e 100644
--- a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions_test.html
+++ b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -79,12 +80,16 @@
 
           return Promise.reject('bad url');
         },
+        getProjectConfig() { return Promise.resolve({}); },
       });
 
+      sandbox = sinon.sandbox.create();
+      sandbox.stub(Gerrit, 'awaitPluginsLoaded').returns(Promise.resolve());
+
       element = fixture('basic');
       element.change = {};
       element.changeNum = '42';
-      element.patchNum = '2';
+      element.latestPatchNum = '2';
       element.actions = {
         '/': {
           method: 'DELETE',
@@ -93,7 +98,10 @@
           enabled: true,
         },
       };
-      sandbox = sinon.sandbox.create();
+      sandbox.stub(element.$.confirmCherrypick.$.restAPI,
+          'getRepoBranches').returns(Promise.resolve([]));
+      sandbox.stub(element.$.confirmMove.$.restAPI,
+          'getRepoBranches').returns(Promise.resolve([]));
 
       return element.reload();
     });
@@ -102,13 +110,21 @@
       sandbox.restore();
     });
 
+    test('primary and secondary actions split properly', () => {
+      // Submit should be the only primary action.
+      assert.equal(element._topLevelPrimaryActions.length, 1);
+      assert.equal(element._topLevelPrimaryActions[0].label, 'Submit');
+      assert.equal(element._topLevelSecondaryActions.length,
+          element._topLevelActions.length - 1);
+    });
+
     test('_shouldHideActions', () => {
       assert.isTrue(element._shouldHideActions(undefined, true));
       assert.isTrue(element._shouldHideActions({base: {}}, false));
       assert.isFalse(element._shouldHideActions({base: ['test']}, false));
     });
 
-    test('plugin revision actions', () => {
+    test('plugin revision actions', done => {
       sandbox.stub(element.$.restAPI, 'getChangeActionURL').returns(
           Promise.resolve('the-url'));
       element.revisionActions = {
@@ -117,12 +133,13 @@
       assert.isOk(element.revisionActions['plugin~action']);
       flush(() => {
         assert.isTrue(element.$.restAPI.getChangeActionURL.calledWith(
-            element.changeNum, element.patchNum, '/plugin~action'));
+            element.changeNum, element.latestPatchNum, '/plugin~action'));
         assert.equal(element.revisionActions['plugin~action'].__url, 'the-url');
+        done();
       });
     });
 
-    test('plugin change actions', () => {
+    test('plugin change actions', done => {
       sandbox.stub(element.$.restAPI, 'getChangeActionURL').returns(
           Promise.resolve('the-url'));
       element.actions = {
@@ -132,16 +149,15 @@
       flush(() => {
         assert.isTrue(element.$.restAPI.getChangeActionURL.calledWith(
             element.changeNum, null, '/plugin~action'));
-        assert.equal(element.revisionActions['plugin~action'].__url, 'the-url');
+        assert.equal(element.actions['plugin~action'].__url, 'the-url');
+        done();
       });
     });
 
     test('not supported actions are filtered out', () => {
-      element.revisionActions = {
-        followup: {
-        },
-      };
-      assert.equal(element.querySelectorAll('section gr-button').length, 0);
+      element.revisionActions = {followup: {}};
+      assert.equal(element.querySelectorAll(
+          'section gr-button[data-action-type="revision"]').length, 0);
     });
 
     test('getActionDetails', () => {
@@ -188,7 +204,11 @@
         const buttonEls = Polymer.dom(element.root)
             .querySelectorAll('gr-button');
         const menuItems = element.$.moreActions.items;
-        assert.equal(buttonEls.length + menuItems.length, 6);
+
+        // Total button number is one greater than the number of total actions
+        // due to the existence of the overflow menu trigger.
+        assert.equal(buttonEls.length + menuItems.length,
+            element._allActionValues.length + 1);
         assert.isFalse(element.hidden);
         done();
       });
@@ -201,9 +221,7 @@
         });
         assert.equal(deleteItems.length, 1);
         assert.notEqual(deleteItems[0].name);
-        assert.isTrue(
-            deleteItems[0].name === 'Delete Change'
-        );
+        assert.equal(deleteItems[0].name, 'Delete change');
         done();
       });
     });
@@ -234,29 +252,64 @@
       assert.deepEqual(result, actions);
     });
 
-    test('submit change', done => {
+    test('submit change', () => {
+      const showSpy = sandbox.spy(element, '_showActionDialog');
       sandbox.stub(element.$.restAPI, 'getFromProjectLookup')
           .returns(Promise.resolve('test'));
-      sandbox.stub(element, 'fetchIsLatestKnown',
-          () => { return Promise.resolve(true); });
+      sandbox.stub(element, 'fetchChangeUpdates',
+          () => { return Promise.resolve({isLatest: true}); });
+      sandbox.stub(element.$.overlay, 'open').returns(Promise.resolve());
       element.change = {
         revisions: {
           rev1: {_number: 1},
           rev2: {_number: 2},
         },
       };
-      element.patchNum = '2';
+      element.latestPatchNum = '2';
 
-      flush(() => {
-        const submitButton = element.$$('gr-button[data-action-key="submit"]');
-        assert.ok(submitButton);
-        MockInteractions.tap(submitButton);
+      const submitButton = element.$$('gr-button[data-action-key="submit"]');
+      assert.ok(submitButton);
+      MockInteractions.tap(submitButton);
 
-        // Upon success it should fire the reload-change event.
-        element.addEventListener('reload-change', () => {
-          done();
-        });
-      });
+      flushAsynchronousOperations();
+      assert.isTrue(showSpy.calledWith(element.$.confirmSubmitDialog));
+    });
+
+    test('submit change, tap on icon', done => {
+      sandbox.stub(element.$.confirmSubmitDialog, 'resetFocus', done);
+      sandbox.stub(element.$.restAPI, 'getFromProjectLookup')
+          .returns(Promise.resolve('test'));
+      sandbox.stub(element, 'fetchChangeUpdates',
+          () => { return Promise.resolve({isLatest: true}); });
+      sandbox.stub(element.$.overlay, 'open').returns(Promise.resolve());
+      element.change = {
+        revisions: {
+          rev1: {_number: 1},
+          rev2: {_number: 2},
+        },
+      };
+      element.latestPatchNum = '2';
+
+      const submitIcon =
+          element.$$('gr-button[data-action-key="submit"] iron-icon');
+      assert.ok(submitIcon);
+      MockInteractions.tap(submitIcon);
+    });
+
+    test('_handleSubmitConfirm', () => {
+      const fireStub = sandbox.stub(element, '_fireAction');
+      sandbox.stub(element, '_canSubmitChange').returns(true);
+      element._handleSubmitConfirm();
+      assert.isTrue(fireStub.calledOnce);
+      assert.deepEqual(fireStub.lastCall.args,
+          ['/submit', element.revisionActions.submit, true]);
+    });
+
+    test('_handleSubmitConfirm when not able to submit', () => {
+      const fireStub = sandbox.stub(element, '_fireAction');
+      sandbox.stub(element, '_canSubmitChange').returns(false);
+      element._handleSubmitConfirm();
+      assert.isFalse(fireStub.called);
     });
 
     test('submit change with plugin hook', done => {
@@ -302,6 +355,9 @@
 
     test('rebase change', done => {
       const fireActionStub = sandbox.stub(element, '_fireAction');
+      const fetchChangesStub = sandbox.stub(element.$.confirmRebase,
+          'fetchRecentChanges').returns(Promise.resolve([]));
+      element._hasKnownChainState = true;
       flush(() => {
         const rebaseButton = element.$$('gr-button[data-action-key="rebase"]');
         MockInteractions.tap(rebaseButton);
@@ -314,24 +370,26 @@
           method: 'POST',
           title: 'Rebase onto tip of branch or parent change',
         };
-        // rebase on other
-        element.$.confirmRebase.base = '1234';
-        element._handleRebaseConfirm();
+        assert.isTrue(fetchChangesStub.called);
+        element._handleRebaseConfirm({detail: {base: '1234'}});
         assert.deepEqual(fireActionStub.lastCall.args,
           ['/rebase', rebaseAction, true, {base: '1234'}]);
+        done();
+      });
+    });
 
-        // rebase on parent
-        element.$.confirmRebase.base = null;
-        element._handleRebaseConfirm();
-        assert.deepEqual(fireActionStub.lastCall.args,
-          ['/rebase', rebaseAction, true, {base: null}]);
+    test(`rebase dialog gets recent changes each time it's opened`, done => {
+      const fetchChangesStub = sandbox.stub(element.$.confirmRebase,
+          'fetchRecentChanges').returns(Promise.resolve([]));
+      element._hasKnownChainState = true;
+      const rebaseButton = element.$$('gr-button[data-action-key="rebase"]');
+      MockInteractions.tap(rebaseButton);
+      assert.isTrue(fetchChangesStub.calledOnce);
 
-        // rebase on tip
-        element.$.confirmRebase.base = '';
-        element._handleRebaseConfirm();
-        assert.deepEqual(fireActionStub.lastCall.args,
-          ['/rebase', rebaseAction, true, {base: ''}]);
-
+      flush(() => {
+        element.$.confirmRebase.fire('cancel');
+        MockInteractions.tap(rebaseButton);
+        assert.isTrue(fetchChangesStub.calledTwice);
         done();
       });
     });
@@ -367,134 +425,133 @@
       assert.isFalse(element.$.mainContent.classList.contains('overlayOpen'));
     });
 
-    suite('change edits', () => {
-      let fireActionStub;
-      const deleteEditAction = {
-        enabled: true,
-        label: 'Delete Edit',
-        title: 'Delete change edit',
-        __key: 'deleteEdit',
-        __primary: false,
-        __type: 'change',
-        method: 'DELETE',
-      };
-      const publishEditAction = {
-        enabled: true,
-        label: 'Publish Edit',
-        title: 'Publish change edit',
-        __key: 'publishEdit',
-        __primary: false,
-        __type: 'change',
-        method: 'POST',
-      };
-      const rebaseEditAction = {
-        enabled: true,
-        label: 'Rebase Edit',
-        title: 'Rebase change edit',
-        __key: 'rebaseEdit',
-        __primary: false,
-        __type: 'change',
-        method: 'POST',
-      };
-
-      setup(() => {
-        fireActionStub = sandbox.stub(element, '_fireAction');
-        element.patchNum = 'edit';
-        element.editLoaded = true;
+    test('_setLabelValuesOnRevert', () => {
+      const labels = {'Foo': 1, 'Bar-Baz': -2};
+      const changeId = 1234;
+      sandbox.stub(element.$.jsAPI, 'getLabelValuesPostRevert').returns(labels);
+      const saveStub = sandbox.stub(element.$.restAPI, 'saveChangeReview')
+          .returns(Promise.resolve());
+      return element._setLabelValuesOnRevert(changeId).then(() => {
+        assert.isTrue(saveStub.calledOnce);
+        assert.equal(saveStub.lastCall.args[0], changeId);
+        assert.deepEqual(saveStub.lastCall.args[2], {labels});
       });
+    });
 
-      test('does not delete edit on action', () => {
-        element._handleDeleteEditTap();
-        assert.isFalse(fireActionStub.called);
+    suite('change edits', () => {
+      test('disableEdit', () => {
+        element.set('editMode', false);
+        element.set('editPatchsetLoaded', false);
+        element.change = {status: 'NEW'};
+        element.set('disableEdit', true);
+        flushAsynchronousOperations();
+
+        assert.isNotOk(element.$$('gr-button[data-action-key="publishEdit"]'));
+        assert.isNotOk(element.$$('gr-button[data-action-key="rebaseEdit"]'));
+        assert.isNotOk(element.$$('gr-button[data-action-key="deleteEdit"]'));
+        assert.isNotOk(element.$$('gr-button[data-action-key="edit"]'));
+        assert.isNotOk(element.$$('gr-button[data-action-key="stopEdit"]'));
       });
 
       test('shows confirm dialog for delete edit', () => {
+        element.set('editMode', true);
+        element.set('editPatchsetLoaded', true);
+
+        const fireActionStub = sandbox.stub(element, '_fireAction');
         element._handleDeleteEditTap();
-        assert.isFalse(element.$$('#confirmDeleteEditDialog').hidden);
-        assert.ok(element.$$('gr-button[data-action-key="deleteEdit"]'));
+        assert.isFalse(element.$.confirmDeleteEditDialog.hidden);
         MockInteractions.tap(
             element.$$('#confirmDeleteEditDialog').$$('gr-button[primary]'));
         flushAsynchronousOperations();
-        assert.isTrue(
-            fireActionStub.calledWith('/edit', deleteEditAction, false));
-      });
 
-      test('show publish edit but rebaseEdit is hidden', () => {
-        element.change = {
-          status: 'NEW',
-        };
-        const rebaseEditButton =
-            element.$$('gr-button[data-action-key="rebaseEdit"]');
-        assert.isNotOk(rebaseEditButton);
-
-        const publishEditButton =
-            element.$$('gr-button[data-action-key="publishEdit"]');
-        assert.ok(publishEditButton);
-        MockInteractions.tap(publishEditButton);
-        element._handlePublishEditTap();
-        flushAsynchronousOperations();
-
-        assert.isTrue(
-            fireActionStub.calledWith('/edit:publish', publishEditAction, false));
-      });
-
-      test('show rebase edit but publishEdit is hidden', () => {
-        element.change = {
-          status: 'NEW',
-        };
-        element.editBasedOnCurrentPatchSet = false;
-
-        const publishEditButton =
-            element.$$('gr-button[data-action-key="publishEdit"]');
-        assert.isNotOk(publishEditButton);
-
-        const rebaseEditButton =
-            element.$$('gr-button[data-action-key="rebaseEdit"]');
-        assert.ok(rebaseEditButton);
-        MockInteractions.tap(rebaseEditButton);
-        element._handleRebaseEditTap();
-        flushAsynchronousOperations();
-
-        assert.isTrue(
-            fireActionStub.calledWith('/edit:rebase', rebaseEditAction, false));
+        assert.equal(fireActionStub.lastCall.args[0], '/edit');
       });
 
       test('hide publishEdit and rebaseEdit if change is not open', () => {
-        element.change = {
-          status: 'MERGED',
-        };
+        element.set('editMode', true);
+        element.set('editPatchsetLoaded', true);
+        element.change = {status: 'MERGED'};
         flushAsynchronousOperations();
 
-        const publishEditButton =
-            element.$$('gr-button[data-action-key="publishEdit"]');
-        assert.isNotOk(publishEditButton);
-
-        const rebaseEditButton =
-            element.$$('gr-button[data-action-key="rebaseEdit"]');
-        assert.isNotOk(rebaseEditButton);
-
-        const deleteEditButton =
-            element.$$('gr-button[data-action-key="deleteEdit"]');
-        assert.ok(deleteEditButton);
+        assert.isNotOk(element.$$('gr-button[data-action-key="publishEdit"]'));
+        assert.isNotOk(element.$$('gr-button[data-action-key="rebaseEdit"]'));
+        assert.isOk(element.$$('gr-button[data-action-key="deleteEdit"]'));
+        assert.isNotOk(element.$$('gr-button[data-action-key="edit"]'));
       });
 
-      test('do not show delete edit on a non change edit', () => {
-        element.editLoaded = false;
+      test('edit patchset is loaded, needs rebase', () => {
+        element.set('editMode', true);
+        element.set('editPatchsetLoaded', true);
+        element.change = {status: 'NEW'};
+        element.editBasedOnCurrentPatchSet = false;
         flushAsynchronousOperations();
-        const deleteEditButton =
-            element.$$('gr-button[data-action-key="deleteEdit"]');
-        assert.isNotOk(deleteEditButton);
+
+        assert.isNotOk(element.$$('gr-button[data-action-key="publishEdit"]'));
+        assert.isOk(element.$$('gr-button[data-action-key="rebaseEdit"]'));
+        assert.isOk(element.$$('gr-button[data-action-key="deleteEdit"]'));
+        assert.isNotOk(element.$$('gr-button[data-action-key="edit"]'));
+        assert.isNotOk(element.$$('gr-button[data-action-key="stopEdit"]'));
       });
 
-      test('do not show publish edit on a non change edit', () => {
-        element.change = {
-          status: 'NEW',
-        };
-        element.editLoaded = false;
+      test('edit patchset is loaded, does not need rebase', () => {
+        element.set('editMode', true);
+        element.set('editPatchsetLoaded', true);
+        element.change = {status: 'NEW'};
+        element.editBasedOnCurrentPatchSet = true;
         flushAsynchronousOperations();
-        const publishEditButton =
-            element.$$('gr-button[data-action-key="publishEdit"]');
-        assert.isNotOk(publishEditButton);
+
+        assert.isOk(element.$$('gr-button[data-action-key="publishEdit"]'));
+        assert.isNotOk(element.$$('gr-button[data-action-key="rebaseEdit"]'));
+        assert.isOk(element.$$('gr-button[data-action-key="deleteEdit"]'));
+        assert.isNotOk(element.$$('gr-button[data-action-key="edit"]'));
+        assert.isNotOk(element.$$('gr-button[data-action-key="stopEdit"]'));
+      });
+
+      test('edit mode is loaded, no edit patchset', () => {
+        element.set('editMode', true);
+        element.set('editPatchsetLoaded', false);
+        element.change = {status: 'NEW'};
+        flushAsynchronousOperations();
+
+        assert.isNotOk(element.$$('gr-button[data-action-key="publishEdit"]'));
+        assert.isNotOk(element.$$('gr-button[data-action-key="rebaseEdit"]'));
+        assert.isNotOk(element.$$('gr-button[data-action-key="deleteEdit"]'));
+        assert.isNotOk(element.$$('gr-button[data-action-key="edit"]'));
+        assert.isOk(element.$$('gr-button[data-action-key="stopEdit"]'));
+      });
+
+      test('normal patch set', () => {
+        element.set('editMode', false);
+        element.set('editPatchsetLoaded', false);
+        element.change = {status: 'NEW'};
+        flushAsynchronousOperations();
+
+        assert.isNotOk(element.$$('gr-button[data-action-key="publishEdit"]'));
+        assert.isNotOk(element.$$('gr-button[data-action-key="rebaseEdit"]'));
+        assert.isNotOk(element.$$('gr-button[data-action-key="deleteEdit"]'));
+        assert.isOk(element.$$('gr-button[data-action-key="edit"]'));
+        assert.isNotOk(element.$$('gr-button[data-action-key="stopEdit"]'));
+      });
+
+      test('edit action', done => {
+        element.addEventListener('edit-tap', () => { done(); });
+        element.set('editMode', true);
+        element.change = {status: 'NEW'};
+        flushAsynchronousOperations();
+
+        assert.isNotOk(element.$$('gr-button[data-action-key="edit"]'));
+        assert.isOk(element.$$('gr-button[data-action-key="stopEdit"]'));
+        element.change = {status: 'MERGED'};
+        flushAsynchronousOperations();
+
+        assert.isNotOk(element.$$('gr-button[data-action-key="edit"]'));
+        element.change = {status: 'NEW'};
+        element.set('editMode', false);
+        flushAsynchronousOperations();
+
+        const editButton = element.$$('gr-button[data-action-key="edit"]');
+        assert.isOk(editButton);
+        MockInteractions.tap(editButton);
       });
     });
 
@@ -513,7 +570,7 @@
           __type: 'revision',
           __primary: false,
           enabled: true,
-          label: 'Cherry Pick',
+          label: 'Cherry pick',
           method: 'POST',
           title: 'Cherry pick change to a different branch',
         };
@@ -538,7 +595,40 @@
         assert.deepEqual(fireActionStub.lastCall.args, [
           '/cherrypick', action, true, {
             destination: 'master',
+            base: null,
             message: 'foo message',
+            allow_conflicts: false,
+          },
+        ]);
+      });
+
+      test('cherry pick even with conflicts', () => {
+        element._handleCherrypickTap();
+        const action = {
+          __key: 'cherrypick',
+          __type: 'revision',
+          __primary: false,
+          enabled: true,
+          label: 'Cherry pick',
+          method: 'POST',
+          title: 'Cherry pick change to a different branch',
+        };
+
+        element.$.confirmCherrypick.branch = 'master';
+
+        // Add attributes that are used to determine the message.
+        element.$.confirmCherrypick.commitMessage = 'foo message';
+        element.$.confirmCherrypick.changeStatus = 'OPEN';
+        element.$.confirmCherrypick.commitNum = '123';
+
+        element._handleCherrypickConflictConfirm();
+
+        assert.deepEqual(fireActionStub.lastCall.args, [
+          '/cherrypick', action, true, {
+            destination: 'master',
+            base: null,
+            message: 'foo message',
+            allow_conflicts: true,
           },
         ]);
       });
@@ -620,7 +710,7 @@
       const key = 'cherrypick';
       const type = 'revision';
       const cleanup = element._setLoadingOnButtonWithKey(type, key);
-      assert.equal(element._actionLoadingMessage, 'Cherry-Picking...');
+      assert.equal(element._actionLoadingMessage, 'Cherry-picking...');
       assert.include(element._disabledMenuActions, 'cherrypick');
       assert.isFunction(cleanup);
 
@@ -630,6 +720,74 @@
       assert.notInclude(element._disabledMenuActions, 'cherrypick');
     });
 
+    suite('abandon change', () => {
+      let alertStub;
+      let fireActionStub;
+
+      setup(() => {
+        fireActionStub = sandbox.stub(element, '_fireAction');
+        alertStub = sandbox.stub(window, 'alert');
+        element.actions = {
+          abandon: {
+            method: 'POST',
+            label: 'Abandon',
+            title: 'Abandon the change',
+            enabled: true,
+          },
+        };
+        return element.reload();
+      });
+
+      test('abandon change with message', done => {
+        const newAbandonMsg = 'Test Abandon Message';
+        element.$.confirmAbandonDialog.message = newAbandonMsg;
+        flush(() => {
+          const abandonButton =
+              element.$$('gr-button[data-action-key="abandon"]');
+          MockInteractions.tap(abandonButton);
+
+          assert.equal(element.$.confirmAbandonDialog.message, newAbandonMsg);
+          done();
+        });
+      });
+
+      test('abandon change with no message', done => {
+        flush(() => {
+          const abandonButton =
+              element.$$('gr-button[data-action-key="abandon"]');
+          MockInteractions.tap(abandonButton);
+
+          assert.isUndefined(element.$.confirmAbandonDialog.message);
+          done();
+        });
+      });
+
+      test('works', () => {
+        element.$.confirmAbandonDialog.message = 'original message';
+        const restoreButton =
+            element.$$('gr-button[data-action-key="abandon"]');
+        MockInteractions.tap(restoreButton);
+
+        element.$.confirmAbandonDialog.message = 'foo message';
+        element._handleAbandonDialogConfirm();
+        assert.notOk(alertStub.called);
+
+        const action = {
+          __key: 'abandon',
+          __type: 'change',
+          __primary: false,
+          enabled: true,
+          label: 'Abandon',
+          method: 'POST',
+          title: 'Abandon the change',
+        };
+        assert.deepEqual(fireActionStub.lastCall.args, [
+          '/abandon', action, false, {
+            message: 'foo message',
+          }]);
+      });
+    });
+
     suite('revert change', () => {
       let alertStub;
       let fireActionStub;
@@ -715,7 +873,7 @@
         element.change.is_private = false;
 
         element.changeNum = '2';
-        element.patchNum = '2';
+        element.latestPatchNum = '2';
 
         return element.reload();
       });
@@ -761,7 +919,7 @@
         element.change.is_private = true;
 
         element.changeNum = '2';
-        element.patchNum = '2';
+        element.latestPatchNum = '2';
 
         return element.reload();
       });
@@ -853,7 +1011,7 @@
         };
 
         element.changeNum = '2';
-        element.patchNum = '2';
+        element.latestPatchNum = '2';
 
         element.reload().then(() => { flush(done); });
       });
@@ -892,7 +1050,7 @@
         };
 
         element.changeNum = '2';
-        element.patchNum = '2';
+        element.latestPatchNum = '2';
 
         element.reload().then(() => { flush(done); });
       });
@@ -932,7 +1090,7 @@
         };
 
         element.changeNum = '2';
-        element.patchNum = '2';
+        element.latestPatchNum = '2';
 
         element.reload().then(() => { flush(done); });
       });
@@ -972,7 +1130,7 @@
         };
 
         element.changeNum = '2';
-        element.patchNum = '2';
+        element.latestPatchNum = '2';
 
         element.reload().then(() => { flush(done); });
       });
@@ -1022,8 +1180,24 @@
         assert.isNotNull(approveButton);
       });
 
-      test('is first in list of actions', () => {
-        const approveButton = element.$$('gr-button');
+      test('hide quick approve', () => {
+        const approveButton =
+            element.$$('gr-button[data-action-key=\'review\']');
+        assert.isNotNull(approveButton);
+        assert.isFalse(element._hideQuickApproveAction);
+
+        // Assert approve button gets removed from list of buttons.
+        element.hideQuickApproveAction();
+        flushAsynchronousOperations();
+        const approveButtonUpdated =
+            element.$$('gr-button[data-action-key=\'review\']');
+        assert.isNull(approveButtonUpdated);
+        assert.isTrue(element._hideQuickApproveAction);
+      });
+
+      test('is first in list of secondary actions', () => {
+        const approveButton = element.$.secondaryActions
+            .querySelector('gr-button');
         assert.equal(approveButton.getAttribute('data-label'), 'foo+1');
       });
 
@@ -1175,10 +1349,18 @@
       const reloadStub = sandbox.stub(element, 'reload');
       element.changeNum = 123;
       assert.isFalse(reloadStub.called);
-      element.patchNum = 456;
+      element.latestPatchNum = 456;
       assert.isFalse(reloadStub.called);
     });
 
+    test('_toSentenceCase', () => {
+      assert.equal(element._toSentenceCase('blah blah'), 'Blah blah');
+      assert.equal(element._toSentenceCase('BLAH BLAH'), 'Blah blah');
+      assert.equal(element._toSentenceCase('b'), 'B');
+      assert.equal(element._toSentenceCase(''), '');
+      assert.equal(element._toSentenceCase('!@#$%^&*()'), '!@#$%^&*()');
+    });
+
     suite('setActionOverflow', () => {
       test('move action from overflow', () => {
         assert.isNotOk(element.$$('[data-action-key="cherrypick"]'));
@@ -1235,14 +1417,17 @@
     suite('_send', () => {
       let cleanup;
       let payload;
+      let onShowError;
       let onShowAlert;
 
       setup(() => {
         cleanup = sinon.stub();
         element.changeNum = 42;
-        element.patchNum = 12;
+        element.latestPatchNum = 12;
         payload = {foo: 'bar'};
 
+        onShowError = sinon.stub();
+        element.addEventListener('show-error', onShowError);
         onShowAlert = sinon.stub();
         element.addEventListener('show-alert', onShowAlert);
       });
@@ -1251,53 +1436,54 @@
         let sendStub;
 
         setup(() => {
-          sandbox.stub(element, 'fetchIsLatestKnown')
-              .returns(Promise.resolve(true));
-          sendStub = sandbox.stub(element.$.restAPI, 'getChangeURLAndSend')
+          sandbox.stub(element, 'fetchChangeUpdates')
+              .returns(Promise.resolve({isLatest: true}));
+          sendStub = sandbox.stub(element.$.restAPI, 'executeChangeAction')
               .returns(Promise.resolve({}));
         });
 
         test('change action', () => {
           return element._send('DELETE', payload, '/endpoint', false, cleanup)
               .then(() => {
-                assert.isFalse(onShowAlert.called);
+                assert.isFalse(onShowError.called);
                 assert.isTrue(cleanup.calledOnce);
-                assert.isTrue(sendStub.calledWith(42, 'DELETE', null,
-                    '/endpoint', payload));
+                assert.isTrue(sendStub.calledWith(42, 'DELETE', '/endpoint',
+                    null, payload));
               });
         });
 
         test('revision action', () => {
           return element._send('DELETE', payload, '/endpoint', true, cleanup)
               .then(() => {
-                assert.isFalse(onShowAlert.called);
+                assert.isFalse(onShowError.called);
                 assert.isTrue(cleanup.calledOnce);
-                assert.isTrue(sendStub.calledWith(42, 'DELETE', 12, '/endpoint',
-                    payload));
+                assert.isTrue(sendStub.calledWith(42, 'DELETE', '/endpoint',
+                    12, payload));
               });
         });
       });
 
       suite('failure modes', () => {
         test('non-latest', () => {
-          sandbox.stub(element, 'fetchIsLatestKnown')
-              .returns(Promise.resolve(false));
+          sandbox.stub(element, 'fetchChangeUpdates')
+              .returns(Promise.resolve({isLatest: false}));
           const sendStub = sandbox.stub(element.$.restAPI,
-              'getChangeURLAndSend');
+              'executeChangeAction');
 
           return element._send('DELETE', payload, '/endpoint', true, cleanup)
               .then(() => {
                 assert.isTrue(onShowAlert.calledOnce);
+                assert.isFalse(onShowError.called);
                 assert.isTrue(cleanup.calledOnce);
                 assert.isFalse(sendStub.called);
               });
         });
 
         test('send fails', () => {
-          sandbox.stub(element, 'fetchIsLatestKnown')
-              .returns(Promise.resolve(true));
+          sandbox.stub(element, 'fetchChangeUpdates')
+              .returns(Promise.resolve({isLatest: true}));
           const sendStub = sandbox.stub(element.$.restAPI,
-              'getChangeURLAndSend',
+              'executeChangeAction',
               (num, method, patchNum, endpoint, payload, onErr) => {
                 onErr();
                 return Promise.resolve(null);
@@ -1306,7 +1492,7 @@
 
           return element._send('DELETE', payload, '/endpoint', true, cleanup)
               .then(() => {
-                assert.isFalse(onShowAlert.called);
+                assert.isFalse(onShowError.called);
                 assert.isTrue(cleanup.called);
                 assert.isTrue(sendStub.calledOnce);
                 assert.isTrue(handleErrorStub.called);
@@ -1314,5 +1500,13 @@
         });
       });
     });
+
+    test('_handleAction reports', () => {
+      sandbox.stub(element, '_fireAction');
+      const reportStub = sandbox.stub(element.$.reporting, 'reportInteraction');
+      element._handleAction('type', 'key');
+      assert.isTrue(reportStub.called);
+      assert.equal(reportStub.lastCall.args[0], 'type-key');
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata-it_test.html b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata-it_test.html
index 90776c0..5b36221 100644
--- a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata-it_test.html
+++ b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata-it_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -28,7 +29,7 @@
 
 <test-fixture id="element">
   <template>
-    <gr-change-metadata></gr-change-metadata>
+    <gr-change-metadata mutable="true"></gr-change-metadata>
   </template>
 </test-fixture>
 
@@ -45,37 +46,55 @@
 
     const sectionSelectors = [
       'section.assignee',
-      'section.labelStatus',
       'section.strategy',
       'section.topic',
     ];
 
+    const labels = {
+      CI: {
+        all: [
+          {value: 1, name: 'user 2', _account_id: 1},
+          {value: 2, name: 'user '},
+        ],
+        values: {
+          ' 0': 'Don\'t submit as-is',
+          '+1': 'No score',
+          '+2': 'Looks good to me',
+        },
+      },
+    };
+
     const getStyle = function(selector, name) {
       return window.getComputedStyle(
           Polymer.dom(element.root).querySelector(selector))[name];
     };
 
+    function createElement() {
+      const element = fixture('element');
+      element.change = {labels, status: 'NEW'};
+      element.revision = {};
+      return element;
+    }
+
     setup(() => {
       sandbox = sinon.sandbox.create();
+      stub('gr-rest-api-interface', {
+        getConfig() { return Promise.resolve({}); },
+        getLoggedIn() { return Promise.resolve(false); },
+        deleteVote() { return Promise.resolve({ok: true}); },
+      });
       stub('gr-change-metadata', {
-        _computeShowLabelStatus() { return true; },
         _computeShowReviewersByState() { return true; },
-        ready() {
-          this.change = {labels: [], status: 'NEW'};
-          this.serverConfig = {};
-        },
       });
     });
 
     teardown(() => {
-      Gerrit._pluginsPending = -1;
-      Gerrit._allPluginsPromise = undefined;
       sandbox.restore();
     });
 
     suite('by default', () => {
       setup(done => {
-        element = fixture('element');
+        element = createElement();
         flush(done);
       });
 
@@ -88,6 +107,7 @@
 
     suite('with plugin style', () => {
       setup(done => {
+        Gerrit._resetPlugins();
         const pluginHost = fixture('plugin-host');
         pluginHost.config = {
           plugin: {
@@ -98,7 +118,7 @@
             ],
           },
         };
-        element = fixture('element');
+        element = createElement();
         const importSpy = sandbox.spy(element.$.externalStyle, '_import');
         Gerrit.awaitPluginsLoaded().then(() => {
           Promise.all(importSpy.returnValues).then(() => {
@@ -113,5 +133,46 @@
         });
       }
     });
+
+    suite('label updates', () => {
+      let plugin;
+
+      setup(() => {
+        Gerrit.install(p => plugin = p, '0.1',
+            new URL('test/plugin.html?' + Math.random(),
+                    window.location.href).toString());
+        sandbox.stub(Gerrit, '_arePluginsLoaded').returns(true);
+        Gerrit._setPluginsPending([]);
+        element = createElement();
+      });
+
+      test('labels changed callback', done => {
+        let callCount = 0;
+        const labelChangeSpy = sandbox.spy(arg => {
+          callCount++;
+          if (callCount === 1) {
+            assert.deepEqual(arg, labels);
+            assert.equal(arg.CI.all.length, 2);
+            element.set(['change', 'labels'], {
+              CI: {
+                all: [
+                  {value: 1, name: 'user 2', _account_id: 1},
+                ],
+                values: {
+                  ' 0': 'Don\'t submit as-is',
+                  '+1': 'No score',
+                  '+2': 'Looks good to me',
+                },
+              },
+            });
+          } else if (callCount === 2) {
+            assert.equal(arg.CI.all.length, 1);
+            done();
+          }
+        });
+
+        plugin.changeMetadata().onLabelsChanged(labelChangeSpy);
+      });
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata.html b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata.html
index 9553d1e..c07a775 100644
--- a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata.html
+++ b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,39 +15,61 @@
 limitations under the License.
 -->
 
-<link rel="import" href="../../../behaviors/rest-client-behavior/rest-client-behavior.html">
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../../behaviors/rest-client-behavior/rest-client-behavior.html">
 <link rel="import" href="../../../styles/shared-styles.html">
-<link rel="import" href="../../plugins/gr-external-style/gr-external-style.html">
+<link rel="import" href="../../../styles/gr-voting-styles.html">
 <link rel="import" href="../../core/gr-navigation/gr-navigation.html">
+<link rel="import" href="../../plugins/gr-endpoint-decorator/gr-endpoint-decorator.html">
+<link rel="import" href="../../plugins/gr-endpoint-param/gr-endpoint-param.html">
+<link rel="import" href="../../plugins/gr-external-style/gr-external-style.html">
 <link rel="import" href="../../shared/gr-account-chip/gr-account-chip.html">
 <link rel="import" href="../../shared/gr-account-link/gr-account-link.html">
 <link rel="import" href="../../shared/gr-date-formatter/gr-date-formatter.html">
 <link rel="import" href="../../shared/gr-editable-label/gr-editable-label.html">
-<link rel="import" href="../../shared/gr-label/gr-label.html">
+<link rel="import" href="../../shared/gr-icons/gr-icons.html">
+<link rel="import" href="../../shared/gr-limited-text/gr-limited-text.html">
 <link rel="import" href="../../shared/gr-linked-chip/gr-linked-chip.html">
+<link rel="import" href="../../shared/gr-tooltip-content/gr-tooltip-content.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
+<link rel="import" href="../gr-change-requirements/gr-change-requirements.html">
+<link rel="import" href="../gr-commit-info/gr-commit-info.html">
 <link rel="import" href="../gr-reviewer-list/gr-reviewer-list.html">
 
 <dom-module id="gr-change-metadata">
   <template>
     <style include="shared-styles">
-      .hideDisplay {
-        display: none;
+      :host {
+        display: table;
+      }
+      section {
+        display: table-row;
+      }
+      section:not(:first-of-type) .title,
+      section:not(:first-of-type) .value {
+        padding-top: .5em;
       }
       section:not(:first-of-type) {
         margin-top: 1em;
       }
       .title,
       .value {
-        display: block;
+        display: table-cell;
       }
       .title {
-        color: #666;
-        font-family: var(--font-family-bold);
+        color: var(--deemphasized-text-color);
+        font-weight: var(--font-weight-bold);
         max-width: 20em;
+        padding-left: var(--metadata-horizontal-padding);
+        padding-right: .5em;
         word-break: break-word;
       }
+      .value {
+        padding-right: var(--metadata-horizontal-padding);
+      }
+      gr-change-requirements {
+        --requirements-horizontal-padding: var(--metadata-horizontal-padding);
+      }
       gr-account-link {
         max-width: 20ch;
         overflow: hidden;
@@ -57,53 +80,21 @@
       gr-editable-label {
         max-width: 9em;
       }
-      .labelValueContainer:not(:first-of-type) {
-        margin-top: .25em;
-      }
-      .labelValueContainer .approved,
-      .labelValueContainer .notApproved {
-        display: inline-flex;
-        padding: .1em .3em;
-        border-radius: 3px;
-      }
-      .labelValue {
-        display: inline-block;
-        padding-right: .3em;
-      }
-      .approved {
-        background-color: #d4ffd4;
-      }
-      .notApproved {
-        background-color: #ffd4d4;
-      }
-      .labelStatus .value {
-        max-width: 9em;
-      }
-      .labelStatus li {
-        list-style-type: disc;
-      }
       .webLink {
         display: block;
       }
-      #missingLabels {
-        padding-left: 1.5em;
-      }
-
       /* CSS Mixins should be applied last. */
       section.assignee {
-        @apply(--change-metadata-assignee);
-      }
-      section.labelStatus {
-        @apply(--change-metadata-label-status);
+        @apply --change-metadata-assignee;
       }
       section.strategy {
-        @apply(--change-metadata-strategy);
+        @apply --change-metadata-strategy;
       }
       section.topic {
-        @apply(--change-metadata-topic);
+        @apply --change-metadata-topic;
       }
-      gr-account-chip([disabled]),
-      gr-linked-chip([disabled]) {
+      gr-account-chip[disabled],
+      gr-linked-chip[disabled] {
         opacity: 0;
         pointer-events: none;
       }
@@ -113,24 +104,38 @@
       #externalStyle {
         display: block;
       }
-      @media screen and (max-width: 50em), screen and (min-width: 75em) {
-        :host {
-          display: table;
-        }
-        section {
-          display: table-row;
-        }
-        section:not(:first-of-type) .title,
-        section:not(:first-of-type) .value {
-          padding-top: .5em;
-        }
-        .title,
-        .value {
-          display: table-cell;
-        }
-        .title {
-          padding-right: .5em;
-        }
+      .parentList.merge {
+        list-style-type: decimal;
+        padding-left: 1em;
+      }
+      .parentList gr-commit-info {
+        display: inline-block;
+      }
+      .hideDisplay,
+      #parentNotCurrentMessage {
+        display: none;
+      }
+      .icon {
+        margin: -.25em 0;
+      }
+      .icon.help,
+      .icon.notTrusted {
+        color: #FFA62F;
+      }
+      .icon.invalid {
+        color: var(--vote-text-color-disliked);
+      }
+      .icon.trusted {
+        color: var(--vote-text-color-recommended);
+      }
+      .parentList.notCurrent.nonMerge #parentNotCurrentMessage {
+        --arrow-color: #ffa62f;
+        display: inline-block;
+      }
+      .separatedSection {
+        border-top: 1px solid var(--border-color);
+        margin-top: .5em;
+        padding: .5em 0;
       }
     </style>
     <gr-external-style id="externalStyle" name="change-metadata">
@@ -146,13 +151,40 @@
         <span class="title">Owner</span>
         <span class="value">
           <gr-account-link account="[[change.owner]]"></gr-account-link>
+          <template is="dom-if" if="[[_pushCertificateValidation]]">
+            <gr-tooltip-content
+                has-tooltip
+                title$="[[_pushCertificateValidation.message]]">
+              <iron-icon
+                  class$="icon [[_pushCertificateValidation.class]]"
+                  icon="[[_pushCertificateValidation.icon]]">
+              </iron-icon>
+            </gr-tooltip-content>
+          </template>
         </span>
       </section>
-      <section class$="[[_computeShowUploaderHide(change)]]">
+      <section class$="[[_computeShowRoleClass(change, _CHANGE_ROLE.UPLOADER)]]">
         <span class="title">Uploader</span>
         <span class="value">
           <gr-account-link
-              account="[[_computeShowUploader(change)]]"></gr-account-link>
+              account="[[_getNonOwnerRole(change, _CHANGE_ROLE.UPLOADER)]]"
+              ></gr-account-link>
+        </span>
+      </section>
+      <section class$="[[_computeShowRoleClass(change, _CHANGE_ROLE.AUTHOR)]]">
+        <span class="title">Author</span>
+        <span class="value">
+          <gr-account-link
+              account="[[_getNonOwnerRole(change, _CHANGE_ROLE.AUTHOR)]]"
+              ></gr-account-link>
+        </span>
+      </section>
+      <section class$="[[_computeShowRoleClass(change, _CHANGE_ROLE.COMMITTER)]]">
+        <span class="title">Committer</span>
+        <span class="value">
+          <gr-account-link
+              account="[[_getNonOwnerRole(change, _CHANGE_ROLE.COMMITTER)]]"
+              ></gr-account-link>
         </span>
       </section>
       <section class="assignee">
@@ -164,7 +196,7 @@
               placeholder="Set assignee..."
               accounts="{{_assignee}}"
               change="[[change]]"
-              readonly="[[_computeAssigneeReadOnly(mutable, change)]]"
+              readonly="[[_computeAssigneeReadOnly(_mutable, change)]]"
               allow-any-user></gr-account-list>
         </span>
       </section>
@@ -174,8 +206,9 @@
           <span class="value">
             <gr-reviewer-list
                 change="{{change}}"
-                mutable="[[mutable]]"
-                reviewers-only></gr-reviewer-list>
+                mutable="[[_mutable]]"
+                reviewers-only
+                max-reviewers-displayed="3"></gr-reviewer-list>
           </span>
         </section>
         <section>
@@ -183,9 +216,9 @@
           <span class="value">
             <gr-reviewer-list
                 change="{{change}}"
-                mutable="[[mutable]]"
+                mutable="[[_mutable]]"
                 ccs-only
-                max-reviewers-displayed="5"></gr-reviewer-list>
+                max-reviewers-displayed="3"></gr-reviewer-list>
           </span>
         </section>
       </template>
@@ -195,26 +228,52 @@
           <span class="value">
             <gr-reviewer-list
                 change="{{change}}"
-                mutable="[[mutable]]"></gr-reviewer-list>
+                mutable="[[_mutable]]"></gr-reviewer-list>
           </span>
         </section>
       </template>
       <section>
-        <span class="title">Project</span>
+        <span class="title">Repo</span>
         <span class="value">
-          <a href$="[[_computeProjectURL(change.project)]]">[[change.project]]</a>
+          <a href$="[[_computeProjectURL(change.project)]]">
+            <gr-limited-text limit="40" text="[[change.project]]"></gr-limited-text>
+          </a>
         </span>
       </section>
       <section>
         <span class="title">Branch</span>
         <span class="value">
-          <a href$="[[_computeBranchURL(change.project, change.branch)]]">[[change.branch]]</a>
+          <a href$="[[_computeBranchURL(change.project, change.branch)]]">
+            <gr-limited-text limit="40" text="[[change.branch]]"></gr-limited-text>
+          </a>
+        </span>
+      </section>
+      <section>
+        <span class="title">[[_computeParentsLabel(_currentParents)]]</span>
+        <span class="value">
+          <ol class$="[[_computeParentListClass(_currentParents, parentIsCurrent)]]">
+            <template is="dom-repeat" items="[[_currentParents]]" as="parent">
+              <li>
+                <gr-commit-info
+                    change="[[change]]"
+                    commit-info="[[parent]]"
+                    server-config="[[serverConfig]]"></gr-commit-info>
+                <gr-tooltip-content
+                    id="parentNotCurrentMessage"
+                    has-tooltip
+                    show-icon
+                    title$="[[_notCurrentMessage]]"></gr-tooltip-content>
+              </li>
+            </template>
+          </ol>
         </span>
       </section>
       <section class="topic">
         <span class="title">Topic</span>
         <span class="value">
-          <template is="dom-if" if="[[change.topic]]">
+          <template
+              is="dom-if"
+              if="[[_showTopicChip(change.*, _settingTopic)]]">
             <gr-linked-chip
                 text="[[change.topic]]"
                 limit="40"
@@ -222,11 +281,14 @@
                 removable="[[!_topicReadOnly]]"
                 on-remove="_handleTopicRemoved"></gr-linked-chip>
           </template>
-          <template is="dom-if" if="[[!change.topic]]">
+          <template
+              is="dom-if"
+              if="[[_showAddTopic(change.*, _settingTopic)]]">
             <gr-editable-label
-                uppercase
+                class="topicEditableLabel"
                 label-text="Add a topic"
                 value="[[change.topic]]"
+                max-length="1024"
                 placeholder="[[_computeTopicPlaceholder(_topicReadOnly)]]"
                 read-only="[[_topicReadOnly]]"
                 on-changed="_handleTopicChanged"></gr-editable-label>
@@ -250,79 +312,40 @@
                   on-remove="_handleHashtagRemoved">
               </gr-linked-chip>
             </template>
-            <gr-editable-label
-                uppercase
-                label-text="Add a hashtag"
-                value="{{_newHashtag}}"
-                placeholder="[[_computeHashtagPlaceholder(_hashtagReadOnly)]]"
-                read-only="[[_hashtagReadOnly]]"
-                on-changed="_handleHashtagChanged"></gr-editable-label>
-          </span>
-        </section>
-      </template>
-      <template is="dom-repeat"
-          items="[[_computeLabelNames(change.labels)]]" as="labelName">
-        <section>
-          <span class="title">[[labelName]]</span>
-          <span class="value">
-            <template is="dom-repeat"
-                items="[[_computeLabelValues(labelName, change.labels.*)]]"
-                as="label">
-              <div class="labelValueContainer">
-                <span class$="[[label.className]]">
-                  <gr-label
-                      has-tooltip
-                      title="[[_computeValueTooltip(change, label.value, labelName)]]"
-                      class="labelValue">
-                    [[label.value]]
-                  </gr-label>
-                  <gr-account-chip
-                      account="[[label.account]]"
-                      data-account-id$="[[label.account._account_id]]"
-                      label-name="[[labelName]]"
-                      removable="[[_computeCanDeleteVote(label.account, mutable)]]"
-                      transparent-background
-                      on-remove="_onDeleteVote"></gr-account-chip>
-                </span>
-              </div>
+            <template is="dom-if" if="[[!_hashtagReadOnly]]">
+              <gr-editable-label
+                  uppercase
+                  label-text="Add a hashtag"
+                  value="{{_newHashtag}}"
+                  placeholder="[[_computeHashtagPlaceholder(_hashtagReadOnly)]]"
+                  read-only="[[_hashtagReadOnly]]"
+                  on-changed="_handleHashtagChanged"></gr-editable-label>
             </template>
           </span>
         </section>
       </template>
-      <template is="dom-if" if="[[_showLabelStatus]]">
-        <section class="labelStatus">
-          <span class="title">Label Status</span>
-          <span class="value">
-            <div hidden$="[[!_isWip]]">
-              Work in progress
-            </div>
-            <div hidden$="[[!_showMissingLabels(change.labels)]]">
-              [[_computeMissingLabelsHeader(change.labels)]]
-              <ul id="missingLabels">
-                <template
-                    is="dom-repeat"
-                    items="[[_computeMissingLabels(change.labels)]]">
-                  <li>[[item]]</li>
-                </template>
-              </ul>
-            </div>
-            <div hidden$="[[_showMissingRequirements(change.labels, _isWip)]]">
-              Ready to submit
-            </div>
-          </span>
-        </section>
-      </template>
-      <section id="webLinks" hidden$="[[!_computeWebLinks(commitInfo)]]">
+      <div class="separatedSection">
+        <gr-change-requirements
+            change="{{change}}"
+            account="[[account]]"
+            mutable="[[_mutable]]"></gr-change-requirements>
+      </div>
+      <section id="webLinks" hidden$="[[!_computeWebLinks(commitInfo, serverConfig)]]">
         <span class="title">Links</span>
         <span class="value">
           <template is="dom-repeat"
-              items="[[_computeWebLinks(commitInfo)]]" as="link">
+              items="[[_computeWebLinks(commitInfo, serverConfig)]]" as="link">
             <a href="[[link.url]]" class="webLink" rel="noopener" target="_blank">
               [[link.name]]
             </a>
           </template>
         </span>
       </section>
+      <gr-endpoint-decorator name="change-metadata-item">
+        <gr-endpoint-param name="labels" value="[[labels]]"></gr-endpoint-param>
+        <gr-endpoint-param name="change" value="[[change]]"></gr-endpoint-param>
+        <gr-endpoint-param name="revision" value="[[revision]]"></gr-endpoint-param>
+      </gr-endpoint-decorator>
     </gr-external-style>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
   </template>
diff --git a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata.js b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata.js
index e95c494..f2d49d6 100644
--- a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata.js
+++ b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata.js
@@ -1,19 +1,33 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
+  const Defs = {};
+
+  /**
+   * @typedef {{
+   *    message: string,
+   *    icon: string,
+   *    class: string,
+   *  }}
+   */
+  Defs.PushCertificateValidation;
+
   const HASHTAG_ADD_MESSAGE = 'Add Hashtag';
 
   const SubmitTypeLabel = {
@@ -25,6 +39,26 @@
     CHERRY_PICK: 'Cherry Pick',
   };
 
+  const NOT_CURRENT_MESSAGE = 'Not current - rebase possible';
+
+  /**
+   * @enum {string}
+   */
+  const CertificateStatus = {
+    /**
+     * This certificate status is bad.
+     */
+    BAD: 'BAD',
+    /**
+     * This certificate status is OK.
+     */
+    OK: 'OK',
+    /**
+     * This certificate status is TRUSTED.
+     */
+    TRUSTED: 'TRUSTED',
+  };
+
   Polymer({
     is: 'gr-change-metadata',
 
@@ -37,27 +71,50 @@
     properties: {
       /** @type {?} */
       change: Object,
+      labels: {
+        type: Object,
+        notify: true,
+      },
+      account: Object,
+      /** @type {?} */
+      revision: Object,
       commitInfo: Object,
-      mutable: Boolean,
+      _mutable: {
+        type: Boolean,
+        computed: '_computeIsMutable(account)',
+      },
       /**
        * @type {{ note_db_enabled: string }}
        */
       serverConfig: Object,
+      parentIsCurrent: Boolean,
+      _notCurrentMessage: {
+        type: String,
+        value: NOT_CURRENT_MESSAGE,
+        readOnly: true,
+      },
       _topicReadOnly: {
         type: Boolean,
-        computed: '_computeTopicReadOnly(mutable, change)',
+        computed: '_computeTopicReadOnly(_mutable, change)',
       },
       _hashtagReadOnly: {
         type: Boolean,
-        computed: '_computeHashtagReadOnly(mutable, change)',
+        computed: '_computeHashtagReadOnly(_mutable, change)',
       },
       _showReviewersByState: {
         type: Boolean,
         computed: '_computeShowReviewersByState(serverConfig)',
       },
-      _showLabelStatus: {
+      /**
+       * @type {Defs.PushCertificateValidation}
+       */
+      _pushCertificateValidation: {
+        type: Object,
+        computed: '_computePushCertificateValidation(serverConfig, change)',
+      },
+      _showRequirements: {
         type: Boolean,
-        computed: '_computeShowLabelStatus(change)',
+        computed: '_computeShowRequirements(change)',
       },
 
       _assignee: Array,
@@ -66,6 +123,28 @@
         computed: '_computeIsWip(change)',
       },
       _newHashtag: String,
+
+      _settingTopic: {
+        type: Boolean,
+        value: false,
+      },
+
+      _currentParents: {
+        type: Array,
+        computed: '_computeParents(change)',
+      },
+
+      /** @type {?} */
+      _CHANGE_ROLE: {
+        type: Object,
+        readOnly: true,
+        value: {
+          OWNER: 'owner',
+          UPLOADER: 'uploader',
+          AUTHOR: 'author',
+          COMMITTER: 'committer',
+        },
+      },
     },
 
     behaviors: [
@@ -74,9 +153,14 @@
 
     observers: [
       '_changeChanged(change)',
+      '_labelsChanged(change.labels)',
       '_assigneeChanged(_assignee.*)',
     ],
 
+    _labelsChanged(labels) {
+      this.labels = Object.assign({}, labels) || null;
+    },
+
     _changeChanged(change) {
       this._assignee = change.assignee ? [change.assignee] : [];
     },
@@ -102,27 +186,21 @@
     },
 
     /**
-     * This is a whitelist of web link types that provide direct links to
-     * the commit in the url property.
-     */
-    _isCommitWebLink(link) {
-      return link.name === 'gitiles' || link.name === 'gitweb';
-    },
-
-    /**
      * @param {Object} commitInfo
      * @return {?Array} If array is empty, returns null instead so
      * an existential check can be used to hide or show the webLinks
      * section.
      */
-    _computeWebLinks(commitInfo) {
-      if (!commitInfo || !commitInfo.web_links) { return null; }
-      // We are already displaying these types of links elsewhere,
-      // don't include in the metadata links section.
-      const webLinks = commitInfo.web_links.filter(
-          l => { return !this._isCommitWebLink(l); });
-
-      return webLinks.length ? webLinks : null;
+    _computeWebLinks(commitInfo, serverConfig) {
+      if (!commitInfo) { return null; }
+      const weblinks = Gerrit.Nav.getChangeWeblinks(
+          this.change ? this.change.repo : '',
+          commitInfo.commit,
+          {
+            weblinks: commitInfo.web_links,
+            config: serverConfig,
+          });
+      return weblinks.length ? weblinks : null;
     },
 
     _computeStrategy(change) {
@@ -133,44 +211,13 @@
       return Object.keys(labels).sort();
     },
 
-    _computeLabelValues(labelName, _labels) {
-      const result = [];
-      const labels = _labels.base;
-      const t = labels[labelName];
-      if (!t) { return result; }
-      const approvals = t.all || [];
-      for (const label of approvals) {
-        if (label.value && label.value != labels[labelName].default_value) {
-          let labelClassName;
-          let labelValPrefix = '';
-          if (label.value > 0) {
-            labelValPrefix = '+';
-            labelClassName = 'approved';
-          } else if (label.value < 0) {
-            labelClassName = 'notApproved';
-          }
-          result.push({
-            value: labelValPrefix + label.value,
-            className: labelClassName,
-            account: label,
-          });
-        }
-      }
-      return result;
-    },
-
-    _computeValueTooltip(change, score, labelName) {
-      if (!change.labels[labelName] ||
-          !change.labels[labelName].values ||
-          !change.labels[labelName].values[score]) { return ''; }
-      return change.labels[labelName].values[score];
-    },
-
     _handleTopicChanged(e, topic) {
       const lastTopic = this.change.topic;
       if (!topic.length) { topic = null; }
+      this._settingTopic = true;
       this.$.restAPI.setChangeTopic(this.change._number, topic)
           .then(newTopic => {
+            this._settingTopic = false;
             this.set(['change', 'topic'], newTopic);
             if (newTopic !== lastTopic) {
               this.dispatchEvent(
@@ -179,38 +226,56 @@
           });
     },
 
+    _showAddTopic(changeRecord, settingTopic) {
+      const hasTopic = !!changeRecord && !!changeRecord.base.topic;
+      return !hasTopic && !settingTopic;
+    },
+
+    _showTopicChip(changeRecord, settingTopic) {
+      const hasTopic = !!changeRecord && !!changeRecord.base.topic;
+      return hasTopic && !settingTopic;
+    },
+
     _handleHashtagChanged(e) {
       const lastHashtag = this.change.hashtag;
       if (!this._newHashtag.length) { return; }
+      const newHashtag = this._newHashtag;
+      this._newHashtag = '';
       this.$.restAPI.setChangeHashtag(
-          this.change._number, {add: [this._newHashtag]}).then(newHashtag => {
+          this.change._number, {add: [newHashtag]}).then(newHashtag => {
             this.set(['change', 'hashtags'], newHashtag);
             if (newHashtag !== lastHashtag) {
               this.dispatchEvent(
                   new CustomEvent('hashtag-changed', {bubbles: true}));
             }
-            this._newHashtag = '';
           });
     },
 
     _computeTopicReadOnly(mutable, change) {
-      return !mutable || !change.actions.topic || !change.actions.topic.enabled;
+      return !mutable ||
+          !change.actions ||
+          !change.actions.topic ||
+          !change.actions.topic.enabled;
     },
 
     _computeHashtagReadOnly(mutable, change) {
       return !mutable ||
+          !change.actions ||
           !change.actions.hashtags ||
           !change.actions.hashtags.enabled;
     },
 
     _computeAssigneeReadOnly(mutable, change) {
       return !mutable ||
+          !change.actions ||
           !change.actions.assignee ||
           !change.actions.assignee.enabled;
     },
 
     _computeTopicPlaceholder(_topicReadOnly) {
-      return _topicReadOnly ? 'No Topic' : 'Add Topic';
+      // Action items in Material Design are uppercase -- placeholder label text
+      // is sentence case.
+      return _topicReadOnly ? 'No topic' : 'ADD TOPIC';
     },
 
     _computeHashtagPlaceholder(_hashtagReadOnly) {
@@ -221,100 +286,74 @@
       return !!serverConfig.note_db_enabled;
     },
 
+    _computeShowRequirements(change) {
+      if (change.status !== this.ChangeStatus.NEW) {
+        // TODO(maximeg) change this to display the stored
+        // requirements, once it is implemented server-side.
+        return false;
+      }
+      const hasRequirements = !!change.requirements &&
+          Object.keys(change.requirements).length > 0;
+      const hasLabels = !!change.labels &&
+          Object.keys(change.labels).length > 0;
+      return hasRequirements || hasLabels || !!change.work_in_progress;
+    },
+
     /**
-     * A user is able to delete a vote iff the mutable property is true and the
-     * reviewer that left the vote exists in the list of removable_reviewers
-     * received from the backend.
-     *
-     * @param {!Object} reviewer An object describing the reviewer that left the
-     *     vote.
-     * @param {boolean} mutable this.mutable describes whether the
-     *     change-metadata section is modifiable by the current user.
+     * @return {?Defs.PushCertificateValidation} object representing data for
+     *     the push validation.
      */
-    _computeCanDeleteVote(reviewer, mutable) {
-      if (!mutable) { return false; }
-      for (let i = 0; i < this.change.removable_reviewers.length; i++) {
-        if (this.change.removable_reviewers[i]._account_id ===
-            reviewer._account_id) {
-          return true;
-        }
+    _computePushCertificateValidation(serverConfig, change) {
+      if (!serverConfig || !serverConfig.receive ||
+          !serverConfig.receive.enable_signed_push) {
+        return null;
       }
-      return false;
-    },
-
-    /**
-     * Closure annotation for Polymer.prototype.splice is off.
-     * For now, supressing annotations.
-     *
-     * TODO(beckysiegel) submit Polymer PR
-     *
-     * @suppress {checkTypes} */
-    _onDeleteVote(e) {
-      e.preventDefault();
-      const target = Polymer.dom(e).rootTarget;
-      target.disabled = true;
-      const labelName = target.labelName;
-      const accountID = parseInt(target.getAttribute('data-account-id'), 10);
-      this._xhrPromise =
-          this.$.restAPI.deleteVote(this.change._number, accountID, labelName)
-          .then(response => {
-            target.disabled = false;
-            if (!response.ok) { return response; }
-            const label = this.change.labels[labelName];
-            const labels = label.all || [];
-            for (let i = 0; i < labels.length; i++) {
-              if (labels[i]._account_id === accountID) {
-                for (const key in label) {
-                  if (label.hasOwnProperty(key) &&
-                      label[key]._account_id === accountID) {
-                    // Remove special label field, keeping change label values
-                    // in sync with the backend.
-                    this.set(['change.labels', labelName, key], null);
-                  }
-                }
-                this.splice(['change.labels', labelName, 'all'], i, 1);
-                break;
-              }
-            }
-          }).catch(err => {
-            target.disabled = false;
-            return;
-          });
-    },
-
-    _computeShowLabelStatus(change) {
-      const isNewChange = change.status === this.ChangeStatus.NEW;
-      const hasLabels = Object.keys(change.labels).length > 0;
-      return isNewChange && hasLabels;
-    },
-
-    _computeMissingLabels(labels) {
-      const missingLabels = [];
-      for (const label in labels) {
-        if (!labels.hasOwnProperty(label)) { continue; }
-        const obj = labels[label];
-        if (!obj.optional && !obj.approved) {
-          missingLabels.push(label);
-        }
+      const rev = change.revisions[change.current_revision];
+      if (!rev.push_certificate || !rev.push_certificate.key) {
+        return {
+          class: 'help',
+          icon: 'gr-icons:help',
+          message: 'This patch set was created without a push certificate',
+        };
       }
-      return missingLabels;
+
+      const key = rev.push_certificate.key;
+      switch (key.status) {
+        case CertificateStatus.BAD:
+          return {
+            class: 'invalid',
+            icon: 'gr-icons:close',
+            message: this._problems('Push certificate is invalid', key),
+          };
+        case CertificateStatus.OK:
+          return {
+            class: 'notTrusted',
+            icon: 'gr-icons:info',
+            message: this._problems(
+                'Push certificate is valid, but key is not trusted', key),
+          };
+        case CertificateStatus.TRUSTED:
+          return {
+            class: 'trusted',
+            icon: 'gr-icons:check',
+            message: this._problems(
+                'Push certificate is valid and key is trusted', key),
+          };
+        default:
+          throw new Error(`unknown certificate status: ${key.status}`);
+      }
     },
 
-    _computeMissingLabelsHeader(labels) {
-      return 'Needs label' +
-          (this._computeMissingLabels(labels).length > 1 ? 's' : '') + ':';
-    },
+    _problems(msg, key) {
+      if (!key || !key.problems || key.problems.length === 0) {
+        return msg;
+      }
 
-    _showMissingLabels(labels) {
-      return !!this._computeMissingLabels(labels).length;
-    },
-
-    _showMissingRequirements(labels, workInProgress) {
-      return workInProgress || this._showMissingLabels(labels);
+      return [msg + ':'].concat(key.problems).join('\n');
     },
 
     _computeProjectURL(project) {
-      return Gerrit.Nav.getUrlForProject(project);
+      return Gerrit.Nav.getUrlForProjectChanges(project);
     },
 
     _computeBranchURL(project, branch) {
@@ -364,24 +403,77 @@
       return !!change.work_in_progress;
     },
 
-    _computeShowUploaderHide(change) {
-      return this._computeShowUploader(change) ? '' : 'hideDisplay';
+    _computeShowRoleClass(change, role) {
+      return this._getNonOwnerRole(change, role) ? '' : 'hideDisplay';
     },
 
-    _computeShowUploader(change) {
+    /**
+     * Get the user with the specified role on the change. Returns null if the
+     * user with that role is the same as the owner.
+     * @param {!Object} change
+     * @param {string} role One of the values from _CHANGE_ROLE
+     * @return {Object|null} either an accound or null.
+     */
+    _getNonOwnerRole(change, role) {
       if (!change.current_revision ||
           !change.revisions[change.current_revision]) {
         return null;
       }
 
       const rev = change.revisions[change.current_revision];
+      if (!rev) { return null; }
 
-      if (!rev || !rev.uploader ||
-        change.owner._account_id === rev.uploader._account_id) {
-        return null;
+      if (role === this._CHANGE_ROLE.UPLOADER &&
+          rev.uploader &&
+          change.owner._account_id !== rev.uploader._account_id) {
+        return rev.uploader;
       }
 
-      return rev.uploader;
+      if (role === this._CHANGE_ROLE.AUTHOR &&
+          rev.commit && rev.commit.author &&
+          change.owner.email !== rev.commit.author.email) {
+        return rev.commit.author;
+      }
+
+      if (role === this._CHANGE_ROLE.COMMITTER &&
+          rev.commit && rev.commit.committer &&
+          change.owner.email !== rev.commit.committer.email) {
+        return rev.commit.committer;
+      }
+
+      return null;
+    },
+
+    _computeParents(change) {
+      if (!change.current_revision ||
+          !change.revisions[change.current_revision] ||
+          !change.revisions[change.current_revision].commit) {
+        return undefined;
+      }
+      return change.revisions[change.current_revision].commit.parents;
+    },
+
+    _computeParentsLabel(parents) {
+      return parents.length > 1 ? 'Parents' : 'Parent';
+    },
+
+    _computeParentListClass(parents, parentIsCurrent) {
+      return [
+        'parentList',
+        parents.length > 1 ? 'merge' : 'nonMerge',
+        parentIsCurrent ? 'current' : 'notCurrent',
+      ].join(' ');
+    },
+
+    _computeIsMutable(account) {
+      return !!Object.keys(account).length;
+    },
+
+    editTopic() {
+      if (this._topicReadOnly || this.change.topic) { return; }
+      // Cannot use `this.$.ID` syntax because the element exists inside of a
+      // dom-if.
+      this.$$('.topicEditableLabel').open();
     },
   });
 })();
diff --git a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata_test.html b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata_test.html
index 58188cd..b23ac8d 100644
--- a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata_test.html
+++ b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -21,6 +22,7 @@
 <script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
 <script src="../../../bower_components/web-component-tester/browser.js"></script>
 <link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="../../core/gr-router/gr-router.html">
 <link rel="import" href="gr-change-metadata.html">
 
 <script>void(0);</script>
@@ -38,6 +40,9 @@
 
     setup(() => {
       sandbox = sinon.sandbox.create();
+      stub('gr-endpoint-decorator', {
+        _import: sandbox.stub().returns(Promise.resolve()),
+      });
       stub('gr-rest-api-interface', {
         getConfig() { return Promise.resolve({}); },
         getLoggedIn() { return Promise.resolve(false); },
@@ -60,6 +65,43 @@
           'Rebase Always');
     });
 
+    test('computed fields requirements', () => {
+      assert.isFalse(element._computeShowRequirements({status: 'MERGED'}));
+      assert.isFalse(element._computeShowRequirements({status: 'ABANDONED'}));
+
+      // No labels and no requirements: submit status is useless
+      assert.isFalse(element._computeShowRequirements({
+        status: 'NEW',
+        labels: {},
+      }));
+
+      // Work in Progress: submit status should be present
+      assert.isTrue(element._computeShowRequirements({
+        status: 'NEW',
+        labels: {},
+        work_in_progress: true,
+      }));
+
+      // We have at least one reason to display Submit Status
+      assert.isTrue(element._computeShowRequirements({
+        status: 'NEW',
+        labels: {
+          Verified: {
+            approved: false,
+          },
+        },
+        requirements: [],
+      }));
+      assert.isTrue(element._computeShowRequirements({
+        status: 'NEW',
+        labels: {},
+        requirements: [{
+          fallback_text: 'Resolve all comments',
+          status: 'OK',
+        }],
+      }));
+    });
+
     test('show strategy for open change', () => {
       element.change = {status: 'NEW', submit_type: 'CHERRY_PICK', labels: {}};
       flushAsynchronousOperations();
@@ -87,37 +129,21 @@
       assert.isTrue(hasCc());
     });
 
-    test('computes submit status', () => {
-      let showMissingLabels = false;
-      sandbox.stub(element, '_showMissingLabels', () => {
-        return showMissingLabels;
-      });
-      assert.isFalse(element._showMissingRequirements(null, false));
-      assert.isTrue(element._showMissingRequirements(null, true));
-      showMissingLabels = true;
-      assert.isTrue(element._showMissingRequirements(null, false));
-    });
-
-    test('show missing labels', () => {
-      let labels = {};
-      assert.isFalse(element._showMissingLabels(labels));
-      labels = {test: {}};
-      assert.isTrue(element._showMissingLabels(labels));
-      assert.deepEqual(element._computeMissingLabels(labels), ['test']);
-      labels.test.approved = true;
-      assert.isFalse(element._showMissingLabels(labels));
-      labels.test.approved = false;
-      labels.test.optional = true;
-      assert.isFalse(element._showMissingLabels(labels));
-      labels.test.optional = false;
-      labels.test2 = {};
-      assert.isTrue(element._showMissingLabels(labels));
-      assert.deepEqual(element._computeMissingLabels(labels),
-          ['test', 'test2']);
+    test('weblinks use Gerrit.Nav interface', () => {
+      const weblinksStub = sandbox.stub(Gerrit.Nav, '_generateWeblinks')
+          .returns([{name: 'stubb', url: '#s'}]);
+      element.commitInfo = {};
+      element.serverConfig = {};
+      flushAsynchronousOperations();
+      const webLinks = element.$.webLinks;
+      assert.isTrue(weblinksStub.called);
+      assert.isFalse(webLinks.hasAttribute('hidden'));
+      assert.equal(element._computeWebLinks(element.commitInfo).length, 1);
     });
 
     test('weblinks hidden when no weblinks', () => {
       element.commitInfo = {};
+      element.serverConfig = {};
       flushAsynchronousOperations();
       const webLinks = element.$.webLinks;
       assert.isTrue(webLinks.hasAttribute('hidden'));
@@ -125,13 +151,31 @@
 
     test('weblinks hidden when only gitiles weblink', () => {
       element.commitInfo = {web_links: [{name: 'gitiles', url: '#'}]};
+      element.serverConfig = {};
       flushAsynchronousOperations();
       const webLinks = element.$.webLinks;
       assert.isTrue(webLinks.hasAttribute('hidden'));
       assert.equal(element._computeWebLinks(element.commitInfo), null);
     });
 
+    test('weblinks hidden when sole weblink is set as primary', () => {
+      const browser = 'browser';
+      element.commitInfo = {web_links: [{name: browser, url: '#'}]};
+      element.serverConfig = {
+        gerrit: {
+          primary_weblink_name: browser,
+        },
+      };
+      flushAsynchronousOperations();
+      const webLinks = element.$.webLinks;
+      assert.isTrue(webLinks.hasAttribute('hidden'));
+    });
+
     test('weblinks are visible when other weblinks', () => {
+      const router = document.createElement('gr-router');
+      sandbox.stub(Gerrit.Nav, '_generateWeblinks',
+          router._generateWeblinks.bind(router));
+
       element.commitInfo = {web_links: [{name: 'test', url: '#'}]};
       flushAsynchronousOperations();
       const webLinks = element.$.webLinks;
@@ -144,6 +188,10 @@
     });
 
     test('weblinks are visible when gitiles and other weblinks', () => {
+      const router = document.createElement('gr-router');
+      sandbox.stub(Gerrit.Nav, '_generateWeblinks',
+          router._generateWeblinks.bind(router));
+
       element.commitInfo = {
         web_links: [{name: 'test', url: '#'}, {name: 'gitiles', url: '#'}]};
       flushAsynchronousOperations();
@@ -153,20 +201,138 @@
       assert.equal(element._computeWebLinks(element.commitInfo).length, 1);
     });
 
-    test('determines whether to show "Ready to Submit" label', () => {
-      const showMissingSpy = sandbox.spy(element, '_showMissingRequirements');
-      element.change = {status: 'NEW', submit_type: 'CHERRY_PICK', labels: {
-        test: {
-          all: [{_account_id: 1, name: 'bojack', value: 1}],
-          default_value: 0,
-          values: [],
-        },
-      }};
-      flushAsynchronousOperations();
-      assert.isTrue(showMissingSpy.called);
+    suite('_getNonOwnerRole', () => {
+      let change;
+
+      setup(() => {
+        change = {
+          owner: {
+            email: 'abc@def',
+            _account_id: 1019328,
+          },
+          revisions: {
+            rev1: {
+              _number: 1,
+              uploader: {
+                email: 'ghi@def',
+                _account_id: 1011123,
+              },
+              commit: {
+                author: {email: 'jkl@def'},
+                committer: {email: 'ghi@def'},
+              },
+            },
+          },
+          current_revision: 'rev1',
+        };
+      });
+
+      suite('role=uploader', () => {
+        test('_getNonOwnerRole for uploader', () => {
+          assert.deepEqual(
+              element._getNonOwnerRole(change, element._CHANGE_ROLE.UPLOADER),
+              {email: 'ghi@def', _account_id: 1011123});
+        });
+
+        test('_getNonOwnerRole that it does not return uploader', () => {
+          // Set the uploader email to be the same as the owner.
+          change.revisions.rev1.uploader._account_id = 1019328;
+          assert.isNull(element._getNonOwnerRole(change,
+              element._CHANGE_ROLE.UPLOADER));
+        });
+
+        test('_getNonOwnerRole null for uploader with no current rev', () => {
+          delete change.current_revision;
+          assert.isNull(element._getNonOwnerRole(change,
+              element._CHANGE_ROLE.UPLOADER));
+        });
+
+        test('_computeShowRoleClass show uploader', () => {
+          assert.equal(element._computeShowRoleClass(
+              change, element._CHANGE_ROLE.UPLOADER), '');
+        });
+
+        test('_computeShowRoleClass hide uploader', () => {
+          // Set the uploader email to be the same as the owner.
+          change.revisions.rev1.uploader._account_id = 1019328;
+          assert.equal(element._computeShowRoleClass(change,
+              element._CHANGE_ROLE.UPLOADER), 'hideDisplay');
+        });
+      });
+
+      suite('role=committer', () => {
+        test('_getNonOwnerRole for committer', () => {
+          assert.deepEqual(
+              element._getNonOwnerRole(change, element._CHANGE_ROLE.COMMITTER),
+              {email: 'ghi@def'});
+        });
+
+        test('_getNonOwnerRole that it does not return committer', () => {
+          // Set the committer email to be the same as the owner.
+          change.revisions.rev1.commit.committer.email = 'abc@def';
+          assert.isNull(element._getNonOwnerRole(change,
+              element._CHANGE_ROLE.COMMITTER));
+        });
+
+        test('_getNonOwnerRole null for committer with no current rev', () => {
+          delete change.current_revision;
+          assert.isNull(element._getNonOwnerRole(change,
+              element._CHANGE_ROLE.COMMITTER));
+        });
+
+        test('_getNonOwnerRole null for committer with no commit', () => {
+          delete change.revisions.rev1.commit;
+          assert.isNull(element._getNonOwnerRole(change,
+              element._CHANGE_ROLE.COMMITTER));
+        });
+
+        test('_getNonOwnerRole null for committer with no committer', () => {
+          delete change.revisions.rev1.commit.committer;
+          assert.isNull(element._getNonOwnerRole(change,
+              element._CHANGE_ROLE.COMMITTER));
+        });
+      });
+
+      suite('role=author', () => {
+        test('_getNonOwnerRole for author', () => {
+          assert.deepEqual(
+              element._getNonOwnerRole(change, element._CHANGE_ROLE.AUTHOR),
+              {email: 'jkl@def'});
+        });
+
+        test('_getNonOwnerRole that it does not return author', () => {
+          // Set the author email to be the same as the owner.
+          change.revisions.rev1.commit.author.email = 'abc@def';
+          assert.isNull(element._getNonOwnerRole(change,
+              element._CHANGE_ROLE.AUTHOR));
+        });
+
+        test('_getNonOwnerRole null for author with no current rev', () => {
+          delete change.current_revision;
+          assert.isNull(element._getNonOwnerRole(change,
+              element._CHANGE_ROLE.AUTHOR));
+        });
+
+        test('_getNonOwnerRole null for author with no commit', () => {
+          delete change.revisions.rev1.commit;
+          assert.isNull(element._getNonOwnerRole(change,
+              element._CHANGE_ROLE.AUTHOR));
+        });
+
+        test('_getNonOwnerRole null for author with no author', () => {
+          delete change.revisions.rev1.commit.author;
+          assert.isNull(element._getNonOwnerRole(change,
+              element._CHANGE_ROLE.AUTHOR));
+        });
+      });
     });
 
-    test('_computeShowUploader test for uploader', () => {
+    test('Push Certificate Validation test BAD', () => {
+      const serverConfig = {
+        receive: {
+          enable_signed_push: true,
+        },
+      };
       const change = {
         change_id: 'Iad9dc96274af6946f3632be53b106ef80f7ba6ca',
         owner: {
@@ -175,8 +341,13 @@
         revisions: {
           rev1: {
             _number: 1,
-            uploader: {
-              _account_id: 1011123,
+            push_certificate: {
+              key: {
+                status: 'BAD',
+                problems: [
+                  'No public keys found for key ID E5E20E52',
+                ],
+              },
             },
           },
         },
@@ -185,54 +356,21 @@
         labels: {},
         mergeable: true,
       };
-      assert.deepEqual(element._computeShowUploader(change),
-          {_account_id: 1011123});
+      const result =
+          element._computePushCertificateValidation(serverConfig, change);
+      assert.equal(result.message,
+          'Push certificate is invalid:\n' +
+          'No public keys found for key ID E5E20E52');
+      assert.equal(result.icon, 'gr-icons:close');
+      assert.equal(result.class, 'invalid');
     });
 
-    test('_computeShowUploader test that it does not return uploader', () => {
-      const change = {
-        change_id: 'Iad9dc96274af6946f3632be53b106ef80f7ba6ca',
-        owner: {
-          _account_id: 1011123,
+    test('Push Certificate Validation test TRUSTED', () => {
+      const serverConfig = {
+        receive: {
+          enable_signed_push: true,
         },
-        revisions: {
-          rev1: {
-            _number: 1,
-            uploader: {
-              _account_id: 1011123,
-            },
-          },
-        },
-        current_revision: 'rev1',
-        status: 'NEW',
-        labels: {},
-        mergeable: true,
       };
-      assert.isNotOk(element._computeShowUploader(change));
-    });
-
-    test('no current_revision makes _computeShowUploader return null', () => {
-      const change = {
-        change_id: 'Iad9dc96274af6946f3632be53b106ef80f7ba6ca',
-        owner: {
-          _account_id: 1011123,
-        },
-        revisions: {
-          rev1: {
-            _number: 1,
-            uploader: {
-              _account_id: 1011123,
-            },
-          },
-        },
-        status: 'NEW',
-        labels: {},
-        mergeable: true,
-      };
-      assert.isNotOk(element._computeShowUploader(change));
-    });
-
-    test('_computeShowUploaderHide test for string which equals true', () => {
       const change = {
         change_id: 'Iad9dc96274af6946f3632be53b106ef80f7ba6ca',
         owner: {
@@ -241,8 +379,10 @@
         revisions: {
           rev1: {
             _number: 1,
-            uploader: {
-              _account_id: 1011123,
+            push_certificate: {
+              key: {
+                status: 'TRUSTED',
+              },
             },
           },
         },
@@ -251,21 +391,28 @@
         labels: {},
         mergeable: true,
       };
-      assert.equal(element._computeShowUploaderHide(change), '');
+      const result =
+          element._computePushCertificateValidation(serverConfig, change);
+      assert.equal(result.message,
+          'Push certificate is valid and key is trusted');
+      assert.equal(result.icon, 'gr-icons:check');
+      assert.equal(result.class, 'trusted');
     });
 
-    test('_computeShowUploaderHide test for hideDisplay', () => {
+    test('Push Certificate Validation is missing test', () => {
+      const serverConfig = {
+        receive: {
+          enable_signed_push: true,
+        },
+      };
       const change = {
         change_id: 'Iad9dc96274af6946f3632be53b106ef80f7ba6ca',
         owner: {
-          _account_id: 1011123,
+          _account_id: 1019328,
         },
         revisions: {
           rev1: {
             _number: 1,
-            uploader: {
-              _account_id: 1011123,
-            },
           },
         },
         current_revision: 'rev1',
@@ -273,34 +420,58 @@
         labels: {},
         mergeable: true,
       };
-      assert.equal(
-          element._computeShowUploaderHide(change), 'hideDisplay');
+      const result =
+          element._computePushCertificateValidation(serverConfig, change);
+      assert.equal(result.message,
+          'This patch set was created without a push certificate');
+      assert.equal(result.icon, 'gr-icons:help');
+      assert.equal(result.class, 'help');
     });
 
-    test('_computeValueTooltip', () => {
-      // Existing label.
-      const change = {labels: {'Foo-bar': {values: {0: 'Baz'}}}};
-      let score = '0';
-      let labelName = 'Foo-bar';
-      let actual = element._computeValueTooltip(change, score, labelName);
-      assert.equal(actual, 'Baz');
+    test('_computeParents', () => {
+      const parents = [{commit: '123', subject: 'abc'}];
+      assert.isUndefined(element._computeParents(
+          {revisions: {456: {commit: {parents}}}}));
+      assert.isUndefined(element._computeParents(
+          {current_revision: '789', revisions: {456: {commit: {parents}}}}));
+      assert.equal(element._computeParents(
+          {current_revision: '456', revisions: {456: {commit: {parents}}}}),
+          parents);
+    });
 
-      // Non-extsistent label.
-      labelName = 'xyz';
-      actual = element._computeValueTooltip(change, score, labelName);
-      assert.equal(actual, '');
+    test('_computeParentsLabel', () => {
+      const parent = {commit: 'abc123', subject: 'My parent commit'};
+      assert.equal(element._computeParentsLabel([parent]), 'Parent');
+      assert.equal(element._computeParentsLabel([parent, parent]),
+          'Parents');
+    });
 
-      // Non-extsistent score.
-      score = '2';
-      actual = element._computeValueTooltip(change, score, labelName);
-      assert.equal(actual, '');
+    test('_computeParentListClass', () => {
+      const parent = {commit: 'abc123', subject: 'My parent commit'};
+      assert.equal(element._computeParentListClass([parent], true),
+          'parentList nonMerge current');
+      assert.equal(element._computeParentListClass([parent], false),
+          'parentList nonMerge notCurrent');
+      assert.equal(element._computeParentListClass([parent, parent], false),
+          'parentList merge notCurrent');
+      assert.equal(element._computeParentListClass([parent, parent], true),
+          'parentList merge current');
+    });
 
-      // No values on label.
-      labelName = 'abcd';
-      score = '0';
-      change.labels.abcd = {};
-      actual = element._computeValueTooltip(change, score, labelName);
-      assert.equal(actual, '');
+    test('_showAddTopic', () => {
+      assert.isTrue(element._showAddTopic(null, false));
+      assert.isTrue(element._showAddTopic({base: {topic: null}}, false));
+      assert.isFalse(element._showAddTopic({base: {topic: null}}, true));
+      assert.isFalse(element._showAddTopic({base: {topic: 'foo'}}, true));
+      assert.isFalse(element._showAddTopic({base: {topic: 'foo'}}, false));
+    });
+
+    test('_showTopicChip', () => {
+      assert.isFalse(element._showTopicChip(null, false));
+      assert.isFalse(element._showTopicChip({base: {topic: null}}, false));
+      assert.isFalse(element._showTopicChip({base: {topic: null}}, true));
+      assert.isFalse(element._showTopicChip({base: {topic: 'foo'}}, true));
+      assert.isTrue(element._showTopicChip({base: {topic: 'foo'}}, false));
     });
 
     suite('Topic removal', () => {
@@ -338,7 +509,7 @@
       });
 
       test('topic read only hides delete button', () => {
-        element.mutable = false;
+        element.account = {};
         element.change = change;
         flushAsynchronousOperations();
         const button = element.$$('gr-linked-chip').$$('gr-button');
@@ -346,7 +517,7 @@
       });
 
       test('topic not read only does not hide delete button', () => {
-        element.mutable = true;
+        element.account = {test: true};
         change.actions.topic.enabled = true;
         element.change = change;
         flushAsynchronousOperations();
@@ -398,7 +569,7 @@
           note_db_enabled: true,
         };
         flushAsynchronousOperations();
-        element.mutable = false;
+        element.account = {};
         element.change = change;
         flushAsynchronousOperations();
         const button = element.$$('gr-linked-chip').$$('gr-button');
@@ -410,7 +581,7 @@
           note_db_enabled: true,
         };
         flushAsynchronousOperations();
-        element.mutable = true;
+        element.account = {test: true};
         change.actions.hashtags.enabled = true;
         element.change = change;
         flushAsynchronousOperations();
@@ -421,7 +592,6 @@
 
     suite('remove reviewer votes', () => {
       setup(() => {
-        sandbox.stub(element, '_computeValueTooltip').returns('');
         sandbox.stub(element, '_computeTopicReadOnly').returns(true);
         element.change = {
           _number: 42,
@@ -442,55 +612,57 @@
         flushAsynchronousOperations();
       });
 
-      test('_computeCanDeleteVote hides delete button', () => {
-        const button = element.$$('gr-account-chip').$$('gr-button');
-        assert.isTrue(button.hasAttribute('hidden'));
-        element.mutable = true;
-        assert.isTrue(button.hasAttribute('hidden'));
-      });
-
-      test('_computeCanDeleteVote shows delete button', () => {
-        element.change.removable_reviewers = [
-          {
-            _account_id: 1,
-            name: 'bojack',
+      suite('assignee field', () => {
+        const dummyAccount = {
+          _account_id: 1,
+          name: 'bojack',
+        };
+        const change = {
+          actions: {
+            assignee: {enabled: false},
           },
-        ];
-        element.mutable = true;
-        const button = element.$$('gr-account-chip').$$('gr-button');
-        assert.isFalse(button.hasAttribute('hidden'));
-      });
+          assignee: dummyAccount,
+        };
+        let deleteStub;
+        let setStub;
 
-      test('deletes votes', done => {
-        const deleteStub = sandbox.stub(element.$.restAPI, 'deleteVote')
-            .returns(Promise.resolve({ok: true}));
-
-        element.change.removable_reviewers = [
-          {
-            _account_id: 1,
-            name: 'bojack',
-          },
-        ];
-        element.change.labels.test.recommended = {_account_id: 1};
-        element.mutable = true;
-        flushAsynchronousOperations();
-        const chip = element.$$('gr-account-chip');
-        const button = chip.$$('gr-button');
-
-        const spliceStub = sandbox.stub(element, 'splice', (path, index,
-            length) => {
-          assert.isFalse(chip.disabled);
-          assert.deepEqual(path, ['change.labels', 'test', 'all']);
-          assert.equal(index, 0);
-          assert.equal(length, 1);
-          assert.notOk(element.change.labels.test.recommended);
-          assert.isTrue(deleteStub.calledWithExactly(42, 1, 'test'));
-          spliceStub.restore();
-          done();
+        setup(() => {
+          deleteStub = sandbox.stub(element.$.restAPI, 'deleteAssignee');
+          setStub = sandbox.stub(element.$.restAPI, 'setAssignee');
         });
 
-        MockInteractions.tap(button);
-        assert.isTrue(chip.disabled);
+        test('changing change recomputes _assignee', () => {
+          assert.isFalse(!!element._assignee.length);
+          const change = element.change;
+          change.assignee = dummyAccount;
+          element._changeChanged(change);
+          assert.deepEqual(element._assignee[0], dummyAccount);
+        });
+
+        test('modifying _assignee calls API', () => {
+          assert.isFalse(!!element._assignee.length);
+          element.set('_assignee', [dummyAccount]);
+          assert.isTrue(setStub.calledOnce);
+          assert.deepEqual(element.change.assignee, dummyAccount);
+          element.set('_assignee', [dummyAccount]);
+          assert.isTrue(setStub.calledOnce);
+          element.set('_assignee', []);
+          assert.isTrue(deleteStub.calledOnce);
+          assert.equal(element.change.assignee, undefined);
+          element.set('_assignee', []);
+          assert.isTrue(deleteStub.calledOnce);
+        });
+
+        test('_computeAssigneeReadOnly', () => {
+          let mutable = false;
+          assert.isTrue(element._computeAssigneeReadOnly(mutable, change));
+          mutable = true;
+          assert.isTrue(element._computeAssigneeReadOnly(mutable, change));
+          change.actions.assignee.enabled = true;
+          assert.isFalse(element._computeAssigneeReadOnly(mutable, change));
+          mutable = false;
+          assert.isTrue(element._computeAssigneeReadOnly(mutable, change));
+        });
       });
 
       test('changing topic', () => {
@@ -545,57 +717,42 @@
               assert.equal(element.change.hashtags, newHashtag);
             });
       });
+    });
 
-      suite('assignee field', () => {
-        const dummyAccount = {
-          _account_id: 1,
-          name: 'bojack',
-        };
-        const change = {
-          actions: {
-            assignee: {enabled: false},
-          },
-          assignee: dummyAccount,
-        };
-        let deleteStub;
-        let setStub;
+    test('editTopic', () => {
+      element.account = {test: true};
+      element.change = {actions: {topic: {enabled: true}}};
+      flushAsynchronousOperations();
 
-        setup(() => {
-          deleteStub = sandbox.stub(element.$.restAPI, 'deleteAssignee');
-          setStub = sandbox.stub(element.$.restAPI, 'setAssignee');
-        });
+      const label = element.$$('.topicEditableLabel');
+      assert.ok(label);
+      sandbox.stub(label, 'open');
+      element.editTopic();
+      flushAsynchronousOperations();
 
-        test('changing change recomputes _assignee', () => {
-          assert.isFalse(!!element._assignee.length);
-          const change = element.change;
-          change.assignee = dummyAccount;
-          element._changeChanged(change);
-          assert.deepEqual(element._assignee[0], dummyAccount);
-        });
+      assert.isTrue(label.open.called);
+    });
 
-        test('modifying _assignee calls API', () => {
-          assert.isFalse(!!element._assignee.length);
-          element.set('_assignee', [dummyAccount]);
-          assert.isTrue(setStub.calledOnce);
-          assert.deepEqual(element.change.assignee, dummyAccount);
-          element.set('_assignee', [dummyAccount]);
-          assert.isTrue(setStub.calledOnce);
-          element.set('_assignee', []);
-          assert.isTrue(deleteStub.calledOnce);
-          assert.equal(element.change.assignee, undefined);
-          element.set('_assignee', []);
-          assert.isTrue(deleteStub.calledOnce);
-        });
-
-        test('_computeAssigneeReadOnly', () => {
-          let mutable = false;
-          assert.isTrue(element._computeAssigneeReadOnly(mutable, change));
-          mutable = true;
-          assert.isTrue(element._computeAssigneeReadOnly(mutable, change));
-          change.actions.assignee.enabled = true;
-          assert.isFalse(element._computeAssigneeReadOnly(mutable, change));
-          mutable = false;
-          assert.isTrue(element._computeAssigneeReadOnly(mutable, change));
+    suite('plugin endpoints', () => {
+      test('endpoint params', done => {
+        element.change = {labels: {}};
+        element.revision = {};
+        let hookEl;
+        let plugin;
+        Gerrit.install(
+            p => {
+              plugin = p;
+              plugin.hook('change-metadata-item').getLastAttached().then(
+                  el => hookEl = el);
+            },
+            '0.1',
+            'http://some/plugins/url.html');
+        Gerrit._setPluginsCount(0);
+        flush(() => {
+          assert.strictEqual(hookEl.plugin, plugin);
+          assert.strictEqual(hookEl.change, element.change);
+          assert.strictEqual(hookEl.revision, element.revision);
+          done();
         });
       });
     });
diff --git a/polygerrit-ui/app/elements/change/gr-change-requirements/gr-change-requirements.html b/polygerrit-ui/app/elements/change/gr-change-requirements/gr-change-requirements.html
new file mode 100644
index 0000000..e79bce1
--- /dev/null
+++ b/polygerrit-ui/app/elements/change/gr-change-requirements/gr-change-requirements.html
@@ -0,0 +1,170 @@
+<!--
+@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="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../../behaviors/rest-client-behavior/rest-client-behavior.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../../shared/gr-button/gr-button.html">
+<link rel="import" href="../../shared/gr-icons/gr-icons.html">
+<link rel="import" href="../../shared/gr-label/gr-label.html">
+<link rel="import" href="../../shared/gr-label-info/gr-label-info.html">
+<link rel="import" href="../../shared/gr-limited-text/gr-limited-text.html">
+
+<dom-module id="gr-change-requirements">
+  <template strip-whitespace>
+    <style include="shared-styles">
+      :host {
+        display: table;
+        width: 100%;
+      }
+      .status {
+        color: #FFA62F;
+        display: inline-block;
+        font-family: var(--monospace-font-family);
+        text-align: center;
+      }
+      .approved.status {
+        color: var(--vote-text-color-recommended);
+      }
+      .rejected.status {
+        color: var(--vote-text-color-disliked);
+      }
+      iron-icon {
+        color: inherit;
+      }
+      .name {
+        font-weight: var(--font-weight-bold);
+      }
+      section {
+        display: table-row;
+      }
+      .show-hide {
+        float: right;
+      }
+      .title {
+        min-width: 10em;
+        padding: .75em .5em 0 var(--requirements-horizontal-padding);
+        vertical-align: top;
+      }
+      .value {
+        padding: .6em .5em 0 0;
+        vertical-align: middle;
+      }
+      .title,
+      .value {
+        display: table-cell;
+      }
+      .hidden {
+        display: none;
+      }
+      .showHide {
+        cursor: pointer;
+      }
+      .showHide .title {
+        border-top: 1px solid var(--border-color);
+        padding-bottom: .5em;
+        padding-top: .5em;
+      }
+      .showHide .value {
+        border-top: 1px solid var(--border-color);
+        padding-top: 0;
+        vertical-align: middle;
+      }
+      .showHide iron-icon {
+        color: var(--deemphasized-text-color);
+        float: right;
+      }
+      .spacer {
+        height: .5em;
+      }
+    </style>
+    <template
+        is="dom-repeat"
+        items="[[_requirements]]">
+      <section>
+        <div class="title requirement">
+          <span class$="status [[item.style]]">
+            <iron-icon class="icon" icon="[[_computeRequirementIcon(item.satisfied)]]"></iron-icon>
+          </span>
+          <gr-limited-text class="name" limit="40" text="[[item.fallback_text]]"></gr-limited-text>
+        </div>
+      </section>
+    </template>
+    <template
+        is="dom-repeat"
+        items="[[_requiredLabels]]">
+      <section>
+        <div class="title">
+          <span class$="status [[item.style]]">
+            <iron-icon class="icon" icon="[[item.icon]]"></iron-icon>
+          </span>
+          <gr-limited-text class="name" limit="40" text="[[item.label]]"></gr-limited-text>
+        </div>
+        <div class="value">
+          <gr-label-info
+              change="{{change}}"
+              account="[[account]]"
+              mutable="[[mutable]]"
+              label="[[item.label]]"
+              label-info="[[item.labelInfo]]"></gr-label-info>
+        </div>
+      </section>
+    </template>
+    <section class="spacer"></section>
+    <section class$="spacer [[_computeShowOptional(_optionalLabels.*)]]"></section>
+    <section
+        show-bottom-border$="[[_showOptionalLabels]]"
+        on-tap="_handleShowHide"
+        class$="showHide [[_computeShowOptional(_optionalLabels.*)]]">
+      <div class="title">Other labels</div>
+      <div class="value">
+        <iron-icon
+            id="showHide"
+            icon="[[_computeShowHideIcon(_showOptionalLabels)]]">
+        </iron-icon>
+      </label>
+      </div>
+    </section>
+    <template
+        is="dom-repeat"
+        items="[[_optionalLabels]]">
+      <section class$="optional [[_computeSectionClass(_showOptionalLabels)]]">
+        <div class="title">
+          <span class$="status [[item.style]]">
+            <template is="dom-if" if="[[item.icon]]">
+              <iron-icon class="icon" icon="[[item.icon]]"></iron-icon>
+            </template>
+            <template is="dom-if" if="[[!item.icon]]">
+              <span>[[_computeLabelValue(item.labelInfo.value)]]</span>
+            </template>
+          </span>
+          <gr-limited-text class="name" limit="40" text="[[item.label]]"></gr-limited-text>
+        </div>
+        <div class="value">
+          <gr-label-info
+              change="{{change}}"
+              account="[[account]]"
+              mutable="[[mutable]]"
+              label="[[item.label]]"
+              label-info="[[item.labelInfo]]"></gr-label-info>
+        </div>
+      </section>
+    </template>
+    <section class$="spacer [[_computeShowOptional(_optionalLabels.*)]] [[_computeSectionClass(_showOptionalLabels)]]"></section>
+  </template>
+  <script src="gr-change-requirements.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/change/gr-change-requirements/gr-change-requirements.js b/polygerrit-ui/app/elements/change/gr-change-requirements/gr-change-requirements.js
new file mode 100644
index 0000000..8ec00dd
--- /dev/null
+++ b/polygerrit-ui/app/elements/change/gr-change-requirements/gr-change-requirements.js
@@ -0,0 +1,150 @@
+/**
+ * @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-change-requirements',
+
+    properties: {
+      /** @type {?} */
+      change: Object,
+      account: Object,
+      mutable: Boolean,
+      _requirements: {
+        type: Array,
+        computed: '_computeRequirements(change)',
+      },
+      _requiredLabels: {
+        type: Array,
+        value: () => [],
+      },
+      _optionalLabels: {
+        type: Array,
+        value: () => [],
+      },
+      _showWip: {
+        type: Boolean,
+        computed: '_computeShowWip(change)',
+      },
+      _showOptionalLabels: {
+        type: Boolean,
+        value: true,
+      },
+    },
+
+    behaviors: [
+      Gerrit.RESTClientBehavior,
+    ],
+
+    observers: [
+      '_computeLabels(change.labels.*)',
+    ],
+
+    _computeShowWip(change) {
+      return change.work_in_progress;
+    },
+
+    _computeRequirements(change) {
+      const _requirements = [];
+
+      if (change.requirements) {
+        for (const requirement of change.requirements) {
+          requirement.satisfied = requirement.status === 'OK';
+          requirement.style =
+              this._computeRequirementClass(requirement.satisfied);
+          _requirements.push(requirement);
+        }
+      }
+      if (change.work_in_progress) {
+        _requirements.push({
+          fallback_text: 'Work-in-progress',
+          tooltip: 'Change must not be in \'Work in Progress\' state.',
+        });
+      }
+
+      return _requirements;
+    },
+
+    _computeRequirementClass(requirementStatus) {
+      return requirementStatus ? 'approved' : '';
+    },
+
+    _computeRequirementIcon(requirementStatus) {
+      return requirementStatus ? 'gr-icons:check' : 'gr-icons:hourglass';
+    },
+
+    _computeLabels(labelsRecord) {
+      const labels = labelsRecord.base;
+      this._optionalLabels = [];
+      this._requiredLabels = [];
+
+      for (const label in labels) {
+        if (!labels.hasOwnProperty(label)) { continue; }
+
+        const labelInfo = labels[label];
+        const icon = this._computeLabelIcon(labelInfo);
+        const style = this._computeLabelClass(labelInfo);
+        const path = labelInfo.optional ? '_optionalLabels' : '_requiredLabels';
+
+        this.push(path, {label, icon, style, labelInfo});
+      }
+    },
+
+    /**
+     * @param {Object} labelInfo
+     * @return {string} The icon name, or undefined if no icon should
+     *     be used.
+     */
+    _computeLabelIcon(labelInfo) {
+      if (labelInfo.approved) { return 'gr-icons:check'; }
+      if (labelInfo.rejected) { return 'gr-icons:close'; }
+      return 'gr-icons:hourglass';
+    },
+
+    /**
+     * @param {Object} labelInfo
+     */
+    _computeLabelClass(labelInfo) {
+      if (labelInfo.approved) { return 'approved'; }
+      if (labelInfo.rejected) { return 'rejected'; }
+      return '';
+    },
+
+    _computeShowOptional(optionalFieldsRecord) {
+      return optionalFieldsRecord.base.length ? '' : 'hidden';
+    },
+
+    _computeLabelValue(value) {
+      return (value > 0 ? '+' : '') + value;
+    },
+
+    _computeShowHideIcon(showOptionalLabels) {
+      return showOptionalLabels ?
+          'gr-icons:expand-less' :
+          'gr-icons:expand-more';
+    },
+
+    _computeSectionClass(show) {
+      return show ? '' : 'hidden';
+    },
+
+    _handleShowHide(e) {
+      this._showOptionalLabels = !this._showOptionalLabels;
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/change/gr-change-requirements/gr-change-requirements_test.html b/polygerrit-ui/app/elements/change/gr-change-requirements/gr-change-requirements_test.html
new file mode 100644
index 0000000..3f35158
--- /dev/null
+++ b/polygerrit-ui/app/elements/change/gr-change-requirements/gr-change-requirements_test.html
@@ -0,0 +1,222 @@
+<!DOCTYPE html>
+<!--
+@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.
+-->
+
+<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+<title>gr-change-requirements</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-change-requirements.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-change-requirements></gr-change-requirements>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-change-metadata tests', () => {
+    let element;
+
+    setup(() => {
+      element = fixture('basic');
+    });
+
+    test('requirements computed fields', () => {
+      assert.isTrue(element._computeShowWip({work_in_progress: true}));
+      assert.isFalse(element._computeShowWip({work_in_progress: false}));
+
+      assert.equal(element._computeRequirementClass(true), 'approved');
+      assert.equal(element._computeRequirementClass(false), '');
+
+      assert.equal(element._computeRequirementIcon(true), 'gr-icons:check');
+      assert.equal(element._computeRequirementIcon(false),
+          'gr-icons:hourglass');
+    });
+
+    test('label computed fields', () => {
+      assert.equal(element._computeLabelIcon({approved: []}), 'gr-icons:check');
+      assert.equal(element._computeLabelIcon({rejected: []}), 'gr-icons:close');
+      assert.equal(element._computeLabelIcon({}), 'gr-icons:hourglass');
+
+      assert.equal(element._computeLabelClass({approved: []}), 'approved');
+      assert.equal(element._computeLabelClass({rejected: []}), 'rejected');
+      assert.equal(element._computeLabelClass({}), '');
+      assert.equal(element._computeLabelClass({value: 0}), '');
+
+      assert.equal(element._computeLabelValue(1), '+1');
+      assert.equal(element._computeLabelValue(-1), '-1');
+      assert.equal(element._computeLabelValue(0), '0');
+    });
+
+    test('_computeLabels', () => {
+      assert.equal(element._optionalLabels.length, 0);
+      assert.equal(element._requiredLabels.length, 0);
+      element._computeLabels({base: {
+        test: {
+          all: [{_account_id: 1, name: 'bojack', value: 1}],
+          default_value: 0,
+          values: [],
+          value: 1,
+        },
+        opt_test: {
+          all: [{_account_id: 1, name: 'bojack', value: 1}],
+          default_value: 0,
+          values: [],
+          optional: true,
+        },
+      }});
+      assert.equal(element._optionalLabels.length, 1);
+      assert.equal(element._requiredLabels.length, 1);
+
+      assert.equal(element._optionalLabels[0].label, 'opt_test');
+      assert.equal(element._optionalLabels[0].icon, 'gr-icons:hourglass');
+      assert.equal(element._optionalLabels[0].style, '');
+      assert.ok(element._optionalLabels[0].labelInfo);
+    });
+
+    test('optional show/hide', () => {
+      element._optionalLabels = [{label: 'test'}];
+      flushAsynchronousOperations();
+
+      assert.ok(element.$$('section.optional'));
+      MockInteractions.tap(element.$$('.showHide'));
+      flushAsynchronousOperations();
+
+      assert.isFalse(element._showOptionalLabels);
+      assert.isTrue(isHidden(element.$$('section.optional')));
+    });
+
+    test('properly converts satisfied labels', () => {
+      element.change = {
+        status: 'NEW',
+        labels: {
+          Verified: {
+            approved: [],
+          },
+        },
+        requirements: [],
+      };
+      flushAsynchronousOperations();
+
+      assert.ok(element.$$('.approved'));
+      assert.ok(element.$$('.name'));
+      assert.equal(element.$$('.name').text, 'Verified');
+    });
+
+    test('properly converts unsatisfied labels', () => {
+      element.change = {
+        status: 'NEW',
+        labels: {
+          Verified: {
+            approved: false,
+          },
+        },
+      };
+      flushAsynchronousOperations();
+
+      const name = element.$$('.name');
+      assert.ok(name);
+      assert.isFalse(name.hasAttribute('hidden'));
+      assert.equal(name.text, 'Verified');
+    });
+
+    test('properly displays Work In Progress', () => {
+      element.change = {
+        status: 'NEW',
+        labels: {},
+        requirements: [],
+        work_in_progress: true,
+      };
+      flushAsynchronousOperations();
+
+      const changeIsWip = element.$$('.title');
+      assert.ok(changeIsWip);
+    });
+
+    test('properly displays a satisfied requirement', () => {
+      element.change = {
+        status: 'NEW',
+        labels: {},
+        requirements: [{
+          fallback_text: 'Resolve all comments',
+          status: 'OK',
+        }],
+      };
+      flushAsynchronousOperations();
+
+      const requirement = element.$$('.requirement');
+      assert.ok(requirement);
+      assert.isFalse(requirement.hasAttribute('hidden'));
+      assert.ok(requirement.querySelector('.approved'));
+      assert.equal(requirement.querySelector('.name').text,
+          'Resolve all comments');
+    });
+
+    test('satisfied class is applied with OK', () => {
+      element.change = {
+        status: 'NEW',
+        labels: {},
+        requirements: [{
+          fallback_text: 'Resolve all comments',
+          status: 'OK',
+        }],
+      };
+      flushAsynchronousOperations();
+
+      const requirement = element.$$('.requirement');
+      assert.ok(requirement);
+      assert.ok(requirement.querySelector('.approved'));
+    });
+
+    test('satisfied class is not applied with NOT_READY', () => {
+      element.change = {
+        status: 'NEW',
+        labels: {},
+        requirements: [{
+          fallback_text: 'Resolve all comments',
+          status: 'NOT_READY',
+        }],
+      };
+      flushAsynchronousOperations();
+
+      const requirement = element.$$('.requirement');
+      assert.ok(requirement);
+      assert.strictEqual(requirement.querySelector('.approved'), null);
+    });
+
+    test('satisfied class is not applied with RULE_ERROR', () => {
+      element.change = {
+        status: 'NEW',
+        labels: {},
+        requirements: [{
+          fallback_text: 'Resolve all comments',
+          status: 'RULE_ERROR',
+        }],
+      };
+      flushAsynchronousOperations();
+
+      const requirement = element.$$('.requirement');
+      assert.ok(requirement);
+      assert.strictEqual(requirement.querySelector('.approved'), null);
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html
index 40db0915..07573d3 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,33 +15,43 @@
 limitations under the License.
 -->
 
+<link rel="import" href="../../../bower_components/polymer/polymer.html">
 <link rel="import" href="../../../behaviors/gr-patch-set-behavior/gr-patch-set-behavior.html">
 <link rel="import" href="../../../behaviors/keyboard-shortcut-behavior/keyboard-shortcut-behavior.html">
 <link rel="import" href="../../../behaviors/rest-client-behavior/rest-client-behavior.html">
-<link rel="import" href="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../../bower_components/paper-tabs/paper-tabs.html">
+<link rel="import" href="../../../styles/shared-styles.html">
 <link rel="import" href="../../core/gr-navigation/gr-navigation.html">
-<link rel="import" href="../../diff/gr-diff-preferences/gr-diff-preferences.html">
+<link rel="import" href="../../core/gr-reporting/gr-reporting.html">
+<link rel="import" href="../../diff/gr-comment-api/gr-comment-api.html">
+<link rel="import" href="../../edit/gr-edit-constants.html">
+<link rel="import" href="../../plugins/gr-endpoint-decorator/gr-endpoint-decorator.html">
+<link rel="import" href="../../plugins/gr-endpoint-param/gr-endpoint-param.html">
 <link rel="import" href="../../shared/gr-account-link/gr-account-link.html">
 <link rel="import" href="../../shared/gr-button/gr-button.html">
 <link rel="import" href="../../shared/gr-change-star/gr-change-star.html">
+<link rel="import" href="../../shared/gr-change-status/gr-change-status.html">
+<link rel="import" href="../../shared/gr-count-string-formatter/gr-count-string-formatter.html">
 <link rel="import" href="../../shared/gr-date-formatter/gr-date-formatter.html">
 <link rel="import" href="../../shared/gr-editable-content/gr-editable-content.html">
 <link rel="import" href="../../shared/gr-js-api-interface/gr-js-api-interface.html">
 <link rel="import" href="../../shared/gr-linked-text/gr-linked-text.html">
 <link rel="import" href="../../shared/gr-overlay/gr-overlay.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
-
+<link rel="import" href="../../shared/gr-tooltip-content/gr-tooltip-content.html">
+<link rel="import" href="../../shared/revision-info/revision-info.html">
 <link rel="import" href="../gr-change-actions/gr-change-actions.html">
 <link rel="import" href="../gr-change-metadata/gr-change-metadata.html">
 <link rel="import" href="../gr-commit-info/gr-commit-info.html">
 <link rel="import" href="../gr-download-dialog/gr-download-dialog.html">
-<link rel="import" href="../gr-file-list/gr-file-list.html">
 <link rel="import" href="../gr-file-list-header/gr-file-list-header.html">
+<link rel="import" href="../gr-file-list/gr-file-list.html">
 <link rel="import" href="../gr-included-in-dialog/gr-included-in-dialog.html">
 <link rel="import" href="../gr-messages-list/gr-messages-list.html">
 <link rel="import" href="../gr-related-changes-list/gr-related-changes-list.html">
 <link rel="import" href="../gr-reply-dialog/gr-reply-dialog.html">
-<link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../gr-thread-list/gr-thread-list.html">
+<link rel="import" href="../gr-upload-help-dialog/gr-upload-help-dialog.html">
 
 <dom-module id="gr-change-view">
   <template>
@@ -49,43 +60,48 @@
         background-color: var(--view-background-color);
       }
       .container.loading {
-        color: #666;
+        color: var(--deemphasized-text-color);
         padding: 1em var(--default-horizontal-margin);
       }
       .header {
         align-items: center;
-        background-color: var(--view-background-color);
+        background-color: var(--table-header-background-color);
+        border-bottom: 1px solid var(--border-color);
         display: flex;
-        padding: .65em var(--default-horizontal-margin);
+        padding: .55em var(--default-horizontal-margin);
         z-index: 99;  /* Less than gr-overlay's backdrop */
       }
+      .header.editMode {
+        background-color: var(--edit-mode-background-color);
+      }
       .header .download {
         margin-right: 1em;
       }
-      .header.pinned {
-        border-bottom-color: transparent;
-        box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
-        position: fixed;
-        top: 0;
-        transition: box-shadow 250ms linear;
-        width: 100%;
+      gr-change-status {
+        display: initial;
+        margin: .1em .1em .1em .4em;
       }
-      .header.wip {
-        background-color: #fcfad6;
-        border-bottom: 1px solid #ddd;
-        margin-bottom: .5em;
+      gr-change-status:first-child {
+        margin-left: 0;
       }
-      .header-title {
+      .headerTitle {
+        align-items: center;
+        display: flex;
         flex: 1;
-        font-size: 1.2em;
-        font-family: var(--font-family-bold);
+        font-size: 1.2rem;
+      }
+      .headerTitle .headerSubject {
+        font-weight: var(--font-weight-bold);
+      }
+      #replyBtn {
+        margin-bottom: 1em;
       }
       gr-change-star {
+        font-size: var(--font-size-normal);
         margin-right: .25em;
-        vertical-align: -.425em;
       }
       gr-reply-dialog {
-        width: 50em;
+        width: 60em;
       }
       .changeStatus {
         text-transform: capitalize;
@@ -94,19 +110,14 @@
          https://github.com/Polymer/polymer/issues/2531 */
       .container section.changeInfo {
         display: flex;
-        padding: 0 var(--default-horizontal-margin);
       }
       .changeId {
-        color: #666;
+        color: var(--deemphasized-text-color);
         font-family: var(--font-family);
         margin-top: 1em;
       }
-      .changeInfo-column:not(:last-of-type) {
-        margin-right: 1em;
-        padding-right: 1em;
-      }
       .changeMetadata {
-        font-size: .95em;
+        border-right: 1px solid var(--border-color);
       }
       /* Prevent plugin text from overflowing. */
       #change_plugins {
@@ -119,23 +130,26 @@
         max-width: var(--commit-message-max-width, 72ch);;
       }
       .commitMessage gr-linked-text {
-        word-break: break-all;
+        word-break: break-word;
       }
       #commitMessageEditor {
         min-width: 72ch;
       }
       .editCommitMessage {
         margin-top: 1em;
+        --gr-button: {
+          padding-left: 0;
+          padding-right: 0;
+        }
       }
-      .commitActions {
-        border-bottom: 1px solid #ddd;
+      .changeStatuses,
+      .commitActions,
+      .statusText {
+        align-items: center;
         display: flex;
-        justify-content: space-between;
-        margin-bottom: .5em;
-        padding-bottom: .5em;
       }
-      .reply {
-        margin-right: .5em;
+      .changeStatuses {
+        flex-wrap: wrap;
       }
       .mainChangeInfo {
         display: flex;
@@ -152,16 +166,17 @@
       .relatedChanges {
         flex: 1 1 auto;
         overflow: hidden;
+        padding: 1em 0;
       }
       .mobile {
         display: none;
       }
       .warning {
-        color: #d14836;
+        color: var(--error-text-color);
       }
       hr {
         border: 0;
-        border-top: 1px solid #ddd;
+        border-top: 1px solid var(--border-color);
         height: 0;
         margin-bottom: 1em;
       }
@@ -170,7 +185,6 @@
         overflow: hidden;
       }
       #relatedChanges {
-        font-size: .9em;
       }
       #relatedChanges.collapsed {
         margin-bottom: 1.1em;
@@ -181,6 +195,8 @@
         display: flex;
         flex-direction: column;
         flex-shrink: 0;
+        margin: 1em 0;
+        padding: 0 1em;
       }
       .collapseToggleContainer {
         display: flex;
@@ -204,17 +220,53 @@
       .scrollable {
         overflow: auto;
       }
+      .text {
+        white-space: pre;
+      }
+      gr-commit-info {
+        display: inline-block;
+        margin-right: -5px;
+      }
+      paper-tabs {
+        background-color: var(--table-header-background-color);
+        border-top: 1px solid var(--border-color);
+        height: 3rem;
+        --paper-tabs-selection-bar-color: var(--link-color);
+      }
+      paper-tab {
+        max-width: 15rem;
+        --paper-tab-ink: var(--link-color);
+      }
+      gr-thread-list,
+      gr-messages-list {
+        display: block;
+      }
       #includedInOverlay {
         width: 65em;
       }
+      #uploadHelpOverlay {
+        width: 50em;
+      }
       @media screen and (min-width: 80em) {
         .commitMessage {
           max-width: var(--commit-message-max-width, 100ch);
         }
       }
+      #metadata {
+        --metadata-horizontal-padding: 1em;
+        padding-top: 1em;
+        width: 100%;
+      }
       /* NOTE: If you update this breakpoint, also update the
       BREAKPOINT_RELATED_MED in the JS */
-      @media screen and (max-width: 60em) {
+      @media screen and (max-width: 75em) {
+        .relatedChanges {
+          padding: 0;
+        }
+        #relatedChanges {
+          border-top: 1px solid var(--border-color);
+          padding-top: 1em;
+        }
         #commitAndRelated {
           flex-direction: column;
           flex-wrap: nowrap;
@@ -222,9 +274,12 @@
         #commitMessageEditor {
           min-width: 0;
         }
-      }
-      .patchInfo {
-        margin-top: 1em;
+        .commitMessage {
+          margin-right: 0;
+        }
+        .mainChangeInfo {
+          padding-right: 0;
+        }
       }
       /* NOTE: If you update this breakpoint, also update the
       BREAKPOINT_RELATED_SMALL in the JS */
@@ -235,17 +290,15 @@
         .header {
           align-items: flex-start;
           flex-direction: column;
+          flex: 1;
           padding: .5em var(--default-horizontal-margin);
         }
         gr-change-star {
           vertical-align: middle;
         }
-        .header-title {
-          font-size: 1.1em;
-        }
-        gr-reply-dialog {
-          min-width: initial;
-          width: 100vw;
+        .headerTitle {
+          flex-wrap: wrap;
+          font-size: 1.1rem;
         }
         .desktop {
           display: none;
@@ -253,7 +306,8 @@
         .reply {
           display: block;
           margin-right: 0;
-          margin-bottom: .5em;
+          /* px because don't have the same font size */
+          margin-bottom: 6px;
         }
         .changeInfo-column:not(:last-of-type) {
           margin-right: 0;
@@ -264,28 +318,43 @@
           flex-direction: column;
           flex-wrap: nowrap;
         }
+        .commitContainer {
+          margin: 0;
+          padding: 1em;
+        }
         .relatedChanges,
         .changeMetadata {
-          font-size: 1em;
+          font-size: var(--font-size-normal);
         }
         .changeMetadata {
+          border-bottom: 1px solid var(--border-color);
           border-right: none;
-          margin-bottom: 1em;
           margin-top: .25em;
           max-width: none;
         }
+        #metadata,
+        .mainChangeInfo {
+          padding: 0;
+        }
         .commitActions {
-          flex-direction: column;
+          display: block;
+          margin-top: 1em;
+          width: 100%;
         }
         .commitMessage {
           flex: initial;
-          margin-right: 0;
+          margin: 0;
         }
         /* Change actions are the only thing thant need to remain visible due
         to the fact that they may have the currently visible overlay open. */
         #mainContent.overlayOpen .hideOnMobileOverlay {
           display: none;
         }
+        gr-reply-dialog {
+          height: 100vh;
+          min-width: initial;
+          width: 100vw;
+        }
       }
     </style>
     <div class="container loading" hidden$="[[!_loading]]">Loading...</div>
@@ -293,40 +362,72 @@
         id="mainContent"
         class="container"
         hidden$="{{_loading}}">
-      <div class$="hideOnMobileOverlay [[_computeHeaderClass(_change)]]">
-        <span class="header-title">
+      <div class$="[[_computeHeaderClass(_editMode)]]">
+        <div class="headerTitle">
           <gr-change-star
               id="changeStar"
-              change="{{_change}}" hidden$="[[!_loggedIn]]"></gr-change-star>
-          <a
-              aria-label$="[[_computeChangePermalinkAriaLabel(_change._number)]]"
-              href$="[[_computeChangeUrl(_change)]]">[[_change._number]]</a><!--
-       --><template is="dom-if" if="[[_changeStatus]]"><!--
-         --> (<!--
-         --><span
-                aria-label$="Change status: [[_changeStatus]]"
-                tabindex="0">[[_changeStatus]]</span><!--
-         --><template
+              change="{{_change}}"
+              on-toggle-star="_handleToggleStar"
+              hidden$="[[!_loggedIn]]"></gr-change-star>
+          <div class="changeStatuses">
+            <template is="dom-repeat" items="[[_changeStatuses]]" as="status">
+              <gr-change-status
+                  max-width="100"
+                  status="[[status]]"></gr-change-status>
+            </template>
+          </div>
+          <div class="statusText">
+            <template
                 is="dom-if"
                 if="[[_computeShowCommitInfo(_changeStatus, _change.current_revision)]]">
-              as
+              <span class="text"> as </span>
               <gr-commit-info
                   change="[[_change]]"
                   commit-info="[[_computeMergedCommitInfo(_change.current_revision, _change.revisions)]]"
-                  server-config="[[_serverConfig]]"></gr-commit-info><!--
-         --></template><!--
-         -->)<!--
-       --></template><!--
-       -->: [[_change.subject]]
-        </span>
-      </div>
+                  server-config="[[_serverConfig]]"></gr-commit-info>
+            </template>
+          </div>
+          <span class="separator"></span>
+          <a aria-label$="[[_computeChangePermalinkAriaLabel(_change._number)]]"
+              href$="[[_computeChangeUrl(_change)]]">[[_change._number]]</a>
+          <pre>: </pre>
+          <span class="headerSubject">[[_change.subject]]</span>
+        </div><!-- end headerTitle -->
+        <div class="commitActions" hidden$="[[!_loggedIn]]">
+          <gr-change-actions
+              id="actions"
+              change="[[_change]]"
+              disable-edit="[[disableEdit]]"
+              has-parent="[[hasParent]]"
+              actions="[[_change.actions]]"
+              revision-actions="[[_currentRevisionActions]]"
+              change-num="[[_changeNum]]"
+              change-status="[[_change.status]]"
+              commit-num="[[_commitInfo.commit]]"
+              latest-patch-num="[[computeLatestPatchNum(_allPatchSets)]]"
+              reply-disabled="[[_replyDisabled]]"
+              reply-button-label="[[_replyButtonLabel]]"
+              commit-message="[[_latestCommitMessage]]"
+              edit-patchset-loaded="[[hasEditPatchsetLoaded(_patchRange.*)]]"
+              edit-mode="[[_editMode]]"
+              edit-based-on-current-patch-set="[[hasEditBasedOnCurrentPatchSet(_allPatchSets)]]"
+              private-by-default="[[_projectConfig.private_by_default]]"
+              on-reload-change="_handleReloadChange"
+              on-edit-tap="_handleEditTap"
+              on-stop-edit-tap="_handleStopEditTap"
+              on-download-tap="_handleOpenDownloadDialog"></gr-change-actions>
+        </div><!-- end commit actions -->
+      </div><!-- end header -->
       <section class="changeInfo">
         <div class="changeInfo-column changeMetadata hideOnMobileOverlay">
           <gr-change-metadata
+              id="metadata"
               change="{{_change}}"
+              account="[[_account]]"
+              revision="[[_selectedRevision]]"
               commit-info="[[_commitInfo]]"
               server-config="[[_serverConfig]]"
-              mutable="[[_loggedIn]]"
+              parent-is-current="[[_parentIsCurrent]]"
               on-show-reply-dialog="_handleShowReplyDialog">
           </gr-change-metadata>
           <!-- Plugins insert content into following container.
@@ -335,36 +436,24 @@
           <div id="change_plugins"></div>
         </div>
         <div id="mainChangeInfo" class="changeInfo-column mainChangeInfo">
-          <div class="commitActions" hidden$="[[!_loggedIn]]">
-            <gr-button
-                class="reply"
-                secondary
-                disabled="[[_replyDisabled]]"
-                on-tap="_handleReplyTap">[[_replyButtonLabel]]</gr-button>
-            <gr-change-actions id="actions"
-                change="[[_change]]"
-                has-parent="[[hasParent]]"
-                actions="[[_change.actions]]"
-                revision-actions="[[_currentRevisionActions]]"
-                change-num="[[_changeNum]]"
-                change-status="[[_change.status]]"
-                commit-num="[[_commitInfo.commit]]"
-                patch-num="[[computeLatestPatchNum(_allPatchSets)]]"
-                commit-message="[[_latestCommitMessage]]"
-                edit-loaded="[[_editLoaded]]"
-                edit-based-on-current-patch-set="[[hasEditBasedOnCurrentPatchSet(_allPatchSets)]]"
-                on-reload-change="_handleReloadChange"
-                on-download-tap="_handleOpenDownloadDialog"></gr-change-actions>
-          </div>
-          <hr class="mobile">
           <div id="commitAndRelated" class="hideOnMobileOverlay">
             <div class="commitContainer">
+              <div>
+                <gr-button
+                    id="replyBtn"
+                    class="reply"
+                    hidden$="[[!_loggedIn]]"
+                    primary
+                    disabled="[[_replyDisabled]]"
+                    on-tap="_handleReplyTap">[[_replyButtonLabel]]</gr-button>
+              </div>
               <div
                   id="commitMessage"
                   class$="commitMessage [[_computeCommitClass(_commitCollapsed, _latestCommitMessage)]]">
                 <gr-editable-content id="commitMessageEditor"
                     editing="[[_editingCommitMessage]]"
                     content="{{_latestCommitMessage}}"
+                    storage-key="[[_computeCommitMessageKey(_change._number, _change.current_revision)]]"
                     remove-zero-width-space>
                   <gr-linked-text pre
                       content="[[_latestCommitMessage]]"
@@ -397,19 +486,26 @@
                   [[_computeCollapseText(_commitCollapsed)]]
                 </gr-button>
               </div>
+              <gr-endpoint-decorator name="commit-container">
+                <gr-endpoint-param name="change" value="[[_change]]">
+                </gr-endpoint-param>
+                <gr-endpoint-param name="revision" value="[[_selectedRevision]]">
+                </gr-endpoint-param>
+              </gr-endpoint-decorator>
             </div>
             <div class="relatedChanges">
               <gr-related-changes-list id="relatedChanges"
-                  class$="[[_computeRelatedChangesClass(_relatedChangesCollapsed, _relatedChangesLoading)]]"
+                  class$="[[_computeRelatedChangesClass(_relatedChangesCollapsed)]]"
                   change="[[_change]]"
+                  mergeable="[[_mergeable]]"
                   has-parent="{{hasParent}}"
-                  loading="{{_relatedChangesLoading}}"
                   on-update="_updateRelatedChangeMaxHeight"
-                  patch-num="[[computeLatestPatchNum(_allPatchSets)]]">
+                  patch-num="[[computeLatestPatchNum(_allPatchSets)]]"
+                  on-new-section-loaded="_computeShowRelatedToggle">
               </gr-related-changes-list>
               <div
                   id="relatedChangesToggle"
-                  class$="collapseToggleContainer [[_computeRelatedChangesToggleClass(_relatedChangesLoading)]]">
+                  class="collapseToggleContainer">
                 <gr-button
                     link
                     id="relatedChangesToggleButton"
@@ -422,17 +518,18 @@
           </div>
         </div>
       </section>
-      <section class="patchInfo hideOnMobileOverlay">
+      <section class="patchInfo">
         <gr-file-list-header
             id="fileListHeader"
             account="[[_account]]"
             all-patch-sets="[[_allPatchSets]]"
             change="[[_change]]"
             change-num="[[_changeNum]]"
-            comments="[[_comments]]"
+            revision-info="[[_revisionInfo]]"
+            change-comments="[[_changeComments]]"
             commit-info="[[_commitInfo]]"
             change-url="[[_computeChangeUrl(_change)]]"
-            edit-loaded="[[_editLoaded]]"
+            edit-mode="[[_editMode]]"
             logged-in="[[_loggedIn]]"
             server-config="[[_serverConfig]]"
             shown-file-count="[[_shownFileCount]]"
@@ -440,38 +537,73 @@
             diff-view-mode="{{viewState.diffMode}}"
             patch-num="{{_patchRange.patchNum}}"
             base-patch-num="{{_patchRange.basePatchNum}}"
-            revisions="[[_sortedRevisions]]"
+            files-expanded="[[_filesExpanded]]"
             on-open-diff-prefs="_handleOpenDiffPrefs"
             on-open-download-dialog="_handleOpenDownloadDialog"
+            on-open-upload-help-dialog="_handleOpenUploadHelpDialog"
             on-open-included-in-dialog="_handleOpenIncludedInDialog"
             on-expand-diffs="_expandAllDiffs"
             on-collapse-diffs="_collapseAllDiffs">
         </gr-file-list-header>
-        <gr-file-list id="fileList"
+        <gr-file-list
+            id="fileList"
+            class="hideOnMobileOverlay"
             diff-prefs="{{_diffPrefs}}"
             change="[[_change]]"
             change-num="[[_changeNum]]"
             patch-range="{{_patchRange}}"
-            comments="[[_comments]]"
+            change-comments="[[_changeComments]]"
             drafts="[[_diffDrafts]]"
-            revisions="[[_sortedRevisions]]"
+            revisions="[[_change.revisions]]"
             project-config="[[_projectConfig]]"
             selected-index="{{viewState.selectedFileIndex}}"
             diff-view-mode="[[viewState.diffMode]]"
-            edit-loaded="[[_editLoaded]]"
+            edit-mode="[[_editMode]]"
             num-files-shown="{{_numFilesShown}}"
+            files-expanded="{{_filesExpanded}}"
             file-list-increment="{{_numFilesShown}}"
-            on-files-shown-changed="_setShownFiles"></gr-file-list>
+            on-files-shown-changed="_setShownFiles"
+            on-file-action-tap="_handleFileActionTap"
+            on-reload-drafts="_reloadDraftsWithCallback"></gr-file-list>
       </section>
-      <gr-messages-list id="messageList"
-          class="hideOnMobileOverlay"
-          change-num="[[_changeNum]]"
-          messages="[[_change.messages]]"
-          reviewer-updates="[[_change.reviewer_updates]]"
-          comments="[[_comments]]"
-          project-name="[[_change.project]]"
-          show-reply-buttons="[[_loggedIn]]"
-          on-reply="_handleMessageReply"></gr-messages-list>
+      <gr-endpoint-decorator name="change-view-integration">
+        <gr-endpoint-param name="change" value="[[_change]]">
+        </gr-endpoint-param>
+        <gr-endpoint-param name="revision" value="[[_selectedRevision]]">
+        </gr-endpoint-param>
+      </gr-endpoint-decorator>
+      <paper-tabs
+          id="commentTabs"
+          on-selected-changed="_handleTabChange">
+        <paper-tab class="changeLog">Change Log</paper-tab>
+        <paper-tab
+            class="commentThreads">
+          <gr-tooltip-content
+              has-tooltip
+              title$="[[_computeTotalCommentCounts(_change.unresolved_comment_count, _changeComments)]]">
+            <span>Comment Threads</span></gr-tooltip-content>
+        </paper-tab>
+      </paper-tabs>
+      <template is="dom-if" if="[[_showMessagesView]]">
+        <gr-messages-list
+            class="hideOnMobileOverlay"
+            change-num="[[_changeNum]]"
+            labels="[[_change.labels]]"
+            messages="[[_change.messages]]"
+            reviewer-updates="[[_change.reviewer_updates]]"
+            change-comments="[[_changeComments]]"
+            project-name="[[_change.project]]"
+            show-reply-buttons="[[_loggedIn]]"
+            on-reply="_handleMessageReply"></gr-messages-list>
+      </template>
+      <template is="dom-if" if="[[!_showMessagesView]]">
+        <gr-thread-list
+            threads="[[_commentThreads]]"
+            change="[[_change]]"
+            change-num="[[_changeNum]]"
+            logged-in="[[_loggedIn]]"
+            on-thread-list-modified="_handleReloadDiffComments"></gr-thread-list>
+      </template>
     </div>
     <gr-overlay id="downloadOverlay" with-backdrop>
       <gr-download-dialog
@@ -481,6 +613,12 @@
           config="[[_serverConfig.download]]"
           on-close="_handleDownloadDialogClose"></gr-download-dialog>
     </gr-overlay>
+    <gr-overlay id="uploadHelpOverlay" with-backdrop>
+      <gr-upload-help-dialog
+          revision="[[_currentRevision]]"
+          target-branch="[[_change.branch]]"
+          on-close="_handleCloseUploadHelpDialog"></gr-upload-help-dialog>
+    </gr-overlay>
     <gr-overlay id="includedInOverlay" with-backdrop>
       <gr-included-in-dialog
           id="includedInDialog"
@@ -491,7 +629,6 @@
         class="scrollable"
         no-cancel-on-outside-click
         no-cancel-on-esc-key
-        on-iron-overlay-opened="_handleReplyOverlayOpen"
         with-backdrop>
       <gr-reply-dialog id="replyDialog"
           change="{{_change}}"
@@ -504,11 +641,14 @@
           on-send="_handleReplySent"
           on-cancel="_handleReplyCancel"
           on-autogrow="_handleReplyAutogrow"
+          on-send-disabled-changed="_resetReplyOverlayFocusStops"
           hidden$="[[!_loggedIn]]">
       </gr-reply-dialog>
     </gr-overlay>
     <gr-js-api-interface id="jsAPI"></gr-js-api-interface>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
+    <gr-comment-api id="commentAPI"></gr-comment-api>
+    <gr-reporting id="reporting"></gr-reporting>
   </template>
   <script src="gr-change-view.js"></script>
 </dom-module>
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
index 1f050ba..470f859 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -29,7 +32,7 @@
   // These are the same as the breakpoint set in CSS. Make sure both are changed
   // together.
   const BREAKPOINT_RELATED_SMALL = '50em';
-  const BREAKPOINT_RELATED_MED = '60em';
+  const BREAKPOINT_RELATED_MED = '75em';
 
   // In the event that the related changes medium width calculation is too close
   // to zero, provide some height.
@@ -39,6 +42,24 @@
 
   const REPLY_REFIT_DEBOUNCE_INTERVAL_MS = 500;
 
+  const TRAILING_WHITESPACE_REGEX = /[ \t]+$/gm;
+
+  const ReloadToastMessage = {
+    NEWER_REVISION: 'A newer patch set has been uploaded',
+    RESTORED: 'This change has been restored',
+    ABANDONED: 'This change has been abandoned',
+    MERGED: 'This change has been merged',
+    NEW_MESSAGE: 'There are new messages on this change',
+  };
+
+  const DiffViewMode = {
+    SIDE_BY_SIDE: 'SIDE_BY_SIDE',
+    UNIFIED: 'UNIFIED_DIFF',
+  };
+
+  const CHANGE_DATA_TIMING_LABEL = 'ChangeDataLoaded';
+  const SEND_REPLY_TIMING_LABEL = 'SendReply';
+
   Polymer({
     is: 'gr-change-view',
 
@@ -81,6 +102,11 @@
         type: Object,
         value() { return document.body; },
       },
+      disableEdit: {
+        type: Boolean,
+        value: false,
+      },
+      _commentThreads: Array,
       /** @type {?} */
       _serverConfig: {
         type: Object,
@@ -96,6 +122,9 @@
         type: Object,
         value: {},
       },
+      _prefs: Object,
+      /** @type {?} */
+      _changeComments: Object,
       _canStartReview: {
         type: Boolean,
         computed: '_computeCanStartReview(_change)',
@@ -106,8 +135,17 @@
         type: Object,
         observer: '_changeChanged',
       },
+      _revisionInfo: {
+        type: Object,
+        computed: '_getRevisionInfo(_change)',
+      },
       /** @type {?} */
       _commitInfo: Object,
+      _currentRevision: {
+        type: Object,
+        computed: '_computeCurrentRevision(_change.current_revision, ' +
+            '_change.revisions)',
+      },
       _files: Object,
       _changeNum: String,
       _diffDrafts: {
@@ -121,7 +159,7 @@
       _hideEditCommitMessage: {
         type: Boolean,
         computed: '_computeHideEditCommitMessage(_loggedIn, ' +
-            '_editingCommitMessage, _change)',
+            '_editingCommitMessage, _change, _editMode)',
       },
       _diffAgainst: String,
       /** @type {?string} */
@@ -139,20 +177,9 @@
       _patchRange: {
         type: Object,
       },
-      // These are kept as separate properties from the patchRange so that the
-      // observer can be aware of the previous value. In order to view sub
-      // property changes for _patchRange, a complex observer must be used, and
-      // that only displays the new value.
-      //
-      // If a previous value did not exist, the change is not reloaded with the
-      // new patches. This is just the initial setting from the change view vs.
-      // an update coming from the two way data binding.
-      _patchNum: String,
+      _filesExpanded: String,
       _basePatchNum: String,
-      _relatedChangesLoading: {
-        type: Boolean,
-        value: true,
-      },
+      _selectedRevision: Object,
       _currentRevisionActions: Object,
       _allPatchSets: {
         type: Array,
@@ -186,6 +213,10 @@
         type: String,
         computed: 'changeStatusString(_change)',
       },
+      _changeStatuses: {
+        type: String,
+        computed: '_computeChangeStatusChips(_change, _mergeable)',
+      },
       _commitCollapsed: {
         type: Boolean,
         value: true,
@@ -196,10 +227,26 @@
       },
       /** @type {?number} */
       _updateCheckTimerHandle: Number,
-      _sortedRevisions: Array,
-      _editLoaded: {
+      _editMode: {
         type: Boolean,
-        computed: '_computeEditLoaded(_patchRange.*)',
+        computed: '_computeEditMode(_patchRange.*, params.*)',
+      },
+      _showRelatedToggle: {
+        type: Boolean,
+        value: false,
+        observer: '_updateToggleContainerClass',
+      },
+      _parentIsCurrent: Boolean,
+      _submitEnabled: Boolean,
+
+      /** @type {?} */
+      _mergeable: {
+        type: Boolean,
+        value: undefined,
+      },
+      _showMessagesView: {
+        type: Boolean,
+        value: true,
       },
     },
 
@@ -218,22 +265,30 @@
       // again upon closing.
       'fullscreen-overlay-opened': '_handleHideBackgroundContent',
       'fullscreen-overlay-closed': '_handleShowBackgroundContent',
+      'diff-comments-modified': '_handleReloadCommentThreads',
     },
+
     observers: [
       '_labelsChanged(_change.labels.*)',
       '_paramsAndChangeChanged(params, _change)',
-      '_updateSortedRevisions(_change.revisions.*)',
+      '_patchNumChanged(_patchRange.patchNum)',
     ],
 
-    keyBindings: {
-      'shift+r': '_handleCapitalRKey',
-      'a': '_handleAKey',
-      'd': '_handleDKey',
-      's': '_handleSKey',
-      'u': '_handleUKey',
-      'x': '_handleXKey',
-      'z': '_handleZKey',
-      ',': '_handleCommaKey',
+    keyboardShortcuts() {
+      return {
+        [this.Shortcut.SEND_REPLY]: null, // DOC_ONLY binding
+        [this.Shortcut.REFRESH_CHANGE]: '_handleRefreshChange',
+        [this.Shortcut.OPEN_REPLY_DIALOG]: '_handleOpenReplyDialog',
+        [this.Shortcut.OPEN_DOWNLOAD_DIALOG]:
+            '_handleOpenDownloadDialogShortcut',
+        [this.Shortcut.TOGGLE_DIFF_MODE]: '_handleToggleDiffMode',
+        [this.Shortcut.TOGGLE_CHANGE_STAR]: '_handleToggleChangeStar',
+        [this.Shortcut.UP_TO_DASHBOARD]: '_handleUpToDashboard',
+        [this.Shortcut.EXPAND_ALL_MESSAGES]: '_handleExpandAllMessages',
+        [this.Shortcut.COLLAPSE_ALL_MESSAGES]: '_handleCollapseAllMessages',
+        [this.Shortcut.OPEN_DIFF_PREFS]: '_handleOpenDiffPrefsShortcut',
+        [this.Shortcut.EDIT_TOPIC]: '_handleEditTopic',
+      };
     },
 
     attached() {
@@ -252,7 +307,7 @@
       });
 
       this.addEventListener('comment-save', this._handleCommentSave.bind(this));
-      this.addEventListener('comment-refresh', this._getDiffDrafts.bind(this));
+      this.addEventListener('comment-refresh', this._reloadDrafts.bind(this));
       this.addEventListener('comment-discard',
           this._handleCommentDiscard.bind(this));
       this.addEventListener('editable-content-save',
@@ -272,13 +327,21 @@
       }
     },
 
+    get messagesList() {
+      return this.$$('gr-messages-list');
+    },
+
+    get threadList() {
+      return this.$$('gr-thread-list');
+    },
+
     /**
      * @param {boolean=} opt_reset
      */
     _setDiffViewMode(opt_reset) {
       if (!opt_reset && this.viewState.diffViewMode) { return; }
 
-      return this.$.restAPI.getPreferences().then( prefs => {
+      return this._getPreferences().then( prefs => {
         if (!this.viewState.diffMode) {
           this.set('viewState.diffMode', prefs.default_diff_view);
         }
@@ -289,9 +352,20 @@
       });
     },
 
-    _updateSortedRevisions(revisionsRecord) {
-      const revisions = revisionsRecord.base;
-      this._sortedRevisions = this.sortRevisions(Object.values(revisions));
+    _handleToggleDiffMode(e) {
+      if (this.shouldSuppressKeyboardShortcut(e) ||
+          this.modifierPressed(e)) { return; }
+
+      e.preventDefault();
+      if (this.viewState.diffMode === DiffViewMode.SIDE_BY_SIDE) {
+        this.$.fileListHeader.setDiffViewMode(DiffViewMode.UNIFIED);
+      } else {
+        this.$.fileListHeader.setDiffViewMode(DiffViewMode.SIDE_BY_SIDE);
+      }
+    },
+
+    _handleTabChange() {
+      this._showMessagesView = this.$.commentTabs.selected === 0;
     },
 
     _handleEditCommitMessage(e) {
@@ -300,7 +374,8 @@
     },
 
     _handleCommitMessageSave(e) {
-      const message = e.detail.content;
+      // Trim trailing whitespace from each line.
+      const message = e.detail.content.replace(TRAILING_WHITESPACE_REGEX, '');
 
       this.$.jsAPI.handleCommitMessage(this._change, message);
 
@@ -327,14 +402,61 @@
       this._editingCommitMessage = false;
     },
 
-    _computeHideEditCommitMessage(loggedIn, editing, change) {
-      if (!loggedIn || editing || change.status === this.ChangeStatus.MERGED) {
+    _computeChangeStatusChips(change, mergeable) {
+      // Show no chips until mergeability is loaded.
+      if (mergeable === null || mergeable === undefined) { return []; }
+
+      const options = {
+        includeDerived: true,
+        mergeable: !!mergeable,
+        submitEnabled: this._submitEnabled,
+      };
+      return this.changeStatuses(change, options);
+    },
+
+    _computeHideEditCommitMessage(loggedIn, editing, change, editMode) {
+      if (!loggedIn || editing || change.status === this.ChangeStatus.MERGED ||
+          editMode) {
         return true;
       }
 
       return false;
     },
 
+    _handleReloadCommentThreads() {
+      // Get any new drafts that have been saved in the diff view and show
+      // in the comment thread view.
+      this._reloadDrafts().then(() => {
+        this._commentThreads = this._changeComments.getAllThreadsForChange()
+            .map(c => Object.assign({}, c));
+        Polymer.dom.flush();
+      });
+    },
+
+    _handleReloadDiffComments(e) {
+      // Keeps the file list counts updated.
+      this._reloadDrafts().then(() => {
+        // Get any new drafts that have been saved in the thread view and show
+        // in the diff view.
+        this.$.fileList.reloadCommentsForThreadWithRootId(e.detail.rootId,
+            e.detail.path);
+        Polymer.dom.flush();
+      });
+    },
+
+    _computeTotalCommentCounts(unresolvedCount, changeComments) {
+      const draftCount = changeComments.computeDraftCount();
+      const unresolvedString = GrCountStringFormatter.computeString(
+          unresolvedCount, 'unresolved');
+      const draftString = GrCountStringFormatter.computePluralString(
+          draftCount, 'draft');
+
+      return unresolvedString +
+          // Add a comma and space if both unresolved and draft comments exist.
+          (unresolvedString && draftString ? ', ' : '') +
+          draftString;
+    },
+
     _handleCommentSave(e) {
       if (!e.target.comment.__draft) { return; }
 
@@ -403,14 +525,13 @@
 
     _handleReplyTap(e) {
       e.preventDefault();
-      this._openReplyDialog();
+      this._openReplyDialog(this.$.replyDialog.FocusTarget.ANY);
     },
 
     _handleOpenDiffPrefs() {
       this.$.fileList.openDiffPrefs();
     },
 
-
     _handleOpenIncludedInDialog() {
       this.$.includedInDialog.loadData().then(() => {
         Polymer.dom.flush();
@@ -435,24 +556,20 @@
       this.$.downloadOverlay.close();
     },
 
+    _handleOpenUploadHelpDialog(e) {
+      this.$.uploadHelpOverlay.open();
+    },
+
+    _handleCloseUploadHelpDialog(e) {
+      this.$.uploadHelpOverlay.close();
+    },
+
     _handleMessageReply(e) {
       const msg = e.detail.message.message;
       const quoteStr = msg.split('\n').map(
           line => { return '> ' + line; }).join('\n') + '\n\n';
-
-      if (quoteStr !== this.$.replyDialog.quote) {
-        this.$.replyDialog.draft = quoteStr;
-      }
       this.$.replyDialog.quote = quoteStr;
-      this._openReplyDialog();
-    },
-
-    _handleReplyOverlayOpen(e) {
-      // This is needed so that focus is not set on the reply overlay
-      // when the suggestion overaly from gr-autogrow-textarea opens.
-      if (e.target === this.$.replyOverlay) {
-        this.$.replyDialog.focus();
-      }
+      this._openReplyDialog(this.$.replyDialog.FocusTarget.BODY);
     },
 
     _handleHideBackgroundContent() {
@@ -465,7 +582,9 @@
 
     _handleReplySent(e) {
       this.$.replyOverlay.close();
-      this._reload();
+      this._reload().then(() => {
+        this.$.reporting.timeEnd(SEND_REPLY_TIMING_LABEL);
+      });
     },
 
     _handleReplyCancel(e) {
@@ -506,11 +625,22 @@
     },
 
     _paramsChanged(value) {
+      // Change the content of the comment tabs back to messages list, but
+      // do not yet change the tab itself. The animation of tab switching will
+      // get messed up if changed here, because it requires the tabs to be on
+      // the streen, and they are hidden shortly after this. The tab switching
+      // animation will happen in post render tasks.
+      this._showMessagesView = true;
+
       if (value.view !== Gerrit.Nav.View.CHANGE) {
         this._initialLoadComplete = false;
         return;
       }
 
+      if (value.changeNum && value.project) {
+        this.$.restAPI.setInProjectLookup(value.changeNum, value.project);
+      }
+
       const patchChanged = this._patchRange &&
           (value.patchNum !== undefined && value.basePatchNum !== undefined) &&
           (this._patchRange.patchNum !== value.patchNum ||
@@ -528,15 +658,14 @@
       this.$.fileList.collapseAllDiffs();
       this._patchRange = patchRange;
 
+      // If the change has already been loaded and the parameter change is only
+      // in the patch range, then don't do a full reload.
       if (this._initialLoadComplete && patchChanged) {
         if (patchRange.patchNum == null) {
           patchRange.patchNum = this.computeLatestPatchNum(this._allPatchSets);
         }
         this._reloadPatchNumDependentResources().then(() => {
-          this.$.jsAPI.handleEvent(this.$.jsAPI.EventType.SHOW_CHANGE, {
-            change: this._change,
-            patchNum: patchRange.patchNum,
-          });
+          this._sendShowChangeEvent();
         });
         return;
       }
@@ -544,20 +673,28 @@
       this._changeNum = value.changeNum;
       this.$.relatedChanges.clear();
 
-      this._reload().then(() => {
+      this._reload(true).then(() => {
         this._performPostLoadTasks();
       });
     },
 
-    _performPostLoadTasks() {
-      this.$.relatedChanges.reload();
-      this._maybeShowReplyDialog();
-      this._maybeShowRevertDialog();
-
+    _sendShowChangeEvent() {
       this.$.jsAPI.handleEvent(this.$.jsAPI.EventType.SHOW_CHANGE, {
         change: this._change,
         patchNum: this._patchRange.patchNum,
+        info: {mergeable: this._mergeable},
       });
+    },
+
+    _performPostLoadTasks() {
+      this._maybeShowReplyDialog();
+      this._maybeShowRevertDialog();
+
+      this._sendShowChangeEvent();
+
+      // Selected has to be set after the paper-tabs are visible because
+      // the selected underline depends on calculations made by the browser.
+      this.$.commentTabs.selected = 0;
 
       this.async(() => {
         if (this.viewState.scrollTop) {
@@ -593,7 +730,7 @@
     _maybeScrollToMessage(hash) {
       const msgPrefix = '#message-';
       if (hash.startsWith(msgPrefix)) {
-        this.$.messageList.scrollToMessage(hash.substr(msgPrefix.length));
+        this.messagesList.scrollToMessage(hash.substr(msgPrefix.length));
       }
     },
 
@@ -634,7 +771,7 @@
         if (!loggedIn) { return; }
 
         if (this.viewState.showReplyDialog) {
-          this._openReplyDialog();
+          this._openReplyDialog(this.$.replyDialog.FocusTarget.ANY);
           // TODO(kaspern@): Find a better signal for when to call center.
           this.async(() => { this.$.replyOverlay.center(); }, 100);
           this.async(() => { this.$.replyOverlay.center(); }, 1000);
@@ -659,16 +796,50 @@
 
     _changeChanged(change) {
       if (!change || !this._patchRange || !this._allPatchSets) { return; }
-      this.set('_patchRange.basePatchNum',
-          this._patchRange.basePatchNum || 'PARENT');
-      this.set('_patchRange.patchNum',
-          this._patchRange.patchNum ||
+
+      const parent = this._getBasePatchNum(change, this._patchRange);
+
+      this.set('_patchRange.basePatchNum', parent);
+      this.set('_patchRange.patchNum', this._patchRange.patchNum ||
               this.computeLatestPatchNum(this._allPatchSets));
 
+      // Reset the related changes toggle in the event it was previously
+      // displayed on an earlier change.
+      this._showRelatedToggle = false;
+
       const title = change.subject + ' (' + change.change_id.substr(0, 9) + ')';
       this.fire('title-change', {title});
     },
 
+    /**
+     * Gets base patch number, if is a parent try and
+     * decide from preference weather to default to `auto merge`
+     * or `Parent 1`.
+     * @param {Object} change
+     * @param {Object} patchRange
+     * @return {number|string}
+     */
+    _getBasePatchNum(change, patchRange) {
+      if (patchRange.basePatchNum &&
+          patchRange.basePatchNum !== 'PARENT') {
+        return patchRange.basePatchNum;
+      }
+
+      const revisionInfo = this._getRevisionInfo(change);
+      if (!revisionInfo) return 'PARENT';
+
+      const parentCounts = revisionInfo.getParentCountMap();
+      // check that there is at least 2 parents otherwise fall back to 1,
+      // which means there is only one parent.
+      const parentCount = parentCounts.hasOwnProperty(1) ?
+          parentCounts[1] : 1;
+
+      const preferFirst = this._prefs &&
+          this._prefs.default_base_for_merges === 'FIRST_PARENT';
+
+      return parentCount > 1 && preferFirst ? -1 : 'PARENT';
+    },
+
     _computeChangeUrl(change) {
       return Gerrit.Nav.getUrlForChange(change);
     },
@@ -769,7 +940,7 @@
       return label;
     },
 
-    _handleAKey(e) {
+    _handleOpenReplyDialog(e) {
       if (this.shouldSuppressKeyboardShortcut(e) ||
           this.modifierPressed(e)) {
         return;
@@ -781,11 +952,11 @@
         }
 
         e.preventDefault();
-        this._openReplyDialog();
+        this._openReplyDialog(this.$.replyDialog.FocusTarget.ANY);
       });
     },
 
-    _handleDKey(e) {
+    _handleOpenDownloadDialogShortcut(e) {
       if (this.shouldSuppressKeyboardShortcut(e) ||
           this.modifierPressed(e)) { return; }
 
@@ -793,13 +964,21 @@
       this.$.downloadOverlay.open();
     },
 
-    _handleCapitalRKey(e) {
+    _handleEditTopic(e) {
+      if (this.shouldSuppressKeyboardShortcut(e) ||
+          this.modifierPressed(e)) { return; }
+
+      e.preventDefault();
+      this.$.metadata.editTopic();
+    },
+
+    _handleRefreshChange(e) {
       if (this.shouldSuppressKeyboardShortcut(e)) { return; }
       e.preventDefault();
       Gerrit.Nav.navigateToChange(this._change);
     },
 
-    _handleSKey(e) {
+    _handleToggleChangeStar(e) {
       if (this.shouldSuppressKeyboardShortcut(e) ||
           this.modifierPressed(e)) { return; }
 
@@ -807,7 +986,7 @@
       this.$.changeStar.toggleStar();
     },
 
-    _handleUKey(e) {
+    _handleUpToDashboard(e) {
       if (this.shouldSuppressKeyboardShortcut(e) ||
           this.modifierPressed(e)) { return; }
 
@@ -815,23 +994,23 @@
       this._determinePageBack();
     },
 
-    _handleXKey(e) {
+    _handleExpandAllMessages(e) {
       if (this.shouldSuppressKeyboardShortcut(e) ||
           this.modifierPressed(e)) { return; }
 
       e.preventDefault();
-      this.$.messageList.handleExpandCollapse(true);
+      this.messagesList.handleExpandCollapse(true);
     },
 
-    _handleZKey(e) {
+    _handleCollapseAllMessages(e) {
       if (this.shouldSuppressKeyboardShortcut(e) ||
           this.modifierPressed(e)) { return; }
 
       e.preventDefault();
-      this.$.messageList.handleExpandCollapse(false);
+      this.messagesList.handleExpandCollapse(false);
     },
 
-    _handleCommaKey(e) {
+    _handleOpenDiffPrefsShortcut(e) {
       if (this.shouldSuppressKeyboardShortcut(e) ||
           this.modifierPressed(e)) { return; }
 
@@ -840,9 +1019,10 @@
     },
 
     _determinePageBack() {
-      // Default backPage to '/' if user came to change view page
+      // Default backPage to root if user came to change view page
       // via an email link, etc.
-      Gerrit.Nav.navigateToRelativeUrl(this.backPage || '/');
+      Gerrit.Nav.navigateToRelativeUrl(this.backPage ||
+          Gerrit.Nav.getUrlForRoot());
     },
 
     _handleLabelRemoved(splices, path) {
@@ -876,7 +1056,7 @@
      */
     _openReplyDialog(opt_section) {
       this.$.replyOverlay.open().then(() => {
-        this.$.replyOverlay.setFocusStops(this.$.replyDialog.getFocusStops());
+        this._resetReplyOverlayFocusStops();
         this.$.replyDialog.open(opt_section);
         Polymer.dom.flush();
         this.$.replyOverlay.center();
@@ -898,12 +1078,6 @@
       this.fire('page-error', {response});
     },
 
-    _getDiffDrafts() {
-      return this.$.restAPI.getDiffDrafts(this._changeNum).then(drafts => {
-        this._diffDrafts = drafts;
-      });
-    },
-
     _getLoggedIn() {
       return this.$.restAPI.getLoggedIn();
     },
@@ -919,11 +1093,18 @@
           });
     },
 
+    _getPreferences() {
+      return this.$.restAPI.getPreferences();
+    },
+
     _updateRebaseAction(revisionActions) {
       if (revisionActions && revisionActions.rebase) {
         revisionActions.rebase.rebaseOnCurrent =
             !!revisionActions.rebase.enabled;
+        this._parentIsCurrent = !revisionActions.rebase.enabled;
         revisionActions.rebase.enabled = true;
+      } else {
+        this._parentIsCurrent = true;
       }
       return revisionActions;
     },
@@ -969,9 +1150,12 @@
       const detailCompletes = this.$.restAPI.getChangeDetail(
           this._changeNum, this._handleGetChangeDetailError.bind(this));
       const editCompletes = this._getEdit();
+      const prefCompletes = this._getPreferences();
 
-      return Promise.all([detailCompletes, editCompletes])
-          .then(([change, edit]) => {
+      return Promise.all([detailCompletes, editCompletes, prefCompletes])
+          .then(([change, edit, prefs]) => {
+            this._prefs = prefs;
+
             if (!change) {
               return '';
             }
@@ -989,6 +1173,10 @@
             } else {
               this._latestCommitMessage = null;
             }
+
+            // Update the submit enabled based on current revision.
+            this._submitEnabled = this._isSubmitEnabled(currentRevision);
+
             const lineHeight = getComputedStyle(this).lineHeight;
 
             // Slice returns a number as a string, convert to an int.
@@ -1006,15 +1194,20 @@
               this._commitInfo = currentRevision.commit;
               this._currentRevisionActions =
                       this._updateRebaseAction(currentRevision.actions);
-                  // TODO: Fetch and process files.
+              this._selectedRevision = currentRevision;
+              // TODO: Fetch and process files.
+            } else {
+              this._selectedRevision =
+                Object.values(this._change.revisions).find(
+                    revision => revision._number ===
+                      parseInt(this._patchRange.patchNum, 10));
             }
           });
     },
 
-    _getComments() {
-      return this.$.restAPI.getDiffComments(this._changeNum).then(comments => {
-        this._comments = comments;
-      });
+    _isSubmitEnabled(currentRevision) {
+      return !!(currentRevision.actions && currentRevision.actions.submit &&
+          currentRevision.actions.submit.enabled);
     },
 
     _getEdit() {
@@ -1056,47 +1249,135 @@
           });
     },
 
-    _reloadDiffDrafts() {
-      this._diffDrafts = {};
-      this._getDiffDrafts().then(() => {
-        if (this.$.replyOverlay.opened) {
-          this.async(() => { this.$.replyOverlay.center(); }, 1);
-        }
+    _reloadDraftsWithCallback(e) {
+      return this._reloadDrafts().then(() => {
+        return e.detail.resolve();
       });
     },
 
-    _reload() {
+    /**
+     * Fetches a new changeComment object, and data for all types of comments
+     * (comments, robot comments, draft comments) is requested.
+     */
+    _reloadComments() {
+      return this.$.commentAPI.loadAll(this._changeNum)
+          .then(comments => {
+            this._changeComments = comments;
+            this._diffDrafts = Object.assign({}, this._changeComments.drafts);
+            this._commentThreads = this._changeComments.getAllThreadsForChange()
+              .map(c => Object.assign({}, c));
+          });
+    },
+
+    /**
+     * Fetches a new changeComment object, but only updated data for drafts is
+     * requested.
+     */
+    _reloadDrafts() {
+      return this.$.commentAPI.reloadDrafts(this._changeNum)
+          .then(comments => {
+            this._changeComments = comments;
+            this._diffDrafts = Object.assign({}, this._changeComments.drafts);
+          });
+    },
+
+    /**
+     * Reload the change.
+     * @param {boolean=} opt_reloadRelatedChanges Reloads the related chanegs
+     *     when true.
+     * @return {Promise} A promise that resolves when the core data has loaded.
+     *     Some non-core data loading may still be in-flight when the core data
+     *     promise resolves.
+     */
+    _reload(opt_reloadRelatedChanges) {
       this._loading = true;
       this._relatedChangesCollapsed = true;
 
-      this._getLoggedIn().then(loggedIn => {
-        if (!loggedIn) { return; }
+      // Array to house all promises related to data requests.
+      const allDataPromises = [];
 
-        this._reloadDiffDrafts();
-      });
+      // Resolves when the change detail and the edit patch set (if available)
+      // are loaded.
+      const detailCompletes = this._getChangeDetail();
+      allDataPromises.push(detailCompletes);
 
-      const detailCompletes = this._getChangeDetail().then(() => {
-        this._loading = false;
-        this._getProjectConfig();
-      });
-      this._getComments();
+      // Resolves when the loading flag is set to false, meaning that some
+      // change content may start appearing.
+      const loadingFlagSet = detailCompletes
+          .then(() => { this._loading = false; });
 
+      // Resolves when the project config has loaded.
+      const projectConfigLoaded = detailCompletes
+          .then(() => this._getProjectConfig());
+      allDataPromises.push(projectConfigLoaded);
+
+      // Resolves when change comments have loaded (comments, drafts and robot
+      // comments).
+      const commentsLoaded = this._reloadComments();
+      allDataPromises.push(commentsLoaded);
+
+      let coreDataPromise;
+
+      // If the patch number is specified
       if (this._patchRange.patchNum) {
-        return Promise.all([
-          this._reloadPatchNumDependentResources(),
-          detailCompletes,
-        ]).then(() => {
-          return this.$.actions.reload();
-        });
+        // Because a specific patchset is specified, reload the resources that
+        // are keyed by patch number or patch range.
+        const patchResourcesLoaded = this._reloadPatchNumDependentResources();
+        allDataPromises.push(patchResourcesLoaded);
+
+        // Promise resolves when the change detail and patch dependent resources
+        // have loaded.
+        const detailAndPatchResourcesLoaded =
+            Promise.all([patchResourcesLoaded, loadingFlagSet]);
+
+        // Promise resolves when mergeability information has loaded.
+        const mergeabilityLoaded = detailAndPatchResourcesLoaded
+            .then(() => this._getMergeability());
+        allDataPromises.push(mergeabilityLoaded);
+
+        // Promise resovles when the change actions have loaded.
+        const actionsLoaded = detailAndPatchResourcesLoaded
+            .then(() => this.$.actions.reload());
+        allDataPromises.push(actionsLoaded);
+
+        // The core data is loaded when both mergeability and actions are known.
+        coreDataPromise = Promise.all([mergeabilityLoaded, actionsLoaded]);
       } else {
-        // The patch number is reliant on the change detail request.
-        return detailCompletes.then(() => {
-          this.$.fileList.reload();
-          if (!this._latestCommitMessage) {
-            this._getLatestCommitMessage();
-          }
+        // Resolves when the file list has loaded.
+        const fileListReload = loadingFlagSet
+            .then(() => this.$.fileList.reload());
+        allDataPromises.push(fileListReload);
+
+        const latestCommitMessageLoaded = loadingFlagSet.then(() => {
+          // If the latest commit message is known, there is nothing to do.
+          if (this._latestCommitMessage) { return Promise.resolve(); }
+          return this._getLatestCommitMessage();
         });
+        allDataPromises.push(latestCommitMessageLoaded);
+
+        // Promise resolves when mergeability information has loaded.
+        const mergeabilityLoaded = loadingFlagSet
+            .then(() => this._getMergeability());
+        allDataPromises.push(mergeabilityLoaded);
+
+        // Core data is loaded when mergeability has been loaded.
+        coreDataPromise = mergeabilityLoaded;
       }
+
+      if (opt_reloadRelatedChanges) {
+        const relatedChangesLoaded = coreDataPromise
+            .then(() => this.$.relatedChanges.reload());
+        allDataPromises.push(relatedChangesLoaded);
+      }
+
+      this.$.reporting.time(CHANGE_DATA_TIMING_LABEL);
+      Promise.all(allDataPromises).then(() => {
+        this.$.reporting.timeEnd(CHANGE_DATA_TIMING_LABEL);
+        this.$.reporting.changeFullyLoaded();
+      });
+
+      return coreDataPromise
+          .then(() => { this.$.reporting.changeDisplayed(); });
     },
 
     /**
@@ -1110,6 +1391,22 @@
       ]);
     },
 
+    _getMergeability() {
+      // If the change is closed, it is not mergeable. Note: already merged
+      // changes are obviously not mergeable, but the mergeability API will not
+      // answer for abandoned changes.
+      if (this._change.status === this.ChangeStatus.MERGED ||
+          this._change.status === this.ChangeStatus.ABANDONED) {
+        this._mergeable = false;
+        return Promise.resolve();
+      }
+
+      this._mergeable = null;
+      return this.$.restAPI.getMergeable(this._changeNum).then(m => {
+        this._mergeable = m.mergeable;
+      });
+    },
+
     _computeCanStartReview(change) {
       return !!(change.actions && change.actions.ready &&
           change.actions.ready.enabled);
@@ -1126,12 +1423,7 @@
       return collapsed ? 'collapsed' : '';
     },
 
-    _computeRelatedChangesClass(collapsed, loading) {
-      // TODO(beckysiegel) figure out how to check for customstyle in Polymer2,
-      // since customStyle was removed.
-      if (!loading && !this.customStyle['--relation-chain-max-height']) {
-        this._updateRelatedChangeMaxHeight();
-      }
+    _computeRelatedChangesClass(collapsed) {
       return collapsed ? 'collapsed' : '';
     },
 
@@ -1234,14 +1526,33 @@
       this.updateStyles(stylesToUpdate);
     },
 
-    _computeRelatedChangesToggleClass() {
+    _computeShowRelatedToggle() {
+      // Make sure the max height has been applied, since there is now content
+      // to populate.
+      // TODO update to polymer 2.x syntax
+      if (!this.getComputedStyleValue('--relation-chain-max-height')) {
+        this._updateRelatedChangeMaxHeight();
+      }
       // Prevents showMore from showing when click on related change, since the
       // line height would be positive, but related changes height is 0.
-      if (!this._getScrollHeight(this.$.relatedChanges)) { return ''; }
+      if (!this._getScrollHeight(this.$.relatedChanges)) {
+        return this._showRelatedToggle = false;
+      }
 
-      return this._getScrollHeight(this.$.relatedChanges) >
+      if (this._getScrollHeight(this.$.relatedChanges) >
           (this._getOffsetHeight(this.$.relatedChanges) +
-          this._getLineHeight(this.$.relatedChanges)) ? 'showToggle' : '';
+          this._getLineHeight(this.$.relatedChanges))) {
+        return this._showRelatedToggle = true;
+      }
+      this._showRelatedToggle = false;
+    },
+
+    _updateToggleContainerClass(showRelatedToggle) {
+      if (showRelatedToggle) {
+        this.$.relatedChangesToggle.classList.add('showToggle');
+      } else {
+        this.$.relatedChangesToggle.classList.remove('showToggle');
+      }
     },
 
     _startUpdateCheckTimer() {
@@ -1253,24 +1564,37 @@
       }
 
       this._updateCheckTimerHandle = this.async(() => {
-        this.fetchIsLatestKnown(this._change, this.$.restAPI)
-            .then(latest => {
-              if (latest) {
-                this._startUpdateCheckTimer();
-              } else {
-                this._cancelUpdateCheckTimer();
-                this.fire('show-alert', {
-                  message: 'A newer patch set has been uploaded.',
-                  // Persist this alert.
-                  dismissOnNavigation: true,
-                  action: 'Reload',
-                  callback: function() {
-                    // Load the current change without any patch range.
-                    Gerrit.Nav.navigateToChange(this._change);
-                  }.bind(this),
-                });
-              }
-            });
+        this.fetchChangeUpdates(this._change, this.$.restAPI).then(result => {
+          let toastMessage = null;
+          if (!result.isLatest) {
+            toastMessage = ReloadToastMessage.NEWER_REVISION;
+          } else if (result.newStatus === this.ChangeStatus.MERGED) {
+            toastMessage = ReloadToastMessage.MERGED;
+          } else if (result.newStatus === this.ChangeStatus.ABANDONED) {
+            toastMessage = ReloadToastMessage.ABANDONED;
+          } else if (result.newStatus === this.ChangeStatus.NEW) {
+            toastMessage = ReloadToastMessage.RESTORED;
+          } else if (result.newMessages) {
+            toastMessage = ReloadToastMessage.NEW_MESSAGE;
+          }
+
+          if (!toastMessage) {
+            this._startUpdateCheckTimer();
+            return;
+          }
+
+          this._cancelUpdateCheckTimer();
+          this.fire('show-alert', {
+            message: toastMessage,
+            // Persist this alert.
+            dismissOnNavigation: true,
+            action: 'Reload',
+            callback: function() {
+              // Load the current change without any patch range.
+              Gerrit.Nav.navigateToChange(this._change);
+            }.bind(this),
+          });
+        });
       }, this._serverConfig.change.update_delay * 1000);
     },
 
@@ -1293,13 +1617,99 @@
       this.$.relatedChanges.reload();
     },
 
-    _computeHeaderClass(change) {
-      return change.work_in_progress ? 'header wip' : 'header';
+    _computeHeaderClass(editMode) {
+      const classes = ['header'];
+      if (editMode) { classes.push('editMode'); }
+      return classes.join(' ');
     },
 
-    _computeEditLoaded(patchRangeRecord) {
+    _computeEditMode(patchRangeRecord, paramsRecord) {
+      if (paramsRecord.base && paramsRecord.base.edit) { return true; }
+
       const patchRange = patchRangeRecord.base || {};
       return this.patchNumEquals(patchRange.patchNum, this.EDIT_NAME);
     },
+
+    _handleFileActionTap(e) {
+      e.preventDefault();
+      const controls = this.$.fileListHeader.$.editControls;
+      const path = e.detail.path;
+      switch (e.detail.action) {
+        case GrEditConstants.Actions.DELETE.id:
+          controls.openDeleteDialog(path);
+          break;
+        case GrEditConstants.Actions.OPEN.id:
+          Gerrit.Nav.navigateToRelativeUrl(
+              Gerrit.Nav.getEditUrlForDiff(this._change, path,
+                  this._patchRange.patchNum));
+          break;
+        case GrEditConstants.Actions.RENAME.id:
+          controls.openRenameDialog(path);
+          break;
+        case GrEditConstants.Actions.RESTORE.id:
+          controls.openRestoreDialog(path);
+          break;
+      }
+    },
+
+    _computeCommitMessageKey(number, revision) {
+      return `c${number}_rev${revision}`;
+    },
+
+    _patchNumChanged(patchNumStr) {
+      if (!this._selectedRevision) {
+        return;
+      }
+      const patchNum = parseInt(patchNumStr, 10);
+      if (patchNum === this._selectedRevision._number) {
+        return;
+      }
+      this._selectedRevision = Object.values(this._change.revisions).find(
+          revision => revision._number === patchNum);
+    },
+
+    /**
+     * If an edit exists already, load it. Otherwise, toggle edit mode via the
+     * navigation API.
+     */
+    _handleEditTap() {
+      const editInfo = Object.values(this._change.revisions).find(info =>
+          info._number === this.EDIT_NAME);
+
+      if (editInfo) {
+        Gerrit.Nav.navigateToChange(this._change, this.EDIT_NAME);
+        return;
+      }
+
+      // Avoid putting patch set in the URL unless a non-latest patch set is
+      // selected.
+      let patchNum;
+      if (!this.patchNumEquals(this._patchRange.patchNum,
+          this.computeLatestPatchNum(this._allPatchSets))) {
+        patchNum = this._patchRange.patchNum;
+      }
+      Gerrit.Nav.navigateToChange(this._change, patchNum, null, true);
+    },
+
+    _handleStopEditTap() {
+      Gerrit.Nav.navigateToChange(this._change, this._patchRange.patchNum);
+    },
+
+    _resetReplyOverlayFocusStops() {
+      this.$.replyOverlay.setFocusStops(this.$.replyDialog.getFocusStops());
+    },
+
+    _handleToggleStar(e) {
+      this.$.restAPI.saveChangeStarred(e.detail.change._number,
+          e.detail.starred);
+    },
+
+    _getRevisionInfo(change) {
+      return new Gerrit.RevisionInfo(change);
+    },
+
+    _computeCurrentRevision(currentRevision, revisions) {
+      return revisions && revisions[currentRevision];
+    },
   });
 })();
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.html b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.html
index b37fac5..419cf01 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.html
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +24,7 @@
 <link rel="import" href="../../../test/common-test-setup.html"/>
 <script src="../../../bower_components/page/page.js"></script>
 
+<link rel="import" href="../../edit/gr-edit-constants.html">
 <link rel="import" href="gr-change-view.html">
 
 <script>void(0);</script>
@@ -41,6 +43,19 @@
 
 <script>
   suite('gr-change-view tests', () => {
+    const kb = window.Gerrit.KeyboardShortcutBinder;
+    kb.bindShortcut(kb.Shortcut.SEND_REPLY, 'ctrl+enter');
+    kb.bindShortcut(kb.Shortcut.REFRESH_CHANGE, 'shift+r');
+    kb.bindShortcut(kb.Shortcut.OPEN_REPLY_DIALOG, 'a');
+    kb.bindShortcut(kb.Shortcut.OPEN_DOWNLOAD_DIALOG, 'd');
+    kb.bindShortcut(kb.Shortcut.TOGGLE_DIFF_MODE, 'm');
+    kb.bindShortcut(kb.Shortcut.TOGGLE_CHANGE_STAR, 's');
+    kb.bindShortcut(kb.Shortcut.UP_TO_DASHBOARD, 'u');
+    kb.bindShortcut(kb.Shortcut.EXPAND_ALL_MESSAGES, 'x');
+    kb.bindShortcut(kb.Shortcut.COLLAPSE_ALL_MESSAGES, 'z');
+    kb.bindShortcut(kb.Shortcut.OPEN_DIFF_PREFS, ',');
+    kb.bindShortcut(kb.Shortcut.EDIT_TOPIC, 't');
+
     let element;
     let sandbox;
     let navigateToChangeStub;
@@ -48,13 +63,23 @@
 
     setup(() => {
       sandbox = sinon.sandbox.create();
+      stub('gr-endpoint-decorator', {
+        _import: sandbox.stub().returns(Promise.resolve()),
+      });
+      // Since _endpoints are global, must reset state.
+      Gerrit._endpoints = new GrPluginEndpoints();
       navigateToChangeStub = sandbox.stub(Gerrit.Nav, 'navigateToChange');
       stub('gr-rest-api-interface', {
         getConfig() { return Promise.resolve({test: 'config'}); },
         getAccount() { return Promise.resolve(null); },
+        getDiffComments() { return Promise.resolve({}); },
+        getDiffRobotComments() { return Promise.resolve({}); },
+        getDiffDrafts() { return Promise.resolve({}); },
         _fetchSharedCacheURL() { return Promise.resolve({}); },
       });
       element = fixture('basic');
+      sandbox.stub(element.$.actions, 'reload').returns(Promise.resolve());
+      Gerrit._setPluginsCount(0);
     });
 
     teardown(done => {
@@ -64,9 +89,17 @@
       });
     });
 
+    getCustomCssValue = cssParam => {
+      // TODO: Update to be compatible with 2.x when we upgrade from
+      // 1.x to 2.x.
+      return element.getComputedStyleValue(cssParam);
+    };
+
     suite('keyboard shortcuts', () => {
-      setup(() => {
-        sandbox.stub(element, '_updateSortedRevisions');
+      test('t to add topic', () => {
+        const editStub = sandbox.stub(element.$.metadata, 'editTopic');
+        MockInteractions.pressAndReleaseKeyOn(element, 83, null, 't');
+        assert(editStub.called);
       });
 
       test('S should toggle the CL star', () => {
@@ -75,12 +108,13 @@
         assert(starStub.called);
       });
 
-      test('U should navigate to / if no backPage set', () => {
+      test('U should navigate to root if no backPage set', () => {
         const relativeNavStub = sandbox.stub(Gerrit.Nav,
             'navigateToRelativeUrl');
         MockInteractions.pressAndReleaseKeyOn(element, 85, null, 'u');
         assert.isTrue(relativeNavStub.called);
-        assert.isTrue(relativeNavStub.lastCall.calledWithExactly('/'));
+        assert.isTrue(relativeNavStub.lastCall.calledWithExactly(
+            Gerrit.Nav.getUrlForRoot()));
       });
 
       test('U should navigate to backPage if set', () => {
@@ -116,14 +150,20 @@
 
       test('A toggles overlay when logged in', done => {
         sandbox.stub(element, '_getLoggedIn').returns(Promise.resolve(true));
-        sandbox.stub(element.$.replyDialog, 'fetchIsLatestKnown')
-            .returns(Promise.resolve(true));
+        sandbox.stub(element.$.replyDialog, 'fetchChangeUpdates')
+            .returns(Promise.resolve({isLatest: true}));
         element._change = {labels: {}};
+        const openSpy = sandbox.spy(element, '_openReplyDialog');
+
         MockInteractions.pressAndReleaseKeyOn(element, 65, null, 'a');
         flush(() => {
           assert.isTrue(element.$.replyOverlay.opened);
           element.$.replyOverlay.close();
           assert.isFalse(element.$.replyOverlay.opened);
+          assert(openSpy.lastCall.calledWithExactly(
+              element.$.replyDialog.FocusTarget.ANY),
+              '_openReplyDialog should have been passed ANY');
+          assert.equal(openSpy.callCount, 1);
           done();
         });
       });
@@ -147,7 +187,7 @@
         element.$.replyDialog.fire('fullscreen-overlay-opened');
         assert.isTrue(element._handleHideBackgroundContent.called);
         assert.isTrue(element.$.mainContent.classList.contains('overlayOpen'));
-        assert.equal(getComputedStyle(element.$.actions).display, 'block');
+        assert.equal(getComputedStyle(element.$.actions).display, 'flex');
       });
 
       test('fullscreen-overlay-closed shows content', () => {
@@ -185,18 +225,24 @@
         assert.isTrue(handleCollapse.called);
       });
 
-      test('X should expand all messages', () => {
-        const handleExpand =
-            sandbox.stub(element.$.messageList, 'handleExpandCollapse');
-        MockInteractions.pressAndReleaseKeyOn(element, 88, null, 'x');
-        assert(handleExpand.calledWith(true));
+      test('X should expand all messages', done => {
+        flush(() => {
+          const handleExpand = sandbox.stub(element.messagesList,
+              'handleExpandCollapse');
+          MockInteractions.pressAndReleaseKeyOn(element, 88, null, 'x');
+          assert(handleExpand.calledWith(true));
+          done();
+        });
       });
 
-      test('Z should collapse all messages', () => {
-        const handleExpand =
-            sandbox.stub(element.$.messageList, 'handleExpandCollapse');
-        MockInteractions.pressAndReleaseKeyOn(element, 90, null, 'z');
-        assert(handleExpand.calledWith(false));
+      test('Z should collapse all messages', done => {
+        flush(() => {
+          const handleExpand = sandbox.stub(element.messagesList,
+              'handleExpandCollapse');
+          MockInteractions.pressAndReleaseKeyOn(element, 90, null, 'z');
+          assert(handleExpand.calledWith(false));
+          done();
+        });
       });
 
       test('shift + R should fetch and navigate to the latest patch set',
@@ -210,7 +256,7 @@
               change_id: 'Iad9dc96274af6946f3632be53b106ef80f7ba6ca',
               _number: 42,
               revisions: {
-                rev1: {_number: 1},
+                rev1: {_number: 1, commit: {parents: []}},
               },
               current_revision: 'rev1',
               status: 'NEW',
@@ -218,8 +264,6 @@
               actions: {},
             };
 
-            sandbox.stub(element.$.actions, 'reload');
-
             navigateToChangeStub.restore();
             navigateToChangeStub = sandbox.stub(Gerrit.Nav, 'navigateToChange',
                 (change, patchNum, basePatchNum) => {
@@ -239,10 +283,161 @@
       });
 
       test(', should open diff preferences', () => {
-        const stub = sandbox.stub(element.$.fileList.$.diffPreferences, 'open');
+        const stub = sandbox.stub(
+            element.$.fileList.$.diffPreferencesDialog, 'open');
         MockInteractions.pressAndReleaseKeyOn(element, 188, null, ',');
         assert.isTrue(stub.called);
       });
+
+      test('m should toggle diff mode', () => {
+        sandbox.stub(element, 'shouldSuppressKeyboardShortcut').returns(false);
+        const setModeStub = sandbox.stub(element.$.fileListHeader,
+            'setDiffViewMode');
+        const e = {preventDefault: () => {}};
+        flushAsynchronousOperations();
+
+        element.viewState.diffMode = 'SIDE_BY_SIDE';
+        element._handleToggleDiffMode(e);
+        assert.isTrue(setModeStub.calledWith('UNIFIED_DIFF'));
+
+        element.viewState.diffMode = 'UNIFIED_DIFF';
+        element._handleToggleDiffMode(e);
+        assert.isTrue(setModeStub.calledWith('SIDE_BY_SIDE'));
+      });
+    });
+
+    suite('reloading drafts', () => {
+      let reloadStub;
+      const drafts = {
+        'testfile.txt': [
+          {
+            patch_set: 5,
+            id: 'dd2982f5_c01c9e6a',
+            line: 1,
+            updated: '2017-11-08 18:47:45.000000000',
+            message: 'test',
+            unresolved: true,
+          },
+        ],
+      };
+      setup(() => {
+        reloadStub = sandbox.stub(element.$.commentAPI, 'reloadDrafts')
+            .returns(Promise.resolve({drafts}));
+      });
+
+      test('drafts are reloaded when reload-drafts fired', done => {
+        element.$.fileList.fire('reload-drafts', {
+          resolve: () => {
+            assert.isTrue(reloadStub.called);
+            assert.deepEqual(element._diffDrafts, drafts);
+            done();
+          },
+        });
+      });
+
+      test('drafts are reloaded when comment-refresh fired', () => {
+        element.fire('comment-refresh');
+        assert.isTrue(reloadStub.called);
+      });
+    });
+
+    test('diff comments modified', () => {
+      sandbox.spy(element, '_handleReloadCommentThreads');
+      return element._reloadComments().then(() => {
+        element.fire('diff-comments-modified');
+        assert.isTrue(element._handleReloadCommentThreads.called);
+      });
+    });
+
+    test('thread list modified', () => {
+      sandbox.spy(element, '_handleReloadDiffComments');
+      element._showMessagesView = false;
+      flushAsynchronousOperations();
+
+      return element._reloadComments().then(() => {
+        element.threadList.fire('thread-list-modified');
+        assert.isTrue(element._handleReloadDiffComments.called);
+
+        let draftStub = sinon.stub(element._changeComments, 'computeDraftCount')
+            .returns(1);
+        assert.equal(element._computeTotalCommentCounts(5,
+            element._changeComments), '5 unresolved, 1 draft');
+        assert.equal(element._computeTotalCommentCounts(0,
+            element._changeComments), '1 draft');
+        draftStub.restore();
+        draftStub = sinon.stub(element._changeComments, 'computeDraftCount')
+            .returns(0);
+        assert.equal(element._computeTotalCommentCounts(0,
+            element._changeComments), '');
+        assert.equal(element._computeTotalCommentCounts(1,
+            element._changeComments), '1 unresolved');
+        draftStub.restore();
+        draftStub = sinon.stub(element._changeComments, 'computeDraftCount')
+            .returns(2);
+        assert.equal(element._computeTotalCommentCounts(1,
+            element._changeComments), '1 unresolved, 2 drafts');
+        draftStub.restore();
+      });
+    });
+
+    test('thread list and change log tabs', done => {
+      element._changeNum = '1';
+      element._patchRange = {
+        basePatchNum: 'PARENT',
+        patchNum: 1,
+      };
+      element._change = {
+        change_id: 'Iad9dc96274af6946f3632be53b106ef80f7ba6ca',
+        revisions: {
+          rev2: {_number: 2, commit: {parents: []}},
+          rev1: {_number: 1, commit: {parents: []}},
+          rev13: {_number: 13, commit: {parents: []}},
+          rev3: {_number: 3, commit: {parents: []}},
+        },
+        current_revision: 'rev3',
+        status: 'NEW',
+        labels: {
+          test: {
+            all: [],
+            default_value: 0,
+            values: [],
+            approved: {},
+          },
+        },
+      };
+      sandbox.stub(element.$.relatedChanges, 'reload');
+      sandbox.stub(element, '_reload').returns(Promise.resolve());
+      sandbox.spy(element, '_paramsChanged');
+      element.params = {view: 'change', changeNum: '1'};
+
+      // When the change is hard reloaded, paramsChanged will not set the tab.
+      // It will be set in postLoadTasks, which requires the flush() to detect.
+      assert.isTrue(element._paramsChanged.called);
+      assert.isUndefined(element.$.commentTabs.selected);
+
+      // Wait for tab to get selected
+      flush(() => {
+        assert.equal(element.$.commentTabs.selected, 0);
+        assert.isTrue(element._showMessagesView);
+        // Switch to comment thread tab
+        MockInteractions.tap(element.$$('paper-tab.commentThreads'));
+        assert.equal(element.$.commentTabs.selected, 1);
+        assert.isFalse(element._showMessagesView);
+
+        // When the change is partially reloaded (ex: Shift+R), the content
+        // is swapped out before the tab, so messages list will display even
+        // though the tab for comment threads is still temporarily selected.
+        element._paramsChanged(element.params);
+        assert.equal(element.$.commentTabs.selected, 1);
+        assert.isTrue(element._showMessagesView);
+        done();
+      });
+    });
+
+    test('reply button is not visible when logged out', () => {
+      assert.equal(getComputedStyle(element.$.replyBtn).display, 'none');
+      element._loggedIn = true;
+      assert.notEqual(getComputedStyle(element.$.replyBtn).display, 'none');
     });
 
     test('download tap calls _handleOpenDownloadDialog', () => {
@@ -258,6 +453,38 @@
       });
     });
 
+    test('_changeStatuses', () => {
+      sandbox.stub(element, 'changeStatuses').returns(
+          ['Merged', 'WIP']);
+      element._loading = false;
+      element._change = {
+        change_id: 'Iad9dc96274af6946f3632be53b106ef80f7ba6ca',
+        revisions: {
+          rev2: {_number: 2},
+          rev1: {_number: 1},
+          rev13: {_number: 13},
+          rev3: {_number: 3},
+        },
+        current_revision: 'rev3',
+        labels: {
+          test: {
+            all: [],
+            default_value: 0,
+            values: [],
+            approved: {},
+          },
+        },
+      };
+      element._mergeable = true;
+      expectedStatuses = ['Merged', 'WIP'];
+      assert.deepEqual(element._changeStatuses, expectedStatuses);
+      assert.equal(element._changeStatus, expectedStatuses.join(', '));
+      flushAsynchronousOperations();
+      const statusChips = Polymer.dom(element.root)
+          .querySelectorAll('gr-change-status');
+      assert.equal(statusChips.length, 2);
+    });
+
     test('diff preferences open when open-diff-prefs is fired', () => {
       const overlayOpenStub = sandbox.stub(element.$.fileList,
           'openDiffPrefs');
@@ -294,6 +521,7 @@
           title: 'Rebase onto tip of branch or parent change',
         },
       };
+      element._parentIsCurrent = undefined;
 
       // Rebase enabled should always end up true.
       // When rebase is enabled initially, rebaseOnCurrent should be set to
@@ -303,6 +531,7 @@
 
       assert.isTrue(currentRevisionActions.rebase.enabled);
       assert.isTrue(currentRevisionActions.rebase.rebaseOnCurrent);
+      assert.isFalse(element._parentIsCurrent);
 
       delete currentRevisionActions.rebase.enabled;
 
@@ -313,6 +542,29 @@
 
       assert.isTrue(currentRevisionActions.rebase.enabled);
       assert.isFalse(currentRevisionActions.rebase.rebaseOnCurrent);
+      assert.isTrue(element._parentIsCurrent);
+    });
+
+    test('_isSubmitEnabled', () => {
+      assert.isFalse(element._isSubmitEnabled({}));
+      assert.isFalse(element._isSubmitEnabled({actions: {}}));
+      assert.isFalse(element._isSubmitEnabled({actions: {submit: {}}}));
+      assert.isTrue(element._isSubmitEnabled(
+          {actions: {submit: {enabled: true}}}));
+    });
+
+    test('_updateRebaseAction sets _parentIsCurrent on no rebase', () => {
+      const currentRevisionActions = {
+        cherrypick: {
+          enabled: true,
+          label: 'Cherry Pick',
+          method: 'POST',
+          title: 'cherrypick',
+        },
+      };
+      element._parentIsCurrent = undefined;
+      element._updateRebaseAction(currentRevisionActions);
+      assert.isTrue(element._parentIsCurrent);
     });
 
     test('_reload is called when an approved label is removed', () => {
@@ -324,11 +576,12 @@
       };
       element._change = {
         change_id: 'Iad9dc96274af6946f3632be53b106ef80f7ba6ca',
+        owner: {email: 'abc@def'},
         revisions: {
-          rev2: {_number: 2},
-          rev1: {_number: 1},
-          rev13: {_number: 13},
-          rev3: {_number: 3},
+          rev2: {_number: 2, commit: {parents: []}},
+          rev1: {_number: 1, commit: {parents: []}},
+          rev13: {_number: 13, commit: {parents: []}},
+          rev3: {_number: 3, commit: {parents: []}},
         },
         current_revision: 'rev3',
         status: 'NEW',
@@ -416,7 +669,6 @@
     });
 
     test('change num change', () => {
-      sandbox.stub(element, '_updateSortedRevisions');
       element._changeNum = null;
       element._patchRange = {
         basePatchNum: 'PARENT',
@@ -610,6 +862,26 @@
       assert.isFalse(element._computeHideEditCommitMessage(true, false, {}));
       assert.isTrue(element._computeHideEditCommitMessage(true, false,
           _change));
+      assert.isTrue(element._computeHideEditCommitMessage(true, false, {},
+          true));
+      assert.isFalse(element._computeHideEditCommitMessage(true, false, {},
+          false));
+    });
+
+    test('_handleCommitMessageSave trims trailing whitespace', () => {
+      const putStub = sandbox.stub(element.$.restAPI, 'putChangeCommitMessage')
+          .returns(Promise.resolve({}));
+
+      const mockEvent = content => { return {detail: {content}}; };
+
+      element._handleCommitMessageSave(mockEvent('test \n  test '));
+      assert.equal(putStub.lastCall.args[1], 'test\n  test');
+
+      element._handleCommitMessageSave(mockEvent('  test\ntest'));
+      assert.equal(putStub.lastCall.args[1], '  test\ntest');
+
+      element._handleCommitMessageSave(mockEvent('\n\n\n\n\n\n\n\n'));
+      assert.equal(putStub.lastCall.args[1], '\n\n\n\n\n\n\n\n');
     });
 
     test('_computeChangeIdCommitMessageError', () => {
@@ -748,6 +1020,31 @@
       });
     });
 
+    test('_openReplyDialog called with `ANY` when coming from tap event',
+        () => {
+          const openStub = sandbox.stub(element, '_openReplyDialog');
+          element._serverConfig = {};
+          MockInteractions.tap(element.$.replyBtn);
+          assert(openStub.lastCall.calledWithExactly(
+              element.$.replyDialog.FocusTarget.ANY),
+              '_openReplyDialog should have been passed ANY');
+          assert.equal(openStub.callCount, 1);
+        });
+
+    test('_openReplyDialog called with `BODY` when coming from message reply' +
+        'event', done => {
+      flush(() => {
+        const openStub = sandbox.stub(element, '_openReplyDialog');
+        element.messagesList.fire('reply',
+            {message: {message: 'text'}});
+        assert(openStub.lastCall.calledWithExactly(
+            element.$.replyDialog.FocusTarget.BODY),
+            '_openReplyDialog should have been passed BODY');
+        assert.equal(openStub.callCount, 1);
+        done();
+      });
+    });
+
     test('reply dialog focus can be controlled', () => {
       const FocusTarget = element.$.replyDialog.FocusTarget;
       const openStub = sandbox.stub(element, '_openReplyDialog');
@@ -756,11 +1053,13 @@
       element._handleShowReplyDialog(e);
       assert(openStub.lastCall.calledWithExactly(FocusTarget.REVIEWERS),
           '_openReplyDialog should have been passed REVIEWERS');
+      assert.equal(openStub.callCount, 1);
 
       e.detail.value = {ccsOnly: true};
       element._handleShowReplyDialog(e);
       assert(openStub.lastCall.calledWithExactly(FocusTarget.CCS),
           '_openReplyDialog should have been passed CCS');
+      assert.equal(openStub.callCount, 2);
     });
 
     test('getUrlParameter functionality', () => {
@@ -793,8 +1092,8 @@
       element._change = {
         change_id: 'Iad9dc96274af6946f3632be53b106ef80f7ba6ca',
         revisions: {
-          rev1: {_number: 1},
-          rev2: {_number: 2},
+          rev1: {_number: 1, commit: {parents: []}},
+          rev2: {_number: 2, commit: {parents: []}},
         },
         current_revision: 'rev1',
         status: element.ChangeStatus.MERGED,
@@ -854,16 +1153,14 @@
     suite('reply dialog tests', () => {
       setup(() => {
         sandbox.stub(element.$.replyDialog, '_draftChanged');
-        sandbox.stub(element, '_updateSortedRevisions');
-        sandbox.stub(element.$.replyDialog, 'fetchIsLatestKnown',
-            () => { return Promise.resolve(true); });
+        sandbox.stub(element.$.replyDialog, 'fetchChangeUpdates',
+            () => { return Promise.resolve({isLatest: true}); });
         element._change = {labels: {}};
       });
 
       test('reply from comment adds quote text', () => {
         const e = {detail: {message: {message: 'quote text'}}};
         element._handleMessageReply(e);
-        assert.equal(element.$.replyDialog.draft, '> quote text\n\n');
         assert.equal(element.$.replyDialog.quote, '> quote text\n\n');
       });
 
@@ -872,7 +1169,6 @@
         element.$.replyDialog.quote = '> old quote text\n\n';
         const e = {detail: {message: {message: 'quote text'}}};
         element._handleMessageReply(e);
-        assert.equal(element.$.replyDialog.draft, '> quote text\n\n');
         assert.equal(element.$.replyDialog.quote, '> quote text\n\n');
       });
 
@@ -906,8 +1202,8 @@
 
     suite('commit message expand/collapse', () => {
       setup(() => {
-        sandbox.stub(element, 'fetchIsLatestKnown',
-            () => { return Promise.resolve(false); });
+        sandbox.stub(element, 'fetchChangeUpdates',
+            () => { return Promise.resolve({isLatest: false}); });
       });
 
       test('commitCollapseToggle hidden for short commit message', () => {
@@ -938,6 +1234,24 @@
         updateHeightSpy = sandbox.spy(element, '_updateRelatedChangeMaxHeight');
       });
 
+      test('_showRelatedToggle is reset when a new change is loaded', () => {
+        element._patchRange = {};
+        assert.isFalse(element._showRelatedToggle);
+        element._showRelatedToggle = true;
+        element._change = {
+          change_id: 'Iad9dc96274af6946f3632be53b106ef80f7ba6ca',
+          _number: 42,
+          revisions: {
+            rev1: {_number: 1, commit: {parents: []}},
+          },
+          current_revision: 'rev1',
+          status: 'NEW',
+          labels: {},
+          actions: {},
+        };
+        assert.isFalse(element._showRelatedToggle);
+      });
+
       test('relatedChangesToggle shown height greater than changeInfo height',
           () => {
             assert.isFalse(element.$.relatedChangesToggle.classList
@@ -946,7 +1260,8 @@
             sandbox.stub(element, '_getScrollHeight', () => 60);
             sandbox.stub(element, '_getLineHeight', () => 5);
             sandbox.stub(window, 'matchMedia', () => ({matches: true}));
-            element._relatedChangesLoading = false;
+            element.$.relatedChanges.dispatchEvent(
+                new CustomEvent('new-section-loaded'));
             assert.isTrue(element.$.relatedChangesToggle.classList
                 .contains('showToggle'));
             assert.equal(updateHeightSpy.callCount, 1);
@@ -960,7 +1275,8 @@
             sandbox.stub(element, '_getScrollHeight', () => 40);
             sandbox.stub(element, '_getLineHeight', () => 5);
             sandbox.stub(window, 'matchMedia', () => ({matches: true}));
-            element._relatedChangesLoading = false;
+            element.$.relatedChanges.dispatchEvent(
+                new CustomEvent('new-section-loaded'));
             assert.isFalse(element.$.relatedChangesToggle.classList
                 .contains('showToggle'));
             assert.equal(updateHeightSpy.callCount, 1);
@@ -989,10 +1305,10 @@
         // 20 (adjusted height) - 8 (remainder) = 12 (max height to set).
 
         element._updateRelatedChangeMaxHeight();
-        assert.equal(element.customStyle['--relation-chain-max-height'],
+        assert.equal(getCustomCssValue('--relation-chain-max-height'),
             '12px');
-        assert.equal(element.customStyle['--related-change-btn-top-padding'],
-            undefined);
+        assert.equal(getCustomCssValue('--related-change-btn-top-padding'),
+            '');
       });
 
       test('_updateRelatedChangeMaxHeight with commit toggle', () => {
@@ -1005,9 +1321,9 @@
         // 50 (existing height)  - 2 (remainder) = 48 (max height to set).
 
         element._updateRelatedChangeMaxHeight();
-        assert.equal(element.customStyle['--relation-chain-max-height'],
+        assert.equal(getCustomCssValue('--relation-chain-max-height'),
             '48px');
-        assert.equal(element.customStyle['--related-change-btn-top-padding'],
+        assert.equal(getCustomCssValue('--related-change-btn-top-padding'),
             '2px');
       });
 
@@ -1022,7 +1338,7 @@
         // 400 (new height) % 12 (line height) = 4 (remainder).
         // 400 (new height) - 4 (remainder) = 396.
 
-        assert.equal(element.customStyle['--relation-chain-max-height'],
+        assert.equal(getCustomCssValue('--relation-chain-max-height'),
             '396px');
       });
 
@@ -1031,7 +1347,7 @@
         sandbox.stub(element, '_getOffsetHeight', () => 50);
         sandbox.stub(element, '_getLineHeight', () => 12);
         sandbox.stub(window, 'matchMedia', () => {
-          if (window.matchMedia.lastCall.args[0] === '(max-width: 60em)') {
+          if (window.matchMedia.lastCall.args[0] === '(max-width: 75em)') {
             return {matches: true};
           } else {
             return {matches: false};
@@ -1041,7 +1357,7 @@
         // 100 (new height) % 12 (line height) = 4 (remainder).
         // 100 (new height) - 4 (remainder) = 96.
         element._updateRelatedChangeMaxHeight();
-        assert.equal(element.customStyle['--relation-chain-max-height'],
+        assert.equal(getCustomCssValue('--relation-chain-max-height'),
             '96px');
       });
 
@@ -1057,29 +1373,58 @@
         });
 
         test('_startUpdateCheckTimer negative delay', () => {
-          sandbox.stub(element, 'fetchIsLatestKnown');
+          sandbox.stub(element, 'fetchChangeUpdates');
 
           element._serverConfig = {change: {update_delay: -1}};
 
           assert.isTrue(element._startUpdateCheckTimer.called);
-          assert.isFalse(element.fetchIsLatestKnown.called);
+          assert.isFalse(element.fetchChangeUpdates.called);
         });
 
         test('_startUpdateCheckTimer up-to-date', () => {
-          sandbox.stub(element, 'fetchIsLatestKnown',
-              () => { return Promise.resolve(true); });
+          sandbox.stub(element, 'fetchChangeUpdates',
+              () => { return Promise.resolve({isLatest: true}); });
 
           element._serverConfig = {change: {update_delay: 12345}};
 
           assert.isTrue(element._startUpdateCheckTimer.called);
-          assert.isTrue(element.fetchIsLatestKnown.called);
+          assert.isTrue(element.fetchChangeUpdates.called);
           assert.equal(element.async.lastCall.args[1], 12345 * 1000);
         });
 
         test('_startUpdateCheckTimer out-of-date shows an alert', done => {
-          sandbox.stub(element, 'fetchIsLatestKnown',
-              () => { return Promise.resolve(false); });
-          element.addEventListener('show-alert', () => {
+          sandbox.stub(element, 'fetchChangeUpdates',
+              () => { return Promise.resolve({isLatest: false}); });
+          element.addEventListener('show-alert', e => {
+            assert.equal(e.detail.message,
+                'A newer patch set has been uploaded');
+            done();
+          });
+          element._serverConfig = {change: {update_delay: 12345}};
+        });
+
+        test('_startUpdateCheckTimer new status shows an alert', done => {
+          sandbox.stub(element, 'fetchChangeUpdates')
+              .returns(Promise.resolve({
+                isLatest: true,
+                newStatus: element.ChangeStatus.MERGED,
+              }));
+          element.addEventListener('show-alert', e => {
+            assert.equal(e.detail.message, 'This change has been merged');
+            done();
+          });
+          element._serverConfig = {change: {update_delay: 12345}};
+        });
+
+        test('_startUpdateCheckTimer new messages shows an alert', done => {
+          sandbox.stub(element, 'fetchChangeUpdates')
+              .returns(Promise.resolve({
+                isLatest: true,
+                newMessages: true,
+              }));
+          element.addEventListener('show-alert', e => {
+            assert.equal(e.detail.message,
+                'There are new messages on this change');
             done();
           });
           element._serverConfig = {change: {update_delay: 12345}};
@@ -1106,26 +1451,27 @@
         assert.isTrue(element._computeCanStartReview(change2));
         assert.isFalse(element._computeCanStartReview(change3));
       });
-
-      test('header class computation', () => {
-        assert.equal(element._computeHeaderClass({}), 'header');
-        assert.equal(element._computeHeaderClass({work_in_progress: true}),
-            'header wip');
-      });
     });
 
-    test('_maybeScrollToMessage', () => {
-      const scrollStub = sandbox.stub(element.$.messageList, 'scrollToMessage');
+    test('header class computation', () => {
+      assert.equal(element._computeHeaderClass(), 'header');
+      assert.equal(element._computeHeaderClass(true), 'header editMode');
+    });
 
-      element._maybeScrollToMessage('');
-      assert.isFalse(scrollStub.called);
+    test('_maybeScrollToMessage', done => {
+      flush(() => {
+        const scrollStub = sandbox.stub(element.messagesList,
+            'scrollToMessage');
 
-      element._maybeScrollToMessage('message');
-      assert.isFalse(scrollStub.called);
-
-      element._maybeScrollToMessage('#message-TEST');
-      assert.isTrue(scrollStub.called);
-      assert.equal(scrollStub.lastCall.args[0], 'TEST');
+        element._maybeScrollToMessage('');
+        assert.isFalse(scrollStub.called);
+        element._maybeScrollToMessage('message');
+        assert.isFalse(scrollStub.called);
+        element._maybeScrollToMessage('#message-TEST');
+        assert.isTrue(scrollStub.called);
+        assert.equal(scrollStub.lastCall.args[0], 'TEST');
+        done();
+      });
     });
 
     test('topic update reloads related changes', () => {
@@ -1134,12 +1480,14 @@
       assert.isTrue(element.$.relatedChanges.reload.calledOnce);
     });
 
-    test('_computeEditLoaded', () => {
-      const callCompute = range => element._computeEditLoaded({base: range});
-      assert.isFalse(callCompute({}));
-      assert.isFalse(callCompute({basePatchNum: 'PARENT', patchNum: 1}));
-      assert.isFalse(callCompute({basePatchNum: 'edit', patchNum: 1}));
-      assert.isTrue(callCompute({basePatchNum: 1, patchNum: 'edit'}));
+    test('_computeEditMode', () => {
+      const callCompute = (range, params) =>
+          element._computeEditMode({base: range}, {base: params});
+      assert.isFalse(callCompute({}, {}));
+      assert.isTrue(callCompute({}, {edit: true}));
+      assert.isFalse(callCompute({basePatchNum: 'PARENT', patchNum: 1}, {}));
+      assert.isFalse(callCompute({basePatchNum: 'edit', patchNum: 1}, {}));
+      assert.isTrue(callCompute({basePatchNum: 1, patchNum: 'edit'}, {}));
     });
 
     test('_processEdit', () => {
@@ -1183,14 +1531,251 @@
       assert.notOk(mockChange.revisions.bar.actions);
     });
 
-    test('_editLoaded set when patchNum is an edit', () => {
-      sandbox.stub(element, 'computeLatestPatchNum').returns('2');
-      element._patchRange = {patchNum: element.EDIT_NAME};
+    test('file-action-tap handling', () => {
+      element._patchRange = {
+        basePatchNum: 'PARENT',
+        patchNum: 1,
+      };
+      const fileList = element.$.fileList;
+      const Actions = GrEditConstants.Actions;
+      const controls = element.$.fileListHeader.$.editControls;
+      sandbox.stub(controls, 'openDeleteDialog');
+      sandbox.stub(controls, 'openRenameDialog');
+      sandbox.stub(controls, 'openRestoreDialog');
+      sandbox.stub(Gerrit.Nav, 'getEditUrlForDiff');
+      sandbox.stub(Gerrit.Nav, 'navigateToRelativeUrl');
 
-      assert.isTrue(element._editLoaded);
-      element.set('_patchRange.patchNum', 1);
+      // Delete
+      fileList.dispatchEvent(new CustomEvent('file-action-tap',
+          {detail: {action: Actions.DELETE.id, path: 'foo'}, bubbles: true}));
+      flushAsynchronousOperations();
 
-      assert.isFalse(element._editLoaded);
+      assert.isTrue(controls.openDeleteDialog.called);
+      assert.equal(controls.openDeleteDialog.lastCall.args[0], 'foo');
+
+      // Restore
+      fileList.dispatchEvent(new CustomEvent('file-action-tap',
+          {detail: {action: Actions.RESTORE.id, path: 'foo'}, bubbles: true}));
+      flushAsynchronousOperations();
+
+      assert.isTrue(controls.openRestoreDialog.called);
+      assert.equal(controls.openRestoreDialog.lastCall.args[0], 'foo');
+
+      // Rename
+      fileList.dispatchEvent(new CustomEvent('file-action-tap',
+          {detail: {action: Actions.RENAME.id, path: 'foo'}, bubbles: true}));
+      flushAsynchronousOperations();
+
+      assert.isTrue(controls.openRenameDialog.called);
+      assert.equal(controls.openRenameDialog.lastCall.args[0], 'foo');
+
+      // Open
+      fileList.dispatchEvent(new CustomEvent('file-action-tap',
+          {detail: {action: Actions.OPEN.id, path: 'foo'}, bubbles: true}));
+      flushAsynchronousOperations();
+
+      assert.isTrue(Gerrit.Nav.getEditUrlForDiff.called);
+      assert.equal(Gerrit.Nav.getEditUrlForDiff.lastCall.args[1], 'foo');
+      assert.equal(Gerrit.Nav.getEditUrlForDiff.lastCall.args[2], '1');
+      assert.isTrue(Gerrit.Nav.navigateToRelativeUrl.called);
+    });
+
+    test('_selectedRevision updates when patchNum is changed', () => {
+      const revision1 = {_number: 1, commit: {parents: []}};
+      const revision2 = {_number: 2, commit: {parents: []}};
+      sandbox.stub(element.$.restAPI, 'getChangeDetail').returns(
+          Promise.resolve({
+            revisions: {
+              aaa: revision1,
+              bbb: revision2,
+            },
+            labels: {},
+            actions: {},
+            current_revision: 'bbb',
+            change_id: 'loremipsumdolorsitamet',
+          }));
+      sandbox.stub(element, '_getEdit').returns(Promise.resolve());
+      sandbox.stub(element, '_getPreferences').returns(Promise.resolve({}));
+      element._patchRange = {patchNum: '2'};
+      return element._getChangeDetail().then(() => {
+        assert.strictEqual(element._selectedRevision, revision2);
+
+        element.set('_patchRange.patchNum', '1');
+        assert.strictEqual(element._selectedRevision, revision1);
+      });
+    });
+
+    test('_sendShowChangeEvent', () => {
+      element._change = {labels: {}};
+      element._patchRange = {patchNum: 4};
+      element._mergeable = true;
+      const showStub = sandbox.stub(element.$.jsAPI, 'handleEvent');
+      element._sendShowChangeEvent();
+      assert.isTrue(showStub.calledOnce);
+      assert.equal(
+          showStub.lastCall.args[0], element.$.jsAPI.EventType.SHOW_CHANGE);
+      assert.deepEqual(showStub.lastCall.args[1], {
+        change: {labels: {}},
+        patchNum: 4,
+        info: {mergeable: true},
+      });
+    });
+
+    suite('_handleEditTap', () => {
+      let fireEdit;
+
+      setup(() => {
+        fireEdit = () => {
+          element.$.actions.dispatchEvent(new CustomEvent('edit-tap'));
+        };
+        navigateToChangeStub.restore();
+
+        element._change = {revisions: {rev1: {_number: 1}}};
+      });
+
+      test('edit exists in revisions', done => {
+        sandbox.stub(Gerrit.Nav, 'navigateToChange', (...args) => {
+          assert.equal(args.length, 2);
+          assert.equal(args[1], element.EDIT_NAME); // patchNum
+          done();
+        });
+
+        element.set('_change.revisions.rev2', {_number: element.EDIT_NAME});
+        flushAsynchronousOperations();
+
+        fireEdit();
+      });
+
+      test('no edit exists in revisions, non-latest patchset', done => {
+        sandbox.stub(Gerrit.Nav, 'navigateToChange', (...args) => {
+          assert.equal(args.length, 4);
+          assert.equal(args[1], 1); // patchNum
+          assert.equal(args[3], true); // opt_isEdit
+          done();
+        });
+
+        element.set('_change.revisions.rev2', {_number: 2});
+        element._patchRange = {patchNum: 1};
+        flushAsynchronousOperations();
+
+        fireEdit();
+      });
+
+      test('no edit exists in revisions, latest patchset', done => {
+        sandbox.stub(Gerrit.Nav, 'navigateToChange', (...args) => {
+          assert.equal(args.length, 4);
+          // No patch should be specified when patchNum == latest.
+          assert.isNotOk(args[1]); // patchNum
+          assert.equal(args[3], true); // opt_isEdit
+          done();
+        });
+
+        element.set('_change.revisions.rev2', {_number: 2});
+        element._patchRange = {patchNum: 2};
+        flushAsynchronousOperations();
+
+        fireEdit();
+      });
+    });
+
+    test('_handleStopEditTap', done => {
+      sandbox.stub(element.$.metadata, '_computeLabelNames');
+      navigateToChangeStub.restore();
+      sandbox.stub(element, 'computeLatestPatchNum').returns(1);
+      sandbox.stub(Gerrit.Nav, 'navigateToChange', (...args) => {
+        assert.equal(args.length, 2);
+        assert.equal(args[1], 1); // patchNum
+        done();
+      });
+
+      element._patchRange = {patchNum: 1};
+      element.$.actions.dispatchEvent(new CustomEvent('stop-edit-tap',
+            {bubbles: false}));
+    });
+
+    suite('plugin endpoints', () => {
+      test('endpoint params', done => {
+        element._change = {labels: {}};
+        element._selectedRevision = {};
+        let hookEl;
+        let plugin;
+        Gerrit.install(
+            p => {
+              plugin = p;
+              plugin.hook('change-view-integration').getLastAttached().then(
+                  el => hookEl = el);
+            },
+            '0.1',
+            'http://some/plugins/url.html');
+        flush(() => {
+          assert.strictEqual(hookEl.plugin, plugin);
+          assert.strictEqual(hookEl.change, element._change);
+          assert.strictEqual(hookEl.revision, element._selectedRevision);
+          done();
+        });
+      });
+    });
+
+    suite('_getMergeability', () => {
+      let getMergeableStub;
+
+      setup(() => {
+        element._change = {labels: {}};
+        getMergeableStub = sandbox.stub(element.$.restAPI, 'getMergeable')
+            .returns(Promise.resolve({mergeable: true}));
+      });
+
+      test('merged change', () => {
+        element._mergeable = null;
+        element._change.status = element.ChangeStatus.MERGED;
+        return element._getMergeability().then(() => {
+          assert.isFalse(element._mergeable);
+          assert.isFalse(getMergeableStub.called);
+        });
+      });
+
+      test('abandoned change', () => {
+        element._mergeable = null;
+        element._change.status = element.ChangeStatus.ABANDONED;
+        return element._getMergeability().then(() => {
+          assert.isFalse(element._mergeable);
+          assert.isFalse(getMergeableStub.called);
+        });
+      });
+
+      test('open change', () => {
+        element._mergeable = null;
+        return element._getMergeability().then(() => {
+          assert.isTrue(element._mergeable);
+          assert.isTrue(getMergeableStub.called);
+        });
+      });
+    });
+
+    test('_paramsChanged sets in projectLookup', () => {
+      sandbox.stub(element.$.relatedChanges, 'reload');
+      sandbox.stub(element, '_reload').returns(Promise.resolve());
+      const setStub = sandbox.stub(element.$.restAPI, 'setInProjectLookup');
+      element._paramsChanged({
+        view: Gerrit.Nav.View.CHANGE,
+        changeNum: 101,
+        project: 'test-project',
+      });
+      assert.isTrue(setStub.calledOnce);
+      assert.isTrue(setStub.calledWith(101, 'test-project'));
+    });
+
+    test('_handleToggleStar called when star is tapped', () => {
+      element._change = {
+        owner: {_account_id: 1},
+        starred: false,
+      };
+      element._loggedIn = true;
+      const stub = sandbox.stub(element, '_handleToggleStar');
+      flushAsynchronousOperations();
+
+      MockInteractions.tap(element.$.changeStar.$$('button'));
+      assert.isTrue(stub.called);
     });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/change/gr-comment-list/gr-comment-list.html b/polygerrit-ui/app/elements/change/gr-comment-list/gr-comment-list.html
index e6f37cf..e4183df 100644
--- a/polygerrit-ui/app/elements/change/gr-comment-list/gr-comment-list.html
+++ b/polygerrit-ui/app/elements/change/gr-comment-list/gr-comment-list.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,7 +17,7 @@
 
 <link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
 <link rel="import" href="../../../behaviors/gr-path-list-behavior/gr-path-list-behavior.html">
-<link rel="import" href="../../../behaviors/gr-url-encoding-behavior.html">
+<link rel="import" href="../../../behaviors/gr-url-encoding-behavior/gr-url-encoding-behavior.html">
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
 <link rel="import" href="../../core/gr-navigation/gr-navigation.html">
 <link rel="import" href="../../shared/gr-formatted-text/gr-formatted-text.html">
@@ -35,14 +36,14 @@
         word-wrap: break-word;
       }
       .file {
-        border-top: 1px solid #ddd;
-        font-family: var(--font-family-bold);
+        border-top: 1px solid var(--border-color);
+        font-weight: var(--font-weight-bold);
         margin: 10px 0 3px;
         padding: 10px 0 5px;
       }
       .container {
         display: flex;
-        margin: 5px 0;
+        margin: .5em 0;
       }
       .lineNum {
         margin-right: .5em;
@@ -53,13 +54,19 @@
         flex: 1;
         --gr-formatted-text-prose-max-width: 80ch;
       }
+      @media screen and (max-width: 50em) {
+        .container {
+          flex-direction: column;
+          margin: 0 0 .5em .5em;
+        }
+        .lineNum {
+          min-width: initial;
+          text-align: left;
+        }
+      }
     </style>
     <template is="dom-repeat" items="[[_computeFilesFromComments(comments)]]" as="file">
-      <div class="file">
-        <a href$="[[_computeFileDiffURL(file, changeNum, patchNum)]]">
-          [[computeDisplayPath(file)]]
-        </a>:
-      </div>
+      <div class="file">[[computeDisplayPath(file)]]:</div>
       <template is="dom-repeat"
                 items="[[_computeCommentsForFile(comments, file)]]" as="comment">
         <div class="container">
@@ -77,7 +84,7 @@
               class="message"
               no-trailing-margin
               content="[[comment.message]]"
-              config="[[commentLinks]]"></gr-formatted-text>
+              config="[[projectConfig.commentlinks]]"></gr-formatted-text>
         </div>
       </template>
     </template>
diff --git a/polygerrit-ui/app/elements/change/gr-comment-list/gr-comment-list.js b/polygerrit-ui/app/elements/change/gr-comment-list/gr-comment-list.js
index 7e7a0ec..cbc7e42 100644
--- a/polygerrit-ui/app/elements/change/gr-comment-list/gr-comment-list.js
+++ b/polygerrit-ui/app/elements/change/gr-comment-list/gr-comment-list.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
   Polymer({
@@ -26,7 +29,6 @@
       changeNum: Number,
       comments: Object,
       patchNum: Number,
-      commentLinks: Object,
       projectName: String,
       /** @type {?} */
       projectConfig: Object,
@@ -37,18 +39,16 @@
       return arr.sort(this.specialFilePathCompare);
     },
 
-    _computeFileDiffURL(file, changeNum, patchNum) {
-      return Gerrit.Nav.getUrlForDiffById(this.changeNum, this.projectName,
-          file, patchNum);
-    },
-
     _isOnParent(comment) {
       return comment.side === 'PARENT';
     },
 
     _computeDiffLineURL(file, changeNum, patchNum, comment) {
+      const basePatchNum = comment.hasOwnProperty('parent') ?
+          -comment.parent : null;
       return Gerrit.Nav.getUrlForDiffById(this.changeNum, this.projectName,
-          file, patchNum, null, comment.line, this._isOnParent(comment));
+          file, patchNum, basePatchNum, comment.line,
+          this._isOnParent(comment));
     },
 
     _computeCommentsForFile(comments, file) {
diff --git a/polygerrit-ui/app/elements/change/gr-comment-list/gr-comment-list_test.html b/polygerrit-ui/app/elements/change/gr-comment-list/gr-comment-list_test.html
index 0e47e30..9996abc 100644
--- a/polygerrit-ui/app/elements/change/gr-comment-list/gr-comment-list_test.html
+++ b/polygerrit-ui/app/elements/change/gr-comment-list/gr-comment-list_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -34,11 +35,16 @@
 <script>
   suite('gr-comment-list tests', () => {
     let element;
+    let sandbox;
 
     setup(() => {
       element = fixture('basic');
+      sandbox = sinon.sandbox.create();
+      sandbox.stub(Gerrit.Nav, 'mapCommentlinks', x => x);
     });
 
+    teardown(() => { sandbox.restore(); });
+
     test('_computeFilesFromComments w/ special file path sorting', () => {
       const comments = {
         'file_b.html': [],
@@ -72,5 +78,51 @@
       comment.side = 'PARENT';
       assert.equal(element._computePatchDisplayName(comment), 'Base, ');
     });
+
+    test('config commentlinks propagate to formatted text', () => {
+      element.comments = {
+        'test.h': [{
+          author: {name: 'foo'},
+          patch_set: 4,
+          line: 10,
+          updated: '2017-10-30 20:48:40.000000000',
+          message: 'Ideadbeefdeadbeef',
+          unresolved: true,
+        }],
+      };
+      element.projectConfig = {
+        commentlinks: {foo: {link: '#/q/$1', match: '(I[0-9a-f]{8,40})'}},
+      };
+      flushAsynchronousOperations();
+      const formattedText = Polymer.dom(element.root).querySelector(
+          'gr-formatted-text.message');
+      assert.isOk(formattedText.config);
+      assert.deepEqual(formattedText.config,
+          element.projectConfig.commentlinks);
+    });
+
+    test('_computeDiffLineURL', () => {
+      const getUrlStub = sandbox.stub(Gerrit.Nav, 'getUrlForDiffById');
+      element.projectName = 'proj';
+      element.changeNum = 123;
+
+      const comment = {line: 456};
+      element._computeDiffLineURL('foo.cc', 123, 4, comment);
+      assert.isTrue(getUrlStub.calledOnce);
+      assert.deepEqual(getUrlStub.lastCall.args,
+          [123, 'proj', 'foo.cc', 4, null, 456, false]);
+
+      comment.side = 'PARENT';
+      element._computeDiffLineURL('foo.cc', 123, 4, comment);
+      assert.isTrue(getUrlStub.calledTwice);
+      assert.deepEqual(getUrlStub.lastCall.args,
+          [123, 'proj', 'foo.cc', 4, null, 456, true]);
+
+      comment.parent = 12;
+      element._computeDiffLineURL('foo.cc', 123, 4, comment);
+      assert.isTrue(getUrlStub.calledThrice);
+      assert.deepEqual(getUrlStub.lastCall.args,
+          [123, 'proj', 'foo.cc', 4, -12, 456, true]);
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/change/gr-commit-info/gr-commit-info.html b/polygerrit-ui/app/elements/change/gr-commit-info/gr-commit-info.html
index dec4e118..b6c8fcc 100644
--- a/polygerrit-ui/app/elements/change/gr-commit-info/gr-commit-info.html
+++ b/polygerrit-ui/app/elements/change/gr-commit-info/gr-commit-info.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,21 +17,31 @@
 
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
 <link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../../shared/gr-copy-clipboard/gr-copy-clipboard.html">
 
 <dom-module id="gr-commit-info">
   <template>
     <style include="shared-styles">
-      :host {
-        display: inline-block;
+      .container {
+        align-items: center;
+        display: flex;
       }
     </style>
-    <template is="dom-if" if="[[_showWebLink]]">
-      <a target="_blank" rel="noopener"
-         href$="[[_webLink]]">[[_computeShortHash(commitInfo)]]</a>
-    </template>
-    <template is="dom-if" if="[[!_showWebLink]]">
-      [[_computeShortHash(commitInfo)]]
-    </template>
+    <div class="container">
+      <template is="dom-if" if="[[_showWebLink]]">
+        <a target="_blank" rel="noopener"
+            href$="[[_webLink]]">[[_computeShortHash(commitInfo)]]</a>
+      </template>
+      <template is="dom-if" if="[[!_showWebLink]]">
+        [[_computeShortHash(commitInfo)]]
+      </template>
+      <gr-copy-clipboard
+          has-tooltip
+          button-title="Copy full SHA to clipboard"
+          hide-input
+          text="[[commitInfo.commit]]">
+      </gr-copy-clipboard>
+    </div>
   </template>
   <script src="gr-commit-info.js"></script>
 </dom-module>
diff --git a/polygerrit-ui/app/elements/change/gr-commit-info/gr-commit-info.js b/polygerrit-ui/app/elements/change/gr-commit-info/gr-commit-info.js
index ed8abfe..837de59 100644
--- a/polygerrit-ui/app/elements/change/gr-commit-info/gr-commit-info.js
+++ b/polygerrit-ui/app/elements/change/gr-commit-info/gr-commit-info.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -19,6 +22,7 @@
 
     properties: {
       change: Object,
+      /** @type {?} */
       commitInfo: Object,
       serverConfig: Object,
       _showWebLink: {
@@ -31,64 +35,30 @@
       },
     },
 
-    _isWebLink(link) {
-      // This is a whitelist of web link types that provide direct links to
-      // the commit in the url property.
-      return link.name === 'gitiles' || link.name === 'gitweb';
+    _getWeblink(change, commitInfo, config) {
+      return Gerrit.Nav.getPatchSetWeblink(
+          change.project,
+          commitInfo.commit,
+          {
+            weblinks: commitInfo.web_links,
+            config,
+          });
     },
 
     _computeShowWebLink(change, commitInfo, serverConfig) {
-      if (serverConfig.gitweb && serverConfig.gitweb.url &&
-          serverConfig.gitweb.type && serverConfig.gitweb.type.revision) {
-        return true;
-      }
-
-      if (!commitInfo.web_links) {
-        return false;
-      }
-
-      for (const link of commitInfo.web_links) {
-        if (this._isWebLink(link)) {
-          return true;
-        }
-      }
-
-      return false;
+      const weblink = this._getWeblink(change, commitInfo, serverConfig);
+      return !!weblink && !!weblink.url;
     },
 
     _computeWebLink(change, commitInfo, serverConfig) {
-      if (!this._computeShowWebLink(change, commitInfo, serverConfig)) {
-        return;
-      }
-
-      if (serverConfig.gitweb && serverConfig.gitweb.url &&
-          serverConfig.gitweb.type && serverConfig.gitweb.type.revision) {
-        return serverConfig.gitweb.url +
-            serverConfig.gitweb.type.revision
-                .replace('${project}', change.project)
-                .replace('${commit}', commitInfo.commit);
-      }
-
-      let webLink = null;
-      for (const link of commitInfo.web_links) {
-        if (this._isWebLink(link)) {
-          webLink = link.url;
-          break;
-        }
-      }
-
-      if (!webLink) {
-        return;
-      }
-
-      return webLink;
+      const {url} = this._getWeblink(change, commitInfo, serverConfig) || {};
+      return url;
     },
 
     _computeShortHash(commitInfo) {
-      if (!commitInfo || !commitInfo.commit) {
-        return;
-      }
-      return commitInfo.commit.slice(0, 7);
+      const {name} =
+            this._getWeblink(this.change, commitInfo, this.serverConfig) || {};
+      return name;
     },
   });
 })();
diff --git a/polygerrit-ui/app/elements/change/gr-commit-info/gr-commit-info_test.html b/polygerrit-ui/app/elements/change/gr-commit-info/gr-commit-info_test.html
index aadd21b..438a3f3 100644
--- a/polygerrit-ui/app/elements/change/gr-commit-info/gr-commit-info_test.html
+++ b/polygerrit-ui/app/elements/change/gr-commit-info/gr-commit-info_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -21,6 +22,7 @@
 <script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
 <script src="../../../bower_components/web-component-tester/browser.js"></script>
 <link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="../../core/gr-router/gr-router.html">
 <link rel="import" href="gr-commit-info.html">
 
 <script>void(0);</script>
@@ -34,22 +36,43 @@
 <script>
   suite('gr-commit-info tests', () => {
     let element;
+    let sandbox;
 
     setup(() => {
+      sandbox = sinon.sandbox.create();
       element = fixture('basic');
     });
 
+    teardown(() => {
+      sandbox.restore();
+    });
+
+    test('weblinks use Gerrit.Nav interface', () => {
+      const weblinksStub = sandbox.stub(Gerrit.Nav, '_generateWeblinks')
+          .returns([{name: 'stubb', url: '#s'}]);
+      element.change = {};
+      element.commitInfo = {};
+      element.serverConfig = {};
+      assert.isTrue(weblinksStub.called);
+    });
+
     test('no web link when unavailable', () => {
       element.commitInfo = {};
       element.serverConfig = {};
-      element.change = {labels: []};
+      element.change = {labels: [], project: ''};
 
       assert.isNotOk(element._computeShowWebLink(element.change,
           element.commitInfo, element.serverConfig));
     });
 
     test('use web link when available', () => {
-      element.commitInfo = {web_links: [{name: 'gitweb', url: 'link-url'}]};
+      const router = document.createElement('gr-router');
+      sandbox.stub(Gerrit.Nav, '_generateWeblinks',
+          router._generateWeblinks.bind(router));
+
+      element.change = {labels: [], project: ''};
+      element.commitInfo =
+          {commit: 'commitsha', web_links: [{name: 'gitweb', url: 'link-url'}]};
       element.serverConfig = {};
 
       assert.isOk(element._computeShowWebLink(element.change,
@@ -59,7 +82,13 @@
     });
 
     test('does not relativize web links that begin with scheme', () => {
+      const router = document.createElement('gr-router');
+      sandbox.stub(Gerrit.Nav, '_generateWeblinks',
+          router._generateWeblinks.bind(router));
+
+      element.change = {labels: [], project: ''};
       element.commitInfo = {
+        commit: 'commitsha',
         web_links: [{name: 'gitweb', url: 'https://link-url'}],
       };
       element.serverConfig = {};
@@ -70,51 +99,13 @@
           element.serverConfig), 'https://link-url');
     });
 
-    test('use gitweb when available', () => {
-      element.commitInfo = {commit: 'commit-sha'};
-      element.serverConfig = {gitweb: {
-        url: 'url-base/',
-        type: {revision: 'xx ${project} xx ${commit} xx'},
-      }};
-      element.change = {
-        project: 'project-name',
-        labels: [],
-        current_revision: element.commitInfo.commit,
-      };
-
-      assert.isOk(element._computeShowWebLink(element.change,
-          element.commitInfo, element.serverConfig));
-
-      assert.equal(element._computeWebLink(element.change, element.commitInfo,
-          element.serverConfig), 'url-base/xx project-name xx commit-sha xx');
-    });
-
-    test('prefer gitweb when both are available', () => {
-      element.commitInfo = {
-        commit: 'commit-sha',
-        web_links: [{url: 'link-url'}],
-      };
-      element.serverConfig = {gitweb: {
-        url: 'url-base/',
-        type: {revision: 'xx ${project} xx ${commit} xx'},
-      }};
-      element.change = {
-        project: 'project-name',
-        labels: [],
-        current_revision: element.commitInfo.commit,
-      };
-
-      assert.isOk(element._computeShowWebLink(element.change,
-          element.commitInfo, element.serverConfig));
-
-      const link = element._computeWebLink(element.change, element.commitInfo,
-          element.serverConfig);
-
-      assert.equal(link, 'url-base/xx project-name xx commit-sha xx');
-      assert.notEqual(link, '../../link-url');
-    });
 
     test('ignore web links that are neither gitweb nor gitiles', () => {
+      const router = document.createElement('gr-router');
+      sandbox.stub(Gerrit.Nav, '_generateWeblinks',
+          router._generateWeblinks.bind(router));
+
+      element.change = {project: 'project-name'};
       element.commitInfo = {
         commit: 'commit-sha',
         web_links: [
@@ -128,7 +119,6 @@
           },
         ],
       };
-      element.serverConfig = {};
 
       assert.isOk(element._computeShowWebLink(element.change,
           element.commitInfo, element.serverConfig));
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-abandon-dialog/gr-confirm-abandon-dialog.html b/polygerrit-ui/app/elements/change/gr-confirm-abandon-dialog/gr-confirm-abandon-dialog.html
index d3bf159..8803eb3 100644
--- a/polygerrit-ui/app/elements/change/gr-confirm-abandon-dialog/gr-confirm-abandon-dialog.html
+++ b/polygerrit-ui/app/elements/change/gr-confirm-abandon-dialog/gr-confirm-abandon-dialog.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,7 +17,7 @@
 
 <link rel="import" href="../../../bower_components/iron-autogrow-textarea/iron-autogrow-textarea.html">
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
-<link rel="import" href="../../shared/gr-confirm-dialog/gr-confirm-dialog.html">
+<link rel="import" href="../../shared/gr-dialog/gr-dialog.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 
 <dom-module id="gr-confirm-abandon-dialog">
@@ -45,18 +46,18 @@
         width: 73ch; /* Add a char to account for the border. */
 
         --iron-autogrow-textarea {
-          border: 1px solid #cdcdcd;
+          border: 1px solid var(--border-color);
           box-sizing: border-box;
           font-family: var(--monospace-font-family);
         }
       }
     </style>
-    <gr-confirm-dialog
+    <gr-dialog
         confirm-label="Abandon"
         on-confirm="_handleConfirmTap"
         on-cancel="_handleCancelTap">
-      <div class="header">Abandon Change</div>
-      <div class="main">
+      <div class="header" slot="header">Abandon Change</div>
+      <div class="main" slot="main">
         <label for="messageInput">Abandon Message</label>
         <iron-autogrow-textarea
             id="messageInput"
@@ -65,7 +66,7 @@
             placeholder="<Insert reasoning here>"
             bind-value="{{message}}"></iron-autogrow-textarea>
       </div>
-    </gr-confirm-dialog>
+    </gr-dialog>
   </template>
   <script src="gr-confirm-abandon-dialog.js"></script>
 </dom-module>
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-abandon-dialog/gr-confirm-abandon-dialog.js b/polygerrit-ui/app/elements/change/gr-confirm-abandon-dialog/gr-confirm-abandon-dialog.js
index a3500b0..03509ce 100644
--- a/polygerrit-ui/app/elements/change/gr-confirm-abandon-dialog/gr-confirm-abandon-dialog.js
+++ b/polygerrit-ui/app/elements/change/gr-confirm-abandon-dialog/gr-confirm-abandon-dialog.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-abandon-dialog/gr-confirm-abandon-dialog_test.html b/polygerrit-ui/app/elements/change/gr-confirm-abandon-dialog/gr-confirm-abandon-dialog_test.html
new file mode 100644
index 0000000..95d5374
--- /dev/null
+++ b/polygerrit-ui/app/elements/change/gr-confirm-abandon-dialog/gr-confirm-abandon-dialog_test.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+<!--
+@license
+Copyright (C) 2017 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-confirm-abandon-dialog</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-confirm-abandon-dialog.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-confirm-abandon-dialog></gr-confirm-abandon-dialog>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-confirm-abandon-dialog tests', () => {
+    let element;
+    let sandbox;
+
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+      element = fixture('basic');
+    });
+
+    teardown(() => {
+      sandbox.restore();
+    });
+
+    test('_handleConfirmTap', () => {
+      const confirmHandler = sandbox.stub();
+      element.addEventListener('confirm', confirmHandler);
+      sandbox.stub(element, '_confirm');
+      element.$$('gr-dialog').fire('confirm');
+      assert.isTrue(confirmHandler.called);
+      assert.isTrue(element._confirm.called);
+    });
+
+    test('_handleCancelTap', () => {
+      const cancelHandler = sandbox.stub();
+      element.addEventListener('cancel', cancelHandler);
+      sandbox.stub(element, '_handleCancelTap');
+      element.$$('gr-dialog').fire('cancel');
+      assert.isTrue(cancelHandler.called);
+      assert.isTrue(element._handleCancelTap.called);
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-conflict-dialog/gr-confirm-cherrypick-conflict-dialog.html b/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-conflict-dialog/gr-confirm-cherrypick-conflict-dialog.html
new file mode 100644
index 0000000..cd196ec
--- /dev/null
+++ b/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-conflict-dialog/gr-confirm-cherrypick-conflict-dialog.html
@@ -0,0 +1,51 @@
+<!--
+@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="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../../shared/gr-dialog/gr-dialog.html">
+
+<dom-module id="gr-confirm-cherrypick-conflict-dialog">
+  <template>
+    <style include="shared-styles">
+      :host {
+        display: block;
+      }
+      :host([disabled]) {
+        opacity: .5;
+        pointer-events: none;
+      }
+      .main {
+        display: flex;
+        flex-direction: column;
+        width: 100%;
+      }
+    </style>
+    <gr-dialog
+        confirm-label="Continue"
+        on-confirm="_handleConfirmTap"
+        on-cancel="_handleCancelTap">
+      <div class="header" slot="header">Cherry Pick Conflict!</div>
+      <div class="main" slot="main">
+        <span>Cherry Pick failed! (merge conflicts)</span>
+
+        <span>Please select "Continue" to continue with conflicts or select "cancel" to close the dialog.</span>
+      </div>
+    </gr-dialog>
+  </template>
+  <script src="gr-confirm-cherrypick-conflict-dialog.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-conflict-dialog/gr-confirm-cherrypick-conflict-dialog.js b/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-conflict-dialog/gr-confirm-cherrypick-conflict-dialog.js
new file mode 100644
index 0000000..355aa78
--- /dev/null
+++ b/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-conflict-dialog/gr-confirm-cherrypick-conflict-dialog.js
@@ -0,0 +1,45 @@
+/**
+ * @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-confirm-cherrypick-conflict-dialog',
+
+    /**
+     * Fired when the confirm button is pressed.
+     *
+     * @event confirm
+     */
+
+    /**
+     * Fired when the cancel button is pressed.
+     *
+     * @event cancel
+     */
+
+    _handleConfirmTap(e) {
+      e.preventDefault();
+      this.fire('confirm', null, {bubbles: false});
+    },
+
+    _handleCancelTap(e) {
+      e.preventDefault();
+      this.fire('cancel', null, {bubbles: false});
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-conflict-dialog/gr-confirm-cherrypick-conflict-dialog_test.html b/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-conflict-dialog/gr-confirm-cherrypick-conflict-dialog_test.html
new file mode 100644
index 0000000..77b102c
--- /dev/null
+++ b/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-conflict-dialog/gr-confirm-cherrypick-conflict-dialog_test.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<!--
+@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.
+-->
+
+<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+<title>gr-confirm-cherrypick-conflict-dialog</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-confirm-cherrypick-conflict-dialog.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-confirm-cherrypick-conflict-dialog></gr-confirm-cherrypick-conflict-dialog>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-confirm-cherrypick-conflict-dialog tests', () => {
+    let element;
+    let sandbox;
+
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+      element = fixture('basic');
+    });
+
+    teardown(() => { sandbox.restore(); });
+
+    test('_handleConfirmTap', () => {
+      const confirmHandler = sandbox.stub();
+      element.addEventListener('confirm', confirmHandler);
+      sandbox.stub(element, '_handleConfirmTap');
+      element.$$('gr-dialog').fire('confirm');
+      assert.isTrue(confirmHandler.called);
+      assert.isTrue(element._handleConfirmTap.called);
+    });
+
+    test('_handleCancelTap', () => {
+      const cancelHandler = sandbox.stub();
+      element.addEventListener('cancel', cancelHandler);
+      sandbox.stub(element, '_handleCancelTap');
+      element.$$('gr-dialog').fire('cancel');
+      assert.isTrue(cancelHandler.called);
+      assert.isTrue(element._handleCancelTap.called);
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog.html b/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog.html
index 5151280..84558ac 100644
--- a/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog.html
+++ b/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -18,7 +19,7 @@
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 <link rel="import" href="../../shared/gr-autocomplete/gr-autocomplete.html">
-<link rel="import" href="../../shared/gr-confirm-dialog/gr-confirm-dialog.html">
+<link rel="import" href="../../shared/gr-dialog/gr-dialog.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
 
 <dom-module id="gr-confirm-cherrypick-dialog">
@@ -58,12 +59,12 @@
         };
       }
     </style>
-    <gr-confirm-dialog
+    <gr-dialog
         confirm-label="Cherry Pick"
         on-confirm="_handleConfirmTap"
         on-cancel="_handleCancelTap">
-      <div class="header">Cherry Pick Change to Another Branch</div>
-      <div class="main">
+      <div class="header" slot="header">Cherry Pick Change to Another Branch</div>
+      <div class="main" slot="main">
         <label for="branchInput">
           Cherry Pick to branch
         </label>
@@ -73,6 +74,15 @@
             query="[[_query]]"
             placeholder="Destination branch">
         </gr-autocomplete>
+        <label for="baseInput">
+          Provide base commit sha1 for cherry-pick
+        </label>
+        <input
+            is="iron-input"
+            id="baseCommitInput"
+            maxlength="40"
+            placeholder="(optional)"
+            bind-value="{{baseCommit}}">
         <label for="messageInput">
           Cherry Pick Commit Message
         </label>
@@ -84,7 +94,7 @@
             max-rows="15"
             bind-value="{{message}}"></iron-autogrow-textarea>
       </div>
-    </gr-confirm-dialog>
+    </gr-dialog>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
   </template>
   <script src="gr-confirm-cherrypick-dialog.js"></script>
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog.js b/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog.js
index fab728d..214b150 100644
--- a/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog.js
+++ b/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -33,6 +36,7 @@
 
     properties: {
       branch: String,
+      baseCommit: String,
       changeStatus: String,
       commitMessage: String,
       commitNum: String,
@@ -77,7 +81,7 @@
       if (input.startsWith('refs/heads/')) {
         input = input.substring('refs/heads/'.length);
       }
-      return this.$.restAPI.getProjectBranches(
+      return this.$.restAPI.getRepoBranches(
           input, this.project, SUGGESTIONS_LIMIT).then(response => {
             const branches = [];
             let branch;
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog_test.html b/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog_test.html
index 0956f84..5c51fe0 100644
--- a/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog_test.html
+++ b/polygerrit-ui/app/elements/change/gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -39,7 +40,7 @@
     setup(() => {
       sandbox = sinon.sandbox.create();
       stub('gr-rest-api-interface', {
-        getProjectBranches(input) {
+        getRepoBranches(input) {
           if (input.startsWith('test')) {
             return Promise.resolve([
               {
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-move-dialog/gr-confirm-move-dialog.html b/polygerrit-ui/app/elements/change/gr-confirm-move-dialog/gr-confirm-move-dialog.html
index ec6bfb4..621ef0a 100644
--- a/polygerrit-ui/app/elements/change/gr-confirm-move-dialog/gr-confirm-move-dialog.html
+++ b/polygerrit-ui/app/elements/change/gr-confirm-move-dialog/gr-confirm-move-dialog.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -18,7 +19,7 @@
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 <link rel="import" href="../../shared/gr-autocomplete/gr-autocomplete.html">
-<link rel="import" href="../../shared/gr-confirm-dialog/gr-confirm-dialog.html">
+<link rel="import" href="../../shared/gr-dialog/gr-dialog.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
 
 <dom-module id="gr-confirm-move-dialog">
@@ -54,15 +55,15 @@
         width: 100%;
       }
       .warning {
-        color: red;
+        color: var(--error-text-color);
       }
     </style>
-    <gr-confirm-dialog
+    <gr-dialog
         confirm-label="Move Change"
         on-confirm="_handleConfirmTap"
         on-cancel="_handleCancelTap">
-      <div class="header">Move Change to Another Branch</div>
-      <div class="main">
+      <div class="header" slot="header">Move Change to Another Branch</div>
+      <div class="main" slot="main">
         <p class="warning">
           Warning: moving a change will not change its parents.
         </p>
@@ -86,7 +87,7 @@
             max-rows="15"
             bind-value="{{message}}"></iron-autogrow-textarea>
       </div>
-    </gr-confirm-dialog>
+    </gr-dialog>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
   </template>
   <script src="gr-confirm-move-dialog.js"></script>
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-move-dialog/gr-confirm-move-dialog.js b/polygerrit-ui/app/elements/change/gr-confirm-move-dialog/gr-confirm-move-dialog.js
index 6d35dbf..f8d7151 100644
--- a/polygerrit-ui/app/elements/change/gr-confirm-move-dialog/gr-confirm-move-dialog.js
+++ b/polygerrit-ui/app/elements/change/gr-confirm-move-dialog/gr-confirm-move-dialog.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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';
 
@@ -57,7 +60,7 @@
       if (input.startsWith('refs/heads/')) {
         input = input.substring('refs/heads/'.length);
       }
-      return this.$.restAPI.getProjectBranches(
+      return this.$.restAPI.getRepoBranches(
           input, this.project, SUGGESTIONS_LIMIT).then(response => {
             const branches = [];
             let branch;
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-move-dialog/gr-confirm-move-dialog_test.html b/polygerrit-ui/app/elements/change/gr-confirm-move-dialog/gr-confirm-move-dialog_test.html
index caf61ba..e619425 100644
--- a/polygerrit-ui/app/elements/change/gr-confirm-move-dialog/gr-confirm-move-dialog_test.html
+++ b/polygerrit-ui/app/elements/change/gr-confirm-move-dialog/gr-confirm-move-dialog_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -37,7 +38,7 @@
 
     setup(() => {
       stub('gr-rest-api-interface', {
-        getProjectBranches(input) {
+        getRepoBranches(input) {
           if (input.startsWith('test')) {
             return Promise.resolve([
               {
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog.html b/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog.html
index 2772594..912bbfa6a 100644
--- a/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog.html
+++ b/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -15,7 +16,9 @@
 -->
 
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
-<link rel="import" href="../../shared/gr-confirm-dialog/gr-confirm-dialog.html">
+<link rel="import" href="../../shared/gr-autocomplete/gr-autocomplete.html">
+<link rel="import" href="../../shared/gr-dialog/gr-dialog.html">
+<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 
 <dom-module id="gr-confirm-rebase-dialog">
@@ -48,12 +51,13 @@
         margin: .5em 0;
       }
     </style>
-    <gr-confirm-dialog
+    <gr-dialog
+        id="confirmDialog"
         confirm-label="Rebase"
         on-confirm="_handleConfirmTap"
         on-cancel="_handleCancelTap">
-      <div class="header">Confirm rebase</div>
-      <div class="main">
+      <div class="header" slot="header">Confirm rebase</div>
+      <div class="main" slot="main">
         <div id="rebaseOnParent" class="rebaseOption"
             hidden$="[[!_displayParentOption(rebaseOnCurrent, hasParent)]]">
           <input id="rebaseOnParentInput"
@@ -92,21 +96,25 @@
               type="radio"
               on-tap="_handleRebaseOnOther">
           <label id="rebaseOnOtherLabel" for="rebaseOnOtherInput">
-            Rebase on a specific change or ref <span hidden$="[[!hasParent]]">
+            Rebase on a specific change, ref, or commit <span hidden$="[[!hasParent]]">
               (breaks relation chain)
             </span>
           </label>
         </div>
         <div class="parentRevisionContainer">
-          <input is="iron-input"
-              type="text"
+          <gr-autocomplete
               id="parentInput"
-              bind-value="{{base}}"
+              query="[[_query]]"
+              no-debounce
+              text="{{_text}}"
               on-tap="_handleEnterChangeNumberTap"
-              placeholder="Change number">
+              allow-non-suggested-values
+              placeholder="Change number, ref, or commit hash">
+          </gr-autocomplete>
         </div>
       </div>
-    </gr-confirm-dialog>
+    </gr-dialog>
+    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
   </template>
   <script src="gr-confirm-rebase-dialog.js"></script>
 </dom-module>
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog.js b/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog.js
index eb0fa17..29f8b95 100644
--- a/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog.js
+++ b/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -30,20 +33,63 @@
      */
 
     properties: {
-      /**
-       * Weird API usage requires this to be String or Null. Add this so
-       * the closure compiler doesn't complain.
-       * @type {?string} */
-      base: String,
       branch: String,
+      changeNumber: Number,
       hasParent: Boolean,
       rebaseOnCurrent: Boolean,
+      _text: String,
+      _query: {
+        type: Function,
+        value() {
+          return this._getChangeSuggestions.bind(this);
+        },
+      },
+      _recentChanges: Array,
     },
 
     observers: [
       '_updateSelectedOption(rebaseOnCurrent, hasParent)',
     ],
 
+    // This is called by gr-change-actions every time the rebase dialog is
+    // re-opened. Unlike other autocompletes that make a request with each
+    // updated input, this one gets all recent changes once and then filters
+    // them by the input. The query is re-run each time the dialog is opened
+    // in case there are new/updated changes in the generic query since the
+    // last time it was run.
+    fetchRecentChanges() {
+      return this.$.restAPI.getChanges(null, `is:open -age:90d`)
+          .then(response => {
+            const changes = [];
+            for (const key in response) {
+              if (!response.hasOwnProperty(key)) { continue; }
+              changes.push({
+                name: `${response[key]._number}: ${response[key].subject}`,
+                value: response[key]._number,
+              });
+            }
+            this._recentChanges = changes;
+            return this._recentChanges;
+          });
+    },
+
+    _getRecentChanges() {
+      if (this._recentChanges) {
+        return Promise.resolve(this._recentChanges);
+      }
+      return this.fetchRecentChanges();
+    },
+
+    _getChangeSuggestions(input) {
+      return this._getRecentChanges().then(changes =>
+          this._filterChanges(input, changes));
+    },
+
+    _filterChanges(input, changes) {
+      return changes.filter(change => change.name.includes(input) &&
+          change.value !== this.changeNumber);
+    },
+
     _displayParentOption(rebaseOnCurrent, hasParent) {
       return hasParent && rebaseOnCurrent;
     },
@@ -56,20 +102,6 @@
       return !(!rebaseOnCurrent && !hasParent);
     },
 
-    _handleConfirmTap(e) {
-      e.preventDefault();
-      this.fire('confirm', null, {bubbles: false});
-    },
-
-    _handleCancelTap(e) {
-      e.preventDefault();
-      this.fire('cancel', null, {bubbles: false});
-    },
-
-    _handleRebaseOnOther() {
-      this.$.parentInput.focus();
-    },
-
     /**
      * There is a subtle but important difference between setting the base to an
      * empty string and omitting it entirely from the payload. An empty string
@@ -77,12 +109,29 @@
      * rebased on top of the target branch. Leaving out the base implies that it
      * should be rebased on top of its current parent.
      */
-    _handleRebaseOnTip() {
-      this.base = '';
+    _getSelectedBase() {
+      if (this.$.rebaseOnParentInput.checked) { return null; }
+      if (this.$.rebaseOnTipInput.checked) { return ''; }
+      // Change numbers will have their description appended by the
+      // autocomplete.
+      return this._text.split(':')[0];
     },
 
-    _handleRebaseOnParent() {
-      this.base = null;
+    _handleConfirmTap(e) {
+      e.preventDefault();
+      this.dispatchEvent(new CustomEvent('confirm',
+          {detail: {base: this._getSelectedBase()}}));
+      this._text = '';
+    },
+
+    _handleCancelTap(e) {
+      e.preventDefault();
+      this.dispatchEvent(new CustomEvent('cancel'));
+      this._text = '';
+    },
+
+    _handleRebaseOnOther() {
+      this.$.parentInput.focus();
     },
 
     _handleEnterChangeNumberTap() {
@@ -96,13 +145,10 @@
     _updateSelectedOption(rebaseOnCurrent, hasParent) {
       if (this._displayParentOption(rebaseOnCurrent, hasParent)) {
         this.$.rebaseOnParentInput.checked = true;
-        this._handleRebaseOnParent();
       } else if (this._displayTipOption(rebaseOnCurrent, hasParent)) {
         this.$.rebaseOnTipInput.checked = true;
-        this._handleRebaseOnTip();
       } else {
         this.$.rebaseOnOtherInput.checked = true;
-        this._handleRebaseOnOther();
       }
     },
   });
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog_test.html b/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog_test.html
index 0ea7c49..c6e9ec4 100644
--- a/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog_test.html
+++ b/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -34,9 +35,15 @@
 <script>
   suite('gr-confirm-rebase-dialog tests', () => {
     let element;
+    let sandbox;
 
     setup(() => {
       element = fixture('basic');
+      sandbox = sinon.sandbox.create();
+    });
+
+    teardown(() => {
+      sandbox.restore();
     });
 
     test('controls with parent and rebase on current available', () => {
@@ -82,5 +89,102 @@
       assert.isTrue(element.$.rebaseOnTip.hasAttribute('hidden'));
       assert.isFalse(element.$.tipUpToDateMsg.hasAttribute('hidden'));
     });
+
+    test('input cleared on cancel or submit', () => {
+      element._text = '123';
+      element.$.confirmDialog.fire('confirm');
+      assert.equal(element._text, '');
+
+      element._text = '123';
+      element.$.confirmDialog.fire('cancel');
+      assert.equal(element._text, '');
+    });
+
+    test('_getSelectedBase', () => {
+      element._text = '5fab321c';
+      element.$.rebaseOnParentInput.checked = true;
+      assert.equal(element._getSelectedBase(), null);
+      element.$.rebaseOnParentInput.checked = false;
+      element.$.rebaseOnTipInput.checked = true;
+      assert.equal(element._getSelectedBase(), '');
+      element.$.rebaseOnTipInput.checked = false;
+      assert.equal(element._getSelectedBase(), element._text);
+      element._text = '101: Test';
+      assert.equal(element._getSelectedBase(), '101');
+    });
+
+    suite('parent suggestions', () => {
+      let recentChanges;
+      setup(() => {
+        recentChanges = [
+          {
+            name: '123: my first awesome change',
+            value: 123,
+          },
+          {
+            name: '124: my second awesome change',
+            value: 124,
+          },
+          {
+            name: '245: my third awesome change',
+            value: 245,
+          },
+        ];
+
+        sandbox.stub(element.$.restAPI, 'getChanges').returns(Promise.resolve(
+            [
+              {
+                _number: 123,
+                subject: 'my first awesome change',
+              },
+              {
+                _number: 124,
+                subject: 'my second awesome change',
+              },
+              {
+                _number: 245,
+                subject: 'my third awesome change',
+              },
+            ]
+        ));
+      });
+
+      test('_getRecentChanges', () => {
+        sandbox.spy(element, '_getRecentChanges');
+        return element._getRecentChanges().then(() => {
+          assert.deepEqual(element._recentChanges, recentChanges);
+          assert.equal(element.$.restAPI.getChanges.callCount, 1);
+          // When called a second time, should not re-request recent changes.
+          element._getRecentChanges();
+        }).then(() => {
+          assert.equal(element._getRecentChanges.callCount, 2);
+          assert.equal(element.$.restAPI.getChanges.callCount, 1);
+        });
+      });
+
+      test('_filterChanges', () => {
+        assert.equal(element._filterChanges('123', recentChanges).length, 1);
+        assert.equal(element._filterChanges('12', recentChanges).length, 2);
+        assert.equal(element._filterChanges('awesome', recentChanges).length,
+            3);
+        assert.equal(element._filterChanges('third', recentChanges).length,
+            1);
+
+        element.changeNumber = 123;
+        assert.equal(element._filterChanges('123', recentChanges).length, 0);
+        assert.equal(element._filterChanges('124', recentChanges).length, 1);
+        assert.equal(element._filterChanges('awesome', recentChanges).length,
+            2);
+      });
+
+      test('input text change triggers function', () => {
+        sandbox.spy(element, '_getRecentChanges');
+        element.$.parentInput.noDebounce = true;
+        element._text = '1';
+        assert.isTrue(element._getRecentChanges.calledOnce);
+        element._text = '12';
+        assert.isTrue(element._getRecentChanges.calledTwice);
+      });
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-revert-dialog/gr-confirm-revert-dialog.html b/polygerrit-ui/app/elements/change/gr-confirm-revert-dialog/gr-confirm-revert-dialog.html
index 92e8de3..9e5f1de 100644
--- a/polygerrit-ui/app/elements/change/gr-confirm-revert-dialog/gr-confirm-revert-dialog.html
+++ b/polygerrit-ui/app/elements/change/gr-confirm-revert-dialog/gr-confirm-revert-dialog.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,7 +17,7 @@
 
 <link rel="import" href="../../../bower_components/iron-autogrow-textarea/iron-autogrow-textarea.html">
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
-<link rel="import" href="../../shared/gr-confirm-dialog/gr-confirm-dialog.html">
+<link rel="import" href="../../shared/gr-dialog/gr-dialog.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 
 <dom-module id="gr-confirm-revert-dialog">
@@ -40,18 +41,18 @@
         width: 73ch; /* Add a char to account for the border. */
 
         --iron-autogrow-textarea {
-          border: 1px solid #cdcdcd;
+          border: 1px solid var(--border-color);
           box-sizing: border-box;
           font-family: var(--monospace-font-family);
         }
       }
     </style>
-    <gr-confirm-dialog
+    <gr-dialog
         confirm-label="Revert"
         on-confirm="_handleConfirmTap"
         on-cancel="_handleCancelTap">
-      <div class="header">Revert Merged Change</div>
-      <div class="main">
+      <div class="header" slot="header">Revert Merged Change</div>
+      <div class="main" slot="main">
         <label for="messageInput">
           Revert Commit Message
         </label>
@@ -62,7 +63,7 @@
             max-rows="15"
             bind-value="{{message}}"></iron-autogrow-textarea>
       </div>
-    </gr-confirm-dialog>
+    </gr-dialog>
   </template>
   <script src="gr-confirm-revert-dialog.js"></script>
 </dom-module>
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-revert-dialog/gr-confirm-revert-dialog.js b/polygerrit-ui/app/elements/change/gr-confirm-revert-dialog/gr-confirm-revert-dialog.js
index 5b11652..1cae866 100644
--- a/polygerrit-ui/app/elements/change/gr-confirm-revert-dialog/gr-confirm-revert-dialog.js
+++ b/polygerrit-ui/app/elements/change/gr-confirm-revert-dialog/gr-confirm-revert-dialog.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-revert-dialog/gr-confirm-revert-dialog_test.html b/polygerrit-ui/app/elements/change/gr-confirm-revert-dialog/gr-confirm-revert-dialog_test.html
index c1220cb..c5a1bde 100644
--- a/polygerrit-ui/app/elements/change/gr-confirm-revert-dialog/gr-confirm-revert-dialog_test.html
+++ b/polygerrit-ui/app/elements/change/gr-confirm-revert-dialog/gr-confirm-revert-dialog_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-submit-dialog/gr-confirm-submit-dialog.html b/polygerrit-ui/app/elements/change/gr-confirm-submit-dialog/gr-confirm-submit-dialog.html
new file mode 100644
index 0000000..346bdd0
--- /dev/null
+++ b/polygerrit-ui/app/elements/change/gr-confirm-submit-dialog/gr-confirm-submit-dialog.html
@@ -0,0 +1,63 @@
+<!--
+@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="../../../bower_components/polymer/polymer.html">
+
+<link rel="import" href="../../core/gr-navigation/gr-navigation.html">
+<link rel="import" href="../../shared/gr-dialog/gr-dialog.html">
+<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+
+<dom-module id="gr-confirm-submit-dialog">
+  <template>
+    <style include="shared-styles">
+      #dialog {
+        min-width: 40em;
+      }
+      p {
+        margin-bottom: 1em;
+      }
+      @media screen and (max-width: 50em) {
+        #dialog {
+          min-width: inherit;
+          width: 100%;
+        }
+      }
+    </style>
+    <gr-dialog
+        id="dialog"
+        confirm-label="Continue"
+        confirm-on-enter
+        on-cancel="_handleCancelTap"
+        on-confirm="_handleConfirmTap">
+      <div class="header" slot="header">
+        [[action.label]]
+      </div>
+      <div class="main" slot="main">
+        <gr-endpoint-decorator name="confirm-submit-change">
+          <p>
+            Ready to submit &ldquo;<strong>[[change.subject]]</strong>&rdquo;?
+          </p>
+          <gr-endpoint-param name="change" value="[[change]]"></gr-endpoint-param>
+          <gr-endpoint-param name="action" value="[[action]]"></gr-endpoint-param>
+        </gr-endpoint-decorator>
+      </div>
+    </gr-dialog>
+    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
+  </template>
+  <script src="gr-confirm-submit-dialog.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-submit-dialog/gr-confirm-submit-dialog.js b/polygerrit-ui/app/elements/change/gr-confirm-submit-dialog/gr-confirm-submit-dialog.js
new file mode 100644
index 0000000..bda79a1
--- /dev/null
+++ b/polygerrit-ui/app/elements/change/gr-confirm-submit-dialog/gr-confirm-submit-dialog.js
@@ -0,0 +1,65 @@
+/**
+ * @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-confirm-submit-dialog',
+
+    /**
+     * Fired when the confirm button is pressed.
+     *
+     * @event confirm
+     */
+
+    /**
+     * Fired when the cancel button is pressed.
+     *
+     * @event cancel
+     */
+
+    properties: {
+      /**
+       * @type {{
+       *    subject: string,
+       *  }}
+       */
+      change: Object,
+
+      /**
+       * @type {{
+       *    label: string,
+       *  }}
+       */
+      action: Object,
+    },
+
+    resetFocus(e) {
+      this.$.dialog.resetFocus();
+    },
+
+    _handleConfirmTap(e) {
+      e.preventDefault();
+      this.dispatchEvent(new CustomEvent('confirm', {bubbles: false}));
+    },
+
+    _handleCancelTap(e) {
+      e.preventDefault();
+      this.dispatchEvent(new CustomEvent('cancel', {bubbles: false}));
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-submit-dialog/gr-confirm-submit-dialog_test.html b/polygerrit-ui/app/elements/change/gr-confirm-submit-dialog/gr-confirm-submit-dialog_test.html
new file mode 100644
index 0000000..86c15f6
--- /dev/null
+++ b/polygerrit-ui/app/elements/change/gr-confirm-submit-dialog/gr-confirm-submit-dialog_test.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<!--
+@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.
+-->
+
+<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+<title>gr-confirm-submit-dialog</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<script src="../../../bower_components/page/page.js"></script>
+
+<link rel="import" href="gr-confirm-submit-dialog.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-confirm-submit-dialog></gr-confirm-submit-dialog>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-file-list-header tests', () => {
+    let element;
+    let sandbox;
+
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+      element = fixture('basic');
+    });
+
+    teardown(() => {
+      sandbox.restore();
+    });
+
+    test('display', () => {
+      element.action = {label: 'my-label'};
+      element.change = {subject: 'my-subject'};
+      flushAsynchronousOperations();
+      const header = element.$$('.header');
+      assert.equal(header.textContent.trim(), 'my-label');
+
+      const message = element.$$('.main p');
+      assert.notEqual(message.textContent.length, 0);
+      assert.notEqual(message.textContent.indexOf('my-subject'), -1);
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog.html b/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog.html
index fdd9b26..28d25d2 100644
--- a/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog.html
+++ b/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -18,29 +19,41 @@
 
 <link rel="import" href="../../../behaviors/gr-patch-set-behavior/gr-patch-set-behavior.html">
 <link rel="import" href="../../../behaviors/rest-client-behavior/rest-client-behavior.html">
-<link rel="import" href="../../shared/gr-download-commands/gr-download-commands.html">
 <link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../../shared/gr-download-commands/gr-download-commands.html">
 
 <dom-module id="gr-download-dialog">
   <template>
     <style include="shared-styles">
       :host {
+        background-color: var(--dialog-background-color);
         display: block;
-        padding: 1em;
       }
-      header {
+      section {
         display: flex;
+        padding: .5em 1.5em;
       }
-      footer {
+      section:not(:first-of-type) {
+        border-top: 1px solid var(--border-color);
+      }
+      .flexContainer {
         display: flex;
         justify-content: space-between;
         padding-top: .75em;
       }
+      .footer {
+        justify-content: flex-end;
+      }
       .closeButtonContainer {
+        align-items: flex-end;
         display: flex;
         flex: 0;
         justify-content: flex-end;
       }
+      .patchFiles,
+      .archivesContainer {
+        padding-bottom: .5em;
+      }
       .patchFiles {
         margin-right: 2em;
       }
@@ -54,27 +67,27 @@
         margin-right: 0;
       }
       .title {
-        text-align: center;
         flex: 1;
+        font-weight: var(--font-weight-bold);
+      }
+      .hidden {
+        display: none;
       }
     </style>
-    <header>
+    <section>
       <span class="title">
         Patch set [[patchNum]] of [[_computePatchSetQuantity(change.revisions)]]
       </span>
-      <span class="closeButtonContainer">
-        <gr-button id="closeButton"
-            link
-            on-tap="_handleCloseTap">Close</gr-button>
-      </span>
-    </header>
-     <gr-download-commands
+    </section>
+    <section class$="[[_computeShowDownloadCommands(_schemes)]]">
+      <gr-download-commands
           id="downloadCommands"
           commands="[[_computeDownloadCommands(change, patchNum, _selectedScheme)]]"
           schemes="[[_schemes]]"
           selected-scheme="{{_selectedScheme}}"></gr-download-commands>
-    <footer>
-      <div class="patchFiles">
+    </section>
+    <section class="flexContainer">
+      <div class="patchFiles" hidden="[[_computeHidePatchFile(change, patchNum)]]" hidden>
         <label>Patch file</label>
         <div>
           <a
@@ -102,7 +115,14 @@
           </template>
         </div>
       </div>
-    </footer>
+    </section>
+    <section class="footer">
+      <span class="closeButtonContainer">
+        <gr-button id="closeButton"
+            link
+            on-tap="_handleCloseTap">Close</gr-button>
+      </span>
+    </section>
   </template>
   <script src="gr-download-dialog.js"></script>
 </dom-module>
diff --git a/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog.js b/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog.js
index 41242f2..4fe6d8f 100644
--- a/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog.js
+++ b/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -112,8 +115,8 @@
      * @return {string} Not sure why there was a mismatch
      */
     _computeDownloadLink(change, patchNum, opt_zip) {
-      return this.changeBaseURL(change._number, patchNum) + '/patch?' +
-          (opt_zip ? 'zip' : 'download');
+      return this.changeBaseURL(change.project, change._number, patchNum) +
+          '/patch?' + (opt_zip ? 'zip' : 'download');
     },
 
 
@@ -135,8 +138,19 @@
       return shortRev + '.diff.' + (opt_zip ? 'zip' : 'base64');
     },
 
+    _computeHidePatchFile(change, patchNum) {
+      for (const rev of Object.values(change.revisions || {})) {
+        if (this.patchNumEquals(rev._number, patchNum)) {
+          const parentLength = rev.commit && rev.commit.parents ?
+                rev.commit.parents.length : 0;
+          return parentLength == 0;
+        }
+      }
+      return false;
+    },
+
     _computeArchiveDownloadLink(change, patchNum, format) {
-      return this.changeBaseURL(change._number, patchNum) +
+      return this.changeBaseURL(change.project, change._number, patchNum) +
           '/archive?format=' + format;
     },
 
@@ -169,5 +183,9 @@
         this._selectedScheme = schemes.sort()[0];
       }
     },
+
+    _computeShowDownloadCommands(schemes) {
+      return schemes.length ? '' : 'hidden';
+    },
   });
 })();
diff --git a/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog_test.html b/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog_test.html
index f6e1748..ee284b9 100644
--- a/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog_test.html
+++ b/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -44,6 +45,9 @@
       revisions: {
         '34685798fe548b6d17d1e8e5edc43a26d055cc72': {
           _number: 1,
+          commit: {
+            parents: [],
+          },
           fetch: {
             repo: {
               commands: {
@@ -104,6 +108,9 @@
       revisions: {
         '34685798fe548b6d17d1e8e5edc43a26d055cc72': {
           _number: 1,
+          commit: {
+            parents: [],
+          },
           fetch: {},
         },
       },
@@ -171,8 +178,8 @@
 
       test('computed fields', () => {
         assert.equal(element._computeArchiveDownloadLink(
-            {_number: 123}, 2, 'tgz'),
-            '/changes/123/revisions/2/archive?format=tgz');
+            {project: 'test/project', _number: 123}, 2, 'tgz'),
+            '/changes/test%2Fproject~123/revisions/2/archive?format=tgz');
       });
 
       test('close event', done => {
@@ -182,5 +189,30 @@
         MockInteractions.tap(element.$$('.closeButtonContainer gr-button'));
       });
     });
+
+    test('_computeShowDownloadCommands', () => {
+      assert.equal(element._computeShowDownloadCommands([]), 'hidden');
+      assert.equal(element._computeShowDownloadCommands(['test']), '');
+    });
+
+    test('_computeHidePatchFile', () => {
+      const patchNum = '1';
+
+      const change1 = {
+        revisions: {
+          r1: {_number: 1, commit: {parents: []}},
+        },
+      };
+      assert.isTrue(element._computeHidePatchFile(change1, patchNum));
+
+      const change2 = {
+        revisions: {
+          r1: {_number: 1, commit: {parents: [
+            {commit: 'p1'},
+          ]}},
+        },
+      };
+      assert.isFalse(element._computeHidePatchFile(change2, patchNum));
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/change/gr-file-list-constants.html b/polygerrit-ui/app/elements/change/gr-file-list-constants.html
new file mode 100644
index 0000000..8bdcf7a
--- /dev/null
+++ b/polygerrit-ui/app/elements/change/gr-file-list-constants.html
@@ -0,0 +1,31 @@
+<!--
+@license
+Copyright (C) 2017 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.
+-->
+<script>
+  (function(window) {
+    'use strict';
+
+    const GrFileListConstants = window.GrFileListConstants || {};
+
+    GrFileListConstants.FilesExpandedState = {
+      ALL: 'all',
+      NONE: 'none',
+      SOME: 'some',
+    };
+
+    window.GrFileListConstants = GrFileListConstants;
+  })(window);
+</script>
diff --git a/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header.html b/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header.html
index fb86260..22c476c 100644
--- a/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header.html
+++ b/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -18,12 +19,16 @@
 <link rel="import" href="../../../behaviors/gr-patch-set-behavior/gr-patch-set-behavior.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 <link rel="import" href="../../core/gr-navigation/gr-navigation.html">
+<link rel="import" href="../../diff/gr-diff-mode-selector/gr-diff-mode-selector.html">
 <link rel="import" href="../../diff/gr-patch-range-select/gr-patch-range-select.html">
+<link rel="import" href="../../edit/gr-edit-controls/gr-edit-controls.html">
 <link rel="import" href="../../shared/gr-editable-label/gr-editable-label.html">
+<link rel="import" href="../../shared/gr-linked-chip/gr-linked-chip.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
 <link rel="import" href="../../shared/gr-select/gr-select.html">
 <link rel="import" href="../../shared/gr-button/gr-button.html">
-
+<link rel="import" href="../../shared/gr-icons/gr-icons.html">
+<link rel="import" href="../gr-file-list-constants.html">
 
 <dom-module id="gr-file-list-header">
   <template>
@@ -34,31 +39,26 @@
       .collapseToggleButton {
         text-decoration: none;
       }
-      .patchInfoEdit.patchInfo-header {
-        background-color: #fcfad6;
-      }
       .patchInfoOldPatchSet.patchInfo-header {
-        background-color: #fff9c4;
+        background-color: var(--emphasis-color);
       }
       .patchInfo-header {
-        background-color: #fafafa;
-        border-bottom: 1px solid #ddd;
-        border-top: 1px solid #ddd;
-        display: flex;
-        min-height: 3.2em;
-        padding: .5em var(--default-horizontal-margin);
-      }
-      .patchInfo-header-wrapper {
         align-items: center;
+        background-color: var(--table-header-background-color);
+        border-top: 1px solid var(--border-color);
         display: flex;
-        width: 100%;
+        padding: 6px var(--default-horizontal-margin);
       }
       .patchInfo-left {
+        align-items: baseline;
+        display: flex;
+      }
+      .patchInfoContent {
         align-items: center;
         display: flex;
         flex-wrap: wrap;
       }
-      .patchInfo-header-wrapper .container.latestPatchContainer {
+      .patchInfo-header .container.latestPatchContainer {
         display: none;
       }
       .patchInfoOldPatchSet .container.latestPatchContainer {
@@ -73,66 +73,77 @@
       .mobile {
         display: none;
       }
-      #diffPrefsContainer,
+      .patchInfo-header .container {
+        align-items: center;
+        display: flex;
+      }
+      .downloadContainer,
+      .uploadContainer,
+      .includedInContainer {
+        margin-right: 16px;
+      }
+      .includedInContainer.hide,
+      .uploadContainer.hide {
+        display: none;
+      }
       .rightControls {
         align-self: flex-end;
         margin: auto 0 auto auto;
-      }
-      .showOnEdit {
-        display: none;
-      }
-      .editLoaded .hideOnEdit {
-        display: none;
-      }
-      .editLoaded .showOnEdit {
-        display: initial;
-      }
-      .patchInfo-header-wrapper .container {
-        align-items: center;
-        display: flex;
-      }
-      #modeSelect {
-        margin-left: .1em;
-      }
-      .fileList-header {
-        align-items: center;
-        display: flex;
-        font-weight: bold;
-        height: 2.25em;
-        margin: 0 calc(var(--default-horizontal-margin) / 2);
-        padding: 0 .25em;
-      }
-      .rightControls {
         align-items: center;
         display: flex;
         flex-wrap: wrap;
         font-weight: normal;
         justify-content: flex-end;
       }
-      .separator {
-        background-color: rgba(0, 0, 0, .3);
-        height: 1.5em;
-        margin: 0 .6em;
-        width: 1px;
-      }
-      .separator.transparent {
-        background-color: transparent;
-      }
-      .expandInline {
-        padding-right: .25em;
-      }
-      .editLoaded .hideOnEdit {
+      #collapseBtn,
+      .expanded #expandBtn,
+      .fileViewActions{
         display: none;
       }
-      .editLoaded .showOnEdit {
+      .expanded #expandBtn {
+        display: none;
+      }
+      gr-linked-chip {
+        --linked-chip-text-color: var(--primary-text-color);
+      }
+      .expanded #collapseBtn,
+      .openFile .fileViewActions {
+        align-items: center;
+        display: flex;
+      }
+      .rightControls gr-button,
+      gr-patch-range-select {
+        margin: 0 -4px;
+      }
+      .fileViewActions gr-button {
+        margin: 0;
+        --gr-button: {
+          padding: 2px 4px;
+        }
+      }
+      .editMode .hideOnEdit {
+        display: none;
+      }
+      .showOnEdit {
+        display: none;
+      }
+      .editMode .showOnEdit {
         display: initial;
       }
-      .label {
-        font-family: var(--font-family-bold);
-        margin-right: 1em;
+      .editMode .showOnEdit.flexContainer {
+        align-items: center;
+        display: flex;
       }
-      .container.includedInContainer.hide {
-        display: none;
+      .label {
+        font-weight: var(--font-weight-bold);
+        margin-right: 24px;
+      }
+      gr-commit-info,
+      gr-edit-controls {
+        margin-right: -5px;
+      }
+      .fileViewActionsLabel {
+        margin-right: .2rem;
       }
       @media screen and (max-width: 50em) {
         .patchInfo-header .desktop {
@@ -140,18 +151,19 @@
         }
       }
     </style>
-    <div class$="patchInfo-header [[_computeEditLoadedClass(editLoaded)]] [[_computePatchInfoClass(patchNum, allPatchSets)]]">
-      <div class="patchInfo-header-wrapper">
-        <div class="patchInfo-left">
-          <h3 class="label">Files</h3>
+    <div class$="patchInfo-header [[_computeEditModeClass(editMode)]] [[_computePatchInfoClass(patchNum, allPatchSets)]]">
+      <div class="patchInfo-left">
+        <h3 class="label">Files</h3>
+        <div class="patchInfoContent">
           <gr-patch-range-select
               id="rangeSelect"
-              comments="[[comments]]"
+              change-comments="[[changeComments]]"
               change-num="[[changeNum]]"
               patch-num="[[patchNum]]"
               base-patch-num="[[basePatchNum]]"
               available-patches="[[allPatchSets]]"
               revisions="[[change.revisions]]"
+              revision-info="[[revisionInfo]]"
               on-patch-range-change="_handlePatchChange">
           </gr-patch-range-select>
           <span class="separator"></span>
@@ -163,53 +175,66 @@
             <span class="separator"></span>
             <a href$="[[changeUrl]]">Go to latest patch set</a>
           </span>
-          <span class="container downloadContainer desktop">
+          <span class="container descriptionContainer hideOnEdit">
             <span class="separator"></span>
-            <gr-button link
-                class="download"
-                on-tap="_handleDownloadTap">Download</gr-button>
+            <template
+                is="dom-if"
+                if="[[_patchsetDescription]]">
+              <gr-linked-chip
+                  id="descriptionChip"
+                  text="[[_patchsetDescription]]"
+                  removable="[[!_descriptionReadOnly]]"
+                  on-remove="_handleDescriptionRemoved"></gr-linked-chip>
+            </template>
+            <template
+                is="dom-if"
+                if="[[!_patchsetDescription]]">
+              <gr-editable-label
+                  id="descriptionLabel"
+                  uppercase
+                  class="descriptionLabel"
+                  label-text="Add patchset description"
+                  value="[[_patchsetDescription]]"
+                  placeholder="[[_computeDescriptionPlaceholder(_descriptionReadOnly)]]"
+                  read-only="[[_descriptionReadOnly]]"
+                  on-changed="_handleDescriptionChanged"></gr-editable-label>
+            </template>
           </span>
-        <span class$="container includedInContainer [[_hideIncludedIn(change)]] desktop">
+        </div>
+      </div>
+      <div class$="rightControls [[_computeExpandedClass(filesExpanded)]]">
+        <span class="showOnEdit flexContainer">
+          <gr-edit-controls
+              id="editControls"
+              patch-num="[[patchNum]]"
+              change="[[change]]"></gr-edit-controls>
           <span class="separator"></span>
+        </span>
+        <span class$="[[_computeUploadHelpContainerClass(change, account)]]">
+          <gr-button link
+              class="upload"
+              on-tap="_handleUploadTap">Update Change</gr-button>
+        </span>
+        <span class="downloadContainer desktop">
+          <gr-button link
+              class="download"
+              on-tap="_handleDownloadTap">Download</gr-button>
+        </span>
+        <span class$="includedInContainer [[_hideIncludedIn(change)]] desktop">
           <gr-button link
               class="includedIn"
               on-tap="_handleIncludedInTap">Included In</gr-button>
         </span>
-          <span class="container descriptionContainer hideOnEdit">
-            <span class="separator"></span>
-            <gr-editable-label
-                id="descriptionLabel"
-                class="descriptionLabel"
-                label-text="Add patchset description"
-                value="[[_computePatchSetDescription(change, patchNum)]]"
-                placeholder="[[_computeDescriptionPlaceholder(_descriptionReadOnly)]]"
-                read-only="[[_descriptionReadOnly]]"
-                on-changed="_handleDescriptionChanged"></gr-editable-label>
-          </span>
-        </div>
-        <span id="diffPrefsContainer"
-            class="hideOnEdit"
-            hidden$="[[_computePrefsButtonHidden(diffPrefs, loggedIn)]]"
-            hidden>
-          <gr-button link
-              class="prefsButton desktop"
-              on-tap="_handlePrefsTap">Diff Preferences</gr-button>
-        </span>
-      </div>
-    </div>
-    <div class="fileList-header">
-      <div class="rightControls">
         <template is="dom-if"
             if="[[_fileListActionsVisible(shownFileCount, _maxFilesForBulkActions)]]">
           <gr-button
               id="expandBtn"
               link
-              on-tap="_expandAllDiffs">Show diffs</gr-button>
-          <span class="separator"></span>
+              on-tap="_expandAllDiffs">Expand All</gr-button>
           <gr-button
               id="collapseBtn"
               link
-              on-tap="_collapseAllDiffs">Hide diffs</gr-button>
+              on-tap="_collapseAllDiffs">Collapse All</gr-button>
         </template>
         <template is="dom-if"
             if="[[!_fileListActionsVisible(shownFileCount, _maxFilesForBulkActions)]]">
@@ -217,15 +242,25 @@
             Bulk actions disabled because there are too many files.
           </div>
         </template>
-        <span class="separator"></span>
-        <gr-select
-            id="modeSelect"
-            bind-value="{{diffViewMode}}">
-          <select>
-            <option value="SIDE_BY_SIDE">Side By Side</option>
-            <option value="UNIFIED_DIFF">Unified</option>
-          </select>
-        </gr-select>
+        <div class="fileViewActions">
+          <span class="separator"></span>
+          <span class="fileViewActionsLabel">Diff view:</span>
+          <gr-diff-mode-selector
+              id="modeSelect"
+              mode="{{diffViewMode}}"
+              save-on-change="[[loggedIn]]"></gr-diff-mode-selector>
+          <span id="diffPrefsContainer"
+              class="hideOnEdit"
+              hidden$="[[_computePrefsButtonHidden(diffPrefs, loggedIn)]]"
+              hidden>
+            <gr-button
+                link
+                has-tooltip
+                title="Diff preferences"
+                class="prefsButton desktop"
+                on-tap="_handlePrefsTap"><iron-icon icon="gr-icons:settings"></iron-icon></gr-button>
+          </span>
+        </div>
       </div>
     </div>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
diff --git a/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header.js b/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header.js
index c55e8c4..c6e369c 100644
--- a/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header.js
+++ b/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header.js
@@ -1,25 +1,53 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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';
 
   // Maximum length for patch set descriptions.
   const PATCH_DESC_MAX_LENGTH = 500;
+  const MERGED_STATUS = 'MERGED';
 
   Polymer({
     is: 'gr-file-list-header',
 
+    /**
+     * @event expand-diffs
+     */
+
+    /**
+     * @event collapse-diffs
+     */
+
+    /**
+     * @event open-diff-prefs
+     */
+
+    /**
+     * @event open-included-in-dialog
+     */
+
+    /**
+     * @event open-download-dialog
+     */
+
+    /**
+     * @event open-upload-help-dialog
+     */
+
     properties: {
       account: Object,
       allPatchSets: Array,
@@ -27,9 +55,9 @@
       change: Object,
       changeNum: String,
       changeUrl: String,
-      comments: Object,
+      changeComments: Object,
       commitInfo: Object,
-      editLoaded: Boolean,
+      editMode: Boolean,
       loggedIn: Boolean,
       serverConfig: Object,
       shownFileCount: Number,
@@ -40,7 +68,7 @@
       },
       patchNum: String,
       basePatchNum: String,
-      revisions: Array,
+      filesExpanded: String,
       // Caps the number of files that can be shown and have the 'show diffs' /
       // 'hide diffs' buttons still be functional.
       _maxFilesForBulkActions: {
@@ -48,24 +76,51 @@
         readOnly: true,
         value: 225,
       },
+      _patchsetDescription: {
+        type: String,
+        value: '',
+      },
       _descriptionReadOnly: {
         type: Boolean,
         computed: '_computeDescriptionReadOnly(loggedIn, change, account)',
       },
+      revisionInfo: Object,
     },
 
     behaviors: [
       Gerrit.PatchSetBehavior,
     ],
 
+    observers: [
+      '_computePatchSetDescription(change, patchNum)',
+    ],
+
+    setDiffViewMode(mode) {
+      this.$.modeSelect.setMode(mode);
+    },
+
     _expandAllDiffs() {
+      this._expanded = true;
       this.fire('expand-diffs');
     },
 
     _collapseAllDiffs() {
+      this._expanded = false;
       this.fire('collapse-diffs');
     },
 
+    _computeExpandedClass(filesExpanded) {
+      const classes = [];
+      if (filesExpanded === GrFileListConstants.FilesExpandedState.ALL) {
+        classes.push('expanded');
+      }
+      if (filesExpanded === GrFileListConstants.FilesExpandedState.SOME ||
+            filesExpanded === GrFileListConstants.FilesExpandedState.ALL) {
+        classes.push('openFile');
+      }
+      return classes.join(' ');
+    },
+
     _computeDescriptionPlaceholder(readOnly) {
       return (readOnly ? 'No' : 'Add') + ' patchset description';
     },
@@ -76,10 +131,14 @@
 
     _computePatchSetDescription(change, patchNum) {
       const rev = this.getRevisionByPatchNum(change.revisions, patchNum);
-      return (rev && rev.description) ?
+      this._patchsetDescription = (rev && rev.description) ?
           rev.description.substring(0, PATCH_DESC_MAX_LENGTH) : '';
     },
 
+    _handleDescriptionRemoved(e) {
+      return this._updateDescription('', e);
+    },
+
     /**
      * @param {!Object} revisions The revisions object keyed by revision hashes
      * @param {?Object} patchSet A revision already fetched from {revisions}
@@ -96,23 +155,34 @@
 
     _handleDescriptionChanged(e) {
       const desc = e.detail.trim();
+      this._updateDescription(desc, e);
+    },
+
+    /**
+     * Update the patchset description with the rest API.
+     * @param {string} desc
+     * @param {?(Event|Node)} e
+     * @return {!Promise}
+     */
+    _updateDescription(desc, e) {
+      const target = Polymer.dom(e).rootTarget;
+      if (target) { target.disabled = true; }
       const rev = this.getRevisionByPatchNum(this.change.revisions,
           this.patchNum);
       const sha = this._getPatchsetHash(this.change.revisions, rev);
-      this.$.restAPI.setDescription(this.changeNum,
-          this.patchNum, desc)
+      return this.$.restAPI.setDescription(this.changeNum, this.patchNum, desc)
           .then(res => {
             if (res.ok) {
+              if (target) { target.disabled = false; }
               this.set(['change', 'revisions', sha, 'description'], desc);
+              this._patchsetDescription = desc;
             }
+          }).catch(err => {
+            if (target) { target.disabled = false; }
+            return;
           });
     },
 
-    _computeBasePatchDisabled(patchNum, currentPatchNum) {
-      return this.findSortedIndex(patchNum, this.revisions) >=
-          this.findSortedIndex(currentPatchNum, this.revisions);
-    },
-
     _computePrefsButtonHidden(prefs, loggedIn) {
       return !loggedIn || !prefs;
     },
@@ -122,20 +192,6 @@
       return shownFileCount <= maxFilesForBulkActions;
     },
 
-    /**
-     * Determines if a patch number should be disabled based on value of the
-     * basePatchNum from gr-file-list.
-     * @param {number} patchNum Patch number available in dropdown
-     * @param {number|string} basePatchNum Base patch number from file list
-     * @return {boolean}
-     */
-    _computePatchSetDisabled(patchNum, basePatchNum) {
-      if (basePatchNum === 'PARENT') { return false; }
-
-      return this.findSortedIndex(patchNum, this.revisions) <=
-          this.findSortedIndex(basePatchNum, this.revisions);
-    },
-
     _handlePatchChange(e) {
       const {basePatchNum, patchNum} = e.detail;
       if (this.patchNumEquals(basePatchNum, this.basePatchNum) &&
@@ -155,18 +211,15 @@
 
     _handleDownloadTap(e) {
       e.preventDefault();
-      this.fire('open-download-dialog');
+      this.dispatchEvent(
+          new CustomEvent('open-download-dialog', {bubbles: false}));
     },
 
-    _computeEditLoadedClass(editLoaded) {
-      return editLoaded ? 'editLoaded' : '';
+    _computeEditModeClass(editMode) {
+      return editMode ? 'editMode' : '';
     },
 
     _computePatchInfoClass(patchNum, allPatchSets) {
-      if (this.patchNumEquals(patchNum, this.EDIT_NAME)) {
-        return 'patchInfoEdit';
-      }
-
       const latestNum = this.computeLatestPatchNum(allPatchSets);
       if (this.patchNumEquals(patchNum, latestNum)) {
         return '';
@@ -175,7 +228,23 @@
     },
 
     _hideIncludedIn(change) {
-      return change && change.status === 'MERGED' ? '' : 'hide';
+      return change && change.status === MERGED_STATUS ? '' : 'hide';
+    },
+
+    _handleUploadTap(e) {
+      e.preventDefault();
+      this.dispatchEvent(
+          new CustomEvent('open-upload-help-dialog', {bubbles: false}));
+    },
+
+    _computeUploadHelpContainerClass(change, account) {
+      const changeIsMerged = change && change.status === MERGED_STATUS;
+      const ownerId = change && change.owner && change.owner._account_id ?
+          change.owner._account_id : null;
+      const userId = account && account._account_id;
+      const userIsOwner = ownerId && userId && ownerId === userId;
+      const hideContainer = !userIsOwner || changeIsMerged;
+      return 'uploadContainer desktop' + (hideContainer ? ' hide' : '');
     },
   });
 })();
diff --git a/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header_test.html b/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header_test.html
index 45a23fa..e2685e1 100644
--- a/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header_test.html
+++ b/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -96,35 +97,9 @@
           'Add patchset description');
     });
 
-    test('_computePatchSetDisabled', () => {
-      element.revisions = [
-        {_number: 1},
-        {_number: 2},
-        {_number: element.EDIT_NAME, basePatchNum: 2},
-        {_number: 3},
-      ];
-      let basePatchNum = 'PARENT';
-      let patchNum = 1;
-      assert.equal(element._computePatchSetDisabled(patchNum, basePatchNum),
-          false);
-      basePatchNum = 1;
-      assert.equal(element._computePatchSetDisabled(patchNum, basePatchNum),
-          true);
-      patchNum = 2;
-      assert.equal(element._computePatchSetDisabled(patchNum, basePatchNum),
-          false);
-      basePatchNum = element.EDIT_NAME;
-      assert.equal(element._computePatchSetDisabled(patchNum, basePatchNum),
-          true);
-      patchNum = '3';
-      assert.equal(element._computePatchSetDisabled(patchNum, basePatchNum),
-          false);
-    });
-
-    test('_handleDescriptionChanged', () => {
+    test('description editing', () => {
       const putDescStub = sandbox.stub(element.$.restAPI, 'setDescription')
           .returns(Promise.resolve({ok: true}));
-      sandbox.stub(element, '_computeDescriptionReadOnly');
 
       element.changeNum = '42';
       element.basePatchNum = 'PARENT';
@@ -145,15 +120,46 @@
       element.loggedIn = true;
 
       flushAsynchronousOperations();
-      const label = element.$.descriptionLabel;
-      assert.equal(label.value, 'test');
-      label.editing = true;
-      label._inputText = 'test2';
-      label._save();
-      flushAsynchronousOperations();
-      assert.isTrue(putDescStub.called);
-      assert.equal(putDescStub.args[0][2], 'test2');
-      assert.equal(element.change.revisions.rev1.description, 'test');
+
+      // The element has a description, so the account chip should be visible
+      // and the description label should not exist.
+      const chip = Polymer.dom(element.root).querySelector('#descriptionChip');
+      let label = Polymer.dom(element.root).querySelector('#descriptionLabel');
+
+      assert.equal(chip.text, 'test');
+      assert.isNotOk(label);
+
+      // Simulate tapping the remove button, but call function directly so that
+      // can determine what happens after the promise is resolved.
+      return element._handleDescriptionRemoved().then(() => {
+        // The API stub should be called with an empty string for the new
+        // description.
+        assert.equal(putDescStub.lastCall.args[2], '');
+        assert.equal(element.change.revisions.rev1.description, '');
+
+        flushAsynchronousOperations();
+        // The editable label should now be visible and the chip hidden.
+        label = Polymer.dom(element.root).querySelector('#descriptionLabel');
+        assert.isOk(label);
+        assert.equal(getComputedStyle(chip).display, 'none');
+        assert.notEqual(getComputedStyle(label).display, 'none');
+        assert.isFalse(label.readOnly);
+        // Edit the label to have a new value of test2, and save.
+        label.editing = true;
+        label._inputText = 'test2';
+        label._save();
+        flushAsynchronousOperations();
+        // The API stub should be called with an `test2` for the new
+        // description.
+        assert.equal(putDescStub.callCount, 2);
+        assert.equal(putDescStub.lastCall.args[2], 'test2');
+      }).then(() => {
+        flushAsynchronousOperations();
+        // The chip should be visible again, and the label hidden.
+        assert.equal(element.change.revisions.rev1.description, 'test2');
+        assert.equal(getComputedStyle(label).display, 'none');
+        assert.notEqual(getComputedStyle(chip).display, 'none');
+      });
     });
 
     test('expandAllDiffs called when expand button clicked', () => {
@@ -191,15 +197,39 @@
       });
     });
 
-    test('diff mode selector is set correctly', () => {
-      const select = element.$.modeSelect;
-      element.diffViewMode = 'SIDE_BY_SIDE';
+    test('fileViewActions are properly hidden', () => {
+      const actions = element.$$('.fileViewActions');
+      assert.equal(getComputedStyle(actions).display, 'none');
+      element.filesExpanded = GrFileListConstants.FilesExpandedState.SOME;
       flushAsynchronousOperations();
-      assert.equal(select.nativeSelect.value, 'SIDE_BY_SIDE');
+      assert.notEqual(getComputedStyle(actions).display, 'none');
+      element.filesExpanded = GrFileListConstants.FilesExpandedState.ALL;
+      flushAsynchronousOperations();
+      assert.notEqual(getComputedStyle(actions).display, 'none');
+      element.filesExpanded = GrFileListConstants.FilesExpandedState.NONE;
+      flushAsynchronousOperations();
+      assert.equal(getComputedStyle(actions).display, 'none');
+    });
 
-      element.diffViewMode = 'UNIFIED_DIFF';
+    test('expand/collapse buttons are toggled correctly', () => {
+      element.shownFileCount = 10;
       flushAsynchronousOperations();
-      assert.equal(select.nativeSelect.value, 'UNIFIED_DIFF');
+      const expandBtn = element.$$('#expandBtn');
+      const collapseBtn = element.$$('#collapseBtn');
+      assert.notEqual(getComputedStyle(expandBtn).display, 'none');
+      assert.equal(getComputedStyle(collapseBtn).display, 'none');
+      element.filesExpanded = GrFileListConstants.FilesExpandedState.SOME;
+      flushAsynchronousOperations();
+      assert.notEqual(getComputedStyle(expandBtn).display, 'none');
+      assert.equal(getComputedStyle(collapseBtn).display, 'none');
+      element.filesExpanded = GrFileListConstants.FilesExpandedState.ALL;
+      flushAsynchronousOperations();
+      assert.equal(getComputedStyle(expandBtn).display, 'none');
+      assert.notEqual(getComputedStyle(collapseBtn).display, 'none');
+      element.filesExpanded = GrFileListConstants.FilesExpandedState.NONE;
+      flushAsynchronousOperations();
+      assert.notEqual(getComputedStyle(expandBtn).display, 'none');
+      assert.equal(getComputedStyle(collapseBtn).display, 'none');
     });
 
     test('navigateToChange called when range select changes', () => {
@@ -225,7 +255,7 @@
     });
 
     test('class is applied to file list on old patch set', () => {
-      const allPatchSets = [{num: 1}, {num: 2}, {num: 4}];
+      const allPatchSets = [{num: 4}, {num: 2}, {num: 1}];
       assert.equal(element._computePatchInfoClass('1', allPatchSets),
           'patchInfoOldPatchSet');
       assert.equal(element._computePatchInfoClass('2', allPatchSets),
@@ -233,7 +263,7 @@
       assert.equal(element._computePatchInfoClass('4', allPatchSets), '');
     });
 
-    suite('editLoaded behavior', () => {
+    suite('editMode behavior', () => {
       setup(() => {
         element.loggedIn = true;
         element.diffPrefs = {};
@@ -245,19 +275,40 @@
       };
 
       test('patch specific elements', () => {
-        element.editLoaded = true;
+        element.editMode = true;
         sandbox.stub(element, 'computeLatestPatchNum').returns('2');
         flushAsynchronousOperations();
 
         assert.isFalse(isVisible(element.$.diffPrefsContainer));
         assert.isFalse(isVisible(element.$$('.descriptionContainer')));
 
-        element.editLoaded = false;
+        element.editMode = false;
         flushAsynchronousOperations();
 
         assert.isTrue(isVisible(element.$$('.descriptionContainer')));
         assert.isTrue(isVisible(element.$.diffPrefsContainer));
       });
+
+      test('edit-controls visibility', () => {
+        element.editMode = true;
+        flushAsynchronousOperations();
+        assert.isTrue(isVisible(element.$.editControls.parentElement));
+
+        element.editMode = false;
+        flushAsynchronousOperations();
+        assert.isFalse(isVisible(element.$.editControls.parentElement));
+      });
+
+      test('_computeUploadHelpContainerClass', () => {
+        // Only show the upload helper button when an unmerged change is viewed
+        // by its owner.
+        const accountA = {_account_id: 1};
+        const accountB = {_account_id: 2};
+        assert.notInclude(element._computeUploadHelpContainerClass(
+            {owner: accountA}, accountA), 'hide');
+        assert.include(element._computeUploadHelpContainerClass(
+            {owner: accountA}, accountB), 'hide');
+      });
     });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html
index 7e71f48..84de48f 100644
--- a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html
+++ b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,20 +17,25 @@
 
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
 <link rel="import" href="../../../behaviors/async-foreach-behavior/async-foreach-behavior.html">
+<link rel="import" href="../../../behaviors/dom-util-behavior/dom-util-behavior.html">
 <link rel="import" href="../../../behaviors/keyboard-shortcut-behavior/keyboard-shortcut-behavior.html">
 <link rel="import" href="../../../behaviors/gr-patch-set-behavior/gr-patch-set-behavior.html">
+<link rel="import" href="../../../styles/shared-styles.html">
 <link rel="import" href="../../core/gr-navigation/gr-navigation.html">
 <link rel="import" href="../../core/gr-reporting/gr-reporting.html">
-<link rel="import" href="../../diff/gr-comment-api/gr-comment-api.html">
-<link rel="import" href="../../diff/gr-diff/gr-diff.html">
 <link rel="import" href="../../diff/gr-diff-cursor/gr-diff-cursor.html">
+<link rel="import" href="../../diff/gr-diff-host/gr-diff-host.html">
+<link rel="import" href="../../diff/gr-diff-preferences-dialog/gr-diff-preferences-dialog.html">
+<link rel="import" href="../../edit/gr-edit-file-controls/gr-edit-file-controls.html">
 <link rel="import" href="../../shared/gr-button/gr-button.html">
 <link rel="import" href="../../shared/gr-cursor-manager/gr-cursor-manager.html">
+<link rel="import" href="../../shared/gr-icons/gr-icons.html">
 <link rel="import" href="../../shared/gr-linked-text/gr-linked-text.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
 <link rel="import" href="../../shared/gr-select/gr-select.html">
+<link rel="import" href="../../shared/gr-count-string-formatter/gr-count-string-formatter.html">
 <link rel="import" href="../../shared/gr-tooltip-content/gr-tooltip-content.html">
-<link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../gr-file-list-constants.html">
 
 <dom-module id="gr-file-list">
   <template>
@@ -39,15 +45,34 @@
       }
       .row {
         align-items: center;
-        border-top: 1px solid #ddd;
+        border-top: 1px solid var(--border-color);
         display: flex;
         min-height: 2.25em;
-        padding: .2em var(--default-horizontal-margin);
+        padding: .2em var(--default-horizontal-margin) .2em calc(var(--default-horizontal-margin) - .35rem);
       }
       :host(.loading) .row {
         opacity: .5;
       };
-      :host(.editLoaded) .hideOnEdit {
+      :host(.editMode) .hideOnEdit {
+        display: none;
+      }
+      .showOnEdit {
+        display: none;
+      }
+      :host(.editMode) .showOnEdit {
+        display: initial;
+      }
+      .invisible {
+        visibility: hidden;
+      }
+      .controlRow {
+        align-items: center;
+        display: flex;
+        height: 2.25em;
+        justify-content: center;
+      }
+      .controlRow.invisible,
+      .show-hide.invisible {
         display: none;
       }
       .reviewed,
@@ -58,19 +83,34 @@
       .reviewed,
       .status {
         display: inline-block;
-        text-align: center;
+        text-align: left;
         width: 1.5em;
       }
-      .file-row:hover {
-        background-color: #f5fafd;
+      .file-row {
+        cursor: pointer;
       }
-      .row.selected {
-        background-color: #ebf5fb;
+      .file-row.expanded {
+        border-bottom: 1px solid var(--border-color);
+        position: -webkit-sticky;
+        position: sticky;
+        top: 0;
+        /* Has to visible above the diff view, and by default has a lower
+         z-index. setting to 1 places it directly above. */
+        z-index: 1;
+      }
+      .file-row:hover {
+        background-color: var(--hover-background-color);
+      }
+      .file-row.selected {
+        background-color: var(--selection-background-color);
+      }
+      .file-row.expanded,
+      .file-row.expanded:hover {
+        background-color: var(--expanded-background-color);
       }
       .path {
         cursor: pointer;
         flex: 1;
-        padding-left: .35em;
         text-decoration: none;
         white-space: nowrap;
       }
@@ -83,7 +123,7 @@
         text-overflow: ellipsis;
       }
       .oldPath {
-        color: #999;
+        color: var(--deemphasized-text-color);
       }
       .comments,
       .stats {
@@ -95,25 +135,35 @@
       .stats {
         min-width: 7em;
       }
-      .invisible {
-        visibility: hidden;
-      }
       .row:not(.header) .stats,
       .total-stats {
         font-family: var(--monospace-font-family);
       }
+      .sizeBars {
+        margin-left: .5em;
+      }
+      .sizeBars.hide {
+        display: none;
+      }
+      .added,
+      .removed {
+        display: inline-block;
+        min-width: 3.5em;
+      }
       .added {
-        color: #388E3C;
+        color: var(--vote-text-color-recommended);
       }
       .removed {
-        color: #D32F2F;
+        color: var(--vote-text-color-disliked);
+        text-align: left;
       }
       .drafts {
         color: #C62828;
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
       }
       .show-hide {
-        width: 1em;
+        margin-left: .35em;
+        width: 1.9em;
       }
       .fileListButton {
         margin: .5em;
@@ -123,22 +173,18 @@
         text-align: right;
       }
       .warning {
-        color: #666;
+        color: var(--deemphasized-text-color);
       }
       input.show-hide {
         display: none;
       }
       label.show-hide {
-        color: var(--color-link);
         cursor: pointer;
         display: block;
-        font-size: .8em;
         min-width: 2em;
       }
       gr-diff {
-        box-shadow: 0 1px 3px rgba(0, 0, 0, .3);
         display: block;
-        margin: .25em 0 1em;
         overflow-x: auto;
       }
       .truncatedFileName {
@@ -156,7 +202,7 @@
         width: 15em;
       }
       .reviewed label {
-        color: #2A66D9;
+        color: var(--link-color);
         opacity: 0;
         justify-content: flex-end;
         width: 100%;
@@ -165,15 +211,19 @@
         cursor: pointer;
         opacity: 100;
       }
+      .row:focus {
+        outline: none;
+      }
       .row:hover .reviewed label,
-      .row:focus .reviewed label {
+      .row:focus .reviewed label,
+      .row.expanded .reviewed label {
         opacity: 100;
       }
       .reviewed input {
         display: none;
       }
       .reviewedLabel {
-        color: rgba(0, 0, 0, .54);
+        color: var(--deemphasized-text-color);
         margin-right: 1em;
         opacity: 0;
       }
@@ -181,6 +231,15 @@
         display: initial;
         opacity: 100;
       }
+      .editFileControls {
+        width: 7em;
+      }
+      .markReviewed,
+      .pathLink {
+        display: inline-block;
+        margin: -.2em 0;
+        padding: .4em 0;
+      }
       @media screen and (max-width: 50em) {
         .desktop {
           display: none;
@@ -189,7 +248,7 @@
           display: block;
         }
         .row.selected {
-          background-color: transparent;
+          background-color: var(--view-background-color);
         }
         .stats {
           display: none;
@@ -198,6 +257,9 @@
         .status {
           justify-content: flex-start;
         }
+        .reviewed {
+          display: none;
+        }
         .comments {
           min-width: initial;
         }
@@ -220,100 +282,131 @@
           as="file"
           initial-count="[[fileListIncrement]]"
           target-framerate="1">
-        <div class="file-row row" data-path$="[[file.__path]]" tabindex="-1">
-          <div class="show-hide" hidden$="[[_userPrefs.expand_inline_diffs]]">
-            <label class="show-hide" data-path$="[[file.__path]]"
-                data-expand=true>
-              <input type="checkbox" class="show-hide"
-                  checked$="[[_isFileExpanded(file.__path, _expandedFilePaths.*)]]"
-                  data-path$="[[file.__path]]" data-expand=true>
-              [[_computeShowHideText(file.__path, _expandedFilePaths.*)]]
-            </label>
-          </div>
-          <div class$="[[_computeClass('status', file.__path)]]"
-              tabindex="0"
-              aria-label$="[[_computeFileStatusLabel(file.status)]]">
-            [[_computeFileStatus(file.status)]]
-          </div>
-          <span
-              data-url="[[_computeDiffURL(change, patchRange.patchNum, patchRange.basePatchNum, file.__path)]]"
-              class$="[[_computePathClass(file.__path, _expandedFilePaths.*)]]">
-            <a href$="[[_computeDiffURL(change, patchRange.patchNum, patchRange.basePatchNum, file.__path)]]">
-              <span title$="[[computeDisplayPath(file.__path)]]"
-                  class="fullFileName">
-                [[computeDisplayPath(file.__path)]]
-              </span>
-              <span title$="[[computeDisplayPath(file.__path)]]"
-                  class="truncatedFileName">
-                [[computeTruncatedPath(file.__path)]]
-              </span>
-            </a>
-            <div class="oldPath" hidden$="[[!file.old_path]]" hidden
-                title$="[[file.old_path]]">
-              [[file.old_path]]
+        [[_reportRenderedRow(index)]]
+        <div class="stickyArea">
+          <div class$="file-row row [[_computePathClass(file.__path, _expandedFilePaths.*)]]"
+              data-path$="[[file.__path]]" tabindex="-1">
+              <div class$="[[_computeClass('status', file.__path)]]"
+                  tabindex="0"
+                  title$="[[_computeFileStatusLabel(file.status)]]"
+                  aria-label$="[[_computeFileStatusLabel(file.status)]]">
+              [[_computeFileStatus(file.status)]]
             </div>
-          </span>
-          <div class="comments desktop">
-            <span class="drafts">
-              [[_computeDraftsString(drafts, patchRange.patchNum, file.__path)]]
+            <span
+                data-url="[[_computeDiffURL(change, patchRange.patchNum, patchRange.basePatchNum, file.__path, editMode)]]"
+                class="path">
+              <a class="pathLink" href$="[[_computeDiffURL(change, patchRange.patchNum, patchRange.basePatchNum, file.__path, editMode)]]">
+                <span title$="[[computeDisplayPath(file.__path)]]"
+                    class="fullFileName">
+                  [[computeDisplayPath(file.__path)]]
+                </span>
+                <span title$="[[computeDisplayPath(file.__path)]]"
+                    class="truncatedFileName">
+                  [[computeTruncatedPath(file.__path)]]
+                </span>
+              </a>
+              <div class="oldPath" hidden$="[[!file.old_path]]" hidden
+                  title$="[[file.old_path]]">
+                [[file.old_path]]
+              </div>
             </span>
-            [[_computeCommentsString(comments, patchRange.patchNum, file.__path)]]
-            [[_computeUnresolvedString(comments, drafts, patchRange.patchNum, file.__path)]]
-          </div>
-          <div class="comments mobile">
-            <span class="drafts">
-              [[_computeDraftsStringMobile(drafts, patchRange.patchNum,
+            <div class="comments desktop">
+              <span class="drafts">
+                [[_computeDraftsString(changeComments, patchRange, file.__path)]]
+              </span>
+              [[_computeCommentsString(changeComments, patchRange, file.__path)]]
+            </div>
+            <div class="comments mobile">
+              <span class="drafts">
+                [[_computeDraftsStringMobile(changeComments, patchRange,
+                    file.__path)]]
+              </span>
+              [[_computeCommentsStringMobile(changeComments, patchRange,
                   file.__path)]]
-            </span>
-            [[_computeCommentsStringMobile(comments, patchRange.patchNum,
-                file.__path)]]
+            </div>
+            <div class$="[[_computeSizeBarsClass(_showSizeBars, file.__path)]]">
+              <svg width="61" height="8">
+                <rect
+                    x$="[[_computeBarAdditionX(file, _sizeBarLayout)]]"
+                    y="0"
+                    height="8"
+                    fill="#388E3C"
+                    width$="[[_computeBarAdditionWidth(file, _sizeBarLayout)]]" />
+                <rect
+                    x$="[[_computeBarDeletionX(_sizeBarLayout)]]"
+                    y="0"
+                    height="8"
+                    fill="#D32F2F"
+                    width$="[[_computeBarDeletionWidth(file, _sizeBarLayout)]]" />
+              </svg>
+            </div>
+            <div class$="[[_computeClass('stats', file.__path)]]">
+              <span
+                  class="added"
+                  tabindex="0"
+                  aria-label$="[[file.lines_inserted]] lines added"
+                  hidden$=[[file.binary]]>
+                +[[file.lines_inserted]]
+              </span>
+              <span
+                  class="removed"
+                  tabindex="0"
+                  aria-label$="[[file.lines_deleted]] lines removed"
+                  hidden$=[[file.binary]]>
+                -[[file.lines_deleted]]
+              </span>
+              <span class$="[[_computeBinaryClass(file.size_delta)]]"
+                  hidden$=[[!file.binary]]>
+                [[_formatBytes(file.size_delta)]]
+                [[_formatPercentage(file.size, file.size_delta)]]
+              </span>
+            </div>
+            <div class="reviewed hideOnEdit" hidden$="[[!_loggedIn]]" hidden>
+              <span class$="reviewedLabel [[_computeReviewedClass(file.isReviewed)]]">Reviewed</span>
+              <label>
+                <input class="reviewed" type="checkbox" checked="[[file.isReviewed]]">
+                <span class="markReviewed" title$="[[_reviewedTitle(file.isReviewed)]]">[[_computeReviewedText(file.isReviewed)]]</span>
+              </label>
+            </div>
+            <div class="editFileControls showOnEdit">
+              <template is="dom-if" if="[[editMode]]">
+                <gr-edit-file-controls
+                    class$="[[_computeClass('', file.__path)]]"
+                    file-path="[[file.__path]]"></gr-edit-file-controls>
+              </template>
+            </div>
+            <div class="show-hide">
+              <label class="show-hide" data-path$="[[file.__path]]"
+                  data-expand=true>
+                <input type="checkbox" class="show-hide"
+                    checked$="[[_isFileExpanded(file.__path, _expandedFilePaths.*)]]"
+                    data-path$="[[file.__path]]" data-expand=true>
+                  <iron-icon
+                      id="icon"
+                      icon="[[_computeShowHideIcon(file.__path, _expandedFilePaths.*)]]">
+                  </iron-icon>
+              </label>
+            </div>
           </div>
-          <div class$="[[_computeClass('stats', file.__path)]]">
-            <span
-                class="added"
-                tabindex="0"
-                aria-label$="[[file.lines_inserted]] lines added"
-                hidden$=[[file.binary]]>
-              +[[file.lines_inserted]]
-            </span>
-            <span
-                class="removed"
-                tabindex="0"
-                aria-label$="[[file.lines_deleted]] lines removed"
-                hidden$=[[file.binary]]>
-              -[[file.lines_deleted]]
-            </span>
-            <span class$="[[_computeBinaryClass(file.size_delta)]]"
-                hidden$=[[!file.binary]]>
-              [[_formatBytes(file.size_delta)]]
-              [[_formatPercentage(file.size, file.size_delta)]]
-            </span>
-          </div>
-          <div class="reviewed hideOnEdit" hidden$="[[!_loggedIn]]" hidden>
-            <span class$="reviewedLabel [[_computeReviewedClass(file.isReviewed)]]">Reviewed</span>
-            <label>
-              <input class="reviewed" type="checkbox" checked="[[file.isReviewed]]">
-              <span class="markReviewed" title="Mark as reviewed (shortcut: r)">[[_computeReviewedText(file.isReviewed)]]</span>
-            </label>
-          </div>
+          <template is="dom-if"
+              if="[[_isFileExpanded(file.__path, _expandedFilePaths.*)]]">
+            <gr-diff-host
+                no-auto-render
+                show-load-failure
+                display-line="[[_displayLine]]"
+                inline-index=[[index]]
+                hidden="[[!_isFileExpanded(file.__path, _expandedFilePaths.*)]]"
+                change-num="[[changeNum]]"
+                patch-range="[[patchRange]]"
+                path="[[file.__path]]"
+                prefs="[[diffPrefs]]"
+                project-name="[[change.project]]"
+                project-config="[[projectConfig]]"
+                on-line-selected="_onLineSelected"
+                no-render-on-prefs-change
+                view-mode="[[diffViewMode]]"></gr-diff-host>
+          </template>
         </div>
-        <template is="dom-if"
-            if="[[_isFileExpanded(file.__path, _expandedFilePaths.*)]]">
-          <gr-diff
-              no-auto-render
-              display-line="[[_displayLine]]"
-              inline-index=[[index]]
-              hidden="[[!_isFileExpanded(file.__path, _expandedFilePaths.*)]]"
-              change-num="[[changeNum]]"
-              patch-range="[[patchRange]]"
-              path="[[file.__path]]"
-              prefs="[[diffPrefs]]"
-              project-name="[[change.project]]"
-              project-config="[[projectConfig]]"
-              on-line-selected="_onLineSelected"
-              no-render-on-prefs-change
-              view-mode="[[diffViewMode]]"></gr-diff>
-        </template>
       </template>
     </div>
     <div
@@ -335,6 +428,8 @@
       </div>
       <!-- Empty div here exists to keep spacing in sync with file rows. -->
       <div class="reviewed hideOnEdit" hidden$="[[!_loggedIn]]" hidden></div>
+      <div class="editFileControls showOnEdit"></div>
+      <div class="show-hide"></div>
     </div>
     <div
         class="row totalChanges"
@@ -352,29 +447,30 @@
         </span>
       </div>
     </div>
-    <gr-button
-        class="fileListButton"
-        id="incrementButton"
-        hidden$="[[_computeFileListButtonHidden(numFilesShown, _files)]]"
-        link on-tap="_incrementNumFilesShown">
-      [[_computeIncrementText(numFilesShown, _files)]]
-    </gr-button>
-    <gr-tooltip-content
-        has-tooltip="[[_computeWarnShowAll(_files)]]"
-        show-icon="[[_computeWarnShowAll(_files)]]"
-        title$="[[_computeShowAllWarning(_files)]]">
+    <div class$="row controlRow [[_computeFileListControlClass(numFilesShown, _files)]]">
       <gr-button
           class="fileListButton"
-          id="showAllButton"
-          hidden$="[[_computeFileListButtonHidden(numFilesShown, _files)]]"
-          link on-tap="_showAllFiles">
-        [[_computeShowAllText(_files)]]
-      </gr-button><!--
- --></gr-tooltip-content>
-    <gr-diff-preferences
-        id="diffPreferences"
-        prefs="{{diffPrefs}}"
-        local-prefs="{{_localPrefs}}"></gr-diff-preferences>
+          id="incrementButton"
+          link on-tap="_incrementNumFilesShown">
+        [[_computeIncrementText(numFilesShown, _files)]]
+      </gr-button>
+      <gr-tooltip-content
+          has-tooltip="[[_computeWarnShowAll(_files)]]"
+          show-icon="[[_computeWarnShowAll(_files)]]"
+          title$="[[_computeShowAllWarning(_files)]]">
+        <gr-button
+            class="fileListButton"
+            id="showAllButton"
+            link on-tap="_showAllFiles">
+          [[_computeShowAllText(_files)]]
+        </gr-button><!--
+  --></gr-tooltip-content>
+    </div>
+    <gr-diff-preferences-dialog
+        id="diffPreferencesDialog"
+        diff-prefs="{{diffPrefs}}"
+        on-reload-diff-preference="_handleReloadingDiffPreference">
+    </gr-diff-preferences-dialog>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
     <gr-storage id="storage"></gr-storage>
     <gr-diff-cursor id="diffCursor"></gr-diff-cursor>
@@ -384,7 +480,6 @@
         focus-on-move
         cursor-target-class="selected"></gr-cursor-manager>
     <gr-reporting id="reporting"></gr-reporting>
-    <gr-comment-api id="commentAPI"></gr-comment-api>
   </template>
   <script src="gr-file-list.js"></script>
 </dom-module>
diff --git a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.js b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.js
index bdb437e..fba7b1b 100644
--- a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.js
+++ b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.js
@@ -1,45 +1,83 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
-  const ERR_EDIT_LOADED = 'You cannot change the review status of an edit.';
-
   // Maximum length for patch set descriptions.
   const PATCH_DESC_MAX_LENGTH = 500;
   const WARN_SHOW_ALL_THRESHOLD = 1000;
   const LOADING_DEBOUNCE_INTERVAL = 100;
 
+  const SIZE_BAR_MAX_WIDTH = 61;
+  const SIZE_BAR_GAP_WIDTH = 1;
+  const SIZE_BAR_MIN_WIDTH = 1.5;
+
+  const RENDER_TIMING_LABEL = 'FileListRenderTime';
+  const RENDER_AVG_TIMING_LABEL = 'FileListRenderTimePerFile';
+  const EXPAND_ALL_TIMING_LABEL = 'ExpandAllDiffs';
+  const EXPAND_ALL_AVG_TIMING_LABEL = 'ExpandAllPerDiff';
+
   const FileStatus = {
     A: 'Added',
     C: 'Copied',
     D: 'Deleted',
+    M: 'Modified',
     R: 'Renamed',
     W: 'Rewritten',
+    U: 'Unchanged',
   };
 
+  const Defs = {};
+
+  /**
+   * Object containing layout values to be used in rendering size-bars.
+   * `max{Inserted,Deleted}` represent the largest values of the
+   * `lines_inserted` and `lines_deleted` fields of the files respectively. The
+   * `max{Addition,Deletion}Width` represent the width of the graphic allocated
+   * to the insertion or deletion side respectively. Finally, the
+   * `deletionOffset` value represents the x-position for the deletion bar.
+   *
+   * @typedef {{
+   *    maxInserted: number,
+   *    maxDeleted: number,
+   *    maxAdditionWidth: number,
+   *    maxDeletionWidth: number,
+   *    deletionOffset: number,
+   * }}
+   */
+  Defs.LayoutStats;
+
   Polymer({
     is: 'gr-file-list',
 
+    /**
+     * Fired when a draft refresh should get triggered
+     *
+     * @event reload-drafts
+     */
+
     properties: {
       /** @type {?} */
       patchRange: Object,
       patchNum: String,
       changeNum: String,
-      comments: Object,
+      /** @type {?} */
+      changeComments: Object,
       drafts: Object,
-      // Already sorted by the change-view.
       revisions: Array,
       projectConfig: Object,
       selectedIndex: {
@@ -57,10 +95,16 @@
         notify: true,
         observer: '_updateDiffPreferences',
       },
-      editLoaded: {
+      editMode: {
         type: Boolean,
-        observer: '_editLoadedChanged',
+        observer: '_editModeChanged',
       },
+      filesExpanded: {
+        type: String,
+        value: GrFileListConstants.FilesExpandedState.NONE,
+        notify: true,
+      },
+      _filesByPath: Object,
       _files: {
         type: Array,
         observer: '_filesChanged',
@@ -81,7 +125,6 @@
       },
       /** @type {?} */
       _userPrefs: Object,
-      _localPrefs: Object,
       _showInlineDiffs: Boolean,
       numFilesShown: {
         type: Number,
@@ -101,10 +144,18 @@
         type: Boolean,
         computed: '_shouldHideBinaryChangeTotals(_patchChange)',
       },
+
       _shownFiles: {
         type: Array,
         computed: '_computeFilesShown(numFilesShown, _files.*)',
       },
+
+      /**
+       * The amount of files added to the shown files list the last time it was
+       * updated. This is used for reporting the average render time.
+       */
+      _reportinShownFilesIncrement: Number,
+
       _expandedFilePaths: {
         type: Array,
         value() { return []; },
@@ -114,11 +165,25 @@
         type: Boolean,
         observer: '_loadingChanged',
       },
-      _sortedRevisions: Array,
+      /** @type {Defs.LayoutStats|undefined} */
+      _sizeBarLayout: {
+        type: Object,
+        computed: '_computeSizeBarLayout(_shownFiles.*)',
+      },
+
+      _showSizeBars: {
+        type: Boolean,
+        value: true,
+        computed: '_computeShowSizeBars(_userPrefs)',
+      },
+
+      /** @type {Function} */
+      _cancelForEachDiff: Function,
     },
 
     behaviors: [
       Gerrit.AsyncForeachBehavior,
+      Gerrit.DomUtilBehavior,
       Gerrit.KeyboardShortcutBehavior,
       Gerrit.PatchSetBehavior,
       Gerrit.PathListBehavior,
@@ -126,31 +191,46 @@
 
     observers: [
       '_expandedPathsChanged(_expandedFilePaths.splices)',
-      '_setReviewedFiles(_shownFiles, _files, _reviewed.*, _loggedIn)',
+      '_computeFiles(_filesByPath, changeComments, patchRange, _reviewed, ' +
+          '_loading)',
     ],
 
     keyBindings: {
-      'shift+left': '_handleShiftLeftKey',
-      'shift+right': '_handleShiftRightKey',
-      'i': '_handleIKey',
-      'shift+i': '_handleCapitalIKey',
-      'down j': '_handleDownKey',
-      'up k': '_handleUpKey',
-      'c': '_handleCKey',
-      '[': '_handleLeftBracketKey',
-      ']': '_handleRightBracketKey',
-      'o': '_handleOKey',
-      'n': '_handleNKey',
-      'p': '_handlePKey',
-      'r': '_handleRKey',
-      'shift+a': '_handleCapitalAKey',
-      'esc': '_handleEscKey',
+      esc: '_handleEscKey',
     },
 
+    keyboardShortcuts() {
+      return {
+        [this.Shortcut.LEFT_PANE]: '_handleLeftPane',
+        [this.Shortcut.RIGHT_PANE]: '_handleRightPane',
+        [this.Shortcut.TOGGLE_INLINE_DIFF]: '_handleToggleInlineDiff',
+        [this.Shortcut.TOGGLE_ALL_INLINE_DIFFS]: '_handleToggleAllInlineDiffs',
+        [this.Shortcut.CURSOR_NEXT_FILE]: '_handleCursorNext',
+        [this.Shortcut.CURSOR_PREV_FILE]: '_handleCursorPrev',
+        [this.Shortcut.NEXT_LINE]: '_handleCursorNext',
+        [this.Shortcut.PREV_LINE]: '_handleCursorPrev',
+        [this.Shortcut.NEW_COMMENT]: '_handleNewComment',
+        [this.Shortcut.OPEN_LAST_FILE]: '_handleOpenLastFile',
+        [this.Shortcut.OPEN_FIRST_FILE]: '_handleOpenFirstFile',
+        [this.Shortcut.OPEN_FILE]: '_handleOpenFile',
+        [this.Shortcut.NEXT_CHUNK]: '_handleNextChunk',
+        [this.Shortcut.PREV_CHUNK]: '_handlePrevChunk',
+        [this.Shortcut.TOGGLE_FILE_REVIEWED]: '_handleToggleFileReviewed',
+        [this.Shortcut.TOGGLE_LEFT_PANE]: '_handleToggleLeftPane',
+
+        // Final two are actually handled by gr-diff-comment-thread.
+        [this.Shortcut.EXPAND_ALL_COMMENT_THREADS]: null,
+        [this.Shortcut.COLLAPSE_ALL_COMMENT_THREADS]: null,
+      };
+    },
     listeners: {
       keydown: '_scopedKeydownHandler',
     },
 
+    detached() {
+      this._cancelDiffs();
+    },
+
     /**
      * Iron-a11y-keys-behavior catches keyboard events globally. Some keyboard
      * events must be scoped to a component level (e.g. `enter`) in order to not
@@ -161,7 +241,7 @@
     _scopedKeydownHandler(e) {
       if (e.keyCode === 13) {
         // Enter.
-        this._handleOKey(e);
+        this._handleOpenFile(e);
       }
     },
 
@@ -175,8 +255,8 @@
       this.collapseAllDiffs();
       const promises = [];
 
-      promises.push(this._getFiles().then(files => {
-        this._files = files;
+      promises.push(this._getFiles().then(filesByPath => {
+        this._filesByPath = filesByPath;
       }));
       promises.push(this._getLoggedIn().then(loggedIn => {
         return this._loggedIn = loggedIn;
@@ -188,10 +268,6 @@
         });
       }));
 
-      // Load all comments for the change.
-      promises.push(this.$.commentAPI.loadAll(this.changeNum));
-
-      this._localPrefs = this.$.storage.getPreferences();
       promises.push(this._getDiffPreferences().then(prefs => {
         this.diffPrefs = prefs;
       }));
@@ -202,15 +278,24 @@
 
       return Promise.all(promises).then(() => {
         this._loading = false;
+        this._detectChromiteButler();
+        this.$.reporting.fileListDisplayed();
       });
     },
 
+    _detectChromiteButler() {
+      const hasButler = !!document.getElementById('butler-suggested-owners');
+      if (hasButler) {
+        this.$.reporting.reportExtension('butler');
+      }
+    },
+
     get diffs() {
-      return Polymer.dom(this.root).querySelectorAll('gr-diff');
+      return Polymer.dom(this.root).querySelectorAll('gr-diff-host');
     },
 
     openDiffPrefs() {
-      this.$.diffPreferences.open();
+      this.$.diffPreferencesDialog.open();
     },
 
     _calculatePatchChange(files) {
@@ -264,14 +349,9 @@
     _updateDiffPreferences() {
       if (!this.diffs.length) { return; }
       // Re-render all expanded diffs sequentially.
-      const timerName = 'Update ' + this._expandedFilePaths.length +
-          ' diffs with new prefs';
+      this.$.reporting.time(EXPAND_ALL_TIMING_LABEL);
       this._renderInOrder(this._expandedFilePaths, this.diffs,
-          this._expandedFilePaths.length)
-          .then(() => {
-            this.$.reporting.timeEnd(timerName);
-            this.$.diffCursor.handleDiffUpdate();
-          });
+          this._expandedFilePaths.length);
     },
 
     _forEachDiff(fn) {
@@ -301,112 +381,98 @@
     collapseAllDiffs() {
       this._showInlineDiffs = false;
       this._expandedFilePaths = [];
+      this.filesExpanded = this._computeExpandedFiles(
+          this._expandedFilePaths.length, this._files.length);
       this.$.diffCursor.handleDiffUpdate();
     },
 
-    _computeCommentsString(comments, patchNum, path) {
-      return this._computeCountString(comments, patchNum, path, 'comment');
-    },
-
-    _computeDraftsString(drafts, patchNum, path) {
-      return this._computeCountString(drafts, patchNum, path, 'draft');
-    },
-
-    _computeDraftsStringMobile(drafts, patchNum, path) {
-      const draftCount = this._computeCountString(drafts, patchNum, path);
-      return draftCount ? draftCount + 'd' : '';
-    },
-
-    _computeCommentsStringMobile(comments, patchNum, path) {
-      const commentCount = this._computeCountString(comments, patchNum, path);
-      return commentCount ? commentCount + 'c' : '';
-    },
-
-    getCommentsForPath(comments, patchNum, path) {
-      return (comments[path] || []).filter(c => {
-        return this.patchNumEquals(c.patch_set, patchNum);
-      });
-    },
-
     /**
-     * @param {!Array} comments
-     * @param {number} patchNum
-     * @param {string} path
-     * @param {string=} opt_noun
-     */
-    _computeCountString(comments, patchNum, path, opt_noun) {
-      if (!comments) { return ''; }
-
-      const patchComments = this.getCommentsForPath(comments, patchNum, path);
-      const num = patchComments.length;
-      if (num === 0) { return ''; }
-      if (!opt_noun) { return num; }
-      const output = num + ' ' + opt_noun + (num > 1 ? 's' : '');
-      return output;
-    },
-
-    /**
-     * Computes a string counting the number of unresolved comment threads in a
-     * given file and path.
+     * Computes a string with the number of comments and unresolved comments.
      *
-     * @param {!Object} comments
-     * @param {!Object} drafts
-     * @param {number} patchNum
+     * @param {!Object} changeComments
+     * @param {!Object} patchRange
      * @param {string} path
      * @return {string}
      */
-    _computeUnresolvedString(comments, drafts, patchNum, path) {
-      const unresolvedNum = this.computeUnresolvedNum(
-          comments, drafts, patchNum, path);
-      return unresolvedNum === 0 ? '' : '(' + unresolvedNum + ' unresolved)';
+    _computeCommentsString(changeComments, patchRange, path) {
+      const unresolvedCount =
+          changeComments.computeUnresolvedNum(patchRange.basePatchNum, path) +
+          changeComments.computeUnresolvedNum(patchRange.patchNum, path);
+      const commentCount =
+          changeComments.computeCommentCount(patchRange.basePatchNum, path) +
+          changeComments.computeCommentCount(patchRange.patchNum, path);
+      const commentString = GrCountStringFormatter.computePluralString(
+          commentCount, 'comment');
+      const unresolvedString = GrCountStringFormatter.computeString(
+          unresolvedCount, 'unresolved');
+
+      return commentString +
+          // Add a space if both comments and unresolved
+          (commentString && unresolvedString ? ' ' : '') +
+          // Add parentheses around unresolved if it exists.
+          (unresolvedString ? `(${unresolvedString})` : '');
     },
 
-    computeUnresolvedNum(comments, drafts, patchNum, path) {
-      comments = this.getCommentsForPath(comments, patchNum, path);
-      drafts = this.getCommentsForPath(drafts, patchNum, path);
-      comments = comments.concat(drafts);
-
-      // Create an object where every comment ID is the key of an unresolved
-      // comment.
-
-      const idMap = comments.reduce((acc, comment) => {
-        if (comment.unresolved) {
-          acc[comment.id] = true;
-        }
-        return acc;
-      }, {});
-
-      // Set false for the comments that are marked as parents.
-      for (const comment of comments) {
-        idMap[comment.in_reply_to] = false;
-      }
-
-      // The unresolved comments are the comments that still have true.
-      const unresolvedLeaves = Object.keys(idMap).filter(key => {
-        return idMap[key];
-      });
-
-      return unresolvedLeaves.length;
+    /**
+     * Computes a string with the number of drafts.
+     *
+     * @param {!Object} changeComments
+     * @param {!Object} patchRange
+     * @param {string} path
+     * @return {string}
+     */
+    _computeDraftsString(changeComments, patchRange, path) {
+      const draftCount =
+          changeComments.computeDraftCount(patchRange.basePatchNum, path) +
+          changeComments.computeDraftCount(patchRange.patchNum, path);
+      return GrCountStringFormatter.computePluralString(draftCount, 'draft');
     },
 
-    _computeReviewed(file, _reviewed) {
-      return _reviewed.includes(file.__path);
+    /**
+     * Computes a shortened string with the number of drafts.
+     *
+     * @param {!Object} changeComments
+     * @param {!Object} patchRange
+     * @param {string} path
+     * @return {string}
+     */
+    _computeDraftsStringMobile(changeComments, patchRange, path) {
+      const draftCount =
+          changeComments.computeDraftCount(patchRange.basePatchNum, path) +
+          changeComments.computeDraftCount(patchRange.patchNum, path);
+      return GrCountStringFormatter.computeShortString(draftCount, 'd');
     },
 
-    _reviewFile(path) {
-      if (this.editLoaded) {
-        this.fire('show-alert', {message: ERR_EDIT_LOADED});
-        return;
-      }
-      const index = this._reviewed.indexOf(path);
-      const reviewed = index !== -1;
-      if (reviewed) {
-        this.splice('_reviewed', index, 1);
-      } else {
-        this.push('_reviewed', path);
+    /**
+     * Computes a shortened string with the number of comments.
+     *
+     * @param {!Object} changeComments
+     * @param {!Object} patchRange
+     * @param {string} path
+     * @return {string}
+     */
+    _computeCommentsStringMobile(changeComments, patchRange, path) {
+      const commentCount =
+          changeComments.computeCommentCount(patchRange.basePatchNum, path) +
+          changeComments.computeCommentCount(patchRange.patchNum, path);
+      return GrCountStringFormatter.computeShortString(commentCount, 'c');
+    },
+
+    /**
+     * @param {string} path
+     * @param {boolean=} opt_reviewed
+     */
+    _reviewFile(path, opt_reviewed) {
+      if (this.editMode) { return; }
+      const index = this._files.findIndex(file => file.__path === path);
+      const reviewed = opt_reviewed || !this._files[index].isReviewed;
+
+      this.set(['_files', index, 'isReviewed'], reviewed);
+      if (index < this._shownFiles.length) {
+        this.set(['_shownFiles', index, 'isReviewed'], reviewed);
       }
 
-      this._saveReviewedState(path, !reviewed);
+      this._saveReviewedState(path, reviewed);
     },
 
     _saveReviewedState(path, reviewed) {
@@ -419,21 +485,36 @@
     },
 
     _getReviewedFiles() {
-      if (this.editLoaded) { return Promise.resolve([]); }
+      if (this.editMode) { return Promise.resolve([]); }
       return this.$.restAPI.getReviewedFiles(this.changeNum,
           this.patchRange.patchNum);
     },
 
     _getFiles() {
-      if (this.editLoaded) {
-        return this.$.restAPI.getChangeEditFilesAsSpeciallySortedArray(
-            this.changeNum, this.patchRange);
-      }
-      return this.$.restAPI.getChangeFilesAsSpeciallySortedArray(
+      return this.$.restAPI.getChangeOrEditFiles(
           this.changeNum, this.patchRange);
     },
 
     /**
+     * The closure compiler doesn't realize this.specialFilePathCompare is
+     * valid.
+     * @suppress {checkTypes}
+     */
+    _normalizeChangeFilesResponse(response) {
+      if (!response) { return []; }
+      const paths = Object.keys(response).sort(this.specialFilePathCompare);
+      const files = [];
+      for (let i = 0; i < paths.length; i++) {
+        const info = response[paths[i]];
+        info.__path = paths[i];
+        info.lines_inserted = info.lines_inserted || 0;
+        info.lines_deleted = info.lines_deleted || 0;
+        files.push(info);
+      }
+      return files;
+    },
+
+    /**
      * Handle all events from the file list dom-repeat so event handleers don't
      * have to get registered for potentially very long lists.
      */
@@ -443,6 +524,7 @@
       while (!row.classList.contains('row') && row.parentElement) {
         row = row.parentElement;
       }
+
       const path = row.dataset.path;
       // Handle checkbox mark as reviewed.
       if (e.target.classList.contains('markReviewed')) {
@@ -450,46 +532,37 @@
         return this._reviewFile(path);
       }
 
-      // If the user prefers to expand inline diffs rather than opening the diff
-      // view, intercept the click event.
-      if (!path || e.detail.sourceEvent.metaKey ||
-          e.detail.sourceEvent.ctrlKey) {
-        return;
-      }
+      // If a path cannot be interpreted from the click target (meaning it's not
+      // somewhere in the row, e.g. diff content) or if the user clicked the
+      // link, defer to the native behavior.
+      if (!path || this.descendedFromClass(e.target, 'pathLink')) { return; }
 
-      if (e.target.dataset.expand ||
-          this._userPrefs && this._userPrefs.expand_inline_diffs) {
-        e.preventDefault();
-        this._togglePathExpanded(path);
-        return;
-      }
+      // Disregard the event if the click target is in the edit controls.
+      if (this.descendedFromClass(e.target, 'editFileControls')) { return; }
 
-      // If we clicked the row but not the link, then simulate a click on the
-      // anchor.
-      if (e.target.classList.contains('path') ||
-          e.target.classList.contains('oldPath')) {
-        const a = row.querySelector('a');
-        if (a) { a.click(); }
-      }
+      e.preventDefault();
+      this._togglePathExpanded(path);
     },
 
-    _handleShiftLeftKey(e) {
-      if (this.shouldSuppressKeyboardShortcut(e)) { return; }
-      if (!this._showInlineDiffs) { return; }
+    _handleLeftPane(e) {
+      if (this.shouldSuppressKeyboardShortcut(e) || this._noDiffsExpanded()) {
+        return;
+      }
 
       e.preventDefault();
       this.$.diffCursor.moveLeft();
     },
 
-    _handleShiftRightKey(e) {
-      if (this.shouldSuppressKeyboardShortcut(e)) { return; }
-      if (!this._showInlineDiffs) { return; }
+    _handleRightPane(e) {
+      if (this.shouldSuppressKeyboardShortcut(e) || this._noDiffsExpanded()) {
+        return;
+      }
 
       e.preventDefault();
       this.$.diffCursor.moveRight();
     },
 
-    _handleIKey(e) {
+    _handleToggleInlineDiff(e) {
       if (this.shouldSuppressKeyboardShortcut(e) ||
           this.modifierPressed(e) ||
           this.$.fileCursor.index === -1) { return; }
@@ -498,14 +571,14 @@
       this._togglePathExpandedByIndex(this.$.fileCursor.index);
     },
 
-    _handleCapitalIKey(e) {
+    _handleToggleAllInlineDiffs(e) {
       if (this.shouldSuppressKeyboardShortcut(e)) { return; }
 
       e.preventDefault();
       this._toggleInlineDiffs();
     },
 
-    _handleDownKey(e) {
+    _handleCursorNext(e) {
       if (this.shouldSuppressKeyboardShortcut(e) || this.modifierPressed(e)) {
         return;
       }
@@ -523,7 +596,7 @@
       }
     },
 
-    _handleUpKey(e) {
+    _handleCursorPrev(e) {
       if (this.shouldSuppressKeyboardShortcut(e) || this.modifierPressed(e)) {
         return;
       }
@@ -541,20 +614,20 @@
       }
     },
 
-    _handleCKey(e) {
+    _handleNewComment(e) {
       if (this.shouldSuppressKeyboardShortcut(e) ||
           this.modifierPressed(e)) { return; }
 
       const isRangeSelected = this.diffs.some(diff => {
         return diff.isRangeSelected();
       }, this);
-      if (this._showInlineDiffs && !isRangeSelected) {
+      if (!isRangeSelected) {
         e.preventDefault();
         this._addDraftAtTarget();
       }
     },
 
-    _handleLeftBracketKey(e) {
+    _handleOpenLastFile(e) {
       // Check for meta key to avoid overriding native chrome shortcut.
       if (this.shouldSuppressKeyboardShortcut(e) ||
           this.getKeyboardEvent(e).metaKey) { return; }
@@ -563,7 +636,7 @@
       this._openSelectedFile(this._files.length - 1);
     },
 
-    _handleRightBracketKey(e) {
+    _handleOpenFirstFile(e) {
       // Check for meta key to avoid overriding native chrome shortcut.
       if (this.shouldSuppressKeyboardShortcut(e) ||
           this.getKeyboardEvent(e).metaKey) { return; }
@@ -572,27 +645,25 @@
       this._openSelectedFile(0);
     },
 
-    _handleOKey(e) {
+    _handleOpenFile(e) {
       if (this.shouldSuppressKeyboardShortcut(e) ||
           this.modifierPressed(e)) { return; }
-
       e.preventDefault();
+
       if (this._showInlineDiffs) {
         this._openCursorFile();
-      } else if (this._userPrefs && this._userPrefs.expand_inline_diffs) {
-        if (this.$.fileCursor.index === -1) { return; }
-        this._togglePathExpandedByIndex(this.$.fileCursor.index);
-      } else {
-        this._openSelectedFile();
-      }
-    },
-
-    _handleNKey(e) {
-      if (this.shouldSuppressKeyboardShortcut(e) ||
-          this.modifierPressed(e) && !this.isModifierPressed(e, 'shiftKey')) {
         return;
       }
-      if (!this._showInlineDiffs) { return; }
+
+      this._openSelectedFile();
+    },
+
+    _handleNextChunk(e) {
+      if (this.shouldSuppressKeyboardShortcut(e) ||
+          (this.modifierPressed(e) && !this.isModifierPressed(e, 'shiftKey')) ||
+          this._noDiffsExpanded()) {
+        return;
+      }
 
       e.preventDefault();
       if (this.isModifierPressed(e, 'shiftKey')) {
@@ -602,12 +673,12 @@
       }
     },
 
-    _handlePKey(e) {
+    _handlePrevChunk(e) {
       if (this.shouldSuppressKeyboardShortcut(e) ||
-          this.modifierPressed(e) && !this.isModifierPressed(e, 'shiftKey')) {
+          (this.modifierPressed(e) && !this.isModifierPressed(e, 'shiftKey')) ||
+          this._noDiffsExpanded()) {
         return;
       }
-      if (!this._showInlineDiffs) { return; }
 
       e.preventDefault();
       if (this.isModifierPressed(e, 'shiftKey')) {
@@ -617,7 +688,7 @@
       }
     },
 
-    _handleRKey(e) {
+    _handleToggleFileReviewed(e) {
       if (this.shouldSuppressKeyboardShortcut(e) || this.modifierPressed(e)) {
         return;
       }
@@ -627,7 +698,7 @@
       this._reviewFile(this._files[this.$.fileCursor.index].__path);
     },
 
-    _handleCapitalAKey(e) {
+    _handleToggleLeftPane(e) {
       if (this.shouldSuppressKeyboardShortcut(e)) { return; }
 
       e.preventDefault();
@@ -684,7 +755,13 @@
       return status || 'M';
     },
 
-    _computeDiffURL(change, patchNum, basePatchNum, path) {
+    _computeDiffURL(change, patchNum, basePatchNum, path, editMode) {
+      // TODO(kaspern): Fix editing for commit messages and merge lists.
+      if (editMode && path !== this.COMMIT_MESSAGE_PATH &&
+          path !== this.MERGE_LIST_PATH) {
+        return Gerrit.Nav.getEditUrlForDiff(change, path, patchNum,
+            basePatchNum);
+      }
       return Gerrit.Nav.getUrlForDiff(change, path, patchNum, basePatchNum);
     },
 
@@ -714,6 +791,10 @@
       return delta >= 0 ? 'added' : 'removed';
     },
 
+    /**
+     * @param {string} baseClass
+     * @param {string} path
+     */
     _computeClass(baseClass, path) {
       const classes = [baseClass];
       if (path === this.COMMIT_MESSAGE_PATH || path === this.MERGE_LIST_PATH) {
@@ -723,39 +804,56 @@
     },
 
     _computePathClass(path, expandedFilesRecord) {
-      return this._isFileExpanded(path, expandedFilesRecord) ? 'path expanded' :
-          'path';
+      return this._isFileExpanded(path, expandedFilesRecord) ? 'expanded' : '';
     },
 
-    _computeShowHideText(path, expandedFilesRecord) {
-      return this._isFileExpanded(path, expandedFilesRecord) ? '▼' : '▶';
+    _computeShowHideIcon(path, expandedFilesRecord) {
+      return this._isFileExpanded(path, expandedFilesRecord) ?
+          'gr-icons:expand-less' : 'gr-icons:expand-more';
+    },
+
+    _computeFiles(filesByPath, changeComments, patchRange, reviewed, loading) {
+      // Await all promises resolving from reload. @See Issue 9057
+      if (loading) { return; }
+
+      const commentedPaths = changeComments.getPaths(patchRange);
+      const files = Object.assign({}, filesByPath);
+      Object.keys(commentedPaths).forEach(commentedPath => {
+        if (files.hasOwnProperty(commentedPath)) { return; }
+        files[commentedPath] = {status: 'U'};
+      });
+      const reviewedSet = new Set(reviewed || []);
+      for (const filePath in files) {
+        if (!files.hasOwnProperty(filePath)) { continue; }
+        files[filePath].isReviewed = reviewedSet.has(filePath);
+      }
+
+      this._files = this._normalizeChangeFilesResponse(files);
     },
 
     _computeFilesShown(numFilesShown, files) {
+      const previousNumFilesShown = this._shownFiles ?
+          this._shownFiles.length : 0;
+
       const filesShown = files.base.slice(0, numFilesShown);
       this.fire('files-shown-changed', {length: filesShown.length});
+
+      // Start the timer for the rendering work hwere because this is where the
+      // _shownFiles property is being set, and _shownFiles is used in the
+      // dom-repeat binding.
+      this.$.reporting.time(RENDER_TIMING_LABEL);
+
+      // How many more files are being shown (if it's an increase).
+      this._reportinShownFilesIncrement =
+          Math.max(0, filesShown.length - previousNumFilesShown);
+
       return filesShown;
     },
 
-    _setReviewedFiles(shownFiles, files, reviewedRecord, loggedIn) {
-      if (!loggedIn) { return; }
-      const reviewed = reviewedRecord.base;
-      let fileReviewed;
-      for (let i = 0; i < files.length; i++) {
-        fileReviewed = this._computeReviewed(files[i], reviewed);
-        this._files[i].isReviewed = fileReviewed;
-        if (i < shownFiles.length) {
-          this.set(['_shownFiles', i, 'isReviewed'], fileReviewed);
-        }
-      }
-    },
-
     _updateDiffCursor() {
-      const diffElements = Polymer.dom(this.root).querySelectorAll('gr-diff');
-
       // Overwrite the cursor's list of diffs:
       this.$.diffCursor.splice(
-          ...['diffs', 0, this.$.diffCursor.diffs.length].concat(diffElements));
+          ...['diffs', 0, this.$.diffCursor.diffs.length].concat(this.diffs));
     },
 
     _filesChanged() {
@@ -769,8 +867,8 @@
       this.numFilesShown += this.fileListIncrement;
     },
 
-    _computeFileListButtonHidden(numFilesShown, files) {
-      return numFilesShown >= files.length;
+    _computeFileListControlClass(numFilesShown, files) {
+      return numFilesShown >= files.length ? 'invisible' : '';
     },
 
     _computeIncrementText(numFilesShown, files) {
@@ -805,6 +903,12 @@
           rev.description.substring(0, PATCH_DESC_MAX_LENGTH) : '';
     },
 
+    /**
+     * Get a descriptive label for use in the status indicator's tooltip and
+     * ARIA label.
+     * @param {string} status
+     * @return {string}
+     */
     _computeFileStatusLabel(status) {
       const statusCode = this._computeFileStatus(status);
       return FileStatus.hasOwnProperty(statusCode) ?
@@ -820,6 +924,15 @@
           detail.path);
     },
 
+    _computeExpandedFiles(expandedCount, totalCount) {
+      if (expandedCount === 0) {
+        return GrFileListConstants.FilesExpandedState.NONE;
+      } else if (expandedCount === totalCount) {
+        return GrFileListConstants.FilesExpandedState.ALL;
+      }
+      return GrFileListConstants.FilesExpandedState.SOME;
+    },
+
     /**
      * Handle splices to the list of expanded file paths. If there are any new
      * entries in the expanded list, then render each diff corresponding in
@@ -828,37 +941,49 @@
      * @param {!Array} record The splice record in the expanded paths list.
      */
     _expandedPathsChanged(record) {
-      if (!record) { return; }
+      // Clear content for any diffs that are not open so if they get re-opened
+      // the stale content does not flash before it is cleared and reloaded.
+      const collapsedDiffs = this.diffs.filter(diff =>
+          this._expandedFilePaths.indexOf(diff.path) === -1);
+      this._clearCollapsedDiffs(collapsedDiffs);
+
+      if (!record) { return; } // Happens after "Collapse all" clicked.
+
+      this.filesExpanded = this._computeExpandedFiles(
+          this._expandedFilePaths.length, this._files.length);
 
       // Find the paths introduced by the new index splices:
       const newPaths = record.indexSplices
-          .map(splice => {
-            return splice.object.slice(splice.index,
-                splice.index + splice.addedCount);
-          })
-          .reduce((acc, paths) => { return acc.concat(paths); }, []);
-
-      const timerName = 'Expand ' + newPaths.length + ' diffs';
-      this.$.reporting.time(timerName);
+            .map(splice => splice.object.slice(
+                splice.index, splice.index + splice.addedCount))
+            .reduce((acc, paths) => acc.concat(paths), []);
 
       // Required so that the newly created diff view is included in this.diffs.
       Polymer.dom.flush();
 
-      this._renderInOrder(newPaths, this.diffs, newPaths.length)
-          .then(() => {
-            this.$.reporting.timeEnd(timerName);
-            this.$.diffCursor.handleDiffUpdate();
-          });
+      this.$.reporting.time(EXPAND_ALL_TIMING_LABEL);
+
+      if (newPaths.length) {
+        this._renderInOrder(newPaths, this.diffs, newPaths.length);
+      }
+
       this._updateDiffCursor();
       this.$.diffCursor.handleDiffUpdate();
     },
 
+    _clearCollapsedDiffs(collapsedDiffs) {
+      for (const diff of collapsedDiffs) {
+        diff.cancel();
+        diff.clearDiffContent();
+      }
+    },
+
     /**
      * Given an array of paths and a NodeList of diff elements, render the diff
      * for each path in order, awaiting the previous render to complete before
      * continung.
      * @param  {!Array<string>} paths
-     * @param  {!NodeList<!Object>} diffElements (GrDiffElement)
+     * @param  {!NodeList<!Object>} diffElements (GrDiffHostElement)
      * @param  {number} initialCount The total number of paths in the pass. This
      *   is used to generate log messages.
      * @return {!Promise}
@@ -866,25 +991,38 @@
     _renderInOrder(paths, diffElements, initialCount) {
       let iter = 0;
 
-      return this.$.commentAPI.loadAll(this.changeNum)
-          .then(() => {
-            return this.asyncForeach(paths, path => {
-              iter++;
-              console.log('Expanding diff', iter, 'of', initialCount, ':',
-                  path);
-              const diffElem = this._findDiffByPath(path, diffElements);
-              diffElem.comments = this.$.commentAPI.getCommentsForPath(path,
-                  this.patchRange, this.projectConfig);
-              const promises = [diffElem.reload()];
-              if (this._isLoggedIn) {
-                promises.push(this._reviewFile(path));
-              }
-              return Promise.all(promises);
-            });
-          })
-          .then(() => {
-            console.log('Finished expanding', initialCount, 'diff(s)');
-          });
+      return (new Promise(resolve => {
+        this.fire('reload-drafts', {resolve});
+      })).then(() => {
+        return this.asyncForeach(paths, (path, cancel) => {
+          this._cancelForEachDiff = cancel;
+
+          iter++;
+          console.log('Expanding diff', iter, 'of', initialCount, ':',
+              path);
+          const diffElem = this._findDiffByPath(path, diffElements);
+          diffElem.comments = this.changeComments.getCommentsBySideForPath(
+              path, this.patchRange, this.projectConfig);
+          const promises = [diffElem.reload()];
+          if (this._loggedIn && !this.diffPrefs.manual_review) {
+            promises.push(this._reviewFile(path, true));
+          }
+          return Promise.all(promises);
+        }).then(() => {
+          this._cancelForEachDiff = null;
+          this._nextRenderParams = null;
+          console.log('Finished expanding', initialCount, 'diff(s)');
+          this.$.reporting.timeEndWithAverage(EXPAND_ALL_TIMING_LABEL,
+              EXPAND_ALL_AVG_TIMING_LABEL, initialCount);
+          this.$.diffCursor.handleDiffUpdate();
+        });
+      });
+    },
+
+    /** Cancel the rendering work of every diff in the list */
+    _cancelDiffs() {
+      if (this._cancelForEachDiff) { this._cancelForEachDiff(); }
+      this._forEachDiff(d => d.cancel());
     },
 
     /**
@@ -901,6 +1039,43 @@
       }
     },
 
+    /**
+     * Reset the comments of a modified thread
+     * @param  {string} rootId
+     * @param  {string} path
+     */
+    reloadCommentsForThreadWithRootId(rootId, path) {
+      // Don't bother continuing if we already know that the path that contains
+      // the updated comment thread is not expanded.
+      if (!this._expandedFilePaths.includes(path)) { return; }
+      const diff = this.diffs.find(d => d.path === path);
+
+      const threadEl = diff.getThreadEls().find(t => t.rootId === rootId);
+      if (!threadEl) { return; }
+
+      const newComments = this.changeComments.getCommentsForThread(rootId);
+
+      // If newComments is null, it means that a single draft was
+      // removed from a thread in the thread view, and the thread should
+      // no longer exist. Remove the existing thread element in the diff
+      // view.
+      if (!newComments) {
+        threadEl.fireRemoveSelf();
+        return;
+      }
+
+      // Comments are not returned with the commentSide attribute from
+      // the api, but it's necessary to be stored on the diff's
+      // comments due to use in the _handleCommentUpdate function.
+      // The comment thread already has a side associated with it, so
+      // set the comment's side to match.
+      threadEl.comments = newComments.map(c => {
+        return Object.assign(c, {__commentSide: threadEl.commentSide});
+      });
+      Polymer.dom.flush();
+      return;
+    },
+
     _handleEscKey(e) {
       if (this.shouldSuppressKeyboardShortcut(e) ||
           this.modifierPressed(e)) { return; }
@@ -922,8 +1097,8 @@
       }, LOADING_DEBOUNCE_INTERVAL);
     },
 
-    _editLoadedChanged(editLoaded) {
-      this.classList.toggle('editLoaded', editLoaded);
+    _editModeChanged(editMode) {
+      this.classList.toggle('editMode', editMode);
     },
 
     _computeReviewedClass(isReviewed) {
@@ -933,5 +1108,156 @@
     _computeReviewedText(isReviewed) {
       return isReviewed ? 'MARK UNREVIEWED' : 'MARK REVIEWED';
     },
+
+    /**
+     * Given a file path, return whether that path should have visible size bars
+     * and be included in the size bars calculation.
+     * @param {string} path
+     * @return {boolean}
+     */
+    _showBarsForPath(path) {
+      return path !== this.COMMIT_MESSAGE_PATH && path !== this.MERGE_LIST_PATH;
+    },
+
+    /**
+     * Compute size bar layout values from the file list.
+     * @return {Defs.LayoutStats|undefined}
+     */
+    _computeSizeBarLayout(shownFilesRecord) {
+      if (!shownFilesRecord || !shownFilesRecord.base) { return undefined; }
+      const stats = {
+        maxInserted: 0,
+        maxDeleted: 0,
+        maxAdditionWidth: 0,
+        maxDeletionWidth: 0,
+        deletionOffset: 0,
+      };
+      shownFilesRecord.base
+          .filter(f => this._showBarsForPath(f.__path))
+          .forEach(f => {
+            if (f.lines_inserted) {
+              stats.maxInserted = Math.max(stats.maxInserted, f.lines_inserted);
+            }
+            if (f.lines_deleted) {
+              stats.maxDeleted = Math.max(stats.maxDeleted, f.lines_deleted);
+            }
+          });
+      const ratio = stats.maxInserted / (stats.maxInserted + stats.maxDeleted);
+      if (!isNaN(ratio)) {
+        stats.maxAdditionWidth =
+            (SIZE_BAR_MAX_WIDTH - SIZE_BAR_GAP_WIDTH) * ratio;
+        stats.maxDeletionWidth =
+            SIZE_BAR_MAX_WIDTH - SIZE_BAR_GAP_WIDTH - stats.maxAdditionWidth;
+        stats.deletionOffset = stats.maxAdditionWidth + SIZE_BAR_GAP_WIDTH;
+      }
+      return stats;
+    },
+
+    /**
+     * Get the width of the addition bar for a file.
+     * @param {Object} file
+     * @param {Defs.LayoutStats} stats
+     * @return {number}
+     */
+    _computeBarAdditionWidth(file, stats) {
+      if (stats.maxInserted === 0 ||
+          !file.lines_inserted ||
+          !this._showBarsForPath(file.__path)) {
+        return 0;
+      }
+      const width =
+          stats.maxAdditionWidth * file.lines_inserted / stats.maxInserted;
+      return width === 0 ? 0 : Math.max(SIZE_BAR_MIN_WIDTH, width);
+    },
+
+    /**
+     * Get the x-offset of the addition bar for a file.
+     * @param {Object} file
+     * @param {Defs.LayoutStats} stats
+     * @return {number}
+     */
+    _computeBarAdditionX(file, stats) {
+      return stats.maxAdditionWidth -
+          this._computeBarAdditionWidth(file, stats);
+    },
+
+    /**
+     * Get the width of the deletion bar for a file.
+     * @param {Object} file
+     * @param {Defs.LayoutStats} stats
+     * @return {number}
+     */
+    _computeBarDeletionWidth(file, stats) {
+      if (stats.maxDeleted === 0 ||
+          !file.lines_deleted ||
+          !this._showBarsForPath(file.__path)) {
+        return 0;
+      }
+      const width =
+          stats.maxDeletionWidth * file.lines_deleted / stats.maxDeleted;
+      return width === 0 ? 0 : Math.max(SIZE_BAR_MIN_WIDTH, width);
+    },
+
+    /**
+     * Get the x-offset of the deletion bar for a file.
+     * @param {Defs.LayoutStats} stats
+     * @return {number}
+     */
+    _computeBarDeletionX(stats) {
+      return stats.deletionOffset;
+    },
+
+    _computeShowSizeBars(userPrefs) {
+      return !!userPrefs.size_bar_in_change_table;
+    },
+
+    _computeSizeBarsClass(showSizeBars, path) {
+      let hideClass = '';
+      if (!showSizeBars) {
+        hideClass = 'hide';
+      } else if (!this._showBarsForPath(path)) {
+        hideClass = 'invisible';
+      }
+      return `sizeBars desktop ${hideClass}`;
+    },
+
+    /**
+     * Returns true if none of the inline diffs have been expanded.
+     * @return {boolean}
+     */
+    _noDiffsExpanded() {
+      return this.filesExpanded === GrFileListConstants.FilesExpandedState.NONE;
+    },
+
+    /**
+     * Method to call via binding when each file list row is rendered. This
+     * allows approximate detection of when the dom-repeat has completed
+     * rendering.
+     * @param {number} index The index of the row being rendered.
+     * @return {string} an empty string.
+     */
+    _reportRenderedRow(index) {
+      if (index === this._shownFiles.length - 1) {
+        this.async(() => {
+          this.$.reporting.timeEndWithAverage(RENDER_TIMING_LABEL,
+              RENDER_AVG_TIMING_LABEL, this._reportinShownFilesIncrement);
+        }, 1);
+      }
+      return '';
+    },
+
+    _reviewedTitle(reviewed) {
+      if (reviewed) {
+        return 'Mark as not reviewed (shortcut: r)';
+      }
+
+      return 'Mark as reviewed (shortcut: r)';
+    },
+
+    _handleReloadingDiffPreference() {
+      this._getDiffPreferences().then(prefs => {
+        this.diffPrefs = prefs;
+      });
+    },
   });
 })();
diff --git a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list_test.html b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list_test.html
index a5fd521..a441965 100644
--- a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list_test.html
+++ b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -22,6 +23,7 @@
 <script src="../../../bower_components/web-component-tester/browser.js"></script>
 <link rel="import" href="../../../test/common-test-setup.html"/>
 <script src="../../../bower_components/page/page.js"></script>
+<link rel="import" href="../../diff/gr-comment-api/gr-comment-api.html">
 <script src="../../../scripts/util.js"></script>
 
 <link rel="import" href="../../shared/gr-rest-api-interface/mock-diff-response_test.html">
@@ -29,43 +31,89 @@
 
 <script>void(0);</script>
 
+<dom-module id="comment-api-mock">
+  <template>
+    <gr-file-list id="fileList"
+        change-comments="[[_changeComments]]"
+        on-reload-drafts="_reloadDraftsWithCallback"></gr-file-list>
+    <gr-comment-api id="commentAPI"></gr-comment-api>
+  </template>
+  <script src="../../diff/gr-comment-api/gr-comment-api-mock.js"></script>
+</dom-module>
+
 <test-fixture id="basic">
   <template>
-    <gr-file-list></gr-file-list>
+    <comment-api-mock></comment-api-mock>
   </template>
 </test-fixture>
 
 <script>
   suite('gr-file-list tests', () => {
+    const kb = window.Gerrit.KeyboardShortcutBinder;
+    kb.bindShortcut(kb.Shortcut.LEFT_PANE, 'shift+left');
+    kb.bindShortcut(kb.Shortcut.RIGHT_PANE, 'shift+right');
+    kb.bindShortcut(kb.Shortcut.TOGGLE_INLINE_DIFF, 'i:keyup');
+    kb.bindShortcut(kb.Shortcut.TOGGLE_ALL_INLINE_DIFFS, 'shift+i:keyup');
+    kb.bindShortcut(kb.Shortcut.CURSOR_NEXT_FILE, 'j', 'down');
+    kb.bindShortcut(kb.Shortcut.CURSOR_PREV_FILE, 'k', 'up');
+    kb.bindShortcut(kb.Shortcut.NEXT_LINE, 'j', 'down');
+    kb.bindShortcut(kb.Shortcut.PREV_LINE, 'k', 'up');
+    kb.bindShortcut(kb.Shortcut.NEW_COMMENT, 'c');
+    kb.bindShortcut(kb.Shortcut.OPEN_LAST_FILE, '[');
+    kb.bindShortcut(kb.Shortcut.OPEN_FIRST_FILE, ']');
+    kb.bindShortcut(kb.Shortcut.OPEN_FILE, 'o');
+    kb.bindShortcut(kb.Shortcut.NEXT_CHUNK, 'n');
+    kb.bindShortcut(kb.Shortcut.PREV_CHUNK, 'p');
+    kb.bindShortcut(kb.Shortcut.TOGGLE_FILE_REVIEWED, 'r');
+    kb.bindShortcut(kb.Shortcut.TOGGLE_LEFT_PANE, 'shift+a');
+
     let element;
+    let commentApiWrapper;
     let sandbox;
     let saveStub;
-    let loadCommentStub;
+    let loadCommentSpy;
 
-    setup(() => {
+    setup(done => {
       sandbox = sinon.sandbox.create();
       stub('gr-rest-api-interface', {
         getLoggedIn() { return Promise.resolve(true); },
         getPreferences() { return Promise.resolve({}); },
-        fetchJSON() { return Promise.resolve({}); },
+        getDiffPreferences() { return Promise.resolve({}); },
+        getDiffComments() { return Promise.resolve({}); },
+        getDiffRobotComments() { return Promise.resolve({}); },
+        getDiffDrafts() { return Promise.resolve({}); },
+        getAccountCapabilities() { return Promise.resolve({}); },
       });
       stub('gr-date-formatter', {
         _loadTimeFormat() { return Promise.resolve(''); },
       });
-      stub('gr-diff', {
+      stub('gr-diff-host', {
         reload() { return Promise.resolve(); },
       });
-      stub('gr-comment-api', {
-        getPaths() { return {}; },
-        getCommentsForPath() { return {meta: {}, left: [], right: []}; },
-      });
 
-      element = fixture('basic');
+      // Element must be wrapped in an element with direct access to the
+      // comment API.
+      commentApiWrapper = fixture('basic');
+      element = commentApiWrapper.$.fileList;
+      loadCommentSpy = sandbox.spy(commentApiWrapper.$.commentAPI, 'loadAll');
+
+      // Stub methods on the changeComments object after changeComments has
+      // been initalized.
+      commentApiWrapper.loadComments().then(() => {
+        sandbox.stub(element.changeComments, 'getPaths').returns({});
+        sandbox.stub(element.changeComments, 'getCommentsBySideForPath')
+            .returns({meta: {}, left: [], right: []});
+        done();
+      });
+      element._loading = false;
+      element.diffPrefs = {};
       element.numFilesShown = 200;
+      element.patchRange = {
+        basePatchNum: 'PARENT',
+        patchNum: '2',
+      };
       saveStub = sandbox.stub(element, '_saveReviewedState',
           () => { return Promise.resolve(); });
-      loadCommentStub = sandbox.stub(element.$.commentAPI, 'loadAll',
-          () => { return Promise.resolve(); });
     });
 
     teardown(() => {
@@ -73,109 +121,64 @@
     });
 
     test('correct number of files are shown', () => {
-      element._files = _.times(500, i => {
-        return {__path: '/file' + i, lines_inserted: 9};
-      });
+      element.fileListIncrement = 300;
+      element._filesByPath = _.range(500)
+          .reduce((_filesByPath, i) => {
+            _filesByPath['/file' + i] = {lines_inserted: 9};
+            return _filesByPath;
+          }, {});
+
       flushAsynchronousOperations();
       assert.equal(
           Polymer.dom(element.root).querySelectorAll('.file-row').length,
           element.numFilesShown);
+      const controlRow = element.$$('.controlRow');
+      assert.isFalse(controlRow.classList.contains('invisible'));
+      assert.equal(element.$.incrementButton.textContent.trim(),
+          'Show 300 more');
+      assert.equal(element.$.showAllButton.textContent.trim(),
+          'Show all 500 files');
+
+      MockInteractions.tap(element.$.showAllButton);
+      flushAsynchronousOperations();
+
+      assert.equal(element.numFilesShown, 500);
+      assert.equal(element._shownFiles.length, 500);
+      assert.isTrue(controlRow.classList.contains('invisible'));
     });
 
-    test('get file list', done => {
-      const getChangeFilesStub = sandbox.stub(element.$.restAPI, 'getChangeFiles',
-          () => {
-            return Promise.resolve({
-              '/COMMIT_MSG': {lines_inserted: 9},
-              'tags.html': {lines_deleted: 123},
-              'about.txt': {},
-            });
-          });
-
-      element._getFiles().then(files => {
-        const filenames = files.map(f => { return f.__path; });
-        assert.deepEqual(filenames, ['/COMMIT_MSG', 'about.txt', 'tags.html']);
-        assert.deepEqual(files[0], {
-          lines_inserted: 9,
-          lines_deleted: 0,
-          __path: '/COMMIT_MSG',
-        });
-        assert.deepEqual(files[1], {
-          lines_inserted: 0,
-          lines_deleted: 0,
-          __path: 'about.txt',
-        });
-        assert.deepEqual(files[2], {
-          lines_inserted: 0,
-          lines_deleted: 123,
-          __path: 'tags.html',
-        });
-
-        getChangeFilesStub.restore();
-        done();
-      });
-    });
-
-    test('get file list with change edit', done => {
-      element.editLoaded = true;
-
-      sandbox.stub(element.$.restAPI,
-          'getChangeEditFiles', () => {
-            return Promise.resolve({
-              commit: {},
-              files: {
-                '/COMMIT_MSG': {
-                  lines_inserted: 9,
-                },
-                'tags.html': {
-                  lines_deleted: 123,
-                },
-                'about.txt': {},
-              },
-            });
-          });
-
-      element._getFiles().then(files => {
-        const filenames = files.map(f => { return f.__path; });
-        assert.deepEqual(filenames, ['/COMMIT_MSG', 'about.txt', 'tags.html']);
-        assert.deepEqual(files[0], {
-          lines_inserted: 9,
-          lines_deleted: 0,
-          __path: '/COMMIT_MSG',
-        });
-        assert.deepEqual(files[1], {
-          lines_inserted: 0,
-          lines_deleted: 0,
-          __path: 'about.txt',
-        });
-        assert.deepEqual(files[2], {
-          lines_inserted: 0,
-          lines_deleted: 123,
-          __path: 'tags.html',
-        });
-
-        done();
-      });
+    test('rendering each row calls the _reportRenderedRow method', () => {
+      const renderedStub = sandbox.stub(element, '_reportRenderedRow');
+      element._filesByPath = _.range(10)
+          .reduce((_filesByPath, i) => {
+            _filesByPath['/file' + i] = {lines_inserted: 9};
+            return _filesByPath;
+          }, {});
+      flushAsynchronousOperations();
+      assert.equal(
+          Polymer.dom(element.root).querySelectorAll('.file-row').length, 10);
+      assert.equal(renderedStub.callCount, 10);
     });
 
     test('calculate totals for patch number', () => {
-      element._files = [
-        {__path: '/COMMIT_MSG', lines_inserted: 9},
-        {
-          __path: 'file_added_in_rev2.txt',
+      element._filesByPath = {
+        '/COMMIT_MSG': {
+          lines_inserted: 9,
+        },
+        'file_added_in_rev2.txt': {
           lines_inserted: 1,
           lines_deleted: 1,
           size_delta: 10,
           size: 100,
         },
-        {
-          __path: 'myfile.txt',
+        'myfile.txt': {
           lines_inserted: 1,
           lines_deleted: 1,
           size_delta: 10,
           size: 100,
         },
-      ];
+      };
+
       assert.deepEqual(element._patchChange, {
         inserted: 2,
         deleted: 2,
@@ -187,11 +190,20 @@
       assert.isFalse(element._hideChangeTotals);
 
       // Test with a commit message that isn't the first file.
-      element._files = [
-        {__path: 'file_added_in_rev2.txt', lines_inserted: 1, lines_deleted: 1},
-        {__path: '/COMMIT_MSG', lines_inserted: 9},
-        {__path: 'myfile.txt', lines_inserted: 1, lines_deleted: 1},
-      ];
+      element._filesByPath = {
+        'file_added_in_rev2.txt': {
+          lines_inserted: 1,
+          lines_deleted: 1,
+        },
+        '/COMMIT_MSG': {
+          lines_inserted: 9,
+        },
+        'myfile.txt': {
+          lines_inserted: 1,
+          lines_deleted: 1,
+        },
+      };
+
       assert.deepEqual(element._patchChange, {
         inserted: 2,
         deleted: 2,
@@ -203,10 +215,17 @@
       assert.isFalse(element._hideChangeTotals);
 
       // Test with no commit message.
-      element._files = [
-        {__path: 'file_added_in_rev2.txt', lines_inserted: 1, lines_deleted: 1},
-        {__path: 'myfile.txt', lines_inserted: 1, lines_deleted: 1},
-      ];
+      element._filesByPath = {
+        'file_added_in_rev2.txt': {
+          lines_inserted: 1,
+          lines_deleted: 1,
+        },
+        'myfile.txt': {
+          lines_inserted: 1,
+          lines_deleted: 1,
+        },
+      };
+
       assert.deepEqual(element._patchChange, {
         inserted: 2,
         deleted: 2,
@@ -218,10 +237,10 @@
       assert.isFalse(element._hideChangeTotals);
 
       // Test with files missing either lines_inserted or lines_deleted.
-      element._files = [
-        {__path: 'file_added_in_rev2.txt', lines_inserted: 1},
-        {__path: 'myfile.txt', lines_deleted: 1},
-      ];
+      element._filesByPath = {
+        'file_added_in_rev2.txt': {lines_inserted: 1},
+        'myfile.txt': {lines_deleted: 1},
+      };
       assert.deepEqual(element._patchChange, {
         inserted: 1,
         deleted: 1,
@@ -234,11 +253,11 @@
     });
 
     test('binary only files', () => {
-      element._files = [
-        {__path: '/COMMIT_MSG', lines_inserted: 9},
-        {__path: 'file_binary', binary: true, size_delta: 10, size: 100},
-        {__path: 'file_binary', binary: true, size_delta: -5, size: 120},
-      ];
+      element._filesByPath = {
+        '/COMMIT_MSG': {lines_inserted: 9},
+        'file_binary_1': {binary: true, size_delta: 10, size: 100},
+        'file_binary_2': {binary: true, size_delta: -5, size: 120},
+      };
       assert.deepEqual(element._patchChange, {
         inserted: 0,
         deleted: 0,
@@ -251,13 +270,13 @@
     });
 
     test('binary and regular files', () => {
-      element._files = [
-        {__path: '/COMMIT_MSG', lines_inserted: 9},
-        {__path: 'file_binary', binary: true, size_delta: 10, size: 100},
-        {__path: 'file_binary', binary: true, size_delta: -5, size: 120},
-        {__path: 'myfile.txt', lines_deleted: 5, size_delta: -10, size: 100},
-        {__path: 'myfile2.txt', lines_inserted: 10},
-      ];
+      element._filesByPath = {
+        '/COMMIT_MSG': {lines_inserted: 9},
+        'file_binary_1': {binary: true, size_delta: 10, size: 100},
+        'file_binary_2': {binary: true, size_delta: -5, size: 120},
+        'myfile.txt': {lines_deleted: 5, size_delta: -10, size: 100},
+        'myfile2.txt': {lines_inserted: 10},
+      };
       assert.deepEqual(element._patchChange, {
         inserted: 10,
         deleted: 5,
@@ -325,13 +344,229 @@
       }
     });
 
+    test('comment filtering', () => {
+      element.changeComments._comments = {
+        '/COMMIT_MSG': [
+          {patch_set: 1, message: 'Done', updated: '2017-02-08 16:40:49'},
+          {patch_set: 1, message: 'oh hay', updated: '2017-02-09 16:40:49'},
+          {patch_set: 2, message: 'hello', updated: '2017-02-10 16:40:49'},
+        ],
+        'myfile.txt': [
+          {patch_set: 1, message: 'good news!', updated: '2017-02-08 16:40:49'},
+          {patch_set: 2, message: 'wat!?', updated: '2017-02-09 16:40:49'},
+          {patch_set: 2, message: 'hi', updated: '2017-02-10 16:40:49'},
+        ],
+        'unresolved.file': [
+          {
+            patch_set: 2,
+            message: 'wat!?',
+            updated: '2017-02-09 16:40:49',
+            id: '1',
+            unresolved: true,
+          },
+          {
+            patch_set: 2,
+            message: 'hi',
+            updated: '2017-02-10 16:40:49',
+            id: '2',
+            in_reply_to: '1',
+            unresolved: false,
+          },
+          {
+            patch_set: 2,
+            message: 'good news!',
+            updated: '2017-02-08 16:40:49',
+            id: '3',
+            unresolved: true,
+          },
+        ],
+      };
+      element.changeComments._drafts = {
+        '/COMMIT_MSG': [
+          {
+            patch_set: 1,
+            message: 'hi',
+            updated: '2017-02-15 16:40:49',
+            id: '5',
+            unresolved: true,
+          },
+          {
+            patch_set: 1,
+            message: 'fyi',
+            updated: '2017-02-15 16:40:49',
+            id: '6',
+            unresolved: false,
+          },
+        ],
+        'unresolved.file': [
+          {
+            patch_set: 1,
+            message: 'hi',
+            updated: '2017-02-11 16:40:49',
+            id: '4',
+            unresolved: false,
+          },
+        ],
+      };
+
+      const parentTo1 = {
+        basePatchNum: 'PARENT',
+        patchNum: '1',
+      };
+
+      const parentTo2 = {
+        basePatchNum: 'PARENT',
+        patchNum: '2',
+      };
+
+      const _1To2 = {
+        basePatchNum: '1',
+        patchNum: '2',
+      };
+
+      assert.equal(
+          element._computeCommentsString(element.changeComments, parentTo1,
+              '/COMMIT_MSG', 'comment'), '2 comments (1 unresolved)');
+      assert.equal(
+          element._computeCommentsString(element.changeComments, _1To2,
+              '/COMMIT_MSG', 'comment'), '3 comments (1 unresolved)');
+      assert.equal(
+          element._computeCommentsStringMobile(element.changeComments, parentTo1
+          , '/COMMIT_MSG'), '2c');
+      assert.equal(
+          element._computeCommentsStringMobile(element.changeComments, _1To2
+          , '/COMMIT_MSG'), '3c');
+      assert.equal(
+          element._computeDraftsString(element.changeComments, parentTo1,
+              'unresolved.file'), '1 draft');
+      assert.equal(
+          element._computeDraftsString(element.changeComments, _1To2,
+              'unresolved.file'), '1 draft');
+      assert.equal(
+          element._computeDraftsStringMobile(element.changeComments, parentTo1,
+              'unresolved.file'), '1d');
+      assert.equal(
+          element._computeDraftsStringMobile(element.changeComments, _1To2,
+              'unresolved.file'), '1d');
+      assert.equal(
+          element._computeCommentsString(element.changeComments, parentTo1,
+              'myfile.txt', 'comment'), '1 comment');
+      assert.equal(
+          element._computeCommentsString(element.changeComments, _1To2,
+              'myfile.txt', 'comment'), '3 comments');
+      assert.equal(
+          element._computeCommentsStringMobile(element.changeComments, parentTo1,
+              'myfile.txt'), '1c');
+      assert.equal(
+          element._computeCommentsStringMobile(element.changeComments, _1To2,
+              'myfile.txt'), '3c');
+      assert.equal(
+          element._computeDraftsString(element.changeComments, parentTo1,
+              'myfile.txt'), '');
+      assert.equal(
+          element._computeDraftsString(element.changeComments, _1To2,
+              'myfile.txt'), '');
+      assert.equal(
+          element._computeDraftsStringMobile(element.changeComments, parentTo1,
+              'myfile.txt'), '');
+      assert.equal(
+          element._computeDraftsStringMobile(element.changeComments, _1To2,
+              'myfile.txt'), '');
+      assert.equal(
+          element._computeCommentsString(element.changeComments, parentTo1,
+              'file_added_in_rev2.txt', 'comment'), '');
+      assert.equal(
+          element._computeCommentsString(element.changeComments, _1To2,
+              'file_added_in_rev2.txt', 'comment'), '');
+      assert.equal(
+          element._computeCommentsStringMobile(element.changeComments, parentTo1,
+              'file_added_in_rev2.txt'), '');
+      assert.equal(
+          element._computeCommentsStringMobile(element.changeComments, _1To2,
+              'file_added_in_rev2.txt'), '');
+      assert.equal(
+          element._computeDraftsString(element.changeComments, parentTo1,
+              'file_added_in_rev2.txt'), '');
+      assert.equal(
+          element._computeDraftsString(element.changeComments, _1To2,
+              'file_added_in_rev2.txt'), '');
+      assert.equal(
+          element._computeDraftsStringMobile(element.changeComments, parentTo1,
+              'file_added_in_rev2.txt'), '');
+      assert.equal(
+          element._computeDraftsStringMobile(element.changeComments, _1To2,
+              'file_added_in_rev2.txt'), '');
+      assert.equal(
+          element._computeCommentsString(element.changeComments, parentTo2,
+              '/COMMIT_MSG', 'comment'), '1 comment');
+      assert.equal(
+          element._computeCommentsString(element.changeComments, _1To2,
+              '/COMMIT_MSG', 'comment'), '3 comments (1 unresolved)');
+      assert.equal(
+          element._computeCommentsStringMobile(element.changeComments, parentTo2,
+              '/COMMIT_MSG'), '1c');
+      assert.equal(
+          element._computeCommentsStringMobile(element.changeComments, _1To2,
+              '/COMMIT_MSG'), '3c');
+      assert.equal(
+          element._computeDraftsString(element.changeComments, parentTo1,
+              '/COMMIT_MSG'), '2 drafts');
+      assert.equal(
+          element._computeDraftsString(element.changeComments, _1To2,
+              '/COMMIT_MSG'), '2 drafts');
+      assert.equal(
+          element._computeDraftsStringMobile(element.changeComments, parentTo1,
+              '/COMMIT_MSG'), '2d');
+      assert.equal(
+          element._computeDraftsStringMobile(element.changeComments, _1To2,
+              '/COMMIT_MSG'), '2d');
+      assert.equal(
+          element._computeCommentsString(element.changeComments, parentTo2,
+              'myfile.txt', 'comment'), '2 comments');
+      assert.equal(
+          element._computeCommentsString(element.changeComments, _1To2,
+              'myfile.txt', 'comment'), '3 comments');
+      assert.equal(
+          element._computeCommentsStringMobile(element.changeComments, parentTo2,
+              'myfile.txt'), '2c');
+      assert.equal(
+          element._computeCommentsStringMobile(element.changeComments, _1To2,
+              'myfile.txt'), '3c');
+      assert.equal(
+          element._computeDraftsStringMobile(element.changeComments, parentTo2,
+              'myfile.txt'), '');
+      assert.equal(
+          element._computeDraftsStringMobile(element.changeComments, _1To2,
+              'myfile.txt'), '');
+      assert.equal(
+          element._computeCommentsString(element.changeComments, parentTo2,
+              'file_added_in_rev2.txt', 'comment'), '');
+      assert.equal(
+          element._computeCommentsString(element.changeComments, _1To2,
+              'file_added_in_rev2.txt', 'comment'), '');
+      assert.equal(
+          element._computeCommentsString(element.changeComments, parentTo2,
+              'unresolved.file', 'comment'), '3 comments (1 unresolved)');
+      assert.equal(
+          element._computeCommentsString(element.changeComments, _1To2,
+              'unresolved.file', 'comment'), '3 comments (1 unresolved)');
+    });
+
+    test('_reviewedTitle', () => {
+      assert.equal(
+          element._reviewedTitle(true), 'Mark as not reviewed (shortcut: r)');
+
+      assert.equal(
+          element._reviewedTitle(false), 'Mark as reviewed (shortcut: r)');
+    });
+
     suite('keyboard shortcuts', () => {
       setup(() => {
-        element._files = [
-          {__path: '/COMMIT_MSG'},
-          {__path: 'file_added_in_rev2.txt'},
-          {__path: 'myfile.txt'},
-        ];
+        element._filesByPath = {
+          '/COMMIT_MSG': {},
+          'file_added_in_rev2.txt': {},
+          'myfile.txt': {},
+        };
         element.changeNum = '42';
         element.patchRange = {
           basePatchNum: 'PARENT',
@@ -403,6 +638,10 @@
         MockInteractions.pressAndReleaseKeyOn(element, 75, null, 'k');
         assert.equal(element.$.fileCursor.index, 0);
         assert.equal(element.selectedIndex, 0);
+
+        sandbox.stub(element, '_addDraftAtTarget');
+        MockInteractions.pressAndReleaseKeyOn(element, 67, null, 'c');
+        assert.isTrue(element._addDraftAtTarget.called);
       });
 
       test('i key shows/hides selected inline diff', () => {
@@ -411,24 +650,24 @@
         const files = Polymer.dom(element.root).querySelectorAll('.file-row');
         element.$.fileCursor.stops = files;
         element.$.fileCursor.setCursorAtIndex(0);
-        MockInteractions.pressAndReleaseKeyOn(element, 73, null, 'i');
+        MockInteractions.keyUpOn(element, 73, null, 'i');
         flushAsynchronousOperations();
         assert.include(element._expandedFilePaths, element.diffs[0].path);
-        MockInteractions.pressAndReleaseKeyOn(element, 73, null, 'i');
+        MockInteractions.keyUpOn(element, 73, null, 'i');
         flushAsynchronousOperations();
         assert.notInclude(element._expandedFilePaths, element.diffs[0].path);
         element.$.fileCursor.setCursorAtIndex(1);
-        MockInteractions.pressAndReleaseKeyOn(element, 73, null, 'i');
+        MockInteractions.keyUpOn(element, 73, null, 'i');
         flushAsynchronousOperations();
         assert.include(element._expandedFilePaths, element.diffs[1].path);
 
-        MockInteractions.pressAndReleaseKeyOn(element, 73, 'shift', 'i');
+        MockInteractions.keyUpOn(element, 73, 'shift', 'i');
         flushAsynchronousOperations();
         for (const index in element.diffs) {
           if (!element.diffs.hasOwnProperty(index)) { continue; }
           assert.include(element._expandedFilePaths, element.diffs[index].path);
         }
-        MockInteractions.pressAndReleaseKeyOn(element, 73, 'shift', 'i');
+        MockInteractions.keyUpOn(element, 73, 'shift', 'i');
         flushAsynchronousOperations();
         for (const index in element.diffs) {
           if (!element.diffs.hasOwnProperty(index)) { continue; }
@@ -438,21 +677,24 @@
       });
 
       test('r key toggles reviewed flag', () => {
+        const reducer = (accum, file) => file.isReviewed ? ++accum : accum;
+        const getNumReviewed = () => element._files.reduce(reducer, 0);
         flushAsynchronousOperations();
 
         // Default state should be unreviewed.
-        assert.equal(element._reviewed.length, 0);
+        assert.equal(getNumReviewed(), 0);
 
         // Press the review key to toggle it (set the flag).
         MockInteractions.pressAndReleaseKeyOn(element, 82, null, 'r');
-        assert.equal(element._reviewed.length, 1);
+        flushAsynchronousOperations();
+        assert.equal(getNumReviewed(), 1);
 
         // Press the review key to toggle it (clear the flag).
         MockInteractions.pressAndReleaseKeyOn(element, 82, null, 'r');
-        assert.equal(element._reviewed.length, 0);
+        assert.equal(getNumReviewed(), 0);
       });
 
-      suite('_handleOKey', () => {
+      suite('_handleOpenFile', () => {
         let interact;
 
         setup(() => {
@@ -470,7 +712,7 @@
 
             const e = new CustomEvent('fake-keyboard-event', opt_payload);
             sinon.stub(e, 'preventDefault');
-            element._handleOKey(e);
+            element._handleOpenFile(e);
             assert.isTrue(e.preventDefault.called);
             const result = {};
             if (openCursorStub.called) {
@@ -494,10 +736,6 @@
         test('open from diff cursor', () => {
           element._showInlineDiffs = true;
           assert.deepEqual(interact(), {opened_cursor: true});
-
-          // "Show diffs" mode overrides userPrefs.expand_inline_diffs
-          element._userPrefs = {expand_inline_diffs: true};
-          assert.deepEqual(interact(), {opened_cursor: true});
         });
 
         test('expand when user prefers', () => {
@@ -505,123 +743,28 @@
           assert.deepEqual(interact(), {opened_selected: true});
           element._userPrefs = {};
           assert.deepEqual(interact(), {opened_selected: true});
-          element._userPrefs.expand_inline_diffs = true;
-          assert.deepEqual(interact(), {expanded: true});
         });
       });
-    });
 
-    test('comment filtering', () => {
-      const comments = {
-        '/COMMIT_MSG': [
-          {patch_set: 1, message: 'Done', updated: '2017-02-08 16:40:49'},
-          {patch_set: 1, message: 'oh hay', updated: '2017-02-09 16:40:49'},
-          {patch_set: 2, message: 'hello', updated: '2017-02-10 16:40:49'},
-        ],
-        'myfile.txt': [
-          {patch_set: 1, message: 'good news!', updated: '2017-02-08 16:40:49'},
-          {patch_set: 2, message: 'wat!?', updated: '2017-02-09 16:40:49'},
-          {patch_set: 2, message: 'hi', updated: '2017-02-10 16:40:49'},
-        ],
-        'unresolved.file': [
-          {
-            patch_set: 2,
-            message: 'wat!?',
-            updated: '2017-02-09 16:40:49',
-            id: '1',
-            unresolved: true,
-          },
-          {
-            patch_set: 2,
-            message: 'hi',
-            updated: '2017-02-10 16:40:49',
-            id: '2',
-            in_reply_to: '1',
-            unresolved: false,
-          },
-          {
-            patch_set: 2,
-            message: 'good news!',
-            updated: '2017-02-08 16:40:49',
-            id: '3',
-            unresolved: true,
-          },
-        ],
-      };
-      const drafts = {
-        'unresolved.file': [
-          {
-            patch_set: 2,
-            message: 'hi',
-            updated: '2017-02-11 16:40:49',
-            id: '4',
-            in_reply_to: '3',
-            unresolved: false,
-          },
-        ],
-      };
-      assert.equal(
-          element._computeCountString(comments, '1', '/COMMIT_MSG', 'comment'),
-          '2 comments');
-      assert.equal(
-          element._computeCommentsStringMobile(comments, '1', '/COMMIT_MSG'),
-          '2c');
-      assert.equal(
-          element._computeDraftsStringMobile(comments, '1', '/COMMIT_MSG'),
-          '2d');
-      assert.equal(
-          element._computeCountString(comments, '1', 'myfile.txt', 'comment'),
-          '1 comment');
-      assert.equal(
-          element._computeCommentsStringMobile(comments, '1', 'myfile.txt'),
-          '1c');
-      assert.equal(
-          element._computeDraftsStringMobile(comments, '1', 'myfile.txt'),
-          '1d');
-      assert.equal(
-          element._computeCountString(comments, '1',
-              'file_added_in_rev2.txt', 'comment'), '');
-      assert.equal(
-          element._computeCommentsStringMobile(comments, '1',
-              'file_added_in_rev2.txt'), '');
-      assert.equal(
-          element._computeDraftsStringMobile(comments, '1',
-              'file_added_in_rev2.txt'), '');
-      assert.equal(
-          element._computeCountString(comments, '2', '/COMMIT_MSG', 'comment'),
-          '1 comment');
-      assert.equal(
-          element._computeCommentsStringMobile(comments, '2', '/COMMIT_MSG'),
-          '1c');
-      assert.equal(
-          element._computeDraftsStringMobile(comments, '2', '/COMMIT_MSG'),
-          '1d');
-      assert.equal(
-          element._computeCountString(comments, '2', 'myfile.txt', 'comment'),
-          '2 comments');
-      assert.equal(
-          element._computeCommentsStringMobile(comments, '2', 'myfile.txt'),
-          '2c');
-      assert.equal(
-          element._computeDraftsStringMobile(comments, '2', 'myfile.txt'),
-          '2d');
-      assert.equal(
-          element._computeCountString(comments, '2',
-              'file_added_in_rev2.txt', 'comment'), '');
-      assert.equal(element._computeCountString(comments, '2',
-          'unresolved.file', 'comment'), '3 comments');
-      assert.equal(
-          element._computeUnresolvedString(comments, [], 2, 'myfile.txt'), '');
-      assert.equal(
-          element.computeUnresolvedNum(comments, [], 2, 'myfile.txt'), 0);
-      assert.equal(
-          element._computeUnresolvedString(comments, [], 2, 'unresolved.file'),
-          '(1 unresolved)');
-      assert.equal(
-          element.computeUnresolvedNum(comments, [], 2, 'unresolved.file'), 1);
-      assert.equal(
-          element._computeUnresolvedString(comments, drafts, 2,
-              'unresolved.file'), '');
+      test('shift+left/shift+right', () => {
+        const moveLeftStub = sandbox.stub(element.$.diffCursor, 'moveLeft');
+        const moveRightStub = sandbox.stub(element.$.diffCursor, 'moveRight');
+
+        let noDiffsExpanded = true;
+        sandbox.stub(element, '_noDiffsExpanded', () => noDiffsExpanded);
+
+        MockInteractions.pressAndReleaseKeyOn(element, 73, 'shift', 'left');
+        assert.isFalse(moveLeftStub.called);
+        MockInteractions.pressAndReleaseKeyOn(element, 73, 'shift', 'right');
+        assert.isFalse(moveRightStub.called);
+
+        noDiffsExpanded = false;
+
+        MockInteractions.pressAndReleaseKeyOn(element, 73, 'shift', 'left');
+        assert.isTrue(moveLeftStub.called);
+        MockInteractions.pressAndReleaseKeyOn(element, 73, 'shift', 'right');
+        assert.isTrue(moveRightStub.called);
+      });
     });
 
     test('computed properties', () => {
@@ -635,12 +778,12 @@
     });
 
     test('file review status', () => {
-      element._files = [
-        {__path: '/COMMIT_MSG'},
-        {__path: 'file_added_in_rev2.txt'},
-        {__path: 'myfile.txt'},
-      ];
       element._reviewed = ['/COMMIT_MSG', 'myfile.txt'];
+      element._filesByPath = {
+        '/COMMIT_MSG': {},
+        'file_added_in_rev2.txt': {},
+        'myfile.txt': {},
+      };
       element._loggedIn = true;
       element.changeNum = '42';
       element.patchRange = {
@@ -680,12 +823,80 @@
       assert.isTrue(tapSpy.lastCall.args[0].defaultPrevented);
     });
 
+    test('_computeFileStatusLabel', () => {
+      assert.equal(element._computeFileStatusLabel('A'), 'Added');
+      assert.equal(element._computeFileStatusLabel('M'), 'Modified');
+    });
+
+    test('_handleFileListTap', () => {
+      element._filesByPath = {
+        '/COMMIT_MSG': {},
+        'f1.txt': {},
+        'f2.txt': {},
+      };
+      element.changeNum = '42';
+      element.patchRange = {
+        basePatchNum: 'PARENT',
+        patchNum: '2',
+      };
+
+      const tapSpy = sandbox.spy(element, '_handleFileListTap');
+      const reviewStub = sandbox.stub(element, '_reviewFile');
+      const toggleExpandSpy = sandbox.spy(element, '_togglePathExpanded');
+
+      const row = Polymer.dom(element.root)
+          .querySelector('.row[data-path="f1.txt"]');
+
+      // Click on the expand button, resulting in _togglePathExpanded being
+      // called and not resulting in a call to _reviewFile.
+      row.querySelector('div.show-hide').click();
+      assert.isTrue(tapSpy.calledOnce);
+      assert.isTrue(toggleExpandSpy.calledOnce);
+      assert.isFalse(reviewStub.called);
+
+      // Click inside the diff. This should result in no additional calls to
+      // _togglePathExpanded or _reviewFile.
+      Polymer.dom(element.root).querySelector('gr-diff-host').click();
+      assert.isTrue(tapSpy.calledTwice);
+      assert.isTrue(toggleExpandSpy.calledOnce);
+      assert.isFalse(reviewStub.called);
+
+      // Click the reviewed checkbox, resulting in a call to _reviewFile, but
+      // no additional call to _togglePathExpanded.
+      row.querySelector('.markReviewed').click();
+      assert.isTrue(tapSpy.calledThrice);
+      assert.isTrue(toggleExpandSpy.calledOnce);
+      assert.isTrue(reviewStub.calledOnce);
+    });
+
+    test('_handleFileListTap editMode', () => {
+      element._filesByPath = {
+        '/COMMIT_MSG': {},
+        'f1.txt': {},
+        'f2.txt': {},
+      };
+      element.changeNum = '42';
+      element.patchRange = {
+        basePatchNum: 'PARENT',
+        patchNum: '2',
+      };
+      element.editMode = true;
+      flushAsynchronousOperations();
+      const tapSpy = sandbox.spy(element, '_handleFileListTap');
+      const toggleExpandSpy = sandbox.spy(element, '_togglePathExpanded');
+
+      // Tap the edit controls. Should be ignored by _handleFileListTap.
+      MockInteractions.tap(element.$$('.editFileControls'));
+      assert.isTrue(tapSpy.calledOnce);
+      assert.isFalse(toggleExpandSpy.called);
+    });
+
     test('patch set from revisions', () => {
       const expected = [
-        {num: 1, desc: 'test'},
-        {num: 2, desc: 'test'},
-        {num: 3, desc: 'test'},
         {num: 4, desc: 'test'},
+        {num: 3, desc: 'test'},
+        {num: 2, desc: 'test'},
+        {num: 1, desc: 'test'},
       ];
       const patchNums = element.computeAllPatchSets({
         revisions: {
@@ -702,9 +913,9 @@
     });
 
     test('checkbox shows/hides diff inline', () => {
-      element._files = [
-        {__path: 'myfile.txt'},
-      ];
+      element._filesByPath = {
+        'myfile.txt': {},
+      };
       element.changeNum = '42';
       element.patchRange = {
         basePatchNum: 'PARENT',
@@ -727,9 +938,9 @@
     });
 
     test('diff mode correctly toggles the diffs', () => {
-      element._files = [
-        {__path: 'myfile.txt'},
-      ];
+      element._filesByPath = {
+        'myfile.txt': {},
+      };
       element.changeNum = '42';
       element.patchRange = {
         basePatchNum: 'PARENT',
@@ -752,18 +963,17 @@
       assert.isTrue(element._updateDiffPreferences.called);
     });
 
-
     test('expanded attribute not set on path when not expanded', () => {
-      element._files = [
-        {__path: '/COMMIT_MSG'},
-      ];
+      element._filesByPath = {
+        '/COMMIT_MSG': {},
+      };
       assert.isNotOk(element.$$('.expanded'));
     });
 
-    test('expand_inline_diffs user preference', () => {
-      element._files = [
-        {__path: '/COMMIT_MSG'},
-      ];
+    test('tapping row ignores links', () => {
+      element._filesByPath = {
+        '/COMMIT_MSG': {},
+      };
       element.changeNum = '42';
       element.patchRange = {
         basePatchNum: 'PARENT',
@@ -772,7 +982,7 @@
       sandbox.stub(element, '_expandedPathsChanged');
       flushAsynchronousOperations();
       const commitMsgFile = Polymer.dom(element.root)
-          .querySelectorAll('.row:not(.header) a')[0];
+          .querySelectorAll('.row:not(.header) a.pathLink')[0];
 
       // Remove href attribute so the app doesn't route to a diff view
       commitMsgFile.removeAttribute('href');
@@ -782,50 +992,53 @@
       flushAsynchronousOperations();
       assert(togglePathSpy.notCalled, 'file is opened as diff view');
       assert.isNotOk(element.$$('.expanded'));
-
-      element._userPrefs = {expand_inline_diffs: true};
-      flushAsynchronousOperations();
-      MockInteractions.tap(commitMsgFile);
-      flushAsynchronousOperations();
-      assert(togglePathSpy.calledOnce, 'file is expanded');
-      assert.isOk(element.$$('.expanded'));
+      assert.notEqual(getComputedStyle(element.$$('.show-hide')).display,
+          'none');
     });
 
     test('_togglePathExpanded', () => {
       const path = 'path/to/my/file.txt';
-      element.files = [{__path: path}];
-      const renderStub = sandbox.stub(element, '_renderInOrder')
-          .returns(Promise.resolve());
+      element._filesByPath = {[path]: {}};
+      const renderSpy = sandbox.spy(element, '_renderInOrder');
+      const collapseStub = sandbox.stub(element, '_clearCollapsedDiffs');
 
+      assert.equal(element.$$('iron-icon').icon, 'gr-icons:expand-more');
       assert.equal(element._expandedFilePaths.length, 0);
       element._togglePathExpanded(path);
       flushAsynchronousOperations();
+      assert.equal(collapseStub.lastCall.args[0].length, 0);
+      assert.equal(element.$$('iron-icon').icon, 'gr-icons:expand-less');
 
-      assert.equal(renderStub.callCount, 1);
+      assert.equal(renderSpy.callCount, 1);
       assert.include(element._expandedFilePaths, path);
       element._togglePathExpanded(path);
       flushAsynchronousOperations();
 
-      assert.equal(renderStub.callCount, 2);
+      assert.equal(element.$$('iron-icon').icon, 'gr-icons:expand-more');
+      assert.equal(renderSpy.callCount, 1);
       assert.notInclude(element._expandedFilePaths, path);
+      assert.equal(collapseStub.lastCall.args[0].length, 1);
     });
 
-    test('collapseAllDiffs', () => {
-      sandbox.stub(element, '_renderInOrder')
-          .returns(Promise.resolve());
+    test('expandAllDiffs and collapseAllDiffs', () => {
+      const collapseStub = sandbox.stub(element, '_clearCollapsedDiffs');
       const cursorUpdateStub = sandbox.stub(element.$.diffCursor,
           'handleDiffUpdate');
 
       const path = 'path/to/my/file.txt';
-      element.files = [{__path: path}];
-      element._expandedFilePaths = [path];
-      element._showInlineDiffs = true;
+      element._filesByPath = {[path]: {}};
+      element.expandAllDiffs();
+      flushAsynchronousOperations();
+      assert.isTrue(element._showInlineDiffs);
+      assert.isTrue(cursorUpdateStub.calledOnce);
+      assert.equal(collapseStub.lastCall.args[0].length, 0);
 
       element.collapseAllDiffs();
       flushAsynchronousOperations();
       assert.equal(element._expandedFilePaths.length, 0);
       assert.isFalse(element._showInlineDiffs);
-      assert.isTrue(cursorUpdateStub.calledOnce);
+      assert.isTrue(cursorUpdateStub.calledTwice);
+      assert.equal(collapseStub.lastCall.args[0].length, 1);
     });
 
     test('_expandedPathsChanged', done => {
@@ -836,6 +1049,9 @@
         reload() {
           done();
         },
+        cancel() {},
+        getCursorStops() { return []; },
+        addEventListener(eventName, callback) { callback(new Event(eventName)); },
       }];
       sinon.stub(element, 'diffs', {
         get() { return diffs; },
@@ -843,39 +1059,40 @@
       element.push('_expandedFilePaths', path);
     });
 
-    suite('_handleFileListTap', () => {
-      function testForModifier(modifier) {
-        const e = {preventDefault() {}};
-        e.detail = {sourceEvent: {}};
-        e.target = {
-          dataset: {path: '/test'},
-          classList: element.classList,
-        };
+    test('_clearCollapsedDiffs', () => {
+      const diff = {
+        cancel: sinon.stub(),
+        clearDiffContent: sinon.stub(),
+      };
+      element._clearCollapsedDiffs([diff]);
+      assert.isTrue(diff.cancel.calledOnce);
+      assert.isTrue(diff.clearDiffContent.calledOnce);
+    });
 
-        e.detail.sourceEvent[modifier] = true;
-
-        const togglePathStub = sandbox.stub(element, '_togglePathExpanded');
-        element._userPrefs = {expand_inline_diffs: true};
-
-        element._handleFileListTap(e);
-        assert.isFalse(togglePathStub.called);
-
-        e.detail.sourceEvent[modifier] = false;
-        element._handleFileListTap(e);
-        assert.equal(togglePathStub.callCount, 1);
-
-        element._userPrefs = {expand_inline_diffs: false};
-        element._handleFileListTap(e);
-        assert.equal(togglePathStub.callCount, 1);
-      }
-
-      test('_handleFileListTap meta', () => {
-        testForModifier('metaKey');
-      });
-
-      test('_handleFileListTap ctrl', () => {
-        testForModifier('ctrlKey');
-      });
+    test('filesExpanded value updates to correct enum', () => {
+      element._filesByPath = {
+        'foo.bar': {},
+        'baz.bar': {},
+      };
+      flushAsynchronousOperations();
+      assert.equal(element.filesExpanded,
+          GrFileListConstants.FilesExpandedState.NONE);
+      element.push('_expandedFilePaths', 'baz.bar');
+      flushAsynchronousOperations();
+      assert.equal(element.filesExpanded,
+          GrFileListConstants.FilesExpandedState.SOME);
+      element.push('_expandedFilePaths', 'foo.bar');
+      flushAsynchronousOperations();
+      assert.equal(element.filesExpanded,
+          GrFileListConstants.FilesExpandedState.ALL);
+      element.collapseAllDiffs();
+      flushAsynchronousOperations();
+      assert.equal(element.filesExpanded,
+          GrFileListConstants.FilesExpandedState.NONE);
+      element.expandAllDiffs();
+      flushAsynchronousOperations();
+      assert.equal(element.filesExpanded,
+          GrFileListConstants.FilesExpandedState.ALL);
     });
 
     test('_renderInOrder', done => {
@@ -903,13 +1120,13 @@
       element._renderInOrder(['p2', 'p1', 'p0'], diffs, 3)
           .then(() => {
             assert.isFalse(reviewStub.called);
-            assert.isTrue(loadCommentStub.called);
+            assert.isTrue(loadCommentSpy.called);
             done();
           });
     });
 
     test('_renderInOrder logged in', done => {
-      element._isLoggedIn = true;
+      element._loggedIn = true;
       const reviewStub = sandbox.stub(element, '_reviewFile');
       let callCount = 0;
       const diffs = [{
@@ -941,10 +1158,30 @@
           });
     });
 
+    test('_renderInOrder respects diffPrefs.manual_review', () => {
+      element._loggedIn = true;
+      element.diffPrefs = {manual_review: true};
+      const reviewStub = sandbox.stub(element, '_reviewFile');
+      const diffs = [{
+        path: 'p',
+        reload() { return Promise.resolve(); },
+      }];
+
+      return element._renderInOrder(['p'], diffs, 1).then(() => {
+        assert.isFalse(reviewStub.called);
+        delete element.diffPrefs.manual_review;
+        return element._renderInOrder(['p'], diffs, 1).then(() => {
+          assert.isTrue(reviewStub.called);
+          assert.isTrue(reviewStub.calledWithExactly('p', true));
+        });
+      });
+    });
+
     test('_loadingChanged fired from reload in debouncer', done => {
+      sandbox.stub(element, '_getReviewedFiles').returns(Promise.resolve([]));
       element.changeNum = 123;
       element.patchRange = {patchNum: 12};
-      element._files = [{__path: 'foo.bar'}];
+      element._filesByPath = {'foo.bar': {}};
 
       element.reload().then(() => {
         assert.isFalse(element._loading);
@@ -959,6 +1196,7 @@
     });
 
     test('_loadingChanged does not set class when there are no files', () => {
+      sandbox.stub(element, '_getReviewedFiles').returns(Promise.resolve([]));
       element.changeNum = 123;
       element.patchRange = {patchNum: 12};
       element.reload();
@@ -971,7 +1209,8 @@
       const urlStub = sandbox.stub(element, '_computeDiffURL');
       element.change = {_number: 123};
       element.patchRange = {patchNum: undefined, basePatchNum: 'PARENT'};
-      element._files = [{__path: 'foo/bar.cpp'}];
+      element._filesByPath = {'foo/bar.cpp': {}};
+      element.editMode = false;
       flush(() => {
         assert.isFalse(urlStub.called);
         element.set('patchRange.patchNum', 4);
@@ -981,18 +1220,178 @@
         });
       });
     });
+
+    suite('size bars', () => {
+      test('_computeSizeBarLayout', () => {
+        assert.isUndefined(element._computeSizeBarLayout(null));
+        assert.isUndefined(element._computeSizeBarLayout({}));
+        assert.deepEqual(element._computeSizeBarLayout({base: []}), {
+          maxInserted: 0,
+          maxDeleted: 0,
+          maxAdditionWidth: 0,
+          maxDeletionWidth: 0,
+          deletionOffset: 0,
+        });
+
+        const files = [
+          {__path: '/COMMIT_MSG', lines_inserted: 10000},
+          {__path: 'foo', lines_inserted: 4, lines_deleted: 10},
+          {__path: 'bar', lines_inserted: 5, lines_deleted: 8},
+        ];
+        const layout = element._computeSizeBarLayout({base: files});
+        assert.equal(layout.maxInserted, 5);
+        assert.equal(layout.maxDeleted, 10);
+      });
+
+      test('_computeBarAdditionWidth', () => {
+        const file = {
+          __path: 'foo/bar.baz',
+          lines_inserted: 5,
+          lines_deleted: 0,
+        };
+        const stats = {
+          maxInserted: 10,
+          maxDeleted: 0,
+          maxAdditionWidth: 60,
+          maxDeletionWidth: 0,
+          deletionOffset: 60,
+        };
+
+        // Uses half the space when file is half the largest addition and there
+        // are no deletions.
+        assert.equal(element._computeBarAdditionWidth(file, stats), 30);
+
+        // If there are no insetions, there is no width.
+        stats.maxInserted = 0;
+        assert.equal(element._computeBarAdditionWidth(file, stats), 0);
+
+        // If the insertions is not present on the file, there is no width.
+        stats.maxInserted = 10;
+        file.lines_inserted = undefined;
+        assert.equal(element._computeBarAdditionWidth(file, stats), 0);
+
+        // If the file is a commit message, returns zero.
+        file.lines_inserted = 5;
+        file.__path = '/COMMIT_MSG';
+        assert.equal(element._computeBarAdditionWidth(file, stats), 0);
+
+        // Width bottoms-out at the minimum width.
+        file.__path = 'stuff.txt';
+        file.lines_inserted = 1;
+        stats.maxInserted = 1000000;
+        assert.equal(element._computeBarAdditionWidth(file, stats), 1.5);
+      });
+
+      test('_computeBarAdditionX', () => {
+        const file = {
+          __path: 'foo/bar.baz',
+          lines_inserted: 5,
+          lines_deleted: 0,
+        };
+        const stats = {
+          maxInserted: 10,
+          maxDeleted: 0,
+          maxAdditionWidth: 60,
+          maxDeletionWidth: 0,
+          deletionOffset: 60,
+        };
+        assert.equal(element._computeBarAdditionX(file, stats), 30);
+      });
+
+      test('_computeBarDeletionWidth', () => {
+        const file = {
+          __path: 'foo/bar.baz',
+          lines_inserted: 0,
+          lines_deleted: 5,
+        };
+        const stats = {
+          maxInserted: 10,
+          maxDeleted: 10,
+          maxAdditionWidth: 30,
+          maxDeletionWidth: 30,
+          deletionOffset: 31,
+        };
+
+        // Uses a quarter the space when file is half the largest deletions and
+        // there are equal additions.
+        assert.equal(element._computeBarDeletionWidth(file, stats), 15);
+
+        // If there are no deletions, there is no width.
+        stats.maxDeleted = 0;
+        assert.equal(element._computeBarDeletionWidth(file, stats), 0);
+
+        // If the deletions is not present on the file, there is no width.
+        stats.maxDeleted = 10;
+        file.lines_deleted = undefined;
+        assert.equal(element._computeBarDeletionWidth(file, stats), 0);
+
+        // If the file is a commit message, returns zero.
+        file.lines_deleted = 5;
+        file.__path = '/COMMIT_MSG';
+        assert.equal(element._computeBarDeletionWidth(file, stats), 0);
+
+        // Width bottoms-out at the minimum width.
+        file.__path = 'stuff.txt';
+        file.lines_deleted = 1;
+        stats.maxDeleted = 1000000;
+        assert.equal(element._computeBarDeletionWidth(file, stats), 1.5);
+      });
+
+      test('_computeSizeBarsClass', () => {
+        assert.equal(element._computeSizeBarsClass(false, 'foo/bar.baz'),
+            'sizeBars desktop hide');
+        assert.equal(element._computeSizeBarsClass(true, '/COMMIT_MSG'),
+            'sizeBars desktop invisible');
+        assert.equal(element._computeSizeBarsClass(true, 'foo/bar.baz'),
+            'sizeBars desktop ');
+      });
+    });
   });
 
   suite('gr-file-list inline diff tests', () => {
     let element;
     let sandbox;
 
+    const commitMsgComments = [
+      {
+        patch_set: 2,
+        id: 'ecf0b9fa_fe1a5f62',
+        line: 20,
+        updated: '2018-02-08 18:49:18.000000000',
+        message: 'another comment',
+        unresolved: true,
+      },
+      {
+        patch_set: 2,
+        id: '503008e2_0ab203ee',
+        line: 10,
+        updated: '2018-02-14 22:07:43.000000000',
+        message: 'response',
+        unresolved: true,
+      },
+      {
+        patch_set: 2,
+        id: 'cc788d2c_cb1d728c',
+        line: 20,
+        in_reply_to: 'ecf0b9fa_fe1a5f62',
+        updated: '2018-02-13 22:07:43.000000000',
+        message: 'a comments',
+        unresolved: true,
+      },
+    ];
+
     const setupDiff = function(diff) {
       const mock = document.createElement('mock-diff-response');
-      diff._diff = mock.diffResponse;
       diff.comments = {
-        left: [],
+        left: diff.path === '/COMMIT_MSG' ? commitMsgComments : [],
         right: [],
+        meta: {
+          changeNum: 1,
+          patchRange: {
+            basePatchNum: 'PARENT',
+            patchNum: 2,
+          },
+        },
       };
       diff.prefs = {
         context: 10,
@@ -1010,12 +1409,12 @@
         theme: 'DEFAULT',
         ignore_whitespace: 'IGNORE_NONE',
       };
-      diff._renderDiffTable();
+      diff._diff = mock.diffResponse;
     };
 
     const renderAndGetNewDiffs = function(index) {
       const diffs =
-          Polymer.dom(element.root).querySelectorAll('gr-diff');
+          Polymer.dom(element.root).querySelectorAll('gr-diff-host');
 
       for (let i = index; i < diffs.length; i++) {
         setupDiff(diffs[i]);
@@ -1026,43 +1425,56 @@
       return diffs;
     };
 
-    setup(() => {
+    setup(done => {
       sandbox = sinon.sandbox.create();
       stub('gr-rest-api-interface', {
         getLoggedIn() { return Promise.resolve(true); },
         getPreferences() { return Promise.resolve({}); },
+        getDiffComments() { return Promise.resolve({}); },
+        getDiffRobotComments() { return Promise.resolve({}); },
+        getDiffDrafts() { return Promise.resolve({}); },
       });
       stub('gr-date-formatter', {
         _loadTimeFormat() { return Promise.resolve(''); },
       });
-      stub('gr-diff', {
+      stub('gr-diff-host', {
         reload() { return Promise.resolve(); },
       });
-      stub('gr-comment-api', {
-        loadAll() { return Promise.resolve(); },
-        getPaths() { return {}; },
-        getCommentsForPath() { return {meta: {}, left: [], right: []}; },
+
+      // Element must be wrapped in an element with direct access to the
+      // comment API.
+      commentApiWrapper = fixture('basic');
+      element = commentApiWrapper.$.fileList;
+      loadCommentSpy = sandbox.spy(commentApiWrapper.$.commentAPI, 'loadAll');
+      element.diffPrefs = {};
+      sandbox.stub(element, '_reviewFile');
+
+      // Stub methods on the changeComments object after changeComments has
+      // been initalized.
+      commentApiWrapper.loadComments().then(() => {
+        sandbox.stub(element.changeComments, 'getPaths').returns({});
+        sandbox.stub(element.changeComments, 'getCommentsBySideForPath')
+            .returns({meta: {}, left: [], right: []});
+        done();
       });
-      element = fixture('basic');
+      element._loading = false;
       element.numFilesShown = 75;
       element.selectedIndex = 0;
-      element._files = [
-        {__path: '/COMMIT_MSG', lines_inserted: 9},
-        {
-          __path: 'file_added_in_rev2.txt',
+      element._filesByPath = {
+        '/COMMIT_MSG': {lines_inserted: 9},
+        'file_added_in_rev2.txt': {
           lines_inserted: 1,
           lines_deleted: 1,
           size_delta: 10,
           size: 100,
         },
-        {
-          __path: 'myfile.txt',
+        'myfile.txt': {
           lines_inserted: 1,
           lines_deleted: 1,
           size_delta: 10,
           size: 100,
         },
-      ];
+      };
       element._reviewed = ['/COMMIT_MSG', 'myfile.txt'];
       element._loggedIn = true;
       element.changeNum = '42';
@@ -1081,7 +1493,7 @@
     });
 
     test('cursor with individually opened files', () => {
-      MockInteractions.pressAndReleaseKeyOn(element, 73, null, 'i');
+      MockInteractions.keyUpOn(element, 73, null, 'i');
       flushAsynchronousOperations();
       let diffs = renderAndGetNewDiffs(0);
       const diffStops = diffs[0].getCursorStops();
@@ -1107,7 +1519,7 @@
 
       // The file cusor is now at 1.
       assert.equal(element.$.fileCursor.index, 1);
-      MockInteractions.pressAndReleaseKeyOn(element, 73, null, 'i');
+      MockInteractions.keyUpOn(element, 73, null, 'i');
       flushAsynchronousOperations();
 
       diffs = renderAndGetNewDiffs(1);
@@ -1122,7 +1534,7 @@
     });
 
     test('cursor with toggle all files', () => {
-      MockInteractions.pressAndReleaseKeyOn(element, 73, 'shift', 'i');
+      MockInteractions.keyUpOn(element, 73, 'shift', 'i');
       flushAsynchronousOperations();
 
       const diffs = renderAndGetNewDiffs(0);
@@ -1156,9 +1568,10 @@
       let nextCommentStub;
       let nextChunkStub;
       let fileRows;
+
       setup(() => {
         sandbox.stub(element, '_renderInOrder').returns(Promise.resolve());
-        nKeySpy = sandbox.spy(element, '_handleNKey');
+        nKeySpy = sandbox.spy(element, '_handleNextChunk');
         nextCommentStub = sandbox.stub(element.$.diffCursor,
             'moveToNextCommentThread');
         nextChunkStub = sandbox.stub(element.$.diffCursor,
@@ -1166,9 +1579,11 @@
         fileRows =
             Polymer.dom(element.root).querySelectorAll('.row:not(.header)');
       });
-      test('n key with all files expanded and no shift key', () => {
-        MockInteractions.pressAndReleaseKeyOn(fileRows[0], 73, null, 'i');
+
+      test('n key with some files expanded and no shift key', () => {
+        MockInteractions.keyUpOn(fileRows[0], 73, null, 'i');
         flushAsynchronousOperations();
+        assert.equal(nextChunkStub.callCount, 1);
 
         // Handle N key should return before calling diff cursor functions.
         MockInteractions.pressAndReleaseKeyOn(element, 78, null, 'n');
@@ -1176,25 +1591,26 @@
         assert.isFalse(nextCommentStub.called);
 
         // This is also called in diffCursor.moveToFirstChunk.
-        assert.equal(nextChunkStub.callCount, 1);
-        assert.isFalse(!!element._showInlineDiffs);
+        assert.equal(nextChunkStub.callCount, 2);
+        assert.equal(element.filesExpanded, 'some');
       });
 
-      test('n key with all files expanded and shift key', () => {
-        MockInteractions.pressAndReleaseKeyOn(fileRows[0], 73, null, 'i');
+      test('n key with some files expanded and shift key', () => {
+        MockInteractions.keyUpOn(fileRows[0], 73, null, 'i');
         flushAsynchronousOperations();
+        assert.equal(nextChunkStub.callCount, 1);
 
         MockInteractions.pressAndReleaseKeyOn(element, 78, 'shift', 'n');
         assert.isTrue(nKeySpy.called);
-        assert.isFalse(nextCommentStub.called);
+        assert.isTrue(nextCommentStub.called);
 
         // This is also called in diffCursor.moveToFirstChunk.
         assert.equal(nextChunkStub.callCount, 1);
-        assert.isFalse(!!element._showInlineDiffs);
+        assert.equal(element.filesExpanded, 'some');
       });
 
       test('n key without all files expanded and shift key', () => {
-        MockInteractions.pressAndReleaseKeyOn(fileRows[0], 73, 'shift', 'i');
+        MockInteractions.keyUpOn(fileRows[0], 73, 'shift', 'i');
         flushAsynchronousOperations();
 
         MockInteractions.pressAndReleaseKeyOn(element, 78, null, 'n');
@@ -1207,7 +1623,7 @@
       });
 
       test('n key without all files expanded and no shift key', () => {
-        MockInteractions.pressAndReleaseKeyOn(fileRows[0], 73, 'shift', 'i');
+        MockInteractions.keyUpOn(fileRows[0], 73, 'shift', 'i');
         flushAsynchronousOperations();
 
         MockInteractions.pressAndReleaseKeyOn(element, 78, 'shift', 'n');
@@ -1221,14 +1637,14 @@
     });
 
     test('_openSelectedFile behavior', () => {
-      const _files = element._files;
-      element.set('_files', []);
+      const _filesByPath = element._filesByPath;
+      element.set('_filesByPath', {});
       const navStub = sandbox.stub(Gerrit.Nav, 'navigateToDiff');
       // Noop when there are no files.
       element._openSelectedFile();
       assert.isFalse(navStub.called);
 
-      element.set('_files', _files);
+      element.set('_filesByPath', _filesByPath);
       flushAsynchronousOperations();
        // Navigates when a file is selected.
       element._openSelectedFile();
@@ -1242,11 +1658,11 @@
       const mockEvent = {preventDefault() {}};
 
       element._displayLine = false;
-      element._handleDownKey(mockEvent);
+      element._handleCursorNext(mockEvent);
       assert.isTrue(element._displayLine);
 
       element._displayLine = false;
-      element._handleUpKey(mockEvent);
+      element._handleCursorPrev(mockEvent);
       assert.isTrue(element._displayLine);
 
       element._displayLine = true;
@@ -1254,42 +1670,135 @@
       assert.isFalse(element._displayLine);
     });
 
-    suite('editLoaded behavior', () => {
-      const isVisible = el => {
-        assert.ok(el);
-        return getComputedStyle(el).getPropertyValue('display') !== 'none';
-      };
-
+    suite('editMode behavior', () => {
       test('reviewed checkbox', () => {
-        const alertStub = sandbox.stub();
+        element._reviewFile.restore();
         const saveReviewStub = sandbox.stub(element, '_saveReviewedState');
 
-        element.addEventListener('show-alert', alertStub);
-        element.editLoaded = false;
-        // Reviewed checkbox should be shown.
-        assert.isTrue(isVisible(element.$$('.reviewed')));
+        element.editMode = false;
         MockInteractions.pressAndReleaseKeyOn(element, 82, null, 'r');
-        assert.isFalse(alertStub.called);
         assert.isTrue(saveReviewStub.calledOnce);
 
-        element.editLoaded = true;
+        element.editMode = true;
         flushAsynchronousOperations();
 
-        assert.isFalse(isVisible(element.$$('.reviewed')));
         MockInteractions.pressAndReleaseKeyOn(element, 82, null, 'r');
-        assert.isTrue(alertStub.called);
         assert.isTrue(saveReviewStub.calledOnce);
       });
 
       test('_getReviewedFiles does not call API', () => {
         const apiSpy = sandbox.spy(element.$.restAPI, 'getReviewedFiles');
-        element.editLoaded = true;
+        element.editMode = true;
         return element._getReviewedFiles().then(files => {
           assert.equal(files.length, 0);
           assert.isFalse(apiSpy.called);
         });
       });
     });
+
+    test('editing actions', () => {
+      // Edit controls are guarded behind a dom-if initially and not rendered.
+      assert.isNotOk(Polymer.dom(element.root)
+          .querySelector('gr-edit-file-controls'));
+
+      element.editMode = true;
+      flushAsynchronousOperations();
+
+      // Commit message should not have edit controls.
+      const editControls =
+          Polymer.dom(element.root).querySelectorAll('.row:not(.header)')
+            .map(row => row.querySelector('gr-edit-file-controls'));
+      assert.isTrue(editControls[0].classList.contains('invisible'));
+    });
+
+    test('reloadCommentsForThreadWithRootId', () => {
+      const commentStub =
+          sandbox.stub(element.changeComments, 'getCommentsForThread');
+      const commentStubRes1 = [
+        {
+          patch_set: 2,
+          id: 'ecf0b9fa_fe1a5f62',
+          line: 20,
+          updated: '2018-02-08 18:49:18.000000000',
+          message: 'another comment',
+          unresolved: true,
+        },
+        {
+          patch_set: 2,
+          id: '503008e2_0ab203ee',
+          line: 10,
+          updated: '2018-02-14 22:07:43.000000000',
+          message: 'response',
+          unresolved: true,
+        },
+        {
+          patch_set: 2,
+          id: '503008e2_0ab203ef',
+          line: 20,
+          in_reply_to: 'ecf0b9fa_fe1a5f62',
+          updated: '2018-02-15 22:07:43.000000000',
+          message: 'a third comment in the thread',
+          unresolved: true,
+        },
+      ];
+      const commentStubRes2 = [
+        {
+          patch_set: 2,
+          id: 'ecf0b9fa_fe1a5f62',
+          line: 20,
+          updated: '2018-02-08 18:49:18.000000000',
+          message: 'edited text',
+          unresolved: false,
+        },
+      ];
+      commentStub.withArgs('cc788d2c_cb1d728c').returns(
+          commentStubRes1);
+      commentStub.withArgs('ecf0b9fa_fe1a5f62').returns(
+          commentStubRes2);
+      // Expand the commit message diff
+      MockInteractions.keyUpOn(element, 73, 'shift', 'i');
+      const diffs = renderAndGetNewDiffs(0);
+      flushAsynchronousOperations();
+
+      // Two comment threads sould be generated
+      const commentThreadEls = diffs[0].getThreadEls();
+      assert(commentThreadEls[0].comments.length, 2);
+      assert(commentThreadEls[1].comments.length, 1);
+      assert.isTrue(commentThreadEls[1].comments[0].unresolved);
+      assert.equal(commentThreadEls[1].comments[0].message, 'another comment');
+
+      // Reload comments from the first comment thread, which should have a new
+      // reply.
+      element.reloadCommentsForThreadWithRootId('cc788d2c_cb1d728c',
+          '/COMMIT_MSG');
+      assert(commentThreadEls[0].comments.length, 3);
+
+
+      // Reload comments from the first comment thread, which should have a
+      // an updated message and a toggled resolve state.
+      element.reloadCommentsForThreadWithRootId('ecf0b9fa_fe1a5f62',
+          '/COMMIT_MSG');
+      assert(commentThreadEls[1].comments.length, 1);
+      assert.isFalse(commentThreadEls[1].comments[0].unresolved);
+      assert.equal(commentThreadEls[1].comments[0].message, 'edited text');
+
+      const commentStubCount = commentStub.callCount;
+      const getThreadsSpy = sandbox.spy(diffs[0], 'getThreadEls');
+
+      // Should not be getting threadss when the file is not expanded.
+      element.reloadCommentsForThreadWithRootId('ecf0b9fa_fe1a5f62',
+          'other/file');
+      assert.isFalse(getThreadsSpy.called);
+      assert.equal(commentStubCount, commentStub.callCount);
+
+      // Should be query selecting diffs when the file is expanded.
+      // Should not be fetching change comments when the rootId is not found
+      // to match.
+      element.reloadCommentsForThreadWithRootId('acf0b9fa_fe1a5f62',
+          '/COMMIT_MSG');
+      assert.isTrue(getThreadsSpy.called);
+      assert.equal(commentStubCount, commentStub.callCount);
+    });
   });
   a11ySuite('basic');
 </script>
diff --git a/polygerrit-ui/app/elements/change/gr-included-in-dialog/gr-included-in-dialog.html b/polygerrit-ui/app/elements/change/gr-included-in-dialog/gr-included-in-dialog.html
index c3d5808..b824f1c 100644
--- a/polygerrit-ui/app/elements/change/gr-included-in-dialog/gr-included-in-dialog.html
+++ b/polygerrit-ui/app/elements/change/gr-included-in-dialog/gr-included-in-dialog.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2018 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -22,14 +23,15 @@
   <template>
     <style include="shared-styles">
       :host {
+        background-color: var(--dialog-background-color);
         display: block;
         max-height: 80vh;
         overflow-y: auto;
         padding: 4.5em 1em 1em 1em;
       }
       header {
-        background: #fff;
-        border-bottom: 1px solid #cdcdcd;
+        background-color: var(--dialog-background-color);
+        border-bottom: 1px solid var(--border-color);
         left: 0;
         padding: 1em;
         position: absolute;
@@ -57,8 +59,9 @@
         margin-bottom: 1em;
       }
       ul li {
+        border: 1px solid var(--border-color);
         border-radius: .2em;
-        background: #eee;
+        background: var(--chip-background-color);
         display: inline-block;
         margin: 0 .2em .4em .2em;
         padding: .2em .4em;
diff --git a/polygerrit-ui/app/elements/change/gr-included-in-dialog/gr-included-in-dialog.js b/polygerrit-ui/app/elements/change/gr-included-in-dialog/gr-included-in-dialog.js
index 93e644e..d2ff035 100644
--- a/polygerrit-ui/app/elements/change/gr-included-in-dialog/gr-included-in-dialog.js
+++ b/polygerrit-ui/app/elements/change/gr-included-in-dialog/gr-included-in-dialog.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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';
 
diff --git a/polygerrit-ui/app/elements/change/gr-included-in-dialog/gr-included-in-dialog_test.html b/polygerrit-ui/app/elements/change/gr-included-in-dialog/gr-included-in-dialog_test.html
index 1f7af38..539011a 100644
--- a/polygerrit-ui/app/elements/change/gr-included-in-dialog/gr-included-in-dialog_test.html
+++ b/polygerrit-ui/app/elements/change/gr-included-in-dialog/gr-included-in-dialog_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2018 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/change/gr-label-score-row/gr-label-score-row.html b/polygerrit-ui/app/elements/change/gr-label-score-row/gr-label-score-row.html
index 6496091..0ac5019 100644
--- a/polygerrit-ui/app/elements/change/gr-label-score-row/gr-label-score-row.html
+++ b/polygerrit-ui/app/elements/change/gr-label-score-row/gr-label-score-row.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,103 +18,122 @@
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
 <link rel="import" href="../../../bower_components/iron-selector/iron-selector.html">
 <link rel="import" href="../../shared/gr-button/gr-button.html">
+<link rel="import" href="../../../styles/gr-voting-styles.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 
 <dom-module id="gr-label-score-row">
   <template>
+    <style include="gr-voting-styles"></style>
     <style include="shared-styles">
       .labelContainer {
+        align-items: center;
+        display: flex;
         margin-bottom: .5em;
       }
-      .labelContainer:last-child {
-        margin-bottom: 0;
-      }
       .labelName {
         display: inline-block;
+        flex: 0 0 auto;
         margin-right: .5em;
         min-width: 7em;
-        text-align: right;
-        white-space: nowrap;
-        width: 25%;
+        text-align: left;
+        width: 20%;
       }
       .labelMessage {
-        color: #666;
+        color: var(--deemphasized-text-color);
       }
       .placeholder::before {
         content: ' ';
       }
       .selectedValueText {
-        color: #666;
+        color: var(--deemphasized-text-color);
         font-style: italic;
-        margin-bottom: .5em;
-        margin-left: calc(25% + .5em);
+        margin: 0 .5em 0 .5em;
       }
       .selectedValueText.hidden {
         display: none;
       }
+      .buttonWrapper {
+        flex: none;
+      }
       gr-button {
         min-width: 40px;
         --gr-button: {
-          border: 1px solid #d1d2d3;
-          border-radius: 12px;
-          box-shadow: none;
+          background-color: var(--button-background-color, var(--table-header-background-color));
+          color: var(--primary-text-color);
           padding: .2em .85em;
+          @apply(--vote-chip-styles);
         }
-        --gr-button-background: #f5f5f5;
-        --gr-button-color: black;
-        --gr-button-hover-color: black;
-
       }
-      iron-selector > gr-button.iron-selected {
-        --gr-button-background:#ddd;
-        --gr-button-color: black;
-        --gr-button-hover-background-color: #ddd;
-        --gr-button-hover-color: black;
+      gr-button.iron-selected.max {
+        --button-background-color: var(--vote-color-approved);
+      }
+      gr-button.iron-selected.positive {
+        --button-background-color: var(--vote-color-recommended);
+      }
+      gr-button.iron-selected.min {
+        --button-background-color: var(--vote-color-rejected);
+      }
+      gr-button.iron-selected.negative {
+        --button-background-color: var(--vote-color-disliked);
+      }
+      gr-button.iron-selected.neutral {
+        --button-background-color: var(--vote-color-neutral);
       }
       .placeholder {
         display: inline-block;
         width: 40px;
       }
+      @media only screen and (max-width: 50em) {
+        .selectedValueText {
+          display: none;
+        }
+      }
       @media only screen and (max-width: 25em) {
         .labelName {
           margin: 0;
           text-align: center;
           width: 100%;
         }
-        .selectedValueText {
-          display: none;
+        .labelContainer {
+          display: block;
         }
       }
     </style>
     <div class="labelContainer">
       <span class="labelName">[[label.name]]</span>
-      <template is="dom-repeat"
-          items="[[_computeBlankItems(permittedLabels, label.name, 'start')]]"
-          as="value">
-        <span class="placeholder" data-label$="[[label.name]]"></span>
-      </template>
-      <iron-selector
-          attr-for-selected="value"
-          selected="[[_computeLabelValue(labels, permittedLabels, label)]]"
-          hidden$="[[!_computeAnyPermittedLabelValues(permittedLabels, label.name)]]"
-          on-selected-item-changed="_setSelectedValueText">
+      <div class="buttonWrapper">
         <template is="dom-repeat"
-            items="[[_computePermittedLabelValues(permittedLabels, label.name)]]"
+            items="[[_computeBlankItems(permittedLabels, label.name, 'start')]]"
             as="value">
-          <gr-button has-tooltip value$="[[value]]"
-            title$="[[_computeLabelValueTitle(labels, label.name, value)]]">
-          [[value]]</gr-button>
+          <span class="placeholder" data-label$="[[label.name]]"></span>
         </template>
-      </iron-selector>
-      <template is="dom-repeat"
-          items="[[_computeBlankItems(permittedLabels, label.name, 'end')]]"
-          as="value">
-        <span class="placeholder" data-label$="[[label.name]]"></span>
-      </template>
-      <span class="labelMessage"
-          hidden$="[[_computeAnyPermittedLabelValues(permittedLabels, label.name)]]">
-        You don't have permission to edit this label.
-      </span>
+        <iron-selector
+            attr-for-selected="value"
+            selected="[[_computeLabelValue(labels, permittedLabels, label)]]"
+            hidden$="[[!_computeAnyPermittedLabelValues(permittedLabels, label.name)]]"
+            on-selected-item-changed="_setSelectedValueText">
+          <template is="dom-repeat"
+              items="[[_items]]"
+              as="value">
+            <gr-button
+                class$="[[_computeButtonClass(value, index, _items.length)]]"
+                has-tooltip
+                name="[[label.name]]"
+                value$="[[value]]"
+                title$="[[_computeLabelValueTitle(labels, label.name, value)]]">
+              [[value]]</gr-button>
+          </template>
+        </iron-selector>
+        <template is="dom-repeat"
+            items="[[_computeBlankItems(permittedLabels, label.name, 'end')]]"
+            as="value">
+          <span class="placeholder" data-label$="[[label.name]]"></span>
+        </template>
+        <span class="labelMessage"
+            hidden$="[[_computeAnyPermittedLabelValues(permittedLabels, label.name)]]">
+          You don't have permission to edit this label.
+        </span>
+      </div>
       <div class$="selectedValueText [[_computeHiddenClass(permittedLabels, label.name)]]">
         <span id="selectedValueLabel">[[_selectedValueText]]</span>
       </div>
diff --git a/polygerrit-ui/app/elements/change/gr-label-score-row/gr-label-score-row.js b/polygerrit-ui/app/elements/change/gr-label-score-row/gr-label-score-row.js
index 82664f8..f472331 100644
--- a/polygerrit-ui/app/elements/change/gr-label-score-row/gr-label-score-row.js
+++ b/polygerrit-ui/app/elements/change/gr-label-score-row/gr-label-score-row.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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';
 
@@ -39,15 +42,19 @@
         type: String,
         value: 'No value selected',
       },
+      _items: {
+        type: Array,
+        computed: '_computePermittedLabelValues(permittedLabels, label.name)',
+      },
     },
 
     get selectedItem() {
-      if (!this._ironSelector) { return; }
+      if (!this._ironSelector) { return undefined; }
       return this._ironSelector.selectedItem;
     },
 
     get selectedValue() {
-      if (!this._ironSelector) { return; }
+      if (!this._ironSelector) { return undefined; }
       return this._ironSelector.selected;
     },
 
@@ -62,7 +69,8 @@
     },
 
     _computeBlankItems(permittedLabels, label, side) {
-      if (!permittedLabels || !permittedLabels[label] || !this.labelValues ||
+      if (!permittedLabels || !permittedLabels[label] ||
+          !permittedLabels[label].length || !this.labelValues ||
           !Object.keys(this.labelValues).length) {
         return [];
       }
@@ -87,6 +95,19 @@
       }
     },
 
+    _computeButtonClass(value, index, totalItems) {
+      if (value < 0 && index === 0) {
+        return 'min';
+      } else if (value < 0) {
+        return 'negative';
+      } else if (value > 0 && index === totalItems - 1) {
+        return 'max';
+      } else if (value > 0) {
+        return 'positive';
+      }
+      return 'neutral';
+    },
+
     _computeLabelValue(labels, permittedLabels, label) {
       if (!labels[label.name]) { return null; }
       const labelValue = this._getLabelValue(labels, permittedLabels, label);
@@ -108,11 +129,15 @@
       this._selectedValueText = e.target.selectedItem.getAttribute('title');
       // Needed to update the style of the selected button.
       this.updateStyles();
-      this.fire('labels-changed');
+      const name = e.target.selectedItem.name;
+      const value = e.target.selectedItem.getAttribute('value');
+      this.dispatchEvent(new CustomEvent(
+        'labels-changed', {detail: {name, value}, bubbles: true}));
     },
 
     _computeAnyPermittedLabelValues(permittedLabels, label) {
-      return permittedLabels.hasOwnProperty(label);
+      return permittedLabels.hasOwnProperty(label) &&
+        permittedLabels[label].length;
     },
 
     _computeHiddenClass(permittedLabels, label) {
@@ -125,7 +150,9 @@
     },
 
     _computeLabelValueTitle(labels, label, value) {
-      return labels[label] && labels[label].values[value];
+      return labels[label] &&
+        labels[label].values &&
+        labels[label].values[value];
     },
   });
 })();
diff --git a/polygerrit-ui/app/elements/change/gr-label-score-row/gr-label-score-row_test.html b/polygerrit-ui/app/elements/change/gr-label-score-row/gr-label-score-row_test.html
index 891afbc..1e4d471 100644
--- a/polygerrit-ui/app/elements/change/gr-label-score-row/gr-label-score-row_test.html
+++ b/polygerrit-ui/app/elements/change/gr-label-score-row/gr-label-score-row_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -114,7 +115,42 @@
           .textContent.trim(), '-1');
       assert.strictEqual(
           element.$.selectedValueLabel.textContent.trim(), 'bad');
-      assert.isTrue(labelsChangedHandler.called);
+      const detail = labelsChangedHandler.args[0][0].detail;
+      assert.equal(detail.name, 'Verified');
+      assert.equal(detail.value, '-1');
+    });
+
+    test('_computeButtonClass', () => {
+      let value = 1;
+      let index = 0;
+      const totalItems = 5;
+      // positive and first position
+      assert.equal(element._computeButtonClass(value, index,
+          totalItems), 'positive');
+      // negative and first position
+      value = -1;
+      assert.equal(element._computeButtonClass(value, index,
+          totalItems), 'min');
+      // negative but not first position
+      index = 1;
+      assert.equal(element._computeButtonClass(value, index,
+          totalItems), 'negative');
+      // neutral
+      value = 0;
+      assert.equal(element._computeButtonClass(value, index,
+          totalItems), 'neutral');
+      // positive but not last position
+      value = 1;
+      assert.equal(element._computeButtonClass(value, index,
+          totalItems), 'positive');
+      // positive and last position
+      index = 4;
+      assert.equal(element._computeButtonClass(value, index,
+          totalItems), 'max');
+      // negative and last position
+      value = -1;
+      assert.equal(element._computeButtonClass(value, index,
+          totalItems), 'negative');
     });
 
     test('correct item is selected', () => {
@@ -222,6 +258,11 @@
       flushAsynchronousOperations();
       assert.isOk(element.$$('iron-selector'));
       assert.isTrue(element.$$('iron-selector').hidden);
+
+      element.permittedLabels = {Verified: []};
+      flushAsynchronousOperations();
+      assert.isOk(element.$$('iron-selector'));
+      assert.isTrue(element.$$('iron-selector').hidden);
     });
 
     test('asymetrical labels', () => {
diff --git a/polygerrit-ui/app/elements/change/gr-label-scores/gr-label-scores.html b/polygerrit-ui/app/elements/change/gr-label-scores/gr-label-scores.html
index 2532c77..7dd4c76 100644
--- a/polygerrit-ui/app/elements/change/gr-label-scores/gr-label-scores.html
+++ b/polygerrit-ui/app/elements/change/gr-label-scores/gr-label-scores.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/change/gr-label-scores/gr-label-scores.js b/polygerrit-ui/app/elements/change/gr-label-scores/gr-label-scores.js
index b3642a5..8734da2 100644
--- a/polygerrit-ui/app/elements/change/gr-label-scores/gr-label-scores.js
+++ b/polygerrit-ui/app/elements/change/gr-label-scores/gr-label-scores.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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';
 
diff --git a/polygerrit-ui/app/elements/change/gr-label-scores/gr-label-scores_test.html b/polygerrit-ui/app/elements/change/gr-label-scores/gr-label-scores_test.html
index e3a0d8c..24529ec 100644
--- a/polygerrit-ui/app/elements/change/gr-label-scores/gr-label-scores_test.html
+++ b/polygerrit-ui/app/elements/change/gr-label-scores/gr-label-scores_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/change/gr-message/gr-message.html b/polygerrit-ui/app/elements/change/gr-message/gr-message.html
index e04eeb7..19b0716b 100644
--- a/polygerrit-ui/app/elements/change/gr-message/gr-message.html
+++ b/polygerrit-ui/app/elements/change/gr-message/gr-message.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -15,20 +16,23 @@
 -->
 
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../../bower_components/iron-icon/iron-icon.html">
 <link rel="import" href="../../shared/gr-account-label/gr-account-label.html">
 <link rel="import" href="../../shared/gr-button/gr-button.html">
 <link rel="import" href="../../shared/gr-date-formatter/gr-date-formatter.html">
 <link rel="import" href="../../shared/gr-formatted-text/gr-formatted-text.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
 <link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../../../styles/gr-voting-styles.html">
 
 <link rel="import" href="../gr-comment-list/gr-comment-list.html">
 
 <dom-module id="gr-message">
   <template>
+    <style include="gr-voting-styles"></style>
     <style include="shared-styles">
       :host {
-        border-bottom: 1px solid #ddd;
+        border-bottom: 1px solid var(--border-color);
         display: block;
         position: relative;
         cursor: pointer;
@@ -45,7 +49,7 @@
       }
       .collapsed .contentContainer {
         align-items: baseline;
-        color: #777;
+        color: var(--deemphasized-text-color);
         display: flex;
         white-space: nowrap;
       }
@@ -76,7 +80,7 @@
         width: 2.5em;
       }
       .name {
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
       }
       .message {
         --gr-formatted-text-prose-max-width: 80ch;
@@ -93,6 +97,9 @@
       gr-account-chip {
         display: inline;
       }
+      gr-button {
+        margin: 0 -4px;
+      }
       .collapsed gr-comment-list,
       .collapsed .replyContainer,
       .collapsed .hideOnCollapsed,
@@ -109,34 +116,54 @@
         overflow: hidden;
         text-overflow: ellipsis;
       }
-      .collapsed .date {
+      .collapsed .dateContainer {
         position: static;
       }
       .collapsed .author {
-        color: var(--default-text-color);
+        color: var(--primary-text-color);
         margin-right: .4em;
       }
       .expanded .author {
         cursor: pointer;
+        margin-bottom: .4em;
       }
-      .date {
-        color: #666;
+      .dateContainer {
         position: absolute;
         right: var(--default-horizontal-margin);
         top: 10px;
       }
+      .date {
+        color: var(--deemphasized-text-color);
+      }
+      .dateContainer iron-icon {
+        cursor: pointer;
+      }
       .replyContainer {
         padding: .5em 0 0 0;
       }
-      .positiveVote {
-        box-shadow: inset 0 3.8em #d4ffd4;
+      .score {
+        border: 1px solid rgba(0,0,0,.12);
+        border-radius: 3px;
+        color: var(--primary-text-color);
+        display: inline-block;
+        margin: -.1em 0;
+        padding: 0 .1em;
       }
-      .negativeVote {
-        box-shadow: inset 0 3.8em #ffd4d4;
+      .score.negative {
+        background-color: var(--vote-color-disliked);
+      }
+      .score.negative.min {
+        background-color: var(--vote-color-rejected);
+      }
+      .score.positive {
+        background-color: var(--vote-color-recommended);
+      }
+      .score.positive.max {
+        background-color: var(--vote-color-approved);
       }
       gr-account-label {
         --gr-account-label-text-style: {
-          font-family: var(--font-family-bold);
+          font-weight: var(--font-weight-bold);
         };
       }
     </style>
@@ -151,6 +178,11 @@
           <gr-account-label
               account="[[author]]"
               hide-avatar></gr-account-label>
+          <template is="dom-repeat" items="[[_getScores(message)]]" as="score">
+            <span class$="score [[_computeScoreClass(score, labelExtremes)]]">
+              [[score.label]] [[score.value]]
+            </span>
+          </template>
         </div>
         <template is="dom-if" if="[[message.message]]">
           <div class="content">
@@ -159,7 +191,7 @@
                 no-trailing-margin
                 class="message hideOnCollapsed"
                 content="[[message.message]]"
-                config="[[_commentLinks]]"></gr-formatted-text>
+                config="[[_projectConfig.commentlinks]]"></gr-formatted-text>
             <div class="replyContainer" hidden$="[[!showReplyButton]]" hidden>
               <gr-button link small on-tap="_handleReplyTap">Reply</gr-button>
             </div>
@@ -168,7 +200,7 @@
                 change-num="[[changeNum]]"
                 patch-num="[[message._revision_number]]"
                 project-name="[[projectName]]"
-                comment-links="[[_commentLinks]]"></gr-comment-list>
+                project-config="[[_projectConfig]]"></gr-comment-list>
           </div>
         </template>
         <template is="dom-if" if="[[_computeIsReviewerUpdate(message)]]">
@@ -185,20 +217,29 @@
             </template>
           </div>
         </template>
-        <template is="dom-if" if="[[!message.id]]">
-          <span class="date">
-            <gr-date-formatter
-                has-tooltip
-                date-str="[[message.date]]"></gr-date-formatter>
-          </span>
-        </template>
-        <template is="dom-if" if="[[message.id]]">
-          <a class="date" href$="[[_computeMessageHash(message)]]" on-tap="_handleLinkTap">
-            <gr-date-formatter
-                has-tooltip
-                date-str="[[message.date]]"></gr-date-formatter>
-          </a>
-        </template>
+        <span class="dateContainer">
+          <template is="dom-if" if="[[!message.id]]">
+            <span class="date">
+              <gr-date-formatter
+                  has-tooltip
+                  show-date-and-time
+                  date-str="[[message.date]]"></gr-date-formatter>
+            </span>
+          </template>
+          <template is="dom-if" if="[[message.id]]">
+            <a class="date" href$="[[_computeMessageHash(message)]]" on-tap="_handleLinkTap">
+              <gr-date-formatter
+                  has-tooltip
+                  show-date-and-time
+                  date-str="[[message.date]]"></gr-date-formatter>
+            </a>
+          </template>
+          <iron-icon
+              id="expandToggle"
+              on-tap="_toggleExpanded"
+              title="Toggle expanded state"
+              icon="[[_computeExpandToggleIcon(_expanded)]]">
+        </span>
       </div>
     </div>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
diff --git a/polygerrit-ui/app/elements/change/gr-message/gr-message.js b/polygerrit-ui/app/elements/change/gr-message/gr-message.js
index d907f3b..0590c73 100644
--- a/polygerrit-ui/app/elements/change/gr-message/gr-message.js
+++ b/polygerrit-ui/app/elements/change/gr-message/gr-message.js
@@ -1,22 +1,24 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
-  const CI_LABELS = ['Trybot-Ready', 'Tryjob-Request', 'Commit-Queue'];
   const PATCH_SET_PREFIX_PATTERN = /^Patch Set \d+: /;
-  const LABEL_TITLE_SCORE_PATTERN = /([A-Za-z0-9-]+)([+-]\d+)/;
+  const LABEL_TITLE_SCORE_PATTERN = /^([A-Za-z0-9-]+)([+-]\d+)$/;
 
   Polymer({
     is: 'gr-message',
@@ -79,11 +81,17 @@
         type: String,
         observer: '_projectNameChanged',
       },
-      _commentLinks: Object,
+
+      /**
+       * A mapping from label names to objects representing the minimum and
+       * maximum possible values for that label.
+       */
+      labelExtremes: Object,
+
       /**
        * @type {{ commentlinks: Array }}
        */
-      projectConfig: Object,
+      _projectConfig: Object,
       // Computed property needed to trigger Polymer value observing.
       _expanded: {
         type: Object,
@@ -176,41 +184,42 @@
       return event.type === 'REVIEWER_UPDATE';
     },
 
-    _isMessagePositive(message) {
-      if (!message.message) { return null; }
+    _getScores(message) {
+      if (!message.message) { return []; }
       const line = message.message.split('\n', 1)[0];
       const patchSetPrefix = PATCH_SET_PREFIX_PATTERN;
-      if (!line.match(patchSetPrefix)) { return null; }
+      if (!line.match(patchSetPrefix)) { return []; }
       const scoresRaw = line.split(patchSetPrefix)[1];
-      if (!scoresRaw) { return null; }
-      const scores = scoresRaw.split(' ');
-      if (!scores.length) { return null; }
-      const {min, max} = scores
+      if (!scoresRaw) { return []; }
+      return scoresRaw.split(' ')
           .map(s => s.match(LABEL_TITLE_SCORE_PATTERN))
           .filter(ms => ms && ms.length === 3)
-          .filter(([, label]) => !CI_LABELS.includes(label))
-          .map(([, , score]) => score)
-          .map(s => parseInt(s, 10))
-          .reduce(({min, max}, s) =>
-              ({min: (s < min ? s : min), max: (s > max ? s : max)}),
-              {min: 0, max: 0});
-      if (max - min === 0) {
-        return 0;
-      } else {
-        return (max + min) > 0 ? 1 : -1;
+          .map(ms => ({label: ms[1], value: ms[2]}));
+    },
+
+    _computeScoreClass(score, labelExtremes) {
+      const classes = [];
+      if (score.value > 0) {
+        classes.push('positive');
+      } else if (score.value < 0) {
+        classes.push('negative');
       }
+      const extremes = labelExtremes[score.label];
+      if (extremes) {
+        const intScore = parseInt(score.value, 10);
+        if (intScore === extremes.max) {
+          classes.push('max');
+        } else if (intScore === extremes.min) {
+          classes.push('min');
+        }
+      }
+      return classes.join(' ');
     },
 
     _computeClass(expanded, showAvatar, message) {
       const classes = [];
       classes.push(expanded ? 'expanded' : 'collapsed');
       classes.push(showAvatar ? 'showAvatar' : 'hideAvatar');
-      const scoreQuality = this._isMessagePositive(message);
-      if (scoreQuality === 1) {
-        classes.push('positiveVote');
-      } else if (scoreQuality === -1) {
-        classes.push('negativeVote');
-      }
       return classes.join(' ');
     },
 
@@ -239,8 +248,17 @@
 
     _projectNameChanged(name) {
       this.$.restAPI.getProjectConfig(name).then(config => {
-        this._commentLinks = config.commentlinks;
+        this._projectConfig = config;
       });
     },
+
+    _computeExpandToggleIcon(expanded) {
+      return expanded ? 'gr-icons:expand-less' : 'gr-icons:expand-more';
+    },
+
+    _toggleExpanded(e) {
+      e.stopPropagation();
+      this.set('message.expanded', !this.message.expanded);
+    },
   });
 })();
diff --git a/polygerrit-ui/app/elements/change/gr-message/gr-message_test.html b/polygerrit-ui/app/elements/change/gr-message/gr-message_test.html
index aa18c4e..870f366 100644
--- a/polygerrit-ui/app/elements/change/gr-message/gr-message_test.html
+++ b/polygerrit-ui/app/elements/change/gr-message/gr-message_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -163,22 +164,40 @@
       });
     });
 
-    test('negative vote', () => {
+    test('votes', () => {
       element.message = {
         author: {},
         expanded: false,
         message: 'Patch Set 1: Verified+1 Code-Review-2 Trybot-Ready+1',
       };
-      assert.isOk(Polymer.dom(element.root).querySelector('.negativeVote'));
+      element.labelExtremes = {
+        'Verified': {max: 1, min: -1},
+        'Code-Review': {max: 2, min: -2},
+        'Trybot-Ready': {max: 3, min: 0},
+      };
+      flushAsynchronousOperations();
+      const scoreChips = Polymer.dom(element.root).querySelectorAll('.score');
+      assert.equal(scoreChips.length, 3);
+
+      assert.isTrue(scoreChips[0].classList.contains('positive'));
+      assert.isTrue(scoreChips[0].classList.contains('max'));
+
+      assert.isTrue(scoreChips[1].classList.contains('negative'));
+      assert.isTrue(scoreChips[1].classList.contains('min'));
+
+      assert.isTrue(scoreChips[2].classList.contains('positive'));
+      assert.isFalse(scoreChips[2].classList.contains('min'));
     });
 
-    test('positive vote', () => {
+    test('false negative vote', () => {
       element.message = {
         author: {},
         expanded: false,
-        message: 'Patch Set 1: Verified-1 Code-Review+2 Trybot-Ready-1',
+        message: 'Patch Set 1: Cherry Picked from branch stable-2.14.',
       };
-      assert.isOk(Polymer.dom(element.root).querySelector('.positiveVote'));
+      element.labelExtremes = {};
+      const scoreChips = Polymer.dom(element.root).querySelectorAll('.score');
+      assert.equal(scoreChips.length, 0);
     });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list.html b/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list.html
index ab494b4..0a7dacc 100644
--- a/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list.html
+++ b/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -15,6 +16,7 @@
 -->
 
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../../bower_components/paper-toggle-button/paper-toggle-button.html">
 <link rel="import" href="../../core/gr-reporting/gr-reporting.html">
 <link rel="import" href="../../shared/gr-button/gr-button.html">
 <link rel="import" href="../gr-message/gr-message.html">
@@ -25,13 +27,14 @@
     <style include="shared-styles">
       :host,
       .messageListControls {
-        display: block;
+        display: flex;
+        justify-content: space-between;
       }
       .header {
         align-items: center;
-        background-color: #fafafa;
-        border-bottom: 1px solid #ddd;
-        border-top: 1px solid #ddd;
+        background-color: var(--table-header-background-color);
+        border-bottom: 1px solid var(--border-color);
+        border-top: 1px solid var(--border-color);
         display: flex;
         justify-content: space-between;
         min-height: 3.2em;
@@ -44,12 +47,12 @@
         animation: 3s fadeOut;
       }
       @keyframes fadeOut {
-        0% { background-color: #fff9c4; }
-        100% { background-color: #fff; }
+        0% { background-color: var(--emphasis-color); }
+        100% { background-color: var(--view-background-color); }
       }
       #messageControlsContainer {
         align-items: center;
-        border-bottom: 1px solid #ddd;
+        border-bottom: 1px solid var(--border-color);
         display: flex;
         height: 2.25em;
         justify-content: center;
@@ -57,39 +60,28 @@
       #messageControlsContainer gr-button {
         padding: 0.4em 0;
       }
-      .separator {
-        background-color: rgba(0, 0, 0, .3);
-        height: 1.5em;
-        margin: 0 .6em;
-        width: 1px;
-      }
-      .separator.transparent {
-        background-color: transparent;
-      }
       .container {
         align-items: center;
         display: flex;
       }
     </style>
     <div class="header">
-      <h3>Messages</h3>
-      <div class="messageListControls container">
-        <gr-button id="collapse-messages" link
-            on-tap="_handleExpandCollapseTap">
-          [[_computeExpandCollapseMessage(_expanded)]]
-        </gr-button>
         <span
             id="automatedMessageToggleContainer"
             class="container"
             hidden$="[[!_hasAutomatedMessages(messages)]]">
+          <paper-toggle-button
+              id="automatedMessageToggle"
+              checked="{{_hideAutomated}}"></paper-toggle-button>Only comments
           <span class="transparent separator"></span>
-          <gr-button id="automatedMessageToggle" link
-              on-tap="_handleAutomatedMessageToggleTap">
-            [[_computeAutomatedToggleText(_hideAutomated)]]
-          </gr-button>
         </span>
+        <gr-button
+            id="collapse-messages"
+            link
+            on-tap="_handleExpandCollapseTap">
+          [[_computeExpandCollapseMessage(_expanded)]]
+        </gr-button>
       </div>
-    </div>
     <span
         id="messageControlsContainer"
         hidden$="[[_computeShowHideTextHidden(_visibleMessages, _processedMessages, _hideAutomated, _visibleMessages.length)]]">
@@ -113,11 +105,12 @@
       <gr-message
           change-num="[[changeNum]]"
           message="[[message]]"
-          comments="[[_computeCommentsForMessage(comments, message)]]"
+          comments="[[_computeCommentsForMessage(changeComments, message)]]"
           hide-automated="[[_hideAutomated]]"
           project-name="[[projectName]]"
           show-reply-button="[[showReplyButtons]]"
           on-scroll-to="_handleScrollTo"
+          label-extremes="[[_labelExtremes]]"
           data-message-id$="[[message.id]]"></gr-message>
     </template>
     <gr-reporting id="reporting" category="message-list"></gr-reporting>
diff --git a/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list.js b/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list.js
index 58e56a4..89a3523 100644
--- a/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list.js
+++ b/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -35,12 +38,13 @@
         type: Array,
         value() { return []; },
       },
-      comments: Object,
+      changeComments: Object,
       projectName: String,
       showReplyButtons: {
         type: Boolean,
         value: false,
       },
+      labels: Object,
 
       _expanded: {
         type: Boolean,
@@ -66,6 +70,11 @@
         type: Array,
         value() { return []; },
       },
+
+      _labelExtremes: {
+        type: Object,
+        computed: '_computeLabelExtremes(labels.*)',
+      },
     },
 
     scrollToMessage(messageID) {
@@ -175,12 +184,6 @@
       this.handleExpandCollapse(!this._expanded);
     },
 
-    _handleAutomatedMessageToggleTap(e) {
-      e.preventDefault();
-
-      this._hideAutomated = !this._hideAutomated;
-    },
-
     _handleScrollTo(e) {
       this.scrollToMessage(e.detail.message.id);
     },
@@ -199,19 +202,18 @@
       return expanded ? 'Collapse all' : 'Expand all';
     },
 
-    _computeAutomatedToggleText(hideAutomated) {
-      return hideAutomated ? 'Show all messages' : 'Show comments only';
-    },
-
     /**
      * Computes message author's file comments for change's message.
      * Method uses this.messages to find next message and relies on messages
      * to be sorted by date field descending.
-     * @param {!Object} comments Hash of arrays of comments, filename as key.
+     * @param {!Object} changeComments changeComment object, which includes
+     *     a method to get all published comments (including robot comments),
+     *     which returns a Hash of arrays of comments, filename as key.
      * @param {!Object} message
      * @return {!Object} Hash of arrays of comments, filename as key.
      */
-    _computeCommentsForMessage(comments, message) {
+    _computeCommentsForMessage(changeComments, message) {
+      const comments = changeComments.getAllPublishedComments();
       if (message._index === undefined || !comments || !this.messages) {
         return [];
       }
@@ -338,5 +340,24 @@
           this._numRemaining(visibleMessages, messages, hideAutomated);
       return total <= this._getDelta(visibleMessages, messages, hideAutomated);
     },
+
+    /**
+     * Compute a mapping from label name to objects representing the minimum and
+     * maximum possible values for that label.
+     */
+    _computeLabelExtremes(labelRecord) {
+      const extremes = {};
+      const labels = labelRecord.base;
+      if (!labels) { return extremes; }
+      for (const key of Object.keys(labels)) {
+        if (!labels[key] || !labels[key].values) { continue; }
+        const values = Object.keys(labels[key].values)
+            .map(v => parseInt(v, 10));
+        values.sort();
+        if (!values.length) { continue; }
+        extremes[key] = {min: values[0], max: values[values.length - 1]};
+      }
+      return extremes;
+    },
   });
 })();
diff --git a/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list_test.html b/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list_test.html
index 15964a7..80d1b9d 100644
--- a/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list_test.html
+++ b/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -21,13 +22,27 @@
 <script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
 <script src="../../../bower_components/web-component-tester/browser.js"></script>
 <link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="../../diff/gr-comment-api/gr-comment-api.html">
+
 <link rel="import" href="gr-messages-list.html">
 
 <script>void(0);</script>
 
+<dom-module id="comment-api-mock">
+  <template>
+    <gr-messages-list
+        id="messagesList"
+        change-comments="[[_changeComments]]"></gr-messages-list>
+    <gr-comment-api id="commentAPI"></gr-comment-api>
+  </template>
+  <script src="../../diff/gr-comment-api/gr-comment-api-mock.js"></script>
+</dom-module>
+
 <test-fixture id="basic">
   <template>
-    <gr-messages-list></gr-messages-list>
+    <comment-api-mock>
+      <gr-messages-list></gr-messages-list>
+    </comment-api-mock>
   </template>
 </test-fixture>
 
@@ -58,21 +73,84 @@
     let element;
     let messages;
     let sandbox;
+    let commentApiWrapper;
 
     const getMessages = function() {
       return Polymer.dom(element.root).querySelectorAll('gr-message');
     };
 
+    const author = {
+      _account_id: 42,
+      name: 'Marvin the Paranoid Android',
+      email: 'marvin@sirius.org',
+    };
+
+    const comments = {
+      file1: [
+        {
+          message: 'message text',
+          updated: '2016-09-27 00:18:03.000000000',
+          in_reply_to: '6505d749_f0bec0aa',
+          line: 62,
+          id: '6505d749_10ed44b2',
+          patch_set: 2,
+          author: {
+            email: 'some@email.com',
+            _account_id: 123,
+          },
+        },
+        {
+          message: 'message text',
+          updated: '2016-09-27 00:18:03.000000000',
+          in_reply_to: 'c5912363_6b820105',
+          line: 42,
+          id: '450a935e_0f1c05db',
+          patch_set: 2,
+          author,
+        },
+        {
+          message: 'message text',
+          updated: '2016-09-27 00:18:03.000000000',
+          in_reply_to: '6505d749_f0bec0aa',
+          line: 62,
+          id: '6505d749_10ed44b2',
+          patch_set: 2,
+          author,
+        },
+      ],
+      file2: [
+        {
+          message: 'message text',
+          updated: '2016-09-27 00:18:03.000000000',
+          in_reply_to: 'c5912363_4b7d450a',
+          line: 132,
+          id: '450a935e_4f260d25',
+          patch_set: 2,
+          author,
+        },
+      ],
+    };
+
     setup(() => {
       stub('gr-rest-api-interface', {
         getConfig() { return Promise.resolve({}); },
         getLoggedIn() { return Promise.resolve(false); },
+        getDiffComments() { return Promise.resolve(comments); },
+        getDiffRobotComments() { return Promise.resolve({}); },
+        getDiffDrafts() { return Promise.resolve({}); },
       });
       sandbox = sinon.sandbox.create();
-      element = fixture('basic');
       messages = _.times(3, randomMessage);
+      // Element must be wrapped in an element with direct access to the
+      // comment API.
+      commentApiWrapper = fixture('basic');
+      element = commentApiWrapper.$.messagesList;
+      loadCommentSpy = sandbox.spy(commentApiWrapper.$.commentAPI, 'loadAll');
       element.messages = messages;
-      flushAsynchronousOperations();
+
+      // Stub methods on the changeComments object after changeComments has
+      // been initalized.
+      return commentApiWrapper.loadComments();
     });
 
     teardown(() => {
@@ -285,56 +363,6 @@
     });
 
     test('messages', () => {
-      const author = {
-        _account_id: 42,
-        name: 'Marvin the Paranoid Android',
-        email: 'marvin@sirius.org',
-      };
-      const comments = {
-        file1: [
-          {
-            message: 'message text',
-            updated: '2016-09-27 00:18:03.000000000',
-            in_reply_to: '6505d749_f0bec0aa',
-            line: 62,
-            id: '6505d749_10ed44b2',
-            patch_set: 2,
-            author: {
-              email: 'some@email.com',
-              _account_id: 123,
-            },
-          },
-          {
-            message: 'message text',
-            updated: '2016-09-27 00:18:03.000000000',
-            in_reply_to: 'c5912363_6b820105',
-            line: 42,
-            id: '450a935e_0f1c05db',
-            patch_set: 2,
-            author,
-          },
-          {
-            message: 'message text',
-            updated: '2016-09-27 00:18:03.000000000',
-            in_reply_to: '6505d749_f0bec0aa',
-            line: 62,
-            id: '6505d749_10ed44b2',
-            patch_set: 2,
-            author,
-          },
-        ],
-        file2: [
-          {
-            message: 'message text',
-            updated: '2016-09-27 00:18:03.000000000',
-            in_reply_to: 'c5912363_4b7d450a',
-            line: 132,
-            id: '450a935e_4f260d25',
-            patch_set: 2,
-            author,
-          },
-        ],
-      };
       const messages = [].concat(
           randomMessage(),
           {
@@ -354,7 +382,6 @@
             id: 'e7bfdbc842f6b6d8064bc68e0f52b673f40c0ca5',
           }
       );
-      element.comments = comments;
       element.messages = messages;
       const isAuthor = function(author, message) {
         return message.author._account_id === author._account_id;
@@ -373,21 +400,6 @@
     });
 
     test('messages without author do not throw', () => {
-      const comments = {
-        file1: [
-          {
-            message: 'message text',
-            updated: '2016-09-27 00:18:03.000000000',
-            in_reply_to: '6505d749_f0bec0aa',
-            line: 62,
-            id: '6505d749_10ed44b2',
-            patch_set: 2,
-            author: {
-              email: 'some@email.com',
-              _account_id: 123,
-            },
-          },
-        ]};
       const messages = [{
         _index: 5,
         _revision_number: 4,
@@ -396,7 +408,6 @@
         id: '8c19ccc949c6d482b061be6a28e10782abf0e7af',
       }];
       element.messages = messages;
-      element.comments = comments;
       flushAsynchronousOperations();
       const messageEls = getMessages();
       assert.equal(messageEls.length, 1);
@@ -419,6 +430,8 @@
   suite('gr-messages-list automate tests', () => {
     let element;
     let messages;
+    let sandbox;
+    let commentApiWrapper;
 
     const getMessages = function() {
       return Polymer.dom(element.root).querySelectorAll('gr-message');
@@ -429,18 +442,36 @@
 
     const randomMessageReviewer = {
       reviewer: {},
+      date: '2016-01-13 20:30:33.038000',
     };
 
     setup(() => {
       stub('gr-rest-api-interface', {
         getConfig() { return Promise.resolve({}); },
         getLoggedIn() { return Promise.resolve(false); },
+        getDiffComments() { return Promise.resolve({}); },
+        getDiffRobotComments() { return Promise.resolve({}); },
+        getDiffDrafts() { return Promise.resolve({}); },
       });
-      element = fixture('basic');
+
+      sandbox = sinon.sandbox.create();
       messages = _.times(2, randomAutomated);
       messages.push(randomMessageReviewer);
+
+      // Element must be wrapped in an element with direct access to the
+      // comment API.
+      commentApiWrapper = fixture('basic');
+      element = commentApiWrapper.$.messagesList;
+      loadCommentSpy = sandbox.spy(commentApiWrapper.$.commentAPI, 'loadAll');
       element.messages = messages;
-      flushAsynchronousOperations();
+
+      // Stub methods on the changeComments object after changeComments has
+      // been initalized.
+      return commentApiWrapper.loadComments();
+    });
+
+    teardown(() => {
+      sandbox.restore();
     });
 
     test('hide autogenerated button is not hidden', () => {
@@ -454,7 +485,7 @@
       assert.isFalse(!!allHiddenMessageEls.length);
     });
 
-    test('autogenerated messages hidden after hide button tap', () => {
+    test('autogenerated messages hidden after comments only toggle', () => {
       let allHiddenMessageEls = getHiddenMessages();
 
       element._hideAutomated = false;
@@ -467,16 +498,17 @@
       assert.equal(allHiddenMessageEls.length, allMessageEls.length);
     });
 
-    test('autogenerated messages not hidden after show button tap', () => {
-      let allHiddenMessageEls = getHiddenMessages();
+    test('autogenerated messages not hidden after comments only toggle',
+        () => {
+          let allHiddenMessageEls = getHiddenMessages();
 
-      element._hideAutomated = true;
-      MockInteractions.tap(element.$.automatedMessageToggle);
-      allHiddenMessageEls = getHiddenMessages();
+          element._hideAutomated = true;
+          MockInteractions.tap(element.$.automatedMessageToggle);
+          allHiddenMessageEls = getHiddenMessages();
 
-      // Autogenerated messages are now hidden.
-      assert.isFalse(!!allHiddenMessageEls.length);
-    });
+          // Autogenerated messages are now hidden.
+          assert.isFalse(!!allHiddenMessageEls.length);
+        });
 
     test('_getDelta', () => {
       let messages = [randomMessage()];
@@ -509,5 +541,40 @@
       assert.equal(messages.length, 5);
       assert.isFalse(element._hasAutomatedMessages(messages));
     });
+
+    test('_computeLabelExtremes', () => {
+      const computeSpy = sandbox.spy(element, '_computeLabelExtremes');
+
+      element.labels = null;
+      assert.isTrue(computeSpy.calledOnce);
+      assert.deepEqual(computeSpy.lastCall.returnValue, {});
+
+      element.labels = {};
+      assert.isTrue(computeSpy.calledTwice);
+      assert.deepEqual(computeSpy.lastCall.returnValue, {});
+
+      element.labels = {'my-label': {}};
+      assert.isTrue(computeSpy.calledThrice);
+      assert.deepEqual(computeSpy.lastCall.returnValue, {});
+
+      element.labels = {'my-label': {values: {}}};
+      assert.equal(computeSpy.callCount, 4);
+      assert.deepEqual(computeSpy.lastCall.returnValue, {});
+
+      element.labels = {'my-label': {values: {'-12': {}}}};
+      assert.equal(computeSpy.callCount, 5);
+      assert.deepEqual(computeSpy.lastCall.returnValue,
+          {'my-label': {min: -12, max: -12}});
+
+      element.labels = {
+        'my-label': {values: {'-12': {}}},
+        'other-label': {values: {'-1': {}, ' 0': {}, '+1': {}}},
+      };
+      assert.equal(computeSpy.callCount, 6);
+      assert.deepEqual(computeSpy.lastCall.returnValue, {
+        'my-label': {min: -12, max: -12},
+        'other-label': {min: -1, max: 1},
+      });
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list.html b/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list.html
index 401aaf8..30ebc08 100644
--- a/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list.html
+++ b/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -48,27 +49,31 @@
       }
       .changeContainer.thisChange:before {
         content: '➔';
-        width: 1.2em
+        width: 1.2em;
       }
       h4,
       section div {
-        display: flex
+        display: flex;
       }
       h4:before,
       section div:before {
         content: ' ';
-        width: 1.2em
+        flex-shrink: 0;
+        width: 1.2em;
+      }
+      .note {
+        color: var(--error-text-color);
       }
       .relatedChanges a {
         display: inline-block;
       }
       .strikethrough {
-        color: #666;
+        color: var(--deemphasized-text-color);
         text-decoration: line-through;
       }
       .status {
-        color: #666;
-        font-family: var(--font-family-bold);
+        color: var(--deemphasized-text-color);
+        font-weight: var(--font-weight-bold);
         margin-left: .25em;
       }
       .notCurrent {
@@ -81,7 +86,7 @@
         color: #1b5e20;
       }
       .submittableCheck {
-        color: #388E3C;
+        color: var(--vote-text-color-recommended);
         display: none;
       }
       .submittableCheck.submittable {
@@ -95,16 +100,9 @@
         .mobile {
           display: block;
         }
-        hr {
-          border: 0;
-          border-top: 1px solid #ddd;
-          height: 0;
-          margin-bottom: 1em;
-        }
       }
     </style>
     <div>
-      <hr class="mobile">
       <section class="relatedChanges" hidden$="[[!_relatedResponse.changes.length]]" hidden>
         <h4>Relation chain</h4>
         <template
@@ -123,19 +121,26 @@
           </div>
         </template>
       </section>
-      <section hidden$="[[!_submittedTogether.length]]" hidden>
+      <section
+          id="submittedTogether"
+          class$="[[_computeSubmittedTogetherClass(_submittedTogether)]]">
         <h4>Submitted together</h4>
-        <template is="dom-repeat" items="[[_submittedTogether]]" as="change">
-          <div>
-            <a href$="[[_computeChangeURL(change._number, change.project)]]"
-                class$="[[_computeLinkClass(change)]]"
-                title$="[[change.project]]: [[change.branch]]: [[change.subject]]">
-              [[change.project]]: [[change.branch]]: [[change.subject]]
+        <template is="dom-repeat" items="[[_submittedTogether.changes]]" as="related">
+          <div class$="[[_computeChangeContainerClass(change, related)]]">
+            <a href$="[[_computeChangeURL(related._number, related.project)]]"
+                class$="[[_computeLinkClass(related)]]"
+                title$="[[related.project]]: [[related.branch]]: [[related.subject]]">
+              [[related.project]]: [[related.branch]]: [[related.subject]]
             </a>
             <span
                 tabindex="-1"
                 title="Submittable"
-                class$="submittableCheck [[_computeLinkClass(change)]]">✓</span>
+                class$="submittableCheck [[_computeLinkClass(related)]]">✓</span>
+          </div>
+        </template>
+        <template is="dom-if" if="[[_submittedTogether.non_visible_changes]]">
+          <div class="note">
+            [[_computeNonVisibleChangesNote(_submittedTogether.non_visible_changes)]]
           </div>
         </template>
       </section>
@@ -180,4 +185,4 @@
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
   </template>
   <script src="gr-related-changes-list.js"></script>
-</dom-module>
\ No newline at end of file
+</dom-module>
diff --git a/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list.js b/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list.js
index 347c502..6c47589 100644
--- a/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list.js
+++ b/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list.js
@@ -1,22 +1,33 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
   Polymer({
     is: 'gr-related-changes-list',
 
+    /**
+     * Fired when a new section is loaded so that the change view can determine
+     * a show more button is needed, sometimes before all the sections finish
+     * loading.
+     *
+     * @event new-section-loaded
+     */
+
     properties: {
       change: Object,
       hasParent: {
@@ -35,6 +46,7 @@
         type: Boolean,
         notify: true,
       },
+      mergeable: Boolean,
       _connectedRevisions: {
         type: Array,
         computed: '_computeConnectedRevisions(change, patchNum, ' +
@@ -45,9 +57,10 @@
         type: Object,
         value() { return {changes: []}; },
       },
+      /** @type {?} */
       _submittedTogether: {
-        type: Array,
-        value() { return []; },
+        type: Object,
+        value() { return {changes: []}; },
       },
       _conflicts: {
         type: Array,
@@ -69,13 +82,19 @@
     ],
 
     observers: [
-      '_resultsChanged(_relatedResponse.changes, _submittedTogether, ' +
+      '_resultsChanged(_relatedResponse, _submittedTogether, ' +
           '_conflicts, _cherryPicks, _sameTopic)',
     ],
 
     clear() {
       this.loading = true;
       this.hidden = true;
+
+      this._relatedResponse = {changes: []};
+      this._submittedTogether = {changes: []};
+      this._conflicts = [];
+      this._cherryPicks = [];
+      this._sameTopic = [];
     },
 
     reload() {
@@ -86,24 +105,27 @@
       const promises = [
         this._getRelatedChanges().then(response => {
           this._relatedResponse = response;
-
+          this._fireReloadEvent();
           this.hasParent = this._calculateHasParent(this.change.change_id,
               response.changes);
         }),
         this._getSubmittedTogether().then(response => {
           this._submittedTogether = response;
+          this._fireReloadEvent();
         }),
         this._getCherryPicks().then(response => {
           this._cherryPicks = response;
+          this._fireReloadEvent();
         }),
       ];
 
       // Get conflicts if change is open and is mergeable.
-      if (this.changeIsOpen(this.change.status) && this.change.mergeable) {
+      if (this.changeIsOpen(this.change.status) && this.mergeable) {
         promises.push(this._getConflicts().then(response => {
           // Because the server doesn't always return a response and the
           // template expects an array, always return an array.
           this._conflicts = response ? response : [];
+          this._fireReloadEvent();
         }));
       }
 
@@ -123,6 +145,14 @@
       });
     },
 
+    _fireReloadEvent() {
+      // The listener on the change computes height of the related changes
+      // section, so they have to be rendered first, and inside a dom-repeat,
+      // that requires a flush.
+      Polymer.dom.flush();
+      this.dispatchEvent(new CustomEvent('new-section-loaded'));
+    },
+
     /**
      * Determines whether or not the given change has a parent change. If there
      * is a relation chain, and the change id is not the last item of the
@@ -176,12 +206,46 @@
 
     _computeChangeContainerClass(currentChange, relatedChange) {
       const classes = ['changeContainer'];
-      if (relatedChange.change_id === currentChange.change_id) {
+      if (this._changesEqual(relatedChange, currentChange)) {
         classes.push('thisChange');
       }
       return classes.join(' ');
     },
 
+    /**
+     * Do the given objects describe the same change? Compares the changes by
+     * their numbers.
+     * @see /Documentation/rest-api-changes.html#change-info
+     * @see /Documentation/rest-api-changes.html#related-change-and-commit-info
+     * @param {!Object} a Either ChangeInfo or RelatedChangeAndCommitInfo
+     * @param {!Object} b Either ChangeInfo or RelatedChangeAndCommitInfo
+     * @return {boolean}
+     */
+    _changesEqual(a, b) {
+      const aNum = this._getChangeNumber(a);
+      const bNum = this._getChangeNumber(b);
+      return aNum === bNum;
+    },
+
+    /**
+     * Get the change number from either a ChangeInfo (such as those included in
+     * SubmittedTogetherInfo responses) or get the change number from a
+     * RelatedChangeAndCommitInfo (such as those included in a
+     * RelatedChangesInfo response).
+     * @see /Documentation/rest-api-changes.html#change-info
+     * @see /Documentation/rest-api-changes.html#related-change-and-commit-info
+     *
+     * @param {!Object} change Either a ChangeInfo or a
+     *     RelatedChangeAndCommitInfo object.
+     * @return {number}
+     */
+    _getChangeNumber(change) {
+      if (change.hasOwnProperty('_change_number')) {
+        return change._change_number;
+      }
+      return change._number;
+    },
+
     _computeLinkClass(change) {
       const statuses = [];
       if (change.status == this.ChangeStatus.ABANDONED) {
@@ -227,14 +291,14 @@
     _resultsChanged(related, submittedTogether, conflicts,
         cherryPicks, sameTopic) {
       const results = [
-        related,
-        submittedTogether,
+        related && related.changes,
+        submittedTogether && submittedTogether.changes,
         conflicts,
         cherryPicks,
         sameTopic,
       ];
       for (let i = 0; i < results.length; i++) {
-        if (results[i].length > 0) {
+        if (results[i] && results[i].length > 0) {
           this.hidden = false;
           this.fire('update', null, {bubbles: false});
           return;
@@ -277,5 +341,19 @@
       }
       return connected;
     },
+
+    _computeSubmittedTogetherClass(submittedTogether) {
+      if (!submittedTogether || (
+          submittedTogether.changes.length === 0 &&
+          !submittedTogether.non_visible_changes)) {
+        return 'hidden';
+      }
+      return '';
+    },
+
+    _computeNonVisibleChangesNote(n) {
+      const noun = n === 1 ? 'change' : 'changes';
+      return `(+ ${n} non-visible ${noun})`;
+    },
   });
 })();
diff --git a/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list_test.html b/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list_test.html
index df4391e..48cc565 100644
--- a/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list_test.html
+++ b/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -222,13 +223,58 @@
     });
 
     test('_computeChangeContainerClass', () => {
-      const change1 = {change_id: 123};
-      const change2 = {change_id: 456};
+      const change1 = {change_id: 123, _number: 0};
+      const change2 = {change_id: 456, _change_number: 1};
+      const change3 = {change_id: 123, _number: 2};
 
       assert.notEqual(element._computeChangeContainerClass(
           change1, change1).indexOf('thisChange'), -1);
       assert.equal(element._computeChangeContainerClass(
           change1, change2).indexOf('thisChange'), -1);
+      assert.equal(element._computeChangeContainerClass(
+          change1, change3).indexOf('thisChange'), -1);
+    });
+
+    test('_changesEqual', () => {
+      const change1 = {change_id: 123, _number: 0};
+      const change2 = {change_id: 456, _number: 1};
+      const change3 = {change_id: 123, _number: 2};
+      const change4 = {change_id: 123, _change_number: 1};
+
+      assert.isTrue(element._changesEqual(change1, change1));
+      assert.isFalse(element._changesEqual(change1, change2));
+      assert.isFalse(element._changesEqual(change1, change3));
+      assert.isTrue(element._changesEqual(change2, change4));
+    });
+
+    test('_getChangeNumber', () => {
+      const change1 = {change_id: 123, _number: 0};
+      const change2 = {change_id: 456, _change_number: 1};
+      assert.equal(element._getChangeNumber(change1), 0);
+      assert.equal(element._getChangeNumber(change2), 1);
+    });
+
+    test('event for section loaded fires for each section ', () => {
+      const loadedStub = sandbox.stub();
+      element.patchNum = 7;
+      element.change = {
+        change_id: 123,
+        status: 'NEW',
+      };
+      element.mergeable = true;
+      element.addEventListener('new-section-loaded', loadedStub);
+      sandbox.stub(element, '_getRelatedChanges')
+          .returns(Promise.resolve({changes: []}));
+      sandbox.stub(element, '_getSubmittedTogether')
+          .returns(Promise.resolve());
+      sandbox.stub(element, '_getCherryPicks')
+          .returns(Promise.resolve());
+      sandbox.stub(element, '_getConflicts')
+          .returns(Promise.resolve());
+
+      return element.reload().then(() => {
+        assert.equal(loadedStub.callCount, 4);
+      });
     });
 
     suite('_getConflicts resolves undefined', () => {
@@ -252,8 +298,8 @@
         element.change = {
           change_id: 123,
           status: 'NEW',
-          mergeable: true,
         };
+        element.mergeable = true;
         element.reload();
         assert.equal(element._conflicts.length, 0);
       });
@@ -281,8 +327,8 @@
         element.change = {
           change_id: 123,
           status: 'NEW',
-          mergeable: true,
         };
+        element.mergeable = true;
         element.reload();
         assert.isTrue(conflictsStub.called);
       });
@@ -292,7 +338,6 @@
         element.change = {
           change_id: 123,
           status: 'MERGED',
-          mergeable: true,
         };
         element.reload();
         assert.isFalse(conflictsStub.called);
@@ -303,8 +348,8 @@
         element.change = {
           change_id: 123,
           status: 'NEW',
-          mergeable: false,
         };
+        element.mergeable = false;
         element.reload();
         assert.isFalse(conflictsStub.called);
       });
@@ -314,8 +359,8 @@
         element.change = {
           change_id: 123,
           status: 'MERGED',
-          mergeable: false,
         };
+        element.mergeable = false;
         element.reload();
         assert.isFalse(conflictsStub.called);
       });
@@ -337,25 +382,83 @@
           true);
     });
 
-    test('clear hides', () => {
-      element.loading = false;
-      element.hidden = false;
-      element.clear();
-      assert.isTrue(element.loading);
-      assert.isTrue(element.hidden);
-    });
+    suite('hidden attribute and update event', () => {
+      const changes = [{
+        project: 'foo/bar',
+        change_id: 'Ideadbeef',
+        commit: {
+          commit: 'deadbeef',
+          parents: [{commit: 'abc123'}],
+          author: {},
+          subject: 'do that thing',
+        },
+        _change_number: 12345,
+        _revision_number: 1,
+        _current_revision_number: 1,
+        status: 'NEW',
+      }];
 
-    test('update fires', () => {
-      const updateHandler = sandbox.stub();
-      element.addEventListener('update', updateHandler);
+      test('clear and empties', () => {
+        element._relatedResponse = {changes};
+        element._submittedTogether = {changes};
+        element._conflicts = changes;
+        element._cherryPicks = changes;
+        element._sameTopic = changes;
 
-      element._resultsChanged([], [], [], [], []);
-      assert.isTrue(element.hidden);
-      assert.isFalse(updateHandler.called);
+        element.hidden = false;
+        element.clear();
+        assert.isTrue(element.hidden);
+        assert.equal(element._relatedResponse.changes.length, 0);
+        assert.equal(element._submittedTogether.changes.length, 0);
+        assert.equal(element._conflicts.length, 0);
+        assert.equal(element._cherryPicks.length, 0);
+        assert.equal(element._sameTopic.length, 0);
+      });
 
-      element._resultsChanged([], [], [], [], ['test']);
-      assert.isFalse(element.hidden);
-      assert.isTrue(updateHandler.called);
+      test('update fires', () => {
+        const updateHandler = sandbox.stub();
+        element.addEventListener('update', updateHandler);
+
+        element._resultsChanged({}, {}, [], [], []);
+        assert.isTrue(element.hidden);
+        assert.isFalse(updateHandler.called);
+
+        element._resultsChanged({}, {}, [], [], ['test']);
+        assert.isFalse(element.hidden);
+        assert.isTrue(updateHandler.called);
+      });
+
+      suite('hiding and unhiding', () => {
+        test('related response', () => {
+          assert.isTrue(element.hidden);
+          element._resultsChanged({changes}, {}, [], [], []);
+          assert.isFalse(element.hidden);
+        });
+
+        test('submitted together', () => {
+          assert.isTrue(element.hidden);
+          element._resultsChanged({}, {changes}, [], [], []);
+          assert.isFalse(element.hidden);
+        });
+
+        test('conflicts', () => {
+          assert.isTrue(element.hidden);
+          element._resultsChanged({}, {}, changes, [], []);
+          assert.isFalse(element.hidden);
+        });
+
+        test('cherrypicks', () => {
+          assert.isTrue(element.hidden);
+          element._resultsChanged({}, {}, [], changes, []);
+          assert.isFalse(element.hidden);
+        });
+
+        test('same topic', () => {
+          assert.isTrue(element.hidden);
+          element._resultsChanged({}, {}, [], [], changes);
+          assert.isFalse(element.hidden);
+        });
+      });
     });
 
     test('_computeChangeURL uses Gerrit.Nav', () => {
@@ -363,5 +466,83 @@
       element._computeChangeURL(123, 'abc/def', 12);
       assert.isTrue(getUrlStub.called);
     });
+
+    suite('submitted together changes', () => {
+      const change = {
+        project: 'foo/bar',
+        change_id: 'Ideadbeef',
+        commit: {
+          commit: 'deadbeef',
+          parents: [{commit: 'abc123'}],
+          author: {},
+          subject: 'do that thing',
+        },
+        _change_number: 12345,
+        _revision_number: 1,
+        _current_revision_number: 1,
+        status: 'NEW',
+      };
+
+      test('_computeSubmittedTogetherClass', () => {
+        assert.strictEqual(
+            element._computeSubmittedTogetherClass(undefined),
+            'hidden');
+        assert.strictEqual(
+            element._computeSubmittedTogetherClass({changes: []}),
+            'hidden');
+        assert.strictEqual(
+            element._computeSubmittedTogetherClass({changes: [{}]}),
+            '');
+        assert.strictEqual(
+            element._computeSubmittedTogetherClass({
+              changes: [],
+              non_visible_changes: 0,
+            }),
+            'hidden');
+        assert.strictEqual(
+            element._computeSubmittedTogetherClass({
+              changes: [],
+              non_visible_changes: 1,
+            }),
+            '');
+        assert.strictEqual(
+            element._computeSubmittedTogetherClass({
+              changes: [{}],
+              non_visible_changes: 1,
+            }),
+            '');
+      });
+
+      test('no submitted together changes', () => {
+        flushAsynchronousOperations();
+        assert.include(element.$.submittedTogether.className, 'hidden');
+      });
+
+      test('no non-visible submitted together changes', () => {
+        element._submittedTogether = {changes: [change]};
+        flushAsynchronousOperations();
+        assert.notInclude(element.$.submittedTogether.className, 'hidden');
+        assert.isNull(element.$$('.note'));
+      });
+
+      test('no visible submitted together changes', () => {
+        // Technically this should never happen, but worth asserting the logic.
+        element._submittedTogether = {changes: [], non_visible_changes: 1};
+        flushAsynchronousOperations();
+        assert.notInclude(element.$.submittedTogether.className, 'hidden');
+        assert.isNotNull(element.$$('.note'));
+        assert.strictEqual(
+            element.$$('.note').innerText, '(+ 1 non-visible change)');
+      });
+
+      test('visible and non-visible submitted together changes', () => {
+        element._submittedTogether = {changes: [change], non_visible_changes: 2};
+        flushAsynchronousOperations();
+        assert.notInclude(element.$.submittedTogether.className, 'hidden');
+        assert.isNotNull(element.$$('.note'));
+        assert.strictEqual(
+            element.$$('.note').innerText, '(+ 2 non-visible changes)');
+      });
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog-it_test.html b/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog-it_test.html
index babd95c..eb06b0f 100644
--- a/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog-it_test.html
+++ b/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog-it_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -86,7 +87,8 @@
         ],
       };
       element.serverConfig = {note_db_enabled: true};
-      sandbox.stub(element, 'fetchIsLatestKnown', () => Promise.resolve(true));
+      sandbox.stub(element, 'fetchChangeUpdates')
+          .returns(Promise.resolve({isLatest: true}));
     };
 
     setup(() => {
@@ -108,12 +110,10 @@
     });
 
     teardown(() => {
-      Gerrit._pluginsPending = -1;
-      Gerrit._allPluginsPromise = undefined;
       sandbox.restore();
     });
 
-    test('send blocked when invalid email is supplied to ccs', () => {
+    test('_submit blocked when invalid email is supplied to ccs', () => {
       const sendStub = sandbox.stub(element, 'send').returns(Promise.resolve());
       // Stub the below function to avoid side effects from the send promise
       // resolving.
@@ -130,12 +130,14 @@
     });
 
     test('lgtm plugin', done => {
+      Gerrit._resetPlugins();
       const pluginHost = fixture('plugin-host');
       pluginHost.config = {
         plugin: {
           js_resource_paths: [],
           html_resource_paths: [
-            new URL('test/plugin.html', window.location.href).toString(),
+            new URL('test/plugin.html?' + Math.random(),
+                window.location.href).toString(),
           ],
         },
       };
diff --git a/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog.html b/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog.html
index 127f6d8..45b9c15 100644
--- a/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog.html
+++ b/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -20,6 +21,7 @@
 <link rel="import" href="../../../behaviors/keyboard-shortcut-behavior/keyboard-shortcut-behavior.html">
 <link rel="import" href="../../../behaviors/rest-client-behavior/rest-client-behavior.html">
 <link rel="import" href="../../../bower_components/iron-autogrow-textarea/iron-autogrow-textarea.html">
+<link rel="import" href="../../core/gr-reporting/gr-reporting.html">
 <link rel="import" href="../../plugins/gr-endpoint-decorator/gr-endpoint-decorator.html">
 <link rel="import" href="../../shared/gr-account-chip/gr-account-chip.html">
 <link rel="import" href="../../shared/gr-textarea/gr-textarea.html">
@@ -37,8 +39,9 @@
   <template>
     <style include="shared-styles">
       :host {
+        background-color: var(--dialog-background-color);
         display: block;
-        max-height: 90vh;
+        max-height: 100%;
       }
       :host([disabled]) {
         pointer-events: none;
@@ -49,16 +52,22 @@
       .container {
         display: flex;
         flex-direction: column;
-        max-height: 90vh;
+        max-height: 100%;
       }
       section {
-        border-top: 1px solid #cdcdcd;
+        border-top: 1px solid var(--border-color);
+        flex-shrink: 0;
         padding: .5em 1.5em;
         width: 100%;
       }
       .actions {
+        background-color: var(--dialog-background-color);
+        bottom: 0;
         display: flex;
         justify-content: space-between;
+        position: sticky;
+        /* @see Issue 8602 */
+        z-index: 1;
       }
       .actions .right gr-button {
         margin-left: 1em;
@@ -68,15 +77,16 @@
         flex-shrink: 0;
       }
       .peopleContainer {
+        border-top: none;
         display: table;
       }
       .peopleList {
         display: flex;
-        align-items: center;
         padding-top: .1em;
       }
       .peopleListLabel {
-        color: #666;
+        color: var(--deemphasized-text-color);
+        margin-top: .2em;
         min-width: 7em;
         padding-right: .5em;
       }
@@ -85,10 +95,6 @@
         flex-wrap: wrap;
         flex: 1;
         min-height: 1.8em;
-        --account-list-style: {
-          max-height: 12em;
-          overflow-y: auto;
-        }
       }
       #reviewerConfirmationOverlay {
         padding: 1em;
@@ -98,13 +104,13 @@
         margin-top: 1em;
       }
       .groupName {
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
       }
       .groupSize {
         font-style: italic;
       }
       .textareaContainer {
-        min-height: 6em;
+        min-height: 12em;
         position: relative;
       }
       .textareaContainer,
@@ -113,15 +119,12 @@
         display: flex;
         width: 100%;
       }
-      .previewContainer gr-formatted-text {
-        background: #f6f6f6;
-        max-height: 20vh;
-        overflow-y: scroll;
-        padding: 1em;
+      gr-endpoint-decorator[name="reply-label-scores"] {
+        display: block;
       }
-      .draftsContainer {
-        flex: 1;
-        overflow-y: auto;
+      .previewContainer gr-formatted-text {
+        background: var(--table-header-background-color);
+        padding: 1em;
       }
       .draftsContainer h3 {
         margin-top: .25em;
@@ -131,12 +134,12 @@
         margin-left: 1em;
       }
       #checkingStatusLabel {
-        color: #444;
+        color: var(--deemphasized-text-color);
         font-style: italic;
       }
       #notLatestLabel,
       #savingLabel {
-        color: red;
+        color: var(--error-text-color);
       }
       #savingLabel {
         display: none;
@@ -144,24 +147,18 @@
       #savingLabel.saving {
         display: inline;
       }
-      @media screen and (max-width: 50em) {
-        :host {
-          max-height: none;
-        }
-        .container {
-          max-height: none;
-        }
+      #pluginMessage {
+        color: var(--deemphasized-text-color);
+        margin-left: 1em;
+        margin-bottom: .5em;
+      }
+      #pluginMessage:empty {
+        display: none;
       }
     </style>
     <div class="container" tabindex="-1">
       <section class="peopleContainer">
         <div class="peopleList">
-          <div class="peopleListLabel">Owner</div>
-          <gr-account-chip account="[[_owner]]"></gr-account-chip>
-        </div>
-      </section>
-      <section class="peopleContainer">
-        <div class="peopleList">
           <div class="peopleListLabel">Reviewers</div>
           <gr-account-list
               id="reviewers"
@@ -170,7 +167,8 @@
               change="[[change]]"
               filter="[[filterReviewerSuggestion]]"
               pending-confirmation="{{_reviewerPendingConfirmation}}"
-              placeholder="Add reviewer...">
+              placeholder="Add reviewer..."
+              on-account-text-changed="_handleAccountTextEntry">
           </gr-account-list>
         </div>
         <template is="dom-if" if="[[serverConfig.note_db_enabled]]">
@@ -183,14 +181,14 @@
                 filter="[[filterCCSuggestion]]"
                 pending-confirmation="{{_ccPendingConfirmation}}"
                 allow-any-input
-                placeholder="Add CC...">
+                placeholder="Add CC..."
+                on-account-text-changed="_handleAccountTextEntry">
             </gr-account-list>
           </div>
         </template>
         <gr-overlay
             id="reviewerConfirmationOverlay"
-            on-iron-overlay-canceled="_cancelPendingReviewer"
-            with-backdrop>
+            on-iron-overlay-canceled="_cancelPendingReviewer">
           <div class="reviewerConfirmation">
             Group
             <span class="groupName">
@@ -222,7 +220,6 @@
               monospace="true"
               disabled="{{disabled}}"
               rows="4"
-              max-rows="15"
               text="{{draft}}"
               on-bind-value-changed="_handleHeightChanged">
           </gr-textarea>
@@ -239,12 +236,15 @@
             config="[[projectConfig.commentlinks]]"></gr-formatted-text>
       </section>
       <section class="labelsContainer">
-        <gr-label-scores
-            id="labelScores"
-            account="[[_account]]"
-            change="[[change]]"
-            on-labels-changed="_handleLabelsChanged"
-            permitted-labels=[[permittedLabels]]></gr-label-scores>
+        <gr-endpoint-decorator name="reply-label-scores">
+          <gr-label-scores
+              id="labelScores"
+              account="[[_account]]"
+              change="[[change]]"
+              on-labels-changed="_handleLabelsChanged"
+              permitted-labels=[[permittedLabels]]></gr-label-scores>
+        </gr-endpoint-decorator>
+        <div id="pluginMessage">[[_pluginMessage]]</div>
       </section>
       <section class="draftsContainer" hidden$="[[_computeHideDraftList(diffDrafts)]]">
         <div class="includeComments">
@@ -270,7 +270,7 @@
           <template is="dom-if" if="[[canBeStarted]]">
             <gr-button
                 link
-                tertiary
+                secondary
                 disabled="[[_isState(knownLatestState, 'not-latest')]]"
                 class="action save"
                 has-tooltip
@@ -285,7 +285,7 @@
           <span
               id="notLatestLabel"
               hidden$="[[!_isState(knownLatestState, 'not-latest')]]">
-            Patch [[patchNum]] is not latest.
+            [[_computePatchSetWarning(patchNum, _labelsChanged)]]
             <gr-button link on-tap="_reload">Reload</gr-button>
           </span>
         </div>
@@ -296,9 +296,10 @@
               class="action cancel"
               on-tap="_cancelTapHandler">Cancel</gr-button>
           <gr-button
+              id="sendButton"
               link
               primary
-              disabled="[[_computeSendButtonDisabled(knownLatestState, _sendButtonLabel, diffDrafts, draft, _reviewersMutated, _labelsChanged, _includeComments)]]"
+              disabled="[[_sendDisabled]]"
               class="action send"
               has-tooltip
               title$="[[_computeSendButtonTooltip(canBeStarted)]]"
@@ -309,6 +310,7 @@
     <gr-js-api-interface id="jsAPI"></gr-js-api-interface>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
     <gr-storage id="storage"></gr-storage>
+    <gr-reporting id="reporting"></gr-reporting>
   </template>
   <script src="gr-reply-dialog.js"></script>
 </dom-module>
diff --git a/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog.js b/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog.js
index a1719da..9f9f026 100644
--- a/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog.js
+++ b/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -40,7 +43,7 @@
   };
 
   const ButtonTooltips = {
-    SAVE: 'Save reply but do not send',
+    SAVE: 'Save reply but do not send notification',
     START_REVIEW: 'Mark as ready for review and send reply',
     SEND: 'Send reply',
   };
@@ -49,6 +52,10 @@
   // googlesource.com.
   const START_REVIEW_MESSAGE = 'This change is ready for review.';
 
+  const EMPTY_REPLY_MESSAGE = 'Cannot send an empty reply.';
+
+  const SEND_REPLY_TIMING_LABEL = 'SendReply';
+
   Polymer({
     is: 'gr-reply-dialog',
 
@@ -84,6 +91,12 @@
      * @event comment-refresh
      */
 
+     /**
+      * Fires when the state of the send button (enabled/disabled) changes.
+      *
+      * @event send-disabled-changed
+      */
+
     properties: {
       /**
        * @type {{ _number: number, removable_reviewers: Array }}
@@ -199,6 +212,17 @@
         value: ButtonTooltips.SAVE,
         readOnly: true,
       },
+      _pluginMessage: {
+        type: String,
+        value: '',
+      },
+      _sendDisabled: {
+        type: Boolean,
+        computed: '_computeSendButtonDisabled(_sendButtonLabel, diffDrafts, ' +
+            'draft, _reviewersMutated, _labelsChanged, _includeComments, ' +
+            'disabled)',
+        observer: '_sendDisabledChanged',
+      },
     },
 
     FocusTarget,
@@ -237,14 +261,19 @@
 
     open(opt_focusTarget) {
       this.knownLatestState = LatestPatchState.CHECKING;
-      this.fetchIsLatestKnown(this.change, this.$.restAPI)
-          .then(isUpToDate => {
-            this.knownLatestState = isUpToDate ?
+      this.fetchChangeUpdates(this.change, this.$.restAPI)
+          .then(result => {
+            this.knownLatestState = result.isLatest ?
                 LatestPatchState.LATEST : LatestPatchState.NOT_LATEST;
           });
 
       this._focusOn(opt_focusTarget);
-      if (!this.draft || !this.draft.length) {
+      if (this.quote && this.quote.length) {
+        // If a reply quote has been provided, use it and clear the property.
+        this.draft = this.quote;
+        this.quote = '';
+      } else {
+        // Otherwise, check for an unsaved draft in localstorage.
         this.draft = this._loadStoredDraft();
       }
       if (this.$.restAPI.hasPendingDiffDrafts()) {
@@ -261,9 +290,10 @@
     },
 
     getFocusStops() {
+      const end = this._sendDisabled ? this.$.cancelButton : this.$.sendButton;
       return {
         start: this.$.reviewers.focusStart,
-        end: this.$.cancelButton,
+        end,
       };
     },
 
@@ -401,12 +431,7 @@
     },
 
     send(includeComments, startReview) {
-      if (this.knownLatestState === 'not-latest') {
-        this.fire('show-alert',
-            {message: 'Cannot reply to non-latest patch.'});
-        return Promise.resolve({});
-      }
-
+      this.$.reporting.time(SEND_REPLY_TIMING_LABEL);
       const labels = this.$.labelScores.getLabelValues();
 
       const obj = {
@@ -510,7 +535,8 @@
     },
 
     _focusOn(section) {
-      if (section === FocusTarget.ANY) {
+      // Safeguard- always want to focus on something.
+      if (!section || section === FocusTarget.ANY) {
         section = this._chooseFocusTarget();
       }
       if (section === FocusTarget.BODY) {
@@ -719,6 +745,13 @@
         // the text field of the CC entry.
         return;
       }
+      if (this._sendDisabled) {
+        this.dispatchEvent(new CustomEvent('show-alert', {
+          bubbles: true,
+          detail: {message: EMPTY_REPLY_MESSAGE},
+        }));
+        return;
+      }
       return this.send(this._includeComments, this.canBeStarted)
           .then(keepReviewers => {
             this._purgeReviewersPendingRemove(false, keepReviewers);
@@ -774,6 +807,14 @@
       return draft ? draft.message : '';
     },
 
+    _handleAccountTextEntry() {
+      // When either of the account entries has input added to the autocomplete,
+      // it should trigger the save button to enable/
+      //
+      // Note: if the text is removed, the save button will not get disabled.
+      this._reviewersMutated = true;
+    },
+
     _draftChanged(newDraft, oldDraft) {
       this.debounce('store', () => {
         if (!newDraft.length && oldDraft) {
@@ -821,16 +862,28 @@
       return savingComments ? 'saving' : '';
     },
 
-    _computeSendButtonDisabled(knownLatestState, buttonLabel, drafts, text,
-        reviewersMutated, labelsChanged, includeComments) {
-      if (this._isState(knownLatestState, LatestPatchState.NOT_LATEST)) {
-        return true;
-      }
-      if (buttonLabel === ButtonLabels.START_REVIEW) {
-        return false;
-      }
+    _computeSendButtonDisabled(buttonLabel, drafts, text, reviewersMutated,
+        labelsChanged, includeComments, disabled) {
+      if (disabled) { return true; }
+      if (buttonLabel === ButtonLabels.START_REVIEW) { return false; }
       const hasDrafts = includeComments && Object.keys(drafts).length;
       return !hasDrafts && !text.length && !reviewersMutated && !labelsChanged;
     },
+
+    _computePatchSetWarning(patchNum, labelsChanged) {
+      let str = `Patch ${patchNum} is not latest.`;
+      if (labelsChanged) {
+        str += ' Voting on a non-latest patch will have no effect.';
+      }
+      return str;
+    },
+
+    setPluginMessage(message) {
+      this._pluginMessage = message;
+    },
+
+    _sendDisabledChanged(sendDisabled) {
+      this.dispatchEvent(new CustomEvent('send-disabled-changed'));
+    },
   });
 })();
diff --git a/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog_test.html b/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog_test.html
index 278f2c6..f9108c7 100644
--- a/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog_test.html
+++ b/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -103,8 +104,8 @@
       eraseDraftCommentStub = sandbox.stub(element.$.storage,
           'eraseDraftComment');
 
-      sandbox.stub(element, 'fetchIsLatestKnown',
-          () => { return Promise.resolve(true); });
+      sandbox.stub(element, 'fetchChangeUpdates')
+          .returns(Promise.resolve({isLatest: true}));
 
       // Allow the elements created by dom-repeat to be stamped.
       flushAsynchronousOperations();
@@ -249,8 +250,8 @@
 
     test('getlabelValue when no score is selected', done => {
       flush(() => {
-        element.$$('gr-label-scores').$$(`gr-label-score-row[name="Code-Review"]`)
-            .setSelectedValue(-1);
+        element.$$('gr-label-scores')
+            .$$(`gr-label-score-row[name="Code-Review"]`).setSelectedValue(-1);
         assert.strictEqual(element.getLabelValue('Verified'), ' 0');
         done();
       });
@@ -407,6 +408,17 @@
       assert.equal(actual.path, '@change');
     });
 
+    test('_reviewersMutated when account-text-change is fired from ccs', () => {
+      element.serverConfig = {note_db_enabled: true};
+      flushAsynchronousOperations();
+      assert.isFalse(element._reviewersMutated);
+      assert.isTrue(element.$$('#ccs').allowAnyInput);
+      assert.isFalse(element.$$('#reviewers').allowAnyInput);
+      element.$$('#ccs').dispatchEvent(new CustomEvent('account-text-changed',
+          {bubbles: true}));
+      assert.isTrue(element._reviewersMutated);
+    });
+
     test('gets draft from storage on open', () => {
       const storedDraft = 'hello world';
       getDraftCommentStub.returns({message: storedDraft});
@@ -415,13 +427,34 @@
       assert.equal(element.draft, storedDraft);
     });
 
+    test('gets draft from storage even when text is already present', () => {
+      const storedDraft = 'hello world';
+      getDraftCommentStub.returns({message: storedDraft});
+      element.draft = 'foo bar';
+      element.open();
+      assert.isTrue(getDraftCommentStub.called);
+      assert.equal(element.draft, storedDraft);
+    });
+
     test('blank if no stored draft', () => {
       getDraftCommentStub.returns(null);
+      element.draft = 'foo bar';
       element.open();
       assert.isTrue(getDraftCommentStub.called);
       assert.equal(element.draft, '');
     });
 
+    test('does not check stored draft when quote is present', () => {
+      const storedDraft = 'hello world';
+      const quote = '> foo bar';
+      getDraftCommentStub.returns({message: storedDraft});
+      element.quote = quote;
+      element.open();
+      assert.isFalse(getDraftCommentStub.called);
+      assert.equal(element.draft, quote);
+      assert.isNotOk(element.quote);
+    });
+
     test('updates stored draft on edits', () => {
       const firstEdit = 'hello';
       const location = element._getStorageLocation();
@@ -505,6 +538,45 @@
       assert.isFalse(filter({group: cc2}));
     });
 
+    test('_focusOn', () => {
+      sandbox.spy(element, '_chooseFocusTarget');
+      element.serverConfig = {note_db_enabled: true};
+      flushAsynchronousOperations();
+      const textareaStub = sandbox.stub(element.$.textarea, 'async');
+      const reviewerEntryStub = sandbox.stub(element.$.reviewers.focusStart,
+          'async');
+      const ccStub = sandbox.stub(element.$$('#ccs').focusStart, 'async');
+      element._focusOn();
+      assert.equal(element._chooseFocusTarget.callCount, 1);
+      assert.deepEqual(textareaStub.callCount, 1);
+      assert.deepEqual(reviewerEntryStub.callCount, 0);
+      assert.deepEqual(ccStub.callCount, 0);
+
+      element._focusOn(element.FocusTarget.ANY);
+      assert.equal(element._chooseFocusTarget.callCount, 2);
+      assert.deepEqual(textareaStub.callCount, 2);
+      assert.deepEqual(reviewerEntryStub.callCount, 0);
+      assert.deepEqual(ccStub.callCount, 0);
+
+      element._focusOn(element.FocusTarget.BODY);
+      assert.equal(element._chooseFocusTarget.callCount, 2);
+      assert.deepEqual(textareaStub.callCount, 3);
+      assert.deepEqual(reviewerEntryStub.callCount, 0);
+      assert.deepEqual(ccStub.callCount, 0);
+
+      element._focusOn(element.FocusTarget.REVIEWERS);
+      assert.equal(element._chooseFocusTarget.callCount, 2);
+      assert.deepEqual(textareaStub.callCount, 3);
+      assert.deepEqual(reviewerEntryStub.callCount, 1);
+      assert.deepEqual(ccStub.callCount, 0);
+
+      element._focusOn(element.FocusTarget.CCS);
+      assert.equal(element._chooseFocusTarget.callCount, 2);
+      assert.deepEqual(textareaStub.callCount, 3);
+      assert.deepEqual(reviewerEntryStub.callCount, 1);
+      assert.deepEqual(ccStub.callCount, 1);
+    });
+
     test('_chooseFocusTarget', () => {
       element._account = null;
       assert.strictEqual(
@@ -1012,21 +1084,52 @@
 
     test('_computeSendButtonDisabled', () => {
       const fn = element._computeSendButtonDisabled.bind(element);
-      assert.isTrue(fn('not-latest'));
-      assert.isFalse(fn('latest', 'Start review'));
-      assert.isTrue(fn('latest', 'Send', {}, '', false, false, false));
+      assert.isFalse(fn('Start review'));
+      assert.isTrue(fn('Send', {}, '', false, false, false));
       // Mock nonempty comment draft array, with seding comments.
-      assert.isFalse(fn('latest', 'Send', {file: ['draft']}, '', false, false,
-          true));
+      assert.isFalse(fn('Send', {file: ['draft']}, '', false, false, true));
       // Mock nonempty comment draft array, without seding comments.
-      assert.isTrue(fn('latest', 'Send', {file: ['draft']}, '', false, false,
-          false));
+      assert.isTrue(fn('Send', {file: ['draft']}, '', false, false, false));
       // Mock nonempty change message.
-      assert.isFalse(fn('latest', 'Send', {}, 'test', false, false, false));
+      assert.isFalse(fn('Send', {}, 'test', false, false, false));
       // Mock reviewers mutated.
-      assert.isFalse(fn('latest', 'Send', {}, '', true, false, false));
+      assert.isFalse(fn('Send', {}, '', true, false, false));
       // Mock labels changed.
-      assert.isFalse(fn('latest', 'Send', {}, '', false, true, false));
+      assert.isFalse(fn('Send', {}, '', false, true, false));
+      // Whole dialog is disabled.
+      assert.isTrue(fn('Send', {}, '', false, true, false, true));
+    });
+
+    test('_submit blocked when no mutations exist', () => {
+      const sendStub = sandbox.stub(element, 'send').returns(Promise.resolve());
+      // Stub the below function to avoid side effects from the send promise
+      // resolving.
+      sandbox.stub(element, '_purgeReviewersPendingRemove');
+      element.diffDrafts = {};
+      flushAsynchronousOperations();
+
+      MockInteractions.tap(element.$$('gr-button.send'));
+      assert.isFalse(sendStub.called);
+
+      element.diffDrafts = {test: true};
+      flushAsynchronousOperations();
+
+      MockInteractions.tap(element.$$('gr-button.send'));
+      assert.isTrue(sendStub.called);
+    });
+
+    test('getFocusStops', () => {
+      // Setting diffDrafts to an empty object causes _sendDisabled to be
+      // computed to false.
+      element.diffDrafts = {};
+      assert.equal(element.getFocusStops().end, element.$.cancelButton);
+      element.diffDrafts = {test: true};
+      assert.equal(element.getFocusStops().end, element.$.sendButton);
+    });
+
+    test('setPluginMessage', () => {
+      element.setPluginMessage('foo');
+      assert.equal(element.$.pluginMessage.textContent, 'foo');
     });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/change/gr-reply-dialog/test/plugin.html b/polygerrit-ui/app/elements/change/gr-reply-dialog/test/plugin.html
index 70e1b83..94787e6 100644
--- a/polygerrit-ui/app/elements/change/gr-reply-dialog/test/plugin.html
+++ b/polygerrit-ui/app/elements/change/gr-reply-dialog/test/plugin.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -27,6 +28,6 @@
           replyApi.setLabelValue(label, '+1');
         }
       });
-    }, '0.1', 'http://test.com/plugins/testplugin/static/test.js');
+    });
   </script>
 </dom-module>
diff --git a/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list.html b/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list.html
index 9a5b5ed..73e8bea 100644
--- a/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list.html
+++ b/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -48,11 +49,11 @@
       gr-account-chip {
         margin-top: .3em;
       }
-      .remove {
-        color: #999;
-      }
-      .remove {
-        font-size: .9em;
+      gr-button {
+        --gr-button: {
+          padding-left: 0;
+          padding-right: 0;
+        }
       }
       @media screen and (max-width: 50em), screen and (min-width: 75em) {
         gr-account-chip:first-of-type {
@@ -63,6 +64,7 @@
     <template is="dom-repeat" items="[[_displayedReviewers]]" as="reviewer">
       <gr-account-chip class="reviewer" account="[[reviewer]]"
           on-remove="_handleRemove"
+          additional-text="[[_computeReviewerTooltip(reviewer, change)]]"
           removable="[[_computeCanRemoveReviewer(reviewer, mutable)]]">
       </gr-account-chip>
     </template>
diff --git a/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list.js b/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list.js
index 59332f9..ab1f55e 100644
--- a/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list.js
+++ b/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -75,6 +78,87 @@
       '_reviewersChanged(change.reviewers.*, change.owner)',
     ],
 
+    /**
+     * Converts change.permitted_labels to an array of hashes of label keys to
+     * numeric scores.
+     * Example:
+     * [{
+     *   'Code-Review': ['-1', ' 0', '+1']
+     * }]
+     * will be converted to
+     * [{
+     *   label: 'Code-Review',
+     *   scores: [-1, 0, 1]
+     * }]
+     */
+    _permittedLabelsToNumericScores(labels) {
+      if (!labels) return [];
+      return Object.keys(labels).map(label => ({
+        label,
+        scores: labels[label].map(v => parseInt(v, 10)),
+      }));
+    },
+
+    /**
+     * Returns hash of labels to max permitted score.
+     * @param {!Object} change
+     * @returns {!Object} labels to max permitted scores hash
+     */
+    _getMaxPermittedScores(change) {
+      return this._permittedLabelsToNumericScores(change.permitted_labels)
+          .map(({label, scores}) => ({
+            [label]: scores
+                .map(v => parseInt(v, 10))
+                .reduce((a, b) => Math.max(a, b))}))
+          .reduce((acc, i) => Object.assign(acc, i), {});
+    },
+
+    /**
+     * Returns max permitted score for reviewer.
+     * @param {!Object} reviewer
+     * @param {!Object} change
+     * @param {string} label
+     * @return {number}
+     */
+    _getReviewerPermittedScore(reviewer, change, label) {
+      // Note (issue 7874): sometimes the "all" list is not included in change
+      // detail responses, even when DETAILED_LABELS is included in options.
+      if (!change.labels[label].all) { return NaN; }
+      const detailed = change.labels[label].all.filter(
+          ({_account_id}) => reviewer._account_id === _account_id).pop();
+      if (!detailed) {
+        return NaN;
+      }
+      if (detailed.hasOwnProperty('permitted_voting_range')) {
+        return detailed.permitted_voting_range.max;
+      } else if (detailed.hasOwnProperty('value')) {
+        // If preset, user can vote on the label.
+        return 0;
+      }
+      return NaN;
+    },
+
+    _computeReviewerTooltip(reviewer, change) {
+      if (!change || !change.labels) { return ''; }
+      const maxScores = [];
+      const maxPermitted = this._getMaxPermittedScores(change);
+      for (const label of Object.keys(change.labels)) {
+        const maxScore =
+              this._getReviewerPermittedScore(reviewer, change, label);
+        if (isNaN(maxScore) || maxScore < 0) { continue; }
+        if (maxScore > 0 && maxScore === maxPermitted[label]) {
+          maxScores.push(`${label}: +${maxScore}`);
+        } else {
+          maxScores.push(`${label}`);
+        }
+      }
+      if (maxScores.length) {
+        return 'Votable: ' + maxScores.join(', ');
+      } else {
+        return '';
+      }
+    },
+
     _reviewersChanged(changeRecord, owner) {
       let result = [];
       const reviewers = changeRecord.base;
diff --git a/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list_test.html b/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list_test.html
index 40f1cbd..1a406c9 100644
--- a/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list_test.html
+++ b/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -205,7 +206,6 @@
           CC: reviewers,
         },
       };
-      flushAsynchronousOperations();
       assert.equal(element._hiddenReviewerCount, 0);
       assert.equal(element._displayedReviewers.length, 6);
       assert.equal(element._reviewers.length, 6);
@@ -229,7 +229,6 @@
           CC: reviewers,
         },
       };
-      flushAsynchronousOperations();
       assert.equal(element._hiddenReviewerCount, 2);
       assert.equal(element._displayedReviewers.length, 5);
       assert.equal(element._reviewers.length, 7);
@@ -253,7 +252,6 @@
           CC: reviewers,
         },
       };
-      flushAsynchronousOperations();
       assert.equal(element._hiddenReviewerCount, 0);
       assert.equal(element._displayedReviewers.length, 7);
       assert.equal(element._reviewers.length, 7);
@@ -277,18 +275,58 @@
           CC: reviewers,
         },
       };
-      flushAsynchronousOperations();
       assert.equal(element._hiddenReviewerCount, 95);
       assert.equal(element._displayedReviewers.length, 5);
       assert.equal(element._reviewers.length, 100);
       assert.isFalse(element.$$('.hiddenReviewers').hidden);
 
       MockInteractions.tap(element.$$('.hiddenReviewers'));
-      flushAsynchronousOperations();
+
       assert.equal(element._hiddenReviewerCount, 0);
       assert.equal(element._displayedReviewers.length, 100);
       assert.equal(element._reviewers.length, 100);
       assert.isTrue(element.$$('.hiddenReviewers').hidden);
     });
+
+    test('votable labels', () => {
+      const change = {
+        labels: {
+          Foo: {
+            all: [{_account_id: 7, permitted_voting_range: {max: 2}}],
+          },
+          Bar: {
+            all: [{_account_id: 1, permitted_voting_range: {max: 1}},
+                  {_account_id: 7, permitted_voting_range: {max: 1}}],
+          },
+          FooBar: {
+            all: [{_account_id: 7, value: 0}],
+          },
+        },
+        permitted_labels: {
+          Foo: ['-1', ' 0', '+1', '+2'],
+          FooBar: ['-1', ' 0'],
+        },
+      };
+      assert.strictEqual(
+          element._computeReviewerTooltip({_account_id: 1}, change),
+          'Votable: Bar');
+      assert.strictEqual(
+          element._computeReviewerTooltip({_account_id: 7}, change),
+          'Votable: Foo: +2, Bar, FooBar');
+      assert.strictEqual(
+          element._computeReviewerTooltip({_account_id: 2}, change),
+          '');
+    });
+
+    test('fails gracefully when all is not included', () => {
+      const change = {
+        labels: {Foo: {}},
+        permitted_labels: {
+          Foo: ['-1', ' 0', '+1', '+2'],
+        },
+      };
+      assert.strictEqual(
+          element._computeReviewerTooltip({_account_id: 1}, change), '');
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/change/gr-thread-list/gr-thread-list.html b/polygerrit-ui/app/elements/change/gr-thread-list/gr-thread-list.html
new file mode 100644
index 0000000..2201a9a
--- /dev/null
+++ b/polygerrit-ui/app/elements/change/gr-thread-list/gr-thread-list.html
@@ -0,0 +1,102 @@
+<!--
+@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="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../../bower_components/paper-toggle-button/paper-toggle-button.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../../diff/gr-diff-comment-thread/gr-diff-comment-thread.html">
+
+<dom-module id="gr-thread-list">
+  <template>
+    <style include="shared-styles">
+      #threads {
+        display: block;
+        min-height: 20rem;
+        padding: 1rem;
+      }
+      gr-diff-comment-thread {
+        display: block;
+        margin-bottom: .5rem;
+        max-width: 80ch;
+      }
+      .header {
+        align-items: center;
+        background-color: var(--table-header-background-color);
+        border-bottom: 1px solid var(--border-color);
+        border-top: 1px solid var(--border-color);
+        display: flex;
+        justify-content: left;
+        min-height: 3.2em;
+        padding: .5em var(--default-horizontal-margin);
+      }
+      .toggleItem.draftToggle {
+        display: none;
+      }
+      .toggleItem.draftToggle.show {
+        display: flex;
+      }
+      .toggleItem {
+        align-items: center;
+        display: flex;
+        margin-right: 1rem;
+      }
+      .draftsOnly:not(.unresolvedOnly) gr-diff-comment-thread[has-draft],
+      .unresolvedOnly:not(.draftsOnly) gr-diff-comment-thread[unresolved],
+      .draftsOnly.unresolvedOnly gr-diff-comment-thread[has-draft][unresolved] {
+        display: block
+      }
+    </style>
+    <div class="header">
+      <div class="toggleItem">
+        <paper-toggle-button
+            id="unresolvedToggle"
+            checked="{{_unresolvedOnly}}"></paper-toggle-button>
+          Only unresolved threads</div>
+      <div class$="toggleItem draftToggle [[_computeShowDraftToggle(loggedIn)]]">
+        <paper-toggle-button
+            id="draftToggle"
+            checked="{{_draftsOnly}}"></paper-toggle-button>
+          Only threads with drafts</div>
+    </div>
+    <div id="threads">
+      <template is="dom-if" if="[[!threads.length]]">
+        There are no inline comment threads on any diff for this change.
+      </template>
+      <template
+          is="dom-repeat"
+          items="[[_filteredThreads]]"
+          as="thread"
+          initial-count="5"
+          target-framerate="60">
+        <gr-diff-comment-thread
+            show-file-path
+            change-num="[[changeNum]]"
+            comments="[[thread.comments]]"
+            comment-side="[[thread.commentSide]]"
+            project-name="[[change.project]]"
+            is-on-parent="[[_isOnParent(thread.commentSide)]]"
+            line-num="[[thread.line]]"
+            patch-num="[[thread.patchNum]]"
+            path="[[thread.path]]"
+            root-id="{{thread.rootId}}"
+            on-thread-changed="_handleCommentsChanged"
+            on-thread-discard="_handleThreadDiscard"></gr-diff-comment-thread>
+      </template>
+    </div>
+  </template>
+  <script src="gr-thread-list.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/change/gr-thread-list/gr-thread-list.js b/polygerrit-ui/app/elements/change/gr-thread-list/gr-thread-list.js
new file mode 100644
index 0000000..69d77f6
--- /dev/null
+++ b/polygerrit-ui/app/elements/change/gr-thread-list/gr-thread-list.js
@@ -0,0 +1,153 @@
+/**
+ * @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';
+
+  /**
+   * Fired when a comment is saved or deleted
+   *
+   * @event thread-list-modified
+   */
+
+  Polymer({
+    is: 'gr-thread-list',
+
+    properties: {
+      /** @type {?} */
+      change: Object,
+      threads: Array,
+      changeNum: String,
+      loggedIn: Boolean,
+      _sortedThreads: {
+        type: Array,
+      },
+      _filteredThreads: {
+        type: Array,
+        computed: '_computeFilteredThreads(_sortedThreads, _unresolvedOnly, ' +
+            '_draftsOnly)',
+      },
+      _unresolvedOnly: {
+        type: Boolean,
+        value: false,
+      },
+      _draftsOnly: {
+        type: Boolean,
+        value: false,
+      },
+    },
+
+    observers: ['_computeSortedThreads(threads.*)'],
+
+    _computeShowDraftToggle(loggedIn) {
+      return loggedIn ? 'show' : '';
+    },
+
+    /**
+     * Order as follows:
+     *  - Unresolved threads with drafts (reverse chronological)
+     *  - Unresolved threads without drafts (reverse chronological)
+     *  - Resolved threads with drafts (reverse chronological)
+     *  - Resolved threads without drafts (reverse chronological)
+     * @param {!Object} changeRecord
+     */
+    _computeSortedThreads(changeRecord) {
+      const threads = changeRecord.base;
+      if (!threads) { return []; }
+      this._updateSortedThreads(threads);
+    },
+
+    _updateSortedThreads(threads) {
+      this._sortedThreads =
+          threads.map(this._getThreadWithSortInfo).sort((c1, c2) => {
+            const c1Date = c1.__date || util.parseDate(c1.updated);
+            const c2Date = c2.__date || util.parseDate(c2.updated);
+            const dateCompare = c2Date - c1Date;
+            if (c2.unresolved || c1.unresolved) {
+              if (!c1.unresolved) { return 1; }
+              if (!c2.unresolved) { return -1; }
+            }
+            if (c2.hasDraft || c1.hasDraft) {
+              if (!c1.hasDraft) { return 1; }
+              if (!c2.hasDraft) { return -1; }
+            }
+
+            if (dateCompare === 0 && (!c1.id || !c1.id.localeCompare)) {
+              return 0;
+            }
+            return dateCompare ? dateCompare : c1.id.localeCompare(c2.id);
+          });
+    },
+
+    _computeFilteredThreads(sortedThreads, unresolvedOnly, draftsOnly) {
+      return sortedThreads.filter(c => {
+        if (draftsOnly) {
+          return c.hasDraft;
+        } else if (unresolvedOnly) {
+          return c.unresolved;
+        } else {
+          return c;
+        }
+      }).map(threadInfo => threadInfo.thread);
+    },
+
+    _getThreadWithSortInfo(thread) {
+      const lastComment = thread.comments[thread.comments.length - 1] || {};
+
+      const lastNonDraftComment =
+          (lastComment.__draft && thread.comments.length > 1) ?
+          thread.comments[thread.comments.length - 2] :
+          lastComment;
+
+      return {
+        thread,
+        // Use the unresolved bit for the last non draft comment. This is what
+        // anybody other than the current user would see.
+        unresolved: !!lastNonDraftComment.unresolved,
+        hasDraft: !!lastComment.__draft,
+        updated: lastComment.updated,
+      };
+    },
+
+    removeThread(rootId) {
+      for (let i = 0; i < this.threads.length; i++) {
+        if (this.threads[i].rootId === rootId) {
+          this.splice('threads', i, 1);
+          // Needed to ensure threads get re-rendered in the correct order.
+          Polymer.dom.flush();
+          return;
+        }
+      }
+    },
+
+    _handleThreadDiscard(e) {
+      this.removeThread(e.detail.rootId);
+    },
+
+    _handleCommentsChanged(e) {
+      // Reset threads so thread computations occur on deep array changes to
+      // threads comments that are not observed naturally.
+      this._updateSortedThreads(this.threads);
+
+      this.dispatchEvent(new CustomEvent('thread-list-modified',
+          {detail: {rootId: e.detail.rootId, path: e.detail.path}}));
+    },
+
+    _isOnParent(side) {
+      return !!side;
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/change/gr-thread-list/gr-thread-list_test.html b/polygerrit-ui/app/elements/change/gr-thread-list/gr-thread-list_test.html
new file mode 100644
index 0000000..804446a
--- /dev/null
+++ b/polygerrit-ui/app/elements/change/gr-thread-list/gr-thread-list_test.html
@@ -0,0 +1,266 @@
+<!DOCTYPE html>
+<!--
+@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.
+-->
+
+<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+<title>gr-thread-list</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-thread-list.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-thread-list></gr-thread-list>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-thread-list tests', () => {
+    let element;
+    let sandbox;
+    let threadElements;
+
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+      element = fixture('basic');
+      element.threads = [
+        {
+          comments: [
+            {
+              __path: '/COMMIT_MSG',
+              author: {
+                _account_id: 1000000,
+                name: 'user',
+                username: 'user',
+              },
+              patch_set: 4,
+              id: 'ecf0b9fa_fe1a5f62',
+              line: 5,
+              updated: '2018-02-08 18:49:18.000000000',
+              message: 'test',
+              unresolved: true,
+            },
+            {
+              id: '503008e2_0ab203ee',
+              path: '/COMMIT_MSG',
+              line: 5,
+              in_reply_to: 'ecf0b9fa_fe1a5f62',
+              updated: '2018-02-13 22:48:48.018000000',
+              message: 'draft',
+              unresolved: false,
+              __draft: true,
+              __draftID: '0.m683trwff68',
+              __editing: false,
+              patch_set: '2',
+            },
+          ],
+          patchNum: 4,
+          path: '/COMMIT_MSG',
+          line: 5,
+          rootId: 'ecf0b9fa_fe1a5f62',
+          start_datetime: '2018-02-08 18:49:18.000000000',
+        },
+        {
+          comments: [
+            {
+              __path: 'test.txt',
+              author: {
+                _account_id: 1000000,
+                name: 'user',
+                username: 'user',
+              },
+              patch_set: 3,
+              id: '09a9fb0a_1484e6cf',
+              side: 'PARENT',
+              updated: '2018-02-13 22:47:19.000000000',
+              message: 'Some comment on another patchset.',
+              unresolved: false,
+            },
+          ],
+          patchNum: 3,
+          path: 'test.txt',
+          rootId: '09a9fb0a_1484e6cf',
+          start_datetime: '2018-02-13 22:47:19.000000000',
+          commentSide: 'PARENT',
+        },
+        {
+          comments: [
+            {
+              __path: '/COMMIT_MSG',
+              author: {
+                _account_id: 1000000,
+                name: 'user',
+                username: 'user',
+              },
+              patch_set: 2,
+              id: '8caddf38_44770ec1',
+              line: 4,
+              updated: '2018-02-13 22:48:40.000000000',
+              message: 'Another unresolved comment',
+              unresolved: true,
+            },
+          ],
+          patchNum: 2,
+          path: '/COMMIT_MSG',
+          line: 4,
+          rootId: '8caddf38_44770ec1',
+          start_datetime: '2018-02-13 22:48:40.000000000',
+        },
+        {
+          comments: [
+            {
+              __path: '/COMMIT_MSG',
+              author: {
+                _account_id: 1000000,
+                name: 'user',
+                username: 'user',
+              },
+              patch_set: 2,
+              id: 'scaddf38_44770ec1',
+              line: 4,
+              updated: '2018-02-14 22:48:40.000000000',
+              message: 'Yet another unresolved comment',
+              unresolved: true,
+            },
+          ],
+          patchNum: 2,
+          path: '/COMMIT_MSG',
+          line: 4,
+          rootId: 'scaddf38_44770ec1',
+          start_datetime: '2018-02-14 22:48:40.000000000',
+        },
+        {
+          comments: [
+            {
+              id: 'zcf0b9fa_fe1a5f62',
+              path: '/COMMIT_MSG',
+              line: 6,
+              updated: '2018-02-15 22:48:48.018000000',
+              message: 'resolved draft',
+              unresolved: false,
+              __draft: true,
+              __draftID: '0.m683trwff68',
+              __editing: false,
+              patch_set: '2',
+            },
+          ],
+          patchNum: 4,
+          path: '/COMMIT_MSG',
+          line: 6,
+          rootId: 'zcf0b9fa_fe1a5f62',
+          start_datetime: '2018-02-09 18:49:18.000000000',
+        },
+      ];
+      flushAsynchronousOperations();
+      threadElements = Polymer.dom(element.root)
+          .querySelectorAll('gr-diff-comment-thread');
+    });
+
+    teardown(() => {
+      sandbox.restore();
+    });
+
+    test('draft toggle only appears when logged in', () => {
+      assert.equal(getComputedStyle(element.$$('.draftToggle')).display,
+          'none');
+      element.loggedIn = true;
+      assert.notEqual(getComputedStyle(element.$$('.draftToggle')).display,
+          'none');
+    });
+
+    test('there are five threads by default', () => {
+      assert.equal(Polymer.dom(element.root)
+          .querySelectorAll('gr-diff-comment-thread').length, 5);
+    });
+
+    test('_computeSortedThreads', () => {
+      assert.equal(element._sortedThreads.length, 5);
+      // Draft and unresolved
+      assert.equal(element._sortedThreads[0].thread.rootId,
+          'ecf0b9fa_fe1a5f62');
+      // unresolved
+      assert.equal(element._sortedThreads[1].thread.rootId,
+          'scaddf38_44770ec1');
+      // unresolved
+      assert.equal(element._sortedThreads[2].thread.rootId,
+          '8caddf38_44770ec1');
+      // resolved and draft
+      assert.equal(element._sortedThreads[3].thread.rootId,
+          'zcf0b9fa_fe1a5f62');
+      // resolved
+      assert.equal(element._sortedThreads[4].thread.rootId,
+          '09a9fb0a_1484e6cf');
+    });
+
+    test('thread removal', () => {
+      threadElements[1].fire('thread-discard', {rootId: 'scaddf38_44770ec1'});
+      flushAsynchronousOperations();
+      assert.equal(element._sortedThreads.length, 4);
+      assert.equal(element._sortedThreads[0].thread.rootId,
+          'ecf0b9fa_fe1a5f62');
+      // unresolved
+      assert.equal(element._sortedThreads[1].thread.rootId,
+          '8caddf38_44770ec1');
+      // resolved and draft
+      assert.equal(element._sortedThreads[2].thread.rootId,
+          'zcf0b9fa_fe1a5f62');
+      // resolved
+      assert.equal(element._sortedThreads[3].thread.rootId,
+          '09a9fb0a_1484e6cf');
+    });
+
+    test('toggle unresolved only shows unressolved comments', () => {
+      MockInteractions.tap(element.$.unresolvedToggle);
+      flushAsynchronousOperations();
+      assert.equal(Polymer.dom(element.root)
+          .querySelectorAll('gr-diff-comment-thread').length, 3);
+    });
+
+    test('toggle drafts only shows threads with draft comments', () => {
+      MockInteractions.tap(element.$.draftToggle);
+      flushAsynchronousOperations();
+      assert.equal(Polymer.dom(element.root)
+          .querySelectorAll('gr-diff-comment-thread').length, 2);
+    });
+
+    test('toggle drafts and unresolved only shows threads with drafts and ' +
+        'publicly unresolved ', () => {
+      MockInteractions.tap(element.$.draftToggle);
+      MockInteractions.tap(element.$.unresolvedToggle);
+      flushAsynchronousOperations();
+      assert.equal(Polymer.dom(element.root)
+          .querySelectorAll('gr-diff-comment-thread').length, 2);
+    });
+
+    test('modification events are consumed and displatched', () => {
+      sandbox.spy(element, '_handleCommentsChanged');
+      const dispatchSpy = sandbox.stub();
+      element.addEventListener('thread-list-modified', dispatchSpy);
+      threadElements[0].fire('thread-changed', {
+        rootId: 'ecf0b9fa_fe1a5f62', path: '/COMMIT_MSG'});
+      assert.isTrue(element._handleCommentsChanged.called);
+      assert.isTrue(dispatchSpy.called);
+      assert.equal(dispatchSpy.lastCall.args[0].detail.rootId,
+          'ecf0b9fa_fe1a5f62');
+      assert.equal(dispatchSpy.lastCall.args[0].detail.path, '/COMMIT_MSG');
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/change/gr-upload-help-dialog/gr-upload-help-dialog.html b/polygerrit-ui/app/elements/change/gr-upload-help-dialog/gr-upload-help-dialog.html
new file mode 100644
index 0000000..792c300
--- /dev/null
+++ b/polygerrit-ui/app/elements/change/gr-upload-help-dialog/gr-upload-help-dialog.html
@@ -0,0 +1,81 @@
+<!--
+@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="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../shared/gr-dialog/gr-dialog.html">
+<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
+<link rel="import" href="../../shared/gr-shell-command/gr-shell-command.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+
+<dom-module id="gr-upload-help-dialog">
+  <template>
+    <style include="shared-styles">
+      :host {
+        background-color: var(--dialog-background-color);
+        display: block;
+      }
+      .main {
+        width: 100%;
+      }
+      ol {
+        margin-left: 1em;
+        list-style: decimal;
+      }
+      p {
+        margin-bottom: .75em;
+      }
+    </style>
+    <gr-dialog
+        confirm-label="Done"
+        cancel-label=""
+        on-confirm="_handleCloseTap">
+      <div class="header" slot="header">How to update this change:</div>
+      <div class="main" slot="main">
+        <ol>
+          <li>
+            <p>
+              Checkout this change locally and make your desired modifications
+              to the files.
+            </p>
+            <template is="dom-if" if="[[_fetchCommand]]">
+              <gr-shell-command command="[[_fetchCommand]]"></gr-shell-command>
+            </template>
+          </li>
+          <li>
+            <p>
+              Update the local commit with your modifications using the following
+              command.
+            </p>
+            <gr-shell-command command="[[_commitCommand]]"></gr-shell-command>
+            <p>
+              Leave the "Change-Id:" line of the commit message as is.
+            </p>
+          </li>
+          <li>
+            <p>Push the updated commit to Gerrit.</p>
+            <gr-shell-command command="[[_pushCommand]]"></gr-shell-command>
+          </li>
+          <li>
+            <p>Refresh this page to view the the update.</p>
+          </li>
+        </ol>
+      </div>
+    </gr-dialog>
+    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
+  </template>
+  <script src="gr-upload-help-dialog.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/change/gr-upload-help-dialog/gr-upload-help-dialog.js b/polygerrit-ui/app/elements/change/gr-upload-help-dialog/gr-upload-help-dialog.js
new file mode 100644
index 0000000..02d00cf
--- /dev/null
+++ b/polygerrit-ui/app/elements/change/gr-upload-help-dialog/gr-upload-help-dialog.js
@@ -0,0 +1,121 @@
+/**
+ * @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';
+
+  const COMMIT_COMMAND = 'git add . && git commit --amend --no-edit';
+  const PUSH_COMMAND_PREFIX = 'git push origin HEAD:refs/for/';
+
+  // Command names correspond to download plugin definitions.
+  const PREFERRED_FETCH_COMMAND_ORDER = [
+    'checkout',
+    'cherry pick',
+    'pull',
+  ];
+
+  Polymer({
+    is: 'gr-upload-help-dialog',
+
+    /**
+     * Fired when the user presses the close button.
+     *
+     * @event close
+     */
+
+    properties: {
+      revision: Object,
+      targetBranch: String,
+      _commitCommand: {
+        type: String,
+        value: COMMIT_COMMAND,
+        readOnly: true,
+      },
+      _fetchCommand: {
+        type: String,
+        computed: '_computeFetchCommand(revision, ' +
+            '_preferredDownloadCommand, _preferredDownloadScheme)',
+      },
+      _preferredDownloadCommand: String,
+      _preferredDownloadScheme: String,
+      _pushCommand: {
+        type: String,
+        computed: '_computePushCommand(targetBranch)',
+      },
+    },
+
+    attached() {
+      this.$.restAPI.getLoggedIn().then(loggedIn => {
+        if (loggedIn) {
+          return this.$.restAPI.getPreferences();
+        }
+      }).then(prefs => {
+        if (prefs) {
+          this._preferredDownloadCommand = prefs.download_command;
+          this._preferredDownloadScheme = prefs.download_scheme;
+        }
+      });
+    },
+
+    _handleCloseTap(e) {
+      e.preventDefault();
+      this.fire('close', null, {bubbles: false});
+    },
+
+    _computeFetchCommand(revision, preferredDownloadCommand,
+        preferredDownloadScheme) {
+      if (!revision) { return; }
+      if (!revision || !revision.fetch) { return; }
+
+      let scheme = preferredDownloadScheme;
+      if (!scheme) {
+        const keys = Object.keys(revision.fetch).sort();
+        if (keys.length === 0) {
+          return;
+        }
+        scheme = keys[0];
+      }
+
+      if (!revision.fetch[scheme] || !revision.fetch[scheme].commands) {
+        return;
+      }
+
+      const cmds = {};
+      Object.entries(revision.fetch[scheme].commands).forEach(([key, cmd]) => {
+        cmds[key.toLowerCase()] = cmd;
+      });
+
+      if (preferredDownloadCommand &&
+          cmds[preferredDownloadCommand.toLowerCase()]) {
+        return cmds[preferredDownloadCommand.toLowerCase()];
+      }
+
+      // If no supported command preference is given, look for known commands
+      // from the downloads plugin in order of preference.
+      for (let i = 0; i < PREFERRED_FETCH_COMMAND_ORDER.length; i++) {
+        if (cmds[PREFERRED_FETCH_COMMAND_ORDER[i]]) {
+          return cmds[PREFERRED_FETCH_COMMAND_ORDER[i]];
+        }
+      }
+
+      return undefined;
+    },
+
+    _computePushCommand(targetBranch) {
+      return PUSH_COMMAND_PREFIX + targetBranch;
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/change/gr-upload-help-dialog/gr-upload-help-dialog_test.html b/polygerrit-ui/app/elements/change/gr-upload-help-dialog/gr-upload-help-dialog_test.html
new file mode 100644
index 0000000..a5a6e76
--- /dev/null
+++ b/polygerrit-ui/app/elements/change/gr-upload-help-dialog/gr-upload-help-dialog_test.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html>
+<!--
+@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.
+-->
+
+<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+<title>gr-upload-help-dialog</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-upload-help-dialog.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-upload-help-dialog></gr-upload-help-dialog>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-upload-help-dialog tests', () => {
+    let element;
+
+    setup(() => {
+      element = fixture('basic');
+    });
+
+    test('constructs push command from branch', () => {
+      element.targetBranch = 'foo';
+      assert.equal(element._pushCommand, 'git push origin HEAD:refs/for/foo');
+
+      element.targetBranch = 'master';
+      assert.equal(element._pushCommand,
+          'git push origin HEAD:refs/for/master');
+    });
+
+    suite('fetch command', () => {
+      const testRev = {
+        fetch: {
+          http: {
+            commands: {
+              Checkout: 'http checkout',
+              Pull: 'http pull',
+            },
+          },
+          ssh: {
+            commands: {
+              Pull: 'ssh pull',
+            },
+          },
+        },
+      };
+
+      test('null cases', () => {
+        assert.isUndefined(element._computeFetchCommand());
+        assert.isUndefined(element._computeFetchCommand({}));
+        assert.isUndefined(element._computeFetchCommand({fetch: null}));
+        assert.isUndefined(element._computeFetchCommand({fetch: {}}));
+      });
+
+      test('insufficiently defined scheme', () => {
+        assert.isUndefined(
+            element._computeFetchCommand(testRev, undefined, 'badscheme'));
+
+        const rev = Object.assign({}, testRev);
+        rev.fetch = Object.assign({}, testRev.fetch, {nocmds: {commands: {}}});
+        assert.isUndefined(
+            element._computeFetchCommand(rev, undefined, 'nocmds'));
+
+        rev.fetch.nocmds.commands.unsupported = 'unsupported';
+        assert.isUndefined(
+            element._computeFetchCommand(rev, undefined, 'nocmds'));
+      });
+
+      test('default scheme and command', () => {
+        const cmd = element._computeFetchCommand(testRev);
+        assert.isTrue(cmd === 'http checkout' || cmd === 'ssh pull');
+      });
+
+      test('default command', () => {
+        assert.strictEqual(
+            element._computeFetchCommand(testRev, undefined, 'http'),
+            'http checkout');
+        assert.strictEqual(
+            element._computeFetchCommand(testRev, undefined, 'ssh'),
+            'ssh pull');
+      });
+
+      test('user preferred scheme and command', () => {
+        assert.strictEqual(
+            element._computeFetchCommand(testRev, 'PULL', 'http'),
+            'http pull');
+        assert.strictEqual(
+            element._computeFetchCommand(testRev, 'badcmd', 'http'),
+            'http checkout');
+      });
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/core/gr-account-dropdown/gr-account-dropdown.html b/polygerrit-ui/app/elements/core/gr-account-dropdown/gr-account-dropdown.html
index 85db3a1..2c2fb4e 100644
--- a/polygerrit-ui/app/elements/core/gr-account-dropdown/gr-account-dropdown.html
+++ b/polygerrit-ui/app/elements/core/gr-account-dropdown/gr-account-dropdown.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -24,11 +25,14 @@
 <dom-module id="gr-account-dropdown">
   <template>
     <style include="shared-styles">
-      button {
-        background: none;
-        border: none;
-        font: inherit;
-        padding: .3em 0;
+      gr-dropdown {
+        padding: 0 .5em;
+        --gr-button: {
+          color: var(--header-text-color);
+        }
+        --gr-dropdown-item: {
+          color: var(--primary-text-color);
+        }
       }
       gr-avatar {
         height: 2em;
diff --git a/polygerrit-ui/app/elements/core/gr-account-dropdown/gr-account-dropdown.js b/polygerrit-ui/app/elements/core/gr-account-dropdown/gr-account-dropdown.js
index 1bea61a..72ec7fa 100644
--- a/polygerrit-ui/app/elements/core/gr-account-dropdown/gr-account-dropdown.js
+++ b/polygerrit-ui/app/elements/core/gr-account-dropdown/gr-account-dropdown.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
diff --git a/polygerrit-ui/app/elements/core/gr-account-dropdown/gr-account-dropdown_test.html b/polygerrit-ui/app/elements/core/gr-account-dropdown/gr-account-dropdown_test.html
index 1183d9c..fe63a3e 100644
--- a/polygerrit-ui/app/elements/core/gr-account-dropdown/gr-account-dropdown_test.html
+++ b/polygerrit-ui/app/elements/core/gr-account-dropdown/gr-account-dropdown_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/core/gr-error-dialog/gr-error-dialog.html b/polygerrit-ui/app/elements/core/gr-error-dialog/gr-error-dialog.html
new file mode 100644
index 0000000..f8bf33c
--- /dev/null
+++ b/polygerrit-ui/app/elements/core/gr-error-dialog/gr-error-dialog.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.
+-->
+
+<link rel="import" href="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../shared/gr-dialog/gr-dialog.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+
+<dom-module id="gr-error-dialog">
+  <template>
+    <style include="shared-styles">
+      .main {
+        max-height: 40em;
+        max-width: 60em;
+        overflow-y: auto;
+        white-space: pre-wrap;
+      }
+      @media screen and (max-width: 50em) {
+        .main {
+          max-height: none;
+          max-width: 50em;
+        }
+      }
+    </style>
+    <gr-dialog
+        id="dialog"
+        cancel-label=""
+        on-confirm="_handleConfirm"
+        confirm-label="Dismiss"
+        confirm-on-enter>
+      <div class="header" slot="header">An error occurred</div>
+      <div class="main" slot="main">[[text]]</div>
+    </gr-dialog>
+  </template>
+  <script src="gr-error-dialog.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/core/gr-error-dialog/gr-error-dialog.js b/polygerrit-ui/app/elements/core/gr-error-dialog/gr-error-dialog.js
new file mode 100644
index 0000000..8d3b58e
--- /dev/null
+++ b/polygerrit-ui/app/elements/core/gr-error-dialog/gr-error-dialog.js
@@ -0,0 +1,37 @@
+/**
+ * @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-error-dialog',
+
+    /**
+     * Fired when the dismiss button is pressed.
+     *
+     * @event dismiss
+     */
+
+    properties: {
+      text: String,
+    },
+
+    _handleConfirm() {
+      this.dispatchEvent(new CustomEvent('dismiss'));
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/core/gr-error-dialog/gr-error-dialog_test.html b/polygerrit-ui/app/elements/core/gr-error-dialog/gr-error-dialog_test.html
new file mode 100644
index 0000000..e2c314b
--- /dev/null
+++ b/polygerrit-ui/app/elements/core/gr-error-dialog/gr-error-dialog_test.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<!--
+@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.
+-->
+
+<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+<title>gr-error-dialog</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-error-dialog.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-error-dialog></gr-error-dialog>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-error-dialog tests', () => {
+    let element;
+
+    setup(() => {
+      element = fixture('basic');
+    });
+
+    test('dismiss tap fires event', done => {
+      element.addEventListener('dismiss', () => { done(); });
+      MockInteractions.tap(element.$.dialog.$.confirm);
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/core/gr-error-manager/gr-error-manager.html b/polygerrit-ui/app/elements/core/gr-error-manager/gr-error-manager.html
index 5765411..3ec4bb5 100644
--- a/polygerrit-ui/app/elements/core/gr-error-manager/gr-error-manager.html
+++ b/polygerrit-ui/app/elements/core/gr-error-manager/gr-error-manager.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,11 +17,20 @@
 
 <link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../core/gr-error-dialog/gr-error-dialog.html">
 <link rel="import" href="../../shared/gr-alert/gr-alert.html">
+<link rel="import" href="../../shared/gr-overlay/gr-overlay.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
 
 <dom-module id="gr-error-manager">
   <template>
+    <gr-overlay with-backdrop id="errorOverlay">
+      <gr-error-dialog
+          id="errorDialog"
+          on-dismiss="_handleDismissErrorDialog"
+          confirm-label="Dismiss"
+          confirm-on-enter></gr-error-dialog>
+    </gr-overlay>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
   </template>
   <script src="gr-error-manager.js"></script>
diff --git a/polygerrit-ui/app/elements/core/gr-error-manager/gr-error-manager.js b/polygerrit-ui/app/elements/core/gr-error-manager/gr-error-manager.js
index ac74ee5..b254182 100644
--- a/polygerrit-ui/app/elements/core/gr-error-manager/gr-error-manager.js
+++ b/polygerrit-ui/app/elements/core/gr-error-manager/gr-error-manager.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -59,6 +62,7 @@
       this.listen(document, 'network-error', '_handleNetworkError');
       this.listen(document, 'auth-error', '_handleAuthError');
       this.listen(document, 'show-alert', '_handleShowAlert');
+      this.listen(document, 'show-error', '_handleShowErrorDialog');
       this.listen(document, 'visibilitychange', '_handleVisibilityChange');
       this.listen(document, 'show-auth-required', '_handleAuthRequired');
     },
@@ -70,6 +74,7 @@
       this.unlisten(document, 'auth-error', '_handleAuthError');
       this.unlisten(document, 'show-auth-required', '_handleAuthRequired');
       this.unlisten(document, 'visibilitychange', '_handleVisibilityChange');
+      this.unlisten(document, 'show-error', '_handleShowErrorDialog');
     },
 
     _shouldSuppressError(msg) {
@@ -86,22 +91,36 @@
     },
 
     _handleServerError(e) {
-      Promise.all([
-        e.detail.response.text(), this._getLoggedIn(),
-      ]).then(values => {
-        const text = values[0];
-        const loggedIn = values[1];
-        if (e.detail.response.status === 403 &&
-            loggedIn &&
-            text === AUTHENTICATION_REQUIRED) {
-          // The app was logged at one point and is now getting auth errors.
-          // This indicates the auth token is no longer valid.
-          this._handleAuthError();
-        } else if (!this._shouldSuppressError(text)) {
-          this._showAlert('Server error: ' + text);
-        }
-        console.error(text);
-      });
+      const {request, response} = e.detail;
+      Promise.all([response.text(), this._getLoggedIn()])
+          .then(([errorText, loggedIn]) => {
+            const url = request && (request.anonymizedUrl || request.url);
+            const {status, statusText} = response;
+            if (response.status === 403 &&
+                loggedIn &&
+                errorText === AUTHENTICATION_REQUIRED) {
+              // The app was logged at one point and is now getting auth errors.
+              // This indicates the auth token is no longer valid.
+              this._handleAuthError();
+            } else if (!this._shouldSuppressError(errorText)) {
+              this._showErrorDialog(this._constructServerErrorMsg({
+                status,
+                statusText,
+                errorText,
+                url,
+              }));
+            }
+            console.error(errorText);
+          });
+    },
+
+    _constructServerErrorMsg({errorText, status, statusText, url}) {
+      let err = `Error ${status}`;
+      if (statusText) { err += ` (${statusText})`; }
+      if (errorText || url) { err += ': '; }
+      if (errorText) { err += errorText; }
+      if (url) { err += `\nEndpoint: ${url}`; }
+      return err;
     },
 
     _handleShowAlert(e) {
@@ -254,5 +273,18 @@
     _handleWindowFocus() {
       this.flushDebouncer('checkLoggedIn');
     },
+
+    _handleShowErrorDialog(e) {
+      this._showErrorDialog(e.detail.message);
+    },
+
+    _handleDismissErrorDialog() {
+      this.$.errorOverlay.close();
+    },
+
+    _showErrorDialog(message) {
+      this.$.errorDialog.text = message;
+      this.$.errorOverlay.open();
+    },
   });
 })();
diff --git a/polygerrit-ui/app/elements/core/gr-error-manager/gr-error-manager_test.html b/polygerrit-ui/app/elements/core/gr-error-manager/gr-error-manager_test.html
index 17fa746..f92feae 100644
--- a/polygerrit-ui/app/elements/core/gr-error-manager/gr-error-manager_test.html
+++ b/polygerrit-ui/app/elements/core/gr-error-manager/gr-error-manager_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -85,8 +86,8 @@
           'Log in is required to perform that action.', 'Log in.'));
     });
 
-    test('show normal server error', done => {
-      const showAlertStub = sandbox.stub(element, '_showAlert');
+    test('show normal Error', done => {
+      const showErrorStub = sandbox.stub(element, '_showErrorDialog');
       const textSpy = sandbox.spy(() => { return Promise.resolve('ZOMG'); });
       element.fire('server-error', {response: {status: 500, text: textSpy}});
 
@@ -95,13 +96,34 @@
         element.$.restAPI.getLoggedIn.lastCall.returnValue,
         textSpy.lastCall.returnValue,
       ]).then(() => {
-        assert.isTrue(showAlertStub.calledOnce);
-        assert.isTrue(showAlertStub.lastCall.calledWithExactly(
-            'Server error: ZOMG'));
+        assert.isTrue(showErrorStub.calledOnce);
+        assert.isTrue(showErrorStub.lastCall.calledWithExactly(
+            'Error 500: ZOMG'));
         done();
       });
     });
 
+    test('_constructServerErrorMsg', () => {
+      const errorText = 'change conflicts';
+      const status = 409;
+      const statusText = 'Conflict';
+      const url = '/my/test/url';
+
+      assert.equal(element._constructServerErrorMsg({status}),
+          'Error 409');
+      assert.equal(element._constructServerErrorMsg({status, url}),
+          'Error 409: \nEndpoint: /my/test/url');
+      assert.equal(element._constructServerErrorMsg({status, statusText, url}),
+          'Error 409 (Conflict): \nEndpoint: /my/test/url');
+      assert.equal(element._constructServerErrorMsg({
+        status,
+        statusText,
+        errorText,
+        url,
+      }), 'Error 409 (Conflict): change conflicts' +
+          '\nEndpoint: /my/test/url');
+    });
+
     test('suppress TOO_MANY_FILES error', done => {
       const showAlertStub = sandbox.stub(element, '_showAlert');
       const textSpy = sandbox.spy(() => {
@@ -278,5 +300,21 @@
       element._showAlert();
       assert.isTrue(hideStub.calledOnce);
     });
+
+    test('show-error', () => {
+      const openStub = sandbox.stub(element.$.errorOverlay, 'open');
+      const closeStub = sandbox.stub(element.$.errorOverlay, 'close');
+      const message = 'test message';
+      element.fire('show-error', {message});
+      flushAsynchronousOperations();
+
+      assert.isTrue(openStub.called);
+      assert.equal(element.$.errorDialog.text, message);
+
+      element.$.errorDialog.fire('dismiss');
+      flushAsynchronousOperations();
+
+      assert.isTrue(closeStub.called);
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/core/gr-key-binding-display/gr-key-binding-display.html b/polygerrit-ui/app/elements/core/gr-key-binding-display/gr-key-binding-display.html
new file mode 100644
index 0000000..2ff7953
--- /dev/null
+++ b/polygerrit-ui/app/elements/core/gr-key-binding-display/gr-key-binding-display.html
@@ -0,0 +1,48 @@
+<!--
+@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="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+
+<dom-module id="gr-key-binding-display">
+  <template>
+    <style include="shared-styles">
+      .key {
+        background-color: var(--chip-background-color);
+        border: 1px solid var(--border-color);
+        border-radius: 3px;
+        display: inline-block;
+        font-weight: var(--font-weight-bold);
+        padding: .1em .5em;
+        text-align: center;
+      }
+    </style>
+    <template is="dom-repeat" items="[[binding]]">
+      <template is="dom-if" if="[[index]]">
+        or
+      </template>
+      <template
+          is="dom-repeat"
+          items="[[_computeModifiers(item)]]"
+          as="modifier">
+        <span class="key modifier">[[modifier]]</span>
+      </template>
+      <span class="key">[[_computeKey(item)]]</span>
+    </template>
+  </template>
+  <script src="gr-key-binding-display.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/core/gr-key-binding-display/gr-key-binding-display.js b/polygerrit-ui/app/elements/core/gr-key-binding-display/gr-key-binding-display.js
new file mode 100644
index 0000000..89d1091
--- /dev/null
+++ b/polygerrit-ui/app/elements/core/gr-key-binding-display/gr-key-binding-display.js
@@ -0,0 +1,36 @@
+/**
+ * @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-key-binding-display',
+
+    properties: {
+      /** @type {Array<string>} */
+      binding: Array,
+    },
+
+    _computeModifiers(binding) {
+      return binding.slice(0, binding.length - 1);
+    },
+
+    _computeKey(binding) {
+      return binding[binding.length - 1];
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/core/gr-key-binding-display/gr-key-binding-display_test.html b/polygerrit-ui/app/elements/core/gr-key-binding-display/gr-key-binding-display_test.html
new file mode 100644
index 0000000..0361d76
--- /dev/null
+++ b/polygerrit-ui/app/elements/core/gr-key-binding-display/gr-key-binding-display_test.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<!--
+@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.
+-->
+<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+<title>gr-key-binding-display</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-key-binding-display.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-key-binding-display></gr-key-binding-display>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-key-binding-display tests', () => {
+    let element;
+
+    setup(() => {
+      element = fixture('basic');
+    });
+
+    suite('_computeKey', () => {
+      test('unmodified key', () => {
+        assert.strictEqual(element._computeKey(['x']), 'x');
+      });
+
+      test('key with modifiers', () => {
+        assert.strictEqual(element._computeKey(['Ctrl', 'x']), 'x');
+        assert.strictEqual(element._computeKey(['Shift', 'Meta', 'x']), 'x');
+      });
+    });
+
+    suite('_computeModifiers', () => {
+      test('single unmodified key', () => {
+        assert.deepEqual(element._computeModifiers(['x']), []);
+      });
+
+      test('key with modifiers', () => {
+        assert.deepEqual(element._computeModifiers(['Ctrl', 'x']), ['Ctrl']);
+        assert.deepEqual(
+            element._computeModifiers(['Shift', 'Meta', 'x']),
+            ['Shift', 'Meta']);
+      });
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/core/gr-keyboard-shortcuts-dialog/gr-keyboard-shortcuts-dialog.html b/polygerrit-ui/app/elements/core/gr-keyboard-shortcuts-dialog/gr-keyboard-shortcuts-dialog.html
index 03f0e53..e3552cc 100644
--- a/polygerrit-ui/app/elements/core/gr-keyboard-shortcuts-dialog/gr-keyboard-shortcuts-dialog.html
+++ b/polygerrit-ui/app/elements/core/gr-keyboard-shortcuts-dialog/gr-keyboard-shortcuts-dialog.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -15,7 +16,9 @@
 -->
 
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../../behaviors/keyboard-shortcut-behavior/keyboard-shortcut-behavior.html">
 <link rel="import" href="../../shared/gr-button/gr-button.html">
+<link rel="import" href="../gr-key-binding-display/gr-key-binding-display.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 
 <dom-module id="gr-keyboard-shortcuts-dialog">
@@ -23,6 +26,8 @@
     <style include="shared-styles">
       :host {
         display: block;
+        max-height: 100vh;
+        overflow-y: auto;
       }
       header{
         padding: 1em;
@@ -33,7 +38,7 @@
       }
       header {
         align-items: center;
-        border-bottom: 1px solid #cdcdcd;
+        border-bottom: 1px solid var(--border-color);
         display: flex;
         justify-content: space-between;
       }
@@ -48,17 +53,9 @@
         text-align: right;
       }
       .header {
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
         padding-top: 1em;
       }
-      .key {
-        display: inline-block;
-        font-family: var(--font-family-bold);
-        border-radius: 3px;
-        background-color: #f1f2f3;
-        padding: .1em .5em;
-        text-align: center;
-      }
       .modifier {
         font-weight: normal;
       }
@@ -70,374 +67,42 @@
     <main>
       <table>
         <tbody>
-          <tr>
-            <td></td><td class="header">Everywhere</td>
-          </tr>
-          <tr>
-            <td><span class="key">/</span></td>
-            <td>Search</td>
-          </tr>
-          <tr>
-            <td><span class="key">?</span></td>
-            <td>Show this dialog</td>
-          </tr>
-        </tbody>
-        <!-- Change View -->
-        <tbody hidden$="[[!_computeInView(view, 'change')]]" hidden>
-          <tr>
-            <td></td><td class="header">Navigation</td>
-          </tr>
-          <tr>
-            <td><span class="key">]</span></td>
-            <td>Show first file</td>
-          </tr>
-          <tr>
-            <td><span class="key">[</span></td>
-            <td>Show last file</td>
-          </tr>
-          <tr>
-            <td><span class="key">u</span></td>
-            <td>Up to dashboard</td>
-          </tr>
-        </tbody>
-        <!-- Diff View -->
-        <tbody hidden$="[[!_computeInView(view, 'diff')]]" hidden>
-          <tr>
-            <td></td><td class="header">Navigation</td>
-          </tr>
-          <tr>
-            <td><span class="key">]</span></td>
-            <td>Show next file</td>
-          </tr>
-          <tr>
-            <td><span class="key">[</span></td>
-            <td>Show previous file</td>
-          </tr>
-          <tr>
-            <td>
-              <span class="key modifier">Shift</span>
-              <span class="key">j</span>
-            </td>
-            <td>Show next file that has comments</td>
-          </tr>
-          <tr>
-            <td>
-              <span class="key modifier">Shift</span>
-              <span class="key">k</span>
-            </td>
-            <td>Show previous file that has comments</td>
-          </tr>
-          <tr>
-            <td><span class="key">u</span></td>
-            <td>Up to change</td>
-          </tr>
+          <template is="dom-repeat" items="[[_left]]">
+            <tr>
+              <td></td><td class="header">[[item.section]]</td>
+            </tr>
+            <template is="dom-repeat" items="[[item.shortcuts]]" as="shortcut">
+              <tr>
+                <td>
+                  <gr-key-binding-display binding="[[shortcut.binding]]">
+                  </gr-key-binding-display>
+                </td>
+                <td>[[shortcut.text]]</td>
+              </tr>
+            </template>
+          </template>
         </tbody>
       </table>
-
-      <table>
-        <!-- Change List -->
-        <tbody hidden$="[[!_computeInView(view, 'search')]]" hidden>
-          <tr>
-            <td></td><td class="header">Change list</td>
-          </tr>
-          <tr>
-            <td><span class="key">j</span></td>
-            <td>Select next change</td>
-          </tr>
-          <tr>
-            <td><span class="key">k</span></td>
-            <td>Show previous change</td>
-          </tr>
-          <tr>
-            <td><span class="key">n</span> or <span class="key">]</span></td>
-            <td>Go to next page</td>
-          </tr>
-          <tr>
-            <td><span class="key">p</span> or <span class="key">[</span></td>
-            <td>Go to previous page</td>
-          </tr>
-          <tr>
-            <td>
-              <span class="key">Enter</span> or
-              <span class="key">o</span>
-            </td>
-            <td>Show selected change</td>
-          </tr>
-          <tr>
-            <td>
-              <span class="key modifier">Shift</span>
-              <span class="key">r</span>
-            </td>
-            <td>Refresh list of changes</td>
-          </tr>
-          <tr>
-            <td><span class="key">s</span></td>
-            <td>Star (or unstar) change</td>
-          </tr>
-        </tbody>
-        <!-- Dashboard -->
-        <tbody hidden$="[[!_computeInView(view, 'dashboard')]]" hidden>
-          <tr>
-            <td></td><td class="header">Dashboard</td>
-          </tr>
-          <tr>
-            <td><span class="key">j</span></td>
-            <td>Select next change</td>
-          </tr>
-          <tr>
-            <td><span class="key">k</span></td>
-            <td>Show previous change</td>
-          </tr>
-          <tr>
-            <td>
-              <span class="key">Enter</span> or
-              <span class="key">o</span>
-            </td>
-            <td>Show selected change</td>
-          </tr>
-          <tr>
-            <td>
-              <span class="key modifier">Shift</span>
-              <span class="key">r</span>
-            </td>
-            <td>Refresh list of changes</td>
-          </tr>
-          <tr>
-            <td><span class="key">s</span></td>
-            <td>Star (or unstar) change</td>
-          </tr>
-        </tbody>
-        <!-- Change View -->
-        <tbody hidden$="[[!_computeInView(view, 'change')]]" hidden>
-          <tr>
-            <td></td><td class="header">Actions</td>
-          </tr>
-          <tr>
-            <td><span class="key">a</span></td>
-            <td>Open reply dialog to publish comments and add reviewers</td>
-          </tr>
-          <tr>
-            <td><span class="key">d</span></td>
-            <td>Open download overlay</td>
-          </tr>
-          <tr>
-            <td>
-              <span class="key modifier">Shift</span>
-              <span class="key">r</span>
-            </td>
-            <td>Reload the change at the latest patch</td>
-          </tr>
-          <tr>
-            <td><span class="key">s</span></td>
-            <td>Star (or unstar) change</td>
-          </tr>
-          <tr>
-            <td><span class="key">x</span></td>
-            <td>Expand all messages</td>
-          </tr>
-          <tr>
-            <td><span class="key">z</span></td>
-            <td>Collapse all messages</td>
-          </tr>
-          <tr>
-            <td></td><td class="header">File list</td>
-          </tr>
-          <tr>
-            <td><span class="key">j</span> or <span class="key">↓</span></td>
-            <td>Select next file</td>
-          </tr>
-          <tr>
-            <td><span class="key">k</span> or <span class="key">↑</span></td>
-            <td>Select previous file</td>
-          </tr>
-          <tr>
-            <td>
-              <span class="key">Enter</span> or
-              <span class="key">o</span>
-            </td>
-            <td>Show selected file</td>
-          </tr>
-          <tr>
-            <td><span class="key">r</span></td>
-            <td>Toggle review flag on selected file</td>
-          </tr>
-          <tr>
-            <td>
-              <span class="key modifier">Shift</span>
-              <span class="key">i</span>
-            </td>
-            <td>Show/hide all inline diffs</td>
-          </tr>
-          <tr>
-            <td><span class="key">i</span></td>
-            <td>Show/hide selected inline diff</td>
-          </tr>
-          <tr>
-            <td></td><td class="header">Diffs</td>
-          </tr>
-          <tr>
-            <td><span class="key">j</span> or <span class="key">↓</span></td>
-            <td>Go to next line</td>
-          </tr>
-          <tr>
-            <td><span class="key">k</span> or <span class="key">↑</span></td>
-            <td>Go to previous line</td>
-          </tr>
-          <tr>
-            <td><span class="key">n</span></td>
-            <td>Go to next diff chunk</td>
-          </tr>
-          <tr>
-            <td><span class="key">p</span></td>
-            <td>Go to previous diff chunk</td>
-          </tr>
-          <tr>
-            <td>
-              <span class="key modifier">Shift</span>
-              <span class="key">n</span>
-            </td>
-            <td>Go to next comment thread</td>
-          </tr>
-          <tr>
-            <td>
-              <span class="key modifier">Shift</span>
-              <span class="key">p</span>
-            </td>
-            <td>Go to previous comment thread</td>
-          </tr>
-          <tr>
-            <td><span class="key">e</span></td>
-            <td>Expand all comment threads</td>
-          </tr>
-          <tr>
-            <td>
-              <span class="key modifier">Shift</span>
-              <span class="key">e</span>
-            </td>
-            <td>Collapse all comment threads</td>
-          </tr>
-          <tr>
-            <td>
-              <span class="key modifier">Shift</span>
-              <span class="key">←</span>
-            </td>
-            <td>Select left pane</td>
-          </tr>
-          <tr>
-            <td>
-              <span class="key modifier">Shift</span>
-              <span class="key">→</span>
-            </td>
-            <td>Select right pane</td>
-          </tr>
-          <tr>
-            <td>
-              <span class="key modifier">Shift</span>
-              <span class="key">a</span>
-            </td>
-            <td>Hide/show left diff</td>
-          </tr>
-          <tr>
-            <td>
-              <span class="key">c</span>
-            </td>
-            <td>Draft new comment</td>
-          </tr>
-        </tbody>
-        <!-- Diff View -->
-        <tbody hidden$="[[!_computeInView(view, 'diff')]]" hidden>
-          <tr>
-            <td></td><td class="header">Actions</td>
-          </tr>
-          <tr>
-            <td><span class="key">j</span> or <span class="key">↓</span></td>
-            <td>Show next line</td>
-          </tr>
-          <tr>
-            <td><span class="key">k</span> or <span class="key">↑</span></td>
-            <td>Show previous line</td>
-          </tr>
-          <tr>
-            <td><span class="key">n</span></td>
-            <td>Show next diff chunk</td>
-          </tr>
-          <tr>
-            <td><span class="key">p</span></td>
-            <td>Show previous diff chunk</td>
-          </tr>
-          <tr>
-            <td>
-              <span class="key modifier">Shift</span>
-              <span class="key">n</span>
-            </td>
-            <td>Show next comment thread</td>
-          </tr>
-          <tr>
-            <td>
-              <span class="key modifier">Shift</span>
-              <span class="key">p</span>
-            </td>
-            <td>Show previous comment thread</td>
-          </tr>
-          <tr>
-            <td><span class="key">e</span></td>
-            <td>Expand all comment threads</td>
-          </tr>
-          <tr>
-            <td>
-              <span class="key modifier">Shift</span>
-              <span class="key">e</span>
-            </td>
-            <td>Collapse all comment threads</td>
-          </tr>
-          <tr>
-            <td>
-              <span class="key modifier">Shift</span>
-              <span class="key">←</span>
-            </td>
-            <td>Select left pane</td>
-          </tr>
-          <tr>
-            <td>
-              <span class="key modifier">Shift</span>
-              <span class="key">→</span>
-            </td>
-            <td>Select right pane</td>
-          </tr>
-          <tr>
-            <td>
-              <span class="key modifier">Shift</span>
-              <span class="key">a</span>
-            </td>
-            <td>Hide/show left diff</td>
-          </tr>
-          <tr>
-            <td>
-              <span class="key">c</span>
-            </td>
-            <td>Draft new comment</td>
-          </tr>
-          <tr>
-            <td>
-              <span class="key modifier">Ctrl</span>
-              <span class="key">s</span><br/>
-              <span class="key modifier">Ctrl</span>
-              <span class="key">Enter</span><br/>
-              <span class="key modifier">Meta</span>
-              <span class="key">Enter</span>
-            </td>
-            <td>Save comment</td>
-          </tr>
-          <tr>
-            <td><span class="key">a</span></td>
-            <td>Open reply dialog to publish comments and add reviewers</td>
-          </tr>
-          <tr>
-            <td><span class="key">,</span></td>
-            <td>Show diff preferences</td>
-          </tr>
-        </tbody>
-      </table>
+      <template is="dom-if" if="[[_right]]">
+        <table>
+          <tbody>
+            <template is="dom-repeat" items="[[_right]]">
+              <tr>
+                <td></td><td class="header">[[item.section]]</td>
+              </tr>
+              <template is="dom-repeat" items="[[item.shortcuts]]" as="shortcut">
+                <tr>
+                  <td>
+                    <gr-key-binding-display binding="[[shortcut.binding]]">
+                    </gr-key-binding-display>
+                  </td>
+                  <td>[[shortcut.text]]</td>
+                </tr>
+              </template>
+            </template>
+          </tbody>
+        </table>
+      </template>
     </main>
     <footer></footer>
   </template>
diff --git a/polygerrit-ui/app/elements/core/gr-keyboard-shortcuts-dialog/gr-keyboard-shortcuts-dialog.js b/polygerrit-ui/app/elements/core/gr-keyboard-shortcuts-dialog/gr-keyboard-shortcuts-dialog.js
index b7900c0..5b29972 100644
--- a/polygerrit-ui/app/elements/core/gr-keyboard-shortcuts-dialog/gr-keyboard-shortcuts-dialog.js
+++ b/polygerrit-ui/app/elements/core/gr-keyboard-shortcuts-dialog/gr-keyboard-shortcuts-dialog.js
@@ -1,19 +1,24 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
+  const {ShortcutSection} = window.Gerrit.KeyboardShortcutBinder;
+
   Polymer({
     is: 'gr-keyboard-shortcuts-dialog',
 
@@ -24,20 +29,97 @@
      */
 
     properties: {
-      view: String,
+      _left: Array,
+      _right: Array,
+
+      _propertyBySection: {
+        type: Object,
+        value() {
+          return {
+            [ShortcutSection.EVERYWHERE]: '_everywhere',
+            [ShortcutSection.NAVIGATION]: '_navigation',
+            [ShortcutSection.DASHBOARD]: '_dashboard',
+            [ShortcutSection.CHANGE_LIST]: '_changeList',
+            [ShortcutSection.ACTIONS]: '_actions',
+            [ShortcutSection.REPLY_DIALOG]: '_replyDialog',
+            [ShortcutSection.FILE_LIST]: '_fileList',
+            [ShortcutSection.DIFFS]: '_diffs',
+          };
+        },
+      },
     },
 
+    behaviors: [
+      Gerrit.KeyboardShortcutBehavior,
+    ],
+
     hostAttributes: {
       role: 'dialog',
     },
 
-    _computeInView(currentView, view) {
-      return view === currentView;
+    attached() {
+      this.addKeyboardShortcutDirectoryListener(
+          this._onDirectoryUpdated.bind(this));
+    },
+
+    detached() {
+      this.removeKeyboardShortcutDirectoryListener(
+          this._onDirectoryUpdated.bind(this));
     },
 
     _handleCloseTap(e) {
       e.preventDefault();
       this.fire('close', null, {bubbles: false});
     },
+
+    _onDirectoryUpdated(directory) {
+      const left = [];
+      const right = [];
+
+      if (directory.has(ShortcutSection.EVERYWHERE)) {
+        left.push({
+          section: ShortcutSection.EVERYWHERE,
+          shortcuts: directory.get(ShortcutSection.EVERYWHERE),
+        });
+      }
+
+      if (directory.has(ShortcutSection.NAVIGATION)) {
+        left.push({
+          section: ShortcutSection.NAVIGATION,
+          shortcuts: directory.get(ShortcutSection.NAVIGATION),
+        });
+      }
+
+      if (directory.has(ShortcutSection.ACTIONS)) {
+        right.push({
+          section: ShortcutSection.ACTIONS,
+          shortcuts: directory.get(ShortcutSection.ACTIONS),
+        });
+      }
+
+      if (directory.has(ShortcutSection.REPLY_DIALOG)) {
+        right.push({
+          section: ShortcutSection.REPLY_DIALOG,
+          shortcuts: directory.get(ShortcutSection.REPLY_DIALOG),
+        });
+      }
+
+      if (directory.has(ShortcutSection.FILE_LIST)) {
+        right.push({
+          section: ShortcutSection.FILE_LIST,
+          shortcuts: directory.get(ShortcutSection.FILE_LIST),
+        });
+      }
+
+      if (directory.has(ShortcutSection.DIFFS)) {
+        right.push({
+          section: ShortcutSection.DIFFS,
+          shortcuts: directory.get(ShortcutSection.DIFFS),
+        });
+      }
+
+      this.set('_left', left);
+      this.set('_right', right);
+    },
   });
 })();
diff --git a/polygerrit-ui/app/elements/core/gr-keyboard-shortcuts-dialog/gr-keyboard-shortcuts-dialog_test.html b/polygerrit-ui/app/elements/core/gr-keyboard-shortcuts-dialog/gr-keyboard-shortcuts-dialog_test.html
new file mode 100644
index 0000000..50579dd
--- /dev/null
+++ b/polygerrit-ui/app/elements/core/gr-keyboard-shortcuts-dialog/gr-keyboard-shortcuts-dialog_test.html
@@ -0,0 +1,179 @@
+<!DOCTYPE html>
+<!--
+@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.
+-->
+<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+<title>gr-key-binding-display</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-keyboard-shortcuts-dialog.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-keyboard-shortcuts-dialog></gr-keyboard-shortcuts-dialog>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-keyboard-shortcuts-dialog tests', () => {
+    const kb = window.Gerrit.KeyboardShortcutBinder;
+    let element;
+
+    setup(() => {
+      element = fixture('basic');
+    });
+
+    function update(directory) {
+      element._onDirectoryUpdated(directory);
+      flushAsynchronousOperations();
+    }
+
+    suite('_left and _right contents', () => {
+      test('empty dialog', () => {
+        assert.strictEqual(element._left.length, 0);
+        assert.strictEqual(element._right.length, 0);
+      });
+
+      test('everywhere goes on left', () => {
+        update(new Map([
+          [kb.ShortcutSection.EVERYWHERE, ['everywhere shortcuts']],
+        ]));
+        assert.deepEqual(
+            element._left,
+            [
+              {
+                section: kb.ShortcutSection.EVERYWHERE,
+                shortcuts: ['everywhere shortcuts'],
+              },
+            ]);
+        assert.strictEqual(element._right.length, 0);
+      });
+
+      test('navigation goes on left', () => {
+        update(new Map([
+          [kb.ShortcutSection.NAVIGATION, ['navigation shortcuts']],
+        ]));
+        assert.deepEqual(
+            element._left,
+            [
+              {
+                section: kb.ShortcutSection.NAVIGATION,
+                shortcuts: ['navigation shortcuts'],
+              },
+            ]);
+        assert.strictEqual(element._right.length, 0);
+      });
+
+      test('actions go on right', () => {
+        update(new Map([
+          [kb.ShortcutSection.ACTIONS, ['actions shortcuts']],
+        ]));
+        assert.deepEqual(
+            element._right,
+            [
+              {
+                section: kb.ShortcutSection.ACTIONS,
+                shortcuts: ['actions shortcuts'],
+              },
+            ]);
+        assert.strictEqual(element._left.length, 0);
+      });
+
+      test('reply dialog goes on right', () => {
+        update(new Map([
+          [kb.ShortcutSection.REPLY_DIALOG, ['reply dialog shortcuts']],
+        ]));
+        assert.deepEqual(
+            element._right,
+            [
+              {
+                section: kb.ShortcutSection.REPLY_DIALOG,
+                shortcuts: ['reply dialog shortcuts'],
+              },
+            ]);
+        assert.strictEqual(element._left.length, 0);
+      });
+
+      test('file list goes on right', () => {
+        update(new Map([
+          [kb.ShortcutSection.FILE_LIST, ['file list shortcuts']],
+        ]));
+        assert.deepEqual(
+            element._right,
+            [
+              {
+                section: kb.ShortcutSection.FILE_LIST,
+                shortcuts: ['file list shortcuts'],
+              },
+            ]);
+        assert.strictEqual(element._left.length, 0);
+      });
+
+      test('diffs go on right', () => {
+        update(new Map([
+          [kb.ShortcutSection.DIFFS, ['diffs shortcuts']],
+        ]));
+        assert.deepEqual(
+            element._right,
+            [
+              {
+                section: kb.ShortcutSection.DIFFS,
+                shortcuts: ['diffs shortcuts'],
+              },
+            ]);
+        assert.strictEqual(element._left.length, 0);
+      });
+
+      test('multiple sections on each side', () => {
+        update(new Map([
+          [kb.ShortcutSection.ACTIONS, ['actions shortcuts']],
+          [kb.ShortcutSection.DIFFS, ['diffs shortcuts']],
+          [kb.ShortcutSection.EVERYWHERE, ['everywhere shortcuts']],
+          [kb.ShortcutSection.NAVIGATION, ['navigation shortcuts']],
+        ]));
+        assert.deepEqual(
+            element._left,
+            [
+              {
+                section: kb.ShortcutSection.EVERYWHERE,
+                shortcuts: ['everywhere shortcuts'],
+              },
+              {
+                section: kb.ShortcutSection.NAVIGATION,
+                shortcuts: ['navigation shortcuts'],
+              },
+            ]);
+        assert.deepEqual(
+            element._right,
+            [
+              {
+                section: kb.ShortcutSection.ACTIONS,
+                shortcuts: ['actions shortcuts'],
+              },
+              {
+                section: kb.ShortcutSection.DIFFS,
+                shortcuts: ['diffs shortcuts'],
+              },
+            ]);
+      });
+    });
+  });
+</script>
+
diff --git a/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.html b/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.html
index e56dc91..06e52c3 100644
--- a/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.html
+++ b/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,11 +18,14 @@
 
 <link rel="import" href="../../../behaviors/docs-url-behavior/docs-url-behavior.html">
 <link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
+<link rel="import" href="../../../behaviors/gr-admin-nav-behavior/gr-admin-nav-behavior.html">
 <link rel="import" href="../../plugins/gr-endpoint-decorator/gr-endpoint-decorator.html">
 <link rel="import" href="../../shared/gr-dropdown/gr-dropdown.html">
+<link rel="import" href="../../shared/gr-icons/gr-icons.html">
+<link rel="import" href="../../shared/gr-js-api-interface/gr-js-api-interface.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
 <link rel="import" href="../gr-account-dropdown/gr-account-dropdown.html">
-<link rel="import" href="../gr-search-bar/gr-search-bar.html">
+<link rel="import" href="../gr-smart-search/gr-smart-search.html">
 
 <dom-module id="gr-main-header">
   <template>
@@ -34,8 +38,8 @@
         display: flex;
       }
       .bigTitle {
-        color: var(--primary-text-color);
-        font-size: 1.75em;
+        color: var(--header-text-color);
+        font-size: 1.75rem;
         text-decoration: none;
       }
       .bigTitle:hover {
@@ -49,7 +53,7 @@
         content: "";
         display: inline-block;
         height: var(--header-icon-size);
-        margin: 0 .25em 0 0;
+        margin-right: calc(var(--header-icon-size) / 4);
         vertical-align: text-bottom;
         width: var(--header-icon-size);
       }
@@ -58,6 +62,7 @@
       }
       ul {
         list-style: none;
+        padding-left: 1em;
       }
       .links > li {
         cursor: default;
@@ -66,9 +71,9 @@
         position: relative;
       }
       .linksTitle {
-        color: var(--primary-text-color);
+        color: var(--header-text-color);
         display: inline-block;
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
         position: relative;
         text-transform: uppercase;
       }
@@ -84,48 +89,71 @@
       .rightItems gr-endpoint-decorator:not(:empty) {
         margin-left: 1em;
       }
-      gr-search-bar {
+      gr-smart-search {
         flex-grow: 1;
         margin-left: .5em;
         max-width: 500px;
       }
+      gr-dropdown,
+      .browse {
+        padding: .6em .5em;
+      }
       gr-dropdown {
-        padding: 0.5em;
+        --gr-dropdown-item: {
+          color: var(--primary-text-color);
+        }
+      }
+      .settingsButton {
+        margin-left: .5em;
       }
       .browse {
-        padding: 1em;
+        color: var(--header-text-color);
+        /* Same as gr-button */
+        margin: 5px 4px;
         text-decoration: none;
       }
-      .accountContainer:not(.loggedIn):not(.loggedOut) .loginButton,
-      .accountContainer:not(.loggedIn):not(.loggedOut) gr-account-dropdown,
-      .accountContainer.loggedIn .loginButton,
-      .accountContainer.loggedOut gr-account-dropdown {
+      .invisible,
+      .settingsButton,
+      gr-account-dropdown {
         display: none;
       }
+      :host([loading]) .accountContainer,
+      :host([logged-in]) .loginButton,
+      :host([logged-in]) .registerButton {
+        display: none;
+      }
+      :host([logged-in]) .settingsButton,
+      :host([logged-in]) gr-account-dropdown {
+        display: inline;
+      }
+      iron-icon {
+        color: var(--header-text-color);
+      }
       .accountContainer {
         align-items: center;
         display: flex;
-        margin: 0 -0.5em 0 0.5em;
-        white-space: nowrap;
+        margin: 0 -.5em 0 .5em;
         overflow: hidden;
         text-overflow: ellipsis;
+        white-space: nowrap;
       }
-      .loginButton {
-        padding: 1em;
+      .loginButton, .registerButton {
+        color: var(--header-text-color);
+        padding: .5em 1em;
       }
       .dropdown-trigger {
         text-decoration: none;
       }
       .dropdown-content {
-        background-color: #fff;
+        background-color: var(--view-background-color);
         box-shadow: 0 1px 5px rgba(0, 0, 0, .3);
       }
       @media screen and (max-width: 50em) {
         .bigTitle {
-          font-size: 14px;
-          font-family: var(--font-family-bold);
+          font-size: var(--font-size-large);
+          font-weight: var(--font-weight-bold);
         }
-        gr-search-bar,
+        gr-smart-search,
         .browse,
         .rightItems .hideOnMobile,
         .links > li.hideOnMobile {
@@ -159,24 +187,34 @@
           </gr-dropdown>
           </li>
         </template>
-        <li>
-          <a
-              class="browse linksTitle"
-              href$="[[_computeRelativeURL('/admin/projects')]]">
-            Browse</a>
-        </li>
       </ul>
       <div class="rightItems">
-        <gr-search-bar value="{{searchQuery}}" role="search"></gr-search-bar>
+        <gr-smart-search
+            id="search"
+            search-query="{{searchQuery}}"></gr-smart-search>
         <gr-endpoint-decorator
             class="hideOnMobile"
             name="header-browse-source"></gr-endpoint-decorator>
         <div class="accountContainer" id="accountContainer">
+          <div class$="[[_computeIsInvisible(_registerURL)]]">
+            <a
+                class="registerButton"
+                href$="[[_registerURL]]">
+              [[_registerText]]
+            </a>
+          </div>
           <a class="loginButton" href$="[[_loginURL]]">Sign in</a>
+          <a
+              class="settingsButton"
+              href$="[[_generateSettingsLink()]]"
+              title="Settings">
+            <iron-icon icon="gr-icons:settings"></iron-icon>
+          </a>
           <gr-account-dropdown account="[[_account]]"></gr-account-dropdown>
         </div>
       </div>
     </nav>
+    <gr-js-api-interface id="jsAPI"></gr-js-api-interface>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
   </template>
   <script src="gr-main-header.js"></script>
diff --git a/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.js b/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.js
index fe4f7cf..a77c66d 100644
--- a/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.js
+++ b/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -59,6 +62,13 @@
     },
   ];
 
+  // Set of authentication methods that can provide custom registration page.
+  const AUTH_TYPES_WITH_REGISTER_URL = new Set([
+    'LDAP',
+    'LDAP_BIND',
+    'CUSTOM_EXTENSION',
+  ]);
+
   Polymer({
     is: 'gr-main-header',
 
@@ -71,6 +81,14 @@
         type: String,
         notify: true,
       },
+      loggedIn: {
+        type: Boolean,
+        reflectToAttribute: true,
+      },
+      loading: {
+        type: Boolean,
+        reflectToAttribute: true,
+      },
 
       /** @type {?Object} */
       _account: Object,
@@ -90,7 +108,8 @@
       },
       _links: {
         type: Array,
-        computed: '_computeLinks(_defaultLinks, _userLinks, _docBaseUrl)',
+        computed: '_computeLinks(_defaultLinks, _userLinks, _adminLinks, ' +
+            '_topMenus, _docBaseUrl)',
       },
       _loginURL: {
         type: String,
@@ -100,9 +119,22 @@
         type: Array,
         value() { return []; },
       },
+      _topMenus: {
+        type: Array,
+        value() { return []; },
+      },
+      _registerText: {
+        type: String,
+        value: 'Sign up',
+      },
+      _registerURL: {
+        type: String,
+        value: null,
+      },
     },
 
     behaviors: [
+      Gerrit.AdminNavBehavior,
       Gerrit.BaseUrlBehavior,
       Gerrit.DocsUrlBehavior,
     ],
@@ -146,12 +178,17 @@
       return '//' + window.location.host + this.getBaseUrl() + path;
     },
 
-    _computeLinks(defaultLinks, userLinks, docBaseUrl) {
-      const links = defaultLinks.slice();
+    _computeLinks(defaultLinks, userLinks, adminLinks, topMenus, docBaseUrl) {
+      const links = defaultLinks.map(menu => {
+        return {
+          title: menu.title,
+          links: menu.links.slice(),
+        };
+      });
       if (userLinks && userLinks.length > 0) {
         links.push({
           title: 'Your',
-          links: userLinks,
+          links: userLinks.slice(),
         });
       }
       const docLinks = this._getDocLinks(docBaseUrl, DOCUMENTATION_LINKS);
@@ -162,6 +199,23 @@
           class: 'hideOnMobile',
         });
       }
+      links.push({
+        title: 'Browse',
+        links: adminLinks.slice(),
+      });
+      const topMenuLinks = [];
+      links.forEach(link => { topMenuLinks[link.title] = link.links; });
+      for (const m of topMenus) {
+        const items = m.items.map(this._fixCustomMenuItem);
+        if (m.name in topMenuLinks) {
+          items.forEach(link => { topMenuLinks[m.name].push(link); });
+        } else {
+          links.push({
+            title: m.name,
+            links: topMenuLinks[m.name] = items,
+          });
+        }
+      }
       return links;
     },
 
@@ -183,16 +237,35 @@
     },
 
     _loadAccount() {
-      return this.$.restAPI.getAccount().then(account => {
+      this.loading = true;
+      const promises = [
+        this.$.restAPI.getAccount(),
+        this.$.restAPI.getTopMenus(),
+        Gerrit.awaitPluginsLoaded(),
+      ];
+
+      return Promise.all(promises).then(result => {
+        const account = result[0];
         this._account = account;
-        this.$.accountContainer.classList.toggle('loggedIn', account != null);
-        this.$.accountContainer.classList.toggle('loggedOut', account == null);
+        this.loggedIn = !!account;
+        this.loading = false;
+        this._topMenus = result[1];
+
+        return this.getAdminLinks(account,
+            this.$.restAPI.getAccountCapabilities.bind(this.$.restAPI),
+            this.$.jsAPI.getAdminMenuLinks.bind(this.$.jsAPI))
+            .then(res => {
+              this._adminLinks = res.links;
+            });
       });
     },
 
     _loadConfig() {
       this.$.restAPI.getConfig()
-          .then(config => this.getDocsBaseUrl(config, this.$.restAPI))
+          .then(config => {
+            this._retrieveRegisterURL(config);
+            return this.getDocsBaseUrl(config, this.$.restAPI);
+          })
           .then(docBaseUrl => { this._docBaseUrl = docBaseUrl; });
     },
 
@@ -201,11 +274,24 @@
 
       this.$.restAPI.getPreferences().then(prefs => {
         this._userLinks =
-            prefs.my.map(this._fixMyMenuItem).filter(this._isSupportedLink);
+            prefs.my.map(this._fixCustomMenuItem).filter(this._isSupportedLink);
       });
     },
 
-    _fixMyMenuItem(linkObj) {
+    _retrieveRegisterURL(config) {
+      if (AUTH_TYPES_WITH_REGISTER_URL.has(config.auth.auth_type)) {
+        this._registerURL = config.auth.register_url;
+        if (config.auth.register_text) {
+          this._registerText = config.auth.register_text;
+        }
+      }
+    },
+
+    _computeIsInvisible(registerURL) {
+      return registerURL ? '' : 'invisible';
+    },
+
+    _fixCustomMenuItem(linkObj) {
       // Normalize all urls to PolyGerrit style.
       if (linkObj.url.startsWith('#')) {
         linkObj.url = linkObj.url.slice(1);
@@ -220,7 +306,7 @@
       // so we'll just disable it altogether for now.
       delete linkObj.target;
 
-      // Becasue the "my menu" links may be arbitrary URLs, we don't know
+      // Because the user provided links may be arbitrary URLs, we don't know
       // whether they correspond to any client routes. Mark all such links as
       // external.
       linkObj.external = true;
@@ -232,5 +318,9 @@
       // Groups are not yet supported.
       return !linkObj.url.startsWith('/groups');
     },
+
+    _generateSettingsLink() {
+      return this.getBaseUrl() + '/settings/';
+    },
   });
 })();
diff --git a/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header_test.html b/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header_test.html
index 5da8382..582ca61 100644
--- a/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header_test.html
+++ b/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -52,11 +53,39 @@
       sandbox.restore();
     });
 
+    test('link visibility', () => {
+      element.loading = true;
+      assert.equal(getComputedStyle(element.$$('.accountContainer')).display,
+          'none');
+      element.loading = false;
+      element.loggedIn = false;
+      assert.notEqual(getComputedStyle(element.$$('.accountContainer')).display,
+          'none');
+      assert.notEqual(getComputedStyle(element.$$('.loginButton')).display,
+          'none');
+      assert.notEqual(getComputedStyle(element.$$('.registerButton')).display,
+          'none');
+      assert.equal(getComputedStyle(element.$$('gr-account-dropdown')).display,
+          'none');
+      assert.equal(getComputedStyle(element.$$('.settingsButton')).display,
+          'none');
+      element.loggedIn = true;
+      assert.equal(getComputedStyle(element.$$('.loginButton')).display,
+          'none');
+      assert.equal(getComputedStyle(element.$$('.registerButton')).display,
+          'none');
+      assert.notEqual(getComputedStyle(element.$$('gr-account-dropdown'))
+          .display,
+          'none');
+      assert.notEqual(getComputedStyle(element.$$('.settingsButton')).display,
+          'none');
+    });
+
     test('fix my menu item', () => {
       assert.deepEqual([
         {url: 'https://awesometown.com/#hashyhash'},
         {url: 'url', target: '_blank'},
-      ].map(element._fixMyMenuItem), [
+      ].map(element._fixCustomMenuItem), [
         {url: 'https://awesometown.com/#hashyhash', external: true},
         {url: 'url', external: true},
       ]);
@@ -73,7 +102,6 @@
       ]);
     });
 
-
     test('user links', () => {
       const defaultLinks = [{
         title: 'Faves',
@@ -86,15 +114,28 @@
         name: 'Facebook',
         url: 'https://facebook.com',
       }];
+      const adminLinks = [{
+        name: 'Repos',
+        url: '/repos',
+      }];
 
       // When no admin links are passed, it should use the default.
-      assert.deepEqual(element._computeLinks(defaultLinks, []), defaultLinks);
-      assert.deepEqual(
-          element._computeLinks(defaultLinks, userLinks),
+      assert.deepEqual(element._computeLinks(defaultLinks, [], adminLinks, []),
           defaultLinks.concat({
-            title: 'Your',
-            links: userLinks,
+            title: 'Browse',
+            links: adminLinks,
           }));
+      assert.deepEqual(
+          element._computeLinks(defaultLinks, userLinks, adminLinks, []),
+          defaultLinks.concat([
+            {
+              title: 'Your',
+              links: userLinks,
+            },
+            {
+              title: 'Browse',
+              links: adminLinks,
+            }]));
     });
 
     test('documentation links', () => {
@@ -122,5 +163,176 @@
         url: 'base/index.html',
       }]);
     });
+
+    test('top menus', () => {
+      const adminLinks = [{
+        name: 'Repos',
+        url: '/repos',
+      }];
+      const topMenus = [{
+        name: 'Plugins',
+        items: [{
+          name: 'Manage',
+          target: '_blank',
+          url: 'https://gerrit/plugins/plugin-manager/static/index.html',
+        }],
+      }];
+      assert.deepEqual(element._computeLinks([], [], adminLinks, topMenus), [{
+        title: 'Browse',
+        links: adminLinks,
+      },
+      {
+        title: 'Plugins',
+        links: [{
+          name: 'Manage',
+          external: true,
+          url: 'https://gerrit/plugins/plugin-manager/static/index.html',
+        }],
+      }]);
+    });
+
+    test('merge top menus', () => {
+      const adminLinks = [{
+        name: 'Repos',
+        url: '/repos',
+      }];
+      const topMenus = [{
+        name: 'Plugins',
+        items: [{
+          name: 'Manage',
+          target: '_blank',
+          url: 'https://gerrit/plugins/plugin-manager/static/index.html',
+        }],
+      }, {
+        name: 'Plugins',
+        items: [{
+          name: 'Create',
+          target: '_blank',
+          url: 'https://gerrit/plugins/plugin-manager/static/create.html',
+        }],
+      }];
+      assert.deepEqual(element._computeLinks([], [], adminLinks, topMenus), [{
+        title: 'Browse',
+        links: adminLinks,
+      }, {
+        title: 'Plugins',
+        links: [{
+          name: 'Manage',
+          external: true,
+          url: 'https://gerrit/plugins/plugin-manager/static/index.html',
+        }, {
+          name: 'Create',
+          external: true,
+          url: 'https://gerrit/plugins/plugin-manager/static/create.html',
+        }],
+      }]);
+    });
+
+    test('merge top menus in default links', () => {
+      const defaultLinks = [{
+        title: 'Faves',
+        links: [{
+          name: 'Pinterest',
+          url: 'https://pinterest.com',
+        }],
+      }];
+      const topMenus = [{
+        name: 'Faves',
+        items: [{
+          name: 'Manage',
+          target: '_blank',
+          url: 'https://gerrit/plugins/plugin-manager/static/index.html',
+        }],
+      }];
+      assert.deepEqual(element._computeLinks(defaultLinks, [], [], topMenus), [{
+        title: 'Faves',
+        links: defaultLinks[0].links.concat([{
+          name: 'Manage',
+          external: true,
+          url: 'https://gerrit/plugins/plugin-manager/static/index.html',
+        }]),
+      }, {
+        title: 'Browse',
+        links: [],
+      }]);
+    });
+
+    test('merge top menus in user links', () => {
+      const userLinks = [{
+        name: 'Facebook',
+        url: 'https://facebook.com',
+      }];
+      const topMenus = [{
+        name: 'Your',
+        items: [{
+          name: 'Manage',
+          target: '_blank',
+          url: 'https://gerrit/plugins/plugin-manager/static/index.html',
+        }],
+      }];
+      assert.deepEqual(element._computeLinks([], userLinks, [], topMenus), [{
+        title: 'Your',
+        links: userLinks.concat([{
+          name: 'Manage',
+          external: true,
+          url: 'https://gerrit/plugins/plugin-manager/static/index.html',
+        }]),
+      }, {
+        title: 'Browse',
+        links: [],
+      }]);
+    });
+
+    test('merge top menus in admin links', () => {
+      const adminLinks = [{
+        name: 'Repos',
+        url: '/repos',
+      }];
+      const topMenus = [{
+        name: 'Browse',
+        items: [{
+          name: 'Manage',
+          target: '_blank',
+          url: 'https://gerrit/plugins/plugin-manager/static/index.html',
+        }],
+      }];
+      assert.deepEqual(element._computeLinks([], [], adminLinks, topMenus), [{
+        title: 'Browse',
+        links: adminLinks.concat([{
+          name: 'Manage',
+          external: true,
+          url: 'https://gerrit/plugins/plugin-manager/static/index.html',
+        }]),
+      }]);
+    });
+
+    test('register URL', () => {
+      const config = {
+        auth: {
+          auth_type: 'LDAP',
+          register_url: 'https//gerrit.example.com/register',
+        },
+      };
+      element._retrieveRegisterURL(config);
+      assert.equal(element._registerURL, config.auth.register_url);
+      assert.equal(element._registerText, 'Sign up');
+
+      config.auth.register_text = 'Create account';
+      element._retrieveRegisterURL(config);
+      assert.equal(element._registerURL, config.auth.register_url);
+      assert.equal(element._registerText, config.auth.register_text);
+    });
+
+    test('register URL ignored for wrong auth type', () => {
+      const config = {
+        auth: {
+          auth_type: 'OPENID',
+          register_url: 'https//gerrit.example.com/register',
+        },
+      };
+      element._retrieveRegisterURL(config);
+      assert.equal(element._registerURL, null);
+      assert.equal(element._registerText, 'Sign up');
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/core/gr-navigation/gr-navigation.html b/polygerrit-ui/app/elements/core/gr-navigation/gr-navigation.html
index 2ed7952..3650707 100644
--- a/polygerrit-ui/app/elements/core/gr-navigation/gr-navigation.html
+++ b/polygerrit-ui/app/elements/core/gr-navigation/gr-navigation.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -24,8 +25,19 @@
     //
     //  - Gerrit.Nav.View.CHANGE:
     //    - `changeNum`, required, String: the numeric ID of the change.
+    //    - `project`, optional, String: the project name.
+    //    - `patchNum`, optional, Number: the patch for the right-hand-side of
+    //        the diff.
+    //    - `basePatchNum`, optional, Number: the patch for the left-hand-side
+    //        of the diff. If `basePatchNum` is provided, then `patchNum` must
+    //        also be provided.
+    //    - `edit`, optional, Boolean: whether or not to load the file list with
+    //        edit controls.
     //
     // - Gerrit.Nav.View.SEARCH:
+    //    - `query`, optional, String: the literal search query. If provided,
+    //        the string will be used as the query, and all other params will be
+    //        ignored.
     //    - `owner`, optional, String: the owner name.
     //    - `project`, optional, String: the project name.
     //    - `branch`, optional, String: the branch name.
@@ -34,19 +46,39 @@
     //    - `statuses`, optional, Array<String>: the list of change statuses to
     //        search for. If more than one is provided, the search will OR them
     //        together.
+    //    - `offset`, optional, Number: the offset for the query.
     //
     //  - Gerrit.Nav.View.DIFF:
     //    - `changeNum`, required, String: the numeric ID of the change.
     //    - `path`, required, String: the filepath of the diff.
-    //    - `patchNum`, required, Number, the patch for the right-hand-side of
+    //    - `patchNum`, required, Number: the patch for the right-hand-side of
     //        the diff.
-    //    - `basePatchNum`, optional, Number, the patch for the left-hand-side
+    //    - `basePatchNum`, optional, Number: the patch for the left-hand-side
     //        of the diff. If `basePatchNum` is provided, then `patchNum` must
     //        also be provided.
-    //    - `lineNum`, optional, Number, the line number to be selected on load.
-    //    - `leftSide`, optional, Boolean, if a `lineNum` is provided, a value
+    //    - `lineNum`, optional, Number: the line number to be selected on load.
+    //    - `leftSide`, optional, Boolean: if a `lineNum` is provided, a value
     //        of true selects the line from base of the patch range. False by
     //        default.
+    //
+    //  - Gerrit.Nav.View.GROUP:
+    //    - `groupId`, required, String: the ID of the group.
+    //    - `detail`, optional, String: the name of the group detail view.
+    //      Takes any value from Gerrit.Nav.GroupDetailView.
+    //
+    //  - Gerrit.Nav.View.REPO:
+    //    - `repoName`, required, String: the name of the repo
+    //    - `detail`, optional, String: the name of the repo detail view.
+    //      Takes any value from Gerrit.Nav.RepoDetailView.
+    //
+    //  - Gerrit.Nav.View.DASHBOARD
+    //    - `repo`, optional, String.
+    //    - `sections`, optional, Array of objects with `title` and `query`
+    //      strings.
+    //    - `user`, optional, String.
+    //
+    //  - Gerrit.Nav.View.ROOT:
+    //    - no possible parameters.
 
     window.Gerrit = window.Gerrit || {};
 
@@ -57,27 +89,122 @@
       console.warn('Use of uninitialized routing');
     };
 
+    const EDIT_PATCHNUM = 'edit';
     const PARENT_PATCHNUM = 'PARENT';
 
+    const USER_PLACEHOLDER_PATTERN = /\$\{user\}/g;
+
+    // NOTE: These queries are tested in Java. Any changes made to definitions
+    // here require corresponding changes to:
+    // javatests/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java
+    const DEFAULT_SECTIONS = [
+      {
+        // Changes with unpublished draft comments. This section is omitted when
+        // viewing other users, so we don't need to filter anything out.
+        name: 'Has draft comments',
+        query: 'has:draft',
+        selfOnly: true,
+        hideIfEmpty: true,
+        suffixForDashboard: 'limit:10',
+      },
+      {
+        // Changes that are assigned to the viewed user.
+        name: 'Assigned reviews',
+        query: 'assignee:${user} (-is:wip OR owner:self OR assignee:self) ' +
+            'is:open -is:ignored',
+        hideIfEmpty: true,
+      },
+      {
+        // WIP open changes owned by viewing user. This section is omitted when
+        // viewing other users, so we don't need to filter anything out.
+        name: 'Work in progress',
+        query: 'is:open owner:${user} is:wip',
+        selfOnly: true,
+        hideIfEmpty: true,
+      },
+      {
+        // Non-WIP open changes owned by viewed user. Filter out changes ignored
+        // by the viewing user.
+        name: 'Outgoing reviews',
+        query: 'is:open owner:${user} -is:wip -is:ignored',
+        isOutgoing: true,
+      },
+      {
+        // Non-WIP open changes not owned by the viewed user, that the viewed user
+        // is associated with (as either a reviewer or the assignee). Changes
+        // ignored by the viewing user are filtered out.
+        name: 'Incoming reviews',
+        query: 'is:open -owner:${user} -is:wip -is:ignored ' +
+            '(reviewer:${user} OR assignee:${user})',
+      },
+      {
+        // Open changes the viewed user is CCed on. Changes ignored by the viewing
+        // user are filtered out.
+        name: 'CCed on',
+        query: 'is:open -is:ignored cc:${user}',
+      },
+      {
+        name: 'Recently closed',
+        // Closed changes where viewed user is owner, reviewer, or assignee.
+        // Changes ignored by the viewing user are filtered out, and so are WIP
+        // changes not owned by the viewing user (the one instance of
+        // 'owner:self' is intentional and implements this logic).
+        query: 'is:closed -is:ignored (-is:wip OR owner:self) ' +
+            '(owner:${user} OR reviewer:${user} OR assignee:${user} ' +
+            'OR cc:${user})',
+        suffixForDashboard: '-age:4w limit:10',
+      },
+    ];
+
     window.Gerrit.Nav = {
 
       View: {
         ADMIN: 'admin',
-        CHANGE: 'change',
         AGREEMENTS: 'agreements',
+        CHANGE: 'change',
         DASHBOARD: 'dashboard',
         DIFF: 'diff',
+        DOCUMENTATION_SEARCH: 'documentation-search',
         EDIT: 'edit',
+        GROUP: 'group',
+        PLUGIN_SCREEN: 'plugin-screen',
+        REPO: 'repo',
+        ROOT: 'root',
         SEARCH: 'search',
         SETTINGS: 'settings',
       },
 
+      GroupDetailView: {
+        MEMBERS: 'members',
+        LOG: 'log',
+      },
+
+      RepoDetailView: {
+        ACCESS: 'access',
+        BRANCHES: 'branches',
+        COMMANDS: 'commands',
+        DASHBOARDS: 'dashboards',
+        TAGS: 'tags',
+      },
+
+      WeblinkType: {
+        CHANGE: 'change',
+        FILE: 'file',
+        PATCHSET: 'patchset',
+      },
+
       /** @type {Function} */
       _navigate: uninitialized,
 
       /** @type {Function} */
       _generateUrl: uninitialized,
 
+      /** @type {Function} */
+      _generateWeblinks: uninitialized,
+
+      /** @type {Function} */
+      mapCommentlinks: uninitialized,
+
       /**
        * @param {number=} patchNum
        * @param {number|string=} basePatchNum
@@ -90,17 +217,38 @@
 
       /**
        * Setup router implementation.
-       * @param {Function} navigate
-       * @param {Function} generateUrl
+       * @param {function(!string)} navigate the router-abstracted equivalent of
+       *     `window.location.href = ...`. Takes a string.
+       * @param {function(!Object): string} generateUrl generates a URL given
+       *     navigation parameters, detailed in the file header.
+       * @param {function(!Object): string} generateWeblinks weblinks generator
+       *     function takes single payload parameter with type property that
+       *  determines which
+       *     part of the UI is the consumer of the weblinks. type property can
+       *     be one of file, change, or patchset.
+       *     - For file type, payload will also contain string properties: repo,
+       *         commit, file.
+       *     - For patchset type, payload will also contain string properties:
+       *         repo, commit.
+       *     - For change type, payload will also contain string properties:
+       *         repo, commit. If server provides weblinks, those will be passed
+       *         as options.weblinks property on the main payload object.
+       * @param {function(!Object): Object} mapCommentlinks provides an escape
+       *     hatch to modify the commentlinks object, e.g. if it contains any
+       *     relative URLs.
        */
-      setup(navigate, generateUrl) {
+      setup(navigate, generateUrl, generateWeblinks, mapCommentlinks) {
         this._navigate = navigate;
         this._generateUrl = generateUrl;
+        this._generateWeblinks = generateWeblinks;
+        this.mapCommentlinks = mapCommentlinks;
       },
 
       destroy() {
         this._navigate = uninitialized;
         this._generateUrl = uninitialized;
+        this._generateWeblinks = uninitialized;
+        this.mapCommentlinks = uninitialized;
       },
 
       /**
@@ -112,17 +260,27 @@
         return this._generateUrl(params);
       },
 
+      getUrlForSearchQuery(query, opt_offset) {
+        return this._getUrlFor({
+          view: Gerrit.Nav.View.SEARCH,
+          query,
+          offset: opt_offset,
+        });
+      },
+
       /**
        * @param {!string} project The name of the project.
        * @param {boolean=} opt_openOnly When true, only search open changes in
        *     the project.
+       * @param {string=} opt_host The host in which to search.
        * @return {string}
        */
-      getUrlForProject(project, opt_openOnly) {
+      getUrlForProjectChanges(project, opt_openOnly, opt_host) {
         return this._getUrlFor({
           view: Gerrit.Nav.View.SEARCH,
           project,
           statuses: opt_openOnly ? ['open'] : [],
+          host: opt_host,
         });
       },
 
@@ -130,26 +288,30 @@
        * @param {string} branch The name of the branch.
        * @param {string} project The name of the project.
        * @param {string=} opt_status The status to search.
+       * @param {string=} opt_host The host in which to search.
        * @return {string}
        */
-      getUrlForBranch(branch, project, opt_status) {
+      getUrlForBranch(branch, project, opt_status, opt_host) {
         return this._getUrlFor({
           view: Gerrit.Nav.View.SEARCH,
           branch,
           project,
           statuses: opt_status ? [opt_status] : undefined,
+          host: opt_host,
         });
       },
 
       /**
        * @param {string} topic The name of the topic.
+       * @param {string=} opt_host The host in which to search.
        * @return {string}
        */
-      getUrlForTopic(topic) {
+      getUrlForTopic(topic, opt_host) {
         return this._getUrlFor({
           view: Gerrit.Nav.View.SEARCH,
           topic,
           statuses: ['open', 'merged'],
+          host: opt_host,
         });
       },
 
@@ -166,13 +328,34 @@
       },
 
       /**
+       * Navigate to a search for changes with the given status.
+       * @param {string} status
+       */
+      navigateToStatusSearch(status) {
+        this._navigate(this._getUrlFor({
+          view: Gerrit.Nav.View.SEARCH,
+          statuses: [status],
+        }));
+      },
+
+      /**
+       * Navigate to a search query
+       * @param {string} query
+       * @param {number=} opt_offset
+       */
+      navigateToSearchQuery(query, opt_offset) {
+        return this._navigate(this.getUrlForSearchQuery(query, opt_offset));
+      },
+
+      /**
        * @param {!Object} change The change object.
        * @param {number=} opt_patchNum
        * @param {number|string=} opt_basePatchNum The string 'PARENT' can be
        *     used for none.
+       * @param {boolean=} opt_isEdit
        * @return {string}
        */
-      getUrlForChange(change, opt_patchNum, opt_basePatchNum) {
+      getUrlForChange(change, opt_patchNum, opt_basePatchNum, opt_isEdit) {
         if (opt_basePatchNum === PARENT_PATCHNUM) {
           opt_basePatchNum = undefined;
         }
@@ -184,6 +367,8 @@
           project: change.project,
           patchNum: opt_patchNum,
           basePatchNum: opt_basePatchNum,
+          edit: opt_isEdit,
+          host: change.internalHost || undefined,
         });
       },
 
@@ -207,10 +392,11 @@
        * @param {number=} opt_patchNum
        * @param {number|string=} opt_basePatchNum The string 'PARENT' can be
        *     used for none.
+       * @param {boolean=} opt_isEdit
        */
-      navigateToChange(change, opt_patchNum, opt_basePatchNum) {
+      navigateToChange(change, opt_patchNum, opt_basePatchNum, opt_isEdit) {
         this._navigate(this.getUrlForChange(change, opt_patchNum,
-            opt_basePatchNum));
+            opt_basePatchNum, opt_isEdit));
       },
 
       /**
@@ -219,11 +405,12 @@
        * @param {number=} opt_patchNum
        * @param {number|string=} opt_basePatchNum The string 'PARENT' can be
        *     used for none.
+       * @param {number|string=} opt_lineNum
        * @return {string}
        */
-      getUrlForDiff(change, path, opt_patchNum, opt_basePatchNum) {
+      getUrlForDiff(change, path, opt_patchNum, opt_basePatchNum, opt_lineNum) {
         return this.getUrlForDiffById(change._number, change.project, path,
-            opt_patchNum, opt_basePatchNum);
+            opt_patchNum, opt_basePatchNum, opt_lineNum);
       },
 
       /**
@@ -259,24 +446,29 @@
       /**
        * @param {{ _number: number, project: string }} change The change object.
        * @param {string} path The file path.
+       * @param {number=} opt_patchNum
        * @return {string}
        */
-      getEditUrlForDiff(change, path) {
-        return this.getEditUrlForDiffById(change._number, change.project, path);
+      getEditUrlForDiff(change, path, opt_patchNum) {
+        return this.getEditUrlForDiffById(change._number, change.project, path,
+            opt_patchNum);
       },
 
       /**
        * @param {number} changeNum
        * @param {string} project The name of the project.
        * @param {string} path The file path.
+       * @param {number|string=} opt_patchNum The patchNum the file content
+       *    should be based on, or ${EDIT_PATCHNUM} if left undefined.
        * @return {string}
        */
-      getEditUrlForDiffById(changeNum, project, path) {
+      getEditUrlForDiffById(changeNum, project, path, opt_patchNum) {
         return this._getUrlFor({
           view: Gerrit.Nav.View.EDIT,
           changeNum,
           project,
           path,
+          patchNum: opt_patchNum || EDIT_PATCHNUM,
         });
       },
 
@@ -315,6 +507,29 @@
       },
 
       /**
+       * @return {string}
+       */
+      getUrlForRoot() {
+        return this._getUrlFor({
+          view: Gerrit.Nav.View.ROOT,
+        });
+      },
+
+      /**
+       * @param {string} repo The name of the repo.
+       * @param {string} dashboard The ID of the dashboard, in the form of
+       *     '<ref>:<path>'.
+       * @return {string}
+       */
+      getUrlForRepoDashboard(repo, dashboard) {
+        return this._getUrlFor({
+          view: Gerrit.Nav.View.DASHBOARD,
+          repo,
+          dashboard,
+        });
+      },
+
+      /**
        * Navigate to an arbitrary relative URL.
        * @param {string} relativeUrl
        */
@@ -325,9 +540,188 @@
         this._navigate(relativeUrl);
       },
 
+      /**
+       * @param {string} repoName
+       * @return {string}
+       */
+      getUrlForRepo(repoName) {
+        return this._getUrlFor({
+          view: Gerrit.Nav.View.REPO,
+          repoName,
+        });
+      },
+
+      /**
+       * Navigate to a repo settings page.
+       * @param {string} repoName
+       */
+      navigateToRepo(repoName) {
+        this._navigate(this.getUrlForRepo(repoName));
+      },
+
+      /**
+       * @param {string} repoName
+       * @return {string}
+       */
+      getUrlForRepoTags(repoName) {
+        return this._getUrlFor({
+          view: Gerrit.Nav.View.REPO,
+          repoName,
+          detail: Gerrit.Nav.RepoDetailView.TAGS,
+        });
+      },
+
+      /**
+       * @param {string} repoName
+       * @return {string}
+       */
+      getUrlForRepoBranches(repoName) {
+        return this._getUrlFor({
+          view: Gerrit.Nav.View.REPO,
+          repoName,
+          detail: Gerrit.Nav.RepoDetailView.BRANCHES,
+        });
+      },
+
+      /**
+       * @param {string} repoName
+       * @return {string}
+       */
+      getUrlForRepoAccess(repoName) {
+        return this._getUrlFor({
+          view: Gerrit.Nav.View.REPO,
+          repoName,
+          detail: Gerrit.Nav.RepoDetailView.ACCESS,
+        });
+      },
+
+      /**
+       * @param {string} repoName
+       * @return {string}
+       */
+      getUrlForRepoCommands(repoName) {
+        return this._getUrlFor({
+          view: Gerrit.Nav.View.REPO,
+          repoName,
+          detail: Gerrit.Nav.RepoDetailView.COMMANDS,
+        });
+      },
+
+      /**
+       * @param {string} repoName
+       * @return {string}
+       */
+      getUrlForRepoDashboards(repoName) {
+        return this._getUrlFor({
+          view: Gerrit.Nav.View.REPO,
+          repoName,
+          detail: Gerrit.Nav.RepoDetailView.DASHBOARDS,
+        });
+      },
+
+      /**
+       * @param {string} groupId
+       * @return {string}
+       */
+      getUrlForGroup(groupId) {
+        return this._getUrlFor({
+          view: Gerrit.Nav.View.GROUP,
+          groupId,
+        });
+      },
+
+      /**
+       * @param {string} groupId
+       * @return {string}
+       */
+      getUrlForGroupLog(groupId) {
+        return this._getUrlFor({
+          view: Gerrit.Nav.View.GROUP,
+          groupId,
+          detail: Gerrit.Nav.GroupDetailView.LOG,
+        });
+      },
+
+      /**
+       * @param {string} groupId
+       * @return {string}
+       */
+      getUrlForGroupMembers(groupId) {
+        return this._getUrlFor({
+          view: Gerrit.Nav.View.GROUP,
+          groupId,
+          detail: Gerrit.Nav.GroupDetailView.MEMBERS,
+        });
+      },
+
       getUrlForSettings() {
         return this._getUrlFor({view: Gerrit.Nav.View.SETTINGS});
       },
+
+      /**
+       * @param {string} repo
+       * @param {string} commit
+       * @param {string} file
+       * @param {Object=} opt_options
+       * @return {
+       *   Array<{label: string, url: string}>|
+       *   {label: string, url: string}
+       *  }
+       */
+      getFileWebLinks(repo, commit, file, opt_options) {
+        const params = {type: Gerrit.Nav.WeblinkType.FILE, repo, commit, file};
+        if (opt_options) {
+          params.options = opt_options;
+        }
+        return [].concat(this._generateWeblinks(params));
+      },
+
+      /**
+       * @param {string} repo
+       * @param {string} commit
+       * @param {Object=} opt_options
+       * @return {{label: string, url: string}}
+       */
+      getPatchSetWeblink(repo, commit, opt_options) {
+        const params = {type: Gerrit.Nav.WeblinkType.PATCHSET, repo, commit};
+        if (opt_options) {
+          params.options = opt_options;
+        }
+        const result = this._generateWeblinks(params);
+        if (Array.isArray(result)) {
+          return result.pop();
+        } else {
+          return result;
+        }
+      },
+
+      /**
+       * @param {string} repo
+       * @param {string} commit
+       * @param {Object=} opt_options
+       * @return {
+       *   Array<{label: string, url: string}>|
+       *   {label: string, url: string}
+       *  }
+       */
+      getChangeWeblinks(repo, commit, opt_options) {
+        const params = {type: Gerrit.Nav.WeblinkType.CHANGE, repo, commit};
+        if (opt_options) {
+          params.options = opt_options;
+        }
+        return [].concat(this._generateWeblinks(params));
+      },
+
+      getUserDashboard(user = 'self', sections = DEFAULT_SECTIONS,
+          title = '') {
+        sections = sections
+          .filter(section => (user === 'self' || !section.selfOnly))
+          .map(section => Object.assign({}, section, {
+            name: section.name,
+            query: section.query.replace(USER_PLACEHOLDER_PATTERN, user),
+          }));
+        return {title, sections};
+      },
     };
   })(window);
 </script>
diff --git a/polygerrit-ui/app/elements/core/gr-navigation/gr-navigation_test.html b/polygerrit-ui/app/elements/core/gr-navigation/gr-navigation_test.html
index b829e83..2f72338 100644
--- a/polygerrit-ui/app/elements/core/gr-navigation/gr-navigation_test.html
+++ b/polygerrit-ui/app/elements/core/gr-navigation/gr-navigation_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -28,5 +29,56 @@
       assert.throw(() => Gerrit.Nav.getUrlForChange('123', undefined, 12));
       assert.throw(() => Gerrit.Nav.getUrlForDiff('123', 'x.c', undefined, 12));
     });
+
+    suite('_getUserDashboard', () => {
+      const sections = [
+        {name: 'section 1', query: 'query 1'},
+        {name: 'section 2', query: 'query 2 for ${user}'},
+        {name: 'section 3', query: 'self only query', selfOnly: true},
+        {name: 'section 4', query: 'query 4', suffixForDashboard: 'suffix'},
+      ];
+
+      test('dashboard for self', () => {
+        const dashboard =
+            Gerrit.Nav.getUserDashboard('self', sections, 'title');
+        assert.deepEqual(
+            dashboard,
+            {
+              title: 'title',
+              sections: [
+                {name: 'section 1', query: 'query 1'},
+                {name: 'section 2', query: 'query 2 for self'},
+                {
+                  name: 'section 3',
+                  query: 'self only query',
+                  selfOnly: true,
+                }, {
+                  name: 'section 4',
+                  query: 'query 4',
+                  suffixForDashboard: 'suffix',
+                },
+              ],
+            });
+      });
+
+      test('dashboard for other user', () => {
+        const dashboard =
+            Gerrit.Nav.getUserDashboard('user', sections, 'title');
+        assert.deepEqual(
+            dashboard,
+            {
+              title: 'title',
+              sections: [
+                {name: 'section 1', query: 'query 1'},
+                {name: 'section 2', query: 'query 2 for user'},
+                {
+                  name: 'section 4',
+                  query: 'query 4',
+                  suffixForDashboard: 'suffix',
+                },
+              ],
+            });
+      });
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/core/gr-reporting/gr-jank-detector.js b/polygerrit-ui/app/elements/core/gr-reporting/gr-jank-detector.js
new file mode 100644
index 0000000..28c46f4
--- /dev/null
+++ b/polygerrit-ui/app/elements/core/gr-reporting/gr-jank-detector.js
@@ -0,0 +1,61 @@
+/**
+ * @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.
+ */
+(function() {
+  'use strict';
+
+  const JANK_SLEEP_TIME_MS = 1000;
+
+  const GrJankDetector = {
+    // Slowdowns counter.
+    jank: 0,
+    fps: 0,
+    _lastFrameTime: 0,
+
+    start() {
+      this._requestAnimationFrame(this._detect.bind(this));
+    },
+
+    _requestAnimationFrame(callback) {
+      window.requestAnimationFrame(callback);
+    },
+
+    _detect(now) {
+      if (this._lastFrameTime === 0) {
+        this._lastFrameTime = now;
+        this.fps = 0;
+        this._requestAnimationFrame(this._detect.bind(this));
+        return;
+      }
+      const fpsNow = 1000/(now - this._lastFrameTime);
+      this._lastFrameTime = now;
+      // Calculate moving average within last 3 measurements.
+      this.fps = this.fps === 0 ? fpsNow : ((this.fps * 2 + fpsNow) / 3);
+      if (this.fps > 10) {
+        this._requestAnimationFrame(this._detect.bind(this));
+      } else {
+        this.jank++;
+        console.warn('JANK', this.jank);
+        this._lastFrameTime = 0;
+        window.setTimeout(
+            () => this._requestAnimationFrame(this._detect.bind(this)),
+            JANK_SLEEP_TIME_MS);
+      }
+    },
+  };
+
+  window.GrJankDetector = GrJankDetector;
+})();
diff --git a/polygerrit-ui/app/elements/core/gr-reporting/gr-jank-detector_test.html b/polygerrit-ui/app/elements/core/gr-reporting/gr-jank-detector_test.html
new file mode 100644
index 0000000..6faeec1
--- /dev/null
+++ b/polygerrit-ui/app/elements/core/gr-reporting/gr-jank-detector_test.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<!--
+@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.
+-->
+
+<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+<title>gr-jank-detector</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+
+<script src="gr-jank-detector.js"></script>
+
+<script>
+  suite('gr-jank-detector tests', () => {
+    let sandbox;
+    let clock;
+    let instance;
+
+    const NOW_TIME = 100;
+
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+      clock = sinon.useFakeTimers(NOW_TIME);
+      instance = GrJankDetector;
+      instance._lastFrameTime = 0;
+      sandbox.stub(instance, '_requestAnimationFrame');
+    });
+
+    teardown(() => {
+      sandbox.restore();
+    });
+
+    test('start() installs frame callback', () => {
+      sandbox.stub(instance, '_detect');
+      instance._requestAnimationFrame.callsArg(0);
+      instance.start();
+      assert.isTrue(instance._detect.calledOnce);
+    });
+
+    test('measures fps', () => {
+      instance._detect(10);
+      instance._detect(30);
+      assert.equal(instance.fps, 50);
+    });
+
+    test('detects jank', () => {
+      let now = 10;
+      instance._detect(now);
+      const fastFrame = () => instance._detect(now += 20);
+      const slowFrame = () => instance._detect(now += 300);
+      fastFrame();
+      assert.equal(instance.jank, 0);
+      _.times(4, slowFrame);
+      assert.equal(instance.jank, 0);
+      instance._requestAnimationFrame.reset();
+      slowFrame();
+      assert.equal(instance.jank, 1);
+      assert.isFalse(instance._requestAnimationFrame.called);
+      clock.tick(1000);
+      assert.isTrue(instance._requestAnimationFrame.called);
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/core/gr-reporting/gr-reporting.html b/polygerrit-ui/app/elements/core/gr-reporting/gr-reporting.html
index d5d33ab..935de6b 100644
--- a/polygerrit-ui/app/elements/core/gr-reporting/gr-reporting.html
+++ b/polygerrit-ui/app/elements/core/gr-reporting/gr-reporting.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,10 +15,9 @@
 limitations under the License.
 -->
 
-<link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
-<link rel="import" href="../../shared/gr-js-api-interface/gr-js-api-interface.html">
 
 <dom-module id="gr-reporting">
+  <script src="gr-jank-detector.js"></script>
   <script src="gr-reporting.js"></script>
 </dom-module>
diff --git a/polygerrit-ui/app/elements/core/gr-reporting/gr-reporting.js b/polygerrit-ui/app/elements/core/gr-reporting/gr-reporting.js
index 5a8ddf6..36126e4 100644
--- a/polygerrit-ui/app/elements/core/gr-reporting/gr-reporting.js
+++ b/polygerrit-ui/app/elements/core/gr-reporting/gr-reporting.js
@@ -1,28 +1,62 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
   // Latency reporting constants.
   const TIMING = {
     TYPE: 'timing-report',
-    CATEGORY: 'UI Latency',
+    CATEGORY_UI_LATENCY: 'UI Latency',
+    CATEGORY_RPC: 'RPC Timing',
     // Reported events - alphabetize below.
     APP_STARTED: 'App Started',
     PAGE_LOADED: 'Page Loaded',
   };
 
+  // Plugin-related reporting constants.
+  const PLUGINS = {
+    TYPE: 'lifecycle',
+    // Reported events - alphabetize below.
+    INSTALLED: 'Plugins installed',
+  };
+
+  // Chrome extension-related reporting constants.
+  const EXTENSION = {
+    TYPE: 'lifecycle',
+    // Reported events - alphabetize below.
+    DETECTED: 'Extension detected',
+  };
+
+  // Page visibility related constants.
+  const PAGE_VISIBILITY = {
+    TYPE: 'lifecycle',
+    CATEGORY: 'Page Visibility',
+    // Reported events - alphabetize below.
+    STARTED_HIDDEN: 'hidden',
+  };
+
+  // Frame rate related constants.
+  const JANK = {
+    TYPE: 'lifecycle',
+    CATEGORY: 'UI Latency',
+    // Reported events - alphabetize below.
+    COUNT: 'Jank count',
+  };
+
   // Navigation reporting constants.
   const NAVIGATION = {
     TYPE: 'nav-report',
@@ -35,10 +69,35 @@
     CATEGORY: 'exception',
   };
 
+  const TIMER = {
+    CHANGE_DISPLAYED: 'ChangeDisplayed',
+    CHANGE_LOAD_FULL: 'ChangeFullyLoaded',
+    DASHBOARD_DISPLAYED: 'DashboardDisplayed',
+    DIFF_VIEW_DISPLAYED: 'DiffViewDisplayed',
+    FILE_LIST_DISPLAYED: 'FileListDisplayed',
+    PLUGINS_LOADED: 'PluginsLoaded',
+    STARTUP_CHANGE_DISPLAYED: 'StartupChangeDisplayed',
+    STARTUP_CHANGE_LOAD_FULL: 'StartupChangeFullyLoaded',
+    STARTUP_DASHBOARD_DISPLAYED: 'StartupDashboardDisplayed',
+    STARTUP_DIFF_VIEW_DISPLAYED: 'StartupDiffViewDisplayed',
+    STARTUP_FILE_LIST_DISPLAYED: 'StartupFileListDisplayed',
+    WEB_COMPONENTS_READY: 'WebComponentsReady',
+  };
+
+  const STARTUP_TIMERS = {};
+  STARTUP_TIMERS[TIMER.PLUGINS_LOADED] = 0;
+  STARTUP_TIMERS[TIMER.STARTUP_CHANGE_DISPLAYED] = 0;
+  STARTUP_TIMERS[TIMER.STARTUP_CHANGE_LOAD_FULL] = 0;
+  STARTUP_TIMERS[TIMER.STARTUP_DASHBOARD_DISPLAYED] = 0;
+  STARTUP_TIMERS[TIMER.STARTUP_DIFF_VIEW_DISPLAYED] = 0;
+  STARTUP_TIMERS[TIMER.STARTUP_FILE_LIST_DISPLAYED] = 0;
+  // WebComponentsReady timer is triggered from gr-router.
+  STARTUP_TIMERS[TIMER.WEB_COMPONENTS_READY] = 0;
+
   const INTERACTION_TYPE = 'interaction';
 
-  const CHANGE_VIEW_REGEX = /^\/c\/\d+\/?\d*$/;
-  const DIFF_VIEW_REGEX = /^\/c\/\d+\/\d+\/.+$/;
+  const DRAFT_ACTION_TIMER = 'TimeBetweenDraftActions';
+  const DRAFT_ACTION_TIMER_MAX = 2 * 60 * 1000; // 2 minutes.
 
   const pending = [];
 
@@ -74,37 +133,56 @@
   };
   catchErrors();
 
-  const GrReporting = Polymer({
+  GrJankDetector.start();
+
+  // The Polymer pass of JSCompiler requires this to be reassignable
+  // eslint-disable-next-line prefer-const
+  let GrReporting = Polymer({
     is: 'gr-reporting',
 
     properties: {
       category: String,
 
       _baselines: {
-        type: Array,
-        value() { return {}; },
+        type: Object,
+        value: STARTUP_TIMERS, // Shared across all instances.
+      },
+
+      _timers: {
+        type: Object,
+        value: {timeBetweenDraftActions: null}, // Shared across all instances.
       },
     },
 
-    behaviors: [
-      Gerrit.BaseUrlBehavior,
-    ],
-
     get performanceTiming() {
       return window.performance.timing;
     },
 
     now() {
-      return Math.round(10 * window.performance.now()) / 10;
+      return window.performance.now();
+    },
+
+    _arePluginsLoaded() {
+      return this._baselines &&
+        !this._baselines.hasOwnProperty(TIMER.PLUGINS_LOADED);
     },
 
     reporter(...args) {
-      const report = (Gerrit._arePluginsLoaded() && !pending.length) ?
+      const report = (this._arePluginsLoaded() && !pending.length) ?
         this.defaultReporter : this.cachingReporter;
       report.apply(this, args);
     },
 
-    defaultReporter(type, category, eventName, eventValue) {
+    /**
+     * The default reporter reports events immediately.
+     * @param {string} type
+     * @param {string} category
+     * @param {string} eventName
+     * @param {string|number} eventValue
+     * @param {boolean|undefined} opt_noLog If true, the event will not be
+     *     logged to the JS console.
+     */
+    defaultReporter(type, category, eventName, eventValue, opt_noLog) {
       const detail = {
         type,
         category,
@@ -112,6 +190,7 @@
         value: eventValue,
       };
       document.dispatchEvent(new CustomEvent(type, {detail}));
+      if (opt_noLog) { return; }
       if (type === ERROR.TYPE) {
         console.error(eventValue.error || eventName);
       } else {
@@ -120,30 +199,44 @@
       }
     },
 
-    cachingReporter(type, category, eventName, eventValue) {
+    /**
+     * The caching reporter will queue reports until plugins have loaded, and
+     * log events immediately if they're reported after plugins have loaded.
+     * @param {string} type
+     * @param {string} category
+     * @param {string} eventName
+     * @param {string|number} eventValue
+     * @param {boolean|undefined} opt_noLog If true, the event will not be
+     *     logged to the JS console.
+     */
+    cachingReporter(type, category, eventName, eventValue, opt_noLog) {
       if (type === ERROR.TYPE) {
         console.error(eventValue.error || eventName);
       }
-      if (Gerrit._arePluginsLoaded()) {
+      if (this._arePluginsLoaded()) {
         if (pending.length) {
           for (const args of pending.splice(0)) {
             this.reporter(...args);
           }
         }
-        this.reporter(type, category, eventName, eventValue);
+        this.reporter(type, category, eventName, eventValue, opt_noLog);
       } else {
-        pending.push([type, category, eventName, eventValue]);
+        pending.push([type, category, eventName, eventValue, opt_noLog]);
       }
     },
 
     /**
      * User-perceived app start time, should be reported when the app is ready.
      */
-    appStarted() {
+    appStarted(hidden) {
       const startTime =
           new Date().getTime() - this.performanceTiming.navigationStart;
-      this.reporter(
-          TIMING.TYPE, TIMING.CATEGORY, TIMING.APP_STARTED, startTime);
+      this.reporter(TIMING.TYPE, TIMING.CATEGORY_UI_LATENCY,
+          TIMING.APP_STARTED, startTime);
+      if (hidden) {
+        this.reporter(PAGE_VISIBILITY.TYPE, PAGE_VISIBILITY.CATEGORY,
+            PAGE_VISIBILITY.STARTED_HIDDEN);
+      }
     },
 
     /**
@@ -156,34 +249,80 @@
       } else {
         const loadTime = this.performanceTiming.loadEventEnd -
             this.performanceTiming.navigationStart;
-        this.reporter(
-            TIMING.TYPE, TIMING.CATEGORY, TIMING.PAGE_LOADED, loadTime);
+        this.reporter(TIMING.TYPE, TIMING.CATEGORY_UI_LATENCY,
+            TIMING.PAGE_LOADED, loadTime);
       }
     },
 
-    locationChanged() {
-      let page = '';
-      const pathname = this._getPathname();
-      if (pathname.startsWith('/q/')) {
-        page = this.getBaseUrl() + '/q/';
-      } else if (pathname.match(CHANGE_VIEW_REGEX)) { // change view
-        page = this.getBaseUrl() + '/c/';
-      } else if (pathname.match(DIFF_VIEW_REGEX)) { // diff view
-        page = this.getBaseUrl() + '/c//COMMIT_MSG';
-      } else {
-        // Ignore other page changes.
-        return;
+    beforeLocationChanged() {
+      if (GrJankDetector.jank > 0) {
+        this.reporter(
+            JANK.TYPE, JANK.CATEGORY, JANK.COUNT, GrJankDetector.jank);
+        GrJankDetector.jank = 0;
       }
+      for (const prop of Object.keys(this._baselines)) {
+        delete this._baselines[prop];
+      }
+      this.time(TIMER.CHANGE_DISPLAYED);
+      this.time(TIMER.CHANGE_LOAD_FULL);
+      this.time(TIMER.DASHBOARD_DISPLAYED);
+      this.time(TIMER.DIFF_VIEW_DISPLAYED);
+      this.time(TIMER.FILE_LIST_DISPLAYED);
+    },
+
+    locationChanged(page) {
       this.reporter(
           NAVIGATION.TYPE, NAVIGATION.CATEGORY, NAVIGATION.PAGE, page);
     },
 
-    pluginsLoaded() {
-      this.timeEnd('PluginsLoaded');
+    dashboardDisplayed() {
+      if (this._baselines.hasOwnProperty(TIMER.STARTUP_DASHBOARD_DISPLAYED)) {
+        this.timeEnd(TIMER.STARTUP_DASHBOARD_DISPLAYED);
+      } else {
+        this.timeEnd(TIMER.DASHBOARD_DISPLAYED);
+      }
     },
 
-    _getPathname() {
-      return '/' + window.location.pathname.substring(this.getBaseUrl().length);
+    changeDisplayed() {
+      if (this._baselines.hasOwnProperty(TIMER.STARTUP_CHANGE_DISPLAYED)) {
+        this.timeEnd(TIMER.STARTUP_CHANGE_DISPLAYED);
+      } else {
+        this.timeEnd(TIMER.CHANGE_DISPLAYED);
+      }
+    },
+
+    changeFullyLoaded() {
+      if (this._baselines.hasOwnProperty(TIMER.STARTUP_CHANGE_LOAD_FULL)) {
+        this.timeEnd(TIMER.STARTUP_CHANGE_LOAD_FULL);
+      } else {
+        this.timeEnd(TIMER.CHANGE_LOAD_FULL);
+      }
+    },
+
+    diffViewDisplayed() {
+      if (this._baselines.hasOwnProperty(TIMER.STARTUP_DIFF_VIEW_DISPLAYED)) {
+        this.timeEnd(TIMER.STARTUP_DIFF_VIEW_DISPLAYED);
+      } else {
+        this.timeEnd(TIMER.DIFF_VIEW_DISPLAYED);
+      }
+    },
+
+    fileListDisplayed() {
+      if (this._baselines.hasOwnProperty(TIMER.STARTUP_FILE_LIST_DISPLAYED)) {
+        this.timeEnd(TIMER.STARTUP_FILE_LIST_DISPLAYED);
+      } else {
+        this.timeEnd(TIMER.FILE_LIST_DISPLAYED);
+      }
+    },
+
+    reportExtension(name) {
+      this.reporter(EXTENSION.TYPE, EXTENSION.DETECTED, name);
+    },
+
+    pluginsLoaded(pluginsList) {
+      this.timeEnd(TIMER.PLUGINS_LOADED);
+      this.reporter(
+          PLUGINS.TYPE, PLUGINS.INSTALLED, (pluginsList || []).join(','));
     },
 
     /**
@@ -197,18 +336,126 @@
      * Finish named timer and report it to server.
      */
     timeEnd(name) {
-      const baseTime = this._baselines[name] || 0;
-      const time = Math.round(this.now() - baseTime) + 'ms';
-      this.reporter(TIMING.TYPE, TIMING.CATEGORY, name, time);
+      if (!this._baselines.hasOwnProperty(name)) { return; }
+      const baseTime = this._baselines[name];
+      this._reportTiming(name, this.now() - baseTime);
       delete this._baselines[name];
     },
 
+    /**
+     * Reports just line timeEnd, but additionally reports an average given a
+     * denominator and a separate reporiting name for the average.
+     * @param {string} name Timing name.
+     * @param {string} averageName Average timing name.
+     * @param {number} denominator Number by which to divide the total to
+     *     compute the average.
+     */
+    timeEndWithAverage(name, averageName, denominator) {
+      if (!this._baselines.hasOwnProperty(name)) { return; }
+      const baseTime = this._baselines[name];
+      this.timeEnd(name);
+
+      // Guard against division by zero.
+      if (!denominator) { return; }
+      const time = Math.round(this.now() - baseTime);
+      this._reportTiming(averageName, time / denominator);
+    },
+
+    /**
+     * Send a timing report with an arbitrary time value.
+     * @param {string} name Timing name.
+     * @param {number} time The time to report as an integer of milliseconds.
+     */
+    _reportTiming(name, time) {
+      this.reporter(TIMING.TYPE, TIMING.CATEGORY_UI_LATENCY, name,
+          Math.round(time));
+    },
+
+    /**
+     * Get a timer object to for reporing a user timing. The start time will be
+     * the time that the object has been created, and the end time will be the
+     * time that the "end" method is called on the object.
+     * @param {string} name Timing name.
+     * @returns {!Object} The timer object.
+     */
+    getTimer(name) {
+      let called = false;
+      let start;
+      let max = null;
+
+      const timer = {
+
+        // Clear the timer and reset the start time.
+        reset: () => {
+          called = false;
+          start = this.now();
+          return timer;
+        },
+
+        // Stop the timer and report the intervening time.
+        end: () => {
+          if (called) {
+            throw new Error(`Timer for "${name}" already ended.`);
+          }
+          called = true;
+          const time = this.now() - start;
+
+          // If a maximum is specified and the time exceeds it, do not report.
+          if (max && time > max) { return timer; }
+
+          this._reportTiming(name, time);
+          return timer;
+        },
+
+        // Set a maximum reportable time. If a maximum is set and the timer is
+        // ended after the specified amount of time, the value is not reported.
+        withMaximum(maximum) {
+          max = maximum;
+          return timer;
+        },
+      };
+
+      // The timer is initialized to its creation time.
+      return timer.reset();
+    },
+
+    /**
+     * Log timing information for an RPC.
+     * @param {string} anonymizedUrl The URL of the RPC with tokens obfuscated.
+     * @param {number} elapsed The time elapsed of the RPC.
+     */
+    reportRpcTiming(anonymizedUrl, elapsed) {
+      this.reporter(TIMING.TYPE, TIMING.CATEGORY_RPC, 'RPC-' + anonymizedUrl,
+          elapsed, true);
+    },
+
     reportInteraction(eventName, opt_msg) {
       this.reporter(INTERACTION_TYPE, this.category, eventName, opt_msg);
     },
+
+    /**
+     * A draft interaction was started. Update the time-betweeen-draft-actions
+     * timer.
+     */
+    recordDraftInteraction() {
+      // If there is no timer defined, then this is the first interaction.
+      // Set up the timer so that it's ready to record the intervening time when
+      // called again.
+      const timer = this._timers.timeBetweenDraftActions;
+      if (!timer) {
+        // Create a timer with a maximum length.
+        this._timers.timeBetweenDraftActions = this.getTimer(DRAFT_ACTION_TIMER)
+            .withMaximum(DRAFT_ACTION_TIMER_MAX);
+        return;
+      }
+
+      // Mark the time and reinitialize the timer.
+      timer.end().reset();
+    },
   });
 
   window.GrReporting = GrReporting;
   // Expose onerror installation so it would be accessible from tests.
   window.GrReporting._catchErrors = catchErrors;
+  window.GrReporting.STARTUP_TIMERS = Object.assign({}, STARTUP_TIMERS);
 })();
diff --git a/polygerrit-ui/app/elements/core/gr-reporting/gr-reporting_test.html b/polygerrit-ui/app/elements/core/gr-reporting/gr-reporting_test.html
index e88096b..8b85074 100644
--- a/polygerrit-ui/app/elements/core/gr-reporting/gr-reporting_test.html
+++ b/polygerrit-ui/app/elements/core/gr-reporting/gr-reporting_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -44,6 +45,7 @@
       sandbox = sinon.sandbox.create();
       clock = sinon.useFakeTimers(NOW_TIME);
       element = fixture('basic');
+      element._baselines = Object.assign({}, GrReporting.STARTUP_TIMERS);
       fakePerformance = {
         navigationStart: 1,
         loadEventEnd: 2,
@@ -52,18 +54,31 @@
           {get() { return fakePerformance; }});
       sandbox.stub(element, 'reporter');
     });
+
     teardown(() => {
       sandbox.restore();
       clock.restore();
     });
 
     test('appStarted', () => {
-      element.appStarted();
+      element.appStarted(true);
       assert.isTrue(
           element.reporter.calledWithExactly(
               'timing-report', 'UI Latency', 'App Started',
               NOW_TIME - fakePerformance.navigationStart
       ));
+      assert.isTrue(
+          element.reporter.calledWithExactly(
+              'lifecycle', 'Page Visibility', 'hidden'
+      ));
+    });
+
+    test('WebComponentsReady', () => {
+      sandbox.stub(element, 'now').returns(42);
+      element.timeEnd('WebComponentsReady');
+      assert.isTrue(element.reporter.calledWithExactly(
+          'timing-report', 'UI Latency', 'WebComponentsReady', 42
+      ));
     });
 
     test('pageLoaded', () => {
@@ -75,20 +90,167 @@
       );
     });
 
+    test('beforeLocationChanged', () => {
+      element._baselines['garbage'] = 'monster';
+      sandbox.stub(element, 'time');
+      GrJankDetector.jank = 42;
+      element.beforeLocationChanged();
+      assert.equal(GrJankDetector.jank, 0);
+      assert.isTrue(element.reporter.calledWithExactly(
+          'lifecycle', 'UI Latency', 'Jank count', 42));
+      assert.isTrue(element.time.calledWithExactly('DashboardDisplayed'));
+      assert.isTrue(element.time.calledWithExactly('ChangeDisplayed'));
+      assert.isTrue(element.time.calledWithExactly('ChangeFullyLoaded'));
+      assert.isTrue(element.time.calledWithExactly('DiffViewDisplayed'));
+      assert.isTrue(element.time.calledWithExactly('FileListDisplayed'));
+      assert.isFalse(element._baselines.hasOwnProperty('garbage'));
+    });
+
+    test('changeDisplayed', () => {
+      sandbox.spy(element, 'timeEnd');
+      element.changeDisplayed();
+      assert.isFalse(
+          element.timeEnd.calledWithExactly('ChangeDisplayed'));
+      assert.isTrue(
+          element.timeEnd.calledWithExactly('StartupChangeDisplayed'));
+      element.changeDisplayed();
+      assert.isTrue(element.timeEnd.calledWithExactly('ChangeDisplayed'));
+    });
+
+    test('changeFullyLoaded', () => {
+      sandbox.spy(element, 'timeEnd');
+      element.changeFullyLoaded();
+      assert.isFalse(
+          element.timeEnd.calledWithExactly('ChangeFullyLoaded'));
+      assert.isTrue(
+          element.timeEnd.calledWithExactly('StartupChangeFullyLoaded'));
+      element.changeFullyLoaded();
+      assert.isTrue(element.timeEnd.calledWithExactly('ChangeFullyLoaded'));
+    });
+
+    test('diffViewDisplayed', () => {
+      sandbox.spy(element, 'timeEnd');
+      element.diffViewDisplayed();
+      assert.isFalse(
+          element.timeEnd.calledWithExactly('DiffViewDisplayed'));
+      assert.isTrue(
+          element.timeEnd.calledWithExactly('StartupDiffViewDisplayed'));
+      element.diffViewDisplayed();
+      assert.isTrue(element.timeEnd.calledWithExactly('DiffViewDisplayed'));
+    });
+
+    test('fileListDisplayed', () => {
+      sandbox.spy(element, 'timeEnd');
+      element.fileListDisplayed();
+      assert.isFalse(
+          element.timeEnd.calledWithExactly('FileListDisplayed'));
+      assert.isTrue(
+          element.timeEnd.calledWithExactly('StartupFileListDisplayed'));
+      element.fileListDisplayed();
+      assert.isTrue(element.timeEnd.calledWithExactly('FileListDisplayed'));
+    });
+
+    test('dashboardDisplayed', () => {
+      sandbox.spy(element, 'timeEnd');
+      element.dashboardDisplayed();
+      assert.isFalse(
+          element.timeEnd.calledWithExactly('DashboardDisplayed'));
+      assert.isTrue(
+          element.timeEnd.calledWithExactly('StartupDashboardDisplayed'));
+      element.dashboardDisplayed();
+      assert.isTrue(element.timeEnd.calledWithExactly('DashboardDisplayed'));
+    });
+
     test('time and timeEnd', () => {
       const nowStub = sandbox.stub(element, 'now').returns(0);
       element.time('foo');
-      nowStub.returns(1);
+      nowStub.returns(1.1);
       element.time('bar');
       nowStub.returns(2);
       element.timeEnd('bar');
-      nowStub.returns(3.123);
+      nowStub.returns(3.511);
       element.timeEnd('foo');
       assert.isTrue(element.reporter.calledWithExactly(
-          'timing-report', 'UI Latency', 'foo', '3ms'
+          'timing-report', 'UI Latency', 'foo', 4
       ));
       assert.isTrue(element.reporter.calledWithExactly(
-          'timing-report', 'UI Latency', 'bar', '1ms'
+          'timing-report', 'UI Latency', 'bar', 1
+      ));
+    });
+
+    test('timer object', () => {
+      const nowStub = sandbox.stub(element, 'now').returns(100);
+      const timer = element.getTimer('foo-bar');
+      nowStub.returns(150);
+      timer.end();
+      assert.isTrue(element.reporter.calledWithExactly(
+          'timing-report', 'UI Latency', 'foo-bar', 50));
+    });
+
+    test('timer object double call', () => {
+      const timer = element.getTimer('foo-bar');
+      timer.end();
+      assert.isTrue(element.reporter.calledOnce);
+      assert.throws(() => {
+        timer.end();
+        done();
+      }, 'Timer for "foo-bar" already ended.');
+    });
+
+    test('timer object maximum', () => {
+      const nowStub = sandbox.stub(element, 'now').returns(100);
+      const timer = element.getTimer('foo-bar').withMaximum(100);
+      nowStub.returns(150);
+      timer.end();
+      assert.isTrue(element.reporter.calledOnce);
+
+      timer.reset();
+      nowStub.returns(260);
+      timer.end();
+      assert.isTrue(element.reporter.calledOnce);
+    });
+
+    test('recordDraftInteraction', () => {
+      const key = 'TimeBetweenDraftActions';
+      const nowStub = sandbox.stub(element, 'now').returns(100);
+      const timingStub = sandbox.stub(element, '_reportTiming');
+      element.recordDraftInteraction();
+      assert.isFalse(timingStub.called);
+
+      nowStub.returns(200);
+      element.recordDraftInteraction();
+      assert.isTrue(timingStub.calledOnce);
+      assert.equal(timingStub.lastCall.args[0], key);
+      assert.equal(timingStub.lastCall.args[1], 100);
+
+      nowStub.returns(350);
+      element.recordDraftInteraction();
+      assert.isTrue(timingStub.calledTwice);
+      assert.equal(timingStub.lastCall.args[0], key);
+      assert.equal(timingStub.lastCall.args[1], 150);
+
+      nowStub.returns(370 + 2 * 60 * 1000);
+      element.recordDraftInteraction();
+      assert.isFalse(timingStub.calledThrice);
+    });
+
+    test('timeEndWithAverage', () => {
+      const nowStub = sandbox.stub(element, 'now').returns(0);
+      nowStub.returns(1000);
+      element.time('foo');
+      nowStub.returns(1100);
+      element.timeEndWithAverage('foo', 'bar', 10);
+      assert.isTrue(element.reporter.calledTwice);
+      assert.isTrue(element.reporter.calledWithExactly(
+          'timing-report', 'UI Latency', 'foo', 100));
+      assert.isTrue(element.reporter.calledWithExactly(
+          'timing-report', 'UI Latency', 'bar', 10));
+    });
+
+    test('reportExtension', () => {
+      element.reportExtension('foo');
+      assert.isTrue(element.reporter.calledWithExactly(
+          'lifecycle', 'Extension detected', 'foo'
       ));
     });
 
@@ -96,81 +258,58 @@
       setup(() => {
         element.reporter.restore();
         sandbox.stub(element, 'defaultReporter');
-        sandbox.stub(Gerrit, '_arePluginsLoaded');
       });
 
       test('pluginsLoaded reports time', () => {
-        Gerrit._arePluginsLoaded.returns(true);
         sandbox.stub(element, 'now').returns(42);
         element.pluginsLoaded();
         assert.isTrue(element.defaultReporter.calledWithExactly(
-            'timing-report', 'UI Latency', 'PluginsLoaded', '42ms'
+            'timing-report', 'UI Latency', 'PluginsLoaded', 42, undefined
+        ));
+      });
+
+      test('pluginsLoaded reports plugins', () => {
+        element.pluginsLoaded(['foo', 'bar']);
+        assert.isTrue(element.defaultReporter.calledWith(
+            'lifecycle', 'Plugins installed', 'foo,bar'
         ));
       });
 
       test('caches reports if plugins are not loaded', () => {
-        Gerrit._arePluginsLoaded.returns(false);
         element.timeEnd('foo');
         assert.isFalse(element.defaultReporter.called);
       });
 
       test('reports if plugins are loaded', () => {
-        Gerrit._arePluginsLoaded.returns(true);
-        element.timeEnd('foo');
+        element.pluginsLoaded();
         assert.isTrue(element.defaultReporter.called);
       });
 
       test('reports cached events preserving order', () => {
-        Gerrit._arePluginsLoaded.returns(false);
+        element.time('foo');
+        element.time('bar');
         element.timeEnd('foo');
-        Gerrit._arePluginsLoaded.returns(true);
+        element.pluginsLoaded();
         element.timeEnd('bar');
-        assert.isTrue(element.defaultReporter.firstCall.calledWith(
+        assert.isTrue(element.defaultReporter.getCall(0).calledWith(
             'timing-report', 'UI Latency', 'foo'
         ));
-        assert.isTrue(element.defaultReporter.secondCall.calledWith(
+        assert.isTrue(element.defaultReporter.getCall(1).calledWith(
+            'timing-report', 'UI Latency', 'PluginsLoaded'
+        ));
+        assert.isTrue(element.defaultReporter.getCall(2).calledWith(
+            'lifecycle', 'Plugins installed'
+        ));
+        assert.isTrue(element.defaultReporter.getCall(3).calledWith(
             'timing-report', 'UI Latency', 'bar'
         ));
       });
     });
 
-    suite('location changed', () => {
-      let pathnameStub;
-      setup(() => {
-        pathnameStub = sinon.stub(element, '_getPathname');
-      });
-
-      teardown(() => {
-        pathnameStub.restore();
-      });
-
-      test('search', () => {
-        pathnameStub.returns('/q/foo');
-        element.locationChanged();
-        assert.isTrue(element.reporter.calledWithExactly(
-            'nav-report', 'Location Changed', 'Page', '/q/'));
-      });
-
-      test('change view', () => {
-        pathnameStub.returns('/c/42/');
-        element.locationChanged();
-        assert.isTrue(element.reporter.calledWithExactly(
-            'nav-report', 'Location Changed', 'Page', '/c/'));
-      });
-
-      test('change view', () => {
-        pathnameStub.returns('/c/41/2');
-        element.locationChanged();
-        assert.isTrue(element.reporter.calledWithExactly(
-            'nav-report', 'Location Changed', 'Page', '/c/'));
-      });
-
-      test('diff view', () => {
-        pathnameStub.returns('/c/41/2/file.txt');
-        element.locationChanged();
-        assert.isTrue(element.reporter.calledWithExactly(
-            'nav-report', 'Location Changed', 'Page', '/c//COMMIT_MSG'));
-      });
+    test('search', () => {
+      element.locationChanged('_handleSomeRoute');
+      assert.isTrue(element.reporter.calledWithExactly(
+          'nav-report', 'Location Changed', 'Page', '_handleSomeRoute'));
     });
 
     suite('exception logging', () => {
diff --git a/polygerrit-ui/app/elements/core/gr-router/gr-router.html b/polygerrit-ui/app/elements/core/gr-router/gr-router.html
index 2ef65f4..68ddef6 100644
--- a/polygerrit-ui/app/elements/core/gr-router/gr-router.html
+++ b/polygerrit-ui/app/elements/core/gr-router/gr-router.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,7 +18,7 @@
 
 <link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
 <link rel="import" href="../../../behaviors/gr-patch-set-behavior/gr-patch-set-behavior.html">
-<link rel="import" href="../../../behaviors/gr-url-encoding-behavior.html">
+<link rel="import" href="../../../behaviors/gr-url-encoding-behavior/gr-url-encoding-behavior.html">
 <link rel="import" href="../../core/gr-navigation/gr-navigation.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
 <link rel="import" href="../gr-reporting/gr-reporting.html">
@@ -25,6 +26,7 @@
 <dom-module id="gr-router">
   <template>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
+    <gr-reporting id="reporting"></gr-reporting>
   </template>
   <script src="../../../bower_components/page/page.js"></script>
   <script src="gr-router.js"></script>
diff --git a/polygerrit-ui/app/elements/core/gr-router/gr-router.js b/polygerrit-ui/app/elements/core/gr-router/gr-router.js
index 49e7012..c590bcc 100644
--- a/polygerrit-ui/app/elements/core/gr-router/gr-router.js
+++ b/polygerrit-ui/app/elements/core/gr-router/gr-router.js
@@ -1,24 +1,31 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
   const RoutePattern = {
     ROOT: '/',
-    DASHBOARD: '/dashboard/(.*)',
-    ADMIN_PLACEHOLDER: '/admin/(.*)',
-    AGREEMENTS: /^\/settings\/(agreements|new-agreement)/,
+
+    DASHBOARD: /^\/dashboard\/(.+)$/,
+    CUSTOM_DASHBOARD: /^\/dashboard\/?$/,
+    PROJECT_DASHBOARD: /^\/p\/(.+)\/\+\/dashboard\/(.+)/,
+
+    AGREEMENTS: /^\/settings\/agreements\/?/,
+    NEW_AGREEMENTS: /^\/settings\/new-agreement\/?/,
     REGISTER: /^\/register(\/.*)?$/,
 
     // Pattern for login and logout URLs intended to be passed-through. May
@@ -52,31 +59,36 @@
     // Matches /admin/create-project
     LEGACY_CREATE_GROUP: /^\/admin\/create-group\/?$/,
 
-    // Matches /admin/projects/<project>
-    PROJECT: /^\/admin\/projects\/([^,]+)$/,
+    PROJECT_OLD: /^\/admin\/(projects)\/?(.+)?$/,
 
-    // Matches /admin/projects/<project>,commands.
-    PROJECT_COMMANDS: /^\/admin\/projects\/(.+),commands$/,
+    // Matches /admin/repos/<repo>
+    REPO: /^\/admin\/repos\/([^,]+)$/,
 
-    // Matches /admin/projects/<project>,access.
-    PROJECT_ACCESS: /^\/admin\/projects\/(.+),access$/,
+    // Matches /admin/repos/<repo>,commands.
+    REPO_COMMANDS: /^\/admin\/repos\/(.+),commands$/,
 
-    // Matches /admin/projects[,<offset>][/].
-    PROJECT_LIST_OFFSET: /^\/admin\/projects(,(\d+))?(\/)?$/,
-    PROJECT_LIST_FILTER: '/admin/projects/q/filter::filter',
-    PROJECT_LIST_FILTER_OFFSET: '/admin/projects/q/filter::filter,:offset',
+    // Matches /admin/repos/<repos>,access.
+    REPO_ACCESS: /^\/admin\/repos\/(.+),access$/,
 
-    // Matches /admin/projects/<project>,branches[,<offset>].
-    BRANCH_LIST_OFFSET: /^\/admin\/projects\/(.+),branches(,(.+))?$/,
-    BRANCH_LIST_FILTER: '/admin/projects/:project,branches/q/filter::filter',
+    // Matches /admin/repos/<repos>,access.
+    REPO_DASHBOARDS: /^\/admin\/repos\/(.+),dashboards$/,
+
+    // Matches /admin/repos[,<offset>][/].
+    REPO_LIST_OFFSET: /^\/admin\/repos(,(\d+))?(\/)?$/,
+    REPO_LIST_FILTER: '/admin/repos/q/filter::filter',
+    REPO_LIST_FILTER_OFFSET: '/admin/repos/q/filter::filter,:offset',
+
+    // Matches /admin/repos/<repo>,branches[,<offset>].
+    BRANCH_LIST_OFFSET: /^\/admin\/repos\/(.+),branches(,(.+))?$/,
+    BRANCH_LIST_FILTER: '/admin/repos/:repo,branches/q/filter::filter',
     BRANCH_LIST_FILTER_OFFSET:
-        '/admin/projects/:project,branches/q/filter::filter,:offset',
+        '/admin/repos/:repo,branches/q/filter::filter,:offset',
 
-    // Matches /admin/projects/<project>,tags[,<offset>].
-    TAG_LIST_OFFSET: /^\/admin\/projects\/(.+),tags(,(.+))?$/,
-    TAG_LIST_FILTER: '/admin/projects/:project,tags/q/filter::filter',
+    // Matches /admin/repos/<repo>,tags[,<offset>].
+    TAG_LIST_OFFSET: /^\/admin\/repos\/(.+),tags(,(.+))?$/,
+    TAG_LIST_FILTER: '/admin/repos/:repo,tags/q/filter::filter',
     TAG_LIST_FILTER_OFFSET:
-        '/admin/projects/:project,tags/q/filter::filter,:offset',
+        '/admin/repos/:repo,tags/q/filter::filter,:offset',
 
     PLUGINS: /^\/plugins\/(.+)$/,
 
@@ -101,16 +113,23 @@
     CHANGE_NUMBER_LEGACY: /^\/(\d+)\/?/,
 
     // Matches
-    // /c/<project>/+/<changeNum>/
-    //     [<basePatchNum|edit>..][<patchNum|edit>]/[path].
+    // /c/<project>/+/<changeNum>/[<basePatchNum|edit>..][<patchNum|edit>].
+    // TODO(kaspern): Migrate completely to project based URLs, with backwards
+    // compatibility for change-only.
+    CHANGE: /^\/c\/(.+)\/\+\/(\d+)(\/?((-?\d+|edit)(\.\.(\d+|edit))?))?\/?$/,
+
+    // Matches /c/<project>/+/<changeNum>/[<patchNum|edit>],edit
+    CHANGE_EDIT: /^\/c\/(.+)\/\+\/(\d+)(\/(\d+))?,edit\/?$/,
+
+    // Matches
+    // /c/<project>/+/<changeNum>/[<basePatchNum|edit>..]<patchNum|edit>/<path>.
     // TODO(kaspern): Migrate completely to project based URLs, with backwards
     // compatibility for change-only.
     // eslint-disable-next-line max-len
-    CHANGE_OR_DIFF: /^\/c\/(.+)\/\+\/(\d+)(\/?((-?\d+|edit)(\.\.(\d+|edit))?(\/(.+))?))?\/?$/,
+    DIFF: /^\/c\/(.+)\/\+\/(\d+)(\/((-?\d+|edit)(\.\.(\d+|edit))?(\/(.+))))\/?$/,
 
-    // Matches /c/<project>/+/<changeNum>/edit/<path>,edit
-    // eslint-disable-next-line max-len
-    DIFF_EDIT: /^\/c\/(.+)\/\+\/(\d+)\/edit\/(.+),edit$/,
+    // Matches /c/<project>/+/<changeNum>/[<patchNum|edit>]/<path>,edit
+    DIFF_EDIT: /^\/c\/(.+)\/\+\/(\d+)\/(\d+|edit)\/(.+),edit$/,
 
     // Matches non-project-relative
     // /c/<changeNum>/[<basePatchNum>..]<patchNum>/<path>.
@@ -127,6 +146,12 @@
     // Matches /c/<changeNum>/ /<URL tail>
     // Catches improperly encoded URLs (context: Issue 7100)
     IMPROPERLY_ENCODED_PLUS: /^\/c\/(.+)\/\ \/(.+)$/,
+
+    PLUGIN_SCREEN: /^\/x\/([\w-]+)\/([\w-]+)\/?/,
+
+    DOCUMENTATION_SEARCH_FILTER: '/Documentation/q/filter::filter',
+    DOCUMENTATION_SEARCH: /^\/Documentation\/q\/(.*)$/,
+    DOCUMENTATION: /^\/Documentation(\/)?(.+)?/,
   };
 
   /**
@@ -139,12 +164,24 @@
   const LINE_ADDRESS_PATTERN = /^([ab]?)(\d+)$/;
 
   /**
+   * Pattern to recognize '+' in url-encoded strings for replacement with ' '.
+   */
+  const PLUS_PATTERN = /\+/g;
+
+  /**
+   * Pattern to recognize leading '?' in window.location.search, for stripping.
+   */
+  const QUESTION_PATTERN = /^\?*/;
+
+  /**
    * GWT UI would use @\d+ at the end of a path to indicate linenum.
    */
   const LEGACY_LINENUM_PATTERN = /@([ab]?\d+)$/;
 
   const LEGACY_QUERY_SUFFIX_PATTERN = /,n,z$/;
 
+  const REPO_TOKEN_PATTERN = /\$\{(project|repo)\}/g;
+
   // Polymer makes `app` intrinsically defined on the window by virtue of the
   // custom element having the id "app", but it is made explicit here.
   const app = document.querySelector('#app');
@@ -152,21 +189,18 @@
     console.log('No gr-app found (running tests)');
   }
 
-  let _reporting;
-  function getReporting() {
-    if (!_reporting) {
-      _reporting = document.createElement('gr-reporting');
-    }
-    return _reporting;
-  }
+  // Setup listeners outside of the router component initialization.
+  (function() {
+    const reporting = document.createElement('gr-reporting');
 
-  document.onload = function() {
-    getReporting().pageLoaded();
-  };
+    window.addEventListener('load', () => {
+      reporting.pageLoaded();
+    });
 
-  window.addEventListener('WebComponentsReady', () => {
-    getReporting().timeEnd('WebComponentsReady');
-  });
+    window.addEventListener('WebComponentsReady', () => {
+      reporting.timeEnd('WebComponentsReady');
+    });
+  })();
 
   Polymer({
     is: 'gr-router',
@@ -176,6 +210,7 @@
         type: Object,
         value: app,
       },
+      _isRedirecting: Boolean,
     },
 
     behaviors: [
@@ -194,74 +229,34 @@
     },
 
     _redirect(url) {
+      this._isRedirecting = true;
       page.redirect(url);
     },
 
+    /**
+     * @param {!Object} params
+     * @return {string}
+     */
     _generateUrl(params) {
       const base = this.getBaseUrl();
       let url = '';
+      const Views = Gerrit.Nav.View;
 
-      if (params.view === Gerrit.Nav.View.SEARCH) {
-        const operators = [];
-        if (params.owner) {
-          operators.push('owner:' + this.encodeURL(params.owner, false));
-        }
-        if (params.project) {
-          operators.push('project:' + this.encodeURL(params.project, false));
-        }
-        if (params.branch) {
-          operators.push('branch:' + this.encodeURL(params.branch, false));
-        }
-        if (params.topic) {
-          operators.push('topic:"' + this.encodeURL(params.topic, false) + '"');
-        }
-        if (params.hashtag) {
-          operators.push('hashtag:"' +
-              this.encodeURL(params.hashtag.toLowerCase(), false) + '"');
-        }
-        if (params.statuses) {
-          if (params.statuses.length === 1) {
-            operators.push(
-                'status:' + this.encodeURL(params.statuses[0], false));
-          } else if (params.statuses.length > 1) {
-            operators.push(
-                '(' +
-                params.statuses.map(s => `status:${this.encodeURL(s, false)}`)
-                    .join(' OR ') +
-                ')');
-          }
-        }
-        url = '/q/' + operators.join('+');
-      } else if (params.view === Gerrit.Nav.View.CHANGE) {
-        let range = this._getPatchRangeExpression(params);
-        if (range.length) { range = '/' + range; }
-        if (params.project) {
-          url = `/c/${params.project}/+/${params.changeNum}${range}`;
-        } else {
-          url = `/c/${params.changeNum}${range}`;
-        }
-      } else if (params.view === Gerrit.Nav.View.DASHBOARD) {
-        url = `/dashboard/${params.user || 'self'}`;
-      } else if (params.view === Gerrit.Nav.View.DIFF) {
-        let range = this._getPatchRangeExpression(params);
-        if (range.length) { range = '/' + range; }
-
-        let suffix = `${range}/${this.encodeURL(params.path, true)}`;
-        if (params.lineNum) {
-          suffix += '#';
-          if (params.leftSide) { suffix += 'b'; }
-          suffix += params.lineNum;
-        }
-
-        if (params.project) {
-          url = `/c/${params.project}/+/${params.changeNum}${suffix}`;
-        } else {
-          url = `/c/${params.changeNum}${suffix}`;
-        }
-        if (params.edit) {
-          url += ',edit';
-        }
-      } else if (params.view === Gerrit.Nav.View.SETTINGS) {
+      if (params.view === Views.SEARCH) {
+        url = this._generateSearchUrl(params);
+      } else if (params.view === Views.CHANGE) {
+        url = this._generateChangeUrl(params);
+      } else if (params.view === Views.DASHBOARD) {
+        url = this._generateDashboardUrl(params);
+      } else if (params.view === Views.DIFF || params.view === Views.EDIT) {
+        url = this._generateDiffOrEditUrl(params);
+      } else if (params.view === Views.GROUP) {
+        url = this._generateGroupUrl(params);
+      } else if (params.view === Views.REPO) {
+        url = this._generateRepoUrl(params);
+      } else if (params.view === Views.ROOT) {
+        url = '/';
+      } else if (params.view === Views.SETTINGS) {
         url = this._generateSettingsUrl(params);
       } else {
         throw new Error('Can\'t generate');
@@ -270,6 +265,244 @@
       return base + url;
     },
 
+    _generateWeblinks(params) {
+      const type = params.type;
+      switch (type) {
+        case Gerrit.Nav.WeblinkType.FILE:
+          return this._getFileWebLinks(params);
+        case Gerrit.Nav.WeblinkType.CHANGE:
+          return this._getChangeWeblinks(params);
+        case Gerrit.Nav.WeblinkType.PATCHSET:
+          return this._getPatchSetWeblink(params);
+        default:
+          console.warn(`Unsupported weblink ${type}!`);
+      }
+    },
+
+    _getPatchSetWeblink(params) {
+      const {commit, options} = params;
+      const {weblinks, config} = options || {};
+      const name = commit && commit.slice(0, 7);
+      const weblink = this._getBrowseCommitWeblink(weblinks, config);
+      if (!weblink || !weblink.url) {
+        return {name};
+      } else {
+        return {name, url: weblink.url};
+      }
+    },
+
+    _firstCodeBrowserWeblink(weblinks) {
+      // This is an ordered whitelist of web link types that provide direct
+      // links to the commit in the url property.
+      const codeBrowserLinks = ['gitiles', 'browse', 'gitweb'];
+      for (let i = 0; i < codeBrowserLinks.length; i++) {
+        const weblink =
+          weblinks.find(weblink => weblink.name === codeBrowserLinks[i]);
+        if (weblink) { return weblink; }
+      }
+      return null;
+    },
+
+
+    _getBrowseCommitWeblink(weblinks, config) {
+      if (!weblinks) { return null; }
+      let weblink;
+      // Use primary weblink if configured and exists.
+      if (config && config.gerrit && config.gerrit.primary_weblink_name) {
+        weblink = weblinks.find(
+            weblink => weblink.name === config.gerrit.primary_weblink_name
+        );
+      }
+      if (!weblink) {
+        weblink = this._firstCodeBrowserWeblink(weblinks);
+      }
+      if (!weblink) { return null; }
+      return weblink;
+    },
+
+    _getChangeWeblinks({repo, commit, options: {weblinks, config}}) {
+      if (!weblinks || !weblinks.length) return [];
+      const commitWeblink = this._getBrowseCommitWeblink(weblinks, config);
+      return weblinks.filter(weblink =>
+        !commitWeblink ||
+        !commitWeblink.name ||
+        weblink.name !== commitWeblink.name);
+    },
+
+    _getFileWebLinks({repo, commit, file, options: {weblinks}}) {
+      return weblinks;
+    },
+
+    /**
+     * @param {!Object} params
+     * @return {string}
+     */
+    _generateSearchUrl(params) {
+      let offsetExpr = '';
+      if (params.offset && params.offset > 0) {
+        offsetExpr = ',' + params.offset;
+      }
+
+      if (params.query) {
+        return '/q/' + this.encodeURL(params.query, true) + offsetExpr;
+      }
+
+      const operators = [];
+      if (params.owner) {
+        operators.push('owner:' + this.encodeURL(params.owner, false));
+      }
+      if (params.project) {
+        operators.push('project:' + this.encodeURL(params.project, false));
+      }
+      if (params.branch) {
+        operators.push('branch:' + this.encodeURL(params.branch, false));
+      }
+      if (params.topic) {
+        operators.push('topic:"' + this.encodeURL(params.topic, false) + '"');
+      }
+      if (params.hashtag) {
+        operators.push('hashtag:"' +
+            this.encodeURL(params.hashtag.toLowerCase(), false) + '"');
+      }
+      if (params.statuses) {
+        if (params.statuses.length === 1) {
+          operators.push(
+              'status:' + this.encodeURL(params.statuses[0], false));
+        } else if (params.statuses.length > 1) {
+          operators.push(
+              '(' +
+              params.statuses.map(s => `status:${this.encodeURL(s, false)}`)
+                  .join(' OR ') +
+              ')');
+        }
+      }
+
+      return '/q/' + operators.join('+') + offsetExpr;
+    },
+
+    /**
+     * @param {!Object} params
+     * @return {string}
+     */
+    _generateChangeUrl(params) {
+      let range = this._getPatchRangeExpression(params);
+      if (range.length) { range = '/' + range; }
+      let suffix = `${range}`;
+      if (params.querystring) {
+        suffix += '?' + params.querystring;
+      } else if (params.edit) {
+        suffix += ',edit';
+      }
+      if (params.project) {
+        const encodedProject = this.encodeURL(params.project, true);
+        return `/c/${encodedProject}/+/${params.changeNum}${suffix}`;
+      } else {
+        return `/c/${params.changeNum}${suffix}`;
+      }
+    },
+
+    /**
+     * @param {!Object} params
+     * @return {string}
+     */
+    _generateDashboardUrl(params) {
+      const repoName = params.repo || params.project || null;
+      if (params.sections) {
+        // Custom dashboard.
+        const queryParams = this._sectionsToEncodedParams(params.sections,
+            repoName);
+        if (params.title) {
+          queryParams.push('title=' + encodeURIComponent(params.title));
+        }
+        const user = params.user ? params.user : '';
+        return `/dashboard/${user}?${queryParams.join('&')}`;
+      } else if (repoName) {
+        // Project dashboard.
+        const encodedRepo = this.encodeURL(repoName, true);
+        return `/p/${encodedRepo}/+/dashboard/${params.dashboard}`;
+      } else {
+        // User dashboard.
+        return `/dashboard/${params.user || 'self'}`;
+      }
+    },
+
+    /**
+     * @param {!Array<!{name: string, query: string}>} sections
+     * @param {string=} opt_repoName
+     * @return {!Array<string>}
+     */
+    _sectionsToEncodedParams(sections, opt_repoName) {
+      return sections.map(section => {
+        // If there is a repo name provided, make sure to substitute it into the
+        // ${repo} (or legacy ${project}) query tokens.
+        const query = opt_repoName ?
+            section.query.replace(REPO_TOKEN_PATTERN, opt_repoName) :
+            section.query;
+        return encodeURIComponent(section.name) + '=' +
+            encodeURIComponent(query);
+      });
+    },
+
+    /**
+     * @param {!Object} params
+     * @return {string}
+     */
+    _generateDiffOrEditUrl(params) {
+      let range = this._getPatchRangeExpression(params);
+      if (range.length) { range = '/' + range; }
+
+      let suffix = `${range}/${this.encodeURL(params.path, true)}`;
+
+      if (params.view === Gerrit.Nav.View.EDIT) { suffix += ',edit'; }
+
+      if (params.lineNum) {
+        suffix += '#';
+        if (params.leftSide) { suffix += 'b'; }
+        suffix += params.lineNum;
+      }
+
+      if (params.project) {
+        const encodedProject = this.encodeURL(params.project, true);
+        return `/c/${encodedProject}/+/${params.changeNum}${suffix}`;
+      } else {
+        return `/c/${params.changeNum}${suffix}`;
+      }
+    },
+
+    /**
+     * @param {!Object} params
+     * @return {string}
+     */
+    _generateGroupUrl(params) {
+      let url = `/admin/groups/${this.encodeURL(params.groupId + '', true)}`;
+      if (params.detail === Gerrit.Nav.GroupDetailView.MEMBERS) {
+        url += ',members';
+      } else if (params.detail === Gerrit.Nav.GroupDetailView.LOG) {
+        url += ',audit-log';
+      }
+      return url;
+    },
+
+    /**
+     * @param {!Object} params
+     * @return {string}
+     */
+    _generateRepoUrl(params) {
+      let url = `/admin/repos/${this.encodeURL(params.repoName + '', true)}`;
+      if (params.detail === Gerrit.Nav.RepoDetailView.ACCESS) {
+        url += ',access';
+      } else if (params.detail === Gerrit.Nav.RepoDetailView.BRANCHES) {
+        url += ',branches';
+      } else if (params.detail === Gerrit.Nav.RepoDetailView.TAGS) {
+        url += ',tags';
+      } else if (params.detail === Gerrit.Nav.RepoDetailView.COMMANDS) {
+        url += ',commands';
+      } else if (params.detail === Gerrit.Nav.RepoDetailView.DASHBOARDS) {
+        url += ',dashboards';
+      }
+      return url;
+    },
+
     /**
      * @param {!Object} params
      * @return {string}
@@ -303,9 +536,12 @@
 
       return this.$.restAPI.getFromProjectLookup(params.changeNum)
           .then(project => {
-            // Do nothing if the lookup request failed. This avoids an infinite
-            // loop of project lookups.
-            if (!project) { return; }
+            // Show a 404 and terminate if the lookup request failed. Attempting
+            // to redirect after failing to get the project loops infinitely.
+            if (!project) {
+              this._show404();
+              return;
+            }
 
             params.project = project;
             this._normalizePatchRangeParams(params);
@@ -329,14 +565,8 @@
 
       // Diffing a patch against itself is invalid, so if the base and revision
       // patches are equal clear the base.
-      // NOTE: while selecting numbered parents of a merge is not yet
-      // implemented, normalize parent base patches to be un-selected parents in
-      // the same way.
-      // TODO(issue 4760): Remove the isMergeParent check when PG supports
-      // diffing against numbered parents of a merge.
       if (hasBasePatchNum &&
-          (this.patchNumEquals(params.basePatchNum, params.patchNum) ||
-              this.isMergeParent(params.basePatchNum))) {
+          this.patchNumEquals(params.basePatchNum, params.patchNum)) {
         needsRedirect = true;
         params.basePatchNum = null;
       } else if (hasBasePatchNum && !hasPatchNum) {
@@ -433,6 +663,7 @@
         return;
       }
       page(pattern, this._loadUserMiddleware.bind(this), data => {
+        this.$.reporting.locationChanged(handlerName);
         const promise = opt_authRedirect ?
           this._redirectIfNotLoggedIn(data) : Promise.resolve();
         promise.then(() => { this[handlerName](data); });
@@ -445,15 +676,33 @@
         page.base(base);
       }
 
-      const reporting = getReporting();
+      Gerrit.Nav.setup(
+          url => { page.show(url); },
+          this._generateUrl.bind(this),
+          params => this._generateWeblinks(params),
+          x => x
+      );
 
-      Gerrit.Nav.setup(url => { page.show(url); },
-          this._generateUrl.bind(this));
+      page.exit('*', (ctx, next) => {
+        if (!this._isRedirecting) {
+          this.$.reporting.beforeLocationChanged();
+        }
+        this._isRedirecting = false;
+        next();
+      });
 
       // Middleware
       page((ctx, next) => {
         document.body.scrollTop = 0;
 
+        if (ctx.hash.match(RoutePattern.PLUGIN_SCREEN)) {
+          // Redirect all urls using hash #/x/plugin/screen to /x/plugin/screen
+          // This is needed to allow plugins to add basic #/x/ screen links to
+          // any location.
+          this._redirect(ctx.hash);
+          return;
+        }
+
         // Fire asynchronously so that the URL is changed by the time the event
         // is processed.
         this.async(() => {
@@ -461,7 +710,6 @@
             hash: window.location.hash,
             pathname: window.location.pathname,
           });
-          reporting.locationChanged();
         }, 1);
         next();
       });
@@ -470,6 +718,12 @@
 
       this._mapRoute(RoutePattern.DASHBOARD, '_handleDashboardRoute');
 
+      this._mapRoute(RoutePattern.CUSTOM_DASHBOARD,
+          '_handleCustomDashboardRoute');
+
+      this._mapRoute(RoutePattern.PROJECT_DASHBOARD,
+          '_handleProjectDashboardRoute');
+
       this._mapRoute(RoutePattern.GROUP_INFO, '_handleGroupInfoRoute', true);
 
       this._mapRoute(RoutePattern.GROUP_AUDIT_LOG, '_handleGroupAuditLogRoute',
@@ -489,11 +743,17 @@
 
       this._mapRoute(RoutePattern.GROUP, '_handleGroupRoute', true);
 
-      this._mapRoute(RoutePattern.PROJECT_COMMANDS,
-          '_handleProjectCommandsRoute', true);
+      this._mapRoute(RoutePattern.PROJECT_OLD,
+          '_handleProjectsOldRoute');
 
-      this._mapRoute(RoutePattern.PROJECT_ACCESS,
-          '_handleProjectAccessRoute');
+      this._mapRoute(RoutePattern.REPO_COMMANDS,
+          '_handleRepoCommandsRoute', true);
+
+      this._mapRoute(RoutePattern.REPO_ACCESS,
+          '_handleRepoAccessRoute');
+
+      this._mapRoute(RoutePattern.REPO_DASHBOARDS,
+          '_handleRepoDashboardsRoute');
 
       this._mapRoute(RoutePattern.BRANCH_LIST_OFFSET,
           '_handleBranchListOffsetRoute');
@@ -519,16 +779,16 @@
       this._mapRoute(RoutePattern.LEGACY_CREATE_PROJECT,
           '_handleCreateProjectRoute', true);
 
-      this._mapRoute(RoutePattern.PROJECT_LIST_OFFSET,
-          '_handleProjectListOffsetRoute');
+      this._mapRoute(RoutePattern.REPO_LIST_OFFSET,
+          '_handleRepoListOffsetRoute');
 
-      this._mapRoute(RoutePattern.PROJECT_LIST_FILTER_OFFSET,
-          '_handleProjectListFilterOffsetRoute');
+      this._mapRoute(RoutePattern.REPO_LIST_FILTER_OFFSET,
+          '_handleRepoListFilterOffsetRoute');
 
-      this._mapRoute(RoutePattern.PROJECT_LIST_FILTER,
-          '_handleProjectListFilterRoute');
+      this._mapRoute(RoutePattern.REPO_LIST_FILTER,
+          '_handleRepoListFilterRoute');
 
-      this._mapRoute(RoutePattern.PROJECT, '_handleProjectRoute');
+      this._mapRoute(RoutePattern.REPO, '_handleRepoRoute');
 
       this._mapRoute(RoutePattern.PLUGINS, '_handlePassThroughRoute');
 
@@ -546,9 +806,6 @@
       this._mapRoute(RoutePattern.QUERY_LEGACY_SUFFIX,
           '_handleQueryLegacySuffixRoute');
 
-      this._mapRoute(RoutePattern.ADMIN_PLACEHOLDER,
-          '_handleAdminPlaceholderRoute', true);
-
       this._mapRoute(RoutePattern.QUERY, '_handleQueryRoute');
 
       this._mapRoute(RoutePattern.DIFF_LEGACY_LINENUM, '_handleLegacyLinenum');
@@ -558,7 +815,11 @@
 
       this._mapRoute(RoutePattern.DIFF_EDIT, '_handleDiffEditRoute', true);
 
-      this._mapRoute(RoutePattern.CHANGE_OR_DIFF, '_handleChangeOrDiffRoute');
+      this._mapRoute(RoutePattern.CHANGE_EDIT, '_handleChangeEditRoute', true);
+
+      this._mapRoute(RoutePattern.DIFF, '_handleDiffRoute');
+
+      this._mapRoute(RoutePattern.CHANGE, '_handleChangeRoute');
 
       this._mapRoute(RoutePattern.CHANGE_LEGACY, '_handleChangeLegacyRoute');
 
@@ -566,6 +827,9 @@
 
       this._mapRoute(RoutePattern.AGREEMENTS, '_handleAgreementsRoute', true);
 
+      this._mapRoute(RoutePattern.NEW_AGREEMENTS, '_handleNewAgreementsRoute',
+          true);
+
       this._mapRoute(RoutePattern.SETTINGS_LEGACY,
           '_handleSettingsLegacyRoute', true);
 
@@ -578,6 +842,19 @@
       this._mapRoute(RoutePattern.IMPROPERLY_ENCODED_PLUS,
           '_handleImproperlyEncodedPlusRoute');
 
+      this._mapRoute(RoutePattern.PLUGIN_SCREEN, '_handlePluginScreen');
+
+      this._mapRoute(RoutePattern.DOCUMENTATION_SEARCH_FILTER,
+          '_handleDocumentationSearchRoute');
+
+      // redirects /Documentation/q/* to /Documentation/q/filter:*
+      this._mapRoute(RoutePattern.DOCUMENTATION_SEARCH,
+          '_handleDocumentationSearchRedirectRoute');
+
+      // Makes sure /Documentation/* links work (doin't return 404)
+      this._mapRoute(RoutePattern.DOCUMENTATION,
+          '_handleDocumentationRedirectRoute');
+
       // Note: this route should appear last so it only catches URLs unmatched
       // by other patterns.
       this._mapRoute(RoutePattern.DEFAULT, '_handleDefaultRoute');
@@ -626,19 +903,63 @@
       });
     },
 
-    _handleDashboardRoute(data) {
-      if (!data.params[0]) {
-        this._redirect('/dashboard/self');
-        return;
-      }
+    /**
+     * Decode an application/x-www-form-urlencoded string.
+     *
+     * @param {string} qs The application/x-www-form-urlencoded string.
+     * @return {string} The decoded string.
+     */
+    _decodeQueryString(qs) {
+      return decodeURIComponent(qs.replace(PLUS_PATTERN, ' '));
+    },
 
+    /**
+     * Parse a query string (e.g. window.location.search) into an array of
+     * name/value pairs.
+     *
+     * @param {string} qs The application/x-www-form-urlencoded query string.
+     * @return {!Array<!Array<string>>} An array of name/value pairs, where each
+     *     element is a 2-element array.
+     */
+    _parseQueryString(qs) {
+      qs = qs.replace(QUESTION_PATTERN, '');
+      if (!qs) {
+        return [];
+      }
+      const params = [];
+      qs.split('&').forEach(param => {
+        const idx = param.indexOf('=');
+        let name;
+        let value;
+        if (idx < 0) {
+          name = this._decodeQueryString(param);
+          value = '';
+        } else {
+          name = this._decodeQueryString(param.substring(0, idx));
+          value = this._decodeQueryString(param.substring(idx + 1));
+        }
+        if (name) {
+          params.push([name, value]);
+        }
+      });
+      return params;
+    },
+
+    /**
+     * Handle dashboard routes. These may be user, or project dashboards.
+     *
+     * @param {!Object} data The parsed route data.
+     */
+    _handleDashboardRoute(data) {
+      // User dashboard. We require viewing user to be logged in, else we
+      // redirect to login for self dashboard or simple owner search for
+      // other user dashboard.
       return this.$.restAPI.getLoggedIn().then(loggedIn => {
         if (!loggedIn) {
           if (data.params[0].toLowerCase() === 'self') {
             this._redirectToLogin(data.canonicalPath);
           } else {
-            // TODO: encode user or use _generateUrl.
-            this._redirect('/q/owner:' + data.params[0]);
+            this._redirect('/q/owner:' + encodeURIComponent(data.params[0]));
           }
         } else {
           this._setParams({
@@ -649,24 +970,89 @@
       });
     },
 
+    /**
+     * Handle custom dashboard routes.
+     *
+     * @param {!Object} data The parsed route data.
+     * @param {string=} opt_qs Optional query string associated with the route.
+     *     If not given, window.location.search is used. (Used by tests).
+     */
+    _handleCustomDashboardRoute(data, opt_qs) {
+      // opt_qs may be provided by a test, and it may have a falsy value
+      const qs = opt_qs !== undefined ? opt_qs : window.location.search;
+      const queryParams = this._parseQueryString(qs);
+      let title = 'Custom Dashboard';
+      const titleParam = queryParams.find(
+          elem => elem[0].toLowerCase() === 'title');
+      if (titleParam) {
+        title = titleParam[1];
+      }
+      // Dashboards support a foreach param which adds a base query to any
+      // additional query.
+      const forEachParam = queryParams.find(
+          elem => elem[0].toLowerCase() === 'foreach');
+      let forEachQuery = null;
+      if (forEachParam) {
+        forEachQuery = forEachParam[1];
+      }
+      const sectionParams = queryParams.filter(
+          elem => elem[0] && elem[1] && elem[0].toLowerCase() !== 'title'
+          && elem[0].toLowerCase() !== 'foreach');
+      const sections = sectionParams.map(elem => {
+        const query = forEachQuery ? `${forEachQuery} ${elem[1]}` : elem[1];
+        return {
+          name: elem[0],
+          query,
+        };
+      });
+
+      if (sections.length > 0) {
+        // Custom dashboard view.
+        this._setParams({
+          view: Gerrit.Nav.View.DASHBOARD,
+          user: 'self',
+          sections,
+          title,
+        });
+        return Promise.resolve();
+      }
+
+      // Redirect /dashboard/ -> /dashboard/self.
+      this._redirect('/dashboard/self');
+      return Promise.resolve();
+    },
+
+    _handleProjectDashboardRoute(data) {
+      this._setParams({
+        view: Gerrit.Nav.View.DASHBOARD,
+        project: data.params[0],
+        dashboard: decodeURIComponent(data.params[1]),
+      });
+    },
+
     _handleGroupInfoRoute(data) {
       this._redirect('/admin/groups/' + encodeURIComponent(data.params[0]));
     },
 
+    _handleGroupRoute(data) {
+      this._setParams({
+        view: Gerrit.Nav.View.GROUP,
+        groupId: data.params[0],
+      });
+    },
+
     _handleGroupAuditLogRoute(data) {
       this._setParams({
-        view: Gerrit.Nav.View.ADMIN,
-        adminView: 'gr-group-audit-log',
-        detailType: 'audit-log',
+        view: Gerrit.Nav.View.GROUP,
+        detail: Gerrit.Nav.GroupDetailView.LOG,
         groupId: data.params[0],
       });
     },
 
     _handleGroupMembersRoute(data) {
       this._setParams({
-        view: Gerrit.Nav.View.ADMIN,
-        adminView: 'gr-group-members',
-        detailType: 'members',
+        view: Gerrit.Nav.View.GROUP,
+        detail: Gerrit.Nav.GroupDetailView.MEMBERS,
         groupId: data.params[0],
       });
     },
@@ -698,38 +1084,43 @@
       });
     },
 
-    _handleGroupRoute(data) {
+    _handleProjectsOldRoute(data) {
+      if (data.params[1]) {
+        this._redirect('/admin/repos/' + encodeURIComponent(data.params[1]));
+      } else {
+        this._redirect('/admin/repos');
+      }
+    },
+
+    _handleRepoCommandsRoute(data) {
       this._setParams({
-        view: Gerrit.Nav.View.ADMIN,
-        adminView: 'gr-group',
-        groupId: data.params[0],
+        view: Gerrit.Nav.View.REPO,
+        detail: Gerrit.Nav.RepoDetailView.COMMANDS,
+        repo: data.params[0],
       });
     },
 
-    _handleProjectCommandsRoute(data) {
+    _handleRepoAccessRoute(data) {
       this._setParams({
-        view: Gerrit.Nav.View.ADMIN,
-        adminView: 'gr-project-commands',
-        detailType: 'commands',
-        project: data.params[0],
+        view: Gerrit.Nav.View.REPO,
+        detail: Gerrit.Nav.RepoDetailView.ACCESS,
+        repo: data.params[0],
       });
     },
 
-    _handleProjectAccessRoute(data) {
+    _handleRepoDashboardsRoute(data) {
       this._setParams({
-        view: Gerrit.Nav.View.ADMIN,
-        adminView: 'gr-project-access',
-        detailType: 'access',
-        project: data.params[0],
+        view: Gerrit.Nav.View.REPO,
+        detail: Gerrit.Nav.RepoDetailView.DASHBOARDS,
+        repo: data.params[0],
       });
     },
 
     _handleBranchListOffsetRoute(data) {
       this._setParams({
-        view: Gerrit.Nav.View.ADMIN,
-        adminView: 'gr-project-detail-list',
-        detailType: 'branches',
-        project: data.params[0],
+        view: Gerrit.Nav.View.REPO,
+        detail: Gerrit.Nav.RepoDetailView.BRANCHES,
+        repo: data.params[0],
         offset: data.params[2] || 0,
         filter: null,
       });
@@ -737,10 +1128,9 @@
 
     _handleBranchListFilterOffsetRoute(data) {
       this._setParams({
-        view: Gerrit.Nav.View.ADMIN,
-        adminView: 'gr-project-detail-list',
-        detailType: 'branches',
-        project: data.params.project,
+        view: Gerrit.Nav.View.REPO,
+        detail: Gerrit.Nav.RepoDetailView.BRANCHES,
+        repo: data.params.repo,
         offset: data.params.offset,
         filter: data.params.filter,
       });
@@ -748,20 +1138,18 @@
 
     _handleBranchListFilterRoute(data) {
       this._setParams({
-        view: Gerrit.Nav.View.ADMIN,
-        adminView: 'gr-project-detail-list',
-        detailType: 'branches',
-        project: data.params.project,
+        view: Gerrit.Nav.View.REPO,
+        detail: Gerrit.Nav.RepoDetailView.BRANCHES,
+        repo: data.params.repo,
         filter: data.params.filter || null,
       });
     },
 
     _handleTagListOffsetRoute(data) {
       this._setParams({
-        view: Gerrit.Nav.View.ADMIN,
-        adminView: 'gr-project-detail-list',
-        detailType: 'tags',
-        project: data.params[0],
+        view: Gerrit.Nav.View.REPO,
+        detail: Gerrit.Nav.RepoDetailView.TAGS,
+        repo: data.params[0],
         offset: data.params[2] || 0,
         filter: null,
       });
@@ -769,10 +1157,9 @@
 
     _handleTagListFilterOffsetRoute(data) {
       this._setParams({
-        view: Gerrit.Nav.View.ADMIN,
-        adminView: 'gr-project-detail-list',
-        detailType: 'tags',
-        project: data.params.project,
+        view: Gerrit.Nav.View.REPO,
+        detail: Gerrit.Nav.RepoDetailView.TAGS,
+        repo: data.params.repo,
         offset: data.params.offset,
         filter: data.params.filter,
       });
@@ -780,37 +1167,36 @@
 
     _handleTagListFilterRoute(data) {
       this._setParams({
-        view: Gerrit.Nav.View.ADMIN,
-        adminView: 'gr-project-detail-list',
-        detailType: 'tags',
-        project: data.params.project,
+        view: Gerrit.Nav.View.REPO,
+        detail: Gerrit.Nav.RepoDetailView.TAGS,
+        repo: data.params.repo,
         filter: data.params.filter || null,
       });
     },
 
-    _handleProjectListOffsetRoute(data) {
+    _handleRepoListOffsetRoute(data) {
       this._setParams({
         view: Gerrit.Nav.View.ADMIN,
-        adminView: 'gr-project-list',
+        adminView: 'gr-repo-list',
         offset: data.params[1] || 0,
         filter: null,
         openCreateModal: data.hash === 'create',
       });
     },
 
-    _handleProjectListFilterOffsetRoute(data) {
+    _handleRepoListFilterOffsetRoute(data) {
       this._setParams({
         view: Gerrit.Nav.View.ADMIN,
-        adminView: 'gr-project-list',
+        adminView: 'gr-repo-list',
         offset: data.params.offset,
         filter: data.params.filter,
       });
     },
 
-    _handleProjectListFilterRoute(data) {
+    _handleRepoListFilterRoute(data) {
       this._setParams({
         view: Gerrit.Nav.View.ADMIN,
-        adminView: 'gr-project-list',
+        adminView: 'gr-repo-list',
         filter: data.params.filter || null,
       });
     },
@@ -827,11 +1213,10 @@
       this._redirect('/admin/groups#create');
     },
 
-    _handleProjectRoute(data) {
+    _handleRepoRoute(data) {
       this._setParams({
-        view: Gerrit.Nav.View.ADMIN,
-        project: data.params[0],
-        adminView: 'gr-project',
+        view: Gerrit.Nav.View.REPO,
+        repo: data.params[0],
       });
     },
 
@@ -868,12 +1253,6 @@
       });
     },
 
-    _handleAdminPlaceholderRoute(data) {
-      data.params.view = Gerrit.Nav.View.ADMIN;
-      data.params.placeholder = true;
-      this._setParams(data.params);
-    },
-
     _handleQueryRoute(data) {
       this._setParams({
         view: Gerrit.Nav.View.SEARCH,
@@ -890,9 +1269,20 @@
       this._redirect('/c/' + encodeURIComponent(ctx.params[0]));
     },
 
-    _handleChangeOrDiffRoute(ctx) {
-      const isDiffView = ctx.params[8];
+    _handleChangeRoute(ctx) {
+      // Parameter order is based on the regex group number matched.
+      const params = {
+        project: ctx.params[0],
+        changeNum: ctx.params[1],
+        basePatchNum: ctx.params[4],
+        patchNum: ctx.params[6],
+        view: Gerrit.Nav.View.CHANGE,
+      };
 
+      this._redirectOrNavigate(params);
+    },
+
+    _handleDiffRoute(ctx) {
       // Parameter order is based on the regex group number matched.
       const params = {
         project: ctx.params[0],
@@ -900,15 +1290,13 @@
         basePatchNum: ctx.params[4],
         patchNum: ctx.params[6],
         path: ctx.params[8],
-        view: isDiffView ? Gerrit.Nav.View.DIFF : Gerrit.Nav.View.CHANGE,
+        view: Gerrit.Nav.View.DIFF,
       };
 
-      if (isDiffView) {
-        const address = this._parseLineAddress(ctx.hash);
-        if (address) {
-          params.leftSide = address.leftSide;
-          params.lineNum = address.lineNum;
-        }
+      const address = this._parseLineAddress(ctx.hash);
+      if (address) {
+        params.leftSide = address.leftSide;
+        params.lineNum = address.lineNum;
       }
 
       this._redirectOrNavigate(params);
@@ -921,6 +1309,7 @@
         basePatchNum: ctx.params[3],
         patchNum: ctx.params[5],
         view: Gerrit.Nav.View.CHANGE,
+        querystring: ctx.querystring,
       };
 
       this._normalizeLegacyRouteParams(params);
@@ -954,11 +1343,23 @@
       this._redirectOrNavigate({
         project: ctx.params[0],
         changeNum: ctx.params[1],
-        path: ctx.params[2],
+        patchNum: ctx.params[2],
+        path: ctx.params[3],
         view: Gerrit.Nav.View.EDIT,
       });
     },
 
+    _handleChangeEditRoute(ctx) {
+      // Parameter order is based on the regex group number matched.
+      this._redirectOrNavigate({
+        project: ctx.params[0],
+        changeNum: ctx.params[1],
+        patchNum: ctx.params[3],
+        view: Gerrit.Nav.View.CHANGE,
+        edit: true,
+      });
+    },
+
     /**
      * Normalize the patch range params for a the change or diff view and
      * redirect if URL upgrade is needed.
@@ -969,12 +1370,16 @@
         this._redirect(this._generateUrl(params));
       } else {
         this._setParams(params);
-        this.$.restAPI.setInProjectLookup(params.changeNum,
-            params.project);
       }
     },
 
+    // TODO fix this so it properly redirects
+    // to /settings#Agreements (Scrolls down)
     _handleAgreementsRoute(data) {
+      this._redirect('/settings/#Agreements');
+    },
+
+    _handleNewAgreementsRoute(data) {
       data.params.view = Gerrit.Nav.View.AGREEMENTS;
       this._setParams(data.params);
     },
@@ -1020,10 +1425,42 @@
       this._redirect(`/c/${ctx.params[0]}/+/${ctx.params[1]}${hash}`);
     },
 
+    _handlePluginScreen(ctx) {
+      const view = Gerrit.Nav.View.PLUGIN_SCREEN;
+      const plugin = ctx.params[0];
+      const screen = ctx.params[1];
+      this._setParams({view, plugin, screen});
+    },
+
+    _handleDocumentationSearchRoute(data) {
+      this._setParams({
+        view: Gerrit.Nav.View.DOCUMENTATION_SEARCH,
+        filter: data.params.filter || null,
+      });
+    },
+
+    _handleDocumentationSearchRedirectRoute(data) {
+      this._redirect('/Documentation/q/filter:' +
+          encodeURIComponent(data.params[0]));
+    },
+
+    _handleDocumentationRedirectRoute(data) {
+      if (data.params[1]) {
+        location.reload();
+      } else {
+        // Redirect /Documentation to /Documentation/index.html
+        this._redirect('/Documentation/index.html');
+      }
+    },
+
     /**
      * Catchall route for when no other route is matched.
      */
     _handleDefaultRoute() {
+      this._show404();
+    },
+
+    _show404() {
       // Note: the app's 404 display is tightly-coupled with catching 404
       // network responses, so we simulate a 404 response status to display it.
       // TODO: Decouple the gr-app error view from network responses.
diff --git a/polygerrit-ui/app/elements/core/gr-router/gr-router_test.html b/polygerrit-ui/app/elements/core/gr-router/gr-router_test.html
index 8186fde..7a92402 100644
--- a/polygerrit-ui/app/elements/core/gr-router/gr-router_test.html
+++ b/polygerrit-ui/app/elements/core/gr-router/gr-router_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -43,6 +44,49 @@
 
     teardown(() => { sandbox.restore(); });
 
+    test('_firstCodeBrowserWeblink', () => {
+      assert.deepEqual(element._firstCodeBrowserWeblink([
+        {name: 'gitweb'},
+        {name: 'gitiles'},
+        {name: 'browse'},
+        {name: 'test'}]), {name: 'gitiles'});
+
+      assert.deepEqual(element._firstCodeBrowserWeblink([
+        {name: 'gitweb'},
+        {name: 'test'}]), {name: 'gitweb'});
+    });
+
+    test('_getBrowseCommitWeblink', () => {
+      const browserLink = {name: 'browser', url: 'browser/url'};
+      const link = {name: 'test', url: 'test/url'};
+      const weblinks = [browserLink, link];
+      const config = {gerrit: {primary_weblink_name: browserLink.name}};
+      sandbox.stub(element, '_firstCodeBrowserWeblink').returns(link);
+
+      assert.deepEqual(element._getBrowseCommitWeblink(weblinks, config),
+          browserLink);
+
+      assert.deepEqual(element._getBrowseCommitWeblink(weblinks, {}), link);
+    });
+
+    test('_getChangeWeblinks', () => {
+      const link = {name: 'test', url: 'test/url'};
+      const browserLink = {name: 'browser', url: 'browser/url'};
+      const mapLinksToConfig = weblinks => ({options: {weblinks}});
+      sandbox.stub(element, '_getBrowseCommitWeblink').returns(browserLink);
+
+      assert.deepEqual(
+          element._getChangeWeblinks(mapLinksToConfig([link, browserLink]))[0],
+          {name: 'test', url: 'test/url'});
+
+      assert.deepEqual(element._getChangeWeblinks(mapLinksToConfig([link]))[0],
+          {name: 'test', url: 'test/url'});
+
+      link.url = 'https://' + link.url;
+      assert.deepEqual(element._getChangeWeblinks(mapLinksToConfig([link]))[0],
+          {name: 'test', url: 'https://test/url'});
+    });
+
     test('_getHashFromCanonicalPath', () => {
       let url = '/foo/bar';
       let hash = element._getHashFromCanonicalPath(url);
@@ -123,8 +167,8 @@
       actualDoesNotRequireAuth.sort();
 
       const shouldRequireAutoAuth = [
-        '_handleAdminPlaceholderRoute',
         '_handleAgreementsRoute',
+        '_handleChangeEditRoute',
         '_handleCreateGroupRoute',
         '_handleCreateProjectRoute',
         '_handleDiffEditRoute',
@@ -135,11 +179,12 @@
         '_handleGroupListOffsetRoute',
         '_handleGroupMembersRoute',
         '_handleGroupRoute',
+        '_handleNewAgreementsRoute',
         '_handlePluginListFilterOffsetRoute',
         '_handlePluginListFilterRoute',
         '_handlePluginListOffsetRoute',
         '_handlePluginListRoute',
-        '_handleProjectCommandsRoute',
+        '_handleRepoCommandsRoute',
         '_handleSettingsLegacyRoute',
         '_handleSettingsRoute',
       ];
@@ -150,37 +195,45 @@
         '_handleBranchListFilterRoute',
         '_handleBranchListOffsetRoute',
         '_handleChangeNumberLegacyRoute',
-        '_handleChangeOrDiffRoute',
+        '_handleChangeRoute',
+        '_handleDiffRoute',
         '_handleDefaultRoute',
         '_handleChangeLegacyRoute',
         '_handleDiffLegacyRoute',
+        '_handleDocumentationRedirectRoute',
+        '_handleDocumentationSearchRoute',
+        '_handleDocumentationSearchRedirectRoute',
         '_handleLegacyLinenum',
         '_handleImproperlyEncodedPlusRoute',
         '_handlePassThroughRoute',
-        '_handleProjectAccessRoute',
-        '_handleProjectListFilterOffsetRoute',
-        '_handleProjectListFilterRoute',
-        '_handleProjectListOffsetRoute',
-        '_handleProjectRoute',
+        '_handleProjectDashboardRoute',
+        '_handleProjectsOldRoute',
+        '_handleRepoAccessRoute',
+        '_handleRepoDashboardsRoute',
+        '_handleRepoListFilterOffsetRoute',
+        '_handleRepoListFilterRoute',
+        '_handleRepoListOffsetRoute',
+        '_handleRepoRoute',
         '_handleQueryLegacySuffixRoute',
         '_handleQueryRoute',
         '_handleRegisterRoute',
         '_handleTagListFilterOffsetRoute',
         '_handleTagListFilterRoute',
         '_handleTagListOffsetRoute',
+        '_handlePluginScreen',
       ];
 
       // Handler names that check authentication themselves, and thus don't need
       // it performed for them.
       const selfAuthenticatingHandlers = [
         '_handleDashboardRoute',
+        '_handleCustomDashboardRoute',
         '_handleRootRoute',
       ];
 
       const shouldNotRequireAuth = unauthenticatedHandlers
           .concat(selfAuthenticatingHandlers);
       shouldNotRequireAuth.sort();
-
       assert.deepEqual(actualDoesNotRequireAuth, shouldNotRequireAuth);
     });
 
@@ -225,6 +278,19 @@
             '/q/owner:a%2525b+project:c%2525d+branch:e%2525f+' +
             'topic:"g%2525h"+status:op%2525en');
 
+        params.offset = 100;
+        assert.equal(element._generateUrl(params),
+            '/q/owner:a%2525b+project:c%2525d+branch:e%2525f+' +
+            'topic:"g%2525h"+status:op%2525en,100');
+        delete params.offset;
+
+        // The presence of the query param overrides other params.
+        params.query = 'foo$bar';
+        assert.equal(element._generateUrl(params), '/q/foo%2524bar');
+
+        params.offset = 100;
+        assert.equal(element._generateUrl(params), '/q/foo%2524bar,100');
+
         params = {
           view: Gerrit.Nav.View.SEARCH,
           statuses: ['a', 'b', 'c'],
@@ -239,13 +305,38 @@
           changeNum: '1234',
           project: 'test',
         };
+        const paramsWithQuery = {
+          view: Gerrit.Nav.View.CHANGE,
+          changeNum: '1234',
+          project: 'test',
+          querystring: 'revert&foo=bar',
+        };
+
         assert.equal(element._generateUrl(params), '/c/test/+/1234');
+        assert.equal(element._generateUrl(paramsWithQuery),
+            '/c/test/+/1234?revert&foo=bar');
 
         params.patchNum = 10;
         assert.equal(element._generateUrl(params), '/c/test/+/1234/10');
+        paramsWithQuery.patchNum = 10;
+        assert.equal(element._generateUrl(paramsWithQuery),
+            '/c/test/+/1234/10?revert&foo=bar');
 
         params.basePatchNum = 5;
         assert.equal(element._generateUrl(params), '/c/test/+/1234/5..10');
+        paramsWithQuery.basePatchNum = 5;
+        assert.equal(element._generateUrl(paramsWithQuery),
+            '/c/test/+/1234/5..10?revert&foo=bar');
+      });
+
+      test('change with repo name encoding', () => {
+        const params = {
+          view: Gerrit.Nav.View.CHANGE,
+          changeNum: '1234',
+          project: 'x+/y+/z+/w',
+        };
+        assert.equal(element._generateUrl(params),
+            '/c/x%252B/y%252B/z%252B/w/+/1234');
       });
 
       test('diff', () => {
@@ -282,6 +373,29 @@
             '/c/test/+/42/2/file.cpp#b123');
       });
 
+      test('diff with repo name encoding', () => {
+        const params = {
+          view: Gerrit.Nav.View.DIFF,
+          changeNum: '42',
+          path: 'x+y/path.cpp',
+          patchNum: 12,
+          project: 'x+/y',
+        };
+        assert.equal(element._generateUrl(params),
+            '/c/x%252B/y/+/42/12/x%252By/path.cpp');
+      });
+
+      test('edit', () => {
+        const params = {
+          view: Gerrit.Nav.View.EDIT,
+          changeNum: '42',
+          project: 'test',
+          path: 'x+y/path.cpp',
+        };
+        assert.equal(element._generateUrl(params),
+            '/c/test/+/42/x%252By/path.cpp,edit');
+      });
+
       test('_getPatchRangeExpression', () => {
         const params = {};
         let actual = element._getPatchRangeExpression(params);
@@ -299,6 +413,115 @@
         actual = element._getPatchRangeExpression(params);
         assert.equal(actual, '2..');
       });
+
+      suite('dashboard', () => {
+        test('self dashboard', () => {
+          const params = {
+            view: Gerrit.Nav.View.DASHBOARD,
+          };
+          assert.equal(element._generateUrl(params), '/dashboard/self');
+        });
+
+        test('user dashboard', () => {
+          const params = {
+            view: Gerrit.Nav.View.DASHBOARD,
+            user: 'user',
+          };
+          assert.equal(element._generateUrl(params), '/dashboard/user');
+        });
+
+        test('custom self dashboard, no title', () => {
+          const params = {
+            view: Gerrit.Nav.View.DASHBOARD,
+            sections: [
+              {name: 'section 1', query: 'query 1'},
+              {name: 'section 2', query: 'query 2'},
+            ],
+          };
+          assert.equal(
+              element._generateUrl(params),
+              '/dashboard/?section%201=query%201&section%202=query%202');
+        });
+
+        test('custom repo dashboard', () => {
+          const params = {
+            view: Gerrit.Nav.View.DASHBOARD,
+            sections: [
+              {name: 'section 1', query: 'query 1 ${project}'},
+              {name: 'section 2', query: 'query 2 ${repo}'},
+            ],
+            repo: 'repo-name',
+          };
+          assert.equal(
+              element._generateUrl(params),
+              '/dashboard/?section%201=query%201%20repo-name&' +
+              'section%202=query%202%20repo-name');
+        });
+
+        test('custom user dashboard, with title', () => {
+          const params = {
+            view: Gerrit.Nav.View.DASHBOARD,
+            user: 'user',
+            sections: [{name: 'name', query: 'query'}],
+            title: 'custom dashboard',
+          };
+          assert.equal(
+              element._generateUrl(params),
+              '/dashboard/user?name=query&title=custom%20dashboard');
+        });
+
+        test('repo dashboard', () => {
+          const params = {
+            view: Gerrit.Nav.View.DASHBOARD,
+            repo: 'gerrit/repo',
+            dashboard: 'default:main',
+          };
+          assert.equal(
+              element._generateUrl(params),
+              '/p/gerrit/repo/+/dashboard/default:main');
+        });
+
+        test('project dashboard (legacy)', () => {
+          const params = {
+            view: Gerrit.Nav.View.DASHBOARD,
+            project: 'gerrit/project',
+            dashboard: 'default:main',
+          };
+          assert.equal(
+              element._generateUrl(params),
+              '/p/gerrit/project/+/dashboard/default:main');
+        });
+      });
+
+      suite('groups', () => {
+        test('group info', () => {
+          const params = {
+            view: Gerrit.Nav.View.GROUP,
+            groupId: 1234,
+          };
+          assert.equal(element._generateUrl(params), '/admin/groups/1234');
+        });
+
+        test('group members', () => {
+          const params = {
+            view: Gerrit.Nav.View.GROUP,
+            groupId: 1234,
+            detail: 'members',
+          };
+          assert.equal(element._generateUrl(params),
+              '/admin/groups/1234,members');
+        });
+
+        test('group audit log', () => {
+          const params = {
+            view: Gerrit.Nav.View.GROUP,
+            groupId: 1234,
+            detail: 'log',
+          };
+          assert.equal(element._generateUrl(params),
+              '/admin/groups/1234,audit-log');
+        });
+      });
     });
 
     suite('param normalization', () => {
@@ -313,11 +536,13 @@
       suite('_normalizeLegacyRouteParams', () => {
         let rangeStub;
         let redirectStub;
+        let show404Stub;
 
         setup(() => {
           rangeStub = sandbox.stub(element, '_normalizePatchRangeParams')
               .returns(Promise.resolve());
           redirectStub = sandbox.stub(element, '_redirect');
+          show404Stub = sandbox.stub(element, '_show404');
         });
 
         test('w/o changeNum', () => {
@@ -328,6 +553,7 @@
             assert.isFalse(rangeStub.called);
             assert.isNotOk(params.project);
             assert.isFalse(redirectStub.called);
+            assert.isFalse(show404Stub.called);
           });
         });
 
@@ -339,18 +565,19 @@
             assert.isTrue(rangeStub.called);
             assert.equal(params.project, 'foo/bar');
             assert.isTrue(redirectStub.calledOnce);
+            assert.isFalse(show404Stub.called);
           });
         });
 
         test('halts on project lookup failure', () => {
           projectLookupStub.returns(Promise.resolve(undefined));
-
           const params = {changeNum: 1234};
           return element._normalizeLegacyRouteParams(params).then(() => {
             assert.isTrue(projectLookupStub.called);
             assert.isFalse(rangeStub.called);
             assert.isUndefined(params.project);
             assert.isFalse(redirectStub.called);
+            assert.isTrue(show404Stub.calledOnce);
           });
         });
       });
@@ -395,16 +622,6 @@
           assert.isNotOk(params.basePatchNum);
           assert.equal(params.patchNum, 'edit');
         });
-
-        // TODO(issue 4760): Remove when PG supports diffing against numbered
-        // parents of a merge.
-        test('range -n..m normalizes to m', () => {
-          const params = {basePatchNum: -2, patchNum: 4};
-          const needsRedirect = element._normalizePatchRangeParams(params);
-          assert.isTrue(needsRedirect);
-          assert.isNotOk(params.basePatchNum);
-          assert.equal(params.patchNum, 4);
-        });
       });
     });
 
@@ -425,15 +642,15 @@
         setParamsStub = sandbox.stub(element, '_setParams');
       });
 
-      test('_handleAdminPlaceholderRoute', () => {
-        element._handleAdminPlaceholderRoute({params: {}});
-        assert.equal(setParamsStub.lastCall.args[0].view,
-            Gerrit.Nav.View.ADMIN);
-        assert.isTrue(setParamsStub.lastCall.args[0].placeholder);
+      test('_handleAgreementsRoute', () => {
+        const data = {params: {}};
+        element._handleAgreementsRoute(data);
+        assert.isTrue(redirectStub.calledOnce);
+        assert.equal(redirectStub.lastCall.args[0], '/settings/#Agreements');
       });
 
-      test('_handleAgreementsRoute', () => {
-        element._handleAgreementsRoute({params: {}});
+      test('_handleNewAgreementsRoute', () => {
+        element._handleNewAgreementsRoute({params: {}});
         assert.isTrue(setParamsStub.calledOnce);
         assert.equal(setParamsStub.lastCall.args[0].view,
             Gerrit.Nav.View.AGREEMENTS);
@@ -480,6 +697,22 @@
             '/c/test/+/42#foo');
       });
 
+      test('_handleQueryRoute', () => {
+        const data = {params: ['project:foo/bar/baz']};
+        assertDataToParams(data, '_handleQueryRoute', {
+          view: Gerrit.Nav.View.SEARCH,
+          query: 'project:foo/bar/baz',
+          offset: undefined,
+        });
+
+        data.params.push(',123', '123');
+        assertDataToParams(data, '_handleQueryRoute', {
+          view: Gerrit.Nav.View.SEARCH,
+          query: 'project:foo/bar/baz',
+          offset: '123',
+        });
+      });
+
       test('_handleQueryLegacySuffixRoute', () => {
         element._handleQueryLegacySuffixRoute({path: '/q/foo+bar,n,z'});
         assert.isTrue(redirectStub.calledOnce);
@@ -538,7 +771,7 @@
           assert.isFalse(redirectStub.called);
         });
 
-        test('redirects to dahsboard if logged in', () => {
+        test('redirects to dashboard if logged in', () => {
           sandbox.stub(element.$.restAPI, 'getLoggedIn')
               .returns(Promise.resolve(true));
           const data = {
@@ -648,36 +881,22 @@
           redirectToLoginStub = sandbox.stub(element, '_redirectToLogin');
         });
 
-        test('no user specified', () => {
-          const data = {canonicalPath: '/dashboard', params: {}};
-          const result = element._handleDashboardRoute(data);
-          assert.isNotOk(result);
-          assert.isFalse(setParamsStub.called);
-          assert.isFalse(redirectToLoginStub.called);
-          assert.isTrue(redirectStub.called);
-          assert.equal(redirectStub.lastCall.args[0], '/dashboard/self');
-        });
-
-        test('own dahsboard but signed out redirects to login', () => {
+        test('own dashboard but signed out redirects to login', () => {
           sandbox.stub(element.$.restAPI, 'getLoggedIn')
               .returns(Promise.resolve(false));
-          const data = {canonicalPath: '/dashboard', params: {0: 'seLF'}};
-          const result = element._handleDashboardRoute(data);
-          assert.isOk(result);
-          return result.then(() => {
+          const data = {canonicalPath: '/dashboard/', params: {0: 'seLF'}};
+          return element._handleDashboardRoute(data, '').then(() => {
             assert.isTrue(redirectToLoginStub.calledOnce);
             assert.isFalse(redirectStub.called);
             assert.isFalse(setParamsStub.called);
           });
         });
 
-        test('non-self dahsboard but signed out does not redirect', () => {
+        test('non-self dashboard but signed out does not redirect', () => {
           sandbox.stub(element.$.restAPI, 'getLoggedIn')
               .returns(Promise.resolve(false));
-          const data = {canonicalPath: '/dashboard', params: {0: 'foo'}};
-          const result = element._handleDashboardRoute(data);
-          assert.isOk(result);
-          return result.then(() => {
+          const data = {canonicalPath: '/dashboard/', params: {0: 'foo'}};
+          return element._handleDashboardRoute(data, '').then(() => {
             assert.isFalse(redirectToLoginStub.called);
             assert.isFalse(setParamsStub.called);
             assert.isTrue(redirectStub.calledOnce);
@@ -685,13 +904,11 @@
           });
         });
 
-        test('dahsboard while signed in sets params', () => {
+        test('dashboard while signed in sets params', () => {
           sandbox.stub(element.$.restAPI, 'getLoggedIn')
               .returns(Promise.resolve(true));
-          const data = {canonicalPath: '/dashboard', params: {0: 'foo'}};
-          const result = element._handleDashboardRoute(data);
-          assert.isOk(result);
-          return result.then(() => {
+          const data = {canonicalPath: '/dashboard/', params: {0: 'foo'}};
+          return element._handleDashboardRoute(data, '').then(() => {
             assert.isFalse(redirectToLoginStub.called);
             assert.isFalse(redirectStub.called);
             assert.isTrue(setParamsStub.calledOnce);
@@ -703,6 +920,79 @@
         });
       });
 
+      suite('_handleCustomDashboardRoute', () => {
+        let redirectToLoginStub;
+
+        setup(() => {
+          redirectToLoginStub = sandbox.stub(element, '_redirectToLogin');
+        });
+
+        test('no user specified', () => {
+          const data = {canonicalPath: '/dashboard/', params: {0: ''}};
+          return element._handleCustomDashboardRoute(data, '').then(() => {
+            assert.isFalse(setParamsStub.called);
+            assert.isTrue(redirectStub.called);
+            assert.equal(redirectStub.lastCall.args[0], '/dashboard/self');
+          });
+        });
+
+        test('custom dashboard without title', () => {
+          const data = {canonicalPath: '/dashboard/', params: {0: ''}};
+          return element._handleCustomDashboardRoute(data, '?a=b&c&d=e')
+              .then(() => {
+                assert.isFalse(redirectStub.called);
+                assert.isTrue(setParamsStub.calledOnce);
+                assert.deepEqual(setParamsStub.lastCall.args[0], {
+                  view: Gerrit.Nav.View.DASHBOARD,
+                  user: 'self',
+                  sections: [
+                    {name: 'a', query: 'b'},
+                    {name: 'd', query: 'e'},
+                  ],
+                  title: 'Custom Dashboard',
+                });
+              });
+        });
+
+        test('custom dashboard with title', () => {
+          const data = {canonicalPath: '/dashboard/', params: {0: ''}};
+          return element._handleCustomDashboardRoute(data,
+              '?a=b&c&d=&=e&title=t')
+              .then(() => {
+                assert.isFalse(redirectToLoginStub.called);
+                assert.isFalse(redirectStub.called);
+                assert.isTrue(setParamsStub.calledOnce);
+                assert.deepEqual(setParamsStub.lastCall.args[0], {
+                  view: Gerrit.Nav.View.DASHBOARD,
+                  user: 'self',
+                  sections: [
+                    {name: 'a', query: 'b'},
+                  ],
+                  title: 't',
+                });
+              });
+        });
+
+        test('custom dashboard with foreach', () => {
+          const data = {canonicalPath: '/dashboard/', params: {0: ''}};
+          return element._handleCustomDashboardRoute(data,
+              '?a=b&c&d=&=e&foreach=is:open')
+              .then(() => {
+                assert.isFalse(redirectToLoginStub.called);
+                assert.isFalse(redirectStub.called);
+                assert.isTrue(setParamsStub.calledOnce);
+                assert.deepEqual(setParamsStub.lastCall.args[0], {
+                  view: Gerrit.Nav.View.DASHBOARD,
+                  user: 'self',
+                  sections: [
+                    {name: 'a', query: 'is:open b'},
+                  ],
+                  title: 'Custom Dashboard',
+                });
+              });
+        });
+      });
+
       suite('group routes', () => {
         test('_handleGroupInfoRoute', () => {
           const data = {params: {0: 1234}};
@@ -714,9 +1004,8 @@
         test('_handleGroupAuditLogRoute', () => {
           const data = {params: {0: 1234}};
           assertDataToParams(data, '_handleGroupAuditLogRoute', {
-            view: Gerrit.Nav.View.ADMIN,
-            adminView: 'gr-group-audit-log',
-            detailType: 'audit-log',
+            view: Gerrit.Nav.View.GROUP,
+            detail: 'log',
             groupId: 1234,
           });
         });
@@ -724,9 +1013,8 @@
         test('_handleGroupMembersRoute', () => {
           const data = {params: {0: 1234}};
           assertDataToParams(data, '_handleGroupMembersRoute', {
-            view: Gerrit.Nav.View.ADMIN,
-            adminView: 'gr-group-members',
-            detailType: 'members',
+            view: Gerrit.Nav.View.GROUP,
+            detail: 'members',
             groupId: 1234,
           });
         });
@@ -782,40 +1070,36 @@
         test('_handleGroupRoute', () => {
           const data = {params: {0: 4321}};
           assertDataToParams(data, '_handleGroupRoute', {
-            view: Gerrit.Nav.View.ADMIN,
-            adminView: 'gr-group',
+            view: Gerrit.Nav.View.GROUP,
             groupId: 4321,
           });
         });
       });
 
-      suite('project routes', () => {
-        test('_handleProjectRoute', () => {
+      suite('repo routes', () => {
+        test('_handleRepoRoute', () => {
           const data = {params: {0: 4321}};
-          assertDataToParams(data, '_handleProjectRoute', {
-            view: Gerrit.Nav.View.ADMIN,
-            adminView: 'gr-project',
-            project: 4321,
+          assertDataToParams(data, '_handleRepoRoute', {
+            view: Gerrit.Nav.View.REPO,
+            repo: 4321,
           });
         });
 
-        test('_handleProjectCommandsRoute', () => {
+        test('_handleRepoCommandsRoute', () => {
           const data = {params: {0: 4321}};
-          assertDataToParams(data, '_handleProjectCommandsRoute', {
-            view: Gerrit.Nav.View.ADMIN,
-            adminView: 'gr-project-commands',
-            detailType: 'commands',
-            project: 4321,
+          assertDataToParams(data, '_handleRepoCommandsRoute', {
+            view: Gerrit.Nav.View.REPO,
+            detail: Gerrit.Nav.RepoDetailView.COMMANDS,
+            repo: 4321,
           });
         });
 
-        test('_handleProjectAccessRoute', () => {
+        test('_handleRepoAccessRoute', () => {
           const data = {params: {0: 4321}};
-          assertDataToParams(data, '_handleProjectAccessRoute', {
-            view: Gerrit.Nav.View.ADMIN,
-            adminView: 'gr-project-access',
-            detailType: 'access',
-            project: 4321,
+          assertDataToParams(data, '_handleRepoAccessRoute', {
+            view: Gerrit.Nav.View.REPO,
+            detail: Gerrit.Nav.RepoDetailView.ACCESS,
+            repo: 4321,
           });
         });
 
@@ -823,44 +1107,40 @@
           test('_handleBranchListOffsetRoute', () => {
             const data = {params: {0: 4321}};
             assertDataToParams(data, '_handleBranchListOffsetRoute', {
-              view: Gerrit.Nav.View.ADMIN,
-              adminView: 'gr-project-detail-list',
-              detailType: 'branches',
-              project: 4321,
+              view: Gerrit.Nav.View.REPO,
+              detail: Gerrit.Nav.RepoDetailView.BRANCHES,
+              repo: 4321,
               offset: 0,
               filter: null,
             });
 
             data.params[2] = 42;
             assertDataToParams(data, '_handleBranchListOffsetRoute', {
-              view: Gerrit.Nav.View.ADMIN,
-              adminView: 'gr-project-detail-list',
-              detailType: 'branches',
-              project: 4321,
+              view: Gerrit.Nav.View.REPO,
+              detail: Gerrit.Nav.RepoDetailView.BRANCHES,
+              repo: 4321,
               offset: 42,
               filter: null,
             });
           });
 
           test('_handleBranchListFilterOffsetRoute', () => {
-            const data = {params: {project: 4321, filter: 'foo', offset: 42}};
+            const data = {params: {repo: 4321, filter: 'foo', offset: 42}};
             assertDataToParams(data, '_handleBranchListFilterOffsetRoute', {
-              view: Gerrit.Nav.View.ADMIN,
-              adminView: 'gr-project-detail-list',
-              detailType: 'branches',
-              project: 4321,
+              view: Gerrit.Nav.View.REPO,
+              detail: Gerrit.Nav.RepoDetailView.BRANCHES,
+              repo: 4321,
               offset: 42,
               filter: 'foo',
             });
           });
 
           test('_handleBranchListFilterRoute', () => {
-            const data = {params: {project: 4321, filter: 'foo'}};
+            const data = {params: {repo: 4321, filter: 'foo'}};
             assertDataToParams(data, '_handleBranchListFilterRoute', {
-              view: Gerrit.Nav.View.ADMIN,
-              adminView: 'gr-project-detail-list',
-              detailType: 'branches',
-              project: 4321,
+              view: Gerrit.Nav.View.REPO,
+              detail: Gerrit.Nav.RepoDetailView.BRANCHES,
+              repo: 4321,
               filter: 'foo',
             });
           });
@@ -870,100 +1150,96 @@
           test('_handleTagListOffsetRoute', () => {
             const data = {params: {0: 4321}};
             assertDataToParams(data, '_handleTagListOffsetRoute', {
-              view: Gerrit.Nav.View.ADMIN,
-              adminView: 'gr-project-detail-list',
-              detailType: 'tags',
-              project: 4321,
+              view: Gerrit.Nav.View.REPO,
+              detail: Gerrit.Nav.RepoDetailView.TAGS,
+              repo: 4321,
               offset: 0,
               filter: null,
             });
           });
 
           test('_handleTagListFilterOffsetRoute', () => {
-            const data = {params: {project: 4321, filter: 'foo', offset: 42}};
+            const data = {params: {repo: 4321, filter: 'foo', offset: 42}};
             assertDataToParams(data, '_handleTagListFilterOffsetRoute', {
-              view: Gerrit.Nav.View.ADMIN,
-              adminView: 'gr-project-detail-list',
-              detailType: 'tags',
-              project: 4321,
+              view: Gerrit.Nav.View.REPO,
+              detail: Gerrit.Nav.RepoDetailView.TAGS,
+              repo: 4321,
               offset: 42,
               filter: 'foo',
             });
           });
 
           test('_handleTagListFilterRoute', () => {
-            const data = {params: {project: 4321}};
+            const data = {params: {repo: 4321}};
             assertDataToParams(data, '_handleTagListFilterRoute', {
-              view: Gerrit.Nav.View.ADMIN,
-              adminView: 'gr-project-detail-list',
-              detailType: 'tags',
-              project: 4321,
+              view: Gerrit.Nav.View.REPO,
+              detail: Gerrit.Nav.RepoDetailView.TAGS,
+              repo: 4321,
               filter: null,
             });
 
             data.params.filter = 'foo';
             assertDataToParams(data, '_handleTagListFilterRoute', {
-              view: Gerrit.Nav.View.ADMIN,
-              adminView: 'gr-project-detail-list',
-              detailType: 'tags',
-              project: 4321,
+              view: Gerrit.Nav.View.REPO,
+              detail: Gerrit.Nav.RepoDetailView.TAGS,
+              repo: 4321,
               filter: 'foo',
             });
           });
         });
 
-        suite('project list routes', () => {
-          test('_handleProjectListOffsetRoute', () => {
+        suite('repo list routes', () => {
+          test('_handleRepoListOffsetRoute', () => {
             const data = {params: {}};
-            assertDataToParams(data, '_handleProjectListOffsetRoute', {
+            assertDataToParams(data, '_handleRepoListOffsetRoute', {
               view: Gerrit.Nav.View.ADMIN,
-              adminView: 'gr-project-list',
+              adminView: 'gr-repo-list',
               offset: 0,
               filter: null,
               openCreateModal: false,
             });
 
             data.params[1] = 42;
-            assertDataToParams(data, '_handleProjectListOffsetRoute', {
+            assertDataToParams(data, '_handleRepoListOffsetRoute', {
               view: Gerrit.Nav.View.ADMIN,
-              adminView: 'gr-project-list',
+              adminView: 'gr-repo-list',
               offset: 42,
               filter: null,
               openCreateModal: false,
             });
 
             data.hash = 'create';
-            assertDataToParams(data, '_handleProjectListOffsetRoute', {
+            assertDataToParams(data, '_handleRepoListOffsetRoute', {
               view: Gerrit.Nav.View.ADMIN,
-              adminView: 'gr-project-list',
+              adminView: 'gr-repo-list',
               offset: 42,
               filter: null,
               openCreateModal: true,
             });
           });
 
-          test('_handleProjectListFilterOffsetRoute', () => {
+          test('_handleRepoListFilterOffsetRoute', () => {
             const data = {params: {filter: 'foo', offset: 42}};
-            assertDataToParams(data, '_handleProjectListFilterOffsetRoute', {
+            assertDataToParams(data, '_handleRepoListFilterOffsetRoute', {
               view: Gerrit.Nav.View.ADMIN,
-              adminView: 'gr-project-list',
+              adminView: 'gr-repo-list',
               offset: 42,
               filter: 'foo',
             });
           });
 
-          test('_handleProjectListFilterRoute', () => {
+          test('_handleRepoListFilterRoute', () => {
             const data = {params: {}};
-            assertDataToParams(data, '_handleProjectListFilterRoute', {
+            assertDataToParams(data, '_handleRepoListFilterRoute', {
               view: Gerrit.Nav.View.ADMIN,
-              adminView: 'gr-project-list',
+              adminView: 'gr-repo-list',
               filter: null,
             });
 
             data.params.filter = 'foo';
-            assertDataToParams(data, '_handleProjectListFilterRoute', {
+            assertDataToParams(data, '_handleRepoListFilterRoute', {
               view: Gerrit.Nav.View.ADMIN,
-              adminView: 'gr-project-list',
+              adminView: 'gr-repo-list',
               filter: 'foo',
             });
           });
@@ -1044,6 +1320,7 @@
               null, // 4 Unused
               9, // 5 Patch number
             ],
+            querystring: '',
           };
           element._handleChangeLegacyRoute(ctx);
           assert.isTrue(normalizeRouteStub.calledOnce);
@@ -1052,6 +1329,7 @@
             basePatchNum: 6,
             patchNum: 9,
             view: Gerrit.Nav.View.CHANGE,
+            querystring: '',
           });
         });
 
@@ -1100,7 +1378,57 @@
               '/c/1234/3..8/foo/bar#b123'));
         });
 
-        suite('_handleChangeOrDiffRoute', () => {
+        suite('_handleChangeRoute', () => {
+          let normalizeRangeStub;
+
+          function makeParams(path, hash) {
+            return {
+              params: [
+                'foo/bar', // 0 Project
+                1234, // 1 Change number
+                null, // 2 Unused
+                null, // 3 Unused
+                4, // 4 Base patch number
+                null, // 5 Unused
+                7, // 6 Patch number
+              ],
+            };
+          }
+
+          setup(() => {
+            normalizeRangeStub = sandbox.stub(element,
+                '_normalizePatchRangeParams');
+            sandbox.stub(element.$.restAPI, 'setInProjectLookup');
+          });
+
+          test('needs redirect', () => {
+            normalizeRangeStub.returns(true);
+            sandbox.stub(element, '_generateUrl').returns('foo');
+            const ctx = makeParams(null, '');
+            element._handleChangeRoute(ctx);
+            assert.isTrue(normalizeRangeStub.called);
+            assert.isFalse(setParamsStub.called);
+            assert.isTrue(redirectStub.calledOnce);
+            assert.isTrue(redirectStub.calledWithExactly('foo'));
+          });
+
+          test('change view', () => {
+            normalizeRangeStub.returns(false);
+            sandbox.stub(element, '_generateUrl').returns('foo');
+            const ctx = makeParams(null, '');
+            assertDataToParams(ctx, '_handleChangeRoute', {
+              view: Gerrit.Nav.View.CHANGE,
+              project: 'foo/bar',
+              changeNum: 1234,
+              basePatchNum: 4,
+              patchNum: 7,
+            });
+            assert.isFalse(redirectStub.called);
+            assert.isTrue(normalizeRangeStub.called);
+          });
+        });
+
+        suite('_handleDiffRoute', () => {
           let normalizeRangeStub;
 
           function makeParams(path, hash) {
@@ -1130,34 +1458,18 @@
             normalizeRangeStub.returns(true);
             sandbox.stub(element, '_generateUrl').returns('foo');
             const ctx = makeParams(null, '');
-            element._handleChangeOrDiffRoute(ctx);
+            element._handleDiffRoute(ctx);
             assert.isTrue(normalizeRangeStub.called);
             assert.isFalse(setParamsStub.called);
             assert.isTrue(redirectStub.calledOnce);
             assert.isTrue(redirectStub.calledWithExactly('foo'));
           });
 
-          test('change view', () => {
-            normalizeRangeStub.returns(false);
-            sandbox.stub(element, '_generateUrl').returns('foo');
-            const ctx = makeParams(null, '');
-            assertDataToParams(ctx, '_handleChangeOrDiffRoute', {
-              view: Gerrit.Nav.View.CHANGE,
-              project: 'foo/bar',
-              changeNum: 1234,
-              basePatchNum: 4,
-              patchNum: 7,
-              path: null,
-            });
-            assert.isFalse(redirectStub.called);
-            assert.isTrue(normalizeRangeStub.called);
-          });
-
           test('diff view', () => {
             normalizeRangeStub.returns(false);
             sandbox.stub(element, '_generateUrl').returns('foo');
             const ctx = makeParams('foo/bar/baz', 'b44');
-            assertDataToParams(ctx, '_handleChangeOrDiffRoute', {
+            assertDataToParams(ctx, '_handleDiffRoute', {
               view: Gerrit.Nav.View.DIFF,
               project: 'foo/bar',
               changeNum: 1234,
@@ -1180,7 +1492,8 @@
             params: [
               'foo/bar', // 0 Project
               1234, // 1 Change number
-              'foo/bar/baz', // 2 File path
+              3, // 2 Patch num
+              'foo/bar/baz', // 3 File path
             ],
           };
           const appParams = {
@@ -1188,6 +1501,7 @@
             changeNum: 1234,
             view: Gerrit.Nav.View.EDIT,
             path: 'foo/bar/baz',
+            patchNum: 3,
           };
 
           element._handleDiffEditRoute(ctx);
@@ -1197,6 +1511,70 @@
           assert.isFalse(normalizeRangeSpy.lastCall.returnValue);
           assert.deepEqual(setParamsStub.lastCall.args[0], appParams);
         });
+
+        test('_handleChangeEditRoute', () => {
+          const normalizeRangeSpy =
+              sandbox.spy(element, '_normalizePatchRangeParams');
+          sandbox.stub(element.$.restAPI, 'setInProjectLookup');
+          const ctx = {
+            params: [
+              'foo/bar', // 0 Project
+              1234, // 1 Change number
+              null,
+              3, // 3 Patch num
+            ],
+          };
+          const appParams = {
+            project: 'foo/bar',
+            changeNum: 1234,
+            view: Gerrit.Nav.View.CHANGE,
+            patchNum: 3,
+            edit: true,
+          };
+
+          element._handleChangeEditRoute(ctx);
+          assert.isFalse(redirectStub.called);
+          assert.isTrue(normalizeRangeSpy.calledOnce);
+          assert.deepEqual(normalizeRangeSpy.lastCall.args[0], appParams);
+          assert.isFalse(normalizeRangeSpy.lastCall.returnValue);
+          assert.deepEqual(setParamsStub.lastCall.args[0], appParams);
+        });
+      });
+
+      test('_handlePluginScreen', () => {
+        const ctx = {params: ['foo', 'bar']};
+        assertDataToParams(ctx, '_handlePluginScreen', {
+          view: Gerrit.Nav.View.PLUGIN_SCREEN,
+          plugin: 'foo',
+          screen: 'bar',
+        });
+        assert.isFalse(redirectStub.called);
+      });
+    });
+
+    suite('_parseQueryString', () => {
+      test('empty queries', () => {
+        assert.deepEqual(element._parseQueryString(''), []);
+        assert.deepEqual(element._parseQueryString('?'), []);
+        assert.deepEqual(element._parseQueryString('??'), []);
+        assert.deepEqual(element._parseQueryString('&&&'), []);
+      });
+
+      test('url decoding', () => {
+        assert.deepEqual(element._parseQueryString('+'), [[' ', '']]);
+        assert.deepEqual(element._parseQueryString('???+%3d+'), [[' = ', '']]);
+        assert.deepEqual(
+            element._parseQueryString('%6e%61%6d%65=%76%61%6c%75%65'),
+            [['name', 'value']]);
+      });
+
+      test('multiple parameters', () => {
+        assert.deepEqual(
+            element._parseQueryString('a=b&c=d&e=f'),
+            [['a', 'b'], ['c', 'd'], ['e', 'f']]);
+        assert.deepEqual(
+            element._parseQueryString('&a=b&&&e=f&'),
+            [['a', 'b'], ['e', 'f']]);
       });
     });
   });
diff --git a/polygerrit-ui/app/elements/core/gr-search-bar/gr-search-bar.html b/polygerrit-ui/app/elements/core/gr-search-bar/gr-search-bar.html
index d5b394c..3a48213 100644
--- a/polygerrit-ui/app/elements/core/gr-search-bar/gr-search-bar.html
+++ b/polygerrit-ui/app/elements/core/gr-search-bar/gr-search-bar.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,27 +15,22 @@
 limitations under the License.
 -->
 
-<link rel="import" href="../../../behaviors/gr-anonymous-name-behavior/gr-anonymous-name-behavior.html">
-<link rel="import" href="../../../behaviors/gr-url-encoding-behavior.html">
+<link rel="import" href="../../../behaviors/gr-url-encoding-behavior/gr-url-encoding-behavior.html">
 <link rel="import" href="../../../behaviors/keyboard-shortcut-behavior/keyboard-shortcut-behavior.html">
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
 <link rel="import" href="../../shared/gr-autocomplete/gr-autocomplete.html">
-<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 
 <dom-module id="gr-search-bar">
   <template>
     <style include="shared-styles">
-      :host {
-        display: inline-block;
-      }
       form {
         display: flex;
       }
       gr-autocomplete {
-        background-color: white;
-        border: 1px solid #d1d2d3;
-        border-radius: 2px 0 0 2px;
+        background-color: var(--view-background-color);
+        border: 1px solid var(--border-color);
+        border-radius: 2px;
         flex: 1;
         font: inherit;
         outline: none;
@@ -54,7 +50,6 @@
           threshold="[[_threshold]]"
           tab-complete
           vertical-offset="30"></gr-autocomplete>
-      <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
     </form>
   </template>
   <script src="gr-search-bar.js"></script>
diff --git a/polygerrit-ui/app/elements/core/gr-search-bar/gr-search-bar.js b/polygerrit-ui/app/elements/core/gr-search-bar/gr-search-bar.js
index de01534..91c16c3 100644
--- a/polygerrit-ui/app/elements/core/gr-search-bar/gr-search-bar.js
+++ b/polygerrit-ui/app/elements/core/gr-search-bar/gr-search-bar.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -90,9 +93,6 @@
   const SEARCH_OPERATORS_WITH_NEGATIONS =
       SEARCH_OPERATORS.concat(SEARCH_OPERATORS.map(op => `-${op}`));
 
-  const SELF_EXPRESSION = 'self';
-  const ME_EXPRESSION = 'me';
-
   const MAX_AUTOCOMPLETE_RESULTS = 10;
 
   const TOKENIZE_REGEX = /(?:[^\s"]+|"[^"]*")+\s*/g;
@@ -100,16 +100,17 @@
   Polymer({
     is: 'gr-search-bar',
 
+    /**
+     * Fired when a search is committed
+     *
+     * @event handle-search
+     */
+
     behaviors: [
-      Gerrit.AnonymousNameBehavior,
       Gerrit.KeyboardShortcutBehavior,
       Gerrit.URLEncodingBehavior,
     ],
 
-    keyBindings: {
-      '/': '_handleForwardSlashKey',
-    },
-
     properties: {
       value: {
         type: String,
@@ -127,18 +128,35 @@
           return this._getSearchSuggestions.bind(this);
         },
       },
+      projectSuggestions: {
+        type: Function,
+        value() {
+          return () => Promise.resolve([]);
+        },
+      },
+      groupSuggestions: {
+        type: Function,
+        value() {
+          return () => Promise.resolve([]);
+        },
+      },
+      accountSuggestions: {
+        type: Function,
+        value() {
+          return () => Promise.resolve([]);
+        },
+      },
       _inputVal: String,
       _threshold: {
         type: Number,
         value: 1,
       },
-      _config: Object,
     },
 
-    attached() {
-      this.$.restAPI.getConfig().then(cfg => {
-        this._config = cfg;
-      });
+    keyboardShortcuts() {
+      return {
+        [this.Shortcut.SEARCH]: '_handleSearch',
+      };
     },
 
     _valueChanged(value) {
@@ -168,93 +186,18 @@
         target.blur();
       }
       if (this._inputVal) {
-        page.show('/q/' + this.encodeURL(this._inputVal, false));
+        this.dispatchEvent(new CustomEvent('handle-search', {
+          detail: {inputVal: this._inputVal},
+        }));
       }
     },
 
-    _accountOrAnon(name) {
-      return this.getUserName(this._config, name, false);
-    },
-
-    /**
-     * Fetch from the API the predicted accounts.
-     * @param {string} predicate - The first part of the search term, e.g.
-     *     'owner'
-     * @param {string} expression - The second part of the search term, e.g.
-     *     'kasp'
-     * @return {!Promise} This returns a promise that resolves to an array of
-     *     strings.
-     */
-    _fetchAccounts(predicate, expression) {
-      if (expression.length === 0) { return Promise.resolve([]); }
-      return this.$.restAPI.getSuggestedAccounts(
-          expression,
-          MAX_AUTOCOMPLETE_RESULTS)
-          .then(accounts => {
-            if (!accounts) { return []; }
-            return accounts.map(acct => acct.email ?
-              `${predicate}:${acct.email}` :
-              `${predicate}:"${this._accountOrAnon(acct)}"`);
-          }).then(accounts => {
-            // When the expression supplied is a beginning substring of 'self',
-            // add it as an autocomplete option.
-            if (SELF_EXPRESSION.startsWith(expression)) {
-              return accounts.concat([predicate + ':' + SELF_EXPRESSION]);
-            } else if (ME_EXPRESSION.startsWith(expression)) {
-              return accounts.concat([predicate + ':' + ME_EXPRESSION]);
-            } else {
-              return accounts;
-            }
-          });
-    },
-
-    /**
-     * Fetch from the API the predicted groups.
-     * @param {string} predicate - The first part of the search term, e.g.
-     *     'ownerin'
-     * @param {string} expression - The second part of the search term, e.g.
-     *     'polyger'
-     * @return {!Promise} This returns a promise that resolves to an array of
-     *     strings.
-     */
-    _fetchGroups(predicate, expression) {
-      if (expression.length === 0) { return Promise.resolve([]); }
-      return this.$.restAPI.getSuggestedGroups(
-          expression,
-          MAX_AUTOCOMPLETE_RESULTS)
-          .then(groups => {
-            if (!groups) { return []; }
-            const keys = Object.keys(groups);
-            return keys.map(key => predicate + ':' + key);
-          });
-    },
-
-    /**
-     * Fetch from the API the predicted projects.
-     * @param {string} predicate - The first part of the search term, e.g.
-     *     'project'
-     * @param {string} expression - The second part of the search term, e.g.
-     *     'gerr'
-     * @return {!Promise} This returns a promise that resolves to an array of
-     *     strings.
-     */
-    _fetchProjects(predicate, expression) {
-      return this.$.restAPI.getSuggestedProjects(
-          expression,
-          MAX_AUTOCOMPLETE_RESULTS)
-          .then(projects => {
-            if (!projects) { return []; }
-            const keys = Object.keys(projects);
-            return keys.map(key => predicate + ':' + key);
-          });
-    },
-
     /**
      * Determine what array of possible suggestions should be provided
      *     to _getSearchSuggestions.
      * @param {string} input - The full search term, in lowercase.
      * @return {!Promise} This returns a promise that resolves to an array of
-     *     strings.
+     *     suggestion objects.
      */
     _fetchSuggestions(input) {
       // Split the input on colon to get a two part predicate/expression.
@@ -266,12 +209,12 @@
         case 'ownerin':
         case 'reviewerin':
           // Fetch groups.
-          return this._fetchGroups(predicate, expression);
+          return this.groupSuggestions(predicate, expression);
 
         case 'parentproject':
         case 'project':
           // Fetch projects.
-          return this._fetchProjects(predicate, expression);
+          return this.projectSuggestions(predicate, expression);
 
         case 'author':
         case 'cc':
@@ -282,11 +225,12 @@
         case 'reviewedby':
         case 'reviewer':
           // Fetch accounts.
-          return this._fetchAccounts(predicate, expression);
+          return this.accountSuggestions(predicate, expression);
 
         default:
           return Promise.resolve(SEARCH_OPERATORS_WITH_NEGATIONS
-              .filter(operator => operator.includes(input)));
+              .filter(operator => operator.includes(input))
+              .map(operator => ({text: operator})));
       }
     },
 
@@ -294,7 +238,7 @@
      * Get the sorted, pruned list of suggestions for the current search query.
      * @param {string} input - The complete search query.
      * @return {!Promise} This returns a promise that resolves to an array of
-     *     strings.
+     *     suggestions.
      */
     _getSearchSuggestions(input) {
       // Allow spaces within quoted terms.
@@ -302,15 +246,15 @@
       const trimmedInput = tokens[tokens.length - 1].toLowerCase();
 
       return this._fetchSuggestions(trimmedInput)
-          .then(operators => {
-            if (!operators || !operators.length) { return []; }
-            return operators
+          .then(suggestions => {
+            if (!suggestions || !suggestions.length) { return []; }
+            return suggestions
                 // Prioritize results that start with the input.
                 .sort((a, b) => {
-                  const aContains = a.toLowerCase().indexOf(trimmedInput);
-                  const bContains = b.toLowerCase().indexOf(trimmedInput);
+                  const aContains = a.text.toLowerCase().indexOf(trimmedInput);
+                  const bContains = b.text.toLowerCase().indexOf(trimmedInput);
                   if (aContains === bContains) {
-                    return a.localeCompare(b);
+                    return a.text.localeCompare(b.text);
                   }
                   if (aContains === -1) {
                     return 1;
@@ -323,18 +267,20 @@
                 // Return only the first {MAX_AUTOCOMPLETE_RESULTS} results.
                 .slice(0, MAX_AUTOCOMPLETE_RESULTS - 1)
                 // Map to an object to play nice with gr-autocomplete.
-                .map(operator => {
+                .map(({text, label}) => {
                   return {
-                    name: operator,
-                    value: operator,
+                    name: text,
+                    value: text,
+                    label,
                   };
                 });
           });
     },
 
-    _handleForwardSlashKey(e) {
+    _handleSearch(e) {
+      const keyboardEvent = this.getKeyboardEvent(e);
       if (this.shouldSuppressKeyboardShortcut(e) ||
-          this.modifierPressed(e)) { return; }
+          (this.modifierPressed(e) && !keyboardEvent.shiftKey)) { return; }
 
       e.preventDefault();
       this.$.searchInput.focus();
diff --git a/polygerrit-ui/app/elements/core/gr-search-bar/gr-search-bar_test.html b/polygerrit-ui/app/elements/core/gr-search-bar/gr-search-bar_test.html
index 9551c79..93e0e307 100644
--- a/polygerrit-ui/app/elements/core/gr-search-bar/gr-search-bar_test.html
+++ b/polygerrit-ui/app/elements/core/gr-search-bar/gr-search-bar_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -36,6 +37,9 @@
 
 <script>
   suite('gr-search-bar tests', () => {
+    const kb = window.Gerrit.KeyboardShortcutBinder;
+    kb.bindShortcut(kb.Shortcut.SEARCH, '/');
+
     let element;
     let sandbox;
 
@@ -59,9 +63,8 @@
           document.activeElement;
     };
 
-    test('enter in search input triggers nav', done => {
-      sandbox.stub(page, 'show', () => {
-        page.show.restore();
+    test('enter in search input fires event', done => {
+      element.addEventListener('handle-search', () => {
         assert.notEqual(getActiveElement(), element.$.searchInput);
         assert.notEqual(getActiveElement(), element.$.searchButton);
         done();
@@ -71,16 +74,7 @@
           null, 'enter');
     });
 
-    test('search query should be double-escaped', () => {
-      const showStub = sandbox.stub(page, 'show');
-      element.$.searchInput.text = 'fate/stay';
-      MockInteractions.pressAndReleaseKeyOn(element.$.searchInput.$.input, 13,
-          null, 'enter');
-      assert.equal(showStub.lastCall.args[0], '/q/fate%252Fstay');
-    });
-
     test('input blurred after commit', () => {
-      sandbox.stub(page, 'show');
       const blurSpy = sandbox.spy(element.$.searchInput.$.input, 'blur');
       element.$.searchInput.text = 'fate/stay';
       MockInteractions.pressAndReleaseKeyOn(element.$.searchInput.$.input, 13,
@@ -89,11 +83,12 @@
     });
 
     test('empty search query does not trigger nav', () => {
-      const showSpy = sandbox.spy(page, 'show');
+      const searchSpy = sandbox.spy();
+      element.addEventListener('handle-search', searchSpy);
       element.value = '';
       MockInteractions.pressAndReleaseKeyOn(element.$.searchInput.$.input, 13,
           null, 'enter');
-      assert.isFalse(showSpy.called);
+      assert.isFalse(searchSpy.called);
     });
 
     test('keyboard shortcuts', () => {
@@ -106,64 +101,20 @@
 
     suite('_getSearchSuggestions', () => {
       test('Autocompletes accounts', () => {
-        sandbox.stub(element.$.restAPI, 'getSuggestedAccounts', () =>
-          Promise.resolve([
-            {
-              name: 'fred',
-              email: 'fred@goog.co',
-            },
-          ])
+        sandbox.stub(element, 'accountSuggestions', () =>
+          Promise.resolve([{text: 'owner:fred@goog.co'}])
         );
         return element._getSearchSuggestions('owner:fr').then(s => {
           assert.equal(s[0].value, 'owner:fred@goog.co');
         });
       });
 
-      test('Inserts self as option when valid', done => {
-        sandbox.stub(element.$.restAPI, 'getSuggestedAccounts', () =>
-          Promise.resolve([
-            {
-              name: 'fred',
-              email: 'fred@goog.co',
-            },
-          ])
-        );
-        element._getSearchSuggestions('owner:s').then(s => {
-          assert.equal(s[0].value, 'owner:self');
-        }).then(() => {
-          element._getSearchSuggestions('owner:selfs').then(s => {
-            assert.notEqual(s[0].value, 'owner:self');
-            done();
-          });
-        });
-      });
-
-      test('Inserts me as option when valid', done => {
-        sandbox.stub(element.$.restAPI, 'getSuggestedAccounts', () =>
-          Promise.resolve([
-            {
-              name: 'fred',
-              email: 'fred@goog.co',
-            },
-          ])
-        );
-        element._getSearchSuggestions('owner:m').then(s => {
-          assert.equal(s[0].value, 'owner:me');
-        }).then(() => {
-          element._getSearchSuggestions('owner:meme').then(s => {
-            assert.notEqual(s[0].value, 'owner:me');
-            done();
-          });
-        });
-      });
-
       test('Autocompletes groups', done => {
-        sandbox.stub(element.$.restAPI, 'getSuggestedGroups', () =>
-          Promise.resolve({
-            Polygerrit: 0,
-            gerrit: 0,
-            gerrittest: 0,
-          })
+        sandbox.stub(element, 'groupSuggestions', () =>
+          Promise.resolve([
+            {text: 'ownerin:Polygerrit'},
+            {text: 'ownerin:gerrit'},
+          ])
         );
         element._getSearchSuggestions('ownerin:pol').then(s => {
           assert.equal(s[0].value, 'ownerin:Polygerrit');
@@ -172,10 +123,12 @@
       });
 
       test('Autocompletes projects', done => {
-        sandbox.stub(element.$.restAPI, 'getSuggestedProjects', () =>
-          Promise.resolve({
-            Polygerrit: 0,
-          })
+        sandbox.stub(element, 'projectSuggestions', () =>
+          Promise.resolve([
+            {text: 'project:Polygerrit'},
+            {text: 'project:gerrit'},
+            {text: 'project:gerrittest'},
+          ])
         );
         element._getSearchSuggestions('project:pol').then(s => {
           assert.equal(s[0].value, 'project:Polygerrit');
@@ -199,67 +152,6 @@
           done();
         });
       });
-
-      test('Autocomplete doesnt override exact matches to input', done => {
-        sandbox.stub(element.$.restAPI, 'getSuggestedGroups', () =>
-          Promise.resolve({
-            Polygerrit: 0,
-            gerrit: 0,
-            gerrittest: 0,
-          })
-        );
-        element._getSearchSuggestions('ownerin:gerrit').then(s => {
-          assert.equal(s[0].value, 'ownerin:gerrit');
-          done();
-        });
-      });
-
-      test('Autocomplete respects spaces', done => {
-        sandbox.stub(element.$.restAPI, 'getSuggestedAccounts', () =>
-          Promise.resolve([
-            {
-              name: 'fred',
-              email: 'fred@goog.co',
-            },
-          ])
-        );
-        element._getSearchSuggestions('is:ope').then(s => {
-          assert.equal(s[0].name, 'is:open');
-          assert.equal(s[0].value, 'is:open');
-          element._getSearchSuggestions('is:ope ').then(s => {
-            assert.equal(s.length, 0);
-            done();
-          });
-        });
-      });
-
-      test('Autocompletes accounts with no email', done => {
-        sandbox.stub(element.$.restAPI, 'getSuggestedAccounts', () =>
-          Promise.resolve([
-            {
-              name: 'fred',
-            },
-          ])
-        );
-        element._getSearchSuggestions('owner:fr').then(s => {
-          assert.equal(s[0].value, 'owner:"fred"');
-          done();
-        });
-      });
-
-      test('Autocompletes accounts with email', done => {
-        sandbox.stub(element.$.restAPI, 'getSuggestedAccounts', () =>
-          Promise.resolve([
-            {
-              email: 'fred@goog.co',
-            },
-          ])
-        );
-        element._getSearchSuggestions('owner:fr').then(s => {
-          assert.equal(s[0].value, 'owner:fred@goog.co');
-          done();
-        });
-      });
     });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/core/gr-smart-search/gr-smart-search.html b/polygerrit-ui/app/elements/core/gr-smart-search/gr-smart-search.html
new file mode 100644
index 0000000..4c98068
--- /dev/null
+++ b/polygerrit-ui/app/elements/core/gr-smart-search/gr-smart-search.html
@@ -0,0 +1,38 @@
+<!--
+@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.
+-->
+<link rel="import" href="../../../bower_components/polymer/polymer.html">
+
+<link rel="import" href="../../../behaviors/gr-anonymous-name-behavior/gr-anonymous-name-behavior.html">
+<link rel="import" href="../../core/gr-navigation/gr-navigation.html">
+<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
+<link rel="import" href="../gr-search-bar/gr-search-bar.html">
+
+<dom-module id="gr-smart-search">
+  <template>
+    <style include="shared-styles">
+
+    </style>
+    <gr-search-bar id="search"
+        value="{{searchQuery}}"
+        on-handle-search="_handleSearch"
+        project-suggestions="[[_projectSuggestions]]"
+        group-suggestions="[[_groupSuggestions]]"
+        account-suggestions="[[_accountSuggestions]]"></gr-search-bar>
+    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
+  </template>
+  <script src="gr-smart-search.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/core/gr-smart-search/gr-smart-search.js b/polygerrit-ui/app/elements/core/gr-smart-search/gr-smart-search.js
new file mode 100644
index 0000000..a921308
--- /dev/null
+++ b/polygerrit-ui/app/elements/core/gr-smart-search/gr-smart-search.js
@@ -0,0 +1,152 @@
+/**
+ * @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.
+ */
+(function() {
+  'use strict';
+
+  const MAX_AUTOCOMPLETE_RESULTS = 10;
+  const SELF_EXPRESSION = 'self';
+  const ME_EXPRESSION = 'me';
+
+  Polymer({
+    is: 'gr-smart-search',
+
+    properties: {
+      searchQuery: String,
+      _config: Object,
+      _projectSuggestions: {
+        type: Function,
+        value() {
+          return this._fetchProjects.bind(this);
+        },
+      },
+      _groupSuggestions: {
+        type: Function,
+        value() {
+          return this._fetchGroups.bind(this);
+        },
+      },
+      _accountSuggestions: {
+        type: Function,
+        value() {
+          return this._fetchAccounts.bind(this);
+        },
+      },
+    },
+
+    behaviors: [
+      Gerrit.AnonymousNameBehavior,
+    ],
+
+    attached() {
+      this.$.restAPI.getConfig().then(cfg => {
+        this._config = cfg;
+      });
+    },
+
+    _handleSearch(e) {
+      const input = e.detail.inputVal;
+      if (input) {
+        Gerrit.Nav.navigateToSearchQuery(input);
+      }
+    },
+
+    _accountOrAnon(name) {
+      return this.getUserName(this._serverConfig, name, false);
+    },
+
+    /**
+     * Fetch from the API the predicted projects.
+     * @param {string} predicate - The first part of the search term, e.g.
+     *     'project'
+     * @param {string} expression - The second part of the search term, e.g.
+     *     'gerr'
+     * @return {!Promise} This returns a promise that resolves to an array of
+     *     strings.
+     */
+    _fetchProjects(predicate, expression) {
+      return this.$.restAPI.getSuggestedProjects(
+          expression,
+          MAX_AUTOCOMPLETE_RESULTS)
+          .then(projects => {
+            if (!projects) { return []; }
+            const keys = Object.keys(projects);
+            return keys.map(key => ({text: predicate + ':' + key}));
+          });
+    },
+
+    /**
+     * Fetch from the API the predicted groups.
+     * @param {string} predicate - The first part of the search term, e.g.
+     *     'ownerin'
+     * @param {string} expression - The second part of the search term, e.g.
+     *     'polyger'
+     * @return {!Promise} This returns a promise that resolves to an array of
+     *     strings.
+     */
+    _fetchGroups(predicate, expression) {
+      if (expression.length === 0) { return Promise.resolve([]); }
+      return this.$.restAPI.getSuggestedGroups(
+          expression,
+          MAX_AUTOCOMPLETE_RESULTS)
+          .then(groups => {
+            if (!groups) { return []; }
+            const keys = Object.keys(groups);
+            return keys.map(key => ({text: predicate + ':' + key}));
+          });
+    },
+
+    /**
+     * Fetch from the API the predicted accounts.
+     * @param {string} predicate - The first part of the search term, e.g.
+     *     'owner'
+     * @param {string} expression - The second part of the search term, e.g.
+     *     'kasp'
+     * @return {!Promise} This returns a promise that resolves to an array of
+     *     strings.
+     */
+    _fetchAccounts(predicate, expression) {
+      if (expression.length === 0) { return Promise.resolve([]); }
+      return this.$.restAPI.getSuggestedAccounts(
+          expression,
+          MAX_AUTOCOMPLETE_RESULTS)
+          .then(accounts => {
+            if (!accounts) { return []; }
+            return this._mapAccountsHelper(accounts, predicate);
+          }).then(accounts => {
+            // When the expression supplied is a beginning substring of 'self',
+            // add it as an autocomplete option.
+            if (SELF_EXPRESSION.startsWith(expression)) {
+              return accounts.concat(
+                  [{text: predicate + ':' + SELF_EXPRESSION}]);
+            } else if (ME_EXPRESSION.startsWith(expression)) {
+              return accounts.concat([{text: predicate + ':' + ME_EXPRESSION}]);
+            } else {
+              return accounts;
+            }
+          });
+    },
+
+    _mapAccountsHelper(accounts, predicate) {
+      return accounts.map(account => ({
+        label: account.name || '',
+        text: account.email ?
+            `${predicate}:${account.email}` :
+            `${predicate}:"${this._accountOrAnon(account)}"`,
+      }));
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/core/gr-smart-search/gr-smart-search_test.html b/polygerrit-ui/app/elements/core/gr-smart-search/gr-smart-search_test.html
new file mode 100644
index 0000000..af0fc3c
--- /dev/null
+++ b/polygerrit-ui/app/elements/core/gr-smart-search/gr-smart-search_test.html
@@ -0,0 +1,150 @@
+<!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-smart-search</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-smart-search.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-smart-search></gr-smart-search>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-smart-search tests', () => {
+    let element;
+    let sandbox;
+
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+      element = fixture('basic');
+    });
+
+    teardown(() => {
+      sandbox.restore();
+    });
+
+
+    test('Autocompletes accounts', () => {
+      sandbox.stub(element.$.restAPI, 'getSuggestedAccounts', () =>
+        Promise.resolve([
+          {
+            name: 'fred',
+            email: 'fred@goog.co',
+          },
+        ])
+      );
+      return element._fetchAccounts('owner', 'fr').then(s => {
+        assert.deepEqual(s[0], {text: 'owner:fred@goog.co', label: 'fred'});
+      });
+    });
+
+    test('Inserts self as option when valid', () => {
+      sandbox.stub(element.$.restAPI, 'getSuggestedAccounts', () =>
+        Promise.resolve([
+          {
+            name: 'fred',
+            email: 'fred@goog.co',
+          },
+        ])
+      );
+      element._fetchAccounts('owner', 's').then(s => {
+        assert.deepEqual(s[0], {text: 'owner:fred@goog.co', label: 'fred'});
+        assert.deepEqual(s[1], {text: 'owner:self'});
+      }).then(() => element._fetchAccounts('owner', 'selfs')).then(s => {
+        assert.notEqual(s[0], {text: 'owner:self'});
+      });
+    });
+
+    test('Inserts me as option when valid', () => {
+      sandbox.stub(element.$.restAPI, 'getSuggestedAccounts', () =>
+        Promise.resolve([
+          {
+            name: 'fred',
+            email: 'fred@goog.co',
+          },
+        ])
+      );
+      return element._fetchAccounts('owner', 'm').then(s => {
+        assert.deepEqual(s[0], {text: 'owner:fred@goog.co', label: 'fred'});
+        assert.deepEqual(s[1], {text: 'owner:me'});
+      }).then(() => element._fetchAccounts('owner', 'meme')).then(s => {
+        assert.notEqual(s[0], {text: 'owner:me'});
+      });
+    });
+
+    test('Autocompletes groups', () => {
+      sandbox.stub(element.$.restAPI, 'getSuggestedGroups', () =>
+        Promise.resolve({
+          Polygerrit: 0,
+          gerrit: 0,
+          gerrittest: 0,
+        })
+      );
+      return element._fetchGroups('ownerin', 'pol').then(s => {
+        assert.deepEqual(s[0], {text: 'ownerin:Polygerrit'});
+      });
+    });
+
+    test('Autocompletes projects', () => {
+      sandbox.stub(element.$.restAPI, 'getSuggestedProjects', () =>
+        Promise.resolve({Polygerrit: 0}));
+      return element._fetchProjects('project', 'pol').then(s => {
+        assert.deepEqual(s[0], {text: 'project:Polygerrit'});
+      });
+    });
+
+    test('Autocomplete doesnt override exact matches to input', () => {
+      sandbox.stub(element.$.restAPI, 'getSuggestedGroups', () =>
+        Promise.resolve({
+          Polygerrit: 0,
+          gerrit: 0,
+          gerrittest: 0,
+        })
+      );
+      return element._fetchGroups('ownerin', 'gerrit').then(s => {
+        assert.deepEqual(s[0], {text: 'ownerin:Polygerrit'});
+        assert.deepEqual(s[1], {text: 'ownerin:gerrit'});
+        assert.deepEqual(s[2], {text: 'ownerin:gerrittest'});
+      });
+    });
+
+    test('Autocompletes accounts with no email', () => {
+      sandbox.stub(element.$.restAPI, 'getSuggestedAccounts', () =>
+        Promise.resolve([{name: 'fred'}]));
+      return element._fetchAccounts('owner', 'fr').then(s => {
+        assert.deepEqual(s[0], {text: 'owner:"fred"', label: 'fred'});
+      });
+    });
+
+    test('Autocompletes accounts with email', () => {
+      sandbox.stub(element.$.restAPI, 'getSuggestedAccounts', () =>
+        Promise.resolve([{email: 'fred@goog.co'}]));
+      return element._fetchAccounts('owner', 'fr').then(s => {
+        assert.deepEqual(s[0], {text: 'owner:fred@goog.co', label: ''});
+      });
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/diff/gr-comment-api/gr-comment-api-mock.js b/polygerrit-ui/app/elements/diff/gr-comment-api/gr-comment-api-mock.js
new file mode 100644
index 0000000..b7994e6
--- /dev/null
+++ b/polygerrit-ui/app/elements/diff/gr-comment-api/gr-comment-api-mock.js
@@ -0,0 +1,50 @@
+/**
+ * @license
+ * Copyright (C) 2017 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: 'comment-api-mock',
+
+    properties: {
+      _changeComments: Object,
+    },
+
+    loadComments() {
+      return this._reloadComments();
+    },
+
+    /**
+     * For the purposes of the mock, _reloadDrafts is not included because its
+     * response is the same type as reloadComments, just makes less API
+     * requests. Since this is for test purposes/mocked data anyway, keep this
+     * file simpler by just using _reloadComments here instead.
+     */
+    _reloadDraftsWithCallback(e) {
+      return this._reloadComments().then(() => {
+        return e.detail.resolve();
+      });
+    },
+
+    _reloadComments() {
+      return this.$.commentAPI.loadAll(this._changeNum)
+          .then(comments => {
+            this._changeComments = this.$.commentAPI._changeComments;
+          });
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/diff/gr-comment-api/gr-comment-api.html b/polygerrit-ui/app/elements/diff/gr-comment-api/gr-comment-api.html
index 68e2ff8..c31bd1166 100644
--- a/polygerrit-ui/app/elements/diff/gr-comment-api/gr-comment-api.html
+++ b/polygerrit-ui/app/elements/diff/gr-comment-api/gr-comment-api.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/diff/gr-comment-api/gr-comment-api.js b/polygerrit-ui/app/elements/diff/gr-comment-api/gr-comment-api.js
index ef39e1f..4b64f7b 100644
--- a/polygerrit-ui/app/elements/diff/gr-comment-api/gr-comment-api.js
+++ b/polygerrit-ui/app/elements/diff/gr-comment-api/gr-comment-api.js
@@ -1,33 +1,494 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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 PARENT = 'PARENT';
 
+  const Defs = {};
+
+  /**
+   * @typedef {{
+   *    basePatchNum: (string|number),
+   *    patchNum: (number),
+   * }}
+   */
+  Defs.patchRange;
+
+  /**
+   * @typedef {{
+   *    changeNum: number,
+   *    path: string,
+   *    patchRange: !Defs.patchRange,
+   *    projectConfig: (Object|undefined),
+   * }}
+   */
+  Defs.commentMeta;
+
+  /**
+   * @typedef {{
+   *    meta: !Defs.commentMeta,
+   *    left: !Array,
+   *    right: !Array,
+   * }}
+   */
+  Defs.commentsBySide;
+
+  /**
+   * Construct a change comments object, which can be data-bound to child
+   * elements of that which uses the gr-comment-api.
+   *
+   * @param {!Object} comments
+   * @param {!Object} robotComments
+   * @param {!Object} drafts
+   * @param {number} changeNum
+   * @constructor
+   */
+  function ChangeComments(comments, robotComments, drafts, changeNum) {
+    this._comments = comments;
+    this._robotComments = robotComments;
+    this._drafts = drafts;
+    this._changeNum = changeNum;
+  }
+
+  ChangeComments.prototype = {
+    get comments() {
+      return this._comments;
+    },
+    get drafts() {
+      return this._drafts;
+    },
+    get robotComments() {
+      return this._robotComments;
+    },
+  };
+
+  ChangeComments.prototype._patchNumEquals =
+      Gerrit.PatchSetBehavior.patchNumEquals;
+  ChangeComments.prototype._isMergeParent =
+      Gerrit.PatchSetBehavior.isMergeParent;
+  ChangeComments.prototype._getParentIndex =
+      Gerrit.PatchSetBehavior.getParentIndex;
+
+  /**
+   * Get an object mapping file paths to a boolean representing whether that
+   * path contains diff comments in the given patch set (including drafts and
+   * robot comments).
+   *
+   * Paths with comments are mapped to true, whereas paths without comments
+   * are not mapped.
+   *
+   * @param {Defs.patchRange=} opt_patchRange The patch-range object containing
+   *     patchNum and basePatchNum properties to represent the range.
+   * @return {!Object}
+   */
+  ChangeComments.prototype.getPaths = function(opt_patchRange) {
+    const responses = [this.comments, this.drafts, this.robotComments];
+    const commentMap = {};
+    for (const response of responses) {
+      for (const path in response) {
+        if (response.hasOwnProperty(path) &&
+            response[path].some(c => {
+              // If don't care about patch range, we know that the path exists.
+              if (!opt_patchRange) { return true; }
+              return this._isInPatchRange(c, opt_patchRange);
+            })) {
+          commentMap[path] = true;
+        }
+      }
+    }
+    return commentMap;
+  };
+
+  /**
+   * Gets all the comments and robot comments for the given change.
+   *
+   * @param {number=} opt_patchNum
+   * @return {!Object}
+   */
+  ChangeComments.prototype.getAllPublishedComments = function(opt_patchNum) {
+    return this.getAllComments(false, opt_patchNum);
+  };
+
+  /**
+   * Gets all the comments for a particular thread group. Used for refreshing
+   * comments after the thread group has already been built.
+   *
+   * @param {string} rootId
+   * @return {!Array} an array of comments
+   */
+  ChangeComments.prototype.getCommentsForThread = function(rootId) {
+    const allThreads = this.getAllThreadsForChange();
+    const threadMatch = allThreads.find(t => t.rootId === rootId);
+
+    // In the event that a single draft comment was removed by the thread-list
+    // and the diff view is updating comments, there will no longer be a thread
+    // found.  In this case, return null.
+    return threadMatch ? threadMatch.comments : null;
+  };
+
+  /**
+   * Filters an array of comments by line and side
+   *
+   * @param {!Array} comments
+   * @param {boolean} parentOnly whether the only comments returned should have
+   *   the side attribute set to PARENT
+   * @param {string} commentSide whether the comment was left on the left or the
+   *   right side regardless or unified or side-by-side
+   * @param {number=} opt_line line number, can be undefined if file comment
+   * @return {!Array} an array of comments
+   */
+  ChangeComments.prototype._filterCommentsBySideAndLine = function(comments,
+      parentOnly, commentSide, opt_line) {
+    return comments.filter(c => {
+      // if parentOnly, only match comments with PARENT for the side.
+      let sideMatch = parentOnly ? c.side === PARENT : c.side !== PARENT;
+      if (parentOnly) {
+        sideMatch = sideMatch && c.side === PARENT;
+      }
+      return sideMatch && c.line === opt_line;
+    }).map(c => {
+      c.__commentSide = commentSide;
+      return c;
+    });
+  };
+
+  /**
+   * Gets all the comments and robot comments for the given change.
+   *
+   * @param {boolean=} opt_includeDrafts
+   * @param {number=} opt_patchNum
+   * @return {!Object}
+   */
+  ChangeComments.prototype.getAllComments = function(opt_includeDrafts,
+      opt_patchNum) {
+    const paths = this.getPaths();
+    const publishedComments = {};
+    for (const path of Object.keys(paths)) {
+      let commentsToAdd = this.getAllCommentsForPath(path, opt_patchNum);
+      if (opt_includeDrafts) {
+        const drafts = this.getAllDraftsForPath(path, opt_patchNum)
+            .map(d => Object.assign({__draft: true}, d));
+        commentsToAdd = commentsToAdd.concat(drafts);
+      }
+      publishedComments[path] = commentsToAdd;
+    }
+    return publishedComments;
+  };
+
+  /**
+   * Gets all the comments and robot comments for the given change.
+   *
+   * @param {number=} opt_patchNum
+   * @return {!Object}
+   */
+  ChangeComments.prototype.getAllDrafts = function(opt_patchNum) {
+    const paths = this.getPaths();
+    const drafts = {};
+    for (const path of Object.keys(paths)) {
+      drafts[path] = this.getAllDraftsForPath(path, opt_patchNum);
+    }
+    return drafts;
+  };
+
+  /**
+   * Get the comments (robot comments) for a path and optional patch num.
+   *
+   * @param {!string} path
+   * @param {number=} opt_patchNum
+   * @param {boolean=} opt_includeDrafts
+   * @return {!Array}
+   */
+  ChangeComments.prototype.getAllCommentsForPath = function(path,
+      opt_patchNum, opt_includeDrafts) {
+    const comments = this._comments[path] || [];
+    const robotComments = this._robotComments[path] || [];
+    let allComments = comments.concat(robotComments);
+    if (opt_includeDrafts) {
+      const drafts = this.getAllDraftsForPath(path)
+          .map(d => Object.assign({__draft: true}, d));
+      allComments = allComments.concat(drafts);
+    }
+    if (!opt_patchNum) { return allComments; }
+    return (allComments || []).filter(c =>
+      this._patchNumEquals(c.patch_set, opt_patchNum)
+    );
+  };
+
+  /**
+   * Get the drafts for a path and optional patch num.
+   *
+   * @param {!string} path
+   * @param {number=} opt_patchNum
+   * @return {!Array}
+   */
+  ChangeComments.prototype.getAllDraftsForPath = function(path,
+      opt_patchNum) {
+    const comments = this._drafts[path] || [];
+    if (!opt_patchNum) { return comments; }
+    return (comments || []).filter(c =>
+      this._patchNumEquals(c.patch_set, opt_patchNum)
+    );
+  };
+
+  /**
+   * Get the comments (with drafts and robot comments) for a path and
+   * patch-range. Returns an object with left and right properties mapping to
+   * arrays of comments in on either side of the patch range for that path.
+   *
+   * @param {!string} path
+   * @param {!Defs.patchRange} patchRange The patch-range object containing patchNum
+   *     and basePatchNum properties to represent the range.
+   * @param {Object=} opt_projectConfig Optional project config object to
+   *     include in the meta sub-object.
+   * @return {!Defs.commentsBySide}
+   */
+  ChangeComments.prototype.getCommentsBySideForPath = function(path,
+      patchRange, opt_projectConfig) {
+    const comments = this.comments[path] || [];
+    const drafts = this.drafts[path] || [];
+    const robotComments = this.robotComments[path] || [];
+
+    drafts.forEach(d => { d.__draft = true; });
+
+    const all = comments.concat(drafts).concat(robotComments);
+
+    const baseComments = all.filter(c =>
+        this._isInBaseOfPatchRange(c, patchRange));
+    const revisionComments = all.filter(c =>
+        this._isInRevisionOfPatchRange(c, patchRange));
+
+    return {
+      meta: {
+        changeNum: this._changeNum,
+        path,
+        patchRange,
+        projectConfig: opt_projectConfig,
+      },
+      left: baseComments,
+      right: revisionComments,
+    };
+  };
+
+  /**
+   * @param {!Object} comments Object keyed by file, with a value of an array
+   *   of comments left on that file.
+   * @return {!Array} A flattened list of all comments, where each comment
+   *   also includes the file that it was left on, which was the key of the
+   *   originall object.
+   */
+  ChangeComments.prototype._commentObjToArrayWithFile = function(comments) {
+    let commentArr = [];
+    for (const file of Object.keys(comments)) {
+      const commentsForFile = [];
+      for (const comment of comments[file]) {
+        commentsForFile.push(Object.assign({__path: file}, comment));
+      }
+      commentArr = commentArr.concat(commentsForFile);
+    }
+    return commentArr;
+  };
+
+  ChangeComments.prototype._commentObjToArray = function(comments) {
+    let commentArr = [];
+    for (const file of Object.keys(comments)) {
+      commentArr = commentArr.concat(comments[file]);
+    }
+    return commentArr;
+  };
+
+  /**
+   * Computes a string counting the number of commens in a given file and path.
+   *
+   * @param {number} patchNum
+   * @param {string=} opt_path
+   * @return {number}
+   */
+  ChangeComments.prototype.computeCommentCount = function(patchNum, opt_path) {
+    if (opt_path) {
+      return this.getAllCommentsForPath(opt_path, patchNum).length;
+    }
+    const allComments = this.getAllPublishedComments(patchNum);
+    return this._commentObjToArray(allComments).length;
+  };
+
+  /**
+   * Computes a string counting the number of draft comments in the entire
+   * change, optionally filtered by path and/or patchNum.
+   *
+   * @param {number=} opt_patchNum
+   * @param {string=} opt_path
+   * @return {number}
+   */
+  ChangeComments.prototype.computeDraftCount = function(opt_patchNum,
+      opt_path) {
+    if (opt_path) {
+      return this.getAllDraftsForPath(opt_path, opt_patchNum).length;
+    }
+    const allDrafts = this.getAllDrafts(opt_patchNum);
+    return this._commentObjToArray(allDrafts).length;
+  };
+
+  /**
+   * Computes a number of unresolved comment threads in a given file and path.
+   *
+   * @param {number} patchNum
+   * @param {string=} opt_path
+   * @return {number}
+   */
+  ChangeComments.prototype.computeUnresolvedNum = function(patchNum,
+      opt_path) {
+    let comments = [];
+    let drafts = [];
+
+    if (opt_path) {
+      comments = this.getAllCommentsForPath(opt_path, patchNum);
+      drafts = this.getAllDraftsForPath(opt_path, patchNum);
+    } else {
+      comments = this._commentObjToArray(
+          this.getAllPublishedComments(patchNum));
+    }
+
+    comments = comments.concat(drafts);
+
+    const threads = this.getCommentThreads(this._sortComments(comments));
+
+    const unresolvedThreads = threads
+      .filter(thread =>
+          thread.comments.length &&
+          thread.comments[thread.comments.length - 1].unresolved);
+
+    return unresolvedThreads.length;
+  };
+
+  ChangeComments.prototype.getAllThreadsForChange = function() {
+    const comments = this._commentObjToArrayWithFile(this.getAllComments(true));
+    const sortedComments = this._sortComments(comments);
+    return this.getCommentThreads(sortedComments);
+  };
+
+  ChangeComments.prototype._sortComments = function(comments) {
+    return comments.slice(0).sort((c1, c2) => {
+      return util.parseDate(c1.updated) - util.parseDate(c2.updated);
+    });
+  };
+
+  /**
+   * Computes all of the comments in thread format.
+   *
+   * @param {!Array} comments sorted by updated timestamp.
+   * @return {!Array}
+   */
+  ChangeComments.prototype.getCommentThreads = function(comments) {
+    const threads = [];
+    const idThreadMap = {};
+    for (const comment of comments) {
+      // If the comment is in reply to another comment, find that comment's
+      // thread and append to it.
+      if (comment.in_reply_to) {
+        const thread = idThreadMap[comment.in_reply_to];
+        if (thread) {
+          thread.comments.push(comment);
+          idThreadMap[comment.id] = thread;
+          continue;
+        }
+      }
+
+      // Otherwise, this comment starts its own thread.
+      const newThread = {
+        comments: [comment],
+        patchNum: comment.patch_set,
+        path: comment.__path,
+        line: comment.line,
+        rootId: comment.id,
+      };
+      if (comment.side) {
+        newThread.commentSide = comment.side;
+      }
+      threads.push(newThread);
+      idThreadMap[comment.id] = newThread;
+    }
+    return threads;
+  };
+
+  /**
+  * Whether the given comment should be included in the base side of the
+  * given patch range.
+  * @param {!Object} comment
+  * @param {!Defs.patchRange} range
+  * @return {boolean}
+  */
+  ChangeComments.prototype._isInBaseOfPatchRange = function(comment, range) {
+    // If the base of the patch range is a parent of a merge, and the comment
+    // appears on a specific parent then only show the comment if the parent
+    // index of the comment matches that of the range.
+    if (comment.parent && comment.side === PARENT) {
+      return this._isMergeParent(range.basePatchNum) &&
+          comment.parent === this._getParentIndex(range.basePatchNum);
+    }
+
+    // If the base of the range is the parent of the patch:
+    if (range.basePatchNum === PARENT &&
+        comment.side === PARENT &&
+        this._patchNumEquals(comment.patch_set, range.patchNum)) {
+      return true;
+    }
+    // If the base of the range is not the parent of the patch:
+    if (range.basePatchNum !== PARENT &&
+        comment.side !== PARENT &&
+        this._patchNumEquals(comment.patch_set, range.basePatchNum)) {
+      return true;
+    }
+    return false;
+  };
+
+  /**
+   * Whether the given comment should be included in the revision side of the
+   * given patch range.
+   * @param {!Object} comment
+   * @param {!Defs.patchRange} range
+   * @return {boolean}
+   */
+  ChangeComments.prototype._isInRevisionOfPatchRange = function(comment,
+      range) {
+    return comment.side !== PARENT &&
+        this._patchNumEquals(comment.patch_set, range.patchNum);
+  };
+
+  /**
+   * Whether the given comment should be included in the given patch range.
+   * @param {!Object} comment
+   * @param {!Defs.patchRange} range
+   * @return {boolean|undefined}
+   */
+  ChangeComments.prototype._isInPatchRange = function(comment, range) {
+    return this._isInBaseOfPatchRange(comment, range) ||
+        this._isInRevisionOfPatchRange(comment, range);
+  };
+
   Polymer({
     is: 'gr-comment-api',
 
     properties: {
-      /** @type {number} */
-      _changeNum: Number,
-      /** @type {!Object|undefined} */
-      _comments: Object,
-      /** @type {!Object|undefined} */
-      _drafts: Object,
-      /** @type {!Object|undefined} */
-      _robotComments: Object,
+      _changeComments: Object,
+    },
+
+    listeners: {
+      'reload-drafts': 'reloadDrafts',
     },
 
     behaviors: [
@@ -40,135 +501,38 @@
      * does not yield the comment data.
      *
      * @param {number} changeNum
-     * @return {!Promise}
+     * @return {!Promise<!Object>}
      */
     loadAll(changeNum) {
-      this._changeNum = changeNum;
-
-      // Reset comment arrays.
-      this._comments = undefined;
-      this._drafts = undefined;
-      this._robotComments = undefined;
-
       const promises = [];
-      promises.push(this.$.restAPI.getDiffComments(changeNum)
-          .then(comments => { this._comments = comments; }));
-      promises.push(this.$.restAPI.getDiffRobotComments(changeNum)
-          .then(robotComments => { this._robotComments = robotComments; }));
-      promises.push(this.$.restAPI.getDiffDrafts(changeNum)
-          .then(drafts => { this._drafts = drafts; }));
+      promises.push(this.$.restAPI.getDiffComments(changeNum));
+      promises.push(this.$.restAPI.getDiffRobotComments(changeNum));
+      promises.push(this.$.restAPI.getDiffDrafts(changeNum));
 
-      return Promise.all(promises);
+      return Promise.all(promises).then(([comments, robotComments, drafts]) => {
+        this._changeComments = new ChangeComments(comments,
+          robotComments, drafts, changeNum);
+        return this._changeComments;
+      });
     },
 
     /**
-     * Get an object mapping file paths to a boolean representing whether that
-     * path contains diff comments in the given patch set (including drafts and
-     * robot comments).
+     * Re-initialize _changeComments with a new ChangeComments object, that
+     * uses the previous values for comments and robot comments, but fetches
+     * updated draft comments.
      *
-     * Paths with comments are mapped to true, whereas paths without comments
-     * are not mapped.
-     *
-     * @param {!Object} patchRange The patch-range object containing patchNum
-     *     and basePatchNum properties to represent the range.
-     * @return {Object}
+     * @param {number} changeNum
+     * @return {!Promise<!Object>}
      */
-    getPaths(patchRange) {
-      const responses = [this._comments, this._drafts, this._robotComments];
-      const commentMap = {};
-      for (const response of responses) {
-        for (const path in response) {
-          if (response.hasOwnProperty(path) &&
-              response[path].some(c => this._isInPatchRange(c, patchRange))) {
-            commentMap[path] = true;
-          }
-        }
+    reloadDrafts(changeNum) {
+      if (!this._changeComments) {
+        return this.loadAll(changeNum);
       }
-      return commentMap;
-    },
-
-    /**
-     * Get the comments (with drafts and robot comments) for a path and
-     * patch-range. Returns an object with left and right properties mapping to
-     * arrays of comments in on either side of the patch range for that path.
-     *
-     * @param {!string} path
-     * @param {!Object} patchRange The patch-range object containing patchNum
-     *     and basePatchNum properties to represent the range.
-     * @param {Object=} opt_projectConfig Optional project config object to
-     *     include in the meta sub-object.
-     * @return {Object}
-     */
-    getCommentsForPath(path, patchRange, opt_projectConfig) {
-      const comments = this._comments[path] || [];
-      const drafts = this._drafts[path] || [];
-      const robotComments = this._robotComments[path] || [];
-
-      drafts.forEach(d => { d.__draft = true; });
-
-      const all = comments.concat(drafts).concat(robotComments);
-
-      const baseComments = all.filter(c =>
-          this._isInBaseOfPatchRange(c, patchRange));
-      const revisionComments = all.filter(c =>
-          this._isInRevisionOfPatchRange(c, patchRange));
-
-      return {
-        meta: {
-          changeNum: this._changeNum,
-          path,
-          patchRange,
-          projectConfig: opt_projectConfig,
-        },
-        left: baseComments,
-        right: revisionComments,
-      };
-    },
-
-    /**
-     * Whether the given comment should be included in the base side of the
-     * given patch range.
-     * @param {!Object} comment
-     * @param {!Object} range
-     * @return {boolean}
-     */
-    _isInBaseOfPatchRange(comment, range) {
-      // If the base of the range is the parent of the patch:
-      if (range.basePatchNum === PARENT &&
-          comment.side === PARENT &&
-          this.patchNumEquals(comment.patch_set, range.patchNum)) {
-        return true;
-      }
-      // If the base of the range is not the parent of the patch:
-      if (range.basePatchNum !== PARENT &&
-          comment.side !== PARENT &&
-          this.patchNumEquals(comment.patch_set, range.basePatchNum)) {
-        return true;
-      }
-      return false;
-    },
-
-    /**
-     * Whether the given comment should be included in the revision side of the
-     * given patch range.
-     * @param {!Object} comment
-     * @param {!Object} range
-     * @return {boolean}
-     */
-    _isInRevisionOfPatchRange(comment, range) {
-      return comment.side !== PARENT &&
-          this.patchNumEquals(comment.patch_set, range.patchNum);
-    },
-
-    /**
-     * Whether the given comment should be included in the given patch range.
-     * @param {!Object} comment
-     * @param {!Object} range
-     * @return {boolean|undefined}
-     */
-    _isInPatchRange(comment, range) {
-      return this._isInBaseOfPatchRange(comment, range) ||
-          this._isInRevisionOfPatchRange(comment, range);
+      return this.$.restAPI.getDiffDrafts(changeNum).then(drafts => {
+        this._changeComments = new ChangeComments(this._changeComments.comments,
+            this._changeComments.robotComments, drafts, changeNum);
+        return this._changeComments;
+      });
     },
   });
 })();
diff --git a/polygerrit-ui/app/elements/diff/gr-comment-api/gr-comment-api_test.html b/polygerrit-ui/app/elements/diff/gr-comment-api/gr-comment-api_test.html
index 09403a4..1e53a14 100644
--- a/polygerrit-ui/app/elements/diff/gr-comment-api/gr-comment-api_test.html
+++ b/polygerrit-ui/app/elements/diff/gr-comment-api/gr-comment-api_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -67,9 +68,9 @@
             changeNum));
         assert.isTrue(element.$.restAPI.getDiffDrafts.calledWithExactly(
             changeNum));
-        assert.isOk(element._comments);
-        assert.isOk(element._robotComments);
-        assert.deepEqual(element._drafts, {});
+        assert.isOk(element._changeComments._comments);
+        assert.isOk(element._changeComments._robotComments);
+        assert.deepEqual(element._changeComments._drafts, {});
       });
     });
 
@@ -94,102 +95,631 @@
             changeNum));
         assert.isTrue(element.$.restAPI.getDiffDrafts.calledWithExactly(
             changeNum));
-        assert.isOk(element._comments);
-        assert.isOk(element._robotComments);
-        assert.notDeepEqual(element._drafts, {});
+        assert.isOk(element._changeComments._comments);
+        assert.isOk(element._changeComments._robotComments);
+        assert.notDeepEqual(element._changeComments._drafts, {});
       });
     });
 
-    test('_isInBaseOfPatchRange', () => {
-      const comment = {patch_set: 1};
-      const patchRange = {basePatchNum: 1, patchNum: 2};
-      assert.isTrue(element._isInBaseOfPatchRange(comment, patchRange));
-
-      patchRange.basePatchNum = PARENT;
-      assert.isFalse(element._isInBaseOfPatchRange(comment, patchRange));
-
-      comment.side = PARENT;
-      assert.isFalse(element._isInBaseOfPatchRange(comment, patchRange));
-
-      comment.patch_set = 2;
-      assert.isTrue(element._isInBaseOfPatchRange(comment, patchRange));
-    });
-
-    test('_isInRevisionOfPatchRange', () => {
-      const comment = {patch_set: 123};
-      const patchRange = {basePatchNum: 122, patchNum: 124};
-      assert.isFalse(element._isInRevisionOfPatchRange(comment, patchRange));
-
-      patchRange.patchNum = 123;
-      assert.isTrue(element._isInRevisionOfPatchRange(comment, patchRange));
-
-      comment.side = PARENT;
-      assert.isFalse(element._isInRevisionOfPatchRange(comment, patchRange));
-    });
-
-    suite('comment ranges and paths', () => {
+    suite('reloadDrafts', () => {
+      let commentStub;
+      let robotCommentStub;
+      let draftStub;
       setup(() => {
-        element._changeNum = 1234;
-        element._drafts = {};
-        element._robotComments = {};
-        element._comments = {
-          'file/one': [
-            {patch_set: 2, side: PARENT},
-            {patch_set: 2},
-          ],
-          'file/two': [
-            {patch_set: 2},
-            {patch_set: 3},
-          ],
-          'file/three': [
-            {patch_set: 2, side: PARENT},
-            {patch_set: 3},
-          ],
-        };
+        commentStub = sandbox.stub(element.$.restAPI, 'getDiffComments')
+          .returns(Promise.resolve({}));
+        robotCommentStub = sandbox.stub(element.$.restAPI,
+            'getDiffRobotComments').returns(Promise.resolve({}));
+        draftStub = sandbox.stub(element.$.restAPI, 'getDiffDrafts')
+            .returns(Promise.resolve({}));
       });
 
-      test('getPaths', () => {
-        const patchRange = {basePatchNum: 1, patchNum: 4};
-        let paths = element.getPaths(patchRange);
-        assert.equal(Object.keys(paths).length, 0);
-
-        patchRange.basePatchNum = PARENT;
-        patchRange.patchNum = 3;
-        paths = element.getPaths(patchRange);
-        assert.notProperty(paths, 'file/one');
-        assert.property(paths, 'file/two');
-        assert.property(paths, 'file/three');
-
-        patchRange.patchNum = 2;
-        paths = element.getPaths(patchRange);
-        assert.property(paths, 'file/one');
-        assert.property(paths, 'file/two');
-        assert.property(paths, 'file/three');
+      test('without loadAll first', done => {
+        assert.isNotOk(element._changeComments);
+        sandbox.spy(element, 'loadAll');
+        element.reloadDrafts().then(() => {
+          assert.isTrue(element.loadAll.called);
+          assert.isOk(element._changeComments);
+          assert.equal(commentStub.callCount, 1);
+          assert.equal(robotCommentStub.callCount, 1);
+          assert.equal(draftStub.callCount, 1);
+          done();
+        });
       });
 
-      test('getCommentsForPath', () => {
-        const patchRange = {basePatchNum: 1, patchNum: 3};
-        let path = 'file/one';
-        let comments = element.getCommentsForPath(path, patchRange);
-        assert.equal(comments.meta.changeNum, 1234);
-        assert.equal(comments.left.length, 0);
-        assert.equal(comments.right.length, 0);
+      test('with loadAll first', done => {
+        assert.isNotOk(element._changeComments);
+        element.loadAll().then(() => {
+          assert.isOk(element._changeComments);
+          assert.equal(commentStub.callCount, 1);
+          assert.equal(robotCommentStub.callCount, 1);
+          assert.equal(draftStub.callCount, 1);
+          return element.reloadDrafts();
+        }).then(() => {
+          assert.isOk(element._changeComments);
+          assert.equal(commentStub.callCount, 1);
+          assert.equal(robotCommentStub.callCount, 1);
+          assert.equal(draftStub.callCount, 2);
+          done();
+        });
+      });
+    });
 
-        path = 'file/two';
-        comments = element.getCommentsForPath(path, patchRange);
-        assert.equal(comments.left.length, 0);
-        assert.equal(comments.right.length, 1);
+    suite('_changeComment methods', () => {
+      setup(done => {
+        const changeNum = 1234;
+        stub('gr-rest-api-interface', {
+          getDiffComments() { return Promise.resolve({}); },
+          getDiffRobotComments() { return Promise.resolve({}); },
+          getDiffDrafts() { return Promise.resolve({}); },
+        });
+        element.loadAll(changeNum).then(() => {
+          done();
+        });
+      });
 
-        patchRange.basePatchNum = 2;
-        comments = element.getCommentsForPath(path, patchRange);
-        assert.equal(comments.left.length, 1);
-        assert.equal(comments.right.length, 1);
+      test('_isInBaseOfPatchRange', () => {
+        const comment = {patch_set: 1};
+        const patchRange = {basePatchNum: 1, patchNum: 2};
+        assert.isTrue(element._changeComments._isInBaseOfPatchRange(comment,
+            patchRange));
 
         patchRange.basePatchNum = PARENT;
-        path = 'file/three';
-        comments = element.getCommentsForPath(path, patchRange);
-        assert.equal(comments.left.length, 0);
-        assert.equal(comments.right.length, 1);
+        assert.isFalse(element._changeComments._isInBaseOfPatchRange(comment,
+            patchRange));
+
+        comment.side = PARENT;
+        assert.isFalse(element._changeComments._isInBaseOfPatchRange(comment,
+            patchRange));
+
+        comment.patch_set = 2;
+        assert.isTrue(element._changeComments._isInBaseOfPatchRange(comment,
+            patchRange));
+
+        patchRange.basePatchNum = -2;
+        comment.side = PARENT;
+        comment.parent = 1;
+        assert.isFalse(element._changeComments._isInBaseOfPatchRange(comment,
+            patchRange));
+
+        comment.parent = 2;
+        assert.isTrue(element._changeComments._isInBaseOfPatchRange(comment,
+            patchRange));
+      });
+
+      test('_isInRevisionOfPatchRange', () => {
+        const comment = {patch_set: 123};
+        const patchRange = {basePatchNum: 122, patchNum: 124};
+        assert.isFalse(element._changeComments._isInRevisionOfPatchRange(
+            comment, patchRange));
+
+        patchRange.patchNum = 123;
+        assert.isTrue(element._changeComments._isInRevisionOfPatchRange(
+            comment, patchRange));
+
+        comment.side = PARENT;
+        assert.isFalse(element._changeComments._isInRevisionOfPatchRange(
+            comment, patchRange));
+      });
+
+      test('_isInPatchRange', () => {
+        const patchRange1 = {basePatchNum: 122, patchNum: 124};
+        const patchRange2 = {basePatchNum: 123, patchNum: 125};
+        const patchRange3 = {basePatchNum: 124, patchNum: 125};
+
+        const isInBasePatchStub = sandbox.stub(element._changeComments,
+            '_isInBaseOfPatchRange');
+        const isInRevisionPatchStub = sandbox.stub(element._changeComments,
+            '_isInRevisionOfPatchRange');
+
+        isInBasePatchStub.withArgs({}, patchRange1).returns(true);
+        isInBasePatchStub.withArgs({}, patchRange2).returns(false);
+        isInBasePatchStub.withArgs({}, patchRange3).returns(false);
+
+        isInRevisionPatchStub.withArgs({}, patchRange1).returns(false);
+        isInRevisionPatchStub.withArgs({}, patchRange2).returns(true);
+        isInRevisionPatchStub.withArgs({}, patchRange3).returns(false);
+
+        assert.isTrue(element._changeComments._isInPatchRange({}, patchRange1));
+        assert.isTrue(element._changeComments._isInPatchRange({}, patchRange2));
+        assert.isFalse(element._changeComments._isInPatchRange({},
+            patchRange3));
+      });
+
+      suite('comment ranges and paths', () => {
+        function makeTime(mins) {
+          return `2013-02-26 15:0${mins}:43.986000000`;
+        }
+
+        setup(() => {
+          element._changeComments._drafts = {
+            'file/one': [
+              {
+                id: 11,
+                patch_set: 2,
+                side: PARENT,
+                line: 1,
+                updated: makeTime(3),
+              },
+              {
+                id: 12,
+                in_reply_to: 2,
+                patch_set: 2,
+                line: 1,
+                updated: makeTime(3),
+              },
+            ],
+            'file/two': [
+              {
+                id: 5,
+                patch_set: 3,
+                line: 1,
+                updated: makeTime(3),
+              },
+            ],
+          };
+          element._changeComments._robotComments = {
+            'file/one': [
+              {
+                id: 1,
+                patch_set: 2,
+                side: PARENT,
+                line: 1,
+                updated: makeTime(1),
+                range: {
+                  start_line: 1,
+                  start_character: 2,
+                  end_line: 2,
+                  end_character: 2,
+                },
+              }, {
+                id: 2,
+                in_reply_to: 4,
+                patch_set: 2,
+                unresolved: true,
+                line: 1,
+                updated: makeTime(2),
+              },
+            ],
+          };
+          element._changeComments._comments = {
+            'file/one': [
+              {id: 3, patch_set: 2, side: PARENT, line: 2, updated: makeTime(1)},
+              {id: 4, patch_set: 2, line: 1, updated: makeTime(1)},
+            ],
+            'file/two': [
+              {id: 5, patch_set: 2, line: 2, updated: makeTime(1)},
+              {id: 6, patch_set: 3, line: 2, updated: makeTime(1)},
+            ],
+            'file/three': [
+              {
+                id: 7,
+                patch_set: 2,
+                side: PARENT,
+                unresolved: true,
+                line: 1,
+                updated: makeTime(1),
+              },
+              {id: 8, patch_set: 3, line: 1, updated: makeTime(1)},
+            ],
+            'file/four': [
+              {id: 9, patch_set: 5, side: PARENT, line: 1, updated: makeTime(1)},
+              {id: 10, patch_set: 5, line: 1, updated: makeTime(1)},
+            ],
+          };
+        });
+
+        test('getPaths', () => {
+          const patchRange = {basePatchNum: 1, patchNum: 4};
+          let paths = element._changeComments.getPaths(patchRange);
+          assert.equal(Object.keys(paths).length, 0);
+
+          patchRange.basePatchNum = PARENT;
+          patchRange.patchNum = 3;
+          paths = element._changeComments.getPaths(patchRange);
+          assert.notProperty(paths, 'file/one');
+          assert.property(paths, 'file/two');
+          assert.property(paths, 'file/three');
+          assert.notProperty(paths, 'file/four');
+
+          patchRange.patchNum = 2;
+          paths = element._changeComments.getPaths(patchRange);
+          assert.property(paths, 'file/one');
+          assert.property(paths, 'file/two');
+          assert.property(paths, 'file/three');
+          assert.notProperty(paths, 'file/four');
+
+          paths = element._changeComments.getPaths();
+          assert.property(paths, 'file/one');
+          assert.property(paths, 'file/two');
+          assert.property(paths, 'file/three');
+          assert.property(paths, 'file/four');
+        });
+
+        test('getCommentsBySideForPath', () => {
+          const patchRange = {basePatchNum: 1, patchNum: 3};
+          let path = 'file/one';
+          let comments = element._changeComments.getCommentsBySideForPath(path,
+              patchRange);
+          assert.equal(comments.meta.changeNum, 1234);
+          assert.equal(comments.left.length, 0);
+          assert.equal(comments.right.length, 0);
+
+          path = 'file/two';
+          comments = element._changeComments.getCommentsBySideForPath(path,
+              patchRange);
+          assert.equal(comments.left.length, 0);
+          assert.equal(comments.right.length, 2);
+
+          patchRange.basePatchNum = 2;
+          comments = element._changeComments.getCommentsBySideForPath(path,
+              patchRange);
+          assert.equal(comments.left.length, 1);
+          assert.equal(comments.right.length, 2);
+
+          patchRange.basePatchNum = PARENT;
+          path = 'file/three';
+          comments = element._changeComments.getCommentsBySideForPath(path,
+              patchRange);
+          assert.equal(comments.left.length, 0);
+          assert.equal(comments.right.length, 1);
+        });
+
+        test('getAllCommentsForPath', () => {
+          let path = 'file/one';
+          let comments = element._changeComments.getAllCommentsForPath(path);
+          assert.deepEqual(comments.length, 4);
+          path = 'file/two';
+          comments = element._changeComments.getAllCommentsForPath(path, 2);
+          assert.deepEqual(comments.length, 1);
+        });
+
+        test('getAllDraftsForPath', () => {
+          const path = 'file/one';
+          const drafts = element._changeComments.getAllDraftsForPath(path);
+          assert.deepEqual(drafts.length, 2);
+        });
+
+        test('computeUnresolvedNum', () => {
+          assert.equal(element._changeComments
+              .computeUnresolvedNum(2, 'file/one'), 0);
+          assert.equal(element._changeComments
+              .computeUnresolvedNum(1, 'file/one'), 0);
+          assert.equal(element._changeComments
+              .computeUnresolvedNum(2, 'file/three'), 1);
+        });
+
+        test('computeUnresolvedNum w/ non-linear thread', () => {
+          element._changeComments._drafts = {};
+          element._changeComments._robotComments = {};
+          element._changeComments._comments = {
+            path: [{
+              id: '9c6ba3c6_28b7d467',
+              patch_set: 1,
+              updated: '2018-02-28 14:41:13.000000000',
+              unresolved: true,
+            }, {
+              id: '3df7b331_0bead405',
+              patch_set: 1,
+              in_reply_to: '1c346623_ab85d14a',
+              updated: '2018-02-28 23:07:55.000000000',
+              unresolved: false,
+            }, {
+              id: '6153dce6_69958d1e',
+              patch_set: 1,
+              in_reply_to: '9c6ba3c6_28b7d467',
+              updated: '2018-02-28 17:11:31.000000000',
+              unresolved: true,
+            }, {
+              id: '1c346623_ab85d14a',
+              patch_set: 1,
+              in_reply_to: '9c6ba3c6_28b7d467',
+              updated: '2018-02-28 23:01:39.000000000',
+              unresolved: false,
+            }],
+          };
+          assert.equal(
+              element._changeComments.computeUnresolvedNum(1, 'path'), 0);
+        });
+
+        test('computeCommentCount', () => {
+          assert.equal(element._changeComments
+              .computeCommentCount(2, 'file/one'), 4);
+          assert.equal(element._changeComments
+              .computeCommentCount(1, 'file/one'), 0);
+          assert.equal(element._changeComments
+              .computeCommentCount(2, 'file/three'), 1);
+        });
+
+        test('computeDraftCount', () => {
+          assert.equal(element._changeComments
+              .computeDraftCount(2, 'file/one'), 2);
+          assert.equal(element._changeComments
+              .computeDraftCount(1, 'file/one'), 0);
+          assert.equal(element._changeComments
+              .computeDraftCount(2, 'file/three'), 0);
+          assert.equal(element._changeComments
+              .computeDraftCount(), 3);
+        });
+
+        test('getAllPublishedComments', () => {
+          let publishedComments = element._changeComments
+              .getAllPublishedComments();
+          assert.equal(Object.keys(publishedComments).length, 4);
+          assert.equal(Object.keys(publishedComments[['file/one']]).length, 4);
+          assert.equal(Object.keys(publishedComments[['file/two']]).length, 2);
+          publishedComments = element._changeComments
+              .getAllPublishedComments(2);
+          assert.equal(Object.keys(publishedComments[['file/one']]).length, 4);
+          assert.equal(Object.keys(publishedComments[['file/two']]).length, 1);
+        });
+
+        test('getAllComments', () => {
+          let comments = element._changeComments.getAllComments();
+          assert.equal(Object.keys(comments).length, 4);
+          assert.equal(Object.keys(comments[['file/one']]).length, 4);
+          assert.equal(Object.keys(comments[['file/two']]).length, 2);
+          comments = element._changeComments.getAllComments(false, 2);
+          assert.equal(Object.keys(comments).length, 4);
+          assert.equal(Object.keys(comments[['file/one']]).length, 4);
+          assert.equal(Object.keys(comments[['file/two']]).length, 1);
+          // Include drafts
+          comments = element._changeComments.getAllComments(true);
+          assert.equal(Object.keys(comments).length, 4);
+          assert.equal(Object.keys(comments[['file/one']]).length, 6);
+          assert.equal(Object.keys(comments[['file/two']]).length, 3);
+          comments = element._changeComments.getAllComments(true, 2);
+          assert.equal(Object.keys(comments).length, 4);
+          assert.equal(Object.keys(comments[['file/one']]).length, 6);
+          assert.equal(Object.keys(comments[['file/two']]).length, 1);
+        });
+
+        test('computeAllThreads', () => {
+          const expectedThreads = [
+            {
+              comments: [
+                {
+                  id: 5,
+                  patch_set: 2,
+                  line: 2,
+                  __path: 'file/two',
+                  updated: '2013-02-26 15:01:43.986000000',
+                },
+              ],
+              patchNum: 2,
+              path: 'file/two',
+              line: 2,
+              rootId: 5,
+            }, {
+              comments: [
+                {
+                  id: 3,
+                  patch_set: 2,
+                  side: 'PARENT',
+                  line: 2,
+                  __path: 'file/one',
+                  updated: '2013-02-26 15:01:43.986000000',
+                },
+              ],
+              commentSide: 'PARENT',
+              patchNum: 2,
+              path: 'file/one',
+              line: 2,
+              rootId: 3,
+            }, {
+              comments: [
+                {
+                  id: 1,
+                  patch_set: 2,
+                  side: 'PARENT',
+                  line: 1,
+                  updated: '2013-02-26 15:01:43.986000000',
+                  range: {
+                    start_line: 1,
+                    start_character: 2,
+                    end_line: 2,
+                    end_character: 2,
+                  },
+                  __path: 'file/one',
+                },
+              ],
+              commentSide: 'PARENT',
+              patchNum: 2,
+              path: 'file/one',
+              line: 1,
+              rootId: 1,
+            }, {
+              comments: [
+                {
+                  id: 9,
+                  patch_set: 5,
+                  side: 'PARENT',
+                  line: 1,
+                  __path: 'file/four',
+                  updated: '2013-02-26 15:01:43.986000000',
+                },
+              ],
+              commentSide: 'PARENT',
+              patchNum: 5,
+              path: 'file/four',
+              line: 1,
+              rootId: 9,
+            }, {
+              comments: [
+                {
+                  id: 8,
+                  patch_set: 3,
+                  line: 1,
+                  __path: 'file/three',
+                  updated: '2013-02-26 15:01:43.986000000',
+                },
+              ],
+              patchNum: 3,
+              path: 'file/three',
+              line: 1,
+              rootId: 8,
+            }, {
+              comments: [
+                {
+                  id: 7,
+                  patch_set: 2,
+                  side: 'PARENT',
+                  unresolved: true,
+                  line: 1,
+                  __path: 'file/three',
+                  updated: '2013-02-26 15:01:43.986000000',
+                },
+              ],
+              commentSide: 'PARENT',
+              patchNum: 2,
+              path: 'file/three',
+              line: 1,
+              rootId: 7,
+            }, {
+              comments: [
+                {
+                  id: 4,
+                  patch_set: 2,
+                  line: 1,
+                  __path: 'file/one',
+                  updated: '2013-02-26 15:01:43.986000000',
+                },
+                {
+                  id: 2,
+                  in_reply_to: 4,
+                  patch_set: 2,
+                  unresolved: true,
+                  line: 1,
+                  __path: 'file/one',
+                  updated: '2013-02-26 15:02:43.986000000',
+                },
+                {
+                  id: 12,
+                  in_reply_to: 2,
+                  patch_set: 2,
+                  line: 1,
+                  __path: 'file/one',
+                  __draft: true,
+                  updated: '2013-02-26 15:03:43.986000000',
+                },
+              ],
+              patchNum: 2,
+              path: 'file/one',
+              line: 1,
+              rootId: 4,
+            }, {
+              comments: [
+                {
+                  id: 6,
+                  patch_set: 3,
+                  line: 2,
+                  __path: 'file/two',
+                  updated: '2013-02-26 15:01:43.986000000',
+                },
+              ],
+              patchNum: 3,
+              path: 'file/two',
+              line: 2,
+              rootId: 6,
+            }, {
+              comments: [
+                {
+                  id: 10,
+                  patch_set: 5,
+                  line: 1,
+                  __path: 'file/four',
+                  updated: '2013-02-26 15:01:43.986000000',
+                },
+              ],
+              rootId: 10,
+              patchNum: 5,
+              path: 'file/four',
+              line: 1,
+            }, {
+              comments: [
+                {
+                  id: 5,
+                  patch_set: 3,
+                  line: 1,
+                  __path: 'file/two',
+                  __draft: true,
+                  updated: '2013-02-26 15:03:43.986000000',
+                },
+              ],
+              rootId: 5,
+              patchNum: 3,
+              path: 'file/two',
+              line: 1,
+            }, {
+              comments: [
+                {
+                  id: 11,
+                  patch_set: 2,
+                  side: 'PARENT',
+                  line: 1,
+                  __path: 'file/one',
+                  __draft: true,
+                  updated: '2013-02-26 15:03:43.986000000',
+                },
+              ],
+              rootId: 11,
+              commentSide: 'PARENT',
+              patchNum: 2,
+              path: 'file/one',
+              line: 1,
+            },
+          ];
+          const threads = element._changeComments.getAllThreadsForChange();
+          assert.deepEqual(threads, expectedThreads);
+        });
+
+        test('getCommentsForThreadGroup', () => {
+          let expectedComments = [
+            {
+              __path: 'file/one',
+              id: 4,
+              patch_set: 2,
+              line: 1,
+              updated: '2013-02-26 15:01:43.986000000',
+            },
+            {
+              __path: 'file/one',
+              id: 2,
+              in_reply_to: 4,
+              patch_set: 2,
+              unresolved: true,
+              line: 1,
+              updated: '2013-02-26 15:02:43.986000000',
+            },
+            {
+              __path: 'file/one',
+              __draft: true,
+              id: 12,
+              in_reply_to: 2,
+              patch_set: 2,
+              line: 1,
+              updated: '2013-02-26 15:03:43.986000000',
+            },
+          ];
+          assert.deepEqual(element._changeComments.getCommentsForThread(4),
+              expectedComments);
+
+          expectedComments = [{
+            id: 11,
+            patch_set: 2,
+            side: 'PARENT',
+            line: 1,
+            __path: 'file/one',
+            __draft: true,
+            updated: '2013-02-26 15:03:43.986000000',
+          }];
+
+          assert.deepEqual(element._changeComments.getCommentsForThread(11),
+              expectedComments);
+
+          assert.deepEqual(element._changeComments.getCommentsForThread(1000),
+              null);
+        });
       });
     });
   });
diff --git a/polygerrit-ui/app/elements/diff/gr-confirm-delete-comment-dialog/gr-confirm-delete-comment-dialog.html b/polygerrit-ui/app/elements/diff/gr-confirm-delete-comment-dialog/gr-confirm-delete-comment-dialog.html
index 999c883..9decfa9 100644
--- a/polygerrit-ui/app/elements/diff/gr-confirm-delete-comment-dialog/gr-confirm-delete-comment-dialog.html
+++ b/polygerrit-ui/app/elements/diff/gr-confirm-delete-comment-dialog/gr-confirm-delete-comment-dialog.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,7 +17,7 @@
 
 <link rel="import" href="../../../bower_components/iron-autogrow-textarea/iron-autogrow-textarea.html">
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
-<link rel="import" href="../../shared/gr-confirm-dialog/gr-confirm-dialog.html">
+<link rel="import" href="../../shared/gr-dialog/gr-dialog.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 
 <dom-module id="gr-confirm-delete-comment-dialog">
@@ -45,18 +46,18 @@
         width: 73ch; /* Add a char to account for the border. */
 
         --iron-autogrow-textarea {
-          border: 1px solid #cdcdcd;
+          border: 1px solid var(--border-color);
           box-sizing: border-box;
           font-family: var(--monospace-font-family);
         }
       }
     </style>
-    <gr-confirm-dialog
+    <gr-dialog
         confirm-label="Delete"
         on-confirm="_handleConfirmTap"
         on-cancel="_handleCancelTap">
-      <div class="header">Delete Comment</div>
-      <div class="main">
+      <div class="header" slot="header">Delete Comment</div>
+      <div class="main" slot="main">
         <label for="messageInput">Enter comment delete reason</label>
         <iron-autogrow-textarea
             id="messageInput"
@@ -65,7 +66,7 @@
             placeholder="<Insert reasoning here>"
             bind-value="{{message}}"></iron-autogrow-textarea>
       </div>
-    </gr-confirm-dialog>
+    </gr-dialog>
   </template>
   <script src="gr-confirm-delete-comment-dialog.js"></script>
 </dom-module>
diff --git a/polygerrit-ui/app/elements/diff/gr-confirm-delete-comment-dialog/gr-confirm-delete-comment-dialog.js b/polygerrit-ui/app/elements/diff/gr-confirm-delete-comment-dialog/gr-confirm-delete-comment-dialog.js
index e0eb078..b86b72a 100644
--- a/polygerrit-ui/app/elements/diff/gr-confirm-delete-comment-dialog/gr-confirm-delete-comment-dialog.js
+++ b/polygerrit-ui/app/elements/diff/gr-confirm-delete-comment-dialog/gr-confirm-delete-comment-dialog.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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';
 
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-binary.js b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-binary.js
new file mode 100644
index 0000000..b2fc64c
--- /dev/null
+++ b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-binary.js
@@ -0,0 +1,46 @@
+/**
+ * @license
+ * Copyright (C) 2017 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(window, GrDiffBuilderSideBySide) {
+  'use strict';
+
+  // Prevent redefinition.
+  if (window.GrDiffBuilderBinary) { return; }
+
+  function GrDiffBuilderBinary(diff, comments, prefs, outputEl) {
+    GrDiffBuilder.call(this, diff, comments, null, prefs, outputEl);
+  }
+
+  GrDiffBuilderBinary.prototype = Object.create(GrDiffBuilder.prototype);
+  GrDiffBuilderBinary.prototype.constructor = GrDiffBuilderBinary;
+
+  // This method definition is a no-op to satisfy the parent type.
+  GrDiffBuilderBinary.prototype.addColumns = function(outputEl, fontSize) {};
+
+  GrDiffBuilderBinary.prototype.buildSectionElement = function() {
+    const section = this._createElement('tbody', 'binary-diff');
+    const row = this._createElement('tr');
+    const cell = this._createElement('td');
+    const label = this._createElement('label');
+    label.textContent = 'Difference in binary files';
+    cell.appendChild(label);
+    row.appendChild(cell);
+    section.appendChild(row);
+    return section;
+  };
+
+  window.GrDiffBuilderBinary = GrDiffBuilderBinary;
+})(window, GrDiffBuilderSideBySide);
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-image.js b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-image.js
index ddf3896..7eaca0d 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-image.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-image.js
@@ -1,28 +1,33 @@
-// 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.
+/**
+ * @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.
+ */
 (function(window, GrDiffBuilderSideBySide) {
   'use strict';
 
   // Prevent redefinition.
   if (window.GrDiffBuilderImage) { return; }
 
-  const IMAGE_MIME_PATTERN = /^image\/(bmp|gif|jpeg|jpg|png|tiff|webp)$/;
+  // MIME types for images we allow showing. Do not include SVG, it can contain
+  // arbitrary JavaScript.
+  const IMAGE_MIME_PATTERN = /^image\/(bmp|gif|x-icon|jpeg|jpg|png|tiff|webp)$/;
 
-  function GrDiffBuilderImage(
-      diff, comments, prefs, projectName, outputEl, baseImage, revisionImage) {
-    GrDiffBuilderSideBySide.call(
-        this, diff, comments, prefs, projectName, outputEl, []);
+  function GrDiffBuilderImage(diff, comments, createThreadGroupFn, prefs,
+      outputEl, baseImage, revisionImage) {
+    GrDiffBuilderSideBySide.call(this, diff, comments, createThreadGroupFn,
+        prefs, outputEl, []);
     this._baseImage = baseImage;
     this._revisionImage = revisionImage;
   }
@@ -31,22 +36,51 @@
       GrDiffBuilderSideBySide.prototype);
   GrDiffBuilderImage.prototype.constructor = GrDiffBuilderImage;
 
-  GrDiffBuilderImage.prototype.renderDiffImages = function() {
+  GrDiffBuilderImage.prototype.renderDiff = function() {
     const section = this._createElement('tbody', 'image-diff');
 
     this._emitImagePair(section);
     this._emitImageLabels(section);
 
     this._outputEl.appendChild(section);
+    this._outputEl.appendChild(this._createEndpoint());
+  };
+
+  GrDiffBuilderImage.prototype._createEndpoint = function() {
+    const tbody = this._createElement('tbody');
+    const tr = this._createElement('tr');
+    const td = this._createElement('td');
+
+    // TODO(kaspern): Support blame for image diffs and remove the hardcoded 4
+    // column limit.
+    td.setAttribute('colspan', '4');
+    const endpoint = this._createElement('gr-endpoint-decorator');
+    const endpointDomApi = Polymer.dom(endpoint);
+    endpointDomApi.setAttribute('name', 'image-diff');
+    endpointDomApi.appendChild(
+        this._createEndpointParam('baseImage', this._baseImage));
+    endpointDomApi.appendChild(
+        this._createEndpointParam('revisionImage', this._revisionImage));
+    td.appendChild(endpoint);
+    tr.appendChild(td);
+    tbody.appendChild(tr);
+    return tbody;
+  };
+
+  GrDiffBuilderImage.prototype._createEndpointParam = function(name, value) {
+    const endpointParam = this._createElement('gr-endpoint-param');
+    endpointParam.setAttribute('name', name);
+    endpointParam.value = value;
+    return endpointParam;
   };
 
   GrDiffBuilderImage.prototype._emitImagePair = function(section) {
     const tr = this._createElement('tr');
 
-    tr.appendChild(this._createElement('td'));
+    tr.appendChild(this._createElement('td', 'left lineNum blank'));
     tr.appendChild(this._createImageCell(this._baseImage, 'left', section));
 
-    tr.appendChild(this._createElement('td'));
+    tr.appendChild(this._createElement('td', 'right lineNum blank'));
     tr.appendChild(this._createImageCell(
         this._revisionImage, 'right', section));
 
@@ -94,7 +128,7 @@
       addNamesInLabel = true;
     }
 
-    tr.appendChild(this._createElement('td'));
+    tr.appendChild(this._createElement('td', 'left lineNum blank'));
     let td = this._createElement('td', 'left');
     let label = this._createElement('label');
     let nameSpan;
@@ -113,7 +147,7 @@
     td.appendChild(label);
     tr.appendChild(td);
 
-    tr.appendChild(this._createElement('td'));
+    tr.appendChild(this._createElement('td', 'right lineNum blank'));
     td = this._createElement('td', 'right');
     label = this._createElement('label');
     labelSpan = this._createElement('span', 'label');
@@ -138,7 +172,7 @@
     if (image) {
       const type = image.type || image._expectedType;
       if (image._width && image._height) {
-        return image._width + '⨉' + image._height + ' ' + type;
+        return image._width + '×' + image._height + ' ' + type;
       } else {
         return type;
       }
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-side-by-side.js b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-side-by-side.js
index 06989d2..fafae63 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-side-by-side.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-side-by-side.js
@@ -1,26 +1,29 @@
-// 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.
+/**
+ * @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.
+ */
 (function(window, GrDiffBuilder) {
   'use strict';
 
   // Prevent redefinition.
   if (window.GrDiffBuilderSideBySide) { return; }
 
-  function GrDiffBuilderSideBySide(
-      diff, comments, prefs, projectName, outputEl, layers) {
-    GrDiffBuilder.call(
-        this, diff, comments, prefs, projectName, outputEl, layers);
+  function GrDiffBuilderSideBySide(diff, comments, createThreadGroupFn, prefs,
+      outputEl, layers) {
+    GrDiffBuilder.call(this, diff, comments, createThreadGroupFn, prefs,
+        outputEl, layers);
   }
   GrDiffBuilderSideBySide.prototype = Object.create(GrDiffBuilder.prototype);
   GrDiffBuilderSideBySide.prototype.constructor = GrDiffBuilderSideBySide;
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-unified.js b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-unified.js
index a033c7b..9a04b1f 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-unified.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder-unified.js
@@ -1,26 +1,29 @@
-// 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.
+/**
+ * @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.
+ */
 (function(window, GrDiffBuilder) {
   'use strict';
 
   // Prevent redefinition.
   if (window.GrDiffBuilderUnified) { return; }
 
-  function GrDiffBuilderUnified(
-      diff, comments, prefs, projectName, outputEl, layers) {
-    GrDiffBuilder.call(
-        this, diff, comments, prefs, projectName, outputEl, layers);
+  function GrDiffBuilderUnified(diff, comments, createThreadGroupFn, prefs,
+      outputEl, layers) {
+    GrDiffBuilder.call(this, diff, comments, createThreadGroupFn, prefs,
+        outputEl, layers);
   }
   GrDiffBuilderUnified.prototype = Object.create(GrDiffBuilder.prototype);
   GrDiffBuilderUnified.prototype.constructor = GrDiffBuilderUnified;
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder.html b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder.html
index dd18b65..cc66e3b 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -24,7 +25,7 @@
 <dom-module id="gr-diff-builder">
   <template>
     <div class="contentWrapper">
-      <content></content>
+      <slot></slot>
     </div>
     <gr-ranged-comment-layer
         id="rangeLayer"
@@ -36,6 +37,7 @@
         id="processor"
         groups="{{_groups}}"></gr-diff-processor>
     <gr-reporting id="reporting"></gr-reporting>
+    <gr-js-api-interface id="jsAPI"></gr-js-api-interface>
   </template>
   <script src="../gr-diff/gr-diff-line.js"></script>
   <script src="../gr-diff/gr-diff-group.js"></script>
@@ -44,10 +46,21 @@
   <script src="gr-diff-builder-side-by-side.js"></script>
   <script src="gr-diff-builder-unified.js"></script>
   <script src="gr-diff-builder-image.js"></script>
+  <script src="gr-diff-builder-binary.js"></script>
   <script>
     (function() {
       'use strict';
 
+      const Defs = {};
+
+      /**
+       * @typedef {{
+       *  number: number,
+       *  leftSide: {boolean}
+       * }}
+       */
+      Defs.LineOfInterest;
+
       const DiffViewMode = {
         SIDE_BY_SIDE: 'SIDE_BY_SIDE',
         UNIFIED: 'UNIFIED_DIFF',
@@ -63,6 +76,9 @@
       // syntax highlighting for the entire file.
       const SYNTAX_MAX_LINE_LENGTH = 500;
 
+      // Disable syntax highlighting if the overall diff is too large.
+      const SYNTAX_MAX_DIFF_LENGTH = 20000;
+
       const TRAILING_WHITESPACE_PATTERN = /\s+$/;
 
       Polymer({
@@ -89,12 +105,26 @@
 
         properties: {
           diff: Object,
+          diffPath: String,
+          changeNum: String,
+          patchNum: String,
           viewMode: String,
           comments: Object,
           isImageDiff: Boolean,
           baseImage: Object,
           revisionImage: Object,
           projectName: String,
+          parentIndex: Number,
+          /**
+           * @type {Defs.LineOfInterest|null}
+           */
+          lineOfInterest: Object,
+
+          /**
+           * @type {function(number, booleam, !string)}
+           */
+          createCommentFn: Function,
+
           _builder: Object,
           _groups: Array,
           _layers: Array,
@@ -111,7 +141,7 @@
 
         attached() {
           // Setup annotation layers.
-          this._layers = [
+          const layers = [
             this._createTrailingWhitespaceLayer(),
             this.$.syntaxLayer,
             this._createIntralineLayer(),
@@ -119,6 +149,14 @@
             this.$.rangeLayer,
           ];
 
+          // Get layers from plugins (if any).
+          for (const pluginLayer of this.$.jsAPI.getDiffLayers(
+              this.diffPath, this.changeNum, this.patchNum)) {
+            layers.push(pluginLayer);
+          }
+
+          this._layers = layers;
+
           this.async(() => {
             this._preRenderThread();
           });
@@ -135,25 +173,27 @@
           this._builder = this._getDiffBuilder(this.diff, comments, prefs);
 
           this.$.processor.context = prefs.context;
-          this.$.processor.keyLocations = this._getCommentLocations(comments);
+          this.$.processor.keyLocations = this._getKeyLocations(comments,
+              this.lineOfInterest);
 
           this._clearDiffContent();
           this._builder.addColumns(this.diffElement, prefs.font_size);
 
           const reporting = this.$.reporting;
+          const isBinary = !!(this.isImageDiff || this.diff.binary);
 
           reporting.time(TimingLabel.TOTAL);
           reporting.time(TimingLabel.CONTENT);
           this.dispatchEvent(new CustomEvent('render-start', {bubbles: true}));
-          return this.$.processor.process(this.diff.content, this.isImageDiff)
+          return this.$.processor.process(this.diff.content, isBinary)
               .then(() => {
                 if (this.isImageDiff) {
-                  this._builder.renderDiffImages();
+                  this._builder.renderDiff();
                 }
                 this.dispatchEvent(new CustomEvent('render-content',
                     {bubbles: true}));
 
-                if (this._anyLineTooLong()) {
+                if (this._diffTooLargeForSyntax()) {
                   this.$.syntaxLayer.enabled = false;
                 }
 
@@ -219,12 +259,6 @@
           GrDiffBuilder.Side.RIGHT : GrDiffBuilder.Side.LEFT;
         },
 
-        createCommentThreadGroup(changeNum, patchNum, path,
-            isOnParent, commentSide) {
-          return this._builder.createCommentThreadGroup(changeNum, patchNum,
-              path, isOnParent, commentSide);
-        },
-
         emitGroup(group, sectionEl) {
           this._builder.emitGroup(group, sectionEl);
         },
@@ -250,26 +284,58 @@
           this.$.syntaxLayer.cancel();
         },
 
+        _handlePreferenceError(pref) {
+          const message = `The value of the '${pref}' user preference is ` +
+              `invalid. Fix in diff preferences`;
+          this.dispatchEvent(new CustomEvent('show-alert', {
+            detail: {
+              message,
+            }, bubbles: true}));
+          throw Error(`Invalid preference value: ${pref}`);
+        },
+
         _getDiffBuilder(diff, comments, prefs) {
-          if (this.isImageDiff) {
-            return new GrDiffBuilderImage(diff, comments, prefs,
-                this.projectName, this.diffElement, this.baseImage,
-                this.revisionImage);
-          } else if (this.viewMode === DiffViewMode.SIDE_BY_SIDE) {
-            return new GrDiffBuilderSideBySide(diff, comments, prefs,
-                this.projectName, this.diffElement, this._layers);
-          } else if (this.viewMode === DiffViewMode.UNIFIED) {
-            return new GrDiffBuilderUnified(diff, comments, prefs,
-                this.projectName, this.diffElement, this._layers);
+          if (isNaN(prefs.tab_size) || prefs.tab_size <= 0) {
+            this._handlePreferenceError('tab size');
+            return;
           }
-          throw Error('Unsupported diff view mode: ' + this.viewMode);
+
+          if (isNaN(prefs.line_length) || prefs.line_length <= 0) {
+            this._handlePreferenceError('diff width');
+            return;
+          }
+
+          let builder = null;
+          const createFn = this.createCommentFn;
+          if (this.isImageDiff) {
+            builder = new GrDiffBuilderImage(diff, comments, createFn, prefs,
+              this.diffElement, this.baseImage, this.revisionImage);
+          } else if (diff.binary) {
+            // If the diff is binary, but not an image.
+            return new GrDiffBuilderBinary(diff, comments, prefs,
+                this.diffElement);
+          } else if (this.viewMode === DiffViewMode.SIDE_BY_SIDE) {
+            builder = new GrDiffBuilderSideBySide(diff, comments, createFn,
+                prefs, this.diffElement, this._layers);
+          } else if (this.viewMode === DiffViewMode.UNIFIED) {
+            builder = new GrDiffBuilderUnified(diff, comments, createFn, prefs,
+                this.diffElement, this._layers);
+          }
+          if (!builder) {
+            throw Error('Unsupported diff view mode: ' + this.viewMode);
+          }
+          return builder;
         },
 
         _clearDiffContent() {
           this.diffElement.innerHTML = null;
         },
 
-        _getCommentLocations(comments) {
+        /**
+         * @param {!Object} comments
+         * @param {Defs.LineOfInterest|null} lineOfInterest
+         */
+        _getKeyLocations(comments, lineOfInterest) {
           const result = {
             left: {},
             right: {},
@@ -283,6 +349,12 @@
               result[side][c.line || GrDiffLine.FILE] = true;
             }
           }
+
+          if (lineOfInterest) {
+            const side = lineOfInterest.leftSide ? 'left' : 'right';
+            result[side][lineOfInterest.number] = true;
+          }
+
           return result;
         },
 
@@ -404,10 +476,32 @@
           }, false);
         },
 
+        _diffTooLargeForSyntax() {
+          return this._anyLineTooLong() ||
+              this.getDiffLength() > SYNTAX_MAX_DIFF_LENGTH;
+        },
+
         setBlame(blame) {
           if (!this._builder || !blame) { return; }
           this._builder.setBlame(blame);
         },
+
+        /**
+         * Get the approximate length of the diff as the sum of the maximum
+         * length of the chunks.
+         * @return {number}
+         */
+        getDiffLength() {
+          return this.diff.content.reduce((sum, sec) => {
+            if (sec.hasOwnProperty('ab')) {
+              return sum + sec.ab.length;
+            } else {
+              return sum + Math.max(
+                  sec.hasOwnProperty('a') ? sec.a.length : 0,
+                  sec.hasOwnProperty('b') ? sec.b.length : 0);
+            }
+          }, 0);
+        },
       });
     })();
   </script>
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder.js b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder.js
index e199a75..4b85c22 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder.js
@@ -1,46 +1,67 @@
-// 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.
+/**
+ * @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.
+ */
 (function(window, GrDiffGroup, GrDiffLine) {
   'use strict';
 
-  const HTML_ENTITY_PATTERN = /[&<>"'`\/]/g;
-  const HTML_ENTITY_MAP = {
-    '&': '&amp;',
-    '<': '&lt;',
-    '>': '&gt;',
-    '"': '&quot;',
-    '\'': '&#39;',
-    '/': '&#x2F;',
-    '`': '&#96;',
-  };
-
   // Prevent redefinition.
   if (window.GrDiffBuilder) { return; }
 
-  const REGEX_ASTRAL_SYMBOL = /[\uD800-\uDBFF][\uDC00-\uDFFF]/;
+  /**
+   * In JS, unicode code points above 0xFFFF occupy two elements of a string.
+   * For example '𐀏'.length is 2. An occurence of such a code point is called a
+   * surrogate pair.
+   *
+   * This regex segments a string along tabs ('\t') and surrogate pairs, since
+   * these are two cases where '1 char' does not automatically imply '1 column'.
+   *
+   * TODO: For human languages whose orthographies use combining marks, this
+   * approach won't correctly identify the grapheme boundaries. In those cases,
+   * a grapheme consists of multiple code points that should count as only one
+   * character against the column limit. Getting that correct (if it's desired)
+   * is probably beyond the limits of a regex, but there are nonstandard APIs to
+   * do this, and proposed (but, as of Nov 2017, unimplemented) standard APIs.
+   *
+   * Further reading:
+   *   On Unicode in JS: https://mathiasbynens.be/notes/javascript-unicode
+   *   Graphemes: http://unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries
+   *   A proposed JS API: https://github.com/tc39/proposal-intl-segmenter
+   */
+  const REGEX_TAB_OR_SURROGATE_PAIR = /\t|[\uD800-\uDBFF][\uDC00-\uDFFF]/;
 
-  function GrDiffBuilder(diff, comments, prefs, projectName, outputEl, layers) {
+  function GrDiffBuilder(diff, comments, createThreadGroupFn, prefs, outputEl,
+      layers) {
     this._diff = diff;
     this._comments = comments;
+    this._createThreadGroupFn = createThreadGroupFn;
     this._prefs = prefs;
-    this._projectName = projectName;
     this._outputEl = outputEl;
     this.groups = [];
     this._blameInfo = null;
 
     this.layers = layers || [];
 
+    if (isNaN(prefs.tab_size) || prefs.tab_size <= 0) {
+      throw Error('Invalid tab size from preferences.');
+    }
+
+    if (isNaN(prefs.line_length) || prefs.line_length <= 0) {
+      throw Error('Invalid line length from preferences.');
+    }
+
     for (const layer of this.layers) {
       if (layer.addListener) {
         layer.addListener(this._handleLayerUpdate.bind(this));
@@ -48,14 +69,6 @@
     }
   }
 
-  GrDiffBuilder.LESS_THAN_CODE = '<'.charCodeAt(0);
-  GrDiffBuilder.GREATER_THAN_CODE = '>'.charCodeAt(0);
-  GrDiffBuilder.AMPERSAND_CODE = '&'.charCodeAt(0);
-  GrDiffBuilder.SEMICOLON_CODE = ';'.charCodeAt(0);
-
-  GrDiffBuilder.LINE_FEED_HTML =
-      '<span class="style-scope gr-diff br"></span>';
-
   GrDiffBuilder.GroupType = {
     ADDED: 'b',
     BOTH: 'ab',
@@ -94,7 +107,7 @@
    * @param {Object} group
    */
   GrDiffBuilder.prototype.buildSectionElement = function() {
-    throw Error('Subclasses must implement buildGroupElement');
+    throw Error('Subclasses must implement buildSectionElement');
   };
 
   GrDiffBuilder.prototype.emitGroup = function(group, opt_beforeSection) {
@@ -203,6 +216,11 @@
     for (let i = 0; i < lines.length; i++) {
       line = lines[i];
       el = elements[i];
+      if (!el) {
+        // Cannot re-render an element if it does not exist. This can happen
+        // if lines are collapsed and not visible on the page yet.
+        continue;
+      }
       el.parentElement.replaceChild(this._createTextEl(line, side).firstChild,
           el);
     }
@@ -214,10 +232,6 @@
         group => { return group.element; });
   };
 
-  GrDiffBuilder.prototype._commentIsAtLineNum = function(side, lineNum) {
-    return this._commentLocations[side][lineNum] === true;
-  };
-
   // TODO(wyatta): Move this completely into the processor.
   GrDiffBuilder.prototype._insertContextGroups = function(groups, lines,
       hiddenRange) {
@@ -273,6 +287,7 @@
 
     const button = this._createElement('gr-button', 'showContext');
     button.setAttribute('link', true);
+    button.setAttribute('no-uppercase', true);
 
     let text;
     const groups = []; // The groups that replace this one if tapped.
@@ -291,7 +306,7 @@
           [0, contextLines.length - context]);
     }
 
-    button.textContent = text;
+    Polymer.dom(button).textContent = text;
 
     button.addEventListener('tap', e => {
       e.detail = {
@@ -337,51 +352,121 @@
     return result;
   };
 
-  GrDiffBuilder.prototype.createCommentThreadGroup = function(changeNum,
-      patchNum, path, isOnParent, range) {
-    const threadGroupEl =
-        document.createElement('gr-diff-comment-thread-group');
-    threadGroupEl.changeNum = changeNum;
-    threadGroupEl.patchForNewThreads = patchNum;
-    threadGroupEl.path = path;
-    threadGroupEl.isOnParent = isOnParent;
-    threadGroupEl.projectName = this._projectName;
-    threadGroupEl.range = range;
-    return threadGroupEl;
+  /**
+   * @param {Array<Object>} comments
+   * @param {string} patchForNewThreads
+   */
+  GrDiffBuilder.prototype._getThreads = function(comments, patchForNewThreads) {
+    const sortedComments = comments.slice(0).sort((a, b) => {
+      if (b.__draft && !a.__draft ) { return 0; }
+      if (a.__draft && !b.__draft ) { return 1; }
+      return util.parseDate(a.updated) - util.parseDate(b.updated);
+    });
+
+    const threads = [];
+    for (const comment of sortedComments) {
+      // If the comment is in reply to another comment, find that comment's
+      // thread and append to it.
+      if (comment.in_reply_to) {
+        const thread = threads.find(thread =>
+            thread.comments.some(c => c.id === comment.in_reply_to));
+        if (thread) {
+          thread.comments.push(comment);
+          continue;
+        }
+      }
+
+      // Otherwise, this comment starts its own thread.
+      const newThread = {
+        start_datetime: comment.updated,
+        comments: [comment],
+        commentSide: comment.__commentSide,
+        /**
+         * Determines what the patchNum of a thread should be. Use patchNum from
+         * comment if it exists, otherwise the property of the thread group.
+         * This is needed for switching between side-by-side and unified views
+         * when there are unsaved drafts.
+         */
+        patchNum: comment.patch_set || patchForNewThreads,
+        rootId: comment.id || comment.__draftID,
+      };
+      if (comment.range) {
+        newThread.range = Object.assign({}, comment.range);
+      }
+      threads.push(newThread);
+    }
+    return threads;
   };
 
-  GrDiffBuilder.prototype._commentThreadGroupForLine = function(line,
-      opt_side) {
+  /**
+   * Returns the patch number that new comment threads should be attached to.
+   *
+   * @param {GrDiffLine} line The line new thread will be attached to.
+   * @param {string=} opt_side Set to LEFT to force adding it to the LEFT side -
+   *     will be ignored if the left is a parent or a merge parent
+   * @return {number} Patch set to attach the new thread to
+   */
+  GrDiffBuilder.prototype._determinePatchNumForNewThreads = function(
+      patchRange, line, opt_side) {
+    if ((line.type === GrDiffLine.Type.REMOVE ||
+         opt_side === GrDiffBuilder.Side.LEFT) &&
+        patchRange.basePatchNum !== 'PARENT' &&
+        !Gerrit.PatchSetBehavior.isMergeParent(patchRange.basePatchNum)) {
+      return patchRange.basePatchNum;
+    } else {
+      return patchRange.patchNum;
+    }
+  };
+
+  /**
+   * Returns whether the comments on the given line are on a (merge) parent.
+   *
+   * @param {string} firstCommentSide
+   * @param {{basePatchNum: number, patchNum: number}} patchRange
+   * @param {GrDiffLine} line The line the comments are on.
+   * @param {string=} opt_side
+   * @return {boolean} True iff the comments on the given line are on a (merge)
+   *    parent.
+   */
+  GrDiffBuilder.prototype._determineIsOnParent = function(
+      firstCommentSide, patchRange, line, opt_side) {
+    return ((line.type === GrDiffLine.Type.REMOVE ||
+             opt_side === GrDiffBuilder.Side.LEFT) &&
+            (patchRange.basePatchNum === 'PARENT' ||
+             Gerrit.PatchSetBehavior.isMergeParent(
+                 patchRange.basePatchNum))) ||
+          firstCommentSide === 'PARENT';
+  };
+
+  /**
+   * @param {GrDiffLine} line
+   * @param {string=} opt_side
+   * @return {!Object}
+   */
+  GrDiffBuilder.prototype._commentThreadGroupForLine = function(
+      line, opt_side) {
     const comments =
-        this._getCommentsForLine(this._comments, line, opt_side);
+    this._getCommentsForLine(this._comments, line, opt_side);
     if (!comments || comments.length === 0) {
       return null;
     }
 
-    let patchNum = this._comments.meta.patchRange.patchNum;
-    let isOnParent = comments[0].side === 'PARENT' || false;
-    if (line.type === GrDiffLine.Type.REMOVE ||
-    opt_side === GrDiffBuilder.Side.LEFT) {
-      if (this._comments.meta.patchRange.basePatchNum === 'PARENT') {
-        isOnParent = true;
-      } else {
-        patchNum = this._comments.meta.patchRange.basePatchNum;
-      }
-    }
-    const threadGroupEl = this.createCommentThreadGroup(
-        this._comments.meta.changeNum,
-        patchNum,
-        this._comments.meta.path,
-        isOnParent);
-    threadGroupEl.comments = comments;
+    const patchNum = this._determinePatchNumForNewThreads(
+        this._comments.meta.patchRange, line, opt_side);
+    const isOnParent = this._determineIsOnParent(
+        comments[0].side, this._comments.meta.patchRange, line, opt_side);
+
+    const threadGroupEl = this._createThreadGroupFn(patchNum, isOnParent,
+        opt_side);
+    threadGroupEl.threads = this._getThreads(comments, patchNum);
     if (opt_side) {
       threadGroupEl.setAttribute('data-side', opt_side);
     }
     return threadGroupEl;
   };
 
-  GrDiffBuilder.prototype._createLineEl = function(line, number, type,
-      opt_class) {
+  GrDiffBuilder.prototype._createLineEl = function(
+      line, number, type, opt_class) {
     const td = this._createElement('td');
     if (opt_class) {
       td.classList.add(opt_class);
@@ -398,41 +483,31 @@
     } else if (line.type === GrDiffLine.Type.CONTEXT_CONTROL) {
       td.classList.add('contextLineNum');
       td.setAttribute('data-value', '@@');
+      td.textContent = '@@';
     } else if (line.type === GrDiffLine.Type.BOTH || line.type === type) {
       td.classList.add('lineNum');
       td.setAttribute('data-value', number);
+      td.textContent = number === 'FILE' ? 'File' : number;
     }
     return td;
   };
 
   GrDiffBuilder.prototype._createTextEl = function(line, opt_side) {
     const td = this._createElement('td');
-    const text = line.text;
     if (line.type !== GrDiffLine.Type.BLANK) {
       td.classList.add('content');
     }
     td.classList.add(line.type);
-    let html = this._escapeHTML(text);
-    html = this._addTabWrappers(html, this._prefs.tab_size);
-    if (!this._prefs.line_wrapping &&
-        this._textLength(text, this._prefs.tab_size) >
-        this._prefs.line_length) {
-      html = this._addNewlines(text, html);
-    }
 
-    const contentText = this._createElement('div', 'contentText');
+    const lineLimit =
+        !this._prefs.line_wrapping ? this._prefs.line_length : Infinity;
+
+    const contentText =
+        this._formatText(line.text, this._prefs.tab_size, lineLimit);
     if (opt_side) {
       contentText.setAttribute('data-side', opt_side);
     }
 
-    // If the html is equivalent to the text then it didn't get highlighted
-    // or escaped. Use textContent which is faster than innerHTML.
-    if (html === text) {
-      contentText.textContent = text;
-    } else {
-      contentText.innerHTML = html;
-    }
-
     for (const layer of this.layers) {
       layer.annotate(contentText, line);
     }
@@ -443,142 +518,88 @@
   };
 
   /**
-   * Returns the text length after normalizing unicode and tabs.
-   * @return {number} The normalized length of the text.
+   * Returns a 'div' element containing the supplied |text| as its innerText,
+   * with '\t' characters expanded to a width determined by |tabSize|, and the
+   * text wrapped at column |lineLimit|, which may be Infinity if no wrapping is
+   * desired.
+   *
+   * @param {string} text The text to be formatted.
+   * @param {number} tabSize The width of each tab stop.
+   * @param {number} lineLimit The column after which to wrap lines.
+   * @return {HTMLElement}
    */
-  GrDiffBuilder.prototype._textLength = function(text, tabSize) {
-    text = text.replace(REGEX_ASTRAL_SYMBOL, '_');
-    let numChars = 0;
-    for (let i = 0; i < text.length; i++) {
-      if (text[i] === '\t') {
-        numChars += tabSize - (numChars % tabSize);
-      } else {
-        numChars++;
-      }
-    }
-    return numChars;
-  };
+  GrDiffBuilder.prototype._formatText = function(text, tabSize, lineLimit) {
+    const contentText = this._createElement('div', 'contentText');
 
-  // Advance `index` by the appropriate number of characters that would
-  // represent one source code character and return that index. For
-  // example, for source code '<span>' the escaped html string is
-  // '&lt;span&gt;'. Advancing from index 0 on the prior html string would
-  // return 4, since &lt; maps to one source code character ('<').
-  GrDiffBuilder.prototype._advanceChar = function(html, index) {
-    // TODO(andybons): Unicode is all kinds of messed up in JS. Account for it.
-    // https://mathiasbynens.be/notes/javascript-unicode
-
-    // Tags don't count as characters
-    while (index < html.length &&
-           html.charCodeAt(index) === GrDiffBuilder.LESS_THAN_CODE) {
-      while (index < html.length &&
-             html.charCodeAt(index) !== GrDiffBuilder.GREATER_THAN_CODE) {
-        index++;
-      }
-      index++; // skip the ">" itself
-    }
-    // An HTML entity (e.g., &lt;) counts as one character.
-    if (index < html.length &&
-        html.charCodeAt(index) === GrDiffBuilder.AMPERSAND_CODE) {
-      while (index < html.length &&
-             html.charCodeAt(index) !== GrDiffBuilder.SEMICOLON_CODE) {
-        index++;
-      }
-    }
-    return index + 1;
-  };
-
-  GrDiffBuilder.prototype._advancePastTagClose = function(html, index) {
-    while (index < html.length &&
-           html.charCodeAt(index) !== GrDiffBuilder.GREATER_THAN_CODE) {
-      index++;
-    }
-    return index + 1;
-  };
-
-  GrDiffBuilder.prototype._addNewlines = function(text, html) {
-    let htmlIndex = 0;
-    const indices = [];
-    let numChars = 0;
-    let prevHtmlIndex = 0;
-    for (let i = 0; i < text.length; i++) {
-      if (numChars > 0 && numChars % this._prefs.line_length === 0) {
-        indices.push(htmlIndex);
-      }
-      htmlIndex = this._advanceChar(html, htmlIndex);
-      if (text[i] === '\t') {
-        // Advance past tab closing tag.
-        htmlIndex = this._advancePastTagClose(html, htmlIndex);
-        // ~~ is a faster Math.floor
-        if (~~(numChars / this._prefs.line_length) !==
-            ~~((numChars + this._prefs.tab_size) / this._prefs.line_length)) {
-          // Tab crosses line limit - push it to the next line.
-          indices.push(prevHtmlIndex);
+    let columnPos = 0;
+    let textOffset = 0;
+    for (const segment of text.split(REGEX_TAB_OR_SURROGATE_PAIR)) {
+      if (segment) {
+        // |segment| contains only normal characters. If |segment| doesn't fit
+        // entirely on the current line, append chunks of |segment| followed by
+        // line breaks.
+        let rowStart = 0;
+        let rowEnd = lineLimit - columnPos;
+        while (rowEnd < segment.length) {
+          contentText.appendChild(
+              document.createTextNode(segment.substring(rowStart, rowEnd)));
+          contentText.appendChild(this._createElement('span', 'br'));
+          columnPos = 0;
+          rowStart = rowEnd;
+          rowEnd += lineLimit;
         }
-        numChars += this._prefs.tab_size;
-      } else {
-        numChars++;
+        // Append the last part of |segment|, which fits on the current line.
+        contentText.appendChild(
+            document.createTextNode(segment.substring(rowStart)));
+        columnPos += (segment.length - rowStart);
+        textOffset += segment.length;
       }
-      prevHtmlIndex = htmlIndex;
+      if (textOffset < text.length) {
+        // Handle the special character at |textOffset|.
+        if (text.startsWith('\t', textOffset)) {
+          // Append a single '\t' character.
+          let effectiveTabSize = tabSize - (columnPos % tabSize);
+          if (columnPos + effectiveTabSize > lineLimit) {
+            contentText.appendChild(this._createElement('span', 'br'));
+            columnPos = 0;
+            effectiveTabSize = tabSize;
+          }
+          contentText.appendChild(this._getTabWrapper(effectiveTabSize));
+          columnPos += effectiveTabSize;
+          textOffset++;
+        } else {
+          // Append a single surrogate pair.
+          if (columnPos >= lineLimit) {
+            contentText.appendChild(this._createElement('span', 'br'));
+            columnPos = 0;
+          }
+          contentText.appendChild(document.createTextNode(
+              text.substring(textOffset, textOffset + 2)));
+          textOffset += 2;
+          columnPos += 1;
+        }
+      }
     }
-    let result = html;
-    // Since the result string is being altered in place, start from the end
-    // of the string so that the insertion indices are not affected as the
-    // result string changes.
-    for (let i = indices.length - 1; i >= 0; i--) {
-      result = result.slice(0, indices[i]) + GrDiffBuilder.LINE_FEED_HTML +
-          result.slice(indices[i]);
-    }
-    return result;
+    return contentText;
   };
 
   /**
-   * Takes a string of text (not HTML) and returns a string of HTML with tab
-   * elements in place of tab characters. In each case tab elements are given
-   * the width needed to reach the next tab-stop.
+   * Returns a <span> element holding a '\t' character, that will visually
+   * occupy |tabSize| many columns.
    *
-   * @param {string} A line of text potentially containing tab characters.
-   * @param {number} The width for tabs.
-   * @return {string} An HTML string potentially containing tab elements.
+   * @param {number} tabSize The effective size of this tab stop.
+   * @return {HTMLElement}
    */
-  GrDiffBuilder.prototype._addTabWrappers = function(line, tabSize) {
-    if (!line.length) { return ''; }
-
-    let result = '';
-    let offset = 0;
-    const split = line.split('\t');
-    let width;
-
-    for (let i = 0; i < split.length - 1; i++) {
-      offset += split[i].length;
-      width = tabSize - (offset % tabSize);
-      result += split[i] + this._getTabWrapper(width);
-      offset += width;
-    }
-    if (split.length) {
-      result += split[split.length - 1];
-    }
-
+  GrDiffBuilder.prototype._getTabWrapper = function(tabSize) {
+    // Force this to be a number to prevent arbitrary injection.
+    const result = this._createElement('span', 'tab');
+    result.style['tab-size'] = tabSize;
+    result.style['-moz-tab-size'] = tabSize;
+    result.innerText = '\t';
     return result;
   };
 
-  GrDiffBuilder.prototype._getTabWrapper = function(tabSize) {
-    // Force this to be a number to prevent arbitrary injection.
-    tabSize = +tabSize;
-    if (isNaN(tabSize)) {
-      throw Error('Invalid tab size from preferences.');
-    }
-
-    let str = '<span class="style-scope gr-diff tab ';
-    str += '" style="';
-    // TODO(andybons): CSS tab-size is not supported in IE.
-    str += 'tab-size:' + tabSize + ';';
-    str += '-moz-tab-size:' + tabSize + ';';
-    str += '">\t</span>';
-    return str;
-  };
-
-  GrDiffBuilder.prototype._createElement = function(tagName, className) {
+  GrDiffBuilder.prototype._createElement = function(tagName, classStr) {
     const el = document.createElement(tagName);
     // When Shady DOM is being used, these classes are added to account for
     // Polymer's polyfill behavior. In order to guarantee sufficient
@@ -587,8 +608,10 @@
     // automatically) are not being used for performance reasons, this is
     // done manually.
     el.classList.add('style-scope', 'gr-diff');
-    if (className) {
-      el.classList.add(className);
+    if (classStr) {
+      for (const className of classStr.split(' ')) {
+        el.classList.add(className);
+      }
     }
     return el;
   };
@@ -620,14 +643,8 @@
         !(!group.adds.length && !group.removes.length);
   };
 
-  GrDiffBuilder.prototype._escapeHTML = function(str) {
-    return str.replace(HTML_ENTITY_PATTERN, s => {
-      return HTML_ENTITY_MAP[s];
-    });
-  };
-
   /**
-   * Set the blame information for the diff. For any already-rednered line,
+   * Set the blame information for the diff. For any already-rendered line,
    * re-render its blame cell content.
    * @param {Object} blame
    */
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder_test.html b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder_test.html
index f9e465e..3238cbc 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder_test.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -58,10 +59,13 @@
   suite('gr-diff-builder tests', () => {
     let element;
     let builder;
+    let createThreadGroupFn;
     let sandbox;
+    const LINE_FEED_HTML = '<span class="style-scope gr-diff br"></span>';
 
     setup(() => {
       sandbox = sinon.sandbox.create();
+      element = fixture('basic');
       stub('gr-rest-api-interface', {
         getLoggedIn() { return Promise.resolve(false); },
         getProjectConfig() { return Promise.resolve({}); },
@@ -71,13 +75,182 @@
         show_tabs: true,
         tab_size: 4,
       };
-      const projectName = 'my-project';
+      createThreadGroupFn = sinon.spy(() => ({
+        setAttribute: sinon.spy(),
+      }));
       builder = new GrDiffBuilder(
-          {content: []}, {left: [], right: []}, prefs, projectName);
+          {content: []}, {left: [], right: []}, createThreadGroupFn, prefs);
     });
 
     teardown(() => { sandbox.restore(); });
 
+    test('_getThreads', () => {
+      const patchForNewThreads = 3;
+      const comments = [
+        {
+          id: 'sallys_confession',
+          message: 'i like you, jack',
+          updated: '2015-12-23 15:00:20.396000000',
+          __commentSide: 'left',
+        }, {
+          id: 'jacks_reply',
+          message: 'i like you, too',
+          updated: '2015-12-24 15:01:20.396000000',
+          __commentSide: 'left',
+          in_reply_to: 'sallys_confession',
+        },
+        {
+          id: 'new_draft',
+          message: 'i do not like either of you',
+          __commentSide: 'left',
+          __draft: true,
+          updated: '2015-12-20 15:01:20.396000000',
+        },
+      ];
+
+      let expectedThreadGroups = [
+        {
+          start_datetime: '2015-12-23 15:00:20.396000000',
+          commentSide: 'left',
+          comments: [{
+            id: 'sallys_confession',
+            message: 'i like you, jack',
+            updated: '2015-12-23 15:00:20.396000000',
+            __commentSide: 'left',
+          }, {
+            id: 'jacks_reply',
+            message: 'i like you, too',
+            updated: '2015-12-24 15:01:20.396000000',
+            __commentSide: 'left',
+            in_reply_to: 'sallys_confession',
+          }],
+          rootId: 'sallys_confession',
+          patchNum: 3,
+        },
+        {
+          start_datetime: '2015-12-20 15:01:20.396000000',
+          commentSide: 'left',
+          comments: [
+            {
+              id: 'new_draft',
+              message: 'i do not like either of you',
+              __commentSide: 'left',
+              __draft: true,
+              updated: '2015-12-20 15:01:20.396000000',
+            },
+          ],
+          rootId: 'new_draft',
+          patchNum: 3,
+        },
+      ];
+
+      assert.deepEqual(
+          builder._getThreads(comments, patchForNewThreads),
+          expectedThreadGroups);
+
+      // Patch num should get inherited from comment rather
+      comments.push({
+        id: 'betsys_confession',
+        message: 'i like you, jack',
+        updated: '2015-12-24 15:00:10.396000000',
+        range: {
+          start_line: 1,
+          start_character: 1,
+          end_line: 1,
+          end_character: 2,
+        },
+        __commentSide: 'left',
+      });
+
+      expectedThreadGroups = [
+        {
+          start_datetime: '2015-12-23 15:00:20.396000000',
+          commentSide: 'left',
+          comments: [{
+            id: 'sallys_confession',
+            message: 'i like you, jack',
+            updated: '2015-12-23 15:00:20.396000000',
+            __commentSide: 'left',
+          }, {
+            id: 'jacks_reply',
+            in_reply_to: 'sallys_confession',
+            message: 'i like you, too',
+            updated: '2015-12-24 15:01:20.396000000',
+            __commentSide: 'left',
+          }],
+          patchNum: 3,
+          rootId: 'sallys_confession',
+        },
+        {
+          start_datetime: '2015-12-24 15:00:10.396000000',
+          commentSide: 'left',
+          comments: [{
+            id: 'betsys_confession',
+            message: 'i like you, jack',
+            updated: '2015-12-24 15:00:10.396000000',
+            range: {
+              start_line: 1,
+              start_character: 1,
+              end_line: 1,
+              end_character: 2,
+            },
+            __commentSide: 'left',
+          }],
+          patchNum: 3,
+          rootId: 'betsys_confession',
+          range: {
+            start_line: 1,
+            start_character: 1,
+            end_line: 1,
+            end_character: 2,
+          },
+        },
+        {
+          start_datetime: '2015-12-20 15:01:20.396000000',
+          commentSide: 'left',
+          comments: [
+            {
+              id: 'new_draft',
+              message: 'i do not like either of you',
+              __commentSide: 'left',
+              __draft: true,
+              updated: '2015-12-20 15:01:20.396000000',
+            },
+          ],
+          rootId: 'new_draft',
+          patchNum: 3,
+        },
+      ];
+
+      assert.deepEqual(
+          builder._getThreads(comments, patchForNewThreads),
+          expectedThreadGroups);
+    });
+
+    test('multiple comments at same location but not threaded', () => {
+      const comments = [
+        {
+          id: 'sallys_confession',
+          message: 'i like you, jack',
+          updated: '2015-12-23 15:00:20.396000000',
+          __commentSide: 'left',
+        }, {
+          id: 'jacks_reply',
+          message: 'i like you, too',
+          updated: '2015-12-24 15:01:20.396000000',
+          __commentSide: 'left',
+        },
+      ];
+      assert.equal(builder._getThreads(comments, '3').length, 2);
+    });
+
+    test('_createElement classStr applies all classes', () => {
+      const node = builder._createElement('div', 'test classes');
+      assert.isTrue(node.classList.contains('gr-diff'));
+      assert.isTrue(node.classList.contains('test'));
+      assert.isTrue(node.classList.contains('classes'));
+    });
+
     test('context control buttons', () => {
       const section = {};
       const line = {contextGroup: {lines: []}};
@@ -92,7 +265,7 @@
       let buttons = td.querySelectorAll('gr-button.showContext');
 
       assert.equal(buttons.length, 1);
-      assert.equal(buttons[0].textContent, 'Show 10 common lines');
+      assert.equal(Polymer.dom(buttons[0]).textContent, 'Show 10 common lines');
 
       // Add another line.
       line.contextGroup.lines.push('lorem upsum');
@@ -102,111 +275,146 @@
       buttons = td.querySelectorAll('gr-button.showContext');
 
       assert.equal(buttons.length, 3);
-      assert.equal(buttons[0].textContent, '+10↑');
-      assert.equal(buttons[1].textContent, 'Show 11 common lines');
-      assert.equal(buttons[2].textContent, '+10↓');
+      assert.equal(Polymer.dom(buttons[0]).textContent, '+10↑');
+      assert.equal(Polymer.dom(buttons[1]).textContent, 'Show 11 common lines');
+      assert.equal(Polymer.dom(buttons[2]).textContent, '+10↓');
     });
 
     test('newlines 1', () => {
       let text = 'abcdef';
-      assert.equal(builder._addNewlines(text, text), text);
+
+      assert.equal(builder._formatText(text, 4, 10).innerHTML, text);
       text = 'a'.repeat(20);
-      assert.equal(builder._addNewlines(text, text),
+      assert.equal(builder._formatText(text, 4, 10).innerHTML,
           'a'.repeat(10) +
-          GrDiffBuilder.LINE_FEED_HTML +
+          LINE_FEED_HTML +
           'a'.repeat(10));
     });
 
     test('newlines 2', () => {
       const text = '<span class="thumbsup">👍</span>';
-      const html =
-          '&lt;span class=&quot;thumbsup&quot;&gt;👍&lt;&#x2F;span&gt;';
-      assert.equal(builder._addNewlines(text, html),
+      assert.equal(builder._formatText(text, 4, 10).innerHTML,
           '&lt;span clas' +
-          GrDiffBuilder.LINE_FEED_HTML +
-          's=&quot;thumbsu' +
-          GrDiffBuilder.LINE_FEED_HTML +
-          'p&quot;&gt;👍&lt;&#x2F;spa' +
-          GrDiffBuilder.LINE_FEED_HTML +
-          'n&gt;');
+          LINE_FEED_HTML +
+          's="thumbsu' +
+          LINE_FEED_HTML +
+          'p"&gt;👍&lt;/span' +
+          LINE_FEED_HTML +
+          '&gt;');
     });
 
     test('newlines 3', () => {
       const text = '01234\t56789';
-      const html = '01234<span>\t</span>56789';
-      assert.equal(builder._addNewlines(text, html),
-          '01234<span>\t</span>5' +
-          GrDiffBuilder.LINE_FEED_HTML +
-          '6789');
+      assert.equal(builder._formatText(text, 4, 10).innerHTML,
+          '01234' + builder._getTabWrapper(3).outerHTML + '56' +
+          LINE_FEED_HTML +
+          '789');
     });
 
-    test('_addNewlines not called if line_wrapping is true', done => {
+    test('newlines 4', () => {
+      const text = '👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍';
+      assert.equal(builder._formatText(text, 4, 20).innerHTML,
+          '👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍' +
+          LINE_FEED_HTML +
+          '👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍' +
+          LINE_FEED_HTML +
+          '👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍');
+    });
+
+
+    test('line_length ignored if line_wrapping is true', () => {
       builder._prefs = {line_wrapping: true, tab_size: 4, line_length: 50};
-      const text = (new Array(52)).join('a');
+      const text = 'a'.repeat(51);
 
       const line = {text, highlights: []};
-      const newLineStub = sandbox.stub(builder, '_addNewlines');
-      builder._createTextEl(line);
-      flush(() => {
-        assert.isFalse(newLineStub.called);
-        done();
-      });
+      const result = builder._createTextEl(line).firstChild.innerHTML;
+      assert.equal(result, text);
     });
 
-    test('_addNewlines called if line_wrapping is true and meets other ' +
-        'conditions', done => {
+    test('line_length applied if line_wrapping is false', () => {
       builder._prefs = {line_wrapping: false, tab_size: 4, line_length: 50};
-      const text = (new Array(52)).join('a');
+      const text = 'a'.repeat(51);
 
       const line = {text, highlights: []};
-      const newLineStub = sandbox.stub(builder, '_addNewlines');
-      builder._createTextEl(line);
-
-      flush(() => {
-        assert.isTrue(newLineStub.called);
-        done();
-      });
+      const expected = 'a'.repeat(50) + LINE_FEED_HTML + 'a';
+      const result = builder._createTextEl(line).firstChild.innerHTML;
+      assert.equal(result, expected);
     });
 
     test('_createTextEl linewrap with tabs', () => {
-      const text = _.times(7, _.constant('\t')).join('') + '!';
+      const text = '\t'.repeat(7) + '!';
       const line = {text, highlights: []};
       const el = builder._createTextEl(line);
-      const tabEl = el.querySelector('.contentText > .br');
-      assert.isOk(tabEl);
+      assert.equal(el.innerText, text);
+      // With line length 10 and tab size 2, there should be a line break
+      // after every two tabs.
+      const newlineEl = el.querySelector('.contentText > .br');
+      assert.isOk(newlineEl);
       assert.equal(
           el.querySelector('.contentText .tab:nth-child(2)').nextSibling,
-          tabEl);
+          newlineEl);
     });
 
     test('text length with tabs and unicode', () => {
-      assert.equal(builder._textLength('12345', 4), 5);
-      assert.equal(builder._textLength('\t\t12', 4), 10);
-      assert.equal(builder._textLength('abc💢123', 4), 7);
+      function expectTextLength(text, tabSize, expected) {
+        // Formatting to |expected| columns should not introduce line breaks.
+        const result = builder._formatText(text, tabSize, expected);
+        assert.isNotOk(result.querySelector('.contentText > .br'),
+            `  Expected the result of: \n` +
+            `      _formatText(${text}', ${tabSize}, ${expected})\n` +
+            `  to not contain a br. But the actual result HTML was:\n` +
+            `      '${result.innerHTML}'\nwhereupon`);
 
-      assert.equal(builder._textLength('abc\t', 8), 8);
-      assert.equal(builder._textLength('abc\t\t', 10), 20);
-      assert.equal(builder._textLength('', 10), 0);
-      assert.equal(builder._textLength('', 10), 0);
-      assert.equal(builder._textLength('abc\tde', 10), 12);
-      assert.equal(builder._textLength('abc\tde\t', 10), 20);
-      assert.equal(builder._textLength('\t\t\t\t\t', 20), 100);
+        // Increasing the line limit should produce the same markup.
+        assert.equal(builder._formatText(text, tabSize, Infinity).innerHTML,
+            result.innerHTML);
+        assert.equal(builder._formatText(text, tabSize, expected + 1).innerHTML,
+            result.innerHTML);
+
+        // Decreasing the line limit should introduce line breaks.
+        if (expected > 0) {
+          const tooSmall = builder._formatText(text, tabSize, expected - 1);
+          assert.isOk(tooSmall.querySelector('.contentText > .br'),
+              `  Expected the result of: \n` +
+              `      _formatText(${text}', ${tabSize}, ${expected - 1})\n` +
+              `  to contain a br. But the actual result HTML was:\n` +
+              `      '${tooSmall.innerHTML}'\nwhereupon`);
+        }
+      }
+      expectTextLength('12345', 4, 5);
+      expectTextLength('\t\t12', 4, 10);
+      expectTextLength('abc💢123', 4, 7);
+      expectTextLength('abc\t', 8, 8);
+      expectTextLength('abc\t\t', 10, 20);
+      expectTextLength('', 10, 0);
+      expectTextLength('', 10, 0);
+      // 17 Thai combining chars.
+      expectTextLength('ก้้้้้้้้้้้้้้้้', 4, 17);
+      expectTextLength('abc\tde', 10, 12);
+      expectTextLength('abc\tde\t', 10, 20);
+      expectTextLength('\t\t\t\t\t', 20, 100);
     });
 
     test('tab wrapper insertion', () => {
       const html = 'abc\tdef';
-      const wrapper = builder._getTabWrapper(
-          builder._prefs.tab_size - 3,
-          builder._prefs.show_tabs);
+      const tabSize = builder._prefs.tab_size;
+      const wrapper = builder._getTabWrapper(tabSize - 3);
       assert.ok(wrapper);
-      assert.isAbove(wrapper.length, 0);
-      assert.equal(builder._addTabWrappers(html, builder._prefs.tab_size),
-          'abc' + wrapper + 'def');
-      assert.throws(builder._getTabWrapper.bind(
-          builder,
-          // using \x3c instead of < in string so gjslint can parse
-          '">\x3cimg src="/" onerror="alert(1);">\x3cspan class="',
-          true));
+      assert.equal(wrapper.innerText, '\t');
+      assert.equal(
+          builder._formatText(html, tabSize, Infinity).innerHTML,
+          'abc' + wrapper.outerHTML + 'def');
+    });
+
+    test('tab wrapper style', () => {
+      const pattern = new RegExp('^<span class="style-scope gr-diff tab" '
+          + 'style="(?:-moz-)?tab-size: (\\d+);">\\t<\\/span>$');
+
+      for (const size of [1, 3, 8, 55]) {
+        const html = builder._getTabWrapper(size).outerHTML;
+        expect(html).to.match(pattern);
+        assert.equal(html.match(pattern)[1], size);
+      }
     });
 
     test('comments', () => {
@@ -264,41 +472,56 @@
         right: [r5],
       };
 
+      function threadForComment(c, patchNum) {
+        return {
+          commentSide: c.__commentSide,
+          comments: [c],
+          patchNum,
+          rootId: c.id,
+          start_datetime: c.updated,
+        };
+      }
+
       function checkThreadGroupProps(threadGroupEl, patchNum, isOnParent,
           comments) {
-        assert.equal(threadGroupEl.changeNum, '42');
-        assert.equal(threadGroupEl.patchForNewThreads, patchNum);
-        assert.equal(threadGroupEl.path, '/path/to/foo');
-        assert.equal(threadGroupEl.isOnParent, isOnParent);
-        assert.deepEqual(threadGroupEl.projectName, 'my-project');
-        assert.deepEqual(threadGroupEl.comments, comments);
+        assert.equal(createThreadGroupFn.lastCall.args[0], patchNum);
+        assert.equal(createThreadGroupFn.lastCall.args[1], isOnParent);
+        assert.deepEqual(
+            threadGroupEl.threads,
+            comments.map(c => threadForComment(c, patchNum)));
       }
 
       let line = new GrDiffLine(GrDiffLine.Type.BOTH);
       line.beforeNumber = 5;
       line.afterNumber = 5;
       let threadGroupEl = builder._commentThreadGroupForLine(line);
+      assert.isTrue(createThreadGroupFn.calledOnce);
       checkThreadGroupProps(threadGroupEl, '3', false, [l5, r5]);
 
       threadGroupEl =
           builder._commentThreadGroupForLine(line, GrDiffBuilder.Side.RIGHT);
+      assert.isTrue(createThreadGroupFn.calledTwice);
       checkThreadGroupProps(threadGroupEl, '3', false, [r5]);
 
       threadGroupEl =
           builder._commentThreadGroupForLine(line, GrDiffBuilder.Side.LEFT);
+      assert.isTrue(createThreadGroupFn.calledThrice);
       checkThreadGroupProps(threadGroupEl, '3', true, [l5]);
 
       builder._comments.meta.patchRange.basePatchNum = '1';
 
       threadGroupEl = builder._commentThreadGroupForLine(line);
+      assert.equal(createThreadGroupFn.callCount, 4);
       checkThreadGroupProps(threadGroupEl, '3', false, [l5, r5]);
 
       threadEl =
           builder._commentThreadGroupForLine(line, GrDiffBuilder.Side.LEFT);
+      assert.equal(createThreadGroupFn.callCount, 5);
       checkThreadGroupProps(threadEl, '1', false, [l5]);
 
       threadGroupEl =
           builder._commentThreadGroupForLine(line, GrDiffBuilder.Side.RIGHT);
+      assert.equal(createThreadGroupFn.callCount, 6);
       checkThreadGroupProps(threadGroupEl, '3', false, [r5]);
 
       builder._comments.meta.patchRange.basePatchNum = 'PARENT';
@@ -307,15 +530,60 @@
       line.beforeNumber = 5;
       line.afterNumber = 5;
       threadGroupEl = builder._commentThreadGroupForLine(line);
+      assert.equal(createThreadGroupFn.callCount, 7);
       checkThreadGroupProps(threadGroupEl, '3', true, [l5, r5]);
 
       line = new GrDiffLine(GrDiffLine.Type.ADD);
       line.beforeNumber = 3;
       line.afterNumber = 5;
       threadGroupEl = builder._commentThreadGroupForLine(line);
+      assert.equal(createThreadGroupFn.callCount, 8);
       checkThreadGroupProps(threadGroupEl, '3', false, [l3, r5]);
     });
 
+
+    test('_handlePreferenceError called with invalid preference', () => {
+      sandbox.stub(element, '_handlePreferenceError');
+      const prefs = {tab_size: 0};
+      element._getDiffBuilder(element.diff, element.comments, prefs);
+      assert.isTrue(element._handlePreferenceError.lastCall
+          .calledWithExactly('tab size'));
+    });
+
+    test('_handlePreferenceError triggers alert and javascript error', () => {
+      const errorStub = sinon.stub();
+      element.addEventListener('show-alert', errorStub);
+      assert.throws(element._handlePreferenceError.bind(element, 'tab size'));
+      assert.equal(errorStub.lastCall.args[0].detail.message,
+          `The value of the 'tab size' user preference is invalid. ` +
+        `Fix in diff preferences`);
+    });
+
+    test('_getKeyLocations', () => {
+      assert.deepEqual(element._getKeyLocations({left: [], right: []}, null),
+          {left: {}, right: {}});
+      const comments = {
+        left: [{line: 123}, {}],
+        right: [{line: 456}],
+      };
+      assert.deepEqual(element._getKeyLocations(comments, null), {
+        left: {FILE: true, 123: true},
+        right: {456: true},
+      });
+
+      const lineOfInterest = {number: 789, leftSide: true};
+      assert.deepEqual(element._getKeyLocations(comments, lineOfInterest), {
+        left: {FILE: true, 123: true, 789: true},
+        right: {456: true},
+      });
+
+      delete lineOfInterest.leftSide;
+      assert.deepEqual(element._getKeyLocations(comments, lineOfInterest), {
+        left: {FILE: true, 123: true},
+        right: {456: true, 789: true},
+      });
+    });
+
     suite('_isTotal', () => {
       test('is total for add', () => {
         const group = new GrDiffGroup(GrDiffGroup.Type.DELTA);
@@ -621,6 +889,33 @@
       });
     });
 
+    suite('layers from plugins', () => {
+      let element;
+      let initialLayersCount;
+
+      setup(() => {
+        element = fixture('basic');
+        element._showTrailingWhitespace = true;
+        initialLayersCount = element._layers.length;
+      });
+
+      test('no plugin layers', () => {
+        const getDiffLayersStub = sinon.stub(element.$.jsAPI, 'getDiffLayers')
+                                       .returns([]);
+        element.attached();
+        assert.isTrue(getDiffLayersStub.called);
+        assert.equal(element._layers.length, initialLayersCount);
+      });
+
+      test('with plugin layers', () => {
+        const getDiffLayersStub = sinon.stub(element.$.jsAPI, 'getDiffLayers')
+                                       .returns([{}, {}]);
+        element.attached();
+        assert.isTrue(getDiffLayersStub.called);
+        assert.equal(element._layers.length, initialLayersCount+2);
+      });
+    });
+
     suite('trailing whitespace', () => {
       let element;
       let layer;
@@ -716,6 +1011,63 @@
       });
     });
 
+    suite('rendering text, images and binary files', () => {
+      let processStub;
+      let comments;
+      let prefs;
+      let content;
+
+      setup(() => {
+        element = fixture('basic');
+        element.viewMode = 'SIDE_BY_SIDE';
+        processStub = sandbox.stub(element.$.processor, 'process')
+            .returns(Promise.resolve());
+        sandbox.stub(element, '_anyLineTooLong').returns(true);
+        comments = {left: [], right: []};
+        prefs = {
+          line_length: 10,
+          show_tabs: true,
+          tab_size: 4,
+          context: -1,
+          syntax_highlighting: true,
+        };
+        content = [{
+          a: ['all work and no play make andybons a dull boy'],
+          b: ['elgoog elgoog elgoog'],
+        }, {
+          ab: [
+            'Non eram nescius, Brute, cum, quae summis ingeniis ',
+            'exquisitaque doctrina philosophi Graeco sermone tractavissent',
+          ],
+        }];
+      });
+
+      test('text', () => {
+        element.diff = {content};
+        return element.render(comments, prefs).then(() => {
+          assert.isTrue(processStub.calledOnce);
+          assert.isFalse(processStub.lastCall.args[1]);
+        });
+      });
+
+      test('image', () => {
+        element.diff = {content, binary: true};
+        element.isImageDiff = true;
+        return element.render(comments, prefs).then(() => {
+          assert.isTrue(processStub.calledOnce);
+          assert.isTrue(processStub.lastCall.args[1]);
+        });
+      });
+
+      test('binary', () => {
+        element.diff = {content, binary: true};
+        return element.render(comments, prefs).then(() => {
+          assert.isTrue(processStub.calledOnce);
+          assert.isTrue(processStub.lastCall.args[1]);
+        });
+      });
+    });
+
     suite('rendering', () => {
       let content;
       let outputEl;
@@ -748,7 +1100,7 @@
         outputEl = element.queryEffectiveChildren('#diffTable');
         sandbox.stub(element, '_getDiffBuilder', () => {
           const builder = new GrDiffBuilder(
-              {content}, {left: [], right: []}, prefs, 'my-project', outputEl);
+              {content}, {left: [], right: []}, null, prefs, outputEl);
           sandbox.stub(builder, 'addColumns');
           builder.buildSectionElement = function(group) {
             const section = document.createElement('stub');
@@ -872,6 +1224,10 @@
         });
       });
 
+      test('getDiffLength', () => {
+        assert.equal(element.getDiffLength(diff), 52);
+      });
+
       test('getContentByLine', () => {
         let actual;
 
@@ -922,6 +1278,29 @@
         });
       });
 
+      test('_renderContentByRange notexistent elements', () => {
+        const spy = sandbox.spy(builder, '_createTextEl');
+
+        sandbox.stub(builder, 'findLinesByRange',
+            (s, e, d, lines, elements) => {
+              // Add a line and a corresponding element.
+              lines.push(new GrDiffLine(GrDiffLine.Type.BOTH));
+              const parEl = document.createElement('div');
+              const el = document.createElement('div');
+              parEl.appendChild(el);
+              elements.push(el);
+
+              // Add 2 lines without corresponding elements.
+              lines.push(new GrDiffLine(GrDiffLine.Type.BOTH));
+              lines.push(new GrDiffLine(GrDiffLine.Type.BOTH));
+            });
+
+        builder._renderContentByRange(1, 10, 'left');
+        // Should be called only once because only one line had a corresponding
+        // element.
+        assert.equal(spy.callCount, 1);
+      });
+
       test('_getNextContentOnSide side-by-side left', () => {
         const startElem = builder.getContentByLine(5, 'left',
             element.$.diffTable);
@@ -986,20 +1365,15 @@
         });
       });
 
-      test('_escapeHTML', () => {
+      test('escaping HTML', () => {
         let input = '<script>alert("XSS");<' + '/script>';
-        let expected = '&lt;script&gt;alert(&quot;XSS&quot;);' +
-            '&lt;&#x2F;script&gt;';
-        let result = GrDiffBuilder.prototype._escapeHTML(input);
+        let expected = '&lt;script&gt;alert("XSS");&lt;/script&gt;';
+        let result = builder._formatText(input, 1, Infinity).innerHTML;
         assert.equal(result, expected);
 
         input = '& < > " \' / `';
-
-        // \u0026 is an ampersand. This is being used here instead of &
-        // because of the gjslinter.
-        expected = '\u0026amp; \u0026lt; \u0026gt; \u0026quot;' +
-          ' \u0026#39; \u0026#x2F; \u0026#96;';
-        result = GrDiffBuilder.prototype._escapeHTML(input);
+        expected = '&amp; &lt; &gt; " \' / `';
+        result = builder._formatText(input, 1, Infinity).innerHTML;
         assert.equal(result, expected);
       });
     });
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-comment-thread-group/gr-diff-comment-thread-group.html b/polygerrit-ui/app/elements/diff/gr-diff-comment-thread-group/gr-diff-comment-thread-group.html
index fdb7b6a..58b7c32 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-comment-thread-group/gr-diff-comment-thread-group.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-comment-thread-group/gr-diff-comment-thread-group.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,22 +24,26 @@
     <style include="shared-styles">
       :host {
         display: block;
+        max-width: var(--content-width, 80ch);
         white-space: normal;
       }
       gr-diff-comment-thread + gr-diff-comment-thread {
         margin-top: .2em;
       }
     </style>
-    <template is="dom-repeat" items="[[_threads]]" as="thread">
+    <template is="dom-repeat" items="[[threads]]" as="thread">
       <gr-diff-comment-thread
           comments="[[thread.comments]]"
           comment-side="[[thread.commentSide]]"
           is-on-parent="[[isOnParent]]"
+          parent-index="[[parentIndex]]"
           change-num="[[changeNum]]"
-          location-range="[[thread.locationRange]]"
           patch-num="[[thread.patchNum]]"
+          root-id="{{thread.rootId}}"
           path="[[path]]"
-          project-name="[[projectName]]"></gr-diff-comment-thread>
+          project-name="[[projectName]]"
+          range="[[thread.range]]"
+          on-thread-discard="_handleThreadDiscard"></gr-diff-comment-thread>
     </template>
   </template>
   <script src="gr-diff-comment-thread-group.js"></script>
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-comment-thread-group/gr-diff-comment-thread-group.js b/polygerrit-ui/app/elements/diff/gr-diff-comment-thread-group/gr-diff-comment-thread-group.js
index b6af0d8..ae45c93 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-comment-thread-group/gr-diff-comment-thread-group.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff-comment-thread-group/gr-diff-comment-thread-group.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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';
 
@@ -19,10 +22,6 @@
 
     properties: {
       changeNum: String,
-      comments: {
-        type: Array,
-        value() { return []; },
-      },
       projectName: String,
       patchForNewThreads: String,
       range: Object,
@@ -30,46 +29,81 @@
         type: Boolean,
         value: false,
       },
-      _threads: {
+      parentIndex: {
+        type: Number,
+        value: null,
+      },
+      threads: {
         type: Array,
         value() { return []; },
       },
     },
 
-    observers: [
-      '_commentsChanged(comments.*)',
-    ],
+    get threadEls() {
+      return Polymer.dom(this.root).querySelectorAll('gr-diff-comment-thread');
+    },
 
-    addNewThread(locationRange) {
-      this.push('_threads', {
+    /**
+     * Adds a new thread. Range is optional because a comment can be
+     * added to a line without a range selected.
+     *
+     * @param {!Object} opt_range
+     */
+    addNewThread(commentSide, opt_range) {
+      this.push('threads', {
         comments: [],
-        locationRange,
+        commentSide,
         patchNum: this.patchForNewThreads,
+        range: opt_range,
       });
     },
 
-    removeThread(locationRange) {
-      for (let i = 0; i < this._threads.length; i++) {
-        if (this._threads[i].locationRange === locationRange) {
-          this.splice('_threads', i, 1);
+    removeThread(rootId) {
+      for (let i = 0; i < this.threads.length; i++) {
+        if (this.threads[i].rootId === rootId) {
+          this.splice('threads', i, 1);
           return;
         }
       }
     },
 
-    getThreadForRange(rangeToCheck) {
-      const threads = [].filter.call(
-          Polymer.dom(this.root).querySelectorAll('gr-diff-comment-thread'),
-          thread => {
-            return thread.locationRange === rangeToCheck;
-          });
+    /**
+     * Fetch the thread group at the given range, or the range-less thread
+     * on the line if no range is provided, lineNum, and side.
+     *
+     * @param {string} side
+     * @param {!Object=} opt_range
+     * @return {!Object|undefined}
+     */
+    getThread(side, opt_range) {
+      const threads = [].filter.call(this.threadEls,
+          thread => this._rangesEqual(thread.range, opt_range))
+          .filter(thread => thread.commentSide === side);
       if (threads.length === 1) {
         return threads[0];
       }
     },
 
-    _commentsChanged() {
-      this._threads = this._getThreadGroups(this.comments);
+    _handleThreadDiscard(e) {
+      this.removeThread(e.detail.rootId);
+    },
+
+    /**
+     * Compare two ranges. Either argument may be falsy, but will only return
+     * true if both are falsy or if neither are falsy and have the same position
+     * values.
+     *
+     * @param {Object=} a range 1
+     * @param {Object=} b range 2
+     * @return {boolean}
+     */
+    _rangesEqual(a, b) {
+      if (!a && !b) { return true; }
+      if (!a || !b) { return false; }
+      return a.startLine === b.startLine &&
+          a.startChar === b.startChar &&
+          a.endLine === b.endLine &&
+          a.endChar === b.endChar;
     },
 
     _sortByDate(threadGroups) {
@@ -95,48 +129,5 @@
           range.end_character + '-' +
           comment.__commentSide;
     },
-
-    /**
-     * Determines what the patchNum of a thread should be. Use patchNum from
-     * comment if it exists, otherwise the property of the thread group.
-     * This is needed for switching between side-by-side and unified views when
-     * there are unsaved drafts.
-     */
-    _getPatchNum(comment) {
-      return comment.patchNum || this.patchForNewThreads;
-    },
-
-    _getThreadGroups(comments) {
-      const threadGroups = {};
-
-      for (const comment of comments) {
-        let locationRange;
-        if (!comment.range) {
-          locationRange = 'line-' + comment.__commentSide;
-        } else {
-          locationRange = this._calculateLocationRange(comment.range, comment);
-        }
-
-        if (threadGroups[locationRange]) {
-          threadGroups[locationRange].comments.push(comment);
-        } else {
-          threadGroups[locationRange] = {
-            start_datetime: comment.updated,
-            comments: [comment],
-            locationRange,
-            commentSide: comment.__commentSide,
-            patchNum: this._getPatchNum(comment),
-          };
-        }
-      }
-
-      const threadGroupArr = [];
-      const threadGroupKeys = Object.keys(threadGroups);
-      for (const threadGroupKey of threadGroupKeys) {
-        threadGroupArr.push(threadGroups[threadGroupKey]);
-      }
-
-      return this._sortByDate(threadGroupArr);
-    },
   });
 })();
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-comment-thread-group/gr-diff-comment-thread-group_test.html b/polygerrit-ui/app/elements/diff/gr-diff-comment-thread-group/gr-diff-comment-thread-group_test.html
index c2738460..1fb8136 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-comment-thread-group/gr-diff-comment-thread-group_test.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-comment-thread-group/gr-diff-comment-thread-group_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -50,99 +51,75 @@
       sandbox.restore();
     });
 
-    test('_getThreadGroups', () => {
-      element.patchForNewThreads = 3;
-      const comments = [
+    test('getThread', () => {
+      const range = {
+        start_line: 1,
+        start_character: 1,
+        end_line: 1,
+        end_character: 2,
+      };
+      element.threads = [
         {
-          id: 'sallys_confession',
-          message: 'i like you, jack',
-          updated: '2015-12-23 15:00:20.396000000',
-          __commentSide: 'left',
-        }, {
-          id: 'jacks_reply',
-          message: 'i like you, too',
-          updated: '2015-12-24 15:00:20.396000000',
-          __commentSide: 'left',
-        },
-      ];
-
-      let expectedThreadGroups = [
-        {
-          start_datetime: '2015-12-23 15:00:20.396000000',
+          rootId: 'sallys_confession',
           commentSide: 'left',
-          comments: [{
-            id: 'sallys_confession',
-            message: 'i like you, jack',
-            updated: '2015-12-23 15:00:20.396000000',
-            __commentSide: 'left',
-          }, {
-            id: 'jacks_reply',
-            message: 'i like you, too',
-            updated: '2015-12-24 15:00:20.396000000',
-            __commentSide: 'left',
-          }],
-          locationRange: 'line-left',
-          patchNum: 3,
-        },
-      ];
-
-      assert.deepEqual(element._getThreadGroups(comments),
-          expectedThreadGroups);
-
-      // Patch num should get inherited from comment rather
-      comments.push({
-        id: 'betsys_confession',
-        message: 'i like you, jack',
-        updated: '2015-12-24 15:00:10.396000000',
-        range: {
-          start_line: 1,
-          start_character: 1,
-          end_line: 1,
-          end_character: 2,
-        },
-        __commentSide: 'left',
-      });
-
-      expectedThreadGroups = [
-        {
-          start_datetime: '2015-12-23 15:00:20.396000000',
-          commentSide: 'left',
-          comments: [{
-            id: 'sallys_confession',
-            message: 'i like you, jack',
-            updated: '2015-12-23 15:00:20.396000000',
-            __commentSide: 'left',
-          }, {
-            id: 'jacks_reply',
-            message: 'i like you, too',
-            updated: '2015-12-24 15:00:20.396000000',
-            __commentSide: 'left',
-          }],
-          patchNum: 3,
-          locationRange: 'line-left',
-        },
-        {
-          start_datetime: '2015-12-24 15:00:10.396000000',
-          commentSide: 'left',
-          comments: [{
-            id: 'betsys_confession',
-            message: 'i like you, jack',
-            updated: '2015-12-24 15:00:10.396000000',
-            range: {
-              start_line: 1,
-              start_character: 1,
-              end_line: 1,
-              end_character: 2,
+          comments: [
+            {
+              id: 'sallys_confession',
+              message: 'i like you, jack',
+              updated: '2015-12-23 15:00:20.396000000',
+              __commentSide: 'left',
+            }, {
+              id: 'jacks_reply',
+              message: 'i like you, too',
+              updated: '2015-12-24 15:01:20.396000000',
+              __commentSide: 'left',
+              in_reply_to: 'sallys_confession',
+            }, {
+              id: 'new_draft',
+              message: 'i do not like either of you',
+              __commentSide: 'left',
+              __draft: true,
+              in_reply_to: 'sallys_confession',
+              updated: '2015-12-20 15:01:20.396000000',
             },
-            __commentSide: 'left',
-          }],
-          patchNum: 3,
-          locationRange: 'range-1-1-1-2-left',
+          ],
+        },
+        {
+          rootId: 'right_side_comment',
+          commentSide: 'right',
+          comments: [
+            {
+              id: 'right_side_comment',
+              message: 'right side comment',
+              __commentSide: 'right',
+              __draft: true,
+              updated: '2015-12-20 15:01:20.396000000',
+            },
+          ],
+        }, {
+          rootId: 'betsys_confession',
+          commentSide: 'left',
+          range,
+          comments: [
+            {
+              id: 'betsys_confession',
+              message: 'i like you more, jack',
+              updated: '2015-12-24 15:00:10.396000000',
+              range,
+              __commentSide: 'left',
+            },
+          ],
         },
       ];
 
-      assert.deepEqual(element._getThreadGroups(comments),
-          expectedThreadGroups);
+      flushAsynchronousOperations();
+      assert.deepEqual(element.getThread('right').rootId, 'right_side_comment');
+      assert.deepEqual(element.getThread('right').comments.length, 1);
+      assert.deepEqual(element.getThread('left').rootId, 'sallys_confession');
+      assert.deepEqual(element.getThread('left').comments.length, 3);
+      assert.deepEqual(element.getThread('left', range).rootId,
+          'betsys_confession');
+      assert.deepEqual(element.getThread('left', range).comments.length, 1);
     });
 
     test('_sortByDate', () => {
@@ -215,17 +192,6 @@
           'range-1-2-3-4-left');
     });
 
-    test('thread groups are updated when comments change', () => {
-      const commentsChangedStub = sandbox.stub(element, '_commentsChanged');
-      element.comments = [];
-      element.comments.push({
-        id: 'sallys_confession',
-        message: 'i like you, jack',
-        updated: '2015-12-23 15:00:20.396000000',
-      });
-      assert(commentsChangedStub.called);
-    });
-
     test('addNewThread', () => {
       const locationRange = 'range-1-2-3-4';
       element._threads = [{locationRange: 'line'}];
@@ -233,18 +199,6 @@
       assert(element._threads.length, 2);
     });
 
-    test('_getPatchNum', () => {
-      element.patchForNewThreads = 3;
-      const comment = {
-        id: 'sallys_confession',
-        message: 'i like you, jack',
-        updated: '2015-12-23 15:00:20.396000000',
-      };
-      assert.equal(element._getPatchNum(comment), 3);
-      comment.patchNum = 4;
-      assert.equal(element._getPatchNum(comment), 4);
-    });
-
     test('removeThread', () => {
       const locationRange = 'range-1-2-3-4';
       element._threads = [
@@ -256,5 +210,23 @@
       flushAsynchronousOperations();
       assert(element._threads.length, 1);
     });
+
+    test('_rangesEqual', () => {
+      const range1 =
+          {startLine: 123, startChar: 345, endLine: 234, endChar: 456};
+      const range2 =
+          {startLine: 1, startChar: 2, endLine: 3, endChar: 4};
+
+      assert.isTrue(element._rangesEqual(null, null));
+      assert.isTrue(element._rangesEqual(null, undefined));
+      assert.isTrue(element._rangesEqual(undefined, null));
+      assert.isTrue(element._rangesEqual(undefined, undefined));
+
+      assert.isFalse(element._rangesEqual(range1, null));
+      assert.isFalse(element._rangesEqual(null, range1));
+      assert.isFalse(element._rangesEqual(range1, range2));
+
+      assert.isTrue(element._rangesEqual(range1, Object.assign({}, range1)));
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-comment-thread/gr-diff-comment-thread.html b/polygerrit-ui/app/elements/diff/gr-diff-comment-thread/gr-diff-comment-thread.html
index 7cc94af..c3a1de4 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-comment-thread/gr-diff-comment-thread.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-comment-thread/gr-diff-comment-thread.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -15,39 +16,37 @@
 -->
 
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../../behaviors/gr-path-list-behavior/gr-path-list-behavior.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../../core/gr-navigation/gr-navigation.html">
+<link rel="import" href="../../core/gr-reporting/gr-reporting.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
 <link rel="import" href="../../shared/gr-storage/gr-storage.html">
 <link rel="import" href="../gr-diff-comment/gr-diff-comment.html">
-<link rel="import" href="../../../styles/shared-styles.html">
 
 <dom-module id="gr-diff-comment-thread">
   <template>
     <style include="shared-styles">
-      :host {
-        border: 1px solid #bbb;
-        display: block;
-        margin-bottom: 1px;
-        white-space: normal;
-      }
       gr-button {
         margin-left: .5em;
-        --gr-button: {
-          color: #212121;
-        }
-        --gr-button-hover-color: rgba(33, 33, 33, .75);
       }
       #actions {
         margin-left: auto;
         padding: .5em .7em;
       }
       #container {
-        background-color: #fcfad6;
+        background-color: var(--comment-background-color);
+        border: 1px solid var(--border-color);
+        color: var(--comment-text-color);
+        display: block;
+        margin-bottom: 1px;
+        white-space: normal;
       }
       #container.unresolved {
-        background-color: #fcfaa6;
+        background-color: var(--unresolved-comment-background-color);
       }
       #commentInfoContainer {
-        border-top: 1px dotted #bbb;
+        border-top: 1px dotted var(--border-color);
         display: flex;
       }
       #unresolvedLabel {
@@ -55,8 +54,22 @@
         margin: auto 0;
         padding: .5em .7em;
       }
+      .pathInfo {
+        display: flex;
+        align-items: baseline;
+      }
+      .descriptionText {
+        margin-left: .5rem;
+        font-style: italic;
+      }
     </style>
-    <div id="container" class$="[[_computeHostClass(_unresolved)]]">
+    <template is="dom-if" if="[[showFilePath]]">
+      <div class="pathInfo">
+        <a href$="[[_getDiffUrlForComment(projectName, changeNum, path, patchNum)]]">[[_computeDisplayPath(path)]]</a>
+        <span class="descriptionText">Patchset [[patchNum]]</span>
+      </div>
+    </template>
+    <div id="container" class$="[[_computeHostClass(unresolved)]]">
       <template id="commentList" is="dom-repeat" items="[[_orderedComments]]"
           as="comment">
         <gr-diff-comment
@@ -68,37 +81,44 @@
             show-actions="[[_showActions]]"
             comment-side="[[comment.__commentSide]]"
             side="[[comment.side]]"
+            root-id="[[rootId]]"
             project-config="[[_projectConfig]]"
             on-create-fix-comment="_handleCommentFix"
-            on-comment-discard="_handleCommentDiscard"></gr-diff-comment>
+            on-comment-discard="_handleCommentDiscard"
+            on-comment-save="_handleCommentSavedOrDiscarded"></gr-diff-comment>
       </template>
       <div id="commentInfoContainer"
           hidden$="[[_hideActions(_showActions, _lastComment)]]">
-        <span id="unresolvedLabel" hidden$="[[!_unresolved]]">Unresolved</span>
+        <span id="unresolvedLabel" hidden$="[[!unresolved]]">Unresolved</span>
         <div id="actions">
           <gr-button
               id="replyBtn"
               link
+              secondary
               class="action reply"
               on-tap="_handleCommentReply">Reply</gr-button>
           <gr-button
               id="quoteBtn"
               link
+              secondary
               class="action quote"
               on-tap="_handleCommentQuote">Quote</gr-button>
           <gr-button
               id="ackBtn"
               link
+              secondary
               class="action ack"
               on-tap="_handleCommentAck">Ack</gr-button>
           <gr-button
               id="doneBtn"
               link
+              secondary
               class="action done"
               on-tap="_handleCommentDone">Done</gr-button>
         </div>
       </div>
     </div>
+    <gr-reporting id="reporting"></gr-reporting>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
     <gr-storage id="storage"></gr-storage>
   </template>
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-comment-thread/gr-diff-comment-thread.js b/polygerrit-ui/app/elements/diff/gr-diff-comment-thread/gr-diff-comment-thread.js
index e9ab3d6..d5e6855 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-comment-thread/gr-diff-comment-thread.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff-comment-thread/gr-diff-comment-thread.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -26,13 +29,19 @@
      * @event thread-discard
      */
 
+    /**
+     * Fired when a comment in the thread is permanently modified.
+     *
+     * @event thread-changed
+     */
+
     properties: {
       changeNum: String,
       comments: {
         type: Array,
         value() { return []; },
       },
-      locationRange: String,
+      range: Object,
       keyEventTarget: {
         type: Object,
         value() { return document.body; },
@@ -44,23 +53,48 @@
         type: String,
         observer: '_projectNameChanged',
       },
+      hasDraft: {
+        type: Boolean,
+        notify: true,
+        reflectToAttribute: true,
+      },
       isOnParent: {
         type: Boolean,
         value: false,
       },
-
+      parentIndex: {
+        type: Number,
+        value: null,
+      },
+      rootId: {
+        type: String,
+        notify: true,
+        computed: '_computeRootId(comments.*)',
+      },
+      /**
+       * If this is true, the comment thread also needs to have the change and
+       * line properties property set
+       */
+      showFilePath: {
+        type: Boolean,
+        value: false,
+      },
+      /** Necessary only if showFilePath is true */
+      lineNum: Number,
+      unresolved: {
+        type: Boolean,
+        notify: true,
+        reflectToAttribute: true,
+      },
       _showActions: Boolean,
       _lastComment: Object,
       _orderedComments: Array,
-      _unresolved: {
-        type: Boolean,
-        notify: true,
-      },
       _projectConfig: Object,
     },
 
     behaviors: [
       Gerrit.KeyboardShortcutBehavior,
+      Gerrit.PathListBehavior,
     ],
 
     listeners: {
@@ -107,15 +141,36 @@
       this.push('comments', draft);
     },
 
+    fireRemoveSelf() {
+      this.dispatchEvent(new CustomEvent('thread-discard',
+          {detail: {rootId: this.rootId}, bubbles: false}));
+    },
+
+    _getDiffUrlForComment(projectName, changeNum, path, patchNum) {
+      return Gerrit.Nav.getUrlForDiffById(changeNum,
+          projectName, path, patchNum,
+          null, this.lineNum);
+    },
+
+    _computeDisplayPath(path) {
+      const lineString = this.lineNum ? `#${this.lineNum}` : '';
+      return this.computeDisplayPath(path) + lineString;
+    },
+
     _getLoggedIn() {
       return this.$.restAPI.getLoggedIn();
     },
 
-    _commentsChanged(changeRecord) {
+    _commentsChanged() {
       this._orderedComments = this._sortedComments(this.comments);
+      this.updateThreadProperties();
+    },
+
+    updateThreadProperties() {
       if (this._orderedComments.length) {
         this._lastComment = this._getLastComment();
-        this._unresolved = this._lastComment.unresolved;
+        this.unresolved = this._lastComment.unresolved;
+        this.hasDraft = this._lastComment.__draft;
       }
     },
 
@@ -149,18 +204,21 @@
     },
 
     /**
-     * Sets the initial state of the comment thread to have the last
-     * {UNRESOLVED_EXPAND_COUNT} comments expanded by default if the
-     * thread is unresolved.
+     * Sets the initial state of the comment thread.
+     * Expands the thread if one of the following is true:
+     * - last {UNRESOLVED_EXPAND_COUNT} comments expanded by default if the
+     * thread is unresolved,
+     * - it's a robot comment.
      */
     _setInitialExpandedState() {
-      let comment;
       if (this._orderedComments) {
         for (let i = 0; i < this._orderedComments.length; i++) {
-          comment = this._orderedComments[i];
-          comment.collapsed =
-              this._orderedComments.length - i - 1 >= UNRESOLVED_EXPAND_COUNT ||
-              !this._unresolved;
+          const comment = this._orderedComments[i];
+          const isRobotComment = !!comment.robot_id;
+          // False if it's an unresolved comment under UNRESOLVED_EXPAND_COUNT.
+          const resolvedThread = !this.unresolved ||
+                this._orderedComments.length - i - 1 >= UNRESOLVED_EXPAND_COUNT;
+          comment.collapsed = !isRobotComment && resolvedThread;
         }
       }
     },
@@ -170,7 +228,12 @@
         const c1Date = c1.__date || util.parseDate(c1.updated);
         const c2Date = c2.__date || util.parseDate(c2.updated);
         const dateCompare = c1Date - c2Date;
-        if (!c1.id || !c1.id.localeCompare) { return 0; }
+        // Ensure drafts are at the end. There should only be one but in edge
+        // cases could be more. In the unlikely event two drafts are being
+        // compared, use the typical date compare.
+        if (c2.__draft && !c1.__draft ) { return 0; }
+        if (c1.__draft && !c2.__draft ) { return 1; }
+        if (dateCompare === 0 && (!c1.id || !c1.id.localeCompare)) { return 0; }
         // If same date, fall back to sorting by id.
         return dateCompare ? dateCompare : c1.id.localeCompare(c2.id);
       });
@@ -178,6 +241,7 @@
 
     _createReplyComment(parent, content, opt_isEditing,
         opt_unresolved) {
+      this.$.reporting.recordDraftInteraction();
       const reply = this._newReply(
           this._orderedComments[this._orderedComments.length - 1].id,
           parent.line,
@@ -301,6 +365,9 @@
           end_character: opt_range.endChar,
         };
       }
+      if (this.parentIndex) {
+        d.parent = this.parentIndex;
+      }
       return d;
     },
 
@@ -309,6 +376,14 @@
       return 'REVISION';
     },
 
+    _computeRootId(comments) {
+      // Keep the root ID even if the comment was removed, so that notification
+      // to sync will know which thread to remove.
+      if (!comments.base.length) { return this.rootId; }
+      const rootComment = comments.base[0];
+      return rootComment.id || rootComment.__draftID;
+    },
+
     _handleCommentDiscard(e) {
       const diffCommentEl = Polymer.dom(e).rootTarget;
       const comment = diffCommentEl.comment;
@@ -318,9 +393,10 @@
             JSON.stringify(diffCommentEl.comment));
       }
       this.splice('comments', idx, 1);
-      if (this.comments.length == 0) {
-        this.fire('thread-discard', {lastComment: comment});
+      if (this.comments.length === 0) {
+        this.fireRemoveSelf();
       }
+      this._handleCommentSavedOrDiscarded(e);
 
       // Check to see if there are any other open comments getting edited and
       // set the local storage value to its message value.
@@ -338,6 +414,12 @@
       }
     },
 
+    _handleCommentSavedOrDiscarded(e) {
+      this.dispatchEvent(new CustomEvent('thread-changed',
+          {detail: {rootId: this.rootId, path: this.path},
+            bubbles: false}));
+    },
+
     _handleCommentUpdate(e) {
       const comment = e.detail.comment;
       const index = this._indexOf(comment, this.comments);
@@ -347,6 +429,11 @@
         return;
       }
       this.set(['comments', index], comment);
+      // Because of the way we pass these comment objects around by-ref, in
+      // combination with the fact that Polymer does dirty checking in
+      // observers, the this.set() call above will not cause a thread update in
+      // some situations.
+      this.updateThreadProperties();
     },
 
     _indexOf(comment, arr) {
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-comment-thread/gr-diff-comment-thread_test.html b/polygerrit-ui/app/elements/diff/gr-diff-comment-thread/gr-diff-comment-thread_test.html
index c96c031..b525a60 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-comment-thread/gr-diff-comment-thread_test.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-comment-thread/gr-diff-comment-thread_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -60,10 +61,9 @@
     test('comments are sorted correctly', () => {
       const comments = [
         {
-          id: 'jacks_reply',
           message: 'i like you, too',
           in_reply_to: 'sallys_confession',
-          updated: '2015-12-25 15:00:20.396000000',
+          __date: new Date('2015-12-25'),
         }, {
           id: 'sallys_confession',
           message: 'i like you, jack',
@@ -113,10 +113,9 @@
           message: 'i have to find santa',
           updated: '2015-12-24 15:00:20.396000000',
         }, {
-          id: 'jacks_reply',
           message: 'i like you, too',
           in_reply_to: 'sallys_confession',
-          updated: '2015-12-25 15:00:20.396000000',
+          __date: new Date('2015-12-25'),
         },
       ]);
     });
@@ -172,12 +171,43 @@
         done();
       });
     });
+
+    test('optionally show file path', () => {
+      // Path info doesn't exist when showFilePath is false. Because it's in a
+      // dom-if it is not yet in the dom.
+      assert.isNotOk(element.$$('.pathInfo'));
+
+      sandbox.stub(Gerrit.Nav, 'getUrlForDiffById');
+      element.changeNum = 123;
+      element.projectName = 'test project';
+      element.path = 'path/to/file';
+      element.patchNum = 3;
+      element.lineNum = 5;
+      element.showFilePath = true;
+      flushAsynchronousOperations();
+      assert.isOk(element.$$('.pathInfo'));
+      assert.notEqual(getComputedStyle(element.$$('.pathInfo')).display,
+          'none');
+      assert.isTrue(Gerrit.Nav.getUrlForDiffById.lastCall.calledWithExactly(
+          element.changeNum, element.projectName, element.path,
+          element.patchNum, null, element.lineNum));
+    });
+
+    test('_computeDisplayPath', () => {
+      const path = 'path/to/file';
+      assert.equal(element._computeDisplayPath(path), 'path/to/file');
+
+      element.lineNum = 5;
+      assert.equal(element._computeDisplayPath(path), 'path/to/file#5');
+    });
   });
 
   suite('comment action tests', () => {
     let element;
+    let sandbox;
 
     setup(() => {
+      sandbox = sinon.sandbox.create();
       stub('gr-rest-api-interface', {
         getLoggedIn() { return Promise.resolve(false); },
         saveDiffDraft() {
@@ -208,12 +238,19 @@
         line: 5,
         message: 'is this a crossover episode!?',
         updated: '2015-12-08 19:48:33.843000000',
+        path: '/path/to/file.txt',
       }];
       flushAsynchronousOperations();
     });
 
-    test('reply', done => {
+    teardown(() => {
+      sandbox.restore();
+    });
+
+    test('reply', () => {
       const commentEl = element.$$('gr-diff-comment');
+      const reportStub = sandbox.stub(element.$.reporting,
+          'recordDraftInteraction');
       assert.ok(commentEl);
 
       const replyBtn = element.$.replyBtn;
@@ -226,11 +263,13 @@
       assert.equal(drafts.length, 1);
       assert.notOk(drafts[0].message, 'message should be empty');
       assert.equal(drafts[0].in_reply_to, 'baf0414d_60047215');
-      done();
+      assert.isTrue(reportStub.calledOnce);
     });
 
-    test('quote reply', done => {
+    test('quote reply', () => {
       const commentEl = element.$$('gr-diff-comment');
+      const reportStub = sandbox.stub(element.$.reporting,
+          'recordDraftInteraction');
       assert.ok(commentEl);
 
       const quoteBtn = element.$.quoteBtn;
@@ -243,10 +282,12 @@
       assert.equal(drafts.length, 1);
       assert.equal(drafts[0].message, '> is this a crossover episode!?\n\n');
       assert.equal(drafts[0].in_reply_to, 'baf0414d_60047215');
-      done();
+      assert.isTrue(reportStub.calledOnce);
     });
 
-    test('quote reply multiline', done => {
+    test('quote reply multiline', () => {
+      const reportStub = sandbox.stub(element.$.reporting,
+          'recordDraftInteraction');
       element.comments = [{
         author: {
           name: 'Mr. Peanutbutter',
@@ -273,10 +314,12 @@
       assert.equal(drafts[0].message,
           '> is this a crossover episode!?\n> It might be!\n\n');
       assert.equal(drafts[0].in_reply_to, 'baf0414d_60047215');
-      done();
+      assert.isTrue(reportStub.calledOnce);
     });
 
     test('ack', done => {
+      const reportStub = sandbox.stub(element.$.reporting,
+          'recordDraftInteraction');
       element.changeNum = '42';
       element.patchNum = '1';
 
@@ -293,11 +336,14 @@
         assert.equal(drafts[0].message, 'Ack');
         assert.equal(drafts[0].in_reply_to, 'baf0414d_60047215');
         assert.equal(drafts[0].unresolved, false);
+        assert.isTrue(reportStub.calledOnce);
         done();
       });
     });
 
     test('done', done => {
+      const reportStub = sandbox.stub(element.$.reporting,
+          'recordDraftInteraction');
       element.changeNum = '42';
       element.patchNum = '1';
       const commentEl = element.$$('gr-diff-comment');
@@ -313,6 +359,29 @@
         assert.equal(drafts[0].message, 'Done');
         assert.equal(drafts[0].in_reply_to, 'baf0414d_60047215');
         assert.isFalse(drafts[0].unresolved);
+        assert.isTrue(reportStub.calledOnce);
+        done();
+      });
+    });
+
+    test('save', done => {
+      element.changeNum = '42';
+      element.patchNum = '1';
+      element.path = '/path/to/file.txt';
+      const commentEl = element.$$('gr-diff-comment');
+      assert.ok(commentEl);
+
+      const saveOrDiscardStub = sandbox.stub();
+      element.addEventListener('thread-changed', saveOrDiscardStub);
+      element.$$('gr-diff-comment')._fireSave();
+
+      flush(() => {
+        assert.isTrue(saveOrDiscardStub.called);
+        assert.equal(saveOrDiscardStub.lastCall.args[0].detail.rootId,
+            'baf0414d_60047215');
+        assert.equal(element.rootId, 'baf0414d_60047215');
+        assert.equal(saveOrDiscardStub.lastCall.args[0].detail.path,
+            '/path/to/file.txt');
         done();
       });
     });
@@ -340,6 +409,7 @@
     test('discard', done => {
       element.changeNum = '42';
       element.patchNum = '1';
+      element.path = '/path/to/file.txt';
       element.push('comments', element._newReply(
           element.comments[0].id,
           element.comments[0].line,
@@ -347,6 +417,8 @@
           'it’s pronouced jiff, not giff'));
       flushAsynchronousOperations();
 
+      const saveOrDiscardStub = sandbox.stub();
+      element.addEventListener('thread-changed', saveOrDiscardStub);
       const draftEl =
           Polymer.dom(element.root).querySelectorAll('gr-diff-comment')[1];
       assert.ok(draftEl);
@@ -355,11 +427,46 @@
           return c.__draft == true;
         });
         assert.equal(drafts.length, 0);
+        assert.isTrue(saveOrDiscardStub.called);
+        assert.equal(saveOrDiscardStub.lastCall.args[0].detail.rootId,
+            element.rootId);
+        assert.equal(saveOrDiscardStub.lastCall.args[0].detail.path,
+            element.path);
         done();
       });
-      draftEl.fire('comment-discard', null, {bubbles: false});
+      draftEl.fire('comment-discard', {comment: draftEl.comment},
+          {bubbles: false});
     });
 
+    test('discard with a single comment still fires event with previous rootId',
+        done => {
+          element.changeNum = '42';
+          element.patchNum = '1';
+          element.path = '/path/to/file.txt';
+          element.comments = [];
+          element.addOrEditDraft('1');
+          flushAsynchronousOperations();
+          const rootId = element.rootId;
+          assert.isOk(rootId);
+
+          const saveOrDiscardStub = sandbox.stub();
+          element.addEventListener('thread-changed', saveOrDiscardStub);
+          const draftEl =
+          Polymer.dom(element.root).querySelectorAll('gr-diff-comment')[0];
+          assert.ok(draftEl);
+          draftEl.addEventListener('comment-discard', () => {
+            assert.equal(element.comments.length, 0);
+            assert.isTrue(saveOrDiscardStub.called);
+            assert.equal(saveOrDiscardStub.lastCall.args[0].detail.rootId,
+                rootId);
+            assert.equal(saveOrDiscardStub.lastCall.args[0].detail.path,
+                element.path);
+            done();
+          });
+          draftEl.fire('comment-discard', {comment: draftEl.comment},
+          {bubbles: false});
+        });
+
     test('first editing comment does not add __otherEditing attribute', () => {
       element.comments = [{
         author: {
@@ -434,7 +541,8 @@
         storageStub.restore();
         done();
       });
-      draftEl.fire('comment-discard', null, {bubbles: false});
+      draftEl.fire('comment-discard', {comment: draftEl.comment},
+          {bubbles: false});
     });
 
     test('comment-update', () => {
@@ -495,23 +603,30 @@
       });
 
       test('resolvable comments', () => {
-        assert.isFalse(element._unresolved);
+        assert.isFalse(element.unresolved);
         element._createReplyComment(element.comments[3], 'dummy', true, true);
         flushAsynchronousOperations();
-        assert.isTrue(element._unresolved);
+        assert.isTrue(element.unresolved);
       });
 
       test('_setInitialExpandedState', () => {
-        element._unresolved = true;
+        element.unresolved = true;
         element._setInitialExpandedState();
         for (let i = 0; i < element.comments.length; i++) {
           assert.isFalse(element.comments[i].collapsed);
         }
-        element._unresolved = false;
+        element.unresolved = false;
         element._setInitialExpandedState();
         for (let i = 0; i < element.comments.length; i++) {
           assert.isTrue(element.comments[i].collapsed);
         }
+        for (let i = 0; i < element.comments.length; i++) {
+          element.comments[i].robot_id = 123;
+        }
+        element._setInitialExpandedState();
+        for (let i = 0; i < element.comments.length; i++) {
+          assert.isFalse(element.comments[i].collapsed);
+        }
       });
     });
 
@@ -556,10 +671,48 @@
     });
 
     test('unresolved label', () => {
-      element._unresolved = false;
+      element.unresolved = false;
       assert.isTrue(element.$.unresolvedLabel.hasAttribute('hidden'));
-      element._unresolved = true;
+      element.unresolved = true;
       assert.isFalse(element.$.unresolvedLabel.hasAttribute('hidden'));
     });
+
+    test('draft comments are at the end of orderedComments', () => {
+      element.comments = [{
+        author: {
+          name: 'Mr. Peanutbutter',
+          email: 'tenn1sballchaser@aol.com',
+        },
+        id: 2,
+        line: 5,
+        message: 'Earlier draft',
+        updated: '2015-12-08 19:48:33.843000000',
+        __draft: true,
+      },
+      {
+        author: {
+          name: 'Mr. Peanutbutter2',
+          email: 'tenn1sballchaser@aol.com',
+        },
+        id: 1,
+        line: 5,
+        message: 'This comment was left last but is not a draft',
+        updated: '2015-12-10 19:48:33.843000000',
+      },
+      {
+        author: {
+          name: 'Mr. Peanutbutter2',
+          email: 'tenn1sballchaser@aol.com',
+        },
+        id: 3,
+        line: 5,
+        message: 'Later draft',
+        updated: '2015-12-09 19:48:33.843000000',
+        __draft: true,
+      }];
+      assert.equal(element._orderedComments[0].id, '1');
+      assert.equal(element._orderedComments[1].id, '2');
+      assert.equal(element._orderedComments[2].id, '3');
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-comment/gr-diff-comment.html b/polygerrit-ui/app/elements/diff/gr-diff-comment/gr-diff-comment.html
index d58b6be..6ea0330 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-comment/gr-diff-comment.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-comment/gr-diff-comment.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,18 +18,21 @@
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
 <link rel="import" href="../../../behaviors/keyboard-shortcut-behavior/keyboard-shortcut-behavior.html">
 <link rel="import" href="../../../bower_components/iron-autogrow-textarea/iron-autogrow-textarea.html">
-<link rel="import" href="../../shared/gr-textarea/gr-textarea.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../../core/gr-reporting/gr-reporting.html">
+<link rel="import" href="../../plugins/gr-endpoint-decorator/gr-endpoint-decorator.html">
+<link rel="import" href="../../plugins/gr-endpoint-param/gr-endpoint-param.html">
 <link rel="import" href="../../shared/gr-button/gr-button.html">
-<link rel="import" href="../../shared/gr-confirm-dialog/gr-confirm-dialog.html">
+<link rel="import" href="../../shared/gr-dialog/gr-dialog.html">
 <link rel="import" href="../../shared/gr-date-formatter/gr-date-formatter.html">
 <link rel="import" href="../../shared/gr-formatted-text/gr-formatted-text.html">
+<link rel="import" href="../../shared/gr-icons/gr-icons.html">
 <link rel="import" href="../../shared/gr-overlay/gr-overlay.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
 <link rel="import" href="../../shared/gr-storage/gr-storage.html">
+<link rel="import" href="../../shared/gr-textarea/gr-textarea.html">
 <link rel="import" href="../../shared/gr-tooltip-content/gr-tooltip-content.html">
 <link rel="import" href="../gr-confirm-delete-comment-dialog/gr-confirm-delete-comment-dialog.html">
-<link rel="import" href="../../../styles/shared-styles.html">
-
 <script src="../../../scripts/rootElement.js"></script>
 
 <dom-module id="gr-diff-comment">
@@ -46,35 +50,38 @@
       :host([disabled]) {
         pointer-events: none;
       }
-      :host([disabled]) .container {
+      :host([disabled]) .actions,
+      :host([disabled]) .robotActions,
+      :host([disabled]) .date {
         opacity: .5;
       }
-      :host([is-robot-comment]) {
-        background-color: #cfe8fc;
+      :host([discarding]) {
+        display: none;
       }
       .header {
+        align-items: baseline;
         cursor: pointer;
         display: flex;
         font-family: 'Open Sans', sans-serif;
-        margin-bottom: 0.7em;
-        padding-bottom: 0;
+        margin: -.7em -.7em 0 -.7em;
+        padding: .7em;
       }
       .container.collapsed .header {
-        margin: 0;
+        margin-bottom: -.7em;
       }
       .headerMiddle {
-        color: #666;
+        color: var(--deemphasized-text-color);
         flex: 1;
         overflow: hidden;
       }
       .authorName,
       .draftLabel,
       .draftTooltip {
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
       }
       .draftLabel,
       .draftTooltip {
-        color: #999;
+        color: var(--deemphasized-text-color);
         display: none;
       }
       .date {
@@ -86,7 +93,7 @@
       }
       a.date:link,
       a.date:visited {
-        color: #666;
+        color: var(--deemphasized-text-color);
       }
       .actions {
         display: flex;
@@ -95,10 +102,16 @@
       }
       .action {
         margin-left: 1em;
-        --gr-button: {
-          color: #212121;
-        }
-        --gr-button-hover-color: rgba(33, 33, 33, .75);
+      }
+      .robotActions {
+        display: flex;
+        justify-content: flex-start;
+        padding-top: 0;
+      }
+      .robotActions .action {
+        /* Keep button text lined up with output text */
+        margin-left: -.3rem;
+        margin-right: 1em;
       }
       .rightActions {
         display: flex;
@@ -123,8 +136,7 @@
         display: inline;
       }
       .draft:not(.editing) .save,
-      .draft:not(.editing) .cancel,
-      .draft:not(.editing) .resolve {
+      .draft:not(.editing) .cancel {
         display: none;
       }
       .editing .message,
@@ -133,6 +145,7 @@
       .editing .ack,
       .editing .done,
       .editing .edit,
+      .editing .discard,
       .editing .unresolved {
         display: none;
       }
@@ -143,12 +156,18 @@
         margin-left: .4em;
       }
       .robotId {
-        color: #808080;
+        color: var(--deemphasized-text-color);
         margin-bottom: .8em;
         margin-top: -.4em;
       }
+      .robotIcon {
+        margin-right: .2em;
+        /* because of the antenna of the robot, it looks off center even when it
+         is centered. artificially adjust margin to account for this. */
+        margin-top: -.3em;
+      }
       .runIdInformation {
-        margin: 1em 0;
+        margin: .7em 0;
       }
       .robotRun {
         margin-left: .5em;
@@ -160,10 +179,10 @@
         display: none;
       }
       label.show-hide {
-        color: #000;
+        color: var(--comment-text-color);
         cursor: pointer;
         display: block;
-        font-size: .8em;
+        font-size: .8rem;
         height: 1.1em;
         margin-top: .1em;
       }
@@ -193,18 +212,19 @@
         margin: 0;
       }
       .resolve label {
-        color: #333;
-        font-size: 12px;
+        color: var(--comment-text-color);
       }
-      gr-confirm-dialog .main {
-        background-color: #fef;
+      gr-dialog .main {
         display: flex;
         flex-direction: column;
         width: 100%;
       }
       #deleteBtn {
-        color: #666;
         display: none;
+        --gr-button: {
+          color: var(--deemphasized-text-color);
+          padding: 0;
+        }
       }
       #deleteBtn.showDeleteButtons {
         display: block;
@@ -214,13 +234,13 @@
         class="container"
         on-mouseenter="_handleMouseEnter"
         on-mouseleave="_handleMouseLeave">
-      <div class="header" id="header" on-click="_handleToggleCollapsed">
+      <div class="header" id="header" on-tap="_handleToggleCollapsed">
         <div class="headerLeft">
           <span class="authorName">[[comment.author.name]]</span>
           <span class="draftLabel">DRAFT</span>
           <gr-tooltip-content class="draftTooltip"
               has-tooltip
-              title="This draft is only visible to you. To publish drafts, click the red 'Reply' button at the top of the change or press the 'A' key."
+              title="This draft is only visible to you. To publish drafts, click the 'Reply' or 'Start review' button at the top of the change or press the 'A' key."
               max-width="20em"
               show-icon></gr-tooltip-content>
         </div>
@@ -230,6 +250,7 @@
         <gr-button
             id="deleteBtn"
             link
+            secondary
             class$="action delete [[_computeDeleteButtonClass(_isAdmin, draft)]]"
             on-tap="_handleCommentDelete">
           (Delete)
@@ -248,87 +269,121 @@
           </label>
         </div>
       </div>
-      <template is="dom-if" if="[[comment.robot_id]]">
-        <div class="robotId" hidden$="[[collapsed]]">
-          [[comment.robot_id]]
+      <div class="body">
+        <template is="dom-if" if="[[comment.robot_id]]">
+          <div class="robotId" hidden$="[[collapsed]]">
+            <iron-icon class="robotIcon" icon="gr-icons:robot"></iron-icon>
+            [[comment.robot_id]]
+          </div>
+        </template>
+        <template is="dom-if" if="[[editing]]">
+          <gr-textarea
+              id="editTextarea"
+              class="editMessage"
+              autocomplete="on"
+              monospace
+              disabled="{{disabled}}"
+              rows="4"
+              text="{{_messageText}}"></gr-textarea>
+        </template>
+        <!--The message class is needed to ensure selectability from
+        gr-diff-selection.-->
+        <gr-formatted-text class="message"
+            content="[[comment.message]]"
+            no-trailing-margin="[[!comment.__draft]]"
+            collapsed="[[collapsed]]"
+            config="[[projectConfig.commentlinks]]"></gr-formatted-text>
+        <div hidden$="[[!comment.robot_run_id]]" class="message">
+          <div class="runIdInformation" hidden$="[[collapsed]]">
+            Run ID:
+            <template is="dom-if" if="[[comment.url]]">
+              <a class="robotRunLink" href$="[[comment.url]]">
+                <span class="robotRun link">[[comment.robot_run_id]]</span>
+              </a>
+            </template>
+            <template is="dom-if" if="[[!comment.url]]">
+              <span class="robotRun text">[[comment.robot_run_id]]</span>
+            </template>
+          </div>
         </div>
-      </template>
-      <gr-textarea
-          id="editTextarea"
-          class="editMessage"
-          autocomplete="on"
-          monospace
-          disabled="{{disabled}}"
-          rows="4"
-          text="{{_messageText}}"></gr-textarea>
-      <gr-formatted-text class="message"
-          content="[[comment.message]]"
-          no-trailing-margin="[[!comment.__draft]]"
-          collapsed="[[collapsed]]"
-          config="[[projectConfig.commentlinks]]"></gr-formatted-text>
-      <div hidden$="[[!comment.robot_run_id]]">
-        <div class="runIdInformation" hidden$="[[collapsed]]">
-          Run ID:
-          <a class="robotRunLink" href$="[[comment.url]]">
-            <span class="robotRun">[[comment.robot_run_id]]</span>
-          </a>
+        <div class="actions humanActions" hidden$="[[!_showHumanActions]]">
+          <div class="action resolve hideOnPublished">
+            <label>
+              <input type="checkbox"
+                  id="resolvedCheckbox"
+                  checked="[[resolved]]"
+                  on-change="_handleToggleResolved">
+              Resolved
+            </label>
+          </div>
+          <div class="rightActions">
+            <gr-button
+                link
+                secondary
+                class="action cancel hideOnPublished"
+                on-tap="_handleCancel">Cancel</gr-button>
+            <gr-button
+                link
+                secondary
+                class="action discard hideOnPublished"
+                on-tap="_handleDiscard">Discard</gr-button>
+            <gr-button
+                link
+                secondary
+                class="action edit hideOnPublished"
+                on-tap="_handleEdit">Edit</gr-button>
+            <gr-button
+                link
+                secondary
+                disabled$="[[_computeSaveDisabled(_messageText, comment, resolved)]]"
+                class="action save hideOnPublished"
+                on-tap="_handleSave">Save</gr-button>
+          </div>
         </div>
-      </div>
-      <div class="actions humanActions" hidden$="[[!_showHumanActions]]">
-        <div class="action resolve hideOnPublished">
-          <label>
-            <input type="checkbox"
-                checked$="[[resolved]]"
-                on-change="_handleToggleResolved">
-            Resolved
-          </label>
+        <div class="robotActions" hidden$="[[!_showRobotActions]]">
+          <template is="dom-if" if="[[isRobotComment]]">
+            <gr-button
+                link
+                secondary
+                class="action fix"
+                on-tap="_handleFix"
+                disabled="[[robotButtonDisabled]]">
+              Please Fix
+            </gr-button>
+            <gr-endpoint-decorator name="robot-comment-controls">
+              <gr-endpoint-param name="comment" value="[[comment]]">
+              </gr-endpoint-param>
+            </gr-endpoint-decorator>
+          </template>
         </div>
-        <div class="action unresolved hideOnPublished" hidden$="[[resolved]]">
-          Unresolved
-        </div>
-        <div class="rightActions">
-          <gr-button link class="action cancel hideOnPublished"
-              on-tap="_handleCancel" hidden>Cancel</gr-button>
-          <gr-button link class="action discard hideOnPublished"
-              on-tap="_handleDiscard">Discard</gr-button>
-          <gr-button link class="action edit hideOnPublished"
-              on-tap="_handleEdit">Edit</gr-button>
-          <gr-button link class="action save hideOnPublished"
-              on-tap="_handleSave"
-              disabled$="[[_computeSaveDisabled(_messageText)]]">Save
-          </gr-button>
-        </div>
-      </div>
-      <div class="actions robotActions" hidden$="[[!_showRobotActions]]">
-        <gr-button link class="action fix"
-            on-tap="_handleFix"
-            disabled="[[robotButtonDisabled]]">
-          Please Fix
-        </gr-button>
       </div>
     </div>
-    <gr-overlay id="confirmDeleteOverlay" with-backdrop>
-      <gr-confirm-delete-comment-dialog id="confirmDeleteComment"
-          on-confirm="_handleConfirmDeleteComment"
-          on-cancel="_handleCancelDeleteComment">
-      </gr-confirm-delete-comment-dialog>
-    </gr-overlay>
-    <gr-overlay id="confirmDiscardOverlay" with-backdrop>
-      <gr-confirm-dialog
-          id="confirmDiscaDialog"
-          confirm-label="Discard"
-          on-confirm="_handleConfirmDiscard"
-          on-cancel="_closeConfirmDiscardOverlay">
-        <div class="header">
-          Discard comment
-        </div>
-        <div class="main">
-          Are you sure you want to discard this draft comment?
-        </div>
-      </gr-confirm-dialog>
-    </gr-overlay>
+    <template is="dom-if" if="[[_enableOverlay]]">
+      <gr-overlay id="confirmDeleteOverlay" with-backdrop>
+        <gr-confirm-delete-comment-dialog id="confirmDeleteComment"
+            on-confirm="_handleConfirmDeleteComment"
+            on-cancel="_handleCancelDeleteComment">
+        </gr-confirm-delete-comment-dialog>
+      </gr-overlay>
+      <gr-overlay id="confirmDiscardOverlay" with-backdrop>
+        <gr-dialog
+            id="confirmDiscardDialog"
+            confirm-label="Discard"
+            confirm-on-enter
+            on-confirm="_handleConfirmDiscard"
+            on-cancel="_closeConfirmDiscardOverlay">
+          <div class="header" slot="header">
+            Discard comment
+          </div>
+          <div class="main" slot="main">
+            Are you sure you want to discard this draft comment?
+          </div>
+        </gr-dialog>
+      </gr-overlay>
+    </template>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
     <gr-storage id="storage"></gr-storage>
+    <gr-reporting id="reporting"></gr-reporting>
   </template>
   <script src="gr-diff-comment.js"></script>
 </dom-module>
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-comment/gr-diff-comment.js b/polygerrit-ui/app/elements/diff/gr-diff-comment/gr-diff-comment.js
index c02aec5..90d465f 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-comment/gr-diff-comment.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff-comment/gr-diff-comment.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -22,6 +25,10 @@
   const DRAFT_PLURAL = 'drafts...';
   const SAVED_MESSAGE = 'All changes saved';
 
+  const REPORT_CREATE_DRAFT = 'CreateDraftComment';
+  const REPORT_UPDATE_DRAFT = 'UpdateDraftComment';
+  const REPORT_DISCARD_DRAFT = 'DiscardDraftComment';
+
   Polymer({
     is: 'gr-diff-comment',
 
@@ -85,6 +92,11 @@
         value: false,
         observer: '_editingChanged',
       },
+      discarding: {
+        type: Boolean,
+        value: false,
+        reflectToAttribute: true,
+      },
       hasChildren: Boolean,
       patchNum: String,
       showActions: Boolean,
@@ -111,15 +123,28 @@
       },
       commentSide: String,
 
-      resolved: {
-        type: Boolean,
-        observer: '_toggleResolved',
-      },
+      resolved: Boolean,
 
-      _numPendingDiffRequests: {
+      _numPendingDraftRequests: {
         type: Object,
         value: {number: 0}, // Intentional to share the object across instances.
       },
+
+      _enableOverlay: {
+        type: Boolean,
+        value: false,
+      },
+
+      /**
+       * Property for storing references to overlay elements. When the overlays
+       * are moved to Gerrit.getRootElement() to be shown they are no-longer
+       * children, so they can't be queried along the tree, so they are stored
+       * here.
+       */
+      _overlays: {
+        type: Object,
+        value: () => ({}),
+      },
     },
 
     observers: [
@@ -151,7 +176,31 @@
 
     detached() {
       this.cancelDebouncer('fire-update');
-      this.$.editTextarea.closeDropdown();
+      if (this.textarea) {
+        this.textarea.closeDropdown();
+      }
+    },
+
+    get textarea() {
+      return this.$$('#editTextarea');
+    },
+
+    get confirmDeleteOverlay() {
+      if (!this._overlays.confirmDelete) {
+        this._enableOverlay = true;
+        Polymer.dom.flush();
+        this._overlays.confirmDelete = this.$$('#confirmDeleteOverlay');
+      }
+      return this._overlays.confirmDelete;
+    },
+
+    get confirmDiscardOverlay() {
+      if (!this._overlays.confirmDiscard) {
+        this._enableOverlay = true;
+        Polymer.dom.flush();
+        this._overlays.confirmDiscard = this.$$('#confirmDiscardOverlay');
+      }
+      return this._overlays.confirmDiscard;
     },
 
     _computeShowHideText(collapsed) {
@@ -175,28 +224,36 @@
       return this.$.restAPI.getIsAdmin();
     },
 
-    save() {
-      this.comment.message = this._messageText;
+    /**
+     * @param {*=} opt_comment
+     */
+    save(opt_comment) {
+      let comment = opt_comment;
+      if (!comment) { comment = this.comment; }
 
+      this.set('comment.message', this._messageText);
+      this.editing = false;
       this.disabled = true;
 
-      this._eraseDraftComment();
+      if (!this._messageText) {
+        return this._discardDraft();
+      }
 
-      this._xhrPromise = this._saveDraft(this.comment).then(response => {
+      this._xhrPromise = this._saveDraft(comment).then(response => {
         this.disabled = false;
         if (!response.ok) { return response; }
 
+        this._eraseDraftComment();
         return this.$.restAPI.getResponseObject(response).then(obj => {
-          const comment = obj;
-          comment.__draft = true;
+          const resComment = obj;
+          resComment.__draft = true;
           // Maintain the ephemeral draft ID for identification by other
           // elements.
           if (this.comment.__draftID) {
-            comment.__draftID = this.comment.__draftID;
+            resComment.__draftID = this.comment.__draftID;
           }
-          comment.__commentSide = this.commentSide;
-          this.comment = comment;
-          this.editing = false;
+          resComment.__commentSide = this.commentSide;
+          this.comment = resComment;
           this._fireSave();
           return obj;
         });
@@ -204,6 +261,8 @@
         this.disabled = false;
         throw err;
       });
+
+      return this._xhrPromise;
     },
 
     _eraseDraftComment() {
@@ -256,9 +315,6 @@
 
     _editingChanged(editing, previousValue) {
       this.$.container.classList.toggle('editing', editing);
-      if (editing) {
-        this.$.editTextarea.putCursorAtEnd();
-      }
       if (this.comment && this.comment.id) {
         this.$$('.cancel').hidden = !editing;
       }
@@ -269,6 +325,12 @@
         // To prevent event firing on comment creation.
         this._fireUpdate();
       }
+      if (editing) {
+        this.async(() => {
+          Polymer.dom.flush();
+          this.textarea.putCursorAtEnd();
+        }, 1);
+      }
     },
 
     _computeLinkToComment(comment) {
@@ -279,12 +341,15 @@
       return isAdmin && !draft ? 'showDeleteButtons' : '';
     },
 
-    _computeSaveDisabled(draft) {
-      return draft == null || draft.trim() == '';
+    _computeSaveDisabled(draft, comment, resolved) {
+      // If resolved state has changed and a msg exists, save should be enabled.
+      if (comment.unresolved === resolved && draft) { return false; }
+      return !draft || draft.trim() === '';
     },
 
     _handleSaveKey(e) {
-      if (this._messageText.length) {
+      if (!this._computeSaveDisabled(this._messageText, this.comment,
+          this.resolved)) {
         e.preventDefault();
         this._handleSave(e);
       }
@@ -316,12 +381,8 @@
     _messageTextChanged(newValue, oldValue) {
       if (!this.comment || (this.comment && this.comment.id)) { return; }
 
-      // Keep comment.message in sync so that gr-diff-comment-thread is aware
-      // of the current message in the case that another comment is deleted.
-      this.comment.message = this._messageText || '';
       this.debounce('store', () => {
         const message = this._messageText;
-
         const commentLocation = {
           changeNum: this.changeNum,
           patchNum: this._getPatchNum(),
@@ -337,7 +398,6 @@
         } else {
           this.$.storage.setDraftComment(commentLocation, message);
         }
-        this._fireUpdate();
       }, STORAGE_DEBOUNCE_INTERVAL);
     },
 
@@ -352,51 +412,31 @@
       page.show(window.location.pathname + hash, null, false);
     },
 
-    _handleReply(e) {
-      e.preventDefault();
-      this.fire('create-reply-comment', this._getEventPayload(),
-          {bubbles: false});
-    },
-
-    _handleQuote(e) {
-      e.preventDefault();
-      this.fire('create-reply-comment', this._getEventPayload({quote: true}),
-          {bubbles: false});
-    },
-
-    _handleFix(e) {
-      e.preventDefault();
-      this.fire('create-fix-comment', this._getEventPayload({quote: true}),
-          {bubbles: false});
-    },
-
-    _handleAck(e) {
-      e.preventDefault();
-      this.fire('create-ack-comment', this._getEventPayload(),
-          {bubbles: false});
-    },
-
-    _handleDone(e) {
-      e.preventDefault();
-      this.fire('create-done-comment', this._getEventPayload(),
-          {bubbles: false});
-    },
-
     _handleEdit(e) {
       e.preventDefault();
       this._messageText = this.comment.message;
       this.editing = true;
+      this.$.reporting.recordDraftInteraction();
     },
 
     _handleSave(e) {
       e.preventDefault();
+
+      // Ignore saves started while already saving.
+      if (this.disabled) { return; }
+      const timingLabel = this.comment.id ?
+          REPORT_UPDATE_DRAFT : REPORT_CREATE_DRAFT;
+      const timer = this.$.reporting.getTimer(timingLabel);
       this.set('comment.__editing', false);
-      this.save();
+      return this.save().then(() => { timer.end(); });
     },
 
     _handleCancel(e) {
       e.preventDefault();
-      if (!this.comment.message || this.comment.message.trim().length === 0) {
+
+      if (!this.comment.message ||
+          this.comment.message.trim().length === 0 ||
+          !this.comment.id) {
         this._fireDiscard();
         return;
       }
@@ -409,25 +449,40 @@
       this.fire('comment-discard', this._getEventPayload());
     },
 
+    _handleFix() {
+      this.dispatchEvent(new CustomEvent('create-fix-comment', {
+        bubbles: true,
+        detail: this._getEventPayload(),
+      }));
+    },
+
     _handleDiscard(e) {
       e.preventDefault();
-      if (this._computeSaveDisabled(this._messageText)) {
+      this.$.reporting.recordDraftInteraction();
+
+      if (!this._messageText) {
         this._discardDraft();
         return;
       }
-      this._openOverlay(this.$.confirmDiscardOverlay);
+
+      this._openOverlay(this.confirmDiscardOverlay).then(() => {
+        this.confirmDiscardOverlay.querySelector('#confirmDiscardDialog')
+            .resetFocus();
+      });
     },
 
     _handleConfirmDiscard(e) {
       e.preventDefault();
+      const timer = this.$.reporting.getTimer(REPORT_DISCARD_DRAFT);
       this._closeConfirmDiscardOverlay();
-      this._discardDraft();
+      return this._discardDraft().then(() => { timer.end(); });
     },
 
     _discardDraft() {
       if (!this.comment.__draft) {
         throw Error('Cannot discard a non-draft comment.');
       }
+      this.discarding = true;
       this.editing = false;
       this.disabled = true;
       this._eraseDraftComment();
@@ -440,17 +495,22 @@
 
       this._xhrPromise = this._deleteDraft(this.comment).then(response => {
         this.disabled = false;
-        if (!response.ok) { return response; }
+        if (!response.ok) {
+          this.discarding = false;
+          return response;
+        }
 
         this._fireDiscard();
       }).catch(err => {
         this.disabled = false;
         throw err;
       });
+
+      return this._xhrPromise;
     },
 
     _closeConfirmDiscardOverlay() {
-      this._closeOverlay(this.$.confirmDiscardOverlay);
+      this._closeOverlay(this.confirmDiscardOverlay);
     },
 
     _getSavingMessage(numPending) {
@@ -463,15 +523,23 @@
     },
 
     _showStartRequest() {
-      const numPending = ++this._numPendingDiffRequests.number;
+      const numPending = ++this._numPendingDraftRequests.number;
       this._updateRequestToast(numPending);
     },
 
     _showEndRequest() {
-      const numPending = --this._numPendingDiffRequests.number;
+      const numPending = --this._numPendingDraftRequests.number;
       this._updateRequestToast(numPending);
     },
 
+    _handleFailedDraftRequest() {
+      this._numPendingDraftRequests.number--;
+
+      // Cancel the debouncer so that error toasts from the error-manager will
+      // not be overridden.
+      this.cancelDebouncer('draft-toast');
+    },
+
     _updateRequestToast(numPending) {
       const message = this._getSavingMessage(numPending);
       this.debounce('draft-toast', () => {
@@ -487,7 +555,11 @@
       this._showStartRequest();
       return this.$.restAPI.saveDiffDraft(this.changeNum, this.patchNum, draft)
           .then(result => {
-            this._showEndRequest();
+            if (result.ok) {
+              this._showEndRequest();
+            } else {
+              this._handleFailedDraftRequest();
+            }
             return result;
           });
     },
@@ -496,7 +568,11 @@
       this._showStartRequest();
       return this.$.restAPI.deleteDiffDraft(this.changeNum, this.patchNum,
           draft).then(result => {
-            this._showEndRequest();
+            if (result.ok) {
+              this._showEndRequest();
+            } else {
+              this._handleFailedDraftRequest();
+            }
             return result;
           });
     },
@@ -538,27 +614,30 @@
     },
 
     _handleToggleResolved() {
+      this.$.reporting.recordDraftInteraction();
       this.resolved = !this.resolved;
-    },
-
-    _toggleResolved(resolved) {
-      this.comment.unresolved = !resolved;
-      this.fire('comment-update', this._getEventPayload());
+      // Modify payload instead of this.comment, as this.comment is passed from
+      // the parent by ref.
+      const payload = this._getEventPayload();
+      payload.comment.unresolved = !this.$.resolvedCheckbox.checked;
+      this.fire('comment-update', payload);
+      if (!this.editing) {
+        // Save the resolved state immediately.
+        this.save(payload.comment);
+      }
     },
 
     _handleCommentDelete() {
-      this._openOverlay(this.$.confirmDeleteOverlay);
+      this._openOverlay(this.confirmDeleteOverlay);
     },
 
     _handleCancelDeleteComment() {
-      this._closeOverlay(this.$.confirmDeleteOverlay);
+      this._closeOverlay(this.confirmDeleteOverlay);
     },
 
     _openOverlay(overlay) {
       Polymer.dom(Gerrit.getRootElement()).appendChild(overlay);
-      this.async(() => {
-        overlay.open();
-      }, 1);
+      return overlay.open();
     },
 
     _closeOverlay(overlay) {
@@ -567,9 +646,11 @@
     },
 
     _handleConfirmDeleteComment() {
+      const dialog =
+          this.confirmDeleteOverlay.querySelector('#confirmDeleteComment');
       this.$.restAPI.deleteComment(
-          this.changeNum, this.patchNum, this.comment.id,
-          this.$.confirmDeleteComment.message).then(newComment => {
+          this.changeNum, this.patchNum, this.comment.id, dialog.message)
+          .then(newComment => {
             this._handleCancelDeleteComment();
             this.comment = newComment;
           });
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-comment/gr-diff-comment_test.html b/polygerrit-ui/app/elements/diff/gr-diff-comment/gr-diff-comment_test.html
index 5793b05..ca85892 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-comment/gr-diff-comment_test.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-comment/gr-diff-comment_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -79,8 +80,7 @@
           'gr-formatted-text is not visible');
       assert.isFalse(isVisible(element.$$('.actions')),
           'actions are not visible');
-      assert.isFalse(isVisible(element.$$('gr-textarea')),
-          'textarea is not visible');
+      assert.isNotOk(element.textarea, 'textarea is not visible');
 
       // The header middle content is only visible when comments are collapsed.
       // It shows the message in a condensed way, and limits to a single line.
@@ -94,8 +94,7 @@
           'gr-formatted-text is visible');
       assert.isTrue(isVisible(element.$$('.actions')),
           'actions are visible');
-      assert.isFalse(isVisible(element.$$('gr-textarea')),
-          'textarea is not visible');
+      assert.isNotOk(element.textarea, 'textarea is not visible');
       assert.isFalse(isVisible(element.$$('.collapsedContent')),
           'header middle content is not visible');
     });
@@ -166,8 +165,7 @@
           'gr-formatted-text is not visible');
       assert.isFalse(isVisible(element.$$('.actions')),
           'actions are not visible');
-      assert.isFalse(isVisible(element.$$('gr-textarea')),
-          'textarea is not visible');
+      assert.isNotOk(element.textarea, 'textarea is not visible');
       assert.isTrue(isVisible(element.$$('.collapsedContent')),
           'header middle content is visible');
 
@@ -177,8 +175,7 @@
           'gr-formatted-text is visible');
       assert.isTrue(isVisible(element.$$('.actions')),
           'actions are visible');
-      assert.isFalse(isVisible(element.$$('gr-textarea')),
-          'textarea is not visible');
+      assert.isNotOk(element.textarea, 'textarea is not visible');
       assert.isFalse(isVisible(element.$$('.collapsedContent')),
           'header middle content is is not visible');
     });
@@ -195,54 +192,55 @@
       suite('when text is empty', () => {
         setup(() => {
           element._messageText = '';
+          element.comment = {};
         });
 
         test('esc closes comment when text is empty', () => {
           MockInteractions.pressAndReleaseKeyOn(
-              element.$.editTextarea, 27); // esc
+              element.textarea, 27); // esc
           assert.isTrue(element._handleCancel.called);
         });
 
         test('ctrl+enter does not save', () => {
           MockInteractions.pressAndReleaseKeyOn(
-              element.$.editTextarea, 13, 'ctrl'); // ctrl + enter
+              element.textarea, 13, 'ctrl'); // ctrl + enter
           assert.isFalse(element._handleSave.called);
         });
 
         test('meta+enter does not save', () => {
           MockInteractions.pressAndReleaseKeyOn(
-              element.$.editTextarea, 13, 'meta'); // meta + enter
+              element.textarea, 13, 'meta'); // meta + enter
           assert.isFalse(element._handleSave.called);
         });
 
         test('ctrl+s does not save', () => {
           MockInteractions.pressAndReleaseKeyOn(
-              element.$.editTextarea, 83, 'ctrl'); // ctrl + s
+              element.textarea, 83, 'ctrl'); // ctrl + s
           assert.isFalse(element._handleSave.called);
         });
       });
 
       test('esc does not close comment that has content', () => {
         MockInteractions.pressAndReleaseKeyOn(
-            element.$.editTextarea, 27); // esc
+            element.textarea, 27); // esc
         assert.isFalse(element._handleCancel.called);
       });
 
       test('ctrl+enter saves', () => {
         MockInteractions.pressAndReleaseKeyOn(
-            element.$.editTextarea, 13, 'ctrl'); // ctrl + enter
+            element.textarea, 13, 'ctrl'); // ctrl + enter
         assert.isTrue(element._handleSave.called);
       });
 
       test('meta+enter saves', () => {
         MockInteractions.pressAndReleaseKeyOn(
-            element.$.editTextarea, 13, 'meta'); // meta + enter
+            element.textarea, 13, 'meta'); // meta + enter
         assert.isTrue(element._handleSave.called);
       });
 
       test('ctrl+s saves', () => {
         MockInteractions.pressAndReleaseKeyOn(
-            element.$.editTextarea, 83, 'ctrl'); // ctrl + s
+            element.textarea, 83, 'ctrl'); // ctrl + s
         assert.isTrue(element._handleSave.called);
       });
     });
@@ -262,7 +260,7 @@
     test('delete comment', done => {
       sandbox.stub(
           element.$.restAPI, 'deleteComment').returns(Promise.resolve({}));
-      sandbox.spy(element.$.confirmDeleteOverlay, 'open');
+      sandbox.spy(element.confirmDeleteOverlay, 'open');
       element.changeNum = 42;
       element.patchNum = 0xDEADBEEF;
       element._isAdmin = true;
@@ -270,8 +268,10 @@
           .classList.contains('showDeleteButtons'));
       MockInteractions.tap(element.$$('.action.delete'));
       flush(() => {
-        element.$.confirmDeleteOverlay.open.lastCall.returnValue.then(() => {
-          element.$.confirmDeleteComment.message = 'removal reason';
+        element.confirmDeleteOverlay.open.lastCall.returnValue.then(() => {
+          const dialog =
+              this.confirmDeleteOverlay.querySelector('#confirmDeleteComment');
+          dialog.message = 'removal reason';
           element._handleConfirmDeleteComment();
           assert.isTrue(element.$.restAPI.deleteComment.calledWith(
               42, 0xDEADBEEF, 'baf0414d_60047215', 'removal reason'));
@@ -279,6 +279,66 @@
         });
       });
     });
+
+    suite('draft update reporting', () => {
+      let endStub;
+      let getTimerStub;
+      let mockEvent;
+
+      setup(() => {
+        mockEvent = {preventDefault() {}};
+        sandbox.stub(element, 'save')
+            .returns(Promise.resolve({}));
+        sandbox.stub(element, '_discardDraft')
+            .returns(Promise.resolve({}));
+        endStub = sinon.stub();
+        getTimerStub = sandbox.stub(element.$.reporting, 'getTimer')
+            .returns({end: endStub});
+      });
+
+      test('create', () => {
+        element.comment = {};
+        return element._handleSave(mockEvent).then(() => {
+          assert.isTrue(endStub.calledOnce);
+          assert.isTrue(getTimerStub.calledOnce);
+          assert.equal(getTimerStub.lastCall.args[0], 'CreateDraftComment');
+        });
+      });
+
+      test('update', () => {
+        element.comment = {id: 'abc_123'};
+        return element._handleSave(mockEvent).then(() => {
+          assert.isTrue(endStub.calledOnce);
+          assert.isTrue(getTimerStub.calledOnce);
+          assert.equal(getTimerStub.lastCall.args[0], 'UpdateDraftComment');
+        });
+      });
+
+      test('discard', () => {
+        element.comment = {id: 'abc_123'};
+        sandbox.stub(element, '_closeConfirmDiscardOverlay');
+        return element._handleConfirmDiscard(mockEvent).then(() => {
+          assert.isTrue(endStub.calledOnce);
+          assert.isTrue(getTimerStub.calledOnce);
+          assert.equal(getTimerStub.lastCall.args[0], 'DiscardDraftComment');
+        });
+      });
+    });
+
+    test('edit reports interaction', () => {
+      const reportStub = sandbox.stub(element.$.reporting,
+          'recordDraftInteraction');
+      MockInteractions.tap(element.$$('.edit'));
+      assert.isTrue(reportStub.calledOnce);
+    });
+
+    test('discard reports interaction', () => {
+      const reportStub = sandbox.stub(element.$.reporting,
+          'recordDraftInteraction');
+      element.draft = true;
+      MockInteractions.tap(element.$$('.discard'));
+      assert.isTrue(reportStub.calledOnce);
+    });
   });
 
   suite('gr-diff-comment draft tests', () => {
@@ -344,22 +404,23 @@
       assert.isTrue(isVisible(element.$$('.discard')), 'discard is visible');
       assert.isFalse(isVisible(element.$$('.save')), 'save is not visible');
       assert.isFalse(isVisible(element.$$('.cancel')), 'cancel is not visible');
-      assert.isFalse(isVisible(element.$$('.resolve')),
-          'resolve is not visible');
+      assert.isTrue(isVisible(element.$$('.resolve')), 'resolve is visible');
       assert.isFalse(element.$$('.humanActions').hasAttribute('hidden'));
       assert.isTrue(element.$$('.robotActions').hasAttribute('hidden'));
 
       element.editing = true;
+      flushAsynchronousOperations();
       assert.isFalse(isVisible(element.$$('.edit')), 'edit is not visible');
-      assert.isTrue(isVisible(element.$$('.discard')), 'discard is visible');
+      assert.isFalse(isVisible(element.$$('.discard')), 'discard not visible');
       assert.isTrue(isVisible(element.$$('.save')), 'save is visible');
-      assert.isFalse(isVisible(element.$$('.cancel')), 'cancel is visible');
+      assert.isTrue(isVisible(element.$$('.cancel')), 'cancel is visible');
       assert.isTrue(isVisible(element.$$('.resolve')), 'resolve is visible');
       assert.isFalse(element.$$('.humanActions').hasAttribute('hidden'));
       assert.isTrue(element.$$('.robotActions').hasAttribute('hidden'));
 
       element.draft = false;
       element.editing = false;
+      flushAsynchronousOperations();
       assert.isFalse(isVisible(element.$$('.edit')), 'edit is not visible');
       assert.isFalse(isVisible(element.$$('.discard')),
           'discard is not visible');
@@ -371,6 +432,7 @@
       element.comment.id = 'foo';
       element.draft = true;
       element.editing = true;
+      flushAsynchronousOperations();
       assert.isTrue(isVisible(element.$$('.cancel')), 'cancel is visible');
       assert.isFalse(element.$$('.humanActions').hasAttribute('hidden'));
       assert.isTrue(element.$$('.robotActions').hasAttribute('hidden'));
@@ -385,6 +447,23 @@
       element.draft = false;
       assert.isTrue(element.$$('.humanActions').hasAttribute('hidden'));
       assert.isFalse(element.$$('.robotActions').hasAttribute('hidden'));
+
+      // A robot comment with run ID should display plain text.
+      element.set(['comment', 'robot_run_id'], 'text');
+      element.editing = false;
+      element.collapsed = false;
+      flushAsynchronousOperations();
+      assert.isNotOk(element.$$('.robotRun.link'));
+      assert.notEqual(getComputedStyle(element.$$('.robotRun.text')).display,
+          'none');
+
+      // A robot comment with run ID and url should display a link.
+      element.set(['comment', 'url'], '/path/to/run');
+      flushAsynchronousOperations();
+      assert.notEqual(getComputedStyle(element.$$('.robotRun.link')).display,
+          'none');
+      assert.equal(getComputedStyle(element.$$('.robotRun.text')).display,
+          'none');
     });
 
     test('collapsible drafts', () => {
@@ -393,8 +472,7 @@
           'gr-formatted-text is not visible');
       assert.isFalse(isVisible(element.$$('.actions')),
           'actions are not visible');
-      assert.isFalse(isVisible(element.$$('gr-textarea')),
-          'textarea is not visible');
+      assert.isNotOk(element.textarea, 'textarea is not visible');
       assert.isTrue(isVisible(element.$$('.collapsedContent')),
           'header middle content is visible');
 
@@ -404,21 +482,20 @@
           'gr-formatted-text is visible');
       assert.isTrue(isVisible(element.$$('.actions')),
           'actions are visible');
-      assert.isFalse(isVisible(element.$$('gr-textarea')),
-          'textarea is not visible');
+      assert.isNotOk(element.textarea, 'textarea is not visible');
       assert.isFalse(isVisible(element.$$('.collapsedContent')),
           'header middle content is is not visible');
 
       // When the edit button is pressed, should still see the actions
       // and also textarea
       MockInteractions.tap(element.$$('.edit'));
+      flushAsynchronousOperations();
       assert.isFalse(element.collapsed);
       assert.isFalse(isVisible(element.$$('gr-formatted-text')),
           'gr-formatted-text is not visible');
       assert.isTrue(isVisible(element.$$('.actions')),
           'actions are visible');
-      assert.isTrue(isVisible(element.$$('gr-textarea')),
-          'textarea is visible');
+      assert.isTrue(isVisible(element.textarea), 'textarea is visible');
       assert.isFalse(isVisible(element.$$('.collapsedContent')),
           'header middle content is not visible');
 
@@ -442,13 +519,12 @@
           'gr-formatted-text is not visible');
       assert.isTrue(isVisible(element.$$('.actions')),
           'actions are visible');
-      assert.isTrue(isVisible(element.$$('gr-textarea')),
-          'textarea is visible');
+      assert.isTrue(isVisible(element.textarea), 'textarea is visible');
       assert.isFalse(isVisible(element.$$('.collapsedContent')),
           'header middle content is not visible');
     });
 
-    test('draft creation/cancelation', done => {
+    test('draft creation/cancellation', done => {
       assert.isFalse(element.editing);
       MockInteractions.tap(element.$$('.edit'));
       assert.isTrue(element.editing);
@@ -478,7 +554,8 @@
       MockInteractions.tap(element.$$('.cancel'));
       element.flushDebouncer('fire-update');
       element._messageText = '';
-      MockInteractions.pressAndReleaseKeyOn(element.$.editTextarea, 27); // esc
+      flushAsynchronousOperations();
+      MockInteractions.pressAndReleaseKeyOn(element.textarea, 27); // esc
     });
 
     test('draft discard removes message from storage', done => {
@@ -493,28 +570,64 @@
       element._handleConfirmDiscard({preventDefault: sinon.stub()});
     });
 
+    test('storage is cleared only after save success', () => {
+      element._messageText = 'test';
+      const eraseStub = sandbox.stub(element, '_eraseDraftComment');
+      sandbox.stub(element.$.restAPI, 'getResponseObject')
+          .returns(Promise.resolve({}));
+
+      sandbox.stub(element, '_saveDraft').returns(Promise.resolve({ok: false}));
+
+      const savePromise = element.save();
+      assert.isFalse(eraseStub.called);
+      return savePromise.then(() => {
+        assert.isFalse(eraseStub.called);
+
+        element._saveDraft.restore();
+        sandbox.stub(element, '_saveDraft')
+            .returns(Promise.resolve({ok: true}));
+        return element.save().then(() => {
+          assert.isTrue(eraseStub.called);
+        });
+      });
+    });
+
+    test('_computeSaveDisabled', () => {
+      const comment = {unresolved: true};
+      const msgComment = {message: 'test', unresolved: true};
+      assert.equal(element._computeSaveDisabled('', comment, false), true);
+      assert.equal(element._computeSaveDisabled('test', comment, false), false);
+      assert.equal(element._computeSaveDisabled('', msgComment, false), true);
+      assert.equal(
+          element._computeSaveDisabled('test', msgComment, false), false);
+      assert.equal(
+          element._computeSaveDisabled('test2', msgComment, false), false);
+      assert.equal(element._computeSaveDisabled('test', comment, true), false);
+      assert.equal(element._computeSaveDisabled('', comment, true), true);
+      assert.equal(element._computeSaveDisabled('', comment, false), true);
+    });
+
     suite('confirm discard', () => {
-      let saveDisabled;
       let discardStub;
       let overlayStub;
       let mockEvent;
 
       setup(() => {
-        sandbox.stub(element, '_computeSaveDisabled', () => saveDisabled);
         discardStub = sandbox.stub(element, '_discardDraft');
-        overlayStub = sandbox.stub(element, '_openOverlay');
+        overlayStub = sandbox.stub(element, '_openOverlay')
+            .returns(Promise.resolve());
         mockEvent = {preventDefault: sinon.stub()};
       });
 
-      test('confirms discard of comments that can be saved', () => {
-        saveDisabled = false;
+      test('confirms discard of comments with message text', () => {
+        element._messageText = 'test';
         element._handleDiscard(mockEvent);
-        assert.isTrue(overlayStub.calledWith(element.$.confirmDiscardOverlay));
+        assert.isTrue(overlayStub.calledWith(element.confirmDiscardOverlay));
         assert.isFalse(discardStub.called);
       });
 
-      test('no confirmation for comments that cannot be saved', () => {
-        saveDisabled = true;
+      test('no confirmation for comments without message text', () => {
+        element._messageText = '';
         element._handleDiscard(mockEvent);
         assert.isFalse(overlayStub.called);
         assert.isTrue(discardStub.calledOnce);
@@ -526,10 +639,13 @@
         assert.isTrue(stub.called);
         stub.restore();
         done();
+        return Promise.resolve();
       });
       element._messageText = 'is that the horse from horsing around??';
+      element.editing = true;
+      flushAsynchronousOperations();
       MockInteractions.pressAndReleaseKeyOn(
-          element.$.editTextarea.$.textarea.textarea,
+          element.textarea.$.textarea.textarea,
           83, 'ctrl'); // 'ctrl + s'
     });
 
@@ -544,21 +660,14 @@
       element.flushDebouncer('store');
       assert(fireStub.calledWith('comment-update'),
           'comment-update should be sent');
-      assert.deepEqual(fireStub.lastCall.args, [
-        'comment-update', {
-          comment: {
-            __commentSide: 'right',
-            __draft: true,
-            __draftID: 'temp_draft_id',
-            __editing: true,
-            line: 5,
-            path: '/path/to/file',
-            message: 'good news, everyone!',
-            unresolved: false,
-          },
-          patchNum: 1,
-        },
-      ]);
+      assert.isTrue(fireStub.calledOnce);
+
+      element._messageText = 'good news, everyone!';
+      element.flushDebouncer('fire-update');
+      element.flushDebouncer('store');
+      assert.isTrue(fireStub.calledOnce,
+          'No events should fire for text editing');
+
       MockInteractions.tap(element.$$('.save'));
 
       assert.isTrue(element.disabled,
@@ -574,7 +683,6 @@
             __commentSide: 'right',
             __draft: true,
             __draftID: 'temp_draft_id',
-            __editing: false,
             id: 'baf0414d_40572e03',
             line: 5,
             message: 'saved!',
@@ -606,6 +714,25 @@
       });
     });
 
+    test('draft prevent save when disabled', () => {
+      const saveStub = sandbox.stub(element, 'save').returns(Promise.resolve());
+      element.showActions = true;
+      element.draft = true;
+      MockInteractions.tap(element.$.header);
+      MockInteractions.tap(element.$$('.edit'));
+      element._messageText = 'good news, everyone!';
+      element.flushDebouncer('fire-update');
+      element.flushDebouncer('store');
+
+      element.disabled = true;
+      MockInteractions.tap(element.$$('.save'));
+      assert.isFalse(saveStub.called);
+
+      element.disabled = false;
+      MockInteractions.tap(element.$$('.save'));
+      assert.isTrue(saveStub.calledOnce);
+    });
+
     test('clicking on date link does not trigger nav', () => {
       const showStub = sinon.stub(page, 'show');
       const dateEl = element.$$('.date');
@@ -617,21 +744,38 @@
       showStub.restore();
     });
 
-    test('proper event fires on resolve', done => {
+    test('proper event fires on resolve, comment is not saved', done => {
+      const save = sandbox.stub(element, 'save');
       element.addEventListener('comment-update', e => {
         assert.isTrue(e.detail.comment.unresolved);
+        assert.isFalse(save.called);
         done();
       });
       MockInteractions.tap(element.$$('.resolve input'));
     });
 
     test('resolved comment state indicated by checkbox', () => {
+      sandbox.stub(element, 'save');
       element.comment = {unresolved: false};
       assert.isTrue(element.$$('.resolve input').checked);
       element.comment = {unresolved: true};
       assert.isFalse(element.$$('.resolve input').checked);
     });
 
+    test('resolved checkbox saves with tap when !editing', () => {
+      element.editing = false;
+      const save = sandbox.stub(element, 'save');
+
+      element.comment = {unresolved: false};
+      assert.isTrue(element.$$('.resolve input').checked);
+      element.comment = {unresolved: true};
+      assert.isFalse(element.$$('.resolve input').checked);
+      assert.isFalse(save.called);
+      MockInteractions.tap(element.$.resolvedCheckbox);
+      assert.isTrue(element.$$('.resolve input').checked);
+      assert.isTrue(save.called);
+    });
+
     suite('draft saving messages', () => {
       test('_getSavingMessage', () => {
         assert.equal(element._getSavingMessage(0), 'All changes saved');
@@ -642,23 +786,71 @@
 
       test('_show{Start,End}Request', () => {
         const updateStub = sandbox.stub(element, '_updateRequestToast');
-        element._numPendingDiffRequests.number = 1;
+        element._numPendingDraftRequests.number = 1;
 
         element._showStartRequest();
         assert.isTrue(updateStub.calledOnce);
         assert.equal(updateStub.lastCall.args[0], 2);
-        assert.equal(element._numPendingDiffRequests.number, 2);
+        assert.equal(element._numPendingDraftRequests.number, 2);
 
         element._showEndRequest();
         assert.isTrue(updateStub.calledTwice);
         assert.equal(updateStub.lastCall.args[0], 1);
-        assert.equal(element._numPendingDiffRequests.number, 1);
+        assert.equal(element._numPendingDraftRequests.number, 1);
 
         element._showEndRequest();
         assert.isTrue(updateStub.calledThrice);
         assert.equal(updateStub.lastCall.args[0], 0);
-        assert.equal(element._numPendingDiffRequests.number, 0);
+        assert.equal(element._numPendingDraftRequests.number, 0);
       });
     });
+
+    test('cancelling an unsaved draft discards, persists in storage', () => {
+      const discardSpy = sandbox.spy(element, '_fireDiscard');
+      const storeStub = sandbox.stub(element.$.storage, 'setDraftComment');
+      const eraseStub = sandbox.stub(element.$.storage, 'eraseDraftComment');
+      element._messageText = 'test text';
+      flushAsynchronousOperations();
+      element.flushDebouncer('store');
+
+      assert.isTrue(storeStub.called);
+      assert.equal(storeStub.lastCall.args[1], 'test text');
+      element._handleCancel({preventDefault: () => {}});
+      assert.isTrue(discardSpy.called);
+      assert.isFalse(eraseStub.called);
+    });
+
+    test('cancelling edit on a saved draft does not store', () => {
+      element.comment.id = 'foo';
+      const discardSpy = sandbox.spy(element, '_fireDiscard');
+      const storeStub = sandbox.stub(element.$.storage, 'setDraftComment');
+      element._messageText = 'test text';
+      flushAsynchronousOperations();
+      element.flushDebouncer('store');
+
+      assert.isFalse(storeStub.called);
+      element._handleCancel({preventDefault: () => {}});
+      assert.isTrue(discardSpy.called);
+    });
+
+    test('deleting text from saved draft and saving deletes the draft', () => {
+      element.comment = {id: 'foo', message: 'test'};
+      element._messageText = '';
+      const discardStub = sandbox.stub(element, '_discardDraft');
+
+      element.save();
+      assert.isTrue(discardStub.called);
+    });
+
+    test('_handleFix fires create-fix event', done => {
+      element.addEventListener('create-fix-comment', e => {
+        assert.deepEqual(e.detail, element._getEventPayload());
+        done();
+      });
+      element.isRobotComment = true;
+      flushAsynchronousOperations();
+
+      MockInteractions.tap(element.$$('.fix'));
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor.html b/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor.html
index 564312f..c24574e 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor.js b/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor.js
index 92311b1..aee7a62 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor_test.html b/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor_test.html
index ab3302b..9668a54 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor_test.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -34,6 +35,7 @@
     <mock-diff-response></mock-diff-response>
     <gr-diff></gr-diff>
     <gr-diff-cursor></gr-diff-cursor>
+    <gr-rest-api-interface></gr-rest-api-interface>
   </template>
 </test-fixture>
 
@@ -47,27 +49,18 @@
     setup(done => {
       sandbox = sinon.sandbox.create();
 
-      stub('gr-rest-api-interface', {
-        getLoggedIn() { return Promise.resolve(false); },
-      });
-
       const fixtureElems = fixture('basic');
       mockDiffResponse = fixtureElems[0];
       diffElement = fixtureElems[1];
       cursorElement = fixtureElems[2];
+      const restAPI = fixtureElems[3];
 
       // Register the diff with the cursor.
       cursorElement.push('diffs', diffElement);
 
+      diffElement.loggedIn = false;
+      diffElement.patchRange = {basePatchNum: 1, patchNum: 2};
       diffElement.comments = {left: [], right: []};
-      diffElement.$.restAPI.getDiffPreferences().then(prefs => {
-        diffElement.prefs = prefs;
-      });
-
-      sandbox.stub(diffElement, '_getDiff', () => {
-        return Promise.resolve(mockDiffResponse.diffResponse);
-      });
-
       const setupDone = () => {
         cursorElement._updateStops();
         cursorElement.moveToFirstChunk();
@@ -76,7 +69,10 @@
       };
       diffElement.addEventListener('render', setupDone);
 
-      diffElement.reload();
+      restAPI.getDiffPreferences().then(prefs => {
+        diffElement.prefs = prefs;
+        diffElement.diff = mockDiffResponse.diffResponse;
+      });
     });
 
     teardown(() => sandbox.restore());
@@ -218,7 +214,7 @@
         done();
       }
       diffElement.addEventListener('render', renderHandler);
-      diffElement.reload();
+      diffElement._diffChanged(mockDiffResponse.diffResponse);
     });
 
     test('initialLineNumber enabled', done => {
@@ -238,7 +234,7 @@
       cursorElement.initialLineNumber = 10;
       cursorElement.side = 'right';
 
-      diffElement.reload();
+      diffElement._diffChanged(mockDiffResponse.diffResponse);
     });
 
     test('getAddress', () => {
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-highlight/gr-annotation.js b/polygerrit-ui/app/elements/diff/gr-diff-highlight/gr-annotation.js
index e18f6ca..c1d53aa 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-highlight/gr-annotation.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff-highlight/gr-annotation.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function(window) {
   'use strict';
 
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-highlight/gr-annotation_test.html b/polygerrit-ui/app/elements/diff/gr-diff-highlight/gr-annotation_test.html
index b237685..652aa4c 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-highlight/gr-annotation_test.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-highlight/gr-annotation_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-highlight/gr-diff-highlight.html b/polygerrit-ui/app/elements/diff/gr-diff-highlight/gr-diff-highlight.html
index 7b9954d..c912a16 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-highlight/gr-diff-highlight.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-highlight/gr-diff-highlight.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,11 +26,11 @@
         position: relative;
       }
       .contentWrapper ::content .range {
-        background-color: rgba(255,213,0,0.5);
+        background-color: var(--diff-highlight-range-color);
         display: inline;
       }
       .contentWrapper ::content .rangeHighlight {
-        background-color: rgba(255,255,0,0.5);
+        background-color: var(--diff-highlight-range-hover-color);
         display: inline;
       }
       gr-selection-action-box {
@@ -41,7 +42,7 @@
       }
     </style>
     <div class="contentWrapper">
-      <content></content>
+      <slot></slot>
     </div>
   </template>
   <script src="gr-annotation.js"></script>
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-highlight/gr-diff-highlight.js b/polygerrit-ui/app/elements/diff/gr-diff-highlight/gr-diff-highlight.js
index 2490509..af8725e 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-highlight/gr-diff-highlight.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff-highlight/gr-diff-highlight.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -153,11 +156,10 @@
 
     /**
      * Adjust triple click selection for the whole line.
-     * domRange.endContainer may be one of the following:
-     * 1) 0 offset at right column's line number cell, or
-     * 2) 0 offset at left column's line number at the next line.
-     * Case 1 means left column was triple clicked.
-     * Case 2 means right column or unified view triple clicked.
+     * A triple click always results in:
+     * - start.column == end.column == 0
+     * - end.line == start.line + 1
+     *
      * @param {!Object} range Normalized range, ie column/line numbers
      * @param {!Range} domRange DOM Range object
      * @return {!Object} fixed normalized range
@@ -169,20 +171,19 @@
       }
       const start = range.start;
       const end = range.end;
-      const endsAtOtherSideLineNum =
+      // Happens when triple click in side-by-side mode with other side empty.
+      const endsAtOtherEmptySide = !end &&
           domRange.endOffset === 0 &&
           domRange.endContainer.nodeName === 'TD' &&
           (domRange.endContainer.classList.contains('left') ||
-              domRange.endContainer.classList.contains('right'));
-      const endsOnOtherSideStart = endsAtOtherSideLineNum ||
-          end &&
+           domRange.endContainer.classList.contains('right'));
+      const endsAtBeginningOfNextLine = end &&
+          start.column === 0 &&
           end.column === 0 &&
-          end.line === start.line &&
-          end.side != start.side;
+          end.line === start.line + 1;
       const content = domRange.cloneContents().querySelector('.contentText');
       const lineLength = content && this._getLength(content) || 0;
-      if (lineLength && endsOnOtherSideStart || endsAtOtherSideLineNum) {
-        // Selection ends at the beginning of the next line.
+      if (lineLength && (endsAtBeginningOfNextLine || endsAtOtherEmptySide)) {
         // Move the selection to the end of the previous line.
         range.end = {
           node: start.node,
@@ -251,6 +252,22 @@
       };
     },
 
+    /**
+     * The only line in which add a comment tooltip is cut off is the first
+     * line. Even if there is a collapsed section, The first visible line is
+     * in the position where the second line would have been, if not for the
+     * collapsed section, so don't need to worry about this case for
+     * positioning the tooltip.
+     */
+    _positionActionBox(actionBox, startLine, range) {
+      if (startLine > 1) {
+        actionBox.placeAbove(range);
+        return;
+      }
+      actionBox.positionBelow = true;
+      actionBox.placeBelow(range);
+    },
+
     _handleSelection() {
       const normalizedRange = this._getNormalizedRange();
       if (!normalizedRange) {
@@ -285,17 +302,18 @@
       };
       actionBox.side = start.side;
       if (start.line === end.line) {
-        actionBox.placeAbove(domRange);
+        this._positionActionBox(actionBox, start.line, domRange);
       } else if (start.node instanceof Text) {
         if (start.column) {
-          actionBox.placeAbove(start.node.splitText(start.column));
+          this._positionActionBox(actionBox, start.line,
+              start.node.splitText(start.column));
         }
         start.node.parentElement.normalize(); // Undo splitText from above.
       } else if (start.node.classList.contains('content') &&
-                 start.node.firstChild) {
-        actionBox.placeAbove(start.node.firstChild);
+          start.node.firstChild) {
+        this._positionActionBox(actionBox, start.line, start.node.firstChild);
       } else {
-        actionBox.placeAbove(start.node);
+        this._positionActionBox(actionBox, start.line, start.node);
       }
     },
 
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-highlight/gr-diff-highlight_test.html b/polygerrit-ui/app/elements/diff/gr-diff-highlight/gr-diff-highlight_test.html
index b63b9a4..b10e3cc 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-highlight/gr-diff-highlight_test.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-highlight/gr-diff-highlight_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -38,6 +39,27 @@
       <table id="diffTable">
 
         <tbody class="section both">
+           <tr class="diff-row side-by-side" left-type="both" right-type="both">
+            <td class="left lineNum" data-value="1"></td>
+            <td class="content both"><div class="contentText">[1] Nam cum ad me in Cumanum salutandi causa uterque venisset,</div></td>
+            <td class="right lineNum" data-value="1"></td>
+            <td class="content both"><div class="contentText">[1] Nam cum ad me in Cumanum salutandi causa uterque</div></td>
+          </tr>
+        </tbody>
+
+        <tbody class="section delta">
+          <tr class="diff-row side-by-side" left-type="remove" right-type="add">
+            <td class="left lineNum" data-value="2"></td>
+            <!-- Next tag is formatted to eliminate zero-length text nodes. -->
+            <td class="content remove"><div class="contentText">na💢ti <hl class="foo">te, inquit</hl>, sumus <hl class="bar">aliquando</hl> otiosum, <hl>certe</hl> a <hl><span class="tab-indicator" style="tab-size:8;">	</span></hl>udiam, <hl>quid</hl> sit, <span class="tab-indicator" style="tab-size:8;">	</span>quod <hl>Epicurum</hl></div></td>
+            <td class="right lineNum" data-value="2"></td>
+            <!-- Next tag is formatted to eliminate zero-length text nodes. -->
+            <td class="content add"><div class="contentText">nacti , <hl>,</hl> sumus <hl><span class="tab-indicator" style="tab-size:8;">	</span></hl> otiosum,  <span class="tab-indicator" style="tab-size:8;">	</span> audiam,  sit, quod</div></td>
+          </tr>
+        </tbody>
+
+
+        <tbody class="section both">
           <tr class="diff-row side-by-side" left-type="both" right-type="both">
             <td class="left lineNum" data-value="138"></td>
             <td class="content both"><div class="contentText">[14] Nam cum ad me in Cumanum salutandi causa uterque venisset,</div></td>
@@ -101,7 +123,7 @@
         <tbody class="section both">
           <tr class="diff-row side-by-side" left-type="both" right-type="both">
             <td class="left lineNum" data-value="165"></td>
-            <td class="content both"><div class="contentText">in physicis, quibus maxime gloriatur, primum totus est alienus. Democritea dicit</div></td>
+            <td class="content both"><div class="contentText"></div></td>
             <td class="right lineNum" data-value="147"></td>
             <td class="content both"><div class="contentText">in physicis, <hl><span class="tab-indicator" style="tab-size:8;">	</span></hl> quibus maxime gloriatur, primum totus est alienus. Democritea dicit</div></td>
           </tr>
@@ -253,6 +275,7 @@
         contentStubs = [];
         stub('gr-selection-action-box', {
           placeAbove: sandbox.stub(),
+          placeBelow: sandbox.stub(),
         });
         diff = element.querySelector('#diffTable');
         builder = {
@@ -270,9 +293,29 @@
         window.getSelection().removeAllRanges();
       });
 
+      test('single first line', () => {
+        const content = stubContent(1, 'right');
+        sandbox.spy(element, '_positionActionBox');
+        emulateSelection(content.firstChild, 5, content.firstChild, 12);
+        const actionBox = element.$$('gr-selection-action-box');
+        assert.isTrue(actionBox.positionBelow);
+      });
+
+      test('multiline starting on first line', () => {
+        const startContent = stubContent(1, 'right');
+        const endContent = stubContent(2, 'right');
+        sandbox.spy(element, '_positionActionBox');
+        emulateSelection(
+            startContent.firstChild, 10, endContent.lastChild, 7);
+        const actionBox = element.$$('gr-selection-action-box');
+        assert.isTrue(actionBox.positionBelow);
+      });
+
       test('single line', () => {
         const content = stubContent(138, 'left');
+        sandbox.spy(element, '_positionActionBox');
         emulateSelection(content.firstChild, 5, content.firstChild, 12);
+        const actionBox = element.$$('gr-selection-action-box');
         assert.isTrue(element.isRangeSelected());
         assert.deepEqual(getActionRange(), {
           startLine: 138,
@@ -281,14 +324,18 @@
           endChar: 12,
         });
         assert.equal(getActionSide(), 'left');
+        assert.notOk(actionBox.positionBelow);
       });
 
       test('multiline', () => {
         const startContent = stubContent(119, 'right');
         const endContent = stubContent(120, 'right');
+        sandbox.spy(element, '_positionActionBox');
         emulateSelection(
             startContent.firstChild, 10, endContent.lastChild, 7);
         assert.isTrue(element.isRangeSelected());
+        const actionBox = element.$$('gr-selection-action-box');
+
         assert.deepEqual(getActionRange(), {
           startLine: 119,
           startChar: 10,
@@ -296,6 +343,7 @@
           endChar: 36,
         });
         assert.equal(getActionSide(), 'right');
+        assert.notOk(actionBox.positionBelow);
       });
 
       test('multiple ranges aka firefox implementation', () => {
@@ -528,54 +576,33 @@
         assert.equal(result, 0);
       });
 
-      // TODO (viktard): Selection starts in line number.
-      // TODO (viktard): Empty lines in selection start.
-      // TODO (viktard): Empty lines in selection end.
-      // TODO (viktard): Only empty lines selected.
-      // TODO (viktard): Unified mode.
-
-      suite('triple click', () => {
-        test('_fixTripleClickSelection', () => {
-          const fakeRange = {
-            startContainer: '',
-            startOffset: '',
-            endContainer: '',
-            endOffset: '',
-          };
-          const fixedRange = {};
-          sandbox.stub(GrRangeNormalizer, 'normalize').returns(fakeRange);
-          sandbox.stub(element, '_normalizeSelectionSide');
-          sandbox.stub(element, '_fixTripleClickSelection').returns(fixedRange);
-          assert.strictEqual(element._normalizeRange({}), fixedRange);
-          assert.isTrue(element._fixTripleClickSelection.called);
+      test('_fixTripleClickSelection', () => {
+        const startContent = stubContent(119, 'right');
+        const endContent = stubContent(120, 'right');
+        emulateSelection(startContent.firstChild, 0, endContent.firstChild, 0);
+        assert.isTrue(element.isRangeSelected());
+        assert.deepEqual(getActionRange(), {
+          startLine: 119,
+          startChar: 0,
+          endLine: 119,
+          endChar: element._getLength(startContent),
         });
+        assert.equal(getActionSide(), 'right');
+      });
 
-        test('left pane', () => {
-          const startNode = stubContent(138, 'left');
-          const endNode =
-              stubContent(119, 'right').parentElement.previousElementSibling;
-          builder.getLineNumberByChild.withArgs(endNode).returns(119);
-          emulateSelection(startNode, 0, endNode, 0);
-          assert.deepEqual(getActionRange(), {
-            startLine: 138,
-            startChar: 0,
-            endLine: 138,
-            endChar: 63,
-          });
+      test('_fixTripleClickSelection empty line', () => {
+        const startContent = stubContent(146, 'right');
+        const endContent = stubContent(165, 'left');
+        emulateSelection(startContent.firstChild, 0,
+            endContent.parentElement.previousElementSibling, 0);
+        assert.isTrue(element.isRangeSelected());
+        assert.deepEqual(getActionRange(), {
+          startLine: 146,
+          startChar: 0,
+          endLine: 146,
+          endChar: 84,
         });
-
-        test('right pane', () => {
-          const startNode = stubContent(119, 'right');
-          const endNode =
-              stubContent(140, 'left').parentElement.previousElementSibling;
-          emulateSelection(startNode, 0, endNode, 0);
-          assert.deepEqual(getActionRange(), {
-            startLine: 119,
-            startChar: 0,
-            endLine: 119,
-            endChar: 63,
-          });
-        });
+        assert.equal(getActionSide(), 'right');
       });
     });
   });
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-highlight/gr-range-normalizer.js b/polygerrit-ui/app/elements/diff/gr-diff-highlight/gr-range-normalizer.js
index 1ea5037..eb4123d 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-highlight/gr-range-normalizer.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff-highlight/gr-range-normalizer.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function(window) {
   'use strict';
 
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.html b/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.html
new file mode 100644
index 0000000..e3bf866
--- /dev/null
+++ b/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.html
@@ -0,0 +1,55 @@
+<!--
+@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="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../core/gr-reporting/gr-reporting.html">
+<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
+
+<link rel="import" href="../gr-diff/gr-diff.html">
+
+<dom-module id="gr-diff-host">
+  <template>
+    <gr-diff
+        id="diff"
+        change-num="[[changeNum]]"
+        no-auto-render=[[noAutoRender]]
+        patch-range="[[patchRange]]"
+        path="[[path]]"
+        prefs="[[prefs]]"
+        project-config="[[projectConfig]]"
+        project-name="[[projectName]]"
+        display-line="[[displayLine]]"
+        is-image-diff="[[isImageDiff]]"
+        commit-range="[[commitRange]]"
+        hidden$="[[hidden]]"
+        no-render-on-prefs-change="[[noRenderOnPrefsChange]]"
+        comments="[[comments]]"
+        line-wrapping="[[lineWrapping]]"
+        view-mode="[[viewMode]]"
+        line-of-interest="[[lineOfInterest]]"
+        logged-in="[[_loggedIn]]"
+        loading="[[_loading]]"
+        error-message="[[_errorMessage]]"
+        base-image="[[_baseImage]]"
+        revision-image=[[_revisionImage]]
+        blame="[[_blame]]"
+        diff="[[_diff]]"></gr-diff>
+    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
+    <gr-reporting id="reporting" category="diff"></gr-reporting>
+  </template>
+  <script src="gr-diff-host.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.js b/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.js
new file mode 100644
index 0000000..6f61fb9
--- /dev/null
+++ b/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.js
@@ -0,0 +1,510 @@
+/**
+ * @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';
+
+  const MSG_EMPTY_BLAME = 'No blame information for this diff.';
+
+  const EVENT_AGAINST_PARENT = 'diff-against-parent';
+  const EVENT_ZERO_REBASE = 'rebase-percent-zero';
+  const EVENT_NONZERO_REBASE = 'rebase-percent-nonzero';
+
+  const DiffViewMode = {
+    SIDE_BY_SIDE: 'SIDE_BY_SIDE',
+    UNIFIED: 'UNIFIED_DIFF',
+  };
+
+  const WHITESPACE_IGNORE_NONE = 'IGNORE_NONE';
+
+  /**
+   * @param {Object} diff
+   * @return {boolean}
+   */
+  function isImageDiff(diff) {
+    if (!diff) { return false; }
+
+    const isA = diff.meta_a &&
+        diff.meta_a.content_type.startsWith('image/');
+    const isB = diff.meta_b &&
+        diff.meta_b.content_type.startsWith('image/');
+
+    return !!(diff.binary && (isA || isB));
+  }
+
+  /**
+   * Wrapper around gr-diff.
+   *
+   * Webcomponent fetching diffs and related data from restAPI and passing them
+   * to the presentational gr-diff for rendering.
+   */
+  // TODO(oler): Move all calls to restAPI from gr-diff here.
+  Polymer({
+    is: 'gr-diff-host',
+
+    /**
+     * Fired when the user selects a line.
+     * @event line-selected
+     */
+
+    /**
+     * Fired if being logged in is required.
+     *
+     * @event show-auth-required
+     */
+
+    /**
+     * Fired when a comment is saved or discarded
+     *
+     * @event diff-comments-modified
+     */
+
+    properties: {
+      changeNum: String,
+      noAutoRender: {
+        type: Boolean,
+        value: false,
+      },
+      /** @type {?} */
+      patchRange: Object,
+      path: String,
+      prefs: {
+        type: Object,
+      },
+      projectConfig: {
+        type: Object,
+      },
+      projectName: String,
+      displayLine: {
+        type: Boolean,
+        value: false,
+      },
+      isImageDiff: {
+        type: Boolean,
+        computed: '_computeIsImageDiff(_diff)',
+        notify: true,
+      },
+      commitRange: Object,
+      filesWeblinks: {
+        type: Object,
+        value() { return {}; },
+        notify: true,
+      },
+      hidden: {
+        type: Boolean,
+        reflectToAttribute: true,
+      },
+      noRenderOnPrefsChange: {
+        type: Boolean,
+        value: false,
+      },
+      comments: Object,
+      lineWrapping: {
+        type: Boolean,
+        value: false,
+      },
+      viewMode: {
+        type: String,
+        value: DiffViewMode.SIDE_BY_SIDE,
+      },
+
+      /**
+       * Special line number which should not be collapsed into a shared region.
+       * @type {{
+       *  number: number,
+       *  leftSide: {boolean}
+       * }|null}
+       */
+      lineOfInterest: Object,
+
+      /**
+       * If the diff fails to load, show the failure message in the diff rather
+       * than bubbling the error up to the whole page. This is useful for when
+       * loading inline diffs because one diff failing need not mark the whole
+       * page with a failure.
+       */
+      showLoadFailure: Boolean,
+
+      isBlameLoaded: {
+        type: Boolean,
+        notify: true,
+        computed: '_computeIsBlameLoaded(_blame)',
+      },
+
+      _loggedIn: {
+        type: Boolean,
+        value: false,
+      },
+
+      _loading: {
+        type: Boolean,
+        value: false,
+      },
+
+      /** @type {?string} */
+      _errorMessage: {
+        type: String,
+        value: null,
+      },
+
+      /** @type {?Object} */
+      _baseImage: Object,
+      /** @type {?Object} */
+      _revisionImage: Object,
+
+      _diff: Object,
+
+      /** @type {?Object} */
+      _blame: {
+        type: Object,
+        value: null,
+      },
+
+      _loadedWhitespaceLevel: String,
+    },
+
+    listeners: {
+      'draft-interaction': '_handleDraftInteraction',
+    },
+
+    observers: [
+      '_whitespaceChanged(prefs.ignore_whitespace, _loadedWhitespaceLevel,' +
+          ' noRenderOnPrefsChange)',
+    ],
+
+    ready() {
+      if (this._canReload()) {
+        this.reload();
+      }
+    },
+
+    attached() {
+      this._getLoggedIn().then(loggedIn => {
+        this._loggedIn = loggedIn;
+      });
+    },
+
+    /** @return {!Promise} */
+    reload() {
+      this._loading = true;
+      this._errorMessage = null;
+      const whitespaceLevel = this._getIgnoreWhitespace();
+
+      const diffRequest = this._getDiff()
+          .then(diff => {
+            this._loadedWhitespaceLevel = whitespaceLevel;
+            this._reportDiff(diff);
+            if (this._getIgnoreWhitespace() !== WHITESPACE_IGNORE_NONE) {
+              return this._translateChunksToIgnore(diff);
+            }
+            return diff;
+          })
+          .catch(e => {
+            this._handleGetDiffError(e);
+            return null;
+          });
+
+      const assetRequest = diffRequest.then(diff => {
+        // If the diff is null, then it's failed to load.
+        if (!diff) { return null; }
+
+        return this._loadDiffAssets(diff);
+      });
+
+      return Promise.all([diffRequest, assetRequest])
+          .then(results => {
+            const diff = results[0];
+            if (!diff) {
+              return Promise.resolve();
+            }
+            this.filesWeblinks = this._getFilesWeblinks(diff);
+            return new Promise(resolve => {
+              const callback = () => {
+                resolve();
+                this.removeEventListener('render', callback);
+              };
+              this.addEventListener('render', callback);
+              this._diff = diff;
+            });
+          })
+          .catch(err => {
+            console.warn('Error encountered loading diff:', err);
+          })
+          .then(() => { this._loading = false; });
+    },
+
+    _getFilesWeblinks(diff) {
+      if (!this.commitRange) { return {}; }
+      return {
+        meta_a: Gerrit.Nav.getFileWebLinks(
+            this.projectName, this.commitRange.baseCommit, this.path,
+            {weblinks: diff && diff.meta_a && diff.meta_a.web_links}),
+        meta_b: Gerrit.Nav.getFileWebLinks(
+            this.projectName, this.commitRange.commit, this.path,
+            {weblinks: diff && diff.meta_b && diff.meta_b.web_links}),
+      };
+    },
+
+    /** Cancel any remaining diff builder rendering work. */
+    cancel() {
+      this.$.diff.cancel();
+    },
+
+    /** @return {!Array<!HTMLElement>} */
+    getCursorStops() {
+      return this.$.diff.getCursorStops();
+    },
+
+    /** @return {boolean} */
+    isRangeSelected() {
+      return this.$.diff.isRangeSelected();
+    },
+
+    toggleLeftDiff() {
+      this.$.diff.toggleLeftDiff();
+    },
+
+    /**
+     * Load and display blame information for the base of the diff.
+     * @return {Promise} A promise that resolves when blame finishes rendering.
+     */
+    loadBlame() {
+      return this.$.restAPI.getBlame(this.changeNum, this.patchRange.patchNum,
+          this.path, true)
+          .then(blame => {
+            if (!blame.length) {
+              this.fire('show-alert', {message: MSG_EMPTY_BLAME});
+              return Promise.reject(MSG_EMPTY_BLAME);
+            }
+
+            this._blame = blame;
+          });
+    },
+
+    /** Unload blame information for the diff. */
+    clearBlame() {
+      this._blame = null;
+    },
+
+    /** @return {!Array<!HTMLElement>} */
+    getThreadEls() {
+      return this.$.diff.getThreadEls();
+    },
+
+    /** @param {HTMLElement} el */
+    addDraftAtLine(el) {
+      this.$.diff.addDraftAtLine(el);
+    },
+
+    clearDiffContent() {
+      this.$.diff.clearDiffContent();
+    },
+
+    expandAllContext() {
+      this.$.diff.expandAllContext();
+    },
+
+    /** @return {!Promise} */
+    _getLoggedIn() {
+      return this.$.restAPI.getLoggedIn();
+    },
+
+    /** @return {boolean}} */
+    _canReload() {
+      return !!this.changeNum && !!this.patchRange && !!this.path &&
+          !this.noAutoRender;
+    },
+
+    /** @return {!Promise<!Object>} */
+    _getDiff() {
+      // Wrap the diff request in a new promise so that the error handler
+      // rejects the promise, allowing the error to be handled in the .catch.
+      return new Promise((resolve, reject) => {
+        this.$.restAPI.getDiff(
+            this.changeNum,
+            this.patchRange.basePatchNum,
+            this.patchRange.patchNum,
+            this.path,
+            this._getIgnoreWhitespace(),
+            reject)
+            .then(resolve);
+      });
+    },
+
+    _handleGetDiffError(response) {
+      // Loading the diff may respond with 409 if the file is too large. In this
+      // case, use a toast error..
+      if (response.status === 409) {
+        this.fire('server-error', {response});
+        return;
+      }
+
+      if (this.showLoadFailure) {
+        this._errorMessage = [
+          'Encountered error when loading the diff:',
+          response.status,
+          response.statusText,
+        ].join(' ');
+        return;
+      }
+
+      this.fire('page-error', {response});
+    },
+
+    /**
+     * Report info about the diff response.
+     */
+    _reportDiff(diff) {
+      if (!diff || !diff.content) { return; }
+
+      // Count the delta lines stemming from normal deltas, and from
+      // due_to_rebase deltas.
+      let nonRebaseDelta = 0;
+      let rebaseDelta = 0;
+      diff.content.forEach(chunk => {
+        if (chunk.ab) { return; }
+        const deltaSize = Math.max(
+            chunk.a ? chunk.a.length : 0, chunk.b ? chunk.b.length : 0);
+        if (chunk.due_to_rebase) {
+          rebaseDelta += deltaSize;
+        } else {
+          nonRebaseDelta += deltaSize;
+        }
+      });
+
+      // Find the percent of the delta from due_to_rebase chunks rounded to two
+      // digits. Diffs with no delta are considered 0%.
+      const totalDelta = rebaseDelta + nonRebaseDelta;
+      const percentRebaseDelta = !totalDelta ? 0 :
+          Math.round(100 * rebaseDelta / totalDelta);
+
+      // Report the due_to_rebase percentage in the "diff" category when
+      // applicable.
+      if (this.patchRange.basePatchNum === 'PARENT') {
+        this.$.reporting.reportInteraction(EVENT_AGAINST_PARENT);
+      } else if (percentRebaseDelta === 0) {
+        this.$.reporting.reportInteraction(EVENT_ZERO_REBASE);
+      } else {
+        this.$.reporting.reportInteraction(EVENT_NONZERO_REBASE,
+            percentRebaseDelta);
+      }
+    },
+
+    /**
+     * @param {Object} diff
+     * @return {!Promise}
+     */
+    _loadDiffAssets(diff) {
+      if (isImageDiff(diff)) {
+        return this._getImages(diff).then(images => {
+          this._baseImage = images.baseImage;
+          this._revisionImage = images.revisionImage;
+        });
+      } else {
+        this._baseImage = null;
+        this._revisionImage = null;
+        return Promise.resolve();
+      }
+    },
+
+    /**
+     * @param {Object} diff
+     * @return {boolean}
+     */
+    _computeIsImageDiff(diff) {
+      return isImageDiff(diff);
+    },
+
+    /**
+     * @param {Object} blame
+     * @return {boolean}
+     */
+    _computeIsBlameLoaded(blame) {
+      return !!blame;
+    },
+
+    /**
+     * @param {Object} diff
+     * @return {!Promise}
+     */
+    _getImages(diff) {
+      return this.$.restAPI.getImagesForDiff(this.changeNum, diff,
+          this.patchRange);
+    },
+
+    _handleDraftInteraction() {
+      this.$.reporting.recordDraftInteraction();
+    },
+
+    /**
+     * Take a diff that was loaded with a ignore-whitespace other than
+     * IGNORE_NONE, and convert delta chunks labeled as common into shared
+     * chunks.
+     * @param {!Object} diff
+     * @returns {!Object}
+     */
+    _translateChunksToIgnore(diff) {
+      const newDiff = Object.assign({}, diff);
+      const mergedContent = [];
+
+      // Was the last chunk visited a shared chunk?
+      let lastWasShared = false;
+
+      for (const chunk of diff.content) {
+        if (lastWasShared && chunk.common && chunk.b) {
+          // The last chunk was shared and this chunk should be ignored, so
+          // add its revision content to the previous chunk.
+          mergedContent[mergedContent.length - 1].ab.push(...chunk.b);
+        } else if (chunk.common && !chunk.b) {
+          // If the chunk should be ignored, but it doesn't have revision
+          // content, then drop it and continue without updating lastWasShared.
+          continue;
+        } else if (lastWasShared && chunk.ab) {
+          // Both the last chunk and the current chunk are shared. Merge this
+          // chunk's shared content into the previous shared content.
+          mergedContent[mergedContent.length - 1].ab.push(...chunk.ab);
+        } else if (!lastWasShared && chunk.common && chunk.b) {
+          // If the previous chunk was not shared, but this one should be
+          // ignored, then add it as a shared chunk.
+          mergedContent.push({ab: chunk.b});
+        } else {
+          // Otherwise add the chunk as is.
+          mergedContent.push(chunk);
+        }
+
+        lastWasShared = !!mergedContent[mergedContent.length - 1].ab;
+      }
+
+      newDiff.content = mergedContent;
+      return newDiff;
+    },
+
+    _getIgnoreWhitespace() {
+      if (!this.prefs || !this.prefs.ignore_whitespace) {
+        return WHITESPACE_IGNORE_NONE;
+      }
+      return this.prefs.ignore_whitespace;
+    },
+
+    _whitespaceChanged(preferredWhitespaceLevel, loadedWhitespaceLevel,
+        noRenderOnPrefsChange) {
+      if (preferredWhitespaceLevel !== loadedWhitespaceLevel &&
+          !noRenderOnPrefsChange) {
+        this.reload();
+      }
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host_test.html b/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host_test.html
new file mode 100644
index 0000000..f83253e
--- /dev/null
+++ b/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host_test.html
@@ -0,0 +1,863 @@
+<!DOCTYPE html>
+<!--
+@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.
+-->
+
+<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+<title>gr-diff</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+
+<link rel="import" href="gr-diff-host.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-diff-host></gr-diff-host>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-diff-host tests', () => {
+    let element;
+    let sandbox;
+
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+      element = fixture('basic');
+    });
+
+    teardown(() => {
+      sandbox.restore();
+    });
+
+    test('reload() cancels before network resolves', () => {
+      const cancelStub = sandbox.stub(element.$.diff, 'cancel');
+
+      // Stub the network calls into requests that never resolve.
+      sandbox.stub(element, '_getDiff', () => new Promise(() => {}));
+
+      element.reload();
+      assert.isTrue(cancelStub.called);
+    });
+
+    suite('not logged in', () => {
+      setup(() => {
+        const getLoggedInPromise = Promise.resolve(false);
+        stub('gr-rest-api-interface', {
+          getLoggedIn() { return getLoggedInPromise; },
+        });
+        element = fixture('basic');
+        return getLoggedInPromise;
+      });
+
+      test('reload() loads files weblinks', () => {
+        const weblinksStub = sandbox.stub(Gerrit.Nav, '_generateWeblinks')
+            .returns({name: 'stubb', url: '#s'});
+        sandbox.stub(element.$.restAPI, 'getDiff').returns(Promise.resolve({
+          content: [],
+        }));
+        element.projectName = 'test-project';
+        element.path = 'test-path';
+        element.commitRange = {baseCommit: 'test-base', commit: 'test-commit'};
+        element.patchRange = {};
+        return element.reload().then(() => {
+          assert.isTrue(weblinksStub.calledTwice);
+          assert.isTrue(weblinksStub.firstCall.calledWith({
+            commit: 'test-base',
+            file: 'test-path',
+            options: {
+              weblinks: undefined,
+            },
+            repo: 'test-project',
+            type: Gerrit.Nav.WeblinkType.FILE}));
+          assert.isTrue(weblinksStub.secondCall.calledWith({
+            commit: 'test-commit',
+            file: 'test-path',
+            options: {
+              weblinks: undefined,
+            },
+            repo: 'test-project',
+            type: Gerrit.Nav.WeblinkType.FILE}));
+          assert.deepEqual(element.filesWeblinks, {
+            meta_a: [{name: 'stubb', url: '#s'}],
+            meta_b: [{name: 'stubb', url: '#s'}],
+          });
+        });
+      });
+
+      test('_getDiff handles null diff responses', done => {
+        stub('gr-rest-api-interface', {
+          getDiff() { return Promise.resolve(null); },
+        });
+        element.changeNum = 123;
+        element.patchRange = {basePatchNum: 1, patchNum: 2};
+        element.path = 'file.txt';
+        element._getDiff().then(done);
+      });
+
+      test('reload resolves on error', () => {
+        const onErrStub = sandbox.stub(element, '_handleGetDiffError');
+        const error = {ok: false, status: 500};
+        sandbox.stub(element.$.restAPI, 'getDiff',
+            (changeNum, basePatchNum, patchNum, path, onErr) => {
+              onErr(error);
+            });
+        return element.reload().then(() => {
+          assert.isTrue(onErrStub.calledOnce);
+        });
+      });
+
+      suite('_handleGetDiffError', () => {
+        let serverErrorStub;
+        let pageErrorStub;
+
+        setup(() => {
+          serverErrorStub = sinon.stub();
+          element.addEventListener('server-error', serverErrorStub);
+          pageErrorStub = sinon.stub();
+          element.addEventListener('page-error', pageErrorStub);
+        });
+
+        test('page error on HTTP-409', () => {
+          element._handleGetDiffError({status: 409});
+          assert.isTrue(serverErrorStub.calledOnce);
+          assert.isFalse(pageErrorStub.called);
+          assert.isNotOk(element._errorMessage);
+        });
+
+        test('server error on non-HTTP-409', () => {
+          element._handleGetDiffError({status: 500});
+          assert.isFalse(serverErrorStub.called);
+          assert.isTrue(pageErrorStub.calledOnce);
+          assert.isNotOk(element._errorMessage);
+        });
+
+        test('error message if showLoadFailure', () => {
+          element.showLoadFailure = true;
+          element._handleGetDiffError({status: 500, statusText: 'Failure!'});
+          assert.isFalse(serverErrorStub.called);
+          assert.isFalse(pageErrorStub.called);
+          assert.equal(element._errorMessage,
+              'Encountered error when loading the diff: 500 Failure!');
+        });
+      });
+
+      suite('image diffs', () => {
+        let mockFile1;
+        let mockFile2;
+        setup(() => {
+          mockFile1 = {
+            body: 'Qk06AAAAAAAAADYAAAAoAAAAAQAAAP////8BACAAAAAAAAAAAAATCwAAE' +
+            'wsAAAAAAAAAAAAAAAAA/w==',
+            type: 'image/bmp',
+          };
+          mockFile2 = {
+            body: 'Qk06AAAAAAAAADYAAAAoAAAAAQAAAP////8BACAAAAAAAAAAAAATCwAAE' +
+            'wsAAAAAAAAAAAAA/////w==',
+            type: 'image/bmp',
+          };
+          sandbox.stub(element.$.restAPI,
+              'getB64FileContents',
+              (changeId, patchNum, path, opt_parentIndex) => {
+                return Promise.resolve(opt_parentIndex === 1 ? mockFile1 :
+                    mockFile2);
+              });
+
+          element.patchRange = {basePatchNum: 'PARENT', patchNum: 1};
+          element.comments = {left: [], right: []};
+        });
+
+        test('renders image diffs with same file name', done => {
+          const mockDiff = {
+            meta_a: {name: 'carrot.jpg', content_type: 'image/jpeg', lines: 66},
+            meta_b: {name: 'carrot.jpg', content_type: 'image/jpeg',
+              lines: 560},
+            intraline_status: 'OK',
+            change_type: 'MODIFIED',
+            diff_header: [
+              'diff --git a/carrot.jpg b/carrot.jpg',
+              'index 2adc47d..f9c2f2c 100644',
+              '--- a/carrot.jpg',
+              '+++ b/carrot.jpg',
+              'Binary files differ',
+            ],
+            content: [{skip: 66}],
+            binary: true,
+          };
+          sandbox.stub(element.$.restAPI, 'getDiff')
+              .returns(Promise.resolve(mockDiff));
+
+          const rendered = () => {
+            // Recognizes that it should be an image diff.
+            assert.isTrue(element.isImageDiff);
+            assert.instanceOf(
+                element.$.diff.$.diffBuilder._builder, GrDiffBuilderImage);
+
+            // Left image rendered with the parent commit's version of the file.
+            const leftImage =
+                element.$.diff.$.diffTable.querySelector('td.left img');
+            const leftLabel =
+                element.$.diff.$.diffTable.querySelector('td.left label');
+            const leftLabelContent = leftLabel.querySelector('.label');
+            const leftLabelName = leftLabel.querySelector('.name');
+
+            const rightImage =
+                element.$.diff.$.diffTable.querySelector('td.right img');
+            const rightLabel = element.$.diff.$.diffTable.querySelector(
+                'td.right label');
+            const rightLabelContent = rightLabel.querySelector('.label');
+            const rightLabelName = rightLabel.querySelector('.name');
+
+            assert.isNotOk(rightLabelName);
+            assert.isNotOk(leftLabelName);
+
+            let leftLoaded = false;
+            let rightLoaded = false;
+
+            leftImage.addEventListener('load', () => {
+              assert.isOk(leftImage);
+              assert.equal(leftImage.getAttribute('src'),
+                  'data:image/bmp;base64, ' + mockFile1.body);
+              assert.equal(leftLabelContent.textContent, '1×1 image/bmp');
+              leftLoaded = true;
+              if (rightLoaded) {
+                element.removeEventListener('render', rendered);
+                done();
+              }
+            });
+
+            rightImage.addEventListener('load', () => {
+              assert.isOk(rightImage);
+              assert.equal(rightImage.getAttribute('src'),
+                  'data:image/bmp;base64, ' + mockFile2.body);
+              assert.equal(rightLabelContent.textContent, '1×1 image/bmp');
+
+              rightLoaded = true;
+              if (leftLoaded) {
+                element.removeEventListener('render', rendered);
+                done();
+              }
+            });
+          };
+
+          element.addEventListener('render', rendered);
+
+          element.$.restAPI.getDiffPreferences().then(prefs => {
+            element.prefs = prefs;
+            element.reload();
+          });
+        });
+
+        test('renders image diffs with a different file name', done => {
+          const mockDiff = {
+            meta_a: {name: 'carrot.jpg', content_type: 'image/jpeg', lines: 66},
+            meta_b: {name: 'carrot2.jpg', content_type: 'image/jpeg',
+              lines: 560},
+            intraline_status: 'OK',
+            change_type: 'MODIFIED',
+            diff_header: [
+              'diff --git a/carrot.jpg b/carrot2.jpg',
+              'index 2adc47d..f9c2f2c 100644',
+              '--- a/carrot.jpg',
+              '+++ b/carrot2.jpg',
+              'Binary files differ',
+            ],
+            content: [{skip: 66}],
+            binary: true,
+          };
+          sandbox.stub(element.$.restAPI, 'getDiff')
+              .returns(Promise.resolve(mockDiff));
+
+          const rendered = () => {
+            // Recognizes that it should be an image diff.
+            assert.isTrue(element.isImageDiff);
+            assert.instanceOf(
+                element.$.diff.$.diffBuilder._builder, GrDiffBuilderImage);
+
+            // Left image rendered with the parent commit's version of the file.
+            const leftImage =
+                element.$.diff.$.diffTable.querySelector('td.left img');
+            const leftLabel =
+                element.$.diff.$.diffTable.querySelector('td.left label');
+            const leftLabelContent = leftLabel.querySelector('.label');
+            const leftLabelName = leftLabel.querySelector('.name');
+
+            const rightImage =
+                element.$.diff.$.diffTable.querySelector('td.right img');
+            const rightLabel = element.$.diff.$.diffTable.querySelector(
+                'td.right label');
+            const rightLabelContent = rightLabel.querySelector('.label');
+            const rightLabelName = rightLabel.querySelector('.name');
+
+            assert.isOk(rightLabelName);
+            assert.isOk(leftLabelName);
+            assert.equal(leftLabelName.textContent, mockDiff.meta_a.name);
+            assert.equal(rightLabelName.textContent, mockDiff.meta_b.name);
+
+            let leftLoaded = false;
+            let rightLoaded = false;
+
+            leftImage.addEventListener('load', () => {
+              assert.isOk(leftImage);
+              assert.equal(leftImage.getAttribute('src'),
+                  'data:image/bmp;base64, ' + mockFile1.body);
+              assert.equal(leftLabelContent.textContent, '1×1 image/bmp');
+              leftLoaded = true;
+              if (rightLoaded) {
+                element.removeEventListener('render', rendered);
+                done();
+              }
+            });
+
+            rightImage.addEventListener('load', () => {
+              assert.isOk(rightImage);
+              assert.equal(rightImage.getAttribute('src'),
+                  'data:image/bmp;base64, ' + mockFile2.body);
+              assert.equal(rightLabelContent.textContent, '1×1 image/bmp');
+
+              rightLoaded = true;
+              if (leftLoaded) {
+                element.removeEventListener('render', rendered);
+                done();
+              }
+            });
+          };
+
+          element.addEventListener('render', rendered);
+
+          element.$.restAPI.getDiffPreferences().then(prefs => {
+            element.prefs = prefs;
+            element.reload();
+          });
+        });
+
+        test('renders added image', done => {
+          const mockDiff = {
+            meta_b: {name: 'carrot.jpg', content_type: 'image/jpeg',
+              lines: 560},
+            intraline_status: 'OK',
+            change_type: 'ADDED',
+            diff_header: [
+              'diff --git a/carrot.jpg b/carrot.jpg',
+              'index 0000000..f9c2f2c 100644',
+              '--- /dev/null',
+              '+++ b/carrot.jpg',
+              'Binary files differ',
+            ],
+            content: [{skip: 66}],
+            binary: true,
+          };
+          sandbox.stub(element.$.restAPI, 'getDiff')
+              .returns(Promise.resolve(mockDiff));
+
+          element.addEventListener('render', () => {
+            // Recognizes that it should be an image diff.
+            assert.isTrue(element.isImageDiff);
+            assert.instanceOf(
+                element.$.diff.$.diffBuilder._builder, GrDiffBuilderImage);
+
+            const leftImage =
+                element.$.diff.$.diffTable.querySelector('td.left img');
+            const rightImage =
+                element.$.diff.$.diffTable.querySelector('td.right img');
+
+            assert.isNotOk(leftImage);
+            assert.isOk(rightImage);
+            done();
+          });
+
+          element.$.restAPI.getDiffPreferences().then(prefs => {
+            element.prefs = prefs;
+            element.reload();
+          });
+        });
+
+        test('renders removed image', done => {
+          const mockDiff = {
+            meta_a: {name: 'carrot.jpg', content_type: 'image/jpeg',
+              lines: 560},
+            intraline_status: 'OK',
+            change_type: 'DELETED',
+            diff_header: [
+              'diff --git a/carrot.jpg b/carrot.jpg',
+              'index f9c2f2c..0000000 100644',
+              '--- a/carrot.jpg',
+              '+++ /dev/null',
+              'Binary files differ',
+            ],
+            content: [{skip: 66}],
+            binary: true,
+          };
+          sandbox.stub(element.$.restAPI, 'getDiff')
+              .returns(Promise.resolve(mockDiff));
+
+          element.addEventListener('render', () => {
+            // Recognizes that it should be an image diff.
+            assert.isTrue(element.isImageDiff);
+            assert.instanceOf(
+                element.$.diff.$.diffBuilder._builder, GrDiffBuilderImage);
+
+            const leftImage =
+                element.$.diff.$.diffTable.querySelector('td.left img');
+            const rightImage =
+                element.$.diff.$.diffTable.querySelector('td.right img');
+
+            assert.isOk(leftImage);
+            assert.isNotOk(rightImage);
+            done();
+          });
+
+          element.$.restAPI.getDiffPreferences().then(prefs => {
+            element.prefs = prefs;
+            element.reload();
+          });
+        });
+
+        test('does not render disallowed image type', done => {
+          const mockDiff = {
+            meta_a: {name: 'carrot.jpg', content_type: 'image/jpeg-evil',
+              lines: 560},
+            intraline_status: 'OK',
+            change_type: 'DELETED',
+            diff_header: [
+              'diff --git a/carrot.jpg b/carrot.jpg',
+              'index f9c2f2c..0000000 100644',
+              '--- a/carrot.jpg',
+              '+++ /dev/null',
+              'Binary files differ',
+            ],
+            content: [{skip: 66}],
+            binary: true,
+          };
+          mockFile1.type = 'image/jpeg-evil';
+
+          sandbox.stub(element.$.restAPI, 'getDiff')
+              .returns(Promise.resolve(mockDiff));
+
+          element.addEventListener('render', () => {
+            // Recognizes that it should be an image diff.
+            assert.isTrue(element.isImageDiff);
+            assert.instanceOf(
+                element.$.diff.$.diffBuilder._builder, GrDiffBuilderImage);
+            const leftImage =
+                element.$.diff.$.diffTable.querySelector('td.left img');
+            assert.isNotOk(leftImage);
+            done();
+          });
+
+          element.$.restAPI.getDiffPreferences().then(prefs => {
+            element.prefs = prefs;
+            element.reload();
+          });
+        });
+      });
+    });
+
+    test('delegates cancel()', () => {
+      const stub = sandbox.stub(element.$.diff, 'cancel');
+      element.reload();
+      assert.isTrue(stub.calledOnce);
+      assert.equal(stub.lastCall.args.length, 0);
+    });
+
+    test('delegates getCursorStops()', () => {
+      const returnValue = [document.createElement('b')];
+      const stub = sandbox.stub(element.$.diff, 'getCursorStops')
+          .returns(returnValue);
+      assert.equal(element.getCursorStops(), returnValue);
+      assert.isTrue(stub.calledOnce);
+      assert.equal(stub.lastCall.args.length, 0);
+    });
+
+    test('delegates isRangeSelected()', () => {
+      const returnValue = true;
+      const stub = sandbox.stub(element.$.diff, 'isRangeSelected')
+          .returns(returnValue);
+      assert.equal(element.isRangeSelected(), returnValue);
+      assert.isTrue(stub.calledOnce);
+      assert.equal(stub.lastCall.args.length, 0);
+    });
+
+    test('delegates toggleLeftDiff()', () => {
+      const stub = sandbox.stub(element.$.diff, 'toggleLeftDiff');
+      element.toggleLeftDiff();
+      assert.isTrue(stub.calledOnce);
+      assert.equal(stub.lastCall.args.length, 0);
+    });
+
+    suite('blame', () => {
+      setup(() => {
+        element = fixture('basic');
+      });
+
+      test('clearBlame', () => {
+        element._blame = [];
+        const setBlameSpy = sandbox.spy(element.$.diff.$.diffBuilder, 'setBlame');
+        element.clearBlame();
+        assert.isNull(element._blame);
+        assert.isTrue(setBlameSpy.calledWithExactly(null));
+        assert.equal(element.isBlameLoaded, false);
+      });
+
+      test('loadBlame', () => {
+        const mockBlame = [{id: 'commit id', ranges: [{start: 1, end: 2}]}];
+        const showAlertStub = sinon.stub();
+        element.addEventListener('show-alert', showAlertStub);
+        const getBlameStub = sandbox.stub(element.$.restAPI, 'getBlame')
+            .returns(Promise.resolve(mockBlame));
+        element.changeNum = 42;
+        element.patchRange = {patchNum: 5, basePatchNum: 4};
+        element.path = 'foo/bar.baz';
+        return element.loadBlame().then(() => {
+          assert.isTrue(getBlameStub.calledWithExactly(
+              42, 5, 'foo/bar.baz', true));
+          assert.isFalse(showAlertStub.called);
+          assert.equal(element._blame, mockBlame);
+          assert.equal(element.isBlameLoaded, true);
+        });
+      });
+
+      test('loadBlame empty', () => {
+        const mockBlame = [];
+        const showAlertStub = sinon.stub();
+        element.addEventListener('show-alert', showAlertStub);
+        sandbox.stub(element.$.restAPI, 'getBlame')
+            .returns(Promise.resolve(mockBlame));
+        element.changeNum = 42;
+        element.patchRange = {patchNum: 5, basePatchNum: 4};
+        element.path = 'foo/bar.baz';
+        return element.loadBlame()
+            .then(() => {
+              assert.isTrue(false, 'Promise should not resolve');
+            })
+            .catch(() => {
+              assert.isTrue(showAlertStub.calledOnce);
+              assert.isNull(element._blame);
+              assert.equal(element.isBlameLoaded, false);
+            });
+      });
+    });
+
+    test('delegates getThreadEls()', () => {
+      const returnValue = [document.createElement('b')];
+      const stub = sandbox.stub(element.$.diff, 'getThreadEls')
+          .returns(returnValue);
+      assert.equal(element.getThreadEls(), returnValue);
+      assert.isTrue(stub.calledOnce);
+      assert.equal(stub.lastCall.args.length, 0);
+    });
+
+    test('delegates addDraftAtLine(el)', () => {
+      const param0 = document.createElement('b');
+      const stub = sandbox.stub(element.$.diff, 'addDraftAtLine');
+      element.addDraftAtLine(param0);
+      assert.isTrue(stub.calledOnce);
+      assert.equal(stub.lastCall.args.length, 1);
+      assert.equal(stub.lastCall.args[0], param0);
+    });
+
+    test('delegates clearDiffContent()', () => {
+      const stub = sandbox.stub(element.$.diff, 'clearDiffContent');
+      element.clearDiffContent();
+      assert.isTrue(stub.calledOnce);
+      assert.equal(stub.lastCall.args.length, 0);
+    });
+
+    test('delegates expandAllContext()', () => {
+      const stub = sandbox.stub(element.$.diff, 'expandAllContext');
+      element.expandAllContext();
+      assert.isTrue(stub.calledOnce);
+      assert.equal(stub.lastCall.args.length, 0);
+    });
+
+    test('passes in changeNum', () => {
+      const value = '12345';
+      element.changeNum = value;
+      assert.equal(element.$.diff.changeNum, value);
+    });
+
+    test('passes in noAutoRender', () => {
+      const value = true;
+      element.noAutoRender = value;
+      assert.equal(element.$.diff.noAutoRender, value);
+    });
+
+    test('passes in patchRange', () => {
+      const value = {patchNum: 'foo', basePatchNum: 'bar'};
+      element.patchRange = value;
+      assert.equal(element.$.diff.patchRange, value);
+    });
+
+    test('passes in path', () => {
+      const value = 'some/file/path';
+      element.path = value;
+      assert.equal(element.$.diff.path, value);
+    });
+
+    test('passes in prefs', () => {
+      const value = {};
+      element.prefs = value;
+      assert.equal(element.$.diff.prefs, value);
+    });
+
+    test('passes in projectConfig', () => {
+      const value = {};
+      element.projectConfig = value;
+      assert.equal(element.$.diff.projectConfig, value);
+    });
+
+    test('passes in changeNum', () => {
+      const value = '12345';
+      element.changeNum = value;
+      assert.equal(element.$.diff.changeNum, value);
+    });
+
+    test('passes in projectName', () => {
+      const value = 'Gerrit';
+      element.projectName = value;
+      assert.equal(element.$.diff.projectName, value);
+    });
+
+    test('passes in displayLine', () => {
+      const value = true;
+      element.displayLine = value;
+      assert.equal(element.$.diff.displayLine, value);
+    });
+
+    test('passes in commitRange', () => {
+      const value = {};
+      element.commitRange = value;
+      assert.equal(element.$.diff.commitRange, value);
+    });
+
+    test('passes in hidden', () => {
+      const value = true;
+      element.hidden = value;
+      assert.equal(element.$.diff.hidden, value);
+      assert.isNotNull(element.getAttribute('hidden'));
+    });
+
+    test('passes in noRenderOnPrefsChange', () => {
+      const value = true;
+      element.noRenderOnPrefsChange = value;
+      assert.equal(element.$.diff.noRenderOnPrefsChange, value);
+    });
+
+    test('passes in comments', () => {
+      const value = {left: [], right: []};
+      element.comments = value;
+      assert.equal(element.$.diff.comments, value);
+    });
+
+    test('passes in lineWrapping', () => {
+      const value = true;
+      element.lineWrapping = value;
+      assert.equal(element.$.diff.lineWrapping, value);
+    });
+
+    test('passes in viewMode', () => {
+      const value = 'SIDE_BY_SIDE';
+      element.viewMode = value;
+      assert.equal(element.$.diff.viewMode, value);
+    });
+
+    test('passes in lineOfInterest', () => {
+      const value = {number: 123, leftSide: true};
+      element.lineOfInterest = value;
+      assert.equal(element.$.diff.lineOfInterest, value);
+    });
+
+    suite('_reportDiff', () => {
+      let reportStub;
+
+      setup(() => {
+        element = fixture('basic');
+        element.patchRange = {basePatchNum: 1};
+        reportStub = sandbox.stub(element.$.reporting, 'reportInteraction');
+      });
+
+      test('null and content-less', () => {
+        element._reportDiff(null);
+        assert.isFalse(reportStub.called);
+
+        element._reportDiff({});
+        assert.isFalse(reportStub.called);
+      });
+
+      test('diff w/ no delta', () => {
+        const diff = {
+          content: [
+            {ab: ['foo', 'bar']},
+            {ab: ['baz', 'foo']},
+          ],
+        };
+        element._reportDiff(diff);
+        assert.isTrue(reportStub.calledOnce);
+        assert.equal(reportStub.lastCall.args[0], 'rebase-percent-zero');
+        assert.isUndefined(reportStub.lastCall.args[1]);
+      });
+
+      test('diff w/ no rebase delta', () => {
+        const diff = {
+          content: [
+            {ab: ['foo', 'bar']},
+            {a: ['baz', 'foo']},
+            {ab: ['foo', 'bar']},
+            {a: ['baz', 'foo'], b: ['bar', 'baz']},
+            {ab: ['foo', 'bar']},
+            {b: ['baz', 'foo']},
+            {ab: ['foo', 'bar']},
+          ],
+        };
+        element._reportDiff(diff);
+        assert.isTrue(reportStub.calledOnce);
+        assert.equal(reportStub.lastCall.args[0], 'rebase-percent-zero');
+        assert.isUndefined(reportStub.lastCall.args[1]);
+      });
+
+      test('diff w/ some rebase delta', () => {
+        const diff = {
+          content: [
+            {ab: ['foo', 'bar']},
+            {a: ['baz', 'foo'], due_to_rebase: true},
+            {ab: ['foo', 'bar']},
+            {a: ['baz', 'foo'], b: ['bar', 'baz']},
+            {ab: ['foo', 'bar']},
+            {b: ['baz', 'foo'], due_to_rebase: true},
+            {ab: ['foo', 'bar']},
+            {a: ['baz', 'foo']},
+          ],
+        };
+        element._reportDiff(diff);
+        assert.isTrue(reportStub.calledOnce);
+        assert.equal(reportStub.lastCall.args[0], 'rebase-percent-nonzero');
+        assert.strictEqual(reportStub.lastCall.args[1], 50);
+      });
+
+      test('diff w/ all rebase delta', () => {
+        const diff = {content: [{
+          a: ['foo', 'bar'],
+          b: ['baz', 'foo'],
+          due_to_rebase: true,
+        }]};
+        element._reportDiff(diff);
+        assert.isTrue(reportStub.calledOnce);
+        assert.equal(reportStub.lastCall.args[0], 'rebase-percent-nonzero');
+        assert.strictEqual(reportStub.lastCall.args[1], 100);
+      });
+
+      test('diff against parent event', () => {
+        element.patchRange.basePatchNum = 'PARENT';
+        const diff = {content: [{
+          a: ['foo', 'bar'],
+          b: ['baz', 'foo'],
+        }]};
+        element._reportDiff(diff);
+        assert.isTrue(reportStub.calledOnce);
+        assert.equal(reportStub.lastCall.args[0], 'diff-against-parent');
+        assert.isUndefined(reportStub.lastCall.args[1]);
+      });
+    });
+
+    suite('_translateChunksToIgnore', () => {
+      let content;
+
+      setup(() => {
+        content = [
+          {ab: ['one', 'two']},
+          {a: ['three'], b: ['different three']},
+          {b: ['four']},
+          {ab: ['five', 'six']},
+          {a: ['seven']},
+          {ab: ['eight', 'nine']},
+        ];
+      });
+
+      test('does nothing to unmarked diff', () => {
+        assert.deepEqual(element._translateChunksToIgnore({content}),
+            {content});
+      });
+
+      test('merges marked delta chunk', () => {
+        content[1].common = true;
+        assert.deepEqual(element._translateChunksToIgnore({content}), {
+          content: [
+            {ab: ['one', 'two', 'different three']},
+            {b: ['four']},
+            {ab: ['five', 'six']},
+            {a: ['seven']},
+            {ab: ['eight', 'nine']},
+          ],
+        });
+      });
+
+      test('merges marked addition chunk', () => {
+        content[2].common = true;
+        assert.deepEqual(element._translateChunksToIgnore({content}), {
+          content: [
+            {ab: ['one', 'two']},
+            {a: ['three'], b: ['different three']},
+            {ab: ['four', 'five', 'six']},
+            {a: ['seven']},
+            {ab: ['eight', 'nine']},
+          ],
+        });
+      });
+
+      test('merges multiple marked delta', () => {
+        content[1].common = true;
+        content[2].common = true;
+        assert.deepEqual(element._translateChunksToIgnore({content}), {
+          content: [
+            {ab: ['one', 'two', 'different three', 'four', 'five', 'six']},
+            {a: ['seven']},
+            {ab: ['eight', 'nine']},
+          ],
+        });
+      });
+
+      test('marked deletion chunks are omitted', () => {
+        content[4].common = true;
+        assert.deepEqual(element._translateChunksToIgnore({content}), {
+          content: [
+            {ab: ['one', 'two']},
+            {a: ['three'], b: ['different three']},
+            {b: ['four']},
+            {ab: ['five', 'six', 'eight', 'nine']},
+          ],
+        });
+      });
+
+      test('marked deltas can start shared chunks', () => {
+        content[0] = {a: ['one'], b: ['two'], common: true};
+        assert.deepEqual(element._translateChunksToIgnore({content}), {
+          content: [
+            {ab: ['two']},
+            {a: ['three'], b: ['different three']},
+            {b: ['four']},
+            {ab: ['five', 'six']},
+            {a: ['seven']},
+            {ab: ['eight', 'nine']},
+          ],
+        });
+      });
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-mode-selector/gr-diff-mode-selector.html b/polygerrit-ui/app/elements/diff/gr-diff-mode-selector/gr-diff-mode-selector.html
new file mode 100644
index 0000000..8251e53
--- /dev/null
+++ b/polygerrit-ui/app/elements/diff/gr-diff-mode-selector/gr-diff-mode-selector.html
@@ -0,0 +1,59 @@
+<!--
+@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="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../../shared/gr-button/gr-button.html">
+<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
+
+<dom-module id="gr-diff-mode-selector">
+  <template>
+    <style include="shared-styles">
+      :host {
+        /* Used to remove horizontal whitespace between the icons. */
+        display: flex;
+      }
+      gr-button.selected iron-icon {
+        color: var(--link-color);
+      }
+      iron-icon {
+        height: 1.3rem;
+        width: 1.3rem;
+      }
+    </style>
+    <gr-button
+        id="sideBySideBtn"
+        link
+        has-tooltip
+        class$="[[_computeSelectedClass(mode, _VIEW_MODES.SIDE_BY_SIDE)]]"
+        title="Side-by-side diff"
+        on-tap="_handleSideBySideTap">
+      <iron-icon icon="gr-icons:side-by-side"></iron-icon>
+    </gr-button>
+    <gr-button
+        id="unifiedBtn"
+        link
+        has-tooltip
+        title="Unified diff"
+        class$="[[_computeSelectedClass(mode, _VIEW_MODES.UNIFIED)]]"
+        on-tap="_handleUnifiedTap">
+      <iron-icon icon="gr-icons:unified"></iron-icon>
+    </gr-button>
+    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
+  </template>
+  <script src="gr-diff-mode-selector.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-mode-selector/gr-diff-mode-selector.js b/polygerrit-ui/app/elements/diff/gr-diff-mode-selector/gr-diff-mode-selector.js
new file mode 100644
index 0000000..88dd91a
--- /dev/null
+++ b/polygerrit-ui/app/elements/diff/gr-diff-mode-selector/gr-diff-mode-selector.js
@@ -0,0 +1,71 @@
+/**
+ * @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-diff-mode-selector',
+
+    properties: {
+      mode: {
+        type: String,
+        notify: true,
+      },
+
+      /**
+       * If set to true, the user's preference will be updated every time a
+       * button is tapped. Don't set to true if there is no user.
+       */
+      saveOnChange: {
+        type: Boolean,
+        value: false,
+      },
+
+      /** @type {?} */
+      _VIEW_MODES: {
+        type: Object,
+        readOnly: true,
+        value: {
+          SIDE_BY_SIDE: 'SIDE_BY_SIDE',
+          UNIFIED: 'UNIFIED_DIFF',
+        },
+      },
+    },
+
+    /**
+     * Set the mode. If save on change is enabled also update the preference.
+     */
+    setMode(newMode) {
+      if (this.saveOnChange && this.mode && this.mode !== newMode) {
+        this.$.restAPI.savePreferences({diff_view: newMode});
+      }
+      this.mode = newMode;
+    },
+
+    _computeSelectedClass(diffViewMode, buttonViewMode) {
+      return buttonViewMode === diffViewMode ? 'selected' : '';
+    },
+
+    _handleSideBySideTap() {
+      this.setMode(this._VIEW_MODES.SIDE_BY_SIDE);
+    },
+
+    _handleUnifiedTap() {
+      this.setMode(this._VIEW_MODES.UNIFIED);
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-mode-selector/gr-diff-mode-selector_test.html b/polygerrit-ui/app/elements/diff/gr-diff-mode-selector/gr-diff-mode-selector_test.html
new file mode 100644
index 0000000..c011106
--- /dev/null
+++ b/polygerrit-ui/app/elements/diff/gr-diff-mode-selector/gr-diff-mode-selector_test.html
@@ -0,0 +1,85 @@
+<!DOCTYPE html>
+<!--
+@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.
+-->
+
+<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+<title>gr-diff-mode-selector</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<script src="../../../bower_components/page/page.js"></script>
+<script src="../../../scripts/util.js"></script>
+
+<link rel="import" href="gr-diff-mode-selector.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-diff-mode-selector></gr-diff-mode-selector>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-diff-mode-selector tests', () => {
+    let element;
+    let sandbox;
+
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+      element = fixture('basic');
+    });
+
+    teardown(() => {
+      sandbox.restore();
+    });
+
+    test('_computeSelectedClass', () => {
+      assert.equal(
+          element._computeSelectedClass('SIDE_BY_SIDE', 'SIDE_BY_SIDE'),
+          'selected');
+      assert.equal(
+          element._computeSelectedClass('SIDE_BY_SIDE', 'UNIFIED_DIFF'), '');
+    });
+
+    test('setMode', () => {
+      const saveStub = sandbox.stub(element.$.restAPI, 'savePreferences');
+
+      // Setting the mode initially does not save prefs.
+      element.saveOnChange = true;
+      element.setMode('SIDE_BY_SIDE');
+      assert.isFalse(saveStub.called);
+
+      // Setting the mode to itself does not save prefs.
+      element.setMode('SIDE_BY_SIDE');
+      assert.isFalse(saveStub.called);
+
+      // Setting the mode to something else does not save prefs if saveOnChange
+      // is false.
+      element.saveOnChange = false;
+      element.setMode('UNIFIED_DIFF');
+      assert.isFalse(saveStub.called);
+
+      // Setting the mode to something else does not save prefs if saveOnChange
+      // is false.
+      element.saveOnChange = true;
+      element.setMode('SIDE_BY_SIDE');
+      assert.isTrue(saveStub.calledOnce);
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-preferences-dialog/gr-diff-preferences-dialog.html b/polygerrit-ui/app/elements/diff/gr-diff-preferences-dialog/gr-diff-preferences-dialog.html
new file mode 100644
index 0000000..ae53f76
--- /dev/null
+++ b/polygerrit-ui/app/elements/diff/gr-diff-preferences-dialog/gr-diff-preferences-dialog.html
@@ -0,0 +1,80 @@
+<!--
+@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="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../../shared/gr-button/gr-button.html">
+<link rel="import" href="../../shared/gr-diff-preferences/gr-diff-preferences.html">
+<link rel="import" href="../../shared/gr-overlay/gr-overlay.html">
+
+<dom-module id="gr-diff-preferences-dialog">
+  <template>
+    <style include="shared-styles">
+      .diffHeader,
+      .diffActions {
+        padding: 1em 1.5em;
+      }
+      .diffHeader,
+      .diffActions {
+        background-color: var(--dialog-background-color);
+      }
+      .diffHeader {
+        border-bottom: 1px solid var(--border-color);
+        font-weight: var(--font-weight-bold);
+      }
+      .diffActions {
+        border-top: 1px solid var(--border-color);
+        display: flex;
+        justify-content: flex-end;
+      }
+      .diffPrefsOverlay gr-button {
+        margin-left: 1em;
+      }
+      div.edited:after {
+        color: var(--deemphasized-text-color);
+        content: ' *';
+      }
+      #diffPreferences {
+        display: flex;
+        padding: .35em 1.5em;
+      }
+    </style>
+    <gr-overlay id="diffPrefsOverlay" with-backdrop>
+      <div class$="diffHeader [[_computeHeaderClass(_diffPrefsChanged)]]">Diff Preferences</div>
+      <gr-diff-preferences
+          id="diffPreferences"
+          diff-prefs="{{diffPrefs}}"
+          has-unsaved-changes="{{_diffPrefsChanged}}"></gr-diff-preferences>
+      <div class="diffActions">
+        <gr-button
+            id="cancelButton"
+            link
+            on-tap="_handleCancelDiff">
+            Cancel
+        </gr-button>
+        <gr-button
+            id="saveButton"
+            link primary
+            on-tap="_handleSaveDiffPreferences"
+            disabled$="[[!_diffPrefsChanged]]">
+            Save
+        </gr-button>
+      </div>
+    </gr-overlay>
+  </template>
+  <script src="gr-diff-preferences-dialog.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-preferences-dialog/gr-diff-preferences-dialog.js b/polygerrit-ui/app/elements/diff/gr-diff-preferences-dialog/gr-diff-preferences-dialog.js
new file mode 100644
index 0000000..b50ef69
--- /dev/null
+++ b/polygerrit-ui/app/elements/diff/gr-diff-preferences-dialog/gr-diff-preferences-dialog.js
@@ -0,0 +1,66 @@
+/**
+ * @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';
+
+  Polymer({
+    is: 'gr-diff-preferences-dialog',
+
+    properties: {
+      /** @type {?} */
+      diffPrefs: Object,
+
+      _diffPrefsChanged: Boolean,
+    },
+
+    getFocusStops() {
+      return {
+        start: this.$.contextSelect,
+        end: this.$.saveButton,
+      };
+    },
+
+    resetFocus() {
+      this.$.contextSelect.focus();
+    },
+
+    _computeHeaderClass(changed) {
+      return changed ? 'edited' : '';
+    },
+
+    _handleCancelDiff(e) {
+      e.stopPropagation();
+      this.$.diffPrefsOverlay.close();
+    },
+
+    open() {
+      this.$.diffPrefsOverlay.open().then(() => {
+        const focusStops = this.getFocusStops();
+        this.$.diffPrefsOverlay.setFocusStops(focusStops);
+        this.resetFocus();
+      });
+    },
+
+    _handleSaveDiffPreferences() {
+      this.$.diffPreferences.save().then(() => {
+        this.fire('reload-diff-preference', null, {bubbles: false});
+
+        this.$.diffPrefsOverlay.close();
+      });
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-preferences/gr-diff-preferences.html b/polygerrit-ui/app/elements/diff/gr-diff-preferences/gr-diff-preferences.html
deleted file mode 100644
index 7e6d54d..0000000
--- a/polygerrit-ui/app/elements/diff/gr-diff-preferences/gr-diff-preferences.html
+++ /dev/null
@@ -1,156 +0,0 @@
-<!--
-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.
--->
-
-<link rel="import" href="../../../bower_components/polymer/polymer.html">
-<link rel="import" href="../../../bower_components/iron-input/iron-input.html">
-<link rel="import" href="../../shared/gr-button/gr-button.html">
-<link rel="import" href="../../shared/gr-overlay/gr-overlay.html">
-<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
-<link rel="import" href="../../shared/gr-storage/gr-storage.html">
-<link rel="import" href="../../../styles/shared-styles.html">
-
-<dom-module id="gr-diff-preferences">
-  <template>
-    <style include="shared-styles">
-      :host {
-        display: block;
-      }
-      :host([disabled]) {
-        opacity: .5;
-        pointer-events: none;
-      }
-      input,
-      select {
-        font: inherit;
-      }
-      input[type="number"] {
-        width: 4em;
-      }
-      .header,
-      .actions {
-        padding: 1em 1.5em;
-      }
-      .header {
-        border-bottom: 1px solid #ddd;
-        font-family: var(--font-family-bold);
-      }
-      .mainContainer {
-        padding: 1em 0;
-      }
-      .pref {
-        align-items: center;
-        display: flex;
-        padding: .35em 1.5em;
-        width: 20em;
-      }
-      .pref:hover {
-        background-color: #ebf5fb;
-      }
-      .pref label {
-        cursor: pointer;
-        flex: 1;
-      }
-      .actions {
-        border-top: 1px solid #ddd;
-        display: flex;
-        justify-content: flex-end;
-      }
-      .beta {
-        font-family: var(--font-family-bold);
-        color: #888;
-      }
-      gr-button {
-        margin-left: 1em;
-      }
-    </style>
-
-    <gr-overlay id="prefsOverlay" with-backdrop>
-      <div class="header">
-        Diff View Preferences
-      </div>
-      <div class="mainContainer">
-        <div class="pref">
-          <label for="contextSelect">Context</label>
-          <select id="contextSelect" on-change="_handleContextSelectChange">
-            <option value="3">3 lines</option>
-            <option value="10">10 lines</option>
-            <option value="25">25 lines</option>
-            <option value="50">50 lines</option>
-            <option value="75">75 lines</option>
-            <option value="100">100 lines</option>
-            <option value="-1">Whole file</option>
-          </select>
-        </div>
-        <div class="pref">
-          <label for="lineWrappingInput">Fit to screen</label>
-          <input
-              is="iron-input"
-              type="checkbox"
-              id="lineWrappingInput"
-              on-tap="_handlelineWrappingTap">
-        </div>
-        <div class="pref" id="columnsPref"
-            hidden$="[[_newPrefs.line_wrapping]]">
-          <label for="columnsInput">Diff width</label>
-          <input is="iron-input" type="number" id="columnsInput"
-              prevent-invalid-input
-              allowed-pattern="[0-9]"
-              bind-value="{{_newPrefs.line_length}}">
-        </div>
-        <div class="pref">
-          <label for="tabSizeInput">Tab width</label>
-          <input is="iron-input" type="number" id="tabSizeInput"
-              prevent-invalid-input
-              allowed-pattern="[0-9]"
-              bind-value="{{_newPrefs.tab_size}}">
-        </div>
-        <div class="pref" hidden$="[[!_newPrefs.font_size]]">
-          <label for="fontSizeInput">Font size</label>
-          <input is="iron-input" type="number" id="fontSizeInput"
-                prevent-invalid-input
-                allowed-pattern="[0-9]"
-                bind-value="{{_newPrefs.font_size}}">
-        </div>
-        <div class="pref">
-          <label for="showTabsInput">Show tabs</label>
-          <input is="iron-input" type="checkbox" id="showTabsInput"
-              on-tap="_handleShowTabsTap">
-        </div>
-        <div class="pref">
-          <label for="showTrailingWhitespaceInput">
-            Show trailing whitespace</label>
-          <input is="iron-input" type="checkbox"
-              id="showTrailingWhitespaceInput"
-              on-tap="_handleShowTrailingWhitespaceTap">
-        </div>
-        <div class="pref">
-          <label for="syntaxHighlightInput">Syntax highlighting</label>
-          <input is="iron-input" type="checkbox" id="syntaxHighlightInput"
-              on-tap="_handleSyntaxHighlightTap">
-        </div>
-      </div>
-      <div class="actions">
-        <gr-button id="cancelButton" link on-tap="_handleCancel">
-            Cancel</gr-button>
-        <gr-button id="saveButton" link primary on-tap="_handleSave">
-            Save</gr-button>
-      </div>
-    </overlay>
-    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
-    <gr-storage id="storage"></gr-storage>
-  </template>
-  <script src="gr-diff-preferences.js"></script>
-</dom-module>
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-preferences/gr-diff-preferences.js b/polygerrit-ui/app/elements/diff/gr-diff-preferences/gr-diff-preferences.js
deleted file mode 100644
index f5944c3..0000000
--- a/polygerrit-ui/app/elements/diff/gr-diff-preferences/gr-diff-preferences.js
+++ /dev/null
@@ -1,135 +0,0 @@
-// 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.
-(function() {
-  'use strict';
-
-  Polymer({
-    is: 'gr-diff-preferences',
-
-    properties: {
-      prefs: {
-        type: Object,
-        notify: true,
-      },
-      localPrefs: {
-        type: Object,
-        notify: true,
-      },
-      disabled: {
-        type: Boolean,
-        value: false,
-        reflectToAttribute: true,
-      },
-
-      /** @type {?} */
-      _newPrefs: Object,
-      _newLocalPrefs: Object,
-    },
-
-    observers: [
-      '_prefsChanged(prefs.*)',
-      '_localPrefsChanged(localPrefs.*)',
-    ],
-
-    getFocusStops() {
-      return {
-        start: this.$.contextSelect,
-        end: this.$.cancelButton,
-      };
-    },
-
-    resetFocus() {
-      this.$.contextSelect.focus();
-    },
-
-    _prefsChanged(changeRecord) {
-      const prefs = changeRecord.base;
-      // NOTE: Object.assign is NOT automatically a deep copy. If prefs adds
-      // an object as a value, it must be marked enumerable.
-      this._newPrefs = Object.assign({}, prefs);
-      this.$.contextSelect.value = prefs.context;
-      this.$.showTabsInput.checked = prefs.show_tabs;
-      this.$.showTrailingWhitespaceInput.checked = prefs.show_whitespace_errors;
-      this.$.lineWrappingInput.checked = prefs.line_wrapping;
-      this.$.syntaxHighlightInput.checked = prefs.syntax_highlighting;
-    },
-
-    _localPrefsChanged(changeRecord) {
-      const localPrefs = changeRecord.base || {};
-      this._newLocalPrefs = Object.assign({}, localPrefs);
-    },
-
-    _handleContextSelectChange(e) {
-      const selectEl = Polymer.dom(e).rootTarget;
-      this.set('_newPrefs.context', parseInt(selectEl.value, 10));
-    },
-
-    _handleShowTabsTap(e) {
-      this.set('_newPrefs.show_tabs', Polymer.dom(e).rootTarget.checked);
-    },
-
-    _handleShowTrailingWhitespaceTap(e) {
-      this.set('_newPrefs.show_whitespace_errors',
-          Polymer.dom(e).rootTarget.checked);
-    },
-
-    _handleSyntaxHighlightTap(e) {
-      this.set('_newPrefs.syntax_highlighting',
-          Polymer.dom(e).rootTarget.checked);
-    },
-
-    _handlelineWrappingTap(e) {
-      this.set('_newPrefs.line_wrapping', Polymer.dom(e).rootTarget.checked);
-    },
-
-    _handleSave(e) {
-      e.stopPropagation();
-      this.prefs = this._newPrefs;
-      this.localPrefs = this._newLocalPrefs;
-      const el = Polymer.dom(e).rootTarget;
-      el.disabled = true;
-      this.$.storage.savePreferences(this._localPrefs);
-      this._saveDiffPreferences().then(response => {
-        el.disabled = false;
-        if (!response.ok) { return response; }
-
-        this.$.prefsOverlay.close();
-      }).catch(err => {
-        el.disabled = false;
-      });
-    },
-
-    _handleCancel(e) {
-      e.stopPropagation();
-      this.$.prefsOverlay.close();
-    },
-
-    _handlePrefsTap(e) {
-      e.preventDefault();
-      this._openPrefs();
-    },
-
-    open() {
-      this.$.prefsOverlay.open().then(() => {
-        const focusStops = this.getFocusStops();
-        this.$.prefsOverlay.setFocusStops(focusStops);
-        this.resetFocus();
-      });
-    },
-
-    _saveDiffPreferences() {
-      return this.$.restAPI.saveDiffPreferences(this.prefs);
-    },
-  });
-})();
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-preferences/gr-diff-preferences_test.html b/polygerrit-ui/app/elements/diff/gr-diff-preferences/gr-diff-preferences_test.html
deleted file mode 100644
index f06cd3a..0000000
--- a/polygerrit-ui/app/elements/diff/gr-diff-preferences/gr-diff-preferences_test.html
+++ /dev/null
@@ -1,121 +0,0 @@
-<!DOCTYPE html>
-<!--
-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-diff-preferences</title>
-
-<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
-<script src="../../../bower_components/web-component-tester/browser.js"></script>
-<link rel="import" href="../../../test/common-test-setup.html"/>
-<link rel="import" href="gr-diff-preferences.html">
-
-<script>void(0);</script>
-
-<test-fixture id="basic">
-  <template>
-    <gr-diff-preferences></gr-diff-preferences>
-  </template>
-</test-fixture>
-
-<script>
-  suite('gr-diff-preferences tests', () => {
-    let element;
-    let sandbox;
-
-    setup(() => {
-      sandbox = sinon.sandbox.create();
-      element = fixture('basic');
-    });
-
-    teardown(() => {
-      sandbox.restore();
-    });
-
-    test('model changes', () => {
-      element.prefs = {
-        context: 10,
-        font_size: 12,
-        line_length: 100,
-        show_tabs: true,
-        tab_size: 8,
-        show_whitespace_errors: true,
-        syntax_highlighting: true,
-      };
-      assert.deepEqual(element.prefs, element._newPrefs);
-
-      element.$.contextSelect.value = '50';
-      element.fire('change', {}, {node: element.$.contextSelect});
-      element.$.columnsInput.bindValue = 80;
-      element.$.fontSizeInput.bindValue = 10;
-      element.$.tabSizeInput.bindValue = 4;
-      MockInteractions.tap(element.$.showTabsInput);
-      MockInteractions.tap(element.$.showTrailingWhitespaceInput);
-      MockInteractions.tap(element.$.syntaxHighlightInput);
-      MockInteractions.tap(element.$.lineWrappingInput);
-
-      assert.equal(element._newPrefs.context, 50);
-      assert.equal(element._newPrefs.font_size, 10);
-      assert.equal(element._newPrefs.line_length, 80);
-      assert.equal(element._newPrefs.tab_size, 4);
-      assert.isFalse(element._newPrefs.show_tabs);
-      assert.isFalse(element._newPrefs.show_whitespace_errors);
-      assert.isTrue(element._newPrefs.line_wrapping);
-      assert.isFalse(element._newPrefs.syntax_highlighting);
-    });
-
-    test('clicking fit to screen hides line length input', () => {
-      element.prefs = {line_wrapping: false};
-
-      assert.isFalse(element.$.columnsPref.hidden);
-
-      MockInteractions.tap(element.$.lineWrappingInput);
-      assert.isTrue(element.$.columnsPref.hidden);
-
-      MockInteractions.tap(element.$.lineWrappingInput);
-      assert.isFalse(element.$.columnsPref.hidden);
-    });
-
-    test('clicking save button calls _handleSave function', () => {
-      const savePrefs = sinon.stub(element, '_handleSave');
-      MockInteractions.tap(element.$.saveButton);
-      flushAsynchronousOperations();
-      assert(savePrefs.calledOnce);
-      savePrefs.restore();
-    });
-
-    test('save button', () => {
-      element.prefs = {
-        font_size: '11',
-      };
-      element._newPrefs = {
-        font_size: '12',
-      };
-      const saveStub = sandbox.stub(element.$.restAPI, 'saveDiffPreferences',
-          () => { return Promise.resolve(); });
-
-      MockInteractions.tap(element.$$('gr-button[primary]'));
-      assert.deepEqual(element.prefs, element._newPrefs);
-      assert.deepEqual(saveStub.lastCall.args[0], element._newPrefs);
-    });
-
-    test('cancel button', () => {
-      const closeStub = sandbox.stub(element.$.prefsOverlay, 'close');
-      MockInteractions.tap(element.$$('gr-button:not([primary])'));
-      assert.isTrue(closeStub.called);
-    });
-  });
-</script>
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-processor/gr-diff-processor.html b/polygerrit-ui/app/elements/diff/gr-diff-processor/gr-diff-processor.html
index cae8bad..baa8bba 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-processor/gr-diff-processor.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-processor/gr-diff-processor.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-processor/gr-diff-processor.js b/polygerrit-ui/app/elements/diff/gr-diff-processor/gr-diff-processor.js
index bca6bea..dead8d7 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-processor/gr-diff-processor.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff-processor/gr-diff-processor.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -104,12 +107,13 @@
      * @return {Promise} A promise that resolves when the diff is completely
      *     processed.
      */
-    process(content, isImageDiff) {
+    process(content, isBinary) {
       this.groups = [];
       this.push('groups', this._makeFileComments());
 
-      // If image diff, only render the file lines.
-      if (isImageDiff) { return Promise.resolve(); }
+      // If it's a binary diff, we won't be rendering hunks of text differences
+      // so finish processing.
+      if (isBinary) { return Promise.resolve(); }
 
       return new Promise(resolve => {
         const state = {
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-processor/gr-diff-processor_test.html b/polygerrit-ui/app/elements/diff/gr-diff-processor/gr-diff-processor_test.html
index fcb8aec..7ccd9f8 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-processor/gr-diff-processor_test.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-processor/gr-diff-processor_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-selection/gr-diff-selection.html b/polygerrit-ui/app/elements/diff/gr-diff-selection/gr-diff-selection.html
index 6699979..f9822f2 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-selection/gr-diff-selection.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-selection/gr-diff-selection.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,6 +15,7 @@
 limitations under the License.
 -->
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../../behaviors/dom-util-behavior/dom-util-behavior.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 
 <dom-module id="gr-diff-selection">
@@ -43,7 +45,7 @@
       }
     </style>
     <div class="contentWrapper">
-      <content></content>
+      <slot></slot>
     </div>
   </template>
   <script src="../gr-diff-highlight/gr-range-normalizer.js"></script>
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-selection/gr-diff-selection.js b/polygerrit-ui/app/elements/diff/gr-diff-selection/gr-diff-selection.js
index f00557e..27e467d 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-selection/gr-diff-selection.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff-selection/gr-diff-selection.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -49,6 +52,10 @@
       down: '_handleDown',
     },
 
+    behaviors: [
+      Gerrit.DomUtilBehavior,
+    ],
+
     attached() {
       this.classList.add(SelectionClass.RIGHT);
     },
@@ -127,14 +134,8 @@
      * @return {boolean}
      */
     _elementDescendedFromClass(element, className) {
-      while (!element.classList.contains(className)) {
-        if (!element.parentElement ||
-            element === this.diffBuilder.diffElement) {
-          return false;
-        }
-        element = element.parentElement;
-      }
-      return true;
+      return this.descendedFromClass(element, className,
+          this.diffBuilder.diffElement);
     },
 
     _handleCopy(e) {
@@ -178,8 +179,19 @@
       const startLineEl =
           this.diffBuilder.getLineElByChild(range.startContainer);
       const endLineEl = this.diffBuilder.getLineElByChild(range.endContainer);
+      // Happens when triple click in side-by-side mode with other side empty.
+      const endsAtOtherEmptySide = !endLineEl &&
+          range.endOffset === 0 &&
+          range.endContainer.nodeName === 'TD' &&
+          (range.endContainer.classList.contains('left') ||
+           range.endContainer.classList.contains('right'));
       const startLineNum = parseInt(startLineEl.getAttribute('data-value'), 10);
-      const endLineNum = parseInt(endLineEl.getAttribute('data-value'), 10);
+      let endLineNum;
+      if (endsAtOtherEmptySide) {
+        endLineNum = startLineNum + 1;
+      } else if (endLineEl) {
+        endLineNum = parseInt(endLineEl.getAttribute('data-value'), 10);
+      }
 
       return this._getRangeFromDiff(startLineNum, range.startOffset, endLineNum,
           range.endOffset, side);
@@ -190,7 +202,8 @@
      *
      * @param {number} startLineNum
      * @param {number} startOffset
-     * @param {number} endLineNum
+     * @param {number|undefined} endLineNum Use undefined to get the range
+     *     extending to the end of the file.
      * @param {number} endOffset
      * @param {!string} side The side that is currently selected.
      * @return {string} The selected diff text.
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-selection/gr-diff-selection_test.html b/polygerrit-ui/app/elements/diff/gr-diff-selection/gr-diff-selection_test.html
index a14d155..f34429b8 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-selection/gr-diff-selection_test.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-selection/gr-diff-selection_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -328,6 +329,27 @@
       assert.equal(element._getSelectedText('right'), ' other');
     });
 
+    test('copies to end of side (issue 7895)', () => {
+      element._cachedDiffBuilder.getLineElByChild = function(child) {
+        // Return null for the end container.
+        if (child.textContent === 'ga ga') { return null; }
+        while (!child.classList.contains('content') && child.parentElement) {
+          child = child.parentElement;
+        }
+        return child.previousElementSibling;
+      };
+      element.classList.add('selected-left');
+      element.classList.remove('selected-right');
+      const selection = window.getSelection();
+      selection.removeAllRanges();
+      const range = document.createRange();
+      range.setStart(element.querySelector('div.contentText').firstChild, 3);
+      range.setEnd(
+          element.querySelectorAll('div.contentText')[4].firstChild, 2);
+      selection.addRange(range);
+      assert.equal(element._getSelectedText('left'), 'ba\nzin\nga');
+    });
+
     suite('_getTextContentForRange', () => {
       let selection;
       let range;
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.html b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.html
index a080396..06658da 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -20,17 +21,23 @@
 <link rel="import" href="../../../behaviors/keyboard-shortcut-behavior/keyboard-shortcut-behavior.html">
 <link rel="import" href="../../../behaviors/rest-client-behavior/rest-client-behavior.html">
 <link rel="import" href="../../../bower_components/iron-dropdown/iron-dropdown.html">
+<link rel="import" href="../../../styles/shared-styles.html">
 <link rel="import" href="../../core/gr-navigation/gr-navigation.html">
+<link rel="import" href="../../core/gr-reporting/gr-reporting.html">
 <link rel="import" href="../../shared/gr-button/gr-button.html">
+<link rel="import" href="../../shared/gr-count-string-formatter/gr-count-string-formatter.html">
+<link rel="import" href="../../shared/gr-dropdown-list/gr-dropdown-list.html">
 <link rel="import" href="../../shared/gr-fixed-panel/gr-fixed-panel.html">
+<link rel="import" href="../../shared/gr-icons/gr-icons.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
 <link rel="import" href="../../shared/gr-select/gr-select.html">
+<link rel="import" href="../../shared/revision-info/revision-info.html">
 <link rel="import" href="../gr-comment-api/gr-comment-api.html">
 <link rel="import" href="../gr-diff-cursor/gr-diff-cursor.html">
-<link rel="import" href="../gr-diff-preferences/gr-diff-preferences.html">
-<link rel="import" href="../gr-diff/gr-diff.html">
+<link rel="import" href="../gr-diff-host/gr-diff-host.html">
+<link rel="import" href="../gr-diff-mode-selector/gr-diff-mode-selector.html">
+<link rel="import" href="../gr-diff-preferences-dialog/gr-diff-preferences-dialog.html">
 <link rel="import" href="../gr-patch-range-select/gr-patch-range-select.html">
-<link rel="import" href="../../../styles/shared-styles.html">
 
 <dom-module id="gr-diff-view">
   <template>
@@ -38,15 +45,21 @@
       :host {
         background-color: var(--view-background-color);
       }
+      .hidden {
+        display: none;
+      }
       gr-patch-range-select {
         display: block;
       }
       gr-diff {
         border: none;
+        --diff-container-styles: {
+          border-bottom: 1px solid var(--border-color);
+        }
       }
       gr-fixed-panel {
-        background-color: #fff;
-        border-bottom: 1px #eee solid;
+        background-color: var(--view-background-color);
+        border-bottom: 1px solid var(--border-color);
         z-index: 1;
       }
       header,
@@ -64,11 +77,16 @@
       }
       .navLink:not([href]),
       .downloadLink:not([href]) {
-        color: #999;
+        color: var(--deemphasized-text-color);
       }
       .navLinks {
+        align-items: center;
+        display: flex;
         white-space: nowrap;
       }
+      .navLink {
+        padding: 0 .25em;
+      }
       .reviewed {
         display: inline-block;
         margin: 0 .25em;
@@ -80,52 +98,13 @@
       .mobile {
         display: none;
       }
-      .dropdown-trigger {
-        cursor: pointer;
-        padding: 0;
-      }
-      iron-dropdown {
-        position: absolute;
-      }
-      .dropdown-content {
-        background-color: #fff;
-        box-shadow: 0 1px 5px rgba(0, 0, 0, .3);
-        max-height: 70vh;
-      }
-      .dropdown-content a {
-        cursor: pointer;
-        display: block;
-        font-weight: normal;
-        padding: .3em .5em;
-      }
-      .dropdown-content a:before {
-        color: #ccc;
-        content: attr(data-key-nav);
-        display: inline-block;
-        margin-right: .5em;
-        width: .3em;
-      }
-      .dropdown-content a:hover {
-        background-color: var(--color-link);
-        color: #fff;
-      }
-      .dropdown-content a[selected] {
-        color: #000;
-        font-family: var(--font-family-bold);
-        pointer-events: none;
-        text-decoration: none;
-      }
-      .dropdown-content a[selected]:hover {
-        background-color: #fff;
-        color: #000;
-      }
       gr-button {
         padding: .3em 0;
         text-decoration: none;
       }
       .loading {
-        color: #777;
-        font-size: 2em;
+        color: var(--deemphasized-text-color);
+        font-size: 2rem;
         height: 100%;
         padding: 1em var(--default-horizontal-margin);
         text-align: center;
@@ -140,30 +119,41 @@
       .prefsButton {
         text-align: right;
       }
-      .separator {
-        margin: 0 .25em;
-      }
       .noOverflow {
         display: block;
         overflow: auto;
       }
-      #trigger {
-        --gr-button: {
-          -moz-user-select: text;
-          -ms-user-select: text;
-          -webkit-user-select: text;
-          user-select: text;
+      .editMode .hideOnEdit {
+        display: none;
+      }
+      .blameLoader,
+      .fileNum {
+        display: none;
+      }
+      .blameLoader.show,
+      .fileNum.show ,
+      .download,
+      .preferences,
+      .rightControls {
+        align-items: center;
+        display: flex;
+      }
+      .diffModeSelector {
+        align-items: center;
+        display: flex;
+      }
+      .diffModeSelector span {
+        margin-right: .2rem;
+      }
+      .diffModeSelector.hide,
+      .separator.hide {
+        display: none;
+      }
+      gr-dropdown-list {
+        --trigger-style: {
+          text-transform: none;
         }
       }
-      .editLoaded .hideOnEdit {
-        display: none;
-      }
-      .blameLoader {
-        display: none;
-      }
-      .blameLoader.show {
-        display: inline;
-      }
       @media screen and (max-width: 50em) {
         header {
           padding: .5em var(--default-horizontal-margin);
@@ -181,7 +171,6 @@
         }
         .fullFileName {
           display: block;
-          font-size: .9em;
           font-style: italic;
           min-width: 50%;
           padding: 0 .1em;
@@ -192,26 +181,33 @@
         .reviewed {
           vertical-align: -.1em;
         }
-        .mobileJumpToFileContainer {
-          display: block;
-          width: 100%;
-        }
-        .mobileJumpToFileContainer select {
-          width: 100%;
-        }
         .mobileNavLink {
-          color: #000;
-          font-size: 1.5em;
-          font-family: var(--font-family-bold);
+          color: var(--primary-text-color);
+          font-size: 1.5rem;
+          font-weight: var(--font-weight-bold);
           text-decoration: none;
         }
         .mobileNavLink:not([href]) {
-          color: #bbb;
+          color: var(--deemphasized-text-color);
+        }
+        .jumpToFileContainer {
+          display: block;
+          width: 100%;
+        }
+        gr-dropdown-list {
+          width: 100%;
+          --gr-select-style: {
+            display: block;
+            width: 100%;
+          }
+          --native-select-style: {
+            width: 100%;
+          }
         }
       }
     </style>
     <gr-fixed-panel
-        class$="[[_computeContainerClass(_editLoaded)]]"
+        class$="[[_computeContainerClass(_editMode)]]"
         floating-disabled="[[_panelFloatingDisabled]]"
         keep-on-scroll
         ready-for-measure="[[!_loading]]">
@@ -226,56 +222,29 @@
               type="checkbox"
               on-change="_handleReviewedChange"
               hidden$="[[!_loggedIn]]" hidden>
-          <div class="jumpToFileContainer desktop">
-            <gr-button
-                down-arrow
-                no-uppercase
-                link
-                class="dropdown-trigger"
-                id="trigger"
-                on-tap="_showDropdownTapHandler">
-              <span>[[computeDisplayPath(_path)]]</span>
-            </gr-button>
-            <!-- *-align="" to disable iron-dropdown's element positioning. -->
-            <iron-dropdown id="dropdown"
-                allow-outside-scroll
-                vertical-align=""
-                horizontal-align="">
-              <div class="dropdown-content" slot="dropdown-content">
-                <template
-                    is="dom-repeat"
-                    items="[[_fileList]]"
-                    as="path"
-                    initial-count="75">
-                  <a href$="[[_computeDiffURL(_change, _patchRange.*, path)]]"
-                    selected$="[[_computeFileSelected(path, _path)]]"
-                    data-key-nav$="[[_computeKeyNav(path, _path, _fileList)]]"
-                    on-tap="_handleFileTap">[[computeDisplayPath(path)]]</a>
-                </template>
-              </div>
-            </iron-dropdown>
-          </div>
-          <div class="mobileJumpToFileContainer mobile">
-            <select on-change="_handleMobileSelectChange">
-              <template is="dom-repeat" items="[[_fileList]]" as="path">
-                <option
-                    value$="[[path]]"
-                    selected$="[[_computeFileSelected(path, _path)]]">
-                  [[computeTruncatedPath(path)]]
-                </option>
-              </template>
-            </select>
+          <div class="jumpToFileContainer">
+            <gr-dropdown-list
+                id="dropdown"
+                value="[[_path]]"
+                on-value-change="_handleFileChange"
+                items="[[_formattedFiles]]"
+                initial-count="75">
+           </gr-dropdown-list>
           </div>
         </h3>
         <div class="navLinks desktop">
+          <span class$="fileNum [[_computeFileNumClass(_fileNum, _formattedFiles)]]">
+            File [[_fileNum]] of [[_formattedFiles.length]]
+            <span class="separator"></span>
+          </span>
           <a class="navLink"
               href$="[[_computeNavLinkURL(_change, _path, _fileList, -1, 1)]]">
             Prev</a>
-          /
+          <span class="separator"></span>
           <a class="navLink"
               href$="[[_computeChangePath(_change, _patchRange.*, _change.revisions)]]">
             Up</a>
-          /
+          <span class="separator"></span>
           <a class="navLink"
               href$="[[_computeNavLinkURL(_change, _path, _fileList, 1, 1)]]">
             Next</a>
@@ -286,50 +255,57 @@
           <gr-patch-range-select
               id="rangeSelect"
               change-num="[[_changeNum]]"
+              change-comments="[[_changeComments]]"
               patch-num="[[_patchRange.patchNum]]"
               base-patch-num="[[_patchRange.basePatchNum]]"
               files-weblinks="[[_filesWeblinks]]"
               available-patches="[[_allPatchSets]]"
               revisions="[[_change.revisions]]"
+              revision-info="[[_revisionInfo]]"
               on-patch-range-change="_handlePatchChange">
           </gr-patch-range-select>
           <span class="download desktop">
-            <span class="separator">/</span>
+            <span class="separator"></span>
             <a
               class="downloadLink"
               download
-              href$="[[_computeDownloadLink(_changeNum, _patchRange, _path)]]">
+              href$="[[_computeDownloadLink(_change.project, _changeNum, _patchRange, _path)]]">
               Download
             </a>
           </span>
         </div>
-        <div>
-          <gr-select
-              id="modeSelect"
-              bind-value="{{changeViewState.diffMode}}"
-              hidden$="[[_computeModeSelectHidden(_isImageDiff)]]">
-            <select>
-              <option value="SIDE_BY_SIDE">Side By Side</option>
-              <option value="UNIFIED_DIFF">Unified</option>
-            </select>
-          </gr-select>
-          <span id="diffPrefsContainer"
-              hidden$="[[_computePrefsButtonHidden(_prefs, _loggedIn)]]" hidden>
-            <span class="preferences desktop">
-              <span
-                  hidden$="[[_computeModeSelectHidden(_isImageDiff)]]">/</span>
-              <gr-button link
-                  class="prefsButton"
-                  on-tap="_handlePrefsTap">Preferences</gr-button>
-            </span>
-          </span>
-          <span class$="blameLoader [[_computeBlameLoaderClass(_isImageDiff, _isBlameSupported)]]">
-            <span class="separator">/</span>
+        <div class="rightControls">
+          <span class$="blameLoader [[_computeBlameLoaderClass(_isImageDiff)]]">
             <gr-button
                 link
                 disabled="[[_isBlameLoading]]"
                 on-tap="_toggleBlame">[[_computeBlameToggleLabel(_isBlameLoaded, _isBlameLoading)]]</gr-button>
+            <span class="separator"></span>
           </span>
+          <div class$="diffModeSelector [[_computeModeSelectHideClass(_isImageDiff)]]">
+            <span>Diff view:</span>
+            <gr-diff-mode-selector
+                id="modeSelect"
+                save-on-change="[[_loggedIn]]"
+                mode="{{changeViewState.diffMode}}"></gr-diff-mode-selector>
+          </div>
+          <span id="diffPrefsContainer"
+              hidden$="[[_computePrefsButtonHidden(_prefs, _loggedIn)]]" hidden>
+            <span class="preferences desktop">
+              <gr-button
+                  link
+                  class="prefsButton"
+                  has-tooltip
+                  title="Diff preferences"
+                  on-tap="_handlePrefsTap"><iron-icon icon="gr-icons:settings"></iron-icon></gr-button>
+            </span>
+          </span>
+          <gr-endpoint-decorator name="annotation-toggler">
+            <span hidden id="annotation-span">
+              <label for="annotation-checkbox" id="annotation-label"></label>
+              <input is="iron-input" type="checkbox" id="annotation-checkbox" disabled>
+            </span>
+          </gr-endpoint-decorator>
         </div>
       </div>
       <div class="fileNav mobile">
@@ -344,14 +320,15 @@
       </div>
     </gr-fixed-panel>
     <div class="loading" hidden$="[[!_loading]]">Loading...</div>
-    <gr-diff
-        id="diff"
+    <gr-diff-host
+        id="diffHost"
         hidden
         hidden$="[[_loading]]"
         class$="[[_computeDiffClass(_panelFloatingDisabled)]]"
         is-image-diff="{{_isImageDiff}}"
         files-weblinks="{{_filesWeblinks}}"
         change-num="[[_changeNum]]"
+        commit-range="[[_commitRange]]"
         patch-range="[[_patchRange]]"
         path="[[_path]]"
         prefs="[[_prefs]]"
@@ -360,15 +337,17 @@
         view-mode="[[_diffMode]]"
         is-blame-loaded="{{_isBlameLoaded}}"
         on-line-selected="_onLineSelected">
-    </gr-diff>
-    <gr-diff-preferences
-        id="diffPreferences"
-        prefs="{{_prefs}}"
-        local-prefs="{{_localPrefs}}"></gr-diff-preferences>
+    </gr-diff-host>
+    <gr-diff-preferences-dialog
+        id="diffPreferencesDialog"
+        diff-prefs="{{_prefs}}"
+        on-reload-diff-preference="_handleReloadingDiffPreference">
+    </gr-diff-preferences-dialog>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
     <gr-storage id="storage"></gr-storage>
     <gr-diff-cursor id="cursor"></gr-diff-cursor>
     <gr-comment-api id="commentAPI"></gr-comment-api>
+    <gr-reporting id="reporting"></gr-reporting>
   </template>
   <script src="gr-diff-view.js"></script>
 </dom-module>
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.js b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.js
index b97d974..89ad2d2 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -25,6 +28,11 @@
     RIGHT: 'right',
   };
 
+  const DiffViewMode = {
+    SIDE_BY_SIDE: 'SIDE_BY_SIDE',
+    UNIFIED: 'UNIFIED_DIFF',
+  };
+
   Polymer({
     is: 'gr-diff-view',
 
@@ -63,6 +71,8 @@
       },
       /** @type {?} */
       _patchRange: Object,
+      /** @type {?} */
+      _commitRange: Object,
       /**
        * @type {{
        *  subject: string,
@@ -71,8 +81,18 @@
        * }}
        */
       _change: Object,
+      /** @type {?} */
+      _changeComments: Object,
       _changeNum: String,
       _diff: Object,
+      // An array specifically formatted to be used in a gr-dropdown-list
+      // element for selected a file to view.
+      _formattedFiles: {
+        type: Array,
+        computed: '_formatFilesForDropdown(_fileList, _patchRange.patchNum, ' +
+            '_changeComments)',
+      },
+      // An sorted array of files, as returned by the rest API.
       _fileList: {
         type: Array,
         value() { return []; },
@@ -81,6 +101,10 @@
         type: String,
         observer: '_pathChanged',
       },
+      _fileNum: {
+        type: Number,
+        computed: '_computeFileNum(_path, _formattedFiles)',
+      },
       _loggedIn: {
         type: Boolean,
         value: false,
@@ -120,13 +144,9 @@
         type: Boolean,
         value: () => { return window.PANEL_FLOATING_DISABLED; },
       },
-      _editLoaded: {
+      _editMode: {
         type: Boolean,
-        computed: '_computeEditLoaded(_patchRange.*)',
-      },
-      _isBlameSupported: {
-        type: Boolean,
-        value: false,
+        computed: '_computeEditMode(_patchRange.*)',
       },
       _isBlameLoaded: Boolean,
       _isBlameLoading: {
@@ -137,6 +157,14 @@
         type: Array,
         computed: 'computeAllPatchSets(_change, _change.revisions.*)',
       },
+      _revisionInfo: {
+        type: Object,
+        computed: '_getRevisionInfo(_change)',
+      },
+      _reviewedFiles: {
+        type: Object,
+        value: () => new Set(),
+      },
     },
 
     behaviors: [
@@ -149,23 +177,46 @@
     observers: [
       '_getProjectConfig(_change.project)',
       '_getFiles(_changeNum, _patchRange.*)',
-      '_setReviewedObserver(_loggedIn, params.*)',
+      '_setReviewedObserver(_loggedIn, params.*, _prefs)',
     ],
 
     keyBindings: {
-      'esc': '_handleEscKey',
-      'shift+left': '_handleShiftLeftKey',
-      'shift+right': '_handleShiftRightKey',
-      'up k': '_handleUpKey',
-      'down j': '_handleDownKey',
-      'c': '_handleCKey',
-      '[': '_handleLeftBracketKey',
-      ']': '_handleRightBracketKey',
-      'n shift+n': '_handleNKey',
-      'p shift+p': '_handlePKey',
-      'a shift+a': '_handleAKey',
-      'u': '_handleUKey',
-      ',': '_handleCommaKey',
+      esc: '_handleEscKey',
+    },
+
+    keyboardShortcuts() {
+      return {
+        [this.Shortcut.LEFT_PANE]: '_handleLeftPane',
+        [this.Shortcut.RIGHT_PANE]: '_handleRightPane',
+        [this.Shortcut.NEXT_LINE]: '_handleNextLineOrFileWithComments',
+        [this.Shortcut.PREV_LINE]: '_handlePrevLineOrFileWithComments',
+        [this.Shortcut.NEXT_FILE_WITH_COMMENTS]:
+            '_handleNextLineOrFileWithComments',
+        [this.Shortcut.PREV_FILE_WITH_COMMENTS]:
+            '_handlePrevLineOrFileWithComments',
+        [this.Shortcut.NEW_COMMENT]: '_handleNewComment',
+        [this.Shortcut.SAVE_COMMENT]: null, // DOC_ONLY binding
+        [this.Shortcut.NEXT_FILE]: '_handleNextFile',
+        [this.Shortcut.PREV_FILE]: '_handlePrevFile',
+        [this.Shortcut.NEXT_CHUNK]: '_handleNextChunkOrCommentThread',
+        [this.Shortcut.NEXT_COMMENT_THREAD]: '_handleNextChunkOrCommentThread',
+        [this.Shortcut.PREV_CHUNK]: '_handlePrevChunkOrCommentThread',
+        [this.Shortcut.PREV_COMMENT_THREAD]: '_handlePrevChunkOrCommentThread',
+        [this.Shortcut.OPEN_REPLY_DIALOG]:
+            '_handleOpenReplyDialogOrToggleLeftPane',
+        [this.Shortcut.TOGGLE_LEFT_PANE]:
+            '_handleOpenReplyDialogOrToggleLeftPane',
+        [this.Shortcut.UP_TO_CHANGE]: '_handleUpToChange',
+        [this.Shortcut.OPEN_DIFF_PREFS]: '_handleCommaKey',
+        [this.Shortcut.TOGGLE_DIFF_MODE]: '_handleToggleDiffMode',
+        [this.Shortcut.TOGGLE_FILE_REVIEWED]: '_handleToggleFileReviewed',
+        [this.Shortcut.EXPAND_ALL_DIFF_CONTEXT]: '_handleExpandAllDiffContext',
+        [this.Shortcut.NEXT_UNREVIEWED_FILE]: '_handleNextUnreviewedFile',
+
+        // Final two are actually handled by gr-diff-comment-thread.
+        [this.Shortcut.EXPAND_ALL_COMMENT_THREADS]: null,
+        [this.Shortcut.COLLAPSE_ALL_COMMENT_THREADS]: null,
+      };
     },
 
     attached() {
@@ -173,11 +224,7 @@
         this._loggedIn = loggedIn;
       });
 
-      this.$.restAPI.getConfig().then(config => {
-        this._isBlameSupported = config.change.allow_blame;
-      });
-
-      this.$.cursor.push('diffs', this.$.diff);
+      this.$.cursor.push('diffs', this.$.diffHost);
     },
 
     _getLoggedIn() {
@@ -194,6 +241,7 @@
     _getChangeDetail(changeNum) {
       return this.$.restAPI.getDiffChangeDetail(changeNum).then(change => {
         this._change = change;
+        return change;
       });
     },
 
@@ -210,7 +258,9 @@
     },
 
     _getDiffPreferences() {
-      return this.$.restAPI.getDiffPreferences();
+      return this.$.restAPI.getDiffPreferences().then(prefs => {
+        this._prefs = prefs;
+      });
     },
 
     _getPreferences() {
@@ -226,7 +276,7 @@
     },
 
     _setReviewed(reviewed) {
-      if (this._editLoaded) { return; }
+      if (this._editMode) { return; }
       this.$.reviewed.checked = reviewed;
       this._saveReviewedState(reviewed).catch(err => {
         this.fire('show-alert', {message: ERR_REVIEW_STATUS});
@@ -239,29 +289,37 @@
           this._patchRange.patchNum, this._path, reviewed);
     },
 
+    _handleToggleFileReviewed(e) {
+      if (this.shouldSuppressKeyboardShortcut(e) ||
+          this.modifierPressed(e)) { return; }
+
+      e.preventDefault();
+      this._setReviewed(!this.$.reviewed.checked);
+    },
+
     _handleEscKey(e) {
       if (this.shouldSuppressKeyboardShortcut(e) ||
           this.modifierPressed(e)) { return; }
 
       e.preventDefault();
-      this.$.diff.displayLine = false;
+      this.$.diffHost.displayLine = false;
     },
 
-    _handleShiftLeftKey(e) {
+    _handleLeftPane(e) {
       if (this.shouldSuppressKeyboardShortcut(e)) { return; }
 
       e.preventDefault();
       this.$.cursor.moveLeft();
     },
 
-    _handleShiftRightKey(e) {
+    _handleRightPane(e) {
       if (this.shouldSuppressKeyboardShortcut(e)) { return; }
 
       e.preventDefault();
       this.$.cursor.moveRight();
     },
 
-    _handleUpKey(e) {
+    _handlePrevLineOrFileWithComments(e) {
       if (this.shouldSuppressKeyboardShortcut(e)) { return; }
       if (e.detail.keyboardEvent.shiftKey &&
           e.detail.keyboardEvent.keyCode === 75) { // 'K'
@@ -271,11 +329,11 @@
       if (this.modifierPressed(e)) { return; }
 
       e.preventDefault();
-      this.$.diff.displayLine = true;
+      this.$.diffHost.displayLine = true;
       this.$.cursor.moveUp();
     },
 
-    _handleDownKey(e) {
+    _handleNextLineOrFileWithComments(e) {
       if (this.shouldSuppressKeyboardShortcut(e)) { return; }
       if (e.detail.keyboardEvent.shiftKey &&
           e.detail.keyboardEvent.keyCode === 74) { // 'J'
@@ -285,37 +343,50 @@
       if (this.modifierPressed(e)) { return; }
 
       e.preventDefault();
-      this.$.diff.displayLine = true;
+      this.$.diffHost.displayLine = true;
       this.$.cursor.moveDown();
     },
 
     _moveToPreviousFileWithComment() {
-      if (this._commentSkips && this._commentSkips.previous) {
-        Gerrit.Nav.navigateToDiff(this._change, this._commentSkips.previous,
-            this._patchRange.patchNum, this._patchRange.basePatchNum);
+      if (!this._commentSkips) { return; }
+
+      // If there is no previous diff with comments, then return to the change
+      // view.
+      if (!this._commentSkips.previous) {
+        this._navToChangeView();
+        return;
       }
+
+      Gerrit.Nav.navigateToDiff(this._change, this._commentSkips.previous,
+          this._patchRange.patchNum, this._patchRange.basePatchNum);
     },
 
     _moveToNextFileWithComment() {
-      if (this._commentSkips && this._commentSkips.next) {
-        Gerrit.Nav.navigateToDiff(this._change, this._commentSkips.next,
-            this._patchRange.patchNum, this._patchRange.basePatchNum);
+      if (!this._commentSkips) { return; }
+
+      // If there is no next diff with comments, then return to the change view.
+      if (!this._commentSkips.next) {
+        this._navToChangeView();
+        return;
       }
+
+      Gerrit.Nav.navigateToDiff(this._change, this._commentSkips.next,
+          this._patchRange.patchNum, this._patchRange.basePatchNum);
     },
 
-    _handleCKey(e) {
+    _handleNewComment(e) {
       if (this.shouldSuppressKeyboardShortcut(e)) { return; }
-      if (this.$.diff.isRangeSelected()) { return; }
+      if (this.$.diffHost.isRangeSelected()) { return; }
       if (this.modifierPressed(e)) { return; }
 
       e.preventDefault();
       const line = this.$.cursor.getTargetLineElement();
       if (line) {
-        this.$.diff.addDraftAtLine(line);
+        this.$.diffHost.addDraftAtLine(line);
       }
     },
 
-    _handleLeftBracketKey(e) {
+    _handlePrevFile(e) {
       // Check for meta key to avoid overriding native chrome shortcut.
       if (this.shouldSuppressKeyboardShortcut(e) ||
           this.getKeyboardEvent(e).metaKey) { return; }
@@ -324,7 +395,7 @@
       this._navToFile(this._path, this._fileList, -1);
     },
 
-    _handleRightBracketKey(e) {
+    _handleNextFile(e) {
       // Check for meta key to avoid overriding native chrome shortcut.
       if (this.shouldSuppressKeyboardShortcut(e) ||
           this.getKeyboardEvent(e).metaKey) { return; }
@@ -333,7 +404,7 @@
       this._navToFile(this._path, this._fileList, 1);
     },
 
-    _handleNKey(e) {
+    _handleNextChunkOrCommentThread(e) {
       if (this.shouldSuppressKeyboardShortcut(e)) { return; }
 
       e.preventDefault();
@@ -345,7 +416,7 @@
       }
     },
 
-    _handlePKey(e) {
+    _handlePrevChunkOrCommentThread(e) {
       if (this.shouldSuppressKeyboardShortcut(e)) { return; }
 
       e.preventDefault();
@@ -357,12 +428,12 @@
       }
     },
 
-    _handleAKey(e) {
+    _handleOpenReplyDialogOrToggleLeftPane(e) {
       if (this.shouldSuppressKeyboardShortcut(e)) { return; }
 
       if (e.detail.keyboardEvent.shiftKey) { // Hide left diff.
         e.preventDefault();
-        this.$.diff.toggleLeftDiff();
+        this.$.diffHost.toggleLeftDiff();
         return;
       }
 
@@ -375,7 +446,7 @@
       this._navToChangeView();
     },
 
-    _handleUKey(e) {
+    _handleUpToChange(e) {
       if (this.shouldSuppressKeyboardShortcut(e) ||
           this.modifierPressed(e)) { return; }
 
@@ -388,7 +459,19 @@
           this.modifierPressed(e)) { return; }
 
       e.preventDefault();
-      this.$.diffPreferences.open();
+      this.$.diffPreferencesDialog.open();
+    },
+
+    _handleToggleDiffMode(e) {
+      if (this.shouldSuppressKeyboardShortcut(e) ||
+          this.modifierPressed(e)) { return; }
+
+      e.preventDefault();
+      if (this._getDiffViewMode() === DiffViewMode.SIDE_BY_SIDE) {
+        this.$.modeSelect.setMode(DiffViewMode.UNIFIED);
+      } else {
+        this.$.modeSelect.setMode(DiffViewMode.SIDE_BY_SIDE);
+      }
     },
 
     _navToChangeView() {
@@ -479,9 +562,28 @@
       return {path: fileList[idx]};
     },
 
+    _getReviewedFiles(changeNum, patchNum) {
+      return this.$.restAPI.getReviewedFiles(changeNum, patchNum)
+          .then(files => {
+            this._reviewedFiles = new Set(files);
+            return this._reviewedFiles;
+          });
+    },
+
+    _getReviewedStatus(editMode, changeNum, patchNum, path) {
+      if (editMode) { return Promise.resolve(false); }
+      return this._getReviewedFiles(changeNum, patchNum)
+          .then(files => files.has(path));
+    },
+
     _paramsChanged(value) {
       if (value.view !== Gerrit.Nav.View.DIFF) { return; }
 
+      if (value.changeNum && value.project) {
+        this.$.restAPI.setInProjectLookup(value.changeNum, value.project);
+      }
+
+      this.$.diffHost.lineOfInterest = this._getLineOfInterest(this.params);
       this._initCursor(this.params);
 
       this._changeNum = value.changeNum;
@@ -508,23 +610,39 @@
 
       const promises = [];
 
-      this._localPrefs = this.$.storage.getPreferences();
-      promises.push(this._getDiffPreferences().then(prefs => {
-        this._prefs = prefs;
-      }));
+      promises.push(this._getDiffPreferences());
 
       promises.push(this._getPreferences().then(prefs => {
         this._userPrefs = prefs;
       }));
 
-      promises.push(this._getChangeDetail(this._changeNum));
+      promises.push(this._getChangeDetail(this._changeNum).then(change => {
+        let commit;
+        let baseCommit;
+        for (const commitSha in change.revisions) {
+          if (!change.revisions.hasOwnProperty(commitSha)) continue;
+          const revision = change.revisions[commitSha];
+          const patchNum = revision._number.toString();
+          if (patchNum === this._patchRange.patchNum) {
+            commit = commitSha;
+            const commitObj = revision.commit || {};
+            const parents = commitObj.parents || [];
+            if (this._patchRange.basePatchNum === PARENT && parents.length) {
+              baseCommit = parents[parents.length - 1].commit;
+            }
+          } else if (patchNum === this._patchRange.basePatchNum) {
+            baseCommit = commitSha;
+          }
+        }
+        this._commitRange = {commit, baseCommit};
+      }));
 
       promises.push(this._loadComments());
 
       promises.push(this._getChangeEdit(this._changeNum));
 
       this._loading = true;
-      Promise.all(promises).then(r => {
+      return Promise.all(promises).then(r => {
         const edit = r[4];
         if (edit) {
           this.set('_change.revisions.' + edit.commit.commit, {
@@ -534,8 +652,10 @@
           });
         }
         this._loading = false;
-        this.$.diff.comments = this._commentsForDiff;
-        this.$.diff.reload();
+        this.$.diffHost.comments = this._commentsForDiff;
+        return this.$.diffHost.reload();
+      }).then(() => {
+        this.$.reporting.diffViewDisplayed();
       });
     },
 
@@ -548,8 +668,21 @@
       }
     },
 
-    _setReviewedObserver(_loggedIn) {
-      if (_loggedIn) {
+    _setReviewedObserver(_loggedIn, paramsRecord, _prefs) {
+      const params = paramsRecord.base || {};
+      if (!_loggedIn) { return; }
+
+      if (_prefs.manual_review) {
+        // Checkbox state needs to be set explicitly only when manual_review
+        // is specified.
+        this._getReviewedStatus(this.editMode, this._changeNum,
+            this._patchRange.patchNum, this._path).then(status => {
+              this.$.reviewed.checked = status;
+            });
+        return;
+      }
+
+      if (params.view === Gerrit.Nav.View.DIFF) {
         this._setReviewed(true);
       }
     },
@@ -567,6 +700,13 @@
       this.$.cursor.initialLineNumber = params.lineNum;
     },
 
+    _getLineOfInterest(params) {
+      // If there is a line number specified, pass it along to the diff so that
+      // it will not get collapsed.
+      if (!params.lineNum) { return null; }
+      return {number: params.lineNum, leftSide: params.leftSide};
+    },
+
     _pathChanged(path) {
       if (path) {
         this.fire('title-change',
@@ -584,10 +724,6 @@
           patchRange.basePatchNum);
     },
 
-    _computeDiffURL(change, patchRangeRecord, path) {
-      return this._getDiffUrl(change, patchRangeRecord.base, path);
-    },
-
     _patchRangeStr(patchRange) {
       let patchStr = patchRange.patchNum;
       if (patchRange.basePatchNum != null &&
@@ -636,23 +772,50 @@
       return this._getChangePath(change, patchRangeRecord.base, revisions);
     },
 
-    _computeFileSelected(path, currentPath) {
-      return path == currentPath;
+    _formatFilesForDropdown(fileList, patchNum, changeComments) {
+      if (!fileList) { return; }
+      const dropdownContent = [];
+      for (const path of fileList) {
+        dropdownContent.push({
+          text: this.computeDisplayPath(path),
+          mobileText: this.computeTruncatedPath(path),
+          value: path,
+          bottomText: this._computeCommentString(changeComments, patchNum,
+              path),
+        });
+      }
+      return dropdownContent;
+    },
+
+    _computeCommentString(changeComments, patchNum, path) {
+      const unresolvedCount = changeComments.computeUnresolvedNum(patchNum,
+          path);
+      const commentCount = changeComments.computeCommentCount(patchNum, path);
+      const commentString = GrCountStringFormatter.computePluralString(
+          commentCount, 'comment');
+      const unresolvedString = GrCountStringFormatter.computeString(
+          unresolvedCount, 'unresolved');
+
+      return commentString +
+          // Add a space if both comments and unresolved
+          (commentString && unresolvedString ? ', ' : '') +
+          // Add parentheses around unresolved if it exists.
+          (unresolvedString ? `${unresolvedString}` : '');
     },
 
     _computePrefsButtonHidden(prefs, loggedIn) {
       return !loggedIn || !prefs;
     },
 
-    _computeKeyNav(path, selectedPath, fileList) {
-      const selectedIndex = fileList.indexOf(selectedPath);
-      if (fileList.indexOf(path) == selectedIndex - 1) {
-        return '[';
+    _handleFileChange(e) {
+      // This is when it gets set initially.
+      const path = e.detail.value;
+      if (path === this._path) {
+        return;
       }
-      if (fileList.indexOf(path) == selectedIndex + 1) {
-        return ']';
-      }
-      return '';
+
+      Gerrit.Nav.navigateToDiff(this._change, path, this._patchRange.patchNum,
+          this._patchRange.basePatchNum);
     },
 
     _handleFileTap(e) {
@@ -663,16 +826,6 @@
       }, 1);
     },
 
-    _handleMobileSelectChange(e) {
-      const path = Polymer.dom(e).rootTarget.value;
-      Gerrit.Nav.navigateToDiff(this._change, path, this._patchRange.patchNum,
-          this._patchRange.basePatchNum);
-    },
-
-    _showDropdownTapHandler(e) {
-      this.$.dropdown.open();
-    },
-
     _handlePatchChange(e) {
       const {basePatchNum, patchNum} = e.detail;
       if (this.patchNumEquals(basePatchNum, this._patchRange.basePatchNum) &&
@@ -683,22 +836,7 @@
 
     _handlePrefsTap(e) {
       e.preventDefault();
-      this.$.diffPreferences.open();
-    },
-
-    _handlePrefsSave(e) {
-      e.stopPropagation();
-      const el = Polymer.dom(e).rootTarget;
-      el.disabled = true;
-      this.$.storage.savePreferences(this._localPrefs);
-      this._saveDiffPreferences().then(response => {
-        el.disabled = false;
-        if (!response.ok) { return response; }
-
-        this.$.prefsOverlay.close();
-      }).catch(err => {
-        el.disabled = false;
-      });
+      this.$.diffPreferencesDialog.open();
     },
 
     /**
@@ -719,15 +857,15 @@
       if (this.changeViewState.diffMode) {
         return this.changeViewState.diffMode;
       } else if (this._userPrefs) {
-        return this.changeViewState.diffMode =
-            this._userPrefs.default_diff_view;
+        this.set('changeViewState.diffMode', this._userPrefs.default_diff_view);
+        return this._userPrefs.default_diff_view;
       } else {
         return 'SIDE_BY_SIDE';
       }
     },
 
-    _computeModeSelectHidden() {
-      return this._isImageDiff;
+    _computeModeSelectHideClass(isImageDiff) {
+      return isImageDiff ? 'hide' : '';
     },
 
     _onLineSelected(e, detail) {
@@ -742,21 +880,31 @@
       history.replaceState(null, '', url);
     },
 
-    _computeDownloadLink(changeNum, patchRange, path) {
-      let url = this.changeBaseURL(changeNum, patchRange.patchNum);
+    _computeDownloadLink(project, changeNum, patchRange, path) {
+      let url = this.changeBaseURL(project, changeNum, patchRange.patchNum);
       url += '/patch?zip&path=' + encodeURIComponent(path);
       return url;
     },
 
     _loadComments() {
-      return this.$.commentAPI.loadAll(this._changeNum).then(() => {
-        this._commentMap = this.$.commentAPI.getPaths(this._patchRange);
+      return this.$.commentAPI.loadAll(this._changeNum).then(comments => {
+        this._changeComments = comments;
+        this._commentMap = this._getPaths(this._patchRange);
 
-        this._commentsForDiff = this.$.commentAPI.getCommentsForPath(this._path,
+        this._commentsForDiff = this._getCommentsForPath(this._path,
             this._patchRange, this._projectConfig);
       });
     },
 
+    _getPaths(patchRange) {
+      return this._changeComments.getPaths(patchRange);
+    },
+
+    _getCommentsForPath(path, patchRange, projectConfig) {
+      return this._changeComments.getCommentsBySideForPath(path, patchRange,
+          projectConfig);
+    },
+
     _getDiffDrafts() {
       return this.$.restAPI.getDiffDrafts(this._changeNum);
     },
@@ -794,16 +942,16 @@
     /**
      * @param {!Object} patchRangeRecord
      */
-    _computeEditLoaded(patchRangeRecord) {
+    _computeEditMode(patchRangeRecord) {
       const patchRange = patchRangeRecord.base || {};
       return this.patchNumEquals(patchRange.patchNum, this.EDIT_NAME);
     },
 
     /**
-     * @param {boolean} editLoaded
+     * @param {boolean} editMode
      */
-    _computeContainerClass(editLoaded) {
-      return editLoaded ? 'editLoaded' : '';
+    _computeContainerClass(editMode) {
+      return editMode ? 'editMode' : '';
     },
 
     _computeBlameToggleLabel(loaded, loading) {
@@ -817,13 +965,13 @@
      */
     _toggleBlame() {
       if (this._isBlameLoaded) {
-        this.$.diff.clearBlame();
+        this.$.diffHost.clearBlame();
         return;
       }
 
       this._isBlameLoading = true;
       this.fire('show-alert', {message: MSG_LOADING_BLAME});
-      this.$.diff.loadBlame()
+      this.$.diffHost.loadBlame()
           .then(() => {
             this._isBlameLoading = false;
             this.fire('show-alert', {message: MSG_LOADED_BLAME});
@@ -833,8 +981,48 @@
           });
     },
 
-    _computeBlameLoaderClass(isImageDiff, supported) {
-      return !isImageDiff && supported ? 'show' : '';
+    _computeBlameLoaderClass(isImageDiff) {
+      return !isImageDiff ? 'show' : '';
+    },
+
+    _getRevisionInfo(change) {
+      return new Gerrit.RevisionInfo(change);
+    },
+
+    _computeFileNum(file, files) {
+      return files.findIndex(({value}) => value === file) + 1;
+    },
+
+    /**
+     * @param {number} fileNum
+     * @param {!Array<string>} files
+     * @return {string}
+     */
+    _computeFileNumClass(fileNum, files) {
+      if (files && fileNum > 0) {
+        return 'show';
+      }
+      return '';
+    },
+
+    _handleExpandAllDiffContext(e) {
+      if (this.shouldSuppressKeyboardShortcut(e)) { return; }
+      this.$.diffHost.expandAllContext();
+    },
+
+    _handleNextUnreviewedFile(e) {
+      if (this.shouldSuppressKeyboardShortcut(e)) { return; }
+      this._setReviewed(true);
+      // Ensure that the currently viewed file always appears in unreviewedFiles
+      // so we resolve the right "next" file.
+      const unreviewedFiles = this._fileList
+          .filter(file =>
+          (file === this._path || !this._reviewedFiles.has(file)));
+      this._navToFile(this._path, unreviewedFiles, 1);
+    },
+
+    _handleReloadingDiffPreference() {
+      this._getDiffPreferences();
     },
   });
 })();
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.html b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.html
index fa37eb9..354bfef 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -42,6 +43,32 @@
 
 <script>
   suite('gr-diff-view tests', () => {
+    const kb = window.Gerrit.KeyboardShortcutBinder;
+    kb.bindShortcut(kb.Shortcut.LEFT_PANE, 'shift+left');
+    kb.bindShortcut(kb.Shortcut.RIGHT_PANE, 'shift+right');
+    kb.bindShortcut(kb.Shortcut.NEXT_LINE, 'j', 'down');
+    kb.bindShortcut(kb.Shortcut.PREV_LINE, 'k', 'up');
+    kb.bindShortcut(kb.Shortcut.NEXT_FILE_WITH_COMMENTS, 'shift+j');
+    kb.bindShortcut(kb.Shortcut.PREV_FILE_WITH_COMMENTS, 'shift+k');
+    kb.bindShortcut(kb.Shortcut.NEW_COMMENT, 'c');
+    kb.bindShortcut(kb.Shortcut.SAVE_COMMENT, 'ctrl+s');
+    kb.bindShortcut(kb.Shortcut.NEXT_FILE, ']');
+    kb.bindShortcut(kb.Shortcut.PREV_FILE, '[');
+    kb.bindShortcut(kb.Shortcut.NEXT_CHUNK, 'n');
+    kb.bindShortcut(kb.Shortcut.NEXT_COMMENT_THREAD, 'shift+n');
+    kb.bindShortcut(kb.Shortcut.PREV_CHUNK, 'p');
+    kb.bindShortcut(kb.Shortcut.PREV_COMMENT_THREAD, 'shift+p');
+    kb.bindShortcut(kb.Shortcut.OPEN_REPLY_DIALOG, 'a');
+    kb.bindShortcut(kb.Shortcut.TOGGLE_LEFT_PANE, 'shift+a');
+    kb.bindShortcut(kb.Shortcut.UP_TO_CHANGE, 'u');
+    kb.bindShortcut(kb.Shortcut.OPEN_DIFF_PREFS, ',');
+    kb.bindShortcut(kb.Shortcut.TOGGLE_DIFF_MODE, 'm');
+    kb.bindShortcut(kb.Shortcut.TOGGLE_FILE_REVIEWED, 'r');
+    kb.bindShortcut(kb.Shortcut.EXPAND_ALL_DIFF_CONTEXT, 'shift+x');
+    kb.bindShortcut(kb.Shortcut.EXPAND_ALL_COMMENT_THREADS, 'e');
+    kb.bindShortcut(kb.Shortcut.COLLAPSE_ALL_COMMENT_THREADS, 'shift+e');
+    kb.bindShortcut(kb.Shortcut.NEXT_UNREVIEWED_FILE, 'shift+m');
+
     let element;
     let sandbox;
 
@@ -51,23 +78,45 @@
       sandbox = sinon.sandbox.create();
 
       stub('gr-rest-api-interface', {
+        getConfig() { return Promise.resolve({change: {}}); },
         getLoggedIn() { return Promise.resolve(false); },
         getProjectConfig() { return Promise.resolve({}); },
-        getDiffChangeDetail() { return Promise.resolve(null); },
+        getDiffChangeDetail() { return Promise.resolve({}); },
         getChangeFiles() { return Promise.resolve({}); },
         saveFileReviewed() { return Promise.resolve(); },
+        getDiffComments() { return Promise.resolve({}); },
         getDiffRobotComments() { return Promise.resolve({}); },
-        getDiffDrafts() { return Promise.resolve(); },
+        getDiffDrafts() { return Promise.resolve({}); },
+        getReviewedFiles() { return Promise.resolve([]); },
       });
       element = fixture('basic');
+      return element._loadComments();
     });
 
     teardown(() => {
       sandbox.restore();
     });
 
+    test('params change triggers diffViewDisplayed()', () => {
+      sandbox.stub(element.$.reporting, 'diffViewDisplayed');
+      sandbox.stub(element.$.diffHost, 'reload').returns(Promise.resolve());
+      sandbox.spy(element, '_paramsChanged');
+      element.params = {
+        view: Gerrit.Nav.View.DIFF,
+        changeNum: '42',
+        patchNum: '2',
+        basePatchNum: '1',
+        path: '/COMMIT_MSG',
+      };
+
+      return element._paramsChanged.returnValues[0].then(() => {
+        assert.isTrue(element.$.reporting.diffViewDisplayed.calledOnce);
+      });
+    });
+
     test('toggle left diff with a hotkey', () => {
-      const toggleLeftDiffStub = sandbox.stub(element.$.diff, 'toggleLeftDiff');
+      const toggleLeftDiffStub = sandbox.stub(
+          element.$.diffHost, 'toggleLeftDiff');
       MockInteractions.pressAndReleaseKeyOn(element, 65, 'shift', 'a');
       assert.isTrue(toggleLeftDiffStub.calledOnce);
     });
@@ -81,7 +130,7 @@
       element._change = {
         _number: 42,
         revisions: {
-          a: {_number: 10},
+          a: {_number: 10, commit: {parents: []}},
         },
       };
       element._fileList = ['chell.go', 'glados.txt', 'wheatley.md'];
@@ -123,7 +172,7 @@
       assert.isTrue(element._loading);
 
       const showPrefsStub =
-          sandbox.stub(element.$.diffPreferences.$.prefsOverlay, 'open',
+          sandbox.stub(element.$.diffPreferencesDialog, 'open',
               () => Promise.resolve());
 
       MockInteractions.pressAndReleaseKeyOn(element, 188, null, ',');
@@ -146,7 +195,7 @@
       MockInteractions.pressAndReleaseKeyOn(element, 80, 'shift', 'p');
       assert(scrollStub.calledOnce);
 
-      const computeContainerClassStub = sandbox.stub(element.$.diff,
+      const computeContainerClassStub = sandbox.stub(element.$.diffHost.$.diff,
           '_computeContainerClass');
       MockInteractions.pressAndReleaseKeyOn(element, 74, null, 'j');
       assert(computeContainerClassStub.lastCall.calledWithExactly(
@@ -155,6 +204,22 @@
       MockInteractions.pressAndReleaseKeyOn(element, 27, null, 'esc');
       assert(computeContainerClassStub.lastCall.calledWithExactly(
           false, 'SIDE_BY_SIDE', false));
+
+      sandbox.stub(element, '_setReviewed');
+      element.$.reviewed.checked = false;
+      MockInteractions.pressAndReleaseKeyOn(element, 82, 'shift', 'r');
+      assert.isFalse(element._setReviewed.called);
+
+      MockInteractions.pressAndReleaseKeyOn(element, 82, null, 'r');
+      assert.isTrue(element._setReviewed.called);
+      assert.equal(element._setReviewed.lastCall.args[0], true);
+    });
+
+    test('shift+x shortcut expands all diff context', () => {
+      const expandStub = sandbox.stub(element.$.diffHost, 'expandAllContext');
+      MockInteractions.pressAndReleaseKeyOn(element, 88, 'shift', 'x');
+      flushAsynchronousOperations();
+      assert.isTrue(expandStub.called);
     });
 
     test('keyboard shortcuts with patch range', () => {
@@ -166,8 +231,8 @@
       element._change = {
         _number: 42,
         revisions: {
-          a: {_number: 10},
-          b: {_number: 5},
+          a: {_number: 10, commit: {parents: []}},
+          b: {_number: 5, commit: {parents: []}},
         },
       };
       element._fileList = ['chell.go', 'glados.txt', 'wheatley.md'];
@@ -230,8 +295,8 @@
       element._change = {
         _number: 42,
         revisions: {
-          a: {_number: 1},
-          b: {_number: 2},
+          a: {_number: 1, commit: {parents: []}},
+          b: {_number: 2, commit: {parents: []}},
         },
       };
       element._fileList = ['chell.go', 'glados.txt', 'wheatley.md'];
@@ -300,7 +365,7 @@
 
     test('prefsButton opens gr-diff-preferences', () => {
       const handlePrefsTapSpy = sandbox.spy(element, '_handlePrefsTap');
-      const overlayOpenStub = sandbox.stub(element.$.diffPreferences,
+      const overlayOpenStub = sandbox.stub(element.$.diffPreferencesDialog,
           'open');
       const prefsButton =
           Polymer.dom(element.root).querySelector('.prefsButton');
@@ -311,6 +376,34 @@
       assert.isTrue(overlayOpenStub.called);
     });
 
+    test('_computeCommentString', done => {
+      loadCommentSpy = sandbox.spy(element.$.commentAPI, 'loadAll');
+      const path = '/test';
+      element.$.commentAPI.loadAll().then(comments => {
+        const commentCountStub =
+            sandbox.stub(comments, 'computeCommentCount');
+        const unresolvedCountStub =
+            sandbox.stub(comments, 'computeUnresolvedNum');
+        commentCountStub.withArgs(1, path).returns(0);
+        commentCountStub.withArgs(2, path).returns(1);
+        commentCountStub.withArgs(3, path).returns(2);
+        commentCountStub.withArgs(4, path).returns(0);
+        unresolvedCountStub.withArgs(1, path).returns(1);
+        unresolvedCountStub.withArgs(2, path).returns(0);
+        unresolvedCountStub.withArgs(3, path).returns(2);
+        unresolvedCountStub.withArgs(4, path).returns(0);
+
+        assert.equal(element._computeCommentString(comments, 1, path),
+            '1 unresolved');
+        assert.equal(element._computeCommentString(comments, 2, path),
+            '1 comment');
+        assert.equal(element._computeCommentString(comments, 3, path),
+            '2 comments, 2 unresolved');
+        assert.equal(element._computeCommentString(comments, 4, path), '');
+        done();
+      });
+    });
+
     suite('url params', () => {
       setup(() => {
         sandbox.stub(Gerrit.Nav, 'getUrlForDiff', (c, p, pn, bpn) => {
@@ -321,54 +414,49 @@
         });
       });
 
-      test('jump to file dropdown', () => {
+      test('_formattedFiles', () => {
         element._changeNum = '42';
         element._patchRange = {
           basePatchNum: PARENT,
           patchNum: '10',
         };
         element._change = {_number: 42};
-        element._fileList = ['chell.go', 'glados.txt', 'wheatley.md'];
+        element._fileList = ['chell.go', 'glados.txt', 'wheatley.md',
+          '/COMMIT_MSG', '/MERGE_LIST'];
         element._path = 'glados.txt';
-        flushAsynchronousOperations();
-        const linkEls =
-            Polymer.dom(element.root).querySelectorAll('.dropdown-content > a');
-        assert.equal(linkEls.length, 3);
-        assert.isFalse(linkEls[0].hasAttribute('selected'));
-        assert.isTrue(linkEls[1].hasAttribute('selected'));
-        assert.isFalse(linkEls[2].hasAttribute('selected'));
-        assert.equal(linkEls[0].getAttribute('data-key-nav'), '[');
-        assert.equal(linkEls[1].getAttribute('data-key-nav'), '');
-        assert.equal(linkEls[2].getAttribute('data-key-nav'), ']');
-        assert.equal(linkEls[0].getAttribute('href'), '42-chell.go-10-PARENT');
-        assert.equal(linkEls[1].getAttribute('href'),
-            '42-glados.txt-10-PARENT');
-        assert.equal(linkEls[2].getAttribute('href'),
-            '42-wheatley.md-10-PARENT');
-      });
+        const expectedFormattedFiles = [
+          {
+            text: 'chell.go',
+            mobileText: 'chell.go',
+            value: 'chell.go',
+            bottomText: '',
+          }, {
+            text: 'glados.txt',
+            mobileText: 'glados.txt',
+            value: 'glados.txt',
+            bottomText: '',
+          }, {
+            text: 'wheatley.md',
+            mobileText: 'wheatley.md',
+            value: 'wheatley.md',
+            bottomText: '',
+          },
+          {
+            text: 'Commit message',
+            mobileText: 'Commit message',
+            value: '/COMMIT_MSG',
+            bottomText: '',
+          },
+          {
+            text: 'Merge list',
+            mobileText: 'Merge list',
+            value: '/MERGE_LIST',
+            bottomText: '',
+          },
+        ];
 
-      test('jump to file dropdown with patch range', () => {
-        element._changeNum = '42';
-        element._patchRange = {
-          basePatchNum: '5',
-          patchNum: '10',
-        };
-        element._change = {_number: 42};
-        element._fileList = ['chell.go', 'glados.txt', 'wheatley.md'];
-        element._path = 'glados.txt';
-        flushAsynchronousOperations();
-        const linkEls =
-            Polymer.dom(element.root).querySelectorAll('.dropdown-content > a');
-        assert.equal(linkEls.length, 3);
-        assert.isFalse(linkEls[0].hasAttribute('selected'));
-        assert.isTrue(linkEls[1].hasAttribute('selected'));
-        assert.isFalse(linkEls[2].hasAttribute('selected'));
-        assert.equal(linkEls[0].getAttribute('data-key-nav'), '[');
-        assert.equal(linkEls[1].getAttribute('data-key-nav'), '');
-        assert.equal(linkEls[2].getAttribute('data-key-nav'), ']');
-        assert.equal(linkEls[0].getAttribute('href'), '42-chell.go-10-5');
-        assert.equal(linkEls[1].getAttribute('href'), '42-glados.txt-10-5');
-        assert.equal(linkEls[2].getAttribute('href'), '42-wheatley.md-10-5');
+        assert.deepEqual(element._formattedFiles, expectedFormattedFiles);
+        assert.equal(element._formattedFiles[1].value, element._path);
       });
 
       test('prev/up/next links', () => {
@@ -380,7 +468,7 @@
         element._change = {
           _number: 42,
           revisions: {
-            a: {_number: 10},
+            a: {_number: 10, commit: {parents: []}},
           },
         };
         element._fileList = ['chell.go', 'glados.txt', 'wheatley.md'];
@@ -421,8 +509,8 @@
         element._change = {
           _number: 42,
           revisions: {
-            a: {_number: 5},
-            b: {_number: 10},
+            a: {_number: 5, commit: {parents: []}},
+            b: {_number: 10, commit: {parents: []}},
           },
         };
         element._fileList = ['chell.go', 'glados.txt', 'wheatley.md'];
@@ -469,6 +557,7 @@
     });
 
     test('download link', () => {
+      element._change = {project: 'test'},
       element._changeNum = '42';
       element._patchRange = {
         basePatchNum: PARENT,
@@ -479,17 +568,42 @@
       flushAsynchronousOperations();
       const link = element.$$('.downloadLink');
       assert.equal(link.getAttribute('href'),
-          '/changes/42/revisions/10/patch?zip&path=glados.txt');
+          '/changes/test~42/revisions/10/patch?zip&path=glados.txt');
       assert.isTrue(link.hasAttribute('download'));
     });
 
-    test('file review status', done => {
-      stub('gr-rest-api-interface', {
-        getDiffComments() { return Promise.resolve({}); },
-      });
+    test('_prefs.manual_review is respected', () => {
       const saveReviewedStub = sandbox.stub(element, '_saveReviewedState',
           () => Promise.resolve());
-      sandbox.stub(element.$.diff, 'reload');
+      const getReviewedStub = sandbox.stub(element, '_getReviewedStatus',
+          () => Promise.resolve());
+
+      sandbox.stub(element.$.diffHost, 'reload');
+      element._loggedIn = true;
+      element.params = {
+        view: Gerrit.Nav.View.DIFF,
+        changeNum: '42',
+        patchNum: '2',
+        basePatchNum: '1',
+        path: '/COMMIT_MSG',
+      };
+      element._prefs = {manual_review: true};
+      flushAsynchronousOperations();
+
+      assert.isFalse(saveReviewedStub.called);
+      assert.isTrue(getReviewedStub.called);
+
+      element._prefs = {};
+      flushAsynchronousOperations();
+
+      assert.isTrue(saveReviewedStub.called);
+      assert.isTrue(getReviewedStub.calledOnce);
+    });
+
+    test('file review status', () => {
+      const saveReviewedStub = sandbox.stub(element, '_saveReviewedState',
+          () => Promise.resolve());
+      sandbox.stub(element.$.diffHost, 'reload');
 
       element._loggedIn = true;
       element.params = {
@@ -499,22 +613,28 @@
         basePatchNum: '1',
         path: '/COMMIT_MSG',
       };
+      element._prefs = {};
+      flushAsynchronousOperations();
 
-      flush(() => {
-        const commitMsg = Polymer.dom(element.root).querySelector(
-            'input[type="checkbox"]');
+      const commitMsg = Polymer.dom(element.root).querySelector(
+          'input[type="checkbox"]');
 
-        assert.isTrue(commitMsg.checked);
-        MockInteractions.tap(commitMsg);
-        assert.isFalse(commitMsg.checked);
-        assert.isTrue(saveReviewedStub.lastCall.calledWithExactly(false));
+      assert.isTrue(commitMsg.checked);
+      MockInteractions.tap(commitMsg);
+      assert.isFalse(commitMsg.checked);
+      assert.isTrue(saveReviewedStub.lastCall.calledWithExactly(false));
 
-        MockInteractions.tap(commitMsg);
-        assert.isTrue(commitMsg.checked);
-        assert.isTrue(saveReviewedStub.lastCall.calledWithExactly(true));
+      MockInteractions.tap(commitMsg);
+      assert.isTrue(commitMsg.checked);
+      assert.isTrue(saveReviewedStub.lastCall.calledWithExactly(true));
+      const callCount = saveReviewedStub.callCount;
 
-        done();
-      });
+      element.set('params.view', Gerrit.Nav.View.CHANGE);
+      flushAsynchronousOperations();
+
+      // saveReviewedState observer observes params, but should not fire when
+      // view !== Gerrit.Nav.View.DIFF.
+      assert.equal(saveReviewedStub.callCount, callCount);
     });
 
     test('file review status with edit loaded', () => {
@@ -523,16 +643,13 @@
       element._patchRange = {patchNum: element.EDIT_NAME};
       flushAsynchronousOperations();
 
-      assert.isTrue(element._editLoaded);
+      assert.isTrue(element._editMode);
       element._setReviewed();
       assert.isFalse(saveReviewedStub.called);
     });
 
     test('hash is determined from params', done => {
-      stub('gr-rest-api-interface', {
-        getDiffComments() { return Promise.resolve({}); },
-      });
-      sandbox.stub(element.$.diff, 'reload');
+      sandbox.stub(element.$.diffHost, 'reload');
       sandbox.stub(element, '_initCursor');
 
       element._loggedIn = true;
@@ -553,25 +670,25 @@
 
     test('diff mode selector correctly toggles the diff', () => {
       const select = element.$.modeSelect;
-      const diffDisplay = element.$.diff;
+      const diffDisplay = element.$.diffHost;
       element._userPrefs = {default_diff_view: 'SIDE_BY_SIDE'};
 
       // The mode selected in the view state reflects the selected option.
-      assert.equal(element._getDiffViewMode(), select.nativeSelect.value);
+      assert.equal(element._getDiffViewMode(), select.mode);
 
       // The mode selected in the view state reflects the view rednered in the
       // diff.
-      assert.equal(select.nativeSelect.value, diffDisplay.viewMode);
+      assert.equal(select.mode, diffDisplay.viewMode);
 
       // We will simulate a user change of the selected mode.
       const newMode = 'UNIFIED_DIFF';
-      // Set the actual value of the select, and simulate the change event.
-      select.nativeSelect.value = newMode;
-      element.fire('change', {}, {node: select.nativeSelect});
+
+      // Set the mode, and simulate the change event.
+      element.set('changeViewState.diffMode', newMode);
 
       // Make sure the handler was called and the state is still coherent.
       assert.equal(element._getDiffViewMode(), newMode);
-      assert.equal(element._getDiffViewMode(), select.nativeSelect.value);
+      assert.equal(element._getDiffViewMode(), select.mode);
       assert.equal(element._getDiffViewMode(), diffDisplay.viewMode);
     });
 
@@ -584,17 +701,76 @@
 
       // Attach a new gr-diff-view so we can intercept the preferences fetch.
       const view = document.createElement('gr-diff-view');
-      const select = view.$.modeSelect;
       fixture('blank').appendChild(view);
       flushAsynchronousOperations();
 
       // At this point the diff mode doesn't yet have the user's preference.
-      assert.equal(select.nativeSelect.value, 'SIDE_BY_SIDE');
+      assert.equal(view._getDiffViewMode(), 'SIDE_BY_SIDE');
 
       // Receive the overriding preference.
       resolvePrefs({default_diff_view: 'UNIFIED'});
       flushAsynchronousOperations();
-      assert.equal(select.nativeSelect.value, 'SIDE_BY_SIDE');
+      assert.equal(element._getDiffViewMode(), 'SIDE_BY_SIDE');
+    });
+
+    suite('_commitRange', () => {
+      setup(() => {
+        sandbox.stub(element.$.diffHost, 'reload');
+        sandbox.stub(element, '_initCursor');
+        sandbox.stub(element, '_getChangeDetail').returns(Promise.resolve({
+          _number: 42,
+          revisions: {
+            'commit-sha-1': {
+              _number: 1,
+              commit: {
+                parents: [{commit: 'sha-1-parent'}],
+              },
+            },
+            'commit-sha-2': {_number: 2},
+            'commit-sha-3': {_number: 3},
+            'commit-sha-4': {_number: 4},
+            'commit-sha-5': {
+              _number: 5,
+              commit: {
+                parents: [{commit: 'sha-5-parent'}],
+              },
+            },
+          },
+        }));
+      });
+
+      test('uses the patchNum and basePatchNum ', done => {
+        element.params = {
+          view: Gerrit.Nav.View.DIFF,
+          changeNum: '42',
+          patchNum: '4',
+          basePatchNum: '2',
+          path: '/COMMIT_MSG',
+        };
+        flush(() => {
+          assert.deepEqual(element._commitRange, {
+            baseCommit: 'commit-sha-2',
+            commit: 'commit-sha-4',
+          });
+          done();
+        });
+      });
+
+      test('uses the parent when there is no base patch num ', done => {
+        element.params = {
+          view: Gerrit.Nav.View.DIFF,
+          changeNum: '42',
+          patchNum: '5',
+          path: '/COMMIT_MSG',
+        };
+        flush(() => {
+          assert.deepEqual(element._commitRange, {
+            commit: 'commit-sha-5',
+            baseCommit: 'sha-5-parent',
+          });
+          done();
+        });
+      });
     });
 
     test('_initCursor', () => {
@@ -624,6 +800,18 @@
       assert.equal(element.$.cursor.side, 'right');
     });
 
+    test('_getLineOfInterest', () => {
+      assert.isNull(element._getLineOfInterest({}));
+
+      let result = element._getLineOfInterest({lineNum: 12});
+      assert.equal(result.number, 12);
+      assert.isNotOk(result.leftSide);
+
+      result = element._getLineOfInterest({lineNum: 12, leftSide: true});
+      assert.equal(result.number, 12);
+      assert.isOk(result.leftSide);
+    });
+
     test('_onLineSelected', () => {
       const getUrlStub = sandbox.stub(Gerrit.Nav, 'getUrlForDiffById');
       const replaceStateStub = sandbox.stub(history, 'replaceState');
@@ -677,13 +865,21 @@
       assert.equal(element._getDiffViewMode(), 'SIDE_BY_SIDE');
     });
 
+    test('_handleToggleDiffMode', () => {
+      sandbox.stub(element, 'shouldSuppressKeyboardShortcut').returns(false);
+      const e = {preventDefault: () => {}};
+      // Initial state.
+      assert.equal(element._getDiffViewMode(), 'SIDE_BY_SIDE');
+
+      element._handleToggleDiffMode(e);
+      assert.equal(element._getDiffViewMode(), 'UNIFIED_DIFF');
+
+      element._handleToggleDiffMode(e);
+      assert.equal(element._getDiffViewMode(), 'SIDE_BY_SIDE');
+    });
+
     suite('_loadComments', () => {
       test('empty', done => {
-        stub('gr-comment-api', {
-          loadAll() { return Promise.resolve(); },
-          getPaths() { return {}; },
-          getCommentsForPath() { return {meta: {}}; },
-        });
         element._loadComments().then(() => {
           assert.equal(Object.keys(element._commentMap).length, 0);
           done();
@@ -691,16 +887,11 @@
       });
 
       test('has paths', done => {
-        stub('gr-comment-api', {
-          loadAll() { return Promise.resolve(); },
-          getPaths() {
-            return {
-              'path/to/file/one.cpp': [{patch_set: 3, message: 'lorem'}],
-              'path-to/file/two.py': [{patch_set: 5, message: 'ipsum'}],
-            };
-          },
-          getCommentsForPath() { return {meta: {}}; },
+        sandbox.stub(element, '_getPaths').returns({
+          'path/to/file/one.cpp': [{patch_set: 3, message: 'lorem'}],
+          'path-to/file/two.py': [{patch_set: 5, message: 'ipsum'}],
         });
+        sandbox.stub(element, '_getCommentsForPath').returns({meta: {}});
         element._changeNum = '42';
         element._patchRange = {
           basePatchNum: '3',
@@ -757,17 +948,131 @@
         assert.equal(result.previous, fileList[1]);
         assert.isNull(result.next);
       });
+
+      suite('skip next/previous', () => {
+        let navToChangeStub;
+        let navToDiffStub;
+
+        setup(() => {
+          navToChangeStub = sandbox.stub(element, '_navToChangeView');
+          navToDiffStub = sandbox.stub(Gerrit.Nav, 'navigateToDiff');
+          element._fileList = [
+            'path/one.jpg', 'path/two.m4v', 'path/three.wav',
+          ];
+          element._patchRange = {patchNum: '2', basePatchNum: '1'};
+        });
+
+        suite('_moveToPreviousFileWithComment', () => {
+          test('no skips', () => {
+            element._moveToPreviousFileWithComment();
+            assert.isFalse(navToChangeStub.called);
+            assert.isFalse(navToDiffStub.called);
+          });
+
+          test('no previous', () => {
+            const commentMap = {};
+            commentMap[element._fileList[0]] = false;
+            commentMap[element._fileList[1]] = false;
+            commentMap[element._fileList[2]] = true;
+            element._commentMap = commentMap;
+            element._path = element._fileList[1];
+
+            element._moveToPreviousFileWithComment();
+            assert.isTrue(navToChangeStub.calledOnce);
+            assert.isFalse(navToDiffStub.called);
+          });
+
+          test('w/ previous', () => {
+            const commentMap = {};
+            commentMap[element._fileList[0]] = true;
+            commentMap[element._fileList[1]] = false;
+            commentMap[element._fileList[2]] = true;
+            element._commentMap = commentMap;
+            element._path = element._fileList[1];
+
+            element._moveToPreviousFileWithComment();
+            assert.isFalse(navToChangeStub.called);
+            assert.isTrue(navToDiffStub.calledOnce);
+          });
+        });
+
+        suite('_moveToNextFileWithComment', () => {
+          test('no skips', () => {
+            element._moveToNextFileWithComment();
+            assert.isFalse(navToChangeStub.called);
+            assert.isFalse(navToDiffStub.called);
+          });
+
+          test('no previous', () => {
+            const commentMap = {};
+            commentMap[element._fileList[0]] = true;
+            commentMap[element._fileList[1]] = false;
+            commentMap[element._fileList[2]] = false;
+            element._commentMap = commentMap;
+            element._path = element._fileList[1];
+
+            element._moveToNextFileWithComment();
+            assert.isTrue(navToChangeStub.calledOnce);
+            assert.isFalse(navToDiffStub.called);
+          });
+
+          test('w/ previous', () => {
+            const commentMap = {};
+            commentMap[element._fileList[0]] = true;
+            commentMap[element._fileList[1]] = false;
+            commentMap[element._fileList[2]] = true;
+            element._commentMap = commentMap;
+            element._path = element._fileList[1];
+
+            element._moveToNextFileWithComment();
+            assert.isFalse(navToChangeStub.called);
+            assert.isTrue(navToDiffStub.calledOnce);
+          });
+        });
+      });
     });
 
-    test('_computeEditLoaded', () => {
-      const callCompute = range => element._computeEditLoaded({base: range});
+    test('_computeEditMode', () => {
+      const callCompute = range => element._computeEditMode({base: range});
       assert.isFalse(callCompute({}));
       assert.isFalse(callCompute({basePatchNum: 'PARENT', patchNum: 1}));
       assert.isFalse(callCompute({basePatchNum: 'edit', patchNum: 1}));
       assert.isTrue(callCompute({basePatchNum: 1, patchNum: 'edit'}));
     });
 
-    suite('editLoaded behavior', () => {
+    test('_computeFileNum', () => {
+      assert.equal(element._computeFileNum('/foo',
+          [{value: '/foo'}, {value: '/bar'}]), 1);
+      assert.equal(element._computeFileNum('/bar',
+          [{value: '/foo'}, {value: '/bar'}]), 2);
+    });
+
+    test('_computeFileNumClass', () => {
+      assert.equal(element._computeFileNumClass(0, []), '');
+      assert.equal(element._computeFileNumClass(1,
+          [{value: '/foo'}, {value: '/bar'}]), 'show');
+    });
+
+    test('_getReviewedStatus', () => {
+      const promises = [];
+      element.$.restAPI.getReviewedFiles.restore();
+
+      sandbox.stub(element.$.restAPI, 'getReviewedFiles')
+          .returns(Promise.resolve(['path']));
+
+      promises.push(element._getReviewedStatus(true, null, null, 'path')
+          .then(reviewed => assert.isFalse(reviewed)));
+
+      promises.push(element._getReviewedStatus(false, null, null, 'otherPath')
+          .then(reviewed => assert.isFalse(reviewed)));
+
+      promises.push(element._getReviewedStatus(false, null, null, 'path')
+          .then(reviewed => assert.isTrue(reviewed)));
+
+      return Promise.all(promises);
+    });
+
+    suite('editMode behavior', () => {
       setup(() => {
         element._loggedIn = true;
       });
@@ -788,5 +1093,36 @@
         assert.isFalse(isVisible(element.$.reviewed));
       });
     });
+
+    test('_paramsChanged sets in projectLookup', () => {
+      sandbox.stub(element, '_getLineOfInterest');
+      sandbox.stub(element, '_initCursor');
+      const setStub = sandbox.stub(element.$.restAPI, 'setInProjectLookup');
+      element._paramsChanged({
+        view: Gerrit.Nav.View.DIFF,
+        changeNum: 101,
+        project: 'test-project',
+        path: '',
+      });
+      assert.isTrue(setStub.calledOnce);
+      assert.isTrue(setStub.calledWith(101, 'test-project'));
+    });
+
+    test('shift+m navigates to next unreviewed file', () => {
+      element._fileList = ['file1', 'file2', 'file3'];
+      element._reviewedFiles = new Set(['file1', 'file2']);
+      element._path = 'file1';
+      const reviewedStub = sandbox.stub(element, '_setReviewed');
+      const navStub = sandbox.stub(element, '_navToFile');
+      MockInteractions.pressAndReleaseKeyOn(element, 77, 'shift', 'm');
+      flushAsynchronousOperations();
+
+      assert.isTrue(reviewedStub.lastCall.args[0]);
+      assert.deepEqual(navStub.lastCall.args, [
+        'file1',
+        ['file1', 'file3'],
+        1,
+      ]);
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff-group.js b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff-group.js
index 8d1cef6..88fcd0e 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff-group.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff-group.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function(window, GrDiffLine) {
   'use strict';
 
diff --git a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff-group_test.html b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff-group_test.html
index 32405cf..9dc5311 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff-group_test.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff-group_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff-line.js b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff-line.js
index 8db0c4f..44bb52a 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff-line.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff-line.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function(window) {
   'use strict';
 
@@ -22,8 +25,10 @@
     this.highlights = [];
   }
 
+  /** @type {number|string} */
   GrDiffLine.prototype.afterNumber = 0;
 
+  /** @type {number|string} */
   GrDiffLine.prototype.beforeNumber = 0;
 
   GrDiffLine.prototype.contextGroup = null;
diff --git a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.html b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.html
index b56835f..bddfc6d 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -15,32 +16,20 @@
 -->
 
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
-
 <link rel="import" href="../../../behaviors/gr-patch-set-behavior/gr-patch-set-behavior.html">
+<link rel="import" href="../../../styles/shared-styles.html">
 <link rel="import" href="../../shared/gr-button/gr-button.html">
-<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
 <link rel="import" href="../gr-diff-builder/gr-diff-builder.html">
 <link rel="import" href="../gr-diff-comment-thread/gr-diff-comment-thread.html">
 <link rel="import" href="../gr-diff-highlight/gr-diff-highlight.html">
 <link rel="import" href="../gr-diff-selection/gr-diff-selection.html">
-<link rel="import" href="../gr-syntax-themes/gr-theme-default.html">
-<link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../gr-syntax-themes/gr-syntax-theme.html">
 
 <script src="../../../scripts/hiddenscroll.js"></script>
 
 <dom-module id="gr-diff">
   <template>
     <style include="shared-styles">
-      :host {
-        --light-remove-highlight-color: #fee;
-        --dark-remove-highlight-color: rgba(255, 0, 0, 0.15);
-        --light-add-highlight-color: #efe;
-        --dark-add-highlight-color: rgba(0, 255, 0, 0.15);
-        --light-rebased-remove-highlight-color: #fff6ea;
-        --dark-rebased-remove-highlight-color: rgba(255, 139, 6, 0.15);
-        --light-rebased-add-highlight-color: #edfffa;
-        --dark-rebased-add-highlight-color: rgba(11, 255, 155, 0.15);
-      }
       :host(.no-left) .sideBySide ::content .left,
       :host(.no-left) .sideBySide ::content .left + td,
       :host(.no-left) .sideBySide ::content .right:not([data-value]),
@@ -48,30 +37,33 @@
         display: none;
       }
       .diffContainer {
-        border-bottom: 1px solid #eee;
-        border-top: 1px solid #eee;
         display: flex;
-        font: 12px var(--monospace-font-family);
+        font-family: var(--monospace-font-family);
+        @apply --diff-container-styles;
       }
       .diffContainer.hiddenscroll {
-        padding-bottom: .8em;
+        margin-bottom: .8em;
       }
       table {
         border-collapse: collapse;
-        border-right: 1px solid #ddd;
+        border-right: 1px solid var(--border-color);
         table-layout: fixed;
       }
       .lineNum {
-        background-color: #eee;
+        background-color: var(--table-header-background-color);
       }
       .image-diff .gr-diff {
         text-align: center;
       }
       .image-diff img {
+        box-shadow: 0 1px 3px rgba(0, 0, 0, .3);
         max-width: 50em;
-        outline: 1px solid #ccc;
       }
-      .image-diff label {
+      .image-diff .right.lineNum {
+        border-left: 1px solid var(--border-color);
+      }
+      .image-diff label,
+      .binary-diff label {
         font-family: var(--font-family);
         font-style: italic;
       }
@@ -81,16 +73,15 @@
       .diff-row.target-row.target-side-left .lineNum.left,
       .diff-row.target-row.target-side-right .lineNum.right,
       .diff-row.target-row.unified .lineNum {
-        background-color: #BBDEFB;
-      }
-      .diff-row.target-row.target-side-left .lineNum.left:before,
-      .diff-row.target-row.target-side-right .lineNum.right:before,
-      .diff-row.target-row.unified .lineNum:before {
-        color: #000;
+        background-color: var(--diff-selection-background-color);
+        color: var(--primary-text-color);
       }
       .blank,
       .content {
-        background-color: #fff;
+        background-color: var(--view-background-color);
+      }
+      .image-diff .content {
+        background-color: var(--table-header-background-color);
       }
       .full-width {
         width: 100%;
@@ -102,31 +93,28 @@
       .lineNum,
       .content {
         /* Set font size based the user's diff preference. */
-        font-size: var(--font-size, 12px);
+        font-size: var(--font-size, var(--font-size-normal));
         vertical-align: top;
         white-space: pre;
       }
-      .contextLineNum:before,
-      .lineNum:before {
-        box-sizing: border-box;
-        display: inline-block;
-        color: #666;
-        content: attr(data-value);
+      .contextLineNum,
+      .lineNum {
+        -webkit-user-select: none;
+        -moz-user-select: none;
+        -ms-user-select: none;
+        user-select: none;
+
+        color: var(--deemphasized-text-color);
         padding: 0 .5em;
         text-align: right;
-        width: 100%;
       }
-      .canComment .lineNum[data-value] {
+      .canComment .lineNum {
         cursor: pointer;
       }
-      .canComment .lineNum[data-value="FILE"]:before {
-        content: 'File';
-      }
       .content {
-        overflow: hidden;
-        /* Set max and min width since setting width on table cells still
-           allows them to shrink. */
-        max-width: var(--content-width, 80ch);
+        /* Set min width since setting width on table cells still
+           allows them to shrink. Do not set max width because
+           CJK (Chinese-Japanese-Korean) glyphs have variable width */
         min-width: var(--content-width, 80ch);
         width: var(--content-width, 80ch);
       }
@@ -156,26 +144,29 @@
         background-color: var(--dark-rebased-remove-highlight-color);
       }
       .dueToRebase .content.remove {
-        background-color: var(--light-rebased-remove-highlight-color);
+        background-color: var(--light-remove-add-highlight-color);
       }
       .content .contentText:empty:after {
         /* Newline, to ensure empty lines are one line-height tall. */
         content: '\A';
       }
       .contextControl {
-        background-color: #fef;
-        color: #849;
+        background-color: var(--diff-context-control-color);
+        border: 1px solid var(--diff-context-control-border-color);
       }
       .contextControl gr-button {
         display: inline-block;
-        font-family: var(--monospace-font-family);
         text-decoration: none;
+        --gr-button: {
+          color: var(--deemphasized-text-color);
+          padding: .2em;
+        }
       }
       .contextControl td:not(.lineNum) {
         text-align: center;
       }
       .displayLine .diff-row.target-row td {
-        box-shadow: inset 0 -1px #bbb;
+        box-shadow: inset 0 -1px var(--border-color);
       }
       .br:after {
         /* Line feed */
@@ -185,35 +176,41 @@
         display: inline-block;
       }
       .tab-indicator:before {
-        color: #C62828;
+        color: var(--diff-tab-indicator-color);
         /* >> character */
         content: '\00BB';
       }
       .trailing-whitespace {
         border-radius: .4em;
-        background-color: #FF9AD2;
+        background-color: var(--diff-trailing-whitespace-indicator);
       }
       #diffHeader {
-        background-color: #F9F9F9;
-        color: #2A00FF;
+        background-color: var(--table-header-background-color);
+        border-bottom: 1px solid var(--border-color);
+        color: var(--link-color);
         font-family: var(--monospace-font-family);
-        font-size: var(--font-size, 12px);
+        font-size: var(--font-size, var(--font-size-normal));
         padding: 0.5em 0 0.5em 4em;
       }
+      #loadingError,
       #sizeWarning {
         display: none;
         margin: 1em auto;
         max-width: 60em;
         text-align: center;
       }
+      #loadingError {
+        color: var(--error-text-color);
+      }
       #sizeWarning gr-button {
         margin: 1em;
       }
+      #loadingError.showError,
       #sizeWarning.warn {
         display: block;
       }
       .target-row td.blame {
-        background: #eee;
+        background: var(--diff-selection-background-color);
       }
       col.blame {
         display: none;
@@ -221,7 +218,7 @@
       td.blame {
         display: none;
         font-family: var(--font-family);
-        font-size: var(--font-size, 12px);
+        font-size: var(--font-size, var(--font-size-normal));
         padding: 0 .5em;
         white-space: pre;
       }
@@ -244,8 +241,28 @@
         overflow: hidden;
         width: 200px;
       }
+      /** Since the line limit position is determined by charachter size, blank
+       lines also need to have the same font size as everything else */
+      .full-width .blank {
+        font-size: var(--font-size, var(--font-size-normal));
+      }
+      /** Support the line length indicator **/
+      .full-width td.content,
+      .full-width td.blank {
+        /* Base 64 encoded 1x1px of #ddd */
+        background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mO8+x8AAr8B3gzOjaQAAAAASUVORK5CYII=');
+        background-position: var(--line-limit) 0;
+        background-repeat: repeat-y;
+      }
+      .newlineWarning {
+        color: var(--deemphasized-text-color);
+        text-align: center;
+      }
+      .newlineWarning.hidden {
+        display: none;
+      }
     </style>
-    <style include="gr-theme-default"></style>
+    <style include="gr-syntax-theme"></style>
     <div id="diffHeader" hidden$="[[_computeDiffHeaderHidden(_diffHeaderItems)]]">
       <template
           is="dom-repeat"
@@ -253,24 +270,29 @@
         <div>[[item]]</div>
       </template>
     </div>
-    <div class$="[[_computeContainerClass(_loggedIn, viewMode, displayLine)]]"
+    <div class$="[[_computeContainerClass(loggedIn, viewMode, displayLine)]]"
         on-tap="_handleTap">
-      <gr-diff-selection diff="[[_diff]]">
+      <gr-diff-selection diff="[[diff]]">
         <gr-diff-highlight
             id="highlights"
-            logged-in="[[_loggedIn]]"
+            logged-in="[[loggedIn]]"
             comments="{{comments}}">
           <gr-diff-builder
               id="diffBuilder"
               comments="[[comments]]"
               project-name="[[projectName]]"
-              diff="[[_diff]]"
+              diff="[[diff]]"
               diff-path="[[path]]"
+              change-num="[[changeNum]]"
+              patch-num="[[patchRange.patchNum]]"
               view-mode="[[viewMode]]"
               line-wrapping="[[lineWrapping]]"
               is-image-diff="[[isImageDiff]]"
-              base-image="[[_baseImage]]"
-              revision-image="[[_revisionImage]]">
+              base-image="[[baseImage]]"
+              revision-image="[[revisionImage]]"
+              parent-index="[[_parentIndex]]"
+              create-comment-fn="[[_createThreadGroupFn]]"
+              line-of-interest="[[lineOfInterest]]">
             <table
                 id="diffTable"
                 class$="[[_diffTableClass]]"
@@ -279,10 +301,16 @@
         </gr-diff-highlight>
       </gr-diff-selection>
     </div>
+    <div class$="[[_computeNewlineWarningClass(_newlineWarning, loading)]]">
+      [[_newlineWarning]]
+    </div>
+    <div id="loadingError" class$="[[_computeErrorClass(errorMessage)]]">
+      [[errorMessage]]
+    </div>
     <div id="sizeWarning" class$="[[_computeWarningClass(_showWarning)]]">
       <p>
         Prevented render because "Whole file" is enabled and this diff is very
-        large (about [[_diffLength(_diff)]] lines).
+        large (about [[_diffLength]] lines).
       </p>
       <gr-button on-tap="_handleLimitedBypass">
         Render with limited context
@@ -291,7 +319,6 @@
         Render anyway (may be slow)
       </gr-button>
     </div>
-    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
   </template>
   <script src="gr-diff-line.js"></script>
   <script src="gr-diff-group.js"></script>
diff --git a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.js b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.js
index c3add28..791d771 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.js
@@ -1,22 +1,29 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
   const ERR_COMMENT_ON_EDIT = 'You cannot comment on an edit.';
+  const ERR_COMMENT_ON_EDIT_BASE = 'You cannot comment on the base patch set ' +
+      'of an edit.';
   const ERR_INVALID_LINE = 'Invalid line number: ';
-  const MSG_EMPTY_BLAME = 'No blame information for this diff.';
+
+  const NO_NEWLINE_BASE = 'No newline at end of base file.';
+  const NO_NEWLINE_REVISION = 'No newline at end of revision file.';
 
   const DiffViewMode = {
     SIDE_BY_SIDE: 'SIDE_BY_SIDE',
@@ -32,6 +39,16 @@
   const FULL_CONTEXT = -1;
   const LIMITED_CONTEXT = 10;
 
+  const COMMIT_MSG_PATH = '/COMMIT_MSG';
+  /**
+   * 72 is the inofficial length standard for git commit messages.
+   * Derived from the fact that git log/show appends 4 ws in the beginning of
+   * each line when displaying commit messages. To center the commit message
+   * in an 80 char terminal a 4 ws border is added to the rightmost side:
+   * 4 + 72 + 4
+   */
+  const COMMIT_MSG_LINE_LENGTH = 72;
+
   Polymer({
     is: 'gr-diff',
 
@@ -46,12 +63,25 @@
      * @event show-auth-required
      */
 
+    /**
+     * Fired when a comment is saved or discarded
+     *
+     * @event diff-comments-modified
+     */
+
+     /**
+      * Fired when a draft is added or edited.
+      *
+      * @event draft-interaction
+      */
+
     properties: {
       changeNum: String,
       noAutoRender: {
         type: Boolean,
         value: false,
       },
+      /** @type {?} */
       patchRange: Object,
       path: String,
       prefs: {
@@ -69,20 +99,17 @@
       },
       isImageDiff: {
         type: Boolean,
-        computed: '_computeIsImageDiff(_diff)',
-        notify: true,
       },
-      filesWeblinks: {
-        type: Object,
-        value() { return {}; },
-        notify: true,
-      },
+      commitRange: Object,
       hidden: {
         type: Boolean,
         reflectToAttribute: true,
       },
       noRenderOnPrefsChange: Boolean,
-      comments: Object,
+      comments: {
+        type: Object,
+        value: {left: [], right: []},
+      },
       lineWrapping: {
         type: Boolean,
         value: false,
@@ -93,24 +120,43 @@
         value: DiffViewMode.SIDE_BY_SIDE,
         observer: '_viewModeObserver',
       },
-      _loggedIn: {
+
+      /**
+       * Special line number which should not be collapsed into a shared region.
+       * @type {{
+       *  number: number,
+       *  leftSide: {boolean}
+       * }|null}
+       */
+      lineOfInterest: Object,
+
+      loading: {
+        type: Boolean,
+        value: false,
+        observer: '_loadingChanged',
+      },
+
+      loggedIn: {
         type: Boolean,
         value: false,
       },
-      _diff: Object,
+      diff: {
+        type: Object,
+        observer: '_diffChanged',
+      },
       _diffHeaderItems: {
         type: Array,
         value: [],
-        computed: '_computeDiffHeaderItems(_diff.*)',
+        computed: '_computeDiffHeaderItems(diff.*)',
       },
       _diffTableClass: {
         type: String,
         value: '',
       },
       /** @type {?Object} */
-      _baseImage: Object,
+      baseImage: Object,
       /** @type {?Object} */
-      _revisionImage: Object,
+      revisionImage: Object,
 
       /**
        * Whether the safety check for large diffs when whole-file is set has
@@ -127,16 +173,40 @@
 
       _showWarning: Boolean,
 
-      /** @type {?Object} */
-      _blame: {
-        type: Object,
+      /** @type {?string} */
+      errorMessage: {
+        type: String,
         value: null,
       },
-      isBlameLoaded: {
-        type: Boolean,
-        notify: true,
-        computed: '_computeIsBlameLoaded(_blame)',
+
+      /** @type {?Object} */
+      blame: {
+        type: Object,
+        value: null,
+        observer: '_blameChanged',
       },
+
+      _parentIndex: {
+        type: Number,
+        computed: '_computeParentIndex(patchRange.*)',
+      },
+
+      _newlineWarning: {
+        type: String,
+        computed: '_computeNewlineWarning(diff)',
+      },
+
+      /**
+       * @type {function(number, boolean, !string)}
+       */
+      _createThreadGroupFn: {
+        type: Function,
+        value() {
+          return this._createCommentThreadGroup.bind(this);
+        },
+      },
+
+      _diffLength: Number,
     },
 
     behaviors: [
@@ -144,46 +214,15 @@
     ],
 
     listeners: {
-      'thread-discard': '_handleThreadDiscard',
       'comment-discard': '_handleCommentDiscard',
       'comment-update': '_handleCommentUpdate',
       'comment-save': '_handleCommentSave',
       'create-comment': '_handleCreateComment',
     },
 
-    attached() {
-      this._getLoggedIn().then(loggedIn => {
-        this._loggedIn = loggedIn;
-      });
-    },
-
-    ready() {
-      if (this._canRender()) {
-        this.reload();
-      }
-    },
-
-    /** @return {!Promise} */
-    reload() {
+    /** Cancel any remaining diff builder rendering work. */
+    cancel() {
       this.$.diffBuilder.cancel();
-      this.clearBlame();
-      this._safetyBypass = null;
-      this._showWarning = false;
-      this._clearDiffContent();
-
-      const promises = [];
-
-      promises.push(this._getDiff().then(diff => {
-        this._diff = diff;
-        return this._loadDiffAssets();
-      }));
-
-      return Promise.all(promises).then(() => {
-        if (this.prefs) {
-          return this._renderDiffTable();
-        }
-        return Promise.resolve();
-      });
     },
 
     /** @return {!Array<!HTMLElement>} */
@@ -204,48 +243,29 @@
       this.toggleClass('no-left');
     },
 
-    /**
-     * Load and display blame information for the base of the diff.
-     * @return {Promise} A promise that resolves when blame finishes rendering.
-     */
-    loadBlame() {
-      return this.$.restAPI.getBlame(this.changeNum, this.patchRange.patchNum,
-          this.path, true)
-          .then(blame => {
-            if (!blame.length) {
-              this.fire('show-alert', {message: MSG_EMPTY_BLAME});
-              return Promise.reject(MSG_EMPTY_BLAME);
-            }
-
-            this._blame = blame;
-
-            this.$.diffBuilder.setBlame(blame);
-            this.classList.add('showBlame');
-          });
+    _blameChanged(newValue) {
+      this.$.diffBuilder.setBlame(newValue);
+      if (newValue) {
+        this.classList.add('showBlame');
+      } else {
+        this.classList.remove('showBlame');
+      }
     },
 
-    _computeIsBlameLoaded(blame) {
-      return !!blame;
-    },
-
-    /**
-     * Unload blame information for the diff.
-     */
-    clearBlame() {
-      this._blame = null;
-      this.$.diffBuilder.setBlame(null);
-      this.classList.remove('showBlame');
-    },
-
-    /** @return {boolean}} */
-    _canRender() {
-      return !!this.changeNum && !!this.patchRange && !!this.path &&
-          !this.noAutoRender;
+    _handleCommentSaveOrDiscard() {
+      this.dispatchEvent(new CustomEvent('diff-comments-modified',
+          {bubbles: true}));
     },
 
     /** @return {!Array<!HTMLElement>} */
-    _getCommentThreads() {
-      return Polymer.dom(this.root).querySelectorAll('gr-diff-comment-thread');
+    getThreadEls() {
+      let threads = [];
+      const threadGroupEls = Polymer.dom(this.root)
+          .querySelectorAll('gr-diff-comment-thread-group');
+      for (const threadGroupEl of threadGroupEls) {
+        threads = threads.concat(threadGroupEl.threadEls);
+      }
+      return threads;
     },
 
     /** @return {string} */
@@ -274,7 +294,7 @@
     },
 
     _handleTap(e) {
-      const el = Polymer.dom(e).rootTarget;
+      const el = Polymer.dom(e).localTarget;
 
       if (el.classList.contains('showContext')) {
         this.$.diffBuilder.showContext(e.detail.groups, e.detail.section);
@@ -298,20 +318,18 @@
 
     addDraftAtLine(el) {
       this._selectLine(el);
-      this._isValidElForComment(el).then(valid => {
-        if (!valid) { return; }
+      if (!this._isValidElForComment(el)) { return; }
 
-        const value = el.getAttribute('data-value');
-        let lineNum;
-        if (value !== GrDiffLine.FILE) {
-          lineNum = parseInt(value, 10);
-          if (isNaN(lineNum)) {
-            this.fire('show-alert', {message: ERR_INVALID_LINE + value});
-            return;
-          }
+      const value = el.getAttribute('data-value');
+      let lineNum;
+      if (value !== GrDiffLine.FILE) {
+        lineNum = parseInt(value, 10);
+        if (isNaN(lineNum)) {
+          this.fire('show-alert', {message: ERR_INVALID_LINE + value});
+          return;
         }
-        this._createComment(el, lineNum);
-      });
+      }
+      this._createComment(el, lineNum);
     },
 
     _handleCreateComment(e) {
@@ -319,29 +337,34 @@
       const side = e.detail.side;
       const lineNum = range.endLine;
       const lineEl = this.$.diffBuilder.getLineElByNumber(lineNum, side);
-      this._isValidElForComment(lineEl).then(valid => {
-        if (!valid) { return; }
 
+      if (this._isValidElForComment(lineEl)) {
         this._createComment(lineEl, lineNum, side, range);
-      });
+      }
     },
 
+    /** @return {boolean} */
     _isValidElForComment(el) {
-      return this._getLoggedIn().then(loggedIn => {
-        if (!loggedIn) {
-          this.fire('show-auth-required');
-          return false;
-        }
-        const patchNum = el.classList.contains(DiffSide.LEFT) ?
-            this.patchRange.basePatchNum :
-            this.patchRange.patchNum;
+      if (!this.loggedIn) {
+        this.fire('show-auth-required');
+        return false;
+      }
+      const patchNum = el.classList.contains(DiffSide.LEFT) ?
+          this.patchRange.basePatchNum :
+          this.patchRange.patchNum;
 
-        if (this.patchNumEquals(patchNum, this.EDIT_NAME)) {
-          this.fire('show-alert', {message: ERR_COMMENT_ON_EDIT});
-          return false;
-        }
-        return true;
-      });
+      const isEdit = this.patchNumEquals(patchNum, this.EDIT_NAME);
+      const isEditBase = this.patchNumEquals(patchNum, this.PARENT_NAME) &&
+          this.patchNumEquals(this.patchRange.patchNum, this.EDIT_NAME);
+
+      if (isEdit) {
+        this.fire('show-alert', {message: ERR_COMMENT_ON_EDIT});
+        return false;
+      } else if (isEditBase) {
+        this.fire('show-alert', {message: ERR_COMMENT_ON_EDIT_BASE});
+        return false;
+      }
+      return true;
     },
 
     /**
@@ -351,6 +374,7 @@
      * @param {!Object=} opt_range
      */
     _createComment(lineEl, opt_lineNum, opt_side, opt_range) {
+      this.dispatchEvent(new CustomEvent('draft-interaction', {bubbles: true}));
       const contentText = this.$.diffBuilder.getContentByLineEl(lineEl);
       const contentEl = contentText.parentElement;
       const side = opt_side ||
@@ -358,13 +382,22 @@
       const patchNum = this._getPatchNumByLineAndContent(lineEl, contentEl);
       const isOnParent =
         this._getIsParentCommentByLineAndContent(lineEl, contentEl);
-      const threadEl = this._getOrCreateThreadAtLineRange(contentEl, patchNum,
+      const threadEl = this._getOrCreateThread(contentEl, patchNum,
           side, isOnParent, opt_range);
       threadEl.addOrEditDraft(opt_lineNum, opt_range);
     },
 
-    _getThreadForRange(threadGroupEl, rangeToCheck) {
-      return threadGroupEl.getThreadForRange(rangeToCheck);
+    /**
+     * Fetch the thread group at the given range, or the range-less thread
+     * on the line if no range is provided.
+     *
+     * @param {!Object} threadGroupEl
+     * @param {string} commentSide
+     * @param {!Object=} opt_range
+     * @return {!Object}
+     */
+    _getThread(threadGroupEl, commentSide, opt_range) {
+      return threadGroupEl.getThread(commentSide, opt_range);
     },
 
     _getThreadGroupForLine(contentEl) {
@@ -372,55 +405,76 @@
     },
 
     /**
-     * @param {string} commentSide
-     * @param {!Object=} opt_range
-     */
-    _getRangeString(commentSide, opt_range) {
-      return opt_range ?
-        'range-' +
-        opt_range.startLine + '-' +
-        opt_range.startChar + '-' +
-        opt_range.endLine + '-' +
-        opt_range.endChar + '-' +
-        commentSide : 'line-' + commentSide;
-    },
-
-    /**
+     * Gets or creates a comment thread for a specific spot on a diff.
+     * May include a range, if the comment is a range comment.
+     *
      * @param {!Object} contentEl
      * @param {number} patchNum
      * @param {string} commentSide
      * @param {boolean} isOnParent
      * @param {!Object=} opt_range
+     * @return {!Object}
      */
-    _getOrCreateThreadAtLineRange(contentEl, patchNum, commentSide,
+    _getOrCreateThread(contentEl, patchNum, commentSide,
         isOnParent, opt_range) {
-      const rangeToCheck = this._getRangeString(commentSide, opt_range);
-
       // Check if thread group exists.
       let threadGroupEl = this._getThreadGroupForLine(contentEl);
       if (!threadGroupEl) {
-        threadGroupEl = this.$.diffBuilder.createCommentThreadGroup(
-            this.changeNum, patchNum, this.path, isOnParent);
+        threadGroupEl = this._createCommentThreadGroup(patchNum, isOnParent,
+            commentSide);
         contentEl.appendChild(threadGroupEl);
       }
 
-      let threadEl = this._getThreadForRange(threadGroupEl, rangeToCheck);
+      let threadEl = this._getThread(threadGroupEl, commentSide, opt_range);
 
       if (!threadEl) {
-        threadGroupEl.addNewThread(rangeToCheck, commentSide);
+        threadGroupEl.addNewThread(commentSide, opt_range);
         Polymer.dom.flush();
-        threadEl = this._getThreadForRange(threadGroupEl, rangeToCheck);
-        threadEl.commentSide = commentSide;
+        threadEl = this._getThread(threadGroupEl, commentSide, opt_range);
       }
       return threadEl;
     },
 
-    /** @return {number} */
+    /**
+     * @param {number} patchNum
+     * @param {boolean} isOnParent
+     * @param {!string} commentSide
+     * @return {!Object}
+     */
+    _createCommentThreadGroup(patchNum, isOnParent, commentSide) {
+      const threadGroupEl =
+          document.createElement('gr-diff-comment-thread-group');
+      threadGroupEl.changeNum = this.changeNum;
+      threadGroupEl.commentSide = commentSide;
+      threadGroupEl.patchForNewThreads = patchNum;
+      threadGroupEl.path = this.path;
+      threadGroupEl.isOnParent = isOnParent;
+      threadGroupEl.projectName = this.projectName;
+      threadGroupEl.parentIndex = this._parentIndex;
+      return threadGroupEl;
+    },
+
+    /**
+     * The value to be used for the patch number of new comments created at the
+     * given line and content elements.
+     *
+     * In two cases of creating a comment on the left side, the patch number to
+     * be used should actually be right side of the patch range:
+     * - When the patch range is against the parent comment of a normal change.
+     *   Such comments declare themmselves to be on the left using side=PARENT.
+     * - If the patch range is against the indexed parent of a merge change.
+     *   Such comments declare themselves to be on the given parent by
+     *   specifying the parent index via parent=i.
+     *
+     * @return {number}
+     */
     _getPatchNumByLineAndContent(lineEl, contentEl) {
       let patchNum = this.patchRange.patchNum;
+
       if ((lineEl.classList.contains(DiffSide.LEFT) ||
           contentEl.classList.contains('remove')) &&
-          this.patchRange.basePatchNum !== 'PARENT') {
+          this.patchRange.basePatchNum !== 'PARENT' &&
+          !this.isMergeParent(this.patchRange.basePatchNum)) {
         patchNum = this.patchRange.basePatchNum;
       }
       return patchNum;
@@ -428,13 +482,13 @@
 
     /** @return {boolean} */
     _getIsParentCommentByLineAndContent(lineEl, contentEl) {
-      let isOnParent = false;
       if ((lineEl.classList.contains(DiffSide.LEFT) ||
           contentEl.classList.contains('remove')) &&
-          this.patchRange.basePatchNum === 'PARENT') {
-        isOnParent = true;
+          (this.patchRange.basePatchNum === 'PARENT' ||
+          this.isMergeParent(this.patchRange.basePatchNum))) {
+        return true;
       }
-      return isOnParent;
+      return false;
     },
 
     /** @return {string} */
@@ -447,14 +501,10 @@
       return side;
     },
 
-    _handleThreadDiscard(e) {
-      const el = Polymer.dom(e).rootTarget;
-      el.parentNode.removeThread(el.locationRange);
-    },
-
     _handleCommentDiscard(e) {
       const comment = e.detail.comment;
       this._removeComment(comment);
+      this._handleCommentSaveOrDiscard();
     },
 
     _removeComment(comment) {
@@ -467,6 +517,7 @@
       const side = e.detail.comment.__commentSide;
       const idx = this._findDraftIndex(comment, side);
       this.set(['comments', side, idx], comment);
+      this._handleCommentSaveOrDiscard();
     },
 
     /**
@@ -539,6 +590,17 @@
       this._prefsChanged(this.prefs);
     },
 
+    /** @param {boolean} newValue */
+    _loadingChanged(newValue) {
+      if (newValue) {
+        this.cancel();
+        this._blame = null;
+        this._safetyBypass = null;
+        this._showWarning = false;
+        this.clearDiffContent();
+      }
+    },
+
     _lineWrappingObserver() {
       this._prefsChanged(this.prefs);
     },
@@ -546,18 +608,21 @@
     _prefsChanged(prefs) {
       if (!prefs) { return; }
 
-      this.clearBlame();
+      this._blame = null;
 
+      const lineLength = this.path === COMMIT_MSG_PATH ?
+        COMMIT_MSG_LINE_LENGTH : prefs.line_length;
       const stylesToUpdate = {};
 
       if (prefs.line_wrapping) {
         this._diffTableClass = 'full-width';
         if (this.viewMode === 'SIDE_BY_SIDE') {
           stylesToUpdate['--content-width'] = 'none';
+          stylesToUpdate['--line-limit'] = lineLength + 'ch';
         }
       } else {
         this._diffTableClass = '';
-        stylesToUpdate['--content-width'] = prefs.line_length + 'ch';
+        stylesToUpdate['--content-width'] = lineLength + 'ch';
       }
 
       if (prefs.font_size) {
@@ -566,21 +631,33 @@
 
       this.updateStyles(stylesToUpdate);
 
-      if (this._diff && this.comments && !this.noRenderOnPrefsChange) {
+      if (this.diff && this.comments && !this.noRenderOnPrefsChange) {
+        this._renderDiffTable();
+      }
+    },
+
+    _diffChanged(newValue) {
+      if (newValue) {
+        this._diffLength = this.$.diffBuilder.getDiffLength();
         this._renderDiffTable();
       }
     },
 
     _renderDiffTable() {
+      if (!this.prefs) {
+        this.dispatchEvent(new CustomEvent('render', {bubbles: true}));
+        return;
+      }
       if (this.prefs.context === -1 &&
-          this._diffLength(this._diff) >= LARGE_DIFF_THRESHOLD_LINES &&
+          this._diffLength >= LARGE_DIFF_THRESHOLD_LINES &&
           this._safetyBypass === null) {
         this._showWarning = true;
-        return Promise.resolve();
+        this.dispatchEvent(new CustomEvent('render', {bubbles: true}));
+        return;
       }
 
       this._showWarning = false;
-      return this.$.diffBuilder.render(this.comments, this._getBypassPrefs());
+      this.$.diffBuilder.render(this.comments, this._getBypassPrefs());
     },
 
     /**
@@ -593,75 +670,12 @@
       return this.prefs;
     },
 
-    _clearDiffContent() {
+    clearDiffContent() {
       this.$.diffTable.innerHTML = null;
     },
 
-    _handleGetDiffError(response) {
-      // Loading the diff may respond with 409 if the file is too large. In this
-      // case, use a toast error..
-      if (response.status === 409) {
-        this.fire('server-error', {response});
-        return;
-      }
-      this.fire('page-error', {response});
-    },
-
-    /** @return {!Promise<!Object>} */
-    _getDiff() {
-      return this.$.restAPI.getDiff(
-          this.changeNum,
-          this.patchRange.basePatchNum,
-          this.patchRange.patchNum,
-          this.path,
-          this._handleGetDiffError.bind(this)).then(diff => {
-            this.filesWeblinks = {
-              meta_a: diff && diff.meta_a && diff.meta_a.web_links,
-              meta_b: diff && diff.meta_b && diff.meta_b.web_links,
-            };
-            return diff;
-          });
-    },
-
-    /** @return {!Promise} */
-    _getLoggedIn() {
-      return this.$.restAPI.getLoggedIn();
-    },
-
-    /** @return {boolean} */
-    _computeIsImageDiff() {
-      if (!this._diff) { return false; }
-
-      const isA = this._diff.meta_a &&
-          this._diff.meta_a.content_type.startsWith('image/');
-      const isB = this._diff.meta_b &&
-          this._diff.meta_b.content_type.startsWith('image/');
-
-      return !!(this._diff.binary && (isA || isB));
-    },
-
-    /** @return {!Promise} */
-    _loadDiffAssets() {
-      if (this.isImageDiff) {
-        return this._getImages().then(images => {
-          this._baseImage = images.baseImage;
-          this._revisionImage = images.revisionImage;
-        });
-      } else {
-        this._baseImage = null;
-        this._revisionImage = null;
-        return Promise.resolve();
-      }
-    },
-
-    /** @return {!Promise} */
-    _getImages() {
-      return this.$.restAPI.getImagesForDiff(this.changeNum, this._diff,
-          this.patchRange);
-    },
-
     _projectConfigChanged(projectConfig) {
-      const threadEls = this._getCommentThreads();
+      const threadEls = this.getThreadEls();
       for (let i = 0; i < threadEls.length; i++) {
         threadEls[i].projectConfig = projectConfig;
       }
@@ -670,12 +684,13 @@
     /** @return {!Array} */
     _computeDiffHeaderItems(diffInfoRecord) {
       const diffInfo = diffInfoRecord.base;
-      if (!diffInfo || !diffInfo.diff_header || diffInfo.binary) { return []; }
+      if (!diffInfo || !diffInfo.diff_header) { return []; }
       return diffInfo.diff_header.filter(item => {
         return !(item.startsWith('diff --git ') ||
             item.startsWith('index ') ||
             item.startsWith('+++ ') ||
-            item.startsWith('--- '));
+            item.startsWith('--- ') ||
+            item === 'Binary files differ');
       });
     },
 
@@ -684,25 +699,6 @@
       return items.length === 0;
     },
 
-    /**
-     * The number of lines in the diff. For delta chunks that are different
-     * sizes on the left and the right, the longer side is used.
-     * @param {!Object} diff
-     * @return {number}
-     */
-    _diffLength(diff) {
-      return diff.content.reduce((sum, sec) => {
-        if (sec.hasOwnProperty('ab')) {
-          return sum + sec.ab.length;
-        } else {
-          return sum + Math.max(
-              sec.hasOwnProperty('a') ? sec.a.length : 0,
-              sec.hasOwnProperty('b') ? sec.b.length : 0
-          );
-        }
-      }, 0);
-    },
-
     _handleFullBypass() {
       this._safetyBypass = FULL_CONTEXT;
       this._renderDiffTable();
@@ -717,5 +713,111 @@
     _computeWarningClass(showWarning) {
       return showWarning ? 'warn' : '';
     },
+
+    /**
+     * @param {string} errorMessage
+     * @return {string}
+     */
+    _computeErrorClass(errorMessage) {
+      return errorMessage ? 'showError' : '';
+    },
+
+    /**
+     * @return {number|null}
+     */
+    _computeParentIndex(patchRangeRecord) {
+      if (!this.isMergeParent(patchRangeRecord.base.basePatchNum)) {
+        return null;
+      }
+      return this.getParentIndex(patchRangeRecord.base.basePatchNum);
+    },
+
+    expandAllContext() {
+      this._handleFullBypass();
+    },
+
+    /**
+     * Find the last chunk for the given side.
+     * @param {!Object} diff
+     * @param {boolean} leftSide true if checking the base of the diff,
+     *     false if testing the revision.
+     * @return {Object|null} returns the chunk object or null if there was
+     *     no chunk for that side.
+     */
+    _lastChunkForSide(diff, leftSide) {
+      if (!diff.content.length) { return null; }
+
+      let chunkIndex = diff.content.length;
+      let chunk;
+
+      // Walk backwards until we find a chunk for the given side.
+      do {
+        chunkIndex--;
+        chunk = diff.content[chunkIndex];
+      } while (
+          // We haven't reached the beginning.
+          chunkIndex >= 0 &&
+
+          // The chunk doesn't have both sides.
+          !chunk.ab &&
+
+          // The chunk doesn't have the given side.
+          ((leftSide && !chunk.a) || (!leftSide && !chunk.b)));
+
+      // If we reached the beginning of the diff and failed to find a chunk
+      // with the given side, return null.
+      if (chunkIndex === -1) { return null; }
+
+      return chunk;
+    },
+
+    /**
+     * Check whether the specified side of the diff has a trailing newline.
+     * @param {!Object} diff
+     * @param {boolean} leftSide true if checking the base of the diff,
+     *     false if testing the revision.
+     * @return {boolean|null} Return true if the side has a trailing newline.
+     *     Return false if it doesn't. Return null if not applicable (for
+     *     example, if the diff has no content on the specified side).
+     */
+    _hasTrailingNewlines(diff, leftSide) {
+      const chunk = this._lastChunkForSide(diff, leftSide);
+      if (!chunk) { return null; }
+      let lines;
+      if (chunk.ab) {
+        lines = chunk.ab;
+      } else {
+        lines = leftSide ? chunk.a : chunk.b;
+      }
+      return lines[lines.length - 1] === '';
+    },
+
+    /**
+     * @param {!Object} diff
+     * @return {string|null}
+     */
+    _computeNewlineWarning(diff) {
+      const hasLeft = this._hasTrailingNewlines(diff, true);
+      const hasRight = this._hasTrailingNewlines(diff, false);
+      const messages = [];
+      if (hasLeft === false) {
+        messages.push(NO_NEWLINE_BASE);
+      }
+      if (hasRight === false) {
+        messages.push(NO_NEWLINE_REVISION);
+      }
+      if (!messages.length) { return null; }
+      return messages.join(' — ');
+    },
+
+    /**
+     * @param {string} warning
+     * @param {boolean} loading
+     * @return {string}
+     */
+    _computeNewlineWarningClass(warning, loading) {
+      if (loading || !warning) { return 'newlineWarning hidden'; }
+      return 'newlineWarning';
+    },
   });
 })();
diff --git a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff_test.html b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff_test.html
index e422354..faf529b 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff_test.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -47,29 +48,120 @@
       sandbox.restore();
     });
 
-    test('reload cancels before network resolves', () => {
+    test('cancel', () => {
       element = fixture('basic');
       const cancelStub = sandbox.stub(element.$.diffBuilder, 'cancel');
-
-      // Stub the network calls into requests that never resolve.
-      sandbox.stub(element, '_getDiff', () => new Promise(() => {}));
-
-      element.reload();
-      assert.isTrue(cancelStub.called);
+      element.cancel();
+      assert.isTrue(cancelStub.calledOnce);
     });
 
-    test('_diffLength', () => {
+    test('line limit with line_wrapping', () => {
       element = fixture('basic');
-      const mock = document.createElement('mock-diff-response');
-      assert.equal(element._diffLength(mock.diffResponse), 52);
+      element.prefs = {line_wrapping: true, line_length: 80, tab_size: 2};
+      flushAsynchronousOperations();
+      assert.equal(element.customStyle['--line-limit'], '80ch');
+    });
+
+    test('line limit without line_wrapping', () => {
+      element = fixture('basic');
+      element.prefs = {line_wrapping: false, line_length: 80, tab_size: 2};
+      flushAsynchronousOperations();
+      assert.isNotOk(element.customStyle['--line-limit']);
+    });
+
+    suite('_get{PatchNum|IsParentComment}ByLineAndContent', () => {
+      let lineEl;
+      let contentEl;
+
+      setup(() => {
+        element = fixture('basic');
+        lineEl = document.createElement('td');
+        contentEl = document.createElement('span');
+      });
+
+      suite('_getPatchNumByLineAndContent', () => {
+        test('right side', () => {
+          element.patchRange = {patchNum: 4, basePatchNum: 'PARENT'};
+          lineEl.classList.add('right');
+          assert.equal(element._getPatchNumByLineAndContent(lineEl, contentEl),
+              4);
+        });
+
+        test('left side parent by linenum', () => {
+          element.patchRange = {patchNum: 4, basePatchNum: 'PARENT'};
+          lineEl.classList.add('left');
+          assert.equal(element._getPatchNumByLineAndContent(lineEl, contentEl),
+              4);
+        });
+
+        test('left side parent by content', () => {
+          element.patchRange = {patchNum: 4, basePatchNum: 'PARENT'};
+          contentEl.classList.add('remove');
+          assert.equal(element._getPatchNumByLineAndContent(lineEl, contentEl),
+              4);
+        });
+
+        test('left side merge parent', () => {
+          element.patchRange = {patchNum: 4, basePatchNum: -2};
+          contentEl.classList.add('remove');
+          assert.equal(element._getPatchNumByLineAndContent(lineEl, contentEl),
+              4);
+        });
+
+        test('left side non parent', () => {
+          element.patchRange = {patchNum: 4, basePatchNum: 3};
+          contentEl.classList.add('remove');
+          assert.equal(element._getPatchNumByLineAndContent(lineEl, contentEl),
+              3);
+        });
+      });
+
+      suite('_getIsParentCommentByLineAndContent', () => {
+        test('right side', () => {
+          element.patchRange = {patchNum: 4, basePatchNum: 'PARENT'};
+          lineEl.classList.add('right');
+          assert.isFalse(
+              element._getIsParentCommentByLineAndContent(lineEl, contentEl));
+        });
+
+        test('left side parent by linenum', () => {
+          element.patchRange = {patchNum: 4, basePatchNum: 'PARENT'};
+          lineEl.classList.add('left');
+          assert.isTrue(
+              element._getIsParentCommentByLineAndContent(lineEl, contentEl));
+        });
+
+        test('left side parent by content', () => {
+          element.patchRange = {patchNum: 4, basePatchNum: 'PARENT'};
+          contentEl.classList.add('remove');
+          assert.isTrue(
+              element._getIsParentCommentByLineAndContent(lineEl, contentEl));
+        });
+
+        test('left side merge parent', () => {
+          element.patchRange = {patchNum: 4, basePatchNum: -2};
+          contentEl.classList.add('remove');
+          assert.isTrue(
+              element._getIsParentCommentByLineAndContent(lineEl, contentEl));
+        });
+
+        test('left side non parent', () => {
+          element.patchRange = {patchNum: 4, basePatchNum: 3};
+          contentEl.classList.add('remove');
+          assert.isFalse(
+              element._getIsParentCommentByLineAndContent(lineEl, contentEl));
+        });
+      });
     });
 
     suite('not logged in', () => {
       setup(() => {
+        const getLoggedInPromise = Promise.resolve(false);
         stub('gr-rest-api-interface', {
-          getLoggedIn() { return Promise.resolve(false); },
+          getLoggedIn() { return getLoggedInPromise; },
         });
         element = fixture('basic');
+        return getLoggedInPromise;
       });
 
       test('toggleLeftDiff', () => {
@@ -79,15 +171,12 @@
         assert.isFalse(element.classList.contains('no-left'));
       });
 
-      test('addDraftAtLine', done => {
+      test('addDraftAtLine', () => {
         sandbox.stub(element, '_selectLine');
         const loggedInErrorSpy = sandbox.spy();
         element.addEventListener('show-auth-required', loggedInErrorSpy);
         element.addDraftAtLine();
-        flush(() => {
-          assert.isTrue(loggedInErrorSpy.called);
-          done();
-        });
+        assert.isTrue(loggedInErrorSpy.called);
       });
 
       test('view does not start with displayLine classList', () => {
@@ -103,26 +192,6 @@
             element.$$('.diffContainer').classList.contains('displayLine'));
       });
 
-      test('loads files weblinks', done => {
-        sandbox.stub(element.$.restAPI, 'getDiff').returns(
-            Promise.resolve({
-              meta_a: {
-                web_links: 'foo',
-              },
-              meta_b: {
-                web_links: 'bar',
-              },
-            }));
-        element.patchRange = {};
-        element._getDiff().then(() => {
-          assert.deepEqual(element.filesWeblinks, {
-            meta_a: 'foo',
-            meta_b: 'bar',
-          });
-          done();
-        });
-      });
-
       test('remove comment', () => {
         element.comments = {
           meta: {
@@ -224,20 +293,6 @@
         });
       });
 
-      test('_getRangeString', () => {
-        const side = 'PARENT';
-        const range = {
-          startLine: 1,
-          startChar: 1,
-          endLine: 1,
-          endChar: 2,
-        };
-        assert.equal(element._getRangeString(side, range),
-            'range-1-1-1-2-PARENT');
-        assert.equal(element._getRangeString(side, null),
-            'line-PARENT');
-      }),
-
       test('thread groups', () => {
         const contentEl = document.createElement('div');
         const commentSide = 'left';
@@ -254,18 +309,15 @@
         element.patchRange = {basePatchNum: 1, patchNum: 2};
         element.path = 'file.txt';
 
-        sandbox.stub(element.$.diffBuilder, 'createCommentThreadGroup', () => {
-          const threadGroup =
-          document.createElement('gr-diff-comment-thread-group');
-          threadGroup.patchForNewThreads = 1;
-          return threadGroup;
-        });
+        const mock = document.createElement('mock-diff-response');
+        element.$.diffBuilder._builder = element.$.diffBuilder._getDiffBuilder(
+            mock.diffResponse, {}, {tab_size: 2, line_length: 80});
 
         // No thread groups.
         assert.isNotOk(element._getThreadGroupForLine(contentEl));
 
         // A thread group gets created.
-        assert.isOk(element._getOrCreateThreadAtLineRange(contentEl,
+        assert.isOk(element._getOrCreateThread(contentEl,
             patchNum, commentSide, side));
 
         // Try to fetch a thread with a different range.
@@ -276,7 +328,7 @@
           endChar: 3,
         };
 
-        assert.isOk(element._getOrCreateThreadAtLineRange(
+        assert.isOk(element._getOrCreateThread(
             contentEl, patchNum, commentSide, side, range));
         // The new thread group can be fetched.
         assert.isOk(element._getThreadGroupForLine(contentEl));
@@ -294,7 +346,6 @@
       suite('image diffs', () => {
         let mockFile1;
         let mockFile2;
-        const stubs = [];
         setup(() => {
           mockFile1 = {
             body: 'Qk06AAAAAAAAADYAAAAoAAAAAQAAAP////8BACAAAAAAAAAAAAATCwAAE' +
@@ -306,66 +357,29 @@
             'wsAAAAAAAAAAAAA/////w==',
             type: 'image/bmp',
           };
-          const mockCommit = {
-            commit: '9a1a1d10baece5efbba10bc4ccf808a67a50ac0a',
-            parents: [{
-              commit: '7338aa9adfe57909f1fdaf88975cdea467d3382f',
-              subject: 'Added a carrot',
-            }],
-            author: {
-              name: 'Wyatt Allen',
-              email: 'wyatta@google.com',
-              date: '2016-05-23 21:44:51.000000000',
-              tz: -420,
-            },
-            committer: {
-              name: 'Wyatt Allen',
-              email: 'wyatta@google.com',
-              date: '2016-05-25 00:25:41.000000000',
-              tz: -420,
-            },
-            subject: 'Updated the carrot',
-            message: 'Updated the carrot\n\nChange-Id: Iabcd123\n',
-          };
-          const mockComments = {baseComments: [], comments: []};
-
-          stubs.push(sandbox.stub(element.$.restAPI, 'getCommitInfo',
-              () => Promise.resolve(mockCommit)));
-          stubs.push(sandbox.stub(element.$.restAPI,
-              'getChangeFileContents',
-              (changeId, patchNum, path, opt_parentIndex) => {
-                return Promise.resolve(opt_parentIndex === 1 ? mockFile1 :
-                    mockFile2);
-              }));
-          stubs.push(sandbox.stub(element.$.restAPI, '_getDiffComments',
-              () => Promise.resolve(mockComments)));
-          stubs.push(sandbox.stub(element.$.restAPI, 'getDiffDrafts',
-              () => Promise.resolve(mockComments)));
 
           element.patchRange = {basePatchNum: 'PARENT', patchNum: 1};
           element.comments = {left: [], right: []};
+          element.isImageDiff = true;
+          element.prefs = {
+            auto_hide_diff_table_header: true,
+            context: 10,
+            cursor_blink_rate: 0,
+            font_size: 12,
+            ignore_whitespace: 'IGNORE_NONE',
+            intraline_difference: true,
+            line_length: 100,
+            line_wrapping: false,
+            show_line_endings: true,
+            show_tabs: true,
+            show_whitespace_errors: true,
+            syntax_highlighting: true,
+            tab_size: 8,
+            theme: 'DEFAULT',
+          };
         });
 
         test('renders image diffs with same file name', done => {
-          const mockDiff = {
-            meta_a: {name: 'carrot.jpg', content_type: 'image/jpeg', lines: 66},
-            meta_b: {name: 'carrot.jpg', content_type: 'image/jpeg',
-              lines: 560},
-            intraline_status: 'OK',
-            change_type: 'MODIFIED',
-            diff_header: [
-              'diff --git a/carrot.jpg b/carrot.jpg',
-              'index 2adc47d..f9c2f2c 100644',
-              '--- a/carrot.jpg',
-              '+++ b/carrot.jpg',
-              'Binary files differ',
-            ],
-            content: [{skip: 66}],
-            binary: true,
-          };
-          stubs.push(sandbox.stub(element, '_getDiff',
-              () => Promise.resolve(mockDiff)));
-
           const rendered = () => {
             // Recognizes that it should be an image diff.
             assert.isTrue(element.isImageDiff);
@@ -396,7 +410,7 @@
               assert.isOk(leftImage);
               assert.equal(leftImage.getAttribute('src'),
                   'data:image/bmp;base64, ' + mockFile1.body);
-              assert.equal(leftLabelContent.textContent, '1⨉1 image/bmp');
+              assert.equal(leftLabelContent.textContent, '1×1 image/bmp');
               leftLoaded = true;
               if (rightLoaded) {
                 element.removeEventListener('render', rendered);
@@ -408,7 +422,7 @@
               assert.isOk(rightImage);
               assert.equal(rightImage.getAttribute('src'),
                   'data:image/bmp;base64, ' + mockFile2.body);
-              assert.equal(rightLabelContent.textContent, '1⨉1 image/bmp');
+              assert.equal(rightLabelContent.textContent, '1×1 image/bmp');
 
               rightLoaded = true;
               if (leftLoaded) {
@@ -420,10 +434,24 @@
 
           element.addEventListener('render', rendered);
 
-          element.$.restAPI.getDiffPreferences().then(prefs => {
-            element.prefs = prefs;
-            element.reload();
-          });
+          element.baseImage = mockFile1;
+          element.revisionImage = mockFile2;
+          element.diff = {
+            meta_a: {name: 'carrot.jpg', content_type: 'image/jpeg', lines: 66},
+            meta_b: {name: 'carrot.jpg', content_type: 'image/jpeg',
+              lines: 560},
+            intraline_status: 'OK',
+            change_type: 'MODIFIED',
+            diff_header: [
+              'diff --git a/carrot.jpg b/carrot.jpg',
+              'index 2adc47d..f9c2f2c 100644',
+              '--- a/carrot.jpg',
+              '+++ b/carrot.jpg',
+              'Binary files differ',
+            ],
+            content: [{skip: 66}],
+            binary: true,
+          };
         });
 
         test('renders image diffs with a different file name', done => {
@@ -443,8 +471,6 @@
             content: [{skip: 66}],
             binary: true,
           };
-          stubs.push(sandbox.stub(element, '_getDiff',
-              () => Promise.resolve(mockDiff)));
 
           const rendered = () => {
             // Recognizes that it should be an image diff.
@@ -478,7 +504,7 @@
               assert.isOk(leftImage);
               assert.equal(leftImage.getAttribute('src'),
                   'data:image/bmp;base64, ' + mockFile1.body);
-              assert.equal(leftLabelContent.textContent, '1⨉1 image/bmp');
+              assert.equal(leftLabelContent.textContent, '1×1 image/bmp');
               leftLoaded = true;
               if (rightLoaded) {
                 element.removeEventListener('render', rendered);
@@ -490,7 +516,7 @@
               assert.isOk(rightImage);
               assert.equal(rightImage.getAttribute('src'),
                   'data:image/bmp;base64, ' + mockFile2.body);
-              assert.equal(rightLabelContent.textContent, '1⨉1 image/bmp');
+              assert.equal(rightLabelContent.textContent, '1×1 image/bmp');
 
               rightLoaded = true;
               if (leftLoaded) {
@@ -502,10 +528,11 @@
 
           element.addEventListener('render', rendered);
 
-          element.$.restAPI.getDiffPreferences().then(prefs => {
-            element.prefs = prefs;
-            element.reload();
-          });
+          element.baseImage = mockFile1;
+          element.baseImage._name = mockDiff.meta_a.name;
+          element.revisionImage = mockFile2;
+          element.revisionImage._name = mockDiff.meta_b.name;
+          element.diff = mockDiff;
         });
 
         test('renders added image', done => {
@@ -524,8 +551,6 @@
             content: [{skip: 66}],
             binary: true,
           };
-          stubs.push(sandbox.stub(element, '_getDiff',
-              () => Promise.resolve(mockDiff)));
 
           element.addEventListener('render', () => {
             // Recognizes that it should be an image diff.
@@ -541,10 +566,8 @@
             done();
           });
 
-          element.$.restAPI.getDiffPreferences().then(prefs => {
-            element.prefs = prefs;
-            element.reload();
-          });
+          element.revisionImage = mockFile2;
+          element.diff = mockDiff;
         });
 
         test('renders removed image', done => {
@@ -563,8 +586,6 @@
             content: [{skip: 66}],
             binary: true,
           };
-          stubs.push(sandbox.stub(element, '_getDiff',
-              () => Promise.resolve(mockDiff)));
 
           element.addEventListener('render', () => {
             // Recognizes that it should be an image diff.
@@ -580,10 +601,8 @@
             done();
           });
 
-          element.$.restAPI.getDiffPreferences().then(prefs => {
-            element.prefs = prefs;
-            element.reload();
-          });
+          element.baseImage = mockFile1;
+          element.diff = mockDiff;
         });
 
         test('does not render disallowed image type', done => {
@@ -604,9 +623,6 @@
           };
           mockFile1.type = 'image/jpeg-evil';
 
-          stubs.push(sandbox.stub(element, '_getDiff',
-              () => Promise.resolve(mockDiff)));
-
           element.addEventListener('render', () => {
             // Recognizes that it should be an image diff.
             assert.isTrue(element.isImageDiff);
@@ -617,10 +633,8 @@
             done();
           });
 
-          element.$.restAPI.getDiffPreferences().then(prefs => {
-            element.prefs = prefs;
-            element.reload();
-          });
+          element.baseImage = mockFile1;
+          element.diff = mockDiff;
         });
       });
 
@@ -667,20 +681,10 @@
         content.click();
       });
 
-      test('_getDiff handles null diff responses', done => {
-        stub('gr-rest-api-interface', {
-          getDiff() { return Promise.resolve(null); },
-        });
-        element.changeNum = 123;
-        element.patchRange = {basePatchNum: 1, patchNum: 2};
-        element.path = 'file.txt';
-        element._getDiff().then(done);
-      });
-
       suite('getCursorStops', () => {
         const setupDiff = function() {
           const mock = document.createElement('mock-diff-response');
-          element._diff = mock.diffResponse;
+          element.diff = mock.diffResponse;
           element.comments = {
             left: [],
             right: [],
@@ -729,13 +733,8 @@
     suite('logged in', () => {
       let fakeLineEl;
       setup(() => {
-        stub('gr-rest-api-interface', {
-          getLoggedIn() { return Promise.resolve(true); },
-          getPreferences() {
-            return Promise.resolve({time_format: 'HHMM_12'});
-          },
-        });
         element = fixture('basic');
+        element.loggedIn = true;
         element.patchRange = {};
 
         fakeLineEl = {
@@ -746,40 +745,40 @@
         };
       });
 
-      test('addDraftAtLine', done => {
+      test('addDraftAtLine', () => {
         sandbox.stub(element, '_selectLine');
         sandbox.stub(element, '_createComment');
-        const loggedInErrorSpy = sandbox.spy();
-        element.addEventListener('show-auth-required', loggedInErrorSpy);
         element.addDraftAtLine(fakeLineEl);
-        flush(() => {
-          assert.isFalse(loggedInErrorSpy.called);
-          assert.isTrue(element._createComment
-              .calledWithExactly(fakeLineEl, 42));
-          done();
-        });
+        assert.isTrue(element._createComment
+            .calledWithExactly(fakeLineEl, 42));
       });
 
-      test('addDraftAtLine on an edit', done => {
+      test('addDraftAtLine on an edit', () => {
         element.patchRange.basePatchNum = element.EDIT_NAME;
         sandbox.stub(element, '_selectLine');
         sandbox.stub(element, '_createComment');
-        const loggedInErrorSpy = sandbox.spy();
         const alertSpy = sandbox.spy();
-        element.addEventListener('show-auth-required', loggedInErrorSpy);
         element.addEventListener('show-alert', alertSpy);
         element.addDraftAtLine(fakeLineEl);
-        flush(() => {
-          assert.isFalse(loggedInErrorSpy.called);
-          assert.isTrue(alertSpy.called);
-          assert.isFalse(element._createComment.called);
-          done();
-        });
+        assert.isTrue(alertSpy.called);
+        assert.isFalse(element._createComment.called);
+      });
+
+      test('addDraftAtLine on an edit base', () => {
+        element.patchRange.patchNum = element.EDIT_NAME;
+        element.patchRange.basePatchNum = element.PARENT_NAME;
+        sandbox.stub(element, '_selectLine');
+        sandbox.stub(element, '_createComment');
+        const alertSpy = sandbox.spy();
+        element.addEventListener('show-alert', alertSpy);
+        element.addDraftAtLine(fakeLineEl);
+        assert.isTrue(alertSpy.called);
+        assert.isFalse(element._createComment.called);
       });
 
       suite('change in preferences', () => {
         setup(() => {
-          element._diff = {
+          element.diff = {
             meta_a: {name: 'carrot.jpg', content_type: 'image/jpeg', lines: 66},
             meta_b: {name: 'carrot.jpg', content_type: 'image/jpeg',
               lines: 560},
@@ -864,6 +863,28 @@
           assert.include(element.comments.left, comment);
         });
 
+        test('discarding a draft', () => {
+          const draftID = 'tempID';
+          const id = 'savedID';
+          const comment = {
+            __draft: true,
+            __draftID: draftID,
+            side: 'PARENT',
+            __commentSide: 'left',
+          };
+          const diffCommentsModifiedStub = sandbox.stub();
+          element.addEventListener('diff-comments-modified',
+              diffCommentsModifiedStub);
+          element.comments.left.push(comment);
+          comment.id = id;
+          element.fire('comment-discard', {comment});
+          const drafts = element.comments.left.filter(item => {
+            return item.__draftID === draftID;
+          });
+          assert.equal(drafts.length, 0);
+          assert.isTrue(diffCommentsModifiedStub.called);
+        });
+
         test('saving a draft', () => {
           const draftID = 'tempID';
           const id = 'savedID';
@@ -873,21 +894,26 @@
             side: 'PARENT',
             __commentSide: 'left',
           };
+          const diffCommentsModifiedStub = sandbox.stub();
+          element.addEventListener('diff-comments-modified',
+              diffCommentsModifiedStub);
           element.comments.left.push(comment);
           comment.id = id;
-          element.fire('comment-update', {comment});
+          element.fire('comment-save', {comment});
           const drafts = element.comments.left.filter(item => {
             return item.__draftID === draftID;
           });
           assert.equal(drafts.length, 1);
           assert.equal(drafts[0].id, id);
+          assert.isTrue(diffCommentsModifiedStub.called);
         });
       });
     });
 
     suite('diff header', () => {
       setup(() => {
-        element._diff = {
+        element = fixture('basic');
+        element.diff = {
           meta_a: {name: 'carrot.jpg', content_type: 'image/jpeg', lines: 66},
           meta_b: {name: 'carrot.jpg', content_type: 'image/jpeg',
             lines: 560},
@@ -900,21 +926,30 @@
 
       test('hidden', () => {
         assert.equal(element._diffHeaderItems.length, 0);
-        element.push('_diff.diff_header', 'diff --git a/test.jpg b/test.jpg');
+        element.push('diff.diff_header', 'diff --git a/test.jpg b/test.jpg');
         assert.equal(element._diffHeaderItems.length, 0);
-        element.push('_diff.diff_header', 'index 2adc47d..f9c2f2c 100644');
+        element.push('diff.diff_header', 'index 2adc47d..f9c2f2c 100644');
         assert.equal(element._diffHeaderItems.length, 0);
-        element.push('_diff.diff_header', '--- a/test.jpg');
+        element.push('diff.diff_header', '--- a/test.jpg');
         assert.equal(element._diffHeaderItems.length, 0);
-        element.push('_diff.diff_header', '+++ b/test.jpg');
+        element.push('diff.diff_header', '+++ b/test.jpg');
         assert.equal(element._diffHeaderItems.length, 0);
-        element.push('_diff.diff_header', 'test');
+        element.push('diff.diff_header', 'test');
         assert.equal(element._diffHeaderItems.length, 1);
         flushAsynchronousOperations();
 
         assert.equal(element.$.diffHeader.textContent.trim(), 'test');
-        element.set('_diff.binary', true);
+      });
+
+      test('binary files', () => {
+        element.diff.binary = true;
         assert.equal(element._diffHeaderItems.length, 0);
+        element.push('diff.diff_header', 'diff --git a/test.jpg b/test.jpg');
+        assert.equal(element._diffHeaderItems.length, 0);
+        element.push('diff.diff_header', 'test');
+        assert.equal(element._diffHeaderItems.length, 1);
+        element.push('diff.diff_header', 'Binary files differ');
+        assert.equal(element._diffHeaderItems.length, 1);
       });
     });
 
@@ -924,39 +959,47 @@
       setup(() => {
         element = fixture('basic');
         renderStub = sandbox.stub(element.$.diffBuilder, 'render',
-            () => Promise.resolve());
+            () => {
+              Promise.resolve();
+              element.$.diffBuilder.dispatchEvent(
+                  new CustomEvent('render', {bubbles: true}));
+            });
         const mock = document.createElement('mock-diff-response');
-        element._diff = mock.diffResponse;
+        sandbox.stub(element.$.diffBuilder, 'getDiffLength').returns(10000);
+        element.diff = mock.diffResponse;
         element.comments = {left: [], right: []};
         element.noRenderOnPrefsChange = true;
       });
 
-      test('lage render w/ context = 10', () => {
+      test('large render w/ context = 10', done => {
         element.prefs = {context: 10};
-        sandbox.stub(element, '_diffLength', () => 10000);
-        return element._renderDiffTable().then(() => {
+        element.addEventListener('render', () => {
           assert.isTrue(renderStub.called);
           assert.isFalse(element._showWarning);
+          done();
         });
+        element._renderDiffTable();
       });
 
-      test('lage render w/ whole file and bypass', () => {
+      test('large render w/ whole file and bypass', done => {
         element.prefs = {context: -1};
         element._safetyBypass = 10;
-        sandbox.stub(element, '_diffLength', () => 10000);
-        return element._renderDiffTable().then(() => {
+        element.addEventListener('render', () => {
           assert.isTrue(renderStub.called);
           assert.isFalse(element._showWarning);
+          done();
         });
+        element._renderDiffTable();
       });
 
-      test('lage render w/ whole file and no bypass', () => {
+      test('large render w/ whole file and no bypass', done => {
         element.prefs = {context: -1};
-        sandbox.stub(element, '_diffLength', () => 10000);
-        return element._renderDiffTable().then(() => {
+        element.addEventListener('render', () => {
           assert.isFalse(renderStub.called);
           assert.isTrue(element._showWarning);
+          done();
         });
+        element._renderDiffTable();
       });
     });
 
@@ -965,52 +1008,144 @@
         element = fixture('basic');
       });
 
-      test('clearBlame', () => {
-        element._blame = [];
+      test('unsetting', () => {
+        element.blame = [];
         const setBlameSpy = sandbox.spy(element.$.diffBuilder, 'setBlame');
         element.classList.add('showBlame');
-        element.clearBlame();
-        assert.isNull(element._blame);
+        element.blame = null;
         assert.isTrue(setBlameSpy.calledWithExactly(null));
         assert.isFalse(element.classList.contains('showBlame'));
       });
 
-      test('loadBlame', () => {
+      test('setting', () => {
         const mockBlame = [{id: 'commit id', ranges: [{start: 1, end: 2}]}];
-        const showAlertStub = sinon.stub();
-        element.addEventListener('show-alert', showAlertStub);
-        const getBlameStub = sandbox.stub(element.$.restAPI, 'getBlame')
-            .returns(Promise.resolve(mockBlame));
-        element.changeNum = 42;
-        element.patchRange = {patchNum: 5, basePatchNum: 4};
-        element.path = 'foo/bar.baz';
-        return element.loadBlame().then(() => {
-          assert.isTrue(getBlameStub.calledWithExactly(
-              42, 5, 'foo/bar.baz', true));
-          assert.isFalse(showAlertStub.called);
-          assert.equal(element._blame, mockBlame);
-          assert.isTrue(element.classList.contains('showBlame'));
+        element.blame = mockBlame;
+        assert.isTrue(element.classList.contains('showBlame'));
+      });
+    });
+
+    suite('trailing newlines', () => {
+      setup(() => {
+        element = fixture('basic');
+      });
+
+      suite('_lastChunkForSide', () => {
+        test('deltas', () => {
+          const diff = {content: [
+            {a: ['foo', 'bar'], b: ['baz']},
+            {ab: ['foo', 'bar', 'baz']},
+            {b: ['foo']},
+          ]};
+          assert.equal(element._lastChunkForSide(diff, false), diff.content[2]);
+          assert.equal(element._lastChunkForSide(diff, true), diff.content[1]);
+
+          diff.content.push({a: ['foo'], b: ['bar']});
+          assert.equal(element._lastChunkForSide(diff, false), diff.content[3]);
+          assert.equal(element._lastChunkForSide(diff, true), diff.content[3]);
+        });
+
+        test('addition', () => {
+          const diff = {content: [
+            {b: ['foo', 'bar', 'baz']},
+          ]};
+          assert.equal(element._lastChunkForSide(diff, false), diff.content[0]);
+          assert.isNull(element._lastChunkForSide(diff, true));
+        });
+
+        test('deletion', () => {
+          const diff = {content: [
+            {a: ['foo', 'bar', 'baz']},
+          ]};
+          assert.isNull(element._lastChunkForSide(diff, false));
+          assert.equal(element._lastChunkForSide(diff, true), diff.content[0]);
+        });
+
+        test('empty', () => {
+          const diff = {content: []};
+          assert.isNull(element._lastChunkForSide(diff, false));
+          assert.isNull(element._lastChunkForSide(diff, true));
         });
       });
 
-      test('loadBlame empty', () => {
-        const mockBlame = [];
-        const showAlertStub = sinon.stub();
-        element.addEventListener('show-alert', showAlertStub);
-        sandbox.stub(element.$.restAPI, 'getBlame')
-            .returns(Promise.resolve(mockBlame));
-        element.changeNum = 42;
-        element.patchRange = {patchNum: 5, basePatchNum: 4};
-        element.path = 'foo/bar.baz';
-        return element.loadBlame()
-            .then(() => {
-              assert.isTrue(false, 'Promise should not resolve');
-            })
-            .catch(() => {
-              assert.isTrue(showAlertStub.calledOnce);
-              assert.isNull(element._blame);
-              assert.isFalse(element.classList.contains('showBlame'));
-            });
+      suite('_hasTrailingNewlines', () => {
+        test('shared no trailing', () => {
+          const diff = undefined;
+          sandbox.stub(element, '_lastChunkForSide')
+              .returns({ab: ['foo', 'bar']});
+          assert.isFalse(element._hasTrailingNewlines(diff, false));
+          assert.isFalse(element._hasTrailingNewlines(diff, true));
+        });
+
+        test('delta trailing in right', () => {
+          const diff = undefined;
+          sandbox.stub(element, '_lastChunkForSide')
+              .returns({a: ['foo', 'bar'], b: ['baz', '']});
+          assert.isTrue(element._hasTrailingNewlines(diff, false));
+          assert.isFalse(element._hasTrailingNewlines(diff, true));
+        });
+
+        test('addition', () => {
+          const diff = undefined;
+          sandbox.stub(element, '_lastChunkForSide', (diff, leftSide) => {
+            if (leftSide) { return null; }
+            return {b: ['foo', '']};
+          });
+          assert.isTrue(element._hasTrailingNewlines(diff, false));
+          assert.isNull(element._hasTrailingNewlines(diff, true));
+        });
+
+        test('deletion', () => {
+          const diff = undefined;
+          sandbox.stub(element, '_lastChunkForSide', (diff, leftSide) => {
+            if (!leftSide) { return null; }
+            return {a: ['foo']};
+          });
+          assert.isNull(element._hasTrailingNewlines(diff, false));
+          assert.isFalse(element._hasTrailingNewlines(diff, true));
+        });
+      });
+
+      test('_computeNewlineWarning', () => {
+        const NO_NEWLINE_BASE = 'No newline at end of base file.';
+        const NO_NEWLINE_REVISION = 'No newline at end of revision file.';
+
+        let hasLeft;
+        let hasRight;
+        sandbox.stub(element, '_hasTrailingNewlines', (diff, left) => {
+          if (left) { return hasLeft; }
+          return hasRight;
+        });
+        const diff = undefined;
+
+        // The revision has a trailing newline, but the base doesn't.
+        hasLeft = true;
+        hasRight = false;
+        assert.equal(element._computeNewlineWarning(diff), NO_NEWLINE_REVISION);
+
+        // Trailing newlines were undetermined in the revision.
+        hasLeft = true;
+        hasRight = null;
+        assert.isNull(element._computeNewlineWarning(diff));
+
+        // Missing trailing newlines in the base.
+        hasLeft = false;
+        hasRight = null;
+        assert.equal(element._computeNewlineWarning(diff), NO_NEWLINE_BASE);
+
+        // Missing trailing newlines in both.
+        hasLeft = false;
+        hasRight = false;
+        assert.equal(element._computeNewlineWarning(diff),
+            NO_NEWLINE_BASE + ' — ' + NO_NEWLINE_REVISION);
+      });
+
+      test('_computeNewlineWarningClass', () => {
+        const hidden = 'newlineWarning hidden';
+        const shown = 'newlineWarning';
+        assert.equal(element._computeNewlineWarningClass(null, true), hidden);
+        assert.equal(element._computeNewlineWarningClass('foo', true), hidden);
+        assert.equal(element._computeNewlineWarningClass(null, false), hidden);
+        assert.equal(element._computeNewlineWarningClass('foo', false), shown);
       });
     });
   });
diff --git a/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select.html b/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select.html
index f532e3f..3de4284 100644
--- a/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select.html
+++ b/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -18,7 +19,7 @@
 <link rel="import" href="../../../behaviors/gr-patch-set-behavior/gr-patch-set-behavior.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 <link rel="import" href="../../shared/gr-dropdown-list/gr-dropdown-list.html">
-
+<link rel="import" href="../../shared/gr-count-string-formatter/gr-count-string-formatter.html">
 <link rel="import" href="../../shared/gr-select/gr-select.html">
 
 <dom-module id="gr-patch-range-select">
@@ -32,12 +33,12 @@
         max-width: 15em;
       }
       .arrow {
-        color: rgba(0,0,0,.7);
+        color: var(--deemphasized-text-color);
         margin: 0 .5em;
       }
       gr-dropdown-list {
         --trigger-style: {
-          color: rgba(0,0,0,.7);
+          color: var(--deemphasized-text-color);
           text-transform: none;
           font-family: var(--font-family);
         }
@@ -47,6 +48,14 @@
         .filesWeblinks {
           display: none;
         }
+        gr-dropdown-list {
+          --native-select-style: {
+            max-width: 5.25em;
+          }
+          --dropdown-content-stype: {
+            max-width: 300px;
+          }
+        }
       }
     </style>
     <span class="patchRange">
diff --git a/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select.js b/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select.js
index a8314e7..cf8118f 100644
--- a/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select.js
+++ b/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -34,26 +37,21 @@
       _baseDropdownContent: {
         type: Object,
         computed: '_computeBaseDropdownContent(availablePatches, patchNum,' +
-            '_sortedRevisions, revisions, comments)',
+            '_sortedRevisions, changeComments, revisionInfo)',
       },
       _patchDropdownContent: {
         type: Object,
         computed: '_computePatchDropdownContent(availablePatches,' +
-            'basePatchNum, _sortedRevisions, revisions, comments)',
+            'basePatchNum, _sortedRevisions, changeComments)',
       },
       changeNum: String,
-      // In the case of a patch range select (like diff view) comments should
-      // be an empty array, so that the patch and base content computed values
-      // get triggered.
-      comments: {
-        type: Object,
-        value: () => { return {}; },
-      },
+      changeComments: Object,
       /** @type {{ meta_a: !Array, meta_b: !Array}} */
       filesWeblinks: Object,
       patchNum: String,
       basePatchNum: String,
       revisions: Object,
+      revisionInfo: Object,
       _sortedRevisions: Array,
     },
 
@@ -64,135 +62,150 @@
     behaviors: [Gerrit.PatchSetBehavior],
 
     _computeBaseDropdownContent(availablePatches, patchNum, _sortedRevisions,
-        revisions, comments) {
+        changeComments, revisionInfo) {
+      const parentCounts = revisionInfo.getParentCountMap();
+      const currentParentCount = parentCounts.hasOwnProperty(patchNum) ?
+          parentCounts[patchNum] : 1;
+      const maxParents = revisionInfo.getMaxParents();
+      const isMerge = currentParentCount > 1;
+
       const dropdownContent = [];
-      dropdownContent.push({
-        text: 'Base',
-        value: 'PARENT',
-      });
       for (const basePatch of availablePatches) {
         const basePatchNum = basePatch.num;
-        dropdownContent.push({
+        const entry = this._createDropdownEntry(basePatchNum, 'Patchset ',
+            _sortedRevisions, changeComments);
+        dropdownContent.push(Object.assign({}, entry, {
           disabled: this._computeLeftDisabled(
               basePatch.num, patchNum, _sortedRevisions),
-          triggerText: `Patchset ${basePatchNum}`,
-          text: `Patchset ${basePatchNum}` +
-              this._computePatchSetCommentsString(this.comments, basePatchNum),
-          mobileText: this._computeMobileText(basePatchNum, comments,
-              revisions),
-          bottomText: `${this._computePatchSetDescription(
-              revisions, basePatchNum)}`,
-          value: basePatch.num,
+        }));
+      }
+
+      dropdownContent.push({
+        text: isMerge ? 'Auto Merge' : 'Base',
+        value: 'PARENT',
+      });
+
+      for (let idx = 0; isMerge && idx < maxParents; idx++) {
+        dropdownContent.push({
+          disabled: idx >= currentParentCount,
+          triggerText: `Parent ${idx + 1}`,
+          text: `Parent ${idx + 1}`,
+          mobileText: `Parent ${idx + 1}`,
+          value: -(idx + 1),
         });
       }
+
       return dropdownContent;
     },
 
-    _computeMobileText(patchNum, comments, revisions) {
+    _computeMobileText(patchNum, changeComments, revisions) {
       return `${patchNum}` +
-          `${this._computePatchSetCommentsString(this.comments, patchNum)}` +
+          `${this._computePatchSetCommentsString(changeComments, patchNum)}` +
           `${this._computePatchSetDescription(revisions, patchNum, true)}`;
     },
 
     _computePatchDropdownContent(availablePatches, basePatchNum,
-        _sortedRevisions, revisions, comments) {
+        _sortedRevisions, changeComments) {
       const dropdownContent = [];
       for (const patch of availablePatches) {
         const patchNum = patch.num;
-        dropdownContent.push({
-          disabled: this._computeRightDisabled(patchNum, basePatchNum,
+        const entry = this._createDropdownEntry(
+            patchNum, patchNum === 'edit' ? '' : 'Patchset ', _sortedRevisions,
+            changeComments);
+        dropdownContent.push(Object.assign({}, entry, {
+          disabled: this._computeRightDisabled(basePatchNum, patchNum,
               _sortedRevisions),
-          triggerText: `${patchNum === 'edit' ? '': 'Patchset '}` +
-              patchNum,
-          text: `${patchNum === 'edit' ? '': 'Patchset '}${patchNum}` +
-              `${this._computePatchSetCommentsString(
-                  this.comments, patchNum)}`,
-          mobileText: this._computeMobileText(patchNum, comments, revisions),
-          bottomText: `${this._computePatchSetDescription(
-              revisions, patchNum)}`,
-          value: patchNum,
-        });
+        }));
       }
       return dropdownContent;
     },
 
+    _createDropdownEntry(patchNum, prefix, sortedRevisions, changeComments) {
+      const entry = {
+        triggerText: `${prefix}${patchNum}`,
+        text: `${prefix}${patchNum}` +
+            `${this._computePatchSetCommentsString(
+                changeComments, patchNum)}`,
+        mobileText: this._computeMobileText(patchNum, changeComments,
+            sortedRevisions),
+        bottomText: `${this._computePatchSetDescription(
+            sortedRevisions, patchNum)}`,
+        value: patchNum,
+      };
+      const date = this._computePatchSetDate(sortedRevisions, patchNum);
+      if (date) {
+        entry['date'] = date;
+      }
+      return entry;
+    },
+
     _updateSortedRevisions(revisionsRecord) {
       const revisions = revisionsRecord.base;
       this._sortedRevisions = this.sortRevisions(Object.values(revisions));
     },
 
+    /**
+     * The basePatchNum should always be <= patchNum -- because sortedRevisions
+     * is sorted in reverse order (higher patchset nums first), invalid base
+     * patch nums have an index greater than the index of patchNum.
+     * @param {number|string} basePatchNum The possible base patch num.
+     * @param {number|string} patchNum The current selected patch num.
+     * @param {!Array} sortedRevisions
+     */
     _computeLeftDisabled(basePatchNum, patchNum, sortedRevisions) {
-      return this.findSortedIndex(basePatchNum, sortedRevisions) >=
+      return this.findSortedIndex(basePatchNum, sortedRevisions) <=
           this.findSortedIndex(patchNum, sortedRevisions);
     },
 
-    _computeRightDisabled(patchNum, basePatchNum, sortedRevisions) {
-      if (basePatchNum == 'PARENT') { return false; }
+    /**
+     * The basePatchNum should always be <= patchNum -- because sortedRevisions
+     * is sorted in reverse order (higher patchset nums first), invalid patch
+     * nums have an index greater than the index of basePatchNum.
+     *
+     * In addition, if the current basePatchNum is 'PARENT', all patchNums are
+     * valid.
+     *
+     * If the curent basePatchNum is a parent index, then only patches that have
+     * at least that many parents are valid.
+     *
+     * @param {number|string} basePatchNum The current selected base patch num.
+     * @param {number|string} patchNum The possible patch num.
+     * @param {!Array} sortedRevisions
+     * @return {boolean}
+     */
+    _computeRightDisabled(basePatchNum, patchNum, sortedRevisions) {
+      if (this.patchNumEquals(basePatchNum, 'PARENT')) { return false; }
 
-      return this.findSortedIndex(patchNum, sortedRevisions) <=
-          this.findSortedIndex(basePatchNum, sortedRevisions);
-    },
-
-    // Copied from gr-file-list
-    // @todo(beckysiegel) clean up.
-    _getCommentsForPath(comments, patchNum, path) {
-      return (comments[path] || []).filter(c => {
-        return this.patchNumEquals(c.patch_set, patchNum);
-      });
-    },
-
-    // Copied from gr-file-list
-    // @todo(beckysiegel) clean up.
-    _computeUnresolvedNum(comments, drafts, patchNum, path) {
-      comments = this._getCommentsForPath(comments, patchNum, path);
-      drafts = this._getCommentsForPath(drafts, patchNum, path);
-      comments = comments.concat(drafts);
-
-      // Create an object where every comment ID is the key of an unresolved
-      // comment.
-
-      const idMap = comments.reduce((acc, comment) => {
-        if (comment.unresolved) {
-          acc[comment.id] = true;
-        }
-        return acc;
-      }, {});
-
-      // Set false for the comments that are marked as parents.
-      for (const comment of comments) {
-        idMap[comment.in_reply_to] = false;
+      if (this.isMergeParent(basePatchNum)) {
+        // Note: parent indices use 1-offset.
+        return this.revisionInfo.getParentCount(patchNum) <
+            this.getParentIndex(basePatchNum);
       }
 
-      // The unresolved comments are the comments that still have true.
-      const unresolvedLeaves = Object.keys(idMap).filter(key => {
-        return idMap[key];
-      });
-
-      return unresolvedLeaves.length;
+      return this.findSortedIndex(basePatchNum, sortedRevisions) <=
+          this.findSortedIndex(patchNum, sortedRevisions);
     },
 
-    _computePatchSetCommentsString(allComments, patchNum) {
-      // todo (beckysiegel) get comment strings for diff view also.
-      if (!allComments) { return ''; }
-      let numComments = 0;
-      let numUnresolved = 0;
-      for (const file in allComments) {
-        if (allComments.hasOwnProperty(file)) {
-          numComments += this._getCommentsForPath(
-              allComments, patchNum, file).length;
-          numUnresolved += this._computeUnresolvedNum(
-              allComments, {}, patchNum, file);
-        }
+
+    _computePatchSetCommentsString(changeComments, patchNum) {
+      if (!changeComments) { return; }
+
+      const commentCount = changeComments.computeCommentCount(patchNum);
+      const commentString = GrCountStringFormatter.computePluralString(
+          commentCount, 'comment');
+
+      const unresolvedCount = changeComments.computeUnresolvedNum(patchNum);
+      const unresolvedString = GrCountStringFormatter.computeString(
+          unresolvedCount, 'unresolved');
+
+      if (!commentString.length && !unresolvedString.length) {
+        return '';
       }
-      let commentsStr = '';
-      if (numComments > 0) {
-        commentsStr = ' (' + numComments + ' comments';
-        if (numUnresolved > 0) {
-          commentsStr += ', ' + numUnresolved + ' unresolved';
-        }
-        commentsStr += ')';
-      }
-      return commentsStr;
+
+      return ` (${commentString}` +
+          // Add a comma + space if both comments and unresolved
+          (commentString && unresolvedString ? ', ' : '') +
+          `${unresolvedString})`;
     },
 
     /**
@@ -208,6 +221,15 @@
     },
 
     /**
+     * @param {!Array} revisions
+     * @param {number|string} patchNum
+     */
+    _computePatchSetDate(revisions, patchNum) {
+      const rev = this.getRevisionByPatchNum(revisions, patchNum);
+      return rev ? rev.created : undefined;
+    },
+
+    /**
      * Catches value-change events from the patchset dropdowns and determines
      * whether or not a patch change event should be fired.
      */
diff --git a/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select_test.html b/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select_test.html
index ff89d30..2614885 100644
--- a/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select_test.html
+++ b/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,13 +24,26 @@
 <link rel="import" href="../../../test/common-test-setup.html"/>
 <script src="../../../bower_components/page/page.js"></script>
 
+<link rel="import" href="../../diff/gr-comment-api/gr-comment-api.html">
+<link rel="import" href="../../shared/gr-rest-api-interface/mock-diff-response_test.html">
+<link rel="import" href="../../shared/revision-info/revision-info.html">
+
 <link rel="import" href="gr-patch-range-select.html">
 
 <script>void(0);</script>
 
+<dom-module id="comment-api-mock">
+  <template>
+    <gr-patch-range-select id="patchRange" auto
+        change-comments="[[_changeComments]]"></gr-patch-range-select>
+    <gr-comment-api id="commentAPI"></gr-comment-api>
+  </template>
+  <script src="../../diff/gr-comment-api/gr-comment-api-mock.js"></script>
+</dom-module>
+
 <test-fixture id="basic">
   <template>
-    <gr-patch-range-select auto></gr-patch-range-select>
+    <comment-api-mock></comment-api-mock>
   </template>
 </test-fixture>
 
@@ -37,10 +51,33 @@
   suite('gr-patch-range-select tests', () => {
     let element;
     let sandbox;
+    let commentApiWrapper;
+
+    function getInfo(revisions) {
+      const revisionObj = {};
+      for (let i = 0; i < revisions.length; i++) {
+        revisionObj[i] = revisions[i];
+      }
+      return new Gerrit.RevisionInfo({revisions: revisionObj});
+    }
 
     setup(() => {
-      element = fixture('basic');
       sandbox = sinon.sandbox.create();
+
+      stub('gr-rest-api-interface', {
+        getDiffComments() { return Promise.resolve({}); },
+        getDiffRobotComments() { return Promise.resolve({}); },
+        getDiffDrafts() { return Promise.resolve({}); },
+      });
+
+      // Element must be wrapped in an element with direct access to the
+      // comment API.
+      commentApiWrapper = fixture('basic');
+      element = commentApiWrapper.$.patchRange;
+
+      // Stub methods on the changeComments object after changeComments has
+      // been initalized.
+      return commentApiWrapper.loadComments();
     });
 
     teardown(() => sandbox.restore());
@@ -51,17 +88,17 @@
         patchNum: '3',
       };
       const sortedRevisions = [
-        {_number: 1},
-        {_number: 2},
-        {_number: element.EDIT_NAME, basePatchNum: 2},
         {_number: 3},
+        {_number: element.EDIT_NAME, basePatchNum: 2},
+        {_number: 2},
+        {_number: 1},
       ];
       for (const patchNum of ['1', '2', '3']) {
-        assert.isFalse(element._computeRightDisabled(patchNum,
-            patchRange.basePatchNum, sortedRevisions));
+        assert.isFalse(element._computeRightDisabled(patchRange.basePatchNum,
+            patchNum, sortedRevisions));
       }
-      for (const patchNum of ['PARENT', '1', '2']) {
-        assert.isFalse(element._computeLeftDisabled(patchNum,
+      for (const basePatchNum of ['1', '2']) {
+        assert.isFalse(element._computeLeftDisabled(basePatchNum,
             patchRange.patchNum, sortedRevisions));
       }
       assert.isTrue(element._computeLeftDisabled('3', patchRange.patchNum));
@@ -69,53 +106,58 @@
       patchRange.basePatchNum = element.EDIT_NAME;
       assert.isTrue(element._computeLeftDisabled('3', patchRange.patchNum,
           sortedRevisions));
-      assert.isTrue(element._computeRightDisabled('1', patchRange.basePatchNum,
+      assert.isTrue(element._computeRightDisabled(patchRange.basePatchNum, '1',
           sortedRevisions));
-      assert.isTrue(element._computeRightDisabled('2', patchRange.basePatchNum,
+      assert.isTrue(element._computeRightDisabled(patchRange.basePatchNum, '2',
           sortedRevisions));
-      assert.isFalse(element._computeRightDisabled('3', patchRange.basePatchNum,
+      assert.isFalse(element._computeRightDisabled(patchRange.basePatchNum, '3',
           sortedRevisions));
-      assert.isTrue(element._computeRightDisabled(element.EDIT_NAME,
-          patchRange.basePatchNum, sortedRevisions));
+      assert.isTrue(element._computeRightDisabled(patchRange.basePatchNum,
+          element.EDIT_NAME, sortedRevisions));
     });
 
     test('_computeBaseDropdownContent', () => {
-      const comments = {};
       const availablePatches = [
-        {num: 1},
-        {num: 2},
-        {num: 3},
         {num: 'edit'},
+        {num: 3},
+        {num: 2},
+        {num: 1},
       ];
       const revisions = [
         {
-          commit: {},
+          commit: {parents: []},
           _number: 2,
           description: 'description',
         },
-        {commit: {}},
-        {commit: {}},
-        {commit: {}},
+        {commit: {parents: []}},
+        {commit: {parents: []}},
+        {commit: {parents: []}},
       ];
+      element.revisionInfo = getInfo(revisions);
       const patchNum = 1;
       const sortedRevisions = [
-        {_number: 1},
-        {_number: 2},
+        {_number: 3, created: 'Mon, 01 Jan 2001 00:00:00 GMT'},
         {_number: element.EDIT_NAME, basePatchNum: 2},
-        {_number: 3},
+        {_number: 2, description: 'description'},
+        {_number: 1},
       ];
       const expectedResult = [
         {
-          text: 'Base',
-          value: 'PARENT',
+          disabled: true,
+          triggerText: 'Patchset edit',
+          text: 'Patchset edit',
+          mobileText: 'edit',
+          bottomText: '',
+          value: 'edit',
         },
         {
           disabled: true,
-          triggerText: 'Patchset 1',
-          text: 'Patchset 1',
-          mobileText: '1',
+          triggerText: 'Patchset 3',
+          text: 'Patchset 3',
+          mobileText: '3',
           bottomText: '',
-          value: 1,
+          value: 3,
+          date: 'Mon, 01 Jan 2001 00:00:00 GMT',
         },
         {
           disabled: true,
@@ -127,32 +169,31 @@
         },
         {
           disabled: true,
-          triggerText: 'Patchset 3',
-          text: 'Patchset 3',
-          mobileText: '3',
+          triggerText: 'Patchset 1',
+          text: 'Patchset 1',
+          mobileText: '1',
           bottomText: '',
-          value: 3,
+          value: 1,
         },
         {
-          disabled: true,
-          triggerText: 'Patchset edit',
-          text: 'Patchset edit',
-          mobileText: 'edit',
-          bottomText: '',
-          value: 'edit',
+          text: 'Base',
+          value: 'PARENT',
         },
       ];
       assert.deepEqual(element._computeBaseDropdownContent(availablePatches,
-          patchNum, sortedRevisions, revisions, comments), expectedResult);
+          patchNum, sortedRevisions, element.changeComments,
+          element.revisionInfo),
+          expectedResult);
     });
 
     test('_computeBaseDropdownContent called when patchNum updates', () => {
       element.revisions = [
-        {commit: {}},
-        {commit: {}},
-        {commit: {}},
-        {commit: {}},
+        {commit: {parents: []}},
+        {commit: {parents: []}},
+        {commit: {parents: []}},
+        {commit: {parents: []}},
       ];
+      element.revisionInfo = getInfo(element.revisions);
       element.availablePatches = [
         {num: 1},
         {num: 2},
@@ -170,42 +211,42 @@
       assert.equal(element._computeBaseDropdownContent.callCount, 1);
     });
 
-    test('_computeBaseDropdownContent called when comments update', () => {
-      element.revisions = [
-        {commit: {}},
-        {commit: {}},
-        {commit: {}},
-        {commit: {}},
-      ];
-      element.availablePatches = [
-        {num: 1},
-        {num: 2},
-        {num: 3},
-        {num: 'edit'},
-      ];
-      element.patchNum = 2;
-      element.basePatchNum = 'PARENT';
-      flushAsynchronousOperations();
+    test('_computeBaseDropdownContent called when changeComments update',
+        done => {
+          element.revisions = [
+            {commit: {parents: []}},
+            {commit: {parents: []}},
+            {commit: {parents: []}},
+            {commit: {parents: []}},
+          ];
+          element.revisionInfo = getInfo(element.revisions);
+          element.availablePatches = [
+            {num: 'edit'},
+            {num: 3},
+            {num: 2},
+            {num: 1},
+          ];
+          element.patchNum = 2;
+          element.basePatchNum = 'PARENT';
+          flushAsynchronousOperations();
 
-      // Should be recomputed for each available patch
-      sandbox.stub(element, '_computeBaseDropdownContent');
-      assert.equal(element._computeBaseDropdownContent.callCount, 0);
-      element.set('comments', {
-        file: [{
-          message: 'test',
-          patch_set: 2,
-        }],
-      });
-      assert.equal(element._computeBaseDropdownContent.callCount, 1);
-    });
+          // Should be recomputed for each available patch
+          sandbox.stub(element, '_computeBaseDropdownContent');
+          assert.equal(element._computeBaseDropdownContent.callCount, 0);
+          commentApiWrapper.loadComments().then().then(() => {
+            assert.equal(element._computeBaseDropdownContent.callCount, 1);
+            done();
+          });
+        });
 
     test('_computePatchDropdownContent called when basePatchNum updates', () => {
       element.revisions = [
-        {commit: {}},
-        {commit: {}},
-        {commit: {}},
-        {commit: {}},
+        {commit: {parents: []}},
+        {commit: {parents: []}},
+        {commit: {parents: []}},
+        {commit: {parents: []}},
       ];
+      element.revisionInfo = getInfo(element.revisions);
       element.availablePatches = [
         {num: 1},
         {num: 2},
@@ -222,13 +263,14 @@
       assert.equal(element._computePatchDropdownContent.callCount, 1);
     });
 
-    test('_computePatchDropdownContent called when comments update', () => {
+    test('_computePatchDropdownContent called when comments update', done => {
       element.revisions = [
-        {commit: {}},
-        {commit: {}},
-        {commit: {}},
-        {commit: {}},
+        {commit: {parents: []}},
+        {commit: {parents: []}},
+        {commit: {parents: []}},
+        {commit: {parents: []}},
       ];
+      element.revisionInfo = getInfo(element.revisions);
       element.availablePatches = [
         {num: 1},
         {num: 2},
@@ -242,49 +284,43 @@
       // Should be recomputed for each available patch
       sandbox.stub(element, '_computePatchDropdownContent');
       assert.equal(element._computePatchDropdownContent.callCount, 0);
-      element.set('comments', {
-        file: [{
-          message: 'test',
-          patch_set: 2,
-        }],
+      commentApiWrapper.loadComments().then().then(() => {
+        done();
       });
-      assert.equal(element._computePatchDropdownContent.callCount, 1);
     });
 
     test('_computePatchDropdownContent', () => {
-      const comments = {};
       const availablePatches = [
-        {num: 1},
-        {num: 2},
-        {num: 3},
         {num: 'edit'},
-      ];
-      const revisions = [
-        {
-          commit: {},
-          _number: 2,
-          description: 'description',
-        },
-        {commit: {}},
-        {commit: {}},
-        {commit: {}},
+        {num: 3},
+        {num: 2},
+        {num: 1},
       ];
       const basePatchNum = 1;
       const sortedRevisions = [
-        {_number: 1},
-        {_number: 2},
+        {_number: 3, created: 'Mon, 01 Jan 2001 00:00:00 GMT'},
         {_number: element.EDIT_NAME, basePatchNum: 2},
-        {_number: 3},
+        {_number: 2, description: 'description'},
+        {_number: 1},
       ];
 
       const expectedResult = [
         {
-          disabled: true,
-          triggerText: 'Patchset 1',
-          text: 'Patchset 1',
-          mobileText: '1',
+          disabled: false,
+          triggerText: 'edit',
+          text: 'edit',
+          mobileText: 'edit',
           bottomText: '',
-          value: 1,
+          value: 'edit',
+        },
+        {
+          disabled: false,
+          triggerText: 'Patchset 3',
+          text: 'Patchset 3',
+          mobileText: '3',
+          bottomText: '',
+          value: 3,
+          date: 'Mon, 01 Jan 2001 00:00:00 GMT',
         },
         {
           disabled: false,
@@ -295,25 +331,18 @@
           value: 2,
         },
         {
-          disabled: false,
-          triggerText: 'Patchset 3',
-          text: 'Patchset 3',
-          mobileText: '3',
+          disabled: true,
+          triggerText: 'Patchset 1',
+          text: 'Patchset 1',
+          mobileText: '1',
           bottomText: '',
-          value: 3,
-        },
-        {
-          disabled: false,
-          triggerText: 'edit',
-          text: 'edit',
-          mobileText: 'edit',
-          bottomText: '',
-          value: 'edit',
+          value: 1,
         },
       ];
 
       assert.deepEqual(element._computePatchDropdownContent(availablePatches,
-          basePatchNum, sortedRevisions, revisions, comments), expectedResult);
+          basePatchNum, sortedRevisions, element.changeComments),
+          expectedResult);
     });
 
     test('filesWeblinks', () => {
@@ -341,37 +370,41 @@
 
     test('_computePatchSetCommentsString', () => {
       // Test string with unresolved comments.
-      comments = {
+      element.changeComments._comments = {
         foo: [{
           id: '27dcee4d_f7b77cfa',
           message: 'test',
           patch_set: 1,
           unresolved: true,
+          updated: '2017-10-11 20:48:40.000000000',
         }],
         bar: [{
           id: '27dcee4d_f7b77cfa',
           message: 'test',
           patch_set: 1,
+          updated: '2017-10-12 20:48:40.000000000',
         },
         {
           id: '27dcee4d_f7b77cfa',
           message: 'test',
           patch_set: 1,
+          updated: '2017-10-13 20:48:40.000000000',
         }],
         abc: [],
       };
 
-      assert.equal(element._computePatchSetCommentsString(comments, 1),
-          ' (3 comments, 1 unresolved)');
+      assert.equal(element._computePatchSetCommentsString(
+          element.changeComments, 1), ' (3 comments, 1 unresolved)');
 
       // Test string with no unresolved comments.
-      delete comments['foo'];
-      assert.equal(element._computePatchSetCommentsString(comments, 1),
-          ' (2 comments)');
+      delete element.changeComments._comments['foo'];
+      assert.equal(element._computePatchSetCommentsString(
+          element.changeComments, 1), ' (2 comments)');
 
       // Test string with no comments.
-      delete comments['bar'];
-      assert.equal(element._computePatchSetCommentsString(comments, 1), '');
+      delete element.changeComments._comments['bar'];
+      assert.equal(element._computePatchSetCommentsString(
+          element.changeComments, 1), '');
     });
 
     test('patch-range-change fires', () => {
diff --git a/polygerrit-ui/app/elements/diff/gr-ranged-comment-layer/gr-ranged-comment-layer.html b/polygerrit-ui/app/elements/diff/gr-ranged-comment-layer/gr-ranged-comment-layer.html
index ba6973b..71b5bc3 100644
--- a/polygerrit-ui/app/elements/diff/gr-ranged-comment-layer/gr-ranged-comment-layer.html
+++ b/polygerrit-ui/app/elements/diff/gr-ranged-comment-layer/gr-ranged-comment-layer.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/diff/gr-ranged-comment-layer/gr-ranged-comment-layer.js b/polygerrit-ui/app/elements/diff/gr-ranged-comment-layer/gr-ranged-comment-layer.js
index 3de18be..db14fc8 100644
--- a/polygerrit-ui/app/elements/diff/gr-ranged-comment-layer/gr-ranged-comment-layer.js
+++ b/polygerrit-ui/app/elements/diff/gr-ranged-comment-layer/gr-ranged-comment-layer.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -69,7 +72,7 @@
 
     /**
      * Register a listener for layer updates.
-     * @param {Function<Number, Number, String>} fn The update handler function.
+     * @param {function(number, number, string)} fn The update handler function.
      *     Should accept as arguments the line numbers for the start and end of
      *     the update and the side as a string.
      */
diff --git a/polygerrit-ui/app/elements/diff/gr-ranged-comment-layer/gr-ranged-comment-layer_test.html b/polygerrit-ui/app/elements/diff/gr-ranged-comment-layer/gr-ranged-comment-layer_test.html
index afdf630..c541e26 100644
--- a/polygerrit-ui/app/elements/diff/gr-ranged-comment-layer/gr-ranged-comment-layer_test.html
+++ b/polygerrit-ui/app/elements/diff/gr-ranged-comment-layer/gr-ranged-comment-layer_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/diff/gr-selection-action-box/gr-selection-action-box.html b/polygerrit-ui/app/elements/diff/gr-selection-action-box/gr-selection-action-box.html
index 47db5f0..633530f 100644
--- a/polygerrit-ui/app/elements/diff/gr-selection-action-box/gr-selection-action-box.html
+++ b/polygerrit-ui/app/elements/diff/gr-selection-action-box/gr-selection-action-box.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,34 +18,22 @@
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
 <link rel="import" href="../../../behaviors/keyboard-shortcut-behavior/keyboard-shortcut-behavior.html">
 <link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../../shared/gr-tooltip/gr-tooltip.html">
 
 <dom-module id="gr-selection-action-box">
   <template>
     <style include="shared-styles">
       :host {
-        --gr-arrow-size: .65em;
-
-        background-color: rgba(22, 22, 22, .9);
-        border-radius: 3px;
-        color: #fff;
         cursor: pointer;
         font-family: var(--font-family);
-        padding: .5em .75em;
         position: absolute;
         white-space: nowrap;
       }
-      .arrow {
-        border: var(--gr-arrow-size) solid transparent;
-        border-top: var(--gr-arrow-size) solid rgba(22, 22, 22, 0.9);
-        height: 0;
-        left: calc(50% - var(--gr-arrow-size));
-        margin-top: .5em;
-        position: absolute;
-        width: 0;
-      }
     </style>
-    Press <strong>c</strong> to comment.
-    <div class="arrow"></div>
+    <gr-tooltip
+        id="tooltip"
+        text="Press c to comment"
+        position-below="[[positionBelow]]"></gr-tooltip>
   </template>
   <script src="gr-selection-action-box.js"></script>
 </dom-module>
diff --git a/polygerrit-ui/app/elements/diff/gr-selection-action-box/gr-selection-action-box.js b/polygerrit-ui/app/elements/diff/gr-selection-action-box/gr-selection-action-box.js
index c228235..6349ab6 100644
--- a/polygerrit-ui/app/elements/diff/gr-selection-action-box/gr-selection-action-box.js
+++ b/polygerrit-ui/app/elements/diff/gr-selection-action-box/gr-selection-action-box.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -37,6 +40,7 @@
           endChar: NaN,
         },
       },
+      positionBelow: Boolean,
       side: {
         type: String,
         value: '',
@@ -58,7 +62,7 @@
     placeAbove(el) {
       Polymer.dom.flush();
       const rect = this._getTargetBoundingRect(el);
-      const boxRect = this.getBoundingClientRect();
+      const boxRect = this.$.tooltip.getBoundingClientRect();
       const parentRect = this.parentElement.getBoundingClientRect();
       this.style.top =
           rect.top - parentRect.top - boxRect.height - 6 + 'px';
@@ -66,6 +70,17 @@
           rect.left - parentRect.left + (rect.width - boxRect.width) / 2 + 'px';
     },
 
+    placeBelow(el) {
+      Polymer.dom.flush();
+      const rect = this._getTargetBoundingRect(el);
+      const boxRect = this.$.tooltip.getBoundingClientRect();
+      const parentRect = this.parentElement.getBoundingClientRect();
+      this.style.top =
+          rect.top - parentRect.top + boxRect.height - 6 + 'px';
+      this.style.left =
+          rect.left - parentRect.left + (rect.width - boxRect.width) / 2 + 'px';
+    },
+
     _getTargetBoundingRect(el) {
       let rect;
       if (el instanceof Text) {
diff --git a/polygerrit-ui/app/elements/diff/gr-selection-action-box/gr-selection-action-box_test.html b/polygerrit-ui/app/elements/diff/gr-selection-action-box/gr-selection-action-box_test.html
index 8c70772..19155e4 100644
--- a/polygerrit-ui/app/elements/diff/gr-selection-action-box/gr-selection-action-box_test.html
+++ b/polygerrit-ui/app/elements/diff/gr-selection-action-box/gr-selection-action-box_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -38,15 +39,17 @@
   suite('gr-selection-action-box', () => {
     let container;
     let element;
+    let sandbox;
 
     setup(() => {
       container = fixture('basic');
       element = container.querySelector('gr-selection-action-box');
-      sinon.stub(element, 'fire');
+      sandbox = sinon.sandbox.create();
+      sandbox.stub(element, 'fire');
     });
 
     teardown(() => {
-      element.fire.restore();
+      sandbox.restore();
     });
 
     test('ignores regular keys', () => {
@@ -65,10 +68,10 @@
       setup(() => {
         e = {
           button: 0,
-          preventDefault: sinon.stub(),
-          stopPropagation: sinon.stub(),
+          preventDefault: sandbox.stub(),
+          stopPropagation: sandbox.stub(),
         };
-        sinon.stub(element, '_fireCreateComment');
+        sandbox.stub(element, '_fireCreateComment');
       });
 
       test('event handled if main button', () => {
@@ -107,20 +110,14 @@
 
       setup(() => {
         target = container.querySelector('.target');
-        sinon.stub(container, 'getBoundingClientRect').returns(
+        sandbox.stub(container, 'getBoundingClientRect').returns(
             {top: 1, bottom: 2, left: 3, right: 4, width: 50, height: 6});
-        sinon.stub(element, '_getTargetBoundingRect').returns(
+        sandbox.stub(element, '_getTargetBoundingRect').returns(
             {top: 42, bottom: 20, left: 30, right: 40, width: 100, height: 60});
-        sinon.stub(element, 'getBoundingClientRect').returns(
+        sandbox.stub(element.$.tooltip, 'getBoundingClientRect').returns(
             {width: 10, height: 10});
       });
 
-      teardown(() => {
-        element.getBoundingClientRect.restore();
-        container.getBoundingClientRect.restore();
-        element._getTargetBoundingRect.restore();
-      });
-
       test('placeAbove for Element argument', () => {
         element.placeAbove(target);
         assert.equal(element.style.top, '25px');
@@ -133,13 +130,24 @@
         assert.equal(element.style.left, '72px');
       });
 
+      test('placeBelow for Element argument', () => {
+        element.placeBelow(target);
+        assert.equal(element.style.top, '45px');
+        assert.equal(element.style.left, '72px');
+      });
+
+      test('placeBelow for Text Node argument', () => {
+        element.placeBelow(target.firstChild);
+        assert.equal(element.style.top, '45px');
+        assert.equal(element.style.left, '72px');
+      });
+
       test('uses document.createRange', () => {
-        sinon.spy(document, 'createRange');
+        sandbox.spy(document, 'createRange');
         element._getTargetBoundingRect.restore();
-        sinon.spy(element, '_getTargetBoundingRect');
+        sandbox.spy(element, '_getTargetBoundingRect');
         element.placeAbove(target.firstChild);
         assert.isTrue(document.createRange.called);
-        document.createRange.restore();
       });
     });
   });
diff --git a/polygerrit-ui/app/elements/diff/gr-syntax-layer/gr-syntax-layer.html b/polygerrit-ui/app/elements/diff/gr-syntax-layer/gr-syntax-layer.html
index 9c5d6bf..017cd5d 100644
--- a/polygerrit-ui/app/elements/diff/gr-syntax-layer/gr-syntax-layer.html
+++ b/polygerrit-ui/app/elements/diff/gr-syntax-layer/gr-syntax-layer.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,11 +15,11 @@
 limitations under the License.
 -->
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
-<link rel="import" href="../gr-syntax-lib-loader/gr-syntax-lib-loader.html">
+<link rel="import" href="../../shared/gr-lib-loader/gr-lib-loader.html">
 
 <dom-module id="gr-syntax-layer">
   <template>
-    <gr-syntax-lib-loader id="libLoader"></gr-syntax-lib-loader>
+    <gr-lib-loader id="libLoader"></gr-lib-loader>
   </template>
   <script src="../gr-diff/gr-diff-line.js"></script>
   <script src="../gr-diff-highlight/gr-annotation.js"></script>
diff --git a/polygerrit-ui/app/elements/diff/gr-syntax-layer/gr-syntax-layer.js b/polygerrit-ui/app/elements/diff/gr-syntax-layer/gr-syntax-layer.js
index 91e6287..8bf42b7 100644
--- a/polygerrit-ui/app/elements/diff/gr-syntax-layer/gr-syntax-layer.js
+++ b/polygerrit-ui/app/elements/diff/gr-syntax-layer/gr-syntax-layer.js
@@ -1,85 +1,123 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
   const LANGUAGE_MAP = {
     'application/dart': 'dart',
     'application/json': 'json',
+    'application/x-powershell': 'powershell',
     'application/typescript': 'typescript',
+    'application/xml': 'xml',
+    'application/xquery': 'xquery',
     'application/x-erb': 'erb',
     'text/css': 'css',
     'text/html': 'html',
     'text/javascript': 'js',
+    'text/jsx': 'jsx',
     'text/x-c': 'cpp',
     'text/x-c++src': 'cpp',
     'text/x-clojure': 'clojure',
+    'text/x-cmake': 'cmake',
+    'text/x-coffeescript': 'coffeescript',
     'text/x-common-lisp': 'lisp',
+    'text/x-crystal': 'crystal',
     'text/x-csharp': 'csharp',
     'text/x-csrc': 'cpp',
     'text/x-d': 'd',
+    'text/x-diff': 'diff',
+    'text/x-django': 'django',
+    'text/x-dockerfile': 'dockerfile',
+    'text/x-ebnf': 'ebnf',
+    'text/x-elm': 'elm',
+    'text/x-erlang': 'erlang',
+    'text/x-fortran': 'fortran',
     'text/x-go': 'go',
+    'text/x-groovy': 'groovy',
+    'text/x-haml': 'haml',
     'text/x-haskell': 'haskell',
+    'text/x-haxe': 'haxe',
+    'text/x-ini': 'ini',
     'text/x-java': 'java',
+    'text/x-julia': 'julia',
     'text/x-kotlin': 'kotlin',
+    'text/x-latex': 'latex',
+    'text/x-less': 'less',
     'text/x-lua': 'lua',
-    'text/x-markdown': 'markdown',
+    'text/x-mathematica': 'mathematica',
+    'text/x-nginx-conf': 'nginx',
+    'text/x-nsis': 'nsis',
     'text/x-objectivec': 'objectivec',
     'text/x-ocaml': 'ocaml',
     'text/x-perl': 'perl',
+    'text/x-pgsql': 'pgsql', // postgresql
     'text/x-php': 'php',
+    'text/x-properties': 'properties',
     'text/x-protobuf': 'protobuf',
     'text/x-puppet': 'puppet',
     'text/x-python': 'python',
+    'text/x-q': 'q',
     'text/x-ruby': 'ruby',
     'text/x-rustsrc': 'rust',
     'text/x-scala': 'scala',
+    'text/x-scss': 'scss',
+    'text/x-scheme': 'scheme',
     'text/x-shell': 'shell',
+    'text/x-spreadsheet': 'excel',
     'text/x-sh': 'bash',
     'text/x-sql': 'sql',
     'text/x-swift': 'swift',
+    'text/x-systemverilog': 'sv',
+    'text/x-tcl': 'tcl',
+    'text/x-twig': 'twig',
+    'text/x-vb': 'vb',
+    'text/x-verilog': 'v',
     'text/x-yaml': 'yaml',
+    'text/vbscript': 'vbscript',
   };
   const ASYNC_DELAY = 10;
 
   const CLASS_WHITELIST = {
-    'gr-diff gr-syntax gr-syntax-literal': true,
-    'gr-diff gr-syntax gr-syntax-keyword': true,
-    'gr-diff gr-syntax gr-syntax-selector-tag': true,
-    'gr-diff gr-syntax gr-syntax-built_in': true,
-    'gr-diff gr-syntax gr-syntax-type': true,
-    'gr-diff gr-syntax gr-syntax-selector-pseudo': true,
-    'gr-diff gr-syntax gr-syntax-template-variable': true,
-    'gr-diff gr-syntax gr-syntax-number': true,
-    'gr-diff gr-syntax gr-syntax-regexp': true,
-    'gr-diff gr-syntax gr-syntax-variable': true,
-    'gr-diff gr-syntax gr-syntax-selector-attr': true,
-    'gr-diff gr-syntax gr-syntax-template-tag': true,
-    'gr-diff gr-syntax gr-syntax-string': true,
-    'gr-diff gr-syntax gr-syntax-selector-id': true,
-    'gr-diff gr-syntax gr-syntax-title': true,
-    'gr-diff gr-syntax gr-syntax-comment': true,
-    'gr-diff gr-syntax gr-syntax-meta': true,
-    'gr-diff gr-syntax gr-syntax-meta-keyword': true,
-    'gr-diff gr-syntax gr-syntax-tag': true,
-    'gr-diff gr-syntax gr-syntax-name': true,
     'gr-diff gr-syntax gr-syntax-attr': true,
     'gr-diff gr-syntax gr-syntax-attribute': true,
-    'gr-diff gr-syntax gr-syntax-emphasis': true,
-    'gr-diff gr-syntax gr-syntax-strong': true,
+    'gr-diff gr-syntax gr-syntax-built_in': true,
+    'gr-diff gr-syntax gr-syntax-comment': true,
+    'gr-diff gr-syntax gr-syntax-function': true,
+    'gr-diff gr-syntax gr-syntax-keyword': true,
     'gr-diff gr-syntax gr-syntax-link': true,
+    'gr-diff gr-syntax gr-syntax-literal': true,
+    'gr-diff gr-syntax gr-syntax-meta': true,
+    'gr-diff gr-syntax gr-syntax-meta-keyword': true,
+    'gr-diff gr-syntax gr-syntax-name': true,
+    'gr-diff gr-syntax gr-syntax-number': true,
+    'gr-diff gr-syntax gr-syntax-params': true,
+    'gr-diff gr-syntax gr-syntax-regexp': true,
+    'gr-diff gr-syntax gr-syntax-selector-attr': true,
     'gr-diff gr-syntax gr-syntax-selector-class': true,
+    'gr-diff gr-syntax gr-syntax-selector-id': true,
+    'gr-diff gr-syntax gr-syntax-selector-pseudo': true,
+    'gr-diff gr-syntax gr-syntax-selector-tag': true,
+    'gr-diff gr-syntax gr-syntax-string': true,
+    'gr-diff gr-syntax gr-syntax-tag': true,
+    'gr-diff gr-syntax gr-syntax-template-tag': true,
+    'gr-diff gr-syntax gr-syntax-template-variable': true,
+    'gr-diff gr-syntax gr-syntax-title': true,
+    'gr-diff gr-syntax gr-syntax-type': true,
+    'gr-diff gr-syntax gr-syntax-variable': true,
   };
 
   const CPP_DIRECTIVE_WITH_LT_PATTERN = /^\s*#(if|define).*</;
@@ -438,7 +476,7 @@
     },
 
     _loadHLJS() {
-      return this.$.libLoader.get().then(hljs => {
+      return this.$.libLoader.getHLJS().then(hljs => {
         this._hljs = hljs;
       });
     },
diff --git a/polygerrit-ui/app/elements/diff/gr-syntax-layer/gr-syntax-layer_test.html b/polygerrit-ui/app/elements/diff/gr-syntax-layer/gr-syntax-layer_test.html
index 98a6f8e..f2458fc 100644
--- a/polygerrit-ui/app/elements/diff/gr-syntax-layer/gr-syntax-layer_test.html
+++ b/polygerrit-ui/app/elements/diff/gr-syntax-layer/gr-syntax-layer_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -184,7 +185,7 @@
 
       const mockHLJS = getMockHLJS();
       const highlightSpy = sinon.spy(mockHLJS, 'highlight');
-      sandbox.stub(element.$.libLoader, 'get',
+      sandbox.stub(element.$.libLoader, 'getHLJS',
           () => { return Promise.resolve(mockHLJS); });
       const processNextSpy = sandbox.spy(element, '_processNextLine');
       const processPromise = element.process();
diff --git a/polygerrit-ui/app/elements/diff/gr-syntax-lib-loader/gr-syntax-lib-loader.html b/polygerrit-ui/app/elements/diff/gr-syntax-lib-loader/gr-syntax-lib-loader.html
deleted file mode 100644
index fedd22a..0000000
--- a/polygerrit-ui/app/elements/diff/gr-syntax-lib-loader/gr-syntax-lib-loader.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<!--
-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.
--->
-<link rel="import" href="../../../bower_components/polymer/polymer.html">
-
-<dom-module id="gr-syntax-lib-loader">
-  <script src="gr-syntax-lib-loader.js"></script>
-</dom-module>
diff --git a/polygerrit-ui/app/elements/diff/gr-syntax-lib-loader/gr-syntax-lib-loader.js b/polygerrit-ui/app/elements/diff/gr-syntax-lib-loader/gr-syntax-lib-loader.js
deleted file mode 100644
index bfd8e90..0000000
--- a/polygerrit-ui/app/elements/diff/gr-syntax-lib-loader/gr-syntax-lib-loader.js
+++ /dev/null
@@ -1,110 +0,0 @@
-// 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.
-(function() {
-  'use strict';
-
-  const HLJS_PATH = 'bower_components/highlightjs/highlight.min.js';
-  const LIB_ROOT_PATTERN = /(.+\/)elements\/gr-app\.html/;
-
-  Polymer({
-    is: 'gr-syntax-lib-loader',
-
-    properties: {
-      _state: {
-        type: Object,
-
-        // NOTE: intended singleton.
-        value: {
-          loading: false,
-          callbacks: [],
-        },
-      },
-    },
-
-    get() {
-      return new Promise((resolve, reject) => {
-        // If the lib is totally loaded, resolve immediately.
-        if (this._getHighlightLib()) {
-          resolve(this._getHighlightLib());
-          return;
-        }
-
-        // If the library is not currently being loaded, then start loading it.
-        if (!this._state.loading) {
-          this._state.loading = true;
-          this._loadHLJS().then(this._onLibLoaded.bind(this)).catch(reject);
-        }
-
-        this._state.callbacks.push(resolve);
-      });
-    },
-
-    _onLibLoaded() {
-      const lib = this._getHighlightLib();
-      this._state.loading = false;
-      for (const cb of this._state.callbacks) {
-        cb(lib);
-      }
-      this._state.callbacks = [];
-    },
-
-    _getHighlightLib() {
-      return window.hljs;
-    },
-
-    _configureHighlightLib() {
-      this._getHighlightLib().configure(
-          {classPrefix: 'gr-diff gr-syntax gr-syntax-'});
-    },
-
-    _getLibRoot() {
-      if (this._cachedLibRoot) { return this._cachedLibRoot; }
-
-      const appLink = document.head
-        .querySelector('link[rel=import][href$="gr-app.html"]');
-
-      if (!appLink) { return null; }
-
-      return this._cachedLibRoot = appLink
-          .href
-          .match(LIB_ROOT_PATTERN)[1];
-    },
-    _cachedLibRoot: null,
-
-    _loadHLJS() {
-      return new Promise((resolve, reject) => {
-        const script = document.createElement('script');
-        const src = this._getHLJSUrl();
-
-        if (!src) {
-          reject(new Error('Unable to load blank HLJS url.'));
-          return;
-        }
-
-        script.src = src;
-        script.onload = function() {
-          this._configureHighlightLib();
-          resolve();
-        }.bind(this);
-        Polymer.dom(document.head).appendChild(script);
-      });
-    },
-
-    _getHLJSUrl() {
-      const root = this._getLibRoot();
-      if (!root) { return null; }
-      return root + HLJS_PATH;
-    },
-  });
-})();
diff --git a/polygerrit-ui/app/elements/diff/gr-syntax-lib-loader/gr-syntax-lib-loader_test.html b/polygerrit-ui/app/elements/diff/gr-syntax-lib-loader/gr-syntax-lib-loader_test.html
deleted file mode 100644
index 6ddde46..0000000
--- a/polygerrit-ui/app/elements/diff/gr-syntax-lib-loader/gr-syntax-lib-loader_test.html
+++ /dev/null
@@ -1,135 +0,0 @@
-<!DOCTYPE html>
-<!--
-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-syntax-lib-loader</title>
-
-<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
-<script src="../../../bower_components/web-component-tester/browser.js"></script>
-<link rel="import" href="../../../test/common-test-setup.html"/>
-<link rel="import" href="gr-syntax-lib-loader.html">
-
-<script>void(0);</script>
-
-<test-fixture id="basic">
-  <template>
-    <gr-syntax-lib-loader></gr-syntax-lib-loader>
-  </template>
-</test-fixture>
-
-<script>
-  suite('gr-syntax-lib-loader tests', () => {
-    let element;
-    let resolveLoad;
-    let loadStub;
-
-    setup(() => {
-      element = fixture('basic');
-
-      loadStub = sinon.stub(element, '_loadHLJS', () =>
-        new Promise(resolve => resolveLoad = resolve)
-      );
-
-      // Assert preconditions:
-      assert.isFalse(element._state.loading);
-    });
-
-    teardown(() => {
-      if (window.hljs) {
-        delete window.hljs;
-      }
-      loadStub.restore();
-
-      // Because the element state is a singleton, clean it up.
-      element._state.loading = false;
-      element._state.callbacks = [];
-    });
-
-    test('only load once', done => {
-      const firstCallHandler = sinon.stub();
-      element.get().then(firstCallHandler);
-
-      // It should now be in the loading state.
-      assert.isTrue(loadStub.called);
-      assert.isTrue(element._state.loading);
-      assert.isFalse(firstCallHandler.called);
-
-      const secondCallHandler = sinon.stub();
-      element.get().then(secondCallHandler);
-
-      // No change in state.
-      assert.isTrue(element._state.loading);
-      assert.isFalse(firstCallHandler.called);
-      assert.isFalse(secondCallHandler.called);
-
-      // Now load the library.
-      resolveLoad();
-      flush(() => {
-        // The state should be loaded and both handlers called.
-        assert.isFalse(element._state.loading);
-        assert.isTrue(firstCallHandler.called);
-        assert.isTrue(secondCallHandler.called);
-        done();
-      });
-    });
-
-    suite('preloaded', () => {
-      setup(() => {
-        window.hljs = 'test-object';
-      });
-
-      teardown(() => {
-        delete window.hljs;
-      });
-
-      test('returns hljs', done => {
-        const firstCallHandler = sinon.stub();
-        element.get().then(firstCallHandler);
-        flush(() => {
-          assert.isTrue(firstCallHandler.called);
-          assert.isTrue(firstCallHandler.calledWith('test-object'));
-          done();
-        });
-      });
-    });
-
-    suite('_getHLJSUrl', () => {
-      suite('checking _getLibRoot', () => {
-        let libRootStub;
-        let root;
-
-        setup(() => {
-          libRootStub = sinon.stub(element, '_getLibRoot', () => root);
-        });
-
-        teardown(() => {
-          libRootStub.restore();
-        });
-
-        test('with no root', () => {
-          assert.isNull(element._getHLJSUrl());
-        });
-
-        test('with root', () => {
-          root = 'test-root.com/';
-          assert.equal(element._getHLJSUrl(),
-              'test-root.com/bower_components/highlightjs/highlight.min.js');
-        });
-      });
-    });
-  });
-</script>
diff --git a/polygerrit-ui/app/elements/diff/gr-syntax-themes/gr-syntax-theme.html b/polygerrit-ui/app/elements/diff/gr-syntax-themes/gr-syntax-theme.html
new file mode 100644
index 0000000..a122113
--- /dev/null
+++ b/polygerrit-ui/app/elements/diff/gr-syntax-themes/gr-syntax-theme.html
@@ -0,0 +1,108 @@
+<!--
+@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.
+-->
+<dom-module id="gr-syntax-theme">
+  <template>
+    <style>
+      /**
+       * @overview Highlight.js emits the following classes that do not have
+       * styles here:
+       *    subst, symbol, class, function, doctag, meta-string, section, name,
+       *    builtin-name, bulletm, code, formula, quote, addition, deletion,
+       *    attribute
+       * @see {@link http://highlightjs.readthedocs.io/en/latest/css-classes-reference.html}
+       */
+
+      .contentText {
+        color: var(--syntax-default-color);
+      }
+      .gr-syntax-attribute {
+        color: var(--syntax-attribute-color);
+      }
+      .gr-syntax-function {
+        color: var(--syntax-function-color);
+      }
+      .gr-syntax-meta {
+        color: var(--syntax-meta-color);
+      }
+      .gr-syntax-keyword,
+      .gr-syntax-name {
+        color: var(--syntax-keyword-color);
+        line-height: 1;
+      }
+      .gr-syntax-number {
+        color: var(--syntax-number-color);
+      }
+      .gr-syntax-selector-class {
+        color: var(--syntax-selector-class-color);
+      }
+      .gr-syntax-variable {
+        color: var(--syntax-variable-color);
+      }
+      .gr-syntax-template-variable {
+        color: var(--syntax-template-variable-color);
+      }
+      .gr-syntax-comment {
+        color: var(--syntax-comment-color);
+      }
+      .gr-syntax-string {
+        color: var(--syntax-string-color);
+      }
+      .gr-syntax-selector-id {
+        color: var(--syntax-selector-id-color);
+      }
+      .gr-syntax-built_in {
+        color: var(--syntax-built_in-color);
+      }
+      .gr-syntax-tag {
+        color: var(--syntax-tag-color);
+      }
+      .gr-syntax-link {
+        color: var(--syntax-link-color);
+      }
+      .gr-syntax-meta-keyword {
+        color: var(--syntax-meta-keyword-color);
+      }
+      .gr-syntax-type {
+        color: var(--syntax-type-color);
+      }
+      .gr-syntax-title {
+        color: var(--syntax-title-color);
+      }
+      .gr-syntax-attr {
+        color: var(--syntax-attr-color);
+      }
+      .gr-syntax-literal { /* XML/HTML Attribute */
+        color: var(--syntax-literal-color);
+      }
+      .gr-syntax-selector-pseudo {
+        color: var(--syntax-selector-pseudo-color);
+      }
+      .gr-syntax-regexp {
+        color: var(--syntax-regexp-color);
+      }
+      .gr-syntax-selector-attr {
+        color: var(--syntax-selector-attr-color);
+      }
+      .gr-syntax-template-tag {
+        color: var(--syntax-template-tag-color);
+      }
+      .gr-syntax-param {
+        color: var(--syntax-param-color);
+      }
+    </style>
+  </template>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/diff/gr-syntax-themes/gr-theme-default.html b/polygerrit-ui/app/elements/diff/gr-syntax-themes/gr-theme-default.html
deleted file mode 100644
index 062a90e..0000000
--- a/polygerrit-ui/app/elements/diff/gr-syntax-themes/gr-theme-default.html
+++ /dev/null
@@ -1,87 +0,0 @@
-<!--
-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.
--->
-<dom-module id="gr-theme-default">
-  <template>
-    <style>
-      /**
-       * @overview Highlight.js emits the following classes that do not have
-       * styles here:
-       *    subst, symbol, class, function, doctag, meta-string, section, name,
-       *    builtin-name, bulletm, code, formula, quote, addition, deletion,
-       *    attribute
-       * @see {@link http://highlightjs.readthedocs.io/en/latest/css-classes-reference.html}
-       */
-
-      .gr-syntax-meta {
-         color: #FF1717;
-      }
-      .gr-syntax-keyword,
-      .gr-syntax-name {
-        color: #9E0069;
-        line-height: 1em;
-      }
-      .gr-syntax-number,
-      .gr-syntax-selector-class {
-        color: #164;
-      }
-      .gr-syntax-variable {
-        color: black;
-      }
-      .gr-syntax-template-variable {
-        color: #0000C0;
-      }
-      .gr-syntax-comment {
-        color: #3F7F5F;
-      }
-      .gr-syntax-string,
-      .gr-syntax-selector-id {
-        color: #2A00FF;
-      }
-      .gr-syntax-built_in {
-        color: #30a;
-      }
-      .gr-syntax-tag {
-        color: #170;
-      }
-      .gr-syntax-link,
-      .gr-syntax-meta-keyword {
-        color: #219;
-      }
-      .gr-syntax-type {
-        color: var(--color-link);
-      }
-      .gr-syntax-title {
-        color: #0000C0;
-      }
-      .gr-syntax-attr,
-      .gr-syntax-literal { /* XML/HTML Attribute */
-        color: #219;
-      }
-      .gr-syntax-selector-pseudo,
-      .gr-syntax-regexp,
-      .gr-syntax-selector-attr,
-      .gr-syntax-template-tag {
-        color: #FA8602;
-      }
-      .gr-syntax-emphasis {
-        font-style: italic;
-      }
-      .gr-syntax-strong {
-        font-weight: 700;
-      }
-    </style>
-  </template>
-</dom-module>
diff --git a/polygerrit-ui/app/elements/documentation/gr-documentation-search/gr-documentation-search.html b/polygerrit-ui/app/elements/documentation/gr-documentation-search/gr-documentation-search.html
new file mode 100644
index 0000000..720f353
--- /dev/null
+++ b/polygerrit-ui/app/elements/documentation/gr-documentation-search/gr-documentation-search.html
@@ -0,0 +1,62 @@
+<!--
+@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="../../../bower_components/polymer/polymer.html">
+
+<link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
+<link rel="import" href="../../../behaviors/gr-list-view-behavior/gr-list-view-behavior.html">
+<link rel="import" href="../../../bower_components/iron-input/iron-input.html">
+<link rel="import" href="../../../styles/gr-table-styles.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../../shared/gr-list-view/gr-list-view.html">
+<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
+
+<dom-module id="gr-documentation-search">
+  <template>
+    <style include="shared-styles"></style>
+    <style include="gr-table-styles"></style>
+    <gr-list-view
+        filter="[[_filter]]"
+        items=false
+        offset=0
+        loading="[[_loading]]"
+        path="[[_path]]">
+      <table id="list" class="genericList">
+        <tr class="headerRow">
+          <th class="name topHeader">Name</th>
+          <th class="name topHeader"></th>
+          <th class="name topHeader"></th>
+        </tr>
+        <tr id="loading" class$="loadingMsg [[computeLoadingClass(_loading)]]">
+          <td>Loading...</td>
+        </tr>
+        <tbody class$="[[computeLoadingClass(_loading)]]">
+          <template is="dom-repeat" items="[[_documentationSearches]]">
+            <tr class="table">
+              <td class="name">
+                <a href$="[[_computeSearchUrl(item.url)]]">[[item.title]]</a>
+              </td>
+              <td></td>
+              <td></td>
+            </tr>
+          </template>
+        </tbody>
+      </table>
+    </gr-list-view>
+    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
+  </template>
+  <script src="gr-documentation-search.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/documentation/gr-documentation-search/gr-documentation-search.js b/polygerrit-ui/app/elements/documentation/gr-documentation-search/gr-documentation-search.js
new file mode 100644
index 0000000..f850b9d
--- /dev/null
+++ b/polygerrit-ui/app/elements/documentation/gr-documentation-search/gr-documentation-search.js
@@ -0,0 +1,81 @@
+/**
+ * @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-documentation-search',
+
+    properties: {
+      /**
+       * URL params passed from the router.
+       */
+      params: {
+        type: Object,
+        observer: '_paramsChanged',
+      },
+
+      _path: {
+        type: String,
+        readOnly: true,
+        value: '/Documentation',
+      },
+      _documentationSearches: Array,
+
+      _loading: {
+        type: Boolean,
+        value: true,
+      },
+      _filter: {
+        type: String,
+        value: '',
+      },
+    },
+
+    behaviors: [
+      Gerrit.ListViewBehavior,
+    ],
+
+    attached() {
+      this.dispatchEvent(
+          new CustomEvent('title-change', {title: 'Documentation Search'}));
+    },
+
+    _paramsChanged(params) {
+      this._loading = true;
+      this._filter = this.getFilterValue(params);
+
+      return this._getDocumentationSearches(this._filter);
+    },
+
+    _getDocumentationSearches(filter) {
+      this._documentationSearches = [];
+      return this.$.restAPI.getDocumentationSearches(filter)
+          .then(searches => {
+            // Late response.
+            if (filter !== this._filter || !searches) { return; }
+            this._documentationSearches = searches;
+            this._loading = false;
+          });
+    },
+
+    _computeSearchUrl(url) {
+      if (!url) { return ''; }
+      return this.getBaseUrl() + '/' + url;
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/documentation/gr-documentation-search/gr-documentation-search_test.html b/polygerrit-ui/app/elements/documentation/gr-documentation-search/gr-documentation-search_test.html
new file mode 100644
index 0000000..84addb0
--- /dev/null
+++ b/polygerrit-ui/app/elements/documentation/gr-documentation-search/gr-documentation-search_test.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html>
+<!--
+@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.
+-->
+
+<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+<title>gr-documentation-search</title>
+
+<script src="../../../bower_components/page/page.js"></script>
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-documentation-search.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-documentation-search></gr-documentation-search>
+  </template>
+</test-fixture>
+
+<script>
+  let counter;
+  const documentationGenerator = () => {
+    return {
+      title: `Gerrit Code Review - REST API Developers Notes${++counter}`,
+      url: 'Documentation/dev-rest-api.html',
+    };
+  };
+
+  suite('gr-documentation-search tests', () => {
+    let element;
+    let documentationSearches;
+    let sandbox;
+    let value;
+
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+      sandbox.stub(page, 'show');
+      element = fixture('basic');
+      counter = 0;
+    });
+
+    teardown(() => {
+      sandbox.restore();
+    });
+
+    suite('list with searches for documentation', () => {
+      setup(done => {
+        documentationSearches = _.times(26, documentationGenerator);
+        stub('gr-rest-api-interface', {
+          getDocumentationSearches() {
+            return Promise.resolve(documentationSearches);
+          },
+        });
+        element._paramsChanged(value).then(() => { flush(done); });
+      });
+
+      test('test for test repo in the list', done => {
+        flush(() => {
+          assert.equal(element._documentationSearches[0].title,
+              'Gerrit Code Review - REST API Developers Notes1');
+          assert.equal(element._documentationSearches[0].url,
+              'Documentation/dev-rest-api.html');
+          done();
+        });
+      });
+    });
+
+    suite('filter', () => {
+      setup(() => {
+        documentationSearches = _.times(25, documentationGenerator);
+        documentationSearchesFiltered = _.times(1, documentationSearches);
+      });
+
+      test('_paramsChanged', done => {
+        sandbox.stub(element.$.restAPI, 'getDocumentationSearches', () => {
+          return Promise.resolve(documentationSearches);
+        });
+        const value = {
+          filter: 'test',
+        };
+        element._paramsChanged(value).then(() => {
+          assert.isTrue(element.$.restAPI.getDocumentationSearches.lastCall
+              .calledWithExactly('test'));
+          done();
+        });
+      });
+    });
+
+    suite('loading', () => {
+      test('correct contents are displayed', () => {
+        assert.isTrue(element._loading);
+        assert.equal(element.computeLoadingClass(element._loading), 'loading');
+        assert.equal(getComputedStyle(element.$.loading).display, 'block');
+
+        element._loading = false;
+        element._repos = _.times(25, documentationGenerator);
+
+        flushAsynchronousOperations();
+        assert.equal(element.computeLoadingClass(element._loading), '');
+        assert.equal(getComputedStyle(element.$.loading).display, 'none');
+      });
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/edit/gr-default-editor/gr-default-editor.html b/polygerrit-ui/app/elements/edit/gr-default-editor/gr-default-editor.html
new file mode 100644
index 0000000..093e979
--- /dev/null
+++ b/polygerrit-ui/app/elements/edit/gr-default-editor/gr-default-editor.html
@@ -0,0 +1,43 @@
+<!--
+@license
+Copyright (C) 2017 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="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+
+<dom-module id="gr-default-editor">
+  <template>
+    <style include="shared-styles">
+      textarea {
+        border: none;
+        box-sizing: border-box;
+        font-family: var(--monospace-font-family);
+        min-height: 60vh;
+        resize: none;
+        white-space: pre;
+        width: 100%;
+      }
+      textarea:focus {
+        outline: none;
+      }
+    </style>
+    <textarea
+        id="textarea"
+        value="[[fileContent]]"
+        on-input="_handleTextareaInput"></textarea>
+  </template>
+  <script src="gr-default-editor.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/edit/gr-default-editor/gr-default-editor.js b/polygerrit-ui/app/elements/edit/gr-default-editor/gr-default-editor.js
new file mode 100644
index 0000000..168ded8
--- /dev/null
+++ b/polygerrit-ui/app/elements/edit/gr-default-editor/gr-default-editor.js
@@ -0,0 +1,38 @@
+/**
+ * @license
+ * Copyright (C) 2017 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-default-editor',
+
+    /**
+     * Fired when the content of the editor changes.
+     *
+     * @event content-change
+     */
+
+    properties: {
+      fileContent: String,
+    },
+
+    _handleTextareaInput(e) {
+      this.dispatchEvent(new CustomEvent('content-change',
+          {detail: {value: e.target.value}, bubbles: true}));
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/edit/gr-default-editor/gr-default-editor_test.html b/polygerrit-ui/app/elements/edit/gr-default-editor/gr-default-editor_test.html
new file mode 100644
index 0000000..b79cd9d
--- /dev/null
+++ b/polygerrit-ui/app/elements/edit/gr-default-editor/gr-default-editor_test.html
@@ -0,0 +1,56 @@
+<!--
+@license
+Copyright (C) 2017 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-default-editor</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+
+<link rel="import" href="gr-default-editor.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-default-editor></gr-default-editor>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-default-editor tests', () => {
+    let element;
+
+    setup(() => {
+      element = fixture('basic');
+      element.fileContent = '';
+    });
+
+    test('fires content-change event', done => {
+      const contentChangedHandler = e => {
+        assert.equal(e.detail.value, 'test');
+        done();
+      };
+      const textarea = element.$.textarea;
+      element.addEventListener('content-change', contentChangedHandler);
+      textarea.value = 'test';
+      textarea.dispatchEvent(new CustomEvent('input',
+          {target: textarea, bubbles: true}));
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/edit/gr-edit-constants.html b/polygerrit-ui/app/elements/edit/gr-edit-constants.html
new file mode 100644
index 0000000..d526ccd
--- /dev/null
+++ b/polygerrit-ui/app/elements/edit/gr-edit-constants.html
@@ -0,0 +1,33 @@
+<!--
+@license
+Copyright (C) 2017 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.
+-->
+<script>
+  (function(window) {
+    'use strict';
+
+    const GrEditConstants = window.GrEditConstants || {};
+
+    // Order corresponds to order in the UI.
+    GrEditConstants.Actions = {
+      OPEN: {label: 'Open', id: 'open'},
+      DELETE: {label: 'Delete', id: 'delete'},
+      RENAME: {label: 'Rename', id: 'rename'},
+      RESTORE: {label: 'Restore', id: 'restore'},
+    };
+
+    window.GrEditConstants = GrEditConstants;
+  })(window);
+</script>
diff --git a/polygerrit-ui/app/elements/edit/gr-edit-controls/gr-edit-controls.html b/polygerrit-ui/app/elements/edit/gr-edit-controls/gr-edit-controls.html
new file mode 100644
index 0000000..81b3c07
--- /dev/null
+++ b/polygerrit-ui/app/elements/edit/gr-edit-controls/gr-edit-controls.html
@@ -0,0 +1,161 @@
+<!--
+@license
+Copyright (C) 2017 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="../../../bower_components/polymer/polymer.html">
+
+<link rel="import" href="../../../behaviors/gr-patch-set-behavior/gr-patch-set-behavior.html">
+<link rel="import" href="../../../behaviors/gr-path-list-behavior/gr-path-list-behavior.html">
+<link rel="import" href="../../../bower_components/iron-input/iron-input.html">
+<link rel="import" href="../../core/gr-navigation/gr-navigation.html">
+<link rel="import" href="../../shared/gr-autocomplete/gr-autocomplete.html">
+<link rel="import" href="../../shared/gr-button/gr-button.html">
+<link rel="import" href="../../shared/gr-dialog/gr-dialog.html">
+<link rel="import" href="../../shared/gr-dropdown/gr-dropdown.html">
+<link rel="import" href="../../shared/gr-overlay/gr-overlay.html">
+<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
+<link rel="import" href="../gr-edit-constants.html">
+
+<link rel="import" href="../../../styles/shared-styles.html">
+
+<dom-module id="gr-edit-controls">
+  <template>
+    <style include="shared-styles">
+      :host {
+        align-items: center;
+        display: flex;
+        justify-content: flex-end;
+      }
+      .invisible {
+        display: none;
+      }
+      gr-button {
+        margin-left: 1em;
+        text-decoration: none;
+      }
+      gr-dialog {
+        width: 50em;
+      }
+      gr-dialog .main {
+        width: 100%;
+      }
+      gr-autocomplete {
+        --gr-autocomplete: {
+          border: 1px solid var(--border-color);
+          border-radius: 2px;
+          font-size: var(--font-size-normal);
+          height: 2em;
+          padding: 0 .15em;
+        }
+      }
+      input {
+        border: 1px solid var(--border-color);
+        border-radius: 2px;
+        font-size: var(--font-size-normal);
+        height: 2em;
+        margin: .5em 0;
+        padding: 0 .15em;
+        width: 100%;
+      }
+      @media screen and (max-width: 50em) {
+        gr-dialog {
+          width: 100vw;
+        }
+      }
+    </style>
+    <template is="dom-repeat" items="[[_actions]]" as="action">
+      <gr-button
+          id$="[[action.id]]"
+          class$="[[_computeIsInvisible(action.id, hiddenActions)]]"
+          link
+          on-tap="_handleTap">[[action.label]]</gr-button>
+    </template>
+    <gr-overlay id="overlay" with-backdrop>
+      <gr-dialog
+          id="openDialog"
+          class="invisible dialog"
+          disabled$="[[!_isValidPath(_path)]]"
+          confirm-label="Open"
+          confirm-on-enter
+          on-confirm="_handleOpenConfirm"
+          on-cancel="_handleDialogCancel">
+        <div class="header" slot="header">
+          Open an existing or new file
+        </div>
+        <div class="main" slot="main">
+          <gr-autocomplete
+              placeholder="Enter an existing or new full file path."
+              query="[[_query]]"
+              text="{{_path}}"></gr-autocomplete>
+        </div>
+      </gr-dialog>
+      <gr-dialog
+          id="deleteDialog"
+          class="invisible dialog"
+          disabled$="[[!_isValidPath(_path)]]"
+          confirm-label="Delete"
+          confirm-on-enter
+          on-confirm="_handleDeleteConfirm"
+          on-cancel="_handleDialogCancel">
+        <div class="header" slot="header">Delete a file from the repo</div>
+        <div class="main" slot="main">
+          <gr-autocomplete
+              placeholder="Enter an existing full file path."
+              query="[[_query]]"
+              text="{{_path}}"></gr-autocomplete>
+        </div>
+      </gr-dialog>
+      <gr-dialog
+          id="renameDialog"
+          class="invisible dialog"
+          disabled$="[[!_computeRenameDisabled(_path, _newPath)]]"
+          confirm-label="Rename"
+          confirm-on-enter
+          on-confirm="_handleRenameConfirm"
+          on-cancel="_handleDialogCancel">
+        <div class="header" slot="header">Rename a file in the repo</div>
+        <div class="main" slot="main">
+          <gr-autocomplete
+              placeholder="Enter an existing full file path."
+              query="[[_query]]"
+              text="{{_path}}"></gr-autocomplete>
+          <input
+              class="newPathInput"
+              is="iron-input"
+              bind-value="{{_newPath}}"
+              placeholder="Enter the new path."/>
+        </div>
+      </gr-dialog>
+      <gr-dialog
+          id="restoreDialog"
+          class="invisible dialog"
+          confirm-label="Restore"
+          confirm-on-enter
+          on-confirm="_handleRestoreConfirm"
+          on-cancel="_handleDialogCancel">
+        <div class="header" slot="header">Restore this file?</div>
+        <div class="main" slot="main">
+          <input
+              is="iron-input"
+              disabled
+              bind-value="{{_path}}"/>
+        </div>
+      </gr-dialog>
+    </gr-overlay>
+    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
+  </template>
+  <script src="gr-edit-controls.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/edit/gr-edit-controls/gr-edit-controls.js b/polygerrit-ui/app/elements/edit/gr-edit-controls/gr-edit-controls.js
new file mode 100644
index 0000000..8740b0d
--- /dev/null
+++ b/polygerrit-ui/app/elements/edit/gr-edit-controls/gr-edit-controls.js
@@ -0,0 +1,227 @@
+/**
+ * @license
+ * Copyright (C) 2017 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-edit-controls',
+    properties: {
+      change: Object,
+      patchNum: String,
+
+      /**
+       * TODO(kaspern): by default, the RESTORE action should be hidden in the
+       * file-list as it is a per-file action only. Remove this default value
+       * when the Actions dictionary is moved to a shared constants file and
+       * use the hiddenActions property in the parent component.
+       */
+      hiddenActions: {
+        type: Array,
+        value() { return [GrEditConstants.Actions.RESTORE.id]; },
+      },
+
+      _actions: {
+        type: Array,
+        value() { return Object.values(GrEditConstants.Actions); },
+      },
+      _path: {
+        type: String,
+        value: '',
+      },
+      _newPath: {
+        type: String,
+        value: '',
+      },
+      _query: {
+        type: Function,
+        value() {
+          return this._queryFiles.bind(this);
+        },
+      },
+    },
+
+    behaviors: [
+      Gerrit.PatchSetBehavior,
+    ],
+
+    _handleTap(e) {
+      e.preventDefault();
+      const action = Polymer.dom(e).localTarget.id;
+      switch (action) {
+        case GrEditConstants.Actions.OPEN.id:
+          this.openOpenDialog();
+          return;
+        case GrEditConstants.Actions.DELETE.id:
+          this.openDeleteDialog();
+          return;
+        case GrEditConstants.Actions.RENAME.id:
+          this.openRenameDialog();
+          return;
+        case GrEditConstants.Actions.RESTORE.id:
+          this.openRestoreDialog();
+          return;
+      }
+    },
+
+    /**
+     * @param {string=} opt_path
+     */
+    openOpenDialog(opt_path) {
+      if (opt_path) { this._path = opt_path; }
+      return this._showDialog(this.$.openDialog);
+    },
+
+    /**
+     * @param {string=} opt_path
+     */
+    openDeleteDialog(opt_path) {
+      if (opt_path) { this._path = opt_path; }
+      return this._showDialog(this.$.deleteDialog);
+    },
+
+    /**
+     * @param {string=} opt_path
+     */
+    openRenameDialog(opt_path) {
+      if (opt_path) { this._path = opt_path; }
+      return this._showDialog(this.$.renameDialog);
+    },
+
+    /**
+     * @param {string=} opt_path
+     */
+    openRestoreDialog(opt_path) {
+      if (opt_path) { this._path = opt_path; }
+      return this._showDialog(this.$.restoreDialog);
+    },
+
+    /**
+     * Given a path string, checks that it is a valid file path.
+     * @param {string} path
+     * @return {boolean}
+     */
+    _isValidPath(path) {
+      // Double negation needed for strict boolean return type.
+      return !!path.length && !path.endsWith('/');
+    },
+
+    _computeRenameDisabled(path, newPath) {
+      return this._isValidPath(path) && this._isValidPath(newPath);
+    },
+
+    /**
+     * Given a dom event, gets the dialog that lies along this event path.
+     * @param {!Event} e
+     * @return {!Element|undefined}
+     */
+    _getDialogFromEvent(e) {
+      return Polymer.dom(e).path.find(element => {
+        if (!element.classList) { return false; }
+        return element.classList.contains('dialog');
+      });
+    },
+
+    _showDialog(dialog) {
+      // Some dialogs may not fire their on-close event when closed in certain
+      // ways (e.g. by clicking outside the dialog body). This call prevents
+      // multiple dialogs from being shown in the same overlay.
+      this._hideAllDialogs();
+
+      return this.$.overlay.open().then(() => {
+        dialog.classList.toggle('invisible', false);
+        const autocomplete = dialog.querySelector('gr-autocomplete');
+        if (autocomplete) { autocomplete.focus(); }
+        this.async(() => { this.$.overlay.center(); }, 1);
+      });
+    },
+
+    _hideAllDialogs() {
+      const dialogs = Polymer.dom(this.root).querySelectorAll('.dialog');
+      for (const dialog of dialogs) { this._closeDialog(dialog); }
+    },
+
+    /**
+     * @param {Element|undefined} dialog
+     * @param {boolean=} clearInputs
+     */
+    _closeDialog(dialog, clearInputs) {
+      if (!dialog) { return; }
+
+      if (clearInputs) {
+        // Dialog may have autocompletes and plain inputs -- as these have
+        // different properties representing their bound text, it is easier to
+        // just make two separate queries.
+        dialog.querySelectorAll('gr-autocomplete')
+            .forEach(input => { input.text = ''; });
+        dialog.querySelectorAll('input')
+            .forEach(input => { input.bindValue = ''; });
+      }
+
+      dialog.classList.toggle('invisible', true);
+      return this.$.overlay.close();
+    },
+
+    _handleDialogCancel(e) {
+      this._closeDialog(this._getDialogFromEvent(e));
+    },
+
+    _handleOpenConfirm(e) {
+      const url = Gerrit.Nav.getEditUrlForDiff(this.change, this._path,
+          this.patchNum);
+      Gerrit.Nav.navigateToRelativeUrl(url);
+      this._closeDialog(this._getDialogFromEvent(e), true);
+    },
+
+    _handleDeleteConfirm(e) {
+      this.$.restAPI.deleteFileInChangeEdit(this.change._number, this._path)
+          .then(res => {
+            if (!res.ok) { return; }
+            this._closeDialog(this._getDialogFromEvent(e), true);
+            Gerrit.Nav.navigateToChange(this.change);
+          });
+    },
+
+    _handleRestoreConfirm(e) {
+      this.$.restAPI.restoreFileInChangeEdit(this.change._number, this._path)
+          .then(res => {
+            if (!res.ok) { return; }
+            this._closeDialog(this._getDialogFromEvent(e), true);
+            Gerrit.Nav.navigateToChange(this.change);
+          });
+    },
+
+    _handleRenameConfirm(e) {
+      return this.$.restAPI.renameFileInChangeEdit(this.change._number,
+          this._path, this._newPath).then(res => {
+            if (!res.ok) { return; }
+            this._closeDialog(this._getDialogFromEvent(e), true);
+            Gerrit.Nav.navigateToChange(this.change);
+          });
+    },
+
+    _queryFiles(input) {
+      return this.$.restAPI.queryChangeFiles(this.change._number,
+          this.patchNum, input).then(res => res.map(file => {
+            return {name: file};
+          }));
+    },
+
+    _computeIsInvisible(id, hiddenActions) {
+      return hiddenActions.includes(id) ? 'invisible' : '';
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/edit/gr-edit-controls/gr-edit-controls_test.html b/polygerrit-ui/app/elements/edit/gr-edit-controls/gr-edit-controls_test.html
new file mode 100644
index 0000000..c67a2af
--- /dev/null
+++ b/polygerrit-ui/app/elements/edit/gr-edit-controls/gr-edit-controls_test.html
@@ -0,0 +1,363 @@
+<!--
+@license
+Copyright (C) 2017 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-edit-controls</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+
+<link rel="import" href="gr-edit-controls.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-edit-controls></gr-edit-controls>
+  </template>
+</test-fixture>
+
+<script>
+suite('gr-edit-controls tests', () => {
+  let element;
+  let sandbox;
+  let showDialogSpy;
+  let closeDialogSpy;
+  let queryStub;
+
+  setup(() => {
+    sandbox = sinon.sandbox.create();
+    element = fixture('basic');
+    element.change = {_number: '42'};
+    showDialogSpy = sandbox.spy(element, '_showDialog');
+    closeDialogSpy = sandbox.spy(element, '_closeDialog');
+    sandbox.stub(element, '_hideAllDialogs');
+    queryStub = sandbox.stub(element.$.restAPI, 'queryChangeFiles')
+        .returns(Promise.resolve([]));
+    flushAsynchronousOperations();
+  });
+
+  teardown(() => { sandbox.restore(); });
+
+  test('all actions exist', () => {
+    assert.equal(Polymer.dom(element.root).querySelectorAll('gr-button').length,
+        element._actions.length);
+  });
+
+  suite('edit button CUJ', () => {
+    let navStubs;
+    let openAutoCcmplete;
+
+    setup(() => {
+      navStubs = [
+        sandbox.stub(Gerrit.Nav, 'getEditUrlForDiff'),
+        sandbox.stub(Gerrit.Nav, 'navigateToRelativeUrl'),
+      ];
+      openAutoCcmplete = element.$.openDialog.querySelector('gr-autocomplete');
+    });
+
+    test('_isValidPath', () => {
+      assert.isFalse(element._isValidPath(''));
+      assert.isFalse(element._isValidPath('test/'));
+      assert.isFalse(element._isValidPath('/'));
+      assert.isTrue(element._isValidPath('test/path.cpp'));
+      assert.isTrue(element._isValidPath('test.js'));
+    });
+
+    test('open', () => {
+      MockInteractions.tap(element.$$('#open'));
+      element.patchNum = 1;
+      return showDialogSpy.lastCall.returnValue.then(() => {
+        assert.isTrue(element._hideAllDialogs.called);
+        assert.isTrue(element.$.openDialog.disabled);
+        assert.isFalse(queryStub.called);
+        openAutoCcmplete.noDebounce = true;
+        openAutoCcmplete.text = 'src/test.cpp';
+        assert.isTrue(queryStub.called);
+        assert.isFalse(element.$.openDialog.disabled);
+        MockInteractions.tap(element.$.openDialog.$$('gr-button[primary]'));
+        for (const stub of navStubs) { assert.isTrue(stub.called); }
+        assert.deepEqual(Gerrit.Nav.getEditUrlForDiff.lastCall.args,
+            [element.change, 'src/test.cpp', element.patchNum]);
+        assert.isTrue(closeDialogSpy.called);
+      });
+    });
+
+    test('cancel', () => {
+      MockInteractions.tap(element.$$('#open'));
+      return showDialogSpy.lastCall.returnValue.then(() => {
+        assert.isTrue(element.$.openDialog.disabled);
+        openAutoCcmplete.noDebounce = true;
+        openAutoCcmplete.text = 'src/test.cpp';
+        assert.isFalse(element.$.openDialog.disabled);
+        MockInteractions.tap(element.$.openDialog.$$('gr-button'));
+        for (const stub of navStubs) { assert.isFalse(stub.called); }
+        assert.isTrue(closeDialogSpy.called);
+        assert.equal(element._path, 'src/test.cpp');
+      });
+    });
+  });
+
+  suite('delete button CUJ', () => {
+    let navStub;
+    let deleteStub;
+    let deleteAutocomplete;
+
+    setup(() => {
+      navStub = sandbox.stub(Gerrit.Nav, 'navigateToChange');
+      deleteStub = sandbox.stub(element.$.restAPI, 'deleteFileInChangeEdit');
+      deleteAutocomplete =
+          element.$.deleteDialog.querySelector('gr-autocomplete');
+    });
+
+    test('delete', () => {
+      deleteStub.returns(Promise.resolve({ok: true}));
+      MockInteractions.tap(element.$$('#delete'));
+      return showDialogSpy.lastCall.returnValue.then(() => {
+        assert.isTrue(element.$.deleteDialog.disabled);
+        assert.isFalse(queryStub.called);
+        deleteAutocomplete.noDebounce = true;
+        deleteAutocomplete.text = 'src/test.cpp';
+        assert.isTrue(queryStub.called);
+        assert.isFalse(element.$.deleteDialog.disabled);
+        MockInteractions.tap(element.$.deleteDialog.$$('gr-button[primary]'));
+        flushAsynchronousOperations();
+
+        assert.isTrue(deleteStub.called);
+
+        return deleteStub.lastCall.returnValue.then(() => {
+          assert.equal(element._path, '');
+          assert.isTrue(navStub.called);
+          assert.isTrue(closeDialogSpy.called);
+        });
+      });
+    });
+
+    test('delete fails', () => {
+      deleteStub.returns(Promise.resolve({ok: false}));
+      MockInteractions.tap(element.$$('#delete'));
+      return showDialogSpy.lastCall.returnValue.then(() => {
+        assert.isTrue(element.$.deleteDialog.disabled);
+        assert.isFalse(queryStub.called);
+        deleteAutocomplete.noDebounce = true;
+        deleteAutocomplete.text = 'src/test.cpp';
+        assert.isTrue(queryStub.called);
+        assert.isFalse(element.$.deleteDialog.disabled);
+        MockInteractions.tap(element.$.deleteDialog.$$('gr-button[primary]'));
+        flushAsynchronousOperations();
+
+        assert.isTrue(deleteStub.called);
+
+        return deleteStub.lastCall.returnValue.then(() => {
+          assert.isFalse(navStub.called);
+          assert.isFalse(closeDialogSpy.called);
+        });
+      });
+    });
+
+    test('cancel', () => {
+      MockInteractions.tap(element.$$('#delete'));
+      return showDialogSpy.lastCall.returnValue.then(() => {
+        assert.isTrue(element.$.deleteDialog.disabled);
+        element.$.deleteDialog.querySelector('gr-autocomplete').text =
+            'src/test.cpp';
+        assert.isFalse(element.$.deleteDialog.disabled);
+        MockInteractions.tap(element.$.deleteDialog.$$('gr-button'));
+        assert.isFalse(navStub.called);
+        assert.isTrue(closeDialogSpy.called);
+        assert.equal(element._path, 'src/test.cpp');
+      });
+    });
+  });
+
+  suite('rename button CUJ', () => {
+    let navStub;
+    let renameStub;
+    let renameAutocomplete;
+
+    setup(() => {
+      navStub = sandbox.stub(Gerrit.Nav, 'navigateToChange');
+      renameStub = sandbox.stub(element.$.restAPI, 'renameFileInChangeEdit');
+      renameAutocomplete =
+          element.$.renameDialog.querySelector('gr-autocomplete');
+    });
+
+    test('rename', () => {
+      renameStub.returns(Promise.resolve({ok: true}));
+      MockInteractions.tap(element.$$('#rename'));
+      return showDialogSpy.lastCall.returnValue.then(() => {
+        assert.isTrue(element.$.renameDialog.disabled);
+        assert.isFalse(queryStub.called);
+        renameAutocomplete.noDebounce = true;
+        renameAutocomplete.text = 'src/test.cpp';
+        assert.isTrue(queryStub.called);
+        assert.isTrue(element.$.renameDialog.disabled);
+
+        element.$.renameDialog.querySelector('.newPathInput').bindValue =
+            'src/test.newPath';
+
+        assert.isFalse(element.$.renameDialog.disabled);
+        MockInteractions.tap(element.$.renameDialog.$$('gr-button[primary]'));
+        flushAsynchronousOperations();
+
+        assert.isTrue(renameStub.called);
+
+        return renameStub.lastCall.returnValue.then(() => {
+          assert.equal(element._path, '');
+          assert.isTrue(navStub.called);
+          assert.isTrue(closeDialogSpy.called);
+        });
+      });
+    });
+
+    test('rename fails', () => {
+      renameStub.returns(Promise.resolve({ok: false}));
+      MockInteractions.tap(element.$$('#rename'));
+      return showDialogSpy.lastCall.returnValue.then(() => {
+        assert.isTrue(element.$.renameDialog.disabled);
+        assert.isFalse(queryStub.called);
+        renameAutocomplete.noDebounce = true;
+        renameAutocomplete.text = 'src/test.cpp';
+        assert.isTrue(queryStub.called);
+        assert.isTrue(element.$.renameDialog.disabled);
+
+        element.$.renameDialog.querySelector('.newPathInput').bindValue =
+            'src/test.newPath';
+
+        assert.isFalse(element.$.renameDialog.disabled);
+        MockInteractions.tap(element.$.renameDialog.$$('gr-button[primary]'));
+        flushAsynchronousOperations();
+
+        assert.isTrue(renameStub.called);
+
+        return renameStub.lastCall.returnValue.then(() => {
+          assert.isFalse(navStub.called);
+          assert.isFalse(closeDialogSpy.called);
+        });
+      });
+    });
+
+    test('cancel', () => {
+      MockInteractions.tap(element.$$('#rename'));
+      return showDialogSpy.lastCall.returnValue.then(() => {
+        assert.isTrue(element.$.renameDialog.disabled);
+        element.$.renameDialog.querySelector('gr-autocomplete').text =
+            'src/test.cpp';
+        element.$.renameDialog.querySelector('.newPathInput').bindValue =
+            'src/test.newPath';
+        assert.isFalse(element.$.renameDialog.disabled);
+        MockInteractions.tap(element.$.renameDialog.$$('gr-button'));
+        assert.isFalse(navStub.called);
+        assert.isTrue(closeDialogSpy.called);
+        assert.equal(element._path, 'src/test.cpp');
+        assert.equal(element._newPath, 'src/test.newPath');
+      });
+    });
+  });
+
+  suite('restore button CUJ', () => {
+    let navStub;
+    let restoreStub;
+
+    setup(() => {
+      navStub = sandbox.stub(Gerrit.Nav, 'navigateToChange');
+      restoreStub = sandbox.stub(element.$.restAPI, 'restoreFileInChangeEdit');
+    });
+
+    test('restore hidden by default', () => {
+      assert.isTrue(element.$$('#restore').classList.contains('invisible'));
+    });
+
+    test('restore', () => {
+      restoreStub.returns(Promise.resolve({ok: true}));
+      element._path = 'src/test.cpp';
+      MockInteractions.tap(element.$$('#restore'));
+      return showDialogSpy.lastCall.returnValue.then(() => {
+        MockInteractions.tap(element.$.restoreDialog.$$('gr-button[primary]'));
+        flushAsynchronousOperations();
+
+        assert.isTrue(restoreStub.called);
+        assert.equal(restoreStub.lastCall.args[1], 'src/test.cpp');
+        return restoreStub.lastCall.returnValue.then(() => {
+          assert.equal(element._path, '');
+          assert.isTrue(navStub.called);
+          assert.isTrue(closeDialogSpy.called);
+        });
+      });
+    });
+
+    test('restore fails', () => {
+      restoreStub.returns(Promise.resolve({ok: false}));
+      element._path = 'src/test.cpp';
+      MockInteractions.tap(element.$$('#restore'));
+      return showDialogSpy.lastCall.returnValue.then(() => {
+        MockInteractions.tap(element.$.restoreDialog.$$('gr-button[primary]'));
+        flushAsynchronousOperations();
+
+        assert.isTrue(restoreStub.called);
+        assert.equal(restoreStub.lastCall.args[1], 'src/test.cpp');
+        return restoreStub.lastCall.returnValue.then(() => {
+          assert.isFalse(navStub.called);
+          assert.isFalse(closeDialogSpy.called);
+        });
+      });
+    });
+
+    test('cancel', () => {
+      element._path = 'src/test.cpp';
+      MockInteractions.tap(element.$$('#restore'));
+      return showDialogSpy.lastCall.returnValue.then(() => {
+        MockInteractions.tap(element.$.restoreDialog.$$('gr-button'));
+        assert.isFalse(navStub.called);
+        assert.isTrue(closeDialogSpy.called);
+        assert.equal(element._path, 'src/test.cpp');
+      });
+    });
+  });
+
+  test('openOpenDialog', () => {
+    return element.openOpenDialog('test/path.cpp').then(() => {
+      assert.isFalse(element.$.openDialog.hasAttribute('hidden'));
+      assert.equal(element.$.openDialog.querySelector('gr-autocomplete').text,
+          'test/path.cpp');
+    });
+  });
+
+  test('_getDialogFromEvent', () => {
+    const spy = sandbox.spy(element, '_getDialogFromEvent');
+    element.addEventListener('tap', element._getDialogFromEvent);
+
+    MockInteractions.tap(element.$.openDialog);
+    flushAsynchronousOperations();
+    assert.equal(spy.lastCall.returnValue.id, 'openDialog');
+
+    MockInteractions.tap(element.$.deleteDialog);
+    flushAsynchronousOperations();
+    assert.equal(spy.lastCall.returnValue.id, 'deleteDialog');
+
+    MockInteractions.tap(
+        element.$.deleteDialog.querySelector('gr-autocomplete'));
+    flushAsynchronousOperations();
+    assert.equal(spy.lastCall.returnValue.id, 'deleteDialog');
+
+    MockInteractions.tap(element);
+    flushAsynchronousOperations();
+    assert.notOk(spy.lastCall.returnValue);
+  });
+});
+</script>
diff --git a/polygerrit-ui/app/elements/edit/gr-edit-file-controls/gr-edit-file-controls.html b/polygerrit-ui/app/elements/edit/gr-edit-file-controls/gr-edit-file-controls.html
new file mode 100644
index 0000000..c57a147
--- /dev/null
+++ b/polygerrit-ui/app/elements/edit/gr-edit-file-controls/gr-edit-file-controls.html
@@ -0,0 +1,62 @@
+<!--
+@license
+Copyright (C) 2017 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="../../../bower_components/polymer/polymer.html">
+
+<link rel="import" href="../../shared/gr-button/gr-button.html">
+<link rel="import" href="../../shared/gr-dropdown/gr-dropdown.html">
+<link rel="import" href="../gr-edit-constants.html">
+
+<link rel="import" href="../../../styles/shared-styles.html">
+
+<dom-module id="gr-edit-file-controls">
+  <template>
+    <style include="shared-styles">
+      :host {
+        align-items: center;
+        display: flex;
+        justify-content: flex-end;
+      }
+      #actions {
+        margin-right: 1em;
+      }
+      gr-button,
+      gr-dropdown {
+        --gr-button: {
+          height: 1.8em;
+        }
+      }
+      gr-dropdown {
+        --gr-dropdown-item: {
+          background-color: transparent;
+          border: none;
+          color: var(--link-color);
+          font-size: inherit;
+          text-transform: uppercase;
+        }
+      }
+    </style>
+    <gr-dropdown
+        id="actions"
+        items="[[_fileActions]]"
+        down-arrow
+        vertical-offset="20"
+        on-tap-item="_handleActionTap"
+        link>Actions</gr-dropdown>
+  </template>
+  <script src="gr-edit-file-controls.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/edit/gr-edit-file-controls/gr-edit-file-controls.js b/polygerrit-ui/app/elements/edit/gr-edit-file-controls/gr-edit-file-controls.js
new file mode 100644
index 0000000..82010f5
--- /dev/null
+++ b/polygerrit-ui/app/elements/edit/gr-edit-file-controls/gr-edit-file-controls.js
@@ -0,0 +1,62 @@
+/**
+ * @license
+ * Copyright (C) 2017 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-edit-file-controls',
+
+    /**
+     * Fired when an action in the overflow menu is tapped.
+     *
+     * @event file-action-tap
+     */
+
+    properties: {
+      filePath: String,
+      _allFileActions: {
+        type: Array,
+        value: () => Object.values(GrEditConstants.Actions),
+      },
+      _fileActions: {
+        type: Array,
+        computed: '_computeFileActions(_allFileActions)',
+      },
+    },
+
+    _handleActionTap(e) {
+      e.preventDefault();
+      e.stopPropagation();
+      this._dispatchFileAction(e.detail.id, this.filePath);
+    },
+
+    _dispatchFileAction(action, path) {
+      this.dispatchEvent(new CustomEvent('file-action-tap',
+          {detail: {action, path}, bubbles: true}));
+    },
+
+    _computeFileActions(actions) {
+      // TODO(kaspern): conditionally disable some actions based on file status.
+      return actions.map(action => {
+        return {
+          name: action.label,
+          id: action.id,
+        };
+      });
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/edit/gr-edit-file-controls/gr-edit-file-controls_test.html b/polygerrit-ui/app/elements/edit/gr-edit-file-controls/gr-edit-file-controls_test.html
new file mode 100644
index 0000000..12d9e0b
--- /dev/null
+++ b/polygerrit-ui/app/elements/edit/gr-edit-file-controls/gr-edit-file-controls_test.html
@@ -0,0 +1,103 @@
+<!--
+@license
+Copyright (C) 2017 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-edit-file-controls</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+
+<link rel="import" href="../gr-edit-constants.html">
+<link rel="import" href="gr-edit-file-controls.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-edit-file-controls></gr-edit-file-controls>
+  </template>
+</test-fixture>
+
+<script>
+suite('gr-edit-file-controls tests', () => {
+  let element;
+  let sandbox;
+  let fileActionHandler;
+
+  setup(() => {
+    sandbox = sinon.sandbox.create();
+    element = fixture('basic');
+    fileActionHandler = sandbox.stub();
+    element.addEventListener('file-action-tap', fileActionHandler);
+  });
+
+  teardown(() => { sandbox.restore(); });
+
+  test('open tap emits event', () => {
+    const actions = element.$.actions;
+    element.filePath = 'foo';
+    actions._open();
+    flushAsynchronousOperations();
+
+    MockInteractions.tap(actions.$$('li [data-id="open"]'));
+    assert.isTrue(fileActionHandler.called);
+    assert.deepEqual(fileActionHandler.lastCall.args[0].detail,
+        {action: GrEditConstants.Actions.OPEN.id, path: 'foo'});
+  });
+
+  test('delete tap emits event', () => {
+    const actions = element.$.actions;
+    element.filePath = 'foo';
+    actions._open();
+    flushAsynchronousOperations();
+
+    MockInteractions.tap(actions.$$('li [data-id="delete"]'));
+    assert.isTrue(fileActionHandler.called);
+    assert.deepEqual(fileActionHandler.lastCall.args[0].detail,
+        {action: GrEditConstants.Actions.DELETE.id, path: 'foo'});
+  });
+
+  test('restore tap emits event', () => {
+    const actions = element.$.actions;
+    element.filePath = 'foo';
+    actions._open();
+    flushAsynchronousOperations();
+
+    MockInteractions.tap(actions.$$('li [data-id="restore"]'));
+    assert.isTrue(fileActionHandler.called);
+    assert.deepEqual(fileActionHandler.lastCall.args[0].detail,
+        {action: GrEditConstants.Actions.RESTORE.id, path: 'foo'});
+  });
+
+  test('rename tap emits event', () => {
+    const actions = element.$.actions;
+    element.filePath = 'foo';
+    actions._open();
+    flushAsynchronousOperations();
+
+    MockInteractions.tap(actions.$$('li [data-id="rename"]'));
+    assert.isTrue(fileActionHandler.called);
+    assert.deepEqual(fileActionHandler.lastCall.args[0].detail,
+        {action: GrEditConstants.Actions.RENAME.id, path: 'foo'});
+  });
+
+  test('computed properties', () => {
+    assert.equal(element._allFileActions.length, 4);
+  });
+});
+</script>
diff --git a/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view.html b/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view.html
new file mode 100644
index 0000000..f80e9f8
--- /dev/null
+++ b/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view.html
@@ -0,0 +1,126 @@
+<!--
+@license
+Copyright (C) 2017 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="../../../bower_components/polymer/polymer.html">
+
+<link rel="import" href="../../../behaviors/gr-patch-set-behavior/gr-patch-set-behavior.html">
+<link rel="import" href="../../../behaviors/gr-path-list-behavior/gr-path-list-behavior.html">
+<link rel="import" href="../../../behaviors/keyboard-shortcut-behavior/keyboard-shortcut-behavior.html">
+<link rel="import" href="../../core/gr-navigation/gr-navigation.html">
+<link rel="import" href="../../plugins/gr-endpoint-decorator/gr-endpoint-decorator.html">
+<link rel="import" href="../../plugins/gr-endpoint-param/gr-endpoint-param.html">
+<link rel="import" href="../../shared/gr-button/gr-button.html">
+<link rel="import" href="../../shared/gr-editable-label/gr-editable-label.html">
+<link rel="import" href="../../shared/gr-fixed-panel/gr-fixed-panel.html">
+<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
+<link rel="import" href="../../shared/gr-storage/gr-storage.html">
+<link rel="import" href="../gr-default-editor/gr-default-editor.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+
+<dom-module id="gr-editor-view">
+  <template>
+    <style include="shared-styles">
+      :host {
+        background-color: var(--view-background-color);
+      }
+      gr-fixed-panel {
+        background-color: var(--edit-mode-background-color);
+        border-bottom: 1px var(--border-color) solid;
+        z-index: 1;
+      }
+      header,
+      .subHeader {
+        align-items: center;
+        display: flex;
+        justify-content: space-between;
+        padding: .75em var(--default-horizontal-margin);
+      }
+      header gr-editable-label {
+        font-size: var(--font-size-large);
+        --label-style: {
+          text-overflow: initial;
+          white-space: initial;
+          word-break: break-all;
+        }
+        --input-style: {
+          margin-top: 1em;
+        }
+      }
+      .textareaWrapper {
+        border: 1px solid var(--border-color);
+        border-radius: 3px;
+        margin: var(--default-horizontal-margin);
+      }
+      .textareaWrapper .editButtons {
+        display: none;
+      }
+      .controlGroup {
+        align-items: center;
+        display: flex;
+        font-size: var(--font-size-large);
+      }
+      .rightControls {
+        justify-content: flex-end;
+      }
+      @media screen and (max-width: 50em) {
+        header,
+        .subHeader {
+          display: block;
+        }
+        .rightControls {
+          float: right;
+        }
+      }
+    </style>
+    <gr-fixed-panel keep-on-scroll>
+      <header>
+        <span class="controlGroup">
+          <span>Edit mode</span>
+          <span class="separator"></span>
+          <gr-editable-label
+              label-text="File path"
+              value="[[_path]]"
+              placeholder="File path..."
+              on-changed="_handlePathChanged"></gr-editable-label>
+        </span>
+        <span class="controlGroup rightControls">
+          <gr-button
+              id="close"
+              link
+              on-tap="_handleCloseTap">Close</gr-button>
+          <gr-button
+              id="save"
+              disabled$="[[_saveDisabled]]"
+              primary
+              link
+              on-tap="_saveEdit">Save</gr-button>
+        </span>
+      </header>
+    </gr-fixed-panel>
+    <div class="textareaWrapper">
+      <gr-endpoint-decorator id="editorEndpoint" name="editor">
+        <gr-endpoint-param name="fileContent" value="[[_newContent]]"></gr-endpoint-param>
+        <gr-endpoint-param name="prefs" value="[[_prefs]]"></gr-endpoint-param>
+        <gr-endpoint-param name="fileType" value="[[_type]]"></gr-endpoint-param>
+        <gr-default-editor id="file" file-content="[[_newContent]]"></gr-default-editor>
+      </gr-endpoint-decorator>
+    </div>
+    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
+    <gr-storage id="storage"></gr-storage>
+  </template>
+  <script src="gr-editor-view.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view.js b/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view.js
new file mode 100644
index 0000000..bf7fc99
--- /dev/null
+++ b/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view.js
@@ -0,0 +1,229 @@
+/**
+ * @license
+ * Copyright (C) 2017 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 RESTORED_MESSAGE = 'Content restored from a previous edit.';
+  const SAVING_MESSAGE = 'Saving changes...';
+  const SAVED_MESSAGE = 'All changes saved';
+  const SAVE_FAILED_MSG = 'Failed to save changes';
+
+  const STORAGE_DEBOUNCE_INTERVAL_MS = 100;
+
+  Polymer({
+    is: 'gr-editor-view',
+
+    /**
+     * Fired when the title of the page should change.
+     *
+     * @event title-change
+     */
+
+    /**
+     * Fired to notify the user of
+     *
+     * @event show-alert
+     */
+
+    properties: {
+      /**
+       * URL params passed from the router.
+       */
+      params: {
+        type: Object,
+        observer: '_paramsChanged',
+      },
+
+      _change: Object,
+      _changeEditDetail: Object,
+      _changeNum: String,
+      _patchNum: String,
+      _path: String,
+      _type: String,
+      _content: String,
+      _newContent: String,
+      _saving: {
+        type: Boolean,
+        value: false,
+      },
+      _successfulSave: {
+        type: Boolean,
+        value: false,
+      },
+      _saveDisabled: {
+        type: Boolean,
+        value: true,
+        computed: '_computeSaveDisabled(_content, _newContent, _saving)',
+      },
+      _prefs: Object,
+    },
+
+    behaviors: [
+      Gerrit.KeyboardShortcutBehavior,
+      Gerrit.PatchSetBehavior,
+      Gerrit.PathListBehavior,
+    ],
+
+    listeners: {
+      'content-change': '_handleContentChange',
+    },
+
+    keyBindings: {
+      'ctrl+s meta+s': '_handleSaveShortcut',
+    },
+
+    attached() {
+      this._getEditPrefs().then(prefs => { this._prefs = prefs; });
+    },
+
+    get storageKey() {
+      return `c${this._changeNum}_ps${this._patchNum}_${this._path}`;
+    },
+
+    _getLoggedIn() {
+      return this.$.restAPI.getLoggedIn();
+    },
+
+    _getEditPrefs() {
+      return this.$.restAPI.getEditPreferences();
+    },
+
+    _paramsChanged(value) {
+      if (value.view !== Gerrit.Nav.View.EDIT) { return; }
+
+      this._changeNum = value.changeNum;
+      this._path = value.path;
+      this._patchNum = value.patchNum || this.EDIT_NAME;
+
+      // NOTE: This may be called before attachment (e.g. while parentElement is
+      // null). Fire title-change in an async so that, if attachment to the DOM
+      // has been queued, the event can bubble up to the handler in gr-app.
+      this.async(() => {
+        const title = `Editing ${this.computeTruncatedPath(this._path)}`;
+        this.fire('title-change', {title});
+      });
+
+      const promises = [];
+
+      promises.push(this._getChangeDetail(this._changeNum));
+      promises.push(
+          this._getFileData(this._changeNum, this._path, this._patchNum));
+      return Promise.all(promises);
+    },
+
+    _getChangeDetail(changeNum) {
+      return this.$.restAPI.getDiffChangeDetail(changeNum).then(change => {
+        this._change = change;
+      });
+    },
+
+    _handlePathChanged(e) {
+      const path = e.detail;
+      if (path === this._path) { return Promise.resolve(); }
+      return this.$.restAPI.renameFileInChangeEdit(this._changeNum,
+          this._path, path).then(res => {
+            if (!res.ok) { return; }
+
+            this._successfulSave = true;
+            this._viewEditInChangeView();
+          });
+    },
+
+    _viewEditInChangeView() {
+      const patch = this._successfulSave ? this.EDIT_NAME : this._patchNum;
+      Gerrit.Nav.navigateToChange(this._change, patch, null,
+          patch !== this.EDIT_NAME);
+    },
+
+    _getFileData(changeNum, path, patchNum) {
+      const storedContent =
+            this.$.storage.getEditableContentItem(this.storageKey);
+
+      return this.$.restAPI.getFileContent(changeNum, path, patchNum)
+          .then(res => {
+            if (storedContent && storedContent.message &&
+                storedContent.message !== res.content) {
+              this.dispatchEvent(new CustomEvent('show-alert',
+                  {detail: {message: RESTORED_MESSAGE}, bubbles: true}));
+
+              this._newContent = storedContent.message;
+            } else {
+              this._newContent = res.content || '';
+            }
+            this._content = res.content || '';
+
+            // A non-ok response may result if the file does not yet exist.
+            // The `type` field of the response is only valid when the file
+            // already exists.
+            if (res.ok && res.type) {
+              this._type = res.type;
+            } else {
+              this._type = '';
+            }
+          });
+    },
+
+    _saveEdit() {
+      this._saving = true;
+      this._showAlert(SAVING_MESSAGE);
+      this.$.storage.eraseEditableContentItem(this.storageKey);
+      return this.$.restAPI.saveChangeEdit(this._changeNum, this._path,
+          this._newContent).then(res => {
+            this._saving = false;
+            this._showAlert(res.ok ? SAVED_MESSAGE : SAVE_FAILED_MSG);
+            if (!res.ok) { return; }
+
+            this._content = this._newContent;
+            this._successfulSave = true;
+          });
+    },
+
+    _showAlert(message) {
+      this.dispatchEvent(new CustomEvent('show-alert', {
+        detail: {message},
+        bubbles: true,
+      }));
+    },
+
+    _computeSaveDisabled(content, newContent, saving) {
+      if (saving) { return true; }
+      return content === newContent;
+    },
+
+    _handleCloseTap() {
+      // TODO(kaspern): Add a confirm dialog if there are unsaved changes.
+      this._viewEditInChangeView();
+    },
+
+    _handleContentChange(e) {
+      this.debounce('store', () => {
+        const content = e.detail.value;
+        if (content) {
+          this.set('_newContent', e.detail.value);
+          this.$.storage.setEditableContentItem(this.storageKey, content);
+        } else {
+          this.$.storage.eraseEditableContentItem(this.storageKey);
+        }
+      }, STORAGE_DEBOUNCE_INTERVAL_MS);
+    },
+
+    _handleSaveShortcut(e) {
+      e.preventDefault();
+      if (!this._saveDisabled) { this._saveEdit(); }
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view_test.html b/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view_test.html
new file mode 100644
index 0000000..2f5332d
--- /dev/null
+++ b/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view_test.html
@@ -0,0 +1,410 @@
+<!--
+@license
+Copyright (C) 2017 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-editor-view</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+
+<link rel="import" href="gr-editor-view.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-editor-view></gr-editor-view>
+  </template>
+</test-fixture>
+
+<script>
+suite('gr-editor-view tests', () => {
+  let element;
+  let sandbox;
+  let savePathStub;
+  let saveFileStub;
+  let changeDetailStub;
+  let navigateStub;
+  const mockParams = {
+    changeNum: '42',
+    path: 'foo/bar.baz',
+    patchNum: 'edit',
+  };
+
+  setup(() => {
+    stub('gr-rest-api-interface', {
+      getLoggedIn() { return Promise.resolve(true); },
+      getEditPreferences() { return Promise.resolve({}); },
+    });
+    sandbox = sinon.sandbox.create();
+    element = fixture('basic');
+    savePathStub = sandbox.stub(element.$.restAPI, 'renameFileInChangeEdit');
+    saveFileStub = sandbox.stub(element.$.restAPI, 'saveChangeEdit');
+    changeDetailStub = sandbox.stub(element.$.restAPI, 'getDiffChangeDetail');
+    navigateStub = sandbox.stub(element, '_viewEditInChangeView');
+  });
+
+  teardown(() => { sandbox.restore(); });
+
+  suite('_paramsChanged', () => {
+    test('incorrect view returns immediately', () => {
+      element._paramsChanged(
+          Object.assign({}, mockParams, {view: Gerrit.Nav.View.DIFF}));
+      assert.notOk(element._changeNum);
+    });
+
+    test('good params proceed', () => {
+      changeDetailStub.returns(Promise.resolve({}));
+      const fileStub = sandbox.stub(element, '_getFileData', () => {
+        element._content = 'text';
+        element._newContent = 'text';
+        element._type = 'application/octet-stream';
+      });
+
+      const promises = element._paramsChanged(
+          Object.assign({}, mockParams, {view: Gerrit.Nav.View.EDIT}));
+
+      flushAsynchronousOperations();
+      assert.equal(element._changeNum, mockParams.changeNum);
+      assert.equal(element._path, mockParams.path);
+      assert.deepEqual(changeDetailStub.lastCall.args[0],
+          mockParams.changeNum);
+      assert.deepEqual(fileStub.lastCall.args,
+          [mockParams.changeNum, mockParams.path, mockParams.patchNum]);
+
+      return promises.then(() => {
+        assert.equal(element._content, 'text');
+        assert.equal(element._newContent, 'text');
+        assert.equal(element._type, 'application/octet-stream');
+      });
+    });
+  });
+
+  test('edit file path', () => {
+    element._changeNum = mockParams.changeNum;
+    element._path = mockParams.path;
+    savePathStub.onFirstCall().returns(Promise.resolve({}));
+    savePathStub.onSecondCall().returns(Promise.resolve({ok: true}));
+
+    // Calling with the same path should not navigate.
+    return element._handlePathChanged({detail: mockParams.path}).then(() => {
+      assert.isFalse(savePathStub.called);
+        // !ok response
+      element._handlePathChanged({detail: 'newPath'}).then(() => {
+        assert.isTrue(savePathStub.called);
+        assert.isFalse(navigateStub.called);
+        // ok response
+        element._handlePathChanged({detail: 'newPath'}).then(() => {
+          assert.isTrue(navigateStub.called);
+          assert.isTrue(element._successfulSave);
+        });
+      });
+    });
+  });
+
+  test('reacts to content-change event', () => {
+    const storeStub = sandbox.spy(element.$.storage, 'setEditableContentItem');
+    element._newContent = 'test';
+    element.$.editorEndpoint.dispatchEvent(new CustomEvent('content-change', {
+      bubbles: true,
+      detail: {value: 'new content value'},
+    }));
+    element.flushDebouncer('store');
+    flushAsynchronousOperations();
+
+    assert.equal(element._newContent, 'new content value');
+    assert.isTrue(storeStub.called);
+    assert.equal(storeStub.lastCall.args[1], 'new content value');
+  });
+
+  suite('edit file content', () => {
+    const originalText = 'file text';
+    const newText = 'file text changed';
+
+    setup(() => {
+      element._changeNum = mockParams.changeNum;
+      element._path = mockParams.path;
+      element._content = originalText;
+      element._newContent = originalText;
+      flushAsynchronousOperations();
+    });
+
+    test('initial load', () => {
+      assert.equal(element.$.file.fileContent, originalText);
+      assert.isTrue(element.$.save.hasAttribute('disabled'));
+    });
+
+    test('file modification and save, !ok response', () => {
+      const saveSpy = sandbox.spy(element, '_saveEdit');
+      const eraseStub = sandbox.stub(element.$.storage,
+          'eraseEditableContentItem');
+      const alertStub = sandbox.stub(element, '_showAlert');
+      saveFileStub.returns(Promise.resolve({ok: false}));
+      element._newContent = newText;
+      flushAsynchronousOperations();
+
+      assert.isFalse(element.$.save.hasAttribute('disabled'));
+      assert.isFalse(element._saving);
+
+      MockInteractions.tap(element.$.save);
+      assert.isTrue(saveSpy.called);
+      assert.equal(alertStub.lastCall.args[0], 'Saving changes...');
+      assert.isTrue(element._saving);
+      assert.isTrue(element.$.save.hasAttribute('disabled'));
+
+      return saveSpy.lastCall.returnValue.then(() => {
+        assert.isTrue(saveFileStub.called);
+        assert.isTrue(eraseStub.called);
+        assert.isFalse(element._saving);
+        assert.equal(alertStub.lastCall.args[0], 'Failed to save changes');
+        assert.deepEqual(saveFileStub.lastCall.args,
+            [mockParams.changeNum, mockParams.path, newText]);
+        assert.isFalse(navigateStub.called);
+        assert.isFalse(element.$.save.hasAttribute('disabled'));
+        assert.notEqual(element._content, element._newContent);
+      });
+    });
+
+    test('file modification and save', () => {
+      const saveSpy = sandbox.spy(element, '_saveEdit');
+      const alertStub = sandbox.stub(element, '_showAlert');
+      saveFileStub.returns(Promise.resolve({ok: true}));
+      element._newContent = newText;
+      flushAsynchronousOperations();
+
+      assert.isFalse(element._saving);
+      assert.isFalse(element.$.save.hasAttribute('disabled'));
+
+      MockInteractions.tap(element.$.save);
+      assert.isTrue(saveSpy.called);
+      assert.equal(alertStub.lastCall.args[0], 'Saving changes...');
+      assert.isTrue(element._saving);
+      assert.isTrue(element.$.save.hasAttribute('disabled'));
+
+      return saveSpy.lastCall.returnValue.then(() => {
+        assert.isTrue(saveFileStub.called);
+        assert.isFalse(element._saving);
+        assert.equal(alertStub.lastCall.args[0], 'All changes saved');
+        assert.isFalse(navigateStub.called);
+        assert.isTrue(element.$.save.hasAttribute('disabled'));
+        assert.equal(element._content, element._newContent);
+        assert.isTrue(element._successfulSave);
+      });
+    });
+
+    test('file modification and close', () => {
+      const closeSpy = sandbox.spy(element, '_handleCloseTap');
+      element._newContent = newText;
+      flushAsynchronousOperations();
+
+      assert.isFalse(element.$.save.hasAttribute('disabled'));
+
+      MockInteractions.tap(element.$.close);
+      assert.isTrue(closeSpy.called);
+      assert.isFalse(saveFileStub.called);
+      assert.isTrue(navigateStub.called);
+    });
+  });
+
+  suite('_getFileData', () => {
+    setup(() => {
+      element._newContent = 'initial';
+      element._content = 'initial';
+      element._type = 'initial';
+      sandbox.stub(element.$.storage, 'getEditableContentItem').returns(null);
+    });
+
+    test('res.ok', () => {
+      sandbox.stub(element.$.restAPI, 'getFileContent')
+          .returns(Promise.resolve({
+            ok: true,
+            type: 'text/javascript',
+            content: 'new content',
+          }));
+
+      // Ensure no data is set with a bad response.
+      return element._getFileData('1', 'test/path', 'edit').then(() => {
+        assert.equal(element._newContent, 'new content');
+        assert.equal(element._content, 'new content');
+        assert.equal(element._type, 'text/javascript');
+      });
+    });
+
+    test('!res.ok', () => {
+      sandbox.stub(element.$.restAPI, 'getFileContent')
+          .returns(Promise.resolve({}));
+
+      // Ensure no data is set with a bad response.
+      return element._getFileData('1', 'test/path', 'edit').then(() => {
+        assert.equal(element._newContent, '');
+        assert.equal(element._content, '');
+        assert.equal(element._type, '');
+      });
+    });
+
+    test('content is undefined', () => {
+      sandbox.stub(element.$.restAPI, 'getFileContent')
+          .returns(Promise.resolve({
+            ok: true,
+            type: 'text/javascript',
+          }));
+
+      return element._getFileData('1', 'test/path', 'edit').then(() => {
+        assert.equal(element._newContent, '');
+        assert.equal(element._content, '');
+        assert.equal(element._type, 'text/javascript');
+      });
+    });
+
+    test('content and type is undefined', () => {
+      sandbox.stub(element.$.restAPI, 'getFileContent')
+          .returns(Promise.resolve({
+            ok: true,
+          }));
+
+      return element._getFileData('1', 'test/path', 'edit').then(() => {
+        assert.equal(element._newContent, '');
+        assert.equal(element._content, '');
+        assert.equal(element._type, '');
+      });
+    });
+  });
+
+  test('_showAlert', done => {
+    element.addEventListener('show-alert', e => {
+      assert.deepEqual(e.detail, {message: 'test message'});
+      assert.isTrue(e.bubbles);
+      done();
+    });
+
+    element._showAlert('test message');
+  });
+
+  test('_viewEditInChangeView respects _patchNum', () => {
+    navigateStub.restore();
+    const navStub = sandbox.stub(Gerrit.Nav, 'navigateToChange');
+    element._patchNum = element.EDIT_NAME;
+    element._viewEditInChangeView();
+    assert.equal(navStub.lastCall.args[1], element.EDIT_NAME);
+    element._patchNum = '1';
+    element._viewEditInChangeView();
+    assert.equal(navStub.lastCall.args[1], '1');
+    element._successfulSave = true;
+    element._viewEditInChangeView();
+    assert.equal(navStub.lastCall.args[1], element.EDIT_NAME);
+  });
+
+  suite('keyboard shortcuts', () => {
+    // Used as the spy on the handler for each entry in keyBindings.
+    let handleSpy;
+
+    suite('_handleSaveShortcut', () => {
+      let saveStub;
+      setup(() => {
+        handleSpy = sandbox.spy(element, '_handleSaveShortcut');
+        saveStub = sandbox.stub(element, '_saveEdit');
+      });
+
+      test('save enabled', () => {
+        element._content = '';
+        element._newContent = '_test';
+        MockInteractions.pressAndReleaseKeyOn(element, 83, 'ctrl', 's');
+        flushAsynchronousOperations();
+
+        assert.isTrue(handleSpy.calledOnce);
+        assert.isTrue(saveStub.calledOnce);
+
+        MockInteractions.pressAndReleaseKeyOn(element, 83, 'meta', 's');
+        flushAsynchronousOperations();
+
+        assert.equal(handleSpy.callCount, 2);
+        assert.equal(saveStub.callCount, 2);
+      });
+
+      test('save disabled', () => {
+        MockInteractions.pressAndReleaseKeyOn(element, 83, 'ctrl', 's');
+        flushAsynchronousOperations();
+
+        assert.isTrue(handleSpy.calledOnce);
+        assert.isFalse(saveStub.called);
+
+        MockInteractions.pressAndReleaseKeyOn(element, 83, 'meta', 's');
+        flushAsynchronousOperations();
+
+        assert.equal(handleSpy.callCount, 2);
+        assert.isFalse(saveStub.called);
+      });
+    });
+  });
+
+  suite('gr-storage caching', () => {
+    test('local edit exists', () => {
+      sandbox.stub(element.$.storage, 'getEditableContentItem')
+          .returns({message: 'pending edit'});
+      sandbox.stub(element.$.restAPI, 'getFileContent')
+          .returns(Promise.resolve({
+            ok: true,
+            type: 'text/javascript',
+            content: 'old content',
+          }));
+
+      const alertStub = sandbox.stub();
+      element.addEventListener('show-alert', alertStub);
+
+      return element._getFileData(1, 'test', 1).then(() => {
+        flushAsynchronousOperations();
+
+        assert.isTrue(alertStub.called);
+        assert.equal(element._newContent, 'pending edit');
+        assert.equal(element._content, 'old content');
+        assert.equal(element._type, 'text/javascript');
+      });
+    });
+
+    test('local edit exists, is same as remote edit', () => {
+      sandbox.stub(element.$.storage, 'getEditableContentItem')
+          .returns({message: 'pending edit'});
+      sandbox.stub(element.$.restAPI, 'getFileContent')
+          .returns(Promise.resolve({
+            ok: true,
+            type: 'text/javascript',
+            content: 'pending edit',
+          }));
+
+      const alertStub = sandbox.stub();
+      element.addEventListener('show-alert', alertStub);
+
+      return element._getFileData(1, 'test', 1).then(() => {
+        flushAsynchronousOperations();
+
+        assert.isFalse(alertStub.called);
+        assert.equal(element._newContent, 'pending edit');
+        assert.equal(element._content, 'pending edit');
+        assert.equal(element._type, 'text/javascript');
+      });
+    });
+
+    test('storage key computation', () => {
+      element._changeNum = 1;
+      element._patchNum = 1;
+      element._path = 'test';
+      assert.equal(element.storageKey, 'c1_ps1_test');
+    });
+  });
+});
+</script>
diff --git a/polygerrit-ui/app/elements/gr-app-it_test.html b/polygerrit-ui/app/elements/gr-app-it_test.html
index 7b134c1..929156e 100644
--- a/polygerrit-ui/app/elements/gr-app-it_test.html
+++ b/polygerrit-ui/app/elements/gr-app-it_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/gr-app.html b/polygerrit-ui/app/elements/gr-app.html
index 6f8a4a1..b34cd0a 100644
--- a/polygerrit-ui/app/elements/gr-app.html
+++ b/polygerrit-ui/app/elements/gr-app.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -18,24 +19,36 @@
   if (localStorage.getItem('USE_SHADOW_DOM') === 'true') {
     window.Polymer = {
       dom: 'shadow',
+      passiveTouchGestures: true,
+    };
+  } else if (!window.Polymer) {
+    window.Polymer = {
+      passiveTouchGestures: true,
     };
   }
+  // Needed for JSCompiler to understand it's global.
+  // eslint-disable-next-line no-unused-vars, prefer-const
+  let Gerrit = window.Gerrit || {};
+  window.Gerrit = Gerrit;
 </script>
 
 <link rel="import" href="../bower_components/polymer/polymer.html">
 <link rel="import" href="../bower_components/polymer-resin/standalone/polymer-resin.html">
+<link rel="import" href="../behaviors/safe-types-behavior/safe-types-behavior.html">
 <script>
   security.polymer_resin.install({
     allowedIdentifierPrefixes: [''],
     reportHandler: security.polymer_resin.CONSOLE_LOGGING_REPORT_HANDLER,
+    safeTypesBridge: Gerrit.SafeTypes.safeTypesBridge,
   });
 </script>
 
 <link rel="import" href="../behaviors/base-url-behavior/base-url-behavior.html">
 <link rel="import" href="../behaviors/keyboard-shortcut-behavior/keyboard-shortcut-behavior.html">
-<link rel="import" href="../styles/app-theme.html">
 <link rel="import" href="../styles/shared-styles.html">
+<link rel="import" href="../styles/themes/app-theme.html">
 <link rel="import" href="./admin/gr-admin-view/gr-admin-view.html">
+<link rel="import" href="./documentation/gr-documentation-search/gr-documentation-search.html">
 <link rel="import" href="./change-list/gr-change-list-view/gr-change-list-view.html">
 <link rel="import" href="./change-list/gr-dashboard-view/gr-dashboard-view.html">
 <link rel="import" href="./change/gr-change-view/gr-change-view.html">
@@ -46,12 +59,17 @@
 <link rel="import" href="./core/gr-reporting/gr-reporting.html">
 <link rel="import" href="./core/gr-router/gr-router.html">
 <link rel="import" href="./diff/gr-diff-view/gr-diff-view.html">
+<link rel="import" href="./edit/gr-editor-view/gr-editor-view.html">
 <link rel="import" href="./plugins/gr-endpoint-decorator/gr-endpoint-decorator.html">
+<link rel="import" href="./plugins/gr-endpoint-param/gr-endpoint-param.html">
 <link rel="import" href="./plugins/gr-external-style/gr-external-style.html">
 <link rel="import" href="./plugins/gr-plugin-host/gr-plugin-host.html">
 <link rel="import" href="./settings/gr-cla-view/gr-cla-view.html">
 <link rel="import" href="./settings/gr-registration-dialog/gr-registration-dialog.html">
 <link rel="import" href="./settings/gr-settings-view/gr-settings-view.html">
+<link rel="import" href="./shared/gr-fixed-panel/gr-fixed-panel.html">
+<link rel="import" href="./shared/gr-lib-loader/gr-lib-loader.html">
+<link rel="import" href="./shared/gr-rest-api-interface/gr-rest-api-interface.html">
 
 <script src="../scripts/util.js"></script>
 
@@ -59,9 +77,10 @@
   <template>
     <style include="shared-styles">
       :host {
+        background-color: var(--view-background-color);
         display: flex;
-        min-height: 100%;
         flex-direction: column;
+        min-height: 100%;
       }
       gr-fixed-panel {
         /**
@@ -74,16 +93,18 @@
       footer {
         color: var(--primary-text-color);
       }
+      gr-main-header {
+        background-color: var(--header-background-color);
+        padding: 0 var(--default-horizontal-margin);
+        border-bottom: 1px solid var(--border-color);
+      }
       gr-main-header.shadow {
         /* Make it obvious for shadow dom testing */
         border-bottom: 1px solid pink;
       }
-      gr-main-header {
-        background-color: var(--header-background-color);
-        padding: 0 var(--default-horizontal-margin);
-      }
       footer {
         background-color: var(--footer-background-color);
+        border-top: 1px solid var(--border-color);
         display: flex;
         justify-content: space-between;
         padding: .5rem var(--default-horizontal-margin);
@@ -109,20 +130,20 @@
         display: flex;
       }
       .errorEmoji {
-        font-size: 2.6em;
+        font-size: 2.6rem;
       }
       .errorText,
       .errorMoreInfo {
         margin-top: .75em;
       }
       .errorText {
-        font-size: 1.2em;
+        font-size: 1.2rem;
       }
       .errorMoreInfo {
-        color: #999;
+        color: var(--deemphasized-text-color);
       }
       .feedback {
-        color: #b71c1c;
+        color: var(--error-text-color);
       }
     </style>
     <gr-fixed-panel id="header">
@@ -136,8 +157,8 @@
       <template is="dom-if" if="[[_showChangeListView]]" restamp="true">
         <gr-change-list-view
             params="[[params]]"
-            view-state="{{_viewState.changeListView}}"
-            logged-in="[[_computeLoggedIn(_account)]]"></gr-change-list-view>
+            account="[[_account]]"
+            view-state="{{_viewState.changeListView}}"></gr-change-list-view>
       </template>
       <template is="dom-if" if="[[_showDashboardView]]" restamp="true">
         <gr-dashboard-view
@@ -151,11 +172,15 @@
             view-state="{{_viewState.changeView}}"
             back-page="[[_lastSearchPage]]"></gr-change-view>
       </template>
-      <template is="dom-if" if="[[_showDiffView]]" restamp="true">
-        <gr-diff-view
-            params="[[params]]"
-            change-view-state="{{_viewState.changeView}}"></gr-diff-view>
+      <template is="dom-if" if="[[_showEditorView]]" restamp="true">
+        <gr-editor-view
+            params="[[params]]"></gr-editor-view>
       </template>
+      <template is="dom-if" if="[[_showDiffView]]" restamp="true">
+          <gr-diff-view
+              params="[[params]]"
+              change-view-state="{{_viewState.changeView}}"></gr-diff-view>
+        </template>
       <template is="dom-if" if="[[_showSettingsView]]" restamp="true">
         <gr-settings-view
             params="[[params]]"
@@ -166,8 +191,18 @@
         <gr-admin-view path="[[_path]]"
             params=[[params]]></gr-admin-view>
       </template>
+      <template is="dom-if" if="[[_showPluginScreen]]" restamp="true">
+        <gr-endpoint-decorator name="[[_pluginScreenName]]">
+          <gr-endpoint-param name="token" value="[[params.screen]]"></gr-endpoint-param>
+        </gr-endpoint-decorator>
+      </template>
       <template is="dom-if" if="[[_showCLAView]]" restamp="true">
-        <gr-cla-view path="[[_path]]"></gr-cla-view>
+        <gr-cla-view></gr-cla-view>
+      </template>
+      <template is="dom-if" if="[[_showDocumentationSearch]]" restamp="true">
+        <gr-documentation-search
+            params="[[params]]">
+        </gr-documentation-search>
       </template>
       <div id="errorView" class="errorView">
         <div class="errorEmoji">[[_lastError.emoji]]</div>
@@ -183,7 +218,7 @@
       </div>
       <div>
         <a class="feedback"
-            href="https://bugs.chromium.org/p/gerrit/issues/entry?template=PolyGerrit%20Issue"
+            href$="[[_feedbackUrl]]"
             rel="noopener" target="_blank">Send feedback</a>
         <template is="dom-if" if="[[_computeShowGwtUiLink(_serverConfig)]]">
           |
@@ -197,8 +232,10 @@
           view="[[params.view]]"
           on-close="_handleKeyboardShortcutDialogClose"></gr-keyboard-shortcuts-dialog>
     </gr-overlay>
-    <gr-overlay id="registration" with-backdrop>
+    <gr-overlay id="registrationOverlay" with-backdrop>
       <gr-registration-dialog
+          id="registrationDialog"
+          settings-url="[[_settingsUrl]]"
           on-account-detail-update="_handleAccountDetailUpdate"
           on-close="_handleRegistrationDialogClose">
       </gr-registration-dialog>
@@ -211,6 +248,7 @@
     <gr-plugin-host id="plugins"
         config="[[_serverConfig]]">
     </gr-plugin-host>
+    <gr-lib-loader id="libLoader"></gr-lib-loader>
     <gr-external-style id="externalStyle" name="app-theme"></gr-external-style>
   </template>
   <script src="gr-app.js" crossorigin="anonymous"></script>
diff --git a/polygerrit-ui/app/elements/gr-app.js b/polygerrit-ui/app/elements/gr-app.js
index 4a38b85..321dc58 100644
--- a/polygerrit-ui/app/elements/gr-app.js
+++ b/polygerrit-ui/app/elements/gr-app.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -32,7 +35,7 @@
 
     properties: {
       /**
-       * @type {{ query: string, view: string }}
+       * @type {{ query: string, view: string, screen: string }}
        */
       params: Object,
       keyEventTarget: {
@@ -44,6 +47,17 @@
         type: Object,
         observer: '_accountChanged',
       },
+
+      /**
+       * The last time the g key was pressed in milliseconds (or a keydown event
+       * was handled if the key is held down).
+       * @type {number|null}
+       */
+      _lastGKeyPressTimestamp: {
+        type: Number,
+        value: null,
+      },
+
       /**
        * @type {{ plugin: Object }}
        */
@@ -56,6 +70,9 @@
       _showSettingsView: Boolean,
       _showAdminView: Boolean,
       _showCLAView: Boolean,
+      _showEditorView: Boolean,
+      _showPluginScreen: Boolean,
+      _showDocumentationSearch: Boolean,
       /** @type {?} */
       _viewState: Object,
       /** @type {?} */
@@ -63,16 +80,28 @@
       _lastSearchPage: String,
       _path: String,
       _isShadowDom: Boolean,
+      _pluginScreenName: {
+        type: String,
+        computed: '_computePluginScreenName(params)',
+      },
+      _settingsUrl: String,
+      _feedbackUrl: {
+        type: String,
+        value: 'https://bugs.chromium.org/p/gerrit/issues/entry' +
+          '?template=PolyGerrit%20Issue',
+      },
     },
 
     listeners: {
       'page-error': '_handlePageError',
       'title-change': '_handleTitleChange',
       'location-change': '_handleLocationChange',
+      'rpc-log': '_handleRpcLog',
     },
 
     observers: [
       '_viewChanged(params.view)',
+      '_paramsChanged(params.*)',
     ],
 
     behaviors: [
@@ -80,8 +109,17 @@
       Gerrit.KeyboardShortcutBehavior,
     ],
 
-    keyBindings: {
-      '?': '_showKeyboardShortcuts',
+    keyboardShortcuts() {
+      return {
+        [this.Shortcut.OPEN_SHORTCUT_HELP_DIALOG]: '_showKeyboardShortcuts',
+        [this.Shortcut.GO_TO_OPENED_CHANGES]: '_goToOpenedChanges',
+        [this.Shortcut.GO_TO_MERGED_CHANGES]: '_goToMergedChanges',
+        [this.Shortcut.GO_TO_ABANDONED_CHANGES]: '_goToAbandonedChanges',
+      };
+    },
+
+    created() {
+      this._bindKeyboardShortcuts();
     },
 
     ready() {
@@ -93,12 +131,28 @@
       });
       this.$.restAPI.getConfig().then(config => {
         this._serverConfig = config;
+
+        if (config && config.gerrit && config.gerrit.report_bug_url) {
+          this._feedbackUrl = config.gerrit.report_bug_url;
+        }
       });
       this.$.restAPI.getVersion().then(version => {
         this._version = version;
+        this._logWelcome();
       });
 
-      this.$.reporting.appStarted();
+      if (window.localStorage.getItem('dark-theme')) {
+        this.$.libLoader.getDarkTheme().then(module => {
+          Polymer.dom(this.root).appendChild(module);
+        });
+      }
+
+      // Note: this is evaluated here to ensure that it only happens after the
+      // router has been initialized. @see Issue 7837
+      this._settingsUrl = Gerrit.Nav.getUrlForSettings();
+
+      this.$.reporting.appStarted(document.visibilityState === 'hidden');
+
       this._viewState = {
         changeView: {
           changeNum: null,
@@ -120,12 +174,129 @@
       };
     },
 
+    _bindKeyboardShortcuts() {
+      this.bindShortcut(this.Shortcut.SEND_REPLY,
+          this.DOC_ONLY, 'ctrl+enter', 'meta+enter');
+
+      this.bindShortcut(
+          this.Shortcut.OPEN_SHORTCUT_HELP_DIALOG, '?');
+      this.bindShortcut(
+          this.Shortcut.GO_TO_OPENED_CHANGES, this.GO_KEY, 'o');
+      this.bindShortcut(
+          this.Shortcut.GO_TO_MERGED_CHANGES, this.GO_KEY, 'm');
+      this.bindShortcut(
+          this.Shortcut.GO_TO_ABANDONED_CHANGES, this.GO_KEY, 'a');
+
+      this.bindShortcut(
+          this.Shortcut.CURSOR_NEXT_CHANGE, 'j');
+      this.bindShortcut(
+          this.Shortcut.CURSOR_PREV_CHANGE, 'k');
+      this.bindShortcut(
+          this.Shortcut.OPEN_CHANGE, 'o');
+      this.bindShortcut(
+          this.Shortcut.NEXT_PAGE, 'n', ']');
+      this.bindShortcut(
+          this.Shortcut.PREV_PAGE, 'p', '[');
+      this.bindShortcut(
+          this.Shortcut.TOGGLE_CHANGE_REVIEWED, 'r');
+      this.bindShortcut(
+          this.Shortcut.TOGGLE_CHANGE_STAR, 's');
+      this.bindShortcut(
+          this.Shortcut.REFRESH_CHANGE_LIST, 'shift+r');
+      this.bindShortcut(
+          this.Shortcut.EDIT_TOPIC, 't');
+
+      this.bindShortcut(
+          this.Shortcut.OPEN_REPLY_DIALOG, 'a');
+      this.bindShortcut(
+          this.Shortcut.OPEN_DOWNLOAD_DIALOG, 'd');
+      this.bindShortcut(
+          this.Shortcut.EXPAND_ALL_MESSAGES, 'x');
+      this.bindShortcut(
+          this.Shortcut.COLLAPSE_ALL_MESSAGES, 'z');
+      this.bindShortcut(
+          this.Shortcut.REFRESH_CHANGE, 'shift+r');
+      this.bindShortcut(
+          this.Shortcut.UP_TO_DASHBOARD, 'u');
+      this.bindShortcut(
+          this.Shortcut.UP_TO_CHANGE, 'u');
+      this.bindShortcut(
+          this.Shortcut.TOGGLE_DIFF_MODE, 'm');
+
+      this.bindShortcut(
+          this.Shortcut.NEXT_LINE, 'j', 'down');
+      this.bindShortcut(
+          this.Shortcut.PREV_LINE, 'k', 'up');
+      this.bindShortcut(
+          this.Shortcut.NEXT_CHUNK, 'n');
+      this.bindShortcut(
+          this.Shortcut.PREV_CHUNK, 'p');
+      this.bindShortcut(
+          this.Shortcut.EXPAND_ALL_DIFF_CONTEXT, 'shift+x');
+      this.bindShortcut(
+          this.Shortcut.NEXT_COMMENT_THREAD, 'shift+n');
+      this.bindShortcut(
+          this.Shortcut.PREV_COMMENT_THREAD, 'shift+p');
+      this.bindShortcut(
+          this.Shortcut.EXPAND_ALL_COMMENT_THREADS, this.DOC_ONLY, 'e');
+      this.bindShortcut(
+          this.Shortcut.COLLAPSE_ALL_COMMENT_THREADS,
+          this.DOC_ONLY, 'shift+e');
+      this.bindShortcut(
+          this.Shortcut.LEFT_PANE, 'shift+left');
+      this.bindShortcut(
+          this.Shortcut.RIGHT_PANE, 'shift+right');
+      this.bindShortcut(
+          this.Shortcut.TOGGLE_LEFT_PANE, 'shift+a');
+      this.bindShortcut(
+          this.Shortcut.NEW_COMMENT, 'c');
+      this.bindShortcut(
+          this.Shortcut.SAVE_COMMENT,
+          'ctrl+enter', 'meta+enter', 'ctrl+s', 'meta+s');
+      this.bindShortcut(
+          this.Shortcut.OPEN_DIFF_PREFS, ',');
+      this.bindShortcut(
+          this.Shortcut.TOGGLE_DIFF_REVIEWED, 'r');
+
+      this.bindShortcut(
+          this.Shortcut.NEXT_FILE, ']');
+      this.bindShortcut(
+          this.Shortcut.PREV_FILE, '[');
+      this.bindShortcut(
+          this.Shortcut.NEXT_FILE_WITH_COMMENTS, 'shift+j');
+      this.bindShortcut(
+          this.Shortcut.PREV_FILE_WITH_COMMENTS, 'shift+k');
+      this.bindShortcut(
+          this.Shortcut.CURSOR_NEXT_FILE, 'j', 'down');
+      this.bindShortcut(
+          this.Shortcut.CURSOR_PREV_FILE, 'k', 'up');
+      this.bindShortcut(
+          this.Shortcut.OPEN_FILE, 'o', 'enter');
+      this.bindShortcut(
+          this.Shortcut.TOGGLE_FILE_REVIEWED, 'r');
+      this.bindShortcut(
+          this.Shortcut.NEXT_UNREVIEWED_FILE, 'shift+m');
+      this.bindShortcut(
+          this.Shortcut.TOGGLE_ALL_INLINE_DIFFS, 'shift+i:keyup');
+      this.bindShortcut(
+          this.Shortcut.TOGGLE_INLINE_DIFF, 'i:keyup');
+
+      this.bindShortcut(
+          this.Shortcut.OPEN_FIRST_FILE, ']');
+      this.bindShortcut(
+          this.Shortcut.OPEN_LAST_FILE, '[');
+
+      this.bindShortcut(
+          this.Shortcut.SEARCH, '/');
+    },
+
     _accountChanged(account) {
       if (!account) { return; }
 
       // Preferences are cached when a user is logged in; warm them.
       this.$.restAPI.getPreferences();
       this.$.restAPI.getDiffPreferences();
+      this.$.restAPI.getEditPreferences();
       this.$.errorManager.knownAccountId =
           this._account && this._account._account_id || null;
     },
@@ -137,21 +308,32 @@
       this.set('_showChangeView', view === Gerrit.Nav.View.CHANGE);
       this.set('_showDiffView', view === Gerrit.Nav.View.DIFF);
       this.set('_showSettingsView', view === Gerrit.Nav.View.SETTINGS);
-      this.set('_showAdminView', view === Gerrit.Nav.View.ADMIN);
+      this.set('_showAdminView', view === Gerrit.Nav.View.ADMIN ||
+          view === Gerrit.Nav.View.GROUP || view === Gerrit.Nav.View.REPO);
       this.set('_showCLAView', view === Gerrit.Nav.View.AGREEMENTS);
+      this.set('_showEditorView', view === Gerrit.Nav.View.EDIT);
+      const isPluginScreen = view === Gerrit.Nav.View.PLUGIN_SCREEN;
+      this.set('_showPluginScreen', false);
+      // Navigation within plugin screens does not restamp gr-endpoint-decorator
+      // because _showPluginScreen value does not change. To force restamp,
+      // change _showPluginScreen value between true and false.
+      if (isPluginScreen) {
+        this.async(() => this.set('_showPluginScreen', true), 1);
+      }
+      this.set('_showDocumentationSearch',
+          view === Gerrit.Nav.View.DOCUMENTATION_SEARCH);
       if (this.params.justRegistered) {
-        this.$.registration.open();
+        this.$.registrationOverlay.open();
+        this.$.registrationDialog.loadData().then(() => {
+          this.$.registrationOverlay.refit();
+        });
       }
       this.$.header.unfloat();
     },
 
-    // Argument used for binding update only.
-    _computeLoggedIn(account) {
-      return !!(account && Object.keys(account).length > 0);
-    },
-
     _computeShowGwtUiLink(config) {
-      return config.gerrit.web_uis && config.gerrit.web_uis.includes('GWT');
+      return !window.DEPRECATE_GWT_UI &&
+          config.gerrit.web_uis && config.gerrit.web_uis.includes('GWT');
     },
 
     _handlePageError(e) {
@@ -161,6 +343,7 @@
         '_showChangeView',
         '_showDiffView',
         '_showSettingsView',
+        '_showAdminView',
       ];
       for (const showProp of props) {
         this.set(showProp, false);
@@ -188,15 +371,12 @@
         pathname += '@' + hash;
       }
       this.set('_path', pathname);
-      this._handleSearchPageChange();
     },
 
-    _handleSearchPageChange() {
-      if (!this.params) {
-        return;
-      }
+    _paramsChanged(paramsRecord) {
+      const params = paramsRecord.base;
       const viewsToCheck = [Gerrit.Nav.View.SEARCH, Gerrit.Nav.View.DASHBOARD];
-      if (viewsToCheck.includes(this.params.view)) {
+      if (viewsToCheck.includes(params.view)) {
         this.set('_lastSearchPage', location.pathname);
       }
     },
@@ -227,11 +407,50 @@
 
     _handleRegistrationDialogClose(e) {
       this.params.justRegistered = false;
-      this.$.registration.close();
+      this.$.registrationOverlay.close();
     },
 
     _computeShadowClass(isShadowDom) {
       return isShadowDom ? 'shadow' : '';
     },
+
+    _goToOpenedChanges() {
+      Gerrit.Nav.navigateToStatusSearch('open');
+    },
+
+    _goToMergedChanges() {
+      Gerrit.Nav.navigateToStatusSearch('merged');
+    },
+
+    _goToAbandonedChanges() {
+      Gerrit.Nav.navigateToStatusSearch('abandoned');
+    },
+
+    _computePluginScreenName({plugin, screen}) {
+      return Gerrit._getPluginScreenName(plugin, screen);
+    },
+
+    _logWelcome() {
+      console.group('Runtime Info');
+      console.log('Gerrit UI (PolyGerrit)');
+      console.log(`Gerrit Server Version: ${this._version}`);
+      if (window.VERSION_INFO) {
+        console.log(`UI Version Info: ${window.VERSION_INFO}`);
+      }
+      const renderTime = new Date(window.performance.timing.loadEventStart);
+      console.log(`Document loaded at: ${renderTime}`);
+      console.log(`Please file bugs and feedback at: ${this._feedbackUrl}`);
+      console.groupEnd();
+    },
+
+    /**
+     * Intercept RPC log events emitted by REST API interfaces.
+     * Note: the REST API interface cannot use gr-reporting directly because
+     * that would create a cyclic dependency.
+     */
+    _handleRpcLog(e) {
+      this.$.reporting.reportRpcTiming(e.detail.anonymizedUrl,
+          e.detail.elapsed);
+    },
   });
 })();
diff --git a/polygerrit-ui/app/elements/gr-app_test.html b/polygerrit-ui/app/elements/gr-app_test.html
index 3712ffa..734d2fe 100644
--- a/polygerrit-ui/app/elements/gr-app_test.html
+++ b/polygerrit-ui/app/elements/gr-app_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -54,6 +55,8 @@
           });
         },
         getPreferences() { return Promise.resolve({my: []}); },
+        getDiffPreferences() { return Promise.resolve({}); },
+        getEditPreferences() { return Promise.resolve({}); },
         getVersion() { return Promise.resolve(42); },
         probePath() { return Promise.resolve(42); },
       });
@@ -86,7 +89,6 @@
         hash: '#2',
         host: location.host,
       };
-      sandbox.stub(element, '_handleSearchPageChange');
       element._handleLocationChange({detail: curLocation});
 
       flush(() => {
@@ -105,5 +107,12 @@
         assert.deepEqual(element.$.plugins.config, config);
       });
     });
+
+    test('_paramsChanged sets search page', () => {
+      element._paramsChanged({base: {view: Gerrit.Nav.View.CHANGE}});
+      assert.notOk(element._lastSearchPage);
+      element._paramsChanged({base: {view: Gerrit.Nav.View.SEARCH}});
+      assert.ok(element._lastSearchPage);
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/plugins/gr-admin-api/gr-admin-api.html b/polygerrit-ui/app/elements/plugins/gr-admin-api/gr-admin-api.html
new file mode 100644
index 0000000..756c435
--- /dev/null
+++ b/polygerrit-ui/app/elements/plugins/gr-admin-api/gr-admin-api.html
@@ -0,0 +1,18 @@
+<!--
+@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.
+-->
+
+<script src="gr-admin-api.js"></script>
diff --git a/polygerrit-ui/app/elements/plugins/gr-admin-api/gr-admin-api.js b/polygerrit-ui/app/elements/plugins/gr-admin-api/gr-admin-api.js
new file mode 100644
index 0000000..3959186
--- /dev/null
+++ b/polygerrit-ui/app/elements/plugins/gr-admin-api/gr-admin-api.js
@@ -0,0 +1,42 @@
+/**
+ * @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(window) {
+  'use strict';
+
+  // Prevent redefinition.
+  if (window.GrAdminApi) { return; }
+
+  function GrAdminApi(plugin) {
+    this.plugin = plugin;
+    plugin.on('admin-menu-links', this);
+    this._menuLinks = [];
+  }
+
+  /**
+   * @param {string} text
+   * @param {string} url
+   */
+  GrAdminApi.prototype.addMenuLink = function(text, url) {
+    this._menuLinks.push({text, url});
+  };
+
+  GrAdminApi.prototype.getMenuLinks = function() {
+    return this._menuLinks.slice(0);
+  };
+
+  window.GrAdminApi = GrAdminApi;
+})(window);
diff --git a/polygerrit-ui/app/elements/plugins/gr-admin-api/gr-admin-api_test.html b/polygerrit-ui/app/elements/plugins/gr-admin-api/gr-admin-api_test.html
new file mode 100644
index 0000000..966efac
--- /dev/null
+++ b/polygerrit-ui/app/elements/plugins/gr-admin-api/gr-admin-api_test.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<!--
+@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.
+-->
+
+<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+<title>gr-admin-api</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="../../shared/gr-js-api-interface/gr-js-api-interface.html">
+<link rel="import" href="gr-admin-api.html">
+
+<script>void(0);</script>
+
+<script>
+  suite('gr-admin-api tests', () => {
+    let sandbox;
+    let adminApi;
+
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+      let plugin;
+      Gerrit.install(p => { plugin = p; }, '0.1',
+          'http://test.com/plugins/testplugin/static/test.js');
+      sandbox.stub(Gerrit, '_arePluginsLoaded').returns(true);
+      adminApi = plugin.admin();
+    });
+
+    teardown(() => {
+      adminApi = null;
+      sandbox.restore();
+    });
+
+    test('exists', () => {
+      assert.isOk(adminApi);
+    });
+
+    test('addMenuLink', () => {
+      adminApi.addMenuLink('text', 'url');
+      const links = adminApi.getMenuLinks();
+      assert.equal(links.length, 1);
+      assert.deepEqual(links[0], {text: 'text', url: 'url'});
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/plugins/gr-attribute-helper/gr-attribute-helper.html b/polygerrit-ui/app/elements/plugins/gr-attribute-helper/gr-attribute-helper.html
index c495c94..208f1e8 100644
--- a/polygerrit-ui/app/elements/plugins/gr-attribute-helper/gr-attribute-helper.html
+++ b/polygerrit-ui/app/elements/plugins/gr-attribute-helper/gr-attribute-helper.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/plugins/gr-attribute-helper/gr-attribute-helper.js b/polygerrit-ui/app/elements/plugins/gr-attribute-helper/gr-attribute-helper.js
index 301c12e..df71da6 100644
--- a/polygerrit-ui/app/elements/plugins/gr-attribute-helper/gr-attribute-helper.js
+++ b/polygerrit-ui/app/elements/plugins/gr-attribute-helper/gr-attribute-helper.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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(window) {
   'use strict';
 
@@ -83,5 +86,17 @@
     return this._promises[name];
   };
 
+  /**
+   * Sets value and dispatches event to force notify.
+   *
+   * @param {string} name Property name.
+   * @param {?} value
+   */
+  GrAttributeHelper.prototype.set = function(name, value) {
+    this.element[name] = value;
+    this.element.dispatchEvent(
+        new CustomEvent(this._getChangedEventName(name), {detail: {value}}));
+  };
+
   window.GrAttributeHelper = GrAttributeHelper;
 })(window);
diff --git a/polygerrit-ui/app/elements/plugins/gr-attribute-helper/gr-attribute-helper_test.html b/polygerrit-ui/app/elements/plugins/gr-attribute-helper/gr-attribute-helper_test.html
index 5dababe..cd59f7d 100644
--- a/polygerrit-ui/app/elements/plugins/gr-attribute-helper/gr-attribute-helper_test.html
+++ b/polygerrit-ui/app/elements/plugins/gr-attribute-helper/gr-attribute-helper_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/plugins/gr-change-metadata-api/gr-change-metadata-api.html b/polygerrit-ui/app/elements/plugins/gr-change-metadata-api/gr-change-metadata-api.html
new file mode 100644
index 0000000..eddb52b
--- /dev/null
+++ b/polygerrit-ui/app/elements/plugins/gr-change-metadata-api/gr-change-metadata-api.html
@@ -0,0 +1,22 @@
+<!--
+@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="../../../bower_components/polymer/polymer.html">
+
+<dom-module id="gr-change-metadata-api">
+  <script src="gr-change-metadata-api.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/plugins/gr-change-metadata-api/gr-change-metadata-api.js b/polygerrit-ui/app/elements/plugins/gr-change-metadata-api/gr-change-metadata-api.js
new file mode 100644
index 0000000..b550f73
--- /dev/null
+++ b/polygerrit-ui/app/elements/plugins/gr-change-metadata-api/gr-change-metadata-api.js
@@ -0,0 +1,39 @@
+/**
+ * @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(window) {
+  'use strict';
+
+  function GrChangeMetadataApi(plugin) {
+    this._hook = null;
+    this.plugin = plugin;
+  }
+
+  GrChangeMetadataApi.prototype._createHook = function() {
+    this._hook = this.plugin.hook('change-metadata-item');
+  };
+
+  GrChangeMetadataApi.prototype.onLabelsChanged = function(callback) {
+    if (!this._hook) {
+      this._createHook();
+    }
+    this._hook.onAttached(element =>
+        this.plugin.attributeHelper(element).bind('labels', callback));
+    return this;
+  };
+
+  window.GrChangeMetadataApi = GrChangeMetadataApi;
+})(window);
diff --git a/polygerrit-ui/app/elements/plugins/gr-dom-hooks/gr-dom-hooks.html b/polygerrit-ui/app/elements/plugins/gr-dom-hooks/gr-dom-hooks.html
index 11891c17..252e812 100644
--- a/polygerrit-ui/app/elements/plugins/gr-dom-hooks/gr-dom-hooks.html
+++ b/polygerrit-ui/app/elements/plugins/gr-dom-hooks/gr-dom-hooks.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/plugins/gr-dom-hooks/gr-dom-hooks.js b/polygerrit-ui/app/elements/plugins/gr-dom-hooks/gr-dom-hooks.js
index 889333b..230be0e 100644
--- a/polygerrit-ui/app/elements/plugins/gr-dom-hooks/gr-dom-hooks.js
+++ b/polygerrit-ui/app/elements/plugins/gr-dom-hooks/gr-dom-hooks.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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(window) {
   'use strict';
 
diff --git a/polygerrit-ui/app/elements/plugins/gr-dom-hooks/gr-dom-hooks_test.html b/polygerrit-ui/app/elements/plugins/gr-dom-hooks/gr-dom-hooks_test.html
index f5a7f6f..3dde458 100644
--- a/polygerrit-ui/app/elements/plugins/gr-dom-hooks/gr-dom-hooks_test.html
+++ b/polygerrit-ui/app/elements/plugins/gr-dom-hooks/gr-dom-hooks_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/plugins/gr-endpoint-decorator/gr-endpoint-decorator.html b/polygerrit-ui/app/elements/plugins/gr-endpoint-decorator/gr-endpoint-decorator.html
index 0928534..50b80d5 100644
--- a/polygerrit-ui/app/elements/plugins/gr-endpoint-decorator/gr-endpoint-decorator.html
+++ b/polygerrit-ui/app/elements/plugins/gr-endpoint-decorator/gr-endpoint-decorator.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -19,7 +20,7 @@
 
 <dom-module id="gr-endpoint-decorator">
   <template strip-whitespace>
-    <content></content>
+    <slot></slot>
   </template>
   <script src="gr-endpoint-decorator.js"></script>
 </dom-module>
diff --git a/polygerrit-ui/app/elements/plugins/gr-endpoint-decorator/gr-endpoint-decorator.js b/polygerrit-ui/app/elements/plugins/gr-endpoint-decorator/gr-endpoint-decorator.js
index a2a1c0b..fe82f2b 100644
--- a/polygerrit-ui/app/elements/plugins/gr-endpoint-decorator/gr-endpoint-decorator.js
+++ b/polygerrit-ui/app/elements/plugins/gr-endpoint-decorator/gr-endpoint-decorator.js
@@ -1,19 +1,24 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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 INIT_PROPERTIES_TIMEOUT_MS = 10000;
+
   Polymer({
     is: 'gr-endpoint-decorator',
 
@@ -24,6 +29,16 @@
         type: Map,
         value() { return new Map(); },
       },
+      /**
+       * This map prevents importing the same endpoint twice.
+       * Without caching, if a plugin is loaded after the loaded plugins
+       * callback fires, it will be imported twice and appear twice on the page.
+       * @type {!Map}
+       */
+      _initializedPlugins: {
+        type: Map,
+        value() { return new Map(); },
+      },
     },
 
     detached() {
@@ -40,59 +55,84 @@
 
     _initDecoration(name, plugin) {
       const el = document.createElement(name);
-      this._initProperties(el, plugin, this.getContentChildren().find(
-          el => el.nodeName !== 'GR-ENDPOINT-PARAM'));
-      this._appendChild(el);
-      return el;
+      return this._initProperties(el, plugin,
+          this.getContentChildren().find(
+              el => el.nodeName !== 'GR-ENDPOINT-PARAM'))
+          .then(el => this._appendChild(el));
     },
 
     _initReplacement(name, plugin) {
-      this.getContentChildNodes().forEach(node => node.remove());
+      this.getContentChildNodes()
+          .filter(node => node.nodeName !== 'GR-ENDPOINT-PARAM')
+          .forEach(node => node.remove());
       const el = document.createElement(name);
-      this._initProperties(el, plugin);
-      this._appendChild(el);
-      return el;
+      return this._initProperties(el, plugin).then(
+          el => this._appendChild(el));
     },
 
     _getEndpointParams() {
-      return Polymer.dom(this).querySelectorAll('gr-endpoint-param').map(el => {
-        return {name: el.getAttribute('name'), value: el.value};
-      });
+      return Polymer.dom(this).querySelectorAll('gr-endpoint-param');
     },
 
     /**
      * @param {!Element} el
      * @param {!Object} plugin
      * @param {!Element=} opt_content
+     * @return {!Promise<Element>}
      */
     _initProperties(el, plugin, opt_content) {
       el.plugin = plugin;
       if (opt_content) {
         el.content = opt_content;
       }
-      for (const {name, value} of this._getEndpointParams()) {
-        el[name] = value;
-      }
+      const expectProperties = this._getEndpointParams().map(paramEl => {
+        const helper = plugin.attributeHelper(paramEl);
+        const paramName = paramEl.getAttribute('name');
+        return helper.get('value').then(
+            value => helper.bind('value',
+                value => plugin.attributeHelper(el).set(paramName, value))
+            );
+      });
+      let timeoutId;
+      const timeout = new Promise(
+        resolve => timeoutId = setTimeout(() => {
+          console.warn(
+              'Timeout waiting for endpoint properties initialization: ' +
+              `plugin ${plugin.getPluginName()}, endpoint ${this.name}`);
+        }, INIT_PROPERTIES_TIMEOUT_MS));
+      return Promise.race([timeout, Promise.all(expectProperties)])
+          .then(() => {
+            clearTimeout(timeoutId);
+            return el;
+          });
     },
 
     _appendChild(el) {
-      Polymer.dom(this.root).appendChild(el);
+      return Polymer.dom(this.root).appendChild(el);
     },
 
     _initModule({moduleName, plugin, type, domHook}) {
-      let el;
+      if (this._initializedPlugins.get(plugin.getPluginName())) {
+        return;
+      }
+      let initPromise;
       switch (type) {
         case 'decorate':
-          el = this._initDecoration(moduleName, plugin);
+          initPromise = this._initDecoration(moduleName, plugin);
           break;
         case 'replace':
-          el = this._initReplacement(moduleName, plugin);
+          initPromise = this._initReplacement(moduleName, plugin);
           break;
       }
-      if (el) {
-        domHook.handleInstanceAttached(el);
+      if (!initPromise) {
+        console.warn('Unable to initialize module' +
+            `${moduleName} from ${plugin.getPluginName()}`);
       }
-      this._domHooks.set(el, domHook);
+      this._initializedPlugins.set(plugin.getPluginName(), true);
+      initPromise.then(el => {
+        domHook.handleInstanceAttached(el);
+        this._domHooks.set(el, domHook);
+      });
     },
 
     ready() {
diff --git a/polygerrit-ui/app/elements/plugins/gr-endpoint-decorator/gr-endpoint-decorator_test.html b/polygerrit-ui/app/elements/plugins/gr-endpoint-decorator/gr-endpoint-decorator_test.html
index c7ab3d9..31d3150 100644
--- a/polygerrit-ui/app/elements/plugins/gr-endpoint-decorator/gr-endpoint-decorator_test.html
+++ b/polygerrit-ui/app/elements/plugins/gr-endpoint-decorator/gr-endpoint-decorator_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -28,48 +29,43 @@
 
 <test-fixture id="basic">
   <template>
-    <gr-endpoint-decorator name="foo">
-      <gr-endpoint-param name="someparam" value="barbar"></gr-endpoint-param>
-    </gr-endpoint-decorator>
+    <div>
+      <gr-endpoint-decorator name="first">
+        <gr-endpoint-param name="someparam" value="barbar"></gr-endpoint-param>
+      </gr-endpoint-decorator>
+      <gr-endpoint-decorator name="second">
+        <gr-endpoint-param name="someparam" value="foofoo"></gr-endpoint-param>
+      </gr-endpoint-decorator>
+      <gr-endpoint-decorator name="banana">
+        <gr-endpoint-param name="someParam" value="yes"></gr-endpoint-param>
+      </gr-endpoint-decorator>
+    </div>
   </template>
 </test-fixture>
 
 <script>
   suite('gr-endpoint-decorator', () => {
+    let container;
     let sandbox;
-    let element;
     let plugin;
-    let domHookStub;
+    let decorationHook;
+    let replacementHook;
 
     setup(done => {
-      Gerrit._endpoints = new GrPluginEndpoints();
-
       sandbox = sinon.sandbox.create();
-
-      domHookStub = {
-        handleInstanceAttached: sandbox.stub(),
-        handleInstanceDetached: sandbox.stub(),
-        getPublicAPI: () => domHookStub,
-      };
-      sandbox.stub(
-          GrDomHooksManager.prototype, 'getDomHook').returns(domHookStub);
-
-      // NB: Order is important.
-      Gerrit.install(p => {
-        plugin = p;
-        plugin.registerCustomComponent('foo', 'some-module');
-        plugin.registerCustomComponent('foo', 'other-module', {replace: true});
-        plugin.registerCustomComponent('bar', 'some-module');
-      }, '0.1', 'http://some/plugin/url.html');
-
-      sandbox.stub(Gerrit, '_arePluginsLoaded').returns(true);
-      sandbox.stub(Gerrit, 'awaitPluginsLoaded').returns(Promise.resolve());
-
-      element = fixture('basic');
-      sandbox.stub(element, '_initDecoration').returns({});
-      sandbox.stub(element, '_initReplacement').returns({});
-      sandbox.stub(element, 'importHref', (url, resolve) => resolve());
-
+      stub('gr-endpoint-decorator', {
+        _import: sandbox.stub().returns(Promise.resolve()),
+      });
+      Gerrit._resetPlugins();
+      container = fixture('basic');
+      Gerrit.install(p => plugin = p, '0.1', 'http://some/plugin/url.html');
+      // Decoration
+      decorationHook = plugin.registerCustomComponent('first', 'some-module');
+      // Replacement
+      replacementHook = plugin.registerCustomComponent(
+          'second', 'other-module', {replace: true});
+      // Mimic all plugins loaded.
+      Gerrit._setPluginsPending([]);
       flush(done);
     });
 
@@ -77,51 +73,99 @@
       sandbox.restore();
     });
 
-    test('imports plugin-provided module', () => {
-      assert.isTrue(
-          element.importHref.calledWith(new URL('http://some/plugin/url.html')));
+    test('imports plugin-provided modules into endpoints', () => {
+      const endpoints =
+          Array.from(container.querySelectorAll('gr-endpoint-decorator'));
+      assert.equal(endpoints.length, 3);
+      endpoints.forEach(element => {
+        assert.isTrue(
+            element._import.calledWith(new URL('http://some/plugin/url.html')));
+      });
     });
 
-    test('inits decoration dom hook', () => {
-      assert.strictEqual(
-          element._initDecoration.lastCall.args[0], 'some-module');
-      assert.strictEqual(
-          element._initDecoration.lastCall.args[1], plugin);
+    test('decoration', () => {
+      const element =
+          container.querySelector('gr-endpoint-decorator[name="first"]');
+      const modules = Polymer.dom(element.root).children.filter(
+          element => element.nodeName === 'SOME-MODULE');
+      assert.equal(modules.length, 1);
+      const [module] = modules;
+      assert.isOk(module);
+      assert.equal(module['someparam'], 'barbar');
+      return decorationHook.getLastAttached().then(element => {
+        assert.strictEqual(element, module);
+      }).then(() => {
+        element.remove();
+        assert.equal(decorationHook.getAllAttached().length, 0);
+      });
     });
 
-    test('inits replacement dom hook', () => {
-      assert.strictEqual(
-          element._initReplacement.lastCall.args[0], 'other-module');
-      assert.strictEqual(
-          element._initReplacement.lastCall.args[1], plugin);
+    test('replacement', () => {
+      const element =
+          container.querySelector('gr-endpoint-decorator[name="second"]');
+      const module = Polymer.dom(element.root).children.find(
+          element => element.nodeName === 'OTHER-MODULE');
+      assert.isOk(module);
+      assert.equal(module['someparam'], 'foofoo');
+      return replacementHook.getLastAttached().then(element => {
+        assert.strictEqual(element, module);
+      }).then(() => {
+        element.remove();
+        assert.equal(replacementHook.getAllAttached().length, 0);
+      });
     });
 
-    test('calls dom hook handleInstanceAttached', () => {
-      assert.equal(domHookStub.handleInstanceAttached.callCount, 2);
-    });
-
-    test('calls dom hook handleInstanceDetached', () => {
-      element.detached();
-      assert.equal(domHookStub.handleInstanceDetached.callCount, 2);
-    });
-
-    test('installs modules on late registration', done => {
-      domHookStub.handleInstanceAttached.reset();
-      plugin.registerCustomComponent('foo', 'noob-noob');
+    test('late registration', done => {
+      plugin.registerCustomComponent('banana', 'noob-noob');
       flush(() => {
-        assert.equal(domHookStub.handleInstanceAttached.callCount, 1);
-        assert.strictEqual(
-            element._initDecoration.lastCall.args[0], 'noob-noob');
-        assert.strictEqual(
-            element._initDecoration.lastCall.args[1], plugin);
+        const element =
+            container.querySelector('gr-endpoint-decorator[name="banana"]');
+        const module = Polymer.dom(element.root).children.find(
+            element => element.nodeName === 'NOOB-NOOB');
+        assert.isOk(module);
         done();
       });
     });
 
-    test('params', () => {
-      const instance = document.createElement('foo');
-      element._initProperties(instance, plugin);
-      assert.equal(instance.someparam, 'barbar');
+    test('late param setup', done => {
+      const element =
+          container.querySelector('gr-endpoint-decorator[name="banana"]');
+      const param = Polymer.dom(element).querySelector('gr-endpoint-param');
+      param['value'] = undefined;
+      plugin.registerCustomComponent('banana', 'noob-noob');
+      flush(() => {
+        let module = Polymer.dom(element.root).children.find(
+            element => element.nodeName === 'NOOB-NOOB');
+        // Module waits for param to be defined.
+        assert.isNotOk(module);
+        const value = {abc: 'def'};
+        param.value = value;
+        flush(() => {
+          module = Polymer.dom(element.root).children.find(
+              element => element.nodeName === 'NOOB-NOOB');
+          assert.isOk(module);
+          assert.strictEqual(module['someParam'], value);
+          done();
+        });
+      });
+    });
+
+    test('param is bound', done => {
+      const element =
+          container.querySelector('gr-endpoint-decorator[name="banana"]');
+      const param = Polymer.dom(element).querySelector('gr-endpoint-param');
+      const value1 = {abc: 'def'};
+      const value2 = {def: 'abc'};
+      param.value = value1;
+      plugin.registerCustomComponent('banana', 'noob-noob');
+      flush(() => {
+        const module = Polymer.dom(element.root).children.find(
+            element => element.nodeName === 'NOOB-NOOB');
+        assert.strictEqual(module['someParam'], value1);
+        param.value = value2;
+        assert.strictEqual(module['someParam'], value2);
+        done();
+      });
     });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/plugins/gr-endpoint-param/gr-endpoint-param.html b/polygerrit-ui/app/elements/plugins/gr-endpoint-param/gr-endpoint-param.html
index 1aa9e7c..9d28ac3 100644
--- a/polygerrit-ui/app/elements/plugins/gr-endpoint-param/gr-endpoint-param.html
+++ b/polygerrit-ui/app/elements/plugins/gr-endpoint-param/gr-endpoint-param.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/plugins/gr-endpoint-param/gr-endpoint-param.js b/polygerrit-ui/app/elements/plugins/gr-endpoint-param/gr-endpoint-param.js
index 5a2ab59..cbc3d6a 100644
--- a/polygerrit-ui/app/elements/plugins/gr-endpoint-param/gr-endpoint-param.js
+++ b/polygerrit-ui/app/elements/plugins/gr-endpoint-param/gr-endpoint-param.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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';
 
@@ -18,7 +21,10 @@
     is: 'gr-endpoint-param',
     properties: {
       name: String,
-      value: Object,
+      value: {
+        type: Object,
+        notify: true,
+      },
     },
   });
 })();
diff --git a/polygerrit-ui/app/elements/plugins/gr-event-helper/gr-event-helper.html b/polygerrit-ui/app/elements/plugins/gr-event-helper/gr-event-helper.html
index d62ac99..d34bdef 100644
--- a/polygerrit-ui/app/elements/plugins/gr-event-helper/gr-event-helper.html
+++ b/polygerrit-ui/app/elements/plugins/gr-event-helper/gr-event-helper.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/plugins/gr-event-helper/gr-event-helper.js b/polygerrit-ui/app/elements/plugins/gr-event-helper/gr-event-helper.js
index e750c07..414abad 100644
--- a/polygerrit-ui/app/elements/plugins/gr-event-helper/gr-event-helper.js
+++ b/polygerrit-ui/app/elements/plugins/gr-event-helper/gr-event-helper.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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(window) {
   'use strict';
 
@@ -20,6 +23,17 @@
   }
 
   /**
+   * Add a callback to arbitrary event.
+   * The callback may return false to prevent event bubbling.
+   * @param {string} event Event name
+   * @param {function(Event):boolean} callback
+   * @return {function()} Unsubscribe function.
+   */
+  GrEventHelper.prototype.on = function(event, callback) {
+    return this._listen(this.element, callback, {event});
+  };
+
+  /**
    * Add a callback to element click or touch.
    * The callback may return false to prevent event bubbling.
    * @param {function(Event):boolean} callback
@@ -43,6 +57,7 @@
 
   GrEventHelper.prototype._listen = function(container, callback, opt_options) {
     const capture = opt_options && opt_options.capture;
+    const event = opt_options && opt_options.event || 'tap';
     const handler = e => {
       if (e.path.indexOf(this.element) !== -1) {
         let mayContinue = true;
@@ -58,9 +73,9 @@
         }
       }
     };
-    container.addEventListener('tap', handler, capture);
+    container.addEventListener(event, handler, capture);
     const unsubscribe = () =>
-      container.removeEventListener('tap', handler, capture);
+      container.removeEventListener(event, handler, capture);
     this._unsubscribers.push(unsubscribe);
     return unsubscribe;
   };
diff --git a/polygerrit-ui/app/elements/plugins/gr-event-helper/gr-event-helper_test.html b/polygerrit-ui/app/elements/plugins/gr-event-helper/gr-event-helper_test.html
index 9d42851..709c042 100644
--- a/polygerrit-ui/app/elements/plugins/gr-event-helper/gr-event-helper_test.html
+++ b/polygerrit-ui/app/elements/plugins/gr-event-helper/gr-event-helper_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -92,5 +93,12 @@
       flushAsynchronousOperations();
       assert.isFalse(tapStub.called);
     });
+
+    test('on()', done => {
+      instance.on('foo', () => {
+        done();
+      });
+      element.fire('foo');
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/plugins/gr-external-style/gr-external-style.html b/polygerrit-ui/app/elements/plugins/gr-external-style/gr-external-style.html
index 623d304..a83b2ab 100644
--- a/polygerrit-ui/app/elements/plugins/gr-external-style/gr-external-style.html
+++ b/polygerrit-ui/app/elements/plugins/gr-external-style/gr-external-style.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -19,7 +20,7 @@
 
 <dom-module id="gr-external-style">
   <template>
-    <content></content>
+    <slot></slot>
   </template>
   <script src="gr-external-style.js"></script>
 </dom-module>
diff --git a/polygerrit-ui/app/elements/plugins/gr-external-style/gr-external-style.js b/polygerrit-ui/app/elements/plugins/gr-external-style/gr-external-style.js
index a4f1f74..0e8bb45 100644
--- a/polygerrit-ui/app/elements/plugins/gr-external-style/gr-external-style.js
+++ b/polygerrit-ui/app/elements/plugins/gr-external-style/gr-external-style.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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';
 
@@ -19,24 +22,35 @@
 
     properties: {
       name: String,
+      _urlsImported: {
+        type: Array,
+        value() { return []; },
+      },
+      _stylesApplied: {
+        type: Array,
+        value() { return []; },
+      },
     },
 
     _import(url) {
+      if (this._urlsImported.includes(url)) { return Promise.resolve(); }
+      this._urlsImported.push(url);
       return new Promise((resolve, reject) => {
         this.importHref(url, resolve, reject);
       });
     },
 
     _applyStyle(name) {
+      if (this._stylesApplied.includes(name)) { return; }
+      this._stylesApplied.push(name);
       const s = document.createElement('style', 'custom-style');
       s.setAttribute('include', name);
       Polymer.dom(this.root).appendChild(s);
     },
 
-    ready() {
-      Gerrit.awaitPluginsLoaded().then(() => Promise.all(
-          Gerrit._endpoints.getPlugins(this.name).map(
-              pluginUrl => this._import(pluginUrl)))
+    _importAndApply() {
+      Promise.all(Gerrit._endpoints.getPlugins(this.name).map(
+          pluginUrl => this._import(pluginUrl))
       ).then(() => {
         const moduleNames = Gerrit._endpoints.getModules(this.name);
         for (const name of moduleNames) {
@@ -44,5 +58,13 @@
         }
       });
     },
+
+    attached() {
+      this._importAndApply();
+    },
+
+    ready() {
+      Gerrit.awaitPluginsLoaded().then(() => this._importAndApply());
+    },
   });
 })();
diff --git a/polygerrit-ui/app/elements/plugins/gr-external-style/gr-external-style_test.html b/polygerrit-ui/app/elements/plugins/gr-external-style/gr-external-style_test.html
index bc24c2b..ec2888d 100644
--- a/polygerrit-ui/app/elements/plugins/gr-external-style/gr-external-style_test.html
+++ b/polygerrit-ui/app/elements/plugins/gr-external-style/gr-external-style_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -31,38 +32,90 @@
 
 <script>
   suite('gr-external-style integration tests', () => {
+    const TEST_URL = 'http://some/plugin/url.html';
+
     let sandbox;
     let element;
+    let plugin;
 
-    setup(done => {
-      sandbox = sinon.sandbox.create();
-
-      // NB: Order is important.
-      let plugin;
+    const installPlugin = () => {
+      if (plugin) { return; }
       Gerrit.install(p => {
         plugin = p;
-        plugin.registerStyleModule('foo', 'some-module');
-      }, '0.1', 'http://some/plugin/url.html');
+      }, '0.1', TEST_URL);
+    };
 
-      sandbox.stub(Gerrit, 'awaitPluginsLoaded').returns(Promise.resolve());
-
+    const createElement = () => {
       element = fixture('basic');
-      sandbox.stub(element, '_applyStyle');
-      sandbox.stub(element, 'importHref', (url, resolve) => { resolve(); });
+      sandbox.spy(element, '_applyStyle');
+    };
 
-      flush(done);
+    /**
+     * Installs the plugin, creates the element, registers style module.
+     */
+    const lateRegister = () => {
+      installPlugin();
+      createElement();
+      plugin.registerStyleModule('foo', 'some-module');
+    };
+
+    /**
+     * Installs the plugin, registers style module, creates the element.
+     */
+    const earlyRegister = () => {
+      installPlugin();
+      plugin.registerStyleModule('foo', 'some-module');
+      createElement();
+    };
+
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+      stub('gr-external-style', {
+        importHref: (url, resolve) => resolve(),
+      });
+      sandbox.stub(Gerrit, 'awaitPluginsLoaded').returns(Promise.resolve());
     });
 
     teardown(() => {
       sandbox.restore();
     });
 
-    test('imports plugin-provided module', () => {
-      assert.isTrue(element.importHref.calledWith(
-          new URL('http://some/plugin/url.html')));
+    test('imports plugin-provided module', async () => {
+      lateRegister();
+      await new Promise(flush);
+      assert.isTrue(element.importHref.calledWith(new URL(TEST_URL)));
     });
 
-    test('applies plugin-provided styles', () => {
+    test('applies plugin-provided styles', async () => {
+      lateRegister();
+      await new Promise(flush);
+      assert.isTrue(element._applyStyle.calledWith('some-module'));
+    });
+
+    test('does not double import', async () => {
+      earlyRegister();
+      await new Promise(flush);
+      plugin.registerStyleModule('foo', 'some-module');
+      await new Promise(flush);
+      const urlsImported =
+          element._urlsImported.filter(url => url.toString() === TEST_URL);
+      assert.strictEqual(urlsImported.length, 1);
+    });
+
+    test('does not double apply', async () => {
+      earlyRegister();
+      await new Promise(flush);
+      plugin.registerStyleModule('foo', 'some-module');
+      await new Promise(flush);
+      const stylesApplied =
+          element._stylesApplied.filter(name => name === 'some-module');
+      assert.strictEqual(stylesApplied.length, 1);
+    });
+
+    test('loads and applies preloaded modules', async () => {
+      earlyRegister();
+      await new Promise(flush);
+      assert.isTrue(element.importHref.calledWith(new URL(TEST_URL)));
       assert.isTrue(element._applyStyle.calledWith('some-module'));
     });
   });
diff --git a/polygerrit-ui/app/elements/plugins/gr-plugin-host/gr-plugin-host.html b/polygerrit-ui/app/elements/plugins/gr-plugin-host/gr-plugin-host.html
index ad4e2b0..8e106cc 100644
--- a/polygerrit-ui/app/elements/plugins/gr-plugin-host/gr-plugin-host.html
+++ b/polygerrit-ui/app/elements/plugins/gr-plugin-host/gr-plugin-host.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/plugins/gr-plugin-host/gr-plugin-host.js b/polygerrit-ui/app/elements/plugins/gr-plugin-host/gr-plugin-host.js
index d3ad997..111cdc6 100644
--- a/polygerrit-ui/app/elements/plugins/gr-plugin-host/gr-plugin-host.js
+++ b/polygerrit-ui/app/elements/plugins/gr-plugin-host/gr-plugin-host.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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';
 
@@ -30,15 +33,25 @@
 
     _configChanged(config) {
       const plugins = config.plugin;
-      const htmlPlugins = plugins.html_resource_paths || [];
-      const jsPlugins = this._handleMigrations(plugins.js_resource_paths || [],
-          htmlPlugins);
-      const defaultTheme = config.default_theme;
+      const htmlPlugins = (plugins.html_resource_paths || [])
+          .map(p => this._urlFor(p))
+          .filter(p => !Gerrit._isPluginPreloaded(p));
+      const jsPlugins =
+          this._handleMigrations(plugins.js_resource_paths || [], htmlPlugins)
+          .map(p => this._urlFor(p))
+          .filter(p => !Gerrit._isPluginPreloaded(p));
+      const shouldLoadTheme = config.default_theme &&
+            !Gerrit._isPluginPreloaded('preloaded:gerrit-theme');
+      const defaultTheme =
+            shouldLoadTheme ? this._urlFor(config.default_theme) : null;
+      const pluginsPending =
+          [].concat(jsPlugins, htmlPlugins, defaultTheme || []);
+      Gerrit._setPluginsPending(pluginsPending);
       if (defaultTheme) {
         // Make theme first to be first to load.
-        htmlPlugins.unshift(defaultTheme);
+        // Load sync to work around rare theme loading race condition.
+        this._importHtmlPlugins([defaultTheme], true);
       }
-      Gerrit._setPluginsCount(jsPlugins.length + htmlPlugins.length);
       this._loadJsPlugins(jsPlugins);
       this._importHtmlPlugins(htmlPlugins);
     },
@@ -58,13 +71,18 @@
      * @suppress {checkTypes}
      * States that it expects no more than 3 parameters, but that's not true.
      * @todo (beckysiegel) check Polymer annotations and submit change.
+     * @param {Array} plugins
+     * @param {boolean=} opt_sync
      */
-    _importHtmlPlugins(plugins) {
+    _importHtmlPlugins(plugins, opt_sync) {
+      const async = !opt_sync;
       for (const url of plugins) {
         // onload (second param) needs to be a function. When null or undefined
         // were passed, plugins were not loaded correctly.
         this.importHref(
-            this._urlFor(url), () => {}, Gerrit._pluginInstalled, true);
+            this._urlFor(url), () => {},
+            Gerrit._pluginInstallError.bind(null, `${url} import error`),
+            async);
       }
     },
 
@@ -78,18 +96,23 @@
       const el = document.createElement('script');
       el.defer = true;
       el.src = url;
-      el.onerror = Gerrit._pluginInstalled;
+      el.onerror = Gerrit._pluginInstallError.bind(null, `${url} load error`);
       return document.body.appendChild(el);
     },
 
     _urlFor(pathOrUrl) {
-      if (pathOrUrl.startsWith('http')) {
+      if (!pathOrUrl) {
+        return pathOrUrl;
+      }
+      if (pathOrUrl.startsWith('preloaded:') ||
+          pathOrUrl.startsWith('http')) {
+        // Plugins are loaded from another domain or preloaded.
         return pathOrUrl;
       }
       if (!pathOrUrl.startsWith('/')) {
         pathOrUrl = '/' + pathOrUrl;
       }
-      return this.getBaseUrl() + pathOrUrl;
+      return window.location.origin + this.getBaseUrl() + pathOrUrl;
     },
   });
 })();
diff --git a/polygerrit-ui/app/elements/plugins/gr-plugin-host/gr-plugin-host_test.html b/polygerrit-ui/app/elements/plugins/gr-plugin-host/gr-plugin-host_test.html
index dd664ff..9901d9f 100644
--- a/polygerrit-ui/app/elements/plugins/gr-plugin-host/gr-plugin-host_test.html
+++ b/polygerrit-ui/app/elements/plugins/gr-plugin-host/gr-plugin-host_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -32,15 +33,17 @@
 </test-fixture>
 
 <script>
-  suite('gr-diff tests', () => {
+  suite('gr-plugin-host tests', () => {
     let element;
     let sandbox;
+    let url;
 
     setup(() => {
       element = fixture('basic');
       sandbox = sinon.sandbox.create();
       sandbox.stub(document.body, 'appendChild');
       sandbox.stub(element, 'importHref');
+      url = window.location.origin;
     });
 
     teardown(() => {
@@ -51,44 +54,51 @@
       sandbox.stub(Gerrit, '_setPluginsCount');
       element.config = {
         plugin: {
-          html_resource_paths: ['foo/bar', 'baz'],
-          js_resource_paths: ['42'],
+          html_resource_paths: ['plugins/foo/bar', 'plugins/baz'],
+          js_resource_paths: ['plugins/42'],
         },
       };
       assert.isTrue(Gerrit._setPluginsCount.calledWith(3));
     });
 
     test('imports relative html plugins from config', () => {
+      sandbox.stub(Gerrit, '_pluginInstallError');
       element.config = {
         plugin: {html_resource_paths: ['foo/bar', 'baz']},
       };
-      assert.equal(element.importHref.firstCall.args[0], '/foo/bar');
-      assert.equal(element.importHref.firstCall.args[2],
-          Gerrit._pluginInstalled);
+      assert.equal(element.importHref.firstCall.args[0], url + '/foo/bar');
       assert.isTrue(element.importHref.firstCall.args[3]);
 
-      assert.equal(element.importHref.secondCall.args[0], '/baz');
-      assert.equal(element.importHref.secondCall.args[2],
-          Gerrit._pluginInstalled);
+      assert.equal(element.importHref.secondCall.args[0], url + '/baz');
       assert.isTrue(element.importHref.secondCall.args[3]);
+
+      assert.equal(Gerrit._pluginInstallError.callCount, 0);
+      element.importHref.firstCall.args[2]();
+      assert.equal(Gerrit._pluginInstallError.callCount, 1);
+      element.importHref.secondCall.args[2]();
+      assert.equal(Gerrit._pluginInstallError.callCount, 2);
     });
 
     test('imports relative html plugins from config with a base url', () => {
+      sandbox.stub(Gerrit, '_pluginInstallError');
       sandbox.stub(element, 'getBaseUrl').returns('/the-base');
       element.config = {
         plugin: {html_resource_paths: ['foo/bar', 'baz']}};
-      assert.equal(element.importHref.firstCall.args[0], '/the-base/foo/bar');
-      assert.equal(element.importHref.firstCall.args[2],
-          Gerrit._pluginInstalled);
+      assert.equal(element.importHref.firstCall.args[0],
+          url + '/the-base/foo/bar');
       assert.isTrue(element.importHref.firstCall.args[3]);
 
-      assert.equal(element.importHref.secondCall.args[0], '/the-base/baz');
-      assert.equal(element.importHref.secondCall.args[2],
-          Gerrit._pluginInstalled);
+      assert.equal(element.importHref.secondCall.args[0],
+          url + '/the-base/baz');
       assert.isTrue(element.importHref.secondCall.args[3]);
+      assert.equal(Gerrit._pluginInstallError.callCount, 0);
+      element.importHref.firstCall.args[2]();
+      assert.equal(Gerrit._pluginInstallError.callCount, 1);
+      element.importHref.secondCall.args[2]();
+      assert.equal(Gerrit._pluginInstallError.callCount, 2);
     });
 
-    test('inportHref is not called with null callback functions', () => {
+    test('importHref is not called with null callback functions', () => {
       const plugins = ['path/to/plugin'];
       element._importHtmlPlugins(plugins);
       assert.isTrue(element.importHref.calledOnce);
@@ -97,6 +107,7 @@
     });
 
     test('imports absolute html plugins from config', () => {
+      sandbox.stub(Gerrit, '_pluginInstallError');
       element.config = {
         plugin: {
           html_resource_paths: [
@@ -107,15 +118,16 @@
       };
       assert.equal(element.importHref.firstCall.args[0],
           'http://example.com/foo/bar');
-      assert.equal(element.importHref.firstCall.args[2],
-          Gerrit._pluginInstalled);
       assert.isTrue(element.importHref.firstCall.args[3]);
 
       assert.equal(element.importHref.secondCall.args[0],
           'https://example.com/baz');
-      assert.equal(element.importHref.secondCall.args[2],
-          Gerrit._pluginInstalled);
       assert.isTrue(element.importHref.secondCall.args[3]);
+      assert.equal(Gerrit._pluginInstallError.callCount, 0);
+      element.importHref.firstCall.args[2]();
+      assert.equal(Gerrit._pluginInstallError.callCount, 1);
+      element.importHref.secondCall.args[2]();
+      assert.equal(Gerrit._pluginInstallError.callCount, 2);
     });
 
     test('adds js plugins from config to the body', () => {
@@ -126,16 +138,18 @@
     test('imports relative js plugins from config', () => {
       sandbox.stub(element, '_createScriptTag');
       element.config = {plugin: {js_resource_paths: ['foo/bar', 'baz']}};
-      assert.isTrue(element._createScriptTag.calledWith('/foo/bar'));
-      assert.isTrue(element._createScriptTag.calledWith('/baz'));
+      assert.isTrue(element._createScriptTag.calledWith(url + '/foo/bar'));
+      assert.isTrue(element._createScriptTag.calledWith(url + '/baz'));
     });
 
     test('imports relative html plugins from config with a base url', () => {
       sandbox.stub(element, '_createScriptTag');
       sandbox.stub(element, 'getBaseUrl').returns('/the-base');
       element.config = {plugin: {js_resource_paths: ['foo/bar', 'baz']}};
-      assert.isTrue(element._createScriptTag.calledWith('/the-base/foo/bar'));
-      assert.isTrue(element._createScriptTag.calledWith('/the-base/baz'));
+      assert.isTrue(element._createScriptTag.calledWith(
+          url + '/the-base/foo/bar'));
+      assert.isTrue(element._createScriptTag.calledWith(
+          url + '/the-base/baz'));
     });
 
     test('imports absolute html plugins from config', () => {
@@ -155,21 +169,62 @@
     });
 
     test('default theme is loaded with html plugins', () => {
+      sandbox.stub(Gerrit, '_pluginInstallError');
       element.config = {
         default_theme: '/oof',
         plugin: {
           html_resource_paths: ['some'],
         },
       };
-      assert.equal(element.importHref.firstCall.args[0], '/oof');
-      assert.equal(element.importHref.firstCall.args[2],
-          Gerrit._pluginInstalled);
-      assert.isTrue(element.importHref.firstCall.args[3]);
+      assert.equal(element.importHref.firstCall.args[0], url + '/oof');
+      assert.isFalse(element.importHref.firstCall.args[3]);
 
-      assert.equal(element.importHref.secondCall.args[0], '/some');
-      assert.equal(element.importHref.secondCall.args[2],
-          Gerrit._pluginInstalled);
+      assert.equal(element.importHref.secondCall.args[0], url + '/some');
       assert.isTrue(element.importHref.secondCall.args[3]);
+      assert.equal(Gerrit._pluginInstallError.callCount, 0);
+      element.importHref.firstCall.args[2]();
+      assert.equal(Gerrit._pluginInstallError.callCount, 1);
+      element.importHref.secondCall.args[2]();
+      assert.equal(Gerrit._pluginInstallError.callCount, 2);
+    });
+
+    test('default theme is loaded with html plugins', () => {
+      sandbox.stub(Gerrit, '_setPluginsPending');
+      element.config = {
+        default_theme: '/oof',
+        plugin: {},
+      };
+      assert.isTrue(Gerrit._setPluginsPending.calledWith([url + '/oof']));
+    });
+
+    test('skips default theme loading if preloaded', () => {
+      sandbox.stub(Gerrit, '_isPluginPreloaded')
+          .withArgs('preloaded:gerrit-theme').returns(true);
+      sandbox.stub(Gerrit, '_setPluginsPending');
+      element.config = {
+        default_theme: '/oof',
+        plugin: {},
+      };
+      assert.isFalse(element.importHref.calledWith(url + '/oof'));
+    });
+
+    test('skips preloaded plugins', () => {
+      sandbox.stub(Gerrit, '_isPluginPreloaded')
+          .withArgs(url + '/plugins/foo/bar').returns(true)
+          .withArgs(url + '/plugins/42').returns(true);
+      sandbox.stub(Gerrit, '_setPluginsCount');
+      sandbox.stub(Gerrit, '_setPluginsPending');
+      sandbox.stub(element, '_createScriptTag');
+      element.config = {
+        plugin: {
+          html_resource_paths: ['plugins/foo/bar', 'plugins/baz'],
+          js_resource_paths: ['plugins/42'],
+        },
+      };
+      assert.isTrue(
+          Gerrit._setPluginsPending.calledWith([url + '/plugins/baz']));
+      assert.equal(element._createScriptTag.callCount, 0);
+      assert.isTrue(element.importHref.calledWith(url + '/plugins/baz'));
     });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/plugins/gr-popup-interface/gr-plugin-popup.html b/polygerrit-ui/app/elements/plugins/gr-popup-interface/gr-plugin-popup.html
index 3ccb3fd..ce0bf1b 100644
--- a/polygerrit-ui/app/elements/plugins/gr-popup-interface/gr-plugin-popup.html
+++ b/polygerrit-ui/app/elements/plugins/gr-popup-interface/gr-plugin-popup.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -21,7 +22,7 @@
   <template>
     <style include="shared-styles"></style>
     <gr-overlay id="overlay" with-backdrop>
-      <content></content>
+      <slot></slot>
     </gr-overlay>
   </template>
   <script src="gr-plugin-popup.js"></script>
diff --git a/polygerrit-ui/app/elements/plugins/gr-popup-interface/gr-plugin-popup.js b/polygerrit-ui/app/elements/plugins/gr-popup-interface/gr-plugin-popup.js
index 8286eae..dd37f84 100644
--- a/polygerrit-ui/app/elements/plugins/gr-popup-interface/gr-plugin-popup.js
+++ b/polygerrit-ui/app/elements/plugins/gr-popup-interface/gr-plugin-popup.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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(window) {
   'use strict';
   Polymer({
diff --git a/polygerrit-ui/app/elements/plugins/gr-popup-interface/gr-plugin-popup_test.html b/polygerrit-ui/app/elements/plugins/gr-popup-interface/gr-plugin-popup_test.html
index 2dbf96d..91386b9 100644
--- a/polygerrit-ui/app/elements/plugins/gr-popup-interface/gr-plugin-popup_test.html
+++ b/polygerrit-ui/app/elements/plugins/gr-popup-interface/gr-plugin-popup_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/plugins/gr-popup-interface/gr-popup-interface.html b/polygerrit-ui/app/elements/plugins/gr-popup-interface/gr-popup-interface.html
index 6bf37de..2fdf28c 100644
--- a/polygerrit-ui/app/elements/plugins/gr-popup-interface/gr-popup-interface.html
+++ b/polygerrit-ui/app/elements/plugins/gr-popup-interface/gr-popup-interface.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/plugins/gr-popup-interface/gr-popup-interface.js b/polygerrit-ui/app/elements/plugins/gr-popup-interface/gr-popup-interface.js
index e62e882..556cfd8 100644
--- a/polygerrit-ui/app/elements/plugins/gr-popup-interface/gr-popup-interface.js
+++ b/polygerrit-ui/app/elements/plugins/gr-popup-interface/gr-popup-interface.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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(window) {
   'use strict';
 
diff --git a/polygerrit-ui/app/elements/plugins/gr-popup-interface/gr-popup-interface_test.html b/polygerrit-ui/app/elements/plugins/gr-popup-interface/gr-popup-interface_test.html
index 7d9dd28..983c795 100644
--- a/polygerrit-ui/app/elements/plugins/gr-popup-interface/gr-popup-interface_test.html
+++ b/polygerrit-ui/app/elements/plugins/gr-popup-interface/gr-popup-interface_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/plugins/gr-repo-api/gr-plugin-repo-command.html b/polygerrit-ui/app/elements/plugins/gr-repo-api/gr-plugin-repo-command.html
new file mode 100644
index 0000000..e47ba15
--- /dev/null
+++ b/polygerrit-ui/app/elements/plugins/gr-repo-api/gr-plugin-repo-command.html
@@ -0,0 +1,35 @@
+<!--
+@license
+Copyright (C) 2017 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="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../admin/gr-repo-command/gr-repo-command.html">
+
+<dom-module id="gr-plugin-repo-command">
+  <template>
+    <gr-repo-command title="[[title]]">
+    </gr-repo-command>
+  </template>
+  <script>
+    Polymer({
+      is: 'gr-plugin-repo-command',
+      properties: {
+        title: String,
+        repoName: String,
+        config: Object,
+      },
+    });
+  </script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/plugins/gr-repo-api/gr-repo-api.html b/polygerrit-ui/app/elements/plugins/gr-repo-api/gr-repo-api.html
new file mode 100644
index 0000000..34c9797
--- /dev/null
+++ b/polygerrit-ui/app/elements/plugins/gr-repo-api/gr-repo-api.html
@@ -0,0 +1,24 @@
+<!--
+@license
+Copyright (C) 2017 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="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../shared/gr-js-api-interface/gr-js-api-interface.html">
+<link rel="import" href="gr-plugin-repo-command.html">
+
+<dom-module id="gr-repo-api">
+  <script src="gr-repo-api.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/plugins/gr-repo-api/gr-repo-api.js b/polygerrit-ui/app/elements/plugins/gr-repo-api/gr-repo-api.js
new file mode 100644
index 0000000..45f106d
--- /dev/null
+++ b/polygerrit-ui/app/elements/plugins/gr-repo-api/gr-repo-api.js
@@ -0,0 +1,63 @@
+/**
+ * @license
+ * Copyright (C) 2017 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(window) {
+  'use strict';
+
+  // Prevent redefinition.
+  if (window.GrRepoApi) { return; }
+
+  function GrRepoApi(plugin) {
+    this._hook = null;
+    this.plugin = plugin;
+  }
+
+  GrRepoApi.prototype._createHook = function(title) {
+    this._hook = this.plugin.hook('repo-command').onAttached(element => {
+      const pluginCommand =
+            document.createElement('gr-plugin-repo-command');
+      pluginCommand.title = title;
+      element.appendChild(pluginCommand);
+    });
+  };
+
+  GrRepoApi.prototype.createCommand = function(title, callback) {
+    if (this._hook) {
+      console.warn('Already set up.');
+      return this._hook;
+    }
+    this._createHook(title);
+    this._hook.onAttached(element => {
+      if (callback(element.repoName, element.config) === false) {
+        element.hidden = true;
+      }
+    });
+    return this;
+  };
+
+  GrRepoApi.prototype.onTap = function(callback) {
+    if (!this._hook) {
+      console.warn('Call createCommand first.');
+      return this;
+    }
+    this._hook.onAttached(element => {
+      this.plugin.eventHelper(element).on('command-tap', callback);
+    });
+    return this;
+  };
+
+  window.GrRepoApi = GrRepoApi;
+})(window);
diff --git a/polygerrit-ui/app/elements/plugins/gr-repo-api/gr-repo-api_test.html b/polygerrit-ui/app/elements/plugins/gr-repo-api/gr-repo-api_test.html
new file mode 100644
index 0000000..bb9ae87
--- /dev/null
+++ b/polygerrit-ui/app/elements/plugins/gr-repo-api/gr-repo-api_test.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html>
+<!--
+@license
+Copyright (C) 2017 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-repo-api</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="../gr-endpoint-decorator/gr-endpoint-decorator.html">
+<link rel="import" href="gr-repo-api.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-endpoint-decorator name="repo-command">
+    </gr-endpoint-decorator>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-repo-api tests', () => {
+    let sandbox;
+    let repoApi;
+
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+      let plugin;
+      Gerrit.install(p => { plugin = p; }, '0.1',
+          'http://test.com/plugins/testplugin/static/test.js');
+      sandbox.stub(Gerrit, '_arePluginsLoaded').returns(true);
+      repoApi = plugin.project();
+    });
+
+    teardown(() => {
+      repoApi = null;
+      sandbox.restore();
+    });
+
+    test('exists', () => {
+      assert.isOk(repoApi);
+    });
+
+    test('works', done => {
+      const attachedStub = sandbox.stub();
+      const tapStub = sandbox.stub();
+      repoApi
+          .createCommand('foo', attachedStub)
+          .onTap(tapStub);
+      const element = fixture('basic');
+      flush(() => {
+        assert.isTrue(attachedStub.called);
+        const pluginCommand = element.$$('gr-plugin-repo-command');
+        assert.isOk(pluginCommand);
+        const command = pluginCommand.$$('gr-repo-command');
+        assert.isOk(command);
+        assert.equal(command.title, 'foo');
+        assert.isFalse(tapStub.called);
+        MockInteractions.tap(command.$$('gr-button'));
+        assert.isTrue(tapStub.called);
+        done();
+      });
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/plugins/gr-settings-api/gr-settings-api.html b/polygerrit-ui/app/elements/plugins/gr-settings-api/gr-settings-api.html
new file mode 100644
index 0000000..7c916dc
--- /dev/null
+++ b/polygerrit-ui/app/elements/plugins/gr-settings-api/gr-settings-api.html
@@ -0,0 +1,27 @@
+<!--
+@license
+Copyright (C) 2017 The Android Open Source Settings
+
+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="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
+<link rel="import" href="../../settings/gr-settings-view/gr-settings-item.html">
+<link rel="import" href="../../settings/gr-settings-view/gr-settings-menu-item.html">
+<link rel="import" href="../../shared/gr-js-api-interface/gr-js-api-interface.html">
+<link rel="import" href="../../shared/gr-js-api-interface/gr-js-api-interface.html">
+
+<dom-module id="gr-settings-api">
+  <script src="gr-settings-api.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/plugins/gr-settings-api/gr-settings-api.js b/polygerrit-ui/app/elements/plugins/gr-settings-api/gr-settings-api.js
new file mode 100644
index 0000000..49ff4ce
--- /dev/null
+++ b/polygerrit-ui/app/elements/plugins/gr-settings-api/gr-settings-api.js
@@ -0,0 +1,65 @@
+/**
+ * @license
+ * Copyright (C) 2017 The Android Open Source Settings
+ *
+ * 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(window) {
+  'use strict';
+
+  function GrSettingsApi(plugin) {
+    this._title = '(no title)';
+    // Generate default screen URL token, specific to plugin, and unique(ish).
+    this._token =
+      plugin.getPluginName() + Math.random().toString(36).substr(5);
+    this.plugin = plugin;
+  }
+
+  GrSettingsApi.prototype.title = function(title) {
+    this._title = title;
+    return this;
+  };
+
+  GrSettingsApi.prototype.token = function(token) {
+    this._token = token;
+    return this;
+  };
+
+  GrSettingsApi.prototype.module = function(moduleName) {
+    this._moduleName = moduleName;
+    return this;
+  };
+
+  GrSettingsApi.prototype.build = function() {
+    if (!this._moduleName) {
+      throw new Error('Settings screen custom element not defined!');
+    }
+    const token = `x/${this.plugin.getPluginName()}/${this._token}`;
+    this.plugin.hook('settings-menu-item').onAttached(el => {
+      const menuItem = document.createElement('gr-settings-menu-item');
+      menuItem.title = this._title;
+      menuItem.href = `#${token}`;
+      el.appendChild(menuItem);
+    });
+
+    return this.plugin.hook('settings-screen').onAttached(el => {
+      const item = document.createElement('gr-settings-item');
+      item.title = this._title;
+      item.anchor = token;
+      item.appendChild(document.createElement(this._moduleName));
+      el.appendChild(item);
+    });
+  };
+
+  window.GrSettingsApi = GrSettingsApi;
+})(window);
diff --git a/polygerrit-ui/app/elements/plugins/gr-settings-api/gr-settings-api_test.html b/polygerrit-ui/app/elements/plugins/gr-settings-api/gr-settings-api_test.html
new file mode 100644
index 0000000..cabd26b
--- /dev/null
+++ b/polygerrit-ui/app/elements/plugins/gr-settings-api/gr-settings-api_test.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html>
+<!--
+@license
+Copyright (C) 2017 The Android Open Source Settings
+
+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-settings-api</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="../gr-endpoint-decorator/gr-endpoint-decorator.html">
+<link rel="import" href="gr-settings-api.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-endpoint-decorator name="settings-menu-item">
+    </gr-endpoint-decorator>
+    <gr-endpoint-decorator name="settings-screen">
+    </gr-endpoint-decorator>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-settings-api tests', () => {
+    let sandbox;
+    let settingsApi;
+
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+      let plugin;
+      Gerrit.install(p => { plugin = p; }, '0.1',
+          'http://test.com/plugins/testplugin/static/test.js');
+      sandbox.stub(Gerrit, '_arePluginsLoaded').returns(true);
+      settingsApi = plugin.settings();
+    });
+
+    teardown(() => {
+      settingsApi = null;
+      sandbox.restore();
+    });
+
+    test('exists', () => {
+      assert.isOk(settingsApi);
+    });
+
+    test('works', done => {
+      settingsApi
+          .title('foo')
+          .token('bar')
+          .module('some-settings-screen')
+          .build();
+      const element = fixture('basic');
+      flush(() => {
+        const [menuItemEl, itemEl] = element;
+        const menuItem = menuItemEl.$$('gr-settings-menu-item');
+        assert.isOk(menuItem);
+        assert.equal(menuItem.title, 'foo');
+        assert.equal(menuItem.href, '#x/testplugin/bar');
+        const item = itemEl.$$('gr-settings-item');
+        assert.isOk(item);
+        assert.equal(item.title, 'foo');
+        assert.equal(item.anchor, 'x/testplugin/bar');
+        done();
+      });
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/plugins/gr-theme-api/gr-custom-plugin-header.html b/polygerrit-ui/app/elements/plugins/gr-theme-api/gr-custom-plugin-header.html
index 233e83e..e6e8fa5 100644
--- a/polygerrit-ui/app/elements/plugins/gr-theme-api/gr-custom-plugin-header.html
+++ b/polygerrit-ui/app/elements/plugins/gr-theme-api/gr-custom-plugin-header.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/plugins/gr-theme-api/gr-theme-api.html b/polygerrit-ui/app/elements/plugins/gr-theme-api/gr-theme-api.html
index 973254a..b84f5b9 100644
--- a/polygerrit-ui/app/elements/plugins/gr-theme-api/gr-theme-api.html
+++ b/polygerrit-ui/app/elements/plugins/gr-theme-api/gr-theme-api.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/plugins/gr-theme-api/gr-theme-api.js b/polygerrit-ui/app/elements/plugins/gr-theme-api/gr-theme-api.js
index d57b301..404fb9c 100644
--- a/polygerrit-ui/app/elements/plugins/gr-theme-api/gr-theme-api.js
+++ b/polygerrit-ui/app/elements/plugins/gr-theme-api/gr-theme-api.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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(window) {
   'use strict';
 
diff --git a/polygerrit-ui/app/elements/plugins/gr-theme-api/gr-theme-api_test.html b/polygerrit-ui/app/elements/plugins/gr-theme-api/gr-theme-api_test.html
index 74dff66..8d23ea2 100644
--- a/polygerrit-ui/app/elements/plugins/gr-theme-api/gr-theme-api_test.html
+++ b/polygerrit-ui/app/elements/plugins/gr-theme-api/gr-theme-api_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -64,7 +65,7 @@
         stub('gr-custom-plugin-header', {
           ready() { customHeader = this; },
         });
-        Gerrit._resolveAllPluginsLoaded();
+        Gerrit._setPluginsPending([]);
       });
 
       test('sets logo and title', done => {
diff --git a/polygerrit-ui/app/elements/settings/gr-account-info/gr-account-info.html b/polygerrit-ui/app/elements/settings/gr-account-info/gr-account-info.html
index 55164e0..f534771 100644
--- a/polygerrit-ui/app/elements/settings/gr-account-info/gr-account-info.html
+++ b/polygerrit-ui/app/elements/settings/gr-account-info/gr-account-info.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,6 +17,7 @@
 
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
 
+<link rel="import" href="../../shared/gr-avatar/gr-avatar.html">
 <link rel="import" href="../../shared/gr-date-formatter/gr-date-formatter.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
 
@@ -25,10 +27,35 @@
 
 <dom-module id="gr-account-info">
   <template>
-    <style include="shared-styles"></style>
+    <style include="shared-styles">
+      gr-avatar {
+        height: 120px;
+        width: 120px;
+        margin-right: .15em;
+        vertical-align: -.25em;
+      }
+      .hide {
+        display: none;
+      }
+    </style>
     <style include="gr-form-styles"></style>
     <div class="gr-form-styles">
       <section>
+        <span class="title"></span>
+        <span class="value">
+          <gr-avatar account="[[_account]]"
+              image-size="120"></gr-avatar>
+        </span>
+      </section>
+      <section class$="[[_hideAvatarChangeUrl(_avatarChangeUrl)]]">
+        <span class="title"></span>
+        <span class="value">
+          <a href$="[[_avatarChangeUrl]]">
+            Change avatar
+          </a>
+        </span>
+      </section>
+      <section>
         <span class="title">ID</span>
         <span class="value">[[_account._account_id]]</span>
       </section>
@@ -58,6 +85,7 @@
               disabled="[[_saving]]"
               on-keydown="_handleKeydown"
               bind-value="{{_username}}">
+        </span>
       </section>
       <section id="nameSection">
         <span class="title">Full name</span>
@@ -76,7 +104,7 @@
         </span>
       </section>
       <section>
-        <span class="title">Status</span>
+        <span class="title">Status (e.g. "Vacation")</span>
         <span class="value">
           <input
               is="iron-input"
diff --git a/polygerrit-ui/app/elements/settings/gr-account-info/gr-account-info.js b/polygerrit-ui/app/elements/settings/gr-account-info/gr-account-info.js
index 3cec65a..fcc99aa 100644
--- a/polygerrit-ui/app/elements/settings/gr-account-info/gr-account-info.js
+++ b/polygerrit-ui/app/elements/settings/gr-account-info/gr-account-info.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -59,6 +62,10 @@
         type: String,
         observer: '_usernameChanged',
       },
+      _avatarChangeUrl: {
+        type: String,
+        value: '',
+      },
     },
 
     observers: [
@@ -86,6 +93,10 @@
         this._username = account.username;
       }));
 
+      promises.push(this.$.restAPI.getAvatarChangeUrl().then(url => {
+        this._avatarChangeUrl = url;
+      }));
+
       return Promise.all(promises).then(() => {
         this._loading = false;
       });
@@ -164,5 +175,13 @@
         this.save();
       }
     },
+
+    _hideAvatarChangeUrl(avatarChangeUrl) {
+      if (!avatarChangeUrl) {
+        return 'hide';
+      }
+
+      return '';
+    },
   });
 })();
diff --git a/polygerrit-ui/app/elements/settings/gr-account-info/gr-account-info_test.html b/polygerrit-ui/app/elements/settings/gr-account-info/gr-account-info_test.html
index 82997a5..f91277a 100644
--- a/polygerrit-ui/app/elements/settings/gr-account-info/gr-account-info_test.html
+++ b/polygerrit-ui/app/elements/settings/gr-account-info/gr-account-info_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -329,5 +330,11 @@
 
       assert.isTrue(element._hasUsernameChange);
     });
+
+    test('_hideAvatarChangeUrl', () => {
+      assert.equal(element._hideAvatarChangeUrl(''), 'hide');
+
+      assert.equal(element._hideAvatarChangeUrl('https://example.com'), '');
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/settings/gr-agreements-list/gr-agreements-list.html b/polygerrit-ui/app/elements/settings/gr-agreements-list/gr-agreements-list.html
index c665df4..72ea503 100644
--- a/polygerrit-ui/app/elements/settings/gr-agreements-list/gr-agreements-list.html
+++ b/polygerrit-ui/app/elements/settings/gr-agreements-list/gr-agreements-list.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -53,8 +54,7 @@
           </template>
         </tbody>
       </table>
-      <!-- TODO: Renable this when supported in polygerrit -->
-      <!-- <a href$="[[getUrl()]]">New Contributor Agreement</a> -->
+      <a href$="[[getUrl()]]">New Contributor Agreement</a>
     </div>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
   </template>
diff --git a/polygerrit-ui/app/elements/settings/gr-agreements-list/gr-agreements-list.js b/polygerrit-ui/app/elements/settings/gr-agreements-list/gr-agreements-list.js
index 4e25523..41595a98 100644
--- a/polygerrit-ui/app/elements/settings/gr-agreements-list/gr-agreements-list.js
+++ b/polygerrit-ui/app/elements/settings/gr-agreements-list/gr-agreements-list.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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';
 
diff --git a/polygerrit-ui/app/elements/settings/gr-agreements-list/gr-agreements-list_test.html b/polygerrit-ui/app/elements/settings/gr-agreements-list/gr-agreements-list_test.html
index 13b8952..56122a9 100644
--- a/polygerrit-ui/app/elements/settings/gr-agreements-list/gr-agreements-list_test.html
+++ b/polygerrit-ui/app/elements/settings/gr-agreements-list/gr-agreements-list_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/settings/gr-change-table-editor/gr-change-table-editor.html b/polygerrit-ui/app/elements/settings/gr-change-table-editor/gr-change-table-editor.html
index 43343de..4f69513 100644
--- a/polygerrit-ui/app/elements/settings/gr-change-table-editor/gr-change-table-editor.html
+++ b/polygerrit-ui/app/elements/settings/gr-change-table-editor/gr-change-table-editor.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -36,8 +37,11 @@
         cursor: pointer;
         text-align: center;
       }
+      .checkboxContainer input {
+        cursor: pointer;
+      }
       .checkboxContainer:hover {
-        outline: 1px solid #ddd;
+        outline: 1px solid var(--border-color);
       }
     </style>
     <div class="gr-form-styles">
@@ -51,12 +55,12 @@
         <tbody>
           <tr>
             <td>Number</td>
-            <td
-                class="checkboxContainer"
-                on-tap="_handleTargetTap">
+            <td class="checkboxContainer"
+                on-tap="_handleCheckboxContainerTap">
               <input
                   type="checkbox"
                   name="number"
+                  on-tap="_handleNumberCheckboxTap"
                   checked$="[[showNumber]]">
             </td>
           </tr>
@@ -64,10 +68,11 @@
             <tr>
               <td>[[item]]</td>
               <td class="checkboxContainer"
-                  on-tap="_handleTargetTap">
+                  on-tap="_handleCheckboxContainerTap">
                 <input
                     type="checkbox"
                     name="[[item]]"
+                    on-tap="_handleTargetTap"
                     checked$="[[!isColumnHidden(item, displayedColumns)]]">
               </td>
             </tr>
diff --git a/polygerrit-ui/app/elements/settings/gr-change-table-editor/gr-change-table-editor.js b/polygerrit-ui/app/elements/settings/gr-change-table-editor/gr-change-table-editor.js
index 4d87f9e..7d109633 100644
--- a/polygerrit-ui/app/elements/settings/gr-change-table-editor/gr-change-table-editor.js
+++ b/polygerrit-ui/app/elements/settings/gr-change-table-editor/gr-change-table-editor.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -32,40 +35,42 @@
       Gerrit.ChangeTableBehavior,
     ],
 
-    _getButtonText(isShown) {
-      return isShown ? 'Hide' : 'Show';
-    },
-
-    _updateDisplayedColumns(displayedColumns, name, checked) {
-      if (!checked) {
-        return displayedColumns.filter(column => {
-          return name.toLowerCase() !== column.toLowerCase();
-        });
-      } else {
-        return displayedColumns.concat([name]);
-      }
+    /**
+     * Get the list of enabled column names from whichever checkboxes are
+     * checked (excluding the number checkbox).
+     * @return {!Array<string>}
+     */
+    _getDisplayedColumns() {
+      return Polymer.dom(this.root)
+          .querySelectorAll('.checkboxContainer input:not([name=number])')
+          .filter(checkbox => checkbox.checked)
+          .map(checkbox => checkbox.name);
     },
 
     /**
-     * Handles tap on either the checkbox itself or the surrounding table cell.
+     * Handle a tap on a checkbox container and relay the tap to the checkbox it
+     * contains.
+     */
+    _handleCheckboxContainerTap(e) {
+      const checkbox = Polymer.dom(e.target).querySelector('input');
+      if (!checkbox) { return; }
+      checkbox.click();
+    },
+
+    /**
+     * Handle a tap on the number checkbox and update the showNumber property
+     * accordingly.
+     */
+    _handleNumberCheckboxTap(e) {
+      this.showNumber = Polymer.dom(e).rootTarget.checked;
+    },
+
+    /**
+     * Handle a tap on a displayed column checkboxes (excluding number) and
+     * update the displayedColumns property accordingly.
      */
     _handleTargetTap(e) {
-      let checkbox = Polymer.dom(e.target).querySelector('input');
-      if (checkbox) {
-        checkbox.click();
-      } else {
-        // The target is the checkbox itself.
-        checkbox = Polymer.dom(e).rootTarget;
-      }
-
-      if (checkbox.name === 'number') {
-        this.showNumber = checkbox.checked;
-        return;
-      }
-
-      this.set('displayedColumns',
-          this._updateDisplayedColumns(
-              this.displayedColumns, checkbox.name, checkbox.checked));
+      this.set('displayedColumns', this._getDisplayedColumns());
     },
   });
 })();
diff --git a/polygerrit-ui/app/elements/settings/gr-change-table-editor/gr-change-table-editor_test.html b/polygerrit-ui/app/elements/settings/gr-change-table-editor/gr-change-table-editor_test.html
index e1753ba..32fab9d 100644
--- a/polygerrit-ui/app/elements/settings/gr-change-table-editor/gr-change-table-editor_test.html
+++ b/polygerrit-ui/app/elements/settings/gr-change-table-editor/gr-change-table-editor_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -46,12 +47,13 @@
         'Status',
         'Owner',
         'Assignee',
-        'Project',
+        'Repo',
         'Branch',
         'Updated',
       ];
 
       element.set('displayedColumns', columns);
+      element.showNumber = false;
       flushAsynchronousOperations();
     });
 
@@ -89,7 +91,7 @@
         'Status',
         'Owner',
         'Assignee',
-        'Project',
+        'Repo',
         'Branch',
         'Updated',
       ]);
@@ -107,66 +109,50 @@
           displayedLength + 1);
     });
 
-    test('_handleTargetTap', () => {
-      const checkbox = element.$$('table tr:nth-child(2) input');
-      let originalDisplayedColumns = element.displayedColumns;
-      const td = element.$$('table tr:nth-child(2) .checkboxContainer');
-      const displayedColumnStub =
-          sandbox.stub(element, '_updateDisplayedColumns');
-
-      MockInteractions.tap(checkbox);
-      assert.isTrue(displayedColumnStub.lastCall.calledWithExactly(
-          originalDisplayedColumns,
-          checkbox.name,
-          checkbox.checked));
-
-      originalDisplayedColumns = element.displayedColumns;
-      MockInteractions.tap(td);
-      assert.isTrue(displayedColumnStub.lastCall.calledWithExactly(
-          originalDisplayedColumns,
-          checkbox.name,
-          checkbox.checked));
+    test('_getDisplayedColumns', () => {
+      assert.deepEqual(element._getDisplayedColumns(), columns);
+      MockInteractions.tap(
+          element.$$('.checkboxContainer input[name=Assignee]'));
+      assert.deepEqual(element._getDisplayedColumns(),
+          columns.filter(c => c !== 'Assignee'));
     });
 
-    test('_handleTargetTap on number', () => {
-      element.showNumber = false;
-      const checkbox = element.$$('table tr:nth-child(1) input');
-      const displayedColumnStub =
-          sandbox.stub(element, '_updateDisplayedColumns');
+    test('_handleCheckboxContainerTap relayes taps to checkboxes', () => {
+      sandbox.stub(element, '_handleNumberCheckboxTap');
+      sandbox.stub(element, '_handleTargetTap');
 
-      MockInteractions.tap(checkbox);
-      assert.isFalse(displayedColumnStub.called);
+      MockInteractions.tap(
+          element.$$('table tr:first-of-type .checkboxContainer'));
+      assert.isTrue(element._handleNumberCheckboxTap.calledOnce);
+      assert.isFalse(element._handleTargetTap.called);
+
+      MockInteractions.tap(
+          element.$$('table tr:last-of-type .checkboxContainer'));
+      assert.isTrue(element._handleNumberCheckboxTap.calledOnce);
+      assert.isTrue(element._handleTargetTap.calledOnce);
+    });
+
+    test('_handleNumberCheckboxTap', () => {
+      sandbox.spy(element, '_handleNumberCheckboxTap');
+
+      MockInteractions
+          .tap(element.$$('.checkboxContainer input[name=number]'));
+      assert.isTrue(element._handleNumberCheckboxTap.calledOnce);
       assert.isTrue(element.showNumber);
 
-      MockInteractions.tap(checkbox);
+      MockInteractions
+          .tap(element.$$('.checkboxContainer input[name=number]'));
+      assert.isTrue(element._handleNumberCheckboxTap.calledTwice);
       assert.isFalse(element.showNumber);
     });
 
-    test('_updateDisplayedColumns', () => {
-      let name = 'Subject';
-      let checked = false;
-      assert.deepEqual(element._updateDisplayedColumns(columns, name, checked),
-          [
-            'Status',
-            'Owner',
-            'Assignee',
-            'Project',
-            'Branch',
-            'Updated',
-          ]);
-      name = 'Size';
-      checked = true;
-      assert.deepEqual(element._updateDisplayedColumns(columns, name, checked),
-          [
-            'Subject',
-            'Status',
-            'Owner',
-            'Assignee',
-            'Project',
-            'Branch',
-            'Updated',
-            'Size',
-          ]);
+    test('_handleTargetTap', () => {
+      sandbox.spy(element, '_handleTargetTap');
+      assert.include(element.displayedColumns, 'Assignee');
+      MockInteractions
+          .tap(element.$$('.checkboxContainer input[name=Assignee]'));
+      assert.isTrue(element._handleTargetTap.calledOnce);
+      assert.notInclude(element.displayedColumns, 'Assignee');
     });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/settings/gr-cla-view/gr-cla-view.html b/polygerrit-ui/app/elements/settings/gr-cla-view/gr-cla-view.html
index b667d66..d5f1dc3 100644
--- a/polygerrit-ui/app/elements/settings/gr-cla-view/gr-cla-view.html
+++ b/polygerrit-ui/app/elements/settings/gr-cla-view/gr-cla-view.html
@@ -1,5 +1,6 @@
 <!--
-Copyright (C) 2017 The Android Open Source Project
+@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.
@@ -14,12 +15,94 @@
 limitations under the License.
 -->
 
+<link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
+<link rel="import" href="../../../bower_components/iron-input/iron-input.html">
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
-<link rel="import" href="../../shared/gr-placeholder/gr-placeholder.html">
+<link rel="import" href="../../../styles/gr-form-styles.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../../shared/gr-button/gr-button.html">
+<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
 
 <dom-module id="gr-cla-view">
   <template>
-    <gr-placeholder title="Agreements" path="[[path]]"></gr-placeholder>
+    <style include="shared-styles">
+      h1 {
+        margin-bottom: .6em;
+      }
+      h3 {
+        margin-bottom: .5em;
+      }
+      .agreementsUrl {
+        border: 0.1em solid #b0bdcc;
+        margin-bottom: 1.25em;
+        margin-left: 1.25em;
+        margin-right: 1.25em;
+        padding: 0.3em;
+      }
+      #claNewAgreementsLabel {
+        font-weight: var(--font-weight-bold);
+      }
+      #claNewAgreement {
+        display: none;
+      }
+      #claNewAgreement.show {
+        display: block;
+      }
+      .contributorAgreementButton {
+        font-weight: var(--font-weight-bold);
+      }
+      .alreadySubmittedText {
+        color: var(--error-text-color);
+        margin: 0 2em;
+        padding: .5em;
+      }
+      .alreadySubmittedText.hide,
+      .hideAgreementsTextBox {
+        display: none;
+      }
+      main {
+        margin: 2em auto;
+        max-width: 50em;
+      }
+    </style>
+    <style include="gr-form-styles"></style>
+    <main>
+      <h1>New Contributor Agreement</h1>
+      <h3>Select an agreement type:</h3>
+      <template is="dom-repeat" items="[[_serverConfig.auth.contributor_agreements]]">
+        <span class="contributorAgreementButton">
+          <input id$="claNewAgreementsInput[[item.name]]"
+              name="claNewAgreementsRadio"
+              type="radio"
+              data-name$="[[item.name]]"
+              data-url$="[[item.url]]"
+              on-tap="_handleShowAgreement"
+              disabled$="[[_disableAggreements(item, _groups, _signedAgreements)]]">
+          <label id="claNewAgreementsLabel">[[item.name]]</label>
+        </span>
+        <div class$="alreadySubmittedText [[_hideAggreements(item, _groups, _signedAgreements)]]">
+          Agreement already submitted.
+        </div>
+        <div class="agreementsUrl">
+          [[item.description]]
+        </div>
+      </template>
+      <div id="claNewAgreement" class$="[[_computeShowAgreementsClass(_showAgreements)]]">
+        <h3 class="smallHeading">Review the agreement:</h3>
+        <div id="agreementsUrl" class="agreementsUrl">
+          <a href$="[[_agreementsUrl]]" target="blank" rel="noopener">
+            Please review the agreement.</a>
+        </div>
+        <div class$="agreementsTextBox [[_computeHideAgreementClass(_agreementName, _serverConfig.auth.contributor_agreements)]]">
+          <h3 class="smallHeading">Complete the agreement:</h3>
+          <input id="input-agreements" is="iron-input" bind-value="{{_agreementsText}}" placeholder="Enter 'I agree' here" />
+          <gr-button on-tap="_handleSaveAgreements" disabled="[[_disableAgreementsText(_agreementsText)]]">
+            Submit
+          </gr-button>
+        </div>
+      </div>
+    </main>
+    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
   </template>
   <script src="gr-cla-view.js"></script>
 </dom-module>
diff --git a/polygerrit-ui/app/elements/settings/gr-cla-view/gr-cla-view.js b/polygerrit-ui/app/elements/settings/gr-cla-view/gr-cla-view.js
index 71dc71b..c771332 100644
--- a/polygerrit-ui/app/elements/settings/gr-cla-view/gr-cla-view.js
+++ b/polygerrit-ui/app/elements/settings/gr-cla-view/gr-cla-view.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @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';
 
@@ -18,7 +21,126 @@
     is: 'gr-cla-view',
 
     properties: {
-      path: String,
+      _groups: Object,
+      /** @type {?} */
+      _serverConfig: Object,
+      _agreementsText: String,
+      _agreementName: String,
+      _signedAgreements: Array,
+      _showAgreements: {
+        type: Boolean,
+        value: false,
+      },
+      _agreementsUrl: String,
+    },
+
+    behaviors: [
+      Gerrit.BaseUrlBehavior,
+    ],
+
+    attached() {
+      this.loadData();
+
+      this.fire('title-change', {title: 'New Contributor Agreement'});
+    },
+
+    loadData() {
+      const promises = [];
+      promises.push(this.$.restAPI.getConfig(true).then(config => {
+        this._serverConfig = config;
+      }));
+
+      promises.push(this.$.restAPI.getAccountGroups().then(groups => {
+        this._groups = groups.sort((a, b) => {
+          return a.name.localeCompare(b.name);
+        });
+      }));
+
+      promises.push(this.$.restAPI.getAccountAgreements().then(agreements => {
+        this._signedAgreements = agreements || [];
+      }));
+
+      return Promise.all(promises);
+    },
+
+    _getAgreementsUrl(configUrl) {
+      let url;
+      if (!configUrl) { return ''; }
+      if (configUrl.startsWith('http:') || configUrl.startsWith('https:')) {
+        url = configUrl;
+      } else {
+        url = this.getBaseUrl() + '/' + configUrl;
+      }
+
+      return url;
+    },
+
+    _handleShowAgreement(e) {
+      this._agreementName = e.target.getAttribute('data-name');
+      this._agreementsUrl =
+          this._getAgreementsUrl(e.target.getAttribute('data-url'));
+      this._showAgreements = true;
+    },
+
+    _handleSaveAgreements(e) {
+      this._createToast('Agreement saving...');
+
+      const name = this._agreementName;
+      return this.$.restAPI.saveAccountAgreement({name}).then(res => {
+        let message = 'Agreement failed to be submitted, please try again';
+        if (res.status === 200) {
+          message = 'Agreement has been successfully submited.';
+        }
+        this._createToast(message);
+        this.loadData();
+        this._agreementsText = '';
+        this._showAgreements = false;
+      });
+    },
+
+    _createToast(message) {
+      this.dispatchEvent(new CustomEvent('show-alert',
+          {detail: {message}, bubbles: true}));
+    },
+
+    _computeShowAgreementsClass(agreements) {
+      return agreements ? 'show' : '';
+    },
+
+    _disableAggreements(item, groups, signedAgreements) {
+      for (const group of groups) {
+        if ((item && item.auto_verify_group &&
+            item.auto_verify_group.id === group.id) ||
+            signedAgreements.find(i => i.name === item.name)) {
+          return true;
+        }
+      }
+      return false;
+    },
+
+    _hideAggreements(item, groups, signedAgreements) {
+      return this._disableAggreements(item, groups, signedAgreements) ?
+          '' : 'hide';
+    },
+
+    _disableAgreementsText(text) {
+      return text.toLowerCase() === 'i agree' ? false : true;
+    },
+
+    // This checks for auto_verify_group,
+    // if specified it returns 'hideAgreementsTextBox' which
+    // then hides the text box and submit button.
+    _computeHideAgreementClass(name, config) {
+      for (const key in config) {
+        if (!config.hasOwnProperty(key)) { continue; }
+        for (const prop in config[key]) {
+          if (!config[key].hasOwnProperty(prop)) { continue; }
+          if (name === config[key].name &&
+              !config[key].auto_verify_group) {
+            return 'hideAgreementsTextBox';
+          }
+        }
+      }
     },
   });
 })();
diff --git a/polygerrit-ui/app/elements/settings/gr-cla-view/gr-cla-view_test.html b/polygerrit-ui/app/elements/settings/gr-cla-view/gr-cla-view_test.html
new file mode 100644
index 0000000..2304d15
--- /dev/null
+++ b/polygerrit-ui/app/elements/settings/gr-cla-view/gr-cla-view_test.html
@@ -0,0 +1,189 @@
+<!DOCTYPE html>
+<!--
+@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.
+-->
+
+<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+<title>gr-cla-view</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-cla-view.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-cla-view></gr-cla-view>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-cla-view tests', () => {
+    let element;
+    const signedAgreements = [{
+      name: 'CLA',
+      description: 'Contributor License Agreement',
+      url: 'static/cla.html',
+    }];
+    const auth = {
+      name: 'Individual',
+      description: 'test-description',
+      url: 'static/cla_individual.html',
+      auto_verify_group: {
+        url: '#/admin/groups/uuid-e9aaddc47f305be7661ad4db9b66f9b707bd19a0',
+        options: {
+          visible_to_all: true,
+        },
+        group_id: 20,
+        owner: 'CLA Accepted - Individual',
+        owner_id: 'e9aaddc47f305be7661ad4db9b66f9b707bd19a0',
+        created_on: '2017-07-31 15:11:04.000000000',
+        id: 'e9aaddc47f305be7661ad4db9b66f9b707bd19a0',
+        name: 'CLA Accepted - Individual',
+      },
+    };
+
+    const auth2 = {
+      name: 'Individual2',
+      description: 'test-description2',
+      url: 'static/cla_individual2.html',
+      auto_verify_group: {
+        url: '#/admin/groups/uuid-bc53f2738ef8ad0b3a4f53846ff59b05822caecb',
+        options: {},
+        group_id: 21,
+        owner: 'CLA Accepted - Individual2',
+        owner_id: 'bc53f2738ef8ad0b3a4f53846ff59b05822caecb',
+        created_on: '2017-07-31 15:25:42.000000000',
+        id: 'bc53f2738ef8ad0b3a4f53846ff59b05822caecb',
+        name: 'CLA Accepted - Individual2',
+      },
+    };
+
+    const auth3 = {
+      name: 'CLA',
+      description: 'Contributor License Agreement',
+      url: 'static/cla_individual.html',
+    };
+
+    const config = {
+      auth: {
+        use_contributor_agreements: true,
+        contributor_agreements: [
+          {
+            name: 'Individual',
+            description: 'test-description',
+            url: 'static/cla_individual.html',
+          },
+          {
+            name: 'CLA',
+            description: 'Contributor License Agreement',
+            url: 'static/cla.html',
+          }],
+      },
+    };
+    const config2 = {
+      auth: {
+        use_contributor_agreements: true,
+        contributor_agreements: [
+          {
+            name: 'Individual2',
+            description: 'test-description2',
+            url: 'static/cla_individual2.html',
+          },
+        ],
+      },
+    };
+    const groups = [{
+      options: {visible_to_all: true},
+      id: 'e9aaddc47f305be7661ad4db9b66f9b707bd19a0',
+      group_id: 3,
+      name: 'CLA Accepted - Individual',
+    },
+    ];
+
+    setup(done => {
+      stub('gr-rest-api-interface', {
+        getConfig() { return Promise.resolve(config); },
+        getAccountGroups() { return Promise.resolve(groups); },
+        getAccountAgreements() { return Promise.resolve(signedAgreements); },
+      });
+      element = fixture('basic');
+      element.loadData().then(() => { flush(done); });
+    });
+
+    test('renders as expected with signed agreement', () => {
+      const agreementSections = Polymer.dom(element.root)
+          .querySelectorAll('.contributorAgreementButton');
+      const agreementSubmittedTexts = Polymer.dom(element.root)
+          .querySelectorAll('.alreadySubmittedText');
+      assert.equal(agreementSections.length, 2);
+      assert.isFalse(agreementSections[0].querySelector('input').disabled);
+      assert.equal(getComputedStyle(agreementSubmittedTexts[0]).display,
+          'none');
+      assert.isTrue(agreementSections[1].querySelector('input').disabled);
+      assert.notEqual(getComputedStyle(agreementSubmittedTexts[1]).display,
+          'none');
+    });
+
+    test('_disableAggreements', () => {
+      // In the auto verify group and have not yet signed agreement
+      assert.isTrue(
+          element._disableAggreements(auth, groups, signedAgreements));
+      // Not in the auto verify group and have not yet signed agreement
+      assert.isFalse(
+          element._disableAggreements(auth2, groups, signedAgreements));
+      // Not in the auto verify group, have signed agreement
+      assert.isTrue(
+          element._disableAggreements(auth3, groups, signedAgreements));
+    });
+
+    test('_hideAggreements', () => {
+      // Not in the auto verify group and have not yet signed agreement
+      assert.equal(
+          element._hideAggreements(auth, groups, signedAgreements), '');
+      // In the auto verify group
+      assert.equal(
+          element._hideAggreements(auth2, groups, signedAgreements), 'hide');
+      // Not in the auto verify group, have signed agreement
+      assert.equal(
+          element._hideAggreements(auth3, groups, signedAgreements), '');
+    });
+
+    test('_disableAgreementsText', () => {
+      assert.isFalse(element._disableAgreementsText('I AGREE'));
+      assert.isTrue(element._disableAgreementsText('I DO NOT AGREE'));
+    });
+
+    test('_computeHideAgreementClass', () => {
+      assert.equal(
+          element._computeHideAgreementClass(
+              auth.name, config.auth.contributor_agreements),
+          'hideAgreementsTextBox');
+      assert.isUndefined(
+          element._computeHideAgreementClass(
+              auth.name, config2.auth.contributor_agreements));
+    });
+
+    test('_getAgreementsUrl', () => {
+      assert.equal(element._getAgreementsUrl(
+          'http://test.org/test.html'), 'http://test.org/test.html');
+      assert.equal(element._getAgreementsUrl(
+          'test_cla.html'), '/test_cla.html');
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/settings/gr-edit-preferences/gr-edit-preferences.html b/polygerrit-ui/app/elements/settings/gr-edit-preferences/gr-edit-preferences.html
new file mode 100644
index 0000000..b3e6990
--- /dev/null
+++ b/polygerrit-ui/app/elements/settings/gr-edit-preferences/gr-edit-preferences.html
@@ -0,0 +1,132 @@
+<!--
+@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="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../../styles/gr-form-styles.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
+<link rel="import" href="../../shared/gr-select/gr-select.html">
+
+<dom-module id="gr-edit-preferences">
+  <template>
+    <style include="shared-styles"></style>
+    <style include="gr-form-styles"></style>
+    <div id="editPreferences" class="gr-form-styles">
+      <section>
+        <span class="title">Tab width</span>
+        <span class="value">
+          <input
+              is="iron-input"
+              type="number"
+              prevent-invalid-input
+              allowed-pattern="[0-9]"
+              bind-value="{{editPrefs.tab_size}}"
+              on-keypress="_handleEditPrefsChanged"
+              on-change="_handleEditPrefsChanged">
+        </span>
+      </section>
+      <section>
+        <span class="title">Columns</span>
+        <span class="value">
+          <input
+              is="iron-input"
+              type="number"
+              prevent-invalid-input
+              allowed-pattern="[0-9]"
+              bind-value="{{editPrefs.line_length}}"
+              on-keypress="_handleEditPrefsChanged"
+              on-change="_handleEditPrefsChanged">
+        </span>
+      </section>
+      <section>
+        <span class="title">Indent unit</span>
+        <span class="value">
+          <input
+              is="iron-input"
+              type="number"
+              prevent-invalid-input
+              allowed-pattern="[0-9]"
+              bind-value="{{editPrefs.indent_unit}}"
+              on-keypress="_handleEditPrefsChanged"
+              on-change="_handleEditPrefsChanged">
+        </span>
+      </section>
+      <section>
+        <span class="title">Syntax highlighting</span>
+        <span class="value">
+          <input
+              id="editSyntaxHighlighting"
+              type="checkbox"
+              checked$="[[editPrefs.syntax_highlighting]]"
+              on-change="_handleEditSyntaxHighlightingChanged">
+        </span>
+      </section>
+      <section>
+        <span class="title">Show tabs</span>
+        <span class="value">
+          <input
+              id="editShowTabs"
+              type="checkbox"
+              checked$="[[editPrefs.show_tabs]]"
+              on-change="_handleEditShowTabsChanged">
+        </span>
+      </section>
+      <section>
+        <span class="title">Match brackets</span>
+        <span class="value">
+          <input
+              id="showMatchBrackets"
+              type="checkbox"
+              checked$="[[editPrefs.match_brackets]]"
+              on-change="_handleMatchBracketsChanged">
+        </span>
+      </section>
+      <section>
+        <span class="title">Line wrapping</span>
+        <span class="value">
+          <input
+              id="editShowLineWrapping"
+              type="checkbox"
+              checked$="[[editPrefs.line_wrapping]]"
+              on-change="_handleEditLineWrappingChanged">
+        </span>
+      </section>
+      <section>
+        <span class="title">Indent with tabs</span>
+        <span class="value">
+          <input
+              id="showIndentWithTabs"
+              type="checkbox"
+              checked$="[[editPrefs.indent_with_tabs]]"
+              on-change="_handleIndentWithTabsChanged">
+        </span>
+      </section>
+      <section>
+        <span class="title">Auto close brackets</span>
+        <span class="value">
+          <input
+              id="showAutoCloseBrackets"
+              type="checkbox"
+              checked$="[[editPrefs.auto_close_brackets]]"
+              on-change="_handleAutoCloseBracketsChanged">
+        </span>
+      </section>
+    </div>
+    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
+  </template>
+  <script src="gr-edit-preferences.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/settings/gr-edit-preferences/gr-edit-preferences.js b/polygerrit-ui/app/elements/settings/gr-edit-preferences/gr-edit-preferences.js
new file mode 100644
index 0000000..86350f9
--- /dev/null
+++ b/polygerrit-ui/app/elements/settings/gr-edit-preferences/gr-edit-preferences.js
@@ -0,0 +1,82 @@
+/**
+ * @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-edit-preferences',
+
+    properties: {
+      hasUnsavedChanges: {
+        type: Boolean,
+        notify: true,
+        value: false,
+      },
+
+      /** @type {?} */
+      editPrefs: Object,
+    },
+
+    loadData() {
+      return this.$.restAPI.getEditPreferences().then(prefs => {
+        this.editPrefs = prefs;
+      });
+    },
+
+    _handleEditPrefsChanged() {
+      this.hasUnsavedChanges = true;
+    },
+
+    _handleEditSyntaxHighlightingChanged() {
+      this.set('editPrefs.syntax_highlighting',
+          this.$.editSyntaxHighlighting.checked);
+      this._handleEditPrefsChanged();
+    },
+
+    _handleEditShowTabsChanged() {
+      this.set('editPrefs.show_tabs', this.$.editShowTabs.checked);
+      this._handleEditPrefsChanged();
+    },
+
+    _handleMatchBracketsChanged() {
+      this.set('editPrefs.match_brackets', this.$.showMatchBrackets.checked);
+      this._handleEditPrefsChanged();
+    },
+
+    _handleEditLineWrappingChanged() {
+      this.set('editPrefs.line_wrapping', this.$.editShowLineWrapping.checked);
+      this._handleEditPrefsChanged();
+    },
+
+    _handleIndentWithTabsChanged() {
+      this.set('editPrefs.indent_with_tabs', this.$.showIndentWithTabs.checked);
+      this._handleEditPrefsChanged();
+    },
+
+    _handleAutoCloseBracketsChanged() {
+      this.set('editPrefs.auto_close_brackets',
+          this.$.showAutoCloseBrackets.checked);
+      this._handleEditPrefsChanged();
+    },
+
+    save() {
+      return this.$.restAPI.saveEditPreferences(this.editPrefs).then(res => {
+        this.hasUnsavedChanges = false;
+      });
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/settings/gr-edit-preferences/gr-edit-preferences_test.html b/polygerrit-ui/app/elements/settings/gr-edit-preferences/gr-edit-preferences_test.html
new file mode 100644
index 0000000..42171b7
--- /dev/null
+++ b/polygerrit-ui/app/elements/settings/gr-edit-preferences/gr-edit-preferences_test.html
@@ -0,0 +1,125 @@
+<!DOCTYPE html>
+<!--
+@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.
+-->
+
+<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+<title>gr-edit-preferences</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-edit-preferences.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-edit-preferences></gr-edit-preferences>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-edit-preferences tests', () => {
+    let element;
+    let sandbox;
+    let editPreferences;
+
+    function valueOf(title, fieldsetid) {
+      const sections = element.$[fieldsetid].querySelectorAll('section');
+      let titleEl;
+      for (let i = 0; i < sections.length; i++) {
+        titleEl = sections[i].querySelector('.title');
+        if (titleEl.textContent.trim() === title) {
+          return sections[i].querySelector('.value');
+        }
+      }
+    }
+
+    setup(() => {
+      editPreferences = {
+        auto_close_brackets: false,
+        cursor_blink_rate: 0,
+        hide_line_numbers: false,
+        hide_top_menu: false,
+        indent_unit: 2,
+        indent_with_tabs: false,
+        key_map_type: 'DEFAULT',
+        line_length: 100,
+        line_wrapping: false,
+        match_brackets: true,
+        show_base: false,
+        show_tabs: true,
+        show_whitespace_errors: true,
+        syntax_highlighting: true,
+        tab_size: 8,
+        theme: 'DEFAULT',
+      };
+
+      stub('gr-rest-api-interface', {
+        getEditPreferences() {
+          return Promise.resolve(editPreferences);
+        },
+      });
+
+      element = fixture('basic');
+      sandbox = sinon.sandbox.create();
+      return element.loadData();
+    });
+
+    teardown(() => { sandbox.restore(); });
+
+    test('renders', () => {
+      // Rendered with the expected preferences selected.
+      assert.equal(valueOf('Tab width', 'editPreferences')
+          .firstElementChild.bindValue, editPreferences.tab_size);
+      assert.equal(valueOf('Columns', 'editPreferences')
+          .firstElementChild.bindValue, editPreferences.line_length);
+      assert.equal(valueOf('Indent unit', 'editPreferences')
+          .firstElementChild.bindValue, editPreferences.indent_unit);
+      assert.equal(valueOf('Syntax highlighting', 'editPreferences')
+          .firstElementChild.checked, editPreferences.syntax_highlighting);
+      assert.equal(valueOf('Show tabs', 'editPreferences')
+          .firstElementChild.checked, editPreferences.show_tabs);
+      assert.equal(valueOf('Match brackets', 'editPreferences')
+          .firstElementChild.checked, editPreferences.match_brackets);
+      assert.equal(valueOf('Line wrapping', 'editPreferences')
+          .firstElementChild.checked, editPreferences.line_wrapping);
+      assert.equal(valueOf('Indent with tabs', 'editPreferences')
+          .firstElementChild.checked, editPreferences.indent_with_tabs);
+      assert.equal(valueOf('Auto close brackets', 'editPreferences')
+          .firstElementChild.checked, editPreferences.auto_close_brackets);
+
+      assert.isFalse(element.hasUnsavedChanges);
+    });
+
+    test('save changes', () => {
+      sandbox.stub(element.$.restAPI, 'saveEditPreferences')
+          .returns(Promise.resolve());
+      const showTabsCheckbox = valueOf('Show tabs', 'editPreferences')
+          .firstElementChild;
+      showTabsCheckbox.checked = false;
+      element._handleEditShowTabsChanged();
+
+      assert.isTrue(element.hasUnsavedChanges);
+
+      // Save the change.
+      return element.save().then(() => {
+        assert.isFalse(element.hasUnsavedChanges);
+      });
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/settings/gr-email-editor/gr-email-editor.html b/polygerrit-ui/app/elements/settings/gr-email-editor/gr-email-editor.html
index 99a0392..0a7433e 100644
--- a/polygerrit-ui/app/elements/settings/gr-email-editor/gr-email-editor.html
+++ b/polygerrit-ui/app/elements/settings/gr-email-editor/gr-email-editor.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,7 +26,7 @@
     <style include="shared-styles"></style>
     <style include="gr-form-styles">
       th {
-        color: #666;
+        color: var(--deemphasized-text-color);
         text-align: left;
       }
       #emailTable .emailColumn {
@@ -45,7 +46,7 @@
         height: auto;
       }
       .preferredControl:hover {
-        outline: 1px solid #d1d2d3;
+        outline: 1px solid var(--border-color);
       }
     </style>
     <div class="gr-form-styles">
diff --git a/polygerrit-ui/app/elements/settings/gr-email-editor/gr-email-editor.js b/polygerrit-ui/app/elements/settings/gr-email-editor/gr-email-editor.js
index 2d3f1c3..d08cc90 100644
--- a/polygerrit-ui/app/elements/settings/gr-email-editor/gr-email-editor.js
+++ b/polygerrit-ui/app/elements/settings/gr-email-editor/gr-email-editor.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
diff --git a/polygerrit-ui/app/elements/settings/gr-email-editor/gr-email-editor_test.html b/polygerrit-ui/app/elements/settings/gr-email-editor/gr-email-editor_test.html
index fdbafdb..e937f8b 100644
--- a/polygerrit-ui/app/elements/settings/gr-email-editor/gr-email-editor_test.html
+++ b/polygerrit-ui/app/elements/settings/gr-email-editor/gr-email-editor_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/settings/gr-gpg-editor/gr-gpg-editor.html b/polygerrit-ui/app/elements/settings/gr-gpg-editor/gr-gpg-editor.html
new file mode 100644
index 0000000..7a63605
--- /dev/null
+++ b/polygerrit-ui/app/elements/settings/gr-gpg-editor/gr-gpg-editor.html
@@ -0,0 +1,138 @@
+<!--
+@license
+Copyright (C) 2017 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="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../../bower_components/iron-autogrow-textarea/iron-autogrow-textarea.html">
+<link rel="import" href="../../../styles/gr-form-styles.html">
+<link rel="import" href="../../shared/gr-button/gr-button.html">
+<link rel="import" href="../../shared/gr-overlay/gr-overlay.html">
+<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+
+<dom-module id="gr-gpg-editor">
+  <template>
+    <style include="shared-styles"></style>
+    <style include="gr-form-styles">
+      .statusHeader {
+        width: 4em;
+      }
+      .keyHeader {
+        width: 9em;
+      }
+      .userIdHeader {
+        width: 15em;
+      }
+      #viewKeyOverlay {
+        padding: 2em;
+        width: 50em;
+      }
+      .publicKey {
+        font-family: var(--monospace-font-family);
+        overflow-x: scroll;
+        overflow-wrap: break-word;
+        width: 30em;
+      }
+      .closeButton {
+        bottom: 2em;
+        position: absolute;
+        right: 2em;
+      }
+      #existing {
+        margin-bottom: 1em;
+      }
+      #existing .commentColumn {
+        min-width: 27em;
+        width: auto;
+      }
+    </style>
+    <div class="gr-form-styles">
+      <fieldset id="existing">
+        <table>
+          <thead>
+            <tr>
+              <th class="idColumn">ID</th>
+              <th class="fingerPrintColumn">Fingerprint</th>
+              <th class="userIdHeader">User IDs</th>
+              <th class="keyHeader">Public Key</th>
+              <th></th>
+            </tr>
+          </thead>
+          <tbody>
+            <template is="dom-repeat" items="[[_keys]]" as="key">
+              <tr>
+                <td class="idColumn">[[key.id]]</td>
+                <td class="fingerPrintColumn">[[key.fingerprint]]</td>
+                <td class="userIdHeader">
+                  <template is="dom-repeat" items="[[key.user_ids]]">
+                    [[item]]
+                  </template>
+                </td>
+                <td class="keyHeader">
+                  <gr-button
+                      on-tap="_showKey"
+                      data-index$="[[index]]"
+                      link>Click to View</gr-button>
+                </td>
+                <td>
+                  <gr-button
+                      data-index$="[[index]]"
+                      on-tap="_handleDeleteKey">Delete</gr-button>
+                </td>
+              </tr>
+            </template>
+          </tbody>
+        </table>
+        <gr-overlay id="viewKeyOverlay" with-backdrop>
+          <fieldset>
+            <section>
+              <span class="title">Status</span>
+              <span class="value">[[_keyToView.status]]</span>
+            </section>
+            <section>
+              <span class="title">Key</span>
+              <span class="value">[[_keyToView.key]]</span>
+            </section>
+          </fieldset>
+          <gr-button
+              class="closeButton"
+              on-tap="_closeOverlay">Close</gr-button>
+        </gr-overlay>
+        <gr-button
+            on-tap="save"
+            disabled$="[[!hasUnsavedChanges]]">Save changes</gr-button>
+      </fieldset>
+      <fieldset>
+        <section>
+          <span class="title">New GPG key</span>
+          <span class="value">
+            <iron-autogrow-textarea
+                id="newKey"
+                autocomplete="on"
+                bind-value="{{_newKey}}"
+                placeholder="New GPG Key"></iron-autogrow-textarea>
+          </span>
+        </section>
+        <gr-button
+            id="addButton"
+            disabled$="[[_computeAddButtonDisabled(_newKey)]]"
+            on-tap="_handleAddKey">Add new GPG key</gr-button>
+      </fieldset>
+    </div>
+    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
+  </template>
+  <script src="gr-gpg-editor.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/settings/gr-gpg-editor/gr-gpg-editor.js b/polygerrit-ui/app/elements/settings/gr-gpg-editor/gr-gpg-editor.js
new file mode 100644
index 0000000..78025d1
--- /dev/null
+++ b/polygerrit-ui/app/elements/settings/gr-gpg-editor/gr-gpg-editor.js
@@ -0,0 +1,105 @@
+/**
+ * @license
+ * Copyright (C) 2017 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-gpg-editor',
+
+    properties: {
+      hasUnsavedChanges: {
+        type: Boolean,
+        value: false,
+        notify: true,
+      },
+      _keys: Array,
+      /** @type {?} */
+      _keyToView: Object,
+      _newKey: {
+        type: String,
+        value: '',
+      },
+      _keysToRemove: {
+        type: Array,
+        value() { return []; },
+      },
+    },
+
+    loadData() {
+      this._keys = [];
+      return this.$.restAPI.getAccountGPGKeys().then(keys => {
+        if (!keys) {
+          return;
+        }
+        this._keys = Object.keys(keys)
+         .map(key => {
+           const gpgKey = keys[key];
+           gpgKey.id = key;
+           return gpgKey;
+         });
+      });
+    },
+
+    save() {
+      const promises = this._keysToRemove.map(key => {
+        this.$.restAPI.deleteAccountGPGKey(key.id);
+      });
+
+      return Promise.all(promises).then(() => {
+        this._keysToRemove = [];
+        this.hasUnsavedChanges = false;
+      });
+    },
+
+    _showKey(e) {
+      const el = Polymer.dom(e).localTarget;
+      const index = parseInt(el.getAttribute('data-index'), 10);
+      this._keyToView = this._keys[index];
+      this.$.viewKeyOverlay.open();
+    },
+
+    _closeOverlay() {
+      this.$.viewKeyOverlay.close();
+    },
+
+    _handleDeleteKey(e) {
+      const el = Polymer.dom(e).localTarget;
+      const index = parseInt(el.getAttribute('data-index'), 10);
+      this.push('_keysToRemove', this._keys[index]);
+      this.splice('_keys', index, 1);
+      this.hasUnsavedChanges = true;
+    },
+
+    _handleAddKey() {
+      this.$.addButton.disabled = true;
+      this.$.newKey.disabled = true;
+      return this.$.restAPI.addAccountGPGKey({add: [this._newKey.trim()]})
+          .then(key => {
+            this.$.newKey.disabled = false;
+            this._newKey = '';
+            this.loadData();
+          }).catch(() => {
+            this.$.addButton.disabled = false;
+            this.$.newKey.disabled = false;
+          });
+    },
+
+    _computeAddButtonDisabled(newKey) {
+      return !newKey.length;
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/settings/gr-gpg-editor/gr-gpg-editor_test.html b/polygerrit-ui/app/elements/settings/gr-gpg-editor/gr-gpg-editor_test.html
new file mode 100644
index 0000000..13b3152
--- /dev/null
+++ b/polygerrit-ui/app/elements/settings/gr-gpg-editor/gr-gpg-editor_test.html
@@ -0,0 +1,193 @@
+<!DOCTYPE html>
+<!--
+@license
+Copyright (C) 2017 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-gpg-editor</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-gpg-editor.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-gpg-editor></gr-gpg-editor>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-gpg-editor tests', () => {
+    let element;
+    let keys;
+
+    setup(done => {
+      const fingerprint1 = '0192 723D 42D1 0C5B 32A6  E1E0 9350 9E4B AFC8 A49B';
+      const fingerprint2 = '0196 723D 42D1 0C5B 32A6  E1E0 9350 9E4B AFC8 A49B';
+      keys = {
+        AFC8A49B: {
+          fingerprint: fingerprint1,
+          user_ids: [
+            'John Doe john.doe@example.com',
+          ],
+          key: '-----BEGIN PGP PUBLIC KEY BLOCK-----' +
+               '\nVersion: BCPG v1.52\n\t<key 1>',
+          status: 'TRUSTED',
+          problems: [],
+        },
+        AED9B59C: {
+          fingerprint: fingerprint2,
+          user_ids: [
+            'Gerrit gerrit@example.com',
+          ],
+          key: '-----BEGIN PGP PUBLIC KEY BLOCK-----' +
+               '\nVersion: BCPG v1.52\n\t<key 2>',
+          status: 'TRUSTED',
+          problems: [],
+        },
+      };
+
+      stub('gr-rest-api-interface', {
+        getAccountGPGKeys() { return Promise.resolve(keys); },
+      });
+
+      element = fixture('basic');
+
+      element.loadData().then(() => { flush(done); });
+    });
+
+    test('renders', () => {
+      const rows = Polymer.dom(element.root).querySelectorAll('tbody tr');
+
+      assert.equal(rows.length, 2);
+
+      let cells = rows[0].querySelectorAll('td');
+      assert.equal(cells[0].textContent, 'AFC8A49B');
+
+      cells = rows[1].querySelectorAll('td');
+      assert.equal(cells[0].textContent, 'AED9B59C');
+    });
+
+    test('remove key', done => {
+      const lastKey = keys[Object.keys(keys)[1]];
+
+      const saveStub = sinon.stub(element.$.restAPI, 'deleteAccountGPGKey',
+          () => { return Promise.resolve(); });
+
+      assert.equal(element._keysToRemove.length, 0);
+      assert.isFalse(element.hasUnsavedChanges);
+
+      // Get the delete button for the last row.
+      const button = Polymer.dom(element.root).querySelector(
+          'tbody tr:last-of-type td:nth-child(5) gr-button');
+
+      MockInteractions.tap(button);
+
+      assert.equal(element._keys.length, 1);
+      assert.equal(element._keysToRemove.length, 1);
+      assert.equal(element._keysToRemove[0], lastKey);
+      assert.isTrue(element.hasUnsavedChanges);
+      assert.isFalse(saveStub.called);
+
+      element.save().then(() => {
+        assert.isTrue(saveStub.called);
+        assert.equal(saveStub.lastCall.args[0], Object.keys(keys)[1]);
+        assert.equal(element._keysToRemove.length, 0);
+        assert.isFalse(element.hasUnsavedChanges);
+        done();
+      });
+    });
+
+    test('show key', () => {
+      const openSpy = sinon.spy(element.$.viewKeyOverlay, 'open');
+
+      // Get the show button for the last row.
+      const button = Polymer.dom(element.root).querySelector(
+          'tbody tr:last-of-type td:nth-child(4) gr-button');
+
+      MockInteractions.tap(button);
+
+      assert.equal(element._keyToView, keys[Object.keys(keys)[1]]);
+      assert.isTrue(openSpy.called);
+    });
+
+    test('add key', done => {
+      const newKeyString =
+          '-----BEGIN PGP PUBLIC KEY BLOCK-----' +
+          '\nVersion: BCPG v1.52\n\t<key 3>';
+      const newKeyObject = {
+        ADE8A59B: {
+          fingerprint: '0194 723D 42D1 0C5B 32A6  E1E0 9350 9E4B AFC8 A49B',
+          user_ids: [
+            'John john@example.com',
+          ],
+          key: newKeyString,
+          status: 'TRUSTED',
+          problems: [],
+        },
+      };
+
+      const addStub = sinon.stub(element.$.restAPI, 'addAccountGPGKey',
+          () => { return Promise.resolve(newKeyObject); });
+
+      element._newKey = newKeyString;
+
+      assert.isFalse(element.$.addButton.disabled);
+      assert.isFalse(element.$.newKey.disabled);
+
+      element._handleAddKey().then(() => {
+        assert.isTrue(element.$.addButton.disabled);
+        assert.isFalse(element.$.newKey.disabled);
+        assert.equal(element._keys.length, 2);
+        done();
+      });
+
+      assert.isTrue(element.$.addButton.disabled);
+      assert.isTrue(element.$.newKey.disabled);
+
+      assert.isTrue(addStub.called);
+      assert.deepEqual(addStub.lastCall.args[0], {add: [newKeyString]});
+    });
+
+    test('add invalid key', done => {
+      const newKeyString = 'not even close to valid';
+
+      const addStub = sinon.stub(element.$.restAPI, 'addAccountGPGKey',
+          () => { return Promise.reject(); });
+
+      element._newKey = newKeyString;
+
+      assert.isFalse(element.$.addButton.disabled);
+      assert.isFalse(element.$.newKey.disabled);
+
+      element._handleAddKey().then(() => {
+        assert.isFalse(element.$.addButton.disabled);
+        assert.isFalse(element.$.newKey.disabled);
+        assert.equal(element._keys.length, 2);
+        done();
+      });
+
+      assert.isTrue(element.$.addButton.disabled);
+      assert.isTrue(element.$.newKey.disabled);
+
+      assert.isTrue(addStub.called);
+      assert.deepEqual(addStub.lastCall.args[0], {add: [newKeyString]});
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/settings/gr-group-list/gr-group-list.html b/polygerrit-ui/app/elements/settings/gr-group-list/gr-group-list.html
index c26ac87..2c7afd3 100644
--- a/polygerrit-ui/app/elements/settings/gr-group-list/gr-group-list.html
+++ b/polygerrit-ui/app/elements/settings/gr-group-list/gr-group-list.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -15,10 +16,9 @@
 -->
 
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
-<link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
-<link rel="import" href="../../../behaviors/gr-url-encoding-behavior.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 <link rel="import" href="../../../styles/gr-form-styles.html">
+<link rel="import" href="../../core/gr-navigation/gr-navigation.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
 
 <dom-module id="gr-group-list">
diff --git a/polygerrit-ui/app/elements/settings/gr-group-list/gr-group-list.js b/polygerrit-ui/app/elements/settings/gr-group-list/gr-group-list.js
index d294a9b..0f43563 100644
--- a/polygerrit-ui/app/elements/settings/gr-group-list/gr-group-list.js
+++ b/polygerrit-ui/app/elements/settings/gr-group-list/gr-group-list.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -21,11 +24,6 @@
       _groups: Array,
     },
 
-    behaviors: [
-      Gerrit.BaseUrlBehavior,
-      Gerrit.URLEncodingBehavior,
-    ],
-
     loadData() {
       return this.$.restAPI.getAccountGroups().then(groups => {
         this._groups = groups.sort((a, b) => {
@@ -41,9 +39,7 @@
     _computeGroupPath(group) {
       if (!group || !group.id) { return; }
 
-      const encodeGroup = this.encodeURL(group.id, true);
-
-      return `${this.getBaseUrl()}/admin/groups/${encodeGroup}`;
+      return Gerrit.Nav.getUrlForGroup(group.id);
     },
   });
 })();
diff --git a/polygerrit-ui/app/elements/settings/gr-group-list/gr-group-list_test.html b/polygerrit-ui/app/elements/settings/gr-group-list/gr-group-list_test.html
index 582ed6c..3fa5a36 100644
--- a/polygerrit-ui/app/elements/settings/gr-group-list/gr-group-list_test.html
+++ b/polygerrit-ui/app/elements/settings/gr-group-list/gr-group-list_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -89,15 +90,20 @@
     });
 
     test('_computeGroupPath', () => {
+      sandbox.stub(Gerrit.Nav, 'getUrlForGroup',
+          () => '/admin/groups/e2cd66f88a2db4d391ac068a92d987effbe872f5');
+
       let group = {
         id: 'e2cd66f88a2db4d391ac068a92d987effbe872f5',
       };
+
       assert.equal(element._computeGroupPath(group),
           '/admin/groups/e2cd66f88a2db4d391ac068a92d987effbe872f5');
 
       group = {
         name: 'admin',
       };
+
       assert.isUndefined(element._computeGroupPath(group));
     });
   });
diff --git a/polygerrit-ui/app/elements/settings/gr-http-password/gr-http-password.html b/polygerrit-ui/app/elements/settings/gr-http-password/gr-http-password.html
index 515fe4f..2fe07ca 100644
--- a/polygerrit-ui/app/elements/settings/gr-http-password/gr-http-password.html
+++ b/polygerrit-ui/app/elements/settings/gr-http-password/gr-http-password.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -78,6 +79,7 @@
           If you lose it, you will need to generate a new one.
         </section>
         <gr-button
+            link
             class="closeButton"
             on-tap="_closeOverlay">Close</gr-button>
       </div>
diff --git a/polygerrit-ui/app/elements/settings/gr-http-password/gr-http-password.js b/polygerrit-ui/app/elements/settings/gr-http-password/gr-http-password.js
index 3dc92d1..b3d1396 100644
--- a/polygerrit-ui/app/elements/settings/gr-http-password/gr-http-password.js
+++ b/polygerrit-ui/app/elements/settings/gr-http-password/gr-http-password.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
diff --git a/polygerrit-ui/app/elements/settings/gr-http-password/gr-http-password_test.html b/polygerrit-ui/app/elements/settings/gr-http-password/gr-http-password_test.html
index bbe1555..ca50b2b 100644
--- a/polygerrit-ui/app/elements/settings/gr-http-password/gr-http-password_test.html
+++ b/polygerrit-ui/app/elements/settings/gr-http-password/gr-http-password_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/settings/gr-identities/gr-identities.html b/polygerrit-ui/app/elements/settings/gr-identities/gr-identities.html
new file mode 100644
index 0000000..872e558
--- /dev/null
+++ b/polygerrit-ui/app/elements/settings/gr-identities/gr-identities.html
@@ -0,0 +1,85 @@
+<!--
+@license
+Copyright (C) 2017 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="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../../../styles/gr-form-styles.html">
+<link rel="import" href="../../admin/gr-confirm-delete-item-dialog/gr-confirm-delete-item-dialog.html">
+<link rel="import" href="../../shared/gr-button/gr-button.html">
+<link rel="import" href="../../shared/gr-overlay/gr-overlay.html">
+<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
+
+<dom-module id="gr-identities">
+  <template>
+    <style include="shared-styles"></style>
+    <style include="gr-form-styles">
+      td {
+        width: 5em;
+      }
+      .deleteButton {
+        float: right;
+      }
+      .deleteButton:not(.show) {
+        display: none;
+      }
+      .statusColumn {
+        white-space: nowrap;
+      }
+    </style>
+    <div class="gr-form-styles">
+      <table id="identities">
+        <thead>
+          <tr>
+            <th class="statusHeader">Status</th>
+            <th class="emailAddressHeader">Email Address</th>
+            <th class="identityHeader">Identity</th>
+            <th class="deleteHeader"></th>
+          </tr>
+        </thead>
+        <tbody>
+          <template is="dom-repeat" items="[[_identities]]" filter="filterIdentities">
+            <tr>
+              <td class$="statusColumn">
+                [[_computeIsTrusted(item.trusted)]]
+              </td>
+              <td>[[item.email_address]]</td>
+              <td>[[_computeIdentity(item.identity)]]</td>
+              <td>
+                <gr-button
+                    link
+                    class$="deleteButton [[_computeHideDeleteClass(item.can_delete)]]"
+                    on-tap="_handleDeleteItem">
+                  Delete
+                </gr-button>
+              </td>
+            </tr>
+          </template>
+        </tbody>
+      </table>
+    </div>
+    <gr-overlay id="overlay" with-backdrop>
+      <gr-confirm-delete-item-dialog
+          class="confirmDialog"
+          on-confirm="_handleDeleteItemConfirm"
+          on-cancel="_handleConfirmDialogCancel"
+          item="[[_idName]]"
+          item-type="id"></gr-confirm-delete-item-dialog>
+    </gr-overlay>
+    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
+  </template>
+  <script src="gr-identities.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/settings/gr-identities/gr-identities.js b/polygerrit-ui/app/elements/settings/gr-identities/gr-identities.js
new file mode 100644
index 0000000..da6ab28
--- /dev/null
+++ b/polygerrit-ui/app/elements/settings/gr-identities/gr-identities.js
@@ -0,0 +1,67 @@
+/**
+ * @license
+ * Copyright (C) 2017 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-identities',
+
+    properties: {
+      _identities: Object,
+      _idName: String,
+    },
+
+    loadData() {
+      return this.$.restAPI.getExternalIds().then(id => {
+        this._identities = id;
+      });
+    },
+
+    _computeIdentity(id) {
+      return id && id.startsWith('mailto:') ? '' : id;
+    },
+
+    _computeHideDeleteClass(canDelete) {
+      return canDelete ? 'show' : '';
+    },
+
+    _handleDeleteItemConfirm() {
+      this.$.overlay.close();
+      return this.$.restAPI.deleteAccountIdentity([this._idName])
+          .then(() => { this.loadData(); });
+    },
+
+    _handleConfirmDialogCancel() {
+      this.$.overlay.close();
+    },
+
+    _handleDeleteItem(e) {
+      const name = e.model.get('item.identity');
+      if (!name) { return; }
+      this._idName = name;
+      this.$.overlay.open();
+    },
+
+    _computeIsTrusted(item) {
+      return item ? '' : 'Untrusted';
+    },
+
+    filterIdentities(item) {
+      return !item.identity.startsWith('username:');
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/settings/gr-identities/gr-identities_test.html b/polygerrit-ui/app/elements/settings/gr-identities/gr-identities_test.html
new file mode 100644
index 0000000..c77a1b9
--- /dev/null
+++ b/polygerrit-ui/app/elements/settings/gr-identities/gr-identities_test.html
@@ -0,0 +1,126 @@
+<!DOCTYPE html>
+<!--
+@license
+Copyright (C) 2017 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-identities</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-identities.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-identities></gr-identities>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-identities tests', () => {
+    let element;
+    let sandbox;
+    const ids = [
+      {
+        identity: 'username:john',
+        email_address: 'john.doe@example.com',
+        trusted: true,
+      }, {
+        identity: 'gerrit:gerrit',
+        email_address: 'gerrit@example.com',
+      }, {
+        identity: 'mailto:gerrit2@example.com',
+        email_address: 'gerrit2@example.com',
+        trusted: true,
+        can_delete: true,
+      },
+    ];
+
+    setup(done => {
+      sandbox = sinon.sandbox.create();
+
+      stub('gr-rest-api-interface', {
+        getExternalIds() { return Promise.resolve(ids); },
+      });
+
+      element = fixture('basic');
+
+      element.loadData().then(() => { flush(done); });
+    });
+
+    teardown(() => {
+      sandbox.restore();
+    });
+
+    test('renders', () => {
+      const rows = Polymer.dom(element.root).querySelectorAll('tbody tr');
+
+      assert.equal(rows.length, 2);
+
+      const nameCells = rows.map(row =>
+        row.querySelectorAll('td')[2].textContent
+      );
+
+      assert.equal(nameCells[0], 'gerrit:gerrit');
+      assert.equal(nameCells[1], '');
+    });
+
+    test('renders email', () => {
+      const rows = Polymer.dom(element.root).querySelectorAll('tbody tr');
+
+      assert.equal(rows.length, 2);
+
+      const nameCells = rows.map(row =>
+        row.querySelectorAll('td')[1].textContent
+      );
+
+      assert.equal(nameCells[0], 'gerrit@example.com');
+      assert.equal(nameCells[1], 'gerrit2@example.com');
+    });
+
+    test('_computeIdentity', () => {
+      assert.equal(
+          element._computeIdentity(ids[0].identity), 'username:john');
+      assert.equal(element._computeIdentity(ids[2].identity), '');
+    });
+
+    test('filterIdentities', () => {
+      assert.isFalse(element.filterIdentities(ids[0]));
+
+      assert.isTrue(element.filterIdentities(ids[1]));
+    });
+
+    test('delete id', done => {
+      element._idName = 'mailto:gerrit2@example.com';
+      const loadDataStub = sandbox.stub(element, 'loadData');
+      element._handleDeleteItemConfirm().then(() => {
+        assert.isTrue(loadDataStub.called);
+        done();
+      });
+    });
+
+    test('_handleDeleteItem opens modal', () => {
+      const deleteBtn =
+          Polymer.dom(element.root).querySelector('.deleteButton');
+      const deleteItem = sandbox.stub(element, '_handleDeleteItem');
+      MockInteractions.tap(deleteBtn);
+      assert.isTrue(deleteItem.called);
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/settings/gr-menu-editor/gr-menu-editor.html b/polygerrit-ui/app/elements/settings/gr-menu-editor/gr-menu-editor.html
index 6805885..aa42623 100644
--- a/polygerrit-ui/app/elements/settings/gr-menu-editor/gr-menu-editor.html
+++ b/polygerrit-ui/app/elements/settings/gr-menu-editor/gr-menu-editor.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/settings/gr-menu-editor/gr-menu-editor.js b/polygerrit-ui/app/elements/settings/gr-menu-editor/gr-menu-editor.js
index 26a2470..aa83bf7 100644
--- a/polygerrit-ui/app/elements/settings/gr-menu-editor/gr-menu-editor.js
+++ b/polygerrit-ui/app/elements/settings/gr-menu-editor/gr-menu-editor.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
diff --git a/polygerrit-ui/app/elements/settings/gr-menu-editor/gr-menu-editor_test.html b/polygerrit-ui/app/elements/settings/gr-menu-editor/gr-menu-editor_test.html
index c70ae88..c8a54b6 100644
--- a/polygerrit-ui/app/elements/settings/gr-menu-editor/gr-menu-editor_test.html
+++ b/polygerrit-ui/app/elements/settings/gr-menu-editor/gr-menu-editor_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -32,7 +33,7 @@
 </test-fixture>
 
 <script>
-  suite('gr-settings-view tests', () => {
+  suite('gr-menu-editor tests', () => {
     let element;
     let menu;
 
diff --git a/polygerrit-ui/app/elements/settings/gr-registration-dialog/gr-registration-dialog.html b/polygerrit-ui/app/elements/settings/gr-registration-dialog/gr-registration-dialog.html
index 0cbd1f6..5f1794c 100644
--- a/polygerrit-ui/app/elements/settings/gr-registration-dialog/gr-registration-dialog.html
+++ b/polygerrit-ui/app/elements/settings/gr-registration-dialog/gr-registration-dialog.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -31,13 +32,23 @@
       main {
         max-width: 46em;
       }
+      :host(.loading) main {
+        display: none;
+      }
+      .loadingMessage {
+        display: none;
+        font-style: italic;
+      }
+      :host(.loading) .loadingMessage {
+        display: block;
+      }
       hr {
         margin-top: 1em;
         margin-bottom: 1em;
       }
       header {
-        border-bottom: 1px solid #cdcdcd;
-        font-family: var(--font-family-bold);
+        border-bottom: 1px solid var(--border-color);
+        font-weight: var(--font-weight-bold);
         margin-bottom: 1em;
       }
       .container {
@@ -53,9 +64,13 @@
       input {
         width: 20em;
       }
+      section.hide {
+        display: none;
+      }
     </style>
     <div class="container gr-form-styles">
       <header>Please confirm your contact information</header>
+      <div class="loadingMessage">Loading...</div>
       <main>
         <p>
           The following contact information was automatically obtained when you
@@ -72,7 +87,7 @@
               bind-value="{{_account.name}}"
               disabled="[[_saving]]">
         </section>
-        <section>
+        <section class$="[[_computeUsernameClass(_usernameMutable)]]">
           <div class="title">Username</div>
           <input
               is="iron-input"
@@ -94,7 +109,7 @@
         <hr>
         <p>
           More configuration options for Gerrit may be found in the
-          <a on-tap="close" href$="[[_computeSettingsUrl(_account)]]">settings</a>.
+          <a on-tap="close" href$="[[settingsUrl]]">settings</a>.
         </p>
       </main>
       <footer>
@@ -107,7 +122,7 @@
             id="saveButton"
             primary
             link
-            disabled="[[_computeSaveDisabled(_account.name, _account.username, _account.email, _saving)]]"
+            disabled="[[_computeSaveDisabled(_account.name, _account.email, _saving)]]"
             on-tap="_handleSave">Save</gr-button>
       </footer>
     </div>
diff --git a/polygerrit-ui/app/elements/settings/gr-registration-dialog/gr-registration-dialog.js b/polygerrit-ui/app/elements/settings/gr-registration-dialog/gr-registration-dialog.js
index 406d16c..c6cd578 100644
--- a/polygerrit-ui/app/elements/settings/gr-registration-dialog/gr-registration-dialog.js
+++ b/polygerrit-ui/app/elements/settings/gr-registration-dialog/gr-registration-dialog.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -30,6 +33,7 @@
      */
 
     properties: {
+      settingsUrl: String,
       /** @type {?} */
       _account: {
         type: Object,
@@ -39,32 +43,56 @@
           return {email: null, name: null, username: null};
         },
       },
+      _usernameMutable: {
+        type: Boolean,
+        computed: '_computeUsernameMutable(_serverConfig, _account.username)',
+      },
+      _loading: {
+        type: Boolean,
+        value: true,
+        observer: '_loadingChanged',
+      },
       _saving: {
         type: Boolean,
         value: false,
       },
+      _serverConfig: Object,
     },
 
     hostAttributes: {
       role: 'dialog',
     },
 
-    attached() {
-      this.$.restAPI.getAccount().then(account => {
+    loadData() {
+      this._loading = true;
+
+      const loadAccount = this.$.restAPI.getAccount().then(account => {
         // Using Object.assign here allows preservation of the default values
         // supplied in the value generating function of this._account, unless
         // they are overridden by properties in the account from the response.
         this._account = Object.assign({}, this._account, account);
       });
+
+      const loadConfig = this.$.restAPI.getConfig().then(config => {
+        this._serverConfig = config;
+      });
+
+      return Promise.all([loadAccount, loadConfig]).then(() => {
+        this._loading = false;
+      });
     },
 
     _save() {
       this._saving = true;
       const promises = [
         this.$.restAPI.setAccountName(this.$.name.value),
-        this.$.restAPI.setAccountUsername(this.$.username.value),
         this.$.restAPI.setPreferredAccountEmail(this.$.email.value || ''),
       ];
+
+      if (this._usernameMutable) {
+        promises.push(this.$.restAPI.setAccountUsername(this.$.username.value));
+      }
+
       return Promise.all(promises).then(() => {
         this._saving = false;
         this.fire('account-detail-update');
@@ -86,12 +114,21 @@
       this.fire('close');
     },
 
-    _computeSaveDisabled(name, username, email, saving) {
-      return !name || !username || !email || saving;
+    _computeSaveDisabled(name, email, saving) {
+      return !name || !email || saving;
     },
 
-    _computeSettingsUrl() {
-      return Gerrit.Nav.getUrlForSettings();
+    _computeUsernameMutable(config, username) {
+      return config.auth.editable_account_fields.includes('USER_NAME') &&
+          !username;
+    },
+
+    _computeUsernameClass(usernameMutable) {
+      return usernameMutable ? '' : 'hide';
+    },
+
+    _loadingChanged() {
+      this.classList.toggle('loading', this._loading);
     },
   });
 })();
diff --git a/polygerrit-ui/app/elements/settings/gr-registration-dialog/gr-registration-dialog_test.html b/polygerrit-ui/app/elements/settings/gr-registration-dialog/gr-registration-dialog_test.html
index 15b4fa2..93a3188 100644
--- a/polygerrit-ui/app/elements/settings/gr-registration-dialog/gr-registration-dialog_test.html
+++ b/polygerrit-ui/app/elements/settings/gr-registration-dialog/gr-registration-dialog_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -44,13 +45,13 @@
     let sandbox;
     let _listeners;
 
-    setup(done => {
+    setup(() => {
       sandbox = sinon.sandbox.create();
       _listeners = {};
 
       account = {
         name: 'name',
-        username: 'username',
+        username: null,
         email: 'email',
         secondary_emails: [
           'email2',
@@ -60,8 +61,6 @@
 
       stub('gr-rest-api-interface', {
         getAccount() {
-        // Once the account is resolved, we can let the test proceed.
-          flush(done);
           return Promise.resolve(account);
         },
         setAccountName(name) {
@@ -76,9 +75,15 @@
           account.email = email;
           return Promise.resolve();
         },
+        getConfig() {
+          return Promise.resolve(
+              {auth: {editable_account_fields: ['USER_NAME']}});
+        },
       });
 
       element = fixture('basic');
+
+      return element.loadData();
     });
 
     teardown(() => {
@@ -135,7 +140,7 @@
 
         // Nothing should be committed yet.
         assert.equal(account.name, 'name');
-        assert.equal(account.username, 'username');
+        assert.isNotOk(account.username);
         assert.equal(account.email, 'email');
 
         // Save and verify new values are committed.
@@ -157,12 +162,22 @@
 
     test('save btn disabled', () => {
       const compute = element._computeSaveDisabled;
-      assert.isTrue(compute('', '', '', false));
-      assert.isTrue(compute('', 'test', 'test', false));
-      assert.isTrue(compute('test', '', 'test', false));
-      assert.isTrue(compute('test', 'test', '', false));
-      assert.isTrue(compute('test', 'test', 'test', true));
-      assert.isFalse(compute('test', 'test', 'test', false));
+      assert.isTrue(compute('', '', false));
+      assert.isTrue(compute('', 'test', false));
+      assert.isTrue(compute('test', '', false));
+      assert.isTrue(compute('test', 'test', true));
+      assert.isFalse(compute('test', 'test', false));
+    });
+
+    test('_computeUsernameMutable', () => {
+      assert.isTrue(element._computeUsernameMutable(
+          {auth: {editable_account_fields: ['USER_NAME']}}, null));
+      assert.isFalse(element._computeUsernameMutable(
+          {auth: {editable_account_fields: ['USER_NAME']}}, 'abc'));
+      assert.isFalse(element._computeUsernameMutable(
+          {auth: {editable_account_fields: []}}, null));
+      assert.isFalse(element._computeUsernameMutable(
+          {auth: {editable_account_fields: []}}, 'abc'));
     });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-item.html b/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-item.html
new file mode 100644
index 0000000..b61c7e0
--- /dev/null
+++ b/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-item.html
@@ -0,0 +1,32 @@
+<!--
+@license
+Copyright (C) 2017 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="../../../bower_components/polymer/polymer.html">
+
+<dom-module id="gr-settings-item">
+  <style>
+    :host {
+      display: block;
+      margin-bottom: 2em;
+    }
+  </style>
+  <template>
+    <h2 id="[[anchor]]">[[title]]</h2>
+    <slot></slot>
+  </template>
+  <script src="gr-settings-item.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-item.js b/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-item.js
new file mode 100644
index 0000000..0ee1b28
--- /dev/null
+++ b/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-item.js
@@ -0,0 +1,27 @@
+/**
+ * @license
+ * Copyright (C) 2017 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-settings-item',
+    properties: {
+      anchor: String,
+      title: String,
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-menu-item.html b/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-menu-item.html
new file mode 100644
index 0000000..3b47190
--- /dev/null
+++ b/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-menu-item.html
@@ -0,0 +1,30 @@
+<!--
+@license
+Copyright (C) 2017 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="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../../styles/gr-page-nav-styles.html">
+
+<dom-module id="gr-settings-menu-item">
+  <style include="shared-styles"></style>
+  <style include="gr-page-nav-styles"></style>
+  <template>
+    <div class="navStyles">
+      <li><a href$="[[href]]">[[title]]</a></li>
+    </div>
+  </template>
+  <script src="gr-settings-menu-item.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-menu-item.js b/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-menu-item.js
new file mode 100644
index 0000000..38147cd
--- /dev/null
+++ b/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-menu-item.js
@@ -0,0 +1,27 @@
+/**
+ * @license
+ * Copyright (C) 2017 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-settings-menu-item',
+    properties: {
+      href: String,
+      title: String,
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view.html b/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view.html
index 49ba141..412b73e 100644
--- a/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view.html
+++ b/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,21 +18,27 @@
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
 
 <link rel="import" href="../../../behaviors/docs-url-behavior/docs-url-behavior.html">
-<link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../../../bower_components/paper-toggle-button/paper-toggle-button.html">
+<link rel="import" href="../../../styles/gr-form-styles.html">
 <link rel="import" href="../../../styles/gr-menu-page-styles.html">
 <link rel="import" href="../../../styles/gr-page-nav-styles.html">
-<link rel="import" href="../../../styles/gr-form-styles.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../../plugins/gr-endpoint-decorator/gr-endpoint-decorator.html">
 <link rel="import" href="../../settings/gr-change-table-editor/gr-change-table-editor.html">
 <link rel="import" href="../../shared/gr-button/gr-button.html">
 <link rel="import" href="../../shared/gr-date-formatter/gr-date-formatter.html">
+<link rel="import" href="../../shared/gr-diff-preferences/gr-diff-preferences.html">
 <link rel="import" href="../../shared/gr-page-nav/gr-page-nav.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
 <link rel="import" href="../../shared/gr-select/gr-select.html">
 <link rel="import" href="../gr-account-info/gr-account-info.html">
 <link rel="import" href="../gr-agreements-list/gr-agreements-list.html">
+<link rel="import" href="../gr-edit-preferences/gr-edit-preferences.html">
 <link rel="import" href="../gr-email-editor/gr-email-editor.html">
+<link rel="import" href="../gr-gpg-editor/gr-gpg-editor.html">
 <link rel="import" href="../gr-group-list/gr-group-list.html">
 <link rel="import" href="../gr-http-password/gr-http-password.html">
+<link rel="import" href="../gr-identities/gr-identities.html">
 <link rel="import" href="../gr-menu-editor/gr-menu-editor.html">
 <link rel="import" href="../gr-ssh-editor/gr-ssh-editor.html">
 <link rel="import" href="../gr-watched-projects-editor/gr-watched-projects-editor.html">
@@ -39,18 +46,28 @@
 <dom-module id="gr-settings-view">
   <template>
     <style include="shared-styles">
+      :host {
+        color: var(--primary-text-color);
+      }
       #newEmailInput {
         width: 20em;
       }
       #email {
         margin-bottom: 1em;
       }
-      .filters p {
+      .filters p,
+      .darkToggle p {
         margin-bottom: 1em;
       }
       .queryExample em {
         color: violet;
       }
+      .toggle {
+        align-items: center;
+        display: flex;
+        margin-bottom: 1rem;
+        margin-right: 1rem;
+      }
     </style>
     <style include="gr-form-styles"></style>
     <style include="gr-menu-page-styles"></style>
@@ -62,6 +79,7 @@
           <li><a href="#Profile">Profile</a></li>
           <li><a href="#Preferences">Preferences</a></li>
           <li><a href="#DiffPreferences">Diff Preferences</a></li>
+          <li><a href="#EditPreferences">Edit Preferences</a></li>
           <li><a href="#Menu">Menu</a></li>
           <li><a href="#ChangeTableColumns">Change Table Columns</a></li>
           <li><a href="#Notifications">Notifications</a></li>
@@ -70,17 +88,36 @@
           <li hidden$="[[!_serverConfig.sshd]]"><a href="#SSHKeys">
             SSH Keys
           </a></li>
+          <li hidden$="[[!_serverConfig.receive.enable_signed_push]]"><a href="#GPGKeys">
+            GPG Keys
+          </a></li>
           <li><a href="#Groups">Groups</a></li>
+          <li><a href="#Identities">Identities</a></li>
           <template is="dom-if" if="[[_serverConfig.auth.use_contributor_agreements]]">
             <li>
               <a href="#Agreements">Agreements</a>
             </li>
           </template>
           <li><a href="#MailFilters">Mail Filters</a></li>
+          <gr-endpoint-decorator name="settings-menu-item">
+          </gr-endpoint-decorator>
         </ul>
       </gr-page-nav>
       <main class="gr-form-styles">
         <h1>User Settings</h1>
+        <section class="darkToggle">
+          <div class="toggle">
+            <paper-toggle-button
+                checked="[[_isDark]]"
+                on-change="_handleToggleDark"></paper-toggle-button>
+            <div>Dark theme (alpha)</div>
+          </div>
+          <p>
+            Gerrit's dark theme is in early alpha, and almost definitely will
+            not play nicely with themes set by specific Gerrit hosts. Filing
+            feedback via the link in the app footer is strongly encouraged!
+          </p>
+        </section>
         <h2
             id="Profile"
             class$="[[_computeHeaderClass(_accountInfoChanged)]]">Profile</h2>
@@ -158,6 +195,28 @@
               </gr-select>
             </span>
           </section>
+          <section hidden$="[[!_localPrefs.default_base_for_merges]]">
+            <span class="title">Default Base For Merges</span>
+            <span class="value">
+              <gr-select
+                  bind-value="{{_localPrefs.default_base_for_merges}}">
+                <select>
+                  <option value="AUTO_MERGE">Auto Merge</option>
+                  <option value="FIRST_PARENT">First Parent</option>
+                </select>
+              </gr-select>
+            </span>
+          </section>
+          <section>
+            <span class="title">Show Relative Dates In Changes Table</span>
+            <span class="value">
+              <input
+                  id="relativeDateInChangeTable"
+                  type="checkbox"
+                  checked$="[[_localPrefs.relative_date_in_change_table]]"
+                  on-change="_handleRelativeDateInChangeTable">
+            </span>
+          </section>
           <section>
             <span class="title">Diff view</span>
             <span class="value">
@@ -171,13 +230,13 @@
             </span>
           </section>
           <section>
-            <span class="title">Expand inline diffs</span>
+            <span class="title">Show size bars in file list</span>
             <span class="value">
               <input
-                  id="expandInlineDiffs"
+                  id="showSizeBarsInFileList"
                   type="checkbox"
-                  checked$="[[_localPrefs.expand_inline_diffs]]"
-                  on-change="_handleExpandInlineDiffsChanged">
+                  checked$="[[_localPrefs.size_bar_in_change_table]]"
+                  on-change="_handleShowSizeBarsInFileListChanged">
             </span>
           </section>
           <section>
@@ -223,100 +282,28 @@
           Diff Preferences
         </h2>
         <fieldset id="diffPreferences">
-          <section>
-            <span class="title">Context</span>
-            <span class="value">
-              <gr-select bind-value="{{_diffPrefs.context}}">
-                <select>
-                  <option value="3">3 lines</option>
-                  <option value="10">10 lines</option>
-                  <option value="25">25 lines</option>
-                  <option value="50">50 lines</option>
-                  <option value="75">75 lines</option>
-                  <option value="100">100 lines</option>
-                  <option value="-1">Whole file</option>
-                </select>
-              </gr-select>
-            </span>
-          </section>
-          <section>
-            <span class="title">Fit to screen</span>
-            <span class="value">
-              <input
-                  id="lineWrapping"
-                  type="checkbox"
-                  checked$="[[_diffPrefs.line_wrapping]]"
-                  on-change="_handleLineWrappingChanged">
-            </span>
-          </section>
-          <section id="columnsPref" hidden$="[[_diffPrefs.line_wrapping]]">
-            <span class="title">Diff width</span>
-            <span class="value">
-              <input
-                  is="iron-input"
-                  type="number"
-                  prevent-invalid-input
-                  allowed-pattern="[0-9]"
-                  bind-value="{{_diffPrefs.line_length}}">
-            </span>
-          </section>
-          <section>
-            <span class="title">Tab width</span>
-            <span class="value">
-              <input
-                  is="iron-input"
-                  type="number"
-                  prevent-invalid-input
-                  allowed-pattern="[0-9]"
-                  bind-value="{{_diffPrefs.tab_size}}">
-            </span>
-          </section>
-          <section hidden$="[[!_diffPrefs.font_size]]">
-            <span class="title">Font size</span>
-            <span class="value">
-              <input
-                  is="iron-input"
-                  type="number"
-                  prevent-invalid-input
-                  allowed-pattern="[0-9]"
-                  bind-value="{{_diffPrefs.font_size}}">
-            </span>
-          </section>
-          <section>
-            <span class="title">Show tabs</span>
-            <span class="value">
-              <input
-                  id="showTabs"
-                  type="checkbox"
-                  checked$="[[_diffPrefs.show_tabs]]"
-                  on-change="_handleShowTabsChanged">
-            </span>
-          </section>
-          <section>
-            <span class="title">Show trailing whitespace</span>
-            <span class="value">
-              <input
-                  id="showTrailingWhitespace"
-                  type="checkbox"
-                  checked$="[[_diffPrefs.show_whitespace_errors]]"
-                  on-change="_handleShowTrailingWhitespaceChanged">
-            </span>
-          </section>
-          <section>
-            <span class="title">Syntax highlighting</span>
-            <span class="value">
-              <input
-                  id="syntaxHighlighting"
-                  type="checkbox"
-                  checked$="[[_diffPrefs.syntax_highlighting]]"
-                  on-change="_handleSyntaxHighlightingChanged">
-            </span>
-          </section>
+          <gr-diff-preferences
+              id="diffPrefs"
+              has-unsaved-changes="{{_diffPrefsChanged}}"></gr-diff-preferences>
           <gr-button
               id="saveDiffPrefs"
               on-tap="_handleSaveDiffPreferences"
               disabled$="[[!_diffPrefsChanged]]">Save changes</gr-button>
         </fieldset>
+        <h2
+            id="EditPreferences"
+            class$="[[_computeHeaderClass(_editPrefsChanged)]]">
+          Edit Preferences
+        </h2>
+        <fieldset id="editPreferences">
+          <gr-edit-preferences
+              id="editPrefs"
+              has-unsaved-changes="{{_editPrefsChanged}}"></gr-edit-preferences>
+          <gr-button
+              id="saveEditPrefs"
+              on-tap="_handleSaveEditPreferences"
+              disabled$="[[!_editPrefsChanged]]">Save changes</gr-button>
+        </fieldset>
         <h2 id="Menu" class$="[[_computeHeaderClass(_menuChanged)]]">Menu</h2>
         <fieldset id="menu">
           <gr-menu-editor
@@ -368,7 +355,6 @@
               id="emailEditor"
               has-unsaved-changes="{{_emailsChanged}}"></gr-email-editor>
           <gr-button
-              link
               on-tap="_handleSaveEmails"
               disabled$="[[!_emailsChanged]]">Save changes</gr-button>
         </fieldset>
@@ -410,10 +396,22 @@
               id="sshEditor"
               has-unsaved-changes="{{_keysChanged}}"></gr-ssh-editor>
         </div>
+        <div hidden$="[[!_serverConfig.receive.enable_signed_push]]">
+          <h2
+              id="GPGKeys"
+              class$="[[_computeHeaderClass(_gpgKeysChanged)]]">GPG keys</h2>
+          <gr-gpg-editor
+              id="gpgEditor"
+              has-unsaved-changes="{{_gpgKeysChanged}}"></gr-gpg-editor>
+        </div>
         <h2 id="Groups">Groups</h2>
         <fieldset>
           <gr-group-list id="groupList"></gr-group-list>
         </fieldset>
+        <h2 id="Identities">Identities</h2>
+        <fieldset>
+          <gr-identities id="identities"></gr-identities>
+        </fieldset>
         <template is="dom-if" if="[[_serverConfig.auth.use_contributor_agreements]]">
           <h2 id="Agreements">Agreements</h2>
           <fieldset>
@@ -490,6 +488,8 @@
             </tbody>
           </table>
         </fieldset>
+        <gr-endpoint-decorator name="settings-screen">
+        </gr-endpoint-decorator>
       </main>
     </div>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
diff --git a/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view.js b/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view.js
index 3b0f509..706b1ac 100644
--- a/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view.js
+++ b/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -20,11 +23,13 @@
     'time_format',
     'email_strategy',
     'diff_view',
-    'expand_inline_diffs',
     'publish_comments_on_push',
     'work_in_progress_by_default',
+    'default_base_for_merges',
     'signed_off_by',
     'email_format',
+    'size_bar_in_change_table',
+    'relative_date_in_change_table',
   ];
 
   const GERRIT_DOCS_BASE_URL = 'https://gerrit-review.googlesource.com/' +
@@ -33,6 +38,8 @@
   const ABSOLUTE_URL_PATTERN = /^https?:/;
   const TRAILING_SLASH_PATTERN = /\/$/;
 
+  const RELOAD_MESSAGE = 'Reloading...';
+
   Polymer({
     is: 'gr-settings-view',
 
@@ -43,7 +50,7 @@
      */
 
     /**
-     * Fired with email confirmation text.
+     * Fired with email confirmation text, or when the page reloads.
      *
      * @event show-alert
      */
@@ -59,8 +66,6 @@
       },
       _accountNameMutable: Boolean,
       _accountInfoChanged: Boolean,
-      /** @type {?} */
-      _diffPrefs: Object,
       _changeTableColumnsNotDisplayed: Array,
       /** @type {?} */
       _localPrefs: {
@@ -87,10 +92,10 @@
         type: Boolean,
         value: false,
       },
-      _diffPrefsChanged: {
-        type: Boolean,
-        value: false,
-      },
+      /** @type {?} */
+      _diffPrefsChanged: Boolean,
+      /** @type {?} */
+      _editPrefsChanged: Boolean,
       _menuChanged: {
         type: Boolean,
         value: false,
@@ -103,6 +108,10 @@
         type: Boolean,
         value: false,
       },
+      _gpgKeysChanged: {
+        type: Boolean,
+        value: false,
+      },
       _newEmail: String,
       _addingEmail: {
         type: Boolean,
@@ -124,6 +133,11 @@
       _loadingPromise: Object,
 
       _showNumber: Boolean,
+
+      _isDark: {
+        type: Boolean,
+        value: false,
+      },
     },
 
     behaviors: [
@@ -133,7 +147,6 @@
 
     observers: [
       '_handlePrefsChanged(_localPrefs.*)',
-      '_handleDiffPrefsChanged(_diffPrefs.*)',
       '_handleMenuChanged(_localMenu.splices)',
       '_handleChangeTableChanged(_localChangeTableColumns, _showNumber)',
     ],
@@ -141,11 +154,16 @@
     attached() {
       this.fire('title-change', {title: 'Settings'});
 
+      this._isDark = !!window.localStorage.getItem('dark-theme');
+
       const promises = [
         this.$.accountInfo.loadData(),
         this.$.watchedProjectsEditor.loadData(),
         this.$.groupList.loadData(),
         this.$.httpPass.loadData(),
+        this.$.identities.loadData(),
+        this.$.editPrefs.loadData(),
+        this.$.diffPrefs.loadData(),
       ];
 
       promises.push(this.$.restAPI.getPreferences().then(prefs => {
@@ -156,18 +174,20 @@
         this._cloneChangeTableColumns();
       }));
 
-      promises.push(this.$.restAPI.getDiffPreferences().then(prefs => {
-        this._diffPrefs = prefs;
-      }));
-
       promises.push(this.$.restAPI.getConfig().then(config => {
         this._serverConfig = config;
         const configPromises = [];
 
-        if (this._serverConfig.sshd) {
+        if (this._serverConfig && this._serverConfig.sshd) {
           configPromises.push(this.$.sshEditor.loadData());
         }
 
+        if (this._serverConfig &&
+            this._serverConfig.receive &&
+            this._serverConfig.receive.enable_signed_push) {
+          configPromises.push(this.$.gpgEditor.loadData());
+        }
+
         configPromises.push(
             this.getDocsBaseUrl(config, this.$.restAPI)
                 .then(baseUrl => { this._docsBaseUrl = baseUrl; }));
@@ -223,7 +243,7 @@
     },
 
     _cloneChangeTableColumns() {
-      let columns = this.prefs.change_table;
+      let columns = this.getVisibleColumns(this.prefs.change_table);
 
       if (columns.length === 0) {
         columns = this.columnNames;
@@ -251,14 +271,14 @@
       this._prefsChanged = true;
     },
 
-    _handleDiffPrefsChanged() {
-      if (this._isLoading()) { return; }
-      this._diffPrefsChanged = true;
+    _handleRelativeDateInChangeTable() {
+      this.set('_localPrefs.relative_date_in_change_table',
+          this.$.relativeDateInChangeTable.checked);
     },
 
-    _handleExpandInlineDiffsChanged() {
-      this.set('_localPrefs.expand_inline_diffs',
-          this.$.expandInlineDiffs.checked);
+    _handleShowSizeBarsInFileListChanged() {
+      this.set('_localPrefs.size_bar_in_change_table',
+          this.$.showSizeBarsInFileList.checked);
     },
 
     _handlePublishCommentsOnPushChanged() {
@@ -292,24 +312,6 @@
       });
     },
 
-    _handleLineWrappingChanged() {
-      this.set('_diffPrefs.line_wrapping', this.$.lineWrapping.checked);
-    },
-
-    _handleShowTabsChanged() {
-      this.set('_diffPrefs.show_tabs', this.$.showTabs.checked);
-    },
-
-    _handleShowTrailingWhitespaceChanged() {
-      this.set('_diffPrefs.show_whitespace_errors',
-          this.$.showTrailingWhitespace.checked);
-    },
-
-    _handleSyntaxHighlightingChanged() {
-      this.set('_diffPrefs.syntax_highlighting',
-          this.$.syntaxHighlighting.checked);
-    },
-
     _handleSaveChangeTable() {
       this.set('prefs.change_table', this._localChangeTableColumns);
       this.set('prefs.legacycid_in_change_table', this._showNumber);
@@ -320,10 +322,11 @@
     },
 
     _handleSaveDiffPreferences() {
-      return this.$.restAPI.saveDiffPreferences(this._diffPrefs)
-          .then(() => {
-            this._diffPrefsChanged = false;
-          });
+      this.$.diffPrefs.save();
+    },
+
+    _handleSaveEditPreferences() {
+      this.$.editPrefs.save();
     },
 
     _handleSaveMenu() {
@@ -395,5 +398,20 @@
 
       return base + GERRIT_DOCS_FILTER_PATH;
     },
+
+    _handleToggleDark() {
+      if (this._isDark) {
+        window.localStorage.removeItem('dark-theme');
+      } else {
+        window.localStorage.setItem('dark-theme', 'true');
+      }
+      this.dispatchEvent(new CustomEvent('show-alert', {
+        detail: {message: RELOAD_MESSAGE},
+        bubbles: true,
+      }));
+      this.async(() => {
+        window.location.reload();
+      }, 1);
+    },
   });
 })();
diff --git a/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view_test.html b/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view_test.html
index 01a3dc2..a51d310 100644
--- a/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view_test.html
+++ b/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -42,7 +43,6 @@
     let element;
     let account;
     let preferences;
-    let diffPreferences;
     let config;
     let sandbox;
 
@@ -87,6 +87,9 @@
         diff_view: 'UNIFIED_DIFF',
         email_strategy: 'ENABLED',
         email_format: 'HTML_PLAINTEXT',
+        default_base_for_merges: 'FIRST_PARENT',
+        relative_date_in_change_table: false,
+        size_bar_in_change_table: true,
 
         my: [
           {url: '/first/url', name: 'first name', target: '_blank'},
@@ -94,31 +97,12 @@
         ],
         change_table: [],
       };
-      diffPreferences = {
-        context: 10,
-        tab_size: 8,
-        font_size: 12,
-        line_length: 100,
-        cursor_blink_rate: 0,
-        line_wrapping: false,
-        intraline_difference: true,
-        show_line_endings: true,
-        show_tabs: true,
-        show_whitespace_errors: true,
-        syntax_highlighting: true,
-        auto_hide_diff_table_header: true,
-        theme: 'DEFAULT',
-        ignore_whitespace: 'IGNORE_NONE',
-      };
       config = {auth: {editable_account_fields: []}};
 
       stub('gr-rest-api-interface', {
         getLoggedIn() { return Promise.resolve(true); },
         getAccount() { return Promise.resolve(account); },
         getPreferences() { return Promise.resolve(preferences); },
-        getDiffPreferences() {
-          return Promise.resolve(diffPreferences);
-        },
         getWatchedProjects() {
           return Promise.resolve([]);
         },
@@ -166,10 +150,15 @@
           .firstElementChild.bindValue, preferences.email_strategy);
       assert.equal(valueOf('Email format', 'preferences')
           .firstElementChild.bindValue, preferences.email_format);
+      assert.equal(valueOf('Default Base For Merges', 'preferences')
+          .firstElementChild.bindValue, preferences.default_base_for_merges);
+      assert.equal(
+          valueOf('Show Relative Dates In Changes Table', 'preferences')
+              .firstElementChild.checked, false);
       assert.equal(valueOf('Diff view', 'preferences')
           .firstElementChild.bindValue, preferences.diff_view);
-      assert.equal(valueOf('Expand inline diffs', 'preferences')
-          .firstElementChild.checked, false);
+      assert.equal(valueOf('Show size bars in file list', 'preferences')
+          .firstElementChild.checked, true);
       assert.equal(valueOf('Publish comments on push', 'preferences')
           .firstElementChild.checked, false);
       assert.equal(valueOf(
@@ -186,11 +175,11 @@
       const diffSelect = valueOf('Diff view', 'preferences').firstElementChild;
       diffSelect.bindValue = 'SIDE_BY_SIDE';
 
-      const expandInlineDiffs =
-          valueOf('Expand inline diffs', 'preferences').firstElementChild;
+      const publishOnPush =
+          valueOf('Publish comments on push', 'preferences').firstElementChild;
       diffSelect.fire('change');
 
-      MockInteractions.tap(expandInlineDiffs);
+      MockInteractions.tap(publishOnPush);
 
       assert.isTrue(element._prefsChanged);
       assert.isFalse(element._menuChanged);
@@ -199,7 +188,7 @@
         savePreferences(prefs) {
           assert.equal(prefs.diff_view, 'SIDE_BY_SIDE');
           assertMenusEqual(prefs.my, preferences.my);
-          assert.equal(prefs.expand_inline_diffs, true);
+          assert.equal(prefs.publish_comments_on_push, true);
           return Promise.resolve();
         },
       });
@@ -259,56 +248,6 @@
       });
     });
 
-    test('diff preferences', done => {
-      // Rendered with the expected preferences selected.
-      assert.equal(valueOf('Context', 'diffPreferences')
-          .firstElementChild.bindValue, diffPreferences.context);
-      assert.equal(valueOf('Diff width', 'diffPreferences')
-          .firstElementChild.bindValue, diffPreferences.line_length);
-      assert.equal(valueOf('Tab width', 'diffPreferences')
-          .firstElementChild.bindValue, diffPreferences.tab_size);
-      assert.equal(valueOf('Font size', 'diffPreferences')
-          .firstElementChild.bindValue, diffPreferences.font_size);
-      assert.equal(valueOf('Show tabs', 'diffPreferences')
-          .firstElementChild.checked, diffPreferences.show_tabs);
-      assert.equal(valueOf('Show trailing whitespace', 'diffPreferences')
-          .firstElementChild.checked, diffPreferences.show_whitespace_errors);
-      assert.equal(valueOf('Fit to screen', 'diffPreferences')
-          .firstElementChild.checked, diffPreferences.line_wrapping);
-
-      assert.isFalse(element._diffPrefsChanged);
-
-      const showTabsCheckbox = valueOf('Show tabs', 'diffPreferences')
-          .firstElementChild;
-      showTabsCheckbox.checked = false;
-      element._handleShowTabsChanged();
-
-      assert.isTrue(element._diffPrefsChanged);
-
-      stub('gr-rest-api-interface', {
-        saveDiffPreferences(prefs) {
-          assert.equal(prefs.show_tabs, false);
-          return Promise.resolve();
-        },
-      });
-
-      // Save the change.
-      element._handleSaveDiffPreferences().then(() => {
-        assert.isFalse(element._diffPrefsChanged);
-        done();
-      });
-    });
-
-    test('columns input is hidden with fit to scsreen is selected', () => {
-      assert.isFalse(element.$.columnsPref.hidden);
-
-      MockInteractions.tap(element.$.lineWrapping);
-      assert.isTrue(element.$.columnsPref.hidden);
-
-      MockInteractions.tap(element.$.lineWrapping);
-      assert.isFalse(element.$.columnsPref.hidden);
-    });
-
     test('menu', done => {
       assert.isFalse(element._menuChanged);
       assert.isFalse(element._prefsChanged);
diff --git a/polygerrit-ui/app/elements/settings/gr-ssh-editor/gr-ssh-editor.html b/polygerrit-ui/app/elements/settings/gr-ssh-editor/gr-ssh-editor.html
index 1afd255..ab12403 100644
--- a/polygerrit-ui/app/elements/settings/gr-ssh-editor/gr-ssh-editor.html
+++ b/polygerrit-ui/app/elements/settings/gr-ssh-editor/gr-ssh-editor.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -73,12 +74,14 @@
                 <td>[[_getStatusLabel(key.valid)]]</td>
                 <td>
                   <gr-button
+                      link
                       on-tap="_showKey"
                       data-index$="[[index]]"
                       link>Click to View</gr-button>
                 </td>
                 <td>
                   <gr-button
+                      link
                       data-index$="[[index]]"
                       on-tap="_handleDeleteKey">Delete</gr-button>
                 </td>
@@ -122,6 +125,7 @@
         </section>
         <gr-button
             id="addButton"
+            link
             disabled$="[[_computeAddButtonDisabled(_newKey)]]"
             on-tap="_handleAddKey">Add new SSH key</gr-button>
       </fieldset>
diff --git a/polygerrit-ui/app/elements/settings/gr-ssh-editor/gr-ssh-editor.js b/polygerrit-ui/app/elements/settings/gr-ssh-editor/gr-ssh-editor.js
index fb868e8..874173a 100644
--- a/polygerrit-ui/app/elements/settings/gr-ssh-editor/gr-ssh-editor.js
+++ b/polygerrit-ui/app/elements/settings/gr-ssh-editor/gr-ssh-editor.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
diff --git a/polygerrit-ui/app/elements/settings/gr-ssh-editor/gr-ssh-editor_test.html b/polygerrit-ui/app/elements/settings/gr-ssh-editor/gr-ssh-editor_test.html
index 4273f7a..8607948 100644
--- a/polygerrit-ui/app/elements/settings/gr-ssh-editor/gr-ssh-editor_test.html
+++ b/polygerrit-ui/app/elements/settings/gr-ssh-editor/gr-ssh-editor_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/settings/gr-watched-projects-editor/gr-watched-projects-editor.html b/polygerrit-ui/app/elements/settings/gr-watched-projects-editor/gr-watched-projects-editor.html
index cf5e0b1..7846b7a 100644
--- a/polygerrit-ui/app/elements/settings/gr-watched-projects-editor/gr-watched-projects-editor.html
+++ b/polygerrit-ui/app/elements/settings/gr-watched-projects-editor/gr-watched-projects-editor.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -33,10 +34,10 @@
         text-align: center;
       }
       .notifControl:hover {
-        outline: 1px solid #ddd;
+        outline: 1px solid var(--border-color);
       }
       .projectFilter {
-        color: #777;
+        color: var(--deemphasized-text-color);
         font-style: italic;
         margin-left: 1em;
       }
@@ -48,7 +49,7 @@
       <table id="watchedProjects">
         <thead>
           <tr>
-            <th class="projectHeader">Project</th>
+            <th>Repo</th>
             <template is="dom-repeat" items="[[_getTypes()]]">
               <th class="notifType">[[item.name]]</th>
             </template>
@@ -97,7 +98,7 @@
                   id="newProject"
                   query="[[_query]]"
                   threshold="1"
-                  placeholder="Project"></gr-autocomplete>
+                  placeholder="Repo"></gr-autocomplete>
             </th>
             <th colspan$="[[_getTypeCount()]]">
               <input
diff --git a/polygerrit-ui/app/elements/settings/gr-watched-projects-editor/gr-watched-projects-editor.js b/polygerrit-ui/app/elements/settings/gr-watched-projects-editor/gr-watched-projects-editor.js
index 40d1e36..ebf61db 100644
--- a/polygerrit-ui/app/elements/settings/gr-watched-projects-editor/gr-watched-projects-editor.js
+++ b/polygerrit-ui/app/elements/settings/gr-watched-projects-editor/gr-watched-projects-editor.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
diff --git a/polygerrit-ui/app/elements/settings/gr-watched-projects-editor/gr-watched-projects-editor_test.html b/polygerrit-ui/app/elements/settings/gr-watched-projects-editor/gr-watched-projects-editor_test.html
index fbc6217..e018e42 100644
--- a/polygerrit-ui/app/elements/settings/gr-watched-projects-editor/gr-watched-projects-editor_test.html
+++ b/polygerrit-ui/app/elements/settings/gr-watched-projects-editor/gr-watched-projects-editor_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/shared/gr-account-chip/gr-account-chip.html b/polygerrit-ui/app/elements/shared/gr-account-chip/gr-account-chip.html
index b658025..543ed85 100644
--- a/polygerrit-ui/app/elements/shared/gr-account-chip/gr-account-chip.html
+++ b/polygerrit-ui/app/elements/shared/gr-account-chip/gr-account-chip.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,6 +18,7 @@
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
 <link rel="import" href="../gr-account-link/gr-account-link.html">
 <link rel="import" href="../gr-button/gr-button.html">
+<link rel="import" href="../gr-icons/gr-icons.html">
 <link rel="import" href="../gr-rest-api-interface/gr-rest-api-interface.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 
@@ -29,7 +31,7 @@
       }
       .container {
         align-items: center;
-        background: #eee;
+        background: var(--chip-background-color);
         border-radius: .75em;
         display: inline-flex;
         padding: 0 .5em;
@@ -46,22 +48,15 @@
       gr-button.remove {
         --gr-button: {
           border: 0;
-          color: #666;
-          font-size: 1.7em;
+          color: var(--deemphasized-text-color);
+          font-size: 1.7rem;
           font-weight: normal;
           height: .6em;
-          line-height: .6em;
+          line-height: .6;
           margin-left: .15em;
-          margin-top: -.05em;
           padding: 0;
           text-decoration: none;
         }
-        --gr-button-hover-color: {
-          color: #333;
-        }
-        --gr-button-hover-background-color: {
-          color: #333;
-        }
       }
       :host:focus {
         border-color: transparent;
@@ -75,14 +70,21 @@
       .transparentBackground,
       gr-button.transparentBackground {
         background-color: transparent;
+        padding: 0;
       }
       :host([disabled]) {
         opacity: .6;
         pointer-events: none;
       }
+      iron-icon {
+        height: 1.2rem;
+        width: 1.2rem;
+      }
     </style>
     <div class$="container [[_getBackgroundClass(transparentBackground)]]">
-      <gr-account-link account="[[account]]"></gr-account-link>
+      <gr-account-link account="[[account]]"
+          additional-text="[[additionalText]]">
+      </gr-account-link>
       <gr-button
           id="remove"
           link
@@ -91,7 +93,9 @@
           tabindex="-1"
           aria-label="Remove"
           class$="remove [[_getBackgroundClass(transparentBackground)]]"
-          on-tap="_handleRemoveTap">×</gr-button>
+          on-tap="_handleRemoveTap">
+        <iron-icon icon="gr-icons:close"></iron-icon>
+      </gr-button>
     </div>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
   </template>
diff --git a/polygerrit-ui/app/elements/shared/gr-account-chip/gr-account-chip.js b/polygerrit-ui/app/elements/shared/gr-account-chip/gr-account-chip.js
index e029ab0..880cbc0 100644
--- a/polygerrit-ui/app/elements/shared/gr-account-chip/gr-account-chip.js
+++ b/polygerrit-ui/app/elements/shared/gr-account-chip/gr-account-chip.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 
 (function() {
   'use strict';
@@ -33,6 +36,7 @@
 
     properties: {
       account: Object,
+      additionalText: String,
       disabled: {
         type: Boolean,
         value: false,
diff --git a/polygerrit-ui/app/elements/shared/gr-account-label/gr-account-label.html b/polygerrit-ui/app/elements/shared/gr-account-label/gr-account-label.html
index 21f4c3e..bdf37bf 100644
--- a/polygerrit-ui/app/elements/shared/gr-account-label/gr-account-label.html
+++ b/polygerrit-ui/app/elements/shared/gr-account-label/gr-account-label.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -19,6 +20,7 @@
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 <link rel="import" href="../gr-avatar/gr-avatar.html">
+<link rel="import" href="../gr-limited-text/gr-limited-text.html">
 <link rel="import" href="../gr-rest-api-interface/gr-rest-api-interface.html">
 
 <dom-module id="gr-account-label">
@@ -37,10 +39,17 @@
         vertical-align: -.25em;
       }
       .text {
-        @apply(--gr-account-label-text-style);
+        @apply --gr-account-label-text-style;
       }
       .text:hover {
-        @apply(--gr-account-label-text-hover-style);
+        @apply --gr-account-label-text-hover-style;
+      }
+      .email,
+      .showEmail .name {
+        display: none;
+      }
+      .showEmail .email {
+        display: inline-block;
       }
     </style>
     <span>
@@ -48,13 +57,14 @@
         <gr-avatar account="[[account]]"
             image-size="[[avatarImageSize]]"></gr-avatar>
       </template>
-      <span class="text">
-        <span>[[_computeName(account, _serverConfig)]]</span>
-        <span hidden$="[[!_computeShowEmail(showEmail, account)]]">
+      <span class$="text [[_computeShowEmailClass(account)]]">
+        <span class="name">
+          [[_computeName(account, _serverConfig)]]</span>
+        <span class="email">
           [[_computeEmailStr(account)]]
         </span>
         <template is="dom-if" if="[[account.status]]">
-          <span>([[account.status]])</span>
+          (<gr-limited-text limit="10" text="[[account.status]]"></gr-limited-text>)
         </template>
       </span>
     </span>
diff --git a/polygerrit-ui/app/elements/shared/gr-account-label/gr-account-label.js b/polygerrit-ui/app/elements/shared/gr-account-label/gr-account-label.js
index 2dee2f6..5b1b975 100644
--- a/polygerrit-ui/app/elements/shared/gr-account-label/gr-account-label.js
+++ b/polygerrit-ui/app/elements/shared/gr-account-label/gr-account-label.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -26,15 +29,12 @@
         type: Number,
         value: 32,
       },
-      showEmail: {
-        type: Boolean,
-        value: false,
-      },
       title: {
         type: String,
         reflectToAttribute: true,
-        computed: '_computeAccountTitle(account)',
+        computed: '_computeAccountTitle(account, additionalText)',
       },
+      additionalText: String,
       hasTooltip: {
         type: Boolean,
         reflectToAttribute: true,
@@ -56,6 +56,7 @@
     ],
 
     ready() {
+      if (!this.additionalText) { this.additionalText = ''; }
       this.$.restAPI.getConfig()
           .then(config => { this._serverConfig = config; });
     },
@@ -64,7 +65,7 @@
       return this.getUserName(config, account, false);
     },
 
-    _computeAccountTitle(account) {
+    _computeAccountTitle(account, tooltip) {
       if (!account) { return; }
       let result = '';
       if (this._computeName(account, this._serverConfig)) {
@@ -73,11 +74,15 @@
       if (account.email) {
         result += ' <' + account.email + '>';
       }
+      if (this.additionalText) {
+        return result + ' ' + this.additionalText;
+      }
       return result;
     },
 
-    _computeShowEmail(showEmail, account) {
-      return !!(showEmail && account && account.email);
+    _computeShowEmailClass(account) {
+      if (!account || account.name || !account.email) { return ''; }
+      return 'showEmail';
     },
 
     _computeEmailStr(account) {
diff --git a/polygerrit-ui/app/elements/shared/gr-account-label/gr-account-label_test.html b/polygerrit-ui/app/elements/shared/gr-account-label/gr-account-label_test.html
index 731c9b7..288a670 100644
--- a/polygerrit-ui/app/elements/shared/gr-account-label/gr-account-label_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-account-label/gr-account-label_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -78,23 +79,21 @@
           }),
           'Anonymous <andybons+gerrit@gmail.com>');
 
-      assert.equal(element._computeShowEmail(true,
+      assert.equal(element._computeShowEmailClass(
           {
             name: 'Andrew Bonventre',
             email: 'andybons+gerrit@gmail.com',
-          }), true);
+          }), '');
 
-      assert.equal(element._computeShowEmail(true,
-          {name: 'Andrew Bonventre'}), false);
+      assert.equal(element._computeShowEmailClass(
+          {
+            email: 'andybons+gerrit@gmail.com',
+          }), 'showEmail');
 
-      assert.equal(element._computeShowEmail(false,
-          {name: 'Andrew Bonventre'}), false);
+      assert.equal(element._computeShowEmailClass({name: 'Andrew Bonventre'}),
+          '');
 
-      assert.equal(element._computeShowEmail(
-          true, undefined), false);
-
-      assert.equal(element._computeShowEmail(
-          false, undefined), false);
+      assert.equal(element._computeShowEmailClass(undefined), '');
 
       assert.equal(
           element._computeEmailStr({name: 'test', email: 'test'}), '(test)');
diff --git a/polygerrit-ui/app/elements/shared/gr-account-link/gr-account-link.html b/polygerrit-ui/app/elements/shared/gr-account-link/gr-account-link.html
index 79747ba..34b0de6 100644
--- a/polygerrit-ui/app/elements/shared/gr-account-link/gr-account-link.html
+++ b/polygerrit-ui/app/elements/shared/gr-account-link/gr-account-link.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -27,7 +28,7 @@
         display: inline-block;
       }
       a {
-        color: var(--default-text-color);
+        color: var(--primary-text-color);
         text-decoration: none;
       }
       gr-account-label {
@@ -39,8 +40,8 @@
     <span>
       <a href$="[[_computeOwnerLink(account)]]" tabindex="-1">
         <gr-account-label account="[[account]]"
-            avatar-image-size="[[avatarImageSize]]"
-            show-email="[[_computeShowEmail(account)]]"></gr-account-label>
+            additional-text="[[additionalText]]"
+            avatar-image-size="[[avatarImageSize]]"></gr-account-label>
       </a>
     </span>
   </template>
diff --git a/polygerrit-ui/app/elements/shared/gr-account-link/gr-account-link.js b/polygerrit-ui/app/elements/shared/gr-account-link/gr-account-link.js
index 7a120c0..faaf9c3 100644
--- a/polygerrit-ui/app/elements/shared/gr-account-link/gr-account-link.js
+++ b/polygerrit-ui/app/elements/shared/gr-account-link/gr-account-link.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -18,6 +21,7 @@
     is: 'gr-account-link',
 
     properties: {
+      additionalText: String,
       account: Object,
       avatarImageSize: {
         type: Number,
@@ -35,9 +39,5 @@
           account.email || account.username || account.name ||
           account._account_id);
     },
-
-    _computeShowEmail(account) {
-      return !!(account && !account.name);
-    },
   });
 })();
diff --git a/polygerrit-ui/app/elements/shared/gr-account-link/gr-account-link_test.html b/polygerrit-ui/app/elements/shared/gr-account-link/gr-account-link_test.html
index 11b099b..6d1831e 100644
--- a/polygerrit-ui/app/elements/shared/gr-account-link/gr-account-link_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-account-link/gr-account-link_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -34,17 +35,44 @@
 <script>
   suite('gr-account-link tests', () => {
     let element;
+    let sandbox;
 
     setup(() => {
       stub('gr-rest-api-interface', {
         getConfig() { return Promise.resolve({}); },
       });
       element = fixture('basic');
+      sandbox = sinon.sandbox.create();
+    });
+
+    teardown(() => {
+      sandbox.restore();
     });
 
     test('computed fields', () => {
-      assert.equal(element._computeShowEmail({name: 'asd'}), false);
-      assert.equal(element._computeShowEmail({}), true);
+      const url = 'test/url';
+      const urlStub = sandbox.stub(Gerrit.Nav, 'getUrlForOwner').returns(url);
+      const account = {
+        email: 'email',
+        username: 'username',
+        name: 'name',
+        _account_id: '_account_id',
+      };
+      assert.isNotOk(element._computeOwnerLink());
+      assert.equal(element._computeOwnerLink(account), url);
+      assert.isTrue(urlStub.lastCall.calledWithExactly('email'));
+
+      delete account.email;
+      assert.equal(element._computeOwnerLink(account), url);
+      assert.isTrue(urlStub.lastCall.calledWithExactly('username'));
+
+      delete account.username;
+      assert.equal(element._computeOwnerLink(account), url);
+      assert.isTrue(urlStub.lastCall.calledWithExactly('name'));
+
+      delete account.name;
+      assert.equal(element._computeOwnerLink(account), url);
+      assert.isTrue(urlStub.lastCall.calledWithExactly('_account_id'));
     });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/shared/gr-alert/gr-alert.html b/polygerrit-ui/app/elements/shared/gr-alert/gr-alert.html
index 51fa616..b00fded 100644
--- a/polygerrit-ui/app/elements/shared/gr-alert/gr-alert.html
+++ b/polygerrit-ui/app/elements/shared/gr-alert/gr-alert.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -28,11 +29,11 @@
        * HOW THEY ARE USED IN THE CODE.
        */
       :host([toast]) {
-        background-color: #333;
+        background-color: var(--tooltip-background-color);
         bottom: 1.25rem;
         border-radius: 3px;
         box-shadow: 0 1px 3px rgba(0, 0, 0, .3);
-        color: #fff;
+        color: var(--view-background-color);
         left: 1.25rem;
         padding: 1em 1.5em;
         position: fixed;
@@ -44,18 +45,21 @@
         transform: translateY(0);
       }
       .text {
+        color: var(--tooltip-text-color);
         display: inline-block;
-        max-width: calc(100vw - 2.5rem);
-        overflow: hidden;
-        text-overflow: ellipsis;
+        max-height: 10rem;
+        max-width: 80vw;
         vertical-align: bottom;
-        white-space: nowrap;
+        word-break: break-all;
       }
       .action {
-        color: #a1c2fa;
-        font-family: var(--font-family-bold);
+        color: var(--link-color);
+        font-weight: var(--font-weight-bold);
         margin-left: 1em;
         text-decoration: none;
+        --gr-button: {
+          padding: 0;
+        }
       }
     </style>
     <span class="text">[[text]]</span>
diff --git a/polygerrit-ui/app/elements/shared/gr-alert/gr-alert.js b/polygerrit-ui/app/elements/shared/gr-alert/gr-alert.js
index bfe7c25..e7c8b2c 100644
--- a/polygerrit-ui/app/elements/shared/gr-alert/gr-alert.js
+++ b/polygerrit-ui/app/elements/shared/gr-alert/gr-alert.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
diff --git a/polygerrit-ui/app/elements/shared/gr-alert/gr-alert_test.html b/polygerrit-ui/app/elements/shared/gr-alert/gr-alert_test.html
index b8dcb8d..095e640 100644
--- a/polygerrit-ui/app/elements/shared/gr-alert/gr-alert_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-alert/gr-alert_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -41,8 +42,7 @@
       assert.isNull(element.parentNode);
       element.show();
       assert.equal(element.parentNode, document.body);
-      element.customStyle['--gr-alert-transition-duration'] = '0ms';
-      element.updateStyles();
+      element.updateStyles({'--gr-alert-transition-duration': '0ms'});
       element.hide();
       assert.isNull(element.parentNode);
     });
diff --git a/polygerrit-ui/app/elements/shared/gr-autocomplete-dropdown/gr-autocomplete-dropdown.html b/polygerrit-ui/app/elements/shared/gr-autocomplete-dropdown/gr-autocomplete-dropdown.html
index 83fb7cb..7b82635 100644
--- a/polygerrit-ui/app/elements/shared/gr-autocomplete-dropdown/gr-autocomplete-dropdown.html
+++ b/polygerrit-ui/app/elements/shared/gr-autocomplete-dropdown/gr-autocomplete-dropdown.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -35,18 +36,41 @@
         list-style: none;
       }
       li {
+        border-bottom: 1px solid var(--border-color);
         cursor: pointer;
+        display: flex;
+        justify-content: space-between;
         padding: .5em .75em;
       }
+      li:last-of-type {
+        border: none;
+      }
       li:focus {
         outline: none;
       }
+      li:hover {
+        background-color: var(--hover-background-color);
+      }
       li.selected {
-        background-color: #eee;
+        background-color: var(--selection-background-color);
       }
       .dropdown-content {
-        background: #fff;
+        background: var(--dropdown-background-color);
         box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px;
+        max-height: 50vh;
+        overflow: auto;
+      }
+      @media only screen and (max-height: 35em) {
+        .dropdown-content {
+          max-height: 80vh;
+        }
+      }
+      .label {
+        color: var(--deemphasized-text-color);
+        padding-left: 1em;
+      }
+      .hide {
+        display: none;
       }
     </style>
     <div
@@ -60,8 +84,12 @@
               data-value$="[[item.dataValue]]"
               tabindex="-1"
               aria-label$="[[item.name]]"
+              class="autocompleteOption"
               role="option"
-              on-tap="_handleTapItem">[[item.text]]</li>
+              on-tap="_handleTapItem">
+            <span>[[item.text]]</span>
+            <span class$="label [[_computeLabelClass(item)]]">[[item.label]]</span>
+          </li>
         </template>
       </ul>
     </div>
diff --git a/polygerrit-ui/app/elements/shared/gr-autocomplete-dropdown/gr-autocomplete-dropdown.js b/polygerrit-ui/app/elements/shared/gr-autocomplete-dropdown/gr-autocomplete-dropdown.js
index c0449be..2e55010 100644
--- a/polygerrit-ui/app/elements/shared/gr-autocomplete-dropdown/gr-autocomplete-dropdown.js
+++ b/polygerrit-ui/app/elements/shared/gr-autocomplete-dropdown/gr-autocomplete-dropdown.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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';
 
@@ -46,6 +49,7 @@
       },
       suggestions: {
         type: Array,
+        value: () => [],
         observer: '_resetCursorStops',
       },
       _suggestionEls: {
@@ -55,8 +59,8 @@
     },
 
     behaviors: [
-      Polymer.IronFitBehavior,
       Gerrit.KeyboardShortcutBehavior,
+      Polymer.IronFitBehavior,
     ],
 
     keyBindings: {
@@ -136,9 +140,14 @@
     _handleTapItem(e) {
       e.preventDefault();
       e.stopPropagation();
+      let selected = e.target;
+      while (!selected.classList.contains('autocompleteOption')) {
+        if (!selected || selected === this) { return; }
+        selected = selected.parentElement;
+      }
       this.fire('item-selected', {
         trigger: 'tap',
-        selected: e.target,
+        selected,
       });
     },
 
@@ -151,12 +160,20 @@
     },
 
     _resetCursorStops() {
-      Polymer.dom.flush();
-      this._suggestionEls = this.$.suggestions.querySelectorAll('li');
+      if (this.suggestions.length > 0) {
+        Polymer.dom.flush();
+        this._suggestionEls = this.$.suggestions.querySelectorAll('li');
+      } else {
+        this._suggestionEls = [];
+      }
     },
 
     _resetCursorIndex() {
       this.$.cursor.setCursorAtIndex(0);
     },
+
+    _computeLabelClass(item) {
+      return item.label ? '' : 'hide';
+    },
   });
 })();
diff --git a/polygerrit-ui/app/elements/shared/gr-autocomplete-dropdown/gr-autocomplete-dropdown_test.html b/polygerrit-ui/app/elements/shared/gr-autocomplete-dropdown/gr-autocomplete-dropdown_test.html
index 1995688..d4d54ff 100644
--- a/polygerrit-ui/app/elements/shared/gr-autocomplete-dropdown/gr-autocomplete-dropdown_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-autocomplete-dropdown/gr-autocomplete-dropdown_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -41,7 +42,7 @@
       element = fixture('basic');
       element.open();
       element.suggestions = [
-        {dataValue: 'test value 1', name: 'test name 1', text: 1},
+        {dataValue: 'test value 1', name: 'test name 1', text: 1, label: 'hi'},
         {dataValue: 'test value 2', name: 'test name 2', text: 2}];
       flushAsynchronousOperations();
     });
@@ -51,6 +52,12 @@
       if (element.isOpen) element.close();
     });
 
+    test('shows labels', () => {
+      const els = element.$.suggestions.querySelectorAll('li');
+      assert.equal(els[0].innerText.trim(), '1\nhi');
+      assert.equal(els[1].innerText.trim(), '2');
+    });
+
     test('escape key', done => {
       const closeSpy = sandbox.spy(element, 'close');
       MockInteractions.pressAndReleaseKeyOn(element, 27);
@@ -124,6 +131,19 @@
       });
     });
 
+    test('tapping child still selects item', () => {
+      const itemSelectedStub = sandbox.stub();
+      element.addEventListener('item-selected', itemSelectedStub);
+
+      MockInteractions.tap(element.$.suggestions.querySelectorAll('li')[0]
+          .lastElementChild);
+      flushAsynchronousOperations();
+      assert.deepEqual(itemSelectedStub.lastCall.args[0].detail, {
+        trigger: 'tap',
+        selected: element.$.suggestions.querySelectorAll('li')[0],
+      });
+    });
+
     test('updated suggestions resets cursor stops', () => {
       resetStopsSpy = sandbox.spy(element, '_resetCursorStops');
       element.suggestions = [];
diff --git a/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete.html b/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete.html
index 02fab8f..4b447d1 100644
--- a/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete.html
+++ b/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,8 +15,8 @@
 limitations under the License.
 -->
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
-<link rel="import" href="../../../bower_components/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html">
 <link rel="import" href="../../../bower_components/paper-input/paper-input.html">
+<link rel="import" href="../../../behaviors/keyboard-shortcut-behavior/keyboard-shortcut-behavior.html">
 <link rel="import" href="../../shared/gr-autocomplete-dropdown/gr-autocomplete-dropdown.html">
 <link rel="import" href="../../shared/gr-cursor-manager/gr-cursor-manager.html">
 <link rel="import" href="../../shared/gr-icons/gr-icons.html">
@@ -34,7 +35,7 @@
         margin: 0 .25em;
       }
       paper-input:not(.borderless) {
-        border: 1px solid #ddd;
+        border: 1px solid var(--border-color);
       }
       paper-input {
         height: 100%;
@@ -44,7 +45,7 @@
           padding: 0;
         }
         --paper-input-container-input: {
-          font-size: 1em;
+          font-size: var(--font-size-normal);
         }
         --paper-input-container-underline: {
           display: none;
@@ -58,8 +59,8 @@
       }
       paper-input.warnUncommitted {
         --paper-input-container-input: {
-          color: #ff0000;
-          font-size: 1em;
+          color: var(--error-text-color);
+          font-size: var(--font-size-normal);
         }
       }
     </style>
diff --git a/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete.js b/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete.js
index 462730d..4efa7ad 100644
--- a/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete.js
+++ b/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete.js
@@ -1,20 +1,24 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
   const TOKENIZE_REGEX = /(?:[^\s"]+|"[^"]*")+/g;
+  const DEBOUNCE_WAIT_MS = 200;
 
   Polymer({
     is: 'gr-autocomplete',
@@ -43,10 +47,11 @@
       /**
        * Query for requesting autocomplete suggestions. The function should
        * accept the input as a string parameter and return a promise. The
-       * promise should yield an array of suggestion objects with "name" and
+       * promise yields an array of suggestion objects with "name", "label",
        * "value" properties. The "name" property will be displayed in the
-       * suggestion entry. The "value" property will be emitted if that
-       * suggestion is selected.
+       * suggestion entry. The "label" property will, when specified, appear
+       * next to the "name" as label text. The "value" property will be emitted
+       * if that suggestion is selected.
        *
        * @type {function(string): Promise<?>}
        */
@@ -85,7 +90,6 @@
       text: {
         type: String,
         value: '',
-        observer: '_updateSuggestions',
         notify: true,
       },
 
@@ -129,6 +133,14 @@
         value: false,
       },
 
+      /**
+       * When true, querying for suggestions is not debounced w/r/t keypresses
+       */
+      noDebounce: {
+        type: Boolean,
+        value: false,
+      },
+
       /** @type {?} */
       _suggestions: {
         type: Array,
@@ -154,8 +166,13 @@
       _selected: Object,
     },
 
+    behaviors: [
+      Gerrit.KeyboardShortcutBehavior,
+    ],
+
     observers: [
       '_maybeOpenDropdown(_suggestions, _focused)',
+      '_updateSuggestions(text, threshold, noDebounce)',
     ],
 
     attached() {
@@ -164,6 +181,7 @@
 
     detached() {
       this.unlisten(document.body, 'tap', '_handleBodyTap');
+      this.cancelDebouncer('update-suggestions');
     },
 
     get focusStart() {
@@ -207,7 +225,7 @@
 
     _onInputFocus() {
       this._focused = true;
-      this._updateSuggestions();
+      this._updateSuggestions(this.text, this.threshold, this.noDebounce);
       this.$.input.classList.remove('warnUncommitted');
       // Needed so that --paper-input-container-input updated style is applied.
       this.updateStyles();
@@ -220,29 +238,36 @@
       this.updateStyles();
     },
 
-    _updateSuggestions() {
+    _updateSuggestions(text, threshold, noDebounce) {
       if (this._disableSuggestions) { return; }
-      if (this.text === undefined || this.text.length < this.threshold) {
+      if (text === undefined || text.length < threshold) {
         this._suggestions = [];
         this.value = '';
         return;
       }
-      const text = this.text;
 
-      this.query(text).then(suggestions => {
-        if (text !== this.text) {
-          // Late response.
-          return;
-        }
-        for (const suggestion of suggestions) {
-          suggestion.text = suggestion.name;
-        }
-        this._suggestions = suggestions;
-        Polymer.dom.flush();
-        if (this._index === -1) {
-          this.value = '';
-        }
-      });
+      const update = () => {
+        this.query(text).then(suggestions => {
+          if (text !== this.text) {
+            // Late response.
+            return;
+          }
+          for (const suggestion of suggestions) {
+            suggestion.text = suggestion.name;
+          }
+          this._suggestions = suggestions;
+          Polymer.dom.flush();
+          if (this._index === -1) {
+            this.value = '';
+          }
+        });
+      };
+
+      if (noDebounce) {
+        update();
+      } else {
+        this.debounce('update-suggestions', update, DEBOUNCE_WAIT_MS);
+      }
     },
 
     _maybeOpenDropdown(suggestions, focused) {
@@ -285,6 +310,7 @@
           }
           break;
         case 13: // Enter
+          if (this.modifierPressed(e)) { break; }
           e.preventDefault();
           this._handleInputCommit();
           break;
diff --git a/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete_test.html b/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete_test.html
index bcf3011..1a76f98 100644
--- a/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -27,7 +28,7 @@
 
 <test-fixture id="basic">
   <template>
-    <gr-autocomplete></gr-autocomplete>
+    <gr-autocomplete no-debounce></gr-autocomplete>
   </template>
 </test-fixture>
 
@@ -45,7 +46,7 @@
       sandbox.restore();
     });
 
-    test('renders', done => {
+    test('renders', () => {
       let promise;
       const queryStub = sandbox.spy(input => {
         return promise = Promise.resolve([
@@ -65,18 +66,17 @@
       assert.isTrue(queryStub.called);
       element._focused = true;
 
-      promise.then(() => {
+      return promise.then(() => {
         assert.isFalse(element.$.suggestions.isHidden);
         const suggestions =
             Polymer.dom(element.$.suggestions.root).querySelectorAll('li');
         assert.equal(suggestions.length, 5);
 
         for (let i = 0; i < 5; i++) {
-          assert.equal(suggestions[i].textContent, 'blah ' + i);
+          assert.equal(suggestions[i].innerText.trim(), 'blah ' + i);
         }
 
         assert.notEqual(element.$.suggestions.$.cursor.index, -1);
-        done();
       });
     });
 
@@ -235,6 +235,24 @@
       assert.isTrue(queryStub.called);
     });
 
+    test('noDebounce=false debounces the query', () => {
+      const queryStub = sandbox.spy(() => {
+        return Promise.resolve([]);
+      });
+      let callback;
+      const debounceStub = sandbox.stub(element, 'debounce',
+          (name, cb) => { callback = cb; });
+      element.query = queryStub;
+      element.noDebounce = false;
+      element.text = 'a';
+      assert.isFalse(queryStub.called);
+      assert.isTrue(debounceStub.called);
+      assert.equal(debounceStub.lastCall.args[2], 200);
+      assert.isFunction(callback);
+      callback();
+      assert.isTrue(queryStub.called);
+    });
+
     test('_computeClass respects border property', () => {
       assert.equal(element._computeClass(), '');
       assert.equal(element._computeClass(false), '');
@@ -242,9 +260,7 @@
     });
 
     test('undefined or empty text results in no suggestions', () => {
-      sandbox.spy(element, '_updateSuggestions');
-      element.text = undefined;
-      assert(element._updateSuggestions.calledOnce);
+      element._updateSuggestions(undefined, 0, null);
       assert.equal(element._suggestions.length, 0);
     });
 
@@ -479,6 +495,18 @@
       assert.isTrue(listener.called);
     });
 
+    test('enter with modifier does not complete', () => {
+      const handleSpy = sandbox.spy(element, '_handleKeydown');
+      const commitStub = sandbox.stub(element, '_handleInputCommit');
+      MockInteractions.pressAndReleaseKeyOn(
+          element.$.input, 13, 'ctrl', 'enter');
+      assert.isTrue(handleSpy.called);
+      assert.isFalse(commitStub.called);
+      MockInteractions.pressAndReleaseKeyOn(
+          element.$.input, 13, null, 'enter');
+      assert.isTrue(commitStub.called);
+    });
+
     suite('warnUncommitted', () => {
       let inputClassList;
       setup(() => {
@@ -490,12 +518,8 @@
         element.text = 'blah blah blah';
         MockInteractions.blur(element.$.input);
         assert.isTrue(inputClassList.contains('warnUncommitted'));
-        assert.equal(getComputedStyle(element.$.input.inputElement).color,
-            'rgb(255, 0, 0)');
         MockInteractions.focus(element.$.input);
         assert.isFalse(inputClassList.contains('warnUncommitted'));
-        assert.notEqual(getComputedStyle(element.$.input.inputElement).color,
-            'rgb(255, 0, 0)ed');
       });
 
       test('disabled', () => {
diff --git a/polygerrit-ui/app/elements/shared/gr-avatar/gr-avatar.html b/polygerrit-ui/app/elements/shared/gr-avatar/gr-avatar.html
index 4095d3e..bc63acf 100644
--- a/polygerrit-ui/app/elements/shared/gr-avatar/gr-avatar.html
+++ b/polygerrit-ui/app/elements/shared/gr-avatar/gr-avatar.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -15,9 +16,10 @@
 -->
 
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
-<link rel="import" href="../gr-rest-api-interface/gr-rest-api-interface.html">
 <link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
 <link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../../shared/gr-js-api-interface/gr-js-api-interface.html">
+<link rel="import" href="../gr-rest-api-interface/gr-rest-api-interface.html">
 
 <dom-module id="gr-avatar">
   <template>
diff --git a/polygerrit-ui/app/elements/shared/gr-avatar/gr-avatar.js b/polygerrit-ui/app/elements/shared/gr-avatar/gr-avatar.js
index 1252f7d..bf56382 100644
--- a/polygerrit-ui/app/elements/shared/gr-avatar/gr-avatar.js
+++ b/polygerrit-ui/app/elements/shared/gr-avatar/gr-avatar.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -26,37 +29,45 @@
         type: Number,
         value: 16,
       },
+      _hasAvatars: {
+        type: Boolean,
+        value: false,
+      },
     },
 
     behaviors: [
       Gerrit.BaseUrlBehavior,
     ],
 
-    created() {
-      this.hidden = true;
-    },
-
     attached() {
-      this.$.restAPI.getConfig().then(cfg => {
-        const hasAvatars = !!(cfg && cfg.plugin && cfg.plugin.has_avatars);
-        if (hasAvatars) {
-          this.hidden = false;
-          // src needs to be set if avatar becomes visible
-          this._updateAvatarURL(this.account);
-        }
+      Promise.all([
+        this._getConfig(),
+        Gerrit.awaitPluginsLoaded(),
+      ]).then(([cfg]) => {
+        this._hasAvatars = !!(cfg && cfg.plugin && cfg.plugin.has_avatars);
+
+        this._updateAvatarURL();
       });
     },
 
-    _accountChanged(account) {
-      this._updateAvatarURL(account);
+    _getConfig() {
+      return this.$.restAPI.getConfig();
     },
 
-    _updateAvatarURL(account) {
-      if (!this.hidden && account) {
-        const url = this._buildAvatarURL(this.account);
-        if (url) {
-          this.style.backgroundImage = 'url("' + url + '")';
-        }
+    _accountChanged(account) {
+      this._updateAvatarURL();
+    },
+
+    _updateAvatarURL() {
+      if (!this._hasAvatars || !this.account) {
+        this.hidden = true;
+        return;
+      }
+      this.hidden = false;
+
+      const url = this._buildAvatarURL(this.account);
+      if (url) {
+        this.style.backgroundImage = 'url("' + url + '")';
       }
     },
 
diff --git a/polygerrit-ui/app/elements/shared/gr-avatar/gr-avatar_test.html b/polygerrit-ui/app/elements/shared/gr-avatar/gr-avatar_test.html
index 8187471..5ce17c0 100644
--- a/polygerrit-ui/app/elements/shared/gr-avatar/gr-avatar_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-avatar/gr-avatar_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -34,14 +35,17 @@
 <script>
   suite('gr-avatar tests', () => {
     let element;
+    let sandbox;
 
     setup(() => {
-      stub('gr-rest-api-interface', {
-        getConfig() { return Promise.resolve({}); },
-      });
+      sandbox = sinon.sandbox.create();
       element = fixture('basic');
     });
 
+    teardown(() => {
+      sandbox.restore();
+    });
+
     test('methods', () => {
       assert.equal(element._buildAvatarURL(
           {
@@ -93,26 +97,96 @@
             ],
           }),
           '/accounts/123/avatar?s=16');
+      assert.equal(element._buildAvatarURL(undefined), '');
     });
 
     test('dom for existing account', () => {
-      assert.isTrue(element.hasAttribute('hidden'),
-          'element not hidden initially');
-      element.hidden = false;
+      assert.isFalse(element.hasAttribute('hidden'));
+
+      sandbox.stub(element, '_getConfig', () => {
+        return Promise.resolve({plugin: {has_avatars: true}});
+      });
+
       element.imageSize = 64;
       element.account = {
         _account_id: 123,
       };
-      assert.isFalse(element.hasAttribute('hidden'), 'element hidden');
-      assert.isTrue(
-          element.style.backgroundImage.includes('/accounts/123/avatar?s=64'));
+
+      assert.strictEqual(element.style.backgroundImage, '');
+
+      // Emulate plugins loaded.
+      Gerrit._setPluginsPending([]);
+
+      Promise.all([
+        element.$.restAPI.getConfig(),
+        Gerrit.awaitPluginsLoaded(),
+      ]).then(() => {
+        assert.isFalse(element.hasAttribute('hidden'));
+
+        assert.isTrue(
+            element.style.backgroundImage.includes('/accounts/123/avatar?s=64'));
+      });
     });
 
     test('dom for non available account', () => {
-      assert.isTrue(element.hasAttribute('hidden'),
-          'element not hidden initially');
-      element.account = undefined;
-      assert.isTrue(element.hasAttribute('hidden'), 'element not hidden');
+      assert.isFalse(element.hasAttribute('hidden'));
+
+      sandbox.stub(element, '_getConfig', () => {
+        return Promise.resolve({plugin: {has_avatars: true}});
+      });
+
+      // Emulate plugins loaded.
+      Gerrit._setPluginsPending([]);
+
+      return Promise.all([
+        element.$.restAPI.getConfig(),
+        Gerrit.awaitPluginsLoaded(),
+      ]).then(() => {
+        assert.isTrue(element.hasAttribute('hidden'));
+
+        assert.strictEqual(element.style.backgroundImage, '');
+      });
+    });
+
+    test('avatar config not set and account not set', () => {
+      assert.isFalse(element.hasAttribute('hidden'));
+
+      sandbox.stub(element, '_getConfig', () => {
+        return Promise.resolve({});
+      });
+
+      // Emulate plugins loaded.
+      Gerrit._setPluginsPending([]);
+
+      return Promise.all([
+        element.$.restAPI.getConfig(),
+        Gerrit.awaitPluginsLoaded(),
+      ]).then(() => {
+        assert.isTrue(element.hasAttribute('hidden'));
+      });
+    });
+
+    test('avatar config not set and account set', () => {
+      assert.isFalse(element.hasAttribute('hidden'));
+
+      sandbox.stub(element, '_getConfig', () => {
+        return Promise.resolve({});
+      });
+
+      element.imageSize = 64;
+      element.account = {
+        _account_id: 123,
+      };
+
+      // Emulate plugins loaded.
+      Gerrit._setPluginsPending([]);
+
+      return Promise.all([
+        element.$.restAPI.getConfig(),
+        Gerrit.awaitPluginsLoaded(),
+      ]).then(() => {
+        assert.isTrue(element.hasAttribute('hidden'));
+      });
     });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/shared/gr-button/gr-button.html b/polygerrit-ui/app/elements/shared/gr-button/gr-button.html
index 483882f..fe18180 100644
--- a/polygerrit-ui/app/elements/shared/gr-button/gr-button.html
+++ b/polygerrit-ui/app/elements/shared/gr-button/gr-button.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -26,9 +27,9 @@
     <style include="shared-styles">
       /* general styles for all buttons */
       :host {
+        --background-color: var(--button-background-color, var(--default-button-background-color));
+        --text-color: var(--default-button-text-color);
         display: inline-block;
-        font-family: var(--font-family-bold);
-        font-size: 12px;
         position: relative;
       }
       :host([hidden]) {
@@ -38,30 +39,64 @@
         text-transform: none;
       }
       paper-button {
-        /* Some of these are overridden for link style buttons since buttons
-         without the link attribute are raised */
-        background-color: var(--gr-button-background, #fff);
-        color: var(--gr-button-color, var(--color-link));
-        display: flex;
+        /* paper-button sets this to anti-aliased, which appears different than
+          bold font elsewhere on macOS. */
+        -webkit-font-smoothing: initial;
         align-items: center;
+        background-color: var(--background-color);
+        color: var(--text-color);
+        display: flex;
+        font-family: inherit;
         justify-content: center;
-        margin: 0;
-        min-width: 0;
-        padding: .4em .85em;
+        margin: var(--margin, 0);
+        min-width: var(--border, 0);
+        padding: var(--padding, 4px 8px);
         @apply --gr-button;
       }
-      paper-button:hover,
-      paper-button:focus {
-        color: var(--gr-button-hover-color, var(--color-button-hover));
+      paper-button:hover {
+        background: linear-gradient(
+          rgba(0, 0, 0, .12),
+          rgba(0, 0, 0, .12)
+        ), var(--background-color);
       }
-      :host([disabled]) paper-button {
-        color: #a8a8a8;
-        cursor: wait;
+
+      :host([primary]) {
+        --background-color: var(--primary-button-background-color);
+        --text-color: var(--primary-button-text-color);
       }
-      /* styles for the optional down arrow */
+      :host([link][primary]) {
+        --text-color: var(--primary-button-background-color);
+      }
+      :host([secondary]) {
+        --background-color: var(--secondary-button-text-color);
+        --text-color: var(--secondary-button-background-color);
+      }
+      :host([link][secondary]) {
+        --text-color: var(--secondary-button-text-color);
+      }
+
+      /* Keep below color definition for primary so that this takes precedence
+        when disabled. */
+      :host([disabled]) {
+        --background-color: var(--table-subheader-background-color);
+        --text-color: var(--deemphasized-text-color);
+        cursor: default;
+      }
+
+      /* Styles for link buttons specifically */
+      :host([link]) {
+        --background-color: transparent;
+        --margin: 0;
+        --padding: 5px 4px;
+      }
+      :host([disabled][link]) {
+        --background-color: transparent;
+      }
+
+      /* Styles for the optional down arrow */
       :host:not([down-arrow]) .downArrow {display: none; }
       :host([down-arrow]) .downArrow {
-        border-top: .36em solid var(--gr-button-arrow-color, #ccc);
+        border-top: .36em solid #ccc;
         border-left: .36em solid transparent;
         border-right: .36em solid transparent;
         margin-bottom: .05em;
@@ -69,60 +104,14 @@
         transition: border-top-color 200ms;
       }
       :host([down-arrow]) paper-button:hover .downArrow {
-        border-top-color: var(--gr-button-arrow-hover-color, #666);
-      }
-
-      /* styles for raised buttons specifically*/
-      :host([primary]) paper-button[raised],
-      :host([secondary]) paper-button[raised] {
-        background-color: var(--color-link);
-        color: #fff;
-      }
-      :host([primary]) paper-button[raised]:hover,
-      :host([primary]) paper-button[raised]:focus,
-      :host([secondary]) paper-button[raised]:hover,
-      :host([secondary]) paper-button[raised]:focus {
-        background-color: var(--gr-button-hover-background-color, var(--color-button-hover));
-        color: var(--gr-button-color, #fff);
-      }
-      :host([disabled]) paper-button[raised] {
-        background-color: #eaeaea;
-        color: #a8a8a8;
-      }
-      /* styles for link buttons specifically */
-      :host([link]) {
-        background-color: transparent;
-        border: none;
-        color: var(--color-link);
-        font-size: inherit;
-        font-family: var(--font-family-bold);
-        text-transform: none;
-      }
-      :host([link][tertiary]) {
-        color: var(--color-link-tertiary);
-      }
-      :host([link]) paper-button {
-        background-color: transparent;
-        margin: 0;
-        padding: 0;
-        --paper-button: {
-          padding: 0;
-        }
-        @apply --gr-button;
-      }
-      :host([disabled][link]) paper-button {
-        background-color: transparent;
-      }
-      :host([link]) paper-button:hover,
-      :host([link]) paper-button:focus {
-        color: var(--gr-button-hover-color, var(--color-button-hover));
+        border-top-color: var(--deemphasized-text-color);
       }
     </style>
     <paper-button
         raised="[[!link]]"
         disabled="[[_computeDisabled(disabled, loading)]]"
         tabindex="-1">
-      <content></content>
+      <slot></slot>
       <i class="downArrow"></i>
     </paper-button>
   </template>
diff --git a/polygerrit-ui/app/elements/shared/gr-button/gr-button.js b/polygerrit-ui/app/elements/shared/gr-button/gr-button.js
index b5a1d94..ca6705e 100644
--- a/polygerrit-ui/app/elements/shared/gr-button/gr-button.js
+++ b/polygerrit-ui/app/elements/shared/gr-button/gr-button.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -18,6 +21,7 @@
     is: 'gr-button',
 
     properties: {
+      tooltip: String,
       downArrow: {
         type: Boolean,
         reflectToAttribute: true,
@@ -32,11 +36,6 @@
         value: false,
         reflectToAttribute: true,
       },
-      tertiary: {
-        type: Boolean,
-        value: false,
-        reflectToAttribute: true,
-      },
       disabled: {
         type: Boolean,
         observer: '_disabledChanged',
@@ -84,6 +83,7 @@
         this._enabledTabindex = this.getAttribute('tabindex');
       }
       this.setAttribute('tabindex', disabled ? '-1' : this._enabledTabindex);
+      this.updateStyles();
     },
 
     _computeDisabled(disabled, loading) {
diff --git a/polygerrit-ui/app/elements/shared/gr-button/gr-button_test.html b/polygerrit-ui/app/elements/shared/gr-button/gr-button_test.html
index c0ceb33..ed0da2e 100644
--- a/polygerrit-ui/app/elements/shared/gr-button/gr-button_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-button/gr-button_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/shared/gr-change-star/gr-change-star.html b/polygerrit-ui/app/elements/shared/gr-change-star/gr-change-star.html
index 08bc6eb..a14c652 100644
--- a/polygerrit-ui/app/elements/shared/gr-change-star/gr-change-star.html
+++ b/polygerrit-ui/app/elements/shared/gr-change-star/gr-change-star.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -15,42 +16,25 @@
 -->
 
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
-<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
+<link rel="import" href="../../shared/gr-icons/gr-icons.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 
 <dom-module id="gr-change-star">
   <template>
     <style include="shared-styles">
-      :host {
-        display: inline-block;
-        overflow: hidden;
-      }
-      .starButton {
+      button {
         background-color: transparent;
-        border-color: transparent;
         cursor: pointer;
-        font-size: 1.1em;
-        width: 1.2em;
-        height: 1.2em;
-        outline: none;
       }
-      .starButton svg {
-        fill: #ccc;
-        width: 1em;
-        height: 1em;
-      }
-      .starButton-active svg {
-        fill: #ffac33;
+      iron-icon.active {
+        fill: var(--link-color);
       }
     </style>
-    <button
-        class$="[[_computeStarClass(change.starred)]]"
-        aria-label="Change star"
-        on-tap="toggleStar">
-      <!-- Public Domain image from the Noun Project: https://thenounproject.com/search/?q=star&i=25969 -->
-      <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="0 0 100 100" enable-background="new 0 0 100 100" xml:space="preserve"><path d="M26.439,95.601c-5.608,2.949-9.286,0.276-8.216-5.968l4.5-26.237L3.662,44.816c-4.537-4.423-3.132-8.746,3.137-9.657  l26.343-3.829L44.923,7.46c2.804-5.682,7.35-5.682,10.154,0l11.78,23.87l26.343,3.829c6.27,0.911,7.674,5.234,3.138,9.657  L77.277,63.397l4.501,26.237c1.07,6.244-2.608,8.916-8.216,5.968L50,83.215L26.439,95.601z"></path></svg>
+    <button aria-label="Change star" on-tap="toggleStar">
+      <iron-icon
+          class$="[[_computeStarClass(change.starred)]]"
+          icon$="[[_computeStarIcon(change.starred)]]"></iron-icon>
     </button>
-    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
   </template>
   <script src="gr-change-star.js"></script>
 </dom-module>
diff --git a/polygerrit-ui/app/elements/shared/gr-change-star/gr-change-star.js b/polygerrit-ui/app/elements/shared/gr-change-star/gr-change-star.js
index 5009a6f..3c46d1b 100644
--- a/polygerrit-ui/app/elements/shared/gr-change-star/gr-change-star.js
+++ b/polygerrit-ui/app/elements/shared/gr-change-star/gr-change-star.js
@@ -1,45 +1,55 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
   Polymer({
     is: 'gr-change-star',
 
+    /**
+     * Fired when star state is toggled.
+     *
+     * @event toggle-star
+     */
+
     properties: {
       /** @type {?} */
       change: {
         type: Object,
         notify: true,
       },
-
-      _xhrPromise: Object, // Used for testing.
     },
 
     _computeStarClass(starred) {
-      const classes = ['starButton'];
-      if (starred) {
-        classes.push('starButton-active');
-      }
-      return classes.join(' ');
+      return starred ? 'active' : '';
+    },
+
+    _computeStarIcon(starred) {
+      // Hollow star is used to indicate inactive state.
+      return `gr-icons:star${starred ? '' : '-border'}`;
     },
 
     toggleStar() {
       const newVal = !this.change.starred;
       this.set('change.starred', newVal);
-      this._xhrPromise = this.$.restAPI.saveChangeStarred(this.change._number,
-          newVal);
+      this.dispatchEvent(new CustomEvent('toggle-star', {
+        bubbles: true,
+        detail: {change: this.change, starred: newVal},
+      }));
     },
   });
 })();
diff --git a/polygerrit-ui/app/elements/shared/gr-change-star/gr-change-star_test.html b/polygerrit-ui/app/elements/shared/gr-change-star/gr-change-star_test.html
index 6c15a46..0ca9368 100644
--- a/polygerrit-ui/app/elements/shared/gr-change-star/gr-change-star_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-change-star/gr-change-star_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -36,9 +37,6 @@
     let element;
 
     setup(() => {
-      stub('gr-rest-api-interface', {
-        saveChangeStarred() { return Promise.resolve({ok: true}); },
-      });
       element = fixture('basic');
       element.change = {
         _number: 2,
@@ -48,34 +46,32 @@
 
     test('star visibility states', () => {
       element.set('change.starred', true);
-      assert.isTrue(element.$$('button').classList.contains('starButton'));
-      assert.isTrue(
-          element.$$('button').classList.contains('starButton-active'));
+      let icon = element.$$('iron-icon');
+      assert.isTrue(icon.classList.contains('active'));
+      assert.equal(icon.icon, 'gr-icons:star');
 
       element.set('change.starred', false);
-      assert.isTrue(element.$$('button').classList.contains('starButton'));
-      assert.isFalse(
-          element.$$('button').classList.contains('starButton-active'));
+      icon = element.$$('iron-icon');
+      assert.isFalse(icon.classList.contains('active'));
+      assert.equal(icon.icon, 'gr-icons:star-border');
     });
 
     test('starring', done => {
-      element.set('change.starred', false);
-      MockInteractions.tap(element.$$('button'));
-
-      element._xhrPromise.then(req => {
+      element.addEventListener('toggle-star', () => {
         assert.equal(element.change.starred, true);
         done();
       });
+      element.set('change.starred', false);
+      MockInteractions.tap(element.$$('button'));
     });
 
     test('unstarring', done => {
-      element.set('change.starred', true);
-      MockInteractions.tap(element.$$('button'));
-
-      element._xhrPromise.then(req => {
+      element.addEventListener('toggle-star', () => {
         assert.equal(element.change.starred, false);
         done();
       });
+      element.set('change.starred', true);
+      MockInteractions.tap(element.$$('button'));
     });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/shared/gr-change-status/gr-change-status.html b/polygerrit-ui/app/elements/shared/gr-change-status/gr-change-status.html
new file mode 100644
index 0000000..e256bf3
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-change-status/gr-change-status.html
@@ -0,0 +1,88 @@
+<!--
+@license
+Copyright (C) 2017 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="../../../bower_components/polymer/polymer.html">
+
+<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
+<link rel="import" href="../../shared/gr-tooltip-content/gr-tooltip-content.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+
+<dom-module id="gr-change-status">
+  <template>
+    <style include="shared-styles">
+      .chip {
+        border-radius: 4px;
+        background-color: var(--chip-background-color);
+        font-family: var(--font-family);
+        font-size: var(--font-size-normal);
+        padding: .1em .5em;
+        white-space: nowrap;
+      }
+      :host(.merged) .chip {
+        background-color: #5b9d52;
+        color: #5b9d52;
+      }
+      :host(.abandoned) .chip {
+        background-color: #afafaf;
+        color: #afafaf;
+      }
+      :host(.wip) .chip {
+        background-color: #8f756c;
+        color: #8f756c;
+      }
+      :host(.private) .chip {
+        background-color: #c17ccf;
+        color: #c17ccf;
+      }
+      :host(.merge-conflict) .chip {
+        background-color: #dc5c60;
+        color: #dc5c60;
+      }
+      :host(.active) .chip {
+        background-color: #29b6f6;
+        color: #29b6f6;
+      }
+      :host(.ready-to-submit) .chip {
+        background-color: #e10ca3;
+        color: #e10ca3;
+      }
+      :host(.custom) .chip {
+        background-color: #825cc2;
+        color: #825cc2;
+      }
+      :host([flat]) .chip {
+        background-color: transparent;
+        padding: .1em;
+      }
+      :host:not([flat]) .chip {
+        color: white;
+      }
+    </style>
+    <gr-tooltip-content
+        has-tooltip
+        position-below
+        title="[[tooltipText]]"
+        max-width="40em">
+      <div
+          class="chip"
+          aria-label$="Label: [[status]]">
+        [[_computeStatusString(status)]]
+      </div>
+    </gr-tooltip-content>
+  </template>
+  <script src="gr-change-status.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/shared/gr-change-status/gr-change-status.js b/polygerrit-ui/app/elements/shared/gr-change-status/gr-change-status.js
new file mode 100644
index 0000000..8efd309
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-change-status/gr-change-status.js
@@ -0,0 +1,84 @@
+/**
+ * @license
+ * Copyright (C) 2017 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 ChangeStates = {
+    MERGED: 'Merged',
+    ABANDONED: 'Abandoned',
+    MERGE_CONFLICT: 'Merge Conflict',
+    WIP: 'WIP',
+    PRIVATE: 'Private',
+  };
+
+  const WIP_TOOLTIP = 'This change isn\'t ready to be reviewed or submitted. ' +
+      'It will not appear in dashboards, and email notifications will be ' +
+      'silenced until the review is started.';
+
+  const PRIVATE_TOOLTIP = 'This change is only visible to its owner and ' +
+      'current reviewers (or anyone with "View Private Changes" permission).';
+
+  Polymer({
+    is: 'gr-change-status',
+
+    properties: {
+      flat: {
+        type: Boolean,
+        value: false,
+        reflectToAttribute: true,
+      },
+      status: {
+        type: String,
+        observer: '_updateChipDetails',
+      },
+      tooltipText: {
+        type: String,
+        value: '',
+      },
+    },
+
+    _computeStatusString(status) {
+      if (status === ChangeStates.WIP && !this.flat) {
+        return 'Work in Progress';
+      }
+      return status;
+    },
+
+    _toClassName(str) {
+      return str.toLowerCase().replace(/\s/g, '-');
+    },
+
+    _updateChipDetails(status, previousStatus) {
+      if (previousStatus) {
+        this.classList.remove(this._toClassName(previousStatus));
+      }
+      this.classList.add(this._toClassName(status));
+
+      switch (status) {
+        case ChangeStates.WIP:
+          this.tooltipText = WIP_TOOLTIP;
+          break;
+        case ChangeStates.PRIVATE:
+          this.tooltipText = PRIVATE_TOOLTIP;
+          break;
+        default:
+          this.tooltipText = '';
+          break;
+      }
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/shared/gr-change-status/gr-change-status_test.html b/polygerrit-ui/app/elements/shared/gr-change-status/gr-change-status_test.html
new file mode 100644
index 0000000..f73fc02
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-change-status/gr-change-status_test.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html>
+<!--
+@license
+Copyright (C) 2017 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-change-status</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-change-status.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-change-status></gr-change-status>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-change-status tests', () => {
+    let element;
+    let sandbox;
+
+    setup(() => {
+      element = fixture('basic');
+      sandbox = sinon.sandbox.create();
+    });
+
+    teardown(() => {
+      sandbox.restore();
+    });
+
+    test('WIP', () => {
+      element.status = 'WIP';
+      assert.equal(element.$$('.chip').innerText, 'Work in Progress');
+      assert.isDefined(element.tooltipText);
+      assert.isTrue(element.classList.contains('wip'));
+    });
+
+    test('WIP flat', () => {
+      element.flat = true;
+      element.status = 'WIP';
+      assert.equal(element.$$('.chip').innerText, 'WIP');
+      assert.isDefined(element.tooltipText);
+      assert.isTrue(element.classList.contains('wip'));
+      assert.isTrue(element.hasAttribute('flat'));
+    });
+
+    test('merged', () => {
+      element.status = 'Merged';
+      assert.equal(element.$$('.chip').innerText, element.status);
+      assert.equal(element.tooltipText, '');
+      assert.isTrue(element.classList.contains('merged'));
+    });
+
+    test('abandoned', () => {
+      element.status = 'Abandoned';
+      assert.equal(element.$$('.chip').innerText, element.status);
+      assert.equal(element.tooltipText, '');
+      assert.isTrue(element.classList.contains('abandoned'));
+    });
+
+    test('merge conflict', () => {
+      element.status = 'Merge Conflict';
+      assert.equal(element.$$('.chip').innerText, element.status);
+      assert.equal(element.tooltipText, '');
+      assert.isTrue(element.classList.contains('merge-conflict'));
+    });
+
+    test('private', () => {
+      element.status = 'Private';
+      assert.equal(element.$$('.chip').innerText, element.status);
+      assert.isDefined(element.tooltipText);
+      assert.isTrue(element.classList.contains('private'));
+    });
+
+    test('active', () => {
+      element.status = 'Active';
+      assert.equal(element.$$('.chip').innerText, element.status);
+      assert.equal(element.tooltipText, '');
+      assert.isTrue(element.classList.contains('active'));
+    });
+
+    test('ready to submit', () => {
+      element.status = 'Ready to submit';
+      assert.equal(element.$$('.chip').innerText, element.status);
+      assert.equal(element.tooltipText, '');
+      assert.isTrue(element.classList.contains('ready-to-submit'));
+    });
+
+    test('updating status removes the previous class', () => {
+      element.status = 'Private';
+      assert.isTrue(element.classList.contains('private'));
+      assert.isFalse(element.classList.contains('wip'));
+
+      element.status = 'WIP';
+      assert.isFalse(element.classList.contains('private'));
+      assert.isTrue(element.classList.contains('wip'));
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/shared/gr-confirm-dialog/gr-confirm-dialog.html b/polygerrit-ui/app/elements/shared/gr-confirm-dialog/gr-confirm-dialog.html
deleted file mode 100644
index efa2b35..0000000
--- a/polygerrit-ui/app/elements/shared/gr-confirm-dialog/gr-confirm-dialog.html
+++ /dev/null
@@ -1,69 +0,0 @@
-<!--
-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.
--->
-
-<link rel="import" href="../../../bower_components/polymer/polymer.html">
-<link rel="import" href="../gr-button/gr-button.html">
-<link rel="import" href="../../../styles/shared-styles.html">
-
-<dom-module id="gr-confirm-dialog">
-  <template>
-    <style include="shared-styles">
-      :host {
-        display: block;
-        max-height: 90vh;
-      }
-      .container {
-        display: flex;
-        flex-direction: column;
-        max-height: 90vh;
-      }
-      header {
-        border-bottom: 1px solid #cdcdcd;
-        flex-shrink: 0;
-        font-family: var(--font-family-bold);
-      }
-      main {
-        display: flex;
-        flex-shrink: 1;
-        width: 100%;
-      }
-      header,
-      main,
-      footer {
-        padding: .5em 1.5em;
-      }
-      gr-button {
-        margin-left: 1em;
-      }
-      footer {
-        display: flex;
-        flex-shrink: 0;
-        justify-content: flex-end;
-      }
-    </style>
-    <div class="container">
-      <header><content select=".header"></content></header>
-      <main><content select=".main"></content></main>
-      <footer>
-        <gr-button link on-tap="_handleCancelTap">Cancel</gr-button>
-        <gr-button link primary on-tap="_handleConfirmTap" disabled="[[disabled]]">
-          [[confirmLabel]]
-        </gr-button>
-      </footer>
-    </div>
-  </template>
-  <script src="gr-confirm-dialog.js"></script>
-</dom-module>
diff --git a/polygerrit-ui/app/elements/shared/gr-confirm-dialog/gr-confirm-dialog.js b/polygerrit-ui/app/elements/shared/gr-confirm-dialog/gr-confirm-dialog.js
deleted file mode 100644
index 3d5e781..0000000
--- a/polygerrit-ui/app/elements/shared/gr-confirm-dialog/gr-confirm-dialog.js
+++ /dev/null
@@ -1,57 +0,0 @@
-// 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.
-(function() {
-  'use strict';
-
-  Polymer({
-    is: 'gr-confirm-dialog',
-
-    /**
-     * Fired when the confirm button is pressed.
-     *
-     * @event confirm
-     */
-
-    /**
-     * Fired when the cancel button is pressed.
-     *
-     * @event cancel
-     */
-
-    properties: {
-      confirmLabel: {
-        type: String,
-        value: 'Confirm',
-      },
-      disabled: {
-        type: Boolean,
-        value: false,
-      },
-    },
-
-    hostAttributes: {
-      role: 'dialog',
-    },
-
-    _handleConfirmTap(e) {
-      e.preventDefault();
-      this.fire('confirm', null, {bubbles: false});
-    },
-
-    _handleCancelTap(e) {
-      e.preventDefault();
-      this.fire('cancel', null, {bubbles: false});
-    },
-  });
-})();
diff --git a/polygerrit-ui/app/elements/shared/gr-confirm-dialog/gr-confirm-dialog_test.html b/polygerrit-ui/app/elements/shared/gr-confirm-dialog/gr-confirm-dialog_test.html
deleted file mode 100644
index 309e15c..0000000
--- a/polygerrit-ui/app/elements/shared/gr-confirm-dialog/gr-confirm-dialog_test.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!DOCTYPE html>
-<!--
-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-confirm-dialog</title>
-
-<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
-<script src="../../../bower_components/web-component-tester/browser.js"></script>
-<link rel="import" href="../../../test/common-test-setup.html"/>
-<link rel="import" href="gr-confirm-dialog.html">
-
-<script>void(0);</script>
-
-<test-fixture id="basic">
-  <template>
-    <gr-confirm-dialog></gr-confirm-dialog>
-  </template>
-</test-fixture>
-
-<script>
-  suite('gr-confirm-dialog tests', () => {
-    let element;
-
-    setup(() => {
-      element = fixture('basic');
-    });
-
-    test('events', done => {
-      let numEvents = 0;
-      function handler() { if (++numEvents == 2) { done(); } }
-
-      element.addEventListener('confirm', handler);
-      element.addEventListener('cancel', handler);
-
-      MockInteractions.tap(element.$$('gr-button[primary]'));
-      MockInteractions.tap(element.$$('gr-button:not([primary])'));
-    });
-  });
-</script>
diff --git a/polygerrit-ui/app/elements/shared/gr-copy-clipboard/gr-copy-clipboard.html b/polygerrit-ui/app/elements/shared/gr-copy-clipboard/gr-copy-clipboard.html
index 932db89..32ca557 100644
--- a/polygerrit-ui/app/elements/shared/gr-copy-clipboard/gr-copy-clipboard.html
+++ b/polygerrit-ui/app/elements/shared/gr-copy-clipboard/gr-copy-clipboard.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,9 +17,9 @@
 
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
 <link rel="import" href="../../../bower_components/iron-input/iron-input.html">
-<link rel="import" href="../../shared/gr-button/gr-button.html">
-<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
 <link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../../shared/gr-button/gr-button.html">
+<link rel="import" href="../../shared/gr-icons/gr-icons.html">
 
 <dom-module id="gr-copy-clipboard">
   <template>
@@ -27,11 +28,6 @@
         align-items: center;
         display: flex;
         flex-wrap: wrap;
-        margin-bottom: .5em;
-        width: 60em;
-      }
-      .text label {
-        flex: 0 0 100%;
       }
       .copyText {
         flex-grow: 1;
@@ -43,10 +39,14 @@
       input {
         font-family: var(--monospace-font-family);
         font-size: inherit;
+        @apply --text-container-style;
+      }
+      #icon {
+        height: 1.2em;
+        width: 1.2em;
       }
     </style>
     <div class="text">
-        <label>[[title]]</label>
         <input id="input" is="iron-input"
             class$="copyText [[_computeInputClass(hideInput)]]"
             type="text"
@@ -55,12 +55,13 @@
             readonly>
         <gr-button id="button"
             link
+            has-tooltip="[[hasTooltip]]"
             class="copyToClipboard"
+            title="[[buttonTitle]]"
             on-tap="_copyToClipboard">
-          copy
+          <iron-icon id="icon" icon="gr-icons:content-copy"></iron-icon>
         </gr-button>
-      </div>
-    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
+    </div>
   </template>
   <script src="gr-copy-clipboard.js"></script>
 </dom-module>
diff --git a/polygerrit-ui/app/elements/shared/gr-copy-clipboard/gr-copy-clipboard.js b/polygerrit-ui/app/elements/shared/gr-copy-clipboard/gr-copy-clipboard.js
index a371374..cabee36 100644
--- a/polygerrit-ui/app/elements/shared/gr-copy-clipboard/gr-copy-clipboard.js
+++ b/polygerrit-ui/app/elements/shared/gr-copy-clipboard/gr-copy-clipboard.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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';
 
@@ -21,7 +24,11 @@
 
     properties: {
       text: String,
-      title: String,
+      buttonTitle: String,
+      hasTooltip: {
+        type: Boolean,
+        value: false,
+      },
       hideInput: {
         type: Boolean,
         value: false,
@@ -41,12 +48,20 @@
       Polymer.dom(e).rootTarget.select();
     },
 
-    _copyToClipboard(e) {
+    _copyToClipboard() {
+      if (this.hideInput) {
+        this.$.input.style.display = 'block';
+      }
+      this.$.input.focus();
       this.$.input.select();
       document.execCommand('copy');
-      window.getSelection().removeAllRanges();
-      e.target.textContent = 'done';
-      this.async(() => { e.target.textContent = 'copy'; }, COPY_TIMEOUT_MS);
+      if (this.hideInput) {
+        this.$.input.style.display = 'none';
+      }
+      this.$.icon.icon = 'gr-icons:check';
+      this.async(
+          () => this.$.icon.icon = 'gr-icons:content-copy',
+          COPY_TIMEOUT_MS);
     },
   });
 })();
diff --git a/polygerrit-ui/app/elements/shared/gr-copy-clipboard/gr-copy-clipboard_test.html b/polygerrit-ui/app/elements/shared/gr-copy-clipboard/gr-copy-clipboard_test.html
index 7310629..d6e9dca 100644
--- a/polygerrit-ui/app/elements/shared/gr-copy-clipboard/gr-copy-clipboard_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-copy-clipboard/gr-copy-clipboard_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -37,12 +38,8 @@
     let sandbox;
 
     setup(() => {
-      stub('gr-rest-api-interface', {
-        saveChangeStarred() { return Promise.resolve({ok: true}); },
-      });
       sandbox = sinon.sandbox.create();
       element = fixture('basic');
-      element.title = 'Checkout';
       element.text = `git fetch http://gerrit@localhost:8080/a/test-project
           refs/changes/05/5/1 && git checkout FETCH_HEAD`;
       flushAsynchronousOperations();
diff --git a/polygerrit-ui/app/elements/shared/gr-count-string-formatter/gr-count-string-formatter.html b/polygerrit-ui/app/elements/shared/gr-count-string-formatter/gr-count-string-formatter.html
new file mode 100644
index 0000000..b69c61aa
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-count-string-formatter/gr-count-string-formatter.html
@@ -0,0 +1,58 @@
+<!--
+@license
+Copyright (C) 2017 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.
+-->
+<script>
+  (function(window) {
+    'use strict';
+    const GrCountStringFormatter = window.GrCountStringFormatter || {};
+
+    /**
+     * Returns a count plus string that is pluralized when necessary.
+     *
+     * @param {number} count
+     * @param {string} noun
+     * @return {string}
+     */
+    GrCountStringFormatter.computePluralString = function(count, noun) {
+      return this.computeString(count, noun) + (count > 1 ? 's' : '');
+    };
+
+    /**
+     * Returns a count plus string that is not pluralized.
+     *
+     * @param {number} count
+     * @param {string} noun
+     * @return {string}
+     */
+    GrCountStringFormatter.computeString = function(count, noun) {
+      if (count === 0) { return ''; }
+      return count + ' ' + noun;
+    };
+
+    /**
+     * Returns a count plus arbitrary text.
+     *
+     * @param {number} count
+     * @param {string} text
+     * @return {string}
+     */
+    GrCountStringFormatter.computeShortString = function(count, text) {
+      if (count === 0) { return ''; }
+      return count + text;
+    };
+    window.GrCountStringFormatter = GrCountStringFormatter;
+  })(window);
+</script>
diff --git a/polygerrit-ui/app/elements/shared/gr-count-string-formatter/gr-count-string-formatter_test.html b/polygerrit-ui/app/elements/shared/gr-count-string-formatter/gr-count-string-formatter_test.html
new file mode 100644
index 0000000..e4d896b
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-count-string-formatter/gr-count-string-formatter_test.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<!--
+@license
+Copyright (C) 2017 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-count-string-formatter</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-count-string-formatter.html"/>
+
+<script>
+  suite('gr-count-string-formatter tests', () => {
+    test('computeString', () => {
+      const noun = 'unresolved';
+      assert.equal(GrCountStringFormatter.computeString(0, noun), '');
+      assert.equal(GrCountStringFormatter.computeString(1, noun),
+          '1 unresolved');
+      assert.equal(GrCountStringFormatter.computeString(2, noun),
+          '2 unresolved');
+    });
+
+    test('computeShortString', () => {
+      const noun = 'c';
+      assert.equal(GrCountStringFormatter.computeShortString(0, noun), '');
+      assert.equal(GrCountStringFormatter.computeShortString(1, noun), '1c');
+      assert.equal(GrCountStringFormatter.computeShortString(2, noun), '2c');
+    });
+
+    test('computePluralString', () => {
+      const noun = 'comment';
+      assert.equal(GrCountStringFormatter.computePluralString(0, noun), '');
+      assert.equal(GrCountStringFormatter.computePluralString(1, noun),
+          '1 comment');
+      assert.equal(GrCountStringFormatter.computePluralString(2, noun),
+          '2 comments');
+    });
+  });
+</script>
+
diff --git a/polygerrit-ui/app/elements/shared/gr-cursor-manager/gr-cursor-manager.html b/polygerrit-ui/app/elements/shared/gr-cursor-manager/gr-cursor-manager.html
index f213312..d619b18 100644
--- a/polygerrit-ui/app/elements/shared/gr-cursor-manager/gr-cursor-manager.html
+++ b/polygerrit-ui/app/elements/shared/gr-cursor-manager/gr-cursor-manager.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/shared/gr-cursor-manager/gr-cursor-manager.js b/polygerrit-ui/app/elements/shared/gr-cursor-manager/gr-cursor-manager.js
index c0ea5a8..f750cd2 100644
--- a/polygerrit-ui/app/elements/shared/gr-cursor-manager/gr-cursor-manager.js
+++ b/polygerrit-ui/app/elements/shared/gr-cursor-manager/gr-cursor-manager.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -262,13 +265,15 @@
      * @return {boolean}
      */
     _targetIsVisible(top) {
+      const dims = this._getWindowDims();
       return this.scrollBehavior === ScrollBehavior.KEEP_VISIBLE &&
-          top > window.pageYOffset &&
-          top < window.pageYOffset + window.innerHeight;
+          top > dims.pageYOffset &&
+          top < dims.pageYOffset + dims.innerHeight;
     },
 
     _calculateScrollToValue(top, target) {
-      return top - (window.innerHeight / 3) + (target.offsetHeight / 2);
+      const dims = this._getWindowDims();
+      return top - (dims.innerHeight / 3) + (target.offsetHeight / 2);
     },
 
     _scrollToTarget() {
@@ -276,6 +281,7 @@
         return;
       }
 
+      const dims = this._getWindowDims();
       const top = this._getTop(this.target);
       const bottomIsVisible = this._targetHeight ?
           this._targetIsVisible(top + this._targetHeight) : true;
@@ -286,7 +292,7 @@
         // would get scrolled to is higher up than the current position. this
         // woulld cause less of the target content to be displayed than is
         // already.
-        if (bottomIsVisible || scrollToValue < window.scrollY) {
+        if (bottomIsVisible || scrollToValue < dims.scrollY) {
           return;
         }
       }
@@ -295,7 +301,16 @@
       // instead of half the inner height feels a bit better otherwise the
       // element appears to be below the center of the window even when it
       // isn't.
-      window.scrollTo(0, scrollToValue);
+      window.scrollTo(dims.scrollX, scrollToValue);
+    },
+
+    _getWindowDims() {
+      return {
+        scrollX: window.scrollX,
+        scrollY: window.scrollY,
+        innerHeight: window.innerHeight,
+        pageYOffset: window.pageYOffset,
+      };
     },
   });
 })();
diff --git a/polygerrit-ui/app/elements/shared/gr-cursor-manager/gr-cursor-manager_test.html b/polygerrit-ui/app/elements/shared/gr-cursor-manager/gr-cursor-manager_test.html
index 5a4b8ba..adbe618 100644
--- a/polygerrit-ui/app/elements/shared/gr-cursor-manager/gr-cursor-manager_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-cursor-manager/gr-cursor-manager_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -222,17 +223,13 @@
       });
 
       test('Called when top and bottom not visible', () => {
-        sandbox.stub(element, '_targetIsVisible', () => {
-          return false;
-        });
+        sandbox.stub(element, '_targetIsVisible').returns(false);
         element._scrollToTarget();
         assert.isTrue(scrollStub.called);
       });
 
       test('Not called when top and bottom visible', () => {
-        sandbox.stub(element, '_targetIsVisible', () => {
-          return true;
-        });
+        sandbox.stub(element, '_targetIsVisible').returns(true);
         element._scrollToTarget();
         assert.isFalse(scrollStub.called);
       });
@@ -240,26 +237,44 @@
       test('Called when top is visible, bottom is not, scroll is lower', () => {
         const visibleStub = sandbox.stub(element, '_targetIsVisible',
             () => visibleStub.callCount === 2);
-        window.scrollY = 15;
-        sandbox.stub(element, '_calculateScrollToValue', () => {
-          return 20;
+        sandbox.stub(element, '_getWindowDims').returns({
+          scrollX: 123,
+          scrollY: 15,
+          innerHeight: 1000,
+          pageYOffset: 0,
         });
+        sandbox.stub(element, '_calculateScrollToValue').returns(20);
         element._scrollToTarget();
         assert.isTrue(scrollStub.called);
+        assert.isTrue(scrollStub.calledWithExactly(123, 20));
         assert.equal(visibleStub.callCount, 2);
       });
 
       test('Called when top is visible, bottom not, scroll is higher', () => {
         const visibleStub = sandbox.stub(element, '_targetIsVisible',
             () => visibleStub.callCount === 2);
-        window.scrollY = 25;
-        sandbox.stub(element, '_calculateScrollToValue', () => {
-          return 20;
+        sandbox.stub(element, '_getWindowDims').returns({
+          scrollX: 123,
+          scrollY: 25,
+          innerHeight: 1000,
+          pageYOffset: 0,
         });
+        sandbox.stub(element, '_calculateScrollToValue').returns(20);
         element._scrollToTarget();
         assert.isFalse(scrollStub.called);
         assert.equal(visibleStub.callCount, 2);
       });
+
+      test('_calculateScrollToValue', () => {
+        sandbox.stub(element, '_getWindowDims').returns({
+          scrollX: 123,
+          scrollY: 25,
+          innerHeight: 300,
+          pageYOffset: 0,
+        });
+        assert.equal(element._calculateScrollToValue(1000, {offsetHeight: 10}),
+            905);
+      });
     });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/shared/gr-date-formatter/gr-date-formatter.html b/polygerrit-ui/app/elements/shared/gr-date-formatter/gr-date-formatter.html
index 21552d9..1090fea 100644
--- a/polygerrit-ui/app/elements/shared/gr-date-formatter/gr-date-formatter.html
+++ b/polygerrit-ui/app/elements/shared/gr-date-formatter/gr-date-formatter.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -26,11 +27,12 @@
   <template>
     <style include="shared-styles">
       :host {
+        color: inherit;
         display: inline;
       }
     </style>
     <span>
-      [[_computeDateStr(dateStr, _timeFormat, _relative)]]
+      [[_computeDateStr(dateStr, _timeFormat, _relative, showDateAndTime)]]
     </span>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
   </template>
diff --git a/polygerrit-ui/app/elements/shared/gr-date-formatter/gr-date-formatter.js b/polygerrit-ui/app/elements/shared/gr-date-formatter/gr-date-formatter.js
index 65a4c68..3417a0d 100644
--- a/polygerrit-ui/app/elements/shared/gr-date-formatter/gr-date-formatter.js
+++ b/polygerrit-ui/app/elements/shared/gr-date-formatter/gr-date-formatter.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -37,6 +40,10 @@
         value: null,
         notify: true,
       },
+      showDateAndTime: {
+        type: Boolean,
+        value: false,
+      },
 
       /**
        * When true, the detailed date appears in a GR-TOOLTIP rather than in the
@@ -131,7 +138,7 @@
           diff < 180 * Duration.DAY;
     },
 
-    _computeDateStr(dateStr, timeFormat, relative) {
+    _computeDateStr(dateStr, timeFormat, relative, showDateAndTime) {
       if (!dateStr) { return ''; }
       const date = moment(util.parseDate(dateStr));
       if (!date.isValid()) { return ''; }
@@ -147,8 +154,13 @@
       let format = TimeFormats.MONTH_DAY_YEAR;
       if (this._isWithinDay(now, date)) {
         format = timeFormat;
-      } else if (this._isWithinHalfYear(now, date)) {
-        format = TimeFormats.MONTH_DAY;
+      } else {
+        if (this._isWithinHalfYear(now, date)) {
+          format = TimeFormats.MONTH_DAY;
+        }
+        if (this.showDateAndTime) {
+          format = `${format} ${timeFormat}`;
+        }
       }
       return date.format(format);
     },
diff --git a/polygerrit-ui/app/elements/shared/gr-date-formatter/gr-date-formatter_test.html b/polygerrit-ui/app/elements/shared/gr-date-formatter/gr-date-formatter_test.html
index 2c15ef6..ad4d0da 100644
--- a/polygerrit-ui/app/elements/shared/gr-date-formatter/gr-date-formatter_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-date-formatter/gr-date-formatter_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -55,7 +56,8 @@
       return d;
     }
 
-    function testDates(nowStr, dateStr, expected, expectedTooltip, done) {
+    function testDates(nowStr, dateStr, expected, expectedWithDateAndTime,
+        expectedTooltip, done) {
       // Normalize and convert the date to mimic server response.
       dateStr = normalizedDate(dateStr)
           .toJSON().replace('T', ' ').slice(0, -1);
@@ -65,6 +67,9 @@
         const span = element.$$('span');
         assert.equal(span.textContent.trim(), expected);
         assert.equal(element.title, expectedTooltip);
+        element.showDateAndTime = true;
+        flushAsynchronousOperations();
+        assert.equal(span.textContent.trim(), expectedWithDateAndTime);
         done();
       });
     }
@@ -98,25 +103,33 @@
       test('Within 24 hours on same day', done => {
         testDates('2015-07-29 20:34:14.985000000',
             '2015-07-29 15:34:14.985000000',
-            '15:34', 'Jul 29, 2015, 15:34:14', done);
+            '15:34',
+            '15:34',
+            'Jul 29, 2015, 15:34:14', done);
       });
 
       test('Within 24 hours on different days', done => {
         testDates('2015-07-29 03:34:14.985000000',
             '2015-07-28 20:25:14.985000000',
-            'Jul 28', 'Jul 28, 2015, 20:25:14', done);
+            'Jul 28',
+            'Jul 28 20:25',
+            'Jul 28, 2015, 20:25:14', done);
       });
 
       test('More than 24 hours but less than six months', done => {
         testDates('2015-07-29 20:34:14.985000000',
             '2015-06-15 03:25:14.985000000',
-            'Jun 15', 'Jun 15, 2015, 03:25:14', done);
+            'Jun 15',
+            'Jun 15 03:25',
+            'Jun 15, 2015, 03:25:14', done);
       });
 
       test('More than six months', done => {
         testDates('2015-09-15 20:34:00.000000000',
             '2015-01-15 03:25:00.000000000',
-            'Jan 15, 2015', 'Jan 15, 2015, 03:25:00', done);
+            'Jan 15, 2015',
+            'Jan 15, 2015 03:25',
+            'Jan 15, 2015, 03:25:00', done);
       });
     });
 
@@ -135,7 +148,9 @@
       test('Within 24 hours on same day', done => {
         testDates('2015-07-29 20:34:14.985000000',
             '2015-07-29 15:34:14.985000000',
-            '3:34 PM', 'Jul 29, 2015, 3:34:14 PM', done);
+            '3:34 PM',
+            '3:34 PM',
+            'Jul 29, 2015, 3:34:14 PM', done);
       });
     });
 
@@ -153,13 +168,17 @@
       test('Within 24 hours on same day', done => {
         testDates('2015-07-29 20:34:14.985000000',
             '2015-07-29 15:34:14.985000000',
-            '5 hours ago', 'Jul 29, 2015, 3:34:14 PM', done);
+            '5 hours ago',
+            '5 hours ago',
+            'Jul 29, 2015, 3:34:14 PM', done);
       });
 
       test('More than six months', done => {
         testDates('2015-09-15 20:34:00.000000000',
             '2015-01-15 03:25:00.000000000',
-            '8 months ago', 'Jan 15, 2015, 3:25:00 AM', done);
+            '8 months ago',
+            '8 months ago',
+            'Jan 15, 2015, 3:25:00 AM', done);
       });
     });
 
diff --git a/polygerrit-ui/app/elements/shared/gr-dialog/gr-dialog.html b/polygerrit-ui/app/elements/shared/gr-dialog/gr-dialog.html
new file mode 100644
index 0000000..797c8ea
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-dialog/gr-dialog.html
@@ -0,0 +1,76 @@
+<!--
+@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.
+-->
+
+<link rel="import" href="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../gr-button/gr-button.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+
+<dom-module id="gr-dialog">
+  <template>
+    <style include="shared-styles">
+      :host {
+        color: var(--primary-text-color);
+        display: block;
+        max-height: 90vh;
+      }
+      .container {
+        display: flex;
+        flex-direction: column;
+        max-height: 90vh;
+      }
+      header {
+        border-bottom: 1px solid var(--border-color);
+        flex-shrink: 0;
+        font-weight: var(--font-weight-bold);
+      }
+      main {
+        display: flex;
+        flex-shrink: 1;
+        width: 100%;
+      }
+      header,
+      main,
+      footer {
+        padding: .5em 1.5em;
+      }
+      gr-button {
+        margin-left: 1em;
+      }
+      footer {
+        display: flex;
+        flex-shrink: 0;
+        justify-content: flex-end;
+      }
+      .hidden {
+        display: none;
+      }
+    </style>
+    <div class="container" on-keydown="_handleKeydown">
+      <header><slot name="header"></slot></header>
+      <main><slot name="main"></slot></main>
+      <footer>
+        <gr-button id="cancel" class$="[[_computeCancelClass(cancelLabel)]]" link on-tap="_handleCancelTap">
+          [[cancelLabel]]
+        </gr-button>
+        <gr-button id="confirm" link primary on-tap="_handleConfirm" disabled="[[disabled]]">
+          [[confirmLabel]]
+        </gr-button>
+      </footer>
+    </div>
+  </template>
+  <script src="gr-dialog.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/shared/gr-dialog/gr-dialog.js b/polygerrit-ui/app/elements/shared/gr-dialog/gr-dialog.js
new file mode 100644
index 0000000..6163b09
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-dialog/gr-dialog.js
@@ -0,0 +1,83 @@
+/**
+ * @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.
+ */
+(function() {
+  'use strict';
+
+  Polymer({
+    is: 'gr-dialog',
+
+    /**
+     * Fired when the confirm button is pressed.
+     *
+     * @event confirm
+     */
+
+    /**
+     * Fired when the cancel button is pressed.
+     *
+     * @event cancel
+     */
+
+    properties: {
+      confirmLabel: {
+        type: String,
+        value: 'Confirm',
+      },
+      // Supplying an empty cancel label will hide the button completely.
+      cancelLabel: {
+        type: String,
+        value: 'Cancel',
+      },
+      disabled: {
+        type: Boolean,
+        value: false,
+      },
+      confirmOnEnter: {
+        type: Boolean,
+        value: false,
+      },
+    },
+
+    hostAttributes: {
+      role: 'dialog',
+    },
+
+    _handleConfirm(e) {
+      if (this.disabled) { return; }
+
+      e.preventDefault();
+      this.fire('confirm', null, {bubbles: false});
+    },
+
+    _handleCancelTap(e) {
+      e.preventDefault();
+      this.fire('cancel', null, {bubbles: false});
+    },
+
+    _handleKeydown(e) {
+      if (this.confirmOnEnter && e.keyCode === 13) { this._handleConfirm(e); }
+    },
+
+    resetFocus() {
+      this.$.confirm.focus();
+    },
+
+    _computeCancelClass(cancelLabel) {
+      return cancelLabel.length ? '' : 'hidden';
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/shared/gr-dialog/gr-dialog_test.html b/polygerrit-ui/app/elements/shared/gr-dialog/gr-dialog_test.html
new file mode 100644
index 0000000..4a5a181
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-dialog/gr-dialog_test.html
@@ -0,0 +1,91 @@
+<!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-dialog</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-dialog.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-dialog></gr-dialog>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-dialog tests', () => {
+    let element;
+    let sandbox;
+
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+      element = fixture('basic');
+    });
+
+    teardown(() => { sandbox.restore(); });
+
+    test('events', done => {
+      let numEvents = 0;
+      function handler() { if (++numEvents == 2) { done(); } }
+
+      element.addEventListener('confirm', handler);
+      element.addEventListener('cancel', handler);
+
+      MockInteractions.tap(element.$$('gr-button[primary]'));
+      MockInteractions.tap(element.$$('gr-button:not([primary])'));
+    });
+
+    test('confirmOnEnter', () => {
+      element.confirmOnEnter = false;
+      const handleConfirmStub = sandbox.stub(element, '_handleConfirm');
+      const handleKeydownSpy = sandbox.spy(element, '_handleKeydown');
+      MockInteractions.pressAndReleaseKeyOn(element.$$('main'),
+          13, null, 'enter');
+      flushAsynchronousOperations();
+
+      assert.isTrue(handleKeydownSpy.called);
+      assert.isFalse(handleConfirmStub.called);
+
+      element.confirmOnEnter = true;
+      MockInteractions.pressAndReleaseKeyOn(element.$$('main'),
+          13, null, 'enter');
+      flushAsynchronousOperations();
+
+      assert.isTrue(handleConfirmStub.called);
+    });
+
+    test('resetFocus', () => {
+      const focusStub = sandbox.stub(element.$.confirm, 'focus');
+      element.resetFocus();
+      assert.isTrue(focusStub.calledOnce);
+    });
+
+    test('empty cancel label hides cancel btn', () => {
+      assert.isFalse(isHidden(element.$.cancel));
+      element.cancelLabel = '';
+      flushAsynchronousOperations();
+
+      assert.isTrue(isHidden(element.$.cancel));
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/shared/gr-diff-preferences/gr-diff-preferences.html b/polygerrit-ui/app/elements/shared/gr-diff-preferences/gr-diff-preferences.html
new file mode 100644
index 0000000..d7bc704
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-diff-preferences/gr-diff-preferences.html
@@ -0,0 +1,163 @@
+<!--
+@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.
+-->
+
+<link rel="import" href="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../../bower_components/iron-input/iron-input.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../gr-button/gr-button.html">
+<link rel="import" href="../gr-rest-api-interface/gr-rest-api-interface.html">
+<link rel="import" href="../gr-select/gr-select.html">
+
+<dom-module id="gr-diff-preferences">
+  <template>
+    <style include="shared-styles"></style>
+    <style include="gr-form-styles"></style>
+    <div id="diffPreferences" class="gr-form-styles">
+      <section>
+        <span class="title">Context</span>
+        <span class="value">
+          <gr-select
+              id="contextSelect"
+              bind-value="{{diffPrefs.context}}">
+            <select
+                on-keypress="_handleDiffPrefsChanged"
+                on-change="_handleDiffPrefsChanged">
+              <option value="3">3 lines</option>
+              <option value="10">10 lines</option>
+              <option value="25">25 lines</option>
+              <option value="50">50 lines</option>
+              <option value="75">75 lines</option>
+              <option value="100">100 lines</option>
+              <option value="-1">Whole file</option>
+            </select>
+          </gr-select>
+        </span>
+      </section>
+      <section>
+        <span class="title">Fit to screen</span>
+        <span class="value">
+          <input
+              id="lineWrappingInput"
+              type="checkbox"
+              checked$="[[diffPrefs.line_wrapping]]"
+              on-change="_handleLineWrappingTap">
+        </span>
+      </section>
+      <section>
+        <span class="title">Diff width</span>
+        <span class="value">
+          <input
+              is="iron-input"
+              type="number"
+              id="columnsInput"
+              prevent-invalid-input
+              allowed-pattern="[0-9]"
+              bind-value="{{diffPrefs.line_length}}"
+              on-keypress="_handleDiffPrefsChanged"
+              on-change="_handleDiffPrefsChanged">
+        </span>
+      </section>
+      <section>
+        <span class="title">Tab width</span>
+        <span class="value">
+          <input
+              is="iron-input"
+              type="number"
+              id="tabSizeInput"
+              prevent-invalid-input
+              allowed-pattern="[0-9]"
+              bind-value="{{diffPrefs.tab_size}}"
+              on-keypress="_handleDiffPrefsChanged"
+              on-change="_handleDiffPrefsChanged">
+        </span>
+      </section>
+      <section hidden$="[[!diffPrefs.font_size]]">
+        <span class="title">Font size</span>
+        <span class="value">
+          <input
+              is="iron-input"
+              type="number"
+              id="fontSizeInput"
+              prevent-invalid-input
+              allowed-pattern="[0-9]"
+              bind-value="{{diffPrefs.font_size}}"
+              on-keypress="_handleDiffPrefsChanged"
+              on-change="_handleDiffPrefsChanged">
+        </span>
+      </section>
+      <section>
+        <span class="title">Show tabs</span>
+        <span class="value">
+          <input
+              id="showTabsInput"
+              type="checkbox"
+              checked$="[[diffPrefs.show_tabs]]"
+              on-change="_handleShowTabsTap">
+        </span>
+      </section>
+      <section>
+        <span class="title">Show trailing whitespace</span>
+        <span class="value">
+          <input
+              id="showTrailingWhitespaceInput"
+              type="checkbox"
+              checked$="[[diffPrefs.show_whitespace_errors]]"
+              on-change="_handleShowTrailingWhitespaceTap">
+        </span>
+      </section>
+      <section>
+        <span class="title">Syntax highlighting</span>
+        <span class="value">
+          <input
+              id="syntaxHighlightInput"
+              type="checkbox"
+              checked$="[[diffPrefs.syntax_highlighting]]"
+              on-change="_handleSyntaxHighlightTap">
+        </span>
+      </section>
+      <section>
+        <span class="title">Automatically mark viewed files reviewed</span>
+        <span class="value">
+          <input
+              id="automaticReviewInput"
+              type="checkbox"
+              checked$="[[diffPrefs.manual_review]]"
+              on-change="_handleAutomaticReviewTap">
+        </span>
+      </section>
+      <section>
+        <div class="pref">
+          <span class="title">Ignore Whitespace</span>
+          <span class="value">
+            <gr-select bind-value="{{diffPrefs.ignore_whitespace}}">
+              <select
+                  on-keypress="_handleDiffPrefsChanged"
+                  on-change="_handleDiffPrefsChanged">
+                <option value="IGNORE_NONE">None</option>
+                <option value="IGNORE_TRAILING">Trailing</option>
+                <option value="IGNORE_LEADING_AND_TRAILING">Leading & trailing</option>
+                <option value="IGNORE_ALL">All</option>
+              </select>
+            </gr-select>
+          </span>
+        </div>
+      </section>
+    </div>
+    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
+  </template>
+  <script src="gr-diff-preferences.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/shared/gr-diff-preferences/gr-diff-preferences.js b/polygerrit-ui/app/elements/shared/gr-diff-preferences/gr-diff-preferences.js
new file mode 100644
index 0000000..e2278c2
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-diff-preferences/gr-diff-preferences.js
@@ -0,0 +1,78 @@
+/**
+ * @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.
+ */
+(function() {
+  'use strict';
+
+  Polymer({
+    is: 'gr-diff-preferences',
+
+    properties: {
+      hasUnsavedChanges: {
+        type: Boolean,
+        notify: true,
+        value: false,
+      },
+
+      /** @type {?} */
+      diffPrefs: Object,
+    },
+
+    loadData() {
+      return this.$.restAPI.getDiffPreferences().then(prefs => {
+        this.diffPrefs = prefs;
+      });
+    },
+
+    _handleDiffPrefsChanged() {
+      this.hasUnsavedChanges = true;
+    },
+
+    _handleLineWrappingTap() {
+      this.set('diffPrefs.line_wrapping', this.$.lineWrappingInput.checked);
+      this._handleDiffPrefsChanged();
+    },
+
+    _handleShowTabsTap() {
+      this.set('diffPrefs.show_tabs', this.$.showTabsInput.checked);
+      this._handleDiffPrefsChanged();
+    },
+
+    _handleShowTrailingWhitespaceTap() {
+      this.set('diffPrefs.show_whitespace_errors',
+          this.$.showTrailingWhitespaceInput.checked);
+      this._handleDiffPrefsChanged();
+    },
+
+    _handleSyntaxHighlightTap() {
+      this.set('diffPrefs.syntax_highlighting',
+          this.$.syntaxHighlightInput.checked);
+      this._handleDiffPrefsChanged();
+    },
+
+    _handleAutomaticReviewTap() {
+      this.set('diffPrefs.manual_review',
+          this.$.automaticReviewInput.checked);
+      this._handleDiffPrefsChanged();
+    },
+
+    save() {
+      return this.$.restAPI.saveDiffPreferences(this.diffPrefs).then(res => {
+        this.hasUnsavedChanges = false;
+      });
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/shared/gr-diff-preferences/gr-diff-preferences_test.html b/polygerrit-ui/app/elements/shared/gr-diff-preferences/gr-diff-preferences_test.html
new file mode 100644
index 0000000..511737f
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-diff-preferences/gr-diff-preferences_test.html
@@ -0,0 +1,123 @@
+<!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-diff-preferences</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-diff-preferences.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-diff-preferences></gr-diff-preferences>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-diff-preferences tests', () => {
+    let element;
+    let sandbox;
+    let diffPreferences;
+
+    function valueOf(title, fieldsetid) {
+      const sections = element.$[fieldsetid].querySelectorAll('section');
+      let titleEl;
+      for (let i = 0; i < sections.length; i++) {
+        titleEl = sections[i].querySelector('.title');
+        if (titleEl.textContent.trim() === title) {
+          return sections[i].querySelector('.value');
+        }
+      }
+    }
+
+    setup(() => {
+      diffPreferences = {
+        context: 10,
+        line_wrapping: false,
+        line_length: 100,
+        tab_size: 8,
+        font_size: 12,
+        show_tabs: true,
+        show_whitespace_errors: true,
+        syntax_highlighting: true,
+        manual_review: false,
+        ignore_whitespace: 'IGNORE_NONE',
+      };
+
+      stub('gr-rest-api-interface', {
+        getDiffPreferences() {
+          return Promise.resolve(diffPreferences);
+        },
+      });
+
+      element = fixture('basic');
+      sandbox = sinon.sandbox.create();
+      return element.loadData();
+    });
+
+    teardown(() => { sandbox.restore(); });
+
+    test('renders', () => {
+      // Rendered with the expected preferences selected.
+      assert.equal(valueOf('Context', 'diffPreferences')
+          .firstElementChild.bindValue, diffPreferences.context);
+      assert.equal(valueOf('Fit to screen', 'diffPreferences')
+          .firstElementChild.checked, diffPreferences.line_wrapping);
+      assert.equal(valueOf('Diff width', 'diffPreferences')
+          .firstElementChild.bindValue, diffPreferences.line_length);
+      assert.equal(valueOf('Tab width', 'diffPreferences')
+          .firstElementChild.bindValue, diffPreferences.tab_size);
+      assert.equal(valueOf('Font size', 'diffPreferences')
+          .firstElementChild.bindValue, diffPreferences.font_size);
+      assert.equal(valueOf('Show tabs', 'diffPreferences')
+          .firstElementChild.checked, diffPreferences.show_tabs);
+      assert.equal(valueOf('Show trailing whitespace', 'diffPreferences')
+          .firstElementChild.checked, diffPreferences.show_whitespace_errors);
+      assert.equal(valueOf('Syntax highlighting', 'diffPreferences')
+          .firstElementChild.checked, diffPreferences.syntax_highlighting);
+      assert.equal(
+          valueOf('Automatically mark viewed files reviewed', 'diffPreferences')
+              .firstElementChild.checked, diffPreferences.manual_review);
+      assert.equal(valueOf('Ignore Whitespace', 'diffPreferences')
+          .firstElementChild.bindValue, diffPreferences.ignore_whitespace);
+
+      assert.isFalse(element.hasUnsavedChanges);
+    });
+
+    test('save changes', () => {
+      sandbox.stub(element.$.restAPI, 'saveDiffPreferences')
+          .returns(Promise.resolve());
+      const showTrailingWhitespaceCheckbox =
+          valueOf('Show trailing whitespace', 'diffPreferences')
+          .firstElementChild;
+      showTrailingWhitespaceCheckbox.checked = false;
+      element._handleShowTrailingWhitespaceTap();
+
+      assert.isTrue(element.hasUnsavedChanges);
+
+      // Save the change.
+      return element.save().then(() => {
+        assert.isFalse(element.hasUnsavedChanges);
+      });
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/shared/gr-download-commands/gr-download-commands.html b/polygerrit-ui/app/elements/shared/gr-download-commands/gr-download-commands.html
index 68c3848..6aec5a6 100644
--- a/polygerrit-ui/app/elements/shared/gr-download-commands/gr-download-commands.html
+++ b/polygerrit-ui/app/elements/shared/gr-download-commands/gr-download-commands.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,67 +15,69 @@
 limitations under the License.
 -->
 
-<link rel="import" href="../../../behaviors/rest-client-behavior/rest-client-behavior.html">
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
-<link rel="import" href="../../shared/gr-copy-clipboard/gr-copy-clipboard.html">
+
+
+<link rel="import" href="../../../behaviors/rest-client-behavior/rest-client-behavior.html">
+<link rel="import" href="../../../bower_components/paper-tabs/paper-tabs.html">
+<link rel="import" href="../../shared/gr-shell-command/gr-shell-command.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 
 <dom-module id="gr-download-commands">
   <template>
     <style include="shared-styles">
-      ul {
-        list-style: none;
+      paper-tabs {
+        height: 3rem;
         margin-bottom: .5em;
+        --paper-tabs-selection-bar-color: var(--link-color);
       }
-      li {
-        display: inline-block;
-        margin: 0;
-        padding: 0;
-      }
-      li gr-button {
-        margin-right: 1em;
+      paper-tab {
+        max-width: 15rem;
+        text-transform: uppercase;
+        --paper-tab-ink: var(--link-color);
       }
       label,
       input {
         display: block;
       }
       label {
-        font-family: var(--font-family-bold);
-      }
-      li[selected] gr-button {
-        color: #000;
-        font-family: var(--font-family-bold);
-        text-decoration: none;
+        font-weight: var(--font-weight-bold);
       }
       .schemes {
         display: flex;
         justify-content: space-between;
       }
       .commands {
-        border-bottom: 1px solid #ddd;
-        border-top: 1px solid #ddd;
-        padding: .5em;
+        display: flex;
+        flex-direction: column;
+      }
+      gr-shell-command {
+        width: 60em;
+        margin-bottom: .5em;
+      }
+      .hidden {
+        display: none;
       }
     </style>
     <div class="schemes">
-      <ul hidden$="[[!schemes.length]]" hidden>
+      <paper-tabs
+          id="downloadTabs"
+          class$="[[_computeShowTabs(schemes)]]"
+          selected="[[_computeSelected(schemes, selectedScheme)]]"
+          on-selected-changed="_handleTabChange">
         <template is="dom-repeat" items="[[schemes]]" as="scheme">
-          <li selected$="[[_computeSelected(scheme, selectedScheme)]]">
-            <gr-button link data-scheme$="[[scheme]]" on-tap="_handleSchemeTap">
-              [[scheme]]
-            </gr-button>
-          </li>
+          <paper-tab data-scheme$="[[scheme]]">[[scheme]]</paper-tab>
         </template>
-      </ul>
+      </paper-tabs>
     </div>
     <div class="commands" hidden$="[[!schemes.length]]" hidden>
       <template is="dom-repeat"
           items="[[commands]]"
           as="command">
-        <gr-copy-clipboard
-            title=[[command.title]]
-            text=[[command.command]]></gr-copy-clipboard>
+        <gr-shell-command
+            label=[[command.title]]
+            command=[[command.command]]></gr-shell-command>
       </template>
     </div>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
diff --git a/polygerrit-ui/app/elements/shared/gr-download-commands/gr-download-commands.js b/polygerrit-ui/app/elements/shared/gr-download-commands/gr-download-commands.js
index f2f218b..ca77a30 100644
--- a/polygerrit-ui/app/elements/shared/gr-download-commands/gr-download-commands.js
+++ b/polygerrit-ui/app/elements/shared/gr-download-commands/gr-download-commands.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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';
 
@@ -41,7 +44,7 @@
     },
 
     focusOnCopy() {
-      this.$$('gr-copy-clipboard').focusOnCopy();
+      this.$$('gr-shell-command').focusOnCopy();
     },
 
     _getLoggedIn() {
@@ -58,17 +61,24 @@
       });
     },
 
-    _computeSelected(item, selectedItem) {
-      return item === selectedItem;
+    _handleTabChange(e) {
+      const scheme = this.schemes[e.detail.value];
+      if (scheme && scheme !== this.selectedScheme) {
+        this.set('selectedScheme', scheme);
+        if (this._loggedIn) {
+          this.$.restAPI.savePreferences(
+              {download_scheme: this.selectedScheme});
+        }
+      }
     },
 
-    _handleSchemeTap(e) {
-      e.preventDefault();
-      const el = Polymer.dom(e).localTarget;
-      this.selectedScheme = el.getAttribute('data-scheme');
-      if (this._loggedIn) {
-        this.$.restAPI.savePreferences({download_scheme: this.selectedScheme});
-      }
+    _computeSelected(schemes, selectedScheme) {
+      return (schemes.findIndex(scheme => scheme === selectedScheme) || 0)
+          + '';
+    },
+
+    _computeShowTabs(schemes) {
+      return schemes.length > 1 ? '' : 'hidden';
     },
   });
 })();
diff --git a/polygerrit-ui/app/elements/shared/gr-download-commands/gr-download-commands_test.html b/polygerrit-ui/app/elements/shared/gr-download-commands/gr-download-commands_test.html
index 41ef8f3..c59e56a 100644
--- a/polygerrit-ui/app/elements/shared/gr-download-commands/gr-download-commands_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-download-commands/gr-download-commands_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -73,37 +74,28 @@
       });
 
       test('focusOnCopy', () => {
-        const focusStub = sandbox.stub(element.$$('gr-copy-clipboard'),
+        const focusStub = sandbox.stub(element.$$('gr-shell-command'),
             'focusOnCopy');
         element.focusOnCopy();
         assert.isTrue(focusStub.called);
       });
 
       test('element visibility', () => {
-        assert.isFalse(element.$$('ul').hasAttribute('hidden'));
-        assert.isFalse(element.$$('.commands').hasAttribute('hidden'));
+        assert.isFalse(isHidden(element.$$('paper-tabs')));
+        assert.isFalse(isHidden(element.$$('.commands')));
 
         element.schemes = [];
-        assert.isTrue(element.$$('ul').hasAttribute('hidden'));
-        assert.isTrue(element.$$('.commands').hasAttribute('hidden'));
+        assert.isTrue(isHidden(element.$$('paper-tabs')));
+        assert.isTrue(isHidden(element.$$('.commands')));
       });
 
       test('tab selection', () => {
-        flushAsynchronousOperations();
-        let el = element.$$('[data-scheme="http"]').parentElement;
-        assert.isTrue(el.hasAttribute('selected'));
-        for (const scheme of ['repo', 'ssh']) {
-          const el = element.$$('[data-scheme="' + scheme + '"]').parentElement;
-          assert.isFalse(el.hasAttribute('selected'));
-        }
-
+        assert.equal(element.$.downloadTabs.selected, '0');
         MockInteractions.tap(element.$$('[data-scheme="ssh"]'));
-        el = element.$$('[data-scheme="ssh"]').parentElement;
-        assert.isTrue(el.hasAttribute('selected'));
-        for (const scheme of ['http', 'repo']) {
-          const el = element.$$('[data-scheme="' + scheme + '"]').parentElement;
-          assert.isFalse(el.hasAttribute('selected'));
-        }
+        flushAsynchronousOperations();
+
+        assert.equal(element.selectedScheme, 'ssh');
+        assert.equal(element.$.downloadTabs.selected, '2');
       });
 
       test('loads scheme from preferences', done => {
@@ -135,18 +127,18 @@
 
       test('saves scheme to preferences', () => {
         element._loggedIn = true;
-        const savePrefsStub = sinon.stub(element.$.restAPI, 'savePreferences',
+        const savePrefsStub = sandbox.stub(element.$.restAPI, 'savePreferences',
             () => { return Promise.resolve(); });
 
         flushAsynchronousOperations();
 
-        const firstSchemeButton = element.$$('li gr-button[data-scheme]');
+        const repoTab = element.$$('paper-tab[data-scheme="repo"]');
 
-        MockInteractions.tap(firstSchemeButton);
+        MockInteractions.tap(repoTab);
 
         assert.isTrue(savePrefsStub.called);
         assert.equal(savePrefsStub.lastCall.args[0].download_scheme,
-            firstSchemeButton.getAttribute('data-scheme'));
+            repoTab.getAttribute('data-scheme'));
       });
     });
   });
diff --git a/polygerrit-ui/app/elements/shared/gr-dropdown-list/gr-dropdown-list.html b/polygerrit-ui/app/elements/shared/gr-dropdown-list/gr-dropdown-list.html
index 0916a89..f4b120a 100644
--- a/polygerrit-ui/app/elements/shared/gr-dropdown-list/gr-dropdown-list.html
+++ b/polygerrit-ui/app/elements/shared/gr-dropdown-list/gr-dropdown-list.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -31,7 +32,7 @@
       :host {
         display: inline-block;
       }
-      #trigger {
+      #triggerText {
         -moz-user-select: text;
         -ms-user-select: text;
         -webkit-user-select: text;
@@ -42,12 +43,12 @@
         padding: 0;
       }
       .dropdown-content {
-        background-color: #fff;
+        background-color: var(--dropdown-background-color);
         box-shadow: 0 1px 5px rgba(0, 0, 0, .3);
         max-height: 70vh;
-        margin-top: 1.5em;
+        margin-top: 2em;
         min-width: 266px;
-        max-width: 300px;
+        @apply --dropdown-content-style
       }
       paper-listbox {
         --paper-listbox: {
@@ -57,36 +58,40 @@
       paper-item {
         cursor: pointer;
         flex-direction: column;
-        font-size: 1em;
+        font-size: var(--font-size-normal);
         --paper-item: {
           min-height: 0;
           padding: 10px 16px;
         }
-        --paper-item-selected: {
-          background-color: rgba(161,194,250,.12);
-        }
         --paper-item-focused-before: {
-          background-color: #f2f2f2;
+          background-color: var(--selection-background-color);
         }
         --paper-item-focused: {
-          background-color: #f2f2f2;
+          background-color: var(--selection-background-color);
         }
       }
-      paper-item:not(:last-of-type) {
-        border-bottom: 1px solid #ddd;
+      paper-item:hover {
+        background-color: var(--hover-background-color);
       }
-      #trigger {
-        padding: .3em 0;
+      paper-item:not(:last-of-type) {
+        border-bottom: 1px solid var(--border-color);
       }
       .bottomContent {
-        color: rgba(0,0,0,.54);
-        font-size: .9em;
-        line-height: 16px;
+        color: var(--deemphasized-text-color);
+        /*
+         * Should be 16px when the base font size is 13px (browser default of
+         * 16px.
+         */
+        line-height: 1.37rem;
       }
       .bottomContent,
       .topContent {
         display: flex;
-        line-height: 16px;
+        /*
+         * Should be 16px when the base font size is 13px (browser default of
+         * 16px.
+         */
+        line-height: 1.37rem;
         justify-content: space-between;
         flex-direction: row;
         width: 100%;
@@ -95,11 +100,11 @@
         --gr-button: {
           @apply --trigger-style;
         }
-        --gr-button-hover-color: var(--trigger-hover-color);
       }
       gr-date-formatter {
-        color: rgba(0,0,0,.54);
+        color: var(--deemphasized-text-color);
         margin-left: 2em;
+        white-space: nowrap;
       }
       gr-select {
         display: none;
@@ -109,6 +114,7 @@
        dropdown content as if it is tapping whatever content is underneath it.
        The next two styles allow this to happen. */
       iron-dropdown {
+        max-width: none;
         pointer-events: none;
       }
       paper-listbox {
@@ -117,13 +123,14 @@
       @media only screen and (max-width: 50em) {
         gr-select {
           display: inline;
+          @apply --gr-select-style;
         }
         gr-button,
         iron-dropdown {
           display: none;
         }
         select {
-          max-width: 5.25em;
+          @apply --native-select-style;
         }
       }
     </style>
@@ -134,7 +141,7 @@
         class="dropdown-trigger"
         on-tap="_showDropdownTapHandler"
         slot="dropdown-trigger">
-      <span>[[text]]</span>
+      <span id="triggerText">[[text]]</span>
     </gr-button>
     <iron-dropdown
         id="dropdown"
@@ -147,24 +154,26 @@
           attr-for-selected="value"
           selected="{{value}}"
           on-tap="_handleDropdownTap">
-        <template is="dom-repeat" items="[[items]]">
-            <paper-item
-                disabled="[[item.disabled]]"
-                value="[[item.value]]">
-              <div class="topContent">
-                <div>[[item.text]]</div>
-                <template is="dom-if" if="[[item.date]]">
-                    <gr-date-formatter
-                        date-str="[[item.date]]"></gr-date-formatter>
-                </template>
-              </div>
-              <template is="dom-if" if="[[item.bottomText]]">
-                <div class="bottomContent">
-                  <div>[[item.bottomText]]</div>
-                </div>
+        <template is="dom-repeat"
+            items="[[items]]"
+            initial-count="[[initialCount]]">
+          <paper-item
+              disabled="[[item.disabled]]"
+              value="[[item.value]]">
+            <div class="topContent">
+              <div>[[item.text]]</div>
+              <template is="dom-if" if="[[item.date]]">
+                  <gr-date-formatter
+                      date-str="[[item.date]]"></gr-date-formatter>
               </template>
+            </div>
+            <template is="dom-if" if="[[item.bottomText]]">
+              <div class="bottomContent">
+                <div>[[item.bottomText]]</div>
+              </div>
+            </template>
           </paper-item>
-          </template>
+        </template>
       </paper-listbox>
     </iron-dropdown>
     <gr-select bind-value="{{value}}">
diff --git a/polygerrit-ui/app/elements/shared/gr-dropdown-list/gr-dropdown-list.js b/polygerrit-ui/app/elements/shared/gr-dropdown-list/gr-dropdown-list.js
index 8f6a763..40d8811 100644
--- a/polygerrit-ui/app/elements/shared/gr-dropdown-list/gr-dropdown-list.js
+++ b/polygerrit-ui/app/elements/shared/gr-dropdown-list/gr-dropdown-list.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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';
 
@@ -54,6 +57,7 @@
      */
 
     properties: {
+      initialCount: Number,
       /** @type {!Array<!Defs.item>} */
       items: Object,
       text: String,
diff --git a/polygerrit-ui/app/elements/shared/gr-dropdown-list/gr-dropdown-list_test.html b/polygerrit-ui/app/elements/shared/gr-dropdown-list/gr-dropdown-list_test.html
index d3c6d83..87fd8de 100644
--- a/polygerrit-ui/app/elements/shared/gr-dropdown-list/gr-dropdown-list_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-dropdown-list/gr-dropdown-list_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/shared/gr-dropdown/gr-dropdown.html b/polygerrit-ui/app/elements/shared/gr-dropdown/gr-dropdown.html
index b821909..47ab03a 100644
--- a/polygerrit-ui/app/elements/shared/gr-dropdown/gr-dropdown.html
+++ b/polygerrit-ui/app/elements/shared/gr-dropdown/gr-dropdown.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -21,6 +22,7 @@
 <link rel="import" href="../../shared/gr-button/gr-button.html">
 <link rel="import" href="../../shared/gr-cursor-manager/gr-cursor-manager.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
+<link rel="import" href="../../shared/gr-tooltip-content/gr-tooltip-content.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 
 <dom-module id="gr-dropdown">
@@ -34,40 +36,40 @@
         width: 100%;
       }
       .dropdown-content {
-        background-color: #fff;
+        background-color: var(--dropdown-background-color);
         box-shadow: 0 1px 5px rgba(0, 0, 0, .3);
       }
-      button {
-        background: none;
-        border: none;
-        font: inherit;
-        padding: .3em 0;
+      gr-button {
+        @apply --gr-button;
       }
       gr-avatar {
         height: 2em;
         width: 2em;
         vertical-align: middle;
       }
-      gr-button[link] {
-        padding: 0.5em;
-      }
       gr-button[link]:focus {
         outline: 5px auto -webkit-focus-ring-color;
       }
       ul {
         list-style: none;
       }
-      ul .accountName {
-        font-family: var(--font-family-bold);
+      .topContent,
+      li {
+        border-bottom: 1px solid var(--border-color);
       }
-      li .accountInfo,
+      li:last-of-type {
+        border: none;
+      }
       li .itemAction {
         cursor: pointer;
         display: block;
         padding: .85em 1em;
       }
+      li .itemAction {
+        @apply --gr-dropdown-item;
+      }
       li .itemAction.disabled {
-        color: #ccc;
+        color: var(--deemphasized-text-color);
         cursor: default;
       }
       li .itemAction:link,
@@ -75,28 +77,32 @@
         text-decoration: none;
       }
       li .itemAction:not(.disabled):hover {
-        background-color: #6B82D6;
-        color: #fff;
+        background-color: var(--hover-background-color);
       }
       li:focus,
       li.selected {
-        background-color: #EBF5FB;
+        background-color: var(--selection-background-color);
         outline: none;
       }
+      li:focus .itemAction,
+      li.selected .itemAction {
+        background-color: transparent;
+      }
       .topContent {
         display: block;
         padding: .85em 1em;
+        @apply --gr-dropdown-item;
       }
       .bold-text {
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
       }
     </style>
     <gr-button
         link="[[link]]"
         class="dropdown-trigger" id="trigger"
         down-arrow="[[downArrow]]"
-        on-tap="_showDropdownTapHandler">
-      <content></content>
+        on-tap="_dropdownTriggerTapHandler">
+      <slot></slot>
     </gr-button>
     <iron-dropdown id="dropdown"
         vertical-align="top"
@@ -127,19 +133,24 @@
               as="link"
               initial-count="75">
             <li tabindex="-1">
-              <span
-                  class$="itemAction [[_computeDisabledClass(link.id, disabledIds.*)]]"
-                  data-id$="[[link.id]]"
-                  on-tap="_handleItemTap"
-                  hidden$="[[link.url]]"
-                  tabindex="-1">[[link.name]]</span>
-              <a
-                  class="itemAction"
-                  href$="[[_computeLinkURL(link)]]"
-                  rel$="[[_computeLinkRel(link)]]"
-                  target$="[[link.target]]"
-                  hidden$="[[!link.url]]"
-                  tabindex="-1">[[link.name]]</a>
+              <gr-tooltip-content
+                  has-tooltip="[[_computeHasTooltip(link.tooltip)]]"
+                  title$="[[link.tooltip]]">
+                <span
+                    class$="itemAction [[_computeDisabledClass(link.id, disabledIds.*)]]"
+                    data-id$="[[link.id]]"
+                    on-tap="_handleItemTap"
+                    hidden$="[[link.url]]"
+                    tabindex="-1">[[link.name]]</span>
+                <a
+                    class="itemAction"
+                    href$="[[_computeLinkURL(link)]]"
+                    download$="[[_computeIsDownload(link)]]"
+                    rel$="[[_computeLinkRel(link)]]"
+                    target$="[[link.target]]"
+                    hidden$="[[!link.url]]"
+                    tabindex="-1">[[link.name]]</a>
+              </gr-tooltip-content>
             </li>
           </template>
         </ul>
diff --git a/polygerrit-ui/app/elements/shared/gr-dropdown/gr-dropdown.js b/polygerrit-ui/app/elements/shared/gr-dropdown/gr-dropdown.js
index 49e5a5e..3d9d36b 100644
--- a/polygerrit-ui/app/elements/shared/gr-dropdown/gr-dropdown.js
+++ b/polygerrit-ui/app/elements/shared/gr-dropdown/gr-dropdown.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -150,19 +153,21 @@
      * @param {!Event} e
      */
     _handleDropdownTap(e) {
-      // async is needed so that that the click event is fired before the
-      // dropdown closes (This was a bug for touch devices).
-      this.async(() => {
-        this.$.dropdown.close();
-      }, 1);
+      this._close();
     },
 
     /**
      * Hanlde a click on the button to open the dropdown.
      * @param {!Event} e
      */
-    _showDropdownTapHandler(e) {
-      this._open();
+    _dropdownTriggerTapHandler(e) {
+      e.preventDefault();
+      e.stopPropagation();
+      if (this.$.dropdown.opened) {
+        this._close();
+      } else {
+        this._open();
+      }
     },
 
     /**
@@ -175,6 +180,14 @@
       this.$.cursor.target.focus();
     },
 
+    _close() {
+      // async is needed so that that the click event is fired before the
+      // dropdown closes (This was a bug for touch devices).
+      this.async(() => {
+        this.$.dropdown.close();
+      }, 1);
+    },
+
     /**
      * Get the class for a top-content item based on the given boolean.
      * @param {boolean} bold Whether the item is bold.
@@ -216,7 +229,7 @@
       if (typeof link.url === 'undefined') {
         return '';
       }
-      if (link.target) {
+      if (link.target || !link.url.startsWith('/')) {
         return link.url;
       }
       return this._computeRelativeURL(link.url);
@@ -269,5 +282,13 @@
       Polymer.dom.flush();
       this._listElements = Polymer.dom(this.root).querySelectorAll('li');
     },
+
+    _computeHasTooltip(tooltip) {
+      return !!tooltip;
+    },
+
+    _computeIsDownload(link) {
+      return !!link.download;
+    },
   });
 })();
diff --git a/polygerrit-ui/app/elements/shared/gr-dropdown/gr-dropdown_test.html b/polygerrit-ui/app/elements/shared/gr-dropdown/gr-dropdown_test.html
index ab31f7c..7bb4dce 100644
--- a/polygerrit-ui/app/elements/shared/gr-dropdown/gr-dropdown_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-dropdown/gr-dropdown_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -48,11 +49,19 @@
       sandbox.restore();
     });
 
-    test('tap on trigger opens menu', () => {
+    test('_computeIsDownload', () => {
+      assert.isTrue(element._computeIsDownload({download: true}));
+      assert.isFalse(element._computeIsDownload({download: false}));
+    });
+
+    test('tap on trigger opens menu, then closes', () => {
       sandbox.stub(element, '_open', () => { element.$.dropdown.open(); });
+      sandbox.stub(element, '_close', () => { element.$.dropdown.close(); });
       assert.isFalse(element.$.dropdown.opened);
       MockInteractions.tap(element.$.trigger);
       assert.isTrue(element.$.dropdown.opened);
+      MockInteractions.tap(element.$.trigger);
+      assert.isFalse(element.$.dropdown.opened);
     });
 
     test('_computeURLHelper', () => {
@@ -64,6 +73,12 @@
 
     test('link URLs', () => {
       assert.equal(
+          element._computeLinkURL({url: 'http://example.com/test'}),
+          'http://example.com/test');
+      assert.equal(
+          element._computeLinkURL({url: 'https://example.com/test'}),
+          'https://example.com/test');
+      assert.equal(
           element._computeLinkURL({url: '/test'}),
           '//' + window.location.host + '/test');
       assert.equal(
@@ -130,6 +145,21 @@
       assert.isFalse(tapped.called);
     });
 
+    test('properly sets tooltips', () => {
+      element.items = [
+        {name: 'item one', id: 'foo', tooltip: 'hello'},
+        {name: 'item two', id: 'bar'},
+      ];
+      element.disabledIds = [];
+      flushAsynchronousOperations();
+      const tooltipContents = Polymer.dom(element.root)
+          .querySelectorAll('iron-dropdown li gr-tooltip-content');
+      assert.equal(tooltipContents.length, 2);
+      assert.isTrue(tooltipContents[0].hasTooltip);
+      assert.equal(tooltipContents[0].getAttribute('title'), 'hello');
+      assert.isFalse(tooltipContents[1].hasTooltip);
+    });
+
     suite('keyboard navigation', () => {
       setup(() => {
         element.items = [
diff --git a/polygerrit-ui/app/elements/shared/gr-editable-content/gr-editable-content.html b/polygerrit-ui/app/elements/shared/gr-editable-content/gr-editable-content.html
index e8c8037..6cd87f5 100644
--- a/polygerrit-ui/app/elements/shared/gr-editable-content/gr-editable-content.html
+++ b/polygerrit-ui/app/elements/shared/gr-editable-content/gr-editable-content.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,6 +18,7 @@
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
 <link rel="import" href="../../../bower_components/iron-autogrow-textarea/iron-autogrow-textarea.html">
 <link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../gr-storage/gr-storage.html">
 
 <dom-module id="gr-editable-content">
   <template>
@@ -42,7 +44,7 @@
       }
     </style>
     <div hidden$="[[editing]]">
-      <content></content>
+      <slot></slot>
     </div>
     <div class="editor" hidden$="[[!editing]]">
       <iron-autogrow-textarea
@@ -58,6 +60,7 @@
             disabled="[[disabled]]">Cancel</gr-button>
       </div>
     </div>
+    <gr-storage id="storage"></gr-storage>
   </template>
   <script src="gr-editable-content.js"></script>
 </dom-module>
diff --git a/polygerrit-ui/app/elements/shared/gr-editable-content/gr-editable-content.js b/polygerrit-ui/app/elements/shared/gr-editable-content/gr-editable-content.js
index e6ea72d..f567d39 100644
--- a/polygerrit-ui/app/elements/shared/gr-editable-content/gr-editable-content.js
+++ b/polygerrit-ui/app/elements/shared/gr-editable-content/gr-editable-content.js
@@ -1,19 +1,25 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
+  const RESTORED_MESSAGE = 'Content restored from a previous edit.';
+  const STORAGE_DEBOUNCE_INTERVAL_MS = 400;
+
   Polymer({
     is: 'gr-editable-content',
 
@@ -29,6 +35,12 @@
      * @event editable-content-cancel
      */
 
+    /**
+     * Fired when content is restored from storage.
+     *
+     * @event show-alert
+     */
+
     properties: {
       content: {
         notify: true,
@@ -45,24 +57,56 @@
         value: false,
       },
       removeZeroWidthSpace: Boolean,
+      // If no storage key is provided, content is not stored.
+      storageKey: String,
       _saveDisabled: {
         computed: '_computeSaveDisabled(disabled, content, _newContent)',
         type: Boolean,
         value: true,
       },
-      _newContent: String,
+      _newContent: {
+        type: String,
+        observer: '_newContentChanged',
+      },
     },
 
     focusTextarea() {
       this.$$('iron-autogrow-textarea').textarea.focus();
     },
 
+    _newContentChanged(newContent, oldContent) {
+      if (!this.storageKey) { return; }
+
+      this.debounce('store', () => {
+        if (newContent.length) {
+          this.$.storage.setEditableContentItem(this.storageKey, newContent);
+        } else {
+          this.$.storage.eraseEditableContentItem(this.storageKey);
+        }
+      }, STORAGE_DEBOUNCE_INTERVAL_MS);
+    },
+
     _editingChanged(editing) {
       if (!editing) { return; }
 
+      let content;
+      if (this.storageKey) {
+        const storedContent =
+            this.$.storage.getEditableContentItem(this.storageKey);
+        if (storedContent && storedContent.message) {
+          content = storedContent.message;
+          this.dispatchEvent(new CustomEvent('show-alert',
+              {detail: {message: RESTORED_MESSAGE}, bubbles: true}));
+        }
+      }
+      if (!content) {
+        content = this.content || '';
+      }
+
       // TODO(wyatta) switch linkify sequence, see issue 5526.
       this._newContent = this.removeZeroWidthSpace ?
-          this.content.replace(/^R=\u200B/gm, 'R=') : this.content;
+          content.replace(/^R=\u200B/gm, 'R=') :
+          content;
     },
 
     _computeSaveDisabled(disabled, content, newContent) {
diff --git a/polygerrit-ui/app/elements/shared/gr-editable-content/gr-editable-content_test.html b/polygerrit-ui/app/elements/shared/gr-editable-content/gr-editable-content_test.html
index d8e5b21..cc44d9b 100644
--- a/polygerrit-ui/app/elements/shared/gr-editable-content/gr-editable-content_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-editable-content/gr-editable-content_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -36,11 +37,15 @@
 <script>
   suite('gr-editable-content tests', () => {
     let element;
+    let sandbox;
 
     setup(() => {
       element = fixture('basic');
+      sandbox = sinon.sandbox.create();
     });
 
+    teardown(() => { sandbox.restore(); });
+
     test('save event', done => {
       element._newContent = 'foo';
       element.addEventListener('editable-content-save', e => {
@@ -94,5 +99,57 @@
         assert.isFalse(element.$$('gr-button[primary]').disabled);
       });
     });
+
+    suite('storageKey and related behavior', () => {
+      let dispatchSpy;
+      setup(() => {
+        element.content = 'current content';
+        element.storageKey = 'test';
+        dispatchSpy = sandbox.spy(element, 'dispatchEvent');
+      });
+
+      test('editing toggled to true, has stored data', () => {
+        sandbox.stub(element.$.storage, 'getEditableContentItem')
+            .returns({message: 'stored content'});
+        element.editing = true;
+
+        assert.equal(element._newContent, 'stored content');
+        assert.isTrue(dispatchSpy.called);
+        assert.equal(dispatchSpy.lastCall.args[0].type, 'show-alert');
+      });
+
+      test('editing toggled to true, has no stored data', () => {
+        sandbox.stub(element.$.storage, 'getEditableContentItem')
+            .returns({});
+        element.editing = true;
+
+        assert.equal(element._newContent, 'current content');
+        assert.isFalse(dispatchSpy.called);
+      });
+
+      test('edits are cached', () => {
+        const storeStub =
+            sandbox.stub(element.$.storage, 'setEditableContentItem');
+        const eraseStub =
+            sandbox.stub(element.$.storage, 'eraseEditableContentItem');
+        element.editing = true;
+
+        element._newContent = 'new content';
+        flushAsynchronousOperations();
+        element.flushDebouncer('store');
+
+        assert.isTrue(storeStub.called);
+        assert.deepEqual(
+            [element.storageKey, element._newContent],
+            storeStub.lastCall.args);
+
+        element._newContent = '';
+        flushAsynchronousOperations();
+        element.flushDebouncer('store');
+
+        assert.isTrue(eraseStub.called);
+        assert.deepEqual([element.storageKey], eraseStub.lastCall.args);
+      });
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/shared/gr-editable-label/gr-editable-label.html b/polygerrit-ui/app/elements/shared/gr-editable-label/gr-editable-label.html
index ef78f3a..ddc35bf 100644
--- a/polygerrit-ui/app/elements/shared/gr-editable-label/gr-editable-label.html
+++ b/polygerrit-ui/app/elements/shared/gr-editable-label/gr-editable-label.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -38,28 +39,30 @@
         font: inherit;
       }
       label {
-        color: #777;
+        color: var(--deemphasized-text-color);
         display: inline-block;
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
         overflow: hidden;
         text-overflow: ellipsis;
         white-space: nowrap;
+        @apply --label-style;
       }
       label.editable {
-        color: var(--color-link);
+        color: var(--link-color);
         cursor: pointer;
       }
       #dropdown {
         box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px;
       }
       .inputContainer {
+        background-color: var(--dialog-background-color);
         padding: .8em;
-        background-color: #fff;
+        @apply --input-style;
       }
       .buttons {
         display: flex;
-        padding-top: 1.2em;
         justify-content: flex-end;
+        padding-top: 1.2em;
         width: 100%;
       }
       .buttons gr-button {
@@ -71,8 +74,9 @@
           min-width: 15em;
         }
         --paper-input-container-input: {
-          font-size: 1em;
+          font-size: var(--font-size-normal);
         }
+        --paper-input-container-focus-color: var(--link-color);
       }
     </style>
       <label
@@ -90,6 +94,7 @@
             <paper-input
                 id="input"
                 label="[[labelText]]"
+                maxlength="[[maxLength]]"
                 value="{{_inputText}}"></paper-input>
             <div class="buttons">
               <gr-button link id="cancelBtn" on-tap="_cancel">cancel</gr-button>
diff --git a/polygerrit-ui/app/elements/shared/gr-editable-label/gr-editable-label.js b/polygerrit-ui/app/elements/shared/gr-editable-label/gr-editable-label.js
index af06291..3514492 100644
--- a/polygerrit-ui/app/elements/shared/gr-editable-label/gr-editable-label.js
+++ b/polygerrit-ui/app/elements/shared/gr-editable-label/gr-editable-label.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -51,6 +54,7 @@
         reflectToAttribute: true,
         value: false,
       },
+      maxLength: Number,
       _inputText: String,
       // This is used to push the iron-input element up on the page, so
       // the input is placed in approximately the same position as the
@@ -88,13 +92,19 @@
 
     _showDropdown() {
       if (this.readOnly || this.editing) { return; }
-      this._open().then(() => {
+      return this._open().then(() => {
         this.$.input.$.input.focus();
         if (!this.$.input.value) { return; }
         this.$.input.$.input.setSelectionRange(0, this.$.input.value.length);
       });
     },
 
+    open() {
+      return this._open().then(() => {
+        this.$.input.$.input.focus();
+      });
+    },
+
     _open(...args) {
       this.$.dropdown.open();
       this._inputText = this.value;
@@ -114,7 +124,7 @@
       let iters = 0;
       const step = () => {
         this.async(() => {
-          if (this.style.display !== 'none') {
+          if (this.$.dropdown.style.display !== 'none') {
             fn.call(this);
           } else if (iters++ < AWAIT_MAX_ITERS) {
             step.call(this);
diff --git a/polygerrit-ui/app/elements/shared/gr-editable-label/gr-editable-label_test.html b/polygerrit-ui/app/elements/shared/gr-editable-label/gr-editable-label_test.html
index ec5b64a..6815173 100644
--- a/polygerrit-ui/app/elements/shared/gr-editable-label/gr-editable-label_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-editable-label/gr-editable-label_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -76,14 +77,17 @@
       assert.isFalse(element.$.dropdown.opened);
       assert.isTrue(label.classList.contains('editable'));
       assert.equal(label.textContent, 'value text');
+      const focusSpy = sandbox.spy(element.$.input.$.input, 'focus');
+      const showSpy = sandbox.spy(element, '_showDropdown');
 
       MockInteractions.tap(label);
 
-      Polymer.dom.flush();
-
-      // The dropdown is open (which covers up the label):
-      assert.isTrue(element.$.dropdown.opened);
-      assert.equal(input.value, 'value text');
+      return showSpy.lastCall.returnValue.then(() => {
+        // The dropdown is open (which covers up the label):
+        assert.isTrue(element.$.dropdown.opened);
+        assert.isTrue(focusSpy.called);
+        assert.equal(input.value, 'value text');
+      });
     });
 
     test('title with placeholder', done => {
diff --git a/polygerrit-ui/app/elements/shared/gr-fixed-panel/gr-fixed-panel.html b/polygerrit-ui/app/elements/shared/gr-fixed-panel/gr-fixed-panel.html
index a1c80ae..674ff97 100644
--- a/polygerrit-ui/app/elements/shared/gr-fixed-panel/gr-fixed-panel.html
+++ b/polygerrit-ui/app/elements/shared/gr-fixed-panel/gr-fixed-panel.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -43,7 +44,7 @@
       }
     </style>
     <header id="header" class$="[[_computeHeaderClass(_headerFloating, _topLast)]]">
-      <content></content>
+      <slot></slot>
     </header>
   </template>
   <script src="gr-fixed-panel.js"></script>
diff --git a/polygerrit-ui/app/elements/shared/gr-fixed-panel/gr-fixed-panel.js b/polygerrit-ui/app/elements/shared/gr-fixed-panel/gr-fixed-panel.js
index f4f1a93..2c32709 100644
--- a/polygerrit-ui/app/elements/shared/gr-fixed-panel/gr-fixed-panel.js
+++ b/polygerrit-ui/app/elements/shared/gr-fixed-panel/gr-fixed-panel.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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';
 
@@ -90,10 +93,6 @@
       ].join(' ');
     },
 
-    _getScrollY() {
-      return window.scrollY;
-    },
-
     unfloat() {
       if (this.floatingDisabled) {
         return;
@@ -124,26 +123,29 @@
       this._reposition();
     },
 
+    _getElementTop() {
+      return this.getBoundingClientRect().top;
+    },
+
     _reposition() {
       if (!this._headerFloating) {
         return;
       }
       const header = this.$.header;
-      const scrollY = this._topInitial - this._getScrollY();
+      // Since the outer element is relative positioned, can  use its top
+      // to determine how to position the inner header element.
+      const elemTop = this._getElementTop();
       let newTop;
-      if (this.keepOnScroll) {
-        if (scrollY > 0) {
-          // Reposition to imitate natural scrolling.
-          newTop = scrollY;
-        } else {
-          newTop = 0;
-        }
-      } else if (scrollY > -this._headerHeight ||
-          this._topLast < -this._headerHeight) {
-        // Allow to scroll away, but ignore when far behind the edge.
-        newTop = scrollY;
+      if (this.keepOnScroll && elemTop < 0) {
+        // Should stick to the top.
+        newTop = 0;
       } else {
-        newTop = -this._headerHeight;
+        // Keep in line with the outer element.
+        newTop = elemTop;
+      }
+      // Initialize top style if it doesn't exist yet.
+      if (!header.style.top && this._topLast === newTop) {
+        header.style.top = newTop;
       }
       if (this._topLast !== newTop) {
         if (newTop === undefined) {
diff --git a/polygerrit-ui/app/elements/shared/gr-fixed-panel/gr-fixed-panel_test.html b/polygerrit-ui/app/elements/shared/gr-fixed-panel/gr-fixed-panel_test.html
index 408b7c9..9eac7f7 100644
--- a/polygerrit-ui/app/elements/shared/gr-fixed-panel/gr-fixed-panel_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-fixed-panel/gr-fixed-panel_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -73,24 +74,27 @@
       };
 
       const emulateScrollY = function(distance) {
-        element._getScrollY.returns(distance);
+        element._getElementTop.returns(element._headerTopInitial - distance);
         element._updateDebounced();
         element.flushDebouncer('scroll');
       };
 
       setup(() => {
         element._headerTopInitial = 10;
-        sandbox.stub(element, '_getScrollY').returns(0);
+        sandbox.stub(element, '_getElementTop')
+            .returns(element._headerTopInitial);
       });
 
       test('scrolls header along with document', () => {
         emulateScrollY(20);
-        assert.equal(getHeaderTop(), '-12px');
+        // No top property is set when !_headerFloating.
+        assert.equal(getHeaderTop(), '');
       });
 
       test('does not stick to the top by default', () => {
         emulateScrollY(150);
-        assert.equal(getHeaderTop(), '-100px');
+        // No top property is set when !_headerFloating.
+        assert.equal(getHeaderTop(), '');
       });
 
       test('sticks to the top if enabled', () => {
diff --git a/polygerrit-ui/app/elements/shared/gr-formatted-text/gr-formatted-text.html b/polygerrit-ui/app/elements/shared/gr-formatted-text/gr-formatted-text.html
index 1ef5a0c..3995595 100644
--- a/polygerrit-ui/app/elements/shared/gr-formatted-text/gr-formatted-text.html
+++ b/polygerrit-ui/app/elements/shared/gr-formatted-text/gr-formatted-text.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/shared/gr-formatted-text/gr-formatted-text.js b/polygerrit-ui/app/elements/shared/gr-formatted-text/gr-formatted-text.js
index d2392e1..4e68d42 100644
--- a/polygerrit-ui/app/elements/shared/gr-formatted-text/gr-formatted-text.js
+++ b/polygerrit-ui/app/elements/shared/gr-formatted-text/gr-formatted-text.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
diff --git a/polygerrit-ui/app/elements/shared/gr-formatted-text/gr-formatted-text_test.html b/polygerrit-ui/app/elements/shared/gr-formatted-text/gr-formatted-text_test.html
index b1c536f..ad036c5 100644
--- a/polygerrit-ui/app/elements/shared/gr-formatted-text/gr-formatted-text_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-formatted-text/gr-formatted-text_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/shared/gr-hovercard/gr-hovercard.html b/polygerrit-ui/app/elements/shared/gr-hovercard/gr-hovercard.html
new file mode 100644
index 0000000..7e3246f
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-hovercard/gr-hovercard.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.
+-->
+
+<link rel="import" href="../../../bower_components/polymer/polymer.html">
+
+<link rel="import" href="../../../styles/shared-styles.html">
+
+<dom-module id="gr-hovercard">
+  <template>
+    <style include="shared-styles">
+      :host {
+        box-sizing: border-box;
+        opacity: 0;
+        position: absolute;
+        transition: opacity 200ms;
+        visibility: hidden;
+        z-index: 100;
+      }
+      :host(.hovered) {
+        visibility: visible;
+        opacity: 1;
+      }
+      :host ::content #hovercard {
+        background: var(--dialog-background-color);
+        box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px;
+        padding: 1em;
+      }
+    </style>
+    <div id="hovercard" role="tooltip" tabindex="-1">
+      <slot></slot>
+    </div>
+  </template>
+  <script src="../../../scripts/rootElement.js"></script>
+  <script src="gr-hovercard.js"></script>
+</dom-module>
\ No newline at end of file
diff --git a/polygerrit-ui/app/elements/shared/gr-hovercard/gr-hovercard.js b/polygerrit-ui/app/elements/shared/gr-hovercard/gr-hovercard.js
new file mode 100644
index 0000000..f9c1da1
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-hovercard/gr-hovercard.js
@@ -0,0 +1,321 @@
+/**
+ * @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';
+  const HOVER_CLASS = 'hovered';
+
+  /**
+   * When the hovercard is positioned diagonally (bottom-left, bottom-right,
+   * top-left, or top-right), we add additional (invisible) padding so that the
+   * area that a user can hover over to access the hovercard is larger.
+   */
+  const DIAGONAL_OVERFLOW = 15;
+
+  Polymer({
+    is: 'gr-hovercard',
+
+    properties: {
+      /**
+       * @type {?}
+       */
+      _target: Object,
+
+      /**
+       * Determines whether or not the hovercard is visible.
+       *
+       * @type {boolean}
+       */
+      _isShowing: {
+        type: Boolean,
+        value: false,
+      },
+      /**
+       * The `id` of the element that the hovercard is anchored to.
+       *
+       * @type {string}
+       */
+      for: {
+        type: String,
+        observer: '_forChanged',
+      },
+
+      /**
+       * The spacing between the top of the hovercard and the element it is
+       * anchored to.
+       *
+       * @type {number}
+       */
+      offset: {
+        type: Number,
+        value: 14,
+      },
+
+      /**
+       * Positions the hovercard to the top, right, bottom, left, bottom-left,
+       * bottom-right, top-left, or top-right of its content.
+       *
+       * @type {string}
+       */
+      position: {
+        type: String,
+        value: 'bottom',
+      },
+
+      container: Object,
+      /**
+       * ID for the container element.
+       *
+       * @type {string}
+       */
+      containerId: {
+        type: String,
+        value: 'gr-hovercard-container',
+      },
+    },
+
+    listeners: {
+      mouseleave: 'hide',
+    },
+
+    attached() {
+      if (!this._target) { this._target = this.target; }
+      this.listen(this._target, 'mouseenter', 'show');
+      this.listen(this._target, 'focus', 'show');
+      this.listen(this._target, 'mouseleave', 'hide');
+      this.listen(this._target, 'blur', 'hide');
+      this.listen(this._target, 'tap', 'hide');
+    },
+
+    ready() {
+      // First, check to see if the container has already been created.
+      this.container = Gerrit.getRootElement()
+          .querySelector('#' + this.containerId);
+
+      if (this.container) { return; }
+
+      // If it does not exist, create and initialize the hovercard container.
+      this.container = document.createElement('div');
+      this.container.setAttribute('id', this.containerId);
+      Gerrit.getRootElement().appendChild(this.container);
+    },
+
+    removeListeners() {
+      this.unlisten(this._target, 'mouseenter', 'show');
+      this.unlisten(this._target, 'focus', 'show');
+      this.unlisten(this._target, 'mouseleave', 'hide');
+      this.unlisten(this._target, 'blur', 'hide');
+      this.unlisten(this._target, 'tap', 'hide');
+    },
+
+    /**
+     * Returns the target element that the hovercard is anchored to (the `id` of
+     * the `for` property).
+     *
+     * @type {HTMLElement}
+     */
+    get target() {
+      const parentNode = Polymer.dom(this).parentNode;
+      // If the parentNode is a document fragment, then we need to use the host.
+      const ownerRoot = Polymer.dom(this).getOwnerRoot();
+      let target;
+      if (this.for) {
+        target = Polymer.dom(ownerRoot).querySelector('#' + this.for);
+      } else {
+        target = parentNode.nodeType == Node.DOCUMENT_FRAGMENT_NODE ?
+            ownerRoot.host :
+            parentNode;
+      }
+      return target;
+    },
+
+    /**
+     * Hides/closes the hovercard. This occurs when the user triggers the
+     * `mouseleave` event on the hovercard's `target` element (as long as the
+     * user is not hovering over the hovercard).
+     *
+     * @param {Event} e DOM Event (e.g. `mouseleave` event)
+     */
+    hide(e) {
+      const targetRect = this._target.getBoundingClientRect();
+      const x = e.clientX;
+      const y = e.clientY;
+      if (x > targetRect.left && x < targetRect.right && y > targetRect.top &&
+          y < targetRect.bottom) {
+        // Sometimes the hovercard itself obscures the mouse pointer, and
+        // that generates a mouseleave event. We don't want to hide the hovercard
+        // in that situation.
+        return;
+      }
+
+      // If the hovercard is already hidden or the user is now hovering over the
+      //  hovercard or the user is returning from the hovercard but now hovering
+      //  over the target (to stop an annoying flicker effect), just return.
+      if (!this._isShowing || e.toElement === this ||
+          (e.fromElement === this && e.toElement === this._target)) {
+        return;
+      }
+
+      // Mark that the hovercard is not visible and do not allow focusing
+      this._isShowing = false;
+
+      // Clear styles in preparation for the next time we need to show the card
+      this.classList.remove(HOVER_CLASS);
+
+      // Reset and remove the hovercard from the DOM
+      this.style.cssText = '';
+      this.$.hovercard.setAttribute('tabindex', -1);
+
+      // Remove the hovercard from the container, given that it is still a child
+      // of the container.
+      if (this.container.contains(this)) {
+        this.container.removeChild(this);
+      }
+    },
+
+    /**
+     * Shows/opens the hovercard. This occurs when the user triggers the
+     * `mousenter` event on the hovercard's `target` element.
+     *
+     * @param {Event} e DOM Event (e.g., `mouseenter` event)
+     */
+    show(e) {
+      if (this._isShowing) {
+        return;
+      }
+
+      // Mark that the hovercard is now visible
+      this._isShowing = true;
+      this.setAttribute('tabindex', 0);
+
+      // Add it to the DOM and calculate its position
+      this.container.appendChild(this);
+      this.updatePosition();
+
+      // Trigger the transition
+      this.classList.add(HOVER_CLASS);
+    },
+
+    /**
+     * Updates the hovercard's position based on the `position` attribute
+     * and the current position of the `target` element.
+     *
+     * The hovercard is supposed to stay open if the user hovers over it.
+     * To keep it open when the user moves away from the target, the bounding
+     * rects of the target and hovercard must touch or overlap.
+     *
+     * NOTE: You do not need to directly call this method unless you need to
+     * update the position of the tooltip while it is already visible (the
+     * target element has moved and the tooltip is still open).
+     */
+    updatePosition() {
+      if (!this._target) { return; }
+
+      // Calculate the necessary measurements and positions
+      const parentRect = document.documentElement.getBoundingClientRect();
+      const targetRect = this._target.getBoundingClientRect();
+      const thisRect = this.getBoundingClientRect();
+
+      const targetLeft = targetRect.left - parentRect.left;
+      const targetTop = targetRect.top - parentRect.top;
+
+      let hovercardLeft;
+      let hovercardTop;
+      const diagonalPadding = this.offset + DIAGONAL_OVERFLOW;
+      let cssText = '';
+
+      // Find the top and left position values based on the position attribute
+      // of the hovercard.
+      switch (this.position) {
+        case 'top':
+          hovercardLeft = targetLeft + (targetRect.width - thisRect.width) / 2;
+          hovercardTop = targetTop - thisRect.height - this.offset;
+          cssText += `padding-bottom:${this.offset
+              }px; margin-bottom:-${this.offset}px;`;
+          break;
+        case 'bottom':
+          hovercardLeft = targetLeft + (targetRect.width - thisRect.width) / 2;
+          hovercardTop = targetTop + targetRect.height + this.offset;
+          cssText +=
+              `padding-top:${this.offset}px; margin-top:-${this.offset}px;`;
+          break;
+        case 'left':
+          hovercardLeft = targetLeft - thisRect.width - this.offset;
+          hovercardTop = targetTop + (targetRect.height - thisRect.height) / 2;
+          cssText +=
+              `padding-right:${this.offset}px; margin-right:-${this.offset}px;`;
+          break;
+        case 'right':
+          hovercardLeft = targetRect.right + this.offset;
+          hovercardTop = targetTop + (targetRect.height - thisRect.height) / 2;
+          cssText +=
+              `padding-left:${this.offset}px; margin-left:-${this.offset}px;`;
+          break;
+        case 'bottom-right':
+          hovercardLeft = targetRect.left + targetRect.width + this.offset;
+          hovercardTop = targetRect.top + targetRect.height + this.offset;
+          cssText += `padding-top:${diagonalPadding}px;`;
+          cssText += `padding-left:${diagonalPadding}px;`;
+          cssText += `margin-left:-${diagonalPadding}px;`;
+          cssText += `margin-top:-${diagonalPadding}px;`;
+          break;
+        case 'bottom-left':
+          hovercardLeft = targetRect.left - thisRect.width - this.offset;
+          hovercardTop = targetRect.top + targetRect.height + this.offset;
+          cssText += `padding-top:${diagonalPadding}px;`;
+          cssText += `padding-right:${diagonalPadding}px;`;
+          cssText += `margin-right:-${diagonalPadding}px;`;
+          cssText += `margin-top:-${diagonalPadding}px;`;
+          break;
+        case 'top-left':
+          hovercardLeft = targetRect.left - thisRect.width - this.offset;
+          hovercardTop = targetRect.top - thisRect.height - this.offset;
+          cssText += `padding-bottom:${diagonalPadding}px;`;
+          cssText += `padding-right:${diagonalPadding}px;`;
+          cssText += `margin-bottom:-${diagonalPadding}px;`;
+          cssText += `margin-right:-${diagonalPadding}px;`;
+          break;
+        case 'top-right':
+          hovercardLeft = targetRect.left + targetRect.width + this.offset;
+          hovercardTop = targetRect.top - thisRect.height - this.offset;
+          cssText += `padding-bottom:${diagonalPadding}px;`;
+          cssText += `padding-left:${diagonalPadding}px;`;
+          cssText += `margin-bottom:-${diagonalPadding}px;`;
+          cssText += `margin-left:-${diagonalPadding}px;`;
+          break;
+      }
+
+      // Prevent hovercard from appearing outside the viewport.
+      // TODO(kaspern): fix hovercard appearing outside viewport on bottom and
+      // right.
+      if (hovercardLeft < 0) { hovercardLeft = 0; }
+      if (hovercardTop < 0) { hovercardTop = 0; }
+      // Set the hovercard's position
+      cssText += `left:${hovercardLeft}px; top:${hovercardTop}px;`;
+      this.style.cssText = cssText;
+    },
+
+    /**
+     * Responds to a change in the `for` value and gets the updated `target`
+     * element for the hovercard.
+     *
+     * @private
+     */
+    _forChanged() {
+      this._target = this.target;
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/shared/gr-hovercard/gr-hovercard_test.html b/polygerrit-ui/app/elements/shared/gr-hovercard/gr-hovercard_test.html
new file mode 100644
index 0000000..e3e252f
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-hovercard/gr-hovercard_test.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<!--
+@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.
+-->
+
+<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+<title>gr-hovercard</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<script src="../../../bower_components/iron-test-helpers/mock-interactions.js"></script>
+
+<link rel="import" href="gr-hovercard.html">
+
+<script>void(0);</script>
+
+<button id="foo">Hello</button>
+<test-fixture id="basic">
+  <template>
+    <gr-hovercard for="foo" id="bar"></gr-hovercard>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-hovercard tests', () => {
+    let element;
+    let sandbox;
+    const TRANSITION_TIME = 200;
+
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+      element = fixture('basic');
+    });
+
+    teardown(() => { sandbox.restore(); });
+
+    test('updatePosition', () => {
+      // Test that the correct style properties have at least been set.
+      element.position = 'bottom';
+      element.updatePosition();
+      assert.typeOf(element.style.getPropertyValue('left'), 'string');
+      assert.typeOf(element.style.getPropertyValue('top'), 'string');
+      assert.typeOf(element.style.getPropertyValue('paddingTop'), 'string');
+      assert.typeOf(element.style.getPropertyValue('marginTop'), 'string');
+
+      const parentRect = document.documentElement.getBoundingClientRect();
+      const targetRect = element._target.getBoundingClientRect();
+      const thisRect = element.getBoundingClientRect();
+
+      const targetLeft = targetRect.left - parentRect.left;
+      const targetTop = targetRect.top - parentRect.top;
+
+      const pixelCompare = pixel =>
+        Math.round(parseInt(pixel.substring(0, pixel.length - 1)), 10);
+
+      assert.equal(
+          pixelCompare(element.style.left),
+          pixelCompare(
+              (targetLeft + (targetRect.width - thisRect.width) / 2) + 'px'));
+      assert.equal(
+          pixelCompare(element.style.top),
+          pixelCompare(
+              (targetTop + targetRect.height + element.offset) + 'px'));
+    });
+
+    test('hide', done => {
+      element.hide({});
+      setTimeout(() => {
+        const style = getComputedStyle(element);
+        assert.isFalse(element._isShowing);
+        assert.isFalse(element.classList.contains('hovered'));
+        assert.equal(style.opacity, '0');
+        assert.equal(style.visibility, 'hidden');
+        assert.notEqual(element.container, Polymer.dom(element).parentNode);
+        done();
+      }, TRANSITION_TIME);
+    });
+
+    test('show', done => {
+      element.show({});
+      setTimeout(() => {
+        const style = getComputedStyle(element);
+        assert.isTrue(element._isShowing);
+        assert.isTrue(element.classList.contains('hovered'));
+        assert.equal(style.opacity, '1');
+        assert.equal(style.visibility, 'visible');
+        done();
+      }, TRANSITION_TIME);
+    });
+
+    test('card shows on enter and hides on leave', done => {
+      const button = Polymer.dom(document).querySelector('button');
+      assert.isFalse(element._isShowing);
+      button.addEventListener('mouseenter', event => {
+        assert.isTrue(element._isShowing);
+        button.dispatchEvent(new CustomEvent('mouseleave'));
+      });
+      button.addEventListener('mouseleave', event => {
+        assert.isFalse(element._isShowing);
+        done();
+      });
+      button.dispatchEvent(new CustomEvent('mouseenter'));
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/shared/gr-icons/gr-icons.html b/polygerrit-ui/app/elements/shared/gr-icons/gr-icons.html
index 4e3e045..1f885af 100644
--- a/polygerrit-ui/app/elements/shared/gr-icons/gr-icons.html
+++ b/polygerrit-ui/app/elements/shared/gr-icons/gr-icons.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -19,14 +20,70 @@
 <iron-iconset-svg name="gr-icons" size="24">
   <svg>
     <defs>
-      <!-- This SVG is a copy from iron-icons https://github.com/PolymerElements/iron-icons/blob/master/iron-icons.html -->
+      <!-- This SVG is a copy from iron-icons https://github.com/PolymerElements/iron-icons/blob/master/iron-icons.js -->
+      <g id="expand-less"><path d="M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z"/></g>
+      <!-- This SVG is a copy from iron-icons https://github.com/PolymerElements/iron-icons/blob/master/iron-icons.js -->
+      <g id="expand-more"><path d="M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z"/></g>
+      <!-- This SVG is a copy from iron-icons https://github.com/PolymerElements/iron-icons/blob/master/iron-icons.js -->
       <g id="search"><path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/></g>
-      <!-- This SVG is a copy from iron-icons https://github.com/PolymerElements/iron-icons/blob/master/iron-icons.html -->
+      <!-- This SVG is a copy from iron-icons https://github.com/PolymerElements/iron-icons/blob/master/iron-icons.js -->
       <g id="settings"><path d="M19.43 12.98c.04-.32.07-.64.07-.98s-.03-.66-.07-.98l2.11-1.65c.19-.15.24-.42.12-.64l-2-3.46c-.12-.22-.39-.3-.61-.22l-2.49 1c-.52-.4-1.08-.73-1.69-.98l-.38-2.65C14.46 2.18 14.25 2 14 2h-4c-.25 0-.46.18-.49.42l-.38 2.65c-.61.25-1.17.59-1.69.98l-2.49-1c-.23-.09-.49 0-.61.22l-2 3.46c-.13.22-.07.49.12.64l2.11 1.65c-.04.32-.07.65-.07.98s.03.66.07.98l-2.11 1.65c-.19.15-.24.42-.12.64l2 3.46c.12.22.39.3.61.22l2.49-1c.52.4 1.08.73 1.69.98l.38 2.65c.03.24.24.42.49.42h4c.25 0 .46-.18.49-.42l.38-2.65c.61-.25 1.17-.59 1.69-.98l2.49 1c.23.09.49 0 .61-.22l2-3.46c.12-.22.07-.49-.12-.64l-2.11-1.65zM12 15.5c-1.93 0-3.5-1.57-3.5-3.5s1.57-3.5 3.5-3.5 3.5 1.57 3.5 3.5-1.57 3.5-3.5 3.5z"/></g>
+      <!-- This SVG is a copy from iron-icons https://github.com/PolymerElements/iron-icons/blob/master/iron-icons.js -->
+      <g id="create"><path d="M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z"/></g>
+      <!-- This SVG is a copy from iron-icons https://github.com/PolymerElements/iron-icons/blob/master/iron-icons.js -->
+      <g id="star"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/></g>
+      <!-- This SVG is a copy from iron-icons https://github.com/PolymerElements/iron-icons/blob/master/iron-icons.js -->
+      <g id="star-border"><path d="M22 9.24l-7.19-.62L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27 18.18 21l-1.63-7.03L22 9.24zM12 15.4l-3.76 2.27 1-4.28-3.32-2.88 4.38-.38L12 6.1l1.71 4.04 4.38.38-3.32 2.88 1 4.28L12 15.4z"/></g>
+      <!-- This SVG is a copy from iron-icons https://github.com/PolymerElements/iron-icons/blob/master/iron-icons.js -->
+      <g id="close"><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></g>
+      <!-- This SVG is a copy from iron-icons https://github.com/PolymerElements/iron-icons/blob/master/iron-icons.js -->
+      <g id="chevron-left"><path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"/></g>
+      <!-- This SVG is a copy from iron-icons https://github.com/PolymerElements/iron-icons/blob/master/iron-icons.js -->
+      <g id="chevron-right"><path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/></g>
+      <!-- This SVG is a copy from iron-icons https://github.com/PolymerElements/iron-icons/blob/master/iron-icons.js -->
+      <g id="more-vert"><path d="M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/></g>
+      <!-- This SVG is a copy from iron-icons https://github.com/PolymerElements/iron-icons/blob/master/iron-icons.js -->
+      <g id="deleteEdit"><path d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"/></g>
+      <!-- This SVG is a copy from iron-icons https://github.com/PolymerElements/iron-icons/blob/master/editor-icons.html -->
+      <g id="publishEdit"><path d="M5 4v2h14V4H5zm0 10h4v6h6v-6h4l-7-7-7 7z"/></g>
+      <!-- This SVG is a copy from iron-icons https://github.com/PolymerElements/iron-icons/blob/master/editor-icons.html -->
+      <g id="delete"><path d="M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"/></g>
+      <!-- This SVG is a copy from iron-icons https://github.com/PolymerElements/iron-icons/blob/master/iron-icons.js -->
+      <g id="help"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 17h-2v-2h2v2zm2.07-7.75l-.9.92C13.45 12.9 13 13.5 13 15h-2v-.5c0-1.1.45-2.1 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41 0-1.1-.9-2-2-2s-2 .9-2 2H8c0-2.21 1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25z"></path></g>
+      <!-- This SVG is a copy from iron-icons https://github.com/PolymerElements/iron-icons/blob/master/iron-icons.js -->
+      <g id="info"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"></path></g>
+      <!-- This SVG is a copy from material.io https://material.io/icons/#ic_hourglass_full-->
+      <g id="hourglass"><path d="M6 2v6h.01L6 8.01 10 12l-4 4 .01.01H6V22h12v-5.99h-.01L18 16l-4-4 4-3.99-.01-.01H18V2H6z"/><path d="M0 0h24v24H0V0z" fill="none"/></g>
       <!-- This is a custom PolyGerrit SVG -->
       <g id="side-by-side"><path d="M17.1578947,10.8888889 L2.84210526,10.8888889 C2.37894737,10.8888889 2,11.2888889 2,11.7777778 L2,17.1111111 C2,17.6 2.37894737,18 2.84210526,18 L17.1578947,18 C17.6210526,18 18,17.6 18,17.1111111 L18,11.7777778 C18,11.2888889 17.6210526,10.8888889 17.1578947,10.8888889 Z M17.1578947,2 L2.84210526,2 C2.37894737,2 2,2.4 2,2.88888889 L2,8.22222222 C2,8.71111111 2.37894737,9.11111111 2.84210526,9.11111111 L17.1578947,9.11111111 C17.6210526,9.11111111 18,8.71111111 18,8.22222222 L18,2.88888889 C18,2.4 17.6210526,2 17.1578947,2 Z M16.1973628,2 L2.78874238,2 C2.35493407,2 2,2.4 2,2.88888889 L2,8.22222222 C2,8.71111111 2.35493407,9.11111111 2.78874238,9.11111111 L16.1973628,9.11111111 C16.6311711,9.11111111 16.9861052,8.71111111 16.9861052,8.22222222 L16.9861052,2.88888889 C16.9861052,2.4 16.6311711,2 16.1973628,2 Z" id="Shape" transform="scale(1.2) translate(10.000000, 10.000000) rotate(-90.000000) translate(-10.000000, -10.000000)"/></g>
       <!-- This is a custom PolyGerrit SVG -->
-      <g id="unified"><path d="M4,2 L17,2 C18.1045695,2 19,2.8954305 19,4 L19,16 C19,17.1045695 18.1045695,18 17,18 L4,18 C2.8954305,18 2,17.1045695 2,16 L2,4 L2,4 C2,2.8954305 2.8954305,2 4,2 L4,2 Z M4,7 L4,9 L17,9 L17,7 L4,7 Z M4,11 L4,13 L17,13 L17,11 L4,11 Z" id="Combined-Shape" transform="scale(1.2)"/></g>
+      <g id="unified"><path d="M4,2 L17,2 C18.1045695,2 19,2.8954305 19,4 L19,16 C19,17.1045695 18.1045695,18 17,18 L4,18 C2.8954305,18 2,17.1045695 2,16 L2,4 L2,4 C2,2.8954305 2.8954305,2 4,2 L4,2 Z M4,7 L4,9 L17,9 L17,7 L4,7 Z M4,11 L4,13 L17,13 L17,11 L4,11 Z" id="Combined-Shape" transform="scale(1.12, 1.2)"/></g>
+      <!-- This is a custom PolyGerrit SVG -->
+      <g id="content-copy"><path d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"/></g>
+      <!-- This is a custom PolyGerrit SVG -->
+      <g id="check"><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"/></g>
+      <!-- This is a custom PolyGerrit SVG -->
+      <g id="robot"><path d="M4.137453,5.61015591 L4.54835569,1.5340419 C4.5717665,1.30180904 4.76724872,1.12504213 5.00065859,1.12504213 C5.23327176,1.12504213 5.42730868,1.30282046 5.44761309,1.53454578 L5.76084628,5.10933916 C6.16304484,5.03749412 6.57714381,5 7,5 L17,5 C20.8659932,5 24,8.13400675 24,12 L24,15.1250421 C24,18.9910354 20.8659932,22.1250421 17,22.1250421 L7,22.1250421 C3.13400675,22.1250421 2.19029351e-15,18.9910354 0,15.1250421 L0,12 C-3.48556243e-16,9.15382228 1.69864167,6.70438358 4.137453,5.61015591 Z M5.77553049,6.12504213 C3.04904264,6.69038358 1,9.10590202 1,12 L1,15.1250421 C1,18.4387506 3.6862915,21.1250421 7,21.1250421 L17,21.1250421 C20.3137085,21.1250421 23,18.4387506 23,15.1250421 L23,12 C23,8.6862915 20.3137085,6 17,6 L7,6 C6.60617231,6 6.2212068,6.03794347 5.84855971,6.11037415 L5.84984496,6.12504213 L5.77553049,6.12504213 Z M6.93003717,6.95027711 L17.1232083,6.95027711 C19.8638332,6.95027711 22.0855486,9.17199258 22.0855486,11.9126175 C22.0855486,14.6532424 19.8638332,16.8749579 17.1232083,16.8749579 L6.93003717,16.8749579 C4.18941226,16.8749579 1.9676968,14.6532424 1.9676968,11.9126175 C1.9676968,9.17199258 4.18941226,6.95027711 6.93003717,6.95027711 Z M7.60124392,14.0779303 C9.03787127,14.0779303 10.2024878,12.9691885 10.2024878,11.6014862 C10.2024878,10.2337839 9.03787127,9.12504213 7.60124392,9.12504213 C6.16461657,9.12504213 5,10.2337839 5,11.6014862 C5,12.9691885 6.16461657,14.0779303 7.60124392,14.0779303 Z M16.617997,14.1098288 C18.0638768,14.1098288 19.2359939,12.9939463 19.2359939,11.6174355 C19.2359939,10.2409246 18.0638768,9.12504213 16.617997,9.12504213 C15.1721172,9.12504213 14,10.2409246 14,11.6174355 C14,12.9939463 15.1721172,14.1098288 16.617997,14.1098288 Z M9.79751216,18.1250421 L15,18.1250421 L15,19.1250421 C15,19.6773269 14.5522847,20.1250421 14,20.1250421 L10.7975122,20.1250421 C10.2452274,20.1250421 9.79751216,19.6773269 9.79751216,19.1250421 L9.79751216,18.1250421 Z"></path></g>
+      <!-- This is a custom PolyGerrit SVG -->
+      <g id="abandon"><path d="M17.65675,17.65725 C14.77275,20.54125 10.23775,20.75625 7.09875,18.31525 L18.31475,7.09925 C20.75575,10.23825 20.54075,14.77325 17.65675,17.65725 M6.34275,6.34325 C9.22675,3.45925 13.76275,3.24425 16.90075,5.68525 L5.68475,16.90125 C3.24375,13.76325 3.45875,9.22725 6.34275,6.34325 M19.07075,4.92925 C15.16575,1.02425 8.83375,1.02425 4.92875,4.92925 C1.02375,8.83425 1.02375,15.16625 4.92875,19.07125 C8.83375,22.97625 15.16575,22.97625 19.07075,19.07125 C22.97575,15.16625 22.97575,8.83425 19.07075,4.92925"></path></g>
+      <!-- This is a custom PolyGerrit SVG -->
+      <g id="edit"><path d="M3,17.2525 L3,21.0025 L6.75,21.0025 L17.81,9.9425 L14.06,6.1925 L3,17.2525 L3,17.2525 Z M20.71,7.0425 C21.1,6.6525 21.1,6.0225 20.71,5.6325 L18.37,3.2925 C17.98,2.9025 17.35,2.9025 16.96,3.2925 L15.13,5.1225 L18.88,8.8725 L20.71,7.0425 L20.71,7.0425 Z"></path></g>
+      <!-- This is a custom PolyGerrit SVG -->
+      <g id="rebase"><path d="M15.5759,19.4241 L14.5861,20.4146 L11.7574,23.2426 L10.3434,21.8286 L12.171569,20 L7.82933006,20 C7.41754308,21.1652555 6.30635522,22 5,22 C3.343,22 2,20.657 2,19 C2,17.6936448 2.83474451,16.5824569 4,16.1706699 L4,7.82933006 C2.83474451,7.41754308 2,6.30635522 2,5 C2,3.343 3.343,2 5,2 C6.30635522,2 7.41754308,2.83474451 7.82933006,4 L12.1715,4 L10.3431,2.1716 L11.7571,0.7576 L15.36365,4.3633 L16.0000001,4.99920039 C16.0004321,3.34256796 17.3432665,2 19,2 C20.657,2 22,3.343 22,5 C22,6.30635522 21.1652555,7.41754308 20,7.82933006 L20,16.1706699 C21.1652555,16.5824569 22,17.6936448 22,19 C22,20.657 20.657,22 19,22 C17.343,22 16,20.657 16,19 L15.5759,19.4241 Z M12.1715,18 L10.3431,16.1716 L11.7571,14.7576 L15.36365,18.3633 L16.0000001,18.9992004 C16.0003407,17.6931914 16.8349823,16.5823729 18,16.1706699 L18,7.82933006 C16.8347445,7.41754308 16,6.30635522 16,5 L15.5759,5.4241 L14.5861,6.4146 L11.7574,9.2426 L10.3434,7.8286 L12.171569,6 L7.82933006,6 C7.52807271,6.85248394 6.85248394,7.52807271 6,7.82933006 L6,16.1706699 C6.85248394,16.4719273 7.52807271,17.1475161 7.82933006,18 L12.1715,18 Z"></path></g>
+      <!-- This is a custom PolyGerrit SVG -->
+      <g id="rebaseEdit"><path d="M15.5759,19.4241 L14.5861,20.4146 L11.7574,23.2426 L10.3434,21.8286 L12.171569,20 L7.82933006,20 C7.41754308,21.1652555 6.30635522,22 5,22 C3.343,22 2,20.657 2,19 C2,17.6936448 2.83474451,16.5824569 4,16.1706699 L4,7.82933006 C2.83474451,7.41754308 2,6.30635522 2,5 C2,3.343 3.343,2 5,2 C6.30635522,2 7.41754308,2.83474451 7.82933006,4 L12.1715,4 L10.3431,2.1716 L11.7571,0.7576 L15.36365,4.3633 L16.0000001,4.99920039 C16.0004321,3.34256796 17.3432665,2 19,2 C20.657,2 22,3.343 22,5 C22,6.30635522 21.1652555,7.41754308 20,7.82933006 L20,16.1706699 C21.1652555,16.5824569 22,17.6936448 22,19 C22,20.657 20.657,22 19,22 C17.343,22 16,20.657 16,19 L15.5759,19.4241 Z M12.1715,18 L10.3431,16.1716 L11.7571,14.7576 L15.36365,18.3633 L16.0000001,18.9992004 C16.0003407,17.6931914 16.8349823,16.5823729 18,16.1706699 L18,7.82933006 C16.8347445,7.41754308 16,6.30635522 16,5 L15.5759,5.4241 L14.5861,6.4146 L11.7574,9.2426 L10.3434,7.8286 L12.171569,6 L7.82933006,6 C7.52807271,6.85248394 6.85248394,7.52807271 6,7.82933006 L6,16.1706699 C6.85248394,16.4719273 7.52807271,17.1475161 7.82933006,18 L12.1715,18 Z"></path></g>
+      <!-- This is a custom PolyGerrit SVG -->
+      <g id="restore"><path d="M12,8 L12,13 L16.28,15.54 L17,14.33 L13.5,12.25 L13.5,8 L12,8 Z M13,3 C8.03,3 4,7.03 4,12 L1,12 L4.89,15.89 L4.96,16.03 L9,12 L6,12 C6,8.13 9.13,5 13,5 C16.87,5 20,8.13 20,12 C20,15.87 16.87,19 13,19 C11.07,19 9.32,18.21 8.06,16.94 L6.64,18.36 C8.27,19.99 10.51,21 13,21 C17.97,21 22,16.97 22,12 C22,7.03 17.97,3 13,3 Z"></path></g>
+      <!-- This is a custom PolyGerrit SVG -->
+      <g id="revert"><path d="M12.3,8.5 C9.64999995,8.5 7.24999995,9.49 5.39999995,11.1 L1.79999995,7.5 L1.79999995,16.5 L10.8,16.5 L7.17999995,12.88 C8.56999995,11.72 10.34,11 12.3,11 C15.84,11 18.85,13.31 19.9,16.5 L22.27,15.72 C20.88,11.53 16.95,8.5 12.3,8.5"></path></g>
+      <!-- This is a custom PolyGerrit SVG -->
+      <g id="stopEdit"><path d="M4 4 20 4 20 20 4 20z"></path></g>
+      <!-- This is a custom PolyGerrit SVG -->
+      <g id="submit"><path d="M22.23,5 L11.65,15.58 L7.47000001,11.41 L6.06000001,12.82 L11.65,18.41 L23.649,6.41 L22.23,5 Z M16.58,5 L10.239,11.34 L11.65,12.75 L17.989,6.41 L16.58,5 Z M0.400000006,12.82 L5.99000001,18.41 L7.40000001,17 L1.82000001,11.41 L0.400000006,12.82 Z"></path></g>
+      <!-- This is a custom PolyGerrit SVG -->
+      <g id="review"><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"/></g>
+      <!-- This is a custom PolyGerrit SVG -->
+      <g id="zeroState"><path d="M22 9V7h-2V5c0-1.1-.9-2-2-2H4c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-2h2v-2h-2v-2h2v-2h-2V9h2zm-4 10H4V5h14v14zM6 13h5v4H6zm6-6h4v3h-4zM6 7h5v5H6zm6 4h4v6h-4z"/></g>
     </defs>
   </svg>
-</iron-iconset-svg>
\ No newline at end of file
+</iron-iconset-svg>
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-annotation-actions-context.js b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-annotation-actions-context.js
new file mode 100644
index 0000000..9331173
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-annotation-actions-context.js
@@ -0,0 +1,53 @@
+/**
+ * @license
+ * Copyright (C) 2017 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(window) {
+  'use strict';
+
+  /**
+   * Used to create a context for GrAnnotationActionsInterface.
+   * @param {HTMLElement} el The DIV.contentText element to apply the
+   *     annotation to using annotateRange.
+   * @param {GrDiffLine} line The line object.
+   * @param {String} path The file path (eg: /COMMIT_MSG').
+   * @param {String} changeNum The Gerrit change number.
+   * @param {String} patchNum The Gerrit patch number.
+   */
+  function GrAnnotationActionsContext(el, line, path, changeNum, patchNum) {
+    this._el = el;
+
+    this.line = line;
+    this.path = path;
+    this.changeNum = parseInt(changeNum);
+    this.patchNum = parseInt(patchNum);
+  }
+
+  /**
+   * Method to add annotations to a line.
+   * @param {Number} start The line number where the update starts.
+   * @param {Number} end The line number where the update ends.
+   * @param {String} cssClass The name of a CSS class created using Gerrit.css.
+   * @param {String} side The side of the update. ('left' or 'right')
+   */
+  GrAnnotationActionsContext.prototype.annotateRange = function(
+      start, end, cssClass, side) {
+    if (this._el.getAttribute('data-side') == side) {
+      GrAnnotation.annotateElement(this._el, start, end, cssClass);
+    }
+  };
+
+  window.GrAnnotationActionsContext = GrAnnotationActionsContext;
+})(window);
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-annotation-actions-context_test.html b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-annotation-actions-context_test.html
new file mode 100644
index 0000000..cd86fa9
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-annotation-actions-context_test.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<!--
+@license
+Copyright (C) 2017 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-annotation-actions-context</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<script src="../../diff/gr-diff-highlight/gr-annotation.js"></script>
+
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-js-api-interface.html"/>
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <div></div>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-annotation-actions-context tests', () => {
+    let instance;
+    let sandbox;
+    let el;
+
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+      const str = 'lorem ipsum blah blah';
+      const line = {text: str};
+      el = document.createElement('div');
+      el.textContent = str;
+      el.setAttribute('data-side', 'right');
+      instance = new GrAnnotationActionsContext(
+          el, line, 'dummy/path', '123', '1');
+    });
+
+    teardown(() => {
+      sandbox.restore();
+    });
+
+    test('test annotateRange', () => {
+      annotateElementSpy = sandbox.spy(GrAnnotation, 'annotateElement');
+      const start = 0;
+      const end = 100;
+      const cssClass = Gerrit.css('background-color: #000000');
+
+      // Assert annotateElement is not called when side is different.
+      instance.annotateRange(start, end, cssClass, 'left');
+      assert.equal(annotateElementSpy.callCount, 0);
+
+      // Assert annotateElement is called once when side is the same.
+      instance.annotateRange(start, end, cssClass, 'right');
+      assert.equal(annotateElementSpy.callCount, 1);
+      const args = annotateElementSpy.getCalls()[0].args;
+      assert.equal(args[0], el);
+      assert.equal(args[1], start);
+      assert.equal(args[2], end);
+      assert.equal(args[3], cssClass);
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-annotation-actions-js-api.js b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-annotation-actions-js-api.js
new file mode 100644
index 0000000..47281c2
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-annotation-actions-js-api.js
@@ -0,0 +1,185 @@
+/**
+ * @license
+ * Copyright (C) 2017 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(window) {
+  'use strict';
+
+  function GrAnnotationActionsInterface(plugin) {
+    this.plugin = plugin;
+    // Return this instance when there is an annotatediff event.
+    plugin.on('annotatediff', this);
+
+    // Collect all annotation layers instantiated by getLayer. Will be used when
+    // notifying their listeners in the notify function.
+    this._annotationLayers = [];
+
+    // Default impl is a no-op.
+    this._addLayerFunc = annotationActionsContext => {};
+  }
+
+  /**
+   * Register a function to call to apply annotations. Plugins should use
+   * GrAnnotationActionsContext.annotateRange to apply a CSS class to a range
+   * within a line.
+   * @param {function(GrAnnotationActionsContext)} addLayerFunc The function
+   *     that will be called when the AnnotationLayer is ready to annotate.
+   */
+  GrAnnotationActionsInterface.prototype.addLayer = function(addLayerFunc) {
+    this._addLayerFunc = addLayerFunc;
+    return this;
+  };
+
+  /**
+   * The specified function will be called with a notify function for the plugin
+   * to call when it has all required data for annotation. Optional.
+   * @param {function(function(String, Number, Number, String))} notifyFunc See
+   *     doc of the notify function below to see what it does.
+   */
+  GrAnnotationActionsInterface.prototype.addNotifier = function(notifyFunc) {
+    // Register the notify function with the plugin's function.
+    notifyFunc(this.notify.bind(this));
+    return this;
+  };
+
+  /**
+   * Returns a checkbox HTMLElement that can be used to toggle annotations
+   * on/off. The checkbox will be initially disabled. Plugins should enable it
+   * when data is ready and should add a click handler to toggle CSS on/off.
+   *
+   * Note1: Calling this method from multiple plugins will only work for the
+   *        1st call. It will print an error message for all subsequent calls
+   *        and will not invoke their onAttached functions.
+   * Note2: This method will be deprecated and eventually removed when
+   *        https://bugs.chromium.org/p/gerrit/issues/detail?id=8077 is
+   *        implemented.
+   *
+   * @param {String} checkboxLabel Will be used as the label for the checkbox.
+   *     Optional. "Enable" is used if this is not specified.
+   * @param {function(HTMLElement)} onAttached The function that will be called
+   *     when the checkbox is attached to the page.
+   */
+  GrAnnotationActionsInterface.prototype.enableToggleCheckbox = function(
+      checkboxLabel, onAttached) {
+    this.plugin.hook('annotation-toggler').onAttached(element => {
+      if (!element.content.hidden) {
+        console.error(
+            element.content.id + ' is already enabled. Cannot re-enable.');
+        return;
+      }
+      element.content.removeAttribute('hidden');
+
+      const label = element.content.querySelector('#annotation-label');
+      if (checkboxLabel) {
+        label.textContent = checkboxLabel;
+      } else {
+        label.textContent = 'Enable';
+      }
+      const checkbox = element.content.querySelector('#annotation-checkbox');
+      onAttached(checkbox);
+    });
+    return this;
+  };
+
+  /**
+   * The notify function will call the listeners of all required annotation
+   * layers. Intended to be called by the plugin when all required data for
+   * annotation is available.
+   * @param {String} path The file path whose listeners should be notified.
+   * @param {Number} start The line where the update starts.
+   * @param {Number} end The line where the update ends.
+   * @param {String} side The side of the update ('left' or 'right').
+   */
+  GrAnnotationActionsInterface.prototype.notify = function(
+      path, startRange, endRange, side) {
+    for (const annotationLayer of this._annotationLayers) {
+      // Notify only the annotation layer that is associated with the specified
+      // path.
+      if (annotationLayer._path === path) {
+        annotationLayer.notifyListeners(startRange, endRange, side);
+        break;
+      }
+    }
+  };
+
+  /**
+   * Should be called to register annotation layers by the framework. Not
+   * intended to be called by plugins.
+   * @param {String} path The file path (eg: /COMMIT_MSG').
+   * @param {String} changeNum The Gerrit change number.
+   * @param {String} patchNum The Gerrit patch number.
+   */
+  GrAnnotationActionsInterface.prototype.getLayer = function(
+      path, changeNum, patchNum) {
+    const annotationLayer = new AnnotationLayer(path, changeNum, patchNum,
+                                                this._addLayerFunc);
+    this._annotationLayers.push(annotationLayer);
+    return annotationLayer;
+  };
+
+  /**
+   * Used to create an instance of the Annotation Layer interface.
+   * @param {String} path The file path (eg: /COMMIT_MSG').
+   * @param {String} changeNum The Gerrit change number.
+   * @param {String} patchNum The Gerrit patch number.
+   * @param {function(GrAnnotationActionsContext)} addLayerFunc The function
+   *     that will be called when the AnnotationLayer is ready to annotate.
+   */
+  function AnnotationLayer(path, changeNum, patchNum, addLayerFunc) {
+    this._path = path;
+    this._changeNum = changeNum;
+    this._patchNum = patchNum;
+    this._addLayerFunc = addLayerFunc;
+
+    this._listeners = [];
+  }
+
+  /**
+   * Register a listener for layer updates.
+   * @param {function(Number, Number, String)} fn The update handler function.
+   *     Should accept as arguments the line numbers for the start and end of
+   *     the update and the side as a string.
+   */
+  AnnotationLayer.prototype.addListener = function(fn) {
+    this._listeners.push(fn);
+  };
+
+  /**
+   * Layer method to add annotations to a line.
+   * @param {HTMLElement} el The DIV.contentText element to apply the
+   *     annotation to.
+   * @param {GrDiffLine} line The line object.
+   */
+  AnnotationLayer.prototype.annotate = function(el, line) {
+    const annotationActionsContext = new GrAnnotationActionsContext(
+        el, line, this._path, this._changeNum, this._patchNum);
+    this._addLayerFunc(annotationActionsContext);
+  };
+
+  /**
+   * Notify Layer listeners of changes to annotations.
+   * @param {Number} start The line where the update starts.
+   * @param {Number} end The line where the update ends.
+   * @param {String} side The side of the update. ('left' or 'right')
+   */
+  AnnotationLayer.prototype.notifyListeners = function(
+      startRange, endRange, side) {
+    for (const listener of this._listeners) {
+      listener(startRange, endRange, side);
+    }
+  };
+
+  window.GrAnnotationActionsInterface = GrAnnotationActionsInterface;
+})(window);
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-annotation-actions-js-api_test.html b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-annotation-actions-js-api_test.html
new file mode 100644
index 0000000..bfb8b47
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-annotation-actions-js-api_test.html
@@ -0,0 +1,182 @@
+<!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-annotation-actions-js-api-js-api</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="../../change/gr-change-actions/gr-change-actions.html">
+
+<test-fixture id="basic">
+  <template>
+    <span hidden id="annotation-span">
+      <label for="annotation-checkbox" id="annotation-label"></label>
+      <input is="iron-input" type="checkbox" id="annotation-checkbox" disabled>
+    </span>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-annotation-actions-js-api tests', () => {
+    let annotationActions;
+    let sandbox;
+    let plugin;
+
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+      Gerrit.install(p => { plugin = p; }, '0.1',
+          'http://test.com/plugins/testplugin/static/test.js');
+      annotationActions = plugin.annotationApi();
+    });
+
+    teardown(() => {
+      annotationActions = null;
+      sandbox.restore();
+    });
+
+    test('add/get layer', () => {
+      const str = 'lorem ipsum blah blah';
+      const line = {text: str};
+      el = document.createElement('div');
+      el.textContent = str;
+      const changeNum = 1234;
+      const patchNum = 2;
+      let testLayerFuncCalled = false;
+
+      const testLayerFunc = context => {
+        testLayerFuncCalled = true;
+        assert.equal(context.line, line);
+        assert.equal(context.changeNum, changeNum);
+        assert.equal(context.patchNum, 2);
+      };
+      annotationActions.addLayer(testLayerFunc);
+
+      const annotationLayer = annotationActions.getLayer(
+          '/dummy/path', changeNum, patchNum);
+
+      annotationLayer.annotate(el, line);
+      assert.isTrue(testLayerFuncCalled);
+    });
+
+    test('add notifier', () => {
+      const path1 = '/dummy/path1';
+      const path2 = '/dummy/path2';
+      const annotationLayer1 = annotationActions.getLayer(path1, 1, 2);
+      const annotationLayer2 = annotationActions.getLayer(path2, 1, 2);
+      const layer1Spy = sandbox.spy(annotationLayer1, 'notifyListeners');
+      const layer2Spy = sandbox.spy(annotationLayer2, 'notifyListeners');
+
+      let notify;
+      const notifyFunc = n => {
+        notifyFuncCalled = true;
+        notify = n;
+      };
+      annotationActions.addNotifier(notifyFunc);
+      assert.isTrue(notifyFuncCalled);
+
+      // Assert that no layers are invoked with a different path.
+      notify('/dummy/path3', 0, 10, 'right');
+      assert.isFalse(layer1Spy.called);
+      assert.isFalse(layer2Spy.called);
+
+      // Assert that only the 1st layer is invoked with path1.
+      notify(path1, 0, 10, 'right');
+      assert.isTrue(layer1Spy.called);
+      assert.isFalse(layer2Spy.called);
+
+      // Reset spies.
+      layer1Spy.reset();
+      layer2Spy.reset();
+
+      // Assert that only the 2nd layer is invoked with path2.
+      notify(path2, 0, 20, 'left');
+      assert.isFalse(layer1Spy.called);
+      assert.isTrue(layer2Spy.called);
+    });
+
+    test('toggle checkbox', () => {
+      fakeEl = {content: fixture('basic')};
+      const hookStub = {onAttached: sandbox.stub()};
+      sandbox.stub(plugin, 'hook').returns(hookStub);
+
+      let checkbox;
+      let onAttachedFuncCalled = false;
+      const onAttachedFunc = c => {
+        checkbox = c;
+        onAttachedFuncCalled = true;
+      };
+      annotationActions.enableToggleCheckbox('test label', onAttachedFunc);
+      emulateAttached = () => hookStub.onAttached.callArgWith(0, fakeEl);
+      emulateAttached();
+
+      // Assert that onAttachedFunc is called and HTML elements have the
+      // expected state.
+      assert.isTrue(onAttachedFuncCalled);
+      assert.equal(checkbox.id, 'annotation-checkbox');
+      assert.isTrue(checkbox.disabled);
+      assert.equal(document.getElementById('annotation-label').textContent,
+          'test label');
+      assert.isFalse(document.getElementById('annotation-span').hidden);
+
+      // Assert that error is shown if we try to enable checkbox again.
+      onAttachedFuncCalled = false;
+      annotationActions.enableToggleCheckbox('test label2', onAttachedFunc);
+      const errorStub = sandbox.stub(
+          console, 'error', (msg, err) => undefined);
+      emulateAttached();
+      assert.isTrue(
+          errorStub.calledWith(
+              'annotation-span is already enabled. Cannot re-enable.'));
+      // Assert that onAttachedFunc is not called and the label has not changed.
+      assert.isFalse(onAttachedFuncCalled);
+      assert.equal(document.getElementById('annotation-label').textContent,
+          'test label');
+    });
+
+    test('layer notify listeners', () => {
+      const annotationLayer = annotationActions.getLayer(
+          '/dummy/path', 1, 2);
+      let listenerCalledTimes = 0;
+      const startRange = 10;
+      const endRange = 20;
+      const side = 'right';
+      const listener = (st, end, s) => {
+        listenerCalledTimes++;
+        assert.equal(st, startRange);
+        assert.equal(end, endRange);
+        assert.equal(s, side);
+      };
+
+      // Notify with 0 listeners added.
+      annotationLayer.notifyListeners(startRange, endRange, side);
+      assert.equal(listenerCalledTimes, 0);
+
+      // Add 1 listener.
+      annotationLayer.addListener(listener);
+      annotationLayer.notifyListeners(startRange, endRange, side);
+      assert.equal(listenerCalledTimes, 1);
+
+      // Add 1 more listener. Total 2 listeners.
+      annotationLayer.addListener(listener);
+      annotationLayer.notifyListeners(startRange, endRange, side);
+      assert.equal(listenerCalledTimes, 3);
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-change-actions-js-api.js b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-change-actions-js-api.js
index 6853a41..407a6a8 100644
--- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-change-actions-js-api.js
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-change-actions-js-api.js
@@ -1,80 +1,136 @@
-// 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.
+/**
+ * @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.
+ */
 (function(window) {
   'use strict';
 
+  /**
+   * Ensure GrChangeActionsInterface instance has access to gr-change-actions
+   * element and retrieve if the interface was created before element.
+   * @param {!GrChangeActionsInterface} api
+   */
+  function ensureEl(api) {
+    if (!api._el) {
+      const sharedApiElement = document.createElement('gr-js-api-interface');
+      setEl(api, sharedApiElement.getElement(
+          sharedApiElement.Element.CHANGE_ACTIONS));
+    }
+  }
+
+  /**
+   * Set gr-change-actions element to a GrChangeActionsInterface instance.
+   * @param {!GrChangeActionsInterface} api
+   * @param {!Element} el gr-change-actions
+   */
+  function setEl(api, el) {
+    if (!el) {
+      console.warn('changeActions() is not ready');
+      return;
+    }
+    api._el = el;
+    api.RevisionActions = el.RevisionActions;
+    api.ChangeActions = el.ChangeActions;
+    api.ActionType = el.ActionType;
+  }
+
   function GrChangeActionsInterface(plugin, el) {
     this.plugin = plugin;
-    this._el = el;
-    this.RevisionActions = el.RevisionActions;
-    this.ChangeActions = el.ChangeActions;
-    this.ActionType = el.ActionType;
+    setEl(this, el);
   }
 
   GrChangeActionsInterface.prototype.addPrimaryActionKey = function(key) {
+    ensureEl(this);
     if (this._el.primaryActionKeys.includes(key)) { return; }
 
     this._el.push('primaryActionKeys', key);
   };
 
   GrChangeActionsInterface.prototype.removePrimaryActionKey = function(key) {
+    ensureEl(this);
     this._el.primaryActionKeys = this._el.primaryActionKeys.filter(k => {
       return k !== key;
     });
   };
 
+  GrChangeActionsInterface.prototype.hideQuickApproveAction = function() {
+    ensureEl(this);
+    this._el.hideQuickApproveAction();
+  };
+
   GrChangeActionsInterface.prototype.setActionOverflow = function(type, key,
       overflow) {
+    ensureEl(this);
     return this._el.setActionOverflow(type, key, overflow);
   };
 
   GrChangeActionsInterface.prototype.setActionPriority = function(type, key,
       priority) {
+    ensureEl(this);
     return this._el.setActionPriority(type, key, priority);
   };
 
   GrChangeActionsInterface.prototype.setActionHidden = function(type, key,
       hidden) {
+    ensureEl(this);
     return this._el.setActionHidden(type, key, hidden);
   };
 
   GrChangeActionsInterface.prototype.add = function(type, label) {
+    ensureEl(this);
     return this._el.addActionButton(type, label);
   };
 
   GrChangeActionsInterface.prototype.remove = function(key) {
+    ensureEl(this);
     return this._el.removeActionButton(key);
   };
 
   GrChangeActionsInterface.prototype.addTapListener = function(key, handler) {
+    ensureEl(this);
     this._el.addEventListener(key + '-tap', handler);
   };
 
   GrChangeActionsInterface.prototype.removeTapListener = function(key,
       handler) {
+    ensureEl(this);
     this._el.removeEventListener(key + '-tap', handler);
   };
 
   GrChangeActionsInterface.prototype.setLabel = function(key, text) {
+    ensureEl(this);
     this._el.setActionButtonProp(key, 'label', text);
   };
 
+  GrChangeActionsInterface.prototype.setTitle = function(key, text) {
+    ensureEl(this);
+    this._el.setActionButtonProp(key, 'title', text);
+  };
+
   GrChangeActionsInterface.prototype.setEnabled = function(key, enabled) {
+    ensureEl(this);
     this._el.setActionButtonProp(key, 'enabled', enabled);
   };
 
+  GrChangeActionsInterface.prototype.setIcon = function(key, icon) {
+    ensureEl(this);
+    this._el.setActionButtonProp(key, 'icon', icon);
+  };
+
   GrChangeActionsInterface.prototype.getActionDetails = function(action) {
+    ensureEl(this);
     return this._el.getActionDetails(action) ||
       this._el.getActionDetails(this.plugin.getPluginName() + '~' + action);
   };
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-change-actions-js-api_test.html b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-change-actions-js-api_test.html
index 53d7345..fef4fc9 100644
--- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-change-actions-js-api_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-change-actions-js-api_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -39,6 +40,7 @@
   suite('gr-js-api-interface tests', () => {
     let element;
     let changeActions;
+    let plugin;
 
     // Because deepEqual doesn’t behave in Safari.
     function assertArraysEqual(actual, expected) {
@@ -48,132 +50,164 @@
       }
     }
 
-    setup(() => {
-      element = fixture('basic');
-      element.change = {};
-      element._hasKnownChainState = false;
-      let plugin;
-      Gerrit.install(p => { plugin = p; }, '0.1',
-          'http://test.com/plugins/testplugin/static/test.js');
-      changeActions = plugin.changeActions();
-    });
+    suite('early init', () => {
+      setup(() => {
+        Gerrit._resetPlugins();
+        Gerrit.install(p => { plugin = p; }, '0.1',
+            'http://test.com/plugins/testplugin/static/test.js');
+        // Mimic all plugins loaded.
+        Gerrit._setPluginsPending([]);
+        changeActions = plugin.changeActions();
+        element = fixture('basic');
+      });
 
-    teardown(() => {
-      changeActions = null;
-    });
+      teardown(() => {
+        changeActions = null;
+      });
 
-    test('property existence', () => {
-      const properties = [
-        'ActionType',
-        'ChangeActions',
-        'RevisionActions',
-      ];
-      for (const p of properties) {
-        assertArraysEqual(changeActions[p], element[p]);
-      }
-    });
-
-    test('add/remove primary action keys', () => {
-      element.primaryActionKeys = [];
-      changeActions.addPrimaryActionKey('foo');
-      assertArraysEqual(element.primaryActionKeys, ['foo']);
-      changeActions.addPrimaryActionKey('foo');
-      assertArraysEqual(element.primaryActionKeys, ['foo']);
-      changeActions.addPrimaryActionKey('bar');
-      assertArraysEqual(element.primaryActionKeys, ['foo', 'bar']);
-      changeActions.removePrimaryActionKey('foo');
-      assertArraysEqual(element.primaryActionKeys, ['bar']);
-      changeActions.removePrimaryActionKey('baz');
-      assertArraysEqual(element.primaryActionKeys, ['bar']);
-      changeActions.removePrimaryActionKey('bar');
-      assertArraysEqual(element.primaryActionKeys, []);
-    });
-
-    test('action buttons', done => {
-      const key = changeActions.add(changeActions.ActionType.REVISION, 'Bork!');
-      const handler = sinon.spy();
-      changeActions.addTapListener(key, handler);
-      flush(() => {
-        MockInteractions.tap(element.$$('[data-action-key="' + key + '"]'));
-        assert(handler.calledOnce);
-        changeActions.removeTapListener(key, handler);
-        MockInteractions.tap(element.$$('[data-action-key="' + key + '"]'));
-        assert(handler.calledOnce);
-        changeActions.remove(key);
-        flush(() => {
-          assert.isNull(element.$$('[data-action-key="' + key + '"]'));
-          done();
+      test('does not throw', ()=> {
+        assert.doesNotThrow(() => {
+          changeActions.add('change', 'foo');
         });
       });
     });
 
-    test('action button properties', done => {
-      const key = changeActions.add(changeActions.ActionType.REVISION, 'Bork!');
-      flush(() => {
-        const button = element.$$('[data-action-key="' + key + '"]');
-        assert.isOk(button);
-        assert.equal(button.getAttribute('data-label'), 'Bork!');
-        assert.isNotOk(button.disabled);
-        changeActions.setLabel(key, 'Yo');
-        changeActions.setEnabled(key, false);
+    suite('normal init', () => {
+      setup(() => {
+        Gerrit._resetPlugins();
+        element = fixture('basic');
+        sinon.stub(element, '_editStatusChanged');
+        element.change = {};
+        element._hasKnownChainState = false;
+        Gerrit.install(p => { plugin = p; }, '0.1',
+            'http://test.com/plugins/testplugin/static/test.js');
+        changeActions = plugin.changeActions();
+        // Mimic all plugins loaded.
+        Gerrit._setPluginsPending([]);
+      });
+
+      teardown(() => {
+        changeActions = null;
+      });
+
+      test('property existence', () => {
+        const properties = [
+          'ActionType',
+          'ChangeActions',
+          'RevisionActions',
+        ];
+        for (const p of properties) {
+          assertArraysEqual(changeActions[p], element[p]);
+        }
+      });
+
+      test('add/remove primary action keys', () => {
+        element.primaryActionKeys = [];
+        changeActions.addPrimaryActionKey('foo');
+        assertArraysEqual(element.primaryActionKeys, ['foo']);
+        changeActions.addPrimaryActionKey('foo');
+        assertArraysEqual(element.primaryActionKeys, ['foo']);
+        changeActions.addPrimaryActionKey('bar');
+        assertArraysEqual(element.primaryActionKeys, ['foo', 'bar']);
+        changeActions.removePrimaryActionKey('foo');
+        assertArraysEqual(element.primaryActionKeys, ['bar']);
+        changeActions.removePrimaryActionKey('baz');
+        assertArraysEqual(element.primaryActionKeys, ['bar']);
+        changeActions.removePrimaryActionKey('bar');
+        assertArraysEqual(element.primaryActionKeys, []);
+      });
+
+      test('action buttons', done => {
+        const key = changeActions.add(changeActions.ActionType.REVISION, 'Bork!');
+        const handler = sinon.spy();
+        changeActions.addTapListener(key, handler);
         flush(() => {
-          assert.equal(button.getAttribute('data-label'), 'Yo');
-          assert.isTrue(button.disabled);
-          done();
+          MockInteractions.tap(element.$$('[data-action-key="' + key + '"]'));
+          assert(handler.calledOnce);
+          changeActions.removeTapListener(key, handler);
+          MockInteractions.tap(element.$$('[data-action-key="' + key + '"]'));
+          assert(handler.calledOnce);
+          changeActions.remove(key);
+          flush(() => {
+            assert.isNull(element.$$('[data-action-key="' + key + '"]'));
+            done();
+          });
         });
       });
-    });
 
-    test('hide action buttons', done => {
-      const key = changeActions.add(changeActions.ActionType.REVISION, 'Bork!');
-      flush(() => {
-        const button = element.$$('[data-action-key="' + key + '"]');
-        assert.isOk(button);
-        assert.isFalse(button.hasAttribute('hidden'));
-        changeActions.setActionHidden(
-            changeActions.ActionType.REVISION, key, true);
+      test('action button properties', done => {
+        const key = changeActions.add(changeActions.ActionType.REVISION, 'Bork!');
         flush(() => {
           const button = element.$$('[data-action-key="' + key + '"]');
-          assert.isNotOk(button);
-          done();
+          assert.isOk(button);
+          assert.equal(button.getAttribute('data-label'), 'Bork!');
+          assert.isNotOk(button.disabled);
+          changeActions.setLabel(key, 'Yo');
+          changeActions.setTitle(key, 'Yo hint');
+          changeActions.setEnabled(key, false);
+          changeActions.setIcon(key, 'pupper');
+          flush(() => {
+            assert.equal(button.getAttribute('data-label'), 'Yo');
+            assert.equal(button.getAttribute('title'), 'Yo hint');
+            assert.isTrue(button.disabled);
+            assert.equal(Polymer.dom(button).querySelector('iron-icon').icon,
+                'gr-icons:pupper');
+            done();
+          });
         });
       });
-    });
 
-    test('move action button to overflow', done => {
-      const key = changeActions.add(changeActions.ActionType.REVISION, 'Bork!');
-      flush(() => {
-        assert.isTrue(element.$.moreActions.hidden);
-        assert.isOk(element.$$('[data-action-key="' + key + '"]'));
-        changeActions.setActionOverflow(
-            changeActions.ActionType.REVISION, key, true);
+      test('hide action buttons', done => {
+        const key = changeActions.add(changeActions.ActionType.REVISION, 'Bork!');
         flush(() => {
-          assert.isNotOk(element.$$('[data-action-key="' + key + '"]'));
-          assert.isFalse(element.$.moreActions.hidden);
-          assert.strictEqual(element.$.moreActions.items[0].name, 'Bork!');
-          done();
+          const button = element.$$('[data-action-key="' + key + '"]');
+          assert.isOk(button);
+          assert.isFalse(button.hasAttribute('hidden'));
+          changeActions.setActionHidden(
+              changeActions.ActionType.REVISION, key, true);
+          flush(() => {
+            const button = element.$$('[data-action-key="' + key + '"]');
+            assert.isNotOk(button);
+            done();
+          });
         });
       });
-    });
 
-    test('change actions priority', done => {
-      const key1 =
+      test('move action button to overflow', done => {
+        const key = changeActions.add(changeActions.ActionType.REVISION, 'Bork!');
+        flush(() => {
+          assert.isTrue(element.$.moreActions.hidden);
+          assert.isOk(element.$$('[data-action-key="' + key + '"]'));
+          changeActions.setActionOverflow(
+              changeActions.ActionType.REVISION, key, true);
+          flush(() => {
+            assert.isNotOk(element.$$('[data-action-key="' + key + '"]'));
+            assert.isFalse(element.$.moreActions.hidden);
+            assert.strictEqual(element.$.moreActions.items[0].name, 'Bork!');
+            done();
+          });
+        });
+      });
+
+      test('change actions priority', done => {
+        const key1 =
           changeActions.add(changeActions.ActionType.REVISION, 'Bork!');
-      const key2 =
+        const key2 =
           changeActions.add(changeActions.ActionType.CHANGE, 'Squanch?');
-      flush(() => {
-        let buttons =
-            Polymer.dom(element.root).querySelectorAll('[data-action-key]');
-        assert.equal(buttons[0].getAttribute('data-action-key'), key1);
-        assert.equal(buttons[1].getAttribute('data-action-key'), key2);
-        changeActions.setActionPriority(
-            changeActions.ActionType.REVISION, key1, 10);
         flush(() => {
-          buttons =
+          let buttons =
+            Polymer.dom(element.root).querySelectorAll('[data-action-key]');
+          assert.equal(buttons[0].getAttribute('data-action-key'), key1);
+          assert.equal(buttons[1].getAttribute('data-action-key'), key2);
+          changeActions.setActionPriority(
+              changeActions.ActionType.REVISION, key1, 10);
+          flush(() => {
+            buttons =
               Polymer.dom(element.root).querySelectorAll('[data-action-key]');
-          assert.equal(buttons[0].getAttribute('data-action-key'), key2);
-          assert.equal(buttons[1].getAttribute('data-action-key'), key1);
-          done();
+            assert.equal(buttons[0].getAttribute('data-action-key'), key2);
+            assert.equal(buttons[1].getAttribute('data-action-key'), key1);
+            done();
+          });
         });
       });
     });
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-change-reply-js-api.js b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-change-reply-js-api.js
index 65aa364..e86ba4d 100644
--- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-change-reply-js-api.js
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-change-reply-js-api.js
@@ -1,20 +1,36 @@
-// 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.
+/**
+ * @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.
+ */
 (function(window) {
   'use strict';
 
   /**
+   * Ensure GrChangeReplyInterface instance has access to gr-reply-dialog
+   * element and retrieve if the interface was created before element.
+   * @param {!GrChangeReplyInterfaceOld} api
+   */
+  function ensureEl(api) {
+    if (!api._el) {
+      const sharedApiElement = document.createElement('gr-js-api-interface');
+      api._el = sharedApiElement.getElement(
+          sharedApiElement.Element.REPLY_DIALOG);
+    }
+  }
+
+  /**
    * @deprecated
    */
   function GrChangeReplyInterfaceOld(el) {
@@ -22,14 +38,17 @@
   }
 
   GrChangeReplyInterfaceOld.prototype.getLabelValue = function(label) {
+    ensureEl(this);
     return this._el.getLabelValue(label);
   };
 
   GrChangeReplyInterfaceOld.prototype.setLabelValue = function(label, value) {
+    ensureEl(this);
     this._el.setLabelValue(label, value);
   };
 
   GrChangeReplyInterfaceOld.prototype.send = function(opt_includeComments) {
+    ensureEl(this);
     return this._el.send(opt_includeComments);
   };
 
@@ -57,5 +76,21 @@
       });
     };
 
+  GrChangeReplyInterface.prototype.addLabelValuesChangedCallback =
+    function(handler) {
+      this.plugin.hook('reply-label-scores').onAttached(el => {
+        if (!el.content) { return; }
+
+        el.content.addEventListener('labels-changed', e => {
+          console.log('labels-changed', e.detail);
+          handler(e.detail);
+        });
+      });
+    };
+
+  GrChangeReplyInterface.prototype.showMessage = function(message) {
+    return this._el.setPluginMessage(message);
+  };
+
   window.GrChangeReplyInterface = GrChangeReplyInterface;
 })(window);
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-change-reply-js-api_test.html b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-change-reply-js-api_test.html
index 2f67035..278f95a 100644
--- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-change-reply-js-api_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-change-reply-js-api_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -40,37 +41,80 @@
     let element;
     let sandbox;
     let changeReply;
+    let plugin;
 
     setup(() => {
+      sandbox = sinon.sandbox.create();
       stub('gr-rest-api-interface', {
         getConfig() { return Promise.resolve({}); },
         getAccount() { return Promise.resolve(null); },
       });
-      element = fixture('basic');
-      sandbox = sinon.sandbox.create();
-      let plugin;
-      Gerrit.install(p => { plugin = p; }, '0.1',
-          'http://test.com/plugins/testplugin/static/test.js');
-      changeReply = plugin.changeReply();
     });
 
     teardown(() => {
-      changeReply = null;
       sandbox.restore();
     });
 
-    test('calls', () => {
-      sandbox.stub(element, 'getLabelValue').returns('+123');
-      assert.equal(changeReply.getLabelValue('My-Label'), '+123');
+    suite('early init', () => {
+      setup(() => {
+        Gerrit.install(p => { plugin = p; }, '0.1',
+            'http://test.com/plugins/testplugin/static/test.js');
+        changeReply = plugin.changeReply();
+        element = fixture('basic');
+      });
 
-      sandbox.stub(element, 'setLabelValue');
-      changeReply.setLabelValue('My-Label', '+1337');
-      assert.isTrue(
-          element.setLabelValue.calledWithExactly('My-Label', '+1337'));
+      teardown(() => {
+        changeReply = null;
+      });
 
-      sandbox.stub(element, 'send');
-      changeReply.send(false);
-      assert.isTrue(element.send.calledWithExactly(false));
+      test('works', () => {
+        sandbox.stub(element, 'getLabelValue').returns('+123');
+        assert.equal(changeReply.getLabelValue('My-Label'), '+123');
+
+        sandbox.stub(element, 'setLabelValue');
+        changeReply.setLabelValue('My-Label', '+1337');
+        assert.isTrue(
+            element.setLabelValue.calledWithExactly('My-Label', '+1337'));
+
+        sandbox.stub(element, 'send');
+        changeReply.send(false);
+        assert.isTrue(element.send.calledWithExactly(false));
+
+        sandbox.stub(element, 'setPluginMessage');
+        changeReply.showMessage('foobar');
+        assert.isTrue(element.setPluginMessage.calledWithExactly('foobar'));
+      });
+    });
+
+    suite('normal init', () => {
+      setup(() => {
+        element = fixture('basic');
+        Gerrit.install(p => { plugin = p; }, '0.1',
+            'http://test.com/plugins/testplugin/static/test.js');
+        changeReply = plugin.changeReply();
+      });
+
+      teardown(() => {
+        changeReply = null;
+      });
+
+      test('works', () => {
+        sandbox.stub(element, 'getLabelValue').returns('+123');
+        assert.equal(changeReply.getLabelValue('My-Label'), '+123');
+
+        sandbox.stub(element, 'setLabelValue');
+        changeReply.setLabelValue('My-Label', '+1337');
+        assert.isTrue(
+            element.setLabelValue.calledWithExactly('My-Label', '+1337'));
+
+        sandbox.stub(element, 'send');
+        changeReply.send(false);
+        assert.isTrue(element.send.calledWithExactly(false));
+
+        sandbox.stub(element, 'setPluginMessage');
+        changeReply.showMessage('foobar');
+        assert.isTrue(element.setPluginMessage.calledWithExactly('foobar'));
+      });
     });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface.html b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface.html
index fda085a..d8a662e 100644
--- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface.html
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,15 +18,20 @@
 <link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
 <link rel="import" href="../../../behaviors/gr-patch-set-behavior/gr-patch-set-behavior.html">
 <link rel="import" href="../../core/gr-reporting/gr-reporting.html">
+<link rel="import" href="../../plugins/gr-admin-api/gr-admin-api.html">
 <link rel="import" href="../../plugins/gr-attribute-helper/gr-attribute-helper.html">
+<link rel="import" href="../../plugins/gr-change-metadata-api/gr-change-metadata-api.html">
 <link rel="import" href="../../plugins/gr-dom-hooks/gr-dom-hooks.html">
 <link rel="import" href="../../plugins/gr-event-helper/gr-event-helper.html">
 <link rel="import" href="../../plugins/gr-popup-interface/gr-popup-interface.html">
+<link rel="import" href="../../plugins/gr-repo-api/gr-repo-api.html">
+<link rel="import" href="../../plugins/gr-settings-api/gr-settings-api.html">
 <link rel="import" href="../../plugins/gr-theme-api/gr-theme-api.html">
-<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
 <link rel="import" href="../gr-rest-api-interface/gr-rest-api-interface.html">
 
 <dom-module id="gr-js-api-interface">
+  <script src="gr-annotation-actions-context.js"></script>
+  <script src="gr-annotation-actions-js-api.js"></script>
   <script src="gr-change-actions-js-api.js"></script>
   <script src="gr-change-reply-js-api.js"></script>
   <script src="gr-js-api-interface.js"></script>
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface.js b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface.js
index 420d4af..820d2c0 100644
--- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface.js
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -23,6 +26,8 @@
     COMMENT: 'comment',
     REVERT: 'revert',
     POST_REVERT: 'postrevert',
+    ANNOTATE_DIFF: 'annotatediff',
+    ADMIN_MENU_LINKS: 'admin-menu-links',
   };
 
   const Element = {
@@ -119,18 +124,34 @@
     },
 
     _handleShowChange(detail) {
-      for (const cb of this._getEventCallbacks(EventType.SHOW_CHANGE)) {
-        const change = detail.change;
-        const patchNum = detail.patchNum;
-        let revision;
-        for (const rev of Object.values(change.revisions || {})) {
-          if (this.patchNumEquals(rev._number, patchNum)) {
-            revision = rev;
-            break;
-          }
+      // Note (issue 8221) Shallow clone the change object and add a mergeable
+      // getter with deprecation warning. This makes the change detail appear as
+      // though SKIP_MERGEABLE was not set, so that plugins that expect it can
+      // still access.
+      //
+      // This clone and getter can be removed after plugins migrate to use
+      // info.mergeable.
+      const change = Object.assign({
+        get mergeable() {
+          console.warn('Accessing change.mergeable from SHOW_CHANGE is ' +
+              'deprecated! Use info.mergeable instead.');
+          return detail.info.mergeable;
+        },
+      }, detail.change);
+      const patchNum = detail.patchNum;
+      const info = detail.info;
+
+      let revision;
+      for (const rev of Object.values(change.revisions || {})) {
+        if (this.patchNumEquals(rev._number, patchNum)) {
+          revision = rev;
+          break;
         }
+      }
+
+      for (const cb of this._getEventCallbacks(EventType.SHOW_CHANGE)) {
         try {
-          cb(change, revision);
+          cb(change, revision, info);
         } catch (err) {
           console.error(err);
         }
@@ -178,6 +199,29 @@
       return revertMsg;
     },
 
+    getDiffLayers(path, changeNum, patchNum) {
+      const layers = [];
+      for (const annotationApi of
+           this._getEventCallbacks(EventType.ANNOTATE_DIFF)) {
+        try {
+          const layer = annotationApi.getLayer(path, changeNum, patchNum);
+          layers.push(layer);
+        } catch (err) {
+          console.error(err);
+        }
+      }
+      return layers;
+    },
+
+    getAdminMenuLinks() {
+      const links = [];
+      for (const adminApi of
+          this._getEventCallbacks(EventType.ADMIN_MENU_LINKS)) {
+        links.push(...adminApi.getMenuLinks());
+      }
+      return links;
+    },
+
     getLabelValuesPostRevert(change) {
       let labels = {};
       for (const cb of this._getEventCallbacks(EventType.POST_REVERT)) {
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface_test.html b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface_test.html
index 62fc1db..e0c7c37 100644
--- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -59,9 +60,9 @@
       });
       element = fixture('basic');
       errorStub = sandbox.stub(console, 'error');
-      Gerrit._setPluginsCount(1);
       Gerrit.install(p => { plugin = p; }, '0.1',
           'http://test.com/plugins/testplugin/static/test.js');
+      Gerrit._setPluginsPending([]);
     });
 
     teardown(() => {
@@ -77,6 +78,16 @@
       assert.strictEqual(plugin, otherPlugin);
     });
 
+    test('flushes preinstalls if provided', () => {
+      assert.doesNotThrow(() => {
+        Gerrit._flushPreinstalls();
+      });
+      window.Gerrit.flushPreinstalls = sandbox.stub();
+      Gerrit._flushPreinstalls();
+      assert.isTrue(window.Gerrit.flushPreinstalls.calledOnce);
+      delete window.Gerrit.flushPreinstalls;
+    });
+
     test('url', () => {
       assert.equal(plugin.url(), 'http://test.com/plugins/testplugin/');
       assert.equal(plugin.url('/static/test.js'),
@@ -179,15 +190,17 @@
         _number: 42,
         revisions: {def: {_number: 2}, abc: {_number: 1}},
       };
+      const expectedChange = Object.assign({mergeable: false}, testChange);
       plugin.on(element.EventType.SHOW_CHANGE, throwErrFn);
-      plugin.on(element.EventType.SHOW_CHANGE, (change, revision) => {
-        assert.deepEqual(change, testChange);
+      plugin.on(element.EventType.SHOW_CHANGE, (change, revision, info) => {
+        assert.deepEqual(change, expectedChange);
         assert.deepEqual(revision, testChange.revisions.abc);
+        assert.deepEqual(info, {mergeable: false});
         assert.isTrue(errorStub.calledOnce);
         done();
       });
       element.handleEvent(element.EventType.SHOW_CHANGE,
-          {change: testChange, patchNum: 1});
+          {change: testChange, patchNum: 1, info: {mergeable: false}});
     });
 
     test('handleEvent awaits plugins load', done => {
@@ -303,7 +316,6 @@
     test('_setPluginsCount', done => {
       stub('gr-reporting', {
         pluginsLoaded() {
-          assert.equal(Gerrit._pluginsPending, 0);
           done();
         },
       });
@@ -318,17 +330,19 @@
       assert.isTrue(Gerrit._arePluginsLoaded());
     });
 
-    test('_pluginInstalled', done => {
+    test('_pluginInstalled', () => {
+      const pluginsLoadedStub = sandbox.stub();
       stub('gr-reporting', {
-        pluginsLoaded() {
-          assert.equal(Gerrit._pluginsPending, 0);
-          done();
-        },
+        pluginsLoaded: (...args) => pluginsLoadedStub(...args),
       });
-      Gerrit._setPluginsCount(2);
-      Gerrit._pluginInstalled();
-      assert.equal(Gerrit._pluginsPending, 1);
-      Gerrit._pluginInstalled();
+      const plugins = [
+        'http://test.com/plugins/foo/static/test.js',
+        'http://test.com/plugins/bar/static/test.js',
+      ];
+      Gerrit._setPluginsPending(plugins);
+      Gerrit._pluginInstalled(plugins[0]);
+      Gerrit._pluginInstalled(plugins[1]);
+      assert.isTrue(pluginsLoadedStub.calledWithExactly(['foo', 'bar']));
     });
 
     test('install calls _pluginInstalled', () => {
@@ -345,27 +359,42 @@
       assert.isTrue(Gerrit._pluginInstalled.calledOnce);
     });
 
-    test('install calls _pluginInstalled on error', () => {
-      sandbox.stub(Gerrit, '_pluginInstalled');
+    test('plugin install errors mark plugins as loaded', () => {
+      Gerrit._setPluginsCount(1);
       Gerrit.install(() => {}, '0.0pre-alpha');
-      assert.isTrue(Gerrit._pluginInstalled.calledOnce);
+      return Gerrit.awaitPluginsLoaded();
+    });
+
+    test('multiple ui plugins per java plugin', () => {
+      const file1 = 'http://test.com/plugins/qaz/static/foo.nocache.js';
+      const file2 = 'http://test.com/plugins/qaz/static/bar.js';
+      Gerrit._setPluginsPending([file1, file2]);
+      Gerrit.install(() => {}, '0.1', file1);
+      Gerrit.install(() => {}, '0.1', file2);
+      return Gerrit.awaitPluginsLoaded();
+    });
+
+    test('plugin install errors shows toasts', () => {
+      const alertStub = sandbox.stub();
+      document.addEventListener('show-alert', alertStub);
+      Gerrit._setPluginsCount(1);
+      Gerrit.install(() => {}, '0.0pre-alpha');
+      return Gerrit.awaitPluginsLoaded().then(() => {
+        assert.isTrue(alertStub.calledOnce);
+      });
     });
 
     test('installGwt calls _pluginInstalled', () => {
       sandbox.stub(Gerrit, '_pluginInstalled');
-      Gerrit.installGwt();
+      Gerrit.installGwt('http://test.com/plugins/testplugin/static/test.js');
       assert.isTrue(Gerrit._pluginInstalled.calledOnce);
     });
 
-    test('installGwt returns a stub object', () => {
-      const plugin = Gerrit.installGwt();
-      sandbox.stub(console, 'warn');
-      assert.isAbove(Object.keys(plugin).length, 0);
-      for (const name of Object.keys(plugin)) {
-        console.warn.reset();
-        plugin[name]();
-        assert.isTrue(console.warn.calledOnce);
-      }
+    test('installGwt returns a plugin', () => {
+      const plugin = Gerrit.installGwt(
+          'http://test.com/plugins/testplugin/static/test.js');
+      assert.isOk(plugin);
+      assert.isOk(plugin._loadedGwt);
     });
 
     test('attributeHelper', () => {
@@ -379,6 +408,47 @@
       assert.notStrictEqual(plugin.install, plugin.deprecated.install);
     });
 
+    test('getAdminMenuLinks', () => {
+      const links = [{text: 'a', url: 'b'}, {text: 'c', url: 'd'}];
+      const getCallbacksStub = sandbox.stub(element, '_getEventCallbacks')
+          .returns([
+            {getMenuLinks: () => [links[0]]},
+            {getMenuLinks: () => [links[1]]},
+          ]);
+      const result = element.getAdminMenuLinks();
+      assert.deepEqual(result, links);
+      assert.isTrue(getCallbacksStub.calledOnce);
+      assert.equal(getCallbacksStub.lastCall.args[0],
+          element.EventType.ADMIN_MENU_LINKS);
+    });
+
+    test('Gerrit._isPluginPreloaded', () => {
+      Gerrit._preloadedPlugins = {baz: ()=>{}};
+      assert.isFalse(Gerrit._isPluginPreloaded('plugins/foo/bar'));
+      assert.isFalse(Gerrit._isPluginPreloaded('http://a.com/42'));
+      assert.isTrue(Gerrit._isPluginPreloaded('preloaded:baz'));
+      Gerrit._preloadedPlugins = null;
+    });
+
+    test('preloaded plugins are installed', () => {
+      const installStub = sandbox.stub();
+      Gerrit._preloadedPlugins = {foo: installStub};
+      Gerrit._installPreloadedPlugins();
+      assert.isTrue(installStub.called);
+      const pluginApi = installStub.lastCall.args[0];
+      assert.strictEqual(pluginApi.getPluginName(), 'foo');
+    });
+
+    test('installing preloaded plugin', () => {
+      let plugin;
+      window.ASSETS_PATH = 'http://blips.com/chitz/';
+      Gerrit.install(p => { plugin = p; }, '0.1', 'preloaded:foo');
+      assert.strictEqual(plugin.getPluginName(), 'foo');
+      assert.strictEqual(plugin.url('/some/thing.html'),
+          'http://blips.com/plugins/foo/some/thing.html');
+      delete window.ASSETS_PATH;
+    });
+
     suite('test plugin with base url', () => {
       setup(() => {
         sandbox.stub(Gerrit.BaseUrlBehavior, 'getBaseUrl').returns('/r');
@@ -398,9 +468,8 @@
 
     suite('popup', () => {
       test('popup(element) is deprecated', () => {
-        assert.throws(() => {
-          plugin.popup(document.createElement('div'));
-        });
+        plugin.popup(document.createElement('div'));
+        assert.isTrue(console.error.calledOnce);
       });
 
       test('popup(moduleName) creates popup with component', () => {
@@ -463,5 +532,111 @@
         assert.isFalse(stub.called);
       });
     });
+
+    suite('screen', () => {
+      test('screenUrl()', () => {
+        sandbox.stub(Gerrit.BaseUrlBehavior, 'getBaseUrl').returns('/base');
+        assert.equal(plugin.screenUrl(), 'http://test.com/base/x/testplugin');
+        assert.equal(
+            plugin.screenUrl('foo'), 'http://test.com/base/x/testplugin/foo');
+      });
+
+      test('deprecated works', () => {
+        const stub = sandbox.stub();
+        const hookStub = {onAttached: sandbox.stub()};
+        sandbox.stub(plugin, 'hook').returns(hookStub);
+        plugin.deprecated.screen('foo', stub);
+        assert.isTrue(plugin.hook.calledWith('testplugin-screen-foo'));
+        const fakeEl = {style: {display: ''}};
+        hookStub.onAttached.callArgWith(0, fakeEl);
+        assert.isTrue(stub.called);
+        assert.equal(fakeEl.style.display, 'none');
+      });
+
+      test('works', () => {
+        sandbox.stub(plugin, 'registerCustomComponent');
+        plugin.screen('foo', 'some-module');
+        assert.isTrue(plugin.registerCustomComponent.calledWith(
+            'testplugin-screen-foo', 'some-module'));
+      });
+    });
+
+    suite('panel', () => {
+      let fakeEl;
+      let emulateAttached;
+
+      setup(()=> {
+        fakeEl = {change: {}, revision: {}};
+        const hookStub = {onAttached: sandbox.stub()};
+        sandbox.stub(plugin, 'hook').returns(hookStub);
+        emulateAttached = () => hookStub.onAttached.callArgWith(0, fakeEl);
+      });
+
+      test('plugin.panel is deprecated', () => {
+        plugin.panel('rubbish');
+        assert.isTrue(console.error.called);
+      });
+
+      [
+        ['CHANGE_SCREEN_BELOW_COMMIT_INFO_BLOCK', 'change-view-integration'],
+        ['CHANGE_SCREEN_BELOW_CHANGE_INFO_BLOCK', 'change-metadata-item'],
+      ].forEach(([panelName, endpointName]) => {
+        test(`deprecated.panel works for ${panelName}`, () => {
+          const callback = sandbox.stub();
+          plugin.deprecated.panel(panelName, callback);
+          assert.isTrue(plugin.hook.calledWith(endpointName));
+          emulateAttached();
+          assert.isTrue(callback.called);
+          const args = callback.args[0][0];
+          assert.strictEqual(args.body, fakeEl);
+          assert.strictEqual(args.p.CHANGE_INFO, fakeEl.change);
+          assert.strictEqual(args.p.REVISION_INFO, fakeEl.revision);
+        });
+      });
+    });
+
+    suite('settingsScreen', () => {
+      test('plugin.settingsScreen is deprecated', () => {
+        plugin.settingsScreen('rubbish');
+        assert.isTrue(console.error.called);
+      });
+
+      test('plugin.settings() returns GrSettingsApi', () => {
+        assert.isOk(plugin.settings());
+        assert.isTrue(plugin.settings() instanceof GrSettingsApi);
+      });
+
+      test('plugin.deprecated.settingsScreen() works', () => {
+        const hookStub = {onAttached: sandbox.stub()};
+        sandbox.stub(plugin, 'hook').returns(hookStub);
+        const fakeSettings = {};
+        fakeSettings.title = sandbox.stub().returns(fakeSettings);
+        fakeSettings.token = sandbox.stub().returns(fakeSettings);
+        fakeSettings.module = sandbox.stub().returns(fakeSettings);
+        fakeSettings.build = sandbox.stub().returns(hookStub);
+        sandbox.stub(plugin, 'settings').returns(fakeSettings);
+        const callback = sandbox.stub();
+
+        plugin.deprecated.settingsScreen('path', 'menu', callback);
+        assert.isTrue(fakeSettings.title.calledWith('menu'));
+        assert.isTrue(fakeSettings.token.calledWith('path'));
+        assert.isTrue(fakeSettings.module.calledWith('div'));
+        assert.equal(fakeSettings.build.callCount, 1);
+
+        const fakeBody = {};
+        const fakeEl = {
+          style: {
+            display: '',
+          },
+          querySelector: sandbox.stub().returns(fakeBody),
+        };
+        // Emulate settings screen attached
+        hookStub.onAttached.callArgWith(0, fakeEl);
+        assert.isTrue(callback.called);
+        const args = callback.args[0][0];
+        assert.strictEqual(args.body, fakeBody);
+        assert.equal(fakeEl.style.display, 'none');
+      });
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-action-context.js b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-action-context.js
index f0c42f0..5ac8773 100644
--- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-action-context.js
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-action-context.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function(window) {
   'use strict';
 
@@ -90,7 +93,14 @@
     }
     this.plugin.restApi()
         .send(this.action.method, this.action.__url, payload)
-        .then(onSuccess);
+        .then(onSuccess)
+        .catch(error => {
+          document.dispatchEvent(new CustomEvent('show-alert', {
+            detail: {
+              message: `Plugin network error: ${error}`,
+            },
+          }));
+        });
   };
 
   window.GrPluginActionContext = GrPluginActionContext;
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-action-context_test.html b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-action-context_test.html
index 072a781..bf6a046 100644
--- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-action-context_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-action-context_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -127,5 +128,26 @@
       assert.isTrue(sendStub.calledWith(
           'METHOD', '/changes/1/revisions/2/foo~bar', payload));
     });
+
+    test('call error', done => {
+      instance.action = {
+        method: 'METHOD',
+        __key: 'key',
+        __url: '/changes/1/revisions/2/foo~bar',
+      };
+      const sendStub = sandbox.stub().returns(Promise.reject('boom'));
+      sandbox.stub(plugin, 'restApi').returns({
+        send: sendStub,
+      });
+      const errorStub = sandbox.stub();
+      document.addEventListener('network-error', errorStub);
+      instance.call();
+      flush(() => {
+        assert.isTrue(errorStub.calledOnce);
+        assert.equal(errorStub.args[0][0].detail.message,
+            'Plugin network error: boom');
+        done();
+      });
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-endpoints.js b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-endpoints.js
index 1ee9eec..9931f72 100644
--- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-endpoints.js
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-endpoints.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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(window) {
   'use strict';
 
@@ -26,19 +29,35 @@
     this._callbacks[endpoint].push(callback);
   };
 
+  GrPluginEndpoints.prototype._getOrCreateModuleInfo = function(plugin,
+      endpoint, type, moduleName, domHook) {
+    const existingModule = this._endpoints[endpoint].find(info =>
+        info.plugin === plugin &&
+        info.moduleName === moduleName &&
+        info.domHook === domHook
+    );
+    if (existingModule) {
+      return existingModule;
+    } else {
+      const newModule = {
+        moduleName,
+        plugin,
+        pluginUrl: plugin._url,
+        type,
+        domHook,
+      };
+      this._endpoints[endpoint].push(newModule);
+      return newModule;
+    }
+  };
+
   GrPluginEndpoints.prototype.registerModule = function(plugin, endpoint, type,
       moduleName, domHook) {
     if (!this._endpoints[endpoint]) {
       this._endpoints[endpoint] = [];
     }
-    const moduleInfo = {
-      moduleName,
-      plugin,
-      pluginUrl: plugin._url,
-      type,
-      domHook,
-    };
-    this._endpoints[endpoint].push(moduleInfo);
+    const moduleInfo = this._getOrCreateModuleInfo(plugin, endpoint, type,
+        moduleName, domHook);
     if (Gerrit._arePluginsLoaded() && this._callbacks[endpoint]) {
       this._callbacks[endpoint].forEach(callback => callback(moduleInfo));
     }
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-endpoints_test.html b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-endpoints_test.html
index a61cdc8..b00b5ac 100644
--- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-endpoints_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-endpoints_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,6 +24,8 @@
 <link rel="import" href="../../../test/common-test-setup.html"/>
 <link rel="import" href="gr-js-api-interface.html"/>
 
+<script>void(0);</script>
+
 <script>
   suite('gr-plugin-endpoints tests', () => {
     let sandbox;
@@ -102,7 +105,7 @@
 
     test('getPlugins', () => {
       assert.deepEqual(
-          instance.getPlugins('a-place'), [pluginFoo._url, pluginBar._url]);
+          instance.getPlugins('a-place'), [pluginFoo._url]);
     });
 
     test('onNewEndpoint', () => {
@@ -118,5 +121,26 @@
         domHook,
       });
     });
+
+    test('reuse dom hooks', () => {
+      instance.registerModule(
+          pluginFoo, 'a-place', 'decorate', 'foo-module', domHook);
+      assert.deepEqual(instance.getDetails('a-place'), [
+        {
+          moduleName: 'foo-module',
+          plugin: pluginFoo,
+          pluginUrl: pluginFoo._url,
+          type: 'decorate',
+          domHook,
+        },
+        {
+          moduleName: 'bar-module',
+          plugin: pluginBar,
+          pluginUrl: pluginBar._url,
+          type: 'style',
+          domHook,
+        },
+      ]);
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-rest-api.js b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-rest-api.js
index d04a758..eb0c7e0 100644
--- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-rest-api.js
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-rest-api.js
@@ -1,26 +1,45 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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(window) {
   'use strict';
 
+  let restApi;
+
+  function getRestApi() {
+    if (!restApi) {
+      restApi = document.createElement('gr-rest-api-interface');
+    }
+    return restApi;
+  }
+
   function GrPluginRestApi(opt_prefix) {
     this.opt_prefix = opt_prefix || '';
-    this._restApi = document.createElement('gr-rest-api-interface');
   }
 
   GrPluginRestApi.prototype.getLoggedIn = function() {
-    return this._restApi.getLoggedIn();
+    return getRestApi().getLoggedIn();
+  };
+
+  GrPluginRestApi.prototype.getVersion = function() {
+    return getRestApi().getVersion();
+  };
+
+  GrPluginRestApi.prototype.invalidateReposCache = function() {
+    getRestApi().invalidateReposCache();
   };
 
   /**
@@ -28,10 +47,14 @@
    * @param {string} method HTTP Method (GET, POST, etc)
    * @param {string} url URL without base path or plugin prefix
    * @param {Object=} payload Respected for POST and PUT only.
+   * @param {?function(?Response, string=)=} opt_errFn
+   *    passed as null sometimes.
    * @return {!Promise}
    */
-  GrPluginRestApi.prototype.fetch = function(method, url, opt_payload) {
-    return this._restApi.send(method, this.opt_prefix + url, opt_payload);
+  GrPluginRestApi.prototype.fetch = function(method, url, opt_payload,
+      opt_errFn) {
+    return getRestApi().send(method, this.opt_prefix + url, opt_payload,
+        opt_errFn);
   };
 
   /**
@@ -39,10 +62,13 @@
    * @param {string} method HTTP Method (GET, POST, etc)
    * @param {string} url URL without base path or plugin prefix
    * @param {Object=} payload Respected for POST and PUT only.
+   * @param {?function(?Response, string=)=} opt_errFn
+   *    passed as null sometimes.
    * @return {!Promise} resolves on success, rejects on error.
    */
-  GrPluginRestApi.prototype.send = function(method, url, opt_payload) {
-    return this.fetch(method, url, opt_payload).then(response => {
+  GrPluginRestApi.prototype.send = function(method, url, opt_payload,
+      opt_errFn) {
+    return this.fetch(method, url, opt_payload, opt_errFn).then(response => {
       if (response.status < 200 || response.status >= 300) {
         return response.text().then(text => {
           if (text) {
@@ -52,7 +78,7 @@
           }
         });
       } else {
-        return this._restApi.getResponseObject(response);
+        return getRestApi().getResponseObject(response);
       }
     });
   };
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-rest-api_test.html b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-rest-api_test.html
index fd5da3f..5983621 100644
--- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-rest-api_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-rest-api_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -29,20 +30,23 @@
     let sandbox;
     let getResponseObjectStub;
     let sendStub;
+    let restApiStub;
 
     setup(() => {
       sandbox = sinon.sandbox.create();
       getResponseObjectStub = sandbox.stub().returns(Promise.resolve());
       sendStub = sandbox.stub().returns(Promise.resolve({status: 200}));
-      stub('gr-rest-api-interface', {
-        getAccount() {
-          return Promise.resolve({name: 'Judy Hopps'});
-        },
+      restApiStub = {
+        getAccount: () => Promise.resolve({name: 'Judy Hopps'}),
         getResponseObject: getResponseObjectStub,
-        send(...args) {
-          return sendStub(...args);
-        },
-      });
+        send: sendStub,
+        getLoggedIn: sandbox.stub(),
+        getVersion: sandbox.stub(),
+      };
+      stub('gr-rest-api-interface', Object.keys(restApiStub).reduce((a, k) => {
+        a[k] = (...args) => restApiStub[k](...args);
+        return a;
+      }, {}));
       Gerrit._setPluginsCount(1);
       Gerrit.install(p => { plugin = p; }, '0.1',
           'http://test.com/plugins/testplugin/static/test.js');
@@ -120,5 +124,21 @@
         assert.equal('text', err);
       });
     });
+
+    test('getLoggedIn', () => {
+      restApiStub.getLoggedIn.returns(Promise.resolve(true));
+      return instance.getLoggedIn().then(result => {
+        assert.isTrue(restApiStub.getLoggedIn.calledOnce);
+        assert.isTrue(result);
+      });
+    });
+
+    test('getConfig', () => {
+      restApiStub.getVersion.returns(Promise.resolve('foo bar'));
+      return instance.getVersion().then(result => {
+        assert.isTrue(restApiStub.getVersion.calledOnce);
+        assert.equal(result, 'foo bar');
+      });
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-public-js-api.js b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-public-js-api.js
index ac4129f..36a428d 100644
--- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-public-js-api.js
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-public-js-api.js
@@ -1,35 +1,49 @@
-// 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.
+/**
+ * @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.
+ */
 (function(window) {
   'use strict';
 
-  const warnNotSupported = function(opt_name) {
-    console.warn('Plugin API method ' + (opt_name || '') + ' is not supported');
-  };
-
   /**
    * Hash of loaded and installed plugins, name to Plugin object.
    */
-  const plugins = {};
+  const _plugins = {};
 
-  const stubbedMethods = ['_loadedGwt', 'screen', 'settingsScreen', 'panel'];
-  const GWT_PLUGIN_STUB = {};
-  for (const name of stubbedMethods) {
-    GWT_PLUGIN_STUB[name] = warnNotSupported.bind(null, name);
-  }
+  /**
+   * Array of plugin URLs to be loaded, name to url.
+   */
+  let _pluginsPending = {};
+
+  let _pluginsInstalled = [];
+
+  let _pluginsPendingCount = -1;
+
+  const PRELOADED_PROTOCOL = 'preloaded:';
+
+  const UNKNOWN_PLUGIN = 'unknown';
+
+  const PANEL_ENDPOINTS_MAPPING = {
+    CHANGE_SCREEN_BELOW_COMMIT_INFO_BLOCK: 'change-view-integration',
+    CHANGE_SCREEN_BELOW_CHANGE_INFO_BLOCK: 'change-metadata-item',
+  };
+
+  const PLUGIN_LOADING_TIMEOUT_MS = 10000;
 
   let _restAPI;
+
   const getRestAPI = () => {
     if (!_restAPI) {
       _restAPI = document.createElement('gr-rest-api-interface');
@@ -37,6 +51,14 @@
     return _restAPI;
   };
 
+  let _reporting;
+  const getReporting = () => {
+    if (!_reporting) {
+      _reporting = document.createElement('gr-reporting');
+    }
+    return _reporting;
+  };
+
   // TODO (viktard): deprecate in favor of GrPluginRestApi.
   function send(method, url, opt_callback, opt_payload) {
     return getRestAPI().send(method, url, opt_payload).then(response => {
@@ -81,7 +103,33 @@
   // http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html
   window.$wnd = window;
 
+  function flushPreinstalls() {
+    if (window.Gerrit.flushPreinstalls) {
+      window.Gerrit.flushPreinstalls();
+    }
+  }
+
+  function installPreloadedPlugins() {
+    if (!Gerrit._preloadedPlugins) { return; }
+    for (const name in Gerrit._preloadedPlugins) {
+      if (!Gerrit._preloadedPlugins.hasOwnProperty(name)) { continue; }
+      const callback = Gerrit._preloadedPlugins[name];
+      Gerrit.install(callback, API_VERSION, PRELOADED_PROTOCOL + name);
+    }
+  }
+
   function getPluginNameFromUrl(url) {
+    if (!(url instanceof URL)) {
+      try {
+        url = new URL(url);
+      } catch (e) {
+        console.warn(e);
+        return null;
+      }
+    }
+    if (url.protocol === PRELOADED_PROTOCOL) {
+      return url.pathname;
+    }
     const base = Gerrit.BaseUrlBehavior.getBaseUrl();
     const pathname = url.pathname.replace(base, '');
     // Site theme is server from predefined path.
@@ -92,7 +140,11 @@
           url.href, '— Unable to determine name.');
       return;
     }
-    return pathname.split('/')[2];
+    // Pathname should normally look like this:
+    // /plugins/PLUGINNAME/static/SCRIPTNAME.html
+    // Or, for app/samples:
+    // /plugins/PLUGINNAME.html
+    return pathname.split('/')[2].split('.')[0];
   }
 
   function Plugin(opt_url) {
@@ -104,13 +156,24 @@
       return;
     }
     this.deprecated = {
+      _loadedGwt: deprecatedAPI._loadedGwt.bind(this),
       install: deprecatedAPI.install.bind(this),
-      popup: deprecatedAPI.popup.bind(this),
       onAction: deprecatedAPI.onAction.bind(this),
+      panel: deprecatedAPI.panel.bind(this),
+      popup: deprecatedAPI.popup.bind(this),
+      screen: deprecatedAPI.screen.bind(this),
+      settingsScreen: deprecatedAPI.settingsScreen.bind(this),
     };
 
     this._url = new URL(opt_url);
     this._name = getPluginNameFromUrl(this._url);
+    if (this._url.protocol === PRELOADED_PROTOCOL) {
+      // Original plugin URL is used in plugin assets URLs calculation.
+      const assetsBaseUrl = window.ASSETS_PATH ||
+          (window.location.origin + Gerrit.BaseUrlBehavior.getBaseUrl());
+      this._url = new URL(assetsBaseUrl + '/plugins/' + this._name +
+          '/static/' + this._name + '.js');
+    }
   }
 
   Plugin._sharedAPIElement = document.createElement('gr-js-api-interface');
@@ -159,6 +222,13 @@
         this._name + (opt_path || '/');
   };
 
+  Plugin.prototype.screenUrl = function(opt_screenName) {
+    const origin = this._url.origin;
+    const base = Gerrit.BaseUrlBehavior.getBaseUrl();
+    const tokenPart = opt_screenName ? '/' + opt_screenName : '';
+    return `${origin}${base}/x/${this.getPluginName()}${tokenPart}`;
+  };
+
   Plugin.prototype._send = function(method, url, opt_callback, opt_payload) {
     return send(method, this.url(url), opt_callback, opt_payload);
   };
@@ -182,6 +252,10 @@
     return Gerrit.delete(this.url(url), opt_callback);
   };
 
+  Plugin.prototype.annotationApi = function() {
+    return new GrAnnotationActionsInterface(this);
+  };
+
   Plugin.prototype.changeActions = function() {
     return new GrChangeActionsInterface(this,
       Plugin._sharedAPIElement.getElement(
@@ -203,7 +277,19 @@
   };
 
   Plugin.prototype.project = function() {
-    return new GrProjectApi(this);
+    return new GrRepoApi(this);
+  };
+
+  Plugin.prototype.changeMetadata = function() {
+    return new GrChangeMetadataApi(this);
+  };
+
+  Plugin.prototype.admin = function() {
+    return new GrAdminApi(this);
+  };
+
+  Plugin.prototype.settings = function() {
+    return new GrSettingsApi(this);
   };
 
   /**
@@ -227,13 +313,37 @@
 
   Plugin.prototype.popup = function(moduleName) {
     if (typeof moduleName !== 'string') {
-      throw new Error('deprecated, use deprecated.popup');
+      console.error('.popup(element) deprecated, use .popup(moduleName)!');
+      return;
     }
     const api = new GrPopupInterface(this, moduleName);
     return api.open();
   };
 
+  Plugin.prototype.panel = function() {
+    console.error('.panel() is deprecated! ' +
+        'Use registerCustomComponent() instead.');
+  };
+
+  Plugin.prototype.settingsScreen = function() {
+    console.error('.settingsScreen() is deprecated! ' +
+        'Use .settings() instead.');
+  };
+
+  Plugin.prototype.screen = function(screenName, opt_moduleName) {
+    if (opt_moduleName && typeof opt_moduleName !== 'string') {
+      console.error('.screen(pattern, callback) deprecated, use ' +
+          '.screen(screenName, opt_moduleName)!');
+      return;
+    }
+    return this.registerCustomComponent(
+        Gerrit._getPluginScreenName(this.getPluginName(), screenName),
+        opt_moduleName);
+  };
+
   const deprecatedAPI = {
+    _loadedGwt: ()=> {},
+
     install() {
       console.log('Installing deprecated APIs is deprecated!');
       for (const method in this.deprecated) {
@@ -262,32 +372,112 @@
       }
       this.on('showchange', (change, revision) => {
         const details = this.changeActions().getActionDetails(action);
+        if (!details) {
+          console.warn(
+              `${this.getPluginName()} onAction error: ${action} not found!`);
+          return;
+        }
         this.changeActions().addTapListener(details.__key, () => {
           callback(new GrPluginActionContext(this, details, change, revision));
         });
       });
     },
 
+    screen(pattern, callback) {
+      console.warn('plugin.deprecated.screen is deprecated,' +
+          ' use plugin.screen instead!');
+      if (pattern instanceof RegExp) {
+        console.error('deprecated.screen() does not support RegExp. ' +
+            'Please use strings for patterns.');
+        return;
+      }
+      this.hook(Gerrit._getPluginScreenName(this.getPluginName(), pattern))
+          .onAttached(el => {
+            el.style.display = 'none';
+            callback({
+              body: el,
+              token: el.token,
+              onUnload: () => {},
+              setTitle: () => {},
+              setWindowTitle: () => {},
+              show: () => {
+                el.style.display = 'initial';
+              },
+            });
+          });
+    },
+
+    settingsScreen(path, menu, callback) {
+      console.warn('.settingsScreen() is deprecated! Use .settings() instead.');
+      const hook = this.settings()
+          .title(menu)
+          .token(path)
+          .module('div')
+          .build();
+      hook.onAttached(el => {
+        el.style.display = 'none';
+        const body = el.querySelector('div');
+        callback({
+          body,
+          onUnload: () => {},
+          setTitle: () => {},
+          setWindowTitle: () => {},
+          show: () => {
+            el.style.display = 'initial';
+          },
+        });
+      });
+    },
+
+    panel(extensionpoint, callback) {
+      console.warn('.panel() is deprecated! ' +
+          'Use registerCustomComponent() instead.');
+      const endpoint = PANEL_ENDPOINTS_MAPPING[extensionpoint];
+      if (!endpoint) {
+        console.warn(`.panel ${extensionpoint} not supported!`);
+        return;
+      }
+      this.hook(endpoint).onAttached(el => callback({
+        body: el,
+        p: {
+          CHANGE_INFO: el.change,
+          REVISION_INFO: el.revision,
+        },
+        onUnload: () => {},
+      }));
+    },
   };
 
+  flushPreinstalls();
+
   const Gerrit = window.Gerrit || {};
 
+  let _resolveAllPluginsLoaded = null;
+  let _allPluginsPromise = null;
+
+  Gerrit._endpoints = new GrPluginEndpoints();
+
   // Provide reset plugins function to clear installed plugins between tests.
   const app = document.querySelector('#app');
   if (!app) {
     // No gr-app found (running tests)
+    Gerrit._installPreloadedPlugins = installPreloadedPlugins;
+    Gerrit._flushPreinstalls = flushPreinstalls;
     Gerrit._resetPlugins = () => {
-      for (const k of Object.keys(plugins)) {
-        delete plugins[k];
+      _allPluginsPromise = null;
+      _pluginsInstalled = [];
+      _pluginsPending = {};
+      _pluginsPendingCount = -1;
+      _reporting = null;
+      _resolveAllPluginsLoaded = null;
+      _restAPI = null;
+      Gerrit._endpoints = new GrPluginEndpoints();
+      for (const k of Object.keys(_plugins)) {
+        delete _plugins[k];
       }
     };
   }
 
-  // Number of plugins to initialize, -1 means 'not yet known'.
-  Gerrit._pluginsPending = -1;
-
-  Gerrit._endpoints = new GrPluginEndpoints();
-
   Gerrit.getPluginName = function() {
     console.warn('Gerrit.getPluginName is not supported in PolyGerrit.',
         'Please use plugin.getPluginName() instead.');
@@ -307,32 +497,31 @@
   };
 
   Gerrit.install = function(callback, opt_version, opt_src) {
+    // HTML import polyfill adds __importElement pointing to the import tag.
+    const script = document.currentScript &&
+        (document.currentScript.__importElement || document.currentScript);
+    const src = opt_src || (script && (script.src || script.baseURI));
+    const name = getPluginNameFromUrl(src);
+
     if (opt_version && opt_version !== API_VERSION) {
-      console.warn('Only version ' + API_VERSION +
-          ' is supported in PolyGerrit. ' + opt_version + ' was given.');
-      Gerrit._pluginInstalled();
+      Gerrit._pluginInstallError(`Plugin ${name} install error: only version ` +
+          API_VERSION + ' is supported in PolyGerrit. ' + opt_version +
+          ' was given.');
       return;
     }
 
-    const src = opt_src || (document.currentScript &&
-         (document.currentScript.src || document.currentScript.baseURI));
-    const name = getPluginNameFromUrl(new URL(src));
-    const existingPlugin = plugins[name];
+    const existingPlugin = _plugins[name];
     const plugin = existingPlugin || new Plugin(src);
     try {
       callback(plugin);
-      plugins[name] = plugin;
+      if (name) {
+        _plugins[name] = plugin;
+      }
+      if (!existingPlugin) {
+        Gerrit._pluginInstalled(src);
+      }
     } catch (e) {
-      console.warn(`${name} install failed: ${e.name}: ${e.message}`);
-    }
-    // Don't double count plugins that may have an html and js install.
-    // TODO(beckysiegel) remove name check once name issue is resolved.
-    // If there isn't a name, it's due to an issue with the polyfill for
-    // html imports in Safari/Firefox. In this case, other plugin related
-    // features may still be broken, but still make sure to call.
-    // _pluginInstalled.
-    if (!name || !existingPlugin) {
-      Gerrit._pluginInstalled();
+      Gerrit._pluginInstallError(`${e.name}: ${e.message}`);
     }
   };
 
@@ -377,48 +566,105 @@
   };
 
   /**
-   * Polyfill GWT API dependencies to avoid runtime exceptions when loading
-   * GWT-compiled plugins.
-   * @deprecated Not supported in PolyGerrit.
+   * Install "stepping stones" API for GWT-compiled plugins by default.
+   * @deprecated best effort support, will be removed with GWT UI.
    */
-  Gerrit.installGwt = function() {
-    Gerrit._pluginInstalled();
-    return GWT_PLUGIN_STUB;
+  Gerrit.installGwt = function(url) {
+    const name = getPluginNameFromUrl(url);
+    let plugin;
+    try {
+      plugin = _plugins[name] || new Plugin(url);
+      plugin.deprecated.install();
+      Gerrit._pluginInstalled(url);
+    } catch (e) {
+      Gerrit._pluginInstallError(`${e.name}: ${e.message}`);
+    }
+    return plugin;
   };
 
-  Gerrit._allPluginsPromise = null;
-  Gerrit._resolveAllPluginsLoaded = null;
-
   Gerrit.awaitPluginsLoaded = function() {
-    if (!Gerrit._allPluginsPromise) {
+    if (!_allPluginsPromise) {
       if (Gerrit._arePluginsLoaded()) {
-        Gerrit._allPluginsPromise = Promise.resolve();
+        _allPluginsPromise = Promise.resolve();
       } else {
-        Gerrit._allPluginsPromise = new Promise(resolve => {
-          Gerrit._resolveAllPluginsLoaded = resolve;
-        });
+        let timeoutId;
+        _allPluginsPromise =
+          Promise.race([
+            new Promise(resolve => _resolveAllPluginsLoaded = resolve),
+            new Promise(resolve => timeoutId = setTimeout(
+                Gerrit._pluginLoadingTimeout, PLUGIN_LOADING_TIMEOUT_MS)),
+          ]).then(() => clearTimeout(timeoutId));
       }
     }
-    return Gerrit._allPluginsPromise;
+    return _allPluginsPromise;
+  };
+
+  Gerrit._pluginLoadingTimeout = function() {
+    console.error(`Failed to load plugins: ${Object.keys(_pluginsPending)}`);
+    Gerrit._setPluginsPending([]);
+  };
+
+  Gerrit._setPluginsPending = function(plugins) {
+    _pluginsPending = plugins.reduce((o, url) => {
+      // TODO(viktard): Remove guard (@see Issue 8962)
+      o[getPluginNameFromUrl(url) || UNKNOWN_PLUGIN] = url;
+      return o;
+    }, {});
+    Gerrit._setPluginsCount(Object.keys(_pluginsPending).length);
   };
 
   Gerrit._setPluginsCount = function(count) {
-    Gerrit._pluginsPending = count;
+    _pluginsPendingCount = count;
     if (Gerrit._arePluginsLoaded()) {
-      document.createElement('gr-reporting').pluginsLoaded();
-      if (Gerrit._resolveAllPluginsLoaded) {
-        Gerrit._resolveAllPluginsLoaded();
+      getReporting().pluginsLoaded(_pluginsInstalled);
+      if (_resolveAllPluginsLoaded) {
+        _resolveAllPluginsLoaded();
       }
     }
   };
 
-  Gerrit._pluginInstalled = function() {
-    Gerrit._setPluginsCount(Gerrit._pluginsPending - 1);
+  Gerrit._pluginInstallError = function(message) {
+    document.dispatchEvent(new CustomEvent('show-alert', {
+      detail: {
+        message: `Plugin install error: ${message}`,
+      },
+    }));
+    console.info(`Plugin install error: ${message}`);
+    Gerrit._setPluginsCount(_pluginsPendingCount - 1);
+  };
+
+  Gerrit._pluginInstalled = function(url) {
+    const name = getPluginNameFromUrl(url) || UNKNOWN_PLUGIN;
+    if (!_pluginsPending[name]) {
+      console.warn(`Unexpected plugin ${name} installed from ${url}.`);
+    } else {
+      delete _pluginsPending[name];
+      _pluginsInstalled.push(name);
+      Gerrit._setPluginsCount(_pluginsPendingCount - 1);
+      console.log(`Plugin ${name} installed.`);
+    }
   };
 
   Gerrit._arePluginsLoaded = function() {
-    return Gerrit._pluginsPending === 0;
+    return _pluginsPendingCount === 0;
+  };
+
+  Gerrit._getPluginScreenName = function(pluginName, screenName) {
+    return `${pluginName}-screen-${screenName}`;
+  };
+
+  Gerrit._isPluginPreloaded = function(url) {
+    const name = getPluginNameFromUrl(url);
+    if (name && Gerrit._preloadedPlugins) {
+      return name in Gerrit._preloadedPlugins;
+    } else {
+      return false;
+    }
   };
 
   window.Gerrit = Gerrit;
+
+  // Preloaded plugins should be installed after Gerrit.install() is set,
+  // since plugin preloader substitutes Gerrit.install() temporarily.
+  installPreloadedPlugins();
 })(window);
diff --git a/polygerrit-ui/app/elements/shared/gr-label-info/gr-label-info.html b/polygerrit-ui/app/elements/shared/gr-label-info/gr-label-info.html
new file mode 100644
index 0000000..ca5c49f
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-label-info/gr-label-info.html
@@ -0,0 +1,127 @@
+<!--
+@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="../../../bower_components/polymer/polymer.html">
+
+<link rel="import" href="../../../styles/gr-voting-styles.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../gr-account-label/gr-account-label.html">
+<link rel="import" href="../gr-button/gr-button.html">
+<link rel="import" href="../gr-icons/gr-icons.html">
+<link rel="import" href="../gr-label/gr-label.html">
+<link rel="import" href="../gr-rest-api-interface/gr-rest-api-interface.html">
+
+<dom-module id="gr-label-info">
+  <template strip-whitespace>
+    <style include="gr-voting-styles"></style>
+    <style include="shared-styles">
+      .placeholder {
+        color: var(--deemphasized-text-color);
+        padding-top: .2em;
+      }
+      .hidden {
+        display: none;
+      }
+      .voteChip {
+        display: flex;
+        justify-content: center;
+        margin-right: .3em;
+        padding: .05em .85em;
+        @apply --vote-chip-styles;
+      }
+      .max {
+        background-color: var(--vote-color-approved);
+      }
+      .min {
+        background-color: var(--vote-color-rejected);
+      }
+      .positive {
+        background-color: var(--vote-color-recommended);
+      }
+      .negative {
+        background-color: var(--vote-color-disliked);
+      }
+      .hidden {
+        display: none;
+      }
+      td {
+        vertical-align: middle;
+      }
+      tr {
+        min-height: 2.25em;
+      }
+      gr-button {
+        --gr-button: {
+          height: 2em;
+          padding: 0;
+          width: 2em;
+        }
+      }
+      gr-button[disabled] iron-icon {
+        color: var(--border-color);
+      }
+      gr-account-chip {
+        margin-right: .25em;
+      }
+      iron-icon {
+        height: 1.2em;
+        width: 1.2em;
+      }
+      .labelValueContainer:not(:first-of-type) td {
+        padding-top: .3em;
+      }
+    </style>
+    <table>
+      <p class$="placeholder [[_computeShowPlaceholder(labelInfo, change.labels.*)]]">
+        No votes.
+      </p>
+      <template
+          is="dom-repeat"
+          items="[[_mapLabelInfo(labelInfo, account, change.labels.*)]]"
+          as="mappedLabel">
+        <tr class="labelValueContainer">
+          <td>
+            <gr-label
+                has-tooltip
+                title="[[_computeValueTooltip(labelInfo, mappedLabel.value)]]"
+                class$="[[mappedLabel.className]] voteChip">
+              [[mappedLabel.value]]
+            </gr-label>
+          </td>
+          <td>
+            <gr-account-chip
+                account="[[mappedLabel.account]]"
+                transparent-background></gr-account-chip>
+          </td>
+          <td>
+            <gr-button
+                link
+                aria-label="Remove"
+                on-tap="_onDeleteVote"
+                tooltip="Remove vote"
+                data-account-id$="[[mappedLabel.account._account_id]]"
+                class$="deleteBtn [[_computeDeleteClass(mappedLabel.account, mutable, change)]]">
+              <iron-icon icon="gr-icons:delete"></iron-icon>
+            </gr-button>
+          </td>
+        </tr>
+      </template>
+    </table>
+    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
+  </template>
+  <script src="gr-label-info.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/shared/gr-label-info/gr-label-info.js b/polygerrit-ui/app/elements/shared/gr-label-info/gr-label-info.js
new file mode 100644
index 0000000..40edc28
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-label-info/gr-label-info.js
@@ -0,0 +1,161 @@
+/**
+ * @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-label-info',
+
+    properties: {
+      labelInfo: Object,
+      label: String,
+      /** @type {?} */
+      change: Object,
+      account: Object,
+      mutable: Boolean,
+    },
+
+    /**
+     * @param {!Object} labelInfo
+     * @param {!Object} account
+     * @param {Object} changeLabelsRecord not used, but added as a parameter in
+     *    order to trigger computation when a label is removed from the change.
+     */
+    _mapLabelInfo(labelInfo, account, changeLabelsRecord) {
+      const result = [];
+      if (!labelInfo) { return result; }
+      if (!labelInfo.values) {
+        if (labelInfo.rejected || labelInfo.approved) {
+          const ok = labelInfo.approved || !labelInfo.rejected;
+          return [{
+            value: ok ? '👍️' : '👎️',
+            className: ok ? 'positive' : 'negative',
+            account: ok ? labelInfo.approved : labelInfo.rejected,
+          }];
+        }
+        return result;
+      }
+      // Sort votes by positivity.
+      const votes = (labelInfo.all || []).sort((a, b) => a.value - b.value);
+      const values = Object.keys(labelInfo.values);
+      for (const label of votes) {
+        if (label.value && label.value != labelInfo.default_value) {
+          let labelClassName;
+          let labelValPrefix = '';
+          if (label.value > 0) {
+            labelValPrefix = '+';
+            if (parseInt(label.value, 10) ===
+                parseInt(values[values.length - 1], 10)) {
+              labelClassName = 'max';
+            } else {
+              labelClassName = 'positive';
+            }
+          } else if (label.value < 0) {
+            if (parseInt(label.value, 10) === parseInt(values[0], 10)) {
+              labelClassName = 'min';
+            } else {
+              labelClassName = 'negative';
+            }
+          }
+          const formattedLabel = {
+            value: labelValPrefix + label.value,
+            className: labelClassName,
+            account: label,
+          };
+          if (label._account_id === account._account_id) {
+            // Put self-votes at the top.
+            result.unshift(formattedLabel);
+          } else {
+            result.push(formattedLabel);
+          }
+        }
+      }
+      return result;
+    },
+
+    /**
+     * A user is able to delete a vote iff the mutable property is true and the
+     * reviewer that left the vote exists in the list of removable_reviewers
+     * received from the backend.
+     *
+     * @param {!Object} reviewer An object describing the reviewer that left the
+     *     vote.
+     * @param {Boolean} mutable
+     * @param {!Object} change
+     */
+    _computeDeleteClass(reviewer, mutable, change) {
+      if (!mutable || !change || !change.removable_reviewers) {
+        return 'hidden';
+      }
+      const removable = change.removable_reviewers;
+      if (removable.find(r => r._account_id === reviewer._account_id)) {
+        return '';
+      }
+      return 'hidden';
+    },
+
+    /**
+     * Closure annotation for Polymer.prototype.splice is off.
+     * For now, supressing annotations.
+     *
+     * @suppress {checkTypes} */
+    _onDeleteVote(e) {
+      e.preventDefault();
+      let target = Polymer.dom(e).rootTarget;
+      while (!target.classList.contains('deleteBtn')) {
+        if (!target.parentElement) { return; }
+        target = target.parentElement;
+      }
+
+      target.disabled = true;
+      const accountID = parseInt(target.getAttribute('data-account-id'), 10);
+      this._xhrPromise =
+          this.$.restAPI.deleteVote(this.change._number, accountID, this.label)
+          .then(response => {
+            target.disabled = false;
+            if (!response.ok) { return; }
+            Gerrit.Nav.navigateToChange(this.change);
+          }).catch(err => {
+            target.disabled = false;
+            return;
+          });
+    },
+
+    _computeValueTooltip(labelInfo, score) {
+      if (!labelInfo || !labelInfo.values || !labelInfo.values[score]) {
+        return '';
+      }
+      return labelInfo.values[score];
+    },
+
+    /**
+     * @param {!Object} labelInfo
+     * @param {Object} changeLabelsRecord not used, but added as a parameter in
+     *    order to trigger computation when a label is removed from the change.
+     */
+    _computeShowPlaceholder(labelInfo, changeLabelsRecord) {
+      if (labelInfo.all) {
+        for (const label of labelInfo.all) {
+          if (label.value && label.value != labelInfo.default_value) {
+            return 'hidden';
+          }
+        }
+      }
+      return '';
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/shared/gr-label-info/gr-label-info_test.html b/polygerrit-ui/app/elements/shared/gr-label-info/gr-label-info_test.html
new file mode 100644
index 0000000..8bc358d
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-label-info/gr-label-info_test.html
@@ -0,0 +1,230 @@
+<!--
+@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.
+-->
+
+<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+<title>gr-label-info</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-label-info.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-label-info></gr-label-info>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-account-link tests', () => {
+    let element;
+    let sandbox;
+
+    setup(() => {
+      element = fixture('basic');
+      sandbox = sinon.sandbox.create();
+      // Needed to trigger computed bindings.
+      element.account = {};
+      element.change = {labels: {}};
+    });
+
+    teardown(() => {
+      sandbox.restore();
+    });
+
+    suite('remove reviewer votes', () => {
+      setup(() => {
+        sandbox.stub(element, '_computeValueTooltip').returns('');
+        element.account = {
+          _account_id: 1,
+          name: 'bojack',
+        };
+        const test = {
+          all: [{_account_id: 1, name: 'bojack', value: 1}],
+          default_value: 0,
+          values: [],
+        };
+        element.change = {
+          _number: 42,
+          change_id: 'the id',
+          actions: [],
+          topic: 'the topic',
+          status: 'NEW',
+          submit_type: 'CHERRY_PICK',
+          labels: {test},
+          removable_reviewers: [],
+        };
+        element.labelInfo = test;
+        element.label = 'test';
+
+        flushAsynchronousOperations();
+      });
+
+      test('_computeCanDeleteVote', () => {
+        element.mutable = false;
+        const button = element.$$('gr-button');
+        assert.isTrue(isHidden(button));
+        element.change.removable_reviewers = [element.account];
+        element.mutable = true;
+        assert.isFalse(isHidden(button));
+      });
+
+      test('deletes votes', () => {
+        const deleteResponse = Promise.resolve({ok: true});
+        const deleteStub = sandbox.stub(
+            element.$.restAPI, 'deleteVote').returns(deleteResponse);
+
+        element.change.removable_reviewers = [element.account];
+        element.change.labels.test.recommended = {_account_id: 1};
+        element.mutable = true;
+        const button = element.$$('gr-button');
+        MockInteractions.tap(button);
+        assert.isTrue(button.disabled);
+        return deleteResponse.then(() => {
+          assert.isFalse(button.disabled);
+          assert.notOk(element.change.labels.test.recommended);
+          assert.isTrue(deleteStub.calledWithExactly(42, 1, 'test'));
+        });
+      });
+    });
+
+    suite('label color and order', () => {
+      test('valueless label rejected', () => {
+        element.labelInfo = {rejected: {name: 'someone'}};
+        flushAsynchronousOperations();
+        const labels = Polymer.dom(element.root).querySelectorAll('gr-label');
+        assert.isTrue(labels[0].classList.contains('negative'));
+      });
+
+      test('valueless label approved', () => {
+        element.labelInfo = {approved: {name: 'someone'}};
+        flushAsynchronousOperations();
+        const labels = Polymer.dom(element.root).querySelectorAll('gr-label');
+        assert.isTrue(labels[0].classList.contains('positive'));
+      });
+
+      test('-2 to +2', () => {
+        element.labelInfo = {
+          all: [
+            {value: 2, name: 'user 2'},
+            {value: 1, name: 'user 1'},
+            {value: -1, name: 'user 3'},
+            {value: -2, name: 'user 4'},
+          ],
+          values: {
+            '-2': 'Awful',
+            '-1': 'Don\'t submit as-is',
+            ' 0': 'No score',
+            '+1': 'Looks good to me',
+            '+2': 'Ready to submit',
+          },
+        };
+        flushAsynchronousOperations();
+        const labels = Polymer.dom(element.root).querySelectorAll('gr-label');
+        assert.isTrue(labels[0].classList.contains('max'));
+        assert.isTrue(labels[1].classList.contains('positive'));
+        assert.isTrue(labels[2].classList.contains('negative'));
+        assert.isTrue(labels[3].classList.contains('min'));
+      });
+
+      test('-1 to +1', () => {
+        element.labelInfo = {
+          all: [
+            {value: 1, name: 'user 1'},
+            {value: -1, name: 'user 2'},
+          ],
+          values: {
+            '-1': 'Don\'t submit as-is',
+            ' 0': 'No score',
+            '+1': 'Looks good to me',
+          },
+        };
+        flushAsynchronousOperations();
+        const labels = Polymer.dom(element.root).querySelectorAll('gr-label');
+        assert.isTrue(labels[0].classList.contains('max'));
+        assert.isTrue(labels[1].classList.contains('min'));
+      });
+
+      test('0 to +2', () => {
+        element.labelInfo = {
+          all: [
+            {value: 1, name: 'user 2'},
+            {value: 2, name: 'user '},
+          ],
+          values: {
+            ' 0': 'Don\'t submit as-is',
+            '+1': 'No score',
+            '+2': 'Looks good to me',
+          },
+        };
+        flushAsynchronousOperations();
+        const labels = Polymer.dom(element.root).querySelectorAll('gr-label');
+        assert.isTrue(labels[0].classList.contains('max'));
+        assert.isTrue(labels[1].classList.contains('positive'));
+      });
+
+      test('self votes at top', () => {
+        element.account = {
+          _account_id: 1,
+          name: 'bojack',
+        };
+        element.labelInfo = {
+          all: [
+            {value: 1, name: 'user 1', _account_id: 2},
+            {value: -1, name: 'bojack', _account_id: 1},
+          ],
+          values: {
+            '-1': 'Don\'t submit as-is',
+            ' 0': 'No score',
+            '+1': 'Looks good to me',
+          },
+        };
+        flushAsynchronousOperations();
+        const chips =
+            Polymer.dom(element.root).querySelectorAll('gr-account-chip');
+        assert.equal(chips[0].account._account_id, element.account._account_id);
+      });
+    });
+
+    test('_computeValueTooltip', () => {
+      // Existing label.
+      let labelInfo = {values: {0: 'Baz'}};
+      let score = '0';
+      assert.equal(element._computeValueTooltip(labelInfo, score), 'Baz');
+
+      // Non-exsistent score.
+      score = '2';
+      assert.equal(element._computeValueTooltip(labelInfo, score), '');
+
+      // No values on label.
+      labelInfo = {values: {}};
+      score = '0';
+      assert.equal(element._computeValueTooltip(labelInfo, score), '');
+    });
+
+    test('placeholder', () => {
+      element.labelInfo = {};
+      assert.isFalse(isHidden(element.$$('.placeholder')));
+      element.labelInfo = {all: []};
+      assert.isFalse(isHidden(element.$$('.placeholder')));
+      element.labelInfo = {all: [{value: 1}]};
+      assert.isTrue(isHidden(element.$$('.placeholder')));
+    });
+  });
+</script>
\ No newline at end of file
diff --git a/polygerrit-ui/app/elements/shared/gr-label/gr-label.html b/polygerrit-ui/app/elements/shared/gr-label/gr-label.html
index 04b12e7..fe290b7 100644
--- a/polygerrit-ui/app/elements/shared/gr-label/gr-label.html
+++ b/polygerrit-ui/app/elements/shared/gr-label/gr-label.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,7 +18,7 @@
 <link rel="import" href="../../../behaviors/gr-tooltip-behavior/gr-tooltip-behavior.html">
 <dom-module id="gr-label">
   <template strip-whitespace>
-    <content></content>
+    <slot></slot>
   </template>
   <script src="gr-label.js"></script>
 </dom-module>
diff --git a/polygerrit-ui/app/elements/shared/gr-label/gr-label.js b/polygerrit-ui/app/elements/shared/gr-label/gr-label.js
index 37e1f77..0de0881 100644
--- a/polygerrit-ui/app/elements/shared/gr-label/gr-label.js
+++ b/polygerrit-ui/app/elements/shared/gr-label/gr-label.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
diff --git a/polygerrit-ui/app/elements/shared/gr-labeled-autocomplete/gr-labeled-autocomplete.html b/polygerrit-ui/app/elements/shared/gr-labeled-autocomplete/gr-labeled-autocomplete.html
new file mode 100644
index 0000000..c001ce7
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-labeled-autocomplete/gr-labeled-autocomplete.html
@@ -0,0 +1,72 @@
+<!--
+@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="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../shared/gr-autocomplete/gr-autocomplete.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+
+<dom-module id="gr-labeled-autocomplete">
+  <template>
+    <style include="shared-styles">
+      :host {
+        display: block;
+        width: 12em;
+      }
+      #container {
+        background: var(--chip-background-color);
+        border-radius: 1em;
+        padding: .5em;
+      }
+      #header {
+        color: var(--deemphasized-text-color);
+        font-weight: var(--font-weight-bold);
+        font-size: var(--font-size-small);
+      }
+      #body {
+        display: flex;
+      }
+      gr-autocomplete {
+        height: 1.5em;
+        --gr-autocomplete: {
+          border: none;
+        }
+      }
+      #trigger {
+        border-left: 1px solid var(--deemphasized-text-color);
+        color: var(--deemphasized-text-color);
+        cursor: pointer;
+        padding-left: .4em;
+      }
+      #trigger:hover {
+        color: var(--primary-text-color);
+      }
+    </style>
+    <div id="container">
+      <div id="header">[[label]]</div>
+      <div id="body">
+        <gr-autocomplete
+            id="autocomplete"
+            threshold="[[_autocompleteThreshold]]"
+            query="[[query]]"
+            disabled="[[disabled]]"
+            placeholder="[[placeholder]]"
+            borderless></gr-autocomplete>
+        <div id="trigger" on-tap="_handleTriggerTap">▼</div>
+      </div>
+    </div>
+  </template>
+  <script src="gr-labeled-autocomplete.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/shared/gr-labeled-autocomplete/gr-labeled-autocomplete.js b/polygerrit-ui/app/elements/shared/gr-labeled-autocomplete/gr-labeled-autocomplete.js
new file mode 100644
index 0000000..54b38eb
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-labeled-autocomplete/gr-labeled-autocomplete.js
@@ -0,0 +1,76 @@
+/**
+ * @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-labeled-autocomplete',
+
+    /**
+     * Fired when a value is chosen.
+     *
+     * @event commit
+     */
+
+    properties: {
+
+      /**
+       * Used just like the query property of gr-autocomplete.
+       *
+       * @type {function(string): Promise<?>}
+       */
+      query: {
+        type: Function,
+        value() {
+          return function() {
+            return Promise.resolve([]);
+          };
+        },
+      },
+
+      text: {
+        type: String,
+        value: '',
+        notify: true,
+      },
+      label: String,
+      placeholder: String,
+      disabled: Boolean,
+
+      _autocompleteThreshold: {
+        type: Number,
+        value: 0,
+        readOnly: true,
+      },
+    },
+
+    _handleTriggerTap(e) {
+      // Stop propagation here so we don't confuse gr-autocomplete, which
+      // listens for taps on body to try to determine when it's blurred.
+      e.stopPropagation();
+      this.$.autocomplete.focus();
+    },
+
+    setText(text) {
+      this.$.autocomplete.setText(text);
+    },
+
+    clear() {
+      this.setText('');
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/shared/gr-labeled-autocomplete/gr-labeled-autocomplete_test.html b/polygerrit-ui/app/elements/shared/gr-labeled-autocomplete/gr-labeled-autocomplete_test.html
new file mode 100644
index 0000000..6bcaa18
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-labeled-autocomplete/gr-labeled-autocomplete_test.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<!--
+@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.
+-->
+<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+<title>gr-labeled-autocomplete</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-labeled-autocomplete.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-labeled-autocomplete></gr-labeled-autocomplete>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-labeled-autocomplete tests', () => {
+    let element;
+    let sandbox;
+
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+      element = fixture('basic');
+    });
+
+    teardown(() => { sandbox.restore(); });
+
+    test('tapping trigger focuses autocomplete', () => {
+      const e = {stopPropagation: () => undefined};
+      sandbox.stub(e, 'stopPropagation');
+      sandbox.stub(element.$.autocomplete, 'focus');
+      element._handleTriggerTap(e);
+      assert.isTrue(e.stopPropagation.calledOnce);
+      assert.isTrue(element.$.autocomplete.focus.calledOnce);
+    });
+
+    test('setText', () => {
+      sandbox.stub(element.$.autocomplete, 'setText');
+      element.setText('foo-bar');
+      assert.isTrue(element.$.autocomplete.setText.calledWith('foo-bar'));
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/shared/gr-lib-loader/gr-lib-loader.html b/polygerrit-ui/app/elements/shared/gr-lib-loader/gr-lib-loader.html
new file mode 100644
index 0000000..f70aff4
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-lib-loader/gr-lib-loader.html
@@ -0,0 +1,21 @@
+<!--
+@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.
+-->
+<link rel="import" href="../../../bower_components/polymer/polymer.html">
+
+<dom-module id="gr-lib-loader">
+  <script src="gr-lib-loader.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/shared/gr-lib-loader/gr-lib-loader.js b/polygerrit-ui/app/elements/shared/gr-lib-loader/gr-lib-loader.js
new file mode 100644
index 0000000..ef8c112
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-lib-loader/gr-lib-loader.js
@@ -0,0 +1,146 @@
+/**
+ * @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.
+ */
+(function() {
+  'use strict';
+
+  const HLJS_PATH = 'bower_components/highlightjs/highlight.min.js';
+  const DARK_THEME_PATH = 'styles/themes/dark-theme.html';
+
+  Polymer({
+    is: 'gr-lib-loader',
+
+    properties: {
+      _hljsState: {
+        type: Object,
+
+        // NOTE: intended singleton.
+        value: {
+          configured: false,
+          loading: false,
+          callbacks: [],
+        },
+      },
+    },
+
+    /**
+     * Get the HLJS library. Returns a promise that resolves with a reference to
+     * the library after it's been loaded. The promise resolves immediately if
+     * it's already been loaded.
+     * @return {!Promise<Object>}
+     */
+    getHLJS() {
+      return new Promise((resolve, reject) => {
+        // If the lib is totally loaded, resolve immediately.
+        if (this._getHighlightLib()) {
+          resolve(this._getHighlightLib());
+          return;
+        }
+
+        // If the library is not currently being loaded, then start loading it.
+        if (!this._hljsState.loading) {
+          this._hljsState.loading = true;
+          this._loadScript(this._getHLJSUrl())
+              .then(this._onHLJSLibLoaded.bind(this)).catch(reject);
+        }
+
+        this._hljsState.callbacks.push(resolve);
+      });
+    },
+
+    /**
+     * Loads the dark theme document. Returns a promise that resolves with a
+     * custom-style DOM element.
+     * @return {!Promise<Element>}
+     */
+    getDarkTheme() {
+      return new Promise((resolve, reject) => {
+        this.importHref(this._getLibRoot() + DARK_THEME_PATH, () => {
+          const module = document.createElement('style', 'custom-style');
+          module.setAttribute('include', 'dark-theme');
+          resolve(module);
+        });
+      });
+    },
+
+    /**
+     * Execute callbacks awaiting the HLJS lib load.
+     */
+    _onHLJSLibLoaded() {
+      const lib = this._getHighlightLib();
+      this._hljsState.loading = false;
+      for (const cb of this._hljsState.callbacks) {
+        cb(lib);
+      }
+      this._hljsState.callbacks = [];
+    },
+
+    /**
+     * Get the HLJS library, assuming it has been loaded. Configure the library
+     * if it hasn't already been configured.
+     * @return {!Object}
+     */
+    _getHighlightLib() {
+      const lib = window.hljs;
+      if (lib && !this._hljsState.configured) {
+        this._hljsState.configured = true;
+
+        lib.configure({classPrefix: 'gr-diff gr-syntax gr-syntax-'});
+      }
+      return lib;
+    },
+
+    /**
+     * Get the resource path used to load the application. If the application
+     * was loaded through a CDN, then this will be the path to CDN resources.
+     * @return {string}
+     */
+    _getLibRoot() {
+      if (window.STATIC_RESOURCE_PATH) {
+        return window.STATIC_RESOURCE_PATH + '/';
+      }
+      return '/';
+    },
+
+    /**
+     * Load and execute a JS file from the lib root.
+     * @param {string} src The path to the JS file without the lib root.
+     * @return {Promise} a promise that resolves when the script's onload
+     *     executes.
+     */
+    _loadScript(src) {
+      return new Promise((resolve, reject) => {
+        const script = document.createElement('script');
+
+        if (!src) {
+          reject(new Error('Unable to load blank script url.'));
+          return;
+        }
+
+        script.src = src;
+        script.onload = resolve;
+        script.onerror = reject;
+        Polymer.dom(document.head).appendChild(script);
+      });
+    },
+
+    _getHLJSUrl() {
+      const root = this._getLibRoot();
+      if (!root) { return null; }
+      return root + HLJS_PATH;
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/shared/gr-lib-loader/gr-lib-loader_test.html b/polygerrit-ui/app/elements/shared/gr-lib-loader/gr-lib-loader_test.html
new file mode 100644
index 0000000..cf9a41c
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-lib-loader/gr-lib-loader_test.html
@@ -0,0 +1,147 @@
+<!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-lib-loader</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-lib-loader.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-lib-loader></gr-lib-loader>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-lib-loader tests', () => {
+    let sandbox;
+    let element;
+    let resolveLoad;
+    let loadStub;
+
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+      element = fixture('basic');
+
+      loadStub = sandbox.stub(element, '_loadScript', () =>
+        new Promise(resolve => resolveLoad = resolve)
+      );
+
+      // Assert preconditions:
+      assert.isFalse(element._hljsState.loading);
+    });
+
+    teardown(() => {
+      if (window.hljs) {
+        delete window.hljs;
+      }
+      sandbox.restore();
+
+      // Because the element state is a singleton, clean it up.
+      element._hljsState.configured = false;
+      element._hljsState.loading = false;
+      element._hljsState.callbacks = [];
+    });
+
+    test('only load once', done => {
+      sandbox.stub(element, '_getHLJSUrl').returns('');
+      const firstCallHandler = sinon.stub();
+      element.getHLJS().then(firstCallHandler);
+
+      // It should now be in the loading state.
+      assert.isTrue(loadStub.called);
+      assert.isTrue(element._hljsState.loading);
+      assert.isFalse(firstCallHandler.called);
+
+      const secondCallHandler = sinon.stub();
+      element.getHLJS().then(secondCallHandler);
+
+      // No change in state.
+      assert.isTrue(element._hljsState.loading);
+      assert.isFalse(firstCallHandler.called);
+      assert.isFalse(secondCallHandler.called);
+
+      // Now load the library.
+      resolveLoad();
+      flush(() => {
+        // The state should be loaded and both handlers called.
+        assert.isFalse(element._hljsState.loading);
+        assert.isTrue(firstCallHandler.called);
+        assert.isTrue(secondCallHandler.called);
+        done();
+      });
+    });
+
+    suite('preloaded', () => {
+      let hljsStub;
+
+      setup(() => {
+        hljsStub = {
+          configure: sinon.stub(),
+        };
+        window.hljs = hljsStub;
+      });
+
+      teardown(() => {
+        delete window.hljs;
+      });
+
+      test('returns hljs', done => {
+        const firstCallHandler = sinon.stub();
+        element.getHLJS().then(firstCallHandler);
+        flush(() => {
+          assert.isTrue(firstCallHandler.called);
+          assert.isTrue(firstCallHandler.calledWith(hljsStub));
+          done();
+        });
+      });
+
+      test('configures hljs', done => {
+        element.getHLJS().then(() => {
+          assert.isTrue(window.hljs.configure.calledOnce);
+          done();
+        });
+      });
+    });
+
+    suite('_getHLJSUrl', () => {
+      suite('checking _getLibRoot', () => {
+        let root;
+
+        setup(() => {
+          sandbox.stub(element, '_getLibRoot', () => root);
+        });
+
+        test('with no root', () => {
+          assert.isNull(element._getHLJSUrl());
+        });
+
+        test('with root', () => {
+          root = 'test-root.com/';
+          assert.equal(element._getHLJSUrl(),
+              'test-root.com/bower_components/highlightjs/highlight.min.js');
+        });
+      });
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/shared/gr-limited-text/gr-limited-text.html b/polygerrit-ui/app/elements/shared/gr-limited-text/gr-limited-text.html
index 8f88b6a..91866e5 100644
--- a/polygerrit-ui/app/elements/shared/gr-limited-text/gr-limited-text.html
+++ b/polygerrit-ui/app/elements/shared/gr-limited-text/gr-limited-text.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/shared/gr-limited-text/gr-limited-text.js b/polygerrit-ui/app/elements/shared/gr-limited-text/gr-limited-text.js
index eabe061..0dc3a7d 100644
--- a/polygerrit-ui/app/elements/shared/gr-limited-text/gr-limited-text.js
+++ b/polygerrit-ui/app/elements/shared/gr-limited-text/gr-limited-text.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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';
 
@@ -39,10 +42,18 @@
         type: Boolean,
         value: false,
       },
+
+      /**
+       * The maximum number of characters to display in the tooltop.
+       */
+      tooltipLimit: {
+        type: Number,
+        value: 1024,
+      },
     },
 
     observers: [
-      '_updateTitle(text, limit)',
+      '_updateTitle(text, limit, tooltipLimit)',
     ],
 
     behaviors: [
@@ -53,10 +64,10 @@
      * The text or limit have changed. Recompute whether a tooltip needs to be
      * enabled.
      */
-    _updateTitle(text, limit) {
+    _updateTitle(text, limit, tooltipLimit) {
       this.hasTooltip = !!limit && !!text && text.length > limit;
       if (this.hasTooltip) {
-        this.setAttribute('title', text);
+        this.setAttribute('title', text.substr(0, tooltipLimit));
       } else {
         this.removeAttribute('title');
       }
diff --git a/polygerrit-ui/app/elements/shared/gr-limited-text/gr-limited-text_test.html b/polygerrit-ui/app/elements/shared/gr-limited-text/gr-limited-text_test.html
index 9e00331..16eb960 100644
--- a/polygerrit-ui/app/elements/shared/gr-limited-text/gr-limited-text_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-limited-text/gr-limited-text_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -66,15 +67,20 @@
       assert.equal(element.getAttribute('title'), 'abc 123');
       assert.isTrue(element.hasTooltip);
 
+      element.tooltipLimit = 3;
+      flushAsynchronousOperations();
+      assert.equal(element.getAttribute('title'), 'abc');
+
+      element.tooltipLimit = 1024;
       element.limit = 100;
       flushAsynchronousOperations();
-      assert.equal(updateSpy.callCount, 4);
+      assert.equal(updateSpy.callCount, 6);
       assert.isNotOk(element.getAttribute('title'));
       assert.isFalse(element.hasTooltip);
 
       element.limit = null;
       flushAsynchronousOperations();
-      assert.equal(updateSpy.callCount, 5);
+      assert.equal(updateSpy.callCount, 7);
       assert.isNotOk(element.getAttribute('title'));
       assert.isFalse(element.hasTooltip);
     });
diff --git a/polygerrit-ui/app/elements/shared/gr-linked-chip/gr-linked-chip.html b/polygerrit-ui/app/elements/shared/gr-linked-chip/gr-linked-chip.html
index d30bad2..fab562a 100644
--- a/polygerrit-ui/app/elements/shared/gr-linked-chip/gr-linked-chip.html
+++ b/polygerrit-ui/app/elements/shared/gr-linked-chip/gr-linked-chip.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,6 +18,7 @@
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
 <link rel="import" href="../../../behaviors/gr-tooltip-behavior/gr-tooltip-behavior.html">
 <link rel="import" href="../gr-button/gr-button.html">
+<link rel="import" href="../gr-icons/gr-icons.html">
 <link rel="import" href="../gr-limited-text/gr-limited-text.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 
@@ -29,7 +31,7 @@
       }
       .container {
         align-items: center;
-        background: #eee;
+        background: var(--chip-background-color);
         border-radius: .75em;
         display: inline-flex;
         padding: 0 .5em;
@@ -43,22 +45,15 @@
       gr-button.remove {
         --gr-button: {
           border: 0;
-          color: #666;
-          font-size: 1.7em;
+          color: var(--deemphasized-text-color);
+          font-size: 1.7rem;
           font-weight: normal;
           height: .6em;
-          line-height: .6em;
+          line-height: .6;
           margin-left: .15em;
-          margin-top: -.05em;
           padding: 0;
           text-decoration: none;
         }
-        --gr-button-hover-color: {
-          color: #333;
-        }
-        --gr-button-hover-background-color: {
-          color: #333;
-        }
       }
       .transparentBackground,
       gr-button.transparentBackground {
@@ -68,10 +63,19 @@
         opacity: .6;
         pointer-events: none;
       }
+      a {
+       color: var(--linked-chip-text-color);
+      }
+      iron-icon {
+        height: 1.2rem;
+        width: 1.2rem;
+      }
     </style>
     <div class$="container [[_getBackgroundClass(transparentBackground)]]">
       <a href$="[[href]]">
-        <gr-limited-text limit="[[limit]]" text="[[text]]"></gr-limited-text>
+        <gr-limited-text
+            limit="[[limit]]"
+            text="[[text]]"></gr-limited-text>
       </a>
       <gr-button
           id="remove"
@@ -79,7 +83,9 @@
           hidden$="[[!removable]]"
           hidden
           class$="remove [[_getBackgroundClass(transparentBackground)]]"
-          on-tap="_handleRemoveTap">×</gr-button>
+          on-tap="_handleRemoveTap">
+        <iron-icon icon="gr-icons:close"></iron-icon>
+      </gr-button>
     </div>
   </template>
   <script src="gr-linked-chip.js"></script>
diff --git a/polygerrit-ui/app/elements/shared/gr-linked-chip/gr-linked-chip.js b/polygerrit-ui/app/elements/shared/gr-linked-chip/gr-linked-chip.js
index bfb8dbb..f8f29b8 100644
--- a/polygerrit-ui/app/elements/shared/gr-linked-chip/gr-linked-chip.js
+++ b/polygerrit-ui/app/elements/shared/gr-linked-chip/gr-linked-chip.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
diff --git a/polygerrit-ui/app/elements/shared/gr-linked-chip/gr-linked-chip_test.html b/polygerrit-ui/app/elements/shared/gr-linked-chip/gr-linked-chip_test.html
index d707d10..eb57428 100644
--- a/polygerrit-ui/app/elements/shared/gr-linked-chip/gr-linked-chip_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-linked-chip/gr-linked-chip_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/shared/gr-linked-text/ba-linkify.js b/polygerrit-ui/app/elements/shared/gr-linked-text/ba-linkify.js
deleted file mode 100644
index 26dacd6..0000000
--- a/polygerrit-ui/app/elements/shared/gr-linked-text/ba-linkify.js
+++ /dev/null
@@ -1,191 +0,0 @@
-/*!
- * JavaScript Linkify - v0.3 - 6/27/2009
- * http://benalman.com/projects/javascript-linkify/
- *
- * Copyright (c) 2009 "Cowboy" Ben Alman
- * Dual licensed under the MIT and GPL licenses.
- * http://benalman.com/about/license/
- *
- * Some regexps adapted from http://userscripts.org/scripts/review/7122
- */
-
-// Script: JavaScript Linkify: Process links in text!
-//
-// *Version: 0.3, Last updated: 6/27/2009*
-//
-// Project Home - http://benalman.com/projects/javascript-linkify/
-// GitHub       - http://github.com/cowboy/javascript-linkify/
-// Source       - http://github.com/cowboy/javascript-linkify/raw/master/ba-linkify.js
-// (Minified)   - http://github.com/cowboy/javascript-linkify/raw/master/ba-linkify.min.js (2.8kb)
-//
-// About: License
-//
-// Copyright (c) 2009 "Cowboy" Ben Alman,
-// Dual licensed under the MIT and GPL licenses.
-// http://benalman.com/about/license/
-//
-// Permission is hereby granted, free of charge, to any person
-// obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without
-// restriction, including without limitation the rights to use,
-// copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following
-// conditions:
-
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-// OTHER DEALINGS IN THE SOFTWARE.
-
-window.linkify = (function(){
-  var
-  SCHEME = "[a-z\\d.-]+://",
-  IPV4 = "(?:(?:[0-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])\\.){3}(?:[0-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])",
-  HOSTNAME = "(?:(?:[^\\s!@#$%^&*()_=+[\\]{}\\\\|;:'\",.<>/?]+)\\.)+",
-  TLD = "(?:ac|ad|aero|ae|af|ag|ai|al|am|an|ao|aq|arpa|ar|asia|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|biz|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|cat|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|coop|com|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|edu|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gov|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|info|int|in|io|iq|ir|is|it|je|jm|jobs|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mil|mk|ml|mm|mn|mobi|mo|mp|mq|mr|ms|mt|museum|mu|mv|mw|mx|my|mz|name|na|nc|net|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|org|pa|pe|pf|pg|ph|pk|pl|pm|pn|pro|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tel|tf|tg|th|tj|tk|tl|tm|tn|to|tp|travel|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|xn--0zwm56d|xn--11b5bs3a9aj6g|xn--80akhbyknj4f|xn--9t4b11yi5a|xn--deba0ad|xn--g6w251d|xn--hgbk6aj7f53bba|xn--hlcj6aya9esc7a|xn--jxalpdlp|xn--kgbechtv|xn--zckzah|ye|yt|yu|za|zm|zw)",
-  HOST_OR_IP = "(?:" + HOSTNAME + TLD + "|" + IPV4 + ")",
-  PATH = "(?:[;/][^#?<>\\s]*)?",
-  QUERY_FRAG = "(?:\\?[^#<>\\s]*)?(?:#[^<>\\s]*)?",
-  URI1 = "\\b" + SCHEME + "[^<>\\s]+",
-  URI2 = "\\b" + HOST_OR_IP + PATH + QUERY_FRAG + "(?!\\w)",
-
-  MAILTO = "mailto:",
-  EMAIL = "(?:" + MAILTO + ")?[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@" + HOST_OR_IP + QUERY_FRAG + "(?!\\w)",
-
-  URI_RE = new RegExp( "(?:" + URI1 + "|" + URI2 + "|" + EMAIL + ")", "ig" ),
-  SCHEME_RE = new RegExp( "^" + SCHEME, "i" ),
-
-  quotes = {
-    "'": "`",
-    '>': '<',
-    ')': '(',
-    ']': '[',
-    '}': '{',
-    '»': '«',
-    '›': '‹'
-  },
-
-  default_options = {
-    callback: function( text, href ) {
-      return href ? '<a href="' + href + '" title="' + href + '">' + text + '</a>' : text;
-    },
-    punct_regexp: /(?:[!?.,:;'"]|(?:&|&amp;)(?:lt|gt|quot|apos|raquo|laquo|rsaquo|lsaquo);)$/
-  };
-
-  return function( txt, options ) {
-    options = options || {};
-
-    // Temp variables.
-    var arr,
-    i,
-    link,
-    href,
-
-      // Output HTML.
-      html = '',
-
-      // Store text / link parts, in order, for re-combination.
-      parts = [],
-
-      // Used for keeping track of indices in the text.
-      idx_prev,
-      idx_last,
-      idx,
-      link_last,
-
-      // Used for trimming trailing punctuation and quotes from links.
-      matches_begin,
-      matches_end,
-      quote_begin,
-      quote_end;
-
-    // Initialize options.
-    for ( i in default_options ) {
-      if ( options[ i ] === undefined ) {
-        options[ i ] = default_options[ i ];
-      }
-    }
-
-    // Find links.
-    while ( arr = URI_RE.exec( txt ) ) {
-
-      link = arr[0];
-      idx_last = URI_RE.lastIndex;
-      idx = idx_last - link.length;
-
-      // Not a link if preceded by certain characters.
-      if ( /[\/:]/.test( txt.charAt( idx - 1 ) ) ) {
-        continue;
-      }
-
-      // Trim trailing punctuation.
-      do {
-        // If no changes are made, we don't want to loop forever!
-        link_last = link;
-
-        quote_end = link.substr( -1 )
-        quote_begin = quotes[ quote_end ];
-
-        // Ending quote character?
-        if ( quote_begin ) {
-          matches_begin = link.match( new RegExp( '\\' + quote_begin + '(?!$)', 'g' ) );
-          matches_end = link.match( new RegExp( '\\' + quote_end, 'g' ) );
-
-          // If quotes are unbalanced, remove trailing quote character.
-          if ( ( matches_begin ? matches_begin.length : 0 ) < ( matches_end ? matches_end.length : 0 ) ) {
-            link = link.substr( 0, link.length - 1 );
-            idx_last--;
-          }
-        }
-
-        // Ending non-quote punctuation character?
-        if ( options.punct_regexp ) {
-          link = link.replace( options.punct_regexp, function(a){
-            idx_last -= a.length;
-            return '';
-          });
-        }
-      } while ( link.length && link !== link_last );
-
-      href = link;
-
-      // Add appropriate protocol to naked links.
-      if ( !SCHEME_RE.test( href ) ) {
-        href = ( href.indexOf( '@' ) !== -1 ? ( !href.indexOf( MAILTO ) ? '' : MAILTO )
-          : !href.indexOf( 'irc.' ) ? 'irc://'
-          : !href.indexOf( 'ftp.' ) ? 'ftp://'
-          : 'http://' )
-        + href;
-      }
-
-      // Push preceding non-link text onto the array.
-      if ( idx_prev != idx ) {
-        parts.push([ txt.slice( idx_prev, idx ) ]);
-        idx_prev = idx_last;
-      }
-
-      // Push massaged link onto the array
-      parts.push([ link, href ]);
-    };
-
-    // Push remaining non-link text onto the array.
-    parts.push([ txt.substr( idx_prev ) ]);
-
-    // Process the array items.
-    for ( i = 0; i < parts.length; i++ ) {
-      html += options.callback.apply( window, parts[i] );
-    }
-
-    // In case of catastrophic failure, return the original text;
-    return html || txt;
-  };
-
-})();
\ No newline at end of file
diff --git a/polygerrit-ui/app/elements/shared/gr-linked-text/gr-linked-text.html b/polygerrit-ui/app/elements/shared/gr-linked-text/gr-linked-text.html
index a0d9233..c35768f 100644
--- a/polygerrit-ui/app/elements/shared/gr-linked-text/gr-linked-text.html
+++ b/polygerrit-ui/app/elements/shared/gr-linked-text/gr-linked-text.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -15,9 +16,10 @@
 -->
 
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../core/gr-navigation/gr-navigation.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 
-<script src="ba-linkify.js"></script>
+<script src="../../../bower_components/ba-linkify/ba-linkify.js"></script>
 <script src="link-text-parser.js"></script>
 <dom-module id="gr-linked-text">
   <template>
diff --git a/polygerrit-ui/app/elements/shared/gr-linked-text/gr-linked-text.js b/polygerrit-ui/app/elements/shared/gr-linked-text/gr-linked-text.js
index 0f346f4..530da02 100644
--- a/polygerrit-ui/app/elements/shared/gr-linked-text/gr-linked-text.js
+++ b/polygerrit-ui/app/elements/shared/gr-linked-text/gr-linked-text.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -40,7 +43,7 @@
       '_contentOrConfigChanged(content, config)',
     ],
 
-    _contentChanged: function(content) {
+    _contentChanged(content) {
       // In the case where the config may not be set (perhaps due to the
       // request for it still being in flight), set the content anyway to
       // prevent waiting on the config to display the text.
@@ -48,30 +51,54 @@
       this.$.output.textContent = content;
     },
 
-    _contentOrConfigChanged: function(content, config) {
-      var output = Polymer.dom(this.$.output);
+    /**
+     * Because either the source text or the linkification config has changed,
+     * the content should be re-parsed.
+     * @param {string|null|undefined} content The raw, un-linkified source
+     *     string to parse.
+     * @param {Object|null|undefined} config The server config specifying
+     *     commentLink patterns
+     */
+    _contentOrConfigChanged(content, config) {
+      config = Gerrit.Nav.mapCommentlinks(config);
+      const output = Polymer.dom(this.$.output);
       output.textContent = '';
-      var parser = new GrLinkTextParser(
-          config, function(text, href, fragment) {
-        if (href) {
-          var a = document.createElement('a');
-          a.href = href;
-          a.textContent = text;
-          a.target = '_blank';
-          a.rel = 'noopener';
-          output.appendChild(a);
-        } else if (fragment) {
-          output.appendChild(fragment);
-        }
-      }, this.removeZeroWidthSpace);
+      const parser = new GrLinkTextParser(config,
+          this._handleParseResult.bind(this), this.removeZeroWidthSpace);
       parser.parse(content);
 
       // Ensure that links originating from HTML commentlink configs open in a
       // new tab. @see Issue 5567
-      output.querySelectorAll('a').forEach(function(anchor) {
+      output.querySelectorAll('a').forEach(anchor => {
         anchor.setAttribute('target', '_blank');
         anchor.setAttribute('rel', 'noopener');
       });
     },
+
+    /**
+     * This method is called when the GrLikTextParser emits a partial result
+     * (used as the "callback" parameter). It will be called in either of two
+     * ways:
+     * - To create a link: when called with `text` and `href` arguments, a link
+     *   element should be created and attached to the resulting DOM.
+     * - To attach an arbitrary fragment: when called with only the `fragment`
+     *   argument, the fragment should be attached to the resulting DOM as is.
+     * @param {string|null} text
+     * @param {string|null} href
+     * @param  {DocumentFragment|undefined} fragment
+     */
+    _handleParseResult(text, href, fragment) {
+      const output = Polymer.dom(this.$.output);
+      if (href) {
+        const a = document.createElement('a');
+        a.href = href;
+        a.textContent = text;
+        a.target = '_blank';
+        a.rel = 'noopener';
+        output.appendChild(a);
+      } else if (fragment) {
+        output.appendChild(fragment);
+      }
+    },
   });
 })();
diff --git a/polygerrit-ui/app/elements/shared/gr-linked-text/gr-linked-text_test.html b/polygerrit-ui/app/elements/shared/gr-linked-text/gr-linked-text_test.html
index 52a7de0..23c1442 100644
--- a/polygerrit-ui/app/elements/shared/gr-linked-text/gr-linked-text_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-linked-text/gr-linked-text_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -36,29 +37,30 @@
 </test-fixture>
 
 <script>
-  suite('gr-linked-text tests', function() {
-    var element;
-    var sandbox;
+  suite('gr-linked-text tests', () => {
+    let element;
+    let sandbox;
 
-    setup(function() {
+    setup(() => {
       element = fixture('basic');
       sandbox = sinon.sandbox.create();
+      sandbox.stub(Gerrit.Nav, 'mapCommentlinks', x => x);
       element.config = {
         ph: {
           match: '([Bb]ug|[Ii]ssue)\\s*#?(\\d+)',
-          link: 'https://code.google.com/p/gerrit/issues/detail?id=$2'
+          link: 'https://code.google.com/p/gerrit/issues/detail?id=$2',
         },
         changeid: {
           match: '(I[0-9a-f]{8,40})',
-          link: '#/q/$1'
+          link: '#/q/$1',
         },
         changeid2: {
           match: 'Change-Id: +(I[0-9a-f]{8,40})',
-          link: '#/q/$1'
+          link: '#/q/$1',
         },
         googlesearch: {
           match: 'google:(.+)',
-          link: 'https://bing.com/search?q=$1',  // html should supercede link.
+          link: 'https://bing.com/search?q=$1', // html should supercede link.
           html: '<a href="https://google.com/search?q=$1">$1</a>',
         },
         hashedhtml: {
@@ -73,27 +75,27 @@
       };
     });
 
-    teardown(function() {
+    teardown(() => {
       sandbox.restore();
     });
 
-    test('URL pattern was parsed and linked.', function() {
-      // Reguar inline link.
-      var url = 'https://code.google.com/p/gerrit/issues/detail?id=3650';
+    test('URL pattern was parsed and linked.', () => {
+      // Regular inline link.
+      const url = 'https://code.google.com/p/gerrit/issues/detail?id=3650';
       element.content = url;
-      var linkEl = element.$.output.childNodes[0];
+      const linkEl = element.$.output.childNodes[0];
       assert.equal(linkEl.target, '_blank');
       assert.equal(linkEl.rel, 'noopener');
       assert.equal(linkEl.href, url);
       assert.equal(linkEl.textContent, url);
     });
 
-    test('Bug pattern was parsed and linked', function() {
+    test('Bug pattern was parsed and linked', () => {
       // "Issue/Bug" pattern.
       element.content = 'Issue 3650';
 
-      var linkEl = element.$.output.childNodes[0];
-      var url = 'https://code.google.com/p/gerrit/issues/detail?id=3650';
+      let linkEl = element.$.output.childNodes[0];
+      const url = 'https://code.google.com/p/gerrit/issues/detail?id=3650';
       assert.equal(linkEl.target, '_blank');
       assert.equal(linkEl.href, url);
       assert.equal(linkEl.textContent, 'Issue 3650');
@@ -106,26 +108,26 @@
       assert.equal(linkEl.textContent, 'Bug 3650');
     });
 
-    test('Change-Id pattern was parsed and linked', function() {
+    test('Change-Id pattern was parsed and linked', () => {
       // "Change-Id:" pattern.
-      var changeID = 'I11d6a37f5e9b5df0486f6c922d8836dfa780e03e';
-      var prefix = 'Change-Id: ';
+      const changeID = 'I11d6a37f5e9b5df0486f6c922d8836dfa780e03e';
+      const prefix = 'Change-Id: ';
       element.content = prefix + changeID;
 
-      var textNode = element.$.output.childNodes[0];
-      var linkEl = element.$.output.childNodes[1];
+      const textNode = element.$.output.childNodes[0];
+      const linkEl = element.$.output.childNodes[1];
       assert.equal(textNode.textContent, prefix);
-      var url = '/q/' + changeID;
+      const url = '/q/' + changeID;
       assert.equal(linkEl.target, '_blank');
       // Since url is a path, the host is added automatically.
       assert.isTrue(linkEl.href.endsWith(url));
       assert.equal(linkEl.textContent, changeID);
     });
 
-    test('Multiple matches', function() {
+    test('Multiple matches', () => {
       element.content = 'Issue 3650\nIssue 3450';
-      var linkEl1 = element.$.output.childNodes[0];
-      var linkEl2 = element.$.output.childNodes[2];
+      const linkEl1 = element.$.output.childNodes[0];
+      const linkEl2 = element.$.output.childNodes[2];
 
       assert.equal(linkEl1.target, '_blank');
       assert.equal(linkEl1.href,
@@ -138,22 +140,22 @@
       assert.equal(linkEl2.textContent, 'Issue 3450');
     });
 
-    test('Change-Id pattern parsed before bug pattern', function() {
+    test('Change-Id pattern parsed before bug pattern', () => {
       // "Change-Id:" pattern.
-      var changeID = 'I11d6a37f5e9b5df0486f6c922d8836dfa780e03e';
-      var prefix = 'Change-Id: ';
+      const changeID = 'I11d6a37f5e9b5df0486f6c922d8836dfa780e03e';
+      const prefix = 'Change-Id: ';
 
       // "Issue/Bug" pattern.
-      var bug = 'Issue 3650';
+      const bug = 'Issue 3650';
 
-      var changeUrl = '/q/' + changeID;
-      var bugUrl = 'https://code.google.com/p/gerrit/issues/detail?id=3650';
+      const changeUrl = '/q/' + changeID;
+      const bugUrl = 'https://code.google.com/p/gerrit/issues/detail?id=3650';
 
       element.content = prefix + changeID + bug;
 
-      var textNode = element.$.output.childNodes[0];
-      var changeLinkEl = element.$.output.childNodes[1];
-      var bugLinkEl = element.$.output.childNodes[2];
+      const textNode = element.$.output.childNodes[0];
+      const changeLinkEl = element.$.output.childNodes[1];
+      const bugLinkEl = element.$.output.childNodes[2];
 
       assert.equal(textNode.textContent, prefix);
 
@@ -166,41 +168,66 @@
       assert.equal(bugLinkEl.textContent, 'Issue 3650');
     });
 
-    test('html field in link config', function() {
+    test('html field in link config', () => {
       element.content = 'google:do a barrel roll';
-      var linkEl = element.$.output.childNodes[0];
+      const linkEl = element.$.output.childNodes[0];
       assert.equal(linkEl.getAttribute('href'),
           'https://google.com/search?q=do a barrel roll');
       assert.equal(linkEl.textContent, 'do a barrel roll');
     });
 
-    test('removing hash from links', function() {
+    test('removing hash from links', () => {
       element.content = 'hash:foo';
-      var linkEl = element.$.output.childNodes[0];
+      const linkEl = element.$.output.childNodes[0];
       assert.isTrue(linkEl.href.endsWith('/awesomesauce'));
       assert.equal(linkEl.textContent, 'foo');
     });
 
-    test('disabled config', function() {
+    test('disabled config', () => {
       element.content = 'foo:baz';
       assert.equal(element.$.output.innerHTML, 'foo:baz');
     });
 
-    test('R=email labels link correctly', function() {
+    test('R=email labels link correctly', () => {
       element.removeZeroWidthSpace = true;
       element.content = 'R=\u200Btest@google.com';
       assert.equal(element.$.output.textContent, 'R=test@google.com');
       assert.equal(element.$.output.innerHTML.match(/(R=<a)/g).length, 1);
     });
 
-    test('CC=email labels link correctly', function() {
+    test('CC=email labels link correctly', () => {
       element.removeZeroWidthSpace = true;
       element.content = 'CC=\u200Btest@google.com';
       assert.equal(element.$.output.textContent, 'CC=test@google.com');
       assert.equal(element.$.output.innerHTML.match(/(CC=<a)/g).length, 1);
     });
 
-    test('overlapping links', function() {
+    test('only {http,https,mailto} protocols are linkified', () => {
+      element.content = 'xx mailto:test@google.com yy';
+      let links = element.$.output.querySelectorAll('a');
+      assert.equal(links.length, 1);
+      assert.equal(links[0].getAttribute('href'), 'mailto:test@google.com');
+
+      element.content = 'xx http://google.com yy';
+      links = element.$.output.querySelectorAll('a');
+      assert.equal(links.length, 1);
+      assert.equal(links[0].getAttribute('href'), 'http://google.com');
+
+      element.content = 'xx https://google.com yy';
+      links = element.$.output.querySelectorAll('a');
+      assert.equal(links.length, 1);
+      assert.equal(links[0].getAttribute('href'), 'https://google.com');
+
+      element.content = 'xx ssh://google.com yy';
+      links = element.$.output.querySelectorAll('a');
+      assert.equal(links.length, 0);
+
+      element.content = 'xx ftp://google.com yy';
+      links = element.$.output.querySelectorAll('a');
+      assert.equal(links.length, 0);
+    });
+
+    test('overlapping links', () => {
       element.config = {
         b1: {
           match: '(B:\\s*)(\\d+)',
@@ -212,7 +239,7 @@
         },
       };
       element.content = '- B: 123, 45';
-      var links = Polymer.dom(element.root).querySelectorAll('a');
+      const links = Polymer.dom(element.root).querySelectorAll('a');
 
       assert.equal(links.length, 2);
       assert.equal(element.$$('span').textContent, '- B: 123, 45');
@@ -224,31 +251,31 @@
       assert.equal(links[1].textContent, '45');
     });
 
-    test('_contentOrConfigChanged called with config', function() {
-      var contentStub = sandbox.stub(element, '_contentChanged');
-      var contentConfigStub = sandbox.stub(element, '_contentOrConfigChanged');
+    test('_contentOrConfigChanged called with config', () => {
+      const contentStub = sandbox.stub(element, '_contentChanged');
+      const contentConfigStub = sandbox.stub(element, '_contentOrConfigChanged');
       element.content = 'some text';
       assert.isTrue(contentStub.called);
       assert.isTrue(contentConfigStub.called);
     });
   });
 
-  suite('gr-linked-text with null config', function() {
-    var element;
-    var sandbox;
+  suite('gr-linked-text with null config', () => {
+    let element;
+    let sandbox;
 
-    setup(function() {
+    setup(() => {
       element = fixture('basic');
       sandbox = sinon.sandbox.create();
     });
 
-    teardown(function() {
+    teardown(() => {
       sandbox.restore();
     });
 
-    test('_contentOrConfigChanged not called without config', function() {
-      var contentStub = sandbox.stub(element, '_contentChanged');
-      var contentConfigStub = sandbox.stub(element, '_contentOrConfigChanged');
+    test('_contentOrConfigChanged not called without config', () => {
+      const contentStub = sandbox.stub(element, '_contentChanged');
+      const contentConfigStub = sandbox.stub(element, '_contentOrConfigChanged');
       element.content = 'some text';
       assert.isTrue(contentStub.called);
       assert.isFalse(contentConfigStub.called);
diff --git a/polygerrit-ui/app/elements/shared/gr-linked-text/link-text-parser.js b/polygerrit-ui/app/elements/shared/gr-linked-text/link-text-parser.js
index 8a489f4..8526c3e 100644
--- a/polygerrit-ui/app/elements/shared/gr-linked-text/link-text-parser.js
+++ b/polygerrit-ui/app/elements/shared/gr-linked-text/link-text-parser.js
@@ -1,208 +1,328 @@
-// Copyright (C) 2015 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.
+/**
+ * @license
+ * Copyright (C) 2015 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';
 
-'use strict';
+  const Defs = {};
 
-function GrLinkTextParser(linkConfig, callback, opt_removeZeroWidthSpace) {
-  this.linkConfig = linkConfig;
-  this.callback = callback;
-  this.removeZeroWidthSpace = opt_removeZeroWidthSpace;
-  Object.preventExtensions(this);
-}
+  /**
+   * @typedef {{
+   *    html: Node,
+   *    position: number,
+   *    length: number,
+   * }}
+   */
+  Defs.CommentLinkItem;
 
-GrLinkTextParser.prototype.addText = function(text, href) {
-  if (!text) {
-    return;
-  }
-  this.callback(text, href);
-};
+  /**
+   * Pattern describing URLs with supported protocols.
+   * @type {RegExp}
+   */
+  const URL_PROTOCOL_PATTERN = /^(https?:\/\/|mailto:)/;
 
-GrLinkTextParser.prototype.processLinks = function(text, outputArray) {
-  this.sortArrayReverse(outputArray);
-  var fragment = document.createDocumentFragment();
-  var cursor = text.length;
-
-  // Start inserting linkified URLs from the end of the String. That way, the
-  // string positions of the items don't change as we iterate through.
-  outputArray.forEach(function(item) {
-    // Add any text between the current linkified item and the item added before
-    // if it exists.
-    if (item.position + item.length !== cursor) {
-      fragment.insertBefore(
-          document.createTextNode(
-              text.slice(item.position + item.length, cursor)),
-          fragment.firstChild);
-    }
-    fragment.insertBefore(item.html, fragment.firstChild);
-    cursor = item.position;
-  });
-
-  // Add the beginning portion at the end.
-  if (cursor !== 0) {
-    fragment.insertBefore(
-        document.createTextNode(text.slice(0, cursor)), fragment.firstChild);
+  /**
+   * Construct a parser for linkifying text. Will linkify plain URLs that appear
+   * in the text as well as custom links if any are specified in the linkConfig
+   * parameter.
+   * @param {Object|null|undefined} linkConfig Comment links as specified by the
+   *     commentlinks field on a project config.
+   * @param {Function} callback The callback to be fired when an intermediate
+   *     parse result is emitted. The callback is passed text and href strings
+   *     if a link is to be created, or a document fragment otherwise.
+   * @param {boolean|undefined} opt_removeZeroWidthSpace If true, zero-width
+   *     spaces will be removed from R=<email> and CC=<email> expressions.
+   */
+  function GrLinkTextParser(linkConfig, callback, opt_removeZeroWidthSpace) {
+    this.linkConfig = linkConfig;
+    this.callback = callback;
+    this.removeZeroWidthSpace = opt_removeZeroWidthSpace;
+    Object.preventExtensions(this);
   }
 
-  this.callback(null, null, fragment);
-};
+  /**
+   * Emit a callback to create a link element.
+   * @param {string} text The text of the link.
+   * @param {string} href The URL to use as the href of the link.
+   */
+  GrLinkTextParser.prototype.addText = function(text, href) {
+    if (!text) { return; }
+    this.callback(text, href);
+  };
 
-GrLinkTextParser.prototype.sortArrayReverse = function(outputArray) {
-  outputArray.sort(function(a, b) {return b.position - a.position});
-};
+  /**
+   * Given the source text and a list of CommentLinkItem objects that were
+   * generated by the commentlinks config, emit parsing callbacks.
+   * @param {string} text The chuml of source text over which the outputArray
+   *     items range.
+   * @param {!Array<Defs.CommentLinkItem>} outputArray The list of items to add
+   *     resulting from commentlink matches.
+   */
+  GrLinkTextParser.prototype.processLinks = function(text, outputArray) {
+    this.sortArrayReverse(outputArray);
+    const fragment = document.createDocumentFragment();
+    let cursor = text.length;
 
-GrLinkTextParser.prototype.addItem =
-    function(text, href, html, position, length, outputArray) {
-  var htmlOutput = '';
-
-  if (href) {
-    var a = document.createElement('a');
-    a.href = href;
-    a.textContent = text;
-    a.target = '_blank';
-    a.rel = 'noopener';
-    htmlOutput = a;
-  } else if (html) {
-    var fragment = document.createDocumentFragment();
-    // Create temporary div to hold the nodes in.
-    var div = document.createElement('div');
-    div.innerHTML = html;
-    while (div.firstChild) {
-      fragment.appendChild(div.firstChild);
-    }
-    htmlOutput = fragment;
-  }
-
-  outputArray.push({
-    html: htmlOutput,
-    position: position,
-    length: length,
-  });
-};
-
-GrLinkTextParser.prototype.addLink =
-    function(text, href, position, length, outputArray) {
-  if (!text) {
-    return;
-  }
-  if (!this.hasOverlap(position, length, outputArray)) {
-    this.addItem(text, href, null, position, length, outputArray);
-  }
-};
-
-GrLinkTextParser.prototype.addHTML =
-    function(html, position, length, outputArray) {
-  if (!this.hasOverlap(position, length, outputArray)) {
-    this.addItem(null, null, html, position, length, outputArray);
-  }
-};
-
-GrLinkTextParser.prototype.hasOverlap =
-    function(position, length, outputArray) {
-  var endPosition = position + length;
-  for (var i = 0; i < outputArray.length; i++) {
-    var arrayItemStart = outputArray[i].position;
-    var arrayItemEnd = outputArray[i].position + outputArray[i].length;
-    if ((position >= arrayItemStart && position < arrayItemEnd) ||
-      (endPosition > arrayItemStart && endPosition <= arrayItemEnd) ||
-      (position === arrayItemStart && position === arrayItemEnd)) {
-          return true;
-    }
-  }
-  return false;
-};
-
-GrLinkTextParser.prototype.parse = function(text) {
-  linkify(text, {
-    callback: this.parseChunk.bind(this),
-  });
-};
-
-GrLinkTextParser.prototype.parseChunk = function(text, href) {
-  // TODO(wyatta) switch linkify sequence, see issue 5526.
-  if (this.removeZeroWidthSpace) {
-    // Remove the zero-width space added in gr-change-view.
-    text = text.replace(/^(CC|R)=\u200B/gm, '$1=');
-  }
-
-  if (href) {
-    this.addText(text, href);
-  } else {
-    this.parseLinks(text, this.linkConfig);
-  }
-};
-
-GrLinkTextParser.prototype.parseLinks = function(text, patterns) {
-  // The outputArray is used to store all of the matches found for all patterns.
-  var outputArray = [];
-  for (var p in patterns) {
-    if (patterns[p].enabled != null && patterns[p].enabled == false) {
-      continue;
-    }
-    // PolyGerrit doesn't use hash-based navigation like GWT.
-    // Account for this.
-    // TODO(andybons): Support Gerrit being served from a base other than /,
-    // e.g. https://git.eclipse.org/r/
-    if (patterns[p].html) {
-      patterns[p].html =
-          patterns[p].html.replace(/<a href=\"#\//g, '<a href="/');
-    } else if (patterns[p].link) {
-      if (patterns[p].link[0] == '#') {
-        patterns[p].link = patterns[p].link.substr(1);
+    // Start inserting linkified URLs from the end of the String. That way, the
+    // string positions of the items don't change as we iterate through.
+    outputArray.forEach(item => {
+      // Add any text between the current linkified item and the item added
+      // before if it exists.
+      if (item.position + item.length !== cursor) {
+        fragment.insertBefore(
+            document.createTextNode(
+                text.slice(item.position + item.length, cursor)),
+            fragment.firstChild);
       }
+      fragment.insertBefore(item.html, fragment.firstChild);
+      cursor = item.position;
+    });
+
+    // Add the beginning portion at the end.
+    if (cursor !== 0) {
+      fragment.insertBefore(
+          document.createTextNode(text.slice(0, cursor)), fragment.firstChild);
     }
 
-    var pattern = new RegExp(patterns[p].match, 'g');
+    this.callback(null, null, fragment);
+  };
 
-    var match;
-    var textToCheck = text;
-    var susbtrIndex = 0;
+  /**
+   * Sort the given array of CommentLinkItems such that the positions are in
+   * reverse order.
+   * @param {!Array<Defs.CommentLinkItem>} outputArray
+   */
+  GrLinkTextParser.prototype.sortArrayReverse = function(outputArray) {
+    outputArray.sort((a, b) => b.position - a.position);
+  };
 
-    while ((match = pattern.exec(textToCheck)) != null) {
-      textToCheck = textToCheck.substr(match.index + match[0].length);
-      var result = match[0].replace(pattern,
-          patterns[p].html || patterns[p].link);
+  /**
+   * Create a CommentLinkItem and append it to the given output array. This
+   * method can be called in either of two ways:
+   * - With `text` and `href` parameters provided, and the `html` parameter
+   *   passed as `null`. In this case, the new CommentLinkItem will be a link
+   *   element with the given text and href value.
+   * - With the `html` paremeter provided, and the `text` and `href` parameters
+   *   passed as `null`. In this case, the string of HTML will be parsed and the
+   *   first resulting node will be used as the resulting content.
+   * @param {string|null} text The text to use if creating a link.
+   * @param {string|null} href The href to use as the URL if creating a link.
+   * @param {string|null} html The html to parse and use as the result.
+   * @param {number} position The position inside the source text where the item
+   *     starts.
+   * @param {number} length The number of characters in the source text
+   *     represented by the item.
+   * @param {!Array<Defs.CommentLinkItem>} outputArray The array to which the
+   *     new item is to be appended.
+   */
+  GrLinkTextParser.prototype.addItem =
+      function(text, href, html, position, length, outputArray) {
+        let htmlOutput = '';
 
-      // Skip portion of replacement string that is equal to original.
-      for (var i = 0; i < result.length; i++) {
-        if (result[i] !== match[0][i]) {
-          break;
+        if (href) {
+          const a = document.createElement('a');
+          a.href = href;
+          a.textContent = text;
+          a.target = '_blank';
+          a.rel = 'noopener';
+          htmlOutput = a;
+        } else if (html) {
+          const fragment = document.createDocumentFragment();
+      // Create temporary div to hold the nodes in.
+          const div = document.createElement('div');
+          div.innerHTML = html;
+          while (div.firstChild) {
+            fragment.appendChild(div.firstChild);
+          }
+          htmlOutput = fragment;
+        }
+
+        outputArray.push({
+          html: htmlOutput,
+          position,
+          length,
+        });
+      };
+
+  /**
+   * Create a CommentLinkItem for a link and append it to the given output
+   * array.
+   * @param {string|null} text The text for the link.
+   * @param {string|null} href The href to use as the URL of the link.
+   * @param {number} position The position inside the source text where the link
+   *     starts.
+   * @param {number} length The number of characters in the source text
+   *     represented by the link.
+   * @param {!Array<Defs.CommentLinkItem>} outputArray The array to which the
+   *     new item is to be appended.
+   */
+  GrLinkTextParser.prototype.addLink =
+      function(text, href, position, length, outputArray) {
+        if (!text || this.hasOverlap(position, length, outputArray)) { return; }
+        this.addItem(text, href, null, position, length, outputArray);
+      };
+
+  /**
+   * Create a CommentLinkItem specified by an HTMl string and append it to the
+   * given output array.
+   * @param {string|null} html The html to parse and use as the result.
+   * @param {number} position The position inside the source text where the item
+   *     starts.
+   * @param {number} length The number of characters in the source text
+   *     represented by the item.
+   * @param {!Array<Defs.CommentLinkItem>} outputArray The array to which the
+   *     new item is to be appended.
+   */
+  GrLinkTextParser.prototype.addHTML =
+      function(html, position, length, outputArray) {
+        if (this.hasOverlap(position, length, outputArray)) { return; }
+        this.addItem(null, null, html, position, length, outputArray);
+      };
+
+  /**
+   * Does the given range overlap with anything already in the item list.
+   * @param {number} position
+   * @param {number} length
+   * @param {!Array<Defs.CommentLinkItem>} outputArray
+   */
+  GrLinkTextParser.prototype.hasOverlap =
+      function(position, length, outputArray) {
+        const endPosition = position + length;
+        for (let i = 0; i < outputArray.length; i++) {
+          const arrayItemStart = outputArray[i].position;
+          const arrayItemEnd = outputArray[i].position + outputArray[i].length;
+          if ((position >= arrayItemStart && position < arrayItemEnd) ||
+        (endPosition > arrayItemStart && endPosition <= arrayItemEnd) ||
+        (position === arrayItemStart && position === arrayItemEnd)) {
+            return true;
+          }
+        }
+        return false;
+      };
+
+  /**
+   * Parse the given source text and emit callbacks for the items that are
+   * parsed.
+   * @param {string} text
+   */
+  GrLinkTextParser.prototype.parse = function(text) {
+    linkify(text, {
+      callback: this.parseChunk.bind(this),
+    });
+  };
+
+  /**
+   * Callback that is pased into the linkify function. ba-linkify will call this
+   * method in either of two ways:
+   * - With both a `text` and `href` parameter provided: this indicates that
+   *   ba-linkify has found a plain URL and wants it linkified.
+   * - With only a `text` parameter provided: this represents the non-link
+   *   content that lies between the links the library has found.
+   * @param {string} text
+   * @param {string|null|undefined} href
+   */
+  GrLinkTextParser.prototype.parseChunk = function(text, href) {
+    // TODO(wyatta) switch linkify sequence, see issue 5526.
+    if (this.removeZeroWidthSpace) {
+      // Remove the zero-width space added in gr-change-view.
+      text = text.replace(/^(CC|R)=\u200B/gm, '$1=');
+    }
+
+    // If the href is provided then ba-linkify has recognized it as a URL. If
+    // the source text does not include a protocol, the protocol will be added
+    // by ba-linkify. Create the link if the href is provided and its protocol
+    // matches the expected pattern.
+    if (href && URL_PROTOCOL_PATTERN.test(href)) {
+      this.addText(text, href);
+    } else {
+      // For the sections of text that lie between the links found by
+      // ba-linkify, we search for the project-config-specified link patterns.
+      this.parseLinks(text, this.linkConfig);
+    }
+  };
+
+  /**
+   * Walk over the given source text to find matches for comemntlink patterns
+   * and emit parse result callbacks.
+   * @param {string} text The raw source text.
+   * @param {Object|null|undefined} patterns A comment links specification
+   *   object.
+   */
+  GrLinkTextParser.prototype.parseLinks = function(text, patterns) {
+    // The outputArray is used to store all of the matches found for all
+    // patterns.
+    const outputArray = [];
+    for (const p in patterns) {
+      if (patterns[p].enabled != null && patterns[p].enabled == false) {
+        continue;
+      }
+      // PolyGerrit doesn't use hash-based navigation like the GWT UI.
+      // Account for this.
+      if (patterns[p].html) {
+        patterns[p].html =
+            patterns[p].html.replace(/<a href=\"#\//g, '<a href="/');
+      } else if (patterns[p].link) {
+        if (patterns[p].link[0] == '#') {
+          patterns[p].link = patterns[p].link.substr(1);
         }
       }
-      result = result.slice(i);
 
-      if (patterns[p].html) {
-        this.addHTML(
-          result,
-          susbtrIndex + match.index + i,
-          match[0].length - i,
-          outputArray);
-      } else if (patterns[p].link) {
-        this.addLink(
-          match[0],
-          result,
-          susbtrIndex + match.index + i,
-          match[0].length - i,
-          outputArray);
-      } else {
-        throw Error('linkconfig entry ' + p +
-            ' doesn’t contain a link or html attribute.');
+      const pattern = new RegExp(patterns[p].match, 'g');
+
+      let match;
+      let textToCheck = text;
+      let susbtrIndex = 0;
+
+      while ((match = pattern.exec(textToCheck)) != null) {
+        textToCheck = textToCheck.substr(match.index + match[0].length);
+        let result = match[0].replace(pattern,
+            patterns[p].html || patterns[p].link);
+
+        let i;
+        // Skip portion of replacement string that is equal to original.
+        for (i = 0; i < result.length; i++) {
+          if (result[i] !== match[0][i]) { break; }
+        }
+        result = result.slice(i);
+
+        if (patterns[p].html) {
+          this.addHTML(
+              result,
+              susbtrIndex + match.index + i,
+              match[0].length - i,
+              outputArray);
+        } else if (patterns[p].link) {
+          this.addLink(
+              match[0],
+              result,
+              susbtrIndex + match.index + i,
+              match[0].length - i,
+              outputArray);
+        } else {
+          throw Error('linkconfig entry ' + p +
+              ' doesn’t contain a link or html attribute.');
+        }
+
+        // Update the substring location so we know where we are in relation to
+        // the initial full text string.
+        susbtrIndex = susbtrIndex + match.index + match[0].length;
       }
-
-      // Update the substring location so we know where we are in relation to
-      // the initial full text string.
-      susbtrIndex = susbtrIndex + match.index + match[0].length;
     }
-  }
-  this.processLinks(text, outputArray);
-};
+    this.processLinks(text, outputArray);
+  };
+
+  window.GrLinkTextParser = GrLinkTextParser;
+})();
diff --git a/polygerrit-ui/app/elements/shared/gr-list-view/gr-list-view.html b/polygerrit-ui/app/elements/shared/gr-list-view/gr-list-view.html
index 016932f..be02d40 100644
--- a/polygerrit-ui/app/elements/shared/gr-list-view/gr-list-view.html
+++ b/polygerrit-ui/app/elements/shared/gr-list-view/gr-list-view.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,7 +17,7 @@
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
 
 <link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
-<link rel="import" href="../../../behaviors/gr-url-encoding-behavior.html">
+<link rel="import" href="../../../behaviors/gr-url-encoding-behavior/gr-url-encoding-behavior.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 <link rel="import" href="../../shared/gr-button/gr-button.html">
 
@@ -24,37 +25,48 @@
   <template>
     <style include="shared-styles">
       #filter {
-        font-size: 1em;
+        font-size: var(--font-size-normal);
         max-width: 25em;
       }
+      #filter:focus {
+        outline: none;
+      }
       #topContainer {
+        align-items: center;
         display: flex;
+        height: 3rem;
         justify-content: space-between;
-        margin: 1em;
+        margin: 0 1em;
       }
       #createNewContainer:not(.show) {
         display: none;
       }
       a {
-        color: var(--default-text-color);
+        color: var(--primary-text-color);
         text-decoration: none;
       }
       a:hover {
         text-decoration: underline;
       }
       nav {
-        padding: .5em 0;
-        text-align: center;
+        align-items: center;
+        display: flex;
+        height: 3rem;
+        justify-content: flex-end;
+        margin-right: 20px;
       }
-      nav a {
-        display: inline-block;
+      nav,
+      iron-icon {
+        color: var(--deemphasized-text-color);
       }
-      nav a:first-of-type {
-        margin-right: .5em;
+      iron-icon {
+        height: 1.85rem;
+        margin-left: 16px;
+        width: 1.85rem;
       }
     </style>
     <div id="topContainer">
-      <div>
+      <div class="filterContainer">
         <label>Filter:</label>
         <input is="iron-input"
             type="text"
@@ -63,20 +75,23 @@
       </div>
       <div id="createNewContainer"
           class$="[[_computeCreateClass(createNew)]]">
-        <gr-button id="createNew" on-tap="_createNewItem">
+        <gr-button primary link id="createNew" on-tap="_createNewItem">
           Create New
         </gr-button>
       </div>
     </div>
-    <content></content>
+    <slot></slot>
     <nav>
       <a id="prevArrow"
           href$="[[_computeNavLink(offset, -1, itemsPerPage, filter, path)]]"
-          hidden$="[[_hidePrevArrow(offset)]]" hidden>&larr; Prev</a>
+          hidden$="[[_hidePrevArrow(loading, offset)]]" hidden>
+        <iron-icon icon="gr-icons:chevron-left"></iron-icon>
+      </a>
       <a id="nextArrow"
           href$="[[_computeNavLink(offset, 1, itemsPerPage, filter, path)]]"
           hidden$="[[_hideNextArrow(loading, items)]]" hidden>
-        Next &rarr;</a>
+        <iron-icon icon="gr-icons:chevron-right"></iron-icon>
+      </a>
     </nav>
   </template>
   <script src="gr-list-view.js"></script>
diff --git a/polygerrit-ui/app/elements/shared/gr-list-view/gr-list-view.js b/polygerrit-ui/app/elements/shared/gr-list-view/gr-list-view.js
index e9ee51a..8b83eb3 100644
--- a/polygerrit-ui/app/elements/shared/gr-list-view/gr-list-view.js
+++ b/polygerrit-ui/app/elements/shared/gr-list-view/gr-list-view.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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';
 
@@ -81,8 +84,8 @@
       return createNew ? 'show' : '';
     },
 
-    _hidePrevArrow(offset) {
-      return offset === 0;
+    _hidePrevArrow(loading, offset) {
+      return loading || offset === 0;
     },
 
     _hideNextArrow(loading, items) {
diff --git a/polygerrit-ui/app/elements/shared/gr-list-view/gr-list-view_test.html b/polygerrit-ui/app/elements/shared/gr-list-view/gr-list-view_test.html
index 680bf93..09e68dd 100644
--- a/polygerrit-ui/app/elements/shared/gr-list-view/gr-list-view_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-list-view/gr-list-view_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -113,11 +114,12 @@
     });
 
     test('prev button', () => {
+      assert.isTrue(element._hidePrevArrow(true, 0));
       flush(() => {
         let offset = 0;
-        assert.isTrue(element._hidePrevArrow(offset));
+        assert.isTrue(element._hidePrevArrow(false, offset));
         offset = 5;
-        assert.isFalse(element._hidePrevArrow(offset));
+        assert.isFalse(element._hidePrevArrow(false, offset));
       });
     });
 
diff --git a/polygerrit-ui/app/elements/shared/gr-overlay/gr-overlay.html b/polygerrit-ui/app/elements/shared/gr-overlay/gr-overlay.html
index 1b59d35..e94b655 100644
--- a/polygerrit-ui/app/elements/shared/gr-overlay/gr-overlay.html
+++ b/polygerrit-ui/app/elements/shared/gr-overlay/gr-overlay.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -22,7 +23,7 @@
   <template>
     <style include="shared-styles">
       :host {
-        background: #fff;
+        background: var(--dialog-background-color);
         box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px;
       }
 
@@ -36,7 +37,7 @@
         }
       }
     </style>
-    <content></content>
+    <slot></slot>
   </template>
   <script src="gr-overlay.js"></script>
 </dom-module>
diff --git a/polygerrit-ui/app/elements/shared/gr-overlay/gr-overlay.js b/polygerrit-ui/app/elements/shared/gr-overlay/gr-overlay.js
index ebf2f02..6df04a2 100644
--- a/polygerrit-ui/app/elements/shared/gr-overlay/gr-overlay.js
+++ b/polygerrit-ui/app/elements/shared/gr-overlay/gr-overlay.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
diff --git a/polygerrit-ui/app/elements/shared/gr-overlay/gr-overlay_test.html b/polygerrit-ui/app/elements/shared/gr-overlay/gr-overlay_test.html
index 3f427ca..ee05b69 100644
--- a/polygerrit-ui/app/elements/shared/gr-overlay/gr-overlay_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-overlay/gr-overlay_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/shared/gr-page-nav/gr-page-nav.html b/polygerrit-ui/app/elements/shared/gr-page-nav/gr-page-nav.html
index f98a62c..3885497 100644
--- a/polygerrit-ui/app/elements/shared/gr-page-nav/gr-page-nav.html
+++ b/polygerrit-ui/app/elements/shared/gr-page-nav/gr-page-nav.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -21,8 +22,8 @@
   <template>
     <style include="shared-styles">
       #nav {
-        background-color: #f5f5f5;
-        border: 1px solid #eee;
+        background-color: var(--table-header-background-color);
+        border: 1px solid var(--border-color);
         border-top: none;
         height: 100%;
         position: absolute;
@@ -39,7 +40,7 @@
       }
     </style>
     <nav id="nav">
-      <content></content>
+      <slot></slot>
     </nav>
   </template>
   <script src="gr-page-nav.js"></script>
diff --git a/polygerrit-ui/app/elements/shared/gr-page-nav/gr-page-nav.js b/polygerrit-ui/app/elements/shared/gr-page-nav/gr-page-nav.js
index 4c38e3f..9ccff600 100644
--- a/polygerrit-ui/app/elements/shared/gr-page-nav/gr-page-nav.js
+++ b/polygerrit-ui/app/elements/shared/gr-page-nav/gr-page-nav.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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';
 
@@ -32,9 +35,7 @@
     _handleBodyScroll() {
       if (this._headerHeight === undefined) {
         let top = this._getOffsetTop(this);
-        // Don't want to include the element that wraps around the nav, start
-        // with its parent.
-        for (let offsetParent = this._getOffsetParent(this.offsetParent);
+        for (let offsetParent = this.offsetParent;
            offsetParent;
            offsetParent = this._getOffsetParent(offsetParent)) {
           top += this._getOffsetTop(offsetParent);
diff --git a/polygerrit-ui/app/elements/shared/gr-page-nav/gr-page-nav_test.html b/polygerrit-ui/app/elements/shared/gr-page-nav/gr-page-nav_test.html
index 7e426d7..428bab3 100644
--- a/polygerrit-ui/app/elements/shared/gr-page-nav/gr-page-nav_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-page-nav/gr-page-nav_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/shared/gr-placeholder/gr-placeholder.html b/polygerrit-ui/app/elements/shared/gr-placeholder/gr-placeholder.html
deleted file mode 100644
index 15f44cf..0000000
--- a/polygerrit-ui/app/elements/shared/gr-placeholder/gr-placeholder.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!--
-Copyright (C) 2017 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="../../../behaviors/base-url-behavior/base-url-behavior.html">
-<link rel="import" href="../../../bower_components/polymer/polymer.html">
-<link rel="import" href="../../../styles/shared-styles.html">
-
-<dom-module id="gr-placeholder">
-  <template>
-    <style include="shared-styles">
-      main {
-        margin: 2em auto;
-        max-width: 46em;
-      }
-      h1 {
-        margin-bottom: .1em;
-      }
-      @media only screen and (max-width: 67em) {
-        main {
-          margin: 2em 0 2em 15em;
-        }
-      }
-      @media only screen and (max-width: 53em) {
-        .loading {
-          padding: 0 var(--default-horizontal-margin);
-        }
-        main {
-          margin: 2em 1em;
-        }
-      }
-    </style>
-    <main>
-      <h1>[[title]]</h1>
-      <section>
-        This page is not yet implemented in PolyGerrit. View it in the
-        <a id="gwtLink" href$="[[computeGwtUrl(path)]]" rel="external">
-        Old UI</a>
-      </section>
-    </main>
-  </template>
-  <script src="gr-placeholder.js"></script>
-</dom-module>
diff --git a/polygerrit-ui/app/elements/shared/gr-placeholder/gr-placeholder.js b/polygerrit-ui/app/elements/shared/gr-placeholder/gr-placeholder.js
deleted file mode 100644
index 9b60061..0000000
--- a/polygerrit-ui/app/elements/shared/gr-placeholder/gr-placeholder.js
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (C) 2017 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-placeholder',
-
-    properties: {
-      path: String,
-      title: String,
-    },
-
-    behaviors: [
-      Gerrit.BaseUrlBehavior,
-    ],
-  });
-})();
diff --git a/polygerrit-ui/app/elements/shared/gr-repo-branch-picker/gr-repo-branch-picker.html b/polygerrit-ui/app/elements/shared/gr-repo-branch-picker/gr-repo-branch-picker.html
new file mode 100644
index 0000000..d794dd6
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-repo-branch-picker/gr-repo-branch-picker.html
@@ -0,0 +1,60 @@
+<!--
+@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="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../../bower_components/iron-icon/iron-icon.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../../../behaviors/gr-url-encoding-behavior/gr-url-encoding-behavior.html">
+<link rel="import" href="../../shared/gr-icons/gr-icons.html">
+<link rel="import" href="../../shared/gr-labeled-autocomplete/gr-labeled-autocomplete.html">
+<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
+
+<dom-module id="gr-repo-branch-picker">
+  <template>
+    <style include="shared-styles">
+      :host {
+        display: block;
+      }
+      gr-labeled-autocomplete,
+      iron-icon {
+        display: inline-block;
+      }
+      iron-icon {
+        margin-bottom: 1.2em;
+      }
+    </style>
+    <div>
+      <gr-labeled-autocomplete
+          id="repoInput"
+          label="Repository"
+          placeholder="Select repo"
+          on-commit="_repoCommitted"
+          query="[[_repoQuery]]">
+      </gr-labeled-autocomplete>
+      <iron-icon icon="gr-icons:chevron-right"></iron-icon>
+      <gr-labeled-autocomplete
+          id="branchInput"
+          label="Branch"
+          placeholder="Select branch"
+          disabled="[[_branchDisabled]]"
+          on-commit="_branchCommitted"
+          query="[[_query]]">
+      </gr-labeled-autocomplete>
+    </div>
+    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
+  </template>
+  <script src="gr-repo-branch-picker.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/shared/gr-repo-branch-picker/gr-repo-branch-picker.js b/polygerrit-ui/app/elements/shared/gr-repo-branch-picker/gr-repo-branch-picker.js
new file mode 100644
index 0000000..e2298c3
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-repo-branch-picker/gr-repo-branch-picker.js
@@ -0,0 +1,109 @@
+/**
+ * @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';
+
+  const SUGGESTIONS_LIMIT = 15;
+  const REF_PREFIX = 'refs/heads/';
+
+  Polymer({
+    is: 'gr-repo-branch-picker',
+
+    properties: {
+      repo: {
+        type: String,
+        notify: true,
+        observer: '_repoChanged',
+      },
+      branch: {
+        type: String,
+        notify: true,
+      },
+      _branchDisabled: Boolean,
+      _query: {
+        type: Function,
+        value() {
+          return this._getRepoBranchesSuggestions.bind(this);
+        },
+      },
+      _repoQuery: {
+        type: Function,
+        value() {
+          return this._getRepoSuggestions.bind(this);
+        },
+      },
+    },
+
+    behaviors: [
+      Gerrit.URLEncodingBehavior,
+    ],
+
+    attached() {
+      if (this.repo) {
+        this.$.repoInput.setText(this.repo);
+      }
+    },
+
+    ready() {
+      this._branchDisabled = !this.repo;
+    },
+
+    _getRepoBranchesSuggestions(input) {
+      if (!this.repo) { return Promise.resolve([]); }
+      if (input.startsWith(REF_PREFIX)) {
+        input = input.substring(REF_PREFIX.length);
+      }
+      return this.$.restAPI.getRepoBranches(input, this.repo, SUGGESTIONS_LIMIT)
+          .then(this._branchResponseToSuggestions.bind(this));
+    },
+
+    _getRepoSuggestions(input) {
+      return this.$.restAPI.getRepos(input, SUGGESTIONS_LIMIT)
+          .then(this._repoResponseToSuggestions.bind(this));
+    },
+
+    _repoResponseToSuggestions(res) {
+      return res.map(repo => ({
+        name: repo.name,
+        value: this.singleDecodeURL(repo.id),
+      }));
+    },
+
+    _branchResponseToSuggestions(res) {
+      return Object.keys(res).map(key => {
+        let branch = res[key].ref;
+        if (branch.startsWith(REF_PREFIX)) {
+          branch = branch.substring(REF_PREFIX.length);
+        }
+        return {name: branch, value: branch};
+      });
+    },
+
+    _repoCommitted(e) {
+      this.repo = e.detail.value;
+    },
+
+    _branchCommitted(e) {
+      this.branch = e.detail.value;
+    },
+
+    _repoChanged() {
+      this.$.branchInput.clear();
+      this._branchDisabled = !this.repo;
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/shared/gr-repo-branch-picker/gr-repo-branch-picker_test.html b/polygerrit-ui/app/elements/shared/gr-repo-branch-picker/gr-repo-branch-picker_test.html
new file mode 100644
index 0000000..989e838
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-repo-branch-picker/gr-repo-branch-picker_test.html
@@ -0,0 +1,140 @@
+<!DOCTYPE html>
+<!--
+@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.
+-->
+<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+<title>gr-repo-branch-picker</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-repo-branch-picker.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-repo-branch-picker></gr-repo-branch-picker>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-repo-branch-picker tests', () => {
+    let element;
+    let sandbox;
+
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+      element = fixture('basic');
+    });
+
+    teardown(() => { sandbox.restore(); });
+
+    suite('_getRepoSuggestions', () => {
+      setup(() => {
+        sandbox.stub(element.$.restAPI, 'getRepos')
+            .returns(Promise.resolve([
+              {
+                id: 'plugins%2Favatars-external',
+                name: 'plugins/avatars-external',
+              }, {
+                id: 'plugins%2Favatars-gravatar',
+                name: 'plugins/avatars-gravatar',
+              }, {
+                id: 'plugins%2Favatars%2Fexternal',
+                name: 'plugins/avatars/external',
+              }, {
+                id: 'plugins%2Favatars%2Fgravatar',
+                name: 'plugins/avatars/gravatar',
+              },
+            ]));
+      });
+
+      test('converts to suggestion objects', () => {
+        const input = 'plugins/avatars';
+        return element._getRepoSuggestions(input).then(suggestions => {
+          assert.isTrue(element.$.restAPI.getRepos.calledWith(input));
+          const unencodedNames = [
+            'plugins/avatars-external',
+            'plugins/avatars-gravatar',
+            'plugins/avatars/external',
+            'plugins/avatars/gravatar',
+          ];
+          assert.deepEqual(suggestions.map(s => s.name), unencodedNames);
+          assert.deepEqual(suggestions.map(s => s.value), unencodedNames);
+        });
+      });
+    });
+
+    suite('_getRepoBranchesSuggestions', () => {
+      setup(() => {
+        sandbox.stub(element.$.restAPI, 'getRepoBranches')
+            .returns(Promise.resolve([
+              {ref: 'refs/heads/stable-2.10'},
+              {ref: 'refs/heads/stable-2.11'},
+              {ref: 'refs/heads/stable-2.12'},
+              {ref: 'refs/heads/stable-2.13'},
+              {ref: 'refs/heads/stable-2.14'},
+              {ref: 'refs/heads/stable-2.15'},
+            ]));
+      });
+
+      test('converts to suggestion objects', () => {
+        const repo = 'gerrit';
+        const branchInput = 'stable-2.1';
+        element.repo = repo;
+        return element._getRepoBranchesSuggestions(branchInput)
+            .then(suggestions => {
+              assert.isTrue(element.$.restAPI.getRepoBranches.calledWith(
+                  branchInput, repo, 15));
+              const refNames = [
+                'stable-2.10',
+                'stable-2.11',
+                'stable-2.12',
+                'stable-2.13',
+                'stable-2.14',
+                'stable-2.15',
+              ];
+              assert.deepEqual(suggestions.map(s => s.name), refNames);
+              assert.deepEqual(suggestions.map(s => s.value), refNames);
+            });
+      });
+
+      test('filters out ref prefix', () => {
+        const repo = 'gerrit';
+        const branchInput = 'refs/heads/stable-2.1';
+        element.repo = repo;
+        return element._getRepoBranchesSuggestions(branchInput)
+            .then(suggestions => {
+              assert.isTrue(element.$.restAPI.getRepoBranches.calledWith(
+                  'stable-2.1', repo, 15));
+            });
+      });
+
+      test('does not query when repo is unset', () => {
+        return element._getRepoBranchesSuggestions('')
+            .then(() => {
+              assert.isFalse(element.$.restAPI.getRepoBranches.called);
+              element.repo = 'gerrit';
+              return element._getRepoBranchesSuggestions('');
+            })
+            .then(() => {
+              assert.isTrue(element.$.restAPI.getRepoBranches.called);
+            });
+      });
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-auth.js b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-auth.js
index 4179b46..43e3922 100644
--- a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-auth.js
+++ b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-auth.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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(window) {
   'use strict';
 
diff --git a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-auth_test.html b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-auth_test.html
index c254e62..a571be9 100644
--- a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-auth_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-auth_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-etag-decorator.html b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-etag-decorator.html
index d0306b8..c5a0dfe 100644
--- a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-etag-decorator.html
+++ b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-etag-decorator.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-etag-decorator.js b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-etag-decorator.js
index 3570081..f72c7cc 100644
--- a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-etag-decorator.js
+++ b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-etag-decorator.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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(window) {
   'use strict';
 
diff --git a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-etag-decorator_test.html b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-etag-decorator_test.html
index 77edae7..09ae1da 100644
--- a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-etag-decorator_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-etag-decorator_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.html b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.html
index 5afed95..562980c 100644
--- a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.html
+++ b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,6 +17,7 @@
 
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
 <link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
+<link rel="import" href="../../../behaviors/gr-patch-set-behavior/gr-patch-set-behavior.html">
 <link rel="import" href="../../../behaviors/gr-path-list-behavior/gr-path-list-behavior.html">
 <link rel="import" href="../../../behaviors/rest-client-behavior/rest-client-behavior.html">
 <link rel="import" href="gr-etag-decorator.html">
diff --git a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.js b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.js
index 09a2962..09eff80 100644
--- a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.js
+++ b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.js
@@ -1,19 +1,118 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
+  const Defs = {};
+
+  /**
+   * @typedef {{
+   *    basePatchNum: (string|number),
+   *    patchNum: (number),
+   * }}
+   */
+  Defs.patchRange;
+
+  /**
+   * @typedef {{
+   *    url: string,
+   *    fetchOptions: (Object|null|undefined),
+   *    anonymizedUrl: (string|undefined),
+   * }}
+   */
+  Defs.FetchRequest;
+
+  /**
+   * Object to describe a request for passing into _fetchJSON or _fetchRawJSON.
+   * - url is the URL for the request (excluding get params)
+   * - errFn is a function to invoke when the request fails.
+   * - cancelCondition is a function that, if provided and returns true, will
+   *     cancel the response after it resolves.
+   * - params is a key-value hash to specify get params for the request URL.
+   * @typedef {{
+   *    url: string,
+   *    errFn: (function(?Response, string=)|null|undefined),
+   *    cancelCondition: (function()|null|undefined),
+   *    params: (Object|null|undefined),
+   *    fetchOptions: (Object|null|undefined),
+   *    anonymizedUrl: (string|undefined),
+   *    reportUrlAsIs: (boolean|undefined),
+   * }}
+   */
+  Defs.FetchJSONRequest;
+
+  /**
+   * @typedef {{
+   *   changeNum: (string|number),
+   *   endpoint: string,
+   *   patchNum: (string|number|null|undefined),
+   *   errFn: (function(?Response, string=)|null|undefined),
+   *   params: (Object|null|undefined),
+   *   fetchOptions: (Object|null|undefined),
+   *   anonymizedEndpoint: (string|undefined),
+   *   reportEndpointAsIs: (boolean|undefined),
+   * }}
+   */
+  Defs.ChangeFetchRequest;
+
+  /**
+   * Object to describe a request for passing into _send.
+   * - method is the HTTP method to use in the request.
+   * - url is the URL for the request
+   * - body is a request payload.
+   *     TODO (beckysiegel) remove need for number at least.
+   * - errFn is a function to invoke when the request fails.
+   * - cancelCondition is a function that, if provided and returns true, will
+   *   cancel the response after it resolves.
+   * - contentType is the content type of the body.
+   * - headers is a key-value hash to describe HTTP headers for the request.
+   * - parseResponse states whether the result should be parsed as a JSON
+   *     object using getResponseObject.
+   * @typedef {{
+   *   method: string,
+   *   url: string,
+   *   body: (string|number|Object|null|undefined),
+   *   errFn: (function(?Response, string=)|null|undefined),
+   *   contentType: (string|null|undefined),
+   *   headers: (Object|undefined),
+   *   parseResponse: (boolean|undefined),
+   *   anonymizedUrl: (string|undefined),
+   *   reportUrlAsIs: (boolean|undefined),
+   * }}
+   */
+  Defs.SendRequest;
+
+  /**
+   * @typedef {{
+   *   changeNum: (string|number),
+   *   method: string,
+   *   patchNum: (string|number|undefined),
+   *   endpoint: string,
+   *   body: (string|number|Object|null|undefined),
+   *   errFn: (function(?Response, string=)|null|undefined),
+   *   contentType: (string|null|undefined),
+   *   headers: (Object|undefined),
+   *   parseResponse: (boolean|undefined),
+   *   anonymizedEndpoint: (string|undefined),
+   *   reportEndpointAsIs: (boolean|undefined),
+   * }}
+   */
+  Defs.ChangeSendRequest;
+
   const DiffViewMode = {
     SIDE_BY_SIDE: 'SIDE_BY_SIDE',
     UNIFIED: 'UNIFIED_DIFF',
@@ -22,8 +121,6 @@
   const MAX_PROJECT_RESULTS = 25;
   const MAX_UNIFIED_DEFAULT_WINDOW_WIDTH_PX = 900;
   const PARENT_PATCH_NUM = 'PARENT';
-  const CHECK_SIGN_IN_DEBOUNCE_MS = 3 * 1000;
-  const CHECK_SIGN_IN_DEBOUNCER_NAME = 'checkCredentials';
   const FAILED_TO_FETCH_ERROR = 'Failed to fetch';
 
   const Requests = {
@@ -34,12 +131,62 @@
       'Saving draft resulted in HTTP 200 (OK) but expected HTTP 201 (Created)';
   const HEADER_REPORTING_BLACKLIST = /^set-cookie$/i;
 
+  const ANONYMIZED_CHANGE_BASE_URL = '/changes/*~*';
+  const ANONYMIZED_REVISION_BASE_URL = ANONYMIZED_CHANGE_BASE_URL +
+      '/revisions/*';
+
+  /**
+   * Wrapper around Map for caching server responses. Site-based so that
+   * changes to CANONICAL_PATH will result in a different cache going into
+   * effect.
+   */
+  class SiteBasedCache {
+    constructor() {
+      // Container of per-canonical-path caches.
+      this._data = new Map();
+    }
+
+    // Returns the cache for the current canonical path.
+    _cache() {
+      if (!this._data.has(window.CANONICAL_PATH)) {
+        this._data.set(window.CANONICAL_PATH, new Map());
+      }
+      return this._data.get(window.CANONICAL_PATH);
+    }
+
+    has(key) {
+      return this._cache().has(key);
+    }
+
+    get(key) {
+      return this._cache().get(key);
+    }
+
+    set(key, value) {
+      this._cache().set(key, value);
+    }
+
+    delete(key) {
+      this._cache().delete(key);
+    }
+
+    invalidatePrefix(prefix) {
+      const newMap = new Map();
+      for (const [key, value] of this._cache().entries()) {
+        if (!key.startsWith(prefix)) {
+          newMap.set(key, value);
+        }
+      }
+      this._data.set(window.CANONICAL_PATH, newMap);
+    }
+  }
 
   Polymer({
     is: 'gr-rest-api-interface',
 
     behaviors: [
       Gerrit.PathListBehavior,
+      Gerrit.PatchSetBehavior,
       Gerrit.RESTClientBehavior,
     ],
 
@@ -61,10 +208,20 @@
      * @event auth-error
      */
 
+    /**
+     * Fired after an RPC completes.
+     *
+     * @event rpc-log
+     */
+
     properties: {
       _cache: {
         type: Object,
-        value: {}, // Intentional to share the object across instances.
+        value: new SiteBasedCache(), // Shared across instances.
+      },
+      _credentialCheck: {
+        type: Object,
+        value: {checking: false}, // Shared across instances.
       },
       _sharedFetchPromises: {
         type: Object,
@@ -94,39 +251,76 @@
     JSON_PREFIX,
 
     /**
+     * Wraps calls to the underlying authenticated fetch function (_auth.fetch)
+     * with timing and logging.
+     * @param {Defs.FetchRequest} req
+     */
+    _fetch(req) {
+      const start = Date.now();
+      const xhr = this._auth.fetch(req.url, req.fetchOptions);
+
+      // Log the call after it completes.
+      xhr.then(res => this._logCall(req, start, res.status));
+
+      // Return the XHR directly (without the log).
+      return xhr;
+    },
+
+    /**
+     * Log information about a REST call. Because the elapsed time is determined
+     * by this method, it should be called immediately after the request
+     * finishes.
+     * @param {Defs.FetchRequest} req
+     * @param {number} startTime the time that the request was started.
+     * @param {number} status the HTTP status of the response. The status value
+     *     is used here rather than the response object so there is no way this
+     *     method can read the body stream.
+     */
+    _logCall(req, startTime, status) {
+      const method = (req.fetchOptions && req.fetchOptions.method) ?
+          req.fetchOptions.method : 'GET';
+      const elapsed = (Date.now() - startTime);
+      console.log([
+        'HTTP',
+        status,
+        method,
+        elapsed + 'ms',
+        req.anonymizedUrl || req.url,
+      ].join(' '));
+      if (req.anonymizedUrl) {
+        this.fire('rpc-log',
+            {status, method, elapsed, anonymizedUrl: req.anonymizedUrl});
+      }
+    },
+
+    /**
      * Fetch JSON from url provided.
      * Returns a Promise that resolves to a native Response.
      * Doesn't do error checking. Supports cancel condition. Performs auth.
      * Validates auth expiry errors.
-     * @param {string} url
-     * @param {?function(?Response, string=)=} opt_errFn
-     *    passed as null sometimes.
-     * @param {?function()=} opt_cancelCondition
-     *    passed as null sometimes.
-     * @param {?Object=} opt_params URL params, key-value hash.
-     * @param {?Object=} opt_options Fetch options.
+     * @param {Defs.FetchJSONRequest} req
      */
-    _fetchRawJSON(url, opt_errFn, opt_cancelCondition, opt_params,
-        opt_options) {
-      const urlWithParams = this._urlWithParams(url, opt_params);
-      return this._auth.fetch(urlWithParams, opt_options).then(response => {
-        if (opt_cancelCondition && opt_cancelCondition()) {
-          response.body.cancel();
+    _fetchRawJSON(req) {
+      const urlWithParams = this._urlWithParams(req.url, req.params);
+      const fetchReq = {
+        url: urlWithParams,
+        fetchOptions: req.fetchOptions,
+        anonymizedUrl: req.reportUrlAsIs ? urlWithParams : req.anonymizedUrl,
+      };
+      return this._fetch(fetchReq).then(res => {
+        if (req.cancelCondition && req.cancelCondition()) {
+          res.body.cancel();
           return;
         }
-        return response;
+        return res;
       }).catch(err => {
-        const isLoggedIn = !!this._cache['/accounts/self/detail'];
+        const isLoggedIn = !!this._cache.get('/accounts/self/detail');
         if (isLoggedIn && err && err.message === FAILED_TO_FETCH_ERROR) {
-          if (!this.isDebouncerActive(CHECK_SIGN_IN_DEBOUNCER_NAME)) {
-            this.checkCredentials();
-          }
-          this.debounce(CHECK_SIGN_IN_DEBOUNCER_NAME, this.checkCredentials,
-              CHECK_SIGN_IN_DEBOUNCE_MS);
+          this.checkCredentials();
           return;
         }
-        if (opt_errFn) {
-          opt_errFn.call(undefined, null, err);
+        if (req.errFn) {
+          req.errFn.call(undefined, null, err);
         } else {
           this.fire('network-error', {error: err});
         }
@@ -138,31 +332,23 @@
      * Fetch JSON from url provided.
      * Returns a Promise that resolves to a parsed response.
      * Same as {@link _fetchRawJSON}, plus error handling.
-     * @param {string} url
-     * @param {?function(?Response, string=)=} opt_errFn
-     *    passed as null sometimes.
-     * @param {?function()=} opt_cancelCondition
-     *    passed as null sometimes.
-     * @param {?Object=} opt_params URL params, key-value hash.
-     * @param {?Object=} opt_options Fetch options.
+     * @param {Defs.FetchJSONRequest} req
      */
-    fetchJSON(url, opt_errFn, opt_cancelCondition, opt_params, opt_options) {
-      return this._fetchRawJSON(
-          url, opt_errFn, opt_cancelCondition, opt_params, opt_options)
-          .then(response => {
-            if (!response) {
-              return;
-            }
-            if (!response.ok) {
-              if (opt_errFn) {
-                opt_errFn.call(null, response);
-                return;
-              }
-              this.fire('server-error', {response});
-              return;
-            }
-            return response && this.getResponseObject(response);
-          });
+    _fetchJSON(req) {
+      return this._fetchRawJSON(req).then(response => {
+        if (!response) {
+          return;
+        }
+        if (!response.ok) {
+          if (req.errFn) {
+            req.errFn.call(null, response);
+            return;
+          }
+          this.fire('server-error', {request: req, response});
+          return;
+        }
+        return response && this.getResponseObject(response);
+      });
     },
 
     /**
@@ -220,101 +406,166 @@
       return JSON.parse(source.substring(JSON_PREFIX.length));
     },
 
-    getConfig() {
-      return this._fetchSharedCacheURL('/config/server/info');
-    },
-
-    getProject(project) {
-      return this._fetchSharedCacheURL(
-          '/projects/' + encodeURIComponent(project));
-    },
-
-    getProjectConfig(project) {
-      return this._fetchSharedCacheURL(
-          '/projects/' + encodeURIComponent(project) + '/config');
-    },
-
-    getProjectAccess(project) {
-      return this._fetchSharedCacheURL(
-          '/access/?project=' + encodeURIComponent(project));
-    },
-
-    saveProjectConfig(project, config, opt_errFn, opt_ctx) {
-      const encodeName = encodeURIComponent(project);
-      return this.send('PUT', `/projects/${encodeName}/config`, config,
-          opt_errFn, opt_ctx);
-    },
-
-    runProjectGC(project, opt_errFn, opt_ctx) {
-      if (!project) {
-        return '';
+    getConfig(noCache) {
+      if (!noCache) {
+        return this._fetchSharedCacheURL({
+          url: '/config/server/info',
+          reportUrlAsIs: true,
+        });
       }
-      const encodeName = encodeURIComponent(project);
-      return this.send('POST', `/projects/${encodeName}/gc`, '',
-          opt_errFn, opt_ctx);
+
+      return this._fetchJSON({
+        url: '/config/server/info',
+        reportUrlAsIs: true,
+      });
+    },
+
+    getRepo(repo, opt_errFn) {
+      // TODO(kaspern): Rename rest api from /projects/ to /repos/ once backend
+      // supports it.
+      return this._fetchSharedCacheURL({
+        url: '/projects/' + encodeURIComponent(repo),
+        errFn: opt_errFn,
+        anonymizedUrl: '/projects/*',
+      });
+    },
+
+    getProjectConfig(repo, opt_errFn) {
+      // TODO(kaspern): Rename rest api from /projects/ to /repos/ once backend
+      // supports it.
+      return this._fetchSharedCacheURL({
+        url: '/projects/' + encodeURIComponent(repo) + '/config',
+        errFn: opt_errFn,
+        anonymizedUrl: '/projects/*/config',
+      });
+    },
+
+    getRepoAccess(repo) {
+      // TODO(kaspern): Rename rest api from /projects/ to /repos/ once backend
+      // supports it.
+      return this._fetchSharedCacheURL({
+        url: '/access/?project=' + encodeURIComponent(repo),
+        anonymizedUrl: '/access/?project=*',
+      });
+    },
+
+    getRepoDashboards(repo, opt_errFn) {
+      // TODO(kaspern): Rename rest api from /projects/ to /repos/ once backend
+      // supports it.
+      return this._fetchSharedCacheURL({
+        url: `/projects/${encodeURIComponent(repo)}/dashboards?inherited`,
+        errFn: opt_errFn,
+        anonymizedUrl: '/projects/*/dashboards?inherited',
+      });
+    },
+
+    saveRepoConfig(repo, config, opt_errFn) {
+      // TODO(kaspern): Rename rest api from /projects/ to /repos/ once backend
+      // supports it.
+      const encodeName = encodeURIComponent(repo);
+      return this._send({
+        method: 'PUT',
+        url: `/projects/${encodeName}/config`,
+        body: config,
+        errFn: opt_errFn,
+        anonymizedUrl: '/projects/*/config',
+      });
+    },
+
+    runRepoGC(repo, opt_errFn) {
+      if (!repo) { return ''; }
+      // TODO(kaspern): Rename rest api from /projects/ to /repos/ once backend
+      // supports it.
+      const encodeName = encodeURIComponent(repo);
+      return this._send({
+        method: 'POST',
+        url: `/projects/${encodeName}/gc`,
+        body: '',
+        errFn: opt_errFn,
+        anonymizedUrl: '/projects/*/gc',
+      });
     },
 
     /**
      * @param {?Object} config
      * @param {function(?Response, string=)=} opt_errFn
-     * @param {?=} opt_ctx
      */
-    createProject(config, opt_errFn, opt_ctx) {
+    createRepo(config, opt_errFn) {
       if (!config.name) { return ''; }
+      // TODO(kaspern): Rename rest api from /projects/ to /repos/ once backend
+      // supports it.
       const encodeName = encodeURIComponent(config.name);
-      return this.send('PUT', `/projects/${encodeName}`, config, opt_errFn,
-          opt_ctx);
+      return this._send({
+        method: 'PUT',
+        url: `/projects/${encodeName}`,
+        body: config,
+        errFn: opt_errFn,
+        anonymizedUrl: '/projects/*',
+      });
     },
 
     /**
      * @param {?Object} config
      * @param {function(?Response, string=)=} opt_errFn
-     * @param {?=} opt_ctx
      */
-    createGroup(config, opt_errFn, opt_ctx) {
+    createGroup(config, opt_errFn) {
       if (!config.name) { return ''; }
       const encodeName = encodeURIComponent(config.name);
-      return this.send('PUT', `/groups/${encodeName}`, config, opt_errFn,
-          opt_ctx);
+      return this._send({
+        method: 'PUT',
+        url: `/groups/${encodeName}`,
+        body: config,
+        errFn: opt_errFn,
+        anonymizedUrl: '/groups/*',
+      });
     },
 
-    getGroupConfig(group) {
-      const encodeName = encodeURIComponent(group);
-      return this.fetchJSON(`/groups/${encodeName}/detail`);
+    getGroupConfig(group, opt_errFn) {
+      return this._fetchJSON({
+        url: `/groups/${encodeURIComponent(group)}/detail`,
+        errFn: opt_errFn,
+        anonymizedUrl: '/groups/*/detail',
+      });
     },
 
     /**
-     * @param {string} project
+     * @param {string} repo
      * @param {string} ref
      * @param {function(?Response, string=)=} opt_errFn
-     * @param {?=} opt_ctx
      */
-    deleteProjectBranches(project, ref, opt_errFn, opt_ctx) {
-      if (!project || !ref) {
-        return '';
-      }
-      const encodeName = encodeURIComponent(project);
+    deleteRepoBranches(repo, ref, opt_errFn) {
+      if (!repo || !ref) { return ''; }
+      // TODO(kaspern): Rename rest api from /projects/ to /repos/ once backend
+      // supports it.
+      const encodeName = encodeURIComponent(repo);
       const encodeRef = encodeURIComponent(ref);
-      return this.send('DELETE',
-          `/projects/${encodeName}/branches/${encodeRef}`, '',
-          opt_errFn, opt_ctx);
+      return this._send({
+        method: 'DELETE',
+        url: `/projects/${encodeName}/branches/${encodeRef}`,
+        body: '',
+        errFn: opt_errFn,
+        anonymizedUrl: '/projects/*/branches/*',
+      });
     },
 
     /**
-     * @param {string} project
+     * @param {string} repo
      * @param {string} ref
      * @param {function(?Response, string=)=} opt_errFn
-     * @param {?=} opt_ctx
      */
-    deleteProjectTags(project, ref, opt_errFn, opt_ctx) {
-      if (!project || !ref) {
-        return '';
-      }
-      const encodeName = encodeURIComponent(project);
+    deleteRepoTags(repo, ref, opt_errFn) {
+      if (!repo || !ref) { return ''; }
+      // TODO(kaspern): Rename rest api from /projects/ to /repos/ once backend
+      // supports it.
+      const encodeName = encodeURIComponent(repo);
       const encodeRef = encodeURIComponent(ref);
-      return this.send('DELETE',
-          `/projects/${encodeName}/tags/${encodeRef}`, '',
-          opt_errFn, opt_ctx);
+      return this._send({
+        method: 'DELETE',
+        url: `/projects/${encodeName}/tags/${encodeRef}`,
+        body: '',
+        errFn: opt_errFn,
+        anonymizedUrl: '/projects/*/tags/*',
+      });
     },
 
     /**
@@ -322,15 +573,20 @@
      * @param {string} branch
      * @param {string} revision
      * @param {function(?Response, string=)=} opt_errFn
-     * @param {?=} opt_ctx
      */
-    createProjectBranch(name, branch, revision, opt_errFn, opt_ctx) {
+    createRepoBranch(name, branch, revision, opt_errFn) {
       if (!name || !branch || !revision) { return ''; }
+      // TODO(kaspern): Rename rest api from /projects/ to /repos/ once backend
+      // supports it.
       const encodeName = encodeURIComponent(name);
       const encodeBranch = encodeURIComponent(branch);
-      return this.send('PUT',
-          `/projects/${encodeName}/branches/${encodeBranch}`,
-          revision, opt_errFn, opt_ctx);
+      return this._send({
+        method: 'PUT',
+        url: `/projects/${encodeName}/branches/${encodeBranch}`,
+        body: revision,
+        errFn: opt_errFn,
+        anonymizedUrl: '/projects/*/branches/*',
+      });
     },
 
     /**
@@ -338,14 +594,20 @@
      * @param {string} tag
      * @param {string} revision
      * @param {function(?Response, string=)=} opt_errFn
-     * @param {?=} opt_ctx
      */
-    createProjectTag(name, tag, revision, opt_errFn, opt_ctx) {
+    createRepoTag(name, tag, revision, opt_errFn) {
       if (!name || !tag || !revision) { return ''; }
+      // TODO(kaspern): Rename rest api from /projects/ to /repos/ once backend
+      // supports it.
       const encodeName = encodeURIComponent(name);
       const encodeTag = encodeURIComponent(tag);
-      return this.send('PUT', `/projects/${encodeName}/tags/${encodeTag}`,
-          revision, opt_errFn, opt_ctx);
+      return this._send({
+        method: 'PUT',
+        url: `/projects/${encodeName}/tags/${encodeTag}`,
+        body: revision,
+        errFn: opt_errFn,
+        anonymizedUrl: '/projects/*/tags/*',
+      });
     },
 
     /**
@@ -354,91 +616,142 @@
      */
     getIsGroupOwner(groupName) {
       const encodeName = encodeURIComponent(groupName);
-      return this._fetchSharedCacheURL(`/groups/?owned&q=${encodeName}`)
+      const req = {
+        url: `/groups/?owned&q=${encodeName}`,
+        anonymizedUrl: '/groups/owned&q=*',
+      };
+      return this._fetchSharedCacheURL(req)
           .then(configs => configs.hasOwnProperty(groupName));
     },
 
-    getGroupMembers(groupName) {
+    getGroupMembers(groupName, opt_errFn) {
       const encodeName = encodeURIComponent(groupName);
-      return this.send('GET', `/groups/${encodeName}/members/`)
-          .then(response => this.getResponseObject(response));
+      return this._fetchJSON({
+        url: `/groups/${encodeName}/members/`,
+        errFn: opt_errFn,
+        anonymizedUrl: '/groups/*/members',
+      });
     },
 
     getIncludedGroup(groupName) {
-      const encodeName = encodeURIComponent(groupName);
-      return this.send('GET', `/groups/${encodeName}/groups/`)
-          .then(response => this.getResponseObject(response));
+      return this._fetchJSON({
+        url: `/groups/${encodeURIComponent(groupName)}/groups/`,
+        anonymizedUrl: '/groups/*/groups',
+      });
     },
 
     saveGroupName(groupId, name) {
       const encodeId = encodeURIComponent(groupId);
-      return this.send('PUT', `/groups/${encodeId}/name`, {name});
+      return this._send({
+        method: 'PUT',
+        url: `/groups/${encodeId}/name`,
+        body: {name},
+        anonymizedUrl: '/groups/*/name',
+      });
     },
 
     saveGroupOwner(groupId, ownerId) {
       const encodeId = encodeURIComponent(groupId);
-      return this.send('PUT', `/groups/${encodeId}/owner`, {owner: ownerId});
+      return this._send({
+        method: 'PUT',
+        url: `/groups/${encodeId}/owner`,
+        body: {owner: ownerId},
+        anonymizedUrl: '/groups/*/owner',
+      });
     },
 
     saveGroupDescription(groupId, description) {
       const encodeId = encodeURIComponent(groupId);
-      return this.send('PUT', `/groups/${encodeId}/description`,
-          {description});
+      return this._send({
+        method: 'PUT',
+        url: `/groups/${encodeId}/description`,
+        body: {description},
+        anonymizedUrl: '/groups/*/description',
+      });
     },
 
     saveGroupOptions(groupId, options) {
       const encodeId = encodeURIComponent(groupId);
-      return this.send('PUT', `/groups/${encodeId}/options`, options);
+      return this._send({
+        method: 'PUT',
+        url: `/groups/${encodeId}/options`,
+        body: options,
+        anonymizedUrl: '/groups/*/options',
+      });
     },
 
-    getGroupAuditLog(group) {
-      return this._fetchSharedCacheURL('/groups/' + group + '/log.audit');
+    getGroupAuditLog(group, opt_errFn) {
+      return this._fetchSharedCacheURL({
+        url: '/groups/' + group + '/log.audit',
+        errFn: opt_errFn,
+        anonymizedUrl: '/groups/*/log.audit',
+      });
     },
 
     saveGroupMembers(groupName, groupMembers) {
       const encodeName = encodeURIComponent(groupName);
       const encodeMember = encodeURIComponent(groupMembers);
-      return this.send('PUT', `/groups/${encodeName}/members/${encodeMember}`)
-          .then(response => this.getResponseObject(response));
+      return this._send({
+        method: 'PUT',
+        url: `/groups/${encodeName}/members/${encodeMember}`,
+        parseResponse: true,
+        anonymizedUrl: '/groups/*/members/*',
+      });
     },
 
     saveIncludedGroup(groupName, includedGroup, opt_errFn) {
       const encodeName = encodeURIComponent(groupName);
       const encodeIncludedGroup = encodeURIComponent(includedGroup);
-      return this.send('PUT',
-          `/groups/${encodeName}/groups/${encodeIncludedGroup}`, null,
-          opt_errFn).then(response => {
-            if (response.ok) {
-              return this.getResponseObject(response);
-            }
-          });
+      const req = {
+        method: 'PUT',
+        url: `/groups/${encodeName}/groups/${encodeIncludedGroup}`,
+        errFn: opt_errFn,
+        anonymizedUrl: '/groups/*/groups/*',
+      };
+      return this._send(req).then(response => {
+        if (response.ok) {
+          return this.getResponseObject(response);
+        }
+      });
     },
 
     deleteGroupMembers(groupName, groupMembers) {
       const encodeName = encodeURIComponent(groupName);
       const encodeMember = encodeURIComponent(groupMembers);
-      return this.send('DELETE',
-          `/groups/${encodeName}/members/${encodeMember}`);
+      return this._send({
+        method: 'DELETE',
+        url: `/groups/${encodeName}/members/${encodeMember}`,
+        anonymizedUrl: '/groups/*/members/*',
+      });
     },
 
     deleteIncludedGroup(groupName, includedGroup) {
       const encodeName = encodeURIComponent(groupName);
       const encodeIncludedGroup = encodeURIComponent(includedGroup);
-      return this.send('DELETE',
-          `/groups/${encodeName}/groups/${encodeIncludedGroup}`);
+      return this._send({
+        method: 'DELETE',
+        url: `/groups/${encodeName}/groups/${encodeIncludedGroup}`,
+        anonymizedUrl: '/groups/*/groups/*',
+      });
     },
 
     getVersion() {
-      return this._fetchSharedCacheURL('/config/server/version');
+      return this._fetchSharedCacheURL({
+        url: '/config/server/version',
+        reportUrlAsIs: true,
+      });
     },
 
     getDiffPreferences() {
       return this.getLoggedIn().then(loggedIn => {
         if (loggedIn) {
-          return this._fetchSharedCacheURL('/accounts/self/preferences.diff');
+          return this._fetchSharedCacheURL({
+            url: '/accounts/self/preferences.diff',
+            reportUrlAsIs: true,
+          });
         }
         // These defaults should match the defaults in
-        // gerrit-extension-api/src/main/jcg/gerrit/extensions/client/DiffPreferencesInfo.java
+        // java/com/google/gerrit/extensions/client/DiffPreferencesInfo.java
         // NOTE: There are some settings that don't apply to PolyGerrit
         // (Render mode being at least one of them).
         return Promise.resolve({
@@ -460,39 +773,127 @@
       });
     },
 
+    getEditPreferences() {
+      return this.getLoggedIn().then(loggedIn => {
+        if (loggedIn) {
+          return this._fetchSharedCacheURL({
+            url: '/accounts/self/preferences.edit',
+            reportUrlAsIs: true,
+          });
+        }
+        // These defaults should match the defaults in
+        // java/com/google/gerrit/extensions/client/EditPreferencesInfo.java
+        return Promise.resolve({
+          auto_close_brackets: false,
+          cursor_blink_rate: 0,
+          hide_line_numbers: false,
+          hide_top_menu: false,
+          indent_unit: 2,
+          indent_with_tabs: false,
+          key_map_type: 'DEFAULT',
+          line_length: 100,
+          line_wrapping: false,
+          match_brackets: true,
+          show_base: false,
+          show_tabs: true,
+          show_whitespace_errors: true,
+          syntax_highlighting: true,
+          tab_size: 8,
+          theme: 'DEFAULT',
+        });
+      });
+    },
+
     /**
      * @param {?Object} prefs
      * @param {function(?Response, string=)=} opt_errFn
-     * @param {?=} opt_ctx
      */
-    savePreferences(prefs, opt_errFn, opt_ctx) {
+    savePreferences(prefs, opt_errFn) {
       // Note (Issue 5142): normalize the download scheme with lower case before
       // saving.
       if (prefs.download_scheme) {
         prefs.download_scheme = prefs.download_scheme.toLowerCase();
       }
 
-      return this.send('PUT', '/accounts/self/preferences', prefs, opt_errFn,
-          opt_ctx);
+      return this._send({
+        method: 'PUT',
+        url: '/accounts/self/preferences',
+        body: prefs,
+        errFn: opt_errFn,
+        reportUrlAsIs: true,
+      });
     },
 
     /**
      * @param {?Object} prefs
      * @param {function(?Response, string=)=} opt_errFn
-     * @param {?=} opt_ctx
      */
-    saveDiffPreferences(prefs, opt_errFn, opt_ctx) {
+    saveDiffPreferences(prefs, opt_errFn) {
       // Invalidate the cache.
-      this._cache['/accounts/self/preferences.diff'] = undefined;
-      return this.send('PUT', '/accounts/self/preferences.diff', prefs,
-          opt_errFn, opt_ctx);
+      this._cache.delete('/accounts/self/preferences.diff');
+      return this._send({
+        method: 'PUT',
+        url: '/accounts/self/preferences.diff',
+        body: prefs,
+        errFn: opt_errFn,
+        reportUrlAsIs: true,
+      });
+    },
+
+    /**
+     * @param {?Object} prefs
+     * @param {function(?Response, string=)=} opt_errFn
+     */
+    saveEditPreferences(prefs, opt_errFn) {
+      // Invalidate the cache.
+      this._cache.delete('/accounts/self/preferences.edit');
+      return this._send({
+        method: 'PUT',
+        url: '/accounts/self/preferences.edit',
+        body: prefs,
+        errFn: opt_errFn,
+        reportUrlAsIs: true,
+      });
     },
 
     getAccount() {
-      return this._fetchSharedCacheURL('/accounts/self/detail', resp => {
-        if (resp.status === 403) {
-          this._cache['/accounts/self/detail'] = null;
-        }
+      return this._fetchSharedCacheURL({
+        url: '/accounts/self/detail',
+        reportUrlAsIs: true,
+        errFn: resp => {
+          if (!resp || resp.status === 403) {
+            this._cache.delete('/accounts/self/detail');
+          }
+        },
+      });
+    },
+
+    getAvatarChangeUrl() {
+      return this._fetchSharedCacheURL({
+        url: '/accounts/self/avatar.change.url',
+        reportUrlAsIs: true,
+        errFn: resp => {
+          if (!resp || resp.status === 403) {
+            this._cache.delete('/accounts/self/avatar.change.url');
+          }
+        },
+      });
+    },
+
+    getExternalIds() {
+      return this._fetchJSON({
+        url: '/accounts/self/external.ids',
+        reportUrlAsIs: true,
+      });
+    },
+
+    deleteAccountIdentity(id) {
+      return this._send({
+        method: 'POST',
+        url: '/accounts/self/external.ids:delete',
+        body: id,
+        parseResponse: true,
+        reportUrlAsIs: true,
       });
     },
 
@@ -501,56 +902,72 @@
      * @return {!Promise<!Object>}
      */
     getAccountDetails(userId) {
-      return this.fetchJSON(`/accounts/${encodeURIComponent(userId)}/detail`);
+      return this._fetchJSON({
+        url: `/accounts/${encodeURIComponent(userId)}/detail`,
+        anonymizedUrl: '/accounts/*/detail',
+      });
     },
 
     getAccountEmails() {
-      return this._fetchSharedCacheURL('/accounts/self/emails');
+      return this._fetchSharedCacheURL({
+        url: '/accounts/self/emails',
+        reportUrlAsIs: true,
+      });
     },
 
     /**
      * @param {string} email
      * @param {function(?Response, string=)=} opt_errFn
-     * @param {?=} opt_ctx
      */
-    addAccountEmail(email, opt_errFn, opt_ctx) {
-      return this.send('PUT', '/accounts/self/emails/' +
-          encodeURIComponent(email), null, opt_errFn, opt_ctx);
+    addAccountEmail(email, opt_errFn) {
+      return this._send({
+        method: 'PUT',
+        url: '/accounts/self/emails/' + encodeURIComponent(email),
+        errFn: opt_errFn,
+        anonymizedUrl: '/account/self/emails/*',
+      });
     },
 
     /**
      * @param {string} email
      * @param {function(?Response, string=)=} opt_errFn
-     * @param {?=} opt_ctx
      */
-    deleteAccountEmail(email, opt_errFn, opt_ctx) {
-      return this.send('DELETE', '/accounts/self/emails/' +
-          encodeURIComponent(email), null, opt_errFn, opt_ctx);
+    deleteAccountEmail(email, opt_errFn) {
+      return this._send({
+        method: 'DELETE',
+        url: '/accounts/self/emails/' + encodeURIComponent(email),
+        errFn: opt_errFn,
+        anonymizedUrl: '/accounts/self/email/*',
+      });
     },
 
     /**
      * @param {string} email
      * @param {function(?Response, string=)=} opt_errFn
-     * @param {?=} opt_ctx
      */
-    setPreferredAccountEmail(email, opt_errFn, opt_ctx) {
-      return this.send('PUT', '/accounts/self/emails/' +
-          encodeURIComponent(email) + '/preferred', null,
-          opt_errFn, opt_ctx).then(() => {
-            // If result of getAccountEmails is in cache, update it in the cache
-            // so we don't have to invalidate it.
-            const cachedEmails = this._cache['/accounts/self/emails'];
-            if (cachedEmails) {
-              const emails = cachedEmails.map(entry => {
-                if (entry.email === email) {
-                  return {email, preferred: true};
-                } else {
-                  return {email};
-                }
-              });
-              this._cache['/accounts/self/emails'] = emails;
+    setPreferredAccountEmail(email, opt_errFn) {
+      const encodedEmail = encodeURIComponent(email);
+      const req = {
+        method: 'PUT',
+        url: `/accounts/self/emails/${encodedEmail}/preferred`,
+        errFn: opt_errFn,
+        anonymizedUrl: '/accounts/self/emails/*/preferred',
+      };
+      return this._send(req).then(() => {
+        // If result of getAccountEmails is in cache, update it in the cache
+        // so we don't have to invalidate it.
+        const cachedEmails = this._cache.get('/accounts/self/emails');
+        if (cachedEmails) {
+          const emails = cachedEmails.map(entry => {
+            if (entry.email === email) {
+              return {email, preferred: true};
+            } else {
+              return {email};
             }
           });
+          this._cache.set('/accounts/self/emails', emails);
+        }
+      });
     },
 
     /**
@@ -559,58 +976,93 @@
     _updateCachedAccount(obj) {
       // If result of getAccount is in cache, update it in the cache
       // so we don't have to invalidate it.
-      const cachedAccount = this._cache['/accounts/self/detail'];
+      const cachedAccount = this._cache.get('/accounts/self/detail');
       if (cachedAccount) {
         // Replace object in cache with new object to force UI updates.
-        this._cache['/accounts/self/detail'] =
-            Object.assign({}, cachedAccount, obj);
+        this._cache.set('/accounts/self/detail',
+            Object.assign({}, cachedAccount, obj));
       }
     },
 
     /**
      * @param {string} name
      * @param {function(?Response, string=)=} opt_errFn
-     * @param {?=} opt_ctx
      */
-    setAccountName(name, opt_errFn, opt_ctx) {
-      return this.send('PUT', '/accounts/self/name', {name}, opt_errFn, opt_ctx)
-          .then(response => this.getResponseObject(response)
-              .then(newName => this._updateCachedAccount({name: newName})));
+    setAccountName(name, opt_errFn) {
+      const req = {
+        method: 'PUT',
+        url: '/accounts/self/name',
+        body: {name},
+        errFn: opt_errFn,
+        parseResponse: true,
+        reportUrlAsIs: true,
+      };
+      return this._send(req)
+          .then(newName => this._updateCachedAccount({name: newName}));
     },
 
     /**
      * @param {string} username
      * @param {function(?Response, string=)=} opt_errFn
-     * @param {?=} opt_ctx
      */
-    setAccountUsername(username, opt_errFn, opt_ctx) {
-      return this.send('PUT', '/accounts/self/username', {username}, opt_errFn,
-          opt_ctx).then(response => this.getResponseObject(response)
-              .then(newName => this._updateCachedAccount({username: newName})));
+    setAccountUsername(username, opt_errFn) {
+      const req = {
+        method: 'PUT',
+        url: '/accounts/self/username',
+        body: {username},
+        errFn: opt_errFn,
+        parseResponse: true,
+        reportUrlAsIs: true,
+      };
+      return this._send(req)
+          .then(newName => this._updateCachedAccount({username: newName}));
     },
 
     /**
      * @param {string} status
      * @param {function(?Response, string=)=} opt_errFn
-     * @param {?=} opt_ctx
      */
-    setAccountStatus(status, opt_errFn, opt_ctx) {
-      return this.send('PUT', '/accounts/self/status', {status},
-          opt_errFn, opt_ctx).then(response => this.getResponseObject(response)
-              .then(newStatus => this._updateCachedAccount(
-                  {status: newStatus})));
+    setAccountStatus(status, opt_errFn) {
+      const req = {
+        method: 'PUT',
+        url: '/accounts/self/status',
+        body: {status},
+        errFn: opt_errFn,
+        parseResponse: true,
+        reportUrlAsIs: true,
+      };
+      return this._send(req)
+          .then(newStatus => this._updateCachedAccount({status: newStatus}));
     },
 
     getAccountStatus(userId) {
-      return this.fetchJSON(`/accounts/${encodeURIComponent(userId)}/status`);
+      return this._fetchJSON({
+        url: `/accounts/${encodeURIComponent(userId)}/status`,
+        anonymizedUrl: '/accounts/*/status',
+      });
     },
 
     getAccountGroups() {
-      return this._fetchSharedCacheURL('/accounts/self/groups');
+      return this._fetchJSON({
+        url: '/accounts/self/groups',
+        reportUrlAsIs: true,
+      });
     },
 
     getAccountAgreements() {
-      return this._fetchSharedCacheURL('/accounts/self/agreements');
+      return this._fetchJSON({
+        url: '/accounts/self/agreements',
+        reportUrlAsIs: true,
+      });
+    },
+
+    saveAccountAgreement(name) {
+      return this._send({
+        method: 'PUT',
+        url: '/accounts/self/agreements',
+        body: name,
+        reportUrlAsIs: true,
+      });
     },
 
     /**
@@ -623,8 +1075,10 @@
             .map(param => { return encodeURIComponent(param); })
             .join('&q=');
       }
-      return this._fetchSharedCacheURL('/accounts/self/capabilities' +
-          queryString);
+      return this._fetchSharedCacheURL({
+        url: '/accounts/self/capabilities' + queryString,
+        anonymizedUrl: '/accounts/self/capabilities?q=*',
+      });
     },
 
     getLoggedIn() {
@@ -646,39 +1100,50 @@
     },
 
     checkCredentials() {
+      if (this._credentialCheck.checking) {
+        return;
+      }
+      this._credentialCheck.checking = true;
+      const req = {url: '/accounts/self/detail', reportUrlAsIs: true};
       // Skip the REST response cache.
-      return this._fetchRawJSON('/accounts/self/detail').then(response => {
-        if (!response) { return; }
-        if (response.status === 403) {
+      return this._fetchRawJSON(req).then(res => {
+        if (!res) { return; }
+        if (res.status === 403) {
           this.fire('auth-error');
-          this._cache['/accounts/self/detail'] = null;
-        } else if (response.ok) {
-          return this.getResponseObject(response);
+          this._cache.delete('/accounts/self/detail');
+        } else if (res.ok) {
+          return this.getResponseObject(res);
         }
-      }).then(response => {
-        if (response) {
-          this._cache['/accounts/self/detail'] = response;
+      }).then(res => {
+        this._credentialCheck.checking = false;
+        if (res) {
+          this._cache.delete('/accounts/self/detail');
         }
-        return response;
+        return res;
+      }).catch(err => {
+        this._credentialCheck.checking = false;
       });
     },
 
     getDefaultPreferences() {
-      return this._fetchSharedCacheURL('/config/server/preferences');
+      return this._fetchSharedCacheURL({
+        url: '/config/server/preferences',
+        reportUrlAsIs: true,
+      });
     },
 
     getPreferences() {
       return this.getLoggedIn().then(loggedIn => {
         if (loggedIn) {
-          return this._fetchSharedCacheURL('/accounts/self/preferences').then(
-              res => {
-                if (this._isNarrowScreen()) {
-                  res.default_diff_view = DiffViewMode.UNIFIED;
-                } else {
-                  res.default_diff_view = res.diff_view;
-                }
-                return Promise.resolve(res);
-              });
+          const req = {url: '/accounts/self/preferences', reportUrlAsIs: true};
+          return this._fetchSharedCacheURL(req).then(res => {
+            if (this._isNarrowScreen()) {
+              res.default_diff_view = DiffViewMode.UNIFIED;
+            } else {
+              res.default_diff_view = res.diff_view;
+            }
+            return Promise.resolve(res);
+          });
         }
 
         return Promise.resolve({
@@ -686,61 +1151,84 @@
           default_diff_view: this._isNarrowScreen() ?
               DiffViewMode.UNIFIED : DiffViewMode.SIDE_BY_SIDE,
           diff_view: 'SIDE_BY_SIDE',
+          size_bar_in_change_table: true,
         });
       });
     },
 
     getWatchedProjects() {
-      return this._fetchSharedCacheURL('/accounts/self/watched.projects');
+      return this._fetchSharedCacheURL({
+        url: '/accounts/self/watched.projects',
+        reportUrlAsIs: true,
+      });
     },
 
     /**
      * @param {string} projects
      * @param {function(?Response, string=)=} opt_errFn
-     * @param {?=} opt_ctx
      */
-    saveWatchedProjects(projects, opt_errFn, opt_ctx) {
-      return this.send('POST', '/accounts/self/watched.projects', projects,
-          opt_errFn, opt_ctx)
-          .then(response => {
-            return this.getResponseObject(response);
-          });
+    saveWatchedProjects(projects, opt_errFn) {
+      return this._send({
+        method: 'POST',
+        url: '/accounts/self/watched.projects',
+        body: projects,
+        errFn: opt_errFn,
+        parseResponse: true,
+        reportUrlAsIs: true,
+      });
     },
 
     /**
      * @param {string} projects
      * @param {function(?Response, string=)=} opt_errFn
-     * @param {?=} opt_ctx
      */
-    deleteWatchedProjects(projects, opt_errFn, opt_ctx) {
-      return this.send('POST', '/accounts/self/watched.projects:delete',
-          projects, opt_errFn, opt_ctx);
+    deleteWatchedProjects(projects, opt_errFn) {
+      return this._send({
+        method: 'POST',
+        url: '/accounts/self/watched.projects:delete',
+        body: projects,
+        errFn: opt_errFn,
+        reportUrlAsIs: true,
+      });
     },
 
     /**
-     * @param {string} url
-     * @param {function(?Response, string=)=} opt_errFn
+     * @param {Defs.FetchJSONRequest} req
      */
-    _fetchSharedCacheURL(url, opt_errFn) {
-      if (this._sharedFetchPromises[url]) {
-        return this._sharedFetchPromises[url];
+    _fetchSharedCacheURL(req) {
+      if (this._sharedFetchPromises[req.url]) {
+        return this._sharedFetchPromises[req.url];
       }
       // TODO(andybons): Periodic cache invalidation.
-      if (this._cache[url] !== undefined) {
-        return Promise.resolve(this._cache[url]);
+      if (this._cache.has(req.url)) {
+        return Promise.resolve(this._cache.get(req.url));
       }
-      this._sharedFetchPromises[url] = this.fetchJSON(url, opt_errFn)
+      this._sharedFetchPromises[req.url] = this._fetchJSON(req)
           .then(response => {
             if (response !== undefined) {
-              this._cache[url] = response;
+              this._cache.set(req.url, response);
             }
-            this._sharedFetchPromises[url] = undefined;
+            this._sharedFetchPromises[req.url] = undefined;
             return response;
           }).catch(err => {
-            this._sharedFetchPromises[url] = undefined;
+            this._sharedFetchPromises[req.url] = undefined;
             throw err;
           });
-      return this._sharedFetchPromises[url];
+      return this._sharedFetchPromises[req.url];
+    },
+
+    /**
+     * @param {string} prefix
+     */
+    _invalidateSharedFetchPromisesPrefix(prefix) {
+      const newObject = {};
+      Object.entries(this._sharedFetchPromises).forEach(([key, value]) => {
+        if (!key.startsWith(prefix)) {
+          newObject[key] = value;
+        }
+      });
+      this._sharedFetchPromises = newObject;
+      this._cache.invalidatePrefix(prefix);
     },
 
     _isNarrowScreen() {
@@ -753,8 +1241,8 @@
      * @param {number|string=} opt_offset
      * @param {!Object=} opt_options
      * @return {?Array<!Object>|?Array<!Array<!Object>>} If opt_query is an
-     *     array, fetchJSON will return an array of arrays of changeInfos. If it
-     *     is unspecified or a string, fetchJSON will return an array of
+     *     array, _fetchJSON will return an array of arrays of changeInfos. If it
+     *     is unspecified or a string, _fetchJSON will return an array of
      *     changeInfos.
      */
     getChanges(opt_changesPerPage, opt_query, opt_offset, opt_options) {
@@ -779,10 +1267,20 @@
           this._maybeInsertInLookup(change);
         }
       };
-      return this.fetchJSON('/changes/', null, null, params).then(response => {
+      const req = {
+        url: '/changes/',
+        params,
+        reportUrlAsIs: true,
+      };
+      return this._fetchJSON(req).then(response => {
         // Response may be an array of changes OR an array of arrays of
         // changes.
         if (opt_query instanceof Array) {
+          // Normalize the response to look like a multi-query response
+          // when there is only one query.
+          if (opt_query.length === 1) {
+            response = [response];
+          }
           for (const arr of response) {
             iterateOverChanges(arr);
           }
@@ -823,18 +1321,27 @@
      * @param {function()=} opt_cancelCondition
      */
     getChangeDetail(changeNum, opt_errFn, opt_cancelCondition) {
-      const options = this.listChangesOptionsToHex(
-          this.ListChangesOption.ALL_COMMITS,
-          this.ListChangesOption.ALL_REVISIONS,
-          this.ListChangesOption.CHANGE_ACTIONS,
-          this.ListChangesOption.CURRENT_ACTIONS,
-          this.ListChangesOption.DOWNLOAD_COMMANDS,
-          this.ListChangesOption.SUBMITTABLE,
-          this.ListChangesOption.WEB_LINKS
-      );
-      return this._getChangeDetail(
-          changeNum, options, opt_errFn, opt_cancelCondition)
-          .then(GrReviewerUpdatesParser.parse);
+      const options = [
+        this.ListChangesOption.ALL_COMMITS,
+        this.ListChangesOption.ALL_REVISIONS,
+        this.ListChangesOption.CHANGE_ACTIONS,
+        this.ListChangesOption.CURRENT_ACTIONS,
+        this.ListChangesOption.DETAILED_LABELS,
+        this.ListChangesOption.DOWNLOAD_COMMANDS,
+        this.ListChangesOption.MESSAGES,
+        this.ListChangesOption.SUBMITTABLE,
+        this.ListChangesOption.WEB_LINKS,
+        this.ListChangesOption.SKIP_MERGEABLE,
+      ];
+      return this.getConfig(false).then(config => {
+        if (config.receive && config.receive.enable_signed_push) {
+          options.push(this.ListChangesOption.PUSH_CERTIFICATES);
+        }
+        const optionsHex = this.listChangesOptionsToHex(...options);
+        return this._getChangeDetail(
+            changeNum, optionsHex, opt_errFn, opt_cancelCondition)
+            .then(GrReviewerUpdatesParser.parse);
+      });
     },
 
     /**
@@ -844,7 +1351,9 @@
      */
     getDiffChangeDetail(changeNum, opt_errFn, opt_cancelCondition) {
       const params = this.listChangesOptionsToHex(
-          this.ListChangesOption.ALL_REVISIONS
+          this.ListChangesOption.ALL_COMMITS,
+          this.ListChangesOption.ALL_REVISIONS,
+          this.ListChangesOption.SKIP_MERGEABLE
       );
       return this._getChangeDetail(changeNum, params, opt_errFn,
           opt_cancelCondition);
@@ -855,44 +1364,44 @@
      * @param {function(?Response, string=)=} opt_errFn
      * @param {function()=} opt_cancelCondition
      */
-    _getChangeDetail(changeNum, params, opt_errFn,
-        opt_cancelCondition) {
+    _getChangeDetail(changeNum, params, opt_errFn, opt_cancelCondition) {
       return this.getChangeActionURL(changeNum, null, '/detail').then(url => {
         const urlWithParams = this._urlWithParams(url, params);
-        return this._fetchRawJSON(
-            url,
-            opt_errFn,
-            opt_cancelCondition,
-            {O: params},
-            this._etags.getOptions(urlWithParams))
-            .then(response => {
-              if (response && response.status === 304) {
-                return Promise.resolve(this._parsePrefixedJSON(
-                    this._etags.getCachedPayload(urlWithParams)));
-              }
+        const req = {
+          url,
+          errFn: opt_errFn,
+          cancelCondition: opt_cancelCondition,
+          params: {O: params},
+          fetchOptions: this._etags.getOptions(urlWithParams),
+          anonymizedUrl: '/changes/*~*/detail?O=' + params,
+        };
+        return this._fetchRawJSON(req).then(response => {
+          if (response && response.status === 304) {
+            return Promise.resolve(this._parsePrefixedJSON(
+                this._etags.getCachedPayload(urlWithParams)));
+          }
 
-              if (response && !response.ok) {
-                if (opt_errFn) {
-                  opt_errFn.call(null, response);
-                } else {
-                  this.fire('server-error', {response});
-                }
-                return;
-              }
+          if (response && !response.ok) {
+            if (opt_errFn) {
+              opt_errFn.call(null, response);
+            } else {
+              this.fire('server-error', {request: req, response});
+            }
+            return;
+          }
 
-              const payloadPromise = response ?
-                  this._readResponsePayload(response) :
-                  Promise.resolve(null);
+          const payloadPromise = response ?
+              this._readResponsePayload(response) :
+              Promise.resolve(null);
 
-              return payloadPromise.then(payload => {
-                if (!payload) { return null; }
+          return payloadPromise.then(payload => {
+            if (!payload) { return null; }
+            this._etags.collect(urlWithParams, response, payload.raw);
+            this._maybeInsertInLookup(payload.parsed);
 
-                this._etags.collect(urlWithParams, response, payload.raw);
-                this._maybeInsertInLookup(payload);
-
-                return payload.parsed;
-              });
-            });
+            return payload.parsed;
+          });
+        });
       });
     },
 
@@ -901,42 +1410,79 @@
      * @param {number|string} patchNum
      */
     getChangeCommitInfo(changeNum, patchNum) {
-      return this._getChangeURLAndFetch(changeNum, '/commit?links', patchNum);
+      return this._getChangeURLAndFetch({
+        changeNum,
+        endpoint: '/commit?links',
+        patchNum,
+        reportEndpointAsIs: true,
+      });
     },
 
     /**
      * @param {number|string} changeNum
-     * @param {!Promise<?Object>} patchRange
+     * @param {Defs.patchRange} patchRange
+     * @param {number=} opt_parentIndex
      */
-    getChangeFiles(changeNum, patchRange) {
-      let endpoint = '/files';
-      if (patchRange.basePatchNum !== 'PARENT') {
-        endpoint += '?base=' + encodeURIComponent(patchRange.basePatchNum);
+    getChangeFiles(changeNum, patchRange, opt_parentIndex) {
+      let params = undefined;
+      if (this.isMergeParent(patchRange.basePatchNum)) {
+        params = {parent: this.getParentIndex(patchRange.basePatchNum)};
+      } else if (!this.patchNumEquals(patchRange.basePatchNum, 'PARENT')) {
+        params = {base: patchRange.basePatchNum};
       }
-      return this._getChangeURLAndFetch(changeNum, endpoint,
-          patchRange.patchNum);
+      return this._getChangeURLAndFetch({
+        changeNum,
+        endpoint: '/files',
+        patchNum: patchRange.patchNum,
+        params,
+        reportEndpointAsIs: true,
+      });
     },
 
     /**
      * @param {number|string} changeNum
-     * @param {!Promise<?Object>} patchRange
+     * @param {Defs.patchRange} patchRange
      */
     getChangeEditFiles(changeNum, patchRange) {
       let endpoint = '/edit?list';
+      let anonymizedEndpoint = endpoint;
       if (patchRange.basePatchNum !== 'PARENT') {
-        endpoint += '?base=' + encodeURIComponent(patchRange.basePatchNum);
+        endpoint += '&base=' + encodeURIComponent(patchRange.basePatchNum + '');
+        anonymizedEndpoint += '&base=*';
       }
-      return this._getChangeURLAndFetch(changeNum, endpoint);
+      return this._getChangeURLAndFetch({
+        changeNum,
+        endpoint,
+        anonymizedEndpoint,
+      });
     },
 
-    getChangeFilesAsSpeciallySortedArray(changeNum, patchRange) {
-      return this.getChangeFiles(changeNum, patchRange).then(
-          this._normalizeChangeFilesResponse.bind(this));
+    /**
+     * @param {number|string} changeNum
+     * @param {number|string} patchNum
+     * @param {string} query
+     * @return {!Promise<!Object>}
+     */
+    queryChangeFiles(changeNum, patchNum, query) {
+      return this._getChangeURLAndFetch({
+        changeNum,
+        endpoint: `/files?q=${encodeURIComponent(query)}`,
+        patchNum,
+        anonymizedEndpoint: '/files?q=*',
+      });
     },
 
-    getChangeEditFilesAsSpeciallySortedArray(changeNum, patchRange) {
-      return this.getChangeEditFiles(changeNum, patchRange).then(files =>
-            this._normalizeChangeFilesResponse(files.files));
+    /**
+     * @param {number|string} changeNum
+     * @param {Defs.patchRange} patchRange
+     * @return {!Promise<!Array<!Object>>}
+     */
+    getChangeOrEditFiles(changeNum, patchRange) {
+      if (this.patchNumEquals(patchRange.patchNum, this.EDIT_NAME)) {
+        return this.getChangeEditFiles(changeNum, patchRange).then(res =>
+            res.files);
+      }
+      return this.getChangeFiles(changeNum, patchRange);
     },
 
     /**
@@ -950,36 +1496,22 @@
       });
     },
 
-    /**
-     * The closure compiler doesn't realize this.specialFilePathCompare is
-     * valid.
-     * @suppress {checkTypes}
-     */
-    _normalizeChangeFilesResponse(response) {
-      if (!response) { return []; }
-      const paths = Object.keys(response).sort(this.specialFilePathCompare);
-      const files = [];
-      for (let i = 0; i < paths.length; i++) {
-        const info = response[paths[i]];
-        info.__path = paths[i];
-        info.lines_inserted = info.lines_inserted || 0;
-        info.lines_deleted = info.lines_deleted || 0;
-        files.push(info);
-      }
-      return files;
-    },
-
     getChangeRevisionActions(changeNum, patchNum) {
-      return this._getChangeURLAndFetch(changeNum, '/actions', patchNum)
-          .then(revisionActions => {
-            // The rebase button on change screen is always enabled.
-            if (revisionActions.rebase) {
-              revisionActions.rebase.rebaseOnCurrent =
-                  !!revisionActions.rebase.enabled;
-              revisionActions.rebase.enabled = true;
-            }
-            return revisionActions;
-          });
+      const req = {
+        changeNum,
+        endpoint: '/actions',
+        patchNum,
+        reportEndpointAsIs: true,
+      };
+      return this._getChangeURLAndFetch(req).then(revisionActions => {
+        // The rebase button on change screen is always enabled.
+        if (revisionActions.rebase) {
+          revisionActions.rebase.rebaseOnCurrent =
+              !!revisionActions.rebase.enabled;
+          revisionActions.rebase.enabled = true;
+        }
+        return revisionActions;
+      });
     },
 
     /**
@@ -990,15 +1522,24 @@
     getChangeSuggestedReviewers(changeNum, inputVal, opt_errFn) {
       const params = {n: 10};
       if (inputVal) { params.q = inputVal; }
-      return this._getChangeURLAndFetch(changeNum, '/suggest_reviewers', null,
-          opt_errFn, null, params);
+      return this._getChangeURLAndFetch({
+        changeNum,
+        endpoint: '/suggest_reviewers',
+        errFn: opt_errFn,
+        params,
+        reportEndpointAsIs: true,
+      });
     },
 
     /**
      * @param {number|string} changeNum
      */
     getChangeIncludedIn(changeNum) {
-      return this._getChangeURLAndFetch(changeNum, '/in', null);
+      return this._getChangeURLAndFetch({
+        changeNum,
+        endpoint: '/in',
+        reportEndpointAsIs: true,
+      });
     },
 
     _computeFilter(filter) {
@@ -1016,138 +1557,251 @@
      * @param {string} filter
      * @param {number} groupsPerPage
      * @param {number=} opt_offset
+     */
+    _getGroupsUrl(filter, groupsPerPage, opt_offset) {
+      const offset = opt_offset || 0;
+
+      return `/groups/?n=${groupsPerPage + 1}&S=${offset}` +
+        this._computeFilter(filter);
+    },
+
+    /**
+     * @param {string} filter
+     * @param {number} reposPerPage
+     * @param {number=} opt_offset
+     */
+    _getReposUrl(filter, reposPerPage, opt_offset) {
+      const defaultFilter = 'state:active OR state:read-only';
+      const namePartDelimiters = /[@.\-\s\/_]/g;
+      const offset = opt_offset || 0;
+
+      if (filter && !filter.includes(':') && filter.match(namePartDelimiters)) {
+        // The query language specifies hyphens as operators. Split the string
+        // by hyphens and 'AND' the parts together as 'inname:' queries.
+        // If the filter includes a semicolon, the user is using a more complex
+        // query so we trust them and don't do any magic under the hood.
+        const originalFilter = filter;
+        filter = '';
+        originalFilter.split(namePartDelimiters).forEach(part => {
+          if (part) {
+            filter += (filter === '' ? 'inname:' : ' AND inname:') + part;
+          }
+        });
+      }
+      // Check if filter is now empty which could be either because the user did
+      // not provide it or because the user provided only a split character.
+      if (!filter) {
+        filter = defaultFilter;
+      }
+
+      filter = filter.trim();
+      const encodedFilter = encodeURIComponent(filter);
+
+      return `/projects/?n=${reposPerPage + 1}&S=${offset}` +
+        `&query=${encodedFilter}`;
+    },
+
+    invalidateGroupsCache() {
+      this._invalidateSharedFetchPromisesPrefix('/groups/?');
+    },
+
+    invalidateReposCache() {
+      this._invalidateSharedFetchPromisesPrefix('/projects/?');
+    },
+
+    /**
+     * @param {string} filter
+     * @param {number} groupsPerPage
+     * @param {number=} opt_offset
      * @return {!Promise<?Object>}
      */
     getGroups(filter, groupsPerPage, opt_offset) {
-      const offset = opt_offset || 0;
+      const url = this._getGroupsUrl(filter, groupsPerPage, opt_offset);
 
-      return this._fetchSharedCacheURL(
-          `/groups/?n=${groupsPerPage + 1}&S=${offset}` +
-          this._computeFilter(filter)
-      );
+      return this._fetchSharedCacheURL({
+        url,
+        anonymizedUrl: '/groups/?*',
+      });
     },
 
     /**
      * @param {string} filter
-     * @param {number} projectsPerPage
+     * @param {number} reposPerPage
      * @param {number=} opt_offset
      * @return {!Promise<?Object>}
      */
-    getProjects(filter, projectsPerPage, opt_offset) {
-      const offset = opt_offset || 0;
+    getRepos(filter, reposPerPage, opt_offset) {
+      const url = this._getReposUrl(filter, reposPerPage, opt_offset);
 
-      return this._fetchSharedCacheURL(
-          `/projects/?d&n=${projectsPerPage + 1}&S=${offset}` +
-          this._computeFilter(filter)
-      );
+      // TODO(kaspern): Rename rest api from /projects/ to /repos/ once backend
+      // supports it.
+      return this._fetchSharedCacheURL({
+        url,
+        anonymizedUrl: '/projects/?*',
+      });
     },
 
-    setProjectHead(project, ref) {
-      return this.send(
-          'PUT', `/projects/${encodeURIComponent(project)}/HEAD`, {ref});
+    setRepoHead(repo, ref) {
+      // TODO(kaspern): Rename rest api from /projects/ to /repos/ once backend
+      // supports it.
+      return this._send({
+        method: 'PUT',
+        url: `/projects/${encodeURIComponent(repo)}/HEAD`,
+        body: {ref},
+        anonymizedUrl: '/projects/*/HEAD',
+      });
     },
 
     /**
      * @param {string} filter
-     * @param {string} project
-     * @param {number} projectsBranchesPerPage
+     * @param {string} repo
+     * @param {number} reposBranchesPerPage
      * @param {number=} opt_offset
+     * @param {?function(?Response, string=)=} opt_errFn
      * @return {!Promise<?Object>}
      */
-    getProjectBranches(filter, project, projectsBranchesPerPage, opt_offset) {
+    getRepoBranches(filter, repo, reposBranchesPerPage, opt_offset, opt_errFn) {
       const offset = opt_offset || 0;
-
-      return this.fetchJSON(
-          `/projects/${encodeURIComponent(project)}/branches` +
-          `?n=${projectsBranchesPerPage + 1}&S=${offset}` +
-          this._computeFilter(filter)
-      );
+      const count = reposBranchesPerPage + 1;
+      filter = this._computeFilter(filter);
+      repo = encodeURIComponent(repo);
+      const url = `/projects/${repo}/branches?n=${count}&S=${offset}${filter}`;
+      // TODO(kaspern): Rename rest api from /projects/ to /repos/ once backend
+      // supports it.
+      return this._fetchJSON({
+        url,
+        errFn: opt_errFn,
+        anonymizedUrl: '/projects/*/branches?*',
+      });
     },
 
     /**
      * @param {string} filter
-     * @param {string} project
-     * @param {number} projectsTagsPerPage
+     * @param {string} repo
+     * @param {number} reposTagsPerPage
      * @param {number=} opt_offset
+     * @param {?function(?Response, string=)=} opt_errFn
      * @return {!Promise<?Object>}
      */
-    getProjectTags(filter, project, projectsTagsPerPage, opt_offset) {
+    getRepoTags(filter, repo, reposTagsPerPage, opt_offset, opt_errFn) {
       const offset = opt_offset || 0;
-
-      return this.fetchJSON(
-          `/projects/${encodeURIComponent(project)}/tags` +
-          `?n=${projectsTagsPerPage + 1}&S=${offset}` +
-          this._computeFilter(filter)
-      );
+      const encodedRepo = encodeURIComponent(repo);
+      const n = reposTagsPerPage + 1;
+      const encodedFilter = this._computeFilter(filter);
+      const url = `/projects/${encodedRepo}/tags` + `?n=${n}&S=${offset}` +
+          encodedFilter;
+      // TODO(kaspern): Rename rest api from /projects/ to /repos/ once backend
+      // supports it.
+      return this._fetchJSON({
+        url,
+        errFn: opt_errFn,
+        anonymizedUrl: '/projects/*/tags',
+      });
     },
 
     /**
      * @param {string} filter
      * @param {number} pluginsPerPage
      * @param {number=} opt_offset
+     * @param {?function(?Response, string=)=} opt_errFn
      * @return {!Promise<?Object>}
      */
-    getPlugins(filter, pluginsPerPage, opt_offset) {
+    getPlugins(filter, pluginsPerPage, opt_offset, opt_errFn) {
       const offset = opt_offset || 0;
-
-      return this.fetchJSON(
-          `/plugins/?all&n=${pluginsPerPage + 1}&S=${offset}` +
-          this._computeFilter(filter)
-      );
+      const encodedFilter = this._computeFilter(filter);
+      const n = pluginsPerPage + 1;
+      const url = `/plugins/?all&n=${n}&S=${offset}${encodedFilter}`;
+      return this._fetchJSON({
+        url,
+        errFn: opt_errFn,
+        anonymizedUrl: '/plugins/?all',
+      });
     },
 
-    getProjectAccessRights(projectName) {
-      return this._fetchSharedCacheURL(
-          `/projects/${encodeURIComponent(projectName)}/access`);
+    getRepoAccessRights(repoName, opt_errFn) {
+      // TODO(kaspern): Rename rest api from /projects/ to /repos/ once backend
+      // supports it.
+      return this._fetchJSON({
+        url: `/projects/${encodeURIComponent(repoName)}/access`,
+        errFn: opt_errFn,
+        anonymizedUrl: '/projects/*/access',
+      });
     },
 
-    setProjectAccessRights(projectName, projectInfo) {
-      return this.send(
-          'POST', `/projects/${encodeURIComponent(projectName)}/access`,
-          projectInfo);
+    setRepoAccessRights(repoName, repoInfo) {
+      // TODO(kaspern): Rename rest api from /projects/ to /repos/ once backend
+      // supports it.
+      return this._send({
+        method: 'POST',
+        url: `/projects/${encodeURIComponent(repoName)}/access`,
+        body: repoInfo,
+        anonymizedUrl: '/projects/*/access',
+      });
+    },
+
+    setRepoAccessRightsForReview(projectName, projectInfo) {
+      return this._send({
+        method: 'PUT',
+        url: `/projects/${encodeURIComponent(projectName)}/access:review`,
+        body: projectInfo,
+        parseResponse: true,
+        anonymizedUrl: '/projects/*/access:review',
+      });
     },
 
     /**
      * @param {string} inputVal
      * @param {number} opt_n
      * @param {function(?Response, string=)=} opt_errFn
-     * @param {?=} opt_ctx
      */
-    getSuggestedGroups(inputVal, opt_n, opt_errFn, opt_ctx) {
+    getSuggestedGroups(inputVal, opt_n, opt_errFn) {
       const params = {s: inputVal};
       if (opt_n) { params.n = opt_n; }
-      return this.fetchJSON('/groups/', opt_errFn, opt_ctx, params);
+      return this._fetchJSON({
+        url: '/groups/',
+        errFn: opt_errFn,
+        params,
+        reportUrlAsIs: true,
+      });
     },
 
     /**
      * @param {string} inputVal
      * @param {number} opt_n
      * @param {function(?Response, string=)=} opt_errFn
-     * @param {?=} opt_ctx
      */
-    getSuggestedProjects(inputVal, opt_n, opt_errFn, opt_ctx) {
+    getSuggestedProjects(inputVal, opt_n, opt_errFn) {
       const params = {
         m: inputVal,
         n: MAX_PROJECT_RESULTS,
         type: 'ALL',
       };
       if (opt_n) { params.n = opt_n; }
-      return this.fetchJSON('/projects/', opt_errFn, opt_ctx, params);
+      return this._fetchJSON({
+        url: '/projects/',
+        errFn: opt_errFn,
+        params,
+        reportUrlAsIs: true,
+      });
     },
 
     /**
      * @param {string} inputVal
      * @param {number} opt_n
      * @param {function(?Response, string=)=} opt_errFn
-     * @param {?=} opt_ctx
      */
-    getSuggestedAccounts(inputVal, opt_n, opt_errFn, opt_ctx) {
+    getSuggestedAccounts(inputVal, opt_n, opt_errFn) {
       if (!inputVal) {
         return Promise.resolve([]);
       }
       const params = {suggest: null, q: inputVal};
       if (opt_n) { params.n = opt_n; }
-      return this.fetchJSON('/accounts/', opt_errFn, opt_ctx, params);
+      return this._fetchJSON({
+        url: '/accounts/',
+        errFn: opt_errFn,
+        params,
+        anonymizedUrl: '/accounts/?n=*',
+      });
     },
 
     addChangeReviewer(changeNum, reviewerID) {
@@ -1173,16 +1827,25 @@
                 throw Error('Unsupported HTTP method: ' + method);
             }
 
-            return this.send(method, url, body);
+            return this._send({method, url, body});
           });
     },
 
     getRelatedChanges(changeNum, patchNum) {
-      return this._getChangeURLAndFetch(changeNum, '/related', patchNum);
+      return this._getChangeURLAndFetch({
+        changeNum,
+        endpoint: '/related',
+        patchNum,
+        reportEndpointAsIs: true,
+      });
     },
 
     getChangesSubmittedTogether(changeNum) {
-      return this._getChangeURLAndFetch(changeNum, '/submitted_together', null);
+      return this._getChangeURLAndFetch({
+        changeNum,
+        endpoint: '/submitted_together?o=NON_VISIBLE_CHANGES',
+        reportEndpointAsIs: true,
+      });
     },
 
     getChangeConflicts(changeNum) {
@@ -1194,7 +1857,11 @@
         O: options,
         q: 'status:open is:mergeable conflicts:' + changeNum,
       };
-      return this.fetchJSON('/changes/', null, null, params);
+      return this._fetchJSON({
+        url: '/changes/',
+        params,
+        anonymizedUrl: '/changes/conflicts:*',
+      });
     },
 
     getChangeCherryPicks(project, changeID, changeNum) {
@@ -1212,7 +1879,11 @@
         O: options,
         q: query,
       };
-      return this.fetchJSON('/changes/', null, null, params);
+      return this._fetchJSON({
+        url: '/changes/',
+        params,
+        anonymizedUrl: '/changes/change:*',
+      });
     },
 
     getChangesWithSameTopic(topic, changeNum) {
@@ -1225,17 +1896,26 @@
       const query = [
         'status:open',
         '-change:' + changeNum,
-        'topic:' + topic,
+        `topic:"${topic}"`,
       ].join(' ');
       const params = {
         O: options,
         q: query,
       };
-      return this.fetchJSON('/changes/', null, null, params);
+      return this._fetchJSON({
+        url: '/changes/',
+        params,
+        anonymizedUrl: '/changes/topic:*',
+      });
     },
 
     getReviewedFiles(changeNum, patchNum) {
-      return this._getChangeURLAndFetch(changeNum, '/files?reviewed', patchNum);
+      return this._getChangeURLAndFetch({
+        changeNum,
+        endpoint: '/files?reviewed',
+        patchNum,
+        reportEndpointAsIs: true,
+      });
     },
 
     /**
@@ -1244,13 +1924,16 @@
      * @param {string} path
      * @param {boolean} reviewed
      * @param {function(?Response, string=)=} opt_errFn
-     * @param {?=} opt_ctx
      */
-    saveFileReviewed(changeNum, patchNum, path, reviewed, opt_errFn, opt_ctx) {
-      const method = reviewed ? 'PUT' : 'DELETE';
-      const e = `/files/${encodeURIComponent(path)}/reviewed`;
-      return this.getChangeURLAndSend(changeNum, method, patchNum, e, null,
-          opt_errFn, opt_ctx);
+    saveFileReviewed(changeNum, patchNum, path, reviewed, opt_errFn) {
+      return this._getChangeURLAndSend({
+        changeNum,
+        method: reviewed ? 'PUT' : 'DELETE',
+        patchNum,
+        endpoint: `/files/${encodeURIComponent(path)}/reviewed`,
+        errFn: opt_errFn,
+        anonymizedEndpoint: '/files/*/reviewed',
+      });
     },
 
     /**
@@ -1258,101 +1941,292 @@
      * @param {number|string} patchNum
      * @param {!Object} review
      * @param {function(?Response, string=)=} opt_errFn
-     * @param {?=} opt_ctx
      */
-    saveChangeReview(changeNum, patchNum, review, opt_errFn, opt_ctx) {
+    saveChangeReview(changeNum, patchNum, review, opt_errFn) {
       const promises = [
         this.awaitPendingDiffDrafts(),
         this.getChangeActionURL(changeNum, patchNum, '/review'),
       ];
       return Promise.all(promises).then(([, url]) => {
-        return this.send('POST', url, review, opt_errFn, opt_ctx);
+        return this._send({
+          method: 'POST',
+          url,
+          body: review,
+          errFn: opt_errFn,
+        });
       });
     },
 
     getChangeEdit(changeNum, opt_download_commands) {
       const params = opt_download_commands ? {'download-commands': true} : null;
       return this.getLoggedIn().then(loggedIn => {
-        return loggedIn ?
-            this._getChangeURLAndFetch(changeNum, '/edit/', null, null, null,
-                params) :
-            false;
+        if (!loggedIn) { return false; }
+        return this._getChangeURLAndFetch({
+          changeNum,
+          endpoint: '/edit/',
+          params,
+          reportEndpointAsIs: true,
+        });
       });
     },
 
     /**
-     * @param {!string} project
-     * @param {!string} branch
-     * @param {!string} subject
-     * @param {!string} topic
-     * @param {!boolean} isPrivate
-     * @param {!boolean} workInProgress
+     * @param {string} project
+     * @param {string} branch
+     * @param {string} subject
+     * @param {string=} opt_topic
+     * @param {boolean=} opt_isPrivate
+     * @param {boolean=} opt_workInProgress
+     * @param {string=} opt_baseChange
+     * @param {string=} opt_baseCommit
      */
-    createChange(project, branch, subject, topic, isPrivate,
-        workInProgress) {
-      return this.send('POST', '/changes/',
-          {project, branch, subject, topic, is_private: isPrivate,
-            work_in_progress: workInProgress})
-          .then(response => this.getResponseObject(response));
+    createChange(project, branch, subject, opt_topic, opt_isPrivate,
+        opt_workInProgress, opt_baseChange, opt_baseCommit) {
+      return this._send({
+        method: 'POST',
+        url: '/changes/',
+        body: {
+          project,
+          branch,
+          subject,
+          topic: opt_topic,
+          is_private: opt_isPrivate,
+          work_in_progress: opt_workInProgress,
+          base_change: opt_baseChange,
+          base_commit: opt_baseCommit,
+        },
+        parseResponse: true,
+        reportUrlAsIs: true,
+      });
     },
 
-    getFileInChangeEdit(changeNum, path) {
-      const e = '/edit/' + encodeURIComponent(path);
-      return this.getChangeURLAndSend(changeNum, 'GET', null, e);
+    /**
+     * @param {number|string} changeNum
+     * @param {string} path
+     * @param {number|string} patchNum
+     */
+    getFileContent(changeNum, path, patchNum) {
+      // 404s indicate the file does not exist yet in the revision, so suppress
+      // them.
+      const suppress404s = res => {
+        if (res && res.status !== 404) { this.fire('server-error', {res}); }
+        return res;
+      };
+      const promise = this.patchNumEquals(patchNum, this.EDIT_NAME) ?
+          this._getFileInChangeEdit(changeNum, path) :
+          this._getFileInRevision(changeNum, path, patchNum, suppress404s);
+
+      return promise.then(res => {
+        if (!res.ok) { return res; }
+
+        // The file type (used for syntax highlighting) is identified in the
+        // X-FYI-Content-Type header of the response.
+        const type = res.headers.get('X-FYI-Content-Type');
+        return this.getResponseObject(res).then(content => {
+          return {content, type, ok: true};
+        });
+      });
+    },
+
+    /**
+     * Gets a file in a specific change and revision.
+     * @param {number|string} changeNum
+     * @param {string} path
+     * @param {number|string} patchNum
+     * @param {?function(?Response, string=)=} opt_errFn
+     */
+    _getFileInRevision(changeNum, path, patchNum, opt_errFn) {
+      return this._getChangeURLAndSend({
+        changeNum,
+        method: 'GET',
+        patchNum,
+        endpoint: `/files/${encodeURIComponent(path)}/content`,
+        errFn: opt_errFn,
+        headers: {Accept: 'application/json'},
+        anonymizedEndpoint: '/files/*/content',
+      });
+    },
+
+    /**
+     * Gets a file in a change edit.
+     * @param {number|string} changeNum
+     * @param {string} path
+     */
+    _getFileInChangeEdit(changeNum, path) {
+      return this._getChangeURLAndSend({
+        changeNum,
+        method: 'GET',
+        endpoint: '/edit/' + encodeURIComponent(path),
+        headers: {Accept: 'application/json'},
+        anonymizedEndpoint: '/edit/*',
+      });
     },
 
     rebaseChangeEdit(changeNum) {
-      return this.getChangeURLAndSend(changeNum, 'POST', null, '/edit:rebase');
+      return this._getChangeURLAndSend({
+        changeNum,
+        method: 'POST',
+        endpoint: '/edit:rebase',
+        reportEndpointAsIs: true,
+      });
     },
 
     deleteChangeEdit(changeNum) {
-      return this.getChangeURLAndSend(changeNum, 'DELETE', null, '/edit');
+      return this._getChangeURLAndSend({
+        changeNum,
+        method: 'DELETE',
+        endpoint: '/edit',
+        reportEndpointAsIs: true,
+      });
     },
 
     restoreFileInChangeEdit(changeNum, restore_path) {
-      const p = {restore_path};
-      return this.getChangeURLAndSend(changeNum, 'POST', null, '/edit', p);
+      return this._getChangeURLAndSend({
+        changeNum,
+        method: 'POST',
+        endpoint: '/edit',
+        body: {restore_path},
+        reportEndpointAsIs: true,
+      });
     },
 
     renameFileInChangeEdit(changeNum, old_path, new_path) {
-      const p = {old_path, new_path};
-      return this.getChangeURLAndSend(changeNum, 'POST', null, '/edit', p);
+      return this._getChangeURLAndSend({
+        changeNum,
+        method: 'POST',
+        endpoint: '/edit',
+        body: {old_path, new_path},
+        reportEndpointAsIs: true,
+      });
     },
 
     deleteFileInChangeEdit(changeNum, path) {
-      const e = '/edit/' + encodeURIComponent(path);
-      return this.getChangeURLAndSend(changeNum, 'DELETE', null, e);
+      return this._getChangeURLAndSend({
+        changeNum,
+        method: 'DELETE',
+        endpoint: '/edit/' + encodeURIComponent(path),
+        anonymizedEndpoint: '/edit/*',
+      });
     },
 
     saveChangeEdit(changeNum, path, contents) {
-      const e = '/edit/' + encodeURIComponent(path);
-      return this.getChangeURLAndSend(changeNum, 'PUT', null, e, contents);
+      return this._getChangeURLAndSend({
+        changeNum,
+        method: 'PUT',
+        endpoint: '/edit/' + encodeURIComponent(path),
+        body: contents,
+        contentType: 'text/plain',
+        anonymizedEndpoint: '/edit/*',
+      });
     },
 
     // Deprecated, prefer to use putChangeCommitMessage instead.
     saveChangeCommitMessageEdit(changeNum, message) {
-      const p = {message};
-      return this.getChangeURLAndSend(changeNum, 'PUT', null, '/edit:message',
-          p);
+      return this._getChangeURLAndSend({
+        changeNum,
+        method: 'PUT',
+        endpoint: '/edit:message',
+        body: {message},
+        reportEndpointAsIs: true,
+      });
     },
 
     publishChangeEdit(changeNum) {
-      return this.getChangeURLAndSend(changeNum, 'POST', null,
-          '/edit:publish');
+      return this._getChangeURLAndSend({
+        changeNum,
+        method: 'POST',
+        endpoint: '/edit:publish',
+        reportEndpointAsIs: true,
+      });
     },
 
     putChangeCommitMessage(changeNum, message) {
-      const p = {message};
-      return this.getChangeURLAndSend(changeNum, 'PUT', null, '/message', p);
+      return this._getChangeURLAndSend({
+        changeNum,
+        method: 'PUT',
+        endpoint: '/message',
+        body: {message},
+        reportEndpointAsIs: true,
+      });
     },
 
     saveChangeStarred(changeNum, starred) {
-      const url = '/accounts/self/starred.changes/' + changeNum;
-      const method = starred ? 'PUT' : 'DELETE';
-      return this.send(method, url);
+      // Some servers may require the project name to be provided
+      // alongside the change number, so resolve the project name
+      // first.
+      return this.getFromProjectLookup(changeNum).then(project => {
+        const url = '/accounts/self/starred.changes/' +
+            (project ? encodeURIComponent(project) + '~' : '') + changeNum;
+        return this._send({
+          method: starred ? 'PUT' : 'DELETE',
+          url,
+          anonymizedUrl: '/accounts/self/starred.changes/*',
+        });
+      });
+    },
+
+    saveChangeReviewed(changeNum, reviewed) {
+      return this._getChangeURLAndSend({
+        changeNum,
+        method: 'PUT',
+        endpoint: reviewed ? '/reviewed' : '/unreviewed',
+      });
     },
 
     /**
+     * Send an XHR.
+     * @param {Defs.SendRequest} req
+     * @return {Promise}
+     */
+    _send(req) {
+      const options = {method: req.method};
+      if (req.body) {
+        options.headers = new Headers();
+        options.headers.set(
+            'Content-Type', req.contentType || 'application/json');
+        options.body = typeof req.body === 'string' ?
+            req.body : JSON.stringify(req.body);
+      }
+      if (req.headers) {
+        if (!options.headers) { options.headers = new Headers(); }
+        for (const header in req.headers) {
+          if (!req.headers.hasOwnProperty(header)) { continue; }
+          options.headers.set(header, req.headers[header]);
+        }
+      }
+      const url = req.url.startsWith('http') ?
+          req.url : this.getBaseUrl() + req.url;
+      const fetchReq = {
+        url,
+        fetchOptions: options,
+        anonymizedUrl: req.reportUrlAsIs ? url : req.anonymizedUrl,
+      };
+      const xhr = this._fetch(fetchReq).then(response => {
+        if (!response.ok) {
+          if (req.errFn) {
+            return req.errFn.call(undefined, response);
+          }
+          this.fire('server-error', {request: fetchReq, response});
+        }
+        return response;
+      }).catch(err => {
+        this.fire('network-error', {error: err});
+        if (req.errFn) {
+          return req.errFn.call(undefined, null, err);
+        } else {
+          throw err;
+        }
+      });
+
+      if (req.parseResponse) {
+        return xhr.then(res => this.getResponseObject(res));
+      }
+
+      return xhr;
+    },
+
+    /**
+     * Public version of the _send method preserved for plugins.
      * @param {string} method
      * @param {string} url
      * @param {?string|number|Object=} opt_body passed as null sometimes
@@ -1360,63 +2234,53 @@
      *    number at least.
      * @param {?function(?Response, string=)=} opt_errFn
      *    passed as null sometimes.
-     * @param {?=} opt_ctx
      * @param {?string=} opt_contentType
+     * @param {Object=} opt_headers
      */
-    send(method, url, opt_body, opt_errFn, opt_ctx, opt_contentType) {
-      const options = {method};
-      if (opt_body) {
-        options.headers = new Headers();
-        options.headers.set(
-            'Content-Type', opt_contentType || 'application/json');
-        if (typeof opt_body !== 'string') {
-          opt_body = JSON.stringify(opt_body);
-        }
-        options.body = opt_body;
-      }
-      if (!url.startsWith('http')) {
-        url = this.getBaseUrl() + url;
-      }
-      return this._auth.fetch(url, options).then(response => {
-        if (!response.ok) {
-          if (opt_errFn) {
-            return opt_errFn.call(opt_ctx || null, response);
-          }
-          this.fire('server-error', {response});
-        }
-        return response;
-      }).catch(err => {
-        this.fire('network-error', {error: err});
-        if (opt_errFn) {
-          return opt_errFn.call(opt_ctx, null, err);
-        } else {
-          throw err;
-        }
+    send(method, url, opt_body, opt_errFn, opt_contentType,
+        opt_headers) {
+      return this._send({
+        method,
+        url,
+        body: opt_body,
+        errFn: opt_errFn,
+        contentType: opt_contentType,
+        headers: opt_headers,
       });
     },
 
     /**
      * @param {number|string} changeNum
-     * @param {number|string} basePatchNum
+     * @param {number|string} basePatchNum Negative values specify merge parent
+     *     index.
      * @param {number|string} patchNum
      * @param {string} path
+     * @param {string=} opt_whitespace the ignore-whitespace level for the diff
+     *     algorithm.
      * @param {function(?Response, string=)=} opt_errFn
-     * @param {function()=} opt_cancelCondition
      */
-    getDiff(changeNum, basePatchNum, patchNum, path,
-        opt_errFn, opt_cancelCondition) {
+    getDiff(changeNum, basePatchNum, patchNum, path, opt_whitespace,
+        opt_errFn) {
       const params = {
         context: 'ALL',
         intraline: null,
-        whitespace: 'IGNORE_NONE',
+        whitespace: opt_whitespace || 'IGNORE_NONE',
       };
-      if (basePatchNum != PARENT_PATCH_NUM) {
+      if (this.isMergeParent(basePatchNum)) {
+        params.parent = this.getParentIndex(basePatchNum);
+      } else if (!this.patchNumEquals(basePatchNum, PARENT_PATCH_NUM)) {
         params.base = basePatchNum;
       }
       const endpoint = `/files/${encodeURIComponent(path)}/diff`;
 
-      return this._getChangeURLAndFetch(changeNum, endpoint, patchNum,
-          opt_errFn, opt_cancelCondition, params);
+      return this._getChangeURLAndFetch({
+        changeNum,
+        endpoint,
+        patchNum,
+        errFn: opt_errFn,
+        params,
+        anonymizedEndpoint: '/files/*/diff',
+      });
     },
 
     /**
@@ -1424,15 +2288,23 @@
      * @param {number|string=} opt_basePatchNum
      * @param {number|string=} opt_patchNum
      * @param {string=} opt_path
+     * @return {!Promise<!Object>}
      */
     getDiffComments(changeNum, opt_basePatchNum, opt_patchNum, opt_path) {
       return this._getDiffComments(changeNum, '/comments', opt_basePatchNum,
           opt_patchNum, opt_path);
     },
 
-    getDiffRobotComments(changeNum, basePatchNum, patchNum, opt_path) {
-      return this._getDiffComments(changeNum, '/robotcomments', basePatchNum,
-          patchNum, opt_path);
+    /**
+     * @param {number|string} changeNum
+     * @param {number|string=} opt_basePatchNum
+     * @param {number|string=} opt_patchNum
+     * @param {string=} opt_path
+     * @return {!Promise<!Object>}
+     */
+    getDiffRobotComments(changeNum, opt_basePatchNum, opt_patchNum, opt_path) {
+      return this._getDiffComments(changeNum, '/robotcomments',
+          opt_basePatchNum, opt_patchNum, opt_path);
     },
 
     /**
@@ -1444,7 +2316,7 @@
      * @param {number|string=} opt_basePatchNum
      * @param {number|string=} opt_patchNum
      * @param {string=} opt_path
-     * @return {!Promise<?Object>}
+     * @return {!Promise<!Object>}
      */
     getDiffDrafts(changeNum, opt_basePatchNum, opt_patchNum, opt_path) {
       return this.getLoggedIn().then(loggedIn => {
@@ -1483,6 +2355,7 @@
      * @param {number|string=} opt_basePatchNum
      * @param {number|string=} opt_patchNum
      * @param {string=} opt_path
+     * @return {!Promise<!Object>}
      */
     _getDiffComments(changeNum, endpoint, opt_basePatchNum,
         opt_patchNum, opt_path) {
@@ -1491,10 +2364,15 @@
        * Helper function to make promises more legible.
        *
        * @param {string|number=} opt_patchNum
-       * @return {!Object} Diff comments response.
+       * @return {!Promise<!Object>} Diff comments response.
        */
       const fetchComments = opt_patchNum => {
-        return this._getChangeURLAndFetch(changeNum, endpoint, opt_patchNum);
+        return this._getChangeURLAndFetch({
+          changeNum,
+          endpoint,
+          patchNum: opt_patchNum,
+          reportEndpointAsIs: true,
+        });
       };
 
       if (!opt_basePatchNum && !opt_patchNum && !opt_path) {
@@ -1584,8 +2462,10 @@
     _sendDiffDraftRequest(method, changeNum, patchNum, draft) {
       const isCreate = !draft.id && method === 'PUT';
       let endpoint = '/drafts';
+      let anonymizedEndpoint = endpoint;
       if (draft.id) {
         endpoint += '/' + draft.id;
+        anonymizedEndpoint += '/*';
       }
       let body;
       if (method === 'PUT') {
@@ -1596,8 +2476,16 @@
         this._pendingRequests[Requests.SEND_DIFF_DRAFT] = [];
       }
 
-      const promise = this.getChangeURLAndSend(changeNum, method, patchNum,
-          endpoint, body);
+      const req = {
+        changeNum,
+        method,
+        patchNum,
+        endpoint,
+        body,
+        anonymizedEndpoint,
+      };
+
+      const promise = this._getChangeURLAndSend(req);
       this._pendingRequests[Requests.SEND_DIFF_DRAFT].push(promise);
 
       if (isCreate) {
@@ -1608,13 +2496,15 @@
     },
 
     getCommitInfo(project, commit) {
-      return this.fetchJSON(
-          '/projects/' + encodeURIComponent(project) +
-          '/commits/' + encodeURIComponent(commit));
+      return this._fetchJSON({
+        url: '/projects/' + encodeURIComponent(project) +
+            '/commits/' + encodeURIComponent(commit),
+        anonymizedUrl: '/projects/*/comments/*',
+      });
     },
 
     _fetchB64File(url) {
-      return this._auth.fetch(this.getBaseUrl() + url)
+      return this._fetch({url: this.getBaseUrl() + url})
           .then(response => {
             if (!response.ok) { return Promise.reject(response.statusText); }
             const type = response.headers.get('X-FYI-Content-Type');
@@ -1631,7 +2521,7 @@
      * @param {string} path
      * @param {number=} opt_parentIndex
      */
-    getChangeFileContents(changeId, patchNum, path, opt_parentIndex) {
+    getB64FileContents(changeId, patchNum, path, opt_parentIndex) {
       const parent = typeof opt_parentIndex === 'number' ?
           '?parent=' + opt_parentIndex : '';
       return this._changeBaseURL(changeId, patchNum).then(url => {
@@ -1647,10 +2537,10 @@
       if (diff.meta_a && diff.meta_a.content_type.startsWith('image/')) {
         if (patchRange.basePatchNum === 'PARENT') {
           // Note: we only attempt to get the image from the first parent.
-          promiseA = this.getChangeFileContents(changeNum, patchRange.patchNum,
+          promiseA = this.getB64FileContents(changeNum, patchRange.patchNum,
               diff.meta_a.name, 1);
         } else {
-          promiseA = this.getChangeFileContents(changeNum,
+          promiseA = this.getB64FileContents(changeNum,
               patchRange.basePatchNum, diff.meta_a.name);
         }
       } else {
@@ -1658,7 +2548,7 @@
       }
 
       if (diff.meta_b && diff.meta_b.content_type.startsWith('image/')) {
-        promiseB = this.getChangeFileContents(changeNum, patchRange.patchNum,
+        promiseB = this.getB64FileContents(changeNum, patchRange.patchNum,
             diff.meta_b.name);
       } else {
         promiseB = Promise.resolve(null);
@@ -1709,9 +2599,14 @@
      * parameter.
      */
     setChangeTopic(changeNum, topic) {
-      const p = {topic};
-      return this.getChangeURLAndSend(changeNum, 'PUT', null, '/topic', p)
-          .then(this.getResponseObject.bind(this));
+      return this._getChangeURLAndSend({
+        changeNum,
+        method: 'PUT',
+        endpoint: '/topic',
+        body: {topic},
+        parseResponse: true,
+        reportUrlAsIs: true,
+      });
     },
 
     /**
@@ -1720,12 +2615,22 @@
      * parameter.
      */
     setChangeHashtag(changeNum, hashtag) {
-      return this.getChangeURLAndSend(changeNum, 'POST', null, '/hashtags',
-          hashtag).then(this.getResponseObject.bind(this));
+      return this._getChangeURLAndSend({
+        changeNum,
+        method: 'POST',
+        endpoint: '/hashtags',
+        body: hashtag,
+        parseResponse: true,
+        reportUrlAsIs: true,
+      });
     },
 
     deleteAccountHttpPassword() {
-      return this.send('DELETE', '/accounts/self/password.http');
+      return this._send({
+        method: 'DELETE',
+        url: '/accounts/self/password.http',
+        reportUrlAsIs: true,
+      });
     },
 
     /**
@@ -1734,17 +2639,31 @@
      * parameter.
      */
     generateAccountHttpPassword() {
-      return this.send('PUT', '/accounts/self/password.http', {generate: true})
-          .then(this.getResponseObject.bind(this));
+      return this._send({
+        method: 'PUT',
+        url: '/accounts/self/password.http',
+        body: {generate: true},
+        parseResponse: true,
+        reportUrlAsIs: true,
+      });
     },
 
     getAccountSSHKeys() {
-      return this._fetchSharedCacheURL('/accounts/self/sshkeys');
+      return this._fetchSharedCacheURL({
+        url: '/accounts/self/sshkeys',
+        reportUrlAsIs: true,
+      });
     },
 
     addAccountSSHKey(key) {
-      return this.send('POST', '/accounts/self/sshkeys', key, null, null,
-          'plain/text')
+      const req = {
+        method: 'POST',
+        url: '/accounts/self/sshkeys',
+        body: key,
+        contentType: 'plain/text',
+        reportUrlAsIs: true,
+      };
+      return this._send(req)
           .then(response => {
             if (response.status < 200 && response.status >= 300) {
               return Promise.reject();
@@ -1758,41 +2677,115 @@
     },
 
     deleteAccountSSHKey(id) {
-      return this.send('DELETE', '/accounts/self/sshkeys/' + id);
+      return this._send({
+        method: 'DELETE',
+        url: '/accounts/self/sshkeys/' + id,
+        anonymizedUrl: '/accounts/self/sshkeys/*',
+      });
     },
 
-    deleteVote(changeNum, account, label) {
-      const e = `/reviewers/${account}/votes/${encodeURIComponent(label)}`;
-      return this.getChangeURLAndSend(changeNum, 'DELETE', null, e);
+    getAccountGPGKeys() {
+      return this._fetchJSON({
+        url: '/accounts/self/gpgkeys',
+        reportUrlAsIs: true,
+      });
     },
 
-    setDescription(changeNum, patchNum, desc) {
-      const p = {description: desc};
-      return this.getChangeURLAndSend(changeNum, 'PUT', patchNum,
-          '/description', p);
-    },
-
-    confirmEmail(token) {
-      return this.send('PUT', '/config/server/email.confirm', {token})
+    addAccountGPGKey(key) {
+      const req = {
+        method: 'POST',
+        url: '/accounts/self/gpgkeys',
+        body: key,
+        reportUrlAsIs: true,
+      };
+      return this._send(req)
           .then(response => {
-            if (response.status === 204) {
-              return 'Email confirmed successfully.';
+            if (response.status < 200 && response.status >= 300) {
+              return Promise.reject();
             }
-            return null;
+            return this.getResponseObject(response);
+          })
+          .then(obj => {
+            if (!obj) { return Promise.reject(); }
+            return obj;
           });
     },
 
-    getCapabilities(token) {
-      return this.fetchJSON('/config/server/capabilities');
+    deleteAccountGPGKey(id) {
+      return this._send({
+        method: 'DELETE',
+        url: '/accounts/self/gpgkeys/' + id,
+        anonymizedUrl: '/accounts/self/gpgkeys/*',
+      });
+    },
+
+    deleteVote(changeNum, account, label) {
+      return this._getChangeURLAndSend({
+        changeNum,
+        method: 'DELETE',
+        endpoint: `/reviewers/${account}/votes/${encodeURIComponent(label)}`,
+        anonymizedEndpoint: '/reviewers/*/votes/*',
+      });
+    },
+
+    setDescription(changeNum, patchNum, desc) {
+      return this._getChangeURLAndSend({
+        changeNum,
+        method: 'PUT', patchNum,
+        endpoint: '/description',
+        body: {description: desc},
+        reportUrlAsIs: true,
+      });
+    },
+
+    confirmEmail(token) {
+      const req = {
+        method: 'PUT',
+        url: '/config/server/email.confirm',
+        body: {token},
+        reportUrlAsIs: true,
+      };
+      return this._send(req).then(response => {
+        if (response.status === 204) {
+          return 'Email confirmed successfully.';
+        }
+        return null;
+      });
+    },
+
+    getCapabilities(token, opt_errFn) {
+      return this._fetchJSON({
+        url: '/config/server/capabilities',
+        errFn: opt_errFn,
+        reportUrlAsIs: true,
+      });
+    },
+
+    getTopMenus(opt_errFn) {
+      return this._fetchJSON({
+        url: '/config/server/top-menus',
+        errFn: opt_errFn,
+        reportUrlAsIs: true,
+      });
     },
 
     setAssignee(changeNum, assignee) {
-      const p = {assignee};
-      return this.getChangeURLAndSend(changeNum, 'PUT', null, '/assignee', p);
+      return this._getChangeURLAndSend({
+        changeNum,
+        method: 'PUT',
+        endpoint: '/assignee',
+        body: {assignee},
+        reportUrlAsIs: true,
+      });
     },
 
     deleteAssignee(changeNum) {
-      return this.getChangeURLAndSend(changeNum, 'DELETE', null, '/assignee');
+      return this._getChangeURLAndSend({
+        changeNum,
+        method: 'DELETE',
+        endpoint: '/assignee',
+        reportUrlAsIs: true,
+      });
     },
 
     probePath(path) {
@@ -1807,16 +2800,22 @@
      * @param {number|string=} opt_message
      */
     startWorkInProgress(changeNum, opt_message) {
-      const payload = {};
+      const body = {};
       if (opt_message) {
-        payload.message = opt_message;
+        body.message = opt_message;
       }
-      return this.getChangeURLAndSend(changeNum, 'POST', null, '/wip', payload)
-          .then(response => {
-            if (response.status === 204) {
-              return 'Change marked as Work In Progress.';
-            }
-          });
+      const req = {
+        changeNum,
+        method: 'POST',
+        endpoint: '/wip',
+        body,
+        reportUrlAsIs: true,
+      };
+      return this._getChangeURLAndSend(req).then(response => {
+        if (response.status === 204) {
+          return 'Change marked as Work In Progress.';
+        }
+      });
     },
 
     /**
@@ -1825,8 +2824,14 @@
      * @param {function(?Response, string=)=} opt_errFn
      */
     startReview(changeNum, opt_body, opt_errFn) {
-      return this.getChangeURLAndSend(changeNum, 'POST', null, '/ready',
-          opt_body, opt_errFn);
+      return this._getChangeURLAndSend({
+        changeNum,
+        method: 'POST',
+        endpoint: '/ready',
+        body: opt_body,
+        errFn: opt_errFn,
+        reportUrlAsIs: true,
+      });
     },
 
     /**
@@ -1835,10 +2840,15 @@
      * parameter.
      */
     deleteComment(changeNum, patchNum, commentID, reason) {
-      const endpoint = `/comments/${commentID}/delete`;
-      const payload = {reason};
-      return this.getChangeURLAndSend(changeNum, 'POST', patchNum, endpoint,
-          payload).then(this.getResponseObject.bind(this));
+      return this._getChangeURLAndSend({
+        changeNum,
+        method: 'POST',
+        patchNum,
+        endpoint: `/comments/${commentID}/delete`,
+        body: {reason},
+        parseResponse: true,
+        anonymizedEndpoint: '/comments/*/delete',
+      });
     },
 
     /**
@@ -1850,7 +2860,14 @@
      */
     getChange(changeNum, opt_errFn) {
       // Cannot use _changeBaseURL, as this function is used by _projectLookup.
-      return this.fetchJSON(`/changes/${changeNum}`, opt_errFn);
+      return this._fetchJSON({
+        url: `/changes/?q=change:${changeNum}`,
+        errFn: opt_errFn,
+        anonymizedUrl: '/changes/?q=change:*',
+      }).then(res => {
+        if (!res || !res.length) { return null; }
+        return res[0];
+      });
     },
 
     /**
@@ -1893,42 +2910,71 @@
     /**
      * Alias for _changeBaseURL.then(send).
      * @todo(beckysiegel) clean up comments
-     * @param {string|number} changeNum
-     * @param {string} method
-     * @param {?string|number} patchNum gets passed as null.
-     * @param {?string} endpoint gets passed as null.
-     * @param {?Object|number|string=} opt_payload gets passed as null, string,
-     *    Object, or number.
-     * @param {function(?Response, string=)=} opt_errFn
-     * @param {?=} opt_ctx
-     * @param {?=} opt_contentType
+     * @param {Defs.ChangeSendRequest} req
      * @return {!Promise<!Object>}
      */
-    getChangeURLAndSend(changeNum, method, patchNum, endpoint, opt_payload,
-        opt_errFn, opt_ctx, opt_contentType) {
-      return this._changeBaseURL(changeNum, patchNum).then(url => {
-        return this.send(method, url + endpoint, opt_payload, opt_errFn,
-            opt_ctx, opt_contentType);
+    _getChangeURLAndSend(req) {
+      const anonymizedBaseUrl = req.patchNum ?
+          ANONYMIZED_REVISION_BASE_URL : ANONYMIZED_CHANGE_BASE_URL;
+      const anonymizedEndpoint = req.reportEndpointAsIs ?
+          req.endpoint : req.anonymizedEndpoint;
+
+      return this._changeBaseURL(req.changeNum, req.patchNum).then(url => {
+        return this._send({
+          method: req.method,
+          url: url + req.endpoint,
+          body: req.body,
+          errFn: req.errFn,
+          contentType: req.contentType,
+          headers: req.headers,
+          parseResponse: req.parseResponse,
+          anonymizedUrl: anonymizedEndpoint ?
+              (anonymizedBaseUrl + anonymizedEndpoint) : undefined,
+        });
       });
     },
 
-   /**
-    * Alias for _changeBaseURL.then(fetchJSON).
-    * @todo(beckysiegel) clean up comments
-    * @param {string|number} changeNum
-    * @param {string} endpoint
-    * @param {?string|number=} opt_patchNum gets passed as null.
-    * @param {?function(?Response, string=)=} opt_errFn gets passed as null.
-    * @param {?function()=} opt_cancelCondition gets passed as null.
-    * @param {?Object=} opt_params gets passed as null.
-    * @param {!Object=} opt_options
-    * @return {!Promise<!Object>}
-    */
-    _getChangeURLAndFetch(changeNum, endpoint, opt_patchNum, opt_errFn,
-        opt_cancelCondition, opt_params, opt_options) {
-      return this._changeBaseURL(changeNum, opt_patchNum).then(url => {
-        return this.fetchJSON(url + endpoint, opt_errFn, opt_cancelCondition,
-            opt_params, opt_options);
+    /**
+     * Alias for _changeBaseURL.then(_fetchJSON).
+     * @param {Defs.ChangeFetchRequest} req
+     * @return {!Promise<!Object>}
+     */
+    _getChangeURLAndFetch(req) {
+      const anonymizedEndpoint = req.reportEndpointAsIs ?
+          req.endpoint : req.anonymizedEndpoint;
+      const anonymizedBaseUrl = req.patchNum ?
+          ANONYMIZED_REVISION_BASE_URL : ANONYMIZED_CHANGE_BASE_URL;
+      return this._changeBaseURL(req.changeNum, req.patchNum).then(url => {
+        return this._fetchJSON({
+          url: url + req.endpoint,
+          errFn: req.errFn,
+          params: req.params,
+          fetchOptions: req.fetchOptions,
+          anonymizedUrl: anonymizedEndpoint ?
+              (anonymizedBaseUrl + anonymizedEndpoint) : undefined,
+        });
+      });
+    },
+
+    /**
+     * Execute a change action or revision action on a change.
+     * @param {number} changeNum
+     * @param {string} method
+     * @param {string} endpoint
+     * @param {string|number|undefined} opt_patchNum
+     * @param {Object=} opt_payload
+     * @param {?function(?Response, string=)=} opt_errFn
+     * @return {Promise}
+     */
+    executeChangeAction(changeNum, method, endpoint, opt_patchNum, opt_payload,
+        opt_errFn) {
+      return this._getChangeURLAndSend({
+        changeNum,
+        method,
+        patchNum: opt_patchNum,
+        endpoint,
+        body: opt_payload,
+        errFn: opt_errFn,
       });
     },
 
@@ -1943,9 +2989,13 @@
      */
     getBlame(changeNum, patchNum, path, opt_base) {
       const encodedPath = encodeURIComponent(path);
-      return this._getChangeURLAndFetch(changeNum,
-          `/files/${encodedPath}/blame`, patchNum, undefined, undefined,
-          opt_base ? {base: 't'} : undefined);
+      return this._getChangeURLAndFetch({
+        changeNum,
+        endpoint: `/files/${encodedPath}/blame`,
+        patchNum,
+        params: opt_base ? {base: 't'} : undefined,
+        anonymizedEndpoint: '/files/*/blame',
+      });
     },
 
     /**
@@ -1976,5 +3026,57 @@
         return result;
       });
     },
+
+    /**
+     * Fetch a project dashboard definition.
+     * https://gerrit-review.googlesource.com/Documentation/rest-api-projects.html#get-dashboard
+     * @param {string} project
+     * @param {string} dashboard
+     * @param {function(?Response, string=)=} opt_errFn
+     *    passed as null sometimes.
+     * @return {!Promise<!Object>}
+     */
+    getDashboard(project, dashboard, opt_errFn) {
+      const url = '/projects/' + encodeURIComponent(project) + '/dashboards/' +
+          encodeURIComponent(dashboard);
+      return this._fetchSharedCacheURL({
+        url,
+        errFn: opt_errFn,
+        anonymizedUrl: '/projects/*/dashboards/*',
+      });
+    },
+
+    /**
+     * @param {string} filter
+     * @return {!Promise<?Object>}
+     */
+    getDocumentationSearches(filter) {
+      filter = filter.trim();
+      const encodedFilter = encodeURIComponent(filter);
+
+      // TODO(kaspern): Rename rest api from /projects/ to /repos/ once backend
+      // supports it.
+      return this._fetchSharedCacheURL({
+        url: `/Documentation/?q=${encodedFilter}`,
+        anonymizedUrl: '/Documentation/?*',
+      });
+    },
+
+    getMergeable(changeNum) {
+      return this._getChangeURLAndFetch({
+        changeNum,
+        endpoint: '/revisions/current/mergeable',
+        parseResponse: true,
+        reportEndpointAsIs: true,
+      });
+    },
+
+    deleteDraftComments(query) {
+      return this._send({
+        method: 'POST',
+        url: '/accounts/self/drafts:delete',
+        body: {query},
+      });
+    },
   });
 })();
diff --git a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface_test.html b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface_test.html
index ef2e14b..5d4a3b0 100644
--- a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -37,11 +38,15 @@
   suite('gr-rest-api-interface tests', () => {
     let element;
     let sandbox;
+    let ctr = 0;
 
     setup(() => {
+      // Modify CANONICAL_PATH to effectively reset cache.
+      ctr += 1;
+      window.CANONICAL_PATH = `test${ctr}`;
+
       sandbox = sinon.sandbox.create();
       element = fixture('basic');
-      element._cache = {};
       element._projectLookup = {};
       const testJSON = ')]}\'\n{"hello": "bonjour"}';
       sandbox.stub(window, 'fetch').returns(Promise.resolve({
@@ -57,7 +62,7 @@
     });
 
     test('JSON prefix is properly removed', done => {
-      element.fetchJSON('/dummy/url').then(obj => {
+      element._fetchJSON('/dummy/url').then(obj => {
         assert.deepEqual(obj, {hello: 'bonjour'});
         done();
       });
@@ -65,7 +70,7 @@
 
     test('cached results', done => {
       let n = 0;
-      sandbox.stub(element, 'fetchJSON', () => {
+      sandbox.stub(element, '_fetchJSON', () => {
         return Promise.resolve(++n);
       });
       const promises = [];
@@ -84,32 +89,45 @@
 
     test('cached promise', done => {
       const promise = Promise.reject('foo');
-      element._cache['/foo'] = promise;
-      element._fetchSharedCacheURL('/foo').catch(p => {
+      element._cache.set('/foo', promise);
+      element._fetchSharedCacheURL({url: '/foo'}).catch(p => {
         assert.equal(p, 'foo');
         done();
       });
     });
 
+    test('cache invalidation', () => {
+      element._cache.set('/foo/bar', 1);
+      element._cache.set('/bar', 2);
+      element._sharedFetchPromises['/foo/bar'] = 3;
+      element._sharedFetchPromises['/bar'] = 4;
+      element._invalidateSharedFetchPromisesPrefix('/foo/');
+      assert.isFalse(element._cache.has('/foo/bar'));
+      assert.isTrue(element._cache.has('/bar'));
+      assert.isUndefined(element._sharedFetchPromises['/foo/bar']);
+      assert.strictEqual(4, element._sharedFetchPromises['/bar']);
+    });
+
     test('params are properly encoded', () => {
       let url = element._urlWithParams('/path/', {
         sp: 'hola',
         gr: 'guten tag',
         noval: null,
       });
-      assert.equal(url, '/path/?sp=hola&gr=guten%20tag&noval');
+      assert.equal(url,
+          window.CANONICAL_PATH + '/path/?sp=hola&gr=guten%20tag&noval');
 
       url = element._urlWithParams('/path/', {
         sp: 'hola',
         en: ['hey', 'hi'],
       });
-      assert.equal(url, '/path/?sp=hola&en=hey&en=hi');
+      assert.equal(url, window.CANONICAL_PATH + '/path/?sp=hola&en=hey&en=hi');
 
       // Order must be maintained with array params.
       url = element._urlWithParams('/path/', {
         l: ['c', 'b', 'a'],
       });
-      assert.equal(url, '/path/?l=c&l=b&l=a');
+      assert.equal(url, window.CANONICAL_PATH + '/path/?l=c&l=b&l=a');
     });
 
     test('request callbacks can be canceled', done => {
@@ -119,7 +137,8 @@
           cancel() { cancelCalled = true; },
         },
       }));
-      element.fetchJSON('/dummy/url', null, () => { return true; }).then(
+      const cancelCondition = () => { return true; };
+      element._fetchJSON({url: '/dummy/url', cancelCondition}).then(
           obj => {
             assert.isUndefined(obj);
             assert.isTrue(cancelCalled);
@@ -128,7 +147,7 @@
     });
 
     test('parent diff comments are properly grouped', done => {
-      sandbox.stub(element, 'fetchJSON', () => {
+      sandbox.stub(element, '_fetchJSON', () => {
         return Promise.resolve({
           '/COMMIT_MSG': [],
           'sieve.go': [
@@ -271,7 +290,8 @@
     test('differing patch diff comments are properly grouped', done => {
       sandbox.stub(element, 'getFromProjectLookup')
           .returns(Promise.resolve('test'));
-      sandbox.stub(element, 'fetchJSON', url => {
+      sandbox.stub(element, '_fetchJSON', request => {
+        const url = request.url;
         if (url === '/changes/test~42/revisions/1') {
           return Promise.resolve({
             '/COMMIT_MSG': [],
@@ -385,11 +405,11 @@
     });
 
     suite('rebase action', () => {
-      let resolveFetchJSON;
+      let resolve_fetchJSON;
       setup(() => {
-        sandbox.stub(element, 'fetchJSON').returns(
+        sandbox.stub(element, '_fetchJSON').returns(
             new Promise(resolve => {
-              resolveFetchJSON = resolve;
+              resolve_fetchJSON = resolve;
             }));
       });
 
@@ -400,7 +420,7 @@
               assert.isFalse(response.rebase.rebaseOnCurrent);
               done();
             });
-        resolveFetchJSON({rebase: {}});
+        resolve_fetchJSON({rebase: {}});
       });
 
       test('rebase on current', done => {
@@ -410,7 +430,7 @@
               assert.isTrue(response.rebase.rebaseOnCurrent);
               done();
             });
-        resolveFetchJSON({rebase: {enabled: true}});
+        resolve_fetchJSON({rebase: {enabled: true}});
       });
     });
 
@@ -422,7 +442,7 @@
         element.addEventListener('server-error', resolve);
       });
 
-      element.fetchJSON().then(response => {
+      element._fetchJSON({}).then(response => {
         assert.isUndefined(response);
         assert.isTrue(getResponseObjectStub.notCalled);
         serverErrorEventPromise.then(() => done());
@@ -438,16 +458,16 @@
           Promise.reject({message: 'Failed to fetch'}));
       window.fetch.onSecondCall().returns(Promise.resolve(fakeAuthResponse));
       // Emulate logged in.
-      element._cache['/accounts/self/detail'] = {};
+      element._cache.set('/accounts/self/detail', {});
       const serverErrorStub = sandbox.stub();
       element.addEventListener('server-error', serverErrorStub);
       const authErrorStub = sandbox.stub();
       element.addEventListener('auth-error', authErrorStub);
-      element.fetchJSON('/bar').then(r => {
+      element._fetchJSON('/bar').then(r => {
         flush(() => {
           assert.isTrue(authErrorStub.called);
           assert.isFalse(serverErrorStub.called);
-          assert.isNull(element._cache['/accounts/self/detail']);
+          assert.isFalse(element._cache.has('/accounts/self/detail'));
           done();
         });
       });
@@ -468,7 +488,7 @@
       ];
       window.fetch.restore();
       sandbox.stub(window, 'fetch', url => {
-        if (url === '/accounts/self/detail') {
+        if (url === window.CANONICAL_PATH + '/accounts/self/detail') {
           return Promise.resolve(responses.shift());
         }
       });
@@ -482,20 +502,86 @@
       });
     });
 
+    test('checkCredentials promise rejection', () => {
+      window.fetch.restore();
+      element._cache.set('/accounts/self/detail', true);
+      sandbox.spy(element, 'checkCredentials');
+      sandbox.stub(window, 'fetch', url => {
+        return Promise.reject({message: 'Failed to fetch'});
+      });
+      return element.getConfig(true)
+          .catch(err => undefined)
+          .then(() => {
+            // When the top-level fetch call throws an error, it invokes
+            // checkCredentials, which in turn makes another fetch call.
+            // The second fetch call also fails, which leads to a second
+            // invocation of checkCredentials, which should immediately
+            // return instead of making further fetch calls.
+            assert.isTrue(element.checkCredentials.calledTwice);
+            assert.isTrue(window.fetch.calledTwice);
+          });
+    });
+
     test('legacy n,z key in change url is replaced', () => {
-      const stub = sandbox.stub(element, 'fetchJSON')
+      const stub = sandbox.stub(element, '_fetchJSON')
           .returns(Promise.resolve([]));
       element.getChanges(1, null, 'n,z');
-      assert.equal(stub.args[0][3].S, 0);
+      assert.equal(stub.lastCall.args[0].params.S, 0);
     });
 
     test('saveDiffPreferences invalidates cache line', () => {
       const cacheKey = '/accounts/self/preferences.diff';
-      sandbox.stub(element, 'send');
-      element._cache[cacheKey] = {tab_size: 4};
+      sandbox.stub(element, '_send');
+      element._cache.set(cacheKey, {tab_size: 4});
       element.saveDiffPreferences({tab_size: 8});
-      assert.isTrue(element.send.called);
-      assert.notOk(element._cache[cacheKey]);
+      assert.isTrue(element._send.called);
+      assert.isFalse(element._cache.has(cacheKey));
+    });
+
+    test('getAccount when resp is null does not add anything to the cache',
+        done => {
+          const cacheKey = '/accounts/self/detail';
+          const stub = sandbox.stub(element, '_fetchSharedCacheURL',
+              () => Promise.resolve());
+
+          element.getAccount().then(() => {
+            assert.isTrue(element._fetchSharedCacheURL.called);
+            assert.isFalse(element._cache.has(cacheKey));
+            done();
+          });
+
+          element._cache.set(cacheKey, 'fake cache');
+          stub.lastCall.args[0].errFn();
+        });
+
+    test('getAccount does not add to the cache when resp.status is 403',
+        done => {
+          const cacheKey = '/accounts/self/detail';
+          const stub = sandbox.stub(element, '_fetchSharedCacheURL',
+              () => Promise.resolve());
+
+          element.getAccount().then(() => {
+            assert.isTrue(element._fetchSharedCacheURL.called);
+            assert.isFalse(element._cache.has(cacheKey));
+            done();
+          });
+          element._cache.set(cacheKey, 'fake cache');
+          stub.lastCall.args[0].errFn({status: 403});
+        });
+
+    test('getAccount when resp is successful', done => {
+      const cacheKey = '/accounts/self/detail';
+      const stub = sandbox.stub(element, '_fetchSharedCacheURL',
+          () => Promise.resolve());
+
+      element.getAccount().then(response => {
+        assert.isTrue(element._fetchSharedCacheURL.called);
+        assert.equal(element._cache.get(cacheKey), 'fake cache');
+        done();
+      });
+      element._cache.set(cacheKey, 'fake cache');
+
+      stub.lastCall.args[0].errFn({});
     });
 
     const preferenceSetup = function(testJSON, loggedIn, smallScreen) {
@@ -570,46 +656,103 @@
         });
 
     test('savPreferences normalizes download scheme', () => {
-      sandbox.stub(element, 'send');
+      sandbox.stub(element, '_send');
       element.savePreferences({download_scheme: 'HTTP'});
-      assert.isTrue(element.send.called);
-      assert.equal(element.send.lastCall.args[2].download_scheme, 'http');
+      assert.isTrue(element._send.called);
+      assert.equal(element._send.lastCall.args[0].body.download_scheme, 'http');
     });
 
-    test('confirmEmail', () => {
-      sandbox.spy(element, 'send');
-      element.confirmEmail('foo');
-      assert.isTrue(element.send.calledWith(
-          'PUT', '/config/server/email.confirm', {token: 'foo'}));
-    });
+    test('getDiffPreferences returns correct defaults', done => {
+      sandbox.stub(element, 'getLoggedIn', () => Promise.resolve(false));
 
-    test('GrReviewerUpdatesParser.parse is used', () => {
-      sandbox.stub(GrReviewerUpdatesParser, 'parse').returns(
-          Promise.resolve('foo'));
-      return element.getChangeDetail(42).then(result => {
-        assert.isTrue(GrReviewerUpdatesParser.parse.calledOnce);
-        assert.equal(result, 'foo');
+      element.getDiffPreferences().then(obj => {
+        assert.equal(obj.auto_hide_diff_table_header, true);
+        assert.equal(obj.context, 10);
+        assert.equal(obj.cursor_blink_rate, 0);
+        assert.equal(obj.font_size, 12);
+        assert.equal(obj.ignore_whitespace, 'IGNORE_NONE');
+        assert.equal(obj.intraline_difference, true);
+        assert.equal(obj.line_length, 100);
+        assert.equal(obj.line_wrapping, false);
+        assert.equal(obj.show_line_endings, true);
+        assert.equal(obj.show_tabs, true);
+        assert.equal(obj.show_whitespace_errors, true);
+        assert.equal(obj.syntax_highlighting, true);
+        assert.equal(obj.tab_size, 8);
+        assert.equal(obj.theme, 'DEFAULT');
+        done();
       });
     });
 
-    test('setAccountStatus', done => {
-      sandbox.stub(element, 'send').returns(Promise.resolve('OOO'));
-      sandbox.stub(element, 'getResponseObject')
-          .returns(Promise.resolve('OOO'));
-      element._cache['/accounts/self/detail'] = {};
-      element.setAccountStatus('OOO').then(() => {
-        assert.isTrue(element.send.calledWith('PUT', '/accounts/self/status',
-            {status: 'OOO'}));
-        assert.deepEqual(element._cache['/accounts/self/detail'],
-            {status: 'OOO'});
+    test('saveDiffPreferences set show_tabs to false', () => {
+      sandbox.stub(element, '_send');
+      element.saveDiffPreferences({show_tabs: false});
+      assert.isTrue(element._send.called);
+      assert.equal(element._send.lastCall.args[0].body.show_tabs, false);
+    });
+
+    test('getEditPreferences returns correct defaults', done => {
+      sandbox.stub(element, 'getLoggedIn', () => {
+        return Promise.resolve(false);
+      });
+
+      element.getEditPreferences().then(obj => {
+        assert.equal(obj.auto_close_brackets, false);
+        assert.equal(obj.cursor_blink_rate, 0);
+        assert.equal(obj.hide_line_numbers, false);
+        assert.equal(obj.hide_top_menu, false);
+        assert.equal(obj.indent_unit, 2);
+        assert.equal(obj.indent_with_tabs, false);
+        assert.equal(obj.key_map_type, 'DEFAULT');
+        assert.equal(obj.line_length, 100);
+        assert.equal(obj.line_wrapping, false);
+        assert.equal(obj.match_brackets, true);
+        assert.equal(obj.show_base, false);
+        assert.equal(obj.show_tabs, true);
+        assert.equal(obj.show_whitespace_errors, true);
+        assert.equal(obj.syntax_highlighting, true);
+        assert.equal(obj.tab_size, 8);
+        assert.equal(obj.theme, 'DEFAULT');
         done();
       });
     });
 
+    test('saveEditPreferences set show_tabs to false', () => {
+      sandbox.stub(element, '_send');
+      element.saveEditPreferences({show_tabs: false});
+      assert.isTrue(element._send.called);
+      assert.equal(element._send.lastCall.args[0].body.show_tabs, false);
+    });
+
+    test('confirmEmail', () => {
+      sandbox.spy(element, '_send');
+      element.confirmEmail('foo');
+      assert.isTrue(element._send.calledOnce);
+      assert.equal(element._send.lastCall.args[0].method, 'PUT');
+      assert.equal(element._send.lastCall.args[0].url,
+          '/config/server/email.confirm');
+      assert.deepEqual(element._send.lastCall.args[0].body, {token: 'foo'});
+    });
+
+    test('setAccountStatus', () => {
+      sandbox.stub(element, '_send').returns(Promise.resolve('OOO'));
+      element._cache.set('/accounts/self/detail', {});
+      return element.setAccountStatus('OOO').then(() => {
+        assert.isTrue(element._send.calledOnce);
+        assert.equal(element._send.lastCall.args[0].method, 'PUT');
+        assert.equal(element._send.lastCall.args[0].url,
+            '/accounts/self/status');
+        assert.deepEqual(element._send.lastCall.args[0].body,
+            {status: 'OOO'});
+        assert.deepEqual(element._cache.get('/accounts/self/detail'),
+            {status: 'OOO'});
+      });
+    });
+
     suite('draft comments', () => {
       test('_sendDiffDraftRequest pending requests tracked', () => {
         const obj = element._pendingRequests;
-        sandbox.stub(element, 'getChangeURLAndSend', () => mockPromise());
+        sandbox.stub(element, '_getChangeURLAndSend', () => mockPromise());
         assert.notOk(element.hasPendingDiffDrafts());
 
         element._sendDiffDraftRequest(null, null, null, {});
@@ -631,7 +774,7 @@
       suite('_failForCreate200', () => {
         test('_sendDiffDraftRequest checks for 200 on create', () => {
           const sendPromise = Promise.resolve();
-          sandbox.stub(element, 'getChangeURLAndSend').returns(sendPromise);
+          sandbox.stub(element, '_getChangeURLAndSend').returns(sendPromise);
           const failStub = sandbox.stub(element, '_failForCreate200')
               .returns(Promise.resolve());
           return element._sendDiffDraftRequest('PUT', 123, 4, {}).then(() => {
@@ -641,7 +784,7 @@
         });
 
         test('_sendDiffDraftRequest no checks for 200 on non create', () => {
-          sandbox.stub(element, 'getChangeURLAndSend')
+          sandbox.stub(element, '_getChangeURLAndSend')
               .returns(Promise.resolve());
           const failStub = sandbox.stub(element, '_failForCreate200')
               .returns(Promise.resolve());
@@ -686,147 +829,331 @@
       });
     });
 
-    test('saveChangeEdit', done => {
+    test('saveChangeEdit', () => {
       element._projectLookup = {1: 'test'};
       const change_num = '1';
       const file_name = 'index.php';
       const file_contents = '<?php';
-      sandbox.stub(element, 'send').returns(
-          Promise.resolve([change_num, file_name, file_contents])
-      );
+      sandbox.stub(element, '_send').returns(
+          Promise.resolve([change_num, file_name, file_contents]));
       sandbox.stub(element, 'getResponseObject')
           .returns(Promise.resolve([change_num, file_name, file_contents]));
-      element._cache['/changes/' + change_num + '/edit/' + file_name] = {};
-      element.saveChangeEdit(change_num, file_name, file_contents).then(() => {
-        assert.isTrue(element.send.calledWith('PUT',
-            '/changes/test~1/edit/' + file_name,
-            file_contents));
-        done();
-      });
+      element._cache.set('/changes/' + change_num + '/edit/' + file_name, {});
+      return element.saveChangeEdit(change_num, file_name, file_contents)
+          .then(() => {
+            assert.isTrue(element._send.calledOnce);
+            assert.equal(element._send.lastCall.args[0].method, 'PUT');
+            assert.equal(element._send.lastCall.args[0].url,
+                '/changes/test~1/edit/' + file_name);
+            assert.equal(element._send.lastCall.args[0].body, file_contents);
+          });
     });
 
-    test('putChangeCommitMessage', done => {
+    test('putChangeCommitMessage', () => {
       element._projectLookup = {1: 'test'};
       const change_num = '1';
       const message = 'this is a commit message';
-      sandbox.stub(element, 'send').returns(
-          Promise.resolve([change_num, message])
-      );
+      sandbox.stub(element, '_send').returns(
+          Promise.resolve([change_num, message]));
       sandbox.stub(element, 'getResponseObject')
           .returns(Promise.resolve([change_num, message]));
-      element._cache['/changes/' + change_num + '/message'] = {};
-      element.putChangeCommitMessage(change_num, message).then(() => {
-        assert.isTrue(element.send.calledWith('PUT',
-            '/changes/test~1/message', {message}));
-        done();
+      element._cache.set('/changes/' + change_num + '/message', {});
+      return element.putChangeCommitMessage(change_num, message).then(() => {
+        assert.isTrue(element._send.calledOnce);
+        assert.equal(element._send.lastCall.args[0].method, 'PUT');
+        assert.equal(element._send.lastCall.args[0].url,
+            '/changes/test~1/message');
+        assert.deepEqual(element._send.lastCall.args[0].body, {message});
       });
     });
 
     test('startWorkInProgress', () => {
-      sandbox.stub(element, 'getChangeURLAndSend')
+      const sendStub = sandbox.stub(element, '_getChangeURLAndSend')
           .returns(Promise.resolve('ok'));
       element.startWorkInProgress('42');
-      assert.isTrue(element.getChangeURLAndSend.calledWith(
-          '42', 'POST', null, '/wip', {}));
+      assert.isTrue(sendStub.calledOnce);
+      assert.equal(sendStub.lastCall.args[0].changeNum, '42');
+      assert.equal(sendStub.lastCall.args[0].method, 'POST');
+      assert.isNotOk(sendStub.lastCall.args[0].patchNum);
+      assert.equal(sendStub.lastCall.args[0].endpoint, '/wip');
+      assert.deepEqual(sendStub.lastCall.args[0].body, {});
+
       element.startWorkInProgress('42', 'revising...');
-      assert.isTrue(element.getChangeURLAndSend.calledWith(
-          '42', 'POST', null, '/wip', {message: 'revising...'}));
+      assert.isTrue(sendStub.calledTwice);
+      assert.equal(sendStub.lastCall.args[0].changeNum, '42');
+      assert.equal(sendStub.lastCall.args[0].method, 'POST');
+      assert.isNotOk(sendStub.lastCall.args[0].patchNum);
+      assert.equal(sendStub.lastCall.args[0].endpoint, '/wip');
+      assert.deepEqual(sendStub.lastCall.args[0].body,
+          {message: 'revising...'});
     });
 
     test('startReview', () => {
-      sandbox.stub(element, 'getChangeURLAndSend')
+      const sendStub = sandbox.stub(element, '_getChangeURLAndSend')
           .returns(Promise.resolve({}));
       element.startReview('42', {message: 'Please review.'});
-      assert.isTrue(element.getChangeURLAndSend.calledWith(
-          '42', 'POST', null, '/ready', {message: 'Please review.'}));
+      assert.isTrue(sendStub.calledOnce);
+      assert.equal(sendStub.lastCall.args[0].changeNum, '42');
+      assert.equal(sendStub.lastCall.args[0].method, 'POST');
+      assert.isNotOk(sendStub.lastCall.args[0].patchNum);
+      assert.equal(sendStub.lastCall.args[0].endpoint, '/ready');
+      assert.deepEqual(sendStub.lastCall.args[0].body,
+          {message: 'Please review.'});
     });
 
-    test('deleteComment', done => {
-      sandbox.stub(element, 'getChangeURLAndSend').returns(Promise.resolve());
-      sandbox.stub(element, 'getResponseObject').returns('some response');
-      element.deleteComment('foo', 'bar', '01234', 'removal reason')
+    test('deleteComment', () => {
+      const sendStub = sandbox.stub(element, '_getChangeURLAndSend')
+          .returns(Promise.resolve('some response'));
+      return element.deleteComment('foo', 'bar', '01234', 'removal reason')
           .then(response => {
             assert.equal(response, 'some response');
-            done();
+            assert.isTrue(sendStub.calledOnce);
+            assert.equal(sendStub.lastCall.args[0].changeNum, 'foo');
+            assert.equal(sendStub.lastCall.args[0].method, 'POST');
+            assert.equal(sendStub.lastCall.args[0].patchNum, 'bar');
+            assert.equal(sendStub.lastCall.args[0].endpoint,
+                '/comments/01234/delete');
+            assert.deepEqual(sendStub.lastCall.args[0].body,
+                {reason: 'removal reason'});
           });
-      assert.isTrue(element.getChangeURLAndSend.calledWith(
-          'foo', 'POST', 'bar', '/comments/01234/delete',
-          {reason: 'removal reason'}));
     });
 
-    test('createProject encodes name', () => {
-      const sendStub = sandbox.stub(element, 'send');
-      element.createProject({name: 'x/y'});
-      assert.equal(sendStub.lastCall.args[1], '/projects/x%2Fy');
+    test('createRepo encodes name', () => {
+      const sendStub = sandbox.stub(element, '_send')
+          .returns(Promise.resolve());
+      return element.createRepo({name: 'x/y'}).then(() => {
+        assert.isTrue(sendStub.calledOnce);
+        assert.equal(sendStub.lastCall.args[0].url, '/projects/x%2Fy');
+      });
     });
 
-    test('getProjects', () => {
-      sandbox.stub(element, '_fetchSharedCacheURL');
-      element.getProjects('test', 25);
-      assert.isTrue(element._fetchSharedCacheURL.lastCall
-          .calledWithExactly('/projects/?d&n=26&S=0&m=test'));
-
-      element.getProjects(null, 25);
-      assert.isTrue(element._fetchSharedCacheURL.lastCall
-          .calledWithExactly('/projects/?d&n=26&S=0'));
-
-      element.getProjects('test', 25, 25);
-      assert.isTrue(element._fetchSharedCacheURL.lastCall
-          .calledWithExactly('/projects/?d&n=26&S=25&m=test'));
+    test('queryChangeFiles', () => {
+      const fetchStub = sandbox.stub(element, '_getChangeURLAndFetch')
+          .returns(Promise.resolve());
+      return element.queryChangeFiles('42', 'edit', 'test/path.js').then(() => {
+        assert.equal(fetchStub.lastCall.args[0].changeNum, '42');
+        assert.equal(fetchStub.lastCall.args[0].endpoint,
+            '/files?q=test%2Fpath.js');
+        assert.equal(fetchStub.lastCall.args[0].patchNum, 'edit');
+      });
     });
 
-    test('getProjects filter', () => {
-      sandbox.stub(element, '_fetchSharedCacheURL');
-      element.getProjects('test/test/test', 25);
-      assert.isTrue(element._fetchSharedCacheURL.lastCall
-          .calledWithExactly('/projects/?d&n=26&S=0&m=test%2Ftest%2Ftest'));
+    test('normal use', () => {
+      const defaultQuery = 'state%3Aactive%20OR%20state%3Aread-only';
+
+      assert.equal(element._getReposUrl('test', 25),
+          '/projects/?n=26&S=0&query=test');
+
+      assert.equal(element._getReposUrl(null, 25),
+          `/projects/?n=26&S=0&query=${defaultQuery}`);
+
+      assert.equal(element._getReposUrl('test', 25, 25),
+          '/projects/?n=26&S=25&query=test');
     });
 
-    test('getProjects filter regex', () => {
-      sandbox.stub(element, '_fetchSharedCacheURL');
-      element.getProjects('^test.*', 25);
-      assert.isTrue(element._fetchSharedCacheURL.lastCall
-          .calledWithExactly('/projects/?d&n=26&S=0&r=%5Etest.*'));
+    test('invalidateReposCache', () => {
+      const url = '/projects/?n=26&S=0&query=test';
+
+      element._cache.set(url, {});
+
+      element.invalidateReposCache();
+
+      assert.isUndefined(element._sharedFetchPromises[url]);
+
+      assert.isFalse(element._cache.has(url));
     });
 
-    test('getGroups filter regex', () => {
-      sandbox.stub(element, '_fetchSharedCacheURL');
-      element.getGroups('^test.*', 25);
-      assert.isTrue(element._fetchSharedCacheURL.lastCall
-          .calledWithExactly('/groups/?n=26&S=0&r=%5Etest.*'));
+    suite('getRepos', () => {
+      const defaultQuery = 'state%3Aactive%20OR%20state%3Aread-only';
+
+      setup(() => {
+        sandbox.stub(element, '_fetchSharedCacheURL');
+      });
+
+      test('normal use', () => {
+        element.getRepos('test', 25);
+        assert.equal(element._fetchSharedCacheURL.lastCall.args[0].url,
+            '/projects/?n=26&S=0&query=test');
+
+        element.getRepos(null, 25);
+        assert.equal(element._fetchSharedCacheURL.lastCall.args[0].url,
+            `/projects/?n=26&S=0&query=${defaultQuery}`);
+
+        element.getRepos('test', 25, 25);
+        assert.equal(element._fetchSharedCacheURL.lastCall.args[0].url,
+            '/projects/?n=26&S=25&query=test');
+      });
+
+      test('with blank', () => {
+        element.getRepos('test/test', 25);
+        assert.equal(element._fetchSharedCacheURL.lastCall.args[0].url,
+            '/projects/?n=26&S=0&query=inname%3Atest%20AND%20inname%3Atest');
+      });
+
+      test('with hyphen', () => {
+        element.getRepos('foo-bar', 25);
+        assert.equal(element._fetchSharedCacheURL.lastCall.args[0].url,
+            '/projects/?n=26&S=0&query=inname%3Afoo%20AND%20inname%3Abar');
+      });
+
+      test('with leading hyphen', () => {
+        element.getRepos('-bar', 25);
+        assert.equal(element._fetchSharedCacheURL.lastCall.args[0].url,
+            '/projects/?n=26&S=0&query=inname%3Abar');
+      });
+
+      test('with trailing hyphen', () => {
+        element.getRepos('foo-bar-', 25);
+        assert.equal(element._fetchSharedCacheURL.lastCall.args[0].url,
+            '/projects/?n=26&S=0&query=inname%3Afoo%20AND%20inname%3Abar');
+      });
+
+      test('with underscore', () => {
+        element.getRepos('foo_bar', 25);
+        assert.equal(element._fetchSharedCacheURL.lastCall.args[0].url,
+            '/projects/?n=26&S=0&query=inname%3Afoo%20AND%20inname%3Abar');
+      });
+
+      test('with underscore', () => {
+        element.getRepos('foo_bar', 25);
+        assert.equal(element._fetchSharedCacheURL.lastCall.args[0].url,
+            '/projects/?n=26&S=0&query=inname%3Afoo%20AND%20inname%3Abar');
+      });
+
+      test('hyphen only', () => {
+        element.getRepos('-', 25);
+        assert.equal(element._fetchSharedCacheURL.lastCall.args[0].url,
+            `/projects/?n=26&S=0&query=${defaultQuery}`);
+      });
+    });
+
+    test('_getGroupsUrl normal use', () => {
+      assert.equal(element._getGroupsUrl('test', 25),
+          '/groups/?n=26&S=0&m=test');
+
+      assert.equal(element._getGroupsUrl(null, 25),
+          '/groups/?n=26&S=0');
+
+      assert.equal(element._getGroupsUrl('test', 25, 25),
+          '/groups/?n=26&S=25&m=test');
+    });
+
+    test('invalidateGroupsCache', () => {
+      const url = '/groups/?n=26&S=0&m=test';
+
+      element._cache.set(url, {});
+
+      element.invalidateGroupsCache();
+
+      assert.isUndefined(element._sharedFetchPromises[url]);
+
+      assert.isFalse(element._cache.has(url));
+    });
+
+    suite('getGroups', () => {
+      setup(() => {
+        sandbox.stub(element, '_fetchSharedCacheURL');
+      });
+
+      test('normal use', () => {
+        element.getGroups('test', 25);
+        assert.equal(element._fetchSharedCacheURL.lastCall.args[0].url,
+            '/groups/?n=26&S=0&m=test');
+
+        element.getGroups(null, 25);
+        assert.equal(element._fetchSharedCacheURL.lastCall.args[0].url,
+            '/groups/?n=26&S=0');
+
+        element.getGroups('test', 25, 25);
+        assert.equal(element._fetchSharedCacheURL.lastCall.args[0].url,
+            '/groups/?n=26&S=25&m=test');
+      });
+
+      test('regex', () => {
+        element.getGroups('^test.*', 25);
+        assert.equal(element._fetchSharedCacheURL.lastCall.args[0].url,
+            '/groups/?n=26&S=0&r=%5Etest.*');
+
+        element.getGroups('^test.*', 25, 25);
+        assert.equal(element._fetchSharedCacheURL.lastCall.args[0].url,
+            '/groups/?n=26&S=25&r=%5Etest.*');
+      });
     });
 
     test('gerrit auth is used', () => {
       sandbox.stub(Gerrit.Auth, 'fetch').returns(Promise.resolve());
-      element.fetchJSON('foo');
+      element._fetchJSON('foo');
       assert(Gerrit.Auth.fetch.called);
     });
 
-    test('getSuggestedAccounts does not return fetchJSON', () => {
-      const fetchJSONSpy = sandbox.spy(element, 'fetchJSON');
+    test('getSuggestedAccounts does not return _fetchJSON', () => {
+      const _fetchJSONSpy = sandbox.spy(element, '_fetchJSON');
       return element.getSuggestedAccounts().then(accts => {
-        assert.isFalse(fetchJSONSpy.called);
+        assert.isFalse(_fetchJSONSpy.called);
         assert.equal(accts.length, 0);
       });
     });
 
-    test('fetchJSON gets called by getSuggestedAccounts', () => {
-      const fetchJSONStub = sandbox.stub(element, 'fetchJSON',
+    test('_fetchJSON gets called by getSuggestedAccounts', () => {
+      const _fetchJSONStub = sandbox.stub(element, '_fetchJSON',
           () => Promise.resolve());
       return element.getSuggestedAccounts('own').then(() => {
-        assert.deepEqual(fetchJSONStub.lastCall.args[3], {
+        assert.deepEqual(_fetchJSONStub.lastCall.args[0].params, {
           q: 'own',
           suggest: null,
         });
       });
     });
 
-    suite('_getChangeDetail', () => {
+    suite('getChangeDetail', () => {
+      suite('change detail options', () => {
+        let toHexStub;
+
+        setup(() => {
+          toHexStub = sandbox.stub(element, 'listChangesOptionsToHex',
+              options => 'deadbeef');
+          sandbox.stub(element, '_getChangeDetail',
+              async (changeNum, options) => ({changeNum, options}));
+        });
+
+        test('signed pushes disabled', async () => {
+          const {PUSH_CERTIFICATES} = element.ListChangesOption;
+          sandbox.stub(element, 'getConfig', async () => ({}));
+          const {changeNum, options} = await element.getChangeDetail(123);
+          assert.strictEqual(123, changeNum);
+          assert.strictEqual('deadbeef', options);
+          assert.isTrue(toHexStub.calledOnce);
+          assert.isFalse(toHexStub.lastCall.args.includes(PUSH_CERTIFICATES));
+        });
+
+        test('signed pushes enabled', async () => {
+          const {PUSH_CERTIFICATES} = element.ListChangesOption;
+          sandbox.stub(element, 'getConfig', async () => {
+            return {receive: {enable_signed_push: true}};
+          });
+          const {changeNum, options} = await element.getChangeDetail(123);
+          assert.strictEqual(123, changeNum);
+          assert.strictEqual('deadbeef', options);
+          assert.isTrue(toHexStub.calledOnce);
+          assert.isTrue(toHexStub.lastCall.args.includes(PUSH_CERTIFICATES));
+        });
+      });
+
+      test('GrReviewerUpdatesParser.parse is used', () => {
+        sandbox.stub(GrReviewerUpdatesParser, 'parse').returns(
+            Promise.resolve('foo'));
+        return element.getChangeDetail(42).then(result => {
+          assert.isTrue(GrReviewerUpdatesParser.parse.calledOnce);
+          assert.equal(result, 'foo');
+        });
+      });
+
       test('_getChangeDetail passes params to ETags decorator', () => {
         const changeNum = 4321;
         element._projectLookup[changeNum] = 'test';
         const params = {foo: 'bar'};
-        const expectedUrl = '/changes/test~4321/detail?foo=bar';
+        const expectedUrl =
+            window.CANONICAL_PATH + '/changes/test~4321/detail?foo=bar';
         sandbox.stub(element._etags, 'getOptions');
         sandbox.stub(element._etags, 'collect');
         return element._getChangeDetail(changeNum, params).then(() => {
@@ -838,6 +1165,8 @@
 
       test('_getChangeDetail calls errFn on 500', () => {
         const errFn = sinon.stub();
+        sandbox.stub(element, 'getChangeActionURL')
+            .returns(Promise.resolve(''));
         sandbox.stub(element, '_fetchRawJSON')
             .returns(Promise.resolve({ok: false, status: 500}));
         return element._getChangeDetail(123, {}, errFn).then(() => {
@@ -846,6 +1175,8 @@
       });
 
       test('_getChangeDetail populates _projectLookup', () => {
+        sandbox.stub(element, 'getChangeActionURL')
+            .returns(Promise.resolve(''));
         sandbox.stub(element, '_fetchRawJSON')
             .returns(Promise.resolve({ok: true}));
 
@@ -916,7 +1247,7 @@
     suite('getFromProjectLookup', () => {
       test('getChange fails', () => {
         sandbox.stub(element, 'getChange')
-            .returns(Promise.resolve());
+            .returns(Promise.resolve(null));
         return element.getFromProjectLookup().then(val => {
           assert.strictEqual(val, undefined);
           assert.deepEqual(element._projectLookup, {});
@@ -924,7 +1255,7 @@
       });
 
       test('getChange succeeds, no project', () => {
-        sandbox.stub(element, 'getChange').returns(Promise.resolve());
+        sandbox.stub(element, 'getChange').returns(Promise.resolve(null));
         return element.getFromProjectLookup().then(val => {
           assert.strictEqual(val, undefined);
           assert.deepEqual(element._projectLookup, {});
@@ -943,7 +1274,7 @@
 
     suite('getChanges populates _projectLookup', () => {
       test('multiple queries', () => {
-        sandbox.stub(element, 'fetchJSON')
+        sandbox.stub(element, '_fetchJSON')
             .returns(Promise.resolve([
               [
                 {_number: 1, project: 'test'},
@@ -952,7 +1283,7 @@
                 {_number: 3, project: 'test/test'},
               ],
             ]));
-        // When opt_query instanceof Array, fetchJSON returns
+        // When opt_query instanceof Array, _fetchJSON returns
         // Array<Array<Object>>.
         return element.getChanges(null, []).then(() => {
           assert.equal(Object.keys(element._projectLookup).length, 3);
@@ -963,14 +1294,14 @@
       });
 
       test('no query', () => {
-        sandbox.stub(element, 'fetchJSON')
+        sandbox.stub(element, '_fetchJSON')
             .returns(Promise.resolve([
               {_number: 1, project: 'test'},
               {_number: 2, project: 'test'},
               {_number: 3, project: 'test/test'},
             ]));
 
-        // When opt_query !instanceof Array, fetchJSON returns
+        // When opt_query !instanceof Array, _fetchJSON returns
         // Array<Object>.
         return element.getChanges().then(() => {
           assert.equal(Object.keys(element._projectLookup).length, 3);
@@ -983,19 +1314,31 @@
 
     test('_getChangeURLAndFetch', () => {
       element._projectLookup = {1: 'test'};
-      const fetchStub = sandbox.stub(element, 'fetchJSON')
+      const fetchStub = sandbox.stub(element, '_fetchJSON')
           .returns(Promise.resolve());
-      return element._getChangeURLAndFetch(1, '/test', 1).then(() => {
-        assert.isTrue(fetchStub.calledWith('/changes/test~1/revisions/1/test'));
+      const req = {changeNum: 1, endpoint: '/test', patchNum: 1};
+      return element._getChangeURLAndFetch(req).then(() => {
+        assert.equal(fetchStub.lastCall.args[0].url,
+            '/changes/test~1/revisions/1/test');
       });
     });
 
-    test('getChangeURLAndSend', () => {
+    test('_getChangeURLAndSend', () => {
       element._projectLookup = {1: 'test'};
-      const sendStub = sandbox.stub(element, 'send').returns(Promise.resolve());
-      return element.getChangeURLAndSend(1, 'POST', 1, '/test').then(() => {
-        assert.isTrue(sendStub.calledWith('POST',
-            '/changes/test~1/revisions/1/test'));
+      const sendStub = sandbox.stub(element, '_send')
+          .returns(Promise.resolve());
+
+      const req = {
+        changeNum: 1,
+        method: 'POST',
+        patchNum: 1,
+        endpoint: '/test',
+      };
+      return element._getChangeURLAndSend(req).then(() => {
+        assert.isTrue(sendStub.calledOnce);
+        assert.equal(sendStub.lastCall.args[0].method, 'POST');
+        assert.equal(sendStub.lastCall.args[0].url,
+            '/changes/test~1/revisions/1/test');
       });
     });
 
@@ -1019,26 +1362,227 @@
     });
 
     test('setChangeTopic', () => {
-      const sendSpy = sandbox.spy(element, 'getChangeURLAndSend');
+      const sendSpy = sandbox.spy(element, '_getChangeURLAndSend');
       return element.setChangeTopic(123, 'foo-bar').then(() => {
         assert.isTrue(sendSpy.calledOnce);
-        assert.deepEqual(sendSpy.lastCall.args[4], {topic: 'foo-bar'});
+        assert.deepEqual(sendSpy.lastCall.args[0].body, {topic: 'foo-bar'});
       });
     });
 
     test('setChangeHashtag', () => {
-      const sendSpy = sandbox.spy(element, 'getChangeURLAndSend');
+      const sendSpy = sandbox.spy(element, '_getChangeURLAndSend');
       return element.setChangeHashtag(123, 'foo-bar').then(() => {
         assert.isTrue(sendSpy.calledOnce);
-        assert.equal(sendSpy.lastCall.args[4], 'foo-bar');
+        assert.equal(sendSpy.lastCall.args[0].body, 'foo-bar');
       });
     });
 
     test('generateAccountHttpPassword', () => {
-      const sendSpy = sandbox.spy(element, 'send');
+      const sendSpy = sandbox.spy(element, '_send');
       return element.generateAccountHttpPassword().then(() => {
         assert.isTrue(sendSpy.calledOnce);
-        assert.deepEqual(sendSpy.lastCall.args[2], {generate: true});
+        assert.deepEqual(sendSpy.lastCall.args[0].body, {generate: true});
+      });
+    });
+
+    suite('getChangeFiles', () => {
+      test('patch only', () => {
+        const fetchStub = sandbox.stub(element, '_getChangeURLAndFetch')
+            .returns(Promise.resolve());
+        const range = {basePatchNum: 'PARENT', patchNum: 2};
+        return element.getChangeFiles(123, range).then(() => {
+          assert.isTrue(fetchStub.calledOnce);
+          assert.equal(fetchStub.lastCall.args[0].patchNum, 2);
+          assert.isNotOk(fetchStub.lastCall.args[0].params);
+        });
+      });
+
+      test('simple range', () => {
+        const fetchStub = sandbox.stub(element, '_getChangeURLAndFetch')
+            .returns(Promise.resolve());
+        const range = {basePatchNum: 4, patchNum: 5};
+        return element.getChangeFiles(123, range).then(() => {
+          assert.isTrue(fetchStub.calledOnce);
+          assert.equal(fetchStub.lastCall.args[0].patchNum, 5);
+          assert.isOk(fetchStub.lastCall.args[0].params);
+          assert.equal(fetchStub.lastCall.args[0].params.base, 4);
+          assert.isNotOk(fetchStub.lastCall.args[0].params.parent);
+        });
+      });
+
+      test('parent index', () => {
+        const fetchStub = sandbox.stub(element, '_getChangeURLAndFetch')
+            .returns(Promise.resolve());
+        const range = {basePatchNum: -3, patchNum: 5};
+        return element.getChangeFiles(123, range).then(() => {
+          assert.isTrue(fetchStub.calledOnce);
+          assert.equal(fetchStub.lastCall.args[0].patchNum, 5);
+          assert.isOk(fetchStub.lastCall.args[0].params);
+          assert.isNotOk(fetchStub.lastCall.args[0].params.base);
+          assert.equal(fetchStub.lastCall.args[0].params.parent, 3);
+        });
+      });
+    });
+
+    suite('getDiff', () => {
+      test('patchOnly', () => {
+        const fetchStub = sandbox.stub(element, '_getChangeURLAndFetch')
+            .returns(Promise.resolve());
+        return element.getDiff(123, 'PARENT', 2, 'foo/bar.baz').then(() => {
+          assert.isTrue(fetchStub.calledOnce);
+          assert.equal(fetchStub.lastCall.args[0].patchNum, 2);
+          assert.isOk(fetchStub.lastCall.args[0].params);
+          assert.isNotOk(fetchStub.lastCall.args[0].params.parent);
+          assert.isNotOk(fetchStub.lastCall.args[0].params.base);
+        });
+      });
+
+      test('simple range', () => {
+        const fetchStub = sandbox.stub(element, '_getChangeURLAndFetch')
+            .returns(Promise.resolve());
+        return element.getDiff(123, 4, 5, 'foo/bar.baz').then(() => {
+          assert.isTrue(fetchStub.calledOnce);
+          assert.equal(fetchStub.lastCall.args[0].patchNum, 5);
+          assert.isOk(fetchStub.lastCall.args[0].params);
+          assert.isNotOk(fetchStub.lastCall.args[0].params.parent);
+          assert.equal(fetchStub.lastCall.args[0].params.base, 4);
+        });
+      });
+
+      test('parent index', () => {
+        const fetchStub = sandbox.stub(element, '_getChangeURLAndFetch')
+            .returns(Promise.resolve());
+        return element.getDiff(123, -3, 5, 'foo/bar.baz').then(() => {
+          assert.isTrue(fetchStub.calledOnce);
+          assert.equal(fetchStub.lastCall.args[0].patchNum, 5);
+          assert.isOk(fetchStub.lastCall.args[0].params);
+          assert.isNotOk(fetchStub.lastCall.args[0].params.base);
+          assert.equal(fetchStub.lastCall.args[0].params.parent, 3);
+        });
+      });
+    });
+
+    test('getDashboard', () => {
+      const fetchStub = sandbox.stub(element, '_fetchSharedCacheURL');
+      element.getDashboard('gerrit/project', 'default:main');
+      assert.isTrue(fetchStub.calledOnce);
+      assert.equal(
+          fetchStub.lastCall.args[0].url,
+          '/projects/gerrit%2Fproject/dashboards/default%3Amain');
+    });
+
+    test('getFileContent', () => {
+      sandbox.stub(element, '_getChangeURLAndSend')
+          .returns(Promise.resolve({
+            ok: 'true',
+            headers: {
+              get(header) {
+                if (header === 'X-FYI-Content-Type') {
+                  return 'text/java';
+                }
+              },
+            },
+          }));
+
+      sandbox.stub(element, 'getResponseObject')
+          .returns(Promise.resolve('new content'));
+
+      const edit = element.getFileContent('1', 'tst/path', 'EDIT').then(res => {
+        assert.deepEqual(res,
+            {content: 'new content', type: 'text/java', ok: true});
+      });
+
+      const normal = element.getFileContent('1', 'tst/path', '3').then(res => {
+        assert.deepEqual(res,
+            {content: 'new content', type: 'text/java', ok: true});
+      });
+
+      return Promise.all([edit, normal]);
+    });
+
+    test('getFileContent suppresses 404s', done => {
+      const res = {status: 404};
+      const handler = e => {
+        assert.isFalse(e.detail.res.status === 404);
+        done();
+      };
+      element.addEventListener('server-error', handler);
+      sandbox.stub(Gerrit.Auth, 'fetch').returns(Promise.resolve(res));
+      sandbox.stub(element, '_changeBaseURL').returns(Promise.resolve(''));
+      element.getFileContent('1', 'tst/path', '1').then(() => {
+        flushAsynchronousOperations();
+
+        res.status = 500;
+        element.getFileContent('1', 'tst/path', '1');
+      });
+    });
+
+    test('getChangeFilesOrEditFiles is edit-sensitive', () => {
+      const fn = element.getChangeOrEditFiles.bind(element);
+      const getChangeFilesStub = sandbox.stub(element, 'getChangeFiles')
+          .returns(Promise.resolve({}));
+      const getChangeEditFilesStub = sandbox.stub(element, 'getChangeEditFiles')
+          .returns(Promise.resolve({}));
+
+      return fn('1', {patchNum: 'edit'}).then(() => {
+        assert.isTrue(getChangeEditFilesStub.calledOnce);
+        assert.isFalse(getChangeFilesStub.called);
+        return fn('1', {patchNum: '1'}).then(() => {
+          assert.isTrue(getChangeEditFilesStub.calledOnce);
+          assert.isTrue(getChangeFilesStub.calledOnce);
+        });
+      });
+    });
+
+    test('_fetch forwards request and logs', () => {
+      const logStub = sandbox.stub(element, '_logCall');
+      const response = {status: 404, text: sinon.stub()};
+      const url = 'my url';
+      const fetchOptions = {method: 'DELETE'};
+      sandbox.stub(element._auth, 'fetch').returns(Promise.resolve(response));
+      const startTime = 123;
+      sandbox.stub(Date, 'now').returns(startTime);
+      const req = {url, fetchOptions};
+      return element._fetch(req).then(() => {
+        assert.isTrue(logStub.calledOnce);
+        assert.isTrue(logStub.calledWith(req, startTime, response.status));
+        assert.isFalse(response.text.called);
+      });
+    });
+
+    test('_logCall only reports requests with anonymized URLss', () => {
+      sandbox.stub(Date, 'now').returns(200);
+      const handler = sinon.stub();
+      element.addEventListener('rpc-log', handler);
+
+      element._logCall({url: 'url'}, 100, 200);
+      assert.isFalse(handler.called);
+
+      element._logCall({url: 'url', anonymizedUrl: 'not url'}, 100, 200);
+      flushAsynchronousOperations();
+      assert.isTrue(handler.calledOnce);
+    });
+
+    test('saveChangeStarred', async () => {
+      sandbox.stub(element, 'getFromProjectLookup')
+          .returns(Promise.resolve('test'));
+      const sendStub =
+          sandbox.stub(element, '_send').returns(Promise.resolve());
+
+      await element.saveChangeStarred(123, true);
+      assert.isTrue(sendStub.calledOnce);
+      assert.deepEqual(sendStub.lastCall.args[0], {
+        method: 'PUT',
+        url: '/accounts/self/starred.changes/test~123',
+        anonymizedUrl: '/accounts/self/starred.changes/*',
+      });
+
+      await element.saveChangeStarred(456, false);
+      assert.isTrue(sendStub.calledTwice);
+      assert.deepEqual(sendStub.lastCall.args[0], {
+        method: 'DELETE',
+        url: '/accounts/self/starred.changes/test~456',
+        anonymizedUrl: '/accounts/self/starred.changes/*',
       });
     });
   });
diff --git a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-reviewer-updates-parser.js b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-reviewer-updates-parser.js
index c119cdf..2451981 100644
--- a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-reviewer-updates-parser.js
+++ b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-reviewer-updates-parser.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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(window) {
   'use strict';
 
diff --git a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-reviewer-updates-parser_test.html b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-reviewer-updates-parser_test.html
index bf082e8..202c52a 100644
--- a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-reviewer-updates-parser_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-reviewer-updates-parser_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/mock-diff-response_test.html b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/mock-diff-response_test.html
index add07ea..0a1b14e 100644
--- a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/mock-diff-response_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/mock-diff-response_test.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/shared/gr-select/gr-select.html b/polygerrit-ui/app/elements/shared/gr-select/gr-select.html
index b0b6ea9..e73d41c 100644
--- a/polygerrit-ui/app/elements/shared/gr-select/gr-select.html
+++ b/polygerrit-ui/app/elements/shared/gr-select/gr-select.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,6 +17,6 @@
 
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
 <dom-module id="gr-select">
-  <content></content>
+  <slot></slot>
   <script src="gr-select.js"></script>
 </dom-module>
diff --git a/polygerrit-ui/app/elements/shared/gr-select/gr-select.js b/polygerrit-ui/app/elements/shared/gr-select/gr-select.js
index 21e5e1f..b732fa5 100644
--- a/polygerrit-ui/app/elements/shared/gr-select/gr-select.js
+++ b/polygerrit-ui/app/elements/shared/gr-select/gr-select.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -34,7 +37,8 @@
     },
 
     _updateValue() {
-      if (this.bindValue) {
+      // It's possible to have a value of 0.
+      if (this.bindValue !== undefined) {
         // Set for chrome/safari so it happens instantly
         this.nativeSelect.value = this.bindValue;
         // Async needed for firefox to populate value. It was trying to do it
diff --git a/polygerrit-ui/app/elements/shared/gr-select/gr-select_test.html b/polygerrit-ui/app/elements/shared/gr-select/gr-select_test.html
index e7a4965..1748ec06 100644
--- a/polygerrit-ui/app/elements/shared/gr-select/gr-select_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-select/gr-select_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -45,6 +46,11 @@
       element = fixture('basic');
     });
 
+    test('value of 0 should still trigger value updates', () => {
+      element.bindValue = 0;
+      assert.equal(element.nativeSelect.value, 0);
+    });
+
     test('bidirectional binding property-to-attribute', () => {
       const changeStub = sinon.stub();
       element.addEventListener('bind-value-changed', changeStub);
diff --git a/polygerrit-ui/app/elements/shared/gr-shell-command/gr-shell-command.html b/polygerrit-ui/app/elements/shared/gr-shell-command/gr-shell-command.html
new file mode 100644
index 0000000..fe6ed88
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-shell-command/gr-shell-command.html
@@ -0,0 +1,58 @@
+<!--
+@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="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../../styles/shared-styles.html">
+<link rel="import" href="../../shared/gr-copy-clipboard/gr-copy-clipboard.html">
+
+<dom-module id="gr-shell-command">
+  <template>
+    <style include="shared-styles">
+      .commandContainer {
+        margin-bottom: .75em;
+      }
+      .commandContainer {
+        background-color: var(--shell-command-background-color);
+        padding: .5em .5em .5em 2.5em;
+        position: relative;
+        width: 100%;
+      }
+      .commandContainer:before {
+        background: var(--shell-command-decoration-background-color);
+        bottom: 0;
+        box-sizing: border-box;
+        content: '$';
+        display: block;
+        left: 0;
+        padding: .8em;
+        position: absolute;
+        top: 0;
+        width: 2em;
+      }
+      .commandContainer gr-copy-clipboard {
+        --text-container-style: {
+          border: none;
+        }
+      }
+    </style>
+    <label>[[label]]</label>
+    <div class="commandContainer">
+      <gr-copy-clipboard text="[[command]]"></gr-copy-clipboard>
+    </div>
+  </template>
+  <script src="gr-shell-command.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/shared/gr-shell-command/gr-shell-command.js b/polygerrit-ui/app/elements/shared/gr-shell-command/gr-shell-command.js
new file mode 100644
index 0000000..2c546cc
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-shell-command/gr-shell-command.js
@@ -0,0 +1,32 @@
+/**
+ * @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-shell-command',
+
+    properties: {
+      command: String,
+      label: String,
+    },
+
+    focusOnCopy() {
+      this.$$('gr-copy-clipboard').focusOnCopy();
+    },
+  });
+})();
diff --git a/polygerrit-ui/app/elements/shared/gr-shell-command/gr-shell-command_test.html b/polygerrit-ui/app/elements/shared/gr-shell-command/gr-shell-command_test.html
new file mode 100644
index 0000000..a49f76f
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-shell-command/gr-shell-command_test.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<!--
+@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.
+-->
+
+<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+<title>gr-shell-command</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="gr-shell-command.html">
+
+<script>void(0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-shell-command></gr-shell-command>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-shell-command tests', () => {
+    let element;
+    let sandbox;
+
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+      element = fixture('basic');
+      element.text = `git fetch http://gerrit@localhost:8080/a/test-project
+          refs/changes/05/5/1 && git checkout FETCH_HEAD`;
+      flushAsynchronousOperations();
+    });
+
+    teardown(() => {
+      sandbox.restore();
+    });
+
+    test('focusOnCopy', () => {
+      const focusStub = sandbox.stub(element.$$('gr-copy-clipboard'),
+          'focusOnCopy');
+      element.focusOnCopy();
+      assert.isTrue(focusStub.called);
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/elements/shared/gr-storage/gr-storage.html b/polygerrit-ui/app/elements/shared/gr-storage/gr-storage.html
index 74bfcdf..6fc2f3f 100644
--- a/polygerrit-ui/app/elements/shared/gr-storage/gr-storage.html
+++ b/polygerrit-ui/app/elements/shared/gr-storage/gr-storage.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/elements/shared/gr-storage/gr-storage.js b/polygerrit-ui/app/elements/shared/gr-storage/gr-storage.js
index 7f61edd..c425609 100644
--- a/polygerrit-ui/app/elements/shared/gr-storage/gr-storage.js
+++ b/polygerrit-ui/app/elements/shared/gr-storage/gr-storage.js
@@ -1,25 +1,33 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
   // Date cutoff is one day:
-  const DRAFT_MAX_AGE = 24 * 60 * 60 * 1000;
+  const CLEANUP_MAX_AGE = 24 * 60 * 60 * 1000;
 
   // Clean up old entries no more frequently than one day.
   const CLEANUP_THROTTLE_INTERVAL = 24 * 60 * 60 * 1000;
 
+  const CLEANUP_PREFIXES = [
+    'draft:',
+    'editablecontent:',
+  ];
+
   Polymer({
     is: 'gr-storage',
 
@@ -39,7 +47,7 @@
     },
 
     getDraftComment(location) {
-      this._cleanupDrafts();
+      this._cleanupItems();
       return this._getObject(this._getDraftKey(location));
     },
 
@@ -53,6 +61,20 @@
       this._storage.removeItem(key);
     },
 
+    getEditableContentItem(key) {
+      this._cleanupItems();
+      return this._getObject(this._getEditableContentKey(key));
+    },
+
+    setEditableContentItem(key, message) {
+      this._setObject(this._getEditableContentKey(key),
+          {message, updated: Date.now()});
+    },
+
+    eraseEditableContentItem(key) {
+      this._storage.removeItem(this._getEditableContentKey(key));
+    },
+
     getPreferences() {
       return this._getObject('localPrefs');
     },
@@ -74,7 +96,11 @@
       return key;
     },
 
-    _cleanupDrafts() {
+    _getEditableContentKey(key) {
+      return `editablecontent:${key}`;
+    },
+
+    _cleanupItems() {
       // Throttle cleanup to the throttle interval.
       if (this._lastCleanup &&
           Date.now() - this._lastCleanup < CLEANUP_THROTTLE_INTERVAL) {
@@ -82,12 +108,16 @@
       }
       this._lastCleanup = Date.now();
 
-      let draft;
+      let item;
       for (const key in this._storage) {
-        if (key.startsWith('draft:')) {
-          draft = this._getObject(key);
-          if (Date.now() - draft.updated > DRAFT_MAX_AGE) {
-            this._storage.removeItem(key);
+        if (!this._storage.hasOwnProperty(key)) { continue; }
+        for (const prefix of CLEANUP_PREFIXES) {
+          if (key.startsWith(prefix)) {
+            item = this._getObject(key);
+            if (Date.now() - item.updated > CLEANUP_MAX_AGE) {
+              this._storage.removeItem(key);
+            }
+            break;
           }
         }
       }
diff --git a/polygerrit-ui/app/elements/shared/gr-storage/gr-storage_test.html b/polygerrit-ui/app/elements/shared/gr-storage/gr-storage_test.html
index ce8ec20..6b89af2 100644
--- a/polygerrit-ui/app/elements/shared/gr-storage/gr-storage_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-storage/gr-storage_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -33,6 +34,7 @@
 <script>
   suite('gr-storage tests', () => {
     let element;
+    let sandbox;
 
     function mockStorage(opt_quotaExceeded) {
       return {
@@ -48,9 +50,12 @@
 
     setup(() => {
       element = fixture('basic');
+      sandbox = sinon.sandbox.create();
       element._storage = mockStorage();
     });
 
+    teardown(() => sandbox.restore());
+
     test('storing, retrieving and erasing drafts', () => {
       const changeNum = 1234;
       const patchNum = 5;
@@ -100,7 +105,7 @@
       // Make sure that the call to cleanup doesn't get throttled.
       element._lastCleanup = 0;
 
-      const cleanupSpy = sinon.spy(element, '_cleanupDrafts');
+      const cleanupSpy = sandbox.spy(element, '_cleanupItems');
 
       // Create a message with a timestamp that is a second behind the max age.
       element._storage.setItem(key, JSON.stringify({
@@ -114,8 +119,6 @@
       assert.isTrue(cleanupSpy.called);
       assert.isNotOk(draft);
       assert.isNotOk(element._storage.getItem(key));
-
-      cleanupSpy.restore();
     });
 
     test('_getDraftKey', () => {
@@ -160,5 +163,32 @@
       assert.isTrue(element._exceededQuota);
       assert.isNotOk(element._storage.getItem(key));
     });
+
+    test('editable content items', () => {
+      const cleanupStub = sandbox.stub(element, '_cleanupItems');
+      const key = 'testKey';
+      const computedKey = element._getEditableContentKey(key);
+      // Key correctly computed.
+      assert.equal(computedKey, 'editablecontent:testKey');
+
+      element.setEditableContentItem(key, 'my content');
+
+      // Setting the draft stores it under the expected key.
+      let item = element._storage.getItem(computedKey);
+      assert.isOk(item);
+      assert.equal(JSON.parse(item).message, 'my content');
+      assert.isOk(JSON.parse(item).updated);
+
+      // getEditableContentItem performs as expected.
+      item = element.getEditableContentItem(key);
+      assert.isOk(item);
+      assert.equal(item.message, 'my content');
+      assert.isOk(item.updated);
+      assert.isTrue(cleanupStub.called);
+
+      // eraseEditableContentItem performs as expected.
+      element.eraseEditableContentItem(key);
+      assert.isNotOk(element._storage.getItem(computedKey));
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/shared/gr-textarea/gr-textarea.html b/polygerrit-ui/app/elements/shared/gr-textarea/gr-textarea.html
index 3c28674..10c9111 100644
--- a/polygerrit-ui/app/elements/shared/gr-textarea/gr-textarea.html
+++ b/polygerrit-ui/app/elements/shared/gr-textarea/gr-textarea.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -40,7 +41,7 @@
         display: inline-block
       }
       #textarea {
-        background-color: var(--background-color, none);
+        background-color: var(--view-background-color);
         width: 100%;
       }
       #hiddenText #emojiSuggestions {
diff --git a/polygerrit-ui/app/elements/shared/gr-textarea/gr-textarea.js b/polygerrit-ui/app/elements/shared/gr-textarea/gr-textarea.js
index 519db55..a3da7d8 100644
--- a/polygerrit-ui/app/elements/shared/gr-textarea/gr-textarea.js
+++ b/polygerrit-ui/app/elements/shared/gr-textarea/gr-textarea.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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';
 
@@ -67,10 +70,6 @@
         notify: true,
         observer: '_handleTextChanged',
       },
-      backgroundColor: {
-        type: String,
-        value: '#fff',
-      },
       hideBorder: {
         type: Boolean,
         value: false,
@@ -120,9 +119,6 @@
       if (this.hideBorder) {
         this.$.textarea.classList.add('noBorder');
       }
-      if (this.backgroundColor) {
-        this.updateStyles({'--background-color': this.backgroundColor});
-      }
     },
 
     closeDropdown() {
diff --git a/polygerrit-ui/app/elements/shared/gr-textarea/gr-textarea_test.html b/polygerrit-ui/app/elements/shared/gr-textarea/gr-textarea_test.html
index 0434865..3a52543 100644
--- a/polygerrit-ui/app/elements/shared/gr-textarea/gr-textarea_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-textarea/gr-textarea_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -24,7 +25,6 @@
 <link rel="import" href="gr-textarea.html">
 
 <script>void(0);</script>
-
 <test-fixture id="basic">
   <template>
     <gr-textarea></gr-textarea>
@@ -59,15 +59,6 @@
       assert.isTrue(element.$.textarea.classList.contains('noBorder'));
     });
 
-    test('background color is set properly', () => {
-      assert.equal(getComputedStyle(element.$.textarea).backgroundColor,
-          'rgb(255, 255, 255)');
-      element.backgroundColor = 'pink';
-      element.ready();
-      assert.equal(getComputedStyle(element.$.textarea).backgroundColor,
-          'rgb(255, 192, 203)');
-    });
-
     test('emoji selector is not open with the textarea lacks focus', () => {
       element.$.textarea.selectionStart = 1;
       element.$.textarea.selectionEnd = 1;
diff --git a/polygerrit-ui/app/elements/shared/gr-tooltip-content/gr-tooltip-content.html b/polygerrit-ui/app/elements/shared/gr-tooltip-content/gr-tooltip-content.html
index 58f8e39..65f1fda 100644
--- a/polygerrit-ui/app/elements/shared/gr-tooltip-content/gr-tooltip-content.html
+++ b/polygerrit-ui/app/elements/shared/gr-tooltip-content/gr-tooltip-content.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -19,7 +20,12 @@
 
 <dom-module id="gr-tooltip-content">
   <template>
-    <content></content><!--
+    <style>
+      .arrow {
+        color: var(--arrow-color);
+      }
+    </style>
+    <slot></slot><!--
  --><span class="arrow" hidden$="[[!showIcon]]">&#9432;</span>
   </template>
   <script src="gr-tooltip-content.js"></script>
diff --git a/polygerrit-ui/app/elements/shared/gr-tooltip-content/gr-tooltip-content.js b/polygerrit-ui/app/elements/shared/gr-tooltip-content/gr-tooltip-content.js
index 26e1e2c..c5de8f4 100644
--- a/polygerrit-ui/app/elements/shared/gr-tooltip-content/gr-tooltip-content.js
+++ b/polygerrit-ui/app/elements/shared/gr-tooltip-content/gr-tooltip-content.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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';
 
@@ -26,6 +29,11 @@
         type: String,
         reflectToAttribute: true,
       },
+      positionBelow: {
+        type: Boolean,
+        valye: false,
+        reflectToAttribute: true,
+      },
       showIcon: {
         type: Boolean,
         value: false,
diff --git a/polygerrit-ui/app/elements/shared/gr-tooltip-content/gr-tooltip-content_test.html b/polygerrit-ui/app/elements/shared/gr-tooltip-content/gr-tooltip-content_test.html
index 2fa02a3..438d436 100644
--- a/polygerrit-ui/app/elements/shared/gr-tooltip-content/gr-tooltip-content_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-tooltip-content/gr-tooltip-content_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -43,6 +44,12 @@
           .querySelector('.arrow').hidden, true);
     });
 
+    test('position-below attribute is reflected', () => {
+      assert.isFalse(element.hasAttribute('position-below'));
+      element.positionBelow = true;
+      assert.isTrue(element.hasAttribute('position-below'));
+    });
+
     test('icon is visible with showIcon property', () => {
       element.showIcon = true;
       assert.equal(Polymer.dom(element.root)
diff --git a/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip.html b/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip.html
index e79fb19..9947d61 100644
--- a/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip.html
+++ b/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -24,10 +25,10 @@
         --gr-tooltip-arrow-size: .5em;
         --gr-tooltip-arrow-center-offset: 0;
 
-        background-color: #333;
+        background-color: var(--tooltip-background-color);
         box-shadow: 0 1px 3px rgba(0, 0, 0, .3);
-        color: #fff;
-        font-size: .75rem;
+        color: var(--tooltip-text-color);
+        font-size: var(--font-size-small);
         position: absolute;
         z-index: 1000;
         max-width: var(--tooltip-max-width);
@@ -35,21 +36,35 @@
       :host .tooltip {
         padding: .5em .85em;
       }
+      :host .arrowPositionBelow,
+      :host([position-below]) .arrowPositionAbove  {
+        display: none;
+      }
+      :host([position-below]) .arrowPositionBelow {
+        display: initial;
+      }
       .arrow {
         border-left: var(--gr-tooltip-arrow-size) solid transparent;
         border-right: var(--gr-tooltip-arrow-size) solid transparent;
-        border-top: var(--gr-tooltip-arrow-size) solid #333;
-        bottom: -var(--gr-tooltip-arrow-size);
         height: 0;
         position: absolute;
         left: calc(50% - var(--gr-tooltip-arrow-size));
         margin-left: var(--gr-tooltip-arrow-center-offset);
         width: 0;
       }
+      .arrowPositionAbove {
+        border-top: var(--gr-tooltip-arrow-size) solid var(--tooltip-background-color);
+        bottom: -var(--gr-tooltip-arrow-size);
+      }
+      .arrowPositionBelow {
+        border-bottom: var(--gr-tooltip-arrow-size) solid var(--tooltip-background-color);
+        top: -var(--gr-tooltip-arrow-size);
+      }
     </style>
     <div class="tooltip">
+      <i class="arrowPositionBelow arrow"></i>
       [[text]]
-      <i class="arrow"></i>
+      <i class="arrowPositionAbove arrow"></i>
     </div>
   </template>
   <script src="gr-tooltip.js"></script>
diff --git a/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip.js b/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip.js
index e30afa7..fb87b558 100644
--- a/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip.js
+++ b/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip.js
@@ -1,16 +1,19 @@
-// 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.
+/**
+ * @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.
+ */
 (function() {
   'use strict';
 
@@ -23,6 +26,10 @@
         type: String,
         observer: '_updateWidth',
       },
+      positionBelow: {
+        type: Boolean,
+        reflectToAttribute: true,
+      },
     },
 
     _updateWidth(maxWidth) {
diff --git a/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip_test.html b/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip_test.html
index e1e6449..3a47288 100644
--- a/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-tooltip/gr-tooltip_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -44,5 +45,17 @@
       element.maxWidth = '50px';
       assert.equal(getComputedStyle(element).width, '50px');
     });
+
+    test('the correct arrow is displayed', () => {
+      assert.equal(getComputedStyle(element.$$('.arrowPositionBelow')).display,
+          'none');
+      assert.notEqual(getComputedStyle(element.$$('.arrowPositionAbove'))
+          .display, 'none');
+      element.positionBelow = true;
+      assert.notEqual(getComputedStyle(element.$$('.arrowPositionBelow'))
+          .display, 'none');
+      assert.equal(getComputedStyle(element.$$('.arrowPositionAbove'))
+          .display, 'none');
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/elements/shared/revision-info/revision-info.html b/polygerrit-ui/app/elements/shared/revision-info/revision-info.html
new file mode 100644
index 0000000..91f87d0
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/revision-info/revision-info.html
@@ -0,0 +1,80 @@
+<!--
+@license
+Copyright (C) 2017 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="../../../behaviors/gr-patch-set-behavior/gr-patch-set-behavior.html">
+<script>
+  (function() {
+    'use strict';
+
+    /**
+     * @param {Object} change A change object resulting from a change detail
+     *     call that includes revision information.
+     */
+    function RevisionInfo(change) {
+      this._change = change;
+    }
+
+    /**
+     * Get the largest number of parents of the commit in any revision. For
+     * example, with normal changes this will always return 1. For merge changes
+     * wherein the revisions are merge commits this will return 2 or potentially
+     * more.
+     * @return {Number}
+     */
+    RevisionInfo.prototype.getMaxParents = function() {
+      return Object.values(this._change.revisions)
+          .reduce((acc, rev) => Math.max(rev.commit.parents.length, acc), 0);
+    };
+
+    /**
+     * Get an object that maps revision numbers to the number of parents of the
+     * commit of that revision.
+     * @return {!Object}
+     */
+    RevisionInfo.prototype.getParentCountMap = function() {
+      const result = {};
+      Object.values(this._change.revisions)
+          .forEach(rev => { result[rev._number] = rev.commit.parents.length; });
+      return result;
+    };
+
+    /**
+     * @param {number|string} patchNum
+     * @return {number}
+     */
+    RevisionInfo.prototype.getParentCount = function(patchNum) {
+      return this.getParentCountMap()[patchNum];
+    };
+
+    /**
+     * Get the commit ID of the (0-offset) indexed parent in the given revision
+     * number.
+     * @param {number|string} patchNum
+     * @param {number} parentIndex (0-offset)
+     * @return {string}
+     */
+    RevisionInfo.prototype.getParentId = function(patchNum, parentIndex) {
+      const rev = Object.values(this._change.revisions).find(rev =>
+          Gerrit.PatchSetBehavior.patchNumEquals(rev._number, patchNum));
+      return rev.commit.parents[parentIndex].commit;
+    };
+
+    if (!window.Gerrit) {
+      window.Gerrit = {};
+    }
+    window.Gerrit.RevisionInfo = RevisionInfo;
+  })();
+</script>
diff --git a/polygerrit-ui/app/elements/shared/revision-info/revision-info_test.html b/polygerrit-ui/app/elements/shared/revision-info/revision-info_test.html
new file mode 100644
index 0000000..433872d
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/revision-info/revision-info_test.html
@@ -0,0 +1,86 @@
+<!DOCTYPE html>
+<!--
+@license
+Copyright (C) 2017 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>revision-info</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="../../../test/common-test-setup.html"/>
+<link rel="import" href="revision-info.html">
+
+<script>
+  suite('revision-info tests', () => {
+    let mockChange;
+
+    setup(() => {
+      mockChange = {
+        revisions: {
+          r1: {_number: 1, commit: {parents: [
+            {commit: 'p1'},
+            {commit: 'p2'},
+            {commit: 'p3'},
+          ]}},
+          r2: {_number: 2, commit: {parents: [
+            {commit: 'p1'},
+            {commit: 'p4'},
+          ]}},
+          r3: {_number: 3, commit: {parents: [{commit: 'p5'}]}},
+          r4: {_number: 4, commit: {parents: [
+            {commit: 'p2'},
+            {commit: 'p3'},
+          ]}},
+          r5: {_number: 5, commit: {parents: [
+            {commit: 'p5'},
+            {commit: 'p2'},
+            {commit: 'p3'},
+          ]}},
+        },
+      };
+    });
+
+    test('getMaxParents', () => {
+      const ri = new window.Gerrit.RevisionInfo(mockChange);
+      assert.equal(ri.getMaxParents(), 3);
+    });
+
+    test('getParentCountMap', () => {
+      const ri = new window.Gerrit.RevisionInfo(mockChange);
+      assert.deepEqual(ri.getParentCountMap(), {1: 3, 2: 2, 3: 1, 4: 2, 5: 3});
+    });
+
+    test('getParentCount', () => {
+      const ri = new window.Gerrit.RevisionInfo(mockChange);
+      assert.deepEqual(ri.getParentCount(1), 3);
+      assert.deepEqual(ri.getParentCount(3), 1);
+    });
+
+    test('getParentCount', () => {
+      const ri = new window.Gerrit.RevisionInfo(mockChange);
+      assert.deepEqual(ri.getParentCount(1), 3);
+      assert.deepEqual(ri.getParentCount(3), 1);
+    });
+
+    test('getParentId', () => {
+      const ri = new window.Gerrit.RevisionInfo(mockChange);
+      assert.deepEqual(ri.getParentId(1, 2), 'p3');
+      assert.deepEqual(ri.getParentId(2, 1), 'p4');
+      assert.deepEqual(ri.getParentId(3, 0), 'p5');
+    });
+  });
+</script>
diff --git a/polygerrit-ui/app/embed/change-diff-views.html b/polygerrit-ui/app/embed/change-diff-views.html
deleted file mode 100644
index 8426585..0000000
--- a/polygerrit-ui/app/embed/change-diff-views.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!--
-Copyright (C) 2017 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="../bower_components/polymer/polymer.html">
-<link rel="import" href="../elements/change/gr-change-view/gr-change-view.html">
-<link rel="import" href="../elements/diff/gr-diff-view/gr-diff-view.html">
-<link rel="import" href="../styles/app-theme.html">
diff --git a/polygerrit-ui/app/embed/embed.html b/polygerrit-ui/app/embed/embed.html
new file mode 100644
index 0000000..948916f
--- /dev/null
+++ b/polygerrit-ui/app/embed/embed.html
@@ -0,0 +1,31 @@
+<!--
+@license
+Copyright (C) 2017 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.
+-->
+<script>
+  // Needed for JSCompiler to understand it's global.
+  // eslint-disable-next-line no-unused-vars, prefer-const
+  let Gerrit = window.Gerrit || {};
+  window.Gerrit = Gerrit;
+</script>
+<link rel="import" href="../bower_components/polymer/polymer.html">
+<link rel="import" href="../elements/change/gr-change-view/gr-change-view.html">
+<link rel="import" href="../elements/core/gr-search-bar/gr-search-bar.html">
+<link rel="import" href="../elements/diff/gr-diff-view/gr-diff-view.html">
+<link rel="import" href="../elements/change-list/gr-change-list-view/gr-change-list-view.html">
+<link rel="import" href="../elements/change-list/gr-change-list/gr-change-list.html">
+<link rel="import" href="../elements/change-list/gr-create-change-help/gr-create-change-help.html">
+<link rel="import" href="../elements/change-list/gr-dashboard-view/gr-dashboard-view.html">
+<link rel="import" href="../styles/themes/app-theme.html">
diff --git a/polygerrit-ui/app/embed/embed_test.html b/polygerrit-ui/app/embed/embed_test.html
index 26ea895..7ca75c9 100644
--- a/polygerrit-ui/app/embed/embed_test.html
+++ b/polygerrit-ui/app/embed/embed_test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,11 +17,11 @@
 -->
 
 <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-<title>change-diff-views-embed_test</title>
+<title>embed_test</title>
 
 <script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
 <script src="../../../bower_components/web-component-tester/browser.js"></script>
-<link rel="import" href="../polygerrit_ui/elements/change-diff-views.html"/>
+<link rel="import" href="../polygerrit_ui/elements/embed.html"/>
 
 <script>void(0);</script>
 
@@ -36,6 +37,30 @@
   </template>
 </test-fixture>
 
+<test-fixture id="dashboard-view">
+  <template>
+    <gr-dashboard-view></gr-dashboard-view>
+  </template>
+</test-fixture>
+
+<test-fixture id="change-list-view">
+  <template>
+    <gr-change-list-view></gr-change-list-view>
+  </template>
+</test-fixture>
+
+<test-fixture id="change-list">
+  <template>
+    <gr-change-list></gr-change-list>
+  </template>
+</test-fixture>
+
+<test-fixture id="search-bar">
+  <template>
+    <gr-search-bar></gr-search-bar>
+  </template>
+</test-fixture>
+
 <script>
   suite('embed test', () => {
     test('gr-change-view is embedded', () => {
@@ -47,5 +72,25 @@
       const element = fixture('diff-view');
       assert.equal(element.is, 'gr-diff-view');
     });
+
+    test('dashboard-view is embedded', () => {
+      const element = fixture('dashboard-view');
+      assert.equal(element.is, 'gr-dashboard-view');
+    });
+
+    test('change-list-view is embedded', () => {
+      const element = fixture('change-list-view');
+      assert.equal(element.is, 'gr-change-list-view');
+    });
+
+    test('change-list is embedded', () => {
+      const element = fixture('change-list');
+      assert.equal(element.is, 'gr-change-list');
+    });
+
+    test('search-bar is embedded', () => {
+      const element = fixture('search-bar');
+      assert.equal(element.is, 'gr-search-bar');
+    });
   });
 </script>
diff --git a/polygerrit-ui/app/embed/test.html b/polygerrit-ui/app/embed/test.html
index 0587562..eed2fef 100644
--- a/polygerrit-ui/app/embed/test.html
+++ b/polygerrit-ui/app/embed/test.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/polygerrit-ui/app/externs/BUILD b/polygerrit-ui/app/externs/BUILD
new file mode 100644
index 0000000..26ead9a
--- /dev/null
+++ b/polygerrit-ui/app/externs/BUILD
@@ -0,0 +1,25 @@
+# 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.
+
+load("@io_bazel_rules_closure//closure:defs.bzl", "closure_js_library")
+
+package(
+    default_visibility = ["//visibility:public"],
+)
+
+closure_js_library(
+    name = "plugin",
+    srcs = ["plugin.js"],
+    no_closure_library = True,
+)
diff --git a/polygerrit-ui/app/externs/plugin.js b/polygerrit-ui/app/externs/plugin.js
new file mode 100644
index 0000000..c88c724
--- /dev/null
+++ b/polygerrit-ui/app/externs/plugin.js
@@ -0,0 +1,30 @@
+/**
+ * @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.
+ */
+
+/**
+ * @fileoverview Closure compiler externs for the Gerrit UI plugins.
+ * @externs
+ */
+
+/* eslint-disable no-var */
+
+var Gerrit = {};
+
+/**
+ * @param {!Function} callback
+ */
+Gerrit.install = function(callback) {};
diff --git a/polygerrit-ui/app/gr-diff/gr-diff-root.html b/polygerrit-ui/app/gr-diff/gr-diff-root.html
new file mode 100644
index 0000000..132654c
--- /dev/null
+++ b/polygerrit-ui/app/gr-diff/gr-diff-root.html
@@ -0,0 +1,7 @@
+<script>
+  // Needed for JSCompiler to understand it's global.
+  // eslint-disable-next-line no-unused-vars, prefer-const
+  let Gerrit = window.Gerrit || {};
+  window.Gerrit = Gerrit;
+</script>
+<link rel="import" href="../elements/diff/gr-diff/gr-diff.html">
diff --git a/polygerrit-ui/app/index.html b/polygerrit-ui/app/index.html
deleted file mode 100644
index 976806a..0000000
--- a/polygerrit-ui/app/index.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!DOCTYPE html>
-<!--
-Copyright (C) 2015 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.
--->
-
-<html lang="en">
-<meta charset="utf-8">
-<meta name="description" content="Gerrit Code Review">
-<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
-
-<!--
-RobotoMono fonts are used in styles/fonts.css
-@see https://github.com/w3c/preload/issues/32 regarding crossorigin
--->
-<link rel="preload" href="/fonts/RobotoMono-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous">
-<link rel="preload" href="/fonts/RobotoMono-Regular.woff" as="font" type="font/woff" crossorigin="anonymous">
-<link rel="preload" href="/fonts/Roboto-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous">
-<link rel="preload" href="/fonts/Roboto-Regular.woff" as="font" type="font/woff" crossorigin="anonymous">
-<link rel="preload" href="/fonts/Roboto-Medium.woff2" as="font" type="font/woff2" crossorigin="anonymous">
-<link rel="preload" href="/fonts/Roboto-Medium.woff" as="font" type="font/woff" crossorigin="anonymous">
-<link rel="stylesheet" href="/styles/fonts.css">
-<link rel="stylesheet" href="/styles/main.css">
-<script src="/bower_components/webcomponentsjs/webcomponents-lite.js"></script>
-<!--
-  - Content between webcomponents-lite and the load of the main app element
-  - run before polymer-resin is installed so may have security consequences.
-  - Contact your local security engineer if you have any questions, and
-  - CC them on any changes that load content before gr-app.html.
-  -
-  - github.com/Polymer/polymer-resin/blob/master/getting-started.md#integrating
-  -->
-<link rel="preload" href="/elements/gr-app.js" as="script" crossorigin="anonymous">
-<link rel="import" href="/elements/gr-app.html">
-
-<body unresolved>
-<gr-app id="app"></gr-app>
diff --git a/polygerrit-ui/app/polylint_test.sh b/polygerrit-ui/app/polylint_test.sh
index ca9f9a9..ee69ce2 100755
--- a/polygerrit-ui/app/polylint_test.sh
+++ b/polygerrit-ui/app/polylint_test.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
 
 set -ex
 
diff --git a/polygerrit-ui/app/rules.bzl b/polygerrit-ui/app/rules.bzl
index f836cf5..7788e5f 100644
--- a/polygerrit-ui/app/rules.bzl
+++ b/polygerrit-ui/app/rules.bzl
@@ -2,7 +2,7 @@
 load("//tools/bzl:genrule2.bzl", "genrule2")
 load(
     "//tools/bzl:js.bzl",
-    "vulcanize",
+    "bundle_assets",
 )
 
 def polygerrit_bundle(name, srcs, outs, app):
@@ -14,7 +14,7 @@
         # See: https://github.com/google/closure-compiler/issues/2042
         compilation_level = "WHITESPACE_ONLY",
         defs = [
-            "--polymer_pass",
+            "--polymer_version=1",
             "--jscomp_off=duplicate",
             "--force_inject_library=es6_runtime",
         ],
@@ -39,7 +39,7 @@
         ],
     )
 
-    vulcanize(
+    bundle_assets(
         name = appName,
         srcs = srcs,
         app = app,
@@ -60,10 +60,18 @@
     )
 
     native.filegroup(
+        name = name + "_theme_sources",
+        srcs = native.glob(
+            ["styles/themes/*.html"],
+            # app-theme.html already included via an import in gr-app.html.
+            exclude = ["styles/themes/app-theme.html"],
+        ),
+    )
+
+    native.filegroup(
         name = name + "_top_sources",
         srcs = [
             "favicon.ico",
-            "index.html",
         ],
     )
 
@@ -72,6 +80,7 @@
         srcs = [
             name + "_app_sources",
             name + "_css_sources",
+            name + "_theme_sources",
             name + "_top_sources",
             "//lib/fonts:robotofonts",
             "//lib/js:highlightjs_files",
@@ -81,11 +90,12 @@
         ],
         outs = outs,
         cmd = " && ".join([
-            "mkdir -p $$TMP/polygerrit_ui/{styles,fonts,bower_components/{highlightjs,webcomponentsjs},elements}",
+            "mkdir -p $$TMP/polygerrit_ui/{styles/themes,fonts,bower_components/{highlightjs,webcomponentsjs},elements}",
             "for f in $(locations " + name + "_app_sources); do ext=$${f##*.}; cp -p $$f $$TMP/polygerrit_ui/elements/" + appName + ".$$ext; done",
             "cp $(locations //lib/fonts:robotofonts) $$TMP/polygerrit_ui/fonts/",
             "for f in $(locations " + name + "_top_sources); do cp $$f $$TMP/polygerrit_ui/; done",
             "for f in $(locations " + name + "_css_sources); do cp $$f $$TMP/polygerrit_ui/styles; done",
+            "for f in $(locations " + name + "_theme_sources); do cp $$f $$TMP/polygerrit_ui/styles/themes; done",
             "for f in $(locations //lib/js:highlightjs_files); do cp $$f $$TMP/polygerrit_ui/bower_components/highlightjs/ ; done",
             "unzip -qd $$TMP/polygerrit_ui/bower_components $(location @webcomponentsjs//:zipfile) webcomponentsjs/webcomponents-lite.js",
             "cd $$TMP",
diff --git a/polygerrit-ui/app/run_template_test.sh b/polygerrit-ui/app/run_template_test.sh
new file mode 100755
index 0000000..4cd6e7f
--- /dev/null
+++ b/polygerrit-ui/app/run_template_test.sh
@@ -0,0 +1,17 @@
+#!/usr/bin/env bash
+
+if [[ -z "${TEMPLATE_NO_DEFAULT}" ]]; then
+bazel test \
+      --test_env="HOME=$HOME" \
+      //polygerrit-ui/app:all
+      --test_tag_filters=template \
+      "$@" \
+      --test_output errors \
+      --nocache_test_results
+else
+bazel test \
+      --test_env="HOME=$HOME" \
+      "$@" \
+      --test_output errors \
+      --nocache_test_results
+fi
diff --git a/polygerrit-ui/app/samples/bind-parameters.html b/polygerrit-ui/app/samples/bind-parameters.html
new file mode 100644
index 0000000..dc7a87a
--- /dev/null
+++ b/polygerrit-ui/app/samples/bind-parameters.html
@@ -0,0 +1,37 @@
+<dom-module id="bind-parameters">
+  <script>
+    Gerrit.install(plugin => {
+      plugin.registerCustomComponent(
+          'change-view-integration', 'my-bind-sample');
+    });
+  </script>
+</dom-module>
+
+<dom-module id="my-bind-sample">
+  <template>
+    Template example: Patchset number [[revision._number]]. <br/>
+    Computed example: [[computedExample]].
+  </template>
+  <script>
+    Polymer({
+      is: 'my-bind-sample',
+      properties: {
+        computedExample: {
+          type: String,
+          computed: '_computeExample(revision._number)',
+        },
+      },
+      attached() {
+        this.plugin.attributeHelper(this).bind(
+            'revision', this._onRevisionChanged.bind(this));
+      },
+      _computeExample(value) {
+        if (!value) { return '(empty)'; }
+        return `(patchset ${value} selected)`;
+      },
+      _onRevisionChanged(value) {
+        console.log(`(attributeHelper.bind) revision number: ${value._number}`);
+      },
+    });
+  </script>
+</dom-module>
diff --git a/polygerrit-ui/app/samples/coverage-plugin.html b/polygerrit-ui/app/samples/coverage-plugin.html
new file mode 100644
index 0000000..9bec658
--- /dev/null
+++ b/polygerrit-ui/app/samples/coverage-plugin.html
@@ -0,0 +1,73 @@
+<dom-module id="coverage-plugin">
+  <script>
+
+    function populateWithDummyData(coverageData) {
+      coverageData['NewFile'] = {
+        linesMissingCoverage: [1, 2, 3],
+        totalLines: 5,
+        changeNum: 94,
+        patchNum: 2,
+      };
+      coverageData['/COMMIT_MSG'] = {
+        linesMissingCoverage: [3, 4, 7, 14],
+        totalLines: 14,
+        changeNum: 94,
+        patchNum: 2,
+      };
+      coverageData['DEPS'] = {
+        linesMissingCoverage: [3, 4, 7, 14],
+        totalLines: 16,
+        changeNum: 77001,
+        patchNum: 1,
+      };
+      coverageData['go/sklog/sklog.go'] = {
+        linesMissingCoverage: [3, 322, 323, 324],
+        totalLines: 350,
+        changeNum: 85963,
+        patchNum: 13,
+      };
+    }
+
+    Gerrit.install(plugin => {
+      const coverageData = {};
+      let displayCoverage = false;
+      const annotationApi = plugin.annotationApi();
+      annotationApi.addLayer(context => {
+        if (Object.keys(coverageData).length === 0) {
+           // Coverage data is not ready yet.
+          return;
+        }
+        const path = context.path;
+        const line = context.line;
+          // Highlight lines missing coverage with this background color if
+          // coverage should be displayed, else do nothing.
+        const cssClass = displayCoverage
+                         ? Gerrit.css('background-color: #EF9B9B')
+                         : Gerrit.css('');
+        if (coverageData[path] &&
+              coverageData[path].changeNum === context.changeNum &&
+              coverageData[path].patchNum === context.patchNum) {
+          const linesMissingCoverage = coverageData[path].linesMissingCoverage;
+          if (linesMissingCoverage.includes(line.afterNumber)) {
+            context.annotateRange(0, line.text.length, cssClass, 'right');
+          }
+        }
+      }).enableToggleCheckbox('Display Coverage', checkbox => {
+        // Checkbox is attached so now add the notifier that will be controlled
+        // by the checkbox.
+        annotationApi.addNotifier(notifyFunc => {
+          new Promise(resolve => setTimeout(resolve, 3000)).then(() => {
+            populateWithDummyData(coverageData);
+            checkbox.disabled = false;
+            checkbox.onclick = e => {
+              displayCoverage = e.target.checked;
+              Object.keys(coverageData).forEach(file => {
+                notifyFunc(file, 0, coverageData[file].totalLines, 'right');
+              });
+            };
+          });
+        });
+      });
+    });
+  </script>
+</dom-module>
diff --git a/polygerrit-ui/app/samples/repo-command.html b/polygerrit-ui/app/samples/repo-command.html
new file mode 100644
index 0000000..67e528a
--- /dev/null
+++ b/polygerrit-ui/app/samples/repo-command.html
@@ -0,0 +1,42 @@
+<dom-module id="sample-repo-command">
+  <script>
+    Gerrit.install(plugin => {
+      // High-level API
+      plugin.project()
+          .createCommand('Bork', (repoName, projectConfig) => {
+            if (repoName !== 'All-Projects') {
+              return false;
+            }
+          }).onTap(() => {
+            alert('Bork, bork!');
+          });
+
+      // Low-level API
+      plugin.registerCustomComponent(
+          'repo-command', 'repo-command-low');
+    });
+  </script>
+</dom-module>
+
+<!-- Low-level custom component for repo command. -->
+<dom-module id="repo-command-low">
+  <template>
+    <gr-repo-command
+        title="Low-level bork"
+        on-command-tap="_handleCommandTap">
+    </gr-repo-command>
+  </template>
+  <script>
+    Polymer({
+      is: 'repo-command-low',
+      attached() {
+        console.log(this.repoName);
+        console.log(this.config);
+        this.hidden = this.repoName !== 'All-Projects';
+      },
+      _handleCommandTap() {
+        alert('(softly) bork, bork.');
+      },
+    });
+  </script>
+</dom-module>
diff --git a/polygerrit-ui/app/samples/some-screen.html b/polygerrit-ui/app/samples/some-screen.html
new file mode 100644
index 0000000..de29315
--- /dev/null
+++ b/polygerrit-ui/app/samples/some-screen.html
@@ -0,0 +1,49 @@
+<dom-module id="some-screen">
+  <script>
+    Gerrit.install(plugin => {
+      // Recommended approach for screen() API.
+      plugin.screen('main', 'some-screen-main');
+
+      const mainUrl = plugin.screenUrl('main');
+
+      // Support for deprecated screen API.
+      plugin.deprecated.screen('foo', ({token, body, show}) => {
+        body.innerHTML = `This is a plugin screen at ${token}<br/>` +
+            `<a href="${mainUrl}">Go to main plugin screen</a>`;
+        show();
+      });
+
+      // Quick and dirty way to get something on screen.
+      plugin.screen('bar').onAttached(el => {
+        el.innerHTML = `This is a plugin screen at ${el.token}<br/>` +
+            `<a href="${mainUrl}">Go to main plugin screen</a>`;
+      });
+
+      // Add a "Plugin screen" link to the change view screen.
+      plugin.hook('change-metadata-item').onAttached(el => {
+        el.innerHTML = `<a href="${mainUrl}">Plugin screen</a>`;
+      });
+    });
+  </script>
+</dom-module>
+
+<dom-module id="some-screen-main">
+  <template>
+    This is the <b>main</b> plugin screen at [[token]]
+    <ul>
+      <li><a href$="[[rootUrl]]/foo">via deprecated</a></li>
+      <li><a href$="[[rootUrl]]/bar">without component</a></li>
+    </ul>
+  </template>
+  <script>
+    Polymer({
+      is: 'some-screen-main',
+      properties: {
+        rootUrl: String,
+      },
+      attached() {
+        this.rootUrl = `${this.plugin.screenUrl()}`;
+      },
+    });
+  </script>
+</dom-module>
diff --git a/polygerrit-ui/app/samples/suggest-vote.html b/polygerrit-ui/app/samples/suggest-vote.html
new file mode 100644
index 0000000..657fa73
--- /dev/null
+++ b/polygerrit-ui/app/samples/suggest-vote.html
@@ -0,0 +1,23 @@
+<dom-module id="suggested-vote">
+  <script>
+    Gerrit.install(plugin => {
+      const replyApi = plugin.changeReply();
+      let wasSuggested = false;
+      plugin.on('showchange', () => {
+        wasSuggested = false;
+      });
+      const CODE_REVIEW = 'Code-Review';
+      replyApi.addLabelValuesChangedCallback(({name, value}) => {
+        if (wasSuggested && name === CODE_REVIEW) {
+          replyApi.showMessage('');
+          wasSuggested = false;
+        } else if (replyApi.getLabelValue(CODE_REVIEW) === '+1' &&
+            !wasSuggested) {
+          replyApi.setLabelValue(CODE_REVIEW, '+2');
+          replyApi.showMessage(`Suggested ${CODE_REVIEW} upgrade: +2`);
+          wasSuggested = true;
+        }
+      });
+    });
+  </script>
+</dom-module>
diff --git a/polygerrit-ui/app/scripts/hiddenscroll.js b/polygerrit-ui/app/scripts/hiddenscroll.js
index b80742a..c62e6fc 100644
--- a/polygerrit-ui/app/scripts/hiddenscroll.js
+++ b/polygerrit-ui/app/scripts/hiddenscroll.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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(window) {
   window.Gerrit = window.Gerrit || {};
diff --git a/polygerrit-ui/app/scripts/rootElement.js b/polygerrit-ui/app/scripts/rootElement.js
index 1a07edf..619a7b1 100644
--- a/polygerrit-ui/app/scripts/rootElement.js
+++ b/polygerrit-ui/app/scripts/rootElement.js
@@ -1,20 +1,23 @@
-// Copyright (C) 2017 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.
+/**
+ * @license
+ * Copyright (C) 2017 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(window) {
   window.Gerrit = window.Gerrit || {};
   if (window.Gerrit.hasOwnProperty('getRootElement')) { return; }
 
   window.Gerrit.getRootElement = () => document.body;
-})(window);
\ No newline at end of file
+})(window);
diff --git a/polygerrit-ui/app/scripts/util.js b/polygerrit-ui/app/scripts/util.js
index 573335c..b4ab21a 100644
--- a/polygerrit-ui/app/scripts/util.js
+++ b/polygerrit-ui/app/scripts/util.js
@@ -1,16 +1,19 @@
-// Copyright (C) 2015 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.
+/**
+ * @license
+ * Copyright (C) 2015 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(window) {
   'use strict';
 
diff --git a/polygerrit-ui/app/styles/app-theme.html b/polygerrit-ui/app/styles/app-theme.html
deleted file mode 100644
index 2fe7662..0000000
--- a/polygerrit-ui/app/styles/app-theme.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<!--
-Copyright (C) 2015 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.
--->
-<style is="custom-style">
-:root {
-  /* Following vars have LTS for plugin API. */
-  --primary-text-color: #000;
-  --header-background-color: #eee;
-  --header-title-content: 'PolyGerrit';
-  --header-icon: none;
-  --header-icon-size: 0em;
-  --footer-background-color: var(--header-background-color);
-
-  /* Following are not part of plugin API. */
-  --search-border-color: #ddd;
-  --selection-background-color: #ebf5fb;
-  --default-text-color: #000;
-  --view-background-color: #fff;
-  --default-horizontal-margin: 1rem;
-  --font-family: 'Roboto', -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';
-  --font-family-bold: 'Roboto Medium', -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';
-  --monospace-font-family: 'Roboto Mono', Menlo, 'Lucida Console', Monaco, monospace;
-  --iron-overlay-backdrop: {
-    transition: none;
-  }
-
-  /* Follow are a part of the design refresh */
-  --color-link: #2a66d9;
-  --color-link-tertiary: #000;
-  /* 12% darker */
-  --color-button-hover: #0B47BA;
-}
-@media screen and (max-width: 50em) {
-  :root {
-    --default-horizontal-margin: .7rem;
-  }
-}
-</style>
diff --git a/polygerrit-ui/app/styles/dashboard-header-styles.html b/polygerrit-ui/app/styles/dashboard-header-styles.html
new file mode 100644
index 0000000..7b0e46b
--- /dev/null
+++ b/polygerrit-ui/app/styles/dashboard-header-styles.html
@@ -0,0 +1,48 @@
+<!--
+@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="dashboard-header-styles">
+  <template>
+    <style>
+      :host {
+        background-color: var(--view-background-color);
+        display: block;
+        height: 9em;
+        width: 100%;
+      }
+      gr-avatar {
+        display: inline-block;
+        height: 7em;
+        left: 1em;
+        margin: 1em;
+        top: 1em;
+        width: 7em;
+      }
+      .info {
+        display: inline-block;
+        padding: 1em;
+        vertical-align: top;
+      }
+      .info > div > span {
+        display: inline-block;
+        font-weight: var(--font-weight-bold);
+        text-align: right;
+        width: 4em;
+      }
+    </style>
+  </template>
+</dom-module>
diff --git a/polygerrit-ui/app/styles/fonts.css b/polygerrit-ui/app/styles/fonts.css
index 6a5da44..41aec27 100644
--- a/polygerrit-ui/app/styles/fonts.css
+++ b/polygerrit-ui/app/styles/fonts.css
@@ -42,9 +42,9 @@
 
 /* latin-ext */
 @font-face {
-  font-family: 'Roboto Medium';
+  font-family: 'Roboto';
   font-style: normal;
-  font-weight: 400;
+  font-weight: 500;
   src: local('Roboto Medium'), local('Roboto-Medium'),
        url('../fonts/Roboto-Medium.woff2') format('woff2'),
        url('../fonts/Roboto-Medium.woff') format('woff');
@@ -52,11 +52,11 @@
 }
 /* latin */
 @font-face {
-  font-family: 'Roboto Medium';
+  font-family: 'Roboto';
   font-style: normal;
-  font-weight: 400;
+  font-weight: 500;
   src: local('Roboto Medium'), local('Roboto-Medium'),
        url('../fonts/Roboto-Medium.woff2') format('woff2'),
        url('../fonts/Roboto-Medium.woff') format('woff');
   unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000;
-}
\ No newline at end of file
+}
diff --git a/polygerrit-ui/app/styles/gr-change-list-styles.html b/polygerrit-ui/app/styles/gr-change-list-styles.html
index a0bba90..aeca48a 100644
--- a/polygerrit-ui/app/styles/gr-change-list-styles.html
+++ b/polygerrit-ui/app/styles/gr-change-list-styles.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,29 +18,95 @@
   <template>
     <style>
       :host {
-        font-size: 13px;
+        font-size: var(--font-size-normal);
+      }
+      gr-change-list-item,
+      tr {
+        border-top: 1px solid var(--border-color);
+      }
+      gr-change-list-item[selected],
+      gr-change-list-item:focus {
+        background-color: var(--selection-background-color);
+      }
+      /* The border-collapse attribute only works on sibling elements, not
+        cousin elements. So, if we want the table to have a sticky header and
+        have borders between each row, we must disable the border-top on the
+        elements directly below a .topHeader. */
+      .topHeader ~ gr-change-list-item:first-of-type,
+      .topHeader + .groupHeader {
+        border-top: none;
+      }
+      /* Needed to show a border on top of the first gr-change-list-item when a
+        groupHeader exists. Cannot use + selector because of dom-repeats
+        existing in the DOM tree. */
+      .topHeader ~ .groupHeader ~ gr-change-list-item {
+        border-top: 1px solid var(--border-color);
+      }
+      tbody {
+        border-bottom: 1px solid var(--border-color);
+      }
+      tr.topHeader {
+        border: none;
+      }
+      th {
+        text-align: left;
+      }
+      th,
+      .cell {
+        vertical-align: middle;
+      }
+      th:not(.label),
+      .cell:not(.label) {
+        padding-right: 8px;
+      }
+      th.label {
+        border-left: none;
       }
       .topHeader,
       .groupHeader {
-        border-bottom: 1px solid #eee;
-        font-family: var(--font-family-bold);
-        padding: .3em .5em;
+        font-weight: var(--font-weight-bold);
       }
-      .topHeader {
-        background-color: #ddd;
+      .topHeader th {
+        background-color: var(--table-header-background-color);
+        height: 3rem;
+        position: -webkit-sticky;
+        position: sticky;
+        top: -1px; /* Offset for top borders */
+        z-index: 1;
       }
-      .noChanges {
-        border-bottom: 1px solid #eee;
-        padding: .3em .5em;
+      /* :after pseudoelements are used here because borders on sticky table
+        headers with a background color are broken. */
+      th:after {
+        border-bottom: 1px solid var(--border-color);
+        bottom: 0;
+        content: '';
+        left: 0;
+        position: absolute;
+        width: 100%;
       }
-      .keyboard,
+      th.label:after {
+        border-left: 1px solid var(--border-color);
+        top: 0;
+      }
+      .groupHeader {
+        background-color: var(--table-subheader-background-color);
+      }
+      .groupHeader a {
+        color: var(--primary-text-color);
+        text-decoration: none;
+      }
+      .groupHeader a:hover {
+        text-decoration: underline;
+      }
+      .cell {
+        height: 2.25rem;
+      }
       .star {
         padding: 0;
       }
       gr-change-star {
         vertical-align: middle;
       }
-      .keyboard,
       .branch,
       .star,
       .label,
@@ -49,62 +116,88 @@
       .updated,
       .size,
       .status,
-      .project {
+      .repo {
         white-space: nowrap;
       }
-      .updated {
-        text-align: right;
+      .star {
+        vertical-align: middle;
       }
-      .size,
-      .updated {
-        text-align: right;
+      .leftPadding {
+        width: var(--default-horizontal-margin);
+      }
+      .star {
+        width: 30px;
       }
       .label {
+        border-left: 1px solid var(--border-color);
         text-align: center;
+        width: 3rem;
       }
-      .truncatedProject {
+      .topHeader .label {
+        border: none;
+      }
+      .truncatedRepo {
         display: none;
       }
-      @media only screen and (max-width: 90em) {
+      @media only screen and (max-width: 150em) {
         .assignee,
         .branch,
         .owner {
           overflow: hidden;
-          max-width: 10rem;
+          max-width: 18rem;
           text-overflow: ellipsis;
         }
-        .truncatedProject {
+        .truncatedRepo {
           display: inline-block;
         }
-        .fullProject {
+        .fullRepo {
           display: none;
         }
       }
+      @media only screen and (max-width: 100em) {
+        .assignee,
+        .branch,
+        .owner {
+          max-width: 10rem;
+        }
+      }
       @media only screen and (max-width: 50em) {
         :host {
-          font-size: 14px;
+          font-size: var(--font-size-large);
         }
         gr-change-list-item {
           flex-wrap: wrap;
           justify-content: space-between;
           padding: .25em .5em;
         }
-        gr-change-list-item[selected] {
-          background-color: transparent;
+        gr-change-list-item[selected],
+        gr-change-list-item:focus {
+          background-color: var(--view-background-color);
+          border: none;
+          border-top: 1px solid var(--border-color);
+        }
+        gr-change-list-item:hover {
+          background-color: var(--view-background-color);
+        }
+        .cell {
+          align-items: center;
+          display: flex;
         }
         .topHeader,
-        .keyboard,
+        .leftPadding,
         .status,
-        .project,
+        .repo,
         .branch,
         .updated,
         .label,
-        .assignee {
+        .assignee,
+        .groupHeader .star,
+        .noChanges .star {
           display: none;
         }
-        .star {
-          padding-left: .35em;
-          padding-top: .25em;
+        .groupHeader .cell,
+        .noChanges .cell {
+          padding: 0 .5em;
         }
         .subject {
           margin-bottom: .25em;
@@ -112,12 +205,16 @@
         }
         .owner,
         .size {
-          width: auto;
+          max-width: none;
+        }
+        .noChanges .cell {
+          display: block;
+          height: auto;
         }
       }
       @media only screen and (min-width: 1450px) {
-        .project {
-          width: 20em;
+        :host {
+          font-size: 14px;
         }
       }
     </style>
diff --git a/polygerrit-ui/app/styles/gr-form-styles.html b/polygerrit-ui/app/styles/gr-form-styles.html
index 823fee6..59b633f 100644
--- a/polygerrit-ui/app/styles/gr-form-styles.html
+++ b/polygerrit-ui/app/styles/gr-form-styles.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,6 +17,14 @@
 <dom-module id="gr-form-styles">
   <template>
     <style>
+      .gr-form-styles input {
+        background-color: var(--view-background-color);
+        color: var(--primary-text-color);
+      }
+      .gr-form-styles select {
+        background-color: var(--select-background-color);
+        color: var(--primary-text-color);
+      }
       .gr-form-styles h1,
       .gr-form-styles h2 {
         margin-bottom: .3em;
@@ -36,16 +45,16 @@
         display: inline-block;
       }
       .gr-form-styles .title {
-        color: #666;
-        font-family: var(--font-family-bold);
+        color: var(--deemphasized-text-color);
+        font-weight: var(--font-weight-bold);
         padding-right: .5em;
         width: 15em;
       }
       .gr-form-styles iron-autogrow-textarea {
-        font-size: 1em;
+        font-size: var(--font-size-normal);
       }
       .gr-form-styles th {
-        color: #666;
+        color: var(--deemphasized-text-color);
         text-align: left;
         vertical-align: bottom;
       }
@@ -58,9 +67,6 @@
       .gr-form-styles .emptyHeader {
         text-align: right;
       }
-      .gr-form-styles tbody tr:nth-child(even):not(.loading) {
-        background-color: #f4f4f4;
-      }
       .gr-form-styles table {
         width: 50em;
       }
@@ -75,9 +81,9 @@
       .gr-form-styles input:not([type="checkbox"]),
       .gr-form-styles select,
       .gr-form-styles textarea {
-        border: 1px solid #d1d2d3;
+        border: 1px solid var(--border-color);
         border-radius: 2px;
-        font-size: 1em;
+        font-size: var(--font-size-normal);
         height: 2em;
         padding: 0 .15em;
       }
@@ -93,19 +99,19 @@
         height: auto;
         min-height: 2em;
         --iron-autogrow-textarea: {
-          border: 1px solid #d1d2d3;
+          border: 1px solid var(--border-color);
           border-radius: 2px;
           box-sizing: border-box;
-          font-size: 1em;
+          font-size: var(--font-size-normal);
           padding: .25em .15em 0 .15em;
         }
       }
       .gr-form-styles gr-autocomplete {
         border: none;
         --gr-autocomplete: {
-          border: 1px solid #d1d2d3;
+          border: 1px solid var(--border-color);
           border-radius: 2px;
-          font-size: 1em;
+          font-size: var(--font-size-normal);
           height: 2em;
           padding: 0 .15em;
           width: 14em;
diff --git a/polygerrit-ui/app/styles/gr-menu-page-styles.html b/polygerrit-ui/app/styles/gr-menu-page-styles.html
index 81d4179..48ca396 100644
--- a/polygerrit-ui/app/styles/gr-menu-page-styles.html
+++ b/polygerrit-ui/app/styles/gr-menu-page-styles.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2016 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -24,18 +25,23 @@
         margin: 2em auto;
         max-width: 50em;
       }
-      main.table {
+      .mainHeader {
+        margin-left: 14em;
+        padding: 1em 0 1em 2em;
+      }
+      main.table,
+      .mainHeader {
         margin-top: 0;
         margin-right: 0;
         margin-left: 14em;
         max-width: none;
       }
       h2.edited:after {
-        color: #444;
+        color: var(--deemphasized-text-color);
         content: ' *';
       }
       .loading {
-        color: #666;
+        color: var(--deemphasized-text-color);
         padding: 1em var(--default-horizontal-margin);
       }
       @media only screen and (max-width: 67em) {
@@ -56,6 +62,10 @@
         main.table {
           margin: 0;
         }
+        .mainHeader {
+          margin-left: 0;
+          padding: .5em 0 .5em 1em;
+        }
       }
     </style>
   </template>
diff --git a/polygerrit-ui/app/styles/gr-page-nav-styles.html b/polygerrit-ui/app/styles/gr-page-nav-styles.html
index 0c4d20f..18ec143 100644
--- a/polygerrit-ui/app/styles/gr-page-nav-styles.html
+++ b/polygerrit-ui/app/styles/gr-page-nav-styles.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,38 +24,38 @@
         border-bottom: 1px solid transparent;
         border-top: 1px solid transparent;
         display: block;
-        padding: 0 2em;
+        padding: 0 calc(var(--default-horizontal-margin) + 0.5em);
       }
-      .navStyles li  a {
+      .navStyles li a {
         display: block;
         overflow: hidden;
         text-overflow: ellipsis;
         white-space: nowrap;
       }
       .navStyles .subsectionItem {
-        padding-left: 3em;
+        padding-left: calc(var(--default-horizontal-margin) + 1.5em);
       }
       .navStyles .hideSubsection {
         display: none;
       }
       .navStyles li.sectionTitle {
-        padding: 0 2em 0 1.5em;
+        padding: 0 2em 0 var(--default-horizontal-margin);
       }
       .navStyles li.sectionTitle:not(:first-child) {
         margin-top: 1em;
       }
       .navStyles .title {
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
         margin: .4em 0;
       }
       .navStyles .selected {
-        background-color: #fff;
-        border-bottom: 1px dotted #808080;
-        border-top: 1px dotted #808080;
-        font-family: var(--font-family-bold);
+        background-color: var(--view-background-color);
+        border-bottom: 1px solid var(--border-color);
+        border-top: 1px solid var(--border-color);
+        font-weight: var(--font-weight-bold);
       }
       .navStyles a {
-        color: black;
+        color: var(--primary-text-color);
         display: inline-block;
         margin: .4em 0;
       }
diff --git a/polygerrit-ui/app/styles/gr-subpage-styles.html b/polygerrit-ui/app/styles/gr-subpage-styles.html
new file mode 100644
index 0000000..098a604
--- /dev/null
+++ b/polygerrit-ui/app/styles/gr-subpage-styles.html
@@ -0,0 +1,34 @@
+<!--
+@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-subpage-styles">
+  <template>
+    <style>
+      main {
+        margin: 1em 1em;
+      }
+      .loading {
+        display: none;
+      }
+      #loading.loading {
+        display: block;
+      }
+      #loading:not(.loading) {
+        display: none;
+      }
+    </style>
+  </template>
+</dom-module>
diff --git a/polygerrit-ui/app/styles/gr-table-styles.html b/polygerrit-ui/app/styles/gr-table-styles.html
index 6b8c88d0..1308952 100644
--- a/polygerrit-ui/app/styles/gr-table-styles.html
+++ b/polygerrit-ui/app/styles/gr-table-styles.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,41 +18,82 @@
 <dom-module id="gr-table-styles">
   <template>
     <style>
-      .genericList .loading {
-        display: none;
-      }
       .genericList {
         border-collapse: collapse;
         width: 100%;
       }
-      .genericList tr.table {
-        border-bottom: 1px solid #eee;
+      .genericList td {
+        height: 2.25rem;
+        padding: .3rem 0;
+        vertical-align: middle;
+      }
+      .genericList tr {
+        border-bottom: 1px solid var(--border-color);
+      }
+      .genericList tr:hover {
+        background-color: var(--hover-background-color);
+      }
+      .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 tr:first-of-type {
+        border-top: 1px solid var(--border-color);
+      }
+      .genericList tr th:last-of-type,
+      .genericList tr td:last-of-type {
+        border-left: 1px solid var(--border-color);
+        text-align: center;
+        padding: 0 1em;
+      }
+      .genericList tr th.delete,
+      .genericList tr td.delete,
+      .genericList tr.loadingMsg td {
+        border-left: none;
+      }
+      .genericList .loading {
+        border: none;
+        display: none;
       }
       .genericList td {
         flex-shrink: 0;
-        padding: .3em .5em;
       }
-      .genericList th {
-        background-color: #ddd;
-        border-bottom: 1px solid #eee;
-        font-family: var(--font-family-bold);
-        padding: .3em .5em;
+      .genericList .topHeader,
+      .genericList .groupHeader {
+        color: var(--primary-text-color);
+        font-weight: var(--font-weight-bold);
         text-align: left;
+        vertical-align: middle
+      }
+      .genericList .topHeader {
+        background-color: var(--table-header-background-color);
+        height: 3rem;
+      }
+      .genericList .groupHeader {
+        background-color: var(--table-subheader-background-color);
+        font-size: var(--font-size-large);
       }
       .genericList a {
-        color: var(--default-text-color);
+        color: var(--primary-text-color);
         text-decoration: none;
       }
       .genericList a:hover {
         text-decoration: underline;
       }
       .genericList .description {
-        width: 70%;
+        width: 99%;
       }
       .genericList .loadingMsg {
-        color: #666;
+        color: var(--deemphasized-text-color);
         display: block;
-        padding: 1em var(--default-horizontal-margin);
+        padding: .3em var(--default-horizontal-margin);
       }
       .genericList .loadingMsg:not(.loading) {
         display: none;
diff --git a/polygerrit-ui/app/styles/gr-voting-styles.html b/polygerrit-ui/app/styles/gr-voting-styles.html
new file mode 100644
index 0000000..3b1ee64
--- /dev/null
+++ b/polygerrit-ui/app/styles/gr-voting-styles.html
@@ -0,0 +1,31 @@
+<!--
+@license
+Copyright (C) 2017 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-voting-styles">
+  <template>
+    <style>
+      :host {
+        --vote-chip-styles: {
+          border: 1px solid rgba(0,0,0,.12);
+          border-radius: 1em;
+          box-shadow: none;
+          min-width: 3em;
+        }
+      }
+    </style>
+  </template>
+</dom-module>
diff --git a/polygerrit-ui/app/styles/main.css b/polygerrit-ui/app/styles/main.css
index 045821c..618a2d71 100644
--- a/polygerrit-ui/app/styles/main.css
+++ b/polygerrit-ui/app/styles/main.css
@@ -24,6 +24,12 @@
 
 html {
   -webkit-text-size-adjust: none;
+  /*
+   * Default browser fonts are 16px. We want users with default settings to see
+   * a base font of 13px. 13/16 = .8125. This needs to be in html because
+   * can use rems based on this font-size throughout the app.
+   */
+  font-size: .8125em;
 }
 html,
 body {
@@ -36,7 +42,6 @@
    * Work around this using font-size and font-family.
    */
   -webkit-text-size-adjust: none;
-  font-size: 13px;
   font-family: 'Roboto', -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';
   line-height: 1.4;
 }
diff --git a/polygerrit-ui/app/styles/shared-styles.html b/polygerrit-ui/app/styles/shared-styles.html
index 31b1c6e..78abe3a 100644
--- a/polygerrit-ui/app/styles/shared-styles.html
+++ b/polygerrit-ui/app/styles/shared-styles.html
@@ -1,4 +1,5 @@
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -34,12 +35,15 @@
       }
       input,
       iron-autogrow-textarea {
+        background-color: inherit;
+        border: 1px solid var(--border-color);
         box-sizing: border-box;
+        color: var(--primary-text-color);
         margin: 0;
         padding: 0;
       }
       a {
-        color: var(--color-link);
+        color: var(--link-color);
       }
       input,
       textarea,
@@ -67,19 +71,19 @@
       }
       /* Other Shared Styles*/
       h1 {
-        font-size: 2em;
-        font-family: var(--font-family-bold);
+        font-size: 2rem;
+        font-weight: var(--font-weight-bold);
       }
       h2 {
-        font-size: 1.5em;
-        font-family: var(--font-family-bold);
+        font-size: 1.5rem;
+        font-weight: var(--font-weight-bold);
       }
       h3 {
         font-size: 1.17em;
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
       }
       iron-icon {
-        color: #757575;
+        color: var(--deemphasized-text-color);
         --iron-icon-height: 20px;
         --iron-icon-width: 20px;
       }
@@ -87,6 +91,24 @@
       [hidden] {
         display: none !important;
       }
+      .separator {
+        border-left: 1px solid var(--border-color);
+        height: 20px;
+        margin: 0 8px;
+      }
+      .separator.transparent {
+        border-color: transparent;
+      }
+      paper-toggle-button {
+        --paper-toggle-button-checked-bar-color: var(--link-color);
+        --paper-toggle-button-checked-button-color: var(--link-color);
+      }
+      strong {
+        font-weight: var(--font-weight-bold);
+      }
+      :host {
+        color: var(--primary-text-color);
+      }
     </style>
   </template>
 </dom-module>
diff --git a/polygerrit-ui/app/styles/themes/app-theme.html b/polygerrit-ui/app/styles/themes/app-theme.html
new file mode 100644
index 0000000..ec445ae
--- /dev/null
+++ b/polygerrit-ui/app/styles/themes/app-theme.html
@@ -0,0 +1,142 @@
+<!--
+@license
+Copyright (C) 2015 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.
+-->
+<style is="custom-style">
+:root {
+  /* Following vars have LTS for plugin API. */
+  --primary-text-color: #000;
+  --header-background-color: #eee;
+  --header-title-content: 'Gerrit';
+  --header-icon: none;
+  --header-icon-size: 0em;
+  --header-text-color: #000;
+  --footer-background-color: var(--header-background-color);
+  --border-color: #ddd;
+
+  /* Following are not part of plugin API. */
+  --selection-background-color: rgba(161, 194, 250, 0.1);
+  --hover-background-color: rgba(161, 194, 250, 0.2);
+  --expanded-background-color: #eee;
+  --view-background-color: #fff;
+  --default-horizontal-margin: 1rem;
+  --deemphasized-text-color: #757575;
+  --font-family: 'Roboto', -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';
+  --font-weight-bold: 500;
+  --monospace-font-family: 'Roboto Mono', Menlo, 'Lucida Console', Monaco, monospace;
+  --iron-overlay-backdrop: {
+    transition: none;
+  }
+  --table-header-background-color: #fafafa;
+  --table-subheader-background-color: #eaeaea;
+
+  --chip-background-color: #eee;
+
+  --dropdown-background-color: #fff;
+
+  --select-background-color: rgb(248, 248, 248);
+
+  --assignee-highlight-color: #fcfad6;
+
+  /* Font sizes */
+  --font-size-normal: 1rem;
+  --font-size-small: .92rem;
+  --font-size-large: 1.154rem;
+
+  --link-color: #2a66d9;
+  --primary-button-background-color: var(--link-color);
+  --primary-button-text-color: #fff;
+  --secondary-button-background-color: #fff;
+  --secondary-button-text-color: #212121;
+  --default-button-background-color: #fff;
+  --default-button-text-color: var(--link-color);
+  --dialog-background-color: #fff;
+
+  /* Used for both the old patchset header and for indicating that a particular
+    change message was selected. */
+  --emphasis-color: #fff9c4;
+
+  --error-text-color: red;
+
+  --vote-color-approved: #9fcc6b;
+  --vote-color-recommended: #c9dfaf;
+  --vote-color-rejected: #f7a1ad;
+  --vote-color-disliked: #f7c4cb;
+  --vote-color-neutral: #ebf5fb;
+
+  --vote-text-color-recommended: #388E3C;
+  --vote-text-color-disliked: #D32F2F;
+
+  /* Diff colors */
+  --diff-selection-background-color: #c7dbf9;
+  --light-remove-highlight-color: #FFEBEE;
+  --light-add-highlight-color: #D8FED8;
+  --light-remove-add-highlight-color: #FFF8DC;
+  --light-rebased-add-highlight-color: #EEEEFF;
+  --dark-remove-highlight-color: #FFCDD2;
+  --dark-add-highlight-color: #AAF2AA;
+  --dark-rebased-remove-highlight-color: #F7E8B7;
+  --dark-rebased-add-highlight-color: #D7D7F9;
+  --diff-context-control-color: #fff7d4;
+  --diff-context-control-border-color: #f6e6a5;
+  --diff-tab-indicator-color: var(--deemphasized-text-color);
+  --diff-trailing-whitespace-indicator: #ff9ad2;
+  --diff-highlight-range-color: rgba(255, 213, 0, 0.5);
+  --diff-highlight-range-hover-color: rgba(255, 255, 0, 0.5);
+
+  --shell-command-background-color: #f5f5f5;
+  --shell-command-decoration-background-color: #ebebeb;
+
+  --comment-text-color: #000;
+  --comment-background-color: #fcfad6;
+  --unresolved-comment-background-color: #fcfaa6;
+
+  --edit-mode-background-color: #ebf5fb;
+
+  --tooltip-background-color: #333;
+  --tooltip-text-color: #fff;
+
+  --syntax-default-color: var(--primary-text-color);
+  --syntax-attribute-color: var(--primary-text-color);
+  --syntax-function-color: #e90;
+  --syntax-meta-color: #FF1717;
+  --syntax-keyword-color: #9E0069;
+  --syntax-number-color: #164;
+  --syntax-selector-class-color: #164;
+  --syntax-variable-color: black;
+  --syntax-template-variable-color: #0000C0;
+  --syntax-comment-color: #3F7F5F;
+  --syntax-string-color: #2A00FF;
+  --syntax-selector-id-color: #2A00FF;
+  --syntax-built_in-color: #30a;
+  --syntax-tag-color: #170;
+  --syntax-link-color: #219;
+  --syntax-meta-keyword-color: #219;
+  --syntax-type-color: var(--color-link);
+  --syntax-title-color: #0000C0;
+  --syntax-attr-color: #219;
+  --syntax-literal-color: #219;
+  --syntax-selector-pseudo-color: #FA8602;
+  --syntax-regexp-color: #FA8602;
+  --syntax-selector-attr-color: #FA8602;
+  --syntax-template-tag-color: #FA8602;
+  --syntax-param-color: var(--primary-text-color);
+}
+@media screen and (max-width: 50em) {
+  :root {
+    --default-horizontal-margin: .7rem;
+  }
+}
+</style>
diff --git a/polygerrit-ui/app/styles/themes/dark-theme.html b/polygerrit-ui/app/styles/themes/dark-theme.html
new file mode 100644
index 0000000..6037a88
--- /dev/null
+++ b/polygerrit-ui/app/styles/themes/dark-theme.html
@@ -0,0 +1,86 @@
+<dom-module id="dark-theme">
+  <style is="custom-style">
+    html {
+      --primary-text-color: #e2e2e2;
+      --view-background-color: #212121;
+      --border-color: #555555;
+      --table-header-background-color: #353637;
+      --table-subheader-background-color: rgb(19, 20, 22);
+      --header-background-color: #5487E5;
+      --header-text-color: var(--primary-text-color);
+      --deemphasized-text-color: #9a9a9a;
+      --footer-background-color: var(--table-header-background-color);
+      --expanded-background-color: #26282b;
+      --link-color: #5487E5;
+      --primary-button-background-color: var(--link-color);
+      --primary-button-text-color: var(--primary-text-color);
+      --secondary-button-background-color: var(--primary-text-color);
+      --secondary-button-text-color: var(--deemphasized-text-color);
+      --default-button-text-color: var(--link-color);
+      --default-button-background-color: var(--table-subheader-background-color);
+      --dropdown-background-color: var(--table-header-background-color);
+      --dialog-background-color: var(--view-background-color);
+      --chip-background-color: var(--table-header-background-color);
+
+      --select-background-color: var(--table-subheader-background-color);
+
+      --assignee-highlight-color: rgb(58, 54, 28);
+
+      --diff-selection-background-color: #3A71D8;
+      --light-remove-highlight-color: rgb(53, 27, 27);
+      --light-add-highlight-color: rgb(24, 45, 24);
+      --light-remove-add-highlight-color: #2f3f2f;
+      --light-rebased-remove-highlight-color: rgb(60, 37, 8);
+      --light-rebased-add-highlight-color: rgb(72, 113, 101);
+      --dark-remove-highlight-color: rgba(255, 0, 0, 0.15);
+      --dark-add-highlight-color: rgba(0, 255, 0, 0.15);
+      --dark-rebased-remove-highlight-color: rgba(255, 139, 6, 0.15);
+      --dark-rebased-add-highlight-color: rgba(11, 255, 155, 0.15);
+      --diff-context-control-color: var(--table-header-background-color);
+      --diff-context-control-border-color: var(--border-color);
+      --diff-highlight-range-color: rgba(0, 100, 200, 0.5);
+      --diff-highlight-range-hover-color: rgba(0, 150, 255, 0.5);
+      --shell-command-background-color: #5f5f5f;
+      --shell-command-decoration-background-color: #999999;
+      --comment-text-color: var(--primary-text-color);
+      --comment-background-color: #0B162B;
+      --unresolved-comment-background-color: rgb(56, 90, 154);
+
+      --vote-color-approved: rgb(127, 182, 107);
+      --vote-color-recommended: rgb(63, 103, 50);
+      --vote-color-rejected: #ac2d3e;
+      --vote-color-disliked: #bf6874;
+      --vote-color-neutral: #597280;
+
+      --edit-mode-background-color: rgb(92, 10, 54);
+      --emphasis-color: #383f4a;
+
+      --tooltip-background-color: #111;
+
+      --syntax-default-color: var(--primary-text-color);
+      --syntax-meta-color: #6D7EEE;
+      --syntax-keyword-color: #CD4CF0;
+      --syntax-number-color: #00998A;
+      --syntax-selector-class-color: #FFCB68;
+      --syntax-variable-color: #F77669;
+      --syntax-template-variable-color: #F77669;
+      --syntax-comment-color: var(--deemphasized-text-color);
+      --syntax-string-color: #C3E88D;
+      --syntax-selector-id-color: #F77669;
+      --syntax-built_in-color: rgb(247, 195, 105);
+      --syntax-tag-color: #F77669;
+      --syntax-link-color: #C792EA;
+      --syntax-meta-keyword-color: #EEFFF7;
+      --syntax-type-color: #DD5F5F;
+      --syntax-title-color: #75A5FF;
+      --syntax-attr-color: #80CBBF;
+      --syntax-literal-color: #EEFFF7;
+      --syntax-selector-pseudo-color: #C792EA;
+      --syntax-regexp-color: #F77669;
+      --syntax-selector-attr-color: #80CBBF;
+      --syntax-template-tag-color: #C792EA;
+
+      background-color: var(--view-background-color);
+    }
+  </style>
+</dom-module>
diff --git a/polygerrit-ui/app/template_test.sh b/polygerrit-ui/app/template_test.sh
index a9710cd..7177e8a 100755
--- a/polygerrit-ui/app/template_test.sh
+++ b/polygerrit-ui/app/template_test.sh
@@ -1,21 +1,20 @@
-#!/bin/sh
+#!/bin/bash
 
 set -ex
 
-npm_bin=$(which npm)
-if [ -z "$npm_bin" ]; then
-    echo "NPM must be on the path."
-    exit 1
-fi
-
 node_bin=$(which node)
 if [ -z "$node_bin" ]; then
     echo "node must be on the path."
     exit 1
 fi
 
+npm_bin=$(which npm)
+if [[ -z "$npm_bin" ]]; then
+    echo "NPM must be on the path. (https://www.npmjs.com/)"
+    exit 1
+fi
+
 fried_twinkie_config=$(npm list -g | grep -c fried-twinkie)
-typescript_config=$(npm list -g | grep -c typescript)
 if [ -z "$npm_bin" ] || [ "$fried_twinkie_config" -eq "0" ]; then
     echo "You must install fried twinkie and its dependencies from NPM."
     echo "> npm install -g fried-twinkie"
diff --git a/polygerrit-ui/app/template_test_srcs/convert_for_template_tests.py b/polygerrit-ui/app/template_test_srcs/convert_for_template_tests.py
index 3a5cd83b..579e783 100644
--- a/polygerrit-ui/app/template_test_srcs/convert_for_template_tests.py
+++ b/polygerrit-ui/app/template_test_srcs/convert_for_template_tests.py
@@ -1,5 +1,6 @@
-import os, re, json
-from shutil import copyfile, rmtree
+import json
+import os
+import re
 
 polymerRegex = r"Polymer\({"
 polymerCompiledRegex = re.compile(polymerRegex)
@@ -10,103 +11,119 @@
 regexBehavior = r"<script>(.+)<\/script>"
 behaviorCompiledRegex = re.compile(regexBehavior, re.DOTALL)
 
+
 def _open(filename, mode="r"):
-  try:
-    return open(filename, mode, encoding="utf-8")
-  except TypeError:
-    return open(filename, mode)
+    try:
+        return open(filename, mode, encoding="utf-8")
+    except TypeError:
+        return open(filename, mode)
 
-def replaceBehaviorLikeHTML (fileIn, fileOut):
-  with _open(fileIn) as f:
-    file_str = f.read()
-    match = behaviorCompiledRegex.search(file_str)
-    if (match):
-      with _open("polygerrit-ui/temp/behaviors/" + fileOut.replace("html", "js") , "w+") as f:
-        f.write(match.group(1))
 
-def replaceBehaviorLikeJS (fileIn, fileOut):
-  with _open(fileIn) as f:
-    file_str = f.read()
-    with _open("polygerrit-ui/temp/behaviors/" + fileOut , "w+") as f:
-      f.write(file_str)
+def replaceBehaviorLikeHTML(fileIn, fileOut):
+    with _open(fileIn) as f:
+        file_str = f.read()
+        match = behaviorCompiledRegex.search(file_str)
+        if match:
+            with _open("polygerrit-ui/temp/behaviors/" +
+                       fileOut.replace("html", "js"), "w+") as f:
+                f.write(match.group(1))
+
+
+def replaceBehaviorLikeJS(fileIn, fileOut):
+    with _open(fileIn) as f:
+        file_str = f.read()
+        with _open("polygerrit-ui/temp/behaviors/" + fileOut, "w+") as f:
+            f.write(file_str)
+
 
 def generateStubBehavior(behaviorName):
-  with _open("polygerrit-ui/temp/behaviors/" + behaviorName + ".js", "w+") as f:
-    f.write("/** @polymerBehavior **/\n" + behaviorName + "= {};")
+    with _open("polygerrit-ui/temp/behaviors/" +
+               behaviorName + ".js", "w+") as f:
+        f.write("/** @polymerBehavior **/\n" + behaviorName + "= {};")
 
-def replacePolymerElement (fileIn, fileOut, root):
-  with _open(fileIn) as f:
-    key = fileOut.split('.')[0]
-    # Removed self invoked function
-    file_str = f.read()
-    file_str_no_fn = fnCompiledRegex.search(file_str)
 
-    if file_str_no_fn:
-      package = root.replace("/", ".") + "." + fileOut
+def replacePolymerElement(fileIn, fileOut, root):
+    with _open(fileIn) as f:
+        key = fileOut.split('.')[0]
+        # Removed self invoked function
+        file_str = f.read()
+        file_str_no_fn = fnCompiledRegex.search(file_str)
 
-      with _open("polygerrit-ui/temp/" + fileOut, "w+") as f:
-        mainFileContents = re.sub(polymerCompiledRegex, "exports = Polymer({", file_str_no_fn.group(1)).replace("'use strict';", "")
-        f.write("/** \n" \
-          "* @fileoverview \n" \
-          "* @suppress {missingProperties} \n" \
-          "*/ \n\n" \
-          "goog.module('polygerrit." + package + "')\n\n" + mainFileContents)
+        if file_str_no_fn:
+            package = root.replace("/", ".") + "." + fileOut
 
-      # Add package and javascript to files object.
-      elements[key]["js"] = "polygerrit-ui/temp/" + fileOut
-      elements[key]["package"] = package
+            with _open("polygerrit-ui/temp/" + fileOut, "w+") as f:
+                mainFileContents = re.sub(
+                    polymerCompiledRegex,
+                    "exports = Polymer({",
+                    file_str_no_fn.group(1)).replace("'use strict';", "")
+                f.write("/** \n"
+                        "* @fileoverview \n"
+                        "* @suppress {missingProperties} \n"
+                        "*/ \n\n"
+                        "goog.module('polygerrit." + package + "')\n\n" +
+                        mainFileContents)
+
+            # Add package and javascript to files object.
+            elements[key]["js"] = "polygerrit-ui/temp/" + fileOut
+            elements[key]["package"] = package
+
 
 def writeTempFile(file, root):
-  # This is included in an extern because it is directly on the window object.
-  # (for now at least).
-  if "gr-reporting" in file:
-    return
-  key = file.split('.')[0]
-  if not key in elements:
-    # gr-app doesn't have an additional level
-    elements[key] = {"directory": 'gr-app' if len(root.split("/")) < 4 else root.split("/")[3]}
-  if file.endswith(".html") and not file.endswith("_test.html"):
-    # gr-navigation is treated like a behavior rather than a standard element
-    # because of the way it added to the Gerrit object.
-    if file.endswith("gr-navigation.html"):
-      replaceBehaviorLikeHTML(os.path.join(root, file), file)
-    else:
-      elements[key]["html"] = os.path.join(root, file)
-  if file.endswith(".js"):
-    replacePolymerElement(os.path.join(root, file), file, root)
+    # This is included in an extern because it is directly on the window object
+    # (for now at least).
+    if "gr-reporting" in file:
+        return
+    key = file.split('.')[0]
+    if key not in elements:
+        # gr-app doesn't have an additional level
+        elements[key] = {
+            "directory":
+                'gr-app' if len(root.split("/")) < 4 else root.split("/")[3]
+        }
+    if file.endswith(".html") and not file.endswith("_test.html"):
+        # gr-navigation is treated like a behavior rather than a standard
+        # element because of the way it added to the Gerrit object.
+        if file.endswith("gr-navigation.html"):
+            replaceBehaviorLikeHTML(os.path.join(root, file), file)
+        else:
+            elements[key]["html"] = os.path.join(root, file)
+    if file.endswith(".js"):
+        replacePolymerElement(os.path.join(root, file), file, root)
 
 
 if __name__ == "__main__":
-  # Create temp directory.
-  if not os.path.exists("polygerrit-ui/temp"):
-    os.makedirs("polygerrit-ui/temp")
+    # Create temp directory.
+    if not os.path.exists("polygerrit-ui/temp"):
+        os.makedirs("polygerrit-ui/temp")
 
-  # Within temp directory create behavior directory.
-  if not os.path.exists("polygerrit-ui/temp/behaviors"):
-    os.makedirs("polygerrit-ui/temp/behaviors")
+    # Within temp directory create behavior directory.
+    if not os.path.exists("polygerrit-ui/temp/behaviors"):
+        os.makedirs("polygerrit-ui/temp/behaviors")
 
-  elements = {}
+    elements = {}
 
-  # Go through every file in app/elements, and re-write accordingly to temp
-  # directory, and also added to elements object, which is used to generate a
-  # map of html files, package names, and javascript files.
-  for root, dirs, files in os.walk("polygerrit-ui/app/elements"):
-    for file in files:
-      writeTempFile(file, root)
+    # Go through every file in app/elements, and re-write accordingly to temp
+    # directory, and also added to elements object, which is used to generate a
+    # map of html files, package names, and javascript files.
+    for root, dirs, files in os.walk("polygerrit-ui/app/elements"):
+        for file in files:
+            writeTempFile(file, root)
 
-  # Special case for polymer behaviors we are using.
-  replaceBehaviorLikeHTML("polygerrit-ui/app/bower_components/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html", "iron-a11y-keys-behavior.html")
-  generateStubBehavior("Polymer.IronOverlayBehavior")
-  generateStubBehavior("Polymer.IronFitBehavior")
+    # Special case for polymer behaviors we are using.
+    replaceBehaviorLikeHTML("polygerrit-ui/app/bower_components/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html", "iron-a11y-keys-behavior.html")
+    generateStubBehavior("Polymer.IronOverlayBehavior")
+    generateStubBehavior("Polymer.IronFitBehavior")
 
-  #TODO figure out something to do with iron-overlay-behavior. it is hard-coded reformatted.
+    # TODO figure out something to do with iron-overlay-behavior.
+    # it is hard-coded reformatted.
 
-  with _open("polygerrit-ui/temp/map.json", "w+") as f:
-    f.write(json.dumps(elements))
+    with _open("polygerrit-ui/temp/map.json", "w+") as f:
+        f.write(json.dumps(elements))
 
-  for root, dirs, files in os.walk("polygerrit-ui/app/behaviors"):
-    for file in files:
-      if file.endswith("behavior.html"):
-        replaceBehaviorLikeHTML(os.path.join(root, file), file)
-      elif file.endswith("behavior.js"):
-        replaceBehaviorLikeJS(os.path.join(root, file), file)
+    for root, dirs, files in os.walk("polygerrit-ui/app/behaviors"):
+        for file in files:
+            if file.endswith("behavior.html"):
+                replaceBehaviorLikeHTML(os.path.join(root, file), file)
+            elif file.endswith("behavior.js"):
+                replaceBehaviorLikeJS(os.path.join(root, file), file)
diff --git a/polygerrit-ui/app/template_test_srcs/template_test.js b/polygerrit-ui/app/template_test_srcs/template_test.js
index a0db3af..3de6227 100644
--- a/polygerrit-ui/app/template_test_srcs/template_test.js
+++ b/polygerrit-ui/app/template_test_srcs/template_test.js
@@ -22,7 +22,9 @@
   'GrDiffGroup',
   'GrDiffLine',
   'GrDomHooks',
+  'GrEditConstants',
   'GrEtagDecorator',
+  'GrFileListConstants',
   'GrGapiAuth',
   'GrGerritAuth',
   'GrLinkTextParser',
@@ -31,6 +33,7 @@
   'GrRangeNormalizer',
   'GrReporting',
   'GrReviewerUpdatesParser',
+  'GrCountStringFormatter',
   'GrThemeApi',
   'moment',
   'page',
diff --git a/polygerrit-ui/app/test/common-test-setup.html b/polygerrit-ui/app/test/common-test-setup.html
index d901bec..92b99e3 100644
--- a/polygerrit-ui/app/test/common-test-setup.html
+++ b/polygerrit-ui/app/test/common-test-setup.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -34,7 +35,7 @@
   });
 </script>
 <script>
-  // eslint-disable-next-line no-unused-vars
+  /* eslint-disable no-unused-vars */
   const mockPromise = () => {
     let res;
     const promise = new Promise(resolve => {
@@ -43,19 +44,16 @@
     promise.resolve = res;
     return promise;
   };
+  const isHidden = el => getComputedStyle(el).display === 'none';
+  /* eslint-enable no-unused-vars */
 </script>
 <script>
   (function() {
     setup(() => {
       if (!window.Gerrit) { return; }
-      Gerrit._pluginsPending = -1;
-      Gerrit._allPluginsPromise = undefined;
       if (Gerrit._resetPlugins) {
         Gerrit._resetPlugins();
       }
-      if (Gerrit._endpoints) {
-        Gerrit._endpoints = new GrPluginEndpoints();
-      }
     });
   })();
 </script>
diff --git a/polygerrit-ui/app/test/functional/README.md b/polygerrit-ui/app/test/functional/README.md
new file mode 100644
index 0000000..82c6133
--- /dev/null
+++ b/polygerrit-ui/app/test/functional/README.md
@@ -0,0 +1,54 @@
+# Functional test suite
+
+## Installing Docker (OSX)
+
+Simplest way to install all of those is to use Homebrew:
+
+```
+brew cask install docker
+```
+
+This will install a Docker in Applications. To run if from the command-line:
+
+```
+open /Applications/Docker.app
+```
+
+It'll require privileged access and will require user password to be entered.
+
+To validate Docker is installed correctly, run hello-world image:
+
+```
+docker run hello-world
+```
+
+## Building a Docker image
+
+Should be done once only for development purposes, run from the Gerrit checkout
+path:
+
+```
+docker build -t gerrit/polygerrit-functional:v1 \
+  polygerrit-ui/app/test/functional/infra
+```
+
+## Running a smoke test
+
+Running a smoke test from Gerrit checkout path:
+
+```
+./polygerrit-ui/app/test/functional/run_functional.sh
+```
+
+The successful output should be something similar to this:
+
+```
+Starting local server..
+Starting Webdriver..
+Started
+.
+
+
+1 spec, 0 failures
+Finished in 2.565 seconds
+```
diff --git a/polygerrit-ui/app/test/functional/infra/Dockerfile b/polygerrit-ui/app/test/functional/infra/Dockerfile
new file mode 100644
index 0000000..e642176
--- /dev/null
+++ b/polygerrit-ui/app/test/functional/infra/Dockerfile
@@ -0,0 +1,38 @@
+FROM selenium/standalone-chrome-debug
+
+USER root
+
+# nvm environment variables
+ENV NVM_DIR /usr/local/nvm
+ENV NODE_VERSION 9.4.0
+
+# install nvm
+# https://github.com/creationix/nvm#install-script
+RUN wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
+
+# install node and npm
+RUN [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" \
+    && nvm install $NODE_VERSION \
+    && nvm alias default $NODE_VERSION \
+    && nvm use default
+
+ENV NODE_PATH $NVM_DIR/v$NODE_VERSION/lib/node_modules
+ENV PATH $NVM_DIR/versions/node/v$NODE_VERSION/bin:$PATH
+
+RUN npm install -g jasmine
+RUN npm install -g http-server
+
+USER seluser
+
+RUN mkdir -p /tmp/app
+WORKDIR /tmp/app
+
+RUN npm init -y
+RUN npm install --save selenium-webdriver
+
+EXPOSE 8080
+
+COPY test-infra.js /tmp/app/node_modules
+COPY run.sh /tmp/app/
+
+ENTRYPOINT [ "/tmp/app/run.sh" ]
diff --git a/polygerrit-ui/app/test/functional/infra/run.sh b/polygerrit-ui/app/test/functional/infra/run.sh
new file mode 100755
index 0000000..4beb3dd
--- /dev/null
+++ b/polygerrit-ui/app/test/functional/infra/run.sh
@@ -0,0 +1,14 @@
+#!/bin/sh
+echo Starting local server..
+cp /app/polygerrit_ui.zip .
+unzip -q polygerrit_ui.zip
+nohup http-server polygerrit_ui > /tmp/http-server.log 2>&1 &
+
+echo Starting Webdriver..
+nohup /opt/bin/entry_point.sh > /tmp/webdriver.log 2>&1 &
+
+# Wait for servers to start
+sleep 5
+
+cp $@ .
+jasmine $(basename $@)
diff --git a/polygerrit-ui/app/test/functional/infra/test-infra.js b/polygerrit-ui/app/test/functional/infra/test-infra.js
new file mode 100644
index 0000000..2619694
--- /dev/null
+++ b/polygerrit-ui/app/test/functional/infra/test-infra.js
@@ -0,0 +1,24 @@
+'use strict';
+
+const {Builder} = require('selenium-webdriver');
+
+let driver;
+
+function setup() {
+  return new Builder()
+      .forBrowser('chrome')
+      .usingServer('http://localhost:4444/wd/hub')
+      .build()
+      .then(d => {
+        driver = d;
+        return driver.get('http://localhost:8080');
+      })
+      .then(() => driver);
+}
+
+function cleanup() {
+  return driver.quit();
+}
+
+exports.setup = setup;
+exports.cleanup = cleanup;
diff --git a/polygerrit-ui/app/test/functional/run_functional.sh b/polygerrit-ui/app/test/functional/run_functional.sh
new file mode 100755
index 0000000..7ce57b8
--- /dev/null
+++ b/polygerrit-ui/app/test/functional/run_functional.sh
@@ -0,0 +1,10 @@
+#!/usr/bin/env bash
+
+bazel build //polygerrit-ui/app:polygerrit_ui
+
+docker run --rm \
+  -p 5900:5900 \
+  -v `pwd`/polygerrit-ui/app/test/functional:/tests \
+  -v `pwd`/bazel-genfiles/polygerrit-ui/app:/app \
+  -it gerrit/polygerrit-functional:v1 \
+  /tests/test.js
diff --git a/polygerrit-ui/app/test/functional/test.js b/polygerrit-ui/app/test/functional/test.js
new file mode 100644
index 0000000..d394487
--- /dev/null
+++ b/polygerrit-ui/app/test/functional/test.js
@@ -0,0 +1,25 @@
+/**
+ * @fileoverview Minimal viable frontend functional test.
+ */
+'use strict';
+
+const {until} = require('selenium-webdriver');
+const {setup, cleanup} = require('test-infra');
+
+jasmine.DEFAULT_TIMEOUT_INTERVAL = 20000;
+
+describe('example ', () => {
+  let driver;
+
+  beforeAll(() => {
+    return setup().then(d => driver = d);
+  });
+
+  afterAll(() => {
+    return cleanup();
+  });
+
+  it('should update title', () => {
+    return driver.wait(until.titleIs('status:open · Gerrit Code Review'), 5000);
+  });
+});
diff --git a/polygerrit-ui/app/test/index.html b/polygerrit-ui/app/test/index.html
index cbc5cb0..5784ead 100644
--- a/polygerrit-ui/app/test/index.html
+++ b/polygerrit-ui/app/test/index.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2015 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -26,6 +27,7 @@
   const behaviorsPath = '../behaviors/';
 
   // Elements tests.
+  /* eslint-disable max-len */
   const elements = [
     // This seemed to be flakey when it was farther down the list. Keep at the
     // beginning.
@@ -37,34 +39,43 @@
     'admin/gr-create-change-dialog/gr-create-change-dialog_test.html',
     'admin/gr-create-group-dialog/gr-create-group-dialog_test.html',
     'admin/gr-create-pointer-dialog/gr-create-pointer-dialog_test.html',
-    'admin/gr-create-project-dialog/gr-create-project-dialog_test.html',
+    'admin/gr-create-repo-dialog/gr-create-repo-dialog_test.html',
     'admin/gr-group-audit-log/gr-group-audit-log_test.html',
     'admin/gr-group-members/gr-group-members_test.html',
     'admin/gr-group/gr-group_test.html',
     'admin/gr-permission/gr-permission_test.html',
     'admin/gr-plugin-list/gr-plugin-list_test.html',
-    'admin/gr-project-access/gr-project-access_test.html',
-    'admin/gr-project-commands/gr-project-commands_test.html',
-    'admin/gr-project-detail-list/gr-project-detail-list_test.html',
-    'admin/gr-project-list/gr-project-list_test.html',
-    'admin/gr-project/gr-project_test.html',
+    'admin/gr-repo-access/gr-repo-access_test.html',
+    'admin/gr-repo-command/gr-repo-command_test.html',
+    'admin/gr-repo-commands/gr-repo-commands_test.html',
+    'admin/gr-repo-dashboards/gr-repo-dashboards_test.html',
+    'admin/gr-repo-detail-list/gr-repo-detail-list_test.html',
+    'admin/gr-repo-list/gr-repo-list_test.html',
+    'admin/gr-repo/gr-repo_test.html',
     'admin/gr-rule-editor/gr-rule-editor_test.html',
     'change-list/gr-change-list-item/gr-change-list-item_test.html',
     'change-list/gr-change-list-view/gr-change-list-view_test.html',
     'change-list/gr-change-list/gr-change-list_test.html',
+    'change-list/gr-create-commands-dialog/gr-create-commands-dialog_test.html',
+    'change-list/gr-create-change-help/gr-create-change-help_test.html',
+    'change-list/gr-dashboard-view/gr-dashboard-view_test.html',
     'change-list/gr-user-header/gr-user-header_test.html',
     'change/gr-account-entry/gr-account-entry_test.html',
     'change/gr-account-list/gr-account-list_test.html',
     'change/gr-change-actions/gr-change-actions_test.html',
     'change/gr-change-metadata/gr-change-metadata-it_test.html',
     'change/gr-change-metadata/gr-change-metadata_test.html',
+    'change/gr-change-requirements/gr-change-requirements_test.html',
     'change/gr-change-view/gr-change-view_test.html',
     'change/gr-comment-list/gr-comment-list_test.html',
     'change/gr-commit-info/gr-commit-info_test.html',
+    'change/gr-confirm-abandon-dialog/gr-confirm-abandon-dialog_test.html',
     'change/gr-confirm-cherrypick-dialog/gr-confirm-cherrypick-dialog_test.html',
+    'change/gr-confirm-cherrypick-conflict-dialog/gr-confirm-cherrypick-conflict-dialog_test.html',
     'change/gr-confirm-move-dialog/gr-confirm-move-dialog_test.html',
     'change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog_test.html',
     'change/gr-confirm-revert-dialog/gr-confirm-revert-dialog_test.html',
+    'change/gr-confirm-submit-dialog/gr-confirm-submit-dialog_test.html',
     'change/gr-download-dialog/gr-download-dialog_test.html',
     'change/gr-file-list-header/gr-file-list-header_test.html',
     'change/gr-file-list/gr-file-list_test.html',
@@ -77,13 +88,20 @@
     'change/gr-reply-dialog/gr-reply-dialog-it_test.html',
     'change/gr-reply-dialog/gr-reply-dialog_test.html',
     'change/gr-reviewer-list/gr-reviewer-list_test.html',
+    'change/gr-thread-list/gr-thread-list_test.html',
+    'change/gr-upload-help-dialog/gr-upload-help-dialog_test.html',
     'core/gr-account-dropdown/gr-account-dropdown_test.html',
+    'core/gr-error-dialog/gr-error-dialog_test.html',
     'core/gr-error-manager/gr-error-manager_test.html',
+    'core/gr-key-binding-display/gr-key-binding-display_test.html',
+    'core/gr-keyboard-shortcuts-dialog/gr-keyboard-shortcuts-dialog_test.html',
     'core/gr-main-header/gr-main-header_test.html',
     'core/gr-navigation/gr-navigation_test.html',
+    'core/gr-reporting/gr-jank-detector_test.html',
     'core/gr-reporting/gr-reporting_test.html',
     'core/gr-router/gr-router_test.html',
     'core/gr-search-bar/gr-search-bar_test.html',
+    'core/gr-smart-search/gr-smart-search_test.html',
     'diff/gr-comment-api/gr-comment-api_test.html',
     'diff/gr-diff-builder/gr-diff-builder_test.html',
     'diff/gr-diff-comment-thread-group/gr-diff-comment-thread-group_test.html',
@@ -92,7 +110,7 @@
     'diff/gr-diff-cursor/gr-diff-cursor_test.html',
     'diff/gr-diff-highlight/gr-annotation_test.html',
     'diff/gr-diff-highlight/gr-diff-highlight_test.html',
-    'diff/gr-diff-preferences/gr-diff-preferences_test.html',
+    'diff/gr-diff-mode-selector/gr-diff-mode-selector_test.html',
     'diff/gr-diff-processor/gr-diff-processor_test.html',
     'diff/gr-diff-selection/gr-diff-selection_test.html',
     'diff/gr-diff-view/gr-diff-view_test.html',
@@ -102,7 +120,12 @@
     'diff/gr-ranged-comment-layer/gr-ranged-comment-layer_test.html',
     'diff/gr-selection-action-box/gr-selection-action-box_test.html',
     'diff/gr-syntax-layer/gr-syntax-layer_test.html',
-    'diff/gr-syntax-lib-loader/gr-syntax-lib-loader_test.html',
+    'documentation/gr-documentation-search/gr-documentation-search_test.html',
+    'edit/gr-default-editor/gr-default-editor_test.html',
+    'edit/gr-edit-controls/gr-edit-controls_test.html',
+    'edit/gr-edit-file-controls/gr-edit-file-controls_test.html',
+    'edit/gr-editor-view/gr-editor-view_test.html',
+    'plugins/gr-admin-api/gr-admin-api_test.html',
     'plugins/gr-attribute-helper/gr-attribute-helper_test.html',
     'plugins/gr-endpoint-decorator/gr-endpoint-decorator_test.html',
     'plugins/gr-event-helper/gr-event-helper_test.html',
@@ -110,11 +133,17 @@
     'plugins/gr-plugin-host/gr-plugin-host_test.html',
     'plugins/gr-popup-interface/gr-plugin-popup_test.html',
     'plugins/gr-popup-interface/gr-popup-interface_test.html',
+    'plugins/gr-repo-api/gr-repo-api_test.html',
+    'plugins/gr-settings-api/gr-settings-api_test.html',
     'settings/gr-account-info/gr-account-info_test.html',
     'settings/gr-change-table-editor/gr-change-table-editor_test.html',
+    'settings/gr-cla-view/gr-cla-view_test.html',
+    'settings/gr-edit-preferences/gr-edit-preferences_test.html',
     'settings/gr-email-editor/gr-email-editor_test.html',
+    'settings/gr-gpg-editor/gr-gpg-editor_test.html',
     'settings/gr-group-list/gr-group-list_test.html',
     'settings/gr-http-password/gr-http-password_test.html',
+    'settings/gr-identities/gr-identities_test.html',
     'settings/gr-menu-editor/gr-menu-editor_test.html',
     'settings/gr-registration-dialog/gr-registration-dialog_test.html',
     'settings/gr-settings-view/gr-settings-view_test.html',
@@ -128,10 +157,12 @@
     'shared/gr-avatar/gr-avatar_test.html',
     'shared/gr-button/gr-button_test.html',
     'shared/gr-change-star/gr-change-star_test.html',
-    'shared/gr-confirm-dialog/gr-confirm-dialog_test.html',
+    'shared/gr-change-status/gr-change-status_test.html',
     'shared/gr-copy-clipboard/gr-copy-clipboard_test.html',
     'shared/gr-cursor-manager/gr-cursor-manager_test.html',
     'shared/gr-date-formatter/gr-date-formatter_test.html',
+    'shared/gr-dialog/gr-dialog_test.html',
+    'shared/gr-diff-preferences/gr-diff-preferences_test.html',
     'shared/gr-download-commands/gr-download-commands_test.html',
     'shared/gr-dropdown-list/gr-dropdown-list_test.html',
     'shared/gr-editable-content/gr-editable-content_test.html',
@@ -140,12 +171,17 @@
     'shared/gr-js-api-interface/gr-change-actions-js-api_test.html',
     'shared/gr-js-api-interface/gr-change-reply-js-api_test.html',
     'shared/gr-js-api-interface/gr-js-api-interface_test.html',
+    'shared/gr-js-api-interface/gr-plugin-endpoints_test.html',
     'shared/gr-js-api-interface/gr-plugin-rest-api_test.html',
+    'shared/gr-fixed-panel/gr-fixed-panel_test.html',
+    'shared/gr-labeled-autocomplete/gr-labeled-autocomplete_test.html',
+    'shared/gr-lib-loader/gr-lib-loader_test.html',
     'shared/gr-limited-text/gr-limited-text_test.html',
     'shared/gr-linked-chip/gr-linked-chip_test.html',
     'shared/gr-linked-text/gr-linked-text_test.html',
     'shared/gr-list-view/gr-list-view_test.html',
     'shared/gr-page-nav/gr-page-nav_test.html',
+    'shared/gr-repo-branch-picker/gr-repo-branch-picker_test.html',
     'shared/gr-rest-api-interface/gr-auth_test.html',
     'shared/gr-rest-api-interface/gr-rest-api-interface_test.html',
     'shared/gr-rest-api-interface/gr-reviewer-updates-parser_test.html',
@@ -154,7 +190,9 @@
     'shared/gr-textarea/gr-textarea_test.html',
     'shared/gr-tooltip-content/gr-tooltip-content_test.html',
     'shared/gr-tooltip/gr-tooltip_test.html',
+    'shared/revision-info/revision-info_test.html',
   ];
+  /* eslint-enable max-len */
   for (let file of elements) {
     file = elementsPath + file;
     testFiles.push(file);
@@ -162,19 +200,25 @@
   }
 
   // Behaviors tests.
+  /* eslint-disable max-len */
   const behaviors = [
     'async-foreach-behavior/async-foreach-behavior_test.html',
     'base-url-behavior/base-url-behavior_test.html',
     'docs-url-behavior/docs-url-behavior_test.html',
+    'dom-util-behavior/dom-util-behavior_test.html',
     'keyboard-shortcut-behavior/keyboard-shortcut-behavior_test.html',
     'rest-client-behavior/rest-client-behavior_test.html',
     'gr-access-behavior/gr-access-behavior_test.html',
+    'gr-admin-nav-behavior/gr-admin-nav-behavior_test.html',
     'gr-anonymous-name-behavior/gr-anonymous-name-behavior_test.html',
     'gr-change-table-behavior/gr-change-table-behavior_test.html',
     'gr-patch-set-behavior/gr-patch-set-behavior_test.html',
     'gr-path-list-behavior/gr-path-list-behavior_test.html',
     'gr-tooltip-behavior/gr-tooltip-behavior_test.html',
+    'gr-url-encoding-behavior/gr-url-encoding-behavior_test.html',
+    'safe-types-behavior/safe-types-behavior_test.html',
   ];
+  /* eslint-enable max-len */
   for (let file of behaviors) {
     // Behaviors do not utilize the DOM, so no shadow DOM test is necessary.
     file = behaviorsPath + file;
diff --git a/polygerrit-ui/app/test/test-router.html b/polygerrit-ui/app/test/test-router.html
index 37a20c4..34ff374 100644
--- a/polygerrit-ui/app/test/test-router.html
+++ b/polygerrit-ui/app/test/test-router.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <!--
+@license
 Copyright (C) 2017 The Android Open Source Project
 
 Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,5 +18,5 @@
 
 <link rel="import" href="../elements/core/gr-navigation/gr-navigation.html">
 <script>
-  Gerrit.Nav.setup(url => { /* noop */ }, params => '');
+  Gerrit.Nav.setup(url => { /* noop */ }, params => '', () => []);
 </script>
diff --git a/polygerrit-ui/edit-walkthrough/edit-walkthrough.md b/polygerrit-ui/edit-walkthrough/edit-walkthrough.md
new file mode 100644
index 0000000..717f683
--- /dev/null
+++ b/polygerrit-ui/edit-walkthrough/edit-walkthrough.md
@@ -0,0 +1,80 @@
+# In-browser Editing in Gerrit
+
+### What's going on?
+
+Until Q1 of 2018, editing a file in the browser was not supported by Gerrit's
+new UI. This feature is now done and ready for use.
+
+Read on for a walkthrough of the feature!
+
+### Creating an edit
+
+Click on the "Edit" button to begin.
+
+One may also go to the project mmanagement page (Browse => Repository =>
+Commands => Create Change) to create a new change.
+
+![](./img/into_edit.png)
+
+### Performing an action
+
+The buttons in the file list header open dialogs to perform actions on any file
+in the repo.
+
+*   Open - opens an existing or new file from the repo in an editor.
+*   Delete - deletes an existing file from the repo.
+*   Rename - renames an existing file in the repo.
+
+To leave edit mode and restore the normal buttons to the file list, click "Stop
+editing".
+
+![](./img/in_edit_mode.png)
+
+### Performing an action on a file
+
+The "Actions" dropdown appears on each file, and is used to perform actions on
+that specific file.
+
+*   Open - opens this file in the editor.
+*   Delete - deletes this file from the repo.
+*   Rename - renames this file in the repo.
+*   Restore - restores this file to the state it existed in at the patch the
+edit was created on.
+
+![](./img/actions_overflow.png)
+
+### Modifying the file
+
+This is the editor view.
+
+Clicking on the file path allows you to rename the file, You can edit code in
+the textarea, and "Close" will discard any unsaved changes and navigate back to
+the previous view.
+
+![](./img/in_editor.png)
+
+### Saving the edit
+
+You can save changes to the code with `cmd+s`, `ctrl+s`, or by clicking the
+"Save" button.
+
+![](./img/edit_made.png)
+
+### Publishing the edit
+
+You may publish or delete the edit by clicking the buttons in the header.
+
+
+
+![](./img/edit_pending.png)
+
+### What if I have questions not answered here?
+
+Gerrit's [official docs](https://gerrit-review.googlesource.com/Documentation/user-inline-edit.html)
+are in the process of being updated and largely refer to the old UI, but the
+user experience is largely the same.
+
+Otherwise, please email
+[the repo-discuss mailing list](mailto:repo-discuss@google.com) or file a bug
+on Gerrit's official bug tracker,
+[Monorail](https://bugs.chromium.org/p/gerrit/issues/entry?template=PolyGerrit+Issue).
\ No newline at end of file
diff --git a/polygerrit-ui/edit-walkthrough/img/actions_overflow.png b/polygerrit-ui/edit-walkthrough/img/actions_overflow.png
new file mode 100644
index 0000000..bf39763
--- /dev/null
+++ b/polygerrit-ui/edit-walkthrough/img/actions_overflow.png
Binary files differ
diff --git a/polygerrit-ui/edit-walkthrough/img/edit_made.png b/polygerrit-ui/edit-walkthrough/img/edit_made.png
new file mode 100644
index 0000000..658245d
--- /dev/null
+++ b/polygerrit-ui/edit-walkthrough/img/edit_made.png
Binary files differ
diff --git a/polygerrit-ui/edit-walkthrough/img/edit_pending.png b/polygerrit-ui/edit-walkthrough/img/edit_pending.png
new file mode 100644
index 0000000..a63f6ee
--- /dev/null
+++ b/polygerrit-ui/edit-walkthrough/img/edit_pending.png
Binary files differ
diff --git a/polygerrit-ui/edit-walkthrough/img/in_edit_mode.png b/polygerrit-ui/edit-walkthrough/img/in_edit_mode.png
new file mode 100644
index 0000000..582ed66
--- /dev/null
+++ b/polygerrit-ui/edit-walkthrough/img/in_edit_mode.png
Binary files differ
diff --git a/polygerrit-ui/edit-walkthrough/img/in_editor.png b/polygerrit-ui/edit-walkthrough/img/in_editor.png
new file mode 100644
index 0000000..228d020
--- /dev/null
+++ b/polygerrit-ui/edit-walkthrough/img/in_editor.png
Binary files differ
diff --git a/polygerrit-ui/edit-walkthrough/img/into_edit.png b/polygerrit-ui/edit-walkthrough/img/into_edit.png
new file mode 100644
index 0000000..b6c14ed
--- /dev/null
+++ b/polygerrit-ui/edit-walkthrough/img/into_edit.png
Binary files differ
diff --git a/polygerrit-ui/run-server.sh b/polygerrit-ui/run-server.sh
index cbe3563..64bca68 100755
--- a/polygerrit-ui/run-server.sh
+++ b/polygerrit-ui/run-server.sh
@@ -14,23 +14,7 @@
 # limitations under the License.
 
 set -eu
-
-while [[ ! -f WORKSPACE && "$PWD" != / ]]; do
-  cd ..
-done
-if [[ ! -f WORKSPACE ]]; then
-  echo "$(basename "$0"): must be run from a gerrit checkout" 1>&2
-  exit 1
-fi
-
-bazel build \
-  //polygerrit-ui/app:test_components \
-  //polygerrit-ui:fonts.zip
-
-cd polygerrit-ui/app
-rm -rf bower_components
-unzip -q ../../bazel-bin/polygerrit-ui/app/test_components.zip
-rm -rf fonts
-unzip -q ../../bazel-bin/polygerrit-ui/fonts.zip -d fonts
-cd ..
-exec go run server.go "$@"
+SCRIPTNAME=$(mktemp)
+trap "{ rm -f $SCRIPTNAME; }" EXIT
+bazel run --script_path="$SCRIPTNAME" //polygerrit-ui:devserver
+"$SCRIPTNAME" "$@"
diff --git a/polygerrit-ui/server.go b/polygerrit-ui/server.go
index 79cf4bf..ba685184 100644
--- a/polygerrit-ui/server.go
+++ b/polygerrit-ui/server.go
@@ -15,6 +15,7 @@
 package main
 
 import (
+	"archive/zip"
 	"bufio"
 	"compress/gzip"
 	"encoding/json"
@@ -26,27 +27,63 @@
 	"net"
 	"net/http"
 	"net/url"
+	"os"
+	"path/filepath"
 	"regexp"
 	"strings"
+
+	"github.com/robfig/soy"
+	"github.com/robfig/soy/soyhtml"
+	"golang.org/x/tools/godoc/vfs/httpfs"
+	"golang.org/x/tools/godoc/vfs/zipfs"
 )
 
 var (
-	restHost = flag.String("host", "gerrit-review.googlesource.com", "Host to proxy requests to")
+	plugins  = flag.String("plugins", "", "comma seperated plugin paths to serve")
 	port     = flag.String("port", ":8081", "Port to serve HTTP requests on")
 	prod     = flag.Bool("prod", false, "Serve production assets")
+	restHost = flag.String("host", "gerrit-review.googlesource.com", "Host to proxy requests to")
 	scheme   = flag.String("scheme", "https", "URL scheme")
-	plugins  = flag.String("plugins", "", "Path to local plugins folder")
+
+	tofu *soyhtml.Tofu
 )
 
 func main() {
 	flag.Parse()
 
+	fontsArchive, err := openDataArchive("fonts.zip")
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	componentsArchive, err := openDataArchive("app/test_components.zip")
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	tofu, err = resolveIndexTemplate()
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	workspace := os.Getenv("BUILD_WORKSPACE_DIRECTORY")
+	if err := os.Chdir(filepath.Join(workspace, "polygerrit-ui")); err != nil {
+		log.Fatal(err)
+	}
+
+	http.HandleFunc("/index.html", handleIndex)
+
 	if *prod {
 		http.Handle("/", http.FileServer(http.Dir("dist")))
 	} else {
 		http.Handle("/", http.FileServer(http.Dir("app")))
 	}
 
+	http.Handle("/bower_components/",
+		http.FileServer(httpfs.New(zipfs.New(componentsArchive, "bower_components"))))
+	http.Handle("/fonts/",
+		http.FileServer(httpfs.New(zipfs.New(fontsArchive, "fonts"))))
+
 	http.HandleFunc("/changes/", handleRESTProxy)
 	http.HandleFunc("/accounts/", handleRESTProxy)
 	http.HandleFunc("/config/", handleRESTProxy)
@@ -54,8 +91,8 @@
 	http.HandleFunc("/accounts/self/detail", handleAccountDetail)
 	if len(*plugins) > 0 {
 		http.Handle("/plugins/", http.StripPrefix("/plugins/",
-			http.FileServer(http.Dir(*plugins))))
-		log.Println("Local plugins from", *plugins)
+			http.FileServer(http.Dir("../plugins"))))
+		log.Println("Local plugins from", "../plugins")
 	} else {
 		http.HandleFunc("/plugins/", handleRESTProxy)
 	}
@@ -63,14 +100,38 @@
 	log.Fatal(http.ListenAndServe(*port, &server{}))
 }
 
-func handleRESTProxy(w http.ResponseWriter, r *http.Request) {
-	if strings.HasSuffix(r.URL.Path, ".html") {
-		w.Header().Set("Content-Type", "text/html")
-	} else if strings.HasSuffix(r.URL.Path, ".css") {
-		w.Header().Set("Content-Type", "text/css")
-	} else {
-		w.Header().Set("Content-Type", "application/json")
+func resolveIndexTemplate() (*soyhtml.Tofu, error) {
+	basePath, err := resourceBasePath()
+	if err != nil {
+		return nil, err
 	}
+	return soy.NewBundle().
+		AddTemplateFile(basePath + ".runfiles/gerrit/resources/com/google/gerrit/httpd/raw/PolyGerritIndexHtml.soy").
+		CompileToTofu()
+}
+
+func openDataArchive(path string) (*zip.ReadCloser, error) {
+	absBinPath, err := resourceBasePath()
+	if err != nil {
+		return nil, err
+	}
+	return zip.OpenReader(absBinPath + ".runfiles/gerrit/polygerrit-ui/" + path)
+}
+
+func resourceBasePath() (string, error) {
+	return filepath.Abs(os.Args[0])
+}
+
+func handleIndex(w http.ResponseWriter, r *http.Request) {
+	var obj = map[string]interface{}{
+		"canonicalPath":      "",
+		"staticResourcePath": "",
+	}
+	w.Header().Set("Content-Type", "text/html")
+	tofu.Render(w, "com.google.gerrit.httpd.raw.Index", obj)
+}
+
+func handleRESTProxy(w http.ResponseWriter, r *http.Request) {
 	req := &http.Request{
 		Method: "GET",
 		URL: &url.URL{
@@ -86,6 +147,13 @@
 		return
 	}
 	defer res.Body.Close()
+	for name, values := range res.Header {
+		for _, value := range values {
+			if name != "Content-Length" {
+				w.Header().Add(name, value)
+			}
+		}
+	}
 	w.WriteHeader(res.StatusCode)
 	if _, err := io.Copy(w, patchResponse(r, res)); err != nil {
 		log.Println("Error copying response to ResponseWriter:", err)
@@ -144,19 +212,23 @@
 	}
 
 	// Configuration path in the JSON server response
-	pluginsPath := []string{"plugin", "html_resource_paths"}
+	jsPluginsPath := []string{"plugin", "js_resource_paths"}
+	htmlPluginsPath := []string{"plugin", "html_resource_paths"}
+	htmlResources := getJsonPropByPath(response, htmlPluginsPath).([]interface{})
+	jsResources := getJsonPropByPath(response, jsPluginsPath).([]interface{})
 
-	htmlResources := getJsonPropByPath(response, pluginsPath).([]interface{})
-	files, err := ioutil.ReadDir(*plugins)
-	if err != nil {
-		log.Fatal(err)
-	}
-	for _, f := range files {
-		if strings.HasSuffix(f.Name(), ".html") {
-			htmlResources = append(htmlResources, "plugins/"+f.Name())
+	for _, p := range strings.Split(*plugins, ",") {
+		if strings.HasSuffix(p, ".html") {
+			htmlResources = append(htmlResources, p)
+		}
+
+		if strings.HasSuffix(p, ".js") {
+			jsResources = append(jsResources, p)
 		}
 	}
-	setJsonPropByPath(response, pluginsPath, htmlResources)
+
+	setJsonPropByPath(response, jsPluginsPath, jsResources)
+	setJsonPropByPath(response, htmlPluginsPath, htmlResources)
 
 	reader, writer := io.Pipe()
 	go func() {
@@ -200,20 +272,20 @@
 
 // Any path prefixes that should resolve to index.html.
 var (
-	fePaths    = []string{"/q/", "/c/", "/dashboard/", "/admin/"}
+	fePaths    = []string{"/q/", "/c/", "/p/", "/x/", "/dashboard/", "/admin/"}
 	issueNumRE = regexp.MustCompile(`^\/\d+\/?$`)
 )
 
 func (_ *server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 	log.Printf("%s %s %s %s\n", r.Proto, r.Method, r.RemoteAddr, r.URL)
 	for _, prefix := range fePaths {
-		if strings.HasPrefix(r.URL.Path, prefix) {
-			r.URL.Path = "/"
-			log.Println("Redirecting to /")
+		if strings.HasPrefix(r.URL.Path, prefix) || r.URL.Path == "/" {
+			r.URL.Path = "/index.html"
+			log.Println("Redirecting to /index.html")
 			break
 		} else if match := issueNumRE.Find([]byte(r.URL.Path)); match != nil {
-			r.URL.Path = "/"
-			log.Println("Redirecting to /")
+			r.URL.Path = "/index.html"
+			log.Println("Redirecting to /index.html")
 			break
 		}
 	}
diff --git a/prolog/BUILD b/prolog/BUILD
new file mode 100644
index 0000000..5de443d
--- /dev/null
+++ b/prolog/BUILD
@@ -0,0 +1,8 @@
+load("//lib/prolog:prolog.bzl", "prolog_cafe_library")
+
+prolog_cafe_library(
+    name = "gerrit-prolog-common",
+    srcs = ["gerrit_common.pl"],
+    visibility = ["//visibility:public"],
+    deps = ["//java/gerrit:prolog-predicates"],
+)
diff --git a/prolog/gerrit_common.pl b/prolog/gerrit_common.pl
new file mode 100644
index 0000000..e2857d0
--- /dev/null
+++ b/prolog/gerrit_common.pl
@@ -0,0 +1,431 @@
+%% Copyright (C) 2011 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 gerrit.
+'$init' :- init.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% init:
+%%
+%%   Initialize the module's private state. These typically take the form of global
+%%   aliased hashes carrying "constant" data about the current change for any
+%%   predicate that needs to obtain it.
+%%
+init :-
+  define_hash(commit_labels).
+
+define_hash(A) :- hash_exists(A), !, hash_clear(A).
+define_hash(A) :- atom(A), !, new_hash(_, [alias(A)]).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% commit_label/2:
+%%
+%% During rule evaluation of a change, this predicate is defined to
+%% be a table of labels that pertain to the commit of interest.
+%%
+%%   commit_label( label('Code-Review', 2), user(12345789) ).
+%%   commit_label( label('Verified', -1), user(8181) ).
+%%
+:- public commit_label/2.
+%%
+commit_label(L, User) :- L = label(H, _),
+  atom(H),
+  !,
+  hash_get(commit_labels, H, Cached),
+  ( [] == Cached ->
+    get_commit_labels(_),
+    hash_get(commit_labels, H, Rs), !
+    ;
+    Rs = Cached
+  ),
+  scan_commit_labels(Rs, L, User)
+  .
+commit_label(Label, User) :-
+  get_commit_labels(Rs),
+  scan_commit_labels(Rs, Label, User).
+
+scan_commit_labels([R | Rs], L, U) :- R = commit_label(L, U).
+scan_commit_labels([_ | Rs], L, U) :- scan_commit_labels(Rs, L, U).
+scan_commit_labels([], _, _) :- fail.
+
+get_commit_labels(Rs) :-
+  hash_contains_key(commit_labels, '$all'),
+  !,
+  hash_get(commit_labels, '$all', Rs)
+  .
+get_commit_labels(Rs) :-
+  '_load_commit_labels'(Rs),
+  set_commit_labels(Rs).
+
+set_commit_labels(Rs) :-
+  define_hash(commit_labels),
+  hash_put(commit_labels, '$all', Rs),
+  index_commit_labels(Rs).
+
+index_commit_labels([]).
+index_commit_labels([R | Rs]) :-
+  R = commit_label(label(H, _), _),
+  atom(H),
+  !,
+  hash_get(commit_labels, H, Tmp),
+  hash_put(commit_labels, H, [R | Tmp]),
+  index_commit_labels(Rs)
+  .
+index_commit_labels([_ | Rs]) :-
+  index_commit_labels(Rs).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% not_same/2:
+%%
+:- public not_same/2.
+%%
+not_same(ok(A), ok(B)) :- !, A \= B.
+not_same(label(_, ok(A)), label(_, ok(B))) :- !, A \= B.
+not_same(_, _).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% can_submit/2:
+%%
+%%   Executes the SubmitRule for each solution until one where all of the
+%%   states has the format label(_, ok(_)) is found, then cut away any
+%%   remaining choice points leaving this as the last solution.
+%%
+:- public can_submit/2.
+%%
+can_submit(SubmitRule, S) :-
+  call_rule(SubmitRule, Tmp),
+  Tmp =.. [submit | Ls],
+  ( is_all_ok(Ls) -> S = ok(Tmp), ! ; S = not_ready(Tmp) ).
+
+call_rule(P:X, Arg) :- !, F =.. [X, Arg], P:F.
+call_rule(X, Arg) :- !, F =.. [X, Arg], F.
+
+is_all_ok([]).
+is_all_ok([label(_, ok(__)) | Ls]) :- is_all_ok(Ls).
+is_all_ok([label(_, may(__)) | Ls]) :- is_all_ok(Ls).
+is_all_ok(_) :- fail.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% locate_helper
+%%
+%%   Returns user:Func if it exists otherwise returns gerrit:Default
+
+locate_helper(Func, Default, Arity, user:Func) :-
+    '$compiled_predicate'(user, Func, Arity), !.
+locate_helper(Func, Default, Arity, user:Func) :-
+    listN(Arity, P), C =.. [Func | P], clause(user:C, _), !.
+locate_helper(Func, Default, _, gerrit:Default).
+
+listN(0, []).
+listN(N, [_|T]) :- N > 0, N1 is N - 1, listN(N1, T).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% locate_submit_rule/1:
+%%
+%%   Finds a submit_rule depending on what rules are available.
+%%   If none are available, use default_submit/1.
+%%
+:- public locate_submit_rule/1.
+%%
+
+locate_submit_rule(RuleName) :-
+  locate_helper(submit_rule, default_submit, 1, RuleName).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% get_submit_type/2:
+%%
+%%   Executes the SubmitTypeRule and return the first solution
+%%
+:- public get_submit_type/2.
+%%
+get_submit_type(SubmitTypeRule, A) :-
+  call_rule(SubmitTypeRule, A), !.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% locate_submit_type/1:
+%%
+%%   Finds a submit_type_rule depending on what rules are available.
+%%   If none are available, use project_default_submit_type/1.
+%%
+:- public locate_submit_type/1.
+%%
+locate_submit_type(RuleName) :-
+  locate_helper(submit_type, project_default_submit_type, 1, RuleName).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% default_submit/1:
+%%
+:- public default_submit/1.
+%%
+default_submit(P) :-
+  get_legacy_label_types(LabelTypes),
+  default_submit(LabelTypes, P).
+
+% Apply the old "all approval categories must be satisfied"
+% loop by scanning over all of the label types to build up the
+% submit record.
+%
+default_submit(LabelTypes, P) :-
+  default_submit(LabelTypes, [], Tmp),
+  reverse(Tmp, Ls),
+  P =.. [ submit | Ls].
+
+default_submit([], Out, Out).
+default_submit([Type | Types], Tmp, Out) :-
+  label_type(Label, Fun, Min, Max) = Type,
+  legacy_submit_rule(Fun, Label, Min, Max, Status),
+  R = label(Label, Status),
+  default_submit(Types, [R | Tmp], Out).
+
+
+%% legacy_submit_rule:
+%%
+%% Apply the old -2..+2 style logic.
+%%
+legacy_submit_rule('MaxWithBlock', Label, Min, Max, T) :- !, max_with_block(Label, Min, Max, T).
+legacy_submit_rule('AnyWithBlock', Label, Min, Max, T) :- !, any_with_block(Label, Min, T).
+legacy_submit_rule('MaxNoBlock', Label, Min, Max, T) :- !, max_no_block(Label, Max, T).
+legacy_submit_rule('NoBlock', Label, Min, Max, T) :- !, T = may(_).
+legacy_submit_rule('NoOp', Label, Min, Max, T) :- !, T = may(_).
+legacy_submit_rule('PatchSetLock', Label, Min, Max, T) :- !, T = may(_).
+legacy_submit_rule(Fun, Label, Min, Max, T) :- T = impossible(unsupported(Fun)).
+
+%% max_with_block:
+%%
+%% - The minimum is never used.
+%% - At least one maximum is used.
+%%
+:- public max_with_block/4.
+%%
+max_with_block(Min, Max, Label, label(Label, S)) :-
+  number(Min), number(Max), atom(Label),
+  !,
+  max_with_block(Label, Min, Max, S).
+max_with_block(Label, Min, Max, reject(Who)) :-
+  commit_label(label(Label, Min), Who),
+  !
+  .
+max_with_block(Label, Min, Max, ok(Who)) :-
+  \+ commit_label(label(Label, Min), _),
+  commit_label(label(Label, Max), Who),
+  !
+  .
+max_with_block(Label, Min, Max, need(Max)) :-
+  true
+  .
+
+%% any_with_block:
+%%
+%% - The maximum is never used.
+%%
+any_with_block(Label, Min, reject(Who)) :-
+  Min < 0,
+  commit_label(label(Label, Min), Who),
+  !
+  .
+any_with_block(Label, Min, may(_)).
+
+
+%% max_no_block:
+%%
+%% - At least one maximum is used.
+%%
+max_no_block(Max, Label, label(Label, S)) :-
+  number(Max), atom(Label),
+  !,
+  max_no_block(Label, Max, S).
+max_no_block(Label, Max, ok(Who)) :-
+  commit_label(label(Label, Max), Who),
+  !
+  .
+max_no_block(Label, Max, need(Max)) :-
+  true
+  .
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% filter_submit_results/3:
+%%
+%%   Executes the submit_filter against the given list of results,
+%%   returns a list of filtered results.
+%%
+:- public filter_submit_results/3.
+%%
+filter_submit_results(Filter, In, Out) :-
+    filter_submit_results(Filter, In, [], Tmp),
+    reverse(Tmp, Out).
+filter_submit_results(Filter, [I | In], Tmp, Out) :-
+    arg(1, I, R),
+    call_submit_filter(Filter, R, S),
+    !,
+    S =.. [submit | Ls],
+    ( is_all_ok(Ls) -> T = ok(S) ; T = not_ready(S) ),
+    filter_submit_results(Filter, In, [T | Tmp], Out).
+filter_submit_results(Filter, [_ | In], Tmp, Out) :-
+   filter_submit_results(Filter, In, Tmp, Out),
+   !
+   .
+filter_submit_results(Filter, [], Out, Out).
+
+call_submit_filter(P:X, R, S) :- !, F =.. [X, R, S], P:F.
+call_submit_filter(X, R, S) :- F =.. [X, R, S], F.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% filter_submit_type_results/3:
+%%
+%%   Executes the submit_type_filter against the result,
+%%   returns the filtered result.
+%%
+:- public filter_submit_type_results/3.
+%%
+filter_submit_type_results(Filter, In, Out) :- call_submit_filter(Filter, In, Out).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% locate_submit_filter/1:
+%%
+%%   Finds a submit_filter if available.
+%%
+:- public locate_submit_filter/1.
+%%
+locate_submit_filter(FilterName) :-
+  locate_helper(submit_filter, noop_filter, 2, FilterName).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% noop_filter/2:
+%%
+:- public noop_filter/2.
+%%
+noop_filter(In, In).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% locate_submit_type_filter/1:
+%%
+%%   Finds a submit_type_filter if available.
+%%
+:- public locate_submit_type_filter/1.
+%%
+locate_submit_type_filter(FilterName) :-
+  locate_helper(submit_type_filter, noop_filter, 2, FilterName).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% find_label/3:
+%%
+%%   Finds labels successively and fails when there are no more results.
+%%
+:- public find_label/3.
+%%
+find_label([], _, _) :- !, fail.
+find_label(List, Name, Label) :-
+  List = [_ | _],
+  !,
+  find_label2(List, Name, Label).
+find_label(S, Name, Label) :-
+  S =.. [submit | Ls],
+  find_label2(Ls, Name, Label).
+
+find_label2([L | _ ], Name, L) :- L = label(Name, _).
+find_label2([_ | Ls], Name, L) :- find_label2(Ls, Name, L).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% remove_label/3:
+%%
+%%   Removes all occurances of label(Name, Status).
+%%
+:- public remove_label/3.
+%%
+remove_label([], _, []) :- !.
+remove_label(List, Label, Out) :-
+  List = [_ | _],
+  !,
+  subtract1(List, Label, Out).
+remove_label(S, Label, Out) :-
+  S =.. [submit | Ls],
+  subtract1(Ls, Label, Tmp),
+  Out =.. [submit | Tmp].
+
+subtract1([], _, []) :- !.
+subtract1([E | L], E, R) :- !, subtract1(L, E, R).
+subtract1([H | L], E, [H | R]) :- subtract1(L, E, R).
+
+
+%% commit_author/1:
+%%
+:- public commit_author/1.
+%%
+commit_author(Author) :-
+  commit_author(Author, _, _).
+
+
+%% commit_committer/1:
+%%
+:- public commit_committer/1.
+%%
+commit_committer(Committer) :-
+  commit_committer(Committer, _, _).
+
+
+%% commit_delta/1:
+%%
+:- public commit_delta/1.
+%%
+commit_delta(Regex) :-
+  once(commit_delta(Regex, _, _, _)).
+
+
+%% commit_delta/3:
+%%
+:- public commit_delta/3.
+%%
+commit_delta(Regex, Type, Path) :-
+  commit_delta(Regex, TmpType, NewPath, OldPath),
+  split_commit_delta(TmpType, NewPath, OldPath, Type, Path).
+
+split_commit_delta(rename, NewPath, OldPath, delete, OldPath).
+split_commit_delta(rename, NewPath, OldPath, add, NewPath) :- !.
+split_commit_delta(copy, NewPath, OldPath, add, NewPath) :- !.
+split_commit_delta(Type, Path, _, Type, Path).
+
+
+%% commit_message_matches/1:
+%%
+:- public commit_message_matches/1.
+%%
+commit_message_matches(Pattern) :-
+  commit_message(Msg),
+  regex_matches(Pattern, Msg).
diff --git a/prologtests/BUILD b/prologtests/BUILD
new file mode 100644
index 0000000..279dbb7
--- /dev/null
+++ b/prologtests/BUILD
@@ -0,0 +1,5 @@
+filegroup(
+    name = "gerrit_common_test",
+    srcs = ["com/google/gerrit/server/rules/gerrit_common_test.pl"],
+    visibility = ["//visibility:public"],
+)
diff --git a/gerrit-server/src/test/resources/com/google/gerrit/rules/gerrit_common_test.pl b/prologtests/com/google/gerrit/server/rules/gerrit_common_test.pl
similarity index 100%
rename from gerrit-server/src/test/resources/com/google/gerrit/rules/gerrit_common_test.pl
rename to prologtests/com/google/gerrit/server/rules/gerrit_common_test.pl
diff --git a/proto/BUILD b/proto/BUILD
new file mode 100644
index 0000000..00d725a
--- /dev/null
+++ b/proto/BUILD
@@ -0,0 +1,31 @@
+proto_library(
+    name = "cache_proto",
+    srcs = ["cache.proto"],
+)
+
+java_proto_library(
+    name = "cache_java_proto",
+    visibility = ["//visibility:public"],
+    deps = [":cache_proto"],
+)
+
+genrule(
+    name = "gen_reviewdb_proto",
+    outs = ["reviewdb.proto"],
+    cmd = "$(location //java/com/google/gerrit/proto:ProtoGen) -o $@",
+    tools = ["//java/com/google/gerrit/proto:ProtoGen"],
+)
+
+proto_library(
+    name = "reviewdb_proto",
+    srcs = [":reviewdb.proto"],
+)
+
+java_proto_library(
+    name = "reviewdb_java_proto",
+    visibility = [
+        "//javatests/com/google/gerrit/proto:__pkg__",
+        "//tools/eclipse:__pkg__",
+    ],
+    deps = [":reviewdb_proto"],
+)
diff --git a/proto/cache.proto b/proto/cache.proto
new file mode 100644
index 0000000..c2ac0d9
--- /dev/null
+++ b/proto/cache.proto
@@ -0,0 +1,236 @@
+// 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.
+
+syntax = "proto3";
+
+package gerrit.cache;
+
+option java_package = "com.google.gerrit.server.cache.proto";
+
+// Serialized form of com.google.gerrit.server.change.CHangeKindCacheImpl.Key.
+// Next ID: 4
+message ChangeKindKeyProto {
+  bytes prior = 1;
+  bytes next = 2;
+  string strategy_name = 3;
+}
+
+// Serialized form of
+// com.google.gerrit.server.change.MergeabilityCacheImpl.EntryKey.
+// Next ID: 5
+message MergeabilityKeyProto {
+  bytes commit = 1;
+  bytes into = 2;
+  string submit_type = 3;
+  string merge_strategy = 4;
+}
+
+// Serialized form of com.google.gerrit.extensions.auth.oauth.OAuthToken.
+// Next ID: 6
+message OAuthTokenProto {
+  string token = 1;
+  string secret = 2;
+  string raw = 3;
+  int64 expires_at = 4;
+  string provider_id = 5;
+}
+
+
+// Serialized form of com.google.gerrit.server.notedb.ChangeNotesCache.Key.
+// Next ID: 4
+message ChangeNotesKeyProto {
+  string project = 1;
+  int32 change_id = 2;
+  bytes id = 3;
+}
+
+// Serialized from of com.google.gerrit.server.notedb.ChangeNotesState.
+//
+// Note on embedded protos: this is just for storing in a cache, so some formats
+// were chosen ease of coding the initial implementation. In particular, where
+// there already exists another serialization mechanism in Gerrit for
+// serializing a particular field, we use that rather than defining a new proto
+// type. This includes ReviewDb types that can be serialized to proto using
+// ProtobufCodec as well as NoteDb and indexed types that are serialized using
+// JSON. We can always revisit this decision later, particularly when we
+// eliminate the ReviewDb types; it just requires bumping the cache version.
+//
+// Note on nullability: there are a lot of nullable fields in ChangeNotesState
+// and its dependencies. It's likely we could make some of them non-nullable,
+// but each one of those would be a potentially significant amount of cleanup,
+// and there's no guarantee we'd be able to eliminate all of them. (For a less
+// complex class, it's likely the cleanup would be more feasible.)
+//
+// Instead, we just take the tedious yet simple approach of having a "has_foo"
+// field for each nullable field "foo", indicating whether or not foo is null.
+//
+// Next ID: 19
+message ChangeNotesStateProto {
+  // Effectively required, even though the corresponding ChangeNotesState field
+  // is optional, since the field is only absent when NoteDb is disabled, in
+  // which case attempting to use the ChangeNotesCache is programmer error.
+  bytes meta_id = 1;
+
+  int32 change_id = 2;
+
+  // Next ID: 24
+  message ChangeColumnsProto {
+    string change_key = 1;
+
+    int64 created_on = 2;
+
+    int64 last_updated_on = 3;
+
+    int32 owner = 4;
+
+    string branch = 5;
+
+    int32 current_patch_set_id = 6;
+    bool has_current_patch_set_id = 7;
+
+    string subject = 8;
+
+    string topic = 9;
+    bool has_topic = 10;
+
+    string original_subject = 11;
+    bool has_original_subject = 12;
+
+    string submission_id = 13;
+    bool has_submission_id = 14;
+
+    int32 assignee = 15;
+    bool has_assignee = 16;
+
+    string status = 17;
+    bool has_status = 18;
+
+    bool is_private = 19;
+
+    bool work_in_progress = 20;
+
+    bool review_started = 21;
+
+    int32 revert_of = 22;
+    bool has_revert_of = 23;
+  }
+  // Effectively required, even though the corresponding ChangeNotesState field
+  // is optional, since the field is only absent when NoteDb is disabled, in
+  // which case attempting to use the ChangeNotesCache is programmer error.
+  ChangeColumnsProto columns = 3;
+
+  repeated int32 past_assignee = 4;
+
+  repeated string hashtag = 5;
+
+  // Raw PatchSet proto as produced by ProtobufCodec.
+  repeated bytes patch_set = 6;
+
+  // Raw PatchSetApproval proto as produced by ProtobufCodec.
+  repeated bytes approval = 7;
+
+  // Next ID: 4
+  message ReviewerSetEntryProto {
+    string state = 1;
+    int32 account_id = 2;
+    int64 timestamp = 3;
+  }
+  repeated ReviewerSetEntryProto reviewer = 8;
+
+  // Next ID: 4
+  message ReviewerByEmailSetEntryProto {
+    string state = 1;
+    string address = 2;
+    int64 timestamp = 3;
+  }
+  repeated ReviewerByEmailSetEntryProto reviewer_by_email = 9;
+
+  repeated ReviewerSetEntryProto pending_reviewer = 10;
+
+  repeated ReviewerByEmailSetEntryProto pending_reviewer_by_email = 11;
+
+  repeated int32 past_reviewer = 12;
+
+  // Next ID: 5
+  message ReviewerStatusUpdateProto {
+    int64 date = 1;
+    int32 updated_by = 2;
+    int32 reviewer = 3;
+    string state = 4;
+  }
+  repeated ReviewerStatusUpdateProto reviewer_update = 13;
+
+  // JSON produced from
+  // com.google.gerrit.server.index.change.ChangeField.StoredSubmitRecord.
+  repeated string submit_record = 14;
+
+  // Raw ChangeMessage proto as produced by ProtobufCodec.
+  repeated bytes change_message = 15;
+
+  // JSON produced from com.google.gerrit.reviewdb.client.Comment.
+  repeated string published_comment = 16;
+
+  int64 read_only_until = 17;
+  bool has_read_only_until = 18;
+}
+
+
+// Serialized form of com.google.gerrit.server.query.change.ConflictKey
+message ConflictKeyProto {
+  bytes commit = 1;
+  bytes other_commit = 2;
+  string submit_type = 3;
+  bool content_merge = 4;
+}
+
+// Serialized form of com.google.gerrit.server.query.git.TagSetHolder.
+// Next ID: 3
+message TagSetHolderProto {
+  string project_name = 1;
+
+  // Next ID: 4
+  message TagSetProto {
+    string project_name = 1;
+
+    // Next ID: 3
+    message CachedRefProto {
+      bytes id = 1;
+      int32 flag = 2;
+    }
+    map<string, CachedRefProto> ref = 2;
+
+    // Next ID: 3
+    message TagProto {
+      bytes id = 1;
+      bytes flags = 2;
+    }
+    repeated TagProto tag = 3;
+  }
+  TagSetProto tags = 2;
+}
+
+// Serialized form of
+// com.google.gerrit.server.account.externalids.AllExternalIds.
+// Next ID: 2
+message AllExternalIdsProto {
+  // Next ID: 6
+  message ExternalIdProto {
+    string key = 1;
+    int32 accountId = 2;
+    string email = 3;
+    string password = 4;
+    bytes blobId = 5;
+  }
+  repeated ExternalIdProto external_id = 1;
+}
diff --git a/resources/BUILD b/resources/BUILD
new file mode 100644
index 0000000..18d8df6
--- /dev/null
+++ b/resources/BUILD
@@ -0,0 +1,14 @@
+load("//tools/bzl:genrule2.bzl", "genrule2")
+
+java_import(
+    name = "log4j-config",
+    jars = [":log4j-config__jar"],
+    visibility = ["//visibility:public"],
+)
+
+genrule2(
+    name = "log4j-config__jar",
+    srcs = ["log4j.properties"],
+    outs = ["log4j-config.jar"],
+    cmd = "cd resources && zip -9Dqr $$ROOT/$@ .",
+)
diff --git a/resources/com/google/gerrit/acceptance/BUILD b/resources/com/google/gerrit/acceptance/BUILD
new file mode 100644
index 0000000..38da575
--- /dev/null
+++ b/resources/com/google/gerrit/acceptance/BUILD
@@ -0,0 +1,8 @@
+filegroup(
+    name = "acceptance",
+    srcs = glob(
+        ["**/*"],
+        exclude = ["BUILD"],
+    ),
+    visibility = ["//visibility:public"],
+)
diff --git a/gerrit-acceptance-tests/src/test/resources/com/google/gerrit/acceptance/server/mail/tlds-alpha-by-domain.txt b/resources/com/google/gerrit/acceptance/server/mail/tlds-alpha-by-domain.txt
similarity index 100%
rename from gerrit-acceptance-tests/src/test/resources/com/google/gerrit/acceptance/server/mail/tlds-alpha-by-domain.txt
rename to resources/com/google/gerrit/acceptance/server/mail/tlds-alpha-by-domain.txt
diff --git a/resources/com/google/gerrit/httpd/BUILD b/resources/com/google/gerrit/httpd/BUILD
new file mode 100644
index 0000000..8ac21da
--- /dev/null
+++ b/resources/com/google/gerrit/httpd/BUILD
@@ -0,0 +1,8 @@
+filegroup(
+    name = "httpd",
+    srcs = glob(
+        ["**/*"],
+        exclude = ["BUILD"],
+    ),
+    visibility = ["//visibility:public"],
+)
diff --git a/gerrit-httpd/src/main/resources/com/google/gerrit/httpd/auth/become/BecomeAnyAccount.html b/resources/com/google/gerrit/httpd/auth/become/BecomeAnyAccount.html
similarity index 100%
rename from gerrit-httpd/src/main/resources/com/google/gerrit/httpd/auth/become/BecomeAnyAccount.html
rename to resources/com/google/gerrit/httpd/auth/become/BecomeAnyAccount.html
diff --git a/gerrit-httpd/src/main/resources/com/google/gerrit/httpd/auth/container/ConfigurationError.html b/resources/com/google/gerrit/httpd/auth/container/ConfigurationError.html
similarity index 100%
rename from gerrit-httpd/src/main/resources/com/google/gerrit/httpd/auth/container/ConfigurationError.html
rename to resources/com/google/gerrit/httpd/auth/container/ConfigurationError.html
diff --git a/gerrit-httpd/src/main/resources/com/google/gerrit/httpd/auth/container/LoginRedirect.html b/resources/com/google/gerrit/httpd/auth/container/LoginRedirect.html
similarity index 100%
rename from gerrit-httpd/src/main/resources/com/google/gerrit/httpd/auth/container/LoginRedirect.html
rename to resources/com/google/gerrit/httpd/auth/container/LoginRedirect.html
diff --git a/gerrit-httpd/src/main/resources/com/google/gerrit/httpd/auth/ldap/LoginForm.html b/resources/com/google/gerrit/httpd/auth/ldap/LoginForm.html
similarity index 100%
rename from gerrit-httpd/src/main/resources/com/google/gerrit/httpd/auth/ldap/LoginForm.html
rename to resources/com/google/gerrit/httpd/auth/ldap/LoginForm.html
diff --git a/resources/com/google/gerrit/httpd/auth/oauth/BUILD b/resources/com/google/gerrit/httpd/auth/oauth/BUILD
new file mode 100644
index 0000000..0721712
--- /dev/null
+++ b/resources/com/google/gerrit/httpd/auth/oauth/BUILD
@@ -0,0 +1,8 @@
+filegroup(
+    name = "oauth",
+    srcs = glob(
+        ["**/*"],
+        exclude = ["BUILD"],
+    ),
+    visibility = ["//visibility:public"],
+)
diff --git a/gerrit-oauth/src/main/resources/com/google/gerrit/httpd/auth/oauth/LoginForm.html b/resources/com/google/gerrit/httpd/auth/oauth/LoginForm.html
similarity index 100%
rename from gerrit-oauth/src/main/resources/com/google/gerrit/httpd/auth/oauth/LoginForm.html
rename to resources/com/google/gerrit/httpd/auth/oauth/LoginForm.html
diff --git a/resources/com/google/gerrit/httpd/auth/openid/BUILD b/resources/com/google/gerrit/httpd/auth/openid/BUILD
new file mode 100644
index 0000000..d8670be
--- /dev/null
+++ b/resources/com/google/gerrit/httpd/auth/openid/BUILD
@@ -0,0 +1,8 @@
+filegroup(
+    name = "openid",
+    srcs = glob(
+        ["**/*"],
+        exclude = ["BUILD"],
+    ),
+    visibility = ["//visibility:public"],
+)
diff --git a/gerrit-openid/src/main/resources/com/google/gerrit/httpd/auth/openid/LoginForm.html b/resources/com/google/gerrit/httpd/auth/openid/LoginForm.html
similarity index 100%
rename from gerrit-openid/src/main/resources/com/google/gerrit/httpd/auth/openid/LoginForm.html
rename to resources/com/google/gerrit/httpd/auth/openid/LoginForm.html
diff --git a/gerrit-openid/src/main/resources/com/google/gerrit/httpd/auth/openid/RedirectForm.html b/resources/com/google/gerrit/httpd/auth/openid/RedirectForm.html
similarity index 100%
rename from gerrit-openid/src/main/resources/com/google/gerrit/httpd/auth/openid/RedirectForm.html
rename to resources/com/google/gerrit/httpd/auth/openid/RedirectForm.html
diff --git a/resources/com/google/gerrit/httpd/raw/BUILD b/resources/com/google/gerrit/httpd/raw/BUILD
new file mode 100644
index 0000000..3cd3ce8
--- /dev/null
+++ b/resources/com/google/gerrit/httpd/raw/BUILD
@@ -0,0 +1,8 @@
+filegroup(
+    name = "raw",
+    srcs = glob(
+        ["**/*"],
+        exclude = ["BUILD"],
+    ),
+    visibility = ["//visibility:public"],
+)
diff --git a/gerrit-httpd/src/main/resources/com/google/gerrit/httpd/raw/HostPage.html b/resources/com/google/gerrit/httpd/raw/HostPage.html
similarity index 100%
rename from gerrit-httpd/src/main/resources/com/google/gerrit/httpd/raw/HostPage.html
rename to resources/com/google/gerrit/httpd/raw/HostPage.html
diff --git a/gerrit-httpd/src/main/resources/com/google/gerrit/httpd/raw/LegacyGerrit.html b/resources/com/google/gerrit/httpd/raw/LegacyGerrit.html
similarity index 100%
rename from gerrit-httpd/src/main/resources/com/google/gerrit/httpd/raw/LegacyGerrit.html
rename to resources/com/google/gerrit/httpd/raw/LegacyGerrit.html
diff --git a/resources/com/google/gerrit/httpd/raw/PolyGerritIndexHtml.soy b/resources/com/google/gerrit/httpd/raw/PolyGerritIndexHtml.soy
new file mode 100644
index 0000000..9801b44
--- /dev/null
+++ b/resources/com/google/gerrit/httpd/raw/PolyGerritIndexHtml.soy
@@ -0,0 +1,81 @@
+/**
+ * Copyright (C) 2017 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.
+ */
+
+{namespace com.google.gerrit.httpd.raw}
+
+/**
+ * @param canonicalPath
+ * @param staticResourcePath
+ * @param? assetsPath {string} URL to static assets root, if served from CDN.
+ * @param? assetsBundle {string} Assets bundle .html file, served from $assetsPath.
+ * @param? faviconPath
+ * @param? versionInfo
+ * @param? deprecateGwtUi
+ */
+{template .Index}
+  <!DOCTYPE html>{\n}
+  <html lang="en">{\n}
+  <meta charset="utf-8">{\n}
+  <meta name="description" content="Gerrit Code Review">{\n}
+  <meta name="referrer" content="never">{\n}
+  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">{\n}
+
+  <noscript>
+    To use PolyGerrit, please enable JavaScript in your browser settings, and then refresh this page.
+  </noscript>
+
+  <script>
+    window.CLOSURE_NO_DEPS = true;
+    {if $canonicalPath != ''}window.CANONICAL_PATH = '{$canonicalPath}';{/if}
+    {if $deprecateGwtUi}window.DEPRECATE_GWT_UI = true;{/if}
+    {if $versionInfo}window.VERSION_INFO = '{$versionInfo}';{/if}
+    {if $staticResourcePath != ''}window.STATIC_RESOURCE_PATH = '{$staticResourcePath}';{/if}
+    {if $assetsPath}window.ASSETS_PATH = '{$assetsPath}';{/if}
+  </script>{\n}
+
+  {if $faviconPath}
+    <link rel="icon" type="image/x-icon" href="{$canonicalPath}/{$faviconPath}">{\n}
+  {else}
+    <link rel="icon" type="image/x-icon" href="{$canonicalPath}/favicon.ico">{\n}
+  {/if}
+
+  // RobotoMono fonts are used in styles/fonts.css
+  // @see https://github.com/w3c/preload/issues/32 regarding crossorigin
+  <link rel="preload" href="{$staticResourcePath}/fonts/RobotoMono-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous">{\n}
+  <link rel="preload" href="{$staticResourcePath}/fonts/RobotoMono-Regular.woff" as="font" type="font/woff" crossorigin="anonymous">{\n}
+  <link rel="preload" href="{$staticResourcePath}/fonts/Roboto-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous">{\n}
+  <link rel="preload" href="{$staticResourcePath}/fonts/Roboto-Regular.woff" as="font" type="font/woff" crossorigin="anonymous">{\n}
+  <link rel="preload" href="{$staticResourcePath}/fonts/Roboto-Medium.woff2" as="font" type="font/woff2" crossorigin="anonymous">{\n}
+  <link rel="preload" href="{$staticResourcePath}/fonts/Roboto-Medium.woff" as="font" type="font/woff" crossorigin="anonymous">{\n}
+  <link rel="stylesheet" href="{$staticResourcePath}/styles/fonts.css">{\n}
+  <link rel="stylesheet" href="{$staticResourcePath}/styles/main.css">{\n}
+  <script src="{$staticResourcePath}/bower_components/webcomponentsjs/webcomponents-lite.js"></script>{\n}
+  // Content between webcomponents-lite and the load of the main app element
+  // run before polymer-resin is installed so may have security consequences.
+  // Contact your local security engineer if you have any questions, and
+  // CC them on any changes that load content before gr-app.html.
+  //
+  // github.com/Polymer/polymer-resin/blob/master/getting-started.md#integrating
+  {if $assetsPath and $assetsBundle}
+    <link rel="import" href="{$assetsPath}/{$assetsBundle}">{\n}
+  {/if}
+
+  <link rel="preload" href="{$staticResourcePath}/elements/gr-app.js" as="script" crossorigin="anonymous">{\n}
+  <link rel="import" href="{$staticResourcePath}/elements/gr-app.html">{\n}
+
+  <body unresolved>{\n}
+  <gr-app id="app"></gr-app>{\n}
+{/template}
diff --git a/resources/com/google/gerrit/pgm/BUILD b/resources/com/google/gerrit/pgm/BUILD
new file mode 100644
index 0000000..6401c07
--- /dev/null
+++ b/resources/com/google/gerrit/pgm/BUILD
@@ -0,0 +1,8 @@
+filegroup(
+    name = "pgm",
+    srcs = glob(
+        ["**/*"],
+        exclude = ["BUILD"],
+    ),
+    visibility = ["//visibility:public"],
+)
diff --git a/resources/com/google/gerrit/pgm/Startup.py b/resources/com/google/gerrit/pgm/Startup.py
new file mode 100644
index 0000000..ec18f42
--- /dev/null
+++ b/resources/com/google/gerrit/pgm/Startup.py
@@ -0,0 +1,34 @@
+# Copyright (C) 2013 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.
+
+# -----------------------------------------------------------------------
+# Startup script for Gerrit Inspector - a Jython introspector
+# -----------------------------------------------------------------------
+
+from __future__ import print_function
+import sys
+
+
+def print_help():
+    for (n, v) in vars(sys.modules['__main__']).items():
+        if not n.startswith("__") and n not in ['help', 'reload'] \
+           and str(type(v)) != "<type 'javapackage'>"             \
+           and not str(v).startswith("<module"):
+            print("\"%s\" is \"%s\"" % (n, v))
+    print()
+    print("Welcome to the Gerrit Inspector")
+    print("Enter help() to see the above again, EOF to quit and stop Gerrit")
+
+
+print_help()
diff --git a/resources/com/google/gerrit/pgm/init/BUILD b/resources/com/google/gerrit/pgm/init/BUILD
new file mode 100644
index 0000000..4a0d173
--- /dev/null
+++ b/resources/com/google/gerrit/pgm/init/BUILD
@@ -0,0 +1,8 @@
+filegroup(
+    name = "init",
+    srcs = glob(
+        ["**/*"],
+        exclude = ["BUILD"],
+    ),
+    visibility = ["//visibility:public"],
+)
diff --git a/gerrit-pgm/src/main/resources/com/google/gerrit/pgm/init/gerrit.service b/resources/com/google/gerrit/pgm/init/gerrit.service
similarity index 100%
rename from gerrit-pgm/src/main/resources/com/google/gerrit/pgm/init/gerrit.service
rename to resources/com/google/gerrit/pgm/init/gerrit.service
diff --git a/resources/com/google/gerrit/pgm/init/gerrit.sh b/resources/com/google/gerrit/pgm/init/gerrit.sh
new file mode 100755
index 0000000..c32a181
--- /dev/null
+++ b/resources/com/google/gerrit/pgm/init/gerrit.sh
@@ -0,0 +1,583 @@
+#!/bin/sh
+#
+# Launch Gerrit Code Review as a daemon process.
+
+# To get the service to restart correctly on reboot, uncomment below (3 lines):
+# ========================
+# chkconfig: 3 99 99
+# description: Gerrit Code Review
+# processname: gerrit
+# ========================
+
+### BEGIN INIT INFO
+# Provides:          gerrit
+# Required-Start:    $named $remote_fs $syslog
+# Required-Stop:     $named $remote_fs $syslog
+# Default-Start:     2 3 4 5
+# Default-Stop:      0 1 6
+# Short-Description: Start/stop Gerrit Code Review
+# Description:       Gerrit is a web based code review system, facilitating online code reviews
+#                    for projects using the Git version control system.
+### END INIT INFO
+
+# Configuration files:
+#
+# /etc/default/gerritcodereview
+#   If it exists, sourced at the start of this script. It may perform any
+#   sequence of shell commands, like setting relevant environment variables.
+#
+# The files will be checked for existence before being sourced.
+
+# Configuration variables.  These may be set in /etc/default/gerritcodereview.
+#
+# GERRIT_SITE
+#   Path of the Gerrit site to run.  $GERRIT_SITE/etc/gerrit.config
+#   will be used to configure the process.
+#
+# GERRIT_WAR
+#   Location of the gerrit.war download that we will execute.  Defaults to
+#   container.war property in $GERRIT_SITE/etc/gerrit.config.
+#
+# NO_START
+#   If set to "1" disables Gerrit from starting.
+#
+# START_STOP_DAEMON
+#   If set to "0" disables using start-stop-daemon.  This may need to
+#   be set on SuSE systems.
+
+if test -f /lib/lsb/init-functions ; then
+  . /lib/lsb/init-functions
+fi
+
+usage() {
+    me=`basename "$0"`
+    echo >&2 "Usage: $me {start|stop|restart|check|status|run|supervise|threads} [-d site]"
+    exit 1
+}
+
+test $# -gt 0 || usage
+
+##################################################
+# Some utility functions
+##################################################
+running() {
+  test -f $1 || return 1
+  PID=`cat $1`
+  ps -p $PID >/dev/null 2>/dev/null || return 1
+  return 0
+}
+
+thread_dump() {
+  test -f $1 || return 1
+  PID=`cat $1`
+  $JSTACK $PID || return 1
+  return 0;
+}
+
+get_config() {
+  if test -f "$GERRIT_CONFIG" ; then
+    if test "x$1" = x--int ; then
+      # Git might not be able to expand "8g" properly.  If it gives
+      # us 0 back retry for the raw string and expand ourselves.
+      #
+      n=`git config --file "$GERRIT_CONFIG" --int "$2"`
+      if test x0 = "x$n" ; then
+        n=`git config --file "$GERRIT_CONFIG" --get "$2"`
+        case "$n" in
+        *g) n=`expr ${n%%g} \* 1024`m ;;
+        *k) n=`expr ${n%%k} \* 1024` ;;
+        *)  : ;;
+        esac
+      fi
+      echo "$n"
+    else
+      git config --file "$GERRIT_CONFIG" $1 "$2"
+    fi
+  fi
+}
+
+##################################################
+# Get the action and options
+##################################################
+
+ACTION=$1
+shift
+
+while test $# -gt 0 ; do
+  case "$1" in
+  -d|--site-path)
+    shift
+    GERRIT_SITE=$1
+    shift
+    ;;
+  -d=*)
+    GERRIT_SITE=${1##-d=}
+    shift
+    ;;
+  --site-path=*)
+    GERRIT_SITE=${1##--site-path=}
+    shift
+    ;;
+
+  *)
+    usage
+  esac
+done
+
+test -z "$NO_START" && NO_START=0
+test -z "$START_STOP_DAEMON" && START_STOP_DAEMON=1
+
+##################################################
+# See if there's a default configuration file
+##################################################
+if test -f /etc/default/gerritcodereview ; then
+  . /etc/default/gerritcodereview
+fi
+
+##################################################
+# Set tmp if not already set.
+##################################################
+if test -z "$TMP" ; then
+  TMP=/tmp
+fi
+TMPJ=$TMP/j$$
+
+##################################################
+# Reasonable guess marker for a Gerrit site path.
+##################################################
+GERRIT_INSTALL_TRACE_FILE=etc/gerrit.config
+
+##################################################
+# No git in PATH? Needed for gerrit.config parsing
+##################################################
+if type git >/dev/null 2>&1 ; then
+  : OK
+else
+  echo >&2 "** ERROR: Cannot find git in PATH"
+  exit 1
+fi
+
+##################################################
+# Try to determine GERRIT_SITE if not set
+##################################################
+if test -z "$GERRIT_SITE" ; then
+  GERRIT_SITE_1=`dirname "$0"`/..
+  if test -f "${GERRIT_SITE_1}/${GERRIT_INSTALL_TRACE_FILE}" ; then
+    GERRIT_SITE=${GERRIT_SITE_1}
+  fi
+fi
+
+##################################################
+# No GERRIT_SITE yet? We're out of luck!
+##################################################
+if test -z "$GERRIT_SITE" ; then
+    echo >&2 "** ERROR: GERRIT_SITE not set"
+    exit 1
+fi
+
+INITIAL_DIR=`pwd`
+if cd "$GERRIT_SITE" ; then
+  GERRIT_SITE=`pwd`
+else
+  echo >&2 "** ERROR: Gerrit site $GERRIT_SITE not found"
+  exit 1
+fi
+
+#####################################################
+# Check that Gerrit is where we think it is
+#####################################################
+GERRIT_CONFIG="$GERRIT_SITE/$GERRIT_INSTALL_TRACE_FILE"
+test -f "$GERRIT_CONFIG" || {
+   echo "** ERROR: Gerrit is not initialized in $GERRIT_SITE"
+   exit 1
+}
+test -r "$GERRIT_CONFIG" || {
+   echo "** ERROR: $GERRIT_CONFIG is not readable!"
+   exit 1
+}
+
+GERRIT_PID="$GERRIT_SITE/logs/gerrit.pid"
+GERRIT_RUN="$GERRIT_SITE/logs/gerrit.run"
+GERRIT_TMP="$GERRIT_SITE/tmp"
+export GERRIT_TMP
+
+##################################################
+# Check for JAVA_HOME
+##################################################
+JAVA_HOME_OLD="$JAVA_HOME"
+JAVA_HOME=`get_config --get container.javaHome`
+if test -z "$JAVA_HOME" ; then
+  JAVA_HOME="$JAVA_HOME_OLD"
+fi
+if test -z "$JAVA_HOME" ; then
+    # If a java runtime is not defined, search the following
+    # directories for a JVM and sort by version. Use the highest
+    # version number.
+
+    JAVA_LOCATIONS="\
+        /usr/java \
+        /usr/bin \
+        /usr/local/bin \
+        /usr/local/java \
+        /usr/local/jdk \
+        /usr/local/jre \
+        /usr/lib/jvm \
+        /opt/java \
+        /opt/jdk \
+        /opt/jre \
+    "
+    for N in java jdk jre ; do
+      for L in $JAVA_LOCATIONS ; do
+        test -d "$L" || continue
+        find $L -name "$N" ! -type d | grep -v threads | while read J ; do
+          test -x "$J" || continue
+          VERSION=`eval "$J" -version 2>&1`
+          test $? = 0 || continue
+          VERSION=`expr "$VERSION" : '.*"\(1.[0-9\.]*\)["_]'`
+          test -z "$VERSION" && continue
+          expr "$VERSION" \< 1.2 >/dev/null && continue
+          echo "$VERSION:$J"
+        done
+      done
+    done | sort | tail -1 >"$TMPJ"
+    JAVA=`cat "$TMPJ" | cut -d: -f2`
+    JVERSION=`cat "$TMPJ" | cut -d: -f1`
+    rm -f "$TMPJ"
+
+    JAVA_HOME=`dirname "$JAVA"`
+    while test -n "$JAVA_HOME" \
+               -a "$JAVA_HOME" != "/" \
+               -a ! -f "$JAVA_HOME/lib/tools.jar" ; do
+      JAVA_HOME=`dirname "$JAVA_HOME"`
+    done
+    test -z "$JAVA_HOME" && JAVA_HOME=
+
+    echo "** INFO: Using $JAVA"
+fi
+
+if test -z "$JAVA" \
+     -a -n "$JAVA_HOME" \
+     -a -x "$JAVA_HOME/bin/java" \
+     -a ! -d "$JAVA_HOME/bin/java" ; then
+  JAVA="$JAVA_HOME/bin/java"
+fi
+
+if test -z "$JAVA" ; then
+  echo >&2 "Cannot find a JRE or JDK. Please ensure that the JAVA_HOME environment"
+  echo >&2 "variable or container.javaHome in $GERRIT_SITE/etc/gerrit.config is"
+  echo >&2 "set to a valid >=1.7 JRE location"
+  exit 1
+fi
+
+if test -z "$JSTACK"; then
+  JSTACK="$JAVA_HOME/bin/jstack"
+fi
+
+#####################################################
+# Add Gerrit properties to Java VM options.
+#####################################################
+
+GERRIT_OPTIONS=`get_config --get-all container.javaOptions | tr '\n' ' '`
+if test -n "$GERRIT_OPTIONS" ; then
+  JAVA_OPTIONS="$JAVA_OPTIONS $GERRIT_OPTIONS"
+fi
+
+GERRIT_MEMORY=`get_config --get container.heapLimit`
+if test -n "$GERRIT_MEMORY" ; then
+  JAVA_OPTIONS="$JAVA_OPTIONS -Xmx$GERRIT_MEMORY"
+fi
+
+GERRIT_FDS=`get_config --int core.packedGitOpenFiles`
+test -z "$GERRIT_FDS" && GERRIT_FDS=128
+FDS_MULTIPLIER=2
+USE_LFS=`get_config --get lfs.plugin`
+test -n "$USE_LFS" && FDS_MULTIPLIER=3
+
+GERRIT_FDS=`expr $FDS_MULTIPLIER \* $GERRIT_FDS`
+test $GERRIT_FDS -lt 1024 && GERRIT_FDS=1024
+
+GERRIT_STARTUP_TIMEOUT=`get_config --get container.startupTimeout`
+test -z "$GERRIT_STARTUP_TIMEOUT" && GERRIT_STARTUP_TIMEOUT=90  # seconds
+
+GERRIT_USER=`get_config --get container.user`
+
+#####################################################
+# Configure sane ulimits for a daemon of our size.
+#####################################################
+
+ulimit -c 0            ; # core file size
+ulimit -d unlimited    ; # data seg size
+ulimit -f unlimited    ; # file size
+ulimit -m >/dev/null 2>&1 && ulimit -m unlimited  ; # max memory size
+ulimit -n $GERRIT_FDS  ; # open files
+ulimit -t unlimited    ; # cpu time
+ulimit -v unlimited    ; # virtual memory
+
+ulimit -x >/dev/null 2>&1 && ulimit -x unlimited  ; # file locks
+
+#####################################################
+# This is how the Gerrit server will be started
+#####################################################
+
+if test -z "$GERRIT_WAR" ; then
+  GERRIT_WAR=`get_config --get container.war`
+fi
+if test -z "$GERRIT_WAR" ; then
+  GERRIT_WAR="$GERRIT_SITE/bin/gerrit.war"
+  test -f "$GERRIT_WAR" || GERRIT_WAR=
+fi
+if test -z "$GERRIT_WAR" -a -n "$GERRIT_USER" ; then
+  for homedirs in /home /Users ; do
+    if test -d "$homedirs/$GERRIT_USER" ; then
+      GERRIT_WAR="$homedirs/$GERRIT_USER/gerrit.war"
+      if test -f "$GERRIT_WAR" ; then
+        break
+      else
+        GERRIT_WAR=
+      fi
+    fi
+  done
+fi
+if test -z "$GERRIT_WAR" ; then
+  echo >&2 "** ERROR: Cannot find gerrit.war (try setting \$GERRIT_WAR)"
+  exit 1
+fi
+
+test -z "$GERRIT_USER" && GERRIT_USER=`whoami`
+RUN_ARGS="-jar $GERRIT_WAR daemon -d $GERRIT_SITE"
+if test "`get_config --bool container.slave`" = "true" ; then
+  RUN_ARGS="$RUN_ARGS --slave --enable-httpd --headless"
+fi
+DAEMON_OPTS=`get_config --get-all container.daemonOpt`
+if test -n "$DAEMON_OPTS" ; then
+  RUN_ARGS="$RUN_ARGS $DAEMON_OPTS"
+fi
+
+if test -n "$JAVA_OPTIONS" ; then
+  RUN_ARGS="$JAVA_OPTIONS $RUN_ARGS"
+fi
+
+if test -x /usr/bin/perl ; then
+  # If possible, use Perl to mask the name of the process so its
+  # something specific to us rather than the generic 'java' name.
+  #
+  export JAVA
+  RUN_EXEC=/usr/bin/perl
+  RUN_Arg1=-e
+  RUN_Arg2='$x=$ENV{JAVA};exec $x @ARGV;die $!'
+  RUN_Arg3='-- GerritCodeReview'
+else
+  RUN_EXEC=$JAVA
+  RUN_Arg1=
+  RUN_Arg2='-DGerritCodeReview=1'
+  RUN_Arg3=
+fi
+
+##################################################
+# Do the action
+##################################################
+case "$ACTION" in
+  start)
+    printf '%s' "Starting Gerrit Code Review: "
+
+    if test 1 = "$NO_START" ; then
+      echo "Not starting gerrit - NO_START=1 in /etc/default/gerritcodereview"
+      exit 0
+    fi
+
+    test -z "$UID" && UID=`id | sed -e 's/^[^=]*=\([0-9]*\).*/\1/'`
+
+    RUN_ID=`date +%s`.$$
+    RUN_ARGS="$RUN_ARGS --run-id=$RUN_ID"
+
+    if test 1 = "$START_STOP_DAEMON" && type start-stop-daemon >/dev/null 2>&1
+    then
+      test $UID = 0 && CH_USER="-c $GERRIT_USER"
+      if start-stop-daemon -S -b $CH_USER \
+         -p "$GERRIT_PID" -m \
+         -d "$GERRIT_SITE" \
+         -a "$RUN_EXEC" -- $RUN_Arg1 "$RUN_Arg2" $RUN_Arg3 $RUN_ARGS
+      then
+        : OK
+      else
+        rc=$?
+        if test $rc = 127; then
+          echo >&2 "fatal: start-stop-daemon failed"
+          rc=1
+        fi
+        exit $rc
+      fi
+    else
+      if test -f "$GERRIT_PID" ; then
+        if running "$GERRIT_PID" ; then
+          echo "Already Running!!"
+          exit 0
+        else
+          rm -f "$GERRIT_PID" "$GERRIT_RUN"
+        fi
+      fi
+
+      if test $UID = 0 -a -n "$GERRIT_USER" ; then
+        touch "$GERRIT_PID"
+        chown $GERRIT_USER "$GERRIT_PID"
+        su - $GERRIT_USER -s /bin/sh -c "
+          JAVA='$JAVA' ; export JAVA ;
+          $RUN_EXEC $RUN_Arg1 '$RUN_Arg2' $RUN_Arg3 $RUN_ARGS </dev/null >/dev/null 2>&1 &
+          PID=\$! ;
+          disown ;
+          echo \$PID >\"$GERRIT_PID\""
+      else
+        $RUN_EXEC $RUN_Arg1 "$RUN_Arg2" $RUN_Arg3 $RUN_ARGS </dev/null >/dev/null 2>&1 &
+        PID=$!
+        type disown >/dev/null 2>&1 && disown
+        echo $PID >"$GERRIT_PID"
+      fi
+    fi
+
+    if test $UID = 0; then
+        PID=`cat "$GERRIT_PID"`
+        if test -f "/proc/${PID}/oom_score_adj" ; then
+            echo -1000 > "/proc/${PID}/oom_score_adj"
+        else
+            if test -f "/proc/${PID}/oom_adj" ; then
+                echo -16 > "/proc/${PID}/oom_adj"
+            fi
+        fi
+    elif [ "$(uname -s)"=="Linux" ] && test -d "/proc/${PID}"; then
+        echo "WARNING: Could not adjust Gerrit's process for the kernel's out-of-memory killer."
+        echo "         This may be caused by ${0} not being run as root."
+        echo "         Consider changing the OOM score adjustment manually for Gerrit's PID=${PID} with e.g.:"
+        echo "         echo '-1000' | sudo tee /proc/${PID}/oom_score_adj"
+    fi
+
+    TIMEOUT="$GERRIT_STARTUP_TIMEOUT"
+    sleep 1
+    while running "$GERRIT_PID" && test $TIMEOUT -gt 0 ; do
+      if test "x$RUN_ID" = "x`cat $GERRIT_RUN 2>/dev/null`" ; then
+        echo OK
+        exit 0
+      fi
+
+      sleep 2
+      TIMEOUT=`expr $TIMEOUT - 2`
+    done
+
+    echo FAILED
+    exit 1
+  ;;
+
+  stop)
+    printf '%s' "Stopping Gerrit Code Review: "
+
+    if test 1 = "$START_STOP_DAEMON" && type start-stop-daemon >/dev/null 2>&1
+    then
+      start-stop-daemon -K -p "$GERRIT_PID" -s HUP
+      sleep 1
+      if running "$GERRIT_PID" ; then
+        sleep 3
+        if running "$GERRIT_PID" ; then
+          sleep 30
+          if running "$GERRIT_PID" ; then
+            start-stop-daemon -K -p "$GERRIT_PID" -s KILL
+          fi
+        fi
+      fi
+      rm -f "$GERRIT_PID" "$GERRIT_RUN"
+      echo OK
+    else
+      PID=`cat "$GERRIT_PID" 2>/dev/null`
+      TIMEOUT=30
+      while running "$GERRIT_PID" && test $TIMEOUT -gt 0 ; do
+        kill $PID 2>/dev/null
+        sleep 1
+        TIMEOUT=`expr $TIMEOUT - 1`
+      done
+      test $TIMEOUT -gt 0 || kill -9 $PID 2>/dev/null
+      rm -f "$GERRIT_PID" "$GERRIT_RUN"
+      echo OK
+    fi
+  ;;
+
+  restart)
+    GERRIT_SH=$0
+    if test -f "$GERRIT_SH" ; then
+      : OK
+    else
+      GERRIT_SH="$INITIAL_DIR/$GERRIT_SH"
+      if test -f "$GERRIT_SH" ; then
+        : OK
+      else
+        echo >&2 "** ERROR: Cannot locate gerrit.sh"
+        exit 1
+      fi
+    fi
+    $GERRIT_SH stop $*
+    sleep 5
+    $GERRIT_SH start $*
+    exit $?
+  ;;
+
+  supervise)
+    #
+    # Under control of daemontools supervise monitor which
+    # handles restarts and shutdowns via the svc program.
+    #
+    exec "$RUN_EXEC" $RUN_Arg1 "$RUN_Arg2" $RUN_Arg3 $RUN_ARGS
+    ;;
+
+  run|daemon)
+    echo "Running Gerrit Code Review:"
+
+    if test -f "$GERRIT_PID" ; then
+        if running "$GERRIT_PID" ; then
+          echo "Already Running!!"
+          exit 0
+        else
+          rm -f "$GERRIT_PID"
+        fi
+    fi
+
+    exec "$RUN_EXEC" $RUN_Arg1 "$RUN_Arg2" $RUN_Arg3 $RUN_ARGS --console-log
+  ;;
+
+  check|status)
+    echo "Checking arguments to Gerrit Code Review:"
+    echo "  GERRIT_SITE            =  $GERRIT_SITE"
+    echo "  GERRIT_CONFIG          =  $GERRIT_CONFIG"
+    echo "  GERRIT_PID             =  $GERRIT_PID"
+    echo "  GERRIT_TMP             =  $GERRIT_TMP"
+    echo "  GERRIT_WAR             =  $GERRIT_WAR"
+    echo "  GERRIT_FDS             =  $GERRIT_FDS"
+    echo "  GERRIT_USER            =  $GERRIT_USER"
+    echo "  GERRIT_STARTUP_TIMEOUT =  $GERRIT_STARTUP_TIMEOUT"
+    echo "  JAVA                   =  $JAVA"
+    echo "  JAVA_OPTIONS           =  $JAVA_OPTIONS"
+    echo "  RUN_EXEC               =  $RUN_EXEC $RUN_Arg1 '$RUN_Arg2' $RUN_Arg3"
+    echo "  RUN_ARGS               =  $RUN_ARGS"
+    echo
+
+    if test -f "$GERRIT_PID" ; then
+        if running "$GERRIT_PID" ; then
+            echo "Gerrit running pid="`cat "$GERRIT_PID"`
+            exit 0
+        fi
+    fi
+    exit 3
+  ;;
+
+  threads)
+    if running "$GERRIT_PID" ; then
+      thread_dump "$GERRIT_PID"
+      exit 0
+    else
+      echo "Gerrit not running?"
+    fi
+    exit 3
+  ;;
+
+  *)
+    usage
+  ;;
+esac
+
+exit 0
diff --git a/gerrit-pgm/src/main/resources/com/google/gerrit/pgm/init/gerrit.socket b/resources/com/google/gerrit/pgm/init/gerrit.socket
similarity index 100%
rename from gerrit-pgm/src/main/resources/com/google/gerrit/pgm/init/gerrit.socket
rename to resources/com/google/gerrit/pgm/init/gerrit.socket
diff --git a/gerrit-pgm/src/main/resources/com/google/gerrit/pgm/init/libraries.config b/resources/com/google/gerrit/pgm/init/libraries.config
similarity index 100%
rename from gerrit-pgm/src/main/resources/com/google/gerrit/pgm/init/libraries.config
rename to resources/com/google/gerrit/pgm/init/libraries.config
diff --git a/resources/com/google/gerrit/prettify/BUILD b/resources/com/google/gerrit/prettify/BUILD
new file mode 100644
index 0000000..3bae8ad
--- /dev/null
+++ b/resources/com/google/gerrit/prettify/BUILD
@@ -0,0 +1,4 @@
+exports_files([
+    "client/prettify.css",
+    "client/prettify.js",
+])
diff --git a/gerrit-prettify/src/main/resources/com/google/gerrit/prettify/client/prettify.css b/resources/com/google/gerrit/prettify/client/prettify.css
similarity index 100%
rename from gerrit-prettify/src/main/resources/com/google/gerrit/prettify/client/prettify.css
rename to resources/com/google/gerrit/prettify/client/prettify.css
diff --git a/gerrit-prettify/src/main/resources/com/google/gerrit/prettify/client/prettify.js b/resources/com/google/gerrit/prettify/client/prettify.js
similarity index 100%
rename from gerrit-prettify/src/main/resources/com/google/gerrit/prettify/client/prettify.js
rename to resources/com/google/gerrit/prettify/client/prettify.js
diff --git a/resources/com/google/gerrit/proto/BUILD b/resources/com/google/gerrit/proto/BUILD
new file mode 100644
index 0000000..ec2e05c
--- /dev/null
+++ b/resources/com/google/gerrit/proto/BUILD
@@ -0,0 +1,8 @@
+filegroup(
+    name = "proto",
+    srcs = glob(
+        ["**/*"],
+        exclude = ["BUILD"],
+    ),
+    visibility = ["//visibility:public"],
+)
diff --git a/resources/com/google/gerrit/proto/ProtoGenHeader.txt b/resources/com/google/gerrit/proto/ProtoGenHeader.txt
new file mode 100644
index 0000000..8797790
--- /dev/null
+++ b/resources/com/google/gerrit/proto/ProtoGenHeader.txt
@@ -0,0 +1,19 @@
+// Copyright (C) 2011 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.
+
+syntax = "proto2";
+
+option java_package = "com.google.gerrit.proto.reviewdb";
+
+package devtools.gerritcodereview;
diff --git a/resources/com/google/gerrit/reviewdb/BUILD b/resources/com/google/gerrit/reviewdb/BUILD
new file mode 100644
index 0000000..8a1b457
--- /dev/null
+++ b/resources/com/google/gerrit/reviewdb/BUILD
@@ -0,0 +1,8 @@
+filegroup(
+    name = "reviewdb",
+    srcs = glob(
+        ["**/*"],
+        exclude = ["BUILD"],
+    ),
+    visibility = ["//visibility:public"],
+)
diff --git a/resources/com/google/gerrit/reviewdb/server/index_generic.sql b/resources/com/google/gerrit/reviewdb/server/index_generic.sql
new file mode 100644
index 0000000..c58edb7
--- /dev/null
+++ b/resources/com/google/gerrit/reviewdb/server/index_generic.sql
@@ -0,0 +1,40 @@
+-- Gerrit 2 : Generic
+--
+
+-- Indexes to support @Query
+--
+
+-- *********************************************************************
+-- ApprovalCategoryAccess
+--    too small to bother indexing
+
+
+-- *********************************************************************
+-- ApprovalCategoryValueAccess
+--     @PrimaryKey covers: byCategory
+
+
+-- *********************************************************************
+-- BranchAccess
+--    @PrimaryKey covers: byProject
+
+
+-- *********************************************************************
+-- ChangeMessageAccess
+--    @PrimaryKey covers: byChange
+
+--    covers:             byPatchSet
+CREATE INDEX change_messages_byPatchset
+ON change_messages (patchset_change_id, patchset_patch_set_id);
+
+-- *********************************************************************
+-- PatchLineCommentAccess
+--    @PrimaryKey covers: published, draft
+CREATE INDEX patch_comment_drafts
+ON patch_comments (status, author_id);
+
+
+-- *********************************************************************
+-- PatchSetAccess
+CREATE INDEX patch_sets_byRevision
+ON patch_sets (revision);
diff --git a/resources/com/google/gerrit/reviewdb/server/index_maxdb.sql b/resources/com/google/gerrit/reviewdb/server/index_maxdb.sql
new file mode 100644
index 0000000..7f0f1bd
--- /dev/null
+++ b/resources/com/google/gerrit/reviewdb/server/index_maxdb.sql
@@ -0,0 +1,43 @@
+delimiter #
+-- Gerrit 2 : MaxDB
+--
+
+-- Indexes to support @Query
+--
+
+-- *********************************************************************
+-- ApprovalCategoryAccess
+--    too small to bother indexing
+
+
+-- *********************************************************************
+-- ApprovalCategoryValueAccess
+--     @PrimaryKey covers: byCategory
+
+
+-- *********************************************************************
+-- BranchAccess
+--    @PrimaryKey covers: byProject
+
+
+-- *********************************************************************
+-- ChangeMessageAccess
+--    @PrimaryKey covers: byChange
+
+--    covers:             byPatchSet
+CREATE INDEX change_messages_byPatchset
+ON change_messages (patchset_change_id, patchset_patch_set_id)
+#
+
+-- *********************************************************************
+-- PatchLineCommentAccess
+--    @PrimaryKey covers: published, draft
+CREATE INDEX patch_comment_drafts
+ON patch_comments (status, author_id)
+#
+
+-- *********************************************************************
+-- PatchSetAccess
+CREATE INDEX patch_sets_byRevision
+ON patch_sets (revision)
+#
diff --git a/resources/com/google/gerrit/reviewdb/server/index_postgres.sql b/resources/com/google/gerrit/reviewdb/server/index_postgres.sql
new file mode 100644
index 0000000..439fed7
--- /dev/null
+++ b/resources/com/google/gerrit/reviewdb/server/index_postgres.sql
@@ -0,0 +1,87 @@
+-- Gerrit 2 : PostgreSQL
+--
+
+-- Cluster hot tables by their primary method of access
+--
+ALTER TABLE patch_sets CLUSTER ON patch_sets_pkey;
+ALTER TABLE change_messages CLUSTER ON change_messages_pkey;
+ALTER TABLE patch_comments CLUSTER ON patch_comments_pkey;
+ALTER TABLE patch_set_approvals CLUSTER ON patch_set_approvals_pkey;
+
+CLUSTER;
+
+
+-- Define function for conditional installation of PL/pgSQL.
+-- This is required, because starting with PostgreSQL 9.0, PL/pgSQL
+-- language is installed by default and database returns error when
+-- we try to install it again.
+--
+-- Source: http://wiki.postgresql.org/wiki/CREATE_OR_REPLACE_LANGUAGE
+-- Author: David Fetter
+--
+
+delimiter //
+
+CREATE OR REPLACE FUNCTION make_plpgsql()
+RETURNS VOID
+LANGUAGE SQL
+AS $$
+CREATE LANGUAGE plpgsql;
+$$;
+
+//
+
+delimiter ;
+
+SELECT
+    CASE
+    WHEN EXISTS(
+        SELECT 1
+        FROM pg_catalog.pg_language
+        WHERE lanname='plpgsql'
+    )
+    THEN NULL
+    ELSE make_plpgsql() END;
+
+DROP FUNCTION make_plpgsql();
+
+delimiter ;
+
+-- Indexes to support @Query
+--
+
+-- *********************************************************************
+-- ApprovalCategoryAccess
+--    too small to bother indexing
+
+
+-- *********************************************************************
+-- ApprovalCategoryValueAccess
+--     @PrimaryKey covers: byCategory
+
+
+-- *********************************************************************
+-- BranchAccess
+--    @PrimaryKey covers: byProject
+
+
+-- *********************************************************************
+-- ChangeMessageAccess
+--    @PrimaryKey covers: byChange
+
+--    covers:             byPatchSet
+CREATE INDEX change_messages_byPatchset
+ON change_messages (patchset_change_id, patchset_patch_set_id);
+
+-- *********************************************************************
+-- PatchLineCommentAccess
+--    @PrimaryKey covers: published, draft
+CREATE INDEX patch_comment_drafts
+ON patch_comments (author_id)
+WHERE status = 'd';
+
+
+-- *********************************************************************
+-- PatchSetAccess
+CREATE INDEX patch_sets_byRevision
+ON patch_sets (revision);
diff --git a/resources/com/google/gerrit/server/BUILD b/resources/com/google/gerrit/server/BUILD
new file mode 100644
index 0000000..e92c4e1
--- /dev/null
+++ b/resources/com/google/gerrit/server/BUILD
@@ -0,0 +1,14 @@
+filegroup(
+    name = "server",
+    srcs = glob(
+        ["**/*"],
+        exclude = ["BUILD"],
+    ),
+    visibility = ["//visibility:public"],
+)
+
+sh_test(
+    name = "commit-msg_test",
+    srcs = ["commit-msg_test.sh"],
+    data = [":server"],
+)
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/change/ChangeMessages.properties b/resources/com/google/gerrit/server/change/ChangeMessages.properties
similarity index 100%
rename from gerrit-server/src/main/resources/com/google/gerrit/server/change/ChangeMessages.properties
rename to resources/com/google/gerrit/server/change/ChangeMessages.properties
diff --git a/resources/com/google/gerrit/server/commit-msg_test.sh b/resources/com/google/gerrit/server/commit-msg_test.sh
new file mode 100755
index 0000000..81371dd
--- /dev/null
+++ b/resources/com/google/gerrit/server/commit-msg_test.sh
@@ -0,0 +1,140 @@
+#!/bin/bash
+
+set -eu
+
+hook=$(pwd)/resources/com/google/gerrit/server/tools/root/hooks/commit-msg
+
+cd $TEST_TMPDIR
+
+function fail {
+  echo "FAIL: $1"
+  exit 1
+}
+
+function test_nonexistent_argument {
+  rm -f input
+  if ${hook} input ; then
+    fail "must fail for non-existent input"
+  fi
+}
+
+function test_empty {
+  rm -f input
+  touch input
+  if ${hook} input ; then
+    fail "must fail on empty message"
+  fi
+}
+
+# a Change-Id already set is preserved.
+function test_preserve_changeid {
+  cat << EOF > input
+bla bla
+
+Change-Id: I123
+EOF
+
+  ${hook} input || fail "failed hook execution"
+
+  found=$(grep -c '^Change-Id' input)
+  if [[ "${found}" != "1" ]]; then
+    fail "got ${found} Change-Ids, want 1"
+  fi
+  found=$(grep -c '^Change-Id: I123' input)
+  if [[ "${found}" != "1" ]]; then
+    fail "got ${found} Change-Id: I123, want 1"
+  fi
+}
+
+# Change-Id should not be inserted if gerrit.createChangeId=false
+function test_suppress_changeid {
+  cat << EOF > input
+bla bla
+EOF
+
+  git config gerrit.createChangeId false
+  ${hook} input || fail "failed hook execution"
+  git config --unset gerrit.createChangeId
+  found=$(grep -c '^Change-Id' input || true)
+  if [[ "${found}" != "0" ]]; then
+    fail "got ${found} Change-Ids, want 0"
+  fi
+}
+
+# Change-Id goes after existing trailers.
+function test_at_end {
+  cat << EOF > input
+bla bla
+
+Bug: #123
+EOF
+
+  ${hook} input || fail "failed hook execution"
+  result=$(tail -1 input | grep ^Change-Id)
+  if [[ -z "${result}" ]] ; then
+    echo "after: "
+    cat input
+
+    fail "did not find Change-Id at end"
+  fi
+}
+
+function test_dash_at_end {
+  if [[ ! -x /bin/dash ]] ; then
+    echo "/bin/dash not installed; skipping dash test."
+    return
+  fi
+
+  cat << EOF > input
+bla bla
+
+Bug: #123
+EOF
+
+  /bin/dash ${hook} input || fail "failed hook execution"
+
+  result=$(tail -1 input | grep ^Change-Id)
+  if [[ -z "${result}" ]] ; then
+    echo "after: "
+    cat input
+
+    fail "did not find Change-Id at end"
+  fi
+}
+
+function test_preserve_dash_changeid {
+  if [[ ! -x /bin/dash ]] ; then
+    echo "/bin/dash not installed; skipping dash test."
+    return
+  fi
+
+  cat << EOF > input
+bla bla
+
+Change-Id: I123
+EOF
+
+  /bin/dash ${hook} input || fail "failed hook execution"
+
+  found=$(grep -c '^Change-Id' input)
+  if [[ "${found}" != "1" ]]; then
+    fail "got ${found} Change-Ids, want 1"
+  fi
+  found=$(grep -c '^Change-Id: I123' input)
+  if [[ "${found}" != "1" ]]; then
+    fail "got ${found} Change-Id: I123, want 1"
+  fi
+}
+
+
+# Test driver.
+
+for func in $( declare -F | awk '{print $3;}' | sort); do
+  case ${func} in
+    test_*)
+      echo "=== testing $func"
+      ${func}
+      echo "--- done    $func"
+      ;;
+  esac
+done
diff --git a/resources/com/google/gerrit/server/config/CapabilityConstants.properties b/resources/com/google/gerrit/server/config/CapabilityConstants.properties
new file mode 100644
index 0000000..ba590ee
--- /dev/null
+++ b/resources/com/google/gerrit/server/config/CapabilityConstants.properties
@@ -0,0 +1,23 @@
+accessDatabase = Access Database
+administrateServer = Administrate Server
+batchChangesLimit = Batch Changes Limit
+createAccount = Create Account
+createGroup = Create Group
+createProject = Create Project
+emailReviewers = Email Reviewers
+flushCaches = Flush Caches
+killTask = Kill Task
+maintainServer = Maintain Server
+modifyAccount = Modify Account
+priority = Priority
+readAs = Read As
+queryLimit = Query Limit
+runAs = Run As
+runGC = Run Garbage Collection
+streamEvents = Stream Events
+viewAllAccounts = View All Accounts
+viewCaches = View Caches
+viewConnections = View Connections
+viewPlugins = View Plugins
+viewQueue = View Queue
+viewAccess = View Access
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/documentation/pegdown.css b/resources/com/google/gerrit/server/documentation/flexmark-java.css
similarity index 100%
rename from gerrit-server/src/main/resources/com/google/gerrit/server/documentation/pegdown.css
rename to resources/com/google/gerrit/server/documentation/flexmark-java.css
diff --git a/resources/com/google/gerrit/server/mail/Abandoned.soy b/resources/com/google/gerrit/server/mail/Abandoned.soy
new file mode 100644
index 0000000..623cfe26
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/Abandoned.soy
@@ -0,0 +1,39 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * .Abandoned template will determine the contents of the email related to a
+ * change being abandoned.
+ * @param change
+ * @param coverLetter
+ * @param email
+ * @param fromName
+ */
+{template .Abandoned kind="text"}
+  {$fromName} has abandoned this change.
+  {if $email.changeUrl} ( {$email.changeUrl} ){/if}{\n}
+  {\n}
+  Change subject: {$change.subject}{\n}
+  ......................................................................{\n}
+  {if $coverLetter}
+    {\n}
+    {\n}
+    {$coverLetter}
+    {\n}
+  {/if}
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/AbandonedHtml.soy b/resources/com/google/gerrit/server/mail/AbandonedHtml.soy
new file mode 100644
index 0000000..75d940f
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/AbandonedHtml.soy
@@ -0,0 +1,38 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * @param coverLetter
+ * @param email
+ * @param fromName
+ */
+{template .AbandonedHtml}
+  <p>
+    {$fromName} <strong>abandoned</strong> this change.
+  </p>
+
+  {if $email.changeUrl}
+    <p>
+      {call .ViewChangeButton data="all" /}
+    </p>
+  {/if}
+
+  {if $coverLetter}
+    <div style="white-space:pre-wrap">{$coverLetter}</div>
+  {/if}
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/AddKey.soy b/resources/com/google/gerrit/server/mail/AddKey.soy
new file mode 100644
index 0000000..be76aee
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/AddKey.soy
@@ -0,0 +1,68 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * The .AddKey template will determine the contents of the email related to
+ * adding a new SSH or GPG key to an account.
+ * @param email
+ */
+{template .AddKey kind="text"}
+  One or more new {$email.keyType} keys have been added to Gerrit Code Review at
+  {sp}{$email.gerritHost}:
+
+  {\n}
+  {\n}
+
+  {if $email.sshKey}
+    {$email.sshKey}
+  {elseif $email.gpgKeys}
+    {$email.gpgKeys}
+  {/if}
+
+  {\n}
+  {\n}
+
+  If this is not expected, please contact your Gerrit Administrators
+  immediately.
+
+  {\n}
+  {\n}
+
+  You can also manage your {$email.keyType} keys by visiting
+  {\n}
+  {if $email.sshKey}
+    {$email.gerritUrl}#/settings/ssh-keys
+  {elseif $email.gpgKeys}
+    {$email.gerritUrl}#/settings/gpg-keys
+  {/if}
+  {\n}
+  {if $email.userNameEmail}
+    (while signed in as {$email.userNameEmail})
+  {else}
+    (while signed in as {$email.email})
+  {/if}
+
+  {\n}
+  {\n}
+
+  If clicking the link above does not work, copy and paste the URL in a new
+  browser window instead.
+
+  {\n}
+  {call .NoReplyFooter /}
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/AddKeyHtml.soy b/resources/com/google/gerrit/server/mail/AddKeyHtml.soy
new file mode 100644
index 0000000..04a0635
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/AddKeyHtml.soy
@@ -0,0 +1,63 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * @param email
+ */
+{template .AddKeyHtml}
+  <p>
+    One or more new {$email.keyType} keys have been added to Gerrit Code Review
+    at {$email.gerritHost}:
+  </p>
+
+  {let $keyStyle kind="css"}
+    background: #f0f0f0;
+    border: 1px solid #ccc;
+    color: #555;
+    padding: 12px;
+    width: 400px;
+  {/let}
+
+  {if $email.sshKey}
+    <pre style="{$keyStyle}">{$email.sshKey}</pre>
+  {elseif $email.gpgKeys}
+    <pre style="{$keyStyle}">{$email.gpgKeys}</pre>
+  {/if}
+
+  <p>
+    If this is not expected, please contact your Gerrit Administrators
+    immediately.
+  </p>
+
+  <p>
+    You can also manage your {$email.keyType} keys by following{sp}
+    {if $email.sshKey}
+      <a href="{$email.gerritUrl}#/settings/ssh-keys">this link</a>
+    {elseif $email.gpgKeys}
+      <a href="{$email.gerritUrl}#/settings/gpg-keys">this link</a>
+    {/if}
+    {sp}
+    {if $email.userNameEmail}
+      (while signed in as {$email.userNameEmail})
+    {else}
+      (while signed in as {$email.email})
+    {/if}.
+  </p>
+
+  {call .NoReplyFooterHtml /}
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/ChangeFooter.soy b/resources/com/google/gerrit/server/mail/ChangeFooter.soy
new file mode 100644
index 0000000..f1d201b
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/ChangeFooter.soy
@@ -0,0 +1,40 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * The .ChangeFooter template will determine the contents of the footer text
+ * that will be appended to ALL emails related to changes.
+ * @param email
+ */
+{template .ChangeFooter kind="text"}
+  --{sp}
+  {\n}
+
+  {if $email.changeUrl}
+    To view, visit {$email.changeUrl}{\n}
+  {/if}
+
+  {if $email.settingsUrl}
+    To unsubscribe, or for help writing mail filters,{sp}
+    visit {$email.settingsUrl}{\n}
+  {/if}
+
+  {if $email.changeUrl or $email.settingsUrl}
+    {\n}
+  {/if}
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/ChangeFooterHtml.soy b/resources/com/google/gerrit/server/mail/ChangeFooterHtml.soy
new file mode 100644
index 0000000..f802366
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/ChangeFooterHtml.soy
@@ -0,0 +1,46 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * @param change
+ * @param email
+ */
+{template .ChangeFooterHtml}
+  {if $email.changeUrl or $email.settingsUrl}
+    <p>
+      {if $email.changeUrl}
+        To view, visit{sp}
+        <a href="{$email.changeUrl}">change {$change.changeNumber}</a>.
+      {/if}
+      {if $email.changeUrl and $email.settingsUrl}{sp}{/if}
+      {if $email.settingsUrl}
+        To unsubscribe, or for help writing mail filters,{sp}
+        visit <a href="{$email.settingsUrl}">settings</a>.
+      {/if}
+    </p>
+  {/if}
+
+  {if $email.changeUrl}
+    <div itemscope itemtype="http://schema.org/EmailMessage">
+      <div itemscope itemprop="action" itemtype="http://schema.org/ViewAction">
+        <link itemprop="url" href="{$email.changeUrl |blessStringAsTrustedResourceUrlForLegacy}"/>
+        <meta itemprop="name" content="View Change"/>
+      </div>
+    </div>
+  {/if}
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/ChangeSubject.soy b/resources/com/google/gerrit/server/mail/ChangeSubject.soy
new file mode 100644
index 0000000..48ec9a2
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/ChangeSubject.soy
@@ -0,0 +1,34 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * The .ChangeSubject template will determine the contents of the email subject
+ * line for ALL emails related to changes.
+ * @param branch
+ * @param change
+ * @param shortProjectName
+ * @param instanceAndProjectName
+ * @param addInstanceNameInSubject boolean
+ */
+{template .ChangeSubject kind="text"}
+  {if not $addInstanceNameInSubject}
+    Change in {$shortProjectName}[{$branch.shortName}]: {$change.shortSubject}
+  {else}
+    Change in {$instanceAndProjectName}[{$branch.shortName}]: {$change.shortSubject}
+  {/if}
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/Comment.soy b/resources/com/google/gerrit/server/mail/Comment.soy
new file mode 100644
index 0000000..f9a11cd
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/Comment.soy
@@ -0,0 +1,83 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * The .Comment template will determine the contents of the email related to a
+ * user submitting comments on changes.
+ * @param change
+ * @param coverLetter
+ * @param email
+ * @param fromName
+ * @param commentFiles
+ */
+{template .Comment kind="text"}
+  {$fromName} has posted comments on this change.
+  {if $email.changeUrl} ( {$email.changeUrl} ){/if}{\n}
+  {\n}
+  Change subject: {$change.subject}{\n}
+  ......................................................................{\n}
+  {if $coverLetter}
+    {\n}
+    {\n}
+    {$coverLetter}{\n}
+    {\n}
+  {/if}
+
+  {for $group in $commentFiles}
+    // Insert a space before the newline so that Gmail does not mistakenly link
+    // the following line with the file link. See issue 9201.
+    {$group.link}{sp}{\n}
+    {$group.title}:{\n}
+    {\n}
+
+    {for $comment in $group.comments}
+      {if $comment.isRobotComment}
+        Robot Comment from {$comment.robotId} (run ID {$comment.robotRunId}):
+        {\n}
+      {/if}
+
+      {for $line in $comment.lines}
+        {if isFirst($line)}
+          {if $comment.startLine != 0}
+            {$comment.link}
+          {/if}
+
+          // Insert a space before the newline so that Gmail does not mistakenly
+          // link the following line with the file link. See issue 9201.
+          {sp}{\n}
+
+          {$comment.linePrefix}
+        {else}
+          {$comment.linePrefixEmpty}
+        {/if}
+        {$line}{\n}
+      {/for}
+      {if length($comment.lines) == 0}
+        {$comment.linePrefix}{\n}
+      {/if}
+
+      {if $comment.parentMessage}
+        >{sp}{$comment.parentMessage}{\n}
+      {/if}
+      {$comment.message}{\n}
+      {\n}
+      {\n}
+    {/for}
+  {/for}
+  {\n}
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/CommentFooter.soy b/resources/com/google/gerrit/server/mail/CommentFooter.soy
new file mode 100644
index 0000000..3998438
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/CommentFooter.soy
@@ -0,0 +1,25 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * The .CommentFooter template will determine the contents of the footer text
+ * that will be appended to emails related to a user submitting comments on
+ * changes.
+ */
+{template .CommentFooter kind="text"}
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/CommentFooterHtml.soy b/resources/com/google/gerrit/server/mail/CommentFooterHtml.soy
new file mode 100644
index 0000000..033c1b1
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/CommentFooterHtml.soy
@@ -0,0 +1,20 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+{template .CommentFooterHtml}
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/CommentHtml.soy b/resources/com/google/gerrit/server/mail/CommentHtml.soy
new file mode 100644
index 0000000..d554258
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/CommentHtml.soy
@@ -0,0 +1,175 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * @param commentFiles
+ * @param commentCount
+ * @param email
+ * @param labels
+ * @param patchSet
+ * @param patchSetCommentBlocks
+ */
+{template .CommentHtml}
+  {let $commentHeaderStyle kind="css"}
+    margin-bottom: 4px;
+  {/let}
+
+  {let $blockquoteStyle kind="css"}
+    border-left: 1px solid #aaa;
+    margin: 10px 0;
+    padding: 0 10px;
+  {/let}
+
+  {let $ulStyle kind="css"}
+    list-style: none;
+    padding: 0;
+  {/let}
+
+  {let $fileLiStyle kind="css"}
+    margin: 0;
+    padding: 0;
+  {/let}
+
+  {let $commentLiStyle kind="css"}
+    margin: 0;
+    padding: 0 0 0 16px;
+  {/let}
+
+  {let $voteStyle kind="css"}
+    border-radius: 3px;
+    display: inline-block;
+    margin: 0 2px;
+    padding: 4px;
+  {/let}
+
+  {let $positiveVoteStyle kind="css"}
+    {$voteStyle}
+    background-color: #d4ffd4;
+  {/let}
+
+  {let $negativeVoteStyle kind="css"}
+    {$voteStyle}
+    background-color: #ffd4d4;
+  {/let}
+
+  {let $neutralVoteStyle kind="css"}
+    {$voteStyle}
+    background-color: #ddd;
+  {/let}
+
+  {if $patchSetCommentBlocks}
+    {call .WikiFormat}{param content: $patchSetCommentBlocks /}{/call}
+  {/if}
+
+  {if length($labels) > 0}
+    <p>
+      Patch set {$patchSet.patchSetId}:
+      {for $label in $labels}
+        {if $label.value > 0}
+          <span style="{$positiveVoteStyle}">
+            {$label.label}{sp}+{$label.value}
+          </span>
+        {elseif $label.value < 0}
+          <span style="{$negativeVoteStyle}">
+            {$label.label}{sp}{$label.value}
+          </span>
+        {else}
+          <span style="{$neutralVoteStyle}">
+            -{$label.label}
+          </span>
+        {/if}
+      {/for}
+    </p>
+  {/if}
+
+  {if $email.changeUrl}
+    <p>
+      {call .ViewChangeButton data="all" /}
+    </p>
+  {/if}
+
+  {if $commentCount == 1}
+    <p>1 comment:</p>
+  {elseif $commentCount > 1}
+    <p>{$commentCount} comments:</p>
+  {/if}
+
+  <ul style="{$ulStyle}">
+    {for $group in $commentFiles}
+      <li style="{$fileLiStyle}">
+        <p>
+          <a href="{$group.link}">{$group.title}:</a>
+        </p>
+
+        <ul style="{$ulStyle}">
+          {for $comment in $group.comments}
+            <li style="{$commentLiStyle}">
+              {if $comment.isRobotComment}
+                <p style="{$commentHeaderStyle}">
+                  Robot Comment from{sp}
+                  {if $comment.robotUrl}<a href="{$comment.robotUrl}">{/if}
+                  {$comment.robotId}
+                  {if $comment.robotUrl}</a>{/if}{sp}
+                  (run ID {$comment.robotRunId}):
+                </p>
+              {/if}
+
+              <p style="{$commentHeaderStyle}">
+                <a href="{$comment.link}">
+                  {if $comment.startLine == 0}
+                    Patch Set #{$group.patchSetId}:
+                  {else}
+                    Patch Set #{$group.patchSetId},{sp}
+                    Line {$comment.startLine}:
+                  {/if}
+                </a>{sp}
+                {if length($comment.lines) == 1}
+                  <code style="font-family:monospace,monospace">
+                    {$comment.lines[0]}
+                  </code>
+                {/if}
+              </p>
+
+              {if length($comment.lines) > 1}
+                <p>
+                  <blockquote style="{$blockquoteStyle}">
+                    {call .Pre}{param content kind="html"}
+                      {for $line in $comment.lines}
+                        {$line}{\n}
+                      {/for}
+                    {/param}{/call}
+                  </blockquote>
+                </p>
+              {/if}
+
+              {if $comment.parentMessage}
+                <p>
+                  <blockquote style="{$blockquoteStyle}">
+                    {$comment.parentMessage}
+                  </blockquote>
+                </p>
+              {/if}
+
+              {call .WikiFormat}{param content: $comment.messageBlocks /}{/call}
+            </li>
+          {/for}
+        </ul>
+      </li>
+    {/for}
+  </ul>
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/DeleteReviewer.soy b/resources/com/google/gerrit/server/mail/DeleteReviewer.soy
new file mode 100644
index 0000000..065348a
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/DeleteReviewer.soy
@@ -0,0 +1,44 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * The .DeleteReviewer template will determine the contents of the email related
+ * to removal of a reviewer (and the reviewer's votes) from reviews.
+ * @param change
+ * @param coverLetter
+ * @param email
+ * @param fromName
+ */
+{template .DeleteReviewer kind="text"}
+  {$fromName} has removed{sp}
+  {for $reviewerName in $email.reviewerNames}
+    {if not isFirst($reviewerName)},{sp}{/if}
+    {$reviewerName}
+  {/for}{sp}
+  from this change.{sp}
+  {if $email.changeUrl} ( {$email.changeUrl} ){/if}{\n}
+  {\n}
+  Change subject: {$change.subject}{\n}
+  ......................................................................{\n}
+  {if $coverLetter}
+    {\n}
+    {\n}
+    {$coverLetter}
+    {\n}
+  {/if}
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/DeleteReviewerHtml.soy b/resources/com/google/gerrit/server/mail/DeleteReviewerHtml.soy
new file mode 100644
index 0000000..0599b52
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/DeleteReviewerHtml.soy
@@ -0,0 +1,43 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * @param email
+ * @param fromName
+ */
+{template .DeleteReviewerHtml}
+  <p>
+    {$fromName}{sp}
+    <strong>
+      removed{sp}
+      {for $reviewerName in $email.reviewerNames}
+        {if not isFirst($reviewerName)}
+          {if isLast($reviewerName)}{sp}and{else},{/if}{sp}
+        {/if}
+        {$reviewerName}
+      {/for}
+    </strong>{sp}
+    from this change.
+  </p>
+
+  {if $email.changeUrl}
+    <p>
+      {call .ViewChangeButton data="all" /}
+    </p>
+  {/if}
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/DeleteVote.soy b/resources/com/google/gerrit/server/mail/DeleteVote.soy
new file mode 100644
index 0000000..724e90d
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/DeleteVote.soy
@@ -0,0 +1,37 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * The .DeleteVote template will determine the contents of the email related
+ * to removing votes on changes.
+ * @param change
+ * @param coverLetter
+ * @param fromName
+ */
+{template .DeleteVote kind="text"}
+  {$fromName} has removed a vote on this change.{\n}
+  {\n}
+  Change subject: {$change.subject}{\n}
+  ......................................................................{\n}
+  {if $coverLetter}
+    {\n}
+    {\n}
+    {$coverLetter}
+    {\n}
+  {/if}
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/DeleteVoteHtml.soy b/resources/com/google/gerrit/server/mail/DeleteVoteHtml.soy
new file mode 100644
index 0000000..cb8162d
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/DeleteVoteHtml.soy
@@ -0,0 +1,38 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * @param coverLetter
+ * @param email
+ * @param fromName
+ */
+{template .DeleteVoteHtml}
+  <p>
+    {$fromName} <strong>removed a vote</strong> from this change.
+  </p>
+
+  {if $email.changeUrl}
+    <p>
+      {call .ViewChangeButton data="all" /}
+    </p>
+  {/if}
+
+  {if $coverLetter}
+    <div style="white-space:pre-wrap">{$coverLetter}</div>
+  {/if}
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/Footer.soy b/resources/com/google/gerrit/server/mail/Footer.soy
new file mode 100644
index 0000000..e1890a8
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/Footer.soy
@@ -0,0 +1,29 @@
+/**
+ * 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.
+*/
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * The .Footer template will determine the contents of the footer text
+ * appended to the end of all outgoing emails after the ChangeFooter and
+ * CommentFooter.
+ * @param footers
+ */
+{template .Footer kind="text"}
+  {for $footer in $footers}
+    {$footer}{\n}
+  {/for}
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/FooterHtml.soy b/resources/com/google/gerrit/server/mail/FooterHtml.soy
new file mode 100644
index 0000000..938655c
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/FooterHtml.soy
@@ -0,0 +1,29 @@
+/**
+ * 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.
+*/
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * @param footers
+ */
+{template .FooterHtml}
+  {\n}
+  {\n}
+  {for $footer in $footers}
+    <div style="display:none">{sp}{$footer}{sp}</div>{\n}
+  {/for}
+  {\n}
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/HeaderHtml.soy b/resources/com/google/gerrit/server/mail/HeaderHtml.soy
new file mode 100644
index 0000000..4710d8c
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/HeaderHtml.soy
@@ -0,0 +1,20 @@
+/**
+ * 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.
+*/
+
+{namespace com.google.gerrit.server.mail.template}
+
+{template .HeaderHtml}
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/InboundEmailRejection.soy b/resources/com/google/gerrit/server/mail/InboundEmailRejection.soy
new file mode 100644
index 0000000..e997776
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/InboundEmailRejection.soy
@@ -0,0 +1,64 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+{template .InboundEmailRejectionFooter kind="text"}
+  {\n}
+  {\n}
+  Thus, no actions were taken by Gerrit in response to this email,
+  and you should use the Gerrit website to continue.
+  {\n}
+  This email was sent in response to an email coming from this address.
+  In case you did not send Gerrit an email, feel free to ignore this.
+  {call .NoReplyFooter /}
+{/template}
+
+/**
+ * The .InboundEmailRejection templates will determine the contents of the email related
+ * to warning users of error in inbound emails
+ */
+
+{template .InboundEmailRejection_PARSING_ERROR kind="text"}
+  Gerrit Code Review was unable to parse your email.{\n}
+  This might be because your email did not quote Gerrit's email,
+  because you are using an unsupported email client,
+  or because of a bug.
+  {call .InboundEmailRejectionFooter /}
+{/template}
+
+{template .InboundEmailRejection_UNKNOWN_ACCOUNT kind="text"}
+  Gerrit Code Review was unable to match your email to an account.{\n}
+  This may happen if several accounts are linked to this email address.
+  {call .InboundEmailRejectionFooter /}
+{/template}
+
+{template .InboundEmailRejection_INACTIVE_ACCOUNT kind="text"}
+  Your account on this Gerrit Code Review instance is marked as inactive,
+  so your email has been ignored. {\n}
+  If you think this is an error, please contact your Gerrit instance administrator.
+  {\n}{\n}
+  This email was sent in response to an email coming from this address.
+  In case you did not send Gerrit an email, feel free to ignore this.
+  {call .NoReplyFooter /}
+{/template}
+
+{template .InboundEmailRejection_INTERNAL_EXCEPTION kind="text"}
+  Gerrit Code Review encountered an internal exception and was unable to fulfil your request.
+  {\n}
+  This might be caused by an ongoing maintenance or a data corruption.
+  {call .InboundEmailRejectionFooter /}
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/InboundEmailRejectionHtml.soy b/resources/com/google/gerrit/server/mail/InboundEmailRejectionHtml.soy
new file mode 100644
index 0000000..f879270
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/InboundEmailRejectionHtml.soy
@@ -0,0 +1,80 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+
+{template .InboundEmailRejectionFooterHtml}
+  <p>
+    Thus, no actions were taken by Gerrit in response to this email,
+    and you should use the Gerrit website to continue.
+  </p>
+  <p>
+    In case you did not send Gerrit an email, feel free to ignore this.
+  </p>
+  {call .NoReplyFooterHtml /}
+{/template}
+
+/**
+ * The .InboundEmailRejection templates will determine the contents of the email related
+ * to warning users of error in inbound emails
+ */
+
+{template .InboundEmailRejectionHtml_PARSING_ERROR}
+  <p>
+    Gerrit Code Review was unable to parse your email.
+  </p>
+  <p>
+    This might be because your email did not quote Gerrit's email,
+    because you are using an unsupported email client,
+    or because of a bug.
+  </p>
+  {call .InboundEmailRejectionFooterHtml /}
+{/template}
+
+{template .InboundEmailRejectionHtml_UNKNOWN_ACCOUNT}
+  <p>
+    Gerrit Code Review was unable to match your email to an account.
+  </p>
+  <p>
+    This may happen if several accounts are linked to this email address.
+  </p>
+  {call .InboundEmailRejectionFooterHtml /}
+{/template}
+
+{template .InboundEmailRejectionHtml_INACTIVE_ACCOUNT}
+  <p>
+    Your account on this Gerrit Code Review instance is marked as inactive,
+    so your email has been ignored.
+  </p>
+  <p>
+    If you think this is an error, please contact your Gerrit instance administrator.
+  </p>
+  <p>
+    In case you did not send Gerrit an email, feel free to ignore this.
+  </p>
+  {call .NoReplyFooter /}
+{/template}
+
+{template .InboundEmailRejectionHtml_INTERNAL_EXCEPTION}
+  <p>
+    Gerrit Code Review encountered an internal exception and was unable to fulfil your request.
+  </p>
+  <p>
+    This might be caused by an ongoing maintenance or a data corruption.
+  <p>
+  {call .InboundEmailRejectionFooterHtml /}
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/Merged.soy b/resources/com/google/gerrit/server/mail/Merged.soy
new file mode 100644
index 0000000..40924e6
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/Merged.soy
@@ -0,0 +1,42 @@
+
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * The .Merged template will determine the contents of the email related to
+ * a change successfully merged to the head.
+ * @param change
+ * @param email
+ * @param fromName
+ */
+{template .Merged kind="text"}
+  {$fromName} has submitted this change and it was merged.
+  {if $email.changeUrl} ( {$email.changeUrl} ){/if}{\n}
+  {\n}
+  Change subject: {$change.subject}{\n}
+  ......................................................................{\n}
+  {\n}
+  {$email.changeDetail}
+  {$email.approvals}
+  {if $email.includeDiff}
+    {\n}
+    {\n}
+    {$email.unifiedDiff}
+    {\n}
+  {/if}
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/MergedHtml.soy b/resources/com/google/gerrit/server/mail/MergedHtml.soy
new file mode 100644
index 0000000..b11c5e5
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/MergedHtml.soy
@@ -0,0 +1,42 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * @param diffLines
+ * @param email
+ * @param fromName
+ */
+{template .MergedHtml}
+  <p>
+    {$fromName} <strong>merged</strong> this change.
+  </p>
+
+  {if $email.changeUrl}
+    <p>
+      {call .ViewChangeButton data="all" /}
+    </p>
+  {/if}
+
+  <div style="white-space:pre-wrap">{$email.approvals}</div>
+
+  {call .Pre}{param content: $email.changeDetail /}{/call}
+
+  {if $email.includeDiff}
+    {call .UnifiedDiff}{param diffLines: $diffLines /}{/call}
+  {/if}
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/NewChange.soy b/resources/com/google/gerrit/server/mail/NewChange.soy
new file mode 100644
index 0000000..f11edfe
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/NewChange.soy
@@ -0,0 +1,81 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * The .NewChange template will determine the contents of the email related to a
+ * user submitting a new change for review.
+ * @param change
+ * @param email
+ * @param ownerName
+ * @param patchSet
+ * @param projectName
+ */
+{template .NewChange kind="text"}
+  {if $email.reviewerNames}
+    Hello{sp}
+    {for $reviewerName in $email.reviewerNames}
+      {if not isFirst($reviewerName)},{sp}{/if}
+      {$reviewerName}
+    {/for},
+
+    {\n}
+    {\n}
+
+    I'd like you to do a code review.
+
+    {if $email.changeUrl}
+      {sp}Please visit
+
+      {\n}
+      {\n}
+
+      {sp}{sp}{sp}{sp}{$email.changeUrl}
+
+      {\n}
+      {\n}
+
+      to review the following change.
+    {/if}
+  {else}
+    {$ownerName} has uploaded this change for review.
+    {if $email.changeUrl} ( {$email.changeUrl}{/if}
+  {/if}{\n}
+
+  {\n}
+  {\n}
+
+  Change subject: {$change.subject}{\n}
+  ......................................................................{\n}
+
+  {\n}
+
+  {$email.changeDetail}{\n}
+
+  {if $email.sshHost}
+    {\n}
+    {sp}{sp}git pull ssh:{print '//'}{$email.sshHost}/{$projectName}
+        {sp}{$patchSet.refName}
+    {\n}
+  {/if}
+
+  {if $email.includeDiff}
+    {\n}
+    {$email.unifiedDiff}
+    {\n}
+  {/if}
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/NewChangeHtml.soy b/resources/com/google/gerrit/server/mail/NewChangeHtml.soy
new file mode 100644
index 0000000..5bce806
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/NewChangeHtml.soy
@@ -0,0 +1,61 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * @param diffLines
+ * @param email
+ * @param fromName
+ * @param ownerName
+ * @param patchSet
+ * @param projectName
+ */
+{template .NewChangeHtml}
+  <p>
+    {if $email.reviewerNames}
+      {$fromName} would like{sp}
+      {for $reviewerName in $email.reviewerNames}
+        {if not isFirst($reviewerName)}
+          {if isLast($reviewerName)}{sp}and{else},{/if}{sp}
+        {/if}
+        {$reviewerName}
+      {/for}{sp}
+      to <strong>review</strong> this change.
+    {else}
+      {$ownerName} has uploaded this change for <strong>review</strong>.
+    {/if}
+  </p>
+
+  {if $email.changeUrl}
+    <p>
+      {call .ViewChangeButton data="all" /}
+    </p>
+  {/if}
+
+  {call .Pre}{param content: $email.changeDetail /}{/call}
+
+  {if $email.sshHost}
+    {call .Pre}{param content kind="html"}
+      git pull ssh:{print '//'}{$email.sshHost}/{$projectName}
+          {sp}{$patchSet.refName}
+    {/param}{/call}
+  {/if}
+
+  {if $email.includeDiff}
+    {call .UnifiedDiff}{param diffLines: $diffLines /}{/call}
+  {/if}
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/NoReplyFooter.soy b/resources/com/google/gerrit/server/mail/NoReplyFooter.soy
new file mode 100644
index 0000000..1443100
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/NoReplyFooter.soy
@@ -0,0 +1,23 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+{template .NoReplyFooter kind="text"}
+  {\n}
+  This is a send-only email address.  Replies to this message will not be read
+  or answered.
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/NoReplyFooterHtml.soy b/resources/com/google/gerrit/server/mail/NoReplyFooterHtml.soy
new file mode 100644
index 0000000..93df527
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/NoReplyFooterHtml.soy
@@ -0,0 +1,24 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+{template .NoReplyFooterHtml}
+  <p>
+    This is a send-only email address.  Replies to this message will not be read
+    or answered.
+  </p>
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/Private.soy b/resources/com/google/gerrit/server/mail/Private.soy
new file mode 100644
index 0000000..bb32a7e9
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/Private.soy
@@ -0,0 +1,121 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+/*
+ * Private templates that cannot be overridden.
+ */
+
+/**
+ * Private template to generate "View Change" buttons.
+ * @param email
+ */
+{template .ViewChangeButton}
+  <a href="{$email.changeUrl}">View Change</a>
+{/template}
+
+/**
+ * Private template to render PRE block with consistent font-sizing.
+ * @param content
+ */
+{template .Pre}
+  {let $preStyle kind="css"}
+    font-family: monospace,monospace; // Use this to avoid browsers scaling down
+                                      // monospace text.
+    white-space: pre-wrap;
+  {/let}
+  <pre style="{$preStyle}">{$content|changeNewlineToBr}</pre>
+{/template}
+
+/**
+ * Take a list of unescaped comment blocks and emit safely escaped HTML to
+ * render it nicely with wiki-like format.
+ *
+ * Each block is a map with a type key. When the type is 'paragraph', or 'pre',
+ * it also has a 'text' key that maps to the unescaped text content for the
+ * block. If the type is 'list', the map will have a 'items' key which maps to
+ * list of unescaped list item strings. If the type is quote, the map will have
+ * a 'quotedBlocks' key which maps to the blocks contained within the quote.
+ *
+ * This mechanism encodes as little structure as possible in order to depend on
+ * the Soy autoescape mechanism for all of the content.
+ *
+ * @param content
+ */
+{template .WikiFormat}
+  {let $blockquoteStyle kind="css"}
+    border-left: 1px solid #aaa;
+    margin: 10px 0;
+    padding: 0 10px;
+  {/let}
+
+  {let $pStyle kind="css"}
+    white-space: pre-wrap;
+    word-wrap: break-word;
+  {/let}
+
+  {for $block in $content}
+    {if $block.type == 'paragraph'}
+      <p style="{$pStyle}">{$block.text|changeNewlineToBr}</p>
+    {elseif $block.type == 'quote'}
+      <blockquote style="{$blockquoteStyle}">
+        {call .WikiFormat}{param content: $block.quotedBlocks /}{/call}
+      </blockquote>
+    {elseif $block.type == 'pre'}
+      {call .Pre}{param content: $block.text /}{/call}
+    {elseif $block.type == 'list'}
+      <ul>
+        {for $item in $block.items}
+          <li>{$item}</li>
+        {/for}
+      </ul>
+    {/if}
+  {/for}
+{/template}
+
+/**
+ * @param diffLines
+ */
+{template .UnifiedDiff}
+  {let $addStyle kind="css"}
+    color: hsl(120, 100%, 40%);
+  {/let}
+
+  {let $removeStyle kind="css"}
+    color: hsl(0, 100%, 40%);
+  {/let}
+
+  {let $preStyle kind="css"}
+    font-family: monospace,monospace; // Use this to avoid browsers scaling down
+                                      // monospace text.
+    white-space: pre-wrap;
+  {/let}
+
+  <pre style="{$preStyle}">
+    {for $line in $diffLines}
+      {if $line.type == 'add'}
+        <span style="{$addStyle}">
+      {elseif $line.type == 'remove'}
+        <span style="{$removeStyle}">
+      {else}
+        <span>
+      {/if}
+        {$line.text}
+      </span><br>
+    {/for}
+  </pre>
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/RegisterNewEmail.soy b/resources/com/google/gerrit/server/mail/RegisterNewEmail.soy
new file mode 100644
index 0000000..2886cc0
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/RegisterNewEmail.soy
@@ -0,0 +1,54 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * The .RegisterNewEmail template will determine the contents of the email
+ * related to registering new email accounts.
+ * @param email
+ */
+{template .RegisterNewEmail kind="text"}
+  Welcome to Gerrit Code Review at {$email.gerritHost}.{\n}
+
+  {\n}
+
+  To add a verified email address to your user account, please{\n}
+  click on the following link
+  {if $email.userNameEmail}
+    {sp}while signed in as {$email.userNameEmail}
+  {/if}:{\n}
+
+  {\n}
+
+  {$email.gerritUrl}#/VE/{$email.emailRegistrationToken}{\n}
+
+  {\n}
+
+  If you have received this mail in error, you do not need to take any{\n}
+  action to cancel the account.  The address will not be activated, and{\n}
+  you will not receive any further emails.{\n}
+
+  {\n}
+
+  If clicking the link above does not work, copy and paste the URL in a{\n}
+  new browser window instead.{\n}
+
+  {\n}
+
+  This is a send-only email address.  Replies to this message will not{\n}
+  be read or answered.{\n}
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/ReplacePatchSet.soy b/resources/com/google/gerrit/server/mail/ReplacePatchSet.soy
new file mode 100644
index 0000000..1cb0110
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/ReplacePatchSet.soy
@@ -0,0 +1,63 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * The .ReplacePatchSet template will determine the contents of the email
+ * related to a user submitting a new patchset for a change.
+ * @param change
+ * @param email
+ * @param fromEmail
+ * @param fromName
+ * @param patchSet
+ * @param projectName
+ */
+{template .ReplacePatchSet kind="text"}
+  {if $email.reviewerNames and $fromEmail == $change.ownerEmail}
+    Hello{sp}
+    {for $reviewerName in $email.reviewerNames}
+      {$reviewerName},{sp}
+    {/for}{\n}
+    {\n}
+    I'd like you to reexamine a change.
+    {if $email.changeUrl}
+      {sp}Please visit
+      {\n}
+      {\n}
+      {sp}{sp}{sp}{sp}{$email.changeUrl}
+      {\n}
+      {\n}
+      to look at the new patch set (#{$patchSet.patchSetId}).
+    {/if}
+  {else}
+    {$fromName} has uploaded a new patch set (#{$patchSet.patchSetId})
+    {if $fromEmail != $change.ownerEmail}
+      {sp}to the change originally created by {$change.ownerName}
+    {/if}.
+    {if $email.changeUrl} ( {$email.changeUrl} ){/if}
+  {/if}{\n}
+  {\n}
+  Change subject: {$change.subject}{\n}
+  ......................................................................{\n}
+  {\n}
+  {$email.changeDetail}{\n}
+  {if $email.sshHost}
+    {sp}{sp}git pull ssh:{print '//'}{$email.sshHost}/{$projectName}{sp}
+        {$patchSet.refName}
+    {\n}
+  {/if}
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/ReplacePatchSetHtml.soy b/resources/com/google/gerrit/server/mail/ReplacePatchSetHtml.soy
new file mode 100644
index 0000000..e618bef
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/ReplacePatchSetHtml.soy
@@ -0,0 +1,52 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * @param change
+ * @param email
+ * @param fromName
+ * @param fromEmail
+ * @param patchSet
+ * @param projectName
+ */
+{template .ReplacePatchSetHtml}
+  <p>
+    {$fromName} <strong>uploaded patch set #{$patchSet.patchSetId}</strong>{sp}
+    to{sp}
+    {if $fromEmail == $change.ownerEmail}
+      this change.
+    {else}
+      the change originally created by {$change.ownerName}.
+    {/if}
+  </p>
+
+  {if $email.changeUrl}
+    <p>
+      {call .ViewChangeButton data="all" /}
+    </p>
+  {/if}
+
+  {call .Pre}{param content: $email.changeDetail /}{/call}
+
+  {if $email.sshHost}
+    {call .Pre}{param content kind="html"}
+      git pull ssh:{print '//'}{$email.sshHost}/{$projectName}{sp}
+          {$patchSet.refName}
+    {/param}{/call}
+  {/if}
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/Restored.soy b/resources/com/google/gerrit/server/mail/Restored.soy
new file mode 100644
index 0000000..4fc6d8c
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/Restored.soy
@@ -0,0 +1,39 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * The .Restored template will determine the contents of the email related to a
+ * change being restored.
+ * @param change
+ * @param coverLetter
+ * @param email
+ * @param fromName
+ */
+{template .Restored kind="text"}
+  {$fromName} has restored this change.
+  {if $email.changeUrl} ( {$email.changeUrl} ){/if}{\n}
+  {\n}
+  Change subject: {$change.subject}{\n}
+  ......................................................................{\n}
+  {if $coverLetter}
+    {\n}
+    {\n}
+    {$coverLetter}
+    {\n}
+  {/if}
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/RestoredHtml.soy b/resources/com/google/gerrit/server/mail/RestoredHtml.soy
new file mode 100644
index 0000000..bb856ac
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/RestoredHtml.soy
@@ -0,0 +1,33 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * @param email
+ * @param fromName
+ */
+{template .RestoredHtml}
+  <p>
+    {$fromName} <strong>restored</strong> this change.
+  </p>
+
+  {if $email.changeUrl}
+    <p>
+      {call .ViewChangeButton data="all" /}
+    </p>
+  {/if}
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/Reverted.soy b/resources/com/google/gerrit/server/mail/Reverted.soy
new file mode 100644
index 0000000..fba8744
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/Reverted.soy
@@ -0,0 +1,39 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * The .Reverted template will determine the contents of the email related
+ * to a change being reverted.
+ * @param change
+ * @param coverLetter
+ * @param email
+ * @param fromName
+ */
+{template .Reverted kind="text"}
+  {$fromName} has created a revert of this change.
+  {if $email.changeUrl} ( {$email.changeUrl} ){/if}{\n}
+  {\n}
+  Change subject: {$change.subject}{\n}
+  ......................................................................{\n}
+  {if $coverLetter}
+    {\n}
+    {\n}
+    {$coverLetter}
+    {\n}
+  {/if}
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/RevertedHtml.soy b/resources/com/google/gerrit/server/mail/RevertedHtml.soy
new file mode 100644
index 0000000..b7b254e
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/RevertedHtml.soy
@@ -0,0 +1,33 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * @param email
+ * @param fromName
+ */
+{template .RevertedHtml}
+  <p>
+    {$fromName} has <strong>created a revert</strong> of this change.
+  </p>
+
+  {if $email.changeUrl}
+    <p>
+      {call .ViewChangeButton data="all" /}
+    </p>
+  {/if}
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/SetAssignee.soy b/resources/com/google/gerrit/server/mail/SetAssignee.soy
new file mode 100644
index 0000000..98290e9
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/SetAssignee.soy
@@ -0,0 +1,71 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * The .SetAssignee template will determine the contents of the email related
+ * to a user being assigned to a change.
+ * @param change
+ * @param email
+ * @param fromName
+ * @param patchSet
+ * @param projectName
+ */
+{template .SetAssignee kind="text"}
+  Hello{sp}
+  {$email.assigneeName},
+
+  {\n}
+  {\n}
+
+  {$fromName} has assigned a change to you.
+
+  {sp}Please visit
+
+  {\n}
+  {\n}
+
+  {sp}{sp}{sp}{sp}{$email.changeUrl}
+
+  {\n}
+  {\n}
+
+  to view the change.
+
+  {\n}
+  {\n}
+
+  Change subject: {$change.subject}{\n}
+  ......................................................................{\n}
+
+  {\n}
+
+  {$email.changeDetail}{\n}
+
+  {if $email.sshHost}
+    {\n}
+    {sp}{sp}git pull ssh:{print '//'}{$email.sshHost}/{$projectName}
+        {sp}{$patchSet.refName}
+    {\n}
+  {/if}
+
+  {if $email.includeDiff}
+    {\n}
+    {$email.unifiedDiff}
+    {\n}
+  {/if}
+{/template}
diff --git a/resources/com/google/gerrit/server/mail/SetAssigneeHtml.soy b/resources/com/google/gerrit/server/mail/SetAssigneeHtml.soy
new file mode 100644
index 0000000..dbd3fae
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/SetAssigneeHtml.soy
@@ -0,0 +1,50 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * @param diffLines
+ * @param email
+ * @param fromName
+ * @param patchSet
+ * @param projectName
+ */
+{template .SetAssigneeHtml}
+  <p>
+    {$fromName} has <strong>assigned</strong> a change to{sp}
+    {$email.assigneeName}.{sp}
+  </p>
+
+  {if $email.changeUrl}
+    <p>
+      {call .ViewChangeButton data="all" /}
+    </p>
+  {/if}
+
+  {call .Pre}{param content: $email.changeDetail /}{/call}
+
+  {if $email.sshHost}
+    {call .Pre}{param content kind="html"}
+      git pull ssh:{print '//'}{$email.sshHost}/{$projectName}
+          {sp}{$patchSet.refName}
+    {/param}{/call}
+  {/if}
+
+  {if $email.includeDiff}
+    {call .UnifiedDiff}{param diffLines: $diffLines /}{/call}
+  {/if}
+{/template}
diff --git a/resources/com/google/gerrit/server/mime/mime-types.properties b/resources/com/google/gerrit/server/mime/mime-types.properties
new file mode 100644
index 0000000..e4d478e
--- /dev/null
+++ b/resources/com/google/gerrit/server/mime/mime-types.properties
@@ -0,0 +1,264 @@
+apl = text/apl
+as = text/x-gas
+asn = text/x-ttcn-asn
+asn1 = text/x-ttcn-asn
+asp = application/x-aspx
+aspx = application/x-aspx
+asterisk = text/x-asterisk
+b = text/x-brainfuck
+bash = text/x-sh
+bf = text/x-brainfuck
+bnf = text/x-ebnf
+bucklet = text/x-python
+bzl = text/x-python
+BUCK = text/x-python
+BUILD = text/x-python
+c = text/x-csrc
+cfg = text/x-ttcn-cfg
+cl = text/x-common-lisp
+clj = text/x-clojure
+cljs = text/x-clojurescript
+cmake = text/x-cmake
+cmake.in = text/x-cmake
+contributing.md = text/x-gfm
+CMakeLists.txt = text/x-cmake
+CONTRIBUTING.md = text/x-gfm
+cob = text/x-cobol
+coffee = text/x-coffeescript
+conf = text/plain
+config = text/x-ini
+cpy = text/x-cobol
+cr = text/x-crystal
+cs = text/x-csharp
+csharp = text/x-csharp
+css = text/css
+cpp = text/x-c++src
+cql = text/x-cassandra
+cxx = text/x-c++src
+cyp = application/x-cypher-query
+cypher = application/x-cypher-query
+c++ = text/x-c++src
+d = text/x-d
+dart = application/dart
+def = text/plain
+defs = text/x-python
+diff = text/x-diff
+django = text/x-django
+dtd = application/xml-dtd
+dyalog = text/apl
+dyl = text/x-dylan
+dylan = text/x-dylan
+Dockerfile = text/x-dockerfile
+dtd = application/xml-dtd
+e = text/x-eiffel
+ebnf = text/x-ebnf
+ecl = text/x-ecl
+el = text/x-common-lisp
+elm = text/x-elm
+ejs = application/x-ejs
+erb = application/x-erb
+erl = text/x-erlang
+es6 = text/jsx
+excel = text/x-spreadsheet
+extensions.conf = text/x-asterisk
+f = text/x-fortran
+factor = text/x-factor
+feathre = text/x-feature
+fcl = text/x-fcl
+for = text/x-fortran
+formula = text/x-spreadsheet
+forth = text/x-forth
+fth = text/x-forth
+frag = x-shader/x-fragment
+fs = text/x-fsharp
+fsharp = text/x-fsharp
+f77 = text/x-fortran
+f90 = text/x-fortran
+gitmodules = text/x-ini
+glsl = x-shader/x-vertex
+go = text/x-go
+gradle = text/x-groovy
+gradlew = text/x-sh
+groovy = text/x-groovy
+gss = text/x-gss
+h = text/x-csrc
+haml = text/x-haml
+handlebars = text/x-handlebars
+hh = text/x-c++src
+history.md = text/x-gfm
+hpp = text/x-c++src
+hs = text/x-haskell
+htm = text/html
+html = text/html
+http = message/http
+hx = text/x-haxe
+hxml = text/x-hxml
+hxx = text/x-c++src
+h++ = text/x-c++src
+HISTORY.md = text/x-gfm
+in = text/x-properties
+ini = text/x-properties
+intr = text/x-dylan
+jade = text/x-pug
+java = text/x-java
+jl = text/x-julia
+jruby = text/x-ruby
+js = text/javascript
+json = application/json
+jsonld = application/ld+json
+jsx = text/jsx
+jsp = application/x-jsp
+kt = text/x-kotlin
+less = text/x-less
+lhs = text/x-literate-haskell
+lisp = text/x-common-lisp
+list = text/plain
+log = text/plain
+ls = text/x-livescript
+lsp = text/x-common-lisp
+lua = text/x-lua
+m = text/x-objectivec
+macruby = text/x-ruby
+map = application/json
+markdown = text/x-markdown
+mbox = application/mbox
+md = text/x-markdown
+mirc = text/mirc
+mjs = text/x-mjs
+mkd = text/x-markdown
+ml = text/x-ocaml
+mli = text/x-ocaml
+mll = text/x-ocaml
+mly = text/x-ocaml
+mm = text/x-objectivec
+mo = text/x-modelica
+mps = text/x-mumps
+msc = text/x-mscgen
+mscgen = text/x-mscgen
+mscin = text/x-mscgen
+msgenny = text/x-msgenny
+nb = text/x-mathematica
+nginx.conf = text/x-nginx-conf
+nsh = text/x-nsis
+nsi = text/x-nsis
+nt = text/n-triples
+nut = text/x-squirrel
+oz = text/x-oz
+p = text/x-pascal
+pas = text/x-pascal
+patch = text/x-diff
+pcss = text/x-pcss
+pgp = application/pgp
+pgsql = text/x-pgsql
+php = text/x-php
+php3 = text/x-php
+php4 = text/x-php
+php5 = text/x-php
+php7 = text/x-php
+phtml = text/x-php
+pig = text/x-pig
+pl = text/x-perl
+pls = text/x-plsql
+pm = text/x-perl
+postgres = text/x-pgsql
+postgresql = text/x-pgsql
+pp = text/x-puppet
+pro = text/x-idl
+properties = text/x-ini
+proto = text/x-protobuf
+protobuf = text/x-protobuf
+ps1 = application/x-powershell
+psd1 = application/x-powershell
+psm1 = application/x-powershell
+pug = text/x-pug
+py = text/x-python
+pyw = text/x-python
+pyx = text/x-cython
+pxd = text/x-cython
+pxi = text/x-cython
+PKGBUILD = text/x-sh
+q = text/x-q
+r = text/r-src
+rake = text/x-ruby
+rb = text/x-ruby
+rbx = text/x-ruby
+readme.md = text/x-gfm
+rng = application/xml
+rpm = text/x-rpm-changes
+rq = application/sparql-query
+rs = text/x-rustsrc
+rss = application/xml
+rst = text/x-rst
+README.md = text/x-gfm
+s = text/x-gas
+sas = text/x-sas
+sass = text/x-sass
+scala = text/x-scala
+scm = text/x-scheme
+scss = text/x-scss
+sh = text/x-sh
+sieve = application/sieve
+siv = application/sieve
+slim = text/x-slim
+solr = text/x-solr
+soy = text/x-soy
+sparql = application/sparql-query
+sparul = applicatoin/sparql-query
+spec = text/x-rpm-spec
+spreadsheet = text/x-spreadsheet
+sql = text/x-sql
+ss = text/x-scheme
+st = text/x-stsrc
+stex = text/x-stex
+sv = text/x-systemverilog
+svh = text/x-systemverilog
+swift = text/x-swift
+tcl = text/x-tcl
+tex = text/x-latex
+text = text/plain
+textile = text/x-textile
+tiddly = text/x-tiddlywiki
+tiddlywiki = text/x-tiddlywiki
+tiki = text/tiki
+toml = text/x-toml
+tpl = text/x-smarty
+ts = application/typescript
+ttcn = text/x-ttcn
+ttcnpp = text/x-ttcn
+ttcn3 = text/x-ttcn
+ttl = text/turtle
+txt = text/plain
+twig = text/x-twig
+v = text/x-verilog
+vb = text/x-vb
+vbs = text/vbscript
+vert = x-shader/x-vertex
+vh = text/x-verilog
+vhd = text/x-vhdl
+vhdl = text/x-vhdl
+vm = text/velocity
+vtl = text/velocity
+webidl = text/x-webidl
+wsdl = application/xml
+xhtml = text/html
+xml = application/xml
+xsd = application/xml
+xsl = application/xml
+xquery = application/xquery
+xu = text/x-xu
+xy = application/xquery
+yaml = text/x-yaml
+yml = text/x-yaml
+ys = text/x-yacas
+zsh = text/x-sh
+z80 = text/x-z80
+1 = text/troff
+2 = text/troff
+3 = text/troff
+4 = text/troff
+4th = text/x-forth
+5 = text/troff
+6 = text/troff
+7 = text/troff
+8 = text/troff
+9 = text/troff
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/tools/root/TOC b/resources/com/google/gerrit/server/tools/root/TOC
similarity index 100%
rename from gerrit-server/src/main/resources/com/google/gerrit/server/tools/root/TOC
rename to resources/com/google/gerrit/server/tools/root/TOC
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/tools/root/bin/gerrit-cherry-pick b/resources/com/google/gerrit/server/tools/root/bin/gerrit-cherry-pick
similarity index 100%
rename from gerrit-server/src/main/resources/com/google/gerrit/server/tools/root/bin/gerrit-cherry-pick
rename to resources/com/google/gerrit/server/tools/root/bin/gerrit-cherry-pick
diff --git a/resources/com/google/gerrit/server/tools/root/hooks/commit-msg b/resources/com/google/gerrit/server/tools/root/hooks/commit-msg
new file mode 100755
index 0000000..3f4cd7a
--- /dev/null
+++ b/resources/com/google/gerrit/server/tools/root/hooks/commit-msg
@@ -0,0 +1,48 @@
+#!/bin/sh
+#
+# Part of Gerrit Code Review (https://www.gerritcodereview.com/)
+#
+# Copyright (C) 2009 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.
+
+# avoid [[ which is not POSIX sh.
+if test "$#" != 1 ; then
+  echo "$0 requires an argument."
+  exit 1
+fi
+
+if test ! -f "$1" ; then
+  echo "file does not exist: $1"
+  exit 1
+fi
+
+if test ! -s "$1" ; then
+  echo "file is empty: $1"
+  exit 1
+fi
+
+# Do not create a change id if requested
+if test "false" = "`git config --bool --get gerrit.createChangeId`" ; then
+  exit 0
+fi
+
+# $RANDOM will be undefined if not using bash, so don't use set -u
+random=$( (whoami ; hostname ; date; cat $1 ; echo $RANDOM) | git hash-object --stdin)
+dest="$1.tmp.${random}"
+
+# Avoid the --in-place option which only appeared in Git 2.8
+# Avoid the --if-exists option which only appeared in Git 2.15
+cat "$1" \
+  | git -c trailer.ifexists=doNothing interpret-trailers --trailer "Change-Id: I${random}" > "${dest}" \
+  && mv "${dest}" "$1"
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/tools/root/scripts/preview_submit_test.sh b/resources/com/google/gerrit/server/tools/root/scripts/preview_submit_test.sh
similarity index 100%
rename from gerrit-server/src/main/resources/com/google/gerrit/server/tools/root/scripts/preview_submit_test.sh
rename to resources/com/google/gerrit/server/tools/root/scripts/preview_submit_test.sh
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/tools/root/scripts/reposize.sh b/resources/com/google/gerrit/server/tools/root/scripts/reposize.sh
similarity index 100%
rename from gerrit-server/src/main/resources/com/google/gerrit/server/tools/root/scripts/reposize.sh
rename to resources/com/google/gerrit/server/tools/root/scripts/reposize.sh
diff --git a/resources/log4j.properties b/resources/log4j.properties
new file mode 100644
index 0000000..28c0ee4
--- /dev/null
+++ b/resources/log4j.properties
@@ -0,0 +1,50 @@
+# Copyright (C) 2008 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.
+#
+log4j.rootCategory=INFO, stderr
+log4j.appender.stderr=org.apache.log4j.ConsoleAppender
+log4j.appender.stderr.target=System.err
+log4j.appender.stderr.layout=org.apache.log4j.PatternLayout
+log4j.appender.stderr.layout.ConversionPattern=[%d] [%t] %-5p %c %x: %m%n
+
+# Silence non-critical messages from MINA SSHD.
+#
+log4j.logger.org.apache.mina=WARN
+log4j.logger.org.apache.sshd.common=WARN
+log4j.logger.org.apache.sshd.server=WARN
+log4j.logger.org.apache.sshd.common.keyprovider.FileKeyPairProvider=INFO
+log4j.logger.com.google.gerrit.sshd.GerritServerSession=WARN
+
+# Silence non-critical messages from mime-util.
+#
+log4j.logger.eu.medsea.mimeutil=WARN
+
+# Silence non-critical messages from openid4java
+#
+log4j.logger.org.apache.http=WARN
+log4j.logger.org.apache.xml=WARN
+log4j.logger.org.openid4java=WARN
+log4j.logger.org.openid4java.consumer.ConsumerManager=FATAL
+log4j.logger.org.openid4java.discovery.Discovery=ERROR
+log4j.logger.org.openid4java.server.RealmVerifier=ERROR
+log4j.logger.org.openid4java.message.AuthSuccess=ERROR
+
+# Silence non-critical messages from c3p0 (if used).
+#
+log4j.logger.com.mchange.v2.c3p0=WARN
+log4j.logger.com.mchange.v2.resourcepool=WARN
+log4j.logger.com.mchange.v2.sql=WARN
+
+# Silence non-critical messages from apache.http
+log4j.logger.org.apache.http=WARN
diff --git a/tools/BUILD b/tools/BUILD
index 7760b20..aefb867 100644
--- a/tools/BUILD
+++ b/tools/BUILD
@@ -92,33 +92,7 @@
 package_group(
     name = "error_prone_packages",
     packages = [
-        "//gerrit-acceptance-framework/...",
-        "//gerrit-acceptance-tests/...",
-        "//gerrit-cache-h2/...",
-        "//gerrit-cache-mem/...",
-        "//gerrit-common/...",
-        "//gerrit-elasticsearch/...",
-        "//gerrit-extension-api/...",
-        "//gerrit-gpg/...",
-        "//gerrit-httpd/...",
-        "//gerrit-launcher/...",
-        "//gerrit-lucene/...",
-        "//gerrit-main/...",
-        "//gerrit-oauth/...",
-        "//gerrit-openid/...",
-        "//gerrit-patch-commonsnet/...",
-        "//gerrit-patch-jgit/...",
-        "//gerrit-pgm/...",
-        "//gerrit-plugin-api/...",
-        "//gerrit-plugin-gwtui/...",
-        "//gerrit-prettify/...",
-        "//gerrit-reviewdb/...",
-        "//gerrit-server/...",
-        "//gerrit-sshd/...",
-        "//gerrit-test-util/...",
-        "//gerrit-util-cli/...",
-        "//gerrit-util-http/...",
-        "//gerrit-util-ssl/...",
-        "//gerrit-war/...",
+        "//java/...",
+        "//javatests/...",
     ],
 )
diff --git a/tools/bzl/asciidoc.bzl b/tools/bzl/asciidoc.bzl
index 9a3e38f..825ac98 100644
--- a/tools/bzl/asciidoc.bzl
+++ b/tools/bzl/asciidoc.bzl
@@ -17,21 +17,6 @@
         "revnumber=%s",
     ]
 
-def release_notes_attributes():
-    return [
-        "toc",
-        'newline="\\n"',
-        'asterisk="&#42;"',
-        'plus="&#43;"',
-        'caret="&#94;"',
-        'startsb="&#91;"',
-        'endsb="&#93;"',
-        'tilde="&#126;"',
-        "last-update-label!",
-        "stylesheet=DEFAULT",
-        "linkcss=true",
-    ]
-
 def _replace_macros_impl(ctx):
     cmd = [
         ctx.file._exe.path,
@@ -135,7 +120,7 @@
         allow_single_file = True,
     ),
     "_exe": attr.label(
-        default = Label("//lib/asciidoctor:asciidoc"),
+        default = Label("//java/com/google/gerrit/asciidoctor:asciidoc"),
         cfg = "host",
         allow_files = True,
         executable = True,
@@ -222,8 +207,9 @@
     ]
     args.extend(_generate_asciidoc_args(ctx))
     ctx.actions.run(
-        inputs = ctx.files.srcs + [ctx.executable._exe, ctx.file.version],
+        inputs = ctx.files.srcs + [ctx.file.version],
         outputs = [ctx.outputs.out],
+        tools = [ctx.executable._exe],
         executable = ctx.executable._exe,
         arguments = args,
         progress_message = "Rendering asciidoctor files for %s" % ctx.label.name,
diff --git a/tools/bzl/classpath.bzl b/tools/bzl/classpath.bzl
index 55479c5..0d43be7 100644
--- a/tools/bzl/classpath.bzl
+++ b/tools/bzl/classpath.bzl
@@ -3,7 +3,8 @@
     for d in ctx.attr.deps:
         if hasattr(d, "java"):
             all.append(d.java.transitive_runtime_deps)
-            all.append(d.java.compilation_info.runtime_classpath)
+            if hasattr(d.java.compilation_info, "runtime_classpath"):
+                all.append(d.java.compilation_info.runtime_classpath)
         elif hasattr(d, "files"):
             all.append(d.files)
 
diff --git a/tools/bzl/gwt.bzl b/tools/bzl/gwt.bzl
index 234d320..d3e5033 100644
--- a/tools/bzl/gwt.bzl
+++ b/tools/bzl/gwt.bzl
@@ -12,8 +12,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# Port of Buck native gwt_binary() rule. See discussion in context of
-# https://github.com/facebook/buck/issues/109
 load("//tools/bzl:genrule2.bzl", "genrule2")
 load("//tools/bzl:java.bzl", "java_library2")
 
@@ -79,7 +77,7 @@
 ]
 
 DEPS = GWT_TRANSITIVE_DEPS + [
-    "//gerrit-gwtexpui:CSS",
+    "//java/com/google/gwtexpui/css",
     "//lib:gwtjsonrpc",
     "//lib/gwt:dev",
     "//lib/jgit/org.eclipse.jgit:jgit-source",
@@ -188,8 +186,9 @@
     ])
 
     ctx.actions.run_shell(
-        inputs = list(deps) + ctx.files._jdk + ctx.files._zip + gwt_user_agent_modules,
+        inputs = list(deps) + gwt_user_agent_modules,
         outputs = [output_zip],
+        tools = ctx.files._jdk + ctx.files._zip,
         mnemonic = "GwtBinary",
         progress_message = "GWT compiling " + output_zip.short_path,
         command = "set -e\n" + cmd,
@@ -291,7 +290,7 @@
         deps = [
             "//gerrit-gwtui-common:diffy_logo",
             "//gerrit-gwtui-common:client",
-            "//gerrit-gwtexpui:CSS",
+            "//java/com/google/gwtexpui/css",
             "//lib/codemirror:codemirror" + suffix,
             "//lib/gwt:user",
         ],
diff --git a/tools/bzl/js.bzl b/tools/bzl/js.bzl
index 4061a77..a7714a1 100644
--- a/tools/bzl/js.bzl
+++ b/tools/bzl/js.bzl
@@ -1,3 +1,4 @@
+load("@io_bazel_rules_closure//closure:defs.bzl", "closure_js_binary", "closure_js_library")
 load("//lib/js:npm.bzl", "NPM_SHA1S", "NPM_VERSIONS")
 
 NPMJS = "NPMJS"
@@ -146,9 +147,9 @@
     )
 
     return struct(
-        transitive_zipfiles = transitive_zipfiles,
-        transitive_versions = transitive_versions,
         transitive_licenses = transitive_licenses,
+        transitive_versions = transitive_versions,
+        transitive_zipfiles = transitive_zipfiles,
     )
 
 _common_attrs = {
@@ -187,9 +188,9 @@
         licenses.append(ctx.file.license)
 
     return struct(
-        transitive_zipfiles = list([ctx.outputs.zip]),
-        transitive_versions = depset(),
         transitive_licenses = depset(licenses),
+        transitive_versions = depset(),
+        transitive_zipfiles = list([ctx.outputs.zip]),
     )
 
 js_component = rule(
@@ -272,9 +273,9 @@
     )
 
     return struct(
-        transitive_zipfiles = zips,
-        transitive_versions = versions,
         transitive_licenses = licenses,
+        transitive_versions = versions,
+        transitive_zipfiles = zips,
     )
 
 bower_component_bundle = rule(
@@ -285,33 +286,35 @@
         "zip": "%{name}.zip",
     },
 )
-"""Groups a set of bower components together in a zip file.
 
-Outputs:
-  NAME-versions.json:
-    a JSON file containing a PKG-NAME => PKG-NAME#VERSION mapping for the
-    transitive dependencies.
-  NAME.zip:
-    a zip file containing the transitive dependencies for this bundle.
-"""
+def _bundle_impl(ctx):
+    """Groups a set of .html and .js together in a zip file.
 
-def _vulcanize_impl(ctx):
-    # intermediate artifact.
-    vulcanized = ctx.actions.declare_file(
-        ctx.outputs.html.path + ".vulcanized.html",
-    )
+    Outputs:
+      NAME-versions.json:
+        a JSON file containing a PKG-NAME => PKG-NAME#VERSION mapping for the
+        transitive dependencies.
+    NAME.zip:
+      a zip file containing the transitive dependencies for this bundle.
+    """
+
+    # intermediate artifact if split is wanted.
+    if ctx.attr.split:
+        bundled = ctx.actions.declare_file(ctx.outputs.html.path + ".bundled.html")
+    else:
+        bundled = ctx.outputs.html
     destdir = ctx.outputs.html.path + ".dir"
     zips = [z for d in ctx.attr.deps for z in d.transitive_zipfiles]
 
     hermetic_npm_binary = " ".join([
         "python",
         "$p/" + ctx.file._run_npm.path,
-        "$p/" + ctx.file._vulcanize_archive.path,
+        "$p/" + ctx.file._bundler_archive.path,
         "--inline-scripts",
         "--inline-css",
         "--strip-comments",
-        "--out-html",
-        "$p/" + vulcanized.path,
+        "--out-file",
+        "$p/" + bundled.path,
         ctx.file.app.path,
     ])
 
@@ -336,49 +339,57 @@
     # from the environment, and it may be under $HOME, so we can't run
     # in the sandbox.
     node_tweaks = dict(
-        use_default_shell_env = True,
         execution_requirements = {"local": "1"},
+        use_default_shell_env = True,
     )
     ctx.actions.run_shell(
-        mnemonic = "Vulcanize",
+        mnemonic = "Bundle",
         inputs = [
             ctx.file._run_npm,
             ctx.file.app,
-            ctx.file._vulcanize_archive,
+            ctx.file._bundler_archive,
         ] + list(zips) + ctx.files.srcs,
-        outputs = [vulcanized],
+        outputs = [bundled],
         command = cmd,
         **node_tweaks
     )
 
-    hermetic_npm_command = "export PATH && " + " ".join([
-        "python",
-        ctx.file._run_npm.path,
-        ctx.file._crisper_archive.path,
-        "--always-write-script",
-        "--source",
-        vulcanized.path,
-        "--html",
-        ctx.outputs.html.path,
-        "--js",
-        ctx.outputs.js.path,
-    ])
+    if ctx.attr.split:
+        hermetic_npm_command = "export PATH && " + " ".join([
+            "python",
+            ctx.file._run_npm.path,
+            ctx.file._crisper_archive.path,
+            "--always-write-script",
+            "--source",
+            bundled.path,
+            "--html",
+            ctx.outputs.html.path,
+            "--js",
+            ctx.outputs.js.path,
+        ])
 
-    ctx.actions.run_shell(
-        mnemonic = "Crisper",
-        inputs = [
-            ctx.file._run_npm,
-            ctx.file.app,
-            ctx.file._crisper_archive,
-            vulcanized,
-        ],
-        outputs = [ctx.outputs.js, ctx.outputs.html],
-        command = hermetic_npm_command,
-        **node_tweaks
-    )
+        ctx.actions.run_shell(
+            mnemonic = "Crisper",
+            inputs = [
+                ctx.file._run_npm,
+                ctx.file.app,
+                ctx.file._crisper_archive,
+                bundled,
+            ],
+            outputs = [ctx.outputs.js, ctx.outputs.html],
+            command = hermetic_npm_command,
+            **node_tweaks
+        )
 
-_vulcanize_rule = rule(
-    _vulcanize_impl,
+def _bundle_output_func(name, split):
+    _ignore = [name]  # unused.
+    out = {"html": "%{name}.html"}
+    if split:
+        out["js"] = "%{name}.js"
+    return out
+
+_bundle_rule = rule(
+    _bundle_impl,
     attrs = {
         "srcs": attr.label_list(allow_files = [
             ".js",
@@ -392,7 +403,12 @@
             allow_single_file = True,
         ),
         "pkg": attr.string(mandatory = True),
+        "split": attr.bool(default = True),
         "deps": attr.label_list(providers = ["transitive_zipfiles"]),
+        "_bundler_archive": attr.label(
+            default = Label("@polymer-bundler//:%s" % _npm_tarball("polymer-bundler")),
+            allow_single_file = True,
+        ),
         "_crisper_archive": attr.label(
             default = Label("@crisper//:%s" % _npm_tarball("crisper")),
             allow_single_file = True,
@@ -401,17 +417,111 @@
             default = Label("//tools/js:run_npm_binary.py"),
             allow_single_file = True,
         ),
-        "_vulcanize_archive": attr.label(
-            default = Label("@vulcanize//:%s" % _npm_tarball("vulcanize")),
-            allow_single_file = True,
-        ),
     },
-    outputs = {
-        "html": "%{name}.html",
-        "js": "%{name}.js",
-    },
+    outputs = _bundle_output_func,
 )
 
-def vulcanize(*args, **kwargs):
-    """Vulcanize runs vulcanize and crisper on a set of sources."""
-    _vulcanize_rule(pkg = native.package_name(), *args, **kwargs)
+def bundle_assets(*args, **kwargs):
+    """Combine html, js, css files and optionally split into js and html bundles."""
+    _bundle_rule(pkg = native.package_name(), *args, **kwargs)
+
+def polygerrit_plugin(name, app, srcs = [], assets = None, plugin_name = None, **kwargs):
+    """Bundles plugin dependencies for deployment.
+
+    This rule bundles all Polymer elements and JS dependencies into .html and .js files.
+    Run-time dependencies (e.g. JS libraries loaded after plugin starts) should be provided using "assets" property.
+    Output of this rule is a FileSet with "${name}_fs", with deploy artifacts in "plugins/${name}/static".
+
+    Args:
+      name: String, rule name.
+      app: String, the main or root source file.
+      assets: Fileset, additional files to be used by plugin in runtime, exported to "plugins/${name}/static".
+      plugin_name: String, plugin name. ${name} is used if not provided.
+    """
+    if not plugin_name:
+        plugin_name = name
+
+    html_plugin = app.endswith(".html")
+    srcs = srcs if app in srcs else srcs + [app]
+
+    if html_plugin:
+        # Combines all .js and .html files into foo_combined.js and foo_combined.html
+        _bundle_rule(
+            name = name + "_combined",
+            app = app,
+            srcs = srcs,
+            pkg = native.package_name(),
+            **kwargs
+        )
+        js_srcs = [name + "_combined.js"]
+    else:
+        js_srcs = srcs
+
+    closure_js_library(
+        name = name + "_closure_lib",
+        srcs = js_srcs,
+        convention = "GOOGLE",
+        no_closure_library = True,
+        deps = [
+            "//lib/polymer_externs:polymer_closure",
+            "//polygerrit-ui/app/externs:plugin",
+        ],
+    )
+
+    closure_js_binary(
+        name = name + "_bin",
+        compilation_level = "SIMPLE",
+        defs = [
+            "--polymer_version=1",
+            "--language_out=ECMASCRIPT6",
+            "--rewrite_polyfills=false",
+        ],
+        deps = [
+            name + "_closure_lib",
+        ],
+    )
+
+    if html_plugin:
+        native.genrule(
+            name = name + "_rename_html",
+            srcs = [name + "_combined.html"],
+            outs = [plugin_name + ".html"],
+            cmd = "sed 's/<script src=\"" + name + "_combined.js\"/<script src=\"" + plugin_name + ".js\"/g' $(SRCS) > $(OUTS)",
+            output_to_bindir = True,
+        )
+
+    native.genrule(
+        name = name + "_rename_js",
+        srcs = [name + "_bin.js"],
+        outs = [plugin_name + ".js"],
+        cmd = "cp $< $@",
+        output_to_bindir = True,
+    )
+
+    if html_plugin:
+        static_files = [plugin_name + ".js", plugin_name + ".html"]
+    else:
+        static_files = [plugin_name + ".js"]
+
+    if assets:
+        nested, direct = [], []
+        for x in assets:
+            target = nested if "/" in x else direct
+            target.append(x)
+
+        static_files += direct
+
+        if nested:
+            native.genrule(
+                name = name + "_copy_assets",
+                srcs = assets,
+                outs = [f.split("/")[-1] for f in nested],
+                cmd = "cp $(SRCS) $(@D)",
+                output_to_bindir = True,
+            )
+            static_files += [":" + name + "_copy_assets"]
+
+    native.filegroup(
+        name = name,
+        srcs = static_files,
+    )
diff --git a/tools/bzl/junit.bzl b/tools/bzl/junit.bzl
index 4dfdb61..8ab635c 100644
--- a/tools/bzl/junit.bzl
+++ b/tools/bzl/junit.bzl
@@ -64,6 +64,14 @@
     implementation = _impl,
 )
 
+POST_JDK8_OPTS = [
+    # Enforce JDK 8 compatibility on Java 9, see
+    # https://docs.oracle.com/javase/9/intl/internationalization-enhancements-jdk-9.htm#JSINT-GUID-AF5AECA7-07C1-4E7D-BC10-BC7E73DC6C7F
+    "-Djava.locale.providers=COMPAT,CLDR,SPI",
+    "--add-modules java.activation",
+    "--add-opens=jdk.management/com.sun.management.internal=ALL-UNNAMED",
+]
+
 def junit_tests(name, srcs, **kwargs):
     s_name = name.replace("-", "_") + "TestSuite"
     _GenSuite(
@@ -71,9 +79,15 @@
         srcs = srcs,
         outname = s_name,
     )
+    jvm_flags = kwargs.get("jvm_flags", [])
+    jvm_flags = jvm_flags + select({
+        "//:java10": POST_JDK8_OPTS,
+        "//:java9": POST_JDK8_OPTS,
+        "//conditions:default": [],
+    })
     native.java_test(
         name = name,
         test_class = s_name,
         srcs = srcs + [":" + s_name],
-        **kwargs
+        **dict(kwargs, jvm_flags = jvm_flags)
     )
diff --git a/tools/bzl/license-map.py b/tools/bzl/license-map.py
index 4856726..ebe57f2 100644
--- a/tools/bzl/license-map.py
+++ b/tools/bzl/license-map.py
@@ -25,35 +25,34 @@
 handled_rules = []
 
 for xml in args.xmls:
-  tree = ET.parse(xml)
-  root = tree.getroot()
+    tree = ET.parse(xml)
+    root = tree.getroot()
 
-  for child in root:
-    rule_name = child.attrib["name"]
-    if rule_name in handled_rules:
-      # already handled in other xml files
-      continue
+    for child in root:
+        rule_name = child.attrib["name"]
+        if rule_name in handled_rules:
+            # already handled in other xml files
+            continue
 
-    handled_rules.append(rule_name)
-    for c in list(child):
-      if c.tag != "rule-input":
-        continue
+        handled_rules.append(rule_name)
+        for c in list(child):
+            if c.tag != "rule-input":
+                continue
 
-      license_name = c.attrib["name"]
-      if LICENSE_PREFIX in license_name:
-        entries[rule_name].append(license_name)
-        graph[license_name].append(rule_name)
+            license_name = c.attrib["name"]
+            if LICENSE_PREFIX in license_name:
+                entries[rule_name].append(license_name)
+                graph[license_name].append(rule_name)
 
 if len(graph[DO_NOT_DISTRIBUTE]):
-  print("DO_NOT_DISTRIBUTE license found in:", file=stderr)
-  for target in graph[DO_NOT_DISTRIBUTE]:
-    print(target, file=stderr)
-  exit(1)
+    print("DO_NOT_DISTRIBUTE license found in:", file=stderr)
+    for target in graph[DO_NOT_DISTRIBUTE]:
+        print(target, file=stderr)
+    exit(1)
 
 if args.asciidoctor:
-  print(
-# We don't want any blank line before "= Gerrit Code Review - Licenses"
-"""= Gerrit Code Review - Licenses
+    # We don't want any blank line before "= Gerrit Code Review - Licenses"
+    print("""= Gerrit Code Review - Licenses
 
 Gerrit open source software is licensed under the <<Apache2_0,Apache
 License 2.0>>.  Executable distributions also include other software
@@ -93,40 +92,39 @@
 """)
 
 for n in sorted(graph.keys()):
-  if len(graph[n]) == 0:
-    continue
+    if len(graph[n]) == 0:
+        continue
 
-  name = n[len(LICENSE_PREFIX):]
-  safename = name.replace(".", "_")
-  print()
-  print("[[%s]]" % safename)
-  print(name)
-  print()
-  for d in sorted(graph[n]):
-    if d.startswith("//lib:") or d.startswith("//lib/"):
-      p = d[len("//lib:"):]
-    else:
-      p = d[d.index(":")+1:].lower()
-    if "__" in p:
-      p = p[:p.index("__")]
-    print("* " + p)
-  print()
-  print("[[%s_license]]" % safename)
-  print("----")
-  filename = n[2:].replace(":", "/")
-  try:
-    with open(filename, errors='ignore') as fd:
-      copyfileobj(fd, stdout)
-  except TypeError:
-    with open(filename) as fd:
-      copyfileobj(fd, stdout)
-  print()
-  print("----")
-  print()
+    name = n[len(LICENSE_PREFIX):]
+    safename = name.replace(".", "_")
+    print()
+    print("[[%s]]" % safename)
+    print(name)
+    print()
+    for d in sorted(graph[n]):
+        if d.startswith("//lib:") or d.startswith("//lib/"):
+            p = d[len("//lib:"):]
+        else:
+            p = d[d.index(":")+1:].lower()
+        if "__" in p:
+            p = p[:p.index("__")]
+        print("* " + p)
+    print()
+    print("[[%s_license]]" % safename)
+    print("----")
+    filename = n[2:].replace(":", "/")
+    try:
+        with open(filename, errors='ignore') as fd:
+            copyfileobj(fd, stdout)
+    except TypeError:
+        with open(filename) as fd:
+            copyfileobj(fd, stdout)
+    print()
+    print("----")
+    print()
 
 if args.asciidoctor:
-  print(
-"""
+    print("""
 GERRIT
 ------
 Part of link:index.html[Gerrit Code Review]
diff --git a/tools/bzl/pkg_war.bzl b/tools/bzl/pkg_war.bzl
index 5c07987..86cd215 100644
--- a/tools/bzl/pkg_war.bzl
+++ b/tools/bzl/pkg_war.bzl
@@ -17,18 +17,18 @@
 jar_filetype = [".jar"]
 
 LIBS = [
-    "//gerrit-war:init",
-    "//gerrit-war:log4j-config",
-    "//gerrit-war:version",
+    "//java/com/google/gerrit/common:version",
+    "//java/com/google/gerrit/httpd/init",
     "//lib:postgresql",
     "//lib/bouncycastle:bcpkix",
     "//lib/bouncycastle:bcprov",
     "//lib/bouncycastle:bcpg",
     "//lib/log:impl-log4j",
+    "//resources:log4j-config",
 ]
 
 PGMLIBS = [
-    "//gerrit-pgm:pgm",
+    "//java/com/google/gerrit/pgm",
 ]
 
 def _add_context(in_file, output):
@@ -45,7 +45,8 @@
 
     if short_path.startswith("gerrit-"):
         n = short_path.split("/")[0] + "-" + n
-
+    elif short_path.startswith("java/"):
+        n = short_path[5:].replace("/", "_")
     output_path += n
     return [
         "test -L %s || ln -s $(pwd)/%s %s" % (output_path, input_path, output_path),
@@ -153,8 +154,8 @@
         libs = LIBS + doc_lib,
         pgmlibs = PGMLIBS,
         context = doc_ctx + context + ui_deps + [
-            "//gerrit-main:main_bin_deploy.jar",
-            "//gerrit-war:webapp_assets",
+            "//java:gerrit-main-class_deploy.jar",
+            "//webapp:assets",
         ],
         **kwargs
     )
diff --git a/tools/bzl/plugin.bzl b/tools/bzl/plugin.bzl
index 84ec1c1..5ae7dd9 100644
--- a/tools/bzl/plugin.bzl
+++ b/tools/bzl/plugin.bzl
@@ -9,11 +9,12 @@
     "gwt_binary",
 )
 
-PLUGIN_DEPS = ["//gerrit-plugin-api:lib"]
-PLUGIN_DEPS_NEVERLINK = ["//gerrit-plugin-api:lib-neverlink"]
+PLUGIN_DEPS = ["//plugins:plugin-lib"]
+
+PLUGIN_DEPS_NEVERLINK = ["//plugins:plugin-lib-neverlink"]
 
 PLUGIN_TEST_DEPS = [
-    "//gerrit-acceptance-framework:lib",
+    "//java/com/google/gerrit/acceptance:lib",
     "//lib/bouncycastle:bcpg",
     "//lib/bouncycastle:bcpkix",
     "//lib/bouncycastle:bcprov",
diff --git a/tools/bzl/plugins.bzl b/tools/bzl/plugins.bzl
index 149dbb5..7fd7625 100644
--- a/tools/bzl/plugins.bzl
+++ b/tools/bzl/plugins.bzl
@@ -1,4 +1,5 @@
 CORE_PLUGINS = [
+    "codemirror-editor",
     "commit-message-length-validator",
     "download-commands",
     "hooks",
diff --git a/tools/coverage.sh b/tools/coverage.sh
index 8fa979f..72e1d5b 100755
--- a/tools/coverage.sh
+++ b/tools/coverage.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
 #
 # Usage
 #
@@ -22,7 +22,7 @@
 
 # coverage is expensive to run; use --jobs=2 to avoid overloading the
 # machine.
-bazel coverage -k --jobs=${COVERAGE_CPUS:-2} -- ... -//gerrit-common:auto_value_tests
+bazel coverage -k --jobs=${COVERAGE_CPUS:-2} -- ... -//javatests/com/google/gerrit/common:auto_value_tests
 
 # The coverage data contains filenames relative to the Java root, and
 # genhtml has no logic to search these elsewhere. Workaround this
diff --git a/tools/download_file.py b/tools/download_file.py
index 26671f0..29398e6 100755
--- a/tools/download_file.py
+++ b/tools/download_file.py
@@ -30,49 +30,50 @@
 
 
 def safe_mkdirs(d):
-  if path.isdir(d):
-    return
-  try:
-    makedirs(d)
-  except OSError as err:
-    if not path.isdir(d):
-      raise err
+    if path.isdir(d):
+        return
+    try:
+        makedirs(d)
+    except OSError as err:
+        if not path.isdir(d):
+            raise err
 
 
 def download_properties(root_dir):
-  """ Get the download properties.
+    """ Get the download properties.
 
-  First tries to find the properties file in the given root directory,
-  and if not found there, tries in the Gerrit settings folder in the
-  user's home directory.
+    First tries to find the properties file in the given root directory,
+    and if not found there, tries in the Gerrit settings folder in the
+    user's home directory.
 
-  Returns a set of download properties, which may be empty.
+    Returns a set of download properties, which may be empty.
 
-  """
-  p = {}
-  local_prop = path.join(root_dir, LOCAL_PROPERTIES)
-  if not path.isfile(local_prop):
-    local_prop = path.join(GERRIT_HOME, LOCAL_PROPERTIES)
-  if path.isfile(local_prop):
-    try:
-      with open(local_prop) as fd:
-        for line in fd:
-          if line.startswith('download.'):
-            d = [e.strip() for e in line.split('=', 1)]
-            name, url = d[0], d[1]
-            p[name[len('download.'):]] = url
-    except OSError:
-      pass
-  return p
+    """
+    p = {}
+    local_prop = path.join(root_dir, LOCAL_PROPERTIES)
+    if not path.isfile(local_prop):
+        local_prop = path.join(GERRIT_HOME, LOCAL_PROPERTIES)
+    if path.isfile(local_prop):
+        try:
+            with open(local_prop) as fd:
+                for line in fd:
+                    if line.startswith('download.'):
+                        d = [e.strip() for e in line.split('=', 1)]
+                        name, url = d[0], d[1]
+                        p[name[len('download.'):]] = url
+        except OSError:
+            pass
+    return p
 
 
 def cache_entry(args):
-  if args.v:
-    h = args.v
-  else:
-    h = sha1(args.u.encode('utf-8')).hexdigest()
-  name = '%s-%s' % (path.basename(args.o), h)
-  return path.join(CACHE_DIR, name)
+    if args.v:
+        h = args.v
+    else:
+        h = sha1(args.u.encode('utf-8')).hexdigest()
+    name = '%s-%s' % (path.basename(args.o), h)
+    return path.join(CACHE_DIR, name)
+
 
 opts = OptionParser()
 opts.add_option('-o', help='local output file')
@@ -85,89 +86,90 @@
 
 root_dir = args.o
 while root_dir and path.dirname(root_dir) != root_dir:
-  root_dir, n = path.split(root_dir)
-  if n == 'WORKSPACE':
-    break
+    root_dir, n = path.split(root_dir)
+    if n == 'WORKSPACE':
+        break
 
 redirects = download_properties(root_dir)
 cache_ent = cache_entry(args)
 src_url = resolve_url(args.u, redirects)
 
 if not path.exists(cache_ent):
-  try:
-    safe_mkdirs(path.dirname(cache_ent))
-  except OSError as err:
-    print('error creating directory %s: %s' %
-          (path.dirname(cache_ent), err), file=stderr)
-    exit(1)
+    try:
+        safe_mkdirs(path.dirname(cache_ent))
+    except OSError as err:
+        print('error creating directory %s: %s' %
+              (path.dirname(cache_ent), err), file=stderr)
+        exit(1)
 
-  print('Download %s' % src_url, file=stderr)
-  try:
-    check_call(['curl', '--proxy-anyauth', '-ksSfLo', cache_ent, src_url])
-  except OSError as err:
-    print('could not invoke curl: %s\nis curl installed?' % err, file=stderr)
-    exit(1)
-  except CalledProcessError as err:
-    print('error using curl: %s' % err, file=stderr)
-    exit(1)
+    print('Download %s' % src_url, file=stderr)
+    try:
+        check_call(['curl', '--proxy-anyauth', '-ksSfLo', cache_ent, src_url])
+    except OSError as err:
+        print('could not invoke curl: %s\nis curl installed?' % err,
+              file=stderr)
+        exit(1)
+    except CalledProcessError as err:
+        print('error using curl: %s' % err, file=stderr)
+        exit(1)
 
 if args.v:
-  have = hash_file(sha1(), cache_ent).hexdigest()
-  if args.v != have:
-    print((
-      '%s:\n' +
-      'expected %s\n' +
-      'received %s\n') % (src_url, args.v, have), file=stderr)
-    try:
-      remove(cache_ent)
-    except OSError as err:
-      if path.exists(cache_ent):
-        print('error removing %s: %s' % (cache_ent, err), file=stderr)
-    exit(1)
+    have = hash_file(sha1(), cache_ent).hexdigest()
+    if args.v != have:
+        print((
+            '%s:\n' +
+            'expected %s\n' +
+            'received %s\n') % (src_url, args.v, have), file=stderr)
+        try:
+            remove(cache_ent)
+        except OSError as err:
+            if path.exists(cache_ent):
+                print('error removing %s: %s' % (cache_ent, err), file=stderr)
+        exit(1)
 
 exclude = []
 if args.x:
-  exclude += args.x
+    exclude += args.x
 if args.exclude_java_sources:
-  try:
-    with ZipFile(cache_ent, 'r') as zf:
-      for n in zf.namelist():
-        if n.endswith('.java'):
-          exclude.append(n)
-  except (BadZipfile, LargeZipFile) as err:
-    print('error opening %s: %s' % (cache_ent, err), file=stderr)
-    exit(1)
+    try:
+        with ZipFile(cache_ent, 'r') as zf:
+            for n in zf.namelist():
+                if n.endswith('.java'):
+                    exclude.append(n)
+    except (BadZipfile, LargeZipFile) as err:
+        print('error opening %s: %s' % (cache_ent, err), file=stderr)
+        exit(1)
 
 if args.unsign:
-  try:
-    with ZipFile(cache_ent, 'r') as zf:
-      for n in zf.namelist():
-        if (n.endswith('.RSA')
-            or n.endswith('.SF')
-            or n.endswith('.LIST')):
-          exclude.append(n)
-  except (BadZipfile, LargeZipFile) as err:
-    print('error opening %s: %s' % (cache_ent, err), file=stderr)
-    exit(1)
+    try:
+        with ZipFile(cache_ent, 'r') as zf:
+            for n in zf.namelist():
+                if (n.endswith('.RSA')
+                   or n.endswith('.SF')
+                   or n.endswith('.LIST')):
+                    exclude.append(n)
+    except (BadZipfile, LargeZipFile) as err:
+        print('error opening %s: %s' % (cache_ent, err), file=stderr)
+        exit(1)
 
 safe_mkdirs(path.dirname(args.o))
 if exclude:
-  try:
-    shutil.copyfile(cache_ent, args.o)
-  except (shutil.Error, IOError) as err:
-    print('error copying to %s: %s' % (args.o, err), file=stderr)
-    exit(1)
-  try:
-    check_call(['zip', '-d', args.o] + exclude)
-  except CalledProcessError as err:
-    print('error removing files from zip: %s' % err, file=stderr)
-    exit(1)
-else:
-  try:
-    link(cache_ent, args.o)
-  except OSError as err:
     try:
-      shutil.copyfile(cache_ent, args.o)
+        shutil.copyfile(cache_ent, args.o)
     except (shutil.Error, IOError) as err:
-      print('error copying to %s: %s' % (args.o, err), file=stderr)
-      exit(1)
+        print('error copying to %s: %s' % (args.o, err), file=stderr)
+        exit(1)
+    try:
+        check_call(['zip', '-d', args.o] + exclude)
+    except CalledProcessError as err:
+        print('error removing files from zip: %s' % err, file=stderr)
+        exit(1)
+else:
+    try:
+        link(cache_ent, args.o)
+    except OSError as err:
+        try:
+            shutil.copyfile(cache_ent, args.o)
+        except (shutil.Error, IOError) as err:
+            print('error copying to %s: %s' % (args.o, err), file=stderr)
+            exit(1)
diff --git a/tools/eclipse/BUILD b/tools/eclipse/BUILD
index 356dfbb..5d27c47 100644
--- a/tools/eclipse/BUILD
+++ b/tools/eclipse/BUILD
@@ -8,25 +8,19 @@
 )
 
 TEST_DEPS = [
-    "//gerrit-elasticsearch:elasticsearch_test_utils",
-    "//gerrit-gpg:gpg_tests",
     "//gerrit-gwtui:ui_tests",
-    "//gerrit-httpd:httpd_tests",
-    "//gerrit-index:index_tests",
-    "//gerrit-patch-jgit:jgit_patch_tests",
-    "//gerrit-reviewdb:client_tests",
-    "//gerrit-server:server_tests",
+    "//javatests/com/google/gerrit/elasticsearch:elasticsearch_test_utils",
+    "//javatests/com/google/gerrit/server:server_tests",
 ]
 
 DEPS = [
-    "//gerrit-acceptance-tests:lib",
     "//gerrit-gwtdebug:gwtdebug",
     "//gerrit-gwtui:ui_module",
-    "//gerrit-main:main_lib",
     "//gerrit-plugin-gwtui:gwtui-api-lib",
-    "//gerrit-server:server",
-    "//lib/asciidoctor:asciidoc_lib",
-    "//lib/asciidoctor:doc_indexer_lib",
+    "//java/com/google/gerrit/acceptance:lib",
+    "//java/com/google/gerrit/server",
+    "//java/com/google/gerrit/asciidoctor:asciidoc_lib",
+    "//java/com/google/gerrit/asciidoctor:doc_indexer_lib",
     "//lib/auto:auto-value",
     "//lib/gwt:ant",
     "//lib/gwt:colt",
@@ -38,19 +32,18 @@
     "//lib/gwt:w3c-css-sac",
     "//lib/jetty:servlets",
     "//lib/prolog:compiler-lib",
-    # TODO(davido): I do not understand why it must be on the Eclipse classpath
-    #'//Documentation:index',
+    "//proto:reviewdb_java_proto",
 ]
 
 java_library(
     name = "classpath",
-    testonly = 1,
+    testonly = True,
     runtime_deps = LIBS + PGMLIBS + DEPS,
 )
 
 classpath_collector(
     name = "main_classpath_collect",
-    testonly = 1,
+    testonly = True,
     deps = LIBS + PGMLIBS + DEPS + TEST_DEPS +
            ["//plugins/%s:%s__plugin" % (n, n) for n in CORE_PLUGINS + CUSTOM_PLUGINS] +
            ["//plugins/%s:%s__plugin_test_deps" % (n, n) for n in CUSTOM_PLUGINS_TEST_DEPS],
diff --git a/tools/eclipse/gerrit_daemon.launch b/tools/eclipse/gerrit_daemon.launch
index 9495884..d00f7bf 100644
--- a/tools/eclipse/gerrit_daemon.launch
+++ b/tools/eclipse/gerrit_daemon.launch
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
 <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/gerrit/gerrit-main/src/main/java/Main.java"/>
+<listEntry value="/gerrit/java/Main.java"/>
 </listAttribute>
 <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
 <listEntry value="1"/>
diff --git a/tools/eclipse/gerrit_gwt_debug.launch b/tools/eclipse/gerrit_gwt_debug.launch
index 9f2bf2b..593837a 100644
--- a/tools/eclipse/gerrit_gwt_debug.launch
+++ b/tools/eclipse/gerrit_gwt_debug.launch
@@ -16,7 +16,7 @@
 </listAttribute>
 <booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
 <stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gerrit.gwtdebug.GerritGwtDebugLauncher"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-strict -noprecompile -src ${resource_loc:/gerrit} -workDir ${resource_loc:/gerrit}/.gwt_work_dir com.google.gerrit.GerritGwtUI -src ${resource_loc:/gerrit}/gerrit-plugin-gwtui/src/main/java -- --console-log --show-stack-trace -d ${resource_loc:/gerrit}/../gerrit_testsite"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-strict -noprecompile -src ${resource_loc:/gerrit}/java -workDir ${resource_loc:/gerrit}/.gwt_work_dir com.google.gerrit.GerritGwtUI -src ${resource_loc:/gerrit}/gerrit-plugin-gwtui/src/main/java -- --console-log --show-stack-trace -d ${resource_loc:/gerrit}/../gerrit_testsite"/>
 <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="gerrit"/>
 <stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx1024M&#10;-XX:MaxPermSize=256M&#10;-Dgerrit.disable-gwtui-recompile=true"/>
 </launchConfiguration>
diff --git a/tools/eclipse/project.py b/tools/eclipse/project.py
index c9f382b..ce4baf9 100755
--- a/tools/eclipse/project.py
+++ b/tools/eclipse/project.py
@@ -13,7 +13,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-# TODO(sop): Remove hack after Buck supports Eclipse
 
 from __future__ import print_function
 # TODO(davido): use Google style for importing instead:
@@ -31,52 +30,83 @@
 GWT = '//gerrit-gwtui:ui_module'
 AUTO = '//lib/auto:auto-value'
 JRE = '/'.join([
-  'org.eclipse.jdt.launching.JRE_CONTAINER',
-  'org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType',
-  'JavaSE-1.8',
+    'org.eclipse.jdt.launching.JRE_CONTAINER',
+    'org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType',
+    'JavaSE-1.8',
 ])
 # Map of targets to corresponding classpath collector rules
 cp_targets = {
-  AUTO: '//tools/eclipse:autovalue_classpath_collect',
-  GWT: '//tools/eclipse:gwt_classpath_collect',
-  MAIN: '//tools/eclipse:main_classpath_collect',
+    AUTO: '//tools/eclipse:autovalue_classpath_collect',
+    GWT: '//tools/eclipse:gwt_classpath_collect',
+    MAIN: '//tools/eclipse:main_classpath_collect',
 }
 
 ROOT = path.abspath(__file__)
 while not path.exists(path.join(ROOT, 'WORKSPACE')):
-  ROOT = path.dirname(ROOT)
+    ROOT = path.dirname(ROOT)
 
 opts = OptionParser()
 opts.add_option('--plugins', help='create eclipse projects for plugins',
                 action='store_true')
 opts.add_option('--name', help='name of the generated project',
                 action='store', default='gerrit', dest='project_name')
+opts.add_option('-b', '--batch', action='store_true',
+                dest='batch', help='Bazel batch option')
+opts.add_option('-j', '--java', action='store',
+                dest='java', help='Post Java 8 support (9)')
+opts.add_option('-e', '--edge_java', action='store',
+                dest='edge_java', help='Post Java 9 support (10|11|...)')
 args, _ = opts.parse_args()
 
-def retrieve_ext_location():
-  return check_output(['bazel', 'info', 'output_base']).strip()
+batch_option = '--batch' if args.batch else None
+custom_java = args.java
+edge_java = args.edge_java
 
-def gen_bazel_path():
-  bazel = check_output(['which', 'bazel']).strip().decode('UTF-8')
-  with open(path.join(ROOT, ".bazel_path"), 'w') as fd:
-    fd.write("bazel=%s\n" % bazel)
-    fd.write("PATH=%s\n" % environ["PATH"])
+def _build_bazel_cmd(*args):
+    build = False
+    cmd = ['bazel']
+    if batch_option:
+        cmd.append('--batch')
+    for arg in args:
+        if arg == "build":
+            build = True
+        cmd.append(arg)
+    if custom_java and not edge_java:
+        cmd.append('--host_java_toolchain=@bazel_tools//tools/jdk:toolchain_java%s' % custom_java)
+        cmd.append('--java_toolchain=@bazel_tools//tools/jdk:toolchain_java%s' % custom_java)
+        if edge_java and build:
+            cmd.append(edge_java)
+    return cmd
+
+
+def retrieve_ext_location():
+    return check_output(_build_bazel_cmd('info', 'output_base')).strip()
+
+
+def gen_bazel_path(ext_location):
+    bazel = check_output(['which', 'bazel']).strip().decode('UTF-8')
+    with open(path.join(ROOT, ".bazel_path"), 'w') as fd:
+        fd.write("output_base=%s\n" % ext_location)
+        fd.write("bazel=%s\n" % bazel)
+        fd.write("PATH=%s\n" % environ["PATH"])
+
 
 def _query_classpath(target):
-  deps = []
-  t = cp_targets[target]
-  try:
-    check_call(['bazel', 'build', t])
-  except CalledProcessError:
-    exit(1)
-  name = 'bazel-bin/tools/eclipse/' + t.split(':')[1] + '.runtime_classpath'
-  deps = [line.rstrip('\n') for line in open(name)]
-  return deps
+    deps = []
+    t = cp_targets[target]
+    try:
+        check_call(_build_bazel_cmd('build', t))
+    except CalledProcessError:
+        exit(1)
+    name = 'bazel-bin/tools/eclipse/' + t.split(':')[1] + '.runtime_classpath'
+    deps = [line.rstrip('\n') for line in open(name)]
+    return deps
+
 
 def gen_project(name='gerrit', root=ROOT):
-  p = path.join(root, '.project')
-  with open(p, 'w') as fd:
-    print("""\
+    p = path.join(root, '.project')
+    with open(p, 'w') as fd:
+        print("""\
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
   <name>%(name)s</name>
@@ -91,16 +121,19 @@
 </projectDescription>\
     """ % {"name": name}, file=fd)
 
+
 def gen_plugin_classpath(root):
-  p = path.join(root, '.classpath')
-  with open(p, 'w') as fd:
-    if path.exists(path.join(root, 'src', 'test', 'java')):
-      testpath = """
+    p = path.join(root, '.classpath')
+    with open(p, 'w') as fd:
+        if path.exists(path.join(root, 'src', 'test', 'java')):
+            testpath = """
   <classpathentry excluding="**/BUILD" kind="src" path="src/test/java"\
- out="eclipse-out/test"/>"""
-    else:
-      testpath = ""
-    print("""\
+ out="eclipse-out/test">
+    <attributes><attribute name="test" value="true"/></attributes>
+  </classpathentry>"""
+        else:
+            testpath = ""
+        print("""\
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
   <classpathentry excluding="**/BUILD" kind="src" path="src/main/java"/>%(testpath)s
@@ -109,174 +142,200 @@
   <classpathentry kind="output" path="eclipse-out/classes"/>
 </classpath>""" % {"testpath": testpath}, file=fd)
 
+
 def gen_classpath(ext):
-  def make_classpath():
-    impl = minidom.getDOMImplementation()
-    return impl.createDocument(None, 'classpath', None)
+    def make_classpath():
+        impl = minidom.getDOMImplementation()
+        return impl.createDocument(None, 'classpath', None)
 
-  def classpathentry(kind, path, src=None, out=None, exported=None):
-    e = doc.createElement('classpathentry')
-    e.setAttribute('kind', kind)
-    # TODO(davido): Remove this and other exclude BUILD files hack
-    # when this Bazel bug is fixed:
-    # https://github.com/bazelbuild/bazel/issues/1083
-    if kind == 'src':
-      e.setAttribute('excluding', '**/BUILD')
-    e.setAttribute('path', path)
-    if src:
-      e.setAttribute('sourcepath', src)
-    if out:
-      e.setAttribute('output', out)
-    if exported:
-      e.setAttribute('exported', 'true')
-    doc.documentElement.appendChild(e)
+    def classpathentry(kind, path, src=None, out=None, exported=None):
+        e = doc.createElement('classpathentry')
+        e.setAttribute('kind', kind)
+        # TODO(davido): Remove this and other exclude BUILD files hack
+        # when this Bazel bug is fixed:
+        # https://github.com/bazelbuild/bazel/issues/1083
+        if kind == 'src':
+            e.setAttribute('excluding', '**/BUILD')
+        e.setAttribute('path', path)
+        if src:
+            e.setAttribute('sourcepath', src)
+        if out:
+            e.setAttribute('output', out)
+        if exported:
+            e.setAttribute('exported', 'true')
+        if out and "test" in out:
+            atts = doc.createElement('attributes')
+            testAtt = doc.createElement('attribute')
+            testAtt.setAttribute('name', 'test')
+            testAtt.setAttribute('value', 'true')
+            atts.appendChild(testAtt)
+            e.appendChild(atts)
+        doc.documentElement.appendChild(e)
 
-  doc = make_classpath()
-  src = set()
-  lib = set()
-  gwt_src = set()
-  gwt_lib = set()
-  plugins = set()
+    doc = make_classpath()
+    src = set()
+    lib = set()
+    proto = set()
+    gwt_src = set()
+    gwt_lib = set()
+    plugins = set()
 
-  # Classpath entries are absolute for cross-cell support
-  java_library = re.compile('bazel-out/.*?-fastbuild/bin/(.*)/[^/]+[.]jar$')
-  srcs = re.compile('(.*/external/[^/]+)/jar/(.*)[.]jar')
-  for p in _query_classpath(MAIN):
-    if p.endswith('-src.jar'):
-      # gwt_module() depends on -src.jar for Java to JavaScript compiles.
-      if p.startswith("external"):
-        p = path.join(ext, p)
-      gwt_lib.add(p)
-      continue
-
-    m = java_library.match(p)
-    if m:
-      src.add(m.group(1))
-      # Exceptions: both source and lib
-      if p.endswith('libquery_parser.jar') or \
-         p.endswith('libprolog-common.jar'):
-        lib.add(p)
-      # JGit dependency from external repository
-      if 'gerrit-' not in p and 'jgit' in p:
-        lib.add(p)
-    else:
-      # Don't mess up with Bazel internal test runner dependencies.
-      # When we use Eclipse we rely on it for running the tests
-      if p.endswith("external/bazel_tools/tools/jdk/TestRunner_deploy.jar"):
-        continue
-      if p.startswith("external"):
-        p = path.join(ext, p)
-      lib.add(p)
-
-  for p in _query_classpath(GWT):
-    m = java_library.match(p)
-    if m:
-      gwt_src.add(m.group(1))
-
-  for s in sorted(src):
-    out = None
-
-    if s.startswith('lib/'):
-      out = 'eclipse-out/lib'
-    elif s.startswith('plugins/'):
-      if args.plugins:
-        plugins.add(s)
-        continue
-      out = 'eclipse-out/' + s
-
-    p = path.join(s, 'java')
-    if path.exists(p):
-      classpathentry('src', p, out=out)
-      continue
-
-    for env in ['main', 'test']:
-      o = None
-      if out:
-        o = out + '/' + env
-      elif env == 'test':
-        o = 'eclipse-out/test'
-
-      for srctype in ['java', 'resources']:
-        p = path.join(s, 'src', env, srctype)
-        if path.exists(p):
-          classpathentry('src', p, out=o)
-
-  for libs in [lib, gwt_lib]:
-    for j in sorted(libs):
-      s = None
-      m = srcs.match(j)
-      if m:
-        prefix = m.group(1)
-        suffix = m.group(2)
-        p = path.join(prefix, "jar", "%s-src.jar" % suffix)
-        if path.exists(p):
-          s = p
-      if args.plugins:
-        classpathentry('lib', j, s, exported=True)
-      else:
-        # Filter out the source JARs that we pull through transitive closure of
-        # GWT plugin API (we add source directories themself).  Exception is
-        # libEdit-src.jar, that is needed for GWT SDM to work.
-        m = java_library.match(j)
-        if m:
-          if m.group(1).startswith("gerrit-") and \
-              j.endswith("-src.jar") and \
-              not j.endswith("libEdit-src.jar"):
+    # Classpath entries are absolute for cross-cell support
+    java_library = re.compile('bazel-out/.*?-fastbuild/bin/(.*)/[^/]+[.]jar$')
+    srcs = re.compile('(.*/external/[^/]+)/jar/(.*)[.]jar')
+    for p in _query_classpath(MAIN):
+        if p.endswith('-src.jar'):
+            # gwt_module() depends on -src.jar for Java to JavaScript compiles.
+            if p.startswith("external"):
+                p = path.join(ext, p)
+            gwt_lib.add(p)
             continue
-        classpathentry('lib', j, s)
 
-  for s in sorted(gwt_src):
-    p = path.join(ROOT, s, 'src', 'main', 'java')
-    if path.exists(p):
-      classpathentry('lib', p, out='eclipse-out/gwtsrc')
+        m = java_library.match(p)
+        if m:
+            src.add(m.group(1))
+            # Exceptions: both source and lib
+            if p.endswith('libquery_parser.jar') or \
+               p.endswith('libgerrit-prolog-common.jar'):
+                lib.add(p)
+            # JGit dependency from external repository
+            if 'gerrit-' not in p and 'jgit' in p:
+                lib.add(p)
+            # Assume any jars in /proto/ are from java_proto_library rules
+            if '/bin/proto/' in p:
+                proto.add(p)
+        else:
+            # Don't mess up with Bazel internal test runner dependencies.
+            # When we use Eclipse we rely on it for running the tests
+            if p.endswith(
+               "external/bazel_tools/tools/jdk/TestRunner_deploy.jar"):
+                continue
+            if p.startswith("external"):
+                p = path.join(ext, p)
+            lib.add(p)
 
-  classpathentry('con', JRE)
-  classpathentry('output', 'eclipse-out/classes')
+    for p in _query_classpath(GWT):
+        m = java_library.match(p)
+        if m:
+            gwt_src.add(m.group(1))
 
-  p = path.join(ROOT, '.classpath')
-  with open(p, 'w') as fd:
-    doc.writexml(fd, addindent='\t', newl='\n', encoding='UTF-8')
+    classpathentry('src', 'java')
+    classpathentry('src', 'javatests', out='eclipse-out/test')
+    classpathentry('src', 'resources')
+    for s in sorted(src):
+        out = None
 
-  if args.plugins:
-    for plugin in plugins:
-      plugindir = path.join(ROOT, plugin)
-      try:
-        gen_project(plugin.replace('plugins/', ""), plugindir)
-        gen_plugin_classpath(plugindir)
-      except (IOError, OSError) as err:
-        print('error generating project for %s: %s' % (plugin, err),
-              file=sys.stderr)
+        if s.startswith('lib/'):
+            out = 'eclipse-out/lib'
+        elif s.startswith('plugins/'):
+            if args.plugins:
+                plugins.add(s)
+                continue
+            out = 'eclipse-out/' + s
+
+        p = path.join(s, 'java')
+        if path.exists(p):
+            classpathentry('src', p, out=out)
+            continue
+
+        for env in ['main', 'test']:
+            o = None
+            if out:
+                o = out + '/' + env
+            elif env == 'test':
+                o = 'eclipse-out/test'
+
+            for srctype in ['java', 'resources']:
+                p = path.join(s, 'src', env, srctype)
+                if path.exists(p):
+                    classpathentry('src', p, out=o)
+
+    for libs in [lib, gwt_lib]:
+        for j in sorted(libs):
+            s = None
+            m = srcs.match(j)
+            if m:
+                prefix = m.group(1)
+                suffix = m.group(2)
+                p = path.join(prefix, "jar", "%s-src.jar" % suffix)
+                if path.exists(p):
+                    s = p
+            if args.plugins:
+                classpathentry('lib', j, s, exported=True)
+            else:
+                # Filter out the source JARs that we pull through transitive
+                # closure of GWT plugin API (we add source directories
+                # themselves).  Exception is libEdit-src.jar, that is needed
+                # for GWT SDM to work.
+                m = java_library.match(j)
+                if m:
+                    if m.group(1).startswith("gerrit-") and \
+                       j.endswith("-src.jar") and \
+                       not j.endswith("libEdit-src.jar"):
+                        continue
+                classpathentry('lib', j, s)
+
+    for p in sorted(proto):
+        s = p.replace('-fastbuild/bin/proto/lib', '-fastbuild/genfiles/proto/')
+        s = s.replace('.jar', '-src.jar')
+        classpathentry('lib', p, s)
+
+    for s in sorted(gwt_src):
+        p = path.join(ROOT, s, 'src', 'main', 'java')
+        if path.exists(p):
+            classpathentry('lib', p, out='eclipse-out/gwtsrc')
+
+    classpathentry('con', JRE)
+    classpathentry('output', 'eclipse-out/classes')
+
+    p = path.join(ROOT, '.classpath')
+    with open(p, 'w') as fd:
+        doc.writexml(fd, addindent='\t', newl='\n', encoding='UTF-8')
+
+    if args.plugins:
+        for plugin in plugins:
+            plugindir = path.join(ROOT, plugin)
+            try:
+                gen_project(plugin.replace('plugins/', ""), plugindir)
+                gen_plugin_classpath(plugindir)
+            except (IOError, OSError) as err:
+                print('error generating project for %s: %s' % (plugin, err),
+                      file=sys.stderr)
+
 
 def gen_factorypath(ext):
-  doc = minidom.getDOMImplementation().createDocument(None, 'factorypath', None)
-  for jar in _query_classpath(AUTO):
-    e = doc.createElement('factorypathentry')
-    e.setAttribute('kind', 'EXTJAR')
-    e.setAttribute('id', path.join(ext, jar))
-    e.setAttribute('enabled', 'true')
-    e.setAttribute('runInBatchMode', 'false')
-    doc.documentElement.appendChild(e)
+    doc = minidom.getDOMImplementation().createDocument(None, 'factorypath',
+                                                        None)
+    for jar in _query_classpath(AUTO):
+        e = doc.createElement('factorypathentry')
+        e.setAttribute('kind', 'EXTJAR')
+        e.setAttribute('id', path.join(ext, jar))
+        e.setAttribute('enabled', 'true')
+        e.setAttribute('runInBatchMode', 'false')
+        doc.documentElement.appendChild(e)
 
-  p = path.join(ROOT, '.factorypath')
-  with open(p, 'w') as fd:
-    doc.writexml(fd, addindent='\t', newl='\n', encoding='UTF-8')
+    p = path.join(ROOT, '.factorypath')
+    with open(p, 'w') as fd:
+        doc.writexml(fd, addindent='\t', newl='\n', encoding='UTF-8')
+
 
 try:
-  ext_location = retrieve_ext_location().decode("utf-8")
-  gen_project(args.project_name)
-  gen_classpath(ext_location)
-  gen_factorypath(ext_location)
-  gen_bazel_path()
+    ext_location = retrieve_ext_location().decode("utf-8")
+    gen_project(args.project_name)
+    gen_classpath(ext_location)
+    gen_factorypath(ext_location)
+    gen_bazel_path(ext_location)
 
-  # TODO(davido): Remove this when GWT gone
-  gwt_working_dir = ".gwt_work_dir"
-  if not path.isdir(gwt_working_dir):
-    makedirs(path.join(ROOT, gwt_working_dir))
+    # TODO(davido): Remove this when GWT gone
+    gwt_working_dir = ".gwt_work_dir"
+    if not path.isdir(gwt_working_dir):
+        makedirs(path.join(ROOT, gwt_working_dir))
 
-  try:
-    check_call(['bazel', 'build', MAIN, GWT, '//gerrit-patch-jgit:libEdit-src.jar'])
-  except CalledProcessError:
-    exit(1)
+    try:
+        check_call(_build_bazel_cmd('build', MAIN, GWT,
+                                    '//java/org/eclipse/jgit:libEdit-src.jar'))
+    except CalledProcessError:
+        exit(1)
 except KeyboardInterrupt:
-  print('Interrupted by user', file=sys.stderr)
-  exit(1)
+    print('Interrupted by user', file=sys.stderr)
+    exit(1)
diff --git a/tools/js/bower2bazel.py b/tools/js/bower2bazel.py
index 21dea94..7b24524 100755
--- a/tools/js/bower2bazel.py
+++ b/tools/js/bower2bazel.py
@@ -13,9 +13,11 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-"""Suggested call sequence:
+"""
+Suggested call sequence:
 
-python tools/js/bower2bazel.py -w lib/js/bower_archives.bzl -b lib/js/bower_components.bzl
+python tools/js/bower2bazel.py -w lib/js/bower_archives.bzl \
+  -b lib/js/bower_components.bzl
 """
 
 from __future__ import print_function
@@ -31,135 +33,147 @@
 import glob
 import bowerutil
 
-# list of licenses for packages that don't specify one in their bower.json file.
+# list of licenses for packages that don't specify one in their bower.json file
 package_licenses = {
-  "es6-promise": "es6-promise",
-  "fetch": "fetch",
-  "font-roboto": "polymer",
-  "iron-a11y-announcer": "polymer",
-  "iron-a11y-keys-behavior": "polymer",
-  "iron-autogrow-textarea": "polymer",
-  "iron-behaviors": "polymer",
-  "iron-dropdown": "polymer",
-  "iron-fit-behavior": "polymer",
-  "iron-flex-layout": "polymer",
-  "iron-form-element-behavior": "polymer",
-  "iron-icon": "polymer",
-  "iron-iconset-svg": "polymer",
-  "iron-input": "polymer",
-  "iron-menu-behavior": "polymer",
-  "iron-meta": "polymer",
-  "iron-overlay-behavior": "polymer",
-  "iron-resizable-behavior": "polymer",
-  "iron-selector": "polymer",
-  "iron-validatable-behavior": "polymer",
-  "moment": "moment",
-  "neon-animation": "polymer",
-  "page": "page.js",
-  "paper-button": "polymer",
-  "paper-input": "polymer",
-  "paper-item": "polymer",
-  "paper-listbox": "polymer",
-  "paper-styles": "polymer",
-  "polymer": "polymer",
-  "polymer-resin": "polymer",
-  "promise-polyfill": "promise-polyfill",
-  "web-animations-js": "Apache2.0",
-  "webcomponentsjs": "polymer",
-  "paper-material": "polymer",
-  "paper-styles": "polymer",
-  "paper-behaviors": "polymer",
-  "paper-ripple": "polymer",
-  "iron-checked-element-behavior": "polymer",
-  "font-roboto": "polymer",
+    "codemirror-minified": "codemirror-minified",
+    "es6-promise": "es6-promise",
+    "fetch": "fetch",
+    "font-roboto": "polymer",
+    "iron-a11y-announcer": "polymer",
+    "iron-a11y-keys-behavior": "polymer",
+    "iron-autogrow-textarea": "polymer",
+    "iron-behaviors": "polymer",
+    "iron-dropdown": "polymer",
+    "iron-fit-behavior": "polymer",
+    "iron-flex-layout": "polymer",
+    "iron-form-element-behavior": "polymer",
+    "iron-icon": "polymer",
+    "iron-iconset-svg": "polymer",
+    "iron-input": "polymer",
+    "iron-menu-behavior": "polymer",
+    "iron-meta": "polymer",
+    "iron-overlay-behavior": "polymer",
+    "iron-resizable-behavior": "polymer",
+    "iron-selector": "polymer",
+    "iron-validatable-behavior": "polymer",
+    "moment": "moment",
+    "neon-animation": "polymer",
+    "page": "page.js",
+    "paper-button": "polymer",
+    "paper-icon-button": "polymer",
+    "paper-input": "polymer",
+    "paper-item": "polymer",
+    "paper-listbox": "polymer",
+    "paper-toggle-button": "polymer",
+    "paper-styles": "polymer",
+    "paper-tabs": "polymer",
+    "polymer": "polymer",
+    "polymer-resin": "polymer",
+    "promise-polyfill": "promise-polyfill",
+    "web-animations-js": "Apache2.0",
+    "webcomponentsjs": "polymer",
+    "paper-material": "polymer",
+    "paper-styles": "polymer",
+    "paper-behaviors": "polymer",
+    "paper-ripple": "polymer",
+    "iron-checked-element-behavior": "polymer",
+    "font-roboto": "polymer",
 }
 
 
 def build_bower_json(version_targets, seeds):
-  """Generate bower JSON file, return its path.
+    """Generate bower JSON file, return its path.
 
-  Args:
-    version_targets: bazel target names of the versions.json file.
-    seeds: an iterable of bower package names of the seed packages, ie.
-      the packages whose versions we control manually.
-  """
-  bower_json = collections.OrderedDict()
-  bower_json['name'] = 'bower2bazel-output'
-  bower_json['version'] = '0.0.0'
-  bower_json['description'] = 'Auto-generated bower.json for dependency management'
-  bower_json['private'] = True
-  bower_json['dependencies'] = {}
+    Args:
+      version_targets: bazel target names of the versions.json file.
+      seeds: an iterable of bower package names of the seed packages, ie.
+        the packages whose versions we control manually.
+    """
+    bower_json = collections.OrderedDict()
+    bower_json['name'] = 'bower2bazel-output'
+    bower_json['version'] = '0.0.0'
+    bower_json['description'] = 'Auto-generated bower.json for dependency ' + \
+                                'management'
+    bower_json['private'] = True
+    bower_json['dependencies'] = {}
 
-  seeds = set(seeds)
-  for v in version_targets:
-    path = os.path.join("bazel-out/*-fastbuild/bin", v.lstrip("/").replace(":", "/"))
-    fs = glob.glob(path)
-    assert len(fs) == 1, '%s: file not found or multiple files found: %s' % (path, fs)
-    with open(fs[0]) as f:
-      j = json.load(f)
-      if "" in j:
-        # drop dummy entries.
-        del j[""]
+    seeds = set(seeds)
+    for v in version_targets:
+        path = os.path.join("bazel-out/*-fastbuild/bin",
+                            v.lstrip("/").replace(":", "/"))
+        fs = glob.glob(path)
+        err_msg = '%s: file not found or multiple files found: %s' % (path, fs)
+        assert len(fs) == 1, err_msg
+        with open(fs[0]) as f:
+            j = json.load(f)
+            if "" in j:
+                # drop dummy entries.
+                del j[""]
 
-      trimmed = {}
-      for k, v in j.items():
-        if k in seeds:
-          trimmed[k] = v
+            trimmed = {}
+            for k, v in j.items():
+                if k in seeds:
+                    trimmed[k] = v
 
-      bower_json['dependencies'].update(trimmed)
+            bower_json['dependencies'].update(trimmed)
 
-  tmpdir = tempfile.mkdtemp()
-  ret = os.path.join(tmpdir, 'bower.json')
-  with open(ret, 'w') as f:
-    json.dump(bower_json, f, indent=2)
-  return ret
+    tmpdir = tempfile.mkdtemp()
+    ret = os.path.join(tmpdir, 'bower.json')
+    with open(ret, 'w') as f:
+        json.dump(bower_json, f, indent=2)
+    return ret
+
 
 def decode(input):
-  try:
-    return input.decode("utf-8")
-  except TypeError:
-    return input
+    try:
+        return input.decode("utf-8")
+    except TypeError:
+        return input
+
 
 def bower_command(args):
-  base = subprocess.check_output(["bazel", "info", "output_base"]).strip()
-  exp = os.path.join(decode(base), "external", "bower", "*npm_binary.tgz")
-  fs = sorted(glob.glob(exp))
-  assert len(fs) == 1, "bower tarball not found or have multiple versions %s" % fs
-  return ["python", os.getcwd() + "/tools/js/run_npm_binary.py", sorted(fs)[0]] + args
+    base = subprocess.check_output(["bazel", "info", "output_base"]).strip()
+    exp = os.path.join(decode(base), "external", "bower", "*npm_binary.tgz")
+    fs = sorted(glob.glob(exp))
+    err_msg = "bower tarball not found or have multiple versions %s" % fs
+    assert len(fs) == 1, err_msg
+    return ["python",
+            os.getcwd() + "/tools/js/run_npm_binary.py", sorted(fs)[0]] + args
 
 
 def main(args):
-  opts = optparse.OptionParser()
-  opts.add_option('-w', help='.bzl output for WORKSPACE')
-  opts.add_option('-b', help='.bzl output for //lib:BUILD')
-  opts, args = opts.parse_args()
+    opts = optparse.OptionParser()
+    opts.add_option('-w', help='.bzl output for WORKSPACE')
+    opts.add_option('-b', help='.bzl output for //lib:BUILD')
+    opts, args = opts.parse_args()
 
-  target_str = subprocess.check_output([
-    "bazel", "query", "kind(bower_component_bundle, //polygerrit-ui/...)"])
-  seed_str = subprocess.check_output([
-    "bazel", "query", "attr(seed, 1, kind(bower_component, deps(//polygerrit-ui/...)))"])
-  targets = [s for s in decode(target_str).split('\n') if s]
-  seeds = [s for s in decode(seed_str).split('\n') if s]
-  prefix = "//lib/js:"
-  non_seeds = [s for s in seeds if not s.startswith(prefix)]
-  assert not non_seeds, non_seeds
-  seeds = set([s[len(prefix):] for s in seeds])
+    target_str = subprocess.check_output([
+        "bazel", "query", "kind(bower_component_bundle, //polygerrit-ui/...)"])
+    seed_str = subprocess.check_output(
+        ["bazel", "query",
+         "attr(seed, 1, kind(bower_component, deps(//polygerrit-ui/...)))"])
+    targets = [s for s in decode(target_str).split('\n') if s]
+    seeds = [s for s in decode(seed_str).split('\n') if s]
+    prefix = "//lib/js:"
+    non_seeds = [s for s in seeds if not s.startswith(prefix)]
+    assert not non_seeds, non_seeds
+    seeds = set([s[len(prefix):] for s in seeds])
 
-  version_targets = [t + "-versions.json" for t in targets]
-  subprocess.check_call(['bazel', 'build'] + version_targets)
-  bower_json_path = build_bower_json(version_targets, seeds)
-  dir = os.path.dirname(bower_json_path)
-  cmd = bower_command(["install"])
+    version_targets = [t + "-versions.json" for t in targets]
+    subprocess.check_call(['bazel', 'build'] + version_targets)
+    bower_json_path = build_bower_json(version_targets, seeds)
+    dir = os.path.dirname(bower_json_path)
+    cmd = bower_command(["install"])
 
-  build_out = sys.stdout
-  if opts.b:
-    build_out = open(opts.b + ".tmp", 'w')
+    build_out = sys.stdout
+    if opts.b:
+        build_out = open(opts.b + ".tmp", 'w')
 
-  ws_out = sys.stdout
-  if opts.b:
-    ws_out = open(opts.w + ".tmp", 'w')
+    ws_out = sys.stdout
+    if opts.b:
+        ws_out = open(opts.w + ".tmp", 'w')
 
-  header = """# DO NOT EDIT
+    header = """# DO NOT EDIT
 # generated with the following command:
 #
 #   %s
@@ -167,30 +181,30 @@
 
 """ % ' '.join(sys.argv)
 
-  ws_out.write(header)
-  build_out.write(header)
+    ws_out.write(header)
+    build_out.write(header)
 
-  oldwd = os.getcwd()
-  os.chdir(dir)
-  subprocess.check_call(cmd)
+    oldwd = os.getcwd()
+    os.chdir(dir)
+    subprocess.check_call(cmd)
 
-  interpret_bower_json(seeds, ws_out, build_out)
-  ws_out.close()
-  build_out.close()
+    interpret_bower_json(seeds, ws_out, build_out)
+    ws_out.close()
+    build_out.close()
 
-  os.chdir(oldwd)
-  os.rename(opts.w + ".tmp", opts.w)
-  os.rename(opts.b + ".tmp", opts.b)
+    os.chdir(oldwd)
+    os.rename(opts.w + ".tmp", opts.w)
+    os.rename(opts.b + ".tmp", opts.b)
 
 
 def dump_workspace(data, seeds, out):
-  out.write('load("//tools/bzl:js.bzl", "bower_archive")\n\n')
-  out.write('def load_bower_archives():\n')
+    out.write('load("//tools/bzl:js.bzl", "bower_archive")\n\n')
+    out.write('def load_bower_archives():\n')
 
-  for d in data:
-    if d["name"] in seeds:
-      continue
-    out.write("""  bower_archive(
+    for d in data:
+        if d["name"] in seeds:
+            continue
+        out.write("""  bower_archive(
     name = "%(name)s",
     package = "%(normalized-name)s",
     version = "%(version)s",
@@ -199,48 +213,49 @@
 
 
 def dump_build(data, seeds, out):
-  out.write('load("//tools/bzl:js.bzl", "bower_component")\n\n')
-  out.write('def define_bower_components():\n')
-  for d in data:
-    out.write("  bower_component(\n")
-    out.write("    name = \"%s\",\n" % d["name"])
-    out.write("    license = \"//lib:LICENSE-%s\",\n" % d["bazel-license"])
-    deps = sorted(d.get("dependencies", {}).keys())
-    if deps:
-      if len(deps) == 1:
-        out.write("    deps = [ \":%s\" ],\n" % deps[0])
-      else:
-        out.write("    deps = [\n")
-        for dep in deps:
-          out.write("      \":%s\",\n" % dep)
-        out.write("    ],\n")
-    if d["name"] in seeds:
-      out.write("    seed = True,\n")
-    out.write("  )\n")
-  # done
+    out.write('load("//tools/bzl:js.bzl", "bower_component")\n\n')
+    out.write('def define_bower_components():\n')
+    for d in data:
+        out.write("  bower_component(\n")
+        out.write("    name = \"%s\",\n" % d["name"])
+        out.write("    license = \"//lib:LICENSE-%s\",\n" % d["bazel-license"])
+        deps = sorted(d.get("dependencies", {}).keys())
+        if deps:
+            if len(deps) == 1:
+                out.write("    deps = [ \":%s\" ],\n" % deps[0])
+            else:
+                out.write("    deps = [\n")
+                for dep in deps:
+                    out.write("      \":%s\",\n" % dep)
+                out.write("    ],\n")
+        if d["name"] in seeds:
+            out.write("    seed = True,\n")
+        out.write("  )\n")
+    # done
 
 
 def interpret_bower_json(seeds, ws_out, build_out):
-  out = subprocess.check_output(["find", "bower_components/", "-name", ".bower.json"])
+    out = subprocess.check_output(["find", "bower_components/", "-name",
+                                   ".bower.json"])
 
-  data = []
-  for f in sorted(decode(out).split('\n')):
-    if not f:
-      continue
-    pkg = json.load(open(f))
-    pkg_name = pkg["name"]
+    data = []
+    for f in sorted(decode(out).split('\n')):
+        if not f:
+            continue
+        pkg = json.load(open(f))
+        pkg_name = pkg["name"]
 
-    pkg["bazel-sha1"] = bowerutil.hash_bower_component(
-      hashlib.sha1(), os.path.dirname(f)).hexdigest()
-    license = package_licenses.get(pkg_name, "DO_NOT_DISTRIBUTE")
+        pkg["bazel-sha1"] = bowerutil.hash_bower_component(
+            hashlib.sha1(), os.path.dirname(f)).hexdigest()
+        license = package_licenses.get(pkg_name, "DO_NOT_DISTRIBUTE")
 
-    pkg["bazel-license"] = license
-    pkg["normalized-name"] = pkg["_originalSource"]
-    data.append(pkg)
+        pkg["bazel-license"] = license
+        pkg["normalized-name"] = pkg["_originalSource"]
+        data.append(pkg)
 
-  dump_workspace(data, seeds, ws_out)
-  dump_build(data, seeds, build_out)
+    dump_workspace(data, seeds, ws_out)
+    dump_build(data, seeds, build_out)
 
 
 if __name__ == '__main__':
-  main(sys.argv[1:])
+    main(sys.argv[1:])
diff --git a/tools/js/bowerutil.py b/tools/js/bowerutil.py
index c2e11cd..9fb82af 100644
--- a/tools/js/bowerutil.py
+++ b/tools/js/bowerutil.py
@@ -16,31 +16,31 @@
 
 
 def hash_bower_component(hash_obj, path):
-  """Hash the contents of a bower component directory.
+    """Hash the contents of a bower component directory.
 
-  This is a stable hash of a directory downloaded with `bower install`, minus
-  the .bower.json file, which is autogenerated each time by bower. Used in lieu
-  of hashing a zipfile of the contents, since zipfiles are difficult to hash in
-  a stable manner.
+    This is a stable hash of a directory downloaded with `bower install`, minus
+    the .bower.json file, which is autogenerated each time by bower. Used in
+    lieu of hashing a zipfile of the contents, since zipfiles are difficult to
+    hash in a stable manner.
 
-  Args:
-    hash_obj: an open hash object, e.g. hashlib.sha1().
-    path: path to the directory to hash.
+    Args:
+      hash_obj: an open hash object, e.g. hashlib.sha1().
+      path: path to the directory to hash.
 
-  Returns:
-    The passed-in hash_obj.
-  """
-  if not os.path.isdir(path):
-    raise ValueError('Not a directory: %s' % path)
+    Returns:
+      The passed-in hash_obj.
+    """
+    if not os.path.isdir(path):
+        raise ValueError('Not a directory: %s' % path)
 
-  path = os.path.abspath(path)
-  for root, dirs, files in os.walk(path):
-    dirs.sort()
-    for f in sorted(files):
-      if f == '.bower.json':
-        continue
-      p = os.path.join(root, f)
-      hash_obj.update(p[len(path)+1:].encode("utf-8"))
-      hash_obj.update(open(p, "rb").read())
+    path = os.path.abspath(path)
+    for root, dirs, files in os.walk(path):
+        dirs.sort()
+        for f in sorted(files):
+            if f == '.bower.json':
+                continue
+            p = os.path.join(root, f)
+            hash_obj.update(p[len(path)+1:].encode("utf-8"))
+            hash_obj.update(open(p, "rb").read())
 
-  return hash_obj
+    return hash_obj
diff --git a/tools/js/download_bower.py b/tools/js/download_bower.py
index 3db39d5..c9a5df6 100755
--- a/tools/js/download_bower.py
+++ b/tools/js/download_bower.py
@@ -30,99 +30,105 @@
 
 
 def bower_cmd(bower, *args):
-  cmd = bower.split(' ')
-  cmd.extend(args)
-  return cmd
+    cmd = bower.split(' ')
+    cmd.extend(args)
+    return cmd
 
 
 def bower_info(bower, name, package, version):
-  cmd = bower_cmd(bower, '-l=error', '-j',
-                  'info', '%s#%s' % (package, version))
-  try:
-    p = subprocess.Popen(cmd , stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-  except:
-    sys.stderr.write("error executing: %s\n" % ' '.join(cmd))
-    raise
-  out, err = p.communicate()
-  if p.returncode:
-    sys.stderr.write(err)
-    raise OSError('Command failed: %s' % ' '.join(cmd))
+    cmd = bower_cmd(bower, '-l=error', '-j',
+                    'info', '%s#%s' % (package, version))
+    try:
+        p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
+                             stderr=subprocess.PIPE)
+    except:
+        sys.stderr.write("error executing: %s\n" % ' '.join(cmd))
+        raise
+    out, err = p.communicate()
+    if p.returncode:
+        sys.stderr.write(err)
+        raise OSError('Command failed: %s' % ' '.join(cmd))
 
-  try:
-    info = json.loads(out)
-  except ValueError:
-    raise ValueError('invalid JSON from %s:\n%s' % (" ".join(cmd), out))
-  info_name = info.get('name')
-  if info_name != name:
-    raise ValueError('expected package name %s, got: %s' % (name, info_name))
-  return info
+    try:
+        info = json.loads(out)
+    except ValueError:
+        raise ValueError('invalid JSON from %s:\n%s' % (" ".join(cmd), out))
+    info_name = info.get('name')
+    if info_name != name:
+        raise ValueError(
+            'expected package name %s, got: %s' % (name, info_name))
+    return info
 
 
 def ignore_deps(info):
-  # Tell bower to ignore dependencies so we just download this component. This
-  # is just an optimization, since we only pick out the component we need, but
-  # it's important when downloading sizable dependency trees.
-  #
-  # As of 1.6.5 I don't think ignoredDependencies can be specified on the
-  # command line with --config, so we have to create .bowerrc.
-  deps = info.get('dependencies')
-  if deps:
-    with open(os.path.join('.bowerrc'), 'w') as f:
-      json.dump({'ignoredDependencies': list(deps.keys())}, f)
+    # Tell bower to ignore dependencies so we just download this component.
+    # This is just an optimization, since we only pick out the component we
+    # need, but it's important when downloading sizable dependency trees.
+    #
+    # As of 1.6.5 I don't think ignoredDependencies can be specified on the
+    # command line with --config, so we have to create .bowerrc.
+    deps = info.get('dependencies')
+    if deps:
+        with open(os.path.join('.bowerrc'), 'w') as f:
+            json.dump({'ignoredDependencies': list(deps.keys())}, f)
 
 
 def cache_entry(name, package, version, sha1):
-  if not sha1:
-    sha1 = hashlib.sha1('%s#%s' % (package, version)).hexdigest()
-  return os.path.join(CACHE_DIR, '%s-%s.zip-%s' % (name, version, sha1))
+    if not sha1:
+        sha1 = hashlib.sha1('%s#%s' % (package, version)).hexdigest()
+    return os.path.join(CACHE_DIR, '%s-%s.zip-%s' % (name, version, sha1))
 
 
 def main(args):
-  opts = optparse.OptionParser()
-  opts.add_option('-n', help='short name of component')
-  opts.add_option('-b', help='bower command')
-  opts.add_option('-p', help='full package name of component')
-  opts.add_option('-v', help='version number')
-  opts.add_option('-s', help='expected content sha1')
-  opts.add_option('-o', help='output file location')
-  opts, args_ = opts.parse_args(args)
+    opts = optparse.OptionParser()
+    opts.add_option('-n', help='short name of component')
+    opts.add_option('-b', help='bower command')
+    opts.add_option('-p', help='full package name of component')
+    opts.add_option('-v', help='version number')
+    opts.add_option('-s', help='expected content sha1')
+    opts.add_option('-o', help='output file location')
+    opts, args_ = opts.parse_args(args)
 
-  assert opts.p
-  assert opts.v
-  assert opts.n
+    assert opts.p
+    assert opts.v
+    assert opts.n
 
-  cwd = os.getcwd()
-  outzip = os.path.join(cwd, opts.o)
-  cached = cache_entry(opts.n, opts.p, opts.v, opts.s)
+    cwd = os.getcwd()
+    outzip = os.path.join(cwd, opts.o)
+    cached = cache_entry(opts.n, opts.p, opts.v, opts.s)
 
-  if not os.path.exists(cached):
-    info = bower_info(opts.b, opts.n, opts.p, opts.v)
-    ignore_deps(info)
-    subprocess.check_call(
-        bower_cmd(opts.b, '--quiet', 'install', '%s#%s' % (opts.p, opts.v)))
-    bc = os.path.join(cwd, 'bower_components')
-    subprocess.check_call(
-        ['zip', '-q', '--exclude', '.bower.json', '-r', cached, opts.n],
-        cwd=bc)
+    if not os.path.exists(cached):
+        info = bower_info(opts.b, opts.n, opts.p, opts.v)
+        ignore_deps(info)
+        subprocess.check_call(
+            bower_cmd(
+                opts.b, '--quiet', 'install', '%s#%s' % (opts.p, opts.v)))
+        bc = os.path.join(cwd, 'bower_components')
+        subprocess.check_call(
+            ['zip', '-q', '--exclude', '.bower.json', '-r', cached, opts.n],
+            cwd=bc)
 
-    if opts.s:
-      path = os.path.join(bc, opts.n)
-      sha1 = bowerutil.hash_bower_component(hashlib.sha1(), path).hexdigest()
-      if opts.s != sha1:
-        print((
-          '%s#%s:\n'
-          'expected %s\n'
-          'received %s\n') % (opts.p, opts.v, opts.s, sha1), file=sys.stderr)
-        try:
-          os.remove(cached)
-        except OSError as err:
-          if path.exists(cached):
-            print('error removing %s: %s' % (cached, err), file=sys.stderr)
-        return 1
+        if opts.s:
+            path = os.path.join(bc, opts.n)
+            sha1 = bowerutil.hash_bower_component(
+                hashlib.sha1(), path).hexdigest()
+            if opts.s != sha1:
+                print((
+                    '%s#%s:\n'
+                    'expected %s\n'
+                    'received %s\n') % (opts.p, opts.v, opts.s, sha1),
+                    file=sys.stderr)
+                try:
+                    os.remove(cached)
+                except OSError as err:
+                    if path.exists(cached):
+                        print('error removing %s: %s' % (cached, err),
+                              file=sys.stderr)
+                return 1
 
-  shutil.copyfile(cached, outzip)
-  return 0
+    shutil.copyfile(cached, outzip)
+    return 0
 
 
 if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
+    sys.exit(main(sys.argv[1:]))
diff --git a/tools/js/npm_pack.py b/tools/js/npm_pack.py
index 52dc512..f14262a 100755
--- a/tools/js/npm_pack.py
+++ b/tools/js/npm_pack.py
@@ -13,6 +13,12 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+"""This downloads an NPM binary, and bundles it with its dependencies.
+
+For full instructions on adding new binaries to the build, see
+http://gerrit-review.googlesource.com/Documentation/dev-bazel.html#npm-binary
+"""
+
 from __future__ import print_function
 
 import atexit
@@ -26,49 +32,49 @@
 
 
 def is_bundled(tar):
-  # No entries for directories, so scan for a matching prefix.
-  for entry in tar.getmembers():
-    if entry.name.startswith('package/node_modules/'):
-      return True
-  return False
+    # No entries for directories, so scan for a matching prefix.
+    for entry in tar.getmembers():
+        if entry.name.startswith('package/node_modules/'):
+            return True
+    return False
 
 
 def bundle_dependencies():
-  with open('package.json') as f:
-    package = json.load(f)
-  package['bundledDependencies'] = list(package['dependencies'].keys())
-  with open('package.json', 'w') as f:
-    json.dump(package, f)
+    with open('package.json') as f:
+        package = json.load(f)
+    package['bundledDependencies'] = list(package['dependencies'].keys())
+    with open('package.json', 'w') as f:
+        json.dump(package, f)
 
 
 def main(args):
-  if len(args) != 2:
-    print('Usage: %s <package> <version>' % sys.argv[0], file=sys.stderr)
-    return 1
+    if len(args) != 2:
+        print('Usage: %s <package> <version>' % sys.argv[0], file=sys.stderr)
+        return 1
 
-  name, version = args
-  filename = '%s-%s.tgz' % (name, version)
-  url = 'http://registry.npmjs.org/%s/-/%s' % (name, filename)
+    name, version = args
+    filename = '%s-%s.tgz' % (name, version)
+    url = 'http://registry.npmjs.org/%s/-/%s' % (name, filename)
 
-  tmpdir = tempfile.mkdtemp();
-  tgz = os.path.join(tmpdir, filename)
-  atexit.register(lambda: shutil.rmtree(tmpdir))
+    tmpdir = tempfile.mkdtemp()
+    tgz = os.path.join(tmpdir, filename)
+    atexit.register(lambda: shutil.rmtree(tmpdir))
 
-  subprocess.check_call(['curl', '--proxy-anyauth', '-ksfo', tgz, url])
-  with tarfile.open(tgz, 'r:gz') as tar:
-    if is_bundled(tar):
-      print('%s already has bundled node_modules' % filename)
-      return 1
-    tar.extractall(path=tmpdir)
+    subprocess.check_call(['curl', '--proxy-anyauth', '-ksfo', tgz, url])
+    with tarfile.open(tgz, 'r:gz') as tar:
+        if is_bundled(tar):
+            print('%s already has bundled node_modules' % filename)
+            return 1
+        tar.extractall(path=tmpdir)
 
-  oldpwd = os.getcwd()
-  os.chdir(os.path.join(tmpdir, 'package'))
-  bundle_dependencies()
-  subprocess.check_call(['npm', 'install'])
-  subprocess.check_call(['npm', 'pack'])
-  shutil.copy(filename, os.path.join(oldpwd, filename))
-  return 0
+    oldpwd = os.getcwd()
+    os.chdir(os.path.join(tmpdir, 'package'))
+    bundle_dependencies()
+    subprocess.check_call(['npm', 'install'])
+    subprocess.check_call(['npm', 'pack'])
+    shutil.copy(filename, os.path.join(oldpwd, filename))
+    return 0
 
 
 if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
+    sys.exit(main(sys.argv[1:]))
diff --git a/tools/js/run_npm_binary.py b/tools/js/run_npm_binary.py
index d769b98..bdee5ab 100644
--- a/tools/js/run_npm_binary.py
+++ b/tools/js/run_npm_binary.py
@@ -27,65 +27,76 @@
 
 
 def extract(path, outdir, bin):
-  if os.path.exists(os.path.join(outdir, bin)):
-    return # Another process finished extracting, ignore.
+    if os.path.exists(os.path.join(outdir, bin)):
+        return  # Another process finished extracting, ignore.
 
-  # Use a temp directory adjacent to outdir so shutil.move can use the same
-  # device atomically.
-  tmpdir = tempfile.mkdtemp(dir=os.path.dirname(outdir))
-  def cleanup():
-    try:
-      shutil.rmtree(tmpdir)
-    except OSError:
-      pass # Too late now
-  atexit.register(cleanup)
+    # Use a temp directory adjacent to outdir so shutil.move can use the same
+    # device atomically.
+    tmpdir = tempfile.mkdtemp(dir=os.path.dirname(outdir))
 
-  def extract_one(mem):
-    dest = os.path.join(outdir, mem.name)
-    tar.extract(mem, path=tmpdir)
-    try:
-      os.makedirs(os.path.dirname(dest))
-    except OSError:
-      pass # Either exists, or will fail on the next line.
-    shutil.move(os.path.join(tmpdir, mem.name), dest)
+    def cleanup():
+        try:
+            shutil.rmtree(tmpdir)
+        except OSError:
+            pass  # Too late now
+    atexit.register(cleanup)
 
-  with tarfile.open(path, 'r:gz') as tar:
-    for mem in tar.getmembers():
-      if mem.name != bin:
-        extract_one(mem)
-    # Extract bin last so other processes only short circuit when extraction is
-    # finished.
-    extract_one(tar.getmember(bin))
+    def extract_one(mem):
+        dest = os.path.join(outdir, mem.name)
+        tar.extract(mem, path=tmpdir)
+        try:
+            os.makedirs(os.path.dirname(dest))
+        except OSError:
+            pass  # Either exists, or will fail on the next line.
+        shutil.move(os.path.join(tmpdir, mem.name), dest)
+
+    with tarfile.open(path, 'r:gz') as tar:
+        for mem in tar.getmembers():
+            if mem.name != bin:
+                extract_one(mem)
+        # Extract bin last so other processes only short circuit when
+        # extraction is finished.
+        if bin in tar.getnames():
+            extract_one(tar.getmember(bin))
+
 
 def main(args):
-  path = args[0]
-  suffix = '.npm_binary.tgz'
-  tgz = os.path.basename(path)
+    path = args[0]
+    suffix = '.npm_binary.tgz'
+    tgz = os.path.basename(path)
 
-  parts = tgz[:-len(suffix)].split('@')
+    parts = tgz[:-len(suffix)].split('@')
 
-  if not tgz.endswith(suffix) or len(parts) != 2:
-    print('usage: %s <path/to/npm_binary>' % sys.argv[0], file=sys.stderr)
-    return 1
+    if not tgz.endswith(suffix) or len(parts) != 2:
+        print('usage: %s <path/to/npm_binary>' % sys.argv[0], file=sys.stderr)
+        return 1
 
-  name, _ = parts
+    name, _ = parts
 
-  # Avoid importing from gerrit because we don't want to depend on the right CWD.
-  sha1 = hashlib.sha1(open(path, 'rb').read()).hexdigest()
-  outdir = '%s-%s' % (path[:-len(suffix)], sha1)
-  rel_bin = os.path.join('package', 'bin', name)
-  bin = os.path.join(outdir, rel_bin)
-  if not os.path.isfile(bin):
-    extract(path, outdir, rel_bin)
+    # Avoid importing from gerrit because we don't want to depend on the right
+    # working directory
+    sha1 = hashlib.sha1(open(path, 'rb').read()).hexdigest()
+    outdir = '%s-%s' % (path[:-len(suffix)], sha1)
+    rel_bin = os.path.join('package', 'bin', name)
+    rel_lib_bin = os.path.join('package', 'lib', 'bin', name + '.js')
+    bin = os.path.join(outdir, rel_bin)
+    libbin = os.path.join(outdir, rel_lib_bin)
+    if not os.path.isfile(bin):
+        extract(path, outdir, rel_bin)
 
-  nodejs = spawn.find_executable('nodejs')
-  if nodejs:
-    # Debian installs Node.js as 'nodejs', due to a conflict with another
-    # package.
-    subprocess.check_call([nodejs, bin] + args[1:])
-  else:
-    subprocess.check_call([bin] + args[1:])
+    nodejs = spawn.find_executable('nodejs')
+    if nodejs:
+        # Debian installs Node.js as 'nodejs', due to a conflict with another
+        # package.
+        if not os.path.isfile(bin) and os.path.isfile(libbin):
+            subprocess.check_call([nodejs, libbin] + args[1:])
+        else:
+            subprocess.check_call([nodejs, bin] + args[1:])
+    elif not os.path.isfile(bin) and os.path.isfile(libbin):
+        subprocess.check_call([libbin] + args[1:])
+    else:
+        subprocess.check_call([bin] + args[1:])
 
 
 if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
+    sys.exit(main(sys.argv[1:]))
diff --git a/tools/maven/BUILD b/tools/maven/BUILD
index d46a954..10ed27d 100644
--- a/tools/maven/BUILD
+++ b/tools/maven/BUILD
@@ -7,21 +7,21 @@
 
 maven_package(
     src = {
-        "gerrit-acceptance-framework": "//gerrit-acceptance-framework:liblib-src.jar",
-        "gerrit-extension-api": "//gerrit-extension-api:libapi-src.jar",
-        "gerrit-plugin-api": "//gerrit-plugin-api:plugin-api-sources_deploy.jar",
+        "gerrit-acceptance-framework": "//java/com/google/gerrit/acceptance:libframework-lib-src.jar",
+        "gerrit-extension-api": "//java/com/google/gerrit/extensions:libapi-src.jar",
+        "gerrit-plugin-api": "//plugins:plugin-api-sources_deploy.jar",
         "gerrit-plugin-gwtui": "//gerrit-plugin-gwtui:gwtui-api-source_deploy.jar",
     },
     doc = {
-        "gerrit-acceptance-framework": "//gerrit-acceptance-framework:acceptance-framework-javadoc",
-        "gerrit-extension-api": "//gerrit-extension-api:extension-api-javadoc",
-        "gerrit-plugin-api": "//gerrit-plugin-api:plugin-api-javadoc",
+        "gerrit-acceptance-framework": "//java/com/google/gerrit/acceptance:framework-javadoc",
+        "gerrit-extension-api": "//java/com/google/gerrit/extensions:extension-api-javadoc",
+        "gerrit-plugin-api": "//plugins:plugin-api-javadoc",
         "gerrit-plugin-gwtui": "//gerrit-plugin-gwtui:gwtui-api-javadoc",
     },
     jar = {
-        "gerrit-acceptance-framework": "//gerrit-acceptance-framework:acceptance-framework_deploy.jar",
-        "gerrit-extension-api": "//gerrit-extension-api:extension-api_deploy.jar",
-        "gerrit-plugin-api": "//gerrit-plugin-api:plugin-api_deploy.jar",
+        "gerrit-acceptance-framework": "//java/com/google/gerrit/acceptance:framework_deploy.jar",
+        "gerrit-extension-api": "//java/com/google/gerrit/extensions:extension-api_deploy.jar",
+        "gerrit-plugin-api": "//plugins:plugin-api_deploy.jar",
         "gerrit-plugin-gwtui": "//gerrit-plugin-gwtui:gwtui-api_deploy.jar",
     },
     repository = MAVEN_REPOSITORY,
diff --git a/tools/maven/gerrit-acceptance-framework_pom.xml b/tools/maven/gerrit-acceptance-framework_pom.xml
new file mode 100644
index 0000000..c287e23
--- /dev/null
+++ b/tools/maven/gerrit-acceptance-framework_pom.xml
@@ -0,0 +1,83 @@
+<project>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>com.google.gerrit</groupId>
+  <artifactId>gerrit-acceptance-framework</artifactId>
+  <version>2.16.7-SNAPSHOT</version>
+  <packaging>jar</packaging>
+  <name>Gerrit Code Review - Acceptance Test Framework</name>
+  <description>Framework for Gerrit's acceptance tests</description>
+  <url>https://www.gerritcodereview.com/</url>
+
+  <licenses>
+    <license>
+      <name>The Apache Software License, Version 2.0</name>
+      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+      <distribution>repo</distribution>
+    </license>
+  </licenses>
+
+  <scm>
+    <url>https://gerrit.googlesource.com/gerrit</url>
+    <connection>https://gerrit.googlesource.com/gerrit</connection>
+  </scm>
+
+  <developers>
+    <developer>
+      <name>Alice Kober-Sotzek</name>
+    </developer>
+    <developer>
+      <name>Ben Rohlfs</name>
+    </developer>
+    <developer>
+      <name>Dave Borowitz</name>
+    </developer>
+    <developer>
+      <name>David Ostrovsky</name>
+    </developer>
+    <developer>
+      <name>David Pursehouse</name>
+    </developer>
+    <developer>
+      <name>Edwin Kempin</name>
+    </developer>
+    <developer>
+      <name>Han-Wen Nienhuys</name>
+    </developer>
+    <developer>
+      <name>Hugo Arès</name>
+    </developer>
+    <developer>
+      <name>Luca Milanesio</name>
+    </developer>
+    <developer>
+      <name>Marco Miller</name>
+    </developer>
+    <developer>
+      <name>Martin Fick</name>
+    </developer>
+    <developer>
+      <name>Ole Rehmsen</name>
+    </developer>
+    <developer>
+      <name>Patrick Hiesel</name>
+    </developer>
+    <developer>
+      <name>Saša Živkov</name>
+    </developer>
+  </developers>
+
+  <mailingLists>
+    <mailingList>
+      <name>Repo and Gerrit Discussion</name>
+      <post>repo-discuss@googlegroups.com</post>
+      <subscribe>https://groups.google.com/forum/#!forum/repo-discuss</subscribe>
+      <unsubscribe>https://groups.google.com/forum/#!forum/repo-discuss</unsubscribe>
+      <archive>https://groups.google.com/forum/#!forum/repo-discuss</archive>
+    </mailingList>
+  </mailingLists>
+
+  <issueManagement>
+    <url>https://bugs.chromium.org/p/gerrit/issues/list</url>
+    <system>Gerrit Issue Tracker</system>
+  </issueManagement>
+</project>
diff --git a/tools/maven/gerrit-extension-api_pom.xml b/tools/maven/gerrit-extension-api_pom.xml
new file mode 100644
index 0000000..abccb70
--- /dev/null
+++ b/tools/maven/gerrit-extension-api_pom.xml
@@ -0,0 +1,83 @@
+<project>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>com.google.gerrit</groupId>
+  <artifactId>gerrit-extension-api</artifactId>
+  <version>2.16.7-SNAPSHOT</version>
+  <packaging>jar</packaging>
+  <name>Gerrit Code Review - Extension API</name>
+  <description>API for Gerrit Extensions</description>
+  <url>https://www.gerritcodereview.com/</url>
+
+  <licenses>
+    <license>
+      <name>The Apache Software License, Version 2.0</name>
+      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+      <distribution>repo</distribution>
+    </license>
+  </licenses>
+
+  <scm>
+    <url>https://gerrit.googlesource.com/gerrit</url>
+    <connection>https://gerrit.googlesource.com/gerrit</connection>
+  </scm>
+
+  <developers>
+    <developer>
+      <name>Alice Kober-Sotzek</name>
+    </developer>
+    <developer>
+      <name>Ben Rohlfs</name>
+    </developer>
+    <developer>
+      <name>Dave Borowitz</name>
+    </developer>
+    <developer>
+      <name>David Ostrovsky</name>
+    </developer>
+    <developer>
+      <name>David Pursehouse</name>
+    </developer>
+    <developer>
+      <name>Edwin Kempin</name>
+    </developer>
+    <developer>
+      <name>Han-Wen Nienhuys</name>
+    </developer>
+    <developer>
+      <name>Hugo Arès</name>
+    </developer>
+    <developer>
+      <name>Luca Milanesio</name>
+    </developer>
+    <developer>
+      <name>Marco Miller</name>
+    </developer>
+    <developer>
+      <name>Martin Fick</name>
+    </developer>
+    <developer>
+      <name>Ole Rehmsen</name>
+    </developer>
+    <developer>
+      <name>Patrick Hiesel</name>
+    </developer>
+    <developer>
+      <name>Saša Živkov</name>
+    </developer>
+  </developers>
+
+  <mailingLists>
+    <mailingList>
+      <name>Repo and Gerrit Discussion</name>
+      <post>repo-discuss@googlegroups.com</post>
+      <subscribe>https://groups.google.com/forum/#!forum/repo-discuss</subscribe>
+      <unsubscribe>https://groups.google.com/forum/#!forum/repo-discuss</unsubscribe>
+      <archive>https://groups.google.com/forum/#!forum/repo-discuss</archive>
+    </mailingList>
+  </mailingLists>
+
+  <issueManagement>
+    <url>https://bugs.chromium.org/p/gerrit/issues/list</url>
+    <system>Gerrit Issue Tracker</system>
+  </issueManagement>
+</project>
diff --git a/tools/maven/gerrit-plugin-api_pom.xml b/tools/maven/gerrit-plugin-api_pom.xml
new file mode 100644
index 0000000..6147633
--- /dev/null
+++ b/tools/maven/gerrit-plugin-api_pom.xml
@@ -0,0 +1,83 @@
+<project>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>com.google.gerrit</groupId>
+  <artifactId>gerrit-plugin-api</artifactId>
+  <version>2.16.7-SNAPSHOT</version>
+  <packaging>jar</packaging>
+  <name>Gerrit Code Review - Plugin API</name>
+  <description>API for Gerrit Plugins</description>
+  <url>https://www.gerritcodereview.com/</url>
+
+  <licenses>
+    <license>
+      <name>The Apache Software License, Version 2.0</name>
+      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+      <distribution>repo</distribution>
+    </license>
+  </licenses>
+
+  <scm>
+    <url>https://gerrit.googlesource.com/gerrit</url>
+    <connection>https://gerrit.googlesource.com/gerrit</connection>
+  </scm>
+
+  <developers>
+    <developer>
+      <name>Alice Kober-Sotzek</name>
+    </developer>
+    <developer>
+      <name>Ben Rohlfs</name>
+    </developer>
+    <developer>
+      <name>Dave Borowitz</name>
+    </developer>
+    <developer>
+      <name>David Ostrovsky</name>
+    </developer>
+    <developer>
+      <name>David Pursehouse</name>
+    </developer>
+    <developer>
+      <name>Edwin Kempin</name>
+    </developer>
+    <developer>
+      <name>Han-Wen Nienhuys</name>
+    </developer>
+    <developer>
+      <name>Hugo Arès</name>
+    </developer>
+    <developer>
+      <name>Luca Milanesio</name>
+    </developer>
+    <developer>
+      <name>Marco Miller</name>
+    </developer>
+    <developer>
+      <name>Martin Fick</name>
+    </developer>
+    <developer>
+      <name>Ole Rehmsen</name>
+    </developer>
+    <developer>
+      <name>Patrick Hiesel</name>
+    </developer>
+    <developer>
+      <name>Saša Živkov</name>
+    </developer>
+  </developers>
+
+  <mailingLists>
+    <mailingList>
+      <name>Repo and Gerrit Discussion</name>
+      <post>repo-discuss@googlegroups.com</post>
+      <subscribe>https://groups.google.com/forum/#!forum/repo-discuss</subscribe>
+      <unsubscribe>https://groups.google.com/forum/#!forum/repo-discuss</unsubscribe>
+      <archive>https://groups.google.com/forum/#!forum/repo-discuss</archive>
+    </mailingList>
+  </mailingLists>
+
+  <issueManagement>
+    <url>https://bugs.chromium.org/p/gerrit/issues/list</url>
+    <system>Gerrit Issue Tracker</system>
+  </issueManagement>
+</project>
diff --git a/tools/maven/gerrit-plugin-gwtui_pom.xml b/tools/maven/gerrit-plugin-gwtui_pom.xml
new file mode 100644
index 0000000..4f8e296
--- /dev/null
+++ b/tools/maven/gerrit-plugin-gwtui_pom.xml
@@ -0,0 +1,83 @@
+<project>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>com.google.gerrit</groupId>
+  <artifactId>gerrit-plugin-gwtui</artifactId>
+  <version>2.16.7-SNAPSHOT</version>
+  <packaging>jar</packaging>
+  <name>Gerrit Code Review - Plugin GWT UI</name>
+  <description>Common Classes for Gerrit GWT UI Plugins</description>
+  <url>https://www.gerritcodereview.com/</url>
+
+  <licenses>
+    <license>
+      <name>The Apache Software License, Version 2.0</name>
+      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+      <distribution>repo</distribution>
+    </license>
+  </licenses>
+
+  <scm>
+    <url>https://gerrit.googlesource.com/gerrit</url>
+    <connection>https://gerrit.googlesource.com/gerrit</connection>
+  </scm>
+
+  <developers>
+    <developer>
+      <name>Alice Kober-Sotzek</name>
+    </developer>
+    <developer>
+      <name>Ben Rohlfs</name>
+    </developer>
+    <developer>
+      <name>Dave Borowitz</name>
+    </developer>
+    <developer>
+      <name>David Ostrovsky</name>
+    </developer>
+    <developer>
+      <name>David Pursehouse</name>
+    </developer>
+    <developer>
+      <name>Edwin Kempin</name>
+    </developer>
+    <developer>
+      <name>Han-Wen Nienhuys</name>
+    </developer>
+    <developer>
+      <name>Hugo Arès</name>
+    </developer>
+    <developer>
+      <name>Luca Milanesio</name>
+    </developer>
+    <developer>
+      <name>Marco Miller</name>
+    </developer>
+    <developer>
+      <name>Martin Fick</name>
+    </developer>
+    <developer>
+      <name>Ole Rehmsen</name>
+    </developer>
+    <developer>
+      <name>Patrick Hiesel</name>
+    </developer>
+    <developer>
+      <name>Saša Živkov</name>
+    </developer>
+  </developers>
+
+  <mailingLists>
+    <mailingList>
+      <name>Repo and Gerrit Discussion</name>
+      <post>repo-discuss@googlegroups.com</post>
+      <subscribe>https://groups.google.com/forum/#!forum/repo-discuss</subscribe>
+      <unsubscribe>https://groups.google.com/forum/#!forum/repo-discuss</unsubscribe>
+      <archive>https://groups.google.com/forum/#!forum/repo-discuss</archive>
+    </mailingList>
+  </mailingLists>
+
+  <issueManagement>
+    <url>https://bugs.chromium.org/p/gerrit/issues/list</url>
+    <system>Gerrit Issue Tracker</system>
+  </issueManagement>
+</project>
diff --git a/tools/maven/gerrit-war_pom.xml b/tools/maven/gerrit-war_pom.xml
new file mode 100644
index 0000000..c77fd40
--- /dev/null
+++ b/tools/maven/gerrit-war_pom.xml
@@ -0,0 +1,83 @@
+<project>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>com.google.gerrit</groupId>
+  <artifactId>gerrit-war</artifactId>
+  <version>2.16.7-SNAPSHOT</version>
+  <packaging>war</packaging>
+  <name>Gerrit Code Review - WAR</name>
+  <description>Gerrit WAR</description>
+  <url>https://www.gerritcodereview.com/</url>
+
+  <licenses>
+    <license>
+      <name>The Apache Software License, Version 2.0</name>
+      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+      <distribution>repo</distribution>
+    </license>
+  </licenses>
+
+  <scm>
+    <url>https://gerrit.googlesource.com/gerrit</url>
+    <connection>https://gerrit.googlesource.com/gerrit</connection>
+  </scm>
+
+  <developers>
+    <developer>
+      <name>Alice Kober-Sotzek</name>
+    </developer>
+    <developer>
+      <name>Ben Rohlfs</name>
+    </developer>
+    <developer>
+      <name>Dave Borowitz</name>
+    </developer>
+    <developer>
+      <name>David Ostrovsky</name>
+    </developer>
+    <developer>
+      <name>David Pursehouse</name>
+    </developer>
+    <developer>
+      <name>Edwin Kempin</name>
+    </developer>
+    <developer>
+      <name>Han-Wen Nienhuys</name>
+    </developer>
+    <developer>
+      <name>Hugo Arès</name>
+    </developer>
+    <developer>
+      <name>Luca Milanesio</name>
+    </developer>
+    <developer>
+      <name>Marco Miller</name>
+    </developer>
+    <developer>
+      <name>Martin Fick</name>
+    </developer>
+    <developer>
+      <name>Ole Rehmsen</name>
+    </developer>
+    <developer>
+      <name>Patrick Hiesel</name>
+    </developer>
+    <developer>
+      <name>Saša Živkov</name>
+    </developer>
+  </developers>
+
+  <mailingLists>
+    <mailingList>
+      <name>Repo and Gerrit Discussion</name>
+      <post>repo-discuss@googlegroups.com</post>
+      <subscribe>https://groups.google.com/forum/#!forum/repo-discuss</subscribe>
+      <unsubscribe>https://groups.google.com/forum/#!forum/repo-discuss</unsubscribe>
+      <archive>https://groups.google.com/forum/#!forum/repo-discuss</archive>
+    </mailingList>
+  </mailingLists>
+
+  <issueManagement>
+    <url>https://bugs.chromium.org/p/gerrit/issues/list</url>
+    <system>Gerrit Issue Tracker</system>
+  </issueManagement>
+</project>
diff --git a/tools/maven/mvn.py b/tools/maven/mvn.py
index a093916..d47d027 100755
--- a/tools/maven/mvn.py
+++ b/tools/maven/mvn.py
@@ -29,56 +29,57 @@
 
 args, ctx = opts.parse_args()
 if not args.v:
-  print('version is empty', file=stderr)
-  exit(1)
+    print('version is empty', file=stderr)
+    exit(1)
 
 root = path.abspath(__file__)
 while not path.exists(path.join(root, 'WORKSPACE')):
-  root = path.dirname(root)
+    root = path.dirname(root)
 
 if 'install' == args.a:
-  cmd = [
-    'mvn',
-    'install:install-file',
-    '-Dversion=%s' % args.v,
-  ]
+    cmd = [
+        'mvn',
+        'install:install-file',
+        '-Dversion=%s' % args.v,
+    ]
 elif 'deploy' == args.a:
-  cmd = [
-    'mvn',
-    'gpg:sign-and-deploy-file',
-    '-DrepositoryId=%s' % args.repository,
-    '-Durl=%s' % args.url,
-  ]
+    cmd = [
+        'mvn',
+        'gpg:sign-and-deploy-file',
+        '-DrepositoryId=%s' % args.repository,
+        '-Durl=%s' % args.url,
+    ]
 else:
-  print("unknown action -a %s" % args.a, file=stderr)
-  exit(1)
+    print("unknown action -a %s" % args.a, file=stderr)
+    exit(1)
 
 for spec in args.s:
-  artifact, packaging_type, src = spec.split(':')
-  exe = cmd + [
-    '-DpomFile=%s' % path.join(root, '%s/pom.xml' % artifact),
-    '-Dpackaging=%s' % packaging_type,
-    '-Dfile=%s' % src,
-  ]
-  try:
-    if environ.get('VERBOSE'):
-      print(' '.join(exe), file=stderr)
-    check_output(exe)
-  except Exception as e:
-    print('%s command failed: %s\n%s' % (args.a, ' '.join(exe), e),
-      file=stderr)
-    if environ.get('VERBOSE') and isinstance(e, CalledProcessError):
-      print('Command output\n%s' % e.output, file=stderr)
-    exit(1)
+    artifact, packaging_type, src = spec.split(':')
+    exe = cmd + [
+        '-DpomFile=%s' % path.join(root, 'tools', 'maven',
+                                   '%s_pom.xml' % artifact),
+        '-Dpackaging=%s' % packaging_type,
+        '-Dfile=%s' % src,
+    ]
+    try:
+        if environ.get('VERBOSE'):
+            print(' '.join(exe), file=stderr)
+        check_output(exe)
+    except Exception as e:
+        print('%s command failed: %s\n%s' % (args.a, ' '.join(exe), e),
+              file=stderr)
+        if environ.get('VERBOSE') and isinstance(e, CalledProcessError):
+            print('Command output\n%s' % e.output, file=stderr)
+        exit(1)
 
 
 out = stderr
 if args.o:
-  out = open(args.o, 'w')
+    out = open(args.o, 'w')
 
 with out as fd:
-  if args.repository:
-    print('Repository: %s' % args.repository, file=fd)
-  if args.url:
-    print('URL: %s' % args.url, file=fd)
-  print('Version: %s' % args.v, file=fd)
+    if args.repository:
+        print('Repository: %s' % args.repository, file=fd)
+    if args.url:
+        print('URL: %s' % args.url, file=fd)
+    print('Version: %s' % args.v, file=fd)
diff --git a/tools/maven/package.bzl b/tools/maven/package.bzl
index 5b497f8..11e569d 100644
--- a/tools/maven/package.bzl
+++ b/tools/maven/package.bzl
@@ -50,7 +50,7 @@
         srcs = api_targets,
         outs = ["api_install.sh"],
         executable = True,
-        testonly = 1,
+        testonly = True,
     )
 
     if repository and url:
@@ -70,7 +70,7 @@
             srcs = api_targets,
             outs = ["api_deploy.sh"],
             executable = True,
-            testonly = 1,
+            testonly = True,
         )
 
     war_cmd = mvn_cmd[:]
diff --git a/tools/merge_jars.py b/tools/merge_jars.py
index 97a87c4..6b46069 100755
--- a/tools/merge_jars.py
+++ b/tools/merge_jars.py
@@ -17,11 +17,10 @@
 import collections
 import sys
 import zipfile
-import io
 
 if len(sys.argv) < 3:
-  print('usage: %s <out.zip> <in.zip>...' % sys.argv[0], file=sys.stderr)
-  exit(1)
+    print('usage: %s <out.zip> <in.zip>...' % sys.argv[0], file=sys.stderr)
+    exit(1)
 
 outfile = sys.argv[1]
 infiles = sys.argv[2:]
@@ -29,22 +28,22 @@
 SERVICES = 'META-INF/services/'
 
 try:
-  with zipfile.ZipFile(outfile, 'w') as outzip:
-    services = collections.defaultdict(lambda: '')
-    for infile in infiles:
-      with zipfile.ZipFile(infile) as inzip:
-        for info in inzip.infolist():
-          n = info.filename
-          if n in seen:
-            continue
-          elif n.startswith(SERVICES):
-            # Concatenate all provider configuration files.
-            services[n] += inzip.read(n).decode("UTF-8")
-            continue
-          outzip.writestr(info, inzip.read(n))
-          seen.add(n)
+    with zipfile.ZipFile(outfile, 'w') as outzip:
+        services = collections.defaultdict(lambda: '')
+        for infile in infiles:
+            with zipfile.ZipFile(infile) as inzip:
+                for info in inzip.infolist():
+                    n = info.filename
+                    if n in seen:
+                        continue
+                    elif n.startswith(SERVICES):
+                        # Concatenate all provider configuration files.
+                        services[n] += inzip.read(n).decode("UTF-8")
+                        continue
+                    outzip.writestr(info, inzip.read(n))
+                    seen.add(n)
 
-    for n, v in list(services.items()):
-      outzip.writestr(n, v)
+        for n, v in list(services.items()):
+            outzip.writestr(n, v)
 except Exception as err:
-  exit('Failed to merge jars: %s' % err)
+    exit('Failed to merge jars: %s' % err)
diff --git a/tools/release-announcement-template.txt b/tools/release-announcement-template.txt
deleted file mode 100644
index 87f5d49..0000000
--- a/tools/release-announcement-template.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-Gerrit version {{ data.version }} is now available.{% if data.summary %} {{ data.summary }} {% endif %}Please see the release notes for details.
-
-Release Notes:
-https://www.gerritcodereview.com/releases/{{ data.version.major }}.md{% if data.version.patch %}#{{ data.version.patch }}{% endif %}
-
-Documentation:
-http://gerrit-documentation.storage.googleapis.com/Documentation/{{ data.version }}/index.html
-{% if data.previous %}
-Log of changes since {{ data.previous }}:
-https://gerrit.googlesource.com/gerrit/+log/v{{ data.previous }}..v{{ data.version }}
-{% endif %}
-Download:
-https://gerrit-releases.storage.googleapis.com/gerrit-{{ data.version }}.war
-
-SHA1:
-{{ data.sha1 }}
-
-SHA256:
-{{ data.sha256 }}
-
-MD5:
-{{ data.md5 }}
-
-Maintainers' public keys:
-https://www.gerritcodereview.com/releases/public-keys.md
-
diff --git a/tools/release-announcement.py b/tools/release-announcement.py
deleted file mode 100755
index f700185..0000000
--- a/tools/release-announcement.py
+++ /dev/null
@@ -1,156 +0,0 @@
-#!/usr/bin/env python
-# Copyright (C) 2017 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.
-
-# Generates the text to paste into the email for announcing a new
-# release of Gerrit. The text is generated based on a template that
-# is filled with values either passed to the script or calculated
-# at runtime.
-#
-# The script outputs a plain text file with the announcement text:
-#
-#   release-announcement-gerrit-X.Y.txt
-#
-# and, if GPG is available, the announcement text wrapped with a
-# signature:
-#
-#   release-announcement-gerrit-X.Y.txt.asc
-#
-# Usage:
-#
-#   ./tools/release-announcement.py -v 2.14.2 -p 2.14.1 \
-#      -s "This release fixes several bugs since 2.14.1"
-#
-# Parameters:
-#
-#   --version (-v): The version of Gerrit being released.
-#
-#   --previous (-p): The previous version of Gerrit.  Optional. If
-#   specified, the generated text includes a link to the gitiles
-#   log of commits between the previous and new versions.
-#
-#   --summary (-s): Short summary of the release. Optional. When
-#   specified, the summary is inserted in the introductory sentence
-#   of the generated text.
-#
-# Prerequisites:
-#
-# - The Jinja2 python library [1] must be installed.
-#
-# - For GPG signing to work, the python-gnupg library [2] must be
-#   installed, and the ~/.gnupg folder must exist.
-#
-# - The war file must have been installed to the local Maven repository
-#   using the `./tools/mvn/api.sh war_install` command.
-#
-# [1] http://jinja.pocoo.org/
-# [2] http://pythonhosted.org/gnupg/
-
-
-from __future__ import print_function
-import argparse
-import hashlib
-import os
-import sys
-from gnupg import GPG
-from jinja2 import Template
-
-
-class Version:
-    def __init__(self, version):
-        self.version = version
-        parts = version.split('.')
-        if len(parts) > 2:
-            self.major = ".".join(parts[:2])
-            self.patch = version
-        else:
-            self.major = version
-            self.patch = None
-
-    def __str__(self):
-        return self.version
-
-
-def _main():
-    descr = 'Generate Gerrit release announcement email text'
-    parser = argparse.ArgumentParser(
-        description=descr,
-        formatter_class=argparse.ArgumentDefaultsHelpFormatter)
-    parser.add_argument('-v', '--version', dest='version',
-                        required=True,
-                        help='gerrit version to release')
-    parser.add_argument('-p', '--previous', dest='previous',
-                        help='previous gerrit version (optional)')
-    parser.add_argument('-s', '--summary', dest='summary',
-                        help='summary of the release content (optional)')
-    options = parser.parse_args()
-
-    summary = options.summary
-    if summary and not summary.endswith("."):
-        summary = summary + "."
-
-    data = {
-         "version": Version(options.version),
-         "previous": options.previous,
-         "summary": summary
-    }
-
-    war = os.path.join(
-        os.path.expanduser("~/.m2/repository/com/google/gerrit/gerrit-war/"),
-        "%(version)s/gerrit-war-%(version)s.war" % data)
-    if not os.path.isfile(war):
-        print("Could not find war file for Gerrit %s in local Maven repository"
-              % data["version"], file=sys.stderr)
-        sys.exit(1)
-
-    md5 = hashlib.md5()
-    sha1 = hashlib.sha1()
-    sha256 = hashlib.sha256()
-    BUF_SIZE = 65536  # Read data in 64kb chunks
-    with open(war, 'rb') as f:
-        while True:
-            d = f.read(BUF_SIZE)
-            if not d:
-                break
-            md5.update(d)
-            sha1.update(d)
-            sha256.update(d)
-
-    data["sha1"] = sha1.hexdigest()
-    data["sha256"] = sha256.hexdigest()
-    data["md5"] = md5.hexdigest()
-
-    template = Template(open("tools/release-announcement-template.txt").read())
-    output = template.render(data=data)
-
-    filename = "release-announcement-gerrit-%s.txt" % data["version"]
-    with open(filename, "w") as f:
-        f.write(output)
-
-    gpghome = os.path.abspath(os.path.expanduser("~/.gnupg"))
-    if not os.path.isdir(gpghome):
-        print("Skipping signing due to missing gnupg home folder")
-    else:
-        try:
-            gpg = GPG(homedir=gpghome)
-        except TypeError:
-            gpg = GPG(gnupghome=gpghome)
-        signed = gpg.sign(output)
-        filename = filename + ".asc"
-        with open(filename, "w") as f:
-            f.write(str(signed))
-
-
-if __name__ == "__main__":
-    _main()
diff --git a/tools/util.py b/tools/util.py
index 0967f1b..172ecfe 100644
--- a/tools/util.py
+++ b/tools/util.py
@@ -25,48 +25,48 @@
 
 
 def resolve_url(url, redirects):
-  """ Resolve URL of a Maven artifact.
+    """ Resolve URL of a Maven artifact.
 
-  prefix:path is passed as URL. prefix identifies known or custom
-  repositories that can be rewritten in redirects set, passed as
-  second arguments.
+    prefix:path is passed as URL. prefix identifies known or custom
+    repositories that can be rewritten in redirects set, passed as
+    second arguments.
 
-  A special case is supported, when prefix neither exists in
-  REPO_ROOTS, no in redirects set: the url is returned as is.
-  This enables plugins to pass custom maven_repository URL as is
-  directly to maven_jar().
+    A special case is supported, when prefix neither exists in
+    REPO_ROOTS, no in redirects set: the url is returned as is.
+    This enables plugins to pass custom maven_repository URL as is
+    directly to maven_jar().
 
-  Returns a resolved path for Maven artifact.
-  """
-  s = url.find(':')
-  if s < 0:
-    return url
-  scheme, rest = url[:s], url[s+1:]
-  if scheme in redirects:
-    root = redirects[scheme]
-  elif scheme in REPO_ROOTS:
-    root = REPO_ROOTS[scheme]
-  else:
-    return url
-  root = root.rstrip('/')
-  rest = rest.lstrip('/')
-  return '/'.join([root, rest])
+    Returns a resolved path for Maven artifact.
+    """
+    s = url.find(':')
+    if s < 0:
+        return url
+    scheme, rest = url[:s], url[s+1:]
+    if scheme in redirects:
+        root = redirects[scheme]
+    elif scheme in REPO_ROOTS:
+        root = REPO_ROOTS[scheme]
+    else:
+        return url
+    root = root.rstrip('/')
+    rest = rest.lstrip('/')
+    return '/'.join([root, rest])
 
 
 def hash_file(hash_obj, path):
-  """Hash the contents of a file.
+    """Hash the contents of a file.
 
-  Args:
-    hash_obj: an open hash object, e.g. hashlib.sha1().
-    path: path to the file to hash.
+    Args:
+      hash_obj: an open hash object, e.g. hashlib.sha1().
+      path: path to the file to hash.
 
-  Returns:
-    The passed-in hash_obj.
-  """
-  with open(path, 'rb') as f:
-    while True:
-      b = f.read(8192)
-      if not b:
-        break
-      hash_obj.update(b)
-  return hash_obj
+    Returns:
+      The passed-in hash_obj.
+    """
+    with open(path, 'rb') as f:
+        while True:
+            b = f.read(8192)
+            if not b:
+                break
+            hash_obj.update(b)
+    return hash_obj
diff --git a/tools/util_test.py b/tools/util_test.py
index 30647ba..fa67696 100644
--- a/tools/util_test.py
+++ b/tools/util_test.py
@@ -16,28 +16,32 @@
 import unittest
 from util import resolve_url
 
+
 class TestResolveUrl(unittest.TestCase):
-  """ run to test:
-    python -m unittest -v util_test
-  """
+    """ run to test:
+      python -m unittest -v util_test
+    """
 
-  def testKnown(self):
-    url = resolve_url('GERRIT:foo.jar', {})
-    self.assertEqual(url, 'http://gerrit-maven.storage.googleapis.com/foo.jar')
+    def testKnown(self):
+        url = resolve_url('GERRIT:foo.jar', {})
+        self.assertEqual(url,
+                         'http://gerrit-maven.storage.googleapis.com/foo.jar')
 
-  def testKnownRedirect(self):
-    url = resolve_url('MAVEN_CENTRAL:foo.jar',
-                      {'MAVEN_CENTRAL': 'http://my.company.mirror/maven2'})
-    self.assertEqual(url, 'http://my.company.mirror/maven2/foo.jar')
+    def testKnownRedirect(self):
+        url = resolve_url('MAVEN_CENTRAL:foo.jar',
+                          {'MAVEN_CENTRAL': 'http://my.company.mirror/maven2'})
+        self.assertEqual(url, 'http://my.company.mirror/maven2/foo.jar')
 
-  def testCustom(self):
-    url = resolve_url('http://maven.example.com/release/foo.jar', {})
-    self.assertEqual(url, 'http://maven.example.com/release/foo.jar')
+    def testCustom(self):
+        url = resolve_url('http://maven.example.com/release/foo.jar', {})
+        self.assertEqual(url, 'http://maven.example.com/release/foo.jar')
 
-  def testCustomRedirect(self):
-    url = resolve_url('MAVEN_EXAMPLE:foo.jar',
-                      {'MAVEN_EXAMPLE': 'http://maven.example.com/release'})
-    self.assertEqual(url, 'http://maven.example.com/release/foo.jar')
+    def testCustomRedirect(self):
+        url = resolve_url('MAVEN_EXAMPLE:foo.jar',
+                          {'MAVEN_EXAMPLE':
+                           'http://maven.example.com/release'})
+        self.assertEqual(url, 'http://maven.example.com/release/foo.jar')
+
 
 if __name__ == '__main__':
-  unittest.main()
+    unittest.main()
diff --git a/tools/version.py b/tools/version.py
index fed6d5d..4aafcb0 100755
--- a/tools/version.py
+++ b/tools/version.py
@@ -23,24 +23,24 @@
 opts, args = parser.parse_args()
 
 if not len(args):
-  parser.error('not enough arguments')
+    parser.error('not enough arguments')
 elif len(args) > 1:
-  parser.error('too many arguments')
+    parser.error('too many arguments')
 
 DEST_PATTERN = r'\g<1>%s\g<3>' % args[0]
 
 
 def replace_in_file(filename, src_pattern):
-  try:
-    f = open(filename, "r")
-    s = f.read()
-    f.close()
-    s = re.sub(src_pattern, DEST_PATTERN, s)
-    f = open(filename, "w")
-    f.write(s)
-    f.close()
-  except IOError as err:
-    print('error updating %s: %s' % (filename, err), file=sys.stderr)
+    try:
+        f = open(filename, "r")
+        s = f.read()
+        f.close()
+        s = re.sub(src_pattern, DEST_PATTERN, s)
+        f = open(filename, "w")
+        f.write(s)
+        f.close()
+    except IOError as err:
+        print('error updating %s: %s' % (filename, err), file=sys.stderr)
 
 
 src_pattern = re.compile(r'^(\s*<version>)([-.\w]+)(</version>\s*)$',
@@ -48,8 +48,8 @@
 for project in ['gerrit-acceptance-framework', 'gerrit-extension-api',
                 'gerrit-plugin-api', 'gerrit-plugin-gwtui',
                 'gerrit-war']:
-  pom = os.path.join(project, 'pom.xml')
-  replace_in_file(pom, src_pattern)
+    pom = os.path.join('tools', 'maven', '%s_pom.xml' % project)
+    replace_in_file(pom, src_pattern)
 
 src_pattern = re.compile(r'^(GERRIT_VERSION = ")([-.\w]+)(")$', re.MULTILINE)
 replace_in_file('version.bzl', src_pattern)
diff --git a/tools/workspace-status.cmd b/tools/workspace-status.cmd
new file mode 100644
index 0000000..4a3b88e
--- /dev/null
+++ b/tools/workspace-status.cmd
@@ -0,0 +1,2 @@
+echo STABLE_BUILD_GERRIT_LABEL dev
+echo STABLE_WORKSPACE_ROOT %cd%
diff --git a/version.bzl b/version.bzl
index a651bfa..f4fcfb7 100644
--- a/version.bzl
+++ b/version.bzl
@@ -2,4 +2,4 @@
 # Used by :api_install and :api_deploy targets
 # when talking to the destination repository.
 #
-GERRIT_VERSION = "2.15.12-SNAPSHOT"
+GERRIT_VERSION = "2.16.7-SNAPSHOT"
diff --git a/webapp/BUILD b/webapp/BUILD
new file mode 100644
index 0000000..f907be9
--- /dev/null
+++ b/webapp/BUILD
@@ -0,0 +1,12 @@
+load("//tools/bzl:genrule2.bzl", "genrule2")
+
+genrule2(
+    name = "assets",
+    srcs = glob(
+        ["**/*"],
+        exclude = ["BUILD"],
+    ),
+    outs = ["assets.zip"],
+    cmd = "cd webapp; zip -qr $$ROOT/$@ .",
+    visibility = ["//visibility:public"],
+)
diff --git a/gerrit-war/src/main/webapp/WEB-INF/extra/jetty7/gerrit-jetty.sh b/webapp/WEB-INF/extra/jetty7/gerrit-jetty.sh
similarity index 100%
rename from gerrit-war/src/main/webapp/WEB-INF/extra/jetty7/gerrit-jetty.sh
rename to webapp/WEB-INF/extra/jetty7/gerrit-jetty.sh
diff --git a/gerrit-war/src/main/webapp/WEB-INF/extra/jetty7/gerrit.xml b/webapp/WEB-INF/extra/jetty7/gerrit.xml
similarity index 100%
rename from gerrit-war/src/main/webapp/WEB-INF/extra/jetty7/gerrit.xml
rename to webapp/WEB-INF/extra/jetty7/gerrit.xml
diff --git a/gerrit-war/src/main/webapp/WEB-INF/extra/jetty7/jetty_sslproxy.xml b/webapp/WEB-INF/extra/jetty7/jetty_sslproxy.xml
similarity index 100%
rename from gerrit-war/src/main/webapp/WEB-INF/extra/jetty7/jetty_sslproxy.xml
rename to webapp/WEB-INF/extra/jetty7/jetty_sslproxy.xml
diff --git a/webapp/WEB-INF/web.xml b/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..e901357
--- /dev/null
+++ b/webapp/WEB-INF/web.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app>
+  <resource-ref>
+    <res-ref-name>jdbc/ReviewDb</res-ref-name>
+    <res-type>javax.sql.DataSource</res-type>
+    <res-auth>Container</res-auth>
+  </resource-ref>
+
+  <filter>
+    <filter-name>guiceFilter</filter-name>
+    <filter-class>com.google.gerrit.httpd.init.WebAppInitializer</filter-class>
+  </filter>
+  <filter-mapping>
+    <filter-name>guiceFilter</filter-name>
+    <url-pattern>/*</url-pattern>
+  </filter-mapping>
+</web-app>
diff --git a/gerrit-war/src/main/webapp/favicon.ico b/webapp/favicon.ico
similarity index 100%
rename from gerrit-war/src/main/webapp/favicon.ico
rename to webapp/favicon.ico
Binary files differ
diff --git a/gerrit-war/src/main/webapp/robots.txt b/webapp/robots.txt
similarity index 100%
rename from gerrit-war/src/main/webapp/robots.txt
rename to webapp/robots.txt
diff --git a/website/releases/index.html b/website/releases/index.html
deleted file mode 100644
index ab3fcd6..0000000
--- a/website/releases/index.html
+++ /dev/null
@@ -1,170 +0,0 @@
-<html>
-<head>
-  <title>Gerrit Code Review - Releases</title>
-  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.2/jquery.min.js"></script>
-  <style>
-  #diffy_logo {
-    float: left;
-    width: 75px;
-    height: 70px;
-    margin-right: 20px;
-  }
-  #download_container table {
-    border-spacing: 0;
-  }
-  #download_container td {
-    padding-right: 5px;
-  }
-  .latest-release {
-    background-color: lightgreen;
-  }
-  .rc {
-    padding-left: 1em;
-    font-style: italic;
-  }
-  .size {
-    text-align: right;
-  }
-  </style>
-</head>
-<body>
-
-<h1>Gerrit Code Review - Releases</h1>
-<a href="https://www.gerritcodereview.com/">
-  <img id="diffy_logo" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAtCAYAAADoSujCAAAABGdBTUEAALGPC/xhBQAACkFpQ0NQSUNDIFByb2ZpbGUAAEgNnZZ3VFPZFofPvTe90BIiICX0GnoJINI7SBUEUYlJgFAChoQmdkQFRhQRKVZkVMABR4ciY0UUC4OCYtcJ8hBQxsFRREXl3YxrCe+tNfPemv3HWd/Z57fX2Wfvfde6AFD8ggTCdFgBgDShWBTu68FcEhPLxPcCGBABDlgBwOFmZgRH+EQC1Py9PZmZqEjGs/buLoBku9ssv1Amc9b/f5EiN0MkBgAKRdU2PH4mF+UClFOzxRky/wTK9JUpMoYxMhahCaKsIuPEr2z2p+Yru8mYlybkoRpZzhm8NJ6Mu1DemiXho4wEoVyYJeBno3wHZb1USZoA5fco09P4nEwAMBSZX8znJqFsiTJFFBnuifICAAiUxDm8cg6L+TlongB4pmfkigSJSWKmEdeYaeXoyGb68bNT+WIxK5TDTeGIeEzP9LQMjjAXgK9vlkUBJVltmWiR7a0c7e1Z1uZo+b/Z3x5+U/09yHr7VfEm7M+eQYyeWd9s7KwvvRYA9iRamx2zvpVVALRtBkDl4axP7yAA8gUAtN6c8x6GbF6SxOIMJwuL7OxscwGfay4r6Df7n4Jvyr+GOfeZy+77VjumFz+BI0kVM2VF5aanpktEzMwMDpfPZP33EP/jwDlpzcnDLJyfwBfxhehVUeiUCYSJaLuFPIFYkC5kCoR/1eF/GDYnBxl+nWsUaHVfAH2FOVC4SQfIbz0AQyMDJG4/egJ961sQMQrIvrxorZGvc48yev7n+h8LXIpu4UxBIlPm9gyPZHIloiwZo9+EbMECEpAHdKAKNIEuMAIsYA0cgDNwA94gAISASBADlgMuSAJpQASyQT7YAApBMdgBdoNqcADUgXrQBE6CNnAGXARXwA1wCwyAR0AKhsFLMAHegWkIgvAQFaJBqpAWpA+ZQtYQG1oIeUNBUDgUA8VDiZAQkkD50CaoGCqDqqFDUD30I3Qaughdg/qgB9AgNAb9AX2EEZgC02EN2AC2gNmwOxwIR8LL4ER4FZwHF8Db4Uq4Fj4Ot8IX4RvwACyFX8KTCEDICAPRRlgIG/FEQpBYJAERIWuRIqQCqUWakA6kG7mNSJFx5AMGh6FhmBgWxhnjh1mM4WJWYdZiSjDVmGOYVkwX5jZmEDOB+YKlYtWxplgnrD92CTYRm40txFZgj2BbsJexA9hh7DscDsfAGeIccH64GFwybjWuBLcP14y7gOvDDeEm8Xi8Kt4U74IPwXPwYnwhvgp/HH8e348fxr8nkAlaBGuCDyGWICRsJFQQGgjnCP2EEcI0UYGoT3QihhB5xFxiKbGO2EG8SRwmTpMUSYYkF1IkKZm0gVRJaiJdJj0mvSGTyTpkR3IYWUBeT64knyBfJQ+SP1CUKCYUT0ocRULZTjlKuUB5QHlDpVINqG7UWKqYup1aT71EfUp9L0eTM5fzl+PJrZOrkWuV65d7JU+U15d3l18unydfIX9K/qb8uAJRwUDBU4GjsFahRuG0wj2FSUWaopViiGKaYolig+I1xVElvJKBkrcST6lA6bDSJaUhGkLTpXnSuLRNtDraZdowHUc3pPvTk+nF9B/ovfQJZSVlW+Uo5RzlGuWzylIGwjBg+DNSGaWMk4y7jI/zNOa5z+PP2zavaV7/vCmV+SpuKnyVIpVmlQGVj6pMVW/VFNWdqm2qT9QwaiZqYWrZavvVLquNz6fPd57PnV80/+T8h+qwuol6uPpq9cPqPeqTGpoavhoZGlUalzTGNRmabprJmuWa5zTHtGhaC7UEWuVa57VeMJWZ7sxUZiWzizmhra7tpy3RPqTdqz2tY6izWGejTrPOE12SLls3Qbdct1N3Qk9LL1gvX69R76E+UZ+tn6S/R79bf8rA0CDaYItBm8GooYqhv2GeYaPhYyOqkavRKqNaozvGOGO2cYrxPuNbJrCJnUmSSY3JTVPY1N5UYLrPtM8Ma+ZoJjSrNbvHorDcWVmsRtagOcM8yHyjeZv5Kws9i1iLnRbdFl8s7SxTLessH1kpWQVYbbTqsPrD2sSaa11jfceGauNjs86m3ea1rakt33a/7X07ml2w3Ra7TrvP9g72Ivsm+zEHPYd4h70O99h0dii7hH3VEevo4bjO8YzjByd7J7HTSaffnVnOKc4NzqMLDBfwF9QtGHLRceG4HHKRLmQujF94cKHUVduV41rr+sxN143ndsRtxN3YPdn9uPsrD0sPkUeLx5Snk+cazwteiJevV5FXr7eS92Lvau+nPjo+iT6NPhO+dr6rfS/4Yf0C/Xb63fPX8Of61/tPBDgErAnoCqQERgRWBz4LMgkSBXUEw8EBwbuCHy/SXyRc1BYCQvxDdoU8CTUMXRX6cxguLDSsJux5uFV4fnh3BC1iRURDxLtIj8jSyEeLjRZLFndGyUfFRdVHTUV7RZdFS5dYLFmz5EaMWowgpj0WHxsVeyR2cqn30t1Lh+Ps4grj7i4zXJaz7NpyteWpy8+ukF/BWXEqHhsfHd8Q/4kTwqnlTK70X7l35QTXk7uH+5LnxivnjfFd+GX8kQSXhLKE0USXxF2JY0muSRVJ4wJPQbXgdbJf8oHkqZSQlKMpM6nRqc1phLT4tNNCJWGKsCtdMz0nvS/DNKMwQ7rKadXuVROiQNGRTChzWWa7mI7+TPVIjCSbJYNZC7Nqst5nR2WfylHMEeb05JrkbssdyfPJ+341ZjV3dWe+dv6G/ME17msOrYXWrlzbuU53XcG64fW+649tIG1I2fDLRsuNZRvfbore1FGgUbC+YGiz7+bGQrlCUeG9Lc5bDmzFbBVs7d1ms61q25ciXtH1YsviiuJPJdyS699ZfVf53cz2hO29pfal+3fgdgh33N3puvNYmWJZXtnQruBdreXM8qLyt7tX7L5WYVtxYA9pj2SPtDKosr1Kr2pH1afqpOqBGo+a5r3qe7ftndrH29e/321/0wGNA8UHPh4UHLx/yPdQa61BbcVh3OGsw8/rouq6v2d/X39E7Ujxkc9HhUelx8KPddU71Nc3qDeUNsKNksax43HHb/3g9UN7E6vpUDOjufgEOCE58eLH+B/vngw82XmKfarpJ/2f9rbQWopaodbc1om2pDZpe0x73+mA050dzh0tP5v/fPSM9pmas8pnS8+RzhWcmzmfd37yQsaF8YuJF4c6V3Q+urTk0p2usK7ey4GXr17xuXKp2737/FWXq2euOV07fZ19ve2G/Y3WHruell/sfmnpte9tvelws/2W462OvgV95/pd+y/e9rp95Y7/nRsDiwb67i6+e/9e3D3pfd790QepD14/zHo4/Wj9Y+zjoicKTyqeqj+t/dX412apvfTsoNdgz7OIZ4+GuEMv/5X5r0/DBc+pzytGtEbqR61Hz4z5jN16sfTF8MuMl9Pjhb8p/rb3ldGrn353+71nYsnE8GvR65k/St6ovjn61vZt52To5NN3ae+mp4req74/9oH9oftj9MeR6exP+E+Vn40/d3wJ/PJ4Jm1m5t/3hPP7MjpZfgAAAAlwSFlzAAAN1wAADdcBQiibeAAADVtJREFUaAXNWQl0FEUa/qu7ekKGJJBkQg4SQsKhCZHlCCJKkKCIoBtWJCggCusK+9xdUFFUEJldn3sIeLAYH1lkOfbBI0BwMUIEISEi4TCGmxBIyA05h4RJJjPT3bV/dc9MghKut0r+96qrp7qO7/uvqu4B+P8IYYwR11RBx8+dW52bl/epe+rTp08b3PedsXYDh51ZWZMriovzWX4+a75czfbknXjVDTgtjSEJRrFIQ4d+L2VlMYqkJV6ysrKw/S4J17xb+zt3716A94z9kMdY5pdMsTWysppzf80yw00B4ijBbDYLd4UGLuwBeLasZL61wSJbdmazspOX2IHDtexPLx/ZLIqls/veU/6iKO6cnpT01vRdu1a/UFqaM/nw4QMJCLqbG/jtkvCY3z3BHdQcvOwa5x/v/9zvRv8+abEdfH33Z1Q7rE1+Bm/fYCg46wOUBoMs+yn9+7fAY49ZhIQEh/3++43NPj7GqvPnK5cNHz5kPVqCzJkzh6ampvI52R3guZ0hsyV3b1EUn9+zN6uwvKKKvf7GSkUUk1VRXMBEcaEsiksUX98PGKVrmMGQh21MKzExjL3//iV26lRBY3V1WeXRowWT3fPxmsdGcnKa2L7tx/d3agEyerRZzM42cy11W/b3T5aMHjdyrtXbKp6/fA7uC74PrBUqe+ftXeRofgN26c569waFsRZoaWnB3wlgt/+GNTX5oIZVDO7yfZmZF2v9/WV7fPzYJdihDIuKRZO0tDRxypQp/PdPLHInBHBMGgbbFGXw4OmxJ044Uj5LefbhiZMS4Gh5rqOwplB4atgksXdANCkuLoOt23Jg4dvHcW0nFj8NEALG+nEskxCUhHM5bIxlFC1bKpseHRtjM3o7S47lV5Y+M/WbfYqyYjt2tHLXIuTPuLbZQ4xPdrsEPOAl6fFhAHEbVNV0z4BYGcKjBOfQeJP08Mg46NMnHCIjegIhelLhRHJzT8H+/efgwAErWK3N0KuXEYYOfRrCwwPU+vpKIXOrCcpKQuHNf1CYmCRDvz4EKsurYVv62dwFC1a8KctffcsBIwGctI3EbRLg2cYsS9K4Iap632ZCgvp26eKQbbZWnNiBzwzQkxrgwSQfiPuVCYYMiYLY2CgIDQ0Cg4GCzWaHZmsLKCqDVrsNqi83wtGjBkhPD1L3HwwgmpHAhm5pEd5bKojJk7tD34gu8G3OD/VjHlkxTZbX7dY46IrX3Ok2CPCATUU/6B9N6RNo1tCBAK1OxhQxNFQUunYV4MIF7iZ2LDw0dJf19fWGZ54NhcGDekJUVA/o1s0HidjgwvkSyNrXFzZvidcwJQeWsafq9xLDjJNg63uFeS0JZfkwWumzcSBMnRgk1dQUVu7NOTR+1nOzTqI7iehPCh94iwR0zWN/b0rnbgIIm4gaR5QKmpMIfC9DwMTXh0BgoAiCSKCpSYW6Or6Gm5SDr4fijcWCpSeWP2AxwTtRe+DVi+NBGYTUcXYhFOAiHkSMiwBWwx711Ix4+dO3JEPT1QPrhw0b+wIO0jJUYmKirDspb+lYuM9xlWIef+kVgEAEz0FxDetOTggjgkDgqhWgpFSG4mIn+rmKriNCZKQ39IroDv6BQdg/EIsRC5LwGYBGNAF0BSg1RkItPAHCKHTCkCjYn9MPRiyKAflJgFd91wpZG1QhdkAXWPZez/EAiyJxAtxlfLnyyQ1zLO8IsAp9O0OVpAnxwCJXAOoZCXB1evYArRteCE7JiaB5wYkcOYnGRixNDLwog2iTAHWqBK8NaIC1D+yAEQYjpF+IhhNqCBTZRkFAjRcYB2ZAUV0D2L6og+kVAAGOk2AZ+DQJHO8kYcYqY8IjxedyD+bk4UanMqYt6V7+enUyEtyi+ZokzV3NWPiL6PdoDYbtntPn9QZqbZwQjzRcCPoggSInhX70Cmz/9W64N/iMZsidpR9D0jezEakBwhqa4NHQfBg8+luILzgDfidNsEmeCiEfV8DMWVNBwlVtrb3tTU0lR/btExbMmuU8dJMYWIVanuOk9LkHAcIzALz8cVWMUi8vHVqH2D0POIEoA4OLdjQk2CB7Qg6MDM8FVe6NsVICDD1x7dlN8NLBZP1E1AgQDA6IIc2QHYTGrpEgK/sTljByPvdZXhCTCJWVSvHKlco45NShoO9naNoXhPgpjDmGADRfJaRrAEYDH8Sx3VABvEM4ar6MZ1gElZ6YB2Mj9+NIA1qlHlS1LxPEBoj228aYPEY9WNGLZ2JoRgOX+HkzaBARsFV9Z9EG8Pc/hlgHYbnMMSl+fsQUEiIilY6FBzjHIIiiXxxAj3hCwqJ1zHacWMDn18fPW/nAMARfKfMlFFiXcBye7peJIwSFqYIiYCUQPGawSOhiaBSGBeUI/X16Qo3Fn1W0YmTjxovDcA1JmDq1TPD1zQRFkTEWW3BCQcNttzNMEx2KGZ9layYThEkL0IsTGLMUowYshHihFdCLQECcP40F7vMBmFlrFGSAZv90+Bl15r3/VXFZAQSDQAQH3qEC+G/xCvINRhIVMChkC0mOOkQeDRVIsNiVlDX7QZPsgBPHjWcuXJCW+PvvT7XZglsIaQ43GqFrSwvpdn0VaqTMaEwzZpswE6XT9iIO9L2yLxnr/Swh3XuhVpEc41a6Rjji8B4qyA5RvWwR4G+Di4Q34jdofZzV3kC62UA2EgW3QItDFqrtdvWSXYYyuxrWahCViACvahMqQD5eDzUrTnxY9NWl2COKYsnBs1ete6HFi2HA889L86xWZroRAXRcnv+nBlPaPJsQ3zBV7fkY1tGYidAPnWihLjgnNyKHzYUoEm5rDnQQbvp5/avg3eGfg1G1t9SGdWXO/i3GioNs1eF1Quq/nc66UwD1OIhv3Vqs8RkAVqBpQ3DCKe6dT2vlKRMgWSBEz4paI1/EdXOdyszdB2VTNSF+NYyFzcQawQciKV9EzTcz93Dc1hlxSAYiOhQ89HDfYnVVI2JyMq8aW5d9tqn3qAMjbXPDZwHp/QEJ88pyOv5Tp2UUfrbWwLMsPTMAzEVCbvDcPbWUjcCxJ2xRzWY+tyd2nW4E/OmPxOx+hu+8gRMwiFHdcbhgJALka2KKw4DECzIRRF8/L4MDl46Jqb+yddsPsDVt4+bk9OPjI1LUN+Y5i/ICfZjJUgstJm9IemEgPSVW0YLsfVLq9u3SUL4wSQQ5C9+dzZw8guQ16IKKJFyZPKwZElB5eHOLcDIIpiPJdj1YRdFsRaoaUUWIN6I+i+140AE/NLOClvDC4sBDWn15YyP7MDb2y8IJ44vSHQ427uXX+kSkfFhUuWK5NFNtZV3yj0GSjzfzMwULo69Y2CibXR1DKem3caO0fto054ZEM8gcFEGQ+uIdezgng31+mkFcqHnFR2vOLUnScMYWvIuug5a4im0iFooa4o+tBUajdWtT05G1ZnNe+bBh4vTBg32WmUzOgLo6e83lKlJy4hQ5tGOHc2l6OlTwibm88gqEjhgujcfT9QOtrWDEI0fawoXKDv1p29qu3x1WHVPUhuiZCAkMYWzGLoCgHhhz6CjdMdAcBQDVn1O6b0tr68VS3n3evF5PjhnT+GBoaMtFb29Q/P1hlMWiJlZVgWS1kkLskiVJ8takJDitTY+XmTMhJD8f/B56CMSUFLiITfzlwqM8d787qNs+NknSmn9SmoIv5ctbKc3B+pBTFP+Fp1K3JIvh4cneycnaWdndqNVxcRD89dfS7G3bpLQ1a2jmunV0KYLuxx+iu1zjwjge3fGaNkzd2qGRt7vLTZSOPXVhfDAeoTMTKL10hdIGBF7bTPF7GqWW71B33V39rgGhpzv9SfsrzxwIPOSjjyC6XRbRuriAt+/OA9gdxO3bb/VeB4+9fSkt+kYHzexYq/r9scW3OtPP3O961mhzHUrzP3CBR63L6D78e07dZUnaFP8zA7vV6blbtRd+/tdFkvbOpNSKwLnLqHikZrwwSbqw1t2nE9QevIiFb1z62YbStY9QWmfRwXPgGgEkcsVKacY4HbjHze4mD0+coC8xVzC+HieKVUUu8A5KFW4Fl/aLNrahvfEnv7Z+P+udRqAdeIigtOxom+abEbyCJLTMgxbZnKjD6RTa51A4ge+1dIk3PSi9kO0Cj9mmCrVeysFrmUeSClL4CF24u3UK8cSAP6WFmS7wqPU69PUjtZTaNe2LYnUJwF/wOwiXTqN9DkZTZDdKC75oA29rwd32MJKo09tUJPT927w3gud5l5fOIgR32uPtwHOwhzMoPZvbRqjyIKLFrxFc+FcKj9xtItr6eFQWWnFrd0lhJiGNFxkb8oTe0ORg7ORyvMdvgdx1CH+LcQv3P+2LnbvhF67d6y+7F90Ffb22QJKW/1YUG8rd2pekc+vbQLVtcq42TwC19flF79rWl6Q9f5Sk1BmSVJTmBo9HhlKA+bE6JE+m+kUR3tZilH73phs8nnswFg7N1yfQdue77e8dcXH9haI99nIdj/mPyr2y/MBKfdQWDt4TJXqbdu0sewF/69ckkNLKY5Q2ofbXP6w33dB1OgMBrty2XVUUtyVRuvN9HTy/3vSdua3rXbr7H0SXfo3+OPT1AAAAAElFTkSuQmCC" />
-</a>
-
-<div id='download_container'>
-</div>
-
-<script>
-$.getJSON(
-'https://www.googleapis.com/storage/v1/b/gerrit-releases/o?projection=noAcl&fields=items(name%2Csize)&callback=?',
-function(data) {
-  var doc = document;
-  var frg = doc.createDocumentFragment();
-  var rx = /^gerrit(?:-full)?-([0-9.]+(?:-rc[0-9]+)?)[.]war/;
-  var dl = 'https://gerrit-releases.storage.googleapis.com/';
-  var docs = 'https://gerrit-documentation.storage.googleapis.com/';
-  var src = 'https://gerrit.googlesource.com/gerrit/+/'
-
-  var items = data.items.filter(function(i) {
-    return i.name.indexOf('gerrit-snapshot-') != 0;
-  });
-
-
-  items.sort(function(a,b) {
-    var av = rx.exec(a.name);
-    var bv = rx.exec(b.name);
-    if (!av || !bv) {
-      return a.name > b.name ? 1 : -1;
-    }
-
-    var an = av[1].replace('-rc', '.rc').split('.')
-    var bn = bv[1].replace('-rc', '.rc').split('.')
-    while (an.length < bn.length) an.push('0');
-    while (an.length > bn.length) bn.push('0');
-    for (var i = 0; i < an.length; i++) {
-      var ai = an[i].indexOf('rc') == 0
-        ? parseInt(an[i].substring(2))
-        : 1000 + parseInt(an[i]);
-
-      var bi = bn[i].indexOf('rc') == 0
-        ? parseInt(bn[i].substring(2))
-        : 1000 + parseInt(bn[i]);
-
-      if (ai != bi) {
-        return ai > bi ? -1 : 1;
-      }
-    }
-    return 0;
-  });
-
-  var latest = false;
-  for (var i = 0; i < items.length; i++) {
-    var f = items[i];
-    var v = rx.exec(f.name);
-
-    if ('index.html' == f.name) {
-      continue;
-    }
-
-    var tr = doc.createElement('tr');
-    var td = doc.createElement('td');
-    var a = doc.createElement('a');
-    a.href = dl + f.name;
-    if (v) {
-      a.appendChild(doc.createTextNode('Gerrit ' + v[1]));
-    } else {
-      a.appendChild(doc.createTextNode(f.name));
-    }
-    if (f.name.indexOf('-rc') > 0) {
-      td.className = 'rc';
-    } else if (!latest) {
-      latest = true;
-      tr.className='latest-release';
-    }
-    td.appendChild(a);
-    tr.appendChild(td);
-
-    td = doc.createElement('td');
-    td.className = 'size';
-    if (f.size/(1024*1024) < 1) {
-      sizeText = Math.round(f.size/1024*10)/10 + ' KiB';
-    } else {
-      sizeText = Math.round(f.size/(1024*1024)*10)/10 + ' MiB';
-    }
-    td.appendChild(doc.createTextNode(sizeText));
-    tr.appendChild(td);
-
-    td_rel = doc.createElement('td');
-    td_doc = doc.createElement('td');
-    if (v && f.name.indexOf('-rc') < 0) {
-      // Release notes link
-      a = doc.createElement('a');
-      a.href = docs + 'ReleaseNotes/ReleaseNotes-' + v[1] + '.html';
-      a.appendChild(doc.createTextNode('Release Notes'));
-      td_rel.appendChild(a);
-
-      // Documentation link
-      a = doc.createElement('a');
-      a.href = docs + 'Documentation/' + v[1] + '/index.html';
-      a.appendChild(doc.createTextNode('Documentation'));
-      td_doc.appendChild(a);
-    }
-    tr.appendChild(td_rel);
-    tr.appendChild(td_doc);
-
-    td = doc.createElement('td');
-    if (v) {
-      a = doc.createElement('a');
-      a.href = src + 'v' + v[1];
-      a.appendChild(doc.createTextNode('src'));
-      td.appendChild(a);
-    }
-    tr.appendChild(td);
-
-    frg.appendChild(tr);
-  }
-
-  var tr = doc.createElement('tr');
-  var th = doc.createElement('th');
-  th.appendChild(doc.createTextNode('File'));
-  tr.appendChild(th);
-
-  th = doc.createElement('th');
-  th.appendChild(doc.createTextNode('Size'));
-  tr.appendChild(th);
-
-  tr.appendChild(doc.createElement('th'));
-  tr.appendChild(doc.createElement('th'));
-
-  var table = doc.createElement('table');
-  table.appendChild(tr);
-  table.appendChild(frg);
-  doc.getElementById('download_container').appendChild(table);
-});
-</script>
-
-</body>
-</html>
